[33mcommit 2982d759f42b6aaad3dbb6463ce91dfc0a1d2100[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Wed Dec 20 16:30:46 2017 +0800

    up

[1mdiff --git a/qa_shell_script/base_script/restartJava.sh b/qa_shell_script/base_script/restartJava.sh[m
[1mindex 667d90f..7c51dcc 100755[m
[1m--- a/qa_shell_script/base_script/restartJava.sh[m
[1m+++ b/qa_shell_script/base_script/restartJava.sh[m
[36m@@ -17,7 +17,7 @@[m [mfunction ack()[m
     echo "begin acknowledge whether the deploy start OK, ACK_PHRASE=${ack_phrase}, log_path=${log_path}"[m
     while [ ! -f ${log_path} ][m
     do[m
[31m-        echo "waiting for $ip $project log, wait_log_generate_time is ${wait_log_generate_time}, max_wait_log_generate_time is ${max_wait_log_generate_time} "[m
[32m+[m[32m        echo "waiting for $ip $project log:${log_path}, wait_log_generate_time is ${wait_log_generate_time}, max_wait_log_generate_time is ${max_wait_log_generate_time} "[m
         if ((${wait_log_generate_time}>${max_wait_log_generate_time}))[m
         then[m
             echo "the $ip $project log generated time exceed the limit"[m
[36m@@ -70,8 +70,8 @@[m [mmax_wait_ack_time=500[m
 ack_phrase="JVM\ running\ for"[m
 project=$1[m
 desc=`node $config_server/get_project_config.js  -name $project -attr desc`[m
[31m-run_command_=`node $config_server/get_project_config.js  -name $project -attr command`[m
[31m-run_command=${run_command_//\^/ }[m
[32m+[m[32mrun_command_=`node $config_server/get_project_config.js  -name $project -attr command_`[m
[32m+[m[32mrun_commands=(${run_command_//|/ })[m
 sh $config_server/show_info.sh $project 重新启动 $desc $ip [m
 cd $project_path/$project[m
 P_UUID=`ps -ef|grep ${project}.jar |grep -v 'grep'|awk '{print $2}'`[m
[36m@@ -105,13 +105,17 @@[m [mlog_name=`node $config_server/get_project_config.js  -name $project -attr log_na[m
 [m
 mv $project_path/logs/$log_name $project_path/logs/$log_name.$time[m
 [m
[31m-echo "$run_command"[m
[32m+[m[32mcommand1=${run_commands[0]//\^/ }[m
[32m+[m[32mcommand2=${run_commands[1]//\^/ }[m
[32m+[m[32mecho "java $command1 -jar ${project}.jar $command2"[m
[32m+[m[32mjava $command1 -jar ${project}.jar $command2 > /dev/null 2>&1 &[m
[32m+[m[32mecho "日志名称：$log_name"[m
 [m
[31m-if  [[ $project == "redpacket" ]]; then[m
[31m-    java -Xmx512m -XX:PermSize64m -Xloggc:/tmp/${project}.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -jar ${project}.jar --worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &[m
[31m-else[m
[31m-    java -Xmx512m -XX:PermSize64m -Xloggc:/tmp/${project}.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -jar ${project}.jar --worker 1 --currentWorker 1 -t > /dev/null 2>&1 &[m
[31m-fi[m
[32m+[m[32m#if  [[ $project == "redpacket" ]]; then[m
[32m+[m[32m#    java -Xmx512m -XX:PermSize64m -Xloggc:/tmp/${project}.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -jar ${project}.jar --worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &[m
[32m+[m[32m#else[m
[32m+[m[32m#    java -Xmx512m -XX:PermSize64m -Xloggc:/tmp/${project}.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -jar ${project}.jar --worker 1 --currentWorker 1 -t > /dev/null 2>&1 &[m
[32m+[m[32m#fi[m
 [m
 if [[ $check_ack == "1" ]]; then[m
     ack "$ack_phrase" $project_path/logs/$log_name ${max_wait_log_generate_time} 700[m
[1mdiff --git a/qa_shell_script/config_server/get_project_config.js b/qa_shell_script/config_server/get_project_config.js[m
[1mindex 3f15591..8a3cf6a 100755[m
[1m--- a/qa_shell_script/config_server/get_project_config.js[m
[1m+++ b/qa_shell_script/config_server/get_project_config.js[m
[36m@@ -34,8 +34,9 @@[m [mpClass.prototype = {[m
 			this.log_name = logName; // 项目日志位置[m
 			this.config_file = configFile; //项目配置文件地址[m
 			this.command = ""; //项目命令1[m
[32m+[m			[32mthis.command_=""; //java项目build过程冲需要的，传参可以不考虑[m
 			this.command2 = command2; //项目命令2[m
[31m-			this.node_version = nodeVersion; //项目的node版本[m
[32m+[m			[32mthis.node_version = nodeVersion; //项目的node版本,JAVA 项目里面，这个是启动命令的前缀……[m
 			this.port = port; //项目占用端口[m
 			this.desc = desc; //项目描述[m
 			this.is_active = isActive; //项目是否必要项目[m
[36m@@ -44,8 +45,9 @@[m [mpClass.prototype = {[m
 			projects[projectName] = this;[m
 			switch (projectType) {[m
 				case "java":[m
[31m-					this.command = "java -Xmx512m -XX:PermSize64m -Xloggc:/tmp/" + projectName + ".log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -jar " + projectName + ".jar " + command;[m
[31m-					java_projects.push(this);[m
[32m+[m				[32mthis.command = "java " + this.node_version + " -Xmx512m -XX:PermSize64m -Xloggc:/tmp/" + projectName + ".log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar" + projectName + ".jar " + command ;[m
[32m+[m				[32mthis.command_ = this.node_version + " -Xmx512m -XX:PermSize64m -Xloggc:/tmp/" + projectName + ".log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps|" + " " + command ;[m[41m	[m
[32m+[m				[32mjava_projects.push(this);[m
 					if (this.target_path == "") {[m
 						this.target_path = "./target"[m
 					}[m
[36m@@ -66,52 +68,53 @@[m [mpClass.prototype = {[m
 		}[m
 	}[m
 // --java[m
[31m-new pClass().init(1, true,"java", "7003", "api", "xyqb", "QG", "xyqb.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "现金贷-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1, true,"java", "7025", "btapi", "baitiao", "baitiao", "baitiao.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "baitiao-api/target");[m
[31m-new pClass().init(1,true, "java", "7010", "offapi", "xyqb-offline", "QG", "xyqb_offline.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "线下业务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true,"java", "7042", "passportapi2", "xyqb-user2", "head_group", "xyqb_user.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "用户注册登录-V2-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(2,false,"java", "7005", "rapi", "di-ting", "QG", "di_ting.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "风控审计-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true, "java", "7013", "auth", "han-gu-guan", "QG", "han-gu-guan.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "用户注册登录-V1-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true, "java", "7015", "rauth", "jian-men-guan", "QG", "jian_men_guan.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "信审服务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true,"java", "7028", "pdf", "black-hole", "QG", "black-hole.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "合同中心-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true,"java", "7006", "payapi", "gu-bei", "funding", "pay-center.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "支付中心-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true, "java", "7023", "quartz", "xyqb-quartz", "QG", "quartz.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "定时任务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(2,true,"java", "7021", "scapi", "spider-center", "QG", "spider-center.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "授信-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true,"java", "7037", "qapi", "cash-loan-flow", "QG", "cash_loan_flow.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "现金贷流量对接-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(2,true, "java", "7012", "financial-api", "financial-system", "QG", "financial_system.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "财务系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7034", "", "fund-manage", "QG", "fund_manage.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "债转系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true,"java", "7029", "gyxdapi", "gyxd", "QG", "gyxd.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "广源小贷-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true, "java", "7038", "merchantapi", "merchant-backend", "QG", "merchant.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "商户后台-server", "凌子华／陈东亮", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true,"java", "7031", "redpacket", "redpacket", "baitiao", "redpacket.log", "application.properties", "--worker 1 --currentWorker 1 -t > /dev/null 2>&1 &", null, 2, "红包系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(2,false, "java", "7044", "", "finance-api", "bo.wang", "finance-api.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "财务系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(2,false, "java", "7045", "", "check-accounts", "QG", "check_accounts.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "对账系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7014", "qunar", "du-jiang-yan", "QG", "du_jiang_yan.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "第三方对接导流-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "8051", "", "msg", "fund_pay", "msg.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "新版消息中心", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7052", "", "xyqb-btzt", "qg-op-backend", "xyqb-btzt.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投外部", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7053", "", "xyqb-btzt-internal", "qg-op-backend", "xyqb-btzt-internal.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投内部", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7060", "", "baitiao-op-backend", "baitiao", "baitiao-op-backend.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "运营系统服务", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "xyqb-backend/target");[m
[31m-new pClass().init(1,true, "java", "7062", "", "xyqb-user2-query", "head_group", "xyqb_user_query.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "用户系统查询服务", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(2,false, "java", "7063", "", "traffic-webapp", "qg-op-backend", "traffic.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "流量分发系统", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7017", "eureka.silkroad", "silk-road-eureka", "baitiao", "silk-road-eureka.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "Eureka 服务注册发现微服务", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7027", "", "silk-road-caller", "baitiao", "silk-road-caller.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "MQ消息调用中心微服务", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7056", "scoreapi", "score", "baitiao", "score.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "积分系统", "刑志超", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7065", "", "silk-road-backman", "baitiao", "silk-road-backman.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投-对内系统2", "张曙", "mvn clean package -U -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7066", "", "silk-road", "baitiao", "silk-road.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投-对外系统2", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true, "java", "7059", "zt", "baitiao-zhitou", "baitiao", "baitiao-zhitou.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投-对接资金方", "张斌", "mvn clean package -Ptest -Dmaven.test.skip=true", "./xyqb-btzt-internal/target/");[m
[31m-new pClass().init(2,false, "java", "7068", "", "customer_helpdesk", "data-riskcontrol", "customer_helpdesk.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "外部客服-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true, "java", "7069", "", "notify", "fund_pay", "notify.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "支付中心消息通知系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true, "java", "7071", "", "mall-settlement", "baitiao", "mall-settlement.log", "application-test.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "商户结算系统", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(2,true, "java", "7072", "", "data-taurus", "data-riskcontrol", "data-taurus.log", "application.properties", " /dev/null 2>&1 &", null, 2, "质保金-server", "","mvn clean package -Ptest -Dmaven.test.skip=true","");[m
[31m-new pClass().init(1,true, "java", "7074", "", "account-center", "QG", "account_center.log", "application.properties", " /dev/null 2>&1 &", null, 2, "账户中心-server", "","mvn clean package -Ptest -Dmaven.test.skip=true","");[m
[31m-new pClass().init(1,true, "java", "7079", "", "user-credit", "QG", "user_credit.log", "application.properties", " /dev/null 2>&1 &", null, 2, "用户升级-server", "","mvn clean package -Ptest -Dmaven.test.skip=true","");[m
[31m-new pClass().init(2,true, "java", "7076", "", "urge_dispatcher", "data-riskcontrol", "dispatcher.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "催收系统", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true, "java", "7081", "", "wechat-config", "fund_pay", "wechat-config.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "微信消息推送系统", "",     "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7082", "", "clotho", "funding", "clotho.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &",     null, 2, "资金方统计相关功能", "",     "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7085", "", "mall-canal", "baitiao", "mall_canal.log", "application.properties", "-l 152 -w 2 &", null, 2, "商城订单监控", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7087", "", "xyqb-display", "baitiao", "display.log", "application.properties", "&", null, 2, "信用钱包显示配置", "陈东亮", "mvn clean package -Ptest     -Dmaven.test.skip=true", "./display-api/target/");[m
[31m-new pClass().init(1,true, "java", "7087", "schedule", "user-credit-schedule", "QG", "user_credit_schedule.log", "application.properties", " /dev/null 2>&1 &", null, 2, "用户升级-server", "","mvn clean package     -Ptest -Dmaven.test.skip=true",    "");[m
[31m-new pClass().init(1,true,"java", "7089", "baitiao-guangdaapi", "baitiao-guangda", "baitiao", "baitiao-guangda.log", "application.properties", "--worker 1 --curr    entWorker 1 -t > /dev/null 2>&1 &", null, 2, "guangda-server", "宋志超", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,true,"java", "7093", "", "account-center-helper", "QG", "account_center_helper.log", "application.properties", "--worker 1 --curr entWorker 1 -t > /dev/null 2>&1 &", null, 2, "历史数据处理", "高淑盈", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7042", "passportapi2", "xyqb-user2", "head_group", "xyqb_user.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts  ", "-Dtest=true", 2, "用户注册登录-V2-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1, true,"java", "7003", "api", "xyqb", "QG", "xyqb.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "现金贷-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1, true,"java", "7025", "btapi", "baitiao", "baitiao", "baitiao.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "白条-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "baitiao-api/target");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7019", "mallapi", "xyqb-mall", "QG", "mall.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "商城后台-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7010", "offapi", "xyqb-offline", "QG", "xyqb_offline.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "线下业务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(2,false,"java", "7005", "rapi", "di-ting", "QG", "di_ting.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "风控审计-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7013", "auth", "han-gu-guan", "QG", "han-gu-guan.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "用户注册登录-V1-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7015", "rauth", "jian-men-guan", "QG", "jian_men_guan.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "信审服务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7028", "pdf", "black-hole", "QG", "black-hole.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "合同中心-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7006", "payapi", "gu-bei", "funding", "pay-center.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "支付中心-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7023", "quartz", "xyqb-quartz", "QG", "quartz.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "定时任务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(2,true,"java", "7021", "scapi", "spider-center", "QG", "spider-center.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "授信-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7037", "qapi", "cash-loan-flow", "QG", "cash_loan_flow.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "现金贷流量对接-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(2,true, "java", "7012", "financial-api", "financial-system", "QG", "financial_system.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "财务系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7034", "", "fund-manage", "QG", "fund_manage.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "债转系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7029", "gyxdapi", "gyxd", "QG", "gyxd.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "广源小贷-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7038", "merchantapi", "merchant-backend", "QG", "merchant.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "商户后台-server", "陈东亮", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7031", "redpacket", "redpacket", "baitiao", "redpacket.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "红包系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(2,false, "java", "7044", "", "finance-api", "bo.wang", "finance-api.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "财务系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(2,false, "java", "7045", "", "check-accounts", "QG", "check_accounts.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "对账系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7014", "qunar", "du-jiang-yan", "QG", "du_jiang_yan.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "第三方对接导流-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "8051", "", "msg", "fund_pay", "msg.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "新版消息中心", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7052", "", "xyqb-btzt", "qg-op-backend", "xyqb-btzt.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "白条直投外部", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7053", "", "xyqb-btzt-internal", "qg-op-backend", "xyqb-btzt-internal.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "白条直投内部", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7060", "", "baitiao-op-backend", "baitiao", "baitiao-op-backend.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "运营系统服务", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "xyqb-backend/target");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7062", "", "xyqb-user2-query", "head_group", "xyqb_user_query.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts  -Dtest=true ", "", 2, "用户系统查询服务", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(2,false, "java", "7063", "", "traffic-webapp", "qg-op-backend", "traffic.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "流量分发系统", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7017", "eureka.silkroad", "silk-road-eureka", "baitiao", "silk-road-eureka.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "Eureka 服务注册发现微服务", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7027", "", "silk-road-caller", "baitiao", "silk-road-caller.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "MQ消息调用中心微服务", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7056", "scoreapi", "score", "baitiao", "score.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "积分系统", "刑志超", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7065", "", "silk-road-backman", "baitiao", "silk-road-backman.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "白条直投-对内系统2", "张曙", "mvn clean package -U -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7066", "", "silk-road", "baitiao", "silk-road.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "白条直投-对外系统2", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7059", "zt", "baitiao-zhitou", "baitiao", "baitiao-zhitou.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "白条直投-对接资金方", "张斌", "mvn clean package -Ptest -Dmaven.test.skip=true", "./xyqb-btzt-internal/target/");[m
[32m+[m[32mnew pClass().init(2,false, "java", "7068", "", "customer_helpdesk", "data-riskcontrol", "customer_helpdesk.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "外部客服-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7069", "", "notify", "fund_pay", "notify.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "支付中心消息通知系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7071", "", "mall-settlement", "baitiao", "mall-settlement.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "商户结算系统", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(2,true, "java", "7072", "", "data-taurus", "data-riskcontrol", "data-taurus.log", "application.properties", "", "", 2, "质保金-server", "","mvn clean package -Ptest -Dmaven.test.skip=true","");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7074", "", "account-center", "QG", "account_center.log", "application.properties", "", "", 2, "账户中心-server", "","mvn clean package -Ptest -Dmaven.test.skip=true","");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7079", "", "user-credit", "QG", "user_credit.log", "application.properties", "", "", 2, "用户升级-server", "","mvn clean package -Ptest -Dmaven.test.skip=true","");[m
[32m+[m[32mnew pClass().init(2,true, "java", "7076", "", "urge_dispatcher", "data-riskcontrol", "dispatcher.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "催收系统", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7081", "", "wechat-config", "fund_pay", "wechat-config.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ", "", 2, "微信消息推送系统", "",     "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7082", "", "clotho", "funding", "clotho.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts ","", 2, "资金方统计相关功能", "",     "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7085", "", "mall-canal", "baitiao", "mall_canal.log", "application.properties", "-l 152 -w 2 &", "", 2, "商城订单监控", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7087", "", "xyqb-display", "baitiao", "display.log", "application.properties", "&", "", 2, "信用钱包显示配置", "陈东亮", "mvn clean package -Ptest     -Dmaven.test.skip=true", "./display-api/target/");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7087", "schedule", "user-credit-schedule", "QG", "user_credit_schedule.log", "application.properties", "", "", 2, "用户升级-server", "","mvn clean package     -Ptest -Dmaven.test.skip=true",    "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7089", "baitiao-guangdaapi", "baitiao-guangda", "baitiao", "baitiao-guangda.log", "application.properties", "--worker 1 --currentWorker 1 -t ", "", 2, "guangda-server", "宋志超", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7093", "", "account-center-helper", "QG", "account_center_helper.log", "application.properties", "--worker 1 --curr entWorker 1 -t ", "", 2, "历史数据处理", "高淑盈", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 [m
 // ui----[m
 new pClass().init(1,true, "ui", "7032", "op", "op-ui", "QG", null, "src/js/env.config.js", "npm run build", "node7", 1, "运营系统-ui", "", "", "");[m
[36m@@ -146,7 +149,7 @@[m [mnew pClass().init(1,true, "ui", "7078", "", "ka-factory-ui", "ui", null, "src/co[m
 new pClass().init(1,false, "ui", "7064", "statistics-op", "statistics-op-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "流量统计平台-ui", "刘威", "", "");[m
 new pClass().init(1,true, "ui", "7084", "", "gdxd-op-ui", "ui", null, "src/config/env.config.js", "npm run build", "node7", 1, "广达小贷后台-ui", "薛志杰", "", "");[m
 new pClass().init(1,true, "ui", "7080", "", "new-mall-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "微信商城-ui", "郑少文，周珊", "", "");[m
[31m-new pClass().init(2,true, "ui", "7092", "", "union-ui", "data", null, "src/Config/config.jsx", "npm run build", "node7", 1, "信用联盟-ui", "李斌", "", "");[m
[32m+[m[32m//new pClass().init(2,false, "ui", "7092", "", "union-ui", "data", null, "src/Config/config.jsx", "npm run build", "node7", 1, "信用联盟-ui", "李斌", "", "");[m
 [m
 // node[m
 new pClass().init(1,true, "node", "7018", "sappbackend", "app-backend", "QG", null, "config/environment/test.js", "forever start -a -s --uid AppBackend bin/www", null, 1, "APP后台服务-server", "", "forever stop AppBackend", "");[m
[1mdiff --git a/qa_shell_script/exception_sub_shell.sh b/qa_shell_script/exception_sub_shell.sh[m
[1mindex 66a9b93..aadefe7 100755[m
[1m--- a/qa_shell_script/exception_sub_shell.sh[m
[1m+++ b/qa_shell_script/exception_sub_shell.sh[m
[36m@@ -167,10 +167,7 @@[m [mtranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.24" "activi[m
 tranceConfig ui "wechattest.xyqb.com" "xyqb-user2-24.q-gp.com" "192.168.4.24" "new-xyqb-user-ui.js"[m
 tranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.24" "new-xyqb-user-ui.js"[m
 #4.25[m
[31m-tranceConfig ui "wechattest.xyqb.com" "xyqb-user2-25.q-gp.com" "192.168.4.25" "xyqb-user-ui.js"[m
[31m-tranceConfig java "wx89894cd83d117b26" "wx9d259d369c88bf31" "192.168.4.25" "xyqb-user2.properties"[m
[31m-tranceConfig java "11fb7f6a8b8edf2776a72c2f5624229c" "2c1603ace1d6e7ae1f0c376cf7bcd72e" "192.168.4.25" "xyqb-user2.properties"[m
[31m-tranceConfig ui "wx89894cd83d117b26" "wx9d259d369c88bf31" "192.168.4.25" "xyqb-user-ui.js"[m
[32m+[m[32mtranceConfig ui "wechattest.xyqb.com" "xyqb-user2-25.q-gp.com" "192.168.4.25" "new-xyqb-user-ui.js"[m
 #4.26[m
 tranceConfig java "ygziguan.api.url=http://139.198.0.253/receiver/grequest" "ygziguan.api.url=http://mock.q-gp.com/receiver/grequest" "192.168.4.26" "fund-manage.properties"[m
 tranceConfig ui "wechattest.xyqb.com" "xyqb-user2-26.q-gp.com" "192.168.4.26" "new-xyqb-user-ui.js"[m
[1mdiff --git a/qa_shell_script/migrate_ENV/change_npmrc.sh b/qa_shell_script/migrate_ENV/change_npmrc.sh[m
[1mnew file mode 100644[m
[1mindex 0000000..604ddd3[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/migrate_ENV/change_npmrc.sh[m
[36m@@ -0,0 +1,8 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mrm  /root/.npmrc[m
[32m+[m[32mtouch /root/.npmrc[m
[32m+[m[32mecho "registry=http://172.16.3.15:4873/" >> /root/.npmrc[m
[32m+[m[32mecho "@remy:registry=https://registry.npm.taobao.org" >> /root/.npmrc[m
[32m+[m[32mecho "@koa:registry=https://registry.npm.taobao.org" >> /root/.npmrc[m
[32m+[m[32mecho "@types:registry=https://registry.npm.taobao.org" >> /root/.npmrc[m
[32m+[m
[1mdiff --git a/qa_shell_script/ngrok/make_frp_ini.sh b/qa_shell_script/ngrok/make_frp_ini.sh[m
[1mindex dda0cc3..d4b2719 100755[m
[1m--- a/qa_shell_script/ngrok/make_frp_ini.sh[m
[1m+++ b/qa_shell_script/ngrok/make_frp_ini.sh[m
[36m@@ -70,7 +70,7 @@[m [maddFrpcSub bp http 192.168.4 27 10084 bp $filename[m
 addFrpcSub qahelp http 192.168.4 27 8000 qahelp $filename[m
 addFrpcSub h5sp http 192.168.4 25 7057  h5sp-25 $filename[m
 addFrpcSub qg1 http 192.168.4 21 9019 qg1-21 $filename[m
[31m-[m
[32m+[m[32maddFrpcSub uanguang http 192.168.4 126 80 uanguang $filename[m
 [m
 [m
 [m
[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq_bak.sh b/qa_shell_script/rabbitmq/initial_mq.sh.bak[m
[1msimilarity index 100%[m
[1mrename from qa_shell_script/rabbitmq/initial_mq_bak.sh[m
[1mrename to qa_shell_script/rabbitmq/initial_mq.sh.bak[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/mall_faxian_tab.sh b/qa_shell_script/script_by_Contorller/mall_faxian_tab.sh[m
[1mindex 806d37a..e960840 100755[m
[1m--- a/qa_shell_script/script_by_Contorller/mall_faxian_tab.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/mall_faxian_tab.sh[m
[36m@@ -17,19 +17,19 @@[m [mmysql -N $mysqld display -e "CREATE TABLE discovery_config ([m
 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8"[m
 [m
 # 给display库的discovery_config表灌入基础数据[m
[31m-mysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value) [m
[32m+[m[32mmysql -N $mysqld display -e "insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
 values ( '信用分', '1', 'credit_score', '{\"firstDynamic\":\"信用钱包让有信用的人更有尊严，守护信用，守护尊严！\",\"fixedText\":\"信用分越高，额度越高，费率越低\",\"secondDynamic\":\"我们通过深度学习，汇总得出每位用户的信用分\",\"thirdDynamic\":\"钱包君会综合评估您的额度和动态费率\"}')";[m
 [m
[31m-mysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value) [m
[32m+[m[32mmysql -N $mysqld display -e "insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
 values ( '授权入口', '2', 'authorize_entrance', '{\"authorizeEntranceModels\":[{\"authorize\":\"运营商认证\",\"enable\":true,\"id\":1,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FuR2uVd5QLmLJRsJVgZNgwcrHzX2\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/Fi1E87xv63-DaMrng9GJZROJZcgO\",\"name\":\"运营商\",\"sort\":1},{\"authorize\":\"芝麻分\",\"enable\":true,\"id\":4,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fri_qH1foasXr_bj1ku2HMzontm5\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FlGwkdPtIqwx2609gPxS7ft9Aly_\",\"name\":\"芝麻分\",\"sort\":2},{\"authorize\":\"拍照\",\"enable\":true,\"id\":11,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fj5vj3j1ErbfpkHgUQCCb9J2HrjN\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FkvkF6Zkagx1RJoTcHbryC745SCt\",\"name\":\"拍照\",\"sort\":3},{\"authorize\":\"央行征信\",\"enable\":true,\"id\":5,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FvE0QwGO6ItHI0K97X3vNpG9Q25B\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FlrpNAxigybGfH2tfmDHs35p8prl\",\"name\":\"央行征信\",\"sort\":4},{\"authorize\":\"京东\",\"enable\":true,\"id\":6,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fsqnv3E7VgZn5QZe67ZXGx1Xba7w\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/Fi1Y084ZNGZpIzmEr3P_U5YjYBzy\",\"name\":\"京东\",\"sort\":5},{\"authorize\":\"社保\",\"enable\":true,\"id\":7,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FsLueJDcYziInejyNTYbA5UNNhxH\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FvKE3iBvrW-eXb18_OPxi4bMeivT\",\"name\":\"社保\",\"sort\":6},{\"authorize\":\"公积金\",\"enable\":true,\"id\":8,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fk-hdu1vNBc4GZY2fqJ_5F3JUedH\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FuPLTSROy-ItHMY_rAFey1xsTr9l\",\"name\":\"公积金\",\"sort\":7},{\"authorize\":\"信用卡邮箱\",\"enable\":true,\"id\":9,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fl4pPhkWzZVztZwgWShFimkNi-VK\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/Fu5hH_p0mUuDoLejLxWGQSydJIC5\",\"name\":\"信用卡邮箱\",\"sort\":8},{\"authorize\":\"学信\",\"enable\":true,\"id\":10,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FgZPJRaMYD5tdWFaVp5LBhveYNC5\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FoVq0wwJnoZc9ej7Io-oRl2nciU9\",\"name\":\"学信\",\"sort\":9},{\"authorize\":\"支付宝认证\",\"enable\":false,\"id\":2,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FlwCceUKFeUaMAt5MmqAjisHeADm\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/Ft-ac0avX9Zel1m-b9JIrc6BA7fn\",\"name\":\"支付宝\",\"sort\":10},{\"authorize\":\"淘宝认证\",\"enable\":false,\"id\":3,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FknH_6SvvwEJefTQD_SNktEdaXQ7\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FooCgQXhVDE5ktMENnlbj3dzah89\",\"name\":\"淘宝\",\"sort\":11}],\"authorizeText\":\"授权信息有助于提升信用分\"}')";[m
 [m
[31m-mysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value) [m
[32m+[m[32mmysql -N $mysqld display -e "insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
 values ( '贷款大全', '3', 'loan_book', '{\"bannerConfig\":{\"banners\":[{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FlFNylgooXgd7wtZS7Ij84wW1a5J\",\"name\":\"贷款大全\",\"navUrl\":\"https://h5.xyqb.com/leadflow/static/home?version=4\"}],\"isShow\":true},\"entranceModels\":[{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FgnXRbMz7FypRELrRDsPwLiQWvVV\",\"name\":\"大额专区\",\"navUrl\":\"http://h5.xyqb.com/leadflow/next?nextTitle=%E5%A4%A7%E9%A2%9D%E7%8E%B0%E9%87%91%E8%B4%B7&levelCode=5&version=4\"},{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FkObOKD-SE68yvQVDFqmD5cIiZbh\",\"name\":\"小额专区\",\"navUrl\":\"http://h5.xyqb.com/leadflow/next?nextTitle=%E5%B0%8F%E9%A2%9D%E6%9E%81%E9%80%9F%E8%B4%B7&levelCode=6&version=4\"},{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FoILJE-_-RdDOn1tvcqZR9Zso9sh\",\"name\":\"新品专区\",\"navUrl\":\"http://h5.xyqb.com/leadflow/next?nextTitle=%E6%96%B0%E5%93%81%E9%80%9F%E9%80%92&levelCode=7&version=4\"},{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/Fnj7JdABns7BwO9GsjHE-fZRAT5D\",\"name\":\"更多\",\"navUrl\":\"https://h5.xyqb.com/leadflow/static/home?version=4\"}],\"loanStates\":\"7,1,2,3,4,5,6\",\"title\":\"贷款大全\"}')";[m
 [m
[31m-mysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value) [m
[32m+[m[32mmysql -N $mysqld display -e "insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
 values ( '活动中心', '4', 'activity_center', '{\"bannerConfig\":{\"banners\":[{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FvwfjR2jhjYxZI9Z-5Ti5Oiu3n91\",\"name\":\"关注公众号\",\"navUrl\":\"https://activity.xyqb.com/activity/598bfd94195c4f0486d7b3d9\"}],\"isShow\":true},\"entranceModels\":[{\"imgUrl\":\"https://oic74zs8j.qnssl.com/FvwfjR2jhjYxZI9Z-5Ti5Oiu3n91\",\"name\":\"呵呵\",\"navUrl\":\"http://www.baidu.com\",\"sort\":1}],\"imageEntrances\":[{\"imgUrl\":\"https://oic74zs8j.qnssl.com/FrGkkhGyS4ytrFhcihpEChmSauFD\",\"navUrl\":\"https://activity.xyqb.com/activity/59c4b522c0883151901ecde5\"},{\"imgUrl\":\"https://oic74zs8j.qnssl.com/FrscDbUuvBDliVAjztpagXon9J59\",\"navUrl\":\"https://activity.xyqb.com/share-money?userPhone%3D%7Bphone%7D%26token%3D%7Btoken%7D\"}],\"title\":\"活动中心\",\"type\":1}')";[m
 [m
[31m-mysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value) [m
[32m+[m[32mmysql -N $mysqld display -e "insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
 values ( '扫一扫', '0', 'scan', '{\"isShow\":true}')";[m
 [m
 [m

[33mcommit 8cb755e51830a040bd09601efaad6f660a4be5a8[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Tue Dec 19 11:28:30 2017 +0800

    up

[1mdiff --git a/db-utils/config/db_config b/db-utils/config/db_config[m
[1mindex e37f15a..4d4a421 100644[m
[1m--- a/db-utils/config/db_config[m
[1m+++ b/db-utils/config/db_config[m
[36m@@ -1,2 +1,2 @@[m
[31m-database_list=mall cash_loan_flow contract dujiangyan financial_system financial_system_api fund_manage gyxd merchant notify offline payment_center qinqiong quartz redpacket risk_control silk_road spider_center traffic_distribution user_credit xyqb xyqb_app xyqb_btzt xyqb_user[m
[32m+[m[32mdatabase_list=mall xyqb cash_loan_flow contract dujiangyan financial_system financial_system_api fund_manage gyxd merchant notify offline payment_center qinqiong quartz redpacket risk_control silk_road spider_center traffic_distribution user_credit xyqb_app xyqb_btzt xyqb_user[m
 source_db_pwd=Uiwb@o^fR&nHOa5t[m
\ No newline at end of file[m
[1mdiff --git a/db-utils/db_gen_config.sh b/db-utils/db_gen_config.sh[m
[1mindex 3ab7738..7adfef4 100755[m
[1m--- a/db-utils/db_gen_config.sh[m
[1m+++ b/db-utils/db_gen_config.sh[m
[36m@@ -166,7 +166,7 @@[m [mif [ $use_cache = true ];then[m
 	echo "\cp -rf $cache_dir/$database_name/. $db_backup_sub_folders/"[m
 	\cp -rf $cache_dir/$database_name/. $db_backup_sub_folders/[m
 else[m
[31m-	if [ $database_name = 'mall' ];then[m
[32m+[m	[32mif [ $database_name = 'mall' ] || [ $database_name = 'quartz' ];then[m
 		for table_name in $sys_table_list[m
 		do[m
 			file_name=$db_backup_sub_folders/$table_name.sql[m

[33mcommit 569a81f913ac2c89ff4c4ea429029af18f0603d1[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Tue Dec 19 10:49:18 2017 +0800

    up

[1mdiff --git a/db-utils/db_gen_config.sh b/db-utils/db_gen_config.sh[m
[1mindex 00c6ef0..3ab7738 100755[m
[1m--- a/db-utils/db_gen_config.sh[m
[1m+++ b/db-utils/db_gen_config.sh[m
[36m@@ -166,10 +166,19 @@[m [mif [ $use_cache = true ];then[m
 	echo "\cp -rf $cache_dir/$database_name/. $db_backup_sub_folders/"[m
 	\cp -rf $cache_dir/$database_name/. $db_backup_sub_folders/[m
 else[m
[31m-	for table_name in $sys_table_list[m
[31m-	do[m
[31m-		file_name=$db_backup_sub_folders/$table_name.sql[m
[31m-		echo "mysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --tables $table_name > $file_name"[m
[31m-		mysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --skip-lock-tables --tables $table_name --where "1=1 order by id desc limit 10000" --skip-add-locks > $file_name[m
[31m-	done[m
[32m+[m	[32mif [ $database_name = 'mall' ];then[m
[32m+[m		[32mfor table_name in $sys_table_list[m
[32m+[m		[32mdo[m
[32m+[m			[32mfile_name=$db_backup_sub_folders/$table_name.sql[m
[32m+[m			[32mecho "mysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --tables $table_name --where \"1=1 order by id desc limit 10000\"> $file_name"[m
[32m+[m			[32mmysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --skip-lock-tables --tables $table_name --where "1=1 order by id desc limit 10000" --skip-add-locks > $file_name[m
[32m+[m		[32mdone[m
[32m+[m	[32melse[m
[32m+[m		[32mfor table_name in $sys_table_list[m
[32m+[m		[32mdo[m
[32m+[m			[32mfile_name=$db_backup_sub_folders/$table_name.sql[m
[32m+[m			[32mecho "mysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --tables $table_name > $file_name"[m
[32m+[m			[32mmysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --skip-lock-tables --tables $table_name --skip-add-locks > $file_name[m
[32m+[m		[32mdone[m
[32m+[m	[32mfi[m
 fi[m

[33mcommit 3661ecd0190a647d845e075d60aeca44298622cb[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Tue Dec 19 10:45:34 2017 +0800

    up

[1mdiff --git a/qa_shell_script/jenkins/post_build_script_sync_db.sh b/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[1mindex a9af97e..192371f 100755[m
[1m--- a/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[1m+++ b/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[36m@@ -17,5 +17,6 @@[m [mgrep_key_word "Got error: [0-9]\{4\}:" 1[m
 grep_key_word "ERROR [0-9]\{4\} " 1[m
 grep_key_word "show tables failed" 3[m
 grep_key_word "EXEC_SQL_FAIELD Error [0-9]\{4\}" 1[m
[32m+[m[32mgrep_key_word "mysqldump: Couldn't execute" 2[m
 [m
 echo "post_build_script_sync_db finish~"[m

[33mcommit 918c5d2dfd246b469f7fcebfaa9087e5dfbcb292[m
Merge: 6262eff 6f57098
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Mon Dec 18 20:04:02 2017 +0800

    Merge branch 'master' of http://git.quantgroup.cn/QA/qa-deploy-utils

[33mcommit 6262eff489cbabca8876624e6f558b2337e36c3d[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Mon Dec 18 20:03:56 2017 +0800

    up

[1mdiff --git a/db-utils/db_gen_config.sh b/db-utils/db_gen_config.sh[m
[1mindex 4eb55a7..00c6ef0 100755[m
[1m--- a/db-utils/db_gen_config.sh[m
[1m+++ b/db-utils/db_gen_config.sh[m
[36m@@ -170,6 +170,6 @@[m [melse[m
 	do[m
 		file_name=$db_backup_sub_folders/$table_name.sql[m
 		echo "mysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --tables $table_name > $file_name"[m
[31m-		mysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --skip-lock-tables --tables $table_name --skip-add-locks > $file_name[m
[32m+[m		[32mmysqldump -u${source_db_user} -p${source_db_pwd} -h${source_db_host} -P${port} $database_name --skip-lock-tables --tables $table_name --where "1=1 order by id desc limit 10000" --skip-add-locks > $file_name[m
 	done[m
 fi[m

[33mcommit 6f570988ef21a5555e10577740b2a0d74d5486a7[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Mon Dec 18 16:38:40 2017 +0800

    a

[1mdiff --git a/qa_shell_script/ngrok/docker_env_name.sh b/qa_shell_script/ngrok/docker_env_name.sh[m
[1mindex a56c22a..8a3a8f4 100644[m
[1m--- a/qa_shell_script/ngrok/docker_env_name.sh[m
[1m+++ b/qa_shell_script/ngrok/docker_env_name.sh[m
[36m@@ -1 +1 @@[m
[31m- qa20|192.168.167.5 qa1|192.168.167.2 qa3|192.168.167.6 qa4|192.168.167.3 qa21|192.168.167.4 156|192.168.167.3 qa5|192.168.167.4 xjd001|192.168.167.6 zhangbin|192.168.167.7 qa6|192.168.167.3[m
[32m+[m[32mqa6|192.168.167.3 liuzhiguo|192.168.167.2[m

[33mcommit 5b700ba85cfde96f00c355224000e93a2e0591b3[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Sun Dec 17 13:50:00 2017 +0800

    update

[1mdiff --git a/qa_shell_script/config_server/get_project_config.js b/qa_shell_script/config_server/get_project_config.js[m
[1mindex 70787de..3f15591 100755[m
[1m--- a/qa_shell_script/config_server/get_project_config.js[m
[1m+++ b/qa_shell_script/config_server/get_project_config.js[m
[36m@@ -65,12 +65,9 @@[m [mpClass.prototype = {[m
 			}[m
 		}[m
 	}[m
[31m-	// --java[m
[32m+[m[32m// --java[m
 new pClass().init(1, true,"java", "7003", "api", "xyqb", "QG", "xyqb.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "现金贷-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-[m
 new pClass().init(1, true,"java", "7025", "btapi", "baitiao", "baitiao", "baitiao.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "baitiao-api/target");[m
[31m-[m
[31m-new pClass().init(1,true,"java", "7019", "mallapi", "xyqb-mall", "QG", "mall.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "商城后台-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true, "java", "7010", "offapi", "xyqb-offline", "QG", "xyqb_offline.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "线下业务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true,"java", "7042", "passportapi2", "xyqb-user2", "head_group", "xyqb_user.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "用户注册登录-V2-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(2,false,"java", "7005", "rapi", "di-ting", "QG", "di_ting.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "风控审计-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[36m@@ -112,7 +109,6 @@[m [mnew pClass().init(1,true, "java", "7081", "", "wechat-config", "fund_pay", "wech[m
 new pClass().init(1,false, "java", "7082", "", "clotho", "funding", "clotho.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &",     null, 2, "资金方统计相关功能", "",     "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,false, "java", "7085", "", "mall-canal", "baitiao", "mall_canal.log", "application.properties", "-l 152 -w 2 &", null, 2, "商城订单监控", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,false, "java", "7087", "", "xyqb-display", "baitiao", "display.log", "application.properties", "&", null, 2, "信用钱包显示配置", "陈东亮", "mvn clean package -Ptest     -Dmaven.test.skip=true", "./display-api/target/");[m
[31m-[m
 new pClass().init(1,true, "java", "7087", "schedule", "user-credit-schedule", "QG", "user_credit_schedule.log", "application.properties", " /dev/null 2>&1 &", null, 2, "用户升级-server", "","mvn clean package     -Ptest -Dmaven.test.skip=true",    "");[m
 new pClass().init(1,true,"java", "7089", "baitiao-guangdaapi", "baitiao-guangda", "baitiao", "baitiao-guangda.log", "application.properties", "--worker 1 --curr    entWorker 1 -t > /dev/null 2>&1 &", null, 2, "guangda-server", "宋志超", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true,"java", "7093", "", "account-center-helper", "QG", "account_center_helper.log", "application.properties", "--worker 1 --curr entWorker 1 -t > /dev/null 2>&1 &", null, 2, "历史数据处理", "高淑盈", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m

[33mcommit 935418233206c278c78a7d044cceb5d76d559e9d[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Sun Dec 17 13:48:37 2017 +0800

    up

[1mdiff --git a/qa_shell_script/exception_sub_shell.sh b/qa_shell_script/exception_sub_shell.sh[m
[1mindex 4af42d5..66a9b93 100755[m
[1m--- a/qa_shell_script/exception_sub_shell.sh[m
[1m+++ b/qa_shell_script/exception_sub_shell.sh[m
[36m@@ -164,7 +164,8 @@[m [mtranceConfig java "11fb7f6a8b8edf2776a72c2f5624229c" "e30380e9ade07f361e51a643f9[m
 tranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.24" "xyqb-user-ui.js"[m
 tranceConfig ui "11fb7f6a8b8edf2776a72c2f5624229c" "e30380e9ade07f361e51a643f94d8817" "192.168.4.24" "xyqb-user-ui.js"[m
 tranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.24" "activity-ui.js"[m
[31m-[m
[32m+[m[32mtranceConfig ui "wechattest.xyqb.com" "xyqb-user2-24.q-gp.com" "192.168.4.24" "new-xyqb-user-ui.js"[m
[32m+[m[32mtranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.24" "new-xyqb-user-ui.js"[m
 #4.25[m
 tranceConfig ui "wechattest.xyqb.com" "xyqb-user2-25.q-gp.com" "192.168.4.25" "xyqb-user-ui.js"[m
 tranceConfig java "wx89894cd83d117b26" "wx9d259d369c88bf31" "192.168.4.25" "xyqb-user2.properties"[m
[36m@@ -172,6 +173,8 @@[m [mtranceConfig java "11fb7f6a8b8edf2776a72c2f5624229c" "2c1603ace1d6e7ae1f0c376cf7[m
 tranceConfig ui "wx89894cd83d117b26" "wx9d259d369c88bf31" "192.168.4.25" "xyqb-user-ui.js"[m
 #4.26[m
 tranceConfig java "ygziguan.api.url=http://139.198.0.253/receiver/grequest" "ygziguan.api.url=http://mock.q-gp.com/receiver/grequest" "192.168.4.26" "fund-manage.properties"[m
[32m+[m[32mtranceConfig ui "wechattest.xyqb.com" "xyqb-user2-26.q-gp.com" "192.168.4.26" "new-xyqb-user-ui.js"[m
[32m+[m[32mtranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.26" "new-xyqb-user-ui.js"[m
 [m
 #4.28[m
 [m
[36m@@ -188,7 +191,9 @@[m [mtranceConfig ui "wx89894cd83d117b26" "wx89894cd83d117b26" "192.168.4.28" "new-xy[m
 #tranceConfig java "wx.api_host=https:\/\/api.mch.weixin.qq.com\/" "wx.api_host=http:\/\/mock.q-gp.com\/" "192.168.4.72" "gu-bei.properties"[m
 tranceConfig node "http://139.198.2.95:38099" "http://192.168.4.48:8099" "192.168.4.72" "AppBackend.js"[m
 tranceConfig ui "//192.168.4.72:7054/" "//192.168.4.72:18000/mallapi/" "192.168.4.72" "new-mall-ui.js"[m
[31m-[m
[32m+[m[32m#4.88[m
[32m+[m[32mtranceConfig ui "wechattest.xyqb.com" "xyqb-user2-88.q-gp.com" "192.168.4.88" "new-xyqb-user-ui.js"[m
[32m+[m[32mtranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.88" "new-xyqb-user-ui.js"[m
 #4.151[m
 tranceConfig java "xyqb.is.debug=0" "xyqb.is.debug=1" "192.168.4.151" "xyqb.properties"[m
 tranceConfig java "liebao.aes.key=0123456789abcdef" "liebao.aes.key=e2XNtnB8QEEuvhEW" "192.168.4.151" "cash-loan-flow.properties"[m
[1mdiff --git a/qa_shell_script/migrate_ENV/enable_mq_plugin.sh b/qa_shell_script/migrate_ENV/enable_mq_plugin.sh[m
[1mindex 81a75d9..71a52ab 100644[m
[1m--- a/qa_shell_script/migrate_ENV/enable_mq_plugin.sh[m
[1m+++ b/qa_shell_script/migrate_ENV/enable_mq_plugin.sh[m
[36m@@ -1,5 +1,5 @@[m
 #!/bin/bash[m
 cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.0/plugins/[m
 scp root@192.168.4.15:/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.0/plugins/rabbitmq_delayed_message_exchange-0.0.1.ez .[m
[31m-/usr/lib/bin/rabbitmq-plugins enable rabbitmq_delayed_message_exchange[m
[31m-sh /home/qa-deploy-utils/qa_shell_script/rabbitmq/restart_mq.sh[m
\ No newline at end of file[m
[32m+[m[32m/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_delayed_message_exchange[m
[32m+[m[32msh /home/qa-deploy-utils/qa_shell_script/rabbitmq/restart_mq.sh[m
[1mdiff --git a/qa_shell_script/ngrok/docker_env_name.sh b/qa_shell_script/ngrok/docker_env_name.sh[m
[1mindex c0e7936..a56c22a 100644[m
[1m--- a/qa_shell_script/ngrok/docker_env_name.sh[m
[1m+++ b/qa_shell_script/ngrok/docker_env_name.sh[m
[36m@@ -1 +1 @@[m
[31m- qa20|192.168.167.5 qa1|192.168.167.2 qa3|192.168.167.6 qa4|192.168.167.3 qa21|192.168.167.4 156|192.168.167.3 qa5|192.168.167.4 xjd001|192.168.167.6 zhangbin|192.168.167.7[m
[32m+[m[32m qa20|192.168.167.5 qa1|192.168.167.2 qa3|192.168.167.6 qa4|192.168.167.3 qa21|192.168.167.4 156|192.168.167.3 qa5|192.168.167.4 xjd001|192.168.167.6 zhangbin|192.168.167.7 qa6|192.168.167.3[m
[1mdiff --git a/qa_shell_script/ngrok/make_frp_ini.sh b/qa_shell_script/ngrok/make_frp_ini.sh[m
[1mindex 07c0a7d..dda0cc3 100755[m
[1m--- a/qa_shell_script/ngrok/make_frp_ini.sh[m
[1m+++ b/qa_shell_script/ngrok/make_frp_ini.sh[m
[36m@@ -61,15 +61,15 @@[m [maddFrpcLoc local_ http 8000 q-gp.com / $filename[m
 [m
 [m
 addFrpcSub store http 127.0.0 1 8001 store  $filename[m
[31m-addFrpcSub h5 http 192.168.4 16 7051 h5 $filename[m
[32m+[m[32maddFrpcSub h5 http 192.168.4 88 7051 h5 $filename[m
 addFrpcSub mock http 192.168.4 27 80 mock $filename[m
 addFrpcSub atm http 192.168.4 18 3000 atm $filename[m
 addFrpcSub auth-center http 192.168.4 193 8099 auth-center-38 $filename[m
 addFrpcSub company http 192.168.4 27 10087 company-241 $filename[m
 addFrpcSub bp http 192.168.4 27 10084 bp $filename[m
 addFrpcSub qahelp http 192.168.4 27 8000 qahelp $filename[m
[31m-[m
[31m-[m
[32m+[m[32maddFrpcSub h5sp http 192.168.4 25 7057  h5sp-25 $filename[m
[32m+[m[32maddFrpcSub qg1 http 192.168.4 21 9019 qg1-21 $filename[m
 [m
 [m
 [m
[1mdiff --git a/qa_shell_script/script_by_Contorller/2_diting_huoquzijinfangshenhe.sh b/qa_shell_script/script_by_Contorller/2_diting_huoquzijinfangshenhe.sh[m
[1mindex 13cd969..656a6c6 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/2_diting_huoquzijinfangshenhe.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/2_diting_huoquzijinfangshenhe.sh[m
[36m@@ -27,7 +27,7 @@[m [mdelete from xyqb.loan_application_manifest_history[m
 where loan_application_history_id =111112222233333;[m
 [m
 INSERT INTO xyqb.loan_application_manifest_history (user_id, loan_application_history_id, channel_id, product_id, transaction_flow_id, funding_corp_id, funding_corp_name, contract_loan_amount, contract_term, service_fee_per_term, one_time_service_fee, monthly_interest_rate, total_repayment_amount, monthly_repayment, real_loan_amount, annual_interest_rate, principal_and_interest_per_term, total_principal_and_interest, company_income, loan_received_at, loan_paid_at, transaction_status, remark, red_packet_strategy) [m
[31m-VALUES (1, 111112222233333, 1, 32, 0, $fund_id, N'测试资金方', 2000.00, 3, 150.00, 0.00, 0.011675, 2496.88, 832.29, 2000.00, 0.140100, 682.29, 2046.88, 46.88, '2017-06-08 18:39:33', '1989-09-29 00:00:00', 0, '', NULL);[m
[32m+[m[32mVALUES (1, 111112222233333, 1, 32, 0, $fund_id, N'测试资金方', 2000.00, 3, 50.00, 0.00, 0.011675, 2496.88, 832.29, 2000.00, 0.140100, 682.29, 2046.88, 46.88, '2017-06-08 18:39:33', '1989-09-29 00:00:00', 0, '', NULL);[m
 [m
 delete from xyqb.loan_application_manifest_history[m
 where loan_application_history_id=(select id from xyqb.loan_application_history where business_type=0 and user_id=(select id from xyqb_user.user where phone_no =$phone_no) and is_active=1);[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/baitiao_user_delete.sh b/qa_shell_script/script_by_Contorller/baitiao_user_delete.sh[m
[1mindex a40679b..37adce6 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/baitiao_user_delete.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/baitiao_user_delete.sh[m
[36m@@ -170,6 +170,12 @@[m [mfunction baitiaoDeleteOrder(){[m
 [m
 #paycenter[m
   fi [m
[32m+[m
[32m+[m[32mredis-cli -h $ip -p 6379 FLUSHALL[m
[32m+[m[32mredis-cli -h $ip -p 6380 FLUSHALL[m
[32m+[m[32mredis-cli -h $ip -p 6381 FLUSHALL[m
[32m+[m[32mredis-cli -h $ip -p 6382 FLUSHALL[m
[32m+[m[32mredis-cli -h $ip -p 6383 FLUSHALL[m
  echo "done!!! `date`"[m
 }[m
 baitiaoDeleteOrder $ip $phone_no[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/mall_deliveryOrder.sh b/qa_shell_script/script_by_Contorller/mall_deliveryOrder.sh[m
[1mindex 7a967ec..ae71e67 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/mall_deliveryOrder.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/mall_deliveryOrder.sh[m
[36m@@ -17,7 +17,7 @@[m [mmysql -N $mysqld mall -e "update mall_order set order_state='3' where order_id='[m
 [m
 # 更新mall.digital_order_detail表的物流信息[m
 mallOrderId=`mysql -N $mysqld mall -e "select id from mall_order where order_id='$orderId'"`;[m
[31m-mysql -N $mysqld mall -e "update digital_order_detail set logistics_company='韵达',logistics_phone='18800001111',[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; update digital_order_detail set logistics_company='韵达',logistics_phone='18800001111',[m
 logistics_delivery_code='1234567890',logistics_delivery_time='$seq' where order_id='$mallOrderId'";[m
 [m
 # 更新merchant.supplier_order表的订单状态[m
[36m@@ -32,7 +32,7 @@[m [mvalues[m
 [m
 # 更新merchant.supplier_order_logistics表的物流信息[m
 orderStatusId=`mysql -N $mysqld merchant -e "select id from supplier_order_status_history where supplier_order_id='$supplierOrderId'"`;[m
[31m-mysql -N $mysqld merchant -e "insert into supplier_order_logistics[m
[32m+[m[32mmysql -N $mysqld merchant -e "set names utf-8; insert into supplier_order_logistics[m
 ( order_id, order_status_id, mall_order_no, operator, created_at, updated_at, logistics_order_no, express_company, express_phone, delivery_at) [m
 values[m
 ( '$supplierOrderId', '$orderStatusId', '$orderId', '38', '$seq', '$seq',  '789211463752', '韵达', '18800001111', '$seq')";[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/mall_faxian_tab.sh b/qa_shell_script/script_by_Contorller/mall_faxian_tab.sh[m
[1mnew file mode 100755[m
[1mindex 0000000..806d37a[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/script_by_Contorller/mall_faxian_tab.sh[m
[36m@@ -0,0 +1,36 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mip=$1[m
[32m+[m
[32m+[m[32mmysqld="-h$ip -p3306 -uqa -pqatest"[m
[32m+[m
[32m+[m[32m# 先删除display库的discovery_config表[m
[32m+[m[32mmysql -N $mysqld display -e "DROP TABLE IF EXISTS discovery_config";[m
[32m+[m
[32m+[m[32m# 再创建display库的discovery_config表[m
[32m+[m[32mmysql -N $mysqld display -e "CREATE TABLE discovery_config ([m
[32m+[m[32m  id bigint(11) NOT NULL AUTO_INCREMENT,[m
[32m+[m[32m  name varchar(50) NOT NULL,[m
[32m+[m[32m  sort int(4) NOT NULL,[m
[32m+[m[32m  config_key varchar(50) NOT NULL,[m
[32m+[m[32m  config_value text NOT NULL,[m
[32m+[m[32m  PRIMARY KEY (id)[m
[32m+[m[32m) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8"[m
[32m+[m
[32m+[m[32m# 给display库的discovery_config表灌入基础数据[m
[32m+[m[32mmysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
[32m+[m[32mvalues ( '信用分', '1', 'credit_score', '{\"firstDynamic\":\"信用钱包让有信用的人更有尊严，守护信用，守护尊严！\",\"fixedText\":\"信用分越高，额度越高，费率越低\",\"secondDynamic\":\"我们通过深度学习，汇总得出每位用户的信用分\",\"thirdDynamic\":\"钱包君会综合评估您的额度和动态费率\"}')";[m
[32m+[m
[32m+[m[32mmysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
[32m+[m[32mvalues ( '授权入口', '2', 'authorize_entrance', '{\"authorizeEntranceModels\":[{\"authorize\":\"运营商认证\",\"enable\":true,\"id\":1,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FuR2uVd5QLmLJRsJVgZNgwcrHzX2\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/Fi1E87xv63-DaMrng9GJZROJZcgO\",\"name\":\"运营商\",\"sort\":1},{\"authorize\":\"芝麻分\",\"enable\":true,\"id\":4,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fri_qH1foasXr_bj1ku2HMzontm5\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FlGwkdPtIqwx2609gPxS7ft9Aly_\",\"name\":\"芝麻分\",\"sort\":2},{\"authorize\":\"拍照\",\"enable\":true,\"id\":11,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fj5vj3j1ErbfpkHgUQCCb9J2HrjN\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FkvkF6Zkagx1RJoTcHbryC745SCt\",\"name\":\"拍照\",\"sort\":3},{\"authorize\":\"央行征信\",\"enable\":true,\"id\":5,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FvE0QwGO6ItHI0K97X3vNpG9Q25B\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FlrpNAxigybGfH2tfmDHs35p8prl\",\"name\":\"央行征信\",\"sort\":4},{\"authorize\":\"京东\",\"enable\":true,\"id\":6,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fsqnv3E7VgZn5QZe67ZXGx1Xba7w\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/Fi1Y084ZNGZpIzmEr3P_U5YjYBzy\",\"name\":\"京东\",\"sort\":5},{\"authorize\":\"社保\",\"enable\":true,\"id\":7,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FsLueJDcYziInejyNTYbA5UNNhxH\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FvKE3iBvrW-eXb18_OPxi4bMeivT\",\"name\":\"社保\",\"sort\":6},{\"authorize\":\"公积金\",\"enable\":true,\"id\":8,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fk-hdu1vNBc4GZY2fqJ_5F3JUedH\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FuPLTSROy-ItHMY_rAFey1xsTr9l\",\"name\":\"公积金\",\"sort\":7},{\"authorize\":\"信用卡邮箱\",\"enable\":true,\"id\":9,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/Fl4pPhkWzZVztZwgWShFimkNi-VK\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/Fu5hH_p0mUuDoLejLxWGQSydJIC5\",\"name\":\"信用卡邮箱\",\"sort\":8},{\"authorize\":\"学信\",\"enable\":true,\"id\":10,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FgZPJRaMYD5tdWFaVp5LBhveYNC5\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FoVq0wwJnoZc9ej7Io-oRl2nciU9\",\"name\":\"学信\",\"sort\":9},{\"authorize\":\"支付宝认证\",\"enable\":false,\"id\":2,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FlwCceUKFeUaMAt5MmqAjisHeADm\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/Ft-ac0avX9Zel1m-b9JIrc6BA7fn\",\"name\":\"支付宝\",\"sort\":10},{\"authorize\":\"淘宝认证\",\"enable\":false,\"id\":3,\"imgUrl1\":\"https://oic74zs8j.qnssl.com/FknH_6SvvwEJefTQD_SNktEdaXQ7\",\"imgUrl2\":\"https://oic74zs8j.qnssl.com/FooCgQXhVDE5ktMENnlbj3dzah89\",\"name\":\"淘宝\",\"sort\":11}],\"authorizeText\":\"授权信息有助于提升信用分\"}')";[m
[32m+[m
[32m+[m[32mmysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
[32m+[m[32mvalues ( '贷款大全', '3', 'loan_book', '{\"bannerConfig\":{\"banners\":[{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FlFNylgooXgd7wtZS7Ij84wW1a5J\",\"name\":\"贷款大全\",\"navUrl\":\"https://h5.xyqb.com/leadflow/static/home?version=4\"}],\"isShow\":true},\"entranceModels\":[{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FgnXRbMz7FypRELrRDsPwLiQWvVV\",\"name\":\"大额专区\",\"navUrl\":\"http://h5.xyqb.com/leadflow/next?nextTitle=%E5%A4%A7%E9%A2%9D%E7%8E%B0%E9%87%91%E8%B4%B7&levelCode=5&version=4\"},{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FkObOKD-SE68yvQVDFqmD5cIiZbh\",\"name\":\"小额专区\",\"navUrl\":\"http://h5.xyqb.com/leadflow/next?nextTitle=%E5%B0%8F%E9%A2%9D%E6%9E%81%E9%80%9F%E8%B4%B7&levelCode=6&version=4\"},{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FoILJE-_-RdDOn1tvcqZR9Zso9sh\",\"name\":\"新品专区\",\"navUrl\":\"http://h5.xyqb.com/leadflow/next?nextTitle=%E6%96%B0%E5%93%81%E9%80%9F%E9%80%92&levelCode=7&version=4\"},{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/Fnj7JdABns7BwO9GsjHE-fZRAT5D\",\"name\":\"更多\",\"navUrl\":\"https://h5.xyqb.com/leadflow/static/home?version=4\"}],\"loanStates\":\"7,1,2,3,4,5,6\",\"title\":\"贷款大全\"}')";[m
[32m+[m
[32m+[m[32mmysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
[32m+[m[32mvalues ( '活动中心', '4', 'activity_center', '{\"bannerConfig\":{\"banners\":[{\"enable\":true,\"imgUrl\":\"https://oic74zs8j.qnssl.com/FvwfjR2jhjYxZI9Z-5Ti5Oiu3n91\",\"name\":\"关注公众号\",\"navUrl\":\"https://activity.xyqb.com/activity/598bfd94195c4f0486d7b3d9\"}],\"isShow\":true},\"entranceModels\":[{\"imgUrl\":\"https://oic74zs8j.qnssl.com/FvwfjR2jhjYxZI9Z-5Ti5Oiu3n91\",\"name\":\"呵呵\",\"navUrl\":\"http://www.baidu.com\",\"sort\":1}],\"imageEntrances\":[{\"imgUrl\":\"https://oic74zs8j.qnssl.com/FrGkkhGyS4ytrFhcihpEChmSauFD\",\"navUrl\":\"https://activity.xyqb.com/activity/59c4b522c0883151901ecde5\"},{\"imgUrl\":\"https://oic74zs8j.qnssl.com/FrscDbUuvBDliVAjztpagXon9J59\",\"navUrl\":\"https://activity.xyqb.com/share-money?userPhone%3D%7Bphone%7D%26token%3D%7Btoken%7D\"}],\"title\":\"活动中心\",\"type\":1}')";[m
[32m+[m
[32m+[m[32mmysql -N $mysqld display -e "set names utf-8; insert into discovery_config ( name, sort, config_key, config_value)[m[41m [m
[32m+[m[32mvalues ( '扫一扫', '0', 'scan', '{\"isShow\":true}')";[m
[32m+[m
[32m+[m
[32m+[m[32mecho "成功创建display库、discovery_config表并灌入基础数据"[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/mall_jiekuan_tab.sh b/qa_shell_script/script_by_Contorller/mall_jiekuan_tab.sh[m
[1mnew file mode 100755[m
[1mindex 0000000..3472e5a[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/script_by_Contorller/mall_jiekuan_tab.sh[m
[36m@@ -0,0 +1,51 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mip=$1[m
[32m+[m
[32m+[m[32mseq=`date "+%Y-%m-%d %H:%M:%S"`[m
[32m+[m[32mmysqld="-h$ip -p3306 -uqa -pqatest"[m
[32m+[m
[32m+[m[32m# 0.未登录：先删除未登录状态下loan_config表数据，再插入新数据[m
[32m+[m[32mmysql -N $mysqld mall -e "delete from loan_config where loan_state='0' and config_key='buttonConfig'";[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; insert into loan_config ( id, loan_state, config_key, config_value, removed, update_at)[m[41m [m
[32m+[m[32mvalues ( '76', '0', 'buttonConfig', '{\n    \"isShow\":true,\n    \"buttonColor\":\"464B53\",\n   \"buttonTitle\":\"立即申请\",\n \"navUrl\":\"http://$ip:7001/app-landing?registerFrom={registerFrom}&channelId=1&token={token}&appChannel={appChannel}&appName={appName}\",\n    \"typefaceColor\":\"ffffff\"\n}', '0', '$seq')";[m
[32m+[m
[32m+[m[32m# 1.申请借款：先删除未登录状态下loan_config表数据，再插入新数据[m
[32m+[m[32mmysql -N $mysqld mall -e "delete from loan_config where loan_state='1' and config_key='buttonConfig'";[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; insert into loan_config ( id, loan_state, config_key, config_value, removed, update_at)[m[41m [m
[32m+[m[32mvalues ( '12', '1', 'buttonConfig', '{\n\"isShow\": true,\n\"buttonColor\":\"464B53\",\n\"buttonTitle\":\"立即拿钱\",\n \"navUrl\":\"http://$ip:7001/app-landing?registerFrom={registerFrom}&channelId=1&token={token}&appChannel={appChannel}&appName={appName}\",\n\"typefaceColor\":\"ffffff\"\n}', '0', '$seq')";[m
[32m+[m
[32m+[m[32m# 2.贷款审核中：先删除未登录状态下loan_config表数据，再插入新数据[m
[32m+[m[32mmysql -N $mysqld mall -e "delete from loan_config where loan_state='2' and config_key='buttonConfig'";[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; insert into loan_config ( id, loan_state, config_key, config_value, removed, update_at)[m[41m [m
[32m+[m[32mvalues ( '19', '2', 'buttonConfig', '{\n\"isShow\":true,\n\"buttonColor\":\"464B53\",\n\"buttonTitle\":\"去提额\",\n \"navUrl\":\"http://$ip:7001/app-landing?registerFrom={registerFrom}&channelId=1&token={token}&appChannel={appChannel}&appName={appName}\",\n\"typefaceColor\":\"ffffff\"\n}', '0', '$seq')";[m
[32m+[m
[32m+[m[32m# 3.审核通过：先删除未登录状态下loan_config表数据，再插入新数据[m
[32m+[m[32mmysql -N $mysqld mall -e "delete from loan_config where loan_state='3' and config_key='buttonConfig'";[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; insert into loan_config ( id, loan_state, config_key, config_value, removed, update_at)[m[41m [m
[32m+[m[32mvalues ( '27', '3', 'buttonConfig', '{\n\"isShow\":true,\n\"buttonColor\":\"464B53\",\n\"buttonTitle\":\"立即提现\",\n \"navUrl\":\"http://$ip:7001/app-landing?registerFrom={registerFrom}&channelId=1&token={token}&appChannel={appChannel}&appName={appName}\",\n\"typefaceColor\":\"ffffff\"\n}', '0', '$seq')";[m
[32m+[m
[32m+[m[32m# 4.放款中：先删除未登录状态下loan_config表数据，再插入新数据[m
[32m+[m[32mmysql -N $mysqld mall -e "delete from loan_config where loan_state='4' and config_key='buttonConfig'";[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; insert into loan_config ( id, loan_state, config_key, config_value, removed, update_at)[m[41m [m
[32m+[m[32mvalues ( '36', '4', 'buttonConfig', '{\n\"isShow\":true,\n\"buttonColor\":\"464B53\",\n\"buttonTitle\":\"一键催款\",\n \"navUrl\":\"http://$ip:7001/app-landing?registerFrom={registerFrom}&channelId=1&token={token}&appChannel={appChannel}&appName={appName}\",\n\"typefaceColor\":\"ffffff\"\n}', '0', '$seq')";[m
[32m+[m
[32m+[m[32m# 5.放款失败：先删除未登录状态下loan_config表数据，再插入新数据[m
[32m+[m[32mmysql -N $mysqld mall -e "delete from loan_config where loan_state='5' and config_key='buttonConfig'";[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; insert into loan_config ( id, loan_state, config_key, config_value, removed, update_at)[m[41m [m
[32m+[m[32mvalues ( '46', '5', 'buttonConfig', '{\n\"isShow\":true,\n\"buttonColor\":\"464B53\",\n\"buttonTitle\":\"立即申请\",\n \"navUrl\":\"http://$ip:7001/app-landing?registerFrom={registerFrom}&channelId=1&token={token}&appChannel={appChannel}&appName={appName}\",\n\"typefaceColor\":\"ffffff\"\n}', '0', '$seq')";[m
[32m+[m
[32m+[m[32m# 6.还款中：先删除未登录状态下loan_config表数据，再插入新数据[m
[32m+[m[32mmysql -N $mysqld mall -e "delete from loan_config where loan_state='6' and config_key='buttonConfig'";[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; insert into loan_config ( id, loan_state, config_key, config_value, removed, update_at)[m[41m [m
[32m+[m[32mvalues ( '54', '6', 'buttonConfig', '{\n\"isShow\":true,\n\"buttonColor\":\"464B53\",\n\"buttonTitle\":\"去还款\",\n \"navUrl\":\"http://$ip:7001/app-landing?registerFrom={registerFrom}&channelId=1&token={token}&appChannel={appChannel}&appName={appName}\",\n\"typefaceColor\":\"ffffff\"\n}', '0', '$seq')";[m
[32m+[m
[32m+[m[32m# 7.审核拒绝：先删除未登录状态下loan_config表数据，再插入新数据[m
[32m+[m[32mmysql -N $mysqld mall -e "delete from loan_config where loan_state='7' and config_key='buttonConfig'";[m
[32m+[m[32mmysql -N $mysqld mall -e "set names utf-8; insert into loan_config ( id, loan_state, config_key, config_value, removed, update_at)[m[41m [m
[32m+[m[32mvalues ( '65', '7', 'buttonConfig', '{\n\"isShow\":true,\n\"buttonColor\":\"464B53\",\n\"buttonTitle\":\"去借款\",\n \"navUrl\":\"http://$ip:7001/app-landing?registerFrom={registerFrom}&channelId=1&token={token}&appChannel={appChannel}&appName={appName}\",\n\"typefaceColor\":\"ffffff\"\n}', '0', '$seq')";[m
[32m+[m
[32m+[m[32mredis-cli -p 6379 flushall[m
[32m+[m
[32m+[m[32mecho "mall库的loan_config表，按钮配置更新完成"[m
[32m+[m
[32m+[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/mall_makeMallOrder.sh b/qa_shell_script/script_by_Contorller/mall_makeMallOrder.sh[m
[1mindex d92fb28..5695843 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/mall_makeMallOrder.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/mall_makeMallOrder.sh[m
[36m@@ -24,7 +24,7 @@[m [msupplierAmount=`expr $amount - $difference`[m
 seq=`date "+%Y-%m-%d %H:%M:%S"`[m
 [m
 mysql -h"$ip" -p"3306" -u"qa" -p"qatest" <<EOF[m
[31m-use mall;[m
[32m+[m[32muse mall set names utf-8;[m
 [m
 insert into mall.mall_order[m
 (order_id, user_id, order_state, is_active, product_id,  pay_approach,  pay_amount, created_at, updated_at)[m
[36m@@ -41,7 +41,7 @@[m [mvalues[m
 '北京市','海淀区','三环以内','丹棱街',205741,'61.50.0.0',1,'3845',13,[m
 '$seq','$seq','$seq','$seq','$seq','$amount',1.00,0.03);[m
 [m
[31m-use merchant;[m
[32m+[m[32muse merchant set names utf-8;[m
 [m
 insert into merchant.supplier_order[m
 (order_no,mall_order_no,supplier_id,mall_order_time,order_status,created_at,updated_at, goods_name,[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/redpacket_coupon.sh b/qa_shell_script/script_by_Contorller/redpacket_coupon.sh[m
[1mindex e50b902..7acf5f6 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/redpacket_coupon.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/redpacket_coupon.sh[m
[36m@@ -2,7 +2,7 @@[m
 set -e[m
 ip=$1[m
 phone_no=$2[m
[31m-coupon_type=$3 # 1-友宝满减券;2-商城购物满减券;3-商城购物折扣券;4-商城购物实物折扣券;5-商城购物实物满减券;6-商城购物充值折扣券;7-现金贷还款折扣券;8-现金贷还款抵扣券;9-现金贷还款免息券;10-白条购物满减券;11-外部白条满减券（深圳通）[m
[32m+[m[32mcoupon_type=$3 # 1-友宝满减券;2-商城购物满减券;3-商城购物折扣券;4-商城购物实物折扣券;5-商城购物实物满减券;6-商城购物充值折扣券;7-现金贷还款折扣券;8-现金贷还款抵扣券;9-现金贷还款免息券;10-白条购物满减券;11-外部白条满减券（深圳通）;12-白条外部满减券【环球黑卡】；13-白条外部免息券【环球黑卡】；14-外部白条免息券【e袋洗】；15-外部白条满减券【e袋洗】；16-外部白条免息券【武汉一卡通】;17-外部白条满减券【武汉一卡通】；18-白条外部免息券【深圳通】；19-白条外部免息券【友宝】；20-白条外部免息券【新氧】；21-外部白条满减券【新氧】；22-白条外部满减券【全部渠道】；23-白条外部免息券【全部渠道】[m
 [m
 HOSTNAME="$ip"   #数据库信息[m
 PORT="3306"[m
[36m@@ -13,7 +13,8 @@[m [mDBNAME="redpacket"    #数据库名称[m
 TABLENAME="tb-coupon"[m
 [m
 date="`date +%Y%m%d%H%M%S`"[m
[31m-[m
[32m+[m[32mdate_now=`date +"%Y-%m-%d %T"`[m
[32m+[m[32mecho $date_now[m
 [m
 len=`echo $phone_no|awk '{print length($0)}'`[m
 if [ $len -ne 11 ];then[m
[36m@@ -154,7 +155,167 @@[m [melse[m
 	echo "深圳通白条购物券满减券增加失败！！1"[m
 fi[m
 ;;[m
[32m+[m
[32m+[m[32m12)coupon_12="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO2017120115315499231decb56',$date), '$phone_no', 10000625, '白条外部满减券【环球黑卡】', 9, '{\"firstChannel\":6}', 1, '{\"full\":\"300\",\"cut\":\"10\"}', NOW(), '2028-01-20 00:00:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_12}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "白条外部满减券【环球黑卡】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "白条外部满减券【环球黑卡】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m13)[m
[32m+[m[32mcoupon_13="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO20171201151342841868ebe8',$date), '$phone_no', 10000626, '白条外部免息券【环球黑卡】', 9, '{\"firstChannel\":6}', 5, '{\"discount\":80,\"priceRange\":\"10-5000\",\"terms\":{\"1\":[1],\"3\":[1,2,3],\"6\":[1,2,3,4,5,6]}}', NOW(), '2029-11-01 23:59:00', 0, 2,  NOW(), NULL, NOW(), NULL, 1002150);[m
[32m+[m[32m"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_13}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "白条外部免息券【环球黑卡】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "白条外部免息券【环球黑卡】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m14)[m
[32m+[m[32mcoupon_14="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO201712011540111686168c8d4',$date), '$phone_no', 10000628, '外部白条免息券【e袋洗】', 9, '{\"firstChannel\":7}', 5, '{\"discount\":50,\"priceRange\":\"10-5000\",\"terms\":{\"1\":[1],\"3\":[1,2,3],\"6\":[1,2,3,4,5,6]}}', NOW(), '2019-11-01 23:59:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_14}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "外部白条免息券【e袋洗】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "外部白条免息券【e袋洗】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m15)[m
[32m+[m[32mcoupon_15="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO20171201154018003c5cdb50c',$date), '$phone_no', 10000627, '外部白条满减券【e袋洗】', 9, '{\"firstChannel\":7}', 1, '{\"full\":\"20\",\"cut\":\"10\"}', NOW(), '2029-11-01 23:59:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_15}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "外部白条满减券【e袋洗】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "外部白条满减券【e袋洗】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m16)[m
[32m+[m[32mcoupon_16="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO2017120115404289280bc0f11',$date), '$phone_no', 10000622, '外部白条免息券【武汉一卡通】', 9, '{\"firstChannel\":4}', 5, '{\"discount\":3,\"priceRange\":\"10-1000\",\"terms\":{\"1\":[1],\"3\":[1,2,3],\"6\":[1,2,3,4,5,6]}}', NOW(), '2019-11-01 23:59:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_16}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "外部白条免息券【武汉一卡通】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "外部白条免息券【武汉一卡通】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m17)[m
[32m+[m[32mcoupon_17="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO2017120115404810701a78979',$date), '$phone_no', 10000621, '外部白条满减券【武汉一卡通】', 9, '{\"firstChannel\":4}', 1, '{\"full\":500,\"cut\":50}', NOW(), '2019-11-01 23:59:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);[m
[32m+[m
[32m+[m[32m"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_17}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "外部白条满减券【武汉一卡通】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "外部白条满减券【武汉一卡通】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m18)[m
[32m+[m[32mcoupon_18="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO20171201154341628a620cb4',$date), '$phone_no', 10000632, '白条外部免息券【深圳通】', 9, '{\"firstChannel\":3}', 5, '{\"discount\":50,\"priceRange\":\"10-5000\",\"terms\":{\"1\":[1],\"3\":[1,2,3],\"6\":[1,2,3,4,5,6]}}', NOW(), '2019-11-01 23:59:00', 0, 3, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_18}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m[41m  [m
[32m+[m[32m        echo "白条外部免息券【深圳通】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "白条外部免息券【深圳通】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m19)[m
[32m+[m[32mcoupon_19="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO20171201154334993355afb19',$date), '$phone_no', 10000631, '白条外部免息券【友宝】', 9, '{\"firstChannel\":2}', 5, '{\"discount\":20,\"priceRange\":\"10-1000\",\"terms\":{\"1\":[1],\"3\":[1,2,3],\"6\":[1,2,3,4,5,6]}}', NOW(), '2019-11-01 23:59:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_19}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "白条外部免息券【友宝】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "白条外部免息券【友宝】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m20)[m
[32m+[m[32mcoupon_20="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO2017120115402614693f5f8ab',$date), '$phone_no', 10000624, '白条外部免息券【新氧】', 9, '{\"firstChannel\":5}', 5, '{\"discount\":10,\"priceRange\":\"10-1000\",\"terms\":{\"1\":[1],\"3\":[1,2,3],\"6\":[1,2,3,4,5,6]}}', NOW(), '2028-01-06 00:00:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_20}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "白条外部免息券【新氧】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "白条外部免息券【新氧】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m21)[m
[32m+[m[32mcoupon_21="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO20171201154036703398cb9fe',$date), '$phone_no', 10000623, '外部白条满减券【新氧】', 9, '{\"firstChannel\":5}', 1, '{\"full\":\"100\",\"cut\":\"10\"}', NOW(), '2026-01-06 00:00:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_21}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "外部白条满减券【新氧】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "外部白条满减券【新氧】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m22)[m
[32m+[m[32mcoupon_22="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO201712011537207501ce2f54f',$date), '$phone_no', 10000630, '白条外部满减券【全部渠道】', 9, '{\"firstChannel\":1}', 1, '{\"full\":\"500\",\"cut\":\"30\"}', NOW(), '2019-11-01 23:59:00', 0, 2, NOW(), NULL, NOW(), NULL, 1002150);[m
[32m+[m[32m"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_22}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "白条外部满减券【全部渠道】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "白条外部满减券【全部渠道】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
[32m+[m[32m23)[m
[32m+[m[32mcoupon_23="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[32m+[m[32mVALUES[m
[32m+[m	[32m(concat('OUT_BAITIAO20171201153729670ae48cb40',$date), '$phone_no', 10000629, '白条外部免息券【全部渠道】', 9, '{\"firstChannel\":1}', 5, '{\"discount\":50,\"priceRange\":\"10-5000\",\"terms\":{\"1\":[1],\"3\":[1,2,3],\"6\":[1,2,3,4,5,6]}}', NOW(), '2019-11-01 23:59:00', 0, 3, NOW(), NULL, NOW(), NULL, 1002150);"[m
[32m+[m[32mmysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_23}"[m
[32m+[m[32mreturn=$?[m
[32m+[m[32mif [ "$return" = "0" ];then[m
[32m+[m[32m        echo "白条外部免息券【全部渠道】新增成功！！！"[m
[32m+[m[32melse[m
[32m+[m[32m        echo "白条外部免息券【全部渠道】新增失败！！！"[m
[32m+[m[32mfi[m
[32m+[m[32m;;[m
[32m+[m
 *)[m
[31m-echo "优惠券类型请输入1~11"[m
[32m+[m[32mecho "优惠券类型请输入1~23"[m
 ;;[m
 esac[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/spidercenter_authorization_new.sh b/qa_shell_script/script_by_Contorller/spidercenter_authorization_new.sh[m
[1mindex ecb3a4a..5d69aa5 100755[m
[1m--- a/qa_shell_script/script_by_Contorller/spidercenter_authorization_new.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/spidercenter_authorization_new.sh[m
[36m@@ -37,7 +37,7 @@[m [mfunction authorization()[m
 		mysql $mysqld ${DBNAME} -e "${insert_sql00}"[m
 		mysql $mysqld ${DBNAME} -e "${insert_sql03}"[m
 		[m
[31m-		curl "http://${ip}:7021/ex/quartz/notity_generate_report_new"[m
[32m+[m		[32mcurl -s "http://${ip}:7021/ex/quartz/notity_generate_report_new"[m
 		[m
 		echo "done!!! $date"[m
 	fi[m
[1mdiff --git a/qa_shell_script/sub_shell.sh b/qa_shell_script/sub_shell.sh[m
[1mindex ae32a58..e258bc4 100755[m
[1m--- a/qa_shell_script/sub_shell.sh[m
[1m+++ b/qa_shell_script/sub_shell.sh[m
[36m@@ -24,7 +24,7 @@[m [mips=`cat $config_server/get_env_ip.sh`[m
 counts=`echo $ips | awk '{print NF}'`[m
 [m
 mkdir -p /home/sub_config_file_dont_rm[m
[31m-multis=`node $config_server/get_project_config.js  -type multi -attr port`[m
[32m+[m[32mmultis=`node $config_server/get_project_config.js  -type multi -attr port -attr2 true`[m
 [m
 trap "exec 1000>&-;exec 1000<&-;exit 0" 2[m
 tempfifo=$$.fifo[m

[33mcommit b23d124eb0c865c9e17db0f18270eb302cad047c[m
Merge: 331daff 54c47c9
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Sun Dec 17 13:44:47 2017 +0800

    Merge branch 'master' of http://git.quantgroup.cn/QA/qa-deploy-utils

[33mcommit 331daff7d58f3f75252deccdcd281f8cedf9deaa[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Sun Dec 17 13:44:36 2017 +0800

    up

[1mdiff --git a/qa_shell_script/6_start_by_name.sh b/qa_shell_script/6_start_by_name.sh[m
[1mdeleted file mode 100755[m
[1mindex 3effc2e..0000000[m
[1m--- a/qa_shell_script/6_start_by_name.sh[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-project_name=$1[m
[31m-pwd_path="/home/qa-deploy-utils/qa_shell_script"[m
[31m-config_shell_path="$pwd_path"[m
[31m-config_server="$pwd_path/config_server"[m
[31m-project_type=`node $config_server/get_project_config.js  -name $project_name -attr type`[m
[31m-project_path=`cat $config_server/project_path.sh`[m
[31m-config_path=`cat $config_server/config_path.sh`[m
[31m-node4_path=`cat $config_server/node_4_path.sh`[m
[31m-node7_path=`cat $config_server/node_7_path.sh`[m
[31m-profile=test[m
[31m-time=`date +%Y_%m_%d_%H_%M_%S`[m
[31m-[m
[31m-function restartJavaProject()[m
[31m-{[m
[31m-	max_wait_log_generate_time=50[m
[31m-	max_wait_ack_time=500[m
[31m-	ack_phrase="JVM\ running\ for"[m
[31m-	project=$1[m
[31m-	desc=`node $config_server/get_project_config.js  -name $project -attr desc`[m
[31m-	sh $config_server/show_info.sh $project 重新启动 $desc[m
[31m-	cd $project_path/$project[m
[31m-	P_UUID=`ps -ef|grep ${project}.jar |grep -v 'grep'|awk '{print $2}'`[m
[31m-	if [ -n "${P_UUID}" ];then[m
[31m-		echo "-----KILL $project PPID=${P_UUID}"[m
[31m-		echo `kill -9 ${P_UUID}`[m
[31m-		sleep 2s[m
[31m-	fi[m
[31m-		[m
[31m-	echo "-----project:$project while be run command: java -Xmx256m -XX:PermSize64m -Xloggc:/tmp/${project}.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -jar ${project}.jar --worker 1 --currentWorker 1 -t > /dev/null 2>&1 &"[m
[31m-	log_name=`node $config_server/get_project_config.js  -name $project -attr log_name`[m
[31m-	[m
[31m-	mv $project_path/logs/$log_name $project_path/logs/logs_back/$project-$time.log[m
[31m-	[m
[31m-	if [[ $project == "redpacket" ]]; then[m
[31m-		echo `java -Xmx512m -XX:PermSize64m -Xloggc:/tmp/${project}.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -jar ${project}.jar --worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &`[m
[31m-	else[m
[31m-		echo `java -Xmx512m -XX:PermSize64m -Xloggc:/tmp/${project}.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -jar ${project}.jar --worker 1 --currentWorker 1 -t > /dev/null 2>&1 &`[m
[31m-	fi[m
[31m-	[m
[31m-	#sleep 30s[m
[31m-	ack "$ack_phrase" $project_path/logs/$log_name ${max_wait_log_generate_time} ${max_wait_ack_time}[m
[31m-}[m
[31m-[m
[31m-function restartNodeProject()[m
[31m-{[m
[31m-	project=$1[m
[31m-	desc=`node $config_server/get_project_config.js  -name $project -attr desc`[m
[31m-	stop_command=`node $config_server/get_project_config.js  -name $project -attr command2`[m
[31m-	sh $config_server/show_info.sh $project 重新启动 $desc[m
[31m-	cd $project_path/$project[m
[31m-	$stop_command[m
[31m-	# forever stop $project[m
[31m-	# forever stop $project-www[m
[31m-	# pm2 stop $project[m
[31m-	start_command=`node $config_server/get_project_config.js  -name $project -attr command`[m
[31m-	$start_command[m
[31m-	# setup_path_temp=`find ./ -maxdepth 2 -path "./node_modules" -prune -o -type f -name "app.js" -print`[m
[31m-	# echo "------setup_path_temp:$setup_path_temp"[m
[31m-	#[m
[31m-	# echo `forever start -a -s --uid $project  ${setup_path_temp}`[m
[31m-	#[m
[31m-	# setup_path_temp_for_appbackent=`find ./ -maxdepth 2 -path "./node_modules" -prune -o -type f -name "www" -print`[m
[31m-	# if [ -n "$setup_path_temp_for_appbackent" ];then[m
[31m-	# 	echo "-----project:$project while be run command:  python $python_project_path --mode=beta --port=$port > /dev/null 2>&1 &"[m
[31m-	# 	echo `forever start -a -s --uid $project-www ${setup_path_temp_for_appbackent}`[m
[31m-	# fi[m
[31m-}[m
[31m-[m
[31m-function restartPythonProject()[m
[31m-{[m
[31m-	project=$1[m
[31m-	desc=`node $config_server/get_project_config.js  -name $project -attr desc`[m
[31m-	port=`node $config_server/get_project_config.js  -name $project -attr port`[m
[31m-	sh $config_server/show_info.sh $project 重新启动 $desc[m
[31m-	cd $project_path/$project[m
[31m-	setup_path_temp=`find ./ -name "run.py"`[m
[31m-	python_project_path=$project_path/$project${setup_path_temp/\.\//\/}[m
[31m-	[m
[31m-	P_UUID=`ps -ef|grep port=$port |grep -v 'grep'|awk '{print $2}'`[m
[31m-	if [[ "${P_UUID}" != "" ]];then[m
[31m-		echo "-----KILL $project PPID=${P_UUID}"[m
[31m-		echo `kill -9 ${P_UUID}`[m
[31m-		sleep 3[m
[31m-	fi[m
[31m-	[m
[31m-	echo "-----project:$project while be run command:  python $python_project_path --mode=beta --port=$port > /dev/null 2>&1 &"[m
[31m-	echo `python $python_project_path --mode=beta --port=$port > /dev/null 2>&1 &`[m
[31m-	[m
[31m-}[m
[31m-[m
[31m-function restartUiProject()[m
[31m-{[m
[31m-	nginx -t;  nginx -s reload[m
[31m-}[m
[31m-[m
[31m-#acknowledge whether the deploy start OK[m
[31m-function ack()[m
[31m-{[m
[31m-    ack_phrase="$1"[m
[31m-    log_path="$2"[m
[31m-    max_wait_log_generate_time="$3"[m
[31m-    max_wait_ack_time="$4"[m
[31m-    wait_log_generate_time=0[m
[31m-    wait_ack_time=0[m
[31m-    echo "begin acknowledge whether the deploy start OK, ACK_PHRASE=${ack_phrase}, log_path=${log_path}"[m
[31m-    while [ ! -f ${log_path} ][m
[31m-    do[m
[31m-        echo "wait_log_generate_time is ${wait_log_generate_time}, max_wait_log_generate_time is ${max_wait_log_generate_time} "[m
[31m-        if ((${wait_log_generate_time}>${max_wait_log_generate_time}))[m
[31m-        then[m
[31m-            echo "the log generated time exceed the limit"[m
[31m-            exit -1[m
[31m-        fi[m
[31m-        echo 'the log does not exist, wait for 5 seconds'[m
[31m-        sleep 5[m
[31m-        let "wait_log_generate_time+=5"[m
[31m-    done[m
[31m-    echo "listen for the log ack..."[m
[31m-    for ((i=0;;))[m
[31m-    do[m
[31m-        bootstrap_flag=`cat ${log_path} |grep "${ack_phrase}"| wc -l`[m
[31m-        if [ "${bootstrap_flag}" = 0 ] && [ "${max_wait_ack_time}" -gt "${wait_ack_time}" ][m
[31m-        then[m
[31m-            sleep 5[m
[31m-            let "wait_ack_time+=5"[m
[31m-            echo "waiting for bootstrap flag for ${wait_ack_time}"[m
[31m-        elif [ "${bootstrap_flag}" = 1 ][m
[31m-        then[m
[31m-            echo "server is start~"[m
[31m-            exit 0[m
[31m-        else[m
[31m-            echo "server not startup in ${max_wait_ack_time} seconds..."[m
[31m-            exit -1[m
[31m-        fi[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-ProjectType=`node $config_server/get_project_config.js  -name $project_name -attr type`[m
[31m-[m
[31m-if [ "$ProjectType" = "java" ]; then[m
[31m-	restartJavaProject $project_name[m
[31m-elif [ "$ProjectType" = "node" ]; then[m
[31m-	restartNodeProject $project_name[m
[31m-elif [ "$ProjectType" = "python" ]; then[m
[31m-	restartPythonProject $project_name[m
[31m-elif [ "$ProjectType" = "ui" ]; then[m
[31m-	restartUiProject $project_name[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/remote_excute_rabbitmq.sh b/qa_shell_script/remote_excute_rabbitmq.sh[m
[1mdeleted file mode 100755[m
[1mindex 4953552..0000000[m
[1m--- a/qa_shell_script/remote_excute_rabbitmq.sh[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-pwd_path_0="/home/qa-deploy-utils"[m
[31m-pwd_path="/home/qa-deploy-utils/qa_shell_script"[m
[31m-config_server="$pwd_path/config_server"[m
[31m-project_path=`cat $config_server/get_env_ip.sh`[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-for ip_last_num in $project_path[m
[31m-	do[m
[31m-			IP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[31m-			expect -c "[m
[31m-			set timeout 10[m
[31m-			spawn ssh root@${IP_host}[m
[31m-			expect \"]#\"[m
[31m-			send \"sh /home/qa-deploy-utils/qa_shell_script/rabbitmq/initial_mq.sh\r\"[m
[31m-			set timeout -1[m
[31m-			expect \"]#\"[m
[31m-			send \"exit\r\"[m
[31m-			expect eof;"[m
[31m-	done[m
[1mdiff --git a/qa_shell_script/remote_excute_start.sh b/qa_shell_script/remote_excute_start.sh[m
[1mindex 61c07bc..11546ac 100755[m
[1m--- a/qa_shell_script/remote_excute_start.sh[m
[1m+++ b/qa_shell_script/remote_excute_start.sh[m
[36m@@ -4,15 +4,15 @@[m [mpwd_path_0="/home/qa-deploy-utils"[m
 project_name=$1[m
 target_ip=$2[m
 for ip_last_num in $target_ip[m
[31m-	do[m
[31m-			IP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[31m-			expect -c "[m
[31m-			set timeout 10[m
[31m-			spawn ssh root@${IP_host}[m
[31m-			expect \"]#\"[m
[31m-			send \"sh /home/qa-deploy-utils/qa_shell_script/6_start_by_name.sh $project_name\r\"[m
[31m-			set timeout -1[m
[31m-			expect \"]#\"[m
[31m-			send \"exit\r\"[m
[31m-			expect eof;"[m
[31m-	done[m
[32m+[m[32mdo[m
[32m+[m	[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[32m+[m	[32mexpect -c "[m
[32m+[m	[32mset timeout 10[m
[32m+[m	[32mspawn ssh root@${IP_host}[m
[32m+[m	[32mexpect \"]#\"[m
[32m+[m	[32msend \"sh /home/qa-deploy-utils/qa_shell_script/5_restart_by_name.sh $project_name\r\"[m
[32m+[m	[32mset timeout -1[m
[32m+[m	[32mexpect \"]#\"[m
[32m+[m	[32msend \"exit\r\"[m
[32m+[m	[32mexpect eof;"[m
[32m+[m[32mdone[m

[33mcommit 54c47c9e9392a9aaba2aba01116aea4576213924[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Fri Dec 15 18:23:32 2017 +0800

    dd

[1mdiff --git a/qa_shell_script/config_server/get_project_config.js b/qa_shell_script/config_server/get_project_config.js[m
[1mindex f950f17..70787de 100755[m
[1m--- a/qa_shell_script/config_server/get_project_config.js[m
[1m+++ b/qa_shell_script/config_server/get_project_config.js[m
[36m@@ -77,13 +77,13 @@[m [mnew pClass().init(2,false,"java", "7005", "rapi", "di-ting", "QG", "di_ting.log"[m
 new pClass().init(1,true, "java", "7013", "auth", "han-gu-guan", "QG", "han-gu-guan.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "用户注册登录-V1-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true, "java", "7015", "rauth", "jian-men-guan", "QG", "jian_men_guan.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "信审服务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true,"java", "7028", "pdf", "black-hole", "QG", "black-hole.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "合同中心-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false,"java", "7006", "payapi", "gu-bei", "funding", "pay-center.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "支付中心-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7006", "payapi", "gu-bei", "funding", "pay-center.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "支付中心-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true, "java", "7023", "quartz", "xyqb-quartz", "QG", "quartz.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "定时任务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(2,true,"java", "7021", "scapi", "spider-center", "QG", "spider-center.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "授信-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true,"java", "7037", "qapi", "cash-loan-flow", "QG", "cash_loan_flow.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "现金贷流量对接-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(2,true, "java", "7012", "financial-api", "financial-system", "QG", "financial_system.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "财务系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,false, "java", "7034", "", "fund-manage", "QG", "fund_manage.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "债转系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false,"java", "7029", "gyxdapi", "gyxd", "QG", "gyxd.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "广源小贷-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7029", "gyxdapi", "gyxd", "QG", "gyxd.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "广源小贷-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true, "java", "7038", "merchantapi", "merchant-backend", "QG", "merchant.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "商户后台-server", "凌子华／陈东亮", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true,"java", "7031", "redpacket", "redpacket", "baitiao", "redpacket.log", "application.properties", "--worker 1 --currentWorker 1 -t > /dev/null 2>&1 &", null, 2, "红包系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(2,false, "java", "7044", "", "finance-api", "bo.wang", "finance-api.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "财务系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[36m@@ -98,9 +98,9 @@[m [mnew pClass().init(2,false, "java", "7063", "", "traffic-webapp", "qg-op-backend"[m
 new pClass().init(1,false, "java", "7017", "eureka.silkroad", "silk-road-eureka", "baitiao", "silk-road-eureka.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "Eureka 服务注册发现微服务", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,false, "java", "7027", "", "silk-road-caller", "baitiao", "silk-road-caller.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "MQ消息调用中心微服务", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,false, "java", "7056", "scoreapi", "score", "baitiao", "score.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "积分系统", "刑志超", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7065", "", "silk-road-backman", "baitiao", "silk-road-backman.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投-对内系统2", "张曙", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,false, "java", "7065", "", "silk-road-backman", "baitiao", "silk-road-backman.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投-对内系统2", "张曙", "mvn clean package -U -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,false, "java", "7066", "", "silk-road", "baitiao", "silk-road.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投-对外系统2", "魏巍", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[31m-new pClass().init(1,false, "java", "7059", "zt", "baitiao-zhitou", "baitiao", "baitiao-zhitou.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投-对接资金方", "张斌", "mvn clean package -Ptest -Dmaven.test.skip=true", "./xyqb-btzt-internal/target/");[m
[32m+[m[32mnew pClass().init(1,true, "java", "7059", "zt", "baitiao-zhitou", "baitiao", "baitiao-zhitou.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条直投-对接资金方", "张斌", "mvn clean package -Ptest -Dmaven.test.skip=true", "./xyqb-btzt-internal/target/");[m
 new pClass().init(2,false, "java", "7068", "", "customer_helpdesk", "data-riskcontrol", "customer_helpdesk.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "外部客服-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true, "java", "7069", "", "notify", "fund_pay", "notify.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "支付中心消息通知系统-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true, "java", "7071", "", "mall-settlement", "baitiao", "mall-settlement.log", "application-test.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "商户结算系统", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[36m@@ -115,6 +115,7 @@[m [mnew pClass().init(1,false, "java", "7087", "", "xyqb-display", "baitiao", "displ[m
 [m
 new pClass().init(1,true, "java", "7087", "schedule", "user-credit-schedule", "QG", "user_credit_schedule.log", "application.properties", " /dev/null 2>&1 &", null, 2, "用户升级-server", "","mvn clean package     -Ptest -Dmaven.test.skip=true",    "");[m
 new pClass().init(1,true,"java", "7089", "baitiao-guangdaapi", "baitiao-guangda", "baitiao", "baitiao-guangda.log", "application.properties", "--worker 1 --curr    entWorker 1 -t > /dev/null 2>&1 &", null, 2, "guangda-server", "宋志超", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7093", "", "account-center-helper", "QG", "account_center_helper.log", "application.properties", "--worker 1 --curr entWorker 1 -t > /dev/null 2>&1 &", null, 2, "历史数据处理", "高淑盈", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 [m
 // ui----[m
 new pClass().init(1,true, "ui", "7032", "op", "op-ui", "QG", null, "src/js/env.config.js", "npm run build", "node7", 1, "运营系统-ui", "", "", "");[m
[36m@@ -123,7 +124,7 @@[m [mnew pClass().init(1,true, "ui", "7011", "financial", "financial-system-ui", "QG"[m
 new pClass().init(1,true, "ui", "7030", "", "gyxd-ui", "QG", null, "src/js/env.config.js", "npm run build", "node7", 1, "广源小贷-ui", "", "");[m
 new pClass().init(1,true, "ui", "7008", "off", "offline-ui", "QG", null, "src/app/config/env.config.js", "npm run build", "node7", 1, "线下白条-ui", "", "", "");[m
 new pClass().init(1,true, "ui", "7035", "", "funding-corp-op-ui", "QG", null, "src/js/env.config.js", "npm run build", "node7", 1, "白条债转系统-ui", "", "", "");[m
[31m-new pClass().init(1,false, "ui", "7007", "pay", "paycenter-ui", "QG", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "支付中心-ui", "", "", "");[m
[32m+[m[32mnew pClass().init(1,true, "ui", "7007", "pay", "paycenter-ui", "QG", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "支付中心-ui", "", "", "");[m
 new pClass().init(1,true, "ui", "7043", "passport", "xyqb-user-ui", "head_group", null, "src/app/config.js", "npm run qa", "node7", 1, "用户注册登录-V2-ui", "", "", "");[m
 new pClass().init(1,true, "ui", "7043", "", "new-xyqb-user-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "新用户注册登录-V2-ui", "", "", "");[m
 new pClass().init(1,true, "ui", "7039", "merchant", "merchant-op-ui", "QG", null, "src/js/env.config.js", "npm run build", "node7", 1, "商户系统-ui", "", "", "");[m
[36m@@ -148,13 +149,11 @@[m [mnew pClass().init(2,true, "ui", "7077", "", "cuishou-ui-new", "data", null, "src[m
 new pClass().init(1,true, "ui", "7078", "", "ka-factory-ui", "ui", null, "src/config/env.config.js", "npm run build", "node7", 1, "KA工厂-ui", "张振武", "", "");[m
 new pClass().init(1,false, "ui", "7064", "statistics-op", "statistics-op-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "流量统计平台-ui", "刘威", "", "");[m
 new pClass().init(1,true, "ui", "7084", "", "gdxd-op-ui", "ui", null, "src/config/env.config.js", "npm run build", "node7", 1, "广达小贷后台-ui", "薛志杰", "", "");[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
 new pClass().init(1,true, "ui", "7080", "", "new-mall-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "微信商城-ui", "郑少文，周珊", "", "");[m
[32m+[m[32mnew pClass().init(2,true, "ui", "7092", "", "union-ui", "data", null, "src/Config/config.jsx", "npm run build", "node7", 1, "信用联盟-ui", "李斌", "", "");[m
[32m+[m
 // node[m
[31m-new pClass().init(1,true, "node", "7018", "sappbackend", "AppBackend", "QG", null, "config/environment/test.js", "forever start -a -s --uid AppBackend bin/www", null, 1, "APP后台服务-server", "", "forever stop AppBackend", "");[m
[32m+[m[32mnew pClass().init(1,true, "node", "7018", "sappbackend", "app-backend", "QG", null, "config/environment/test.js", "forever start -a -s --uid AppBackend bin/www", null, 1, "APP后台服务-server", "", "forever stop AppBackend", "");[m
 new pClass().init(1,true, "node", "7041", "", "activity-op", "QG", null, "src/dev.config.js", "sh start.sh", null, 1, "优惠券中心-server", "", "sh stop.sh", "");[m
 new pClass().init(1,true, "node", "7047", "opapi", "op-api", "OP", null, "src/dev.config.js", "sh start.sh", null, 1, "系统Api-Gateway-server", "", "sh stop.sh", "");[m
 new pClass().init(1,true, "node", "7049", "", "fe-api", "QG", null, "src/config.js", "sh start.sh", null, 1, "科传项目-消息推送", "", "pm2 stop fe-api", "");[m

[33mcommit 4b5aa6677b3480bcc4aac4d522c2e3bab3159d63[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Wed Dec 13 18:05:17 2017 +0800

    a

[1mdiff --git a/qa_shell_script/special_env_make/wechat_make_v2.sh b/qa_shell_script/special_env_make/wechat_make_v2.sh[m
[1mindex bc3df7b..2896278 100644[m
[1m--- a/qa_shell_script/special_env_make/wechat_make_v2.sh[m
[1m+++ b/qa_shell_script/special_env_make/wechat_make_v2.sh[m
[36m@@ -46,41 +46,3 @@[m [mexstr="${exstr}[m
  send \\\"exit\r\\\" [m
  expect eof;"[m
 expect -c "$exstr"[m
[31m-return[m
[31m-echo "step 2 重新部署环境"[m
[31m-function reBuildProject(){[m
[31m- expect -c "[m
[31m-                 set timeout 10[m
[31m-           spawn ssh root@$2[m
[31m-                 expect \"]#\"[m
[31m-                 send \"cd /home/qa-deploy-utils/qa_shell_script/\r\"[m
[31m-                 expect \"]#\"[m
[31m-                 send \"sh 3_link_config_file_by_name.sh $1\r\"[m
[31m-                 set timeout -1[m
[31m-           	 expect \"]#\"[m
[31m-           	 send \"sh 4_build_by_name.sh $1\r\"[m
[31m-		 set timeout -1[m
[31m-		 expect \"]#\"[m
[31m-		 send \"sh 5_restart_by_name.sh $1\r\"[m
[31m-		 expect \"]#\"[m
[31m-		 send \"exit\r\"[m
[31m-       	    expect eof;"[m
[31m-}[m
[31m-reBuildProject "xyqb-user-ui" "$env_ip"[m
[31m-reBuildProject "new-xyqb-user-ui" "$evn_ip"[m
[31m-reBuildProject "xyqb-user2" "$env_ip"[m
[31m-reBuildProject "xyqb" "$env_ip"[m
[31m-echo "部署结束，如果之后修改代码，部署project后，请重新执行该部署脚本，否则有可能出现测试环境配置文件被回退的可能。"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m

[33mcommit ecd268b8d3a6635df3abdee35758f9515f77a1dd[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Wed Dec 13 18:00:09 2017 +0800

    a

[1mdiff --git a/qa_shell_script/special_env_make/wechat_make_v2.sh b/qa_shell_script/special_env_make/wechat_make_v2.sh[m
[1mindex a5ef32b..bc3df7b 100644[m
[1m--- a/qa_shell_script/special_env_make/wechat_make_v2.sh[m
[1m+++ b/qa_shell_script/special_env_make/wechat_make_v2.sh[m
[36m@@ -45,8 +45,7 @@[m [mJoinStr "wechattest.xyqb.com" "$user_url" "/ui/new-xyqb-user-ui.js"[m
 exstr="${exstr}[m
  send \\\"exit\r\\\" [m
  expect eof;"[m
[31m-echo "$exstr"[m
[31m-#expect -c $exstr[m
[32m+[m[32mexpect -c "$exstr"[m
 return[m
 echo "step 2 重新部署环境"[m
 function reBuildProject(){[m

[33mcommit 6af4d9b515a1570f88676fc71ccc3f55236497e6[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Wed Dec 13 17:56:00 2017 +0800

    update

[1mdiff --git a/qa_shell_script/special_env_make/wechat_make_v2.sh b/qa_shell_script/special_env_make/wechat_make_v2.sh[m
[1mnew file mode 100644[m
[1mindex 0000000..a5ef32b[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/special_env_make/wechat_make_v2.sh[m
[36m@@ -0,0 +1,87 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32menv_ip=$1[m
[32m+[m[32mdev_appid=$2[m
[32m+[m[32mdev_secury=$3[m
[32m+[m[32muser_url=$4[m
[32m+[m[32mpay_url=$5[m
[32m+[m[32mbase_path=/home/sub_config_file_dont_rm[m
[32m+[m[32mecho "[m
[32m+[m[32menv_ip:$env_ip[m
[32m+[m[32mdev_appid:$dev_appid[m
[32m+[m[32mdev_secury:$dev_secury[m
[32m+[m[32muser_url:$user_url[m
[32m+[m[32mpay_url:$pay_url[m
[32m+[m[32m"[m
[32m+[m[32mexstr="set timeout 10[m
[32m+[m[32m spawn ssh root@192.168.4.3[m
[32m+[m[32m expect \\\"]#\\\"[m
[32m+[m[32m "[m
[32m+[m[32mfunction JoinStr(){[m
[32m+[m[32m        source_str=$1[m
[32m+[m[32m        target_str=$2[m
[32m+[m		[32mfile_name=$3[m
[32m+[m	[32mexstr="${exstr}[m
[32m+[m	[32msend \\\"sed -i \\\\\\\"s#$source_str#$target_str#g\\\\\\\"  $base_path/$env_ip$file_name\r\\\"[m
[32m+[m	[32m"[m
[32m+[m	[32mexstr="${exstr}[m
[32m+[m	[32mexpect \\\"]#\\\"[m[41m [m
[32m+[m	[32m"[m
[32m+[m	[32mexstr="${exstr}[m
[32m+[m	[32msend \\\"sed -i \\\\\\\"s#$source_str#$target_str#g\\\\\\\"  $base_path/$env_ip/public$file_name\r\\\"[m
[32m+[m	[32m"[m
[32m+[m	[32mexstr="${exstr}[m
[32m+[m	[32mexpect \\\"]#\\\"[m[41m [m
[32m+[m	[32m"[m
[32m+[m[32m}[m
[32m+[m[32mJoinStr "wechat.appid=.*" "wechat.appid=$dev_appid" "/java/xyqb-user2.properties"[m
[32m+[m[32mJoinStr "wechat.secret=.*" "wechat.secret=$dev_secury" "/java/xyqb-user2.properties"[m
[32m+[m[32mJoinStr "h5-ui.url=.*" "h5-ui.url=http://$pay_url" "/java/xyqb.properties"[m
[32m+[m[32mJoinStr "wechat.secret=.*" "wechat.secret=$dev_secury" "/java/xyqb.properties"[m
[32m+[m[32mJoinStr "weixinAppid:.*" "weixinAppid:\'$dev_appid\'," "/ui/xyqb-user-ui.js"[m
[32m+[m[32mJoinStr "wechattest.xyqb.com" "$user_url" "/ui/xyqb-user-ui.js"[m
[32m+[m[32mJoinStr "weixinAppid:.*" "weixinAppid:\'$dev_appid\'," "/ui/new-xyqb-user-ui.js"[m
[32m+[m[32mJoinStr "wechattest.xyqb.com" "$user_url" "/ui/new-xyqb-user-ui.js"[m
[32m+[m
[32m+[m[32mexstr="${exstr}[m
[32m+[m[32m send \\\"exit\r\\\"[m[41m [m
[32m+[m[32m expect eof;"[m
[32m+[m[32mecho "$exstr"[m
[32m+[m[32m#expect -c $exstr[m
[32m+[m[32mreturn[m
[32m+[m[32mecho "step 2 重新部署环境"[m
[32m+[m[32mfunction reBuildProject(){[m
[32m+[m[32m expect -c "[m
[32m+[m[32m                 set timeout 10[m
[32m+[m[32m           spawn ssh root@$2[m
[32m+[m[32m                 expect \"]#\"[m
[32m+[m[32m                 send \"cd /home/qa-deploy-utils/qa_shell_script/\r\"[m
[32m+[m[32m                 expect \"]#\"[m
[32m+[m[32m                 send \"sh 3_link_config_file_by_name.sh $1\r\"[m
[32m+[m[32m                 set timeout -1[m
[32m+[m[41m           [m	[32m expect \"]#\"[m
[32m+[m[41m           [m	[32m send \"sh 4_build_by_name.sh $1\r\"[m
[32m+[m		[32m set timeout -1[m
[32m+[m		[32m expect \"]#\"[m
[32m+[m		[32m send \"sh 5_restart_by_name.sh $1\r\"[m
[32m+[m		[32m expect \"]#\"[m
[32m+[m		[32m send \"exit\r\"[m
[32m+[m[41m       [m	[32m    expect eof;"[m
[32m+[m[32m}[m
[32m+[m[32mreBuildProject "xyqb-user-ui" "$env_ip"[m
[32m+[m[32mreBuildProject "new-xyqb-user-ui" "$evn_ip"[m
[32m+[m[32mreBuildProject "xyqb-user2" "$env_ip"[m
[32m+[m[32mreBuildProject "xyqb" "$env_ip"[m
[32m+[m[32mecho "部署结束，如果之后修改代码，部署project后，请重新执行该部署脚本，否则有可能出现测试环境配置文件被回退的可能。"[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m
[32m+[m

[33mcommit d931539d2d8b960ae968ae2acf13252143e98f70[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Tue Dec 12 14:28:58 2017 +0800

    up

[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq.sh b/qa_shell_script/rabbitmq/initial_mq.sh[m
[1mindex 8c2d30a..94258af 100755[m
[1m--- a/qa_shell_script/rabbitmq/initial_mq.sh[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq.sh[m
[36m@@ -25,7 +25,7 @@[m [mdo[m
 	IP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
 	#echo curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
 	echo curl $IP_host ...[m
[31m-	curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
[32m+[m	[32mcurl -s -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response -w "\n" "http://$IP_host:15672/api/definitions"[m
 	if [ $? != 0 ];then[m
 		echo "curl $IP_host failed"[m
 	fi[m

[33mcommit 28596af049d965c581c2dcd3ec0e70286b6f6f5a[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Mon Dec 11 18:20:21 2017 +0800

    up

[1mdiff --git a/qa_shell_script/migrate_ENV/enable_mq_plugin.sh b/qa_shell_script/migrate_ENV/enable_mq_plugin.sh[m
[1mnew file mode 100644[m
[1mindex 0000000..81a75d9[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/migrate_ENV/enable_mq_plugin.sh[m
[36m@@ -0,0 +1,5 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mcd /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.0/plugins/[m
[32m+[m[32mscp root@192.168.4.15:/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.0/plugins/rabbitmq_delayed_message_exchange-0.0.1.ez .[m
[32m+[m[32m/usr/lib/bin/rabbitmq-plugins enable rabbitmq_delayed_message_exchange[m
[32m+[m[32msh /home/qa-deploy-utils/qa_shell_script/rabbitmq/restart_mq.sh[m
\ No newline at end of file[m

[33mcommit b4a19a9cf44276f8a525f06f0a08791b5a5538a5[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Mon Dec 11 18:07:35 2017 +0800

    up

[1mdiff --git a/qa_shell_script/jenkins/post_build_script_sync_db.sh b/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[1mindex 704f01a..a9af97e 100755[m
[1m--- a/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[1m+++ b/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[36m@@ -18,33 +18,4 @@[m [mgrep_key_word "ERROR [0-9]\{4\} " 1[m
 grep_key_word "show tables failed" 3[m
 grep_key_word "EXEC_SQL_FAIELD Error [0-9]\{4\}" 1[m
 [m
[31m-# grep -B 1 "No space left on device" log[m
[31m-# if [ $? = 0 ];then[m
[31m-# 	echo ---[m
[31m-# 	exit -1[m
[31m-# fi[m
[31m-[m
[31m-# grep -B 1 "Got error: [0-9]\{4\}:" log[m
[31m-# if [ $? = 0 ];then[m
[31m-# 	echo ---[m
[31m-# 	exit -1[m
[31m-# fi[m
[31m-[m
[31m-# grep -B 1 "ERROR [0-9]\{4\} " log[m
[31m-# if [ $? = 0 ];then[m
[31m-# 	echo ---[m
[31m-# 	exit -1[m
[31m-# fi[m
[31m-[m
[31m-# grep -B 3 "show tables failed" log[m
[31m-# if [ $? = 0 ];then[m
[31m-# 	echo ---[m
[31m-# 	exit -1[m
[31m-# fi[m
[31m-[m
[31m-# grep -B 1 "EXEC_SQL_FAIELD Error 1813" log[m
[31m-# if [ $? = 0 ];then[m
[31m-# 	echo ---[m
[31m-# 	exit -1[m
[31m-# fi[m
 echo "post_build_script_sync_db finish~"[m

[33mcommit e6847a4640950095ad5cbca0df5aab677312ced9[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Mon Dec 11 16:13:38 2017 +0800

    up

[1mdiff --git a/qa_shell_script/config_server/get_project_config.js b/qa_shell_script/config_server/get_project_config.js[m
[1mindex 5897bda..f950f17 100755[m
[1m--- a/qa_shell_script/config_server/get_project_config.js[m
[1m+++ b/qa_shell_script/config_server/get_project_config.js[m
[36m@@ -67,7 +67,9 @@[m [mpClass.prototype = {[m
 	}[m
 	// --java[m
 new pClass().init(1, true,"java", "7003", "api", "xyqb", "QG", "xyqb.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "现金贷-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m
 new pClass().init(1, true,"java", "7025", "btapi", "baitiao", "baitiao", "baitiao.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "白条-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "baitiao-api/target");[m
[32m+[m
 new pClass().init(1,true,"java", "7019", "mallapi", "xyqb-mall", "QG", "mall.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "商城后台-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true, "java", "7010", "offapi", "xyqb-offline", "QG", "xyqb_offline.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "线下业务-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,true,"java", "7042", "passportapi2", "xyqb-user2", "head_group", "xyqb_user.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &", null, 2, "用户注册登录-V2-server", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[36m@@ -110,10 +112,13 @@[m [mnew pClass().init(1,true, "java", "7081", "", "wechat-config", "fund_pay", "wech[m
 new pClass().init(1,false, "java", "7082", "", "clotho", "funding", "clotho.log", "application.properties", "--worker 1 --currentWorker 1 -t -ts > /dev/null 2>&1 &",     null, 2, "资金方统计相关功能", "",     "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,false, "java", "7085", "", "mall-canal", "baitiao", "mall_canal.log", "application.properties", "-l 152 -w 2 &", null, 2, "商城订单监控", "", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
 new pClass().init(1,false, "java", "7087", "", "xyqb-display", "baitiao", "display.log", "application.properties", "&", null, 2, "信用钱包显示配置", "陈东亮", "mvn clean package -Ptest     -Dmaven.test.skip=true", "./display-api/target/");[m
[32m+[m
 new pClass().init(1,true, "java", "7087", "schedule", "user-credit-schedule", "QG", "user_credit_schedule.log", "application.properties", " /dev/null 2>&1 &", null, 2, "用户升级-server", "","mvn clean package     -Ptest -Dmaven.test.skip=true",    "");[m
[32m+[m[32mnew pClass().init(1,true,"java", "7089", "baitiao-guangdaapi", "baitiao-guangda", "baitiao", "baitiao-guangda.log", "application.properties", "--worker 1 --curr    entWorker 1 -t > /dev/null 2>&1 &", null, 2, "guangda-server", "宋志超", "mvn clean package -Ptest -Dmaven.test.skip=true", "");[m
[32m+[m
 // ui----[m
 new pClass().init(1,true, "ui", "7032", "op", "op-ui", "QG", null, "src/js/env.config.js", "npm run build", "node7", 1, "运营系统-ui", "", "", "");[m
[31m-new pClass().init(1,true, "ui", "7040", "", "activity-ui", "QG", null, "src/app/config.js", "npm run qa", "node7", 1, "活动中心-ui", "", "", "");[m
[32m+[m[32mnew pClass().init(1,true, "ui", "7040", "activity", "activity-ui", "QG", null, "src/app/config.js", "npm run qa", "node7", 1, "活动中心-ui", "", "", "");[m
 new pClass().init(1,true, "ui", "7011", "financial", "financial-system-ui", "QG", null, "src/js/env.config.js", "npm run build", "node7", 1, "财务系统-ui", "", "", "");[m
 new pClass().init(1,true, "ui", "7030", "", "gyxd-ui", "QG", null, "src/js/env.config.js", "npm run build", "node7", 1, "广源小贷-ui", "", "");[m
 new pClass().init(1,true, "ui", "7008", "off", "offline-ui", "QG", null, "src/app/config/env.config.js", "npm run build", "node7", 1, "线下白条-ui", "", "", "");[m
[36m@@ -134,7 +139,7 @@[m [mnew pClass().init(1,true, "ui", "7057", "", "xjd-ui", "QG", null, "src/app/confi[m
 new pClass().init(1,true, "ui", "7007", "", "new-paycenter-ui", "QG", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "新版支付中心-ui", "", "", "");[m
 new pClass().init(1,false, "ui", "7061", "", "wind-control-op-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "临时项目，未来删除风控平台-ui", "", "", "");[m
 new pClass().init(1,false, "ui", "7016", "", "flow-op-ui", "ui", null, "src/config/env.config.js", "npm run build", "node7", 1, "导流UI页面", "", "", "");[m
[31m-new pClass().init(1,false, "ui", "7051", "", "h5-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "h5平台业务", "李长城", "", "");[m
[32m+[m[32mnew pClass().init(1,false, "ui", "7051", "h5", "h5-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "h5平台业务", "李长城", "", "");[m
 new pClass().init(1,true, "ui", "7057", "h5.auth", "ka-spider-center-ui", "ui", null, "src/app/config/env.config.js", "npm run qa", "node7", 1, "新版授信UI", "郑少文", "", "");[m
 new pClass().init(1,true, "ui", "7067", "", "new-op-ui", "ui", null, "src/config/env.config.js", "npm run build", "node7", 1, "运营系统 vue", "孙小英", "", "");[m
 new pClass().init(1,true, "ui", "7070", "", "customer-op-ui", "ui", null, "src/config/env.config.js", "npm run build", "node7", 1, "外部查询-ui", "", "", "");[m

[33mcommit 8331b5102c2ec5566f03143afb1c4aaf4e503366[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Mon Dec 11 16:02:13 2017 +0800

    up

[1mdiff --git a/db-utils/db_replace_ip.sh b/db-utils/db_replace_ip.sh[m
[1mindex d8b6362..c23293d 100755[m
[1m--- a/db-utils/db_replace_ip.sh[m
[1m+++ b/db-utils/db_replace_ip.sh[m
[36m@@ -48,7 +48,7 @@[m [mfunction transByUrl()[m
 # }[m
 [m
 if [ $database_name = 'mall' ];then[m
[31m-	config_table='admin_banner album category_banner faster_entrance life_service'[m
[32m+[m	[32mconfig_table='admin_banner album category_banner faster_entrance life_service loan_config'[m
 	for entry in $config_table[m
 	do[m
 		sed -i "s/https\:/http\:/g" $entry.sql[m

[33mcommit 288ba23c19e2d220b65e547dc3a58502057e0e2b[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Mon Dec 11 15:56:21 2017 +0800

    update

[1mdiff --git a/db-utils/db_gen_config.sh b/db-utils/db_gen_config.sh[m
[1mindex 6722070..4eb55a7 100755[m
[1m--- a/db-utils/db_gen_config.sh[m
[1m+++ b/db-utils/db_gen_config.sh[m
[36m@@ -65,7 +65,7 @@[m [melif [[  $database_name = 'dujiangyan'  ]]; then[m
 	port='3310'[m
 elif [[  $database_name = 'mall'  ]]; then[m
 	# 白条商城[m
[31m-	sys_table_list='activity_3c_product ad_detail admin_banner advertisement_type album app_channel app_channel_ad app_name app_name_ad category_banner category_nature commodity_slogan commodity_slogan_product configuration edx_city faster_entrance faster_entrance_image goods_after_sale_config goods_after_sale_step home_config home_page hot_category jd_address jd_after_sale_config jd_brand jd_category jd_product_sku_image jd_property jd_sku jd_sku_detail_image jd_sku_specs life_faster_entrance life_service mall_category mall_config merchant nature_value new_3c_product product product_category product_nature product_nature_value_bak product_sku product_sku_image product_specification product_spu recommend_brand recommend_product sale_product_detail sale_product_theme spu_image supplier tab_navigate title_banner'[m
[32m+[m	[32msys_table_list='activity_3c_product ad_detail admin_banner advertisement_type album app_channel app_channel_ad app_name app_name_ad category_banner category_nature commodity_slogan commodity_slogan_product configuration edx_city faster_entrance faster_entrance_image goods_after_sale_config goods_after_sale_step home_config home_page hot_category jd_address jd_after_sale_config jd_brand jd_category jd_product_sku_image jd_property jd_sku jd_sku_detail_image jd_sku_specs life_faster_entrance life_service mall_category mall_config merchant nature_value new_3c_product product product_category product_nature product_nature_value_bak product_sku product_sku_image product_specification product_spu recommend_brand recommend_product sale_product_detail sale_product_theme spu_image supplier tab_navigate title_banner loan_config'[m
 	port='3310'[m
 elif [[  $database_name = 'qinqiong'  ]]; then[m
 	# qinqiong[m
[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq.sh b/qa_shell_script/rabbitmq/initial_mq.sh[m
[1mindex a8f0635..8c2d30a 100755[m
[1m--- a/qa_shell_script/rabbitmq/initial_mq.sh[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq.sh[m
[36m@@ -8,7 +8,7 @@[m [menv_ip=`cat $config_server/get_env_ip.sh`[m
 scriptname=$(basename $0)[m
 echo -e "\033[32m使用方法：sh $scriptname 14 （同步192.168.4.14环境的MQ）\033[0m"[m
 echo -e "\033[32m使用方法：sh $scriptname 192.168.4.14 （同步192.168.4.14环境的MQ）\033[0m"[m
[31m-echo -e "\033[32m使用方法：sh $scriptname （同步ip小于40环境的MQ）\033[0m"[m
[32m+[m[32mecho -e "\033[32m使用方法：sh $scriptname （同步所有环境的MQ）\033[0m"[m
 [m
 if [ -n "$1" ];then[m
 	env_ip=$1[m

[33mcommit 52d3a5b780f8c053679b14cc61feb7fae72979f3[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Mon Dec 11 15:54:03 2017 +0800

    update

[1mdiff --git a/qa_shell_script/script_by_Contorller/baitiao_dingdan.sh b/qa_shell_script/script_by_Contorller/basicscript/baitiao_dingdan.sh[m
[1msimilarity index 100%[m
[1mrename from qa_shell_script/script_by_Contorller/baitiao_dingdan.sh[m
[1mrename to qa_shell_script/script_by_Contorller/basicscript/baitiao_dingdan.sh[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/updatecarddetail.sh b/qa_shell_script/script_by_Contorller/basicscript/updatecarddetail.sh[m
[1msimilarity index 100%[m
[1mrename from qa_shell_script/script_by_Contorller/updatecarddetail.sh[m
[1mrename to qa_shell_script/script_by_Contorller/basicscript/updatecarddetail.sh[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/updatechannelforuser.sh b/qa_shell_script/script_by_Contorller/basicscript/updatechannelforuser.sh[m
[1msimilarity index 100%[m
[1mrename from qa_shell_script/script_by_Contorller/updatechannelforuser.sh[m
[1mrename to qa_shell_script/script_by_Contorller/basicscript/updatechannelforuser.sh[m

[33mcommit afa733e235fa5d38aeb6fdb0eb3d6862260ef83b[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Mon Dec 11 11:28:10 2017 +0800

    add new scr

[1mdiff --git a/qa_shell_script/script_by_Contorller/kill_mall-settlement_pid.sh b/qa_shell_script/script_by_Contorller/kill_mall-settlement_pid.sh[m
[1mindex 4c002df..9bf68cf 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/kill_mall-settlement_pid.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/kill_mall-settlement_pid.sh[m
[36m@@ -4,7 +4,7 @@[m [mPORT="3306"[m
 USERNAME="qa"[m
 PASSWORD="qatest"[m
 [m
[31m-for i in `mysql -u${USERNAME} -p${PASSWORD} -se "show processlist" | grep -v "show processlist" | grep -v "$HOSTNAME" | awk '{if($4=="mall_settlement" )print $1}'`[m
[32m+[m[32mfor i in `/home/quant_group/mysql-5.6.31/bin/mysql -u${USERNAME} -p${PASSWORD} -se "show processlist" | grep -v "show processlist" | grep -v "$HOSTNAME" | awk '{if($4=="mall_settlement" )print $1}'`[m
 do [m
     mysql -u${USERNAME} -p${PASSWORD} -e "kill $i"[m
 [m
[1mdiff --git a/qa_shell_script/script_by_Contorller/mall_alterOrderStatus.sh b/qa_shell_script/script_by_Contorller/mall_alterOrderStatus.sh[m
[1mnew file mode 100644[m
[1mindex 0000000..565c51b[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/script_by_Contorller/mall_alterOrderStatus.sh[m
[36m@@ -0,0 +1,18 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mip=$1[m
[32m+[m[32morderId=$2  #mall订单号[m
[32m+[m[32morderStatus=$3  #mall订单状态值[m
[32m+[m
[32m+[m[32mlen=`echo $orderId |awk '{print length}'`[m
[32m+[m[32mif [ -z "$len" ][m
[32m+[m[32mthen[m
[32m+[m[32m        echo "请输入订单号"[m
[32m+[m[32m        exit -1  #exit命令同于退出shell，状态值0代表执行成功，其它值代表执行失败[m
[32m+[m[32mfi[m
[32m+[m
[32m+[m[32mmysqld="-h$ip -p3306 -uqa -pqatest"[m
[32m+[m
[32m+[m[32m# 更新mall.mall_order表的订单状态[m
[32m+[m[32mmysql -N $mysqld mall -e "update mall_order set order_state='$orderStatus' where order_id='$orderId'";[m
[32m+[m
[32m+[m[32mecho "mall.mall_order表的订单状态已改"[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/mall_deliveryOrder.sh b/qa_shell_script/script_by_Contorller/mall_deliveryOrder.sh[m
[1mnew file mode 100644[m
[1mindex 0000000..7a967ec[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/script_by_Contorller/mall_deliveryOrder.sh[m
[36m@@ -0,0 +1,46 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mip=$1[m
[32m+[m[32morderId=$2  #mall订单号[m
[32m+[m
[32m+[m[32mlen=`echo $orderId |awk '{print length}'`[m
[32m+[m[32mif [ -z $len ][m
[32m+[m[32mthen[m
[32m+[m[32m        echo "请输入订单号"[m
[32m+[m[32m        exit -1  #exit命令同于退出shell，状态值0代表执行成功，其它值代表执行失败[m
[32m+[m[32mfi[m
[32m+[m
[32m+[m[32mseq=`date "+%Y-%m-%d %H:%M:%S"`[m
[32m+[m[32mmysqld="-h$ip -p3306 -uqa -pqatest"[m
[32m+[m
[32m+[m[32m# 更新mall.mall_order表的订单状态为3[m
[32m+[m[32mmysql -N $mysqld mall -e "update mall_order set order_state='3' where order_id='$orderId'";[m
[32m+[m
[32m+[m[32m# 更新mall.digital_order_detail表的物流信息[m
[32m+[m[32mmallOrderId=`mysql -N $mysqld mall -e "select id from mall_order where order_id='$orderId'"`;[m
[32m+[m[32mmysql -N $mysqld mall -e "update digital_order_detail set logistics_company='韵达',logistics_phone='18800001111',[m
[32m+[m[32mlogistics_delivery_code='1234567890',logistics_delivery_time='$seq' where order_id='$mallOrderId'";[m
[32m+[m
[32m+[m[32m# 更新merchant.supplier_order表的订单状态[m
[32m+[m[32mmysql -N $mysqld merchant -e "update supplier_order set order_status='1',updated_at='$seq' where mall_order_no='$orderId'";[m
[32m+[m
[32m+[m[32m# 更新merchant.supplier_order_status_history表的操作记录[m
[32m+[m[32msupplierOrderId=`mysql -N $mysqld merchant -e "select id from supplier_order where mall_order_no='$orderId'"`;[m
[32m+[m[32mmysql -N $mysqld merchant -e "insert into supplier_order_status_history[m[41m [m
[32m+[m[32m( supplier_order_id, status, operator, created_at, updated_at)[m[41m [m
[32m+[m[32mvalues[m[41m [m
[32m+[m[32m( '$supplierOrderId', '1', '38', '$seq', '$seq')";[m
[32m+[m
[32m+[m[32m# 更新merchant.supplier_order_logistics表的物流信息[m
[32m+[m[32morderStatusId=`mysql -N $mysqld merchant -e "select id from supplier_order_status_history where supplier_order_id='$supplierOrderId'"`;[m
[32m+[m[32mmysql -N $mysqld merchant -e "insert into supplier_order_logistics[m
[32m+[m[32m( order_id, order_status_id, mall_order_no, operator, created_at, updated_at, logistics_order_no, express_company, express_phone, delivery_at)[m[41m [m
[32m+[m[32mvalues[m
[32m+[m[32m( '$supplierOrderId', '$orderStatusId', '$orderId', '38', '$seq', '$seq',  '789211463752', '韵达', '18800001111', '$seq')";[m
[32m+[m
[32m+[m
[32m+[m[32mecho "mall.mall_order表的订单状态已改"[m
[32m+[m[32mecho "mall.digital_order_detail表的物流信息已更新"[m
[32m+[m[32mecho "merchant.supplier_order表的订单状态已更新"[m
[32m+[m[32mecho "merchant.supplier_order_status_history表的操作记录已更新"[m
[32m+[m[32mecho "merchant.supplier_order_logistics表的物流信息已更新"[m
[32m+[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/mall_makeMallOrder.sh b/qa_shell_script/script_by_Contorller/mall_makeMallOrder.sh[m
[1mnew file mode 100644[m
[1mindex 0000000..d92fb28[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/script_by_Contorller/mall_makeMallOrder.sh[m
[36m@@ -0,0 +1,60 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mip=$1[m
[32m+[m[32mphone_no=$2[m
[32m+[m[32mamount=$3[m
[32m+[m
[32m+[m[32mlen=`echo $phone_no |awk '{print length}'`[m
[32m+[m[32mif [ $len -ne 11 ][m
[32m+[m[32mthen[m
[32m+[m[32m        echo "请输入11位的手机号"[m
[32m+[m[32m        exit -1  #exit命令同于退出shell，状态值0代表执行成功，其它值代表执行失败[m
[32m+[m[32mfi[m
[32m+[m
[32m+[m[32mb=0[m
[32m+[m[32mif [ $amount -le $b ][m
[32m+[m[32mthen[m[41m [m
[32m+[m[32m  echo "请输入正确的金额"[m
[32m+[m[32m  exit -1[m
[32m+[m[32mfi[m
[32m+[m
[32m+[m[32morderId=aektxyqbmallceshi`date +%s%N`[m
[32m+[m[32mmerchantId=merchantOrderNo`date +%s%N`[m
[32m+[m[32mdifference=50[m
[32m+[m[32msupplierAmount=`expr $amount - $difference`[m
[32m+[m[32mseq=`date "+%Y-%m-%d %H:%M:%S"`[m
[32m+[m
[32m+[m[32mmysql -h"$ip" -p"3306" -u"qa" -p"qatest" <<EOF[m
[32m+[m[32muse mall;[m
[32m+[m
[32m+[m[32minsert into mall.mall_order[m
[32m+[m[32m(order_id, user_id, order_state, is_active, product_id,  pay_approach,  pay_amount, created_at, updated_at)[m
[32m+[m[32mvalues[m
[32m+[m[32m('$orderId',(select id from mall.user where phone_no='$phone_no'),[m
[32m+[m[32m11,1,1170,0,'$amount','$seq','$seq');[m
[32m+[m
[32m+[m[32minsert into mall.digital_order_detail[m
[32m+[m[32m(order_id, pay_time, customer_service_phone, logistics_delivery_time, contact_name, contact_id_no, contact_phone,[m
[32m+[m[32mcontact_province, contact_city, contact_area, contact_street, product_id, user_ip, fillnum, group_id, supplier_id,[m
[32m+[m[32mrefunded_time, canceled_time, traded_time, confirm_time, refund_close_time, real_amount,  user_percent, merchant_percent)[m
[32m+[m[32mvalues[m
[32m+[m[32m((select id from mall.mall_order where order_id='$orderId'),'$seq','400-002-0061','$seq','张晋','632132197909064776','$phone_no',[m
[32m+[m[32m'北京市','海淀区','三环以内','丹棱街',205741,'61.50.0.0',1,'3845',13,[m
[32m+[m[32m'$seq','$seq','$seq','$seq','$seq','$amount',1.00,0.03);[m
[32m+[m
[32m+[m[32muse merchant;[m
[32m+[m
[32m+[m[32minsert into merchant.supplier_order[m
[32m+[m[32m(order_no,mall_order_no,supplier_id,mall_order_time,order_status,created_at,updated_at, goods_name,[m
[32m+[m[32mgoods_amount,supplier_amount,user_name,user_phone,user_address,user_id_no,[m
[32m+[m[32mreceive_name, real_pay_amount, payment_type)[m
[32m+[m[32mvalues[m
[32m+[m[32m( '$merchantId', '$orderId', '13', '$seq', '0', '$seq', '$seq','匡威男女帆布经典学生情侣休闲高帮常青款硫化鞋 42.5 M9613',[m
[32m+[m[32m'$amount', '$supplierAmount', '张晋', '$phone_no',"北京市\$\$\$ 海淀区\$\$\$ 三环以内\$\$\$ 123", '632132197909064776',[m
[32m+[m[32m'张晋', '$amount','0');[m
[32m+[m
[32m+[m[32mEOF[m
[32m+[m[32mecho "mall.mall_order、digital_order_detail表插入一条订单"[m
[32m+[m[32mecho "mall.supplier_order表插入一条订单"[m
[32m+[m
[32m+[m
[32m+[m

[33mcommit 42e2370ef3f3d22ac5d0992e697b066df38b5bd4[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Mon Dec 11 10:38:18 2017 +0800

    update

[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq.sh b/qa_shell_script/rabbitmq/initial_mq.sh[m
[1mindex 484a068..a8f0635 100755[m
[1m--- a/qa_shell_script/rabbitmq/initial_mq.sh[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq.sh[m
[36m@@ -3,7 +3,7 @@[m [mpwd_path_0="/home/qa-deploy-utils"[m
 pwd_path="/home/qa-deploy-utils/qa_shell_script"[m
 config_server="$pwd_path/config_server"[m
 env_ip=`cat $config_server/get_env_ip.sh`[m
[31m-env_ip='12 13 14 15 16 17 22 23 24 25 26 28'[m
[32m+[m[32m#env_ip='12 13 14 15 16 17 22 23 24 25 26 28'[m
 [m
 scriptname=$(basename $0)[m
 echo -e "\033[32m使用方法：sh $scriptname 14 （同步192.168.4.14环境的MQ）\033[0m"[m

[33mcommit e9fda99675b0ac2e34147f0b6d2d332df28cc9d9[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Sat Dec 9 16:44:36 2017 +0800

    up

[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq.sh b/qa_shell_script/rabbitmq/initial_mq.sh[m
[1mindex df5298b..484a068 100755[m
[1m--- a/qa_shell_script/rabbitmq/initial_mq.sh[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq.sh[m
[36m@@ -25,7 +25,7 @@[m [mdo[m
 	IP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
 	#echo curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
 	echo curl $IP_host ...[m
[31m-	curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
[32m+[m	[32mcurl -s -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
 	if [ $? != 0 ];then[m
 		echo "curl $IP_host failed"[m
 	fi[m

[33mcommit 1a10738b556f4d21c7874a3dc7c9edf75f793e2f[m
Merge: 89dd615 4335258
Author: qa_quantgroup <13766752@qq.com>
Date:   Sat Dec 9 16:39:56 2017 +0800

    Merge branch 'master' of http://git.quantgroup.cn/QA/qa-deploy-utils

[33mcommit 89dd6156b90709c58c69e0043a12f65176997caf[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Sat Dec 9 16:39:48 2017 +0800

    update rabbitmq

[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq.sh b/qa_shell_script/rabbitmq/initial_mq.sh[m
[1mold mode 100644[m
[1mnew mode 100755[m
[1mindex 11c05bf..df5298b[m
[1m--- a/qa_shell_script/rabbitmq/initial_mq.sh[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq.sh[m
[36m@@ -2,21 +2,31 @@[m
 pwd_path_0="/home/qa-deploy-utils"[m
 pwd_path="/home/qa-deploy-utils/qa_shell_script"[m
 config_server="$pwd_path/config_server"[m
[31m-project_path=`cat $config_server/get_env_ip.sh`[m
[32m+[m[32menv_ip=`cat $config_server/get_env_ip.sh`[m
[32m+[m[32menv_ip='12 13 14 15 16 17 22 23 24 25 26 28'[m
[32m+[m
[32m+[m[32mscriptname=$(basename $0)[m
[32m+[m[32mecho -e "\033[32m使用方法：sh $scriptname 14 （同步192.168.4.14环境的MQ）\033[0m"[m
[32m+[m[32mecho -e "\033[32m使用方法：sh $scriptname 192.168.4.14 （同步192.168.4.14环境的MQ）\033[0m"[m
[32m+[m[32mecho -e "\033[32m使用方法：sh $scriptname （同步ip小于40环境的MQ）\033[0m"[m
 [m
 if [ -n "$1" ];then[m
[31m-	project_path=$1[m
[32m+[m	[32menv_ip=$1[m
 fi[m
 [m
[31m-response=$(curl -X GET -H "Authorization: Basic cmFiYml0X2FkbWluOmFiYzEyMzQ=" "http://172.16.1.231:15672/api/definitions")[m
[32m+[m[32mresponse=$(curl -s -X GET -H "Authorization: Basic cmFiYml0X2FkbWluOmFiYzEyMzQ=" "http://172.16.1.231:15672/api/definitions")[m
[32m+[m[32mif [ $? != 0 ];then[m
[32m+[m	[32mecho curl -X GET -H "Authorization: Basic cmFiYml0X2FkbWluOmFiYzEyMzQ=" "http://172.16.1.231:15672/api/definitions" failed !!![m
[32m+[m	[32mexit -1[m
[32m+[m[32mfi[m
 [m
[31m-for ip_last_num in $project_path[m
[32m+[m[32mfor ip_last_num in $env_ip[m
 do[m
 	IP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[31m-	echo curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
[32m+[m	[32m#echo curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
[32m+[m	[32mecho curl $IP_host ...[m
 	curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
 	if [ $? != 0 ];then[m
 		echo "curl $IP_host failed"[m
[31m-		exit -1[m
 	fi[m
[31m-done[m
\ No newline at end of file[m
[32m+[m[32mdone[m
[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq_bak.sh b/qa_shell_script/rabbitmq/initial_mq_bak.sh[m
[1mindex ea42f69..20c85d2 100755[m
[1m--- a/qa_shell_script/rabbitmq/initial_mq_bak.sh[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq_bak.sh[m
[36m@@ -54,6 +54,7 @@[m [madd_vhost /user_register[m
 add_vhost notify[m
 add_vhost SILKROAD[m
 add_vhost bt_data_visualization[m
[32m+[m[32madd_vhost /trade_account[m
 #add_vhost baitiao_zhitou[m
 #add exchange[m
 add_exchange /  hello-exchange  direct[m
[36m@@ -88,6 +89,7 @@[m [madd_exchange /user_register user_register_exchange direct[m
 add_exchange notify notify-control direct[m
 add_exchange /clotho clotho_exchange direct[m
 add_exchange bt_data_visualization  bt_data_visualization_exchange direct[m
[32m+[m[32madd_exchange /trade_account trade_account_exchange direct[m
 #add_exchange baitiao_zhitou btzt_orderStatus_exc direct[m
 #add_exchange baitiao_zhitou btzt_repay_rewrite_exc direct[m
 #add_exchange baitiao_zhitou btzt_sendfund_exc direct[m
[36m@@ -134,7 +136,7 @@[m [madd_queues mall deliver[m
 add_queues mall mallOrder[m
 add_queues mall refund[m
 add_queues mall refundFeed[m
[31m-add_queues msg_center_op notify_task 'arguments={"durable":true, "x-message-ttl":2592000000}'[m
[32m+[m[32madd_queues msg_center_op notify_task 'arguments={"x-message-ttl":2592000000}'[m
 add_queues mall appbackend_refresh 'arguments={"x-message-ttl":120000}'[m
 add_queues mall h5_refresh 'arguments={"x-message-ttl":120000}'[m
 add_queues mall refundFailedQueue[m
[36m@@ -176,6 +178,7 @@[m [madd_queues /user_register user_register_queue[m
 add_queues notify notify[m
 add_queues /clotho clotho_notify_record[m
 add_queues bt_data_visualization bt_data_visualization_queue[m
[32m+[m[32madd_queues /trade_account trade_account_queue[m
 #add_queues baitiao_zhitou btzt_orderStatus_queue[m
 #add_queues baitiao_zhitou btzt_repay_rewrite_queue[m
 #add_queues baitiao_zhitou btzt_sendfund_queue[m
[36m@@ -213,6 +216,7 @@[m [madd_binding /loan_order loan_repay_status repay_status_urge repayment_status[m
 add_binding /loan_order loan_repay_status push_urge push_urge[m
 add_binding notify notify-control notify notify[m
 add_binding bt_data_visualization  bt_data_visualization_exchange  bt_data_visualization_queue  bt_data_visualization_queue[m
[32m+[m[32madd_binding /trade_account trade_account_exchange trade_account_queue tradeAccount-routing-key[m
 #add_binding baitiao_zhitou btzt_repay_rewrite_exc order_approval_query_queue btzt_repay_rewrite_route[m
 #add_binding baitiao_zhitou order_approval_query_exchange  order_approval_query_queue order_approval_query_routing[m
 #add_binding baitiao_zhitou delay_order_approval_query_exchange delay_order_approval_query_queue delay_order_approval_query_routing[m
[1mdiff --git a/qa_shell_script/rabbitmq/restart_mq.sh b/qa_shell_script/rabbitmq/restart_mq.sh[m
[1mindex c67e470..88dcf62 100755[m
[1m--- a/qa_shell_script/rabbitmq/restart_mq.sh[m
[1m+++ b/qa_shell_script/rabbitmq/restart_mq.sh[m
[36m@@ -1,4 +1,4 @@[m
 #/bin/bash[m
 /usr/lib/rabbitmq/bin/rabbitmqctl stop[m
[31m-sleep 10[m
[32m+[m[32msleep 2[m
 /usr/lib/rabbitmq/bin/rabbitmq-server -detached[m

[33mcommit 433525827a6479cac2302f473e5055e0202cd8ca[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Sat Dec 9 14:43:46 2017 +0800

    update

[1mdiff --git a/db-utils/db_schema_sync.sh b/db-utils/db_schema_sync.sh[m
[1mindex a7e5cd3..cb72794 100755[m
[1m--- a/db-utils/db_schema_sync.sh[m
[1m+++ b/db-utils/db_schema_sync.sh[m
[36m@@ -64,7 +64,8 @@[m [mfunction db_schema_sync()[m
 	db_backup_sub_folders=$db_backup_folder/${uuid}[m
 	[m
 	echo "mkdir $db_backup_sub_folders"[m
[31m-	mkdir $db_backup_sub_folders[m
[32m+[m	[32mmkdir -p $db_backup_sub_folders[m
[32m+[m	[32mmkdir -p $sync_config_folder[m
 	[m
 	echo "--- Step 1: generate_config_file: $config_file_name ---"[m
 	echo "source infos: $source_db_host $source_db_user"[m
[36m@@ -85,7 +86,7 @@[m [mfunction db_schema_sync()[m
 	else[m
 		echo "--- Skip step 2: replace domain name in tables: $database $db_backup_sub_folders ---"[m
 	fi[m
[31m-	[m
[32m+[m
 	echo "--- Step 3: import basic data from backup file: $database $db_backup_sub_folders ---"[m
 	sh $work_dir/db_import.sh $database $target_db_host $db_backup_sub_folders $delete_business_data[m
 	[m

[33mcommit f17885427218b05a5cdf584ab1ebccaa579fd338[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Fri Dec 8 18:25:05 2017 +0800

    up

[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq.sh b/qa_shell_script/rabbitmq/initial_mq.sh[m
[1mindex 5368942..11c05bf 100644[m
[1m--- a/qa_shell_script/rabbitmq/initial_mq.sh[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq.sh[m
[36m@@ -13,5 +13,10 @@[m [mresponse=$(curl -X GET -H "Authorization: Basic cmFiYml0X2FkbWluOmFiYzEyMzQ=" "h[m
 for ip_last_num in $project_path[m
 do[m
 	IP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[32m+[m	[32mecho curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
 	curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
[32m+[m	[32mif [ $? != 0 ];then[m
[32m+[m		[32mecho "curl $IP_host failed"[m
[32m+[m		[32mexit -1[m
[32m+[m	[32mfi[m
 done[m
\ No newline at end of file[m

[33mcommit e013df4b48dcab349fd0eed6083cff22adbaa3c0[m
Merge: 494a3ea 1deb81a
Author: qa_quantgroup <13766752@qq.com>
Date:   Fri Dec 8 17:32:55 2017 +0800

    Merge branch 'master' of http://git.quantgroup.cn/QA/qa-deploy-utils

[33mcommit 494a3ea88ee1b0565245079c439ea45c61c0f99c[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Fri Dec 8 17:32:46 2017 +0800

    update

[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm[m
[1mnew file mode 100755[m
[1mindex 0000000..b005593[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.o[m
[1mnew file mode 100644[m
[1mindex 0000000..abd56b0[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_arch.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_arch.h[m
[1mnew file mode 100644[m
[1mindex 0000000..e33d872[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_arch.h[m
[36m@@ -0,0 +1,7494 @@[m
[32m+[m[32m/*[m
[32m+[m[32m** This file has been pre-processed with DynASM.[m
[32m+[m[32m** http://luajit.org/dynasm.html[m
[32m+[m[32m** DynASM version 1.4.0, DynASM x64 version 1.4.0[m
[32m+[m[32m** DO NOT EDIT! The original file is in "vm_x86.dasc".[m
[32m+[m[32m*/[m
[32m+[m
[32m+[m[32m#line 1 "vm_x86.dasc"[m
[32m+[m[32m//|// Low-level VM code for x86 CPUs.[m
[32m+[m[32m//|// Bytecode interpreter, fast functions and helper functions.[m
[32m+[m[32m//|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[32m+[m[32m//|[m
[32m+[m[32m//|.if P64[m
[32m+[m[32m//|.arch x64[m
[32m+[m[32m#if DASM_VERSION != 10400[m
[32m+[m[32m#error "Version mismatch between DynASM and included encoding engine"[m
[32m+[m[32m#endif[m
[32m+[m[32m#line 7 "vm_x86.dasc"[m
[32m+[m[32m//|.else[m
[32m+[m[32m//|.arch x86[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|.section code_op, code_sub[m
[32m+[m[32m#define DASM_SECTION_CODE_OP	0[m
[32m+[m[32m#define DASM_SECTION_CODE_SUB	1[m
[32m+[m[32m#define DASM_MAXSECTION		2[m
[32m+[m[32m#line 11 "vm_x86.dasc"[m
[32m+[m[32m//|[m
[32m+[m[32m//|.actionlist build_actionlist[m
[32m+[m[32mstatic const unsigned char build_actionlist[13978] = {[m
[32m+[m[32m  254,1,248,10,252,247,195,237,15,132,244,11,131,227,252,248,41,218,72,141,[m
[32m+[m[32m  76,25,252,248,139,90,252,252,199,68,10,4,237,248,12,131,192,1,15,132,244,[m
[32m+[m[32m  13,137,68,36,4,252,247,195,237,15,132,244,14,248,15,129,252,243,239,252,247,[m
[32m+[m[32m  195,237,15,133,244,10,65,199,134,233,237,131,227,252,248,41,211,252,247,219,[m
[32m+[m[32m  131,232,1,15,132,244,248,248,1,255,72,139,44,10,72,137,106,252,248,131,194,[m
[32m+[m[32m  8,131,232,1,15,133,244,1,248,2,139,108,36,24,137,157,233,248,3,139,68,36,[m
[32m+[m[32m  4,139,76,36,16,248,4,57,193,15,133,244,252,248,5,131,252,234,8,137,149,233,[m
[32m+[m[32m  248,16,72,139,76,36,32,72,137,141,233,49,192,248,17,72,131,196,40,65,94,65,[m
[32m+[m[32m  95,91,93,195,248,6,15,130,244,253,59,149,233,15,135,244,254,255,199,66,252,[m
[32m+[m[32m  252,237,131,194,8,131,192,1,252,233,244,4,248,7,133,201,15,132,244,5,41,193,[m
[32m+[m[32m  141,20,202,252,233,244,5,248,8,137,149,233,137,68,36,4,137,206,137,252,239,[m
[32m+[m[32m  232,251,1,0,139,149,233,252,233,244,3,248,13,176,235,252,233,244,18,248,19,[m
[32m+[m[32m  137,252,240,72,137,252,252,248,18,255,139,108,36,24,139,173,233,199,133,233,[m
[32m+[m[32m  237,252,233,244,17,248,20,139,124,36,24,137,198,72,131,196,40,65,94,65,95,[m
[32m+[m[32m  91,93,252,233,251,1,1,248,21,72,129,231,239,72,137,252,252,248,22,139,108,[m
[32m+[m[32m  36,24,72,199,193,252,248,252,255,252,255,252,255,184,237,139,149,233,68,139,[m
[32m+[m[32m  181,233,65,129,198,239,139,90,252,252,199,66,252,252,237,65,199,134,233,237,[m
[32m+[m[32m  252,233,244,12,248,23,255,190,237,252,233,244,248,248,24,131,232,8,252,233,[m
[32m+[m[32m  244,247,248,25,141,68,194,252,248,248,1,15,182,139,233,131,195,4,137,149,[m
[32m+[m[32m  233,137,133,233,137,92,36,28,137,206,248,2,137,252,239,232,251,1,0,139,149,[m
[32m+[m[32m  233,139,133,233,139,106,252,248,41,208,193,232,3,131,192,1,139,157,233,139,[m
[32m+[m[32m  11,15,182,252,233,15,182,205,131,195,4,65,252,255,36,252,238,248,26,85,83,[m
[32m+[m[32m  65,87,65,86,72,131,252,236,40,137,252,253,137,124,36,24,137,252,241,187,237,[m
[32m+[m[32m  49,192,76,141,188,253,36,233,68,139,181,233,255,65,129,198,239,137,68,36,[m
[32m+[m[32m  28,72,137,68,36,32,137,68,36,16,137,68,36,20,76,137,189,233,56,133,233,15,[m
[32m+[m[32m  132,244,248,65,137,174,233,65,199,134,233,237,136,133,233,139,149,233,139,[m
[32m+[m[32m  133,233,41,200,193,232,3,131,192,1,41,209,139,90,252,252,137,68,36,4,252,[m
[32m+[m[32m  247,195,237,15,132,244,14,252,233,244,15,248,27,85,83,65,87,65,86,72,131,[m
[32m+[m[32m  252,236,40,187,237,137,76,36,20,252,233,244,247,248,28,255,85,83,65,87,65,[m
[32m+[m[32m  86,72,131,252,236,40,187,237,248,1,137,84,36,16,137,252,253,137,124,36,24,[m
[32m+[m[32m  137,252,241,68,139,181,233,76,139,189,233,76,137,124,36,32,137,108,36,28,[m
[32m+[m[32m  65,129,198,239,72,137,165,233,248,2,65,137,174,233,65,199,134,233,237,139,[m
[32m+[m[32m  149,233,1,203,41,211,139,133,233,41,200,193,232,3,131,192,1,248,29,139,105,[m
[32m+[m[32m  252,248,129,121,253,252,252,239,15,133,244,30,248,31,137,202,137,90,252,252,[m
[32m+[m[32m  139,157,233,139,11,15,182,252,233,15,182,205,131,195,4,65,252,255,36,252,[m
[32m+[m[32m  238,248,32,255,85,83,65,87,65,86,72,131,252,236,40,137,252,253,137,124,36,[m
[32m+[m[32m  24,137,108,36,28,68,139,189,233,68,43,189,233,68,139,181,233,199,68,36,20,[m
[32m+[m[32m  0,0,0,0,68,137,124,36,16,65,129,198,239,76,139,189,233,76,137,124,36,32,72,[m
[32m+[m[32m  137,165,233,65,137,174,233,252,255,209,133,192,15,132,244,16,137,193,187,[m
[32m+[m[32m  237,252,233,244,2,248,11,1,209,131,227,252,248,137,213,41,218,199,68,193,[m
[32m+[m[32m  252,252,237,137,200,139,93,252,244,72,99,77,252,240,131,252,249,1,15,134,[m
[32m+[m[32m  244,247,76,141,61,245,76,1,252,249,68,139,122,252,248,69,139,191,233,255,[m
[32m+[m[32m  69,139,191,233,252,255,225,248,1,15,132,244,33,41,213,193,252,237,3,141,69,[m
[32m+[m[32m  252,255,252,233,244,34,248,35,15,182,75,252,255,131,252,237,16,141,12,202,[m
[32m+[m[32m  41,252,233,15,132,244,36,252,247,217,193,252,233,3,139,124,36,24,137,151,[m
[32m+[m[32m  233,137,202,72,139,8,72,137,77,0,137,252,238,252,233,244,37,248,38,137,4,[m
[32m+[m[32m  36,199,68,36,4,237,72,141,4,36,128,123,252,252,235,15,133,244,247,65,141,[m
[32m+[m[32m  142,233,137,41,199,65,4,237,255,137,205,252,233,244,248,248,39,15,182,67,[m
[32m+[m[32m  252,254,252,242,15,42,192,252,242,15,17,4,36,72,141,4,36,252,233,244,247,[m
[32m+[m[32m  248,40,15,182,67,252,254,141,4,194,248,1,15,182,107,252,255,141,44,252,234,[m
[32m+[m[32m  248,2,139,124,36,24,137,151,233,137,252,238,72,137,194,137,252,253,137,92,[m
[32m+[m[32m  36,28,232,251,1,2,139,149,233,133,192,15,132,244,249,248,36,15,182,75,252,[m
[32m+[m[32m  253,72,139,40,72,137,44,202,139,3,15,182,204,15,182,232,131,195,4,193,232,[m
[32m+[m[32m  16,65,252,255,36,252,238,248,3,139,141,233,137,89,252,244,141,153,233,41,[m
[32m+[m[32m  211,139,105,252,248,184,237,252,233,244,31,248,41,255,137,252,239,137,213,[m
[32m+[m[32m  137,198,232,251,1,3,15,182,75,252,253,137,252,234,133,192,15,133,244,42,199,[m
[32m+[m[32m  68,202,4,237,252,233,244,43,248,44,137,4,36,199,68,36,4,237,72,141,4,36,128,[m
[32m+[m[32m  123,252,252,235,15,133,244,247,65,141,142,233,137,41,199,65,4,237,137,205,[m
[32m+[m[32m  252,233,244,248,248,45,15,182,67,252,254,252,242,15,42,192,252,242,15,17,[m
[32m+[m[32m  4,36,72,141,4,36,252,233,244,247,248,46,15,182,67,252,254,141,4,194,248,1,[m
[32m+[m[32m  255,15,182,107,252,255,141,44,252,234,248,2,139,124,36,24,137,151,233,137,[m
[32m+[m[32m  252,238,72,137,194,137,252,253,137,92,36,28,232,251,1,4,139,149,233,133,192,[m
[32m+[m[32m  15,132,244,249,15,182,75,252,253,72,139,44,202,72,137,40,248,47,139,3,15,[m
[32m+[m[32m  182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,139,141,[m
[32m+[m[32m  233,137,89,252,244,15,182,67,252,253,72,139,44,194,72,137,105,16,141,153,[m
[32m+[m[32m  233,41,211,139,105,252,248,184,237,252,233,244,31,248,48,139,124,36,24,137,[m
[32m+[m[32m  252,238,137,151,233,137,213,137,194,137,92,36,28,232,251,1,5,15,182,75,252,[m
[32m+[m[32m  253,137,252,234,252,233,244,49,248,50,139,108,36,24,137,149,233,141,52,202,[m
[32m+[m[32m  141,20,194,137,252,239,15,182,75,252,252,137,92,36,28,232,251,1,6,248,3,255,[m
[32m+[m[32m  139,149,233,131,252,248,1,15,135,244,51,248,4,141,91,4,15,130,244,252,248,[m
[32m+[m[32m  5,15,183,67,252,254,141,156,253,131,233,248,6,139,3,15,182,204,15,182,232,[m
[32m+[m[32m  131,195,4,193,232,16,65,252,255,36,252,238,248,52,131,195,4,129,120,253,4,[m
[32m+[m[32m  239,15,130,244,5,252,233,244,6,248,53,129,120,253,4,239,252,233,244,4,248,[m
[32m+[m[32m  54,255,131,252,235,4,137,206,137,252,233,139,108,36,24,137,149,233,137,194,[m
[32m+[m[32m  137,252,239,137,92,36,28,232,251,1,7,252,233,244,3,248,55,131,252,235,4,139,[m
[32m+[m[32m  108,36,24,137,149,233,137,252,239,139,115,252,252,137,92,36,28,232,251,1,[m
[32m+[m[32m  8,252,233,244,3,248,56,139,108,36,24,137,149,233,137,206,15,183,83,252,254,[m
[32m+[m[32m  137,252,239,137,92,36,28,232,251,1,9,139,149,233,252,233,244,6,248,57,248,[m
[32m+[m[32m  58,65,141,4,199,252,233,244,247,248,59,248,60,65,141,4,199,141,44,252,234,[m
[32m+[m[32m  149,252,233,244,248,248,61,255,141,4,194,137,197,252,233,244,248,248,62,248,[m
[32m+[m[32m  63,141,4,194,248,1,141,44,252,234,248,2,141,12,202,68,15,182,67,252,252,137,[m
[32m+[m[32m  206,137,193,139,124,36,24,137,151,233,137,252,234,137,252,253,137,92,36,28,[m
[32m+[m[32m  232,251,1,10,139,149,233,133,192,15,132,244,47,248,51,137,193,41,208,137,[m
[32m+[m[32m  89,252,244,141,152,233,184,237,252,233,244,29,248,64,139,108,36,24,137,149,[m
[32m+[m[32m  233,141,52,194,137,252,239,137,92,36,28,232,251,1,11,139,149,233,255,133,[m
[32m+[m[32m  192,15,133,244,51,15,183,67,252,254,139,60,194,252,233,244,65,255,252,233,[m
[32m+[m[32m  244,51,255,248,66,141,76,202,8,248,30,137,76,36,4,137,4,36,131,252,233,8,[m
[32m+[m[32m  139,108,36,24,137,149,233,137,206,141,20,193,137,252,239,137,92,36,28,232,[m
[32m+[m[32m  251,1,12,139,149,233,139,76,36,4,139,4,36,139,105,252,248,131,192,1,65,57,[m
[32m+[m[32m  215,15,132,244,67,137,202,137,90,252,252,139,157,233,139,11,15,182,252,233,[m
[32m+[m[32m  15,182,205,131,195,4,65,252,255,36,252,238,248,68,139,108,36,24,137,149,233,[m
[32m+[m[32m  137,206,137,252,239,137,92,36,28,232,251,1,13,139,149,233,139,67,252,252,[m
[32m+[m[32m  15,182,204,15,182,232,193,232,16,65,252,255,164,253,252,238,233,248,69,129,[m
[32m+[m[32m  252,248,239,15,130,244,70,139,106,4,129,252,253,239,15,131,244,70,139,90,[m
[32m+[m[32m  252,252,137,68,36,4,137,106,252,252,139,42,137,106,252,248,131,232,2,15,132,[m
[32m+[m[32m  244,248,255,137,209,248,1,131,193,8,72,139,41,72,137,105,252,248,131,232,[m
[32m+[m[32m  1,15,133,244,1,248,2,139,68,36,4,252,233,244,71,248,72,129,252,248,239,15,[m
[32m+[m[32m  130,244,70,139,106,4,137,252,233,193,252,249,15,131,252,249,252,254,15,132,[m
[32m+[m[32m  244,249,184,237,252,247,213,57,232,15,71,197,248,2,139,106,252,248,139,132,[m
[32m+[m[32m  253,197,233,139,90,252,252,199,66,252,252,237,137,66,252,248,252,233,244,[m
[32m+[m[32m  73,248,3,255,184,237,252,233,244,2,248,74,129,252,248,239,15,130,244,70,139,[m
[32m+[m[32m  106,4,139,90,252,252,129,252,253,239,15,133,244,252,248,1,139,42,139,173,[m
[32m+[m[32m  233,248,2,133,252,237,199,66,252,252,237,15,132,244,73,65,139,134,233,199,[m
[32m+[m[32m  66,252,252,237,137,106,252,248,139,141,233,255,35,136,233,105,201,239,3,141,[m
[32m+[m[32m  233,248,3,129,185,233,239,15,133,244,250,57,129,233,15,132,244,251,248,4,[m
[32m+[m[32m  139,137,233,133,201,15,133,244,3,252,233,244,73,248,5,139,105,4,129,252,253,[m
[32m+[m[32m  239,255,15,132,244,73,139,1,137,106,252,252,137,66,252,248,252,233,244,73,[m
[32m+[m[32m  248,6,129,252,253,239,15,132,244,1,129,252,253,239,15,135,244,254,129,252,[m
[32m+[m[32m  253,239,15,134,244,253,189,237,252,233,244,254,248,7,189,237,248,8,255,252,[m
[32m+[m[32m  247,213,65,139,172,253,174,233,252,233,244,2,248,75,129,252,248,239,15,130,[m
[32m+[m[32m  244,70,129,122,253,4,239,15,133,244,70,139,42,131,189,233,0,15,133,244,70,[m
[32m+[m[32m  129,122,253,12,239,15,133,244,70,139,66,8,137,133,233,139,90,252,252,199,[m
[32m+[m[32m  66,252,252,237,137,106,252,248,252,246,133,233,235,255,15,132,244,247,128,[m
[32m+[m[32m  165,233,235,65,139,134,233,65,137,174,233,137,133,233,248,1,252,233,244,73,[m
[32m+[m[32m  248,76,129,252,248,239,15,130,244,70,129,122,253,4,239,15,133,244,70,137,[m
[32m+[m[32m  213,139,50,141,82,8,139,124,36,24,232,251,1,14,137,252,234,72,139,40,139,[m
[32m+[m[32m  90,252,252,72,137,106,252,248,252,233,244,73,248,77,255,129,252,248,239,15,[m
[32m+[m[32m  133,244,70,129,122,253,4,239,15,131,244,70,252,242,15,16,2,252,233,244,78,[m
[32m+[m[32m  248,79,129,252,248,239,15,130,244,70,139,90,252,252,129,122,253,4,239,15,[m
[32m+[m[32m  133,244,249,139,2,248,2,199,66,252,252,237,137,66,252,248,252,233,244,73,[m
[32m+[m[32m  248,3,255,129,122,253,4,239,15,135,244,70,65,131,190,233,0,15,133,244,70,[m
[32m+[m[32m  65,139,174,233,65,59,174,233,15,130,244,247,232,244,80,248,1,139,108,36,24,[m
[32m+[m[32m  137,149,233,137,92,36,28,137,214,137,252,239,232,251,1,15,139,149,233,252,[m
[32m+[m[32m  233,244,2,248,81,129,252,248,239,255,15,130,244,70,15,132,244,248,248,1,129,[m
[32m+[m[32m  122,253,4,239,15,133,244,70,139,108,36,24,137,149,233,137,149,233,139,90,[m
[32m+[m[32m  252,252,139,50,141,82,8,137,252,239,137,92,36,28,232,251,1,16,139,149,233,[m
[32m+[m[32m  133,192,15,132,244,249,72,139,106,8,72,139,66,16,72,137,106,252,248,72,137,[m
[32m+[m[32m  2,248,82,184,237,252,233,244,83,248,2,199,66,12,237,255,252,233,244,1,248,[m
[32m+[m[32m  3,199,66,252,252,237,252,233,244,73,248,84,129,252,248,239,15,130,244,70,[m
[32m+[m[32m  139,42,129,122,253,4,239,15,133,244,70,255,131,189,233,0,15,133,244,70,255,[m
[32m+[m[32m  139,106,252,248,139,133,233,139,90,252,252,199,66,252,252,237,137,66,252,[m
[32m+[m[32m  248,199,66,12,237,184,237,252,233,244,83,248,85,129,252,248,239,15,130,244,[m
[32m+[m[32m  70,129,122,253,4,239,15,133,244,70,129,122,253,12,239,15,131,244,70,139,90,[m
[32m+[m[32m  252,252,252,242,15,16,66,8,72,189,237,237,102,72,15,110,205,252,242,15,88,[m
[32m+[m[32m  193,252,242,15,44,192,252,242,15,17,66,252,248,139,42,59,133,233,255,15,131,[m
[32m+[m[32m  244,248,193,224,3,3,133,233,248,1,129,120,253,4,239,15,132,244,86,72,139,[m
[32m+[m[32m  40,72,137,42,252,233,244,82,248,2,131,189,233,0,15,132,244,86,137,252,239,[m
[32m+[m[32m  137,213,137,198,232,251,1,3,137,252,234,133,192,15,133,244,1,248,86,184,237,[m
[32m+[m[32m  252,233,244,83,248,87,255,139,106,252,248,139,133,233,139,90,252,252,199,[m
[32m+[m[32m  66,252,252,237,137,66,252,248,15,87,192,252,242,15,17,66,8,184,237,252,233,[m
[32m+[m[32m  244,83,248,88,129,252,248,239,15,130,244,70,141,74,8,131,232,1,187,237,248,[m
[32m+[m[32m  1,65,15,182,174,233,193,252,237,235,131,229,1,1,252,235,252,233,244,29,248,[m
[32m+[m[32m  89,129,252,248,239,15,130,244,70,255,129,122,253,12,239,15,133,244,70,139,[m
[32m+[m[32m  106,4,137,106,12,199,66,4,237,139,42,139,90,8,137,106,8,137,26,141,74,16,[m
[32m+[m[32m  131,232,2,187,237,252,233,244,1,248,90,129,252,248,239,15,130,244,70,139,[m
[32m+[m[32m  42,139,90,252,252,137,92,36,28,137,44,36,129,122,253,4,239,15,133,244,70,[m
[32m+[m[32m  72,131,189,233,0,15,133,244,70,128,189,233,235,255,15,135,244,70,139,141,[m
[32m+[m[32m  233,15,132,244,247,59,141,233,15,132,244,70,248,1,141,92,193,252,240,59,157,[m
[32m+[m[32m  233,15,135,244,70,137,157,233,139,108,36,24,137,149,233,131,194,8,137,149,[m
[32m+[m[32m  233,141,108,194,232,72,41,221,57,203,15,132,244,249,248,2,72,139,4,43,72,[m
[32m+[m[32m  137,67,252,248,131,252,235,8,57,203,15,133,244,2,248,3,255,137,206,139,60,[m
[32m+[m[32m  36,232,244,26,139,108,36,24,139,28,36,139,149,233,65,137,174,233,65,199,134,[m
[32m+[m[32m  233,237,129,252,248,239,15,135,244,254,248,4,139,139,233,68,139,187,233,137,[m
[32m+[m[32m  139,233,68,137,252,251,41,203,15,132,244,252,141,4,26,193,252,235,3,59,133,[m
[32m+[m[32m  233,15,135,244,255,137,213,72,41,205,248,5,255,72,139,1,72,137,4,41,131,193,[m
[32m+[m[32m  8,68,57,252,249,15,133,244,5,248,6,141,67,2,199,66,252,252,237,248,7,139,[m
[32m+[m[32m  92,36,28,137,68,36,4,72,199,193,252,248,252,255,252,255,252,255,252,247,195,[m
[32m+[m[32m  237,15,132,244,14,252,233,244,15,248,8,199,66,252,252,237,139,139,233,131,[m
[32m+[m[32m  252,233,8,137,139,233,72,139,1,72,137,2,184,237,252,233,244,7,248,9,139,12,[m
[32m+[m[32m  36,68,137,185,233,255,137,222,137,252,239,232,251,1,0,139,28,36,139,149,233,[m
[32m+[m[32m  252,233,244,4,248,91,139,106,252,248,139,173,233,139,90,252,252,137,92,36,[m
[32m+[m[32m  28,137,44,36,72,131,189,233,0,15,133,244,70,128,189,233,235,15,135,244,70,[m
[32m+[m[32m  139,141,233,15,132,244,247,59,141,233,15,132,244,70,248,1,255,141,92,193,[m
[32m+[m[32m  252,248,59,157,233,15,135,244,70,137,157,233,139,108,36,24,137,149,233,137,[m
[32m+[m[32m  149,233,141,108,194,252,240,72,41,221,57,203,15,132,244,249,248,2,72,139,[m
[32m+[m[32m  4,43,72,137,67,252,248,131,252,235,8,57,203,15,133,244,2,248,3,137,206,139,[m
[32m+[m[32m  60,36,232,244,26,139,108,36,24,139,28,36,139,149,233,65,137,174,233,65,199,[m
[32m+[m[32m  134,233,237,129,252,248,239,255,15,135,244,254,248,4,139,139,233,68,139,187,[m
[32m+[m[32m  233,137,139,233,68,137,252,251,41,203,15,132,244,252,141,4,26,193,252,235,[m
[32m+[m[32m  3,59,133,233,15,135,244,255,137,213,72,41,205,248,5,72,139,1,72,137,4,41,[m
[32m+[m[32m  131,193,8,68,57,252,249,15,133,244,5,248,6,141,67,1,248,7,139,92,36,28,137,[m
[32m+[m[32m  68,36,4,49,201,252,247,195,237,15,132,244,14,255,252,233,244,15,248,8,137,[m
[32m+[m[32m  222,137,252,239,232,251,1,17,248,9,139,12,36,68,137,185,233,137,222,137,252,[m
[32m+[m[32m  239,232,251,1,0,139,28,36,139,149,233,252,233,244,4,248,92,139,108,36,24,[m
[32m+[m[32m  72,252,247,133,233,237,15,132,244,70,137,149,233,141,68,194,252,248,137,133,[m
[32m+[m[32m  233,49,192,72,137,133,233,176,235,136,133,233,252,233,244,17,248,93,248,94,[m
[32m+[m[32m  255,139,90,252,252,221,90,252,248,252,233,244,73,248,95,129,252,248,239,15,[m
[32m+[m[32m  130,244,70,129,122,253,4,239,15,131,244,70,252,242,15,16,2,72,184,237,237,[m
[32m+[m[32m  102,72,15,110,200,15,84,193,248,78,139,90,252,252,252,242,15,17,66,252,248,[m
[32m+[m[32m  248,73,184,237,248,83,137,68,36,4,248,71,252,247,195,237,15,133,244,253,248,[m
[32m+[m[32m  5,255,56,67,252,255,15,135,244,252,15,182,75,252,253,72,252,247,209,141,20,[m
[32m+[m[32m  202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,[m
[32m+[m[32m  248,6,199,68,194,252,244,237,131,192,1,252,233,244,5,248,7,72,199,193,252,[m
[32m+[m[32m  248,252,255,252,255,252,255,252,233,244,15,248,96,129,122,253,4,239,15,131,[m
[32m+[m[32m  244,70,252,242,15,16,2,232,244,97,252,233,244,78,248,98,129,122,253,4,239,[m
[32m+[m[32m  255,15,131,244,70,252,242,15,16,2,232,244,99,252,233,244,78,248,100,129,252,[m
[32m+[m[32m  248,239,15,130,244,70,129,122,253,4,239,15,131,244,70,252,242,15,81,2,252,[m
[32m+[m[32m  233,244,78,248,101,129,252,248,239,15,133,244,70,255,129,122,253,4,239,15,[m
[32m+[m[32m  131,244,70,252,242,15,16,2,137,213,232,251,1,18,137,252,234,252,233,244,78,[m
[32m+[m[32m  248,102,129,252,248,239,15,130,244,70,129,122,253,4,239,15,131,244,70,252,[m
[32m+[m[32m  242,15,16,2,137,213,232,251,1,19,137,252,234,252,233,244,78,248,103,129,252,[m
[32m+[m[32m  248,239,15,130,244,70,129,122,253,4,239,255,15,131,244,70,252,242,15,16,2,[m
[32m+[m[32m  137,213,232,251,1,20,137,252,234,252,233,244,78,248,104,129,252,248,239,15,[m
[32m+[m[32m  130,244,70,129,122,253,4,239,15,131,244,70,252,242,15,16,2,137,213,232,251,[m
[32m+[m[32m  1,21,137,252,234,252,233,244,78,248,105,129,252,248,239,15,130,244,70,129,[m
[32m+[m[32m  122,253,4,239,15,131,244,70,255,252,242,15,16,2,137,213,232,251,1,22,137,[m
[32m+[m[32m  252,234,252,233,244,78,248,106,129,252,248,239,15,130,244,70,129,122,253,[m
[32m+[m[32m  4,239,15,131,244,70,252,242,15,16,2,137,213,232,251,1,23,137,252,234,252,[m
[32m+[m[32m  233,244,78,248,107,129,252,248,239,15,130,244,70,129,122,253,4,239,15,131,[m
[32m+[m[32m  244,70,252,242,15,16,2,137,213,232,251,1,24,137,252,234,252,233,244,78,248,[m
[32m+[m[32m  108,255,129,252,248,239,15,130,244,70,129,122,253,4,239,15,131,244,70,252,[m
[32m+[m[32m  242,15,16,2,137,213,232,251,1,25,137,252,234,252,233,244,78,248,109,129,252,[m
[32m+[m[32m  248,239,15,130,244,70,129,122,253,4,239,15,131,244,70,252,242,15,16,2,137,[m
[32m+[m[32m  213,232,251,1,26,137,252,234,252,233,244,78,248,110,129,252,248,239,255,15,[m
[32m+[m[32m  130,244,70,129,122,253,4,239,15,131,244,70,252,242,15,16,2,137,213,232,251,[m
[32m+[m[32m  1,27,137,252,234,252,233,244,78,248,111,129,252,248,239,15,130,244,70,129,[m
[32m+[m[32m  122,253,4,239,15,131,244,70,252,242,15,16,2,137,213,232,251,1,28,137,252,[m
[32m+[m[32m  234,252,233,244,78,248,112,129,252,248,239,15,130,244,70,255,129,122,253,[m
[32m+[m[32m  4,239,15,131,244,70,252,242,15,16,2,137,213,232,251,1,29,137,252,234,252,[m
[32m+[m[32m  233,244,78,248,113,129,252,248,239,15,130,244,70,129,122,253,4,239,15,131,[m
[32m+[m[32m  244,70,129,122,253,12,239,15,131,244,70,252,242,15,16,2,252,242,15,16,74,[m
[32m+[m[32m  8,137,213,232,251,1,30,137,252,234,252,233,244,78,248,114,129,252,248,239,[m
[32m+[m[32m  255,15,130,244,70,129,122,253,4,239,15,131,244,70,129,122,253,12,239,15,131,[m
[32m+[m[32m  244,70,252,242,15,16,2,252,242,15,16,74,8,137,213,232,251,1,31,137,252,234,[m
[32m+[m[32m  252,233,244,78,248,115,129,252,248,239,15,130,244,70,129,122,253,4,239,15,[m
[32m+[m[32m  131,244,70,129,122,253,12,239,15,131,244,70,255,252,242,15,16,2,252,242,15,[m
[32m+[m[32m  16,74,8,137,213,232,251,1,32,137,252,234,252,233,244,78,248,116,129,252,248,[m
[32m+[m[32m  239,15,130,244,70,129,122,253,4,239,15,131,244,70,129,122,253,12,239,15,131,[m
[32m+[m[32m  244,70,221,66,8,221,2,217,252,253,221,217,252,233,244,94,248,117,129,252,[m
[32m+[m[32m  248,239,15,130,244,70,139,106,4,129,252,253,239,255,15,131,244,70,139,90,[m
[32m+[m[32m  252,252,139,2,137,106,252,252,137,66,252,248,209,229,129,252,253,0,0,224,[m
[32m+[m[32m  252,255,15,131,244,249,9,232,15,132,244,249,184,252,254,3,0,0,129,252,253,[m
[32m+[m[32m  0,0,32,0,15,130,244,250,248,1,193,252,237,21,41,197,252,242,15,42,197,139,[m
[32m+[m[32m  106,252,252,129,229,252,255,252,255,15,128,129,205,0,0,224,63,137,106,252,[m
[32m+[m[32m  252,248,2,252,242,15,17,2,184,237,252,233,244,83,248,3,15,87,192,252,233,[m
[32m+[m[32m  244,2,248,4,252,242,15,16,2,72,189,237,237,255,102,72,15,110,205,252,242,[m
[32m+[m[32m  15,89,193,252,242,15,17,66,252,248,139,106,252,252,184,52,4,0,0,209,229,252,[m
[32m+[m[32m  233,244,1,248,118,129,252,248,239,15,130,244,70,129,122,253,4,239,15,131,[m
[32m+[m[32m  244,70,252,242,15,16,2,139,106,4,139,90,252,252,209,229,129,252,253,0,0,224,[m
[32m+[m[32m  252,255,15,132,244,250,15,40,224,232,244,119,252,242,15,92,224,248,1,252,[m
[32m+[m[32m  242,15,17,66,252,248,252,242,15,17,34,139,66,252,252,139,106,4,49,232,15,[m
[32m+[m[32m  136,244,249,248,2,184,237,252,233,244,83,248,3,255,129,252,245,0,0,0,128,[m
[32m+[m[32m  137,106,4,252,233,244,2,248,4,15,87,228,252,233,244,1,248,120,185,2,0,0,0,[m
[32m+[m[32m  129,122,253,4,239,15,131,244,70,252,242,15,16,2,248,5,57,193,15,131,244,78,[m
[32m+[m[32m  129,124,253,202,252,252,239,15,131,244,70,248,6,252,242,15,16,76,202,252,[m
[32m+[m[32m  248,248,7,252,242,15,93,193,131,193,1,252,233,244,5,248,121,255,185,2,0,0,[m
[32m+[m[32m  0,129,122,253,4,239,15,131,244,70,252,242,15,16,2,248,5,57,193,15,131,244,[m
[32m+[m[32m  78,129,124,253,202,252,252,239,15,131,244,70,248,6,252,242,15,16,76,202,252,[m
[32m+[m[32m  248,248,7,252,242,15,95,193,131,193,1,252,233,244,5,248,122,129,252,248,239,[m
[32m+[m[32m  15,133,244,70,129,122,253,4,239,15,133,244,70,255,139,42,139,90,252,252,131,[m
[32m+[m[32m  189,233,1,15,130,244,86,15,182,173,233,252,242,15,42,197,252,233,244,78,248,[m
[32m+[m[32m  123,65,139,174,233,65,59,174,233,15,130,244,247,232,244,80,248,1,129,252,[m
[32m+[m[32m  248,239,15,133,244,70,129,122,253,4,239,15,131,244,70,255,252,242,15,44,42,[m
[32m+[m[32m  129,252,253,252,255,0,0,0,15,135,244,70,137,108,36,4,199,68,36,8,1,0,0,0,[m
[32m+[m[32m  72,141,68,36,4,248,124,139,108,36,24,137,149,233,139,84,36,8,72,137,198,137,[m
[32m+[m[32m  252,239,137,92,36,28,232,251,1,33,248,125,139,149,233,139,90,252,252,199,[m
[32m+[m[32m  66,252,252,237,137,66,252,248,252,233,244,73,248,126,65,139,174,233,65,59,[m
[32m+[m[32m  174,233,15,130,244,247,232,244,80,248,1,199,68,36,4,252,255,252,255,252,255,[m
[32m+[m[32m  252,255,129,252,248,239,15,130,244,70,255,15,134,244,247,129,122,253,20,239,[m
[32m+[m[32m  15,131,244,70,252,242,15,44,106,16,137,108,36,4,248,1,129,122,253,4,239,15,[m
[32m+[m[32m  133,244,70,129,122,253,12,239,15,131,244,70,139,42,137,108,36,8,139,173,233,[m
[32m+[m[32m  252,242,15,44,74,8,139,68,36,4,57,197,15,130,244,251,248,2,133,201,15,142,[m
[32m+[m[32m  244,253,248,3,255,139,108,36,8,41,200,15,140,244,127,141,172,253,13,233,131,[m
[32m+[m[32m  192,1,248,4,137,68,36,8,137,232,252,233,244,124,248,5,15,140,244,252,141,[m
[32m+[m[32m  68,40,1,252,233,244,2,248,6,137,232,252,233,244,2,248,7,15,132,244,254,1,[m
[32m+[m[32m  252,233,131,193,1,15,143,244,3,248,8,255,185,1,0,0,0,252,233,244,3,248,127,[m
[32m+[m[32m  49,192,252,233,244,4,248,128,129,252,248,239,15,130,244,70,65,139,174,233,[m
[32m+[m[32m  65,59,174,233,15,130,244,247,232,244,80,248,1,129,122,253,4,239,15,133,244,[m
[32m+[m[32m  70,255,139,108,36,24,65,141,190,233,137,149,233,139,50,139,135,233,137,175,[m
[32m+[m[32m  233,137,135,233,137,92,36,28,232,251,1,34,137,199,232,251,1,35,252,233,244,[m
[32m+[m[32m  125,248,129,129,252,248,239,15,130,244,70,65,139,174,233,65,59,174,233,15,[m
[32m+[m[32m  130,244,247,232,244,80,248,1,129,122,253,4,239,255,15,133,244,70,139,108,[m
[32m+[m[32m  36,24,65,141,190,233,137,149,233,139,50,139,135,233,137,175,233,137,135,233,[m
[32m+[m[32m  137,92,36,28,232,251,1,36,137,199,232,251,1,35,252,233,244,125,248,130,129,[m
[32m+[m[32m  252,248,239,15,130,244,70,65,139,174,233,65,59,174,233,15,130,244,247,232,[m
[32m+[m[32m  244,80,248,1,255,129,122,253,4,239,15,133,244,70,139,108,36,24,65,141,190,[m
[32m+[m[32m  233,137,149,233,139,50,139,135,233,137,175,233,137,135,233,137,92,36,28,232,[m
[32m+[m[32m  251,1,37,137,199,232,251,1,35,252,233,244,125,248,131,129,252,248,239,15,[m
[32m+[m[32m  130,244,70,129,122,253,4,239,15,131,244,70,252,242,15,16,2,72,189,237,237,[m
[32m+[m[32m  255,102,72,15,110,205,252,242,15,88,193,102,15,126,197,248,2,252,233,244,[m
[32m+[m[32m  132,248,133,129,252,248,239,15,130,244,70,72,189,237,237,102,72,15,110,205,[m
[32m+[m[32m  129,122,253,4,239,15,131,244,70,252,242,15,16,2,252,242,15,88,193,102,15,[m
[32m+[m[32m  126,197,248,2,137,68,36,4,141,68,194,252,240,248,1,57,208,15,134,244,132,[m
[32m+[m[32m  129,120,253,4,239,15,131,244,134,255,252,242,15,16,0,252,242,15,88,193,102,[m
[32m+[m[32m  15,126,193,33,205,131,232,8,252,233,244,1,248,135,129,252,248,239,15,130,[m
[32m+[m[32m  244,70,72,189,237,237,102,72,15,110,205,129,122,253,4,239,15,131,244,70,252,[m
[32m+[m[32m  242,15,16,2,252,242,15,88,193,102,15,126,197,248,2,137,68,36,4,141,68,194,[m
[32m+[m[32m  252,240,248,1,57,208,15,134,244,132,129,120,253,4,239,15,131,244,134,252,[m
[32m+[m[32m  242,15,16,0,252,242,15,88,193,102,15,126,193,9,205,131,232,8,252,233,244,[m
[32m+[m[32m  1,248,136,255,129,252,248,239,15,130,244,70,72,189,237,237,102,72,15,110,[m
[32m+[m[32m  205,129,122,253,4,239,15,131,244,70,252,242,15,16,2,252,242,15,88,193,102,[m
[32m+[m[32m  15,126,197,248,2,137,68,36,4,141,68,194,252,240,248,1,57,208,15,134,244,132,[m
[32m+[m[32m  129,120,253,4,239,15,131,244,134,252,242,15,16,0,252,242,15,88,193,102,15,[m
[32m+[m[32m  126,193,49,205,131,232,8,252,233,244,1,248,137,129,252,248,239,255,15,130,[m
[32m+[m[32m  244,70,129,122,253,4,239,15,131,244,70,252,242,15,16,2,72,189,237,237,102,[m
[32m+[m[32m  72,15,110,205,252,242,15,88,193,102,15,126,197,248,2,15,205,252,233,244,132,[m
[32m+[m[32m  248,138,129,252,248,239,15,130,244,70,129,122,253,4,239,15,131,244,70,252,[m
[32m+[m[32m  242,15,16,2,72,189,237,237,255,102,72,15,110,205,252,242,15,88,193,102,15,[m
[32m+[m[32m  126,197,248,2,252,247,213,248,132,252,242,15,42,197,252,233,244,78,248,134,[m
[32m+[m[32m  139,68,36,4,252,233,244,70,248,139,129,252,248,239,15,130,244,70,129,122,[m
[32m+[m[32m  253,4,239,15,131,244,70,129,122,253,12,239,15,131,244,70,252,242,15,16,2,[m
[32m+[m[32m  252,242,15,16,74,8,72,189,237,237,255,102,72,15,110,213,252,242,15,88,194,[m
[32m+[m[32m  252,242,15,88,202,102,15,126,197,102,15,126,201,211,229,252,233,244,132,248,[m
[32m+[m[32m  140,129,252,248,239,15,130,244,70,129,122,253,4,239,15,131,244,70,129,122,[m
[32m+[m[32m  253,12,239,15,131,244,70,252,242,15,16,2,252,242,15,16,74,8,72,189,237,237,[m
[32m+[m[32m  102,72,15,110,213,252,242,15,88,194,252,242,15,88,202,102,15,126,197,102,[m
[32m+[m[32m  15,126,201,211,252,237,252,233,244,132,248,141,129,252,248,239,15,130,244,[m
[32m+[m[32m  70,255,129,122,253,4,239,15,131,244,70,129,122,253,12,239,15,131,244,70,252,[m
[32m+[m[32m  242,15,16,2,252,242,15,16,74,8,72,189,237,237,102,72,15,110,213,252,242,15,[m
[32m+[m[32m  88,194,252,242,15,88,202,102,15,126,197,102,15,126,201,211,252,253,252,233,[m
[32m+[m[32m  244,132,248,142,129,252,248,239,15,130,244,70,129,122,253,4,239,15,131,244,[m
[32m+[m[32m  70,129,122,253,12,239,15,131,244,70,255,252,242,15,16,2,252,242,15,16,74,[m
[32m+[m[32m  8,72,189,237,237,102,72,15,110,213,252,242,15,88,194,252,242,15,88,202,102,[m
[32m+[m[32m  15,126,197,102,15,126,201,211,197,252,233,244,132,248,143,129,252,248,239,[m
[32m+[m[32m  15,130,244,70,129,122,253,4,239,15,131,244,70,129,122,253,12,239,15,131,244,[m
[32m+[m[32m  70,252,242,15,16,2,252,242,15,16,74,8,72,189,237,237,102,72,15,110,213,252,[m
[32m+[m[32m  242,15,88,194,252,242,15,88,202,102,15,126,197,102,15,126,201,211,205,252,[m
[32m+[m[32m  233,244,132,248,144,255,184,237,252,233,244,70,248,145,184,237,248,70,139,[m
[32m+[m[32m  108,36,24,139,90,252,252,137,92,36,28,137,149,233,141,68,194,252,248,141,[m
[32m+[m[32m  136,233,137,133,233,139,66,252,248,59,141,233,15,135,244,251,137,252,239,[m
[32m+[m[32m  252,255,144,233,139,149,233,133,192,15,143,244,83,248,1,139,141,233,41,209,[m
[32m+[m[32m  193,252,233,3,133,192,141,65,1,139,106,252,248,15,133,244,34,255,139,157,[m
[32m+[m[32m  233,139,11,15,182,252,233,15,182,205,131,195,4,65,252,255,36,252,238,248,[m
[32m+[m[32m  34,137,209,252,247,195,237,15,133,244,249,15,182,107,252,253,72,252,247,213,[m
[32m+[m[32m  141,20,252,234,252,233,244,29,248,3,137,221,131,229,252,248,41,252,234,252,[m
[32m+[m[32m  233,244,29,248,5,190,237,137,252,239,232,251,1,0,139,149,233,49,192,252,233,[m
[32m+[m[32m  244,1,248,80,93,72,137,108,36,8,139,108,36,24,137,92,36,28,137,149,233,141,[m
[32m+[m[32m  68,194,252,248,137,252,239,137,133,233,232,251,1,38,139,149,233,255,139,133,[m
[32m+[m[32m  233,41,208,193,232,3,131,192,1,72,139,108,36,8,85,195,248,146,65,15,182,134,[m
[32m+[m[32m  233,168,235,15,133,244,251,168,235,15,133,244,247,168,235,15,132,244,247,[m
[32m+[m[32m  65,252,255,142,233,252,233,244,247,248,147,65,15,182,134,233,168,235,15,133,[m
[32m+[m[32m  244,251,255,252,233,244,247,248,148,65,15,182,134,233,168,235,15,133,244,[m
[32m+[m[32m  251,168,235,15,132,244,251,65,252,255,142,233,15,132,244,247,168,235,15,132,[m
[32m+[m[32m  244,251,248,1,139,108,36,24,137,149,233,137,222,137,252,239,232,251,1,39,[m
[32m+[m[32m  248,3,255,139,149,233,248,4,15,182,75,252,253,248,5,15,182,107,252,252,15,[m
[32m+[m[32m  183,67,252,254,65,252,255,164,253,252,238,233,248,149,131,195,4,139,77,232,[m
[32m+[m[32m  137,76,36,4,252,233,244,4,248,150,139,106,252,248,139,173,233,15,182,133,[m
[32m+[m[32m  233,141,4,194,139,108,36,24,137,149,233,137,133,233,137,222,65,141,190,233,[m
[32m+[m[32m  73,137,174,233,137,92,36,28,232,251,1,40,252,233,244,3,248,151,137,92,36,[m
[32m+[m[32m  28,252,233,244,247,248,152,255,137,92,36,28,131,203,1,248,1,141,68,194,252,[m
[32m+[m[32m  248,139,108,36,24,137,149,233,137,133,233,137,222,137,252,239,232,251,1,41,[m
[32m+[m[32m  199,68,36,28,0,0,0,0,131,227,252,254,139,149,233,72,137,193,139,133,233,41,[m
[32m+[m[32m  208,72,137,205,15,182,75,252,253,193,232,3,131,192,1,252,255,229,248,153,[m
[32m+[m[32m  139,77,232,137,12,36,68,137,116,36,8,68,139,116,36,4,15,182,75,252,253,141,[m
[32m+[m[32m  12,202,65,131,252,238,1,15,132,244,248,248,1,72,139,40,72,137,41,131,192,[m
[32m+[m[32m  8,131,193,8,65,131,252,238,1,15,133,244,1,248,2,15,182,67,252,253,15,182,[m
[32m+[m[32m  107,252,255,1,232,141,68,194,252,248,248,3,57,200,15,135,244,255,68,139,116,[m
[32m+[m[32m  36,8,139,4,36,15,183,168,233,15,183,128,233,57,232,15,132,244,47,255,133,[m
[32m+[m[32m  192,15,133,245,65,137,174,233,139,108,36,24,137,149,233,137,222,65,141,190,[m
[32m+[m[32m  233,73,137,174,233,232,251,1,42,139,149,233,252,233,244,47,248,9,199,65,4,[m
[32m+[m[32m  237,131,193,8,252,233,244,3,248,154,255,139,108,36,24,137,149,233,137,222,[m
[32m+[m[32m  137,252,239,232,251,1,43,139,149,233,131,252,235,4,252,233,244,47,255,248,[m
[32m+[m[32m  155,65,85,65,84,65,83,65,82,65,81,65,80,87,86,85,72,141,108,36,88,85,83,82,[m
[32m+[m[32m  81,80,15,182,69,252,248,138,101,252,240,76,137,125,252,248,76,137,117,252,[m
[32m+[m[32m  240,68,139,117,0,65,139,142,233,65,199,134,233,237,65,137,134,233,65,137,[m
[32m+[m[32m  142,233,72,129,252,236,239,72,131,197,128,252,242,68,15,17,125,252,248,252,[m
[32m+[m[32m  242,68,15,17,117,252,240,252,242,68,15,17,109,232,252,242,68,15,17,101,224,[m
[32m+[m[32m  252,242,68,15,17,93,216,252,242,68,15,17,85,208,252,242,68,15,17,77,200,252,[m
[32m+[m[32m  242,68,15,17,69,192,252,242,15,17,125,184,252,242,15,17,117,176,252,242,15,[m
[32m+[m[32m  17,109,168,252,242,15,17,101,160,252,242,15,17,93,152,252,242,15,17,85,144,[m
[32m+[m[32m  252,242,15,17,77,136,252,242,15,17,69,128,65,139,174,233,65,139,150,233,73,[m
[32m+[m[32m  137,174,233,137,149,233,72,137,230,65,141,190,233,65,199,134,233,0,0,0,0,[m
[32m+[m[32m  232,251,1,44,72,139,141,233,72,129,225,239,72,137,204,137,169,233,139,149,[m
[32m+[m[32m  233,139,153,233,252,233,244,247,248,156,255,72,131,196,16,248,1,76,139,108,[m
[32m+[m[32m  36,8,76,139,36,36,255,139,124,36,24,137,151,233,137,197,137,28,36,137,218,[m
[32m+[m[32m  65,139,182,233,232,251,1,45,139,28,36,137,232,139,108,36,24,139,149,233,255,[m
[32m+[m[32m  133,192,15,136,244,255,139,108,36,24,137,68,36,4,68,139,122,252,248,69,139,[m
[32m+[m[32m  191,233,69,139,191,233,137,149,233,65,199,134,233,0,0,0,0,65,199,134,233,[m
[32m+[m[32m  237,139,3,15,182,204,15,182,232,131,195,4,193,232,16,129,252,253,239,15,130,[m
[32m+[m[32m  244,249,129,252,253,239,15,131,244,250,248,2,139,68,36,4,248,3,65,252,255,[m
[32m+[m[32m  36,252,238,248,4,139,66,252,252,169,237,15,133,244,2,255,15,182,64,252,253,[m
[32m+[m[32m  72,252,247,208,68,139,124,194,252,248,69,139,191,233,69,139,191,233,252,233,[m
[32m+[m[32m  244,2,248,9,252,247,216,137,252,239,137,198,232,251,1,1,248,157,248,97,72,[m
[32m+[m[32m  184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,200,[m
[32m+[m[32m  102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,252,242,15,88,203,[m
[32m+[m[32m  252,242,15,92,203,102,15,86,202,72,184,237,237,102,72,15,110,208,252,242,[m
[32m+[m[32m  15,194,193,1,102,15,84,194,252,242,15,92,200,15,40,193,248,1,195,248,158,[m
[32m+[m[32m  248,99,72,184,237,237,255,102,72,15,110,208,72,184,237,237,102,72,15,110,[m
[32m+[m[32m  216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,252,[m
[32m+[m[32m  242,15,88,203,252,242,15,92,203,102,15,86,202,72,184,237,237,102,72,15,110,[m
[32m+[m[32m  208,252,242,15,194,193,6,102,15,84,194,252,242,15,92,200,15,40,193,248,1,[m
[32m+[m[32m  195,248,159,248,119,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,[m
[32m+[m[32m  15,110,216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,[m
[32m+[m[32m  208,15,40,193,252,242,15,88,203,252,242,15,92,203,72,184,237,237,102,72,15,[m
[32m+[m[32m  110,216,252,242,15,194,193,1,102,15,84,195,252,242,15,92,200,102,15,86,202,[m
[32m+[m[32m  15,40,193,248,1,195,248,160,255,15,40,232,252,242,15,94,193,72,184,237,237,[m
[32m+[m[32m  102,72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,224,102,15,84,226,[m
[32m+[m[32m  102,15,46,220,15,134,244,247,102,15,85,208,252,242,15,88,227,252,242,15,92,[m
[32m+[m[32m  227,102,15,86,226,72,184,237,237,102,72,15,110,208,252,242,15,194,196,1,102,[m
[32m+[m[32m  15,84,194,252,242,15,92,224,15,40,197,252,242,15,89,204,252,242,15,92,193,[m
[32m+[m[32m  195,248,1,252,242,15,89,200,15,40,197,252,242,15,92,193,195,248,161,131,252,[m
[32m+[m[32m  248,1,15,142,244,252,248,1,169,1,0,0,0,15,133,244,248,252,242,15,89,192,209,[m
[32m+[m[32m  232,252,233,244,1,248,2,209,232,15,132,244,251,255,15,40,200,248,3,252,242,[m
[32m+[m[32m  15,89,192,209,232,15,132,244,250,15,131,244,3,252,242,15,89,200,252,233,244,[m
[32m+[m[32m  3,248,4,252,242,15,89,193,248,5,195,248,6,15,132,244,5,15,130,244,253,252,[m
[32m+[m[32m  247,216,232,244,1,72,184,237,237,102,72,15,110,200,252,242,15,94,200,15,40,[m
[32m+[m[32m  193,195,248,7,72,184,237,237,255,102,72,15,110,192,195,248,162,137,252,248,[m
[32m+[m[32m  83,49,201,15,162,137,6,137,94,4,137,78,8,137,86,12,91,195,248,163,255,204,[m
[32m+[m[32m  255,204,248,164,83,65,87,65,86,72,131,252,236,40,68,141,181,233,139,157,233,[m
[32m+[m[32m  15,183,192,137,131,233,72,137,187,233,72,137,179,233,72,137,147,233,72,137,[m
[32m+[m[32m  139,233,252,242,15,17,131,233,252,242,15,17,139,233,252,242,15,17,147,233,[m
[32m+[m[32m  252,242,15,17,155,233,72,141,132,253,36,233,76,137,131,233,76,137,139,233,[m
[32m+[m[32m  252,242,15,17,163,233,252,242,15,17,171,233,252,242,15,17,179,233,252,242,[m
[32m+[m[32m  15,17,187,233,255,72,137,131,233,72,137,230,137,92,36,28,137,223,232,251,[m
[32m+[m[32m  1,46,65,199,134,233,237,139,144,233,139,128,233,41,208,139,106,252,248,193,[m
[32m+[m[32m  232,3,131,192,1,139,157,233,139,11,15,182,252,233,15,182,205,131,195,4,65,[m
[32m+[m[32m  252,255,36,252,238,248,33,139,76,36,24,65,139,158,233,72,137,139,233,137,[m
[32m+[m[32m  145,233,137,169,233,137,223,137,198,232,251,1,47,72,139,131,233,252,242,15,[m
[32m+[m[32m  16,131,233,252,233,244,17,248,165,85,72,137,229,83,72,137,252,251,139,131,[m
[32m+[m[32m  233,72,41,196,15,182,139,233,131,252,233,1,15,136,244,248,248,1,255,72,139,[m
[32m+[m[32m  132,253,203,233,72,137,132,253,204,233,131,252,233,1,15,137,244,1,248,2,15,[m
[32m+[m[32m  182,131,233,72,139,187,233,72,139,179,233,72,139,147,233,72,139,139,233,76,[m
[32m+[m[32m  139,131,233,76,139,139,233,133,192,15,132,244,251,15,40,131,233,15,40,139,[m
[32m+[m[32m  233,15,40,147,233,15,40,155,233,131,252,248,4,15,134,244,251,255,15,40,163,[m
[32m+[m[32m  233,15,40,171,233,15,40,179,233,15,40,187,233,248,5,252,255,147,233,72,137,[m
[32m+[m[32m  131,233,15,41,131,233,72,137,147,233,15,41,139,233,72,139,93,252,248,201,[m
[32m+[m[32m  195,255,249,255,129,124,253,202,4,239,15,131,244,50,129,124,253,194,4,239,[m
[32m+[m[32m  15,131,244,50,248,1,252,242,15,16,4,194,248,2,131,195,4,102,15,46,4,202,248,[m
[32m+[m[32m  3,255,15,134,244,247,255,15,135,244,247,255,15,130,244,247,255,15,131,244,[m
[32m+[m[32m  247,255,15,183,67,252,254,141,156,253,131,233,248,1,139,3,15,182,204,15,182,[m
[32m+[m[32m  232,131,195,4,193,232,16,65,252,255,36,252,238,255,139,108,194,4,131,195,[m
[32m+[m[32m  4,255,129,252,253,239,15,131,244,251,129,124,253,202,4,239,15,131,244,251,[m
[32m+[m[32m  248,1,252,242,15,16,4,202,248,2,102,15,46,4,194,248,4,255,15,138,244,248,[m
[32m+[m[32m  15,133,244,248,255,15,138,244,248,15,132,244,247,255,248,1,15,183,67,252,[m
[32m+[m[32m  254,141,156,253,131,233,248,2,255,248,2,15,183,67,252,254,141,156,253,131,[m
[32m+[m[32m  233,248,1,255,252,233,244,9,255,248,5,129,252,253,239,15,132,244,55,129,124,[m
[32m+[m[32m  253,202,4,239,15,132,244,55,57,108,202,4,15,133,244,2,129,252,253,239,15,[m
[32m+[m[32m  131,244,1,139,12,202,139,4,194,57,193,15,132,244,1,129,252,253,239,15,135,[m
[32m+[m[32m  244,2,129,252,253,239,15,130,244,2,255,139,169,233,133,252,237,15,132,244,[m
[32m+[m[32m  2,252,246,133,233,235,15,133,244,2,255,49,252,237,255,189,1,0,0,0,255,252,[m
[32m+[m[32m  233,244,54,255,248,3,129,252,253,239,255,15,133,244,9,255,252,233,244,55,[m
[32m+[m[32m  255,72,252,247,208,139,108,202,4,131,195,4,129,252,253,239,15,133,244,249,[m
[32m+[m[32m  139,12,202,65,59,12,135,255,139,108,202,4,131,195,4,255,129,252,253,239,15,[m
[32m+[m[32m  131,244,249,248,1,252,242,65,15,16,4,199,248,2,102,15,46,4,202,248,4,255,[m
[32m+[m[32m  72,252,247,208,139,108,202,4,131,195,4,57,197,255,15,133,244,249,15,183,67,[m
[32m+[m[32m  252,254,141,156,253,131,233,248,2,139,3,15,182,204,15,182,232,131,195,4,193,[m
[32m+[m[32m  232,16,65,252,255,36,252,238,248,3,129,252,253,239,15,133,244,2,252,233,244,[m
[32m+[m[32m  55,255,15,132,244,248,129,252,253,239,15,132,244,55,15,183,67,252,254,141,[m
[32m+[m[32m  156,253,131,233,248,2,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,[m
[32m+[m[32m  252,255,36,252,238,255,139,108,194,4,131,195,4,129,252,253,239,255,137,108,[m
[32m+[m[32m  202,4,139,44,194,137,44,202,255,3,68,202,4,15,133,244,56,139,3,15,182,204,[m
[32m+[m[32m  15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,129,124,253,202,[m
[32m+[m[32m  4,239,15,131,244,56,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,[m
[32m+[m[32m  255,36,252,238,255,72,139,44,194,72,137,44,202,139,3,15,182,204,15,182,232,[m
[32m+[m[32m  131,195,4,193,232,16,65,252,255,36,252,238,255,49,252,237,129,124,253,194,[m
[32m+[m[32m  4,239,129,213,239,137,108,202,4,139,3,15,182,204,15,182,232,131,195,4,193,[m
[32m+[m[32m  232,16,65,252,255,36,252,238,255,129,124,253,194,4,239,15,131,244,61,252,[m
[32m+[m[32m  242,15,16,4,194,72,184,237,237,102,72,15,110,200,15,87,193,252,242,15,17,[m
[32m+[m[32m  4,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,[m
[32m+[m[32m  238,255,129,124,253,194,4,239,15,133,244,248,139,4,194,15,87,192,252,242,[m
[32m+[m[32m  15,42,128,233,248,1,252,242,15,17,4,202,139,3,15,182,204,15,182,232,131,195,[m
[32m+[m[32m  4,193,232,16,65,252,255,36,252,238,248,2,129,124,253,194,4,239,15,133,244,[m
[32m+[m[32m  64,139,60,194,255,139,175,233,131,252,253,0,15,133,244,255,248,3,255,248,[m
[32m+[m[32m  65,137,213,232,251,1,48,252,242,15,42,192,137,252,234,15,182,75,252,253,252,[m
[32m+[m[32m  233,244,1,255,248,9,252,246,133,233,235,15,133,244,3,252,233,244,64,255,15,[m
[32m+[m[32m  182,252,236,15,182,192,255,129,124,253,252,234,4,239,15,131,244,58,252,242,[m
[32m+[m[32m  15,16,4,252,234,252,242,65,15,88,4,199,255,129,124,253,252,234,4,239,15,131,[m
[32m+[m[32m  244,60,252,242,65,15,16,4,199,252,242,15,88,4,252,234,255,129,124,253,252,[m
[32m+[m[32m  234,4,239,15,131,244,63,129,124,253,194,4,239,15,131,244,63,252,242,15,16,[m
[32m+[m[32m  4,252,234,252,242,15,88,4,194,255,129,124,253,252,234,4,239,15,131,244,58,[m
[32m+[m[32m  252,242,15,16,4,252,234,252,242,65,15,92,4,199,255,129,124,253,252,234,4,[m
[32m+[m[32m  239,15,131,244,60,252,242,65,15,16,4,199,252,242,15,92,4,252,234,255,129,[m
[32m+[m[32m  124,253,252,234,4,239,15,131,244,63,129,124,253,194,4,239,15,131,244,63,252,[m
[32m+[m[32m  242,15,16,4,252,234,252,242,15,92,4,194,255,129,124,253,252,234,4,239,15,[m
[32m+[m[32m  131,244,58,252,242,15,16,4,252,234,252,242,65,15,89,4,199,255,129,124,253,[m
[32m+[m[32m  252,234,4,239,15,131,244,60,252,242,65,15,16,4,199,252,242,15,89,4,252,234,[m
[32m+[m[32m  255,129,124,253,252,234,4,239,15,131,244,63,129,124,253,194,4,239,15,131,[m
[32m+[m[32m  244,63,252,242,15,16,4,252,234,252,242,15,89,4,194,255,129,124,253,252,234,[m
[32m+[m[32m  4,239,15,131,244,58,252,242,15,16,4,252,234,252,242,65,15,94,4,199,255,129,[m
[32m+[m[32m  124,253,252,234,4,239,15,131,244,60,252,242,65,15,16,4,199,252,242,15,94,[m
[32m+[m[32m  4,252,234,255,129,124,253,252,234,4,239,15,131,244,63,129,124,253,194,4,239,[m
[32m+[m[32m  15,131,244,63,252,242,15,16,4,252,234,252,242,15,94,4,194,255,129,124,253,[m
[32m+[m[32m  252,234,4,239,15,131,244,58,252,242,15,16,4,252,234,252,242,65,15,16,12,199,[m
[32m+[m[32m  255,129,124,253,252,234,4,239,15,131,244,60,252,242,65,15,16,4,199,252,242,[m
[32m+[m[32m  15,16,12,252,234,255,129,124,253,252,234,4,239,15,131,244,63,129,124,253,[m
[32m+[m[32m  194,4,239,15,131,244,63,252,242,15,16,4,252,234,252,242,15,16,12,194,255,[m
[32m+[m[32m  248,166,232,244,160,252,242,15,17,4,202,139,3,15,182,204,15,182,232,131,195,[m
[32m+[m[32m  4,193,232,16,65,252,255,36,252,238,255,252,233,244,166,255,137,213,232,251,[m
[32m+[m[32m  1,30,15,182,75,252,253,137,252,234,252,242,15,17,4,202,139,3,15,182,204,15,[m
[32m+[m[32m  182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,15,182,252,236,15,[m
[32m+[m[32m  182,192,139,124,36,24,137,151,233,141,52,194,137,194,41,252,234,248,37,137,[m
[32m+[m[32m  252,253,137,92,36,28,232,251,1,49,139,149,233,133,192,15,133,244,51,15,182,[m
[32m+[m[32m  107,252,255,15,182,75,252,253,72,139,4,252,234,72,137,4,202,139,3,15,182,[m
[32m+[m[32m  204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,72,252,247,[m
[32m+[m[32m  208,65,139,4,135,199,68,202,4,237,137,4,202,139,3,15,182,204,15,182,232,131,[m
[32m+[m[32m  195,4,193,232,16,65,252,255,36,252,238,255,15,191,192,252,242,15,42,192,252,[m
[32m+[m[32m  242,15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,[m
[32m+[m[32m  36,252,238,255,252,242,65,15,16,4,199,252,242,15,17,4,202,139,3,15,182,204,[m
[32m+[m[32m  15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,72,252,247,208,[m
[32m+[m[32m  137,68,202,4,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,[m
[32m+[m[32m  36,252,238,255,141,76,202,12,141,68,194,4,189,237,137,105,252,248,248,1,137,[m
[32m+[m[32m  41,131,193,8,57,193,15,134,244,1,139,3,15,182,204,15,182,232,131,195,4,193,[m
[32m+[m[32m  232,16,65,252,255,36,252,238,255,139,106,252,248,139,172,253,133,233,139,[m
[32m+[m[32m  173,233,72,139,69,0,72,137,4,202,139,3,15,182,204,15,182,232,131,195,4,193,[m
[32m+[m[32m  232,16,65,252,255,36,252,238,255,139,106,252,248,139,172,253,141,233,128,[m
[32m+[m[32m  189,233,0,139,173,233,139,12,194,139,68,194,4,137,77,0,137,69,4,15,132,244,[m
[32m+[m[32m  247,252,246,133,233,235,15,133,244,248,248,1,139,3,15,182,204,15,182,232,[m
[32m+[m[32m  131,195,4,193,232,16,65,252,255,36,252,238,248,2,129,232,239,129,252,248,[m
[32m+[m[32m  239,15,134,244,1,252,246,129,233,235,15,132,244,1,255,137,252,238,137,213,[m
[32m+[m[32m  65,141,190,233,232,251,1,50,137,252,234,252,233,244,1,255,72,252,247,208,[m
[32m+[m[32m  139,106,252,248,139,172,253,141,233,65,139,12,135,139,133,233,137,8,199,64,[m
[32m+[m[32m  4,237,252,246,133,233,235,15,133,244,248,248,1,139,3,15,182,204,15,182,232,[m
[32m+[m[32m  131,195,4,193,232,16,65,252,255,36,252,238,248,2,252,246,129,233,235,15,132,[m
[32m+[m[32m  244,1,128,189,233,0,15,132,244,1,137,213,137,198,65,141,190,233,232,251,1,[m
[32m+[m[32m  50,137,252,234,252,233,244,1,255,139,106,252,248,252,242,65,15,16,4,199,139,[m
[32m+[m[32m  172,253,141,233,139,141,233,252,242,15,17,1,139,3,15,182,204,15,182,232,131,[m
[32m+[m[32m  195,4,193,232,16,65,252,255,36,252,238,255,72,252,247,208,139,106,252,248,[m
[32m+[m[32m  139,172,253,141,233,139,141,233,137,65,4,139,3,15,182,204,15,182,232,131,[m
[32m+[m[32m  195,4,193,232,16,65,252,255,36,252,238,255,141,156,253,131,233,139,108,36,[m
[32m+[m[32m  24,131,189,233,0,15,132,244,247,137,149,233,141,52,202,137,252,239,232,251,[m
[32m+[m[32m  1,51,139,149,233,248,1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,[m
[32m+[m[32m  252,255,36,252,238,255,72,252,247,208,139,108,36,24,137,149,233,139,82,252,[m
[32m+[m[32m  248,65,139,52,135,137,252,239,137,92,36,28,232,251,1,52,139,149,233,15,182,[m
[32m+[m[32m  75,252,253,137,4,202,199,68,202,4,237,139,3,15,182,204,15,182,232,131,195,[m
[32m+[m[32m  4,193,232,16,65,252,255,36,252,238,255,139,108,36,24,137,149,233,65,139,142,[m
[32m+[m[32m  233,65,59,142,233,137,92,36,28,15,131,244,251,248,1,137,194,37,252,255,7,[m
[32m+[m[32m  0,0,193,252,234,11,61,252,255,7,0,0,15,132,244,249,248,2,137,252,239,137,[m
[32m+[m[32m  198,232,251,1,53,139,149,233,15,182,75,252,253,137,4,202,199,68,202,4,237,[m
[32m+[m[32m  139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,[m
[32m+[m[32m  3,184,1,8,0,0,252,233,244,2,248,5,137,252,239,232,251,1,54,15,183,67,252,[m
[32m+[m[32m  254,252,233,244,1,255,72,252,247,208,139,108,36,24,65,139,142,233,137,92,[m
[32m+[m[32m  36,28,65,59,142,233,137,149,233,15,131,244,249,248,2,65,139,52,135,137,252,[m
[32m+[m[32m  239,232,251,1,55,139,149,233,15,182,75,252,253,137,4,202,199,68,202,4,237,[m
[32m+[m[32m  139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,[m
[32m+[m[32m  3,137,252,239,232,251,1,54,15,183,67,252,254,72,252,247,208,252,233,244,2,[m
[32m+[m[32m  255,72,252,247,208,139,106,252,248,139,173,233,65,139,4,135,252,233,244,167,[m
[32m+[m[32m  255,72,252,247,208,139,106,252,248,139,173,233,65,139,4,135,252,233,244,168,[m
[32m+[m[32m  255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,40,139,[m
[32m+[m[32m  44,252,234,129,124,253,194,4,239,15,131,244,251,252,242,15,16,4,194,252,242,[m
[32m+[m[32m  15,44,192,252,242,15,42,200,102,15,46,193,15,133,244,40,59,133,233,15,131,[m
[32m+[m[32m  244,40,193,224,3,3,133,233,129,120,253,4,239,15,132,244,248,72,139,40,72,[m
[32m+[m[32m  137,44,202,248,1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,[m
[32m+[m[32m  255,36,252,238,248,2,131,189,233,0,15,132,244,249,255,139,141,233,252,246,[m
[32m+[m[32m  129,233,235,15,132,244,40,15,182,75,252,253,248,3,199,68,202,4,237,252,233,[m
[32m+[m[32m  244,1,248,5,129,124,253,194,4,239,15,133,244,40,139,4,194,252,233,244,167,[m
[32m+[m[32m  255,15,182,252,236,15,182,192,72,252,247,208,65,139,4,135,129,124,253,252,[m
[32m+[m[32m  234,4,239,15,133,244,38,139,44,252,234,248,167,139,141,233,35,136,233,105,[m
[32m+[m[32m  201,239,3,141,233,248,1,129,185,233,239,15,133,244,250,57,129,233,15,133,[m
[32m+[m[32m  244,250,129,121,253,4,239,15,132,244,251,255,15,182,67,252,253,72,139,41,[m
[32m+[m[32m  72,137,44,194,248,2,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,[m
[32m+[m[32m  255,36,252,238,248,3,15,182,67,252,253,199,68,194,4,237,252,233,244,2,248,[m
[32m+[m[32m  4,139,137,233,133,201,15,133,244,1,248,5,139,141,233,133,201,15,132,244,3,[m
[32m+[m[32m  252,246,129,233,235,15,133,244,3,252,233,244,38,255,15,182,252,236,15,182,[m
[32m+[m[32m  192,129,124,253,252,234,4,239,15,133,244,39,139,44,252,234,59,133,233,15,[m
[32m+[m[32m  131,244,39,193,224,3,3,133,233,129,120,253,4,239,15,132,244,248,72,139,40,[m
[32m+[m[32m  72,137,44,202,248,1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,[m
[32m+[m[32m  255,36,252,238,248,2,131,189,233,0,15,132,244,249,139,141,233,252,246,129,[m
[32m+[m[32m  233,235,15,132,244,39,255,15,182,75,252,253,248,3,199,68,202,4,237,252,233,[m
[32m+[m[32m  244,1,255,15,182,252,236,15,182,192,139,44,252,234,252,242,15,44,4,194,59,[m
[32m+[m[32m  133,233,15,131,244,41,193,224,3,3,133,233,248,42,72,139,40,72,137,44,202,[m
[32m+[m[32m  248,43,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,[m
[32m+[m[32m  238,255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,46,[m
[32m+[m[32m  139,44,252,234,129,124,253,194,4,239,15,131,244,251,252,242,15,16,4,194,252,[m
[32m+[m[32m  242,15,44,192,252,242,15,42,200,102,15,46,193,15,133,244,46,59,133,233,15,[m
[32m+[m[32m  131,244,46,193,224,3,3,133,233,129,120,253,4,239,15,132,244,249,248,1,252,[m
[32m+[m[32m  246,133,233,235,15,133,244,253,248,2,255,72,139,44,202,72,137,40,139,3,15,[m
[32m+[m[32m  182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,131,189,[m
[32m+[m[32m  233,0,15,132,244,1,139,141,233,252,246,129,233,235,15,132,244,46,15,182,75,[m
[32m+[m[32m  252,253,252,233,244,1,248,5,129,124,253,194,4,239,15,133,244,46,139,4,194,[m
[32m+[m[32m  252,233,244,168,248,7,128,165,233,235,255,65,139,142,233,65,137,174,233,137,[m
[32m+[m[32m  141,233,15,182,75,252,253,252,233,244,2,255,15,182,252,236,15,182,192,72,[m
[32m+[m[32m  252,247,208,65,139,4,135,129,124,253,252,234,4,239,15,133,244,44,139,44,252,[m
[32m+[m[32m  234,248,168,139,141,233,35,136,233,105,201,239,198,133,233,0,3,141,233,248,[m
[32m+[m[32m  1,129,185,233,239,15,133,244,251,57,129,233,15,133,244,251,129,121,253,4,[m
[32m+[m[32m  239,15,132,244,250,248,2,255,252,246,133,233,235,15,133,244,253,248,3,15,[m
[32m+[m[32m  182,67,252,253,72,139,44,194,72,137,41,139,3,15,182,204,15,182,232,131,195,[m
[32m+[m[32m  4,193,232,16,65,252,255,36,252,238,248,4,131,189,233,0,15,132,244,2,137,12,[m
[32m+[m[32m  36,139,141,233,252,246,129,233,235,15,132,244,44,139,12,36,252,233,244,2,[m
[32m+[m[32m  248,5,139,137,233,133,201,15,133,244,1,255,139,141,233,133,201,15,132,244,[m
[32m+[m[32m  252,252,246,129,233,235,15,132,244,44,248,6,137,4,36,199,68,36,4,237,137,[m
[32m+[m[32m  108,36,8,139,124,36,24,137,151,233,72,141,20,36,137,252,238,137,252,253,137,[m
[32m+[m[32m  92,36,28,232,251,1,56,139,149,233,139,108,36,8,137,193,252,233,244,2,248,[m
[32m+[m[32m  7,128,165,233,235,65,139,134,233,65,137,174,233,137,133,233,255,252,233,244,[m
[32m+[m[32m  3,255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,45,139,[m
[32m+[m[32m  44,252,234,59,133,233,15,131,244,45,193,224,3,3,133,233,129,120,253,4,239,[m
[32m+[m[32m  15,132,244,249,248,1,252,246,133,233,235,15,133,244,253,248,2,72,139,12,202,[m
[32m+[m[32m  72,137,8,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,[m
[32m+[m[32m  238,248,3,131,189,233,0,15,132,244,1,255,139,141,233,252,246,129,233,235,[m
[32m+[m[32m  15,132,244,45,15,182,75,252,253,252,233,244,1,248,7,128,165,233,235,65,139,[m
[32m+[m[32m  142,233,65,137,174,233,137,141,233,15,182,75,252,253,252,233,244,2,255,15,[m
[32m+[m[32m  182,252,236,15,182,192,139,44,252,234,252,242,15,44,4,194,252,246,133,233,[m
[32m+[m[32m  235,15,133,244,253,248,2,59,133,233,15,131,244,48,193,224,3,3,133,233,248,[m
[32m+[m[32m  49,72,139,44,202,72,137,40,139,3,15,182,204,15,182,232,131,195,4,193,232,[m
[32m+[m[32m  16,65,252,255,36,252,238,248,7,128,165,233,235,65,139,142,233,65,137,174,[m
[32m+[m[32m  233,137,141,233,15,182,75,252,253,252,233,244,2,255,68,137,60,36,69,139,60,[m
[32m+[m[32m  199,248,1,141,12,202,139,105,252,248,252,246,133,233,235,15,133,244,253,248,[m
[32m+[m[32m  2,139,68,36,4,131,232,1,15,132,244,250,68,1,252,248,59,133,233,15,135,244,[m
[32m+[m[32m  251,68,41,252,248,65,193,231,3,68,3,189,233,248,3,72,139,41,131,193,8,73,[m
[32m+[m[32m  137,47,65,131,199,8,131,232,1,15,133,244,3,248,4,68,139,60,36,139,3,15,182,[m
[32m+[m[32m  204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,5,139,124,36,[m
[32m+[m[32m  24,137,151,233,137,252,238,137,194,137,252,253,137,92,36,28,232,251,1,57,[m
[32m+[m[32m  139,149,233,255,15,182,75,252,253,252,233,244,1,248,7,128,165,233,235,65,[m
[32m+[m[32m  139,134,233,65,137,174,233,137,133,233,252,233,244,2,255,3,68,36,4,255,129,[m
[32m+[m[32m  124,253,202,4,239,139,44,202,15,133,244,66,141,84,202,8,137,90,252,252,139,[m
[32m+[m[32m  157,233,139,11,15,182,252,233,15,182,205,131,195,4,65,252,255,36,252,238,[m
[32m+[m[32m  255,141,76,202,8,65,137,215,139,105,252,248,129,121,253,252,252,239,15,133,[m
[32m+[m[32m  244,30,248,67,139,90,252,252,252,247,195,237,15,133,244,253,248,1,137,106,[m
[32m+[m[32m  252,248,137,68,36,4,131,232,1,15,132,244,249,248,2,72,139,41,131,193,8,73,[m
[32m+[m[32m  137,47,65,131,199,8,131,232,1,15,133,244,2,139,106,252,248,248,3,139,68,36,[m
[32m+[m[32m  4,128,189,233,1,15,135,244,251,248,4,139,157,233,255,139,11,15,182,252,233,[m
[32m+[m[32m  15,182,205,131,195,4,65,252,255,36,252,238,248,5,252,247,195,237,15,133,244,[m
[32m+[m[32m  4,15,182,75,252,253,72,252,247,209,68,139,124,202,252,248,69,139,191,233,[m
[32m+[m[32m  69,139,191,233,252,233,244,4,248,7,129,252,235,239,252,247,195,237,15,133,[m
[32m+[m[32m  244,254,41,218,65,137,215,139,90,252,252,252,233,244,1,248,8,129,195,239,[m
[32m+[m[32m  252,233,244,1,255,141,76,202,8,72,139,105,232,72,139,65,252,240,72,137,41,[m
[32m+[m[32m  72,137,65,8,139,105,224,139,65,228,137,105,252,248,137,65,252,252,129,252,[m
[32m+[m[32m  248,239,184,237,15,133,244,30,137,202,137,90,252,252,139,157,233,139,11,15,[m
[32m+[m[32m  182,252,233,15,182,205,131,195,4,65,252,255,36,252,238,255,68,137,60,36,68,[m
[32m+[m[32m  137,116,36,4,139,108,202,252,240,139,68,202,252,248,68,139,181,233,131,195,[m
[32m+[m[32m  4,68,139,189,233,248,1,68,57,252,240,15,131,244,251,65,129,124,253,199,4,[m
[32m+[m[32m  239,15,132,244,250,252,242,15,42,192,73,139,44,199,72,137,108,202,8,131,192,[m
[32m+[m[32m  1,252,242,15,17,4,202,137,68,202,252,248,248,2,15,183,67,252,254,141,156,[m
[32m+[m[32m  253,131,233,248,3,68,139,116,36,4,68,139,60,36,139,3,15,182,204,15,182,232,[m
[32m+[m[32m  131,195,4,193,232,16,65,252,255,36,252,238,248,4,131,192,1,252,233,244,1,[m
[32m+[m[32m  248,5,68,41,252,240,248,6,59,133,233,15,135,244,3,255,68,105,252,248,239,[m
[32m+[m[32m  68,3,189,233,65,129,191,233,239,15,132,244,253,70,141,116,48,1,73,139,175,[m
[32m+[m[32m  233,73,139,135,233,72,137,44,202,72,137,68,202,8,68,137,116,202,252,248,252,[m
[32m+[m[32m  233,244,2,248,7,131,192,1,252,233,244,6,255,129,124,253,202,252,236,239,15,[m
[32m+[m[32m  133,244,251,139,108,202,232,129,124,253,202,252,244,239,15,133,244,251,129,[m
[32m+[m[32m  124,253,202,252,252,239,15,133,244,251,128,189,233,235,15,133,244,251,141,[m
[32m+[m[32m  156,253,131,233,199,68,202,252,248,0,0,0,0,199,68,202,252,252,252,255,127,[m
[32m+[m[32m  252,254,252,255,248,1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,[m
[32m+[m[32m  252,255,36,252,238,248,5,198,67,252,252,235,141,156,253,131,233,198,3,235,[m
[32m+[m[32m  255,15,182,252,236,15,182,192,68,137,60,36,68,141,188,253,194,233,141,12,[m
[32m+[m[32m  202,68,43,122,252,252,133,252,237,15,132,244,251,141,108,252,233,252,248,[m
[32m+[m[32m  65,57,215,15,131,244,248,248,1,73,139,71,252,248,65,131,199,8,72,137,1,131,[m
[32m+[m[32m  193,8,57,252,233,15,131,244,249,65,57,215,15,130,244,1,248,2,199,65,4,237,[m
[32m+[m[32m  131,193,8,57,252,233,15,130,244,2,248,3,68,139,60,36,139,3,15,182,204,15,[m
[32m+[m[32m  182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,5,199,68,36,4,1,0,[m
[32m+[m[32m  0,0,137,208,68,41,252,248,15,134,244,3,137,197,193,252,237,3,131,197,1,137,[m
[32m+[m[32m  108,36,4,139,108,36,24,1,200,59,133,233,255,15,135,244,253,248,6,73,139,71,[m
[32m+[m[32m  252,248,65,131,199,8,72,137,1,131,193,8,65,57,215,15,130,244,6,252,233,244,[m
[32m+[m[32m  3,248,7,137,149,233,137,141,233,137,92,36,28,65,41,215,139,116,36,4,131,252,[m
[32m+[m[32m  238,1,137,252,239,232,251,1,0,139,149,233,139,141,233,65,1,215,252,233,244,[m
[32m+[m[32m  6,255,193,225,3,255,248,1,139,90,252,252,137,68,36,4,252,247,195,237,15,133,[m
[32m+[m[32m  244,253,255,248,14,65,137,215,131,232,1,15,132,244,249,248,2,73,139,44,15,[m
[32m+[m[32m  73,137,111,252,248,65,131,199,8,131,232,1,15,133,244,2,248,3,139,68,36,4,[m
[32m+[m[32m  15,182,107,252,255,248,5,57,197,15,135,244,252,255,72,139,44,10,72,137,106,[m
[32m+[m[32m  252,248,255,248,5,56,67,252,255,15,135,244,252,255,15,182,75,252,253,72,252,[m
[32m+[m[32m  247,209,141,20,202,68,139,122,252,248,69,139,191,233,69,139,191,233,139,3,[m
[32m+[m[32m  15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,6,255,[m
[32m+[m[32m  65,199,71,252,252,237,65,131,199,8,255,199,68,194,252,244,237,255,131,192,[m
[32m+[m[32m  1,252,233,244,5,248,7,141,171,233,252,247,197,237,15,133,244,15,41,252,234,[m
[32m+[m[32m  255,1,252,233,255,137,221,209,252,237,129,229,239,102,65,129,172,253,46,233,[m
[32m+[m[32m  238,15,130,244,150,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,[m
[32m+[m[32m  129,121,253,12,239,15,133,244,68,129,121,253,20,239,15,133,244,68,139,41,[m
[32m+[m[32m  131,121,16,0,15,140,244,251,255,129,121,253,12,239,15,133,244,163,129,121,[m
[32m+[m[32m  253,20,239,15,133,244,163,255,139,105,16,133,252,237,15,136,244,251,3,41,[m
[32m+[m[32m  15,128,244,247,137,41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,[m
[32m+[m[32m  253,248,1,248,6,141,156,253,131,233,255,141,156,253,131,233,15,183,67,252,[m
[32m+[m[32m  254,15,142,245,248,1,248,6,255,15,143,244,253,248,6,141,156,253,131,233,248,[m
[32m+[m[32m  1,255,248,7,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,[m
[32m+[m[32m  252,238,248,5,255,3,41,15,128,244,1,137,41,255,15,141,244,7,255,141,156,253,[m
[32m+[m[32m  131,233,15,183,67,252,254,15,141,245,255,15,140,244,7,255,252,233,244,6,248,[m
[32m+[m[32m  9,255,129,121,253,4,239,255,15,131,244,68,129,121,253,12,239,15,131,244,68,[m
[32m+[m[32m  255,129,121,253,12,239,15,131,244,163,129,121,253,20,239,15,131,244,163,255,[m
[32m+[m[32m  139,105,20,255,129,252,253,239,15,131,244,68,255,252,242,15,16,1,252,242,[m
[32m+[m[32m  15,16,73,8,255,252,242,15,88,65,16,252,242,15,17,1,133,252,237,15,136,244,[m
[32m+[m[32m  249,255,15,140,244,249,255,102,15,46,200,248,1,252,242,15,17,65,24,255,15,[m
[32m+[m[32m  131,244,248,141,156,253,131,233,255,141,156,253,131,233,15,183,67,252,254,[m
[32m+[m[32m  15,131,245,255,15,130,244,248,141,156,253,131,233,255,248,2,139,3,15,182,[m
[32m+[m[32m  204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,102,15,46,[m
[32m+[m[32m  193,252,233,244,1,255,141,12,202,139,105,4,129,252,253,239,15,132,244,247,[m
[32m+[m[32m  255,137,105,252,252,139,41,137,105,252,248,252,233,245,255,141,156,253,131,[m
[32m+[m[32m  233,139,1,137,105,252,252,137,65,252,248,255,139,108,36,24,137,149,233,137,[m
[32m+[m[32m  4,36,137,218,137,198,137,252,239,232,251,1,58,139,4,36,139,149,233,255,65,[m
[32m+[m[32m  139,142,233,139,4,129,72,139,128,233,139,108,36,24,65,137,150,233,65,137,[m
[32m+[m[32m  174,233,76,137,36,36,76,137,108,36,8,72,131,252,236,16,252,255,224,255,141,[m
[32m+[m[32m  156,253,131,233,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,[m
[32m+[m[32m  36,252,238,255,137,221,209,252,237,129,229,239,102,65,129,172,253,46,233,[m
[32m+[m[32m  238,15,130,244,152,255,68,139,187,233,139,108,36,24,141,12,202,59,141,233,[m
[32m+[m[32m  15,135,244,25,15,182,139,233,57,200,15,134,244,249,248,2,255,15,183,67,252,[m
[32m+[m[32m  254,252,233,245,255,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,[m
[32m+[m[32m  244,3,252,233,244,2,255,141,44,197,237,141,4,194,68,139,122,252,248,137,104,[m
[32m+[m[32m  252,252,68,137,120,252,248,139,108,36,24,141,12,200,59,141,233,15,135,244,[m
[32m+[m[32m  24,137,209,137,194,15,182,171,233,133,252,237,15,132,244,248,248,1,131,193,[m
[32m+[m[32m  8,57,209,15,131,244,249,68,139,121,252,248,68,137,56,68,139,121,252,252,68,[m
[32m+[m[32m  137,120,4,131,192,8,199,65,252,252,237,131,252,237,1,15,133,244,1,248,2,255,[m
[32m+[m[32m  68,139,187,233,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,[m
[32m+[m[32m  36,252,238,255,248,3,199,64,4,237,131,192,8,131,252,237,1,15,133,244,3,252,[m
[32m+[m[32m  233,244,2,255,139,106,252,248,76,139,189,233,139,108,36,24,141,68,194,252,[m
[32m+[m[32m  248,137,149,233,141,136,233,59,141,233,137,133,233,255,137,252,239,255,76,[m
[32m+[m[32m  137,252,254,137,252,239,255,15,135,244,23,65,199,134,233,237,255,65,252,255,[m
[32m+[m[32m  215,255,65,252,255,150,233,255,139,149,233,65,137,174,233,65,199,134,233,[m
[32m+[m[32m  237,141,12,194,252,247,217,3,141,233,139,90,252,252,252,233,244,12,255,254,[m
[32m+[m[32m  0[m
[32m+[m[32m};[m
[32m+[m
[32m+[m[32m#line 13 "vm_x86.dasc"[m
[32m+[m[32m//|.globals GLOB_[m
[32m+[m[32menum {[m
[32m+[m[32m  GLOB_vm_returnp,[m
[32m+[m[32m  GLOB_cont_dispatch,[m
[32m+[m[32m  GLOB_vm_returnc,[m
[32m+[m[32m  GLOB_vm_unwind_yield,[m
[32m+[m[32m  GLOB_BC_RET_Z,[m
[32m+[m[32m  GLOB_vm_return,[m
[32m+[m[32m  GLOB_vm_leave_cp,[m
[32m+[m[32m  GLOB_vm_leave_unw,[m
[32m+[m[32m  GLOB_vm_unwind_c_eh,[m
[32m+[m[32m  GLOB_vm_unwind_c,[m
[32m+[m[32m  GLOB_vm_unwind_rethrow,[m
[32m+[m[32m  GLOB_vm_unwind_ff,[m
[32m+[m[32m  GLOB_vm_unwind_ff_eh,[m
[32m+[m[32m  GLOB_vm_growstack_c,[m
[32m+[m[32m  GLOB_vm_growstack_v,[m
[32m+[m[32m  GLOB_vm_growstack_f,[m
[32m+[m[32m  GLOB_vm_resume,[m
[32m+[m[32m  GLOB_vm_pcall,[m
[32m+[m[32m  GLOB_vm_call,[m
[32m+[m[32m  GLOB_vm_call_dispatch,[m
[32m+[m[32m  GLOB_vmeta_call,[m
[32m+[m[32m  GLOB_vm_call_dispatch_f,[m
[32m+[m[32m  GLOB_vm_cpcall,[m
[32m+[m[32m  GLOB_cont_ffi_callback,[m
[32m+[m[32m  GLOB_vm_call_tail,[m
[32m+[m[32m  GLOB_cont_cat,[m
[32m+[m[32m  GLOB_cont_ra,[m
[32m+[m[32m  GLOB_BC_CAT_Z,[m
[32m+[m[32m  GLOB_vmeta_tgets,[m
[32m+[m[32m  GLOB_vmeta_tgetb,[m
[32m+[m[32m  GLOB_vmeta_tgetv,[m
[32m+[m[32m  GLOB_vmeta_tgetr,[m
[32m+[m[32m  GLOB_BC_TGETR_Z,[m
[32m+[m[32m  GLOB_BC_TGETR2_Z,[m
[32m+[m[32m  GLOB_vmeta_tsets,[m
[32m+[m[32m  GLOB_vmeta_tsetb,[m
[32m+[m[32m  GLOB_vmeta_tsetv,[m
[32m+[m[32m  GLOB_cont_nop,[m
[32m+[m[32m  GLOB_vmeta_tsetr,[m
[32m+[m[32m  GLOB_BC_TSETR_Z,[m
[32m+[m[32m  GLOB_vmeta_comp,[m
[32m+[m[32m  GLOB_vmeta_binop,[m
[32m+[m[32m  GLOB_cont_condt,[m
[32m+[m[32m  GLOB_cont_condf,[m
[32m+[m[32m  GLOB_vmeta_equal,[m
[32m+[m[32m  GLOB_vmeta_equal_cd,[m
[32m+[m[32m  GLOB_vmeta_istype,[m
[32m+[m[32m  GLOB_vmeta_arith_vno,[m
[32m+[m[32m  GLOB_vmeta_arith_vn,[m
[32m+[m[32m  GLOB_vmeta_arith_nvo,[m
[32m+[m[32m  GLOB_vmeta_arith_nv,[m
[32m+[m[32m  GLOB_vmeta_unm,[m
[32m+[m[32m  GLOB_vmeta_arith_vvo,[m
[32m+[m[32m  GLOB_vmeta_arith_vv,[m
[32m+[m[32m  GLOB_vmeta_len,[m
[32m+[m[32m  GLOB_BC_LEN_Z,[m
[32m+[m[32m  GLOB_vmeta_call_ra,[m
[32m+[m[32m  GLOB_BC_CALLT_Z,[m
[32m+[m[32m  GLOB_vmeta_for,[m
[32m+[m[32m  GLOB_ff_assert,[m
[32m+[m[32m  GLOB_fff_fallback,[m
[32m+[m[32m  GLOB_fff_res_,[m
[32m+[m[32m  GLOB_ff_type,[m
[32m+[m[32m  GLOB_fff_res1,[m
[32m+[m[32m  GLOB_ff_getmetatable,[m
[32m+[m[32m  GLOB_ff_setmetatable,[m
[32m+[m[32m  GLOB_ff_rawget,[m
[32m+[m[32m  GLOB_ff_tonumber,[m
[32m+[m[32m  GLOB_fff_resxmm0,[m
[32m+[m[32m  GLOB_ff_tostring,[m
[32m+[m[32m  GLOB_fff_gcstep,[m
[32m+[m[32m  GLOB_ff_next,[m
[32m+[m[32m  GLOB_fff_res2,[m
[32m+[m[32m  GLOB_fff_res,[m
[32m+[m[32m  GLOB_ff_pairs,[m
[32m+[m[32m  GLOB_ff_ipairs_aux,[m
[32m+[m[32m  GLOB_fff_res0,[m
[32m+[m[32m  GLOB_ff_ipairs,[m
[32m+[m[32m  GLOB_ff_pcall,[m
[32m+[m[32m  GLOB_ff_xpcall,[m
[32m+[m[32m  GLOB_ff_coroutine_resume,[m
[32m+[m[32m  GLOB_ff_coroutine_wrap_aux,[m
[32m+[m[32m  GLOB_ff_coroutine_yield,[m
[32m+[m[32m  GLOB_fff_resi,[m
[32m+[m[32m  GLOB_fff_resn,[m
[32m+[m[32m  GLOB_ff_math_abs,[m
[32m+[m[32m  GLOB_ff_math_floor,[m
[32m+[m[32m  GLOB_vm_floor_sse,[m
[32m+[m[32m  GLOB_ff_math_ceil,[m
[32m+[m[32m  GLOB_vm_ceil_sse,[m
[32m+[m[32m  GLOB_ff_math_sqrt,[m
[32m+[m[32m  GLOB_ff_math_log,[m
[32m+[m[32m  GLOB_ff_math_log10,[m
[32m+[m[32m  GLOB_ff_math_exp,[m
[32m+[m[32m  GLOB_ff_math_sin,[m
[32m+[m[32m  GLOB_ff_math_cos,[m
[32m+[m[32m  GLOB_ff_math_tan,[m
[32m+[m[32m  GLOB_ff_math_asin,[m
[32m+[m[32m  GLOB_ff_math_acos,[m
[32m+[m[32m  GLOB_ff_math_atan,[m
[32m+[m[32m  GLOB_ff_math_sinh,[m
[32m+[m[32m  GLOB_ff_math_cosh,[m
[32m+[m[32m  GLOB_ff_math_tanh,[m
[32m+[m[32m  GLOB_ff_math_pow,[m
[32m+[m[32m  GLOB_ff_math_atan2,[m
[32m+[m[32m  GLOB_ff_math_fmod,[m
[32m+[m[32m  GLOB_ff_math_ldexp,[m
[32m+[m[32m  GLOB_ff_math_frexp,[m
[32m+[m[32m  GLOB_ff_math_modf,[m
[32m+[m[32m  GLOB_vm_trunc_sse,[m
[32m+[m[32m  GLOB_ff_math_min,[m
[32m+[m[32m  GLOB_ff_math_max,[m
[32m+[m[32m  GLOB_ff_string_byte,[m
[32m+[m[32m  GLOB_ff_string_char,[m
[32m+[m[32m  GLOB_fff_newstr,[m
[32m+[m[32m  GLOB_fff_resstr,[m
[32m+[m[32m  GLOB_ff_string_sub,[m
[32m+[m[32m  GLOB_fff_emptystr,[m
[32m+[m[32m  GLOB_ff_string_reverse,[m
[32m+[m[32m  GLOB_ff_string_lower,[m
[32m+[m[32m  GLOB_ff_string_upper,[m
[32m+[m[32m  GLOB_ff_bit_tobit,[m
[32m+[m[32m  GLOB_fff_resbit,[m
[32m+[m[32m  GLOB_ff_bit_band,[m
[32m+[m[32m  GLOB_fff_fallback_bit_op,[m
[32m+[m[32m  GLOB_ff_bit_bor,[m
[32m+[m[32m  GLOB_ff_bit_bxor,[m
[32m+[m[32m  GLOB_ff_bit_bswap,[m
[32m+[m[32m  GLOB_ff_bit_bnot,[m
[32m+[m[32m  GLOB_ff_bit_lshift,[m
[32m+[m[32m  GLOB_ff_bit_rshift,[m
[32m+[m[32m  GLOB_ff_bit_arshift,[m
[32m+[m[32m  GLOB_ff_bit_rol,[m
[32m+[m[32m  GLOB_ff_bit_ror,[m
[32m+[m[32m  GLOB_fff_fallback_2,[m
[32m+[m[32m  GLOB_fff_fallback_1,[m
[32m+[m[32m  GLOB_vm_record,[m
[32m+[m[32m  GLOB_vm_rethook,[m
[32m+[m[32m  GLOB_vm_inshook,[m
[32m+[m[32m  GLOB_cont_hook,[m
[32m+[m[32m  GLOB_vm_hotloop,[m
[32m+[m[32m  GLOB_vm_callhook,[m
[32m+[m[32m  GLOB_vm_hotcall,[m
[32m+[m[32m  GLOB_cont_stitch,[m
[32m+[m[32m  GLOB_vm_profhook,[m
[32m+[m[32m  GLOB_vm_exit_handler,[m
[32m+[m[32m  GLOB_vm_exit_interp,[m
[32m+[m[32m  GLOB_vm_floor,[m
[32m+[m[32m  GLOB_vm_ceil,[m
[32m+[m[32m  GLOB_vm_trunc,[m
[32m+[m[32m  GLOB_vm_mod,[m
[32m+[m[32m  GLOB_vm_powi_sse,[m
[32m+[m[32m  GLOB_vm_cpuid,[m
[32m+[m[32m  GLOB_assert_bad_for_arg_type,[m
[32m+[m[32m  GLOB_vm_ffi_callback,[m
[32m+[m[32m  GLOB_vm_ffi_call,[m
[32m+[m[32m  GLOB_BC_MODVN_Z,[m
[32m+[m[32m  GLOB_BC_TGETS_Z,[m
[32m+[m[32m  GLOB_BC_TSETS_Z,[m
[32m+[m[32m  GLOB__MAX[m
[32m+[m[32m};[m
[32m+[m[32m#line 14 "vm_x86.dasc"[m
[32m+[m[32m//|.globalnames globnames[m
[32m+[m[32mstatic const char *const globnames[] = {[m
[32m+[m[32m  "vm_returnp",[m
[32m+[m[32m  "cont_dispatch",[m
[32m+[m[32m  "vm_returnc",[m
[32m+[m[32m  "vm_unwind_yield",[m
[32m+[m[32m  "BC_RET_Z",[m
[32m+[m[32m  "vm_return",[m
[32m+[m[32m  "vm_leave_cp",[m
[32m+[m[32m  "vm_leave_unw",[m
[32m+[m[32m  "vm_unwind_c_eh",[m
[32m+[m[32m  "vm_unwind_c@8",[m
[32m+[m[32m  "vm_unwind_rethrow",[m
[32m+[m[32m  "vm_unwind_ff@4",[m
[32m+[m[32m  "vm_unwind_ff_eh",[m
[32m+[m[32m  "vm_growstack_c",[m
[32m+[m[32m  "vm_growstack_v",[m
[32m+[m[32m  "vm_growstack_f",[m
[32m+[m[32m  "vm_resume",[m
[32m+[m[32m  "vm_pcall",[m
[32m+[m[32m  "vm_call",[m
[32m+[m[32m  "vm_call_dispatch",[m
[32m+[m[32m  "vmeta_call",[m
[32m+[m[32m  "vm_call_dispatch_f",[m
[32m+[m[32m  "vm_cpcall",[m
[32m+[m[32m  "cont_ffi_callback",[m
[32m+[m[32m  "vm_call_tail",[m
[32m+[m[32m  "cont_cat",[m
[32m+[m[32m  "cont_ra",[m
[32m+[m[32m  "BC_CAT_Z",[m
[32m+[m[32m  "vmeta_tgets",[m
[32m+[m[32m  "vmeta_tgetb",[m
[32m+[m[32m  "vmeta_tgetv",[m
[32m+[m[32m  "vmeta_tgetr",[m
[32m+[m[32m  "BC_TGETR_Z",[m
[32m+[m[32m  "BC_TGETR2_Z",[m
[32m+[m[32m  "vmeta_tsets",[m
[32m+[m[32m  "vmeta_tsetb",[m
[32m+[m[32m  "vmeta_tsetv",[m
[32m+[m[32m  "cont_nop",[m
[32m+[m[32m  "vmeta_tsetr",[m
[32m+[m[32m  "BC_TSETR_Z",[m
[32m+[m[32m  "vmeta_comp",[m
[32m+[m[32m  "vmeta_binop",[m
[32m+[m[32m  "cont_condt",[m
[32m+[m[32m  "cont_condf",[m
[32m+[m[32m  "vmeta_equal",[m
[32m+[m[32m  "vmeta_equal_cd",[m
[32m+[m[32m  "vmeta_istype",[m
[32m+[m[32m  "vmeta_arith_vno",[m
[32m+[m[32m  "vmeta_arith_vn",[m
[32m+[m[32m  "vmeta_arith_nvo",[m
[32m+[m[32m  "vmeta_arith_nv",[m
[32m+[m[32m  "vmeta_unm",[m
[32m+[m[32m  "vmeta_arith_vvo",[m
[32m+[m[32m  "vmeta_arith_vv",[m
[32m+[m[32m  "vmeta_len",[m
[32m+[m[32m  "BC_LEN_Z",[m
[32m+[m[32m  "vmeta_call_ra",[m
[32m+[m[32m  "BC_CALLT_Z",[m
[32m+[m[32m  "vmeta_for",[m
[32m+[m[32m  "ff_assert",[m
[32m+[m[32m  "fff_fallback",[m
[32m+[m[32m  "fff_res_",[m
[32m+[m[32m  "ff_type",[m
[32m+[m[32m  "fff_res1",[m
[32m+[m[32m  "ff_getmetatable",[m
[32m+[m[32m  "ff_setmetatable",[m
[32m+[m[32m  "ff_rawget",[m
[32m+[m[32m  "ff_tonumber",[m
[32m+[m[32m  "fff_resxmm0",[m
[32m+[m[32m  "ff_tostring",[m
[32m+[m[32m  "fff_gcstep",[m
[32m+[m[32m  "ff_next",[m
[32m+[m[32m  "fff_res2",[m
[32m+[m[32m  "fff_res",[m
[32m+[m[32m  "ff_pairs",[m
[32m+[m[32m  "ff_ipairs_aux",[m
[32m+[m[32m  "fff_res0",[m
[32m+[m[32m  "ff_ipairs",[m
[32m+[m[32m  "ff_pcall",[m
[32m+[m[32m  "ff_xpcall",[m
[32m+[m[32m  "ff_coroutine_resume",[m
[32m+[m[32m  "ff_coroutine_wrap_aux",[m
[32m+[m[32m  "ff_coroutine_yield",[m
[32m+[m[32m  "fff_resi",[m
[32m+[m[32m  "fff_resn",[m
[32m+[m[32m  "ff_math_abs",[m
[32m+[m[32m  "ff_math_floor",[m
[32m+[m[32m  "vm_floor_sse",[m
[32m+[m[32m  "ff_math_ceil",[m
[32m+[m[32m  "vm_ceil_sse",[m
[32m+[m[32m  "ff_math_sqrt",[m
[32m+[m[32m  "ff_math_log",[m
[32m+[m[32m  "ff_math_log10",[m
[32m+[m[32m  "ff_math_exp",[m
[32m+[m[32m  "ff_math_sin",[m
[32m+[m[32m  "ff_math_cos",[m
[32m+[m[32m  "ff_math_tan",[m
[32m+[m[32m  "ff_math_asin",[m
[32m+[m[32m  "ff_math_acos",[m
[32m+[m[32m  "ff_math_atan",[m
[32m+[m[32m  "ff_math_sinh",[m
[32m+[m[32m  "ff_math_cosh",[m
[32m+[m[32m  "ff_math_tanh",[m
[32m+[m[32m  "ff_math_pow",[m
[32m+[m[32m  "ff_math_atan2",[m
[32m+[m[32m  "ff_math_fmod",[m
[32m+[m[32m  "ff_math_ldexp",[m
[32m+[m[32m  "ff_math_frexp",[m
[32m+[m[32m  "ff_math_modf",[m
[32m+[m[32m  "vm_trunc_sse",[m
[32m+[m[32m  "ff_math_min",[m
[32m+[m[32m  "ff_math_max",[m
[32m+[m[32m  "ff_string_byte",[m
[32m+[m[32m  "ff_string_char",[m
[32m+[m[32m  "fff_newstr",[m
[32m+[m[32m  "fff_resstr",[m
[32m+[m[32m  "ff_string_sub",[m
[32m+[m[32m  "fff_emptystr",[m
[32m+[m[32m  "ff_string_reverse",[m
[32m+[m[32m  "ff_string_lower",[m
[32m+[m[32m  "ff_string_upper",[m
[32m+[m[32m  "ff_bit_tobit",[m
[32m+[m[32m  "fff_resbit",[m
[32m+[m[32m  "ff_bit_band",[m
[32m+[m[32m  "fff_fallback_bit_op",[m
[32m+[m[32m  "ff_bit_bor",[m
[32m+[m[32m  "ff_bit_bxor",[m
[32m+[m[32m  "ff_bit_bswap",[m
[32m+[m[32m  "ff_bit_bnot",[m
[32m+[m[32m  "ff_bit_lshift",[m
[32m+[m[32m  "ff_bit_rshift",[m
[32m+[m[32m  "ff_bit_arshift",[m
[32m+[m[32m  "ff_bit_rol",[m
[32m+[m[32m  "ff_bit_ror",[m
[32m+[m[32m  "fff_fallback_2",[m
[32m+[m[32m  "fff_fallback_1",[m
[32m+[m[32m  "vm_record",[m
[32m+[m[32m  "vm_rethook",[m
[32m+[m[32m  "vm_inshook",[m
[32m+[m[32m  "cont_hook",[m
[32m+[m[32m  "vm_hotloop",[m
[32m+[m[32m  "vm_callhook",[m
[32m+[m[32m  "vm_hotcall",[m
[32m+[m[32m  "cont_stitch",[m
[32m+[m[32m  "vm_profhook",[m
[32m+[m[32m  "vm_exit_handler",[m
[32m+[m[32m  "vm_exit_interp",[m
[32m+[m[32m  "vm_floor",[m
[32m+[m[32m  "vm_ceil",[m
[32m+[m[32m  "vm_trunc",[m
[32m+[m[32m  "vm_mod",[m
[32m+[m[32m  "vm_powi_sse",[m
[32m+[m[32m  "vm_cpuid",[m
[32m+[m[32m  "assert_bad_for_arg_type",[m
[32m+[m[32m  "vm_ffi_callback",[m
[32m+[m[32m  "vm_ffi_call@4",[m
[32m+[m[32m  "BC_MODVN_Z",[m
[32m+[m[32m  "BC_TGETS_Z",[m
[32m+[m[32m  "BC_TSETS_Z",[m
[32m+[m[32m  (const char *)0[m
[32m+[m[32m};[m
[32m+[m[32m#line 15 "vm_x86.dasc"[m
[32m+[m[32m//|.externnames extnames[m
[32m+[m[32mstatic const char *const extnames[] = {[m
[32m+[m[32m  "lj_state_growstack@8",[m
[32m+[m[32m  "lj_err_throw@8",[m
[32m+[m[32m  "lj_meta_tget",[m
[32m+[m[32m  "lj_tab_getinth@8",[m
[32m+[m[32m  "lj_meta_tset",[m
[32m+[m[32m  "lj_tab_setinth",[m
[32m+[m[32m  "lj_meta_comp",[m
[32m+[m[32m  "lj_meta_equal",[m
[32m+[m[32m  "lj_meta_equal_cd@8",[m
[32m+[m[32m  "lj_meta_istype",[m
[32m+[m[32m  "lj_meta_arith",[m
[32m+[m[32m  "lj_meta_len@8",[m
[32m+[m[32m  "lj_meta_call",[m
[32m+[m[32m  "lj_meta_for@8",[m
[32m+[m[32m  "lj_tab_get",[m
[32m+[m[32m  "lj_strfmt_num@8",[m
[32m+[m[32m  "lj_tab_next",[m
[32m+[m[32m  "lj_ffh_coroutine_wrap_err@8",[m
[32m+[m[32m  "log",[m
[32m+[m[32m  "log10",[m
[32m+[m[32m  "exp",[m
[32m+[m[32m  "sin",[m
[32m+[m[32m  "cos",[m
[32m+[m[32m  "tan",[m
[32m+[m[32m  "asin",[m
[32m+[m[32m  "acos",[m
[32m+[m[32m  "atan",[m
[32m+[m[32m  "sinh",[m
[32m+[m[32m  "cosh",[m
[32m+[m[32m  "tanh",[m
[32m+[m[32m  "pow",[m
[32m+[m[32m  "atan2",[m
[32m+[m[32m  "fmod",[m
[32m+[m[32m  "lj_str_new",[m
[32m+[m[32m  "lj_buf_putstr_reverse@8",[m
[32m+[m[32m  "lj_buf_tostr@4",[m
[32m+[m[32m  "lj_buf_putstr_lower@8",[m
[32m+[m[32m  "lj_buf_putstr_upper@8",[m
[32m+[m[32m  "lj_gc_step@4",[m
[32m+[m[32m  "lj_dispatch_ins@8",[m
[32m+[m[32m  "lj_trace_hot@8",[m
[32m+[m[32m  "lj_dispatch_call@8",[m
[32m+[m[32m  "lj_dispatch_stitch@8",[m
[32m+[m[32m  "lj_dispatch_profile@8",[m
[32m+[m[32m  "lj_trace_exit@8",[m
[32m+[m[32m  "lj_log_trace_direct_exit@8",[m
[32m+[m[32m  "lj_ccallback_enter@8",[m
[32m+[m[32m  "lj_ccallback_leave@8",[m
[32m+[m[32m  "lj_tab_len@4",[m
[32m+[m[32m  "lj_meta_cat",[m
[32m+[m[32m  "lj_gc_barrieruv@8",[m
[32m+[m[32m  "lj_func_closeuv@8",[m
[32m+[m[32m  "lj_func_newL_gc",[m
[32m+[m[32m  "lj_tab_new",[m
[32m+[m[32m  "lj_gc_step_fixtop@4",[m
[32m+[m[32m  "lj_tab_dup@8",[m
[32m+[m[32m  "lj_tab_newkey",[m
[32m+[m[32m  "lj_tab_reasize",[m
[32m+[m[32m  "lj_log_trace_entry@8",[m
[32m+[m[32m  (const char *)0[m
[32m+[m[32m};[m
[32m+[m[32m#line 16 "vm_x86.dasc"[m
[32m+[m[32m//|[m
[32m+[m[32m//|//-----------------------------------------------------------------------[m
[32m+[m[32m//|[m
[32m+[m[32m//|.if P64[m
[32m+[m[32m//|.define X64, 1[m
[32m+[m[32m//|.if WIN[m
[32m+[m[32m//|.define X64WIN, 1[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Fixed register assignments for the interpreter.[m
[32m+[m[32m//|// This is very fragile and has many dependencies. Caveat emptor.[m
[32m+[m[32m//|.define BASE,		edx		// Not C callee-save, refetched anyway.[m
[32m+[m[32m//|.if not X64[m
[32m+[m[32m//|.define KBASE,		edi		// Must be C callee-save.[m
[32m+[m[32m//|.define KBASEa,	KBASE[m
[32m+[m[32m//|.define PC,		esi		// Must be C callee-save.[m
[32m+[m[32m//|.define PCa,		PC[m
[32m+[m[32m//|.define DISPATCH,	ebx		// Must be C callee-save.[m
[32m+[m[32m//|.elif X64WIN[m
[32m+[m[32m//|.define KBASE,		edi		// Must be C callee-save.[m
[32m+[m[32m//|.define KBASEa,	rdi[m
[32m+[m[32m//|.define PC,		esi		// Must be C callee-save.[m
[32m+[m[32m//|.define PCa,		rsi[m
[32m+[m[32m//|.define DISPATCH,	ebx		// Must be C callee-save.[m
[32m+[m[32m//|.else[m
[32m+[m[32m//|.define KBASE,		r15d		// Must be C callee-save.[m
[32m+[m[32m//|.define KBASEa,	r15[m
[32m+[m[32m//|.define PC,		ebx		// Must be C callee-save.[m
[32m+[m[32m//|.define PCa,		rbx[m
[32m+[m[32m//|.define DISPATCH,	r14d		// Must be C callee-save.[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|[m
[32m+[m[32m//|.define RA,		ecx[m
[32m+[m[32m//|.define RAH,		ch[m
[32m+[m[32m//|.define RAL,		cl[m
[32m+[m[32m//|.define RB,		ebp		// Must be ebp (C callee-save).[m
[32m+[m[32m//|.define RC,		eax		// Must be eax.[m
[32m+[m[32m//|.define RCW,		ax[m
[32m+[m[32m//|.define RCH,		ah[m
[32m+[m[32m//|.define RCL,		al[m
[32m+[m[32m//|.define OP,		RB[m
[32m+[m[32m//|.define RD,		RC[m
[32m+[m[32m//|.define RDW,		RCW[m
[32m+[m[32m//|.define RDL,		RCL[m
[32m+[m[32m//|.if X64[m
[32m+[m[32m//|.define RAa, rcx[m
[32m+[m[32m//|.define RBa, rbp[m
[32m+[m[32m//|.define RCa, rax[m
[32m+[m[32m//|.define RDa, rax[m
[32m+[m[32m//|.else[m
[32m+[m[32m//|.define RAa, RA[m
[32m+[m[32m//|.define RBa, RB[m
[32m+[m[32m//|.define RCa, RC[m
[32m+[m[32m//|.define RDa, RD[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|[m
[32m+[m[32m//|.if not X64[m
[32m+[m[32m//|.define FCARG1,	ecx		// x86 fastcall arguments.[m
[32m+[m[32m//|.define FCARG2,	edx[m
[32m+[m[32m//|.elif X64WIN[m
[32m+[m[32m//|.define CARG1,		rcx		// x64/WIN64 C call arguments.[m
[32m+[m[32m//|.define CARG2,		rdx[m
[32m+[m[32m//|.define CARG3,		r8[m
[32m+[m[32m//|.define CARG4,		r9[m
[32m+[m[32m//|.define CARG1d,	ecx[m
[32m+[m[32m//|.define CARG2d,	edx[m
[32m+[m[32m//|.define CARG3d,	r8d[m
[32m+[m[32m//|.define CARG4d,	r9d[m
[32m+[m[32m//|.define FCARG1,	CARG1d		// Upwards compatible to x86 fastcall.[m
[32m+[m[32m//|.define FCARG2,	CARG2d[m
[32m+[m[32m//|.else[m
[32m+[m[32m//|.define CARG1,		rdi		// x64/POSIX C call arguments.[m
[32m+[m[32m//|.define CARG2,		rsi[m
[32m+[m[32m//|.define CARG3,		rdx[m
[32m+[m[32m//|.define CARG4,		rcx[m
[32m+[m[32m//|.define CARG5,		r8[m
[32m+[m[32m//|.define CARG6,		r9[m
[32m+[m[32m//|.define CARG1d,	edi[m
[32m+[m[32m//|.define CARG2d,	esi[m
[32m+[m[32m//|.define CARG3d,	edx[m
[32m+[m[32m//|.define CARG4d,	ecx[m
[32m+[m[32m//|.define CARG5d,	r8d[m
[32m+[m[32m//|.define CARG6d,	r9d[m
[32m+[m[32m//|.define FCARG1,	CARG1d		// Simulate x86 fastcall.[m
[32m+[m[32m//|.define FCARG2,	CARG2d[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Type definitions. Some of these are only used for documentation.[m
[32m+[m[32m//|.type L,		lua_State[m
[32m+[m[32m#define Dt1(_V) (int)(ptrdiff_t)&(((lua_State *)0)_V)[m
[32m+[m[32m#line 106 "vm_x86.dasc"[m
[32m+[m[32m//|.type GL,		global_State[m
[32m+[m[32m#define Dt2(_V) (int)(ptrdiff_t)&(((global_State *)0)_V)[m
[32m+[m[32m#line 107 "vm_x86.dasc"[m
[32m+[m[32m//|.type TVALUE,		TValue[m
[32m+[m[32m#define Dt3(_V) (int)(ptrdiff_t)&(((TValue *)0)_V)[m
[32m+[m[32m#line 108 "vm_x86.dasc"[m
[32m+[m[32m//|.type GCOBJ,		GCobj[m
[32m+[m[32m#define Dt4(_V) (int)(ptrdiff_t)&(((GCobj *)0)_V)[m
[32m+[m[32m#line 109 "vm_x86.dasc"[m
[32m+[m[32m//|.type STR,		GCstr[m
[32m+[m[32m#define Dt5(_V) (int)(ptrdiff_t)&(((GCstr *)0)_V)[m
[32m+[m[32m#line 110 "vm_x86.dasc"[m
[32m+[m[32m//|.type TAB,		GCtab[m
[32m+[m[32m#define Dt6(_V) (int)(ptrdiff_t)&(((GCtab *)0)_V)[m
[32m+[m[32m#line 111 "vm_x86.dasc"[m
[32m+[m[32m//|.type LFUNC,		GCfuncL[m
[32m+[m[32m#define Dt7(_V) (int)(ptrdiff_t)&(((GCfuncL *)0)_V)[m
[32m+[m[32m#line 112 "vm_x86.dasc"[m
[32m+[m[32m//|.type CFUNC,		GCfuncC[m
[32m+[m[32m#define Dt8(_V) (int)(ptrdiff_t)&(((GCfuncC *)0)_V)[m
[32m+[m[32m#line 113 "vm_x86.dasc"[m
[32m+[m[32m//|.type PROTO,		GCproto[m
[32m+[m[32m#define Dt9(_V) (int)(ptrdiff_t)&(((GCproto *)0)_V)[m
[32m+[m[32m#line 114 "vm_x86.dasc"[m
[32m+[m[32m//|.type UPVAL,		GCupval[m
[32m+[m[32m#define DtA(_V) (int)(ptrdiff_t)&(((GCupval *)0)_V)[m
[32m+[m[32m#line 115 "vm_x86.dasc"[m
[32m+[m[32m//|.type NODE,		Node[m
[32m+[m[32m#define DtB(_V) (int)(ptrdiff_t)&(((Node *)0)_V)[m
[32m+[m[32m#line 116 "vm_x86.dasc"[m
[32m+[m[32m//|.type NARGS,		int[m
[32m+[m[32m#define DtC(_V) (int)(ptrdiff_t)&(((int *)0)_V)[m
[32m+[m[32m#line 117 "vm_x86.dasc"[m
[32m+[m[32m//|.type TRACE,		GCtrace[m
[32m+[m[32m#define DtD(_V) (int)(ptrdiff_t)&(((GCtrace *)0)_V)[m
[32m+[m[32m#line 118 "vm_x86.dasc"[m
[32m+[m[32m//|.type SBUF,		SBuf[m
[32m+[m[32m#define DtE(_V) (int)(ptrdiff_t)&(((SBuf *)0)_V)[m
[32m+[m[32m#line 119 "vm_x86.dasc"[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[32m+[m[32m//|//-----------------------------------------------------------------------[m
[32m+[m[32m//|.if not X64		// x86 stack layout.[m
[32m+[m[32m//|[m
[32m+[m[32m//|.define CFRAME_SPACE,	aword*7			// Delta for esp (see <--).[m
[32m+[m[32m//|.macro saveregs_[m
[32m+[m[32m//|  push edi; push esi; push ebx[m
[32m+[m[32m//|  sub esp, CFRAME_SPACE[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro saveregs[m
[32m+[m[32m//|  push ebp; saveregs_[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro restoreregs[m
[32m+[m[32m//|  add esp, CFRAME_SPACE[m
[32m+[m[32m//|  pop ebx; pop esi; pop edi; pop ebp[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|.define SAVE_ERRF,	aword [esp+aword*15]	// vm_pcall/vm_cpcall only.[m
[32m+[m[32m//|.define SAVE_NRES,	aword [esp+aword*14][m
[32m+[m[32m//|.define SAVE_CFRAME,	aword [esp+aword*13][m
[32m+[m[32m//|.define SAVE_L,	aword [esp+aword*12][m
[32m+[m[32m//|//----- 16 byte aligned, ^^^ arguments from C caller[m
[32m+[m[32m//|.define SAVE_RET,	aword [esp+aword*11]	//<-- esp entering interpreter.[m
[32m+[m[32m//|.define SAVE_R4,	aword [esp+aword*10][m
[32m+[m[32m//|.define SAVE_R3,	aword [esp+aword*9][m
[32m+[m[32m//|.define SAVE_R2,	aword [esp+aword*8][m
[32m+[m[32m//|//----- 16 byte aligned[m
[32m+[m[32m//|.define SAVE_R1,	aword [esp+aword*7]	//<-- esp after register saves.[m
[32m+[m[32m//|.define SAVE_PC,	aword [esp+aword*6][m
[32m+[m[32m//|.define TMP2,		aword [esp+aword*5][m
[32m+[m[32m//|.define TMP1,		aword [esp+aword*4][m
[32m+[m[32m//|//----- 16 byte aligned[m
[32m+[m[32m//|.define ARG4,		aword [esp+aword*3][m
[32m+[m[32m//|.define ARG3,		aword [esp+aword*2][m
[32m+[m[32m//|.define ARG2,		aword [esp+aword*1][m
[32m+[m[32m//|.define ARG1,		aword [esp]		//<-- esp while in interpreter.[m
[32m+[m[32m//|//----- 16 byte aligned, ^^^ arguments for C callee[m
[32m+[m[32m//|[m
[32m+[m[32m//|// FPARGx overlaps ARGx and ARG(x+1) on x86.[m
[32m+[m[32m//|.define FPARG3,	qword [esp+qword*1][m
[32m+[m[32m//|.define FPARG1,	qword [esp][m
[32m+[m[32m//|// TMPQ overlaps TMP1/TMP2. ARG5/MULTRES overlap TMP1/TMP2 (and TMPQ).[m
[32m+[m[32m//|.define TMPQ,		qword [esp+aword*4][m
[32m+[m[32m//|.define TMP3,		ARG4[m
[32m+[m[32m//|.define ARG5,		TMP1[m
[32m+[m[32m//|.define TMPa,		TMP1[m
[32m+[m[32m//|.define MULTRES,	TMP2[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Arguments for vm_call and vm_pcall.[m
[32m+[m[32m//|.define INARG_BASE,	SAVE_CFRAME		// Overwritten by SAVE_CFRAME![m
[32m+[m[32m//|[m
[32m+[m[32m//|// Arguments for vm_cpcall.[m
[32m+[m[32m//|.define INARG_CP_CALL,	SAVE_ERRF[m
[32m+[m[32m//|.define INARG_CP_UD,	SAVE_NRES[m
[32m+[m[32m//|.define INARG_CP_FUNC,	SAVE_CFRAME[m
[32m+[m[32m//|[m
[32m+[m[32m//|//-----------------------------------------------------------------------[m
[32m+[m[32m//|.elif X64WIN		// x64/Windows stack layout[m
[32m+[m[32m//|[m
[32m+[m[32m//|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[32m+[m[32m//|.macro saveregs_[m
[32m+[m[32m//|  push rdi; push rsi; push rbx[m
[32m+[m[32m//|  sub rsp, CFRAME_SPACE[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro saveregs[m
[32m+[m[32m//|  push rbp; saveregs_[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro restoreregs[m
[32m+[m[32m//|  add rsp, CFRAME_SPACE[m
[32m+[m[32m//|  pop rbx; pop rsi; pop rdi; pop rbp[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|.define SAVE_CFRAME,	aword [rsp+aword*13][m
[32m+[m[32m//|.define SAVE_PC,	dword [rsp+dword*25][m
[32m+[m[32m//|.define SAVE_L,	dword [rsp+dword*24][m
[32m+[m[32m//|.define SAVE_ERRF,	dword [rsp+dword*23][m
[32m+[m[32m//|.define SAVE_NRES,	dword [rsp+dword*22][m
[32m+[m[32m//|.define TMP2,		dword [rsp+dword*21][m
[32m+[m[32m//|.define TMP1,		dword [rsp+dword*20][m
[32m+[m[32m//|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter[m
[32m+[m[32m//|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[32m+[m[32m//|.define SAVE_R4,	aword [rsp+aword*8][m
[32m+[m[32m//|.define SAVE_R3,	aword [rsp+aword*7][m
[32m+[m[32m//|.define SAVE_R2,	aword [rsp+aword*6][m
[32m+[m[32m//|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[32m+[m[32m//|.define ARG5,		aword [rsp+aword*4][m
[32m+[m[32m//|.define CSAVE_4,	aword [rsp+aword*3][m
[32m+[m[32m//|.define CSAVE_3,	aword [rsp+aword*2][m
[32m+[m[32m//|.define CSAVE_2,	aword [rsp+aword*1][m
[32m+[m[32m//|.define CSAVE_1,	aword [rsp]		//<-- rsp while in interpreter.[m
[32m+[m[32m//|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee[m
[32m+[m[32m//|[m
[32m+[m[32m//|// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ).[m
[32m+[m[32m//|.define TMPQ,		qword [rsp+aword*10][m
[32m+[m[32m//|.define MULTRES,	TMP2[m
[32m+[m[32m//|.define TMPa,		ARG5[m
[32m+[m[32m//|.define ARG5d,		dword [rsp+aword*4][m
[32m+[m[32m//|.define TMP3,		ARG5d[m
[32m+[m[32m//|[m
[32m+[m[32m//|//-----------------------------------------------------------------------[m
[32m+[m[32m//|.else			// x64/POSIX stack layout[m
[32m+[m[32m//|[m
[32m+[m[32m//|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[32m+[m[32m//|.macro saveregs_[m
[32m+[m[32m//|  push rbx; push r15; push r14[m
[32m+[m[32m//|.if NO_UNWIND[m
[32m+[m[32m//|  push r13; push r12[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|  sub rsp, CFRAME_SPACE[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro saveregs[m
[32m+[m[32m//|  push rbp; saveregs_[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro restoreregs[m
[32m+[m[32m//|  add rsp, CFRAME_SPACE[m
[32m+[m[32m//|.if NO_UNWIND[m
[32m+[m[32m//|  pop r12; pop r13[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|  pop r14; pop r15; pop rbx; pop rbp[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|//----- 16 byte aligned,[m
[32m+[m[32m//|.if NO_UNWIND[m
[32m+[m[32m//|.define SAVE_RET,	aword [rsp+aword*11]	//<-- rsp entering interpreter.[m
[32m+[m[32m//|.define SAVE_R4,	aword [rsp+aword*10][m
[32m+[m[32m//|.define SAVE_R3,	aword [rsp+aword*9][m
[32m+[m[32m//|.define SAVE_R2,	aword [rsp+aword*8][m
[32m+[m[32m//|.define SAVE_R1,	aword [rsp+aword*7][m
[32m+[m[32m//|.define SAVE_RU2,	aword [rsp+aword*6][m
[32m+[m[32m//|.define SAVE_RU1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[32m+[m[32m//|.else[m
[32m+[m[32m//|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[32m+[m[32m//|.define SAVE_R4,	aword [rsp+aword*8][m
[32m+[m[32m//|.define SAVE_R3,	aword [rsp+aword*7][m
[32m+[m[32m//|.define SAVE_R2,	aword [rsp+aword*6][m
[32m+[m[32m//|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|.define SAVE_CFRAME,	aword [rsp+aword*4][m
[32m+[m[32m//|.define SAVE_PC,	dword [rsp+dword*7][m
[32m+[m[32m//|.define SAVE_L,	dword [rsp+dword*6][m
[32m+[m[32m//|.define SAVE_ERRF,	dword [rsp+dword*5][m
[32m+[m[32m//|.define SAVE_NRES,	dword [rsp+dword*4][m
[32m+[m[32m//|.define TMPa,		aword [rsp+aword*1][m
[32m+[m[32m//|.define TMP2,		dword [rsp+dword*1][m
[32m+[m[32m//|.define TMP1,		dword [rsp]		//<-- rsp while in interpreter.[m
[32m+[m[32m//|//----- 16 byte aligned[m
[32m+[m[32m//|[m
[32m+[m[32m//|// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ).[m
[32m+[m[32m//|.define TMPQ,		qword [rsp][m
[32m+[m[32m//|.define TMP3,		dword [rsp+aword*1][m
[32m+[m[32m//|.define MULTRES,	TMP2[m
[32m+[m[32m//|[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|[m
[32m+[m[32m//|//-----------------------------------------------------------------------[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Instruction headers.[m
[32m+[m[32m//|.macro ins_A; .endmacro[m
[32m+[m[32m//|.macro ins_AD; .endmacro[m
[32m+[m[32m//|.macro ins_AJ; .endmacro[m
[32m+[m[32m//|.macro ins_ABC; movzx RB, RCH; movzx RC, RCL; .endmacro[m
[32m+[m[32m//|.macro ins_AB_; movzx RB, RCH; .endmacro[m
[32m+[m[32m//|.macro ins_A_C; movzx RC, RCL; .endmacro[m
[32m+[m[32m//|.macro ins_AND; not RDa; .endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster).[m
[32m+[m[32m//|.macro ins_NEXT[m
[32m+[m[32m//|  mov RC, [PC][m
[32m+[m[32m//|  movzx RA, RCH[m
[32m+[m[32m//|  movzx OP, RCL[m
[32m+[m[32m//|  add PC, 4[m
[32m+[m[32m//|  shr RC, 16[m
[32m+[m[32m//|.if X64[m
[32m+[m[32m//|  jmp aword [DISPATCH+OP*8][m
[32m+[m[32m//|.else[m
[32m+[m[32m//|  jmp aword [DISPATCH+OP*4][m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Instruction footer.[m
[32m+[m[32m//|.if 1[m
[32m+[m[32m//|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[32m+[m[32m//|  .define ins_next, ins_NEXT[m
[32m+[m[32m//|  .define ins_next_, ins_NEXT[m
[32m+[m[32m//|.else[m
[32m+[m[32m//|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[32m+[m[32m//|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[32m+[m[32m//|  // Around 10%-30% slower on Core2, a lot more slower on P4.[m
[32m+[m[32m//|  .macro ins_next[m
[32m+[m[32m//|    jmp ->ins_next[m
[32m+[m[32m//|  .endmacro[m
[32m+[m[32m//|  .macro ins_next_[m
[32m+[m[32m//|  ->ins_next:[m
[32m+[m[32m//|    ins_NEXT[m
[32m+[m[32m//|  .endmacro[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Call decode and dispatch.[m
[32m+[m[32m//|.macro ins_callt[m
[32m+[m[32m//|  // BASE = new base, RB = LFUNC, RD = nargs+1, [BASE-4] = PC[m
[32m+[m[32m//|  mov PC, LFUNC:RB->pc[m
[32m+[m[32m//|  mov RA, [PC][m
[32m+[m[32m//|  movzx OP, RAL[m
[32m+[m[32m//|  movzx RA, RAH[m
[32m+[m[32m//|  add PC, 4[m
[32m+[m[32m//|.if X64[m
[32m+[m[32m//|  jmp aword [DISPATCH+OP*8][m
[32m+[m[32m//|.else[m
[32m+[m[32m//|  jmp aword [DISPATCH+OP*4][m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|.macro ins_call[m
[32m+[m[32m//|  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[32m+[m[32m//|  mov [BASE-4], PC[m
[32m+[m[32m//|  ins_callt[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|//-----------------------------------------------------------------------[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Macros to test operand types.[m
[32m+[m[32m//|.macro checktp, reg, tp;  cmp dword [BASE+reg*8+4], tp; .endmacro[m
[32m+[m[32m//|.macro checknum, reg, target; checktp reg, LJ_TISNUM; jae target; .endmacro[m
[32m+[m[32m//|.macro checkint, reg, target; checktp reg, LJ_TISNUM; jne target; .endmacro[m
[32m+[m[32m//|.macro checkstr, reg, target; checktp reg, LJ_TSTR; jne target; .endmacro[m
[32m+[m[32m//|.macro checktab, reg, target; checktp reg, LJ_TTAB; jne target; .endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|// These operands must be used with movzx.[m
[32m+[m[32m//|.define PC_OP, byte [PC-4][m
[32m+[m[32m//|.define PC_RA, byte [PC-3][m
[32m+[m[32m//|.define PC_RB, byte [PC-1][m
[32m+[m[32m//|.define PC_RC, byte [PC-2][m
[32m+[m[32m//|.define PC_RD, word [PC-2][m
[32m+[m[32m//|[m
[32m+[m[32m//|.macro branchPC, reg[m
[32m+[m[32m//|  lea PC, [PC+reg*4-BCBIAS_J*4][m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Assumes DISPATCH is relative to GL.[m
[32m+[m[32m#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[32m+[m[32m#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[32m+[m[32m//|[m
[32m+[m[32m#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Decrement hashed hotcount and trigger trace recorder if zero.[m
[32m+[m[32m//|.macro hotloop, reg[m
[32m+[m[32m//|  mov reg, PC[m
[32m+[m[32m//|  shr reg, 1[m
[32m+[m[32m//|  and reg, HOTCOUNT_PCMASK[m
[32m+[m[32m//|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP[m
[32m+[m[32m//|  jb ->vm_hotloop[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|.macro hotcall, reg[m
[32m+[m[32m//|  mov reg, PC[m
[32m+[m[32m//|  shr reg, 1[m
[32m+[m[32m//|  and reg, HOTCOUNT_PCMASK[m
[32m+[m[32m//|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL[m
[32m+[m[32m//|  jb ->vm_hotcall[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Set current VM state.[m
[32m+[m[32m//|.macro set_vmstate, st[m
[32m+[m[32m//|  mov dword [DISPATCH+DISPATCH_GL(vmstate)], ~LJ_VMST_..st[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|// x87 compares.[m
[32m+[m[32m//|.macro fcomparepp			// Compare and pop st0 >< st1.[m
[32m+[m[32m//|  fucomip st1[m
[32m+[m[32m//|  fpop[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|.macro fpop1; fstp st1; .endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Synthesize SSE FP constants.[m
[32m+[m[32m//|.macro sseconst_abs, reg, tmp		// Synthesize abs mask.[m
[32m+[m[32m//|.if X64[m
[32m+[m[32m//|  mov64 tmp, U64x(7fffffff,ffffffff); movd reg, tmp[m
[32m+[m[32m//|.else[m
[32m+[m[32m//|  pxor reg, reg; pcmpeqd reg, reg; psrlq reg, 1[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|.macro sseconst_hi, reg, tmp, val	// Synthesize hi-32 bit const.[m
[32m+[m[32m//|.if X64[m
[32m+[m[32m//|  mov64 tmp, U64x(val,00000000); movd reg, tmp[m
[32m+[m[32m//|.else[m
[32m+[m[32m//|  mov tmp, 0x .. val; movd reg, tmp; pshufd reg, reg, 0x51[m
[32m+[m[32m//|.endif[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|.macro sseconst_sign, reg, tmp		// Synthesize sign mask.[m
[32m+[m[32m//|  sseconst_hi reg, tmp, 80000000[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro sseconst_1, reg, tmp		// Synthesize 1.0.[m
[32m+[m[32m//|  sseconst_hi reg, tmp, 3ff00000[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro sseconst_m1, reg, tmp		// Synthesize -1.0.[m
[32m+[m[32m//|  sseconst_hi reg, tmp, bff00000[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro sseconst_2p52, reg, tmp		// Synthesize 2^52.[m
[32m+[m[32m//|  sseconst_hi reg, tmp, 43300000[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|.macro sseconst_tobit, reg, tmp	// Synthesize 2^52 + 2^51.[m
[32m+[m[32m//|  sseconst_hi reg, tmp, 43380000[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|// Move table write barrier back. Overwrites reg.[m
[32m+[m[32m//|.macro barrierback, tab, reg[m
[32m+[m[32m//|  and byte tab->marked, (uint8_t)~LJ_GC_BLACK	// black2gray(tab)[m
[32m+[m[32m//|  mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)][m
[32m+[m[32m//|  mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab[m
[32m+[m[32m//|  mov tab->gclist, reg[m
[32m+[m[32m//|.endmacro[m
[32m+[m[32m//|[m
[32m+[m[32m//|//-----------------------------------------------------------------------[m
[32m+[m
[32m+[m[32m/* Generate subroutines used by opcodes and other parts of the VM. */[m
[32m+[m[32m/* The .code_sub section should be last to help static branch prediction. */[m
[32m+[m[32mstatic void build_subroutines(BuildCtx *ctx)[m
[32m+[m[32m{[m
[32m+[m[32m  //|.code_sub[m
[32m+[m[32m  dasm_put(Dst, 0);[m
[32m+[m[32m#line 442 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Return handling ----------------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_returnp:[m
[32m+[m[32m  //|  test PC, FRAME_P[m
[32m+[m[32m  //|  jz ->cont_dispatch[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  // Return from pcall or xpcall fast func.[m
[32m+[m[32m  //|  and PC, -8[m
[32m+[m[32m  //|  sub BASE, PC			// Restore caller base.[m
[32m+[m[32m  //|  lea RAa, [RA+PC-8]			// Rebase RA and prepend one result.[m
[32m+[m[32m  //|  mov PC, [BASE-4]			// Fetch PC of previous frame.[m
[32m+[m[32m  //|  // Prepending may overwrite the pcall frame, so do it at the end.[m
[32m+[m[32m  //|  mov dword [BASE+RA+4], LJ_TTRUE	// Prepend true to results.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_returnc:[m
[32m+[m[32m  //|  add RD, 1				// RD = nresults+1[m
[32m+[m[32m  //|  jz ->vm_unwind_yield[m
[32m+[m[32m  //|  mov MULTRES, RD[m
[32m+[m[32m  //|  test PC, FRAME_TYPE[m
[32m+[m[32m  //|  jz ->BC_RET_Z			// Handle regular return to Lua.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_return:[m
[32m+[m[32m  //|  // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return[m
[32m+[m[32m  //|  xor PC, FRAME_C[m
[32m+[m[32m  //|  test PC, FRAME_TYPE[m
[32m+[m[32m  //|  jnz ->vm_returnp[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  // Return to C.[m
[32m+[m[32m  //|  set_vmstate C[m
[32m+[m[32m  //|  and PC, -8[m
[32m+[m[32m  //|  sub PC, BASE[m
[32m+[m[32m  //|  neg PC				// Previous base = BASE - delta.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  sub RD, 1[m
[32m+[m[32m  //|  jz >2[m
[32m+[m[32m  //|1:  // Move results down.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [BASE+RA][m
[32m+[m[32m  dasm_put(Dst, 2, FRAME_P, LJ_TTRUE, FRAME_TYPE, FRAME_C, FRAME_TYPE, DISPATCH_GL(vmstate), ~LJ_VMST_C);[m
[32m+[m[32m#line 483 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov [BASE-8], RBa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [BASE+RA][m
[32m+[m[32m  //|  mov [BASE-8], RB[m
[32m+[m[32m  //|  mov RB, [BASE+RA+4][m
[32m+[m[32m  //|  mov [BASE-4], RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  add BASE, 8[m
[32m+[m[32m  //|  sub RD, 1[m
[32m+[m[32m  //|  jnz <1[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, PC[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  mov RD, MULTRES[m
[32m+[m[32m  //|  mov RA, SAVE_NRES			// RA = wanted nresults+1[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|  cmp RA, RD[m
[32m+[m[32m  //|  jne >6				// More/less results wanted?[m
[32m+[m[32m  //|5:[m
[32m+[m[32m  //|  sub BASE, 8[m
[32m+[m[32m  //|  mov L:RB->top, BASE[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_leave_cp:[m
[32m+[m[32m  //|  mov RAa, SAVE_CFRAME		// Restore previous C frame.[m
[32m+[m[32m  //|  mov L:RB->cframe, RAa[m
[32m+[m[32m  //|  xor eax, eax			// Ok return status for vm_pcall.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_leave_unw:[m
[32m+[m[32m  //|  restoreregs[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|6:[m
[32m+[m[32m  //|  jb >7				// Less results wanted?[m
[32m+[m[32m  //|  // More results wanted. Check stack size and fill up results with nil.[m
[32m+[m[32m  //|  cmp BASE, L:RB->maxstack[m
[32m+[m[32m  //|  ja >8[m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TNIL[m
[32m+[m[32m  dasm_put(Dst, 92, Dt1(->base), Dt1(->top), Dt1(->cframe), Dt1(->maxstack));[m
[32m+[m[32m#line 521 "vm_x86.dasc"[m
[32m+[m[32m  //|  add BASE, 8[m
[32m+[m[32m  //|  add RD, 1[m
[32m+[m[32m  //|  jmp <4[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|7:  // Less results wanted.[m
[32m+[m[32m  //|  test RA, RA[m
[32m+[m[32m  //|  jz <5				// But check for LUA_MULTRET+1.[m
[32m+[m[32m  //|  sub RA, RD				// Negative result![m
[32m+[m[32m  //|  lea BASE, [BASE+RA*8]		// Correct top.[m
[32m+[m[32m  //|  jmp <5[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|8:  // Corner case: need to grow stack for filling up results.[m
[32m+[m[32m  //|  // This can happen if:[m
[32m+[m[32m  //|  // - A C function grows the stack (a lot).[m
[32m+[m[32m  //|  // - The GC shrinks the stack in between.[m
[32m+[m[32m  //|  // - A return back from a lua_call() with (high) nresults adjustment.[m
[32m+[m[32m  //|  mov L:RB->top, BASE		// Save current top held in BASE (yes).[m
[32m+[m[32m  //|  mov MULTRES, RD			// Need to fill only remainder with nil.[m
[32m+[m[32m  //|  mov FCARG2, RA[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[32m+[m[32m  //|  mov BASE, L:RB->top		// Need the (realloced) L->top in BASE.[m
[32m+[m[32m  //|  jmp <3[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_unwind_yield:[m
[32m+[m[32m  //|  mov al, LUA_YIELD[m
[32m+[m[32m  //|  jmp ->vm_unwind_c_eh[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_unwind_c@8:			// Unwind C stack, return from vm_pcall.[m
[32m+[m[32m  //|  // (void *cframe, int errcode)[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov eax, CARG2d			// Error return status for vm_pcall.[m
[32m+[m[32m  //|  mov rsp, CARG1[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov eax, FCARG2			// Error return status for vm_pcall.[m
[32m+[m[32m  //|  mov esp, FCARG1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  dasm_put(Dst, 187, LJ_TNIL, Dt1(->top), Dt1(->top), LUA_YIELD);[m
[32m+[m[32m#line 560 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov GL:RB, L:RB->glref[m
[32m+[m[32m  //|  mov dword GL:RB->vmstate, ~LJ_VMST_C[m
[32m+[m[32m  //|  jmp ->vm_leave_unw[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_unwind_rethrow:[m
[32m+[m[32m  //|.if X64 and not X64WIN[m
[32m+[m[32m  //|  mov FCARG1, SAVE_L[m
[32m+[m[32m  //|  mov FCARG2, eax[m
[32m+[m[32m  //|  restoreregs[m
[32m+[m[32m  //|  jmp extern lj_err_throw@8		// (lua_State *L, int errcode)[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_unwind_ff@4:			// Unwind C stack, return from ff pcall.[m
[32m+[m[32m  //|  // (void *cframe)[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  and CARG1, CFRAME_RAWMASK[m
[32m+[m[32m  //|  mov rsp, CARG1[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  and FCARG1, CFRAME_RAWMASK[m
[32m+[m[32m  //|  mov esp, FCARG1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov RAa, -8			// Results start at BASE+RA = BASE-8.[m
[32m+[m[32m  //|  mov RD, 1+1			// Really 1+2 results, incr. later.[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[32m+[m[32m  //|  add DISPATCH, GG_G2DISP[m
[32m+[m[32m  //|  mov PC, [BASE-4]			// Fetch PC of previous frame.[m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TFALSE	// Prepend false to error message.[m
[32m+[m[32m  //|  set_vmstate INTERP[m
[32m+[m[32m  //|  jmp ->vm_returnc			// Increments RD/MULTRES and returns.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Grow stack for calls -----------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_growstack_c:			// Grow stack for C function.[m
[32m+[m[32m  //|  mov FCARG2, LUA_MINSTACK[m
[32m+[m[32m  dasm_put(Dst, 264, Dt1(->glref), Dt2(->vmstate), ~LJ_VMST_C, CFRAME_RAWMASK, 1+1, Dt1(->base), Dt1(->glref), GG_G2DISP, LJ_TFALSE, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP);[m
[32m+[m[32m#line 599 "vm_x86.dasc"[m
[32m+[m[32m  //|  jmp >2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_growstack_v:			// Grow stack for vararg Lua function.[m
[32m+[m[32m  //|  sub RD, 8[m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_growstack_f:			// Grow stack for fixarg Lua function.[m
[32m+[m[32m  //|  // BASE = new base, RD = nargs+1, RB = L, PC = first PC[m
[32m+[m[32m  //|  lea RD, [BASE+NARGS:RD*8-8][m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  movzx RA, byte [PC-4+PC2PROTO(framesize)][m
[32m+[m[32m  //|  add PC, 4				// Must point after first instruction.[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov L:RB->top, RD[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  mov FCARG2, RA[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  // RB = L, L->base = new base, L->top = top[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov RD, L:RB->top[m
[32m+[m[32m  //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m  //|  sub RD, BASE[m
[32m+[m[32m  //|  shr RD, 3[m
[32m+[m[32m  //|  add NARGS:RD, 1[m
[32m+[m[32m  //|  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[32m+[m[32m  //|  ins_callt				// Just retry the call.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Entry points into the assembler VM ---------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_resume:				// Setup C frame and resume thread.[m
[32m+[m[32m  //|  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[32m+[m[32m  //|  saveregs[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[32m+[m[32m  //|  mov SAVE_L, CARG1d[m
[32m+[m[32m  //|  mov RA, CARG2d[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov RA, INARG_BASE			// Caveat: overlaps SAVE_CFRAME![m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov PC, FRAME_CP[m
[32m+[m[32m  //|  xor RD, RD[m
[32m+[m[32m  //|  lea KBASEa, [esp+CFRAME_RESUME][m
[32m+[m[32m  //|  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[32m+[m[32m  //|  add DISPATCH, GG_G2DISP[m
[32m+[m[32m  dasm_put(Dst, 363, LUA_MINSTACK, -4+PC2PROTO(framesize), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top), Dt7(->pc), FRAME_CP, CFRAME_RESUME, Dt1(->glref));[m
[32m+[m[32m#line 648 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov SAVE_PC, RD			// Any value outside of bytecode is ok.[m
[32m+[m[32m  //|  mov SAVE_CFRAME, RDa[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov SAVE_NRES, RD[m
[32m+[m[32m  //|  mov SAVE_ERRF, RD[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov L:RB->cframe, KBASEa[m
[32m+[m[32m  //|  cmp byte L:RB->status, RDL[m
[32m+[m[32m  //|  je >2				// Initial resume (like a call).[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  // Resume after yield (like a return).[m
[32m+[m[32m  //|  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[32m+[m[32m  //|  set_vmstate INTERP[m
[32m+[m[32m  //|  mov byte L:RB->status, RDL[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov RD, L:RB->top[m
[32m+[m[32m  //|  sub RD, RA[m
[32m+[m[32m  //|  shr RD, 3[m
[32m+[m[32m  //|  add RD, 1				// RD = nresults+1[m
[32m+[m[32m  //|  sub RA, BASE			// RA = resultofs[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov MULTRES, RD[m
[32m+[m[32m  //|  test PC, FRAME_TYPE[m
[32m+[m[32m  //|  jz ->BC_RET_Z[m
[32m+[m[32m  //|  jmp ->vm_return[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_pcall:				// Setup protected C frame and enter VM.[m
[32m+[m[32m  //|  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[32m+[m[32m  //|  saveregs[m
[32m+[m[32m  //|  mov PC, FRAME_CP[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov SAVE_ERRF, CARG4d[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_call:				// Setup C frame and enter VM.[m
[32m+[m[32m  //|  // (lua_State *L, TValue *base, int nres1)[m
[32m+[m[32m  //|  saveregs[m
[32m+[m[32m  dasm_put(Dst, 492, GG_G2DISP, Dt1(->cframe), Dt1(->status), DISPATCH_GL(cur_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->status), Dt1(->base), Dt1(->top), FRAME_TYPE, FRAME_CP);[m
[32m+[m[32m#line 686 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov PC, FRAME_C[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|1:  // Entry point for vm_pcall above (PC = ftype).[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov SAVE_NRES, CARG3d[m
[32m+[m[32m  //|  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[32m+[m[32m  //|  mov SAVE_L, CARG1d[m
[32m+[m[32m  //|  mov RA, CARG2d[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov RA, INARG_BASE			// Caveat: overlaps SAVE_CFRAME![m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[32m+[m[32m  //|  mov KBASEa, L:RB->cframe		// Add our C frame to cframe chain.[m
[32m+[m[32m  //|  mov SAVE_CFRAME, KBASEa[m
[32m+[m[32m  //|  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[32m+[m[32m  //|  add DISPATCH, GG_G2DISP[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:RB->cframe, rsp[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:RB->cframe, esp[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|2:  // Entry point for vm_resume/vm_cpcall (RA = base, RB = L, PC = ftype).[m
[32m+[m[32m  //|  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[32m+[m[32m  //|  set_vmstate INTERP[m
[32m+[m[32m  //|  mov BASE, L:RB->base		// BASE = old base (used in vmeta_call).[m
[32m+[m[32m  //|  add PC, RA[m
[32m+[m[32m  //|  sub PC, BASE			// PC = frame delta + frame type[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  mov RD, L:RB->top[m
[32m+[m[32m  //|  sub RD, RA[m
[32m+[m[32m  //|  shr NARGS:RD, 3[m
[32m+[m[32m  //|  add NARGS:RD, 1			// RD = nargs+1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_call_dispatch:[m
[32m+[m[32m  //|  mov LFUNC:RB, [RA-8][m
[32m+[m[32m  //|  cmp dword [RA-4], LJ_TFUNC[m
[32m+[m[32m  //|  jne ->vmeta_call			// Ensure KBASE defined and != BASE.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_call_dispatch_f:[m
[32m+[m[32m  //|  mov BASE, RA[m
[32m+[m[32m  //|  ins_call[m
[32m+[m[32m  //|  // BASE = new base, RB = func, RD = nargs+1, PC = caller PC[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_cpcall:				// Setup protected C frame, call C.[m
[32m+[m[32m  //|  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[32m+[m[32m  //|  saveregs[m
[32m+[m[32m  dasm_put(Dst, 598, FRAME_C, Dt1(->glref), Dt1(->cframe), GG_G2DISP, Dt1(->cframe), DISPATCH_GL(cur_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top), LJ_TFUNC, Dt7(->pc));[m
[32m+[m[32m#line 735 "vm_x86.dasc"[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[32m+[m[32m  //|  mov SAVE_L, CARG1d[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  // Caveat: INARG_CP_* and SAVE_CFRAME/SAVE_NRES/SAVE_ERRF overlap![m
[32m+[m[32m  //|  mov RC, INARG_CP_UD		// Get args before they are overwritten.[m
[32m+[m[32m  //|  mov RA, INARG_CP_FUNC[m
[32m+[m[32m  //|  mov BASE, INARG_CP_CALL[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  mov KBASE, L:RB->stack		// Compute -savestack(L, L->top).[m
[32m+[m[32m  //|  sub KBASE, L:RB->top[m
[32m+[m[32m  //|   mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[32m+[m[32m  //|  mov SAVE_ERRF, 0			// No error function.[m
[32m+[m[32m  //|  mov SAVE_NRES, KBASE		// Neg. delta means cframe w/o frame.[m
[32m+[m[32m  //|   add DISPATCH, GG_G2DISP[m
[32m+[m[32m  //|  // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe).[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov KBASEa, L:RB->cframe		// Add our C frame to cframe chain.[m
[32m+[m[32m  //|  mov SAVE_CFRAME, KBASEa[m
[32m+[m[32m  //|  mov L:RB->cframe, rsp[m
[32m+[m[32m  //|  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  call CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG3, RC			// Have to copy args downwards.[m
[32m+[m[32m  //|  mov ARG2, RA[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.[m
[32m+[m[32m  //|  mov SAVE_CFRAME, KBASE[m
[32m+[m[32m  //|  mov L:RB->cframe, esp[m
[32m+[m[32m  //|  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  call BASE			// (lua_State *L, lua_CFunction func, void *ud)[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  // TValue * (new base) or NULL returned in eax (RC).[m
[32m+[m[32m  //|  test RC, RC[m
[32m+[m[32m  //|  jz ->vm_leave_cp			// No base? Just remove C frame.[m
[32m+[m[32m  //|  mov RA, RC[m
[32m+[m[32m  //|  mov PC, FRAME_CP[m
[32m+[m[32m  //|  jmp <2				// Else continue with the call.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Metamethod handling ------------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Continuation dispatch ----------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->cont_dispatch:[m
[32m+[m[32m  //|  // BASE = meta base, RA = resultofs, RD = nresults+1 (also in MULTRES)[m
[32m+[m[32m  //|  add RA, BASE[m
[32m+[m[32m  //|  and PC, -8[m
[32m+[m[32m  //|  mov RB, BASE[m
[32m+[m[32m  //|  sub BASE, PC			// Restore caller BASE.[m
[32m+[m[32m  //|  mov dword [RA+RD*8-4], LJ_TNIL	// Ensure one valid arg.[m
[32m+[m[32m  //|  mov RC, RA				// ... in [RC][m
[32m+[m[32m  //|  mov PC, [RB-12]			// Restore PC from [cont|PC].[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  movsxd RAa, dword [RB-16]		// May be negative on WIN64 with debug.[m
[32m+[m[32m  //|.if FFI[m
[32m+[m[32m  //|  cmp RA, 1[m
[32m+[m[32m  //|  jbe >1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  lea KBASEa, qword [=>0][m
[32m+[m[32m  //|  add RAa, KBASEa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RA, dword [RB-16][m
[32m+[m[32m  //|.if FFI[m
[32m+[m[32m  //|  cmp RA, 1[m
[32m+[m[32m  //|  jbe >1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov LFUNC:KBASE, [BASE-8][m
[32m+[m[32m  //|  mov KBASE, LFUNC:KBASE->pc[m
[32m+[m[32m  //|  mov KBASE, [KBASE+PC2PROTO(k)][m
[32m+[m[32m  dasm_put(Dst, 729, Dt1(->stack), Dt1(->top), Dt1(->glref), GG_G2DISP, Dt1(->cframe), Dt1(->cframe), DISPATCH_GL(cur_L), FRAME_CP, LJ_TNIL, 0, Dt7(->pc));[m
[32m+[m[32m#line 814 "vm_x86.dasc"[m
[32m+[m[32m  //|  // BASE = base, RC = result, RB = meta base[m
[32m+[m[32m  //|  jmp RAa				// Jump to continuation.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.if FFI[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  je ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[32m+[m[32m  //|  // cont = 0: Tail call from C function.[m
[32m+[m[32m  //|  sub RB, BASE[m
[32m+[m[32m  //|  shr RB, 3[m
[32m+[m[32m  //|  lea RD, [RB-1][m
[32m+[m[32m  //|  jmp ->vm_call_tail[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->cont_cat:				// BASE = base, RC = result, RB = mbase[m
[32m+[m[32m  //|  movzx RA, PC_RB[m
[32m+[m[32m  //|  sub RB, 16[m
[32m+[m[32m  //|  lea RA, [BASE+RA*8][m
[32m+[m[32m  //|  sub RA, RB[m
[32m+[m[32m  //|  je ->cont_ra[m
[32m+[m[32m  //|  neg RA[m
[32m+[m[32m  //|  shr RA, 3[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  mov CARG3d, RA[m
[32m+[m[32m  //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m  //|  mov L:CARG1d->base, BASE[m
[32m+[m[32m  //|  mov RCa, [RC][m
[32m+[m[32m  //|  mov [RB], RCa[m
[32m+[m[32m  //|  mov CARG2d, RB[m
[32m+[m[32m  //|.elif X64[m
[32m+[m[32m  //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m  //|  mov L:CARG1d->base, BASE[m
[32m+[m[32m  //|  mov CARG3d, RA[m
[32m+[m[32m  //|  mov RAa, [RC][m
[32m+[m[32m  //|  mov [RB], RAa[m
[32m+[m[32m  //|  mov CARG2d, RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG3, RA[m
[32m+[m[32m  //|  mov RA, [RC+4][m
[32m+[m[32m  //|  mov RC, [RC][m
[32m+[m[32m  //|  mov [RB+4], RA[m
[32m+[m[32m  //|  mov [RB], RC[m
[32m+[m[32m  //|  mov ARG2, RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  jmp ->BC_CAT_Z[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Table indexing metamethods -----------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_tgets:[m
[32m+[m[32m  //|  mov TMP1, RC			// RC = GCstr *[m
[32m+[m[32m  //|  mov TMP2, LJ_TSTR[m
[32m+[m[32m  //|  lea RCa, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[32m+[m[32m  //|  cmp PC_OP, BC_GGET[m
[32m+[m[32m  //|  jne >1[m
[32m+[m[32m  //|  lea RA, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[32m+[m[32m  //|  mov [RA], TAB:RB			// RB = GCtab *[m
[32m+[m[32m  //|  mov dword [RA+4], LJ_TTAB[m
[32m+[m[32m  //|  mov RB, RA[m
[32m+[m[32m  dasm_put(Dst, 869, PC2PROTO(k), Dt1(->base), LJ_TSTR, BC_GGET, DISPATCH_GL(tmptv), LJ_TTAB);[m
[32m+[m[32m#line 871 "vm_x86.dasc"[m
[32m+[m[32m  //|  jmp >2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_tgetb:[m
[32m+[m[32m  //|  movzx RC, PC_RC[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  mov TMP2, LJ_TISNUM[m
[32m+[m[32m  //|  mov TMP1, RC[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  cvtsi2sd xmm0, RC[m
[32m+[m[32m  //|  movsd TMPQ, xmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  lea RCa, TMPQ			// Store temp. TValue in TMPQ.[m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_tgetv:[m
[32m+[m[32m  //|  movzx RC, PC_RC			// Reload TValue *k from RC.[m
[32m+[m[32m  //|  lea RC, [BASE+RC*8][m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  movzx RB, PC_RB			// Reload TValue *t from RB.[m
[32m+[m[32m  //|  lea RB, [BASE+RB*8][m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m  //|  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[32m+[m[32m  //|  mov CARG2d, RB[m
[32m+[m[32m  //|  mov CARG3, RCa			// May be 64 bit ptr to stack.[m
[32m+[m[32m  //|  mov L:RB, L:CARG1d[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG2, RB[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov ARG3, RC[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[32m+[m[32m  //|  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  test RC, RC[m
[32m+[m[32m  //|  jz >3[m
[32m+[m[32m  //|->cont_ra:				// BASE = base, RC = result[m
[32m+[m[32m  //|  movzx RA, PC_RA[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [RC][m
[32m+[m[32m  //|  mov [BASE+RA*8], RBa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [RC+4][m
[32m+[m[32m  //|  mov RC, [RC][m
[32m+[m[32m  //|  mov [BASE+RA*8+4], RB[m
[32m+[m[32m  //|  mov [BASE+RA*8], RC[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  ins_next[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|3:  // Call __index metamethod.[m
[32m+[m[32m  //|  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[32m+[m[32m  //|  mov RA, L:RB->top[m
[32m+[m[32m  //|  mov [RA-12], PC			// [cont|PC][m
[32m+[m[32m  //|  lea PC, [RA+FRAME_CONT][m
[32m+[m[32m  //|  sub PC, BASE[m
[32m+[m[32m  //|  mov LFUNC:RB, [RA-8]		// Guaranteed to be a function here.[m
[32m+[m[32m  //|  mov NARGS:RD, 2+1			// 2 args for func(t, k).[m
[32m+[m[32m  //|  jmp ->vm_call_dispatch_f[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_tgetr:[m
[32m+[m[32m  //|  mov FCARG1, TAB:RB[m
[32m+[m[32m  dasm_put(Dst, 981, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, 2+1);[m
[32m+[m[32m#line 936 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m  //|  mov FCARG2, RC			// Caveat: FCARG2 == BASE[m
[32m+[m[32m  //|  call extern lj_tab_getinth@8	// (GCtab *t, int32_t key)[m
[32m+[m[32m  //|  // cTValue * or NULL returned in eax (RC).[m
[32m+[m[32m  //|  movzx RA, PC_RA[m
[32m+[m[32m  //|  mov BASE, RB			// Restore BASE.[m
[32m+[m[32m  //|  test RC, RC[m
[32m+[m[32m  //|  jnz ->BC_TGETR_Z[m
[32m+[m[32m  //|  mov dword [BASE+RA*8+4], LJ_TNIL[m
[32m+[m[32m  //|  jmp ->BC_TGETR2_Z[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_tsets:[m
[32m+[m[32m  //|  mov TMP1, RC			// RC = GCstr *[m
[32m+[m[32m  //|  mov TMP2, LJ_TSTR[m
[32m+[m[32m  //|  lea RCa, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[32m+[m[32m  //|  cmp PC_OP, BC_GSET[m
[32m+[m[32m  //|  jne >1[m
[32m+[m[32m  //|  lea RA, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[32m+[m[32m  //|  mov [RA], TAB:RB			// RB = GCtab *[m
[32m+[m[32m  //|  mov dword [RA+4], LJ_TTAB[m
[32m+[m[32m  //|  mov RB, RA[m
[32m+[m[32m  //|  jmp >2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_tsetb:[m
[32m+[m[32m  //|  movzx RC, PC_RC[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  mov TMP2, LJ_TISNUM[m
[32m+[m[32m  //|  mov TMP1, RC[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  cvtsi2sd xmm0, RC[m
[32m+[m[32m  //|  movsd TMPQ, xmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  lea RCa, TMPQ			// Store temp. TValue in TMPQ.[m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_tsetv:[m
[32m+[m[32m  //|  movzx RC, PC_RC			// Reload TValue *k from RC.[m
[32m+[m[32m  //|  lea RC, [BASE+RC*8][m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  movzx RB, PC_RB			// Reload TValue *t from RB.[m
[32m+[m[32m  dasm_put(Dst, 1130, LJ_TNIL, LJ_TSTR, BC_GSET, DISPATCH_GL(tmptv), LJ_TTAB);[m
[32m+[m[32m#line 978 "vm_x86.dasc"[m
[32m+[m[32m  //|  lea RB, [BASE+RB*8][m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m  //|  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[32m+[m[32m  //|  mov CARG2d, RB[m
[32m+[m[32m  //|  mov CARG3, RCa			// May be 64 bit ptr to stack.[m
[32m+[m[32m  //|  mov L:RB, L:CARG1d[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG2, RB[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov ARG3, RC[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[32m+[m[32m  //|  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  test RC, RC[m
[32m+[m[32m  //|  jz >3[m
[32m+[m[32m  //|  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[32m+[m[32m  //|  movzx RA, PC_RA[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [BASE+RA*8][m
[32m+[m[32m  //|  mov [RC], RBa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [BASE+RA*8+4][m
[32m+[m[32m  //|  mov RA, [BASE+RA*8][m
[32m+[m[32m  //|  mov [RC+4], RB[m
[32m+[m[32m  //|  mov [RC], RA[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|->cont_nop:				// BASE = base, (RC = result)[m
[32m+[m[32m  //|  ins_next[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|3:  // Call __newindex metamethod.[m
[32m+[m[32m  //|  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[32m+[m[32m  //|  mov RA, L:RB->top[m
[32m+[m[32m  //|  mov [RA-12], PC			// [cont|PC][m
[32m+[m[32m  //|  movzx RC, PC_RA[m
[32m+[m[32m  //|  // Copy value to third argument.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [BASE+RC*8][m
[32m+[m[32m  //|  mov [RA+16], RBa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [BASE+RC*8+4][m
[32m+[m[32m  //|  mov RC, [BASE+RC*8][m
[32m+[m[32m  //|  mov [RA+20], RB[m
[32m+[m[32m  //|  mov [RA+16], RC[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  lea PC, [RA+FRAME_CONT][m
[32m+[m[32m  //|  sub PC, BASE[m
[32m+[m[32m  //|  mov LFUNC:RB, [RA-8]		// Guaranteed to be a function here.[m
[32m+[m[32m  //|  mov NARGS:RD, 3+1			// 3 args for func(t, k, v).[m
[32m+[m[32m  //|  jmp ->vm_call_dispatch_f[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_tsetr:[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m  //|  mov CARG3d, RC[m
[32m+[m[32m  //|  mov L:CARG1d->base, BASE[m
[32m+[m[32m  //|  xchg CARG2d, TAB:RB		// Caveat: CARG2d == BASE.[m
[32m+[m[32m  //|.elif X64[m
[32m+[m[32m  //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m  //|  mov CARG2d, TAB:RB[m
[32m+[m[32m  //|  mov L:CARG1d->base, BASE[m
[32m+[m[32m  //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m  //|  mov CARG3d, RC			// Caveat: CARG3d == BASE.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:RA, SAVE_L[m
[32m+[m[32m  //|  mov ARG2, TAB:RB[m
[32m+[m[32m  //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m  //|  mov ARG3, RC[m
[32m+[m[32m  //|  mov ARG1, L:RA[m
[32m+[m[32m  //|  mov L:RA->base, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[32m+[m[32m  //|  // TValue * returned in eax (RC).[m
[32m+[m[32m  //|  movzx RA, PC_RA[m
[32m+[m[32m  //|  mov BASE, RB			// Restore BASE.[m
[32m+[m[32m  //|  jmp ->BC_TSETR_Z[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Comparison metamethods ---------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_comp:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d == BASE.[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  lea CARG3d, [BASE+RD*8][m
[32m+[m[32m  //|  lea CARG2d, [BASE+RA*8][m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  lea CARG2d, [BASE+RA*8][m
[32m+[m[32m  //|  lea CARG3d, [BASE+RD*8][m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov CARG1d, L:RB			// Caveat: CARG1d/CARG4d == RA.[m
[32m+[m[32m  //|  movzx CARG4d, PC_OP[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  movzx RB, PC_OP[m
[32m+[m[32m  //|  lea RD, [BASE+RD*8][m
[32m+[m[32m  //|  lea RA, [BASE+RA*8][m
[32m+[m[32m  //|  mov ARG4, RB[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov ARG3, RD[m
[32m+[m[32m  //|  mov ARG2, RA[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_comp	// (lua_State *L, TValue *o1, *o2, int op)[m
[32m+[m[32m  //|  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  dasm_put(Dst, 1242, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, 3+1, Dt1(->base), Dt1(->base));[m
[32m+[m[32m#line 1092 "vm_x86.dasc"[m
[32m+[m[32m  //|  cmp RC, 1[m
[32m+[m[32m  //|  ja ->vmeta_binop[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|  lea PC, [PC+4][m
[32m+[m[32m  //|  jb >6[m
[32m+[m[32m  //|5:[m
[32m+[m[32m  //|  movzx RD, PC_RD[m
[32m+[m[32m  //|  branchPC RD[m
[32m+[m[32m  //|6:[m
[32m+[m[32m  //|  ins_next[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->cont_condt:			// BASE = base, RC = result[m
[32m+[m[32m  //|  add PC, 4[m
[32m+[m[32m  //|  cmp dword [RC+4], LJ_TISTRUECOND	// Branch if result is true.[m
[32m+[m[32m  //|  jb <5[m
[32m+[m[32m  //|  jmp <6[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->cont_condf:			// BASE = base, RC = result[m
[32m+[m[32m  //|  cmp dword [RC+4], LJ_TISTRUECOND	// Branch if result is false.[m
[32m+[m[32m  //|  jmp <4[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_equal:[m
[32m+[m[32m  //|  sub PC, 4[m
[32m+[m[32m  dasm_put(Dst, 1427, Dt1(->base), -BCBIAS_J*4, LJ_TISTRUECOND, LJ_TISTRUECOND);[m
[32m+[m[32m#line 1115 "vm_x86.dasc"[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  mov CARG3d, RD[m
[32m+[m[32m  //|  mov CARG4d, RB[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// Caveat: CARG2d == BASE.[m
[32m+[m[32m  //|  mov CARG2d, RA[m
[32m+[m[32m  //|  mov CARG1d, L:RB			// Caveat: CARG1d == RA.[m
[32m+[m[32m  //|.elif X64[m
[32m+[m[32m  //|  mov CARG2d, RA[m
[32m+[m[32m  //|  mov CARG4d, RB			// Caveat: CARG4d == RA.[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// Caveat: CARG3d == BASE.[m
[32m+[m[32m  //|  mov CARG3d, RD[m
[32m+[m[32m  //|  mov CARG1d, L:RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG4, RB[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov ARG3, RD[m
[32m+[m[32m  //|  mov ARG2, RA[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_equal	// (lua_State *L, GCobj *o1, *o2, int ne)[m
[32m+[m[32m  //|  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[32m+[m[32m  //|  jmp <3[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_equal_cd:[m
[32m+[m[32m  //|.if FFI[m
[32m+[m[32m  //|  sub PC, 4[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  mov FCARG2, dword [PC-4][m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_equal_cd@8	// (lua_State *L, BCIns ins)[m
[32m+[m[32m  //|  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[32m+[m[32m  //|  jmp <3[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_istype:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[32m+[m[32m  //|  mov CARG2d, RA[m
[32m+[m[32m  //|  movzx CARG3d, PC_RD[m
[32m+[m[32m  //|  mov L:CARG1d, L:RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  movzx RD, PC_RD[m
[32m+[m[32m  //|  mov ARG2, RA[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov ARG3, RD[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  jmp <6[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Arithmetic metamethods ---------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_arith_vno:[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  movzx RB, PC_RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|->vmeta_arith_vn:[m
[32m+[m[32m  //|  lea RC, [KBASE+RC*8][m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_arith_nvo:[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  movzx RC, PC_RC[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|->vmeta_arith_nv:[m
[32m+[m[32m  //|  lea RC, [KBASE+RC*8][m
[32m+[m[32m  //|  lea RB, [BASE+RB*8][m
[32m+[m[32m  //|  xchg RB, RC[m
[32m+[m[32m  //|  jmp >2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_unm:[m
[32m+[m[32m  //|  lea RC, [BASE+RD*8][m
[32m+[m[32m  dasm_put(Dst, 1513, Dt1(->base), Dt1(->base), Dt1(->base), Dt1(->base));[m
[32m+[m[32m#line 1197 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov RB, RC[m
[32m+[m[32m  //|  jmp >2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_arith_vvo:[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  movzx RB, PC_RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|->vmeta_arith_vv:[m
[32m+[m[32m  //|  lea RC, [BASE+RC*8][m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  lea RB, [BASE+RB*8][m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  lea RA, [BASE+RA*8][m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  mov CARG3d, RB[m
[32m+[m[32m  //|  mov CARG4d, RC[m
[32m+[m[32m  //|  movzx RC, PC_OP[m
[32m+[m[32m  //|  mov ARG5d, RC[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// Caveat: CARG2d == BASE.[m
[32m+[m[32m  //|  mov CARG2d, RA[m
[32m+[m[32m  //|  mov CARG1d, L:RB			// Caveat: CARG1d == RA.[m
[32m+[m[32m  //|.elif X64[m
[32m+[m[32m  //|  movzx CARG5d, PC_OP[m
[32m+[m[32m  //|  mov CARG2d, RA[m
[32m+[m[32m  //|  mov CARG4d, RC			// Caveat: CARG4d == RA.[m
[32m+[m[32m  //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m  //|  mov L:CARG1d->base, BASE		// Caveat: CARG3d == BASE.[m
[32m+[m[32m  //|  mov CARG3d, RB[m
[32m+[m[32m  //|  mov L:RB, L:CARG1d[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG3, RB[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov ARG4, RC[m
[32m+[m[32m  //|  movzx RC, PC_OP[m
[32m+[m[32m  //|  mov ARG2, RA[m
[32m+[m[32m  //|  mov ARG5, RC[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_arith	// (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[32m+[m[32m  //|  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  test RC, RC[m
[32m+[m[32m  //|  jz ->cont_nop[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  // Call metamethod for binary op.[m
[32m+[m[32m  //|->vmeta_binop:[m
[32m+[m[32m  //|  // BASE = base, RC = new base, stack = cont/func/o1/o2[m
[32m+[m[32m  //|  mov RA, RC[m
[32m+[m[32m  //|  sub RC, BASE[m
[32m+[m[32m  //|  mov [RA-12], PC			// [cont|PC][m
[32m+[m[32m  //|  lea PC, [RC+FRAME_CONT][m
[32m+[m[32m  //|  mov NARGS:RD, 2+1			// 2 args for func(o1, o2).[m
[32m+[m[32m  //|  jmp ->vm_call_dispatch[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_len:[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  lea FCARG2, [BASE+RD*8]		// Caveat: FCARG2 == BASE[m
[32m+[m[32m  //|  mov L:FCARG1, L:RB[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_len@8		// (lua_State *L, TValue *o)[m
[32m+[m[32m  //|  // NULL (retry) or TValue * (metamethod) returned in eax (RC).[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  dasm_put(Dst, 1644, Dt1(->base), Dt1(->base), FRAME_CONT, 2+1, Dt1(->base), Dt1(->base));[m
[32m+[m[32m#line 1263 "vm_x86.dasc"[m
[32m+[m[32m#if LJ_52[m
[32m+[m[32m  //|  test RC, RC[m
[32m+[m[32m  //|  jne ->vmeta_binop			// Binop call for compatibility.[m
[32m+[m[32m  //|  movzx RD, PC_RD[m
[32m+[m[32m  //|  mov TAB:FCARG1, [BASE+RD*8][m
[32m+[m[32m  //|  jmp ->BC_LEN_Z[m
[32m+[m[32m  dasm_put(Dst, 1757);[m
[32m+[m[32m#line 1269 "vm_x86.dasc"[m
[32m+[m[32m#else[m
[32m+[m[32m  //|  jmp ->vmeta_binop			// Binop call for compatibility.[m
[32m+[m[32m  dasm_put(Dst, 1776);[m
[32m+[m[32m#line 1271 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Call metamethod ----------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_call_ra:[m
[32m+[m[32m  //|  lea RA, [BASE+RA*8+8][m
[32m+[m[32m  //|->vmeta_call:			// Resolve and call __call metamethod.[m
[32m+[m[32m  //|  // BASE = old base, RA = new base, RC = nargs+1, PC = return[m
[32m+[m[32m  //|  mov TMP2, RA			// Save RA, RC for us.[m
[32m+[m[32m  //|  mov TMP1, NARGS:RD[m
[32m+[m[32m  //|  sub RA, 8[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[32m+[m[32m  //|  mov CARG2d, RA[m
[32m+[m[32m  //|  lea CARG3d, [RA+NARGS:RD*8][m
[32m+[m[32m  //|  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  lea RC, [RA+NARGS:RD*8][m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov ARG2, RA[m
[32m+[m[32m  //|  mov ARG3, RC[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// This is the callers base![m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov RA, TMP2[m
[32m+[m[32m  //|  mov NARGS:RD, TMP1[m
[32m+[m[32m  //|  mov LFUNC:RB, [RA-8][m
[32m+[m[32m  //|  add NARGS:RD, 1[m
[32m+[m[32m  //|  // This is fragile. L->base must not move, KBASE must always be defined.[m
[32m+[m[32m  //|  cmp KBASE, BASE			// Continue with CALLT if flag set.[m
[32m+[m[32m  //|  je ->BC_CALLT_Z[m
[32m+[m[32m  //|  mov BASE, RA[m
[32m+[m[32m  //|  ins_call				// Otherwise call resolved metamethod.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Argument coercion for 'for' statement ------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vmeta_for:[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov FCARG2, RA			// Caveat: FCARG2 == BASE[m
[32m+[m[32m  //|  mov L:FCARG1, L:RB			// Caveat: FCARG1 == RA[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_meta_for@8	// (lua_State *L, TValue *base)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov RC, [PC-4][m
[32m+[m[32m  //|  movzx RA, RCH[m
[32m+[m[32m  //|  movzx OP, RCL[m
[32m+[m[32m  //|  shr RC, 16[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Retry FORI or JFORI.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jmp aword [DISPATCH+OP*4+GG_DISP2STATIC]	// Retry FORI or JFORI.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Fast functions -----------------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc, name[m
[32m+[m[32m  //|->ff_ .. name:[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_1, name[m
[32m+[m[32m  //|->ff_ .. name:[m
[32m+[m[32m  //|  cmp NARGS:RD, 1+1;  jb ->fff_fallback[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_2, name[m
[32m+[m[32m  //|->ff_ .. name:[m
[32m+[m[32m  //|  cmp NARGS:RD, 2+1;  jb ->fff_fallback[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_nsse, name, op[m
[32m+[m[32m  //|  .ffunc_1 name[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[32m+[m[32m  //|  op xmm0, qword [BASE][m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_nsse, name[m
[32m+[m[32m  //|  .ffunc_nsse name, movsd[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_nnsse, name[m
[32m+[m[32m  //|  .ffunc_2 name[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[32m+[m[32m  //|  cmp dword [BASE+12], LJ_TISNUM;  jae ->fff_fallback[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE][m
[32m+[m[32m  //|  movsd xmm1, qword [BASE+8][m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_nnr, name[m
[32m+[m[32m  //|  .ffunc_2 name[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[32m+[m[32m  //|  cmp dword [BASE+12], LJ_TISNUM;  jae ->fff_fallback[m
[32m+[m[32m  //|  fld qword [BASE+8][m
[32m+[m[32m  //|  fld qword [BASE][m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|// Inlined GC threshold check. Caveat: uses label 1.[m
[32m+[m[32m  //|.macro ffgccheck[m
[32m+[m[32m  //|  mov RB, [DISPATCH+DISPATCH_GL(gc.total)][m
[32m+[m[32m  //|  cmp RB, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[32m+[m[32m  //|  jb >1[m
[32m+[m[32m  //|  call ->fff_gcstep[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Base library: checks -----------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 assert[m
[32m+[m[32m  //|  mov RB, [BASE+4][m
[32m+[m[32m  //|  cmp RB, LJ_TISTRUECOND;  jae ->fff_fallback[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov MULTRES, RD[m
[32m+[m[32m  //|  mov [BASE-4], RB[m
[32m+[m[32m  //|  mov RB, [BASE][m
[32m+[m[32m  //|  mov [BASE-8], RB[m
[32m+[m[32m  //|  sub RD, 2[m
[32m+[m[32m  //|  jz >2[m
[32m+[m[32m  //|  mov RA, BASE[m
[32m+[m[32m  dasm_put(Dst, 1781, Dt1(->base), Dt1(->base), Dt7(->pc), Dt1(->base), Dt1(->base), GG_DISP2STATIC, 1+1, LJ_TISTRUECOND);[m
[32m+[m[32m#line 1395 "vm_x86.dasc"[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  add RA, 8[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [RA][m
[32m+[m[32m  //|  mov [RA-8], RBa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [RA+4][m
[32m+[m[32m  //|  mov [RA-4], RB[m
[32m+[m[32m  //|  mov RB, [RA][m
[32m+[m[32m  //|  mov [RA-8], RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  sub RD, 1[m
[32m+[m[32m  //|  jnz <1[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  mov RD, MULTRES[m
[32m+[m[32m  //|  jmp ->fff_res_[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 type[m
[32m+[m[32m  //|  mov RB, [BASE+4][m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RA, RB[m
[32m+[m[32m  //|  sar RA, 15[m
[32m+[m[32m  //|  cmp RA, -2[m
[32m+[m[32m  //|  je >3[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RC, ~LJ_TNUMX[m
[32m+[m[32m  //|  not RB[m
[32m+[m[32m  //|  cmp RC, RB[m
[32m+[m[32m  //|  cmova RC, RB[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  mov CFUNC:RB, [BASE-8][m
[32m+[m[32m  //|  mov STR:RC, [CFUNC:RB+RC*8+((char *)(&((GCfuncC *)0)->upvalue))][m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TSTR[m
[32m+[m[32m  //|  mov [BASE-8], STR:RC[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  mov RC, ~LJ_TLIGHTUD[m
[32m+[m[32m  dasm_put(Dst, 1967, 1+1, ~LJ_TNUMX, ((char *)(&((GCfuncC *)0)->upvalue)), LJ_TSTR);[m
[32m+[m[32m#line 1434 "vm_x86.dasc"[m
[32m+[m[32m  //|  jmp <2[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Base library: getters and setters ---------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 getmetatable[m
[32m+[m[32m  //|  mov RB, [BASE+4][m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  cmp RB, LJ_TTAB;  jne >6[m
[32m+[m[32m  //|1:  // Field metatable must be at same offset for GCtab and GCudata![m
[32m+[m[32m  //|  mov TAB:RB, [BASE][m
[32m+[m[32m  //|  mov TAB:RB, TAB:RB->metatable[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  test TAB:RB, TAB:RB[m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TNIL[m
[32m+[m[32m  //|  jz ->fff_res1[m
[32m+[m[32m  //|  mov STR:RC, [DISPATCH+DISPATCH_GL(gcroot)+4*(GCROOT_MMNAME+MM_metatable)][m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TTAB	// Store metatable as default result.[m
[32m+[m[32m  //|  mov [BASE-8], TAB:RB[m
[32m+[m[32m  //|  mov RA, TAB:RB->hmask[m
[32m+[m[32m  //|  and RA, STR:RC->hash[m
[32m+[m[32m  dasm_put(Dst, 2069, ~LJ_TLIGHTUD, 1+1, LJ_TTAB, Dt6(->metatable), LJ_TNIL, DISPATCH_GL(gcroot)+4*(GCROOT_MMNAME+MM_metatable), LJ_TTAB, Dt6(->hmask));[m
[32m+[m[32m#line 1455 "vm_x86.dasc"[m
[32m+[m[32m  //|  imul RA, #NODE[m
[32m+[m[32m  //|  add NODE:RA, TAB:RB->node[m
[32m+[m[32m  //|3:  // Rearranged logic, because we expect _not_ to find the key.[m
[32m+[m[32m  //|  cmp dword NODE:RA->key.it, LJ_TSTR[m
[32m+[m[32m  //|  jne >4[m
[32m+[m[32m  //|  cmp dword NODE:RA->key.gcr, STR:RC[m
[32m+[m[32m  //|  je >5[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|  mov NODE:RA, NODE:RA->next[m
[32m+[m[32m  //|  test NODE:RA, NODE:RA[m
[32m+[m[32m  //|  jnz <3[m
[32m+[m[32m  //|  jmp ->fff_res1			// Not found, keep default result.[m
[32m+[m[32m  //|5:[m
[32m+[m[32m  //|  mov RB, [RA+4][m
[32m+[m[32m  //|  cmp RB, LJ_TNIL;  je ->fff_res1	// Ditto for nil value.[m
[32m+[m[32m  dasm_put(Dst, 2138, Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), DtB(->next), LJ_TNIL);[m
[32m+[m[32m#line 1470 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov RC, [RA][m
[32m+[m[32m  //|  mov [BASE-4], RB			// Return value of mt.__metatable.[m
[32m+[m[32m  //|  mov [BASE-8], RC[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|6:[m
[32m+[m[32m  //|  cmp RB, LJ_TUDATA;  je <1[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  cmp RB, LJ_TNUMX;  ja >8[m
[32m+[m[32m  //|  cmp RB, LJ_TISNUM;  jbe >7[m
[32m+[m[32m  //|  mov RB, LJ_TLIGHTUD[m
[32m+[m[32m  //|  jmp >8[m
[32m+[m[32m  //|7:[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  cmp RB, LJ_TISNUM;  ja >8[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RB, LJ_TNUMX[m
[32m+[m[32m  //|8:[m
[32m+[m[32m  //|  not RB[m
[32m+[m[32m  dasm_put(Dst, 2189, LJ_TUDATA, LJ_TNUMX, LJ_TISNUM, LJ_TLIGHTUD, LJ_TNUMX);[m
[32m+[m[32m#line 1489 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov TAB:RB, [DISPATCH+RB*4+DISPATCH_GL(gcroot[GCROOT_BASEMT])][m
[32m+[m[32m  //|  jmp <2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_2 setmetatable[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[32m+[m[32m  //|  // Fast path: no mt for table yet and not clearing the mt.[m
[32m+[m[32m  //|  mov TAB:RB, [BASE][m
[32m+[m[32m  //|  cmp dword TAB:RB->metatable, 0;  jne ->fff_fallback[m
[32m+[m[32m  //|  cmp dword [BASE+12], LJ_TTAB;  jne ->fff_fallback[m
[32m+[m[32m  //|  mov TAB:RC, [BASE+8][m
[32m+[m[32m  //|  mov TAB:RB->metatable, TAB:RC[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TTAB		// Return original table.[m
[32m+[m[32m  //|  mov [BASE-8], TAB:RB[m
[32m+[m[32m  //|  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[32m+[m[32m  //|  jz >1[m
[32m+[m[32m  dasm_put(Dst, 2246, DISPATCH_GL(gcroot[GCROOT_BASEMT]), 2+1, LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK);[m
[32m+[m[32m#line 1505 "vm_x86.dasc"[m
[32m+[m[32m  //|  // Possible write barrier. Table is black, but skip iswhite(mt) check.[m
[32m+[m[32m  //|  barrierback TAB:RB, RC[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_2 rawget[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m  //|  lea CARG3d, [BASE+8][m
[32m+[m[32m  //|  mov CARG2d, [BASE]			// Caveat: CARG2d == BASE.[m
[32m+[m[32m  //|  mov CARG1d, SAVE_L[m
[32m+[m[32m  //|.elif X64[m
[32m+[m[32m  //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m  //|  mov CARG2d, [BASE][m
[32m+[m[32m  //|  lea CARG3d, [BASE+8]		// Caveat: CARG3d == BASE.[m
[32m+[m[32m  //|  mov CARG1d, SAVE_L[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov TAB:RD, [BASE][m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov ARG2, TAB:RD[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m  //|  add BASE, 8[m
[32m+[m[32m  //|  mov ARG3, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  call extern lj_tab_get	// (lua_State *L, GCtab *t, cTValue *key)[m
[32m+[m[32m  //|  // cTValue * returned in eax (RD).[m
[32m+[m[32m  //|  mov BASE, RB			// Restore BASE.[m
[32m+[m[32m  //|  // Copy table slot.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [RD][m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov [BASE-8], RBa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [RD][m
[32m+[m[32m  //|  mov RD, [RD+4][m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov [BASE-8], RB[m
[32m+[m[32m  //|  mov [BASE-4], RD[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Base library: conversions ------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc tonumber[m
[32m+[m[32m  //|  // Only handles the number case inline (without a base argument).[m
[32m+[m[32m  //|  cmp NARGS:RD, 1+1;  jne ->fff_fallback	// Exactly one argument.[m
[32m+[m[32m  dasm_put(Dst, 2322, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist), 2+1, LJ_TTAB);[m
[32m+[m[32m#line 1553 "vm_x86.dasc"[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jne >1[m
[32m+[m[32m  //|  mov RB, dword [BASE]; jmp ->fff_resi[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  ja ->fff_fallback[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE]; jmp ->fff_resxmm0[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 tostring[m
[32m+[m[32m  //|  // Only handles the string or number case inline.[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TSTR;  jne >3[m
[32m+[m[32m  //|  // A __tostring method in the string base metatable is ignored.[m
[32m+[m[32m  //|  mov STR:RD, [BASE][m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TSTR[m
[32m+[m[32m  //|  mov [BASE-8], STR:RD[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|3:  // Handle numbers inline, unless a number base metatable is present.[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM;  ja ->fff_fallback[m
[32m+[m[32m  dasm_put(Dst, 2403, 1+1, LJ_TISNUM, 1+1, LJ_TSTR, LJ_TSTR);[m
[32m+[m[32m#line 1576 "vm_x86.dasc"[m
[32m+[m[32m  //|  cmp dword [DISPATCH+DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])], 0[m
[32m+[m[32m  //|  jne ->fff_fallback[m
[32m+[m[32m  //|  ffgccheck				// Caveat: uses label 1.[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[32m+[m[32m  //|  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[32m+[m[32m  //|.if X64 and not X64WIN[m
[32m+[m[32m  //|  mov FCARG2, BASE			// Otherwise: FCARG2 == BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov L:FCARG1, L:RB[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  call extern lj_strfmt_number@8	// (lua_State *L, cTValue *o)[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  call extern lj_strfmt_num@8	// (lua_State *L, lua_Number *np)[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  // GCstr returned in eax (RD).[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  jmp <2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Base library: iterators -------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 next[m
[32m+[m[32m  dasm_put(Dst, 2472, LJ_TISNUM, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), 1+1);[m
[32m+[m[32m#line 1598 "vm_x86.dasc"[m
[32m+[m[32m  //|  je >2				// Missing 2nd arg?[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[32m+[m[32m  //|  mov L:RB->top, BASE		// Dummy frame length is ok.[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  lea CARG3d, [BASE+8][m
[32m+[m[32m  //|  mov CARG2d, [BASE]			// Caveat: CARG2d == BASE.[m
[32m+[m[32m  //|  mov CARG1d, L:RB[m
[32m+[m[32m  //|.elif X64[m
[32m+[m[32m  //|  mov CARG2d, [BASE][m
[32m+[m[32m  //|  lea CARG3d, [BASE+8]		// Caveat: CARG3d == BASE.[m
[32m+[m[32m  //|  mov CARG1d, L:RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov TAB:RD, [BASE][m
[32m+[m[32m  //|  mov ARG2, TAB:RD[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|  add BASE, 8[m
[32m+[m[32m  //|  mov ARG3, BASE[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC			// Needed for ITERN fallback.[m
[32m+[m[32m  //|  call extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[32m+[m[32m  //|  // Flag returned in eax (RD).[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  test RD, RD;  jz >3		// End of traversal?[m
[32m+[m[32m  //|  // Copy key and value to results.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [BASE+8][m
[32m+[m[32m  //|  mov RDa, [BASE+16][m
[32m+[m[32m  //|  mov [BASE-8], RBa[m
[32m+[m[32m  //|  mov [BASE], RDa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [BASE+8][m
[32m+[m[32m  //|  mov RD, [BASE+12][m
[32m+[m[32m  //|  mov [BASE-8], RB[m
[32m+[m[32m  //|  mov [BASE-4], RD[m
[32m+[m[32m  //|  mov RB, [BASE+16][m
[32m+[m[32m  //|  mov RD, [BASE+20][m
[32m+[m[32m  //|  mov [BASE], RB[m
[32m+[m[32m  //|  mov [BASE+4], RD[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|->fff_res2:[m
[32m+[m[32m  //|  mov RD, 1+2[m
[32m+[m[32m  //|  jmp ->fff_res[m
[32m+[m[32m  //|2:  // Set missing 2nd arg to nil.[m
[32m+[m[32m  //|  mov dword [BASE+12], LJ_TNIL[m
[32m+[m[32m  //|  jmp <1[m
[32m+[m[32m  dasm_put(Dst, 2541, LJ_TTAB, Dt1(->base), Dt1(->top), Dt1(->base), 1+2, LJ_TNIL);[m
[32m+[m[32m#line 1647 "vm_x86.dasc"[m
[32m+[m[32m  //|3:  // End of traversal: return nil.[m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TNIL[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 pairs[m
[32m+[m[32m  //|  mov TAB:RB, [BASE][m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[32m+[m[32m  dasm_put(Dst, 2630, LJ_TNIL, 1+1, LJ_TTAB);[m
[32m+[m[32m#line 1654 "vm_x86.dasc"[m
[32m+[m[32m#if LJ_52[m
[32m+[m[32m  //|  cmp dword TAB:RB->metatable, 0; jne ->fff_fallback[m
[32m+[m[32m  dasm_put(Dst, 2667, Dt6(->metatable));[m
[32m+[m[32m#line 1656 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m  //|  mov CFUNC:RB, [BASE-8][m
[32m+[m[32m  //|  mov CFUNC:RD, CFUNC:RB->upvalue[0][m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TFUNC[m
[32m+[m[32m  //|  mov [BASE-8], CFUNC:RD[m
[32m+[m[32m  //|  mov dword [BASE+12], LJ_TNIL[m
[32m+[m[32m  //|  mov RD, 1+3[m
[32m+[m[32m  //|  jmp ->fff_res[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_2 ipairs_aux[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[32m+[m[32m  //|  cmp dword [BASE+12], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jne ->fff_fallback[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  mov RD, dword [BASE+8][m
[32m+[m[32m  //|  add RD, 1[m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TISNUM[m
[32m+[m[32m  //|  mov dword [BASE-8], RD[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE+8][m
[32m+[m[32m  //|  sseconst_1 xmm1, RBa[m
[32m+[m[32m  //|  addsd xmm0, xmm1[m
[32m+[m[32m  //|  cvttsd2si RD, xmm0[m
[32m+[m[32m  //|  movsd qword [BASE-8], xmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov TAB:RB, [BASE][m
[32m+[m[32m  //|  cmp RD, TAB:RB->asize;  jae >2	// Not in array part?[m
[32m+[m[32m  dasm_put(Dst, 2676, Dt8(->upvalue[0]), LJ_TFUNC, LJ_TNIL, 1+3, 2+1, LJ_TTAB, LJ_TISNUM, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), Dt6(->asize));[m
[32m+[m[32m#line 1689 "vm_x86.dasc"[m
[32m+[m[32m  //|  shl RD, 3[m
[32m+[m[32m  //|  add RD, TAB:RB->array[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  cmp dword [RD+4], LJ_TNIL;  je ->fff_res0[m
[32m+[m[32m  //|  // Copy array slot.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [RD][m
[32m+[m[32m  //|  mov [BASE], RBa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [RD][m
[32m+[m[32m  //|  mov RD, [RD+4][m
[32m+[m[32m  //|  mov [BASE], RB[m
[32m+[m[32m  //|  mov [BASE+4], RD[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  jmp ->fff_res2[m
[32m+[m[32m  //|2:  // Check for empty hash part first. Otherwise call C function.[m
[32m+[m[32m  //|  cmp dword TAB:RB->hmask, 0; je ->fff_res0[m
[32m+[m[32m  //|  mov FCARG1, TAB:RB[m
[32m+[m[32m  //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m  //|  mov FCARG2, RD			// Caveat: FCARG2 == BASE[m
[32m+[m[32m  //|  call extern lj_tab_getinth@8	// (GCtab *t, int32_t key)[m
[32m+[m[32m  //|  // cTValue * or NULL returned in eax (RD).[m
[32m+[m[32m  //|  mov BASE, RB[m
[32m+[m[32m  //|  test RD, RD[m
[32m+[m[32m  //|  jnz <1[m
[32m+[m[32m  //|->fff_res0:[m
[32m+[m[32m  //|  mov RD, 1+0[m
[32m+[m[32m  //|  jmp ->fff_res[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 ipairs[m
[32m+[m[32m  dasm_put(Dst, 2776, Dt6(->array), LJ_TNIL, Dt6(->hmask), 1+0);[m
[32m+[m[32m#line 1719 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov TAB:RB, [BASE][m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[32m+[m[32m  dasm_put(Dst, 2647, 1+1, LJ_TTAB);[m
[32m+[m[32m#line 1721 "vm_x86.dasc"[m
[32m+[m[32m#if LJ_52[m
[32m+[m[32m  //|  cmp dword TAB:RB->metatable, 0; jne ->fff_fallback[m
[32m+[m[32m  dasm_put(Dst, 2667, Dt6(->metatable));[m
[32m+[m[32m#line 1723 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m  //|  mov CFUNC:RB, [BASE-8][m
[32m+[m[32m  //|  mov CFUNC:RD, CFUNC:RB->upvalue[0][m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TFUNC[m
[32m+[m[32m  //|  mov [BASE-8], CFUNC:RD[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  mov dword [BASE+12], LJ_TISNUM[m
[32m+[m[32m  //|  mov dword [BASE+8], 0[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  xorps xmm0, xmm0[m
[32m+[m[32m  //|  movsd qword [BASE+8], xmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RD, 1+3[m
[32m+[m[32m  //|  jmp ->fff_res[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Base library: catch errors ----------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 pcall[m
[32m+[m[32m  //|  lea RA, [BASE+8][m
[32m+[m[32m  //|  sub NARGS:RD, 1[m
[32m+[m[32m  //|  mov PC, 8+FRAME_PCALL[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  movzx RB, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[32m+[m[32m  //|  shr RB, HOOK_ACTIVE_SHIFT[m
[32m+[m[32m  //|  and RB, 1[m
[32m+[m[32m  //|  add PC, RB				// Remember active hook before pcall.[m
[32m+[m[32m  //|  jmp ->vm_call_dispatch[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_2 xpcall[m
[32m+[m[32m  //|  cmp dword [BASE+12], LJ_TFUNC;  jne ->fff_fallback[m
[32m+[m[32m  dasm_put(Dst, 2848, Dt8(->upvalue[0]), LJ_TFUNC, 1+3, 1+1, 8+FRAME_PCALL, DISPATCH_GL(hookmask), HOOK_ACTIVE_SHIFT, 2+1);[m
[32m+[m[32m#line 1754 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov RB, [BASE+4]			// Swap function and traceback.[m
[32m+[m[32m  //|  mov [BASE+12], RB[m
[32m+[m[32m  //|  mov dword [BASE+4], LJ_TFUNC[m
[32m+[m[32m  //|  mov LFUNC:RB, [BASE][m
[32m+[m[32m  //|  mov PC, [BASE+8][m
[32m+[m[32m  //|  mov [BASE+8], LFUNC:RB[m
[32m+[m[32m  //|  mov [BASE], PC[m
[32m+[m[32m  //|  lea RA, [BASE+16][m
[32m+[m[32m  //|  sub NARGS:RD, 2[m
[32m+[m[32m  //|  mov PC, 16+FRAME_PCALL[m
[32m+[m[32m  //|  jmp <1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Coroutine library --------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro coroutine_resume_wrap, resume[m
[32m+[m[32m  //|.if resume[m
[32m+[m[32m  //|.ffunc_1 coroutine_resume[m
[32m+[m[32m  //|  mov L:RB, [BASE][m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|.ffunc coroutine_wrap_aux[m
[32m+[m[32m  //|  mov CFUNC:RB, [BASE-8][m
[32m+[m[32m  //|  mov L:RB, CFUNC:RB->upvalue[0].gcr[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov TMP1, L:RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.if resume[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TTHREAD;  jne ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  cmp aword L:RB->cframe, 0; jne ->fff_fallback[m
[32m+[m[32m  //|  cmp byte L:RB->status, LUA_YIELD;  ja ->fff_fallback[m
[32m+[m[32m  //|  mov RA, L:RB->top[m
[32m+[m[32m  //|  je >1				// Status != LUA_YIELD (i.e. 0)?[m
[32m+[m[32m  //|  cmp RA, L:RB->base			// Check for presence of initial func.[m
[32m+[m[32m  //|  je ->fff_fallback[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|.if resume[m
[32m+[m[32m  //|  lea PC, [RA+NARGS:RD*8-16]		// Check stack space (-1-thread).[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  lea PC, [RA+NARGS:RD*8-8]		// Check stack space (-1).[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  cmp PC, L:RB->maxstack; ja ->fff_fallback[m
[32m+[m[32m  //|  mov L:RB->top, PC[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.if resume[m
[32m+[m[32m  //|  add BASE, 8			// Keep resumed thread in stack for GC.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov L:RB->top, BASE[m
[32m+[m[32m  //|.if resume[m
[32m+[m[32m  //|  lea RB, [BASE+NARGS:RD*8-24]	// RB = end of source for stack move.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  lea RB, [BASE+NARGS:RD*8-16]	// RB = end of source for stack move.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  sub RBa, PCa			// Relative to PC.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  cmp PC, RA[m
[32m+[m[32m  //|  je >3[m
[32m+[m[32m  //|2:  // Move args to coroutine.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RCa, [PC+RB][m
[32m+[m[32m  //|  mov [PC-8], RCa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RC, [PC+RB+4][m
[32m+[m[32m  //|  mov [PC-4], RC[m
[32m+[m[32m  //|  mov RC, [PC+RB][m
[32m+[m[32m  //|  mov [PC-8], RC[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  sub PC, 8[m
[32m+[m[32m  //|  cmp PC, RA[m
[32m+[m[32m  //|  jne <2[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov CARG2d, RA[m
[32m+[m[32m  //|  mov CARG1d, TMP1[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG2, RA[m
[32m+[m[32m  //|  xor RA, RA[m
[32m+[m[32m  //|  mov ARG4, RA[m
[32m+[m[32m  //|  mov ARG3, RA[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  call ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:PC, TMP1[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:PC, ARG1			// The callee doesn't modify SAVE_L.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[32m+[m[32m  //|  set_vmstate INTERP[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  cmp eax, LUA_YIELD[m
[32m+[m[32m  //|  ja >8[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|  mov RA, L:PC->base[m
[32m+[m[32m  //|  mov KBASE, L:PC->top[m
[32m+[m[32m  //|  mov L:PC->top, RA			// Clear coroutine stack.[m
[32m+[m[32m  //|  mov PC, KBASE[m
[32m+[m[32m  //|  sub PC, RA[m
[32m+[m[32m  //|  je >6				// No results?[m
[32m+[m[32m  //|  lea RD, [BASE+PC][m
[32m+[m[32m  //|  shr PC, 3[m
[32m+[m[32m  //|  cmp RD, L:RB->maxstack[m
[32m+[m[32m  //|  ja >9				// Need to grow stack?[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  mov RB, BASE[m
[32m+[m[32m  //|  sub RBa, RAa[m
[32m+[m[32m  //|5:  // Move results from coroutine.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RDa, [RA][m
[32m+[m[32m  //|  mov [RA+RB], RDa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RD, [RA][m
[32m+[m[32m  //|  mov [RA+RB], RD[m
[32m+[m[32m  //|  mov RD, [RA+4][m
[32m+[m[32m  //|  mov [RA+RB+4], RD[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  add RA, 8[m
[32m+[m[32m  //|  cmp RA, KBASE[m
[32m+[m[32m  //|  jne <5[m
[32m+[m[32m  //|6:[m
[32m+[m[32m  //|.if resume[m
[32m+[m[32m  //|  lea RD, [PC+2]			// nresults+1 = 1 + true + results.[m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TTRUE	// Prepend true to results.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  lea RD, [PC+1]			// nresults+1 = 1 + results.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|7:[m
[32m+[m[32m  //|  mov PC, SAVE_PC[m
[32m+[m[32m  //|  mov MULTRES, RD[m
[32m+[m[32m  //|.if resume[m
[32m+[m[32m  //|  mov RAa, -8[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  xor RA, RA[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  test PC, FRAME_TYPE[m
[32m+[m[32m  //|  jz ->BC_RET_Z[m
[32m+[m[32m  //|  jmp ->vm_return[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|8:  // Coroutine returned with error (at co->top-1).[m
[32m+[m[32m  //|.if resume[m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TFALSE	// Prepend false to results.[m
[32m+[m[32m  //|  mov RA, L:PC->top[m
[32m+[m[32m  //|  sub RA, 8[m
[32m+[m[32m  //|  mov L:PC->top, RA			// Clear error from coroutine stack.[m
[32m+[m[32m  //|  // Copy error message.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RDa, [RA][m
[32m+[m[32m  //|  mov [BASE], RDa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RD, [RA][m
[32m+[m[32m  //|  mov [BASE], RD[m
[32m+[m[32m  //|  mov RD, [RA+4][m
[32m+[m[32m  //|  mov [BASE+4], RD[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RD, 1+2			// nresults+1 = 1 + false + error.[m
[32m+[m[32m  //|  jmp <7[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov FCARG2, L:PC[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  call extern lj_ffh_coroutine_wrap_err@8  // (lua_State *L, lua_State *co)[m
[32m+[m[32m  //|  // Error function does not return.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|9:  // Handle stack expansion on return from yield.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:RA, TMP1[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:RA, ARG1			// The callee doesn't modify SAVE_L.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov L:RA->top, KBASE		// Undo coroutine stack clearing.[m
[32m+[m[32m  //|  mov FCARG2, PC[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov L:PC, TMP1[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:PC, ARG1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  jmp <4				// Retry the stack move.[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  coroutine_resume_wrap 1		// coroutine.resume[m
[32m+[m[32m  dasm_put(Dst, 2933, LJ_TFUNC, LJ_TFUNC, 16+FRAME_PCALL, 1+1, LJ_TTHREAD, Dt1(->cframe), Dt1(->status), LUA_YIELD);[m
[32m+[m[32m  dasm_put(Dst, 3020, Dt1(->top), Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top));[m
[32m+[m[32m  dasm_put(Dst, 3105, Dt1(->base), DISPATCH_GL(cur_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack));[m
[32m+[m[32m  dasm_put(Dst, 3184, LJ_TTRUE, FRAME_TYPE, LJ_TFALSE, Dt1(->top), Dt1(->top), 1+2, Dt1(->top));[m
[32m+[m[32m#line 1945 "vm_x86.dasc"[m
[32m+[m[32m  //|  coroutine_resume_wrap 0		// coroutine.wrap[m
[32m+[m[32m  dasm_put(Dst, 3284, Dt1(->base), Dt8(->upvalue[0].gcr), Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base));[m
[32m+[m[32m  dasm_put(Dst, 3357, Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top), Dt1(->base), DISPATCH_GL(cur_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, LUA_YIELD);[m
[32m+[m[32m  dasm_put(Dst, 3451, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack), FRAME_TYPE);[m
[32m+[m[32m#line 1946 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc coroutine_yield[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  test aword L:RB->cframe, CFRAME_RESUME[m
[32m+[m[32m  //|  jz ->fff_fallback[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  lea RD, [BASE+NARGS:RD*8-8][m
[32m+[m[32m  //|  mov L:RB->top, RD[m
[32m+[m[32m  //|  xor RD, RD[m
[32m+[m[32m  //|  mov aword L:RB->cframe, RDa[m
[32m+[m[32m  //|  mov al, LUA_YIELD[m
[32m+[m[32m  //|  mov byte L:RB->status, al[m
[32m+[m[32m  //|  jmp ->vm_leave_unw[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Math library -------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.if not DUALNUM[m
[32m+[m[32m  //|->fff_resi:  // Dummy.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->fff_resn:[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  dasm_put(Dst, 3542, Dt1(->top), Dt1(->base), Dt1(->cframe), CFRAME_RESUME, Dt1(->base), Dt1(->top), Dt1(->cframe), LUA_YIELD, Dt1(->status));[m
[32m+[m[32m#line 1968 "vm_x86.dasc"[m
[32m+[m[32m  //|  fstp qword [BASE-8][m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  .ffunc_1 math_abs[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM; jne >2[m
[32m+[m[32m  //|  mov RB, dword [BASE][m
[32m+[m[32m  //|  cmp RB, 0; jns ->fff_resi[m
[32m+[m[32m  //|  neg RB; js >1[m
[32m+[m[32m  //|->fff_resbit:[m
[32m+[m[32m  //|->fff_resi:[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TISNUM[m
[32m+[m[32m  //|  mov dword [BASE-8], RB[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov dword [BASE-4], 0x41e00000  // 2^31.[m
[32m+[m[32m  //|  mov dword [BASE-8], 0[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  ja ->fff_fallback[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE][m
[32m+[m[32m  //|  sseconst_abs xmm1, RDa[m
[32m+[m[32m  //|  andps xmm0, xmm1[m
[32m+[m[32m  //|->fff_resxmm0:[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  movsd qword [BASE-8], xmm0[m
[32m+[m[32m  //|  // fallthrough[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->fff_res1:[m
[32m+[m[32m  //|  mov RD, 1+1[m
[32m+[m[32m  //|->fff_res:[m
[32m+[m[32m  //|  mov MULTRES, RD[m
[32m+[m[32m  //|->fff_res_:[m
[32m+[m[32m  //|  test PC, FRAME_TYPE[m
[32m+[m[32m  //|  jnz >7[m
[32m+[m[32m  //|5:[m
[32m+[m[32m  //|  cmp PC_RB, RDL			// More results expected?[m
[32m+[m[32m  dasm_put(Dst, 3632, 1+1, LJ_TISNUM, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), 1+1, FRAME_TYPE);[m
[32m+[m[32m#line 2010 "vm_x86.dasc"[m
[32m+[m[32m  //|  ja >6[m
[32m+[m[32m  //|  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[32m+[m[32m  //|  movzx RA, PC_RA[m
[32m+[m[32m  //|  not RAa				// Note: ~RA = -(RA+1)[m
[32m+[m[32m  //|  lea BASE, [BASE+RA*8]		// base = base - (RA+1)*8[m
[32m+[m[32m  //|  ins_next[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|6:  // Fill up results with nil.[m
[32m+[m[32m  //|  mov dword [BASE+RD*8-12], LJ_TNIL[m
[32m+[m[32m  //|  add RD, 1[m
[32m+[m[32m  //|  jmp <5[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|7:  // Non-standard return case.[m
[32m+[m[32m  //|  mov RAa, -8			// Results start at BASE+RA = BASE-8.[m
[32m+[m[32m  //|  jmp ->vm_return[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|.define fff_resfp, fff_resxmm0[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|.define fff_resfp, fff_resn[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro math_round, func[m
[32m+[m[32m  //|  .ffunc math_ .. func[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM; jne >1[m
[32m+[m[32m  //|  mov RB, dword [BASE]; jmp ->fff_resi[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  ja ->fff_fallback[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE][m
[32m+[m[32m  //|  call ->vm_ .. func .. _sse[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  cvttsd2si RB, xmm0[m
[32m+[m[32m  //|  cmp RB, 0x80000000[m
[32m+[m[32m  //|  jne ->fff_resi[m
[32m+[m[32m  //|  cvtsi2sd xmm1, RB[m
[32m+[m[32m  //|  ucomisd xmm0, xmm1[m
[32m+[m[32m  //|  jp ->fff_resxmm0[m
[32m+[m[32m  //|  je ->fff_resi[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  jmp ->fff_resxmm0[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  math_round floor[m
[32m+[m[32m  //|  math_round ceil[m
[32m+[m[32m  dasm_put(Dst, 3716, LJ_TNIL, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 2058 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_nsse math_sqrt, sqrtsd; jmp ->fff_resxmm0[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc math_log[m
[32m+[m[32m  //|  cmp NARGS:RD, 1+1; jne ->fff_fallback	// Exactly one argument.[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[32m+[m[32m  dasm_put(Dst, 3819, 1+1, LJ_TISNUM, 1+1);[m
[32m+[m[32m#line 2064 "vm_x86.dasc"[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE][m
[32m+[m[32m  //|.if not X64[m
[32m+[m[32m  //|  movsd FPARG1, xmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RB, BASE[m
[32m+[m[32m  //|  call extern log[m
[32m+[m[32m  //|  mov BASE, RB[m
[32m+[m[32m  //|  jmp ->fff_resfp[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro math_extern, func[m
[32m+[m[32m  //|  .ffunc_nsse math_ .. func[m
[32m+[m[32m  //|.if not X64[m
[32m+[m[32m  //|  movsd FPARG1, xmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RB, BASE[m
[32m+[m[32m  //|  call extern func[m
[32m+[m[32m  //|  mov BASE, RB[m
[32m+[m[32m  //|  jmp ->fff_resfp[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro math_extern2, func[m
[32m+[m[32m  //|  .ffunc_nnsse math_ .. func[m
[32m+[m[32m  //|.if not X64[m
[32m+[m[32m  //|  movsd FPARG1, xmm0[m
[32m+[m[32m  //|  movsd FPARG3, xmm1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RB, BASE[m
[32m+[m[32m  //|  call extern func[m
[32m+[m[32m  //|  mov BASE, RB[m
[32m+[m[32m  //|  jmp ->fff_resfp[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  math_extern log10[m
[32m+[m[32m  //|  math_extern exp[m
[32m+[m[32m  dasm_put(Dst, 3874, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM);[m
[32m+[m[32m#line 2098 "vm_x86.dasc"[m
[32m+[m[32m  //|  math_extern sin[m
[32m+[m[32m  //|  math_extern cos[m
[32m+[m[32m  dasm_put(Dst, 3954, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM);[m
[32m+[m[32m#line 2100 "vm_x86.dasc"[m
[32m+[m[32m  //|  math_extern tan[m
[32m+[m[32m  //|  math_extern asin[m
[32m+[m[32m  //|  math_extern acos[m
[32m+[m[32m  dasm_put(Dst, 4033, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM);[m
[32m+[m[32m#line 2103 "vm_x86.dasc"[m
[32m+[m[32m  //|  math_extern atan[m
[32m+[m[32m  //|  math_extern sinh[m
[32m+[m[32m  dasm_put(Dst, 4128, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1);[m
[32m+[m[32m#line 2105 "vm_x86.dasc"[m
[32m+[m[32m  //|  math_extern cosh[m
[32m+[m[32m  //|  math_extern tanh[m
[32m+[m[32m  dasm_put(Dst, 4207, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1);[m
[32m+[m[32m#line 2107 "vm_x86.dasc"[m
[32m+[m[32m  //|  math_extern2 pow[m
[32m+[m[32m  //|  math_extern2 atan2[m
[32m+[m[32m  dasm_put(Dst, 4286, LJ_TISNUM, 2+1, LJ_TISNUM, LJ_TISNUM, 2+1);[m
[32m+[m[32m#line 2109 "vm_x86.dasc"[m
[32m+[m[32m  //|  math_extern2 fmod[m
[32m+[m[32m  dasm_put(Dst, 4372, LJ_TISNUM, LJ_TISNUM, 2+1, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 2110 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_nnr math_ldexp;	fscale; fpop1;	jmp ->fff_resn[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_1 math_frexp[m
[32m+[m[32m  //|  mov RB, [BASE+4][m
[32m+[m[32m  //|  cmp RB, LJ_TISNUM;  jae ->fff_fallback[m
[32m+[m[32m  dasm_put(Dst, 4447, 2+1, LJ_TISNUM, LJ_TISNUM, 1+1, LJ_TISNUM);[m
[32m+[m[32m#line 2116 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov RC, [BASE][m
[32m+[m[32m  //|  mov [BASE-4], RB; mov [BASE-8], RC[m
[32m+[m[32m  //|  shl RB, 1; cmp RB, 0xffe00000; jae >3[m
[32m+[m[32m  //|  or RC, RB; jz >3[m
[32m+[m[32m  //|  mov RC, 1022[m
[32m+[m[32m  //|  cmp RB, 0x00200000; jb >4[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  shr RB, 21; sub RB, RC		// Extract and unbias exponent.[m
[32m+[m[32m  //|  cvtsi2sd xmm0, RB[m
[32m+[m[32m  //|  mov RB, [BASE-4][m
[32m+[m[32m  //|  and RB, 0x800fffff			// Mask off exponent.[m
[32m+[m[32m  //|  or RB, 0x3fe00000			// Put mantissa in range [0.5,1) or 0.[m
[32m+[m[32m  //|  mov [BASE-4], RB[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  movsd qword [BASE], xmm0[m
[32m+[m[32m  //|  mov RD, 1+2[m
[32m+[m[32m  //|  jmp ->fff_res[m
[32m+[m[32m  //|3:  // Return +-0, +-Inf, NaN unmodified and an exponent of 0.[m
[32m+[m[32m  //|  xorps xmm0, xmm0; jmp <2[m
[32m+[m[32m  //|4:  // Handle denormals by multiplying with 2^54 and adjusting the bias.[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE][m
[32m+[m[32m  //|  sseconst_hi xmm1, RBa, 43500000  // 2^54.[m
[32m+[m[32m  dasm_put(Dst, 4531, 1+2, (unsigned int)(U64x(43500000,00000000)), (unsigned int)((U64x(43500000,00000000))>>32));[m
[32m+[m[32m#line 2139 "vm_x86.dasc"[m
[32m+[m[32m  //|  mulsd xmm0, xmm1[m
[32m+[m[32m  //|  movsd qword [BASE-8], xmm0[m
[32m+[m[32m  //|  mov RB, [BASE-4]; mov RC, 1076; shl RB, 1; jmp <1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_nsse math_modf[m
[32m+[m[32m  //|  mov RB, [BASE+4][m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  shl RB, 1; cmp RB, 0xffe00000; je >4	// +-Inf?[m
[32m+[m[32m  //|  movaps xmm4, xmm0[m
[32m+[m[32m  //|  call ->vm_trunc_sse[m
[32m+[m[32m  //|  subsd xmm4, xmm0[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  movsd qword [BASE-8], xmm0[m
[32m+[m[32m  //|  movsd qword [BASE], xmm4[m
[32m+[m[32m  //|  mov RC, [BASE-4]; mov RB, [BASE+4][m
[32m+[m[32m  //|  xor RC, RB; js >3				// Need to adjust sign?[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  mov RD, 1+2[m
[32m+[m[32m  //|  jmp ->fff_res[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  xor RB, 0x80000000; mov [BASE+4], RB	// Flip sign of fraction.[m
[32m+[m[32m  dasm_put(Dst, 4655, 1+1, LJ_TISNUM, 1+2);[m
[32m+[m[32m#line 2160 "vm_x86.dasc"[m
[32m+[m[32m  //|  jmp <2[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|  xorps xmm4, xmm4; jmp <1			// Return +-Inf and +-0.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro math_minmax, name, cmovop, sseop[m
[32m+[m[32m  //|  .ffunc name[m
[32m+[m[32m  //|  mov RA, 2[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jne >4[m
[32m+[m[32m  //|  mov RB, dword [BASE][m
[32m+[m[32m  //|1:  // Handle integers.[m
[32m+[m[32m  //|  cmp RA, RD; jae ->fff_resi[m
[32m+[m[32m  //|  cmp dword [BASE+RA*8-4], LJ_TISNUM; jne >3[m
[32m+[m[32m  //|  cmp RB, dword [BASE+RA*8-8][m
[32m+[m[32m  //|  cmovop RB, dword [BASE+RA*8-8][m
[32m+[m[32m  //|  add RA, 1[m
[32m+[m[32m  //|  jmp <1[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  ja ->fff_fallback[m
[32m+[m[32m  //|  // Convert intermediate result to number and continue below.[m
[32m+[m[32m  //|  cvtsi2sd xmm0, RB[m
[32m+[m[32m  //|  jmp >6[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|  ja ->fff_fallback[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE][m
[32m+[m[32m  //|5:  // Handle numbers or integers.[m
[32m+[m[32m  //|  cmp RA, RD; jae ->fff_resxmm0[m
[32m+[m[32m  //|  cmp dword [BASE+RA*8-4], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jb >6[m
[32m+[m[32m  //|  ja ->fff_fallback[m
[32m+[m[32m  //|  cvtsi2sd xmm1, dword [BASE+RA*8-8][m
[32m+[m[32m  //|  jmp >7[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|6:[m
[32m+[m[32m  //|  movsd xmm1, qword [BASE+RA*8-8][m
[32m+[m[32m  //|7:[m
[32m+[m[32m  //|  sseop xmm0, xmm1[m
[32m+[m[32m  //|  add RA, 1[m
[32m+[m[32m  //|  jmp <5[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  math_minmax math_min, cmovg, minsd[m
[32m+[m[32m  //|  math_minmax math_max, cmovl, maxsd[m
[32m+[m[32m  dasm_put(Dst, 4781, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 2211 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- String library -----------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc string_byte			// Only handle the 1-arg case here.[m
[32m+[m[32m  //|  cmp NARGS:RD, 1+1;  jne ->fff_fallback[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[32m+[m[32m  //|  mov STR:RB, [BASE][m
[32m+[m[32m  dasm_put(Dst, 4871, LJ_TISNUM, LJ_TISNUM, 1+1, LJ_TSTR);[m
[32m+[m[32m#line 2218 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  cmp dword STR:RB->len, 1[m
[32m+[m[32m  //|  jb ->fff_res0			// Return no results for empty string.[m
[32m+[m[32m  //|  movzx RB, byte STR:RB[1][m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jmp ->fff_resi[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  cvtsi2sd xmm0, RB; jmp ->fff_resxmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc string_char			// Only handle the 1-arg case here.[m
[32m+[m[32m  //|  ffgccheck[m
[32m+[m[32m  //|  cmp NARGS:RD, 1+1;  jne ->fff_fallback	// *Exactly* 1 arg.[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jne ->fff_fallback[m
[32m+[m[32m  //|  mov RB, dword [BASE][m
[32m+[m[32m  //|  cmp RB, 255;  ja ->fff_fallback[m
[32m+[m[32m  //|  mov TMP2, RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback[m
[32m+[m[32m  //|  cvttsd2si RB, qword [BASE][m
[32m+[m[32m  dasm_put(Dst, 4953, Dt5(->len), Dt5([1]), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+1, LJ_TISNUM);[m
[32m+[m[32m#line 2240 "vm_x86.dasc"[m
[32m+[m[32m  //|  cmp RB, 255;  ja ->fff_fallback[m
[32m+[m[32m  //|  mov TMP2, RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov TMP3, 1[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG3, 1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  lea RDa, TMP2			// Points to stack. Little-endian.[m
[32m+[m[32m  //|->fff_newstr:[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov CARG3d, TMP3			// Zero-extended to size_t.[m
[32m+[m[32m  //|  mov CARG2, RDa			// May be 64 bit ptr to stack.[m
[32m+[m[32m  //|  mov CARG1d, L:RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG2, RD[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[32m+[m[32m  //|->fff_resstr:[m
[32m+[m[32m  //|  // GCstr * returned in eax (RD).[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov PC, [BASE-4][m
[32m+[m[32m  //|  mov dword [BASE-4], LJ_TSTR[m
[32m+[m[32m  //|  mov [BASE-8], STR:RD[m
[32m+[m[32m  //|  jmp ->fff_res1[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc string_sub[m
[32m+[m[32m  //|  ffgccheck[m
[32m+[m[32m  //|  mov TMP2, -1[m
[32m+[m[32m  //|  cmp NARGS:RD, 1+2;  jb ->fff_fallback[m
[32m+[m[32m  //|  jna >1[m
[32m+[m[32m  dasm_put(Dst, 5017, Dt1(->base), Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+2);[m
[32m+[m[32m#line 2275 "vm_x86.dasc"[m
[32m+[m[32m  //|  cmp dword [BASE+20], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jne ->fff_fallback[m
[32m+[m[32m  //|  mov RB, dword [BASE+16][m
[32m+[m[32m  //|  mov TMP2, RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback[m
[32m+[m[32m  //|  cvttsd2si RB, qword [BASE+16][m
[32m+[m[32m  //|  mov TMP2, RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[32m+[m[32m  //|  cmp dword [BASE+12], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jne ->fff_fallback[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov STR:RB, [BASE][m
[32m+[m[32m  //|  mov TMP3, STR:RB[m
[32m+[m[32m  //|  mov RB, STR:RB->len[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  mov RA, dword [BASE+8][m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  cvttsd2si RA, qword [BASE+8][m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RC, TMP2[m
[32m+[m[32m  //|  cmp RB, RC				// len < end? (unsigned compare)[m
[32m+[m[32m  //|  jb >5[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  test RA, RA			// start <= 0?[m
[32m+[m[32m  //|  jle >7[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  mov STR:RB, TMP3[m
[32m+[m[32m  dasm_put(Dst, 5140, LJ_TISNUM, LJ_TSTR, LJ_TISNUM, Dt5(->len));[m
[32m+[m[32m#line 2309 "vm_x86.dasc"[m
[32m+[m[32m  //|  sub RC, RA				// start > end?[m
[32m+[m[32m  //|  jl ->fff_emptystr[m
[32m+[m[32m  //|  lea RB, [STR:RB+RA+#STR-1][m
[32m+[m[32m  //|  add RC, 1[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov TMP3, RC[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG3, RC[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov RD, RB[m
[32m+[m[32m  //|  jmp ->fff_newstr[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|5:  // Negative end or overflow.[m
[32m+[m[32m  //|  jl >6[m
[32m+[m[32m  //|  lea RC, [RC+RB+1]			// end = end+(len+1)[m
[32m+[m[32m  //|  jmp <2[m
[32m+[m[32m  //|6:  // Overflow.[m
[32m+[m[32m  //|  mov RC, RB				// end = len[m
[32m+[m[32m  //|  jmp <2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|7:  // Negative start or underflow.[m
[32m+[m[32m  //|  je >8[m
[32m+[m[32m  //|  add RA, RB				// start = start+(len+1)[m
[32m+[m[32m  //|  add RA, 1[m
[32m+[m[32m  //|  jg <3				// start > 0?[m
[32m+[m[32m  //|8:  // Underflow.[m
[32m+[m[32m  //|  mov RA, 1				// start = 1[m
[32m+[m[32m  dasm_put(Dst, 5219, sizeof(GCstr)-1);[m
[32m+[m[32m#line 2337 "vm_x86.dasc"[m
[32m+[m[32m  //|  jmp <3[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->fff_emptystr:  // Range underflow.[m
[32m+[m[32m  //|  xor RC, RC				// Zero length. Any ptr in RB is ok.[m
[32m+[m[32m  //|  jmp <4[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro ffstring_op, name[m
[32m+[m[32m  //|  .ffunc_1 string_ .. name[m
[32m+[m[32m  //|  ffgccheck[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|   lea SBUF:FCARG1, [DISPATCH+DISPATCH_GL(tmpbuf)][m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov STR:FCARG2, [BASE]		// Caveat: FCARG2 == BASE[m
[32m+[m[32m  //|   mov RC, SBUF:FCARG1->b[m
[32m+[m[32m  //|   mov SBUF:FCARG1->L, L:RB[m
[32m+[m[32m  //|   mov SBUF:FCARG1->p, RC[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_buf_putstr_ .. name .. @8[m
[32m+[m[32m  //|  mov FCARG1, eax[m
[32m+[m[32m  //|  call extern lj_buf_tostr@4[m
[32m+[m[32m  //|  jmp ->fff_resstr[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|ffstring_op reverse[m
[32m+[m[32m  dasm_put(Dst, 5290, 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR);[m
[32m+[m[32m#line 2362 "vm_x86.dasc"[m
[32m+[m[32m  //|ffstring_op lower[m
[32m+[m[32m  dasm_put(Dst, 5344, DISPATCH_GL(tmpbuf), Dt1(->base), DtE(->b), DtE(->L), DtE(->p), 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR);[m
[32m+[m[32m#line 2363 "vm_x86.dasc"[m
[32m+[m[32m  //|ffstring_op upper[m
[32m+[m[32m  dasm_put(Dst, 5417, DISPATCH_GL(tmpbuf), Dt1(->base), DtE(->b), DtE(->L), DtE(->p), 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold));[m
[32m+[m[32m#line 2364 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-- Bit library --------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_bit, name, kind, fdef[m
[32m+[m[32m  //|  fdef name[m
[32m+[m[32m  //|.if kind == 2[m
[32m+[m[32m  //|  sseconst_tobit xmm1, RBa[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  cmp dword [BASE+4], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jne >1[m
[32m+[m[32m  //|  mov RB, dword [BASE][m
[32m+[m[32m  //|.if kind > 0[m
[32m+[m[32m  //|  jmp >2[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jmp ->fff_resbit[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  ja ->fff_fallback[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  movsd xmm0, qword [BASE][m
[32m+[m[32m  //|.if kind < 2[m
[32m+[m[32m  //|  sseconst_tobit xmm1, RBa[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  addsd xmm0, xmm1[m
[32m+[m[32m  //|  movd RB, xmm0[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_bit, name, kind[m
[32m+[m[32m  //|  .ffunc_bit name, kind, .ffunc_1[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_bit bit_tobit, 0[m
[32m+[m[32m  dasm_put(Dst, 5489, LJ_TSTR, DISPATCH_GL(tmpbuf), Dt1(->base), DtE(->b), DtE(->L), DtE(->p), 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32));[m
[32m+[m[32m#line 2400 "vm_x86.dasc"[m
[32m+[m[32m  //|  jmp ->fff_resbit[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_bit_op, name, ins[m
[32m+[m[32m  //|  .ffunc_bit name, 2[m
[32m+[m[32m  //|  mov TMP2, NARGS:RD			// Save for fallback.[m
[32m+[m[32m  //|  lea RD, [BASE+NARGS:RD*8-16][m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  cmp RD, BASE[m
[32m+[m[32m  //|  jbe ->fff_resbit[m
[32m+[m[32m  //|  cmp dword [RD+4], LJ_TISNUM[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jne >2[m
[32m+[m[32m  //|  ins RB, dword [RD][m
[32m+[m[32m  //|  sub RD, 8[m
[32m+[m[32m  //|  jmp <1[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  ja ->fff_fallback_bit_op[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jae ->fff_fallback_bit_op[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  movsd xmm0, qword [RD][m
[32m+[m[32m  //|  addsd xmm0, xmm1[m
[32m+[m[32m  //|  movd RA, xmm0[m
[32m+[m[32m  //|  ins RB, RA[m
[32m+[m[32m  //|  sub RD, 8[m
[32m+[m[32m  //|  jmp <1[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_bit_op bit_band, and[m
[32m+[m[32m  dasm_put(Dst, 5567, 1+1, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32), LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 2429 "vm_x86.dasc"[m
[32m+[m[32m  //|.ffunc_bit_op bit_bor, or[m
[32m+[m[32m  //|.ffunc_bit_op bit_bxor, xor[m
[32m+[m[32m  dasm_put(Dst, 5658, 1+1, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32), LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 2431 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_bit bit_bswap, 1[m
[32m+[m[32m  dasm_put(Dst, 5777, 1+1, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32), LJ_TISNUM, LJ_TISNUM, 1+1);[m
[32m+[m[32m#line 2433 "vm_x86.dasc"[m
[32m+[m[32m  //|  bswap RB[m
[32m+[m[32m  //|  jmp ->fff_resbit[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_bit bit_bnot, 1[m
[32m+[m[32m  dasm_put(Dst, 5875, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32), 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32));[m
[32m+[m[32m#line 2437 "vm_x86.dasc"[m
[32m+[m[32m  //|  not RB[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  jmp ->fff_resbit[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|->fff_resbit:[m
[32m+[m[32m  //|  cvtsi2sd xmm0, RB[m
[32m+[m[32m  //|  jmp ->fff_resxmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->fff_fallback_bit_op:[m
[32m+[m[32m  //|  mov NARGS:RD, TMP2			// Restore for fallback[m
[32m+[m[32m  //|  jmp ->fff_fallback[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.macro .ffunc_bit_sh, name, ins[m
[32m+[m[32m  //|.if DUALNUM[m
[32m+[m[32m  //|  .ffunc_bit name, 1, .ffunc_2[m
[32m+[m[32m  //|  // Note: no inline conversion from number for 2nd argument![m
[32m+[m[32m  //|  cmp dword [BASE+12], LJ_TISNUM; jne ->fff_fallback[m
[32m+[m[32m  //|  mov RA, dword [BASE+8][m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  .ffunc_nnsse name[m
[32m+[m[32m  //|  sseconst_tobit xmm2, RBa[m
[32m+[m[32m  //|  addsd xmm0, xmm2[m
[32m+[m[32m  //|  addsd xmm1, xmm2[m
[32m+[m[32m  //|  movd RB, xmm0[m
[32m+[m[32m  //|  movd RA, xmm1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  ins RB, cl				// Assumes RA is ecx.[m
[32m+[m[32m  //|  jmp ->fff_resbit[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.ffunc_bit_sh bit_lshift, shl[m
[32m+[m[32m  dasm_put(Dst, 5948, 2+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32));[m
[32m+[m[32m#line 2469 "vm_x86.dasc"[m
[32m+[m[32m  //|.ffunc_bit_sh bit_rshift, shr[m
[32m+[m[32m  //|.ffunc_bit_sh bit_arshift, sar[m
[32m+[m[32m  dasm_put(Dst, 6032, 2+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32), 2+1);[m
[32m+[m[32m#line 2471 "vm_x86.dasc"[m
[32m+[m[32m  //|.ffunc_bit_sh bit_rol, rol[m
[32m+[m[32m  dasm_put(Dst, 6145, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32), 2+1, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 2472 "vm_x86.dasc"[m
[32m+[m[32m  //|.ffunc_bit_sh bit_ror, ror[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->fff_fallback_2:[m
[32m+[m[32m  //|  mov NARGS:RD, 1+2			// Other args are ignored, anyway.[m
[32m+[m[32m  dasm_put(Dst, 6237, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32), 2+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32));[m
[32m+[m[32m#line 2478 "vm_x86.dasc"[m
[32m+[m[32m  //|  jmp ->fff_fallback[m
[32m+[m[32m  //|->fff_fallback_1:[m
[32m+[m[32m  //|  mov NARGS:RD, 1+1			// Other args are ignored, anyway.[m
[32m+[m[32m  //|->fff_fallback:			// Call fast function fallback handler.[m
[32m+[m[32m  //|  // BASE = new base, RD = nargs+1[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov PC, [BASE-4]			// Fallback may overwrite PC.[m
[32m+[m[32m  //|  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  lea RD, [BASE+NARGS:RD*8-8][m
[32m+[m[32m  //|  lea RA, [RD+8*LUA_MINSTACK]	// Ensure enough space for handler.[m
[32m+[m[32m  //|  mov L:RB->top, RD[m
[32m+[m[32m  //|  mov CFUNC:RD, [BASE-8][m
[32m+[m[32m  //|  cmp RA, L:RB->maxstack[m
[32m+[m[32m  //|  ja >5				// Need to grow stack.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov CARG1d, L:RB[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ARG1, L:RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  call aword CFUNC:RD->f		// (lua_State *L)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[32m+[m[32m  //|  test RD, RD;  jg ->fff_res		// Returned nresults+1?[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  mov RA, L:RB->top[m
[32m+[m[32m  //|  sub RA, BASE[m
[32m+[m[32m  //|  shr RA, 3[m
[32m+[m[32m  //|  test RD, RD[m
[32m+[m[32m  //|  lea NARGS:RD, [RA+1][m
[32m+[m[32m  //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m  //|  jne ->vm_call_tail			// Returned -1?[m
[32m+[m[32m  //|  ins_callt				// Returned 0: retry fast path.[m
[32m+[m[32m  dasm_put(Dst, 6356, 1+2, 1+1, Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), Dt8(->f), Dt1(->base), Dt1(->top));[m
[32m+[m[32m#line 2511 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|// Reconstruct previous base for vmeta_call during tailcall.[m
[32m+[m[32m  //|->vm_call_tail:[m
[32m+[m[32m  //|  mov RA, BASE[m
[32m+[m[32m  //|  test PC, FRAME_TYPE[m
[32m+[m[32m  //|  jnz >3[m
[32m+[m[32m  //|  movzx RB, PC_RA[m
[32m+[m[32m  //|  not RBa				// Note: ~RB = -(RB+1)[m
[32m+[m[32m  //|  lea BASE, [BASE+RB*8]		// base = base - (RB+1)*8[m
[32m+[m[32m  //|  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  mov RB, PC[m
[32m+[m[32m  //|  and RB, -8[m
[32m+[m[32m  //|  sub BASE, RB[m
[32m+[m[32m  //|  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|5:  // Grow stack for fallback handler.[m
[32m+[m[32m  //|  mov FCARG2, LUA_MINSTACK[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  xor RD, RD				// Simulate a return 0.[m
[32m+[m[32m  //|  jmp <1				// Dumb retry (goes through ff first).[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->fff_gcstep:			// Call GC step function.[m
[32m+[m[32m  //|  // BASE = new base, RD = nargs+1[m
[32m+[m[32m  //|  pop RBa				// Must keep stack at same level.[m
[32m+[m[32m  //|  mov TMPa, RBa			// Save return address[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  lea RD, [BASE+NARGS:RD*8-8][m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  mov L:RB->top, RD[m
[32m+[m[32m  //|  call extern lj_gc_step@4		// (lua_State *L)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov RD, L:RB->top[m
[32m+[m[32m  dasm_put(Dst, 6446, Dt7(->pc), FRAME_TYPE, LUA_MINSTACK, Dt1(->base), Dt1(->base), Dt1(->top), Dt1(->base));[m
[32m+[m[32m#line 2548 "vm_x86.dasc"[m
[32m+[m[32m  //|  sub RD, BASE[m
[32m+[m[32m  //|  shr RD, 3[m
[32m+[m[32m  //|  add NARGS:RD, 1[m
[32m+[m[32m  //|  mov RBa, TMPa[m
[32m+[m[32m  //|  push RBa				// Restore return address.[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Special dispatch targets -------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_record:				// Dispatch target for recording phase.[m
[32m+[m[32m  //|.if JIT[m
[32m+[m[32m  //|  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[32m+[m[32m  //|  test RDL, HOOK_VMEVENT		// No recording while in vmevent.[m
[32m+[m[32m  //|  jnz >5[m
[32m+[m[32m  //|  // Decrement the hookcount for consistency, but always do the call.[m
[32m+[m[32m  //|  test RDL, HOOK_ACTIVE[m
[32m+[m[32m  //|  jnz >1[m
[32m+[m[32m  //|  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[32m+[m[32m  //|  jz >1[m
[32m+[m[32m  //|  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_rethook:			// Dispatch target for return hooks.[m
[32m+[m[32m  //|  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[32m+[m[32m  //|  test RDL, HOOK_ACTIVE		// Hook already active?[m
[32m+[m[32m  //|  jnz >5[m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  dasm_put(Dst, 6569, Dt1(->top), DISPATCH_GL(hookmask), HOOK_VMEVENT, HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), DISPATCH_GL(hookmask), HOOK_ACTIVE);[m
[32m+[m[32m#line 2578 "vm_x86.dasc"[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_inshook:			// Dispatch target for instr/line hooks.[m
[32m+[m[32m  //|  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[32m+[m[32m  //|  test RDL, HOOK_ACTIVE		// Hook already active?[m
[32m+[m[32m  //|  jnz >5[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[32m+[m[32m  //|  jz >5[m
[32m+[m[32m  //|  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[32m+[m[32m  //|  jz >1[m
[32m+[m[32m  //|  test RDL, LUA_MASKLINE[m
[32m+[m[32m  //|  jz >5[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov FCARG2, PC			// Caveat: FCARG2 == BASE[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[32m+[m[32m  //|  call extern lj_dispatch_ins@8	// (lua_State *L, const BCIns *pc)[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  dasm_put(Dst, 6635, DISPATCH_GL(hookmask), HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), LUA_MASKLINE, Dt1(->base));[m
[32m+[m[32m#line 2599 "vm_x86.dasc"[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|  movzx RA, PC_RA[m
[32m+[m[32m  //|5:[m
[32m+[m[32m  //|  movzx OP, PC_OP[m
[32m+[m[32m  //|  movzx RD, PC_RD[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Re-dispatch to static ins.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jmp aword [DISPATCH+OP*4+GG_DISP2STATIC]	// Re-dispatch to static ins.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->cont_hook:				// Continue from hook yield.[m
[32m+[m[32m  //|  add PC, 4[m
[32m+[m[32m  //|  mov RA, [RB-24][m
[32m+[m[32m  //|  mov MULTRES, RA			// Restore MULTRES for *M ins.[m
[32m+[m[32m  //|  jmp <4[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_hotloop:			// Hot loop counter underflow.[m
[32m+[m[32m  //|.if JIT[m
[32m+[m[32m  //|  mov LFUNC:RB, [BASE-8]		// Same as curr_topL(L).[m
[32m+[m[32m  //|  mov RB, LFUNC:RB->pc[m
[32m+[m[32m  //|  movzx RD, byte [RB+PC2PROTO(framesize)][m
[32m+[m[32m  //|  lea RD, [BASE+RD*8][m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov L:RB->top, RD[m
[32m+[m[32m  //|  mov FCARG2, PC[m
[32m+[m[32m  //|  lea FCARG1, [DISPATCH+GG_DISP2J][m
[32m+[m[32m  //|  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|  call extern lj_trace_hot@8		// (jit_State *J, const BCIns *pc)[m
[32m+[m[32m  //|  jmp <3[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_callhook:			// Dispatch target for call hooks.[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  //|.if JIT[m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_hotcall:			// Hot call counter underflow.[m
[32m+[m[32m  //|.if JIT[m
[32m+[m[32m  //|  mov SAVE_PC, PC[m
[32m+[m[32m  dasm_put(Dst, 6694, Dt1(->base), GG_DISP2STATIC, Dt7(->pc), PC2PROTO(framesize), Dt1(->base), Dt1(->top), GG_DISP2J, DISPATCH_J(L));[m
[32m+[m[32m#line 2642 "vm_x86.dasc"[m
[32m+[m[32m  //|  or PC, 1				// Marker for hot call.[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  lea RD, [BASE+NARGS:RD*8-8][m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov L:RB->top, RD[m
[32m+[m[32m  //|  mov FCARG2, PC[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  call extern lj_dispatch_call@8	// (lua_State *L, const BCIns *pc)[m
[32m+[m[32m  //|  // ASMFunction returned in eax/rax (RDa).[m
[32m+[m[32m  //|  mov SAVE_PC, 0			// Invalidate for subsequent line hook.[m
[32m+[m[32m  //|.if JIT[m
[32m+[m[32m  //|  and PC, -2[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov RAa, RDa[m
[32m+[m[32m  //|  mov RD, L:RB->top[m
[32m+[m[32m  //|  sub RD, BASE[m
[32m+[m[32m  //|  mov RBa, RAa[m
[32m+[m[32m  //|  movzx RA, PC_RA[m
[32m+[m[32m  //|  shr RD, 3[m
[32m+[m[32m  //|  add NARGS:RD, 1[m
[32m+[m[32m  //|  jmp RBa[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->cont_stitch:			// Trace stitching.[m
[32m+[m[32m  //|.if JIT[m
[32m+[m[32m  //|  // BASE = base, RC = result, RB = mbase[m
[32m+[m[32m  //|  mov TRACE:RA, [RB-24]		// Save previous trace.[m
[32m+[m[32m  //|  mov TMP1, TRACE:RA[m
[32m+[m[32m  //|  mov TMP3, DISPATCH			// Need one more register.[m
[32m+[m[32m  //|  mov DISPATCH, MULTRES[m
[32m+[m[32m  //|  movzx RA, PC_RA[m
[32m+[m[32m  //|  lea RA, [BASE+RA*8]		// Call base.[m
[32m+[m[32m  //|  sub DISPATCH, 1[m
[32m+[m[32m  //|  jz >2[m
[32m+[m[32m  //|1:  // Move results down.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov RBa, [RC][m
[32m+[m[32m  //|  mov [RA], RBa[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov RB, [RC][m
[32m+[m[32m  //|  mov [RA], RB[m
[32m+[m[32m  //|  mov RB, [RC+4][m
[32m+[m[32m  //|  mov [RA+4], RB[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  add RC, 8[m
[32m+[m[32m  //|  add RA, 8[m
[32m+[m[32m  //|  sub DISPATCH, 1[m
[32m+[m[32m  //|  jnz <1[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  movzx RC, PC_RA[m
[32m+[m[32m  //|  movzx RB, PC_RB[m
[32m+[m[32m  //|  add RC, RB[m
[32m+[m[32m  //|  lea RC, [BASE+RC*8-8][m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|  cmp RC, RA[m
[32m+[m[32m  //|  ja >9				// More results wanted?[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  mov DISPATCH, TMP3[m
[32m+[m[32m  //|  mov TRACE:RD, TMP1			// Get previous trace.[m
[32m+[m[32m  //|  movzx RB, word TRACE:RD->traceno[m
[32m+[m[32m  //|  movzx RD, word TRACE:RD->link[m
[32m+[m[32m  //|  cmp RD, RB[m
[32m+[m[32m  //|  je ->cont_nop			// Blacklisted.[m
[32m+[m[32m  //|  test RD, RD[m
[32m+[m[32m  dasm_put(Dst, 6801, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top), DtD(->traceno), DtD(->link));[m
[32m+[m[32m#line 2708 "vm_x86.dasc"[m
[32m+[m[32m  //|  jne =>BC_JLOOP			// Jump to stitched trace.[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  // Stitch a new trace to the previous trace.[m
[32m+[m[32m  //|  mov [DISPATCH+DISPATCH_J(exitno)], RB[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov FCARG2, PC[m
[32m+[m[32m  //|  lea FCARG1, [DISPATCH+GG_DISP2J][m
[32m+[m[32m  //|  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[32m+[m[32m  //|  call extern lj_dispatch_stitch@8	// (jit_State *J, const BCIns *pc)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  jmp ->cont_nop[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|9:  // Fill up results with nil.[m
[32m+[m[32m  //|  mov dword [RA+4], LJ_TNIL[m
[32m+[m[32m  //|  add RA, 8[m
[32m+[m[32m  //|  jmp <3[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_profhook:			// Dispatch target for profiler hook.[m
[32m+[m[32m  dasm_put(Dst, 6982, BC_JLOOP, DISPATCH_J(exitno), Dt1(->base), GG_DISP2J, DISPATCH_J(L), Dt1(->base), LJ_TNIL);[m
[32m+[m[32m#line 2728 "vm_x86.dasc"[m
[32m+[m[32m#if LJ_HASPROFILE[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov FCARG2, PC			// Caveat: FCARG2 == BASE[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  call extern lj_dispatch_profile@8	// (lua_State *L, const BCIns *pc)[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[32m+[m[32m  //|  sub PC, 4[m
[32m+[m[32m  //|  jmp ->cont_nop[m
[32m+[m[32m  dasm_put(Dst, 7035, Dt1(->base), Dt1(->base));[m
[32m+[m[32m#line 2738 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Trace exit handler -------------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|// Called from an exit stub with the exit number on the stack.[m
[32m+[m[32m  //|// The 16 bit exit number is stored with two (sign-extended) push imm8.[m
[32m+[m[32m  //|->vm_exit_handler:[m
[32m+[m[32m  //|.if JIT[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  push r13; push r12[m
[32m+[m[32m  //|  push r11; push r10; push r9; push r8[m
[32m+[m[32m  //|  push rdi; push rsi; push rbp; lea rbp, [rsp+88]; push rbp[m
[32m+[m[32m  //|  push rbx; push rdx; push rcx; push rax[m
[32m+[m[32m  //|  movzx RC, byte [rbp-8]		// Reconstruct exit number.[m
[32m+[m[32m  //|  mov RCH, byte [rbp-16][m
[32m+[m[32m  //|  mov [rbp-8], r15; mov [rbp-16], r14[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  push ebp; lea ebp, [esp+12]; push ebp[m
[32m+[m[32m  //|  push ebx; push edx; push ecx; push eax[m
[32m+[m[32m  //|  movzx RC, byte [ebp-4]		// Reconstruct exit number.[m
[32m+[m[32m  //|  mov RCH, byte [ebp-8][m
[32m+[m[32m  //|  mov [ebp-4], edi; mov [ebp-8], esi[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  // Caveat: DISPATCH is ebx.[m
[32m+[m[32m  //|  mov DISPATCH, [ebp][m
[32m+[m[32m  //|  mov RA, [DISPATCH+DISPATCH_GL(vmstate)]	// Get trace number.[m
[32m+[m[32m  //|  set_vmstate EXIT[m
[32m+[m[32m  //|  mov [DISPATCH+DISPATCH_J(exitno)], RC[m
[32m+[m[32m  //|  mov [DISPATCH+DISPATCH_J(parent)], RA[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  sub rsp, 16*8+4*8			// Room for SSE regs + save area.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  sub rsp, 16*8			// Room for SSE regs.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  add rbp, -128[m
[32m+[m[32m  //|  movsd qword [rbp-8],   xmm15; movsd qword [rbp-16],  xmm14[m
[32m+[m[32m  //|  movsd qword [rbp-24],  xmm13; movsd qword [rbp-32],  xmm12[m
[32m+[m[32m  //|  movsd qword [rbp-40],  xmm11; movsd qword [rbp-48],  xmm10[m
[32m+[m[32m  //|  movsd qword [rbp-56],  xmm9;  movsd qword [rbp-64],  xmm8[m
[32m+[m[32m  //|  movsd qword [rbp-72],  xmm7;  movsd qword [rbp-80],  xmm6[m
[32m+[m[32m  //|  movsd qword [rbp-88],  xmm5;  movsd qword [rbp-96],  xmm4[m
[32m+[m[32m  //|  movsd qword [rbp-104], xmm3;  movsd qword [rbp-112], xmm2[m
[32m+[m[32m  //|  movsd qword [rbp-120], xmm1;  movsd qword [rbp-128], xmm0[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  sub esp, 8*8+16			// Room for SSE regs + args.[m
[32m+[m[32m  //|  movsd qword [ebp-40], xmm7; movsd qword [ebp-48], xmm6[m
[32m+[m[32m  //|  movsd qword [ebp-56], xmm5; movsd qword [ebp-64], xmm4[m
[32m+[m[32m  //|  movsd qword [ebp-72], xmm3; movsd qword [ebp-80], xmm2[m
[32m+[m[32m  //|  movsd qword [ebp-88], xmm1; movsd qword [ebp-96], xmm0[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  // Caveat: RB is ebp.[m
[32m+[m[32m  //|  mov L:RB, [DISPATCH+DISPATCH_GL(cur_L)][m
[32m+[m[32m  //|  mov BASE, [DISPATCH+DISPATCH_GL(jit_base)][m
[32m+[m[32m  //|  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  lea CARG2, [rsp+4*8][m
[32m+[m[32m  //|.elif X64[m
[32m+[m[32m  //|  mov CARG2, rsp[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  lea FCARG2, [esp+16][m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  lea FCARG1, [DISPATCH+GG_DISP2J][m
[32m+[m[32m  //|  mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[32m+[m[32m  //|  call extern lj_trace_exit@8	// (jit_State *J, ExitState *ex)[m
[32m+[m[32m  //|  // MULTRES or negated error code returned in eax (RD).[m
[32m+[m[32m  //|  mov RAa, L:RB->cframe[m
[32m+[m[32m  //|  and RAa, CFRAME_RAWMASK[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  // Reposition stack later.[m
[32m+[m[32m  //|.elif X64[m
[32m+[m[32m  //|  mov rsp, RAa			// Reposition stack to C frame.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov esp, RAa			// Reposition stack to C frame.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov [RAa+CFRAME_OFS_L], L:RB	// Set SAVE_L (on-trace resume/yield).[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|  mov PC, [RAa+CFRAME_OFS_PC]	// Get SAVE_PC.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  jmp >1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|->vm_exit_interp:[m
[32m+[m[32m  //|  // RD = MULTRES or negated error code, BASE, PC and DISPATCH set.[m
[32m+[m[32m  //|.if JIT[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  // Restore additional callee-save registers only used in compiled code.[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  lea RAa, [rsp+9*16+4*8][m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  movdqa xmm15, [RAa-9*16][m
[32m+[m[32m  //|  movdqa xmm14, [RAa-8*16][m
[32m+[m[32m  //|  movdqa xmm13, [RAa-7*16][m
[32m+[m[32m  //|  movdqa xmm12, [RAa-6*16][m
[32m+[m[32m  //|  movdqa xmm11, [RAa-5*16][m
[32m+[m[32m  //|  movdqa xmm10, [RAa-4*16][m
[32m+[m[32m  //|  movdqa xmm9, [RAa-3*16][m
[32m+[m[32m  //|  movdqa xmm8, [RAa-2*16][m
[32m+[m[32m  //|  movdqa xmm7, [RAa-1*16][m
[32m+[m[32m  //|  mov rsp, RAa			// Reposition stack to C frame.[m
[32m+[m[32m  //|  movdqa xmm6, [RAa][m
[32m+[m[32m  //|  mov r15, CSAVE_3[m
[32m+[m[32m  //|  mov r14, CSAVE_4[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  add rsp, 16			// Reposition stack to C frame.[m
[32m+[m[32m  dasm_put(Dst, 7063, DISPATCH_GL(vmstate), DISPATCH_GL(vmstate), ~LJ_VMST_EXIT, DISPATCH_J(exitno), DISPATCH_J(parent), 16*8, DISPATCH_GL(cur_L), DISPATCH_GL(jit_base), DISPATCH_J(L), Dt1(->base), GG_DISP2J, DISPATCH_GL(jit_base), Dt1(->cframe), CFRAME_RAWMASK, CFRAME_OFS_L, Dt1(->base), CFRAME_OFS_PC);[m
[32m+[m[32m#line 2846 "vm_x86.dasc"[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov r13, TMPa[m
[32m+[m[32m  //|  mov r12, TMPQ[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  dasm_put(Dst, 7306);[m
[32m+[m[32m#line 2851 "vm_x86.dasc"[m
[32m+[m[32m#ifdef LUA_USE_TRACE_LOGS[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov FCARG1, SAVE_L[m
[32m+[m[32m  //|  mov L:FCARG1->base, BASE[m
[32m+[m[32m  //|  mov RB, RD     // Save RD[m
[32m+[m[32m  //|  mov TMP1, PC  // Save PC[m
[32m+[m[32m  //|  mov CARG3d, PC   // CARG3d == BASE[m
[32m+[m[32m  //|  mov FCARG2, dword [DISPATCH+DISPATCH_GL(vmstate)][m
[32m+[m[32m  //|  call extern lj_log_trace_direct_exit@8[m
[32m+[m[32m  //|  mov PC, TMP1[m
[32m+[m[32m  //|  mov RD, RB[m
[32m+[m[32m  //|  mov RB, SAVE_L[m
[32m+[m[32m  //|  mov BASE, L:RB->base[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  dasm_put(Dst, 7322, Dt1(->base), DISPATCH_GL(vmstate), Dt1(->base));[m
[32m+[m[32m#line 2865 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m  //|  test RD, RD; js >9			// Check for error from exit.[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov MULTRES, RD[m
[32m+[m[32m  //|  mov LFUNC:KBASE, [BASE-8][m
[32m+[m[32m  //|  mov KBASE, LFUNC:KBASE->pc[m
[32m+[m[32m  //|  mov KBASE, [KBASE+PC2PROTO(k)][m
[32m+[m[32m  //|  mov L:RB->base, BASE[m
[32m+[m[32m  //|  mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[32m+[m[32m  //|  set_vmstate INTERP[m
[32m+[m[32m  //|  // Modified copy of ins_next which handles function header dispatch, too.[m
[32m+[m[32m  //|  mov RC, [PC][m
[32m+[m[32m  //|  movzx RA, RCH[m
[32m+[m[32m  //|  movzx OP, RCL[m
[32m+[m[32m  //|  add PC, 4[m
[32m+[m[32m  //|  shr RC, 16[m
[32m+[m[32m  //|  cmp OP, BC_FUNCF			// Function header?[m
[32m+[m[32m  //|  jb >3[m
[32m+[m[32m  //|  cmp OP, BC_FUNCC+2			// Fast function?[m
[32m+[m[32m  //|  jae >4[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  mov RC, MULTRES			// RC/RD holds nres+1.[m
[32m+[m[32m  //|3:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  jmp aword [DISPATCH+OP*8][m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  jmp aword [DISPATCH+OP*4][m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|4:  // Check frame below fast function.[m
[32m+[m[32m  //|  mov RC, [BASE-4][m
[32m+[m[32m  //|  test RC, FRAME_TYPE[m
[32m+[m[32m  //|  jnz <2				// Trace stitching continuation?[m
[32m+[m[32m  //|  // Otherwise set KBASE for Lua function below fast function.[m
[32m+[m[32m  //|  movzx RC, byte [RC-3][m
[32m+[m[32m  dasm_put(Dst, 7357, Dt7(->pc), PC2PROTO(k), Dt1(->base), DISPATCH_GL(jit_base), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, BC_FUNCF, BC_FUNCC+2, FRAME_TYPE);[m
[32m+[m[32m#line 2900 "vm_x86.dasc"[m
[32m+[m[32m  //|  not RCa[m
[32m+[m[32m  //|  mov LFUNC:KBASE, [BASE+RC*8-8][m
[32m+[m[32m  //|  mov KBASE, LFUNC:KBASE->pc[m
[32m+[m[32m  //|  mov KBASE, [KBASE+PC2PROTO(k)][m
[32m+[m[32m  //|  jmp <2[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|9:  // Rethrow error from the right C frame.[m
[32m+[m[32m  //|  neg RD[m
[32m+[m[32m  //|  mov FCARG1, L:RB[m
[32m+[m[32m  //|  mov FCARG2, RD[m
[32m+[m[32m  //|  call extern lj_err_throw@8		// (lua_State *L, int errcode)[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Math helper functions ----------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|// FP value rounding. Called by math.floor/math.ceil fast functions[m
[32m+[m[32m  //|// and from JIT code. arg/ret is xmm0. xmm0-xmm3 and RD (eax) modified.[m
[32m+[m[32m  //|.macro vm_round, name, mode, cond[m
[32m+[m[32m  //|->name:[m
[32m+[m[32m  //|.if not X64 and cond[m
[32m+[m[32m  //|  movsd xmm0, qword [esp+4][m
[32m+[m[32m  //|  call ->name .. _sse[m
[32m+[m[32m  //|  movsd qword [esp+4], xmm0  // Overwrite callee-owned arg.[m
[32m+[m[32m  //|  fld qword [esp+4][m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->name .. _sse:[m
[32m+[m[32m  //|  sseconst_abs xmm2, RDa[m
[32m+[m[32m  //|  sseconst_2p52 xmm3, RDa[m
[32m+[m[32m  //|  movaps xmm1, xmm0[m
[32m+[m[32m  //|  andpd xmm1, xmm2			// |x|[m
[32m+[m[32m  //|  ucomisd xmm3, xmm1			// No truncation if 2^52 <= |x|.[m
[32m+[m[32m  //|  jbe >1[m
[32m+[m[32m  //|  andnpd xmm2, xmm0			// Isolate sign bit.[m
[32m+[m[32m  //|.if mode == 2		// trunc(x)?[m
[32m+[m[32m  //|  movaps xmm0, xmm1[m
[32m+[m[32m  //|  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[32m+[m[32m  //|  subsd xmm1, xmm3[m
[32m+[m[32m  //|  sseconst_1 xmm3, RDa[m
[32m+[m[32m  //|  cmpsd xmm0, xmm1, 1		// |x| < result?[m
[32m+[m[32m  //|  andpd xmm0, xmm3[m
[32m+[m[32m  //|  subsd xmm1, xmm0			// If yes, subtract -1.[m
[32m+[m[32m  //|  orpd xmm1, xmm2			// Merge sign bit back in.[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[32m+[m[32m  //|  subsd xmm1, xmm3[m
[32m+[m[32m  //|  orpd xmm1, xmm2			// Merge sign bit back in.[m
[32m+[m[32m  //|  .if mode == 1		// ceil(x)?[m
[32m+[m[32m  //|    sseconst_m1 xmm2, RDa		// Must subtract -1 to preserve -0.[m
[32m+[m[32m  //|    cmpsd xmm0, xmm1, 6		// x > result?[m
[32m+[m[32m  //|  .else			// floor(x)?[m
[32m+[m[32m  //|    sseconst_1 xmm2, RDa[m
[32m+[m[32m  //|    cmpsd xmm0, xmm1, 1		// x < result?[m
[32m+[m[32m  //|  .endif[m
[32m+[m[32m  //|  andpd xmm0, xmm2[m
[32m+[m[32m  //|  subsd xmm1, xmm0			// If yes, subtract +-1.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  movaps xmm0, xmm1[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|.endmacro[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  vm_round vm_floor, 0, 1[m
[32m+[m[32m  //|  vm_round vm_ceil,  1, JIT[m
[32m+[m[32m  dasm_put(Dst, 7457, Dt7(->pc), PC2PROTO(k), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32));[m
[32m+[m[32m#line 2967 "vm_x86.dasc"[m
[32m+[m[32m  //|  vm_round vm_trunc, 2, JIT[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|// FP modulo x%y. Called by BC_MOD* and vm_arith.[m
[32m+[m[32m  //|->vm_mod:[m
[32m+[m[32m  //|// Args in xmm0/xmm1, return value in xmm0.[m
[32m+[m[32m  //|// Caveat: xmm0-xmm5 and RC (eax) modified![m
[32m+[m[32m  //|  movaps xmm5, xmm0[m
[32m+[m[32m  dasm_put(Dst, 7592, (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(bff00000,00000000)), (unsigned int)((U64x(bff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32));[m
[32m+[m[32m#line 2974 "vm_x86.dasc"[m
[32m+[m[32m  //|  divsd xmm0, xmm1[m
[32m+[m[32m  //|  sseconst_abs xmm2, RDa[m
[32m+[m[32m  //|  sseconst_2p52 xmm3, RDa[m
[32m+[m[32m  //|  movaps xmm4, xmm0[m
[32m+[m[32m  //|  andpd xmm4, xmm2			// |x/y|[m
[32m+[m[32m  //|  ucomisd xmm3, xmm4			// No truncation if 2^52 <= |x/y|.[m
[32m+[m[32m  //|  jbe >1[m
[32m+[m[32m  //|  andnpd xmm2, xmm0			// Isolate sign bit.[m
[32m+[m[32m  //|  addsd xmm4, xmm3			// (|x/y| + 2^52) - 2^52[m
[32m+[m[32m  //|  subsd xmm4, xmm3[m
[32m+[m[32m  //|  orpd xmm4, xmm2			// Merge sign bit back in.[m
[32m+[m[32m  //|  sseconst_1 xmm2, RDa[m
[32m+[m[32m  //|  cmpsd xmm0, xmm4, 1		// x/y < result?[m
[32m+[m[32m  //|  andpd xmm0, xmm2[m
[32m+[m[32m  //|  subsd xmm4, xmm0			// If yes, subtract 1.0.[m
[32m+[m[32m  //|  movaps xmm0, xmm5[m
[32m+[m[32m  //|  mulsd xmm1, xmm4[m
[32m+[m[32m  //|  subsd xmm0, xmm1[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  mulsd xmm1, xmm0[m
[32m+[m[32m  //|  movaps xmm0, xmm5[m
[32m+[m[32m  //|  subsd xmm0, xmm1[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|// Args in xmm0/eax. Ret in xmm0. xmm0-xmm1 and eax modified.[m
[32m+[m[32m  //|->vm_powi_sse:[m
[32m+[m[32m  //|  cmp eax, 1; jle >6			// i<=1?[m
[32m+[m[32m  //|  // Now 1 < (unsigned)i <= 0x80000000.[m
[32m+[m[32m  //|1:  // Handle leading zeros.[m
[32m+[m[32m  //|  test eax, 1; jnz >2[m
[32m+[m[32m  //|  mulsd xmm0, xmm0[m
[32m+[m[32m  //|  shr eax, 1[m
[32m+[m[32m  //|  jmp <1[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|  shr eax, 1; jz >5[m
[32m+[m[32m  //|  movaps xmm1, xmm0[m
[32m+[m[32m  dasm_put(Dst, 7760, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32));[m
[32m+[m[32m#line 3011 "vm_x86.dasc"[m
[32m+[m[32m  //|3:  // Handle trailing bits.[m
[32m+[m[32m  //|  mulsd xmm0, xmm0[m
[32m+[m[32m  //|  shr eax, 1; jz >4[m
[32m+[m[32m  //|  jnc <3[m
[32m+[m[32m  //|  mulsd xmm1, xmm0[m
[32m+[m[32m  //|  jmp <3[m
[32m+[m[32m  //|4:[m
[32m+[m[32m  //|  mulsd xmm0, xmm1[m
[32m+[m[32m  //|5:[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|6:[m
[32m+[m[32m  //|  je <5				// x^1 ==> x[m
[32m+[m[32m  //|  jb >7				// x^0 ==> 1[m
[32m+[m[32m  //|  neg eax[m
[32m+[m[32m  //|  call <1[m
[32m+[m[32m  //|  sseconst_1 xmm1, RDa[m
[32m+[m[32m  //|  divsd xmm1, xmm0[m
[32m+[m[32m  //|  movaps xmm0, xmm1[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|7:[m
[32m+[m[32m  //|  sseconst_1 xmm0, RDa[m
[32m+[m[32m  dasm_put(Dst, 7914, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32));[m
[32m+[m[32m#line 3032 "vm_x86.dasc"[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Miscellaneous functions --------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|// int lj_vm_cpuid(uint32_t f, uint32_t res[4])[m
[32m+[m[32m  //|->vm_cpuid:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov eax, CARG1d[m
[32m+[m[32m  //|  .if X64WIN; push rsi; mov rsi, CARG2; .endif[m
[32m+[m[32m  //|  push rbx[m
[32m+[m[32m  //|  xor ecx, ecx[m
[32m+[m[32m  //|  cpuid[m
[32m+[m[32m  //|  mov [rsi], eax[m
[32m+[m[32m  //|  mov [rsi+4], ebx[m
[32m+[m[32m  //|  mov [rsi+8], ecx[m
[32m+[m[32m  //|  mov [rsi+12], edx[m
[32m+[m[32m  //|  pop rbx[m
[32m+[m[32m  //|  .if X64WIN; pop rsi; .endif[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  pushfd[m
[32m+[m[32m  //|  pop edx[m
[32m+[m[32m  //|  mov ecx, edx[m
[32m+[m[32m  //|  xor edx, 0x00200000		// Toggle ID bit in flags.[m
[32m+[m[32m  //|  push edx[m
[32m+[m[32m  //|  popfd[m
[32m+[m[32m  //|  pushfd[m
[32m+[m[32m  //|  pop edx[m
[32m+[m[32m  //|  xor eax, eax			// Zero means no features supported.[m
[32m+[m[32m  //|  cmp ecx, edx[m
[32m+[m[32m  //|  jz >1				// No ID toggle means no CPUID support.[m
[32m+[m[32m  //|  mov eax, [esp+4]			// Argument 1 is function number.[m
[32m+[m[32m  //|  push edi[m
[32m+[m[32m  //|  push ebx[m
[32m+[m[32m  //|  xor ecx, ecx[m
[32m+[m[32m  //|  cpuid[m
[32m+[m[32m  //|  mov edi, [esp+16]			// Argument 2 is result area.[m
[32m+[m[32m  //|  mov [edi], eax[m
[32m+[m[32m  //|  mov [edi+4], ebx[m
[32m+[m[32m  //|  mov [edi+8], ecx[m
[32m+[m[32m  //|  mov [edi+12], edx[m
[32m+[m[32m  //|  pop ebx[m
[32m+[m[32m  //|  pop edi[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- Assertions ---------------------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->assert_bad_for_arg_type:[m
[32m+[m[32m  dasm_put(Dst, 7994);[m
[32m+[m[32m#line 3086 "vm_x86.dasc"[m
[32m+[m[32m#ifdef LUA_USE_ASSERT[m
[32m+[m[32m  //|  int3[m
[32m+[m[32m  dasm_put(Dst, 8026);[m
[32m+[m[32m#line 3088 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m  //|  int3[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|//-- FFI helper functions -----------------------------------------------[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|// Handler for callback functions. Callback slot number in ah/al.[m
[32m+[m[32m  //|->vm_ffi_callback:[m
[32m+[m[32m  //|.if FFI[m
[32m+[m[32m  //|.type CTSTATE, CTState, PC[m
[32m+[m[32m#define DtF(_V) (int)(ptrdiff_t)&(((CTState *)0)_V)[m
[32m+[m[32m#line 3099 "vm_x86.dasc"[m
[32m+[m[32m  //|.if not X64[m
[32m+[m[32m  //|  sub esp, 16			// Leave room for SAVE_ERRF etc.[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  saveregs_	// ebp/rbp already saved. ebp now holds global_State *.[m
[32m+[m[32m  //|  lea DISPATCH, [ebp+GG_G2DISP][m
[32m+[m[32m  //|  mov CTSTATE, GL:ebp->ctype_state[m
[32m+[m[32m  //|  movzx eax, ax[m
[32m+[m[32m  //|  mov CTSTATE->cb.slot, eax[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov CTSTATE->cb.gpr[0], CARG1[m
[32m+[m[32m  //|  mov CTSTATE->cb.gpr[1], CARG2[m
[32m+[m[32m  //|  mov CTSTATE->cb.gpr[2], CARG3[m
[32m+[m[32m  //|  mov CTSTATE->cb.gpr[3], CARG4[m
[32m+[m[32m  //|  movsd qword CTSTATE->cb.fpr[0], xmm0[m
[32m+[m[32m  //|  movsd qword CTSTATE->cb.fpr[1], xmm1[m
[32m+[m[32m  //|  movsd qword CTSTATE->cb.fpr[2], xmm2[m
[32m+[m[32m  //|  movsd qword CTSTATE->cb.fpr[3], xmm3[m
[32m+[m[32m  //|.if X64WIN[m
[32m+[m[32m  //|  lea rax, [rsp+CFRAME_SIZE+4*8][m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  lea rax, [rsp+CFRAME_SIZE][m
[32m+[m[32m  //|  mov CTSTATE->cb.gpr[4], CARG5[m
[32m+[m[32m  //|  mov CTSTATE->cb.gpr[5], CARG6[m
[32m+[m[32m  //|  movsd qword CTSTATE->cb.fpr[4], xmm4[m
[32m+[m[32m  //|  movsd qword CTSTATE->cb.fpr[5], xmm5[m
[32m+[m[32m  //|  movsd qword CTSTATE->cb.fpr[6], xmm6[m
[32m+[m[32m  //|  movsd qword CTSTATE->cb.fpr[7], xmm7[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov CTSTATE->cb.stack, rax[m
[32m+[m[32m  dasm_put(Dst, 8028, GG_G2DISP, Dt2(->ctype_state), DtF(->cb.slot), DtF(->cb.gpr[0]), DtF(->cb.gpr[1]), DtF(->cb.gpr[2]), DtF(->cb.gpr[3]), DtF(->cb.fpr[0]), DtF(->cb.fpr[1]), DtF(->cb.fpr[2]), DtF(->cb.fpr[3]), CFRAME_SIZE, DtF(->cb.gpr[4]), DtF(->cb.gpr[5]), DtF(->cb.fpr[4]), DtF(->cb.fpr[5]), DtF(->cb.fpr[6]), DtF(->cb.fpr[7]));[m
[32m+[m[32m#line 3128 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov CARG2, rsp[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  lea eax, [esp+CFRAME_SIZE+16][m
[32m+[m[32m  //|  mov CTSTATE->cb.gpr[0], FCARG1[m
[32m+[m[32m  //|  mov CTSTATE->cb.gpr[1], FCARG2[m
[32m+[m[32m  //|  mov CTSTATE->cb.stack, eax[m
[32m+[m[32m  //|  mov FCARG1, [esp+CFRAME_SIZE+12]	// Move around misplaced retaddr/ebp.[m
[32m+[m[32m  //|  mov FCARG2, [esp+CFRAME_SIZE+8][m
[32m+[m[32m  //|  mov SAVE_RET, FCARG1[m
[32m+[m[32m  //|  mov SAVE_R4, FCARG2[m
[32m+[m[32m  //|  mov FCARG2, esp[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  mov SAVE_PC, CTSTATE		// Any value outside of bytecode is ok.[m
[32m+[m[32m  //|  mov FCARG1, CTSTATE[m
[32m+[m[32m  //|  call extern lj_ccallback_enter@8	// (CTState *cts, void *cf)[m
[32m+[m[32m  //|  // lua_State * returned in eax (RD).[m
[32m+[m[32m  //|  set_vmstate INTERP[m
[32m+[m[32m  //|  mov BASE, L:RD->base[m
[32m+[m[32m  //|  mov RD, L:RD->top[m
[32m+[m[32m  //|  sub RD, BASE[m
[32m+[m[32m  //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m  //|  shr RD, 3[m
[32m+[m[32m  //|  add RD, 1[m
[32m+[m[32m  //|  ins_callt[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->cont_ffi_callback:			// Return from FFI callback.[m
[32m+[m[32m  //|.if FFI[m
[32m+[m[32m  //|  mov L:RA, SAVE_L[m
[32m+[m[32m  //|  mov CTSTATE, [DISPATCH+DISPATCH_GL(ctype_state)][m
[32m+[m[32m  //|  mov aword CTSTATE->L, L:RAa[m
[32m+[m[32m  //|  mov L:RA->base, BASE[m
[32m+[m[32m  //|  mov L:RA->top, RB[m
[32m+[m[32m  //|  mov FCARG1, CTSTATE[m
[32m+[m[32m  //|  mov FCARG2, RC[m
[32m+[m[32m  //|  call extern lj_ccallback_leave@8	// (CTState *cts, TValue *o)[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov rax, CTSTATE->cb.gpr[0][m
[32m+[m[32m  //|  movsd xmm0, qword CTSTATE->cb.fpr[0][m
[32m+[m[32m  //|  jmp ->vm_leave_unw[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov L:RB, SAVE_L[m
[32m+[m[32m  //|  mov eax, CTSTATE->cb.gpr[0][m
[32m+[m[32m  //|  mov edx, CTSTATE->cb.gpr[1][m
[32m+[m[32m  //|  cmp dword CTSTATE->cb.gpr[2], 1[m
[32m+[m[32m  //|  jb >7[m
[32m+[m[32m  //|  je >6[m
[32m+[m[32m  //|  fld qword CTSTATE->cb.fpr[0].d[m
[32m+[m[32m  //|  jmp >7[m
[32m+[m[32m  //|6:[m
[32m+[m[32m  //|  fld dword CTSTATE->cb.fpr[0].f[m
[32m+[m[32m  //|7:[m
[32m+[m[32m  //|  mov ecx, L:RB->top[m
[32m+[m[32m  //|  movzx ecx, word [ecx+6]		// Get stack adjustment and copy up.[m
[32m+[m[32m  //|  mov SAVE_L, ecx			// Must be one slot above SAVE_RET[m
[32m+[m[32m  //|  restoreregs[m
[32m+[m[32m  //|  pop ecx				// Move return addr from SAVE_RET.[m
[32m+[m[32m  //|  add esp, [esp]			// Adjust stack.[m
[32m+[m[32m  //|  add esp, 16[m
[32m+[m[32m  //|  push ecx[m
[32m+[m[32m  //|  ret[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|->vm_ffi_call@4:			// Call C function via FFI.[m
[32m+[m[32m  //|  // Caveat: needs special frame unwinding, see below.[m
[32m+[m[32m  //|.if FFI[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  .type CCSTATE, CCallState, rbx[m
[32m+[m[32m#define Dt10(_V) (int)(ptrdiff_t)&(((CCallState *)0)_V)[m
[32m+[m[32m#line 3197 "vm_x86.dasc"[m
[32m+[m[32m  //|  push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  .type CCSTATE, CCallState, ebx[m
[32m+[m[32m  //|  push ebp; mov ebp, esp; push ebx; mov CCSTATE, FCARG1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  // Readjust stack.[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov eax, CCSTATE->spadj[m
[32m+[m[32m  //|  sub rsp, rax[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  sub esp, CCSTATE->spadj[m
[32m+[m[32m  //|.if WIN[m
[32m+[m[32m  //|  mov CCSTATE->spadj, esp[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  // Copy stack slots.[m
[32m+[m[32m  //|  movzx ecx, byte CCSTATE->nsp[m
[32m+[m[32m  //|  sub ecx, 1[m
[32m+[m[32m  //|  js >2[m
[32m+[m[32m  //|1:[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov rax, [CCSTATE+rcx*8+offsetof(CCallState, stack)][m
[32m+[m[32m  dasm_put(Dst, 8133, DtF(->cb.stack), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top), Dt7(->pc), DISPATCH_GL(ctype_state), DtF(->L), Dt1(->base), Dt1(->top), DtF(->cb.gpr[0]), DtF(->cb.fpr[0]), Dt10(->spadj), Dt10(->nsp));[m
[32m+[m[32m#line 3221 "vm_x86.dasc"[m
[32m+[m[32m  //|  mov [rsp+rcx*8+CCALL_SPS_EXTRA*8], rax[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov eax, [CCSTATE+ecx*4+offsetof(CCallState, stack)][m
[32m+[m[32m  //|  mov [esp+ecx*4], eax[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  sub ecx, 1[m
[32m+[m[32m  //|  jns <1[m
[32m+[m[32m  //|2:[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  movzx eax, byte CCSTATE->nfpr[m
[32m+[m[32m  //|  mov CARG1, CCSTATE->gpr[0][m
[32m+[m[32m  //|  mov CARG2, CCSTATE->gpr[1][m
[32m+[m[32m  //|  mov CARG3, CCSTATE->gpr[2][m
[32m+[m[32m  //|  mov CARG4, CCSTATE->gpr[3][m
[32m+[m[32m  //|.if not X64WIN[m
[32m+[m[32m  //|  mov CARG5, CCSTATE->gpr[4][m
[32m+[m[32m  //|  mov CARG6, CCSTATE->gpr[5][m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|  test eax, eax; jz >5[m
[32m+[m[32m  //|  movaps xmm0, CCSTATE->fpr[0][m
[32m+[m[32m  //|  movaps xmm1, CCSTATE->fpr[1][m
[32m+[m[32m  //|  movaps xmm2, CCSTATE->fpr[2][m
[32m+[m[32m  //|  movaps xmm3, CCSTATE->fpr[3][m
[32m+[m[32m  //|.if not X64WIN[m
[32m+[m[32m  //|  cmp eax, 4; jbe >5[m
[32m+[m[32m  //|  movaps xmm4, CCSTATE->fpr[4][m
[32m+[m[32m  dasm_put(Dst, 8268, offsetof(CCallState, stack), CCALL_SPS_EXTRA*8, Dt10(->nfpr), Dt10(->gpr[0]), Dt10(->gpr[1]), Dt10(->gpr[2]), Dt10(->gpr[3]), Dt10(->gpr[4]), Dt10(->gpr[5]), Dt10(->fpr[0]), Dt10(->fpr[1]), Dt10(->fpr[2]), Dt10(->fpr[3]));[m
[32m+[m[32m#line 3248 "vm_x86.dasc"[m
[32m+[m[32m  //|  movaps xmm5, CCSTATE->fpr[5][m
[32m+[m[32m  //|  movaps xmm6, CCSTATE->fpr[6][m
[32m+[m[32m  //|  movaps xmm7, CCSTATE->fpr[7][m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|5:[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov FCARG1, CCSTATE->gpr[0][m
[32m+[m[32m  //|  mov FCARG2, CCSTATE->gpr[1][m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|  call aword CCSTATE->func[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov CCSTATE->gpr[0], rax[m
[32m+[m[32m  //|  movaps CCSTATE->fpr[0], xmm0[m
[32m+[m[32m  //|.if not X64WIN[m
[32m+[m[32m  //|  mov CCSTATE->gpr[1], rdx[m
[32m+[m[32m  //|  movaps CCSTATE->fpr[1], xmm1[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov CCSTATE->gpr[0], eax[m
[32m+[m[32m  //|  mov CCSTATE->gpr[1], edx[m
[32m+[m[32m  //|  cmp byte CCSTATE->resx87, 1[m
[32m+[m[32m  //|  jb >7[m
[32m+[m[32m  //|  je >6[m
[32m+[m[32m  //|  fstp qword CCSTATE->fpr[0].d[0][m
[32m+[m[32m  //|  jmp >7[m
[32m+[m[32m  //|6:[m
[32m+[m[32m  //|  fstp dword CCSTATE->fpr[0].f[0][m
[32m+[m[32m  //|7:[m
[32m+[m[32m  //|.if WIN[m
[32m+[m[32m  //|  sub CCSTATE->spadj, esp[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|[m
[32m+[m[32m  //|.if X64[m
[32m+[m[32m  //|  mov rbx, [rbp-8]; leave; ret[m
[32m+[m[32m  //|.else[m
[32m+[m[32m  //|  mov ebx, [ebp-4]; leave; ret[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|.endif[m
[32m+[m[32m  //|// Note: vm_ffi_call must be the last function in this object file![m
[32m+[m[32m  //|[m
[32m+[m[32m  //|//-----------------------------------------------------------------------[m
[32m+[m[32m  dasm_put(Dst, 8349, Dt10(->fpr[4]), Dt10(->fpr[5]), Dt10(->fpr[6]), Dt10(->fpr[7]), Dt10(->func), Dt10(->gpr[0]), Dt10(->fpr[0]), Dt10(->gpr[1]), Dt10(->fpr[1]));[m
[32m+[m[32m#line 3292 "vm_x86.dasc"[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32m/* Generate the code for a single instruction. */[m
[32m+[m[32mstatic void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[32m+[m[32m{[m
[32m+[m[32m  int vk = 0;[m
[32m+[m[32m  //|// Note: aligning all instructions does not pay off.[m
[32m+[m[32m  //|=>defop:[m
[32m+[m[32m  dasm_put(Dst, 8395, defop);[m
[32m+[m[32m#line 3300 "vm_x86.dasc"[m
[32m+[m
[32m+[m[32m  switch (op) {[m
[32m+[m
[32m+[m[32m  /* -- Comparison ops ---------------------------------------------------- */[m
[32m+[m
[32m+[m[32m  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[32m+[m
[32m+[m[32m  //|.macro jmp_comp, lt, ge, le, gt, target[m
[32m+[m[32m  //||switch (op) {[m
[32m+[m[32m  //||case BC_ISLT:[m
[32m+[m[32m  //|   lt target[m
[32m+[m[32m  //||break;[m
[32m+[m[32m  //||case BC_ISGE:[m
[32m+[m[32m  //|   ge target[m
[32m+[m[32m  //||break;[m
[32m+[m[32m  //||case BC_ISLE:[m
[32m+[m[32m  //|   le target[m
[32m+[m[32m  //||break;[m
[32m+[m[32m  //||case BC_ISGT:[m
[32m+[m[32m  //|   gt target[m
[32m+[m[32m  //||break;[m
[32m+[m[32m  //||default: break;  /* Shut up GCC. */[m
[32m+[m[32m  //||}[m
[32m+[m[32m  //|.endmacro[m
[32m+[m
[32m+[m[32m  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[32m+[m[32m    //|  // RA = src1, RD = src2, JMP with RD = target[m
[32m+[m[32m    //|  ins_AD[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  checkint RA, >7[m
[32m+[m[32m    //|  checkint RD, >8[m
[32m+[m[32m    //|  mov RB, dword [BASE+RA*8][m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|  cmp RB, dword [BASE+RD*8][m
[32m+[m[32m    //|  jmp_comp jge, jl, jg, jle, >9[m
[32m+[m[32m    //|6:[m
[32m+[m[32m    //|  movzx RD, PC_RD[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|9:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // RA is not an integer.[m
[32m+[m[32m    //|  ja ->vmeta_comp[m
[32m+[m[32m    //|  // RA is a number.[m
[32m+[m[32m    //|  cmp dword [BASE+RD*8+4], LJ_TISNUM; jb >1; jne ->vmeta_comp[m
[32m+[m[32m    //|  // RA is a number, RD is an integer.[m
[32m+[m[32m    //|  cvtsi2sd xmm0, dword [BASE+RD*8][m
[32m+[m[32m    //|  jmp >2[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|8:  // RA is an integer, RD is not an integer.[m
[32m+[m[32m    //|  ja ->vmeta_comp[m
[32m+[m[32m    //|  // RA is an integer, RD is a number.[m
[32m+[m[32m    //|  cvtsi2sd xmm1, dword [BASE+RA*8][m
[32m+[m[32m    //|  movsd xmm0, qword [BASE+RD*8][m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|  ucomisd xmm0, xmm1[m
[32m+[m[32m    //|  jmp_comp jbe, ja, jb, jae, <9[m
[32m+[m[32m    //|  jmp <6[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  checknum RA, ->vmeta_comp[m
[32m+[m[32m    //|  checknum RD, ->vmeta_comp[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  movsd xmm0, qword [BASE+RD*8][m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|  ucomisd xmm0, qword [BASE+RA*8][m
[32m+[m[32m    //|3:[m
[32m+[m[32m    //|  // Unordered: all of ZF CF PF set, ordered: PF clear.[m
[32m+[m[32m    //|  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  jmp_comp jbe, ja, jb, jae, <9[m
[32m+[m[32m    //|  jmp <6[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  jmp_comp jbe, ja, jb, jae, >1[m
[32m+[m[32m    dasm_put(Dst, 8397, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m    switch (op) {[m
[32m+[m[32m    case BC_ISLT:[m
[32m+[m[32m    dasm_put(Dst, 8438);[m
[32m+[m[32m    break;[m
[32m+[m[32m    case BC_ISGE:[m
[32m+[m[32m    dasm_put(Dst, 8443);[m
[32m+[m[32m    break;[m
[32m+[m[32m    case BC_ISLE:[m
[32m+[m[32m    dasm_put(Dst, 8448);[m
[32m+[m[32m    break;[m
[32m+[m[32m    case BC_ISGT:[m
[32m+[m[32m    dasm_put(Dst, 8453);[m
[32m+[m[32m    break;[m
[32m+[m[32m    default: break;  /* Shut up GCC. */[m
[32m+[m[32m    }[m
[32m+[m[32m#line 3375 "vm_x86.dasc"[m
[32m+[m[32m    //|  movzx RD, PC_RD[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    dasm_put(Dst, 8458, -BCBIAS_J*4);[m
[32m+[m[32m#line 3380 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_ISEQV: case BC_ISNEV:[m
[32m+[m[32m    vk = op == BC_ISEQV;[m
[32m+[m[32m    //|  ins_AD	// RA = src1, RD = src2, JMP with RD = target[m
[32m+[m[32m    //|  mov RB, [BASE+RD*8+4][m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  cmp RB, LJ_TISNUM; jne >7[m
[32m+[m[32m    //|  checkint RA, >8[m
[32m+[m[32m    //|  mov RB, dword [BASE+RD*8][m
[32m+[m[32m    //|  cmp RB, dword [BASE+RA*8][m
[32m+[m[32m    dasm_put(Dst, 8491);[m
[32m+[m[32m#line 3392 "vm_x86.dasc"[m
[32m+[m[32m    if (vk) {[m
[32m+[m[32m      //|  jne >9[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  je >9[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  movzx RD, PC_RD[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|9:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // RD is not an integer.[m
[32m+[m[32m    //|  ja >5[m
[32m+[m[32m    //|  // RD is a number.[m
[32m+[m[32m    //|  cmp dword [BASE+RA*8+4], LJ_TISNUM; jb >1; jne >5[m
[32m+[m[32m    //|  // RD is a number, RA is an integer.[m
[32m+[m[32m    //|  cvtsi2sd xmm0, dword [BASE+RA*8][m
[32m+[m[32m    //|  jmp >2[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|8:  // RD is an integer, RA is not an integer.[m
[32m+[m[32m    //|  ja >5[m
[32m+[m[32m    //|  // RD is an integer, RA is a number.[m
[32m+[m[32m    //|  cvtsi2sd xmm0, dword [BASE+RD*8][m
[32m+[m[32m    //|  ucomisd xmm0, qword [BASE+RA*8][m
[32m+[m[32m    //|  jmp >4[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  cmp RB, LJ_TISNUM; jae >5[m
[32m+[m[32m    //|  checknum RA, >5[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  movsd xmm0, qword [BASE+RA*8][m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  ucomisd xmm0, qword [BASE+RD*8][m
[32m+[m[32m    //|4:[m
[32m+[m[32m    dasm_put(Dst, 8499, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 3426 "vm_x86.dasc"[m
[32m+[m[32m  iseqne_fp:[m
[32m+[m[32m    if (vk) {[m
[32m+[m[32m      //|  jp >2				// Unordered means not equal.[m
[32m+[m[32m      //|  jne >2[m
[32m+[m[32m      dasm_put(Dst, 8535);[m
[32m+[m[32m#line 3430 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  jp >2				// Unordered means not equal.[m
[32m+[m[32m      //|  je >1[m
[32m+[m[32m      dasm_put(Dst, 8544);[m
[32m+[m[32m#line 3433 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m  iseqne_end:[m
[32m+[m[32m    if (vk) {[m
[32m+[m[32m      //|1:				// EQ: Branch to the target.[m
[32m+[m[32m      //|  movzx RD, PC_RD[m
[32m+[m[32m      //|  branchPC RD[m
[32m+[m[32m      //|2:				// NE: Fallthrough to next instruction.[m
[32m+[m[32m      //|.if not FFI[m
[32m+[m[32m      //|3:[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      dasm_put(Dst, 8553, -BCBIAS_J*4);[m
[32m+[m[32m#line 3443 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|.if not FFI[m
[32m+[m[32m      //|3:[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      //|2:				// NE: Branch to the target.[m
[32m+[m[32m      //|  movzx RD, PC_RD[m
[32m+[m[32m      //|  branchPC RD[m
[32m+[m[32m      //|1:				// EQ: Fallthrough to next instruction.[m
[32m+[m[32m      dasm_put(Dst, 8568, -BCBIAS_J*4);[m
[32m+[m[32m#line 3451 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||[m
[32m+[m		[32m       op == BC_ISEQN || op == BC_ISNEN)) {[m
[32m+[m[32m      //|  jmp <9[m
[32m+[m[32m      dasm_put(Dst, 8583);[m
[32m+[m[32m#line 3455 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  ins_next[m
[32m+[m[32m      dasm_put(Dst, 8470);[m
[32m+[m[32m#line 3457 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|[m
[32m+[m[32m    if (op == BC_ISEQV || op == BC_ISNEV) {[m
[32m+[m[32m      //|5:  // Either or both types are not numbers.[m
[32m+[m[32m      //|.if FFI[m
[32m+[m[32m      //|  cmp RB, LJ_TCDATA; je ->vmeta_equal_cd[m
[32m+[m[32m      //|  checktp RA, LJ_TCDATA; je ->vmeta_equal_cd[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      //|  checktp RA, RB			// Compare types.[m
[32m+[m[32m      //|  jne <2				// Not the same type?[m
[32m+[m[32m      //|  cmp RB, LJ_TISPRI[m
[32m+[m[32m      //|  jae <1				// Same type and primitive type?[m
[32m+[m[32m      //|[m
[32m+[m[32m      //|  // Same types and not a primitive type. Compare GCobj or pvalue.[m
[32m+[m[32m      //|  mov RA, [BASE+RA*8][m
[32m+[m[32m      //|  mov RD, [BASE+RD*8][m
[32m+[m[32m      //|  cmp RA, RD[m
[32m+[m[32m      //|  je <1				// Same GCobjs or pvalues?[m
[32m+[m[32m      //|  cmp RB, LJ_TISTABUD[m
[32m+[m[32m      //|  ja <2				// Different objects and not table/ud?[m
[32m+[m[32m      //|.if X64[m
[32m+[m[32m      //|  cmp RB, LJ_TUDATA		// And not 64 bit lightuserdata.[m
[32m+[m[32m      //|  jb <2[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      //|[m
[32m+[m[32m      //|  // Different tables or userdatas. Need to check __eq metamethod.[m
[32m+[m[32m      //|  // Field metatable must be at same offset for GCtab and GCudata![m
[32m+[m[32m      //|  mov TAB:RB, TAB:RA->metatable[m
[32m+[m[32m      dasm_put(Dst, 8588, LJ_TCDATA, LJ_TCDATA, LJ_TISPRI, LJ_TISTABUD, LJ_TUDATA);[m
[32m+[m[32m#line 3485 "vm_x86.dasc"[m
[32m+[m[32m      //|  test TAB:RB, TAB:RB[m
[32m+[m[32m      //|  jz <2				// No metatable?[m
[32m+[m[32m      //|  test byte TAB:RB->nomm, 1<<MM_eq[m
[32m+[m[32m      //|  jnz <2				// Or 'no __eq' flag set?[m
[32m+[m[32m      dasm_put(Dst, 8653, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq);[m
[32m+[m[32m#line 3489 "vm_x86.dasc"[m
[32m+[m[32m      if (vk) {[m
[32m+[m	[32m//|  xor RB, RB			// ne = 0[m
[32m+[m	[32mdasm_put(Dst, 8673);[m
[32m+[m[32m#line 3491 "vm_x86.dasc"[m
[32m+[m[32m      } else {[m
[32m+[m	[32m//|  mov RB, 1			// ne = 1[m
[32m+[m	[32mdasm_put(Dst, 8677);[m
[32m+[m[32m#line 3493 "vm_x86.dasc"[m
[32m+[m[32m      }[m
[32m+[m[32m      //|  jmp ->vmeta_equal		// Handle __eq metamethod.[m
[32m+[m[32m      dasm_put(Dst, 8683);[m
[32m+[m[32m#line 3495 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|.if FFI[m
[32m+[m[32m      //|3:[m
[32m+[m[32m      //|  cmp RB, LJ_TCDATA[m
[32m+[m[32m      dasm_put(Dst, 8688, LJ_TCDATA);[m
[32m+[m[32m#line 3499 "vm_x86.dasc"[m
[32m+[m[32m      if (LJ_DUALNUM && vk) {[m
[32m+[m	[32m//|  jne <9[m
[32m+[m	[32mdasm_put(Dst, 8695);[m
[32m+[m[32m#line 3501 "vm_x86.dasc"[m
[32m+[m[32m      } else {[m
[32m+[m	[32m//|  jne <2[m
[32m+[m	[32mdasm_put(Dst, 7452);[m
[32m+[m[32m#line 3503 "vm_x86.dasc"[m
[32m+[m[32m      }[m
[32m+[m[32m      //|  jmp ->vmeta_equal_cd[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      dasm_put(Dst, 8700);[m
[32m+[m[32m#line 3506 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_ISEQS: case BC_ISNES:[m
[32m+[m[32m    vk = op == BC_ISEQS;[m
[32m+[m[32m    //|  ins_AND	// RA = src, RD = str const, JMP with RD = target[m
[32m+[m[32m    //|  mov RB, [BASE+RA*8+4][m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|  cmp RB, LJ_TSTR; jne >3[m
[32m+[m[32m    //|  mov RA, [BASE+RA*8][m
[32m+[m[32m    //|  cmp RA, [KBASE+RD*4][m
[32m+[m[32m    dasm_put(Dst, 8705, LJ_TSTR);[m
[32m+[m[32m#line 3516 "vm_x86.dasc"[m
[32m+[m[32m  iseqne_test:[m
[32m+[m[32m    if (vk) {[m
[32m+[m[32m      //|  jne >2[m
[32m+[m[32m      dasm_put(Dst, 8539);[m
[32m+[m[32m#line 3519 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  je >1[m
[32m+[m[32m      dasm_put(Dst, 8548);[m
[32m+[m[32m#line 3521 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    goto iseqne_end;[m
[32m+[m[32m  case BC_ISEQN: case BC_ISNEN:[m
[32m+[m[32m    vk = op == BC_ISEQN;[m
[32m+[m[32m    //|  ins_AD	// RA = src, RD = num const, JMP with RD = target[m
[32m+[m[32m    //|  mov RB, [BASE+RA*8+4][m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  cmp RB, LJ_TISNUM; jne >7[m
[32m+[m[32m    //|  cmp dword [KBASE+RD*8+4], LJ_TISNUM; jne >8[m
[32m+[m[32m    //|  mov RB, dword [KBASE+RD*8][m
[32m+[m[32m    //|  cmp RB, dword [BASE+RA*8][m
[32m+[m[32m    dasm_put(Dst, 8732);[m
[32m+[m[32m#line 3533 "vm_x86.dasc"[m
[32m+[m[32m    if (vk) {[m
[32m+[m[32m      //|  jne >9[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  je >9[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  movzx RD, PC_RD[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|9:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // RA is not an integer.[m
[32m+[m[32m    //|  ja >3[m
[32m+[m[32m    //|  // RA is a number.[m
[32m+[m[32m    //|  cmp dword [KBASE+RD*8+4], LJ_TISNUM; jb >1[m
[32m+[m[32m    //|  // RA is a number, RD is an integer.[m
[32m+[m[32m    //|  cvtsi2sd xmm0, dword [KBASE+RD*8][m
[32m+[m[32m    //|  jmp >2[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|8:  // RA is an integer, RD is a number.[m
[32m+[m[32m    //|  cvtsi2sd xmm0, dword [BASE+RA*8][m
[32m+[m[32m    //|  ucomisd xmm0, qword [KBASE+RD*8][m
[32m+[m[32m    //|  jmp >4[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  cmp RB, LJ_TISNUM; jae >3[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  movsd xmm0, qword [KBASE+RD*8][m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  ucomisd xmm0, qword [BASE+RA*8][m
[32m+[m[32m    //|4:[m
[32m+[m[32m    dasm_put(Dst, 8740, LJ_TISNUM);[m
[32m+[m[32m#line 3563 "vm_x86.dasc"[m
[32m+[m[32m    goto iseqne_fp;[m
[32m+[m[32m  case BC_ISEQP: case BC_ISNEP:[m
[32m+[m[32m    vk = op == BC_ISEQP;[m
[32m+[m[32m    //|  ins_AND	// RA = src, RD = primitive type (~), JMP with RD = target[m
[32m+[m[32m    //|  mov RB, [BASE+RA*8+4][m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|  cmp RB, RD[m
[32m+[m[32m    dasm_put(Dst, 8767);[m
[32m+[m[32m#line 3570 "vm_x86.dasc"[m
[32m+[m[32m    if (!LJ_HASFFI) goto iseqne_test;[m
[32m+[m[32m    if (vk) {[m
[32m+[m[32m      //|  jne >3[m
[32m+[m[32m      //|  movzx RD, PC_RD[m
[32m+[m[32m      //|  branchPC RD[m
[32m+[m[32m      //|2:[m
[32m+[m[32m      //|  ins_next[m
[32m+[m[32m      //|3:[m
[32m+[m[32m      //|  cmp RB, LJ_TCDATA; jne <2[m
[32m+[m[32m      //|  jmp ->vmeta_equal_cd[m
[32m+[m[32m      dasm_put(Dst, 8781, -BCBIAS_J*4, LJ_TCDATA);[m
[32m+[m[32m#line 3580 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  je >2[m
[32m+[m[32m      //|  cmp RB, LJ_TCDATA; je ->vmeta_equal_cd[m
[32m+[m[32m      //|  movzx RD, PC_RD[m
[32m+[m[32m      //|  branchPC RD[m
[32m+[m[32m      //|2:[m
[32m+[m[32m      //|  ins_next[m
[32m+[m[32m      dasm_put(Dst, 8832, LJ_TCDATA, -BCBIAS_J*4);[m
[32m+[m[32m#line 3587 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Unary test and copy ops ------------------------------------------- */[m
[32m+[m
[32m+[m[32m  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[32m+[m[32m    //|  ins_AD	// RA = dst or unused, RD = src, JMP with RD = target[m
[32m+[m[32m    //|  mov RB, [BASE+RD*8+4][m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|  cmp RB, LJ_TISTRUECOND[m
[32m+[m[32m    dasm_put(Dst, 8877, LJ_TISTRUECOND);[m
[32m+[m[32m#line 3597 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_IST || op == BC_ISTC) {[m
[32m+[m[32m      //|  jae >1[m
[32m+[m[32m      dasm_put(Dst, 8453);[m
[32m+[m[32m#line 3599 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  jb >1[m
[32m+[m[32m      dasm_put(Dst, 8448);[m
[32m+[m[32m#line 3601 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    if (op == BC_ISTC || op == BC_ISFC) {[m
[32m+[m[32m      //|  mov [BASE+RA*8+4], RB[m
[32m+[m[32m      //|  mov RB, [BASE+RD*8][m
[32m+[m[32m      //|  mov [BASE+RA*8], RB[m
[32m+[m[32m      dasm_put(Dst, 8889);[m
[32m+[m[32m#line 3606 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  movzx RD, PC_RD[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|1:					// Fallthrough to the next instruction.[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 8458, -BCBIAS_J*4);[m
[32m+[m[32m#line 3611 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_ISTYPE:[m
[32m+[m[32m    //|  ins_AD	// RA = src, RD = -type[m
[32m+[m[32m    //|  add RD, [BASE+RA*8+4][m
[32m+[m[32m    //|  jne ->vmeta_istype[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 8900);[m
[32m+[m[32m#line 3618 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_ISNUM:[m
[32m+[m[32m    //|  ins_AD	// RA = src, RD = -(TISNUM-1)[m
[32m+[m[32m    //|  checknum RA, ->vmeta_istype[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 8929, LJ_TISNUM);[m
[32m+[m[32m#line 3623 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Unary ops --------------------------------------------------------- */[m
[32m+[m
[32m+[m[32m  case BC_MOV:[m
[32m+[m[32m    //|  ins_AD	// RA = dst, RD = src[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [BASE+RD*8][m
[32m+[m[32m    //|  mov [BASE+RA*8], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [BASE+RD*8+4][m
[32m+[m[32m    //|  mov RD, [BASE+RD*8][m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RB[m
[32m+[m[32m    //|  mov [BASE+RA*8], RD[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next_[m
[32m+[m[32m    dasm_put(Dst, 8960);[m
[32m+[m[32m#line 3639 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_NOT:[m
[32m+[m[32m    //|  ins_AD	// RA = dst, RD = src[m
[32m+[m[32m    //|  xor RB, RB[m
[32m+[m[32m    //|  checktp RD, LJ_TISTRUECOND[m
[32m+[m[32m    //|  adc RB, LJ_TTRUE[m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RB[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 8989, LJ_TISTRUECOND, LJ_TTRUE);[m
[32m+[m[32m#line 3647 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_UNM:[m
[32m+[m[32m    //|  ins_AD	// RA = dst, RD = src[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  checkint RD, >5[m
[32m+[m[32m    //|  mov RB, [BASE+RD*8][m
[32m+[m[32m    //|  neg RB[m
[32m+[m[32m    //|  jo >4[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[32m+[m[32m    //|  mov dword [BASE+RA*8], RB[m
[32m+[m[32m    //|9:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|4:[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], 0x41e00000  // 2^31.[m
[32m+[m[32m    //|  mov dword [BASE+RA*8], 0[m
[32m+[m[32m    //|  jmp <9[m
[32m+[m[32m    //|5:[m
[32m+[m[32m    //|  ja ->vmeta_unm[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  checknum RD, ->vmeta_unm[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  movsd xmm0, qword [BASE+RD*8][m
[32m+[m[32m    //|  sseconst_sign xmm1, RDa[m
[32m+[m[32m    //|  xorps xmm0, xmm1[m
[32m+[m[32m    //|  movsd qword [BASE+RA*8], xmm0[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  jmp <9[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    dasm_put(Dst, 9026, LJ_TISNUM, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32));[m
[32m+[m[32m#line 3677 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_LEN:[m
[32m+[m[32m    //|  ins_AD	// RA = dst, RD = src[m
[32m+[m[32m    //|  checkstr RD, >2[m
[32m+[m[32m    //|  mov STR:RD, [BASE+RD*8][m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  mov RD, dword STR:RD->len[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[32m+[m[32m    //|  mov dword [BASE+RA*8], RD[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  xorps xmm0, xmm0[m
[32m+[m[32m    //|  cvtsi2sd xmm0, dword STR:RD->len[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  movsd qword [BASE+RA*8], xmm0[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  checktab RD, ->vmeta_len[m
[32m+[m[32m    //|  mov TAB:FCARG1, [BASE+RD*8][m
[32m+[m[32m    dasm_put(Dst, 9081, LJ_TSTR, Dt5(->len), LJ_TTAB);[m
[32m+[m[32m#line 3697 "vm_x86.dasc"[m
[32m+[m[32m#if LJ_52[m
[32m+[m[32m    //|  mov TAB:RB, TAB:FCARG1->metatable[m
[32m+[m[32m    //|  cmp TAB:RB, 0[m
[32m+[m[32m    //|  jnz >9[m
[32m+[m[32m    //|3:[m
[32m+[m[32m    dasm_put(Dst, 9147, Dt6(->metatable));[m
[32m+[m[32m#line 3702 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m    //|->BC_LEN_Z:[m
[32m+[m[32m    //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m    //|  call extern lj_tab_len@4		// (GCtab *t)[m
[32m+[m[32m    //|  // Length of table returned in eax (RD).[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  // Nothing to do.[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  cvtsi2sd xmm0, RD[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov BASE, RB			// Restore BASE.[m
[32m+[m[32m    //|  movzx RA, PC_RA[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 9161);[m
[32m+[m[32m#line 3715 "vm_x86.dasc"[m
[32m+[m[32m#if LJ_52[m
[32m+[m[32m    //|9:  // Check for __len.[m
[32m+[m[32m    //|  test byte TAB:RB->nomm, 1<<MM_len[m
[32m+[m[32m    //|  jnz <3[m
[32m+[m[32m    //|  jmp ->vmeta_len			// 'no __len' flag NOT set: check.[m
[32m+[m[32m    dasm_put(Dst, 9187, Dt6(->nomm), 1<<MM_len);[m
[32m+[m[32m#line 3720 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Binary ops -------------------------------------------------------- */[m
[32m+[m
[32m+[m[32m    //|.macro ins_arithpre, sseins, ssereg[m
[32m+[m[32m    //|  ins_ABC[m
[32m+[m[32m    //||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    //||switch (vk) {[m
[32m+[m[32m    //||case 0:[m
[32m+[m[32m    //|   checknum RB, ->vmeta_arith_vn[m
[32m+[m[32m    //|   .if DUALNUM[m
[32m+[m[32m    //|     cmp dword [KBASE+RC*8+4], LJ_TISNUM; jae ->vmeta_arith_vn[m
[32m+[m[32m    //|   .endif[m
[32m+[m[32m    //|   movsd xmm0, qword [BASE+RB*8][m
[32m+[m[32m    //|   sseins ssereg, qword [KBASE+RC*8][m
[32m+[m[32m    //||  break;[m
[32m+[m[32m    //||case 1:[m
[32m+[m[32m    //|   checknum RB, ->vmeta_arith_nv[m
[32m+[m[32m    //|   .if DUALNUM[m
[32m+[m[32m    //|     cmp dword [KBASE+RC*8+4], LJ_TISNUM; jae ->vmeta_arith_nv[m
[32m+[m[32m    //|   .endif[m
[32m+[m[32m    //|   movsd xmm0, qword [KBASE+RC*8][m
[32m+[m[32m    //|   sseins ssereg, qword [BASE+RB*8][m
[32m+[m[32m    //||  break;[m
[32m+[m[32m    //||default:[m
[32m+[m[32m    //|   checknum RB, ->vmeta_arith_vv[m
[32m+[m[32m    //|   checknum RC, ->vmeta_arith_vv[m
[32m+[m[32m    //|   movsd xmm0, qword [BASE+RB*8][m
[32m+[m[32m    //|   sseins ssereg, qword [BASE+RC*8][m
[32m+[m[32m    //||  break;[m
[32m+[m[32m    //||}[m
[32m+[m[32m    //|.endmacro[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|.macro ins_arithdn, intins[m
[32m+[m[32m    //|  ins_ABC[m
[32m+[m[32m    //||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    //||switch (vk) {[m
[32m+[m[32m    //||case 0:[m
[32m+[m[32m    //|   checkint RB, ->vmeta_arith_vn[m
[32m+[m[32m    //|   cmp dword [KBASE+RC*8+4], LJ_TISNUM; jne ->vmeta_arith_vn[m
[32m+[m[32m    //|   mov RB, [BASE+RB*8][m
[32m+[m[32m    //|   intins RB, [KBASE+RC*8]; jo ->vmeta_arith_vno[m
[32m+[m[32m    //||  break;[m
[32m+[m[32m    //||case 1:[m
[32m+[m[32m    //|   checkint RB, ->vmeta_arith_nv[m
[32m+[m[32m    //|   cmp dword [KBASE+RC*8+4], LJ_TISNUM; jne ->vmeta_arith_nv[m
[32m+[m[32m    //|   mov RC, [KBASE+RC*8][m
[32m+[m[32m    //|   intins RC, [BASE+RB*8]; jo ->vmeta_arith_nvo[m
[32m+[m[32m    //||  break;[m
[32m+[m[32m    //||default:[m
[32m+[m[32m    //|   checkint RB, ->vmeta_arith_vv[m
[32m+[m[32m    //|   checkint RC, ->vmeta_arith_vv[m
[32m+[m[32m    //|   mov RB, [BASE+RB*8][m
[32m+[m[32m    //|   intins RB, [BASE+RC*8]; jo ->vmeta_arith_vvo[m
[32m+[m[32m    //||  break;[m
[32m+[m[32m    //||}[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[32m+[m[32m    //||if (vk == 1) {[m
[32m+[m[32m    //|   mov dword [BASE+RA*8], RC[m
[32m+[m[32m    //||} else {[m
[32m+[m[32m    //|   mov dword [BASE+RA*8], RB[m
[32m+[m[32m    //||}[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|.endmacro[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|.macro ins_arithpost[m
[32m+[m[32m    //|  movsd qword [BASE+RA*8], xmm0[m
[32m+[m[32m    //|.endmacro[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|.macro ins_arith, sseins[m
[32m+[m[32m    //|  ins_arithpre sseins, xmm0[m
[32m+[m[32m    //|  ins_arithpost[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|.endmacro[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|.macro ins_arith, intins, sseins[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  ins_arithdn intins[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  ins_arith, sseins[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|.endmacro[m
[32m+[m
[32m+[m[32m    //|  // RA = dst, RB = src1 or num const, RC = src2 or num const[m
[32m+[m[32m  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[32m+[m[32m    //|  ins_arith add, addsd[m
[32m+[m[32m    dasm_put(Dst, 9203);[m
[32m+[m[32m    vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    switch (vk) {[m
[32m+[m[32m    case 0:[m
[32m+[m[32m    dasm_put(Dst, 9211, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    case 1:[m
[32m+[m[32m    dasm_put(Dst, 9237, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    default:[m
[32m+[m[32m    dasm_put(Dst, 9263, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    }[m
[32m+[m[32m    dasm_put(Dst, 9054);[m
[32m+[m[32m#line 3807 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[32m+[m[32m    //|  ins_arith sub, subsd[m
[32m+[m[32m    dasm_put(Dst, 9203);[m
[32m+[m[32m    vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    switch (vk) {[m
[32m+[m[32m    case 0:[m
[32m+[m[32m    dasm_put(Dst, 9298, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    case 1:[m
[32m+[m[32m    dasm_put(Dst, 9324, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    default:[m
[32m+[m[32m    dasm_put(Dst, 9350, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    }[m
[32m+[m[32m    dasm_put(Dst, 9054);[m
[32m+[m[32m#line 3810 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[32m+[m[32m    //|  ins_arith imul, mulsd[m
[32m+[m[32m    dasm_put(Dst, 9203);[m
[32m+[m[32m    vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    switch (vk) {[m
[32m+[m[32m    case 0:[m
[32m+[m[32m    dasm_put(Dst, 9385, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    case 1:[m
[32m+[m[32m    dasm_put(Dst, 9411, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    default:[m
[32m+[m[32m    dasm_put(Dst, 9437, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    }[m
[32m+[m[32m    dasm_put(Dst, 9054);[m
[32m+[m[32m#line 3813 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[32m+[m[32m    //|  ins_arith divsd[m
[32m+[m[32m    dasm_put(Dst, 9203);[m
[32m+[m[32m    vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    switch (vk) {[m
[32m+[m[32m    case 0:[m
[32m+[m[32m    dasm_put(Dst, 9472, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    case 1:[m
[32m+[m[32m    dasm_put(Dst, 9498, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    default:[m
[32m+[m[32m    dasm_put(Dst, 9524, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    }[m
[32m+[m[32m    dasm_put(Dst, 9054);[m
[32m+[m[32m#line 3816 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_MODVN:[m
[32m+[m[32m    //|  ins_arithpre movsd, xmm1[m
[32m+[m[32m    dasm_put(Dst, 9203);[m
[32m+[m[32m    vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    switch (vk) {[m
[32m+[m[32m    case 0:[m
[32m+[m[32m    dasm_put(Dst, 9559, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    case 1:[m
[32m+[m[32m    dasm_put(Dst, 9585, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    default:[m
[32m+[m[32m    dasm_put(Dst, 9611, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    }[m
[32m+[m[32m#line 3819 "vm_x86.dasc"[m
[32m+[m[32m    //|->BC_MODVN_Z:[m
[32m+[m[32m    //|  call ->vm_mod[m
[32m+[m[32m    //|  ins_arithpost[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9646);[m
[32m+[m[32m#line 3823 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_MODNV: case BC_MODVV:[m
[32m+[m[32m    //|  ins_arithpre movsd, xmm1[m
[32m+[m[32m    dasm_put(Dst, 9203);[m
[32m+[m[32m    vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    switch (vk) {[m
[32m+[m[32m    case 0:[m
[32m+[m[32m    dasm_put(Dst, 9559, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    case 1:[m
[32m+[m[32m    dasm_put(Dst, 9585, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    default:[m
[32m+[m[32m    dasm_put(Dst, 9611, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    }[m
[32m+[m[32m#line 3826 "vm_x86.dasc"[m
[32m+[m[32m    //|  jmp ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[32m+[m[32m    dasm_put(Dst, 9678);[m
[32m+[m[32m#line 3827 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_POW:[m
[32m+[m[32m    //|  ins_arithpre movsd, xmm1[m
[32m+[m[32m    dasm_put(Dst, 9203);[m
[32m+[m[32m    vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[32m+[m[32m    switch (vk) {[m
[32m+[m[32m    case 0:[m
[32m+[m[32m    dasm_put(Dst, 9559, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    case 1:[m
[32m+[m[32m    dasm_put(Dst, 9585, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    default:[m
[32m+[m[32m    dasm_put(Dst, 9611, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m      break;[m
[32m+[m[32m    }[m
[32m+[m[32m#line 3830 "vm_x86.dasc"[m
[32m+[m[32m    //|  mov RB, BASE[m
[32m+[m[32m    //|.if not X64[m
[32m+[m[32m    //|  movsd FPARG1, xmm0[m
[32m+[m[32m    //|  movsd FPARG3, xmm1[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  call extern pow[m
[32m+[m[32m    //|  movzx RA, PC_RA[m
[32m+[m[32m    //|  mov BASE, RB[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  ins_arithpost[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  fstp qword [BASE+RA*8][m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9683);[m
[32m+[m[32m#line 3844 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_CAT:[m
[32m+[m[32m    //|  ins_ABC	// RA = dst, RB = src_start, RC = src_end[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m    //|  mov L:CARG1d->base, BASE[m
[32m+[m[32m    //|  lea CARG2d, [BASE+RC*8][m
[32m+[m[32m    //|  mov CARG3d, RC[m
[32m+[m[32m    //|  sub CARG3d, RB[m
[32m+[m[32m    //|->BC_CAT_Z:[m
[32m+[m[32m    //|  mov L:RB, L:CARG1d[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  lea RA, [BASE+RC*8][m
[32m+[m[32m    //|  sub RC, RB[m
[32m+[m[32m    //|  mov ARG2, RA[m
[32m+[m[32m    //|  mov ARG3, RC[m
[32m+[m[32m    //|->BC_CAT_Z:[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov ARG1, L:RB[m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov SAVE_PC, PC[m
[32m+[m[32m    //|  call extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[32m+[m[32m    //|  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|  test RC, RC[m
[32m+[m[32m    //|  jnz ->vmeta_binop[m
[32m+[m[32m    //|  movzx RB, PC_RB			// Copy result to Stk[RA] from Stk[RB].[m
[32m+[m[32m    //|  movzx RA, PC_RA[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RCa, [BASE+RB*8][m
[32m+[m[32m    //|  mov [BASE+RA*8], RCa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RC, [BASE+RB*8+4][m
[32m+[m[32m    //|  mov RB, [BASE+RB*8][m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RC[m
[32m+[m[32m    //|  mov [BASE+RA*8], RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9724, Dt1(->base), Dt1(->base));[m
[32m+[m[32m#line 3884 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Constant ops ------------------------------------------------------ */[m
[32m+[m
[32m+[m[32m  case BC_KSTR:[m
[32m+[m[32m    //|  ins_AND	// RA = dst, RD = str const (~)[m
[32m+[m[32m    //|  mov RD, [KBASE+RD*4][m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TSTR[m
[32m+[m[32m    //|  mov [BASE+RA*8], RD[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9808, LJ_TSTR);[m
[32m+[m[32m#line 3894 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_KCDATA:[m
[32m+[m[32m    //|.if FFI[m
[32m+[m[32m    //|  ins_AND	// RA = dst, RD = cdata const (~)[m
[32m+[m[32m    //|  mov RD, [KBASE+RD*4][m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TCDATA[m
[32m+[m[32m    //|  mov [BASE+RA*8], RD[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    dasm_put(Dst, 9808, LJ_TCDATA);[m
[32m+[m[32m#line 3903 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_KSHORT:[m
[32m+[m[32m    //|  ins_AD	// RA = dst, RD = signed int16 literal[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  movsx RD, RDW[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[32m+[m[32m    //|  mov dword [BASE+RA*8], RD[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  movsx RD, RDW			// Sign-extend literal.[m
[32m+[m[32m    //|  cvtsi2sd xmm0, RD[m
[32m+[m[32m    //|  movsd qword [BASE+RA*8], xmm0[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9845);[m
[32m+[m[32m#line 3916 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_KNUM:[m
[32m+[m[32m    //|  ins_AD	// RA = dst, RD = num const[m
[32m+[m[32m    //|  movsd xmm0, qword [KBASE+RD*8][m
[32m+[m[32m    //|  movsd qword [BASE+RA*8], xmm0[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9880);[m
[32m+[m[32m#line 3922 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_KPRI:[m
[32m+[m[32m    //|  ins_AND	// RA = dst, RD = primitive type (~)[m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RD[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9914);[m
[32m+[m[32m#line 3927 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_KNIL:[m
[32m+[m[32m    //|  ins_AD	// RA = dst_start, RD = dst_end[m
[32m+[m[32m    //|  lea RA, [BASE+RA*8+12][m
[32m+[m[32m    //|  lea RD, [BASE+RD*8+4][m
[32m+[m[32m    //|  mov RB, LJ_TNIL[m
[32m+[m[32m    //|  mov [RA-8], RB			// Sets minimum 2 slots.[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  mov [RA], RB[m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  cmp RA, RD[m
[32m+[m[32m    //|  jbe <1[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9943, LJ_TNIL);[m
[32m+[m[32m#line 3940 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Upvalue and function ops ------------------------------------------ */[m
[32m+[m
[32m+[m[32m  case BC_UGET:[m
[32m+[m[32m    //|  ins_AD	// RA = dst, RD = upvalue #[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m    //|  mov UPVAL:RB, [LFUNC:RB+RD*4+offsetof(GCfuncL, uvptr)][m
[32m+[m[32m    //|  mov RB, UPVAL:RB->v[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RDa, [RB][m
[32m+[m[32m    //|  mov [BASE+RA*8], RDa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RD, [RB+4][m
[32m+[m[32m    //|  mov RB, [RB][m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RD[m
[32m+[m[32m    //|  mov [BASE+RA*8], RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 9991, offsetof(GCfuncL, uvptr), DtA(->v));[m
[32m+[m[32m#line 3959 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_USETV:[m
[32m+[m[32m#define TV2MARKOFS \[m
[32m+[m[32m ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))[m
[32m+[m[32m    //|  ins_AD	// RA = upvalue #, RD = src[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m    //|  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[32m+[m[32m    //|  cmp byte UPVAL:RB->closed, 0[m
[32m+[m[32m    //|  mov RB, UPVAL:RB->v[m
[32m+[m[32m    //|  mov RA, [BASE+RD*8][m
[32m+[m[32m    //|  mov RD, [BASE+RD*8+4][m
[32m+[m[32m    //|  mov [RB], RA[m
[32m+[m[32m    //|  mov [RB+4], RD[m
[32m+[m[32m    //|  jz >1[m
[32m+[m[32m    //|  // Check barrier for closed upvalue.[m
[32m+[m[32m    //|  test byte [RB+TV2MARKOFS], LJ_GC_BLACK		// isblack(uv)[m
[32m+[m[32m    //|  jnz >2[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|2:  // Upvalue is black. Check if new value is collectable and white.[m
[32m+[m[32m    //|  sub RD, LJ_TISGCV[m
[32m+[m[32m    //|  cmp RD, LJ_TNUMX - LJ_TISGCV			// tvisgcv(v)[m
[32m+[m[32m    //|  jbe <1[m
[32m+[m[32m    //|  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(v)[m
[32m+[m[32m    //|  jz <1[m
[32m+[m[32m    //|  // Crossed a write barrier. Move the barrier forward.[m
[32m+[m[32m    //|.if X64 and not X64WIN[m
[32m+[m[32m    //|  mov FCARG2, RB[m
[32m+[m[32m    dasm_put(Dst, 10032, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TNUMX - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES);[m
[32m+[m[32m#line 3988 "vm_x86.dasc"[m
[32m+[m[32m    //|  mov RB, BASE			// Save BASE.[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  xchg FCARG2, RB			// Save BASE (FCARG2 == BASE).[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  lea GL:FCARG1, [DISPATCH+GG_DISP2G][m
[32m+[m[32m    //|  call extern lj_gc_barrieruv@8	// (global_State *g, TValue *tv)[m
[32m+[m[32m    //|  mov BASE, RB			// Restore BASE.[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 10119, GG_DISP2G);[m
[32m+[m[32m#line 3996 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m#undef TV2MARKOFS[m
[32m+[m[32m  case BC_USETS:[m
[32m+[m[32m    //|  ins_AND	// RA = upvalue #, RD = str const (~)[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m    //|  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[32m+[m[32m    //|  mov GCOBJ:RA, [KBASE+RD*4][m
[32m+[m[32m    //|  mov RD, UPVAL:RB->v[m
[32m+[m[32m    //|  mov [RD], GCOBJ:RA[m
[32m+[m[32m    //|  mov dword [RD+4], LJ_TSTR[m
[32m+[m[32m    //|  test byte UPVAL:RB->marked, LJ_GC_BLACK		// isblack(uv)[m
[32m+[m[32m    //|  jnz >2[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|2:  // Check if string is white and ensure upvalue is closed.[m
[32m+[m[32m    //|  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(str)[m
[32m+[m[32m    //|  jz <1[m
[32m+[m[32m    //|  cmp byte UPVAL:RB->closed, 0[m
[32m+[m[32m    //|  jz <1[m
[32m+[m[32m    //|  // Crossed a write barrier. Move the barrier forward.[m
[32m+[m[32m    //|  mov RB, BASE			// Save BASE (FCARG2 == BASE).[m
[32m+[m[32m    //|  mov FCARG2, RD[m
[32m+[m[32m    //|  lea GL:FCARG1, [DISPATCH+GG_DISP2G][m
[32m+[m[32m    //|  call extern lj_gc_barrieruv@8	// (global_State *g, TValue *tv)[m
[32m+[m[32m    //|  mov BASE, RB			// Restore BASE.[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 10140, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G);[m
[32m+[m[32m#line 4023 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_USETN:[m
[32m+[m[32m    //|  ins_AD	// RA = upvalue #, RD = num const[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m    //|  movsd xmm0, qword [KBASE+RD*8][m
[32m+[m[32m    //|  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[32m+[m[32m    //|  mov RA, UPVAL:RB->v[m
[32m+[m[32m    //|  movsd qword [RA], xmm0[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 10236, offsetof(GCfuncL, uvptr), DtA(->v));[m
[32m+[m[32m#line 4032 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_USETP:[m
[32m+[m[32m    //|  ins_AND	// RA = upvalue #, RD = primitive type (~)[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m    //|  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[32m+[m[32m    //|  mov RA, UPVAL:RB->v[m
[32m+[m[32m    //|  mov [RA+4], RD[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 10281, offsetof(GCfuncL, uvptr), DtA(->v));[m
[32m+[m[32m#line 4040 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_UCLO:[m
[32m+[m[32m    //|  ins_AD	// RA = level, RD = target[m
[32m+[m[32m    //|  branchPC RD			// Do this first to free RD.[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  cmp dword L:RB->openupval, 0[m
[32m+[m[32m    //|  je >1[m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|  lea FCARG2, [BASE+RA*8]		// Caveat: FCARG2 == BASE[m
[32m+[m[32m    //|  mov L:FCARG1, L:RB		// Caveat: FCARG1 == RA[m
[32m+[m[32m    //|  call extern lj_func_closeuv@8	// (lua_State *L, TValue *level)[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 10321, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base));[m
[32m+[m[32m#line 4054 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_FNEW:[m
[32m+[m[32m    //|  ins_AND	// RA = dst, RD = proto const (~) (holding function prototype)[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[32m+[m[32m    //|  mov CARG3d, [BASE-8][m
[32m+[m[32m    //|  mov CARG2d, [KBASE+RD*4]		// Fetch GCproto *.[m
[32m+[m[32m    //|  mov CARG1d, L:RB[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov LFUNC:RA, [BASE-8][m
[32m+[m[32m    //|  mov PROTO:RD, [KBASE+RD*4]	// Fetch GCproto *.[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov ARG3, LFUNC:RA[m
[32m+[m[32m    //|  mov ARG2, PROTO:RD[m
[32m+[m[32m    //|  mov ARG1, L:RB[m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov SAVE_PC, PC[m
[32m+[m[32m    //|  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[32m+[m[32m    //|  call extern lj_func_newL_gc[m
[32m+[m[32m    //|  // GCfuncL * returned in eax (RC).[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|  movzx RA, PC_RA[m
[32m+[m[32m    //|  mov [BASE+RA*8], LFUNC:RC[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TFUNC[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 10377, Dt1(->base), Dt1(->base), LJ_TFUNC);[m
[32m+[m[32m#line 4082 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Table ops --------------------------------------------------------- */[m
[32m+[m
[32m+[m[32m  case BC_TNEW:[m
[32m+[m[32m    //|  ins_AD	// RA = dst, RD = hbits|asize[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[32m+[m[32m    //|  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[32m+[m[32m    //|  mov SAVE_PC, PC[m
[32m+[m[32m    //|  jae >5[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov CARG3d, RD[m
[32m+[m[32m    //|  and RD, 0x7ff[m
[32m+[m[32m    //|  shr CARG3d, 11[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RA, RD[m
[32m+[m[32m    //|  and RD, 0x7ff[m
[32m+[m[32m    //|  shr RA, 11[m
[32m+[m[32m    //|  mov ARG3, RA[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  cmp RD, 0x7ff[m
[32m+[m[32m    //|  je >3[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov L:CARG1d, L:RB[m
[32m+[m[32m    //|  mov CARG2d, RD[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov ARG1, L:RB[m
[32m+[m[32m    //|  mov ARG2, RD[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  call extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[32m+[m[32m    //|  // Table * returned in eax (RC).[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|  movzx RA, PC_RA[m
[32m+[m[32m    //|  mov [BASE+RA*8], TAB:RC[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TTAB[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|3:  // Turn 0x7ff into 0x801.[m
[32m+[m[32m    //|  mov RD, 0x801[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    //|5:[m
[32m+[m[32m    //|  mov L:FCARG1, L:RB[m
[32m+[m[32m    //|  call extern lj_gc_step_fixtop@4	// (lua_State *L)[m
[32m+[m[32m    //|  movzx RD, PC_RD[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 10444, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB);[m
[32m+[m[32m#line 4130 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_TDUP:[m
[32m+[m[32m    //|  ins_AND	// RA = dst, RD = table const (~) (holding template table)[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[32m+[m[32m    //|  mov SAVE_PC, PC[m
[32m+[m[32m    //|  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|  jae >3[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  mov TAB:FCARG2, [KBASE+RD*4]	// Caveat: FCARG2 == BASE[m
[32m+[m[32m    //|  mov L:FCARG1, L:RB		// Caveat: FCARG1 == RA[m
[32m+[m[32m    //|  call extern lj_tab_dup@8		// (lua_State *L, Table *kt)[m
[32m+[m[32m    //|  // Table * returned in eax (RC).[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|  movzx RA, PC_RA[m
[32m+[m[32m    //|  mov [BASE+RA*8], TAB:RC[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TTAB[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|3:[m
[32m+[m[32m    //|  mov L:FCARG1, L:RB[m
[32m+[m[32m    //|  call extern lj_gc_step_fixtop@4	// (lua_State *L)[m
[32m+[m[32m    //|  movzx RD, PC_RD			// Need to reload RD.[m
[32m+[m[32m    //|  not RDa[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    dasm_put(Dst, 10568, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB);[m
[32m+[m[32m#line 4155 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_GGET:[m
[32m+[m[32m    //|  ins_AND	// RA = dst, RD = str const (~)[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m    //|  mov TAB:RB, LFUNC:RB->env[m
[32m+[m[32m    //|  mov STR:RC, [KBASE+RD*4][m
[32m+[m[32m    //|  jmp ->BC_TGETS_Z[m
[32m+[m[32m    dasm_put(Dst, 10667, Dt7(->env));[m
[32m+[m[32m#line 4163 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_GSET:[m
[32m+[m[32m    //|  ins_AND	// RA = src, RD = str const (~)[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m    //|  mov TAB:RB, LFUNC:RB->env[m
[32m+[m[32m    //|  mov STR:RC, [KBASE+RD*4][m
[32m+[m[32m    //|  jmp ->BC_TSETS_Z[m
[32m+[m[32m    dasm_put(Dst, 10687, Dt7(->env));[m
[32m+[m[32m#line 4170 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_TGETV:[m
[32m+[m[32m    //|  ins_ABC	// RA = dst, RB = table, RC = key[m
[32m+[m[32m    //|  checktab RB, ->vmeta_tgetv[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RB*8][m
[32m+[m[32m    //|[m
[32m+[m[32m    //|  // Integer key?[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  checkint RC, >5[m
[32m+[m[32m    //|  mov RC, dword [BASE+RC*8][m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  // Convert number to int and back and compare.[m
[32m+[m[32m    //|  checknum RC, >5[m
[32m+[m[32m    //|  movsd xmm0, qword [BASE+RC*8][m
[32m+[m[32m    //|  cvttsd2si RC, xmm0[m
[32m+[m[32m    //|  cvtsi2sd xmm1, RC[m
[32m+[m[32m    //|  ucomisd xmm0, xmm1[m
[32m+[m[32m    //|  jne ->vmeta_tgetv		// Generic numeric key? Use fallback.[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  cmp RC, TAB:RB->asize	// Takes care of unordered, too.[m
[32m+[m[32m    //|  jae ->vmeta_tgetv		// Not in array part? Use fallback.[m
[32m+[m[32m    //|  shl RC, 3[m
[32m+[m[32m    //|  add RC, TAB:RB->array[m
[32m+[m[32m    //|  cmp dword [RC+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[32m+[m[32m    //|  je >2[m
[32m+[m[32m    //|  // Get array slot.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [RC][m
[32m+[m[32m    //|  mov [BASE+RA*8], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [RC][m
[32m+[m[32m    //|  mov RC, [RC+4][m
[32m+[m[32m    //|  mov [BASE+RA*8], RB[m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|2:  // Check for __index if table value is nil.[m
[32m+[m[32m    //|  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[32m+[m[32m    //|  jz >3[m
[32m+[m[32m    //|  mov TAB:RA, TAB:RB->metatable[m
[32m+[m[32m    dasm_put(Dst, 10707, LJ_TTAB, LJ_TISNUM, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable));[m
[32m+[m[32m#line 4213 "vm_x86.dasc"[m
[32m+[m[32m    //|  test byte TAB:RA->nomm, 1<<MM_index[m
[32m+[m[32m    //|  jz ->vmeta_tgetv			// 'no __index' flag NOT set: check.[m
[32m+[m[32m    //|  movzx RA, PC_RA			// Restore RA.[m
[32m+[m[32m    //|3:[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TNIL[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|5:  // String key?[m
[32m+[m[32m    //|  checkstr RC, ->vmeta_tgetv[m
[32m+[m[32m    //|  mov STR:RC, [BASE+RC*8][m
[32m+[m[32m    //|  jmp ->BC_TGETS_Z[m
[32m+[m[32m    dasm_put(Dst, 10825, Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TNIL, LJ_TSTR);[m
[32m+[m[32m#line 4224 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_TGETS:[m
[32m+[m[32m    //|  ins_ABC	// RA = dst, RB = table, RC = str const (~)[m
[32m+[m[32m    //|  not RCa[m
[32m+[m[32m    //|  mov STR:RC, [KBASE+RC*4][m
[32m+[m[32m    //|  checktab RB, ->vmeta_tgets[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RB*8][m
[32m+[m[32m    //|->BC_TGETS_Z:	// RB = GCtab *, RC = GCstr *, refetches PC_RA.[m
[32m+[m[32m    //|  mov RA, TAB:RB->hmask[m
[32m+[m[32m    //|  and RA, STR:RC->hash[m
[32m+[m[32m    //|  imul RA, #NODE[m
[32m+[m[32m    //|  add NODE:RA, TAB:RB->node[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  cmp dword NODE:RA->key.it, LJ_TSTR[m
[32m+[m[32m    //|  jne >4[m
[32m+[m[32m    //|  cmp dword NODE:RA->key.gcr, STR:RC[m
[32m+[m[32m    //|  jne >4[m
[32m+[m[32m    //|  // Ok, key found. Assumes: offsetof(Node, val) == 0[m
[32m+[m[32m    //|  cmp dword [RA+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[32m+[m[32m    //|  je >5				// Key found, but nil value?[m
[32m+[m[32m    //|  movzx RC, PC_RA[m
[32m+[m[32m    dasm_put(Dst, 10873, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);[m
[32m+[m[32m#line 4245 "vm_x86.dasc"[m
[32m+[m[32m    //|  // Get node value.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [RA][m
[32m+[m[32m    //|  mov [BASE+RC*8], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [RA][m
[32m+[m[32m    //|  mov RA, [RA+4][m
[32m+[m[32m    //|  mov [BASE+RC*8], RB[m
[32m+[m[32m    //|  mov [BASE+RC*8+4], RA[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|3:[m
[32m+[m[32m    //|  movzx RC, PC_RA[m
[32m+[m[32m    //|  mov dword [BASE+RC*8+4], LJ_TNIL[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|4:  // Follow hash chain.[m
[32m+[m[32m    //|  mov NODE:RA, NODE:RA->next[m
[32m+[m[32m    //|  test NODE:RA, NODE:RA[m
[32m+[m[32m    //|  jnz <1[m
[32m+[m[32m    //|  // End of hash chain: key not found, nil result.[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|5:  // Check for __index if table value is nil.[m
[32m+[m[32m    //|  mov TAB:RA, TAB:RB->metatable[m
[32m+[m[32m    //|  test TAB:RA, TAB:RA[m
[32m+[m[32m    //|  jz <3				// No metatable: done.[m
[32m+[m[32m    //|  test byte TAB:RA->nomm, 1<<MM_index[m
[32m+[m[32m    //|  jnz <3				// 'no __index' flag set: done.[m
[32m+[m[32m    //|  jmp ->vmeta_tgets		// Caveat: preserve STR:RC.[m
[32m+[m[32m    dasm_put(Dst, 10944, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);[m
[32m+[m[32m#line 4276 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_TGETB:[m
[32m+[m[32m    //|  ins_ABC	// RA = dst, RB = table, RC = byte literal[m
[32m+[m[32m    //|  checktab RB, ->vmeta_tgetb[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RB*8][m
[32m+[m[32m    //|  cmp RC, TAB:RB->asize[m
[32m+[m[32m    //|  jae ->vmeta_tgetb[m
[32m+[m[32m    //|  shl RC, 3[m
[32m+[m[32m    //|  add RC, TAB:RB->array[m
[32m+[m[32m    //|  cmp dword [RC+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[32m+[m[32m    //|  je >2[m
[32m+[m[32m    //|  // Get array slot.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [RC][m
[32m+[m[32m    //|  mov [BASE+RA*8], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [RC][m
[32m+[m[32m    //|  mov RC, [RC+4][m
[32m+[m[32m    //|  mov [BASE+RA*8], RB[m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|2:  // Check for __index if table value is nil.[m
[32m+[m[32m    //|  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[32m+[m[32m    //|  jz >3[m
[32m+[m[32m    //|  mov TAB:RA, TAB:RB->metatable[m
[32m+[m[32m    //|  test byte TAB:RA->nomm, 1<<MM_index[m
[32m+[m[32m    //|  jz ->vmeta_tgetb			// 'no __index' flag NOT set: check.[m
[32m+[m[32m    //|  movzx RA, PC_RA			// Restore RA.[m
[32m+[m[32m    dasm_put(Dst, 11030, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);[m
[32m+[m[32m#line 4307 "vm_x86.dasc"[m
[32m+[m[32m    //|3:[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TNIL[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 11126, LJ_TNIL);[m
[32m+[m[32m#line 4310 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_TGETR:[m
[32m+[m[32m    //|  ins_ABC	// RA = dst, RB = table, RC = key[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RB*8][m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  mov RC, dword [BASE+RC*8][m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  cvttsd2si RC, qword [BASE+RC*8][m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  cmp RC, TAB:RB->asize[m
[32m+[m[32m    //|  jae ->vmeta_tgetr		// Not in array part? Use fallback.[m
[32m+[m[32m    //|  shl RC, 3[m
[32m+[m[32m    //|  add RC, TAB:RB->array[m
[32m+[m[32m    //|  // Get array slot.[m
[32m+[m[32m    //|->BC_TGETR_Z:[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [RC][m
[32m+[m[32m    //|  mov [BASE+RA*8], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [RC][m
[32m+[m[32m    //|  mov RC, [RC+4][m
[32m+[m[32m    //|  mov [BASE+RA*8], RB[m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|->BC_TGETR2_Z:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 11143, Dt6(->asize), Dt6(->array));[m
[32m+[m[32m#line 4336 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_TSETV:[m
[32m+[m[32m    //|  ins_ABC	// RA = src, RB = table, RC = key[m
[32m+[m[32m    //|  checktab RB, ->vmeta_tsetv[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RB*8][m
[32m+[m[32m    //|[m
[32m+[m[32m    //|  // Integer key?[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  checkint RC, >5[m
[32m+[m[32m    //|  mov RC, dword [BASE+RC*8][m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  // Convert number to int and back and compare.[m
[32m+[m[32m    //|  checknum RC, >5[m
[32m+[m[32m    //|  movsd xmm0, qword [BASE+RC*8][m
[32m+[m[32m    //|  cvttsd2si RC, xmm0[m
[32m+[m[32m    //|  cvtsi2sd xmm1, RC[m
[32m+[m[32m    //|  ucomisd xmm0, xmm1[m
[32m+[m[32m    //|  jne ->vmeta_tsetv		// Generic numeric key? Use fallback.[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  cmp RC, TAB:RB->asize		// Takes care of unordered, too.[m
[32m+[m[32m    //|  jae ->vmeta_tsetv[m
[32m+[m[32m    //|  shl RC, 3[m
[32m+[m[32m    //|  add RC, TAB:RB->array[m
[32m+[m[32m    //|  cmp dword [RC+4], LJ_TNIL[m
[32m+[m[32m    //|  je >3				// Previous value is nil?[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[32m+[m[32m    //|  jnz >7[m
[32m+[m[32m    //|2:  // Set array slot.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [BASE+RA*8][m
[32m+[m[32m    dasm_put(Dst, 11205, LJ_TTAB, LJ_TISNUM, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK);[m
[32m+[m[32m#line 4368 "vm_x86.dasc"[m
[32m+[m[32m    //|  mov [RC], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [BASE+RA*8+4][m
[32m+[m[32m    //|  mov RA, [BASE+RA*8][m
[32m+[m[32m    //|  mov [RC+4], RB[m
[32m+[m[32m    //|  mov [RC], RA[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|3:  // Check for __newindex if previous value is nil.[m
[32m+[m[32m    //|  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[32m+[m[32m    //|  jz <1[m
[32m+[m[32m    //|  mov TAB:RA, TAB:RB->metatable[m
[32m+[m[32m    //|  test byte TAB:RA->nomm, 1<<MM_newindex[m
[32m+[m[32m    //|  jz ->vmeta_tsetv			// 'no __newindex' flag NOT set: check.[m
[32m+[m[32m    //|  movzx RA, PC_RA			// Restore RA.[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|5:  // String key?[m
[32m+[m[32m    //|  checkstr RC, ->vmeta_tsetv[m
[32m+[m[32m    //|  mov STR:RC, [BASE+RC*8][m
[32m+[m[32m    //|  jmp ->BC_TSETS_Z[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[32m+[m[32m    //|  barrierback TAB:RB, RA[m
[32m+[m[32m    dasm_put(Dst, 11297, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, Dt6(->marked), (uint8_t)~LJ_GC_BLACK);[m
[32m+[m[32m#line 4393 "vm_x86.dasc"[m
[32m+[m[32m    //|  movzx RA, PC_RA			// Restore RA.[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    dasm_put(Dst, 11381, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));[m
[32m+[m[32m#line 4395 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_TSETS:[m
[32m+[m[32m    //|  ins_ABC	// RA = src, RB = table, RC = str const (~)[m
[32m+[m[32m    //|  not RCa[m
[32m+[m[32m    //|  mov STR:RC, [KBASE+RC*4][m
[32m+[m[32m    //|  checktab RB, ->vmeta_tsets[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RB*8][m
[32m+[m[32m    //|->BC_TSETS_Z:	// RB = GCtab *, RC = GCstr *, refetches PC_RA.[m
[32m+[m[32m    //|  mov RA, TAB:RB->hmask[m
[32m+[m[32m    //|  and RA, STR:RC->hash[m
[32m+[m[32m    //|  imul RA, #NODE[m
[32m+[m[32m    //|  mov byte TAB:RB->nomm, 0		// Clear metamethod cache.[m
[32m+[m[32m    //|  add NODE:RA, TAB:RB->node[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  cmp dword NODE:RA->key.it, LJ_TSTR[m
[32m+[m[32m    //|  jne >5[m
[32m+[m[32m    //|  cmp dword NODE:RA->key.gcr, STR:RC[m
[32m+[m[32m    //|  jne >5[m
[32m+[m[32m    //|  // Ok, key found. Assumes: offsetof(Node, val) == 0[m
[32m+[m[32m    //|  cmp dword [RA+4], LJ_TNIL[m
[32m+[m[32m    //|  je >4				// Previous value is nil?[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[32m+[m[32m    dasm_put(Dst, 11402, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);[m
[32m+[m[32m#line 4418 "vm_x86.dasc"[m
[32m+[m[32m    //|  jnz >7[m
[32m+[m[32m    //|3:  // Set node value.[m
[32m+[m[32m    //|  movzx RC, PC_RA[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [BASE+RC*8][m
[32m+[m[32m    //|  mov [RA], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [BASE+RC*8+4][m
[32m+[m[32m    //|  mov RC, [BASE+RC*8][m
[32m+[m[32m    //|  mov [RA+4], RB[m
[32m+[m[32m    //|  mov [RA], RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|4:  // Check for __newindex if previous value is nil.[m
[32m+[m[32m    //|  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[32m+[m[32m    //|  jz <2[m
[32m+[m[32m    //|  mov TMP1, RA			// Save RA.[m
[32m+[m[32m    //|  mov TAB:RA, TAB:RB->metatable[m
[32m+[m[32m    //|  test byte TAB:RA->nomm, 1<<MM_newindex[m
[32m+[m[32m    //|  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[32m+[m[32m    //|  mov RA, TMP1			// Restore RA.[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|5:  // Follow hash chain.[m
[32m+[m[32m    //|  mov NODE:RA, NODE:RA->next[m
[32m+[m[32m    //|  test NODE:RA, NODE:RA[m
[32m+[m[32m    //|  jnz <1[m
[32m+[m[32m    //|  // End of hash chain: key not found, add a new one.[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|  // But check for __newindex first.[m
[32m+[m[32m    //|  mov TAB:RA, TAB:RB->metatable[m
[32m+[m[32m    dasm_put(Dst, 11479, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next));[m
[32m+[m[32m#line 4450 "vm_x86.dasc"[m
[32m+[m[32m    //|  test TAB:RA, TAB:RA[m
[32m+[m[32m    //|  jz >6				// No metatable: continue.[m
[32m+[m[32m    //|  test byte TAB:RA->nomm, 1<<MM_newindex[m
[32m+[m[32m    //|  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[32m+[m[32m    //|6:[m
[32m+[m[32m    //|  mov TMP1, STR:RC[m
[32m+[m[32m    //|  mov TMP2, LJ_TSTR[m
[32m+[m[32m    //|  mov TMP3, TAB:RB			// Save TAB:RB for us.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m    //|  mov L:CARG1d->base, BASE[m
[32m+[m[32m    //|  lea CARG3, TMP1[m
[32m+[m[32m    //|  mov CARG2d, TAB:RB[m
[32m+[m[32m    //|  mov L:RB, L:CARG1d[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  lea RC, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[32m+[m[32m    //|  mov ARG2, TAB:RB[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov ARG3, RC[m
[32m+[m[32m    //|  mov ARG1, L:RB[m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov SAVE_PC, PC[m
[32m+[m[32m    //|  call extern lj_tab_newkey	// (lua_State *L, GCtab *t, TValue *k)[m
[32m+[m[32m    //|  // Handles write barrier for the new key. TValue * returned in eax (RC).[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|  mov TAB:RB, TMP3			// Need TAB:RB for barrier.[m
[32m+[m[32m    //|  mov RA, eax[m
[32m+[m[32m    //|  jmp <2				// Must check write barrier for value.[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[32m+[m[32m    //|  barrierback TAB:RB, RC		// Destroys STR:RC.[m
[32m+[m[32m    //|  jmp <3[m
[32m+[m[32m    dasm_put(Dst, 11566, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, Dt1(->base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));[m
[32m+[m[32m    dasm_put(Dst, 11654);[m
[32m+[m[32m#line 4483 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_TSETB:[m
[32m+[m[32m    //|  ins_ABC	// RA = src, RB = table, RC = byte literal[m
[32m+[m[32m    //|  checktab RB, ->vmeta_tsetb[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RB*8][m
[32m+[m[32m    //|  cmp RC, TAB:RB->asize[m
[32m+[m[32m    //|  jae ->vmeta_tsetb[m
[32m+[m[32m    //|  shl RC, 3[m
[32m+[m[32m    //|  add RC, TAB:RB->array[m
[32m+[m[32m    //|  cmp dword [RC+4], LJ_TNIL[m
[32m+[m[32m    //|  je >3				// Previous value is nil?[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[32m+[m[32m    //|  jnz >7[m
[32m+[m[32m    //|2:	 // Set array slot.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RAa, [BASE+RA*8][m
[32m+[m[32m    //|  mov [RC], RAa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [BASE+RA*8+4][m
[32m+[m[32m    //|  mov RA, [BASE+RA*8][m
[32m+[m[32m    //|  mov [RC+4], RB[m
[32m+[m[32m    //|  mov [RC], RA[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|3:  // Check for __newindex if previous value is nil.[m
[32m+[m[32m    //|  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[32m+[m[32m    //|  jz <1[m
[32m+[m[32m    //|  mov TAB:RA, TAB:RB->metatable[m
[32m+[m[32m    dasm_put(Dst, 11659, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable));[m
[32m+[m[32m#line 4513 "vm_x86.dasc"[m
[32m+[m[32m    //|  test byte TAB:RA->nomm, 1<<MM_newindex[m
[32m+[m[32m    //|  jz ->vmeta_tsetb			// 'no __newindex' flag NOT set: check.[m
[32m+[m[32m    //|  movzx RA, PC_RA			// Restore RA.[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[32m+[m[32m    //|  barrierback TAB:RB, RA[m
[32m+[m[32m    //|  movzx RA, PC_RA			// Restore RA.[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    dasm_put(Dst, 11754, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));[m
[32m+[m[32m#line 4522 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_TSETR:[m
[32m+[m[32m    //|  ins_ABC	// RA = src, RB = table, RC = key[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RB*8][m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  mov RC, dword [BASE+RC*8][m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  cvttsd2si RC, qword [BASE+RC*8][m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[32m+[m[32m    //|  jnz >7[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  cmp RC, TAB:RB->asize[m
[32m+[m[32m    //|  jae ->vmeta_tsetr[m
[32m+[m[32m    //|  shl RC, 3[m
[32m+[m[32m    //|  add RC, TAB:RB->array[m
[32m+[m[32m    //|  // Set array slot.[m
[32m+[m[32m    //|->BC_TSETR_Z:[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [BASE+RA*8][m
[32m+[m[32m    //|  mov [RC], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [BASE+RA*8+4][m
[32m+[m[32m    //|  mov RA, [BASE+RA*8][m
[32m+[m[32m    //|  mov [RC+4], RB[m
[32m+[m[32m    //|  mov [RC], RA[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[32m+[m[32m    //|  barrierback TAB:RB, RA[m
[32m+[m[32m    //|  movzx RA, PC_RA			// Restore RA.[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    dasm_put(Dst, 11802, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));[m
[32m+[m[32m#line 4555 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_TSETM:[m
[32m+[m[32m    //|  ins_AD	// RA = base (table at base-1), RD = num const (start index)[m
[32m+[m[32m    //|  mov TMP1, KBASE			// Need one more free register.[m
[32m+[m[32m    //|  mov KBASE, dword [KBASE+RD*8]	// Integer constant is in lo-word.[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  lea RA, [BASE+RA*8][m
[32m+[m[32m    //|  mov TAB:RB, [RA-8]		// Guaranteed to be a table.[m
[32m+[m[32m    //|  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[32m+[m[32m    //|  jnz >7[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  mov RD, MULTRES[m
[32m+[m[32m    //|  sub RD, 1[m
[32m+[m[32m    //|  jz >4				// Nothing to copy?[m
[32m+[m[32m    //|  add RD, KBASE			// Compute needed size.[m
[32m+[m[32m    //|  cmp RD, TAB:RB->asize[m
[32m+[m[32m    //|  ja >5				// Doesn't fit into array part?[m
[32m+[m[32m    //|  sub RD, KBASE[m
[32m+[m[32m    //|  shl KBASE, 3[m
[32m+[m[32m    //|  add KBASE, TAB:RB->array[m
[32m+[m[32m    //|3:  // Copy result slots to table.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [RA][m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  mov [KBASE], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [RA][m
[32m+[m[32m    //|  mov [KBASE], RB[m
[32m+[m[32m    //|  mov RB, [RA+4][m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  mov [KBASE+4], RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  add KBASE, 8[m
[32m+[m[32m    //|  sub RD, 1[m
[32m+[m[32m    //|  jnz <3[m
[32m+[m[32m    //|4:[m
[32m+[m[32m    //|  mov KBASE, TMP1[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|5:  // Need to resize array part.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov L:CARG1d, SAVE_L[m
[32m+[m[32m    //|  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[32m+[m[32m    //|  mov CARG2d, TAB:RB[m
[32m+[m[32m    //|  mov CARG3d, RD[m
[32m+[m[32m    //|  mov L:RB, L:CARG1d[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov ARG2, TAB:RB[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|  mov ARG3, RD[m
[32m+[m[32m    //|  mov ARG1, L:RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov SAVE_PC, PC[m
[32m+[m[32m    //|  call extern lj_tab_reasize	// (lua_State *L, GCtab *t, int nasize)[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|  movzx RA, PC_RA			// Restore RA.[m
[32m+[m[32m    dasm_put(Dst, 11899, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base));[m
[32m+[m[32m#line 4613 "vm_x86.dasc"[m
[32m+[m[32m    //|  jmp <1				// Retry.[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[32m+[m[32m    //|  barrierback TAB:RB, RD[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    dasm_put(Dst, 12038, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));[m
[32m+[m[32m#line 4618 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Calls and vararg handling ----------------------------------------- */[m
[32m+[m
[32m+[m[32m  case BC_CALL: case BC_CALLM:[m
[32m+[m[32m    //|  ins_A_C	// RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs[m
[32m+[m[32m    dasm_put(Dst, 9207);[m
[32m+[m[32m#line 4624 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_CALLM) {[m
[32m+[m[32m      //|  add NARGS:RD, MULTRES[m
[32m+[m[32m      dasm_put(Dst, 12069);[m
[32m+[m[32m#line 4626 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  cmp dword [BASE+RA*8+4], LJ_TFUNC[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE+RA*8][m
[32m+[m[32m    //|  jne ->vmeta_call_ra[m
[32m+[m[32m    //|  lea BASE, [BASE+RA*8+8][m
[32m+[m[32m    //|  ins_call[m
[32m+[m[32m    dasm_put(Dst, 12074, LJ_TFUNC, Dt7(->pc));[m
[32m+[m[32m#line 4632 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_CALLMT:[m
[32m+[m[32m    //|  ins_AD	// RA = base, RD = extra_nargs[m
[32m+[m[32m    //|  add NARGS:RD, MULTRES[m
[32m+[m[32m    //|  // Fall through. Assumes BC_CALLT follows and ins_AD is a no-op.[m
[32m+[m[32m    dasm_put(Dst, 12069);[m
[32m+[m[32m#line 4638 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m[32m  case BC_CALLT:[m
[32m+[m[32m    //|  ins_AD	// RA = base, RD = nargs+1[m
[32m+[m[32m    //|  lea RA, [BASE+RA*8+8][m
[32m+[m[32m    //|  mov KBASE, BASE			// Use KBASE for move + vmeta_call hint.[m
[32m+[m[32m    //|  mov LFUNC:RB, [RA-8][m
[32m+[m[32m    //|  cmp dword [RA-4], LJ_TFUNC[m
[32m+[m[32m    //|  jne ->vmeta_call[m
[32m+[m[32m    //|->BC_CALLT_Z:[m
[32m+[m[32m    //|  mov PC, [BASE-4][m
[32m+[m[32m    //|  test PC, FRAME_TYPE[m
[32m+[m[32m    //|  jnz >7[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  mov [BASE-8], LFUNC:RB		// Copy function down, reloaded below.[m
[32m+[m[32m    //|  mov MULTRES, NARGS:RD[m
[32m+[m[32m    //|  sub NARGS:RD, 1[m
[32m+[m[32m    //|  jz >3[m
[32m+[m[32m    //|2:  // Move args down.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [RA][m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  mov [KBASE], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [RA][m
[32m+[m[32m    //|  mov [KBASE], RB[m
[32m+[m[32m    //|  mov RB, [RA+4][m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  mov [KBASE+4], RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  add KBASE, 8[m
[32m+[m[32m    //|  sub NARGS:RD, 1[m
[32m+[m[32m    //|  jnz <2[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|  mov LFUNC:RB, [BASE-8][m
[32m+[m[32m    //|3:[m
[32m+[m[32m    //|  mov NARGS:RD, MULTRES[m
[32m+[m[32m    //|  cmp byte LFUNC:RB->ffid, 1	// (> FF_C) Calling a fast function?[m
[32m+[m[32m    //|  ja >5[m
[32m+[m[32m    //|4:[m
[32m+[m[32m    //|  ins_callt[m
[32m+[m[32m    dasm_put(Dst, 12117, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc));[m
[32m+[m[32m#line 4678 "vm_x86.dasc"[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|5:  // Tailcall to a fast function.[m
[32m+[m[32m    //|  test PC, FRAME_TYPE		// Lua frame below?[m
[32m+[m[32m    //|  jnz <4[m
[32m+[m[32m    //|  movzx RA, PC_RA[m
[32m+[m[32m    //|  not RAa[m
[32m+[m[32m    //|  mov LFUNC:KBASE, [BASE+RA*8-8]	// Need to prepare KBASE.[m
[32m+[m[32m    //|  mov KBASE, LFUNC:KBASE->pc[m
[32m+[m[32m    //|  mov KBASE, [KBASE+PC2PROTO(k)][m
[32m+[m[32m    //|  jmp <4[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Tailcall from a vararg function.[m
[32m+[m[32m    //|  sub PC, FRAME_VARG[m
[32m+[m[32m    //|  test PC, FRAME_TYPEP[m
[32m+[m[32m    //|  jnz >8				// Vararg frame below?[m
[32m+[m[32m    //|  sub BASE, PC			// Need to relocate BASE/KBASE down.[m
[32m+[m[32m    //|  mov KBASE, BASE[m
[32m+[m[32m    //|  mov PC, [BASE-4][m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    //|8:[m
[32m+[m[32m    //|  add PC, FRAME_VARG[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 12215, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG);[m
[32m+[m[32m#line 4700 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_ITERC:[m
[32m+[m[32m    //|  ins_A	// RA = base, (RB = nresults+1,) RC = nargs+1 (2+1)[m
[32m+[m[32m    //|  lea RA, [BASE+RA*8+8]		// fb = base+1[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [RA-24]			// Copy state. fb[0] = fb[-3].[m
[32m+[m[32m    //|  mov RCa, [RA-16]			// Copy control var. fb[1] = fb[-2].[m
[32m+[m[32m    //|  mov [RA], RBa[m
[32m+[m[32m    //|  mov [RA+8], RCa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [RA-24]			// Copy state. fb[0] = fb[-3].[m
[32m+[m[32m    //|  mov RC, [RA-20][m
[32m+[m[32m    //|  mov [RA], RB[m
[32m+[m[32m    //|  mov [RA+4], RC[m
[32m+[m[32m    //|  mov RB, [RA-16]			// Copy control var. fb[1] = fb[-2].[m
[32m+[m[32m    //|  mov RC, [RA-12][m
[32m+[m[32m    //|  mov [RA+8], RB[m
[32m+[m[32m    //|  mov [RA+12], RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov LFUNC:RB, [RA-32]		// Copy callable. fb[-1] = fb[-4][m
[32m+[m[32m    //|  mov RC, [RA-28][m
[32m+[m[32m    //|  mov [RA-8], LFUNC:RB[m
[32m+[m[32m    //|  mov [RA-4], RC[m
[32m+[m[32m    //|  cmp RC, LJ_TFUNC			// Handle like a regular 2-arg call.[m
[32m+[m[32m    //|  mov NARGS:RD, 2+1[m
[32m+[m[32m    //|  jne ->vmeta_call[m
[32m+[m[32m    //|  mov BASE, RA[m
[32m+[m[32m    //|  ins_call[m
[32m+[m[32m    dasm_put(Dst, 12307, LJ_TFUNC, 2+1, Dt7(->pc));[m
[32m+[m[32m#line 4729 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_ITERN:[m
[32m+[m[32m    //|  ins_A	// RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[32m+[m[32m    //|.if JIT[m
[32m+[m[32m    //|  // NYI: add hotloop, record BC_ITERN.[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov TMP1, KBASE			// Need two more free registers.[m
[32m+[m[32m    //|  mov TMP2, DISPATCH[m
[32m+[m[32m    //|  mov TAB:RB, [BASE+RA*8-16][m
[32m+[m[32m    //|  mov RC, [BASE+RA*8-8]		// Get index from control var.[m
[32m+[m[32m    //|  mov DISPATCH, TAB:RB->asize[m
[32m+[m[32m    //|  add PC, 4[m
[32m+[m[32m    //|  mov KBASE, TAB:RB->array[m
[32m+[m[32m    //|1:  // Traverse array part.[m
[32m+[m[32m    //|  cmp RC, DISPATCH; jae >5		// Index points after array part?[m
[32m+[m[32m    //|  cmp dword [KBASE+RC*8+4], LJ_TNIL; je >4[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[32m+[m[32m    //|  mov dword [BASE+RA*8], RC[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  cvtsi2sd xmm0, RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  // Copy array slot to returned value.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, [KBASE+RC*8][m
[32m+[m[32m    //|  mov [BASE+RA*8+8], RBa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, [KBASE+RC*8+4][m
[32m+[m[32m    //|  mov [BASE+RA*8+12], RB[m
[32m+[m[32m    //|  mov RB, [KBASE+RC*8][m
[32m+[m[32m    //|  mov [BASE+RA*8+8], RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  add RC, 1[m
[32m+[m[32m    //|  // Return array index as a numeric key.[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  // See above.[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  movsd qword [BASE+RA*8], xmm0[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov [BASE+RA*8-8], RC		// Update control var.[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  movzx RD, PC_RD			// Get target from ITERL.[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|3:[m
[32m+[m[32m    //|  mov DISPATCH, TMP2[m
[32m+[m[32m    //|  mov KBASE, TMP1[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|4:  // Skip holes in array part.[m
[32m+[m[32m    //|  add RC, 1[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|5:  // Traverse hash part.[m
[32m+[m[32m    //|  sub RC, DISPATCH[m
[32m+[m[32m    //|6:[m
[32m+[m[32m    //|  cmp RC, TAB:RB->hmask; ja <3	// End of iteration? Branch to ITERL+1.[m
[32m+[m[32m    //|  imul KBASE, RC, #NODE[m
[32m+[m[32m    dasm_put(Dst, 12379, Dt6(->asize), Dt6(->array), LJ_TNIL, -BCBIAS_J*4, Dt6(->hmask));[m
[32m+[m[32m#line 4787 "vm_x86.dasc"[m
[32m+[m[32m    //|  add NODE:KBASE, TAB:RB->node[m
[32m+[m[32m    //|  cmp dword NODE:KBASE->val.it, LJ_TNIL; je >7[m
[32m+[m[32m    //|  lea DISPATCH, [RC+DISPATCH+1][m
[32m+[m[32m    //|  // Copy key and value from hash slot.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RBa, NODE:KBASE->key[m
[32m+[m[32m    //|  mov RCa, NODE:KBASE->val[m
[32m+[m[32m    //|  mov [BASE+RA*8], RBa[m
[32m+[m[32m    //|  mov [BASE+RA*8+8], RCa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RB, NODE:KBASE->key.gcr[m
[32m+[m[32m    //|  mov RC, NODE:KBASE->key.it[m
[32m+[m[32m    //|  mov [BASE+RA*8], RB[m
[32m+[m[32m    //|  mov [BASE+RA*8+4], RC[m
[32m+[m[32m    //|  mov RB, NODE:KBASE->val.gcr[m
[32m+[m[32m    //|  mov RC, NODE:KBASE->val.it[m
[32m+[m[32m    //|  mov [BASE+RA*8+8], RB[m
[32m+[m[32m    //|  mov [BASE+RA*8+12], RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  mov [BASE+RA*8-8], DISPATCH[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Skip holes in hash part.[m
[32m+[m[32m    //|  add RC, 1[m
[32m+[m[32m    //|  jmp <6[m
[32m+[m[32m    dasm_put(Dst, 12526, sizeof(Node), Dt6(->node), DtB(->val.it), LJ_TNIL, DtB(->key), DtB(->val));[m
[32m+[m[32m#line 4812 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_ISNEXT:[m
[32m+[m[32m    //|  ins_AD	// RA = base, RD = target (points to ITERN)[m
[32m+[m[32m    //|  cmp dword [BASE+RA*8-20], LJ_TFUNC; jne >5[m
[32m+[m[32m    //|  mov CFUNC:RB, [BASE+RA*8-24][m
[32m+[m[32m    //|  cmp dword [BASE+RA*8-12], LJ_TTAB; jne >5[m
[32m+[m[32m    //|  cmp dword [BASE+RA*8-4], LJ_TNIL; jne >5[m
[32m+[m[32m    //|  cmp byte CFUNC:RB->ffid, FF_next_N; jne >5[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|  mov dword [BASE+RA*8-8], 0	// Initialize control var.[m
[32m+[m[32m    //|  mov dword [BASE+RA*8-4], 0xfffe7fff[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|5:  // Despecialize bytecode if any of the checks fail.[m
[32m+[m[32m    //|  mov PC_OP, BC_JMP[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|  mov byte [PC], BC_ITERC[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 12586, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, BC_JMP, -BCBIAS_J*4, BC_ITERC);[m
[32m+[m[32m    dasm_put(Dst, 9182);[m
[32m+[m[32m#line 4831 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_VARG:[m
[32m+[m[32m    //|  ins_ABC	// RA = base, RB = nresults+1, RC = numparams[m
[32m+[m[32m    //|  mov TMP1, KBASE			// Need one more free register.[m
[32m+[m[32m    //|  lea KBASE, [BASE+RC*8+(8+FRAME_VARG)][m
[32m+[m[32m    //|  lea RA, [BASE+RA*8][m
[32m+[m[32m    //|  sub KBASE, [BASE-4][m
[32m+[m[32m    //|  // Note: KBASE may now be even _above_ BASE if nargs was < numparams.[m
[32m+[m[32m    //|  test RB, RB[m
[32m+[m[32m    //|  jz >5				// Copy all varargs?[m
[32m+[m[32m    //|  lea RB, [RA+RB*8-8][m
[32m+[m[32m    //|  cmp KBASE, BASE			// No vararg slots?[m
[32m+[m[32m    //|  jnb >2[m
[32m+[m[32m    //|1:  // Copy vararg slots to destination slots.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RCa, [KBASE-8][m
[32m+[m[32m    //|  add KBASE, 8[m
[32m+[m[32m    //|  mov [RA], RCa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RC, [KBASE-8][m
[32m+[m[32m    //|  mov [RA], RC[m
[32m+[m[32m    //|  mov RC, [KBASE-4][m
[32m+[m[32m    //|  add KBASE, 8[m
[32m+[m[32m    //|  mov [RA+4], RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  cmp RA, RB			// All destination slots filled?[m
[32m+[m[32m    //|  jnb >3[m
[32m+[m[32m    //|  cmp KBASE, BASE			// No more vararg slots?[m
[32m+[m[32m    //|  jb <1[m
[32m+[m[32m    //|2:  // Fill up remainder with nil.[m
[32m+[m[32m    //|  mov dword [RA+4], LJ_TNIL[m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  cmp RA, RB[m
[32m+[m[32m    //|  jb <2[m
[32m+[m[32m    //|3:[m
[32m+[m[32m    //|  mov KBASE, TMP1[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|5:  // Copy all varargs.[m
[32m+[m[32m    //|  mov MULTRES, 1			// MULTRES = 0+1[m
[32m+[m[32m    //|  mov RC, BASE[m
[32m+[m[32m    //|  sub RC, KBASE[m
[32m+[m[32m    //|  jbe <3				// No vararg slots?[m
[32m+[m[32m    //|  mov RB, RC[m
[32m+[m[32m    //|  shr RB, 3[m
[32m+[m[32m    //|  add RB, 1[m
[32m+[m[32m    //|  mov MULTRES, RB			// MULTRES = #varargs+1[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  add RC, RA[m
[32m+[m[32m    //|  cmp RC, L:RB->maxstack[m
[32m+[m[32m    //|  ja >7				// Need to grow stack?[m
[32m+[m[32m    dasm_put(Dst, 12695, (8+FRAME_VARG), LJ_TNIL, Dt1(->maxstack));[m
[32m+[m[32m#line 4884 "vm_x86.dasc"[m
[32m+[m[32m    //|6:  // Copy all vararg slots.[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov RCa, [KBASE-8][m
[32m+[m[32m    //|  add KBASE, 8[m
[32m+[m[32m    //|  mov [RA], RCa[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|  mov RC, [KBASE-8][m
[32m+[m[32m    //|  mov [RA], RC[m
[32m+[m[32m    //|  mov RC, [KBASE-4][m
[32m+[m[32m    //|  add KBASE, 8[m
[32m+[m[32m    //|  mov [RA+4], RC[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  cmp KBASE, BASE			// No more vararg slots?[m
[32m+[m[32m    //|  jb <6[m
[32m+[m[32m    //|  jmp <3[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Grow stack for varargs.[m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|  mov L:RB->top, RA[m
[32m+[m[32m    //|  mov SAVE_PC, PC[m
[32m+[m[32m    //|  sub KBASE, BASE			// Need delta, because BASE may change.[m
[32m+[m[32m    //|  mov FCARG2, MULTRES[m
[32m+[m[32m    //|  sub FCARG2, 1[m
[32m+[m[32m    //|  mov FCARG1, L:RB[m
[32m+[m[32m    //|  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|  mov RA, L:RB->top[m
[32m+[m[32m    //|  add KBASE, BASE[m
[32m+[m[32m    //|  jmp <6[m
[32m+[m[32m    dasm_put(Dst, 12856, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));[m
[32m+[m[32m#line 4914 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Returns ----------------------------------------------------------- */[m
[32m+[m
[32m+[m[32m  case BC_RETM:[m
[32m+[m[32m    //|  ins_AD	// RA = results, RD = extra_nresults[m
[32m+[m[32m    //|  add RD, MULTRES			// MULTRES >=1, so RD >=1.[m
[32m+[m[32m    //|  // Fall through. Assumes BC_RET follows and ins_AD is a no-op.[m
[32m+[m[32m    dasm_put(Dst, 12069);[m
[32m+[m[32m#line 4922 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_RET: case BC_RET0: case BC_RET1:[m
[32m+[m[32m    //|  ins_AD	// RA = results, RD = nresults+1[m
[32m+[m[32m    if (op != BC_RET0) {[m
[32m+[m[32m      //|  shl RA, 3[m
[32m+[m[32m      dasm_put(Dst, 12932);[m
[32m+[m[32m#line 4928 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  mov PC, [BASE-4][m
[32m+[m[32m    //|  mov MULTRES, RD			// Save nresults+1.[m
[32m+[m[32m    //|  test PC, FRAME_TYPE		// Check frame type marker.[m
[32m+[m[32m    //|  jnz >7				// Not returning to a fixarg Lua func?[m
[32m+[m[32m    dasm_put(Dst, 12936, FRAME_TYPE);[m
[32m+[m[32m#line 4934 "vm_x86.dasc"[m
[32m+[m[32m    switch (op) {[m
[32m+[m[32m    case BC_RET:[m
[32m+[m[32m      //|->BC_RET_Z:[m
[32m+[m[32m      //|  mov KBASE, BASE		// Use KBASE for result move.[m
[32m+[m[32m      //|  sub RD, 1[m
[32m+[m[32m      //|  jz >3[m
[32m+[m[32m      //|2:  // Move results down.[m
[32m+[m[32m      //|.if X64[m
[32m+[m[32m      //|  mov RBa, [KBASE+RA][m
[32m+[m[32m      //|  mov [KBASE-8], RBa[m
[32m+[m[32m      //|.else[m
[32m+[m[32m      //|  mov RB, [KBASE+RA][m
[32m+[m[32m      //|  mov [KBASE-8], RB[m
[32m+[m[32m      //|  mov RB, [KBASE+RA+4][m
[32m+[m[32m      //|  mov [KBASE-4], RB[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      //|  add KBASE, 8[m
[32m+[m[32m      //|  sub RD, 1[m
[32m+[m[32m      //|  jnz <2[m
[32m+[m[32m      //|3:[m
[32m+[m[32m      //|  mov RD, MULTRES		// Note: MULTRES may be >255.[m
[32m+[m[32m      //|  movzx RB, PC_RB		// So cannot compare with RDL![m
[32m+[m[32m      //|5:[m
[32m+[m[32m      //|  cmp RB, RD			// More results expected?[m
[32m+[m[32m      //|  ja >6[m
[32m+[m[32m      dasm_put(Dst, 12955);[m
[32m+[m[32m#line 4959 "vm_x86.dasc"[m
[32m+[m[32m      break;[m
[32m+[m[32m    case BC_RET1:[m
[32m+[m[32m      //|.if X64[m
[32m+[m[32m      //|  mov RBa, [BASE+RA][m
[32m+[m[32m      //|  mov [BASE-8], RBa[m
[32m+[m[32m      //|.else[m
[32m+[m[32m      //|  mov RB, [BASE+RA+4][m
[32m+[m[32m      //|  mov [BASE-4], RB[m
[32m+[m[32m      //|  mov RB, [BASE+RA][m
[32m+[m[32m      //|  mov [BASE-8], RB[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      dasm_put(Dst, 13009);[m
[32m+[m[32m#line 4970 "vm_x86.dasc"[m
[32m+[m[32m      /* fallthrough */[m
[32m+[m[32m    case BC_RET0:[m
[32m+[m[32m      //|5:[m
[32m+[m[32m      //|  cmp PC_RB, RDL			// More results expected?[m
[32m+[m[32m      //|  ja >6[m
[32m+[m[32m      dasm_put(Dst, 13019);[m
[32m+[m[32m#line 4975 "vm_x86.dasc"[m
[32m+[m[32m    default:[m
[32m+[m[32m      break;[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  movzx RA, PC_RA[m
[32m+[m[32m    //|  not RAa				// Note: ~RA = -(RA+1)[m
[32m+[m[32m    //|  lea BASE, [BASE+RA*8]		// base = base - (RA+1)*8[m
[32m+[m[32m    //|  mov LFUNC:KBASE, [BASE-8][m
[32m+[m[32m    //|  mov KBASE, LFUNC:KBASE->pc[m
[32m+[m[32m    //|  mov KBASE, [KBASE+PC2PROTO(k)][m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|6:  // Fill up results with nil.[m
[32m+[m[32m    dasm_put(Dst, 13030, Dt7(->pc), PC2PROTO(k));[m
[32m+[m[32m#line 4987 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_RET) {[m
[32m+[m[32m      //|  mov dword [KBASE-4], LJ_TNIL	// Note: relies on shifted base.[m
[32m+[m[32m      //|  add KBASE, 8[m
[32m+[m[32m      dasm_put(Dst, 13078, LJ_TNIL);[m
[32m+[m[32m#line 4990 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  mov dword [BASE+RD*8-12], LJ_TNIL[m
[32m+[m[32m      dasm_put(Dst, 13089, LJ_TNIL);[m
[32m+[m[32m#line 4992 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  add RD, 1[m
[32m+[m[32m    //|  jmp <5[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|7:  // Non-standard return case.[m
[32m+[m[32m    //|  lea RB, [PC-FRAME_VARG][m
[32m+[m[32m    //|  test RB, FRAME_TYPEP[m
[32m+[m[32m    //|  jnz ->vm_return[m
[32m+[m[32m    //|  // Return from vararg function: relocate BASE down and RA up.[m
[32m+[m[32m    //|  sub BASE, RB[m
[32m+[m[32m    dasm_put(Dst, 13096, -FRAME_VARG, FRAME_TYPEP);[m
[32m+[m[32m#line 5002 "vm_x86.dasc"[m
[32m+[m[32m    if (op != BC_RET0) {[m
[32m+[m[32m      //|  add RA, RB[m
[32m+[m[32m      dasm_put(Dst, 13120);[m
[32m+[m[32m#line 5004 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 9182);[m
[32m+[m[32m#line 5006 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Loops and branches ------------------------------------------------ */[m
[32m+[m
[32m+[m[32m  //|.define FOR_IDX,  [RA];    .define FOR_TIDX,  dword [RA+4][m
[32m+[m[32m  //|.define FOR_STOP, [RA+8];  .define FOR_TSTOP, dword [RA+12][m
[32m+[m[32m  //|.define FOR_STEP, [RA+16]; .define FOR_TSTEP, dword [RA+20][m
[32m+[m[32m  //|.define FOR_EXT,  [RA+24]; .define FOR_TEXT,  dword [RA+28][m
[32m+[m
[32m+[m[32m  case BC_FORL:[m
[32m+[m[32m    //|.if JIT[m
[32m+[m[32m    //|  hotloop RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //| // Fall through. Assumes BC_IFORL follows and ins_AJ is a no-op.[m
[32m+[m[32m    dasm_put(Dst, 13124, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);[m
[32m+[m[32m#line 5020 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_JFORI:[m
[32m+[m[32m  case BC_JFORL:[m
[32m+[m[32m#if !LJ_HASJIT[m
[32m+[m[32m    break;[m
[32m+[m[32m#endif[m
[32m+[m[32m  case BC_FORI:[m
[32m+[m[32m  case BC_IFORL:[m
[32m+[m[32m    vk = (op == BC_IFORL || op == BC_JFORL);[m
[32m+[m[32m    //|  ins_AJ	// RA = base, RD = target (after end of loop or start of loop)[m
[32m+[m[32m    //|  lea RA, [BASE+RA*8][m
[32m+[m[32m    dasm_put(Dst, 13145);[m
[32m+[m[32m#line 5032 "vm_x86.dasc"[m
[32m+[m[32m    if (LJ_DUALNUM) {[m
[32m+[m[32m      //|  cmp FOR_TIDX, LJ_TISNUM; jne >9[m
[32m+[m[32m      dasm_put(Dst, 13149, LJ_TISNUM);[m
[32m+[m[32m#line 5034 "vm_x86.dasc"[m
[32m+[m[32m      if (!vk) {[m
[32m+[m	[32m//|  cmp FOR_TSTOP, LJ_TISNUM; jne ->vmeta_for[m
[32m+[m	[32m//|  cmp FOR_TSTEP, LJ_TISNUM; jne ->vmeta_for[m
[32m+[m	[32m//|  mov RB, dword FOR_IDX[m
[32m+[m	[32m//|  cmp dword FOR_STEP, 0; jl >5[m
[32m+[m	[32mdasm_put(Dst, 13159, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 5039 "vm_x86.dasc"[m
[32m+[m[32m      } else {[m
[32m+[m[32m#ifdef LUA_USE_ASSERT[m
[32m+[m	[32m//|  cmp FOR_TSTOP, LJ_TISNUM; jne ->assert_bad_for_arg_type[m
[32m+[m	[32m//|  cmp FOR_TSTEP, LJ_TISNUM; jne ->assert_bad_for_arg_type[m
[32m+[m	[32mdasm_put(Dst, 13188, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 5043 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m	[32m//|  mov RB, dword FOR_STEP[m
[32m+[m	[32m//|  test RB, RB; js >5[m
[32m+[m	[32m//|  add RB, dword FOR_IDX; jo >1[m
[32m+[m	[32m//|  mov dword FOR_IDX, RB[m
[32m+[m	[32mdasm_put(Dst, 13207);[m
[32m+[m[32m#line 5048 "vm_x86.dasc"[m
[32m+[m[32m      }[m
[32m+[m[32m      //|  cmp RB, dword FOR_STOP[m
[32m+[m[32m      //|  mov FOR_TEXT, LJ_TISNUM[m
[32m+[m[32m      //|  mov dword FOR_EXT, RB[m
[32m+[m[32m      dasm_put(Dst, 13226, LJ_TISNUM);[m
[32m+[m[32m#line 5052 "vm_x86.dasc"[m
[32m+[m[32m      if (op == BC_FORI) {[m
[32m+[m	[32m//|  jle >7[m
[32m+[m	[32m//|1:[m
[32m+[m	[32m//|6:[m
[32m+[m	[32m//|  branchPC RD[m
[32m+[m	[32mdasm_put(Dst, 13237, -BCBIAS_J*4);[m
[32m+[m[32m#line 5057 "vm_x86.dasc"[m
[32m+[m[32m      } else if (op == BC_JFORI) {[m
[32m+[m	[32m//|  branchPC RD[m
[32m+[m	[32m//|  movzx RD, PC_RD[m
[32m+[m	[32m//|  jle =>BC_JLOOP[m
[32m+[m	[32m//|1:[m
[32m+[m	[32m//|6:[m
[32m+[m	[32mdasm_put(Dst, 13251, -BCBIAS_J*4, BC_JLOOP);[m
[32m+[m[32m#line 5063 "vm_x86.dasc"[m
[32m+[m[32m      } else if (op == BC_IFORL) {[m
[32m+[m	[32m//|  jg >7[m
[32m+[m	[32m//|6:[m
[32m+[m	[32m//|  branchPC RD[m
[32m+[m	[32m//|1:[m
[32m+[m	[32mdasm_put(Dst, 13269, -BCBIAS_J*4);[m
[32m+[m[32m#line 5068 "vm_x86.dasc"[m
[32m+[m[32m      } else {[m
[32m+[m	[32m//|  jle =>BC_JLOOP[m
[32m+[m	[32m//|1:[m
[32m+[m	[32m//|6:[m
[32m+[m	[32mdasm_put(Dst, 13261, BC_JLOOP);[m
[32m+[m[32m#line 5072 "vm_x86.dasc"[m
[32m+[m[32m      }[m
[32m+[m[32m      //|7:[m
[32m+[m[32m      //|  ins_next[m
[32m+[m[32m      //|[m
[32m+[m[32m      //|5:  // Invert check for negative step.[m
[32m+[m[32m      dasm_put(Dst, 13283);[m
[32m+[m[32m#line 5077 "vm_x86.dasc"[m
[32m+[m[32m      if (vk) {[m
[32m+[m	[32m//|  add RB, dword FOR_IDX; jo <1[m
[32m+[m	[32m//|  mov dword FOR_IDX, RB[m
[32m+[m	[32mdasm_put(Dst, 13308);[m
[32m+[m[32m#line 5080 "vm_x86.dasc"[m
[32m+[m[32m      }[m
[32m+[m[32m      //|  cmp RB, dword FOR_STOP[m
[32m+[m[32m      //|  mov FOR_TEXT, LJ_TISNUM[m
[32m+[m[32m      //|  mov dword FOR_EXT, RB[m
[32m+[m[32m      dasm_put(Dst, 13226, LJ_TISNUM);[m
[32m+[m[32m#line 5084 "vm_x86.dasc"[m
[32m+[m[32m      if (op == BC_FORI) {[m
[32m+[m	[32m//|  jge <7[m
[32m+[m	[32mdasm_put(Dst, 13317);[m
[32m+[m[32m#line 5086 "vm_x86.dasc"[m
[32m+[m[32m      } else if (op == BC_JFORI) {[m
[32m+[m	[32m//|  branchPC RD[m
[32m+[m	[32m//|  movzx RD, PC_RD[m
[32m+[m	[32m//|  jge =>BC_JLOOP[m
[32m+[m	[32mdasm_put(Dst, 13322, -BCBIAS_J*4, BC_JLOOP);[m
[32m+[m[32m#line 5090 "vm_x86.dasc"[m
[32m+[m[32m      } else if (op == BC_IFORL) {[m
[32m+[m	[32m//|  jl <7[m
[32m+[m	[32mdasm_put(Dst, 13336);[m
[32m+[m[32m#line 5092 "vm_x86.dasc"[m
[32m+[m[32m      } else {[m
[32m+[m	[32m//|  jge =>BC_JLOOP[m
[32m+[m	[32mdasm_put(Dst, 13332, BC_JLOOP);[m
[32m+[m[32m#line 5094 "vm_x86.dasc"[m
[32m+[m[32m      }[m
[32m+[m[32m      //|  jmp <6[m
[32m+[m[32m      //|9:  // Fallback to FP variant.[m
[32m+[m[32m      dasm_put(Dst, 13341);[m
[32m+[m[32m#line 5097 "vm_x86.dasc"[m
[32m+[m[32m    } else if (!vk) {[m
[32m+[m[32m      //|  cmp FOR_TIDX, LJ_TISNUM[m
[32m+[m[32m      dasm_put(Dst, 13348, LJ_TISNUM);[m
[32m+[m[32m#line 5099 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    if (!vk) {[m
[32m+[m[32m      //|  jae ->vmeta_for[m
[32m+[m[32m      //|  cmp FOR_TSTOP, LJ_TISNUM; jae ->vmeta_for[m
[32m+[m[32m      dasm_put(Dst, 13354, LJ_TISNUM);[m
[32m+[m[32m#line 5103 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m#ifdef LUA_USE_ASSERT[m
[32m+[m[32m      //|  cmp FOR_TSTOP, LJ_TISNUM; jae ->assert_bad_for_arg_type[m
[32m+[m[32m      //|  cmp FOR_TSTEP, LJ_TISNUM; jae ->assert_bad_for_arg_type[m
[32m+[m[32m      dasm_put(Dst, 13368, LJ_TISNUM, LJ_TISNUM);[m
[32m+[m[32m#line 5107 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  mov RB, FOR_TSTEP		// Load type/hiword of for step.[m
[32m+[m[32m    dasm_put(Dst, 13387);[m
[32m+[m[32m#line 5110 "vm_x86.dasc"[m
[32m+[m[32m    if (!vk) {[m
[32m+[m[32m      //|  cmp RB, LJ_TISNUM; jae ->vmeta_for[m
[32m+[m[32m      dasm_put(Dst, 13391, LJ_TISNUM);[m
[32m+[m[32m#line 5112 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  movsd xmm0, qword FOR_IDX[m
[32m+[m[32m    //|  movsd xmm1, qword FOR_STOP[m
[32m+[m[32m    dasm_put(Dst, 13400);[m
[32m+[m[32m#line 5115 "vm_x86.dasc"[m
[32m+[m[32m    if (vk) {[m
[32m+[m[32m      //|  addsd xmm0, qword FOR_STEP[m
[32m+[m[32m      //|  movsd qword FOR_IDX, xmm0[m
[32m+[m[32m      //|  test RB, RB; js >3[m
[32m+[m[32m      dasm_put(Dst, 13412);[m
[32m+[m[32m#line 5119 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  jl >3[m
[32m+[m[32m      dasm_put(Dst, 13431);[m
[32m+[m[32m#line 5121 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  ucomisd xmm1, xmm0[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  movsd qword FOR_EXT, xmm0[m
[32m+[m[32m    dasm_put(Dst, 13436);[m
[32m+[m[32m#line 5125 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_FORI) {[m
[32m+[m[32m      //|.if DUALNUM[m
[32m+[m[32m      //|  jnb <7[m
[32m+[m[32m      //|.else[m
[32m+[m[32m      //|  jnb >2[m
[32m+[m[32m      //|  branchPC RD[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      dasm_put(Dst, 13449, -BCBIAS_J*4);[m
[32m+[m[32m#line 5132 "vm_x86.dasc"[m
[32m+[m[32m    } else if (op == BC_JFORI) {[m
[32m+[m[32m      //|  branchPC RD[m
[32m+[m[32m      //|  movzx RD, PC_RD[m
[32m+[m[32m      //|  jnb =>BC_JLOOP[m
[32m+[m[32m      dasm_put(Dst, 13459, -BCBIAS_J*4, BC_JLOOP);[m
[32m+[m[32m#line 5136 "vm_x86.dasc"[m
[32m+[m[32m    } else if (op == BC_IFORL) {[m
[32m+[m[32m      //|.if DUALNUM[m
[32m+[m[32m      //|  jb <7[m
[32m+[m[32m      //|.else[m
[32m+[m[32m      //|  jb >2[m
[32m+[m[32m      //|  branchPC RD[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      dasm_put(Dst, 13473, -BCBIAS_J*4);[m
[32m+[m[32m#line 5143 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  jnb =>BC_JLOOP[m
[32m+[m[32m      dasm_put(Dst, 13469, BC_JLOOP);[m
[32m+[m[32m#line 5145 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|.if DUALNUM[m
[32m+[m[32m    //|  jmp <6[m
[32m+[m[32m    //|.else[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|3:  // Invert comparison if step is negative.[m
[32m+[m[32m    //|  ucomisd xmm0, xmm1[m
[32m+[m[32m    //|  jmp <1[m
[32m+[m[32m    dasm_put(Dst, 13483);[m
[32m+[m[32m#line 5156 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_ITERL:[m
[32m+[m[32m    //|.if JIT[m
[32m+[m[32m    //|  hotloop RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //| // Fall through. Assumes BC_IITERL follows and ins_AJ is a no-op.[m
[32m+[m[32m    dasm_put(Dst, 13124, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);[m
[32m+[m[32m#line 5163 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_JITERL:[m
[32m+[m[32m#if !LJ_HASJIT[m
[32m+[m[32m    break;[m
[32m+[m[32m#endif[m
[32m+[m[32m  case BC_IITERL:[m
[32m+[m[32m    //|  ins_AJ	// RA = base, RD = target[m
[32m+[m[32m    //|  lea RA, [BASE+RA*8][m
[32m+[m[32m    //|  mov RB, [RA+4][m
[32m+[m[32m    //|  cmp RB, LJ_TNIL; je >1		// Stop if iterator returned nil.[m
[32m+[m[32m    dasm_put(Dst, 13516, LJ_TNIL);[m
[32m+[m[32m#line 5174 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_JITERL) {[m
[32m+[m[32m      //|  mov [RA-4], RB[m
[32m+[m[32m      //|  mov RB, [RA][m
[32m+[m[32m      //|  mov [RA-8], RB[m
[32m+[m[32m      //|  jmp =>BC_JLOOP[m
[32m+[m[32m      dasm_put(Dst, 13531, BC_JLOOP);[m
[32m+[m[32m#line 5179 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  branchPC RD			// Otherwise save control var + branch.[m
[32m+[m[32m      //|  mov RD, [RA][m
[32m+[m[32m      //|  mov [RA-4], RB[m
[32m+[m[32m      //|  mov [RA-8], RD[m
[32m+[m[32m      dasm_put(Dst, 13545, -BCBIAS_J*4);[m
[32m+[m[32m#line 5184 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|1:[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 8468);[m
[32m+[m[32m#line 5187 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_LOOP:[m
[32m+[m[32m    //|  ins_A	// RA = base, RD = target (loop extent)[m
[32m+[m[32m    //|  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[32m+[m[32m    //|  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[32m+[m[32m    //|.if JIT[m
[32m+[m[32m    //|  hotloop RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //| // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op.[m
[32m+[m[32m    dasm_put(Dst, 13124, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);[m
[32m+[m[32m#line 5197 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_ILOOP:[m
[32m+[m[32m    //|  ins_A	// RA = base, RD = target (loop extent)[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 8470);[m
[32m+[m[32m#line 5202 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_JLOOP:[m
[32m+[m[32m    //|.if JIT[m
[32m+[m[32m    //|  ins_AD	// RA = base (ignored), RD = traceno[m
[32m+[m[32m#ifdef LUA_USE_TRACE_LOGS[m
[32m+[m[32m    //|.if X64[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov L:RB->base, BASE  // Save BASE[m
[32m+[m[32m    //|  mov TMP1, RD     // Save RD[m
[32m+[m[32m    //|  mov CARG3d, PC  // CARG3d == BASE[m
[32m+[m[32m    //|  mov FCARG2, RD[m
[32m+[m[32m    //|  mov FCARG1, RB[m
[32m+[m[32m    //|  call extern lj_log_trace_entry@8[m
[32m+[m[32m    //|  mov RD, TMP1[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    dasm_put(Dst, 13561, Dt1(->base), Dt1(->base));[m
[32m+[m[32m#line 5219 "vm_x86.dasc"[m
[32m+[m[32m#endif[m
[32m+[m[32m    //|  mov RA, [DISPATCH+DISPATCH_J(trace)][m
[32m+[m[32m    //|  mov TRACE:RD, [RA+RD*4][m
[32m+[m[32m    //|  mov RDa, TRACE:RD->mcode[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  mov [DISPATCH+DISPATCH_GL(jit_base)], BASE[m
[32m+[m[32m    //|  mov [DISPATCH+DISPATCH_GL(tmpbuf.L)], L:RB[m
[32m+[m[32m    //|  // Save additional callee-save registers only used in compiled code.[m
[32m+[m[32m    //|.if X64WIN[m
[32m+[m[32m    //|  mov TMPQ, r12[m
[32m+[m[32m    //|  mov TMPa, r13[m
[32m+[m[32m    //|  mov CSAVE_4, r14[m
[32m+[m[32m    //|  mov CSAVE_3, r15[m
[32m+[m[32m    //|  mov RAa, rsp[m
[32m+[m[32m    //|  sub rsp, 9*16+4*8[m
[32m+[m[32m    //|  movdqa [RAa], xmm6[m
[32m+[m[32m    //|  movdqa [RAa-1*16], xmm7[m
[32m+[m[32m    //|  movdqa [RAa-2*16], xmm8[m
[32m+[m[32m    //|  movdqa [RAa-3*16], xmm9[m
[32m+[m[32m    //|  movdqa [RAa-4*16], xmm10[m
[32m+[m[32m    //|  movdqa [RAa-5*16], xmm11[m
[32m+[m[32m    //|  movdqa [RAa-6*16], xmm12[m
[32m+[m[32m    //|  movdqa [RAa-7*16], xmm13[m
[32m+[m[32m    //|  movdqa [RAa-8*16], xmm14[m
[32m+[m[32m    //|  movdqa [RAa-9*16], xmm15[m
[32m+[m[32m    //|.elif X64[m
[32m+[m[32m    //|  mov TMPQ, r12[m
[32m+[m[32m    //|  mov TMPa, r13[m
[32m+[m[32m    //|  sub rsp, 16[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    //|  jmp RDa[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    dasm_put(Dst, 13589, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(tmpbuf.L));[m
[32m+[m[32m#line 5251 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_JMP:[m
[32m+[m[32m    //|  ins_AJ	// RA = unused, RD = target[m
[32m+[m[32m    //|  branchPC RD[m
[32m+[m[32m    //|  ins_next[m
[32m+[m[32m    dasm_put(Dst, 13630, -BCBIAS_J*4);[m
[32m+[m[32m#line 5257 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* -- Function headers -------------------------------------------------- */[m
[32m+[m
[32m+[m[32m   /*[m
[32m+[m[32m   ** Reminder: A function may be called with func/args above L->maxstack,[m
[32m+[m[32m   ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot,[m
[32m+[m[32m   ** too. This means all FUNC* ops (including fast functions) must check[m
[32m+[m[32m   ** for stack overflow _before_ adding more slots![m
[32m+[m[32m   */[m
[32m+[m
[32m+[m[32m  case BC_FUNCF:[m
[32m+[m[32m    //|.if JIT[m
[32m+[m[32m    //|  hotcall RB[m
[32m+[m[32m    //|.endif[m
[32m+[m[32m    dasm_put(Dst, 13656, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);[m
[32m+[m[32m#line 5272 "vm_x86.dasc"[m
[32m+[m[32m  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[32m+[m[32m    //| // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op.[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_JFUNCF:[m
[32m+[m[32m#if !LJ_HASJIT[m
[32m+[m[32m    break;[m
[32m+[m[32m#endif[m
[32m+[m[32m  case BC_IFUNCF:[m
[32m+[m[32m    //|  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[32m+[m[32m    //|  mov KBASE, [PC-4+PC2PROTO(k)][m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  lea RA, [BASE+RA*8]		// Top of frame.[m
[32m+[m[32m    //|  cmp RA, L:RB->maxstack[m
[32m+[m[32m    //|  ja ->vm_growstack_f[m
[32m+[m[32m    //|  movzx RA, byte [PC-4+PC2PROTO(numparams)][m
[32m+[m[32m    //|  cmp NARGS:RD, RA			// Check for missing parameters.[m
[32m+[m[32m    //|  jbe >3[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    dasm_put(Dst, 13677, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams));[m
[32m+[m[32m#line 5291 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_JFUNCF) {[m
[32m+[m[32m      //|  movzx RD, PC_RD[m
[32m+[m[32m      //|  jmp =>BC_JLOOP[m
[32m+[m[32m      dasm_put(Dst, 13708, BC_JLOOP);[m
[32m+[m[32m#line 5294 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  ins_next[m
[32m+[m[32m      dasm_put(Dst, 8470);[m
[32m+[m[32m#line 5296 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|3:  // Clear missing parameters.[m
[32m+[m[32m    //|  mov dword [BASE+NARGS:RD*8-4], LJ_TNIL[m
[32m+[m[32m    //|  add NARGS:RD, 1[m
[32m+[m[32m    //|  cmp NARGS:RD, RA[m
[32m+[m[32m    //|  jbe <3[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    dasm_put(Dst, 13717, LJ_TNIL);[m
[32m+[m[32m#line 5304 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_JFUNCV:[m
[32m+[m[32m#if !LJ_HASJIT[m
[32m+[m[32m    break;[m
[32m+[m[32m#endif[m
[32m+[m[32m    //| int3  // NYI: compiled vararg functions[m
[32m+[m[32m    dasm_put(Dst, 8026);[m
[32m+[m[32m#line 5311 "vm_x86.dasc"[m
[32m+[m[32m    break;  /* NYI: compiled vararg functions. */[m
[32m+[m
[32m+[m[32m  case BC_IFUNCV:[m
[32m+[m[32m    //|  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[32m+[m[32m    //|  lea RB, [NARGS:RD*8+FRAME_VARG][m
[32m+[m[32m    //|  lea RD, [BASE+NARGS:RD*8][m
[32m+[m[32m    //|  mov LFUNC:KBASE, [BASE-8][m
[32m+[m[32m    //|  mov [RD-4], RB			// Store delta + FRAME_VARG.[m
[32m+[m[32m    //|  mov [RD-8], LFUNC:KBASE		// Store copy of LFUNC.[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  lea RA, [RD+RA*8][m
[32m+[m[32m    //|  cmp RA, L:RB->maxstack[m
[32m+[m[32m    //|  ja ->vm_growstack_v		// Need to grow stack.[m
[32m+[m[32m    //|  mov RA, BASE[m
[32m+[m[32m    //|  mov BASE, RD[m
[32m+[m[32m    //|  movzx RB, byte [PC-4+PC2PROTO(numparams)][m
[32m+[m[32m    //|  test RB, RB[m
[32m+[m[32m    //|  jz >2[m
[32m+[m[32m    //|1:  // Copy fixarg slots up to new frame.[m
[32m+[m[32m    //|  add RA, 8[m
[32m+[m[32m    //|  cmp RA, BASE[m
[32m+[m[32m    //|  jnb >3				// Less args than parameters?[m
[32m+[m[32m    //|  mov KBASE, [RA-8][m
[32m+[m[32m    //|  mov [RD], KBASE[m
[32m+[m[32m    //|  mov KBASE, [RA-4][m
[32m+[m[32m    //|  mov [RD+4], KBASE[m
[32m+[m[32m    //|  add RD, 8[m
[32m+[m[32m    //|  mov dword [RA-4], LJ_TNIL	// Clear old fixarg slot (help the GC).[m
[32m+[m[32m    //|  sub RB, 1[m
[32m+[m[32m    //|  jnz <1[m
[32m+[m[32m    //|2:[m
[32m+[m[32m    dasm_put(Dst, 13739, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL);[m
[32m+[m[32m#line 5342 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_JFUNCV) {[m
[32m+[m[32m      //|  movzx RD, PC_RD[m
[32m+[m[32m      //|  jmp =>BC_JLOOP[m
[32m+[m[32m      dasm_put(Dst, 13708, BC_JLOOP);[m
[32m+[m[32m#line 5345 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  mov KBASE, [PC-4+PC2PROTO(k)][m
[32m+[m[32m      //|  ins_next[m
[32m+[m[32m      dasm_put(Dst, 13836, -4+PC2PROTO(k));[m
[32m+[m[32m#line 5348 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|[m
[32m+[m[32m    //|3:  // Clear missing parameters.[m
[32m+[m[32m    //|  mov dword [RD+4], LJ_TNIL[m
[32m+[m[32m    //|  add RD, 8[m
[32m+[m[32m    //|  sub RB, 1[m
[32m+[m[32m    //|  jnz <3[m
[32m+[m[32m    //|  jmp <2[m
[32m+[m[32m    dasm_put(Dst, 13861, LJ_TNIL);[m
[32m+[m[32m#line 5356 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  case BC_FUNCC:[m
[32m+[m[32m  case BC_FUNCCW:[m
[32m+[m[32m    //|  ins_AD  // BASE = new base, RA = ins RA|RD (unused), RD = nargs+1[m
[32m+[m[32m    //|  mov CFUNC:RB, [BASE-8][m
[32m+[m[32m    //|  mov KBASEa, CFUNC:RB->f[m
[32m+[m[32m    //|  mov L:RB, SAVE_L[m
[32m+[m[32m    //|  lea RD, [BASE+NARGS:RD*8-8][m
[32m+[m[32m    //|  mov L:RB->base, BASE[m
[32m+[m[32m    //|  lea RA, [RD+8*LUA_MINSTACK][m
[32m+[m[32m    //|  cmp RA, L:RB->maxstack[m
[32m+[m[32m    //|  mov L:RB->top, RD[m
[32m+[m[32m    dasm_put(Dst, 13883, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top));[m
[32m+[m[32m#line 5369 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_FUNCC) {[m
[32m+[m[32m      //|.if X64[m
[32m+[m[32m      //|  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[32m+[m[32m      //|.else[m
[32m+[m[32m      //|  mov ARG1, L:RB[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      dasm_put(Dst, 13913);[m
[32m+[m[32m#line 5375 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|.if X64[m
[32m+[m[32m      //|  mov CARG2, KBASEa[m
[32m+[m[32m      //|  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[32m+[m[32m      //|.else[m
[32m+[m[32m      //|  mov ARG2, KBASEa[m
[32m+[m[32m      //|  mov ARG1, L:RB[m
[32m+[m[32m      //|.endif[m
[32m+[m[32m      dasm_put(Dst, 13917);[m
[32m+[m[32m#line 5383 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  ja ->vm_growstack_c		// Need to grow stack.[m
[32m+[m[32m    //|  set_vmstate C[m
[32m+[m[32m    dasm_put(Dst, 13925, DISPATCH_GL(vmstate), ~LJ_VMST_C);[m
[32m+[m[32m#line 5386 "vm_x86.dasc"[m
[32m+[m[32m    if (op == BC_FUNCC) {[m
[32m+[m[32m      //|  call KBASEa			// (lua_State *L)[m
[32m+[m[32m      dasm_put(Dst, 13935);[m
[32m+[m[32m#line 5388 "vm_x86.dasc"[m
[32m+[m[32m    } else {[m
[32m+[m[32m      //|  // (lua_State *L, lua_CFunction f)[m
[32m+[m[32m      //|  call aword [DISPATCH+DISPATCH_GL(wrapf)][m
[32m+[m[32m      dasm_put(Dst, 13940, DISPATCH_GL(wrapf));[m
[32m+[m[32m#line 5391 "vm_x86.dasc"[m
[32m+[m[32m    }[m
[32m+[m[32m    //|  // nresults returned in eax (RD).[m
[32m+[m[32m    //|  mov BASE, L:RB->base[m
[32m+[m[32m    //|  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[32m+[m[32m    //|  set_vmstate INTERP[m
[32m+[m[32m    //|  lea RA, [BASE+RD*8][m
[32m+[m[32m    //|  neg RA[m
[32m+[m[32m    //|  add RA, L:RB->top		// RA = (L->top-(L->base+nresults))*8[m
[32m+[m[32m    //|  mov PC, [BASE-4]			// Fetch PC of caller.[m
[32m+[m[32m    //|  jmp ->vm_returnc[m
[32m+[m[32m    dasm_put(Dst, 13946, Dt1(->base), DISPATCH_GL(cur_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->top));[m
[32m+[m[32m#line 5401 "vm_x86.dasc"[m
[32m+[m[32m    break;[m
[32m+[m
[32m+[m[32m  /* ---------------------------------------------------------------------- */[m
[32m+[m
[32m+[m[32m  default:[m
[32m+[m[32m    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[32m+[m[32m    exit(2);[m
[32m+[m[32m    break;[m
[32m+[m[32m  }[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32mstatic int build_backend(BuildCtx *ctx)[m
[32m+[m[32m{[m
[32m+[m[32m  int op;[m
[32m+[m[32m  dasm_growpc(Dst, BC__MAX);[m
[32m+[m[32m  build_subroutines(ctx);[m
[32m+[m[32m  //|.code_op[m
[32m+[m[32m  dasm_put(Dst, 13976);[m
[32m+[m[32m#line 5418 "vm_x86.dasc"[m
[32m+[m[32m  for (op = 0; op < BC__MAX; op++)[m
[32m+[m[32m    build_ins(ctx, (BCOp)op, op);[m
[32m+[m[32m  return BC__MAX;[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32m/* Emit pseudo frame-info for all assembler functions. */[m
[32m+[m[32mstatic void emit_asm_debug(BuildCtx *ctx)[m
[32m+[m[32m{[m
[32m+[m[32m  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[32m+[m[32m#if LJ_64[m
[32m+[m[32m#define SZPTR	"8"[m
[32m+[m[32m#define BSZPTR	"3"[m
[32m+[m[32m#define REG_SP	"0x7"[m
[32m+[m[32m#define REG_RA	"0x10"[m
[32m+[m[32m#else[m
[32m+[m[32m#define SZPTR	"4"[m
[32m+[m[32m#define BSZPTR	"2"[m
[32m+[m[32m#define REG_SP	"0x4"[m
[32m+[m[32m#define REG_RA	"0x8"[m
[32m+[m[32m#endif[m
[32m+[m[32m  switch (ctx->mode) {[m
[32m+[m[32m  case BUILD_elfasm:[m
[32m+[m[32m    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m	[32m".Lframe0:\n"[m
[32m+[m	[32m"\t.long .LECIE0-.LSCIE0\n"[m
[32m+[m	[32m".LSCIE0:\n"[m
[32m+[m	[32m"\t.long 0xffffffff\n"[m
[32m+[m	[32m"\t.byte 0x1\n"[m
[32m+[m	[32m"\t.string \"\"\n"[m
[32m+[m	[32m"\t.uleb128 0x1\n"[m
[32m+[m	[32m"\t.sleb128 -" SZPTR "\n"[m
[32m+[m	[32m"\t.byte " REG_RA "\n"[m
[32m+[m	[32m"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[32m+[m	[32m"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[32m+[m	[32m"\t.align " SZPTR "\n"[m
[32m+[m	[32m".LECIE0:\n\n");[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m	[32m".LSFDE0:\n"[m
[32m+[m	[32m"\t.long .LEFDE0-.LASFDE0\n"[m
[32m+[m	[32m".LASFDE0:\n"[m
[32m+[m	[32m"\t.long .Lframe0\n"[m
[32m+[m[32m#if LJ_64[m
[32m+[m	[32m"\t.quad .Lbegin\n"[m
[32m+[m	[32m"\t.quad %d\n"[m
[32m+[m	[32m"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[32m+[m	[32m"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[32m+[m	[32m"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[32m+[m	[32m"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[32m+[m	[32m"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[32m+[m[32m#if LJ_NO_UNWIND[m
[32m+[m	[32m"\t.byte 0x8d\n\t.uleb128 0x6\n"	/* offset r13 */[m
[32m+[m	[32m"\t.byte 0x8c\n\t.uleb128 0x7\n"	/* offset r12 */[m
[32m+[m[32m#endif[m
[32m+[m[32m#else[m
[32m+[m	[32m"\t.long .Lbegin\n"[m
[32m+[m	[32m"\t.long %d\n"[m
[32m+[m	[32m"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[32m+[m	[32m"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[32m+[m	[32m"\t.byte 0x87\n\t.uleb128 0x3\n"	/* offset edi */[m
[32m+[m	[32m"\t.byte 0x86\n\t.uleb128 0x4\n"	/* offset esi */[m
[32m+[m	[32m"\t.byte 0x83\n\t.uleb128 0x5\n"	/* offset ebx */[m
[32m+[m[32m#endif[m
[32m+[m	[32m"\t.align " SZPTR "\n"[m
[32m+[m	[32m".LEFDE0:\n\n", fcofs, CFRAME_SIZE);[m
[32m+[m[32m#if LJ_HASFFI[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m	[32m".LSFDE1:\n"[m
[32m+[m	[32m"\t.long .LEFDE1-.LASFDE1\n"[m
[32m+[m	[32m".LASFDE1:\n"[m
[32m+[m	[32m"\t.long .Lframe0\n"[m
[32m+[m[32m#if LJ_64[m
[32m+[m	[32m"\t.quad lj_vm_ffi_call\n"[m
[32m+[m	[32m"\t.quad %d\n"[m
[32m+[m	[32m"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[32m+[m	[32m"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[32m+[m	[32m"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[32m+[m	[32m"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[32m+[m[32m#else[m
[32m+[m	[32m"\t.long lj_vm_ffi_call\n"[m
[32m+[m	[32m"\t.long %d\n"[m
[32m+[m	[32m"\t.byte 0xe\n\t.uleb128 8\n"		/* def_cfa_offset */[m
[32m+[m	[32m"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[32m+[m	[32m"\t.byte 0xd\n\t.uleb128 0x5\n"		/* def_cfa_register ebp */[m
[32m+[m	[32m"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset ebx */[m
[32m+[m[32m#endif[m
[32m+[m	[32m"\t.align " SZPTR "\n"[m
[32m+[m	[32m".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[32m+[m[32m#endif[m
[32m+[m[32m#if !LJ_NO_UNWIND[m
[32m+[m[32m#if (defined(__sun__) && defined(__svr4__))[m
[32m+[m[32m#if LJ_64[m
[32m+[m[32m    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n");[m
[32m+[m[32m#else[m
[32m+[m[32m    fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");[m
[32m+[m[32m#endif[m
[32m+[m[32m#else[m
[32m+[m[32m    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");[m
[32m+[m[32m#endif[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m	[32m".Lframe1:\n"[m
[32m+[m	[32m"\t.long .LECIE1-.LSCIE1\n"[m
[32m+[m	[32m".LSCIE1:\n"[m
[32m+[m	[32m"\t.long 0\n"[m
[32m+[m	[32m"\t.byte 0x1\n"[m
[32m+[m	[32m"\t.string \"zPR\"\n"[m
[32m+[m	[32m"\t.uleb128 0x1\n"[m
[32m+[m	[32m"\t.sleb128 -" SZPTR "\n"[m
[32m+[m	[32m"\t.byte " REG_RA "\n"[m
[32m+[m	[32m"\t.uleb128 6\n"			/* augmentation length */[m
[32m+[m	[32m"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[32m+[m	[32m"\t.long lj_err_unwind_dwarf-.\n"[m
[32m+[m	[32m"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[32m+[m	[32m"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[32m+[m	[32m"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[32m+[m	[32m"\t.align " SZPTR "\n"[m
[32m+[m	[32m".LECIE1:\n\n");[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m	[32m".LSFDE2:\n"[m
[32m+[m	[32m"\t.long .LEFDE2-.LASFDE2\n"[m
[32m+[m	[32m".LASFDE2:\n"[m
[32m+[m	[32m"\t.long .LASFDE2-.Lframe1\n"[m
[32m+[m	[32m"\t.long .Lbegin-.\n"[m
[32m+[m	[32m"\t.long %d\n"[m
[32m+[m	[32m"\t.uleb128 0\n"			/* augmentation length */[m
[32m+[m	[32m"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[32m+[m[32m#if LJ_64[m
[32m+[m	[32m"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[32m+[m	[32m"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[32m+[m	[32m"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[32m+[m	[32m"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[32m+[m[32m#else[m
[32m+[m	[32m"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[32m+[m	[32m"\t.byte 0x87\n\t.uleb128 0x3\n"	/* offset edi */[m
[32m+[m	[32m"\t.byte 0x86\n\t.uleb128 0x4\n"	/* offset esi */[m
[32m+[m	[32m"\t.byte 0x83\n\t.uleb128 0x5\n"	/* offset ebx */[m
[32m+[m[32m#endif[m
[32m+[m	[32m"\t.align " SZPTR "\n"[m
[32m+[m	[32m".LEFDE2:\n\n", fcofs, CFRAME_SIZE);[m
[32m+[m[32m#if LJ_HASFFI[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m	[32m".Lframe2:\n"[m
[32m+[m	[32m"\t.long .LECIE2-.LSCIE2\n"[m
[32m+[m	[32m".LSCIE2:\n"[m
[32m+[m	[32m"\t.long 0\n"[m
[32m+[m	[32m"\t.byte 0x1\n"[m
[32m+[m	[32m"\t.string \"zR\"\n"[m
[32m+[m	[32m"\t.uleb128 0x1\n"[m
[32m+[m	[32m"\t.sleb128 -" SZPTR "\n"[m
[32m+[m	[32m"\t.byte " REG_RA "\n"[m
[32m+[m	[32m"\t.uleb128 1\n"			/* augmentation length */[m
[32m+[m	[32m"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[32m+[m	[32m"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[32m+[m	[32m"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[32m+[m	[32m"\t.align " SZPTR "\n"[m
[32m+[m	[32m".LECIE2:\n\n");[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m	[32m".LSFDE3:\n"[m
[32m+[m	[32m"\t.long .LEFDE3-.LASFDE3\n"[m
[32m+[m	[32m".LASFDE3:\n"[m
[32m+[m	[32m"\t.long .LASFDE3-.Lframe2\n"[m
[32m+[m	[32m"\t.long lj_vm_ffi_call-.\n"[m
[32m+[m	[32m"\t.long %d\n"[m
[32m+[m	[32m"\t.uleb128 0\n"			/* augmentation length */[m
[32m+[m[32m#if LJ_64[m
[32m+[m	[32m"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[32m+[m	[32m"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[32m+[m	[32m"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[32m+[m	[32m"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[32m+[m[32m#else[m
[32m+[m	[32m"\t.byte 0xe\n\t.uleb128 8\n"		/* def_cfa_offset */[m
[32m+[m	[32m"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[32m+[m	[32m"\t.byte 0xd\n\t.uleb128 0x5\n"		/* def_cfa_register ebp */[m
[32m+[m	[32m"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset ebx */[m
[32m+[m[32m#endif[m
[32m+[m	[32m"\t.align " SZPTR "\n"[m
[32m+[m	[32m".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[32m+[m[32m#endif[m
[32m+[m[32m#endif[m
[32m+[m[32m    break;[m
[32m+[m[32m#if !LJ_NO_UNWIND[m
[32m+[m[32m  /* Mental note: never let Apple design an assembler.[m
[32m+[m[32m  ** Or a linker. Or a plastic case. But I digress.[m
[32m+[m[32m  */[m
[32m+[m[32m  case BUILD_machasm: {[m
[32m+[m[32m#if LJ_HASFFI[m
[32m+[m[32m    int fcsize = 0;[m
[32m+[m[32m#endif[m
[32m+[m[32m    int i;[m
[32m+[m[32m    fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m	[32m"EH_frame1:\n"[m
[32m+[m	[32m"\t.set L$set$x,LECIEX-LSCIEX\n"[m
[32m+[m	[32m"\t.long L$set$x\n"[m
[32m+[m	[32m"LSCIEX:\n"[m
[32m+[m	[32m"\t.long 0\n"[m
[32m+[m	[32m"\t.byte 0x1\n"[m
[32m+[m	[32m"\t.ascii \"zPR\\0\"\n"[m
[32m+[m	[32m"\t.byte 0x1\n"[m
[32m+[m	[32m"\t.byte 128-" SZPTR "\n"[m
[32m+[m	[32m"\t.byte " REG_RA "\n"[m
[32m+[m	[32m"\t.byte 6\n"				/* augmentation length */[m
[32m+[m	[32m"\t.byte 0x9b\n"			/* indirect|pcrel|sdata4 */[m
[32m+[m[32m#if LJ_64[m
[32m+[m	[32m"\t.long _lj_err_unwind_dwarf+4@GOTPCREL\n"[m
[32m+[m	[32m"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[32m+[m	[32m"\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"[m
[32m+[m[32m#else[m
[32m+[m	[32m"\t.long L_lj_err_unwind_dwarf$non_lazy_ptr-.\n"[m
[32m+[m	[32m"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[32m+[m	[32m"\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH-O. */[m
[32m+[m[32m#endif[m
[32m+[m	[32m"\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"[m
[32m+[m	[32m"\t.align " BSZPTR "\n"[m
[32m+[m	[32m"LECIEX:\n\n");[m
[32m+[m[32m    for (i = 0; i < ctx->nsym; i++) {[m
[32m+[m[32m      const char *name = ctx->sym[i].name;[m
[32m+[m[32m      int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;[m
[32m+[m[32m      if (size == 0) continue;[m
[32m+[m[32m#if LJ_HASFFI[m
[32m+[m[32m      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }[m
[32m+[m[32m#endif[m
[32m+[m[32m      fprintf(ctx->fp,[m
[32m+[m	[32m  "%s.eh:\n"[m
[32m+[m	[32m  "LSFDE%d:\n"[m
[32m+[m	[32m  "\t.set L$set$%d,LEFDE%d-LASFDE%d\n"[m
[32m+[m	[32m  "\t.long L$set$%d\n"[m
[32m+[m	[32m  "LASFDE%d:\n"[m
[32m+[m	[32m  "\t.long LASFDE%d-EH_frame1\n"[m
[32m+[m	[32m  "\t.long %s-.\n"[m
[32m+[m	[32m  "\t.long %d\n"[m
[32m+[m	[32m  "\t.byte 0\n"				/* augmentation length */[m
[32m+[m	[32m  "\t.byte 0xe\n\t.byte %d\n"		/* def_cfa_offset */[m
[32m+[m[32m#if LJ_64[m
[32m+[m	[32m  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[32m+[m	[32m  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[32m+[m	[32m  "\t.byte 0x8f\n\t.byte 0x4\n"		/* offset r15 */[m
[32m+[m	[32m  "\t.byte 0x8e\n\t.byte 0x5\n"		/* offset r14 */[m
[32m+[m[32m#else[m
[32m+[m	[32m  "\t.byte 0x84\n\t.byte 0x2\n"		/* offset ebp (4 for MACH-O)*/[m
[32m+[m	[32m  "\t.byte 0x87\n\t.byte 0x3\n"		/* offset edi */[m
[32m+[m	[32m  "\t.byte 0x86\n\t.byte 0x4\n"		/* offset esi */[m
[32m+[m	[32m  "\t.byte 0x83\n\t.byte 0x5\n"		/* offset ebx */[m
[32m+[m[32m#endif[m
[32m+[m	[32m  "\t.align " BSZPTR "\n"[m
[32m+[m	[32m  "LEFDE%d:\n\n",[m
[32m+[m	[32m  name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);[m
[32m+[m[32m    }[m
[32m+[m[32m#if LJ_HASFFI[m
[32m+[m[32m    if (fcsize) {[m
[32m+[m[32m      fprintf(ctx->fp,[m
[32m+[m	[32m  "EH_frame2:\n"[m
[32m+[m	[32m  "\t.set L$set$y,LECIEY-LSCIEY\n"[m
[32m+[m	[32m  "\t.long L$set$y\n"[m
[32m+[m	[32m  "LSCIEY:\n"[m
[32m+[m	[32m  "\t.long 0\n"[m
[32m+[m	[32m  "\t.byte 0x1\n"[m
[32m+[m	[32m  "\t.ascii \"zR\\0\"\n"[m
[32m+[m	[32m  "\t.byte 0x1\n"[m
[32m+[m	[32m  "\t.byte 128-" SZPTR "\n"[m
[32m+[m	[32m  "\t.byte " REG_RA "\n"[m
[32m+[m	[32m  "\t.byte 1\n"				/* augmentation length */[m
[32m+[m[32m#if LJ_64[m
[32m+[m	[32m  "\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[32m+[m	[32m  "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"[m
[32m+[m[32m#else[m
[32m+[m	[32m  "\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[32m+[m	[32m  "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH. */[m
[32m+[m[32m#endif[m
[32m+[m	[32m  "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"[m
[32m+[m	[32m  "\t.align " BSZPTR "\n"[m
[32m+[m	[32m  "LECIEY:\n\n");[m
[32m+[m[32m      fprintf(ctx->fp,[m
[32m+[m	[32m  "_lj_vm_ffi_call.eh:\n"[m
[32m+[m	[32m  "LSFDEY:\n"[m
[32m+[m	[32m  "\t.set L$set$yy,LEFDEY-LASFDEY\n"[m
[32m+[m	[32m  "\t.long L$set$yy\n"[m
[32m+[m	[32m  "LASFDEY:\n"[m
[32m+[m	[32m  "\t.long LASFDEY-EH_frame2\n"[m
[32m+[m	[32m  "\t.long _lj_vm_ffi_call-.\n"[m
[32m+[m	[32m  "\t.long %d\n"[m
[32m+[m	[32m  "\t.byte 0\n"				/* augmentation length */[m
[32m+[m[32m#if LJ_64[m
[32m+[m	[32m  "\t.byte 0xe\n\t.byte 16\n"		/* def_cfa_offset */[m
[32m+[m	[32m  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[32m+[m	[32m  "\t.byte 0xd\n\t.byte 0x6\n"		/* def_cfa_register rbp */[m
[32m+[m	[32m  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[32m+[m[32m#else[m
[32m+[m	[32m  "\t.byte 0xe\n\t.byte 8\n"		/* def_cfa_offset */[m
[32m+[m	[32m  "\t.byte 0x84\n\t.byte 0x2\n"		/* offset ebp (4 for MACH-O)*/[m
[32m+[m	[32m  "\t.byte 0xd\n\t.byte 0x4\n"		/* def_cfa_register ebp */[m
[32m+[m	[32m  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset ebx */[m
[32m+[m[32m#endif[m
[32m+[m	[32m  "\t.align " BSZPTR "\n"[m
[32m+[m	[32m  "LEFDEY:\n\n", fcsize);[m
[32m+[m[32m    }[m
[32m+[m[32m#endif[m
[32m+[m[32m#if !LJ_64[m
[32m+[m[32m    fprintf(ctx->fp,[m
[32m+[m[32m      "\t.non_lazy_symbol_pointer\n"[m
[32m+[m[32m      "L_lj_err_unwind_dwarf$non_lazy_ptr:\n"[m
[32m+[m[32m      ".indirect_symbol _lj_err_unwind_dwarf\n"[m
[32m+[m[32m      ".long 0\n\n");[m
[32m+[m[32m    fprintf(ctx->fp, "\t.section __IMPORT,__jump_table,symbol_stubs,pure_instructions+self_modifying_code,5\n");[m
[32m+[m[32m    {[m
[32m+[m[32m      const char *const *xn;[m
[32m+[m[32m      for (xn = ctx->extnames; *xn; xn++)[m
[32m+[m	[32mif (strncmp(*xn, LABEL_PREFIX, sizeof(LABEL_PREFIX)-1))[m
[32m+[m	[32m  fprintf(ctx->fp, "L_%s$stub:\n\t.indirect_symbol _%s\n\t.ascii \"\\364\\364\\364\\364\\364\"\n", *xn, *xn);[m
[32m+[m[32m    }[m
[32m+[m[32m#endif[m
[32m+[m[32m    fprintf(ctx->fp, ".subsections_via_symbols\n");[m
[32m+[m[32m    }[m
[32m+[m[32m    break;[m
[32m+[m[32m#endif[m
[32m+[m[32m  default:  /* Difficult for other modes. */[m
[32m+[m[32m    break;[m
[32m+[m[32m  }[m
[32m+[m[32m}[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_asm.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_asm.o[m
[1mnew file mode 100644[m
[1mindex 0000000..2ed789e[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_asm.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_fold.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_fold.o[m
[1mnew file mode 100644[m
[1mindex 0000000..373ab2c[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_fold.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_lib.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_lib.o[m
[1mnew file mode 100644[m
[1mindex 0000000..800d29c[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_lib.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_peobj.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_peobj.o[m
[1mnew file mode 100644[m
[1mindex 0000000..1116ca6[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_peobj.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua[m
[1mnew file mode 100755[m
[1mindex 0000000..3fe6239[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua.o[m
[1mnew file mode 100644[m
[1mindex 0000000..4b6e68b[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/vmdef.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/vmdef.lua[m
[1mnew file mode 100644[m
[1mindex 0000000..2ca1783[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/vmdef.lua[m
[36m@@ -0,0 +1,362 @@[m
[32m+[m[32m-- This is a generated file. DO NOT EDIT![m
[32m+[m
[32m+[m[32mreturn {[m
[32m+[m
[32m+[m[32mbcnames = "ISLT  ISGE  ISLE  ISGT  ISEQV ISNEV ISEQS ISNES ISEQN ISNEN ISEQP ISNEP ISTC  ISFC  IST   ISF   ISTYPEISNUM MOV   NOT   UNM   LEN   ADDVN SUBVN MULVN DIVVN MODVN ADDNV SUBNV MULNV DIVNV MODNV ADDVV SUBVV MULVV DIVVV MODVV POW   CAT   KSTR  KCDATAKSHORTKNUM  KPRI  KNIL  UGET  USETV USETS USETN USETP UCLO  FNEW  TNEW  TDUP  GGET  GSET  TGETV TGETS TGETB TGETR TSETV TSETS TSETB TSETM TSETR CALLM CALL  CALLMTCALLT ITERC ITERN VARG  ISNEXTRETM  RET   RET0  RET1  FORI  JFORI FORL  IFORL JFORL ITERL IITERLJITERLLOOP  ILOOP JLOOP JMP   FUNCF IFUNCFJFUNCFFUNCV IFUNCVJFUNCVFUNCC FUNCCW",[m
[32m+[m
[32m+[m[32mirnames = "LT    GE    LE    GT    ULT   UGE   ULE   UGT   EQ    NE    ABC   RETF  NOP   BASE  PVAL  GCSTEPHIOP  LOOP  USE   PHI   RENAMEPROF  KPRI  KINT  KGC   KPTR  KKPTR KNULL KNUM  KINT64KSLOT BNOT  BSWAP BAND  BOR   BXOR  BSHL  BSHR  BSAR  BROL  BROR  ADD   SUB   MUL   DIV   MOD   POW   NEG   ABS   ATAN2 LDEXP MIN   MAX   FPMATHADDOV SUBOV MULOV AREF  HREFK HREF  NEWREFUREFO UREFC FREF  STRREFLREF  ALOAD HLOAD ULOAD FLOAD XLOAD SLOAD VLOAD ASTOREHSTOREUSTOREFSTOREXSTORESNEW  XSNEW TNEW  TDUP  CNEW  CNEWI BUFHDRBUFPUTBUFSTRTBAR  OBAR  XBAR  CONV  TOBIT TOSTR STRTO CALLN CALLA CALLL CALLS CALLXSCARG  ",[m
[32m+[m
[32m+[m[32mirfpm = { [0]="floor", "ceil", "trunc", "sqrt", "exp", "exp2", "log", "log2", "log10", "sin", "cos", "tan", "other", },[m
[32m+[m
[32m+[m[32mirfield = { [0]="str.len", "func.env", "func.pc", "func.ffid", "thread.env", "tab.meta", "tab.array", "tab.node", "tab.asize", "tab.hmask", "tab.nomm", "udata.meta", "udata.udtype", "udata.file", "cdata.ctypeid", "cdata.ptr", "cdata.int", "cdata.int64", "cdata.int64_4", },[m
[32m+[m
[32m+[m[32mircall = {[m
[32m+[m[32m[0]="lj_str_cmp",[m
[32m+[m[32m"lj_str_find",[m
[32m+[m[32m"lj_str_new",[m
[32m+[m[32m"lj_strscan_num",[m
[32m+[m[32m"lj_strfmt_int",[m
[32m+[m[32m"lj_strfmt_num",[m
[32m+[m[32m"lj_strfmt_char",[m
[32m+[m[32m"lj_strfmt_putint",[m
[32m+[m[32m"lj_strfmt_putnum",[m
[32m+[m[32m"lj_strfmt_putquoted",[m
[32m+[m[32m"lj_strfmt_putfxint",[m
[32m+[m[32m"lj_strfmt_putfnum_int",[m
[32m+[m[32m"lj_strfmt_putfnum_uint",[m
[32m+[m[32m"lj_strfmt_putfnum",[m
[32m+[m[32m"lj_strfmt_putfstr",[m
[32m+[m[32m"lj_strfmt_putfchar",[m
[32m+[m[32m"lj_buf_putmem",[m
[32m+[m[32m"lj_buf_putstr",[m
[32m+[m[32m"lj_buf_putchar",[m
[32m+[m[32m"lj_buf_putstr_reverse",[m
[32m+[m[32m"lj_buf_putstr_lower",[m
[32m+[m[32m"lj_buf_putstr_upper",[m
[32m+[m[32m"lj_buf_putstr_rep",[m
[32m+[m[32m"lj_buf_puttab",[m
[32m+[m[32m"lj_buf_tostr",[m
[32m+[m[32m"lj_tab_new_ah",[m
[32m+[m[32m"lj_tab_new1",[m
[32m+[m[32m"lj_tab_dup",[m
[32m+[m[32m"lj_tab_clear",[m
[32m+[m[32m"lj_tab_newkey",[m
[32m+[m[32m"lj_tab_len",[m
[32m+[m[32m"lj_gc_step_jit",[m
[32m+[m[32m"lj_gc_barrieruv",[m
[32m+[m[32m"lj_mem_newgco",[m
[32m+[m[32m"lj_math_random_step",[m
[32m+[m[32m"lj_vm_modi",[m
[32m+[m[32m"sinh",[m
[32m+[m[32m"cosh",[m
[32m+[m[32m"tanh",[m
[32m+[m[32m"fputc",[m
[32m+[m[32m"fwrite",[m
[32m+[m[32m"fflush",[m
[32m+[m[32m"lj_vm_floor",[m
[32m+[m[32m"lj_vm_ceil",[m
[32m+[m[32m"lj_vm_trunc",[m
[32m+[m[32m"sqrt",[m
[32m+[m[32m"exp",[m
[32m+[m[32m"lj_vm_exp2",[m
[32m+[m[32m"log",[m
[32m+[m[32m"lj_vm_log2",[m
[32m+[m[32m"log10",[m
[32m+[m[32m"sin",[m
[32m+[m[32m"cos",[m
[32m+[m[32m"tan",[m
[32m+[m[32m"lj_vm_powi",[m
[32m+[m[32m"pow",[m
[32m+[m[32m"atan2",[m
[32m+[m[32m"ldexp",[m
[32m+[m[32m"lj_vm_tobit",[m
[32m+[m[32m"softfp_add",[m
[32m+[m[32m"softfp_sub",[m
[32m+[m[32m"softfp_mul",[m
[32m+[m[32m"softfp_div",[m
[32m+[m[32m"softfp_cmp",[m
[32m+[m[32m"softfp_i2d",[m
[32m+[m[32m"softfp_d2i",[m
[32m+[m[32m"lj_vm_sfmin",[m
[32m+[m[32m"lj_vm_sfmax",[m
[32m+[m[32m"softfp_ui2d",[m
[32m+[m[32m"softfp_f2d",[m
[32m+[m[32m"softfp_d2ui",[m
[32m+[m[32m"softfp_d2f",[m
[32m+[m[32m"softfp_i2f",[m
[32m+[m[32m"softfp_ui2f",[m
[32m+[m[32m"softfp_f2i",[m
[32m+[m[32m"softfp_f2ui",[m
[32m+[m[32m"fp64_l2d",[m
[32m+[m[32m"fp64_ul2d",[m
[32m+[m[32m"fp64_l2f",[m
[32m+[m[32m"fp64_ul2f",[m
[32m+[m[32m"fp64_d2l",[m
[32m+[m[32m"fp64_d2ul",[m
[32m+[m[32m"fp64_f2l",[m
[32m+[m[32m"fp64_f2ul",[m
[32m+[m[32m"lj_carith_divi64",[m
[32m+[m[32m"lj_carith_divu64",[m
[32m+[m[32m"lj_carith_modi64",[m
[32m+[m[32m"lj_carith_modu64",[m
[32m+[m[32m"lj_carith_powi64",[m
[32m+[m[32m"lj_carith_powu64",[m
[32m+[m[32m"lj_cdata_newv",[m
[32m+[m[32m"lj_cdata_setfin",[m
[32m+[m[32m"strlen",[m
[32m+[m[32m"memcpy",[m
[32m+[m[32m"memset",[m
[32m+[m[32m"lj_vm_errno",[m
[32m+[m[32m"lj_carith_mul64",[m
[32m+[m[32m"lj_carith_shl64",[m
[32m+[m[32m"lj_carith_shr64",[m
[32m+[m[32m"lj_carith_sar64",[m
[32m+[m[32m"lj_carith_rol64",[m
[32m+[m[32m"lj_carith_ror64",[m
[32m+[m[32m},[m
[32m+[m
[32m+[m[32mtraceerr = {[m
[32m+[m[32m[0]="error thrown or hook called during recording",[m
[32m+[m[32m"trace too short",[m
[32m+[m[32m"trace too long",[m
[32m+[m[32m"trace too deep",[m
[32m+[m[32m"too many snapshots",[m
[32m+[m[32m"blacklisted",[m
[32m+[m[32m"retry recording",[m
[32m+[m[32m"NYI: bytecode %d",[m
[32m+[m[32m"leaving loop in root trace",[m
[32m+[m[32m"inner loop in root trace",[m
[32m+[m[32m"loop unroll limit reached",[m
[32m+[m[32m"bad argument type",[m
[32m+[m[32m"JIT compilation disabled for function",[m
[32m+[m[32m"call unroll limit reached",[m
[32m+[m[32m"down-recursion, restarting",[m
[32m+[m[32m"NYI: unsupported variant of FastFunc %s",[m
[32m+[m[32m"NYI: return to lower frame",[m
[32m+[m[32m"store with nil or NaN key",[m
[32m+[m[32m"missing metamethod",[m
[32m+[m[32m"looping index lookup",[m
[32m+[m[32m"NYI: mixed sparse/dense table",[m
[32m+[m[32m"symbol not in cache",[m
[32m+[m[32m"NYI: unsupported C type conversion",[m
[32m+[m[32m"NYI: unsupported C function type",[m
[32m+[m[32m"guard would always fail",[m
[32m+[m[32m"too many PHIs",[m
[32m+[m[32m"persistent type instability",[m
[32m+[m[32m"failed to allocate mcode memory",[m
[32m+[m[32m"machine code too long",[m
[32m+[m[32m"hit mcode limit (retrying)",[m
[32m+[m[32m"too many spill slots",[m
[32m+[m[32m"inconsistent register allocation",[m
[32m+[m[32m"NYI: cannot assemble IR instruction %d",[m
[32m+[m[32m"NYI: PHI shuffling too complex",[m
[32m+[m[32m"NYI: register coalescing too complex",[m
[32m+[m[32m},[m
[32m+[m
[32m+[m[32mffnames = {[m
[32m+[m[32m[0]="Lua",[m
[32m+[m[32m"C",[m
[32m+[m[32m"assert",[m
[32m+[m[32m"type",[m
[32m+[m[32m"next",[m
[32m+[m[32m"pairs",[m
[32m+[m[32m"ipairs_aux",[m
[32m+[m[32m"ipairs",[m
[32m+[m[32m"getmetatable",[m
[32m+[m[32m"setmetatable",[m
[32m+[m[32m"getfenv",[m
[32m+[m[32m"setfenv",[m
[32m+[m[32m"rawget",[m
[32m+[m[32m"rawset",[m
[32m+[m[32m"rawequal",[m
[32m+[m[32m"unpack",[m
[32m+[m[32m"select",[m
[32m+[m[32m"tonumber",[m
[32m+[m[32m"tostring",[m
[32m+[m[32m"error",[m
[32m+[m[32m"pcall",[m
[32m+[m[32m"xpcall",[m
[32m+[m[32m"loadfile",[m
[32m+[m[32m"load",[m
[32m+[m[32m"loadstring",[m
[32m+[m[32m"dofile",[m
[32m+[m[32m"gcinfo",[m
[32m+[m[32m"collectgarbage",[m
[32m+[m[32m"newproxy",[m
[32m+[m[32m"print",[m
[32m+[m[32m"coroutine.status",[m
[32m+[m[32m"coroutine.running",[m
[32m+[m[32m"coroutine.create",[m
[32m+[m[32m"coroutine.yield",[m
[32m+[m[32m"coroutine.resume",[m
[32m+[m[32m"coroutine.wrap_aux",[m
[32m+[m[32m"coroutine.wrap",[m
[32m+[m[32m"math.abs",[m
[32m+[m[32m"math.floor",[m
[32m+[m[32m"math.ceil",[m
[32m+[m[32m"math.sqrt",[m
[32m+[m[32m"math.log10",[m
[32m+[m[32m"math.exp",[m
[32m+[m[32m"math.sin",[m
[32m+[m[32m"math.cos",[m
[32m+[m[32m"math.tan",[m
[32m+[m[32m"math.asin",[m
[32m+[m[32m"math.acos",[m
[32m+[m[32m"math.atan",[m
[32m+[m[32m"math.sinh",[m
[32m+[m[32m"math.cosh",[m
[32m+[m[32m"math.tanh",[m
[32m+[m[32m"math.frexp",[m
[32m+[m[32m"math.modf",[m
[32m+[m[32m"math.log",[m
[32m+[m[32m"math.atan2",[m
[32m+[m[32m"math.pow",[m
[32m+[m[32m"math.fmod",[m
[32m+[m[32m"math.ldexp",[m
[32m+[m[32m"math.min",[m
[32m+[m[32m"math.max",[m
[32m+[m[32m"math.random",[m
[32m+[m[32m"math.randomseed",[m
[32m+[m[32m"bit.tobit",[m
[32m+[m[32m"bit.bnot",[m
[32m+[m[32m"bit.bswap",[m
[32m+[m[32m"bit.lshift",[m
[32m+[m[32m"bit.rshift",[m
[32m+[m[32m"bit.arshift",[m
[32m+[m[32m"bit.rol",[m
[32m+[m[32m"bit.ror",[m
[32m+[m[32m"bit.band",[m
[32m+[m[32m"bit.bor",[m
[32m+[m[32m"bit.bxor",[m
[32m+[m[32m"bit.tohex",[m
[32m+[m[32m"string.byte",[m
[32m+[m[32m"string.char",[m
[32m+[m[32m"string.sub",[m
[32m+[m[32m"string.rep",[m
[32m+[m[32m"string.reverse",[m
[32m+[m[32m"string.lower",[m
[32m+[m[32m"string.upper",[m
[32m+[m[32m"string.dump",[m
[32m+[m[32m"string.find",[m
[32m+[m[32m"string.match",[m
[32m+[m[32m"string.gmatch_aux",[m
[32m+[m[32m"string.gmatch",[m
[32m+[m[32m"string.gsub",[m
[32m+[m[32m"string.format",[m
[32m+[m[32m"table.maxn",[m
[32m+[m[32m"table.insert",[m
[32m+[m[32m"table.concat",[m
[32m+[m[32m"table.sort",[m
[32m+[m[32m"table.new",[m
[32m+[m[32m"table.clear",[m
[32m+[m[32m"io.method.close",[m
[32m+[m[32m"io.method.read",[m
[32m+[m[32m"io.method.write",[m
[32m+[m[32m"io.method.flush",[m
[32m+[m[32m"io.method.seek",[m
[32m+[m[32m"io.method.setvbuf",[m
[32m+[m[32m"io.method.lines",[m
[32m+[m[32m"io.method.__gc",[m
[32m+[m[32m"io.method.__tostring",[m
[32m+[m[32m"io.open",[m
[32m+[m[32m"io.popen",[m
[32m+[m[32m"io.tmpfile",[m
[32m+[m[32m"io.close",[m
[32m+[m[32m"io.read",[m
[32m+[m[32m"io.write",[m
[32m+[m[32m"io.flush",[m
[32m+[m[32m"io.input",[m
[32m+[m[32m"io.output",[m
[32m+[m[32m"io.lines",[m
[32m+[m[32m"io.type",[m
[32m+[m[32m"os.execute",[m
[32m+[m[32m"os.remove",[m
[32m+[m[32m"os.rename",[m
[32m+[m[32m"os.tmpname",[m
[32m+[m[32m"os.getenv",[m
[32m+[m[32m"os.exit",[m
[32m+[m[32m"os.clock",[m
[32m+[m[32m"os.date",[m
[32m+[m[32m"os.time",[m
[32m+[m[32m"os.difftime",[m
[32m+[m[32m"os.setlocale",[m
[32m+[m[32m"debug.getregistry",[m
[32m+[m[32m"debug.getmetatable",[m
[32m+[m[32m"debug.setmetatable",[m
[32m+[m[32m"debug.getfenv",[m
[32m+[m[32m"debug.setfenv",[m
[32m+[m[32m"debug.getinfo",[m
[32m+[m[32m"debug.getlocal",[m
[32m+[m[32m"debug.setlocal",[m
[32m+[m[32m"debug.getupvalue",[m
[32m+[m[32m"debug.setupvalue",[m
[32m+[m[32m"debug.upvalueid",[m
[32m+[m[32m"debug.upvaluejoin",[m
[32m+[m[32m"debug.sethook",[m
[32m+[m[32m"debug.gethook",[m
[32m+[m[32m"debug.debug",[m
[32m+[m[32m"debug.traceback",[m
[32m+[m[32m"jit.on",[m
[32m+[m[32m"jit.off",[m
[32m+[m[32m"jit.flush",[m
[32m+[m[32m"jit.status",[m
[32m+[m[32m"jit.attach",[m
[32m+[m[32m"jit.util.funcinfo",[m
[32m+[m[32m"jit.util.funcbc",[m
[32m+[m[32m"jit.util.funck",[m
[32m+[m[32m"jit.util.funcuvname",[m
[32m+[m[32m"jit.util.traceinfo",[m
[32m+[m[32m"jit.util.traceir",[m
[32m+[m[32m"jit.util.tracek",[m
[32m+[m[32m"jit.util.tracesnap",[m
[32m+[m[32m"jit.util.tracemc",[m
[32m+[m[32m"jit.util.traceexitstub",[m
[32m+[m[32m"jit.util.ircalladdr",[m
[32m+[m[32m"jit.opt.start",[m
[32m+[m[32m"jit.profile.start",[m
[32m+[m[32m"jit.profile.stop",[m
[32m+[m[32m"jit.profile.dumpstack",[m
[32m+[m[32m"ffi.meta.__index",[m
[32m+[m[32m"ffi.meta.__newindex",[m
[32m+[m[32m"ffi.meta.__eq",[m
[32m+[m[32m"ffi.meta.__len",[m
[32m+[m[32m"ffi.meta.__lt",[m
[32m+[m[32m"ffi.meta.__le",[m
[32m+[m[32m"ffi.meta.__concat",[m
[32m+[m[32m"ffi.meta.__call",[m
[32m+[m[32m"ffi.meta.__add",[m
[32m+[m[32m"ffi.meta.__sub",[m
[32m+[m[32m"ffi.meta.__mul",[m
[32m+[m[32m"ffi.meta.__div",[m
[32m+[m[32m"ffi.meta.__mod",[m
[32m+[m[32m"ffi.meta.__pow",[m
[32m+[m[32m"ffi.meta.__unm",[m
[32m+[m[32m"ffi.meta.__tostring",[m
[32m+[m[32m"ffi.meta.__pairs",[m
[32m+[m[32m"ffi.meta.__ipairs",[m
[32m+[m[32m"ffi.clib.__index",[m
[32m+[m[32m"ffi.clib.__newindex",[m
[32m+[m[32m"ffi.clib.__gc",[m
[32m+[m[32m"ffi.callback.free",[m
[32m+[m[32m"ffi.callback.set",[m
[32m+[m[32m"ffi.cdef",[m
[32m+[m[32m"ffi.new",[m
[32m+[m[32m"ffi.cast",[m
[32m+[m[32m"ffi.typeof",[m
[32m+[m[32m"ffi.typeinfo",[m
[32m+[m[32m"ffi.istype",[m
[32m+[m[32m"ffi.sizeof",[m
[32m+[m[32m"ffi.alignof",[m
[32m+[m[32m"ffi.offsetof",[m
[32m+[m[32m"ffi.errno",[m
[32m+[m[32m"ffi.string",[m
[32m+[m[32m"ffi.copy",[m
[32m+[m[32m"ffi.fill",[m
[32m+[m[32m"ffi.abi",[m
[32m+[m[32m"ffi.metatype",[m
[32m+[m[32m"ffi.gc",[m
[32m+[m[32m"ffi.load",[m
[32m+[m[32m},[m
[32m+[m
[32m+[m[32m}[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux.o[m
[1mnew file mode 100644[m
[1mindex 0000000..5fd2afb[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..1527fcf[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ba566ba[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..3aacf97[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit.o[m
[1mnew file mode 100644[m
[1mindex 0000000..799ffa4[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..6867973[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a421ba6[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..cdb398f[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi.o[m
[1mnew file mode 100644[m
[1mindex 0000000..699f45f[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..8ca88e1[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init.o[m
[1mnew file mode 100644[m
[1mindex 0000000..cfae655[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..7a9d27d[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io.o[m
[1mnew file mode 100644[m
[1mindex 0000000..347cfe4[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ab3a06b[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit.o[m
[1mnew file mode 100644[m
[1mindex 0000000..016dfac[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..e9dcfbc[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math.o[m
[1mnew file mode 100644[m
[1mindex 0000000..e166686[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..e25d5b7[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os.o[m
[1mnew file mode 100644[m
[1mindex 0000000..2fc5c96[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..62013ce[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package.o[m
[1mnew file mode 100644[m
[1mindex 0000000..1bfdc2e[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a64d32b[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string.o[m
[1mnew file mode 100644[m
[1mindex 0000000..83d83d8[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..8832bf9[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table.o[m
[1mnew file mode 100644[m
[1mindex 0000000..995b585[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..cb0c763[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/libluajit.a b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/libluajit.a[m
[1mnew file mode 100644[m
[1mindex 0000000..be483b1[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/libluajit.a differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/libluajit.so b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/libluajit.so[m
[1mnew file mode 100755[m
[1mindex 0000000..0f79f0f[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/libluajit.so differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.o[m
[1mnew file mode 100644[m
[1mindex 0000000..988cb79[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..109d9a4[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api.o[m
[1mnew file mode 100644[m
[1mindex 0000000..af53c68[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..50de926[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.o[m
[1mnew file mode 100644[m
[1mindex 0000000..f9d58cd[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..dd58797[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.o[m
[1mnew file mode 100644[m
[1mindex 0000000..97cb23f[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..2c41225[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcdef.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcdef.h[m
[1mnew file mode 100644[m
[1mindex 0000000..72b73f0[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcdef.h[m
[36m@@ -0,0 +1,220 @@[m
[32m+[m[32m/* This is a generated file. DO NOT EDIT! */[m
[32m+[m
[32m+[m[32mLJ_DATADEF const uint16_t lj_bc_ofs[] = {[m
[32m+[m[32m0,[m
[32m+[m[32m72,[m
[32m+[m[32m144,[m
[32m+[m[32m216,[m
[32m+[m[32m288,[m
[32m+[m[32m427,[m
[32m+[m[32m569,[m
[32m+[m[32m632,[m
[32m+[m[32m695,[m
[32m+[m[32m764,[m
[32m+[m[32m833,[m
[32m+[m[32m886,[m
[32m+[m[32m938,[m
[32m+[m[32m989,[m
[32m+[m[32m1040,[m
[32m+[m[32m1081,[m
[32m+[m[32m1122,[m
[32m+[m[32m1150,[m
[32m+[m[32m1182,[m
[32m+[m[32m1208,[m
[32m+[m[32m1240,[m
[32m+[m[32m1300,[m
[32m+[m[32m1374,[m
[32m+[m[32m1428,[m
[32m+[m[32m1482,[m
[32m+[m[32m1536,[m
[32m+[m[32m1590,[m
[32m+[m[32m1649,[m
[32m+[m[32m1703,[m
[32m+[m[32m1757,[m
[32m+[m[32m1811,[m
[32m+[m[32m1865,[m
[32m+[m[32m1901,[m
[32m+[m[32m1968,[m
[32m+[m[32m2035,[m
[32m+[m[32m2102,[m
[32m+[m[32m2169,[m
[32m+[m[32m2218,[m
[32m+[m[32m2298,[m
[32m+[m[32m2374,[m
[32m+[m[32m2410,[m
[32m+[m[32m2446,[m
[32m+[m[32m2476,[m
[32m+[m[32m2505,[m
[32m+[m[32m2530,[m
[32m+[m[32m2573,[m
[32m+[m[32m2609,[m
[32m+[m[32m2696,[m
[32m+[m[32m2778,[m
[32m+[m[32m2816,[m
[32m+[m[32m2850,[m
[32m+[m[32m2901,[m
[32m+[m[32m2965,[m
[32m+[m[32m3074,[m
[32m+[m[32m3167,[m
[32m+[m[32m3185,[m
[32m+[m[32m3203,[m
[32m+[m[32m3351,[m
[32m+[m[32m3475,[m
[32m+[m[32m3574,[m
[32m+[m[32m3628,[m
[32m+[m[32m3801,[m
[32m+[m[32m4030,[m
[32m+[m[32m4154,[m
[32m+[m[32m4296,[m
[32m+[m[32m4383,[m
[32m+[m[32m4429,[m
[32m+[m[32m4471,[m
[32m+[m[32m4475,[m
[32m+[m[32m4623,[m
[32m+[m[32m4691,[m
[32m+[m[32m4856,[m
[32m+[m[32m5047,[m
[32m+[m[32m5135,[m
[32m+[m[32m5139,[m
[32m+[m[32m5275,[m
[32m+[m[32m5367,[m
[32m+[m[32m5472,[m
[32m+[m[32m5569,[m
[32m+[m[32m5674,[m
[32m+[m[32m5694,[m
[32m+[m[32m5764,[m
[32m+[m[32m5831,[m
[32m+[m[32m5851,[m
[32m+[m[32m5895,[m
[32m+[m[32m5934,[m
[32m+[m[32m5954,[m
[32m+[m[32m5972,[m
[32m+[m[32m6019,[m
[32m+[m[32m6044,[m
[32m+[m[32m6064,[m
[32m+[m[32m6127,[m
[32m+[m[32m6181,[m
[32m+[m[32m6181,[m
[32m+[m[32m6306,[m
[32m+[m[32m6307,[m
[32m+[m[32m6396,[m
[32m+[m[32m8196,[m
[32m+[m[32m8263,[m
[32m+[m[32m8774,[m
[32m+[m[32m8877,[m
[32m+[m[32m8934,[m
[32m+[m[32m9065,[m
[32m+[m[32m8329,[m
[32m+[m[32m8491,[m
[32m+[m[32m8583,[m
[32m+[m[32m8635,[m
[32m+[m[32m8666,[m
[32m+[m[32m9123,[m
[32m+[m[32m9164,[m
[32m+[m[32m9786,[m
[32m+[m[32m9219,[m
[32m+[m[32m9529,[m
[32m+[m[32m9838,[m
[32m+[m[32m9965,[m
[32m+[m[32m9989,[m
[32m+[m[32m10016,[m
[32m+[m[32m10087,[m
[32m+[m[32m10127,[m
[32m+[m[32m10167,[m
[32m+[m[32m10207,[m
[32m+[m[32m10247,[m
[32m+[m[32m10287,[m
[32m+[m[32m10327,[m
[32m+[m[32m10367,[m
[32m+[m[32m10407,[m
[32m+[m[32m10447,[m
[32m+[m[32m10487,[m
[32m+[m[32m10750,[m
[32m+[m[32m10898,[m
[32m+[m[32m10047,[m
[32m+[m[32m10585,[m
[32m+[m[32m10527,[m
[32m+[m[32m10643,[m
[32m+[m[32m10701,[m
[32m+[m[32m10997,[m
[32m+[m[32m11056,[m
[32m+[m[32m11708,[m
[32m+[m[32m12106,[m
[32m+[m[32m12053,[m
[32m+[m[32m12175,[m
[32m+[m[32m12254,[m
[32m+[m[32m12336,[m
[32m+[m[32m12418,[m
[32m+[m[32m12500,[m
[32m+[m[32m11762,[m
[32m+[m[32m11859,[m
[32m+[m[32m11956,[m
[32m+[m[32m11115,[m
[32m+[m[32m11162,[m
[32m+[m[32m11284,[m
[32m+[m[32m11453,[m
[32m+[m[32m11538,[m
[32m+[m[32m11623[m
[32m+[m[32m};[m
[32m+[m
[32m+[m[32mLJ_DATADEF const uint16_t lj_bc_mode[] = {[m
[32m+[m[32mBCDEF(BCMODE)[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF,[m
[32m+[m[32mBCMODE_FF[m
[32m+[m[32m};[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread.o[m
[1mnew file mode 100644[m
[1mindex 0000000..55b93e4[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..9c607c8[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite.o[m
[1mnew file mode 100644[m
[1mindex 0000000..98ec3da[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a58b9ec[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.o[m
[1mnew file mode 100644[m
[1mindex 0000000..83a8ea9[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..50084ac[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.o[m
[1mnew file mode 100644[m
[1mindex 0000000..14924d4[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..28f453f[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.o[m
[1mnew file mode 100644[m
[1mindex 0000000..90b5f96[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ca408d8[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.o[m
[1mnew file mode 100644[m
[1mindex 0000000..d1e85e6[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ae0794b[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.o[m
[1mnew file mode 100644[m
[1mindex 0000000..72496ae[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..6f177ed[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.o[m
[1mnew file mode 100644[m
[1mindex 0000000..edd5147[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..af4cf42[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.o[m
[1mnew file mode 100644[m
[1mindex 0000000..aa9ae57[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..2224597[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.o[m
[1mnew file mode 100644[m
[1mindex 0000000..3402cba[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..4e281af[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.o[m
[1mnew file mode 100644[m
[1mindex 0000000..18c4262[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ed75703[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.o[m
[1mnew file mode 100644[m
[1mindex 0000000..4e66e87[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..111293e[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.o[m
[1mnew file mode 100644[m
[1mindex 0000000..9b29fa0[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..767d7c8[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.o[m
[1mnew file mode 100644[m
[1mindex 0000000..e2e6c54[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..85094c5[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.o[m
[1mnew file mode 100644[m
[1mindex 0000000..8bd0711[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..6ee53ea[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.o[m
[1mnew file mode 100644[m
[1mindex 0000000..0ee5142[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..3fcee39[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffdef.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffdef.h[m
[1mnew file mode 100644[m
[1mindex 0000000..3f936f2[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffdef.h[m
[36m@@ -0,0 +1,209 @@[m
[32m+[m[32m/* This is a generated file. DO NOT EDIT! */[m
[32m+[m
[32m+[m[32mFFDEF(assert)[m
[32m+[m[32mFFDEF(type)[m
[32m+[m[32mFFDEF(next)[m
[32m+[m[32mFFDEF(pairs)[m
[32m+[m[32mFFDEF(ipairs_aux)[m
[32m+[m[32mFFDEF(ipairs)[m
[32m+[m[32mFFDEF(getmetatable)[m
[32m+[m[32mFFDEF(setmetatable)[m
[32m+[m[32mFFDEF(getfenv)[m
[32m+[m[32mFFDEF(setfenv)[m
[32m+[m[32mFFDEF(rawget)[m
[32m+[m[32mFFDEF(rawset)[m
[32m+[m[32mFFDEF(rawequal)[m
[32m+[m[32mFFDEF(unpack)[m
[32m+[m[32mFFDEF(select)[m
[32m+[m[32mFFDEF(tonumber)[m
[32m+[m[32mFFDEF(tostring)[m
[32m+[m[32mFFDEF(error)[m
[32m+[m[32mFFDEF(pcall)[m
[32m+[m[32mFFDEF(xpcall)[m
[32m+[m[32mFFDEF(loadfile)[m
[32m+[m[32mFFDEF(load)[m
[32m+[m[32mFFDEF(loadstring)[m
[32m+[m[32mFFDEF(dofile)[m
[32m+[m[32mFFDEF(gcinfo)[m
[32m+[m[32mFFDEF(collectgarbage)[m
[32m+[m[32mFFDEF(newproxy)[m
[32m+[m[32mFFDEF(print)[m
[32m+[m[32mFFDEF(coroutine_status)[m
[32m+[m[32mFFDEF(coroutine_running)[m
[32m+[m[32mFFDEF(coroutine_create)[m
[32m+[m[32mFFDEF(coroutine_yield)[m
[32m+[m[32mFFDEF(coroutine_resume)[m
[32m+[m[32mFFDEF(coroutine_wrap_aux)[m
[32m+[m[32mFFDEF(coroutine_wrap)[m
[32m+[m[32mFFDEF(math_abs)[m
[32m+[m[32mFFDEF(math_floor)[m
[32m+[m[32mFFDEF(math_ceil)[m
[32m+[m[32mFFDEF(math_sqrt)[m
[32m+[m[32mFFDEF(math_log10)[m
[32m+[m[32mFFDEF(math_exp)[m
[32m+[m[32mFFDEF(math_sin)[m
[32m+[m[32mFFDEF(math_cos)[m
[32m+[m[32mFFDEF(math_tan)[m
[32m+[m[32mFFDEF(math_asin)[m
[32m+[m[32mFFDEF(math_acos)[m
[32m+[m[32mFFDEF(math_atan)[m
[32m+[m[32mFFDEF(math_sinh)[m
[32m+[m[32mFFDEF(math_cosh)[m
[32m+[m[32mFFDEF(math_tanh)[m
[32m+[m[32mFFDEF(math_frexp)[m
[32m+[m[32mFFDEF(math_modf)[m
[32m+[m[32mFFDEF(math_log)[m
[32m+[m[32mFFDEF(math_atan2)[m
[32m+[m[32mFFDEF(math_pow)[m
[32m+[m[32mFFDEF(math_fmod)[m
[32m+[m[32mFFDEF(math_ldexp)[m
[32m+[m[32mFFDEF(math_min)[m
[32m+[m[32mFFDEF(math_max)[m
[32m+[m[32mFFDEF(math_random)[m
[32m+[m[32mFFDEF(math_randomseed)[m
[32m+[m[32mFFDEF(bit_tobit)[m
[32m+[m[32mFFDEF(bit_bnot)[m
[32m+[m[32mFFDEF(bit_bswap)[m
[32m+[m[32mFFDEF(bit_lshift)[m
[32m+[m[32mFFDEF(bit_rshift)[m
[32m+[m[32mFFDEF(bit_arshift)[m
[32m+[m[32mFFDEF(bit_rol)[m
[32m+[m[32mFFDEF(bit_ror)[m
[32m+[m[32mFFDEF(bit_band)[m
[32m+[m[32mFFDEF(bit_bor)[m
[32m+[m[32mFFDEF(bit_bxor)[m
[32m+[m[32mFFDEF(bit_tohex)[m
[32m+[m[32mFFDEF(string_byte)[m
[32m+[m[32mFFDEF(string_char)[m
[32m+[m[32mFFDEF(string_sub)[m
[32m+[m[32mFFDEF(string_rep)[m
[32m+[m[32mFFDEF(string_reverse)[m
[32m+[m[32mFFDEF(string_lower)[m
[32m+[m[32mFFDEF(string_upper)[m
[32m+[m[32mFFDEF(string_dump)[m
[32m+[m[32mFFDEF(string_find)[m
[32m+[m[32mFFDEF(string_match)[m
[32m+[m[32mFFDEF(string_gmatch_aux)[m
[32m+[m[32mFFDEF(string_gmatch)[m
[32m+[m[32mFFDEF(string_gsub)[m
[32m+[m[32mFFDEF(string_format)[m
[32m+[m[32mFFDEF(table_maxn)[m
[32m+[m[32mFFDEF(table_insert)[m
[32m+[m[32mFFDEF(table_concat)[m
[32m+[m[32mFFDEF(table_sort)[m
[32m+[m[32mFFDEF(table_new)[m
[32m+[m[32mFFDEF(table_clear)[m
[32m+[m[32mFFDEF(io_method_close)[m
[32m+[m[32mFFDEF(io_method_read)[m
[32m+[m[32mFFDEF(io_method_write)[m
[32m+[m[32mFFDEF(io_method_flush)[m
[32m+[m[32mFFDEF(io_method_seek)[m
[32m+[m[32mFFDEF(io_method_setvbuf)[m
[32m+[m[32mFFDEF(io_method_lines)[m
[32m+[m[32mFFDEF(io_method___gc)[m
[32m+[m[32mFFDEF(io_method___tostring)[m
[32m+[m[32mFFDEF(io_open)[m
[32m+[m[32mFFDEF(io_popen)[m
[32m+[m[32mFFDEF(io_tmpfile)[m
[32m+[m[32mFFDEF(io_close)[m
[32m+[m[32mFFDEF(io_read)[m
[32m+[m[32mFFDEF(io_write)[m
[32m+[m[32mFFDEF(io_flush)[m
[32m+[m[32mFFDEF(io_input)[m
[32m+[m[32mFFDEF(io_output)[m
[32m+[m[32mFFDEF(io_lines)[m
[32m+[m[32mFFDEF(io_type)[m
[32m+[m[32mFFDEF(os_execute)[m
[32m+[m[32mFFDEF(os_remove)[m
[32m+[m[32mFFDEF(os_rename)[m
[32m+[m[32mFFDEF(os_tmpname)[m
[32m+[m[32mFFDEF(os_getenv)[m
[32m+[m[32mFFDEF(os_exit)[m
[32m+[m[32mFFDEF(os_clock)[m
[32m+[m[32mFFDEF(os_date)[m
[32m+[m[32mFFDEF(os_time)[m
[32m+[m[32mFFDEF(os_difftime)[m
[32m+[m[32mFFDEF(os_setlocale)[m
[32m+[m[32mFFDEF(debug_getregistry)[m
[32m+[m[32mFFDEF(debug_getmetatable)[m
[32m+[m[32mFFDEF(debug_setmetatable)[m
[32m+[m[32mFFDEF(debug_getfenv)[m
[32m+[m[32mFFDEF(debug_setfenv)[m
[32m+[m[32mFFDEF(debug_getinfo)[m
[32m+[m[32mFFDEF(debug_getlocal)[m
[32m+[m[32mFFDEF(debug_setlocal)[m
[32m+[m[32mFFDEF(debug_getupvalue)[m
[32m+[m[32mFFDEF(debug_setupvalue)[m
[32m+[m[32mFFDEF(debug_upvalueid)[m
[32m+[m[32mFFDEF(debug_upvaluejoin)[m
[32m+[m[32mFFDEF(debug_sethook)[m
[32m+[m[32mFFDEF(debug_gethook)[m
[32m+[m[32mFFDEF(debug_debug)[m
[32m+[m[32mFFDEF(debug_traceback)[m
[32m+[m[32mFFDEF(jit_on)[m
[32m+[m[32mFFDEF(jit_off)[m
[32m+[m[32mFFDEF(jit_flush)[m
[32m+[m[32mFFDEF(jit_status)[m
[32m+[m[32mFFDEF(jit_attach)[m
[32m+[m[32mFFDEF(jit_util_funcinfo)[m
[32m+[m[32mFFDEF(jit_util_funcbc)[m
[32m+[m[32mFFDEF(jit_util_funck)[m
[32m+[m[32mFFDEF(jit_util_funcuvname)[m
[32m+[m[32mFFDEF(jit_util_traceinfo)[m
[32m+[m[32mFFDEF(jit_util_traceir)[m
[32m+[m[32mFFDEF(jit_util_tracek)[m
[32m+[m[32mFFDEF(jit_util_tracesnap)[m
[32m+[m[32mFFDEF(jit_util_tracemc)[m
[32m+[m[32mFFDEF(jit_util_traceexitstub)[m
[32m+[m[32mFFDEF(jit_util_ircalladdr)[m
[32m+[m[32mFFDEF(jit_opt_start)[m
[32m+[m[32mFFDEF(jit_profile_start)[m
[32m+[m[32mFFDEF(jit_profile_stop)[m
[32m+[m[32mFFDEF(jit_profile_dumpstack)[m
[32m+[m[32mFFDEF(ffi_meta___index)[m
[32m+[m[32mFFDEF(ffi_meta___newindex)[m
[32m+[m[32mFFDEF(ffi_meta___eq)[m
[32m+[m[32mFFDEF(ffi_meta___len)[m
[32m+[m[32mFFDEF(ffi_meta___lt)[m
[32m+[m[32mFFDEF(ffi_meta___le)[m
[32m+[m[32mFFDEF(ffi_meta___concat)[m
[32m+[m[32mFFDEF(ffi_meta___call)[m
[32m+[m[32mFFDEF(ffi_meta___add)[m
[32m+[m[32mFFDEF(ffi_meta___sub)[m
[32m+[m[32mFFDEF(ffi_meta___mul)[m
[32m+[m[32mFFDEF(ffi_meta___div)[m
[32m+[m[32mFFDEF(ffi_meta___mod)[m
[32m+[m[32mFFDEF(ffi_meta___pow)[m
[32m+[m[32mFFDEF(ffi_meta___unm)[m
[32m+[m[32mFFDEF(ffi_meta___tostring)[m
[32m+[m[32mFFDEF(ffi_meta___pairs)[m
[32m+[m[32mFFDEF(ffi_meta___ipairs)[m
[32m+[m[32mFFDEF(ffi_clib___index)[m
[32m+[m[32mFFDEF(ffi_clib___newindex)[m
[32m+[m[32mFFDEF(ffi_clib___gc)[m
[32m+[m[32mFFDEF(ffi_callback_free)[m
[32m+[m[32mFFDEF(ffi_callback_set)[m
[32m+[m[32mFFDEF(ffi_cdef)[m
[32m+[m[32mFFDEF(ffi_new)[m
[32m+[m[32mFFDEF(ffi_cast)[m
[32m+[m[32mFFDEF(ffi_typeof)[m
[32m+[m[32mFFDEF(ffi_typeinfo)[m
[32m+[m[32mFFDEF(ffi_istype)[m
[32m+[m[32mFFDEF(ffi_sizeof)[m
[32m+[m[32mFFDEF(ffi_alignof)[m
[32m+[m[32mFFDEF(ffi_offsetof)[m
[32m+[m[32mFFDEF(ffi_errno)[m
[32m+[m[32mFFDEF(ffi_string)[m
[32m+[m[32mFFDEF(ffi_copy)[m
[32m+[m[32mFFDEF(ffi_fill)[m
[32m+[m[32mFFDEF(ffi_abi)[m
[32m+[m[32mFFDEF(ffi_metatype)[m
[32m+[m[32mFFDEF(ffi_gc)[m
[32m+[m[32mFFDEF(ffi_load)[m
[32m+[m
[32m+[m[32m#undef FFDEF[m
[32m+[m
[32m+[m[32m#ifndef FF_NUM_ASMFUNC[m
[32m+[m[32m#define FF_NUM_ASMFUNC 57[m
[32m+[m[32m#endif[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.o[m
[1mnew file mode 100644[m
[1mindex 0000000..9188156[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..e914857[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_folddef.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_folddef.h[m
[1mnew file mode 100644[m
[1mindex 0000000..53c6a7f[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_folddef.h[m
[36m@@ -0,0 +1,1138 @@[m
[32m+[m[32m/* This is a generated file. DO NOT EDIT! */[m
[32m+[m
[32m+[m[32mstatic const FoldFunc fold_func[] = {[m
[32m+[m[32m  fold_kfold_numarith,[m
[32m+[m[32m  fold_kfold_ldexp,[m
[32m+[m[32m  fold_kfold_fpmath,[m
[32m+[m[32m  fold_kfold_numpow,[m
[32m+[m[32m  fold_kfold_numcomp,[m
[32m+[m[32m  fold_kfold_intarith,[m
[32m+[m[32m  fold_kfold_intovarith,[m
[32m+[m[32m  fold_kfold_bnot,[m
[32m+[m[32m  fold_kfold_bswap,[m
[32m+[m[32m  fold_kfold_intcomp,[m
[32m+[m[32m  fold_kfold_intcomp0,[m
[32m+[m[32m  fold_kfold_int64arith,[m
[32m+[m[32m  fold_kfold_int64arith2,[m
[32m+[m[32m  fold_kfold_int64shift,[m
[32m+[m[32m  fold_kfold_bnot64,[m
[32m+[m[32m  fold_kfold_bswap64,[m
[32m+[m[32m  fold_kfold_int64comp,[m
[32m+[m[32m  fold_kfold_int64comp0,[m
[32m+[m[32m  fold_kfold_snew_kptr,[m
[32m+[m[32m  fold_kfold_snew_empty,[m
[32m+[m[32m  fold_kfold_strref,[m
[32m+[m[32m  fold_kfold_strref_snew,[m
[32m+[m[32m  fold_kfold_strcmp,[m
[32m+[m[32m  fold_bufput_append,[m
[32m+[m[32m  fold_bufput_kgc,[m
[32m+[m[32m  fold_bufstr_kfold_cse,[m
[32m+[m[32m  fold_bufput_kfold_op,[m
[32m+[m[32m  fold_bufput_kfold_rep,[m
[32m+[m[32m  fold_bufput_kfold_fmt,[m
[32m+[m[32m  fold_kfold_add_kgc,[m
[32m+[m[32m  fold_kfold_add_kptr,[m
[32m+[m[32m  fold_kfold_add_kright,[m
[32m+[m[32m  fold_kfold_tobit,[m
[32m+[m[32m  fold_kfold_conv_kint_num,[m
[32m+[m[32m  fold_kfold_conv_kintu32_num,[m
[32m+[m[32m  fold_kfold_conv_kint_ext,[m
[32m+[m[32m  fold_kfold_conv_kint_i64,[m
[32m+[m[32m  fold_kfold_conv_kint64_num_i64,[m
[32m+[m[32m  fold_kfold_conv_kint64_num_u64,[m
[32m+[m[32m  fold_kfold_conv_kint64_int_i64,[m
[32m+[m[32m  fold_kfold_conv_knum_int_num,[m
[32m+[m[32m  fold_kfold_conv_knum_u32_num,[m
[32m+[m[32m  fold_kfold_conv_knum_i64_num,[m
[32m+[m[32m  fold_kfold_conv_knum_u64_num,[m
[32m+[m[32m  fold_kfold_tostr_knum,[m
[32m+[m[32m  fold_kfold_tostr_kint,[m
[32m+[m[32m  fold_kfold_strto,[m
[32m+[m[32m  lj_opt_cse,[m
[32m+[m[32m  fold_kfold_kref,[m
[32m+[m[32m  fold_shortcut_round,[m
[32m+[m[32m  fold_shortcut_left,[m
[32m+[m[32m  fold_shortcut_dropleft,[m
[32m+[m[32m  fold_shortcut_leftleft,[m
[32m+[m[32m  fold_simplify_numadd_negx,[m
[32m+[m[32m  fold_simplify_numadd_xneg,[m
[32m+[m[32m  fold_simplify_numsub_k,[m
[32m+[m[32m  fold_simplify_numsub_negk,[m
[32m+[m[32m  fold_simplify_numsub_xneg,[m
[32m+[m[32m  fold_simplify_nummuldiv_k,[m
[32m+[m[32m  fold_simplify_nummuldiv_negk,[m
[32m+[m[32m  fold_simplify_nummuldiv_negneg,[m
[32m+[m[32m  fold_simplify_numpow_xk,[m
[32m+[m[32m  fold_simplify_numpow_kx,[m
[32m+[m[32m  fold_shortcut_conv_num_int,[m
[32m+[m[32m  fold_simplify_conv_int_num,[m
[32m+[m[32m  fold_simplify_conv_i64_num,[m
[32m+[m[32m  fold_simplify_conv_int_i64,[m
[32m+[m[32m  fold_simplify_conv_flt_num,[m
[32m+[m[32m  fold_simplify_tobit_conv,[m
[32m+[m[32m  fold_simplify_floor_conv,[m
[32m+[m[32m  fold_simplify_conv_sext,[m
[32m+[m[32m  fold_simplify_conv_narrow,[m
[32m+[m[32m  fold_cse_conv,[m
[32m+[m[32m  fold_narrow_convert,[m
[32m+[m[32m  fold_simplify_intadd_k,[m
[32m+[m[32m  fold_simplify_intmul_k,[m
[32m+[m[32m  fold_simplify_intsub_k,[m
[32m+[m[32m  fold_simplify_intsub_kleft,[m
[32m+[m[32m  fold_simplify_intadd_k64,[m
[32m+[m[32m  fold_simplify_intsub_k64,[m
[32m+[m[32m  fold_simplify_intmul_k32,[m
[32m+[m[32m  fold_simplify_intmul_k64,[m
[32m+[m[32m  fold_simplify_intmod_k,[m
[32m+[m[32m  fold_simplify_intmod_kleft,[m
[32m+[m[32m  fold_simplify_intsub,[m
[32m+[m[32m  fold_simplify_intsubadd_leftcancel,[m
[32m+[m[32m  fold_simplify_intsubsub_leftcancel,[m
[32m+[m[32m  fold_simplify_intsubsub_rightcancel,[m
[32m+[m[32m  fold_simplify_intsubadd_rightcancel,[m
[32m+[m[32m  fold_simplify_intsubaddadd_cancel,[m
[32m+[m[32m  fold_simplify_band_k,[m
[32m+[m[32m  fold_simplify_bor_k,[m
[32m+[m[32m  fold_simplify_bxor_k,[m
[32m+[m[32m  fold_simplify_shift_ik,[m
[32m+[m[32m  fold_simplify_shift_andk,[m
[32m+[m[32m  fold_simplify_shift1_ki,[m
[32m+[m[32m  fold_simplify_shift2_ki,[m
[32m+[m[32m  fold_simplify_shiftk_andk,[m
[32m+[m[32m  fold_simplify_andk_shiftk,[m
[32m+[m[32m  fold_reassoc_intarith_k,[m
[32m+[m[32m  fold_reassoc_intarith_k64,[m
[32m+[m[32m  fold_reassoc_dup,[m
[32m+[m[32m  fold_reassoc_bxor,[m
[32m+[m[32m  fold_reassoc_shift,[m
[32m+[m[32m  fold_reassoc_minmax_k,[m
[32m+[m[32m  fold_reassoc_minmax_left,[m
[32m+[m[32m  fold_reassoc_minmax_right,[m
[32m+[m[32m  fold_abc_fwd,[m
[32m+[m[32m  fold_abc_k,[m
[32m+[m[32m  fold_abc_invar,[m
[32m+[m[32m  fold_comm_swap,[m
[32m+[m[32m  fold_comm_equal,[m
[32m+[m[32m  fold_comm_comp,[m
[32m+[m[32m  fold_comm_dup,[m
[32m+[m[32m  fold_comm_bxor,[m
[32m+[m[32m  fold_merge_eqne_snew_kgc,[m
[32m+[m[32m  lj_opt_fwd_aload,[m
[32m+[m[32m  fold_kfold_hload_kkptr,[m
[32m+[m[32m  lj_opt_fwd_hload,[m
[32m+[m[32m  lj_opt_fwd_uload,[m
[32m+[m[32m  lj_opt_fwd_tab_len,[m
[32m+[m[32m  fold_cse_uref,[m
[32m+[m[32m  lj_opt_fwd_hrefk,[m
[32m+[m[32m  fold_fwd_href_tnew,[m
[32m+[m[32m  fold_fwd_href_tdup,[m
[32m+[m[32m  fold_fload_tab_tnew_asize,[m
[32m+[m[32m  fold_fload_tab_tnew_hmask,[m
[32m+[m[32m  fold_fload_tab_tdup_asize,[m
[32m+[m[32m  fold_fload_tab_tdup_hmask,[m
[32m+[m[32m  fold_fload_tab_ah,[m
[32m+[m[32m  fold_fload_str_len_kgc,[m
[32m+[m[32m  fold_fload_str_len_snew,[m
[32m+[m[32m  fold_fload_str_len_tostr,[m
[32m+[m[32m  fold_fload_cdata_typeid_kgc,[m
[32m+[m[32m  fold_fload_cdata_int64_kgc,[m
[32m+[m[32m  fold_fload_cdata_typeid_cnew,[m
[32m+[m[32m  fold_fload_cdata_ptr_int64_cnew,[m
[32m+[m[32m  lj_opt_cse,[m
[32m+[m[32m  lj_opt_fwd_fload,[m
[32m+[m[32m  fold_fwd_sload,[m
[32m+[m[32m  fold_xload_kptr,[m
[32m+[m[32m  lj_opt_fwd_xload,[m
[32m+[m[32m  fold_barrier_tab,[m
[32m+[m[32m  fold_barrier_tnew_tdup,[m
[32m+[m[32m  fold_prof,[m
[32m+[m[32m  lj_opt_dse_ahstore,[m
[32m+[m[32m  lj_opt_dse_ustore,[m
[32m+[m[32m  lj_opt_dse_fstore,[m
[32m+[m[32m  lj_opt_dse_xstore,[m
[32m+[m[32m  lj_ir_emit[m
[32m+[m[32m};[m
[32m+[m
[32m+[m[32mstatic const uint32_t fold_hash[978] = {[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0b54741d,[m
[32m+[m[32m0x47b4aa76,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0c58741d,[m
[32m+[m[32m0x898bfc11,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0c5c741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x47b4aa96,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x035c7017,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1cc18c0c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x316ad401,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5f485fff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x604c5fff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x60505fff,[m
[32m+[m[32m0x6352a417,[m
[32m+[m[32m0x64468c1d,[m
[32m+[m[32m0x4d545fff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x2cb873ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0402701c,[m
[32m+[m[32m0x868a6010,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0406701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x040a701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x040e701c,[m
[32m+[m[32m0x818bfc07,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0412701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1000741d,[m
[32m+[m[32m0x3b56bc1c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1004741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1008741d,[m
[32m+[m[32m0x129c6817,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x100c741d,[m
[32m+[m[32m0x888b4c0f,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3010741d,[m
[32m+[m[32m0x139dfc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3fb569d3,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5f4a77ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5e49fc21,[m
[32m+[m[32m0x604e77ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5e4dfc21,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5e51fc21,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1cc18c0d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x4a6dfc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6750a017,[m
[32m+[m[32m0x6444881d,[m
[32m+[m[32m0x4b71fc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3013fc1b,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x316ad402,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x61488417,[m
[32m+[m[32m0x7c774418,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x61508417,[m
[32m+[m[32m0x3a57fc1c,[m
[32m+[m[32m0x5654abff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x95c1ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7d8b4008,[m
[32m+[m[32m0x95c5ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x868a6011,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x17ab5056,[m
[32m+[m[32m0x5b45fc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5d49fc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5d4dfc17,[m
[32m+[m[32m0x818bfc08,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5d51fc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x4c55fc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3d5dfc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x888b4c10,[m
[32m+[m[32m0x6868d017,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3e5c73ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x95a1ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x95a5ffff,[m
[32m+[m[32m0x674e9c17,[m
[32m+[m[32m0x6442841d,[m
[32m+[m[32m0x95a9ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x19adffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x8eb1ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x48b5ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x14806017,[m
[32m+[m[32m0x1cc18c0e,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5a43fc1d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5c47fc1d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1e52681d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x4e53fc1d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5157fc1d,[m
[32m+[m[32m0x1e526417,[m
[32m+[m[32m0x8c8c6bff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x8d8dffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7e8b4009,[m
[32m+[m[32m0x5954a429,[m
[32m+[m[32m0x8991ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x9195ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x9399ffff,[m
[32m+[m[32m0x49b4aa6e,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6c15fc17,[m
[32m+[m[32m0x6866cc17,[m
[32m+[m[32m0x818bfc09,[m
[32m+[m[32m0x23b45e6f,[m
[32m+[m[32m0x44b7681c,[m
[32m+[m[32m0x0f407400,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x674c9817,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x073e5c00,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x888b4c11,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x49b4aaae,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7169ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6e6dffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6e71ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7a75ffff,[m
[32m+[m[32m0x28b4726e,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x9579ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x95b20000,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x29b4728e,[m
[32m+[m[32m0x1cc18c0f,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x25b475d5,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x110bfc1d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x2ab472ae,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7145ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x2bb472ce,[m
[32m+[m[32m0x05665c17,[m
[32m+[m[32m0x62429417,[m
[32m+[m[32m0x5455ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x47b4ae75,[m
[32m+[m[32m0x066e5c17,[m
[32m+[m[32m0x30126fff,[m
[32m+[m[32m0x674a9417,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6a67fc34,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6568d3ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x42b56a75,[m
[32m+[m[32m0x23b45e70,[m
[32m+[m[32m0x47b4ae95,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x8faf4000,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x95a3fc00,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x42b56a95,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3c58bc2f,[m
[32m+[m[32m0x15813bff,[m
[32m+[m[32m0x8eaffc00,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x05425c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x05465c17,[m
[32m+[m[32m0x1d52601d,[m
[32m+[m[32m0x27b47675,[m
[32m+[m[32m0x054a5c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x054e5c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x05525c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x05565c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x27b47695,[m
[32m+[m[32m0x055a5c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x055e5c17,[m
[32m+[m[32m0x49b6a41c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x75866800,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x26b475d6,[m
[32m+[m[32m0x7001ffff,[m
[32m+[m[32m0x7687fc00,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7005ffff,[m
[32m+[m[32m0x898bfc00,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7009ffff,[m
[32m+[m[32m0x67489017,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x700dffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6f11ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6d15ffff,[m
[32m+[m[32m0x6566cfff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0060701c,[m
[32m+[m[32m0x3955fc2f,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0064701c,[m
[32m+[m[32m0x0d487417,[m
[32m+[m[32m0x47b4ae76,[m
[32m+[m[32m0x2f13141b,[m
[32m+[m[32m0x0068701c,[m
[32m+[m[32m0x0d4c7417,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0d507417,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x797c63ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x42b56a76,[m
[32m+[m[32m0x23b45e71,[m
[32m+[m[32m0x47b4ae96,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x42b56a96,[m
[32m+[m[32m0x09025c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x09065c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x090a5c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x090e5c17,[m
[32m+[m[32m0x6456ac1d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x30125c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x73113818,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x63468c17,[m
[32m+[m[32m0x0054701c,[m
[32m+[m[32m0x47b4a675,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x30106018,[m
[32m+[m[32m0x0058701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0b42741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0b46741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x47b4a695,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x898bfc01,[m
[32m+[m[32m0x0b52741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x848b7000,[m
[32m+[m[32m0x0b56741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0c5a741d,[m
[32m+[m[32m0x7c77441c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3360bc1c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x2eba6000,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x34408000,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x23b45e72,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5f4a5fff,[m
[32m+[m[32m0x838b3800,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x604e5fff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x828a6000,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0400701c,[m
[32m+[m[32m0x535a5fff,[m
[32m+[m[32m0x63448817,[m
[32m+[m[32m0x0404701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0408701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x040c701c,[m
[32m+[m[32m0x878b480e,[m
[32m+[m[32m0x21b45dd3,[m
[32m+[m[32m0x0410701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3854bc1c,[m
[32m+[m[32m0x7f8b4408,[m
[32m+[m[32m0x1002741d,[m
[32m+[m[32m0x3b58bc1c,[m
[32m+[m[32m0x47b4a676,[m
[32m+[m[32m0x1006741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x100a741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x100e741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3012741d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x47b4a696,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5f4877ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x604c77ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5e4bfc21,[m
[32m+[m[32m0x605077ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5e4ffc21,[m
[32m+[m[32m0x4d5477ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x43b569ae,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6452a41d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x4a6ffc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3011fc1b,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x63428417,[m
[32m+[m[32m0x026a73ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x614a8417,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x614e8417,[m
[32m+[m[32m0x3755fc1c,[m
[32m+[m[32m0x78c1fc1e,[m
[32m+[m[32m0x3a59fc1c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x95c3ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x66468fff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6868d01c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5a43fc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5c47fc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x24b45eb3,[m
[32m+[m[32m0x5d4bfc17,[m
[32m+[m[32m0x22b45dd4,[m
[32m+[m[32m0x1e526817,[m
[32m+[m[32m0x5d4ffc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x4a53fc17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5057fc17,[m
[32m+[m[32m0x808b4409,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x525bfc17,[m
[32m+[m[32m0x24b45ed3,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x343e7c00,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1ac18c13,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x40b56a6e,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x456b6800,[m
[32m+[m[32m0x18abffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x40b56a8e,[m
[32m+[m[32m0x08405c00,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x95bfffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5554a7ff,[m
[32m+[m[32m0x41b56aae,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5b45fc1d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x65448bff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6866cc1c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x898bfc0e,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x41b56ace,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x4f55fc1d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x8a8bffff,[m
[32m+[m[32m0x1ac18c09,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x8b8fffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0a0bfc17,[m
[32m+[m[32m0x9193ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x9297ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6a69fc33,[m
[32m+[m[32m0x949bffff,[m
[32m+[m[32m0x24b45eb4,[m
[32m+[m[32m0x959fffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1f53fc18,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x24b45ed4,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3552bfff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1ac18c14,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x345ebfff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7167ffff,[m
[32m+[m[32m0x7b7743ff,[m
[32m+[m[32m0x8faf4400,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x898bfc04,[m
[32m+[m[32m0x546fffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x456b6801,[m
[32m+[m[32m0x8177ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x654287ff,[m
[32m+[m[32m0x8e7bffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1e52641d,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1d526017,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x49b6a81c,[m
[32m+[m[32m0x7143ffff,[m
[32m+[m[32m0x898bfc0f,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7247ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0e3e7400,[m
[32m+[m[32m0x49b4a66e,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6e53ffff,[m
[32m+[m[32m0x05685c17,[m
[32m+[m[32m0x1cc18c0a,[m
[32m+[m[32m0x6e57ffff,[m
[32m+[m[32m0x066c5c17,[m
[32m+[m[32m0x30106fff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x06705c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6966d3ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x49b4a6ae,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x1f53fc19,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x20b6701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x5855fc29,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x3c56bc2f,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x902bffff,[m
[32m+[m[32m0x858a600e,[m
[32m+[m[32m0x1ac18c15,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x05445c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x05485c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x054c5c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x05505c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x05545c17,[m
[32m+[m[32m0x456b6802,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6356ac17,[m
[32m+[m[32m0x7485fc00,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7003ffff,[m
[32m+[m[32m0x62429017,[m
[32m+[m[32m0x7789fc00,[m
[32m+[m[32m0x7007ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x47b4aa75,[m
[32m+[m[32m0x700bffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x700fffff,[m
[32m+[m[32m0x898bfc10,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6f13ffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x9517ffff,[m
[32m+[m[32m0x6968cfff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x47b4aa95,[m
[32m+[m[32m0x2db85fff,[m
[32m+[m[32m0x3653fc2f,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0062701c,[m
[32m+[m[32m0x1cc18c0b,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x2f11141b,[m
[32m+[m[32m0x0066701c,[m
[32m+[m[32m0x0d4a7417,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0d4e7417,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x797a63ff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x46b5feb3,[m
[32m+[m[32m0x3260c01c,[m
[32m+[m[32m0x316ad400,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x7c774416,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x6b15fc29,[m
[32m+[m[32m0x1f53fc1a,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x46b5fed3,[m
[32m+[m[32m0x09005c17,[m
[32m+[m[32m0x5755fc2a,[m
[32m+[m[32m0x16bd8c00,[m
[32m+[m[32m0x09045c17,[m
[32m+[m[32m0x01647017,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x09085c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x868a600f,[m
[32m+[m[32m0x1bc18c16,[m
[32m+[m[32m0x090c5c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x30105c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x09145c17,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x818bfc06,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x73133818,[m
[32m+[m[32m0x0052701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x0056701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x30126018,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0x878b4c0e,[m
[32m+[m[32m0x0b44741d,[m
[32m+[m[32m0x005e701c,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff,[m
[32m+[m[32m0xffffffff[m
[32m+[m[32m};[m
[32m+[m
[32m+[m[32m#define fold_hashkey(k)	(lj_rol(lj_rol((k),10)-(k),1)%977)[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.o[m
[1mnew file mode 100644[m
[1mindex 0000000..1986294[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..68cb642[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.o[m
[1mnew file mode 100644[m
[1mindex 0000000..0c7d917[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..c01bc79[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a05bca0[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..fac518c[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ce0bbcc[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..0a5f48c[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.o[m
[1mnew file mode 100644[m
[1mindex 0000000..7e83a63[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..56c3d84[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.o[m
[1mnew file mode 100644[m
[1mindex 0000000..b0c1d73[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..55de689[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_libdef.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_libdef.h[m
[1mnew file mode 100644[m
[1mindex 0000000..f61b8c4[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_libdef.h[m
[36m@@ -0,0 +1,414 @@[m
[32m+[m[32m/* This is a generated file. DO NOT EDIT! */[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_base[m
[32m+[m[32m#undef LJLIB_MODULE_base[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_base[] = {[m
[32m+[m[32m  lj_ffh_assert,[m
[32m+[m[32m  lj_ffh_next,[m
[32m+[m[32m  lj_ffh_pairs,[m
[32m+[m[32m  lj_ffh_ipairs_aux,[m
[32m+[m[32m  lj_ffh_ipairs,[m
[32m+[m[32m  lj_ffh_setmetatable,[m
[32m+[m[32m  lj_cf_getfenv,[m
[32m+[m[32m  lj_cf_setfenv,[m
[32m+[m[32m  lj_ffh_rawget,[m
[32m+[m[32m  lj_cf_rawset,[m
[32m+[m[32m  lj_cf_rawequal,[m
[32m+[m[32m  lj_cf_unpack,[m
[32m+[m[32m  lj_cf_select,[m
[32m+[m[32m  lj_ffh_tonumber,[m
[32m+[m[32m  lj_ffh_tostring,[m
[32m+[m[32m  lj_cf_error,[m
[32m+[m[32m  lj_ffh_pcall,[m
[32m+[m[32m  lj_cf_loadfile,[m
[32m+[m[32m  lj_cf_load,[m
[32m+[m[32m  lj_cf_loadstring,[m
[32m+[m[32m  lj_cf_dofile,[m
[32m+[m[32m  lj_cf_gcinfo,[m
[32m+[m[32m  lj_cf_collectgarbage,[m
[32m+[m[32m  lj_cf_newproxy,[m
[32m+[m[32m  lj_cf_print[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_base[] = {[m
[32m+[m[32m2,0,28,70,97,115,115,101,114,116,195,110,105,108,199,98,111,111,108,101,97,[m
[32m+[m[32m110,252,1,200,117,115,101,114,100,97,116,97,198,115,116,114,105,110,103,197,[m
[32m+[m[32m117,112,118,97,108,198,116,104,114,101,97,100,197,112,114,111,116,111,200,102,[m
[32m+[m[32m117,110,99,116,105,111,110,197,116,114,97,99,101,197,99,100,97,116,97,197,116,[m
[32m+[m[32m97,98,108,101,252,9,198,110,117,109,98,101,114,132,116,121,112,101,68,110,101,[m
[32m+[m[32m120,116,253,69,112,97,105,114,115,64,253,70,105,112,97,105,114,115,140,103,[m
[32m+[m[32m101,116,109,101,116,97,116,97,98,108,101,76,115,101,116,109,101,116,97,116,[m
[32m+[m[32m97,98,108,101,7,103,101,116,102,101,110,118,7,115,101,116,102,101,110,118,70,[m
[32m+[m[32m114,97,119,103,101,116,6,114,97,119,115,101,116,8,114,97,119,101,113,117,97,[m
[32m+[m[32m108,6,117,110,112,97,99,107,6,115,101,108,101,99,116,72,116,111,110,117,109,[m
[32m+[m[32m98,101,114,72,116,111,115,116,114,105,110,103,5,101,114,114,111,114,69,112,[m
[32m+[m[32m99,97,108,108,134,120,112,99,97,108,108,8,108,111,97,100,102,105,108,101,4,[m
[32m+[m[32m108,111,97,100,10,108,111,97,100,115,116,114,105,110,103,6,100,111,102,105,[m
[32m+[m[32m108,101,6,103,99,105,110,102,111,14,99,111,108,108,101,99,116,103,97,114,98,[m
[32m+[m[32m97,103,101,252,2,8,110,101,119,112,114,111,120,121,200,116,111,115,116,114,[m
[32m+[m[32m105,110,103,5,112,114,105,110,116,252,3,200,95,86,69,82,83,73,79,78,250,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_coroutine[m
[32m+[m[32m#undef LJLIB_MODULE_coroutine[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_coroutine[] = {[m
[32m+[m[32m  lj_cf_coroutine_status,[m
[32m+[m[32m  lj_cf_coroutine_running,[m
[32m+[m[32m  lj_cf_coroutine_create,[m
[32m+[m[32m  lj_ffh_coroutine_yield,[m
[32m+[m[32m  lj_ffh_coroutine_resume,[m
[32m+[m[32m  lj_cf_coroutine_wrap[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_coroutine[] = {[m
[32m+[m[32m30,13,6,6,115,116,97,116,117,115,7,114,117,110,110,105,110,103,6,99,114,101,[m
[32m+[m[32m97,116,101,69,121,105,101,108,100,70,114,101,115,117,109,101,254,4,119,114,[m
[32m+[m[32m97,112,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_math[m
[32m+[m[32m#undef LJLIB_MODULE_math[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_math[] = {[m
[32m+[m[32m  lj_ffh_math_abs,[m
[32m+[m[32m  lj_ffh_math_sqrt,[m
[32m+[m[32m  lj_ffh_math_log,[m
[32m+[m[32m  lj_ffh_math_atan2,[m
[32m+[m[32m  lj_ffh_math_ldexp,[m
[32m+[m[32m  lj_ffh_math_min,[m
[32m+[m[32m  lj_cf_math_random,[m
[32m+[m[32m  lj_cf_math_randomseed[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_math[] = {[m
[32m+[m[32m37,16,30,67,97,98,115,133,102,108,111,111,114,132,99,101,105,108,68,115,113,[m
[32m+[m[32m114,116,133,108,111,103,49,48,131,101,120,112,131,115,105,110,131,99,111,115,[m
[32m+[m[32m131,116,97,110,132,97,115,105,110,132,97,99,111,115,132,97,116,97,110,132,115,[m
[32m+[m[32m105,110,104,132,99,111,115,104,132,116,97,110,104,133,102,114,101,120,112,132,[m
[32m+[m[32m109,111,100,102,67,108,111,103,249,3,100,101,103,0,1,2,0,0,1,2,24,1,0,0,76,[m
[32m+[m[32m1,2,0,241,135,158,166,3,220,203,178,130,4,249,3,114,97,100,0,1,2,0,0,1,2,24,[m
[32m+[m[32m1,0,0,76,1,2,0,243,244,148,165,20,198,190,199,252,3,69,97,116,97,110,50,131,[m
[32m+[m[32m112,111,119,132,102,109,111,100,69,108,100,101,120,112,67,109,105,110,131,109,[m
[32m+[m[32m97,120,251,24,45,68,84,251,33,9,64,194,112,105,250,251,0,0,0,0,0,0,240,127,[m
[32m+[m[32m196,104,117,103,101,250,252,2,6,114,97,110,100,111,109,252,2,10,114,97,110,[m
[32m+[m[32m100,111,109,115,101,101,100,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_bit[m
[32m+[m[32m#undef LJLIB_MODULE_bit[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_bit[] = {[m
[32m+[m[32m  lj_ffh_bit_tobit,[m
[32m+[m[32m  lj_ffh_bit_bnot,[m
[32m+[m[32m  lj_ffh_bit_bswap,[m
[32m+[m[32m  lj_ffh_bit_lshift,[m
[32m+[m[32m  lj_ffh_bit_band,[m
[32m+[m[32m  lj_cf_bit_tohex[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_bit[] = {[m
[32m+[m[32m63,40,12,69,116,111,98,105,116,68,98,110,111,116,69,98,115,119,97,112,70,108,[m
[32m+[m[32m115,104,105,102,116,134,114,115,104,105,102,116,135,97,114,115,104,105,102,[m
[32m+[m[32m116,131,114,111,108,131,114,111,114,68,98,97,110,100,131,98,111,114,132,98,[m
[32m+[m[32m120,111,114,5,116,111,104,101,120,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_string[m
[32m+[m[32m#undef LJLIB_MODULE_string[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_string[] = {[m
[32m+[m[32m  lj_ffh_string_byte,[m
[32m+[m[32m  lj_ffh_string_char,[m
[32m+[m[32m  lj_ffh_string_sub,[m
[32m+[m[32m  lj_cf_string_rep,[m
[32m+[m[32m  lj_ffh_string_reverse,[m
[32m+[m[32m  lj_cf_string_dump,[m
[32m+[m[32m  lj_cf_string_find,[m
[32m+[m[32m  lj_cf_string_match,[m
[32m+[m[32m  lj_cf_string_gmatch,[m
[32m+[m[32m  lj_cf_string_gsub,[m
[32m+[m[32m  lj_cf_string_format[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_string[] = {[m
[32m+[m[32m75,51,14,249,3,108,101,110,0,1,2,0,0,0,3,16,0,5,0,21,1,0,0,76,1,2,0,68,98,121,[m
[32m+[m[32m116,101,68,99,104,97,114,67,115,117,98,3,114,101,112,71,114,101,118,101,114,[m
[32m+[m[32m115,101,133,108,111,119,101,114,133,117,112,112,101,114,4,100,117,109,112,4,[m
[32m+[m[32m102,105,110,100,5,109,97,116,99,104,254,6,103,109,97,116,99,104,4,103,115,117,[m
[32m+[m[32m98,6,102,111,114,109,97,116,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_table[m
[32m+[m[32m#undef LJLIB_MODULE_table[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_table[] = {[m
[32m+[m[32m  lj_cf_table_maxn,[m
[32m+[m[32m  lj_cf_table_insert,[m
[32m+[m[32m  lj_cf_table_concat,[m
[32m+[m[32m  lj_cf_table_sort[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_table[] = {[m
[32m+[m[32m89,57,8,249,8,102,111,114,101,97,99,104,105,0,2,9,0,0,0,15,16,0,12,0,16,1,9,[m
[32m+[m[32m0,41,2,1,0,21,3,0,0,41,4,1,0,77,2,8,128,18,6,1,0,18,7,5,0,59,8,5,0,66,6,3,2,[m
[32m+[m[32m10,6,0,0,88,7,1,128,76,6,2,0,79,2,248,127,75,0,1,0,249,7,102,111,114,101,97,[m
[32m+[m[32m99,104,0,2,10,0,0,0,16,16,0,12,0,16,1,9,0,43,2,0,0,18,3,0,0,41,4,0,0,88,5,7,[m
[32m+[m[32m128,18,7,1,0,18,8,5,0,18,9,6,0,66,7,3,2,10,7,0,0,88,8,1,128,76,7,2,0,70,5,3,[m
[32m+[m[32m3,82,5,247,127,75,0,1,0,249,4,103,101,116,110,0,1,2,0,0,0,3,16,0,12,0,21,1,[m
[32m+[m[32m0,0,76,1,2,0,4,109,97,120,110,6,105,110,115,101,114,116,249,6,114,101,109,111,[m
[32m+[m[32m118,101,0,2,10,0,0,2,30,16,0,12,0,21,2,0,0,11,1,0,0,88,3,7,128,8,2,0,0,88,3,[m
[32m+[m[32m23,128,59,3,2,0,43,4,0,0,64,4,2,0,76,3,2,0,88,3,18,128,17,1,15,0,41,3,1,0,3,[m
[32m+[m[32m3,1,0,88,3,14,128,3,1,2,0,88,3,12,128,59,3,1,0,22,4,1,1,18,5,2,0,41,6,1,0,77,[m
[32m+[m[32m4,4,128,23,8,1,7,59,9,7,0,64,9,8,0,79,4,252,127,43,4,0,0,64,4,2,0,76,3,2,0,[m
[32m+[m[32m75,0,1,0,0,2,6,99,111,110,99,97,116,4,115,111,114,116,254,254,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_io_method[m
[32m+[m[32m#undef LJLIB_MODULE_io_method[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_io_method[] = {[m
[32m+[m[32m  lj_cf_io_method_close,[m
[32m+[m[32m  lj_cf_io_method_read,[m
[32m+[m[32m  lj_cf_io_method_write,[m
[32m+[m[32m  lj_cf_io_method_flush,[m
[32m+[m[32m  lj_cf_io_method_seek,[m
[32m+[m[32m  lj_cf_io_method_setvbuf,[m
[32m+[m[32m  lj_cf_io_method_lines,[m
[32m+[m[32m  lj_cf_io_method___gc,[m
[32m+[m[32m  lj_cf_io_method___tostring[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_io_method[] = {[m
[32m+[m[32m95,57,10,5,99,108,111,115,101,4,114,101,97,100,5,119,114,105,116,101,5,102,[m
[32m+[m[32m108,117,115,104,4,115,101,101,107,7,115,101,116,118,98,117,102,5,108,105,110,[m
[32m+[m[32m101,115,4,95,95,103,99,10,95,95,116,111,115,116,114,105,110,103,252,1,199,95,[m
[32m+[m[32m95,105,110,100,101,120,250,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_io[m
[32m+[m[32m#undef LJLIB_MODULE_io[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_io[] = {[m
[32m+[m[32m  lj_cf_io_open,[m
[32m+[m[32m  lj_cf_io_popen,[m
[32m+[m[32m  lj_cf_io_tmpfile,[m
[32m+[m[32m  lj_cf_io_close,[m
[32m+[m[32m  lj_cf_io_read,[m
[32m+[m[32m  lj_cf_io_write,[m
[32m+[m[32m  lj_cf_io_flush,[m
[32m+[m[32m  lj_cf_io_input,[m
[32m+[m[32m  lj_cf_io_output,[m
[32m+[m[32m  lj_cf_io_lines,[m
[32m+[m[32m  lj_cf_io_type[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_io[] = {[m
[32m+[m[32m104,57,12,252,2,192,250,4,111,112,101,110,5,112,111,112,101,110,7,116,109,112,[m
[32m+[m[32m102,105,108,101,5,99,108,111,115,101,4,114,101,97,100,5,119,114,105,116,101,[m
[32m+[m[32m5,102,108,117,115,104,5,105,110,112,117,116,6,111,117,116,112,117,116,5,108,[m
[32m+[m[32m105,110,101,115,4,116,121,112,101,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_os[m
[32m+[m[32m#undef LJLIB_MODULE_os[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_os[] = {[m
[32m+[m[32m  lj_cf_os_execute,[m
[32m+[m[32m  lj_cf_os_remove,[m
[32m+[m[32m  lj_cf_os_rename,[m
[32m+[m[32m  lj_cf_os_tmpname,[m
[32m+[m[32m  lj_cf_os_getenv,[m
[32m+[m[32m  lj_cf_os_exit,[m
[32m+[m[32m  lj_cf_os_clock,[m
[32m+[m[32m  lj_cf_os_date,[m
[32m+[m[32m  lj_cf_os_time,[m
[32m+[m[32m  lj_cf_os_difftime,[m
[32m+[m[32m  lj_cf_os_setlocale[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_os[] = {[m
[32m+[m[32m115,57,11,7,101,120,101,99,117,116,101,6,114,101,109,111,118,101,6,114,101,[m
[32m+[m[32m110,97,109,101,7,116,109,112,110,97,109,101,6,103,101,116,101,110,118,4,101,[m
[32m+[m[32m120,105,116,5,99,108,111,99,107,4,100,97,116,101,4,116,105,109,101,8,100,105,[m
[32m+[m[32m102,102,116,105,109,101,9,115,101,116,108,111,99,97,108,101,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_debug[m
[32m+[m[32m#undef LJLIB_MODULE_debug[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_debug[] = {[m
[32m+[m[32m  lj_cf_debug_getregistry,[m
[32m+[m[32m  lj_cf_debug_getmetatable,[m
[32m+[m[32m  lj_cf_debug_setmetatable,[m
[32m+[m[32m  lj_cf_debug_getfenv,[m
[32m+[m[32m  lj_cf_debug_setfenv,[m
[32m+[m[32m  lj_cf_debug_getinfo,[m
[32m+[m[32m  lj_cf_debug_getlocal,[m
[32m+[m[32m  lj_cf_debug_setlocal,[m
[32m+[m[32m  lj_cf_debug_getupvalue,[m
[32m+[m[32m  lj_cf_debug_setupvalue,[m
[32m+[m[32m  lj_cf_debug_upvalueid,[m
[32m+[m[32m  lj_cf_debug_upvaluejoin,[m
[32m+[m[32m  lj_cf_debug_sethook,[m
[32m+[m[32m  lj_cf_debug_gethook,[m
[32m+[m[32m  lj_cf_debug_debug,[m
[32m+[m[32m  lj_cf_debug_traceback[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_debug[] = {[m
[32m+[m[32m126,57,16,11,103,101,116,114,101,103,105,115,116,114,121,12,103,101,116,109,[m
[32m+[m[32m101,116,97,116,97,98,108,101,12,115,101,116,109,101,116,97,116,97,98,108,101,[m
[32m+[m[32m7,103,101,116,102,101,110,118,7,115,101,116,102,101,110,118,7,103,101,116,105,[m
[32m+[m[32m110,102,111,8,103,101,116,108,111,99,97,108,8,115,101,116,108,111,99,97,108,[m
[32m+[m[32m10,103,101,116,117,112,118,97,108,117,101,10,115,101,116,117,112,118,97,108,[m
[32m+[m[32m117,101,9,117,112,118,97,108,117,101,105,100,11,117,112,118,97,108,117,101,[m
[32m+[m[32m106,111,105,110,7,115,101,116,104,111,111,107,7,103,101,116,104,111,111,107,[m
[32m+[m[32m5,100,101,98,117,103,9,116,114,97,99,101,98,97,99,107,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_jit[m
[32m+[m[32m#undef LJLIB_MODULE_jit[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_jit[] = {[m
[32m+[m[32m  lj_cf_jit_on,[m
[32m+[m[32m  lj_cf_jit_off,[m
[32m+[m[32m  lj_cf_jit_flush,[m
[32m+[m[32m  lj_cf_jit_status,[m
[32m+[m[32m  lj_cf_jit_attach[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_jit[] = {[m
[32m+[m[32m142,57,9,2,111,110,3,111,102,102,5,102,108,117,115,104,6,115,116,97,116,117,[m
[32m+[m[32m115,6,97,116,116,97,99,104,252,5,194,111,115,250,252,4,196,97,114,99,104,250,[m
[32m+[m[32m252,3,203,118,101,114,115,105,111,110,95,110,117,109,250,252,2,199,118,101,[m
[32m+[m[32m114,115,105,111,110,250,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_jit_util[m
[32m+[m[32m#undef LJLIB_MODULE_jit_util[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_jit_util[] = {[m
[32m+[m[32m  lj_cf_jit_util_funcinfo,[m
[32m+[m[32m  lj_cf_jit_util_funcbc,[m
[32m+[m[32m  lj_cf_jit_util_funck,[m
[32m+[m[32m  lj_cf_jit_util_funcuvname,[m
[32m+[m[32m  lj_cf_jit_util_traceinfo,[m
[32m+[m[32m  lj_cf_jit_util_traceir,[m
[32m+[m[32m  lj_cf_jit_util_tracek,[m
[32m+[m[32m  lj_cf_jit_util_tracesnap,[m
[32m+[m[32m  lj_cf_jit_util_tracemc,[m
[32m+[m[32m  lj_cf_jit_util_traceexitstub,[m
[32m+[m[32m  lj_cf_jit_util_ircalladdr[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_jit_util[] = {[m
[32m+[m[32m147,57,11,8,102,117,110,99,105,110,102,111,6,102,117,110,99,98,99,5,102,117,[m
[32m+[m[32m110,99,107,10,102,117,110,99,117,118,110,97,109,101,9,116,114,97,99,101,105,[m
[32m+[m[32m110,102,111,7,116,114,97,99,101,105,114,6,116,114,97,99,101,107,9,116,114,97,[m
[32m+[m[32m99,101,115,110,97,112,7,116,114,97,99,101,109,99,13,116,114,97,99,101,101,120,[m
[32m+[m[32m105,116,115,116,117,98,10,105,114,99,97,108,108,97,100,100,114,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_jit_opt[m
[32m+[m[32m#undef LJLIB_MODULE_jit_opt[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_jit_opt[] = {[m
[32m+[m[32m  lj_cf_jit_opt_start[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_jit_opt[] = {[m
[32m+[m[32m158,57,1,5,115,116,97,114,116,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_jit_profile[m
[32m+[m[32m#undef LJLIB_MODULE_jit_profile[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_jit_profile[] = {[m
[32m+[m[32m  lj_cf_jit_profile_start,[m
[32m+[m[32m  lj_cf_jit_profile_stop,[m
[32m+[m[32m  lj_cf_jit_profile_dumpstack[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_jit_profile[] = {[m
[32m+[m[32m159,57,3,5,115,116,97,114,116,4,115,116,111,112,9,100,117,109,112,115,116,97,[m
[32m+[m[32m99,107,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_ffi_meta[m
[32m+[m[32m#undef LJLIB_MODULE_ffi_meta[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_ffi_meta[] = {[m
[32m+[m[32m  lj_cf_ffi_meta___index,[m
[32m+[m[32m  lj_cf_ffi_meta___newindex,[m
[32m+[m[32m  lj_cf_ffi_meta___eq,[m
[32m+[m[32m  lj_cf_ffi_meta___len,[m
[32m+[m[32m  lj_cf_ffi_meta___lt,[m
[32m+[m[32m  lj_cf_ffi_meta___le,[m
[32m+[m[32m  lj_cf_ffi_meta___concat,[m
[32m+[m[32m  lj_cf_ffi_meta___call,[m
[32m+[m[32m  lj_cf_ffi_meta___add,[m
[32m+[m[32m  lj_cf_ffi_meta___sub,[m
[32m+[m[32m  lj_cf_ffi_meta___mul,[m
[32m+[m[32m  lj_cf_ffi_meta___div,[m
[32m+[m[32m  lj_cf_ffi_meta___mod,[m
[32m+[m[32m  lj_cf_ffi_meta___pow,[m
[32m+[m[32m  lj_cf_ffi_meta___unm,[m
[32m+[m[32m  lj_cf_ffi_meta___tostring,[m
[32m+[m[32m  lj_cf_ffi_meta___pairs,[m
[32m+[m[32m  lj_cf_ffi_meta___ipairs[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_ffi_meta[] = {[m
[32m+[m[32m162,57,19,7,95,95,105,110,100,101,120,10,95,95,110,101,119,105,110,100,101,[m
[32m+[m[32m120,4,95,95,101,113,5,95,95,108,101,110,4,95,95,108,116,4,95,95,108,101,8,95,[m
[32m+[m[32m95,99,111,110,99,97,116,6,95,95,99,97,108,108,5,95,95,97,100,100,5,95,95,115,[m
[32m+[m[32m117,98,5,95,95,109,117,108,5,95,95,100,105,118,5,95,95,109,111,100,5,95,95,[m
[32m+[m[32m112,111,119,5,95,95,117,110,109,10,95,95,116,111,115,116,114,105,110,103,7,[m
[32m+[m[32m95,95,112,97,105,114,115,8,95,95,105,112,97,105,114,115,195,102,102,105,203,[m
[32m+[m[32m95,95,109,101,116,97,116,97,98,108,101,250,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_ffi_clib[m
[32m+[m[32m#undef LJLIB_MODULE_ffi_clib[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_ffi_clib[] = {[m
[32m+[m[32m  lj_cf_ffi_clib___index,[m
[32m+[m[32m  lj_cf_ffi_clib___newindex,[m
[32m+[m[32m  lj_cf_ffi_clib___gc[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_ffi_clib[] = {[m
[32m+[m[32m180,57,3,7,95,95,105,110,100,101,120,10,95,95,110,101,119,105,110,100,101,120,[m
[32m+[m[32m4,95,95,103,99,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_ffi_callback[m
[32m+[m[32m#undef LJLIB_MODULE_ffi_callback[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_ffi_callback[] = {[m
[32m+[m[32m  lj_cf_ffi_callback_free,[m
[32m+[m[32m  lj_cf_ffi_callback_set[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_ffi_callback[] = {[m
[32m+[m[32m183,57,3,4,102,114,101,101,3,115,101,116,252,1,199,95,95,105,110,100,101,120,[m
[32m+[m[32m250,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[32m+[m[32m#ifdef LJLIB_MODULE_ffi[m
[32m+[m[32m#undef LJLIB_MODULE_ffi[m
[32m+[m[32mstatic const lua_CFunction lj_lib_cf_ffi[] = {[m
[32m+[m[32m  lj_cf_ffi_cdef,[m
[32m+[m[32m  lj_cf_ffi_new,[m
[32m+[m[32m  lj_cf_ffi_cast,[m
[32m+[m[32m  lj_cf_ffi_typeof,[m
[32m+[m[32m  lj_cf_ffi_typeinfo,[m
[32m+[m[32m  lj_cf_ffi_istype,[m
[32m+[m[32m  lj_cf_ffi_sizeof,[m
[32m+[m[32m  lj_cf_ffi_alignof,[m
[32m+[m[32m  lj_cf_ffi_offsetof,[m
[32m+[m[32m  lj_cf_ffi_errno,[m
[32m+[m[32m  lj_cf_ffi_string,[m
[32m+[m[32m  lj_cf_ffi_copy,[m
[32m+[m[32m  lj_cf_ffi_fill,[m
[32m+[m[32m  lj_cf_ffi_abi,[m
[32m+[m[32m  lj_cf_ffi_metatype,[m
[32m+[m[32m  lj_cf_ffi_gc,[m
[32m+[m[32m  lj_cf_ffi_load[m
[32m+[m[32m};[m
[32m+[m[32mstatic const uint8_t lj_lib_init_ffi[] = {[m
[32m+[m[32m185,57,23,4,99,100,101,102,3,110,101,119,4,99,97,115,116,6,116,121,112,101,[m
[32m+[m[32m111,102,8,116,121,112,101,105,110,102,111,6,105,115,116,121,112,101,6,115,105,[m
[32m+[m[32m122,101,111,102,7,97,108,105,103,110,111,102,8,111,102,102,115,101,116,111,[m
[32m+[m[32m102,5,101,114,114,110,111,6,115,116,114,105,110,103,4,99,111,112,121,4,102,[m
[32m+[m[32m105,108,108,3,97,98,105,252,8,192,250,8,109,101,116,97,116,121,112,101,252,[m
[32m+[m[32m7,192,250,2,103,99,252,5,192,250,4,108,111,97,100,252,4,193,67,250,252,3,194,[m
[32m+[m[32m111,115,250,252,2,196,97,114,99,104,250,255[m
[32m+[m[32m};[m
[32m+[m[32m#endif[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load.o[m
[1mnew file mode 100644[m
[1mindex 0000000..3065ff5[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..74eee40[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.o[m
[1mnew file mode 100644[m
[1mindex 0000000..8584713[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..424f578[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.o[m
[1mnew file mode 100644[m
[1mindex 0000000..c340057[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..e800d07[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.o[m
[1mnew file mode 100644[m
[1mindex 0000000..062bd36[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ede3171[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce.o[m
[1mnew file mode 100644[m
[1mindex 0000000..f23806b[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..d81a5b2[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold.o[m
[1mnew file mode 100644[m
[1mindex 0000000..c42ad19[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ac3002b[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop.o[m
[1mnew file mode 100644[m
[1mindex 0000000..58ec416[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..26e2413[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem.o[m
[1mnew file mode 100644[m
[1mindex 0000000..b4682e0[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a6a1118[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow.o[m
[1mnew file mode 100644[m
[1mindex 0000000..d8ec5a5[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..839e436[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink.o[m
[1mnew file mode 100644[m
[1mindex 0000000..fee238f[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..42ec62d[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split.o[m
[1mnew file mode 100644[m
[1mindex 0000000..dbbf665[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..453dd7d[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.o[m
[1mnew file mode 100644[m
[1mindex 0000000..3fbb8db[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..926b1e9[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a68f224[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..d0ef27e[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_recdef.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_recdef.h[m
[1mnew file mode 100644[m
[1mindex 0000000..fe40b2d[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_recdef.h[m
[36m@@ -0,0 +1,270 @@[m
[32m+[m[32m/* This is a generated file. DO NOT EDIT! */[m
[32m+[m
[32m+[m[32mstatic const uint16_t recff_idmap[] = {[m
[32m+[m[32m0,[m
[32m+[m[32m0x0100,[m
[32m+[m[32m0x0200,[m
[32m+[m[32m0x0300,[m
[32m+[m[32m0,[m
[32m+[m[32m0x0400+(0),[m
[32m+[m[32m0x0500,[m
[32m+[m[32m0x0400+(1),[m
[32m+[m[32m0x0600,[m
[32m+[m[32m0x0700,[m
[32m+[m[32m0x0800,[m
[32m+[m[32m0,[m
[32m+[m[32m0x0900,[m
[32m+[m[32m0x0a00,[m
[32m+[m[32m0x0b00,[m
[32m+[m[32m0,[m
[32m+[m[32m0x0c00,[m
[32m+[m[32m0x0d00,[m
[32m+[m[32m0x0e00,[m
[32m+[m[32m0,[m
[32m+[m[32m0x0f00,[m
[32m+[m[32m0x1000,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0x1100,[m
[32m+[m[32m0x1200+(IRFPM_FLOOR),[m
[32m+[m[32m0x1200+(IRFPM_CEIL),[m
[32m+[m[32m0x1300+(IRFPM_SQRT),[m
[32m+[m[32m0x1300+(IRFPM_LOG10),[m
[32m+[m[32m0x1300+(IRFPM_EXP),[m
[32m+[m[32m0x1300+(IRFPM_SIN),[m
[32m+[m[32m0x1300+(IRFPM_COS),[m
[32m+[m[32m0x1300+(IRFPM_TAN),[m
[32m+[m[32m0x1400+(FF_math_asin),[m
[32m+[m[32m0x1400+(FF_math_acos),[m
[32m+[m[32m0x1400+(FF_math_atan),[m
[32m+[m[32m0x1500+(IRCALL_sinh),[m
[32m+[m[32m0x1500+(IRCALL_cosh),[m
[32m+[m[32m0x1500+(IRCALL_tanh),[m
[32m+[m[32m0,[m
[32m+[m[32m0x1600,[m
[32m+[m[32m0x1700,[m
[32m+[m[32m0x1800,[m
[32m+[m[32m0x1900,[m
[32m+[m[32m0,[m
[32m+[m[32m0x1a00,[m
[32m+[m[32m0x1b00+(IR_MIN),[m
[32m+[m[32m0x1b00+(IR_MAX),[m
[32m+[m[32m0x1c00,[m
[32m+[m[32m0,[m
[32m+[m[32m0x1d00,[m
[32m+[m[32m0x1e00+(IR_BNOT),[m
[32m+[m[32m0x1e00+(IR_BSWAP),[m
[32m+[m[32m0x1f00+(IR_BSHL),[m
[32m+[m[32m0x1f00+(IR_BSHR),[m
[32m+[m[32m0x1f00+(IR_BSAR),[m
[32m+[m[32m0x1f00+(IR_BROL),[m
[32m+[m[32m0x1f00+(IR_BROR),[m
[32m+[m[32m0x2000+(IR_BAND),[m
[32m+[m[32m0x2000+(IR_BOR),[m
[32m+[m[32m0x2000+(IR_BXOR),[m
[32m+[m[32m0x2100,[m
[32m+[m[32m0x2200+(0),[m
[32m+[m[32m0x2300,[m
[32m+[m[32m0x2200+(1),[m
[32m+[m[32m0x2400,[m
[32m+[m[32m0x2500+(IRCALL_lj_buf_putstr_reverse),[m
[32m+[m[32m0x2500+(IRCALL_lj_buf_putstr_lower),[m
[32m+[m[32m0x2500+(IRCALL_lj_buf_putstr_upper),[m
[32m+[m[32m0,[m
[32m+[m[32m0x2600,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0x2700,[m
[32m+[m[32m0,[m
[32m+[m[32m0x2800,[m
[32m+[m[32m0x2900,[m
[32m+[m[32m0,[m
[32m+[m[32m0x2a00,[m
[32m+[m[32m0x2b00,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0x2c00+(0),[m
[32m+[m[32m0x2d00+(0),[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0x2c00+(GCROOT_IO_OUTPUT),[m
[32m+[m[32m0x2d00+(GCROOT_IO_OUTPUT),[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0x2e00,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0x2f00+(0),[m
[32m+[m[32m0x2f00+(1),[m
[32m+[m[32m0x3000+(MM_eq),[m
[32m+[m[32m0x3000+(MM_len),[m
[32m+[m[32m0x3000+(MM_lt),[m
[32m+[m[32m0x3000+(MM_le),[m
[32m+[m[32m0x3000+(MM_concat),[m
[32m+[m[32m0x3100,[m
[32m+[m[32m0x3000+(MM_add),[m
[32m+[m[32m0x3000+(MM_sub),[m
[32m+[m[32m0x3000+(MM_mul),[m
[32m+[m[32m0x3000+(MM_div),[m
[32m+[m[32m0x3000+(MM_mod),[m
[32m+[m[32m0x3000+(MM_pow),[m
[32m+[m[32m0x3000+(MM_unm),[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0x3200+(1),[m
[32m+[m[32m0x3200+(0),[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0,[m
[32m+[m[32m0x3300,[m
[32m+[m[32m0x3300,[m
[32m+[m[32m0x3400,[m
[32m+[m[32m0,[m
[32m+[m[32m0x3500,[m
[32m+[m[32m0x3600+(FF_ffi_sizeof),[m
[32m+[m[32m0x3600+(FF_ffi_alignof),[m
[32m+[m[32m0x3600+(FF_ffi_offsetof),[m
[32m+[m[32m0x3700,[m
[32m+[m[32m0x3800,[m
[32m+[m[32m0x3900,[m
[32m+[m[32m0x3a00,[m
[32m+[m[32m0x3b00,[m
[32m+[m[32m0,[m
[32m+[m[32m0x3c00[m
[32m+[m[32m};[m
[32m+[m
[32m+[m[32mstatic const RecordFunc recff_func[] = {[m
[32m+[m[32mrecff_nyi,[m
[32m+[m[32mrecff_c,[m
[32m+[m[32mrecff_assert,[m
[32m+[m[32mrecff_type,[m
[32m+[m[32mrecff_xpairs,[m
[32m+[m[32mrecff_ipairs_aux,[m
[32m+[m[32mrecff_getmetatable,[m
[32m+[m[32mrecff_setmetatable,[m
[32m+[m[32mrecff_getfenv,[m
[32m+[m[32mrecff_rawget,[m
[32m+[m[32mrecff_rawset,[m
[32m+[m[32mrecff_rawequal,[m
[32m+[m[32mrecff_select,[m
[32m+[m[32mrecff_tonumber,[m
[32m+[m[32mrecff_tostring,[m
[32m+[m[32mrecff_pcall,[m
[32m+[m[32mrecff_xpcall,[m
[32m+[m[32mrecff_math_abs,[m
[32m+[m[32mrecff_math_round,[m
[32m+[m[32mrecff_math_unary,[m
[32m+[m[32mrecff_math_atrig,[m
[32m+[m[32mrecff_math_htrig,[m
[32m+[m[32mrecff_math_modf,[m
[32m+[m[32mrecff_math_log,[m
[32m+[m[32mrecff_math_atan2,[m
[32m+[m[32mrecff_math_pow,[m
[32m+[m[32mrecff_math_ldexp,[m
[32m+[m[32mrecff_math_minmax,[m
[32m+[m[32mrecff_math_random,[m
[32m+[m[32mrecff_bit_tobit,[m
[32m+[m[32mrecff_bit_unary,[m
[32m+[m[32mrecff_bit_shift,[m
[32m+[m[32mrecff_bit_nary,[m
[32m+[m[32mrecff_bit_tohex,[m
[32m+[m[32mrecff_string_range,[m
[32m+[m[32mrecff_string_char,[m
[32m+[m[32mrecff_string_rep,[m
[32m+[m[32mrecff_string_op,[m
[32m+[m[32mrecff_string_find,[m
[32m+[m[32mrecff_string_format,[m
[32m+[m[32mrecff_table_insert,[m
[32m+[m[32mrecff_table_concat,[m
[32m+[m[32mrecff_table_new,[m
[32m+[m[32mrecff_table_clear,[m
[32m+[m[32mrecff_io_write,[m
[32m+[m[32mrecff_io_flush,[m
[32m+[m[32mrecff_debug_getmetatable,[m
[32m+[m[32mrecff_cdata_index,[m
[32m+[m[32mrecff_cdata_arith,[m
[32m+[m[32mrecff_cdata_call,[m
[32m+[m[32mrecff_clib_index,[m
[32m+[m[32mrecff_ffi_new,[m
[32m+[m[32mrecff_ffi_typeof,[m
[32m+[m[32mrecff_ffi_istype,[m
[32m+[m[32mrecff_ffi_xof,[m
[32m+[m[32mrecff_ffi_errno,[m
[32m+[m[32mrecff_ffi_string,[m
[32m+[m[32mrecff_ffi_copy,[m
[32m+[m[32mrecff_ffi_fill,[m
[32m+[m[32mrecff_ffi_abi,[m
[32m+[m[32mrecff_ffi_gc[m
[32m+[m[32m};[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.o[m
[1mnew file mode 100644[m
[1mindex 0000000..7d7ba88[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..eb3a209[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.o[m
[1mnew file mode 100644[m
[1mindex 0000000..90f2868[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..8e922b7[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.o[m
[1mnew file mode 100644[m
[1mindex 0000000..8107152[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..2a24f2a[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.o[m
[1mnew file mode 100644[m
[1mindex 0000000..d0884c5[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..b3c79d7[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.o[m
[1mnew file mode 100644[m
[1mindex 0000000..8b10991[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..4a3f038[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num.o[m
[1mnew file mode 100644[m
[1mindex 0000000..d6de1a6[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ce51494[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.o[m
[1mnew file mode 100644[m
[1mindex 0000000..aa4b317[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a57204d[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.o[m
[1mnew file mode 100644[m
[1mindex 0000000..badd20d[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..9dec557[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.o[m
[1mnew file mode 100644[m
[1mindex 0000000..22438c1[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..77d3010[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a3c4503[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..397b0ec[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.S b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.S[m
[1mnew file mode 100644[m
[1mindex 0000000..2380e20[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.S[m
[36m@@ -0,0 +1,2729 @@[m
[32m+[m	[32m.file "buildvm_x86.dasc"[m
[32m+[m	[32m.text[m
[32m+[m	[32m.p2align 4[m
[32m+[m
[32m+[m	[32m.globl lj_vm_asm_begin[m
[32m+[m	[32m.hidden lj_vm_asm_begin[m
[32m+[m	[32m.type lj_vm_asm_begin, @object[m
[32m+[m	[32m.size lj_vm_asm_begin, 0[m
[32m+[m[32mlj_vm_asm_begin:[m
[32m+[m[32m.Lbegin:[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISLT[m
[32m+[m	[32m.hidden lj_BC_ISLT[m
[32m+[m	[32m.type lj_BC_ISLT, @function[m
[32m+[m	[32m.size lj_BC_ISLT, 72[m
[32m+[m[32mlj_BC_ISLT:[m
[32m+[m	[32m.byte 129,124,202,4,255,255,254,255,15,131,81,30,0,0,129,124[m
[32m+[m	[32m.byte 194,4,255,255,254,255,15,131,67,30,0,0,242,15,16,4[m
[32m+[m	[32m.byte 194,131,195,4,102,15,46,4,202,118,11,15,183,67,254,141[m
[32m+[m	[32m.byte 156,131,0,0,254,255,139,3,15,182,204,15,182,232,131,195[m
[32m+[m	[32m.byte 4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISGE[m
[32m+[m	[32m.hidden lj_BC_ISGE[m
[32m+[m	[32m.type lj_BC_ISGE, @function[m
[32m+[m	[32m.size lj_BC_ISGE, 72[m
[32m+[m[32mlj_BC_ISGE:[m
[32m+[m	[32m.byte 129,124,202,4,255,255,254,255,15,131,9,30,0,0,129,124[m
[32m+[m	[32m.byte 194,4,255,255,254,255,15,131,251,29,0,0,242,15,16,4[m
[32m+[m	[32m.byte 194,131,195,4,102,15,46,4,202,119,11,15,183,67,254,141[m
[32m+[m	[32m.byte 156,131,0,0,254,255,139,3,15,182,204,15,182,232,131,195[m
[32m+[m	[32m.byte 4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISLE[m
[32m+[m	[32m.hidden lj_BC_ISLE[m
[32m+[m	[32m.type lj_BC_ISLE, @function[m
[32m+[m	[32m.size lj_BC_ISLE, 72[m
[32m+[m[32mlj_BC_ISLE:[m
[32m+[m	[32m.byte 129,124,202,4,255,255,254,255,15,131,193,29,0,0,129,124[m
[32m+[m	[32m.byte 194,4,255,255,254,255,15,131,179,29,0,0,242,15,16,4[m
[32m+[m	[32m.byte 194,131,195,4,102,15,46,4,202,114,11,15,183,67,254,141[m
[32m+[m	[32m.byte 156,131,0,0,254,255,139,3,15,182,204,15,182,232,131,195[m
[32m+[m	[32m.byte 4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISGT[m
[32m+[m	[32m.hidden lj_BC_ISGT[m
[32m+[m	[32m.type lj_BC_ISGT, @function[m
[32m+[m	[32m.size lj_BC_ISGT, 72[m
[32m+[m[32mlj_BC_ISGT:[m
[32m+[m	[32m.byte 129,124,202,4,255,255,254,255,15,131,121,29,0,0,129,124[m
[32m+[m	[32m.byte 194,4,255,255,254,255,15,131,107,29,0,0,242,15,16,4[m
[32m+[m	[32m.byte 194,131,195,4,102,15,46,4,202,115,11,15,183,67,254,141[m
[32m+[m	[32m.byte 156,131,0,0,254,255,139,3,15,182,204,15,182,232,131,195[m
[32m+[m	[32m.byte 4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISEQV[m
[32m+[m	[32m.hidden lj_BC_ISEQV[m
[32m+[m	[32m.type lj_BC_ISEQV, @function[m
[32m+[m	[32m.size lj_BC_ISEQV, 139[m
[32m+[m[32mlj_BC_ISEQV:[m
[32m+[m	[32m.byte 139,108,194,4,131,195,4,129,253,255,255,254,255,115,53,129[m
[32m+[m	[32m.byte 124,202,4,255,255,254,255,115,43,242,15,16,4,202,102,15[m
[32m+[m	[32m.byte 46,4,194,122,13,117,11,15,183,67,254,141,156,131,0,0[m
[32m+[m	[32m.byte 254,255,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238,131,253,245,15,132,106,29,0,0,131,124,202[m
[32m+[m	[32m.byte 4,245,15,132,95,29,0,0,57,108,202,4,117,212,131,253[m
[32m+[m	[32m.byte 253,115,196,139,12,202,139,4,194,57,193,116,186,131,253,244[m
[32m+[m	[32m.byte 119,192,131,253,243,114,187,139,105,16,133,237,116,180,246,69[m
[32m+[m	[32m.byte 6,16,117,174,49,237,233,15,29,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISNEV[m
[32m+[m	[32m.hidden lj_BC_ISNEV[m
[32m+[m	[32m.type lj_BC_ISNEV, @function[m
[32m+[m	[32m.size lj_BC_ISNEV, 142[m
[32m+[m[32mlj_BC_ISNEV:[m
[32m+[m	[32m.byte 139,108,194,4,131,195,4,129,253,255,255,254,255,115,53,129[m
[32m+[m	[32m.byte 124,202,4,255,255,254,255,115,43,242,15,16,4,202,102,15[m
[32m+[m	[32m.byte 46,4,194,122,2,116,11,15,183,67,254,141,156,131,0,0[m
[32m+[m	[32m.byte 254,255,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238,131,253,245,15,132,223,28,0,0,131,124,202[m
[32m+[m	[32m.byte 4,245,15,132,212,28,0,0,57,108,202,4,117,201,131,253[m
[32m+[m	[32m.byte 253,115,207,139,12,202,139,4,194,57,193,116,197,131,253,244[m
[32m+[m	[32m.byte 119,181,131,253,243,114,176,139,105,16,133,237,116,169,246,69[m
[32m+[m	[32m.byte 6,16,117,163,189,1,0,0,0,233,129,28,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISEQS[m
[32m+[m	[32m.hidden lj_BC_ISEQS[m
[32m+[m	[32m.type lj_BC_ISEQS, @function[m
[32m+[m	[32m.size lj_BC_ISEQS, 63[m
[32m+[m[32mlj_BC_ISEQS:[m
[32m+[m	[32m.byte 72,247,208,139,108,202,4,131,195,4,131,253,251,117,38,139[m
[32m+[m	[32m.byte 12,202,65,59,12,135,117,11,15,183,67,254,141,156,131,0[m
[32m+[m	[32m.byte 0,254,255,139,3,15,182,204,15,182,232,131,195,4,193,232[m
[32m+[m	[32m.byte 16,65,255,36,238,131,253,245,117,233,233,95,28,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISNES[m
[32m+[m	[32m.hidden lj_BC_ISNES[m
[32m+[m	[32m.type lj_BC_ISNES, @function[m
[32m+[m	[32m.size lj_BC_ISNES, 63[m
[32m+[m[32mlj_BC_ISNES:[m
[32m+[m	[32m.byte 72,247,208,139,108,202,4,131,195,4,131,253,251,117,38,139[m
[32m+[m	[32m.byte 12,202,65,59,12,135,116,11,15,183,67,254,141,156,131,0[m
[32m+[m	[32m.byte 0,254,255,139,3,15,182,204,15,182,232,131,195,4,193,232[m
[32m+[m	[32m.byte 16,65,255,36,238,131,253,245,117,222,233,32,28,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISEQN[m
[32m+[m	[32m.hidden lj_BC_ISEQN[m
[32m+[m	[32m.type lj_BC_ISEQN, @function[m
[32m+[m	[32m.size lj_BC_ISEQN, 69[m
[32m+[m[32mlj_BC_ISEQN:[m
[32m+[m	[32m.byte 139,108,202,4,131,195,4,129,253,255,255,254,255,115,44,242[m
[32m+[m	[32m.byte 65,15,16,4,199,102,15,46,4,202,122,13,117,11,15,183[m
[32m+[m	[32m.byte 67,254,141,156,131,0,0,254,255,139,3,15,182,204,15,182[m
[32m+[m	[32m.byte 232,131,195,4,193,232,16,65,255,36,238,131,253,245,117,233[m
[32m+[m	[32m.byte 233,219,27,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISNEN[m
[32m+[m	[32m.hidden lj_BC_ISNEN[m
[32m+[m	[32m.type lj_BC_ISNEN, @function[m
[32m+[m	[32m.size lj_BC_ISNEN, 69[m
[32m+[m[32mlj_BC_ISNEN:[m
[32m+[m	[32m.byte 139,108,202,4,131,195,4,129,253,255,255,254,255,115,44,242[m
[32m+[m	[32m.byte 65,15,16,4,199,102,15,46,4,202,122,2,116,11,15,183[m
[32m+[m	[32m.byte 67,254,141,156,131,0,0,254,255,139,3,15,182,204,15,182[m
[32m+[m	[32m.byte 232,131,195,4,193,232,16,65,255,36,238,131,253,245,117,222[m
[32m+[m	[32m.byte 233,150,27,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISEQP[m
[32m+[m	[32m.hidden lj_BC_ISEQP[m
[32m+[m	[32m.type lj_BC_ISEQP, @function[m
[32m+[m	[32m.size lj_BC_ISEQP, 53[m
[32m+[m[32mlj_BC_ISEQP:[m
[32m+[m	[32m.byte 72,247,208,139,108,202,4,131,195,4,57,197,117,29,15,183[m
[32m+[m	[32m.byte 67,254,141,156,131,0,0,254,255,139,3,15,182,204,15,182[m
[32m+[m	[32m.byte 232,131,195,4,193,232,16,65,255,36,238,131,253,245,117,233[m
[32m+[m	[32m.byte 233,97,27,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISNEP[m
[32m+[m	[32m.hidden lj_BC_ISNEP[m
[32m+[m	[32m.type lj_BC_ISNEP, @function[m
[32m+[m	[32m.size lj_BC_ISNEP, 52[m
[32m+[m[32mlj_BC_ISNEP:[m
[32m+[m	[32m.byte 72,247,208,139,108,202,4,131,195,4,57,197,116,20,131,253[m
[32m+[m	[32m.byte 245,15,132,74,27,0,0,15,183,67,254,141,156,131,0,0[m
[32m+[m	[32m.byte 254,255,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISTC[m
[32m+[m	[32m.hidden lj_BC_ISTC[m
[32m+[m	[32m.type lj_BC_ISTC, @function[m
[32m+[m	[32m.size lj_BC_ISTC, 51[m
[32m+[m[32mlj_BC_ISTC:[m
[32m+[m	[32m.byte 139,108,194,4,131,195,4,131,253,254,115,21,137,108,202,4[m
[32m+[m	[32m.byte 139,44,194,137,44,202,15,183,67,254,141,156,131,0,0,254[m
[32m+[m	[32m.byte 255,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISFC[m
[32m+[m	[32m.hidden lj_BC_ISFC[m
[32m+[m	[32m.type lj_BC_ISFC, @function[m
[32m+[m	[32m.size lj_BC_ISFC, 51[m
[32m+[m[32mlj_BC_ISFC:[m
[32m+[m	[32m.byte 139,108,194,4,131,195,4,131,253,254,114,21,137,108,202,4[m
[32m+[m	[32m.byte 139,44,194,137,44,202,15,183,67,254,141,156,131,0,0,254[m
[32m+[m	[32m.byte 255,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_IST[m
[32m+[m	[32m.hidden lj_BC_IST[m
[32m+[m	[32m.type lj_BC_IST, @function[m
[32m+[m	[32m.size lj_BC_IST, 41[m
[32m+[m[32mlj_BC_IST:[m
[32m+[m	[32m.byte 139,108,194,4,131,195,4,131,253,254,115,11,15,183,67,254[m
[32m+[m	[32m.byte 141,156,131,0,0,254,255,139,3,15,182,204,15,182,232,131[m
[32m+[m	[32m.byte 195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISF[m
[32m+[m	[32m.hidden lj_BC_ISF[m
[32m+[m	[32m.type lj_BC_ISF, @function[m
[32m+[m	[32m.size lj_BC_ISF, 41[m
[32m+[m[32mlj_BC_ISF:[m
[32m+[m	[32m.byte 139,108,194,4,131,195,4,131,253,254,114,11,15,183,67,254[m
[32m+[m	[32m.byte 141,156,131,0,0,254,255,139,3,15,182,204,15,182,232,131[m
[32m+[m	[32m.byte 195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISTYPE[m
[32m+[m	[32m.hidden lj_BC_ISTYPE[m
[32m+[m	[32m.type lj_BC_ISTYPE, @function[m
[32m+[m	[32m.size lj_BC_ISTYPE, 28[m
[32m+[m[32mlj_BC_ISTYPE:[m
[32m+[m	[32m.byte 3,68,202,4,15,133,133,26,0,0,139,3,15,182,204,15[m
[32m+[m	[32m.byte 182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISNUM[m
[32m+[m	[32m.hidden lj_BC_ISNUM[m
[32m+[m	[32m.type lj_BC_ISNUM, @function[m
[32m+[m	[32m.size lj_BC_ISNUM, 32[m
[32m+[m[32mlj_BC_ISNUM:[m
[32m+[m	[32m.byte 129,124,202,4,255,255,254,255,15,131,101,26,0,0,139,3[m
[32m+[m	[32m.byte 15,182,204,15,182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_MOV[m
[32m+[m	[32m.hidden lj_BC_MOV[m
[32m+[m	[32m.type lj_BC_MOV, @function[m
[32m+[m	[32m.size lj_BC_MOV, 26[m
[32m+[m[32mlj_BC_MOV:[m
[32m+[m	[32m.byte 72,139,44,194,72,137,44,202,139,3,15,182,204,15,182,232[m
[32m+[m	[32m.byte 131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_NOT[m
[32m+[m	[32m.hidden lj_BC_NOT[m
[32m+[m	[32m.type lj_BC_NOT, @function[m
[32m+[m	[32m.size lj_BC_NOT, 32[m
[32m+[m[32mlj_BC_NOT:[m
[32m+[m	[32m.byte 49,237,131,124,194,4,254,131,213,253,137,108,202,4,139,3[m
[32m+[m	[32m.byte 15,182,204,15,182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_UNM[m
[32m+[m	[32m.hidden lj_BC_UNM[m
[32m+[m	[32m.type lj_BC_UNM, @function[m
[32m+[m	[32m.size lj_BC_UNM, 60[m
[32m+[m[32mlj_BC_UNM:[m
[32m+[m	[32m.byte 129,124,194,4,255,255,254,255,15,131,56,26,0,0,242,15[m
[32m+[m	[32m.byte 16,4,194,72,184,0,0,0,0,0,0,0,128,102,72,15[m
[32m+[m	[32m.byte 110,200,15,87,193,242,15,17,4,202,139,3,15,182,204,15[m
[32m+[m	[32m.byte 182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_LEN[m
[32m+[m	[32m.hidden lj_BC_LEN[m
[32m+[m	[32m.type lj_BC_LEN, @function[m
[32m+[m	[32m.size lj_BC_LEN, 74[m
[32m+[m[32mlj_BC_LEN:[m
[32m+[m	[32m.byte 131,124,194,4,251,117,34,139,4,194,15,87,192,242,15,42[m
[32m+[m	[32m.byte 64,12,242,15,17,4,202,139,3,15,182,204,15,182,232,131[m
[32m+[m	[32m.byte 195,4,193,232,16,65,255,36,238,131,124,194,4,244,15,133[m
[32m+[m	[32m.byte 34,26,0,0,139,60,194,137,213[m
[32m+[m	[32mcall lj_tab_len[m
[32m+[m	[32m.byte 242,15,42,192,137,234,15,182,75,253,235,200[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ADDVN[m
[32m+[m	[32m.hidden lj_BC_ADDVN[m
[32m+[m	[32m.type lj_BC_ADDVN, @function[m
[32m+[m	[32m.size lj_BC_ADDVN, 54[m
[32m+[m[32mlj_BC_ADDVN:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 156,25,0,0,242,15,16,4,234,242,65,15,88,4,199,242[m
[32m+[m	[32m.byte 15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_SUBVN[m
[32m+[m	[32m.hidden lj_BC_SUBVN[m
[32m+[m	[32m.type lj_BC_SUBVN, @function[m
[32m+[m	[32m.size lj_BC_SUBVN, 54[m
[32m+[m[32mlj_BC_SUBVN:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 102,25,0,0,242,15,16,4,234,242,65,15,92,4,199,242[m
[32m+[m	[32m.byte 15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_MULVN[m
[32m+[m	[32m.hidden lj_BC_MULVN[m
[32m+[m	[32m.type lj_BC_MULVN, @function[m
[32m+[m	[32m.size lj_BC_MULVN, 54[m
[32m+[m[32mlj_BC_MULVN:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 48,25,0,0,242,15,16,4,234,242,65,15,89,4,199,242[m
[32m+[m	[32m.byte 15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_DIVVN[m
[32m+[m	[32m.hidden lj_BC_DIVVN[m
[32m+[m	[32m.type lj_BC_DIVVN, @function[m
[32m+[m	[32m.size lj_BC_DIVVN, 54[m
[32m+[m[32mlj_BC_DIVVN:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 250,24,0,0,242,15,16,4,234,242,65,15,94,4,199,242[m
[32m+[m	[32m.byte 15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_MODVN[m
[32m+[m	[32m.hidden lj_BC_MODVN[m
[32m+[m	[32m.type lj_BC_MODVN, @function[m
[32m+[m	[32m.size lj_BC_MODVN, 59[m
[32m+[m[32mlj_BC_MODVN:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 196,24,0,0,242,15,16,4,234,242,65,15,16,12,199,232[m
[32m+[m	[32m.byte 204,47,0,0,242,15,17,4,202,139,3,15,182,204,15,182[m
[32m+[m	[32m.byte 232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ADDNV[m
[32m+[m	[32m.hidden lj_BC_ADDNV[m
[32m+[m	[32m.type lj_BC_ADDNV, @function[m
[32m+[m	[32m.size lj_BC_ADDNV, 54[m
[32m+[m[32mlj_BC_ADDNV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 143,24,0,0,242,65,15,16,4,199,242,15,88,4,234,242[m
[32m+[m	[32m.byte 15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_SUBNV[m
[32m+[m	[32m.hidden lj_BC_SUBNV[m
[32m+[m	[32m.type lj_BC_SUBNV, @function[m
[32m+[m	[32m.size lj_BC_SUBNV, 54[m
[32m+[m[32mlj_BC_SUBNV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 89,24,0,0,242,65,15,16,4,199,242,15,92,4,234,242[m
[32m+[m	[32m.byte 15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_MULNV[m
[32m+[m	[32m.hidden lj_BC_MULNV[m
[32m+[m	[32m.type lj_BC_MULNV, @function[m
[32m+[m	[32m.size lj_BC_MULNV, 54[m
[32m+[m[32mlj_BC_MULNV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 35,24,0,0,242,65,15,16,4,199,242,15,89,4,234,242[m
[32m+[m	[32m.byte 15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_DIVNV[m
[32m+[m	[32m.hidden lj_BC_DIVNV[m
[32m+[m	[32m.type lj_BC_DIVNV, @function[m
[32m+[m	[32m.size lj_BC_DIVNV, 54[m
[32m+[m[32mlj_BC_DIVNV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 237,23,0,0,242,65,15,16,4,199,242,15,94,4,234,242[m
[32m+[m	[32m.byte 15,17,4,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_MODNV[m
[32m+[m	[32m.hidden lj_BC_MODNV[m
[32m+[m	[32m.type lj_BC_MODNV, @function[m
[32m+[m	[32m.size lj_BC_MODNV, 36[m
[32m+[m[32mlj_BC_MODNV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 183,23,0,0,242,65,15,16,4,199,242,15,16,12,234,233[m
[32m+[m	[32m.byte 232,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ADDVV[m
[32m+[m	[32m.hidden lj_BC_ADDVV[m
[32m+[m	[32m.type lj_BC_ADDVV, @function[m
[32m+[m	[32m.size lj_BC_ADDVV, 67[m
[32m+[m[32mlj_BC_ADDVV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 164,23,0,0,129,124,194,4,255,255,254,255,15,131,150,23[m
[32m+[m	[32m.byte 0,0,242,15,16,4,234,242,15,88,4,194,242,15,17,4[m
[32m+[m	[32m.byte 202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_SUBVV[m
[32m+[m	[32m.hidden lj_BC_SUBVV[m
[32m+[m	[32m.type lj_BC_SUBVV, @function[m
[32m+[m	[32m.size lj_BC_SUBVV, 67[m
[32m+[m[32mlj_BC_SUBVV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 97,23,0,0,129,124,194,4,255,255,254,255,15,131,83,23[m
[32m+[m	[32m.byte 0,0,242,15,16,4,234,242,15,92,4,194,242,15,17,4[m
[32m+[m	[32m.byte 202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_MULVV[m
[32m+[m	[32m.hidden lj_BC_MULVV[m
[32m+[m	[32m.type lj_BC_MULVV, @function[m
[32m+[m	[32m.size lj_BC_MULVV, 67[m
[32m+[m[32mlj_BC_MULVV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 30,23,0,0,129,124,194,4,255,255,254,255,15,131,16,23[m
[32m+[m	[32m.byte 0,0,242,15,16,4,234,242,15,89,4,194,242,15,17,4[m
[32m+[m	[32m.byte 202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_DIVVV[m
[32m+[m	[32m.hidden lj_BC_DIVVV[m
[32m+[m	[32m.type lj_BC_DIVVV, @function[m
[32m+[m	[32m.size lj_BC_DIVVV, 67[m
[32m+[m[32mlj_BC_DIVVV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 219,22,0,0,129,124,194,4,255,255,254,255,15,131,205,22[m
[32m+[m	[32m.byte 0,0,242,15,16,4,234,242,15,94,4,194,242,15,17,4[m
[32m+[m	[32m.byte 202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_MODVV[m
[32m+[m	[32m.hidden lj_BC_MODVV[m
[32m+[m	[32m.type lj_BC_MODVV, @function[m
[32m+[m	[32m.size lj_BC_MODVV, 49[m
[32m+[m[32mlj_BC_MODVV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 152,22,0,0,129,124,194,4,255,255,254,255,15,131,138,22[m
[32m+[m	[32m.byte 0,0,242,15,16,4,234,242,15,16,12,194,233,171,253,255[m
[32m+[m	[32m.byte 255[m
[32m+[m
[32m+[m	[32m.globl lj_BC_POW[m
[32m+[m	[32m.hidden lj_BC_POW[m
[32m+[m	[32m.type lj_BC_POW, @function[m
[32m+[m	[32m.size lj_BC_POW, 80[m
[32m+[m[32mlj_BC_POW:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,129,124,234,4,255,255,254,255,15,131[m
[32m+[m	[32m.byte 103,22,0,0,129,124,194,4,255,255,254,255,15,131,89,22[m
[32m+[m	[32m.byte 0,0,242,15,16,4,234,242,15,16,12,194,137,213[m
[32m+[m	[32mcall pow@PLT[m
[32m+[m	[32m.byte 15,182,75,253,137,234,242,15,17,4,202,139,3,15,182,204[m
[32m+[m	[32m.byte 15,182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_CAT[m
[32m+[m	[32m.hidden lj_BC_CAT[m
[32m+[m	[32m.type lj_BC_CAT, @function[m
[32m+[m	[32m.size lj_BC_CAT, 76[m
[32m+[m[32mlj_BC_CAT:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,139,124,36,24,137,87,16,141,52,194[m
[32m+[m	[32m.byte 137,194,41,234,137,253,137,92,36,28[m
[32m+[m	[32mcall lj_meta_cat[m
[32m+[m	[32m.byte 139,85,16,133,192,15,133,50,22,0,0,15,182,107,255,15[m
[32m+[m	[32m.byte 182,75,253,72,139,4,234,72,137,4,202,139,3,15,182,204[m
[32m+[m	[32m.byte 15,182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_KSTR[m
[32m+[m	[32m.hidden lj_BC_KSTR[m
[32m+[m	[32m.type lj_BC_KSTR, @function[m
[32m+[m	[32m.size lj_BC_KSTR, 36[m
[32m+[m[32mlj_BC_KSTR:[m
[32m+[m	[32m.byte 72,247,208,65,139,4,135,199,68,202,4,251,255,255,255,137[m
[32m+[m	[32m.byte 4,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_KCDATA[m
[32m+[m	[32m.hidden lj_BC_KCDATA[m
[32m+[m	[32m.type lj_BC_KCDATA, @function[m
[32m+[m	[32m.size lj_BC_KCDATA, 36[m
[32m+[m[32mlj_BC_KCDATA:[m
[32m+[m	[32m.byte 72,247,208,65,139,4,135,199,68,202,4,245,255,255,255,137[m
[32m+[m	[32m.byte 4,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_KSHORT[m
[32m+[m	[32m.hidden lj_BC_KSHORT[m
[32m+[m	[32m.type lj_BC_KSHORT, @function[m
[32m+[m	[32m.size lj_BC_KSHORT, 30[m
[32m+[m[32mlj_BC_KSHORT:[m
[32m+[m	[32m.byte 15,191,192,242,15,42,192,242,15,17,4,202,139,3,15,182[m
[32m+[m	[32m.byte 204,15,182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_KNUM[m
[32m+[m	[32m.hidden lj_BC_KNUM[m
[32m+[m	[32m.type lj_BC_KNUM, @function[m
[32m+[m	[32m.size lj_BC_KNUM, 29[m
[32m+[m[32mlj_BC_KNUM:[m
[32m+[m	[32m.byte 242,65,15,16,4,199,242,15,17,4,202,139,3,15,182,204[m
[32m+[m	[32m.byte 15,182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_KPRI[m
[32m+[m	[32m.hidden lj_BC_KPRI[m
[32m+[m	[32m.type lj_BC_KPRI, @function[m
[32m+[m	[32m.size lj_BC_KPRI, 25[m
[32m+[m[32mlj_BC_KPRI:[m
[32m+[m	[32m.byte 72,247,208,137,68,202,4,139,3,15,182,204,15,182,232,131[m
[32m+[m	[32m.byte 195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_KNIL[m
[32m+[m	[32m.hidden lj_BC_KNIL[m
[32m+[m	[32m.type lj_BC_KNIL, @function[m
[32m+[m	[32m.size lj_BC_KNIL, 43[m
[32m+[m[32mlj_BC_KNIL:[m
[32m+[m	[32m.byte 141,76,202,12,141,68,194,4,189,255,255,255,255,137,105,248[m
[32m+[m	[32m.byte 137,41,131,193,8,57,193,118,247,139,3,15,182,204,15,182[m
[32m+[m	[32m.byte 232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_UGET[m
[32m+[m	[32m.hidden lj_BC_UGET[m
[32m+[m	[32m.type lj_BC_UGET, @function[m
[32m+[m	[32m.size lj_BC_UGET, 36[m
[32m+[m[32mlj_BC_UGET:[m
[32m+[m	[32m.byte 139,106,248,139,108,133,20,139,109,16,72,139,69,0,72,137[m
[32m+[m	[32m.byte 4,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_USETV[m
[32m+[m	[32m.hidden lj_BC_USETV[m
[32m+[m	[32m.type lj_BC_USETV, @function[m
[32m+[m	[32m.size lj_BC_USETV, 87[m
[32m+[m[32mlj_BC_USETV:[m
[32m+[m	[32m.byte 139,106,248,139,108,141,20,128,125,6,0,139,109,16,139,12[m
[32m+[m	[32m.byte 194,139,68,194,4,137,77,0,137,69,4,116,6,246,69,252[m
[32m+[m	[32m.byte 4,117,18,139,3,15,182,204,15,182,232,131,195,4,193,232[m
[32m+[m	[32m.byte 16,65,255,36,238,131,232,252,131,248,246,118,230,246,65,4[m
[32m+[m	[32m.byte 3,116,224,137,238,137,213,65,141,190,16,244,255,255[m
[32m+[m	[32mcall lj_gc_barrieruv[m
[32m+[m	[32m.byte 137,234,235,204[m
[32m+[m
[32m+[m	[32m.globl lj_BC_USETS[m
[32m+[m	[32m.hidden lj_BC_USETS[m
[32m+[m	[32m.type lj_BC_USETS, @function[m
[32m+[m	[32m.size lj_BC_USETS, 82[m
[32m+[m[32mlj_BC_USETS:[m
[32m+[m	[32m.byte 72,247,208,139,106,248,139,108,141,20,65,139,12,135,139,69[m
[32m+[m	[32m.byte 16,137,8,199,64,4,251,255,255,255,246,69,4,4,117,18[m
[32m+[m	[32m.byte 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,255[m
[32m+[m	[32m.byte 36,238,246,65,4,3,116,232,128,125,6,0,116,226,137,213[m
[32m+[m	[32m.byte 137,198,65,141,190,16,244,255,255[m
[32m+[m	[32mcall lj_gc_barrieruv[m
[32m+[m	[32m.byte 137,234,235,206[m
[32m+[m
[32m+[m	[32m.globl lj_BC_USETN[m
[32m+[m	[32m.hidden lj_BC_USETN[m
[32m+[m	[32m.type lj_BC_USETN, @function[m
[32m+[m	[32m.size lj_BC_USETN, 38[m
[32m+[m[32mlj_BC_USETN:[m
[32m+[m	[32m.byte 139,106,248,242,65,15,16,4,199,139,108,141,20,139,77,16[m
[32m+[m	[32m.byte 242,15,17,1,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_USETP[m
[32m+[m	[32m.hidden lj_BC_USETP[m
[32m+[m	[32m.type lj_BC_USETP, @function[m
[32m+[m	[32m.size lj_BC_USETP, 34[m
[32m+[m[32mlj_BC_USETP:[m
[32m+[m	[32m.byte 72,247,208,139,106,248,139,108,141,20,139,77,16,137,65,4[m
[32m+[m	[32m.byte 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,255[m
[32m+[m	[32m.byte 36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_UCLO[m
[32m+[m	[32m.hidden lj_BC_UCLO[m
[32m+[m	[32m.type lj_BC_UCLO, @function[m
[32m+[m	[32m.size lj_BC_UCLO, 51[m
[32m+[m[32mlj_BC_UCLO:[m
[32m+[m	[32m.byte 141,156,131,0,0,254,255,139,108,36,24,131,125,40,0,116[m
[32m+[m	[32m.byte 16,137,85,16,141,52,202,137,239[m
[32m+[m	[32mcall lj_func_closeuv[m
[32m+[m	[32m.byte 139,85,16,139,3,15,182,204,15,182,232,131,195,4,193,232[m
[32m+[m	[32m.byte 16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_FNEW[m
[32m+[m	[32m.hidden lj_BC_FNEW[m
[32m+[m	[32m.type lj_BC_FNEW, @function[m
[32m+[m	[32m.size lj_BC_FNEW, 64[m
[32m+[m[32mlj_BC_FNEW:[m
[32m+[m	[32m.byte 72,247,208,139,108,36,24,137,85,16,139,82,248,65,139,52[m
[32m+[m	[32m.byte 135,137,239,137,92,36,28[m
[32m+[m	[32mcall lj_func_newL_gc[m
[32m+[m	[32m.byte 139,85,16,15,182,75,253,137,4,202,199,68,202,4,247,255[m
[32m+[m	[32m.byte 255,255,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TNEW[m
[32m+[m	[32m.hidden lj_BC_TNEW[m
[32m+[m	[32m.type lj_BC_TNEW, @function[m
[32m+[m	[32m.size lj_BC_TNEW, 109[m
[32m+[m[32mlj_BC_TNEW:[m
[32m+[m	[32m.byte 139,108,36,24,137,85,16,65,139,142,48,244,255,255,65,59[m
[32m+[m	[32m.byte 142,52,244,255,255,137,92,36,28,115,69,137,194,37,255,7[m
[32m+[m	[32m.byte 0,0,193,234,11,61,255,7,0,0,116,45,137,239,137,198[m
[32m+[m	[32mcall lj_tab_new[m
[32m+[m	[32m.byte 139,85,16,15,182,75,253,137,4,202,199,68,202,4,244,255[m
[32m+[m	[32m.byte 255,255,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238,184,1,8,0,0,235,204,137,239[m
[32m+[m	[32mcall lj_gc_step_fixtop[m
[32m+[m	[32m.byte 15,183,67,254,235,174[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TDUP[m
[32m+[m	[32m.hidden lj_BC_TDUP[m
[32m+[m	[32m.type lj_BC_TDUP, @function[m
[32m+[m	[32m.size lj_BC_TDUP, 93[m
[32m+[m[32mlj_BC_TDUP:[m
[32m+[m	[32m.byte 72,247,208,139,108,36,24,65,139,142,48,244,255,255,137,92[m
[32m+[m	[32m.byte 36,28,65,59,142,52,244,255,255,137,85,16,115,47,65,139[m
[32m+[m	[32m.byte 52,135,137,239[m
[32m+[m	[32mcall lj_tab_dup[m
[32m+[m	[32m.byte 139,85,16,15,182,75,253,137,4,202,199,68,202,4,244,255[m
[32m+[m	[32m.byte 255,255,139,3,15,182,204,15,182,232,131,195,4,193,232,16[m
[32m+[m	[32m.byte 65,255,36,238,137,239[m
[32m+[m	[32mcall lj_gc_step_fixtop[m
[32m+[m	[32m.byte 15,183,67,254,72,247,208,235,193[m
[32m+[m
[32m+[m	[32m.globl lj_BC_GGET[m
[32m+[m	[32m.hidden lj_BC_GGET[m
[32m+[m	[32m.type lj_BC_GGET, @function[m
[32m+[m	[32m.size lj_BC_GGET, 18[m
[32m+[m[32mlj_BC_GGET:[m
[32m+[m	[32m.byte 72,247,208,139,106,248,139,109,8,65,139,4,135,233,193,0[m
[32m+[m	[32m.byte 0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_GSET[m
[32m+[m	[32m.hidden lj_BC_GSET[m
[32m+[m	[32m.type lj_BC_GSET, @function[m
[32m+[m	[32m.size lj_BC_GSET, 18[m
[32m+[m[32mlj_BC_GSET:[m
[32m+[m	[32m.byte 72,247,208,139,106,248,139,109,8,65,139,4,135,233,113,2[m
[32m+[m	[32m.byte 0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TGETV[m
[32m+[m	[32m.hidden lj_BC_TGETV[m
[32m+[m	[32m.type lj_BC_TGETV, @function[m
[32m+[m	[32m.size lj_BC_TGETV, 148[m
[32m+[m[32mlj_BC_TGETV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,131,124,234,4,244,15,133,122,16,0[m
[32m+[m	[32m.byte 0,139,44,234,129,124,194,4,255,255,254,255,115,102,242,15[m
[32m+[m	[32m.byte 16,4,194,242,15,44,192,242,15,42,200,102,15,46,193,15[m
[32m+[m	[32m.byte 133,86,16,0,0,59,69,24,15,131,77,16,0,0,193,224[m
[32m+[m	[32m.byte 3,3,69,8,131,120,4,255,116,25,72,139,40,72,137,44[m
[32m+[m	[32m.byte 202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238,131,125,16,0,116,17,139,77,16,246,65,6,1[m
[32m+[m	[32m.byte 15,132,21,16,0,0,15,182,75,253,199,68,202,4,255,255[m
[32m+[m	[32m.byte 255,255,235,205,131,124,194,4,251,15,133,252,15,0,0,139[m
[32m+[m	[32m.byte 4,194,235,27[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TGETS[m
[32m+[m	[32m.hidden lj_BC_TGETS[m
[32m+[m	[32m.type lj_BC_TGETS, @function[m
[32m+[m	[32m.size lj_BC_TGETS, 124[m
[32m+[m[32mlj_BC_TGETS:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,72,247,208,65,139,4,135,131,124,234[m
[32m+[m	[32m.byte 4,244,15,133,163,15,0,0,139,44,234,139,77,28,35,72[m
[32m+[m	[32m.byte 8,107,201,24,3,77,20,131,121,12,251,117,54,57,65,8[m
[32m+[m	[32m.byte 117,49,131,121,4,255,116,50,15,182,67,253,72,139,41,72[m
[32m+[m	[32m.byte 137,44,194,139,3,15,182,204,15,182,232,131,195,4,193,232[m
[32m+[m	[32m.byte 16,65,255,36,238,15,182,67,253,199,68,194,4,255,255,255[m
[32m+[m	[32m.byte 255,235,224,139,73,16,133,201,117,189,139,77,16,133,201,116[m
[32m+[m	[32m.byte 228,246,65,6,1,117,222,233,63,15,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TGETB[m
[32m+[m	[32m.hidden lj_BC_TGETB[m
[32m+[m	[32m.type lj_BC_TGETB, @function[m
[32m+[m	[32m.size lj_BC_TGETB, 99[m
[32m+[m[32mlj_BC_TGETB:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,131,124,234,4,244,15,133,87,15,0[m
[32m+[m	[32m.byte 0,139,44,234,59,69,24,15,131,75,15,0,0,193,224,3[m
[32m+[m	[32m.byte 3,69,8,131,120,4,255,116,25,72,139,40,72,137,44,202[m
[32m+[m	[32m.byte 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,255[m
[32m+[m	[32m.byte 36,238,131,125,16,0,116,17,139,77,16,246,65,6,1,15[m
[32m+[m	[32m.byte 132,19,15,0,0,15,182,75,253,199,68,202,4,255,255,255[m
[32m+[m	[32m.byte 255,235,205[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TGETR[m
[32m+[m	[32m.hidden lj_BC_TGETR[m
[32m+[m	[32m.type lj_BC_TGETR, @function[m
[32m+[m	[32m.size lj_BC_TGETR, 54[m
[32m+[m[32mlj_BC_TGETR:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,139,44,234,242,15,44,4,194,59,69[m
[32m+[m	[32m.byte 24,15,131,98,15,0,0,193,224,3,3,69,8,72,139,40[m
[32m+[m	[32m.byte 72,137,44,202,139,3,15,182,204,15,182,232,131,195,4,193[m
[32m+[m	[32m.byte 232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TSETV[m
[32m+[m	[32m.hidden lj_BC_TSETV[m
[32m+[m	[32m.type lj_BC_TSETV, @function[m
[32m+[m	[32m.size lj_BC_TSETV, 173[m
[32m+[m[32mlj_BC_TSETV:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,131,124,234,4,244,15,133,148,15,0[m
[32m+[m	[32m.byte 0,139,44,234,129,124,194,4,255,255,254,255,115,100,242,15[m
[32m+[m	[32m.byte 16,4,194,242,15,44,192,242,15,42,200,102,15,46,193,15[m
[32m+[m	[32m.byte 133,112,15,0,0,59,69,24,15,131,103,15,0,0,193,224[m
[32m+[m	[32m.byte 3,3,69,8,131,120,4,255,116,31,246,69,4,4,117,66[m
[32m+[m	[32m.byte 72,139,44,202,72,137,40,139,3,15,182,204,15,182,232,131[m
[32m+[m	[32m.byte 195,4,193,232,16,65,255,36,238,131,125,16,0,116,219,139[m
[32m+[m	[32m.byte 77,16,246,65,6,2,15,132,41,15,0,0,15,182,75,253[m
[32m+[m	[32m.byte 235,200,131,124,194,4,251,15,133,24,15,0,0,139,4,194[m
[32m+[m	[32m.byte 235,54,128,101,4,251,65,139,142,76,244,255,255,65,137,174[m
[32m+[m	[32m.byte 76,244,255,255,137,77,12,15,182,75,253,235,163[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TSETS[m
[32m+[m	[32m.hidden lj_BC_TSETS[m
[32m+[m	[32m.type lj_BC_TSETS, @function[m
[32m+[m	[32m.size lj_BC_TSETS, 229[m
[32m+[m[32mlj_BC_TSETS:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,72,247,208,65,139,4,135,131,124,234[m
[32m+[m	[32m.byte 4,244,15,133,164,14,0,0,139,44,234,139,77,28,35,72[m
[32m+[m	[32m.byte 8,107,201,24,198,69,6,0,3,77,20,131,121,12,251,117[m
[32m+[m	[32m.byte 77,57,65,8,117,72,131,121,4,255,116,39,246,69,4,4[m
[32m+[m	[32m.byte 15,133,133,0,0,0,15,182,67,253,72,139,44,194,72,137[m
[32m+[m	[32m.byte 41,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238,131,125,16,0,116,211,137,12,36,139,77,16,246[m
[32m+[m	[32m.byte 65,6,2,15,132,67,14,0,0,139,12,36,235,190,139,73[m
[32m+[m	[32m.byte 16,133,201,117,166,139,77,16,133,201,116,10,246,65,6,2[m
[32m+[m	[32m.byte 15,132,38,14,0,0,137,4,36,199,68,36,4,251,255,255[m
[32m+[m	[32m.byte 255,137,108,36,8,139,124,36,24,137,87,16,72,141,20,36[m
[32m+[m	[32m.byte 137,238,137,253,137,92,36,28[m
[32m+[m	[32mcall lj_tab_newkey[m
[32m+[m	[32m.byte 139,85,16,139,108,36,8,137,193,233,113,255,255,255,128,101[m
[32m+[m	[32m.byte 4,251,65,139,134,76,244,255,255,65,137,174,76,244,255,255[m
[32m+[m	[32m.byte 137,69,12,233,97,255,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TSETB[m
[32m+[m	[32m.hidden lj_BC_TSETB[m
[32m+[m	[32m.type lj_BC_TSETB, @function[m
[32m+[m	[32m.size lj_BC_TSETB, 124[m
[32m+[m[32mlj_BC_TSETB:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,131,124,234,4,244,15,133,239,13,0[m
[32m+[m	[32m.byte 0,139,44,234,59,69,24,15,131,227,13,0,0,193,224,3[m
[32m+[m	[32m.byte 3,69,8,131,120,4,255,116,31,246,69,4,4,117,50,72[m
[32m+[m	[32m.byte 139,12,202,72,137,8,139,3,15,182,204,15,182,232,131,195[m
[32m+[m	[32m.byte 4,193,232,16,65,255,36,238,131,125,16,0,116,219,139,77[m
[32m+[m	[32m.byte 16,246,65,6,2,15,132,165,13,0,0,15,182,75,253,235[m
[32m+[m	[32m.byte 200,128,101,4,251,65,139,142,76,244,255,255,65,137,174,76[m
[32m+[m	[32m.byte 244,255,255,137,77,12,15,182,75,253,235,179[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TSETM[m
[32m+[m	[32m.hidden lj_BC_TSETM[m
[32m+[m	[32m.type lj_BC_TSETM, @function[m
[32m+[m	[32m.size lj_BC_TSETM, 142[m
[32m+[m[32mlj_BC_TSETM:[m
[32m+[m	[32m.byte 68,137,60,36,69,139,60,199,141,12,202,139,105,248,246,69[m
[32m+[m	[32m.byte 4,4,117,99,139,68,36,4,131,232,1,116,37,68,1,248[m
[32m+[m	[32m.byte 59,69,24,119,51,68,41,248,65,193,231,3,68,3,125,8[m
[32m+[m	[32m.byte 72,139,41,131,193,8,73,137,47,65,131,199,8,131,232,1[m
[32m+[m	[32m.byte 117,238,68,139,60,36,139,3,15,182,204,15,182,232,131,195[m
[32m+[m	[32m.byte 4,193,232,16,65,255,36,238,139,124,36,24,137,87,16,137[m
[32m+[m	[32m.byte 238,137,194,137,253,137,92,36,28[m
[32m+[m	[32mcall lj_tab_reasize[m
[32m+[m	[32m.byte 139,85,16,15,182,75,253,235,145,128,101,4,251,65,139,134[m
[32m+[m	[32m.byte 76,244,255,255,65,137,174,76,244,255,255,137,69,12,235,134[m
[32m+[m
[32m+[m	[32m.globl lj_BC_TSETR[m
[32m+[m	[32m.hidden lj_BC_TSETR[m
[32m+[m	[32m.type lj_BC_TSETR, @function[m
[32m+[m	[32m.size lj_BC_TSETR, 87[m
[32m+[m[32mlj_BC_TSETR:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,139,44,234,242,15,44,4,194,246,69[m
[32m+[m	[32m.byte 4,4,117,40,59,69,24,15,131,89,13,0,0,193,224,3[m
[32m+[m	[32m.byte 3,69,8,72,139,44,202,72,137,40,139,3,15,182,204,15[m
[32m+[m	[32m.byte 182,232,131,195,4,193,232,16,65,255,36,238,128,101,4,251[m
[32m+[m	[32m.byte 65,139,142,76,244,255,255,65,137,174,76,244,255,255,137,77[m
[32m+[m	[32m.byte 12,15,182,75,253,235,189[m
[32m+[m
[32m+[m	[32m.globl lj_BC_CALLM[m
[32m+[m	[32m.hidden lj_BC_CALLM[m
[32m+[m	[32m.type lj_BC_CALLM, @function[m
[32m+[m	[32m.size lj_BC_CALLM, 46[m
[32m+[m[32mlj_BC_CALLM:[m
[32m+[m	[32m.byte 15,182,192,3,68,36,4,131,124,202,4,247,139,44,202,15[m
[32m+[m	[32m.byte 133,80,14,0,0,141,84,202,8,137,90,252,139,93,16,139[m
[32m+[m	[32m.byte 11,15,182,233,15,182,205,131,195,4,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_CALL[m
[32m+[m	[32m.hidden lj_BC_CALL[m
[32m+[m	[32m.type lj_BC_CALL, @function[m
[32m+[m	[32m.size lj_BC_CALL, 42[m
[32m+[m[32mlj_BC_CALL:[m
[32m+[m	[32m.byte 15,182,192,131,124,202,4,247,139,44,202,15,133,38,14,0[m
[32m+[m	[32m.byte 0,141,84,202,8,137,90,252,139,93,16,139,11,15,182,233[m
[32m+[m	[32m.byte 15,182,205,131,195,4,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_CALLMT[m
[32m+[m	[32m.hidden lj_BC_CALLMT[m
[32m+[m	[32m.type lj_BC_CALLMT, @function[m
[32m+[m	[32m.size lj_BC_CALLMT, 4[m
[32m+[m[32mlj_BC_CALLMT:[m
[32m+[m	[32m.byte 3,68,36,4[m
[32m+[m
[32m+[m	[32m.globl lj_BC_CALLT[m
[32m+[m	[32m.hidden lj_BC_CALLT[m
[32m+[m	[32m.type lj_BC_CALLT, @function[m
[32m+[m	[32m.size lj_BC_CALLT, 148[m
[32m+[m[32mlj_BC_CALLT:[m
[32m+[m	[32m.byte 141,76,202,8,65,137,215,139,105,248,131,121,252,247,15,133[m
[32m+[m	[32m.byte 249,13,0,0,139,90,252,247,195,3,0,0,0,117,91,137[m
[32m+[m	[32m.byte 106,248,137,68,36,4,131,232,1,116,21,72,139,41,131,193[m
[32m+[m	[32m.byte 8,73,137,47,65,131,199,8,131,232,1,117,238,139,106,248[m
[32m+[m	[32m.byte 139,68,36,4,128,125,6,1,119,18,139,93,16,139,11,15[m
[32m+[m	[32m.byte 182,233,15,182,205,131,195,4,65,255,36,238,247,195,3,0[m
[32m+[m	[32m.byte 0,0,117,230,15,182,75,253,72,247,209,68,139,124,202,248[m
[32m+[m	[32m.byte 69,139,127,16,69,139,127,208,235,208,131,235,3,247,195,7[m
[32m+[m	[32m.byte 0,0,0,117,10,41,218,65,137,215,139,90,252,235,144,131[m
[32m+[m	[32m.byte 195,3,235,139[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ITERC[m
[32m+[m	[32m.hidden lj_BC_ITERC[m
[32m+[m	[32m.type lj_BC_ITERC, @function[m
[32m+[m	[32m.size lj_BC_ITERC, 68[m
[32m+[m[32mlj_BC_ITERC:[m
[32m+[m	[32m.byte 141,76,202,8,72,139,105,232,72,139,65,240,72,137,41,72[m
[32m+[m	[32m.byte 137,65,8,139,105,224,139,65,228,137,105,248,137,65,252,131[m
[32m+[m	[32m.byte 248,247,184,3,0,0,0,15,133,76,13,0,0,137,202,137[m
[32m+[m	[32m.byte 90,252,139,93,16,139,11,15,182,233,15,182,205,131,195,4[m
[32m+[m	[32m.byte 65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ITERN[m
[32m+[m	[32m.hidden lj_BC_ITERN[m
[32m+[m	[32m.type lj_BC_ITERN, @function[m
[32m+[m	[32m.size lj_BC_ITERN, 165[m
[32m+[m[32mlj_BC_ITERN:[m
[32m+[m	[32m.byte 68,137,60,36,68,137,116,36,4,139,108,202,240,139,68,202[m
[32m+[m	[32m.byte 248,68,139,117,24,131,195,4,68,139,125,8,68,57,240,115[m
[32m+[m	[32m.byte 76,65,131,124,199,4,255,116,63,242,15,42,192,73,139,44[m
[32m+[m	[32m.byte 199,72,137,108,202,8,131,192,1,242,15,17,4,202,137,68[m
[32m+[m	[32m.byte 202,248,15,183,67,254,141,156,131,0,0,254,255,68,139,116[m
[32m+[m	[32m.byte 36,4,68,139,60,36,139,3,15,182,204,15,182,232,131,195[m
[32m+[m	[32m.byte 4,193,232,16,65,255,36,238,131,192,1,235,175,68,41,240[m
[32m+[m	[32m.byte 59,69,28,119,216,68,107,248,24,68,3,125,20,65,131,127[m
[32m+[m	[32m.byte 4,255,116,28,70,141,116,48,1,73,139,111,8,73,139,7[m
[32m+[m	[32m.byte 72,137,44,202,72,137,68,202,8,68,137,116,202,248,235,162[m
[32m+[m	[32m.byte 131,192,1,235,203[m
[32m+[m
[32m+[m	[32m.globl lj_BC_VARG[m
[32m+[m	[32m.hidden lj_BC_VARG[m
[32m+[m	[32m.type lj_BC_VARG, @function[m
[32m+[m	[32m.size lj_BC_VARG, 191[m
[32m+[m[32mlj_BC_VARG:[m
[32m+[m	[32m.byte 15,182,236,15,182,192,68,137,60,36,68,141,124,194,11,141[m
[32m+[m	[32m.byte 12,202,68,43,122,252,133,237,116,68,141,108,233,248,65,57[m
[32m+[m	[32m.byte 215,115,23,73,139,71,248,65,131,199,8,72,137,1,131,193[m
[32m+[m	[32m.byte 8,57,233,115,19,65,57,215,114,233,199,65,4,255,255,255[m
[32m+[m	[32m.byte 255,131,193,8,57,233,114,242,68,139,60,36,139,3,15,182[m
[32m+[m	[32m.byte 204,15,182,232,131,195,4,193,232,16,65,255,36,238,199,68[m
[32m+[m	[32m.byte 36,4,1,0,0,0,137,208,68,41,248,118,219,137,197,193[m
[32m+[m	[32m.byte 237,3,131,197,1,137,108,36,4,139,108,36,24,1,200,59[m
[32m+[m	[32m.byte 69,32,119,21,73,139,71,248,65,131,199,8,72,137,1,131[m
[32m+[m	[32m.byte 193,8,65,57,215,114,237,235,175,137,85,16,137,77,24,137[m
[32m+[m	[32m.byte 92,36,28,65,41,215,139,116,36,4,131,238,1,137,239[m
[32m+[m	[32mcall lj_state_growstack[m
[32m+[m	[32m.byte 139,85,16,139,77,24,65,1,215,235,197[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ISNEXT[m
[32m+[m	[32m.hidden lj_BC_ISNEXT[m
[32m+[m	[32m.type lj_BC_ISNEXT, @function[m
[32m+[m	[32m.size lj_BC_ISNEXT, 88[m
[32m+[m[32mlj_BC_ISNEXT:[m
[32m+[m	[32m.byte 131,124,202,236,247,117,65,139,108,202,232,131,124,202,244,244[m
[32m+[m	[32m.byte 117,54,131,124,202,252,255,117,47,128,125,6,4,117,41,141[m
[32m+[m	[32m.byte 156,131,0,0,254,255,199,68,202,248,0,0,0,0,199,68[m
[32m+[m	[32m.byte 202,252,255,127,254,255,139,3,15,182,204,15,182,232,131,195[m
[32m+[m	[32m.byte 4,193,232,16,65,255,36,238,198,67,252,88,141,156,131,0[m
[32m+[m	[32m.byte 0,254,255,198,3,69,235,222[m
[32m+[m
[32m+[m	[32m.globl lj_BC_RETM[m
[32m+[m	[32m.hidden lj_BC_RETM[m
[32m+[m	[32m.type lj_BC_RETM, @function[m
[32m+[m	[32m.size lj_BC_RETM, 4[m
[32m+[m[32mlj_BC_RETM:[m
[32m+[m	[32m.byte 3,68,36,4[m
[32m+[m
[32m+[m	[32m.globl lj_BC_RET[m
[32m+[m	[32m.hidden lj_BC_RET[m
[32m+[m	[32m.type lj_BC_RET, @function[m
[32m+[m	[32m.size lj_BC_RET, 136[m
[32m+[m[32mlj_BC_RET:[m
[32m+[m	[32m.byte 193,225,3,139,90,252,137,68,36,4,247,195,3,0,0,0[m
[32m+[m	[32m.byte 117,94,65,137,215,131,232,1,116,17,73,139,44,15,73,137[m
[32m+[m	[32m.byte 111,248,65,131,199,8,131,232,1,117,239,139,68,36,4,15[m
[32m+[m	[32m.byte 182,107,255,57,197,119,40,15,182,75,253,72,247,209,141,20[m
[32m+[m	[32m.byte 202,68,139,122,248,69,139,127,16,69,139,127,208,139,3,15[m
[32m+[m	[32m.byte 182,204,15,182,232,131,195,4,193,232,16,65,255,36,238,65[m
[32m+[m	[32m.byte 199,71,252,255,255,255,255,65,131,199,8,131,192,1,235,195[m
[32m+[m	[32m.byte 141,107,253,247,197,7,0,0,0,15,133,1,5,0,0,41[m
[32m+[m	[32m.byte 234,1,233,233,123,255,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_BC_RET0[m
[32m+[m	[32m.hidden lj_BC_RET0[m
[32m+[m	[32m.type lj_BC_RET0, @function[m
[32m+[m	[32m.size lj_BC_RET0, 92[m
[32m+[m[32mlj_BC_RET0:[m
[32m+[m	[32m.byte 139,90,252,137,68,36,4,247,195,3,0,0,0,117,58,56[m
[32m+[m	[32m.byte 67,255,119,40,15,182,75,253,72,247,209,141,20,202,68,139[m
[32m+[m	[32m.byte 122,248,69,139,127,16,69,139,127,208,139,3,15,182,204,15[m
[32m+[m	[32m.byte 182,232,131,195,4,193,232,16,65,255,36,238,199,68,194,244[m
[32m+[m	[32m.byte 255,255,255,255,131,192,1,235,198,141,107,253,247,197,7,0[m
[32m+[m	[32m.byte 0,0,15,133,160,4,0,0,41,234,235,164[m
[32m+[m
[32m+[m	[32m.globl lj_BC_RET1[m
[32m+[m	[32m.hidden lj_BC_RET1[m
[32m+[m	[32m.type lj_BC_RET1, @function[m
[32m+[m	[32m.size lj_BC_RET1, 105[m
[32m+[m[32mlj_BC_RET1:[m
[32m+[m	[32m.byte 193,225,3,139,90,252,137,68,36,4,247,195,3,0,0,0[m
[32m+[m	[32m.byte 117,66,72,139,44,10,72,137,106,248,56,67,255,119,40,15[m
[32m+[m	[32m.byte 182,75,253,72,247,209,141,20,202,68,139,122,248,69,139,127[m
[32m+[m	[32m.byte 16,69,139,127,208,139,3,15,182,204,15,182,232,131,195,4[m
[32m+[m	[32m.byte 193,232,16,65,255,36,238,199,68,194,244,255,255,255,255,131[m
[32m+[m	[32m.byte 192,1,235,198,141,107,253,247,197,7,0,0,0,15,133,57[m
[32m+[m	[32m.byte 4,0,0,41,234,1,233,235,154[m
[32m+[m
[32m+[m	[32m.globl lj_BC_FORI[m
[32m+[m	[32m.hidden lj_BC_FORI[m
[32m+[m	[32m.type lj_BC_FORI, @function[m
[32m+[m	[32m.size lj_BC_FORI, 97[m
[32m+[m[32mlj_BC_FORI:[m
[32m+[m	[32m.byte 141,12,202,129,121,4,255,255,254,255,15,131,105,10,0,0[m
[32m+[m	[32m.byte 129,121,12,255,255,254,255,15,131,92,10,0,0,139,105,20[m
[32m+[m	[32m.byte 129,253,255,255,254,255,15,131,77,10,0,0,242,15,16,1[m
[32m+[m	[32m.byte 242,15,16,73,8,124,36,102,15,46,200,242,15,17,65,24[m
[32m+[m	[32m.byte 115,7,141,156,131,0,0,254,255,139,3,15,182,204,15,182[m
[32m+[m	[32m.byte 232,131,195,4,193,232,16,65,255,36,238,102,15,46,193,235[m
[32m+[m	[32m.byte 218[m
[32m+[m
[32m+[m	[32m.globl lj_BC_JFORI[m
[32m+[m	[32m.hidden lj_BC_JFORI[m
[32m+[m	[32m.type lj_BC_JFORI, @function[m
[32m+[m	[32m.size lj_BC_JFORI, 105[m
[32m+[m[32mlj_BC_JFORI:[m
[32m+[m	[32m.byte 141,12,202,129,121,4,255,255,254,255,15,131,8,10,0,0[m
[32m+[m	[32m.byte 129,121,12,255,255,254,255,15,131,251,9,0,0,139,105,20[m
[32m+[m	[32m.byte 129,253,255,255,254,255,15,131,236,9,0,0,242,15,16,1[m
[32m+[m	[32m.byte 242,15,16,73,8,124,44,102,15,46,200,242,15,17,65,24[m
[32m+[m	[32m.byte 141,156,131,0,0,254,255,15,183,67,254,15,131,66,1,0[m
[32m+[m	[32m.byte 0,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65[m
[32m+[m	[32m.byte 255,36,238,102,15,46,193,235,210[m
[32m+[m
[32m+[m	[32m.globl lj_BC_FORL[m
[32m+[m	[32m.hidden lj_BC_FORL[m
[32m+[m	[32m.type lj_BC_FORL, @function[m
[32m+[m	[32m.size lj_BC_FORL, 20[m
[32m+[m[32mlj_BC_FORL:[m
[32m+[m	[32m.byte 137,221,209,237,131,229,126,102,65,131,108,46,128,2,15,130[m
[32m+[m	[32m.byte 38,28,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_IFORL[m
[32m+[m	[32m.hidden lj_BC_IFORL[m
[32m+[m	[32m.type lj_BC_IFORL, @function[m
[32m+[m	[32m.size lj_BC_IFORL, 70[m
[32m+[m[32mlj_BC_IFORL:[m
[32m+[m	[32m.byte 141,12,202,139,105,20,242,15,16,1,242,15,16,73,8,242[m
[32m+[m	[32m.byte 15,88,65,16,242,15,17,1,133,237,120,36,102,15,46,200[m
[32m+[m	[32m.byte 242,15,17,65,24,114,7,141,156,131,0,0,254,255,139,3[m
[32m+[m	[32m.byte 15,182,204,15,182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m	[32m.byte 102,15,46,193,235,218[m
[32m+[m
[32m+[m	[32m.globl lj_BC_JFORL[m
[32m+[m	[32m.hidden lj_BC_JFORL[m
[32m+[m	[32m.type lj_BC_JFORL, @function[m
[32m+[m	[32m.size lj_BC_JFORL, 67[m
[32m+[m[32mlj_BC_JFORL:[m
[32m+[m	[32m.byte 141,12,202,139,105,20,242,15,16,1,242,15,16,73,8,242[m
[32m+[m	[32m.byte 15,88,65,16,242,15,17,1,133,237,120,33,102,15,46,200[m
[32m+[m	[32m.byte 242,15,17,65,24,15,131,165,0,0,0,139,3,15,182,204[m
[32m+[m	[32m.byte 15,182,232,131,195,4,193,232,16,65,255,36,238,102,15,46[m
[32m+[m	[32m.byte 193,235,221[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ITERL[m
[32m+[m	[32m.hidden lj_BC_ITERL[m
[32m+[m	[32m.type lj_BC_ITERL, @function[m
[32m+[m	[32m.size lj_BC_ITERL, 20[m
[32m+[m[32mlj_BC_ITERL:[m
[32m+[m	[32m.byte 137,221,209,237,131,229,126,102,65,131,108,46,128,2,15,130[m
[32m+[m	[32m.byte 137,27,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_IITERL[m
[32m+[m	[32m.hidden lj_BC_IITERL[m
[32m+[m	[32m.type lj_BC_IITERL, @function[m
[32m+[m	[32m.size lj_BC_IITERL, 44[m
[32m+[m[32mlj_BC_IITERL:[m
[32m+[m	[32m.byte 141,12,202,139,105,4,131,253,255,116,15,141,156,131,0,0[m
[32m+[m	[32m.byte 254,255,139,1,137,105,252,137,65,248,139,3,15,182,204,15[m
[32m+[m	[32m.byte 182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_JITERL[m
[32m+[m	[32m.hidden lj_BC_JITERL[m
[32m+[m	[32m.type lj_BC_JITERL, @function[m
[32m+[m	[32m.size lj_BC_JITERL, 39[m
[32m+[m[32mlj_BC_JITERL:[m
[32m+[m	[32m.byte 141,12,202,139,105,4,131,253,255,116,10,137,105,252,139,41[m
[32m+[m	[32m.byte 137,105,248,235,56,139,3,15,182,204,15,182,232,131,195,4[m
[32m+[m	[32m.byte 193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_LOOP[m
[32m+[m	[32m.hidden lj_BC_LOOP[m
[32m+[m	[32m.type lj_BC_LOOP, @function[m
[32m+[m	[32m.size lj_BC_LOOP, 20[m
[32m+[m[32mlj_BC_LOOP:[m
[32m+[m	[32m.byte 137,221,209,237,131,229,126,102,65,131,108,46,128,2,15,130[m
[32m+[m	[32m.byte 34,27,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_ILOOP[m
[32m+[m	[32m.hidden lj_BC_ILOOP[m
[32m+[m	[32m.type lj_BC_ILOOP, @function[m
[32m+[m	[32m.size lj_BC_ILOOP, 18[m
[32m+[m[32mlj_BC_ILOOP:[m
[32m+[m	[32m.byte 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,255[m
[32m+[m	[32m.byte 36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_JLOOP[m
[32m+[m	[32m.hidden lj_BC_JLOOP[m
[32m+[m	[32m.type lj_BC_JLOOP, @function[m
[32m+[m	[32m.size lj_BC_JLOOP, 47[m
[32m+[m[32mlj_BC_JLOOP:[m
[32m+[m	[32m.byte 65,139,142,232,246,255,255,139,4,129,72,139,64,64,139,108[m
[32m+[m	[32m.byte 36,24,65,137,150,12,245,255,255,65,137,174,120,244,255,255[m
[32m+[m	[32m.byte 76,137,36,36,76,137,108,36,8,72,131,236,16,255,224[m
[32m+[m
[32m+[m	[32m.globl lj_BC_JMP[m
[32m+[m	[32m.hidden lj_BC_JMP[m
[32m+[m	[32m.type lj_BC_JMP, @function[m
[32m+[m	[32m.size lj_BC_JMP, 25[m
[32m+[m[32mlj_BC_JMP:[m
[32m+[m	[32m.byte 141,156,131,0,0,254,255,139,3,15,182,204,15,182,232,131[m
[32m+[m	[32m.byte 195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_BC_FUNCF[m
[32m+[m	[32m.hidden lj_BC_FUNCF[m
[32m+[m	[32m.type lj_BC_FUNCF, @function[m
[32m+[m	[32m.size lj_BC_FUNCF, 20[m
[32m+[m[32mlj_BC_FUNCF:[m
[32m+[m	[32m.byte 137,221,209,237,131,229,126,102,65,131,108,46,128,1,15,130[m
[32m+[m	[32m.byte 236,26,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_IFUNCF[m
[32m+[m	[32m.hidden lj_BC_IFUNCF[m
[32m+[m	[32m.type lj_BC_IFUNCF, @function[m
[32m+[m	[32m.size lj_BC_IFUNCF, 63[m
[32m+[m[32mlj_BC_IFUNCF:[m
[32m+[m	[32m.byte 68,139,123,204,139,108,36,24,141,12,202,59,77,32,15,135[m
[32m+[m	[32m.byte 223,2,0,0,15,182,75,194,57,200,118,18,139,3,15,182[m
[32m+[m	[32m.byte 204,15,182,232,131,195,4,193,232,16,65,255,36,238,199,68[m
[32m+[m	[32m.byte 194,252,255,255,255,255,131,192,1,57,200,118,241,235,221[m
[32m+[m
[32m+[m	[32m.globl lj_BC_JFUNCF[m
[32m+[m	[32m.hidden lj_BC_JFUNCF[m
[32m+[m	[32m.type lj_BC_JFUNCF, @function[m
[32m+[m	[32m.size lj_BC_JFUNCF, 54[m
[32m+[m[32mlj_BC_JFUNCF:[m
[32m+[m	[32m.byte 68,139,123,204,139,108,36,24,141,12,202,59,77,32,15,135[m
[32m+[m	[32m.byte 160,2,0,0,15,182,75,194,57,200,118,9,15,183,67,254[m
[32m+[m	[32m.byte 233,64,255,255,255,199,68,194,252,255,255,255,255,131,192,1[m
[32m+[m	[32m.byte 57,200,118,241,235,230[m
[32m+[m
[32m+[m	[32m.globl lj_BC_FUNCV[m
[32m+[m	[32m.hidden lj_BC_FUNCV[m
[32m+[m	[32m.type lj_BC_FUNCV, @function[m
[32m+[m	[32m.size lj_BC_FUNCV, 0[m
[32m+[m[32mlj_BC_FUNCV:[m
[32m+[m
[32m+[m	[32m.globl lj_BC_IFUNCV[m
[32m+[m	[32m.hidden lj_BC_IFUNCV[m
[32m+[m	[32m.type lj_BC_IFUNCV, @function[m
[32m+[m	[32m.size lj_BC_IFUNCV, 125[m
[32m+[m[32mlj_BC_IFUNCV:[m
[32m+[m	[32m.byte 141,44,197,3,0,0,0,141,4,194,68,139,122,248,137,104[m
[32m+[m	[32m.byte 252,68,137,120,248,139,108,36,24,141,12,200,59,77,32,15[m
[32m+[m	[32m.byte 135,84,2,0,0,137,209,137,194,15,182,107,194,133,237,116[m
[32m+[m	[32m.byte 37,131,193,8,57,209,115,52,68,139,121,248,68,137,56,68[m
[32m+[m	[32m.byte 139,121,252,68,137,120,4,131,192,8,199,65,252,255,255,255[m
[32m+[m	[32m.byte 255,131,237,1,117,219,68,139,123,204,139,3,15,182,204,15[m
[32m+[m	[32m.byte 182,232,131,195,4,193,232,16,65,255,36,238,199,64,4,255[m
[32m+[m	[32m.byte 255,255,255,131,192,8,131,237,1,117,241,235,217[m
[32m+[m
[32m+[m	[32m.globl lj_BC_JFUNCV[m
[32m+[m	[32m.hidden lj_BC_JFUNCV[m
[32m+[m	[32m.type lj_BC_JFUNCV, @function[m
[32m+[m	[32m.size lj_BC_JFUNCV, 1[m
[32m+[m[32mlj_BC_JFUNCV:[m
[32m+[m	[32m.byte 204[m
[32m+[m
[32m+[m	[32m.globl lj_BC_FUNCC[m
[32m+[m	[32m.hidden lj_BC_FUNCC[m
[32m+[m	[32m.type lj_BC_FUNCC, @function[m
[32m+[m	[32m.size lj_BC_FUNCC, 89[m
[32m+[m[32mlj_BC_FUNCC:[m
[32m+[m	[32m.byte 139,106,248,76,139,125,24,139,108,36,24,141,68,194,248,137[m
[32m+[m	[32m.byte 85,16,141,136,160,0,0,0,59,77,32,137,69,24,137,239[m
[32m+[m	[32m.byte 15,135,206,1,0,0,65,199,134,104,244,255,255,254,255,255[m
[32m+[m	[32m.byte 255,65,255,215,139,85,16,65,137,174,8,245,255,255,65,199[m
[32m+[m	[32m.byte 134,104,244,255,255,255,255,255,255,141,12,194,247,217,3,77[m
[32m+[m	[32m.byte 24,139,90,252,233,126,0,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_BC_FUNCCW[m
[32m+[m	[32m.hidden lj_BC_FUNCCW[m
[32m+[m	[32m.type lj_BC_FUNCCW, @function[m
[32m+[m	[32m.size lj_BC_FUNCCW, 93[m
[32m+[m[32mlj_BC_FUNCCW:[m
[32m+[m	[32m.byte 139,106,248,76,139,125,24,139,108,36,24,141,68,194,248,137[m
[32m+[m	[32m.byte 85,16,141,136,160,0,0,0,59,77,32,137,69,24,76,137[m
[32m+[m	[32m.byte 254,137,239,15,135,114,1,0,0,65,199,134,104,244,255,255[m
[32m+[m	[32m.byte 254,255,255,255,65,255,150,240,244,255,255,139,85,16,65,137[m
[32m+[m	[32m.byte 174,8,245,255,255,65,199,134,104,244,255,255,255,255,255,255[m
[32m+[m	[32m.byte 141,12,194,247,217,3,77,24,139,90,252,235,33[m
[32m+[m
[32m+[m	[32m.globl lj_vm_returnp[m
[32m+[m	[32m.hidden lj_vm_returnp[m
[32m+[m	[32m.type lj_vm_returnp, @function[m
[32m+[m	[32m.size lj_vm_returnp, 33[m
[32m+[m[32mlj_vm_returnp:[m
[32m+[m	[32m.byte 247,195,4,0,0,0,15,132,245,2,0,0,131,227,248,41[m
[32m+[m	[32m.byte 218,72,141,76,25,248,139,90,252,199,68,10,4,253,255,255[m
[32m+[m	[32m.byte 255[m
[32m+[m
[32m+[m	[32m.globl lj_vm_returnc[m
[32m+[m	[32m.hidden lj_vm_returnc[m
[32m+[m	[32m.type lj_vm_returnc, @function[m
[32m+[m	[32m.size lj_vm_returnc, 25[m
[32m+[m[32mlj_vm_returnc:[m
[32m+[m	[32m.byte 131,192,1,15,132,167,0,0,0,137,68,36,4,247,195,3[m
[32m+[m	[32m.byte 0,0,0,15,132,146,250,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vm_return[m
[32m+[m	[32m.hidden lj_vm_return[m
[32m+[m	[32m.type lj_vm_return, @function[m
[32m+[m	[32m.size lj_vm_return, 75[m
[32m+[m[32mlj_vm_return:[m
[32m+[m	[32m.byte 131,243,1,247,195,3,0,0,0,117,187,65,199,134,104,244[m
[32m+[m	[32m.byte 255,255,254,255,255,255,131,227,248,41,211,247,219,131,232,1[m
[32m+[m	[32m.byte 116,16,72,139,44,10,72,137,106,248,131,194,8,131,232,1[m
[32m+[m	[32m.byte 117,240,139,108,36,24,137,93,16,139,68,36,4,139,76,36[m
[32m+[m	[32m.byte 16,57,193,117,28,131,234,8,137,85,24[m
[32m+[m
[32m+[m	[32m.globl lj_vm_leave_cp[m
[32m+[m	[32m.hidden lj_vm_leave_cp[m
[32m+[m	[32m.type lj_vm_leave_cp, @function[m
[32m+[m	[32m.size lj_vm_leave_cp, 11[m
[32m+[m[32mlj_vm_leave_cp:[m
[32m+[m	[32m.byte 72,139,76,36,32,72,137,77,48,49,192[m
[32m+[m
[32m+[m	[32m.globl lj_vm_leave_unw[m
[32m+[m	[32m.hidden lj_vm_leave_unw[m
[32m+[m	[32m.type lj_vm_leave_unw, @function[m
[32m+[m	[32m.size lj_vm_leave_unw, 65[m
[32m+[m[32mlj_vm_leave_unw:[m
[32m+[m	[32m.byte 72,131,196,40,65,94,65,95,91,93,195,114,20,59,85,32[m
[32m+[m	[32m.byte 119,26,199,66,252,255,255,255,255,131,194,8,131,192,1,235[m
[32m+[m	[32m.byte 202,133,201,116,202,41,193,141,20,202,235,195,137,85,24,137[m
[32m+[m	[32m.byte 68,36,4,137,206,137,239[m
[32m+[m	[32mcall lj_state_growstack[m
[32m+[m	[32m.byte 139,85,24,235,162[m
[32m+[m
[32m+[m	[32m.globl lj_vm_unwind_yield[m
[32m+[m	[32m.hidden lj_vm_unwind_yield[m
[32m+[m	[32m.type lj_vm_unwind_yield, @function[m
[32m+[m	[32m.size lj_vm_unwind_yield, 4[m
[32m+[m[32mlj_vm_unwind_yield:[m
[32m+[m	[32m.byte 176,1,235,5[m
[32m+[m
[32m+[m	[32m.globl lj_vm_unwind_c[m
[32m+[m	[32m.hidden lj_vm_unwind_c[m
[32m+[m	[32m.type lj_vm_unwind_c, @function[m
[32m+[m	[32m.size lj_vm_unwind_c, 5[m
[32m+[m[32mlj_vm_unwind_c:[m
[32m+[m	[32m.byte 137,240,72,137,252[m
[32m+[m
[32m+[m	[32m.globl lj_vm_unwind_c_eh[m
[32m+[m	[32m.hidden lj_vm_unwind_c_eh[m
[32m+[m	[32m.type lj_vm_unwind_c_eh, @function[m
[32m+[m	[32m.size lj_vm_unwind_c_eh, 16[m
[32m+[m[32mlj_vm_unwind_c_eh:[m
[32m+[m	[32m.byte 139,108,36,24,139,109,8,199,69,88,254,255,255,255,235,166[m
[32m+[m
[32m+[m	[32m.globl lj_vm_unwind_rethrow[m
[32m+[m	[32m.hidden lj_vm_unwind_rethrow[m
[32m+[m	[32m.type lj_vm_unwind_rethrow, @function[m
[32m+[m	[32m.size lj_vm_unwind_rethrow, 21[m
[32m+[m[32mlj_vm_unwind_rethrow:[m
[32m+[m	[32m.byte 139,124,36,24,137,198,72,131,196,40,65,94,65,95,91,93[m
[32m+[m	[32mjmp lj_err_throw[m
[32m+[m
[32m+[m	[32m.globl lj_vm_unwind_ff[m
[32m+[m	[32m.hidden lj_vm_unwind_ff[m
[32m+[m	[32m.type lj_vm_unwind_ff, @function[m
[32m+[m	[32m.size lj_vm_unwind_ff, 7[m
[32m+[m[32mlj_vm_unwind_ff:[m
[32m+[m	[32m.byte 72,131,231,252,72,137,252[m
[32m+[m
[32m+[m	[32m.globl lj_vm_unwind_ff_eh[m
[32m+[m	[32m.hidden lj_vm_unwind_ff_eh[m
[32m+[m	[32m.type lj_vm_unwind_ff_eh, @function[m
[32m+[m	[32m.size lj_vm_unwind_ff_eh, 56[m
[32m+[m[32mlj_vm_unwind_ff_eh:[m
[32m+[m	[32m.byte 139,108,36,24,72,199,193,248,255,255,255,184,2,0,0,0[m
[32m+[m	[32m.byte 139,85,16,68,139,117,8,65,129,198,240,11,0,0,139,90[m
[32m+[m	[32m.byte 252,199,66,252,254,255,255,255,65,199,134,104,244,255,255,255[m
[32m+[m	[32m.byte 255,255,255,233,227,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vm_growstack_c[m
[32m+[m	[32m.hidden lj_vm_growstack_c[m
[32m+[m	[32m.type lj_vm_growstack_c, @function[m
[32m+[m	[32m.size lj_vm_growstack_c, 7[m
[32m+[m[32mlj_vm_growstack_c:[m
[32m+[m	[32m.byte 190,20,0,0,0,235,28[m
[32m+[m
[32m+[m	[32m.globl lj_vm_growstack_v[m
[32m+[m	[32m.hidden lj_vm_growstack_v[m
[32m+[m	[32m.type lj_vm_growstack_v, @function[m
[32m+[m	[32m.size lj_vm_growstack_v, 5[m
[32m+[m[32mlj_vm_growstack_v:[m
[32m+[m	[32m.byte 131,232,8,235,4[m
[32m+[m
[32m+[m	[32m.globl lj_vm_growstack_f[m
[32m+[m	[32m.hidden lj_vm_growstack_f[m
[32m+[m	[32m.type lj_vm_growstack_f, @function[m
[32m+[m	[32m.size lj_vm_growstack_f, 65[m
[32m+[m[32mlj_vm_growstack_f:[m
[32m+[m	[32m.byte 141,68,194,248,15,182,75,195,131,195,4,137,85,16,137,69[m
[32m+[m	[32m.byte 24,137,92,36,28,137,206,137,239[m
[32m+[m	[32mcall lj_state_growstack[m
[32m+[m	[32m.byte 139,85,16,139,69,24,139,106,248,41,208,193,232,3,131,192[m
[32m+[m	[32m.byte 1,139,93,16,139,11,15,182,233,15,182,205,131,195,4,65[m
[32m+[m	[32m.byte 255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_vm_resume[m
[32m+[m	[32m.hidden lj_vm_resume[m
[32m+[m	[32m.type lj_vm_resume, @function[m
[32m+[m	[32m.size lj_vm_resume, 132[m
[32m+[m[32mlj_vm_resume:[m
[32m+[m	[32m.byte 85,83,65,87,65,86,72,131,236,40,137,253,137,124,36,24[m
[32m+[m	[32m.byte 137,241,187,5,0,0,0,49,192,76,141,124,36,1,68,139[m
[32m+[m	[32m.byte 117,8,65,129,198,240,11,0,0,137,68,36,28,72,137,68[m
[32m+[m	[32m.byte 36,32,137,68,36,16,137,68,36,20,76,137,125,48,56,69[m
[32m+[m	[32m.byte 7,15,132,137,0,0,0,65,137,174,8,245,255,255,65,199[m
[32m+[m	[32m.byte 134,104,244,255,255,255,255,255,255,136,69,7,139,85,16,139[m
[32m+[m	[32m.byte 69,24,41,200,193,232,3,131,192,1,41,209,139,90,252,137[m
[32m+[m	[32m.byte 68,36,4,247,195,3,0,0,0,15,132,194,248,255,255,233[m
[32m+[m	[32m.byte 43,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vm_pcall[m
[32m+[m	[32m.hidden lj_vm_pcall[m
[32m+[m	[32m.type lj_vm_pcall, @function[m
[32m+[m	[32m.size lj_vm_pcall, 21[m
[32m+[m[32mlj_vm_pcall:[m
[32m+[m	[32m.byte 85,83,65,87,65,86,72,131,236,40,187,5,0,0,0,137[m
[32m+[m	[32m.byte 76,36,20,235,15[m
[32m+[m
[32m+[m	[32m.globl lj_vm_call[m
[32m+[m	[32m.hidden lj_vm_call[m
[32m+[m	[32m.type lj_vm_call, @function[m
[32m+[m	[32m.size lj_vm_call, 91[m
[32m+[m[32mlj_vm_call:[m
[32m+[m	[32m.byte 85,83,65,87,65,86,72,131,236,40,187,1,0,0,0,137[m
[32m+[m	[32m.byte 84,36,16,137,253,137,124,36,24,137,241,68,139,117,8,76[m
[32m+[m	[32m.byte 139,125,48,76,137,124,36,32,137,108,36,28,65,129,198,240[m
[32m+[m	[32m.byte 11,0,0,72,137,101,48,65,137,174,8,245,255,255,65,199[m
[32m+[m	[32m.byte 134,104,244,255,255,255,255,255,255,139,85,16,1,203,41,211[m
[32m+[m	[32m.byte 139,69,24,41,200,193,232,3,131,192,1[m
[32m+[m
[32m+[m	[32m.globl lj_vm_call_dispatch[m
[32m+[m	[32m.hidden lj_vm_call_dispatch[m
[32m+[m	[32m.type lj_vm_call_dispatch, @function[m
[32m+[m	[32m.size lj_vm_call_dispatch, 13[m
[32m+[m[32mlj_vm_call_dispatch:[m
[32m+[m	[32m.byte 139,105,248,131,121,252,247,15,133,163,3,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_vm_call_dispatch_f[m
[32m+[m	[32m.hidden lj_vm_call_dispatch_f[m
[32m+[m	[32m.type lj_vm_call_dispatch_f, @function[m
[32m+[m	[32m.size lj_vm_call_dispatch_f, 23[m
[32m+[m[32mlj_vm_call_dispatch_f:[m
[32m+[m	[32m.byte 137,202,137,90,252,139,93,16,139,11,15,182,233,15,182,205[m
[32m+[m	[32m.byte 131,195,4,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_vm_cpcall[m
[32m+[m	[32m.hidden lj_vm_cpcall[m
[32m+[m	[32m.type lj_vm_cpcall, @function[m
[32m+[m	[32m.size lj_vm_cpcall, 94[m
[32m+[m[32mlj_vm_cpcall:[m
[32m+[m	[32m.byte 85,83,65,87,65,86,72,131,236,40,137,253,137,124,36,24[m
[32m+[m	[32m.byte 137,108,36,28,68,139,125,36,68,43,125,24,68,139,117,8[m
[32m+[m	[32m.byte 199,68,36,20,0,0,0,0,68,137,124,36,16,65,129,198[m
[32m+[m	[32m.byte 240,11,0,0,76,139,125,48,76,137,124,36,32,72,137,101[m
[32m+[m	[32m.byte 48,65,137,174,8,245,255,255,255,209,133,192,15,132,144,253[m
[32m+[m	[32m.byte 255,255,137,193,187,5,0,0,0,233,90,255,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_cont_dispatch[m
[32m+[m	[32m.hidden lj_cont_dispatch[m
[32m+[m	[32m.type lj_cont_dispatch, @function[m
[32m+[m	[32m.size lj_cont_dispatch, 74[m
[32m+[m[32mlj_cont_dispatch:[m
[32m+[m	[32m.byte 1,209,131,227,248,137,213,41,218,199,68,193,252,255,255,255[m
[32m+[m	[32m.byte 255,137,200,139,93,244,72,99,77,240,131,249,1,118,24,76[m
[32m+[m	[32m.byte 141,61,128,227,255,255,76,1,249,68,139,122,248,69,139,127[m
[32m+[m	[32m.byte 16,69,139,127,208,255,225,15,132,47,27,0,0,41,213,193[m
[32m+[m	[32m.byte 237,3,141,69,255,233,217,20,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_cont_cat[m
[32m+[m	[32m.hidden lj_cont_cat[m
[32m+[m	[32m.type lj_cont_cat, @function[m
[32m+[m	[32m.size lj_cont_cat, 46[m
[32m+[m[32mlj_cont_cat:[m
[32m+[m	[32m.byte 15,182,75,255,131,237,16,141,12,202,41,233,15,132,132,0[m
[32m+[m	[32m.byte 0,0,247,217,193,233,3,139,124,36,24,137,87,16,137,202[m
[32m+[m	[32m.byte 72,139,8,72,137,77,0,137,238,233,60,236,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_tgets[m
[32m+[m	[32m.hidden lj_vmeta_tgets[m
[32m+[m	[32m.type lj_vmeta_tgets, @function[m
[32m+[m	[32m.size lj_vmeta_tgets, 41[m
[32m+[m[32mlj_vmeta_tgets:[m
[32m+[m	[32m.byte 137,4,36,199,68,36,4,251,255,255,255,72,141,4,36,128[m
[32m+[m	[32m.byte 123,252,54,117,46,65,141,142,160,244,255,255,137,41,199,65[m
[32m+[m	[32m.byte 4,244,255,255,255,137,205,235,33[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_tgetb[m
[32m+[m	[32m.hidden lj_vmeta_tgetb[m
[32m+[m	[32m.type lj_vmeta_tgetb, @function[m
[32m+[m	[32m.size lj_vmeta_tgetb, 19[m
[32m+[m[32mlj_vmeta_tgetb:[m
[32m+[m	[32m.byte 15,182,67,254,242,15,42,192,242,15,17,4,36,72,141,4[m
[32m+[m	[32m.byte 36,235,7[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_tgetv[m
[32m+[m	[32m.hidden lj_vmeta_tgetv[m
[32m+[m	[32m.type lj_vmeta_tgetv, @function[m
[32m+[m	[32m.size lj_vmeta_tgetv, 44[m
[32m+[m[32mlj_vmeta_tgetv:[m
[32m+[m	[32m.byte 15,182,67,254,141,4,194,15,182,107,255,141,44,234,139,124[m
[32m+[m	[32m.byte 36,24,137,87,16,137,238,72,137,194,137,253,137,92,36,28[m
[32m+[m	[32mcall lj_meta_tget[m
[32m+[m	[32m.byte 139,85,16,133,192,116,29[m
[32m+[m
[32m+[m	[32m.globl lj_cont_ra[m
[32m+[m	[32m.hidden lj_cont_ra[m
[32m+[m	[32m.type lj_cont_ra, @function[m
[32m+[m	[32m.size lj_cont_ra, 53[m
[32m+[m[32mlj_cont_ra:[m
[32m+[m	[32m.byte 15,182,75,253,72,139,40,72,137,44,202,139,3,15,182,204[m
[32m+[m	[32m.byte 15,182,232,131,195,4,193,232,16,65,255,36,238,139,77,24[m
[32m+[m	[32m.byte 137,89,244,141,89,2,41,211,139,105,248,184,3,0,0,0[m
[32m+[m	[32m.byte 233,118,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_tgetr[m
[32m+[m	[32m.hidden lj_vmeta_tgetr[m
[32m+[m	[32m.type lj_vmeta_tgetr, @function[m
[32m+[m	[32m.size lj_vmeta_tgetr, 38[m
[32m+[m[32mlj_vmeta_tgetr:[m
[32m+[m	[32m.byte 137,239,137,213,137,198[m
[32m+[m	[32mcall lj_tab_getinth[m
[32m+[m	[32m.byte 15,182,75,253,137,234,133,192,15,133,139,240,255,255,199,68[m
[32m+[m	[32m.byte 202,4,255,255,255,255,233,133,240,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_tsets[m
[32m+[m	[32m.hidden lj_vmeta_tsets[m
[32m+[m	[32m.type lj_vmeta_tsets, @function[m
[32m+[m	[32m.size lj_vmeta_tsets, 41[m
[32m+[m[32mlj_vmeta_tsets:[m
[32m+[m	[32m.byte 137,4,36,199,68,36,4,251,255,255,255,72,141,4,36,128[m
[32m+[m	[32m.byte 123,252,55,117,46,65,141,142,160,244,255,255,137,41,199,65[m
[32m+[m	[32m.byte 4,244,255,255,255,137,205,235,33[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_tsetb[m
[32m+[m	[32m.hidden lj_vmeta_tsetb[m
[32m+[m	[32m.type lj_vmeta_tsetb, @function[m
[32m+[m	[32m.size lj_vmeta_tsetb, 19[m
[32m+[m[32mlj_vmeta_tsetb:[m
[32m+[m	[32m.byte 15,182,67,254,242,15,42,192,242,15,17,4,36,72,141,4[m
[32m+[m	[32m.byte 36,235,7[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_tsetv[m
[32m+[m	[32m.hidden lj_vmeta_tsetv[m
[32m+[m	[32m.type lj_vmeta_tsetv, @function[m
[32m+[m	[32m.size lj_vmeta_tsetv, 55[m
[32m+[m[32mlj_vmeta_tsetv:[m
[32m+[m	[32m.byte 15,182,67,254,141,4,194,15,182,107,255,141,44,234,139,124[m
[32m+[m	[32m.byte 36,24,137,87,16,137,238,72,137,194,137,253,137,92,36,28[m
[32m+[m	[32mcall lj_meta_tset[m
[32m+[m	[32m.byte 139,85,16,133,192,116,29,15,182,75,253,72,139,44,202,72[m
[32m+[m	[32m.byte 137,40[m
[32m+[m
[32m+[m	[32m.globl lj_cont_nop[m
[32m+[m	[32m.hidden lj_cont_nop[m
[32m+[m	[32m.type lj_cont_nop, @function[m
[32m+[m	[32m.size lj_cont_nop, 54[m
[32m+[m[32mlj_cont_nop:[m
[32m+[m	[32m.byte 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,255[m
[32m+[m	[32m.byte 36,238,139,77,24,137,89,244,15,182,67,253,72,139,44,194[m
[32m+[m	[32m.byte 72,137,105,16,141,89,2,41,211,139,105,248,184,4,0,0[m
[32m+[m	[32m.byte 0,233,167,253,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_tsetr[m
[32m+[m	[32m.hidden lj_vmeta_tsetr[m
[32m+[m	[32m.type lj_vmeta_tsetr, @function[m
[32m+[m	[32m.size lj_vmeta_tsetr, 33[m
[32m+[m[32mlj_vmeta_tsetr:[m
[32m+[m	[32m.byte 139,124,36,24,137,238,137,87,16,137,213,137,194,137,92,36[m
[32m+[m	[32m.byte 28[m
[32m+[m	[32mcall lj_tab_setinth[m
[32m+[m	[32m.byte 15,182,75,253,137,234,233,140,242,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_comp[m
[32m+[m	[32m.hidden lj_vmeta_comp[m
[32m+[m	[32m.type lj_vmeta_comp, @function[m
[32m+[m	[32m.size lj_vmeta_comp, 74[m
[32m+[m[32mlj_vmeta_comp:[m
[32m+[m	[32m.byte 139,108,36,24,137,85,16,141,52,202,141,20,194,137,239,15[m
[32m+[m	[32m.byte 182,75,252,137,92,36,28[m
[32m+[m	[32mcall lj_meta_comp[m
[32m+[m	[32m.byte 139,85,16,131,248,1,15,135,207,0,0,0,141,91,4,114[m
[32m+[m	[32m.byte 11,15,183,67,254,141,156,131,0,0,254,255,139,3,15,182[m
[32m+[m	[32m.byte 204,15,182,232,131,195,4,193,232,16,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_cont_condt[m
[32m+[m	[32m.hidden lj_cont_condt[m
[32m+[m	[32m.type lj_cont_condt, @function[m
[32m+[m	[32m.size lj_cont_condt, 11[m
[32m+[m[32mlj_cont_condt:[m
[32m+[m	[32m.byte 131,195,4,131,120,4,254,114,218,235,227[m
[32m+[m
[32m+[m	[32m.globl lj_cont_condf[m
[32m+[m	[32m.hidden lj_cont_condf[m
[32m+[m	[32m.type lj_cont_condf, @function[m
[32m+[m	[32m.size lj_cont_condf, 6[m
[32m+[m[32mlj_cont_condf:[m
[32m+[m	[32m.byte 131,120,4,254,235,205[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_equal[m
[32m+[m	[32m.hidden lj_vmeta_equal[m
[32m+[m	[32m.type lj_vmeta_equal, @function[m
[32m+[m	[32m.size lj_vmeta_equal, 29[m
[32m+[m[32mlj_vmeta_equal:[m
[32m+[m	[32m.byte 131,235,4,137,206,137,233,139,108,36,24,137,85,16,137,194[m
[32m+[m	[32m.byte 137,239,137,92,36,28[m
[32m+[m	[32mcall lj_meta_equal[m
[32m+[m	[32m.byte 235,164[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_equal_cd[m
[32m+[m	[32m.hidden lj_vmeta_equal_cd[m
[32m+[m	[32m.type lj_vmeta_equal_cd, @function[m
[32m+[m	[32m.size lj_vmeta_equal_cd, 26[m
[32m+[m[32mlj_vmeta_equal_cd:[m
[32m+[m	[32m.byte 131,235,4,139,108,36,24,137,85,16,137,239,139,115,252,137[m
[32m+[m	[32m.byte 92,36,28[m
[32m+[m	[32mcall lj_meta_equal_cd[m
[32m+[m	[32m.byte 235,138[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_istype[m
[32m+[m	[32m.hidden lj_vmeta_istype[m
[32m+[m	[32m.type lj_vmeta_istype, @function[m
[32m+[m	[32m.size lj_vmeta_istype, 29[m
[32m+[m[32mlj_vmeta_istype:[m
[32m+[m	[32m.byte 139,108,36,24,137,85,16,137,206,15,183,83,254,137,239,137[m
[32m+[m	[32m.byte 92,36,28[m
[32m+[m	[32mcall lj_meta_istype[m
[32m+[m	[32m.byte 139,85,16,235,137[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_arith_vno[m
[32m+[m	[32m.hidden lj_vmeta_arith_vno[m
[32m+[m	[32m.type lj_vmeta_arith_vno, @function[m
[32m+[m	[32m.size lj_vmeta_arith_vno, 0[m
[32m+[m[32mlj_vmeta_arith_vno:[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_arith_vn[m
[32m+[m	[32m.hidden lj_vmeta_arith_vn[m
[32m+[m	[32m.type lj_vmeta_arith_vn, @function[m
[32m+[m	[32m.size lj_vmeta_arith_vn, 6[m
[32m+[m[32mlj_vmeta_arith_vn:[m
[32m+[m	[32m.byte 65,141,4,199,235,20[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_arith_nvo[m
[32m+[m	[32m.hidden lj_vmeta_arith_nvo[m
[32m+[m	[32m.type lj_vmeta_arith_nvo, @function[m
[32m+[m	[32m.size lj_vmeta_arith_nvo, 0[m
[32m+[m[32mlj_vmeta_arith_nvo:[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_arith_nv[m
[32m+[m	[32m.hidden lj_vmeta_arith_nv[m
[32m+[m	[32m.type lj_vmeta_arith_nv, @function[m
[32m+[m	[32m.size lj_vmeta_arith_nv, 10[m
[32m+[m[32mlj_vmeta_arith_nv:[m
[32m+[m	[32m.byte 65,141,4,199,141,44,234,149,235,13[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_unm[m
[32m+[m	[32m.hidden lj_vmeta_unm[m
[32m+[m	[32m.type lj_vmeta_unm, @function[m
[32m+[m	[32m.size lj_vmeta_unm, 7[m
[32m+[m[32mlj_vmeta_unm:[m
[32m+[m	[32m.byte 141,4,194,137,197,235,6[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_arith_vvo[m
[32m+[m	[32m.hidden lj_vmeta_arith_vvo[m
[32m+[m	[32m.type lj_vmeta_arith_vvo, @function[m
[32m+[m	[32m.size lj_vmeta_arith_vvo, 0[m
[32m+[m[32mlj_vmeta_arith_vvo:[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_arith_vv[m
[32m+[m	[32m.hidden lj_vmeta_arith_vv[m
[32m+[m	[32m.type lj_vmeta_arith_vv, @function[m
[32m+[m	[32m.size lj_vmeta_arith_vv, 49[m
[32m+[m[32mlj_vmeta_arith_vv:[m
[32m+[m	[32m.byte 141,4,194,141,44,234,141,12,202,68,15,182,67,252,137,206[m
[32m+[m	[32m.byte 137,193,139,124,36,24,137,87,16,137,234,137,253,137,92,36[m
[32m+[m	[32m.byte 28[m
[32m+[m	[32mcall lj_meta_arith[m
[32m+[m	[32m.byte 139,85,16,133,192,15,132,178,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_binop[m
[32m+[m	[32m.hidden lj_vmeta_binop[m
[32m+[m	[32m.type lj_vmeta_binop, @function[m
[32m+[m	[32m.size lj_vmeta_binop, 20[m
[32m+[m[32mlj_vmeta_binop:[m
[32m+[m	[32m.byte 137,193,41,208,137,89,244,141,88,2,184,3,0,0,0,233[m
[32m+[m	[32m.byte 110,252,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_len[m
[32m+[m	[32m.hidden lj_vmeta_len[m
[32m+[m	[32m.type lj_vmeta_len, @function[m
[32m+[m	[32m.size lj_vmeta_len, 26[m
[32m+[m[32mlj_vmeta_len:[m
[32m+[m	[32m.byte 139,108,36,24,137,85,16,141,52,194,137,239,137,92,36,28[m
[32m+[m	[32mcall lj_meta_len[m
[32m+[m	[32m.byte 139,85,16,235,210[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_call_ra[m
[32m+[m	[32m.hidden lj_vmeta_call_ra[m
[32m+[m	[32m.type lj_vmeta_call_ra, @function[m
[32m+[m	[32m.size lj_vmeta_call_ra, 4[m
[32m+[m[32mlj_vmeta_call_ra:[m
[32m+[m	[32m.byte 141,76,202,8[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_call[m
[32m+[m	[32m.hidden lj_vmeta_call[m
[32m+[m	[32m.type lj_vmeta_call, @function[m
[32m+[m	[32m.size lj_vmeta_call, 81[m
[32m+[m[32mlj_vmeta_call:[m
[32m+[m	[32m.byte 137,76,36,4,137,4,36,131,233,8,139,108,36,24,137,85[m
[32m+[m	[32m.byte 16,137,206,141,20,193,137,239,137,92,36,28[m
[32m+[m	[32mcall lj_meta_call[m
[32m+[m	[32m.byte 139,85,16,139,76,36,4,139,4,36,139,105,248,131,192,1[m
[32m+[m	[32m.byte 65,57,215,15,132,205,241,255,255,137,202,137,90,252,139,93[m
[32m+[m	[32m.byte 16,139,11,15,182,233,15,182,205,131,195,4,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_vmeta_for[m
[32m+[m	[32m.hidden lj_vmeta_for[m
[32m+[m	[32m.type lj_vmeta_for, @function[m
[32m+[m	[32m.size lj_vmeta_for, 43[m
[32m+[m[32mlj_vmeta_for:[m
[32m+[m	[32m.byte 139,108,36,24,137,85,16,137,206,137,239,137,92,36,28[m
[32m+[m	[32mcall lj_meta_for[m
[32m+[m	[32m.byte 139,85,16,139,67,252,15,182,204,15,182,232,193,232,16,65[m
[32m+[m	[32m.byte 255,164,238,208,4,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_assert[m
[32m+[m	[32m.hidden lj_ff_assert[m
[32m+[m	[32m.type lj_ff_assert, @function[m
[32m+[m	[32m.size lj_ff_assert, 67[m
[32m+[m[32mlj_ff_assert:[m
[32m+[m	[32m.byte 131,248,2,15,130,25,17,0,0,139,106,4,131,253,254,15[m
[32m+[m	[32m.byte 131,13,17,0,0,139,90,252,137,68,36,4,137,106,252,139[m
[32m+[m	[32m.byte 42,137,106,248,131,232,2,116,17,137,209,131,193,8,72,139[m
[32m+[m	[32m.byte 41,72,137,105,248,131,232,1,117,241,139,68,36,4,233,100[m
[32m+[m	[32m.byte 6,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_type[m
[32m+[m	[32m.hidden lj_ff_type[m
[32m+[m	[32m.type lj_ff_type, @function[m
[32m+[m	[32m.size lj_ff_type, 66[m
[32m+[m[32mlj_ff_type:[m
[32m+[m	[32m.byte 131,248,2,15,130,214,16,0,0,139,106,4,137,233,193,249[m
[32m+[m	[32m.byte 15,131,249,254,116,37,184,13,0,0,0,247,213,57,232,15[m
[32m+[m	[32m.byte 71,197,139,106,248,139,68,197,32,139,90,252,199,66,252,251[m
[32m+[m	[32m.byte 255,255,255,137,66,248,233,32,6,0,0,184,3,0,0,0[m
[32m+[m	[32m.byte 235,224[m
[32m+[m
[32m+[m	[32m.globl lj_ff_getmetatable[m
[32m+[m	[32m.hidden lj_ff_getmetatable[m
[32m+[m	[32m.type lj_ff_getmetatable, @function[m
[32m+[m	[32m.size lj_ff_getmetatable, 162[m
[32m+[m[32mlj_ff_getmetatable:[m
[32m+[m	[32m.byte 131,248,2,15,130,148,16,0,0,139,106,4,139,90,252,131[m
[32m+[m	[32m.byte 253,244,117,97,139,42,139,109,16,133,237,199,66,252,255,255[m
[32m+[m	[32m.byte 255,255,15,132,241,5,0,0,65,139,134,92,245,255,255,199[m
[32m+[m	[32m.byte 66,252,244,255,255,255,137,106,248,139,77,28,35,72,8,107[m
[32m+[m	[32m.byte 201,24,3,77,20,131,121,12,251,117,5,57,65,8,116,12[m
[32m+[m	[32m.byte 139,73,16,133,201,117,238,233,189,5,0,0,139,105,4,131[m
[32m+[m	[32m.byte 253,255,15,132,177,5,0,0,139,1,137,106,252,137,66,248[m
[32m+[m	[32m.byte 233,164,5,0,0,131,253,243,116,154,131,253,242,119,20,129[m
[32m+[m	[32m.byte 253,255,255,254,255,118,7,189,252,255,255,255,235,5,189,242[m
[32m+[m	[32m.byte 255,255,255,247,213,65,139,172,174,112,245,255,255,233,119,255[m
[32m+[m	[32m.byte 255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_setmetatable[m
[32m+[m	[32m.hidden lj_ff_setmetatable[m
[32m+[m	[32m.type lj_ff_setmetatable, @function[m
[32m+[m	[32m.size lj_ff_setmetatable, 92[m
[32m+[m[32mlj_ff_setmetatable:[m
[32m+[m	[32m.byte 131,248,3,15,130,242,15,0,0,131,122,4,244,15,133,232[m
[32m+[m	[32m.byte 15,0,0,139,42,131,125,16,0,15,133,220,15,0,0,131[m
[32m+[m	[32m.byte 122,12,244,15,133,210,15,0,0,139,66,8,137,69,16,139[m
[32m+[m	[32m.byte 90,252,199,66,252,244,255,255,255,137,106,248,246,69,4,4[m
[32m+[m	[32m.byte 116,21,128,101,4,251,65,139,134,76,244,255,255,65,137,174[m
[32m+[m	[32m.byte 76,244,255,255,137,69,12,233,27,5,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_rawget[m
[32m+[m	[32m.hidden lj_ff_rawget[m
[32m+[m	[32m.type lj_ff_rawget, @function[m
[32m+[m	[32m.size lj_ff_rawget, 52[m
[32m+[m[32mlj_ff_rawget:[m
[32m+[m	[32m.byte 131,248,3,15,130,150,15,0,0,131,122,4,244,15,133,140[m
[32m+[m	[32m.byte 15,0,0,137,213,139,50,141,82,8,139,124,36,24[m
[32m+[m	[32mcall lj_tab_get[m
[32m+[m	[32m.byte 137,234,72,139,40,139,90,252,72,137,106,248,233,231,4,0[m
[32m+[m	[32m.byte 0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_tonumber[m
[32m+[m	[32m.hidden lj_ff_tonumber[m
[32m+[m	[32m.type lj_ff_tonumber, @function[m
[32m+[m	[32m.size lj_ff_tonumber, 31[m
[32m+[m[32mlj_ff_tonumber:[m
[32m+[m	[32m.byte 131,248,2,15,133,98,15,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,85,15,0,0,242,15,16,2,233,192,4,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_tostring[m
[32m+[m	[32m.hidden lj_ff_tostring[m
[32m+[m	[32m.type lj_ff_tostring, @function[m
[32m+[m	[32m.size lj_ff_tostring, 108[m
[32m+[m[32mlj_ff_tostring:[m
[32m+[m	[32m.byte 131,248,2,15,130,67,15,0,0,139,90,252,131,122,4,251[m
[32m+[m	[32m.byte 117,17,139,2,199,66,252,251,255,255,255,137,66,248,233,165[m
[32m+[m	[32m.byte 4,0,0,129,122,4,255,255,254,255,15,135,28,15,0,0[m
[32m+[m	[32m.byte 65,131,190,164,245,255,255,0,15,133,14,15,0,0,65,139[m
[32m+[m	[32m.byte 174,48,244,255,255,65,59,174,52,244,255,255,114,5,232,136[m
[32m+[m	[32m.byte 15,0,0,139,108,36,24,137,85,16,137,92,36,28,137,214[m
[32m+[m	[32m.byte 137,239[m
[32m+[m	[32mcall lj_strfmt_num[m
[32m+[m	[32m.byte 139,85,16,235,168[m
[32m+[m
[32m+[m	[32m.globl lj_ff_next[m
[32m+[m	[32m.hidden lj_ff_next[m
[32m+[m	[32m.type lj_ff_next, @function[m
[32m+[m	[32m.size lj_ff_next, 72[m
[32m+[m[32mlj_ff_next:[m
[32m+[m	[32m.byte 131,248,2,15,130,215,14,0,0,116,71,131,122,4,244,15[m
[32m+[m	[32m.byte 133,203,14,0,0,139,108,36,24,137,85,16,137,85,24,139[m
[32m+[m	[32m.byte 90,252,139,50,141,82,8,137,239,137,92,36,28[m
[32m+[m	[32mcall lj_tab_next[m
[32m+[m	[32m.byte 139,85,16,133,192,116,34,72,139,106,8,72,139,66,16,72[m
[32m+[m	[32m.byte 137,106,248,72,137,2[m
[32m+[m
[32m+[m	[32m.globl lj_fff_res2[m
[32m+[m	[32m.hidden lj_fff_res2[m
[32m+[m	[32m.type lj_fff_res2, @function[m
[32m+[m	[32m.size lj_fff_res2, 31[m
[32m+[m[32mlj_fff_res2:[m
[32m+[m	[32m.byte 184,3,0,0,0,233,15,4,0,0,199,66,12,255,255,255[m
[32m+[m	[32m.byte 255,235,176,199,66,252,255,255,255,255,233,245,3,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_pairs[m
[32m+[m	[32m.hidden lj_ff_pairs[m
[32m+[m	[32m.type lj_ff_pairs, @function[m
[32m+[m	[32m.size lj_ff_pairs, 57[m
[32m+[m[32mlj_ff_pairs:[m
[32m+[m	[32m.byte 131,248,2,15,130,112,14,0,0,139,42,131,122,4,244,15[m
[32m+[m	[32m.byte 133,100,14,0,0,139,106,248,139,69,32,139,90,252,199,66[m
[32m+[m	[32m.byte 252,247,255,255,255,137,66,248,199,66,12,255,255,255,255,184[m
[32m+[m	[32m.byte 4,0,0,0,233,193,3,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_ipairs_aux[m
[32m+[m	[32m.hidden lj_ff_ipairs_aux[m
[32m+[m	[32m.type lj_ff_ipairs_aux, @function[m
[32m+[m	[32m.size lj_ff_ipairs_aux, 121[m
[32m+[m[32mlj_ff_ipairs_aux:[m
[32m+[m	[32m.byte 131,248,3,15,130,55,14,0,0,131,122,4,244,15,133,45[m
[32m+[m	[32m.byte 14,0,0,129,122,12,255,255,254,255,15,131,32,14,0,0[m
[32m+[m	[32m.byte 139,90,252,242,15,16,66,8,72,189,0,0,0,0,0,0[m
[32m+[m	[32m.byte 240,63,102,72,15,110,205,242,15,88,193,242,15,44,192,242[m
[32m+[m	[32m.byte 15,17,66,248,139,42,59,69,24,115,23,193,224,3,3,69[m
[32m+[m	[32m.byte 8,131,120,4,255,116,34,72,139,40,72,137,42,233,70,255[m
[32m+[m	[32m.byte 255,255,131,125,28,0,116,17,137,239,137,213,137,198[m
[32m+[m	[32mcall lj_tab_getinth[m
[32m+[m	[32m.byte 137,234,133,192,117,216[m
[32m+[m
[32m+[m	[32m.globl lj_fff_res0[m
[32m+[m	[32m.hidden lj_fff_res0[m
[32m+[m	[32m.type lj_fff_res0, @function[m
[32m+[m	[32m.size lj_fff_res0, 10[m
[32m+[m[32mlj_fff_res0:[m
[32m+[m	[32m.byte 184,1,0,0,0,233,62,3,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_ipairs[m
[32m+[m	[32m.hidden lj_ff_ipairs[m
[32m+[m	[32m.type lj_ff_ipairs, @function[m
[32m+[m	[32m.size lj_ff_ipairs, 58[m
[32m+[m[32mlj_ff_ipairs:[m
[32m+[m	[32m.byte 131,248,2,15,130,180,13,0,0,139,42,131,122,4,244,15[m
[32m+[m	[32m.byte 133,168,13,0,0,139,106,248,139,69,32,139,90,252,199,66[m
[32m+[m	[32m.byte 252,247,255,255,255,137,66,248,15,87,192,242,15,17,66,8[m
[32m+[m	[32m.byte 184,4,0,0,0,233,4,3,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_pcall[m
[32m+[m	[32m.hidden lj_ff_pcall[m
[32m+[m	[32m.type lj_ff_pcall, @function[m
[32m+[m	[32m.size lj_ff_pcall, 41[m
[32m+[m[32mlj_ff_pcall:[m
[32m+[m	[32m.byte 131,248,2,15,130,122,13,0,0,141,74,8,131,232,1,187[m
[32m+[m	[32m.byte 14,0,0,0,65,15,182,174,141,244,255,255,193,237,4,131[m
[32m+[m	[32m.byte 229,1,1,235,233,12,248,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_xpcall[m
[32m+[m	[32m.hidden lj_ff_xpcall[m
[32m+[m	[32m.type lj_ff_xpcall, @function[m
[32m+[m	[32m.size lj_ff_xpcall, 55[m
[32m+[m[32mlj_ff_xpcall:[m
[32m+[m	[32m.byte 131,248,3,15,130,81,13,0,0,131,122,12,247,15,133,71[m
[32m+[m	[32m.byte 13,0,0,139,106,4,137,106,12,199,66,4,247,255,255,255[m
[32m+[m	[32m.byte 139,42,139,90,8,137,106,8,137,26,141,74,16,131,232,2[m
[32m+[m	[32m.byte 187,22,0,0,0,235,180[m
[32m+[m
[32m+[m	[32m.globl lj_ff_coroutine_resume[m
[32m+[m	[32m.hidden lj_ff_coroutine_resume[m
[32m+[m	[32m.type lj_ff_coroutine_resume, @function[m
[32m+[m	[32m.size lj_ff_coroutine_resume, 310[m
[32m+[m[32mlj_ff_coroutine_resume:[m
[32m+[m	[32m.byte 131,248,2,15,130,26,13,0,0,139,42,139,90,252,137,92[m
[32m+[m	[32m.byte 36,28,137,44,36,131,122,4,249,15,133,4,13,0,0,72[m
[32m+[m	[32m.byte 131,125,48,0,15,133,249,12,0,0,128,125,7,1,15,135[m
[32m+[m	[32m.byte 239,12,0,0,139,77,24,116,9,59,77,16,15,132,225,12[m
[32m+[m	[32m.byte 0,0,141,92,193,240,59,93,32,15,135,212,12,0,0,137[m
[32m+[m	[32m.byte 93,24,139,108,36,24,137,85,16,131,194,8,137,85,24,141[m
[32m+[m	[32m.byte 108,194,232,72,41,221,57,203,116,15,72,139,4,43,72,137[m
[32m+[m	[32m.byte 67,248,131,235,8,57,203,117,241,137,206,139,60,36,232,94[m
[32m+[m	[32m.byte 246,255,255,139,108,36,24,139,28,36,139,85,16,65,137,174[m
[32m+[m	[32m.byte 8,245,255,255,65,199,134,104,244,255,255,255,255,255,255,131[m
[32m+[m	[32m.byte 248,1,119,90,139,75,16,68,139,123,24,137,75,24,68,137[m
[32m+[m	[32m.byte 251,41,203,116,31,141,4,26,193,235,3,59,69,32,119,91[m
[32m+[m	[32m.byte 137,213,72,41,205,72,139,1,72,137,4,41,131,193,8,68[m
[32m+[m	[32m.byte 57,249,117,241,141,67,2,199,66,252,253,255,255,255,139,92[m
[32m+[m	[32m.byte 36,28,137,68,36,4,72,199,193,248,255,255,255,247,195,3[m
[32m+[m	[32m.byte 0,0,0,15,132,41,239,255,255,233,146,244,255,255,199,66[m
[32m+[m	[32m.byte 252,254,255,255,255,139,75,24,131,233,8,137,75,24,72,139[m
[32m+[m	[32m.byte 1,72,137,2,184,3,0,0,0,235,195,139,12,36,68,137[m
[32m+[m	[32m.byte 121,24,137,222,137,239[m
[32m+[m	[32mcall lj_state_growstack[m
[32m+[m	[32m.byte 139,28,36,139,85,16,233,110,255,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_coroutine_wrap_aux[m
[32m+[m	[32m.hidden lj_ff_coroutine_wrap_aux[m
[32m+[m	[32m.type lj_ff_coroutine_wrap_aux, @function[m
[32m+[m	[32m.size lj_ff_coroutine_wrap_aux, 257[m
[32m+[m[32mlj_ff_coroutine_wrap_aux:[m
[32m+[m	[32m.byte 139,106,248,139,109,32,139,90,252,137,92,36,28,137,44,36[m
[32m+[m	[32m.byte 72,131,125,48,0,15,133,210,11,0,0,128,125,7,1,15[m
[32m+[m	[32m.byte 135,200,11,0,0,139,77,24,116,9,59,77,16,15,132,186[m
[32m+[m	[32m.byte 11,0,0,141,92,193,248,59,93,32,15,135,173,11,0,0[m
[32m+[m	[32m.byte 137,93,24,139,108,36,24,137,85,16,137,85,24,141,108,194[m
[32m+[m	[32m.byte 240,72,41,221,57,203,116,15,72,139,4,43,72,137,67,248[m
[32m+[m	[32m.byte 131,235,8,57,203,117,241,137,206,139,60,36,232,58,245,255[m
[32m+[m	[32m.byte 255,139,108,36,24,139,28,36,139,85,16,65,137,174,8,245[m
[32m+[m	[32m.byte 255,255,65,199,134,104,244,255,255,255,255,255,255,131,248,1[m
[32m+[m	[32m.byte 119,78,139,75,16,68,139,123,24,137,75,24,68,137,251,41[m
[32m+[m	[32m.byte 203,116,31,141,4,26,193,235,3,59,69,32,119,59,137,213[m
[32m+[m	[32m.byte 72,41,205,72,139,1,72,137,4,41,131,193,8,68,57,249[m
[32m+[m	[32m.byte 117,241,141,67,1,139,92,36,28,137,68,36,4,49,201,247[m
[32m+[m	[32m.byte 195,3,0,0,0,15,132,17,238,255,255,233,122,243,255,255[m
[32m+[m	[32m.byte 137,222,137,239[m
[32m+[m	[32mcall lj_ffh_coroutine_wrap_err[m
[32m+[m	[32m.byte 139,12,36,68,137,121,24,137,222,137,239[m
[32m+[m	[32mcall lj_state_growstack[m
[32m+[m	[32m.byte 139,28,36,139,85,16,235,145[m
[32m+[m
[32m+[m	[32m.globl lj_ff_coroutine_yield[m
[32m+[m	[32m.hidden lj_ff_coroutine_yield[m
[32m+[m	[32m.type lj_ff_coroutine_yield, @function[m
[32m+[m	[32m.size lj_ff_coroutine_yield, 44[m
[32m+[m[32mlj_ff_coroutine_yield:[m
[32m+[m	[32m.byte 139,108,36,24,72,247,69,48,1,0,0,0,15,132,218,10[m
[32m+[m	[32m.byte 0,0,137,85,16,141,68,194,248,137,69,24,49,192,72,137[m
[32m+[m	[32m.byte 69,48,176,1,136,69,7,233,131,243,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_fff_resi[m
[32m+[m	[32m.hidden lj_fff_resi[m
[32m+[m	[32m.type lj_fff_resi, @function[m
[32m+[m	[32m.size lj_fff_resi, 0[m
[32m+[m[32mlj_fff_resi:[m
[32m+[m
[32m+[m	[32m.globl lj_fff_resn[m
[32m+[m	[32m.hidden lj_fff_resn[m
[32m+[m	[32m.type lj_fff_resn, @function[m
[32m+[m	[32m.size lj_fff_resn, 8[m
[32m+[m[32mlj_fff_resn:[m
[32m+[m	[32m.byte 139,90,252,221,90,248,235,52[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_abs[m
[32m+[m	[32m.hidden lj_ff_math_abs[m
[32m+[m	[32m.type lj_ff_math_abs, @function[m
[32m+[m	[32m.size lj_ff_math_abs, 44[m
[32m+[m[32mlj_ff_math_abs:[m
[32m+[m	[32m.byte 131,248,2,15,130,175,10,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,162,10,0,0,242,15,16,2,72,184,255,255,255,255[m
[32m+[m	[32m.byte 255,255,255,127,102,72,15,110,200,15,84,193[m
[32m+[m
[32m+[m	[32m.globl lj_fff_resxmm0[m
[32m+[m	[32m.hidden lj_fff_resxmm0[m
[32m+[m	[32m.type lj_fff_resxmm0, @function[m
[32m+[m	[32m.size lj_fff_resxmm0, 8[m
[32m+[m[32mlj_fff_resxmm0:[m
[32m+[m	[32m.byte 139,90,252,242,15,17,66,248[m
[32m+[m
[32m+[m	[32m.globl lj_fff_res1[m
[32m+[m	[32m.hidden lj_fff_res1[m
[32m+[m	[32m.type lj_fff_res1, @function[m
[32m+[m	[32m.size lj_fff_res1, 5[m
[32m+[m[32mlj_fff_res1:[m
[32m+[m	[32m.byte 184,2,0,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_fff_res[m
[32m+[m	[32m.hidden lj_fff_res[m
[32m+[m	[32m.type lj_fff_res, @function[m
[32m+[m	[32m.size lj_fff_res, 4[m
[32m+[m[32mlj_fff_res:[m
[32m+[m	[32m.byte 137,68,36,4[m
[32m+[m
[32m+[m	[32m.globl lj_fff_res_[m
[32m+[m	[32m.hidden lj_fff_res_[m
[32m+[m	[32m.type lj_fff_res_, @function[m
[32m+[m	[32m.size lj_fff_res_, 66[m
[32m+[m[32mlj_fff_res_:[m
[32m+[m	[32m.byte 247,195,3,0,0,0,117,46,56,67,255,119,28,15,182,75[m
[32m+[m	[32m.byte 253,72,247,209,141,20,202,139,3,15,182,204,15,182,232,131[m
[32m+[m	[32m.byte 195,4,193,232,16,65,255,36,238,199,68,194,244,255,255,255[m
[32m+[m	[32m.byte 255,131,192,1,235,210,72,199,193,248,255,255,255,233,166,242[m
[32m+[m	[32m.byte 255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_floor[m
[32m+[m	[32m.hidden lj_ff_math_floor[m
[32m+[m	[32m.type lj_ff_math_floor, @function[m
[32m+[m	[32m.size lj_ff_math_floor, 24[m
[32m+[m[32mlj_ff_math_floor:[m
[32m+[m	[32m.byte 129,122,4,255,255,254,255,15,131,44,10,0,0,242,15,16[m
[32m+[m	[32m.byte 2,232,15,14,0,0,235,149[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_ceil[m
[32m+[m	[32m.hidden lj_ff_math_ceil[m
[32m+[m	[32m.type lj_ff_math_ceil, @function[m
[32m+[m	[32m.size lj_ff_math_ceil, 27[m
[32m+[m[32mlj_ff_math_ceil:[m
[32m+[m	[32m.byte 129,122,4,255,255,254,255,15,131,20,10,0,0,242,15,16[m
[32m+[m	[32m.byte 2,232,82,14,0,0,233,122,255,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_sqrt[m
[32m+[m	[32m.hidden lj_ff_math_sqrt[m
[32m+[m	[32m.type lj_ff_math_sqrt, @function[m
[32m+[m	[32m.size lj_ff_math_sqrt, 31[m
[32m+[m[32mlj_ff_math_sqrt:[m
[32m+[m	[32m.byte 131,248,2,15,130,253,9,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,240,9,0,0,242,15,81,2,233,91,255,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_log[m
[32m+[m	[32m.hidden lj_ff_math_log[m
[32m+[m	[32m.type lj_ff_math_log, @function[m
[32m+[m	[32m.size lj_ff_math_log, 40[m
[32m+[m[32mlj_ff_math_log:[m
[32m+[m	[32m.byte 131,248,2,15,133,222,9,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,209,9,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall log@PLT[m
[32m+[m	[32m.byte 137,234,233,51,255,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_log10[m
[32m+[m	[32m.hidden lj_ff_math_log10[m
[32m+[m	[32m.type lj_ff_math_log10, @function[m
[32m+[m	[32m.size lj_ff_math_log10, 40[m
[32m+[m[32mlj_ff_math_log10:[m
[32m+[m	[32m.byte 131,248,2,15,130,182,9,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,169,9,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall log10@PLT[m
[32m+[m	[32m.byte 137,234,233,11,255,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_exp[m
[32m+[m	[32m.hidden lj_ff_math_exp[m
[32m+[m	[32m.type lj_ff_math_exp, @function[m
[32m+[m	[32m.size lj_ff_math_exp, 40[m
[32m+[m[32mlj_ff_math_exp:[m
[32m+[m	[32m.byte 131,248,2,15,130,142,9,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,129,9,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall exp@PLT[m
[32m+[m	[32m.byte 137,234,233,227,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_sin[m
[32m+[m	[32m.hidden lj_ff_math_sin[m
[32m+[m	[32m.type lj_ff_math_sin, @function[m
[32m+[m	[32m.size lj_ff_math_sin, 40[m
[32m+[m[32mlj_ff_math_sin:[m
[32m+[m	[32m.byte 131,248,2,15,130,102,9,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,89,9,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall sin@PLT[m
[32m+[m	[32m.byte 137,234,233,187,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_cos[m
[32m+[m	[32m.hidden lj_ff_math_cos[m
[32m+[m	[32m.type lj_ff_math_cos, @function[m
[32m+[m	[32m.size lj_ff_math_cos, 40[m
[32m+[m[32mlj_ff_math_cos:[m
[32m+[m	[32m.byte 131,248,2,15,130,62,9,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,49,9,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall cos@PLT[m
[32m+[m	[32m.byte 137,234,233,147,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_tan[m
[32m+[m	[32m.hidden lj_ff_math_tan[m
[32m+[m	[32m.type lj_ff_math_tan, @function[m
[32m+[m	[32m.size lj_ff_math_tan, 40[m
[32m+[m[32mlj_ff_math_tan:[m
[32m+[m	[32m.byte 131,248,2,15,130,22,9,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,9,9,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall tan@PLT[m
[32m+[m	[32m.byte 137,234,233,107,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_asin[m
[32m+[m	[32m.hidden lj_ff_math_asin[m
[32m+[m	[32m.type lj_ff_math_asin, @function[m
[32m+[m	[32m.size lj_ff_math_asin, 40[m
[32m+[m[32mlj_ff_math_asin:[m
[32m+[m	[32m.byte 131,248,2,15,130,238,8,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,225,8,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall asin@PLT[m
[32m+[m	[32m.byte 137,234,233,67,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_acos[m
[32m+[m	[32m.hidden lj_ff_math_acos[m
[32m+[m	[32m.type lj_ff_math_acos, @function[m
[32m+[m	[32m.size lj_ff_math_acos, 40[m
[32m+[m[32mlj_ff_math_acos:[m
[32m+[m	[32m.byte 131,248,2,15,130,198,8,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,185,8,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall acos@PLT[m
[32m+[m	[32m.byte 137,234,233,27,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_atan[m
[32m+[m	[32m.hidden lj_ff_math_atan[m
[32m+[m	[32m.type lj_ff_math_atan, @function[m
[32m+[m	[32m.size lj_ff_math_atan, 40[m
[32m+[m[32mlj_ff_math_atan:[m
[32m+[m	[32m.byte 131,248,2,15,130,158,8,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,145,8,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall atan@PLT[m
[32m+[m	[32m.byte 137,234,233,243,253,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_sinh[m
[32m+[m	[32m.hidden lj_ff_math_sinh[m
[32m+[m	[32m.type lj_ff_math_sinh, @function[m
[32m+[m	[32m.size lj_ff_math_sinh, 40[m
[32m+[m[32mlj_ff_math_sinh:[m
[32m+[m	[32m.byte 131,248,2,15,130,118,8,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,105,8,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall sinh@PLT[m
[32m+[m	[32m.byte 137,234,233,203,253,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_cosh[m
[32m+[m	[32m.hidden lj_ff_math_cosh[m
[32m+[m	[32m.type lj_ff_math_cosh, @function[m
[32m+[m	[32m.size lj_ff_math_cosh, 40[m
[32m+[m[32mlj_ff_math_cosh:[m
[32m+[m	[32m.byte 131,248,2,15,130,78,8,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,65,8,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall cosh@PLT[m
[32m+[m	[32m.byte 137,234,233,163,253,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_tanh[m
[32m+[m	[32m.hidden lj_ff_math_tanh[m
[32m+[m	[32m.type lj_ff_math_tanh, @function[m
[32m+[m	[32m.size lj_ff_math_tanh, 40[m
[32m+[m[32mlj_ff_math_tanh:[m
[32m+[m	[32m.byte 131,248,2,15,130,38,8,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,25,8,0,0,242,15,16,2,137,213[m
[32m+[m	[32mcall tanh@PLT[m
[32m+[m	[32m.byte 137,234,233,123,253,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_pow[m
[32m+[m	[32m.hidden lj_ff_math_pow[m
[32m+[m	[32m.type lj_ff_math_pow, @function[m
[32m+[m	[32m.size lj_ff_math_pow, 58[m
[32m+[m[32mlj_ff_math_pow:[m
[32m+[m	[32m.byte 131,248,3,15,130,254,7,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,241,7,0,0,129,122,12,255,255,254,255,15,131,228[m
[32m+[m	[32m.byte 7,0,0,242,15,16,2,242,15,16,74,8,137,213[m
[32m+[m	[32mcall pow@PLT[m
[32m+[m	[32m.byte 137,234,233,65,253,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_atan2[m
[32m+[m	[32m.hidden lj_ff_math_atan2[m
[32m+[m	[32m.type lj_ff_math_atan2, @function[m
[32m+[m	[32m.size lj_ff_math_atan2, 58[m
[32m+[m[32mlj_ff_math_atan2:[m
[32m+[m	[32m.byte 131,248,3,15,130,196,7,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,183,7,0,0,129,122,12,255,255,254,255,15,131,170[m
[32m+[m	[32m.byte 7,0,0,242,15,16,2,242,15,16,74,8,137,213[m
[32m+[m	[32mcall atan2@PLT[m
[32m+[m	[32m.byte 137,234,233,7,253,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_fmod[m
[32m+[m	[32m.hidden lj_ff_math_fmod[m
[32m+[m	[32m.type lj_ff_math_fmod, @function[m
[32m+[m	[32m.size lj_ff_math_fmod, 58[m
[32m+[m[32mlj_ff_math_fmod:[m
[32m+[m	[32m.byte 131,248,3,15,130,138,7,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,125,7,0,0,129,122,12,255,255,254,255,15,131,112[m
[32m+[m	[32m.byte 7,0,0,242,15,16,2,242,15,16,74,8,137,213[m
[32m+[m	[32mcall fmod@PLT[m
[32m+[m	[32m.byte 137,234,233,205,252,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_ldexp[m
[32m+[m	[32m.hidden lj_ff_math_ldexp[m
[32m+[m	[32m.type lj_ff_math_ldexp, @function[m
[32m+[m	[32m.size lj_ff_math_ldexp, 49[m
[32m+[m[32mlj_ff_math_ldexp:[m
[32m+[m	[32m.byte 131,248,3,15,130,80,7,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,67,7,0,0,129,122,12,255,255,254,255,15,131,54[m
[32m+[m	[32m.byte 7,0,0,221,66,8,221,2,217,253,221,217,233,104,252,255[m
[32m+[m	[32m.byte 255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_frexp[m
[32m+[m	[32m.hidden lj_ff_math_frexp[m
[32m+[m	[32m.type lj_ff_math_frexp, @function[m
[32m+[m	[32m.size lj_ff_math_frexp, 148[m
[32m+[m[32mlj_ff_math_frexp:[m
[32m+[m	[32m.byte 131,248,2,15,130,31,7,0,0,139,106,4,129,253,255,255[m
[32m+[m	[32m.byte 254,255,15,131,16,7,0,0,139,90,252,139,2,137,106,252[m
[32m+[m	[32m.byte 137,66,248,209,229,129,253,0,0,224,255,115,58,9,232,116[m
[32m+[m	[32m.byte 54,184,254,3,0,0,129,253,0,0,32,0,114,46,193,237[m
[32m+[m	[32m.byte 21,41,197,242,15,42,197,139,106,252,129,229,255,255,15,128[m
[32m+[m	[32m.byte 129,205,0,0,224,63,137,106,252,242,15,17,2,184,3,0[m
[32m+[m	[32m.byte 0,0,233,66,252,255,255,15,87,192,235,237,242,15,16,2[m
[32m+[m	[32m.byte 72,189,0,0,0,0,0,0,80,67,102,72,15,110,205,242[m
[32m+[m	[32m.byte 15,89,193,242,15,17,66,248,139,106,252,184,52,4,0,0[m
[32m+[m	[32m.byte 209,229,235,170[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_modf[m
[32m+[m	[32m.hidden lj_ff_math_modf[m
[32m+[m	[32m.type lj_ff_math_modf, @function[m
[32m+[m	[32m.size lj_ff_math_modf, 99[m
[32m+[m[32mlj_ff_math_modf:[m
[32m+[m	[32m.byte 131,248,2,15,130,139,6,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,126,6,0,0,242,15,16,2,139,106,4,139,90,252[m
[32m+[m	[32m.byte 209,229,129,253,0,0,224,255,116,52,15,40,224,232,4,11[m
[32m+[m	[32m.byte 0,0,242,15,92,224,242,15,17,66,248,242,15,17,34,139[m
[32m+[m	[32m.byte 66,252,139,106,4,49,232,120,10,184,3,0,0,0,233,194[m
[32m+[m	[32m.byte 251,255,255,129,245,0,0,0,128,137,106,4,235,235,15,87[m
[32m+[m	[32m.byte 228,235,211[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_min[m
[32m+[m	[32m.hidden lj_ff_math_min[m
[32m+[m	[32m.type lj_ff_math_min, @function[m
[32m+[m	[32m.size lj_ff_math_min, 59[m
[32m+[m[32mlj_ff_math_min:[m
[32m+[m	[32m.byte 185,2,0,0,0,129,122,4,255,255,254,255,15,131,31,6[m
[32m+[m	[32m.byte 0,0,242,15,16,2,57,193,15,131,135,251,255,255,129,124[m
[32m+[m	[32m.byte 202,252,255,255,254,255,15,131,5,6,0,0,242,15,16,76[m
[32m+[m	[32m.byte 202,248,242,15,93,193,131,193,1,235,219[m
[32m+[m
[32m+[m	[32m.globl lj_ff_math_max[m
[32m+[m	[32m.hidden lj_ff_math_max[m
[32m+[m	[32m.type lj_ff_math_max, @function[m
[32m+[m	[32m.size lj_ff_math_max, 59[m
[32m+[m[32mlj_ff_math_max:[m
[32m+[m	[32m.byte 185,2,0,0,0,129,122,4,255,255,254,255,15,131,228,5[m
[32m+[m	[32m.byte 0,0,242,15,16,2,57,193,15,131,76,251,255,255,129,124[m
[32m+[m	[32m.byte 202,252,255,255,254,255,15,131,202,5,0,0,242,15,16,76[m
[32m+[m	[32m.byte 202,248,242,15,95,193,131,193,1,235,219[m
[32m+[m
[32m+[m	[32m.globl lj_ff_string_byte[m
[32m+[m	[32m.hidden lj_ff_string_byte[m
[32m+[m	[32m.type lj_ff_string_byte, @function[m
[32m+[m	[32m.size lj_ff_string_byte, 47[m
[32m+[m[32mlj_ff_string_byte:[m
[32m+[m	[32m.byte 131,248,2,15,133,178,5,0,0,131,122,4,251,15,133,168[m
[32m+[m	[32m.byte 5,0,0,139,42,139,90,252,131,125,12,1,15,130,210,247[m
[32m+[m	[32m.byte 255,255,15,182,109,16,242,15,42,197,233,0,251,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_string_char[m
[32m+[m	[32m.hidden lj_ff_string_char[m
[32m+[m	[32m.type lj_ff_string_char, @function[m
[32m+[m	[32m.size lj_ff_string_char, 76[m
[32m+[m[32mlj_ff_string_char:[m
[32m+[m	[32m.byte 65,139,174,48,244,255,255,65,59,174,52,244,255,255,114,5[m
[32m+[m	[32m.byte 232,6,6,0,0,131,248,2,15,133,110,5,0,0,129,122[m
[32m+[m	[32m.byte 4,255,255,254,255,15,131,97,5,0,0,242,15,44,42,129[m
[32m+[m	[32m.byte 253,255,0,0,0,15,135,81,5,0,0,137,108,36,4,199[m
[32m+[m	[32m.byte 68,36,8,1,0,0,0,72,141,68,36,4[m
[32m+[m
[32m+[m	[32m.globl lj_fff_newstr[m
[32m+[m	[32m.hidden lj_fff_newstr[m
[32m+[m	[32m.type lj_fff_newstr, @function[m
[32m+[m	[32m.size lj_fff_newstr, 25[m
[32m+[m[32mlj_fff_newstr:[m
[32m+[m	[32m.byte 139,108,36,24,137,85,16,139,84,36,8,72,137,198,137,239[m
[32m+[m	[32m.byte 137,92,36,28[m
[32m+[m	[32mcall lj_str_new[m
[32m+[m
[32m+[m	[32m.globl lj_fff_resstr[m
[32m+[m	[32m.hidden lj_fff_resstr[m
[32m+[m	[32m.type lj_fff_resstr, @function[m
[32m+[m	[32m.size lj_fff_resstr, 21[m
[32m+[m[32mlj_fff_resstr:[m
[32m+[m	[32m.byte 139,85,16,139,90,252,199,66,252,251,255,255,255,137,66,248[m
[32m+[m	[32m.byte 233,142,250,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_string_sub[m
[32m+[m	[32m.hidden lj_ff_string_sub[m
[32m+[m	[32m.type lj_ff_string_sub, @function[m
[32m+[m	[32m.size lj_ff_string_sub, 165[m
[32m+[m[32mlj_ff_string_sub:[m
[32m+[m	[32m.byte 65,139,174,48,244,255,255,65,59,174,52,244,255,255,114,5[m
[32m+[m	[32m.byte 232,140,5,0,0,199,68,36,4,255,255,255,255,131,248,3[m
[32m+[m	[32m.byte 15,130,236,4,0,0,118,22,129,122,20,255,255,254,255,15[m
[32m+[m	[32m.byte 131,221,4,0,0,242,15,44,106,16,137,108,36,4,131,122[m
[32m+[m	[32m.byte 4,251,15,133,202,4,0,0,129,122,12,255,255,254,255,15[m
[32m+[m	[32m.byte 131,189,4,0,0,139,42,137,108,36,8,139,109,12,242,15[m
[32m+[m	[32m.byte 44,74,8,139,68,36,4,57,197,114,30,133,201,126,38,139[m
[32m+[m	[32m.byte 108,36,8,41,200,124,46,141,108,13,15,131,192,1,137,68[m
[32m+[m	[32m.byte 36,8,137,232,233,73,255,255,255,124,6,141,68,40,1,235[m
[32m+[m	[32m.byte 218,137,232,235,214,116,7,1,233,131,193,1,127,209,185,1[m
[32m+[m	[32m.byte 0,0,0,235,202[m
[32m+[m
[32m+[m	[32m.globl lj_fff_emptystr[m
[32m+[m	[32m.hidden lj_fff_emptystr[m
[32m+[m	[32m.type lj_fff_emptystr, @function[m
[32m+[m	[32m.size lj_fff_emptystr, 4[m
[32m+[m[32mlj_fff_emptystr:[m
[32m+[m	[32m.byte 49,192,235,213[m
[32m+[m
[32m+[m	[32m.globl lj_ff_string_reverse[m
[32m+[m	[32m.hidden lj_ff_string_reverse[m
[32m+[m	[32m.type lj_ff_string_reverse, @function[m
[32m+[m	[32m.size lj_ff_string_reverse, 85[m
[32m+[m[32mlj_ff_string_reverse:[m
[32m+[m	[32m.byte 131,248,2,15,130,96,4,0,0,65,139,174,48,244,255,255[m
[32m+[m	[32m.byte 65,59,174,52,244,255,255,114,5,232,218,4,0,0,131,122[m
[32m+[m	[32m.byte 4,251,15,133,65,4,0,0,139,108,36,24,65,141,190,108[m
[32m+[m	[32m.byte 244,255,255,137,85,16,139,50,139,71,8,137,111,12,137,7[m
[32m+[m	[32m.byte 137,92,36,28[m
[32m+[m	[32mcall lj_buf_putstr_reverse[m
[32m+[m	[32m.byte 137,199[m
[32m+[m	[32mcall lj_buf_tostr[m
[32m+[m	[32m.byte 233,237,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_string_lower[m
[32m+[m	[32m.hidden lj_ff_string_lower[m
[32m+[m	[32m.type lj_ff_string_lower, @function[m
[32m+[m	[32m.size lj_ff_string_lower, 85[m
[32m+[m[32mlj_ff_string_lower:[m
[32m+[m	[32m.byte 131,248,2,15,130,11,4,0,0,65,139,174,48,244,255,255[m
[32m+[m	[32m.byte 65,59,174,52,244,255,255,114,5,232,133,4,0,0,131,122[m
[32m+[m	[32m.byte 4,251,15,133,236,3,0,0,139,108,36,24,65,141,190,108[m
[32m+[m	[32m.byte 244,255,255,137,85,16,139,50,139,71,8,137,111,12,137,7[m
[32m+[m	[32m.byte 137,92,36,28[m
[32m+[m	[32mcall lj_buf_putstr_lower[m
[32m+[m	[32m.byte 137,199[m
[32m+[m	[32mcall lj_buf_tostr[m
[32m+[m	[32m.byte 233,152,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_string_upper[m
[32m+[m	[32m.hidden lj_ff_string_upper[m
[32m+[m	[32m.type lj_ff_string_upper, @function[m
[32m+[m	[32m.size lj_ff_string_upper, 85[m
[32m+[m[32mlj_ff_string_upper:[m
[32m+[m	[32m.byte 131,248,2,15,130,182,3,0,0,65,139,174,48,244,255,255[m
[32m+[m	[32m.byte 65,59,174,52,244,255,255,114,5,232,48,4,0,0,131,122[m
[32m+[m	[32m.byte 4,251,15,133,151,3,0,0,139,108,36,24,65,141,190,108[m
[32m+[m	[32m.byte 244,255,255,137,85,16,139,50,139,71,8,137,111,12,137,7[m
[32m+[m	[32m.byte 137,92,36,28[m
[32m+[m	[32mcall lj_buf_putstr_upper[m
[32m+[m	[32m.byte 137,199[m
[32m+[m	[32mcall lj_buf_tostr[m
[32m+[m	[32m.byte 233,67,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_tobit[m
[32m+[m	[32m.hidden lj_ff_bit_tobit[m
[32m+[m	[32m.type lj_ff_bit_tobit, @function[m
[32m+[m	[32m.size lj_ff_bit_tobit, 54[m
[32m+[m[32mlj_ff_bit_tobit:[m
[32m+[m	[32m.byte 131,248,2,15,130,97,3,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,84,3,0,0,242,15,16,2,72,189,0,0,0,0[m
[32m+[m	[32m.byte 0,0,56,67,102,72,15,110,205,242,15,88,193,102,15,126[m
[32m+[m	[32m.byte 197,233,139,1,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_band[m
[32m+[m	[32m.hidden lj_ff_bit_band[m
[32m+[m	[32m.type lj_ff_bit_band, @function[m
[32m+[m	[32m.size lj_ff_bit_band, 97[m
[32m+[m[32mlj_ff_bit_band:[m
[32m+[m	[32m.byte 131,248,2,15,130,43,3,0,0,72,189,0,0,0,0,0[m
[32m+[m	[32m.byte 0,56,67,102,72,15,110,205,129,122,4,255,255,254,255,15[m
[32m+[m	[32m.byte 131,15,3,0,0,242,15,16,2,242,15,88,193,102,15,126[m
[32m+[m	[32m.byte 197,137,68,36,4,141,68,194,240,57,208,15,134,74,1,0[m
[32m+[m	[32m.byte 0,129,120,4,255,255,254,255,15,131,70,1,0,0,242,15[m
[32m+[m	[32m.byte 16,0,242,15,88,193,102,15,126,193,33,205,131,232,8,235[m
[32m+[m	[32m.byte 216[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_bor[m
[32m+[m	[32m.hidden lj_ff_bit_bor[m
[32m+[m	[32m.type lj_ff_bit_bor, @function[m
[32m+[m	[32m.size lj_ff_bit_bor, 97[m
[32m+[m[32mlj_ff_bit_bor:[m
[32m+[m	[32m.byte 131,248,2,15,130,202,2,0,0,72,189,0,0,0,0,0[m
[32m+[m	[32m.byte 0,56,67,102,72,15,110,205,129,122,4,255,255,254,255,15[m
[32m+[m	[32m.byte 131,174,2,0,0,242,15,16,2,242,15,88,193,102,15,126[m
[32m+[m	[32m.byte 197,137,68,36,4,141,68,194,240,57,208,15,134,233,0,0[m
[32m+[m	[32m.byte 0,129,120,4,255,255,254,255,15,131,229,0,0,0,242,15[m
[32m+[m	[32m.byte 16,0,242,15,88,193,102,15,126,193,9,205,131,232,8,235[m
[32m+[m	[32m.byte 216[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_bxor[m
[32m+[m	[32m.hidden lj_ff_bit_bxor[m
[32m+[m	[32m.type lj_ff_bit_bxor, @function[m
[32m+[m	[32m.size lj_ff_bit_bxor, 97[m
[32m+[m[32mlj_ff_bit_bxor:[m
[32m+[m	[32m.byte 131,248,2,15,130,105,2,0,0,72,189,0,0,0,0,0[m
[32m+[m	[32m.byte 0,56,67,102,72,15,110,205,129,122,4,255,255,254,255,15[m
[32m+[m	[32m.byte 131,77,2,0,0,242,15,16,2,242,15,88,193,102,15,126[m
[32m+[m	[32m.byte 197,137,68,36,4,141,68,194,240,57,208,15,134,136,0,0[m
[32m+[m	[32m.byte 0,129,120,4,255,255,254,255,15,131,132,0,0,0,242,15[m
[32m+[m	[32m.byte 16,0,242,15,88,193,102,15,126,193,49,205,131,232,8,235[m
[32m+[m	[32m.byte 216[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_bswap[m
[32m+[m	[32m.hidden lj_ff_bit_bswap[m
[32m+[m	[32m.type lj_ff_bit_bswap, @function[m
[32m+[m	[32m.size lj_ff_bit_bswap, 53[m
[32m+[m[32mlj_ff_bit_bswap:[m
[32m+[m	[32m.byte 131,248,2,15,130,8,2,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,251,1,0,0,242,15,16,2,72,189,0,0,0,0[m
[32m+[m	[32m.byte 0,0,56,67,102,72,15,110,205,242,15,88,193,102,15,126[m
[32m+[m	[32m.byte 197,15,205,235,51[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_bnot[m
[32m+[m	[32m.hidden lj_ff_bit_bnot[m
[32m+[m	[32m.type lj_ff_bit_bnot, @function[m
[32m+[m	[32m.size lj_ff_bit_bnot, 51[m
[32m+[m[32mlj_ff_bit_bnot:[m
[32m+[m	[32m.byte 131,248,2,15,130,211,1,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,198,1,0,0,242,15,16,2,72,189,0,0,0,0[m
[32m+[m	[32m.byte 0,0,56,67,102,72,15,110,205,242,15,88,193,102,15,126[m
[32m+[m	[32m.byte 197,247,213[m
[32m+[m
[32m+[m	[32m.globl lj_fff_resbit[m
[32m+[m	[32m.hidden lj_fff_resbit[m
[32m+[m	[32m.type lj_fff_resbit, @function[m
[32m+[m	[32m.size lj_fff_resbit, 9[m
[32m+[m[32mlj_fff_resbit:[m
[32m+[m	[32m.byte 242,15,42,197,233,20,247,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_fff_fallback_bit_op[m
[32m+[m	[32m.hidden lj_fff_fallback_bit_op[m
[32m+[m	[32m.type lj_fff_fallback_bit_op, @function[m
[32m+[m	[32m.size lj_fff_fallback_bit_op, 9[m
[32m+[m[32mlj_fff_fallback_bit_op:[m
[32m+[m	[32m.byte 139,68,36,4,233,151,1,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_lshift[m
[32m+[m	[32m.hidden lj_ff_bit_lshift[m
[32m+[m	[32m.type lj_ff_bit_lshift, @function[m
[32m+[m	[32m.size lj_ff_bit_lshift, 79[m
[32m+[m[32mlj_ff_bit_lshift:[m
[32m+[m	[32m.byte 131,248,3,15,130,142,1,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,129,1,0,0,129,122,12,255,255,254,255,15,131,116[m
[32m+[m	[32m.byte 1,0,0,242,15,16,2,242,15,16,74,8,72,189,0,0[m
[32m+[m	[32m.byte 0,0,0,0,56,67,102,72,15,110,213,242,15,88,194,242[m
[32m+[m	[32m.byte 15,88,202,102,15,126,197,102,15,126,201,211,229,235,159[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_rshift[m
[32m+[m	[32m.hidden lj_ff_bit_rshift[m
[32m+[m	[32m.type lj_ff_bit_rshift, @function[m
[32m+[m	[32m.size lj_ff_bit_rshift, 82[m
[32m+[m[32mlj_ff_bit_rshift:[m
[32m+[m	[32m.byte 131,248,3,15,130,63,1,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,50,1,0,0,129,122,12,255,255,254,255,15,131,37[m
[32m+[m	[32m.byte 1,0,0,242,15,16,2,242,15,16,74,8,72,189,0,0[m
[32m+[m	[32m.byte 0,0,0,0,56,67,102,72,15,110,213,242,15,88,194,242[m
[32m+[m	[32m.byte 15,88,202,102,15,126,197,102,15,126,201,211,237,233,77,255[m
[32m+[m	[32m.byte 255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_arshift[m
[32m+[m	[32m.hidden lj_ff_bit_arshift[m
[32m+[m	[32m.type lj_ff_bit_arshift, @function[m
[32m+[m	[32m.size lj_ff_bit_arshift, 82[m
[32m+[m[32mlj_ff_bit_arshift:[m
[32m+[m	[32m.byte 131,248,3,15,130,237,0,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,224,0,0,0,129,122,12,255,255,254,255,15,131,211[m
[32m+[m	[32m.byte 0,0,0,242,15,16,2,242,15,16,74,8,72,189,0,0[m
[32m+[m	[32m.byte 0,0,0,0,56,67,102,72,15,110,213,242,15,88,194,242[m
[32m+[m	[32m.byte 15,88,202,102,15,126,197,102,15,126,201,211,253,233,251,254[m
[32m+[m	[32m.byte 255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_rol[m
[32m+[m	[32m.hidden lj_ff_bit_rol[m
[32m+[m	[32m.type lj_ff_bit_rol, @function[m
[32m+[m	[32m.size lj_ff_bit_rol, 82[m
[32m+[m[32mlj_ff_bit_rol:[m
[32m+[m	[32m.byte 131,248,3,15,130,155,0,0,0,129,122,4,255,255,254,255[m
[32m+[m	[32m.byte 15,131,142,0,0,0,129,122,12,255,255,254,255,15,131,129[m
[32m+[m	[32m.byte 0,0,0,242,15,16,2,242,15,16,74,8,72,189,0,0[m
[32m+[m	[32m.byte 0,0,0,0,56,67,102,72,15,110,213,242,15,88,194,242[m
[32m+[m	[32m.byte 15,88,202,102,15,126,197,102,15,126,201,211,197,233,169,254[m
[32m+[m	[32m.byte 255,255[m
[32m+[m
[32m+[m	[32m.globl lj_ff_bit_ror[m
[32m+[m	[32m.hidden lj_ff_bit_ror[m
[32m+[m	[32m.type lj_ff_bit_ror, @function[m
[32m+[m	[32m.size lj_ff_bit_ror, 70[m
[32m+[m[32mlj_ff_bit_ror:[m
[32m+[m	[32m.byte 131,248,3,114,77,129,122,4,255,255,254,255,115,68,129,122[m
[32m+[m	[32m.byte 12,255,255,254,255,115,59,242,15,16,2,242,15,16,74,8[m
[32m+[m	[32m.byte 72,189,0,0,0,0,0,0,56,67,102,72,15,110,213,242[m
[32m+[m	[32m.byte 15,88,194,242,15,88,202,102,15,126,197,102,15,126,201,211[m
[32m+[m	[32m.byte 205,233,99,254,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_fff_fallback_2[m
[32m+[m	[32m.hidden lj_fff_fallback_2[m
[32m+[m	[32m.type lj_fff_fallback_2, @function[m
[32m+[m	[32m.size lj_fff_fallback_2, 7[m
[32m+[m[32mlj_fff_fallback_2:[m
[32m+[m	[32m.byte 184,3,0,0,0,235,5[m
[32m+[m
[32m+[m	[32m.globl lj_fff_fallback_1[m
[32m+[m	[32m.hidden lj_fff_fallback_1[m
[32m+[m	[32m.type lj_fff_fallback_1, @function[m
[32m+[m	[32m.size lj_fff_fallback_1, 5[m
[32m+[m[32mlj_fff_fallback_1:[m
[32m+[m	[32m.byte 184,2,0,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_fff_fallback[m
[32m+[m	[32m.hidden lj_fff_fallback[m
[32m+[m	[32m.type lj_fff_fallback, @function[m
[32m+[m	[32m.size lj_fff_fallback, 87[m
[32m+[m[32mlj_fff_fallback:[m
[32m+[m	[32m.byte 139,108,36,24,139,90,252,137,92,36,28,137,85,16,141,68[m
[32m+[m	[32m.byte 194,248,141,136,160,0,0,0,137,69,24,139,66,248,59,77[m
[32m+[m	[32m.byte 32,119,89,137,239,255,80,24,139,85,16,133,192,15,143,78[m
[32m+[m	[32m.byte 245,255,255,139,77,24,41,209,193,233,3,133,192,141,65,1[m
[32m+[m	[32m.byte 139,106,248,117,18,139,93,16,139,11,15,182,233,15,182,205[m
[32m+[m	[32m.byte 131,195,4,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_vm_call_tail[m
[32m+[m	[32m.hidden lj_vm_call_tail[m
[32m+[m	[32m.type lj_vm_call_tail, @function[m
[32m+[m	[32m.size lj_vm_call_tail, 56[m
[32m+[m[32mlj_vm_call_tail:[m
[32m+[m	[32m.byte 137,209,247,195,3,0,0,0,117,15,15,182,107,253,72,247[m
[32m+[m	[32m.byte 213,141,20,234,233,66,234,255,255,137,221,131,229,248,41,234[m
[32m+[m	[32m.byte 233,54,234,255,255,190,20,0,0,0,137,239[m
[32m+[m	[32mcall lj_state_growstack[m
[32m+[m	[32m.byte 139,85,16,49,192,235,164[m
[32m+[m
[32m+[m	[32m.globl lj_fff_gcstep[m
[32m+[m	[32m.hidden lj_fff_gcstep[m
[32m+[m	[32m.type lj_fff_gcstep, @function[m
[32m+[m	[32m.size lj_fff_gcstep, 52[m
[32m+[m[32mlj_fff_gcstep:[m
[32m+[m	[32m.byte 93,72,137,108,36,8,139,108,36,24,137,92,36,28,137,85[m
[32m+[m	[32m.byte 16,141,68,194,248,137,239,137,69,24[m
[32m+[m	[32mcall lj_gc_step[m
[32m+[m	[32m.byte 139,85,16,139,69,24,41,208,193,232,3,131,192,1,72,139[m
[32m+[m	[32m.byte 108,36,8,85,195[m
[32m+[m
[32m+[m	[32m.globl lj_vm_record[m
[32m+[m	[32m.hidden lj_vm_record[m
[32m+[m	[32m.type lj_vm_record, @function[m
[32m+[m	[32m.size lj_vm_record, 29[m
[32m+[m[32mlj_vm_record:[m
[32m+[m	[32m.byte 65,15,182,134,141,244,255,255,168,32,117,83,168,16,117,56[m
[32m+[m	[32m.byte 168,12,116,52,65,255,142,224,244,255,255,235,43[m
[32m+[m
[32m+[m	[32m.globl lj_vm_rethook[m
[32m+[m	[32m.hidden lj_vm_rethook[m
[32m+[m	[32m.type lj_vm_rethook, @function[m
[32m+[m	[32m.size lj_vm_rethook, 14[m
[32m+[m[32mlj_vm_rethook:[m
[32m+[m	[32m.byte 65,15,182,134,141,244,255,255,168,16,117,54,235,29[m
[32m+[m
[32m+[m	[32m.globl lj_vm_inshook[m
[32m+[m	[32m.hidden lj_vm_inshook[m
[32m+[m	[32m.type lj_vm_inshook, @function[m
[32m+[m	[32m.size lj_vm_inshook, 68[m
[32m+[m[32mlj_vm_inshook:[m
[32m+[m	[32m.byte 65,15,182,134,141,244,255,255,168,16,117,40,168,12,116,36[m
[32m+[m	[32m.byte 65,255,142,224,244,255,255,116,4,168,4,116,23,139,108,36[m
[32m+[m	[32m.byte 24,137,85,16,137,222,137,239[m
[32m+[m	[32mcall lj_dispatch_ins[m
[32m+[m	[32m.byte 139,85,16,15,182,75,253,15,182,107,252,15,183,67,254,65[m
[32m+[m	[32m.byte 255,164,238,208,4,0,0[m
[32m+[m
[32m+[m	[32m.globl lj_cont_hook[m
[32m+[m	[32m.hidden lj_cont_hook[m
[32m+[m	[32m.type lj_cont_hook, @function[m
[32m+[m	[32m.size lj_cont_hook, 12[m
[32m+[m[32mlj_cont_hook:[m
[32m+[m	[32m.byte 131,195,4,139,77,232,137,76,36,4,235,224[m
[32m+[m
[32m+[m	[32m.globl lj_vm_hotloop[m
[32m+[m	[32m.hidden lj_vm_hotloop[m
[32m+[m	[32m.type lj_vm_hotloop, @function[m
[32m+[m	[32m.size lj_vm_hotloop, 50[m
[32m+[m[32mlj_vm_hotloop:[m
[32m+[m	[32m.byte 139,106,248,139,109,16,15,182,69,199,141,4,194,139,108,36[m
[32m+[m	[32m.byte 24,137,85,16,137,69,24,137,222,65,141,190,176,245,255,255[m
[32m+[m	[32m.byte 73,137,174,16,246,255,255,137,92,36,28[m
[32m+[m	[32mcall lj_trace_hot[m
[32m+[m	[32m.byte 235,171[m
[32m+[m
[32m+[m	[32m.globl lj_vm_callhook[m
[32m+[m	[32m.hidden lj_vm_callhook[m
[32m+[m	[32m.type lj_vm_callhook, @function[m
[32m+[m	[32m.size lj_vm_callhook, 6[m
[32m+[m[32mlj_vm_callhook:[m
[32m+[m	[32m.byte 137,92,36,28,235,7[m
[32m+[m
[32m+[m	[32m.globl lj_vm_hotcall[m
[32m+[m	[32m.hidden lj_vm_hotcall[m
[32m+[m	[32m.type lj_vm_hotcall, @function[m
[32m+[m	[32m.size lj_vm_hotcall, 67[m
[32m+[m[32mlj_vm_hotcall:[m
[32m+[m	[32m.byte 137,92,36,28,131,203,1,141,68,194,248,139,108,36,24,137[m
[32m+[m	[32m.byte 85,16,137,69,24,137,222,137,239[m
[32m+[m	[32mcall lj_dispatch_call[m
[32m+[m	[32m.byte 199,68,36,28,0,0,0,0,131,227,254,139,85,16,72,137[m
[32m+[m	[32m.byte 193,139,69,24,41,208,72,137,205,15,182,75,253,193,232,3[m
[32m+[m	[32m.byte 131,192,1,255,229[m
[32m+[m
[32m+[m	[32m.globl lj_cont_stitch[m
[32m+[m	[32m.hidden lj_cont_stitch[m
[32m+[m	[32m.type lj_cont_stitch, @function[m
[32m+[m	[32m.size lj_cont_stitch, 152[m
[32m+[m[32mlj_cont_stitch:[m
[32m+[m	[32m.byte 139,77,232,137,12,36,68,137,116,36,8,68,139,116,36,4[m
[32m+[m	[32m.byte 15,182,75,253,141,12,202,65,131,238,1,116,18,72,139,40[m
[32m+[m	[32m.byte 72,137,41,131,192,8,131,193,8,65,131,238,1,117,238,15[m
[32m+[m	[32m.byte 182,67,253,15,182,107,255,1,232,141,68,194,248,57,200,119[m
[32m+[m	[32m.byte 75,68,139,116,36,8,139,4,36,15,183,104,80,15,183,64[m
[32m+[m	[32m.byte 82,57,232,15,132,208,234,255,255,133,192,15,133,20,228,255[m
[32m+[m	[32m.byte 255,65,137,174,44,255,255,255,139,108,36,24,137,85,16,137[m
[32m+[m	[32m.byte 222,65,141,190,176,245,255,255,73,137,174,16,246,255,255[m
[32m+[m	[32mcall lj_dispatch_stitch[m
[32m+[m	[32m.byte 139,85,16,233,157,234,255,255,199,65,4,255,255,255,255,131[m
[32m+[m	[32m.byte 193,8,235,165[m
[32m+[m
[32m+[m	[32m.globl lj_vm_profhook[m
[32m+[m	[32m.hidden lj_vm_profhook[m
[32m+[m	[32m.type lj_vm_profhook, @function[m
[32m+[m	[32m.size lj_vm_profhook, 27[m
[32m+[m[32mlj_vm_profhook:[m
[32m+[m	[32m.byte 139,108,36,24,137,85,16,137,222,137,239[m
[32m+[m	[32mcall lj_dispatch_profile[m
[32m+[m	[32m.byte 139,85,16,131,235,4,233,118,234,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vm_exit_handler[m
[32m+[m	[32m.hidden lj_vm_exit_handler[m
[32m+[m	[32m.type lj_vm_exit_handler, @function[m
[32m+[m	[32m.size lj_vm_exit_handler, 247[m
[32m+[m[32mlj_vm_exit_handler:[m
[32m+[m	[32m.byte 65,85,65,84,65,83,65,82,65,81,65,80,87,86,85,72[m
[32m+[m	[32m.byte 141,108,36,88,85,83,82,81,80,15,182,69,248,138,101,240[m
[32m+[m	[32m.byte 76,137,125,248,76,137,117,240,68,139,117,0,65,139,142,104[m
[32m+[m	[32m.byte 244,255,255,65,199,134,104,244,255,255,252,255,255,255,65,137[m
[32m+[m	[32m.byte 134,44,255,255,255,65,137,142,40,255,255,255,72,129,236,128[m
[32m+[m	[32m.byte 0,0,0,72,131,197,128,242,68,15,17,125,248,242,68,15[m
[32m+[m	[32m.byte 17,117,240,242,68,15,17,109,232,242,68,15,17,101,224,242[m
[32m+[m	[32m.byte 68,15,17,93,216,242,68,15,17,85,208,242,68,15,17,77[m
[32m+[m	[32m.byte 200,242,68,15,17,69,192,242,15,17,125,184,242,15,17,117[m
[32m+[m	[32m.byte 176,242,15,17,109,168,242,15,17,101,160,242,15,17,93,152[m
[32m+[m	[32m.byte 242,15,17,85,144,242,15,17,77,136,242,15,17,69,128,65[m
[32m+[m	[32m.byte 139,174,8,245,255,255,65,139,150,12,245,255,255,73,137,174[m
[32m+[m	[32m.byte 16,246,255,255,137,85,16,72,137,230,65,141,190,176,245,255[m
[32m+[m	[32m.byte 255,65,199,134,12,245,255,255,0,0,0,0[m
[32m+[m	[32mcall lj_trace_exit[m
[32m+[m	[32m.byte 72,139,77,48,72,131,225,252,72,137,204,137,105,24,139,85[m
[32m+[m	[32m.byte 16,139,89,28,235,4[m
[32m+[m
[32m+[m	[32m.globl lj_vm_exit_interp[m
[32m+[m	[32m.hidden lj_vm_exit_interp[m
[32m+[m	[32m.type lj_vm_exit_interp, @function[m
[32m+[m	[32m.size lj_vm_exit_interp, 137[m
[32m+[m[32mlj_vm_exit_interp:[m
[32m+[m	[32m.byte 72,131,196,16,76,139,108,36,8,76,139,36,36,133,192,120[m
[32m+[m	[32m.byte 109,139,108,36,24,137,68,36,4,68,139,122,248,69,139,127[m
[32m+[m	[32m.byte 16,69,139,127,208,137,85,16,65,199,134,12,245,255,255,0[m
[32m+[m	[32m.byte 0,0,0,65,199,134,104,244,255,255,255,255,255,255,139,3[m
[32m+[m	[32m.byte 15,182,204,15,182,232,131,195,4,193,232,16,131,253,89,114[m
[32m+[m	[32m.byte 9,131,253,97,115,8,139,68,36,4,65,255,36,238,139,66[m
[32m+[m	[32m.byte 252,169,3,0,0,0,117,238,15,182,64,253,72,247,208,68[m
[32m+[m	[32m.byte 139,124,194,248,69,139,127,16,69,139,127,208,235,216,247,216[m
[32m+[m	[32m.byte 137,239,137,198[m
[32m+[m	[32mcall lj_err_throw[m
[32m+[m
[32m+[m	[32m.globl lj_vm_floor_sse[m
[32m+[m	[32m.hidden lj_vm_floor_sse[m
[32m+[m	[32m.type lj_vm_floor_sse, @function[m
[32m+[m	[32m.size lj_vm_floor_sse, 0[m
[32m+[m[32mlj_vm_floor_sse:[m
[32m+[m
[32m+[m	[32m.globl lj_vm_floor[m
[32m+[m	[32m.hidden lj_vm_floor[m
[32m+[m	[32m.type lj_vm_floor, @function[m
[32m+[m	[32m.size lj_vm_floor, 91[m
[32m+[m[32mlj_vm_floor:[m
[32m+[m	[32m.byte 72,184,255,255,255,255,255,255,255,127,102,72,15,110,208,72[m
[32m+[m	[32m.byte 184,0,0,0,0,0,0,48,67,102,72,15,110,216,15,40[m
[32m+[m	[32m.byte 200,102,15,84,202,102,15,46,217,118,47,102,15,85,208,242[m
[32m+[m	[32m.byte 15,88,203,242,15,92,203,102,15,86,202,72,184,0,0,0[m
[32m+[m	[32m.byte 0,0,0,240,63,102,72,15,110,208,242,15,194,193,1,102[m
[32m+[m	[32m.byte 15,84,194,242,15,92,200,15,40,193,195[m
[32m+[m
[32m+[m	[32m.globl lj_vm_ceil_sse[m
[32m+[m	[32m.hidden lj_vm_ceil_sse[m
[32m+[m	[32m.type lj_vm_ceil_sse, @function[m
[32m+[m	[32m.size lj_vm_ceil_sse, 0[m
[32m+[m[32mlj_vm_ceil_sse:[m
[32m+[m
[32m+[m	[32m.globl lj_vm_ceil[m
[32m+[m	[32m.hidden lj_vm_ceil[m
[32m+[m	[32m.type lj_vm_ceil, @function[m
[32m+[m	[32m.size lj_vm_ceil, 91[m
[32m+[m[32mlj_vm_ceil:[m
[32m+[m	[32m.byte 72,184,255,255,255,255,255,255,255,127,102,72,15,110,208,72[m
[32m+[m	[32m.byte 184,0,0,0,0,0,0,48,67,102,72,15,110,216,15,40[m
[32m+[m	[32m.byte 200,102,15,84,202,102,15,46,217,118,47,102,15,85,208,242[m
[32m+[m	[32m.byte 15,88,203,242,15,92,203,102,15,86,202,72,184,0,0,0[m
[32m+[m	[32m.byte 0,0,0,240,191,102,72,15,110,208,242,15,194,193,6,102[m
[32m+[m	[32m.byte 15,84,194,242,15,92,200,15,40,193,195[m
[32m+[m
[32m+[m	[32m.globl lj_vm_trunc_sse[m
[32m+[m	[32m.hidden lj_vm_trunc_sse[m
[32m+[m	[32m.type lj_vm_trunc_sse, @function[m
[32m+[m	[32m.size lj_vm_trunc_sse, 0[m
[32m+[m[32mlj_vm_trunc_sse:[m
[32m+[m
[32m+[m	[32m.globl lj_vm_trunc[m
[32m+[m	[32m.hidden lj_vm_trunc[m
[32m+[m	[32m.type lj_vm_trunc, @function[m
[32m+[m	[32m.size lj_vm_trunc, 94[m
[32m+[m[32mlj_vm_trunc:[m
[32m+[m	[32m.byte 72,184,255,255,255,255,255,255,255,127,102,72,15,110,208,72[m
[32m+[m	[32m.byte 184,0,0,0,0,0,0,48,67,102,72,15,110,216,15,40[m
[32m+[m	[32m.byte 200,102,15,84,202,102,15,46,217,118,50,102,15,85,208,15[m
[32m+[m	[32m.byte 40,193,242,15,88,203,242,15,92,203,72,184,0,0,0,0[m
[32m+[m	[32m.byte 0,0,240,63,102,72,15,110,216,242,15,194,193,1,102,15[m
[32m+[m	[32m.byte 84,195,242,15,92,200,102,15,86,202,15,40,193,195[m
[32m+[m
[32m+[m	[32m.globl lj_vm_mod[m
[32m+[m	[32m.hidden lj_vm_mod[m
[32m+[m	[32m.type lj_vm_mod, @function[m
[32m+[m	[32m.size lj_vm_mod, 118[m
[32m+[m[32mlj_vm_mod:[m
[32m+[m	[32m.byte 15,40,232,242,15,94,193,72,184,255,255,255,255,255,255,255[m
[32m+[m	[32m.byte 127,102,72,15,110,208,72,184,0,0,0,0,0,0,48,67[m
[32m+[m	[32m.byte 102,72,15,110,216,15,40,224,102,15,84,226,102,15,46,220[m
[32m+[m	[32m.byte 118,56,102,15,85,208,242,15,88,227,242,15,92,227,102,15[m
[32m+[m	[32m.byte 86,226,72,184,0,0,0,0,0,0,240,63,102,72,15,110[m
[32m+[m	[32m.byte 208,242,15,194,196,1,102,15,84,194,242,15,92,224,15,40[m
[32m+[m	[32m.byte 197,242,15,89,204,242,15,92,193,195,242,15,89,200,15,40[m
[32m+[m	[32m.byte 197,242,15,92,193,195[m
[32m+[m
[32m+[m	[32m.globl lj_vm_powi_sse[m
[32m+[m	[32m.hidden lj_vm_powi_sse[m
[32m+[m	[32m.type lj_vm_powi_sse, @function[m
[32m+[m	[32m.size lj_vm_powi_sse, 98[m
[32m+[m[32mlj_vm_powi_sse:[m
[32m+[m	[32m.byte 131,248,1,126,43,169,1,0,0,0,117,8,242,15,89,192[m
[32m+[m	[32m.byte 209,232,235,241,209,232,116,23,15,40,200,242,15,89,192,209[m
[32m+[m	[32m.byte 232,116,8,115,246,242,15,89,200,235,240,242,15,89,193,195[m
[32m+[m	[32m.byte 116,253,114,30,247,216,232,202,255,255,255,72,184,0,0,0[m
[32m+[m	[32m.byte 0,0,0,240,63,102,72,15,110,200,242,15,94,200,15,40[m
[32m+[m	[32m.byte 193,195,72,184,0,0,0,0,0,0,240,63,102,72,15,110[m
[32m+[m	[32m.byte 192,195[m
[32m+[m
[32m+[m	[32m.globl lj_vm_cpuid[m
[32m+[m	[32m.hidden lj_vm_cpuid[m
[32m+[m	[32m.type lj_vm_cpuid, @function[m
[32m+[m	[32m.size lj_vm_cpuid, 20[m
[32m+[m[32mlj_vm_cpuid:[m
[32m+[m	[32m.byte 137,248,83,49,201,15,162,137,6,137,94,4,137,78,8,137[m
[32m+[m	[32m.byte 86,12,91,195[m
[32m+[m
[32m+[m	[32m.globl lj_assert_bad_for_arg_type[m
[32m+[m	[32m.hidden lj_assert_bad_for_arg_type[m
[32m+[m	[32m.type lj_assert_bad_for_arg_type, @function[m
[32m+[m	[32m.size lj_assert_bad_for_arg_type, 1[m
[32m+[m[32mlj_assert_bad_for_arg_type:[m
[32m+[m	[32m.byte 204[m
[32m+[m
[32m+[m	[32m.globl lj_vm_ffi_callback[m
[32m+[m	[32m.hidden lj_vm_ffi_callback[m
[32m+[m	[32m.type lj_vm_ffi_callback, @function[m
[32m+[m	[32m.size lj_vm_ffi_callback, 179[m
[32m+[m[32mlj_vm_ffi_callback:[m
[32m+[m	[32m.byte 83,65,87,65,86,72,131,236,40,68,141,181,240,11,0,0[m
[32m+[m	[32m.byte 139,157,4,1,0,0,15,183,192,137,131,208,0,0,0,72[m
[32m+[m	[32m.byte 137,123,112,72,137,115,120,72,137,147,128,0,0,0,72,137[m
[32m+[m	[32m.byte 139,136,0,0,0,242,15,17,67,48,242,15,17,75,56,242[m
[32m+[m	[32m.byte 15,17,83,64,242,15,17,91,72,72,141,68,36,80,76,137[m
[32m+[m	[32m.byte 131,144,0,0,0,76,137,139,152,0,0,0,242,15,17,99[m
[32m+[m	[32m.byte 80,242,15,17,107,88,242,15,17,115,96,242,15,17,123,104[m
[32m+[m	[32m.byte 72,137,131,176,0,0,0,72,137,230,137,92,36,28,137,223[m
[32m+[m	[32mcall lj_ccallback_enter[m
[32m+[m	[32m.byte 65,199,134,104,244,255,255,255,255,255,255,139,80,16,139,64[m
[32m+[m	[32m.byte 24,41,208,139,106,248,193,232,3,131,192,1,139,93,16,139[m
[32m+[m	[32m.byte 11,15,182,233,15,182,205,131,195,4,65,255,36,238[m
[32m+[m
[32m+[m	[32m.globl lj_cont_ffi_callback[m
[32m+[m	[32m.hidden lj_cont_ffi_callback[m
[32m+[m	[32m.type lj_cont_ffi_callback, @function[m
[32m+[m	[32m.size lj_cont_ffi_callback, 44[m
[32m+[m[32mlj_cont_ffi_callback:[m
[32m+[m	[32m.byte 139,76,36,24,65,139,158,20,245,255,255,72,137,75,16,137[m
[32m+[m	[32m.byte 81,16,137,105,24,137,223,137,198[m
[32m+[m	[32mcall lj_ccallback_leave[m
[32m+[m	[32m.byte 72,139,67,112,242,15,16,67,48,233,247,225,255,255[m
[32m+[m
[32m+[m	[32m.globl lj_vm_ffi_call[m
[32m+[m	[32m.hidden lj_vm_ffi_call[m
[32m+[m	[32m.type lj_vm_ffi_call, @function[m
[32m+[m	[32m.size lj_vm_ffi_call, 160[m
[32m+[m[32mlj_vm_ffi_call:[m
[32m+[m	[32m.byte 85,72,137,229,83,72,137,251,139,67,8,72,41,196,15,182[m
[32m+[m	[32m.byte 75,12,131,233,1,120,17,72,139,132,203,192,0,0,0,72[m
[32m+[m	[32m.byte 137,4,204,131,233,1,121,239,15,182,67,15,72,139,187,144[m
[32m+[m	[32m.byte 0,0,0,72,139,179,152,0,0,0,72,139,147,160,0,0[m
[32m+[m	[32m.byte 0,72,139,139,168,0,0,0,76,139,131,176,0,0,0,76[m
[32m+[m	[32m.byte 139,139,184,0,0,0,133,192,116,40,15,40,67,16,15,40[m
[32m+[m	[32m.byte 75,32,15,40,83,48,15,40,91,64,131,248,4,118,19,15[m
[32m+[m	[32m.byte 40,99,80,15,40,107,96,15,40,115,112,15,40,187,128,0[m
[32m+[m	[32m.byte 0,0,255,19,72,137,131,144,0,0,0,15,41,67,16,72[m
[32m+[m	[32m.byte 137,147,152,0,0,0,15,41,75,32,72,139,93,248,201,195[m
[32m+[m
[32m+[m	[32m.section .note.GNU-stack,"",@progbits[m
[32m+[m	[32m.ident "DynASM 1.4.0"[m
[32m+[m
[32m+[m	[32m.section .debug_frame,"",@progbits[m
[32m+[m[32m.Lframe0:[m
[32m+[m	[32m.long .LECIE0-.LSCIE0[m
[32m+[m[32m.LSCIE0:[m
[32m+[m	[32m.long 0xffffffff[m
[32m+[m	[32m.byte 0x1[m
[32m+[m	[32m.string ""[m
[32m+[m	[32m.uleb128 0x1[m
[32m+[m	[32m.sleb128 -8[m
[32m+[m	[32m.byte 0x10[m
[32m+[m	[32m.byte 0xc[m
[32m+[m	[32m.uleb128 0x7[m
[32m+[m	[32m.uleb128 8[m
[32m+[m	[32m.byte 0x80+0x10[m
[32m+[m	[32m.uleb128 0x1[m
[32m+[m	[32m.align 8[m
[32m+[m[32m.LECIE0:[m
[32m+[m
[32m+[m[32m.LSFDE0:[m
[32m+[m	[32m.long .LEFDE0-.LASFDE0[m
[32m+[m[32m.LASFDE0:[m
[32m+[m	[32m.long .Lframe0[m
[32m+[m	[32m.quad .Lbegin[m
[32m+[m	[32m.quad 14322[m
[32m+[m	[32m.byte 0xe[m
[32m+[m	[32m.uleb128 80[m
[32m+[m	[32m.byte 0x86[m
[32m+[m	[32m.uleb128 0x2[m
[32m+[m	[32m.byte 0x83[m
[32m+[m	[32m.uleb128 0x3[m
[32m+[m	[32m.byte 0x8f[m
[32m+[m	[32m.uleb128 0x4[m
[32m+[m	[32m.byte 0x8e[m
[32m+[m	[32m.uleb128 0x5[m
[32m+[m	[32m.align 8[m
[32m+[m[32m.LEFDE0:[m
[32m+[m
[32m+[m[32m.LSFDE1:[m
[32m+[m	[32m.long .LEFDE1-.LASFDE1[m
[32m+[m[32m.LASFDE1:[m
[32m+[m	[32m.long .Lframe0[m
[32m+[m	[32m.quad lj_vm_ffi_call[m
[32m+[m	[32m.quad 160[m
[32m+[m	[32m.byte 0xe[m
[32m+[m	[32m.uleb128 16[m
[32m+[m	[32m.byte 0x86[m
[32m+[m	[32m.uleb128 0x2[m
[32m+[m	[32m.byte 0xd[m
[32m+[m	[32m.uleb128 0x6[m
[32m+[m	[32m.byte 0x83[m
[32m+[m	[32m.uleb128 0x3[m
[32m+[m	[32m.align 8[m
[32m+[m[32m.LEFDE1:[m
[32m+[m
[32m+[m	[32m.section .eh_frame,"a",@progbits[m
[32m+[m[32m.Lframe1:[m
[32m+[m	[32m.long .LECIE1-.LSCIE1[m
[32m+[m[32m.LSCIE1:[m
[32m+[m	[32m.long 0[m
[32m+[m	[32m.byte 0x1[m
[32m+[m	[32m.string "zPR"[m
[32m+[m	[32m.uleb128 0x1[m
[32m+[m	[32m.sleb128 -8[m
[32m+[m	[32m.byte 0x10[m
[32m+[m	[32m.uleb128 6[m
[32m+[m	[32m.byte 0x1b[m
[32m+[m	[32m.long lj_err_unwind_dwarf-.[m
[32m+[m	[32m.byte 0x1b[m
[32m+[m	[32m.byte 0xc[m
[32m+[m	[32m.uleb128 0x7[m
[32m+[m	[32m.uleb128 8[m
[32m+[m	[32m.byte 0x80+0x10[m
[32m+[m	[32m.uleb128 0x1[m
[32m+[m	[32m.align 8[m
[32m+[m[32m.LECIE1:[m
[32m+[m
[32m+[m[32m.LSFDE2:[m
[32m+[m	[32m.long .LEFDE2-.LASFDE2[m
[32m+[m[32m.LASFDE2:[m
[32m+[m	[32m.long .LASFDE2-.Lframe1[m
[32m+[m	[32m.long .Lbegin-.[m
[32m+[m	[32m.long 14322[m
[32m+[m	[32m.uleb128 0[m
[32m+[m	[32m.byte 0xe[m
[32m+[m	[32m.uleb128 80[m
[32m+[m	[32m.byte 0x86[m
[32m+[m	[32m.uleb128 0x2[m
[32m+[m	[32m.byte 0x83[m
[32m+[m	[32m.uleb128 0x3[m
[32m+[m	[32m.byte 0x8f[m
[32m+[m	[32m.uleb128 0x4[m
[32m+[m	[32m.byte 0x8e[m
[32m+[m	[32m.uleb128 0x5[m
[32m+[m	[32m.align 8[m
[32m+[m[32m.LEFDE2:[m
[32m+[m
[32m+[m[32m.Lframe2:[m
[32m+[m	[32m.long .LECIE2-.LSCIE2[m
[32m+[m[32m.LSCIE2:[m
[32m+[m	[32m.long 0[m
[32m+[m	[32m.byte 0x1[m
[32m+[m	[32m.string "zR"[m
[32m+[m	[32m.uleb128 0x1[m
[32m+[m	[32m.sleb128 -8[m
[32m+[m	[32m.byte 0x10[m
[32m+[m	[32m.uleb128 1[m
[32m+[m	[32m.byte 0x1b[m
[32m+[m	[32m.byte 0xc[m
[32m+[m	[32m.uleb128 0x7[m
[32m+[m	[32m.uleb128 8[m
[32m+[m	[32m.byte 0x80+0x10[m
[32m+[m	[32m.uleb128 0x1[m
[32m+[m	[32m.align 8[m
[32m+[m[32m.LECIE2:[m
[32m+[m
[32m+[m[32m.LSFDE3:[m
[32m+[m	[32m.long .LEFDE3-.LASFDE3[m
[32m+[m[32m.LASFDE3:[m
[32m+[m	[32m.long .LASFDE3-.Lframe2[m
[32m+[m	[32m.long lj_vm_ffi_call-.[m
[32m+[m	[32m.long 160[m
[32m+[m	[32m.uleb128 0[m
[32m+[m	[32m.byte 0xe[m
[32m+[m	[32m.uleb128 16[m
[32m+[m	[32m.byte 0x86[m
[32m+[m	[32m.uleb128 0x2[m
[32m+[m	[32m.byte 0xd[m
[32m+[m	[32m.uleb128 0x6[m
[32m+[m	[32m.byte 0x83[m
[32m+[m	[32m.uleb128 0x3[m
[32m+[m	[32m.align 8[m
[32m+[m[32m.LEFDE3:[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.o[m
[1mnew file mode 100644[m
[1mindex 0000000..4dcb477[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..4dcb477[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.o[m
[1mnew file mode 100644[m
[1mindex 0000000..dce75c3[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..f8f9334[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath.o[m
[1mnew file mode 100644[m
[1mindex 0000000..dd44751[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath_dyn.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath_dyn.o[m
[1mnew file mode 100644[m
[1mindex 0000000..a0bdf8a[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath_dyn.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit[m
[1mnew file mode 100755[m
[1mindex 0000000..3e0ab14[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.o[m
[1mnew file mode 100644[m
[1mindex 0000000..73da6c9[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/ctags b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/ctags[m
[1mnew file mode 100755[m
[1mindex 0000000..375aa10[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/ctags[m
[36m@@ -0,0 +1,6 @@[m
[32m+[m[32m#!/bin/sh[m
[32m+[m
[32m+[m[32m# this script is intended to be used by the authors themselves[m
[32m+[m
[32m+[m[32mctags -R src buildroot/nginx-1.0.8/src ~/work/drizzle7-2011.08.23/libdrizzle-1.0[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/releng b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/releng[m
[1mnew file mode 100755[m
[1mindex 0000000..b3ad9f2[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/releng[m
[36m@@ -0,0 +1,8 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32m./update-readme[m
[32m+[m[32mack '.{81}' src/ngx_http_*.[ch][m
[32m+[m[32mack '(?<=\#define)\s*DDEBUG\s*[12]' src[m
[32m+[m[32mecho =======================================[m
[32m+[m[32mack '(?<=This document describes echo-nginx-module v)\d+\.\d+' README[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/releng b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/releng[m
[1mnew file mode 100755[m
[1mindex 0000000..49b7fbc[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/releng[m
[36m@@ -0,0 +1,8 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32m#./update-readme[m
[32m+[m[32mack '(?<=\#define)\s*DDEBUG\s*1' src[m
[32m+[m[32mecho ====================================================[m
[32m+[m[32mack '(?<=_version_string) "\d+\.\d+\.\d+"' src[m
[32m+[m[32mack '(?<=This document describes rds-json-nginx-module v)\d+\.\d+' README[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/parser.so b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/parser.so[m
[1mnew file mode 100755[m
[1mindex 0000000..2b816f7[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/parser.so differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.o[m
[1mnew file mode 100644[m
[1mindex 0000000..4f634ea[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/parser.so b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/parser.so[m
[1mnew file mode 100755[m
[1mindex 0000000..143cb64[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/parser.so differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/redis-parser.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/redis-parser.o[m
[1mnew file mode 100644[m
[1mindex 0000000..ae5efe5[m
Binary files /dev/null and b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/redis-parser.o differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/Makefile[m
[1mnew file mode 100644[m
[1mindex 0000000..eb4d937[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/Makefile[m
[36m@@ -0,0 +1,3 @@[m
[32m+[m[32mtest:[m
[32m+[m	[32mprove -Ilib -r t[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/reindex b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/reindex[m
[1mnew file mode 100755[m
[1mindex 0000000..bd54c9d[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/reindex[m
[36m@@ -0,0 +1,64 @@[m
[32m+[m[32m#!/usr/bin/perl[m
[32m+[m[32m#: reindex.pl[m
[32m+[m[32m#: reindex .t files for Test::Base based test files[m
[32m+[m[32m#: Copyright (c) 2006 Agent Zhang[m
[32m+[m[32m#: 2006-04-27 2006-05-09[m
[32m+[m
[32m+[m[32muse strict;[m
[32m+[m[32muse warnings;[m
[32m+[m
[32m+[m[32m#use File::Copy;[m
[32m+[m[32muse Getopt::Std;[m
[32m+[m
[32m+[m[32mmy %opts;[m
[32m+[m[32mgetopts('hb:', \%opts);[m
[32m+[m[32mif ($opts{h} or ! @ARGV) {[m
[32m+[m[32m    die "Usage: reindex [-b 0] t/*.t\n";[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32mmy $init = $opts{b};[m
[32m+[m[32m$init = 1 if not defined $init;[m
[32m+[m
[32m+[m[32mmy @files = map glob, @ARGV;[m
[32m+[m[32mfor my $file (@files) {[m
[32m+[m[32m    next if -d $file or $file !~ /\.t_?$/;[m
[32m+[m[32m    reindex($file);[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32msub reindex {[m
[32m+[m[32m    my $file = $_[0];[m
[32m+[m[32m    open my $in, $file or[m
[32m+[m[32m        die "Can't open $file for reading: $!";[m
[32m+[m[32m    my @lines;[m
[32m+[m[32m    my $counter = $init;[m
[32m+[m[32m    my $changed;[m
[32m+[m[32m    while (<$in>) {[m
[32m+[m[32m        s/\r$//;[m
[32m+[m[32m        my $num;[m
[32m+[m[32m        s/ ^ === \s+ TEST \s+ (\d+)/$num=$1; "=== TEST " . $counter++/xie;[m
[32m+[m[32m        next if !defined $num;[m
[32m+[m[32m        if ($num != $counter-1) {[m
[32m+[m[32m            $changed++;[m
[32m+[m[32m        }[m
[32m+[m[32m    } continue {[m
[32m+[m[32m        push @lines, $_;[m
[32m+[m[32m    }[m
[32m+[m[32m    close $in;[m
[32m+[m[32m    my $text = join '', @lines;[m
[32m+[m[32m    $text =~ s/(?x) \n+ === \s+ TEST/\n\n\n\n=== TEST/ixsg;[m
[32m+[m[32m    $text =~ s/__(DATA|END)__\n+=== TEST/__${1}__\n\n=== TEST/;[m
[32m+[m[32m    #$text =~ s/\n+$/\n\n/s;[m
[32m+[m[32m    if (! $changed and $text eq join '', @lines) {[m
[32m+[m[32m        warn "reindex: $file:\tskipped.\n";[m
[32m+[m[32m        return;[m
[32m+[m[32m    }[m
[32m+[m[32m    #File::Copy::copy( $file, "$file.bak" );[m
[32m+[m[32m    open my $out, "> $file" or[m
[32m+[m[32m        die "Can't open $file for writing: $!";[m
[32m+[m[32m    binmode $out;[m
[32m+[m[32m    print $out $text;[m
[32m+[m[32m    close $out;[m
[32m+[m
[32m+[m[32m    warn "reindex: $file:\tdone.\n";[m
[32m+[m[32m}[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/releng b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/releng[m
[1mnew file mode 100755[m
[1mindex 0000000..adc2f4d[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/releng[m
[36m@@ -0,0 +1,8 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32m./update-readme[m
[32m+[m[32mack '(?<=\#define)\s*DDEBUG\s*1' src[m
[32m+[m[32mecho ====================================================[m
[32m+[m[32mack '(?<=_version_string) "\d+\.\d+\.\d+"' src[m
[32m+[m[32mack '(?<=This document describes rds-json-nginx-module v)\d+\.\d+' README[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/releng b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/releng[m
[1mnew file mode 100755[m
[1mindex 0000000..3fb6a38[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/releng[m
[36m@@ -0,0 +1,9 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32m#./update-readme[m
[32m+[m[32mack '(?<=\#define)\s*DDEBUG\s*1' src[m
[32m+[m[32mecho ====================================================[m
[32m+[m[32mack '(?<=_version_string) "\d+\.\d+\.\d+"' src[m
[32m+[m[32mack '(?<=This document describes rds-json-nginx-module v)\d+\.\d+' README[m
[32m+[m[32mack '.{81}' src/ngx_http_*.[ch][m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/ctags b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/ctags[m
[1mnew file mode 100755[m
[1mindex 0000000..375aa10[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/ctags[m
[36m@@ -0,0 +1,6 @@[m
[32m+[m[32m#!/bin/sh[m
[32m+[m
[32m+[m[32m# this script is intended to be used by the authors themselves[m
[32m+[m
[32m+[m[32mctags -R src buildroot/nginx-1.0.8/src ~/work/drizzle7-2011.08.23/libdrizzle-1.0[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/releng b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/releng[m
[1mnew file mode 100755[m
[1mindex 0000000..b3ad9f2[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/releng[m
[36m@@ -0,0 +1,8 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32m./update-readme[m
[32m+[m[32mack '.{81}' src/ngx_http_*.[ch][m
[32m+[m[32mack '(?<=\#define)\s*DDEBUG\s*[12]' src[m
[32m+[m[32mecho =======================================[m
[32m+[m[32mack '(?<=This document describes echo-nginx-module v)\d+\.\d+' README[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/releng b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/releng[m
[1mnew file mode 100755[m
[1mindex 0000000..49b7fbc[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/releng[m
[36m@@ -0,0 +1,8 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32m#./update-readme[m
[32m+[m[32mack '(?<=\#define)\s*DDEBUG\s*1' src[m
[32m+[m[32mecho ====================================================[m
[32m+[m[32mack '(?<=_version_string) "\d+\.\d+\.\d+"' src[m
[32m+[m[32mack '(?<=This document describes rds-json-nginx-module v)\d+\.\d+' README[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/Makefile[m
[1mnew file mode 100644[m
[1mindex 0000000..eb4d937[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/Makefile[m
[36m@@ -0,0 +1,3 @@[m
[32m+[m[32mtest:[m
[32m+[m	[32mprove -Ilib -r t[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/reindex b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/reindex[m
[1mnew file mode 100755[m
[1mindex 0000000..bd54c9d[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/reindex[m
[36m@@ -0,0 +1,64 @@[m
[32m+[m[32m#!/usr/bin/perl[m
[32m+[m[32m#: reindex.pl[m
[32m+[m[32m#: reindex .t files for Test::Base based test files[m
[32m+[m[32m#: Copyright (c) 2006 Agent Zhang[m
[32m+[m[32m#: 2006-04-27 2006-05-09[m
[32m+[m
[32m+[m[32muse strict;[m
[32m+[m[32muse warnings;[m
[32m+[m
[32m+[m[32m#use File::Copy;[m
[32m+[m[32muse Getopt::Std;[m
[32m+[m
[32m+[m[32mmy %opts;[m
[32m+[m[32mgetopts('hb:', \%opts);[m
[32m+[m[32mif ($opts{h} or ! @ARGV) {[m
[32m+[m[32m    die "Usage: reindex [-b 0] t/*.t\n";[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32mmy $init = $opts{b};[m
[32m+[m[32m$init = 1 if not defined $init;[m
[32m+[m
[32m+[m[32mmy @files = map glob, @ARGV;[m
[32m+[m[32mfor my $file (@files) {[m
[32m+[m[32m    next if -d $file or $file !~ /\.t_?$/;[m
[32m+[m[32m    reindex($file);[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32msub reindex {[m
[32m+[m[32m    my $file = $_[0];[m
[32m+[m[32m    open my $in, $file or[m
[32m+[m[32m        die "Can't open $file for reading: $!";[m
[32m+[m[32m    my @lines;[m
[32m+[m[32m    my $counter = $init;[m
[32m+[m[32m    my $changed;[m
[32m+[m[32m    while (<$in>) {[m
[32m+[m[32m        s/\r$//;[m
[32m+[m[32m        my $num;[m
[32m+[m[32m        s/ ^ === \s+ TEST \s+ (\d+)/$num=$1; "=== TEST " . $counter++/xie;[m
[32m+[m[32m        next if !defined $num;[m
[32m+[m[32m        if ($num != $counter-1) {[m
[32m+[m[32m            $changed++;[m
[32m+[m[32m        }[m
[32m+[m[32m    } continue {[m
[32m+[m[32m        push @lines, $_;[m
[32m+[m[32m    }[m
[32m+[m[32m    close $in;[m
[32m+[m[32m    my $text = join '', @lines;[m
[32m+[m[32m    $text =~ s/(?x) \n+ === \s+ TEST/\n\n\n\n=== TEST/ixsg;[m
[32m+[m[32m    $text =~ s/__(DATA|END)__\n+=== TEST/__${1}__\n\n=== TEST/;[m
[32m+[m[32m    #$text =~ s/\n+$/\n\n/s;[m
[32m+[m[32m    if (! $changed and $text eq join '', @lines) {[m
[32m+[m[32m        warn "reindex: $file:\tskipped.\n";[m
[32m+[m[32m        return;[m
[32m+[m[32m    }[m
[32m+[m[32m    #File::Copy::copy( $file, "$file.bak" );[m
[32m+[m[32m    open my $out, "> $file" or[m
[32m+[m[32m        die "Can't open $file for writing: $!";[m
[32m+[m[32m    binmode $out;[m
[32m+[m[32m    print $out $text;[m
[32m+[m[32m    close $out;[m
[32m+[m
[32m+[m[32m    warn "reindex: $file:\tdone.\n";[m
[32m+[m[32m}[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/releng b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/releng[m
[1mnew file mode 100755[m
[1mindex 0000000..adc2f4d[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/releng[m
[36m@@ -0,0 +1,8 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32m./update-readme[m
[32m+[m[32mack '(?<=\#define)\s*DDEBUG\s*1' src[m
[32m+[m[32mecho ====================================================[m
[32m+[m[32mack '(?<=_version_string) "\d+\.\d+\.\d+"' src[m
[32m+[m[32mack '(?<=This document describes rds-json-nginx-module v)\d+\.\d+' README[m
[32m+[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/rds-json-nginx-module-0.14/util/releng b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/rds-json-nginx-module-0.14/util/releng[m
[1mnew file mode 100755[m
[1mindex 0000000..3fb6a38[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/rds-json-nginx-module-0.14/util/releng[m
[36m@@ -0,0 +1,9 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32m#./update-readme[m
[32m+[m[32mack '(?<=\#define)\s*DDEBUG\s*1' src[m
[32m+[m[32mecho ====================================================[m
[32m+[m[32mack '(?<=_version_string) "\d+\.\d+\.\d+"' src[m
[32m+[m[32mack '(?<=This document describes rds-json-nginx-module v)\d+\.\d+' README[m
[32m+[m[32mack '.{81}' src/ngx_http_*.[ch][m
[32m+[m
[1mdiff --git a/qa_shell_script/config_server/get_env_ip.sh b/qa_shell_script/config_server/get_env_ip.sh[m
[1mindex 8e137f2..d97e456 100755[m
[1m--- a/qa_shell_script/config_server/get_env_ip.sh[m
[1m+++ b/qa_shell_script/config_server/get_env_ip.sh[m
[36m@@ -1 +1 @@[m
[31m-12 13 14 15 16 17 22 23 24 25 26 28 46 50 59 60 72 74 75 76 88 119 151 152 153 154 155 156 158 160 161 162 164 172.30.199.2 [m
\ No newline at end of file[m
[32m+[m[32m12 13 14 15 16 17 22 23 24 25 26 28 46 50 59 60 72 74 75 76 88 119 151 152 153 154 155 156 158 160 161 162 164 172.30.199.2  172.30.199.3[m
[1mdiff --git a/qa_shell_script/exception_sub_shell.sh b/qa_shell_script/exception_sub_shell.sh[m
[1mindex 35bd4e8..4af42d5 100755[m
[1m--- a/qa_shell_script/exception_sub_shell.sh[m
[1m+++ b/qa_shell_script/exception_sub_shell.sh[m
[36m@@ -111,7 +111,13 @@[m [mtranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.14" "new-xy[m
 #tranceConfig java "mall-ui.url=http://192.168.4.15:7058" "mall-ui.url=http://wechattest1.xyqb.com" "192.168.4.15" "xyqb.properties"[m
 [m
 #4.16[m
[31m-[m
[32m+[m[32mtranceConfig ui "wechattest.xyqb.com" "xyqb-user2-16.q-gp.com" "192.168.4.16" "xyqb-user-ui.js"[m
[32m+[m[32mtranceConfig java "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.16" "xyqb-user2.properties"[m
[32m+[m[32mtranceConfig java "11fb7f6a8b8edf2776a72c2f5624229c" "e30380e9ade07f361e51a643f94d8817" "192.168.4.16" "xyqb-user2.properties"[m
[32m+[m[32mtranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.16" "xyqb-user-ui.js"[m
[32m+[m[32mtranceConfig java "192.168.4.16:7043" "xyqb-user-ui-16.q-gp.com" "192.168.4.16" "xyqb-user2.properties"[m
[32m+[m[32mtranceConfig ui "wechattest.xyqb.com" "xyqb-user2-16.q-gp.com" "192.168.4.16" "new-xyqb-user-ui.js"[m
[32m+[m[32mtranceConfig ui "wx89894cd83d117b26" "wxc94ca68b353e90d0" "192.168.4.16" "new-xyqb-user-ui.js"[m
 #4.17[m
 #tranceConfig java "192.168.4.3" "192.168.4.17" "192.168.4.17" "*"[m
 tranceConfig java "ygziguan.api.url=http://139.198.0.253/receiver/grequest" "ygziguan.api.url=http://mock.q-gp.com/receiver/grequest" "192.168.4.17" "fund-manage.properties"[m
[36m@@ -142,7 +148,6 @@[m [mtranceConfig ui "wx89894cd83d117b26" "wxd019cd24f6edae9f" "192.168.4.22" "activi[m
 #tranceConfig node "dbIp: '192.168.4.23'" "dbIp: '192.168.4.8'" "192.168.4.23" "*"[m
 #tranceConfig python "ip=192.168.4.23" "ip=192.168.4.8"  "192.168.4.23" "qin-qiong*"[m
 #tranceConfig java "192.168.4.23:3306" "192.168.4.8:3306" "192.168.4.23" "redpacket.properties"[m
[31m-#tranceConfig java "qatest" "Uiwb@o^fR&nHOa5t" "192.168.4.23" "redpacket.properties"[m
 #tranceConfig java "redpacket.data.mysql.user=qa" "redpacket.data.mysql.user=xyqb_query" "192.168.4.23" "redpacket.properties"[m
 tranceConfig node "192.168.4.50:9050" "192.168.4.23:7060" "192.168.4.23" "op-api.js"[m
 #tranceConfig java "xyqb.is.debug=0" "xyqb.is.debug=1" "192.168.4.23" "baitiao.properties"[m
[36m@@ -172,7 +177,8 @@[m [mtranceConfig java "ygziguan.api.url=http://139.198.0.253/receiver/grequest" "ygz[m
 [m
 tranceConfig java "wx.api_host=https:\/\/api.mch.weixin.qq.com\/" "wx.api_host=http:\/\/mock.q-gp.com\/" "192.168.4.28" "gu-bei.properties"[m
 tranceConfig node "http://139.198.2.95:38099" "http://192.168.4.48:8088" "192.168.4.28" "AppBackend.js"[m
[31m-[m
[32m+[m[32mtranceConfig ui "wechattest.xyqb.com" "xyqb-user2-28.q-gp.com" "192.168.4.28" "new-xyqb-user-ui.js"[m
[32m+[m[32mtranceConfig ui "wx89894cd83d117b26" "wx89894cd83d117b26" "192.168.4.28" "new-xyqb-user-ui.js"[m
 #4.72[m
 #tranceConfig java "sms.is.debug=1" "sms.is.debug=0" "192.168.4.24" "di-ting.properties"[m
 #tranceConfig java "xyqb.is.debug=1" "xyqb.is.debug=0" "192.168.4.24" "xyqb.properties"[m
[36m@@ -181,6 +187,8 @@[m [mtranceConfig node "http://139.198.2.95:38099" "http://192.168.4.48:8088" "192.16[m
 #tranceConfig node ":7013" ":7042" "192.168.4.72" "AppBackend.js"[m
 #tranceConfig java "wx.api_host=https:\/\/api.mch.weixin.qq.com\/" "wx.api_host=http:\/\/mock.q-gp.com\/" "192.168.4.72" "gu-bei.properties"[m
 tranceConfig node "http://139.198.2.95:38099" "http://192.168.4.48:8099" "192.168.4.72" "AppBackend.js"[m
[32m+[m[32mtranceConfig ui "//192.168.4.72:7054/" "//192.168.4.72:18000/mallapi/" "192.168.4.72" "new-mall-ui.js"[m
[32m+[m
 #4.151[m
 tranceConfig java "xyqb.is.debug=0" "xyqb.is.debug=1" "192.168.4.151" "xyqb.properties"[m
 tranceConfig java "liebao.aes.key=0123456789abcdef" "liebao.aes.key=e2XNtnB8QEEuvhEW" "192.168.4.151" "cash-loan-flow.properties"[m
[1mdiff --git a/qa_shell_script/ngrok/docker_env_name.sh b/qa_shell_script/ngrok/docker_env_name.sh[m
[1mindex 9a42425..c0e7936 100644[m
[1m--- a/qa_shell_script/ngrok/docker_env_name.sh[m
[1m+++ b/qa_shell_script/ngrok/docker_env_name.sh[m
[36m@@ -1 +1 @@[m
[31m- qa20|192.168.167.5 qa1|192.168.167.2 qa3|192.168.167.6 qa4|192.168.167.3 qa21|192.168.167.4[m
[32m+[m[32m qa20|192.168.167.5 qa1|192.168.167.2 qa3|192.168.167.6 qa4|192.168.167.3 qa21|192.168.167.4 156|192.168.167.3 qa5|192.168.167.4 xjd001|192.168.167.6 zhangbin|192.168.167.7[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/baitiao_activiate.sh b/qa_shell_script/script_by_Contorller/baitiao_activiate.sh[m
[1mindex 88eb88b..509e65a 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/baitiao_activiate.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/baitiao_activiate.sh[m
[36m@@ -26,7 +26,7 @@[m [mfunction activate()[m
        i=0[m
        while [ $i -lt $num ]; do[m
            uuid='928ba526-29f1-4ef8-8bb8-'${phone_no}[m
[31m-           insert_xyqb_user="INSERT INTO user( "phone_no", "password", "registered_from", "uuid", "enable", "created_at", "updated_at")VALUES ( ${phone_no}, '318e235d3e52648b236faa3f748000d5', '214', '${uuid}', '1', '$date_now', '$date_now')"[m
[32m+[m[32m           insert_xyqb_user="INSERT INTO user( "phone_no", "password", "registered_from", "uuid", "enable", "created_at", "updated_at")VALUES ( ${phone_no}, '318e235d3e52648b236faa3f748000d5', '222', '${uuid}', '1', '$date_now', '$date_now')"[m
            mysql  $mysqld xyqb_user -e "set names utf8;${insert_xyqb_user}"[m
 [m
            select_user_id="SELECT id  from user where user.phone_no=${phone_no}"[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/baitiao_user_delete.sh b/qa_shell_script/script_by_Contorller/baitiao_user_delete.sh[m
[1mindex 37b1203..a40679b 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/baitiao_user_delete.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/baitiao_user_delete.sh[m
[36m@@ -86,7 +86,13 @@[m [mfunction baitiaoDeleteOrder(){[m
        count_xyqb_user=$[count_xyqb_user -1][m
       [m
     done[m
[31m- [m
[32m+[m[32m   del_user1="delete from user where user.phone_no=${phone_no}"[m
[32m+[m[32m   mysql -N $mysqld xyqb -e "${del_user1}"[m
[32m+[m[32m   mysql -N $mysqld xyqb_user -e "${del_user1}"[m
[32m+[m[32m     #echo $del_user[m[41m      [m
[32m+[m[32m   del_user_detail1="delete from user_detail where user_detail.phone_no=${phone_no}"[m
[32m+[m[32m   mysql -N $mysqld xyqb -e "${del_user_detail1}"[m
[32m+[m[32m   mysql -N $mysqld xyqb_user -e "${del_user_detail1}"[m
     del_bill="delete from baitiao_bill where baitiao_bill.user_phone=${phone_no}"[m
     mysql -N $mysqld xyqb -e "${del_bill}"[m
     #echo $del_bill [m
[1mdiff --git a/qa_shell_script/script_by_Contorller/kill_mall-settlement_pid.sh b/qa_shell_script/script_by_Contorller/kill_mall-settlement_pid.sh[m
[1mnew file mode 100644[m
[1mindex 0000000..4c002df[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/script_by_Contorller/kill_mall-settlement_pid.sh[m
[36m@@ -0,0 +1,13 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mHOSTNAME="`ifconfig | awk -F'addr:|Bcast' '/Bcast/{print $2}'`"   #数据库信息[m
[32m+[m[32mPORT="3306"[m
[32m+[m[32mUSERNAME="qa"[m
[32m+[m[32mPASSWORD="qatest"[m
[32m+[m
[32m+[m[32mfor i in `mysql -u${USERNAME} -p${PASSWORD} -se "show processlist" | grep -v "show processlist" | grep -v "$HOSTNAME" | awk '{if($4=="mall_settlement" )print $1}'`[m
[32m+[m[32mdo[m[41m [m
[32m+[m[32m    mysql -u${USERNAME} -p${PASSWORD} -e "kill $i"[m
[32m+[m
[32m+[m[32mdone[m
[32m+[m
[32m+[m[32mecho "done!!"[m
[1mdiff --git a/qa_shell_script/script_by_Contorller/redpacket_coupon.sh b/qa_shell_script/script_by_Contorller/redpacket_coupon.sh[m
[1mindex 985065f..e50b902 100644[m
[1m--- a/qa_shell_script/script_by_Contorller/redpacket_coupon.sh[m
[1m+++ b/qa_shell_script/script_by_Contorller/redpacket_coupon.sh[m
[36m@@ -12,7 +12,7 @@[m [mPASSWORD="qatest"[m
 DBNAME="redpacket"    #数据库名称[m
 TABLENAME="tb-coupon"[m
 [m
[31m-[m
[32m+[m[32mdate="`date +%Y%m%d%H%M%S`"[m
 [m
 [m
 len=`echo $phone_no|awk '{print length($0)}'`[m
[36m@@ -25,7 +25,7 @@[m [mfi[m
 case "$coupon_type" in[m
 1)[m
 coupon_1="INSERT INTO redpacket.tb_coupon ( unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid)[m
[31m-VALUES (concat('MALL20170626111210457af1ec45g',NOW()), '$phone_no', '10000572', '友宝优惠券', '9', '{\"firstChannel\":\"2\"}', '1', '{\"full\":200,\"cut\":5}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), '2', '26364792')"[m
[32m+[m[32mVALUES (concat('MALL20170626111210457af1ec45g',$date), '$phone_no', '10000572', '友宝优惠券', '9', '{\"firstChannel\":\"2\"}', '1', '{\"full\":200,\"cut\":5}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), '2', '26364792')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_1}"[m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -37,7 +37,7 @@[m [mfi[m
 [m
 2)[m
 coupon_2="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES ( concat('MALL20171109161159417a4d41cg1',NOW()), '$phone_no', '10000669', '商城购物满减券', '6', '{\"firstChannel\":1,\"channelId\":[]}', '1', '{\"full\":\"100\",\"cut\":\"5\"}', NOW(), '2028-09-24 23:59:00','0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
[32m+[m[32mVALUES ( concat('MALL20171109161159417a4d41cg1',$date), '$phone_no', '10000669', '商城购物满减券', '6', '{\"firstChannel\":1,\"channelId\":[]}', '1', '{\"full\":\"100\",\"cut\":\"5\"}', NOW(), '2028-09-24 23:59:00','0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_2}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -49,7 +49,7 @@[m [mfi[m
 [m
  3)[m
 coupon_3="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES ( concat('MALL20171109161216046a1f635gd',NOW()), '$phone_no', '10000670', '商城购物折扣券', '6', '{\"firstChannel\":1,\"channelId\":[]}', '2', '{\"discount\":\"5\"}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
[32m+[m[32mVALUES ( concat('MALL20171109161216046a1f635gd',$date), '$phone_no', '10000670', '商城购物折扣券', '6', '{\"firstChannel\":1,\"channelId\":[]}', '2', '{\"discount\":\"5\"}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_3}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -61,7 +61,7 @@[m [mfi[m
 [m
 4)[m
 coupon_4="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES ( concat('MALL20171109161216046a1f635gd',NOW()), '$phone_no', '10000679', '商城购物实物折扣券', '6', '{\"firstChannel\":3,\"channelId\":[]}', '2', '{\"discount\":8}', NOW(), '2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
[32m+[m[32mVALUES ( concat('MALL20171109161216046a1f635gd',$date), '$phone_no', '10000679', '商城购物实物折扣券', '6', '{\"firstChannel\":3,\"channelId\":[]}', '2', '{\"discount\":8}', NOW(), '2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_4}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -73,7 +73,7 @@[m [mfi[m
 [m
 5)[m
 coupon_5="INSERT INTO redpacket.tb_coupon ( unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES ( concat('MALL2017110917061815515d71558',NOW()), '$phone_no', '10000678', '商城购物实物满减券', '6', '{\"firstChannel\":3,\"channelId\":[]}', '1', '{\"full\":100,\"cut\":5}',NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033');"[m
[32m+[m[32mVALUES ( concat('MALL2017110917061815515d71558',$date), '$phone_no', '10000678', '商城购物实物满减券', '6', '{\"firstChannel\":3,\"channelId\":[]}', '1', '{\"full\":100,\"cut\":5}',NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033');"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_5}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -85,7 +85,7 @@[m [mfi[m
 [m
 6)[m
 coupon_6="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES ( concat('MALL201711091706293642335f562',NOW()), '$phone_no', '10000677', '商城购物充值折扣券', '6', '{\"firstChannel\":2,\"channelId\":[]}', '2', '{\"discount\":8}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
[32m+[m[32mVALUES ( concat('MALL201711091706293642335f562',$date), '$phone_no', '10000677', '商城购物充值折扣券', '6', '{\"firstChannel\":2,\"channelId\":[]}', '2', '{\"discount\":8}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_6}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -97,7 +97,7 @@[m [mfi[m
 [m
 7)[m
 coupon_7="INSERT INTO redpacket.tb_coupon (unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES ( concat('CASH_LOAN2017102419394902108ea8623',NOW()), '$phone_no', '10000649', '现金贷还款折扣券', '8', '{\"loanTerm\":[1,2,3]}', '2', '{\"discount\":8.8}', NOW(),'2028-09-24 23:59:00','0', '2', NOW(), NULL, NOW(), NULL, '5')"[m
[32m+[m[32mVALUES ( concat('CASH_LOAN2017102419394902108ea8623',$date), '$phone_no', '10000649', '现金贷还款折扣券', '8', '{\"loanTerm\":[1,2,3]}', '2', '{\"discount\":8.8}', NOW(),'2028-09-24 23:59:00','0', '2', NOW(), NULL, NOW(), NULL, '5')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_7}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -109,7 +109,7 @@[m [mfi[m
 [m
 8)[m
 coupon_8="INSERT INTO redpacket.tb_coupon ( unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES ( concat('CASH_LOAN20171109161259004ad216ge3',NOW()), '$phone_no', '10000672', '现金贷抵扣券', '8', '{\"loanTerm\":[1,2]}', '3', '{\"rebate\":\"100\"}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
[32m+[m[32mVALUES ( concat('CASH_LOAN20171109161259004ad216ge3',$date), '$phone_no', '10000672', '现金贷抵扣券', '8', '{\"loanTerm\":[1,2]}', '3', '{\"rebate\":\"100\"}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_8}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -121,7 +121,7 @@[m [mfi[m
 [m
 9)[m
 coupon_9="INSERT INTO redpacket.tb_coupon ( unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES (concat('CASH_LOAN2017110916134482203d783ga',NOW()), '$phone_no', '10000673', '现金贷还款免息券', '8', '{\"loanTerm\":[1,2]}', '4', '{}', NOW(), '2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
[32m+[m[32mVALUES (concat('CASH_LOAN2017110916134482203d783ga',$date), '$phone_no', '10000673', '现金贷还款免息券', '8', '{\"loanTerm\":[1,2]}', '4', '{}', NOW(), '2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_9}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -133,7 +133,7 @@[m [mfi[m
 [m
 10)[m
 coupon_10="INSERT INTO redpacket.tb_coupon ( unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES (concat('OUT_BAITIAO201711091613599425d5e345g',NOW()), '$phone_no', '10000674', '白条购物券满减券', '9', '{\"firstChannel\":1}', '1', '{\"full\":\"100\",\"cut\":\"50\"}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
[32m+[m[32mVALUES (concat('OUT_BAITIAO201711091613599425d5e345g',$date), '$phone_no', '10000674', '白条购物券满减券', '9', '{\"firstChannel\":1}', '1', '{\"full\":\"100\",\"cut\":\"50\"}', NOW(),'2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_10}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m
[36m@@ -145,7 +145,7 @@[m [mfi[m
 [m
 11)[m
 coupon_11="INSERT INTO redpacket.tb_coupon ( unique_business_id, phone, group_id, name, category, category_info, category_type, category_type_info, valid_start_date, valid_end_date, sms_reminder_on_invalid, status, created_at, used_at, updated_at, mark, uid) [m
[31m-VALUES ( concat('OUT_BAITIAO201711091614166796e01b39g',NOW()), '$phone_no', '10000675', '深圳通白条购物券满减券', '9', '{\"firstChannel\":2}', '1', '{\"full\":\"100\",\"cut\":\"5\"}',NOW(), '2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
[32m+[m[32mVALUES ( concat('OUT_BAITIAO201711091614166796e01b39g',$date), '$phone_no', '10000675', '深圳通白条购物券满减券', '9', '{\"firstChannel\":2}', '1', '{\"full\":\"100\",\"cut\":\"5\"}',NOW(), '2028-09-24 23:59:00', '0', '2', NOW(), NULL, NOW(), NULL, '1000033')"[m
 mysql -h${HOSTNAME} -p${PORT} -u${USERNAME} -p${PASSWORD}  ${DBNAME} -e"set names utf8; ${coupon_11}" [m
 return=$?[m
 if [ "$return" = "0" ];then[m

[33mcommit 1deb81a7046697ffa3a91a64b66e4d005bbb95f5[m
Merge: 83e3caa c6062f8
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Fri Dec 8 17:30:02 2017 +0800

    Merge branch 'master' of http://git.quantgroup.cn/QA/qa-deploy-utils

[33mcommit 83e3caa93c8e9af0910a4e97ac3facc9f354ec6a[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Fri Dec 8 17:29:56 2017 +0800

    update mq

[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq.sh b/qa_shell_script/rabbitmq/initial_mq.sh[m
[1mold mode 100755[m
[1mnew mode 100644[m
[1mindex ea42f69..5368942[m
[1m--- a/qa_shell_script/rabbitmq/initial_mq.sh[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq.sh[m
[36m@@ -1,229 +1,17 @@[m
 #!/bin/bash[m
[31m-[m
[31m-function add_vhost()[m
[31m-{       [m
[31m-        /usr/lib/rabbitmq/bin/rabbitmqctl delete_vhost $1[m
[31m-        /usr/lib/rabbitmq/bin/rabbitmqctl add_vhost $1[m
[31m-        /usr/lib/rabbitmq/bin/rabbitmqctl set_permissions -p $1 qa ".*" ".*" ".*"[m
[31m-}[m
[31m-[m
[31m-function add_exchange()[m
[31m-{   [m
[31m-	echo "增加交换机：$2"[m
[31m-	/home/qa-deploy-utils/qa_shell_script/rabbitmq/rabbitmqadmin declare exchange --vhost=$1 name=$2 type=$3 -u qa -p qatest[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_queues()[m
[31m-{   [m
[31m-	echo "增加队列：$2"[m
[31m-	/home/qa-deploy-utils/qa_shell_script/rabbitmq/rabbitmqadmin declare queue --vhost=$1 name=$2 durable=true $3 -u qa -p qatest[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_binding()[m
[31m-{[m
[31m-	echo "增加绑定：从交换机$2 到队列$3"[m
[31m-	/home/qa-deploy-utils/qa_shell_script/rabbitmq/rabbitmqadmin --vhost=$1 declare binding source=$2 destination=$3  routing_key=$4 -u qa -p qatest[m
[31m-}[m
[31m-[m
[31m-#ad vhost[m
[31m-add_vhost /[m
[31m-add_vhost /black_hole[m
[31m-add_vhost /funding[m
[31m-add_vhost /loan_order[m
[31m-add_vhost /clotho[m
[31m-add_vhost baitiao_debt[m
[31m-add_vhost financial_system[m
[31m-add_vhost feature [m
[31m-add_vhost mall[m
[31m-add_vhost msg_center_op[m
[31m-add_vhost appbackend #tower [m
[31m-add_vhost offline[m
[31m-add_vhost orderstatus_vhost[m
[31m-add_vhost sms[m
[31m-add_vhost spider_center[m
[31m-add_vhost xyqb_push[m
[31m-add_vhost bt_loan[m
[31m-add_vhost baitiao_qrcode[m
[31m-add_vhost bt_loan[m
[31m-add_vhost /pay_center[m
[31m-add_vhost backend[m
[31m-add_vhost /trans_order[m
[31m-add_vhost /user_register[m
[31m-add_vhost notify[m
[31m-add_vhost SILKROAD[m
[31m-add_vhost bt_data_visualization[m
[31m-#add_vhost baitiao_zhitou[m
[31m-#add exchange[m
[31m-add_exchange /  hello-exchange  direct[m
[31m-add_exchange /black_hole        contract        direct[m
[31m-add_exchange /black_hole        contractExchange        direct[m
[31m-add_exchange /funding   assignment      direct[m
[31m-add_exchange /loan_order        loan_order_exchange     fanout[m
[31m-add_exchange /loan_order        loan_vest_exchange     fanout[m
[31m-add_exchange /loan_order        loan_repay_status     topic[m
[31m-add_exchange /loan_order        loan_repay_status     topic[m
[31m-add_exchange baitiao_debt       baitiaodebt_orderinfo   direct[m
[31m-add_exchange baitiao_debt baitiao_debt direct[m
[31m-add_exchange financial_system   fs      direct[m
[31m-add_exchange financial_system   btztFund      direct[m
[31m-add_exchange mall       digital direct[m
[31m-add_exchange mall       refresh_cache fanout[m
[31m-add_exchange offline    Spider  direct[m
[31m-add_exchange orderstatus_vhost  orderstatus_exchange    direct[m
[31m-add_exchange sms        sms-control     direct[m
[31m-add_exchange xyqb_push  events  direct[m
[31m-add_exchange bt_loan bt_loan_exchange direct[m
[31m-add_exchange baitiao_debt baitiaodebt_orderinfo direct[m
[31m-add_exchange baitiao_qrcode qrcode fanout[m
[31m-add_exchange /pay_center paycenter_exchange direct [m
[31m-add_exchange backend backend_message_rewrite_exc direct[m
[31m-add_exchange backend backend_file_exc direct[m
[31m-add_exchange /funding async direct[m
[31m-add_exchange spider_center feature_save direct[m
[31m-add_exchange feature feature_save direct[m
[31m-add_exchange /trans_order trans_order_exchange direct[m
[31m-add_exchange /user_register user_register_exchange direct[m
[31m-add_exchange notify notify-control direct[m
[31m-add_exchange /clotho clotho_exchange direct[m
[31m-add_exchange bt_data_visualization  bt_data_visualization_exchange direct[m
[31m-#add_exchange baitiao_zhitou btzt_orderStatus_exc direct[m
[31m-#add_exchange baitiao_zhitou btzt_repay_rewrite_exc direct[m
[31m-#add_exchange baitiao_zhitou btzt_sendfund_exc direct[m
[31m-#add_exchange baitiao_zhitou btzt_user_rewrite_exc direct[m
[31m-#add_exchange baitiao_zhitou btzt_hrbcb_repay_notice_exc direct[m
[31m-#add_exchange baitiao_zhitou btzt_hrbcb_user_auth_exc direct[m
[31m-#add_exchange baitiao_zhitou delay_order_approval_query_exchange direct[m
[31m-#add_exchange baitiao_zhitou order_approval_query_exchange direct[m
[31m-#add_exchange baitiao_zhitou btzt_repay_exchange direct[m
[31m-#add_exchange baitiao_zhitou btzt_user_exc direct[m
[31m-#add_exchange baitiao_zhitou delay_btzt_hrbcb_repay_notice_exc direct[m
[31m-#add_exchange baitiao_zhitou delay_btzt_hrbcb_user_auth_exc direct[m
[31m-#add_exchange baitiao_zhitou delay_hrbcb_order_exchange direct[m
[31m-#add_exchange baitiao_zhitou hrbcb_order_exchange direct[m
[31m-[m
[31m-#add queues[m
[31m-add_queues /black_hole  contractQueue[m
[31m-add_queues /black_hole  generate_success[m
[31m-add_queues /black_hole  ssq_waiting_generate[m
[31m-add_queues /black_hole  waiting_generate[m
[31m-add_queues /black_hole  waiting_oneway[m
[31m-add_queues /black_hole baitiao_contract [m
[31m-add_queues /black_hole generate_auth_success[m
[31m-add_queues /black_hole waiting_auth_generate[m
[31m-add_queues /black_hole generate_register_success[m
[31m-add_queues /black_hole waiting_register_generate[m
[31m-add_queues /black_hole quna_active_contract[m
[31m-add_queues /funding     approval_suc[m
[31m-add_queues /loan_order  loan_order_queue[m
[31m-add_queues /loan_order  loan_state_msg_queue[m
[31m-add_queues /loan_order  push_urge[m
[31m-add_queues /loan_order  repay_status_urge[m
[31m-add_queues baitiao_debt qunar_baitiaodebt[m
[31m-add_queues baitiao_debt xyqbBaitiaoQueue[m
[31m-add_queues financial_system     baitiaoOrder[m
[31m-add_queues financial_system     baitiaoRefund[m
[31m-add_queues financial_system     loan_info[m
[31m-add_queues financial_system     xyqb[m
[31m-add_queues financial_system     xyqbInfoForRedpacketQueue[m
[31m-add_queues financial_system     xyqbPay[m
[31m-add_queues financial_system     xyqbLoanInfo[m
[31m-add_queues financial_system	btztFund[m
[31m-add_queues mall deliver[m
[31m-add_queues mall mallOrder[m
[31m-add_queues mall refund[m
[31m-add_queues mall refundFeed[m
[31m-add_queues msg_center_op notify_task 'arguments={"durable":true, "x-message-ttl":2592000000}'[m
[31m-add_queues mall appbackend_refresh 'arguments={"x-message-ttl":120000}'[m
[31m-add_queues mall h5_refresh 'arguments={"x-message-ttl":120000}'[m
[31m-add_queues mall refundFailedQueue[m
[31m-add_queues mall jdOrder 'arguments={"x-message-ttl":120000}'[m
[31m-add_queues appbackend sync_req_id 'arguments={"x-message-ttl":120000}'[m
[31m-add_queues offline      Test[m
[31m-add_queues orderstatus_vhost    orderstatus_queue[m
[31m-add_queues sms  appMsg[m
[31m-add_queues sms  smsMsg[m
[31m-add_queues sms  confirmMsg[m
[31m-add_queues sms  thirdMsg[m
[31m-add_queues sms  weChatMsg[m
[31m-add_queues sms  smsOpMarket[m
[31m-add_queues spider_center        SpiderSuccess[m
[31m-add_queues spider_center        Test[m
[31m-add_queues xyqb_push    TestEvents[m
[31m-add_queues xyqb_push    myqueue[m
[31m-add_queues mall refund[m
[31m-add_queues mall refundFeed[m
[31m-add_queues financial_system refundInfo[m
[31m-add_queues bt_loan bt_loan_queue[m
[31m-add_queues baitiao_debt save_redpacket[m
[31m-add_queues bt_loan bt_loan_queue[m
[31m-add_queues /black_hole waiting_mult_generate[m
[31m-add_queues financial_system xyqb[m
[31m-add_queues /pay_center withhold_single_service_fee_queue[m
[31m-add_queues /pay_center result_single_service_fee_queue[m
[31m-add_queues backend backend_message_rewrite_queue[m
[31m-add_queues backend backend_file_queue[m
[31m-add_queues /loan_order ka_loan_progress_queue[m
[31m-add_queues /loan_order loan_vest_msg_queue[m
[31m-add_queues /loan_order loan_vest_queue[m
[31m-add_queues /funding generate_contract[m
[31m-add_queues baitiao_debt xyqb_baitiao_queue[m
[31m-add_queues spider_center feature_calculate[m
[31m-add_queues feature feature_calculate[m
[31m-add_queues /trans_order trans_order_queue[m
[31m-add_queues /user_register user_register_queue[m
[31m-add_queues notify notify[m
[31m-add_queues /clotho clotho_notify_record[m
[31m-add_queues bt_data_visualization bt_data_visualization_queue[m
[31m-#add_queues baitiao_zhitou btzt_orderStatus_queue[m
[31m-#add_queues baitiao_zhitou btzt_repay_rewrite_queue[m
[31m-#add_queues baitiao_zhitou btzt_sendfund_queue[m
[31m-#add_queues baitiao_zhitou btzt_user_rewrite_queue[m
[31m-#add_queues baitiao_zhitou delay_order_approval_query_queue[m
[31m-#add_queues baitiao_zhitou dlx_order_approval_query_queue[m
[31m-#add_queues baitiao_zhitou order_approval_query_queue[m
[31m-#add_queues baitiao_zhitou btzt_hrbcb_repay_notice_queue[m
[31m-#add_queues baitiao_zhitou btzt_hrbcb_user_auth_queue[m
[31m-#add_queues baitiao_zhitou btzt_repay_queue[m
[31m-#add_queues baitiao_zhitou btzt_user_queue[m
[31m-#add_queues baitiao_zhitou delay_btzt_hrbcb_repay_notice_queue[m
[31m-#add_queues baitiao_zhitou delay_btzt_hrbcb_user_auth_queue[m
[31m-#add_queues baitiao_zhitou delay_hrbcb_order_queue[m
[31m-#add_queues baitiao_zhitou hrbcb_order_queue[m
[31m-add_queues financial_system xyqbCompensatory[m
[31m-add_queues financial_system hengfengInfo[m
[31m-[m
[31m-[m
[31m-#add bindings[m
[31m-add_binding mall refresh_cache h5_refresh h5_refresh[m
[31m-add_binding mall refresh_cache appbackend_refresh appbackend_refresh[m
[31m-add_binding mall digital refundFailedQueue refundFailedQueue [m
[31m-add_binding mall digital jdOrder jdOrder[m
[31m-add_binding backend backend_message_rewrite_exc backend_message_rewrite_queue backend_message_rewrite_route[m
[31m-add_binding backend backend_file_exc backend_file_queue backend_file_route[m
[31m-add_binding /black_hole contract generate_auth_success generate_auth_success[m
[31m-add_binding /black_hole contract waiting_auth_generate waiting_auth_generate[m
[31m-add_binding /black_hole contract generate_success generate_success[m
[31m-add_binding /black_hole contract waiting_generate waiting_generate[m
[31m-add_binding /black_hole contract baitiao_contract baitiao_contract [m
[31m-add_binding /loan_order loan_order_exchange  loan_state_msg_queue loan_state_msg_queue[m
[31m-add_binding /trans_order trans_order_exchange trans_order_queue trans-routing-key[m
[31m-add_binding /loan_order loan_repay_status repay_status_urge repayment_status[m
[31m-add_binding /loan_order loan_repay_status push_urge push_urge[m
[31m-add_binding notify notify-control notify notify[m
[31m-add_binding bt_data_visualization  bt_data_visualization_exchange  bt_data_visualization_queue  bt_data_visualization_queue[m
[31m-#add_binding baitiao_zhitou btzt_repay_rewrite_exc order_approval_query_queue btzt_repay_rewrite_route[m
[31m-#add_binding baitiao_zhitou order_approval_query_exchange  order_approval_query_queue order_approval_query_routing[m
[31m-#add_binding baitiao_zhitou delay_order_approval_query_exchange delay_order_approval_query_queue delay_order_approval_query_routing[m
[31m-#add_binding baitiao_zhitou btzt_user_rewrite_exc btzt_user_rewrite_queue btzt_user_rewrite_route[m
[31m-#add_binding baitiao_zhitou btzt_sendfund_exc btzt_sendfund_queue btzt_sendfund_route[m
[31m-#add_binding baitiao_zhitou btzt_repay_rewrite_exc btzt_repay_rewrite_queue btzt_repay_rewrite_route[m
[31m-#add_binding baitiao_zhitou btzt_hrbcb_repay_notice_exc btzt_hrbcb_repay_notice_queue btzt_hrbcb_repay_notice_route[m
[31m-#add_binding baitiao_zhitou btzt_hrbcb_user_auth_exc btzt_hrbcb_user_auth_queue btzt_hrbcb_user_auth_route[m
[31m-#add_binding baitiao_zhitou btzt_repay_exchange btzt_repay_queue btzt_repay_route[m
[31m-#add_binding baitiao_zhitou btzt_user_exc btzt_user_queue btzt_user_route[m
[31m-#add_binding baitiao_zhitou delay_btzt_hrbcb_repay_notice_exc delay_btzt_hrbcb_repay_notice_queue delay_btzt_hrbcb_repay_notice_route[m
[31m-#add_binding baitiao_zhitou delay_btzt_hrbcb_user_auth_exc delay_btzt_hrbcb_user_auth_queue delay_btzt_hrbcb_user_auth_route[m
[31m-#add_binding baitiao_zhitou delay_hrbcb_order_exchange delay_hrbcb_order_queue delay_hrbcb_order_routing[m
[31m-#add_binding baitiao_zhitou hrbcb_order_exchange hrbcb_order_queue hrbcb_order_routing[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
[32m+[m[32mpwd_path="/home/qa-deploy-utils/qa_shell_script"[m
[32m+[m[32mconfig_server="$pwd_path/config_server"[m
[32m+[m[32mproject_path=`cat $config_server/get_env_ip.sh`[m
[32m+[m
[32m+[m[32mif [ -n "$1" ];then[m
[32m+[m	[32mproject_path=$1[m
[32m+[m[32mfi[m
[32m+[m
[32m+[m[32mresponse=$(curl -X GET -H "Authorization: Basic cmFiYml0X2FkbWluOmFiYzEyMzQ=" "http://172.16.1.231:15672/api/definitions")[m
[32m+[m
[32m+[m[32mfor ip_last_num in $project_path[m
[32m+[m[32mdo[m
[32m+[m	[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[32m+[m	[32mcurl -X POST -H "Content-Type: application/json" -H "Authorization: Basic cWE6cWF0ZXN0" -d $response "http://$IP_host:15672/api/definitions"[m
[32m+[m[32mdone[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/rabbitmq/initial_mq_bak.sh b/qa_shell_script/rabbitmq/initial_mq_bak.sh[m
[1mnew file mode 100755[m
[1mindex 0000000..ea42f69[m
[1m--- /dev/null[m
[1m+++ b/qa_shell_script/rabbitmq/initial_mq_bak.sh[m
[36m@@ -0,0 +1,229 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m
[32m+[m[32mfunction add_vhost()[m
[32m+[m[32m{[m[41m       [m
[32m+[m[32m        /usr/lib/rabbitmq/bin/rabbitmqctl delete_vhost $1[m
[32m+[m[32m        /usr/lib/rabbitmq/bin/rabbitmqctl add_vhost $1[m
[32m+[m[32m        /usr/lib/rabbitmq/bin/rabbitmqctl set_permissions -p $1 qa ".*" ".*" ".*"[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32mfunction add_exchange()[m
[32m+[m[32m{[m[41m   [m
[32m+[m	[32mecho "增加交换机：$2"[m
[32m+[m	[32m/home/qa-deploy-utils/qa_shell_script/rabbitmq/rabbitmqadmin declare exchange --vhost=$1 name=$2 type=$3 -u qa -p qatest[m
[32m+[m[32m}[m
[32m+[m
[32m+[m
[32m+[m[32mfunction add_queues()[m
[32m+[m[32m{[m[41m   [m
[32m+[m	[32mecho "增加队列：$2"[m
[32m+[m	[32m/home/qa-deploy-utils/qa_shell_script/rabbitmq/rabbitmqadmin declare queue --vhost=$1 name=$2 durable=true $3 -u qa -p qatest[m
[32m+[m[32m}[m
[32m+[m
[32m+[m
[32m+[m[32mfunction add_binding()[m
[32m+[m[32m{[m
[32m+[m	[32mecho "增加绑定：从交换机$2 到队列$3"[m
[32m+[m	[32m/home/qa-deploy-utils/qa_shell_script/rabbitmq/rabbitmqadmin --vhost=$1 declare binding source=$2 destination=$3  routing_key=$4 -u qa -p qatest[m
[32m+[m[32m}[m
[32m+[m
[32m+[m[32m#ad vhost[m
[32m+[m[32madd_vhost /[m
[32m+[m[32madd_vhost /black_hole[m
[32m+[m[32madd_vhost /funding[m
[32m+[m[32madd_vhost /loan_order[m
[32m+[m[32madd_vhost /clotho[m
[32m+[m[32madd_vhost baitiao_debt[m
[32m+[m[32madd_vhost financial_system[m
[32m+[m[32madd_vhost feature[m[41m [m
[32m+[m[32madd_vhost mall[m
[32m+[m[32madd_vhost msg_center_op[m
[32m+[m[32madd_vhost appbackend #tower[m[41m [m
[32m+[m[32madd_vhost offline[m
[32m+[m[32madd_vhost orderstatus_vhost[m
[32m+[m[32madd_vhost sms[m
[32m+[m[32madd_vhost spider_center[m
[32m+[m[32madd_vhost xyqb_push[m
[32m+[m[32madd_vhost bt_loan[m
[32m+[m[32madd_vhost baitiao_qrcode[m
[32m+[m[32madd_vhost bt_loan[m
[32m+[m[32madd_vhost /pay_center[m
[32m+[m[32madd_vhost backend[m
[32m+[m[32madd_vhost /trans_order[m
[32m+[m[32madd_vhost /user_register[m
[32m+[m[32madd_vhost notify[m
[32m+[m[32madd_vhost SILKROAD[m
[32m+[m[32madd_vhost bt_data_visualization[m
[32m+[m[32m#add_vhost baitiao_zhitou[m
[32m+[m[32m#add exchange[m
[32m+[m[32madd_exchange /  hello-exchange  direct[m
[32m+[m[32madd_exchange /black_hole        contract        direct[m
[32m+[m[32madd_exchange /black_hole        contractExchange        direct[m
[32m+[m[32madd_exchange /funding   assignment      direct[m
[32m+[m[32madd_exchange /loan_order        loan_order_exchange     fanout[m
[32m+[m[32madd_exchange /loan_order        loan_vest_exchange     fanout[m
[32m+[m[32madd_exchange /loan_order        loan_repay_status     topic[m
[32m+[m[32madd_exchange /loan_order        loan_repay_status     topic[m
[32m+[m[32madd_exchange baitiao_debt       baitiaodebt_orderinfo   direct[m
[32m+[m[32madd_exchange baitiao_debt baitiao_debt direct[m
[32m+[m[32madd_exchange financial_system   fs      direct[m
[32m+[m[32madd_exchange financial_system   btztFund      direct[m
[32m+[m[32madd_exchange mall       digital direct[m
[32m+[m[32madd_exchange mall       refresh_cache fanout[m
[32m+[m[32madd_exchange offline    Spider  direct[m
[32m+[m[32madd_exchange orderstatus_vhost  orderstatus_exchange    direct[m
[32m+[m[32madd_exchange sms        sms-control     direct[m
[32m+[m[32madd_exchange xyqb_push  events  direct[m
[32m+[m[32madd_exchange bt_loan bt_loan_exchange direct[m
[32m+[m[32madd_exchange baitiao_debt baitiaodebt_orderinfo direct[m
[32m+[m[32madd_exchange baitiao_qrcode qrcode fanout[m
[32m+[m[32madd_exchange /pay_center paycenter_exchange direct[m[41m [m
[32m+[m[32madd_exchange backend backend_message_rewrite_exc direct[m
[32m+[m[32madd_exchange backend backend_file_exc direct[m
[32m+[m[32madd_exchange /funding async direct[m
[32m+[m[32madd_exchange spider_center feature_save direct[m
[32m+[m[32madd_exchange feature feature_save direct[m
[32m+[m[32madd_exchange /trans_order trans_order_exchange direct[m
[32m+[m[32madd_exchange /user_register user_register_exchange direct[m
[32m+[m[32madd_exchange notify notify-control direct[m
[32m+[m[32madd_exchange /clotho clotho_exchange direct[m
[32m+[m[32madd_exchange bt_data_visualization  bt_data_visualization_exchange direct[m
[32m+[m[32m#add_exchange baitiao_zhitou btzt_orderStatus_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou btzt_repay_rewrite_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou btzt_sendfund_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou btzt_user_rewrite_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou btzt_hrbcb_repay_notice_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou btzt_hrbcb_user_auth_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou delay_order_approval_query_exchange direct[m
[32m+[m[32m#add_exchange baitiao_zhitou order_approval_query_exchange direct[m
[32m+[m[32m#add_exchange baitiao_zhitou btzt_repay_exchange direct[m
[32m+[m[32m#add_exchange baitiao_zhitou btzt_user_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou delay_btzt_hrbcb_repay_notice_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou delay_btzt_hrbcb_user_auth_exc direct[m
[32m+[m[32m#add_exchange baitiao_zhitou delay_hrbcb_order_exchange direct[m
[32m+[m[32m#add_exchange baitiao_zhitou hrbcb_order_exchange direct[m
[32m+[m
[32m+[m[32m#add queues[m
[32m+[m[32madd_queues /black_hole  contractQueue[m
[32m+[m[32madd_queues /black_hole  generate_success[m
[32m+[m[32madd_queues /black_hole  ssq_waiting_generate[m
[32m+[m[32madd_queues /black_hole  waiting_generate[m
[32m+[m[32madd_queues /black_hole  waiting_oneway[m
[32m+[m[32madd_queues /black_hole baitiao_contract[m[41m [m
[32m+[m[32madd_queues /black_hole generate_auth_success[m
[32m+[m[32madd_queues /black_hole waiting_auth_generate[m
[32m+[m[32madd_queues /black_hole generate_register_success[m
[32m+[m[32madd_queues /black_hole waiting_register_generate[m
[32m+[m[32madd_queues /black_hole quna_active_contract[m
[32m+[m[32madd_queues /funding     approval_suc[m
[32m+[m[32madd_queues /loan_order  loan_order_queue[m
[32m+[m[32madd_queues /loan_order  loan_state_msg_queue[m
[32m+[m[32madd_queues /loan_order  push_urge[m
[32m+[m[32madd_queues /loan_order  repay_status_urge[m
[32m+[m[32madd_queues baitiao_debt qunar_baitiaodebt[m
[32m+[m[32madd_queues baitiao_debt xyqbBaitiaoQueue[m
[32m+[m[32madd_queues financial_system     baitiaoOrder[m
[32m+[m[32madd_queues financial_system     baitiaoRefund[m
[32m+[m[32madd_queues financial_system     loan_info[m
[32m+[m[32madd_queues financial_system     xyqb[m
[32m+[m[32madd_queues financial_system     xyqbInfoForRedpacketQueue[m
[32m+[m[32madd_queues financial_system     xyqbPay[m
[32m+[m[32madd_queues financial_system     xyqbLoanInfo[m
[32m+[m[32madd_queues financial_system	btztFund[m
[32m+[m[32madd_queues mall deliver[m
[32m+[m[32madd_queues mall mallOrder[m
[32m+[m[32madd_queues mall refund[m
[32m+[m[32madd_queues mall refundFeed[m
[32m+[m[32madd_queues msg_center_op notify_task 'arguments={"durable":true, "x-message-ttl":2592000000}'[m
[32m+[m[32madd_queues mall appbackend_refresh 'arguments={"x-message-ttl":120000}'[m
[32m+[m[32madd_queues mall h5_refresh 'arguments={"x-message-ttl":120000}'[m
[32m+[m[32madd_queues mall refundFailedQueue[m
[32m+[m[32madd_queues mall jdOrder 'arguments={"x-message-ttl":120000}'[m
[32m+[m[32madd_queues appbackend sync_req_id 'arguments={"x-message-ttl":120000}'[m
[32m+[m[32madd_queues offline      Test[m
[32m+[m[32madd_queues orderstatus_vhost    orderstatus_queue[m
[32m+[m[32madd_queues sms  appMsg[m
[32m+[m[32madd_queues sms  smsMsg[m
[32m+[m[32madd_queues sms  confirmMsg[m
[32m+[m[32madd_queues sms  thirdMsg[m
[32m+[m[32madd_queues sms  weChatMsg[m
[32m+[m[32madd_queues sms  smsOpMarket[m
[32m+[m[32madd_queues spider_center        SpiderSuccess[m
[32m+[m[32madd_queues spider_center        Test[m
[32m+[m[32madd_queues xyqb_push    TestEvents[m
[32m+[m[32madd_queues xyqb_push    myqueue[m
[32m+[m[32madd_queues mall refund[m
[32m+[m[32madd_queues mall refundFeed[m
[32m+[m[32madd_queues financial_system refundInfo[m
[32m+[m[32madd_queues bt_loan bt_loan_queue[m
[32m+[m[32madd_queues baitiao_debt save_redpacket[m
[32m+[m[32madd_queues bt_loan bt_loan_queue[m
[32m+[m[32madd_queues /black_hole waiting_mult_generate[m
[32m+[m[32madd_queues financial_system xyqb[m
[32m+[m[32madd_queues /pay_center withhold_single_service_fee_queue[m
[32m+[m[32madd_queues /pay_center result_single_service_fee_queue[m
[32m+[m[32madd_queues backend backend_message_rewrite_queue[m
[32m+[m[32madd_queues backend backend_file_queue[m
[32m+[m[32madd_queues /loan_order ka_loan_progress_queue[m
[32m+[m[32madd_queues /loan_order loan_vest_msg_queue[m
[32m+[m[32madd_queues /loan_order loan_vest_queue[m
[32m+[m[32madd_queues /funding generate_contract[m
[32m+[m[32madd_queues baitiao_debt xyqb_baitiao_queue[m
[32m+[m[32madd_queues spider_center feature_calculate[m
[32m+[m[32madd_queues feature feature_calculate[m
[32m+[m[32madd_queues /trans_order trans_order_queue[m
[32m+[m[32madd_queues /user_register user_register_queue[m
[32m+[m[32madd_queues notify notify[m
[32m+[m[32madd_queues /clotho clotho_notify_record[m
[32m+[m[32madd_queues bt_data_visualization bt_data_visualization_queue[m
[32m+[m[32m#add_queues baitiao_zhitou btzt_orderStatus_queue[m
[32m+[m[32m#add_queues baitiao_zhitou btzt_repay_rewrite_queue[m
[32m+[m[32m#add_queues baitiao_zhitou btzt_sendfund_queue[m
[32m+[m[32m#add_queues baitiao_zhitou btzt_user_rewrite_queue[m
[32m+[m[32m#add_queues baitiao_zhitou delay_order_approval_query_queue[m
[32m+[m[32m#add_queues baitiao_zhitou dlx_order_approval_query_queue[m
[32m+[m[32m#add_queues baitiao_zhitou order_approval_query_queue[m
[32m+[m[32m#add_queues baitiao_zhitou btzt_hrbcb_repay_notice_queue[m
[32m+[m[32m#add_queues baitiao_zhitou btzt_hrbcb_user_auth_queue[m
[32m+[m[32m#add_queues baitiao_zhitou btzt_repay_queue[m
[32m+[m[32m#add_queues baitiao_zhitou btzt_user_queue[m
[32m+[m[32m#add_queues baitiao_zhitou delay_btzt_hrbcb_repay_notice_queue[m
[32m+[m[32m#add_queues baitiao_zhitou delay_btzt_hrbcb_user_auth_queue[m
[32m+[m[32m#add_queues baitiao_zhitou delay_hrbcb_order_queue[m
[32m+[m[32m#add_queues baitiao_zhitou hrbcb_order_queue[m
[32m+[m[32madd_queues financial_system xyqbCompensatory[m
[32m+[m[32madd_queues financial_system hengfengInfo[m
[32m+[m
[32m+[m
[32m+[m[32m#add bindings[m
[32m+[m[32madd_binding mall refresh_cache h5_refresh h5_refresh[m
[32m+[m[32madd_binding mall refresh_cache appbackend_refresh appbackend_refresh[m
[32m+[m[32madd_binding mall digital refundFailedQueue refundFailedQueue[m[41m [m
[32m+[m[32madd_binding mall digital jdOrder jdOrder[m
[32m+[m[32madd_binding backend backend_message_rewrite_exc backend_message_rewrite_queue backend_message_rewrite_route[m
[32m+[m[32madd_binding backend backend_file_exc backend_file_queue backend_file_route[m
[32m+[m[32madd_binding /black_hole contract generate_auth_success generate_auth_success[m
[32m+[m[32madd_binding /black_hole contract waiting_auth_generate waiting_auth_generate[m
[32m+[m[32madd_binding /black_hole contract generate_success generate_success[m
[32m+[m[32madd_binding /black_hole contract waiting_generate waiting_generate[m
[32m+[m[32madd_binding /black_hole contract baitiao_contract baitiao_contract[m[41m [m
[32m+[m[32madd_binding /loan_order loan_order_exchange  loan_state_msg_queue loan_state_msg_queue[m
[32m+[m[32madd_binding /trans_order trans_order_exchange trans_order_queue trans-routing-key[m
[32m+[m[32madd_binding /loan_order loan_repay_status repay_status_urge repayment_status[m
[32m+[m[32madd_binding /loan_order loan_repay_status push_urge push_urge[m
[32m+[m[32madd_binding notify notify-control notify notify[m
[32m+[m[32madd_binding bt_data_visualization  bt_data_visualization_exchange  bt_data_visualization_queue  bt_data_visualization_queue[m
[32m+[m[32m#add_binding baitiao_zhitou btzt_repay_rewrite_exc order_approval_query_queue btzt_repay_rewrite_route[m
[32m+[m[32m#add_binding baitiao_zhitou order_approval_query_exchange  order_approval_query_queue order_approval_query_routing[m
[32m+[m[32m#add_binding baitiao_zhitou delay_order_approval_query_exchange delay_order_approval_query_queue delay_order_approval_query_routing[m
[32m+[m[32m#add_binding baitiao_zhitou btzt_user_rewrite_exc btzt_user_rewrite_queue btzt_user_rewrite_route[m
[32m+[m[32m#add_binding baitiao_zhitou btzt_sendfund_exc btzt_sendfund_queue btzt_sendfund_route[m
[32m+[m[32m#add_binding baitiao_zhitou btzt_repay_rewrite_exc btzt_repay_rewrite_queue btzt_repay_rewrite_route[m
[32m+[m[32m#add_binding baitiao_zhitou btzt_hrbcb_repay_notice_exc btzt_hrbcb_repay_notice_queue btzt_hrbcb_repay_notice_route[m
[32m+[m[32m#add_binding baitiao_zhitou btzt_hrbcb_user_auth_exc btzt_hrbcb_user_auth_queue btzt_hrbcb_user_auth_route[m
[32m+[m[32m#add_binding baitiao_zhitou btzt_repay_exchange btzt_repay_queue btzt_repay_route[m
[32m+[m[32m#add_binding baitiao_zhitou btzt_user_exc btzt_user_queue btzt_user_route[m
[32m+[m[32m#add_binding baitiao_zhitou delay_btzt_hrbcb_repay_notice_exc delay_btzt_hrbcb_repay_notice_queue delay_btzt_hrbcb_repay_notice_route[m
[32m+[m[32m#add_binding baitiao_zhitou delay_btzt_hrbcb_user_auth_exc delay_btzt_hrbcb_user_auth_queue delay_btzt_hrbcb_user_auth_route[m
[32m+[m[32m#add_binding baitiao_zhitou delay_hrbcb_order_exchange delay_hrbcb_order_queue delay_hrbcb_order_routing[m
[32m+[m[32m#add_binding baitiao_zhitou hrbcb_order_exchange hrbcb_order_queue hrbcb_order_routing[m

[33mcommit c6062f81aed0528e683af5ef7b627967b3a4c26a[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Fri Dec 8 17:24:44 2017 +0800

    fix

[1mdiff --git a/db-utils/db_gen_config.sh b/db-utils/db_gen_config.sh[m
[1mindex e1af128..6722070 100755[m
[1m--- a/db-utils/db_gen_config.sh[m
[1m+++ b/db-utils/db_gen_config.sh[m
[36m@@ -53,7 +53,7 @@[m [melif [[ $database_name = 'xyqb_app' ]]; then[m
 	port='3307'[m
 elif [[ $database_name = 'payment_center' ]]; then[m
 	# 支付中心[m
[31m-	sys_table_list='card_switcher merchant merchant_config pay_approach_config merchant_pay_approach_relation merchant_bank_config'[m
[32m+[m	[32msys_table_list='card_switcher merchant merchant_config pay_approach_config merchant_pay_approach_relation merchant_bank_config quota'[m
 	port='3308'[m
 elif [[  $database_name = 'risk_control'  ]]; then[m
 	# 谛听database[m

[33mcommit 79e9b1157c7795317c2e7f6a3c55d01f694484fb[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Fri Dec 8 13:11:36 2017 +0800

    up

[1mdiff --git a/db-utils/db_schema_sync.sh b/db-utils/db_schema_sync.sh[m
[1mindex 75eef28..a7e5cd3 100755[m
[1m--- a/db-utils/db_schema_sync.sh[m
[1m+++ b/db-utils/db_schema_sync.sh[m
[36m@@ -82,14 +82,13 @@[m [mfunction db_schema_sync()[m
 		echo "--- Step 2: replace domain name in tables: $database $db_backup_sub_folders ---"[m
 		echo "--- Step 2: is re_replace_ip: $re_replace_ip ---"[m
 		sh $work_dir/db_replace_ip.sh $database $target_db_host $db_backup_sub_folders $re_replace_ip $ip_value[m
[31m-[m
[31m-		echo "--- Step 3: import basic data from backup file: $database $db_backup_sub_folders ---"[m
[31m-		sh $work_dir/db_import.sh $database $target_db_host $db_backup_sub_folders $delete_business_data[m
 	else[m
 		echo "--- Skip step 2: replace domain name in tables: $database $db_backup_sub_folders ---"[m
[31m-		echo "--- Skip step 3: import basic data from backup file: $database $db_backup_sub_folders ---"[m
 	fi[m
 	[m
[32m+[m	[32mecho "--- Step 3: import basic data from backup file: $database $db_backup_sub_folders ---"[m
[32m+[m	[32msh $work_dir/db_import.sh $database $target_db_host $db_backup_sub_folders $delete_business_data[m
[32m+[m[41m	[m
 	echo "--- Step 4: sync schema: $database $target_db_host ---"[m
 	sync_cmd="mss -conf ${config_file_name} -sync"[m
 	echo "${sync_cmd}"[m

[33mcommit 3042b542fab8dec5fb1d328887cfbbe0644e9572[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Fri Dec 8 10:38:08 2017 +0800

    up

[1mdiff --git a/db-utils/db_gen_config.sh b/db-utils/db_gen_config.sh[m
[1mindex 5e39575..e1af128 100755[m
[1m--- a/db-utils/db_gen_config.sh[m
[1m+++ b/db-utils/db_gen_config.sh[m
[36m@@ -29,7 +29,7 @@[m [msys_table_list=""[m
 [m
 sync_config_folder=~/db_sync_configs[m
 base_config_file=$work_dir/config/base_config.json[m
[31m-cache_dir=/root/daily_db_backup[m
[32m+[m[32mcache_dir=/home/daily_db_backup[m
 [m
 # if [ $# -ne 9 ]; then[m
 # 	echo "db_gen_config.sh"[m

[33mcommit 6eda3161ee5359e173f68ddb0ab2ed40a8f2d895[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Fri Dec 8 10:36:07 2017 +0800

    up

[1mdiff --git a/db-utils/daily_db_backup.sh b/db-utils/daily_db_backup.sh[m
[1mindex bb5666b..7f797cf 100644[m
[1m--- a/db-utils/daily_db_backup.sh[m
[1m+++ b/db-utils/daily_db_backup.sh[m
[36m@@ -1,8 +1,8 @@[m
 #!/bin/bash[m
 set -u[m
 work_dir=/home/qa-deploy-utils/db-utils[m
[31m-sync_config_folder=~/db_sync_configs[m
[31m-db_backup_folder=~/daily_db_backup[m
[32m+[m[32msync_config_folder=/home/db_sync_configs[m
[32m+[m[32mdb_backup_folder=/home/daily_db_backup[m
 [m
 source_db_host=$1[m
 source_db_user=$2[m

[33mcommit b3537d71112ca32150b830f2e695eddb2ad58ad7[m
Author: qa_quantgroup <13766752@qq.com>
Date:   Fri Dec 8 10:30:53 2017 +0800

    update

[1mdiff --git a/db-utils/config/base_config.json b/db-utils/config/base_config.json[m
[1mnew file mode 100644[m
[1mindex 0000000..67c9dc4[m
[1m--- /dev/null[m
[1m+++ b/db-utils/config/base_config.json[m
[36m@@ -0,0 +1,9 @@[m
[32m+[m[32m{[m
[32m+[m[32m      "source":"source_db_user:Uiwb@o^fR&nHOa5t@(source_db_host:source_port)/sync_db_name",[m
[32m+[m[32m      "dest":"target_db_user:target_db_pwd@(target_db_host:3306)/sync_db_name",[m
[32m+[m[32m      "alter_ignore":{},[m
[32m+[m[32m      "tables":[],[m
[32m+[m[32m      "email":{[m
[32m+[m[32m         "send_mail":false[m
[32m+[m[32m      }[m
[32m+[m[32m}[m

[33mcommit af4e6b03c2aa8ce3c3fa5b13d691b6e999e5a6da[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Fri Dec 8 10:29:32 2017 +0800

    up

[1mdiff --git a/db-utils/db_gen_config.sh b/db-utils/db_gen_config.sh[m
[1mindex bb623b4..5e39575 100755[m
[1m--- a/db-utils/db_gen_config.sh[m
[1m+++ b/db-utils/db_gen_config.sh[m
[36m@@ -8,9 +8,10 @@[m
 # -------------------------------------------------------------------------------[m
 source ~/.bash_profile[m
 [m
[32m+[m[32mwork_dir=/home/qa-deploy-utils/db-utils[m
 source_db_host=$1[m
 source_db_user=$2[m
[31m-source_db_pwd='Uiwb@o^fR&nHOa5t'[m
[32m+[m[32msource_db_pwd=`grep source_db_pwd $work_dir/config/db_config | cut -d "=" -f 2`[m
 [m
 target_db_host=$4[m
 target_db_user=$5[m
[36m@@ -27,7 +28,7 @@[m [mport=""[m
 sys_table_list=""[m
 [m
 sync_config_folder=~/db_sync_configs[m
[31m-base_config_file=$sync_config_folder/base_config.json[m
[32m+[m[32mbase_config_file=$work_dir/config/base_config.json[m
 cache_dir=/root/daily_db_backup[m
 [m
 # if [ $# -ne 9 ]; then[m

[33mcommit e4c95ecdfb7e6bf95e7a34272d724c0092467116[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Thu Dec 7 18:50:06 2017 +0800

    update

[1mdiff --git a/db-utils/db_schema_sync.sh b/db-utils/db_schema_sync.sh[m
[1mindex 1ce89b7..75eef28 100755[m
[1m--- a/db-utils/db_schema_sync.sh[m
[1m+++ b/db-utils/db_schema_sync.sh[m
[36m@@ -25,8 +25,8 @@[m [mif [ $# -ne 10 ]; then[m
 fi[m
 [m
 work_dir=/home/qa-deploy-utils/db-utils[m
[31m-sync_config_folder=~/db_sync_configs[m
[31m-db_backup_folder=~/db_backups[m
[32m+[m[32msync_config_folder=/home/db_sync_configs[m
[32m+[m[32mdb_backup_folder=/home/db_backups[m
 [m
 source_db_host=$1[m
 source_db_user=$2[m

[33mcommit 322372691bf3c2eea5faed28200978e491ec0267[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Thu Dec 7 18:23:08 2017 +0800

    update

[1mdiff --git a/qa_shell_script/jenkins/post_build_script_sync_db.sh b/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[1mindex 2713971..704f01a 100755[m
[1m--- a/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[1m+++ b/qa_shell_script/jenkins/post_build_script_sync_db.sh[m
[36m@@ -2,27 +2,49 @@[m
 echo "cd $JENKINS_HOME/jobs/$JOB_BASE_NAME/builds/${BUILD_NUMBER}"[m
 cd $JENKINS_HOME/jobs/$JOB_BASE_NAME/builds/${BUILD_NUMBER}[m
 echo ---[m
[31m-grep -B 1 "Got error: [0-9]\{4\}:" log[m
[31m-if [ $? = 0 ];then[m
[31m-	echo ---[m
[31m-	exit -1[m
[31m-fi[m
 [m
[31m-grep -B 1 "ERROR [0-9]\{4\} " log[m
[31m-if [ $? = 0 ];then[m
[31m-	echo ---[m
[31m-	exit -1[m
[31m-fi[m
[32m+[m[32mfunction grep_key_word()[m
[32m+[m[32m{[m
[32m+[m	[32mgrep -B $2 "$1" log[m
[32m+[m	[32mif [ $? = 0 ];then[m
[32m+[m		[32mecho ---[m
[32m+[m		[32mexit -1[m
[32m+[m	[32mfi[m
[32m+[m[32m}[m
 [m
[31m-grep -B 3 "show tables failed" log[m
[31m-if [ $? = 0 ];then[m
[31m-	echo ---[m
[31m-	exit -1[m
[31m-fi[m
[32m+[m[32mgrep_key_word "No space left on device" 1[m
[32m+[m[32mgrep_key_word "Got error: [0-9]\{4\}:" 1[m
[32m+[m[32mgrep_key_word "ERROR [0-9]\{4\} " 1[m
[32m+[m[32mgrep_key_word "show tables failed" 3[m
[32m+[m[32mgrep_key_word "EXEC_SQL_FAIELD Error [0-9]\{4\}" 1[m
 [m
[31m-grep -B 1 "EXEC_SQL_FAIELD Error 1813" log[m
[31m-if [ $? = 0 ];then[m
[31m-	echo ---[m
[31m-	exit -1[m
[31m-fi[m
[32m+[m[32m# grep -B 1 "No space left on device" log[m
[32m+[m[32m# if [ $? = 0 ];then[m
[32m+[m[32m# 	echo ---[m
[32m+[m[32m# 	exit -1[m
[32m+[m[32m# fi[m
[32m+[m
[32m+[m[32m# grep -B 1 "Got error: [0-9]\{4\}:" log[m
[32m+[m[32m# if [ $? = 0 ];then[m
[32m+[m[32m# 	echo ---[m
[32m+[m[32m# 	exit -1[m
[32m+[m[32m# fi[m
[32m+[m
[32m+[m[32m# grep -B 1 "ERROR [0-9]\{4\} " log[m
[32m+[m[32m# if [ $? = 0 ];then[m
[32m+[m[32m# 	echo ---[m
[32m+[m[32m# 	exit -1[m
[32m+[m[32m# fi[m
[32m+[m
[32m+[m[32m# grep -B 3 "show tables failed" log[m
[32m+[m[32m# if [ $? = 0 ];then[m
[32m+[m[32m# 	echo ---[m
[32m+[m[32m# 	exit -1[m
[32m+[m[32m# fi[m
[32m+[m
[32m+[m[32m# grep -B 1 "EXEC_SQL_FAIELD Error 1813" log[m
[32m+[m[32m# if [ $? = 0 ];then[m
[32m+[m[32m# 	echo ---[m
[32m+[m[32m# 	exit -1[m
[32m+[m[32m# fi[m
 echo "post_build_script_sync_db finish~"[m

[33mcommit 0304212d11447aebb011007f23359a6dbb2e801a[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 11:55:17 2017 +0800

    fix

[1mdiff --git a/qa_shell_script/ngrok/make_frp_ini.sh b/qa_shell_script/ngrok/make_frp_ini.sh[m
[1mindex 101a76a..07c0a7d 100755[m
[1m--- a/qa_shell_script/ngrok/make_frp_ini.sh[m
[1m+++ b/qa_shell_script/ngrok/make_frp_ini.sh[m
[36m@@ -163,7 +163,7 @@[m [mdo[m
 		[m
 		[m
 		addFrpcSub ${var[0]} http $ipfirst $iplast ${var[1]} ${var[0]}-${ip_last} $filename[m
[31m-		createNginxSSLConf ${var[0]}-${ip_last} $ipfirst.$ip_last ${var[1]} $nginxname/${var[0]}-${ip_last}.conf[m
[32m+[m		[32mcreateNginxSSLConf ${var[0]}-${ip_last} $ipfirst.$iplast ${var[1]} $nginxname/${var[0]}-${ip_last}.conf[m
 	done[m
 done [m
 [m

[33mcommit 818ef1b9aeddbb90b61c9615ab4024fa6068f1c2[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 11:54:26 2017 +0800

    fix

[1mdiff --git a/qa_shell_script/ngrok/make_frp_ini.sh b/qa_shell_script/ngrok/make_frp_ini.sh[m
[1mindex 8e704b5..101a76a 100755[m
[1m--- a/qa_shell_script/ngrok/make_frp_ini.sh[m
[1m+++ b/qa_shell_script/ngrok/make_frp_ini.sh[m
[36m@@ -5,7 +5,7 @@[m [mconfig_server="$pwd_path/config_server"[m
 frp_file_path="/home/quant_group/frp_0.12.0_linux_amd64"[m
 filename="$frp_file_path/frpc_custom_new_1.ini"[m
 nginxname="/usr/local/openresty/nginx/conf/conf.d"[m
[31m-[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
  [m
 dockernamespace=`cat $pwd_path/ngrok/docker_env_name.sh` [m
 ips=`cat $config_server/get_env_ip.sh`[m
[36m@@ -152,12 +152,18 @@[m [mcreateNginxSSLConf store 192.168.4.27 9000 $nginxname/store.conf[m
 [m
 for ip_last in ${ips[@]}[m
 do[m
[32m+[m	[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last`[m
[32m+[m	[32mip_arr=(${IP_host//./ })[m
[32m+[m	[32mipfirst="${ip_arr[0]}.${ip_arr[1]}.${ip_arr[2]}"[m
[32m+[m	[32miplast="${ip_arr[3]}"[m
 	projectAndPorts=`node $config_server/get_project_config.js  -type multi -attr port -attr2 true`[m
 	for projectAndPort in ${projectAndPorts[@]}[m
 	do[m
 		var=(${projectAndPort//|/ })[m
[31m-		addFrpcSub ${var[0]} http 192.168.4 $ip_last ${var[1]} ${var[0]}-${ip_last} $filename[m
[31m-		createNginxSSLConf ${var[0]}-${ip_last} 192.168.4.$ip_last ${var[1]} $nginxname/${var[0]}-${ip_last}.conf[m
[32m+[m[41m		[m
[32m+[m[41m		[m
[32m+[m		[32maddFrpcSub ${var[0]} http $ipfirst $iplast ${var[1]} ${var[0]}-${ip_last} $filename[m
[32m+[m		[32mcreateNginxSSLConf ${var[0]}-${ip_last} $ipfirst.$ip_last ${var[1]} $nginxname/${var[0]}-${ip_last}.conf[m
 	done[m
 done [m
 [m

[33mcommit 6af25ca2394229696cbe376a88ba2ebbff2f2ba8[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 11:48:50 2017 +0800

    changeh5 - 16

[1mdiff --git a/qa_shell_script/ngrok/make_frp_ini.sh b/qa_shell_script/ngrok/make_frp_ini.sh[m
[1mindex cf7d513..8e704b5 100755[m
[1m--- a/qa_shell_script/ngrok/make_frp_ini.sh[m
[1m+++ b/qa_shell_script/ngrok/make_frp_ini.sh[m
[36m@@ -61,7 +61,7 @@[m [maddFrpcLoc local_ http 8000 q-gp.com / $filename[m
 [m
 [m
 addFrpcSub store http 127.0.0 1 8001 store  $filename[m
[31m-addFrpcSub h5 http 192.168.4 25 7051 h5 $filename[m
[32m+[m[32maddFrpcSub h5 http 192.168.4 16 7051 h5 $filename[m
 addFrpcSub mock http 192.168.4 27 80 mock $filename[m
 addFrpcSub atm http 192.168.4 18 3000 atm $filename[m
 addFrpcSub auth-center http 192.168.4 193 8099 auth-center-38 $filename[m

[33mcommit 15a0e770867122d43e90e398e3891319f2c9d9a7[m
Merge: 6475e9e dcd3d09
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 11:47:05 2017 +0800

    Merge branch 'master' of http://git.quantgroup.cn/QA/qa-deploy-utils

[33mcommit 6475e9e87bbae41bb8fb4bdd27865f1806995504[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 11:46:59 2017 +0800

    change

[1mdiff --git a/qa_shell_script/config_server/get_env_ip.sh b/qa_shell_script/config_server/get_env_ip.sh[m
[1mindex 0c5add1..8e137f2 100755[m
[1m--- a/qa_shell_script/config_server/get_env_ip.sh[m
[1m+++ b/qa_shell_script/config_server/get_env_ip.sh[m
[36m@@ -1 +1 @@[m
[31m-12 13 14 15 16 17 22 23 24 25 26 28 46 50 59 60 72 74 75 76 88 119 151 152 153 154 155 156 158 160 161 162 164 172.30.199.2 [m
[32m+[m[32m12 13 14 15 16 17 22 23 24 25 26 28 46 50 59 60 72 74 75 76 88 119 151 152 153 154 155 156 158 160 161 162 164 172.30.199.2[m[41m [m
\ No newline at end of file[m

[33mcommit 2ce2e2311afb4013a288ec4364cb4bab0a3e2d1d[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 11:45:27 2017 +0800

    add new ip

[1mdiff --git a/qa_shell_script/config_server/get_env_ip.sh b/qa_shell_script/config_server/get_env_ip.sh[m
[1mindex f4a50e7..0c5add1 100755[m
[1m--- a/qa_shell_script/config_server/get_env_ip.sh[m
[1m+++ b/qa_shell_script/config_server/get_env_ip.sh[m
[36m@@ -1 +1 @@[m
[31m-12 13 14 15 16 17 22 23 24 25 26 28 46 50 59 60 72 74 75 76 88 119 151 152 153 154 155 156 158 160 161 162 164[m
[32m+[m[32m12 13 14 15 16 17 22 23 24 25 26 28 46 50 59 60 72 74 75 76 88 119 151 152 153 154 155 156 158 160 161 162 164 172.30.199.2[m[41m [m

[33mcommit dcd3d09a7719f28bdb645dcb78716948bb7eca57[m
Author: 智勇 <yong.zhi@quantgroup.cn>
Date:   Thu Dec 7 11:45:08 2017 +0800

    update

[1mdiff --git a/db-utils/db_gen_config.sh b/db-utils/db_gen_config.sh[m
[1mindex 583a8f5..bb623b4 100755[m
[1m--- a/db-utils/db_gen_config.sh[m
[1m+++ b/db-utils/db_gen_config.sh[m
[36m@@ -128,8 +128,8 @@[m [melif [[ $database_name = 'merchant' ]]; then[m
 elif [[ $database_name = 'xyqb_btzt' ]]; then[m
 	# 白条直投[m
 	sys_table_list='zt_channel zt_fund zt_fund_channel zt_fund_credit zt_fund_term'[m
[31m-	source_db_host='192.168.4.116'[m
[31m-	port='7001'[m
[32m+[m	[32msource_db_host='192.168.4.39'[m
[32m+[m	[32mport='9002'[m
 elif [[ $database_name = 'user_credit' ]]; then[m
 	# user_credit[m
 	sys_table_list=''[m

[33mcommit 4767f281339e648c6347670ecff47f40455551a5[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 11:41:02 2017 +0800

    修改执行IP获取方式

[1mdiff --git a/qa_shell_script/initial_env/remote_initial_env.sh b/qa_shell_script/initial_env/remote_initial_env.sh[m
[1mindex b37f17c..fba0e71 100755[m
[1m--- a/qa_shell_script/initial_env/remote_initial_env.sh[m
[1m+++ b/qa_shell_script/initial_env/remote_initial_env.sh[m
[36m@@ -3,9 +3,12 @@[m [mip_last=$1[m
 project_type=$2[m
 public_ip=$3[m
 set timeout 1200[m
[31m-ip=192.168.4.$ip_last[m
[32m+[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
[32m+[m[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last`[m
[32m+[m
 echo "参数为：[m
[31m-ip : ${ip}[m
[32m+[m[32mip : ${IP_host}[m
 project_type : ${project_type}[m
 public_ip : ${public_ip}[m
 "[m
[36m@@ -14,7 +17,7 @@[m [msh /home/qa-deploy-utils/qa_shell_script/1_mount_config_files.sh $ip_last[m
 [m
 expect -c "[m
 	 set timeout 10[m
[31m-   spawn ssh root@${ip}[m
[32m+[m[32m   spawn ssh root@${IP_host}[m
 	 expect \"]#\"[m
 	 send \"cd /usr/lib/rabbitmq/bin\r\"[m
 	 expect \"]#\"[m
[1mdiff --git a/qa_shell_script/migrate_ENV/remote.sh b/qa_shell_script/migrate_ENV/remote.sh[m
[1mold mode 100644[m
[1mnew mode 100755[m
[1mindex d92bd63..5d8bd03[m
[1m--- a/qa_shell_script/migrate_ENV/remote.sh[m
[1m+++ b/qa_shell_script/migrate_ENV/remote.sh[m
[36m@@ -1,5 +1,5 @@[m
 #!/bin/bash[m
[31m-IP_host_first="192.168.4."[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
 pwd_path="/home/qa-deploy-utils/qa_shell_script"[m
 config_server="$pwd_path/config_server"[m
 project_path=`cat $config_server/get_env_ip.sh`[m
[36m@@ -9,13 +9,14 @@[m [mproject_path=`cat $config_server/get_env_ip.sh`[m
 [m
 for ip_last_num in $project_path[m
     do[m
[32m+[m			[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
 	if [[ "$ip_last_num" == "50" ]]; then[m
 		echo " not in 50 "[m
 	else[m
[31m-		echo "------------------IP-${IP_host_first}${ip_last_num}------------------"[m
[32m+[m		[32mecho "------------------IP-${IP_host}------------------"[m
         	expect -c "[m
                 	set timeout 10[m
[31m-                	spawn ssh root@${IP_host_first}${ip_last_num}[m
[32m+[m[41m                [m	[32mspawn ssh root@${IP_host}[m
                 	expect \"]#\"[m
                 	send \"sh /home/qa-deploy-utils/qa_shell_script/$1\r\"[m
                 	set timeout -1[m
[1mdiff --git a/qa_shell_script/remote_excute.sh b/qa_shell_script/remote_excute.sh[m
[1mindex bfa6073..22ed9c0 100755[m
[1m--- a/qa_shell_script/remote_excute.sh[m
[1m+++ b/qa_shell_script/remote_excute.sh[m
[36m@@ -4,11 +4,12 @@[m [mproject_name=$2[m
 branch_name=$3[m
 project_type=$4[m
 public_ip=$5[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
 set timeout 1200[m
[31m-ip=192.168.4.$ip_last[m
[32m+[m[32mip_host=`sh $pwd_path_0/get-ip.sh $ip_last`[m
 echo "参数为：[m
 #init_shell_script: ${init_shell_script}[m
[31m-ip : ${ip}[m
[32m+[m[32mip : ${ip_host}[m
 project_name : ${project_name}[m
 branch_name : ${branch_name}[m
 project_type : ${project_type}[m
[36m@@ -18,11 +19,11 @@[m [mpublic_ip : ${public_ip}[m
 if [ -n "$project_name"  ] && [  -n "$branch_name" ]; then[m
 	expect -c "[m
 		 set timeout 10[m
[31m-	   spawn ssh root@${ip}[m
[32m+[m	[32m   spawn ssh root@${ip_host}[m
 		 expect \"]#\"[m
 		 send \"cd /home/qa-deploy-utils/qa_shell_script\r\"[m
 		 expect \"]#\"[m
[31m-		 send \"sh deploy_project_by_name.sh $project_name $branch_name $public_ip $ip\r\"[m
[32m+[m		[32m send \"sh deploy_project_by_name.sh $project_name $branch_name $public_ip ${ip_host}\r\"[m
 		 set timeout -1[m
 	   expect \"]#\"[m
 	   send \"exit\r\"[m
[36m@@ -30,11 +31,11 @@[m [mif [ -n "$project_name"  ] && [  -n "$branch_name" ]; then[m
 else[m
 	expect -c "[m
 		 set timeout 10[m
[31m-	   spawn ssh root@${ip}[m
[32m+[m	[32m   spawn ssh root@${ip_host}[m
 		 expect \"]#\"[m
 		 send \"cd /home/qa-deploy-utils/qa_shell_script\r\"[m
 	   expect \"]#\"[m
[31m-		 send \"sh deploy_project_by_type.sh $project_type $branch_name $public_ip $ip\r\"[m
[32m+[m		[32m send \"sh deploy_project_by_type.sh $project_type $branch_name $public_ip ${ip_host}\r\"[m
 	     set timeout -1[m
 	   expect \"]#\"[m
 	   send \"exit\r\"[m
[1mdiff --git a/qa_shell_script/remote_excute_rabbitmq.sh b/qa_shell_script/remote_excute_rabbitmq.sh[m
[1mindex 9452092..4953552 100755[m
[1m--- a/qa_shell_script/remote_excute_rabbitmq.sh[m
[1m+++ b/qa_shell_script/remote_excute_rabbitmq.sh[m
[36m@@ -1,5 +1,5 @@[m
 #!/bin/bash[m
[31m-IP_host_first="192.168.4."[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
 pwd_path="/home/qa-deploy-utils/qa_shell_script"[m
 config_server="$pwd_path/config_server"[m
 project_path=`cat $config_server/get_env_ip.sh`[m
[36m@@ -8,14 +8,15 @@[m [mproject_path=`cat $config_server/get_env_ip.sh`[m
 [m
 [m
 for ip_last_num in $project_path[m
[31m-    do[m
[31m-        expect -c "[m
[31m-	        set timeout 10[m
[31m-	        spawn ssh root@${IP_host_first}${ip_last_num}[m
[31m-	        expect \"]#\"[m
[31m-	        send \"sh /home/qa-deploy-utils/qa_shell_script/rabbitmq/initial_mq.sh\r\"[m
[31m-	        set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"exit\r\"[m
[31m-	     expect eof;"[m
[31m-    done[m
[32m+[m	[32mdo[m
[32m+[m			[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[32m+[m			[32mexpect -c "[m
[32m+[m			[32mset timeout 10[m
[32m+[m			[32mspawn ssh root@${IP_host}[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"sh /home/qa-deploy-utils/qa_shell_script/rabbitmq/initial_mq.sh\r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"exit\r\"[m
[32m+[m			[32mexpect eof;"[m
[32m+[m	[32mdone[m
[1mdiff --git a/qa_shell_script/remote_excute_start.sh b/qa_shell_script/remote_excute_start.sh[m
[1mindex d9ae4d3..61c07bc 100755[m
[1m--- a/qa_shell_script/remote_excute_start.sh[m
[1m+++ b/qa_shell_script/remote_excute_start.sh[m
[36m@@ -1,17 +1,18 @@[m
 #!/bin/bash[m
 #project_path=`cat $config_server/get_env_ip.sh`[m
[31m-IP_host_first="192.168.4."[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
 project_name=$1[m
 target_ip=$2[m
 for ip_last_num in $target_ip[m
[31m-    do[m
[31m-        expect -c "[m
[31m-	        set timeout 10[m
[31m-	        spawn ssh root@${IP_host_first}${target_ip}[m
[31m-	        expect \"]#\"[m
[31m-	        send \"sh /home/qa-deploy-utils/qa_shell_script/6_start_by_name.sh $project_name\r\"[m
[31m-	        set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"exit\r\"[m
[31m-	     expect eof;"[m
[31m-    done[m
[32m+[m	[32mdo[m
[32m+[m			[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[32m+[m			[32mexpect -c "[m
[32m+[m			[32mset timeout 10[m
[32m+[m			[32mspawn ssh root@${IP_host}[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"sh /home/qa-deploy-utils/qa_shell_script/6_start_by_name.sh $project_name\r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"exit\r\"[m
[32m+[m			[32mexpect eof;"[m
[32m+[m	[32mdone[m
[1mdiff --git a/qa_shell_script/sub_shell.sh b/qa_shell_script/sub_shell.sh[m
[1mindex 8cb1ad2..ae32a58 100755[m
[1m--- a/qa_shell_script/sub_shell.sh[m
[1m+++ b/qa_shell_script/sub_shell.sh[m
[36m@@ -2,10 +2,10 @@[m
 [m
 scriptname=$(basename $0)[m
 lock="/var/run/${scriptname}"[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
 [m
 exec 200>$lock[m
[31m-#flock -n 200 || {echo "sub.sh 正在被其他人执行，请稍后再试" && exit 1}[m
[31m-#flock -n 200 || exit 1[m
[32m+[m
 flock -n 200[m
 if [ $? -ne 0 ];then[m
 	_p=`ps aux  | grep $scriptname | grep -v grep | head -n 1 |awk '{print $2}'`[m
[36m@@ -17,8 +17,7 @@[m [mfi[m
 pid=$$[m
 echo $pid 1>&200[m
 [m
[31m-IP_host_first="192.168.4."[m
[31m-public_ip="q-gp.com"    #"139.198.2.95"[m
[32m+[m[32mpublic_ip="q-gp.com"[m
 pwd_path="/home/qa-deploy-utils/qa_shell_script"[m
 config_server="$pwd_path/config_server"[m
 ips=`cat $config_server/get_env_ip.sh`[m
[36m@@ -40,17 +39,18 @@[m [mdone[m
 [m
 echo "共要生成$counts个环境的配置文件"[m
 echo "并发生成3个环境的配置文件，预计执行时间一分钟左右，负载最大时为3~"[m
[31m-#for ip_last_num in '15'[m
[32m+[m
[32m+[m
 for ip_last_num in ${ips[@]} [m
 do[m
[32m+[m	[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
 	read -u1000[m
 	{[m
[31m-		echo "`date +%T.%N` 开始生成 ${IP_host_first}${ip_last_num}"[m
[32m+[m		[32mecho "`date +%T.%N` 开始生成 ${IP_host}"[m
 		cd /home/sub_config_file_dont_rm[m
 		#不能直接RM 整个文件，会造成mount失效[m
[31m-		#rm -rf ${IP_host_first}${ip_last_num}[m
[31m-		mkdir -p ${IP_host_first}${ip_last_num}[m
[31m-		cd ${IP_host_first}${ip_last_num}[m
[32m+[m		[32mmkdir -p ${IP_host}[m
[32m+[m		[32mcd ${IP_host}[m
 		rm -rf java[m
 		rm -rf node[m
 		rm -rf ui[m
[36m@@ -67,21 +67,19 @@[m [mdo[m
 		mkdir -p $dir/public/java[m
 		cp -rf /home/config_files/java/* $dir/java/[m
 		cp -rf /home/config_files/java/* $dir/public/java/[m
[31m-		sed -i "s/target_host_name/${IP_host_first}${ip_last_num}/" $dir/java/*[m
[31m-		sed -i "s/target_host_name/${IP_host_first}${ip_last_num}/" $dir/public/java/*[m
[31m-		sed -i "s/target_mq_host_name/${IP_host_first}${ip_last_num}/" $dir/java/*[m
[31m-		sed -i "s/target_mq_host_name/${IP_host_first}${ip_last_num}/" $dir/public/java/*[m
[32m+[m		[32msed -i "s/target_host_name/${IP_host}/" $dir/java/*[m
[32m+[m		[32msed -i "s/target_host_name/${IP_host}/" $dir/public/java/*[m
[32m+[m		[32msed -i "s/target_mq_host_name/${IP_host}/" $dir/java/*[m
[32m+[m		[32msed -i "s/target_mq_host_name/${IP_host}/" $dir/public/java/*[m
 		#gu-bei的回调接口都改成外网接口[m
[31m-		#sed -i "s/callback=http:\/\/${IP_host_first}${ip_last_num}:7006/callback=http:\/\/${public_ip}:${ip_last_num}06/g" $dir/java/gu-bei.properties[m
[31m-		#sed -i "s/pay_notify_url=http:\/\/${IP_host_first}${ip_last_num}:7006/pay_notify_url=http:\/\/${public_ip}:${ip_last_num}06/g" $dir/java/gu-bei.properties[m
[31m-[m
[32m+[m[41m		[m
 		sed -i "s/ip_last/$ip_last_num/g" $dir/java/*[m
 		sed -i "s/ip_last/$ip_last_num/g" $dir/public/java/*[m
 		[m
 		#python项目发布[m
 		mkdir -p $dir/python[m
 		cp -rf /home/config_files/python/* $dir/python/[m
[31m-		sed -i "s/target_host_name/${IP_host_first}${ip_last_num}/" $dir/python/*[m
[32m+[m		[32msed -i "s/target_host_name/${IP_host}/" $dir/python/*[m
 		sed -i "s/ip_last/$ip_last_num/g" $dir/python/*[m
 [m
 		#node项目发布[m
[36m@@ -89,8 +87,8 @@[m [mdo[m
 		mkdir -p $dir/public/node[m
 		cp -rf /home/config_files/node/* $dir/node/[m
 		cp -rf /home/config_files/node/* $dir/public/node/[m
[31m-		sed -i "s/target_host_name/${IP_host_first}${ip_last_num}/" $dir/node/*[m
[31m-		sed -i "s/target_host_name/${IP_host_first}${ip_last_num}/g" $dir/public/node/*[m
[32m+[m		[32msed -i "s/target_host_name/${IP_host}/" $dir/node/*[m
[32m+[m		[32msed -i "s/target_host_name/${IP_host}/g" $dir/public/node/*[m
 		sed -i "s/ip_last/$ip_last_num/g" $dir/node/*[m
 		sed -i "s/ip_last/$ip_last_num/g" $dir/public/node/*[m
 [m
[36m@@ -99,12 +97,9 @@[m [mdo[m
 		mkdir -p $dir/public/ui[m
 		cp -rf /home/config_files/ui/* $dir/ui/[m
 		cp -rf /home/config_files/ui/* $dir/public/ui/[m
[31m-		sed -i "s/target_host_name/${IP_host_first}${ip_last_num}/g" $dir/ui/*[m
[31m-		sed -i "s/target_host_name/${IP_host_first}${ip_last_num}/g" $dir/public/ui/*[m
[31m-		#if [ $ip_last_num -lt 100 ]; then[m
[31m-		#	sed -i "s/target_host_name:7/${public_ip}:${ip_last_num}/g" $dir/public/ui/*[m
[31m-		#else[m
[31m-		#fi[m
[32m+[m		[32msed -i "s/target_host_name/${IP_host}/g" $dir/ui/*[m
[32m+[m		[32msed -i "s/target_host_name/${IP_host}/g" $dir/public/ui/*[m
[32m+[m[41m		[m
 		sed -i "s/ip_last/$ip_last_num/g" $dir/public/ui/*[m
 		sed -i "s/ip_last/$ip_last_num/g" $dir/ui/*[m
 		[m
[36m@@ -114,23 +109,18 @@[m [mdo[m
 		{[m
 			pro=`echo $multi | awk -F '|' '{print $1}'`[m
 			port=`echo $multi | awk -F '|' '{print $2}'`[m
[31m-			#find $dir/public/ -type f  -print | xargs -i sed -i "s/${IP_host_first}${ip_last_num}:$port/${pro}-${ip_last_num}.${public_ip}/g" {}[m
[31m-			#echo "sed -i "s/${IP_host_first}${ip_last_num}:$port/${pro}-${ip_last_num}.${public_ip}/g" $dir/public/*"[m
[31m-			sed -i "s/${IP_host_first}${ip_last_num}:$port/${pro}-${ip_last_num}.${public_ip}/g" $dir/public/java/*[m
[31m-			sed -i "s/${IP_host_first}${ip_last_num}:$port/${pro}-${ip_last_num}.${public_ip}/g" $dir/public/node/*[m
[31m-			sed -i "s/${IP_host_first}${ip_last_num}:$port/${pro}-${ip_last_num}.${public_ip}/g" $dir/public/ui/*[m
[32m+[m			[32msed -i "s/${IP_host}:$port/${pro}-${ip_last_num}.${public_ip}/g" $dir/public/java/*[m
[32m+[m			[32msed -i "s/${IP_host}:$port/${pro}-${ip_last_num}.${public_ip}/g" $dir/public/node/*[m
[32m+[m			[32msed -i "s/${IP_host}:$port/${pro}-${ip_last_num}.${public_ip}/g" $dir/public/ui/*[m
 		}[m
 		done[m
[31m-		#find $dir/public/ -type f  -print | xargs -i sed -i "s/${IP_host_first}${ip_last_num}/www.${public_ip}/g" {}[m
[31m-[m
 		#ngxin conf.d发布[m
 		mkdir -p $dir/nginx_conf.d[m
 		cp -rf /home/config_files/nginx_conf.d/* $dir/nginx_conf.d/[m
 		#baitiao pem发布[m
 		mkdir -p $dir/pem_file[m
 		cp -rf /home/config_files/pem_file/* $dir/pem_file/[m
[31m-		# sed -i "s/target_host_name/${IP_host_first}${ip_last_num}/" $dir/nginx_conf.d/*[m
[31m-		echo "`date +%T.%N` 结束 ${IP_host_first}${ip_last_num}"[m
[32m+[m		[32mecho "`date +%T.%N` 结束 ${IP_host}"[m
 		echo "---------"[m
 		echo >&1000[m
 	}&[m

[33mcommit 8c88127a6b5e283c671f09c6dc1148c670f77ab0[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 10:35:04 2017 +0800

    IP获取的公共方法

[1mdiff --git a/get-ip.sh b/get-ip.sh[m
[1mnew file mode 100755[m
[1mindex 0000000..f1be85f[m
[1m--- /dev/null[m
[1m+++ b/get-ip.sh[m
[36m@@ -0,0 +1,20 @@[m
[32m+[m[32m#!/bin/bash[m
[32m+[m[32mip_value=$1[m
[32m+[m[32mfunction valid_ip()[m
[32m+[m[32m{[m
[32m+[m[32m    local  ip=$1[m
[32m+[m[32m    local  stat=1[m
[32m+[m
[32m+[m[32m    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then[m
[32m+[m[32m        OIFS=$IFS[m
[32m+[m[32m        IFS='.'[m
[32m+[m[32m        ip=($ip)[m
[32m+[m[32m        IFS=$OIFS[m
[32m+[m[32m        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \[m
[32m+[m[32m            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]][m
[32m+[m[32m        stat=$?[m
[32m+[m[32m    fi[m
[32m+[m[32m    return $stat[m
[32m+[m[32m}[m
[32m+[m[32mif valid_ip $ip_value; then target_db_host="$ip_value"; else target_db_host="192.168.4.$ip_value"; fi[m
[32m+[m[32mecho "$target_db_host"[m
\ No newline at end of file[m

[33mcommit e5f4df2177d515ca1609c44a36b67fb06842c0af[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 10:34:48 2017 +0800

    把IP获取的方式提出去

[1mdiff --git a/db-utils/db_schema_sync.sh b/db-utils/db_schema_sync.sh[m
[1mindex 0a2bb03..1ce89b7 100755[m
[1m--- a/db-utils/db_schema_sync.sh[m
[1m+++ b/db-utils/db_schema_sync.sh[m
[36m@@ -9,6 +9,7 @@[m
 [m
 source ~/.bash_profile[m
 source ~/.profile[m
[32m+[m[32mpwd_path="/home/qa-deploy-utils"[m
 [m
 if [ $# -ne 10 ]; then[m
 	echo "---------------"[m
[36m@@ -53,24 +54,7 @@[m [mdo[m
 	echo >&1000[m
 done[m
 [m
[31m-function valid_ip()[m
[31m-{[m
[31m-    local  ip=$1[m
[31m-    local  stat=1[m
[31m-[m
[31m-    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then[m
[31m-        OIFS=$IFS[m
[31m-        IFS='.'[m
[31m-        ip=($ip)[m
[31m-        IFS=$OIFS[m
[31m-        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \[m
[31m-            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]][m
[31m-        stat=$?[m
[31m-    fi[m
[31m-    return $stat[m
[31m-}[m
[31m-[m
[31m-if valid_ip $ip_value; then target_db_host="$ip_value"; else target_db_host="192.168.4.$ip_value"; fi[m
[32m+[m[32mtarget_db_host=`sh $pwd_path/get-ip.sh $ip_value`[m
 [m
 function db_schema_sync()[m
 {	[m

[33mcommit f5b8764fdfe13129b78af7ea9495fbf1d53aab0a[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 10:33:15 2017 +0800

    修改mount的IP获取方式

[1mdiff --git a/qa_shell_script/1_mount_config_files.sh b/qa_shell_script/1_mount_config_files.sh[m
[1mindex 1d4a910..cacd28e 100755[m
[1m--- a/qa_shell_script/1_mount_config_files.sh[m
[1m+++ b/qa_shell_script/1_mount_config_files.sh[m
[36m@@ -1,56 +1,58 @@[m
 #!/bin/bash[m
 target_ip=$1[m
[31m-IP_host_first="192.168.4."[m
[32m+[m[32mpwd_path_0="/home/qa-deploy-utils"[m
[32m+[m[32mtarget_db_host=`sh $pwd_path/get-ip.sh $ip_value`[m
 config_files=/home/config_files[m
 script_path=/home/qa-deploy-utils/qa_shell_script[m
 pwd_path="/home/qa-deploy-utils/qa_shell_script"[m
 config_server="$pwd_path/config_server"[m
 project_path=`cat $config_server/get_env_ip.sh`[m
 [m
[31m-[m
 if [[ $target_ip == "ALL" ]]; then[m
 	for ip_last_num in  $project_path[m
[31m-    do[m
[31m-        expect -c "[m
[31m-	        set timeout 10[m
[31m-	        spawn ssh root@${IP_host_first}${ip_last_num}[m
[31m-	        expect \"]#\"[m
[31m-	        send \"umount -l $script_path\\ \r\"[m
[31m-		    set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"rm -rf $script_path\r\"[m
[31m-		    set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-	        send \"mkdir -p $script_path\r\"[m
[31m-	        set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"mount -t nfs 192.168.4.3:$script_path $script_path\r\"[m
[31m-		    set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"umount -l $config_files\\ \r\"[m
[31m-		    set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"rm -rf $config_files\r\"[m
[31m-		    set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"mkdir $config_files\r\"[m
[31m-		    set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"mount -t nfs 192.168.4.3:/home/sub_config_file_dont_rm/${IP_host_first}${ip_last_num}/ $config_files\r\"[m
[31m-		    set timeout -1[m
[31m-		    expect \"]#\"[m
[31m-		    send \"exit\r\"[m
[31m-	     expect eof;"[m
[31m-    done[m
[32m+[m	[32mdo[m
[32m+[m			[32mIP_host=`sh $pwd_path_0/get-ip.sh $ip_last_num`[m
[32m+[m			[32mexpect -c "[m
[32m+[m			[32mset timeout 10[m
[32m+[m			[32mspawn ssh root@${IP_host}[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"umount -l $script_path\\ \r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"rm -rf $script_path\r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"mkdir -p $script_path\r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"mount -t nfs 192.168.4.3:$script_path $script_path\r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"umount -l $config_files\\ \r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"rm -rf $config_files\r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"mkdir $config_files\r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"mount -t nfs 192.168.4.3:/home/sub_config_file_dont_rm/${IP_host}/ $config_files\r\"[m
[32m+[m			[32mset timeout -1[m
[32m+[m			[32mexpect \"]#\"[m
[32m+[m			[32msend \"exit\r\"[m
[32m+[m			[32mexpect eof;"[m
[32m+[m		[32mdone[m
 else[m
[32m+[m	[32mtarget_host=`sh $pwd_path_0/get-ip.sh $target_ip`[m
 	expect -c "[m
[31m-	    set timeout 10[m
[31m-	    spawn ssh root@${IP_host_first}${target_ip}[m
[31m-	    expect \"]#\"[m
[31m-	    send \"umount -l /home/qa-deploy-utils/qa_shell_script\r\"[m
[31m-	    expect \"]#\"[m
[31m-	    send \"mkdir -p /home/qa-deploy-utils/qa_shell_script\r\"[m
[31m-	    set timeout -1[m
[32m+[m		[32mset timeout 10[m
[32m+[m		[32mspawn ssh root@${target_host}[m
[32m+[m		[32mexpect \"]#\"[m
[32m+[m		[32msend \"umount -l /home/qa-deploy-utils/qa_shell_script\r\"[m
[32m+[m		[32mexpect \"]#\"[m
[32m+[m		[32msend \"mkdir -p /home/qa-deploy-utils/qa_shell_script\r\"[m
[32m+[m		[32mset timeout -1[m
 		expect \"]#\"[m
 		send \"mount -t nfs 192.168.4.3:/home/qa-deploy-utils/qa_shell_script /home/qa-deploy-utils/qa_shell_script\r\"[m
 		set timeout -1[m
[36m@@ -64,7 +66,7 @@[m [melse[m
 		send \"mkdir $config_files\r\"[m
 		set timeout -1[m
 		expect \"]#\"[m
[31m-		send \"mount -t nfs 192.168.4.3:/home/sub_config_file_dont_rm/${IP_host_first}${target_ip}/ $config_files\r\"[m
[32m+[m		[32msend \"mount -t nfs 192.168.4.3:/home/sub_config_file_dont_rm/${target_host}/ $config_files\r\"[m
 		set timeout -1[m
 		expect \"]#\"[m
 		send \"exit\r\"[m

[33mcommit 1ee7df8b17e83cf8695f99795b56889f653143be[m
Merge: 2321f35 7fc3c2d
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 10:10:00 2017 +0800

    Merge branch 'master' of http://git.quantgroup.cn/QA/qa-deploy-utils

[33mcommit 2321f353e3cf1b894e8734668bca0d37cbffe488[m
Author: tywldx <tywldx@163.com>
Date:   Thu Dec 7 10:09:52 2017 +0800

    remove rub

[1mdiff --git a/mock.zip b/mock.zip[m
[1mnew file mode 100644[m
[1mindex 0000000..af76a4a[m
Binary files /dev/null and b/mock.zip differ
[1mdiff --git a/mock/json/elong_hotel-detail.json b/mock/json/elong_hotel-detail.json[m
[1mdeleted file mode 100644[m
[1mindex ae64aec..0000000[m
[1m--- a/mock/json/elong_hotel-detail.json[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-{[m
[31m-    "Code": "0",[m
[31m-    "Result": {[m
[31m-        "Count": 1,[m
[31m-        "Hotels": [[m
[31m-            {[m
[31m-                "HotelId": "50101472",[m
[31m-                "LowRate": 1000,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 89551,[m
[31m-                        "TypeCode": "PerRoomPerName",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2014-01-03T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求每个房间至少提供一名入住客人的姓名"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "51030_05_183827",[m
[31m-                        "TypeCode": "05",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 15,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含服务费;"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "1048",[m
[31m-                        "Name": "行政楼层豪华间.",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 1000,[m
[31m-                                "AverageRate": 1000,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 1000,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-15T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "89551",[m
[31m-                                "GuaranteeRuleIds": "",[m
[31m-                                "ValueAddIds": "51030_05_183827",[m
[31m-                                "RoomTypeId": "1040",[m
[31m-                                "HotelCode": "50101472",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 183827,[m
[31m-                                "RatePlanName": "不 含 早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            }[m
[31m-        ][m
[31m-    },[m
[31m-    "Guid": "508c2abc-db69-4e50-af84-f1ba1bf88005"[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/elong_hotel-list.json b/mock/json/elong_hotel-list.json[m
[1mdeleted file mode 100644[m
[1mindex 567ecca..0000000[m
[1m--- a/mock/json/elong_hotel-list.json[m
[1m+++ /dev/null[m
[36m@@ -1,2022 +0,0 @@[m
[31m-{[m
[31m-    "Code": "0",[m
[31m-    "Result": {[m
[31m-        "Count": 1109,[m
[31m-        "Hotels": [[m
[31m-            {[m
[31m-                "HotelId": "40101022",[m
[31m-                "LowRate": 408,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "41271_01_7814",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 2,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含2份早餐;"[m
[31m-                    },[m
[31m-                    {[m
[31m-                        "ValueAddId": "41271_05_7814",[m
[31m-                        "TypeCode": "05",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 15,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含服务费;"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "1043",[m
[31m-                        "Name": "贝尔特客房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 408,[m
[31m-                                "AverageRate": 408,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 408,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": true,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "41271_01_7814,41271_05_7814",[m
[31m-                                "RoomTypeId": "1043",[m
[31m-                                "HotelCode": "40101022",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 7814,[m
[31m-                                "RatePlanName": "含双早 (无线专卖)",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "40101834",[m
[31m-                "LowRate": 299,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "豪华标准间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": true,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 399,[m
[31m-                                "AverageRate": 399,[m
[31m-                                "AverageBaseRate": 399,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 399,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": true,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0022",[m
[31m-                                "HotelCode": "40101834",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 416655,[m
[31m-                                "RatePlanName": "不含早（限时限量抢购）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0001",[m
[31m-                        "Name": "特惠标准间(无窗)",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 299,[m
[31m-                                "AverageRate": 299,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 299,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0023",[m
[31m-                                "HotelCode": "40101834",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 416655,[m
[31m-                                "RatePlanName": "不含早（限时限量抢购）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "90101892",[m
[31m-                "LowRate": 207,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 95664,[m
[31m-                        "TypeCode": "PerRoomPerName",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2014-02-27T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求每个房间至少提供一名入住客人的姓名"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0001",[m
[31m-                        "Name": "大床房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": true,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 207,[m
[31m-                                "AverageRate": 207,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 207,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": true,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "95664",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0001",[m
[31m-                                "HotelCode": "90101892",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 384600,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0003",[m
[31m-                        "Name": "特价房(无窗)",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": true,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 230,[m
[31m-                                "AverageRate": 230,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 230,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": true,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "95664",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0003",[m
[31m-                                "HotelCode": "90101892",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 384600,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "50101002",[m
[31m-                "LowRate": 100,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 54746,[m
[31m-                        "TypeCode": "NeedPhoneNo",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2012-07-17T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求客人务必提供手机号"[m
[31m-                    },[m
[31m-                    {[m
[31m-                        "BookingRuleId": 3486,[m
[31m-                        "TypeCode": "PerRoomPerName",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2011-01-04T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求每个房间至少提供一名入住客人的姓名"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "50910_01_478867",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 1,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含1份早餐;"[m
[31m-                    },[m
[31m-                    {[m
[31m-                        "ValueAddId": "50910_01_480866",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 2,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": true,[m
[31m-                        "ExtOption": "Percent",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含2份早餐;单加1份早餐首晚房费的0.0%"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "1049",[m
[31m-                        "Name": "A座行政房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": true,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 100,[m
[31m-                                "AverageRate": 100,[m
[31m-                                "AverageBaseRate": 100,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 100,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": true,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "54746,3486",[m
[31m-                                "ValueAddIds": "50910_01_478867",[m
[31m-                                "RoomTypeId": "1049",[m
[31m-                                "HotelCode": "50101002",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 478867,[m
[31m-                                "RatePlanName": "自签含单早1",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "1060",[m
[31m-                        "Name": "套房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": true,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 490,[m
[31m-                                "AverageRate": 490,[m
[31m-                                "AverageBaseRate": 490,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 490,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": true,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "54746,3486",[m
[31m-                                "ValueAddIds": "50910_01_480866",[m
[31m-                                "RoomTypeId": "1060",[m
[31m-                                "HotelCode": "50101002",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 480866,[m
[31m-                                "RatePlanName": "双早_现付",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "40101114",[m
[31m-                "LowRate": 368,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "41357_01_6526",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": false,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Money",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": true,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 40,[m
[31m-                        "Description": "附加服务：单加1份早餐 40 元"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0019",[m
[31m-                        "Name": "标准大床房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 368,[m
[31m-                                "AverageRate": 368,[m
[31m-                                "AverageBaseRate": 368,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 368,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "41357_01_6526",[m
[31m-                                "RoomTypeId": "0019",[m
[31m-                                "HotelCode": "40101114",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 6526,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 3,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0001",[m
[31m-                        "Name": "豪华大床房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 406,[m
[31m-                                "AverageRate": 406,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 406,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "41357_01_6526",[m
[31m-                                "RoomTypeId": "0001",[m
[31m-                                "HotelCode": "40101114",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 6526,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 3,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "50101624",[m
[31m-                "LowRate": 101,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "51178_05_439589",[m
[31m-                        "TypeCode": "05",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 15,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含服务费;"[m
[31m-                    },[m
[31m-                    {[m
[31m-                        "ValueAddId": "51178_01_439589",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 1,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含1份早餐;"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "高级单间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": false,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": -1,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 101,[m
[31m-                                "AverageRate": 101,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 101,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "51178_05_439589,51178_01_439589",[m
[31m-                                "RoomTypeId": "0002",[m
[31m-                                "HotelCode": "50101624",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 439589,[m
[31m-                                "RatePlanName": "含单早(限时抢购)",[m
[31m-                                "MinAmount": 4,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0010",[m
[31m-                        "Name": "豪华标间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": false,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": -1,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 219,[m
[31m-                                "AverageRate": 219,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 219,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "51178_05_439589,51178_01_439589",[m
[31m-                                "RoomTypeId": "0010",[m
[31m-                                "HotelCode": "50101624",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 439589,[m
[31m-                                "RatePlanName": "含单早(限时抢购)",[m
[31m-                                "MinAmount": 4,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "50101008",[m
[31m-                "LowRate": 1000,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 2630,[m
[31m-                        "TypeCode": "ForeignerNeedEnName",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2011-01-04T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求外宾务必留英文拼写"[m
[31m-                    },[m
[31m-                    {[m
[31m-                        "BookingRuleId": 2632,[m
[31m-                        "TypeCode": "PerRoomPerName",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2012-11-19T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求每个房间至少提供一名入住客人的姓名"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "50915_01_57972",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 2,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": true,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 190,[m
[31m-                        "Description": "附加服务：包含2份早餐;单加1份早餐 190 元"[m
[31m-                    },[m
[31m-                    {[m
[31m-                        "ValueAddId": "50915_05_57972",[m
[31m-                        "TypeCode": "05",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 15,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含服务费;"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "1053",[m
[31m-                        "Name": "北京套房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 1000,[m
[31m-                                "AverageRate": 1000,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 1000,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "2630,2632",[m
[31m-                                "ValueAddIds": "50915_01_57972,50915_05_57972",[m
[31m-                                "RoomTypeId": "1053",[m
[31m-                                "HotelCode": "50101008",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 57972,[m
[31m-                                "RatePlanName": "含双早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "50101472",[m
[31m-                "LowRate": 1000,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 89551,[m
[31m-                        "TypeCode": "PerRoomPerName",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2014-01-03T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求每个房间至少提供一名入住客人的姓名"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "51030_05_183827",[m
[31m-                        "TypeCode": "05",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 15,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含服务费;"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "1048",[m
[31m-                        "Name": "行政楼层豪华间.",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 1000,[m
[31m-                                "AverageRate": 1000,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 1000,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "89551",[m
[31m-                                "ValueAddIds": "51030_05_183827",[m
[31m-                                "RoomTypeId": "1040",[m
[31m-                                "HotelCode": "50101472",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 183827,[m
[31m-                                "RatePlanName": "不 含 早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "90040206",[m
[31m-                "LowRate": 139,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "标准间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": true,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 139,[m
[31m-                                "AverageRate": 139,[m
[31m-                                "AverageBaseRate": 199,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 139,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0013",[m
[31m-                                "HotelCode": "90040206",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 417762,[m
[31m-                                "RatePlanName": "不含早（限时抢购）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0003",[m
[31m-                        "Name": "大床房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": true,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 139,[m
[31m-                                "AverageRate": 139,[m
[31m-                                "AverageBaseRate": 199,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 139,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0014",[m
[31m-                                "HotelCode": "90040206",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 417762,[m
[31m-                                "RatePlanName": "不含早（限时抢购）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "00101354",[m
[31m-                "LowRate": 174,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 54384,[m
[31m-                        "TypeCode": "NeedPhoneNo",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2012-07-01T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求客人务必提供手机号"[m
[31m-                    },[m
[31m-                    {[m
[31m-                        "BookingRuleId": 49770,[m
[31m-                        "TypeCode": "NoneRule",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2011-11-07T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": ""[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0003",[m
[31m-                        "Name": "大床间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 174,[m
[31m-                                "AverageRate": 174,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 174,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "54384,49770",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0014",[m
[31m-                                "HotelCode": "00101354",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 413959,[m
[31m-                                "RatePlanName": "不含早（限时抢）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0001",[m
[31m-                        "Name": "标准间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 202,[m
[31m-                                "AverageRate": 202,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 202,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "54384,49770",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0013",[m
[31m-                                "HotelCode": "00101354",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 413959,[m
[31m-                                "RatePlanName": "不含早（限时抢）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "70101548",[m
[31m-                "LowRate": 1000,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 84098,[m
[31m-                        "TypeCode": "PerRoomPerName",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2013-11-06T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求每个房间至少提供一名入住客人的姓名"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0009",[m
[31m-                        "Name": "A座商务房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 1000,[m
[31m-                                "AverageRate": 1000,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 1000,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "84098",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0009",[m
[31m-                                "HotelCode": "80101497",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 477426,[m
[31m-                                "RatePlanName": "含单早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "20101752",[m
[31m-                "LowRate": 125,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "高级大床房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 125,[m
[31m-                                "AverageRate": 125,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 125,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0002",[m
[31m-                                "HotelCode": "20101752",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 420920,[m
[31m-                                "RatePlanName": "不含早（限时抢购）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0001",[m
[31m-                        "Name": "双床房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 125,[m
[31m-                                "AverageRate": 125,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 125,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0001",[m
[31m-                                "HotelCode": "20101752",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 420920,[m
[31m-                                "RatePlanName": "不含早（限时抢购）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "40101006",[m
[31m-                "LowRate": 200,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "41256_05_16774",[m
[31m-                        "TypeCode": "05",[m
[31m-                        "IsInclude": true,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Percent",[m
[31m-                        "Price": 15,[m
[31m-                        "IsExtAdd": false,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 0,[m
[31m-                        "Description": "附加服务：包含服务费;"[m
[31m-                    },[m
[31m-                    {[m
[31m-                        "ValueAddId": "41256_01_16774",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": false,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Money",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": true,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 50,[m
[31m-                        "Description": "附加服务：单加1份早餐 50 元"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "1131",[m
[31m-                        "Name": "主楼豪华客房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 200,[m
[31m-                                "AverageRate": 200,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 200,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "41256_05_16774,41256_01_16774",[m
[31m-                                "RoomTypeId": "1131",[m
[31m-                                "HotelCode": "40101006",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 16774,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "1163",[m
[31m-                        "Name": "主楼标准客房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 300,[m
[31m-                                "AverageRate": 300,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 300,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "41256_05_16774,41256_01_16774",[m
[31m-                                "RoomTypeId": "1163",[m
[31m-                                "HotelCode": "40101006",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 16774,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "00101364",[m
[31m-                "LowRate": 160,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0005",[m
[31m-                        "Name": "单人房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 160,[m
[31m-                                "AverageRate": 160,[m
[31m-                                "AverageBaseRate": 229,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 160,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0012",[m
[31m-                                "HotelCode": "00101364",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 415096,[m
[31m-                                "RatePlanName": "不含早（限时抢）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0004",[m
[31m-                        "Name": "标准房B",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 174,[m
[31m-                                "AverageRate": 174,[m
[31m-                                "AverageBaseRate": 249,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 174,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0014",[m
[31m-                                "HotelCode": "00101364",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 415096,[m
[31m-                                "RatePlanName": "不含早（限时抢）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "40101030",[m
[31m-                "LowRate": 1000,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 2651,[m
[31m-                        "TypeCode": "ForeignerNeedEnName",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2010-12-26T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求外宾务必留英文拼写"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "41278_01_42100",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": false,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Money",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": true,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 80,[m
[31m-                        "Description": "附加服务：单加1份早餐 80 元"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "1039",[m
[31m-                        "Name": "B座经济标准间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 1000,[m
[31m-                                "AverageRate": 1000,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 1000,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "2651",[m
[31m-                                "ValueAddIds": "41278_01_42100",[m
[31m-                                "RoomTypeId": "1039",[m
[31m-                                "HotelCode": "40101030",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 42100,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "20101502",[m
[31m-                "LowRate": 174,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [[m
[31m-                    {[m
[31m-                        "ValueAddId": "26706_01_415944",[m
[31m-                        "TypeCode": "01",[m
[31m-                        "IsInclude": false,[m
[31m-                        "Amount": 0,[m
[31m-                        "CurrencyCode": "RMB",[m
[31m-                        "PriceOption": "Money",[m
[31m-                        "Price": 0,[m
[31m-                        "IsExtAdd": true,[m
[31m-                        "ExtOption": "Money",[m
[31m-                        "ExtPrice": 15,[m
[31m-                        "Description": "附加服务：单加1份早餐 15 元"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "大床间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 174,[m
[31m-                                "AverageRate": 174,[m
[31m-                                "AverageBaseRate": 249,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 174,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "26706_01_415944",[m
[31m-                                "RoomTypeId": "0009",[m
[31m-                                "HotelCode": "20101502",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 415944,[m
[31m-                                "RatePlanName": "不含早（限时抢）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0005",[m
[31m-                        "Name": "三人间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "ProductTypes": "3",[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 188,[m
[31m-                                "AverageRate": 188,[m
[31m-                                "AverageBaseRate": 269,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 188,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "26706_01_415944",[m
[31m-                                "RoomTypeId": "0010",[m
[31m-                                "HotelCode": "20101502",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 415944,[m
[31m-                                "RatePlanName": "不含早（限时抢）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "90180650",[m
[31m-                "LowRate": 399,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0001",[m
[31m-                        "Name": "豪华标间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 399,[m
[31m-                                "AverageRate": 399,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 399,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0001",[m
[31m-                                "HotelCode": "90180650",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 409104,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "豪华大床间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 418,[m
[31m-                                "AverageRate": 418,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 418,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0002",[m
[31m-                                "HotelCode": "90180650",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 409104,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "90214406",[m
[31m-                "LowRate": 188,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0001",[m
[31m-                        "Name": "标准大床房(无窗)",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 188,[m
[31m-                                "AverageRate": 188,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 188,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0005",[m
[31m-                                "HotelCode": "90214406",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 458239,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "标准双床房",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "All",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 268,[m
[31m-                                "AverageRate": 268,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 268,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0002",[m
[31m-                                "HotelCode": "90214406",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 458239,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "10101836",[m
[31m-                "LowRate": 198,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 106970,[m
[31m-                        "TypeCode": "NeedPhoneNo",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2014-05-02T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求客人务必提供手机号"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0001",[m
[31m-                        "Name": "标准单人间(无窗)",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": true,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 198,[m
[31m-                                "AverageRate": 198,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 198,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "106970",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0015",[m
[31m-                                "HotelCode": "10101836",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 192223,[m
[31m-                                "RatePlanName": "无早（今日特价）",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "标准双人间",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 238,[m
[31m-                                "AverageRate": 238,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 238,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "106970",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0002",[m
[31m-                                "HotelCode": "10101836",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 187741,[m
[31m-                                "RatePlanName": "无早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            },[m
[31m-            {[m
[31m-                "HotelId": "00301088",[m
[31m-                "LowRate": 188,[m
[31m-                "CurrencyCode": "RMB",[m
[31m-                "Distance": 0,[m
[31m-                "BookingRules": [[m
[31m-                    {[m
[31m-                        "BookingRuleId": 49502,[m
[31m-                        "TypeCode": "NeedPhoneNo",[m
[31m-                        "DateType": "BookDay",[m
[31m-                        "StartDate": "2012-01-05T00:00:00+08:00",[m
[31m-                        "EndDate": "2038-01-19T00:00:00+08:00",[m
[31m-                        "StartHour": "00:00:00",[m
[31m-                        "EndHour": "23:59:00",[m
[31m-                        "Description": "酒店要求客人务必提供手机号"[m
[31m-                    }[m
[31m-                ],[m
[31m-                "GuaranteeRules": [],[m
[31m-                "PrepayRules": [],[m
[31m-                "ValueAdds": [],[m
[31m-                "DrrRules": [],[m
[31m-                "Rooms": [[m
[31m-                    {[m
[31m-                        "RoomId": "0005",[m
[31m-                        "Name": "经济大床间(无窗)",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 188,[m
[31m-                                "AverageRate": 188,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 188,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "49502",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0005",[m
[31m-                                "HotelCode": "00301088",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 4971,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    },[m
[31m-                    {[m
[31m-                        "RoomId": "0002",[m
[31m-                        "Name": "经济间(无窗)",[m
[31m-                        "RatePlans": [[m
[31m-                            {[m
[31m-                                "Status": true,[m
[31m-                                "CustomerType": "Chinese",[m
[31m-                                "CurrentAlloment": 0,[m
[31m-                                "InstantConfirmation": false,[m
[31m-                                "IsLastMinuteSale": false,[m
[31m-                                "StartTime": "00:00:00",[m
[31m-                                "EndTime": "23:59:00",[m
[31m-                                "TotalRate": 188,[m
[31m-                                "AverageRate": 188,[m
[31m-                                "CurrencyCode": "RMB",[m
[31m-                                "Coupon": -1,[m
[31m-                                "NightlyRates": [[m
[31m-                                    {[m
[31m-                                        "Member": 188,[m
[31m-                                        "Cost": -1,[m
[31m-                                        "Status": false,[m
[31m-                                        "AddBed": -1,[m
[31m-                                        "Date": "2016-08-16T00:00:00+08:00"[m
[31m-                                    }[m
[31m-                                ],[m
[31m-                                "BookingRuleIds": "49502",[m
[31m-                                "ValueAddIds": "",[m
[31m-                                "RoomTypeId": "0002",[m
[31m-                                "HotelCode": "00301088",[m
[31m-                                "InvoiceMode": "Hotel",[m
[31m-                                "RatePlanId": 4971,[m
[31m-                                "RatePlanName": "不含早",[m
[31m-                                "MinAmount": 1,[m
[31m-                                "MinDays": 1,[m
[31m-                                "MaxDays": 365,[m
[31m-                                "PaymentType": "SelfPay"[m
[31m-                            }[m
[31m-                        ][m
[31m-                    }[m
[31m-                ],[m
[31m-                "Gifts": [],[m
[31m-                "HAvailPolicys": [][m
[31m-            }[m
[31m-        ][m
[31m-    },[m
[31m-    "Guid": "712642d3-ba3e-487d-ab5c-3f678a556437"[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_bankcard_authbind_list.json b/mock/json/yeepay_bankcard_authbind_list.json[m
[1mdeleted file mode 100644[m
[1mindex 457819c..0000000[m
[1m--- a/mock/json/yeepay_bankcard_authbind_list.json[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-{[m
[31m-	"msg":"NOT FOUND VALID JSON FILE"[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_bankcard_check.json b/mock/json/yeepay_bankcard_check.json[m
[1mdeleted file mode 100644[m
[1mindex a4334c3..0000000[m
[1m--- a/mock/json/yeepay_bankcard_check.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"mkkwzj9eZ5Djt7Nc5AjT3VcWADFUnwgmEH/DLBOvHUDKZ+lQuIZiCDYZXonzzTN1b2XDFnlaXPBEs73v+zWB/HahFRhfCa0RCZwlCLlD0nNMO8JoAcbezNn1clDN9r7N4K9Oj75uK0O1Spj7XRpuT6H7U/G4wbNaFQqE9cPO9eo9sEh7r6Xvs9af5dmg3nxr+Pz1iJys9Ju3IlHvc40XUAMk8h7wnBhEedfh2b3Iub/McCbW+GH5UGSVWO/Q7ruw8cIzokk8OKim6TkedWMgyXhKRyK/d/afR90vhR4tHlSCdPf1eF4Q7czjJemxwH15pHsBvd+nJSndkTW4bYIEilqIrs7K8v7y/qCNgAhSK4g4m/xDP8oUO+TFFSHSIRRrI4wymgaIqoV0dh82wYzAj7avOLm6FP80BxmjixuCj7g=","encryptkey":"UT61C9FWJEo65HWRDkiC+c/y9wmuFLWwLDl2k2O6402zlMfQMvmtS9edaq/aEw/5jDV5HPDLmo8ITcD8nCeOms9fLRmhCVUzRFL3QJLgy/L4nX/knLzS++lX1SmnpWuyERsO/x6Ffep/J8DSdqQEp8d8oPoW95RTCAkwgTlWxOE="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_confirm_validatecode.json b/mock/json/yeepay_confirm_validatecode.json[m
[1mdeleted file mode 100644[m
[1mindex e8ad8d1..0000000[m
[1m--- a/mock/json/yeepay_confirm_validatecode.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"rqTp08JqRJ6PLUSO7vAF2mK1KRsUeEkw3f44MflK/v6SwSYg/G4ZPARm9fhX182aAeDPiCXaFYPwh1S11yJZKh5eYc1cPnF5K8EP6Ia7LDLjekVKzN+BPnlbGlP6rTUBsVsJRuiLQW1fg+jXfkvv5ZDbpxnlKg/++3cD9aruYhALvw/WevgQArXy8BRXHEJywrzFh4AxAfJq2wLXOApaWRaGS0DtYeKhibcxJ7Dy8JmCZ336Tv6PcuqSbeMFSI5envTFDBvD/95oW3gwETH4fyCe3aFYhOtjKlchC17EUytDiRu4ypZNti2mCvINjIdhxXHlnvbb2cduLTqgK6soB7wi6suh0nGIPGugFSPWFyhRdKRs5udner4FSiWSpl/reOEDFNFu3Md7eBruynpk8w==","encryptkey":"faT4I5xbcajX4txNjZmlgaYWYmCZY1eVN6ZgO6R31C2iIcTkYHEbkm6Qz0vhjAHiAjISFFsMo+5Hkm+11a2grBJBfjNLE84BmVA9h14Ax5Xq1VFVNzXJWnz12PKcUy41ZnLMq0yDrEku+8Qu5V0y59A4yttfPyO3uxoLhieO5oI="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_confirmbindbankcard.json b/mock/json/yeepay_confirmbindbankcard.json[m
[1mdeleted file mode 100644[m
[1mindex 31c0b86..0000000[m
[1m--- a/mock/json/yeepay_confirmbindbankcard.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"Rm/G6WgIpmShaIZrT94MABQJvei1v3ENnGaYOXANjzi9NcfBycHowLyoZXg0R6WyP5lBR3+IXhcpE9oayOiuGdgRTPyzCWsZKT/mdAd46i59FQ1GE0K7l6tznyxBWgSB3vuFuZG5K7V/vHMCo1qS0zewMbMv9Wph8/YZwwvMwbYDQ7XRWFypp4kZjVYGuSOhaxD3R/CCrXtmBUvojlVmwHS/QmeRfR8RqvQOopi1sdRemmD3sPSlLBpifcc66A2uVBI+gvf3hAsmVJun0ZV50chaclSU7Ae0Yqa98OEtg5JsKV7ct5b9jthDisnmns3s","encryptkey":"c8ebBbMlBizYDY5qsK/se1vPoXhkiPmVzuBrE8+30mHJlwQBeUJ18dgku9kQ6Gjmlw3KisYBawosO7na7iz8XWMvAXrMOXbq4W0Ml85zQbMrhJPsPyqwLX2v9/Trq7zLo9BAdDwDR5RdJThu7pDsd6d5H5lpPwvULeq05Loqpx0="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_directbindpay.json b/mock/json/yeepay_directbindpay.json[m
[1mdeleted file mode 100644[m
[1mindex 457819c..0000000[m
[1m--- a/mock/json/yeepay_directbindpay.json[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-{[m
[31m-	"msg":"NOT FOUND VALID JSON FILE"[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_drawrecord.json b/mock/json/yeepay_drawrecord.json[m
[1mdeleted file mode 100644[m
[1mindex 5681595..0000000[m
[1m--- a/mock/json/yeepay_drawrecord.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"s7NATmIpP42mgK3ycM9PKmOTQAMMeGVXZFV6N3sDRna/SjGC9/WdXO0WLnU/awB3gBJq5eu35UXkVeVcvjWqU4MKwbnaJzi+4+vaTalSBuP7+Y3GKaFT0h3jbTinT4zXl8XK9o7DyoLUD8LO3a+fbZDgU488POYtcWqWY5h4TpounQW/Ia9JjBye27rX1Jvc7jx19tY2XmFyd+EhWNxE4ES4DEpgIDYxNF6MpnLOwl2KXhmKCUNcxQLLW7oRiHuYlSXMAKGJrMblHrOQjTEPdl0h+zazf+OlP28molylcXk9gJYeG96rNdy4MAq+BLylH0YB/q34+2eGDrCvaKqHI3M1n/kkvnVH7LR5B35iALQidJa5eMTRzdKDRV9z+6QMob4nh54kXZiw9OGxmlTztluLAQzBoWGl0XiPvWy97P+NU5O4dWMyT0e9ZJuro73s59iCMfFXgjY2UOJ5QbhFtHfCSjQUiYui4rrU9K9QPVd3jW4L63D5BvRLH6xYbHh/","encryptkey":"ctEzYqNThpG3vAFmgohqC31KB2Zyr4xEfPE3Mbn+XDBJ3QVBrL49Ix8ywew0Wf+SYMUi4FTzfE4DRXj9vA7Mua4GmPmGy1QxoREGakI+icGvfFs6dqc+9fwGZ6sRbDuLk0e0/R04ILsPX2rTCnr8b+FXEQJ7Coe14CNES3U1MQo="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_drawvalidamount.json b/mock/json/yeepay_drawvalidamount.json[m
[1mdeleted file mode 100644[m
[1mindex 457819c..0000000[m
[1m--- a/mock/json/yeepay_drawvalidamount.json[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-{[m
[31m-	"msg":"NOT FOUND VALID JSON FILE"[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_invokebindbankcard.json b/mock/json/yeepay_invokebindbankcard.json[m
[1mdeleted file mode 100644[m
[1mindex a0fc1a2..0000000[m
[1m--- a/mock/json/yeepay_invokebindbankcard.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"jaEY2KrB1OwAUR+2rqPuMJAdblcgBz5MZD1BMXnzz41Brxh7zjGyf8WpLkk61ScuT2JV9BX3PMPZoaQ+6K+sfFkijJVRFxa2w75wdNPejjt6by9WuLMvRN0QO3wxSdiHuoCyvlfIwvh8HxPqxOhLxUMJJAxfh+8OagnZLuT98X0JIRoy7xnsdcBqvjTtHvkKxjJk5rRdcXZT1c9aPJWvb7bKan3C13zCcbUWONubmZ8JT6Q8+hjyELkBg5MwLzp1ysUUqD7ILgxMXlCPaM6AabtiSiNOQQlua+r73mESMebJZbDkXOPuCxkgBDG10LuNB8I1BBMZ3dWe4EoZAY0pJEXezn4b3uYQ77dZAPVUpxQ=","encryptkey":"N1nsBerhhvpxC6U4+yd4Y2+1Dksl+HZi37z1vGQGXbqLWUGDEw6zizxW9sp5epXaWEX3v0ny1cO5SPGXrFsgaPI+5CJT1cQ6MYMjbdeIo99Mujj3i7tIm6rnlBDDybRDS0gSaB4CR508nhRsaAiDrXGn/MfhNwK/Uv3mwFZ9QUg="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_pay_bind_request.json b/mock/json/yeepay_pay_bind_request.json[m
[1mdeleted file mode 100644[m
[1mindex 6fc3c1b..0000000[m
[1m--- a/mock/json/yeepay_pay_bind_request.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"0UaDh9LblxMz7O+hFr9tgnGHSJQpgMEQh32//XOFrve5aZ3w2/BRWz3yPm0WjYysB25HSzGDjK7bUHLOqD9SeE8LFVuVOxePlUUXyhpeSUS6i8HJ18C9UHqXosh94+ThYSB1QxgDZy3CdvjUpXRpAX2+c/Qfzjmd0ER6OcC7RMlcH4BRa6h7vOJsTfzzI/mMDQrEOetxkAq7YmgqQpVmVE7rsl+y6VBsGIOw7639FpHvGFw7gyTuXJb13rDHuGPiFkbWAtL9suDLOQLUZ43wOD5jWVRawZWlHZPlkMii4c0V6byJwPOomhlx3bXH2HnvHNpFcVXZmtZdv1R/7IJDWS1SLwIwNHSmhKVgAsFLl/bT3bPtEaaWz+37V0AH6YyE","encryptkey":"JdKTwA5Iz9enRGKjtdiov/irYdX6D47S8r8L0tnmUBRF8cEI3B9b1w85k9xIsbhrwvc63JSSkEirIUPdm3CrznW4g6hLpaZ4PTbcxfr65Zf2/oPwdo55GEGkFpRYzX6XGliUPFb8pPm29tkJGj3w7XwajGaLlpDnQkiXTQBsDaQ="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_pay_single.json b/mock/json/yeepay_pay_single.json[m
[1mdeleted file mode 100644[m
[1mindex 457819c..0000000[m
[1m--- a/mock/json/yeepay_pay_single.json[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-{[m
[31m-	"msg":"NOT FOUND VALID JSON FILE"[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_query_order.json b/mock/json/yeepay_query_order.json[m
[1mdeleted file mode 100644[m
[1mindex e722fbe..0000000[m
[1m--- a/mock/json/yeepay_query_order.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"DUpT9ZVdGdFtkiDwkV5FBy0M4R4z4YcwHIKcBteYyGNiep1RoYFvDQ9xshRkD4z74KBoKRZYJgyRdyeGnlHiR4JEpPvAkZDNhtLuj+HTJy40GcL4h4FYkZThXg/T/D6UoXavPPhz+AzZzGVEwzlW7181rOHRFtqzbfb22L3TFSrhXKDU9zOJFXwaTfH9+WHKODHHoVOjzmBgx8XqVrr1Qgq7k7GPl/rCH8zOdtl6A2wHyn5bN0/O2uWF23HbMfrhLmSzjEwkYO88rVrpol9cwNvwERmlvTpHNkimIk0bV00iE/D85tLfSW7WMjZaSqXIg8WCBQYphmGauE6WzSLunI+Mt/DsEwIEXupKbpCe9viATqrZVJ14qDUH9GPbuQ6JdSgca+GLPCPh9gCIFPx/J+BbpPdRRD7goEtOGplN8jl3DaqXvXSXeaQuZRuE93tkCsJXCZxLF1bb2lxj5Di/VlKyBj2/DMRrTVAFHq6g/gQDQ0yyifKxMc0S7S2Ei2Ib9zV47RrzEMm49viYv8dUxJs5uu/0mQ1SiCHjOc3tJvoXaXv6kjj4AGH88n4twEj6azdx4rEkjjIYZZKHX6tx+n8Ptx16zpXQywRIBjK+CVDRO40Xr02VqsRxYXoukCIZ","encryptkey":"Z9PTP1QBVuKyrGZCGlyA6cA/FHTLfew4kxay51TnjuoZIf/AQq32gScIbGKE5a2Hnie28WOFl0NZlRJMpbfS/zgR62oHI5SjaTjU4nwjrkTwPqLhqhqpjKItT8wTzcfPNIVlxz1Xb1VlO+0QV5CvN3GPM4MT3+6zGQdXkPVJS8g="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_validatecode_send.json b/mock/json/yeepay_validatecode_send.json[m
[1mdeleted file mode 100644[m
[1mindex 3dd9fc5..0000000[m
[1m--- a/mock/json/yeepay_validatecode_send.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"rXKvZtISfL3C3ZMER6JukgtkBwwFn9DoqJ5f69OEnK1ESrNa8cNEwvnxGxrniEK27O3+VL5qmd/eGeg9Lanjfy8VuatsorCsWxlDmWYtE9WzJDtbL0Hh3dswNUUnJ7eKRtkIPonYwqeoMS1zIyaljSBbNgg6xmyGZAIsRxQALcDPSmEeslhN2nTqI1qi/2wFHqgYqaCQH60XgBkpQwqmC1zsN71/rO6gRBENXZxDstiQ5k/MT4oveTYeI2rqJzMpcnlDCoUbLkP+uRPWDZBYu0wrCsbshNhbquQwpIGtElxRL8WCL+bSWnJcLm5XxnqjWMqYh5Uew0CvG7BwXxwyevJ/xS+TKDYok27OAZhcz9M8VBK8BtBBUPvTtooMZxvs","encryptkey":"eePwoo7DuL4q87sLI8giIAkuBe9T3Wyn9M3hsLK+Uh2vvg8rDauEXxkyb+9Nl+dK9/RTsjC7tAXHjVlVNOwVlczlVLguRhbg1a+6nkwkNmCVhM/3lGyBYSqWOs7ktNSZfBcqK6/JbujtsAWFpFRTShj8S14uPMXRWEjHB+wyHg0="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/yeepay_withdraw.json b/mock/json/yeepay_withdraw.json[m
[1mdeleted file mode 100644[m
[1mindex 032f38a..0000000[m
[1m--- a/mock/json/yeepay_withdraw.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{"data":"3Pp1DPPH/u4CmcQzrj/XnafpJtGiDEXMfSzcrrhG/okUSl0VjtdMq3Kz+BVOcxmDLQ2WCLyLIb16+gR+Yy/Bj9FwuoAwHNljTqRMZeI/5ODmVKep2g1q6c5x9r2eykFJy+H6QcaUXeuwB89tAM11GfnFU0L8KELLGhqJz3chzU4dtkXXX7+flotCuK/OxT8MFhsGuYrzzAfwIXIO8d+NTQNTLpIV+KQ299yVeLUzfd9CznuyVor7gODdVphhM2h37kxAgcgbpgeg0SzXlq8zpRHXxC+aqzORauW2dU7pAt+Ty25K36AjTA/r3RDpoFY/D1+juhdBXF6ZGoT9lWq56UOe8yuOOOzXpWXC5tDr2i/6OU4ffCq6jolI2uxGMqrIeClugd1GI4Ts1i5dORdSMJq7kN5vgZ77lA0KQRjN2ymVHHl6l3RGobsXKB1VhVEmQDs8DcIic0IuckDT+D9MMy566LRgJbvKzPLzmnjMjKabyncTPTMrswN3uY5H1/Sx","encryptkey":"OWOpx7Jtc2lagKPNu8d519rvEIsO4ydcEf7PubQAXsNryxsL5r08oxpN1GjMTbvW9yHPi9k22UbZD2BHThLDophkHC+s9Kd6Nd5LXGKwknkeS7JzYR8LEO80iQvxYkclkKp/FWvbgMUNvd7t4p7tVx40xq6krEH34tpUevzMX9c="}[m
\ No newline at end of file[m
[1mdiff --git a/mock/json/zmxy.json b/mock/json/zmxy.json[m
[1mdeleted file mode 100644[m
[1mindex df39474..0000000[m
[1m--- a/mock/json/zmxy.json[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-{[m
[31m-	"msg": "用户已经成功授权过",[m
[31m-	"code": "0000",[m
[31m-	"businessCode": "0000",[m
[31m-	"data": true,[m
[31m-	"success": true[m
[31m-}[m
[31m-[m
[1mdiff --git a/mock/mockers/__init__.py b/mock/mockers/__init__.py[m
[1mdeleted file mode 100644[m
[1mindex 0e0ca9b..0000000[m
[1m--- a/mock/mockers/__init__.py[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-# from . import elong_mocker[m
\ No newline at end of file[m
[1mdiff --git a/mock/mockers/__init__.pyc b/mock/mockers/__init__.pyc[m
[1mdeleted file mode 100644[m
[1mindex 392bd72..0000000[m
Binary files a/mock/mockers/__init__.pyc and /dev/null differ
[1mdiff --git a/mock/mockers/elong_mocker.py b/mock/mockers/elong_mocker.py[m
[1mdeleted file mode 100644[m
[1mindex e3f1f04..0000000[m
[1m--- a/mock/mockers/elong_mocker.py[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-#-*- coding: UTF-8 -*-[m
[31m-import sys [m
[31m-sys.path.append("..")[m
[31m-import os[m
[31m-from flask import Flask, jsonify, request,json[m
[31m-from utils.crossdomain import crossdomain[m
[31m-[m
[31m-app = Flask(__name__)[m
[31m-[m
[31m-mockdir = os.path.dirname(os.path.realpath(__file__))[m
[31m-print mockdir[m
[31m-[m
[31m-# ***[m
[31m-# *** 艺龙接口[m
[31m-# ***[m
[31m-# /payapi/rest[m
[31m-@app.route("/payapi/rest", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def login():[m
[31m-    if request.method == 'GET':[m
[31m-[m
[31m-    	method = request.args.get('method')[m
[31m-    	if method == 'hotel.list':[m
[31m-        	json_data = open(mockdir+'/../json/elong_hotel-list.json')[m
[31m-        elif method == 'hotel.detail':[m
[31m-        	json_data = open(mockdir+'/../json/elong_hotel-detail.json')[m
[31m-        else:[m
[31m-        	print 'Error: method does not exit!'[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-[m
[31m-if __name__ == '__main__':[m
[31m-    # 内部监听使用127.0.0.1[m
[31m-    # app.run(debug=True, host="127.0.0.1", port=9000)[m
[31m-[m
[31m-    # 公开IP监听[m
[31m-    app.run(debug=True, host="0.0.0.0", port=9001)[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/mock/mockers/elong_mocker.pyc b/mock/mockers/elong_mocker.pyc[m
[1mdeleted file mode 100644[m
[1mindex ef46762..0000000[m
Binary files a/mock/mockers/elong_mocker.pyc and /dev/null differ
[1mdiff --git a/mock/mockers/yeepay_mocker.py b/mock/mockers/yeepay_mocker.py[m
[1mdeleted file mode 100644[m
[1mindex 5faa95b..0000000[m
[1m--- a/mock/mockers/yeepay_mocker.py[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-#-*- coding: UTF-8 -*-   [m
[31m-import sys[m
[31m-sys.path.append("..")[m
[31m-import os[m
[31m-from flask import Flask, jsonify, request,json[m
[31m-from utils.crossdomain import crossdomain[m
[31m-# from OpenSSL import OpenSSL[m
[31m-[m
[31m-app = Flask(__name__)[m
[31m-[m
[31m-mockdir = os.path.dirname(os.path.realpath(__file__))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 1 *** *** [m
[31m-# *** 绑卡请求接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/invokebindbankcard[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/invokebindbankcard", methods=['POST', 'OPTIONS'])[m
[31m-@crossdomain(origin='*')[m
[31m-def invokebindbankcard():[m
[31m-    [m
[31m-    if request.method == 'OPTIONS': return ''[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_invokebindbankcard.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 2 *** *** [m
[31m-# *** 确定绑卡接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/confirmbindbankcard[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/confirmbindbankcard", methods=['POST', 'OPTIONS'])[m
[31m-@crossdomain(origin='*')[m
[31m-def confirmbindbankcard():[m
[31m-    [m
[31m-    if request.method == 'OPTIONS': return ''[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_confirmbindbankcard.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 3: not sure whether be used *** *** [m
[31m-# *** 查询绑卡信息列表[m
[31m-# *** https://ok.yeepay.com/payapi/api/bankcard/authbind/list[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,identityid,identitytype,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/bankcard/authbind/list", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def bankcard_authbind_list():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_bankcard_authbind_list.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 4 *** *** [m
[31m-# *** 银行卡信息查询[m
[31m-# *** https://ok.yeepay.com/payapi/api/bankcard/check[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:merchantaccount,cardno,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/bankcard/check", methods=['POST'])[m
[31m-@crossdomain(origin='*')[m
[31m-def bankcard_check():[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_bankcard_check.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 5 *** *** [m
[31m-# *** 支付请求接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/pay/bind/reuqest[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:merchantaccount,orderid,transtime,currency,currency,productname,productname,identityid,identitytype,card_top[m
[31m-# ***         card_last,orderexpdate,callbackurl,imeiuserip,ua,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/pay/bind/reuqest", methods=['POST'])[m
[31m-@crossdomain(origin='*')[m
[31m-def pay_bind_request():[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_pay_bind_request.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 6 *** *** [m
[31m-# *** 发送短信验证码接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/pay/validatecode/send[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:merchantaccount,orderid,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/pay/validatecode/send", methods=['POST'])[m
[31m-@crossdomain(origin='*')[m
[31m-def validatecode_send():[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_validatecode_send.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 7 *** *** [m
[31m-# *** 确认支付[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/pay/confirm/validatecode[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:merchantaccount,orderid,validatecode,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/pay/confirm/validatecode", methods=['POST'])[m
[31m-@crossdomain(origin='*')[m
[31m-def confirm_validatecode():[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_confirm_validatecode.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 8 *** *** [m
[31m-# *** 支付结果查询[m
[31m-# *** https://ok.yeepay.com/payapi/api/query/order[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,orderid,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/query/order", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def query_order():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_query_order.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 9 *** *** [m
[31m-# *** 提现接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/withdraw[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数: TBD[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/withdraw", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def withdraw():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_withdraw.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-# ***[m
[31m-# *** *** *** 10 *** *** [m
[31m-# *** 提现查询接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/drawrecord[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:TBD[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/drawrecord", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def drawrecord():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_drawrecord.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 11 *** *** [m
[31m-# *** 可提现余额接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/drawvalidamount[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:TBD[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/drawvalidamount", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def drawvalidamount():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_drawvalidamount.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 12: not sure whether used *** *** [m
[31m-# *** 支付接口--不发送短验[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/directbindpay[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:TBD[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/directbindpay", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def directbindpay():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_directbindpay.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 13 *** *** [m
[31m-# *** 交易记录查询[m
[31m-# *** https://ok.yeepay.com/merchant/query_server/pay_single[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,orderid,yborderid,sign[m
[31m-# ***[m
[31m-@app.route("/merchant/query_server/pay_single", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def pay_single():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_pay_single.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 14: not used in pay-center *** *** [m
[31m-# *** 获取消费清算对账单记录[m
[31m-# *** https://ok.yeepay.com/merchant/query_server/pay_clear_data[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,startdate,enddate,sign[m
[31m-# ***[m
[31m-# @app.route("/merchant/query_server/pay_clear_data", methods=['GET'])[m
[31m-# @crossdomain(origin='*')[m
[31m-# def pay_clear_data():[m
[31m-#     if request.method == 'GET':[m
[31m-#         json_data = open(mockdir+'/../json/yeepay_pay_clear_data.json')[m
[31m-#         return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 15: not used in pay-center *** *** [m
[31m-# *** 退货退款[m
[31m-# *** https://ok.yeepay.com/merchant/query_server/direct_refund[m
[31m-# *** HTTP 请求方式 :POST[m
[31m-# *** 请求参数:amount,currency,cause,merchantaccount,orderid,origyborderid,sign[m
[31m-# ***[m
[31m-# @app.route("/merchant/query_server/direct_refund", methods=['POST'])[m
[31m-# @crossdomain(origin='*')[m
[31m-# def direct_refund():[m
[31m-#     if request.method == 'POST':[m
[31m-#         json_data = open(mockdir+'/../json/yeepay_direct_refund.json')[m
[31m-#         return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 16: not used in pay-center *** *** [m
[31m-# *** 退货退款记录查询[m
[31m-# *** https://ok.yeepay.com/merchant/query_server/refund_single[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,orderid,yborderid,sign[m
[31m-# ***[m
[31m-# @app.route("/merchant/query_server/refund_single", methods=['GET'])[m
[31m-# @crossdomain(origin='*')[m
[31m-# def refund_single():[m
[31m-#     if request.method == 'GET':[m
[31m-#         json_data = open(mockdir+'/../json/yeepay_refund_single.json')[m
[31m-#         return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 17: not used in pay-center *** *** [m
[31m-# *** 获取退款清算对账记录[m
[31m-# *** ttps://ok.yeepay.com/merchant/query_server/refund_clear_data[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,startdate,enddate,sign[m
[31m-# ***[m
[31m-# @app.route("/merchant/query_server/refund_clear_data", methods=['GET'])[m
[31m-# @crossdomain(origin='*')[m
[31m-# def refund_clear_data():[m
[31m-#     if request.method == 'GET':[m
[31m-#         json_data = open(mockdir+'/../json/yeepay_refund_clear_data.json')[m
[31m-#         return jsonify(json.load(json_data))[m
[31m-[m
[31m-if __name__ == '__main__':[m
[31m-    # 内部监听使用127.0.0.1[m
[31m-    # app.run(debug=True, host="127.0.0.1", port=9000)[m
[31m-[m
[31m-    # 公开IP监听[m
[31m-    app.run(debug=True, host="0.0.0.0", port=9002)[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/mock/mockers/yeepay_mocker_backup.py b/mock/mockers/yeepay_mocker_backup.py[m
[1mdeleted file mode 100644[m
[1mindex fd6189a..0000000[m
[1m--- a/mock/mockers/yeepay_mocker_backup.py[m
[1m+++ /dev/null[m
[36m@@ -1,260 +0,0 @@[m
[31m-#-*- coding: UTF-8 -*-   [m
[31m-import sys[m
[31m-sys.path.append("..")[m
[31m-import os[m
[31m-from flask import Flask, jsonify, request,json[m
[31m-from utils.crossdomain import crossdomain[m
[31m-[m
[31m-app = Flask(__name__)[m
[31m-[m
[31m-mockdir = os.path.dirname(os.path.realpath(__file__))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 1 *** *** [m
[31m-# *** 绑卡请求接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/invokebindbankcard[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/invokebindbankcard", methods=['POST', 'OPTIONS'])[m
[31m-@crossdomain(origin='*')[m
[31m-def invokebindbankcard():[m
[31m-    [m
[31m-    if request.method == 'OPTIONS': return ''[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_invokebindbankcard.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 2 *** *** [m
[31m-# *** 确定绑卡接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/confirmbindbankcard[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/confirmbindbankcard", methods=['POST', 'OPTIONS'])[m
[31m-@crossdomain(origin='*')[m
[31m-def confirmbindbankcard():[m
[31m-    [m
[31m-    if request.method == 'OPTIONS': return ''[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_confirmbindbankcard.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 3: not sure whether be used *** *** [m
[31m-# *** 查询绑卡信息列表[m
[31m-# *** https://ok.yeepay.com/payapi/api/bankcard/authbind/list[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,identityid,identitytype,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/bankcard/authbind/list", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def bankcard_authbind_list():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_bankcard_authbind_list.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 4 *** *** [m
[31m-# *** 银行卡信息查询[m
[31m-# *** https://ok.yeepay.com/payapi/api/bankcard/check[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:merchantaccount,cardno,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/bankcard/check", methods=['POST'])[m
[31m-@crossdomain(origin='*')[m
[31m-def bankcard_check():[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_bankcard_check.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 5 *** *** [m
[31m-# *** 支付请求接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/pay/bind/reuqest[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:merchantaccount,orderid,transtime,currency,currency,productname,productname,identityid,identitytype,card_top[m
[31m-# ***         card_last,orderexpdate,callbackurl,imeiuserip,ua,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/pay/bind/reuqest", methods=['POST'])[m
[31m-@crossdomain(origin='*')[m
[31m-def pay_bind_request():[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_pay_bind_request.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 6 *** *** [m
[31m-# *** 发送短信验证码接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/pay/validatecode/send[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:merchantaccount,orderid,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/pay/validatecode/send", methods=['POST'])[m
[31m-@crossdomain(origin='*')[m
[31m-def validatecode_send():[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_validatecode_send.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 7 *** *** [m
[31m-# *** 确认支付[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/pay/confirm/validatecode[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:merchantaccount,orderid,validatecode,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/pay/confirm/validatecode", methods=['POST'])[m
[31m-@crossdomain(origin='*')[m
[31m-def confirm_validatecode():[m
[31m-    if request.method == 'POST':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_confirm_validatecode.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 8 *** *** [m
[31m-# *** 支付结果查询[m
[31m-# *** https://ok.yeepay.com/payapi/api/query/order[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,orderid,sign[m
[31m-# ***[m
[31m-@app.route("/payapi/api/query/order", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def query_order():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_query_order.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 9 *** *** [m
[31m-# *** 提现接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/withdraw[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数: TBD[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/withdraw", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def withdraw():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_withdraw.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-# ***[m
[31m-# *** *** *** 10 *** *** [m
[31m-# *** 提现查询接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/drawrecord[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:TBD[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/drawrecord", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def drawrecord():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_drawrecord.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 11 *** *** [m
[31m-# *** 可提现余额接口[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/drawvalidamount[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:TBD[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/drawvalidamount", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def drawvalidamount():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_drawvalidamount.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 12: not sure whether used *** *** [m
[31m-# *** 支付接口--不发送短验[m
[31m-# *** https://ok.yeepay.com/payapi/api/tzt/directbindpay[m
[31m-# *** HTTP 请求方式:POST[m
[31m-# *** 请求参数:TBD[m
[31m-# ***[m
[31m-@app.route("/payapi/api/tzt/directbindpay", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def directbindpay():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_directbindpay.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 13 *** *** [m
[31m-# *** 交易记录查询[m
[31m-# *** https://ok.yeepay.com/merchant/query_server/pay_single[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,orderid,yborderid,sign[m
[31m-# ***[m
[31m-@app.route("/merchant/query_server/pay_single", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def pay_single():[m
[31m-    if request.method == 'GET':[m
[31m-        json_data = open(mockdir+'/../json/yeepay_pay_single.json')[m
[31m-        return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 14: not used in pay-center *** *** [m
[31m-# *** 获取消费清算对账单记录[m
[31m-# *** https://ok.yeepay.com/merchant/query_server/pay_clear_data[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,startdate,enddate,sign[m
[31m-# ***[m
[31m-# @app.route("/merchant/query_server/pay_clear_data", methods=['GET'])[m
[31m-# @crossdomain(origin='*')[m
[31m-# def pay_clear_data():[m
[31m-#     if request.method == 'GET':[m
[31m-#         json_data = open(mockdir+'/../json/yeepay_pay_clear_data.json')[m
[31m-#         return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 15: not used in pay-center *** *** [m
[31m-# *** 退货退款[m
[31m-# *** https://ok.yeepay.com/merchant/query_server/direct_refund[m
[31m-# *** HTTP 请求方式 :POST[m
[31m-# *** 请求参数:amount,currency,cause,merchantaccount,orderid,origyborderid,sign[m
[31m-# ***[m
[31m-# @app.route("/merchant/query_server/direct_refund", methods=['POST'])[m
[31m-# @crossdomain(origin='*')[m
[31m-# def direct_refund():[m
[31m-#     if request.method == 'POST':[m
[31m-#         json_data = open(mockdir+'/../json/yeepay_direct_refund.json')[m
[31m-#         return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 16: not used in pay-center *** *** [m
[31m-# *** 退货退款记录查询[m
[31m-# *** https://ok.yeepay.com/merchant/query_server/refund_single[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,orderid,yborderid,sign[m
[31m-# ***[m
[31m-# @app.route("/merchant/query_server/refund_single", methods=['GET'])[m
[31m-# @crossdomain(origin='*')[m
[31m-# def refund_single():[m
[31m-#     if request.method == 'GET':[m
[31m-#         json_data = open(mockdir+'/../json/yeepay_refund_single.json')[m
[31m-#         return jsonify(json.load(json_data))[m
[31m-[m
[31m-# ***[m
[31m-# *** *** *** 17: not used in pay-center *** *** [m
[31m-# *** 获取退款清算对账记录[m
[31m-# *** ttps://ok.yeepay.com/merchant/query_server/refund_clear_data[m
[31m-# *** HTTP 请求方式:GET[m
[31m-# *** 请求参数:merchantaccount,startdate,enddate,sign[m
[31m-# ***[m
[31m-# @app.route("/merchant/query_server/refund_clear_data", methods=['GET'])[m
[31m-# @crossdomain(origin='*')[m
[31m-# def refund_clear_data():[m
[31m-#     if request.method == 'GET':[m
[31m-#         json_data = open(mockdir+'/../json/yeepay_refund_clear_data.json')[m
[31m-#         return jsonify(json.load(json_data))[m
[31m-[m
[31m-if __name__ == '__main__':[m
[31m-    # 内部监听使用127.0.0.1[m
[31m-    # app.run(debug=True, host="127.0.0.1", port=9000)[m
[31m-[m
[31m-    # 公开IP监听[m
[31m-    app.run(debug=True, host="0.0.0.0", port=9002)[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/mock/run_mocker.py b/mock/run_mocker.py[m
[1mdeleted file mode 100644[m
[1mindex 2475314..0000000[m
[1m--- a/mock/run_mocker.py[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-#-*- coding: UTF-8 -*-   [m
[31m-import os[m
[31m-from flask import Flask, jsonify, request,json[m
[31m-import mockers[m
[31m-from utils.crossdomain import crossdomain[m
[31m-from mockers.elong_mocker import login[m
[31m-[m
[31m-app = Flask(__name__)[m
[31m-[m
[31m-mockdir = os.path.dirname(os.path.realpath(__file__))[m
[31m-[m
[31m-# ***[m
[31m-# *** 信用钱包：mocker server[m
[31m-# ***[m
[31m-[m
[31m-@app.route("/run", methods=['GET'])[m
[31m-@crossdomain(origin='*')[m
[31m-def loan():[m
[31m-    if request.method == 'GET':[m
[31m-        return jsonify(msg='mocker server is started！', success=True)   [m
[31m-[m
[31m-if __name__ == '__main__':[m
[31m-    app.run(debug=True, host="0.0.0.0", port=9000)[m
[31m-[m
[31m-[m
[1mdiff --git a/mock/utils/__init__.py b/mock/utils/__init__.py[m
[1mdeleted file mode 100644[m
[1mindex 8721591..0000000[m
[1m--- a/mock/utils/__init__.py[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-# from . import crossdomain[m
\ No newline at end of file[m
[1mdiff --git a/mock/utils/__init__.pyc b/mock/utils/__init__.pyc[m
[1mdeleted file mode 100644[m
[1mindex 74b5418..0000000[m
Binary files a/mock/utils/__init__.pyc and /dev/null differ
[1mdiff --git a/mock/utils/crossdomain.py b/mock/utils/crossdomain.py[m
[1mdeleted file mode 100644[m
[1mindex 6964e29..0000000[m
[1m--- a/mock/utils/crossdomain.py[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-from datetime import timedelta[m
[31m-from flask import make_response, request, current_app[m
[31m-from functools import update_wrapper[m
[31m-[m
[31m-def crossdomain(origin=None, methods=None, headers=None,[m
[31m-                max_age=3600, attach_to_all=True,[m
[31m-                automatic_options=True):[m
[31m-    if methods is not None:[m
[31m-        methods = ', '.join(sorted(x.upper() for x in methods))[m
[31m-    if headers is not None and not isinstance(headers, basestring):[m
[31m-        headers = ', '.join(x.upper() for x in headers)[m
[31m-    if not isinstance(origin, basestring):[m
[31m-        origin = ', '.join(origin)[m
[31m-    if isinstance(max_age, timedelta):[m
[31m-        max_age = max_age.total_seconds()[m
[31m-[m
[31m-    def get_methods():[m
[31m-        if methods is not None:[m
[31m-            return methods[m
[31m-[m
[31m-        options_resp = current_app.make_default_options_response()[m
[31m-        return options_resp.headers['allow'][m
[31m-[m
[31m-    def decorator(f):[m
[31m-        def wrapped_function(*args, **kwargs):[m
[31m-            if automatic_options and request.method == 'OPTIONS':[m
[31m-                resp = current_app.make_default_options_response()[m
[31m-            else:[m
[31m-                resp = make_response(f(*args, **kwargs))[m
[31m-            if not attach_to_all and request.method != 'OPTIONS':[m
[31m-                return resp[m
[31m-[m
[31m-            h = resp.headers[m
[31m-[m
[31m-            h['Server'] = 'Apache-Coyote/1.1'[m
[31m-            h['Access-Control-Allow-Origin'] = origin[m
[31m-            h['Access-Control-Allow-Methods'] = get_methods()[m
[31m-            h['Access-Control-Max-Age'] = str(max_age)[m
[31m-            if headers is not None:[m
[31m-                h['Access-Control-Allow-Headers'] = headers[m
[31m-            else:[m
[31m-                 h['Access-Control-Allow-Headers'] = 'Origin, No-Cache, x-auth-token, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type,Authorization'[m
[31m-            return resp[m
[31m-[m
[31m-        f.provide_automatic_options = False[m
[31m-        return update_wrapper(wrapped_function, f)[m
[31m-    return decorator[m
\ No newline at end of file[m
[1mdiff --git a/mock/utils/crossdomain.pyc b/mock/utils/crossdomain.pyc[m
[1mdeleted file mode 100644[m
[1mindex 179c8bf..0000000[m
Binary files a/mock/utils/crossdomain.pyc and /dev/null differ
[1mdiff --git a/py-utils.zip b/py-utils.zip[m
[1mnew file mode 100644[m
[1mindex 0000000..0a9cb68[m
Binary files /dev/null and b/py-utils.zip differ
[1mdiff --git a/py-utils/rsh.py b/py-utils/rsh.py[m
[1mdeleted file mode 100644[m
[1mindex 08cf289..0000000[m
[1m--- a/py-utils/rsh.py[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-import sys[m
[31m-import paramiko[m
[31m-'''[m
[31m-a wrapper for remote shell[m
[31m-usage:[m
[31m-python rsh.py user host password 'commands'[m
[31m-e.g.[m
[31m-python rsh.py root 192.168.192.206 123456 'cd home/quant_group;ls -a'[m
[31m-'''[m
[31m-[m
[31m-if __name__ == '__main__':[m
[31m-    recv_nbytes = 1024[m
[31m-[m
[31m-    args = sys.argv[m
[31m-    host, port, user, password = args[1], int(args[2]), args[3], args[4][m
[31m-    command_begin = 4[m
[31m-    if '--tag=' in args[4]:[m
[31m-        tag = args[4][6:] + ":"[m
[31m-        command_begin += 1[m
[31m-    else:[m
[31m-        tag = ''[m
[31m-        remain_args = ''[m
[31m-    for arg in args[command_begin:]:[m
[31m-        if ' ' not in arg:[m
[31m-            remain_args += ' ' + arg[m
[31m-        else:[m
[31m-            remain_args += ' "' + arg + '" '[m
[31m-    print tag + remain_args[m
[31m-[m
[31m-    def print_err(str_value):[m
[31m-        sys.stderr.write(tag + str_value)[m
[31m-        sys.stderr.flush()[m
[31m-[m
[31m-    def print_out(str_value):[m
[31m-        sys.stdout.write(tag + str_value)[m
[31m-        sys.stdout.flush()[m
[31m-[m
[31m-    client = paramiko.SSHClient()[m
[31m-    client.load_system_host_keys()[m
[31m-    client.get_transport()[m
[31m-    client.set_missing_host_key_policy(paramiko.WarningPolicy())[m
[31m-    client.connect(host, port, user, password)[m
[31m-    transport = client.get_transport()[m
[31m-    channel = transport.open_session(None)[m
[31m-    channel.settimeout(None)[m
[31m-    channel.exec_command(remain_args)[m
[31m-    while True:[m
[31m-        if channel.recv_ready():[m
[31m-            ret_str = channel.recv(recv_nbytes)[m
[31m-            if len(ret_str) == 0:[m
[31m-                break[m
[31m-            print_out(ret_str)[m
[31m-        if channel.recv_stderr_ready():[m
[31m-            ret_str = channel.recv_stderr(recv_nbytes)[m
[31m-            if len(ret_str) == 0:[m
[31m-                break[m
[31m-            print_err(ret_str)[m
[31m-        if channel.exit_status_ready():[m
[31m-            ret_str = channel.recv(recv_nbytes)[m
[31m-            if len(ret_str) != 0:[m
[31m-                print_out(ret_str)[m
[31m-            ret_str = channel.recv_stderr(recv_nbytes)[m
[31m-            if len(ret_str) != 0:[m
[31m-                print_err(ret_str)[m
[31m-            client.close()[m
[31m-            sys.exit(channel.recv_exit_status())[m
[1mdiff --git a/py-utils/scp.py b/py-utils/scp.py[m
[1mdeleted file mode 100644[m
[1mindex 794403e..0000000[m
[1m--- a/py-utils/scp.py[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-__author__ = 'Miraculous'[m
[31m-[m
[31m-import sys[m
[31m-import paramiko[m
[31m-'''[m
[31m-a wrapper for remote scp[m
[31m-usage:[m
[31m-python rscp.py user host password remote_path current_file[m
[31m-'''[m
[31m-if __name__ == '__main__':[m
[31m-    try:[m
[31m-        args = sys.argv[m
[31m-        host, port, user, password = args[1], args[2], args[3], args[4][m
[31m-        file_to_upload = args[5][m
[31m-        remote_path = args[6][m
[31m-        print 'scp: from'+file_to_upload+' to '+remote_path[m
[31m-[m
[31m-        client = paramiko.SSHClient()[m
[31m-        client.load_system_host_keys()[m
[31m-        client.get_transport()[m
[31m-        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())[m
[31m-        client.connect(host, port, user, password)[m
[31m-[m
[31m-        sftp = client.open_sftp()[m
[31m-        sftp.put(file_to_upload, remote_path)[m
[31m-        sftp.close()[m
[31m-        client.close()[m
[31m-        exit(0)[m
[31m-    except Exception, e:[m
[31m-        sys.stderr.write(e.message)[m
[31m-        sys.stderr.flush()[m
[31m-        exit(1)[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/COPYRIGHT b/qa_shell_script/TEMP/openresty-1.9.15.1/COPYRIGHT[m
[1mdeleted file mode 100644[m
[1mindex 0a871c4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/COPYRIGHT[m
[1m+++ /dev/null[m
[36m@@ -1,237 +0,0 @@[m
[31m-Copyright (C) 2009-2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-Copyright (C) 2009-2014, by Xiaozhe Wang (chaoslawful) <chaoslawful@gmail.com>.[m
[31m-[m
[31m-Copyright (C) 2010-2014, by FRiCKLE Piotr Sikora <info@frickle.com>.[m
[31m-[m
[31m-Copyright (C) 2015, by Shuxin Yang.[m
[31m-[m
[31m-Copyright (c) 2010, 2011, Jiale "calio" Zhi <vipcalio@gmail.com>.[m
[31m-[m
[31m-Copyright (C) Guanlan Dai[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-Copyright (c) 2010, Marcus Clyne, Simpl (simpl.it)[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-    * Redistributions of source code must retain the above copyright[m
[31m-      notice, this list of conditions and the following disclaimer.[m
[31m-    * Redistributions in binary form must reproduce the above copyright[m
[31m-      notice, this list of conditions and the following disclaimer in the[m
[31m-      documentation and/or other materials provided with the distribution.[m
[31m-    * Neither the name of the organization (Simpl) nor the[m
[31m-      names of its contributors may be used to endorse or promote products[m
[31m-      derived from this software without specific prior written permission.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND[m
[31m-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED[m
[31m-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE[m
[31m-DISCLAIMED. IN NO EVENT SHALL MARCUS CLYNE OR SIMPL BE LIABLE FOR ANY[m
[31m-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES[m
[31m-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;[m
[31m-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND[m
[31m-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m------------------------------------------------------------------------------[m
[31m-[m
[31m-Copyright (C) 2002-2015 Igor Sysoev[m
[31m-Copyright (C) 2011-2015 Nginx, Inc.[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-1. Redistributions of source code must retain the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer.[m
[31m-2. Redistributions in binary form must reproduce the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer in the[m
[31m-   documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m-SUCH DAMAGE.[m
[31m-[m
[31m------------------------------------------------------------------------------[m
[31m-[m
[31m-NGINX License[m
[31m-[m
[31m-Copyright (C) 2002-2009 Igor Sysoev[m
[31m-Copyright (C) 2009-2013 Sergey A. Osokin[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-1. Redistributions of source code must retain the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer.[m
[31m-2. Redistributions in binary form must reproduce the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer in the[m
[31m-   documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m-ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m-SUCH DAMAGE.[m
[31m-[m
[31m------------------------------------------------------------------------------[m
[31m-[m
[31m-LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/[m
[31m-[m
[31m-Copyright (C) 2005-2015 Mike Pall. All rights reserved.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining a copy[m
[31m-of this software and associated documentation files (the "Software"), to deal[m
[31m-in the Software without restriction, including without limitation the rights[m
[31m-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell[m
[31m-copies of the Software, and to permit persons to whom the Software is[m
[31m-furnished to do so, subject to the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be included in[m
[31m-all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR[m
[31m-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,[m
[31m-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE[m
[31m-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER[m
[31m-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,[m
[31m-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN[m
[31m-THE SOFTWARE.[m
[31m-[m
[31m-[ MIT license: http://www.opensource.org/licenses/mit-license.php ][m
[31m-[m
[31m------------------------------------------------------------------------------[m
[31m-[m
[31m-Lua License[m
[31m-[m
[31m-Copyright (C) 1994-2012 Lua.org, PUC-Rio.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining a copy[m
[31m-of this software and associated documentation files (the "Software"), to deal[m
[31m-in the Software without restriction, including without limitation the rights[m
[31m-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell[m
[31m-copies of the Software, and to permit persons to whom the Software is[m
[31m-furnished to do so, subject to the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be included in[m
[31m-all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR[m
[31m-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,[m
[31m-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE[m
[31m-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER[m
[31m-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,[m
[31m-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN[m
[31m-THE SOFTWARE.[m
[31m-[m
[31m------------------------------------------------------------------------------[m
[31m-[m
[31m-Lua-cjson License[m
[31m-[m
[31m-Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining[m
[31m-a copy of this software and associated documentation files (the[m
[31m-"Software"), to deal in the Software without restriction, including[m
[31m-without limitation the rights to use, copy, modify, merge, publish,[m
[31m-distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-permit persons to whom the Software is furnished to do so, subject to[m
[31m-the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be[m
[31m-included in all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-[m
[31m------------------------------------------------------------------------------[m
[31m-[m
[31m-SHA-1 implementation in NDK[m
[31m-[m
[31m-Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)[m
[31m-All rights reserved.[m
[31m-[m
[31m-This package is an SSL implementation written[m
[31m-by Eric Young (eay@cryptsoft.com).[m
[31m-The implementation was written so as to conform with Netscapes SSL.[m
[31m-[m
[31m-This library is free for commercial and non-commercial use as long as[m
[31m-the following conditions are aheared to.  The following conditions[m
[31m-apply to all code found in this distribution, be it the RC4, RSA,[m
[31m-lhash, DES, etc., code; not just the SSL code.  The SSL documentation[m
[31m-included with this distribution is covered by the same copyright terms[m
[31m-except that the holder is Tim Hudson (tjh@cryptsoft.com).[m
[31m-[m
[31m-Copyright remains Eric Young's, and as such any Copyright notices in[m
[31m-the code are not to be removed.[m
[31m-If this package is used in a product, Eric Young should be given attribution[m
[31m-as the author of the parts of the library used.[m
[31m-This can be in the form of a textual message at program startup or[m
[31m-in documentation (online or textual) provided with the package.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-1. Redistributions of source code must retain the copyright[m
[31m-   notice, this list of conditions and the following disclaimer.[m
[31m-2. Redistributions in binary form must reproduce the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer in the[m
[31m-   documentation and/or other materials provided with the distribution.[m
[31m-3. All advertising materials mentioning features or use of this software[m
[31m-   must display the following acknowledgement:[m
[31m-   "This product includes cryptographic software written by[m
[31m-    Eric Young (eay@cryptsoft.com)"[m
[31m-   The word 'cryptographic' can be left out if the rouines from the library[m
[31m-   being used are not cryptographic related :-).[m
[31m-4. If you include any Windows specific code (or a derivative thereof) from[m
[31m-   the apps directory (application code) you must include an acknowledgement:[m
[31m-   "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND[m
[31m-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m-SUCH DAMAGE.[m
[31m-[m
[31m-The licence and distribution terms for any publically available version or[m
[31m-derivative of this code cannot be changed.  i.e. this code cannot simply be[m
[31m-copied and put under another distribution licence[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 1a36edd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-.PHONY: all install clean[m
[31m-[m
[31m-all:[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517 && $(MAKE) TARGET_STRIP=@: CCDEBUG=-g CC=cc PREFIX=/usr/local/openresty/luajit[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4 && $(MAKE) DESTDIR=$(DESTDIR) LUA_INCLUDE_DIR=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 LUA_CMODULE_DIR=/usr/local/openresty/lualib LUA_MODULE_DIR=/usr/local/openresty/lualib CJSON_CFLAGS="-g -fpic" CC=cc[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12 && $(MAKE) DESTDIR=$(DESTDIR) LUA_INCLUDE_DIR=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 LUA_LIB_DIR=/usr/local/openresty/lualib CC=cc[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06 && $(MAKE) DESTDIR=$(DESTDIR) LUA_INCLUDE_DIR=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 LUA_LIB_DIR=/usr/local/openresty/lualib CC=cc[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15 && $(MAKE)[m
[31m-[m
[31m-install: all[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517 && $(MAKE) install TARGET_STRIP=@: CCDEBUG=-g CC=cc PREFIX=/usr/local/openresty/luajit DESTDIR=$(DESTDIR)[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_INCLUDE_DIR=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 LUA_CMODULE_DIR=/usr/local/openresty/lualib LUA_MODULE_DIR=/usr/local/openresty/lualib CJSON_CFLAGS="-g -fpic" CC=cc[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_INCLUDE_DIR=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 LUA_LIB_DIR=/usr/local/openresty/lualib CC=cc[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_INCLUDE_DIR=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 LUA_LIB_DIR=/usr/local/openresty/lualib CC=cc[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04 && $(MAKE) install DESTDIR=$(DESTDIR) LUA_LIB_DIR=/usr/local/openresty/lualib INSTALL=/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12 && /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/install bin/* $(DESTDIR)/usr/local/openresty/bin/[m
[31m-	cp /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty.index $(DESTDIR)/usr/local/openresty/[m
[31m-	cp -r /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod $(DESTDIR)/usr/local/openresty/[m
[31m-	cd /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15 && $(MAKE) install DESTDIR=$(DESTDIR)[m
[31m-[m
[31m-clean:[m
[31m-	rm -rf build[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/README-win32.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/README-win32.txt[m
[1mdeleted file mode 100644[m
[1mindex 2ced1d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/README-win32.txt[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-Name[m
[31m-    README-win32 - README for the Windows 32-bit build of OpenResty[m
[31m-[m
[31m-Description[m
[31m-    The binary distributions of OpenResty can be downloaded from the[m
[31m-    following web page:[m
[31m-[m
[31m-    https://openresty.org/#Download[m
[31m-[m
[31m-    To start the NGINX server of the nginx server of the Win32 binary[m
[31m-    distribution of OpenResty:[m
[31m-[m
[31m-        start nginx[m
[31m-[m
[31m-    You can also specify the "-p PATH/" option to override the default[m
[31m-    server prefix, as in[m
[31m-[m
[31m-        cd /path/to/my/openresty/app/[m
[31m-        start nginx -p $PWD[m
[31m-[m
[31m-    Then you can use the "tasklist" command to check the nginx processes[m
[31m-    running in the background:[m
[31m-[m
[31m-        C:\> tasklist /fi "imagename eq nginx.exe"[m
[31m-    [m
[31m-        Image Name                     PID Session Name        Session#    Mem Usage[m
[31m-        ========================= ======== ================ =========== ============[m
[31m-        nginx.exe                     4616 Console                    1      7,412 K[m
[31m-        nginx.exe                     5836 Console                    1      7,800 K[m
[31m-[m
[31m-    One of the two processes is the master process while the other is the[m
[31m-    worker.[m
[31m-[m
[31m-    If you are using the MSYS bash instead of the "cmd.exe" console, then[m
[31m-    you should replace the "/fi" option with "-fi" in the command above[m
[31m-    instead.[m
[31m-[m
[31m-    You can quickly shut down the server like this:[m
[31m-[m
[31m-        nginx -s stop[m
[31m-[m
[31m-    or gracefully shut it down like this:[m
[31m-[m
[31m-        nginx -s quit[m
[31m-[m
[31m-    You can also forcibly kill the nginx processes via their PIDs with[m
[31m-    "taskkill", as in[m
[31m-[m
[31m-        C:\> taskkill /pid 5488 /F[m
[31m-[m
[31m-    where the PID (5488 in this example) can be found via the aforementioned[m
[31m-    "tasklist" command.[m
[31m-[m
[31m-    Again, you should use the form "-pid" and "-F" for the options if you[m
[31m-    are in an MSYS bash session.[m
[31m-[m
[31m-    Similarly, you can use the "nginx -s reload" command to reload nginx[m
[31m-    configurations without stopping the server. And you can use "nginx -s[m
[31m-    reopen" to instruct nginx to re-open all the log files.[m
[31m-[m
[31m-    You can run the "resty" script like this:[m
[31m-[m
[31m-        C:\> resty -e "ngx.say('Hello, OpenResty!')"[m
[31m-        Hello, OpenResty![m
[31m-[m
[31m-    The "resty" command-line utility requires a Perl interpreter installed[m
[31m-    in your system and visible to your PATH environment. Any perl[m
[31m-    distributions should work, including StrawberryPerl, ActivePerl, and[m
[31m-    MSYS perl (the former two are recommended though).[m
[31m-[m
[31m-Debugging[m
[31m-    Debug symbosl are enabled even in release builds. So that when things go[m
[31m-    very wrong, one can still debug things with tools like MSYS GDB.[m
[31m-[m
[31m-    Inclusion of debug symbols make the binary files (".exe" and ".dll"[m
[31m-    files) much larger, but it generally will not load into memory during[m
[31m-    normal execution on a modern operating system.[m
[31m-[m
[31m-Caveats[m
[31m-    The Win32 port of the NGINX core supports the good old "select" IO[m
[31m-    multiplexing mechanism only. The I/O Completion Ports (IOCP) feature is[m
[31m-    *not* supported (yet). So do not use this build for production[m
[31m-    environments with very high concurrency levels.[m
[31m-[m
[31m-    This Win32 build of OpenResty is mainly for developers who want to[m
[31m-    develop their applications in native Windows environment (though they[m
[31m-    eventually push the finished work onto a Linux or *BSD box, most of the[m
[31m-    time).[m
[31m-[m
[31m-TODO[m
[31m-    *   Add support for more than one NGINX worker processes.[m
[31m-[m
[31m-    *   Add support for concurrent connections more than 1024.[m
[31m-[m
[31m-    *   Switch to the Microsoft Visual Studio compiler toolchain for better[m
[31m-        performance and easier binary package redistribution.[m
[31m-[m
[31m-    *   Bundle StrawberryPerl to make command-line utilities like "resty"[m
[31m-        work out of the box (without manually installing a Perl).[m
[31m-[m
[31m-    *   Deliver an alternative Win32 binary package built with best debuggin[m
[31m-        capabilities (like enabling NGINX debugging logs, disabling C[m
[31m-        compiler optimizations, and enabling all the assertions and checks).[m
[31m-[m
[31m-    *   Deliver binary packages for 64-bit Windows (Win64).[m
[31m-[m
[31m-Details About The Building Process[m
[31m-    Usually you do not need to worry about how the Win32 binaries were built[m
[31m-    on the maintainers'' side. But if you do, please read on.[m
[31m-[m
[31m-    The Win32 build of OpenResty is currently built via the MinGW/MSYS[m
[31m-    toolchain, including MinGW gcc 4.8.1, MSYS perl, MSYS bash, MSYS make,[m
[31m-    and etc. Basically, it is currently built via the following cmmands:[m
[31m-[m
[31m-        mkdir -p objs/lib || exit 1[m
[31m-        cd objs/lib || exit 1[m
[31m-        ls ../../..[m
[31m-        tar -xf ../../../openssl-1.0.2d.tar.gz[m
[31m-        tar -xf ../../../zlib-1.2.8.tar.gz[m
[31m-        tar -xf ../../../pcre-8.37.tar.gz[m
[31m-        cd ../..[m
[31m-        ./configure --with-cc=gcc \[m
[31m-            --prefix= \[m
[31m-            --with-cc-opt='-DFD_SETSIZE=1024' \[m
[31m-            --with-select_module \[m
[31m-            --with-ipv6 \[m
[31m-            --sbin-path=nginx.exe \[m
[31m-            --with-pcre-jit \[m
[31m-            --with-luajit-xcflags="-DLUAJIT_NUMMODE=2 -DLUAJIT_ENABLE_LUA52COMPAT" \[m
[31m-            --with-pcre=objs/lib/pcre-8.37 \[m
[31m-            --with-zlib=objs/lib/zlib-1.2.8 \[m
[31m-            --with-openssl=objs/lib/openssl-1.0.2d \[m
[31m-            -j5[m
[31m-        make[m
[31m-        make install[m
[31m-[m
[31m-    where the dependency library source tarballs for OpenSSL, Zlib, and PCRE[m
[31m-    are downloaded from their official sites, respectively.[m
[31m-[m
[31m-    We automate these commands in a dedicated shell script named[m
[31m-    build-win32.sh[m
[31m-    <https://github.com/openresty/openresty/blob/master/util/build-win32.sh>[m
[31m-    .[m
[31m-[m
[31m-    Furthermore, we automate the packaging process of the resulting binaries[m
[31m-    and supporting files with this package-win32.sh[m
[31m-    <https://github.com/openresty/openresty/blob/master/util/package-win32.s[m
[31m-    h> script.[m
[31m-[m
[31m-    Usually you can just download and use the binary distribution of[m
[31m-    OpenResty without installing the build toolchain.[m
[31m-[m
[31m-Author[m
[31m-    Yichun "agentzh" Zhang <agentzh@gmail.com>, CloudFlare Inc.[m
[31m-[m
[31m-Copyright & License[m
[31m-    This module is licensed under the BSD license.[m
[31m-[m
[31m-    Copyright (C) 2015-2016, by Yichun "agentzh" Zhang (章亦春)[m
[31m-    <agentzh@gmail.com>, CloudFlare Inc.[m
[31m-[m
[31m-    All rights reserved.[m
[31m-[m
[31m-    Redistribution and use in source and binary forms, with or without[m
[31m-    modification, are permitted provided that the following conditions are[m
[31m-    met:[m
[31m-[m
[31m-    *   Redistributions of source code must retain the above copyright[m
[31m-        notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-    *   Redistributions in binary form must reproduce the above copyright[m
[31m-        notice, this list of conditions and the following disclaimer in the[m
[31m-        documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS[m
[31m-    IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED[m
[31m-    TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A[m
[31m-    PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/README.markdown b/qa_shell_script/TEMP/openresty-1.9.15.1/README.markdown[m
[1mdeleted file mode 100644[m
[1mindex 3813136..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/README.markdown[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-Name[m
[31m-====[m
[31m-[m
[31m-OpenResty - Turning Nginx into a Full-Fledged Scriptable Web Platform[m
[31m-[m
[31m-Table of Contents[m
[31m-=================[m
[31m-[m
[31m-* [Name](#name)[m
[31m-* [Description](#description)[m
[31m-    * [For Users](#for-users)[m
[31m-    * [For Bundle Maintainers](#for-bundle-maintainers)[m
[31m-* [Mailing List](#mailing-list)[m
[31m-* [Report Bugs](#report-bugs)[m
[31m-* [Copyright & License](#copyright--license)[m
[31m-[m
[31m-Description[m
[31m-===========[m
[31m-[m
[31m-OpenResty is a full-fledged web application server by bundling the standard nginx core,[m
[31m-lots of 3rd-party nginx modules, as well as most of their external dependencies.[m
[31m-[m
[31m-This bundle is maintained Yichun Zhang (agentzh).[m
[31m-[m
[31m-Because most of the nginx modules are developed by the bundle maintainers, it can ensure[m
[31m-that all these modules are played well together.[m
[31m-[m
[31m-The bundled software components are copyrighted by the respective copyright holders.[m
[31m-[m
[31m-The homepage for this project is http://openresty.org.[m
[31m-[m
[31m-For Users[m
[31m----------[m
[31m-[m
[31m-Visit http://openresty.org/#Download to download the latest bundle tarball, and[m
[31m-follow the installation instructions in the page http://openresty.org/#Installation.[m
[31m-[m
[31m-For Bundle Maintainers[m
[31m-----------------------[m
[31m-[m
[31m-The bundle's source is at the following git repository:[m
[31m-[m
[31m-https://github.com/openresty/openresty[m
[31m-[m
[31m-To reproduce the bundle tarball, just do[m
[31m-[m
[31m-```bash[m
[31m-make[m
[31m-```[m
[31m-[m
[31m-at the top of the bundle source tree.[m
[31m-[m
[31m-Please note that you may need to install some extra dependencies, like `perl` and `dos2unix`.[m
[31m-On Fedora 22, for example, installing the dependencies[m
[31m-is as simple as running the following commands:[m
[31m-[m
[31m-```bash[m
[31m-sudo dnf install perl dos2unix[m
[31m-```[m
[31m-[m
[31m-[Back to TOC](#table-of-contents)[m
[31m-[m
[31m-Mailing List[m
[31m-============[m
[31m-[m
[31m-You're very welcome to join the English OpenResty mailing list hosted on Google Groups:[m
[31m-[m
[31m-https://groups.google.com/group/openresty-en[m
[31m-[m
[31m-The Chinese mailing list is here:[m
[31m-[m
[31m-https://groups.google.com/group/openresty[m
[31m-[m
[31m-[Back to TOC](#table-of-contents)[m
[31m-[m
[31m-Report Bugs[m
[31m-===========[m
[31m-[m
[31m-You're very welcome to report issues on GitHub:[m
[31m-[m
[31m-https://github.com/openresty/openresty/issues[m
[31m-[m
[31m-[Back to TOC](#table-of-contents)[m
[31m-[m
[31m-Copyright & License[m
[31m-===================[m
[31m-[m
[31m-The bundle itself is licensed under the 2-clause BSD license.[m
[31m-[m
[31m-Copyright (c) 2011-2016, Yichun "agentzh" Zhang (章亦春) <agentzh@gmail.com>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are[m
[31m-met:[m
[31m-[m
[31m-* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS[m
[31m-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED[m
[31m-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A[m
[31m-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[Back to TOC](#table-of-contents)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 9dd51e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-*.[oa][m
[31m-*.so[m
[31m-*.obj[m
[31m-*.lib[m
[31m-*.exp[m
[31m-*.dll[m
[31m-*.exe[m
[31m-*.manifest[m
[31m-*.dmp[m
[31m-*.swp[m
[31m-.tags[m
[31m-*~[m
[31m-tags[m
[31m-*.swo[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/COPYRIGHT b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/COPYRIGHT[m
[1mdeleted file mode 100644[m
[1mindex b614d3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/COPYRIGHT[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-===============================================================================[m
[31m-LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/[m
[31m-[m
[31m-Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining a copy[m
[31m-of this software and associated documentation files (the "Software"), to deal[m
[31m-in the Software without restriction, including without limitation the rights[m
[31m-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell[m
[31m-copies of the Software, and to permit persons to whom the Software is[m
[31m-furnished to do so, subject to the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be included in[m
[31m-all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR[m
[31m-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,[m
[31m-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE[m
[31m-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER[m
[31m-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,[m
[31m-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN[m
[31m-THE SOFTWARE.[m
[31m-[m
[31m-[ MIT license: http://www.opensource.org/licenses/mit-license.php ][m
[31m-[m
[31m-===============================================================================[m
[31m-[ LuaJIT includes code from Lua 5.1/5.2, which has this license statement: ][m
[31m-[m
[31m-Copyright (C) 1994-2012 Lua.org, PUC-Rio.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining a copy[m
[31m-of this software and associated documentation files (the "Software"), to deal[m
[31m-in the Software without restriction, including without limitation the rights[m
[31m-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell[m
[31m-copies of the Software, and to permit persons to whom the Software is[m
[31m-furnished to do so, subject to the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be included in[m
[31m-all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR[m
[31m-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,[m
[31m-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE[m
[31m-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER[m
[31m-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,[m
[31m-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN[m
[31m-THE SOFTWARE.[m
[31m-[m
[31m-===============================================================================[m
[31m-[ LuaJIT includes code from dlmalloc, which has this license statement: ][m
[31m-[m
[31m-This is a version (aka dlmalloc) of malloc/free/realloc written by[m
[31m-Doug Lea and released to the public domain, as explained at[m
[31m-http://creativecommons.org/licenses/publicdomain[m
[31m-[m
[31m-===============================================================================[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 165d7ea..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,160 +0,0 @@[m
[31m-##############################################################################[m
[31m-# LuaJIT top level Makefile for installation. Requires GNU Make.[m
[31m-#[m
[31m-# Please read doc/install.html before changing any variables![m
[31m-#[m
[31m-# Suitable for POSIX platforms (Linux, *BSD, OSX etc.).[m
[31m-# Note: src/Makefile has many more configurable options.[m
[31m-#[m
[31m-# ##### This Makefile is NOT useful for Windows! #####[m
[31m-# For MSVC, please follow the instructions given in src/msvcbuild.bat.[m
[31m-# For MinGW and Cygwin, cd to src and run make with the Makefile there.[m
[31m-#[m
[31m-# Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-##############################################################################[m
[31m-[m
[31m-MAJVER=  2[m
[31m-MINVER=  1[m
[31m-RELVER=  0[m
[31m-PREREL=  -beta2[m
[31m-VERSION= $(MAJVER).$(MINVER).$(RELVER)$(PREREL)[m
[31m-ABIVER=  5.1[m
[31m-[m
[31m-##############################################################################[m
[31m-#[m
[31m-# Change the installation path as needed. This automatically adjusts[m
[31m-# the paths in src/luaconf.h, too. Note: PREFIX must be an absolute path![m
[31m-#[m
[31m-export PREFIX= /usr/local[m
[31m-export MULTILIB= lib[m
[31m-##############################################################################[m
[31m-[m
[31m-DPREFIX= $(DESTDIR)$(PREFIX)[m
[31m-INSTALL_BIN=   $(DPREFIX)/bin[m
[31m-INSTALL_LIB=   $(DPREFIX)/$(MULTILIB)[m
[31m-INSTALL_SHARE= $(DPREFIX)/share[m
[31m-INSTALL_INC=   $(DPREFIX)/include/luajit-$(MAJVER).$(MINVER)[m
[31m-[m
[31m-INSTALL_LJLIBD= $(INSTALL_SHARE)/luajit-$(VERSION)[m
[31m-INSTALL_JITLIB= $(INSTALL_LJLIBD)/jit[m
[31m-INSTALL_LMODD= $(INSTALL_SHARE)/lua[m
[31m-INSTALL_LMOD= $(INSTALL_LMODD)/$(ABIVER)[m
[31m-INSTALL_CMODD= $(INSTALL_LIB)/lua[m
[31m-INSTALL_CMOD= $(INSTALL_CMODD)/$(ABIVER)[m
[31m-INSTALL_MAN= $(INSTALL_SHARE)/man/man1[m
[31m-INSTALL_PKGCONFIG= $(INSTALL_LIB)/pkgconfig[m
[31m-[m
[31m-INSTALL_TNAME= luajit-$(VERSION)[m
[31m-INSTALL_TSYMNAME= luajit[m
[31m-INSTALL_ANAME= libluajit-$(ABIVER).a[m
[31m-INSTALL_SOSHORT1= libluajit-$(ABIVER).so[m
[31m-INSTALL_SOSHORT2= libluajit-$(ABIVER).so.$(MAJVER)[m
[31m-INSTALL_SONAME= $(INSTALL_SOSHORT2).$(MINVER).$(RELVER)[m
[31m-INSTALL_DYLIBSHORT1= libluajit-$(ABIVER).dylib[m
[31m-INSTALL_DYLIBSHORT2= libluajit-$(ABIVER).$(MAJVER).dylib[m
[31m-INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).$(MINVER).$(RELVER).dylib[m
[31m-INSTALL_PCNAME= luajit.pc[m
[31m-[m
[31m-INSTALL_STATIC= $(INSTALL_LIB)/$(INSTALL_ANAME)[m
[31m-INSTALL_DYN= $(INSTALL_LIB)/$(INSTALL_SONAME)[m
[31m-INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_SOSHORT1)[m
[31m-INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_SOSHORT2)[m
[31m-INSTALL_T= $(INSTALL_BIN)/$(INSTALL_TNAME)[m
[31m-INSTALL_TSYM= $(INSTALL_BIN)/$(INSTALL_TSYMNAME)[m
[31m-INSTALL_PC= $(INSTALL_PKGCONFIG)/$(INSTALL_PCNAME)[m
[31m-[m
[31m-INSTALL_DIRS= $(INSTALL_BIN) $(INSTALL_LIB) $(INSTALL_INC) $(INSTALL_MAN) \[m
[31m-  $(INSTALL_PKGCONFIG) $(INSTALL_JITLIB) $(INSTALL_LMOD) $(INSTALL_CMOD)[m
[31m-UNINSTALL_DIRS= $(INSTALL_JITLIB) $(INSTALL_LJLIBD) $(INSTALL_INC) \[m
[31m-  $(INSTALL_LMOD) $(INSTALL_LMODD) $(INSTALL_CMOD) $(INSTALL_CMODD)[m
[31m-[m
[31m-RM= rm -f[m
[31m-MKDIR= mkdir -p[m
[31m-RMDIR= rmdir 2>/dev/null[m
[31m-SYMLINK= ln -sf[m
[31m-INSTALL_X= install -m 0755[m
[31m-INSTALL_F= install -m 0644[m
[31m-UNINSTALL= $(RM)[m
[31m-LDCONFIG= ldconfig -n[m
[31m-SED_PC= sed -e "s|^prefix=.*|prefix=$(PREFIX)|" \[m
[31m-            -e "s|^multilib=.*|multilib=$(MULTILIB)|"[m
[31m-[m
[31m-FILE_T= luajit[m
[31m-FILE_A= libluajit.a[m
[31m-FILE_SO= libluajit.so[m
[31m-FILE_MAN= luajit.1[m
[31m-FILE_PC= luajit.pc[m
[31m-FILES_INC= lua.h lualib.h lauxlib.h luaconf.h lua.hpp luajit.h[m
[31m-FILES_JITLIB= bc.lua bcsave.lua dump.lua p.lua v.lua zone.lua \[m
[31m-	      dis_x86.lua dis_x64.lua dis_arm.lua dis_ppc.lua \[m
[31m-	      dis_mips.lua dis_mipsel.lua vmdef.lua[m
[31m-[m
[31m-ifeq (,$(findstring Windows,$(OS)))[m
[31m-  HOST_SYS:= $(shell uname -s)[m
[31m-else[m
[31m-  HOST_SYS= Windows[m
[31m-endif[m
[31m-TARGET_SYS?= $(HOST_SYS)[m
[31m-[m
[31m-ifeq (Darwin,$(TARGET_SYS))[m
[31m-  INSTALL_SONAME= $(INSTALL_DYLIBNAME)[m
[31m-  INSTALL_SOSHORT1= $(INSTALL_DYLIBSHORT1)[m
[31m-  INSTALL_SOSHORT2= $(INSTALL_DYLIBSHORT2)[m
[31m-  LDCONFIG= :[m
[31m-endif[m
[31m-[m
[31m-##############################################################################[m
[31m-[m
[31m-INSTALL_DEP= src/luajit[m
[31m-[m
[31m-default all $(INSTALL_DEP):[m
[31m-	@echo "==== Building LuaJIT $(VERSION) ===="[m
[31m-	$(MAKE) -C src[m
[31m-	@echo "==== Successfully built LuaJIT $(VERSION) ===="[m
[31m-[m
[31m-install: $(INSTALL_DEP)[m
[31m-	@echo "==== Installing LuaJIT $(VERSION) to $(PREFIX) ===="[m
[31m-	$(MKDIR) $(INSTALL_DIRS)[m
[31m-	cd src && $(INSTALL_X) $(FILE_T) $(INSTALL_T)[m
[31m-	cd src && test -f $(FILE_A) && $(INSTALL_F) $(FILE_A) $(INSTALL_STATIC) || :[m
[31m-	$(RM) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2)[m
[31m-	cd src && test -f $(FILE_SO) && \[m
[31m-	  $(INSTALL_X) $(FILE_SO) $(INSTALL_DYN) && \[m
[31m-	  $(LDCONFIG) $(INSTALL_LIB) && \[m
[31m-	  $(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT1) && \[m
[31m-	  $(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT2) || :[m
[31m-	cd etc && $(INSTALL_F) $(FILE_MAN) $(INSTALL_MAN)[m
[31m-	cd etc && $(SED_PC) $(FILE_PC) > $(FILE_PC).tmp && \[m
[31m-	  $(INSTALL_F) $(FILE_PC).tmp $(INSTALL_PC) && \[m
[31m-	  $(RM) $(FILE_PC).tmp[m
[31m-	cd src && $(INSTALL_F) $(FILES_INC) $(INSTALL_INC)[m
[31m-	cd src/jit && $(INSTALL_F) $(FILES_JITLIB) $(INSTALL_JITLIB)[m
[31m-	$(SYMLINK) $(INSTALL_TNAME) $(INSTALL_TSYM)[m
[31m-	@echo "==== Successfully installed LuaJIT $(VERSION) to $(PREFIX) ===="[m
[31m-[m
[31m-[m
[31m-uninstall:[m
[31m-	@echo "==== Uninstalling LuaJIT $(VERSION) from $(PREFIX) ===="[m
[31m-	$(UNINSTALL) $(INSTALL_T) $(INSTALL_STATIC) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2) $(INSTALL_MAN)/$(FILE_MAN) $(INSTALL_PC)[m
[31m-	for file in $(FILES_JITLIB); do \[m
[31m-	  $(UNINSTALL) $(INSTALL_JITLIB)/$$file; \[m
[31m-	  done[m
[31m-	for file in $(FILES_INC); do \[m
[31m-	  $(UNINSTALL) $(INSTALL_INC)/$$file; \[m
[31m-	  done[m
[31m-	$(LDCONFIG) $(INSTALL_LIB)[m
[31m-	$(RMDIR) $(UNINSTALL_DIRS) || :[m
[31m-	@echo "==== Successfully uninstalled LuaJIT $(VERSION) from $(PREFIX) ===="[m
[31m-[m
[31m-##############################################################################[m
[31m-[m
[31m-amalg:[m
[31m-	@echo "Building LuaJIT $(VERSION)"[m
[31m-	$(MAKE) -C src amalg[m
[31m-[m
[31m-clean:[m
[31m-	$(MAKE) -C src clean[m
[31m-[m
[31m-.PHONY: all install amalg clean[m
[31m-[m
[31m-##############################################################################[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/README[m
[1mdeleted file mode 100644[m
[1mindex 01fd4a0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/README[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-README for LuaJIT 2.1.0-beta2[m
[31m------------------------------[m
[31m-[m
[31m-LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming language.[m
[31m-[m
[31m-Project Homepage: http://luajit.org/[m
[31m-[m
[31m-LuaJIT is Copyright (C) 2005-2016 Mike Pall.[m
[31m-LuaJIT is free software, released under the MIT license.[m
[31m-See full Copyright Notice in the COPYRIGHT file or in luajit.h.[m
[31m-[m
[31m-Documentation for LuaJIT is available in HTML format.[m
[31m-Please point your favorite browser to:[m
[31m-[m
[31m- doc/luajit.html[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/bluequad-print.css b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/bluequad-print.css[m
[1mdeleted file mode 100644[m
[1mindex 975a55b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/bluequad-print.css[m
[1m+++ /dev/null[m
[36m@@ -1,166 +0,0 @@[m
[31m-/* Copyright (C) 2004-2016 Mike Pall.[m
[31m- *[m
[31m- * You are welcome to use the general ideas of this design for your own sites.[m
[31m- * But please do not steal the stylesheet, the layout or the color scheme.[m
[31m- */[m
[31m-body {[m
[31m-  font-family: serif;[m
[31m-  font-size: 11pt;[m
[31m-  margin: 0 3em;[m
[31m-  padding: 0;[m
[31m-  border: none;[m
[31m-}[m
[31m-a:link, a:visited, a:hover, a:active {[m
[31m-  text-decoration: none;[m
[31m-  background: transparent;[m
[31m-  color: #0000ff;[m
[31m-}[m
[31m-h1, h2, h3 {[m
[31m-  font-family: sans-serif;[m
[31m-  font-weight: bold;[m
[31m-  text-align: left;[m
[31m-  margin: 0.5em 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-h1 {[m
[31m-  font-size: 200%;[m
[31m-}[m
[31m-h2 {[m
[31m-  font-size: 150%;[m
[31m-}[m
[31m-h3 {[m
[31m-  font-size: 125%;[m
[31m-}[m
[31m-p {[m
[31m-  margin: 0 0 0.5em 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-ul, ol {[m
[31m-  margin: 0.5em 0;[m
[31m-  padding: 0 0 0 2em;[m
[31m-}[m
[31m-ul {[m
[31m-  list-style: outside square;[m
[31m-}[m
[31m-ol {[m
[31m-  list-style: outside decimal;[m
[31m-}[m
[31m-li {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-dl {[m
[31m-  margin: 1em 0;[m
[31m-  padding: 1em;[m
[31m-  border: 1px solid black;[m
[31m-}[m
[31m-dt {[m
[31m-  font-weight: bold;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-dt sup {[m
[31m-  float: right;[m
[31m-  margin-left: 1em;[m
[31m-}[m
[31m-dd {[m
[31m-  margin: 0.5em 0 0 2em;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-table {[m
[31m-  table-layout: fixed;[m
[31m-  width: 100%;[m
[31m-  margin: 1em 0;[m
[31m-  padding: 0;[m
[31m-  border: 1px solid black;[m
[31m-  border-spacing: 0;[m
[31m-  border-collapse: collapse;[m
[31m-}[m
[31m-tr {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-  border: none;[m
[31m-}[m
[31m-td {[m
[31m-  text-align: left;[m
[31m-  margin: 0;[m
[31m-  padding: 0.2em 0.5em;[m
[31m-  border-top: 1px solid black;[m
[31m-  border-bottom: 1px solid black;[m
[31m-}[m
[31m-tr.separate td {[m
[31m-  border-top: double;[m
[31m-}[m
[31m-tt, pre, code, kbd, samp {[m
[31m-  font-family: monospace;[m
[31m-  font-size: 75%;[m
[31m-}[m
[31m-kbd {[m
[31m-  font-weight: bolder;[m
[31m-}[m
[31m-blockquote, pre {[m
[31m-  margin: 1em 2em;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-img {[m
[31m-  border: none;[m
[31m-  vertical-align: baseline;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-img.left {[m
[31m-  float: left;[m
[31m-  margin: 0.5em 1em 0.5em 0;[m
[31m-}[m
[31m-img.right {[m
[31m-  float: right;[m
[31m-  margin: 0.5em 0 0.5em 1em;[m
[31m-}[m
[31m-.flush {[m
[31m-  clear: both;[m
[31m-  visibility: hidden;[m
[31m-}[m
[31m-.hide, .noprint, #nav {[m
[31m-  display: none !important;[m
[31m-}[m
[31m-.pagebreak {[m
[31m-  page-break-before: always;[m
[31m-}[m
[31m-#site {[m
[31m-  text-align: right;[m
[31m-  font-family: sans-serif;[m
[31m-  font-weight: bold;[m
[31m-  margin: 0 1em;[m
[31m-  border-bottom: 1pt solid black;[m
[31m-}[m
[31m-#site a {[m
[31m-  font-size: 1.2em;[m
[31m-}[m
[31m-#site a:link, #site a:visited {[m
[31m-  text-decoration: none;[m
[31m-  font-weight: bold;[m
[31m-  background: transparent;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#logo {[m
[31m-  color: #ff8000;[m
[31m-}[m
[31m-#head {[m
[31m-  clear: both;[m
[31m-  margin: 0 1em;[m
[31m-}[m
[31m-#main {[m
[31m-  line-height: 1.3;[m
[31m-  text-align: justify;[m
[31m-  margin: 1em;[m
[31m-}[m
[31m-#foot {[m
[31m-  clear: both;[m
[31m-  font-size: 80%;[m
[31m-  text-align: center;[m
[31m-  margin: 0 1.25em;[m
[31m-  padding: 0.5em 0 0 0;[m
[31m-  border-top: 1pt solid black;[m
[31m-  page-break-before: avoid;[m
[31m-  page-break-after: avoid;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/bluequad.css b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/bluequad.css[m
[1mdeleted file mode 100644[m
[1mindex 5dca906..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/bluequad.css[m
[1m+++ /dev/null[m
[36m@@ -1,325 +0,0 @@[m
[31m-/* Copyright (C) 2004-2016 Mike Pall.[m
[31m- *[m
[31m- * You are welcome to use the general ideas of this design for your own sites.[m
[31m- * But please do not steal the stylesheet, the layout or the color scheme.[m
[31m- */[m
[31m-/* colorscheme:[m
[31m- *[m
[31m- * site  |  head   #4162bf/white   | #6078bf/#e6ecff[m
[31m- * ------+------   ----------------+-------------------[m
[31m- * nav   |  main   #bfcfff         | #e6ecff/black[m
[31m- *[m
[31m- * nav:  hiback   loback     #c5d5ff #b9c9f9[m
[31m- *       hiborder loborder   #e6ecff #97a7d7[m
[31m- *       link     hover      #2142bf #ff0000[m
[31m- *[m
[31m- * link: link visited hover  #2142bf #8122bf #ff0000[m
[31m- *[m
[31m- * main: boxback  boxborder  #f0f4ff #bfcfff[m
[31m- */[m
[31m-body {[m
[31m-  font-family: Verdana, Arial, Helvetica, sans-serif;[m
[31m-  font-size: 10pt;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-  border: none;[m
[31m-  background: #e0e0e0;[m
[31m-  color: #000000;[m
[31m-}[m
[31m-a:link {[m
[31m-  text-decoration: none;[m
[31m-  background: transparent;[m
[31m-  color: #2142bf;[m
[31m-}[m
[31m-a:visited {[m
[31m-  text-decoration: none;[m
[31m-  background: transparent;[m
[31m-  color: #8122bf;[m
[31m-}[m
[31m-a:hover, a:active {[m
[31m-  text-decoration: underline;[m
[31m-  background: transparent;[m
[31m-  color: #ff0000;[m
[31m-}[m
[31m-h1, h2, h3 {[m
[31m-  font-weight: bold;[m
[31m-  text-align: left;[m
[31m-  margin: 0.5em 0;[m
[31m-  padding: 0;[m
[31m-  background: transparent;[m
[31m-}[m
[31m-h1 {[m
[31m-  font-size: 200%;[m
[31m-  line-height: 3em; /* really 6em relative to body, match #site span */[m
[31m-  margin: 0;[m
[31m-}[m
[31m-h2 {[m
[31m-  font-size: 150%;[m
[31m-  color: #606060;[m
[31m-}[m
[31m-h3 {[m
[31m-  font-size: 125%;[m
[31m-  color: #404040;[m
[31m-}[m
[31m-p {[m
[31m-  max-width: 600px;[m
[31m-  margin: 0 0 0.5em 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-b {[m
[31m-  color: #404040;[m
[31m-}[m
[31m-ul, ol {[m
[31m-  max-width: 600px;[m
[31m-  margin: 0.5em 0;[m
[31m-  padding: 0 0 0 2em;[m
[31m-}[m
[31m-ul {[m
[31m-  list-style: outside square;[m
[31m-}[m
[31m-ol {[m
[31m-  list-style: outside decimal;[m
[31m-}[m
[31m-li {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-dl {[m
[31m-  max-width: 600px;[m
[31m-  margin: 1em 0;[m
[31m-  padding: 1em;[m
[31m-  border: 1px solid #bfcfff;[m
[31m-  background: #f0f4ff;[m
[31m-}[m
[31m-dt {[m
[31m-  font-weight: bold;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-dt sup {[m
[31m-  float: right;[m
[31m-  margin-left: 1em;[m
[31m-  color: #808080;[m
[31m-}[m
[31m-dt a:visited {[m
[31m-  text-decoration: none;[m
[31m-  color: #2142bf;[m
[31m-}[m
[31m-dt a:hover, dt a:active {[m
[31m-  text-decoration: none;[m
[31m-  color: #ff0000;[m
[31m-}[m
[31m-dd {[m
[31m-  margin: 0.5em 0 0 2em;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-div.tablewrap { /* for IE *sigh* */[m
[31m-  max-width: 600px;[m
[31m-}[m
[31m-table {[m
[31m-  table-layout: fixed;[m
[31m-  border-spacing: 0;[m
[31m-  border-collapse: collapse;[m
[31m-  max-width: 600px;[m
[31m-  width: 100%;[m
[31m-  margin: 1em 0;[m
[31m-  padding: 0;[m
[31m-  border: 1px solid #bfcfff;[m
[31m-}[m
[31m-tr {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-  border: none;[m
[31m-}[m
[31m-tr.odd {[m
[31m-  background: #f0f4ff;[m
[31m-}[m
[31m-tr.separate td {[m
[31m-  border-top: 1px solid #bfcfff;[m
[31m-}[m
[31m-td {[m
[31m-  text-align: left;[m
[31m-  margin: 0;[m
[31m-  padding: 0.2em 0.5em;[m
[31m-  border: none;[m
[31m-}[m
[31m-tt, code, kbd, samp {[m
[31m-  font-family: Courier New, Courier, monospace;[m
[31m-  line-height: 1.2;[m
[31m-  font-size: 110%;[m
[31m-}[m
[31m-kbd {[m
[31m-  font-weight: bolder;[m
[31m-}[m
[31m-blockquote, pre {[m
[31m-  max-width: 600px;[m
[31m-  margin: 1em 2em;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-pre {[m
[31m-  line-height: 1.1;[m
[31m-}[m
[31m-pre.code {[m
[31m-  line-height: 1.4;[m
[31m-  margin: 0.5em 0 1em 0.5em;[m
[31m-  padding: 0.5em 1em;[m
[31m-  border: 1px solid #bfcfff;[m
[31m-  background: #f0f4ff;[m
[31m-}[m
[31m-pre.mark {[m
[31m-  padding-left: 2em;[m
[31m-}[m
[31m-span.codemark {[m
[31m-  position:absolute;[m
[31m-  left: 16em;[m
[31m-  color: #4040c0;[m
[31m-}[m
[31m-span.mark {[m
[31m-  color: #4040c0;[m
[31m-  font-family: Courier New, Courier, monospace;[m
[31m-  line-height: 1.1;[m
[31m-}[m
[31m-img {[m
[31m-  border: none;[m
[31m-  vertical-align: baseline;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-img.left {[m
[31m-  float: left;[m
[31m-  margin: 0.5em 1em 0.5em 0;[m
[31m-}[m
[31m-img.right {[m
[31m-  float: right;[m
[31m-  margin: 0.5em 0 0.5em 1em;[m
[31m-}[m
[31m-.indent {[m
[31m-  padding-left: 1em;[m
[31m-}[m
[31m-.flush {[m
[31m-  clear: both;[m
[31m-  visibility: hidden;[m
[31m-}[m
[31m-.hide, .noscreen {[m
[31m-  display: none !important;[m
[31m-}[m
[31m-.ext {[m
[31m-  color: #ff8000;[m
[31m-}[m
[31m-.new {[m
[31m-  font-size: 6pt;[m
[31m-  vertical-align: middle;[m
[31m-  background: #ff8000;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#site {[m
[31m-  clear: both;[m
[31m-  float: left;[m
[31m-  width: 13em;[m
[31m-  text-align: center;[m
[31m-  font-weight: bold;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-  background: transparent;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#site a {[m
[31m-  font-size: 200%;[m
[31m-}[m
[31m-#site a:link, #site a:visited {[m
[31m-  text-decoration: none;[m
[31m-  font-weight: bold;[m
[31m-  background: transparent;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#site span {[m
[31m-  line-height: 3em; /* really 6em relative to body, match h1 */[m
[31m-}[m
[31m-#logo {[m
[31m-  color: #ffb380;[m
[31m-}[m
[31m-#head {[m
[31m-  margin: 0;[m
[31m-  padding: 0 0 0 2em;[m
[31m-  border-left: solid 13em #4162bf;[m
[31m-  border-right: solid 3em #6078bf;[m
[31m-  background: #6078bf;[m
[31m-  color: #e6ecff;[m
[31m-}[m
[31m-#nav {[m
[31m-  clear: both;[m
[31m-  float: left;[m
[31m-  overflow: hidden;[m
[31m-  text-align: left;[m
[31m-  line-height: 1.5;[m
[31m-  width: 13em;[m
[31m-  padding-top: 1em;[m
[31m-  background: transparent;[m
[31m-}[m
[31m-#nav ul {[m
[31m-  list-style: none outside;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-#nav li {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-#nav a {[m
[31m-  display: block;[m
[31m-  text-decoration: none;[m
[31m-  font-weight: bold;[m
[31m-  margin: 0;[m
[31m-  padding: 2px 1em;[m
[31m-  border-top: 1px solid transparent;[m
[31m-  border-bottom: 1px solid transparent;[m
[31m-  background: transparent;[m
[31m-  color: #2142bf;[m
[31m-}[m
[31m-#nav a:hover, #nav a:active {[m
[31m-  text-decoration: none;[m
[31m-  border-top: 1px solid #97a7d7;[m
[31m-  border-bottom: 1px solid #e6ecff;[m
[31m-  background: #b9c9f9;[m
[31m-  color: #ff0000;[m
[31m-}[m
[31m-#nav a.current, #nav a.current:hover, #nav a.current:active {[m
[31m-  border-top: 1px solid #e6ecff;[m
[31m-  border-bottom: 1px solid #97a7d7;[m
[31m-  background: #c5d5ff;[m
[31m-  color: #2142bf;[m
[31m-}[m
[31m-#nav ul ul a {[m
[31m-  padding: 0 1em 0 1.7em;[m
[31m-}[m
[31m-#nav ul ul ul a {[m
[31m-  padding: 0 0.5em 0 2.4em;[m
[31m-}[m
[31m-#main {[m
[31m-  line-height: 1.5;[m
[31m-  text-align: left;[m
[31m-  margin: 0;[m
[31m-  padding: 1em 2em;[m
[31m-  border-left: solid 13em #bfcfff;[m
[31m-  border-right: solid 3em #e6ecff;[m
[31m-  background: #e6ecff;[m
[31m-}[m
[31m-#foot {[m
[31m-  clear: both;[m
[31m-  font-size: 80%;[m
[31m-  text-align: center;[m
[31m-  margin: 0;[m
[31m-  padding: 0.5em;[m
[31m-  background: #6078bf;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#foot a:link, #foot a:visited {[m
[31m-  text-decoration: underline;[m
[31m-  background: transparent;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#foot a:hover, #foot a:active {[m
[31m-  text-decoration: underline;[m
[31m-  background: transparent;[m
[31m-  color: #bfcfff;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/changes.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/changes.html[m
[1mdeleted file mode 100644[m
[1mindex 9684d7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/changes.html[m
[1m+++ /dev/null[m
[36m@@ -1,817 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>LuaJIT Change History</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-div.major { max-width: 600px; padding: 1em; margin: 1em 0 1em 0; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>LuaJIT Change History</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a class="current" href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-This is a list of changes between the released versions of LuaJIT.<br>[m
[31m-The current <span style="color: #0000c0;">stable version</span> is <strong>LuaJIT&nbsp;2.0.4</strong>.<br>[m
[31m-</p>[m
[31m-<p>[m
[31m-Please check the[m
[31m-<a href="http://luajit.org/changes.html"><span class="ext">&raquo;</span>&nbsp;Online Change History</a>[m
[31m-to see whether newer versions are available.[m
[31m-</p>[m
[31m-[m
[31m-<div class="major" style="background: #d0d0ff;">[m
[31m-<h2 id="LuaJIT-2.1.0-beta2">LuaJIT 2.1.0-beta2 &mdash; 2016-03-03</h2>[m
[31m-<ul>[m
[31m-<li>Enable trace stitching.</li>[m
[31m-<li>Use internal implementation for converting FP numbers to strings.</li>[m
[31m-<li>Parse Unicode escape <tt>'\u{XX...}'</tt> in string literals.</li>[m
[31m-<li>Add MIPS soft-float support.</li>[m
[31m-<li>Switch MIPS port to dual-number mode.</li>[m
[31m-<li>x86/x64: Add support for AES-NI, AVX and AVX2 to DynASM.</li>[m
[31m-<li>FFI: Add <tt>ssize_t</tt> declaration.</li>[m
[31m-<li>FFI: Parse <tt>#line NN</tt> and <tt>#NN</tt>.</li>[m
[31m-<li>Various minor fixes.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.1.0-beta1">LuaJIT 2.1.0-beta1 &mdash; 2015-08-25</h2>[m
[31m-<p>[m
[31m-This is a brief summary of the major changes in LuaJIT 2.1 compared to 2.0.[m
[31m-Please take a look at the commit history for more details.[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>Changes to the VM core:[m
[31m-<ul>[m
[31m-<li>Add low-overhead profiler (<tt>-jp</tt>).</li>[m
[31m-<li>Add <tt>LJ_GC64</tt> mode: 64 bit GC object references (really: 47 bit). Interpreter-only for now.</li>[m
[31m-<li>Add <tt>LJ_FR2</tt> mode: Two-slot frame info. Required by <tt>LJ_GC64</tt> mode.</li>[m
[31m-<li>Add <tt>table.new()</tt> and <tt>table.clear()</tt>.</li>[m
[31m-<li>Parse binary number literals (<tt>0bxxx</tt>).</li>[m
[31m-</ul></li>[m
[31m-<li>Improvements to the JIT compiler:[m
[31m-<ul>[m
[31m-<li>Add trace stitching (disabled for now).</li>[m
[31m-<li>Compile various builtins: <tt>string.char()</tt>, <tt>string.reverse()</tt>, <tt>string.lower()</tt>, <tt>string.upper()</tt>, <tt>string.rep()</tt>, <tt>string.format()</tt>, <tt>table.concat()</tt>, <tt>bit.tohex()</tt>, <tt>getfenv(0)</tt>, <tt>debug.getmetatable()</tt>.</li>[m
[31m-<li>Compile <tt>string.find()</tt> for fixed string searches (no patterns).</li>[m
[31m-<li>Compile <tt>BC_TSETM</tt>, e.g. <tt>{1,2,3,f()}</tt>.</li>[m
[31m-<li>Compile string concatenations (<tt>BC_CAT</tt>).</li>[m
[31m-<li>Compile <tt>__concat</tt> metamethod.</li>[m
[31m-<li>Various minor optimizations.</li>[m
[31m-</ul></li>[m
[31m-<li>Internal Changes:[m
[31m-<ul>[m
[31m-<li>Add support for embedding LuaJIT bytecode for builtins.</li>[m
[31m-<li>Replace various builtins with embedded bytecode.</li>[m
[31m-<li>Refactor string buffers and string formatting.</li>[m
[31m-<li>Remove obsolete non-truncating number to integer conversions.</li>[m
[31m-</ul></li>[m
[31m-<li>Ports:[m
[31m-<ul>[m
[31m-<li>Add Xbox One port (<tt>LJ_GC64</tt> mode).</li>[m
[31m-<li>ARM64: Add port of the interpreter (<tt>LJ_GC64</tt> mode).</li>[m
[31m-<li>x64: Add separate port of the interpreter to <tt>LJ_GC64</tt> mode.</li>[m
[31m-<li>x86/x64: Drop internal x87 math functions. Use libm functions.</li>[m
[31m-<li>x86: Remove x87 support from interpreter. SSE2 is mandatory now.</li>[m
[31m-<li>PPC/e500: Drop support for this architecture.</li>[m
[31m-</ul></li>[m
[31m-<li>FFI library:[m
[31m-<ul>[m
[31m-<li>FFI: Add 64 bit bitwise operations.</li>[m
[31m-<li>FFI: Compile VLA/VLS and large cdata allocations with default initialization.</li>[m
[31m-<li>FFI: Compile conversions from functions to function pointers.</li>[m
[31m-<li>FFI: Compile lightuserdata to <tt>void *</tt> conversion.</li>[m
[31m-<li>FFI: Compile <tt>ffi.gc(cdata, nil)</tt>, too.</li>[m
[31m-<li>FFI: Add <tt>ffi.typeinfo()</tt>.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-</div>[m
[31m-[m
[31m-<div class="major" style="background: #ffffd0;">[m
[31m-<h2 id="LuaJIT-2.0.4">LuaJIT 2.0.4 &mdash; 2015-05-14</h2>[m
[31m-<ul>[m
[31m-<li>Fix stack check in narrowing optimization.</li>[m
[31m-<li>Fix Lua/C API typecheck error for special indexes.</li>[m
[31m-<li>Fix string to number conversion.</li>[m
[31m-<li>Fix lexer error for chunks without tokens.</li>[m
[31m-<li>Don't compile <tt>IR_RETF</tt> after <tt>CALLT</tt> to ff with-side effects.</li>[m
[31m-<li>Fix <tt>BC_UCLO</tt>/<tt>BC_JMP</tt> join optimization in Lua parser.</li>[m
[31m-<li>Fix corner case in string to number conversion.</li>[m
[31m-<li>Gracefully handle <tt>lua_error()</tt> for a suspended coroutine.</li>[m
[31m-<li>Avoid error messages when building with Clang.</li>[m
[31m-<li>Fix snapshot #0 handling for traces with a stack check on entry.</li>[m
[31m-<li>Fix fused constant loads under high register pressure.</li>[m
[31m-<li>Invalidate backpropagation cache after DCE.</li>[m
[31m-<li>Fix ABC elimination.</li>[m
[31m-<li>Fix debug info for main chunk of stripped bytecode.</li>[m
[31m-<li>Fix FOLD rule for <tt>string.sub(s, ...) == k</tt>.</li>[m
[31m-<li>Fix FOLD rule for <tt>STRREF</tt> of <tt>SNEW</tt>.</li>[m
[31m-<li>Fix frame traversal while searching for error function.</li>[m
[31m-<li>Prevent GC estimate miscalculation due to buffer growth.</li>[m
[31m-<li>Prevent adding side traces for stack checks.</li>[m
[31m-<li>Fix top slot calculation for snapshots with continuations.</li>[m
[31m-<li>Fix check for reuse of SCEV results in <tt>FORL</tt>.</li>[m
[31m-<li>Add PS Vita port.</li>[m
[31m-<li>Fix compatibility issues with Illumos.</li>[m
[31m-<li>Fix DragonFly build (unsupported).</li>[m
[31m-<li>OpenBSD/x86: Better executable memory allocation for W^X mode.</li>[m
[31m-<li>x86: Fix argument checks for <tt>ipairs()</tt> iterator.</li>[m
[31m-<li>x86: <tt>lj_math_random_step()</tt> clobbers XMM regs on OSX Clang.</li>[m
[31m-<li>x86: Fix code generation for unused result of <tt>math.random()</tt>.</li>[m
[31m-<li>x64: Allow building with <tt>LUAJIT_USE_SYSMALLOC</tt> and <tt>LUAJIT_USE_VALGRIND</tt>.</li>[m
[31m-<li>x86/x64: Fix argument check for bit shifts.</li>[m
[31m-<li>x86/x64: Fix code generation for fused test/arith ops.</li>[m
[31m-<li>ARM: Fix write barrier check in <tt>BC_USETS</tt>.</li>[m
[31m-<li>PPC: Fix red zone overflow in machine code generation.</li>[m
[31m-<li>PPC: Don't use <tt>mcrxr</tt> on PPE.</li>[m
[31m-<li>Various archs: Fix excess stack growth in interpreter.</li>[m
[31m-<li>FFI: Fix FOLD rule for <tt>TOBIT</tt> + <tt>CONV num.u32</tt>.</li>[m
[31m-<li>FFI: Prevent DSE across <tt>ffi.string()</tt>.</li>[m
[31m-<li>FFI: No meta fallback when indexing pointer to incomplete struct.</li>[m
[31m-<li>FFI: Fix initialization of unions of subtypes.</li>[m
[31m-<li>FFI: Fix cdata vs. non-cdata arithmetic and comparisons.</li>[m
[31m-<li>FFI: Fix <tt>__index</tt>/<tt>__newindex</tt> metamethod resolution for ctypes.</li>[m
[31m-<li>FFI: Fix compilation of reference field access.</li>[m
[31m-<li>FFI: Fix frame traversal for backtraces with FFI callbacks.</li>[m
[31m-<li>FFI: Fix recording of indexing a struct pointer ctype object itself.</li>[m
[31m-<li>FFI: Allow non-scalar cdata to be compared for equality by address.</li>[m
[31m-<li>FFI: Fix pseudo type conversions for type punning.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.3">LuaJIT 2.0.3 &mdash; 2014-03-12</h2>[m
[31m-<ul>[m
[31m-<li>Add PS4 port.</li>[m
[31m-<li>Add support for multilib distro builds.</li>[m
[31m-<li>Fix OSX build.</li>[m
[31m-<li>Fix MinGW build.</li>[m
[31m-<li>Fix Xbox 360 build.</li>[m
[31m-<li>Improve ULOAD forwarding for open upvalues.</li>[m
[31m-<li>Fix GC steps threshold handling when called by JIT-compiled code.</li>[m
[31m-<li>Fix argument checks for <tt>math.deg()</tt> and <tt>math.rad()</tt>.</li>[m
[31m-<li>Fix <tt>jit.flush(func|true)</tt>.</li>[m
[31m-<li>Respect <tt>jit.off(func)</tt> when returning to a function, too.</li>[m
[31m-<li>Fix compilation of <tt>string.byte(s, nil, n)</tt>.</li>[m
[31m-<li>Fix line number for relocated bytecode after closure fixup</li>[m
[31m-<li>Fix frame traversal for backtraces.</li>[m
[31m-<li>Fix ABC elimination.</li>[m
[31m-<li>Fix handling of redundant PHIs.</li>[m
[31m-<li>Fix snapshot restore for exit to function header.</li>[m
[31m-<li>Fix type punning alias analysis for constified pointers</li>[m
[31m-<li>Fix call unroll checks in the presence of metamethod frames.</li>[m
[31m-<li>Fix initial maxslot for down-recursive traces.</li>[m
[31m-<li>Prevent BASE register coalescing if parent uses <tt>IR_RETF</tt>.</li>[m
[31m-<li>Don't purge modified function from stack slots in <tt>BC_RET</tt>.</li>[m
[31m-<li>Fix recording of <tt>BC_VARG</tt>.</li>[m
[31m-<li>Don't access dangling reference to reallocated IR.</li>[m
[31m-<li>Fix frame depth display for bytecode dump in <tt>-jdump</tt>.</li>[m
[31m-<li>ARM: Fix register allocation when rematerializing FPRs.</li>[m
[31m-<li>x64: Fix store to upvalue for lightuserdata values.</li>[m
[31m-<li>FFI: Add missing GC steps for callback argument conversions.</li>[m
[31m-<li>FFI: Properly unload loaded DLLs.</li>[m
[31m-<li>FFI: Fix argument checks for <tt>ffi.string()</tt>.</li>[m
[31m-<li>FFI/x64: Fix passing of vector arguments to calls.</li>[m
[31m-<li>FFI: Rehash finalizer table after GC cycle, if needed.</li>[m
[31m-<li>FFI: Fix <tt>cts-&gt;L</tt> for cdata unsinking in snapshot restore.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.2">LuaJIT 2.0.2 &mdash; 2013-06-03</h2>[m
[31m-<ul>[m
[31m-<li>Fix memory access check for fast string interning.</li>[m
[31m-<li>Fix MSVC intrinsics for older versions.</li>[m
[31m-<li>Add missing GC steps for <tt>io.*</tt> functions.</li>[m
[31m-<li>Fix spurious red zone overflows in machine code generation.</li>[m
[31m-<li>Fix jump-range constrained mcode allocation.</li>[m
[31m-<li>Inhibit DSE for implicit loads via calls.</li>[m
[31m-<li>Fix builtin string to number conversion for overflow digits.</li>[m
[31m-<li>Fix optional argument handling while recording builtins.</li>[m
[31m-<li>Fix optional argument handling in <tt>table.concat()</tt>.</li>[m
[31m-<li>Add partial support for building with MingW64 GCC 4.8-SEH.</li>[m
[31m-<li>Add missing PHI barrier to <tt>string.sub(str, a, b) == kstr</tt> FOLD rule.</li>[m
[31m-<li>Fix compatibility issues with Illumos.</li>[m
[31m-<li>ARM: Fix cache flush/sync for exit stubs of JIT-compiled code.</li>[m
[31m-<li>MIPS: Fix cache flush/sync for JIT-compiled code jump area.</li>[m
[31m-<li>PPC: Add <tt>plt</tt> suffix for external calls from assembler code.</li>[m
[31m-<li>FFI: Fix snapshot substitution in SPLIT pass.</li>[m
[31m-<li>FFI/x86: Fix register allocation for 64 bit comparisons.</li>[m
[31m-<li>FFI: Fix tailcall in lowest frame to C&nbsp;function with bool result.</li>[m
[31m-<li>FFI: Ignore <tt>long</tt> type specifier in <tt>ffi.istype()</tt>.</li>[m
[31m-<li>FFI: Fix calling conventions for 32 bit OSX and iOS simulator (struct returns).</li>[m
[31m-<li>FFI: Fix calling conventions for ARM hard-float EABI (nested structs).</li>[m
[31m-<li>FFI: Improve error messages for arithmetic and comparison operators.</li>[m
[31m-<li>FFI: Insert no-op type conversion for pointer to integer cast.</li>[m
[31m-<li>FFI: Fix unroll limit for <tt>ffi.fill()</tt>.</li>[m
[31m-<li>FFI: Must sink <tt>XBAR</tt> together with <tt>XSTORE</tt>s.</li>[m
[31m-<li>FFI: Preserve intermediate string for <tt>const&nbsp;char&nbsp;*</tt> conversion.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.1">LuaJIT 2.0.1 &mdash; 2013-02-19</h2>[m
[31m-<ul>[m
[31m-<li>Don't clear frame for out-of-memory error.</li>[m
[31m-<li>Leave hook when resume catches error thrown from hook.</li>[m
[31m-<li>Add missing GC steps for template table creation.</li>[m
[31m-<li>Fix discharge order of comparisons in Lua parser.</li>[m
[31m-<li>Improve buffer handling for <tt>io.read()</tt>.</li>[m
[31m-<li>OSX: Add support for Mach-O object files to <tt>-b</tt> option.</li>[m
[31m-<li>Fix PS3 port.</li>[m
[31m-<li>Fix/enable Xbox 360 port.</li>[m
[31m-<li>x86/x64: Always mark ref for shift count as non-weak.</li>[m
[31m-<li>x64: Don't fuse implicitly 32-to-64 extended operands.</li>[m
[31m-<li>ARM: Fix armhf call argument handling.</li>[m
[31m-<li>ARM: Fix code generation for integer math.min/math.max.</li>[m
[31m-<li>PPC/e500: Fix <tt>lj_vm_floor()</tt> for Inf/NaN.</li>[m
[31m-<li>FFI: Change priority of table initializer variants for structs.</li>[m
[31m-<li>FFI: Fix code generation for bool call result check on x86/x64.</li>[m
[31m-<li>FFI: Load FFI library on-demand for bytecode with cdata literals.</li>[m
[31m-<li>FFI: Fix handling of qualified transparent structs/unions.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0">LuaJIT 2.0.0 &mdash; 2012-11-08</h2>[m
[31m-<ul>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-  <li>Fix Android/x86 build.</li>[m
[31m-  <li>Fix recording of equality comparisons with <tt>__eq</tt> metamethods.</li>[m
[31m-  <li>Fix detection of immutable upvalues.</li>[m
[31m-  <li>Replace error with PANIC for callbacks from JIT-compiled code.</li>[m
[31m-  <li>Fix builtin string to number conversion for <tt>INT_MIN</tt>.</li>[m
[31m-  <li>Don't create unneeded array part for template tables.</li>[m
[31m-  <li>Fix <tt>CONV.num.int</tt> sinking.</li>[m
[31m-  <li>Don't propagate implicitly widened number to index metamethods.</li>[m
[31m-  <li>ARM: Fix ordered comparisons of number vs. non-number.</li>[m
[31m-  <li>FFI: Fix code generation for replay of sunk float fields.</li>[m
[31m-  <li>FFI: Fix signedness of bool.</li>[m
[31m-  <li>FFI: Fix recording of bool call result check on x86/x64.</li>[m
[31m-  <li>FFI: Fix stack-adjustment for <tt>__thiscall</tt> callbacks.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta11">LuaJIT 2.0.0-beta11 &mdash; 2012-10-16</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-  <li>Use ARM VFP instructions, if available (build-time detection).</li>[m
[31m-  <li>Add support for ARM hard-float EABI (<tt>armhf</tt>).</li>[m
[31m-  <li>Add PS3 port.</li>[m
[31m-  <li>Add many features from Lua&nbsp;5.2, e.g. <tt>goto</tt>/labels.[m
[31m-  Refer to <a href="extensions.html#lua52">this list</a>.</li>[m
[31m-  <li>FFI: Add parameterized C types.</li>[m
[31m-  <li>FFI: Add support for copy constructors.</li>[m
[31m-  <li>FFI: Equality comparisons never raise an error (treat as unequal instead).</li>[m
[31m-  <li>FFI: Box all accessed or returned enums.</li>[m
[31m-  <li>FFI: Check for <tt>__new</tt> metamethod when calling a constructor.</li>[m
[31m-  <li>FFI: Handle <tt>__pairs</tt>/<tt>__ipairs</tt> metamethods for cdata objects.</li>[m
[31m-  <li>FFI: Convert <tt>io.*</tt> file handle to <tt>FILE *</tt> pointer (but as a <tt>void *</tt>).</li>[m
[31m-  <li>FFI: Detect and support type punning through unions.</li>[m
[31m-  <li>FFI: Improve various error messages.</li>[m
[31m-</ul></li>[m
[31m-<li>Build-system reorganization:[m
[31m-<ul>[m
[31m-  <li>Reorganize directory layout:<br>[m
[31m-  <tt>lib/*</tt> &rarr; <tt>src/jit/*</tt><br>[m
[31m-  <tt>src/buildvm_*.dasc</tt> &rarr; <tt>src/vm_*.dasc</tt><br>[m
[31m-  <tt>src/buildvm_*.h</tt> &rarr; removed<br>[m
[31m-  <tt>src/buildvm*</tt> &rarr; <tt>src/host/*</tt></li>[m
[31m-  <li>Add minified Lua interpreter plus Lua BitOp (<tt>minilua</tt>) to run DynASM.</li>[m
[31m-  <li>Change DynASM bit operations to use Lua BitOp</li>[m
[31m-  <li>Translate only <tt>vm_*.dasc</tt> for detected target architecture.</li>[m
[31m-  <li>Improve target detection for <tt>msvcbuild.bat</tt>.</li>[m
[31m-  <li>Fix build issues on Cygwin and MinGW with optional MSys.</li>[m
[31m-  <li>Handle cross-compiles with FPU/no-FPU or hard-fp/soft-fp ABI mismatch.</li>[m
[31m-  <li>Remove some library functions for no-JIT/no-FFI builds.</li>[m
[31m-  <li>Add uninstall target to top-level Makefile.</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-  <li>Preserve snapshot #0 PC for all traces.</li>[m
[31m-  <li>Fix argument checks for <tt>coroutine.create()</tt>.</li>[m
[31m-  <li>Command line prints version and JIT status to <tt>stdout</tt>, not <tt>stderr</tt>.</li>[m
[31m-  <li>Fix userdata <tt>__gc</tt> separations at Lua state close.</li>[m
[31m-  <li>Fix <tt>TDUP</tt> to <tt>HLOAD</tt> forwarding for <tt>LJ_DUALNUM</tt> builds.</li>[m
[31m-  <li>Fix buffer check in bytecode writer.</li>[m
[31m-  <li>Make <tt>os.date()</tt> thread-safe.</li>[m
[31m-  <li>Add missing declarations for MSVC intrinsics.</li>[m
[31m-  <li>Fix dispatch table modifications for return hooks.</li>[m
[31m-  <li>Workaround for MSVC conversion bug (<tt>double</tt> &rarr; <tt>uint32_t</tt> &rarr; <tt>int32_t</tt>).</li>[m
[31m-  <li>Fix FOLD rule <tt>(i-j)-i => 0-j</tt>.</li>[m
[31m-  <li>Never use DWARF unwinder on Windows.</li>[m
[31m-  <li>Fix shrinking of direct mapped blocks in builtin allocator.</li>[m
[31m-  <li>Limit recursion depth in <tt>string.match()</tt> et al.</li>[m
[31m-  <li>Fix late despecialization of <tt>ITERN</tt> after loop has been entered.</li>[m
[31m-  <li>Fix <tt>'f'</tt> and <tt>'L'</tt> options for <tt>debug.getinfo()</tt> and <tt>lua_getinfo()</tt>.</li>[m
[31m-  <li>Fix <tt>package.searchpath()</tt>.</li>[m
[31m-  <li>OSX: Change dylib names to be consistent with other platforms.</li>[m
[31m-  <li>Android: Workaround for broken <tt>sprintf("%g",&nbsp;-0.0)</tt>.</li>[m
[31m-  <li>x86: Remove support for ancient CPUs without <tt>CMOV</tt> (before Pentium Pro).</li>[m
[31m-  <li>x86: Fix register allocation for calls returning register pair.</li>[m
[31m-  <li>x86/x64: Fix fusion of unsigned byte comparisons with swapped operands.</li>[m
[31m-  <li>ARM: Fix <tt>tonumber()</tt> argument check.</li>[m
[31m-  <li>ARM: Fix modulo operator and <tt>math.floor()</tt>/<tt>math.ceil()</tt> for <tt>inf</tt>/<tt>nan</tt>.</li>[m
[31m-  <li>ARM: Invoke SPLIT pass for leftover <tt>IR_TOBIT</tt>.</li>[m
[31m-  <li>ARM: Fix BASE register coalescing.</li>[m
[31m-  <li>PPC: Fix interpreter state setup in callbacks.</li>[m
[31m-  <li>PPC: Fix <tt>string.sub()</tt> range check.</li>[m
[31m-  <li>MIPS: Support generation of MIPS/MIPSEL bytecode object files.</li>[m
[31m-  <li>MIPS: Fix calls to <tt>floor()</tt>/<tt>ceil()</tt><tt>/trunc()</tt>.</li>[m
[31m-  <li>ARM/PPC: Detect more target architecture variants.</li>[m
[31m-  <li>ARM/PPC/e500/MIPS: Fix tailcalls from fast functions, esp. <tt>tostring()</tt>.</li>[m
[31m-  <li>ARM/PPC/MIPS: Fix rematerialization of FP constants.</li>[m
[31m-  <li>FFI: Don't call <tt>FreeLibrary()</tt> on our own EXE/DLL.</li>[m
[31m-  <li>FFI: Resolve metamethods for constructors, too.</li>[m
[31m-  <li>FFI: Properly disable callbacks on iOS (would require executable memory).</li>[m
[31m-  <li>FFI: Fix cdecl string parsing during recording.</li>[m
[31m-  <li>FFI: Show address pointed to for <tt>tostring(ref)</tt>, too.</li>[m
[31m-  <li>FFI: Fix alignment of C call argument/return structure.</li>[m
[31m-  <li>FFI: Initialize all fields of standard types.</li>[m
[31m-  <li>FFI: Fix callback handling when new C&nbsp;types are declared in callback.</li>[m
[31m-  <li>FFI: Fix recording of constructors for pointers.</li>[m
[31m-  <li>FFI: Always resolve metamethods for pointers to structs.</li>[m
[31m-  <li>FFI: Correctly propagate alignment when interning nested types.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-  <li>Add allocation sinking and store sinking optimization.</li>[m
[31m-  <li>Constify immutable upvalues.</li>[m
[31m-  <li>Add builtin string to integer or FP number conversion. Improves cross-platform consistency and correctness.</li>[m
[31m-  <li>Create string hash slots in template tables for non-const values, too. Avoids later table resizes.</li>[m
[31m-  <li>Eliminate <tt>HREFK</tt> guard for template table references.</li>[m
[31m-  <li>Add various new FOLD rules.</li>[m
[31m-  <li>Don't use stack unwinding for <tt>lua_yield()</tt> (slow on x64).</li>[m
[31m-  <li>ARM, PPC, MIPS: Improve <tt>XLOAD</tt> operand fusion and register hinting.</li>[m
[31m-  <li>PPC, MIPS: Compile <tt>math.sqrt()</tt> to sqrt instruction, if available.</li>[m
[31m-  <li>FFI: Fold <tt>KPTR</tt> + constant offset in SPLIT pass.</li>[m
[31m-  <li>FFI: Optimize/inline <tt>ffi.copy()</tt> and <tt>ffi.fill()</tt>.</li>[m
[31m-  <li>FFI: Compile and optimize array/struct copies.</li>[m
[31m-  <li>FFI: Compile <tt>ffi.typeof(cdata|ctype)</tt>, <tt>ffi.sizeof()</tt>, <tt>ffi.alignof()</tt>, <tt>ffi.offsetof()</tt> and <tt>ffi.gc()</tt>.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta10">LuaJIT 2.0.0-beta10 &mdash; 2012-05-09</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>The MIPS of LuaJIT is complete. It requires a CPU conforming to the[m
[31m-MIPS32&nbsp;R1 architecture with hardware FPU. O32 hard-fp ABI,[m
[31m-little-endian or big-endian.</li>[m
[31m-<li>Auto-detect target arch via cross-compiler. No need for[m
[31m-<tt>TARGET=arch</tt> anymore.</li>[m
[31m-<li>Make DynASM compatible with Lua 5.2.</li>[m
[31m-<li>From Lua 5.2: Try <tt>__tostring</tt> metamethod on non-string error[m
[31m-messages..</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix parsing of hex literals with exponents.</li>[m
[31m-<li>Fix bytecode dump for certain number constants.</li>[m
[31m-<li>Fix argument type in error message for relative arguments.</li>[m
[31m-<li>Fix argument error handling on Lua stacks without a frame.</li>[m
[31m-<li>Add missing mcode limit check in assembler backend.</li>[m
[31m-<li>Fix compilation on OpenBSD.</li>[m
[31m-<li>Avoid recursive GC steps after GC-triggered trace exit.</li>[m
[31m-<li>Replace <tt>&lt;unwind.h&gt;</tt> definitions with our own.</li>[m
[31m-<li>Fix OSX build issues. Bump minimum required OSX version to 10.4.</li>[m
[31m-<li>Fix discharge order of comparisons in Lua parser.</li>[m
[31m-<li>Ensure running <tt>__gc</tt> of userdata created in <tt>__gc</tt>[m
[31m-at state close.</li>[m
[31m-<li>Limit number of userdata <tt>__gc</tt> separations at state close.</li>[m
[31m-<li>Fix bytecode <tt>JMP</tt> slot range when optimizing[m
[31m-<tt>and</tt>/<tt>or</tt> with constant LHS.</li>[m
[31m-<li>Fix DSE of <tt>USTORE</tt>.</li>[m
[31m-<li>Make <tt>lua_concat()</tt> work from C&nbsp;hook with partial frame.</li>[m
[31m-<li>Add required PHIs for implicit conversions, e.g. via <tt>XREF</tt>[m
[31m-forwarding.</li>[m
[31m-<li>Add more comparison variants to Valgrind suppressions file.</li>[m
[31m-<li>Disable loading bytecode with an extra header (BOM or <tt>#!</tt>).</li>[m
[31m-<li>Fix PHI stack slot syncing.</li>[m
[31m-<li>ARM: Reorder type/value tests to silence Valgrind.</li>[m
[31m-<li>ARM: Fix register allocation for <tt>ldrd</tt>-optimized[m
[31m-<tt>HREFK</tt>.</li>[m
[31m-<li>ARM: Fix conditional branch fixup for <tt>OBAR</tt>.</li>[m
[31m-<li>ARM: Invoke SPLIT pass for <tt>double</tt> args in FFI call.</li>[m
[31m-<li>ARM: Handle all <tt>CALL*</tt> ops with <tt>double</tt> results in[m
[31m-SPLIT pass.</li>[m
[31m-<li>ARM: Fix rejoin of <tt>POW</tt> in SPLIT pass.</li>[m
[31m-<li>ARM: Fix compilation of <tt>math.sinh</tt>, <tt>math.cosh</tt>,[m
[31m-<tt>math.tanh</tt>.</li>[m
[31m-<li>ARM, PPC: Avoid pointless arg clearing in <tt>BC_IFUNCF</tt>.</li>[m
[31m-<li>PPC: Fix resume after yield from hook.</li>[m
[31m-<li>PPC: Fix argument checking for <tt>rawget()</tt>.</li>[m
[31m-<li>PPC: Fix fusion of floating-point <tt>XLOAD</tt>/<tt>XSTORE</tt>.</li>[m
[31m-<li>PPC: Fix <tt>HREFK</tt> code generation for huge tables.</li>[m
[31m-<li>PPC: Use builtin D-Cache/I-Cache sync code.</li>[m
[31m-</ul></li>[m
[31m-<li>FFI library:[m
[31m-<ul>[m
[31m-<li>Ignore empty statements in <tt>ffi.cdef()</tt>.</li>[m
[31m-<li>Ignore number parsing errors while skipping definitions.</li>[m
[31m-<li>Don't touch frame in callbacks with tailcalls to fast functions.</li>[m
[31m-<li>Fix library unloading on POSIX systems.</li>[m
[31m-<li>Finalize cdata before userdata when closing the state.</li>[m
[31m-<li>Change <tt>ffi.load()</tt> library name resolution for Cygwin.</li>[m
[31m-<li>Fix resolving of function name redirects on Windows/x86.</li>[m
[31m-<li>Fix symbol resolving error messages on Windows.</li>[m
[31m-<li>Fix blacklisting of C functions calling callbacks.</li>[m
[31m-<li>Fix result type of pointer difference.</li>[m
[31m-<li>Use correct PC in FFI metamethod error message.</li>[m
[31m-<li>Allow <tt>'typedef _Bool int BOOL;'</tt> for the Windows API.</li>[m
[31m-<li>Don't record test for bool result of call, if ignored.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta9">LuaJIT 2.0.0-beta9 &mdash; 2011-12-14</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>PPC port of LuaJIT is complete. Default is the dual-number port[m
[31m-(usually faster). Single-number port selectable via <tt>src/Makefile</tt>[m
[31m-at build time.</li>[m
[31m-<li>Add FFI callback support.</li>[m
[31m-<li>Extend <tt>-b</tt> to generate <tt>.c</tt>, <tt>.h</tt> or <tt>.obj/.o</tt>[m
[31m-files with embedded bytecode.</li>[m
[31m-<li>Allow loading embedded bytecode with <tt>require()</tt>.</li>[m
[31m-<li>From Lua 5.2: Change to <tt>'\z'</tt> escape. Reject undefined escape[m
[31m-sequences.</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix OSX 10.7 build. Fix <tt>install_name</tt> and versioning on OSX.</li>[m
[31m-<li>Fix iOS build.</li>[m
[31m-<li>Install <tt>dis_arm.lua</tt>, too.</li>[m
[31m-<li>Mark installed shared library as executable.</li>[m
[31m-<li>Add debug option to <tt>msvcbuild.bat</tt> and improve error handling.</li>[m
[31m-<li>Fix data-flow analysis for iterators.</li>[m
[31m-<li>Fix forced unwinding triggered by external unwinder.</li>[m
[31m-<li>Record missing <tt>for</tt> loop slot loads (return to lower frame).</li>[m
[31m-<li>Always use ANSI variants of Windows system functions.</li>[m
[31m-<li>Fix GC barrier for multi-result table constructor (<tt>TSETM</tt>).</li>[m
[31m-<li>Fix/add various FOLD rules.</li>[m
[31m-<li>Add potential PHI for number conversions due to type instability.</li>[m
[31m-<li>Do not eliminate PHIs only referenced from other PHIs.</li>[m
[31m-<li>Correctly anchor implicit number to string conversions in Lua/C API.</li>[m
[31m-<li>Fix various stack limit checks.</li>[m
[31m-<li>x64: Use thread-safe exceptions for external unwinding (GCC platforms).</li>[m
[31m-<li>x64: Fix result type of cdata index conversions.</li>[m
[31m-<li>x64: Fix <tt>math.random()</tt> and <tt>bit.bswap()</tt> code generation.</li>[m
[31m-<li>x64: Fix <tt>lightuserdata</tt> comparisons.</li>[m
[31m-<li>x64: Always extend stack-passed arguments to pointer size.</li>[m
[31m-<li>ARM: Many fixes to code generation backend.</li>[m
[31m-<li>PPC/e500: Fix dispatch for binop metamethods.</li>[m
[31m-<li>PPC/e500: Save/restore condition registers when entering/leaving the VM.</li>[m
[31m-<li>PPC/e500: Fix write barrier in stores of strings to upvalues.</li>[m
[31m-</ul></li>[m
[31m-<li>FFI library:[m
[31m-<ul>[m
[31m-<li>Fix C comment parsing.</li>[m
[31m-<li>Fix snapshot optimization for cdata comparisons.</li>[m
[31m-<li>Fix recording of const/enum lookups in namespaces.</li>[m
[31m-<li>Fix call argument and return handling for <tt>I8/U8/I16/U16</tt> types.</li>[m
[31m-<li>Fix unfused loads of float fields.</li>[m
[31m-<li>Fix <tt>ffi.string()</tt> recording.</li>[m
[31m-<li>Save <tt>GetLastError()</tt> around <tt>ffi.load()</tt> and symbol[m
[31m-resolving, too.</li>[m
[31m-<li>Improve ld script detection in <tt>ffi.load()</tt>.</li>[m
[31m-<li>Record loads/stores to external variables in namespaces.</li>[m
[31m-<li>Compile calls to stdcall, fastcall and vararg functions.</li>[m
[31m-<li>Treat function ctypes like pointers in comparisons.</li>[m
[31m-<li>Resolve <tt>__call</tt> metamethod for pointers, too.</li>[m
[31m-<li>Record C function calls with bool return values.</li>[m
[31m-<li>Record <tt>ffi.errno()</tt>.</li>[m
[31m-<li>x86: Fix number to <tt>uint32_t</tt> conversion rounding.</li>[m
[31m-<li>x86: Fix 64 bit arithmetic in assembler backend.</li>[m
[31m-<li>x64: Fix struct-by-value calling conventions.</li>[m
[31m-<li>ARM: Ensure invocation of SPLIT pass for float conversions.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Display trace types with <tt>-jv</tt> and <tt>-jdump</tt>.</li>[m
[31m-<li>Record isolated calls. But prefer recording loops over calls.</li>[m
[31m-<li>Specialize to prototype for non-monomorphic functions. Solves the[m
[31m-trace-explosion problem for closure-heavy programming styles.</li>[m
[31m-<li>Always generate a portable <tt>vmdef.lua</tt>. Easier for distros.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta8">LuaJIT 2.0.0-beta8 &mdash; 2011-06-23</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>Soft-float ARM port of LuaJIT is complete.</li>[m
[31m-<li>Add support for bytecode loading/saving and <tt>-b</tt> command line[m
[31m-option.</li>[m
[31m-<li>From Lua 5.2: <tt>__len</tt> metamethod for tables[m
[31m-(disabled by default).</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>ARM: Misc. fixes for interpreter.</li>[m
[31m-<li>x86/x64: Fix <tt>bit.*</tt> argument checking in interpreter.</li>[m
[31m-<li>Catch early out-of-memory in memory allocator initialization.</li>[m
[31m-<li>Fix data-flow analysis for paths leading to an upvalue close.</li>[m
[31m-<li>Fix check for missing arguments in <tt>string.format()</tt>.</li>[m
[31m-<li>Fix Solaris/x86 build (note: not a supported target).</li>[m
[31m-<li>Fix recording of loops with instable directions in side traces.</li>[m
[31m-<li>x86/x64: Fix fusion of comparisons with <tt>u8</tt>/<tt>u16</tt>[m
[31m-<tt>XLOAD</tt>.</li>[m
[31m-<li>x86/x64: Fix register allocation for variable shifts.</li>[m
[31m-</ul></li>[m
[31m-<li>FFI library:[m
[31m-<ul>[m
[31m-<li>Add <tt>ffi.errno()</tt>. Save <tt>errno</tt>/<tt>GetLastError()</tt>[m
[31m-around allocations etc.</li>[m
[31m-<li>Fix <tt>__gc</tt> for VLA/VLS cdata objects.</li>[m
[31m-<li>Fix recording of casts from 32 bit cdata pointers to integers.</li>[m
[31m-<li><tt>tonumber(cdata)</tt> returns <tt>nil</tt> for non-numbers.</li>[m
[31m-<li>Show address pointed to for <tt>tostring(pointer)</tt>.</li>[m
[31m-<li>Print <tt>NULL</tt> pointers as <tt>"cdata&lt;... *&gt;: NULL"</tt>.</li>[m
[31m-<li>Support <tt>__tostring</tt> metamethod for pointers to structs, too.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>More tuning for loop unrolling heuristics.</li>[m
[31m-<li>Flatten and compress in-memory debug info (saves ~70%).</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta7">LuaJIT 2.0.0-beta7 &mdash; 2011-05-05</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>ARM port of the LuaJIT interpreter is complete.</li>[m
[31m-<li>FFI library: Add <tt>ffi.gc()</tt>, <tt>ffi.metatype()</tt>,[m
[31m-<tt>ffi.istype()</tt>.</li>[m
[31m-<li>FFI library: Resolve ld script redirection in <tt>ffi.load()</tt>.</li>[m
[31m-<li>From Lua 5.2: <tt>package.searchpath()</tt>, <tt>fp:read("*L")</tt>,[m
[31m-<tt>load(string)</tt>.</li>[m
[31m-<li>From Lua 5.2, disabled by default: empty statement,[m
[31m-<tt>table.unpack()</tt>, modified <tt>coroutine.running()</tt>.</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>FFI library: numerous fixes.</li>[m
[31m-<li>Fix type mismatches in store-to-load forwarding.</li>[m
[31m-<li>Fix error handling within metamethods.</li>[m
[31m-<li>Fix <tt>table.maxn()</tt>.</li>[m
[31m-<li>Improve accuracy of <tt>x^-k</tt> on x64.</li>[m
[31m-<li>Fix code generation for Intel Atom in x64 mode.</li>[m
[31m-<li>Fix narrowing of POW.</li>[m
[31m-<li>Fix recording of retried fast functions.</li>[m
[31m-<li>Fix code generation for <tt>bit.bnot()</tt> and multiplies.</li>[m
[31m-<li>Fix error location within cpcall frames.</li>[m
[31m-<li>Add workaround for old libgcc unwind bug.</li>[m
[31m-<li>Fix <tt>lua_yield()</tt> and <tt>getmetatable(lightuserdata)</tt> on x64.</li>[m
[31m-<li>Misc. fixes for PPC/e500 interpreter.</li>[m
[31m-<li>Fix stack slot updates for down-recursion.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Add dual-number mode (int/double) for the VM. Enabled for ARM.</li>[m
[31m-<li>Improve narrowing of arithmetic operators and <tt>for</tt> loops.</li>[m
[31m-<li>Tune loop unrolling heuristics and increase trace recorder limits.</li>[m
[31m-<li>Eliminate dead slots in snapshots using bytecode data-flow analysis.</li>[m
[31m-<li>Avoid phantom stores to proxy tables.</li>[m
[31m-<li>Optimize lookups in empty proxy tables.</li>[m
[31m-<li>Improve bytecode optimization of <tt>and</tt>/<tt>or</tt> operators.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta6">LuaJIT 2.0.0-beta6 &mdash; 2011-02-11</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>PowerPC/e500v2 port of the LuaJIT interpreter is complete.</li>[m
[31m-<li>Various minor features from Lua 5.2: Hex escapes in literals,[m
[31m-<tt>'\*'</tt> escape, reversible <tt>string.format("%q",s)</tt>,[m
[31m-<tt>"%g"</tt> pattern, <tt>table.sort</tt> checks callbacks,[m
[31m-<tt>os.exit(status|true|false[,close])</tt>.</li>[m
[31m-<li>Lua 5.2 <tt>__pairs</tt> and <tt>__ipairs</tt> metamethods[m
[31m-(disabled by default).</li>[m
[31m-<li>Initial release of the FFI library.</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix <tt>string.format()</tt> for non-finite numbers.</li>[m
[31m-<li>Fix memory leak when compiled to use the built-in allocator.</li>[m
[31m-<li>x86/x64: Fix unnecessary resize in <tt>TSETM</tt> bytecode.</li>[m
[31m-<li>Fix various GC issues with traces and <tt>jit.flush()</tt>.</li>[m
[31m-<li>x64: Fix fusion of indexes for array references.</li>[m
[31m-<li>x86/x64: Fix stack overflow handling for coroutine results.</li>[m
[31m-<li>Enable low-2GB memory allocation on FreeBSD/x64.</li>[m
[31m-<li>Fix <tt>collectgarbage("count")</tt> result if more than 2GB is in use.</li>[m
[31m-<li>Fix parsing of hex floats.</li>[m
[31m-<li>x86/x64: Fix loop branch inversion with trailing[m
[31m-<tt>HREF+NE/EQ</tt>.</li>[m
[31m-<li>Add <tt>jit.os</tt> string.</li>[m
[31m-<li><tt>coroutine.create()</tt> permits running C functions, too.</li>[m
[31m-<li>Fix OSX build to work with newer ld64 versions.</li>[m
[31m-<li>Fix bytecode optimization of <tt>and</tt>/<tt>or</tt> operators.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Emit specialized bytecode for <tt>pairs()</tt>/<tt>next()</tt>.</li>[m
[31m-<li>Improve bytecode coalescing of <tt>nil</tt> constants.</li>[m
[31m-<li>Compile calls to vararg functions.</li>[m
[31m-<li>Compile <tt>select()</tt>.</li>[m
[31m-<li>Improve alias analysis, esp. for loads from allocations.</li>[m
[31m-<li>Tuning of various compiler heuristics.</li>[m
[31m-<li>Refactor and extend IR conversion instructions.</li>[m
[31m-<li>x86/x64: Various backend enhancements related to the FFI.</li>[m
[31m-<li>Add SPLIT pass to split 64 bit IR instructions for 32 bit CPUs.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta5">LuaJIT 2.0.0-beta5 &mdash; 2010-08-24</h2>[m
[31m-<ul>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix trace exit dispatch to function headers.</li>[m
[31m-<li>Fix Windows and OSX builds with LUAJIT_DISABLE_JIT.</li>[m
[31m-<li>Reorganize and fix placement of generated machine code on x64.</li>[m
[31m-<li>Fix TNEW in x64 interpreter.</li>[m
[31m-<li>Do not eliminate PHIs for values only referenced from side exits.</li>[m
[31m-<li>OS-independent canonicalization of strings for non-finite numbers.</li>[m
[31m-<li>Fix <tt>string.char()</tt> range check on x64.</li>[m
[31m-<li>Fix <tt>tostring()</tt> resolving within <tt>print()</tt>.</li>[m
[31m-<li>Fix error handling for <tt>next()</tt>.</li>[m
[31m-<li>Fix passing of constant arguments to external calls on x64.</li>[m
[31m-<li>Fix interpreter argument check for two-argument SSE math functions.</li>[m
[31m-<li>Fix C frame chain corruption caused by <tt>lua_cpcall()</tt>.</li>[m
[31m-<li>Fix return from <tt>pcall()</tt> within active hook.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Replace on-trace GC frame syncing with interpreter exit.</li>[m
[31m-<li>Improve hash lookup specialization by not removing dead keys during GC.</li>[m
[31m-<li>Turn traces into true GC objects.</li>[m
[31m-<li>Avoid starting a GC cycle immediately after library init.</li>[m
[31m-<li>Add weak guards to improve dead-code elimination.</li>[m
[31m-<li>Speed up string interning.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta4">LuaJIT 2.0.0-beta4 &mdash; 2010-03-28</h2>[m
[31m-<ul>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix precondition for on-trace creation of table keys.</li>[m
[31m-<li>Fix <tt>{f()}</tt> on x64 when table is resized.</li>[m
[31m-<li>Fix folding of ordered comparisons with same references.</li>[m
[31m-<li>Fix snapshot restores for multi-result bytecodes.</li>[m
[31m-<li>Fix potential hang when recording bytecode with nested closures.</li>[m
[31m-<li>Fix recording of <tt>getmetatable()</tt>, <tt>tonumber()</tt> and bad argument types.</li>[m
[31m-<li>Fix SLOAD fusion across returns to lower frames.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Add array bounds check elimination. <tt>-Oabc</tt> is enabled by default.</li>[m
[31m-<li>More tuning for x64, e.g. smaller table objects.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta3">LuaJIT 2.0.0-beta3 &mdash; 2010-03-07</h2>[m
[31m-<ul>[m
[31m-<li>LuaJIT x64 port:[m
[31m-<ul>[m
[31m-<li>Port integrated memory allocator to Linux/x64, Windows/x64 and OSX/x64.</li>[m
[31m-<li>Port interpreter and JIT compiler to x64.</li>[m
[31m-<li>Port DynASM to x64.</li>[m
[31m-<li>Many 32/64 bit cleanups in the VM.</li>[m
[31m-<li>Allow building the interpreter with either x87 or SSE2 arithmetics.</li>[m
[31m-<li>Add external unwinding and C++ exception interop (default on x64).</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix constructor bytecode generation for certain conditional values.</li>[m
[31m-<li>Fix some cases of ordered string comparisons.</li>[m
[31m-<li>Fix <tt>lua_tocfunction()</tt>.</li>[m
[31m-<li>Fix cutoff register in JMP bytecode for some conditional expressions.</li>[m
[31m-<li>Fix PHI marking algorithm for references from variant slots.</li>[m
[31m-<li>Fix <tt>package.cpath</tt> for non-default PREFIX.</li>[m
[31m-<li>Fix DWARF2 frame unwind information for interpreter on OSX.</li>[m
[31m-<li>Drive the GC forward on string allocations in the parser.</li>[m
[31m-<li>Implement call/return hooks (zero-cost if disabled).</li>[m
[31m-<li>Implement yield from C hooks.</li>[m
[31m-<li>Disable JIT compiler on older non-SSE2 CPUs instead of aborting.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Compile recursive code (tail-, up- and down-recursion).</li>[m
[31m-<li>Improve heuristics for bytecode penalties and blacklisting.</li>[m
[31m-<li>Split CALL/FUNC recording and clean up fast function call semantics.</li>[m
[31m-<li>Major redesign of internal function call handling.</li>[m
[31m-<li>Improve FOR loop const specialization and integerness checks.</li>[m
[31m-<li>Switch to pre-initialized stacks. Avoid frame-clearing.</li>[m
[31m-<li>Colocation of prototypes and related data: bytecode, constants, debug info.</li>[m
[31m-<li>Cleanup parser and streamline bytecode generation.</li>[m
[31m-<li>Add support for weak IR references to register allocator.</li>[m
[31m-<li>Switch to compressed, extensible snapshots.</li>[m
[31m-<li>Compile returns to frames below the start frame.</li>[m
[31m-<li>Improve alias analysis of upvalues using a disambiguation hash value.</li>[m
[31m-<li>Compile floor/ceil/trunc to SSE2 helper calls or SSE4.1 instructions.</li>[m
[31m-<li>Add generic C call handling to IR and backend.</li>[m
[31m-<li>Improve KNUM fuse vs. load heuristics.</li>[m
[31m-<li>Compile various <tt>io.*()</tt> functions.</li>[m
[31m-<li>Compile <tt>math.sinh()</tt>, <tt>math.cosh()</tt>, <tt>math.tanh()</tt>[m
[31m-and <tt>math.random()</tt>.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta2">LuaJIT 2.0.0-beta2 &mdash; 2009-11-09</h2>[m
[31m-<ul>[m
[31m-<li>Reorganize build system. Build static+shared library on POSIX.</li>[m
[31m-<li>Allow C++ exception conversion on all platforms[m
[31m-using a wrapper function.</li>[m
[31m-<li>Automatically catch C++ exceptions and rethrow Lua error[m
[31m-(DWARF2 only).</li>[m
[31m-<li>Check for the correct x87 FPU precision at strategic points.</li>[m
[31m-<li>Always use wrappers for libm functions.</li>[m
[31m-<li>Resurrect metamethod name strings before copying them.</li>[m
[31m-<li>Mark current trace, even if compiler is idle.</li>[m
[31m-<li>Ensure FILE metatable is created only once.</li>[m
[31m-<li>Fix type comparisons when different integer types are involved.</li>[m
[31m-<li>Fix <tt>getmetatable()</tt> recording.</li>[m
[31m-<li>Fix TDUP with dead keys in template table.</li>[m
[31m-<li><tt>jit.flush(tr)</tt> returns status.[m
[31m-Prevent manual flush of a trace that's still linked.</li>[m
[31m-<li>Improve register allocation heuristics for invariant references.</li>[m
[31m-<li>Compile the push/pop variants of <tt>table.insert()</tt> and[m
[31m-<tt>table.remove()</tt>.</li>[m
[31m-<li>Compatibility with MSVC <tt>link&nbsp/debug</tt>.</li>[m
[31m-<li>Fix <tt>lua_iscfunction()</tt>.</li>[m
[31m-<li>Fix <tt>math.random()</tt> when compiled with <tt>-fpic</tt> (OSX).</li>[m
[31m-<li>Fix <tt>table.maxn()</tt>.</li>[m
[31m-<li>Bump <tt>MACOSX_DEPLOYMENT_TARGET</tt> to <tt>10.4</tt></li>[m
[31m-<li><tt>luaL_check*()</tt> and <tt>luaL_opt*()</tt> now support[m
[31m-negative arguments, too.<br>[m
[31m-This matches the behavior of Lua 5.1, but not the specification.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta1">LuaJIT 2.0.0-beta1 &mdash; 2009-10-31</h2>[m
[31m-<ul>[m
[31m-<li>This is the first public release of LuaJIT 2.0.</li>[m
[31m-<li>The whole VM has been rewritten from the ground up, so there's[m
[31m-no point in listing differences over earlier versions.</li>[m
[31m-</ul>[m
[31m-</div>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/contact.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/contact.html[m
[1mdeleted file mode 100644[m
[1mindex 5262376..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/contact.html[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Contact</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Contact</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-Please send general questions to the[m
[31m-<a href="http://luajit.org/list.html"><span class="ext">&raquo;</span>&nbsp;LuaJIT mailing list</a>.[m
[31m-You can also send any questions you have directly to me:[m
[31m-</p>[m
[31m-[m
[31m-<script type="text/javascript">[m
[31m-<!--[m
[31m-var xS="@-:\" .0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ<abc>defghijklmnopqrstuvwxyz";function xD(s)[m
[31m-{var len=s.length;var r="";for(var i=0;i<len;i++)[m
[31m-{var c=s.charAt(i);var n=xS.indexOf(c);if(n!=-1)c=xS.charAt(69-n);r+=c;}[m
[31m-document.write("<"+"p>"+r+"<"+"/p>\n");}[m
[31m-//-->[m
[31m-</script>[m
[31m-<script type="text/javascript">[m
[31m-<!--[m
[31m-xD("fyZKB8xv\"FJytmz8.KAB0u52D")[m
[31m-//--></script>[m
[31m-<noscript>[m
[31m-<p><img src="img/contact.png" alt="Contact info in image" width="170" height="13">[m
[31m-</p>[m
[31m-</noscript>[m
[31m-[m
[31m-<h2>Copyright</h2>[m
[31m-<p>[m
[31m-All documentation is[m
[31m-Copyright &copy; 2005-2016 Mike Pall.[m
[31m-</p>[m
[31m-[m
[31m-[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_c_api.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_c_api.html[m
[1mdeleted file mode 100644[m
[1mindex e1af3ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_c_api.html[m
[1m+++ /dev/null[m
[36m@@ -1,189 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Lua/C API Extensions</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Lua/C API Extensions</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT adds some extensions to the standard Lua/C API. The LuaJIT include[m
[31m-directory must be in the compiler search path (<tt>-I<i>path</i></tt>)[m
[31m-to be able to include the required header for C code:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-#include "luajit.h"[m
[31m-</pre>[m
[31m-<p>[m
[31m-Or for C++ code:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-#include "lua.hpp"[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="luaJIT_setmode"><tt>luaJIT_setmode(L, idx, mode)</tt>[m
[31m-&mdash; Control VM</h2>[m
[31m-<p>[m
[31m-This is a C API extension to allow control of the VM from C code. The[m
[31m-full prototype of <tt>LuaJIT_setmode</tt> is:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-LUA_API int luaJIT_setmode(lua_State *L, int idx, int mode);[m
[31m-</pre>[m
[31m-<p>[m
[31m-The returned status is either success (<tt>1</tt>) or failure (<tt>0</tt>).[m
[31m-The second argument is either <tt>0</tt> or a stack index (similar to the[m
[31m-other Lua/C API functions).[m
[31m-</p>[m
[31m-<p>[m
[31m-The third argument specifies the mode, which is 'or'ed with a flag.[m
[31m-The flag can be <tt>LUAJIT_MODE_OFF</tt> to turn a feature on,[m
[31m-<tt>LUAJIT_MODE_ON</tt> to turn a feature off, or[m
[31m-<tt>LUAJIT_MODE_FLUSH</tt> to flush cached code.[m
[31m-</p>[m
[31m-<p>[m
[31m-The following modes are defined:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="mode_engine"><tt>luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE|flag)</tt></h3>[m
[31m-<p>[m
[31m-Turn the whole JIT compiler on or off or flush the whole cache of compiled code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="mode_func"><tt>luaJIT_setmode(L, idx, LUAJIT_MODE_FUNC|flag)</tt><br>[m
[31m-<tt>luaJIT_setmode(L, idx, LUAJIT_MODE_ALLFUNC|flag)</tt><br>[m
[31m-<tt>luaJIT_setmode(L, idx, LUAJIT_MODE_ALLSUBFUNC|flag)</tt></h3>[m
[31m-<p>[m
[31m-This sets the mode for the function at the stack index <tt>idx</tt> or[m
[31m-the parent of the calling function (<tt>idx = 0</tt>). It either[m
[31m-enables JIT compilation for a function, disables it and flushes any[m
[31m-already compiled code or only flushes already compiled code. This[m
[31m-applies recursively to all sub-functions of the function with[m
[31m-<tt>LUAJIT_MODE_ALLFUNC</tt> or only to the sub-functions with[m
[31m-<tt>LUAJIT_MODE_ALLSUBFUNC</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="mode_trace"><tt>luaJIT_setmode(L, trace,<br>[m
[31m-&nbsp;&nbsp;LUAJIT_MODE_TRACE|LUAJIT_MODE_FLUSH)</tt></h3>[m
[31m-<p>[m
[31m-Flushes the specified root trace and all of its side traces from the cache.[m
[31m-The code for the trace will be retained as long as there are any other[m
[31m-traces which link to it.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="mode_wrapcfunc"><tt>luaJIT_setmode(L, idx, LUAJIT_MODE_WRAPCFUNC|flag)</tt></h3>[m
[31m-<p>[m
[31m-This mode defines a wrapper function for calls to C functions. If[m
[31m-called with <tt>LUAJIT_MODE_ON</tt>, the stack index at <tt>idx</tt>[m
[31m-must be a <tt>lightuserdata</tt> object holding a pointer to the wrapper[m
[31m-function. From now on all C functions are called through the wrapper[m
[31m-function. If called with <tt>LUAJIT_MODE_OFF</tt> this mode is turned[m
[31m-off and all C functions are directly called.[m
[31m-</p>[m
[31m-<p>[m
[31m-The wrapper function can be used for debugging purposes or to catch[m
[31m-and convert foreign exceptions. But please read the section on[m
[31m-<a href="extensions.html#exceptions">C++&nbsp;exception interoperability</a>[m
[31m-first. Recommended usage can be seen in this C++ code excerpt:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-#include &lt;exception&gt;[m
[31m-#include "lua.hpp"[m
[31m-[m
[31m-// Catch C++ exceptions and convert them to Lua error messages.[m
[31m-// Customize as needed for your own exception classes.[m
[31m-static int wrap_exceptions(lua_State *L, lua_CFunction f)[m
[31m-{[m
[31m-  try {[m
[31m-    return f(L);  // Call wrapped function and return result.[m
[31m-  } catch (const char *s) {  // Catch and convert exceptions.[m
[31m-    lua_pushstring(L, s);[m
[31m-  } catch (std::exception& e) {[m
[31m-    lua_pushstring(L, e.what());[m
[31m-  } catch (...) {[m
[31m-    lua_pushliteral(L, "caught (...)");[m
[31m-  }[m
[31m-  return lua_error(L);  // Rethrow as a Lua error.[m
[31m-}[m
[31m-[m
[31m-static int myinit(lua_State *L)[m
[31m-{[m
[31m-  ...[m
[31m-  // Define wrapper function and enable it.[m
[31m-  lua_pushlightuserdata(L, (void *)wrap_exceptions);[m
[31m-  luaJIT_setmode(L, -1, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_ON);[m
[31m-  lua_pop(L, 1);[m
[31m-  ...[m
[31m-}[m
[31m-</pre>[m
[31m-<p>[m
[31m-Note that you can only define <b>a single global wrapper function</b>,[m
[31m-so be careful when using this mechanism from multiple C++ modules.[m
[31m-Also note that this mechanism is not without overhead.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi.html[m
[1mdeleted file mode 100644[m
[1mindex d814f4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi.html[m
[1m+++ /dev/null[m
[36m@@ -1,332 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>FFI Library</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>FFI Library</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a class="current" href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-[m
[31m-The FFI library allows <b>calling external C&nbsp;functions</b> and[m
[31m-<b>using C&nbsp;data structures</b> from pure Lua code.[m
[31m-[m
[31m-</p>[m
[31m-<p>[m
[31m-[m
[31m-The FFI library largely obviates the need to write tedious manual[m
[31m-Lua/C bindings in C. No need to learn a separate binding language[m
[31m-&mdash; <b>it parses plain C&nbsp;declarations!</b> These can be[m
[31m-cut-n-pasted from C&nbsp;header files or reference manuals. It's up to[m
[31m-the task of binding large libraries without the need for dealing with[m
[31m-fragile binding generators.[m
[31m-[m
[31m-</p>[m
[31m-<p>[m
[31m-The FFI library is tightly integrated into LuaJIT (it's not available[m
[31m-as a separate module). The code generated by the JIT-compiler for[m
[31m-accesses to C&nbsp;data structures from Lua code is on par with the[m
[31m-code a C&nbsp;compiler would generate. Calls to C&nbsp;functions can[m
[31m-be inlined in JIT-compiled code, unlike calls to functions bound via[m
[31m-the classic Lua/C API.[m
[31m-</p>[m
[31m-<p>[m
[31m-This page gives a short introduction to the usage of the FFI library.[m
[31m-<em>Please use the FFI sub-topics in the navigation bar to learn more.</em>[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="call">Motivating Example: Calling External C Functions</h2>[m
[31m-<p>[m
[31m-It's really easy to call an external C&nbsp;library function:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&#9312;[m
[31m-&#9313;[m
[31m-[m
[31m-[m
[31m-&#9314;</span>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">int printf(const char *fmt, ...);</span>[m
[31m-]][m
[31m-ffi.C.printf("Hello %s!", "world")[m
[31m-</pre>[m
[31m-<p>[m
[31m-So, let's pick that apart:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> Load the FFI library.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> Add a C&nbsp;declaration[m
[31m-for the function. The part inside the double-brackets (in green) is[m
[31m-just standard C&nbsp;syntax.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> Call the named[m
[31m-C&nbsp;function &mdash; Yes, it's that simple![m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Actually, what goes on behind the scenes is far from simple: <span[m
[31m-style="color:#4040c0;">&#9314;</span> makes use of the standard[m
[31m-C&nbsp;library namespace <tt>ffi.C</tt>. Indexing this namespace with[m
[31m-a symbol name (<tt>"printf"</tt>) automatically binds it to the[m
[31m-standard C&nbsp;library. The result is a special kind of object which,[m
[31m-when called, runs the <tt>printf</tt> function. The arguments passed[m
[31m-to this function are automatically converted from Lua objects to the[m
[31m-corresponding C&nbsp;types.[m
[31m-</p>[m
[31m-<p>[m
[31m-Ok, so maybe the use of <tt>printf()</tt> wasn't such a spectacular[m
[31m-example. You could have done that with <tt>io.write()</tt> and[m
[31m-<tt>string.format()</tt>, too. But you get the idea ...[m
[31m-</p>[m
[31m-<p>[m
[31m-So here's something to pop up a message box on Windows:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">int MessageBoxA(void *w, const char *txt, const char *cap, int type);</span>[m
[31m-]][m
[31m-ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0)[m
[31m-</pre>[m
[31m-<p>[m
[31m-Bing! Again, that was far too easy, no?[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Compare this with the effort required to bind that function using the[m
[31m-classic Lua/C API: create an extra C&nbsp;file, add a C&nbsp;function[m
[31m-that retrieves and checks the argument types passed from Lua and calls[m
[31m-the actual C&nbsp;function, add a list of module functions and their[m
[31m-names, add a <tt>luaopen_*</tt> function and register all module[m
[31m-functions, compile and link it into a shared library (DLL), move it to[m
[31m-the proper path, add Lua code that loads the module aaaand ... finally[m
[31m-call the binding function. Phew![m
[31m-</p>[m
[31m-[m
[31m-<h2 id="cdata">Motivating Example: Using C Data Structures</h2>[m
[31m-<p>[m
[31m-The FFI library allows you to create and access C&nbsp;data[m
[31m-structures. Of course the main use for this is for interfacing with[m
[31m-C&nbsp;functions. But they can be used stand-alone, too.[m
[31m-</p>[m
[31m-<p>[m
[31m-Lua is built upon high-level data types. They are flexible, extensible[m
[31m-and dynamic. That's why we all love Lua so much. Alas, this can be[m
[31m-inefficient for certain tasks, where you'd really want a low-level[m
[31m-data type. E.g. a large array of a fixed structure needs to be[m
[31m-implemented with a big table holding lots of tiny tables. This imposes[m
[31m-both a substantial memory overhead as well as a performance overhead.[m
[31m-</p>[m
[31m-<p>[m
[31m-Here's a sketch of a library that operates on color images plus a[m
[31m-simple benchmark. First, the plain Lua version:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local floor = math.floor[m
[31m-[m
[31m-local function image_ramp_green(n)[m
[31m-  local img = {}[m
[31m-  local f = 255/(n-1)[m
[31m-  for i=1,n do[m
[31m-    img[i] = { red = 0, green = floor((i-1)*f), blue = 0, alpha = 255 }[m
[31m-  end[m
[31m-  return img[m
[31m-end[m
[31m-[m
[31m-local function image_to_grey(img, n)[m
[31m-  for i=1,n do[m
[31m-    local y = floor(0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue)[m
[31m-    img[i].red = y; img[i].green = y; img[i].blue = y[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local N = 400*400[m
[31m-local img = image_ramp_green(N)[m
[31m-for i=1,1000 do[m
[31m-  image_to_grey(img, N)[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-This creates a table with 160.000 pixels, each of which is a table[m
[31m-holding four number values in the range of 0-255. First an image with[m
[31m-a green ramp is created (1D for simplicity), then the image is[m
[31m-converted to greyscale 1000 times. Yes, that's silly, but I was in[m
[31m-need of a simple example ...[m
[31m-</p>[m
[31m-<p>[m
[31m-And here's the FFI version. The modified parts have been marked in[m
[31m-bold:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&#9312;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9313;[m
[31m-[m
[31m-&#9314;[m
[31m-&#9315;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9314;[m
[31m-&#9316;</span><b>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-</b><span style="color:#00a000;">typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;</span><b>[m
[31m-]]</b>[m
[31m-[m
[31m-local function image_ramp_green(n)[m
[31m-  <b>local img = ffi.new("rgba_pixel[?]", n)</b>[m
[31m-  local f = 255/(n-1)[m
[31m-  for i=<b>0,n-1</b> do[m
[31m-    <b>img[i].green = i*f</b>[m
[31m-    <b>img[i].alpha = 255</b>[m
[31m-  end[m
[31m-  return img[m
[31m-end[m
[31m-[m
[31m-local function image_to_grey(img, n)[m
[31m-  for i=<b>0,n-1</b> do[m
[31m-    local y = <b>0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue</b>[m
[31m-    img[i].red = y; img[i].green = y; img[i].blue = y[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local N = 400*400[m
[31m-local img = image_ramp_green(N)[m
[31m-for i=1,1000 do[m
[31m-  image_to_grey(img, N)[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-Ok, so that wasn't too difficult:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> First, load the FFI[m
[31m-library and declare the low-level data type. Here we choose a[m
[31m-<tt>struct</tt> which holds four byte fields, one for each component[m
[31m-of a 4x8&nbsp;bit RGBA pixel.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> Creating the data[m
[31m-structure with <tt>ffi.new()</tt> is straightforward &mdash; the[m
[31m-<tt>'?'</tt> is a placeholder for the number of elements of a[m
[31m-variable-length array.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> C&nbsp;arrays are[m
[31m-zero-based, so the indexes have to run from <tt>0</tt> to[m
[31m-<tt>n-1</tt>. One might want to allocate one more element instead to[m
[31m-simplify converting legacy code.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9315;</span> Since <tt>ffi.new()</tt>[m
[31m-zero-fills the array by default, we only need to set the green and the[m
[31m-alpha fields.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9316;</span> The calls to[m
[31m-<tt>math.floor()</tt> can be omitted here, because floating-point[m
[31m-numbers are already truncated towards zero when converting them to an[m
[31m-integer. This happens implicitly when the number is stored in the[m
[31m-fields of each pixel.[m
[31m-</p>[m
[31m-<p>[m
[31m-Now let's have a look at the impact of the changes: first, memory[m
[31m-consumption for the image is down from 22&nbsp;Megabytes to[m
[31m-640&nbsp;Kilobytes (400*400*4 bytes). That's a factor of 35x less! So,[m
[31m-yes, tables do have a noticeable overhead. BTW: The original program[m
[31m-would consume 40&nbsp;Megabytes in plain Lua (on x64).[m
[31m-</p>[m
[31m-<p>[m
[31m-Next, performance: the pure Lua version runs in 9.57 seconds (52.9[m
[31m-seconds with the Lua interpreter) and the FFI version runs in 0.48[m
[31m-seconds on my machine (YMMV). That's a factor of 20x faster (110x[m
[31m-faster than the Lua interpreter).[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-The avid reader may notice that converting the pure Lua version over[m
[31m-to use array indexes for the colors (<tt>[1]</tt> instead of[m
[31m-<tt>.red</tt>, <tt>[2]</tt> instead of <tt>.green</tt> etc.) ought to[m
[31m-be more compact and faster. This is certainly true (by a factor of[m
[31m-~1.7x). Switching to a struct-of-arrays would help, too.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-However the resulting code would be less idiomatic and rather[m
[31m-error-prone. And it still doesn't get even close to the performance of[m
[31m-the FFI version of the code. Also, high-level data structures cannot[m
[31m-be easily passed to other C&nbsp;functions, especially I/O functions,[m
[31m-without undue conversion penalties.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_api.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_api.html[m
[1mdeleted file mode 100644[m
[1mindex 6d40596..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_api.html[m
[1m+++ /dev/null[m
[36m@@ -1,570 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>ffi.* API Functions</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.abitable { width: 30em; line-height: 1.2; }[m
[31m-tr.abihead td { font-weight: bold; }[m
[31m-td.abiparam { font-weight: bold; width: 6em; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1><tt>ffi.*</tt> API Functions</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-This page describes the API functions provided by the FFI library in[m
[31m-detail. It's recommended to read through the[m
[31m-<a href="ext_ffi.html">introduction</a> and the[m
[31m-<a href="ext_ffi_tutorial.html">FFI tutorial</a> first.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="glossary">Glossary</h2>[m
[31m-<ul>[m
[31m-<li><b>cdecl</b> &mdash; An abstract C&nbsp;type declaration (a Lua[m
[31m-string).</li>[m
[31m-<li><b>ctype</b> &mdash; A C&nbsp;type object. This is a special kind of[m
[31m-<b>cdata</b> returned by <tt>ffi.typeof()</tt>. It serves as a[m
[31m-<b>cdata</b> <a href="#ffi_new">constructor</a> when called.</li>[m
[31m-<li><b>cdata</b> &mdash; A C&nbsp;data object. It holds a value of the[m
[31m-corresponding <b>ctype</b>.</li>[m
[31m-<li><b>ct</b> &mdash; A C&nbsp;type specification which can be used for[m
[31m-most of the API functions. Either a <b>cdecl</b>, a <b>ctype</b> or a[m
[31m-<b>cdata</b> serving as a template type.</li>[m
[31m-<li><b>cb</b> &mdash; A callback object. This is a C&nbsp;data object[m
[31m-holding a special function pointer. Calling this function from[m
[31m-C&nbsp;code runs an associated Lua function.</li>[m
[31m-<li><b>VLA</b> &mdash; A variable-length array is declared with a[m
[31m-<tt>?</tt> instead of the number of elements, e.g. <tt>"int[?]"</tt>.[m
[31m-The number of elements (<tt>nelem</tt>) must be given when it's[m
[31m-<a href="#ffi_new">created</a>.</li>[m
[31m-<li><b>VLS</b> &mdash; A variable-length struct is a <tt>struct</tt> C[m
[31m-type where the last element is a <b>VLA</b>. The same rules for[m
[31m-declaration and creation apply.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="decl">Declaring and Accessing External Symbols</h2>[m
[31m-<p>[m
[31m-External symbols must be declared first and can then be accessed by[m
[31m-indexing a <a href="ext_ffi_semantics.html#clib">C&nbsp;library[m
[31m-namespace</a>, which automatically binds the symbol to a specific[m
[31m-library.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_cdef"><tt>ffi.cdef(def)</tt></h3>[m
[31m-<p>[m
[31m-Adds multiple C&nbsp;declarations for types or external symbols (named[m
[31m-variables or functions). <tt>def</tt> must be a Lua string. It's[m
[31m-recommended to use the syntactic sugar for string arguments as[m
[31m-follows:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">typedef struct foo { int a, b; } foo_t;  // Declare a struct and typedef.[m
[31m-int dofoo(foo_t *f, int n);  /* Declare an external C function. */</span>[m
[31m-]][m
[31m-</pre>[m
[31m-<p>[m
[31m-The contents of the string (the part in green above) must be a[m
[31m-sequence of[m
[31m-<a href="ext_ffi_semantics.html#clang">C&nbsp;declarations</a>,[m
[31m-separated by semicolons. The trailing semicolon for a single[m
[31m-declaration may be omitted.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note that external symbols are only <em>declared</em>, but they[m
[31m-are <em>not bound</em> to any specific address, yet. Binding is[m
[31m-achieved with C&nbsp;library namespaces (see below).[m
[31m-</p>[m
[31m-<p style="color: #c00000;">[m
[31m-C&nbsp;declarations are not passed through a C&nbsp;pre-processor,[m
[31m-yet. No pre-processor tokens are allowed, except for[m
[31m-<tt>#pragma&nbsp;pack</tt>. Replace <tt>#define</tt> in existing[m
[31m-C&nbsp;header files with <tt>enum</tt>, <tt>static&nbsp;const</tt>[m
[31m-or <tt>typedef</tt> and/or pass the files through an external[m
[31m-C&nbsp;pre-processor (once). Be careful not to include unneeded or[m
[31m-redundant declarations from unrelated header files.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_C"><tt>ffi.C</tt></h3>[m
[31m-<p>[m
[31m-This is the default C&nbsp;library namespace &mdash; note the[m
[31m-uppercase <tt>'C'</tt>. It binds to the default set of symbols or[m
[31m-libraries on the target system. These are more or less the same as a[m
[31m-C&nbsp;compiler would offer by default, without specifying extra link[m
[31m-libraries.[m
[31m-</p>[m
[31m-<p>[m
[31m-On POSIX systems, this binds to symbols in the default or global[m
[31m-namespace. This includes all exported symbols from the executable and[m
[31m-any libraries loaded into the global namespace. This includes at least[m
[31m-<tt>libc</tt>, <tt>libm</tt>, <tt>libdl</tt> (on Linux),[m
[31m-<tt>libgcc</tt> (if compiled with GCC), as well as any exported[m
[31m-symbols from the Lua/C&nbsp;API provided by LuaJIT itself.[m
[31m-</p>[m
[31m-<p>[m
[31m-On Windows systems, this binds to symbols exported from the[m
[31m-<tt>*.exe</tt>, the <tt>lua51.dll</tt> (i.e. the Lua/C&nbsp;API[m
[31m-provided by LuaJIT itself), the C&nbsp;runtime library LuaJIT was linked[m
[31m-with (<tt>msvcrt*.dll</tt>), <tt>kernel32.dll</tt>,[m
[31m-<tt>user32.dll</tt> and <tt>gdi32.dll</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_load"><tt>clib = ffi.load(name [,global])</tt></h3>[m
[31m-<p>[m
[31m-This loads the dynamic library given by <tt>name</tt> and returns[m
[31m-a new C&nbsp;library namespace which binds to its symbols. On POSIX[m
[31m-systems, if <tt>global</tt> is <tt>true</tt>, the library symbols are[m
[31m-loaded into the global namespace, too.[m
[31m-</p>[m
[31m-<p>[m
[31m-If <tt>name</tt> is a path, the library is loaded from this path.[m
[31m-Otherwise <tt>name</tt> is canonicalized in a system-dependent way and[m
[31m-searched in the default search path for dynamic libraries:[m
[31m-</p>[m
[31m-<p>[m
[31m-On POSIX systems, if the name contains no dot, the extension[m
[31m-<tt>.so</tt> is appended. Also, the <tt>lib</tt> prefix is prepended[m
[31m-if necessary. So <tt>ffi.load("z")</tt> looks for <tt>"libz.so"</tt>[m
[31m-in the default shared library search path.[m
[31m-</p>[m
[31m-<p>[m
[31m-On Windows systems, if the name contains no dot, the extension[m
[31m-<tt>.dll</tt> is appended. So <tt>ffi.load("ws2_32")</tt> looks for[m
[31m-<tt>"ws2_32.dll"</tt> in the default DLL search path.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="create">Creating cdata Objects</h2>[m
[31m-<p>[m
[31m-The following API functions create cdata objects (<tt>type()</tt>[m
[31m-returns <tt>"cdata"</tt>). All created cdata objects are[m
[31m-<a href="ext_ffi_semantics.html#gc">garbage collected</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_new"><tt>cdata = ffi.new(ct [,nelem] [,init...])<br>[m
[31m-cdata = <em>ctype</em>([nelem,] [init...])</tt></h3>[m
[31m-<p>[m
[31m-Creates a cdata object for the given <tt>ct</tt>. VLA/VLS types[m
[31m-require the <tt>nelem</tt> argument. The second syntax uses a ctype as[m
[31m-a constructor and is otherwise fully equivalent.[m
[31m-</p>[m
[31m-<p>[m
[31m-The cdata object is initialized according to the[m
[31m-<a href="ext_ffi_semantics.html#init">rules for initializers</a>,[m
[31m-using the optional <tt>init</tt> arguments. Excess initializers cause[m
[31m-an error.[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: if you want to create many objects of one kind,[m
[31m-parse the cdecl only once and get its ctype with[m
[31m-<tt>ffi.typeof()</tt>. Then use the ctype as a constructor repeatedly.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Please note that an anonymous <tt>struct</tt> declaration implicitly[m
[31m-creates a new and distinguished ctype every time you use it for[m
[31m-<tt>ffi.new()</tt>. This is probably <b>not</b> what you want,[m
[31m-especially if you create more than one cdata object. Different anonymous[m
[31m-<tt>structs</tt> are not considered assignment-compatible by the[m
[31m-C&nbsp;standard, even though they may have the same fields! Also, they[m
[31m-are considered different types by the JIT-compiler, which may cause an[m
[31m-excessive number of traces. It's strongly suggested to either declare[m
[31m-a named <tt>struct</tt> or <tt>typedef</tt> with <tt>ffi.cdef()</tt>[m
[31m-or to create a single ctype object for an anonymous <tt>struct</tt>[m
[31m-with <tt>ffi.typeof()</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_typeof"><tt>ctype = ffi.typeof(ct)</tt></h3>[m
[31m-<p>[m
[31m-Creates a ctype object for the given <tt>ct</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-This function is especially useful to parse a cdecl only once and then[m
[31m-use the resulting ctype object as a <a href="#ffi_new">constructor</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_cast"><tt>cdata = ffi.cast(ct, init)</tt></h3>[m
[31m-<p>[m
[31m-Creates a scalar cdata object for the given <tt>ct</tt>. The cdata[m
[31m-object is initialized with <tt>init</tt> using the "cast" variant of[m
[31m-the <a href="ext_ffi_semantics.html#convert">C&nbsp;type conversion[m
[31m-rules</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-This functions is mainly useful to override the pointer compatibility[m
[31m-checks or to convert pointers to addresses or vice versa.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_metatype"><tt>ctype = ffi.metatype(ct, metatable)</tt></h3>[m
[31m-<p>[m
[31m-Creates a ctype object for the given <tt>ct</tt> and associates it with[m
[31m-a metatable. Only <tt>struct</tt>/<tt>union</tt> types, complex numbers[m
[31m-and vectors are allowed. Other types may be wrapped in a[m
[31m-<tt>struct</tt>, if needed.[m
[31m-</p>[m
[31m-<p>[m
[31m-The association with a metatable is permanent and cannot be changed[m
[31m-afterwards. Neither the contents of the <tt>metatable</tt> nor the[m
[31m-contents of an <tt>__index</tt> table (if any) may be modified[m
[31m-afterwards. The associated metatable automatically applies to all uses[m
[31m-of this type, no matter how the objects are created or where they[m
[31m-originate from. Note that pre-defined operations on types have[m
[31m-precedence (e.g. declared field names cannot be overriden).[m
[31m-</p>[m
[31m-<p>[m
[31m-All standard Lua metamethods are implemented. These are called directly,[m
[31m-without shortcuts and on any mix of types. For binary operations, the[m
[31m-left operand is checked first for a valid ctype metamethod. The[m
[31m-<tt>__gc</tt> metamethod only applies to <tt>struct</tt>/<tt>union</tt>[m
[31m-types and performs an implicit <a href="#ffi_gc"><tt>ffi.gc()</tt></a>[m
[31m-call during creation of an instance.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_gc"><tt>cdata = ffi.gc(cdata, finalizer)</tt></h3>[m
[31m-<p>[m
[31m-Associates a finalizer with a pointer or aggregate cdata object. The[m
[31m-cdata object is returned unchanged.[m
[31m-</p>[m
[31m-<p>[m
[31m-This function allows safe integration of unmanaged resources into the[m
[31m-automatic memory management of the LuaJIT garbage collector. Typical[m
[31m-usage:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local p = ffi.gc(ffi.C.malloc(n), ffi.C.free)[m
[31m-...[m
[31m-p = nil -- Last reference to p is gone.[m
[31m--- GC will eventually run finalizer: ffi.C.free(p)[m
[31m-</pre>[m
[31m-<p>[m
[31m-A cdata finalizer works like the <tt>__gc</tt> metamethod for userdata[m
[31m-objects: when the last reference to a cdata object is gone, the[m
[31m-associated finalizer is called with the cdata object as an argument. The[m
[31m-finalizer can be a Lua function or a cdata function or cdata function[m
[31m-pointer. An existing finalizer can be removed by setting a <tt>nil</tt>[m
[31m-finalizer, e.g. right before explicitly deleting a resource:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.C.free(ffi.gc(p, nil)) -- Manually free the memory.[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="info">C&nbsp;Type Information</h2>[m
[31m-<p>[m
[31m-The following API functions return information about C&nbsp;types.[m
[31m-They are most useful for inspecting cdata objects.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_sizeof"><tt>size = ffi.sizeof(ct [,nelem])</tt></h3>[m
[31m-<p>[m
[31m-Returns the size of <tt>ct</tt> in bytes. Returns <tt>nil</tt> if[m
[31m-the size is not known (e.g. for <tt>"void"</tt> or function types).[m
[31m-Requires <tt>nelem</tt> for VLA/VLS types, except for cdata objects.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_alignof"><tt>align = ffi.alignof(ct)</tt></h3>[m
[31m-<p>[m
[31m-Returns the minimum required alignment for <tt>ct</tt> in bytes.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_offsetof"><tt>ofs [,bpos,bsize] = ffi.offsetof(ct, field)</tt></h3>[m
[31m-<p>[m
[31m-Returns the offset (in bytes) of <tt>field</tt> relative to the start[m
[31m-of <tt>ct</tt>, which must be a <tt>struct</tt>. Additionally returns[m
[31m-the position and the field size (in bits) for bit fields.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_istype"><tt>status = ffi.istype(ct, obj)</tt></h3>[m
[31m-<p>[m
[31m-Returns <tt>true</tt> if <tt>obj</tt> has the C&nbsp;type given by[m
[31m-<tt>ct</tt>. Returns <tt>false</tt> otherwise.[m
[31m-</p>[m
[31m-<p>[m
[31m-C&nbsp;type qualifiers (<tt>const</tt> etc.) are ignored. Pointers are[m
[31m-checked with the standard pointer compatibility rules, but without any[m
[31m-special treatment for <tt>void&nbsp;*</tt>. If <tt>ct</tt> specifies a[m
[31m-<tt>struct</tt>/<tt>union</tt>, then a pointer to this type is accepted,[m
[31m-too. Otherwise the types must match exactly.[m
[31m-</p>[m
[31m-<p>[m
[31m-Note: this function accepts all kinds of Lua objects for the[m
[31m-<tt>obj</tt> argument, but always returns <tt>false</tt> for non-cdata[m
[31m-objects.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="util">Utility Functions</h2>[m
[31m-[m
[31m-<h3 id="ffi_errno"><tt>err = ffi.errno([newerr])</tt></h3>[m
[31m-<p>[m
[31m-Returns the error number set by the last C&nbsp;function call which[m
[31m-indicated an error condition. If the optional <tt>newerr</tt> argument[m
[31m-is present, the error number is set to the new value and the previous[m
[31m-value is returned.[m
[31m-</p>[m
[31m-<p>[m
[31m-This function offers a portable and OS-independent way to get and set the[m
[31m-error number. Note that only <em>some</em> C&nbsp;functions set the error[m
[31m-number. And it's only significant if the function actually indicated an[m
[31m-error condition (e.g. with a return value of <tt>-1</tt> or[m
[31m-<tt>NULL</tt>). Otherwise, it may or may not contain any previously set[m
[31m-value.[m
[31m-</p>[m
[31m-<p>[m
[31m-You're advised to call this function only when needed and as close as[m
[31m-possible after the return of the related C&nbsp;function. The[m
[31m-<tt>errno</tt> value is preserved across hooks, memory allocations,[m
[31m-invocations of the JIT compiler and other internal VM activity. The same[m
[31m-applies to the value returned by <tt>GetLastError()</tt> on Windows, but[m
[31m-you need to declare and call it yourself.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_string"><tt>str = ffi.string(ptr [,len])</tt></h3>[m
[31m-<p>[m
[31m-Creates an interned Lua string from the data pointed to by[m
[31m-<tt>ptr</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-If the optional argument <tt>len</tt> is missing, <tt>ptr</tt> is[m
[31m-converted to a <tt>"char&nbsp;*"</tt> and the data is assumed to be[m
[31m-zero-terminated. The length of the string is computed with[m
[31m-<tt>strlen()</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-Otherwise <tt>ptr</tt> is converted to a <tt>"void&nbsp;*"</tt> and[m
[31m-<tt>len</tt> gives the length of the data. The data may contain[m
[31m-embedded zeros and need not be byte-oriented (though this may cause[m
[31m-endianess issues).[m
[31m-</p>[m
[31m-<p>[m
[31m-This function is mainly useful to convert (temporary)[m
[31m-<tt>"const&nbsp;char&nbsp;*"</tt> pointers returned by[m
[31m-C&nbsp;functions to Lua strings and store them or pass them to other[m
[31m-functions expecting a Lua string. The Lua string is an (interned) copy[m
[31m-of the data and bears no relation to the original data area anymore.[m
[31m-Lua strings are 8&nbsp;bit clean and may be used to hold arbitrary,[m
[31m-non-character data.[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: it's faster to pass the length of the string, if[m
[31m-it's known. E.g. when the length is returned by a C&nbsp;call like[m
[31m-<tt>sprintf()</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_copy"><tt>ffi.copy(dst, src, len)<br>[m
[31m-ffi.copy(dst, str)</tt></h3>[m
[31m-<p>[m
[31m-Copies the data pointed to by <tt>src</tt> to <tt>dst</tt>.[m
[31m-<tt>dst</tt> is converted to a <tt>"void&nbsp;*"</tt> and <tt>src</tt>[m
[31m-is converted to a <tt>"const void&nbsp;*"</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-In the first syntax, <tt>len</tt> gives the number of bytes to copy.[m
[31m-Caveat: if <tt>src</tt> is a Lua string, then <tt>len</tt> must not[m
[31m-exceed <tt>#src+1</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-In the second syntax, the source of the copy must be a Lua string. All[m
[31m-bytes of the string <em>plus a zero-terminator</em> are copied to[m
[31m-<tt>dst</tt> (i.e. <tt>#src+1</tt> bytes).[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: <tt>ffi.copy()</tt> may be used as a faster[m
[31m-(inlinable) replacement for the C&nbsp;library functions[m
[31m-<tt>memcpy()</tt>, <tt>strcpy()</tt> and <tt>strncpy()</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_fill"><tt>ffi.fill(dst, len [,c])</tt></h3>[m
[31m-<p>[m
[31m-Fills the data pointed to by <tt>dst</tt> with <tt>len</tt> constant[m
[31m-bytes, given by <tt>c</tt>. If <tt>c</tt> is omitted, the data is[m
[31m-zero-filled.[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: <tt>ffi.fill()</tt> may be used as a faster[m
[31m-(inlinable) replacement for the C&nbsp;library function[m
[31m-<tt>memset(dst,&nbsp;c,&nbsp;len)</tt>. Please note the different[m
[31m-order of arguments![m
[31m-</p>[m
[31m-[m
[31m-<h2 id="target">Target-specific Information</h2>[m
[31m-[m
[31m-<h3 id="ffi_abi"><tt>status = ffi.abi(param)</tt></h3>[m
[31m-<p>[m
[31m-Returns <tt>true</tt> if <tt>param</tt> (a Lua string) applies for the[m
[31m-target ABI (Application Binary Interface). Returns <tt>false</tt>[m
[31m-otherwise. The following parameters are currently defined:[m
[31m-</p>[m
[31m-<table class="abitable">[m
[31m-<tr class="abihead">[m
[31m-<td class="abiparam">Parameter</td>[m
[31m-<td class="abidesc">Description</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="abiparam">32bit</td><td class="abidesc">32 bit architecture</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="abiparam">64bit</td><td class="abidesc">64 bit architecture</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="abiparam">le</td><td class="abidesc">Little-endian architecture</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="abiparam">be</td><td class="abidesc">Big-endian architecture</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="abiparam">fpu</td><td class="abidesc">Target has a hardware FPU</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="abiparam">softfp</td><td class="abidesc">softfp calling conventions</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="abiparam">hardfp</td><td class="abidesc">hardfp calling conventions</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="abiparam">eabi</td><td class="abidesc">EABI variant of the standard ABI</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="abiparam">win</td><td class="abidesc">Windows variant of the standard ABI</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="abiparam">gc64</td><td class="abidesc">64 bit GC references</td></tr>[m
[31m-</table>[m
[31m-[m
[31m-<h3 id="ffi_os"><tt>ffi.os</tt></h3>[m
[31m-<p>[m
[31m-Contains the target OS name. Same contents as[m
[31m-<a href="ext_jit.html#jit_os"><tt>jit.os</tt></a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_arch"><tt>ffi.arch</tt></h3>[m
[31m-<p>[m
[31m-Contains the target architecture name. Same contents as[m
[31m-<a href="ext_jit.html#jit_arch"><tt>jit.arch</tt></a>.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="callback">Methods for Callbacks</h2>[m
[31m-<p>[m
[31m-The C&nbsp;types for <a href="ext_ffi_semantics.html#callback">callbacks</a>[m
[31m-have some extra methods:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="callback_free"><tt>cb:free()</tt></h3>[m
[31m-<p>[m
[31m-Free the resources associated with a callback. The associated Lua[m
[31m-function is unanchored and may be garbage collected. The callback[m
[31m-function pointer is no longer valid and must not be called anymore[m
[31m-(it may be reused by a subsequently created callback).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="callback_set"><tt>cb:set(func)</tt></h3>[m
[31m-<p>[m
[31m-Associate a new Lua function with a callback. The C&nbsp;type of the[m
[31m-callback and the callback function pointer are unchanged.[m
[31m-</p>[m
[31m-<p>[m
[31m-This method is useful to dynamically switch the receiver of callbacks[m
[31m-without creating a new callback each time and registering it again (e.g.[m
[31m-with a GUI library).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="extended">Extended Standard Library Functions</h2>[m
[31m-<p>[m
[31m-The following standard library functions have been extended to work[m
[31m-with cdata objects:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="tonumber"><tt>n = tonumber(cdata)</tt></h3>[m
[31m-<p>[m
[31m-Converts a number cdata object to a <tt>double</tt> and returns it as[m
[31m-a Lua number. This is particularly useful for boxed 64&nbsp;bit[m
[31m-integer values. Caveat: this conversion may incur a precision loss.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="tostring"><tt>s = tostring(cdata)</tt></h3>[m
[31m-<p>[m
[31m-Returns a string representation of the value of 64&nbsp;bit integers[m
[31m-(<tt><b>"</b>nnn<b>LL"</b></tt> or <tt><b>"</b>nnn<b>ULL"</b></tt>) or[m
[31m-complex numbers (<tt><b>"</b>re&plusmn;im<b>i"</b></tt>). Otherwise[m
[31m-returns a string representation of the C&nbsp;type of a ctype object[m
[31m-(<tt><b>"ctype&lt;</b>type<b>&gt;"</b></tt>) or a cdata object[m
[31m-(<tt><b>"cdata&lt;</b>type<b>&gt;:&nbsp;</b>address"</tt>), unless you[m
[31m-override it with a <tt>__tostring</tt> metamethod (see[m
[31m-<a href="#ffi_metatype"><tt>ffi.metatype()</tt></a>).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="pairs"><tt>iter, obj, start = pairs(cdata)<br>[m
[31m-iter, obj, start = ipairs(cdata)<br></tt></h3>[m
[31m-<p>[m
[31m-Calls the <tt>__pairs</tt> or <tt>__ipairs</tt> metamethod of the[m
[31m-corresponding ctype.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="literals">Extensions to the Lua Parser</h2>[m
[31m-<p>[m
[31m-The parser for Lua source code treats numeric literals with the[m
[31m-suffixes <tt>LL</tt> or <tt>ULL</tt> as signed or unsigned 64&nbsp;bit[m
[31m-integers. Case doesn't matter, but uppercase is recommended for[m
[31m-readability. It handles decimal (<tt>42LL</tt>), hexadecimal[m
[31m-(<tt>0x2aLL</tt>) and binary (<tt>0b101010LL</tt>) literals.[m
[31m-</p>[m
[31m-<p>[m
[31m-The imaginary part of complex numbers can be specified by suffixing[m
[31m-number literals with <tt>i</tt> or <tt>I</tt>, e.g. <tt>12.5i</tt>.[m
[31m-Caveat: you'll need to use <tt>1i</tt> to get an imaginary part with[m
[31m-the value one, since <tt>i</tt> itself still refers to a variable[m
[31m-named <tt>i</tt>.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_semantics.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_semantics.html[m
[1mdeleted file mode 100644[m
[1mindex 15843d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_semantics.html[m
[1m+++ /dev/null[m
[36m@@ -1,1263 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>FFI Semantics</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.convtable { line-height: 1.2; }[m
[31m-tr.convhead td { font-weight: bold; }[m
[31m-td.convop { font-style: italic; width: 40%; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>FFI Semantics</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-This page describes the detailed semantics underlying the FFI library[m
[31m-and its interaction with both Lua and C&nbsp;code.[m
[31m-</p>[m
[31m-<p>[m
[31m-Given that the FFI library is designed to interface with C&nbsp;code[m
[31m-and that declarations can be written in plain C&nbsp;syntax, <b>it[m
[31m-closely follows the C&nbsp;language semantics</b>, wherever possible.[m
[31m-Some minor concessions are needed for smoother interoperation with Lua[m
[31m-language semantics.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please don't be overwhelmed by the contents of this page &mdash; this[m
[31m-is a reference and you may need to consult it, if in doubt. It doesn't[m
[31m-hurt to skim this page, but most of the semantics "just work" as you'd[m
[31m-expect them to work. It should be straightforward to write[m
[31m-applications using the LuaJIT FFI for developers with a C or C++[m
[31m-background.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="clang">C Language Support</h2>[m
[31m-<p>[m
[31m-The FFI library has a built-in C&nbsp;parser with a minimal memory[m
[31m-footprint. It's used by the <a href="ext_ffi_api.html">ffi.* library[m
[31m-functions</a> to declare C&nbsp;types or external symbols.[m
[31m-</p>[m
[31m-<p>[m
[31m-It's only purpose is to parse C&nbsp;declarations, as found e.g. in[m
[31m-C&nbsp;header files. Although it does evaluate constant expressions,[m
[31m-it's <em>not</em> a C&nbsp;compiler. The body of <tt>inline</tt>[m
[31m-C&nbsp;function definitions is simply ignored.[m
[31m-</p>[m
[31m-<p>[m
[31m-Also, this is <em>not</em> a validating C&nbsp;parser. It expects and[m
[31m-accepts correctly formed C&nbsp;declarations, but it may choose to[m
[31m-ignore bad declarations or show rather generic error messages. If in[m
[31m-doubt, please check the input against your favorite C&nbsp;compiler.[m
[31m-</p>[m
[31m-<p>[m
[31m-The C&nbsp;parser complies to the <b>C99 language standard</b> plus[m
[31m-the following extensions:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>The <tt>'\e'</tt> escape in character and string literals.</li>[m
[31m-[m
[31m-<li>The C99/C++ boolean type, declared with the keywords <tt>bool</tt>[m
[31m-or <tt>_Bool</tt>.</li>[m
[31m-[m
[31m-<li>Complex numbers, declared with the keywords <tt>complex</tt> or[m
[31m-<tt>_Complex</tt>.</li>[m
[31m-[m
[31m-<li>Two complex number types: <tt>complex</tt> (aka[m
[31m-<tt>complex&nbsp;double</tt>) and <tt>complex&nbsp;float</tt>.</li>[m
[31m-[m
[31m-<li>Vector types, declared with the GCC <tt>mode</tt> or[m
[31m-<tt>vector_size</tt> attribute.</li>[m
[31m-[m
[31m-<li>Unnamed ('transparent') <tt>struct</tt>/<tt>union</tt> fields[m
[31m-inside a <tt>struct</tt>/<tt>union</tt>.</li>[m
[31m-[m
[31m-<li>Incomplete <tt>enum</tt> declarations, handled like incomplete[m
[31m-<tt>struct</tt> declarations.</li>[m
[31m-[m
[31m-<li>Unnamed <tt>enum</tt> fields inside a[m
[31m-<tt>struct</tt>/<tt>union</tt>. This is similar to a scoped C++[m
[31m-<tt>enum</tt>, except that declared constants are visible in the[m
[31m-global namespace, too.</li>[m
[31m-[m
[31m-<li>Scoped <tt>static&nbsp;const</tt> declarations inside a[m
[31m-<tt>struct</tt>/<tt>union</tt> (from C++).</li>[m
[31m-[m
[31m-<li>Zero-length arrays (<tt>[0]</tt>), empty[m
[31m-<tt>struct</tt>/<tt>union</tt>, variable-length arrays (VLA,[m
[31m-<tt>[?]</tt>) and variable-length structs (VLS, with a trailing[m
[31m-VLA).</li>[m
[31m-[m
[31m-<li>C++ reference types (<tt>int&nbsp;&amp;x</tt>).</li>[m
[31m-[m
[31m-<li>Alternate GCC keywords with '<tt>__</tt>', e.g.[m
[31m-<tt>__const__</tt>.</li>[m
[31m-[m
[31m-<li>GCC <tt>__attribute__</tt> with the following attributes:[m
[31m-<tt>aligned</tt>, <tt>packed</tt>, <tt>mode</tt>,[m
[31m-<tt>vector_size</tt>, <tt>cdecl</tt>, <tt>fastcall</tt>,[m
[31m-<tt>stdcall</tt>, <tt>thiscall</tt>.</li>[m
[31m-[m
[31m-<li>The GCC <tt>__extension__</tt> keyword and the GCC[m
[31m-<tt>__alignof__</tt> operator.</li>[m
[31m-[m
[31m-<li>GCC <tt>__asm__("symname")</tt> symbol name redirection for[m
[31m-function declarations.</li>[m
[31m-[m
[31m-<li>MSVC keywords for fixed-length types: <tt>__int8</tt>,[m
[31m-<tt>__int16</tt>, <tt>__int32</tt> and <tt>__int64</tt>.</li>[m
[31m-[m
[31m-<li>MSVC <tt>__cdecl</tt>, <tt>__fastcall</tt>, <tt>__stdcall</tt>,[m
[31m-<tt>__thiscall</tt>, <tt>__ptr32</tt>, <tt>__ptr64</tt>,[m
[31m-<tt>__declspec(align(n))</tt> and <tt>#pragma&nbsp;pack</tt>.</li>[m
[31m-[m
[31m-<li>All other GCC/MSVC-specific attributes are ignored.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-The following C&nbsp;types are pre-defined by the C&nbsp;parser (like[m
[31m-a <tt>typedef</tt>, except re-declarations will be ignored):[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>Vararg handling: <tt>va_list</tt>, <tt>__builtin_va_list</tt>,[m
[31m-<tt>__gnuc_va_list</tt>.</li>[m
[31m-[m
[31m-<li>From <tt>&lt;stddef.h&gt;</tt>: <tt>ptrdiff_t</tt>,[m
[31m-<tt>size_t</tt>, <tt>wchar_t</tt>.</li>[m
[31m-[m
[31m-<li>From <tt>&lt;stdint.h&gt;</tt>: <tt>int8_t</tt>, <tt>int16_t</tt>,[m
[31m-<tt>int32_t</tt>, <tt>int64_t</tt>, <tt>uint8_t</tt>,[m
[31m-<tt>uint16_t</tt>, <tt>uint32_t</tt>, <tt>uint64_t</tt>,[m
[31m-<tt>intptr_t</tt>, <tt>uintptr_t</tt>.</li>[m
[31m-[m
[31m-<li>From <tt>&lt;unistd.h&gt;</tt> (POSIX): <tt>ssize_t</tt>.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-You're encouraged to use these types in preference to[m
[31m-compiler-specific extensions or target-dependent standard types.[m
[31m-E.g. <tt>char</tt> differs in signedness and <tt>long</tt> differs in[m
[31m-size, depending on the target architecture and platform ABI.[m
[31m-</p>[m
[31m-<p>[m
[31m-The following C&nbsp;features are <b>not</b> supported:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>A declaration must always have a type specifier; it doesn't[m
[31m-default to an <tt>int</tt> type.</li>[m
[31m-[m
[31m-<li>Old-style empty function declarations (K&amp;R) are not allowed.[m
[31m-All C&nbsp;functions must have a proper prototype declaration. A[m
[31m-function declared without parameters (<tt>int&nbsp;foo();</tt>) is[m
[31m-treated as a function taking zero arguments, like in C++.</li>[m
[31m-[m
[31m-<li>The <tt>long double</tt> C&nbsp;type is parsed correctly, but[m
[31m-there's no support for the related conversions, accesses or arithmetic[m
[31m-operations.</li>[m
[31m-[m
[31m-<li>Wide character strings and character literals are not[m
[31m-supported.</li>[m
[31m-[m
[31m-<li><a href="#status">See below</a> for features that are currently[m
[31m-not implemented.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="convert">C Type Conversion Rules</h2>[m
[31m-[m
[31m-<h3 id="convert_tolua">Conversions from C&nbsp;types to Lua objects</h3>[m
[31m-<p>[m
[31m-These conversion rules apply for <em>read accesses</em> to[m
[31m-C&nbsp;types: indexing pointers, arrays or[m
[31m-<tt>struct</tt>/<tt>union</tt> types; reading external variables or[m
[31m-constant values; retrieving return values from C&nbsp;calls:[m
[31m-</p>[m
[31m-<table class="convtable">[m
[31m-<tr class="convhead">[m
[31m-<td class="convin">Input</td>[m
[31m-<td class="convop">Conversion</td>[m
[31m-<td class="convout">Output</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin"><tt>int8_t</tt>, <tt>int16_t</tt></td><td class="convop">&rarr;<sup>sign-ext</sup> <tt>int32_t</tt> &rarr; <tt>double</tt></td><td class="convout">number</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>uint8_t</tt>, <tt>uint16_t</tt></td><td class="convop">&rarr;<sup>zero-ext</sup> <tt>int32_t</tt> &rarr; <tt>double</tt></td><td class="convout">number</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin"><tt>int32_t</tt>, <tt>uint32_t</tt></td><td class="convop">&rarr; <tt>double</tt></td><td class="convout">number</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>int64_t</tt>, <tt>uint64_t</tt></td><td class="convop">boxed value</td><td class="convout">64 bit int cdata</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr; <tt>double</tt></td><td class="convout">number</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin"><tt>bool</tt></td><td class="convop">0 &rarr; <tt>false</tt>, otherwise <tt>true</tt></td><td class="convout">boolean</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin"><tt>enum</tt></td><td class="convop">boxed value</td><td class="convout">enum cdata</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Complex number</td><td class="convop">boxed value</td><td class="convout">complex cdata</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Vector</td><td class="convop">boxed value</td><td class="convout">vector cdata</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Pointer</td><td class="convop">boxed value</td><td class="convout">pointer cdata</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Array</td><td class="convop">boxed reference</td><td class="convout">reference cdata</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">boxed reference</td><td class="convout">reference cdata</td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-Bitfields are treated like their underlying type.[m
[31m-</p>[m
[31m-<p>[m
[31m-Reference types are dereferenced <em>before</em> a conversion can take[m
[31m-place &mdash; the conversion is applied to the C&nbsp;type pointed to[m
[31m-by the reference.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="convert_fromlua">Conversions from Lua objects to C&nbsp;types</h3>[m
[31m-<p>[m
[31m-These conversion rules apply for <em>write accesses</em> to[m
[31m-C&nbsp;types: indexing pointers, arrays or[m
[31m-<tt>struct</tt>/<tt>union</tt> types; initializing cdata objects;[m
[31m-casts to C&nbsp;types; writing to external variables; passing[m
[31m-arguments to C&nbsp;calls:[m
[31m-</p>[m
[31m-<table class="convtable">[m
[31m-<tr class="convhead">[m
[31m-<td class="convin">Input</td>[m
[31m-<td class="convop">Conversion</td>[m
[31m-<td class="convout">Output</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">number</td><td class="convop">&rarr;</td><td class="convout"><tt>double</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">boolean</td><td class="convop"><tt>false</tt> &rarr; 0, <tt>true</tt> &rarr; 1</td><td class="convout"><tt>bool</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">nil</td><td class="convop"><tt>NULL</tt> &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">lightuserdata</td><td class="convop">lightuserdata address &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">userdata</td><td class="convop">userdata payload &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">io.* file</td><td class="convop">get FILE * handle &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">string</td><td class="convop">match against <tt>enum</tt> constant</td><td class="convout"><tt>enum</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">string</td><td class="convop">copy string data + zero-byte</td><td class="convout"><tt>int8_t[]</tt>, <tt>uint8_t[]</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">string</td><td class="convop">string data &rarr;</td><td class="convout"><tt>const char[]</tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin">function</td><td class="convop"><a href="#callback">create callback</a> &rarr;</td><td class="convout">C function type</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout">Array</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout"><tt>struct</tt>/<tt>union</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">cdata</td><td class="convop">cdata payload &rarr;</td><td class="convout">C type</td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-If the result type of this conversion doesn't match the[m
[31m-C&nbsp;type of the destination, the[m
[31m-<a href="#convert_between">conversion rules between C&nbsp;types</a>[m
[31m-are applied.[m
[31m-</p>[m
[31m-<p>[m
[31m-Reference types are immutable after initialization ("no re-seating of[m
[31m-references"). For initialization purposes or when passing values to[m
[31m-reference parameters, they are treated like pointers. Note that unlike[m
[31m-in C++, there's no way to implement automatic reference generation of[m
[31m-variables under the Lua language semantics. If you want to call a[m
[31m-function with a reference parameter, you need to explicitly pass a[m
[31m-one-element array.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="convert_between">Conversions between C&nbsp;types</h3>[m
[31m-<p>[m
[31m-These conversion rules are more or less the same as the standard[m
[31m-C&nbsp;conversion rules. Some rules only apply to casts, or require[m
[31m-pointer or type compatibility:[m
[31m-</p>[m
[31m-<table class="convtable">[m
[31m-<tr class="convhead">[m
[31m-<td class="convin">Input</td>[m
[31m-<td class="convop">Conversion</td>[m
[31m-<td class="convout">Output</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Signed integer</td><td class="convop">&rarr;<sup>narrow or sign-extend</sup></td><td class="convout">Integer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Unsigned integer</td><td class="convop">&rarr;<sup>narrow or zero-extend</sup></td><td class="convout">Integer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Integer</td><td class="convop">&rarr;<sup>round</sup></td><td class="convout"><tt>double</tt>, <tt>float</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup> <tt>int32_t</tt> &rarr;<sup>narrow</sup></td><td class="convout"><tt>(u)int8_t</tt>, <tt>(u)int16_t</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup></td><td class="convout"><tt>(u)int32_t</tt>, <tt>(u)int64_t</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>round</sup></td><td class="convout"><tt>float</tt>, <tt>double</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Number</td><td class="convop">n == 0 &rarr; 0, otherwise 1</td><td class="convout"><tt>bool</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>bool</tt></td><td class="convop"><tt>false</tt> &rarr; 0, <tt>true</tt> &rarr; 1</td><td class="convout">Number</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Complex number</td><td class="convop">convert real part</td><td class="convout">Number</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Number</td><td class="convop">convert real part, imag = 0</td><td class="convout">Complex number</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Complex number</td><td class="convop">convert real and imag part</td><td class="convout">Complex number</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin">Number</td><td class="convop">convert scalar and replicate</td><td class="convout">Vector</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Vector</td><td class="convop">copy (same size)</td><td class="convout">Vector</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">take base address (compat)</td><td class="convout">Pointer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Array</td><td class="convop">take base address (compat)</td><td class="convout">Pointer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Function</td><td class="convop">take function address</td><td class="convout">Function pointer</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Number</td><td class="convop">convert via <tt>uintptr_t</tt> (cast)</td><td class="convout">Pointer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Pointer</td><td class="convop">convert address (compat/cast)</td><td class="convout">Pointer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Pointer</td><td class="convop">convert address (cast)</td><td class="convout">Integer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Array</td><td class="convop">convert base address (cast)</td><td class="convout">Integer</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Array</td><td class="convop">copy (compat)</td><td class="convout">Array</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">copy (identical type)</td><td class="convout"><tt>struct</tt>/<tt>union</tt></td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-Bitfields or <tt>enum</tt> types are treated like their underlying[m
[31m-type.[m
[31m-</p>[m
[31m-<p>[m
[31m-Conversions not listed above will raise an error. E.g. it's not[m
[31m-possible to convert a pointer to a complex number or vice versa.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="convert_vararg">Conversions for vararg C&nbsp;function arguments</h3>[m
[31m-<p>[m
[31m-The following default conversion rules apply when passing Lua objects[m
[31m-to the variable argument part of vararg C&nbsp;functions:[m
[31m-</p>[m
[31m-<table class="convtable">[m
[31m-<tr class="convhead">[m
[31m-<td class="convin">Input</td>[m
[31m-<td class="convop">Conversion</td>[m
[31m-<td class="convout">Output</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">number</td><td class="convop">&rarr;</td><td class="convout"><tt>double</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">boolean</td><td class="convop"><tt>false</tt> &rarr; 0, <tt>true</tt> &rarr; 1</td><td class="convout"><tt>bool</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">nil</td><td class="convop"><tt>NULL</tt> &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">userdata</td><td class="convop">userdata payload &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">lightuserdata</td><td class="convop">lightuserdata address &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin">string</td><td class="convop">string data &rarr;</td><td class="convout"><tt>const char *</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin"><tt>float</tt> cdata</td><td class="convop">&rarr;</td><td class="convout"><tt>double</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Array cdata</td><td class="convop">take base address</td><td class="convout">Element pointer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin"><tt>struct</tt>/<tt>union</tt> cdata</td><td class="convop">take base address</td><td class="convout"><tt>struct</tt>/<tt>union</tt> pointer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Function cdata</td><td class="convop">take function address</td><td class="convout">Function pointer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Any other cdata</td><td class="convop">no conversion</td><td class="convout">C type</td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-To pass a Lua object, other than a cdata object, as a specific type,[m
[31m-you need to override the conversion rules: create a temporary cdata[m
[31m-object with a constructor or a cast and initialize it with the value[m
[31m-to pass:[m
[31m-</p>[m
[31m-<p>[m
[31m-Assuming <tt>x</tt> is a Lua number, here's how to pass it as an[m
[31m-integer to a vararg function:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.cdef[[[m
[31m-int printf(const char *fmt, ...);[m
[31m-]][m
[31m-ffi.C.printf("integer value: %d\n", ffi.new("int", x))[m
[31m-</pre>[m
[31m-<p>[m
[31m-If you don't do this, the default Lua number &rarr; <tt>double</tt>[m
[31m-conversion rule applies. A vararg C&nbsp;function expecting an integer[m
[31m-will see a garbled or uninitialized value.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="init">Initializers</h2>[m
[31m-<p>[m
[31m-Creating a cdata object with[m
[31m-<a href="ext_ffi_api.html#ffi_new"><tt>ffi.new()</tt></a> or the[m
[31m-equivalent constructor syntax always initializes its contents, too.[m
[31m-Different rules apply, depending on the number of optional[m
[31m-initializers and the C&nbsp;types involved:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>If no initializers are given, the object is filled with zero bytes.</li>[m
[31m-[m
[31m-<li>Scalar types (numbers and pointers) accept a single initializer.[m
[31m-The Lua object is <a href="#convert_fromlua">converted to the scalar[m
[31m-C&nbsp;type</a>.</li>[m
[31m-[m
[31m-<li>Valarrays (complex numbers and vectors) are treated like scalars[m
[31m-when a single initializer is given. Otherwise they are treated like[m
[31m-regular arrays.</li>[m
[31m-[m
[31m-<li>Aggregate types (arrays and structs) accept either a single cdata[m
[31m-initializer of the same type (copy constructor), a single[m
[31m-<a href="#init_table">table initializer</a>, or a flat list of[m
[31m-initializers.</li>[m
[31m-[m
[31m-<li>The elements of an array are initialized, starting at index zero.[m
[31m-If a single initializer is given for an array, it's repeated for all[m
[31m-remaining elements. This doesn't happen if two or more initializers[m
[31m-are given: all remaining uninitialized elements are filled with zero[m
[31m-bytes.</li>[m
[31m-[m
[31m-<li>Byte arrays may also be initialized with a Lua string. This copies[m
[31m-the whole string plus a terminating zero-byte. The copy stops early only[m
[31m-if the array has a known, fixed size.</li>[m
[31m-[m
[31m-<li>The fields of a <tt>struct</tt> are initialized in the order of[m
[31m-their declaration. Uninitialized fields are filled with zero[m
[31m-bytes.</li>[m
[31m-[m
[31m-<li>Only the first field of a <tt>union</tt> can be initialized with a[m
[31m-flat initializer.</li>[m
[31m-[m
[31m-<li>Elements or fields which are aggregates themselves are initialized[m
[31m-with a <em>single</em> initializer, but this may be a table[m
[31m-initializer or a compatible aggregate.</li>[m
[31m-[m
[31m-<li>Excess initializers cause an error.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="init_table">Table Initializers</h2>[m
[31m-<p>[m
[31m-The following rules apply if a Lua table is used to initialize an[m
[31m-Array or a <tt>struct</tt>/<tt>union</tt>:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>If the table index <tt>[0]</tt> is non-<tt>nil</tt>, then the[m
[31m-table is assumed to be zero-based. Otherwise it's assumed to be[m
[31m-one-based.</li>[m
[31m-[m
[31m-<li>Array elements, starting at index zero, are initialized one-by-one[m
[31m-with the consecutive table elements, starting at either index[m
[31m-<tt>[0]</tt> or <tt>[1]</tt>. This process stops at the first[m
[31m-<tt>nil</tt> table element.</li>[m
[31m-[m
[31m-<li>If exactly one array element was initialized, it's repeated for[m
[31m-all the remaining elements. Otherwise all remaining uninitialized[m
[31m-elements are filled with zero bytes.</li>[m
[31m-[m
[31m-<li>The above logic only applies to arrays with a known fixed size.[m
[31m-A VLA is only initialized with the element(s) given in the table.[m
[31m-Depending on the use case, you may need to explicitly add a[m
[31m-<tt>NULL</tt> or <tt>0</tt> terminator to a VLA.</li>[m
[31m-[m
[31m-<li>A <tt>struct</tt>/<tt>union</tt> can be initialized in the[m
[31m-order of the declaration of its fields. Each field is initialized with[m
[31m-consecutive table elements, starting at either index <tt>[0]</tt>[m
[31m-or <tt>[1]</tt>. This process stops at the first <tt>nil</tt> table[m
[31m-element.</li>[m
[31m-[m
[31m-<li>Otherwise, if neither index <tt>[0]</tt> nor <tt>[1]</tt> is present,[m
[31m-a <tt>struct</tt>/<tt>union</tt> is initialized by looking up each field[m
[31m-name (as a string key) in the table. Each non-<tt>nil</tt> value is[m
[31m-used to initialize the corresponding field.</li>[m
[31m-[m
[31m-<li>Uninitialized fields of a <tt>struct</tt> are filled with zero[m
[31m-bytes, except for the trailing VLA of a VLS.</li>[m
[31m-[m
[31m-<li>Initialization of a <tt>union</tt> stops after one field has been[m
[31m-initialized. If no field has been initialized, the <tt>union</tt> is[m
[31m-filled with zero bytes.</li>[m
[31m-[m
[31m-<li>Elements or fields which are aggregates themselves are initialized[m
[31m-with a <em>single</em> initializer, but this may be a nested table[m
[31m-initializer (or a compatible aggregate).</li>[m
[31m-[m
[31m-<li>Excess initializers for an array cause an error. Excess[m
[31m-initializers for a <tt>struct</tt>/<tt>union</tt> are ignored.[m
[31m-Unrelated table entries are ignored, too.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-Example:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local ffi = require("ffi")[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-struct foo { int a, b; };[m
[31m-union bar { int i; double d; };[m
[31m-struct nested { int x; struct foo y; };[m
[31m-]][m
[31m-[m
[31m-ffi.new("int[3]", {})            --> 0, 0, 0[m
[31m-ffi.new("int[3]", {1})           --> 1, 1, 1[m
[31m-ffi.new("int[3]", {1,2})         --> 1, 2, 0[m
[31m-ffi.new("int[3]", {1,2,3})       --> 1, 2, 3[m
[31m-ffi.new("int[3]", {[0]=1})       --> 1, 1, 1[m
[31m-ffi.new("int[3]", {[0]=1,2})     --> 1, 2, 0[m
[31m-ffi.new("int[3]", {[0]=1,2,3})   --> 1, 2, 3[m
[31m-ffi.new("int[3]", {[0]=1,2,3,4}) --> error: too many initializers[m
[31m-[m
[31m-ffi.new("struct foo", {})            --> a = 0, b = 0[m
[31m-ffi.new("struct foo", {1})           --> a = 1, b = 0[m
[31m-ffi.new("struct foo", {1,2})         --> a = 1, b = 2[m
[31m-ffi.new("struct foo", {[0]=1,2})     --> a = 1, b = 2[m
[31m-ffi.new("struct foo", {b=2})         --> a = 0, b = 2[m
[31m-ffi.new("struct foo", {a=1,b=2,c=3}) --> a = 1, b = 2  'c' is ignored[m
[31m-[m
[31m-ffi.new("union bar", {})        --> i = 0, d = 0.0[m
[31m-ffi.new("union bar", {1})       --> i = 1, d = ?[m
[31m-ffi.new("union bar", {[0]=1,2}) --> i = 1, d = ?    '2' is ignored[m
[31m-ffi.new("union bar", {d=2})     --> i = ?, d = 2.0[m
[31m-[m
[31m-ffi.new("struct nested", {1,{2,3}})     --> x = 1, y.a = 2, y.b = 3[m
[31m-ffi.new("struct nested", {x=1,y={2,3}}) --> x = 1, y.a = 2, y.b = 3[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="cdata_ops">Operations on cdata Objects</h2>[m
[31m-<p>[m
[31m-All of the standard Lua operators can be applied to cdata objects or a[m
[31m-mix of a cdata object and another Lua object. The following list shows[m
[31m-the pre-defined operations.[m
[31m-</p>[m
[31m-<p>[m
[31m-Reference types are dereferenced <em>before</em> performing each of[m
[31m-the operations below &mdash; the operation is applied to the[m
[31m-C&nbsp;type pointed to by the reference.[m
[31m-</p>[m
[31m-<p>[m
[31m-The pre-defined operations are always tried first before deferring to a[m
[31m-metamethod or index table (if any) for the corresponding ctype (except[m
[31m-for <tt>__new</tt>). An error is raised if the metamethod lookup or[m
[31m-index table lookup fails.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="cdata_array">Indexing a cdata object</h3>[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>Indexing a pointer/array</b>: a cdata pointer/array can be[m
[31m-indexed by a cdata number or a Lua number. The element address is[m
[31m-computed as the base address plus the number value multiplied by the[m
[31m-element size in bytes. A read access loads the element value and[m
[31m-<a href="#convert_tolua">converts it to a Lua object</a>. A write[m
[31m-access <a href="#convert_fromlua">converts a Lua object to the element[m
[31m-type</a> and stores the converted value to the element. An error is[m
[31m-raised if the element size is undefined or a write access to a[m
[31m-constant element is attempted.</li>[m
[31m-[m
[31m-<li><b>Dereferencing a <tt>struct</tt>/<tt>union</tt> field</b>: a[m
[31m-cdata <tt>struct</tt>/<tt>union</tt> or a pointer to a[m
[31m-<tt>struct</tt>/<tt>union</tt> can be dereferenced by a string key,[m
[31m-giving the field name. The field address is computed as the base[m
[31m-address plus the relative offset of the field. A read access loads the[m
[31m-field value and <a href="#convert_tolua">converts it to a Lua[m
[31m-object</a>. A write access <a href="#convert_fromlua">converts a Lua[m
[31m-object to the field type</a> and stores the converted value to the[m
[31m-field. An error is raised if a write access to a constant[m
[31m-<tt>struct</tt>/<tt>union</tt> or a constant field is attempted.[m
[31m-Scoped enum constants or static constants are treated like a constant[m
[31m-field.</li>[m
[31m-[m
[31m-<li><b>Indexing a complex number</b>: a complex number can be indexed[m
[31m-either by a cdata number or a Lua number with the values 0 or 1, or by[m
[31m-the strings <tt>"re"</tt> or <tt>"im"</tt>. A read access loads the[m
[31m-real part (<tt>[0]</tt>, <tt>.re</tt>) or the imaginary part[m
[31m-(<tt>[1]</tt>, <tt>.im</tt>) part of a complex number and[m
[31m-<a href="#convert_tolua">converts it to a Lua number</a>. The[m
[31m-sub-parts of a complex number are immutable &mdash; assigning to an[m
[31m-index of a complex number raises an error. Accessing out-of-bound[m
[31m-indexes returns unspecified results, but is guaranteed not to trigger[m
[31m-memory access violations.</li>[m
[31m-[m
[31m-<li><b>Indexing a vector</b>: a vector is treated like an array for[m
[31m-indexing purposes, except the vector elements are immutable &mdash;[m
[31m-assigning to an index of a vector raises an error.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-A ctype object can be indexed with a string key, too. The only[m
[31m-pre-defined operation is reading scoped constants of[m
[31m-<tt>struct</tt>/<tt>union</tt> types. All other accesses defer[m
[31m-to the corresponding metamethods or index tables (if any).[m
[31m-</p>[m
[31m-<p>[m
[31m-Note: since there's (deliberately) no address-of operator, a cdata[m
[31m-object holding a value type is effectively immutable after[m
[31m-initialization. The JIT compiler benefits from this fact when applying[m
[31m-certain optimizations.[m
[31m-</p>[m
[31m-<p>[m
[31m-As a consequence, the <em>elements</em> of complex numbers and[m
[31m-vectors are immutable. But the elements of an aggregate holding these[m
[31m-types <em>may</em> be modified of course. I.e. you cannot assign to[m
[31m-<tt>foo.c.im</tt>, but you can assign a (newly created) complex number[m
[31m-to <tt>foo.c</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-The JIT compiler implements strict aliasing rules: accesses to different[m
[31m-types do <b>not</b> alias, except for differences in signedness (this[m
[31m-applies even to <tt>char</tt> pointers, unlike C99). Type punning[m
[31m-through unions is explicitly detected and allowed.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="cdata_call">Calling a cdata object</h3>[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>Constructor</b>: a ctype object can be called and used as a[m
[31m-<a href="ext_ffi_api.html#ffi_new">constructor</a>. This is equivalent[m
[31m-to <tt>ffi.new(ct, ...)</tt>, unless a <tt>__new</tt> metamethod is[m
[31m-defined. The <tt>__new</tt> metamethod is called with the ctype object[m
[31m-plus any other arguments passed to the contructor. Note that you have to[m
[31m-use <tt>ffi.new</tt> inside of it, since calling <tt>ct(...)</tt> would[m
[31m-cause infinite recursion.</li>[m
[31m-[m
[31m-<li><b>C&nbsp;function call</b>: a cdata function or cdata function[m
[31m-pointer can be called. The passed arguments are[m
[31m-<a href="#convert_fromlua">converted to the C&nbsp;types</a> of the[m
[31m-parameters given by the function declaration. Arguments passed to the[m
[31m-variable argument part of vararg C&nbsp;function use[m
[31m-<a href="#convert_vararg">special conversion rules</a>. This[m
[31m-C&nbsp;function is called and the return value (if any) is[m
[31m-<a href="#convert_tolua">converted to a Lua object</a>.<br>[m
[31m-On Windows/x86 systems, <tt>__stdcall</tt> functions are automatically[m
[31m-detected and a function declared as <tt>__cdecl</tt> (the default) is[m
[31m-silently fixed up after the first call.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h3 id="cdata_arith">Arithmetic on cdata objects</h3>[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>Pointer arithmetic</b>: a cdata pointer/array and a cdata[m
[31m-number or a Lua number can be added or subtracted. The number must be[m
[31m-on the right hand side for a subtraction. The result is a pointer of[m
[31m-the same type with an address plus or minus the number value[m
[31m-multiplied by the element size in bytes. An error is raised if the[m
[31m-element size is undefined.</li>[m
[31m-[m
[31m-<li><b>Pointer difference</b>: two compatible cdata pointers/arrays[m
[31m-can be subtracted. The result is the difference between their[m
[31m-addresses, divided by the element size in bytes. An error is raised if[m
[31m-the element size is undefined or zero.</li>[m
[31m-[m
[31m-<li><b>64&nbsp;bit integer arithmetic</b>: the standard arithmetic[m
[31m-operators (<tt>+&nbsp;-&nbsp;*&nbsp;/&nbsp;%&nbsp;^</tt> and unary[m
[31m-minus) can be applied to two cdata numbers, or a cdata number and a[m
[31m-Lua number. If one of them is an <tt>uint64_t</tt>, the other side is[m
[31m-converted to an <tt>uint64_t</tt> and an unsigned arithmetic operation[m
[31m-is performed. Otherwise both sides are converted to an[m
[31m-<tt>int64_t</tt> and a signed arithmetic operation is performed. The[m
[31m-result is a boxed 64&nbsp;bit cdata object.<br>[m
[31m-[m
[31m-If one of the operands is an <tt>enum</tt> and the other operand is a[m
[31m-string, the string is converted to the value of a matching <tt>enum</tt>[m
[31m-constant before the above conversion.<br>[m
[31m-[m
[31m-These rules ensure that 64&nbsp;bit integers are "sticky". Any[m
[31m-expression involving at least one 64&nbsp;bit integer operand results[m
[31m-in another one. The undefined cases for the division, modulo and power[m
[31m-operators return <tt>2LL&nbsp;^&nbsp;63</tt> or[m
[31m-<tt>2ULL&nbsp;^&nbsp;63</tt>.<br>[m
[31m-[m
[31m-You'll have to explicitly convert a 64&nbsp;bit integer to a Lua[m
[31m-number (e.g. for regular floating-point calculations) with[m
[31m-<tt>tonumber()</tt>. But note this may incur a precision loss.</li>[m
[31m-[m
[31m-<li><b>64&nbsp;bit bitwise operations</b>: the rules for 64&nbsp;bit[m
[31m-arithmetic operators apply analogously.<br>[m
[31m-[m
[31m-Unlike the other <tt>bit.*</tt> operations, <tt>bit.tobit()</tt>[m
[31m-converts a cdata number via <tt>int64_t</tt> to <tt>int32_t</tt> and[m
[31m-returns a Lua number.<br>[m
[31m-[m
[31m-For <tt>bit.band()</tt>, <tt>bit.bor()</tt> and <tt>bit.bxor()</tt>, the[m
[31m-conversion to <tt>int64_t</tt> or <tt>uint64_t</tt> applies to[m
[31m-<em>all</em> arguments, if <em>any</em> argument is a cdata number.<br>[m
[31m-[m
[31m-For all other operations, only the first argument is used to determine[m
[31m-the output type. This implies that a cdata number as a shift count for[m
[31m-shifts and rotates is accepted, but that alone does <em>not</em> cause[m
[31m-a cdata number output.[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h3 id="cdata_comp">Comparisons of cdata objects</h3>[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>Pointer comparison</b>: two compatible cdata pointers/arrays[m
[31m-can be compared. The result is the same as an unsigned comparison of[m
[31m-their addresses. <tt>nil</tt> is treated like a <tt>NULL</tt> pointer,[m
[31m-which is compatible with any other pointer type.</li>[m
[31m-[m
[31m-<li><b>64&nbsp;bit integer comparison</b>: two cdata numbers, or a[m
[31m-cdata number and a Lua number can be compared with each other. If one[m
[31m-of them is an <tt>uint64_t</tt>, the other side is converted to an[m
[31m-<tt>uint64_t</tt> and an unsigned comparison is performed. Otherwise[m
[31m-both sides are converted to an <tt>int64_t</tt> and a signed[m
[31m-comparison is performed.<br>[m
[31m-[m
[31m-If one of the operands is an <tt>enum</tt> and the other operand is a[m
[31m-string, the string is converted to the value of a matching <tt>enum</tt>[m
[31m-constant before the above conversion.<br>[m
[31m-[m
[31m-<li><b>Comparisons for equality/inequality</b> never raise an error.[m
[31m-Even incompatible pointers can be compared for equality by address. Any[m
[31m-other incompatible comparison (also with non-cdata objects) treats the[m
[31m-two sides as unequal.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h3 id="cdata_key">cdata objects as table keys</h3>[m
[31m-<p>[m
[31m-Lua tables may be indexed by cdata objects, but this doesn't provide[m
[31m-any useful semantics &mdash; <b>cdata objects are unsuitable as table[m
[31m-keys!</b>[m
[31m-</p>[m
[31m-<p>[m
[31m-A cdata object is treated like any other garbage-collected object and[m
[31m-is hashed and compared by its address for table indexing. Since[m
[31m-there's no interning for cdata value types, the same value may be[m
[31m-boxed in different cdata objects with different addresses. Thus[m
[31m-<tt>t[1LL+1LL]</tt> and <tt>t[2LL]</tt> usually <b>do not</b> point to[m
[31m-the same hash slot and they certainly <b>do not</b> point to the same[m
[31m-hash slot as <tt>t[2]</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-It would seriously drive up implementation complexity and slow down[m
[31m-the common case, if one were to add extra handling for by-value[m
[31m-hashing and comparisons to Lua tables. Given the ubiquity of their use[m
[31m-inside the VM, this is not acceptable.[m
[31m-</p>[m
[31m-<p>[m
[31m-There are three viable alternatives, if you really need to use cdata[m
[31m-objects as keys:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>If you can get by with the precision of Lua numbers[m
[31m-(52&nbsp;bits), then use <tt>tonumber()</tt> on a cdata number or[m
[31m-combine multiple fields of a cdata aggregate to a Lua number. Then use[m
[31m-the resulting Lua number as a key when indexing tables.<br>[m
[31m-One obvious benefit: <tt>t[tonumber(2LL)]</tt> <b>does</b> point to[m
[31m-the same slot as <tt>t[2]</tt>.</li>[m
[31m-[m
[31m-<li>Otherwise use either <tt>tostring()</tt> on 64&nbsp;bit integers[m
[31m-or complex numbers or combine multiple fields of a cdata aggregate to[m
[31m-a Lua string (e.g. with[m
[31m-<a href="ext_ffi_api.html#ffi_string"><tt>ffi.string()</tt></a>). Then[m
[31m-use the resulting Lua string as a key when indexing tables.</li>[m
[31m-[m
[31m-<li>Create your own specialized hash table implementation using the[m
[31m-C&nbsp;types provided by the FFI library, just like you would in[m
[31m-C&nbsp;code. Ultimately this may give much better performance than the[m
[31m-other alternatives or what a generic by-value hash table could[m
[31m-possibly provide.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="param">Parameterized Types</h2>[m
[31m-<p>[m
[31m-To facilitate some abstractions, the two functions[m
[31m-<a href="ext_ffi_api.html#ffi_typeof"><tt>ffi.typeof</tt></a> and[m
[31m-<a href="ext_ffi_api.html#ffi_cdef"><tt>ffi.cdef</tt></a> support[m
[31m-parameterized types in C&nbsp;declarations. Note: none of the other API[m
[31m-functions taking a cdecl allow this.[m
[31m-</p>[m
[31m-<p>[m
[31m-Any place you can write a <b><tt>typedef</tt> name</b>, an[m
[31m-<b>identifier</b> or a <b>number</b> in a declaration, you can write[m
[31m-<tt>$</tt> (the dollar sign) instead. These placeholders are replaced in[m
[31m-order of appearance with the arguments following the cdecl string:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m--- Declare a struct with a parameterized field type and name:[m
[31m-ffi.cdef([[[m
[31m-typedef struct { $ $; } foo_t;[m
[31m-]], type1, name1)[m
[31m-[m
[31m--- Anonymous struct with dynamic names:[m
[31m-local bar_t = ffi.typeof("struct { int $, $; }", name1, name2)[m
[31m--- Derived pointer type:[m
[31m-local bar_ptr_t = ffi.typeof("$ *", bar_t)[m
[31m-[m
[31m--- Parameterized dimensions work even where a VLA won't work:[m
[31m-local matrix_t = ffi.typeof("uint8_t[$][$]", width, height)[m
[31m-</pre>[m
[31m-<p>[m
[31m-Caveat: this is <em>not</em> simple text substitution! A passed ctype or[m
[31m-cdata object is treated like the underlying type, a passed string is[m
[31m-considered an identifier and a number is considered a number. You must[m
[31m-not mix this up: e.g. passing <tt>"int"</tt> as a string doesn't work in[m
[31m-place of a type, you'd need to use <tt>ffi.typeof("int")</tt> instead.[m
[31m-</p>[m
[31m-<p>[m
[31m-The main use for parameterized types are libraries implementing abstract[m
[31m-data types[m
[31m-(<a href="http://www.freelists.org/post/luajit/ffi-type-of-pointer-to,8"><span class="ext">&raquo;</span>&nbsp;example</a>),[m
[31m-similar to what can be achieved with C++ template metaprogramming.[m
[31m-Another use case are derived types of anonymous structs, which avoids[m
[31m-pollution of the global struct namespace.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note that parameterized types are a nice tool and indispensable[m
[31m-for certain use cases. But you'll want to use them sparingly in regular[m
[31m-code, e.g. when all types are actually fixed.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="gc">Garbage Collection of cdata Objects</h2>[m
[31m-<p>[m
[31m-All explicitly (<tt>ffi.new()</tt>, <tt>ffi.cast()</tt> etc.) or[m
[31m-implicitly (accessors) created cdata objects are garbage collected.[m
[31m-You need to ensure to retain valid references to cdata objects[m
[31m-somewhere on a Lua stack, an upvalue or in a Lua table while they are[m
[31m-still in use. Once the last reference to a cdata object is gone, the[m
[31m-garbage collector will automatically free the memory used by it (at[m
[31m-the end of the next GC cycle).[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note that pointers themselves are cdata objects, however they[m
[31m-are <b>not</b> followed by the garbage collector. So e.g. if you[m
[31m-assign a cdata array to a pointer, you must keep the cdata object[m
[31m-holding the array alive as long as the pointer is still in use:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.cdef[[[m
[31m-typedef struct { int *a; } foo_t;[m
[31m-]][m
[31m-[m
[31m-local s = ffi.new("foo_t", ffi.new("int[10]")) -- <span style="color:#c00000;">WRONG!</span>[m
[31m-[m
[31m-local a = ffi.new("int[10]") -- <span style="color:#00a000;">OK</span>[m
[31m-local s = ffi.new("foo_t", a)[m
[31m--- Now do something with 's', but keep 'a' alive until you're done.[m
[31m-</pre>[m
[31m-<p>[m
[31m-Similar rules apply for Lua strings which are implicitly converted to[m
[31m-<tt>"const&nbsp;char&nbsp;*"</tt>: the string object itself must be[m
[31m-referenced somewhere or it'll be garbage collected eventually. The[m
[31m-pointer will then point to stale data, which may have already been[m
[31m-overwritten. Note that <em>string literals</em> are automatically kept[m
[31m-alive as long as the function containing it (actually its prototype)[m
[31m-is not garbage collected.[m
[31m-</p>[m
[31m-<p>[m
[31m-Objects which are passed as an argument to an external C&nbsp;function[m
[31m-are kept alive until the call returns. So it's generally safe to[m
[31m-create temporary cdata objects in argument lists. This is a common[m
[31m-idiom for <a href="#convert_vararg">passing specific C&nbsp;types to[m
[31m-vararg functions</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-Memory areas returned by C functions (e.g. from <tt>malloc()</tt>)[m
[31m-must be manually managed, of course (or use[m
[31m-<a href="ext_ffi_api.html#ffi_gc"><tt>ffi.gc()</tt></a>). Pointers to[m
[31m-cdata objects are indistinguishable from pointers returned by C[m
[31m-functions (which is one of the reasons why the GC cannot follow them).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="callback">Callbacks</h2>[m
[31m-<p>[m
[31m-The LuaJIT FFI automatically generates special callback functions[m
[31m-whenever a Lua function is converted to a C&nbsp;function pointer. This[m
[31m-associates the generated callback function pointer with the C&nbsp;type[m
[31m-of the function pointer and the Lua function object (closure).[m
[31m-</p>[m
[31m-<p>[m
[31m-This can happen implicitly due to the usual conversions, e.g. when[m
[31m-passing a Lua function to a function pointer argument. Or you can use[m
[31m-<tt>ffi.cast()</tt> to explicitly cast a Lua function to a[m
[31m-C&nbsp;function pointer.[m
[31m-</p>[m
[31m-<p>[m
[31m-Currently only certain C&nbsp;function types can be used as callback[m
[31m-functions. Neither C&nbsp;vararg functions nor functions with[m
[31m-pass-by-value aggregate argument or result types are supported. There[m
[31m-are no restrictions for the kind of Lua functions that can be called[m
[31m-from the callback &mdash; no checks for the proper number of arguments[m
[31m-are made. The return value of the Lua function will be converted to the[m
[31m-result type and an error will be thrown for invalid conversions.[m
[31m-</p>[m
[31m-<p>[m
[31m-It's allowed to throw errors across a callback invocation, but it's not[m
[31m-advisable in general. Do this only if you know the C&nbsp;function, that[m
[31m-called the callback, copes with the forced stack unwinding and doesn't[m
[31m-leak resources.[m
[31m-</p>[m
[31m-<p>[m
[31m-One thing that's not allowed, is to let an FFI call into a C&nbsp;function[m
[31m-get JIT-compiled, which in turn calls a callback, calling into Lua again.[m
[31m-Usually this attempt is caught by the interpreter first and the[m
[31m-C&nbsp;function is blacklisted for compilation.[m
[31m-</p>[m
[31m-<p>[m
[31m-However, this heuristic may fail under specific circumstances: e.g. a[m
[31m-message polling function might not run Lua callbacks right away and the call[m
[31m-gets JIT-compiled. If it later happens to call back into Lua (e.g. a rarely[m
[31m-invoked error callback), you'll get a VM PANIC with the message[m
[31m-<tt>"bad callback"</tt>. Then you'll need to manually turn off[m
[31m-JIT-compilation with[m
[31m-<a href="ext_jit.html#jit_onoff_func"><tt>jit.off()</tt></a> for the[m
[31m-surrounding Lua function that invokes such a message polling function (or[m
[31m-similar).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="callback_resources">Callback resource handling</h3>[m
[31m-<p>[m
[31m-Callbacks take up resources &mdash; you can only have a limited number[m
[31m-of them at the same time (500&nbsp;-&nbsp;1000, depending on the[m
[31m-architecture). The associated Lua functions are anchored to prevent[m
[31m-garbage collection, too.[m
[31m-</p>[m
[31m-<p>[m
[31m-<b>Callbacks due to implicit conversions are permanent!</b> There is no[m
[31m-way to guess their lifetime, since the C&nbsp;side might store the[m
[31m-function pointer for later use (typical for GUI toolkits). The associated[m
[31m-resources cannot be reclaimed until termination:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.cdef[[[m
[31m-typedef int (__stdcall *WNDENUMPROC)(void *hwnd, intptr_t l);[m
[31m-int EnumWindows(WNDENUMPROC func, intptr_t l);[m
[31m-]][m
[31m-[m
[31m--- Implicit conversion to a callback via function pointer argument.[m
[31m-local count = 0[m
[31m-ffi.C.EnumWindows(function(hwnd, l)[m
[31m-  count = count + 1[m
[31m-  return true[m
[31m-end, 0)[m
[31m--- The callback is permanent and its resources cannot be reclaimed![m
[31m--- Ok, so this may not be a problem, if you do this only once.[m
[31m-</pre>[m
[31m-<p>[m
[31m-Note: this example shows that you <em>must</em> properly declare[m
[31m-<tt>__stdcall</tt> callbacks on Windows/x86 systems. The calling[m
[31m-convention cannot be automatically detected, unlike for[m
[31m-<tt>__stdcall</tt> calls <em>to</em> Windows functions.[m
[31m-</p>[m
[31m-<p>[m
[31m-For some use cases it's necessary to free up the resources or to[m
[31m-dynamically redirect callbacks. Use an explicit cast to a[m
[31m-C&nbsp;function pointer and keep the resulting cdata object. Then use[m
[31m-the <a href="ext_ffi_api.html#callback_free"><tt>cb:free()</tt></a>[m
[31m-or <a href="ext_ffi_api.html#callback_set"><tt>cb:set()</tt></a> methods[m
[31m-on the cdata object:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m--- Explicitly convert to a callback via cast.[m
[31m-local count = 0[m
[31m-local cb = ffi.cast("WNDENUMPROC", function(hwnd, l)[m
[31m-  count = count + 1[m
[31m-  return true[m
[31m-end)[m
[31m-[m
[31m--- Pass it to a C function.[m
[31m-ffi.C.EnumWindows(cb, 0)[m
[31m--- EnumWindows doesn't need the callback after it returns, so free it.[m
[31m-[m
[31m-cb:free()[m
[31m--- The callback function pointer is no longer valid and its resources[m
[31m--- will be reclaimed. The created Lua closure will be garbage collected.[m
[31m-</pre>[m
[31m-[m
[31m-<h3 id="callback_performance">Callback performance</h3>[m
[31m-<p>[m
[31m-<b>Callbacks are slow!</b> First, the C&nbsp;to Lua transition itself[m
[31m-has an unavoidable cost, similar to a <tt>lua_call()</tt> or[m
[31m-<tt>lua_pcall()</tt>. Argument and result marshalling add to that cost.[m
[31m-And finally, neither the C&nbsp;compiler nor LuaJIT can inline or[m
[31m-optimize across the language barrier and hoist repeated computations out[m
[31m-of a callback function.[m
[31m-</p>[m
[31m-<p>[m
[31m-Do not use callbacks for performance-sensitive work: e.g. consider a[m
[31m-numerical integration routine which takes a user-defined function to[m
[31m-integrate over. It's a bad idea to call a user-defined Lua function from[m
[31m-C&nbsp;code millions of times. The callback overhead will be absolutely[m
[31m-detrimental for performance.[m
[31m-</p>[m
[31m-<p>[m
[31m-It's considerably faster to write the numerical integration routine[m
[31m-itself in Lua &mdash; the JIT compiler will be able to inline the[m
[31m-user-defined function and optimize it together with its calling context,[m
[31m-with very competitive performance.[m
[31m-</p>[m
[31m-<p>[m
[31m-As a general guideline: <b>use callbacks only when you must</b>, because[m
[31m-of existing C&nbsp;APIs. E.g. callback performance is irrelevant for a[m
[31m-GUI application, which waits for user input most of the time, anyway.[m
[31m-</p>[m
[31m-<p>[m
[31m-For new designs <b>avoid push-style APIs</b>: a C&nbsp;function repeatedly[m
[31m-calling a callback for each result. Instead <b>use pull-style APIs</b>:[m
[31m-call a C&nbsp;function repeatedly to get a new result. Calls from Lua[m
[31m-to C via the FFI are much faster than the other way round. Most well-designed[m
[31m-libraries already use pull-style APIs (read/write, get/put).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="clib">C Library Namespaces</h2>[m
[31m-<p>[m
[31m-A C&nbsp;library namespace is a special kind of object which allows[m
[31m-access to the symbols contained in shared libraries or the default[m
[31m-symbol namespace. The default[m
[31m-<a href="ext_ffi_api.html#ffi_C"><tt>ffi.C</tt></a> namespace is[m
[31m-automatically created when the FFI library is loaded. C&nbsp;library[m
[31m-namespaces for specific shared libraries may be created with the[m
[31m-<a href="ext_ffi_api.html#ffi_load"><tt>ffi.load()</tt></a> API[m
[31m-function.[m
[31m-</p>[m
[31m-<p>[m
[31m-Indexing a C&nbsp;library namespace object with a symbol name (a Lua[m
[31m-string) automatically binds it to the library. First the symbol type[m
[31m-is resolved &mdash; it must have been declared with[m
[31m-<a href="ext_ffi_api.html#ffi_cdef"><tt>ffi.cdef</tt></a>. Then the[m
[31m-symbol address is resolved by searching for the symbol name in the[m
[31m-associated shared libraries or the default symbol namespace. Finally,[m
[31m-the resulting binding between the symbol name, the symbol type and its[m
[31m-address is cached. Missing symbol declarations or nonexistent symbol[m
[31m-names cause an error.[m
[31m-</p>[m
[31m-<p>[m
[31m-This is what happens on a <b>read access</b> for the different kinds of[m
[31m-symbols:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>External functions: a cdata object with the type of the function[m
[31m-and its address is returned.</li>[m
[31m-[m
[31m-<li>External variables: the symbol address is dereferenced and the[m
[31m-loaded value is <a href="#convert_tolua">converted to a Lua object</a>[m
[31m-and returned.</li>[m
[31m-[m
[31m-<li>Constant values (<tt>static&nbsp;const</tt> or <tt>enum</tt>[m
[31m-constants): the constant is <a href="#convert_tolua">converted to a[m
[31m-Lua object</a> and returned.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-This is what happens on a <b>write access</b>:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>External variables: the value to be written is[m
[31m-<a href="#convert_fromlua">converted to the C&nbsp;type</a> of the[m
[31m-variable and then stored at the symbol address.</li>[m
[31m-[m
[31m-<li>Writing to constant variables or to any other symbol type causes[m
[31m-an error, like any other attempted write to a constant location.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-C&nbsp;library namespaces themselves are garbage collected objects. If[m
[31m-the last reference to the namespace object is gone, the garbage[m
[31m-collector will eventually release the shared library reference and[m
[31m-remove all memory associated with the namespace. Since this may[m
[31m-trigger the removal of the shared library from the memory of the[m
[31m-running process, it's generally <em>not safe</em> to use function[m
[31m-cdata objects obtained from a library if the namespace object may be[m
[31m-unreferenced.[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: the JIT compiler specializes to the identity of[m
[31m-namespace objects and to the strings used to index it. This[m
[31m-effectively turns function cdata objects into constants. It's not[m
[31m-useful and actually counter-productive to explicitly cache these[m
[31m-function objects, e.g. <tt>local strlen = ffi.C.strlen</tt>. OTOH it[m
[31m-<em>is</em> useful to cache the namespace itself, e.g. <tt>local C =[m
[31m-ffi.C</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="policy">No Hand-holding!</h2>[m
[31m-<p>[m
[31m-The FFI library has been designed as <b>a low-level library</b>. The[m
[31m-goal is to interface with C&nbsp;code and C&nbsp;data types with a[m
[31m-minimum of overhead. This means <b>you can do anything you can do[m
[31m-from&nbsp;C</b>: access all memory, overwrite anything in memory, call[m
[31m-machine code at any memory address and so on.[m
[31m-</p>[m
[31m-<p>[m
[31m-The FFI library provides <b>no memory safety</b>, unlike regular Lua[m
[31m-code. It will happily allow you to dereference a <tt>NULL</tt>[m
[31m-pointer, to access arrays out of bounds or to misdeclare[m
[31m-C&nbsp;functions. If you make a mistake, your application might crash,[m
[31m-just like equivalent C&nbsp;code would.[m
[31m-</p>[m
[31m-<p>[m
[31m-This behavior is inevitable, since the goal is to provide full[m
[31m-interoperability with C&nbsp;code. Adding extra safety measures, like[m
[31m-bounds checks, would be futile. There's no way to detect[m
[31m-misdeclarations of C&nbsp;functions, since shared libraries only[m
[31m-provide symbol names, but no type information. Likewise there's no way[m
[31m-to infer the valid range of indexes for a returned pointer.[m
[31m-</p>[m
[31m-<p>[m
[31m-Again: the FFI library is a low-level library. This implies it needs[m
[31m-to be used with care, but it's flexibility and performance often[m
[31m-outweigh this concern. If you're a C or C++ developer, it'll be easy[m
[31m-to apply your existing knowledge. OTOH writing code for the FFI[m
[31m-library is not for the faint of heart and probably shouldn't be the[m
[31m-first exercise for someone with little experience in Lua, C or C++.[m
[31m-</p>[m
[31m-<p>[m
[31m-As a corollary of the above, the FFI library is <b>not safe for use by[m
[31m-untrusted Lua code</b>. If you're sandboxing untrusted Lua code, you[m
[31m-definitely don't want to give this code access to the FFI library or[m
[31m-to <em>any</em> cdata object (except 64&nbsp;bit integers or complex[m
[31m-numbers). Any properly engineered Lua sandbox needs to provide safety[m
[31m-wrappers for many of the standard Lua library functions &mdash;[m
[31m-similar wrappers need to be written for high-level operations on FFI[m
[31m-data types, too.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="status">Current Status</h2>[m
[31m-<p>[m
[31m-The initial release of the FFI library has some limitations and is[m
[31m-missing some features. Most of these will be fixed in future releases.[m
[31m-</p>[m
[31m-<p>[m
[31m-<a href="#clang">C language support</a> is[m
[31m-currently incomplete:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>C&nbsp;declarations are not passed through a C&nbsp;pre-processor,[m
[31m-yet.</li>[m
[31m-<li>The C&nbsp;parser is able to evaluate most constant expressions[m
[31m-commonly found in C&nbsp;header files. However it doesn't handle the[m
[31m-full range of C&nbsp;expression semantics and may fail for some[m
[31m-obscure constructs.</li>[m
[31m-<li><tt>static const</tt> declarations only work for integer types[m
[31m-up to 32&nbsp;bits. Neither declaring string constants nor[m
[31m-floating-point constants is supported.</li>[m
[31m-<li>Packed <tt>struct</tt> bitfields that cross container boundaries[m
[31m-are not implemented.</li>[m
[31m-<li>Native vector types may be defined with the GCC <tt>mode</tt> or[m
[31m-<tt>vector_size</tt> attribute. But no operations other than loading,[m
[31m-storing and initializing them are supported, yet.</li>[m
[31m-<li>The <tt>volatile</tt> type qualifier is currently ignored by[m
[31m-compiled code.</li>[m
[31m-<li><a href="ext_ffi_api.html#ffi_cdef"><tt>ffi.cdef</tt></a> silently[m
[31m-ignores most re-declarations. Note: avoid re-declarations which do not[m
[31m-conform to C99. The implementation will eventually be changed to[m
[31m-perform strict checks.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The JIT compiler already handles a large subset of all FFI operations.[m
[31m-It automatically falls back to the interpreter for unimplemented[m
[31m-operations (you can check for this with the[m
[31m-<a href="running.html#opt_j"><tt>-jv</tt></a> command line option).[m
[31m-The following operations are currently not compiled and may exhibit[m
[31m-suboptimal performance, especially when used in inner loops:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>Bitfield accesses and initializations.</li>[m
[31m-<li>Vector operations.</li>[m
[31m-<li>Table initializers.</li>[m
[31m-<li>Initialization of nested <tt>struct</tt>/<tt>union</tt> types.</li>[m
[31m-<li>Non-default initialization of VLA/VLS or large C&nbsp;types[m
[31m-(&gt; 128&nbsp;bytes or &gt; 16 array elements.</li>[m
[31m-<li>Conversions from lightuserdata to <tt>void&nbsp;*</tt>.</li>[m
[31m-<li>Pointer differences for element sizes that are not a power of[m
[31m-two.</li>[m
[31m-<li>Calls to C&nbsp;functions with aggregates passed or returned by[m
[31m-value.</li>[m
[31m-<li>Calls to ctype metamethods which are not plain functions.</li>[m
[31m-<li>ctype <tt>__newindex</tt> tables and non-string lookups in ctype[m
[31m-<tt>__index</tt> tables.</li>[m
[31m-<li><tt>tostring()</tt> for cdata types.</li>[m
[31m-<li>Calls to <tt>ffi.cdef()</tt>, <tt>ffi.load()</tt> and[m
[31m-<tt>ffi.metatype()</tt>.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-Other missing features:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>Arithmetic for <tt>complex</tt> numbers.</li>[m
[31m-<li>Passing structs by value to vararg C&nbsp;functions.</li>[m
[31m-<li><a href="extensions.html#exceptions">C++ exception interoperability</a>[m
[31m-does not extend to C&nbsp;functions called via the FFI, if the call is[m
[31m-compiled.</li>[m
[31m-</ul>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_tutorial.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_tutorial.html[m
[1mdeleted file mode 100644[m
[1mindex 01200c4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_ffi_tutorial.html[m
[1m+++ /dev/null[m
[36m@@ -1,603 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>FFI Tutorial</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.idiomtable { font-size: 90%; line-height: 1.2; }[m
[31m-table.idiomtable tt { font-size: 100%; }[m
[31m-table.idiomtable td { vertical-align: top; }[m
[31m-tr.idiomhead td { font-weight: bold; }[m
[31m-td.idiomlua b { font-weight: normal; color: #2142bf; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>FFI Tutorial</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a class="current" href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-This page is intended to give you an overview of the features of the FFI[m
[31m-library by presenting a few use cases and guidelines.[m
[31m-</p>[m
[31m-<p>[m
[31m-This page makes no attempt to explain all of the FFI library, though.[m
[31m-You'll want to have a look at the <a href="ext_ffi_api.html">ffi.* API[m
[31m-function reference</a> and the <a href="ext_ffi_semantics.html">FFI[m
[31m-semantics</a> to learn more.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="load">Loading the FFI Library</h2>[m
[31m-<p>[m
[31m-The FFI library is built into LuaJIT by default, but it's not loaded[m
[31m-and initialized by default. The suggested way to use the FFI library[m
[31m-is to add the following to the start of every Lua file that needs one[m
[31m-of its functions:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local ffi = require("ffi")[m
[31m-</pre>[m
[31m-<p>[m
[31m-Please note this doesn't define an <tt>ffi</tt> variable in the table[m
[31m-of globals &mdash; you really need to use the local variable. The[m
[31m-<tt>require</tt> function ensures the library is only loaded once.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Note: If you want to experiment with the FFI from the interactive prompt[m
[31m-of the command line executable, omit the <tt>local</tt>, as it doesn't[m
[31m-preserve local variables across lines.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="sleep">Accessing Standard System Functions</h2>[m
[31m-<p>[m
[31m-The following code explains how to access standard system functions.[m
[31m-We slowly print two lines of dots by sleeping for 10&nbsp;milliseconds[m
[31m-after each dot:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&nbsp;[m
[31m-&#9312;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9313;[m
[31m-&#9314;[m
[31m-&#9315;[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9316;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9317;</span>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">void Sleep(int ms);[m
[31m-int poll(struct pollfd *fds, unsigned long nfds, int timeout);</span>[m
[31m-]][m
[31m-[m
[31m-local sleep[m
[31m-if ffi.os == "Windows" then[m
[31m-  function sleep(s)[m
[31m-    ffi.C.Sleep(s*1000)[m
[31m-  end[m
[31m-else[m
[31m-  function sleep(s)[m
[31m-    ffi.C.poll(nil, 0, s*1000)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-for i=1,160 do[m
[31m-  io.write("."); io.flush()[m
[31m-  sleep(0.01)[m
[31m-end[m
[31m-io.write("\n")[m
[31m-</pre>[m
[31m-<p>[m
[31m-Here's the step-by-step explanation:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> This defines the[m
[31m-C&nbsp;library functions we're going to use. The part inside the[m
[31m-double-brackets (in green) is just standard C&nbsp;syntax. You can[m
[31m-usually get this info from the C&nbsp;header files or the[m
[31m-documentation provided by each C&nbsp;library or C&nbsp;compiler.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> The difficulty we're[m
[31m-facing here, is that there are different standards to choose from.[m
[31m-Windows has a simple <tt>Sleep()</tt> function. On other systems there[m
[31m-are a variety of functions available to achieve sub-second sleeps, but[m
[31m-with no clear consensus. Thankfully <tt>poll()</tt> can be used for[m
[31m-this task, too, and it's present on most non-Windows systems. The[m
[31m-check for <tt>ffi.os</tt> makes sure we use the Windows-specific[m
[31m-function only on Windows systems.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> Here we're wrapping the[m
[31m-call to the C&nbsp;function in a Lua function. This isn't strictly[m
[31m-necessary, but it's helpful to deal with system-specific issues only[m
[31m-in one part of the code. The way we're wrapping it ensures the check[m
[31m-for the OS is only done during initialization and not for every call.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9315;</span> A more subtle point is[m
[31m-that we defined our <tt>sleep()</tt> function (for the sake of this[m
[31m-example) as taking the number of seconds, but accepting fractional[m
[31m-seconds. Multiplying this by 1000 gets us milliseconds, but that still[m
[31m-leaves it a Lua number, which is a floating-point value. Alas, the[m
[31m-<tt>Sleep()</tt> function only accepts an integer value. Luckily for[m
[31m-us, the FFI library automatically performs the conversion when calling[m
[31m-the function (truncating the FP value towards zero, like in C).[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Some readers will notice that <tt>Sleep()</tt> is part of[m
[31m-<tt>KERNEL32.DLL</tt> and is also a <tt>stdcall</tt> function. So how[m
[31m-can this possibly work? The FFI library provides the <tt>ffi.C</tt>[m
[31m-default C&nbsp;library namespace, which allows calling functions from[m
[31m-the default set of libraries, like a C&nbsp;compiler would. Also, the[m
[31m-FFI library automatically detects <tt>stdcall</tt> functions, so you[m
[31m-don't need to declare them as such.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9316;</span> The <tt>poll()</tt>[m
[31m-function takes a couple more arguments we're not going to use. You can[m
[31m-simply use <tt>nil</tt> to pass a <tt>NULL</tt> pointer and <tt>0</tt>[m
[31m-for the <tt>nfds</tt> parameter. Please note that the[m
[31m-number&nbsp;<tt>0</tt> <em>does not convert to a pointer value</em>,[m
[31m-unlike in C++. You really have to pass pointers to pointer arguments[m
[31m-and numbers to number arguments.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-The page on <a href="ext_ffi_semantics.html">FFI semantics</a> has all[m
[31m-of the gory details about[m
[31m-<a href="ext_ffi_semantics.html#convert">conversions between Lua[m
[31m-objects and C&nbsp;types</a>. For the most part you don't have to deal[m
[31m-with this, as it's performed automatically and it's carefully designed[m
[31m-to bridge the semantic differences between Lua and C.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9317;</span> Now that we have defined[m
[31m-our own <tt>sleep()</tt> function, we can just call it from plain Lua[m
[31m-code. That wasn't so bad, huh? Turning these boring animated dots into[m
[31m-a fascinating best-selling game is left as an exercise for the reader.[m
[31m-:-)[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="zlib">Accessing the zlib Compression Library</h2>[m
[31m-<p>[m
[31m-The following code shows how to access the <a[m
[31m-href="http://zlib.net/">zlib</a> compression library from Lua code.[m
[31m-We'll define two convenience wrapper functions that take a string and[m
[31m-compress or uncompress it to another string:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&nbsp;[m
[31m-&#9312;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9313;[m
[31m-[m
[31m-[m
[31m-&#9314;[m
[31m-[m
[31m-&#9315;[m
[31m-[m
[31m-[m
[31m-&#9316;[m
[31m-[m
[31m-[m
[31m-&#9317;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9318;</span>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">unsigned long compressBound(unsigned long sourceLen);[m
[31m-int compress2(uint8_t *dest, unsigned long *destLen,[m
[31m-	      const uint8_t *source, unsigned long sourceLen, int level);[m
[31m-int uncompress(uint8_t *dest, unsigned long *destLen,[m
[31m-	       const uint8_t *source, unsigned long sourceLen);</span>[m
[31m-]][m
[31m-local zlib = ffi.load(ffi.os == "Windows" and "zlib1" or "z")[m
[31m-[m
[31m-local function compress(txt)[m
[31m-  local n = zlib.compressBound(#txt)[m
[31m-  local buf = ffi.new("uint8_t[?]", n)[m
[31m-  local buflen = ffi.new("unsigned long[1]", n)[m
[31m-  local res = zlib.compress2(buf, buflen, txt, #txt, 9)[m
[31m-  assert(res == 0)[m
[31m-  return ffi.string(buf, buflen[0])[m
[31m-end[m
[31m-[m
[31m-local function uncompress(comp, n)[m
[31m-  local buf = ffi.new("uint8_t[?]", n)[m
[31m-  local buflen = ffi.new("unsigned long[1]", n)[m
[31m-  local res = zlib.uncompress(buf, buflen, comp, #comp)[m
[31m-  assert(res == 0)[m
[31m-  return ffi.string(buf, buflen[0])[m
[31m-end[m
[31m-[m
[31m--- Simple test code.[m
[31m-local txt = string.rep("abcd", 1000)[m
[31m-print("Uncompressed size: ", #txt)[m
[31m-local c = compress(txt)[m
[31m-print("Compressed size: ", #c)[m
[31m-local txt2 = uncompress(c, #txt)[m
[31m-assert(txt2 == txt)[m
[31m-</pre>[m
[31m-<p>[m
[31m-Here's the step-by-step explanation:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> This defines some of the[m
[31m-C&nbsp;functions provided by zlib. For the sake of this example, some[m
[31m-type indirections have been reduced and it uses the pre-defined[m
[31m-fixed-size integer types, while still adhering to the zlib API/ABI.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> This loads the zlib shared[m
[31m-library. On POSIX systems it's named <tt>libz.so</tt> and usually[m
[31m-comes pre-installed. Since <tt>ffi.load()</tt> automatically adds any[m
[31m-missing standard prefixes/suffixes, we can simply load the[m
[31m-<tt>"z"</tt> library. On Windows it's named <tt>zlib1.dll</tt> and[m
[31m-you'll have to download it first from the[m
[31m-<a href="http://zlib.net/"><span class="ext">&raquo;</span>&nbsp;zlib site</a>. The check for[m
[31m-<tt>ffi.os</tt> makes sure we pass the right name to[m
[31m-<tt>ffi.load()</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> First, the maximum size of[m
[31m-the compression buffer is obtained by calling the[m
[31m-<tt>zlib.compressBound</tt> function with the length of the[m
[31m-uncompressed string. The next line allocates a byte buffer of this[m
[31m-size. The <tt>[?]</tt> in the type specification indicates a[m
[31m-variable-length array (VLA). The actual number of elements of this[m
[31m-array is given as the 2nd argument to <tt>ffi.new()</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9315;</span> This may look strange at[m
[31m-first, but have a look at the declaration of the <tt>compress2</tt>[m
[31m-function from zlib: the destination length is defined as a pointer![m
[31m-This is because you pass in the maximum buffer size and get back the[m
[31m-actual length that was used.[m
[31m-</p>[m
[31m-<p>[m
[31m-In C you'd pass in the address of a local variable[m
[31m-(<tt>&amp;buflen</tt>). But since there's no address-of operator in[m
[31m-Lua, we'll just pass in a one-element array. Conveniently it can be[m
[31m-initialized with the maximum buffer size in one step. Calling the[m
[31m-actual <tt>zlib.compress2</tt> function is then straightforward.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9316;</span> We want to return the[m
[31m-compressed data as a Lua string, so we'll use <tt>ffi.string()</tt>.[m
[31m-It needs a pointer to the start of the data and the actual length. The[m
[31m-length has been returned in the <tt>buflen</tt> array, so we'll just[m
[31m-get it from there.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Note that since the function returns now, the <tt>buf</tt> and[m
[31m-<tt>buflen</tt> variables will eventually be garbage collected. This[m
[31m-is fine, because <tt>ffi.string()</tt> has copied the contents to a[m
[31m-newly created (interned) Lua string. If you plan to call this function[m
[31m-lots of times, consider reusing the buffers and/or handing back the[m
[31m-results in buffers instead of strings. This will reduce the overhead[m
[31m-for garbage collection and string interning.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9317;</span> The <tt>uncompress</tt>[m
[31m-functions does the exact opposite of the <tt>compress</tt> function.[m
[31m-The compressed data doesn't include the size of the original string,[m
[31m-so this needs to be passed in. Otherwise no surprises here.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9318;</span> The code, that makes use[m
[31m-of the functions we just defined, is just plain Lua code. It doesn't[m
[31m-need to know anything about the LuaJIT FFI &mdash; the convenience[m
[31m-wrapper functions completely hide it.[m
[31m-</p>[m
[31m-<p>[m
[31m-One major advantage of the LuaJIT FFI is that you are now able to[m
[31m-write those wrappers <em>in Lua</em>. And at a fraction of the time it[m
[31m-would cost you to create an extra C&nbsp;module using the Lua/C API.[m
[31m-Many of the simpler C&nbsp;functions can probably be used directly[m
[31m-from your Lua code, without any wrappers.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Side note: the zlib API uses the <tt>long</tt> type for passing[m
[31m-lengths and sizes around. But all those zlib functions actually only[m
[31m-deal with 32&nbsp;bit values. This is an unfortunate choice for a[m
[31m-public API, but may be explained by zlib's history &mdash; we'll just[m
[31m-have to deal with it.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-First, you should know that a <tt>long</tt> is a 64&nbsp;bit type e.g.[m
[31m-on POSIX/x64 systems, but a 32&nbsp;bit type on Windows/x64 and on[m
[31m-32&nbsp;bit systems. Thus a <tt>long</tt> result can be either a plain[m
[31m-Lua number or a boxed 64&nbsp;bit integer cdata object, depending on[m
[31m-the target system.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Ok, so the <tt>ffi.*</tt> functions generally accept cdata objects[m
[31m-wherever you'd want to use a number. That's why we get a away with[m
[31m-passing <tt>n</tt> to <tt>ffi.string()</tt> above. But other Lua[m
[31m-library functions or modules don't know how to deal with this. So for[m
[31m-maximum portability one needs to use <tt>tonumber()</tt> on returned[m
[31m-<tt>long</tt> results before passing them on. Otherwise the[m
[31m-application might work on some systems, but would fail in a POSIX/x64[m
[31m-environment.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="metatype">Defining Metamethods for a C&nbsp;Type</h2>[m
[31m-<p>[m
[31m-The following code explains how to define metamethods for a C type.[m
[31m-We define a simple point type and add some operations to it:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&nbsp;[m
[31m-&#9312;[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9313;[m
[31m-[m
[31m-&#9314;[m
[31m-[m
[31m-&#9315;[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9316;[m
[31m-[m
[31m-&#9317;</span>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">typedef struct { double x, y; } point_t;</span>[m
[31m-]][m
[31m-[m
[31m-local point[m
[31m-local mt = {[m
[31m-  __add = function(a, b) return point(a.x+b.x, a.y+b.y) end,[m
[31m-  __len = function(a) return math.sqrt(a.x*a.x + a.y*a.y) end,[m
[31m-  __index = {[m
[31m-    area = function(a) return a.x*a.x + a.y*a.y end,[m
[31m-  },[m
[31m-}[m
[31m-point = ffi.metatype("point_t", mt)[m
[31m-[m
[31m-local a = point(3, 4)[m
[31m-print(a.x, a.y)  --> 3  4[m
[31m-print(#a)        --> 5[m
[31m-print(a:area())  --> 25[m
[31m-local b = a + point(0.5, 8)[m
[31m-print(#b)        --> 12.5[m
[31m-</pre>[m
[31m-<p>[m
[31m-Here's the step-by-step explanation:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> This defines the C&nbsp;type for a[m
[31m-two-dimensional point object.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> We have to declare the variable[m
[31m-holding the point constructor first, because it's used inside of a[m
[31m-metamethod.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> Let's define an <tt>__add</tt>[m
[31m-metamethod which adds the coordinates of two points and creates a new[m
[31m-point object. For simplicity, this function assumes that both arguments[m
[31m-are points. But it could be any mix of objects, if at least one operand[m
[31m-is of the required type (e.g. adding a point plus a number or vice[m
[31m-versa). Our <tt>__len</tt> metamethod returns the distance of a point to[m
[31m-the origin.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9315;</span> If we run out of operators, we can[m
[31m-define named methods, too. Here the <tt>__index</tt> table defines an[m
[31m-<tt>area</tt> function. For custom indexing needs, one might want to[m
[31m-define <tt>__index</tt> and <tt>__newindex</tt> <em>functions</em> instead.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9316;</span> This associates the metamethods with[m
[31m-our C&nbsp;type. This only needs to be done once. For convenience, a[m
[31m-constructor is returned by[m
[31m-<a href="ext_ffi_api.html#ffi_metatype"><tt>ffi.metatype()</tt></a>.[m
[31m-We're not required to use it, though. The original C&nbsp;type can still[m
[31m-be used e.g. to create an array of points. The metamethods automatically[m
[31m-apply to any and all uses of this type.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note that the association with a metatable is permanent and[m
[31m-<b>the metatable must not be modified afterwards!</b> Ditto for the[m
[31m-<tt>__index</tt> table.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9317;</span> Here are some simple usage examples[m
[31m-for the point type and their expected results. The pre-defined[m
[31m-operations (such as <tt>a.x</tt>) can be freely mixed with the newly[m
[31m-defined metamethods. Note that <tt>area</tt> is a method and must be[m
[31m-called with the Lua syntax for methods: <tt>a:area()</tt>, not[m
[31m-<tt>a.area()</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-The C&nbsp;type metamethod mechanism is most useful when used in[m
[31m-conjunction with C&nbsp;libraries that are written in an object-oriented[m
[31m-style. Creators return a pointer to a new instance and methods take an[m
[31m-instance pointer as the first argument. Sometimes you can just point[m
[31m-<tt>__index</tt> to the library namespace and <tt>__gc</tt> to the[m
[31m-destructor and you're done. But often enough you'll want to add[m
[31m-convenience wrappers, e.g. to return actual Lua strings or when[m
[31m-returning multiple values.[m
[31m-</p>[m
[31m-<p>[m
[31m-Some C libraries only declare instance pointers as an opaque[m
[31m-<tt>void&nbsp;*</tt> type. In this case you can use a fake type for all[m
[31m-declarations, e.g. a pointer to a named (incomplete) struct will do:[m
[31m-<tt>typedef struct foo_type *foo_handle</tt>. The C&nbsp;side doesn't[m
[31m-know what you declare with the LuaJIT FFI, but as long as the underlying[m
[31m-types are compatible, everything still works.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="idioms">Translating C&nbsp;Idioms</h2>[m
[31m-<p>[m
[31m-Here's a list of common C&nbsp;idioms and their translation to the[m
[31m-LuaJIT FFI:[m
[31m-</p>[m
[31m-<table class="idiomtable">[m
[31m-<tr class="idiomhead">[m
[31m-<td class="idiomdesc">Idiom</td>[m
[31m-<td class="idiomc">C&nbsp;code</td>[m
[31m-<td class="idiomlua">Lua code</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="idiomdesc">Pointer dereference<br><tt>int *p;</tt></td><td class="idiomc"><tt>x = *p;<br>*p = y;</tt></td><td class="idiomlua"><tt>x = <b>p[0]</b><br><b>p[0]</b> = y</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="idiomdesc">Pointer indexing<br><tt>int i, *p;</tt></td><td class="idiomc"><tt>x = p[i];<br>p[i+1] = y;</tt></td><td class="idiomlua"><tt>x = p[i]<br>p[i+1] = y</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc">Array indexing<br><tt>int i, a[];</tt></td><td class="idiomc"><tt>x = a[i];<br>a[i+1] = y;</tt></td><td class="idiomlua"><tt>x = a[i]<br>a[i+1] = y</tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="idiomdesc"><tt>struct</tt>/<tt>union</tt> dereference<br><tt>struct foo s;</tt></td><td class="idiomc"><tt>x = s.field;<br>s.field = y;</tt></td><td class="idiomlua"><tt>x = s.field<br>s.field = y</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc"><tt>struct</tt>/<tt>union</tt> pointer deref.<br><tt>struct foo *sp;</tt></td><td class="idiomc"><tt>x = sp->field;<br>sp->field = y;</tt></td><td class="idiomlua"><tt>x = <b>s.field</b><br><b>s.field</b> = y</tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="idiomdesc">Pointer arithmetic<br><tt>int i, *p;</tt></td><td class="idiomc"><tt>x = p + i;<br>y = p - i;</tt></td><td class="idiomlua"><tt>x = p + i<br>y = p - i</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc">Pointer difference<br><tt>int *p1, *p2;</tt></td><td class="idiomc"><tt>x = p1 - p2;</tt></td><td class="idiomlua"><tt>x = p1 - p2</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="idiomdesc">Array element pointer<br><tt>int i, a[];</tt></td><td class="idiomc"><tt>x = &amp;a[i];</tt></td><td class="idiomlua"><tt>x = <b>a+i</b></tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc">Cast pointer to address<br><tt>int *p;</tt></td><td class="idiomc"><tt>x = (intptr_t)p;</tt></td><td class="idiomlua"><tt>x = <b>tonumber(<br>&nbsp;ffi.cast("intptr_t",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p))</b></tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="idiomdesc">Functions with outargs<br><tt>void foo(int *inoutlen);</tt></td><td class="idiomc"><tt>int len = x;<br>foo(&amp;len);<br>y = len;</tt></td><td class="idiomlua"><tt><b>local len =<br>&nbsp;&nbsp;ffi.new("int[1]", x)<br>foo(len)<br>y = len[0]</b></tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc"><a href="ext_ffi_semantics.html#convert_vararg">Vararg conversions</a><br><tt>int printf(char *fmt, ...);</tt></td><td class="idiomc"><tt>printf("%g", 1.0);<br>printf("%d", 1);<br>&nbsp;</tt></td><td class="idiomlua"><tt>printf("%g", 1);<br>printf("%d",<br>&nbsp;&nbsp;<b>ffi.new("int", 1)</b>)</tt></td></tr>[m
[31m-</table>[m
[31m-[m
[31m-<h2 id="cache">To Cache or Not to Cache</h2>[m
[31m-<p>[m
[31m-It's a common Lua idiom to cache library functions in local variables[m
[31m-or upvalues, e.g.:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local byte, char = string.byte, string.char[m
[31m-local function foo(x)[m
[31m-  return char(byte(x)+1)[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-This replaces several hash-table lookups with a (faster) direct use of[m
[31m-a local or an upvalue. This is less important with LuaJIT, since the[m
[31m-JIT compiler optimizes hash-table lookups a lot and is even able to[m
[31m-hoist most of them out of the inner loops. It can't eliminate[m
[31m-<em>all</em> of them, though, and it saves some typing for often-used[m
[31m-functions. So there's still a place for this, even with LuaJIT.[m
[31m-</p>[m
[31m-<p>[m
[31m-The situation is a bit different with C&nbsp;function calls via the[m
[31m-FFI library. The JIT compiler has special logic to eliminate <em>all[m
[31m-of the lookup overhead</em> for functions resolved from a[m
[31m-<a href="ext_ffi_semantics.html#clib">C&nbsp;library namespace</a>![m
[31m-Thus it's not helpful and actually counter-productive to cache[m
[31m-individual C&nbsp;functions like this:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local <b>funca</b>, <b>funcb</b> = ffi.C.funca, ffi.C.funcb -- <span style="color:#c00000;">Not helpful!</span>[m
[31m-local function foo(x, n)[m
[31m-  for i=1,n do <b>funcb</b>(<b>funca</b>(x, i), 1) end[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-This turns them into indirect calls and generates bigger and slower[m
[31m-machine code. Instead you'll want to cache the namespace itself and[m
[31m-rely on the JIT compiler to eliminate the lookups:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local <b>C</b> = ffi.C          -- <span style="color:#00a000;">Instead use this!</span>[m
[31m-local function foo(x, n)[m
[31m-  for i=1,n do <b>C.funcb</b>(<b>C.funca</b>(x, i), 1) end[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-This generates both shorter and faster code. So <b>don't cache[m
[31m-C&nbsp;functions</b>, but <b>do</b> cache namespaces! Most often the[m
[31m-namespace is already in a local variable at an outer scope, e.g. from[m
[31m-<tt>local&nbsp;lib&nbsp;=&nbsp;ffi.load(...)</tt>. Note that copying[m
[31m-it to a local variable in the function scope is unnecessary.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_jit.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_jit.html[m
[1mdeleted file mode 100644[m
[1mindex 9489c6f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_jit.html[m
[1m+++ /dev/null[m
[36m@@ -1,201 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>jit.* Library</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1><tt>jit.*</tt> Library</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-The functions in this built-in module control the behavior of the JIT[m
[31m-compiler engine. Note that JIT-compilation is fully automatic &mdash;[m
[31m-you probably won't need to use any of the following functions unless[m
[31m-you have special needs.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_onoff"><tt>jit.on()<br>[m
[31m-jit.off()</tt></h3>[m
[31m-<p>[m
[31m-Turns the whole JIT compiler on (default) or off.[m
[31m-</p>[m
[31m-<p>[m
[31m-These functions are typically used with the command line options[m
[31m-<tt>-j on</tt> or <tt>-j off</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_flush"><tt>jit.flush()</tt></h3>[m
[31m-<p>[m
[31m-Flushes the whole cache of compiled code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_onoff_func"><tt>jit.on(func|true [,true|false])<br>[m
[31m-jit.off(func|true [,true|false])<br>[m
[31m-jit.flush(func|true [,true|false])</tt></h3>[m
[31m-<p>[m
[31m-<tt>jit.on</tt> enables JIT compilation for a Lua function (this is[m
[31m-the default).[m
[31m-</p>[m
[31m-<p>[m
[31m-<tt>jit.off</tt> disables JIT compilation for a Lua function and[m
[31m-flushes any already compiled code from the code cache.[m
[31m-</p>[m
[31m-<p>[m
[31m-<tt>jit.flush</tt> flushes the code, but doesn't affect the[m
[31m-enable/disable status.[m
[31m-</p>[m
[31m-<p>[m
[31m-The current function, i.e. the Lua function calling this library[m
[31m-function, can also be specified by passing <tt>true</tt> as the first[m
[31m-argument.[m
[31m-</p>[m
[31m-<p>[m
[31m-If the second argument is <tt>true</tt>, JIT compilation is also[m
[31m-enabled, disabled or flushed recursively for all sub-functions of a[m
[31m-function. With <tt>false</tt> only the sub-functions are affected.[m
[31m-</p>[m
[31m-<p>[m
[31m-The <tt>jit.on</tt> and <tt>jit.off</tt> functions only set a flag[m
[31m-which is checked when the function is about to be compiled. They do[m
[31m-not trigger immediate compilation.[m
[31m-</p>[m
[31m-<p>[m
[31m-Typical usage is <tt>jit.off(true, true)</tt> in the main chunk[m
[31m-of a module to turn off JIT compilation for the whole module for[m
[31m-debugging purposes.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_flush_tr"><tt>jit.flush(tr)</tt></h3>[m
[31m-<p>[m
[31m-Flushes the root trace, specified by its number, and all of its side[m
[31m-traces from the cache. The code for the trace will be retained as long[m
[31m-as there are any other traces which link to it.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_status"><tt>status, ... = jit.status()</tt></h3>[m
[31m-<p>[m
[31m-Returns the current status of the JIT compiler. The first result is[m
[31m-either <tt>true</tt> or <tt>false</tt> if the JIT compiler is turned[m
[31m-on or off. The remaining results are strings for CPU-specific features[m
[31m-and enabled optimizations.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_version"><tt>jit.version</tt></h3>[m
[31m-<p>[m
[31m-Contains the LuaJIT version string.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_version_num"><tt>jit.version_num</tt></h3>[m
[31m-<p>[m
[31m-Contains the version number of the LuaJIT core. Version xx.yy.zz[m
[31m-is represented by the decimal number xxyyzz.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_os"><tt>jit.os</tt></h3>[m
[31m-<p>[m
[31m-Contains the target OS name:[m
[31m-"Windows", "Linux", "OSX", "BSD", "POSIX" or "Other".[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_arch"><tt>jit.arch</tt></h3>[m
[31m-<p>[m
[31m-Contains the target architecture name:[m
[31m-"x86", "x64", "arm", "ppc", or "mips".[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="jit_opt"><tt>jit.opt.*</tt> &mdash; JIT compiler optimization control</h2>[m
[31m-<p>[m
[31m-This sub-module provides the backend for the <tt>-O</tt> command line[m
[31m-option.[m
[31m-</p>[m
[31m-<p>[m
[31m-You can also use it programmatically, e.g.:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-jit.opt.start(2) -- same as -O2[m
[31m-jit.opt.start("-dce")[m
[31m-jit.opt.start("hotloop=10", "hotexit=2")[m
[31m-</pre>[m
[31m-<p>[m
[31m-Unlike in LuaJIT 1.x, the module is built-in and[m
[31m-<b>optimization is turned on by default!</b>[m
[31m-It's no longer necessary to run <tt>require("jit.opt").start()</tt>,[m
[31m-which was one of the ways to enable optimization.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="jit_util"><tt>jit.util.*</tt> &mdash; JIT compiler introspection</h2>[m
[31m-<p>[m
[31m-This sub-module holds functions to introspect the bytecode, generated[m
[31m-traces, the IR and the generated machine code. The functionality[m
[31m-provided by this module is still in flux and therefore undocumented.[m
[31m-</p>[m
[31m-<p>[m
[31m-The debug modules <tt>-jbc</tt>, <tt>-jv</tt> and <tt>-jdump</tt> make[m
[31m-extensive use of these functions. Please check out their source code,[m
[31m-if you want to know more.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_profiler.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_profiler.html[m
[1mdeleted file mode 100644[m
[1mindex 69ea25d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/ext_profiler.html[m
[1m+++ /dev/null[m
[36m@@ -1,365 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Profiler</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Profiler</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT has an integrated statistical profiler with very low overhead. It[m
[31m-allows sampling the currently executing stack and other parameters in[m
[31m-regular intervals.[m
[31m-</p>[m
[31m-<p>[m
[31m-The integrated profiler can be accessed from three levels:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>The <a href="#hl_profiler">bundled high-level profiler</a>, invoked by the[m
[31m-<a href="#j_p"><tt>-jp</tt></a> command line option.</li>[m
[31m-<li>A <a href="#ll_lua_api">low-level Lua API</a> to control the profiler.</li>[m
[31m-<li>A <a href="#ll_c_api">low-level C API</a> to control the profiler.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="hl_profiler">High-Level Profiler</h2>[m
[31m-<p>[m
[31m-The bundled high-level profiler offers basic profiling functionality. It[m
[31m-generates simple textual summaries or source code annotations. It can be[m
[31m-accessed with the <a href="#j_p"><tt>-jp</tt></a> command line option[m
[31m-or from Lua code by loading the underlying <tt>jit.p</tt> module.[m
[31m-</p>[m
[31m-<p>[m
[31m-To cut to the chase &mdash; run this to get a CPU usage profile by[m
[31m-function name:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-luajit -jp myapp.lua[m
[31m-</pre>[m
[31m-<p>[m
[31m-It's <em>not</em> a stated goal of the bundled profiler to add every[m
[31m-possible option or to cater for special profiling needs. The low-level[m
[31m-profiler APIs are documented below. They may be used by third-party[m
[31m-authors to implement advanced functionality, e.g. IDE integration or[m
[31m-graphical profilers.[m
[31m-</p>[m
[31m-<p>[m
[31m-Note: Sampling works for both interpreted and JIT-compiled code. The[m
[31m-results for JIT-compiled code may sometimes be surprising. LuaJIT[m
[31m-heavily optimizes and inlines Lua code &mdash; there's no simple[m
[31m-one-to-one correspondence between source code lines and the sampled[m
[31m-machine code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="j_p"><tt>-jp=[options[,output]]</tt></h3>[m
[31m-<p>[m
[31m-The <tt>-jp</tt> command line option starts the high-level profiler.[m
[31m-When the application run by the command line terminates, the profiler[m
[31m-stops and writes the results to <tt>stdout</tt> or to the specified[m
[31m-<tt>output</tt> file.[m
[31m-</p>[m
[31m-<p>[m
[31m-The <tt>options</tt> argument specifies how the profiling is to be[m
[31m-performed:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>f</tt> &mdash; Stack dump: function name, otherwise module:line.[m
[31m-This is the default mode.</li>[m
[31m-<li><tt>F</tt> &mdash; Stack dump: ditto, but dump module:name.</li>[m
[31m-<li><tt>l</tt> &mdash; Stack dump: module:line.</li>[m
[31m-<li><tt>&lt;number&gt;</tt> &mdash; stack dump depth (callee &larr;[m
[31m-caller). Default: 1.</li>[m
[31m-<li><tt>-&lt;number&gt;</tt> &mdash; Inverse stack dump depth (caller[m
[31m-&rarr; callee).</li>[m
[31m-<li><tt>s</tt> &mdash; Split stack dump after first stack level. Implies[m
[31m-depth&nbsp;&ge;&nbsp;2 or depth&nbsp;&le;&nbsp;-2.</li>[m
[31m-<li><tt>p</tt> &mdash; Show full path for module names.</li>[m
[31m-<li><tt>v</tt> &mdash; Show VM states.</li>[m
[31m-<li><tt>z</tt> &mdash; Show <a href="#jit_zone">zones</a>.</li>[m
[31m-<li><tt>r</tt> &mdash; Show raw sample counts. Default: show percentages.</li>[m
[31m-<li><tt>a</tt> &mdash; Annotate excerpts from source code files.</li>[m
[31m-<li><tt>A</tt> &mdash; Annotate complete source code files.</li>[m
[31m-<li><tt>G</tt> &mdash; Produce raw output suitable for graphical tools.</li>[m
[31m-<li><tt>m&lt;number&gt;</tt> &mdash; Minimum sample percentage to be shown.[m
[31m-Default: 3%.</li>[m
[31m-<li><tt>i&lt;number&gt;</tt> &mdash; Sampling interval in milliseconds.[m
[31m-Default: 10ms.<br>[m
[31m-Note: The actual sampling precision is OS-dependent.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The default output for <tt>-jp</tt> is a list of the most CPU consuming[m
[31m-spots in the application. Increasing the stack dump depth with (say)[m
[31m-<tt>-jp=2</tt> may help to point out the main callers or callees of[m
[31m-hotspots. But sample aggregation is still flat per unique stack dump.[m
[31m-</p>[m
[31m-<p>[m
[31m-To get a two-level view (split view) of callers/callees, use[m
[31m-<tt>-jp=s</tt> or <tt>-jp=-s</tt>. The percentages shown for the second[m
[31m-level are relative to the first level.[m
[31m-</p>[m
[31m-<p>[m
[31m-To see how much time is spent in each line relative to a function, use[m
[31m-<tt>-jp=fl</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-To see how much time is spent in different VM states or[m
[31m-<a href="#jit_zone">zones</a>, use <tt>-jp=v</tt> or <tt>-jp=z</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-Combinations of <tt>v/z</tt> with <tt>f/F/l</tt> produce two-level[m
[31m-views, e.g. <tt>-jp=vf</tt> or <tt>-jp=fv</tt>. This shows the time[m
[31m-spent in a VM state or zone vs. hotspots. This can be used to answer[m
[31m-questions like "Which time consuming functions are only interpreted?" or[m
[31m-"What's the garbage collector overhead for a specific function?".[m
[31m-</p>[m
[31m-<p>[m
[31m-Multiple options can be combined &mdash; but not all combinations make[m
[31m-sense, see above. E.g. <tt>-jp=3si4m1</tt> samples three stack levels[m
[31m-deep in 4ms intervals and shows a split view of the CPU consuming[m
[31m-functions and their callers with a 1% threshold.[m
[31m-</p>[m
[31m-<p>[m
[31m-Source code annotations produced by <tt>-jp=a</tt> or <tt>-jp=A</tt> are[m
[31m-always flat and at the line level. Obviously, the source code files need[m
[31m-to be readable by the profiler script.[m
[31m-</p>[m
[31m-<p>[m
[31m-The high-level profiler can also be started and stopped from Lua code with:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-require("jit.p").start(options, output)[m
[31m-...[m
[31m-require("jit.p").stop()[m
[31m-</pre>[m
[31m-[m
[31m-<h3 id="jit_zone"><tt>jit.zone</tt> &mdash; Zones</h3>[m
[31m-<p>[m
[31m-Zones can be used to provide information about different parts of an[m
[31m-application to the high-level profiler. E.g. a game could make use of an[m
[31m-<tt>"AI"</tt> zone, a <tt>"PHYS"</tt> zone, etc. Zones are hierarchical,[m
[31m-organized as a stack.[m
[31m-</p>[m
[31m-<p>[m
[31m-The <tt>jit.zone</tt> module needs to be loaded explicitly:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local zone = require("jit.zone")[m
[31m-</pre>[m
[31m-<ul>[m
[31m-<li><tt>zone("name")</tt> pushes a named zone to the zone stack.</li>[m
[31m-<li><tt>zone()</tt> pops the current zone from the zone stack and[m
[31m-returns its name.</li>[m
[31m-<li><tt>zone:get()</tt> returns the current zone name or <tt>nil</tt>.</li>[m
[31m-<li><tt>zone:flush()</tt> flushes the zone stack.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-To show the time spent in each zone use <tt>-jp=z</tt>. To show the time[m
[31m-spent relative to hotspots use e.g. <tt>-jp=zf</tt> or <tt>-jp=fz</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="ll_lua_api">Low-level Lua API</h2>[m
[31m-<p>[m
[31m-The <tt>jit.profile</tt> module gives access to the low-level API of the[m
[31m-profiler from Lua code. This module needs to be loaded explicitly:[m
[31m-<pre class="code">[m
[31m-local profile = require("jit.profile")[m
[31m-</pre>[m
[31m-<p>[m
[31m-This module can be used to implement your own higher-level profiler.[m
[31m-A typical profiling run starts the profiler, captures stack dumps in[m
[31m-the profiler callback, adds them to a hash table to aggregate the number[m
[31m-of samples, stops the profiler and then analyzes all of the captured[m
[31m-stack dumps. Other parameters can be sampled in the profiler callback,[m
[31m-too. But it's important not to spend too much time in the callback,[m
[31m-since this may skew the statistics.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="profile_start"><tt>profile.start(mode, cb)</tt>[m
[31m-&mdash; Start profiler</h3>[m
[31m-<p>[m
[31m-This function starts the profiler. The <tt>mode</tt> argument is a[m
[31m-string holding options:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>f</tt> &mdash; Profile with precision down to the function level.</li>[m
[31m-<li><tt>l</tt> &mdash; Profile with precision down to the line level.</li>[m
[31m-<li><tt>i&lt;number&gt;</tt> &mdash; Sampling interval in milliseconds (default[m
[31m-10ms).</br>[m
[31m-Note: The actual sampling precision is OS-dependent.[m
[31m-</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The <tt>cb</tt> argument is a callback function which is called with[m
[31m-three arguments: <tt>(thread, samples, vmstate)</tt>. The callback is[m
[31m-called on a separate coroutine, the <tt>thread</tt> argument is the[m
[31m-state that holds the stack to sample for profiling. Note: do[m
[31m-<em>not</em> modify the stack of that state or call functions on it.[m
[31m-</p>[m
[31m-<p>[m
[31m-<tt>samples</tt> gives the number of accumulated samples since the last[m
[31m-callback (usually 1).[m
[31m-</p>[m
[31m-<p>[m
[31m-<tt>vmstate</tt> holds the VM state at the time the profiling timer[m
[31m-triggered. This may or may not correspond to the state of the VM when[m
[31m-the profiling callback is called. The state is either <tt>'N'</tt>[m
[31m-native (compiled) code, <tt>'I'</tt> interpreted code, <tt>'C'</tt>[m
[31m-C&nbsp;code, <tt>'G'</tt> the garbage collector, or <tt>'J'</tt> the JIT[m
[31m-compiler.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="profile_stop"><tt>profile.stop()</tt>[m
[31m-&mdash; Stop profiler</h3>[m
[31m-<p>[m
[31m-This function stops the profiler.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="profile_dump"><tt>dump = profile.dumpstack([thread,] fmt, depth)</tt>[m
[31m-&mdash; Dump stack </h3>[m
[31m-<p>[m
[31m-This function allows taking stack dumps in an efficient manner. It[m
[31m-returns a string with a stack dump for the <tt>thread</tt> (coroutine),[m
[31m-formatted according to the <tt>fmt</tt> argument:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>p</tt> &mdash; Preserve the full path for module names. Otherwise[m
[31m-only the file name is used.</li>[m
[31m-<li><tt>f</tt> &mdash; Dump the function name if it can be derived. Otherwise[m
[31m-use module:line.</li>[m
[31m-<li><tt>F</tt> &mdash; Ditto, but dump module:name.</li>[m
[31m-<li><tt>l</tt> &mdash; Dump module:line.</li>[m
[31m-<li><tt>Z</tt> &mdash; Zap the following characters for the last dumped[m
[31m-frame.</li>[m
[31m-<li>All other characters are added verbatim to the output string.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The <tt>depth</tt> argument gives the number of frames to dump, starting[m
[31m-at the topmost frame of the thread. A negative number dumps the frames in[m
[31m-inverse order.[m
[31m-</p>[m
[31m-<p>[m
[31m-The first example prints a list of the current module names and line[m
[31m-numbers of up to 10 frames in separate lines. The second example prints[m
[31m-semicolon-separated function names for all frames (up to 100) in inverse[m
[31m-order:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-print(profile.dumpstack(thread, "l\n", 10))[m
[31m-print(profile.dumpstack(thread, "lZ;", -100))[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="ll_c_api">Low-level C API</h2>[m
[31m-<p>[m
[31m-The profiler can be controlled directly from C&nbsp;code, e.g. for[m
[31m-use by IDEs. The declarations are in <tt>"luajit.h"</tt> (see[m
[31m-<a href="ext_c_api.html">Lua/C API</a> extensions).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="luaJIT_profile_start"><tt>luaJIT_profile_start(L, mode, cb, data)</tt>[m
[31m-&mdash; Start profiler</h3>[m
[31m-<p>[m
[31m-This function starts the profiler. <a href="#profile_start">See[m
[31m-above</a> for a description of the <tt>mode</tt> argument.[m
[31m-</p>[m
[31m-<p>[m
[31m-The <tt>cb</tt> argument is a callback function with the following[m
[31m-declaration:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-typedef void (*luaJIT_profile_callback)(void *data, lua_State *L,[m
[31m-                                        int samples, int vmstate);[m
[31m-</pre>[m
[31m-<p>[m
[31m-<tt>data</tt> is available for use by the callback. <tt>L</tt> is the[m
[31m-state that holds the stack to sample for profiling. Note: do[m
[31m-<em>not</em> modify this stack or call functions on this stack &mdash;[m
[31m-use a separate coroutine for this purpose. <a href="#profile_start">See[m
[31m-above</a> for a description of <tt>samples</tt> and <tt>vmstate</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="luaJIT_profile_stop"><tt>luaJIT_profile_stop(L)</tt>[m
[31m-&mdash; Stop profiler</h3>[m
[31m-<p>[m
[31m-This function stops the profiler.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="luaJIT_profile_dumpstack"><tt>p = luaJIT_profile_dumpstack(L, fmt, depth, len)</tt>[m
[31m-&mdash; Dump stack </h3>[m
[31m-<p>[m
[31m-This function allows taking stack dumps in an efficient manner.[m
[31m-<a href="#profile_dump">See above</a> for a description of <tt>fmt</tt>[m
[31m-and <tt>depth</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-This function returns a <tt>const&nbsp;char&nbsp;*</tt> pointing to a[m
[31m-private string buffer of the profiler. The <tt>int&nbsp;*len</tt>[m
[31m-argument returns the length of the output string. The buffer is[m
[31m-overwritten on the next call and deallocated when the profiler stops.[m
[31m-You either need to consume the content immediately or copy it for later[m
[31m-use.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/extensions.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/extensions.html[m
[1mdeleted file mode 100644[m
[1mindex 7f712a6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/extensions.html[m
[1m+++ /dev/null[m
[36m@@ -1,455 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Extensions</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.exc {[m
[31m-  line-height: 1.2;[m
[31m-}[m
[31m-tr.exchead td {[m
[31m-  font-weight: bold;[m
[31m-}[m
[31m-td.excplatform {[m
[31m-  width: 48%;[m
[31m-}[m
[31m-td.exccompiler {[m
[31m-  width: 29%;[m
[31m-}[m
[31m-td.excinterop {[m
[31m-  width: 23%;[m
[31m-}[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Extensions</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a class="current" href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT is fully upwards-compatible with Lua 5.1. It supports all[m
[31m-<a href="http://www.lua.org/manual/5.1/manual.html#5"><span class="ext">&raquo;</span>&nbsp;standard Lua[m
[31m-library functions</a> and the full set of[m
[31m-<a href="http://www.lua.org/manual/5.1/manual.html#3"><span class="ext">&raquo;</span>&nbsp;Lua/C API[m
[31m-functions</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT is also fully ABI-compatible to Lua 5.1 at the linker/dynamic[m
[31m-loader level. This means you can compile a C&nbsp;module against the[m
[31m-standard Lua headers and load the same shared library from either Lua[m
[31m-or LuaJIT.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT extends the standard Lua VM with new functionality and adds[m
[31m-several extension modules. Please note this page is only about[m
[31m-<em>functional</em> enhancements and not about performance enhancements,[m
[31m-such as the optimized VM, the faster interpreter or the JIT compiler.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="modules">Extensions Modules</h2>[m
[31m-<p>[m
[31m-LuaJIT comes with several built-in extension modules:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="bit"><tt>bit.*</tt> &mdash; Bitwise operations</h3>[m
[31m-<p>[m
[31m-LuaJIT supports all bitwise operations as defined by[m
[31m-<a href="http://bitop.luajit.org"><span class="ext">&raquo;</span>&nbsp;Lua BitOp</a>:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-bit.tobit  bit.tohex  bit.bnot    bit.band bit.bor  bit.bxor[m
[31m-bit.lshift bit.rshift bit.arshift bit.rol  bit.ror  bit.bswap[m
[31m-</pre>[m
[31m-<p>[m
[31m-This module is a LuaJIT built-in &mdash; you don't need to download or[m
[31m-install Lua BitOp. The Lua BitOp site has full documentation for all[m
[31m-<a href="http://bitop.luajit.org/api.html"><span class="ext">&raquo;</span>&nbsp;Lua BitOp API functions</a>.[m
[31m-The FFI adds support for[m
[31m-<a href="ext_ffi_semantics.html#cdata_arith">64&nbsp;bit bitwise operations</a>,[m
[31m-using the same API functions.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please make sure to <tt>require</tt> the module before using any of[m
[31m-its functions:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local bit = require("bit")[m
[31m-</pre>[m
[31m-<p>[m
[31m-An already installed Lua BitOp module is ignored by LuaJIT.[m
[31m-This way you can use bit operations from both Lua and LuaJIT on a[m
[31m-shared installation.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi"><tt>ffi.*</tt> &mdash; FFI library</h3>[m
[31m-<p>[m
[31m-The <a href="ext_ffi.html">FFI library</a> allows calling external[m
[31m-C&nbsp;functions and the use of C&nbsp;data structures from pure Lua[m
[31m-code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit"><tt>jit.*</tt> &mdash; JIT compiler control</h3>[m
[31m-<p>[m
[31m-The functions in this module[m
[31m-<a href="ext_jit.html">control the behavior of the JIT compiler engine</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="c_api">C API extensions</h3>[m
[31m-<p>[m
[31m-LuaJIT adds some[m
[31m-<a href="ext_c_api.html">extra functions to the Lua/C API</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="profiler">Profiler</h3>[m
[31m-<p>[m
[31m-LuaJIT has an <a href="ext_profiler.html">integrated profiler</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="library">Enhanced Standard Library Functions</h2>[m
[31m-[m
[31m-<h3 id="xpcall"><tt>xpcall(f, err [,args...])</tt> passes arguments</h3>[m
[31m-<p>[m
[31m-Unlike the standard implementation in Lua 5.1, <tt>xpcall()</tt>[m
[31m-passes any arguments after the error function to the function[m
[31m-which is called in a protected context.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="load"><tt>loadfile()</tt> etc. handle UTF-8 source code</h3>[m
[31m-<p>[m
[31m-Non-ASCII characters are handled transparently by the Lua source code parser.[m
[31m-This allows the use of UTF-8 characters in identifiers and strings.[m
[31m-A UTF-8 BOM is skipped at the start of the source code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="tostring"><tt>tostring()</tt> etc. canonicalize NaN and &plusmn;Inf</h3>[m
[31m-<p>[m
[31m-All number-to-string conversions consistently convert non-finite numbers[m
[31m-to the same strings on all platforms. NaN results in <tt>"nan"</tt>,[m
[31m-positive infinity results in <tt>"inf"</tt> and negative infinity results[m
[31m-in <tt>"-inf"</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="tonumber"><tt>tonumber()</tt> etc. use builtin string to number conversion</h3>[m
[31m-<p>[m
[31m-All string-to-number conversions consistently convert integer and[m
[31m-floating-point inputs in decimal, hexadecimal and binary on all platforms.[m
[31m-<tt>strtod()</tt> is <em>not</em> used anymore, which avoids numerous[m
[31m-problems with poor C library implementations. The builtin conversion[m
[31m-function provides full precision according to the IEEE-754 standard, it[m
[31m-works independently of the current locale and it supports hex floating-point[m
[31m-numbers (e.g. <tt>0x1.5p-3</tt>).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="string_dump"><tt>string.dump(f [,strip])</tt> generates portable bytecode</h3>[m
[31m-<p>[m
[31m-An extra argument has been added to <tt>string.dump()</tt>. If set to[m
[31m-<tt>true</tt>, 'stripped' bytecode without debug information is[m
[31m-generated. This speeds up later bytecode loading and reduces memory[m
[31m-usage. See also the[m
[31m-<a href="running.html#opt_b"><tt>-b</tt> command line option</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-The generated bytecode is portable and can be loaded on any architecture[m
[31m-that LuaJIT supports, independent of word size or endianess. However the[m
[31m-bytecode compatibility versions must match. Bytecode stays compatible[m
[31m-for dot releases (x.y.0 &rarr; x.y.1), but may change with major or[m
[31m-minor releases (2.0 &rarr; 2.1) or between any beta release. Foreign[m
[31m-bytecode (e.g. from Lua 5.1) is incompatible and cannot be loaded.[m
[31m-</p>[m
[31m-<p>[m
[31m-Note: <tt>LJ_GC64</tt> mode requires a different frame layout, which implies[m
[31m-a different, incompatible bytecode format for ports that use this mode (e.g.[m
[31m-ARM64). This may be rectified in the future.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="table_new"><tt>table.new(narray, nhash)</tt> allocates a pre-sized table</h3>[m
[31m-<p>[m
[31m-An extra library function <tt>table.new()</tt> can be made available via[m
[31m-<tt>require("table.new")</tt>. This creates a pre-sized table, just like[m
[31m-the C API equivalent <tt>lua_createtable()</tt>. This is useful for big[m
[31m-tables if the final table size is known and automatic table resizing is[m
[31m-too expensive.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="table_clear"><tt>table.clear(tab)</tt> clears a table</h3>[m
[31m-<p>[m
[31m-An extra library function <tt>table.clear()</tt> can be made available[m
[31m-via <tt>require("table.clear")</tt>. This clears all keys and values[m
[31m-from a table, but preserves the allocated array/hash sizes. This is[m
[31m-useful when a table, which is linked from multiple places, needs to be[m
[31m-cleared and/or when recycling a table for use by the same context. This[m
[31m-avoids managing backlinks, saves an allocation and the overhead of[m
[31m-incremental array/hash part growth.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note this function is meant for very specific situations. In most[m
[31m-cases it's better to replace the (usually single) link with a new table[m
[31m-and let the GC do its work.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="math_random">Enhanced PRNG for <tt>math.random()</tt></h3>[m
[31m-<p>[m
[31m-LuaJIT uses a Tausworthe PRNG with period 2^223 to implement[m
[31m-<tt>math.random()</tt> and <tt>math.randomseed()</tt>. The quality of[m
[31m-the PRNG results is much superior compared to the standard Lua[m
[31m-implementation which uses the platform-specific ANSI rand().[m
[31m-</p>[m
[31m-<p>[m
[31m-The PRNG generates the same sequences from the same seeds on all[m
[31m-platforms and makes use of all bits in the seed argument.[m
[31m-<tt>math.random()</tt> without arguments generates 52 pseudo-random bits[m
[31m-for every call. The result is uniformly distributed between 0.0 and 1.0.[m
[31m-It's correctly scaled up and rounded for <tt>math.random(n&nbsp;[,m])</tt> to[m
[31m-preserve uniformity.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="io"><tt>io.*</tt> functions handle 64&nbsp;bit file offsets</h3>[m
[31m-<p>[m
[31m-The file I/O functions in the standard <tt>io.*</tt> library handle[m
[31m-64&nbsp;bit file offsets. In particular this means it's possible[m
[31m-to open files larger than 2&nbsp;Gigabytes and to reposition or obtain[m
[31m-the current file position for offsets beyond 2&nbsp;GB[m
[31m-(<tt>fp:seek()</tt> method).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="debug_meta"><tt>debug.*</tt> functions identify metamethods</h3>[m
[31m-<p>[m
[31m-<tt>debug.getinfo()</tt> and <tt>lua_getinfo()</tt> also return information[m
[31m-about invoked metamethods. The <tt>namewhat</tt> field is set to[m
[31m-<tt>"metamethod"</tt> and the <tt>name</tt> field has the name of[m
[31m-the corresponding metamethod (e.g. <tt>"__index"</tt>).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="resumable">Fully Resumable VM</h2>[m
[31m-<p>[m
[31m-The LuaJIT VM is fully resumable. This means you can yield from a[m
[31m-coroutine even across contexts, where this would not possible with[m
[31m-the standard Lua&nbsp;5.1 VM: e.g. you can yield across <tt>pcall()</tt>[m
[31m-and <tt>xpcall()</tt>, across iterators and across metamethods.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="lua52">Extensions from Lua 5.2</h2>[m
[31m-<p>[m
[31m-LuaJIT supports some language and library extensions from Lua&nbsp;5.2.[m
[31m-Features that are unlikely to break existing code are unconditionally[m
[31m-enabled:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>goto</tt> and <tt>::labels::</tt>.</li>[m
[31m-<li>Hex escapes <tt>'\x3F'</tt> and <tt>'\*'</tt> escape in strings.</li>[m
[31m-<li><tt>load(string|reader [, chunkname [,mode [,env]]])</tt>.</li>[m
[31m-<li><tt>loadstring()</tt> is an alias for <tt>load()</tt>.</li>[m
[31m-<li><tt>loadfile(filename [,mode [,env]])</tt>.</li>[m
[31m-<li><tt>math.log(x [,base])</tt>.[m
[31m-<li><tt>string.rep(s, n [,sep])</tt>.[m
[31m-<li><tt>string.format()</tt>: <tt>%q</tt> reversible.[m
[31m-<tt>%s</tt> checks <tt>__tostring</tt>.[m
[31m-<tt>%a</tt> and <tt>"%A</tt> added.</li>[m
[31m-<li>String matching pattern <tt>%g</tt> added.</li>[m
[31m-<li><tt>io.read("*L")</tt>.</li>[m
[31m-<li><tt>io.lines()</tt> and <tt>file:lines()</tt> process[m
[31m-<tt>io.read()</tt> options.</li>[m
[31m-<li><tt>os.exit(status|true|false [,close])</tt>.</li>[m
[31m-<li><tt>package.searchpath(name, path [, sep [, rep]])</tt>.</li>[m
[31m-<li><tt>package.loadlib(name, "*")</tt>.</li>[m
[31m-<li><tt>debug.getinfo()</tt> returns <tt>nparams</tt> and <tt>isvararg</tt>[m
[31m-for option <tt>"u"</tt>.</li>[m
[31m-<li><tt>debug.getlocal()</tt> accepts function instead of level.</li>[m
[31m-<li><tt>debug.getlocal()</tt> and <tt>debug.setlocal()</tt> accept negative[m
[31m-indexes for varargs.</li>[m
[31m-<li><tt>debug.getupvalue()</tt> and <tt>debug.setupvalue()</tt> handle[m
[31m-C&nbsp;functions.</li>[m
[31m-<li><tt>debug.upvalueid()</tt> and <tt>debug.upvaluejoin()</tt>.</li>[m
[31m-<li>Command line option <tt>-E</tt>.</li>[m
[31m-<li>Command line checks <tt>__tostring</tt> for errors.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-Other features are only enabled, if LuaJIT is built with[m
[31m-<tt>-DLUAJIT_ENABLE_LUA52COMPAT</tt>:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>goto</tt> is a keyword and not a valid variable name anymore.</li>[m
[31m-<li><tt>break</tt> can be placed anywhere. Empty statements (<tt>;;</tt>)[m
[31m-are allowed.</li>[m
[31m-<li><tt>__lt</tt>, <tt>__le</tt> are invoked for mixed types.</li>[m
[31m-<li><tt>__len</tt> for tables. <tt>rawlen()</tt> library function.</li>[m
[31m-<li><tt>pairs()</tt> and <tt>ipairs()</tt> check for <tt>__pairs</tt> and[m
[31m-<tt>__ipairs</tt>.</li>[m
[31m-<li><tt>coroutine.running()</tt> returns two results.</li>[m
[31m-<li><tt>table.pack()</tt> and <tt>table.unpack()</tt>[m
[31m-(same as <tt>unpack()</tt>).</li>[m
[31m-<li><tt>io.write()</tt> and <tt>file:write()</tt> return file handle[m
[31m-instead of <tt>true</tt>.</li>[m
[31m-<li><tt>os.execute()</tt> and <tt>pipe:close()</tt> return detailed[m
[31m-exit status.</li>[m
[31m-<li><tt>debug.setmetatable()</tt> returns object.</li>[m
[31m-<li><tt>debug.getuservalue()</tt> and <tt>debug.setuservalue()</tt>.</li>[m
[31m-<li>Remove <tt>math.mod()</tt>, <tt>string.gfind()</tt>.[m
[31m-</ul>[m
[31m-<p>[m
[31m-Note: this provides only partial compatibility with Lua 5.2 at the[m
[31m-language and Lua library level. LuaJIT is API+ABI-compatible with[m
[31m-Lua&nbsp;5.1, which prevents implementing features that would otherwise[m
[31m-break the Lua/C API and ABI (e.g. <tt>_ENV</tt>).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="lua53">Extensions from Lua 5.3</h2>[m
[31m-<p>[m
[31m-LuaJIT supports some extensions from Lua&nbsp;5.3:[m
[31m-<ul>[m
[31m-<li>Unicode escape <tt>'\u{XX...}'</tt> embeds the UTF-8 encoding in string literals.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="exceptions">C++ Exception Interoperability</h2>[m
[31m-<p>[m
[31m-LuaJIT has built-in support for interoperating with C++&nbsp;exceptions.[m
[31m-The available range of features depends on the target platform and[m
[31m-the toolchain used to compile LuaJIT:[m
[31m-</p>[m
[31m-<table class="exc">[m
[31m-<tr class="exchead">[m
[31m-<td class="excplatform">Platform</td>[m
[31m-<td class="exccompiler">Compiler</td>[m
[31m-<td class="excinterop">Interoperability</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="excplatform">POSIX/x64, DWARF2 unwinding</td>[m
[31m-<td class="exccompiler">GCC 4.3+</td>[m
[31m-<td class="excinterop"><b style="color: #00a000;">Full</b></td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="excplatform">Other platforms, DWARF2 unwinding</td>[m
[31m-<td class="exccompiler">GCC</td>[m
[31m-<td class="excinterop"><b style="color: #c06000;">Limited</b></td>[m
[31m-</tr>[m
[31m-<tr class="odd">[m
[31m-<td class="excplatform">Windows/x64</td>[m
[31m-<td class="exccompiler">MSVC or WinSDK</td>[m
[31m-<td class="excinterop"><b style="color: #00a000;">Full</b></td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="excplatform">Windows/x86</td>[m
[31m-<td class="exccompiler">Any</td>[m
[31m-<td class="excinterop"><b style="color: #a00000;">No</b></td>[m
[31m-</tr>[m
[31m-<tr class="odd">[m
[31m-<td class="excplatform">Other platforms</td>[m
[31m-<td class="exccompiler">Other compilers</td>[m
[31m-<td class="excinterop"><b style="color: #a00000;">No</b></td>[m
[31m-</tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-<b style="color: #00a000;">Full interoperability</b> means:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>C++&nbsp;exceptions can be caught on the Lua side with <tt>pcall()</tt>,[m
[31m-<tt>lua_pcall()</tt> etc.</li>[m
[31m-<li>C++&nbsp;exceptions will be converted to the generic Lua error[m
[31m-<tt>"C++&nbsp;exception"</tt>, unless you use the[m
[31m-<a href="ext_c_api.html#mode_wrapcfunc">C&nbsp;call wrapper</a> feature.</li>[m
[31m-<li>It's safe to throw C++&nbsp;exceptions across non-protected Lua frames[m
[31m-on the C&nbsp;stack. The contents of the C++&nbsp;exception object[m
[31m-pass through unmodified.</li>[m
[31m-<li>Lua errors can be caught on the C++ side with <tt>catch(...)</tt>.[m
[31m-The corresponding Lua error message can be retrieved from the Lua stack.</li>[m
[31m-<li>Throwing Lua errors across C++ frames is safe. C++ destructors[m
[31m-will be called.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-<b style="color: #c06000;">Limited interoperability</b> means:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>C++&nbsp;exceptions can be caught on the Lua side with <tt>pcall()</tt>,[m
[31m-<tt>lua_pcall()</tt> etc.</li>[m
[31m-<li>C++&nbsp;exceptions will be converted to the generic Lua error[m
[31m-<tt>"C++&nbsp;exception"</tt>, unless you use the[m
[31m-<a href="ext_c_api.html#mode_wrapcfunc">C&nbsp;call wrapper</a> feature.</li>[m
[31m-<li>C++&nbsp;exceptions will be caught by non-protected Lua frames and[m
[31m-are rethrown as a generic Lua error. The C++&nbsp;exception object will[m
[31m-be destroyed.</li>[m
[31m-<li>Lua errors <b>cannot</b> be caught on the C++ side.</li>[m
[31m-<li>Throwing Lua errors across C++ frames will <b>not</b> call[m
[31m-C++ destructors.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-<b style="color: #a00000;">No interoperability</b> means:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>It's <b>not</b> safe to throw C++&nbsp;exceptions across Lua frames.</li>[m
[31m-<li>C++&nbsp;exceptions <b>cannot</b> be caught on the Lua side.</li>[m
[31m-<li>Lua errors <b>cannot</b> be caught on the C++ side.</li>[m
[31m-<li>Throwing Lua errors across C++ frames will <b>not</b> call[m
[31m-C++ destructors.</li>[m
[31m-<li>Additionally, on Windows/x86 with SEH-based C++&nbsp;exceptions:[m
[31m-it's <b>not</b> safe to throw a Lua error across any frames containing[m
[31m-a C++ function with any try/catch construct or using variables with[m
[31m-(implicit) destructors. This also applies to any functions which may be[m
[31m-inlined in such a function. It doesn't matter whether <tt>lua_error()</tt>[m
[31m-is called inside or outside of a try/catch or whether any object actually[m
[31m-needs to be destroyed: the SEH chain is corrupted and this will eventually[m
[31m-lead to the termination of the process.</li>[m
[31m-</ul>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/faq.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/faq.html[m
[1mdeleted file mode 100644[m
[1mindex 605fdd0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/faq.html[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Frequently Asked Questions (FAQ)</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-dd { margin-left: 1.5em; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Frequently Asked Questions (FAQ)</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a class="current" href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<dl>[m
[31m-<dt>Q: Where can I learn more about LuaJIT and Lua?</dt>[m
[31m-<dd>[m
[31m-<ul style="padding: 0;">[m
[31m-<li>The <a href="http://luajit.org/list.html"><span class="ext">&raquo;</span>&nbsp;LuaJIT mailing list</a> focuses on topics[m
[31m-related to LuaJIT.</li>[m
[31m-<li>The <a href="http://wiki.luajit.org/"><span class="ext">&raquo;</span>&nbsp;LuaJIT wiki</a> gathers community[m
[31m-resources about LuaJIT.</li>[m
[31m-<li>News about Lua itself can be found at the[m
[31m-<a href="http://www.lua.org/lua-l.html"><span class="ext">&raquo;</span>&nbsp;Lua mailing list</a>.[m
[31m-The mailing list archives are worth checking out for older postings[m
[31m-about LuaJIT.</li>[m
[31m-<li>The <a href="http://lua.org"><span class="ext">&raquo;</span>&nbsp;main Lua.org site</a> has complete[m
[31m-<a href="http://www.lua.org/docs.html"><span class="ext">&raquo;</span>&nbsp;documentation</a> of the language[m
[31m-and links to books and papers about Lua.</li>[m
[31m-<li>The community-managed <a href="http://lua-users.org/wiki/"><span class="ext">&raquo;</span>&nbsp;Lua Wiki</a>[m
[31m-has information about diverse topics.</li>[m
[31m-</ul>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Where can I learn more about the compiler technology used by LuaJIT?</dt>[m
[31m-<dd>[m
[31m-I'm planning to write more documentation about the internals of LuaJIT.[m
[31m-In the meantime, please use the following Google Scholar searches[m
[31m-to find relevant papers:<br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=Trace+Compiler"><span class="ext">&raquo;</span>&nbsp;Trace Compiler</a><br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=JIT+Compiler"><span class="ext">&raquo;</span>&nbsp;JIT Compiler</a><br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=Dynamic+Language+Optimizations"><span class="ext">&raquo;</span>&nbsp;Dynamic Language Optimizations</a><br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=SSA+Form"><span class="ext">&raquo;</span>&nbsp;SSA Form</a><br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=Linear+Scan+Register+Allocation"><span class="ext">&raquo;</span>&nbsp;Linear Scan Register Allocation</a><br>[m
[31m-Here is a list of the <a href="http://article.gmane.org/gmane.comp.lang.lua.general/58908"><span class="ext">&raquo;</span>&nbsp;innovative features in LuaJIT</a>.<br>[m
[31m-And, you know, reading the source is of course the only way to enlightenment. :-)[m
[31m-</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Why do I get this error: "attempt to index global 'arg' (a nil value)"?<br>[m
[31m-Q: My vararg functions fail after switching to LuaJIT!</dt>[m
[31m-<dd>LuaJIT is compatible to the Lua 5.1 language standard. It doesn't[m
[31m-support the implicit <tt>arg</tt> parameter for old-style vararg[m
[31m-functions from Lua 5.0.<br>Please convert your code to the[m
[31m-<a href="http://www.lua.org/manual/5.1/manual.html#2.5.9"><span class="ext">&raquo;</span>&nbsp;Lua 5.1[m
[31m-vararg syntax</a>.</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Why do I get this error: "bad FPU precision"?<br>[m
[31m-<dt>Q: I get weird behavior after initializing Direct3D.<br>[m
[31m-<dt>Q: Some FPU operations crash after I load a Delphi DLL.<br>[m
[31m-</dt>[m
[31m-<dd>[m
[31m-[m
[31m-DirectX/Direct3D (up to version 9) sets the x87 FPU to single-precision[m
[31m-mode by default. This violates the Windows ABI and interferes with the[m
[31m-operation of many programs &mdash; LuaJIT is affected, too. Please make[m
[31m-sure you always use the <tt>D3DCREATE_FPU_PRESERVE</tt> flag when[m
[31m-initializing Direct3D.<br>[m
[31m-[m
[31m-Direct3D version 10 or higher do not show this behavior anymore.[m
[31m-Consider testing your application with older versions, too.<br>[m
[31m-[m
[31m-Similarly, the Borland/Delphi runtime modifies the FPU control word and[m
[31m-enables FP exceptions. Of course this violates the Windows ABI, too.[m
[31m-Please check the Delphi docs for the Set8087CW method.[m
[31m-[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Sometimes Ctrl-C fails to stop my Lua program. Why?</dt>[m
[31m-<dd>The interrupt signal handler sets a Lua debug hook. But this is[m
[31m-currently ignored by compiled code (this will eventually be fixed). If[m
[31m-your program is running in a tight loop and never falls back to the[m
[31m-interpreter, the debug hook never runs and can't throw the[m
[31m-"interrupted!" error.<br> In the meantime you have to press Ctrl-C[m
[31m-twice to get stop your program. That's similar to when it's stuck[m
[31m-running inside a C function under the Lua interpreter.</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Why doesn't my favorite power-patch for Lua apply against LuaJIT?</dt>[m
[31m-<dd>Because it's a completely redesigned VM and has very little code[m
[31m-in common with Lua anymore. Also, if the patch introduces changes to[m
[31m-the Lua semantics, these would need to be reflected everywhere in the[m
[31m-VM, from the interpreter up to all stages of the compiler.<br> Please[m
[31m-use only standard Lua language constructs. For many common needs you[m
[31m-can use source transformations or use wrapper or proxy functions.[m
[31m-The compiler will happily optimize away such indirections.</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Lua runs everywhere. Why doesn't LuaJIT support my CPU?</dt>[m
[31m-<dd>Because it's a compiler &mdash; it needs to generate native[m
[31m-machine code. This means the code generator must be ported to each[m
[31m-architecture. And the fast interpreter is written in assembler and[m
[31m-must be ported, too. This is quite an undertaking.<br>[m
[31m-The <a href="install.html">install documentation</a> shows the supported[m
[31m-architectures. Other architectures will follow based on sufficient user[m
[31m-demand and/or sponsoring.</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: When will feature X be added? When will the next version be released?</dt>[m
[31m-<dd>When it's ready.<br>[m
[31m-C'mon, it's open source &mdash; I'm doing it on my own time and you're[m
[31m-getting it for free. You can either contribute a patch or sponsor[m
[31m-the development of certain features, if they are important to you.[m
[31m-</dd>[m
[31m-</dl>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/img/contact.png b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/img/contact.png[m
[1mdeleted file mode 100644[m
[1mindex 9c73dc5..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/img/contact.png and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/install.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/install.html[m
[1mdeleted file mode 100644[m
[1mindex 9921258..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/install.html[m
[1m+++ /dev/null[m
[36m@@ -1,666 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Installation</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.compat {[m
[31m-  line-height: 1.2;[m
[31m-  font-size: 80%;[m
[31m-}[m
[31m-table.compat td {[m
[31m-  border: 1px solid #bfcfff;[m
[31m-  height: 2.5em;[m
[31m-}[m
[31m-table.compat tr.compathead td {[m
[31m-  font-weight: bold;[m
[31m-  border-bottom: 2px solid #bfcfff;[m
[31m-}[m
[31m-tr.compathead td.compatos {[m
[31m-  vertical-align: top;[m
[31m-}[m
[31m-table.compat td.compatcpu {[m
[31m-  width: 18%;[m
[31m-  border-right: 2px solid #bfcfff;[m
[31m-}[m
[31m-td.compatos {[m
[31m-  width: 21%;[m
[31m-  vertical-align: middle;[m
[31m-}[m
[31m-td.compatno {[m
[31m-  background-color: #d0d0d0;[m
[31m-}[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Installation</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a class="current" href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT is only distributed as a source package. This page explains[m
[31m-how to build and install LuaJIT with different operating systems[m
[31m-and C&nbsp;compilers.[m
[31m-</p>[m
[31m-<p>[m
[31m-For the impatient (on POSIX systems):[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make &amp;&amp; sudo make install[m
[31m-</pre>[m
[31m-<p>[m
[31m-LuaJIT currently builds out-of-the box on most systems.[m
[31m-Here's the compatibility matrix for the supported combinations of[m
[31m-operating systems, CPUs and compilers:[m
[31m-</p>[m
[31m-<table class="compat">[m
[31m-<tr class="compathead">[m
[31m-<td class="compatcpu">CPU / OS</td>[m
[31m-<td class="compatos"><a href="#posix">Linux</a> or<br><a href="#android">Android</a></td>[m
[31m-<td class="compatos"><a href="#posix">*BSD, Other</a></td>[m
[31m-<td class="compatos"><a href="#posix">OSX 10.4+</a> or<br><a href="#ios">iOS 3.0+</a></td>[m
[31m-<td class="compatos"><a href="#windows">Windows<br>XP/Vista/7</a></td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="compatcpu">x86 (32 bit)</td>[m
[31m-<td class="compatos">GCC 4.2+</td>[m
[31m-<td class="compatos">GCC 4.2+</td>[m
[31m-<td class="compatos">XCode 5.0+<br>Clang</td>[m
[31m-<td class="compatos">MSVC, MSVC/EE<br>WinSDK<br>MinGW, Cygwin</td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="compatcpu">x64 (64 bit)</td>[m
[31m-<td class="compatos">GCC 4.2+</td>[m
[31m-<td class="compatos">ORBIS (<a href="#ps4">PS4</a>)</td>[m
[31m-<td class="compatos">XCode 5.0+<br>Clang</td>[m
[31m-<td class="compatos">MSVC + SDK v7.0<br>WinSDK v7.0<br>Durango (<a href="#xboxone">Xbox One</a>)</td>[m
[31m-</tr>[m
[31m-<tr class="odd">[m
[31m-<td class="compatcpu"><a href="#cross2">ARMv5+<br>ARM9E+</a></td>[m
[31m-<td class="compatos">GCC 4.2+</td>[m
[31m-<td class="compatos">GCC 4.2+<br>PSP2 (<a href="#psvita">PS VITA</a>)</td>[m
[31m-<td class="compatos">XCode 5.0+<br>Clang</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="compatcpu"><a href="#cross2">ARM64</a></td>[m
[31m-<td class="compatos">GCC 4.8+</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-<td class="compatos">XCode 6.0+<br>Clang 3.5+</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-</tr>[m
[31m-<tr class="odd">[m
[31m-<td class="compatcpu"><a href="#cross2">PPC</a></td>[m
[31m-<td class="compatos">GCC 4.3+</td>[m
[31m-<td class="compatos">GCC 4.3+<br>GCC 4.1 (<a href="#ps3">PS3</a>)</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-<td class="compatos">XEDK (<a href="#xbox360">Xbox 360</a>)</td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="compatcpu"><a href="#cross2">MIPS</a></td>[m
[31m-<td class="compatos">GCC 4.3+</td>[m
[31m-<td class="compatos">GCC 4.3+</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-</tr>[m
[31m-</table>[m
[31m-[m
[31m-<h2>Configuring LuaJIT</h2>[m
[31m-<p>[m
[31m-The standard configuration should work fine for most installations.[m
[31m-Usually there is no need to tweak the settings. The following files[m
[31m-hold all user-configurable settings:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>src/luaconf.h</tt> sets some configuration variables.</li>[m
[31m-<li><tt>Makefile</tt> has settings for <b>installing</b> LuaJIT (POSIX[m
[31m-only).</li>[m
[31m-<li><tt>src/Makefile</tt> has settings for <b>compiling</b> LuaJIT[m
[31m-under POSIX, MinGW or Cygwin.</li>[m
[31m-<li><tt>src/msvcbuild.bat</tt> has settings for compiling LuaJIT with[m
[31m-MSVC or WinSDK.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-Please read the instructions given in these files, before changing[m
[31m-any settings.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="posix">POSIX Systems (Linux, OSX, *BSD etc.)</h2>[m
[31m-<h3>Prerequisites</h3>[m
[31m-<p>[m
[31m-Depending on your distribution, you may need to install a package for[m
[31m-GCC, the development headers and/or a complete SDK. E.g. on a current[m
[31m-Debian/Ubuntu, install <tt>libc6-dev</tt> with the package manager.[m
[31m-</p>[m
[31m-<p>[m
[31m-Download the current source package of LuaJIT (pick the .tar.gz),[m
[31m-if you haven't already done so. Move it to a directory of your choice,[m
[31m-open a terminal window and change to this directory. Now unpack the archive[m
[31m-and change to the newly created directory:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-tar zxf LuaJIT-2.0.4.tar.gz[m
[31m-cd LuaJIT-2.0.4</pre>[m
[31m-<h3>Building LuaJIT</h3>[m
[31m-<p>[m
[31m-The supplied Makefiles try to auto-detect the settings needed for your[m
[31m-operating system and your compiler. They need to be run with GNU Make,[m
[31m-which is probably the default on your system, anyway. Simply run:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make[m
[31m-</pre>[m
[31m-<p>[m
[31m-This always builds a native x86, x64 or PPC binary, depending on the host OS[m
[31m-you're running this command on. Check the section on[m
[31m-<a href="#cross">cross-compilation</a> for more options.[m
[31m-</p>[m
[31m-<p>[m
[31m-By default, modules are only searched under the prefix <tt>/usr/local</tt>.[m
[31m-You can add an extra prefix to the search paths by appending the[m
[31m-<tt>PREFIX</tt> option, e.g.:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make PREFIX=/home/myself/lj2[m
[31m-</pre>[m
[31m-<p>[m
[31m-Note for OSX: if the <tt>MACOSX_DEPLOYMENT_TARGET</tt> environment[m
[31m-variable is not set, then it's forced to <tt>10.4</tt>.[m
[31m-</p>[m
[31m-<h3>Installing LuaJIT</h3>[m
[31m-<p>[m
[31m-The top-level Makefile installs LuaJIT by default under[m
[31m-<tt>/usr/local</tt>, i.e. the executable ends up in[m
[31m-<tt>/usr/local/bin</tt> and so on. You need root privileges[m
[31m-to write to this path. So, assuming sudo is installed on your system,[m
[31m-run the following command and enter your sudo password:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-sudo make install[m
[31m-</pre>[m
[31m-<p>[m
[31m-Otherwise specify the directory prefix as an absolute path, e.g.:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make install PREFIX=/home/myself/lj2[m
[31m-</pre>[m
[31m-<p>[m
[31m-Obviously the prefixes given during build and installation need to be the same.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="windows">Windows Systems</h2>[m
[31m-<h3>Prerequisites</h3>[m
[31m-<p>[m
[31m-Either install one of the open source SDKs[m
[31m-(<a href="http://mingw.org/"><span class="ext">&raquo;</span>&nbsp;MinGW</a> or[m
[31m-<a href="http://www.cygwin.com/"><span class="ext">&raquo;</span>&nbsp;Cygwin</a>), which come with a modified[m
[31m-GCC plus the required development headers.[m
[31m-</p>[m
[31m-<p>[m
[31m-Or install Microsoft's Visual C++ (MSVC). The freely downloadable[m
[31m-<a href="http://www.microsoft.com/Express/VC/"><span class="ext">&raquo;</span>&nbsp;Express Edition</a>[m
[31m-works just fine, but only contains an x86 compiler.[m
[31m-</p>[m
[31m-<p>[m
[31m-The freely downloadable[m
[31m-<a href="http://msdn.microsoft.com/en-us/windowsserver/bb980924.aspx"><span class="ext">&raquo;</span>&nbsp;Windows SDK</a>[m
[31m-only comes with command line tools, but this is all you need to build LuaJIT.[m
[31m-It contains x86 and x64 compilers.[m
[31m-</p>[m
[31m-<p>[m
[31m-Next, download the source package and unpack it using an archive manager[m
[31m-(e.g. the Windows Explorer) to a directory of your choice.[m
[31m-</p>[m
[31m-<h3>Building with MSVC</h3>[m
[31m-<p>[m
[31m-Open a "Visual Studio .NET Command Prompt", <tt>cd</tt> to the[m
[31m-directory where you've unpacked the sources and run these commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-msvcbuild[m
[31m-</pre>[m
[31m-<p>[m
[31m-Then follow the installation instructions below.[m
[31m-</p>[m
[31m-<h3>Building with the Windows SDK</h3>[m
[31m-<p>[m
[31m-Open a "Windows SDK Command Shell" and select the x86 compiler:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-setenv /release /x86[m
[31m-</pre>[m
[31m-<p>[m
[31m-Or select the x64 compiler:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-setenv /release /x64[m
[31m-</pre>[m
[31m-<p>[m
[31m-Then <tt>cd</tt> to the directory where you've unpacked the sources[m
[31m-and run these commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-msvcbuild[m
[31m-</pre>[m
[31m-<p>[m
[31m-Then follow the installation instructions below.[m
[31m-</p>[m
[31m-<h3>Building with MinGW or Cygwin</h3>[m
[31m-<p>[m
[31m-Open a command prompt window and make sure the MinGW or Cygwin programs[m
[31m-are in your path. Then <tt>cd</tt> to the directory where[m
[31m-you've unpacked the sources and run this command for MinGW:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-mingw32-make[m
[31m-</pre>[m
[31m-<p>[m
[31m-Or this command for Cygwin:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make[m
[31m-</pre>[m
[31m-<p>[m
[31m-Then follow the installation instructions below.[m
[31m-</p>[m
[31m-<h3>Installing LuaJIT</h3>[m
[31m-<p>[m
[31m-Copy <tt>luajit.exe</tt> and <tt>lua51.dll</tt> (built in the <tt>src</tt>[m
[31m-directory) to a newly created directory (any location is ok).[m
[31m-Add <tt>lua</tt> and <tt>lua\jit</tt> directories below it and copy[m
[31m-all Lua files from the <tt>src\jit</tt> directory of the distribution[m
[31m-to the latter directory.[m
[31m-</p>[m
[31m-<p>[m
[31m-There are no hardcoded[m
[31m-absolute path names &mdash; all modules are loaded relative to the[m
[31m-directory where <tt>luajit.exe</tt> is installed[m
[31m-(see <tt>src/luaconf.h</tt>).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="cross">Cross-compiling LuaJIT</h2>[m
[31m-<p>[m
[31m-The GNU Makefile-based build system allows cross-compiling on any host[m
[31m-for any supported target, as long as both architectures have the same[m
[31m-pointer size. If you want to cross-compile to any 32 bit target on an[m
[31m-x64 OS, you need to install the multilib development package (e.g.[m
[31m-<tt>libc6-dev-i386</tt> on Debian/Ubuntu) and build a 32 bit host part[m
[31m-(<tt>HOST_CC="gcc -m32"</tt>).[m
[31m-</p>[m
[31m-<p>[m
[31m-You need to specify <tt>TARGET_SYS</tt> whenever the host OS and the[m
[31m-target OS differ, or you'll get assembler or linker errors. E.g. if[m
[31m-you're compiling on a Windows or OSX host for embedded Linux or Android,[m
[31m-you need to add <tt>TARGET_SYS=Linux</tt> to the examples below. For a[m
[31m-minimal target OS, you may need to disable the built-in allocator in[m
[31m-<tt>src/Makefile</tt> and use <tt>TARGET_SYS=Other</tt>. Don't forget to[m
[31m-specify the same <tt>TARGET_SYS</tt> for the install step, too.[m
[31m-</p>[m
[31m-<p>[m
[31m-The examples below only show some popular targets &mdash; please check[m
[31m-the comments in <tt>src/Makefile</tt> for more details.[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-# Cross-compile to a 32 bit binary on a multilib x64 OS[m
[31m-make CC="gcc -m32"[m
[31m-[m
[31m-# Cross-compile on Debian/Ubuntu for Windows (mingw32 package)[m
[31m-make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows[m
[31m-</pre>[m
[31m-<p id="cross2">[m
[31m-The <tt>CROSS</tt> prefix allows specifying a standard GNU cross-compile[m
[31m-toolchain (Binutils, GCC and a matching libc). The prefix may vary[m
[31m-depending on the <tt>--target</tt> the toolchain was built for (note the[m
[31m-<tt>CROSS</tt> prefix has a trailing <tt>"-"</tt>). The examples below[m
[31m-use the canonical toolchain triplets for Linux.[m
[31m-</p>[m
[31m-<p>[m
[31m-Since there's often no easy way to detect CPU features at runtime, it's[m
[31m-important to compile with the proper CPU or architecture settings. You[m
[31m-can specify these when building the toolchain yourself. Or add[m
[31m-<tt>-mcpu=...</tt> or <tt>-march=...</tt> to <tt>TARGET_CFLAGS</tt>. For[m
[31m-ARM it's important to have the correct <tt>-mfloat-abi=...</tt> setting,[m
[31m-too. Otherwise LuaJIT may not run at the full performance of your target[m
[31m-CPU.[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-# ARM soft-float[m
[31m-make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \[m
[31m-     TARGET_CFLAGS="-mfloat-abi=soft"[m
[31m-[m
[31m-# ARM soft-float ABI with VFP (example for Cortex-A8)[m
[31m-make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \[m
[31m-     TARGET_CFLAGS="-mcpu=cortex-a8 -mfloat-abi=softfp"[m
[31m-[m
[31m-# ARM hard-float ABI with VFP (armhf, requires recent toolchain)[m
[31m-make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-[m
[31m-[m
[31m-# ARM64 (requires x64 host)[m
[31m-make CROSS=aarch64-linux-[m
[31m-[m
[31m-# PPC[m
[31m-make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-[m
[31m-[m
[31m-# MIPS big-endian[m
[31m-make HOST_CC="gcc -m32" CROSS=mips-linux-[m
[31m-# MIPS little-endian[m
[31m-make HOST_CC="gcc -m32" CROSS=mipsel-linux-[m
[31m-</pre>[m
[31m-<p>[m
[31m-You can cross-compile for <b id="android">Android</b> using the <a href="http://developer.android.com/sdk/ndk/index.html"><span class="ext">&raquo;</span>&nbsp;Android NDK</a>.[m
[31m-The environment variables need to match the install locations and the[m
[31m-desired target platform. E.g. Android&nbsp;4.0 corresponds to ABI level&nbsp;14.[m
[31m-For details check the folder <tt>docs</tt> in the NDK directory.[m
[31m-</p>[m
[31m-<p>[m
[31m-Only a few common variations for the different CPUs, ABIs and platforms[m
[31m-are listed. Please use your own judgement for which combination you want[m
[31m-to build/deploy or which lowest common denominator you want to pick:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-# Android/ARM, armeabi (ARMv5TE soft-float), Android 2.2+ (Froyo)[m
[31m-NDK=/opt/android/ndk[m
[31m-NDKABI=8[m
[31m-NDKVER=$NDK/toolchains/arm-linux-androideabi-4.6[m
[31m-NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-[m
[31m-NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"[m
[31m-make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"[m
[31m-[m
[31m-# Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.0+ (ICS)[m
[31m-NDK=/opt/android/ndk[m
[31m-NDKABI=14[m
[31m-NDKVER=$NDK/toolchains/arm-linux-androideabi-4.6[m
[31m-NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-[m
[31m-NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"[m
[31m-NDKARCH="-march=armv7-a -mfloat-abi=softfp -Wl,--fix-cortex-a8"[m
[31m-make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF $NDKARCH"[m
[31m-[m
[31m-# Android/MIPS, mips (MIPS32R1 hard-float), Android 4.0+ (ICS)[m
[31m-NDK=/opt/android/ndk[m
[31m-NDKABI=14[m
[31m-NDKVER=$NDK/toolchains/mipsel-linux-android-4.6[m
[31m-NDKP=$NDKVER/prebuilt/linux-x86/bin/mipsel-linux-android-[m
[31m-NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-mips"[m
[31m-make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"[m
[31m-[m
[31m-# Android/x86, x86 (i686 SSE3), Android 4.0+ (ICS)[m
[31m-NDK=/opt/android/ndk[m
[31m-NDKABI=14[m
[31m-NDKVER=$NDK/toolchains/x86-4.6[m
[31m-NDKP=$NDKVER/prebuilt/linux-x86/bin/i686-linux-android-[m
[31m-NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-x86"[m
[31m-make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"[m
[31m-</pre>[m
[31m-<p>[m
[31m-You can cross-compile for <b id="ios">iOS 3.0+</b> (iPhone/iPad) using the <a href="http://developer.apple.com/devcenter/ios/index.action"><span class="ext">&raquo;</span>&nbsp;iOS SDK</a>:[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Note: <b>the JIT compiler is disabled for iOS</b>, because regular iOS Apps[m
[31m-are not allowed to generate code at runtime. You'll only get the performance[m
[31m-of the LuaJIT interpreter on iOS. This is still faster than plain Lua, but[m
[31m-much slower than the JIT compiler. Please complain to Apple, not me.[m
[31m-Or use Android. :-p[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-# iOS/ARM (32 bit)[m
[31m-ISDKP=$(xcrun --sdk iphoneos --show-sdk-path)[m
[31m-ICC=$(xcrun --sdk iphoneos --find clang)[m
[31m-ISDKF="-arch armv7 -isysroot $ISDKP"[m
[31m-make HOST_CC="clang -m32 -arch i386" CROSS="$(dirname $ICC)/" \[m
[31m-     TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS[m
[31m-[m
[31m-# iOS/ARM64[m
[31m-ISDKP=$(xcrun --sdk iphoneos --show-sdk-path)[m
[31m-ICC=$(xcrun --sdk iphoneos --find clang)[m
[31m-ISDKF="-arch arm64 -isysroot $ISDKP"[m
[31m-make CROSS="$(dirname $ICC)/" TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS[m
[31m-</pre>[m
[31m-[m
[31m-<h3 id="consoles">Cross-compiling for consoles</h3>[m
[31m-<p>[m
[31m-Building LuaJIT for consoles requires both a supported host compiler[m
[31m-(x86 or x64) and a cross-compiler (to PPC or ARM) from the official[m
[31m-console SDK.[m
[31m-</p>[m
[31m-<p>[m
[31m-Due to restrictions on consoles, the JIT compiler is disabled and only[m
[31m-the fast interpreter is built. This is still faster than plain Lua,[m
[31m-but much slower than the JIT compiler. The FFI is disabled, too, since[m
[31m-it's not very useful in such an environment.[m
[31m-</p>[m
[31m-<p>[m
[31m-The following commands build a static library <tt>libluajit.a</tt>,[m
[31m-which can be linked against your game, just like the Lua library.[m
[31m-</p>[m
[31m-<p>[m
[31m-To cross-compile for <b id="ps3">PS3</b> from a Linux host (requires[m
[31m-32&nbsp;bit GCC, i.e. multilib Linux/x64) or a Windows host (requires[m
[31m-32&nbsp;bit MinGW), run this command:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make HOST_CC="gcc -m32" CROSS=ppu-lv2-[m
[31m-</pre>[m
[31m-<p>[m
[31m-To cross-compile for <b id="ps4">PS4</b> from a Windows host,[m
[31m-open a "Visual Studio .NET Command Prompt" (64&nbsp;bit host compiler),[m
[31m-<tt>cd</tt> to the directory where you've unpacked the sources and[m
[31m-run the following commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-ps4build[m
[31m-</pre>[m
[31m-<p>[m
[31m-To cross-compile for <b id="psvita">PS Vita</b> from a Windows host,[m
[31m-open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler),[m
[31m-<tt>cd</tt> to the directory where you've unpacked the sources and[m
[31m-run the following commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-psvitabuild[m
[31m-</pre>[m
[31m-<p>[m
[31m-To cross-compile for <b id="xbox360">Xbox 360</b> from a Windows host,[m
[31m-open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler),[m
[31m-<tt>cd</tt> to the directory where you've unpacked the sources and run[m
[31m-the following commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-xedkbuild[m
[31m-</pre>[m
[31m-<p>[m
[31m-To cross-compile for <b id="xboxone">Xbox One</b> from a Windows host,[m
[31m-open a "Visual Studio .NET Command Prompt" (64&nbsp;bit host compiler),[m
[31m-<tt>cd</tt> to the directory where you've unpacked the sources and run[m
[31m-the following commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-xb1build[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="embed">Embedding LuaJIT</h2>[m
[31m-<p>[m
[31m-LuaJIT is API-compatible with Lua 5.1. If you've already embedded Lua[m
[31m-into your application, you probably don't need to do anything to switch[m
[31m-to LuaJIT, except link with a different library:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>It's strongly suggested to build LuaJIT separately using the supplied[m
[31m-build system. Please do <em>not</em> attempt to integrate the individual[m
[31m-source files into your build tree. You'll most likely get the internal build[m
[31m-dependencies wrong or mess up the compiler flags. Treat LuaJIT like any[m
[31m-other external library and link your application with either the dynamic[m
[31m-or static library, depending on your needs.</li>[m
[31m-<li>If you want to load C modules compiled for plain Lua[m
[31m-with <tt>require()</tt>, you need to make sure the public symbols[m
[31m-(e.g. <tt>lua_pushnumber</tt>) are exported, too:[m
[31m-<ul><li>On POSIX systems you can either link to the shared library[m
[31m-or link the static library into your application. In the latter case[m
[31m-you'll need to export all public symbols from your main executable[m
[31m-(e.g. <tt>-Wl,-E</tt> on Linux) and add the external dependencies[m
[31m-(e.g. <tt>-lm -ldl</tt> on Linux).</li>[m
[31m-<li>Since Windows symbols are bound to a specific DLL name, you need to[m
[31m-link to the <tt>lua51.dll</tt> created by the LuaJIT build (do not rename[m
[31m-the DLL). You may link LuaJIT statically on Windows only if you don't[m
[31m-intend to load Lua/C modules at runtime.[m
[31m-</li></ul>[m
[31m-</li>[m
[31m-<li>[m
[31m-If you're building a 64 bit application on OSX which links directly or[m
[31m-indirectly against LuaJIT, you need to link your main executable[m
[31m-with these flags:[m
[31m-<pre class="code">[m
[31m--pagezero_size 10000 -image_base 100000000[m
[31m-</pre>[m
[31m-Also, it's recommended to <tt>rebase</tt> all (self-compiled) shared libraries[m
[31m-which are loaded at runtime on OSX/x64 (e.g. C extension modules for Lua).[m
[31m-See: <tt>man rebase</tt>[m
[31m-</li>[m
[31m-</ul>[m
[31m-<p>Additional hints for initializing LuaJIT using the C API functions:</p>[m
[31m-<ul>[m
[31m-<li>Here's a[m
[31m-<a href="http://lua-users.org/wiki/SimpleLuaApiExample"><span class="ext">&raquo;</span>&nbsp;simple example</a>[m
[31m-for embedding Lua or LuaJIT into your application.</li>[m
[31m-<li>Make sure you use <tt>luaL_newstate</tt>. Avoid using[m
[31m-<tt>lua_newstate</tt>, since this uses the (slower) default memory[m
[31m-allocator from your system (no support for this on x64).</li>[m
[31m-<li>Make sure you use <tt>luaL_openlibs</tt> and not the old Lua 5.0 style[m
[31m-of calling <tt>luaopen_base</tt> etc. directly.</li>[m
[31m-<li>To change or extend the list of standard libraries to load, copy[m
[31m-<tt>src/lib_init.c</tt> to your project and modify it accordingly.[m
[31m-Make sure the <tt>jit</tt> library is loaded or the JIT compiler[m
[31m-will not be activated.</li>[m
[31m-<li>The <tt>bit.*</tt> module for bitwise operations[m
[31m-is already built-in. There's no need to statically link[m
[31m-<a href="http://bitop.luajit.org/"><span class="ext">&raquo;</span>&nbsp;Lua BitOp</a> to your application.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="distro">Hints for Distribution Maintainers</h2>[m
[31m-<p>[m
[31m-The LuaJIT build system has extra provisions for the needs of most[m
[31m-POSIX-based distributions. If you're a package maintainer for[m
[31m-a distribution, <em>please</em> make use of these features and[m
[31m-avoid patching, subverting, autotoolizing or messing up the build system[m
[31m-in unspeakable ways.[m
[31m-</p>[m
[31m-<p>[m
[31m-There should be absolutely no need to patch <tt>luaconf.h</tt> or any[m
[31m-of the Makefiles. And please do not hand-pick files for your packages &mdash;[m
[31m-simply use whatever <tt>make install</tt> creates. There's a reason[m
[31m-for all of the files <em>and</em> directories it creates.[m
[31m-</p>[m
[31m-<p>[m
[31m-The build system uses GNU make and auto-detects most settings based on[m
[31m-the host you're building it on. This should work fine for native builds,[m
[31m-even when sandboxed. You may need to pass some of the following flags to[m
[31m-<em>both</em> the <tt>make</tt> and the <tt>make install</tt> command lines[m
[31m-for a regular distribution build:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>PREFIX</tt> overrides the installation path and should usually[m
[31m-be set to <tt>/usr</tt>. Setting this also changes the module paths and[m
[31m-the paths needed to locate the shared library.</li>[m
[31m-<li><tt>DESTDIR</tt> is an absolute path which allows you to install[m
[31m-to a shadow tree instead of the root tree of the build system.</li>[m
[31m-<li><tt>MULTILIB</tt> sets the architecture-specific library path component[m
[31m-for multilib systems. The default is <tt>lib</tt>.</li>[m
[31m-<li>Have a look at the top-level <tt>Makefile</tt> and <tt>src/Makefile</tt>[m
[31m-for additional variables to tweak. The following variables <em>may</em> be[m
[31m-overridden, but it's <em>not</em> recommended, except for special needs[m
[31m-like cross-builds:[m
[31m-<tt>BUILDMODE, CC, HOST_CC, STATIC_CC, DYNAMIC_CC, CFLAGS, HOST_CFLAGS,[m
[31m-TARGET_CFLAGS, LDFLAGS, HOST_LDFLAGS, TARGET_LDFLAGS, TARGET_SHLDFLAGS,[m
[31m-TARGET_FLAGS, LIBS, HOST_LIBS, TARGET_LIBS, CROSS, HOST_SYS, TARGET_SYS[m
[31m-</tt></li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The build system has a special target for an amalgamated build, i.e.[m
[31m-<tt>make amalg</tt>. This compiles the LuaJIT core as one huge C file[m
[31m-and allows GCC to generate faster and shorter code. Alas, this requires[m
[31m-lots of memory during the build. This may be a problem for some users,[m
[31m-that's why it's not enabled by default. But it shouldn't be a problem for[m
[31m-most build farms. It's recommended that binary distributions use this[m
[31m-target for their LuaJIT builds.[m
[31m-</p>[m
[31m-<p>[m
[31m-The tl;dr version of the above:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make amalg PREFIX=/usr && \[m
[31m-make install PREFIX=/usr DESTDIR=/tmp/buildroot[m
[31m-</pre>[m
[31m-<p>[m
[31m-Finally, if you encounter any difficulties, please[m
[31m-<a href="contact.html">contact me</a> first, instead of releasing a broken[m
[31m-package onto unsuspecting users. Because they'll usually gonna complain[m
[31m-to me (the upstream) and not you (the package maintainer), anyway.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/luajit.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/luajit.html[m
[1mdeleted file mode 100644[m
[1mindex c7a92b8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/luajit.html[m
[1m+++ /dev/null[m
[36m@@ -1,236 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>LuaJIT</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<meta name="description" content="LuaJIT is a Just-In-Time (JIT) compiler for the Lua language.">[m
[31m-<style type="text/css">[m
[31m-table.feature {[m
[31m-  width: inherit;[m
[31m-  line-height: 1.2;[m
[31m-  margin: 0;[m
[31m-}[m
[31m-table.feature td {[m
[31m-  width: 80px;[m
[31m-  height: 40px;[m
[31m-  vertical-align: middle;[m
[31m-  text-align: center;[m
[31m-  font-weight: bold;[m
[31m-  border: 4px solid #e6ecff;[m
[31m-  border-radius: 12px;[m
[31m-}[m
[31m-table.os td {[m
[31m-  background: #7080d0;[m
[31m-  background-image: linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-  background-image: -moz-linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-  background-image: -webkit-linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-  background-image: -o-linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-  background-image: -ms-linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-}[m
[31m-table.os1 td {[m
[31m-  color: #ffff80;[m
[31m-}[m
[31m-table.os2 td {[m
[31m-  color: #ffa040;[m
[31m-}[m
[31m-table.os3 td {[m
[31m-  color: #40ffff;[m
[31m-}[m
[31m-table.compiler td {[m
[31m-  color: #2080ff;[m
[31m-  background: #62bf41;[m
[31m-  background-image: linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-  background-image: -moz-linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-  background-image: -webkit-linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-  background-image: -o-linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-  background-image: -ms-linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-}[m
[31m-table.cpu td {[m
[31m-  color: #ffff00;[m
[31m-  background: #cf7251;[m
[31m-  background-image: linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-  background-image: -moz-linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-  background-image: -webkit-linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-  background-image: -o-linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-  background-image: -ms-linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-}[m
[31m-table.fcompat td {[m
[31m-  color: #2060e0;[m
[31m-  background: #61cfcf;[m
[31m-  background-image: linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-  background-image: -moz-linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-  background-image: -webkit-linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-  background-image: -o-linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-  background-image: -ms-linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-}[m
[31m-table.stats td {[m
[31m-  color: #ffffff;[m
[31m-  background: #a0a0a0;[m
[31m-  background-image: linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-  background-image: -moz-linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-  background-image: -webkit-linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-  background-image: -o-linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-  background-image: -ms-linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-}[m
[31m-table.stats td.speed {[m
[31m-  color: #ff4020;[m
[31m-}[m
[31m-table.stats td.kb {[m
[31m-  color: #ffff80;[m
[31m-  background: #808080;[m
[31m-  background-image: linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-  background-image: -moz-linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-  background-image: -webkit-linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-  background-image: -o-linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-  background-image: -ms-linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-}[m
[31m-table.feature small {[m
[31m-  font-size: 50%;[m
[31m-}[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>LuaJIT</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a class="current" href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT is a <b>Just-In-Time Compiler</b> (JIT) for the[m
[31m-<a href="http://www.lua.org/"><span class="ext">&raquo;</span>&nbsp;Lua</a> programming language.[m
[31m-Lua is a powerful, dynamic and light-weight programming language.[m
[31m-It may be embedded or used as a general-purpose, stand-alone language.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT is Copyright &copy; 2005-2016 Mike Pall, released under the[m
[31m-<a href="http://www.opensource.org/licenses/mit-license.php"><span class="ext">&raquo;</span>&nbsp;MIT open source license</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-</p>[m
[31m-[m
[31m-<h2>Compatibility</h2>[m
[31m-<table class="feature os os1">[m
[31m-<tr><td>Windows</td><td>Linux</td><td>BSD</td><td>OSX</td><td>POSIX</td></tr>[m
[31m-</table>[m
[31m-<table class="feature os os2">[m
[31m-<tr><td><span style="font-size:90%;">Embedded</span></td><td>Android</td><td>iOS</td></tr>[m
[31m-</table>[m
[31m-<table class="feature os os3">[m
[31m-<tr><td>PS3</td><td>PS4</td><td>PS Vita</td><td>Xbox 360</td><td>Xbox One</td></tr>[m
[31m-</table>[m
[31m-<table class="feature compiler">[m
[31m-<tr><td>GCC</td><td>CLANG<br>LLVM</td><td>MSVC</td></tr>[m
[31m-</table>[m
[31m-<table class="feature cpu">[m
[31m-<tr><td>x86</td><td>x64</td><td>ARM</td><td>ARM64</td><td>PPC</td><td>MIPS</td></tr>[m
[31m-</table>[m
[31m-<table class="feature fcompat">[m
[31m-<tr><td>Lua&nbsp;5.1<br>API+ABI</td><td>+&nbsp;JIT</td><td>+&nbsp;BitOp</td><td>+&nbsp;FFI</td><td>Drop-in<br>DLL/.so</td></tr>[m
[31m-</table>[m
[31m-[m
[31m-<h2>Overview</h2>[m
[31m-<table class="feature stats">[m
[31m-<tr>[m
[31m-<td class="speed">3x<br>-&nbsp;&nbsp;100x</td>[m
[31m-<td class="kb">115&nbsp;<small>KB</small><br>VM</td>[m
[31m-<td class="kb">90&nbsp;<small>KB</small><br>JIT</td>[m
[31m-<td class="kloc">63&nbsp;<small>KLOC</small><br>C</td>[m
[31m-<td class="kloc">24&nbsp;<small>KLOC</small><br>ASM</td>[m
[31m-<td class="kloc">11&nbsp;<small>KLOC</small><br>Lua</td>[m
[31m-</tr>[m
[31m-</table>[m
[31m-<p style="margin-top: 1em;">[m
[31m-LuaJIT has been successfully used as a <b>scripting middleware</b> in[m
[31m-games, appliances, network and graphics apps, numerical simulations,[m
[31m-trading platforms and many other specialty applications. It scales from[m
[31m-embedded devices, smartphones, desktops up to server farms. It combines[m
[31m-high flexibility with <a href="http://luajit.org/performance.html"><span class="ext">&raquo;</span>&nbsp;high performance</a>[m
[31m-and an unmatched <b>low memory footprint</b>.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT has been in continuous development since 2005. It's widely[m
[31m-considered to be <b>one of the fastest dynamic language[m
[31m-implementations</b>. It has outperformed other dynamic languages on many[m
[31m-cross-language benchmarks since its first release &mdash; often by a[m
[31m-substantial margin.[m
[31m-</p>[m
[31m-<p>[m
[31m-For <b>LuaJIT 2.0</b>, the whole VM has been rewritten from the ground up[m
[31m-and relentlessly optimized for performance. It combines a <b>high-speed[m
[31m-interpreter</b>, written in assembler, with a <b>state-of-the-art JIT[m
[31m-compiler</b>.[m
[31m-</p>[m
[31m-<p>[m
[31m-An innovative <b>trace compiler</b> is integrated with advanced,[m
[31m-SSA-based optimizations and highly tuned code generation backends.[m
[31m-A substantial reduction of the overhead associated with dynamic languages[m
[31m-allows it to break into the performance range traditionally reserved for[m
[31m-offline, static language compilers.[m
[31m-</p>[m
[31m-[m
[31m-<h2>More ...</h2>[m
[31m-<p>[m
[31m-Please select a sub-topic in the navigation bar to learn more about LuaJIT.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/running.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/running.html[m
[1mdeleted file mode 100644[m
[1mindex 28a7326..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/running.html[m
[1m+++ /dev/null[m
[36m@@ -1,309 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Running LuaJIT</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.opt {[m
[31m-  line-height: 1.2;[m
[31m-}[m
[31m-tr.opthead td {[m
[31m-  font-weight: bold;[m
[31m-}[m
[31m-td.flag_name {[m
[31m-  width: 4em;[m
[31m-}[m
[31m-td.flag_level {[m
[31m-  width: 2em;[m
[31m-  text-align: center;[m
[31m-}[m
[31m-td.param_name {[m
[31m-  width: 6em;[m
[31m-}[m
[31m-td.param_default {[m
[31m-  width: 4em;[m
[31m-  text-align: right;[m
[31m-}[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Running LuaJIT</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT has only a single stand-alone executable, called <tt>luajit</tt> on[m
[31m-POSIX systems or <tt>luajit.exe</tt> on Windows. It can be used to run simple[m
[31m-Lua statements or whole Lua applications from the command line. It has an[m
[31m-interactive mode, too.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="options">Command Line Options</h2>[m
[31m-<p>[m
[31m-The <tt>luajit</tt> stand-alone executable is just a slightly modified[m
[31m-version of the regular <tt>lua</tt> stand-alone executable.[m
[31m-It supports the same basic options, too. <tt>luajit&nbsp;-h</tt>[m
[31m-prints a short list of the available options. Please have a look at the[m
[31m-<a href="http://www.lua.org/manual/5.1/manual.html#6"><span class="ext">&raquo;</span>&nbsp;Lua manual</a>[m
[31m-for details.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT has some additional options:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="opt_b"><tt>-b[options] input output</tt></h3>[m
[31m-<p>[m
[31m-This option saves or lists bytecode. The following additional options[m
[31m-are accepted:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>-l</tt> &mdash; Only list bytecode.</li>[m
[31m-<li><tt>-s</tt> &mdash; Strip debug info (this is the default).</li>[m
[31m-<li><tt>-g</tt> &mdash; Keep debug info.</li>[m
[31m-<li><tt>-n name</tt> &mdash; Set module name (default: auto-detect from input name)</li>[m
[31m-<li><tt>-t type</tt> &mdash; Set output file type (default: auto-detect from output name).</li>[m
[31m-<li><tt>-a arch</tt> &mdash; Override architecture for object files (default: native).</li>[m
[31m-<li><tt>-o os</tt> &mdash; Override OS for object files (default: native).</li>[m
[31m-<li><tt>-e chunk</tt> &mdash; Use chunk string as input.</li>[m
[31m-<li><tt>-</tt> (a single minus sign) &mdash; Use stdin as input and/or stdout as output.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The output file type is auto-detected from the extension of the output[m
[31m-file name:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>c</tt> &mdash; C source file, exported bytecode data.</li>[m
[31m-<li><tt>h</tt> &mdash; C header file, static bytecode data.</li>[m
[31m-<li><tt>obj</tt> or <tt>o</tt> &mdash; Object file, exported bytecode data[m
[31m-(OS- and architecture-specific).</li>[m
[31m-<li><tt>raw</tt> or any other extension &mdash; Raw bytecode file (portable).[m
[31m-</ul>[m
[31m-<p>[m
[31m-Notes:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>See also <a href="extensions.html#string_dump">string.dump()</a>[m
[31m-for information on bytecode portability and compatibility.</li>[m
[31m-<li>A file in raw bytecode format is auto-detected and can be loaded like[m
[31m-any Lua source file. E.g. directly from the command line or with[m
[31m-<tt>loadfile()</tt>, <tt>dofile()</tt> etc.</li>[m
[31m-<li>To statically embed the bytecode of a module in your application,[m
[31m-generate an object file and just link it with your application.</li>[m
[31m-<li>On most ELF-based systems (e.g. Linux) you need to explicitly export the[m
[31m-global symbols when linking your application, e.g. with: <tt>-Wl,-E</tt></li>[m
[31m-<li><tt>require()</tt> tries to load embedded bytecode data from exported[m
[31m-symbols (in <tt>*.exe</tt> or <tt>lua51.dll</tt> on Windows) and from[m
[31m-shared libraries in <tt>package.cpath</tt>.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-Typical usage examples:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-luajit -b test.lua test.out                 # Save bytecode to test.out[m
[31m-luajit -bg test.lua test.out                # Keep debug info[m
[31m-luajit -be "print('hello world')" test.out  # Save cmdline script[m
[31m-[m
[31m-luajit -bl test.lua                         # List to stdout[m
[31m-luajit -bl test.lua test.txt                # List to test.txt[m
[31m-luajit -ble "print('hello world')"          # List cmdline script[m
[31m-[m
[31m-luajit -b test.lua test.obj                 # Generate object file[m
[31m-# Link test.obj with your application and load it with require("test")[m
[31m-</pre>[m
[31m-[m
[31m-<h3 id="opt_j"><tt>-j cmd[=arg[,arg...]]</tt></h3>[m
[31m-<p>[m
[31m-This option performs a LuaJIT control command or activates one of the[m
[31m-loadable extension modules. The command is first looked up in the[m
[31m-<tt>jit.*</tt> library. If no matching function is found, a module[m
[31m-named <tt>jit.&lt;cmd&gt;</tt> is loaded and the <tt>start()</tt>[m
[31m-function of the module is called with the specified arguments (if[m
[31m-any). The space between <tt>-j</tt> and <tt>cmd</tt> is optional.[m
[31m-</p>[m
[31m-<p>[m
[31m-Here are the available LuaJIT control commands:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li id="j_on"><tt>-jon</tt> &mdash; Turns the JIT compiler on (default).</li>[m
[31m-<li id="j_off"><tt>-joff</tt> &mdash; Turns the JIT compiler off (only use the interpreter).</li>[m
[31m-<li id="j_flush"><tt>-jflush</tt> &mdash; Flushes the whole cache of compiled code.</li>[m
[31m-<li id="j_v"><tt>-jv</tt> &mdash; Shows verbose information about the progress of the JIT compiler.</li>[m
[31m-<li id="j_dump"><tt>-jdump</tt> &mdash; Dumps the code and structures used in various compiler stages.</li>[m
[31m-<li id="j_p"><tt>-jp</tt> &mdash; Start the <a href="ext_profiler.html">integrated profiler</a>.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The <tt>-jv</tt> and <tt>-jdump</tt> commands are extension modules[m
[31m-written in Lua. They are mainly used for debugging the JIT compiler[m
[31m-itself. For a description of their options and output format, please[m
[31m-read the comment block at the start of their source.[m
[31m-They can be found in the <tt>lib</tt> directory of the source[m
[31m-distribution or installed under the <tt>jit</tt> directory. By default[m
[31m-this is <tt>/usr/local/share/luajit-2.0.4/jit</tt> on POSIX[m
[31m-systems.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="opt_O"><tt>-O[level]</tt><br>[m
[31m-<tt>-O[+]flag</tt>&nbsp;&nbsp;&nbsp;<tt>-O-flag</tt><br>[m
[31m-<tt>-Oparam=value</tt></h3>[m
[31m-<p>[m
[31m-This options allows fine-tuned control of the optimizations used by[m
[31m-the JIT compiler. This is mainly intended for debugging LuaJIT itself.[m
[31m-Please note that the JIT compiler is extremely fast (we are talking[m
[31m-about the microsecond to millisecond range). Disabling optimizations[m
[31m-doesn't have any visible impact on its overhead, but usually generates[m
[31m-code that runs slower.[m
[31m-</p>[m
[31m-<p>[m
[31m-The first form sets an optimization level &mdash; this enables a[m
[31m-specific mix of optimization flags. <tt>-O0</tt> turns off all[m
[31m-optimizations and higher numbers enable more optimizations. Omitting[m
[31m-the level (i.e. just <tt>-O</tt>) sets the default optimization level,[m
[31m-which is <tt>-O3</tt> in the current version.[m
[31m-</p>[m
[31m-<p>[m
[31m-The second form adds or removes individual optimization flags.[m
[31m-The third form sets a parameter for the VM or the JIT compiler[m
[31m-to a specific value.[m
[31m-</p>[m
[31m-<p>[m
[31m-You can either use this option multiple times (like <tt>-Ocse[m
[31m--O-dce -Ohotloop=10</tt>) or separate several settings with a comma[m
[31m-(like <tt>-O+cse,-dce,hotloop=10</tt>). The settings are applied from[m
[31m-left to right and later settings override earlier ones. You can freely[m
[31m-mix the three forms, but note that setting an optimization level[m
[31m-overrides all earlier flags.[m
[31m-</p>[m
[31m-<p>[m
[31m-Here are the available flags and at what optimization levels they[m
[31m-are enabled:[m
[31m-</p>[m
[31m-<table class="opt">[m
[31m-<tr class="opthead">[m
[31m-<td class="flag_name">Flag</td>[m
[31m-<td class="flag_level">-O1</td>[m
[31m-<td class="flag_level">-O2</td>[m
[31m-<td class="flag_level">-O3</td>[m
[31m-<td class="flag_desc">&nbsp;</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="flag_name">fold</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Constant Folding, Simplifications and Reassociation</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">cse</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Common-Subexpression Elimination</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="flag_name">dce</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Dead-Code Elimination</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">narrow</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Narrowing of numbers to integers</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="flag_name">loop</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Loop Optimizations (code hoisting)</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">fwd</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Load Forwarding (L2L) and Store Forwarding (S2L)</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="flag_name">dse</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Dead-Store Elimination</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">abc</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Array Bounds Check Elimination</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="flag_name">sink</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Allocation/Store Sinking</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">fuse</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Fusion of operands into instructions</td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-Here are the parameters and their default settings:[m
[31m-</p>[m
[31m-<table class="opt">[m
[31m-<tr class="opthead">[m
[31m-<td class="param_name">Parameter</td>[m
[31m-<td class="param_default">Default</td>[m
[31m-<td class="param_desc">&nbsp;</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="param_name">maxtrace</td><td class="param_default">1000</td><td class="param_desc">Max. number of traces in the cache</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">maxrecord</td><td class="param_default">4000</td><td class="param_desc">Max. number of recorded IR instructions</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="param_name">maxirconst</td><td class="param_default">500</td><td class="param_desc">Max. number of IR constants of a trace</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">maxside</td><td class="param_default">100</td><td class="param_desc">Max. number of side traces of a root trace</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="param_name">maxsnap</td><td class="param_default">500</td><td class="param_desc">Max. number of snapshots for a trace</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="param_name">hotloop</td><td class="param_default">56</td><td class="param_desc">Number of iterations to detect a hot loop or hot call</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="param_name">hotexit</td><td class="param_default">10</td><td class="param_desc">Number of taken exits to start a side trace</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">tryside</td><td class="param_default">4</td><td class="param_desc">Number of attempts to compile a side trace</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="param_name">instunroll</td><td class="param_default">4</td><td class="param_desc">Max. unroll factor for instable loops</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">loopunroll</td><td class="param_default">15</td><td class="param_desc">Max. unroll factor for loop ops in side traces</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="param_name">callunroll</td><td class="param_default">3</td><td class="param_desc">Max. unroll factor for pseudo-recursive calls</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">recunroll</td><td class="param_default">2</td><td class="param_desc">Min. unroll factor for true recursion</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="param_name">sizemcode</td><td class="param_default">32</td><td class="param_desc">Size of each machine code area in KBytes (Windows: 64K)</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">maxmcode</td><td class="param_default">512</td><td class="param_desc">Max. total size of all machine code areas in KBytes</td></tr>[m
[31m-</table>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/status.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/status.html[m
[1mdeleted file mode 100644[m
[1mindex 6f57db1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/doc/status.html[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Status</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-ul li { padding-bottom: 0.3em; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Status</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a class="current" href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-<span style="color: #0000c0;">LuaJIT&nbsp;2.0</span> is the current[m
[31m-<span style="color: #0000c0;">stable branch</span>. This branch is in[m
[31m-feature-freeze &mdash; new features will only be added to LuaJIT&nbsp;2.1.[m
[31m-</p>[m
[31m-[m
[31m-<h2>Current Status</h2>[m
[31m-<p>[m
[31m-LuaJIT ought to run all Lua&nbsp;5.1-compatible source code just fine.[m
[31m-It's considered a serious bug if the VM crashes or produces unexpected[m
[31m-results &mdash; please report this.[m
[31m-</p>[m
[31m-<p>[m
[31m-Known incompatibilities and issues in LuaJIT&nbsp;2.0:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>[m
[31m-There are some differences in <b>implementation-defined</b> behavior.[m
[31m-These either have a good reason, are arbitrary design choices[m
[31m-or are due to quirks in the VM. The latter cases may get fixed if a[m
[31m-demonstrable need is shown.[m
[31m-</li>[m
[31m-<li>[m
[31m-The Lua <b>debug API</b> is missing a couple of features (return[m
[31m-hooks for non-Lua functions) and shows slightly different behavior[m
[31m-in LuaJIT (no per-coroutine hooks, no tail call counting).[m
[31m-</li>[m
[31m-<li>[m
[31m-Some checks are missing in the JIT-compiled code for obscure situations[m
[31m-with <b>open upvalues aliasing</b> one of the SSA slots later on (or[m
[31m-vice versa). Bonus points, if you can find a real world test case for[m
[31m-this.[m
[31m-</li>[m
[31m-<li>[m
[31m-Currently some <b>out-of-memory</b> errors from <b>on-trace code</b> are not[m
[31m-handled correctly. The error may fall through an on-trace[m
[31m-<tt>pcall</tt> or it may be passed on to the function set with[m
[31m-<tt>lua_atpanic</tt> on x64. This issue will be fixed with the new[m
[31m-garbage collector.[m
[31m-</li>[m
[31m-</ul>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm.h[m
[1mdeleted file mode 100644[m
[1mindex 0fa69ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm.h[m
[1m+++ /dev/null[m
[36m@@ -1,456 +0,0 @@[m
[31m-/*[m
[31m-** DynASM ARM encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"arm"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. */[m
[31m-enum {[m
[31m-  DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT,[m
[31m-  /* The following actions need a buffer position. */[m
[31m-  DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,[m
[31m-  /* The following actions also have an argument. */[m
[31m-  DASM_REL_PC, DASM_LABEL_PC,[m
[31m-  DASM_IMM, DASM_IMM12, DASM_IMM16, DASM_IMML8, DASM_IMML12, DASM_IMMV8,[m
[31m-  DASM__MAX[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_REL	0x15000000[m
[31m-#define DASM_S_UNDEF_LG		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned int *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-static int dasm_imm12(unsigned int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; i < 16; i++, n = (n << 2) | (n >> 30))[m
[31m-    if (n <= 255) return (int)(n + (i << 8));[m
[31m-  return -1;[m
[31m-}[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    unsigned int ins = *p++;[m
[31m-    unsigned int action = (ins >> 16);[m
[31m-    if (action >= DASM__MAX) {[m
[31m-      ofs += 4;[m
[31m-    } else {[m
[31m-      int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0;[m
[31m-      switch (action) {[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      case DASM_SECTION:[m
[31m-	n = (ins & 255); CK(n < D->maxsection, RANGE_SEC);[m
[31m-	D->section = &D->sections[n]; goto stop;[m
[31m-      case DASM_ESC: p++; ofs += 4; break;[m
[31m-      case DASM_REL_EXT: break;[m
[31m-      case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break;[m
[31m-      case DASM_REL_LG:[m
[31m-	n = (ins & 2047) - 10; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl += 10; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG:[m
[31m-	pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos;[m
[31m-	}[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_IMM:[m
[31m-      case DASM_IMM16:[m
[31m-#ifdef DASM_CHECKS[m
[31m-	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);[m
[31m-	if ((ins & 0x8000))[m
[31m-	  CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-	else[m
[31m-	  CK((n>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMMV8:[m
[31m-	CK((n & 3) == 0, RANGE_I);[m
[31m-	n >>= 2;[m
[31m-      case DASM_IMML8:[m
[31m-      case DASM_IMML12:[m
[31m-	CK(n >= 0 ? ((n>>((ins>>5)&31)) == 0) :[m
[31m-		    (((-n)>>((ins>>5)&31)) == 0), RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM12:[m
[31m-	CK(dasm_imm12((unsigned int)n) != -1, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_REL_EXT: break;[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;[m
[31m-	case DASM_REL_LG: case DASM_REL_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;[m
[31m-	case DASM_IMM: case DASM_IMM12: case DASM_IMM16:[m
[31m-	case DASM_IMML8: case DASM_IMML12: case DASM_IMMV8: pos++; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  char *base = (char *)buffer;[m
[31m-  unsigned int *cp = (unsigned int *)buffer;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: *cp++ = *p++; break;[m
[31m-	case DASM_REL_EXT:[m
[31m-	  n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins&2047), !(ins&2048));[m
[31m-	  goto patchrel;[m
[31m-	case DASM_ALIGN:[m
[31m-	  ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000;[m
[31m-	  break;[m
[31m-	case DASM_REL_LG:[m
[31m-	  CK(n >= 0, UNDEF_LG);[m
[31m-	case DASM_REL_PC:[m
[31m-	  CK(n >= 0, UNDEF_PC);[m
[31m-	  n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) - 4;[m
[31m-	patchrel:[m
[31m-	  if ((ins & 0x800) == 0) {[m
[31m-	    CK((n & 3) == 0 && ((n+0x02000000) >> 26) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n >> 2) & 0x00ffffff);[m
[31m-	  } else if ((ins & 0x1000)) {[m
[31m-	    CK((n & 3) == 0 && -256 <= n && n <= 256, RANGE_REL);[m
[31m-	    goto patchimml8;[m
[31m-	  } else if ((ins & 0x2000) == 0) {[m
[31m-	    CK((n & 3) == 0 && -4096 <= n && n <= 4096, RANGE_REL);[m
[31m-	    goto patchimml;[m
[31m-	  } else {[m
[31m-	    CK((n & 3) == 0 && -1020 <= n && n <= 1020, RANGE_REL);[m
[31m-	    n >>= 2;[m
[31m-	    goto patchimml;[m
[31m-	  }[m
[31m-	  break;[m
[31m-	case DASM_LABEL_LG:[m
[31m-	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);[m
[31m-	  break;[m
[31m-	case DASM_LABEL_PC: break;[m
[31m-	case DASM_IMM:[m
[31m-	  cp[-1] |= ((n>>((ins>>10)&31)) & ((1<<((ins>>5)&31))-1)) << (ins&31);[m
[31m-	  break;[m
[31m-	case DASM_IMM12:[m
[31m-	  cp[-1] |= dasm_imm12((unsigned int)n);[m
[31m-	  break;[m
[31m-	case DASM_IMM16:[m
[31m-	  cp[-1] |= ((n & 0xf000) << 4) | (n & 0x0fff);[m
[31m-	  break;[m
[31m-	case DASM_IMML8: patchimml8:[m
[31m-	  cp[-1] |= n >= 0 ? (0x00800000 | (n & 0x0f) | ((n & 0xf0) << 4)) :[m
[31m-			     ((-n & 0x0f) | ((-n & 0xf0) << 4));[m
[31m-	  break;[m
[31m-	case DASM_IMML12: case DASM_IMMV8: patchimml:[m
[31m-	  cp[-1] |= n >= 0 ? (0x00800000 | n) : (-n);[m
[31m-	  break;[m
[31m-	default: *cp++ = ins; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != (char *)cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm.lua[m
[1mdeleted file mode 100644[m
[1mindex e2ed922..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1125 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM ARM module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	"arm",[m
[31m-  description =	"DynASM ARM module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, setmetatable, rawget = assert, setmetatable, rawget[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local match, gmatch, gsub = _s.match, _s.gmatch, _s.gsub[m
[31m-local concat, sort, insert = table.concat, table.sort, table.insert[m
[31m-local bit = bit or require("bit")[m
[31m-local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift[m
[31m-local ror, tohex = bit.ror, bit.tohex[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  "STOP", "SECTION", "ESC", "REL_EXT",[m
[31m-  "ALIGN", "REL_LG", "LABEL_LG",[m
[31m-  "REL_PC", "LABEL_PC", "IMM", "IMM12", "IMM16", "IMML8", "IMML12", "IMMV8",[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number.[m
[31m-local map_action = {}[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  map_action[name] = n-1[m
[31m-end[m
[31m-[m
[31m--- Action list buffer.[m
[31m-local actlist = {}[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  if nn == 0 then nn = 1; actlist[0] = map_action.STOP end[m
[31m-  out:write("static const unsigned int ", name, "[", nn, "] = {\n")[m
[31m-  for i = 1,nn-1 do[m
[31m-    assert(out:write("0x", tohex(actlist[i]), ",\n"))[m
[31m-  end[m
[31m-  assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add word to action list.[m
[31m-local function wputxw(n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, val, a, num)[m
[31m-  local w = assert(map_action[action], "bad action name `"..action.."'")[m
[31m-  wputxw(w * 0x10000 + (val or 0))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  if #actlist == actargs[1] then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped word.[m
[31m-local function wputw(n)[m
[31m-  if n <= 0x000fffff then waction("ESC") end[m
[31m-  wputxw(n)[m
[31m-end[m
[31m-[m
[31m--- Reserve position for word.[m
[31m-local function wpos()[m
[31m-  local pos = #actlist+1[m
[31m-  actlist[pos] = ""[m
[31m-  return pos[m
[31m-end[m
[31m-[m
[31m--- Store word to reserved position.[m
[31m-local function wputpos(pos, n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  if n <= 0x000fffff then[m
[31m-    insert(actlist, pos+1, n)[m
[31m-    n = map_action.ESC * 0x10000[m
[31m-  end[m
[31m-  actlist[pos] = n[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 20[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 2047 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  ", prefix, t[i], ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = 0[m
[31m-local map_extern_ = {}[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n > 2047 then werror("too many extern labels") end[m
[31m-  next_extern = n + 1[m
[31m-  t[name] = n[m
[31m-  map_extern_[n] = name[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write(format("  %s\n", map_extern_[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write("  \"", map_extern_[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-[m
[31m--- Ext. register name -> int. name.[m
[31m-local map_archdef = { sp = "r13", lr = "r14", pc = "r15", }[m
[31m-[m
[31m--- Int. register name -> ext. name.[m
[31m-local map_reg_rev = { r13 = "sp", r14 = "lr", r15 = "pc", }[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for Dt... macros).[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  return map_reg_rev[s] or s[m
[31m-end[m
[31m-[m
[31m-local map_shift = { lsl = 0, lsr = 1, asr = 2, ror = 3, }[m
[31m-[m
[31m-local map_cond = {[m
[31m-  eq = 0, ne = 1, cs = 2, cc = 3, mi = 4, pl = 5, vs = 6, vc = 7,[m
[31m-  hi = 8, ls = 9, ge = 10, lt = 11, gt = 12, le = 13, al = 14,[m
[31m-  hs = 2, lo = 3,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Template strings for ARM instructions.[m
[31m-local map_op = {[m
[31m-  -- Basic data processing instructions.[m
[31m-  and_3 = "e0000000DNPs",[m
[31m-  eor_3 = "e0200000DNPs",[m
[31m-  sub_3 = "e0400000DNPs",[m
[31m-  rsb_3 = "e0600000DNPs",[m
[31m-  add_3 = "e0800000DNPs",[m
[31m-  adc_3 = "e0a00000DNPs",[m
[31m-  sbc_3 = "e0c00000DNPs",[m
[31m-  rsc_3 = "e0e00000DNPs",[m
[31m-  tst_2 = "e1100000NP",[m
[31m-  teq_2 = "e1300000NP",[m
[31m-  cmp_2 = "e1500000NP",[m
[31m-  cmn_2 = "e1700000NP",[m
[31m-  orr_3 = "e1800000DNPs",[m
[31m-  mov_2 = "e1a00000DPs",[m
[31m-  bic_3 = "e1c00000DNPs",[m
[31m-  mvn_2 = "e1e00000DPs",[m
[31m-[m
[31m-  and_4 = "e0000000DNMps",[m
[31m-  eor_4 = "e0200000DNMps",[m
[31m-  sub_4 = "e0400000DNMps",[m
[31m-  rsb_4 = "e0600000DNMps",[m
[31m-  add_4 = "e0800000DNMps",[m
[31m-  adc_4 = "e0a00000DNMps",[m
[31m-  sbc_4 = "e0c00000DNMps",[m
[31m-  rsc_4 = "e0e00000DNMps",[m
[31m-  tst_3 = "e1100000NMp",[m
[31m-  teq_3 = "e1300000NMp",[m
[31m-  cmp_3 = "e1500000NMp",[m
[31m-  cmn_3 = "e1700000NMp",[m
[31m-  orr_4 = "e1800000DNMps",[m
[31m-  mov_3 = "e1a00000DMps",[m
[31m-  bic_4 = "e1c00000DNMps",[m
[31m-  mvn_3 = "e1e00000DMps",[m
[31m-[m
[31m-  lsl_3 = "e1a00000DMws",[m
[31m-  lsr_3 = "e1a00020DMws",[m
[31m-  asr_3 = "e1a00040DMws",[m
[31m-  ror_3 = "e1a00060DMws",[m
[31m-  rrx_2 = "e1a00060DMs",[m
[31m-[m
[31m-  -- Multiply and multiply-accumulate.[m
[31m-  mul_3 = "e0000090NMSs",[m
[31m-  mla_4 = "e0200090NMSDs",[m
[31m-  umaal_4 = "e0400090DNMSs",	-- v6[m
[31m-  mls_4 = "e0600090DNMSs",	-- v6T2[m
[31m-  umull_4 = "e0800090DNMSs",[m
[31m-  umlal_4 = "e0a00090DNMSs",[m
[31m-  smull_4 = "e0c00090DNMSs",[m
[31m-  smlal_4 = "e0e00090DNMSs",[m
[31m-[m
[31m-  -- Halfword multiply and multiply-accumulate.[m
[31m-  smlabb_4 = "e1000080NMSD",	-- v5TE[m
[31m-  smlatb_4 = "e10000a0NMSD",	-- v5TE[m
[31m-  smlabt_4 = "e10000c0NMSD",	-- v5TE[m
[31m-  smlatt_4 = "e10000e0NMSD",	-- v5TE[m
[31m-  smlawb_4 = "e1200080NMSD",	-- v5TE[m
[31m-  smulwb_3 = "e12000a0NMS",	-- v5TE[m
[31m-  smlawt_4 = "e12000c0NMSD",	-- v5TE[m
[31m-  smulwt_3 = "e12000e0NMS",	-- v5TE[m
[31m-  smlalbb_4 = "e1400080NMSD",	-- v5TE[m
[31m-  smlaltb_4 = "e14000a0NMSD",	-- v5TE[m
[31m-  smlalbt_4 = "e14000c0NMSD",	-- v5TE[m
[31m-  smlaltt_4 = "e14000e0NMSD",	-- v5TE[m
[31m-  smulbb_3 = "e1600080NMS",	-- v5TE[m
[31m-  smultb_3 = "e16000a0NMS",	-- v5TE[m
[31m-  smulbt_3 = "e16000c0NMS",	-- v5TE[m
[31m-  smultt_3 = "e16000e0NMS",	-- v5TE[m
[31m-[m
[31m-  -- Miscellaneous data processing instructions.[m
[31m-  clz_2 = "e16f0f10DM", -- v5T[m
[31m-  rev_2 = "e6bf0f30DM", -- v6[m
[31m-  rev16_2 = "e6bf0fb0DM", -- v6[m
[31m-  revsh_2 = "e6ff0fb0DM", -- v6[m
[31m-  sel_3 = "e6800fb0DNM", -- v6[m
[31m-  usad8_3 = "e780f010NMS", -- v6[m
[31m-  usada8_4 = "e7800010NMSD", -- v6[m
[31m-  rbit_2 = "e6ff0f30DM", -- v6T2[m
[31m-  movw_2 = "e3000000DW", -- v6T2[m
[31m-  movt_2 = "e3400000DW", -- v6T2[m
[31m-  -- Note: the X encodes width-1, not width.[m
[31m-  sbfx_4 = "e7a00050DMvX", -- v6T2[m
[31m-  ubfx_4 = "e7e00050DMvX", -- v6T2[m
[31m-  -- Note: the X encodes the msb field, not the width.[m
[31m-  bfc_3 = "e7c0001fDvX", -- v6T2[m
[31m-  bfi_4 = "e7c00010DMvX", -- v6T2[m
[31m-[m
[31m-  -- Packing and unpacking instructions.[m
[31m-  pkhbt_3 = "e6800010DNM", pkhbt_4 = "e6800010DNMv", -- v6[m
[31m-  pkhtb_3 = "e6800050DNM", pkhtb_4 = "e6800050DNMv", -- v6[m
[31m-  sxtab_3 = "e6a00070DNM", sxtab_4 = "e6a00070DNMv", -- v6[m
[31m-  sxtab16_3 = "e6800070DNM", sxtab16_4 = "e6800070DNMv", -- v6[m
[31m-  sxtah_3 = "e6b00070DNM", sxtah_4 = "e6b00070DNMv", -- v6[m
[31m-  sxtb_2 = "e6af0070DM", sxtb_3 = "e6af0070DMv", -- v6[m
[31m-  sxtb16_2 = "e68f0070DM", sxtb16_3 = "e68f0070DMv", -- v6[m
[31m-  sxth_2 = "e6bf0070DM", sxth_3 = "e6bf0070DMv", -- v6[m
[31m-  uxtab_3 = "e6e00070DNM", uxtab_4 = "e6e00070DNMv", -- v6[m
[31m-  uxtab16_3 = "e6c00070DNM", uxtab16_4 = "e6c00070DNMv", -- v6[m
[31m-  uxtah_3 = "e6f00070DNM", uxtah_4 = "e6f00070DNMv", -- v6[m
[31m-  uxtb_2 = "e6ef0070DM", uxtb_3 = "e6ef0070DMv", -- v6[m
[31m-  uxtb16_2 = "e6cf0070DM", uxtb16_3 = "e6cf0070DMv", -- v6[m
[31m-  uxth_2 = "e6ff0070DM", uxth_3 = "e6ff0070DMv", -- v6[m
[31m-[m
[31m-  -- Saturating instructions.[m
[31m-  qadd_3 = "e1000050DMN",	-- v5TE[m
[31m-  qsub_3 = "e1200050DMN",	-- v5TE[m
[31m-  qdadd_3 = "e1400050DMN",	-- v5TE[m
[31m-  qdsub_3 = "e1600050DMN",	-- v5TE[m
[31m-  -- Note: the X for ssat* encodes sat_imm-1, not sat_imm.[m
[31m-  ssat_3 = "e6a00010DXM", ssat_4 = "e6a00010DXMp", -- v6[m
[31m-  usat_3 = "e6e00010DXM", usat_4 = "e6e00010DXMp", -- v6[m
[31m-  ssat16_3 = "e6a00f30DXM", -- v6[m
[31m-  usat16_3 = "e6e00f30DXM", -- v6[m
[31m-[m
[31m-  -- Parallel addition and subtraction.[m
[31m-  sadd16_3 = "e6100f10DNM", -- v6[m
[31m-  sasx_3 = "e6100f30DNM", -- v6[m
[31m-  ssax_3 = "e6100f50DNM", -- v6[m
[31m-  ssub16_3 = "e6100f70DNM", -- v6[m
[31m-  sadd8_3 = "e6100f90DNM", -- v6[m
[31m-  ssub8_3 = "e6100ff0DNM", -- v6[m
[31m-  qadd16_3 = "e6200f10DNM", -- v6[m
[31m-  qasx_3 = "e6200f30DNM", -- v6[m
[31m-  qsax_3 = "e6200f50DNM", -- v6[m
[31m-  qsub16_3 = "e6200f70DNM", -- v6[m
[31m-  qadd8_3 = "e6200f90DNM", -- v6[m
[31m-  qsub8_3 = "e6200ff0DNM", -- v6[m
[31m-  shadd16_3 = "e6300f10DNM", -- v6[m
[31m-  shasx_3 = "e6300f30DNM", -- v6[m
[31m-  shsax_3 = "e6300f50DNM", -- v6[m
[31m-  shsub16_3 = "e6300f70DNM", -- v6[m
[31m-  shadd8_3 = "e6300f90DNM", -- v6[m
[31m-  shsub8_3 = "e6300ff0DNM", -- v6[m
[31m-  uadd16_3 = "e6500f10DNM", -- v6[m
[31m-  uasx_3 = "e6500f30DNM", -- v6[m
[31m-  usax_3 = "e6500f50DNM", -- v6[m
[31m-  usub16_3 = "e6500f70DNM", -- v6[m
[31m-  uadd8_3 = "e6500f90DNM", -- v6[m
[31m-  usub8_3 = "e6500ff0DNM", -- v6[m
[31m-  uqadd16_3 = "e6600f10DNM", -- v6[m
[31m-  uqasx_3 = "e6600f30DNM", -- v6[m
[31m-  uqsax_3 = "e6600f50DNM", -- v6[m
[31m-  uqsub16_3 = "e6600f70DNM", -- v6[m
[31m-  uqadd8_3 = "e6600f90DNM", -- v6[m
[31m-  uqsub8_3 = "e6600ff0DNM", -- v6[m
[31m-  uhadd16_3 = "e6700f10DNM", -- v6[m
[31m-  uhasx_3 = "e6700f30DNM", -- v6[m
[31m-  uhsax_3 = "e6700f50DNM", -- v6[m
[31m-  uhsub16_3 = "e6700f70DNM", -- v6[m
[31m-  uhadd8_3 = "e6700f90DNM", -- v6[m
[31m-  uhsub8_3 = "e6700ff0DNM", -- v6[m
[31m-[m
[31m-  -- Load/store instructions.[m
[31m-  str_2 = "e4000000DL", str_3 = "e4000000DL", str_4 = "e4000000DL",[m
[31m-  strb_2 = "e4400000DL", strb_3 = "e4400000DL", strb_4 = "e4400000DL",[m
[31m-  ldr_2 = "e4100000DL", ldr_3 = "e4100000DL", ldr_4 = "e4100000DL",[m
[31m-  ldrb_2 = "e4500000DL", ldrb_3 = "e4500000DL", ldrb_4 = "e4500000DL",[m
[31m-  strh_2 = "e00000b0DL", strh_3 = "e00000b0DL",[m
[31m-  ldrh_2 = "e01000b0DL", ldrh_3 = "e01000b0DL",[m
[31m-  ldrd_2 = "e00000d0DL", ldrd_3 = "e00000d0DL", -- v5TE[m
[31m-  ldrsb_2 = "e01000d0DL", ldrsb_3 = "e01000d0DL",[m
[31m-  strd_2 = "e00000f0DL", strd_3 = "e00000f0DL", -- v5TE[m
[31m-  ldrsh_2 = "e01000f0DL", ldrsh_3 = "e01000f0DL",[m
[31m-[m
[31m-  ldm_2 = "e8900000oR", ldmia_2 = "e8900000oR", ldmfd_2 = "e8900000oR",[m
[31m-  ldmda_2 = "e8100000oR", ldmfa_2 = "e8100000oR",[m
[31m-  ldmdb_2 = "e9100000oR", ldmea_2 = "e9100000oR",[m
[31m-  ldmib_2 = "e9900000oR", ldmed_2 = "e9900000oR",[m
[31m-  stm_2 = "e8800000oR", stmia_2 = "e8800000oR", stmfd_2 = "e8800000oR",[m
[31m-  stmda_2 = "e8000000oR", stmfa_2 = "e8000000oR",[m
[31m-  stmdb_2 = "e9000000oR", stmea_2 = "e9000000oR",[m
[31m-  stmib_2 = "e9800000oR", stmed_2 = "e9800000oR",[m
[31m-  pop_1 = "e8bd0000R", push_1 = "e92d0000R",[m
[31m-[m
[31m-  -- Branch instructions.[m
[31m-  b_1 = "ea000000B",[m
[31m-  bl_1 = "eb000000B",[m
[31m-  blx_1 = "e12fff30C",[m
[31m-  bx_1 = "e12fff10M",[m
[31m-[m
[31m-  -- Miscellaneous instructions.[m
[31m-  nop_0 = "e1a00000",[m
[31m-  mrs_1 = "e10f0000D",[m
[31m-  bkpt_1 = "e1200070K", -- v5T[m
[31m-  svc_1 = "ef000000T", swi_1 = "ef000000T",[m
[31m-  ud_0 = "e7f001f0",[m
[31m-[m
[31m-  -- VFP instructions.[m
[31m-  ["vadd.f32_3"] = "ee300a00dnm",[m
[31m-  ["vadd.f64_3"] = "ee300b00Gdnm",[m
[31m-  ["vsub.f32_3"] = "ee300a40dnm",[m
[31m-  ["vsub.f64_3"] = "ee300b40Gdnm",[m
[31m-  ["vmul.f32_3"] = "ee200a00dnm",[m
[31m-  ["vmul.f64_3"] = "ee200b00Gdnm",[m
[31m-  ["vnmul.f32_3"] = "ee200a40dnm",[m
[31m-  ["vnmul.f64_3"] = "ee200b40Gdnm",[m
[31m-  ["vmla.f32_3"] = "ee000a00dnm",[m
[31m-  ["vmla.f64_3"] = "ee000b00Gdnm",[m
[31m-  ["vmls.f32_3"] = "ee000a40dnm",[m
[31m-  ["vmls.f64_3"] = "ee000b40Gdnm",[m
[31m-  ["vnmla.f32_3"] = "ee100a40dnm",[m
[31m-  ["vnmla.f64_3"] = "ee100b40Gdnm",[m
[31m-  ["vnmls.f32_3"] = "ee100a00dnm",[m
[31m-  ["vnmls.f64_3"] = "ee100b00Gdnm",[m
[31m-  ["vdiv.f32_3"] = "ee800a00dnm",[m
[31m-  ["vdiv.f64_3"] = "ee800b00Gdnm",[m
[31m-[m
[31m-  ["vabs.f32_2"] = "eeb00ac0dm",[m
[31m-  ["vabs.f64_2"] = "eeb00bc0Gdm",[m
[31m-  ["vneg.f32_2"] = "eeb10a40dm",[m
[31m-  ["vneg.f64_2"] = "eeb10b40Gdm",[m
[31m-  ["vsqrt.f32_2"] = "eeb10ac0dm",[m
[31m-  ["vsqrt.f64_2"] = "eeb10bc0Gdm",[m
[31m-  ["vcmp.f32_2"] = "eeb40a40dm",[m
[31m-  ["vcmp.f64_2"] = "eeb40b40Gdm",[m
[31m-  ["vcmpe.f32_2"] = "eeb40ac0dm",[m
[31m-  ["vcmpe.f64_2"] = "eeb40bc0Gdm",[m
[31m-  ["vcmpz.f32_1"] = "eeb50a40d",[m
[31m-  ["vcmpz.f64_1"] = "eeb50b40Gd",[m
[31m-  ["vcmpze.f32_1"] = "eeb50ac0d",[m
[31m-  ["vcmpze.f64_1"] = "eeb50bc0Gd",[m
[31m-[m
[31m-  vldr_2 = "ed100a00dl|ed100b00Gdl",[m
[31m-  vstr_2 = "ed000a00dl|ed000b00Gdl",[m
[31m-  vldm_2 = "ec900a00or",[m
[31m-  vldmia_2 = "ec900a00or",[m
[31m-  vldmdb_2 = "ed100a00or",[m
[31m-  vpop_1 = "ecbd0a00r",[m
[31m-  vstm_2 = "ec800a00or",[m
[31m-  vstmia_2 = "ec800a00or",[m
[31m-  vstmdb_2 = "ed000a00or",[m
[31m-  vpush_1 = "ed2d0a00r",[m
[31m-[m
[31m-  ["vmov.f32_2"] = "eeb00a40dm|eeb00a00dY",	-- #imm is VFPv3 only[m
[31m-  ["vmov.f64_2"] = "eeb00b40Gdm|eeb00b00GdY",	-- #imm is VFPv3 only[m
[31m-  vmov_2 = "ee100a10Dn|ee000a10nD",[m
[31m-  vmov_3 = "ec500a10DNm|ec400a10mDN|ec500b10GDNm|ec400b10GmDN",[m
[31m-[m
[31m-  vmrs_0 = "eef1fa10",[m
[31m-  vmrs_1 = "eef10a10D",[m
[31m-  vmsr_1 = "eee10a10D",[m
[31m-[m
[31m-  ["vcvt.s32.f32_2"] = "eebd0ac0dm",[m
[31m-  ["vcvt.s32.f64_2"] = "eebd0bc0dGm",[m
[31m-  ["vcvt.u32.f32_2"] = "eebc0ac0dm",[m
[31m-  ["vcvt.u32.f64_2"] = "eebc0bc0dGm",[m
[31m-  ["vcvtr.s32.f32_2"] = "eebd0a40dm",[m
[31m-  ["vcvtr.s32.f64_2"] = "eebd0b40dGm",[m
[31m-  ["vcvtr.u32.f32_2"] = "eebc0a40dm",[m
[31m-  ["vcvtr.u32.f64_2"] = "eebc0b40dGm",[m
[31m-  ["vcvt.f32.s32_2"] = "eeb80ac0dm",[m
[31m-  ["vcvt.f64.s32_2"] = "eeb80bc0GdFm",[m
[31m-  ["vcvt.f32.u32_2"] = "eeb80a40dm",[m
[31m-  ["vcvt.f64.u32_2"] = "eeb80b40GdFm",[m
[31m-  ["vcvt.f32.f64_2"] = "eeb70bc0dGm",[m
[31m-  ["vcvt.f64.f32_2"] = "eeb70ac0GdFm",[m
[31m-[m
[31m-  -- VFPv4 only:[m
[31m-  ["vfma.f32_3"] = "eea00a00dnm",[m
[31m-  ["vfma.f64_3"] = "eea00b00Gdnm",[m
[31m-  ["vfms.f32_3"] = "eea00a40dnm",[m
[31m-  ["vfms.f64_3"] = "eea00b40Gdnm",[m
[31m-  ["vfnma.f32_3"] = "ee900a40dnm",[m
[31m-  ["vfnma.f64_3"] = "ee900b40Gdnm",[m
[31m-  ["vfnms.f32_3"] = "ee900a00dnm",[m
[31m-  ["vfnms.f64_3"] = "ee900b00Gdnm",[m
[31m-[m
[31m-  -- NYI: Advanced SIMD instructions.[m
[31m-[m
[31m-  -- NYI: I have no need for these instructions right now:[m
[31m-  -- swp, swpb, strex, ldrex, strexd, ldrexd, strexb, ldrexb, strexh, ldrexh[m
[31m-  -- msr, nopv6, yield, wfe, wfi, sev, dbg, bxj, smc, srs, rfe[m
[31m-  -- cps, setend, pli, pld, pldw, clrex, dsb, dmb, isb[m
[31m-  -- stc, ldc, mcr, mcr2, mrc, mrc2, mcrr, mcrr2, mrrc, mrrc2, cdp, cdp2[m
[31m-}[m
[31m-[m
[31m--- Add mnemonics for "s" variants.[m
[31m-do[m
[31m-  local t = {}[m
[31m-  for k,v in pairs(map_op) do[m
[31m-    if sub(v, -1) == "s" then[m
[31m-      local v2 = sub(v, 1, 2)..char(byte(v, 3)+1)..sub(v, 4, -2)[m
[31m-      t[sub(k, 1, -3).."s"..sub(k, -2)] = v2[m
[31m-    end[m
[31m-  end[m
[31m-  for k,v in pairs(t) do[m
[31m-    map_op[k] = v[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function parse_gpr(expr)[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(r1?[0-9])$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    if not reg then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    expr = reg[m
[31m-  end[m
[31m-  local r = match(expr, "^r(1?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 15 then return r, tp end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_gpr_pm(expr)[m
[31m-  local pm, expr2 = match(expr, "^([+-]?)(.*)$")[m
[31m-  return parse_gpr(expr2), (pm == "-")[m
[31m-end[m
[31m-[m
[31m-local function parse_vr(expr, tp)[m
[31m-  local t, r = match(expr, "^([sd])([0-9]+)$")[m
[31m-  if t == tp then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then[m
[31m-      if t == "s" then return shr(r, 1), band(r, 1) end[m
[31m-      return band(r, 15), shr(r, 4)[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_reglist(reglist)[m
[31m-  reglist = match(reglist, "^{%s*([^}]*)}$")[m
[31m-  if not reglist then werror("register list expected") end[m
[31m-  local rr = 0[m
[31m-  for p in gmatch(reglist..",", "%s*([^,]*),") do[m
[31m-    local rbit = shl(1, parse_gpr(gsub(p, "%s+$", "")))[m
[31m-    if band(rr, rbit) ~= 0 then[m
[31m-      werror("duplicate register `"..p.."'")[m
[31m-    end[m
[31m-    rr = rr + rbit[m
[31m-  end[m
[31m-  return rr[m
[31m-end[m
[31m-[m
[31m-local function parse_vrlist(reglist)[m
[31m-  local ta, ra, tb, rb = match(reglist,[m
[31m-			   "^{%s*([sd])([0-9]+)%s*%-%s*([sd])([0-9]+)%s*}$")[m
[31m-  ra, rb = tonumber(ra), tonumber(rb)[m
[31m-  if ta and ta == tb and ra and rb and ra <= 31 and rb <= 31 and ra <= rb then[m
[31m-    local nr = rb+1 - ra[m
[31m-    if ta == "s" then[m
[31m-      return shl(shr(ra,1),12)+shl(band(ra,1),22) + nr[m
[31m-    else[m
[31m-      return shl(band(ra,15),12)+shl(shr(ra,4),22) + nr*2 + 0x100[m
[31m-    end[m
[31m-  end[m
[31m-  werror("register list expected")[m
[31m-end[m
[31m-[m
[31m-local function parse_imm(imm, bits, shift, scale, signed)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n then[m
[31m-      if signed then[m
[31m-	local s = sar(m, bits-1)[m
[31m-	if s == 0 then return shl(m, shift)[m
[31m-	elseif s == -1 then return shl(m + shl(1, bits), shift) end[m
[31m-      else[m
[31m-	if sar(m, bits) == 0 then return shl(m, shift) end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm12(imm)[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    local m = band(n)[m
[31m-    for i=0,-15,-1 do[m
[31m-      if shr(m, 8) == 0 then return m + shl(band(i, 15), 8) end[m
[31m-      m = ror(m, 2)[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM12", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm16(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    if shr(n, 16) == 0 then return band(n, 0x0fff) + shl(band(n, 0xf000), 4) end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM16", 32*16, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm_load(imm, ext)[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    if ext then[m
[31m-      if n >= -255 and n <= 255 then[m
[31m-	local up = 0x00800000[m
[31m-	if n < 0 then n = -n; up = 0 end[m
[31m-	return shl(band(n, 0xf0), 4) + band(n, 0x0f) + up[m
[31m-      end[m
[31m-    else[m
[31m-      if n >= -4095 and n <= 4095 then[m
[31m-	if n >= 0 then return n+0x00800000 end[m
[31m-	return -n[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction(ext and "IMML8" or "IMML12", 32768 + shl(ext and 8 or 12, 5), imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_shift(shift, gprok)[m
[31m-  if shift == "rrx" then[m
[31m-    return 3 * 32[m
[31m-  else[m
[31m-    local s, s2 = match(shift, "^(%S+)%s*(.*)$")[m
[31m-    s = map_shift[s][m
[31m-    if not s then werror("expected shift operand") end[m
[31m-    if sub(s2, 1, 1) == "#" then[m
[31m-      return parse_imm(s2, 5, 7, 0, false) + shl(s, 5)[m
[31m-    else[m
[31m-      if not gprok then werror("expected immediate shift operand") end[m
[31m-      return shl(parse_gpr(s2), 8) + shl(s, 5) + 16[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_label(label, def)[m
[31m-  local prefix = sub(label, 1, 2)[m
[31m-  -- =>label (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "PC", 0, sub(label, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "LG", map_global[sub(label, 3)][m
[31m-  end[m
[31m-  if def then[m
[31m-    -- [1-9] (local label definition)[m
[31m-    if match(label, "^[1-9]$") then[m
[31m-      return "LG", 10+tonumber(label)[m
[31m-    end[m
[31m-  else[m
[31m-    -- [<>][1-9] (local label reference)[m
[31m-    local dir, lnum = match(label, "^([<>])([1-9])$")[m
[31m-    if dir then -- Fwd: 1-9, Bkwd: 11-19.[m
[31m-      return "LG", lnum + (dir == ">" and 0 or 10)[m
[31m-    end[m
[31m-    -- extern label (extern label reference)[m
[31m-    local extname = match(label, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      return "EXT", map_extern[extname][m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad label `"..label.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_load(params, nparams, n, op)[m
[31m-  local oplo = band(op, 255)[m
[31m-  local ext, ldrd = (oplo ~= 0), (oplo == 208)[m
[31m-  local d[m
[31m-  if (ldrd or oplo == 240) then[m
[31m-    d = band(shr(op, 12), 15)[m
[31m-    if band(d, 1) ~= 0 then werror("odd destination register") end[m
[31m-  end[m
[31m-  local pn = params[n][m
[31m-  local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$")[m
[31m-  local p2 = params[n+1][m
[31m-  if not p1 then[m
[31m-    if not p2 then[m
[31m-      if match(pn, "^[<>=%-]") or match(pn, "^extern%s+") then[m
[31m-	local mode, n, s = parse_label(pn, false)[m
[31m-	waction("REL_"..mode, n + (ext and 0x1800 or 0x0800), s, 1)[m
[31m-	return op + 15 * 65536 + 0x01000000 + (ext and 0x00400000 or 0)[m
[31m-      end[m
[31m-      local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$")[m
[31m-      if reg and tailr ~= "" then[m
[31m-	local d, tp = parse_gpr(reg)[m
[31m-	if tp then[m
[31m-	  waction(ext and "IMML8" or "IMML12", 32768 + 32*(ext and 8 or 12),[m
[31m-		  format(tp.ctypefmt, tailr))[m
[31m-	  return op + shl(d, 16) + 0x01000000 + (ext and 0x00400000 or 0)[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("expected address operand")[m
[31m-  end[m
[31m-  if wb == "!" then op = op + 0x00200000 end[m
[31m-  if p2 then[m
[31m-    if wb == "!" then werror("bad use of '!'") end[m
[31m-    local p3 = params[n+2][m
[31m-    op = op + shl(parse_gpr(p1), 16)[m
[31m-    local imm = match(p2, "^#(.*)$")[m
[31m-    if imm then[m
[31m-      local m = parse_imm_load(imm, ext)[m
[31m-      if p3 then werror("too many parameters") end[m
[31m-      op = op + m + (ext and 0x00400000 or 0)[m
[31m-    else[m
[31m-      local m, neg = parse_gpr_pm(p2)[m
[31m-      if ldrd and (m == d or m-1 == d) then werror("register conflict") end[m
[31m-      op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000)[m
[31m-      if p3 then op = op + parse_shift(p3) end[m
[31m-    end[m
[31m-  else[m
[31m-    local p1a, p2 = match(p1, "^([^,%s]*)%s*(.*)$")[m
[31m-    op = op + shl(parse_gpr(p1a), 16) + 0x01000000[m
[31m-    if p2 ~= "" then[m
[31m-      local imm = match(p2, "^,%s*#(.*)$")[m
[31m-      if imm then[m
[31m-	local m = parse_imm_load(imm, ext)[m
[31m-	op = op + m + (ext and 0x00400000 or 0)[m
[31m-      else[m
[31m-	local p2a, p3 = match(p2, "^,%s*([^,%s]*)%s*,?%s*(.*)$")[m
[31m-	local m, neg = parse_gpr_pm(p2a)[m
[31m-	if ldrd and (m == d or m-1 == d) then werror("register conflict") end[m
[31m-	op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000)[m
[31m-	if p3 ~= "" then[m
[31m-	  if ext then werror("too many parameters") end[m
[31m-	  op = op + parse_shift(p3)[m
[31m-	end[m
[31m-      end[m
[31m-    else[m
[31m-      if wb == "!" then werror("bad use of '!'") end[m
[31m-      op = op + (ext and 0x00c00000 or 0x00800000)[m
[31m-    end[m
[31m-  end[m
[31m-  return op[m
[31m-end[m
[31m-[m
[31m-local function parse_vload(q)[m
[31m-  local reg, imm = match(q, "^%[%s*([^,%s]*)%s*(.*)%]$")[m
[31m-  if reg then[m
[31m-    local d = shl(parse_gpr(reg), 16)[m
[31m-    if imm == "" then return d end[m
[31m-    imm = match(imm, "^,%s*#(.*)$")[m
[31m-    if imm then[m
[31m-      local n = tonumber(imm)[m
[31m-      if n then[m
[31m-	if n >= -1020 and n <= 1020 and n%4 == 0 then[m
[31m-	  return d + (n >= 0 and n/4+0x00800000 or -n/4)[m
[31m-	end[m
[31m-	werror("out of range immediate `"..imm.."'")[m
[31m-      else[m
[31m-	waction("IMMV8", 32768 + 32*8, imm)[m
[31m-	return d[m
[31m-      end[m
[31m-    end[m
[31m-  else[m
[31m-    if match(q, "^[<>=%-]") or match(q, "^extern%s+") then[m
[31m-      local mode, n, s = parse_label(q, false)[m
[31m-      waction("REL_"..mode, n + 0x2800, s, 1)[m
[31m-      return 15 * 65536[m
[31m-    end[m
[31m-    local reg, tailr = match(q, "^([%w_:]+)%s*(.*)$")[m
[31m-    if reg and tailr ~= "" then[m
[31m-      local d, tp = parse_gpr(reg)[m
[31m-      if tp then[m
[31m-	waction("IMMV8", 32768 + 32*8, format(tp.ctypefmt, tailr))[m
[31m-	return shl(d, 16)[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("expected address operand")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-local function parse_template(params, template, nparams, pos)[m
[31m-  local op = tonumber(sub(template, 1, 8), 16)[m
[31m-  local n = 1[m
[31m-  local vr = "s"[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for p in gmatch(sub(template, 9), ".") do[m
[31m-    local q = params[n][m
[31m-    if p == "D" then[m
[31m-      op = op + shl(parse_gpr(q), 12); n = n + 1[m
[31m-    elseif p == "N" then[m
[31m-      op = op + shl(parse_gpr(q), 16); n = n + 1[m
[31m-    elseif p == "S" then[m
[31m-      op = op + shl(parse_gpr(q), 8); n = n + 1[m
[31m-    elseif p == "M" then[m
[31m-      op = op + parse_gpr(q); n = n + 1[m
[31m-    elseif p == "d" then[m
[31m-      local r,h = parse_vr(q, vr); op = op+shl(r,12)+shl(h,22); n = n + 1[m
[31m-    elseif p == "n" then[m
[31m-      local r,h = parse_vr(q, vr); op = op+shl(r,16)+shl(h,7); n = n + 1[m
[31m-    elseif p == "m" then[m
[31m-      local r,h = parse_vr(q, vr); op = op+r+shl(h,5); n = n + 1[m
[31m-    elseif p == "P" then[m
[31m-      local imm = match(q, "^#(.*)$")[m
[31m-      if imm then[m
[31m-	op = op + parse_imm12(imm) + 0x02000000[m
[31m-      else[m
[31m-	op = op + parse_gpr(q)[m
[31m-      end[m
[31m-      n = n + 1[m
[31m-    elseif p == "p" then[m
[31m-      op = op + parse_shift(q, true); n = n + 1[m
[31m-    elseif p == "L" then[m
[31m-      op = parse_load(params, nparams, n, op)[m
[31m-    elseif p == "l" then[m
[31m-      op = op + parse_vload(q)[m
[31m-    elseif p == "B" then[m
[31m-      local mode, n, s = parse_label(q, false)[m
[31m-      waction("REL_"..mode, n, s, 1)[m
[31m-    elseif p == "C" then -- blx gpr vs. blx label.[m
[31m-      if match(q, "^([%w_]+):(r1?[0-9])$") or match(q, "^r(1?[0-9])$") then[m
[31m-	op = op + parse_gpr(q)[m
[31m-      else[m
[31m-	if op < 0xe0000000 then werror("unconditional instruction") end[m
[31m-	local mode, n, s = parse_label(q, false)[m
[31m-	waction("REL_"..mode, n, s, 1)[m
[31m-	op = 0xfa000000[m
[31m-      end[m
[31m-    elseif p == "F" then[m
[31m-      vr = "s"[m
[31m-    elseif p == "G" then[m
[31m-      vr = "d"[m
[31m-    elseif p == "o" then[m
[31m-      local r, wb = match(q, "^([^!]*)(!?)$")[m
[31m-      op = op + shl(parse_gpr(r), 16) + (wb == "!" and 0x00200000 or 0)[m
[31m-      n = n + 1[m
[31m-    elseif p == "R" then[m
[31m-      op = op + parse_reglist(q); n = n + 1[m
[31m-    elseif p == "r" then[m
[31m-      op = op + parse_vrlist(q); n = n + 1[m
[31m-    elseif p == "W" then[m
[31m-      op = op + parse_imm16(q); n = n + 1[m
[31m-    elseif p == "v" then[m
[31m-      op = op + parse_imm(q, 5, 7, 0, false); n = n + 1[m
[31m-    elseif p == "w" then[m
[31m-      local imm = match(q, "^#(.*)$")[m
[31m-      if imm then[m
[31m-	op = op + parse_imm(q, 5, 7, 0, false); n = n + 1[m
[31m-      else[m
[31m-	op = op + shl(parse_gpr(q), 8) + 16[m
[31m-      end[m
[31m-    elseif p == "X" then[m
[31m-      op = op + parse_imm(q, 5, 16, 0, false); n = n + 1[m
[31m-    elseif p == "Y" then[m
[31m-      local imm = tonumber(match(q, "^#(.*)$")); n = n + 1[m
[31m-      if not imm or shr(imm, 8) ~= 0 then[m
[31m-	werror("bad immediate operand")[m
[31m-      end[m
[31m-      op = op + shl(band(imm, 0xf0), 12) + band(imm, 0x0f)[m
[31m-    elseif p == "K" then[m
[31m-      local imm = tonumber(match(q, "^#(.*)$")); n = n + 1[m
[31m-      if not imm or shr(imm, 16) ~= 0 then[m
[31m-	werror("bad immediate operand")[m
[31m-      end[m
[31m-      op = op + shl(band(imm, 0xfff0), 4) + band(imm, 0x000f)[m
[31m-    elseif p == "T" then[m
[31m-      op = op + parse_imm(q, 24, 0, 0, false); n = n + 1[m
[31m-    elseif p == "s" then[m
[31m-      -- Ignored.[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-  end[m
[31m-  wputpos(pos, op)[m
[31m-end[m
[31m-[m
[31m-map_op[".template__"] = function(params, template, nparams)[m
[31m-  if not params then return template:gsub("%x%x%x%x%x%x%x%x", "") end[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 3 positions.[m
[31m-  if secpos+3 > maxsecpos then wflush() end[m
[31m-  local pos = wpos()[m
[31m-  local lpos, apos, spos = #actlist, #actargs, secpos[m
[31m-[m
[31m-  local ok, err[m
[31m-  for t in gmatch(template, "[^|]+") do[m
[31m-    ok, err = pcall(parse_template, params, t, nparams, pos)[m
[31m-    if ok then return end[m
[31m-    secpos = spos[m
[31m-    actlist[lpos+1] = nil[m
[31m-    actlist[lpos+2] = nil[m
[31m-    actlist[lpos+3] = nil[m
[31m-    actargs[apos+1] = nil[m
[31m-    actargs[apos+2] = nil[m
[31m-    actargs[apos+3] = nil[m
[31m-  end[m
[31m-  error(err, 0)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_1"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local mode, n, s = parse_label(params[1], true)[m
[31m-  if mode == "EXT" then werror("bad label definition") end[m
[31m-  waction("LABEL_"..mode, n, s, 1)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-map_op[".long_*"] = function(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local n = tonumber(p)[m
[31m-    if not n then werror("bad immediate `"..p.."'") end[m
[31m-    if n < 0 then n = n + 2^32 end[m
[31m-    wputw(n)[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1])[m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION", num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = function(t, k)[m
[31m-    local v = map_coreop[k][m
[31m-    if v then return v end[m
[31m-    local k1, cc, k2 = match(k, "^(.-)(..)([._].*)$")[m
[31m-    local cv = map_cond[cc][m
[31m-    if cv then[m
[31m-      local v = rawget(t, k1..k2)[m
[31m-      if type(v) == "string" then[m
[31m-	local scv = format("%x", cv)[m
[31m-	return gsub(scv..sub(v, 2), "|e", "|"..scv)[m
[31m-      end[m
[31m-    end[m
[31m-  end })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm64.h[m
[1mdeleted file mode 100644[m
[1mindex d64e60a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm64.h[m
[1m+++ /dev/null[m
[36m@@ -1,518 +0,0 @@[m
[31m-/*[m
[31m-** DynASM ARM64 encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"arm64"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. */[m
[31m-enum {[m
[31m-  DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT,[m
[31m-  /* The following actions need a buffer position. */[m
[31m-  DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,[m
[31m-  /* The following actions also have an argument. */[m
[31m-  DASM_REL_PC, DASM_LABEL_PC,[m
[31m-  DASM_IMM, DASM_IMM6, DASM_IMM12, DASM_IMM13W, DASM_IMM13X, DASM_IMML,[m
[31m-  DASM__MAX[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_REL	0x15000000[m
[31m-#define DASM_S_UNDEF_LG		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned int *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-static int dasm_imm12(unsigned int n)[m
[31m-{[m
[31m-  if ((n >> 12) == 0)[m
[31m-    return n;[m
[31m-  else if ((n & 0xff000fff) == 0)[m
[31m-    return (n >> 12) | 0x1000;[m
[31m-  else[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-static int dasm_ffs(unsigned long long x)[m
[31m-{[m
[31m-  int n = -1;[m
[31m-  while (x) { x >>= 1; n++; }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-static int dasm_imm13(int lo, int hi)[m
[31m-{[m
[31m-  int inv = 0, w = 64, s = 0xfff, xa, xb;[m
[31m-  unsigned long long n = (((unsigned long long)hi) << 32) | (unsigned int)lo;[m
[31m-  unsigned long long m = 1ULL, a, b, c;[m
[31m-  if (n & 1) { n = ~n; inv = 1; }[m
[31m-  a = n & -n; b = (n+a)&-(n+a); c = (n+a-b)&-(n+a-b);[m
[31m-  xa = dasm_ffs(a); xb = dasm_ffs(b);[m
[31m-  if (c) {[m
[31m-    w = dasm_ffs(c) - xa;[m
[31m-    if (w == 32) m = 0x0000000100000001UL;[m
[31m-    else if (w == 16) m = 0x0001000100010001UL;[m
[31m-    else if (w == 8) m = 0x0101010101010101UL;[m
[31m-    else if (w == 4) m = 0x1111111111111111UL;[m
[31m-    else if (w == 2) m = 0x5555555555555555UL;[m
[31m-    else return -1;[m
[31m-    s = (-2*w & 0x3f) - 1;[m
[31m-  } else if (!a) {[m
[31m-    return -1;[m
[31m-  } else if (xb == -1) {[m
[31m-    xb = 64;[m
[31m-  }[m
[31m-  if ((b-a) * m != n) return -1;[m
[31m-  if (inv) {[m
[31m-    return ((w - xb) << 6) | (s+w+xa-xb);[m
[31m-  } else {[m
[31m-    return ((w - xa) << 6) | (s+xb-xa);[m
[31m-  }[m
[31m-  return -1;[m
[31m-}[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    unsigned int ins = *p++;[m
[31m-    unsigned int action = (ins >> 16);[m
[31m-    if (action >= DASM__MAX) {[m
[31m-      ofs += 4;[m
[31m-    } else {[m
[31m-      int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0;[m
[31m-      switch (action) {[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      case DASM_SECTION:[m
[31m-	n = (ins & 255); CK(n < D->maxsection, RANGE_SEC);[m
[31m-	D->section = &D->sections[n]; goto stop;[m
[31m-      case DASM_ESC: p++; ofs += 4; break;[m
[31m-      case DASM_REL_EXT: break;[m
[31m-      case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break;[m
[31m-      case DASM_REL_LG:[m
[31m-	n = (ins & 2047) - 10; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl += 10; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG:[m
[31m-	pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos;[m
[31m-	}[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_IMM:[m
[31m-	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);[m
[31m-	n >>= ((ins>>10)&31);[m
[31m-#ifdef DASM_CHECKS[m
[31m-	if ((ins & 0x8000))[m
[31m-	  CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-	else[m
[31m-	  CK((n>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM6:[m
[31m-	CK((n >> 6) == 0, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM12:[m
[31m-	CK(dasm_imm12((unsigned int)n) != -1, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM13W:[m
[31m-	CK(dasm_imm13(n, n) != -1, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM13X: {[m
[31m-	int m = va_arg(ap, int);[m
[31m-	CK(dasm_imm13(n, m) != -1, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	b[pos++] = m;[m
[31m-	break;[m
[31m-	}[m
[31m-      case DASM_IMML: {[m
[31m-#ifdef DASM_CHECKS[m
[31m-	int scale = (p[-2] >> 30);[m
[31m-	CK((!(n & ((1<<scale)-1)) && (unsigned int)(n>>scale) < 4096) ||[m
[31m-	   (unsigned int)(n+256) < 512, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_REL_EXT: break;[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;[m
[31m-	case DASM_REL_LG: case DASM_REL_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;[m
[31m-	case DASM_IMM: case DASM_IMM6: case DASM_IMM12: case DASM_IMM13W:[m
[31m-	case DASM_IMML: pos++; break;[m
[31m-	case DASM_IMM13X: pos += 2; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  char *base = (char *)buffer;[m
[31m-  unsigned int *cp = (unsigned int *)buffer;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: *cp++ = *p++; break;[m
[31m-	case DASM_REL_EXT:[m
[31m-	  n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins&2047), !(ins&2048));[m
[31m-	  goto patchrel;[m
[31m-	case DASM_ALIGN:[m
[31m-	  ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000;[m
[31m-	  break;[m
[31m-	case DASM_REL_LG:[m
[31m-	  CK(n >= 0, UNDEF_LG);[m
[31m-	case DASM_REL_PC:[m
[31m-	  CK(n >= 0, UNDEF_PC);[m
[31m-	  n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) + 4;[m
[31m-	patchrel:[m
[31m-	  if (!(ins & 0xf800)) {  /* B, BL */[m
[31m-	    CK((n & 3) == 0 && ((n+0x08000000) >> 28) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n >> 2) & 0x03ffffff);[m
[31m-	  } else if ((ins & 0x800)) {  /* B.cond, CBZ, CBNZ, LDR* literal */[m
[31m-	    CK((n & 3) == 0 && ((n+0x00100000) >> 21) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n << 3) & 0x00ffffe0);[m
[31m-	  } else if ((ins & 0x3000) == 0x2000) {  /* ADR */[m
[31m-	    CK(((n+0x00100000) >> 21) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n << 3) & 0x00ffffe0) | ((n & 3) << 29);[m
[31m-	  } else if ((ins & 0x3000) == 0x3000) {  /* ADRP */[m
[31m-	    cp[-1] |= ((n >> 9) & 0x00ffffe0) | (((n >> 12) & 3) << 29);[m
[31m-	  } else if ((ins & 0x1000)) {  /* TBZ, TBNZ */[m
[31m-	    CK((n & 3) == 0 && ((n+0x00008000) >> 16) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n << 3) & 0x0007ffe0);[m
[31m-	  }[m
[31m-	  break;[m
[31m-	case DASM_LABEL_LG:[m
[31m-	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);[m
[31m-	  break;[m
[31m-	case DASM_LABEL_PC: break;[m
[31m-	case DASM_IMM:[m
[31m-	  cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31);[m
[31m-	  break;[m
[31m-	case DASM_IMM6:[m
[31m-	  cp[-1] |= ((n&31) << 19) | ((n&32) << 26);[m
[31m-	  break;[m
[31m-	case DASM_IMM12:[m
[31m-	  cp[-1] |= (dasm_imm12((unsigned int)n) << 10);[m
[31m-	  break;[m
[31m-	case DASM_IMM13W:[m
[31m-	  cp[-1] |= (dasm_imm13(n, n) << 10);[m
[31m-	  break;[m
[31m-	case DASM_IMM13X:[m
[31m-	  cp[-1] |= (dasm_imm13(n, *b++) << 10);[m
[31m-	  break;[m
[31m-	case DASM_IMML: {[m
[31m-	  int scale = (p[-2] >> 30);[m
[31m-	  cp[-1] |= (!(n & ((1<<scale)-1)) && (unsigned int)(n>>scale) < 4096) ?[m
[31m-	    ((n << (10-scale)) | 0x01000000) : ((n & 511) << 12);[m
[31m-	  break;[m
[31m-	  }[m
[31m-	default: *cp++ = ins; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != (char *)cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm64.lua[m
[1mdeleted file mode 100644[m
[1mindex 4a7d8df..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_arm64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1166 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM ARM64 module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	"arm",[m
[31m-  description =	"DynASM ARM64 module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, setmetatable, rawget = assert, setmetatable, rawget[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local match, gmatch, gsub = _s.match, _s.gmatch, _s.gsub[m
[31m-local concat, sort, insert = table.concat, table.sort, table.insert[m
[31m-local bit = bit or require("bit")[m
[31m-local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift[m
[31m-local ror, tohex = bit.ror, bit.tohex[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  "STOP", "SECTION", "ESC", "REL_EXT",[m
[31m-  "ALIGN", "REL_LG", "LABEL_LG",[m
[31m-  "REL_PC", "LABEL_PC", "IMM", "IMM6", "IMM12", "IMM13W", "IMM13X", "IMML",[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number.[m
[31m-local map_action = {}[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  map_action[name] = n-1[m
[31m-end[m
[31m-[m
[31m--- Action list buffer.[m
[31m-local actlist = {}[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  if nn == 0 then nn = 1; actlist[0] = map_action.STOP end[m
[31m-  out:write("static const unsigned int ", name, "[", nn, "] = {\n")[m
[31m-  for i = 1,nn-1 do[m
[31m-    assert(out:write("0x", tohex(actlist[i]), ",\n"))[m
[31m-  end[m
[31m-  assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add word to action list.[m
[31m-local function wputxw(n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, val, a, num)[m
[31m-  local w = assert(map_action[action], "bad action name `"..action.."'")[m
[31m-  wputxw(w * 0x10000 + (val or 0))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  if #actlist == actargs[1] then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped word.[m
[31m-local function wputw(n)[m
[31m-  if n <= 0x000fffff then waction("ESC") end[m
[31m-  wputxw(n)[m
[31m-end[m
[31m-[m
[31m--- Reserve position for word.[m
[31m-local function wpos()[m
[31m-  local pos = #actlist+1[m
[31m-  actlist[pos] = ""[m
[31m-  return pos[m
[31m-end[m
[31m-[m
[31m--- Store word to reserved position.[m
[31m-local function wputpos(pos, n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  if n <= 0x000fffff then[m
[31m-    insert(actlist, pos+1, n)[m
[31m-    n = map_action.ESC * 0x10000[m
[31m-  end[m
[31m-  actlist[pos] = n[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 20[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 2047 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  ", prefix, t[i], ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = 0[m
[31m-local map_extern_ = {}[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n > 2047 then werror("too many extern labels") end[m
[31m-  next_extern = n + 1[m
[31m-  t[name] = n[m
[31m-  map_extern_[n] = name[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write(format("  %s\n", map_extern_[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write("  \"", map_extern_[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-[m
[31m--- Ext. register name -> int. name.[m
[31m-local map_archdef = { xzr = "@x31", wzr = "@w31", lr = "x30", }[m
[31m-[m
[31m--- Int. register name -> ext. name.[m
[31m-local map_reg_rev = { ["@x31"] = "xzr", ["@w31"] = "wzr", x30 = "lr", }[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for Dt... macros).[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  return map_reg_rev[s] or s[m
[31m-end[m
[31m-[m
[31m-local map_shift = { lsl = 0, lsr = 1, asr = 2, }[m
[31m-[m
[31m-local map_extend = {[m
[31m-  uxtb = 0, uxth = 1, uxtw = 2, uxtx = 3,[m
[31m-  sxtb = 4, sxth = 5, sxtw = 6, sxtx = 7,[m
[31m-}[m
[31m-[m
[31m-local map_cond = {[m
[31m-  eq = 0, ne = 1, cs = 2, cc = 3, mi = 4, pl = 5, vs = 6, vc = 7,[m
[31m-  hi = 8, ls = 9, ge = 10, lt = 11, gt = 12, le = 13, al = 14,[m
[31m-  hs = 2, lo = 3,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local parse_reg_type[m
[31m-[m
[31m-local function parse_reg(expr)[m
[31m-  if not expr then werror("expected register name") end[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(@?%l%d+)$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    if not reg then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    expr = reg[m
[31m-  end[m
[31m-  local ok31, rt, r = match(expr, "^(@?)([xwqdshb])([123]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 30 or (r == 31 and ok31 ~= "" or (rt ~= "w" and rt ~= "x")) then[m
[31m-      if not parse_reg_type then[m
[31m-	parse_reg_type = rt[m
[31m-      elseif parse_reg_type ~= rt then[m
[31m-	werror("register size mismatch")[m
[31m-      end[m
[31m-      return r, tp[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_reg_base(expr)[m
[31m-  if expr == "sp" then return 0x3e0 end[m
[31m-  local base, tp = parse_reg(expr)[m
[31m-  if parse_reg_type ~= "x" then werror("bad register type") end[m
[31m-  parse_reg_type = false[m
[31m-  return shl(base, 5), tp[m
[31m-end[m
[31m-[m
[31m-local parse_ctx = {}[m
[31m-[m
[31m-local loadenv = setfenv and function(s)[m
[31m-  local code = loadstring(s, "")[m
[31m-  if code then setfenv(code, parse_ctx) end[m
[31m-  return code[m
[31m-end or function(s)[m
[31m-  return load(s, "", nil, parse_ctx)[m
[31m-end[m
[31m-[m
[31m--- Try to parse simple arithmetic, too, since some basic ops are aliases.[m
[31m-local function parse_number(n)[m
[31m-  local x = tonumber(n)[m
[31m-  if x then return x end[m
[31m-  local code = loadenv("return "..n)[m
[31m-  if code then[m
[31m-    local ok, y = pcall(code)[m
[31m-    if ok then return y end[m
[31m-  end[m
[31m-  return nil[m
[31m-end[m
[31m-[m
[31m-local function parse_imm(imm, bits, shift, scale, signed)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n then[m
[31m-      if signed then[m
[31m-	local s = sar(m, bits-1)[m
[31m-	if s == 0 then return shl(m, shift)[m
[31m-	elseif s == -1 then return shl(m + shl(1, bits), shift) end[m
[31m-      else[m
[31m-	if sar(m, bits) == 0 then return shl(m, shift) end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm12(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    if shr(n, 12) == 0 then[m
[31m-      return shl(n, 10)[m
[31m-    elseif band(n, 0xff000fff) == 0 then[m
[31m-      return shr(n, 2) + 0x00400000[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM12", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm13(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  local r64 = parse_reg_type == "x"[m
[31m-  if n and n % 1 == 0 and n >= 0 and n <= 0xffffffff then[m
[31m-    local inv = false[m
[31m-    if band(n, 1) == 1 then n = bit.bnot(n); inv = true end[m
[31m-    local t = {}[m
[31m-    for i=1,32 do t[i] = band(n, 1); n = shr(n, 1) end[m
[31m-    local b = table.concat(t)[m
[31m-    b = b..(r64 and (inv and "1" or "0"):rep(32) or b)[m
[31m-    local p0, p1, p0a, p1a = b:match("^(0+)(1+)(0*)(1*)")[m
[31m-    if p0 then[m
[31m-      local w = p1a == "" and (r64 and 64 or 32) or #p1+#p0a[m
[31m-      if band(w, w-1) == 0 and b == b:sub(1, w):rep(64/w) then[m
[31m-	local s = band(-2*w, 0x3f) - 1[m
[31m-	if w == 64 then s = s + 0x1000 end[m
[31m-	if inv then[m
[31m-	  return shl(w-#p1-#p0, 16) + shl(s+w-#p1, 10)[m
[31m-	else[m
[31m-	  return shl(w-#p0, 16) + shl(s+#p1, 10)[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  elseif r64 then[m
[31m-    waction("IMM13X", 0, format("(unsigned int)(%s)", imm))[m
[31m-    actargs[#actargs+1] = format("(unsigned int)((unsigned long long)(%s)>>32)", imm)[m
[31m-    return 0[m
[31m-  else[m
[31m-    waction("IMM13W", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm6(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    if n >= 0 and n <= 63 then[m
[31m-      return shl(band(n, 0x1f), 19) + (n >= 32 and 0x80000000 or 0)[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM6", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm_load(imm, scale)[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n and m >= 0 and m < 0x1000 then[m
[31m-      return shl(m, 10) + 0x01000000 -- Scaled, unsigned 12 bit offset.[m
[31m-    elseif n >= -256 and n < 256 then[m
[31m-      return shl(band(n, 511), 12) -- Unscaled, signed 9 bit offset.[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMML", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_fpimm(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    local m, e = math.frexp(n)[m
[31m-    local s, e2 = 0, band(e-2, 7)[m
[31m-    if m < 0 then m = -m; s = 0x00100000 end[m
[31m-    m = m*32-16[m
[31m-    if m % 1 == 0 and m >= 0 and m <= 15 and sar(shl(e2, 29), 29)+2 == e then[m
[31m-      return s + shl(e2, 17) + shl(m, 13)[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    werror("NYI fpimm action")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_shift(expr)[m
[31m-  local s, s2 = match(expr, "^(%S+)%s*(.*)$")[m
[31m-  s = map_shift[s][m
[31m-  if not s then werror("expected shift operand") end[m
[31m-  return parse_imm(s2, 6, 10, 0, false) + shl(s, 22)[m
[31m-end[m
[31m-[m
[31m-local function parse_lslx16(expr)[m
[31m-  local n = match(expr, "^lsl%s*#(%d+)$")[m
[31m-  n = tonumber(n)[m
[31m-  if not n then werror("expected shift operand") end[m
[31m-  if band(n, parse_reg_type == "x" and 0xffffffcf or 0xffffffef) ~= 0 then[m
[31m-    werror("bad shift amount")[m
[31m-  end[m
[31m-  return shl(n, 17)[m
[31m-end[m
[31m-[m
[31m-local function parse_extend(expr)[m
[31m-  local s, s2 = match(expr, "^(%S+)%s*(.*)$")[m
[31m-  if s == "lsl" then[m
[31m-    s = parse_reg_type == "x" and 3 or 2[m
[31m-  else[m
[31m-    s = map_extend[s][m
[31m-  end[m
[31m-  if not s then werror("expected extend operand") end[m
[31m-  return (s2 == "" and 0 or parse_imm(s2, 3, 10, 0, false)) + shl(s, 13)[m
[31m-end[m
[31m-[m
[31m-local function parse_cond(expr, inv)[m
[31m-  local c = map_cond[expr][m
[31m-  if not c then werror("expected condition operand") end[m
[31m-  return shl(bit.bxor(c, inv), 12)[m
[31m-end[m
[31m-[m
[31m-local function parse_load(params, nparams, n, op)[m
[31m-  if params[n+2] then werror("too many operands") end[m
[31m-  local pn, p2 = params[n], params[n+1][m
[31m-  local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$")[m
[31m-  if not p1 then[m
[31m-    if not p2 then[m
[31m-      local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$")[m
[31m-      if reg and tailr ~= "" then[m
[31m-	local base, tp = parse_reg_base(reg)[m
[31m-	if tp then[m
[31m-	  waction("IMML", 0, format(tp.ctypefmt, tailr))[m
[31m-	  return op + base[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("expected address operand")[m
[31m-  end[m
[31m-  local scale = shr(op, 30)[m
[31m-  if p2 then[m
[31m-    if wb == "!" then werror("bad use of '!'") end[m
[31m-    op = op + parse_reg_base(p1) + parse_imm(p2, 9, 12, 0, true) + 0x400[m
[31m-  elseif wb == "!" then[m
[31m-    local p1a, p2a = match(p1, "^([^,%s]*)%s*,%s*(.*)$")[m
[31m-    if not p1a then werror("bad use of '!'") end[m
[31m-    op = op + parse_reg_base(p1a) + parse_imm(p2a, 9, 12, 0, true) + 0xc00[m
[31m-  else[m
[31m-    local p1a, p2a = match(p1, "^([^,%s]*)%s*(.*)$")[m
[31m-    op = op + parse_reg_base(p1a)[m
[31m-    if p2a ~= "" then[m
[31m-      local imm = match(p2a, "^,%s*#(.*)$")[m
[31m-      if imm then[m
[31m-	op = op + parse_imm_load(imm, scale)[m
[31m-      else[m
[31m-	local p2b, p3b, p3s = match(p2a, "^,%s*([^,%s]*)%s*,?%s*(%S*)%s*(.*)$")[m
[31m-	op = op + shl(parse_reg(p2b), 16) + 0x00200800[m
[31m-	if parse_reg_type ~= "x" and parse_reg_type ~= "w" then[m
[31m-	  werror("bad index register type")[m
[31m-	end[m
[31m-	if p3b == "" then[m
[31m-	  if parse_reg_type ~= "x" then werror("bad index register type") end[m
[31m-	  op = op + 0x6000[m
[31m-	else[m
[31m-	  if p3s == "" or p3s == "#0" then[m
[31m-	  elseif p3s == "#"..scale then[m
[31m-	    op = op + 0x1000[m
[31m-	  else[m
[31m-	    werror("bad scale")[m
[31m-	  end[m
[31m-	  if parse_reg_type == "x" then[m
[31m-	    if p3b == "lsl" and p3s ~= "" then op = op + 0x6000[m
[31m-	    elseif p3b == "sxtx" then op = op + 0xe000[m
[31m-	    else[m
[31m-	      werror("bad extend/shift specifier")[m
[31m-	    end[m
[31m-	  else[m
[31m-	    if p3b == "uxtw" then op = op + 0x4000[m
[31m-	    elseif p3b == "sxtw" then op = op + 0xc000[m
[31m-	    else[m
[31m-	      werror("bad extend/shift specifier")[m
[31m-	    end[m
[31m-	  end[m
[31m-	end[m
[31m-      end[m
[31m-    else[m
[31m-      if wb == "!" then werror("bad use of '!'") end[m
[31m-      op = op + 0x01000000[m
[31m-    end[m
[31m-  end[m
[31m-  return op[m
[31m-end[m
[31m-[m
[31m-local function parse_load_pair(params, nparams, n, op)[m
[31m-  if params[n+2] then werror("too many operands") end[m
[31m-  local pn, p2 = params[n], params[n+1][m
[31m-  local scale = shr(op, 30) == 0 and 2 or 3[m
[31m-  local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$")[m
[31m-  if not p1 then[m
[31m-    if not p2 then[m
[31m-      local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$")[m
[31m-      if reg and tailr ~= "" then[m
[31m-	local base, tp = parse_reg_base(reg)[m
[31m-	if tp then[m
[31m-	  waction("IMM", 32768+7*32+15+scale*1024, format(tp.ctypefmt, tailr))[m
[31m-	  return op + base + 0x01000000[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("expected address operand")[m
[31m-  end[m
[31m-  if p2 then[m
[31m-    if wb == "!" then werror("bad use of '!'") end[m
[31m-    op = op + 0x00800000[m
[31m-  else[m
[31m-    local p1a, p2a = match(p1, "^([^,%s]*)%s*,%s*(.*)$")[m
[31m-    if p1a then p1, p2 = p1a, p2a else p2 = "#0" end[m
[31m-    op = op + (wb == "!" and 0x01800000 or 0x01000000)[m
[31m-  end[m
[31m-  return op + parse_reg_base(p1) + parse_imm(p2, 7, 15, scale, true)[m
[31m-end[m
[31m-[m
[31m-local function parse_label(label, def)[m
[31m-  local prefix = sub(label, 1, 2)[m
[31m-  -- =>label (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "PC", 0, sub(label, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "LG", map_global[sub(label, 3)][m
[31m-  end[m
[31m-  if def then[m
[31m-    -- [1-9] (local label definition)[m
[31m-    if match(label, "^[1-9]$") then[m
[31m-      return "LG", 10+tonumber(label)[m
[31m-    end[m
[31m-  else[m
[31m-    -- [<>][1-9] (local label reference)[m
[31m-    local dir, lnum = match(label, "^([<>])([1-9])$")[m
[31m-    if dir then -- Fwd: 1-9, Bkwd: 11-19.[m
[31m-      return "LG", lnum + (dir == ">" and 0 or 10)[m
[31m-    end[m
[31m-    -- extern label (extern label reference)[m
[31m-    local extname = match(label, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      return "EXT", map_extern[extname][m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad label `"..label.."'")[m
[31m-end[m
[31m-[m
[31m-local function branch_type(op)[m
[31m-  if band(op, 0x7c000000) == 0x14000000 then return 0 -- B, BL[m
[31m-  elseif shr(op, 24) == 0x54 or band(op, 0x7e000000) == 0x34000000 or[m
[31m-	 band(op, 0x3b000000) == 0x18000000 then[m
[31m-    return 0x800 -- B.cond, CBZ, CBNZ, LDR* literal[m
[31m-  elseif band(op, 0x7e000000) == 0x36000000 then return 0x1000 -- TBZ, TBNZ[m
[31m-  elseif band(op, 0x9f000000) == 0x10000000 then return 0x2000 -- ADR[m
[31m-  elseif band(op, 0x9f000000) == band(0x90000000) then return 0x3000 -- ADRP[m
[31m-  else[m
[31m-    assert(false, "unknown branch type")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_op, op_template[m
[31m-[m
[31m-local function op_alias(opname, f)[m
[31m-  return function(params, nparams)[m
[31m-    if not params then return "-> "..opname:sub(1, -3) end[m
[31m-    f(params, nparams)[m
[31m-    op_template(params, map_op[opname], nparams)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function alias_bfx(p)[m
[31m-  p[4] = "#("..p[3]:sub(2)..")+("..p[4]:sub(2)..")-1"[m
[31m-end[m
[31m-[m
[31m-local function alias_bfiz(p)[m
[31m-  parse_reg(p[1])[m
[31m-  if parse_reg_type == "w" then[m
[31m-    p[3] = "#-("..p[3]:sub(2)..")%32"[m
[31m-    p[4] = "#("..p[4]:sub(2)..")-1"[m
[31m-  else[m
[31m-    p[3] = "#-("..p[3]:sub(2)..")%64"[m
[31m-    p[4] = "#("..p[4]:sub(2)..")-1"[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local alias_lslimm = op_alias("ubfm_4", function(p)[m
[31m-  parse_reg(p[1])[m
[31m-  local sh = p[3]:sub(2)[m
[31m-  if parse_reg_type == "w" then[m
[31m-    p[3] = "#-("..sh..")%32"[m
[31m-    p[4] = "#31-("..sh..")"[m
[31m-  else[m
[31m-    p[3] = "#-("..sh..")%64"[m
[31m-    p[4] = "#63-("..sh..")"[m
[31m-  end[m
[31m-end)[m
[31m-[m
[31m--- Template strings for ARM instructions.[m
[31m-map_op = {[m
[31m-  -- Basic data processing instructions.[m
[31m-  add_3  = "0b000000DNMg|11000000pDpNIg|8b206000pDpNMx",[m
[31m-  add_4  = "0b000000DNMSg|0b200000DNMXg|8b200000pDpNMXx|8b200000pDpNxMwX",[m
[31m-  adds_3 = "2b000000DNMg|31000000DpNIg|ab206000DpNMx",[m
[31m-  adds_4 = "2b000000DNMSg|2b200000DNMXg|ab200000DpNMXx|ab200000DpNxMwX",[m
[31m-  cmn_2  = "2b00001fNMg|3100001fpNIg|ab20601fpNMx",[m
[31m-  cmn_3  = "2b00001fNMSg|2b20001fNMXg|ab20001fpNMXx|ab20001fpNxMwX",[m
[31m-[m
[31m-  sub_3  = "4b000000DNMg|51000000pDpNIg|cb206000pDpNMx",[m
[31m-  sub_4  = "4b000000DNMSg|4b200000DNMXg|cb200000pDpNMXx|cb200000pDpNxMwX",[m
[31m-  subs_3 = "6b000000DNMg|71000000DpNIg|eb206000DpNMx",[m
[31m-  subs_4 = "6b000000DNMSg|6b200000DNMXg|eb200000DpNMXx|eb200000DpNxMwX",[m
[31m-  cmp_2  = "6b00001fNMg|7100001fpNIg|eb20601fpNMx",[m
[31m-  cmp_3  = "6b00001fNMSg|6b20001fNMXg|eb20001fpNMXx|eb20001fpNxMwX",[m
[31m-[m
[31m-  neg_2  = "4b0003e0DMg",[m
[31m-  neg_3  = "4b0003e0DMSg",[m
[31m-  negs_2 = "6b0003e0DMg",[m
[31m-  negs_3 = "6b0003e0DMSg",[m
[31m-[m
[31m-  adc_3  = "1a000000DNMg",[m
[31m-  adcs_3 = "3a000000DNMg",[m
[31m-  sbc_3  = "5a000000DNMg",[m
[31m-  sbcs_3 = "7a000000DNMg",[m
[31m-  ngc_2  = "5a0003e0DMg",[m
[31m-  ngcs_2 = "7a0003e0DMg",[m
[31m-[m
[31m-  and_3  = "0a000000DNMg|12000000pDNig",[m
[31m-  and_4  = "0a000000DNMSg",[m
[31m-  orr_3  = "2a000000DNMg|32000000pDNig",[m
[31m-  orr_4  = "2a000000DNMSg",[m
[31m-  eor_3  = "4a000000DNMg|52000000pDNig",[m
[31m-  eor_4  = "4a000000DNMSg",[m
[31m-  ands_3 = "6a000000DNMg|72000000DNig",[m
[31m-  ands_4 = "6a000000DNMSg",[m
[31m-  tst_2  = "6a00001fNMg|7200001fNig",[m
[31m-  tst_3  = "6a00001fNMSg",[m
[31m-[m
[31m-  bic_3  = "0a200000DNMg",[m
[31m-  bic_4  = "0a200000DNMSg",[m
[31m-  orn_3  = "2a200000DNMg",[m
[31m-  orn_4  = "2a200000DNMSg",[m
[31m-  eon_3  = "4a200000DNMg",[m
[31m-  eon_4  = "4a200000DNMSg",[m
[31m-  bics_3 = "6a200000DNMg",[m
[31m-  bics_4 = "6a200000DNMSg",[m
[31m-[m
[31m-  movn_2 = "12800000DWg",[m
[31m-  movn_3 = "12800000DWRg",[m
[31m-  movz_2 = "52800000DWg",[m
[31m-  movz_3 = "52800000DWRg",[m
[31m-  movk_2 = "72800000DWg",[m
[31m-  movk_3 = "72800000DWRg",[m
[31m-[m
[31m-  -- TODO: this doesn't cover all valid immediates for mov reg, #imm.[m
[31m-  mov_2  = "2a0003e0DMg|52800000DW|320003e0pDig|11000000pDpNg",[m
[31m-  mov_3  = "2a0003e0DMSg",[m
[31m-  mvn_2  = "2a2003e0DMg",[m
[31m-  mvn_3  = "2a2003e0DMSg",[m
[31m-[m
[31m-  adr_2  = "10000000DBx",[m
[31m-  adrp_2 = "90000000DBx",[m
[31m-[m
[31m-  csel_4  = "1a800000DNMCg",[m
[31m-  csinc_4 = "1a800400DNMCg",[m
[31m-  csinv_4 = "5a800000DNMCg",[m
[31m-  csneg_4 = "5a800400DNMCg",[m
[31m-  cset_2  = "1a9f07e0Dcg",[m
[31m-  csetm_2 = "5a9f03e0Dcg",[m
[31m-  cinc_3  = "1a800400DNmcg",[m
[31m-  cinv_3  = "5a800000DNmcg",[m
[31m-  cneg_3  = "5a800400DNmcg",[m
[31m-[m
[31m-  ccmn_4 = "3a400000NMVCg|3a400800N5VCg",[m
[31m-  ccmp_4 = "7a400000NMVCg|7a400800N5VCg",[m
[31m-[m
[31m-  madd_4 = "1b000000DNMAg",[m
[31m-  msub_4 = "1b008000DNMAg",[m
[31m-  mul_3  = "1b007c00DNMg",[m
[31m-  mneg_3 = "1b00fc00DNMg",[m
[31m-[m
[31m-  smaddl_4 = "9b200000DxNMwAx",[m
[31m-  smsubl_4 = "9b208000DxNMwAx",[m
[31m-  smull_3  = "9b207c00DxNMw",[m
[31m-  smnegl_3 = "9b20fc00DxNMw",[m
[31m-  smulh_3  = "9b407c00DNMx",[m
[31m-  umaddl_4 = "9ba00000DxNMwAx",[m
[31m-  umsubl_4 = "9ba08000DxNMwAx",[m
[31m-  umull_3  = "9ba07c00DxNMw",[m
[31m-  umnegl_3 = "9ba0fc00DxNMw",[m
[31m-  umulh_3  = "9bc07c00DNMx",[m
[31m-[m
[31m-  udiv_3 = "1ac00800DNMg",[m
[31m-  sdiv_3 = "1ac00c00DNMg",[m
[31m-[m
[31m-  -- Bit operations.[m
[31m-  sbfm_4 = "13000000DN12w|93400000DN12x",[m
[31m-  bfm_4  = "33000000DN12w|b3400000DN12x",[m
[31m-  ubfm_4 = "53000000DN12w|d3400000DN12x",[m
[31m-  extr_4 = "13800000DNM2w|93c00000DNM2x",[m
[31m-[m
[31m-  sxtb_2 = "13001c00DNw|93401c00DNx",[m
[31m-  sxth_2 = "13003c00DNw|93403c00DNx",[m
[31m-  sxtw_2 = "93407c00DxNw",[m
[31m-  uxtb_2 = "53001c00DNw",[m
[31m-  uxth_2 = "53003c00DNw",[m
[31m-[m
[31m-  sbfx_4  = op_alias("sbfm_4", alias_bfx),[m
[31m-  bfxil_4 = op_alias("bfm_4", alias_bfx),[m
[31m-  ubfx_4  = op_alias("ubfm_4", alias_bfx),[m
[31m-  sbfiz_4 = op_alias("sbfm_4", alias_bfiz),[m
[31m-  bfi_4   = op_alias("bfm_4", alias_bfiz),[m
[31m-  ubfiz_4 = op_alias("ubfm_4", alias_bfiz),[m
[31m-[m
[31m-  lsl_3  = function(params, nparams)[m
[31m-    if params and params[3]:byte() == 35 then[m
[31m-      return alias_lslimm(params, nparams)[m
[31m-    else[m
[31m-      return op_template(params, "1ac02000DNMg", nparams)[m
[31m-    end[m
[31m-  end,[m
[31m-  lsr_3  = "1ac02400DNMg|53007c00DN1w|d340fc00DN1x",[m
[31m-  asr_3  = "1ac02800DNMg|13007c00DN1w|9340fc00DN1x",[m
[31m-  ror_3  = "1ac02c00DNMg|13800000DNm2w|93c00000DNm2x",[m
[31m-[m
[31m-  clz_2   = "5ac01000DNg",[m
[31m-  cls_2   = "5ac01400DNg",[m
[31m-  rbit_2  = "5ac00000DNg",[m
[31m-  rev_2   = "5ac00800DNw|dac00c00DNx",[m
[31m-  rev16_2 = "5ac00400DNg",[m
[31m-  rev32_2 = "dac00800DNx",[m
[31m-[m
[31m-  -- Loads and stores.[m
[31m-  ["strb_*"]  = "38000000DwL",[m
[31m-  ["ldrb_*"]  = "38400000DwL",[m
[31m-  ["ldrsb_*"] = "38c00000DwL|38800000DxL",[m
[31m-  ["strh_*"]  = "78000000DwL",[m
[31m-  ["ldrh_*"]  = "78400000DwL",[m
[31m-  ["ldrsh_*"] = "78c00000DwL|78800000DxL",[m
[31m-  ["str_*"]   = "b8000000DwL|f8000000DxL|bc000000DsL|fc000000DdL",[m
[31m-  ["ldr_*"]   = "18000000DwB|58000000DxB|1c000000DsB|5c000000DdB|b8400000DwL|f8400000DxL|bc400000DsL|fc400000DdL",[m
[31m-  ["ldrsw_*"] = "98000000DxB|b8800000DxL",[m
[31m-  -- NOTE: ldur etc. are handled by ldr et al.[m
[31m-[m
[31m-  ["stp_*"]   = "28000000DAwP|a8000000DAxP|2c000000DAsP|6c000000DAdP",[m
[31m-  ["ldp_*"]   = "28400000DAwP|a8400000DAxP|2c400000DAsP|6c400000DAdP",[m
[31m-  ["ldpsw_*"] = "68400000DAxP",[m
[31m-[m
[31m-  -- Branches.[m
[31m-  b_1    = "14000000B",[m
[31m-  bl_1   = "94000000B",[m
[31m-  blr_1  = "d63f0000Nx",[m
[31m-  br_1   = "d61f0000Nx",[m
[31m-  ret_0  = "d65f03c0",[m
[31m-  ret_1  = "d65f0000Nx",[m
[31m-  -- b.cond is added below.[m
[31m-  cbz_2  = "34000000DBg",[m
[31m-  cbnz_2 = "35000000DBg",[m
[31m-  tbz_3  = "36000000DTBw|36000000DTBx",[m
[31m-  tbnz_3 = "37000000DTBw|37000000DTBx",[m
[31m-[m
[31m-  -- Miscellaneous instructions.[m
[31m-  -- TODO: hlt, hvc, smc, svc, eret, dcps[123], drps, mrs, msr[m
[31m-  -- TODO: sys, sysl, ic, dc, at, tlbi[m
[31m-  -- TODO: hint, yield, wfe, wfi, sev, sevl[m
[31m-  -- TODO: clrex, dsb, dmb, isb[m
[31m-  nop_0  = "d503201f",[m
[31m-  brk_0  = "d4200000",[m
[31m-  brk_1  = "d4200000W",[m
[31m-[m
[31m-  -- Floating point instructions.[m
[31m-  fmov_2  = "1e204000DNf|1e260000DwNs|1e270000DsNw|9e660000DxNd|9e670000DdNx|1e201000DFf",[m
[31m-  fabs_2  = "1e20c000DNf",[m
[31m-  fneg_2  = "1e214000DNf",[m
[31m-  fsqrt_2 = "1e21c000DNf",[m
[31m-[m
[31m-  fcvt_2  = "1e22c000DdNs|1e624000DsNd",[m
[31m-[m
[31m-  -- TODO: half-precision and fixed-point conversions.[m
[31m-  fcvtas_2 = "1e240000DwNs|9e240000DxNs|1e640000DwNd|9e640000DxNd",[m
[31m-  fcvtau_2 = "1e250000DwNs|9e250000DxNs|1e650000DwNd|9e650000DxNd",[m
[31m-  fcvtms_2 = "1e300000DwNs|9e300000DxNs|1e700000DwNd|9e700000DxNd",[m
[31m-  fcvtmu_2 = "1e310000DwNs|9e310000DxNs|1e710000DwNd|9e710000DxNd",[m
[31m-  fcvtns_2 = "1e200000DwNs|9e200000DxNs|1e600000DwNd|9e600000DxNd",[m
[31m-  fcvtnu_2 = "1e210000DwNs|9e210000DxNs|1e610000DwNd|9e610000DxNd",[m
[31m-  fcvtps_2 = "1e280000DwNs|9e280000DxNs|1e680000DwNd|9e680000DxNd",[m
[31m-  fcvtpu_2 = "1e290000DwNs|9e290000DxNs|1e690000DwNd|9e690000DxNd",[m
[31m-  fcvtzs_2 = "1e380000DwNs|9e380000DxNs|1e780000DwNd|9e780000DxNd",[m
[31m-  fcvtzu_2 = "1e390000DwNs|9e390000DxNs|1e790000DwNd|9e790000DxNd",[m
[31m-[m
[31m-  scvtf_2  = "1e220000DsNw|9e220000DsNx|1e620000DdNw|9e620000DdNx",[m
[31m-  ucvtf_2  = "1e230000DsNw|9e230000DsNx|1e630000DdNw|9e630000DdNx",[m
[31m-[m
[31m-  frintn_2 = "1e244000DNf",[m
[31m-  frintp_2 = "1e24c000DNf",[m
[31m-  frintm_2 = "1e254000DNf",[m
[31m-  frintz_2 = "1e25c000DNf",[m
[31m-  frinta_2 = "1e264000DNf",[m
[31m-  frintx_2 = "1e274000DNf",[m
[31m-  frinti_2 = "1e27c000DNf",[m
[31m-[m
[31m-  fadd_3   = "1e202800DNMf",[m
[31m-  fsub_3   = "1e203800DNMf",[m
[31m-  fmul_3   = "1e200800DNMf",[m
[31m-  fnmul_3  = "1e208800DNMf",[m
[31m-  fdiv_3   = "1e201800DNMf",[m
[31m-[m
[31m-  fmadd_4  = "1f000000DNMAf",[m
[31m-  fmsub_4  = "1f008000DNMAf",[m
[31m-  fnmadd_4 = "1f200000DNMAf",[m
[31m-  fnmsub_4 = "1f208000DNMAf",[m
[31m-[m
[31m-  fmax_3   = "1e204800DNMf",[m
[31m-  fmaxnm_3 = "1e206800DNMf",[m
[31m-  fmin_3   = "1e205800DNMf",[m
[31m-  fminnm_3 = "1e207800DNMf",[m
[31m-[m
[31m-  fcmp_2   = "1e202000NMf|1e202008NZf",[m
[31m-  fcmpe_2  = "1e202010NMf|1e202018NZf",[m
[31m-[m
[31m-  fccmp_4  = "1e200400NMVCf",[m
[31m-  fccmpe_4 = "1e200410NMVCf",[m
[31m-[m
[31m-  fcsel_4  = "1e200c00DNMCf",[m
[31m-[m
[31m-  -- TODO: crc32*, aes*, sha*, pmull[m
[31m-  -- TODO: SIMD instructions.[m
[31m-}[m
[31m-[m
[31m-for cond,c in pairs(map_cond) do[m
[31m-  map_op["b"..cond.."_1"] = tohex(0x54000000+c).."B"[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-local function parse_template(params, template, nparams, pos)[m
[31m-  local op = tonumber(sub(template, 1, 8), 16)[m
[31m-  local n = 1[m
[31m-  local rtt = {}[m
[31m-[m
[31m-  parse_reg_type = false[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for p in gmatch(sub(template, 9), ".") do[m
[31m-    local q = params[n][m
[31m-    if p == "D" then[m
[31m-      op = op + parse_reg(q); n = n + 1[m
[31m-    elseif p == "N" then[m
[31m-      op = op + shl(parse_reg(q), 5); n = n + 1[m
[31m-    elseif p == "M" then[m
[31m-      op = op + shl(parse_reg(q), 16); n = n + 1[m
[31m-    elseif p == "A" then[m
[31m-      op = op + shl(parse_reg(q), 10); n = n + 1[m
[31m-    elseif p == "m" then[m
[31m-      op = op + shl(parse_reg(params[n-1]), 16)[m
[31m-[m
[31m-    elseif p == "p" then[m
[31m-      if q == "sp" then params[n] = "@x31" end[m
[31m-    elseif p == "g" then[m
[31m-      if parse_reg_type == "x" then[m
[31m-	op = op + 0x80000000[m
[31m-      elseif parse_reg_type ~= "w" then[m
[31m-	werror("bad register type")[m
[31m-      end[m
[31m-      parse_reg_type = false[m
[31m-    elseif p == "f" then[m
[31m-      if parse_reg_type == "d" then[m
[31m-	op = op + 0x00400000[m
[31m-      elseif parse_reg_type ~= "s" then[m
[31m-	werror("bad register type")[m
[31m-      end[m
[31m-      parse_reg_type = false[m
[31m-    elseif p == "x" or p == "w" or p == "d" or p == "s" then[m
[31m-      if parse_reg_type ~= p then[m
[31m-	werror("register size mismatch")[m
[31m-      end[m
[31m-      parse_reg_type = false[m
[31m-[m
[31m-    elseif p == "L" then[m
[31m-      op = parse_load(params, nparams, n, op)[m
[31m-    elseif p == "P" then[m
[31m-      op = parse_load_pair(params, nparams, n, op)[m
[31m-[m
[31m-    elseif p == "B" then[m
[31m-      local mode, v, s = parse_label(q, false); n = n + 1[m
[31m-      local m = branch_type(op)[m
[31m-      waction("REL_"..mode, v+m, s, 1)[m
[31m-[m
[31m-    elseif p == "I" then[m
[31m-      op = op + parse_imm12(q); n = n + 1[m
[31m-    elseif p == "i" then[m
[31m-      op = op + parse_imm13(q); n = n + 1[m
[31m-    elseif p == "W" then[m
[31m-      op = op + parse_imm(q, 16, 5, 0, false); n = n + 1[m
[31m-    elseif p == "T" then[m
[31m-      op = op + parse_imm6(q); n = n + 1[m
[31m-    elseif p == "1" then[m
[31m-      op = op + parse_imm(q, 6, 16, 0, false); n = n + 1[m
[31m-    elseif p == "2" then[m
[31m-      op = op + parse_imm(q, 6, 10, 0, false); n = n + 1[m
[31m-    elseif p == "5" then[m
[31m-      op = op + parse_imm(q, 5, 16, 0, false); n = n + 1[m
[31m-    elseif p == "V" then[m
[31m-      op = op + parse_imm(q, 4, 0, 0, false); n = n + 1[m
[31m-    elseif p == "F" then[m
[31m-      op = op + parse_fpimm(q); n = n + 1[m
[31m-    elseif p == "Z" then[m
[31m-      if q ~= "#0" and q ~= "#0.0" then werror("expected zero immediate") end[m
[31m-      n = n + 1[m
[31m-[m
[31m-    elseif p == "S" then[m
[31m-      op = op + parse_shift(q); n = n + 1[m
[31m-    elseif p == "X" then[m
[31m-      op = op + parse_extend(q); n = n + 1[m
[31m-    elseif p == "R" then[m
[31m-      op = op + parse_lslx16(q); n = n + 1[m
[31m-    elseif p == "C" then[m
[31m-      op = op + parse_cond(q, 0); n = n + 1[m
[31m-    elseif p == "c" then[m
[31m-      op = op + parse_cond(q, 1); n = n + 1[m
[31m-[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-  end[m
[31m-  wputpos(pos, op)[m
[31m-end[m
[31m-[m
[31m-function op_template(params, template, nparams)[m
[31m-  if not params then return template:gsub("%x%x%x%x%x%x%x%x", "") end[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 3 positions.[m
[31m-  if secpos+3 > maxsecpos then wflush() end[m
[31m-  local pos = wpos()[m
[31m-  local lpos, apos, spos = #actlist, #actargs, secpos[m
[31m-[m
[31m-  local ok, err[m
[31m-  for t in gmatch(template, "[^|]+") do[m
[31m-    ok, err = pcall(parse_template, params, t, nparams, pos)[m
[31m-    if ok then return end[m
[31m-    secpos = spos[m
[31m-    actlist[lpos+1] = nil[m
[31m-    actlist[lpos+2] = nil[m
[31m-    actlist[lpos+3] = nil[m
[31m-    actargs[apos+1] = nil[m
[31m-    actargs[apos+2] = nil[m
[31m-    actargs[apos+3] = nil[m
[31m-  end[m
[31m-  error(err, 0)[m
[31m-end[m
[31m-[m
[31m-map_op[".template__"] = op_template[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_1"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local mode, n, s = parse_label(params[1], true)[m
[31m-  if mode == "EXT" then werror("bad label definition") end[m
[31m-  waction("LABEL_"..mode, n, s, 1)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-map_op[".long_*"] = function(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local n = tonumber(p)[m
[31m-    if not n then werror("bad immediate `"..p.."'") end[m
[31m-    if n < 0 then n = n + 2^32 end[m
[31m-    wputw(n)[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1])[m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION", num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = map_coreop })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_mips.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_mips.h[m
[1mdeleted file mode 100644[m
[1mindex c10528f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_mips.h[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-/*[m
[31m-** DynASM MIPS encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"mips"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. */[m
[31m-enum {[m
[31m-  DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT,[m
[31m-  /* The following actions need a buffer position. */[m
[31m-  DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,[m
[31m-  /* The following actions also have an argument. */[m
[31m-  DASM_REL_PC, DASM_LABEL_PC, DASM_IMM,[m
[31m-  DASM__MAX[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_REL	0x15000000[m
[31m-#define DASM_S_UNDEF_LG		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned int *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    unsigned int ins = *p++;[m
[31m-    unsigned int action = (ins >> 16) - 0xff00;[m
[31m-    if (action >= DASM__MAX) {[m
[31m-      ofs += 4;[m
[31m-    } else {[m
[31m-      int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0;[m
[31m-      switch (action) {[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      case DASM_SECTION:[m
[31m-	n = (ins & 255); CK(n < D->maxsection, RANGE_SEC);[m
[31m-	D->section = &D->sections[n]; goto stop;[m
[31m-      case DASM_ESC: p++; ofs += 4; break;[m
[31m-      case DASM_REL_EXT: break;[m
[31m-      case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break;[m
[31m-      case DASM_REL_LG:[m
[31m-	n = (ins & 2047) - 10; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl += 10; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG:[m
[31m-	pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos;[m
[31m-	}[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_IMM:[m
[31m-#ifdef DASM_CHECKS[m
[31m-	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	n >>= ((ins>>10)&31);[m
[31m-#ifdef DASM_CHECKS[m
[31m-	if (ins & 0x8000)[m
[31m-	  CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-	else[m
[31m-	  CK((n>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16) - 0xff00;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_REL_EXT: break;[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;[m
[31m-	case DASM_REL_LG: case DASM_REL_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;[m
[31m-	case DASM_IMM: pos++; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  char *base = (char *)buffer;[m
[31m-  unsigned int *cp = (unsigned int *)buffer;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16) - 0xff00;[m
[31m-	int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: *cp++ = *p++; break;[m
[31m-	case DASM_REL_EXT:[m
[31m-	  n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1);[m
[31m-	  goto patchrel;[m
[31m-	case DASM_ALIGN:[m
[31m-	  ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000;[m
[31m-	  break;[m
[31m-	case DASM_REL_LG:[m
[31m-	  CK(n >= 0, UNDEF_LG);[m
[31m-	case DASM_REL_PC:[m
[31m-	  CK(n >= 0, UNDEF_PC);[m
[31m-	  n = *DASM_POS2PTR(D, n);[m
[31m-	  if (ins & 2048)[m
[31m-	    n = n - (int)((char *)cp - base);[m
[31m-	  else[m
[31m-	    n = (n + (int)base) & 0x0fffffff;[m
[31m-	patchrel:[m
[31m-	  CK((n & 3) == 0 &&[m
[31m-	     ((n + ((ins & 2048) ? 0x00020000 : 0)) >>[m
[31m-	       ((ins & 2048) ? 18 : 28)) == 0, RANGE_REL);[m
[31m-	  cp[-1] |= ((n>>2) & ((ins & 2048) ? 0x0000ffff: 0x03ffffff));[m
[31m-	  break;[m
[31m-	case DASM_LABEL_LG:[m
[31m-	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);[m
[31m-	  break;[m
[31m-	case DASM_LABEL_PC: break;[m
[31m-	case DASM_IMM:[m
[31m-	  cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31);[m
[31m-	  break;[m
[31m-	default: *cp++ = ins; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != (char *)cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_mips.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_mips.lua[m
[1mdeleted file mode 100644[m
[1mindex c5a5595..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_mips.lua[m
[1m+++ /dev/null[m
[36m@@ -1,953 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM MIPS module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	"mips",[m
[31m-  description =	"DynASM MIPS module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, setmetatable = assert, setmetatable[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local match, gmatch = _s.match, _s.gmatch[m
[31m-local concat, sort = table.concat, table.sort[m
[31m-local bit = bit or require("bit")[m
[31m-local band, shl, sar, tohex = bit.band, bit.lshift, bit.arshift, bit.tohex[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  "STOP", "SECTION", "ESC", "REL_EXT",[m
[31m-  "ALIGN", "REL_LG", "LABEL_LG",[m
[31m-  "REL_PC", "LABEL_PC", "IMM",[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number.[m
[31m-local map_action = {}[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  map_action[name] = n-1[m
[31m-end[m
[31m-[m
[31m--- Action list buffer.[m
[31m-local actlist = {}[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  if nn == 0 then nn = 1; actlist[0] = map_action.STOP end[m
[31m-  out:write("static const unsigned int ", name, "[", nn, "] = {\n")[m
[31m-  for i = 1,nn-1 do[m
[31m-    assert(out:write("0x", tohex(actlist[i]), ",\n"))[m
[31m-  end[m
[31m-  assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add word to action list.[m
[31m-local function wputxw(n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, val, a, num)[m
[31m-  local w = assert(map_action[action], "bad action name `"..action.."'")[m
[31m-  wputxw(0xff000000 + w * 0x10000 + (val or 0))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  if #actlist == actargs[1] then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped word.[m
[31m-local function wputw(n)[m
[31m-  if n >= 0xff000000 then waction("ESC") end[m
[31m-  wputxw(n)[m
[31m-end[m
[31m-[m
[31m--- Reserve position for word.[m
[31m-local function wpos()[m
[31m-  local pos = #actlist+1[m
[31m-  actlist[pos] = ""[m
[31m-  return pos[m
[31m-end[m
[31m-[m
[31m--- Store word to reserved position.[m
[31m-local function wputpos(pos, n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[pos] = n[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 20[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 2047 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  ", prefix, t[i], ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = 0[m
[31m-local map_extern_ = {}[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n > 2047 then werror("too many extern labels") end[m
[31m-  next_extern = n + 1[m
[31m-  t[name] = n[m
[31m-  map_extern_[n] = name[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write(format("  %s\n", map_extern_[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write("  \"", map_extern_[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-local map_archdef = { sp="r29", ra="r31" } -- Ext. register name -> int. name.[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for Dt... macros).[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  if s == "r29" then return "sp"[m
[31m-  elseif s == "r31" then return "ra" end[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Template strings for MIPS instructions.[m
[31m-local map_op = {[m
[31m-  -- First-level opcodes.[m
[31m-  j_1 =		"08000000J",[m
[31m-  jal_1 =	"0c000000J",[m
[31m-  b_1 =		"10000000B",[m
[31m-  beqz_2 =	"10000000SB",[m
[31m-  beq_3 =	"10000000STB",[m
[31m-  bnez_2 =	"14000000SB",[m
[31m-  bne_3 =	"14000000STB",[m
[31m-  blez_2 =	"18000000SB",[m
[31m-  bgtz_2 =	"1c000000SB",[m
[31m-  addi_3 =	"20000000TSI",[m
[31m-  li_2 =	"24000000TI",[m
[31m-  addiu_3 =	"24000000TSI",[m
[31m-  slti_3 =	"28000000TSI",[m
[31m-  sltiu_3 =	"2c000000TSI",[m
[31m-  andi_3 =	"30000000TSU",[m
[31m-  lu_2 =	"34000000TU",[m
[31m-  ori_3 =	"34000000TSU",[m
[31m-  xori_3 =	"38000000TSU",[m
[31m-  lui_2 =	"3c000000TU",[m
[31m-  beqzl_2 =	"50000000SB",[m
[31m-  beql_3 =	"50000000STB",[m
[31m-  bnezl_2 =	"54000000SB",[m
[31m-  bnel_3 =	"54000000STB",[m
[31m-  blezl_2 =	"58000000SB",[m
[31m-  bgtzl_2 =	"5c000000SB",[m
[31m-  lb_2 =	"80000000TO",[m
[31m-  lh_2 =	"84000000TO",[m
[31m-  lwl_2 =	"88000000TO",[m
[31m-  lw_2 =	"8c000000TO",[m
[31m-  lbu_2 =	"90000000TO",[m
[31m-  lhu_2 =	"94000000TO",[m
[31m-  lwr_2 =	"98000000TO",[m
[31m-  sb_2 =	"a0000000TO",[m
[31m-  sh_2 =	"a4000000TO",[m
[31m-  swl_2 =	"a8000000TO",[m
[31m-  sw_2 =	"ac000000TO",[m
[31m-  swr_2 =	"b8000000TO",[m
[31m-  cache_2 =	"bc000000NO",[m
[31m-  ll_2 =	"c0000000TO",[m
[31m-  lwc1_2 =	"c4000000HO",[m
[31m-  pref_2 =	"cc000000NO",[m
[31m-  ldc1_2 =	"d4000000HO",[m
[31m-  sc_2 =	"e0000000TO",[m
[31m-  swc1_2 =	"e4000000HO",[m
[31m-  sdc1_2 =	"f4000000HO",[m
[31m-[m
[31m-  -- Opcode SPECIAL.[m
[31m-  nop_0 =	"00000000",[m
[31m-  sll_3 =	"00000000DTA",[m
[31m-  movf_2 =	"00000001DS",[m
[31m-  movf_3 =	"00000001DSC",[m
[31m-  movt_2 =	"00010001DS",[m
[31m-  movt_3 =	"00010001DSC",[m
[31m-  srl_3 =	"00000002DTA",[m
[31m-  rotr_3 =	"00200002DTA",[m
[31m-  sra_3 =	"00000003DTA",[m
[31m-  sllv_3 =	"00000004DTS",[m
[31m-  srlv_3 =	"00000006DTS",[m
[31m-  rotrv_3 =	"00000046DTS",[m
[31m-  srav_3 =	"00000007DTS",[m
[31m-  jr_1 =	"00000008S",[m
[31m-  jalr_1 =	"0000f809S",[m
[31m-  jalr_2 =	"00000009DS",[m
[31m-  movz_3 =	"0000000aDST",[m
[31m-  movn_3 =	"0000000bDST",[m
[31m-  syscall_0 =	"0000000c",[m
[31m-  syscall_1 =	"0000000cY",[m
[31m-  break_0 =	"0000000d",[m
[31m-  break_1 =	"0000000dY",[m
[31m-  sync_0 =	"0000000f",[m
[31m-  mfhi_1 =	"00000010D",[m
[31m-  mthi_1 =	"00000011S",[m
[31m-  mflo_1 =	"00000012D",[m
[31m-  mtlo_1 =	"00000013S",[m
[31m-  mult_2 =	"00000018ST",[m
[31m-  multu_2 =	"00000019ST",[m
[31m-  div_2 =	"0000001aST",[m
[31m-  divu_2 =	"0000001bST",[m
[31m-  add_3 =	"00000020DST",[m
[31m-  move_2 =	"00000021DS",[m
[31m-  addu_3 =	"00000021DST",[m
[31m-  sub_3 =	"00000022DST",[m
[31m-  negu_2 =	"00000023DT",[m
[31m-  subu_3 =	"00000023DST",[m
[31m-  and_3 =	"00000024DST",[m
[31m-  or_3 =	"00000025DST",[m
[31m-  xor_3 =	"00000026DST",[m
[31m-  not_2 =	"00000027DS",[m
[31m-  nor_3 =	"00000027DST",[m
[31m-  slt_3 =	"0000002aDST",[m
[31m-  sltu_3 =	"0000002bDST",[m
[31m-  tge_2 =	"00000030ST",[m
[31m-  tge_3 =	"00000030STZ",[m
[31m-  tgeu_2 =	"00000031ST",[m
[31m-  tgeu_3 =	"00000031STZ",[m
[31m-  tlt_2 =	"00000032ST",[m
[31m-  tlt_3 =	"00000032STZ",[m
[31m-  tltu_2 =	"00000033ST",[m
[31m-  tltu_3 =	"00000033STZ",[m
[31m-  teq_2 =	"00000034ST",[m
[31m-  teq_3 =	"00000034STZ",[m
[31m-  tne_2 =	"00000036ST",[m
[31m-  tne_3 =	"00000036STZ",[m
[31m-[m
[31m-  -- Opcode REGIMM.[m
[31m-  bltz_2 =	"04000000SB",[m
[31m-  bgez_2 =	"04010000SB",[m
[31m-  bltzl_2 =	"04020000SB",[m
[31m-  bgezl_2 =	"04030000SB",[m
[31m-  tgei_2 =	"04080000SI",[m
[31m-  tgeiu_2 =	"04090000SI",[m
[31m-  tlti_2 =	"040a0000SI",[m
[31m-  tltiu_2 =	"040b0000SI",[m
[31m-  teqi_2 =	"040c0000SI",[m
[31m-  tnei_2 =	"040e0000SI",[m
[31m-  bltzal_2 =	"04100000SB",[m
[31m-  bal_1 =	"04110000B",[m
[31m-  bgezal_2 =	"04110000SB",[m
[31m-  bltzall_2 =	"04120000SB",[m
[31m-  bgezall_2 =	"04130000SB",[m
[31m-  synci_1 =	"041f0000O",[m
[31m-[m
[31m-  -- Opcode SPECIAL2.[m
[31m-  madd_2 =	"70000000ST",[m
[31m-  maddu_2 =	"70000001ST",[m
[31m-  mul_3 =	"70000002DST",[m
[31m-  msub_2 =	"70000004ST",[m
[31m-  msubu_2 =	"70000005ST",[m
[31m-  clz_2 =	"70000020DS=",[m
[31m-  clo_2 =	"70000021DS=",[m
[31m-  sdbbp_0 =	"7000003f",[m
[31m-  sdbbp_1 =	"7000003fY",[m
[31m-[m
[31m-  -- Opcode SPECIAL3.[m
[31m-  ext_4 =	"7c000000TSAM", -- Note: last arg is msbd = size-1[m
[31m-  ins_4 =	"7c000004TSAM", -- Note: last arg is msb = pos+size-1[m
[31m-  wsbh_2 =	"7c0000a0DT",[m
[31m-  seb_2 =	"7c000420DT",[m
[31m-  seh_2 =	"7c000620DT",[m
[31m-  rdhwr_2 =	"7c00003bTD",[m
[31m-[m
[31m-  -- Opcode COP0.[m
[31m-  mfc0_2 =	"40000000TD",[m
[31m-  mfc0_3 =	"40000000TDW",[m
[31m-  mtc0_2 =	"40800000TD",[m
[31m-  mtc0_3 =	"40800000TDW",[m
[31m-  rdpgpr_2 =	"41400000DT",[m
[31m-  di_0 =	"41606000",[m
[31m-  di_1 =	"41606000T",[m
[31m-  ei_0 =	"41606020",[m
[31m-  ei_1 =	"41606020T",[m
[31m-  wrpgpr_2 =	"41c00000DT",[m
[31m-  tlbr_0 =	"42000001",[m
[31m-  tlbwi_0 =	"42000002",[m
[31m-  tlbwr_0 =	"42000006",[m
[31m-  tlbp_0 =	"42000008",[m
[31m-  eret_0 =	"42000018",[m
[31m-  deret_0 =	"4200001f",[m
[31m-  wait_0 =	"42000020",[m
[31m-[m
[31m-  -- Opcode COP1.[m
[31m-  mfc1_2 =	"44000000TG",[m
[31m-  cfc1_2 =	"44400000TG",[m
[31m-  mfhc1_2 =	"44600000TG",[m
[31m-  mtc1_2 =	"44800000TG",[m
[31m-  ctc1_2 =	"44c00000TG",[m
[31m-  mthc1_2 =	"44e00000TG",[m
[31m-[m
[31m-  bc1f_1 =	"45000000B",[m
[31m-  bc1f_2 =	"45000000CB",[m
[31m-  bc1t_1 =	"45010000B",[m
[31m-  bc1t_2 =	"45010000CB",[m
[31m-  bc1fl_1 =	"45020000B",[m
[31m-  bc1fl_2 =	"45020000CB",[m
[31m-  bc1tl_1 =	"45030000B",[m
[31m-  bc1tl_2 =	"45030000CB",[m
[31m-[m
[31m-  ["add.s_3"] =		"46000000FGH",[m
[31m-  ["sub.s_3"] =		"46000001FGH",[m
[31m-  ["mul.s_3"] =		"46000002FGH",[m
[31m-  ["div.s_3"] =		"46000003FGH",[m
[31m-  ["sqrt.s_2"] =	"46000004FG",[m
[31m-  ["abs.s_2"] =		"46000005FG",[m
[31m-  ["mov.s_2"] =		"46000006FG",[m
[31m-  ["neg.s_2"] =		"46000007FG",[m
[31m-  ["round.l.s_2"] =	"46000008FG",[m
[31m-  ["trunc.l.s_2"] =	"46000009FG",[m
[31m-  ["ceil.l.s_2"] =	"4600000aFG",[m
[31m-  ["floor.l.s_2"] =	"4600000bFG",[m
[31m-  ["round.w.s_2"] =	"4600000cFG",[m
[31m-  ["trunc.w.s_2"] =	"4600000dFG",[m
[31m-  ["ceil.w.s_2"] =	"4600000eFG",[m
[31m-  ["floor.w.s_2"] =	"4600000fFG",[m
[31m-  ["movf.s_2"] =	"46000011FG",[m
[31m-  ["movf.s_3"] =	"46000011FGC",[m
[31m-  ["movt.s_2"] =	"46010011FG",[m
[31m-  ["movt.s_3"] =	"46010011FGC",[m
[31m-  ["movz.s_3"] =	"46000012FGT",[m
[31m-  ["movn.s_3"] =	"46000013FGT",[m
[31m-  ["recip.s_2"] =	"46000015FG",[m
[31m-  ["rsqrt.s_2"] =	"46000016FG",[m
[31m-  ["cvt.d.s_2"] =	"46000021FG",[m
[31m-  ["cvt.w.s_2"] =	"46000024FG",[m
[31m-  ["cvt.l.s_2"] =	"46000025FG",[m
[31m-  ["cvt.ps.s_3"] =	"46000026FGH",[m
[31m-  ["c.f.s_2"] =		"46000030GH",[m
[31m-  ["c.f.s_3"] =		"46000030VGH",[m
[31m-  ["c.un.s_2"] =	"46000031GH",[m
[31m-  ["c.un.s_3"] =	"46000031VGH",[m
[31m-  ["c.eq.s_2"] =	"46000032GH",[m
[31m-  ["c.eq.s_3"] =	"46000032VGH",[m
[31m-  ["c.ueq.s_2"] =	"46000033GH",[m
[31m-  ["c.ueq.s_3"] =	"46000033VGH",[m
[31m-  ["c.olt.s_2"] =	"46000034GH",[m
[31m-  ["c.olt.s_3"] =	"46000034VGH",[m
[31m-  ["c.ult.s_2"] =	"46000035GH",[m
[31m-  ["c.ult.s_3"] =	"46000035VGH",[m
[31m-  ["c.ole.s_2"] =	"46000036GH",[m
[31m-  ["c.ole.s_3"] =	"46000036VGH",[m
[31m-  ["c.ule.s_2"] =	"46000037GH",[m
[31m-  ["c.ule.s_3"] =	"46000037VGH",[m
[31m-  ["c.sf.s_2"] =	"46000038GH",[m
[31m-  ["c.sf.s_3"] =	"46000038VGH",[m
[31m-  ["c.ngle.s_2"] =	"46000039GH",[m
[31m-  ["c.ngle.s_3"] =	"46000039VGH",[m
[31m-  ["c.seq.s_2"] =	"4600003aGH",[m
[31m-  ["c.seq.s_3"] =	"4600003aVGH",[m
[31m-  ["c.ngl.s_2"] =	"4600003bGH",[m
[31m-  ["c.ngl.s_3"] =	"4600003bVGH",[m
[31m-  ["c.lt.s_2"] =	"4600003cGH",[m
[31m-  ["c.lt.s_3"] =	"4600003cVGH",[m
[31m-  ["c.nge.s_2"] =	"4600003dGH",[m
[31m-  ["c.nge.s_3"] =	"4600003dVGH",[m
[31m-  ["c.le.s_2"] =	"4600003eGH",[m
[31m-  ["c.le.s_3"] =	"4600003eVGH",[m
[31m-  ["c.ngt.s_2"] =	"4600003fGH",[m
[31m-  ["c.ngt.s_3"] =	"4600003fVGH",[m
[31m-[m
[31m-  ["add.d_3"] =		"46200000FGH",[m
[31m-  ["sub.d_3"] =		"46200001FGH",[m
[31m-  ["mul.d_3"] =		"46200002FGH",[m
[31m-  ["div.d_3"] =		"46200003FGH",[m
[31m-  ["sqrt.d_2"] =	"46200004FG",[m
[31m-  ["abs.d_2"] =		"46200005FG",[m
[31m-  ["mov.d_2"] =		"46200006FG",[m
[31m-  ["neg.d_2"] =		"46200007FG",[m
[31m-  ["round.l.d_2"] =	"46200008FG",[m
[31m-  ["trunc.l.d_2"] =	"46200009FG",[m
[31m-  ["ceil.l.d_2"] =	"4620000aFG",[m
[31m-  ["floor.l.d_2"] =	"4620000bFG",[m
[31m-  ["round.w.d_2"] =	"4620000cFG",[m
[31m-  ["trunc.w.d_2"] =	"4620000dFG",[m
[31m-  ["ceil.w.d_2"] =	"4620000eFG",[m
[31m-  ["floor.w.d_2"] =	"4620000fFG",[m
[31m-  ["movf.d_2"] =	"46200011FG",[m
[31m-  ["movf.d_3"] =	"46200011FGC",[m
[31m-  ["movt.d_2"] =	"46210011FG",[m
[31m-  ["movt.d_3"] =	"46210011FGC",[m
[31m-  ["movz.d_3"] =	"46200012FGT",[m
[31m-  ["movn.d_3"] =	"46200013FGT",[m
[31m-  ["recip.d_2"] =	"46200015FG",[m
[31m-  ["rsqrt.d_2"] =	"46200016FG",[m
[31m-  ["cvt.s.d_2"] =	"46200020FG",[m
[31m-  ["cvt.w.d_2"] =	"46200024FG",[m
[31m-  ["cvt.l.d_2"] =	"46200025FG",[m
[31m-  ["c.f.d_2"] =		"46200030GH",[m
[31m-  ["c.f.d_3"] =		"46200030VGH",[m
[31m-  ["c.un.d_2"] =	"46200031GH",[m
[31m-  ["c.un.d_3"] =	"46200031VGH",[m
[31m-  ["c.eq.d_2"] =	"46200032GH",[m
[31m-  ["c.eq.d_3"] =	"46200032VGH",[m
[31m-  ["c.ueq.d_2"] =	"46200033GH",[m
[31m-  ["c.ueq.d_3"] =	"46200033VGH",[m
[31m-  ["c.olt.d_2"] =	"46200034GH",[m
[31m-  ["c.olt.d_3"] =	"46200034VGH",[m
[31m-  ["c.ult.d_2"] =	"46200035GH",[m
[31m-  ["c.ult.d_3"] =	"46200035VGH",[m
[31m-  ["c.ole.d_2"] =	"46200036GH",[m
[31m-  ["c.ole.d_3"] =	"46200036VGH",[m
[31m-  ["c.ule.d_2"] =	"46200037GH",[m
[31m-  ["c.ule.d_3"] =	"46200037VGH",[m
[31m-  ["c.sf.d_2"] =	"46200038GH",[m
[31m-  ["c.sf.d_3"] =	"46200038VGH",[m
[31m-  ["c.ngle.d_2"] =	"46200039GH",[m
[31m-  ["c.ngle.d_3"] =	"46200039VGH",[m
[31m-  ["c.seq.d_2"] =	"4620003aGH",[m
[31m-  ["c.seq.d_3"] =	"4620003aVGH",[m
[31m-  ["c.ngl.d_2"] =	"4620003bGH",[m
[31m-  ["c.ngl.d_3"] =	"4620003bVGH",[m
[31m-  ["c.lt.d_2"] =	"4620003cGH",[m
[31m-  ["c.lt.d_3"] =	"4620003cVGH",[m
[31m-  ["c.nge.d_2"] =	"4620003dGH",[m
[31m-  ["c.nge.d_3"] =	"4620003dVGH",[m
[31m-  ["c.le.d_2"] =	"4620003eGH",[m
[31m-  ["c.le.d_3"] =	"4620003eVGH",[m
[31m-  ["c.ngt.d_2"] =	"4620003fGH",[m
[31m-  ["c.ngt.d_3"] =	"4620003fVGH",[m
[31m-[m
[31m-  ["add.ps_3"] =	"46c00000FGH",[m
[31m-  ["sub.ps_3"] =	"46c00001FGH",[m
[31m-  ["mul.ps_3"] =	"46c00002FGH",[m
[31m-  ["abs.ps_2"] =	"46c00005FG",[m
[31m-  ["mov.ps_2"] =	"46c00006FG",[m
[31m-  ["neg.ps_2"] =	"46c00007FG",[m
[31m-  ["movf.ps_2"] =	"46c00011FG",[m
[31m-  ["movf.ps_3"] =	"46c00011FGC",[m
[31m-  ["movt.ps_2"] =	"46c10011FG",[m
[31m-  ["movt.ps_3"] =	"46c10011FGC",[m
[31m-  ["movz.ps_3"] =	"46c00012FGT",[m
[31m-  ["movn.ps_3"] =	"46c00013FGT",[m
[31m-  ["cvt.s.pu_2"] =	"46c00020FG",[m
[31m-  ["cvt.s.pl_2"] =	"46c00028FG",[m
[31m-  ["pll.ps_3"] =	"46c0002cFGH",[m
[31m-  ["plu.ps_3"] =	"46c0002dFGH",[m
[31m-  ["pul.ps_3"] =	"46c0002eFGH",[m
[31m-  ["puu.ps_3"] =	"46c0002fFGH",[m
[31m-  ["c.f.ps_2"] =	"46c00030GH",[m
[31m-  ["c.f.ps_3"] =	"46c00030VGH",[m
[31m-  ["c.un.ps_2"] =	"46c00031GH",[m
[31m-  ["c.un.ps_3"] =	"46c00031VGH",[m
[31m-  ["c.eq.ps_2"] =	"46c00032GH",[m
[31m-  ["c.eq.ps_3"] =	"46c00032VGH",[m
[31m-  ["c.ueq.ps_2"] =	"46c00033GH",[m
[31m-  ["c.ueq.ps_3"] =	"46c00033VGH",[m
[31m-  ["c.olt.ps_2"] =	"46c00034GH",[m
[31m-  ["c.olt.ps_3"] =	"46c00034VGH",[m
[31m-  ["c.ult.ps_2"] =	"46c00035GH",[m
[31m-  ["c.ult.ps_3"] =	"46c00035VGH",[m
[31m-  ["c.ole.ps_2"] =	"46c00036GH",[m
[31m-  ["c.ole.ps_3"] =	"46c00036VGH",[m
[31m-  ["c.ule.ps_2"] =	"46c00037GH",[m
[31m-  ["c.ule.ps_3"] =	"46c00037VGH",[m
[31m-  ["c.sf.ps_2"] =	"46c00038GH",[m
[31m-  ["c.sf.ps_3"] =	"46c00038VGH",[m
[31m-  ["c.ngle.ps_2"] =	"46c00039GH",[m
[31m-  ["c.ngle.ps_3"] =	"46c00039VGH",[m
[31m-  ["c.seq.ps_2"] =	"46c0003aGH",[m
[31m-  ["c.seq.ps_3"] =	"46c0003aVGH",[m
[31m-  ["c.ngl.ps_2"] =	"46c0003bGH",[m
[31m-  ["c.ngl.ps_3"] =	"46c0003bVGH",[m
[31m-  ["c.lt.ps_2"] =	"46c0003cGH",[m
[31m-  ["c.lt.ps_3"] =	"46c0003cVGH",[m
[31m-  ["c.nge.ps_2"] =	"46c0003dGH",[m
[31m-  ["c.nge.ps_3"] =	"46c0003dVGH",[m
[31m-  ["c.le.ps_2"] =	"46c0003eGH",[m
[31m-  ["c.le.ps_3"] =	"46c0003eVGH",[m
[31m-  ["c.ngt.ps_2"] =	"46c0003fGH",[m
[31m-  ["c.ngt.ps_3"] =	"46c0003fVGH",[m
[31m-[m
[31m-  ["cvt.s.w_2"] =	"46800020FG",[m
[31m-  ["cvt.d.w_2"] =	"46800021FG",[m
[31m-[m
[31m-  ["cvt.s.l_2"] =	"46a00020FG",[m
[31m-  ["cvt.d.l_2"] =	"46a00021FG",[m
[31m-[m
[31m-  -- Opcode COP1X.[m
[31m-  lwxc1_2 =		"4c000000FX",[m
[31m-  ldxc1_2 =		"4c000001FX",[m
[31m-  luxc1_2 =		"4c000005FX",[m
[31m-  swxc1_2 =		"4c000008FX",[m
[31m-  sdxc1_2 =		"4c000009FX",[m
[31m-  suxc1_2 =		"4c00000dFX",[m
[31m-  prefx_2 =		"4c00000fMX",[m
[31m-  ["alnv.ps_4"] =	"4c00001eFGHS",[m
[31m-  ["madd.s_4"] =	"4c000020FRGH",[m
[31m-  ["madd.d_4"] =	"4c000021FRGH",[m
[31m-  ["madd.ps_4"] =	"4c000026FRGH",[m
[31m-  ["msub.s_4"] =	"4c000028FRGH",[m
[31m-  ["msub.d_4"] =	"4c000029FRGH",[m
[31m-  ["msub.ps_4"] =	"4c00002eFRGH",[m
[31m-  ["nmadd.s_4"] =	"4c000030FRGH",[m
[31m-  ["nmadd.d_4"] =	"4c000031FRGH",[m
[31m-  ["nmadd.ps_4"] =	"4c000036FRGH",[m
[31m-  ["nmsub.s_4"] =	"4c000038FRGH",[m
[31m-  ["nmsub.d_4"] =	"4c000039FRGH",[m
[31m-  ["nmsub.ps_4"] =	"4c00003eFRGH",[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function parse_gpr(expr)[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    if not reg then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    expr = reg[m
[31m-  end[m
[31m-  local r = match(expr, "^r([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r, tp end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_fpr(expr)[m
[31m-  local r = match(expr, "^f([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_imm(imm, bits, shift, scale, signed)[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n then[m
[31m-      if signed then[m
[31m-	local s = sar(m, bits-1)[m
[31m-	if s == 0 then return shl(m, shift)[m
[31m-	elseif s == -1 then return shl(m + shl(1, bits), shift) end[m
[31m-      else[m
[31m-	if sar(m, bits) == 0 then return shl(m, shift) end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  elseif match(imm, "^[rf]([1-3]?[0-9])$") or[m
[31m-	 match(imm, "^([%w_]+):([rf][1-3]?[0-9])$") then[m
[31m-    werror("expected immediate operand, got register")[m
[31m-  else[m
[31m-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_disp(disp)[m
[31m-  local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")[m
[31m-  if imm then[m
[31m-    local r = shl(parse_gpr(reg), 21)[m
[31m-    local extname = match(imm, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      waction("REL_EXT", map_extern[extname], nil, 1)[m
[31m-      return r[m
[31m-    else[m
[31m-      return r + parse_imm(imm, 16, 0, 0, true)[m
[31m-    end[m
[31m-  end[m
[31m-  local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$")[m
[31m-  if reg and tailr ~= "" then[m
[31m-    local r, tp = parse_gpr(reg)[m
[31m-    if tp then[m
[31m-      waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr))[m
[31m-      return shl(r, 21)[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad displacement `"..disp.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_index(idx)[m
[31m-  local rt, rs = match(idx, "^(.*)%(([%w_:]+)%)$")[m
[31m-  if rt then[m
[31m-    rt = parse_gpr(rt)[m
[31m-    rs = parse_gpr(rs)[m
[31m-    return shl(rt, 16) + shl(rs, 21)[m
[31m-  end[m
[31m-  werror("bad index `"..idx.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_label(label, def)[m
[31m-  local prefix = sub(label, 1, 2)[m
[31m-  -- =>label (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "PC", 0, sub(label, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "LG", map_global[sub(label, 3)][m
[31m-  end[m
[31m-  if def then[m
[31m-    -- [1-9] (local label definition)[m
[31m-    if match(label, "^[1-9]$") then[m
[31m-      return "LG", 10+tonumber(label)[m
[31m-    end[m
[31m-  else[m
[31m-    -- [<>][1-9] (local label reference)[m
[31m-    local dir, lnum = match(label, "^([<>])([1-9])$")[m
[31m-    if dir then -- Fwd: 1-9, Bkwd: 11-19.[m
[31m-      return "LG", lnum + (dir == ">" and 0 or 10)[m
[31m-    end[m
[31m-    -- extern label (extern label reference)[m
[31m-    local extname = match(label, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      return "EXT", map_extern[extname][m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad label `"..label.."'")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-map_op[".template__"] = function(params, template, nparams)[m
[31m-  if not params then return sub(template, 9) end[m
[31m-  local op = tonumber(sub(template, 1, 8), 16)[m
[31m-  local n = 1[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 2 positions (ins/ext).[m
[31m-  if secpos+2 > maxsecpos then wflush() end[m
[31m-  local pos = wpos()[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for p in gmatch(sub(template, 9), ".") do[m
[31m-    if p == "D" then[m
[31m-      op = op + shl(parse_gpr(params[n]), 11); n = n + 1[m
[31m-    elseif p == "T" then[m
[31m-      op = op + shl(parse_gpr(params[n]), 16); n = n + 1[m
[31m-    elseif p == "S" then[m
[31m-      op = op + shl(parse_gpr(params[n]), 21); n = n + 1[m
[31m-    elseif p == "F" then[m
[31m-      op = op + shl(parse_fpr(params[n]), 6); n = n + 1[m
[31m-    elseif p == "G" then[m
[31m-      op = op + shl(parse_fpr(params[n]), 11); n = n + 1[m
[31m-    elseif p == "H" then[m
[31m-      op = op + shl(parse_fpr(params[n]), 16); n = n + 1[m
[31m-    elseif p == "R" then[m
[31m-      op = op + shl(parse_fpr(params[n]), 21); n = n + 1[m
[31m-    elseif p == "I" then[m
[31m-      op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1[m
[31m-    elseif p == "U" then[m
[31m-      op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1[m
[31m-    elseif p == "O" then[m
[31m-      op = op + parse_disp(params[n]); n = n + 1[m
[31m-    elseif p == "X" then[m
[31m-      op = op + parse_index(params[n]); n = n + 1[m
[31m-    elseif p == "B" or p == "J" then[m
[31m-      local mode, n, s = parse_label(params[n], false)[m
[31m-      if p == "B" then n = n + 2048 end[m
[31m-      waction("REL_"..mode, n, s, 1)[m
[31m-      n = n + 1[m
[31m-    elseif p == "A" then[m
[31m-      op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1[m
[31m-    elseif p == "M" then[m
[31m-      op = op + parse_imm(params[n], 5, 11, 0, false); n = n + 1[m
[31m-    elseif p == "N" then[m
[31m-      op = op + parse_imm(params[n], 5, 16, 0, false); n = n + 1[m
[31m-    elseif p == "C" then[m
[31m-      op = op + parse_imm(params[n], 3, 18, 0, false); n = n + 1[m
[31m-    elseif p == "V" then[m
[31m-      op = op + parse_imm(params[n], 3, 8, 0, false); n = n + 1[m
[31m-    elseif p == "W" then[m
[31m-      op = op + parse_imm(params[n], 3, 0, 0, false); n = n + 1[m
[31m-    elseif p == "Y" then[m
[31m-      op = op + parse_imm(params[n], 20, 6, 0, false); n = n + 1[m
[31m-    elseif p == "Z" then[m
[31m-      op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1[m
[31m-    elseif p == "=" then[m
[31m-      op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo.[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-  end[m
[31m-  wputpos(pos, op)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_1"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local mode, n, s = parse_label(params[1], true)[m
[31m-  if mode == "EXT" then werror("bad label definition") end[m
[31m-  waction("LABEL_"..mode, n, s, 1)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-map_op[".long_*"] = function(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local n = tonumber(p)[m
[31m-    if not n then werror("bad immediate `"..p.."'") end[m
[31m-    if n < 0 then n = n + 2^32 end[m
[31m-    wputw(n)[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1])[m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION", num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = map_coreop })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex 3f267fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,419 +0,0 @@[m
[31m-/*[m
[31m-** DynASM PPC/PPC64 encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"ppc"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. */[m
[31m-enum {[m
[31m-  DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT,[m
[31m-  /* The following actions need a buffer position. */[m
[31m-  DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,[m
[31m-  /* The following actions also have an argument. */[m
[31m-  DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM_IMMSH,[m
[31m-  DASM__MAX[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_REL	0x15000000[m
[31m-#define DASM_S_UNDEF_LG		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned int *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    unsigned int ins = *p++;[m
[31m-    unsigned int action = (ins >> 16);[m
[31m-    if (action >= DASM__MAX) {[m
[31m-      ofs += 4;[m
[31m-    } else {[m
[31m-      int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0;[m
[31m-      switch (action) {[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      case DASM_SECTION:[m
[31m-	n = (ins & 255); CK(n < D->maxsection, RANGE_SEC);[m
[31m-	D->section = &D->sections[n]; goto stop;[m
[31m-      case DASM_ESC: p++; ofs += 4; break;[m
[31m-      case DASM_REL_EXT: break;[m
[31m-      case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break;[m
[31m-      case DASM_REL_LG:[m
[31m-	n = (ins & 2047) - 10; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl += 10; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG:[m
[31m-	pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos;[m
[31m-	}[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_IMM:[m
[31m-#ifdef DASM_CHECKS[m
[31m-	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	n >>= ((ins>>10)&31);[m
[31m-#ifdef DASM_CHECKS[m
[31m-	if (ins & 0x8000)[m
[31m-	  CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-	else[m
[31m-	  CK((n>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMMSH:[m
[31m-	CK((n >> 6) == 0, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_REL_EXT: break;[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;[m
[31m-	case DASM_REL_LG: case DASM_REL_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;[m
[31m-	case DASM_IMM: case DASM_IMMSH: pos++; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  char *base = (char *)buffer;[m
[31m-  unsigned int *cp = (unsigned int *)buffer;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: *cp++ = *p++; break;[m
[31m-	case DASM_REL_EXT:[m
[31m-	  n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1) - 4;[m
[31m-	  goto patchrel;[m
[31m-	case DASM_ALIGN:[m
[31m-	  ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000;[m
[31m-	  break;[m
[31m-	case DASM_REL_LG:[m
[31m-	  CK(n >= 0, UNDEF_LG);[m
[31m-	case DASM_REL_PC:[m
[31m-	  CK(n >= 0, UNDEF_PC);[m
[31m-	  n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base);[m
[31m-	patchrel:[m
[31m-	  CK((n & 3) == 0 &&[m
[31m-	      (((n+4) + ((ins & 2048) ? 0x00008000 : 0x02000000)) >>[m
[31m-	       ((ins & 2048) ? 16 : 26)) == 0, RANGE_REL);[m
[31m-	  cp[-1] |= ((n+4) & ((ins & 2048) ? 0x0000fffc: 0x03fffffc));[m
[31m-	  break;[m
[31m-	case DASM_LABEL_LG:[m
[31m-	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);[m
[31m-	  break;[m
[31m-	case DASM_LABEL_PC: break;[m
[31m-	case DASM_IMM:[m
[31m-	  cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31);[m
[31m-	  break;[m
[31m-	case DASM_IMMSH:[m
[31m-	  cp[-1] |= (ins & 1) ? ((n&31)<<11)|((n&32)>>4) : ((n&31)<<6)|(n&32);[m
[31m-	  break;[m
[31m-	default: *cp++ = ins; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != (char *)cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_ppc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_ppc.lua[m
[1mdeleted file mode 100644[m
[1mindex e2f704e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_ppc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1919 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM PPC/PPC64 module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m---[m
[31m--- Support for various extensions contributed by Caio Souza Oliveira.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	"ppc",[m
[31m-  description =	"DynASM PPC module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, setmetatable = assert, setmetatable[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local match, gmatch = _s.match, _s.gmatch[m
[31m-local concat, sort = table.concat, table.sort[m
[31m-local bit = bit or require("bit")[m
[31m-local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift[m
[31m-local tohex = bit.tohex[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  "STOP", "SECTION", "ESC", "REL_EXT",[m
[31m-  "ALIGN", "REL_LG", "LABEL_LG",[m
[31m-  "REL_PC", "LABEL_PC", "IMM", "IMMSH"[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number.[m
[31m-local map_action = {}[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  map_action[name] = n-1[m
[31m-end[m
[31m-[m
[31m--- Action list buffer.[m
[31m-local actlist = {}[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  if nn == 0 then nn = 1; actlist[0] = map_action.STOP end[m
[31m-  out:write("static const unsigned int ", name, "[", nn, "] = {\n")[m
[31m-  for i = 1,nn-1 do[m
[31m-    assert(out:write("0x", tohex(actlist[i]), ",\n"))[m
[31m-  end[m
[31m-  assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add word to action list.[m
[31m-local function wputxw(n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, val, a, num)[m
[31m-  local w = assert(map_action[action], "bad action name `"..action.."'")[m
[31m-  wputxw(w * 0x10000 + (val or 0))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  if #actlist == actargs[1] then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped word.[m
[31m-local function wputw(n)[m
[31m-  if n <= 0xffffff then waction("ESC") end[m
[31m-  wputxw(n)[m
[31m-end[m
[31m-[m
[31m--- Reserve position for word.[m
[31m-local function wpos()[m
[31m-  local pos = #actlist+1[m
[31m-  actlist[pos] = ""[m
[31m-  return pos[m
[31m-end[m
[31m-[m
[31m--- Store word to reserved position.[m
[31m-local function wputpos(pos, n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[pos] = n[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 20[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 2047 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  ", prefix, t[i], ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = 0[m
[31m-local map_extern_ = {}[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n > 2047 then werror("too many extern labels") end[m
[31m-  next_extern = n + 1[m
[31m-  t[name] = n[m
[31m-  map_extern_[n] = name[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write(format("  %s\n", map_extern_[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write("  \"", map_extern_[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-local map_archdef = { sp = "r1" } -- Ext. register name -> int. name.[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for Dt... macros).[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  if s == "r1" then return "sp" end[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-local map_cond = {[m
[31m-  lt = 0, gt = 1, eq = 2, so = 3,[m
[31m-  ge = 4, le = 5, ne = 6, ns = 7,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_op, op_template[m
[31m-[m
[31m-local function op_alias(opname, f)[m
[31m-  return function(params, nparams)[m
[31m-    if not params then return "-> "..opname:sub(1, -3) end[m
[31m-    f(params, nparams)[m
[31m-    op_template(params, map_op[opname], nparams)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Template strings for PPC instructions.[m
[31m-map_op = {[m
[31m-  tdi_3 =	"08000000ARI",[m
[31m-  twi_3 =	"0c000000ARI",[m
[31m-  mulli_3 =	"1c000000RRI",[m
[31m-  subfic_3 =	"20000000RRI",[m
[31m-  cmplwi_3 =	"28000000XRU",[m
[31m-  cmplwi_2 =	"28000000-RU",[m
[31m-  cmpldi_3 =	"28200000XRU",[m
[31m-  cmpldi_2 =	"28200000-RU",[m
[31m-  cmpwi_3 =	"2c000000XRI",[m
[31m-  cmpwi_2 =	"2c000000-RI",[m
[31m-  cmpdi_3 =	"2c200000XRI",[m
[31m-  cmpdi_2 =	"2c200000-RI",[m
[31m-  addic_3 =	"30000000RRI",[m
[31m-  ["addic._3"] = "34000000RRI",[m
[31m-  addi_3 =	"38000000RR0I",[m
[31m-  li_2 =	"38000000RI",[m
[31m-  la_2 =	"38000000RD",[m
[31m-  addis_3 =	"3c000000RR0I",[m
[31m-  lis_2 =	"3c000000RI",[m
[31m-  lus_2 =	"3c000000RU",[m
[31m-  bc_3 =	"40000000AAK",[m
[31m-  bcl_3 =	"40000001AAK",[m
[31m-  bdnz_1 =	"42000000K",[m
[31m-  bdz_1 =	"42400000K",[m
[31m-  sc_0 =	"44000000",[m
[31m-  b_1 =		"48000000J",[m
[31m-  bl_1 =	"48000001J",[m
[31m-  rlwimi_5 =	"50000000RR~AAA.",[m
[31m-  rlwinm_5 =	"54000000RR~AAA.",[m
[31m-  rlwnm_5 =	"5c000000RR~RAA.",[m
[31m-  ori_3 =	"60000000RR~U",[m
[31m-  nop_0 =	"60000000",[m
[31m-  oris_3 =	"64000000RR~U",[m
[31m-  xori_3 =	"68000000RR~U",[m
[31m-  xoris_3 =	"6c000000RR~U",[m
[31m-  ["andi._3"] =	"70000000RR~U",[m
[31m-  ["andis._3"] = "74000000RR~U",[m
[31m-  lwz_2 =	"80000000RD",[m
[31m-  lwzu_2 =	"84000000RD",[m
[31m-  lbz_2 =	"88000000RD",[m
[31m-  lbzu_2 =	"8c000000RD",[m
[31m-  stw_2 =	"90000000RD",[m
[31m-  stwu_2 =	"94000000RD",[m
[31m-  stb_2 =	"98000000RD",[m
[31m-  stbu_2 =	"9c000000RD",[m
[31m-  lhz_2 =	"a0000000RD",[m
[31m-  lhzu_2 =	"a4000000RD",[m
[31m-  lha_2 =	"a8000000RD",[m
[31m-  lhau_2 =	"ac000000RD",[m
[31m-  sth_2 =	"b0000000RD",[m
[31m-  sthu_2 =	"b4000000RD",[m
[31m-  lmw_2 =	"b8000000RD",[m
[31m-  stmw_2 =	"bc000000RD",[m
[31m-  lfs_2 =	"c0000000FD",[m
[31m-  lfsu_2 =	"c4000000FD",[m
[31m-  lfd_2 =	"c8000000FD",[m
[31m-  lfdu_2 =	"cc000000FD",[m
[31m-  stfs_2 =	"d0000000FD",[m
[31m-  stfsu_2 =	"d4000000FD",[m
[31m-  stfd_2 =	"d8000000FD",[m
[31m-  stfdu_2 =	"dc000000FD",[m
[31m-  ld_2 =	"e8000000RD", -- NYI: displacement must be divisible by 4.[m
[31m-  ldu_2 =	"e8000001RD",[m
[31m-  lwa_2 =	"e8000002RD",[m
[31m-  std_2 =	"f8000000RD",[m
[31m-  stdu_2 =	"f8000001RD",[m
[31m-[m
[31m-  subi_3 =	op_alias("addi_3", function(p) p[3] = "-("..p[3]..")" end),[m
[31m-  subis_3 =	op_alias("addis_3", function(p) p[3] = "-("..p[3]..")" end),[m
[31m-  subic_3 =	op_alias("addic_3", function(p) p[3] = "-("..p[3]..")" end),[m
[31m-  ["subic._3"] = op_alias("addic._3", function(p) p[3] = "-("..p[3]..")" end),[m
[31m-[m
[31m-  rotlwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[4] = "0"; p[5] = "31"[m
[31m-  end),[m
[31m-  rotrwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[3] = "32-("..p[3]..")"; p[4] = "0"; p[5] = "31"[m
[31m-  end),[m
[31m-  rotlw_3 =	op_alias("rlwnm_5", function(p)[m
[31m-    p[4] = "0"; p[5] = "31"[m
[31m-  end),[m
[31m-  slwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[5] = "31-("..p[3]..")"; p[4] = "0"[m
[31m-  end),[m
[31m-  srwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[4] = p[3]; p[3] = "32-("..p[3]..")"; p[5] = "31"[m
[31m-  end),[m
[31m-  clrlwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[4] = p[3]; p[3] = "0"; p[5] = "31"[m
[31m-  end),[m
[31m-  clrrwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[5] = "31-("..p[3]..")"; p[3] = "0"; p[4] = "0"[m
[31m-  end),[m
[31m-[m
[31m-  -- Primary opcode 4:[m
[31m-  mulhhwu_3 =		"10000010RRR.",[m
[31m-  machhwu_3 =		"10000018RRR.",[m
[31m-  mulhhw_3 =		"10000050RRR.",[m
[31m-  nmachhw_3 =		"1000005cRRR.",[m
[31m-  machhwsu_3 =		"10000098RRR.",[m
[31m-  machhws_3 =		"100000d8RRR.",[m
[31m-  nmachhws_3 =		"100000dcRRR.",[m
[31m-  mulchwu_3 =		"10000110RRR.",[m
[31m-  macchwu_3 =		"10000118RRR.",[m
[31m-  mulchw_3 =		"10000150RRR.",[m
[31m-  macchw_3 =		"10000158RRR.",[m
[31m-  nmacchw_3 =		"1000015cRRR.",[m
[31m-  macchwsu_3 =		"10000198RRR.",[m
[31m-  macchws_3 =		"100001d8RRR.",[m
[31m-  nmacchws_3 =		"100001dcRRR.",[m
[31m-  mullhw_3 =		"10000350RRR.",[m
[31m-  maclhw_3 =		"10000358RRR.",[m
[31m-  nmaclhw_3 =		"1000035cRRR.",[m
[31m-  maclhwsu_3 =		"10000398RRR.",[m
[31m-  maclhws_3 =		"100003d8RRR.",[m
[31m-  nmaclhws_3 =		"100003dcRRR.",[m
[31m-  machhwuo_3 =		"10000418RRR.",[m
[31m-  nmachhwo_3 =		"1000045cRRR.",[m
[31m-  machhwsuo_3 =		"10000498RRR.",[m
[31m-  machhwso_3 =		"100004d8RRR.",[m
[31m-  nmachhwso_3 =		"100004dcRRR.",[m
[31m-  macchwuo_3 =		"10000518RRR.",[m
[31m-  macchwo_3 =		"10000558RRR.",[m
[31m-  nmacchwo_3 =		"1000055cRRR.",[m
[31m-  macchwsuo_3 =		"10000598RRR.",[m
[31m-  macchwso_3 =		"100005d8RRR.",[m
[31m-  nmacchwso_3 =		"100005dcRRR.",[m
[31m-  maclhwo_3 =		"10000758RRR.",[m
[31m-  nmaclhwo_3 =		"1000075cRRR.",[m
[31m-  maclhwsuo_3 =		"10000798RRR.",[m
[31m-  maclhwso_3 =		"100007d8RRR.",[m
[31m-  nmaclhwso_3 =		"100007dcRRR.",[m
[31m-[m
[31m-  vaddubm_3 =		"10000000VVV",[m
[31m-  vmaxub_3 =		"10000002VVV",[m
[31m-  vrlb_3 =		"10000004VVV",[m
[31m-  vcmpequb_3 =		"10000006VVV",[m
[31m-  vmuloub_3 =		"10000008VVV",[m
[31m-  vaddfp_3 =		"1000000aVVV",[m
[31m-  vmrghb_3 =		"1000000cVVV",[m
[31m-  vpkuhum_3 =		"1000000eVVV",[m
[31m-  vmhaddshs_4 =		"10000020VVVV",[m
[31m-  vmhraddshs_4 =	"10000021VVVV",[m
[31m-  vmladduhm_4 =		"10000022VVVV",[m
[31m-  vmsumubm_4 =		"10000024VVVV",[m
[31m-  vmsummbm_4 =		"10000025VVVV",[m
[31m-  vmsumuhm_4 =		"10000026VVVV",[m
[31m-  vmsumuhs_4 =		"10000027VVVV",[m
[31m-  vmsumshm_4 =		"10000028VVVV",[m
[31m-  vmsumshs_4 =		"10000029VVVV",[m
[31m-  vsel_4 =		"1000002aVVVV",[m
[31m-  vperm_4 =		"1000002bVVVV",[m
[31m-  vsldoi_4 =		"1000002cVVVP",[m
[31m-  vpermxor_4 =		"1000002dVVVV",[m
[31m-  vmaddfp_4 =		"1000002eVVVV~",[m
[31m-  vnmsubfp_4 =		"1000002fVVVV~",[m
[31m-  vaddeuqm_4 =		"1000003cVVVV",[m
[31m-  vaddecuq_4 =		"1000003dVVVV",[m
[31m-  vsubeuqm_4 =		"1000003eVVVV",[m
[31m-  vsubecuq_4 =		"1000003fVVVV",[m
[31m-  vadduhm_3 =		"10000040VVV",[m
[31m-  vmaxuh_3 =		"10000042VVV",[m
[31m-  vrlh_3 =		"10000044VVV",[m
[31m-  vcmpequh_3 =		"10000046VVV",[m
[31m-  vmulouh_3 =		"10000048VVV",[m
[31m-  vsubfp_3 =		"1000004aVVV",[m
[31m-  vmrghh_3 =		"1000004cVVV",[m
[31m-  vpkuwum_3 =		"1000004eVVV",[m
[31m-  vadduwm_3 =		"10000080VVV",[m
[31m-  vmaxuw_3 =		"10000082VVV",[m
[31m-  vrlw_3 =		"10000084VVV",[m
[31m-  vcmpequw_3 =		"10000086VVV",[m
[31m-  vmulouw_3 =		"10000088VVV",[m
[31m-  vmuluwm_3 =		"10000089VVV",[m
[31m-  vmrghw_3 =		"1000008cVVV",[m
[31m-  vpkuhus_3 =		"1000008eVVV",[m
[31m-  vaddudm_3 =		"100000c0VVV",[m
[31m-  vmaxud_3 =		"100000c2VVV",[m
[31m-  vrld_3 =		"100000c4VVV",[m
[31m-  vcmpeqfp_3 =		"100000c6VVV",[m
[31m-  vcmpequd_3 =		"100000c7VVV",[m
[31m-  vpkuwus_3 =		"100000ceVVV",[m
[31m-  vadduqm_3 =		"10000100VVV",[m
[31m-  vmaxsb_3 =		"10000102VVV",[m
[31m-  vslb_3 =		"10000104VVV",[m
[31m-  vmulosb_3 =		"10000108VVV",[m
[31m-  vrefp_2 =		"1000010aV-V",[m
[31m-  vmrglb_3 =		"1000010cVVV",[m
[31m-  vpkshus_3 =		"1000010eVVV",[m
[31m-  vaddcuq_3 =		"10000140VVV",[m
[31m-  vmaxsh_3 =		"10000142VVV",[m
[31m-  vslh_3 =		"10000144VVV",[m
[31m-  vmulosh_3 =		"10000148VVV",[m
[31m-  vrsqrtefp_2 =		"1000014aV-V",[m
[31m-  vmrglh_3 =		"1000014cVVV",[m
[31m-  vpkswus_3 =		"1000014eVVV",[m
[31m-  vaddcuw_3 =		"10000180VVV",[m
[31m-  vmaxsw_3 =		"10000182VVV",[m
[31m-  vslw_3 =		"10000184VVV",[m
[31m-  vmulosw_3 =		"10000188VVV",[m
[31m-  vexptefp_2 =		"1000018aV-V",[m
[31m-  vmrglw_3 =		"1000018cVVV",[m
[31m-  vpkshss_3 =		"1000018eVVV",[m
[31m-  vmaxsd_3 =		"100001c2VVV",[m
[31m-  vsl_3 =		"100001c4VVV",[m
[31m-  vcmpgefp_3 =		"100001c6VVV",[m
[31m-  vlogefp_2 =		"100001caV-V",[m
[31m-  vpkswss_3 =		"100001ceVVV",[m
[31m-  vadduhs_3 =		"10000240VVV",[m
[31m-  vminuh_3 =		"10000242VVV",[m
[31m-  vsrh_3 =		"10000244VVV",[m
[31m-  vcmpgtuh_3 =		"10000246VVV",[m
[31m-  vmuleuh_3 =		"10000248VVV",[m
[31m-  vrfiz_2 =		"1000024aV-V",[m
[31m-  vsplth_3 =		"1000024cVV3",[m
[31m-  vupkhsh_2 =		"1000024eV-V",[m
[31m-  vminuw_3 =		"10000282VVV",[m
[31m-  vminud_3 =		"100002c2VVV",[m
[31m-  vcmpgtud_3 =		"100002c7VVV",[m
[31m-  vrfim_2 =		"100002caV-V",[m
[31m-  vcmpgtsb_3 =		"10000306VVV",[m
[31m-  vcfux_3 =		"1000030aVVA~",[m
[31m-  vaddshs_3 =		"10000340VVV",[m
[31m-  vminsh_3 =		"10000342VVV",[m
[31m-  vsrah_3 =		"10000344VVV",[m
[31m-  vcmpgtsh_3 =		"10000346VVV",[m
[31m-  vmulesh_3 =		"10000348VVV",[m
[31m-  vcfsx_3 =		"1000034aVVA~",[m
[31m-  vspltish_2 =		"1000034cVS",[m
[31m-  vupkhpx_2 =		"1000034eV-V",[m
[31m-  vaddsws_3 =		"10000380VVV",[m
[31m-  vminsw_3 =		"10000382VVV",[m
[31m-  vsraw_3 =		"10000384VVV",[m
[31m-  vcmpgtsw_3 =		"10000386VVV",[m
[31m-  vmulesw_3 =		"10000388VVV",[m
[31m-  vctuxs_3 =		"1000038aVVA~",[m
[31m-  vspltisw_2 =		"1000038cVS",[m
[31m-  vminsd_3 =		"100003c2VVV",[m
[31m-  vsrad_3 =		"100003c4VVV",[m
[31m-  vcmpbfp_3 =		"100003c6VVV",[m
[31m-  vcmpgtsd_3 =		"100003c7VVV",[m
[31m-  vctsxs_3 =		"100003caVVA~",[m
[31m-  vupklpx_2 =		"100003ceV-V",[m
[31m-  vsububm_3 =		"10000400VVV",[m
[31m-  ["bcdadd._4"] =	"10000401VVVy.",[m
[31m-  vavgub_3 =		"10000402VVV",[m
[31m-  vand_3 =		"10000404VVV",[m
[31m-  ["vcmpequb._3"] =	"10000406VVV",[m
[31m-  vmaxfp_3 =		"1000040aVVV",[m
[31m-  vsubuhm_3 =		"10000440VVV",[m
[31m-  ["bcdsub._4"] =	"10000441VVVy.",[m
[31m-  vavguh_3 =		"10000442VVV",[m
[31m-  vandc_3 =		"10000444VVV",[m
[31m-  ["vcmpequh._3"] =	"10000446VVV",[m
[31m-  vminfp_3 =		"1000044aVVV",[m
[31m-  vpkudum_3 =		"1000044eVVV",[m
[31m-  vsubuwm_3 =		"10000480VVV",[m
[31m-  vavguw_3 =		"10000482VVV",[m
[31m-  vor_3 =		"10000484VVV",[m
[31m-  ["vcmpequw._3"] =	"10000486VVV",[m
[31m-  vpmsumw_3 =		"10000488VVV",[m
[31m-  ["vcmpeqfp._3"] =	"100004c6VVV",[m
[31m-  ["vcmpequd._3"] =	"100004c7VVV",[m
[31m-  vpkudus_3 =		"100004ceVVV",[m
[31m-  vavgsb_3 =		"10000502VVV",[m
[31m-  vavgsh_3 =		"10000542VVV",[m
[31m-  vorc_3 =		"10000544VVV",[m
[31m-  vbpermq_3 =		"1000054cVVV",[m
[31m-  vpksdus_3 =		"1000054eVVV",[m
[31m-  vavgsw_3 =		"10000582VVV",[m
[31m-  vsld_3 =		"100005c4VVV",[m
[31m-  ["vcmpgefp._3"] =	"100005c6VVV",[m
[31m-  vpksdss_3 =		"100005ceVVV",[m
[31m-  vsububs_3 =		"10000600VVV",[m
[31m-  mfvscr_1 =		"10000604V--",[m
[31m-  vsum4ubs_3 =		"10000608VVV",[m
[31m-  vsubuhs_3 =		"10000640VVV",[m
[31m-  mtvscr_1 =		"10000644--V",[m
[31m-  ["vcmpgtuh._3"] =	"10000646VVV",[m
[31m-  vsum4shs_3 =		"10000648VVV",[m
[31m-  vupkhsw_2 =		"1000064eV-V",[m
[31m-  vsubuws_3 =		"10000680VVV",[m
[31m-  vshasigmaw_4 =	"10000682VVYp",[m
[31m-  veqv_3 =		"10000684VVV",[m
[31m-  vsum2sws_3 =		"10000688VVV",[m
[31m-  vmrgow_3 =		"1000068cVVV",[m
[31m-  vshasigmad_4 =	"100006c2VVYp",[m
[31m-  vsrd_3 =		"100006c4VVV",[m
[31m-  ["vcmpgtud._3"] =	"100006c7VVV",[m
[31m-  vupklsw_2 =		"100006ceV-V",[m
[31m-  vupkslw_2 =		"100006ceV-V",[m
[31m-  vsubsbs_3 =		"10000700VVV",[m
[31m-  vclzb_2 =		"10000702V-V",[m
[31m-  vpopcntb_2 =		"10000703V-V",[m
[31m-  ["vcmpgtsb._3"] =	"10000706VVV",[m
[31m-  vsum4sbs_3 =		"10000708VVV",[m
[31m-  vsubshs_3 =		"10000740VVV",[m
[31m-  vclzh_2 =		"10000742V-V",[m
[31m-  vpopcnth_2 =		"10000743V-V",[m
[31m-  ["vcmpgtsh._3"] =	"10000746VVV",[m
[31m-  vsubsws_3 =		"10000780VVV",[m
[31m-  vclzw_2 =		"10000782V-V",[m
[31m-  vpopcntw_2 =		"10000783V-V",[m
[31m-  ["vcmpgtsw._3"] =	"10000786VVV",[m
[31m-  vsumsws_3 =		"10000788VVV",[m
[31m-  vmrgew_3 =		"1000078cVVV",[m
[31m-  vclzd_2 =		"100007c2V-V",[m
[31m-  vpopcntd_2 =		"100007c3V-V",[m
[31m-  ["vcmpbfp._3"] =	"100007c6VVV",[m
[31m-  ["vcmpgtsd._3"] =	"100007c7VVV",[m
[31m-[m
[31m-  -- Primary opcode 19:[m
[31m-  mcrf_2 =	"4c000000XX",[m
[31m-  isync_0 =	"4c00012c",[m
[31m-  crnor_3 =	"4c000042CCC",[m
[31m-  crnot_2 =	"4c000042CC=",[m
[31m-  crandc_3 =	"4c000102CCC",[m
[31m-  crxor_3 =	"4c000182CCC",[m
[31m-  crclr_1 =	"4c000182C==",[m
[31m-  crnand_3 =	"4c0001c2CCC",[m
[31m-  crand_3 =	"4c000202CCC",[m
[31m-  creqv_3 =	"4c000242CCC",[m
[31m-  crset_1 =	"4c000242C==",[m
[31m-  crorc_3 =	"4c000342CCC",[m
[31m-  cror_3 =	"4c000382CCC",[m
[31m-  crmove_2 =	"4c000382CC=",[m
[31m-  bclr_2 =	"4c000020AA",[m
[31m-  bclrl_2 =	"4c000021AA",[m
[31m-  bcctr_2 =	"4c000420AA",[m
[31m-  bcctrl_2 =	"4c000421AA",[m
[31m-  bctar_2 =	"4c000460AA",[m
[31m-  bctarl_2 =	"4c000461AA",[m
[31m-  blr_0 =	"4e800020",[m
[31m-  blrl_0 =	"4e800021",[m
[31m-  bctr_0 =	"4e800420",[m
[31m-  bctrl_0 =	"4e800421",[m
[31m-[m
[31m-  -- Primary opcode 31:[m
[31m-  cmpw_3 =	"7c000000XRR",[m
[31m-  cmpw_2 =	"7c000000-RR",[m
[31m-  cmpd_3 =	"7c200000XRR",[m
[31m-  cmpd_2 =	"7c200000-RR",[m
[31m-  tw_3 =	"7c000008ARR",[m
[31m-  lvsl_3 =	"7c00000cVRR",[m
[31m-  subfc_3 =	"7c000010RRR.",[m
[31m-  subc_3 =	"7c000010RRR~.",[m
[31m-  mulhdu_3 =	"7c000012RRR.",[m
[31m-  addc_3 =	"7c000014RRR.",[m
[31m-  mulhwu_3 =	"7c000016RRR.",[m
[31m-  isel_4 =	"7c00001eRRRC",[m
[31m-  isellt_3 =	"7c00001eRRR",[m
[31m-  iselgt_3 =	"7c00005eRRR",[m
[31m-  iseleq_3 =	"7c00009eRRR",[m
[31m-  mfcr_1 =	"7c000026R",[m
[31m-  mfocrf_2 =	"7c100026RG",[m
[31m-  mtcrf_2 =	"7c000120GR",[m
[31m-  mtocrf_2 =	"7c100120GR",[m
[31m-  lwarx_3 =	"7c000028RR0R",[m
[31m-  ldx_3 =	"7c00002aRR0R",[m
[31m-  lwzx_3 =	"7c00002eRR0R",[m
[31m-  slw_3 =	"7c000030RR~R.",[m
[31m-  cntlzw_2 =	"7c000034RR~",[m
[31m-  sld_3 =	"7c000036RR~R.",[m
[31m-  and_3 =	"7c000038RR~R.",[m
[31m-  cmplw_3 =	"7c000040XRR",[m
[31m-  cmplw_2 =	"7c000040-RR",[m
[31m-  cmpld_3 =	"7c200040XRR",[m
[31m-  cmpld_2 =	"7c200040-RR",[m
[31m-  lvsr_3 =	"7c00004cVRR",[m
[31m-  subf_3 =	"7c000050RRR.",[m
[31m-  sub_3 =	"7c000050RRR~.",[m
[31m-  lbarx_3 =	"7c000068RR0R",[m
[31m-  ldux_3 =	"7c00006aRR0R",[m
[31m-  dcbst_2 =	"7c00006c-RR",[m
[31m-  lwzux_3 =	"7c00006eRR0R",[m
[31m-  cntlzd_2 =	"7c000074RR~",[m
[31m-  andc_3 =	"7c000078RR~R.",[m
[31m-  td_3 =	"7c000088ARR",[m
[31m-  lvewx_3 =	"7c00008eVRR",[m
[31m-  mulhd_3 =	"7c000092RRR.",[m
[31m-  addg6s_3 =	"7c000094RRR",[m
[31m-  mulhw_3 =	"7c000096RRR.",[m
[31m-  dlmzb_3 =	"7c00009cRR~R.",[m
[31m-  ldarx_3 =	"7c0000a8RR0R",[m
[31m-  dcbf_2 =	"7c0000ac-RR",[m
[31m-  lbzx_3 =	"7c0000aeRR0R",[m
[31m-  lvx_3 =	"7c0000ceVRR",[m
[31m-  neg_2 =	"7c0000d0RR.",[m
[31m-  lharx_3 =	"7c0000e8RR0R",[m
[31m-  lbzux_3 =	"7c0000eeRR0R",[m
[31m-  popcntb_2 =	"7c0000f4RR~",[m
[31m-  not_2 =	"7c0000f8RR~%.",[m
[31m-  nor_3 =	"7c0000f8RR~R.",[m
[31m-  stvebx_3 =	"7c00010eVRR",[m
[31m-  subfe_3 =	"7c000110RRR.",[m
[31m-  sube_3 =	"7c000110RRR~.",[m
[31m-  adde_3 =	"7c000114RRR.",[m
[31m-  stdx_3 =	"7c00012aRR0R",[m
[31m-  ["stwcx._3"] =	"7c00012dRR0R.",[m
[31m-  stwx_3 =	"7c00012eRR0R",[m
[31m-  prtyw_2 =	"7c000134RR~",[m
[31m-  stvehx_3 =	"7c00014eVRR",[m
[31m-  stdux_3 =	"7c00016aRR0R",[m
[31m-  ["stqcx._3"] =	"7c00016dR:R0R.",[m
[31m-  stwux_3 =	"7c00016eRR0R",[m
[31m-  prtyd_2 =	"7c000174RR~",[m
[31m-  stvewx_3 =	"7c00018eVRR",[m
[31m-  subfze_2 =	"7c000190RR.",[m
[31m-  addze_2 =	"7c000194RR.",[m
[31m-  ["stdcx._3"] =	"7c0001adRR0R.",[m
[31m-  stbx_3 =	"7c0001aeRR0R",[m
[31m-  stvx_3 =	"7c0001ceVRR",[m
[31m-  subfme_2 =	"7c0001d0RR.",[m
[31m-  mulld_3 =	"7c0001d2RRR.",[m
[31m-  addme_2 =	"7c0001d4RR.",[m
[31m-  mullw_3 =	"7c0001d6RRR.",[m
[31m-  dcbtst_2 =	"7c0001ec-RR",[m
[31m-  stbux_3 =	"7c0001eeRR0R",[m
[31m-  bpermd_3 =	"7c0001f8RR~R",[m
[31m-  lvepxl_3 =	"7c00020eVRR",[m
[31m-  add_3 =	"7c000214RRR.",[m
[31m-  lqarx_3 =	"7c000228R:R0R",[m
[31m-  dcbt_2 =	"7c00022c-RR",[m
[31m-  lhzx_3 =	"7c00022eRR0R",[m
[31m-  cdtbcd_2 =	"7c000234RR~",[m
[31m-  eqv_3 =	"7c000238RR~R.",[m
[31m-  lvepx_3 =	"7c00024eVRR",[m
[31m-  eciwx_3 =	"7c00026cRR0R",[m
[31m-  lhzux_3 =	"7c00026eRR0R",[m
[31m-  cbcdtd_2 =	"7c000274RR~",[m
[31m-  xor_3 =	"7c000278RR~R.",[m
[31m-  mfspefscr_1 =	"7c0082a6R",[m
[31m-  mfxer_1 =	"7c0102a6R",[m
[31m-  mflr_1 =	"7c0802a6R",[m
[31m-  mfctr_1 =	"7c0902a6R",[m
[31m-  lwax_3 =	"7c0002aaRR0R",[m
[31m-  lhax_3 =	"7c0002aeRR0R",[m
[31m-  mftb_1 =	"7c0c42e6R",[m
[31m-  mftbu_1 =	"7c0d42e6R",[m
[31m-  lvxl_3 =	"7c0002ceVRR",[m
[31m-  lwaux_3 =	"7c0002eaRR0R",[m
[31m-  lhaux_3 =	"7c0002eeRR0R",[m
[31m-  popcntw_2 =	"7c0002f4RR~",[m
[31m-  divdeu_3 =	"7c000312RRR.",[m
[31m-  divweu_3 =	"7c000316RRR.",[m
[31m-  sthx_3 =	"7c00032eRR0R",[m
[31m-  orc_3 =	"7c000338RR~R.",[m
[31m-  ecowx_3 =	"7c00036cRR0R",[m
[31m-  sthux_3 =	"7c00036eRR0R",[m
[31m-  or_3 =	"7c000378RR~R.",[m
[31m-  mr_2 =	"7c000378RR~%.",[m
[31m-  divdu_3 =	"7c000392RRR.",[m
[31m-  divwu_3 =	"7c000396RRR.",[m
[31m-  mtspefscr_1 =	"7c0083a6R",[m
[31m-  mtxer_1 =	"7c0103a6R",[m
[31m-  mtlr_1 =	"7c0803a6R",[m
[31m-  mtctr_1 =	"7c0903a6R",[m
[31m-  dcbi_2 =	"7c0003ac-RR",[m
[31m-  nand_3 =	"7c0003b8RR~R.",[m
[31m-  dsn_2 =	"7c0003c6-RR",[m
[31m-  stvxl_3 =	"7c0003ceVRR",[m
[31m-  divd_3 =	"7c0003d2RRR.",[m
[31m-  divw_3 =	"7c0003d6RRR.",[m
[31m-  popcntd_2 =	"7c0003f4RR~",[m
[31m-  cmpb_3 =	"7c0003f8RR~R.",[m
[31m-  mcrxr_1 =	"7c000400X",[m
[31m-  lbdx_3 =	"7c000406RRR",[m
[31m-  subfco_3 =	"7c000410RRR.",[m
[31m-  subco_3 =	"7c000410RRR~.",[m
[31m-  addco_3 =	"7c000414RRR.",[m
[31m-  ldbrx_3 =	"7c000428RR0R",[m
[31m-  lswx_3 =	"7c00042aRR0R",[m
[31m-  lwbrx_3 =	"7c00042cRR0R",[m
[31m-  lfsx_3 =	"7c00042eFR0R",[m
[31m-  srw_3 =	"7c000430RR~R.",[m
[31m-  srd_3 =	"7c000436RR~R.",[m
[31m-  lhdx_3 =	"7c000446RRR",[m
[31m-  subfo_3 =	"7c000450RRR.",[m
[31m-  subo_3 =	"7c000450RRR~.",[m
[31m-  lfsux_3 =	"7c00046eFR0R",[m
[31m-  lwdx_3 =	"7c000486RRR",[m
[31m-  lswi_3 =	"7c0004aaRR0A",[m
[31m-  sync_0 =	"7c0004ac",[m
[31m-  lwsync_0 =	"7c2004ac",[m
[31m-  ptesync_0 =	"7c4004ac",[m
[31m-  lfdx_3 =	"7c0004aeFR0R",[m
[31m-  lddx_3 =	"7c0004c6RRR",[m
[31m-  nego_2 =	"7c0004d0RR.",[m
[31m-  lfdux_3 =	"7c0004eeFR0R",[m
[31m-  stbdx_3 =	"7c000506RRR",[m
[31m-  subfeo_3 =	"7c000510RRR.",[m
[31m-  subeo_3 =	"7c000510RRR~.",[m
[31m-  addeo_3 =	"7c000514RRR.",[m
[31m-  stdbrx_3 =	"7c000528RR0R",[m
[31m-  stswx_3 =	"7c00052aRR0R",[m
[31m-  stwbrx_3 =	"7c00052cRR0R",[m
[31m-  stfsx_3 =	"7c00052eFR0R",[m
[31m-  sthdx_3 =	"7c000546RRR",[m
[31m-  ["stbcx._3"] =	"7c00056dRRR",[m
[31m-  stfsux_3 =	"7c00056eFR0R",[m
[31m-  stwdx_3 =	"7c000586RRR",[m
[31m-  subfzeo_2 =	"7c000590RR.",[m
[31m-  addzeo_2 =	"7c000594RR.",[m
[31m-  stswi_3 =	"7c0005aaRR0A",[m
[31m-  ["sthcx._3"] =	"7c0005adRRR",[m
[31m-  stfdx_3 =	"7c0005aeFR0R",[m
[31m-  stddx_3 =	"7c0005c6RRR",[m
[31m-  subfmeo_2 =	"7c0005d0RR.",[m
[31m-  mulldo_3 =	"7c0005d2RRR.",[m
[31m-  addmeo_2 =	"7c0005d4RR.",[m
[31m-  mullwo_3 =	"7c0005d6RRR.",[m
[31m-  dcba_2 =	"7c0005ec-RR",[m
[31m-  stfdux_3 =	"7c0005eeFR0R",[m
[31m-  stvepxl_3 =	"7c00060eVRR",[m
[31m-  addo_3 =	"7c000614RRR.",[m
[31m-  lhbrx_3 =	"7c00062cRR0R",[m
[31m-  lfdpx_3 =	"7c00062eF:RR",[m
[31m-  sraw_3 =	"7c000630RR~R.",[m
[31m-  srad_3 =	"7c000634RR~R.",[m
[31m-  lfddx_3 =	"7c000646FRR",[m
[31m-  stvepx_3 =	"7c00064eVRR",[m
[31m-  srawi_3 =	"7c000670RR~A.",[m
[31m-  sradi_3 =	"7c000674RR~H.",[m
[31m-  eieio_0 =	"7c0006ac",[m
[31m-  lfiwax_3 =	"7c0006aeFR0R",[m
[31m-  divdeuo_3 =	"7c000712RRR.",[m
[31m-  divweuo_3 =	"7c000716RRR.",[m
[31m-  sthbrx_3 =	"7c00072cRR0R",[m
[31m-  stfdpx_3 =	"7c00072eF:RR",[m
[31m-  extsh_2 =	"7c000734RR~.",[m
[31m-  stfddx_3 =	"7c000746FRR",[m
[31m-  divdeo_3 =	"7c000752RRR.",[m
[31m-  divweo_3 =	"7c000756RRR.",[m
[31m-  extsb_2 =	"7c000774RR~.",[m
[31m-  divduo_3 =	"7c000792RRR.",[m
[31m-  divwou_3 =	"7c000796RRR.",[m
[31m-  icbi_2 =	"7c0007ac-RR",[m
[31m-  stfiwx_3 =	"7c0007aeFR0R",[m
[31m-  extsw_2 =	"7c0007b4RR~.",[m
[31m-  divdo_3 =	"7c0007d2RRR.",[m
[31m-  divwo_3 =	"7c0007d6RRR.",[m
[31m-  dcbz_2 =	"7c0007ec-RR",[m
[31m-[m
[31m-  ["tbegin._1"] =	"7c00051d1",[m
[31m-  ["tbegin._0"] =	"7c00051d",[m
[31m-  ["tend._1"] =		"7c00055dY",[m
[31m-  ["tend._0"] =		"7c00055d",[m
[31m-  ["tendall._0"] =	"7e00055d",[m
[31m-  tcheck_1 =		"7c00059cX",[m
[31m-  ["tsr._1"] =		"7c0005dd1",[m
[31m-  ["tsuspend._0"] =	"7c0005dd",[m
[31m-  ["tresume._0"] =	"7c2005dd",[m
[31m-  ["tabortwc._3"] =	"7c00061dARR",[m
[31m-  ["tabortdc._3"] =	"7c00065dARR",[m
[31m-  ["tabortwci._3"] =	"7c00069dARS",[m
[31m-  ["tabortdci._3"] =	"7c0006ddARS",[m
[31m-  ["tabort._1"] =	"7c00071d-R-",[m
[31m-  ["treclaim._1"] =	"7c00075d-R",[m
[31m-  ["trechkpt._0"] =	"7c0007dd",[m
[31m-[m
[31m-  lxsiwzx_3 =	"7c000018QRR",[m
[31m-  lxsiwax_3 =	"7c000098QRR",[m
[31m-  mfvsrd_2 =	"7c000066-Rq",[m
[31m-  mfvsrwz_2 =	"7c0000e6-Rq",[m
[31m-  stxsiwx_3 =	"7c000118QRR",[m
[31m-  mtvsrd_2 =	"7c000166QR",[m
[31m-  mtvsrwa_2 =	"7c0001a6QR",[m
[31m-  lxvdsx_3 =	"7c000298QRR",[m
[31m-  lxsspx_3 =	"7c000418QRR",[m
[31m-  lxsdx_3 =	"7c000498QRR",[m
[31m-  stxsspx_3 =	"7c000518QRR",[m
[31m-  stxsdx_3 =	"7c000598QRR",[m
[31m-  lxvw4x_3 =	"7c000618QRR",[m
[31m-  lxvd2x_3 =	"7c000698QRR",[m
[31m-  stxvw4x_3 =	"7c000718QRR",[m
[31m-  stxvd2x_3 =	"7c000798QRR",[m
[31m-[m
[31m-  -- Primary opcode 30:[m
[31m-  rldicl_4 =	"78000000RR~HM.",[m
[31m-  rldicr_4 =	"78000004RR~HM.",[m
[31m-  rldic_4 =	"78000008RR~HM.",[m
[31m-  rldimi_4 =	"7800000cRR~HM.",[m
[31m-  rldcl_4 =	"78000010RR~RM.",[m
[31m-  rldcr_4 =	"78000012RR~RM.",[m
[31m-[m
[31m-  rotldi_3 =	op_alias("rldicl_4", function(p)[m
[31m-    p[4] = "0"[m
[31m-  end),[m
[31m-  rotrdi_3 =	op_alias("rldicl_4", function(p)[m
[31m-    p[3] = "64-("..p[3]..")"; p[4] = "0"[m
[31m-  end),[m
[31m-  rotld_3 =	op_alias("rldcl_4", function(p)[m
[31m-    p[4] = "0"[m
[31m-  end),[m
[31m-  sldi_3 =	op_alias("rldicr_4", function(p)[m
[31m-    p[4] = "63-("..p[3]..")"[m
[31m-  end),[m
[31m-  srdi_3 =	op_alias("rldicl_4", function(p)[m
[31m-    p[4] = p[3]; p[3] = "64-("..p[3]..")"[m
[31m-  end),[m
[31m-  clrldi_3 =	op_alias("rldicl_4", function(p)[m
[31m-    p[4] = p[3]; p[3] = "0"[m
[31m-  end),[m
[31m-  clrrdi_3 =	op_alias("rldicr_4", function(p)[m
[31m-    p[4] = "63-("..p[3]..")"; p[3] = "0"[m
[31m-  end),[m
[31m-[m
[31m-  -- Primary opcode 56:[m
[31m-  lq_2 =	"e0000000R:D", -- NYI: displacement must be divisible by 8.[m
[31m-[m
[31m-  -- Primary opcode 57:[m
[31m-  lfdp_2 =	"e4000000F:D", -- NYI: displacement must be divisible by 4.[m
[31m-[m
[31m-  -- Primary opcode 59:[m
[31m-  fdivs_3 =	"ec000024FFF.",[m
[31m-  fsubs_3 =	"ec000028FFF.",[m
[31m-  fadds_3 =	"ec00002aFFF.",[m
[31m-  fsqrts_2 =	"ec00002cF-F.",[m
[31m-  fres_2 =	"ec000030F-F.",[m
[31m-  fmuls_3 =	"ec000032FF-F.",[m
[31m-  frsqrtes_2 =	"ec000034F-F.",[m
[31m-  fmsubs_4 =	"ec000038FFFF~.",[m
[31m-  fmadds_4 =	"ec00003aFFFF~.",[m
[31m-  fnmsubs_4 =	"ec00003cFFFF~.",[m
[31m-  fnmadds_4 =	"ec00003eFFFF~.",[m
[31m-  fcfids_2 =	"ec00069cF-F.",[m
[31m-  fcfidus_2 =	"ec00079cF-F.",[m
[31m-[m
[31m-  dadd_3 =	"ec000004FFF.",[m
[31m-  dqua_4 =	"ec000006FFFZ.",[m
[31m-  dmul_3 =	"ec000044FFF.",[m
[31m-  drrnd_4 =	"ec000046FFFZ.",[m
[31m-  dscli_3 =	"ec000084FF6.",[m
[31m-  dquai_4 =	"ec000086SF~FZ.",[m
[31m-  dscri_3 =	"ec0000c4FF6.",[m
[31m-  drintx_4 =	"ec0000c61F~FZ.",[m
[31m-  dcmpo_3 =	"ec000104XFF",[m
[31m-  dtstex_3 =	"ec000144XFF",[m
[31m-  dtstdc_3 =	"ec000184XF6",[m
[31m-  dtstdg_3 =	"ec0001c4XF6",[m
[31m-  drintn_4 =	"ec0001c61F~FZ.",[m
[31m-  dctdp_2 =	"ec000204F-F.",[m
[31m-  dctfix_2 =	"ec000244F-F.",[m
[31m-  ddedpd_3 =	"ec000284ZF~F.",[m
[31m-  dxex_2 =	"ec0002c4F-F.",[m
[31m-  dsub_3 =	"ec000404FFF.",[m
[31m-  ddiv_3 =	"ec000444FFF.",[m
[31m-  dcmpu_3 =	"ec000504XFF",[m
[31m-  dtstsf_3 =	"ec000544XFF",[m
[31m-  drsp_2 =	"ec000604F-F.",[m
[31m-  dcffix_2 =	"ec000644F-F.",[m
[31m-  denbcd_3 =	"ec000684YF~F.",[m
[31m-  diex_3 =	"ec0006c4FFF.",[m
[31m-[m
[31m-  -- Primary opcode 60:[m
[31m-  xsaddsp_3 =		"f0000000QQQ",[m
[31m-  xsmaddasp_3 =		"f0000008QQQ",[m
[31m-  xxsldwi_4 =		"f0000010QQQz",[m
[31m-  xsrsqrtesp_2 =	"f0000028Q-Q",[m
[31m-  xssqrtsp_2 =		"f000002cQ-Q",[m
[31m-  xxsel_4 =		"f0000030QQQQ",[m
[31m-  xssubsp_3 =		"f0000040QQQ",[m
[31m-  xsmaddmsp_3 =		"f0000048QQQ",[m
[31m-  xxpermdi_4 =		"f0000050QQQz",[m
[31m-  xsresp_2 =		"f0000068Q-Q",[m
[31m-  xsmulsp_3 =		"f0000080QQQ",[m
[31m-  xsmsubasp_3 =		"f0000088QQQ",[m
[31m-  xxmrghw_3 =		"f0000090QQQ",[m
[31m-  xsdivsp_3 =		"f00000c0QQQ",[m
[31m-  xsmsubmsp_3 =		"f00000c8QQQ",[m
[31m-  xsadddp_3 =		"f0000100QQQ",[m
[31m-  xsmaddadp_3 =		"f0000108QQQ",[m
[31m-  xscmpudp_3 =		"f0000118XQQ",[m
[31m-  xscvdpuxws_2 =	"f0000120Q-Q",[m
[31m-  xsrdpi_2 =		"f0000124Q-Q",[m
[31m-  xsrsqrtedp_2 =	"f0000128Q-Q",[m
[31m-  xssqrtdp_2 =		"f000012cQ-Q",[m
[31m-  xssubdp_3 =		"f0000140QQQ",[m
[31m-  xsmaddmdp_3 =		"f0000148QQQ",[m
[31m-  xscmpodp_3 =		"f0000158XQQ",[m
[31m-  xscvdpsxws_2 =	"f0000160Q-Q",[m
[31m-  xsrdpiz_2 =		"f0000164Q-Q",[m
[31m-  xsredp_2 =		"f0000168Q-Q",[m
[31m-  xsmuldp_3 =		"f0000180QQQ",[m
[31m-  xsmsubadp_3 =		"f0000188QQQ",[m
[31m-  xxmrglw_3 =		"f0000190QQQ",[m
[31m-  xsrdpip_2 =		"f00001a4Q-Q",[m
[31m-  xstsqrtdp_2 =		"f00001a8X-Q",[m
[31m-  xsrdpic_2 =		"f00001acQ-Q",[m
[31m-  xsdivdp_3 =		"f00001c0QQQ",[m
[31m-  xsmsubmdp_3 =		"f00001c8QQQ",[m
[31m-  xsrdpim_2 =		"f00001e4Q-Q",[m
[31m-  xstdivdp_3 =		"f00001e8XQQ",[m
[31m-  xvaddsp_3 =		"f0000200QQQ",[m
[31m-  xvmaddasp_3 =		"f0000208QQQ",[m
[31m-  xvcmpeqsp_3 =		"f0000218QQQ",[m
[31m-  xvcvspuxws_2 =	"f0000220Q-Q",[m
[31m-  xvrspi_2 =		"f0000224Q-Q",[m
[31m-  xvrsqrtesp_2 =	"f0000228Q-Q",[m
[31m-  xvsqrtsp_2 =		"f000022cQ-Q",[m
[31m-  xvsubsp_3 =		"f0000240QQQ",[m
[31m-  xvmaddmsp_3 =		"f0000248QQQ",[m
[31m-  xvcmpgtsp_3 =		"f0000258QQQ",[m
[31m-  xvcvspsxws_2 =	"f0000260Q-Q",[m
[31m-  xvrspiz_2 =		"f0000264Q-Q",[m
[31m-  xvresp_2 =		"f0000268Q-Q",[m
[31m-  xvmulsp_3 =		"f0000280QQQ",[m
[31m-  xvmsubasp_3 =		"f0000288QQQ",[m
[31m-  xxspltw_3 =		"f0000290QQg~",[m
[31m-  xvcmpgesp_3 =		"f0000298QQQ",[m
[31m-  xvcvuxwsp_2 =		"f00002a0Q-Q",[m
[31m-  xvrspip_2 =		"f00002a4Q-Q",[m
[31m-  xvtsqrtsp_2 =		"f00002a8X-Q",[m
[31m-  xvrspic_2 =		"f00002acQ-Q",[m
[31m-  xvdivsp_3 =		"f00002c0QQQ",[m
[31m-  xvmsubmsp_3 =		"f00002c8QQQ",[m
[31m-  xvcvsxwsp_2 =		"f00002e0Q-Q",[m
[31m-  xvrspim_2 =		"f00002e4Q-Q",[m
[31m-  xvtdivsp_3 =		"f00002e8XQQ",[m
[31m-  xvadddp_3 =		"f0000300QQQ",[m
[31m-  xvmaddadp_3 =		"f0000308QQQ",[m
[31m-  xvcmpeqdp_3 =		"f0000318QQQ",[m
[31m-  xvcvdpuxws_2 =	"f0000320Q-Q",[m
[31m-  xvrdpi_2 =		"f0000324Q-Q",[m
[31m-  xvrsqrtedp_2 =	"f0000328Q-Q",[m
[31m-  xvsqrtdp_2 =		"f000032cQ-Q",[m
[31m-  xvsubdp_3 =		"f0000340QQQ",[m
[31m-  xvmaddmdp_3 =		"f0000348QQQ",[m
[31m-  xvcmpgtdp_3 =		"f0000358QQQ",[m
[31m-  xvcvdpsxws_2 =	"f0000360Q-Q",[m
[31m-  xvrdpiz_2 =		"f0000364Q-Q",[m
[31m-  xvredp_2 =		"f0000368Q-Q",[m
[31m-  xvmuldp_3 =		"f0000380QQQ",[m
[31m-  xvmsubadp_3 =		"f0000388QQQ",[m
[31m-  xvcmpgedp_3 =		"f0000398QQQ",[m
[31m-  xvcvuxwdp_2 =		"f00003a0Q-Q",[m
[31m-  xvrdpip_2 =		"f00003a4Q-Q",[m
[31m-  xvtsqrtdp_2 =		"f00003a8X-Q",[m
[31m-  xvrdpic_2 =		"f00003acQ-Q",[m
[31m-  xvdivdp_3 =		"f00003c0QQQ",[m
[31m-  xvmsubmdp_3 =		"f00003c8QQQ",[m
[31m-  xvcvsxwdp_2 =		"f00003e0Q-Q",[m
[31m-  xvrdpim_2 =		"f00003e4Q-Q",[m
[31m-  xvtdivdp_3 =		"f00003e8XQQ",[m
[31m-  xsnmaddasp_3 =	"f0000408QQQ",[m
[31m-  xxland_3 =		"f0000410QQQ",[m
[31m-  xscvdpsp_2 =		"f0000424Q-Q",[m
[31m-  xscvdpspn_2 =		"f000042cQ-Q",[m
[31m-  xsnmaddmsp_3 =	"f0000448QQQ",[m
[31m-  xxlandc_3 =		"f0000450QQQ",[m
[31m-  xsrsp_2 =		"f0000464Q-Q",[m
[31m-  xsnmsubasp_3 =	"f0000488QQQ",[m
[31m-  xxlor_3 =		"f0000490QQQ",[m
[31m-  xscvuxdsp_2 =		"f00004a0Q-Q",[m
[31m-  xsnmsubmsp_3 =	"f00004c8QQQ",[m
[31m-  xxlxor_3 =		"f00004d0QQQ",[m
[31m-  xscvsxdsp_2 =		"f00004e0Q-Q",[m
[31m-  xsmaxdp_3 =		"f0000500QQQ",[m
[31m-  xsnmaddadp_3 =	"f0000508QQQ",[m
[31m-  xxlnor_3 =		"f0000510QQQ",[m
[31m-  xscvdpuxds_2 =	"f0000520Q-Q",[m
[31m-  xscvspdp_2 =		"f0000524Q-Q",[m
[31m-  xscvspdpn_2 =		"f000052cQ-Q",[m
[31m-  xsmindp_3 =		"f0000540QQQ",[m
[31m-  xsnmaddmdp_3 =	"f0000548QQQ",[m
[31m-  xxlorc_3 =		"f0000550QQQ",[m
[31m-  xscvdpsxds_2 =	"f0000560Q-Q",[m
[31m-  xsabsdp_2 =		"f0000564Q-Q",[m
[31m-  xscpsgndp_3 =		"f0000580QQQ",[m
[31m-  xsnmsubadp_3 =	"f0000588QQQ",[m
[31m-  xxlnand_3 =		"f0000590QQQ",[m
[31m-  xscvuxddp_2 =		"f00005a0Q-Q",[m
[31m-  xsnabsdp_2 =		"f00005a4Q-Q",[m
[31m-  xsnmsubmdp_3 =	"f00005c8QQQ",[m
[31m-  xxleqv_3 =		"f00005d0QQQ",[m
[31m-  xscvsxddp_2 =		"f00005e0Q-Q",[m
[31m-  xsnegdp_2 =		"f00005e4Q-Q",[m
[31m-  xvmaxsp_3 =		"f0000600QQQ",[m
[31m-  xvnmaddasp_3 =	"f0000608QQQ",[m
[31m-  ["xvcmpeqsp._3"] =	"f0000618QQQ",[m
[31m-  xvcvspuxds_2 =	"f0000620Q-Q",[m
[31m-  xvcvdpsp_2 =		"f0000624Q-Q",[m
[31m-  xvminsp_3 =		"f0000640QQQ",[m
[31m-  xvnmaddmsp_3 =	"f0000648QQQ",[m
[31m-  ["xvcmpgtsp._3"] =	"f0000658QQQ",[m
[31m-  xvcvspsxds_2 =	"f0000660Q-Q",[m
[31m-  xvabssp_2 =		"f0000664Q-Q",[m
[31m-  xvcpsgnsp_3 =		"f0000680QQQ",[m
[31m-  xvnmsubasp_3 =	"f0000688QQQ",[m
[31m-  ["xvcmpgesp._3"] =	"f0000698QQQ",[m
[31m-  xvcvuxdsp_2 =		"f00006a0Q-Q",[m
[31m-  xvnabssp_2 =		"f00006a4Q-Q",[m
[31m-  xvnmsubmsp_3 =	"f00006c8QQQ",[m
[31m-  xvcvsxdsp_2 =		"f00006e0Q-Q",[m
[31m-  xvnegsp_2 =		"f00006e4Q-Q",[m
[31m-  xvmaxdp_3 =		"f0000700QQQ",[m
[31m-  xvnmaddadp_3 =	"f0000708QQQ",[m
[31m-  ["xvcmpeqdp._3"] =	"f0000718QQQ",[m
[31m-  xvcvdpuxds_2 =	"f0000720Q-Q",[m
[31m-  xvcvspdp_2 =		"f0000724Q-Q",[m
[31m-  xvmindp_3 =		"f0000740QQQ",[m
[31m-  xvnmaddmdp_3 =	"f0000748QQQ",[m
[31m-  ["xvcmpgtdp._3"] =	"f0000758QQQ",[m
[31m-  xvcvdpsxds_2 =	"f0000760Q-Q",[m
[31m-  xvabsdp_2 =		"f0000764Q-Q",[m
[31m-  xvcpsgndp_3 =		"f0000780QQQ",[m
[31m-  xvnmsubadp_3 =	"f0000788QQQ",[m
[31m-  ["xvcmpgedp._3"] =	"f0000798QQQ",[m
[31m-  xvcvuxddp_2 =		"f00007a0Q-Q",[m
[31m-  xvnabsdp_2 =		"f00007a4Q-Q",[m
[31m-  xvnmsubmdp_3 =	"f00007c8QQQ",[m
[31m-  xvcvsxddp_2 =		"f00007e0Q-Q",[m
[31m-  xvnegdp_2 =		"f00007e4Q-Q",[m
[31m-[m
[31m-  -- Primary opcode 61:[m
[31m-  stfdp_2 =	"f4000000F:D", -- NYI: displacement must be divisible by 4.[m
[31m-[m
[31m-  -- Primary opcode 62:[m
[31m-  stq_2 =	"f8000002R:D", -- NYI: displacement must be divisible by 8.[m
[31m-[m
[31m-  -- Primary opcode 63:[m
[31m-  fdiv_3 =	"fc000024FFF.",[m
[31m-  fsub_3 =	"fc000028FFF.",[m
[31m-  fadd_3 =	"fc00002aFFF.",[m
[31m-  fsqrt_2 =	"fc00002cF-F.",[m
[31m-  fsel_4 =	"fc00002eFFFF~.",[m
[31m-  fre_2 =	"fc000030F-F.",[m
[31m-  fmul_3 =	"fc000032FF-F.",[m
[31m-  frsqrte_2 =	"fc000034F-F.",[m
[31m-  fmsub_4 =	"fc000038FFFF~.",[m
[31m-  fmadd_4 =	"fc00003aFFFF~.",[m
[31m-  fnmsub_4 =	"fc00003cFFFF~.",[m
[31m-  fnmadd_4 =	"fc00003eFFFF~.",[m
[31m-  fcmpu_3 =	"fc000000XFF",[m
[31m-  fcpsgn_3 =	"fc000010FFF.",[m
[31m-  fcmpo_3 =	"fc000040XFF",[m
[31m-  mtfsb1_1 =	"fc00004cA",[m
[31m-  fneg_2 =	"fc000050F-F.",[m
[31m-  mcrfs_2 =	"fc000080XX",[m
[31m-  mtfsb0_1 =	"fc00008cA",[m
[31m-  fmr_2 =	"fc000090F-F.",[m
[31m-  frsp_2 =	"fc000018F-F.",[m
[31m-  fctiw_2 =	"fc00001cF-F.",[m
[31m-  fctiwz_2 =	"fc00001eF-F.",[m
[31m-  ftdiv_2 =	"fc000100X-F.",[m
[31m-  fctiwu_2 =	"fc00011cF-F.",[m
[31m-  fctiwuz_2 =	"fc00011eF-F.",[m
[31m-  mtfsfi_2 =	"fc00010cAA", -- NYI: upshift.[m
[31m-  fnabs_2 =	"fc000110F-F.",[m
[31m-  ftsqrt_2 =	"fc000140X-F.",[m
[31m-  fabs_2 =	"fc000210F-F.",[m
[31m-  frin_2 =	"fc000310F-F.",[m
[31m-  friz_2 =	"fc000350F-F.",[m
[31m-  frip_2 =	"fc000390F-F.",[m
[31m-  frim_2 =	"fc0003d0F-F.",[m
[31m-  mffs_1 =	"fc00048eF.",[m
[31m-  -- NYI: mtfsf, mtfsb0, mtfsb1.[m
[31m-  fctid_2 =	"fc00065cF-F.",[m
[31m-  fctidz_2 =	"fc00065eF-F.",[m
[31m-  fmrgow_3 =	"fc00068cFFF",[m
[31m-  fcfid_2 =	"fc00069cF-F.",[m
[31m-  fctidu_2 =	"fc00075cF-F.",[m
[31m-  fctiduz_2 =	"fc00075eF-F.",[m
[31m-  fmrgew_3 =	"fc00078cFFF",[m
[31m-  fcfidu_2 =	"fc00079cF-F.",[m
[31m-[m
[31m-  daddq_3 =	"fc000004F:F:F:.",[m
[31m-  dquaq_4 =	"fc000006F:F:F:Z.",[m
[31m-  dmulq_3 =	"fc000044F:F:F:.",[m
[31m-  drrndq_4 =	"fc000046F:F:F:Z.",[m
[31m-  dscliq_3 =	"fc000084F:F:6.",[m
[31m-  dquaiq_4 =	"fc000086SF:~F:Z.",[m
[31m-  dscriq_3 =	"fc0000c4F:F:6.",[m
[31m-  drintxq_4 =	"fc0000c61F:~F:Z.",[m
[31m-  dcmpoq_3 =	"fc000104XF:F:",[m
[31m-  dtstexq_3 =	"fc000144XF:F:",[m
[31m-  dtstdcq_3 =	"fc000184XF:6",[m
[31m-  dtstdgq_3 =	"fc0001c4XF:6",[m
[31m-  drintnq_4 =	"fc0001c61F:~F:Z.",[m
[31m-  dctqpq_2 =	"fc000204F:-F:.",[m
[31m-  dctfixq_2 =	"fc000244F:-F:.",[m
[31m-  ddedpdq_3 =	"fc000284ZF:~F:.",[m
[31m-  dxexq_2 =	"fc0002c4F:-F:.",[m
[31m-  dsubq_3 =	"fc000404F:F:F:.",[m
[31m-  ddivq_3 =	"fc000444F:F:F:.",[m
[31m-  dcmpuq_3 =	"fc000504XF:F:",[m
[31m-  dtstsfq_3 =	"fc000544XF:F:",[m
[31m-  drdpq_2 =	"fc000604F:-F:.",[m
[31m-  dcffixq_2 =	"fc000644F:-F:.",[m
[31m-  denbcdq_3 =	"fc000684YF:~F:.",[m
[31m-  diexq_3 =	"fc0006c4F:FF:.",[m
[31m-[m
[31m-  -- Primary opcode 4, SPE APU extension:[m
[31m-  evaddw_3 =		"10000200RRR",[m
[31m-  evaddiw_3 =		"10000202RAR~",[m
[31m-  evsubw_3 =		"10000204RRR~",[m
[31m-  evsubiw_3 =		"10000206RAR~",[m
[31m-  evabs_2 =		"10000208RR",[m
[31m-  evneg_2 =		"10000209RR",[m
[31m-  evextsb_2 =		"1000020aRR",[m
[31m-  evextsh_2 =		"1000020bRR",[m
[31m-  evrndw_2 =		"1000020cRR",[m
[31m-  evcntlzw_2 =		"1000020dRR",[m
[31m-  evcntlsw_2 =		"1000020eRR",[m
[31m-  brinc_3 =		"1000020fRRR",[m
[31m-  evand_3 =		"10000211RRR",[m
[31m-  evandc_3 =		"10000212RRR",[m
[31m-  evxor_3 =		"10000216RRR",[m
[31m-  evor_3 =		"10000217RRR",[m
[31m-  evmr_2 =		"10000217RR=",[m
[31m-  evnor_3 =		"10000218RRR",[m
[31m-  evnot_2 =		"10000218RR=",[m
[31m-  eveqv_3 =		"10000219RRR",[m
[31m-  evorc_3 =		"1000021bRRR",[m
[31m-  evnand_3 =		"1000021eRRR",[m
[31m-  evsrwu_3 =		"10000220RRR",[m
[31m-  evsrws_3 =		"10000221RRR",[m
[31m-  evsrwiu_3 =		"10000222RRA",[m
[31m-  evsrwis_3 =		"10000223RRA",[m
[31m-  evslw_3 =		"10000224RRR",[m
[31m-  evslwi_3 =		"10000226RRA",[m
[31m-  evrlw_3 =		"10000228RRR",[m
[31m-  evsplati_2 =		"10000229RS",[m
[31m-  evrlwi_3 =		"1000022aRRA",[m
[31m-  evsplatfi_2 =		"1000022bRS",[m
[31m-  evmergehi_3 =		"1000022cRRR",[m
[31m-  evmergelo_3 =		"1000022dRRR",[m
[31m-  evcmpgtu_3 =		"10000230XRR",[m
[31m-  evcmpgtu_2 =		"10000230-RR",[m
[31m-  evcmpgts_3 =		"10000231XRR",[m
[31m-  evcmpgts_2 =		"10000231-RR",[m
[31m-  evcmpltu_3 =		"10000232XRR",[m
[31m-  evcmpltu_2 =		"10000232-RR",[m
[31m-  evcmplts_3 =		"10000233XRR",[m
[31m-  evcmplts_2 =		"10000233-RR",[m
[31m-  evcmpeq_3 =		"10000234XRR",[m
[31m-  evcmpeq_2 =		"10000234-RR",[m
[31m-  evsel_4 =		"10000278RRRW",[m
[31m-  evsel_3 =		"10000278RRR",[m
[31m-  evfsadd_3 =		"10000280RRR",[m
[31m-  evfssub_3 =		"10000281RRR",[m
[31m-  evfsabs_2 =		"10000284RR",[m
[31m-  evfsnabs_2 =		"10000285RR",[m
[31m-  evfsneg_2 =		"10000286RR",[m
[31m-  evfsmul_3 =		"10000288RRR",[m
[31m-  evfsdiv_3 =		"10000289RRR",[m
[31m-  evfscmpgt_3 =		"1000028cXRR",[m
[31m-  evfscmpgt_2 =		"1000028c-RR",[m
[31m-  evfscmplt_3 =		"1000028dXRR",[m
[31m-  evfscmplt_2 =		"1000028d-RR",[m
[31m-  evfscmpeq_3 =		"1000028eXRR",[m
[31m-  evfscmpeq_2 =		"1000028e-RR",[m
[31m-  evfscfui_2 =		"10000290R-R",[m
[31m-  evfscfsi_2 =		"10000291R-R",[m
[31m-  evfscfuf_2 =		"10000292R-R",[m
[31m-  evfscfsf_2 =		"10000293R-R",[m
[31m-  evfsctui_2 =		"10000294R-R",[m
[31m-  evfsctsi_2 =		"10000295R-R",[m
[31m-  evfsctuf_2 =		"10000296R-R",[m
[31m-  evfsctsf_2 =		"10000297R-R",[m
[31m-  evfsctuiz_2 =		"10000298R-R",[m
[31m-  evfsctsiz_2 =		"1000029aR-R",[m
[31m-  evfststgt_3 =		"1000029cXRR",[m
[31m-  evfststgt_2 =		"1000029c-RR",[m
[31m-  evfststlt_3 =		"1000029dXRR",[m
[31m-  evfststlt_2 =		"1000029d-RR",[m
[31m-  evfststeq_3 =		"1000029eXRR",[m
[31m-  evfststeq_2 =		"1000029e-RR",[m
[31m-  efsadd_3 =		"100002c0RRR",[m
[31m-  efssub_3 =		"100002c1RRR",[m
[31m-  efsabs_2 =		"100002c4RR",[m
[31m-  efsnabs_2 =		"100002c5RR",[m
[31m-  efsneg_2 =		"100002c6RR",[m
[31m-  efsmul_3 =		"100002c8RRR",[m
[31m-  efsdiv_3 =		"100002c9RRR",[m
[31m-  efscmpgt_3 =		"100002ccXRR",[m
[31m-  efscmpgt_2 =		"100002cc-RR",[m
[31m-  efscmplt_3 =		"100002cdXRR",[m
[31m-  efscmplt_2 =		"100002cd-RR",[m
[31m-  efscmpeq_3 =		"100002ceXRR",[m
[31m-  efscmpeq_2 =		"100002ce-RR",[m
[31m-  efscfd_2 =		"100002cfR-R",[m
[31m-  efscfui_2 =		"100002d0R-R",[m
[31m-  efscfsi_2 =		"100002d1R-R",[m
[31m-  efscfuf_2 =		"100002d2R-R",[m
[31m-  efscfsf_2 =		"100002d3R-R",[m
[31m-  efsctui_2 =		"100002d4R-R",[m
[31m-  efsctsi_2 =		"100002d5R-R",[m
[31m-  efsctuf_2 =		"100002d6R-R",[m
[31m-  efsctsf_2 =		"100002d7R-R",[m
[31m-  efsctuiz_2 =		"100002d8R-R",[m
[31m-  efsctsiz_2 =		"100002daR-R",[m
[31m-  efststgt_3 =		"100002dcXRR",[m
[31m-  efststgt_2 =		"100002dc-RR",[m
[31m-  efststlt_3 =		"100002ddXRR",[m
[31m-  efststlt_2 =		"100002dd-RR",[m
[31m-  efststeq_3 =		"100002deXRR",[m
[31m-  efststeq_2 =		"100002de-RR",[m
[31m-  efdadd_3 =		"100002e0RRR",[m
[31m-  efdsub_3 =		"100002e1RRR",[m
[31m-  efdcfuid_2 =		"100002e2R-R",[m
[31m-  efdcfsid_2 =		"100002e3R-R",[m
[31m-  efdabs_2 =		"100002e4RR",[m
[31m-  efdnabs_2 =		"100002e5RR",[m
[31m-  efdneg_2 =		"100002e6RR",[m
[31m-  efdmul_3 =		"100002e8RRR",[m
[31m-  efddiv_3 =		"100002e9RRR",[m
[31m-  efdctuidz_2 =		"100002eaR-R",[m
[31m-  efdctsidz_2 =		"100002ebR-R",[m
[31m-  efdcmpgt_3 =		"100002ecXRR",[m
[31m-  efdcmpgt_2 =		"100002ec-RR",[m
[31m-  efdcmplt_3 =		"100002edXRR",[m
[31m-  efdcmplt_2 =		"100002ed-RR",[m
[31m-  efdcmpeq_3 =		"100002eeXRR",[m
[31m-  efdcmpeq_2 =		"100002ee-RR",[m
[31m-  efdcfs_2 =		"100002efR-R",[m
[31m-  efdcfui_2 =		"100002f0R-R",[m
[31m-  efdcfsi_2 =		"100002f1R-R",[m
[31m-  efdcfuf_2 =		"100002f2R-R",[m
[31m-  efdcfsf_2 =		"100002f3R-R",[m
[31m-  efdctui_2 =		"100002f4R-R",[m
[31m-  efdctsi_2 =		"100002f5R-R",[m
[31m-  efdctuf_2 =		"100002f6R-R",[m
[31m-  efdctsf_2 =		"100002f7R-R",[m
[31m-  efdctuiz_2 =		"100002f8R-R",[m
[31m-  efdctsiz_2 =		"100002faR-R",[m
[31m-  efdtstgt_3 =		"100002fcXRR",[m
[31m-  efdtstgt_2 =		"100002fc-RR",[m
[31m-  efdtstlt_3 =		"100002fdXRR",[m
[31m-  efdtstlt_2 =		"100002fd-RR",[m
[31m-  efdtsteq_3 =		"100002feXRR",[m
[31m-  efdtsteq_2 =		"100002fe-RR",[m
[31m-  evlddx_3 =		"10000300RR0R",[m
[31m-  evldd_2 =		"10000301R8",[m
[31m-  evldwx_3 =		"10000302RR0R",[m
[31m-  evldw_2 =		"10000303R8",[m
[31m-  evldhx_3 =		"10000304RR0R",[m
[31m-  evldh_2 =		"10000305R8",[m
[31m-  evlwhex_3 =		"10000310RR0R",[m
[31m-  evlwhe_2 =		"10000311R4",[m
[31m-  evlwhoux_3 =		"10000314RR0R",[m
[31m-  evlwhou_2 =		"10000315R4",[m
[31m-  evlwhosx_3 =		"10000316RR0R",[m
[31m-  evlwhos_2 =		"10000317R4",[m
[31m-  evstddx_3 =		"10000320RR0R",[m
[31m-  evstdd_2 =		"10000321R8",[m
[31m-  evstdwx_3 =		"10000322RR0R",[m
[31m-  evstdw_2 =		"10000323R8",[m
[31m-  evstdhx_3 =		"10000324RR0R",[m
[31m-  evstdh_2 =		"10000325R8",[m
[31m-  evstwhex_3 =		"10000330RR0R",[m
[31m-  evstwhe_2 =		"10000331R4",[m
[31m-  evstwhox_3 =		"10000334RR0R",[m
[31m-  evstwho_2 =		"10000335R4",[m
[31m-  evstwwex_3 =		"10000338RR0R",[m
[31m-  evstwwe_2 =		"10000339R4",[m
[31m-  evstwwox_3 =		"1000033cRR0R",[m
[31m-  evstwwo_2 =		"1000033dR4",[m
[31m-  evmhessf_3 =		"10000403RRR",[m
[31m-  evmhossf_3 =		"10000407RRR",[m
[31m-  evmheumi_3 =		"10000408RRR",[m
[31m-  evmhesmi_3 =		"10000409RRR",[m
[31m-  evmhesmf_3 =		"1000040bRRR",[m
[31m-  evmhoumi_3 =		"1000040cRRR",[m
[31m-  evmhosmi_3 =		"1000040dRRR",[m
[31m-  evmhosmf_3 =		"1000040fRRR",[m
[31m-  evmhessfa_3 =		"10000423RRR",[m
[31m-  evmhossfa_3 =		"10000427RRR",[m
[31m-  evmheumia_3 =		"10000428RRR",[m
[31m-  evmhesmia_3 =		"10000429RRR",[m
[31m-  evmhesmfa_3 =		"1000042bRRR",[m
[31m-  evmhoumia_3 =		"1000042cRRR",[m
[31m-  evmhosmia_3 =		"1000042dRRR",[m
[31m-  evmhosmfa_3 =		"1000042fRRR",[m
[31m-  evmwhssf_3 =		"10000447RRR",[m
[31m-  evmwlumi_3 =		"10000448RRR",[m
[31m-  evmwhumi_3 =		"1000044cRRR",[m
[31m-  evmwhsmi_3 =		"1000044dRRR",[m
[31m-  evmwhsmf_3 =		"1000044fRRR",[m
[31m-  evmwssf_3 =		"10000453RRR",[m
[31m-  evmwumi_3 =		"10000458RRR",[m
[31m-  evmwsmi_3 =		"10000459RRR",[m
[31m-  evmwsmf_3 =		"1000045bRRR",[m
[31m-  evmwhssfa_3 =		"10000467RRR",[m
[31m-  evmwlumia_3 =		"10000468RRR",[m
[31m-  evmwhumia_3 =		"1000046cRRR",[m
[31m-  evmwhsmia_3 =		"1000046dRRR",[m
[31m-  evmwhsmfa_3 =		"1000046fRRR",[m
[31m-  evmwssfa_3 =		"10000473RRR",[m
[31m-  evmwumia_3 =		"10000478RRR",[m
[31m-  evmwsmia_3 =		"10000479RRR",[m
[31m-  evmwsmfa_3 =		"1000047bRRR",[m
[31m-  evmra_2 =		"100004c4RR",[m
[31m-  evdivws_3 =		"100004c6RRR",[m
[31m-  evdivwu_3 =		"100004c7RRR",[m
[31m-  evmwssfaa_3 =		"10000553RRR",[m
[31m-  evmwumiaa_3 =		"10000558RRR",[m
[31m-  evmwsmiaa_3 =		"10000559RRR",[m
[31m-  evmwsmfaa_3 =		"1000055bRRR",[m
[31m-  evmwssfan_3 =		"100005d3RRR",[m
[31m-  evmwumian_3 =		"100005d8RRR",[m
[31m-  evmwsmian_3 =		"100005d9RRR",[m
[31m-  evmwsmfan_3 =		"100005dbRRR",[m
[31m-  evmergehilo_3 =	"1000022eRRR",[m
[31m-  evmergelohi_3 =	"1000022fRRR",[m
[31m-  evlhhesplatx_3 =	"10000308RR0R",[m
[31m-  evlhhesplat_2 =	"10000309R2",[m
[31m-  evlhhousplatx_3 =	"1000030cRR0R",[m
[31m-  evlhhousplat_2 =	"1000030dR2",[m
[31m-  evlhhossplatx_3 =	"1000030eRR0R",[m
[31m-  evlhhossplat_2 =	"1000030fR2",[m
[31m-  evlwwsplatx_3 =	"10000318RR0R",[m
[31m-  evlwwsplat_2 =	"10000319R4",[m
[31m-  evlwhsplatx_3 =	"1000031cRR0R",[m
[31m-  evlwhsplat_2 =	"1000031dR4",[m
[31m-  evaddusiaaw_2 =	"100004c0RR",[m
[31m-  evaddssiaaw_2 =	"100004c1RR",[m
[31m-  evsubfusiaaw_2 =	"100004c2RR",[m
[31m-  evsubfssiaaw_2 =	"100004c3RR",[m
[31m-  evaddumiaaw_2 =	"100004c8RR",[m
[31m-  evaddsmiaaw_2 =	"100004c9RR",[m
[31m-  evsubfumiaaw_2 =	"100004caRR",[m
[31m-  evsubfsmiaaw_2 =	"100004cbRR",[m
[31m-  evmheusiaaw_3 =	"10000500RRR",[m
[31m-  evmhessiaaw_3 =	"10000501RRR",[m
[31m-  evmhessfaaw_3 =	"10000503RRR",[m
[31m-  evmhousiaaw_3 =	"10000504RRR",[m
[31m-  evmhossiaaw_3 =	"10000505RRR",[m
[31m-  evmhossfaaw_3 =	"10000507RRR",[m
[31m-  evmheumiaaw_3 =	"10000508RRR",[m
[31m-  evmhesmiaaw_3 =	"10000509RRR",[m
[31m-  evmhesmfaaw_3 =	"1000050bRRR",[m
[31m-  evmhoumiaaw_3 =	"1000050cRRR",[m
[31m-  evmhosmiaaw_3 =	"1000050dRRR",[m
[31m-  evmhosmfaaw_3 =	"1000050fRRR",[m
[31m-  evmhegumiaa_3 =	"10000528RRR",[m
[31m-  evmhegsmiaa_3 =	"10000529RRR",[m
[31m-  evmhegsmfaa_3 =	"1000052bRRR",[m
[31m-  evmhogumiaa_3 =	"1000052cRRR",[m
[31m-  evmhogsmiaa_3 =	"1000052dRRR",[m
[31m-  evmhogsmfaa_3 =	"1000052fRRR",[m
[31m-  evmwlusiaaw_3 =	"10000540RRR",[m
[31m-  evmwlssiaaw_3 =	"10000541RRR",[m
[31m-  evmwlumiaaw_3 =	"10000548RRR",[m
[31m-  evmwlsmiaaw_3 =	"10000549RRR",[m
[31m-  evmheusianw_3 =	"10000580RRR",[m
[31m-  evmhessianw_3 =	"10000581RRR",[m
[31m-  evmhessfanw_3 =	"10000583RRR",[m
[31m-  evmhousianw_3 =	"10000584RRR",[m
[31m-  evmhossianw_3 =	"10000585RRR",[m
[31m-  evmhossfanw_3 =	"10000587RRR",[m
[31m-  evmheumianw_3 =	"10000588RRR",[m
[31m-  evmhesmianw_3 =	"10000589RRR",[m
[31m-  evmhesmfanw_3 =	"1000058bRRR",[m
[31m-  evmhoumianw_3 =	"1000058cRRR",[m
[31m-  evmhosmianw_3 =	"1000058dRRR",[m
[31m-  evmhosmfanw_3 =	"1000058fRRR",[m
[31m-  evmhegumian_3 =	"100005a8RRR",[m
[31m-  evmhegsmian_3 =	"100005a9RRR",[m
[31m-  evmhegsmfan_3 =	"100005abRRR",[m
[31m-  evmhogumian_3 =	"100005acRRR",[m
[31m-  evmhogsmian_3 =	"100005adRRR",[m
[31m-  evmhogsmfan_3 =	"100005afRRR",[m
[31m-  evmwlusianw_3 =	"100005c0RRR",[m
[31m-  evmwlssianw_3 =	"100005c1RRR",[m
[31m-  evmwlumianw_3 =	"100005c8RRR",[m
[31m-  evmwlsmianw_3 =	"100005c9RRR",[m
[31m-[m
[31m-  -- NYI: Book E instructions.[m
[31m-}[m
[31m-[m
[31m--- Add mnemonics for "." variants.[m
[31m-do[m
[31m-  local t = {}[m
[31m-  for k,v in pairs(map_op) do[m
[31m-    if type(v) == "string" and sub(v, -1) == "." then[m
[31m-      local v2 = sub(v, 1, 7)..char(byte(v, 8)+1)..sub(v, 9, -2)[m
[31m-      t[sub(k, 1, -3).."."..sub(k, -2)] = v2[m
[31m-    end[m
[31m-  end[m
[31m-  for k,v in pairs(t) do[m
[31m-    map_op[k] = v[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Add more branch mnemonics.[m
[31m-for cond,c in pairs(map_cond) do[m
[31m-  local b1 = "b"..cond[m
[31m-  local c1 = shl(band(c, 3), 16) + (c < 4 and 0x01000000 or 0)[m
[31m-  -- bX[l][m
[31m-  map_op[b1.."_1"] = tohex(0x40800000 + c1).."K"[m
[31m-  map_op[b1.."y_1"] = tohex(0x40a00000 + c1).."K"[m
[31m-  map_op[b1.."l_1"] = tohex(0x40800001 + c1).."K"[m
[31m-  map_op[b1.."_2"] = tohex(0x40800000 + c1).."-XK"[m
[31m-  map_op[b1.."y_2"] = tohex(0x40a00000 + c1).."-XK"[m
[31m-  map_op[b1.."l_2"] = tohex(0x40800001 + c1).."-XK"[m
[31m-  -- bXlr[l][m
[31m-  map_op[b1.."lr_0"] = tohex(0x4c800020 + c1)[m
[31m-  map_op[b1.."lrl_0"] = tohex(0x4c800021 + c1)[m
[31m-  map_op[b1.."ctr_0"] = tohex(0x4c800420 + c1)[m
[31m-  map_op[b1.."ctrl_0"] = tohex(0x4c800421 + c1)[m
[31m-  -- bXctr[l][m
[31m-  map_op[b1.."lr_1"] = tohex(0x4c800020 + c1).."-X"[m
[31m-  map_op[b1.."lrl_1"] = tohex(0x4c800021 + c1).."-X"[m
[31m-  map_op[b1.."ctr_1"] = tohex(0x4c800420 + c1).."-X"[m
[31m-  map_op[b1.."ctrl_1"] = tohex(0x4c800421 + c1).."-X"[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function parse_gpr(expr)[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    if not reg then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    expr = reg[m
[31m-  end[m
[31m-  local r = match(expr, "^r([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r, tp end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_fpr(expr)[m
[31m-  local r = match(expr, "^f([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_vr(expr)[m
[31m-  local r = match(expr, "^v([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_vs(expr)[m
[31m-  local r = match(expr, "^vs([1-6]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 63 then return r end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_cr(expr)[m
[31m-  local r = match(expr, "^cr([0-7])$")[m
[31m-  if r then return tonumber(r) end[m
[31m-  werror("bad condition register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_cond(expr)[m
[31m-  local r, cond = match(expr, "^4%*cr([0-7])%+(%w%w)$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    local c = map_cond[cond][m
[31m-    if c and c < 4 then return r*4+c end[m
[31m-  end[m
[31m-  werror("bad condition bit name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local parse_ctx = {}[m
[31m-[m
[31m-local loadenv = setfenv and function(s)[m
[31m-  local code = loadstring(s, "")[m
[31m-  if code then setfenv(code, parse_ctx) end[m
[31m-  return code[m
[31m-end or function(s)[m
[31m-  return load(s, "", nil, parse_ctx)[m
[31m-end[m
[31m-[m
[31m--- Try to parse simple arithmetic, too, since some basic ops are aliases.[m
[31m-local function parse_number(n)[m
[31m-  local x = tonumber(n)[m
[31m-  if x then return x end[m
[31m-  local code = loadenv("return "..n)[m
[31m-  if code then[m
[31m-    local ok, y = pcall(code)[m
[31m-    if ok then return y end[m
[31m-  end[m
[31m-  return nil[m
[31m-end[m
[31m-[m
[31m-local function parse_imm(imm, bits, shift, scale, signed)[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n then[m
[31m-      if signed then[m
[31m-	local s = sar(m, bits-1)[m
[31m-	if s == 0 then return shl(m, shift)[m
[31m-	elseif s == -1 then return shl(m + shl(1, bits), shift) end[m
[31m-      else[m
[31m-	if sar(m, bits) == 0 then return shl(m, shift) end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  elseif match(imm, "^[rfv]([1-3]?[0-9])$") or[m
[31m-	 match(imm, "^vs([1-6]?[0-9])$") or[m
[31m-	 match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then[m
[31m-    werror("expected immediate operand, got register")[m
[31m-  else[m
[31m-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_shiftmask(imm, isshift)[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    if shr(n, 6) == 0 then[m
[31m-      local lsb = band(n, 31)[m
[31m-      local msb = n - lsb[m
[31m-      return isshift and (shl(lsb, 11)+shr(msb, 4)) or (shl(lsb, 6)+msb)[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  elseif match(imm, "^r([1-3]?[0-9])$") or[m
[31m-	 match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then[m
[31m-    werror("expected immediate operand, got register")[m
[31m-  else[m
[31m-    waction("IMMSH", isshift and 1 or 0, imm)[m
[31m-    return 0;[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_disp(disp)[m
[31m-  local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")[m
[31m-  if imm then[m
[31m-    local r = parse_gpr(reg)[m
[31m-    if r == 0 then werror("cannot use r0 in displacement") end[m
[31m-    return shl(r, 16) + parse_imm(imm, 16, 0, 0, true)[m
[31m-  end[m
[31m-  local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$")[m
[31m-  if reg and tailr ~= "" then[m
[31m-    local r, tp = parse_gpr(reg)[m
[31m-    if r == 0 then werror("cannot use r0 in displacement") end[m
[31m-    if tp then[m
[31m-      waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr))[m
[31m-      return shl(r, 16)[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad displacement `"..disp.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_u5disp(disp, scale)[m
[31m-  local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")[m
[31m-  if imm then[m
[31m-    local r = parse_gpr(reg)[m
[31m-    if r == 0 then werror("cannot use r0 in displacement") end[m
[31m-    return shl(r, 16) + parse_imm(imm, 5, 11, scale, false)[m
[31m-  end[m
[31m-  local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$")[m
[31m-  if reg and tailr ~= "" then[m
[31m-    local r, tp = parse_gpr(reg)[m
[31m-    if r == 0 then werror("cannot use r0 in displacement") end[m
[31m-    if tp then[m
[31m-      waction("IMM", scale*1024+5*32+11, format(tp.ctypefmt, tailr))[m
[31m-      return shl(r, 16)[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad displacement `"..disp.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_label(label, def)[m
[31m-  local prefix = sub(label, 1, 2)[m
[31m-  -- =>label (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "PC", 0, sub(label, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "LG", map_global[sub(label, 3)][m
[31m-  end[m
[31m-  if def then[m
[31m-    -- [1-9] (local label definition)[m
[31m-    if match(label, "^[1-9]$") then[m
[31m-      return "LG", 10+tonumber(label)[m
[31m-    end[m
[31m-  else[m
[31m-    -- [<>][1-9] (local label reference)[m
[31m-    local dir, lnum = match(label, "^([<>])([1-9])$")[m
[31m-    if dir then -- Fwd: 1-9, Bkwd: 11-19.[m
[31m-      return "LG", lnum + (dir == ">" and 0 or 10)[m
[31m-    end[m
[31m-    -- extern label (extern label reference)[m
[31m-    local extname = match(label, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      return "EXT", map_extern[extname][m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad label `"..label.."'")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-op_template = function(params, template, nparams)[m
[31m-  if not params then return sub(template, 9) end[m
[31m-  local op = tonumber(sub(template, 1, 8), 16)[m
[31m-  local n, rs = 1, 26[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 3 positions (rlwinm).[m
[31m-  if secpos+3 > maxsecpos then wflush() end[m
[31m-  local pos = wpos()[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for p in gmatch(sub(template, 9), ".") do[m
[31m-    if p == "R" then[m
[31m-      rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1[m
[31m-    elseif p == "F" then[m
[31m-      rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1[m
[31m-    elseif p == "V" then[m
[31m-      rs = rs - 5; op = op + shl(parse_vr(params[n]), rs); n = n + 1[m
[31m-    elseif p == "Q" then[m
[31m-      local vs = parse_vs(params[n]); n = n + 1; rs = rs - 5[m
[31m-      local sh = rs == 6 and 2 or 3 + band(shr(rs, 1), 3)[m
[31m-      op = op + shl(band(vs, 31), rs) + shr(band(vs, 32), sh)[m
[31m-    elseif p == "q" then[m
[31m-      local vs = parse_vs(params[n]); n = n + 1[m
[31m-      op = op + shl(band(vs, 31), 21) + shr(band(vs, 32), 5)[m
[31m-    elseif p == "A" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1[m
[31m-    elseif p == "S" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, true); n = n + 1[m
[31m-    elseif p == "I" then[m
[31m-      op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1[m
[31m-    elseif p == "U" then[m
[31m-      op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1[m
[31m-    elseif p == "D" then[m
[31m-      op = op + parse_disp(params[n]); n = n + 1[m
[31m-    elseif p == "2" then[m
[31m-      op = op + parse_u5disp(params[n], 1); n = n + 1[m
[31m-    elseif p == "4" then[m
[31m-      op = op + parse_u5disp(params[n], 2); n = n + 1[m
[31m-    elseif p == "8" then[m
[31m-      op = op + parse_u5disp(params[n], 3); n = n + 1[m
[31m-    elseif p == "C" then[m
[31m-      rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1[m
[31m-    elseif p == "X" then[m
[31m-      rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1[m
[31m-    elseif p == "1" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 1, rs, 0, false); n = n + 1[m
[31m-    elseif p == "g" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 2, rs, 0, false); n = n + 1[m
[31m-    elseif p == "3" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 3, rs, 0, false); n = n + 1[m
[31m-    elseif p == "P" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1[m
[31m-    elseif p == "p" then[m
[31m-      op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1[m
[31m-    elseif p == "6" then[m
[31m-      rs = rs - 6; op = op + parse_imm(params[n], 6, rs, 0, false); n = n + 1[m
[31m-    elseif p == "Y" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 1, rs+4, 0, false); n = n + 1[m
[31m-    elseif p == "y" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 1, rs+3, 0, false); n = n + 1[m
[31m-    elseif p == "Z" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 2, rs+3, 0, false); n = n + 1[m
[31m-    elseif p == "z" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 2, rs+2, 0, false); n = n + 1[m
[31m-    elseif p == "W" then[m
[31m-      op = op + parse_cr(params[n]); n = n + 1[m
[31m-    elseif p == "G" then[m
[31m-      op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1[m
[31m-    elseif p == "H" then[m
[31m-      op = op + parse_shiftmask(params[n], true); n = n + 1[m
[31m-    elseif p == "M" then[m
[31m-      op = op + parse_shiftmask(params[n], false); n = n + 1[m
[31m-    elseif p == "J" or p == "K" then[m
[31m-      local mode, n, s = parse_label(params[n], false)[m
[31m-      if p == "K" then n = n + 2048 end[m
[31m-      waction("REL_"..mode, n, s, 1)[m
[31m-      n = n + 1[m
[31m-    elseif p == "0" then[m
[31m-      if band(shr(op, rs), 31) == 0 then werror("cannot use r0") end[m
[31m-    elseif p == "=" or p == "%" then[m
[31m-      local t = band(shr(op, p == "%" and rs+5 or rs), 31)[m
[31m-      rs = rs - 5[m
[31m-      op = op + shl(t, rs)[m
[31m-    elseif p == "~" then[m
[31m-      local mm = shl(31, rs)[m
[31m-      local lo = band(op, mm)[m
[31m-      local hi = band(op, shl(mm, 5))[m
[31m-      op = op - lo - hi + shl(lo, 5) + shr(hi, 5)[m
[31m-    elseif p == ":" then[m
[31m-      if band(shr(op, rs), 1) ~= 0 then werror("register pair expected") end[m
[31m-    elseif p == "-" then[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "." then[m
[31m-      -- Ignored.[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-  end[m
[31m-  wputpos(pos, op)[m
[31m-end[m
[31m-[m
[31m-map_op[".template__"] = op_template[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_1"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local mode, n, s = parse_label(params[1], true)[m
[31m-  if mode == "EXT" then werror("bad label definition") end[m
[31m-  waction("LABEL_"..mode, n, s, 1)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-map_op[".long_*"] = function(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local n = tonumber(p)[m
[31m-    if not n then werror("bad immediate `"..p.."'") end[m
[31m-    if n < 0 then n = n + 2^32 end[m
[31m-    wputw(n)[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1])[m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION", num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = map_coreop })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_proto.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_proto.h[m
[1mdeleted file mode 100644[m
[1mindex 22a654c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_proto.h[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-/*[m
[31m-** DynASM encoding engine prototypes.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#ifndef _DASM_PROTO_H[m
[31m-#define _DASM_PROTO_H[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#define DASM_IDENT	"DynASM 1.4.0"[m
[31m-#define DASM_VERSION	10400	/* 1.4.0 */[m
[31m-[m
[31m-#ifndef Dst_DECL[m
[31m-#define Dst_DECL	dasm_State **Dst[m
[31m-#endif[m
[31m-[m
[31m-#ifndef Dst_REF[m
[31m-#define Dst_REF		(*Dst)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef DASM_FDEF[m
[31m-#define DASM_FDEF	extern[m
[31m-#endif[m
[31m-[m
[31m-#ifndef DASM_M_GROW[m
[31m-#define DASM_M_GROW(ctx, t, p, sz, need) \[m
[31m-  do { \[m
[31m-    size_t _sz = (sz), _need = (need); \[m
[31m-    if (_sz < _need) { \[m
[31m-      if (_sz < 16) _sz = 16; \[m
[31m-      while (_sz < _need) _sz += _sz; \[m
[31m-      (p) = (t *)realloc((p), _sz); \[m
[31m-      if ((p) == NULL) exit(1); \[m
[31m-      (sz) = _sz; \[m
[31m-    } \[m
[31m-  } while(0)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef DASM_M_FREE[m
[31m-#define DASM_M_FREE(ctx, p, sz)	free(p)[m
[31m-#endif[m
[31m-[m
[31m-/* Internal DynASM encoder state. */[m
[31m-typedef struct dasm_State dasm_State;[m
[31m-[m
[31m-[m
[31m-/* Initialize and free DynASM state. */[m
[31m-DASM_FDEF void dasm_init(Dst_DECL, int maxsection);[m
[31m-DASM_FDEF void dasm_free(Dst_DECL);[m
[31m-[m
[31m-/* Setup global array. Must be called before dasm_setup(). */[m
[31m-DASM_FDEF void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl);[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-DASM_FDEF void dasm_growpc(Dst_DECL, unsigned int maxpc);[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-DASM_FDEF void dasm_setup(Dst_DECL, const void *actionlist);[m
[31m-[m
[31m-/* Feed encoder with actions. Calls are generated by pre-processor. */[m
[31m-DASM_FDEF void dasm_put(Dst_DECL, int start, ...);[m
[31m-[m
[31m-/* Link sections and return the resulting size. */[m
[31m-DASM_FDEF int dasm_link(Dst_DECL, size_t *szp);[m
[31m-[m
[31m-/* Encode sections into buffer. */[m
[31m-DASM_FDEF int dasm_encode(Dst_DECL, void *buffer);[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-DASM_FDEF int dasm_getpclabel(Dst_DECL, unsigned int pc);[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-DASM_FDEF int dasm_checkstep(Dst_DECL, int secmatch);[m
[31m-#else[m
[31m-#define dasm_checkstep(a, b)	0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _DASM_PROTO_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x64.lua[m
[1mdeleted file mode 100644[m
[1mindex 2133355..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM x64 module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m--- This module just sets 64 bit mode for the combined x86/x64 module.[m
[31m--- All the interesting stuff is there.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-x64 = true -- Using a global is an ugly, but effective solution.[m
[31m-return require("dasm_x86")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x86.h[m
[1mdeleted file mode 100644[m
[1mindex bf5b729..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,498 +0,0 @@[m
[31m-/*[m
[31m-** DynASM x86 encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"x86"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. DASM_STOP must be 255. */[m
[31m-enum {[m
[31m-  DASM_DISP = 233,[m
[31m-  DASM_IMM_S, DASM_IMM_B, DASM_IMM_W, DASM_IMM_D, DASM_IMM_WB, DASM_IMM_DB,[m
[31m-  DASM_VREG, DASM_SPACE, DASM_SETLABEL, DASM_REL_A, DASM_REL_LG, DASM_REL_PC,[m
[31m-  DASM_IMM_LG, DASM_IMM_PC, DASM_LABEL_LG, DASM_LABEL_PC, DASM_ALIGN,[m
[31m-  DASM_EXTERN, DASM_ESC, DASM_MARK, DASM_SECTION, DASM_STOP[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_VREG	0x15000000[m
[31m-#define DASM_S_UNDEF_L		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned char *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(int)(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status=DASM_S_RANGE_##st|(int)(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs, mrm = -1;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    int action = *p++;[m
[31m-    if (action < DASM_DISP) {[m
[31m-      ofs++;[m
[31m-    } else if (action <= DASM_REL_A) {[m
[31m-      int n = va_arg(ap, int);[m
[31m-      b[pos++] = n;[m
[31m-      switch (action) {[m
[31m-      case DASM_DISP:[m
[31m-	if (n == 0) { if (mrm < 0) mrm = p[-2]; if ((mrm&7) != 5) break; }[m
[31m-      case DASM_IMM_DB: if (((n+128)&-256) == 0) goto ob;[m
[31m-      case DASM_REL_A: /* Assumes ptrdiff_t is int. !x64 */[m
[31m-      case DASM_IMM_D: ofs += 4; break;[m
[31m-      case DASM_IMM_S: CK(((n+128)&-256) == 0, RANGE_I); goto ob;[m
[31m-      case DASM_IMM_B: CK((n&-256) == 0, RANGE_I); ob: ofs++; break;[m
[31m-      case DASM_IMM_WB: if (((n+128)&-256) == 0) goto ob;[m
[31m-      case DASM_IMM_W: CK((n&-65536) == 0, RANGE_I); ofs += 2; break;[m
[31m-      case DASM_SPACE: p++; ofs += n; break;[m
[31m-      case DASM_SETLABEL: b[pos-2] = -0x40000000; break;  /* Neg. label ofs. */[m
[31m-      case DASM_VREG: CK((n&-16) == 0 && (n != 4 || (*p>>5) != 2), RANGE_VREG);[m
[31m-	if (*p < 0x40 && p[1] == DASM_DISP) mrm = n;[m
[31m-	if (*p < 0x20 && (n&7) == 4) ofs++;[m
[31m-	switch ((*p++ >> 3) & 3) {[m
[31m-	case 3: n |= b[pos-3];[m
[31m-	case 2: n |= b[pos-2];[m
[31m-	case 1: if (n <= 7) { b[pos-1] |= 0x10; ofs--; }[m
[31m-	}[m
[31m-	continue;[m
[31m-      }[m
[31m-      mrm = -1;[m
[31m-    } else {[m
[31m-      int *pl, n;[m
[31m-      switch (action) {[m
[31m-      case DASM_REL_LG:[m
[31m-      case DASM_IMM_LG:[m
[31m-	n = *p++; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n <= 246) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl -= 246; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-      case DASM_IMM_PC: pl = D->pclabels + va_arg(ap, int); CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	ofs += 4;  /* Maximum offset needed. */[m
[31m-	if (action == DASM_REL_LG || action == DASM_REL_PC)[m
[31m-	  b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG: pl = D->lglabels + *p++; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC: pl = D->pclabels + va_arg(ap, int); CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; }[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_ALIGN:[m
[31m-	ofs += *p++;  /* Maximum alignment needed (arg is 2**n-1). */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_EXTERN: p += 2; ofs += 4; break;[m
[31m-      case DASM_ESC: p++; ofs++; break;[m
[31m-      case DASM_MARK: mrm = p[-2]; break;[m
[31m-      case DASM_SECTION:[m
[31m-	n = *p; CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n];[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink branches/aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 10; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	int op, action = *p++;[m
[31m-	switch (action) {[m
[31m-	case DASM_REL_LG: p++; op = p[-3]; goto rel_pc;[m
[31m-	case DASM_REL_PC: op = p[-2]; rel_pc: {[m
[31m-	  int shrink = op == 0xe9 ? 3 : ((op&0xf0) == 0x80 ? 4 : 0);[m
[31m-	  if (shrink) {  /* Shrinkable branch opcode? */[m
[31m-	    int lofs, lpos = b[pos];[m
[31m-	    if (lpos < 0) goto noshrink;  /* Ext global? */[m
[31m-	    lofs = *DASM_POS2PTR(D, lpos);[m
[31m-	    if (lpos > pos) {  /* Fwd label: add cumulative section offsets. */[m
[31m-	      int i;[m
[31m-	      for (i = secnum; i < DASM_POS2SEC(lpos); i++)[m
[31m-		lofs += D->sections[i].ofs;[m
[31m-	    } else {[m
[31m-	      lofs -= ofs;  /* Bkwd label: unfix offset. */[m
[31m-	    }[m
[31m-	    lofs -= b[pos+1];  /* Short branch ok? */[m
[31m-	    if (lofs >= -128-shrink && lofs <= 127) ofs -= shrink;  /* Yes. */[m
[31m-	    else { noshrink: shrink = 0; }  /* No, cannot shrink op. */[m
[31m-	  }[m
[31m-	  b[pos+1] = shrink;[m
[31m-	  pos += 2;[m
[31m-	  break;[m
[31m-	}[m
[31m-	case DASM_SPACE: case DASM_IMM_LG: case DASM_VREG: p++;[m
[31m-	case DASM_DISP: case DASM_IMM_S: case DASM_IMM_B: case DASM_IMM_W:[m
[31m-	case DASM_IMM_D: case DASM_IMM_WB: case DASM_IMM_DB:[m
[31m-	case DASM_SETLABEL: case DASM_REL_A: case DASM_IMM_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: p++;[m
[31m-	case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */[m
[31m-	case DASM_EXTERN: p += 2; break;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_MARK: break;[m
[31m-	case DASM_SECTION: case DASM_STOP: goto stop;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#define dasmb(x)	*cp++ = (unsigned char)(x)[m
[31m-#ifndef DASM_ALIGNED_WRITES[m
[31m-#define dasmw(x) \[m
[31m-  do { *((unsigned short *)cp) = (unsigned short)(x); cp+=2; } while (0)[m
[31m-#define dasmd(x) \[m
[31m-  do { *((unsigned int *)cp) = (unsigned int)(x); cp+=4; } while (0)[m
[31m-#else[m
[31m-#define dasmw(x)	do { dasmb(x); dasmb((x)>>8); } while (0)[m
[31m-#define dasmd(x)	do { dasmw(x); dasmw((x)>>16); } while (0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  unsigned char *base = (unsigned char *)buffer;[m
[31m-  unsigned char *cp = base;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      unsigned char *mark = NULL;[m
[31m-      while (1) {[m
[31m-	int action = *p++;[m
[31m-	int n = (action >= DASM_DISP && action <= DASM_ALIGN) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_DISP: if (!mark) mark = cp; {[m
[31m-	  unsigned char *mm = mark;[m
[31m-	  if (*p != DASM_IMM_DB && *p != DASM_IMM_WB) mark = NULL;[m
[31m-	  if (n == 0) { int mrm = mm[-1]&7; if (mrm == 4) mrm = mm[0]&7;[m
[31m-	    if (mrm != 5) { mm[-1] -= 0x80; break; } }[m
[31m-	  if (((n+128) & -256) != 0) goto wd; else mm[-1] -= 0x40;[m
[31m-	}[m
[31m-	case DASM_IMM_S: case DASM_IMM_B: wb: dasmb(n); break;[m
[31m-	case DASM_IMM_DB: if (((n+128)&-256) == 0) {[m
[31m-	    db: if (!mark) mark = cp; mark[-2] += 2; mark = NULL; goto wb;[m
[31m-	  } else mark = NULL;[m
[31m-	case DASM_IMM_D: wd: dasmd(n); break;[m
[31m-	case DASM_IMM_WB: if (((n+128)&-256) == 0) goto db; else mark = NULL;[m
[31m-	case DASM_IMM_W: dasmw(n); break;[m
[31m-	case DASM_VREG: {[m
[31m-	  int t = *p++;[m
[31m-	  unsigned char *ex = cp - (t&7);[m
[31m-	  if ((n & 8) && t < 0xa0) {[m
[31m-	    if (*ex & 0x80) ex[1] ^= 0x20 << (t>>6); else *ex ^= 1 << (t>>6);[m
[31m-	    n &= 7;[m
[31m-	  } else if (n & 0x10) {[m
[31m-	    if (*ex & 0x80) {[m
[31m-	      *ex = 0xc5; ex[1] = (ex[1] & 0x80) | ex[2]; ex += 2;[m
[31m-	    }[m
[31m-	    while (++ex < cp) ex[-1] = *ex;[m
[31m-	    if (mark) mark--;[m
[31m-	    cp--;[m
[31m-	    n &= 7;[m
[31m-	  }[m
[31m-	  if (t >= 0xc0) n <<= 4;[m
[31m-	  else if (t >= 0x40) n <<= 3;[m
[31m-	  else if (n == 4 && t < 0x20) { cp[-1] ^= n; *cp++ = 0x20; }[m
[31m-	  cp[-1] ^= n;[m
[31m-	  break;[m
[31m-	}[m
[31m-	case DASM_REL_LG: p++; if (n >= 0) goto rel_pc;[m
[31m-	  b++; n = (int)(ptrdiff_t)D->globals[-n];[m
[31m-	case DASM_REL_A: rel_a: n -= (int)(ptrdiff_t)(cp+4); goto wd; /* !x64 */[m
[31m-	case DASM_REL_PC: rel_pc: {[m
[31m-	  int shrink = *b++;[m
[31m-	  int *pb = DASM_POS2PTR(D, n); if (*pb < 0) { n = pb[1]; goto rel_a; }[m
[31m-	  n = *pb - ((int)(cp-base) + 4-shrink);[m
[31m-	  if (shrink == 0) goto wd;[m
[31m-	  if (shrink == 4) { cp--; cp[-1] = *cp-0x10; } else cp[-1] = 0xeb;[m
[31m-	  goto wb;[m
[31m-	}[m
[31m-	case DASM_IMM_LG:[m
[31m-	  p++; if (n < 0) { n = (int)(ptrdiff_t)D->globals[-n]; goto wd; }[m
[31m-	case DASM_IMM_PC: {[m
[31m-	  int *pb = DASM_POS2PTR(D, n);[m
[31m-	  n = *pb < 0 ? pb[1] : (*pb + (int)(ptrdiff_t)base);[m
[31m-	  goto wd;[m
[31m-	}[m
[31m-	case DASM_LABEL_LG: {[m
[31m-	  int idx = *p++;[m
[31m-	  if (idx >= 10)[m
[31m-	    D->globals[idx] = (void *)(base + (*p == DASM_SETLABEL ? *b : n));[m
[31m-	  break;[m
[31m-	}[m
[31m-	case DASM_LABEL_PC: case DASM_SETLABEL: break;[m
[31m-	case DASM_SPACE: { int fill = *p++; while (n--) *cp++ = fill; break; }[m
[31m-	case DASM_ALIGN:[m
[31m-	  n = *p++;[m
[31m-	  while (((cp-base) & n)) *cp++ = 0x90; /* nop */[m
[31m-	  break;[m
[31m-	case DASM_EXTERN: n = DASM_EXTERN(Dst, cp, p[1], *p); p += 2; goto wd;[m
[31m-	case DASM_MARK: mark = cp; break;[m
[31m-	case DASM_ESC: action = *p++;[m
[31m-	default: *cp++ = action; break;[m
[31m-	case DASM_SECTION: case DASM_STOP: goto stop;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_L|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(int)(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x86.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x86.lua[m
[1mdeleted file mode 100644[m
[1mindex a5efd98..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dasm_x86.lua[m
[1m+++ /dev/null[m
[36m@@ -1,2274 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM x86/x64 module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local x64 = x64[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	x64 and "x64" or "x86",[m
[31m-  description =	"DynASM x86/x64 module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, unpack, setmetatable = assert, unpack or table.unpack, setmetatable[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local find, match, gmatch, gsub = _s.find, _s.match, _s.gmatch, _s.gsub[m
[31m-local concat, sort, remove = table.concat, table.sort, table.remove[m
[31m-local bit = bit or require("bit")[m
[31m-local band, bxor, shl, shr = bit.band, bit.bxor, bit.lshift, bit.rshift[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  -- int arg, 1 buffer pos:[m
[31m-  "DISP",  "IMM_S", "IMM_B", "IMM_W", "IMM_D",  "IMM_WB", "IMM_DB",[m
[31m-  -- action arg (1 byte), int arg, 1 buffer pos (reg/num):[m
[31m-  "VREG", "SPACE",[m
[31m-  -- ptrdiff_t arg, 1 buffer pos (address): !x64[m
[31m-  "SETLABEL", "REL_A",[m
[31m-  -- action arg (1 byte) or int arg, 2 buffer pos (link, offset):[m
[31m-  "REL_LG", "REL_PC",[m
[31m-  -- action arg (1 byte) or int arg, 1 buffer pos (link):[m
[31m-  "IMM_LG", "IMM_PC",[m
[31m-  -- action arg (1 byte) or int arg, 1 buffer pos (offset):[m
[31m-  "LABEL_LG", "LABEL_PC",[m
[31m-  -- action arg (1 byte), 1 buffer pos (offset):[m
[31m-  "ALIGN",[m
[31m-  -- action args (2 bytes), no buffer pos.[m
[31m-  "EXTERN",[m
[31m-  -- action arg (1 byte), no buffer pos.[m
[31m-  "ESC",[m
[31m-  -- no action arg, no buffer pos.[m
[31m-  "MARK",[m
[31m-  -- action arg (1 byte), no buffer pos, terminal action:[m
[31m-  "SECTION",[m
[31m-  -- no args, no buffer pos, terminal action:[m
[31m-  "STOP"[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number (dynamically generated below).[m
[31m-local map_action = {}[m
[31m--- First action number. Everything below does not need to be escaped.[m
[31m-local actfirst = 256-#action_names[m
[31m-[m
[31m--- Action list buffer and string (only used to remove dupes).[m
[31m-local actlist = {}[m
[31m-local actstr = ""[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m--- VREG kind encodings, pre-shifted by 5 bits.[m
[31m-local map_vreg = {[m
[31m-  ["modrm.rm.m"] = 0x00,[m
[31m-  ["modrm.rm.r"] = 0x20,[m
[31m-  ["opcode"] =     0x20,[m
[31m-  ["sib.base"] =   0x20,[m
[31m-  ["sib.index"] =  0x40,[m
[31m-  ["modrm.reg"] =  0x80,[m
[31m-  ["vex.v"] =      0xa0,[m
[31m-  ["imm.hi"] =     0xc0,[m
[31m-}[m
[31m-[m
[31m--- Current number of VREG actions contributing to REX/VEX shrinkage.[m
[31m-local vreg_shrink_count = 0[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Compute action numbers for action names.[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  local num = actfirst + n - 1[m
[31m-  map_action[name] = num[m
[31m-end[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  local last = actlist[nn] or 255[m
[31m-  actlist[nn] = nil -- Remove last byte.[m
[31m-  if nn == 0 then nn = 1 end[m
[31m-  out:write("static const unsigned char ", name, "[", nn, "] = {\n")[m
[31m-  local s = "  "[m
[31m-  for n,b in ipairs(actlist) do[m
[31m-    s = s..b..","[m
[31m-    if #s >= 75 then[m
[31m-      assert(out:write(s, "\n"))[m
[31m-      s = "  "[m
[31m-    end[m
[31m-  end[m
[31m-  out:write(s, last, "\n};\n\n") -- Add last byte back.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add byte to action list.[m
[31m-local function wputxb(n)[m
[31m-  assert(n >= 0 and n <= 255 and n % 1 == 0, "byte out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, a, num)[m
[31m-  wputxb(assert(map_action[action], "bad action name `"..action.."'"))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Optionally add a VREG action.[m
[31m-local function wvreg(kind, vreg, psz, sk, defer)[m
[31m-  if not vreg then return end[m
[31m-  waction("VREG", vreg)[m
[31m-  local b = assert(map_vreg[kind], "bad vreg kind `"..vreg.."'")[m
[31m-  if b < (sk or 0) then[m
[31m-    vreg_shrink_count = vreg_shrink_count + 1[m
[31m-  end[m
[31m-  if not defer then[m
[31m-    b = b + vreg_shrink_count * 8[m
[31m-    vreg_shrink_count = 0[m
[31m-  end[m
[31m-  wputxb(b + (psz or 0))[m
[31m-end[m
[31m-[m
[31m--- Add call to embedded DynASM C code.[m
[31m-local function wcall(func, args)[m
[31m-  wline(format("dasm_%s(Dst, %s);", func, concat(args, ", ")), true)[m
[31m-end[m
[31m-[m
[31m--- Delete duplicate action list chunks. A tad slow, but so what.[m
[31m-local function dedupechunk(offset)[m
[31m-  local al, as = actlist, actstr[m
[31m-  local chunk = char(unpack(al, offset+1, #al))[m
[31m-  local orig = find(as, chunk, 1, true)[m
[31m-  if orig then[m
[31m-    actargs[1] = orig-1 -- Replace with original offset.[m
[31m-    for i=offset+1,#al do al[i] = nil end -- Kill dupe.[m
[31m-  else[m
[31m-    actstr = as..chunk[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  local offset = actargs[1][m
[31m-  if #actlist == offset then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  dedupechunk(offset)[m
[31m-  wcall("put", actargs) -- Add call to dasm_put().[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped byte.[m
[31m-local function wputb(n)[m
[31m-  if n >= actfirst then waction("ESC") end -- Need to escape byte.[m
[31m-  wputxb(n)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 10[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_@]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 246 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=10,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=10,next_global-1 do[m
[31m-    out:write("  ", prefix, gsub(t[i], "@.*", ""), ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=10,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = -1[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n < -256 then werror("too many extern labels") end[m
[31m-  next_extern = n - 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_extern) do t[-n] = name end[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=1,-next_extern-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_extern) do t[-n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=1,-next_extern-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-local map_archdef = {}		-- Ext. register name -> int. name.[m
[31m-local map_reg_rev = {}		-- Int. register name -> ext. name.[m
[31m-local map_reg_num = {}		-- Int. register name -> register number.[m
[31m-local map_reg_opsize = {}	-- Int. register name -> operand size.[m
[31m-local map_reg_valid_base = {}	-- Int. register name -> valid base register?[m
[31m-local map_reg_valid_index = {}	-- Int. register name -> valid index register?[m
[31m-local map_reg_needrex = {}	-- Int. register name -> need rex vs. no rex.[m
[31m-local reg_list = {}		-- Canonical list of int. register names.[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for _PTx macros).[m
[31m-[m
[31m-local addrsize = x64 and "q" or "d"	-- Size for address operands.[m
[31m-[m
[31m--- Helper functions to fill register maps.[m
[31m-local function mkrmap(sz, cl, names)[m
[31m-  local cname = format("@%s", sz)[m
[31m-  reg_list[#reg_list+1] = cname[m
[31m-  map_archdef[cl] = cname[m
[31m-  map_reg_rev[cname] = cl[m
[31m-  map_reg_num[cname] = -1[m
[31m-  map_reg_opsize[cname] = sz[m
[31m-  if sz == addrsize or sz == "d" then[m
[31m-    map_reg_valid_base[cname] = true[m
[31m-    map_reg_valid_index[cname] = true[m
[31m-  end[m
[31m-  if names then[m
[31m-    for n,name in ipairs(names) do[m
[31m-      local iname = format("@%s%x", sz, n-1)[m
[31m-      reg_list[#reg_list+1] = iname[m
[31m-      map_archdef[name] = iname[m
[31m-      map_reg_rev[iname] = name[m
[31m-      map_reg_num[iname] = n-1[m
[31m-      map_reg_opsize[iname] = sz[m
[31m-      if sz == "b" and n > 4 then map_reg_needrex[iname] = false end[m
[31m-      if sz == addrsize or sz == "d" then[m
[31m-	map_reg_valid_base[iname] = true[m
[31m-	map_reg_valid_index[iname] = true[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  for i=0,(x64 and sz ~= "f") and 15 or 7 do[m
[31m-    local needrex = sz == "b" and i > 3[m
[31m-    local iname = format("@%s%x%s", sz, i, needrex and "R" or "")[m
[31m-    if needrex then map_reg_needrex[iname] = true end[m
[31m-    local name[m
[31m-    if sz == "o" or sz == "y" then name = format("%s%d", cl, i)[m
[31m-    elseif sz == "f" then name = format("st%d", i)[m
[31m-    else name = format("r%d%s", i, sz == addrsize and "" or sz) end[m
[31m-    map_archdef[name] = iname[m
[31m-    if not map_reg_rev[iname] then[m
[31m-      reg_list[#reg_list+1] = iname[m
[31m-      map_reg_rev[iname] = name[m
[31m-      map_reg_num[iname] = i[m
[31m-      map_reg_opsize[iname] = sz[m
[31m-      if sz == addrsize or sz == "d" then[m
[31m-	map_reg_valid_base[iname] = true[m
[31m-	map_reg_valid_index[iname] = true[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  reg_list[#reg_list+1] = ""[m
[31m-end[m
[31m-[m
[31m--- Integer registers (qword, dword, word and byte sized).[m
[31m-if x64 then[m
[31m-  mkrmap("q", "Rq", {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi"})[m
[31m-end[m
[31m-mkrmap("d", "Rd", {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"})[m
[31m-mkrmap("w", "Rw", {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di"})[m
[31m-mkrmap("b", "Rb", {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"})[m
[31m-map_reg_valid_index[map_archdef.esp] = false[m
[31m-if x64 then map_reg_valid_index[map_archdef.rsp] = false end[m
[31m-if x64 then map_reg_needrex[map_archdef.Rb] = true end[m
[31m-map_archdef["Ra"] = "@"..addrsize[m
[31m-[m
[31m--- FP registers (internally tword sized, but use "f" as operand size).[m
[31m-mkrmap("f", "Rf")[m
[31m-[m
[31m--- SSE registers (oword sized, but qword and dword accessible).[m
[31m-mkrmap("o", "xmm")[m
[31m-[m
[31m--- AVX registers (yword sized, but oword, qword and dword accessible).[m
[31m-mkrmap("y", "ymm")[m
[31m-[m
[31m--- Operand size prefixes to codes.[m
[31m-local map_opsize = {[m
[31m-  byte = "b", word = "w", dword = "d", qword = "q", oword = "o", yword = "y",[m
[31m-  tword = "t", aword = addrsize,[m
[31m-}[m
[31m-[m
[31m--- Operand size code to number.[m
[31m-local map_opsizenum = {[m
[31m-  b = 1, w = 2, d = 4, q = 8, o = 16, y = 32, t = 10,[m
[31m-}[m
[31m-[m
[31m--- Operand size code to name.[m
[31m-local map_opsizename = {[m
[31m-  b = "byte", w = "word", d = "dword", q = "qword", o = "oword", y = "yword",[m
[31m-  t = "tword", f = "fpword",[m
[31m-}[m
[31m-[m
[31m--- Valid index register scale factors.[m
[31m-local map_xsc = {[m
[31m-  ["1"] = 0, ["2"] = 1, ["4"] = 2, ["8"] = 3,[m
[31m-}[m
[31m-[m
[31m--- Condition codes.[m
[31m-local map_cc = {[m
[31m-  o = 0, no = 1, b = 2, nb = 3, e = 4, ne = 5, be = 6, nbe = 7,[m
[31m-  s = 8, ns = 9, p = 10, np = 11, l = 12, nl = 13, le = 14, nle = 15,[m
[31m-  c = 2, nae = 2, nc = 3, ae = 3, z = 4, nz = 5, na = 6, a = 7,[m
[31m-  pe = 10, po = 11, nge = 12, ge = 13, ng = 14, g = 15,[m
[31m-}[m
[31m-[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  return gsub(s, "@%w+", map_reg_rev)[m
[31m-end[m
[31m-[m
[31m--- Dump register names and numbers[m
[31m-local function dumpregs(out)[m
[31m-  out:write("Register names, sizes and internal numbers:\n")[m
[31m-  for _,reg in ipairs(reg_list) do[m
[31m-    if reg == "" then[m
[31m-      out:write("\n")[m
[31m-    else[m
[31m-      local name = map_reg_rev[reg][m
[31m-      local num = map_reg_num[reg][m
[31m-      local opsize = map_opsizename[map_reg_opsize[reg]][m
[31m-      out:write(format("  %-5s %-8s %s\n", name, opsize,[m
[31m-		       num < 0 and "(variable)" or num))[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Put action for label arg (IMM_LG, IMM_PC, REL_LG, REL_PC).[m
[31m-local function wputlabel(aprefix, imm, num)[m
[31m-  if type(imm) == "number" then[m
[31m-    if imm < 0 then[m
[31m-      waction("EXTERN")[m
[31m-      wputxb(aprefix == "IMM_" and 0 or 1)[m
[31m-      imm = -imm-1[m
[31m-    else[m
[31m-      waction(aprefix.."LG", nil, num);[m
[31m-    end[m
[31m-    wputxb(imm)[m
[31m-  else[m
[31m-    waction(aprefix.."PC", imm, num)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Put signed byte or arg.[m
[31m-local function wputsbarg(n)[m
[31m-  if type(n) == "number" then[m
[31m-    if n < -128 or n > 127 then[m
[31m-      werror("signed immediate byte out of range")[m
[31m-    end[m
[31m-    if n < 0 then n = n + 256 end[m
[31m-    wputb(n)[m
[31m-  else waction("IMM_S", n) end[m
[31m-end[m
[31m-[m
[31m--- Put unsigned byte or arg.[m
[31m-local function wputbarg(n)[m
[31m-  if type(n) == "number" then[m
[31m-    if n < 0 or n > 255 then[m
[31m-      werror("unsigned immediate byte out of range")[m
[31m-    end[m
[31m-    wputb(n)[m
[31m-  else waction("IMM_B", n) end[m
[31m-end[m
[31m-[m
[31m--- Put unsigned word or arg.[m
[31m-local function wputwarg(n)[m
[31m-  if type(n) == "number" then[m
[31m-    if shr(n, 16) ~= 0 then[m
[31m-      werror("unsigned immediate word out of range")[m
[31m-    end[m
[31m-    wputb(band(n, 255)); wputb(shr(n, 8));[m
[31m-  else waction("IMM_W", n) end[m
[31m-end[m
[31m-[m
[31m--- Put signed or unsigned dword or arg.[m
[31m-local function wputdarg(n)[m
[31m-  local tn = type(n)[m
[31m-  if tn == "number" then[m
[31m-    wputb(band(n, 255))[m
[31m-    wputb(band(shr(n, 8), 255))[m
[31m-    wputb(band(shr(n, 16), 255))[m
[31m-    wputb(shr(n, 24))[m
[31m-  elseif tn == "table" then[m
[31m-    wputlabel("IMM_", n[1], 1)[m
[31m-  else[m
[31m-    waction("IMM_D", n)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Put operand-size dependent number or arg (defaults to dword).[m
[31m-local function wputszarg(sz, n)[m
[31m-  if not sz or sz == "d" or sz == "q" then wputdarg(n)[m
[31m-  elseif sz == "w" then wputwarg(n)[m
[31m-  elseif sz == "b" then wputbarg(n)[m
[31m-  elseif sz == "s" then wputsbarg(n)[m
[31m-  else werror("bad operand size") end[m
[31m-end[m
[31m-[m
[31m--- Put multi-byte opcode with operand-size dependent modifications.[m
[31m-local function wputop(sz, op, rex, vex, vregr, vregxb)[m
[31m-  local psz, sk = 0, nil[m
[31m-  if vex then[m
[31m-    local tail[m
[31m-    if vex.m == 1 and band(rex, 11) == 0 then[m
[31m-      if x64 and vregxb then[m
[31m-	sk = map_vreg["modrm.reg"][m
[31m-      else[m
[31m-	wputb(0xc5)[m
[31m-      tail = shl(bxor(band(rex, 4), 4), 5)[m
[31m-      psz = 3[m
[31m-      end[m
[31m-    end[m
[31m-    if not tail then[m
[31m-      wputb(0xc4)[m
[31m-      wputb(shl(bxor(band(rex, 7), 7), 5) + vex.m)[m
[31m-      tail = shl(band(rex, 8), 4)[m
[31m-      psz = 4[m
[31m-    end[m
[31m-    local reg, vreg = 0, nil[m
[31m-    if vex.v then[m
[31m-      reg = vex.v.reg[m
[31m-      if not reg then werror("bad vex operand") end[m
[31m-      if reg < 0 then reg = 0; vreg = vex.v.vreg end[m
[31m-    end[m
[31m-    if sz == "y" or vex.l then tail = tail + 4 end[m
[31m-    wputb(tail + shl(bxor(reg, 15), 3) + vex.p)[m
[31m-    wvreg("vex.v", vreg)[m
[31m-    rex = 0[m
[31m-    if op >= 256 then werror("bad vex opcode") end[m
[31m-  else[m
[31m-    if rex ~= 0 then[m
[31m-      if not x64 then werror("bad operand size") end[m
[31m-    elseif (vregr or vregxb) and x64 then[m
[31m-      rex = 0x10[m
[31m-      sk = map_vreg["vex.v"][m
[31m-    end[m
[31m-  end[m
[31m-  local r[m
[31m-  if sz == "w" then wputb(102) end[m
[31m-  -- Needs >32 bit numbers, but only for crc32 eax, word [ebx][m
[31m-  if op >= 4294967296 then r = op%4294967296 wputb((op-r)/4294967296) op = r end[m
[31m-  if op >= 16777216 then wputb(shr(op, 24)); op = band(op, 0xffffff) end[m
[31m-  if op >= 65536 then[m
[31m-    if rex ~= 0 then[m
[31m-      local opc3 = band(op, 0xffff00)[m
[31m-      if opc3 == 0x0f3a00 or opc3 == 0x0f3800 then[m
[31m-	wputb(64 + band(rex, 15)); rex = 0; psz = 2[m
[31m-      end[m
[31m-    end[m
[31m-    wputb(shr(op, 16)); op = band(op, 0xffff); psz = psz + 1[m
[31m-  end[m
[31m-  if op >= 256 then[m
[31m-    local b = shr(op, 8)[m
[31m-    if b == 15 and rex ~= 0 then wputb(64 + band(rex, 15)); rex = 0; psz = 2 end[m
[31m-    wputb(b); op = band(op, 255); psz = psz + 1[m
[31m-  end[m
[31m-  if rex ~= 0 then wputb(64 + band(rex, 15)); psz = 2 end[m
[31m-  if sz == "b" then op = op - 1 end[m
[31m-  wputb(op)[m
[31m-  return psz, sk[m
[31m-end[m
[31m-[m
[31m--- Put ModRM or SIB formatted byte.[m
[31m-local function wputmodrm(m, s, rm, vs, vrm)[m
[31m-  assert(m < 4 and s < 16 and rm < 16, "bad modrm operands")[m
[31m-  wputb(shl(m, 6) + shl(band(s, 7), 3) + band(rm, 7))[m
[31m-end[m
[31m-[m
[31m--- Put ModRM/SIB plus optional displacement.[m
[31m-local function wputmrmsib(t, imark, s, vsreg, psz, sk)[m
[31m-  local vreg, vxreg[m
[31m-  local reg, xreg = t.reg, t.xreg[m
[31m-  if reg and reg < 0 then reg = 0; vreg = t.vreg end[m
[31m-  if xreg and xreg < 0 then xreg = 0; vxreg = t.vxreg end[m
[31m-  if s < 0 then s = 0 end[m
[31m-[m
[31m-  -- Register mode.[m
[31m-  if sub(t.mode, 1, 1) == "r" then[m
[31m-    wputmodrm(3, s, reg)[m
[31m-    wvreg("modrm.reg", vsreg, psz+1, sk, vreg)[m
[31m-    wvreg("modrm.rm.r", vreg, psz+1, sk)[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  local disp = t.disp[m
[31m-  local tdisp = type(disp)[m
[31m-  -- No base register?[m
[31m-  if not reg then[m
[31m-    local riprel = false[m
[31m-    if xreg then[m
[31m-      -- Indexed mode with index register only.[m
[31m-      -- [xreg*xsc+disp] -> (0, s, esp) (xsc, xreg, ebp)[m
[31m-      wputmodrm(0, s, 4)[m
[31m-      if imark == "I" then waction("MARK") end[m
[31m-      wvreg("modrm.reg", vsreg, psz+1, sk, vxreg)[m
[31m-      wputmodrm(t.xsc, xreg, 5)[m
[31m-      wvreg("sib.index", vxreg, psz+2, sk)[m
[31m-    else[m
[31m-      -- Pure 32 bit displacement.[m
[31m-      if x64 and tdisp ~= "table" then[m
[31m-	wputmodrm(0, s, 4) -- [disp] -> (0, s, esp) (0, esp, ebp)[m
[31m-	wvreg("modrm.reg", vsreg, psz+1, sk)[m
[31m-	if imark == "I" then waction("MARK") end[m
[31m-	wputmodrm(0, 4, 5)[m
[31m-      else[m
[31m-	riprel = x64[m
[31m-	wputmodrm(0, s, 5) -- [disp|rip-label] -> (0, s, ebp)[m
[31m-	wvreg("modrm.reg", vsreg, psz+1, sk)[m
[31m-	if imark == "I" then waction("MARK") end[m
[31m-      end[m
[31m-    end[m
[31m-    if riprel then -- Emit rip-relative displacement.[m
[31m-      if match("UWSiI", imark) then[m
[31m-	werror("NYI: rip-relative displacement followed by immediate")[m
[31m-      end[m
[31m-      -- The previous byte in the action buffer cannot be 0xe9 or 0x80-0x8f.[m
[31m-      wputlabel("REL_", disp[1], 2)[m
[31m-    else[m
[31m-      wputdarg(disp)[m
[31m-    end[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  local m[m
[31m-  if tdisp == "number" then -- Check displacement size at assembly time.[m
[31m-    if disp == 0 and band(reg, 7) ~= 5 then -- [ebp] -> [ebp+0] (in SIB, too)[m
[31m-      if not vreg then m = 0 end -- Force DISP to allow [Rd(5)] -> [ebp+0][m
[31m-    elseif disp >= -128 and disp <= 127 then m = 1[m
[31m-    else m = 2 end[m
[31m-  elseif tdisp == "table" then[m
[31m-    m = 2[m
[31m-  end[m
[31m-[m
[31m-  -- Index register present or esp as base register: need SIB encoding.[m
[31m-  if xreg or band(reg, 7) == 4 then[m
[31m-    wputmodrm(m or 2, s, 4) -- ModRM.[m
[31m-    if m == nil or imark == "I" then waction("MARK") end[m
[31m-    wvreg("modrm.reg", vsreg, psz+1, sk, vxreg or vreg)[m
[31m-    wputmodrm(t.xsc or 0, xreg or 4, reg) -- SIB.[m
[31m-    wvreg("sib.index", vxreg, psz+2, sk, vreg)[m
[31m-    wvreg("sib.base", vreg, psz+2, sk)[m
[31m-  else[m
[31m-    wputmodrm(m or 2, s, reg) -- ModRM.[m
[31m-    if (imark == "I" and (m == 1 or m == 2)) or[m
[31m-       (m == nil and (vsreg or vreg)) then waction("MARK") end[m
[31m-    wvreg("modrm.reg", vsreg, psz+1, sk, vreg)[m
[31m-    wvreg("modrm.rm.m", vreg, psz+1, sk)[m
[31m-  end[m
[31m-[m
[31m-  -- Put displacement.[m
[31m-  if m == 1 then wputsbarg(disp)[m
[31m-  elseif m == 2 then wputdarg(disp)[m
[31m-  elseif m == nil then waction("DISP", disp) end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Return human-readable operand mode string.[m
[31m-local function opmodestr(op, args)[m
[31m-  local m = {}[m
[31m-  for i=1,#args do[m
[31m-    local a = args[i][m
[31m-    m[#m+1] = sub(a.mode, 1, 1)..(a.opsize or "?")[m
[31m-  end[m
[31m-  return op.." "..concat(m, ",")[m
[31m-end[m
[31m-[m
[31m--- Convert number to valid integer or nil.[m
[31m-local function toint(expr)[m
[31m-  local n = tonumber(expr)[m
[31m-  if n then[m
[31m-    if n % 1 ~= 0 or n < -2147483648 or n > 4294967295 then[m
[31m-      werror("bad integer number `"..expr.."'")[m
[31m-    end[m
[31m-    return n[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Parse immediate expression.[m
[31m-local function immexpr(expr)[m
[31m-  -- &expr (pointer)[m
[31m-  if sub(expr, 1, 1) == "&" then[m
[31m-    return "iPJ", format("(ptrdiff_t)(%s)", sub(expr,2))[m
[31m-  end[m
[31m-[m
[31m-  local prefix = sub(expr, 1, 2)[m
[31m-  -- =>expr (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "iJ", sub(expr, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "iJ", map_global[sub(expr, 3)][m
[31m-  end[m
[31m-[m
[31m-  -- [<>][1-9] (local label reference)[m
[31m-  local dir, lnum = match(expr, "^([<>])([1-9])$")[m
[31m-  if dir then -- Fwd: 247-255, Bkwd: 1-9.[m
[31m-    return "iJ", lnum + (dir == ">" and 246 or 0)[m
[31m-  end[m
[31m-[m
[31m-  local extname = match(expr, "^extern%s+(%S+)$")[m
[31m-  if extname then[m
[31m-    return "iJ", map_extern[extname][m
[31m-  end[m
[31m-[m
[31m-  -- expr (interpreted as immediate)[m
[31m-  return "iI", expr[m
[31m-end[m
[31m-[m
[31m--- Parse displacement expression: +-num, +-expr, +-opsize*num[m
[31m-local function dispexpr(expr)[m
[31m-  local disp = expr == "" and 0 or toint(expr)[m
[31m-  if disp then return disp end[m
[31m-  local c, dispt = match(expr, "^([+-])%s*(.+)$")[m
[31m-  if c == "+" then[m
[31m-    expr = dispt[m
[31m-  elseif not c then[m
[31m-    werror("bad displacement expression `"..expr.."'")[m
[31m-  end[m
[31m-  local opsize, tailops = match(dispt, "^(%w+)%s*%*%s*(.+)$")[m
[31m-  local ops, imm = map_opsize[opsize], toint(tailops)[m
[31m-  if ops and imm then[m
[31m-    if c == "-" then imm = -imm end[m
[31m-    return imm*map_opsizenum[ops][m
[31m-  end[m
[31m-  local mode, iexpr = immexpr(dispt)[m
[31m-  if mode == "iJ" then[m
[31m-    if c == "-" then werror("cannot invert label reference") end[m
[31m-    return { iexpr }[m
[31m-  end[m
[31m-  return expr -- Need to return original signed expression.[m
[31m-end[m
[31m-[m
[31m--- Parse register or type expression.[m
[31m-local function rtexpr(expr)[m
[31m-  if not expr then return end[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(@[%w_]+)$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    local rnum = map_reg_num[reg][m
[31m-    if not rnum then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    if not map_reg_valid_base[reg] then[m
[31m-      werror("bad base register override `"..(map_reg_rev[reg] or reg).."'")[m
[31m-    end[m
[31m-    return reg, rnum, tp[m
[31m-  end[m
[31m-  return expr, map_reg_num[expr][m
[31m-end[m
[31m-[m
[31m--- Parse operand and return { mode, opsize, reg, xreg, xsc, disp, imm }.[m
[31m-local function parseoperand(param)[m
[31m-  local t = {}[m
[31m-[m
[31m-  local expr = param[m
[31m-  local opsize, tailops = match(param, "^(%w+)%s*(.+)$")[m
[31m-  if opsize then[m
[31m-    t.opsize = map_opsize[opsize][m
[31m-    if t.opsize then expr = tailops end[m
[31m-  end[m
[31m-[m
[31m-  local br = match(expr, "^%[%s*(.-)%s*%]$")[m
[31m-  repeat[m
[31m-    if br then[m
[31m-      t.mode = "xm"[m
[31m-[m
[31m-      -- [disp][m
[31m-      t.disp = toint(br)[m
[31m-      if t.disp then[m
[31m-	t.mode = x64 and "xm" or "xmO"[m
[31m-	break[m
[31m-      end[m
[31m-[m
[31m-      -- [reg...][m
[31m-      local tp[m
[31m-      local reg, tailr = match(br, "^([@%w_:]+)%s*(.*)$")[m
[31m-      reg, t.reg, tp = rtexpr(reg)[m
[31m-      if not t.reg then[m
[31m-	-- [expr][m
[31m-	t.mode = x64 and "xm" or "xmO"[m
[31m-	t.disp = dispexpr("+"..br)[m
[31m-	break[m
[31m-      end[m
[31m-[m
[31m-      if t.reg == -1 then[m
[31m-	t.vreg, tailr = match(tailr, "^(%b())(.*)$")[m
[31m-	if not t.vreg then werror("bad variable register expression") end[m
[31m-      end[m
[31m-[m
[31m-      -- [xreg*xsc] or [xreg*xsc+-disp] or [xreg*xsc+-expr][m
[31m-      local xsc, tailsc = match(tailr, "^%*%s*([1248])%s*(.*)$")[m
[31m-      if xsc then[m
[31m-	if not map_reg_valid_index[reg] then[m
[31m-	  werror("bad index register `"..map_reg_rev[reg].."'")[m
[31m-	end[m
[31m-	t.xsc = map_xsc[xsc][m
[31m-	t.xreg = t.reg[m
[31m-	t.vxreg = t.vreg[m
[31m-	t.reg = nil[m
[31m-	t.vreg = nil[m
[31m-	t.disp = dispexpr(tailsc)[m
[31m-	break[m
[31m-      end[m
[31m-      if not map_reg_valid_base[reg] then[m
[31m-	werror("bad base register `"..map_reg_rev[reg].."'")[m
[31m-      end[m
[31m-[m
[31m-      -- [reg] or [reg+-disp][m
[31m-      t.disp = toint(tailr) or (tailr == "" and 0)[m
[31m-      if t.disp then break end[m
[31m-[m
[31m-      -- [reg+xreg...][m
[31m-      local xreg, tailx = match(tailr, "^+%s*([@%w_:]+)%s*(.*)$")[m
[31m-      xreg, t.xreg, tp = rtexpr(xreg)[m
[31m-      if not t.xreg then[m
[31m-	-- [reg+-expr][m
[31m-	t.disp = dispexpr(tailr)[m
[31m-	break[m
[31m-      end[m
[31m-      if not map_reg_valid_index[xreg] then[m
[31m-	werror("bad index register `"..map_reg_rev[xreg].."'")[m
[31m-      end[m
[31m-[m
[31m-      if t.xreg == -1 then[m
[31m-	t.vxreg, tailx = match(tailx, "^(%b())(.*)$")[m
[31m-	if not t.vxreg then werror("bad variable register expression") end[m
[31m-      end[m
[31m-[m
[31m-      -- [reg+xreg*xsc...][m
[31m-      local xsc, tailsc = match(tailx, "^%*%s*([1248])%s*(.*)$")[m
[31m-      if xsc then[m
[31m-	t.xsc = map_xsc[xsc][m
[31m-	tailx = tailsc[m
[31m-      end[m
[31m-[m
[31m-      -- [...] or [...+-disp] or [...+-expr][m
[31m-      t.disp = dispexpr(tailx)[m
[31m-    else[m
[31m-      -- imm or opsize*imm[m
[31m-      local imm = toint(expr)[m
[31m-      if not imm and sub(expr, 1, 1) == "*" and t.opsize then[m
[31m-	imm = toint(sub(expr, 2))[m
[31m-	if imm then[m
[31m-	  imm = imm * map_opsizenum[t.opsize][m
[31m-	  t.opsize = nil[m
[31m-	end[m
[31m-      end[m
[31m-      if imm then[m
[31m-	if t.opsize then werror("bad operand size override") end[m
[31m-	local m = "i"[m
[31m-	if imm == 1 then m = m.."1" end[m
[31m-	if imm >= 4294967168 and imm <= 4294967295 then imm = imm-4294967296 end[m
[31m-	if imm >= -128 and imm <= 127 then m = m.."S" end[m
[31m-	t.imm = imm[m
[31m-	t.mode = m[m
[31m-	break[m
[31m-      end[m
[31m-[m
[31m-      local tp[m
[31m-      local reg, tailr = match(expr, "^([@%w_:]+)%s*(.*)$")[m
[31m-      reg, t.reg, tp = rtexpr(reg)[m
[31m-      if t.reg then[m
[31m-	if t.reg == -1 then[m
[31m-	  t.vreg, tailr = match(tailr, "^(%b())(.*)$")[m
[31m-	  if not t.vreg then werror("bad variable register expression") end[m
[31m-	end[m
[31m-	-- reg[m
[31m-	if tailr == "" then[m
[31m-	  if t.opsize then werror("bad operand size override") end[m
[31m-	  t.opsize = map_reg_opsize[reg][m
[31m-	  if t.opsize == "f" then[m
[31m-	    t.mode = t.reg == 0 and "fF" or "f"[m
[31m-	  else[m
[31m-	    if reg == "@w4" or (x64 and reg == "@d4") then[m
[31m-	      wwarn("bad idea, try again with `"..(x64 and "rsp'" or "esp'"))[m
[31m-	    end[m
[31m-	    t.mode = t.reg == 0 and "rmR" or (reg == "@b1" and "rmC" or "rm")[m
[31m-	  end[m
[31m-	  t.needrex = map_reg_needrex[reg][m
[31m-	  break[m
[31m-	end[m
[31m-[m
[31m-	-- type[idx], type[idx].field, type->field -> [reg+offset_expr][m
[31m-	if not tp then werror("bad operand `"..param.."'") end[m
[31m-	t.mode = "xm"[m
[31m-	t.disp = format(tp.ctypefmt, tailr)[m
[31m-      else[m
[31m-	t.mode, t.imm = immexpr(expr)[m
[31m-	if sub(t.mode, -1) == "J" then[m
[31m-	  if t.opsize and t.opsize ~= addrsize then[m
[31m-	    werror("bad operand size override")[m
[31m-	  end[m
[31m-	  t.opsize = addrsize[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-  until true[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- x86 Template String Description[m
[31m--- ===============================[m
[31m---[m
[31m--- Each template string is a list of [match:]pattern pairs,[m
[31m--- separated by "|". The first match wins. No match means a[m
[31m--- bad or unsupported combination of operand modes or sizes.[m
[31m---[m
[31m--- The match part and the ":" is omitted if the operation has[m
[31m--- no operands. Otherwise the first N characters are matched[m
[31m--- against the mode strings of each of the N operands.[m
[31m---[m
[31m--- The mode string for each operand type is (see parseoperand()):[m
[31m---   Integer register: "rm", +"R" for eax, ax, al, +"C" for cl[m
[31m---   FP register:      "f",  +"F" for st0[m
[31m---   Index operand:    "xm", +"O" for [disp] (pure offset)[m
[31m---   Immediate:        "i",  +"S" for signed 8 bit, +"1" for 1,[m
[31m---                     +"I" for arg, +"P" for pointer[m
[31m---   Any:              +"J" for valid jump targets[m
[31m---[m
[31m--- So a match character "m" (mixed) matches both an integer register[m
[31m--- and an index operand (to be encoded with the ModRM/SIB scheme).[m
[31m--- But "r" matches only a register and "x" only an index operand[m
[31m--- (e.g. for FP memory access operations).[m
[31m---[m
[31m--- The operand size match string starts right after the mode match[m
[31m--- characters and ends before the ":". "dwb" or "qdwb" is assumed, if empty.[m
[31m--- The effective data size of the operation is matched against this list.[m
[31m---[m
[31m--- If only the regular "b", "w", "d", "q", "t" operand sizes are[m
[31m--- present, then all operands must be the same size. Unspecified sizes[m
[31m--- are ignored, but at least one operand must have a size or the pattern[m
[31m--- won't match (use the "byte", "word", "dword", "qword", "tword"[m
[31m--- operand size overrides. E.g.: mov dword [eax], 1).[m
[31m---[m
[31m--- If the list has a "1" or "2" prefix, the operand size is taken[m
[31m--- from the respective operand and any other operand sizes are ignored.[m
[31m--- If the list contains only ".", all operand sizes are ignored.[m
[31m--- If the list has a "/" prefix, the concatenated (mixed) operand sizes[m
[31m--- are compared to the match.[m
[31m---[m
[31m--- E.g. "rrdw" matches for either two dword registers or two word[m
[31m--- registers. "Fx2dq" matches an st0 operand plus an index operand[m
[31m--- pointing to a dword (float) or qword (double).[m
[31m---[m
[31m--- Every character after the ":" is part of the pattern string:[m
[31m---   Hex chars are accumulated to form the opcode (left to right).[m
[31m---   "n"       disables the standard opcode mods[m
[31m---             (otherwise: -1 for "b", o16 prefix for "w", rex.w for "q")[m
[31m---   "X"       Force REX.W.[m
[31m---   "r"/"R"   adds the reg. number from the 1st/2nd operand to the opcode.[m
[31m---   "m"/"M"   generates ModRM/SIB from the 1st/2nd operand.[m
[31m---             The spare 3 bits are either filled with the last hex digit or[m
[31m---             the result from a previous "r"/"R". The opcode is restored.[m
[31m---   "u"       Use VEX encoding, vvvv unused.[m
[31m---   "v"/"V"   Use VEX encoding, vvvv from 1st/2nd operand (the operand is[m
[31m---             removed from the list used by future characters).[m
[31m---   "L"       Force VEX.L[m
[31m---[m
[31m--- All of the following characters force a flush of the opcode:[m
[31m---   "o"/"O"   stores a pure 32 bit disp (offset) from the 1st/2nd operand.[m
[31m---   "s"       stores a 4 bit immediate from the last register operand,[m
[31m---             followed by 4 zero bits.[m
[31m---   "S"       stores a signed 8 bit immediate from the last operand.[m
[31m---   "U"       stores an unsigned 8 bit immediate from the last operand.[m
[31m---   "W"       stores an unsigned 16 bit immediate from the last operand.[m
[31m---   "i"       stores an operand sized immediate from the last operand.[m
[31m---   "I"       dito, but generates an action code to optionally modify[m
[31m---             the opcode (+2) for a signed 8 bit immediate.[m
[31m---   "J"       generates one of the REL action codes from the last operand.[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Template strings for x86 instructions. Ordered by first opcode byte.[m
[31m--- Unimplemented opcodes (deliberate omissions) are marked with *.[m
[31m-local map_op = {[m
[31m-  -- 00-05: add...[m
[31m-  -- 06: *push es[m
[31m-  -- 07: *pop es[m
[31m-  -- 08-0D: or...[m
[31m-  -- 0E: *push cs[m
[31m-  -- 0F: two byte opcode prefix[m
[31m-  -- 10-15: adc...[m
[31m-  -- 16: *push ss[m
[31m-  -- 17: *pop ss[m
[31m-  -- 18-1D: sbb...[m
[31m-  -- 1E: *push ds[m
[31m-  -- 1F: *pop ds[m
[31m-  -- 20-25: and...[m
[31m-  es_0 =	"26",[m
[31m-  -- 27: *daa[m
[31m-  -- 28-2D: sub...[m
[31m-  cs_0 =	"2E",[m
[31m-  -- 2F: *das[m
[31m-  -- 30-35: xor...[m
[31m-  ss_0 =	"36",[m
[31m-  -- 37: *aaa[m
[31m-  -- 38-3D: cmp...[m
[31m-  ds_0 =	"3E",[m
[31m-  -- 3F: *aas[m
[31m-  inc_1 =	x64 and "m:FF0m" or "rdw:40r|m:FF0m",[m
[31m-  dec_1 =	x64 and "m:FF1m" or "rdw:48r|m:FF1m",[m
[31m-  push_1 =	(x64 and "rq:n50r|rw:50r|mq:nFF6m|mw:FF6m" or[m
[31m-			 "rdw:50r|mdw:FF6m").."|S.:6AS|ib:n6Ai|i.:68i",[m
[31m-  pop_1 =	x64 and "rq:n58r|rw:58r|mq:n8F0m|mw:8F0m" or "rdw:58r|mdw:8F0m",[m
[31m-  -- 60: *pusha, *pushad, *pushaw[m
[31m-  -- 61: *popa, *popad, *popaw[m
[31m-  -- 62: *bound rdw,x[m
[31m-  -- 63: x86: *arpl mw,rw[m
[31m-  movsxd_2 =	x64 and "rm/qd:63rM",[m
[31m-  fs_0 =	"64",[m
[31m-  gs_0 =	"65",[m
[31m-  o16_0 =	"66",[m
[31m-  a16_0 =	not x64 and "67" or nil,[m
[31m-  a32_0 =	x64 and "67",[m
[31m-  -- 68: push idw[m
[31m-  -- 69: imul rdw,mdw,idw[m
[31m-  -- 6A: push ib[m
[31m-  -- 6B: imul rdw,mdw,S[m
[31m-  -- 6C: *insb[m
[31m-  -- 6D: *insd, *insw[m
[31m-  -- 6E: *outsb[m
[31m-  -- 6F: *outsd, *outsw[m
[31m-  -- 70-7F: jcc lb[m
[31m-  -- 80: add... mb,i[m
[31m-  -- 81: add... mdw,i[m
[31m-  -- 82: *undefined[m
[31m-  -- 83: add... mdw,S[m
[31m-  test_2 =	"mr:85Rm|rm:85rM|Ri:A9ri|mi:F70mi",[m
[31m-  -- 86: xchg rb,mb[m
[31m-  -- 87: xchg rdw,mdw[m
[31m-  -- 88: mov mb,r[m
[31m-  -- 89: mov mdw,r[m
[31m-  -- 8A: mov r,mb[m
[31m-  -- 8B: mov r,mdw[m
[31m-  -- 8C: *mov mdw,seg[m
[31m-  lea_2 =	"rx1dq:8DrM",[m
[31m-  -- 8E: *mov seg,mdw[m
[31m-  -- 8F: pop mdw[m
[31m-  nop_0 =	"90",[m
[31m-  xchg_2 =	"Rrqdw:90R|rRqdw:90r|rm:87rM|mr:87Rm",[m
[31m-  cbw_0 =	"6698",[m
[31m-  cwde_0 =	"98",[m
[31m-  cdqe_0 =	"4898",[m
[31m-  cwd_0 =	"6699",[m
[31m-  cdq_0 =	"99",[m
[31m-  cqo_0 =	"4899",[m
[31m-  -- 9A: *call iw:idw[m
[31m-  wait_0 =	"9B",[m
[31m-  fwait_0 =	"9B",[m
[31m-  pushf_0 =	"9C",[m
[31m-  pushfd_0 =	not x64 and "9C",[m
[31m-  pushfq_0 =	x64 and "9C",[m
[31m-  popf_0 =	"9D",[m
[31m-  popfd_0 =	not x64 and "9D",[m
[31m-  popfq_0 =	x64 and "9D",[m
[31m-  sahf_0 =	"9E",[m
[31m-  lahf_0 =	"9F",[m
[31m-  mov_2 =	"OR:A3o|RO:A1O|mr:89Rm|rm:8BrM|rib:nB0ri|ridw:B8ri|mi:C70mi",[m
[31m-  movsb_0 =	"A4",[m
[31m-  movsw_0 =	"66A5",[m
[31m-  movsd_0 =	"A5",[m
[31m-  cmpsb_0 =	"A6",[m
[31m-  cmpsw_0 =	"66A7",[m
[31m-  cmpsd_0 =	"A7",[m
[31m-  -- A8: test Rb,i[m
[31m-  -- A9: test Rdw,i[m
[31m-  stosb_0 =	"AA",[m
[31m-  stosw_0 =	"66AB",[m
[31m-  stosd_0 =	"AB",[m
[31m-  lodsb_0 =	"AC",[m
[31m-  lodsw_0 =	"66AD",[m
[31m-  lodsd_0 =	"AD",[m
[31m-  scasb_0 =	"AE",[m
[31m-  scasw_0 =	"66AF",[m
[31m-  scasd_0 =	"AF",[m
[31m-  -- B0-B7: mov rb,i[m
[31m-  -- B8-BF: mov rdw,i[m
[31m-  -- C0: rol... mb,i[m
[31m-  -- C1: rol... mdw,i[m
[31m-  ret_1 =	"i.:nC2W",[m
[31m-  ret_0 =	"C3",[m
[31m-  -- C4: *les rdw,mq[m
[31m-  -- C5: *lds rdw,mq[m
[31m-  -- C6: mov mb,i[m
[31m-  -- C7: mov mdw,i[m
[31m-  -- C8: *enter iw,ib[m
[31m-  leave_0 =	"C9",[m
[31m-  -- CA: *retf iw[m
[31m-  -- CB: *retf[m
[31m-  int3_0 =	"CC",[m
[31m-  int_1 =	"i.:nCDU",[m
[31m-  into_0 =	"CE",[m
[31m-  -- CF: *iret[m
[31m-  -- D0: rol... mb,1[m
[31m-  -- D1: rol... mdw,1[m
[31m-  -- D2: rol... mb,cl[m
[31m-  -- D3: rol... mb,cl[m
[31m-  -- D4: *aam ib[m
[31m-  -- D5: *aad ib[m
[31m-  -- D6: *salc[m
[31m-  -- D7: *xlat[m
[31m-  -- D8-DF: floating point ops[m
[31m-  -- E0: *loopne[m
[31m-  -- E1: *loope[m
[31m-  -- E2: *loop[m
[31m-  -- E3: *jcxz, *jecxz[m
[31m-  -- E4: *in Rb,ib[m
[31m-  -- E5: *in Rdw,ib[m
[31m-  -- E6: *out ib,Rb[m
[31m-  -- E7: *out ib,Rdw[m
[31m-  call_1 =	x64 and "mq:nFF2m|J.:E8nJ" or "md:FF2m|J.:E8J",[m
[31m-  jmp_1 =	x64 and "mq:nFF4m|J.:E9nJ" or "md:FF4m|J.:E9J", -- short: EB[m
[31m-  -- EA: *jmp iw:idw[m
[31m-  -- EB: jmp ib[m
[31m-  -- EC: *in Rb,dx[m
[31m-  -- ED: *in Rdw,dx[m
[31m-  -- EE: *out dx,Rb[m
[31m-  -- EF: *out dx,Rdw[m
[31m-  lock_0 =	"F0",[m
[31m-  int1_0 =	"F1",[m
[31m-  repne_0 =	"F2",[m
[31m-  repnz_0 =	"F2",[m
[31m-  rep_0 =	"F3",[m
[31m-  repe_0 =	"F3",[m
[31m-  repz_0 =	"F3",[m
[31m-  -- F4: *hlt[m
[31m-  cmc_0 =	"F5",[m
[31m-  -- F6: test... mb,i; div... mb[m
[31m-  -- F7: test... mdw,i; div... mdw[m
[31m-  clc_0 =	"F8",[m
[31m-  stc_0 =	"F9",[m
[31m-  -- FA: *cli[m
[31m-  cld_0 =	"FC",[m
[31m-  std_0 =	"FD",[m
[31m-  -- FE: inc... mb[m
[31m-  -- FF: inc... mdw[m
[31m-[m
[31m-  -- misc ops[m
[31m-  not_1 =	"m:F72m",[m
[31m-  neg_1 =	"m:F73m",[m
[31m-  mul_1 =	"m:F74m",[m
[31m-  imul_1 =	"m:F75m",[m
[31m-  div_1 =	"m:F76m",[m
[31m-  idiv_1 =	"m:F77m",[m
[31m-[m
[31m-  imul_2 =	"rmqdw:0FAFrM|rIqdw:69rmI|rSqdw:6BrmS|riqdw:69rmi",[m
[31m-  imul_3 =	"rmIqdw:69rMI|rmSqdw:6BrMS|rmiqdw:69rMi",[m
[31m-[m
[31m-  movzx_2 =	"rm/db:0FB6rM|rm/qb:|rm/wb:0FB6rM|rm/dw:0FB7rM|rm/qw:",[m
[31m-  movsx_2 =	"rm/db:0FBErM|rm/qb:|rm/wb:0FBErM|rm/dw:0FBFrM|rm/qw:",[m
[31m-[m
[31m-  bswap_1 =	"rqd:0FC8r",[m
[31m-  bsf_2 =	"rmqdw:0FBCrM",[m
[31m-  bsr_2 =	"rmqdw:0FBDrM",[m
[31m-  bt_2 =	"mrqdw:0FA3Rm|miqdw:0FBA4mU",[m
[31m-  btc_2 =	"mrqdw:0FBBRm|miqdw:0FBA7mU",[m
[31m-  btr_2 =	"mrqdw:0FB3Rm|miqdw:0FBA6mU",[m
[31m-  bts_2 =	"mrqdw:0FABRm|miqdw:0FBA5mU",[m
[31m-[m
[31m-  shld_3 =	"mriqdw:0FA4RmU|mrC/qq:0FA5Rm|mrC/dd:|mrC/ww:",[m
[31m-  shrd_3 =	"mriqdw:0FACRmU|mrC/qq:0FADRm|mrC/dd:|mrC/ww:",[m
[31m-[m
[31m-  rdtsc_0 =	"0F31", -- P1+[m
[31m-  rdpmc_0 =	"0F33", -- P6+[m
[31m-  cpuid_0 =	"0FA2", -- P1+[m
[31m-[m
[31m-  -- floating point ops[m
[31m-  fst_1 =	"ff:DDD0r|xd:D92m|xq:nDD2m",[m
[31m-  fstp_1 =	"ff:DDD8r|xd:D93m|xq:nDD3m|xt:DB7m",[m
[31m-  fld_1 =	"ff:D9C0r|xd:D90m|xq:nDD0m|xt:DB5m",[m
[31m-[m
[31m-  fpop_0 =	"DDD8", -- Alias for fstp st0.[m
[31m-[m
[31m-  fist_1 =	"xw:nDF2m|xd:DB2m",[m
[31m-  fistp_1 =	"xw:nDF3m|xd:DB3m|xq:nDF7m",[m
[31m-  fild_1 =	"xw:nDF0m|xd:DB0m|xq:nDF5m",[m
[31m-[m
[31m-  fxch_0 =	"D9C9",[m
[31m-  fxch_1 =	"ff:D9C8r",[m
[31m-  fxch_2 =	"fFf:D9C8r|Fff:D9C8R",[m
[31m-[m
[31m-  fucom_1 =	"ff:DDE0r",[m
[31m-  fucom_2 =	"Fff:DDE0R",[m
[31m-  fucomp_1 =	"ff:DDE8r",[m
[31m-  fucomp_2 =	"Fff:DDE8R",[m
[31m-  fucomi_1 =	"ff:DBE8r", -- P6+[m
[31m-  fucomi_2 =	"Fff:DBE8R", -- P6+[m
[31m-  fucomip_1 =	"ff:DFE8r", -- P6+[m
[31m-  fucomip_2 =	"Fff:DFE8R", -- P6+[m
[31m-  fcomi_1 =	"ff:DBF0r", -- P6+[m
[31m-  fcomi_2 =	"Fff:DBF0R", -- P6+[m
[31m-  fcomip_1 =	"ff:DFF0r", -- P6+[m
[31m-  fcomip_2 =	"Fff:DFF0R", -- P6+[m
[31m-  fucompp_0 =	"DAE9",[m
[31m-  fcompp_0 =	"DED9",[m
[31m-[m
[31m-  fldenv_1 =	"x.:D94m",[m
[31m-  fnstenv_1 =	"x.:D96m",[m
[31m-  fstenv_1 =	"x.:9BD96m",[m
[31m-  fldcw_1 =	"xw:nD95m",[m
[31m-  fstcw_1 =	"xw:n9BD97m",[m
[31m-  fnstcw_1 =	"xw:nD97m",[m
[31m-  fstsw_1 =	"Rw:n9BDFE0|xw:n9BDD7m",[m
[31m-  fnstsw_1 =	"Rw:nDFE0|xw:nDD7m",[m
[31m-  fclex_0 =	"9BDBE2",[m
[31m-  fnclex_0 =	"DBE2",[m
[31m-[m
[31m-  fnop_0 =	"D9D0",[m
[31m-  -- D9D1-D9DF: unassigned[m
[31m-[m
[31m-  fchs_0 =	"D9E0",[m
[31m-  fabs_0 =	"D9E1",[m
[31m-  -- D9E2: unassigned[m
[31m-  -- D9E3: unassigned[m
[31m-  ftst_0 =	"D9E4",[m
[31m-  fxam_0 =	"D9E5",[m
[31m-  -- D9E6: unassigned[m
[31m-  -- D9E7: unassigned[m
[31m-  fld1_0 =	"D9E8",[m
[31m-  fldl2t_0 =	"D9E9",[m
[31m-  fldl2e_0 =	"D9EA",[m
[31m-  fldpi_0 =	"D9EB",[m
[31m-  fldlg2_0 =	"D9EC",[m
[31m-  fldln2_0 =	"D9ED",[m
[31m-  fldz_0 =	"D9EE",[m
[31m-  -- D9EF: unassigned[m
[31m-[m
[31m-  f2xm1_0 =	"D9F0",[m
[31m-  fyl2x_0 =	"D9F1",[m
[31m-  fptan_0 =	"D9F2",[m
[31m-  fpatan_0 =	"D9F3",[m
[31m-  fxtract_0 =	"D9F4",[m
[31m-  fprem1_0 =	"D9F5",[m
[31m-  fdecstp_0 =	"D9F6",[m
[31m-  fincstp_0 =	"D9F7",[m
[31m-  fprem_0 =	"D9F8",[m
[31m-  fyl2xp1_0 =	"D9F9",[m
[31m-  fsqrt_0 =	"D9FA",[m
[31m-  fsincos_0 =	"D9FB",[m
[31m-  frndint_0 =	"D9FC",[m
[31m-  fscale_0 =	"D9FD",[m
[31m-  fsin_0 =	"D9FE",[m
[31m-  fcos_0 =	"D9FF",[m
[31m-[m
[31m-  -- SSE, SSE2[m
[31m-  andnpd_2 =	"rmo:660F55rM",[m
[31m-  andnps_2 =	"rmo:0F55rM",[m
[31m-  andpd_2 =	"rmo:660F54rM",[m
[31m-  andps_2 =	"rmo:0F54rM",[m
[31m-  clflush_1 =	"x.:0FAE7m",[m
[31m-  cmppd_3 =	"rmio:660FC2rMU",[m
[31m-  cmpps_3 =	"rmio:0FC2rMU",[m
[31m-  cmpsd_3 =	"rrio:F20FC2rMU|rxi/oq:",[m
[31m-  cmpss_3 =	"rrio:F30FC2rMU|rxi/od:",[m
[31m-  comisd_2 =	"rro:660F2FrM|rx/oq:",[m
[31m-  comiss_2 =	"rro:0F2FrM|rx/od:",[m
[31m-  cvtdq2pd_2 =	"rro:F30FE6rM|rx/oq:",[m
[31m-  cvtdq2ps_2 =	"rmo:0F5BrM",[m
[31m-  cvtpd2dq_2 =	"rmo:F20FE6rM",[m
[31m-  cvtpd2ps_2 =	"rmo:660F5ArM",[m
[31m-  cvtpi2pd_2 =	"rx/oq:660F2ArM",[m
[31m-  cvtpi2ps_2 =	"rx/oq:0F2ArM",[m
[31m-  cvtps2dq_2 =	"rmo:660F5BrM",[m
[31m-  cvtps2pd_2 =	"rro:0F5ArM|rx/oq:",[m
[31m-  cvtsd2si_2 =	"rr/do:F20F2DrM|rr/qo:|rx/dq:|rxq:",[m
[31m-  cvtsd2ss_2 =	"rro:F20F5ArM|rx/oq:",[m
[31m-  cvtsi2sd_2 =	"rm/od:F20F2ArM|rm/oq:F20F2ArXM",[m
[31m-  cvtsi2ss_2 =	"rm/od:F30F2ArM|rm/oq:F30F2ArXM",[m
[31m-  cvtss2sd_2 =	"rro:F30F5ArM|rx/od:",[m
[31m-  cvtss2si_2 =	"rr/do:F30F2DrM|rr/qo:|rxd:|rx/qd:",[m
[31m-  cvttpd2dq_2 =	"rmo:660FE6rM",[m
[31m-  cvttps2dq_2 =	"rmo:F30F5BrM",[m
[31m-  cvttsd2si_2 =	"rr/do:F20F2CrM|rr/qo:|rx/dq:|rxq:",[m
[31m-  cvttss2si_2 =	"rr/do:F30F2CrM|rr/qo:|rxd:|rx/qd:",[m
[31m-  fxsave_1 =	"x.:0FAE0m",[m
[31m-  fxrstor_1 =	"x.:0FAE1m",[m
[31m-  ldmxcsr_1 =	"xd:0FAE2m",[m
[31m-  lfence_0 =	"0FAEE8",[m
[31m-  maskmovdqu_2 = "rro:660FF7rM",[m
[31m-  mfence_0 =	"0FAEF0",[m
[31m-  movapd_2 =	"rmo:660F28rM|mro:660F29Rm",[m
[31m-  movaps_2 =	"rmo:0F28rM|mro:0F29Rm",[m
[31m-  movd_2 =	"rm/od:660F6ErM|rm/oq:660F6ErXM|mr/do:660F7ERm|mr/qo:",[m
[31m-  movdqa_2 =	"rmo:660F6FrM|mro:660F7FRm",[m
[31m-  movdqu_2 =	"rmo:F30F6FrM|mro:F30F7FRm",[m
[31m-  movhlps_2 =	"rro:0F12rM",[m
[31m-  movhpd_2 =	"rx/oq:660F16rM|xr/qo:n660F17Rm",[m
[31m-  movhps_2 =	"rx/oq:0F16rM|xr/qo:n0F17Rm",[m
[31m-  movlhps_2 =	"rro:0F16rM",[m
[31m-  movlpd_2 =	"rx/oq:660F12rM|xr/qo:n660F13Rm",[m
[31m-  movlps_2 =	"rx/oq:0F12rM|xr/qo:n0F13Rm",[m
[31m-  movmskpd_2 =	"rr/do:660F50rM",[m
[31m-  movmskps_2 =	"rr/do:0F50rM",[m
[31m-  movntdq_2 =	"xro:660FE7Rm",[m
[31m-  movnti_2 =	"xrqd:0FC3Rm",[m
[31m-  movntpd_2 =	"xro:660F2BRm",[m
[31m-  movntps_2 =	"xro:0F2BRm",[m
[31m-  movq_2 =	"rro:F30F7ErM|rx/oq:|xr/qo:n660FD6Rm",[m
[31m-  movsd_2 =	"rro:F20F10rM|rx/oq:|xr/qo:nF20F11Rm",[m
[31m-  movss_2 =	"rro:F30F10rM|rx/od:|xr/do:F30F11Rm",[m
[31m-  movupd_2 =	"rmo:660F10rM|mro:660F11Rm",[m
[31m-  movups_2 =	"rmo:0F10rM|mro:0F11Rm",[m
[31m-  orpd_2 =	"rmo:660F56rM",[m
[31m-  orps_2 =	"rmo:0F56rM",[m
[31m-  pause_0 =	"F390",[m
[31m-  pextrw_3 =	"rri/do:660FC5rMU|xri/wo:660F3A15nRmU", -- Mem op: SSE4.1 only.[m
[31m-  pinsrw_3 =	"rri/od:660FC4rMU|rxi/ow:",[m
[31m-  pmovmskb_2 =	"rr/do:660FD7rM",[m
[31m-  prefetchnta_1 = "xb:n0F180m",[m
[31m-  prefetcht0_1 = "xb:n0F181m",[m
[31m-  prefetcht1_1 = "xb:n0F182m",[m
[31m-  prefetcht2_1 = "xb:n0F183m",[m
[31m-  pshufd_3 =	"rmio:660F70rMU",[m
[31m-  pshufhw_3 =	"rmio:F30F70rMU",[m
[31m-  pshuflw_3 =	"rmio:F20F70rMU",[m
[31m-  pslld_2 =	"rmo:660FF2rM|rio:660F726mU",[m
[31m-  pslldq_2 =	"rio:660F737mU",[m
[31m-  psllq_2 =	"rmo:660FF3rM|rio:660F736mU",[m
[31m-  psllw_2 =	"rmo:660FF1rM|rio:660F716mU",[m
[31m-  psrad_2 =	"rmo:660FE2rM|rio:660F724mU",[m
[31m-  psraw_2 =	"rmo:660FE1rM|rio:660F714mU",[m
[31m-  psrld_2 =	"rmo:660FD2rM|rio:660F722mU",[m
[31m-  psrldq_2 =	"rio:660F733mU",[m
[31m-  psrlq_2 =	"rmo:660FD3rM|rio:660F732mU",[m
[31m-  psrlw_2 =	"rmo:660FD1rM|rio:660F712mU",[m
[31m-  rcpps_2 =	"rmo:0F53rM",[m
[31m-  rcpss_2 =	"rro:F30F53rM|rx/od:",[m
[31m-  rsqrtps_2 =	"rmo:0F52rM",[m
[31m-  rsqrtss_2 =	"rmo:F30F52rM",[m
[31m-  sfence_0 =	"0FAEF8",[m
[31m-  shufpd_3 =	"rmio:660FC6rMU",[m
[31m-  shufps_3 =	"rmio:0FC6rMU",[m
[31m-  stmxcsr_1 =   "xd:0FAE3m",[m
[31m-  ucomisd_2 =	"rro:660F2ErM|rx/oq:",[m
[31m-  ucomiss_2 =	"rro:0F2ErM|rx/od:",[m
[31m-  unpckhpd_2 =	"rmo:660F15rM",[m
[31m-  unpckhps_2 =	"rmo:0F15rM",[m
[31m-  unpcklpd_2 =	"rmo:660F14rM",[m
[31m-  unpcklps_2 =	"rmo:0F14rM",[m
[31m-  xorpd_2 =	"rmo:660F57rM",[m
[31m-  xorps_2 =	"rmo:0F57rM",[m
[31m-[m
[31m-  -- SSE3 ops[m
[31m-  fisttp_1 =	"xw:nDF1m|xd:DB1m|xq:nDD1m",[m
[31m-  addsubpd_2 =	"rmo:660FD0rM",[m
[31m-  addsubps_2 =	"rmo:F20FD0rM",[m
[31m-  haddpd_2 =	"rmo:660F7CrM",[m
[31m-  haddps_2 =	"rmo:F20F7CrM",[m
[31m-  hsubpd_2 =	"rmo:660F7DrM",[m
[31m-  hsubps_2 =	"rmo:F20F7DrM",[m
[31m-  lddqu_2 =	"rxo:F20FF0rM",[m
[31m-  movddup_2 =	"rmo:F20F12rM",[m
[31m-  movshdup_2 =	"rmo:F30F16rM",[m
[31m-  movsldup_2 =	"rmo:F30F12rM",[m
[31m-[m
[31m-  -- SSSE3 ops[m
[31m-  pabsb_2 =	"rmo:660F381CrM",[m
[31m-  pabsd_2 =	"rmo:660F381ErM",[m
[31m-  pabsw_2 =	"rmo:660F381DrM",[m
[31m-  palignr_3 =	"rmio:660F3A0FrMU",[m
[31m-  phaddd_2 =	"rmo:660F3802rM",[m
[31m-  phaddsw_2 =	"rmo:660F3803rM",[m
[31m-  phaddw_2 =	"rmo:660F3801rM",[m
[31m-  phsubd_2 =	"rmo:660F3806rM",[m
[31m-  phsubsw_2 =	"rmo:660F3807rM",[m
[31m-  phsubw_2 =	"rmo:660F3805rM",[m
[31m-  pmaddubsw_2 =	"rmo:660F3804rM",[m
[31m-  pmulhrsw_2 =	"rmo:660F380BrM",[m
[31m-  pshufb_2 =	"rmo:660F3800rM",[m
[31m-  psignb_2 =	"rmo:660F3808rM",[m
[31m-  psignd_2 =	"rmo:660F380ArM",[m
[31m-  psignw_2 =	"rmo:660F3809rM",[m
[31m-[m
[31m-  -- SSE4.1 ops[m
[31m-  blendpd_3 =	"rmio:660F3A0DrMU",[m
[31m-  blendps_3 =	"rmio:660F3A0CrMU",[m
[31m-  blendvpd_3 =	"rmRo:660F3815rM",[m
[31m-  blendvps_3 =	"rmRo:660F3814rM",[m
[31m-  dppd_3 =	"rmio:660F3A41rMU",[m
[31m-  dpps_3 =	"rmio:660F3A40rMU",[m
[31m-  extractps_3 =	"mri/do:660F3A17RmU|rri/qo:660F3A17RXmU",[m
[31m-  insertps_3 =	"rrio:660F3A41rMU|rxi/od:",[m
[31m-  movntdqa_2 =	"rxo:660F382ArM",[m
[31m-  mpsadbw_3 =	"rmio:660F3A42rMU",[m
[31m-  packusdw_2 =	"rmo:660F382BrM",[m
[31m-  pblendvb_3 =	"rmRo:660F3810rM",[m
[31m-  pblendw_3 =	"rmio:660F3A0ErMU",[m
[31m-  pcmpeqq_2 =	"rmo:660F3829rM",[m
[31m-  pextrb_3 =	"rri/do:660F3A14nRmU|rri/qo:|xri/bo:",[m
[31m-  pextrd_3 =	"mri/do:660F3A16RmU",[m
[31m-  pextrq_3 =	"mri/qo:660F3A16RmU",[m
[31m-  -- pextrw is SSE2, mem operand is SSE4.1 only[m
[31m-  phminposuw_2 = "rmo:660F3841rM",[m
[31m-  pinsrb_3 =	"rri/od:660F3A20nrMU|rxi/ob:",[m
[31m-  pinsrd_3 =	"rmi/od:660F3A22rMU",[m
[31m-  pinsrq_3 =	"rmi/oq:660F3A22rXMU",[m
[31m-  pmaxsb_2 =	"rmo:660F383CrM",[m
[31m-  pmaxsd_2 =	"rmo:660F383DrM",[m
[31m-  pmaxud_2 =	"rmo:660F383FrM",[m
[31m-  pmaxuw_2 =	"rmo:660F383ErM",[m
[31m-  pminsb_2 =	"rmo:660F3838rM",[m
[31m-  pminsd_2 =	"rmo:660F3839rM",[m
[31m-  pminud_2 =	"rmo:660F383BrM",[m
[31m-  pminuw_2 =	"rmo:660F383ArM",[m
[31m-  pmovsxbd_2 =	"rro:660F3821rM|rx/od:",[m
[31m-  pmovsxbq_2 =	"rro:660F3822rM|rx/ow:",[m
[31m-  pmovsxbw_2 =	"rro:660F3820rM|rx/oq:",[m
[31m-  pmovsxdq_2 =	"rro:660F3825rM|rx/oq:",[m
[31m-  pmovsxwd_2 =	"rro:660F3823rM|rx/oq:",[m
[31m-  pmovsxwq_2 =	"rro:660F3824rM|rx/od:",[m
[31m-  pmovzxbd_2 =	"rro:660F3831rM|rx/od:",[m
[31m-  pmovzxbq_2 =	"rro:660F3832rM|rx/ow:",[m
[31m-  pmovzxbw_2 =	"rro:660F3830rM|rx/oq:",[m
[31m-  pmovzxdq_2 =	"rro:660F3835rM|rx/oq:",[m
[31m-  pmovzxwd_2 =	"rro:660F3833rM|rx/oq:",[m
[31m-  pmovzxwq_2 =	"rro:660F3834rM|rx/od:",[m
[31m-  pmuldq_2 =	"rmo:660F3828rM",[m
[31m-  pmulld_2 =	"rmo:660F3840rM",[m
[31m-  ptest_2 =	"rmo:660F3817rM",[m
[31m-  roundpd_3 =	"rmio:660F3A09rMU",[m
[31m-  roundps_3 =	"rmio:660F3A08rMU",[m
[31m-  roundsd_3 =	"rrio:660F3A0BrMU|rxi/oq:",[m
[31m-  roundss_3 =	"rrio:660F3A0ArMU|rxi/od:",[m
[31m-[m
[31m-  -- SSE4.2 ops[m
[31m-  crc32_2 =	"rmqd:F20F38F1rM|rm/dw:66F20F38F1rM|rm/db:F20F38F0rM|rm/qb:",[m
[31m-  pcmpestri_3 =	"rmio:660F3A61rMU",[m
[31m-  pcmpestrm_3 =	"rmio:660F3A60rMU",[m
[31m-  pcmpgtq_2 =	"rmo:660F3837rM",[m
[31m-  pcmpistri_3 =	"rmio:660F3A63rMU",[m
[31m-  pcmpistrm_3 =	"rmio:660F3A62rMU",[m
[31m-  popcnt_2 =	"rmqdw:F30FB8rM",[m
[31m-[m
[31m-  -- SSE4a[m
[31m-  extrq_2 =	"rro:660F79rM",[m
[31m-  extrq_3 =	"riio:660F780mUU",[m
[31m-  insertq_2 =	"rro:F20F79rM",[m
[31m-  insertq_4 =	"rriio:F20F78rMUU",[m
[31m-  lzcnt_2 =	"rmqdw:F30FBDrM",[m
[31m-  movntsd_2 =	"xr/qo:nF20F2BRm",[m
[31m-  movntss_2 =	"xr/do:F30F2BRm",[m
[31m-  -- popcnt is also in SSE4.2[m
[31m-[m
[31m-  -- AES-NI[m
[31m-  aesdec_2 =	"rmo:660F38DErM",[m
[31m-  aesdeclast_2 = "rmo:660F38DFrM",[m
[31m-  aesenc_2 =	"rmo:660F38DCrM",[m
[31m-  aesenclast_2 = "rmo:660F38DDrM",[m
[31m-  aesimc_2 =	"rmo:660F38DBrM",[m
[31m-  aeskeygenassist_3 = "rmio:660F3ADFrMU",[m
[31m-  pclmulqdq_3 =	"rmio:660F3A44rMU",[m
[31m-[m
[31m-   -- AVX FP ops[m
[31m-  vaddsubpd_3 =	"rrmoy:660FVD0rM",[m
[31m-  vaddsubps_3 =	"rrmoy:F20FVD0rM",[m
[31m-  vandpd_3 =	"rrmoy:660FV54rM",[m
[31m-  vandps_3 =	"rrmoy:0FV54rM",[m
[31m-  vandnpd_3 =	"rrmoy:660FV55rM",[m
[31m-  vandnps_3 =	"rrmoy:0FV55rM",[m
[31m-  vblendpd_4 =	"rrmioy:660F3AV0DrMU",[m
[31m-  vblendps_4 =	"rrmioy:660F3AV0CrMU",[m
[31m-  vblendvpd_4 =	"rrmroy:660F3AV4BrMs",[m
[31m-  vblendvps_4 =	"rrmroy:660F3AV4ArMs",[m
[31m-  vbroadcastf128_2 = "rx/yo:660F38u1ArM",[m
[31m-  vcmppd_4 =	"rrmioy:660FVC2rMU",[m
[31m-  vcmpps_4 =	"rrmioy:0FVC2rMU",[m
[31m-  vcmpsd_4 =	"rrrio:F20FVC2rMU|rrxi/ooq:",[m
[31m-  vcmpss_4 =	"rrrio:F30FVC2rMU|rrxi/ood:",[m
[31m-  vcomisd_2 =	"rro:660Fu2FrM|rx/oq:",[m
[31m-  vcomiss_2 =	"rro:0Fu2FrM|rx/od:",[m
[31m-  vcvtdq2pd_2 =	"rro:F30FuE6rM|rx/oq:|rm/yo:",[m
[31m-  vcvtdq2ps_2 =	"rmoy:0Fu5BrM",[m
[31m-  vcvtpd2dq_2 =	"rmoy:F20FuE6rM",[m
[31m-  vcvtpd2ps_2 =	"rmoy:660Fu5ArM",[m
[31m-  vcvtps2dq_2 =	"rmoy:660Fu5BrM",[m
[31m-  vcvtps2pd_2 =	"rro:0Fu5ArM|rx/oq:|rm/yo:",[m
[31m-  vcvtsd2si_2 =	"rr/do:F20Fu2DrM|rx/dq:|rr/qo:|rxq:",[m
[31m-  vcvtsd2ss_3 =	"rrro:F20FV5ArM|rrx/ooq:",[m
[31m-  vcvtsi2sd_3 =	"rrm/ood:F20FV2ArM|rrm/ooq:F20FVX2ArM",[m
[31m-  vcvtsi2ss_3 =	"rrm/ood:F30FV2ArM|rrm/ooq:F30FVX2ArM",[m
[31m-  vcvtss2sd_3 =	"rrro:F30FV5ArM|rrx/ood:",[m
[31m-  vcvtss2si_2 =	"rr/do:F30Fu2DrM|rxd:|rr/qo:|rx/qd:",[m
[31m-  vcvttpd2dq_2 = "rmo:660FuE6rM|rm/oy:660FuLE6rM",[m
[31m-  vcvttps2dq_2 = "rmoy:F30Fu5BrM",[m
[31m-  vcvttsd2si_2 = "rr/do:F20Fu2CrM|rx/dq:|rr/qo:|rxq:",[m
[31m-  vcvttss2si_2 = "rr/do:F30Fu2CrM|rxd:|rr/qo:|rx/qd:",[m
[31m-  vdppd_4 =	"rrmio:660F3AV41rMU",[m
[31m-  vdpps_4 =	"rrmioy:660F3AV40rMU",[m
[31m-  vextractf128_3 = "mri/oy:660F3AuL19RmU",[m
[31m-  vextractps_3 = "mri/do:660F3Au17RmU",[m
[31m-  vhaddpd_3 =	"rrmoy:660FV7CrM",[m
[31m-  vhaddps_3 =	"rrmoy:F20FV7CrM",[m
[31m-  vhsubpd_3 =	"rrmoy:660FV7DrM",[m
[31m-  vhsubps_3 =	"rrmoy:F20FV7DrM",[m
[31m-  vinsertf128_4 = "rrmi/yyo:660F3AV18rMU",[m
[31m-  vinsertps_4 =	"rrrio:660F3AV21rMU|rrxi/ood:",[m
[31m-  vldmxcsr_1 =	"xd:0FuAE2m",[m
[31m-  vmaskmovps_3 = "rrxoy:660F38V2CrM|xrroy:660F38V2ERm",[m
[31m-  vmaskmovpd_3 = "rrxoy:660F38V2DrM|xrroy:660F38V2FRm",[m
[31m-  vmovapd_2 =	"rmoy:660Fu28rM|mroy:660Fu29Rm",[m
[31m-  vmovaps_2 =	"rmoy:0Fu28rM|mroy:0Fu29Rm",[m
[31m-  vmovd_2 =	"rm/od:660Fu6ErM|rm/oq:660FuX6ErM|mr/do:660Fu7ERm|mr/qo:",[m
[31m-  vmovq_2 =	"rro:F30Fu7ErM|rx/oq:|xr/qo:660FuD6Rm",[m
[31m-  vmovddup_2 =	"rmy:F20Fu12rM|rro:|rx/oq:",[m
[31m-  vmovhlps_3 =	"rrro:0FV12rM",[m
[31m-  vmovhpd_2 =	"xr/qo:660Fu17Rm",[m
[31m-  vmovhpd_3 =	"rrx/ooq:660FV16rM",[m
[31m-  vmovhps_2 =	"xr/qo:0Fu17Rm",[m
[31m-  vmovhps_3 =	"rrx/ooq:0FV16rM",[m
[31m-  vmovlhps_3 =	"rrro:0FV16rM",[m
[31m-  vmovlpd_2 =	"xr/qo:660Fu13Rm",[m
[31m-  vmovlpd_3 =	"rrx/ooq:660FV12rM",[m
[31m-  vmovlps_2 =	"xr/qo:0Fu13Rm",[m
[31m-  vmovlps_3 =	"rrx/ooq:0FV12rM",[m
[31m-  vmovmskpd_2 =	"rr/do:660Fu50rM|rr/dy:660FuL50rM",[m
[31m-  vmovmskps_2 =	"rr/do:0Fu50rM|rr/dy:0FuL50rM",[m
[31m-  vmovntpd_2 =	"xroy:660Fu2BRm",[m
[31m-  vmovntps_2 =	"xroy:0Fu2BRm",[m
[31m-  vmovsd_2 =	"rx/oq:F20Fu10rM|xr/qo:F20Fu11Rm",[m
[31m-  vmovsd_3 =	"rrro:F20FV10rM",[m
[31m-  vmovshdup_2 =	"rmoy:F30Fu16rM",[m
[31m-  vmovsldup_2 =	"rmoy:F30Fu12rM",[m
[31m-  vmovss_2 =	"rx/od:F30Fu10rM|xr/do:F30Fu11Rm",[m
[31m-  vmovss_3 =	"rrro:F30FV10rM",[m
[31m-  vmovupd_2 =	"rmoy:660Fu10rM|mroy:660Fu11Rm",[m
[31m-  vmovups_2 =	"rmoy:0Fu10rM|mroy:0Fu11Rm",[m
[31m-  vorpd_3 =	"rrmoy:660FV56rM",[m
[31m-  vorps_3 =	"rrmoy:0FV56rM",[m
[31m-  vpermilpd_3 =	"rrmoy:660F38V0DrM|rmioy:660F3Au05rMU",[m
[31m-  vpermilps_3 =	"rrmoy:660F38V0CrM|rmioy:660F3Au04rMU",[m
[31m-  vperm2f128_4 = "rrmiy:660F3AV06rMU",[m
[31m-  vptestpd_2 =	"rmoy:660F38u0FrM",[m
[31m-  vptestps_2 =	"rmoy:660F38u0ErM",[m
[31m-  vrcpps_2 =	"rmoy:0Fu53rM",[m
[31m-  vrcpss_3 =	"rrro:F30FV53rM|rrx/ood:",[m
[31m-  vrsqrtps_2 =	"rmoy:0Fu52rM",[m
[31m-  vrsqrtss_3 =	"rrro:F30FV52rM|rrx/ood:",[m
[31m-  vroundpd_3 =	"rmioy:660F3AV09rMU",[m
[31m-  vroundps_3 =	"rmioy:660F3AV08rMU",[m
[31m-  vroundsd_4 =	"rrrio:660F3AV0BrMU|rrxi/ooq:",[m
[31m-  vroundss_4 =	"rrrio:660F3AV0ArMU|rrxi/ood:",[m
[31m-  vshufpd_4 =	"rrmioy:660FVC6rMU",[m
[31m-  vshufps_4 =	"rrmioy:0FVC6rMU",[m
[31m-  vsqrtps_2 =	"rmoy:0Fu51rM",[m
[31m-  vsqrtss_2 =	"rro:F30Fu51rM|rx/od:",[m
[31m-  vsqrtpd_2 =	"rmoy:660Fu51rM",[m
[31m-  vsqrtsd_2 =	"rro:F20Fu51rM|rx/oq:",[m
[31m-  vstmxcsr_1 =	"xd:0FuAE3m",[m
[31m-  vucomisd_2 =	"rro:660Fu2ErM|rx/oq:",[m
[31m-  vucomiss_2 =	"rro:0Fu2ErM|rx/od:",[m
[31m-  vunpckhpd_3 =	"rrmoy:660FV15rM",[m
[31m-  vunpckhps_3 =	"rrmoy:0FV15rM",[m
[31m-  vunpcklpd_3 =	"rrmoy:660FV14rM",[m
[31m-  vunpcklps_3 =	"rrmoy:0FV14rM",[m
[31m-  vxorpd_3 =	"rrmoy:660FV57rM",[m
[31m-  vxorps_3 =	"rrmoy:0FV57rM",[m
[31m-  vzeroall_0 =	"0FuL77",[m
[31m-  vzeroupper_0 = "0Fu77",[m
[31m-[m
[31m-  -- AVX2 FP ops[m
[31m-  vbroadcastss_2 = "rx/od:660F38u18rM|rx/yd:|rro:|rr/yo:",[m
[31m-  vbroadcastsd_2 = "rx/yq:660F38u19rM|rr/yo:",[m
[31m-  -- *vgather* (!vsib)[m
[31m-  vpermpd_3 =	"rmiy:660F3AuX01rMU",[m
[31m-  vpermps_3 =	"rrmy:660F38V16rM",[m
[31m-[m
[31m-  -- AVX, AVX2 integer ops[m
[31m-  -- In general, xmm requires AVX, ymm requires AVX2.[m
[31m-  vaesdec_3 =  "rrmo:660F38VDErM",[m
[31m-  vaesdeclast_3 = "rrmo:660F38VDFrM",[m
[31m-  vaesenc_3 =  "rrmo:660F38VDCrM",[m
[31m-  vaesenclast_3 = "rrmo:660F38VDDrM",[m
[31m-  vaesimc_2 =  "rmo:660F38uDBrM",[m
[31m-  vaeskeygenassist_3 = "rmio:660F3AuDFrMU",[m
[31m-  vlddqu_2 =	"rxoy:F20FuF0rM",[m
[31m-  vmaskmovdqu_2 = "rro:660FuF7rM",[m
[31m-  vmovdqa_2 =	"rmoy:660Fu6FrM|mroy:660Fu7FRm",[m
[31m-  vmovdqu_2 =	"rmoy:F30Fu6FrM|mroy:F30Fu7FRm",[m
[31m-  vmovntdq_2 =	"xroy:660FuE7Rm",[m
[31m-  vmovntdqa_2 =	"rxoy:660F38u2ArM",[m
[31m-  vmpsadbw_4 =	"rrmioy:660F3AV42rMU",[m
[31m-  vpabsb_2 =	"rmoy:660F38u1CrM",[m
[31m-  vpabsd_2 =	"rmoy:660F38u1ErM",[m
[31m-  vpabsw_2 =	"rmoy:660F38u1DrM",[m
[31m-  vpackusdw_3 =	"rrmoy:660F38V2BrM",[m
[31m-  vpalignr_4 =	"rrmioy:660F3AV0FrMU",[m
[31m-  vpblendvb_4 =	"rrmroy:660F3AV4CrMs",[m
[31m-  vpblendw_4 =	"rrmioy:660F3AV0ErMU",[m
[31m-  vpclmulqdq_4 = "rrmio:660F3AV44rMU",[m
[31m-  vpcmpeqq_3 =	"rrmoy:660F38V29rM",[m
[31m-  vpcmpestri_3 = "rmio:660F3Au61rMU",[m
[31m-  vpcmpestrm_3 = "rmio:660F3Au60rMU",[m
[31m-  vpcmpgtq_3 =	"rrmoy:660F38V37rM",[m
[31m-  vpcmpistri_3 = "rmio:660F3Au63rMU",[m
[31m-  vpcmpistrm_3 = "rmio:660F3Au62rMU",[m
[31m-  vpextrb_3 =	"rri/do:660F3Au14nRmU|rri/qo:|xri/bo:",[m
[31m-  vpextrw_3 =	"rri/do:660FuC5rMU|xri/wo:660F3Au15nRmU",[m
[31m-  vpextrd_3 =	"mri/do:660F3Au16RmU",[m
[31m-  vpextrq_3 =	"mri/qo:660F3Au16RmU",[m
[31m-  vphaddw_3 =	"rrmoy:660F38V01rM",[m
[31m-  vphaddd_3 =	"rrmoy:660F38V02rM",[m
[31m-  vphaddsw_3 =	"rrmoy:660F38V03rM",[m
[31m-  vphminposuw_2 = "rmo:660F38u41rM",[m
[31m-  vphsubw_3 =	"rrmoy:660F38V05rM",[m
[31m-  vphsubd_3 =	"rrmoy:660F38V06rM",[m
[31m-  vphsubsw_3 =	"rrmoy:660F38V07rM",[m
[31m-  vpinsrb_4 =	"rrri/ood:660F3AV20rMU|rrxi/oob:",[m
[31m-  vpinsrw_4 =	"rrri/ood:660FVC4rMU|rrxi/oow:",[m
[31m-  vpinsrd_4 =	"rrmi/ood:660F3AV22rMU",[m
[31m-  vpinsrq_4 =	"rrmi/ooq:660F3AVX22rMU",[m
[31m-  vpmaddubsw_3 = "rrmoy:660F38V04rM",[m
[31m-  vpmaxsb_3 =	"rrmoy:660F38V3CrM",[m
[31m-  vpmaxsd_3 =	"rrmoy:660F38V3DrM",[m
[31m-  vpmaxuw_3 =	"rrmoy:660F38V3ErM",[m
[31m-  vpmaxud_3 =	"rrmoy:660F38V3FrM",[m
[31m-  vpminsb_3 =	"rrmoy:660F38V38rM",[m
[31m-  vpminsd_3 =	"rrmoy:660F38V39rM",[m
[31m-  vpminuw_3 =	"rrmoy:660F38V3ArM",[m
[31m-  vpminud_3 =	"rrmoy:660F38V3BrM",[m
[31m-  vpmovmskb_2 =	"rr/do:660FuD7rM|rr/dy:660FuLD7rM",[m
[31m-  vpmovsxbw_2 =	"rroy:660F38u20rM|rx/oq:|rx/yo:",[m
[31m-  vpmovsxbd_2 =	"rroy:660F38u21rM|rx/od:|rx/yq:",[m
[31m-  vpmovsxbq_2 =	"rroy:660F38u22rM|rx/ow:|rx/yd:",[m
[31m-  vpmovsxwd_2 =	"rroy:660F38u23rM|rx/oq:|rx/yo:",[m
[31m-  vpmovsxwq_2 =	"rroy:660F38u24rM|rx/od:|rx/yq:",[m
[31m-  vpmovsxdq_2 =	"rroy:660F38u25rM|rx/oq:|rx/yo:",[m
[31m-  vpmovzxbw_2 =	"rroy:660F38u30rM|rx/oq:|rx/yo:",[m
[31m-  vpmovzxbd_2 =	"rroy:660F38u31rM|rx/od:|rx/yq:",[m
[31m-  vpmovzxbq_2 =	"rroy:660F38u32rM|rx/ow:|rx/yd:",[m
[31m-  vpmovzxwd_2 =	"rroy:660F38u33rM|rx/oq:|rx/yo:",[m
[31m-  vpmovzxwq_2 =	"rroy:660F38u34rM|rx/od:|rx/yq:",[m
[31m-  vpmovzxdq_2 =	"rroy:660F38u35rM|rx/oq:|rx/yo:",[m
[31m-  vpmuldq_3 =	"rrmoy:660F38V28rM",[m
[31m-  vpmulhrsw_3 =	"rrmoy:660F38V0BrM",[m
[31m-  vpmulld_3 =	"rrmoy:660F38V40rM",[m
[31m-  vpshufb_3 =	"rrmoy:660F38V00rM",[m
[31m-  vpshufd_3 =	"rmioy:660Fu70rMU",[m
[31m-  vpshufhw_3 =	"rmioy:F30Fu70rMU",[m
[31m-  vpshuflw_3 =	"rmioy:F20Fu70rMU",[m
[31m-  vpsignb_3 =	"rrmoy:660F38V08rM",[m
[31m-  vpsignw_3 =	"rrmoy:660F38V09rM",[m
[31m-  vpsignd_3 =	"rrmoy:660F38V0ArM",[m
[31m-  vpslldq_3 =	"rrioy:660Fv737mU",[m
[31m-  vpsllw_3 =	"rrmoy:660FVF1rM|rrioy:660Fv716mU",[m
[31m-  vpslld_3 =	"rrmoy:660FVF2rM|rrioy:660Fv726mU",[m
[31m-  vpsllq_3 =	"rrmoy:660FVF3rM|rrioy:660Fv736mU",[m
[31m-  vpsraw_3 =	"rrmoy:660FVE1rM|rrioy:660Fv714mU",[m
[31m-  vpsrad_3 =	"rrmoy:660FVE2rM|rrioy:660Fv724mU",[m
[31m-  vpsrldq_3 =	"rrioy:660Fv733mU",[m
[31m-  vpsrlw_3 =	"rrmoy:660FVD1rM|rrioy:660Fv712mU",[m
[31m-  vpsrld_3 =	"rrmoy:660FVD2rM|rrioy:660Fv722mU",[m
[31m-  vpsrlq_3 =	"rrmoy:660FVD3rM|rrioy:660Fv732mU",[m
[31m-  vptest_2 =	"rmoy:660F38u17rM",[m
[31m-[m
[31m-  -- AVX2 integer ops[m
[31m-  vbroadcasti128_2 = "rx/yo:660F38u5ArM",[m
[31m-  vinserti128_4 = "rrmi/yyo:660F3AV38rMU",[m
[31m-  vextracti128_3 = "mri/oy:660F3AuL39RmU",[m
[31m-  vpblendd_4 =	"rrmioy:660F3AV02rMU",[m
[31m-  vpbroadcastb_2 = "rro:660F38u78rM|rx/ob:|rr/yo:|rx/yb:",[m
[31m-  vpbroadcastw_2 = "rro:660F38u79rM|rx/ow:|rr/yo:|rx/yw:",[m
[31m-  vpbroadcastd_2 = "rro:660F38u58rM|rx/od:|rr/yo:|rx/yd:",[m
[31m-  vpbroadcastq_2 = "rro:660F38u59rM|rx/oq:|rr/yo:|rx/yq:",[m
[31m-  vpermd_3 =	"rrmy:660F38V36rM",[m
[31m-  vpermq_3 =	"rmiy:660F3AuX00rMU",[m
[31m-  -- *vpgather* (!vsib)[m
[31m-  vperm2i128_4 = "rrmiy:660F3AV46rMU",[m
[31m-  vpmaskmovd_3 = "rrxoy:660F38V8CrM|xrroy:660F38V8ERm",[m
[31m-  vpmaskmovq_3 = "rrxoy:660F38VX8CrM|xrroy:660F38VX8ERm",[m
[31m-  vpsllvd_3 =	"rrmoy:660F38V47rM",[m
[31m-  vpsllvq_3 =	"rrmoy:660F38VX47rM",[m
[31m-  vpsravd_3 =	"rrmoy:660F38V46rM",[m
[31m-  vpsrlvd_3 =	"rrmoy:660F38V45rM",[m
[31m-  vpsrlvq_3 =	"rrmoy:660F38VX45rM",[m
[31m-[m
[31m-  -- Intel ADX[m
[31m-  adcx_2 =	"rmqd:660F38F6rM",[m
[31m-  adox_2 =	"rmqd:F30F38F6rM",[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arithmetic ops.[m
[31m-for name,n in pairs{ add = 0, ["or"] = 1, adc = 2, sbb = 3,[m
[31m-		     ["and"] = 4, sub = 5, xor = 6, cmp = 7 } do[m
[31m-  local n8 = shl(n, 3)[m
[31m-  map_op[name.."_2"] = format([m
[31m-    "mr:%02XRm|rm:%02XrM|mI1qdw:81%XmI|mS1qdw:83%XmS|Ri1qdwb:%02Xri|mi1qdwb:81%Xmi",[m
[31m-    1+n8, 3+n8, n, n, 5+n8, n)[m
[31m-end[m
[31m-[m
[31m--- Shift ops.[m
[31m-for name,n in pairs{ rol = 0, ror = 1, rcl = 2, rcr = 3,[m
[31m-		     shl = 4, shr = 5,          sar = 7, sal = 4 } do[m
[31m-  map_op[name.."_2"] = format("m1:D1%Xm|mC1qdwb:D3%Xm|mi:C1%XmU", n, n, n)[m
[31m-end[m
[31m-[m
[31m--- Conditional ops.[m
[31m-for cc,n in pairs(map_cc) do[m
[31m-  map_op["j"..cc.."_1"] = format("J.:n0F8%XJ", n) -- short: 7%X[m
[31m-  map_op["set"..cc.."_1"] = format("mb:n0F9%X2m", n)[m
[31m-  map_op["cmov"..cc.."_2"] = format("rmqdw:0F4%XrM", n) -- P6+[m
[31m-end[m
[31m-[m
[31m--- FP arithmetic ops.[m
[31m-for name,n in pairs{ add = 0, mul = 1, com = 2, comp = 3,[m
[31m-		     sub = 4, subr = 5, div = 6, divr = 7 } do[m
[31m-  local nc = 0xc0 + shl(n, 3)[m
[31m-  local nr = nc + (n < 4 and 0 or (n % 2 == 0 and 8 or -8))[m
[31m-  local fn = "f"..name[m
[31m-  map_op[fn.."_1"] = format("ff:D8%02Xr|xd:D8%Xm|xq:nDC%Xm", nc, n, n)[m
[31m-  if n == 2 or n == 3 then[m
[31m-    map_op[fn.."_2"] = format("Fff:D8%02XR|Fx2d:D8%XM|Fx2q:nDC%XM", nc, n, n)[m
[31m-  else[m
[31m-    map_op[fn.."_2"] = format("Fff:D8%02XR|fFf:DC%02Xr|Fx2d:D8%XM|Fx2q:nDC%XM", nc, nr, n, n)[m
[31m-    map_op[fn.."p_1"] = format("ff:DE%02Xr", nr)[m
[31m-    map_op[fn.."p_2"] = format("fFf:DE%02Xr", nr)[m
[31m-  end[m
[31m-  map_op["fi"..name.."_1"] = format("xd:DA%Xm|xw:nDE%Xm", n, n)[m
[31m-end[m
[31m-[m
[31m--- FP conditional moves.[m
[31m-for cc,n in pairs{ b=0, e=1, be=2, u=3, nb=4, ne=5, nbe=6, nu=7 } do[m
[31m-  local nc = 0xdac0 + shl(band(n, 3), 3) + shl(band(n, 4), 6)[m
[31m-  map_op["fcmov"..cc.."_1"] = format("ff:%04Xr", nc) -- P6+[m
[31m-  map_op["fcmov"..cc.."_2"] = format("Fff:%04XR", nc) -- P6+[m
[31m-end[m
[31m-[m
[31m--- SSE / AVX FP arithmetic ops.[m
[31m-for name,n in pairs{ sqrt = 1, add = 8, mul = 9,[m
[31m-		     sub = 12, min = 13, div = 14, max = 15 } do[m
[31m-  map_op[name.."ps_2"] = format("rmo:0F5%XrM", n)[m
[31m-  map_op[name.."ss_2"] = format("rro:F30F5%XrM|rx/od:", n)[m
[31m-  map_op[name.."pd_2"] = format("rmo:660F5%XrM", n)[m
[31m-  map_op[name.."sd_2"] = format("rro:F20F5%XrM|rx/oq:", n)[m
[31m-  if n ~= 1 then[m
[31m-    map_op["v"..name.."ps_3"] = format("rrmoy:0FV5%XrM", n)[m
[31m-    map_op["v"..name.."ss_3"] = format("rrro:F30FV5%XrM|rrx/ood:", n)[m
[31m-    map_op["v"..name.."pd_3"] = format("rrmoy:660FV5%XrM", n)[m
[31m-    map_op["v"..name.."sd_3"] = format("rrro:F20FV5%XrM|rrx/ooq:", n)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- SSE2 / AVX / AVX2 integer arithmetic ops (66 0F leaf).[m
[31m-for name,n in pairs{[m
[31m-  paddb = 0xFC, paddw = 0xFD, paddd = 0xFE, paddq = 0xD4,[m
[31m-  paddsb = 0xEC, paddsw = 0xED, packssdw = 0x6B,[m
[31m-  packsswb = 0x63, packuswb = 0x67, paddusb = 0xDC,[m
[31m-  paddusw = 0xDD, pand = 0xDB, pandn = 0xDF, pavgb = 0xE0,[m
[31m-  pavgw = 0xE3, pcmpeqb = 0x74, pcmpeqd = 0x76,[m
[31m-  pcmpeqw = 0x75, pcmpgtb = 0x64, pcmpgtd = 0x66,[m
[31m-  pcmpgtw = 0x65, pmaddwd = 0xF5, pmaxsw = 0xEE,[m
[31m-  pmaxub = 0xDE, pminsw = 0xEA, pminub = 0xDA,[m
[31m-  pmulhuw = 0xE4, pmulhw = 0xE5, pmullw = 0xD5,[m
[31m-  pmuludq = 0xF4, por = 0xEB, psadbw = 0xF6, psubb = 0xF8,[m
[31m-  psubw = 0xF9, psubd = 0xFA, psubq = 0xFB, psubsb = 0xE8,[m
[31m-  psubsw = 0xE9, psubusb = 0xD8, psubusw = 0xD9,[m
[31m-  punpckhbw = 0x68, punpckhwd = 0x69, punpckhdq = 0x6A,[m
[31m-  punpckhqdq = 0x6D, punpcklbw = 0x60, punpcklwd = 0x61,[m
[31m-  punpckldq = 0x62, punpcklqdq = 0x6C, pxor = 0xEF[m
[31m-} do[m
[31m-  map_op[name.."_2"] = format("rmo:660F%02XrM", n)[m
[31m-  map_op["v"..name.."_3"] = format("rrmoy:660FV%02XrM", n)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_vexarg = { u = false, v = 1, V = 2 }[m
[31m-[m
[31m--- Process pattern string.[m
[31m-local function dopattern(pat, args, sz, op, needrex)[m
[31m-  local digit, addin, vex[m
[31m-  local opcode = 0[m
[31m-  local szov = sz[m
[31m-  local narg = 1[m
[31m-  local rex = 0[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 6 positions.[m
[31m-  if secpos+6 > maxsecpos then wflush() end[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for c in gmatch(pat.."|", ".") do[m
[31m-    if match(c, "%x") then	-- Hex digit.[m
[31m-      digit = byte(c) - 48[m
[31m-      if digit > 48 then digit = digit - 39[m
[31m-      elseif digit > 16 then digit = digit - 7 end[m
[31m-      opcode = opcode*16 + digit[m
[31m-      addin = nil[m
[31m-    elseif c == "n" then	-- Disable operand size mods for opcode.[m
[31m-      szov = nil[m
[31m-    elseif c == "X" then	-- Force REX.W.[m
[31m-      rex = 8[m
[31m-    elseif c == "L" then	-- Force VEX.L.[m
[31m-      vex.l = true[m
[31m-    elseif c == "r" then	-- Merge 1st operand regno. into opcode.[m
[31m-      addin = args[1]; opcode = opcode + (addin.reg % 8)[m
[31m-      if narg < 2 then narg = 2 end[m
[31m-    elseif c == "R" then	-- Merge 2nd operand regno. into opcode.[m
[31m-      addin = args[2]; opcode = opcode + (addin.reg % 8)[m
[31m-      narg = 3[m
[31m-    elseif c == "m" or c == "M" then	-- Encode ModRM/SIB.[m
[31m-      local s[m
[31m-      if addin then[m
[31m-	s = addin.reg[m
[31m-	opcode = opcode - band(s, 7)	-- Undo regno opcode merge.[m
[31m-      else[m
[31m-	s = band(opcode, 15)	-- Undo last digit.[m
[31m-	opcode = shr(opcode, 4)[m
[31m-      end[m
[31m-      local nn = c == "m" and 1 or 2[m
[31m-      local t = args[nn][m
[31m-      if narg <= nn then narg = nn + 1 end[m
[31m-      if szov == "q" and rex == 0 then rex = rex + 8 end[m
[31m-      if t.reg and t.reg > 7 then rex = rex + 1 end[m
[31m-      if t.xreg and t.xreg > 7 then rex = rex + 2 end[m
[31m-      if s > 7 then rex = rex + 4 end[m
[31m-      if needrex then rex = rex + 16 end[m
[31m-      local psz, sk = wputop(szov, opcode, rex, vex, s < 0, t.vreg or t.vxreg)[m
[31m-      opcode = nil[m
[31m-      local imark = sub(pat, -1) -- Force a mark (ugly).[m
[31m-      -- Put ModRM/SIB with regno/last digit as spare.[m
[31m-      wputmrmsib(t, imark, s, addin and addin.vreg, psz, sk)[m
[31m-      addin = nil[m
[31m-    elseif map_vexarg[c] ~= nil then -- Encode using VEX prefix[m
[31m-      local b = band(opcode, 255); opcode = shr(opcode, 8)[m
[31m-      local m = 1[m
[31m-      if b == 0x38 then m = 2[m
[31m-      elseif b == 0x3a then m = 3 end[m
[31m-      if m ~= 1 then b = band(opcode, 255); opcode = shr(opcode, 8) end[m
[31m-      if b ~= 0x0f then[m
[31m-	werror("expected `0F', `0F38', or `0F3A' to precede `"..c..[m
[31m-	  "' in pattern `"..pat.."' for `"..op.."'")[m
[31m-      end[m
[31m-      local v = map_vexarg[c][m
[31m-      if v then v = remove(args, v) end[m
[31m-      b = band(opcode, 255)[m
[31m-      local p = 0[m
[31m-      if b == 0x66 then p = 1[m
[31m-      elseif b == 0xf3 then p = 2[m
[31m-      elseif b == 0xf2 then p = 3 end[m
[31m-      if p ~= 0 then opcode = shr(opcode, 8) end[m
[31m-      if opcode ~= 0 then wputop(nil, opcode, 0); opcode = 0 end[m
[31m-      vex = { m = m, p = p, v = v }[m
[31m-    else[m
[31m-      if opcode then -- Flush opcode.[m
[31m-	if szov == "q" and rex == 0 then rex = rex + 8 end[m
[31m-	if needrex then rex = rex + 16 end[m
[31m-	if addin and addin.reg == -1 then[m
[31m-	  local psz, sk = wputop(szov, opcode - 7, rex, vex, true)[m
[31m-	  wvreg("opcode", addin.vreg, psz, sk)[m
[31m-	else[m
[31m-	  if addin and addin.reg > 7 then rex = rex + 1 end[m
[31m-	  wputop(szov, opcode, rex, vex)[m
[31m-	end[m
[31m-	opcode = nil[m
[31m-      end[m
[31m-      if c == "|" then break end[m
[31m-      if c == "o" then -- Offset (pure 32 bit displacement).[m
[31m-	wputdarg(args[1].disp); if narg < 2 then narg = 2 end[m
[31m-      elseif c == "O" then[m
[31m-	wputdarg(args[2].disp); narg = 3[m
[31m-      else[m
[31m-	-- Anything else is an immediate operand.[m
[31m-	local a = args[narg][m
[31m-	narg = narg + 1[m
[31m-	local mode, imm = a.mode, a.imm[m
[31m-	if mode == "iJ" and not match("iIJ", c) then[m
[31m-	  werror("bad operand size for label")[m
[31m-	end[m
[31m-	if c == "S" then[m
[31m-	  wputsbarg(imm)[m
[31m-	elseif c == "U" then[m
[31m-	  wputbarg(imm)[m
[31m-	elseif c == "W" then[m
[31m-	  wputwarg(imm)[m
[31m-	elseif c == "i" or c == "I" then[m
[31m-	  if mode == "iJ" then[m
[31m-	    wputlabel("IMM_", imm, 1)[m
[31m-	  elseif mode == "iI" and c == "I" then[m
[31m-	    waction(sz == "w" and "IMM_WB" or "IMM_DB", imm)[m
[31m-	  else[m
[31m-	    wputszarg(sz, imm)[m
[31m-	  end[m
[31m-	elseif c == "J" then[m
[31m-	  if mode == "iPJ" then[m
[31m-	    waction("REL_A", imm) -- !x64 (secpos)[m
[31m-	  else[m
[31m-	    wputlabel("REL_", imm, 2)[m
[31m-	  end[m
[31m-	elseif c == "s" then[m
[31m-	  local reg = a.reg[m
[31m-	  if reg < 0 then[m
[31m-	    wputb(0)[m
[31m-	    wvreg("imm.hi", a.vreg)[m
[31m-	  else[m
[31m-	    wputb(shl(reg, 4))[m
[31m-	  end[m
[31m-	else[m
[31m-	  werror("bad char `"..c.."' in pattern `"..pat.."' for `"..op.."'")[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Mapping of operand modes to short names. Suppress output with '#'.[m
[31m-local map_modename = {[m
[31m-  r = "reg", R = "eax", C = "cl", x = "mem", m = "mrm", i = "imm",[m
[31m-  f = "stx", F = "st0", J = "lbl", ["1"] = "1",[m
[31m-  I = "#", S = "#", O = "#",[m
[31m-}[m
[31m-[m
[31m--- Return a table/string showing all possible operand modes.[m
[31m-local function templatehelp(template, nparams)[m
[31m-  if nparams == 0 then return "" end[m
[31m-  local t = {}[m
[31m-  for tm in gmatch(template, "[^%|]+") do[m
[31m-    local s = map_modename[sub(tm, 1, 1)][m
[31m-    s = s..gsub(sub(tm, 2, nparams), ".", function(c)[m
[31m-      return ", "..map_modename[c][m
[31m-    end)[m
[31m-    if not match(s, "#") then t[#t+1] = s end[m
[31m-  end[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m--- Match operand modes against mode match part of template.[m
[31m-local function matchtm(tm, args)[m
[31m-  for i=1,#args do[m
[31m-    if not match(args[i].mode, sub(tm, i, i)) then return end[m
[31m-  end[m
[31m-  return true[m
[31m-end[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-map_op[".template__"] = function(params, template, nparams)[m
[31m-  if not params then return templatehelp(template, nparams) end[m
[31m-  local args = {}[m
[31m-[m
[31m-  -- Zero-operand opcodes have no match part.[m
[31m-  if #params == 0 then[m
[31m-    dopattern(template, args, "d", params.op, nil)[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  -- Determine common operand size (coerce undefined size) or flag as mixed.[m
[31m-  local sz, szmix, needrex[m
[31m-  for i,p in ipairs(params) do[m
[31m-    args[i] = parseoperand(p)[m
[31m-    local nsz = args[i].opsize[m
[31m-    if nsz then[m
[31m-      if sz and sz ~= nsz then szmix = true else sz = nsz end[m
[31m-    end[m
[31m-    local nrex = args[i].needrex[m
[31m-    if nrex ~= nil then[m
[31m-      if needrex == nil then[m
[31m-	needrex = nrex[m
[31m-      elseif needrex ~= nrex then[m
[31m-	werror("bad mix of byte-addressable registers")[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  -- Try all match:pattern pairs (separated by '|').[m
[31m-  local gotmatch, lastpat[m
[31m-  for tm in gmatch(template, "[^%|]+") do[m
[31m-    -- Split off size match (starts after mode match) and pattern string.[m
[31m-    local szm, pat = match(tm, "^(.-):(.*)$", #args+1)[m
[31m-    if pat == "" then pat = lastpat else lastpat = pat end[m
[31m-    if matchtm(tm, args) then[m
[31m-      local prefix = sub(szm, 1, 1)[m
[31m-      if prefix == "/" then -- Exactly match leading operand sizes.[m
[31m-	for i = #szm,1,-1 do[m
[31m-	  if i == 1 then[m
[31m-	    dopattern(pat, args, sz, params.op, needrex) -- Process pattern.[m
[31m-	    return[m
[31m-	  elseif args[i-1].opsize ~= sub(szm, i, i) then[m
[31m-	    break[m
[31m-	  end[m
[31m-	end[m
[31m-      else -- Match common operand size.[m
[31m-	local szp = sz[m
[31m-	if szm == "" then szm = x64 and "qdwb" or "dwb" end -- Default sizes.[m
[31m-	if prefix == "1" then szp = args[1].opsize; szmix = nil[m
[31m-	elseif prefix == "2" then szp = args[2].opsize; szmix = nil end[m
[31m-	if not szmix and (prefix == "." or match(szm, szp or "#")) then[m
[31m-	  dopattern(pat, args, szp, params.op, needrex) -- Process pattern.[m
[31m-	  return[m
[31m-	end[m
[31m-      end[m
[31m-      gotmatch = true[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  local msg = "bad operand mode"[m
[31m-  if gotmatch then[m
[31m-    if szmix then[m
[31m-      msg = "mixed operand size"[m
[31m-    else[m
[31m-      msg = sz and "bad operand size" or "missing operand size"[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  werror(msg.." in `"..opmodestr(params.op, args).."'")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- x64-specific opcode for 64 bit immediates and displacements.[m
[31m-if x64 then[m
[31m-  function map_op.mov64_2(params)[m
[31m-    if not params then return { "reg, imm", "reg, [disp]", "[disp], reg" } end[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-    local opcode, op64, sz, rex, vreg[m
[31m-    local op64 = match(params[1], "^%[%s*(.-)%s*%]$")[m
[31m-    if op64 then[m
[31m-      local a = parseoperand(params[2])[m
[31m-      if a.mode ~= "rmR" then werror("bad operand mode") end[m
[31m-      sz = a.opsize[m
[31m-      rex = sz == "q" and 8 or 0[m
[31m-      opcode = 0xa3[m
[31m-    else[m
[31m-      op64 = match(params[2], "^%[%s*(.-)%s*%]$")[m
[31m-      local a = parseoperand(params[1])[m
[31m-      if op64 then[m
[31m-	if a.mode ~= "rmR" then werror("bad operand mode") end[m
[31m-	sz = a.opsize[m
[31m-	rex = sz == "q" and 8 or 0[m
[31m-	opcode = 0xa1[m
[31m-      else[m
[31m-	if sub(a.mode, 1, 1) ~= "r" or a.opsize ~= "q" then[m
[31m-	  werror("bad operand mode")[m
[31m-	end[m
[31m-	op64 = params[2][m
[31m-	if a.reg == -1 then[m
[31m-	  vreg = a.vreg[m
[31m-	  opcode = 0xb8[m
[31m-	else[m
[31m-	  opcode = 0xb8 + band(a.reg, 7)[m
[31m-	end[m
[31m-	rex = a.reg > 7 and 9 or 8[m
[31m-      end[m
[31m-    end[m
[31m-    local psz, sk = wputop(sz, opcode, rex, nil, vreg)[m
[31m-    wvreg("opcode", vreg, psz, sk)[m
[31m-    waction("IMM_D", format("(unsigned int)(%s)", op64))[m
[31m-    waction("IMM_D", format("(unsigned int)((%s)>>32)", op64))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-local function op_data(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  local sz = sub(params.op, 2, 2)[m
[31m-  if sz == "a" then sz = addrsize end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local a = parseoperand(p)[m
[31m-    if sub(a.mode, 1, 1) ~= "i" or (a.opsize and a.opsize ~= sz) then[m
[31m-      werror("bad mode or size in `"..p.."'")[m
[31m-    end[m
[31m-    if a.mode == "iJ" then[m
[31m-      wputlabel("IMM_", a.imm, 1)[m
[31m-    else[m
[31m-      wputszarg(sz, a.imm)[m
[31m-    end[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-map_op[".byte_*"] = op_data[m
[31m-map_op[".sbyte_*"] = op_data[m
[31m-map_op[".word_*"] = op_data[m
[31m-map_op[".dword_*"] = op_data[m
[31m-map_op[".aword_*"] = op_data[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_2"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr  [, addr]" end[m
[31m-  if secpos+2 > maxsecpos then wflush() end[m
[31m-  local a = parseoperand(params[1])[m
[31m-  local mode, imm = a.mode, a.imm[m
[31m-  if type(imm) == "number" and (mode == "iJ" or (imm >= 1 and imm <= 9)) then[m
[31m-    -- Local label (1: ... 9:) or global label (->global:).[m
[31m-    waction("LABEL_LG", nil, 1)[m
[31m-    wputxb(imm)[m
[31m-  elseif mode == "iJ" then[m
[31m-    -- PC label (=>pcexpr:).[m
[31m-    waction("LABEL_PC", imm)[m
[31m-  else[m
[31m-    werror("bad label definition")[m
[31m-  end[m
[31m-  -- SETLABEL must immediately follow LABEL_LG/LABEL_PC.[m
[31m-  local addr = params[2][m
[31m-  if addr then[m
[31m-    local a = parseoperand(addr)[m
[31m-    if a.mode == "iPJ" then[m
[31m-      waction("SETLABEL", a.imm)[m
[31m-    else[m
[31m-      werror("bad label assignment")[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-map_op[".label_1"] = map_op[".label_2"][m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1]) or map_opsizenum[map_opsize[params[1]]][m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", nil, 1)[m
[31m-	wputxb(align-1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m--- Spacing pseudo-opcode.[m
[31m-map_op[".space_2"] = function(params)[m
[31m-  if not params then return "num [, filler]" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  waction("SPACE", params[1])[m
[31m-  local fill = params[2][m
[31m-  if fill then[m
[31m-    fill = tonumber(fill)[m
[31m-    if not fill or fill < 0 or fill > 255 then werror("bad filler") end[m
[31m-  end[m
[31m-  wputxb(fill or 0)[m
[31m-end[m
[31m-map_op[".space_1"] = map_op[".space_2"][m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  if reg and not map_reg_valid_base[reg] then[m
[31m-    werror("bad base register `"..(map_reg_rev[reg] or reg).."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg and map_reg_rev[tp.reg] or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION")[m
[31m-  wputxb(num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpregs(out)[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = map_coreop })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dynasm.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dynasm.lua[m
[1mdeleted file mode 100644[m
[1mindex 1e5899a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/dynasm/dynasm.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1094 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM. A dynamic assembler for code generation engines.[m
[31m--- Originally designed and implemented for LuaJIT.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See below for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Application information.[m
[31m-local _info = {[m
[31m-  name =	"DynASM",[m
[31m-  description =	"A dynamic assembler for code generation engines",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  url =		"http://luajit.org/dynasm.html",[m
[31m-  license =	"MIT",[m
[31m-  copyright =	[[[m
[31m-Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining[m
[31m-a copy of this software and associated documentation files (the[m
[31m-"Software"), to deal in the Software without restriction, including[m
[31m-without limitation the rights to use, copy, modify, merge, publish,[m
[31m-distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-permit persons to whom the Software is furnished to do so, subject to[m
[31m-the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be[m
[31m-included in all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-[m
[31m-[ MIT license: http://www.opensource.org/licenses/mit-license.php ][m
[31m-]],[m
[31m-}[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, pairs, ipairs = type, pairs, ipairs[m
[31m-local pcall, error, assert = pcall, error, assert[m
[31m-local _s = string[m
[31m-local sub, match, gmatch, gsub = _s.sub, _s.match, _s.gmatch, _s.gsub[m
[31m-local format, rep, upper = _s.format, _s.rep, _s.upper[m
[31m-local _t = table[m
[31m-local insert, remove, concat, sort = _t.insert, _t.remove, _t.concat, _t.sort[m
[31m-local exit = os.exit[m
[31m-local io = io[m
[31m-local stdin, stdout, stderr = io.stdin, io.stdout, io.stderr[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Program options.[m
[31m-local g_opt = {}[m
[31m-[m
[31m--- Global state for current file.[m
[31m-local g_fname, g_curline, g_indent, g_lineno, g_synclineno, g_arch[m
[31m-local g_errcount = 0[m
[31m-[m
[31m--- Write buffer for output file.[m
[31m-local g_wbuffer, g_capbuffer[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Write an output line (or callback function) to the buffer.[m
[31m-local function wline(line, needindent)[m
[31m-  local buf = g_capbuffer or g_wbuffer[m
[31m-  buf[#buf+1] = needindent and g_indent..line or line[m
[31m-  g_synclineno = g_synclineno + 1[m
[31m-end[m
[31m-[m
[31m--- Write assembler line as a comment, if requestd.[m
[31m-local function wcomment(aline)[m
[31m-  if g_opt.comment then[m
[31m-    wline(g_opt.comment..aline..g_opt.endcomment, true)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Resync CPP line numbers.[m
[31m-local function wsync()[m
[31m-  if g_synclineno ~= g_lineno and g_opt.cpp then[m
[31m-    wline("#line "..g_lineno..' "'..g_fname..'"')[m
[31m-    g_synclineno = g_lineno[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Dummy action flush function. Replaced with arch-specific function later.[m
[31m-local function wflush(term)[m
[31m-end[m
[31m-[m
[31m--- Dump all buffered output lines.[m
[31m-local function wdumplines(out, buf)[m
[31m-  for _,line in ipairs(buf) do[m
[31m-    if type(line) == "string" then[m
[31m-      assert(out:write(line, "\n"))[m
[31m-    else[m
[31m-      -- Special callback to dynamically insert lines after end of processing.[m
[31m-      line(out)[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Emit an error. Processing continues with next statement.[m
[31m-local function werror(msg)[m
[31m-  error(format("%s:%s: error: %s:\n%s", g_fname, g_lineno, msg, g_curline), 0)[m
[31m-end[m
[31m-[m
[31m--- Emit a fatal error. Processing stops.[m
[31m-local function wfatal(msg)[m
[31m-  g_errcount = "fatal"[m
[31m-  werror(msg)[m
[31m-end[m
[31m-[m
[31m--- Print a warning. Processing continues.[m
[31m-local function wwarn(msg)[m
[31m-  stderr:write(format("%s:%s: warning: %s:\n%s\n",[m
[31m-    g_fname, g_lineno, msg, g_curline))[m
[31m-end[m
[31m-[m
[31m--- Print caught error message. But suppress excessive errors.[m
[31m-local function wprinterr(...)[m
[31m-  if type(g_errcount) == "number" then[m
[31m-    -- Regular error.[m
[31m-    g_errcount = g_errcount + 1[m
[31m-    if g_errcount < 21 then -- Seems to be a reasonable limit.[m
[31m-      stderr:write(...)[m
[31m-    elseif g_errcount == 21 then[m
[31m-      stderr:write(g_fname,[m
[31m-	":*: warning: too many errors (suppressed further messages).\n")[m
[31m-    end[m
[31m-  else[m
[31m-    -- Fatal error.[m
[31m-    stderr:write(...)[m
[31m-    return true -- Stop processing.[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Map holding all option handlers.[m
[31m-local opt_map = {}[m
[31m-local opt_current[m
[31m-[m
[31m--- Print error and exit with error status.[m
[31m-local function opterror(...)[m
[31m-  stderr:write("dynasm.lua: ERROR: ", ...)[m
[31m-  stderr:write("\n")[m
[31m-  exit(1)[m
[31m-end[m
[31m-[m
[31m--- Get option parameter.[m
[31m-local function optparam(args)[m
[31m-  local argn = args.argn[m
[31m-  local p = args[argn][m
[31m-  if not p then[m
[31m-    opterror("missing parameter for option `", opt_current, "'.")[m
[31m-  end[m
[31m-  args.argn = argn + 1[m
[31m-  return p[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Core pseudo-opcodes.[m
[31m-local map_coreop = {}[m
[31m--- Dummy opcode map. Replaced by arch-specific map.[m
[31m-local map_op = {}[m
[31m-[m
[31m--- Forward declarations.[m
[31m-local dostmt[m
[31m-local readfile[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Map for defines (initially empty, chains to arch-specific map).[m
[31m-local map_def = {}[m
[31m-[m
[31m--- Pseudo-opcode to define a substitution.[m
[31m-map_coreop[".define_2"] = function(params, nparams)[m
[31m-  if not params then return nparams == 1 and "name" or "name, subst" end[m
[31m-  local name, def = params[1], params[2] or "1"[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad or duplicate define") end[m
[31m-  map_def[name] = def[m
[31m-end[m
[31m-map_coreop[".define_1"] = map_coreop[".define_2"][m
[31m-[m
[31m--- Define a substitution on the command line.[m
[31m-function opt_map.D(args)[m
[31m-  local namesubst = optparam(args)[m
[31m-  local name, subst = match(namesubst, "^([%a_][%w_]*)=(.*)$")[m
[31m-  if name then[m
[31m-    map_def[name] = subst[m
[31m-  elseif match(namesubst, "^[%a_][%w_]*$") then[m
[31m-    map_def[namesubst] = "1"[m
[31m-  else[m
[31m-    opterror("bad define")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Undefine a substitution on the command line.[m
[31m-function opt_map.U(args)[m
[31m-  local name = optparam(args)[m
[31m-  if match(name, "^[%a_][%w_]*$") then[m
[31m-    map_def[name] = nil[m
[31m-  else[m
[31m-    opterror("bad define")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Helper for definesubst.[m
[31m-local gotsubst[m
[31m-[m
[31m-local function definesubst_one(word)[m
[31m-  local subst = map_def[word][m
[31m-  if subst then gotsubst = word; return subst else return word end[m
[31m-end[m
[31m-[m
[31m--- Iteratively substitute defines.[m
[31m-local function definesubst(stmt)[m
[31m-  -- Limit number of iterations.[m
[31m-  for i=1,100 do[m
[31m-    gotsubst = false[m
[31m-    stmt = gsub(stmt, "#?[%w_]+", definesubst_one)[m
[31m-    if not gotsubst then break end[m
[31m-  end[m
[31m-  if gotsubst then wfatal("recursive define involving `"..gotsubst.."'") end[m
[31m-  return stmt[m
[31m-end[m
[31m-[m
[31m--- Dump all defines.[m
[31m-local function dumpdefines(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_def) do[m
[31m-    t[#t+1] = name[m
[31m-  end[m
[31m-  sort(t)[m
[31m-  out:write("Defines:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local subst = map_def[name][m
[31m-    if g_arch then subst = g_arch.revdef(subst) end[m
[31m-    out:write(format("  %-20s %s\n", name, subst))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Support variables for conditional assembly.[m
[31m-local condlevel = 0[m
[31m-local condstack = {}[m
[31m-[m
[31m--- Evaluate condition with a Lua expression. Substitutions already performed.[m
[31m-local function cond_eval(cond)[m
[31m-  local func, err[m
[31m-  if setfenv then[m
[31m-    func, err = loadstring("return "..cond, "=expr")[m
[31m-  else[m
[31m-    -- No globals. All unknown identifiers evaluate to nil.[m
[31m-    func, err = load("return "..cond, "=expr", "t", {})[m
[31m-  end[m
[31m-  if func then[m
[31m-    if setfenv then[m
[31m-      setfenv(func, {}) -- No globals. All unknown identifiers evaluate to nil.[m
[31m-    end[m
[31m-    local ok, res = pcall(func)[m
[31m-    if ok then[m
[31m-      if res == 0 then return false end -- Oh well.[m
[31m-      return not not res[m
[31m-    end[m
[31m-    err = res[m
[31m-  end[m
[31m-  wfatal("bad condition: "..err)[m
[31m-end[m
[31m-[m
[31m--- Skip statements until next conditional pseudo-opcode at the same level.[m
[31m-local function stmtskip()[m
[31m-  local dostmt_save = dostmt[m
[31m-  local lvl = 0[m
[31m-  dostmt = function(stmt)[m
[31m-    local op = match(stmt, "^%s*(%S+)")[m
[31m-    if op == ".if" then[m
[31m-      lvl = lvl + 1[m
[31m-    elseif lvl ~= 0 then[m
[31m-      if op == ".endif" then lvl = lvl - 1 end[m
[31m-    elseif op == ".elif" or op == ".else" or op == ".endif" then[m
[31m-      dostmt = dostmt_save[m
[31m-      dostmt(stmt)[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcodes for conditional assembly.[m
[31m-map_coreop[".if_1"] = function(params)[m
[31m-  if not params then return "condition" end[m
[31m-  local lvl = condlevel + 1[m
[31m-  local res = cond_eval(params[1])[m
[31m-  condlevel = lvl[m
[31m-  condstack[lvl] = res[m
[31m-  if not res then stmtskip() end[m
[31m-end[m
[31m-[m
[31m-map_coreop[".elif_1"] = function(params)[m
[31m-  if not params then return "condition" end[m
[31m-  if condlevel == 0 then wfatal(".elif without .if") end[m
[31m-  local lvl = condlevel[m
[31m-  local res = condstack[lvl][m
[31m-  if res then[m
[31m-    if res == "else" then wfatal(".elif after .else") end[m
[31m-  else[m
[31m-    res = cond_eval(params[1])[m
[31m-    if res then[m
[31m-      condstack[lvl] = res[m
[31m-      return[m
[31m-    end[m
[31m-  end[m
[31m-  stmtskip()[m
[31m-end[m
[31m-[m
[31m-map_coreop[".else_0"] = function(params)[m
[31m-  if condlevel == 0 then wfatal(".else without .if") end[m
[31m-  local lvl = condlevel[m
[31m-  local res = condstack[lvl][m
[31m-  condstack[lvl] = "else"[m
[31m-  if res then[m
[31m-    if res == "else" then wfatal(".else after .else") end[m
[31m-    stmtskip()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-map_coreop[".endif_0"] = function(params)[m
[31m-  local lvl = condlevel[m
[31m-  if lvl == 0 then wfatal(".endif without .if") end[m
[31m-  condlevel = lvl - 1[m
[31m-end[m
[31m-[m
[31m--- Check for unfinished conditionals.[m
[31m-local function checkconds()[m
[31m-  if g_errcount ~= "fatal" and condlevel ~= 0 then[m
[31m-    wprinterr(g_fname, ":*: error: unbalanced conditional\n")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Search for a file in the given path and open it for reading.[m
[31m-local function pathopen(path, name)[m
[31m-  local dirsep = package and match(package.path, "\\") and "\\" or "/"[m
[31m-  for _,p in ipairs(path) do[m
[31m-    local fullname = p == "" and name or p..dirsep..name[m
[31m-    local fin = io.open(fullname, "r")[m
[31m-    if fin then[m
[31m-      g_fname = fullname[m
[31m-      return fin[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Include a file.[m
[31m-map_coreop[".include_1"] = function(params)[m
[31m-  if not params then return "filename" end[m
[31m-  local name = params[1][m
[31m-  -- Save state. Ugly, I know. but upvalues are fast.[m
[31m-  local gf, gl, gcl, gi = g_fname, g_lineno, g_curline, g_indent[m
[31m-  -- Read the included file.[m
[31m-  local fatal = readfile(pathopen(g_opt.include, name) or[m
[31m-			 wfatal("include file `"..name.."' not found"))[m
[31m-  -- Restore state.[m
[31m-  g_synclineno = -1[m
[31m-  g_fname, g_lineno, g_curline, g_indent = gf, gl, gcl, gi[m
[31m-  if fatal then wfatal("in include file") end[m
[31m-end[m
[31m-[m
[31m--- Make .include and conditionals initially available, too.[m
[31m-map_op[".include_1"] = map_coreop[".include_1"][m
[31m-map_op[".if_1"] = map_coreop[".if_1"][m
[31m-map_op[".elif_1"] = map_coreop[".elif_1"][m
[31m-map_op[".else_0"] = map_coreop[".else_0"][m
[31m-map_op[".endif_0"] = map_coreop[".endif_0"][m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Support variables for macros.[m
[31m-local mac_capture, mac_lineno, mac_name[m
[31m-local mac_active = {}[m
[31m-local mac_list = {}[m
[31m-[m
[31m--- Pseudo-opcode to define a macro.[m
[31m-map_coreop[".macro_*"] = function(mparams)[m
[31m-  if not mparams then return "name [, params...]" end[m
[31m-  -- Split off and validate macro name.[m
[31m-  local name = remove(mparams, 1)[m
[31m-  if not name then werror("missing macro name") end[m
[31m-  if not (match(name, "^[%a_][%w_%.]*$") or match(name, "^%.[%w_%.]*$")) then[m
[31m-    wfatal("bad macro name `"..name.."'")[m
[31m-  end[m
[31m-  -- Validate macro parameter names.[m
[31m-  local mdup = {}[m
[31m-  for _,mp in ipairs(mparams) do[m
[31m-    if not match(mp, "^[%a_][%w_]*$") then[m
[31m-      wfatal("bad macro parameter name `"..mp.."'")[m
[31m-    end[m
[31m-    if mdup[mp] then wfatal("duplicate macro parameter name `"..mp.."'") end[m
[31m-    mdup[mp] = true[m
[31m-  end[m
[31m-  -- Check for duplicate or recursive macro definitions.[m
[31m-  local opname = name.."_"..#mparams[m
[31m-  if map_op[opname] or map_op[name.."_*"] then[m
[31m-    wfatal("duplicate macro `"..name.."' ("..#mparams.." parameters)")[m
[31m-  end[m
[31m-  if mac_capture then wfatal("recursive macro definition") end[m
[31m-[m
[31m-  -- Enable statement capture.[m
[31m-  local lines = {}[m
[31m-  mac_lineno = g_lineno[m
[31m-  mac_name = name[m
[31m-  mac_capture = function(stmt) -- Statement capture function.[m
[31m-    -- Stop macro definition with .endmacro pseudo-opcode.[m
[31m-    if not match(stmt, "^%s*.endmacro%s*$") then[m
[31m-      lines[#lines+1] = stmt[m
[31m-      return[m
[31m-    end[m
[31m-    mac_capture = nil[m
[31m-    mac_lineno = nil[m
[31m-    mac_name = nil[m
[31m-    mac_list[#mac_list+1] = opname[m
[31m-    -- Add macro-op definition.[m
[31m-    map_op[opname] = function(params)[m
[31m-      if not params then return mparams, lines end[m
[31m-      -- Protect against recursive macro invocation.[m
[31m-      if mac_active[opname] then wfatal("recursive macro invocation") end[m
[31m-      mac_active[opname] = true[m
[31m-      -- Setup substitution map.[m
[31m-      local subst = {}[m
[31m-      for i,mp in ipairs(mparams) do subst[mp] = params[i] end[m
[31m-      local mcom[m
[31m-      if g_opt.maccomment and g_opt.comment then[m
[31m-	mcom = " MACRO "..name.." ("..#mparams..")"[m
[31m-	wcomment("{"..mcom)[m
[31m-      end[m
[31m-      -- Loop through all captured statements[m
[31m-      for _,stmt in ipairs(lines) do[m
[31m-	-- Substitute macro parameters.[m
[31m-	local st = gsub(stmt, "[%w_]+", subst)[m
[31m-	st = definesubst(st)[m
[31m-	st = gsub(st, "%s*%.%.%s*", "") -- Token paste a..b.[m
[31m-	if mcom and sub(st, 1, 1) ~= "|" then wcomment(st) end[m
[31m-	-- Emit statement. Use a protected call for better diagnostics.[m
[31m-	local ok, err = pcall(dostmt, st)[m
[31m-	if not ok then[m
[31m-	  -- Add the captured statement to the error.[m
[31m-	  wprinterr(err, "\n", g_indent, "|  ", stmt,[m
[31m-		    "\t[MACRO ", name, " (", #mparams, ")]\n")[m
[31m-	end[m
[31m-      end[m
[31m-      if mcom then wcomment("}"..mcom) end[m
[31m-      mac_active[opname] = nil[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- An .endmacro pseudo-opcode outside of a macro definition is an error.[m
[31m-map_coreop[".endmacro_0"] = function(params)[m
[31m-  wfatal(".endmacro without .macro")[m
[31m-end[m
[31m-[m
[31m--- Dump all macros and their contents (with -PP only).[m
[31m-local function dumpmacros(out, lvl)[m
[31m-  sort(mac_list)[m
[31m-  out:write("Macros:\n")[m
[31m-  for _,opname in ipairs(mac_list) do[m
[31m-    local name = sub(opname, 1, -3)[m
[31m-    local params, lines = map_op[opname]()[m
[31m-    out:write(format("  %-20s %s\n", name, concat(params, ", ")))[m
[31m-    if lvl > 1 then[m
[31m-      for _,line in ipairs(lines) do[m
[31m-	out:write("  |", line, "\n")[m
[31m-      end[m
[31m-      out:write("\n")[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Check for unfinished macro definitions.[m
[31m-local function checkmacros()[m
[31m-  if mac_capture then[m
[31m-    wprinterr(g_fname, ":", mac_lineno,[m
[31m-	      ": error: unfinished .macro `", mac_name ,"'\n")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Support variables for captures.[m
[31m-local cap_lineno, cap_name[m
[31m-local cap_buffers = {}[m
[31m-local cap_used = {}[m
[31m-[m
[31m--- Start a capture.[m
[31m-map_coreop[".capture_1"] = function(params)[m
[31m-  if not params then return "name" end[m
[31m-  wflush()[m
[31m-  local name = params[1][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    wfatal("bad capture name `"..name.."'")[m
[31m-  end[m
[31m-  if cap_name then[m
[31m-    wfatal("already capturing to `"..cap_name.."' since line "..cap_lineno)[m
[31m-  end[m
[31m-  cap_name = name[m
[31m-  cap_lineno = g_lineno[m
[31m-  -- Create or continue a capture buffer and start the output line capture.[m
[31m-  local buf = cap_buffers[name][m
[31m-  if not buf then buf = {}; cap_buffers[name] = buf end[m
[31m-  g_capbuffer = buf[m
[31m-  g_synclineno = 0[m
[31m-end[m
[31m-[m
[31m--- Stop a capture.[m
[31m-map_coreop[".endcapture_0"] = function(params)[m
[31m-  wflush()[m
[31m-  if not cap_name then wfatal(".endcapture without a valid .capture") end[m
[31m-  cap_name = nil[m
[31m-  cap_lineno = nil[m
[31m-  g_capbuffer = nil[m
[31m-  g_synclineno = 0[m
[31m-end[m
[31m-[m
[31m--- Dump a capture buffer.[m
[31m-map_coreop[".dumpcapture_1"] = function(params)[m
[31m-  if not params then return "name" end[m
[31m-  wflush()[m
[31m-  local name = params[1][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    wfatal("bad capture name `"..name.."'")[m
[31m-  end[m
[31m-  cap_used[name] = true[m
[31m-  wline(function(out)[m
[31m-    local buf = cap_buffers[name][m
[31m-    if buf then wdumplines(out, buf) end[m
[31m-  end)[m
[31m-  g_synclineno = 0[m
[31m-end[m
[31m-[m
[31m--- Dump all captures and their buffers (with -PP only).[m
[31m-local function dumpcaptures(out, lvl)[m
[31m-  out:write("Captures:\n")[m
[31m-  for name,buf in pairs(cap_buffers) do[m
[31m-    out:write(format("  %-20s %4s)\n", name, "("..#buf))[m
[31m-    if lvl > 1 then[m
[31m-      local bar = rep("=", 76)[m
[31m-      out:write("  ", bar, "\n")[m
[31m-      for _,line in ipairs(buf) do[m
[31m-	out:write("  ", line, "\n")[m
[31m-      end[m
[31m-      out:write("  ", bar, "\n\n")[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Check for unfinished or unused captures.[m
[31m-local function checkcaptures()[m
[31m-  if cap_name then[m
[31m-    wprinterr(g_fname, ":", cap_lineno,[m
[31m-	      ": error: unfinished .capture `", cap_name,"'\n")[m
[31m-    return[m
[31m-  end[m
[31m-  for name in pairs(cap_buffers) do[m
[31m-    if not cap_used[name] then[m
[31m-      wprinterr(g_fname, ":*: error: missing .dumpcapture ", name ,"\n")[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Sections names.[m
[31m-local map_sections = {}[m
[31m-[m
[31m--- Pseudo-opcode to define code sections.[m
[31m--- TODO: Data sections, BSS sections. Needs extra C code and API.[m
[31m-map_coreop[".section_*"] = function(params)[m
[31m-  if not params then return "name..." end[m
[31m-  if #map_sections > 0 then werror("duplicate section definition") end[m
[31m-  wflush()[m
[31m-  for sn,name in ipairs(params) do[m
[31m-    local opname = "."..name.."_0"[m
[31m-    if not match(name, "^[%a][%w_]*$") or[m
[31m-       map_op[opname] or map_op["."..name.."_*"] then[m
[31m-      werror("bad section name `"..name.."'")[m
[31m-    end[m
[31m-    map_sections[#map_sections+1] = name[m
[31m-    wline(format("#define DASM_SECTION_%s\t%d", upper(name), sn-1))[m
[31m-    map_op[opname] = function(params) g_arch.section(sn-1) end[m
[31m-  end[m
[31m-  wline(format("#define DASM_MAXSECTION\t\t%d", #map_sections))[m
[31m-end[m
[31m-[m
[31m--- Dump all sections.[m
[31m-local function dumpsections(out, lvl)[m
[31m-  out:write("Sections:\n")[m
[31m-  for _,name in ipairs(map_sections) do[m
[31m-    out:write(format("  %s\n", name))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Replacement for customized Lua, which lacks the package library.[m
[31m-local prefix = ""[m
[31m-if not require then[m
[31m-  function require(name)[m
[31m-    local fp = assert(io.open(prefix..name..".lua"))[m
[31m-    local s = fp:read("*a")[m
[31m-    assert(fp:close())[m
[31m-    return assert(loadstring(s, "@"..name..".lua"))()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Load architecture-specific module.[m
[31m-local function loadarch(arch)[m
[31m-  if not match(arch, "^[%w_]+$") then return "bad arch name" end[m
[31m-  local ok, m_arch = pcall(require, "dasm_"..arch)[m
[31m-  if not ok then return "cannot load module: "..m_arch end[m
[31m-  g_arch = m_arch[m
[31m-  wflush = m_arch.passcb(wline, werror, wfatal, wwarn)[m
[31m-  m_arch.setup(arch, g_opt)[m
[31m-  map_op, map_def = m_arch.mergemaps(map_coreop, map_def)[m
[31m-end[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function opt_map.dumparch(args)[m
[31m-  local name = optparam(args)[m
[31m-  if not g_arch then[m
[31m-    local err = loadarch(name)[m
[31m-    if err then opterror(err) end[m
[31m-  end[m
[31m-[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_coreop) do t[#t+1] = name end[m
[31m-  for name in pairs(map_op) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-[m
[31m-  local out = stdout[m
[31m-  local _arch = g_arch._info[m
[31m-  out:write(format("%s version %s, released %s, %s\n",[m
[31m-    _info.name, _info.version, _info.release, _info.url))[m
[31m-  g_arch.dumparch(out)[m
[31m-[m
[31m-  local pseudo = true[m
[31m-  out:write("Pseudo-Opcodes:\n")[m
[31m-  for _,sname in ipairs(t) do[m
[31m-    local name, nparam = match(sname, "^(.+)_([0-9%*])$")[m
[31m-    if name then[m
[31m-      if pseudo and sub(name, 1, 1) ~= "." then[m
[31m-	out:write("\nOpcodes:\n")[m
[31m-	pseudo = false[m
[31m-      end[m
[31m-      local f = map_op[sname][m
[31m-      local s[m
[31m-      if nparam ~= "*" then nparam = nparam + 0 end[m
[31m-      if nparam == 0 then[m
[31m-	s = ""[m
[31m-      elseif type(f) == "string" then[m
[31m-	s = map_op[".template__"](nil, f, nparam)[m
[31m-      else[m
[31m-	s = f(nil, nparam)[m
[31m-      end[m
[31m-      if type(s) == "table" then[m
[31m-	for _,s2 in ipairs(s) do[m
[31m-	  out:write(format("  %-12s %s\n", name, s2))[m
[31m-	end[m
[31m-      else[m
[31m-	out:write(format("  %-12s %s\n", name, s))[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-  exit(0)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to set the architecture.[m
[31m--- Only initially available (map_op is replaced when called).[m
[31m-map_op[".arch_1"] = function(params)[m
[31m-  if not params then return "name" end[m
[31m-  local err = loadarch(params[1])[m
[31m-  if err then wfatal(err) end[m
[31m-  wline(format("#if DASM_VERSION != %d", _info.vernum))[m
[31m-  wline('#error "Version mismatch between DynASM and included encoding engine"')[m
[31m-  wline("#endif")[m
[31m-end[m
[31m-[m
[31m--- Dummy .arch pseudo-opcode to improve the error report.[m
[31m-map_coreop[".arch_1"] = function(params)[m
[31m-  if not params then return "name" end[m
[31m-  wfatal("duplicate .arch statement")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dummy pseudo-opcode. Don't confuse '.nop' with 'nop'.[m
[31m-map_coreop[".nop_*"] = function(params)[m
[31m-  if not params then return "[ignored...]" end[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcodes to raise errors.[m
[31m-map_coreop[".error_1"] = function(params)[m
[31m-  if not params then return "message" end[m
[31m-  werror(params[1])[m
[31m-end[m
[31m-[m
[31m-map_coreop[".fatal_1"] = function(params)[m
[31m-  if not params then return "message" end[m
[31m-  wfatal(params[1])[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-local function dumpdef(out)[m
[31m-  local lvl = g_opt.dumpdef[m
[31m-  if lvl == 0 then return end[m
[31m-  dumpsections(out, lvl)[m
[31m-  dumpdefines(out, lvl)[m
[31m-  if g_arch then g_arch.dumpdef(out, lvl) end[m
[31m-  dumpmacros(out, lvl)[m
[31m-  dumpcaptures(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Helper for splitstmt.[m
[31m-local splitlvl[m
[31m-[m
[31m-local function splitstmt_one(c)[m
[31m-  if c == "(" then[m
[31m-    splitlvl = ")"..splitlvl[m
[31m-  elseif c == "[" then[m
[31m-    splitlvl = "]"..splitlvl[m
[31m-  elseif c == "{" then[m
[31m-    splitlvl = "}"..splitlvl[m
[31m-  elseif c == ")" or c == "]" or c == "}" then[m
[31m-    if sub(splitlvl, 1, 1) ~= c then werror("unbalanced (), [] or {}") end[m
[31m-    splitlvl = sub(splitlvl, 2)[m
[31m-  elseif splitlvl == "" then[m
[31m-    return " \0 "[m
[31m-  end[m
[31m-  return c[m
[31m-end[m
[31m-[m
[31m--- Split statement into (pseudo-)opcode and params.[m
[31m-local function splitstmt(stmt)[m
[31m-  -- Convert label with trailing-colon into .label statement.[m
[31m-  local label = match(stmt, "^%s*(.+):%s*$")[m
[31m-  if label then return ".label", {label} end[m
[31m-[m
[31m-  -- Split at commas and equal signs, but obey parentheses and brackets.[m
[31m-  splitlvl = ""[m
[31m-  stmt = gsub(stmt, "[,%(%)%[%]{}]", splitstmt_one)[m
[31m-  if splitlvl ~= "" then werror("unbalanced () or []") end[m
[31m-[m
[31m-  -- Split off opcode.[m
[31m-  local op, other = match(stmt, "^%s*([^%s%z]+)%s*(.*)$")[m
[31m-  if not op then werror("bad statement syntax") end[m
[31m-[m
[31m-  -- Split parameters.[m
[31m-  local params = {}[m
[31m-  for p in gmatch(other, "%s*(%Z+)%z?") do[m
[31m-    params[#params+1] = gsub(p, "%s+$", "")[m
[31m-  end[m
[31m-  if #params > 16 then werror("too many parameters") end[m
[31m-[m
[31m-  params.op = op[m
[31m-  return op, params[m
[31m-end[m
[31m-[m
[31m--- Process a single statement.[m
[31m-dostmt = function(stmt)[m
[31m-  -- Ignore empty statements.[m
[31m-  if match(stmt, "^%s*$") then return end[m
[31m-[m
[31m-  -- Capture macro defs before substitution.[m
[31m-  if mac_capture then return mac_capture(stmt) end[m
[31m-  stmt = definesubst(stmt)[m
[31m-[m
[31m-  -- Emit C code without parsing the line.[m
[31m-  if sub(stmt, 1, 1) == "|" then[m
[31m-    local tail = sub(stmt, 2)[m
[31m-    wflush()[m
[31m-    if sub(tail, 1, 2) == "//" then wcomment(tail) else wline(tail, true) end[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  -- Split into (pseudo-)opcode and params.[m
[31m-  local op, params = splitstmt(stmt)[m
[31m-[m
[31m-  -- Get opcode handler (matching # of parameters or generic handler).[m
[31m-  local f = map_op[op.."_"..#params] or map_op[op.."_*"][m
[31m-  if not f then[m
[31m-    if not g_arch then wfatal("first statement must be .arch") end[m
[31m-    -- Improve error report.[m
[31m-    for i=0,9 do[m
[31m-      if map_op[op.."_"..i] then[m
[31m-	werror("wrong number of parameters for `"..op.."'")[m
[31m-      end[m
[31m-    end[m
[31m-    werror("unknown statement `"..op.."'")[m
[31m-  end[m
[31m-[m
[31m-  -- Call opcode handler or special handler for template strings.[m
[31m-  if type(f) == "string" then[m
[31m-    map_op[".template__"](params, f)[m
[31m-  else[m
[31m-    f(params)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Process a single line.[m
[31m-local function doline(line)[m
[31m-  if g_opt.flushline then wflush() end[m
[31m-[m
[31m-  -- Assembler line?[m
[31m-  local indent, aline = match(line, "^(%s*)%|(.*)$")[m
[31m-  if not aline then[m
[31m-    -- No, plain C code line, need to flush first.[m
[31m-    wflush()[m
[31m-    wsync()[m
[31m-    wline(line, false)[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  g_indent = indent -- Remember current line indentation.[m
[31m-[m
[31m-  -- Emit C code (even from macros). Avoids echo and line parsing.[m
[31m-  if sub(aline, 1, 1) == "|" then[m
[31m-    if not mac_capture then[m
[31m-      wsync()[m
[31m-    elseif g_opt.comment then[m
[31m-      wsync()[m
[31m-      wcomment(aline)[m
[31m-    end[m
[31m-    dostmt(aline)[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  -- Echo assembler line as a comment.[m
[31m-  if g_opt.comment then[m
[31m-    wsync()[m
[31m-    wcomment(aline)[m
[31m-  end[m
[31m-[m
[31m-  -- Strip assembler comments.[m
[31m-  aline = gsub(aline, "//.*$", "")[m
[31m-[m
[31m-  -- Split line into statements at semicolons.[m
[31m-  if match(aline, ";") then[m
[31m-    for stmt in gmatch(aline, "[^;]+") do dostmt(stmt) end[m
[31m-  else[m
[31m-    dostmt(aline)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Write DynASM header.[m
[31m-local function dasmhead(out)[m
[31m-  out:write(format([[[m
[31m-/*[m
[31m-** This file has been pre-processed with DynASM.[m
[31m-** %s[m
[31m-** DynASM version %s, DynASM %s version %s[m
[31m-** DO NOT EDIT! The original file is in "%s".[m
[31m-*/[m
[31m-[m
[31m-]], _info.url,[m
[31m-    _info.version, g_arch._info.arch, g_arch._info.version,[m
[31m-    g_fname))[m
[31m-end[m
[31m-[m
[31m--- Read input file.[m
[31m-readfile = function(fin)[m
[31m-  g_indent = ""[m
[31m-  g_lineno = 0[m
[31m-  g_synclineno = -1[m
[31m-[m
[31m-  -- Process all lines.[m
[31m-  for line in fin:lines() do[m
[31m-    g_lineno = g_lineno + 1[m
[31m-    g_curline = line[m
[31m-    local ok, err = pcall(doline, line)[m
[31m-    if not ok and wprinterr(err, "\n") then return true end[m
[31m-  end[m
[31m-  wflush()[m
[31m-[m
[31m-  -- Close input file.[m
[31m-  assert(fin == stdin or fin:close())[m
[31m-end[m
[31m-[m
[31m--- Write output file.[m
[31m-local function writefile(outfile)[m
[31m-  local fout[m
[31m-[m
[31m-  -- Open output file.[m
[31m-  if outfile == nil or outfile == "-" then[m
[31m-    fout = stdout[m
[31m-  else[m
[31m-    fout = assert(io.open(outfile, "w"))[m
[31m-  end[m
[31m-[m
[31m-  -- Write all buffered lines[m
[31m-  wdumplines(fout, g_wbuffer)[m
[31m-[m
[31m-  -- Close output file.[m
[31m-  assert(fout == stdout or fout:close())[m
[31m-[m
[31m-  -- Optionally dump definitions.[m
[31m-  dumpdef(fout == stdout and stderr or stdout)[m
[31m-end[m
[31m-[m
[31m--- Translate an input file to an output file.[m
[31m-local function translate(infile, outfile)[m
[31m-  g_wbuffer = {}[m
[31m-  g_indent = ""[m
[31m-  g_lineno = 0[m
[31m-  g_synclineno = -1[m
[31m-[m
[31m-  -- Put header.[m
[31m-  wline(dasmhead)[m
[31m-[m
[31m-  -- Read input file.[m
[31m-  local fin[m
[31m-  if infile == "-" then[m
[31m-    g_fname = "(stdin)"[m
[31m-    fin = stdin[m
[31m-  else[m
[31m-    g_fname = infile[m
[31m-    fin = assert(io.open(infile, "r"))[m
[31m-  end[m
[31m-  readfile(fin)[m
[31m-[m
[31m-  -- Check for errors.[m
[31m-  if not g_arch then[m
[31m-    wprinterr(g_fname, ":*: error: missing .arch directive\n")[m
[31m-  end[m
[31m-  checkconds()[m
[31m-  checkmacros()[m
[31m-  checkcaptures()[m
[31m-[m
[31m-  if g_errcount ~= 0 then[m
[31m-    stderr:write(g_fname, ":*: info: ", g_errcount, " error",[m
[31m-      (type(g_errcount) == "number" and g_errcount > 1) and "s" or "",[m
[31m-      " in input file -- no output file generated.\n")[m
[31m-    dumpdef(stderr)[m
[31m-    exit(1)[m
[31m-  end[m
[31m-[m
[31m-  -- Write output file.[m
[31m-  writefile(outfile)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Print help text.[m
[31m-function opt_map.help()[m
[31m-  stdout:write("DynASM -- ", _info.description, ".\n")[m
[31m-  stdout:write("DynASM ", _info.version, " ", _info.release, "  ", _info.url, "\n")[m
[31m-  stdout:write[[[m
[31m-[m
[31m-Usage: dynasm [OPTION]... INFILE.dasc|-[m
[31m-[m
[31m-  -h, --help           Display this help text.[m
[31m-  -V, --version        Display version and copyright information.[m
[31m-[m
[31m-  -o, --outfile FILE   Output file name (default is stdout).[m
[31m-  -I, --include DIR    Add directory to the include search path.[m
[31m-[m
[31m-  -c, --ccomment       Use /* */ comments for assembler lines.[m
[31m-  -C, --cppcomment     Use // comments for assembler lines (default).[m
[31m-  -N, --nocomment      Suppress assembler lines in output.[m
[31m-  -M, --maccomment     Show macro expansions as comments (default off).[m
[31m-[m
[31m-  -L, --nolineno       Suppress CPP line number information in output.[m
[31m-  -F, --flushline      Flush action list for every line.[m
[31m-[m
[31m-  -D NAME[=SUBST]      Define a substitution.[m
[31m-  -U NAME              Undefine a substitution.[m
[31m-[m
[31m-  -P, --dumpdef        Dump defines, macros, etc. Repeat for more output.[m
[31m-  -A, --dumparch ARCH  Load architecture ARCH and dump description.[m
[31m-]][m
[31m-  exit(0)[m
[31m-end[m
[31m-[m
[31m--- Print version information.[m
[31m-function opt_map.version()[m
[31m-  stdout:write(format("%s version %s, released %s\n%s\n\n%s",[m
[31m-    _info.name, _info.version, _info.release, _info.url, _info.copyright))[m
[31m-  exit(0)[m
[31m-end[m
[31m-[m
[31m--- Misc. options.[m
[31m-function opt_map.outfile(args) g_opt.outfile = optparam(args) end[m
[31m-function opt_map.include(args) insert(g_opt.include, 1, optparam(args)) end[m
[31m-function opt_map.ccomment() g_opt.comment = "/*|"; g_opt.endcomment = " */" end[m
[31m-function opt_map.cppcomment() g_opt.comment = "//|"; g_opt.endcomment = "" end[m
[31m-function opt_map.nocomment() g_opt.comment = false end[m
[31m-function opt_map.maccomment() g_opt.maccomment = true end[m
[31m-function opt_map.nolineno() g_opt.cpp = false end[m
[31m-function opt_map.flushline() g_opt.flushline = true end[m
[31m-function opt_map.dumpdef() g_opt.dumpdef = g_opt.dumpdef + 1 end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Short aliases for long options.[m
[31m-local opt_alias = {[m
[31m-  h = "help", ["?"] = "help", V = "version",[m
[31m-  o = "outfile", I = "include",[m
[31m-  c = "ccomment", C = "cppcomment", N = "nocomment", M = "maccomment",[m
[31m-  L = "nolineno", F = "flushline",[m
[31m-  P = "dumpdef", A = "dumparch",[m
[31m-}[m
[31m-[m
[31m--- Parse single option.[m
[31m-local function parseopt(opt, args)[m
[31m-  opt_current = #opt == 1 and "-"..opt or "--"..opt[m
[31m-  local f = opt_map[opt] or opt_map[opt_alias[opt]][m
[31m-  if not f then[m
[31m-    opterror("unrecognized option `", opt_current, "'. Try `--help'.\n")[m
[31m-  end[m
[31m-  f(args)[m
[31m-end[m
[31m-[m
[31m--- Parse arguments.[m
[31m-local function parseargs(args)[m
[31m-  -- Default options.[m
[31m-  g_opt.comment = "//|"[m
[31m-  g_opt.endcomment = ""[m
[31m-  g_opt.cpp = true[m
[31m-  g_opt.dumpdef = 0[m
[31m-  g_opt.include = { "" }[m
[31m-[m
[31m-  -- Process all option arguments.[m
[31m-  args.argn = 1[m
[31m-  repeat[m
[31m-    local a = args[args.argn][m
[31m-    if not a then break end[m
[31m-    local lopt, opt = match(a, "^%-(%-?)(.+)")[m
[31m-    if not opt then break end[m
[31m-    args.argn = args.argn + 1[m
[31m-    if lopt == "" then[m
[31m-      -- Loop through short options.[m
[31m-      for o in gmatch(opt, ".") do parseopt(o, args) end[m
[31m-    else[m
[31m-      -- Long option.[m
[31m-      parseopt(opt, args)[m
[31m-    end[m
[31m-  until false[m
[31m-[m
[31m-  -- Check for proper number of arguments.[m
[31m-  local nargs = #args - args.argn + 1[m
[31m-  if nargs ~= 1 then[m
[31m-    if nargs == 0 then[m
[31m-      if g_opt.dumpdef > 0 then return dumpdef(stdout) end[m
[31m-    end[m
[31m-    opt_map.help()[m
[31m-  end[m
[31m-[m
[31m-  -- Translate a single input file to a single output file[m
[31m-  -- TODO: Handle multiple files?[m
[31m-  translate(args[args.argn], g_opt.outfile)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add the directory dynasm.lua resides in to the Lua module search path.[m
[31m-local arg = arg[m
[31m-if arg and arg[0] then[m
[31m-  prefix = match(arg[0], "^(.*[/\\])")[m
[31m-  if package and prefix then package.path = prefix.."?.lua;"..package.path end[m
[31m-end[m
[31m-[m
[31m--- Start DynASM.[m
[31m-parseargs{...}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/etc/luajit.1 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/etc/luajit.1[m
[1mdeleted file mode 100644[m
[1mindex 11e88c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/etc/luajit.1[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-.TH luajit 1 "" "" "LuaJIT documentation"[m
[31m-.SH NAME[m
[31m-luajit \- Just-In-Time Compiler for the Lua Language[m
[31m-\fB[m
[31m-.SH SYNOPSIS[m
[31m-.B luajit[m
[31m-[\fIoptions\fR]... [\fIscript\fR [\fIargs\fR]...][m
[31m-.SH "WEB SITE"[m
[31m-.IR http://luajit.org[m
[31m-.SH DESCRIPTION[m
[31m-.PP[m
[31m-This is the command-line program to run Lua programs with \fBLuaJIT\fR.[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is a just-in-time (JIT) compiler for the Lua language.[m
[31m-The virtual machine (VM) is based on a fast interpreter combined with[m
[31m-a trace compiler. It can significantly improve the performance of Lua programs.[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is API\- and ABI-compatible with the VM of the standard[m
[31m-Lua\ 5.1 interpreter. When embedding the VM into an application,[m
[31m-the built library can be used as a drop-in replacement.[m
[31m-.SH OPTIONS[m
[31m-.TP[m
[31m-.BI "\-e " chunk[m
[31m-Run the given chunk of Lua code.[m
[31m-.TP[m
[31m-.BI "\-l " library[m
[31m-Load the named library, just like \fBrequire("\fR\fIlibrary\fR\fB")\fR.[m
[31m-.TP[m
[31m-.BI "\-b " ...[m
[31m-Save or list bytecode. Run without arguments to get help on options.[m
[31m-.TP[m
[31m-.BI "\-j " command[m
[31m-Perform LuaJIT control command (optional space after \fB\-j\fR).[m
[31m-.TP[m
[31m-.BI "\-O" [opt][m
[31m-Control LuaJIT optimizations.[m
[31m-.TP[m
[31m-.B "\-i"[m
[31m-Run in interactive mode.[m
[31m-.TP[m
[31m-.B "\-v"[m
[31m-Show \fBLuaJIT\fR version.[m
[31m-.TP[m
[31m-.B "\-E"[m
[31m-Ignore environment variables.[m
[31m-.TP[m
[31m-.B "\-\-"[m
[31m-Stop processing options.[m
[31m-.TP[m
[31m-.B "\-"[m
[31m-Read script from stdin instead.[m
[31m-.PP[m
[31m-After all options are processed, the given \fIscript\fR is run.[m
[31m-The arguments are passed in the global \fIarg\fR table.[m
[31m-.PP[m
[31m-Interactive mode is only entered, if no \fIscript\fR and no \fB\-e\fR[m
[31m-option is given. Interactive mode can be left with EOF (\fICtrl\-Z\fB).[m
[31m-.SH EXAMPLES[m
[31m-.TP[m
[31m-luajit hello.lua world[m
[31m-[m
[31m-Prints "Hello world", assuming \fIhello.lua\fR contains:[m
[31m-.br[m
[31m-  print("Hello", arg[1])[m
[31m-.TP[m
[31m-luajit \-e "local x=0; for i=1,1e9 do x=x+i end; print(x)"[m
[31m-[m
[31m-Calculates the sum of the numbers from 1 to 1000000000.[m
[31m-.br[m
[31m-And finishes in a reasonable amount of time, too.[m
[31m-.TP[m
[31m-luajit \-jv \-e "for i=1,10 do for j=1,10 do for k=1,100 do end end end"[m
[31m-[m
[31m-Runs some nested loops and shows the resulting traces.[m
[31m-.SH COPYRIGHT[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is Copyright \(co 2005-2016 Mike Pall.[m
[31m-.br[m
[31m-\fBLuaJIT\fR is open source software, released under the MIT license.[m
[31m-.SH SEE ALSO[m
[31m-.PP[m
[31m-More details in the provided HTML docs or at:[m
[31m-.IR http://luajit.org[m
[31m-.br[m
[31m-More about the Lua language can be found at:[m
[31m-.IR http://lua.org/docs.html[m
[31m-.PP[m
[31m-lua(1)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/etc/luajit.pc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/etc/luajit.pc[m
[1mdeleted file mode 100644[m
[1mindex 0fdd1ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/etc/luajit.pc[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-# Package information for LuaJIT to be used by pkg-config.[m
[31m-majver=2[m
[31m-minver=1[m
[31m-relver=0[m
[31m-version=${majver}.${minver}.${relver}-beta2[m
[31m-abiver=5.1[m
[31m-[m
[31m-prefix=/usr/local[m
[31m-multilib=lib[m
[31m-exec_prefix=${prefix}[m
[31m-libdir=${exec_prefix}/${multilib}[m
[31m-libname=luajit-${abiver}[m
[31m-includedir=${prefix}/include/luajit-${majver}.${minver}[m
[31m-[m
[31m-INSTALL_LMOD=${prefix}/share/lua/${abiver}[m
[31m-INSTALL_CMOD=${prefix}/${multilib}/lua/${abiver}[m
[31m-[m
[31m-Name: LuaJIT[m
[31m-Description: Just-in-time compiler for Lua[m
[31m-URL: http://luajit.org[m
[31m-Version: ${version}[m
[31m-Requires:[m
[31m-Libs: -L${libdir} -l${libname}[m
[31m-Libs.private: -Wl,-E -lm -ldl[m
[31m-Cflags: -I${includedir}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 1a30573..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-luajit[m
[31m-lj_bcdef.h[m
[31m-lj_ffdef.h[m
[31m-lj_libdef.h[m
[31m-lj_recdef.h[m
[31m-lj_folddef.h[m
[31m-lj_vm.[sS][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f25192..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,712 +0,0 @@[m
[31m-##############################################################################[m
[31m-# LuaJIT Makefile. Requires GNU Make.[m
[31m-#[m
[31m-# Please read doc/install.html before changing any variables![m
[31m-#[m
[31m-# Suitable for POSIX platforms (Linux, *BSD, OSX etc.).[m
[31m-# Also works with MinGW and Cygwin on Windows.[m
[31m-# Please check msvcbuild.bat for building with MSVC on Windows.[m
[31m-#[m
[31m-# Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-##############################################################################[m
[31m-[m
[31m-MAJVER=  2[m
[31m-MINVER=  1[m
[31m-RELVER=  0[m
[31m-ABIVER=  5.1[m
[31m-NODOTABIVER= 51[m
[31m-[m
[31m-##############################################################################[m
[31m-#############################  COMPILER OPTIONS  #############################[m
[31m-##############################################################################[m
[31m-# These options mainly affect the speed of the JIT compiler itself, not the[m
[31m-# speed of the JIT-compiled code. Turn any of the optional settings on by[m
[31m-# removing the '#' in front of them. Make sure you force a full recompile[m
[31m-# with "make clean", followed by "make" if you change any options.[m
[31m-#[m
[31m-DEFAULT_CC = gcc[m
[31m-#[m
[31m-# LuaJIT builds as a native 32 or 64 bit binary by default.[m
[31m-CC= $(DEFAULT_CC)[m
[31m-#[m
[31m-# Use this if you want to force a 32 bit build on a 64 bit multilib OS.[m
[31m-#CC= $(DEFAULT_CC) -m32[m
[31m-#[m
[31m-# Since the assembler part does NOT maintain a frame pointer, it's pointless[m
[31m-# to slow down the C part by not omitting it. Debugging, tracebacks and[m
[31m-# unwinding are not affected -- the assembler part has frame unwind[m
[31m-# information and GCC emits it where needed (x64) or with -g (see CCDEBUG).[m
[31m-CCOPT= -O2 -fomit-frame-pointer[m
[31m-# Use this if you want to generate a smaller binary (but it's slower):[m
[31m-#CCOPT= -Os -fomit-frame-pointer[m
[31m-# Note: it's no longer recommended to use -O3 with GCC 4.x.[m
[31m-# The I-Cache bloat usually outweighs the benefits from aggressive inlining.[m
[31m-#[m
[31m-# Target-specific compiler options:[m
[31m-#[m
[31m-# x86/x64 only: For GCC 4.2 or higher and if you don't intend to distribute[m
[31m-# the binaries to a different machine you could also use: -march=native[m
[31m-#[m
[31m-CCOPT_x86= -march=i686 -msse -msse2 -mfpmath=sse[m
[31m-CCOPT_x64=[m
[31m-CCOPT_arm=[m
[31m-CCOPT_arm64=[m
[31m-CCOPT_ppc=[m
[31m-CCOPT_mips=[m
[31m-#[m
[31m-CCDEBUG=[m
[31m-# Uncomment the next line to generate debug information:[m
[31m-#CCDEBUG= -g[m
[31m-#[m
[31m-CCWARN= -Wall[m
[31m-# Uncomment the next line to enable more warnings:[m
[31m-#CCWARN+= -Wextra -Wdeclaration-after-statement -Wredundant-decls -Wshadow -Wpointer-arith[m
[31m-#[m
[31m-##############################################################################[m
[31m-[m
[31m-##############################################################################[m
[31m-################################  BUILD MODE  ################################[m
[31m-##############################################################################[m
[31m-# The default build mode is mixed mode on POSIX. On Windows this is the same[m
[31m-# as dynamic mode.[m
[31m-#[m
[31m-# Mixed mode creates a static + dynamic library and a statically linked luajit.[m
[31m-BUILDMODE= mixed[m
[31m-#[m
[31m-# Static mode creates a static library and a statically linked luajit.[m
[31m-#BUILDMODE= static[m
[31m-#[m
[31m-# Dynamic mode creates a dynamic library and a dynamically linked luajit.[m
[31m-# Note: this executable will only run when the library is installed![m
[31m-#BUILDMODE= dynamic[m
[31m-#[m
[31m-##############################################################################[m
[31m-[m
[31m-##############################################################################[m
[31m-#################################  FEATURES  #################################[m
[31m-##############################################################################[m
[31m-# Enable/disable these features as needed, but make sure you force a full[m
[31m-# recompile with "make clean", followed by "make".[m
[31m-XCFLAGS=[m
[31m-#[m
[31m-# Permanently disable the FFI extension to reduce the size of the LuaJIT[m
[31m-# executable. But please consider that the FFI library is compiled-in,[m
[31m-# but NOT loaded by default. It only allocates any memory, if you actually[m
[31m-# make use of it.[m
[31m-#XCFLAGS+= -DLUAJIT_DISABLE_FFI[m
[31m-#[m
[31m-# Features from Lua 5.2 that are unlikely to break existing code are[m
[31m-# enabled by default. Some other features that *might* break some existing[m
[31m-# code (e.g. __pairs or os.execute() return values) can be enabled here.[m
[31m-# Note: this does not provide full compatibility with Lua 5.2 at this time.[m
[31m-#XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT[m
[31m-#[m
[31m-# Disable the JIT compiler, i.e. turn LuaJIT into a pure interpreter.[m
[31m-#XCFLAGS+= -DLUAJIT_DISABLE_JIT[m
[31m-#[m
[31m-# Some architectures (e.g. PPC) can use either single-number (1) or[m
[31m-# dual-number (2) mode. Uncomment one of these lines to override the[m
[31m-# default mode. Please see LJ_ARCH_NUMMODE in lj_arch.h for details.[m
[31m-#XCFLAGS+= -DLUAJIT_NUMMODE=1[m
[31m-#XCFLAGS+= -DLUAJIT_NUMMODE=2[m
[31m-#[m
[31m-##############################################################################[m
[31m-[m
[31m-##############################################################################[m
[31m-############################  DEBUGGING SUPPORT  #############################[m
[31m-##############################################################################[m
[31m-# Enable these options as needed, but make sure you force a full recompile[m
[31m-# with "make clean", followed by "make".[m
[31m-# Note that most of these are NOT suitable for benchmarking or release mode![m
[31m-#[m
[31m-# Use the system provided memory allocator (realloc) instead of the[m
[31m-# bundled memory allocator. This is slower, but sometimes helpful for[m
[31m-# debugging. This option cannot be enabled on x64, since realloc usually[m
[31m-# doesn't return addresses in the right address range.[m
[31m-# OTOH this option is mandatory for Valgrind's memcheck tool on x64 and[m
[31m-# the only way to get useful results from it for all other architectures.[m
[31m-#XCFLAGS+= -DLUAJIT_USE_SYSMALLOC[m
[31m-#[m
[31m-# This define is required to run LuaJIT under Valgrind. The Valgrind[m
[31m-# header files must be installed. You should enable debug information, too.[m
[31m-# Use --suppressions=lj.supp to avoid some false positives.[m
[31m-#XCFLAGS+= -DLUAJIT_USE_VALGRIND[m
[31m-#[m
[31m-# This is the client for the GDB JIT API. GDB 7.0 or higher is required[m
[31m-# to make use of it. See lj_gdbjit.c for details. Enabling this causes[m
[31m-# a non-negligible overhead, even when not running under GDB.[m
[31m-#XCFLAGS+= -DLUAJIT_USE_GDBJIT[m
[31m-#[m
[31m-# Turn on assertions for the Lua/C API to debug problems with lua_* calls.[m
[31m-# This is rather slow -- use only while developing C libraries/embeddings.[m
[31m-#XCFLAGS+= -DLUA_USE_APICHECK[m
[31m-#[m
[31m-# Turn on assertions for the whole LuaJIT VM. This significantly slows down[m
[31m-# everything. Use only if you suspect a problem with LuaJIT itself.[m
[31m-#XCFLAGS+= -DLUA_USE_ASSERT[m
[31m-#[m
[31m-##############################################################################[m
[31m-# You probably don't need to change anything below this line![m
[31m-##############################################################################[m
[31m-[m
[31m-##############################################################################[m
[31m-# Host system detection.[m
[31m-##############################################################################[m
[31m-[m
[31m-ifeq (Windows,$(findstring Windows,$(OS))$(MSYSTEM)$(TERM))[m
[31m-  HOST_SYS= Windows[m
[31m-  HOST_RM= del[m
[31m-else[m
[31m-  HOST_SYS:= $(shell uname -s)[m
[31m-  ifneq (,$(findstring MINGW,$(HOST_SYS)))[m
[31m-    HOST_SYS= Windows[m
[31m-    HOST_MSYS= mingw[m
[31m-  endif[m
[31m-  ifneq (,$(findstring CYGWIN,$(HOST_SYS)))[m
[31m-    HOST_SYS= Windows[m
[31m-    HOST_MSYS= cygwin[m
[31m-  endif[m
[31m-  # Use Clang for OSX host.[m
[31m-  ifeq (Darwin,$(HOST_SYS))[m
[31m-    DEFAULT_CC= clang[m
[31m-  endif[m
[31m-endif[m
[31m-[m
[31m-##############################################################################[m
[31m-# Flags and options for host and target.[m
[31m-##############################################################################[m
[31m-[m
[31m-# You can override the following variables at the make command line:[m
[31m-#   CC       HOST_CC       STATIC_CC       DYNAMIC_CC[m
[31m-#   CFLAGS   HOST_CFLAGS   TARGET_CFLAGS[m
[31m-#   LDFLAGS  HOST_LDFLAGS  TARGET_LDFLAGS  TARGET_SHLDFLAGS[m
[31m-#   LIBS     HOST_LIBS     TARGET_LIBS[m
[31m-#   CROSS    HOST_SYS      TARGET_SYS      TARGET_FLAGS[m
[31m-#[m
[31m-# Cross-compilation examples:[m
[31m-#   make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows[m
[31m-#   make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-[m
[31m-[m
[31m-ASOPTIONS= $(CCOPT) $(CCWARN) $(XCFLAGS) $(CFLAGS)[m
[31m-CCOPTIONS= $(CCDEBUG) $(ASOPTIONS)[m
[31m-LDOPTIONS= $(CCDEBUG) $(LDFLAGS)[m
[31m-[m
[31m-HOST_CC= $(CC)[m
[31m-HOST_RM= rm -f[m
[31m-# If left blank, minilua is built and used. You can supply an installed[m
[31m-# copy of (plain) Lua 5.1 or 5.2, plus Lua BitOp. E.g. with: HOST_LUA=lua[m
[31m-HOST_LUA=[m
[31m-[m
[31m-HOST_XCFLAGS= -I.[m
[31m-HOST_XLDFLAGS=[m
[31m-HOST_XLIBS=[m
[31m-HOST_ACFLAGS= $(CCOPTIONS) $(HOST_XCFLAGS) $(TARGET_ARCH) $(HOST_CFLAGS)[m
[31m-HOST_ALDFLAGS= $(LDOPTIONS) $(HOST_XLDFLAGS) $(HOST_LDFLAGS)[m
[31m-HOST_ALIBS= $(HOST_XLIBS) $(LIBS) $(HOST_LIBS)[m
[31m-[m
[31m-STATIC_CC = $(CROSS)$(CC)[m
[31m-DYNAMIC_CC = $(CROSS)$(CC) -fPIC[m
[31m-TARGET_CC= $(STATIC_CC)[m
[31m-TARGET_STCC= $(STATIC_CC)[m
[31m-TARGET_DYNCC= $(DYNAMIC_CC)[m
[31m-TARGET_LD= $(CROSS)$(CC)[m
[31m-TARGET_AR= $(CROSS)ar rcus[m
[31m-TARGET_STRIP= $(CROSS)strip[m
[31m-[m
[31m-TARGET_LIBPATH= $(or $(PREFIX),/usr/local)/$(or $(MULTILIB),lib)[m
[31m-TARGET_SONAME= libluajit-$(ABIVER).so.$(MAJVER)[m
[31m-TARGET_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).dylib[m
[31m-TARGET_DYLIBPATH= $(TARGET_LIBPATH)/$(TARGET_DYLIBNAME)[m
[31m-TARGET_DLLNAME= lua$(NODOTABIVER).dll[m
[31m-TARGET_XSHLDFLAGS= -shared -fPIC -Wl,-soname,$(TARGET_SONAME)[m
[31m-TARGET_DYNXLDOPTS=[m
[31m-[m
[31m-TARGET_LFSFLAGS= -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE[m
[31m-TARGET_XCFLAGS= $(TARGET_LFSFLAGS) -U_FORTIFY_SOURCE[m
[31m-TARGET_XLDFLAGS=[m
[31m-TARGET_XLIBS= -lm[m
[31m-TARGET_TCFLAGS= $(CCOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS)[m
[31m-TARGET_ACFLAGS= $(CCOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS)[m
[31m-TARGET_ASFLAGS= $(ASOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS)[m
[31m-TARGET_ALDFLAGS= $(LDOPTIONS) $(TARGET_XLDFLAGS) $(TARGET_FLAGS) $(TARGET_LDFLAGS)[m
[31m-TARGET_ASHLDFLAGS= $(LDOPTIONS) $(TARGET_XSHLDFLAGS) $(TARGET_FLAGS) $(TARGET_SHLDFLAGS)[m
[31m-TARGET_ALIBS= $(TARGET_XLIBS) $(LIBS) $(TARGET_LIBS)[m
[31m-[m
[31m-TARGET_TESTARCH=$(shell $(TARGET_CC) $(TARGET_TCFLAGS) -E lj_arch.h -dM)[m
[31m-ifneq (,$(findstring LJ_TARGET_X64 ,$(TARGET_TESTARCH)))[m
[31m-  TARGET_LJARCH= x64[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_X86 ,$(TARGET_TESTARCH)))[m
[31m-  TARGET_LJARCH= x86[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_ARM ,$(TARGET_TESTARCH)))[m
[31m-  TARGET_LJARCH= arm[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_ARM64 ,$(TARGET_TESTARCH)))[m
[31m-  TARGET_LJARCH= arm64[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_PPC ,$(TARGET_TESTARCH)))[m
[31m-  ifneq (,$(findstring LJ_LE 1,$(TARGET_TESTARCH)))[m
[31m-    TARGET_ARCH= -DLJ_ARCH_ENDIAN=LUAJIT_LE[m
[31m-  else[m
[31m-    TARGET_ARCH= -DLJ_ARCH_ENDIAN=LUAJIT_BE[m
[31m-  endif[m
[31m-  TARGET_LJARCH= ppc[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_MIPS ,$(TARGET_TESTARCH)))[m
[31m-  ifneq (,$(findstring MIPSEL ,$(TARGET_TESTARCH)))[m
[31m-    TARGET_ARCH= -D__MIPSEL__=1[m
[31m-  endif[m
[31m-  TARGET_LJARCH= mips[m
[31m-else[m
[31m-  $(error Unsupported target architecture)[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-[m
[31m-ifneq (,$(findstring LJ_TARGET_PS3 1,$(TARGET_TESTARCH)))[m
[31m-  TARGET_SYS= PS3[m
[31m-  TARGET_ARCH+= -D__CELLOS_LV2__[m
[31m-  TARGET_XCFLAGS+= -DLUAJIT_USE_SYSMALLOC[m
[31m-  TARGET_XLIBS+= -lpthread[m
[31m-endif[m
[31m-[m
[31m-TARGET_XCFLAGS+= $(CCOPT_$(TARGET_LJARCH))[m
[31m-TARGET_ARCH+= $(patsubst %,-DLUAJIT_TARGET=LUAJIT_ARCH_%,$(TARGET_LJARCH))[m
[31m-[m
[31m-ifneq (,$(PREFIX))[m
[31m-ifneq (/usr/local,$(PREFIX))[m
[31m-  TARGET_XCFLAGS+= -DLUA_ROOT=\"$(PREFIX)\"[m
[31m-  ifneq (/usr,$(PREFIX))[m
[31m-    TARGET_DYNXLDOPTS= -Wl,-rpath,$(TARGET_LIBPATH)[m
[31m-  endif[m
[31m-endif[m
[31m-endif[m
[31m-ifneq (,$(MULTILIB))[m
[31m-  TARGET_XCFLAGS+= -DLUA_MULTILIB=\"$(MULTILIB)\"[m
[31m-endif[m
[31m-ifneq (,$(LMULTILIB))[m
[31m-  TARGET_XCFLAGS+= -DLUA_LMULTILIB=\"$(LMULTILIB)\"[m
[31m-endif[m
[31m-[m
[31m-##############################################################################[m
[31m-# Target system detection.[m
[31m-##############################################################################[m
[31m-[m
[31m-TARGET_SYS?= $(HOST_SYS)[m
[31m-ifeq (Windows,$(TARGET_SYS))[m
[31m-  TARGET_STRIP+= --strip-unneeded[m
[31m-  TARGET_XSHLDFLAGS= -shared[m
[31m-  TARGET_DYNXLDOPTS=[m
[31m-else[m
[31m-ifeq (,$(shell $(TARGET_CC) -o /dev/null -c -x c /dev/null -fno-stack-protector 2>/dev/null || echo 1))[m
[31m-  TARGET_XCFLAGS+= -fno-stack-protector[m
[31m-endif[m
[31m-ifeq (Darwin,$(TARGET_SYS))[m
[31m-  ifeq (,$(MACOSX_DEPLOYMENT_TARGET))[m
[31m-    export MACOSX_DEPLOYMENT_TARGET=10.4[m
[31m-  endif[m
[31m-  TARGET_STRIP+= -x[m
[31m-  TARGET_AR+= 2>/dev/null[m
[31m-  TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC[m
[31m-  TARGET_DYNXLDOPTS=[m
[31m-  TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER)[m
[31m-  ifeq (x64,$(TARGET_LJARCH))[m
[31m-    TARGET_XLDFLAGS+= -pagezero_size 10000 -image_base 100000000[m
[31m-    TARGET_XSHLDFLAGS+= -image_base 7fff04c4a000[m
[31m-  endif[m
[31m-else[m
[31m-ifeq (iOS,$(TARGET_SYS))[m
[31m-  TARGET_STRIP+= -x[m
[31m-  TARGET_AR+= 2>/dev/null[m
[31m-  TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC[m
[31m-  TARGET_DYNXLDOPTS=[m
[31m-  TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER)[m
[31m-  ifeq (arm64,$(TARGET_LJARCH))[m
[31m-    TARGET_XCFLAGS+= -fno-omit-frame-pointer[m
[31m-  endif[m
[31m-else[m
[31m-  ifneq (SunOS,$(TARGET_SYS))[m
[31m-    ifneq (PS3,$(TARGET_SYS))[m
[31m-      TARGET_XLDFLAGS+= -Wl,-E[m
[31m-    endif[m
[31m-  endif[m
[31m-  ifeq (Linux,$(TARGET_SYS))[m
[31m-    TARGET_XLIBS+= -ldl[m
[31m-  endif[m
[31m-  ifeq (GNU/kFreeBSD,$(TARGET_SYS))[m
[31m-    TARGET_XLIBS+= -ldl[m
[31m-  endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-[m
[31m-ifneq ($(HOST_SYS),$(TARGET_SYS))[m
[31m-  ifeq (Windows,$(TARGET_SYS))[m
[31m-    HOST_XCFLAGS+= -malign-double -DLUAJIT_OS=LUAJIT_OS_WINDOWS[m
[31m-  else[m
[31m-  ifeq (Linux,$(TARGET_SYS))[m
[31m-    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_LINUX[m
[31m-  else[m
[31m-  ifeq (Darwin,$(TARGET_SYS))[m
[31m-    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX[m
[31m-  else[m
[31m-  ifeq (iOS,$(TARGET_SYS))[m
[31m-    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX[m
[31m-  else[m
[31m-    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OTHER[m
[31m-  endif[m
[31m-  endif[m
[31m-  endif[m
[31m-  endif[m
[31m-endif[m
[31m-[m
[31m-ifneq (,$(CCDEBUG))[m
[31m-  TARGET_STRIP= @:[m
[31m-endif[m
[31m-[m
[31m-##############################################################################[m
[31m-# Files and pathnames.[m
[31m-##############################################################################[m
[31m-[m
[31m-MINILUA_O= host/minilua.o[m
[31m-MINILUA_LIBS= -lm[m
[31m-MINILUA_T= host/minilua[m
[31m-MINILUA_X= $(MINILUA_T)[m
[31m-[m
[31m-ifeq (,$(HOST_LUA))[m
[31m-  HOST_LUA= $(MINILUA_X)[m
[31m-  DASM_DEP= $(MINILUA_T)[m
[31m-endif[m
[31m-[m
[31m-DASM_DIR= ../dynasm[m
[31m-DASM= $(HOST_LUA) $(DASM_DIR)/dynasm.lua[m
[31m-DASM_XFLAGS=[m
[31m-DASM_AFLAGS=[m
[31m-DASM_ARCH= $(TARGET_LJARCH)[m
[31m-[m
[31m-ifneq (,$(findstring LJ_LE 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D ENDIAN_LE[m
[31m-else[m
[31m-  DASM_AFLAGS+= -D ENDIAN_BE[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_ARCH_BITS 64,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D P64[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_HASJIT 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D JIT[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_HASFFI 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D FFI[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_DUALNUM 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D DUALNUM[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_ARCH_HASFPU 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D FPU[m
[31m-  TARGET_ARCH+= -DLJ_ARCH_HASFPU=1[m
[31m-else[m
[31m-  TARGET_ARCH+= -DLJ_ARCH_HASFPU=0[m
[31m-endif[m
[31m-ifeq (,$(findstring LJ_ABI_SOFTFP 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D HFABI[m
[31m-  TARGET_ARCH+= -DLJ_ABI_SOFTFP=0[m
[31m-else[m
[31m-  TARGET_ARCH+= -DLJ_ABI_SOFTFP=1[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_NO_UNWIND 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D NO_UNWIND[m
[31m-  TARGET_ARCH+= -DLUAJIT_NO_UNWIND[m
[31m-endif[m
[31m-DASM_AFLAGS+= -D VER=$(subst LJ_ARCH_VERSION_,,$(filter LJ_ARCH_VERSION_%,$(subst LJ_ARCH_VERSION ,LJ_ARCH_VERSION_,$(TARGET_TESTARCH))))[m
[31m-ifeq (Windows,$(TARGET_SYS))[m
[31m-  DASM_AFLAGS+= -D WIN[m
[31m-endif[m
[31m-ifeq (x64,$(TARGET_LJARCH))[m
[31m-  ifeq (,$(findstring LJ_FR2 1,$(TARGET_TESTARCH)))[m
[31m-    DASM_ARCH= x86[m
[31m-  endif[m
[31m-else[m
[31m-ifeq (arm,$(TARGET_LJARCH))[m
[31m-  ifeq (iOS,$(TARGET_SYS))[m
[31m-    DASM_AFLAGS+= -D IOS[m
[31m-  endif[m
[31m-else[m
[31m-ifeq (ppc,$(TARGET_LJARCH))[m
[31m-  ifneq (,$(findstring LJ_ARCH_SQRT 1,$(TARGET_TESTARCH)))[m
[31m-    DASM_AFLAGS+= -D SQRT[m
[31m-  endif[m
[31m-  ifneq (,$(findstring LJ_ARCH_ROUND 1,$(TARGET_TESTARCH)))[m
[31m-    DASM_AFLAGS+= -D ROUND[m
[31m-  endif[m
[31m-  ifneq (,$(findstring LJ_ARCH_PPC32ON64 1,$(TARGET_TESTARCH)))[m
[31m-    DASM_AFLAGS+= -D GPR64[m
[31m-  endif[m
[31m-  ifeq (PS3,$(TARGET_SYS))[m
[31m-    DASM_AFLAGS+= -D PPE -D TOC[m
[31m-  endif[m
[31m-  ifneq (,$(findstring LJ_ARCH_PPC64 ,$(TARGET_TESTARCH)))[m
[31m-    DASM_ARCH= ppc64[m
[31m-  endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-[m
[31m-DASM_FLAGS= $(DASM_XFLAGS) $(DASM_AFLAGS)[m
[31m-DASM_DASC= vm_$(DASM_ARCH).dasc[m
[31m-[m
[31m-BUILDVM_O= host/buildvm.o host/buildvm_asm.o host/buildvm_peobj.o \[m
[31m-	   host/buildvm_lib.o host/buildvm_fold.o[m
[31m-BUILDVM_T= host/buildvm[m
[31m-BUILDVM_X= $(BUILDVM_T)[m
[31m-[m
[31m-HOST_O= $(MINILUA_O) $(BUILDVM_O)[m
[31m-HOST_T= $(MINILUA_T) $(BUILDVM_T)[m
[31m-[m
[31m-LJVM_S= lj_vm.S[m
[31m-LJVM_O= lj_vm.o[m
[31m-LJVM_BOUT= $(LJVM_S)[m
[31m-LJVM_MODE= elfasm[m
[31m-[m
[31m-LJLIB_O= lib_base.o lib_math.o lib_bit.o lib_string.o lib_table.o \[m
[31m-	 lib_io.o lib_os.o lib_package.o lib_debug.o lib_jit.o lib_ffi.o[m
[31m-LJLIB_C= $(LJLIB_O:.o=.c)[m
[31m-[m
[31m-LJCORE_O= lj_gc.o lj_err.o lj_char.o lj_bc.o lj_obj.o lj_buf.o \[m
[31m-	  lj_str.o lj_tab.o lj_func.o lj_udata.o lj_meta.o lj_debug.o \[m
[31m-	  lj_state.o lj_dispatch.o lj_vmevent.o lj_vmmath.o lj_strscan.o \[m
[31m-	  lj_strfmt.o lj_strfmt_num.o lj_api.o lj_profile.o \[m
[31m-	  lj_lex.o lj_parse.o lj_bcread.o lj_bcwrite.o lj_load.o \[m
[31m-	  lj_ir.o lj_opt_mem.o lj_opt_fold.o lj_opt_narrow.o \[m
[31m-	  lj_opt_dce.o lj_opt_loop.o lj_opt_split.o lj_opt_sink.o \[m
[31m-	  lj_mcode.o lj_snap.o lj_record.o lj_crecord.o lj_ffrecord.o \[m
[31m-	  lj_asm.o lj_trace.o lj_gdbjit.o \[m
[31m-	  lj_ctype.o lj_cdata.o lj_cconv.o lj_ccall.o lj_ccallback.o \[m
[31m-	  lj_carith.o lj_clib.o lj_cparse.o \[m
[31m-	  lj_lib.o lj_alloc.o lib_aux.o \[m
[31m-	  $(LJLIB_O) lib_init.o[m
[31m-[m
[31m-LJVMCORE_O= $(LJVM_O) $(LJCORE_O)[m
[31m-LJVMCORE_DYNO= $(LJVMCORE_O:.o=_dyn.o)[m
[31m-[m
[31m-LIB_VMDEF= jit/vmdef.lua[m
[31m-LIB_VMDEFP= $(LIB_VMDEF)[m
[31m-[m
[31m-LUAJIT_O= luajit.o[m
[31m-LUAJIT_A= libluajit.a[m
[31m-LUAJIT_SO= libluajit.so[m
[31m-LUAJIT_T= luajit[m
[31m-[m
[31m-ALL_T= $(LUAJIT_T) $(LUAJIT_A) $(LUAJIT_SO) $(HOST_T)[m
[31m-ALL_HDRGEN= lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h \[m
[31m-	    host/buildvm_arch.h[m
[31m-ALL_GEN= $(LJVM_S) $(ALL_HDRGEN) $(LIB_VMDEFP)[m
[31m-WIN_RM= *.obj *.lib *.exp *.dll *.exe *.manifest *.pdb *.ilk[m
[31m-ALL_RM= $(ALL_T) $(ALL_GEN) *.o host/*.o $(WIN_RM)[m
[31m-[m
[31m-##############################################################################[m
[31m-# Build mode handling.[m
[31m-##############################################################################[m
[31m-[m
[31m-# Mixed mode defaults.[m
[31m-TARGET_O= $(LUAJIT_A)[m
[31m-TARGET_T= $(LUAJIT_T) $(LUAJIT_SO)[m
[31m-TARGET_DEP= $(LIB_VMDEF) $(LUAJIT_SO)[m
[31m-[m
[31m-ifeq (Windows,$(TARGET_SYS))[m
[31m-  TARGET_DYNCC= $(STATIC_CC)[m
[31m-  LJVM_MODE= peobj[m
[31m-  LJVM_BOUT= $(LJVM_O)[m
[31m-  LUAJIT_T= luajit.exe[m
[31m-  ifeq (cygwin,$(HOST_MSYS))[m
[31m-    LUAJIT_SO= cyg$(TARGET_DLLNAME)[m
[31m-  else[m
[31m-    LUAJIT_SO= $(TARGET_DLLNAME)[m
[31m-  endif[m
[31m-  # Mixed mode is not supported on Windows. And static mode doesn't work well.[m
[31m-  # C modules cannot be loaded, because they bind to lua51.dll.[m
[31m-  ifneq (static,$(BUILDMODE))[m
[31m-    BUILDMODE= dynamic[m
[31m-    TARGET_XCFLAGS+= -DLUA_BUILD_AS_DLL[m
[31m-  endif[m
[31m-endif[m
[31m-ifeq (Darwin,$(TARGET_SYS))[m
[31m-  LJVM_MODE= machasm[m
[31m-endif[m
[31m-ifeq (iOS,$(TARGET_SYS))[m
[31m-  LJVM_MODE= machasm[m
[31m-endif[m
[31m-ifeq (SunOS,$(TARGET_SYS))[m
[31m-  BUILDMODE= static[m
[31m-endif[m
[31m-ifeq (PS3,$(TARGET_SYS))[m
[31m-  BUILDMODE= static[m
[31m-endif[m
[31m-[m
[31m-ifeq (Windows,$(HOST_SYS))[m
[31m-  MINILUA_T= host/minilua.exe[m
[31m-  BUILDVM_T= host/buildvm.exe[m
[31m-  ifeq (,$(HOST_MSYS))[m
[31m-    MINILUA_X= host\minilua[m
[31m-    BUILDVM_X= host\buildvm[m
[31m-    ALL_RM:= $(subst /,\,$(ALL_RM))[m
[31m-  endif[m
[31m-endif[m
[31m-[m
[31m-ifeq (static,$(BUILDMODE))[m
[31m-  TARGET_DYNCC= @:[m
[31m-  TARGET_T= $(LUAJIT_T)[m
[31m-  TARGET_DEP= $(LIB_VMDEF)[m
[31m-else[m
[31m-ifeq (dynamic,$(BUILDMODE))[m
[31m-  ifneq (Windows,$(TARGET_SYS))[m
[31m-    TARGET_CC= $(DYNAMIC_CC)[m
[31m-  endif[m
[31m-  TARGET_DYNCC= @:[m
[31m-  LJVMCORE_DYNO= $(LJVMCORE_O)[m
[31m-  TARGET_O= $(LUAJIT_SO)[m
[31m-  TARGET_XLDFLAGS+= $(TARGET_DYNXLDOPTS)[m
[31m-else[m
[31m-ifeq (Darwin,$(TARGET_SYS))[m
[31m-  TARGET_DYNCC= @:[m
[31m-  LJVMCORE_DYNO= $(LJVMCORE_O)[m
[31m-endif[m
[31m-ifeq (iOS,$(TARGET_SYS))[m
[31m-  TARGET_DYNCC= @:[m
[31m-  LJVMCORE_DYNO= $(LJVMCORE_O)[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-[m
[31m-Q= @[m
[31m-E= @echo[m
[31m-#Q=[m
[31m-#E= @:[m
[31m-[m
[31m-##############################################################################[m
[31m-# Make targets.[m
[31m-##############################################################################[m
[31m-[m
[31m-default all:	$(TARGET_T)[m
[31m-[m
[31m-amalg:[m
[31m-	@grep "^[+|]" ljamalg.c[m
[31m-	$(MAKE) all "LJCORE_O=ljamalg.o"[m
[31m-[m
[31m-clean:[m
[31m-	$(HOST_RM) $(ALL_RM)[m
[31m-[m
[31m-libbc:[m
[31m-	./$(LUAJIT_T) host/genlibbc.lua -o host/buildvm_libbc.h $(LJLIB_C)[m
[31m-	$(MAKE) all[m
[31m-[m
[31m-depend:[m
[31m-	@for file in $(ALL_HDRGEN); do \[m
[31m-	  test -f $$file || touch $$file; \[m
[31m-	  done[m
[31m-	@$(HOST_CC) $(HOST_ACFLAGS) -MM *.c host/*.c | \[m
[31m-	  sed -e "s| [^ ]*/dasm_\S*\.h||g" \[m
[31m-	      -e "s|^\([^l ]\)|host/\1|" \[m
[31m-	      -e "s| lj_target_\S*\.h| lj_target_*.h|g" \[m
[31m-	      -e "s| lj_emit_\S*\.h| lj_emit_*.h|g" \[m
[31m-	      -e "s| lj_asm_\S*\.h| lj_asm_*.h|g" >Makefile.dep[m
[31m-	@for file in $(ALL_HDRGEN); do \[m
[31m-	  test -s $$file || $(HOST_RM) $$file; \[m
[31m-	  done[m
[31m-[m
[31m-.PHONY: default all amalg clean libbc depend[m
[31m-[m
[31m-##############################################################################[m
[31m-# Rules for generated files.[m
[31m-##############################################################################[m
[31m-[m
[31m-$(MINILUA_T): $(MINILUA_O)[m
[31m-	$(E) "HOSTLINK  $@"[m
[31m-	$(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(MINILUA_O) $(MINILUA_LIBS) $(HOST_ALIBS)[m
[31m-[m
[31m-host/buildvm_arch.h: $(DASM_DASC) $(DASM_DEP) $(DASM_DIR)/*.lua[m
[31m-	$(E) "DYNASM    $@"[m
[31m-	$(Q)$(DASM) $(DASM_FLAGS) -o $@ $(DASM_DASC)[m
[31m-[m
[31m-host/buildvm.o: $(DASM_DIR)/dasm_*.h[m
[31m-[m
[31m-$(BUILDVM_T): $(BUILDVM_O)[m
[31m-	$(E) "HOSTLINK  $@"[m
[31m-	$(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(BUILDVM_O) $(HOST_ALIBS)[m
[31m-[m
[31m-$(LJVM_BOUT): $(BUILDVM_T)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m $(LJVM_MODE) -o $@[m
[31m-[m
[31m-lj_bcdef.h: $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m bcdef -o $@ $(LJLIB_C)[m
[31m-[m
[31m-lj_ffdef.h: $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m ffdef -o $@ $(LJLIB_C)[m
[31m-[m
[31m-lj_libdef.h: $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m libdef -o $@ $(LJLIB_C)[m
[31m-[m
[31m-lj_recdef.h: $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m recdef -o $@ $(LJLIB_C)[m
[31m-[m
[31m-$(LIB_VMDEF): $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m vmdef -o $(LIB_VMDEFP) $(LJLIB_C)[m
[31m-[m
[31m-lj_folddef.h: $(BUILDVM_T) lj_opt_fold.c[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m folddef -o $@ lj_opt_fold.c[m
[31m-[m
[31m-##############################################################################[m
[31m-# Object file rules.[m
[31m-##############################################################################[m
[31m-[m
[31m-%.o: %.c[m
[31m-	$(E) "CC        $@"[m
[31m-	$(Q)$(TARGET_DYNCC) $(TARGET_ACFLAGS) -c -o $(@:.o=_dyn.o) $<[m
[31m-	$(Q)$(TARGET_CC) $(TARGET_ACFLAGS) -c -o $@ $<[m
[31m-[m
[31m-%.o: %.S[m
[31m-	$(E) "ASM       $@"[m
[31m-	$(Q)$(TARGET_DYNCC) $(TARGET_ASFLAGS) -c -o $(@:.o=_dyn.o) $<[m
[31m-	$(Q)$(TARGET_CC) $(TARGET_ASFLAGS) -c -o $@ $<[m
[31m-[m
[31m-$(LUAJIT_O):[m
[31m-	$(E) "CC        $@"[m
[31m-	$(Q)$(TARGET_STCC) $(TARGET_ACFLAGS) -c -o $@ $<[m
[31m-[m
[31m-$(HOST_O): %.o: %.c[m
[31m-	$(E) "HOSTCC    $@"[m
[31m-	$(Q)$(HOST_CC) $(HOST_ACFLAGS) -c -o $@ $<[m
[31m-[m
[31m-include Makefile.dep[m
[31m-[m
[31m-##############################################################################[m
[31m-# Target file rules.[m
[31m-##############################################################################[m
[31m-[m
[31m-$(LUAJIT_A): $(LJVMCORE_O)[m
[31m-	$(E) "AR        $@"[m
[31m-	$(Q)$(TARGET_AR) $@ $(LJVMCORE_O)[m
[31m-[m
[31m-# The dependency on _O, but linking with _DYNO is intentional.[m
[31m-$(LUAJIT_SO): $(LJVMCORE_O)[m
[31m-	$(E) "DYNLINK   $@"[m
[31m-	$(Q)$(TARGET_LD) $(TARGET_ASHLDFLAGS) -o $@ $(LJVMCORE_DYNO) $(TARGET_ALIBS)[m
[31m-	$(Q)$(TARGET_STRIP) $@[m
[31m-[m
[31m-$(LUAJIT_T): $(TARGET_O) $(LUAJIT_O) $(TARGET_DEP)[m
[31m-	$(E) "LINK      $@"[m
[31m-	$(Q)$(TARGET_LD) $(TARGET_ALDFLAGS) -o $@ $(LUAJIT_O) $(TARGET_O) $(TARGET_ALIBS)[m
[31m-	$(Q)$(TARGET_STRIP) $@[m
[31m-	$(E) "OK        Successfully built LuaJIT"[m
[31m-[m
[31m-##############################################################################[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/Makefile.dep b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/Makefile.dep[m
[1mdeleted file mode 100644[m
[1mindex 2c329f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/Makefile.dep[m
[1m+++ /dev/null[m
[36m@@ -1,246 +0,0 @@[m
[31m-lib_aux.o: lib_aux.c lua.h luaconf.h lauxlib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_err.h lj_errmsg.h lj_state.h lj_trace.h lj_jit.h lj_ir.h \[m
[31m- lj_dispatch.h lj_bc.h lj_traceerr.h lj_lib.h lj_alloc.h[m
[31m-lib_base.o: lib_base.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h \[m
[31m- lj_tab.h lj_meta.h lj_state.h lj_ctype.h lj_cconv.h lj_bc.h lj_ff.h \[m
[31m- lj_ffdef.h lj_dispatch.h lj_jit.h lj_ir.h lj_char.h lj_strscan.h \[m
[31m- lj_strfmt.h lj_lib.h lj_libdef.h[m
[31m-lib_bit.o: lib_bit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_strscan.h \[m
[31m- lj_strfmt.h lj_ctype.h lj_cdata.h lj_cconv.h lj_carith.h lj_ff.h \[m
[31m- lj_ffdef.h lj_lib.h lj_libdef.h[m
[31m-lib_debug.o: lib_debug.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_lib.h \[m
[31m- lj_libdef.h[m
[31m-lib_ffi.o: lib_ffi.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_meta.h \[m
[31m- lj_ctype.h lj_cparse.h lj_cdata.h lj_cconv.h lj_carith.h lj_ccall.h \[m
[31m- lj_ccallback.h lj_clib.h lj_strfmt.h lj_ff.h lj_ffdef.h lj_lib.h \[m
[31m- lj_libdef.h[m
[31m-lib_init.o: lib_init.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h[m
[31m-lib_io.o: lib_io.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_state.h \[m
[31m- lj_strfmt.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h[m
[31m-lib_jit.o: lib_jit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h \[m
[31m- lj_state.h lj_bc.h lj_ctype.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h \[m
[31m- lj_target.h lj_target_*.h lj_trace.h lj_dispatch.h lj_traceerr.h \[m
[31m- lj_vm.h lj_vmevent.h lj_lib.h luajit.h lj_libdef.h[m
[31m-lib_math.o: lib_math.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_lib.h lj_vm.h lj_libdef.h[m
[31m-lib_os.o: lib_os.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_lib.h \[m
[31m- lj_libdef.h[m
[31m-lib_package.o: lib_package.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_err.h lj_errmsg.h lj_lib.h[m
[31m-lib_string.o: lib_string.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h \[m
[31m- lj_tab.h lj_meta.h lj_state.h lj_ff.h lj_ffdef.h lj_bcdump.h lj_lex.h \[m
[31m- lj_char.h lj_strfmt.h lj_lib.h lj_libdef.h[m
[31m-lib_table.o: lib_table.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h \[m
[31m- lj_tab.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h[m
[31m-lj_alloc.o: lj_alloc.c lj_def.h lua.h luaconf.h lj_arch.h lj_alloc.h[m
[31m-lj_api.o: lj_api.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_func.h lj_udata.h \[m
[31m- lj_meta.h lj_state.h lj_bc.h lj_frame.h lj_trace.h lj_jit.h lj_ir.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_vm.h lj_strscan.h lj_strfmt.h[m
[31m-lj_asm.o: lj_asm.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h lj_ir.h lj_jit.h \[m
[31m- lj_ircall.h lj_iropt.h lj_mcode.h lj_trace.h lj_dispatch.h lj_traceerr.h \[m
[31m- lj_snap.h lj_asm.h lj_vm.h lj_target.h lj_target_*.h lj_emit_*.h \[m
[31m- lj_asm_*.h[m
[31m-lj_bc.o: lj_bc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_bc.h \[m
[31m- lj_bcdef.h[m
[31m-lj_bcread.o: lj_bcread.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_bc.h \[m
[31m- lj_ctype.h lj_cdata.h lualib.h lj_lex.h lj_bcdump.h lj_state.h \[m
[31m- lj_strfmt.h[m
[31m-lj_bcwrite.o: lj_bcwrite.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_buf.h lj_str.h lj_bc.h lj_ctype.h lj_dispatch.h lj_jit.h \[m
[31m- lj_ir.h lj_strfmt.h lj_bcdump.h lj_lex.h lj_err.h lj_errmsg.h lj_vm.h[m
[31m-lj_buf.o: lj_buf.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_strfmt.h[m
[31m-lj_carith.o: lj_carith.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_meta.h lj_ir.h lj_ctype.h \[m
[31m- lj_cconv.h lj_cdata.h lj_carith.h lj_strscan.h[m
[31m-lj_ccall.o: lj_ccall.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_cconv.h lj_cdata.h \[m
[31m- lj_ccall.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_bc.h \[m
[31m- lj_traceerr.h[m
[31m-lj_ccallback.o: lj_ccallback.c lj_obj.h lua.h luaconf.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_state.h lj_frame.h \[m
[31m- lj_bc.h lj_ctype.h lj_cconv.h lj_ccall.h lj_ccallback.h lj_target.h \[m
[31m- lj_target_*.h lj_mcode.h lj_jit.h lj_ir.h lj_trace.h lj_dispatch.h \[m
[31m- lj_traceerr.h lj_vm.h[m
[31m-lj_cconv.o: lj_cconv.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_gc.h lj_cdata.h lj_cconv.h \[m
[31m- lj_ccallback.h[m
[31m-lj_cdata.o: lj_cdata.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_cconv.h lj_cdata.h[m
[31m-lj_char.o: lj_char.c lj_char.h lj_def.h lua.h luaconf.h[m
[31m-lj_clib.o: lj_clib.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_tab.h lj_str.h lj_udata.h lj_ctype.h lj_cconv.h \[m
[31m- lj_cdata.h lj_clib.h lj_strfmt.h[m
[31m-lj_cparse.o: lj_cparse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_ctype.h lj_cparse.h \[m
[31m- lj_frame.h lj_bc.h lj_vm.h lj_char.h lj_strscan.h lj_strfmt.h[m
[31m-lj_crecord.o: lj_crecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h lj_gc.h \[m
[31m- lj_cdata.h lj_cparse.h lj_cconv.h lj_carith.h lj_clib.h lj_ccall.h \[m
[31m- lj_ff.h lj_ffdef.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_record.h lj_ffrecord.h lj_snap.h \[m
[31m- lj_crecord.h lj_strfmt.h[m
[31m-lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_strfmt.h lj_ctype.h \[m
[31m- lj_ccallback.h lj_buf.h[m
[31m-lj_debug.o: lj_debug.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_debug.h lj_buf.h lj_gc.h lj_str.h lj_tab.h \[m
[31m- lj_state.h lj_frame.h lj_bc.h lj_strfmt.h lj_jit.h lj_ir.h[m
[31m-lj_dispatch.o: lj_dispatch.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_func.h lj_tab.h \[m
[31m- lj_meta.h lj_debug.h lj_state.h lj_frame.h lj_bc.h lj_ff.h lj_ffdef.h \[m
[31m- lj_strfmt.h lj_jit.h lj_ir.h lj_ccallback.h lj_ctype.h lj_trace.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_profile.h lj_vm.h luajit.h[m
[31m-lj_err.o: lj_err.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_err.h \[m
[31m- lj_errmsg.h lj_debug.h lj_str.h lj_func.h lj_state.h lj_frame.h lj_bc.h \[m
[31m- lj_ff.h lj_ffdef.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h \[m
[31m- lj_traceerr.h lj_vm.h lj_strfmt.h[m
[31m-lj_ffrecord.o: lj_ffrecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ff.h \[m
[31m- lj_ffdef.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_record.h lj_ffrecord.h lj_crecord.h \[m
[31m- lj_vm.h lj_strscan.h lj_strfmt.h lj_recdef.h[m
[31m-lj_func.o: lj_func.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_func.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_bc.h \[m
[31m- lj_traceerr.h lj_vm.h[m
[31m-lj_gc.o: lj_gc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_func.h lj_udata.h \[m
[31m- lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_cdata.h lj_trace.h \[m
[31m- lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h[m
[31m-lj_gdbjit.o: lj_gdbjit.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_frame.h lj_bc.h lj_buf.h \[m
[31m- lj_str.h lj_strfmt.h lj_jit.h lj_ir.h lj_dispatch.h[m
[31m-lj_ir.o: lj_ir.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_buf.h lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h \[m
[31m- lj_trace.h lj_dispatch.h lj_bc.h lj_traceerr.h lj_ctype.h lj_cdata.h \[m
[31m- lj_carith.h lj_vm.h lj_strscan.h lj_strfmt.h lj_lib.h[m
[31m-lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_ctype.h lj_cdata.h \[m
[31m- lualib.h lj_state.h lj_lex.h lj_parse.h lj_char.h lj_strscan.h \[m
[31m- lj_strfmt.h[m
[31m-lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \[m
[31m- lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_strscan.h lj_strfmt.h lj_lex.h \[m
[31m- lj_bcdump.h lj_lib.h[m
[31m-lj_load.o: lj_load.c lua.h luaconf.h lauxlib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_func.h \[m
[31m- lj_frame.h lj_bc.h lj_vm.h lj_lex.h lj_bcdump.h lj_parse.h[m
[31m-lj_mcode.o: lj_mcode.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_jit.h lj_ir.h lj_mcode.h lj_trace.h \[m
[31m- lj_dispatch.h lj_bc.h lj_traceerr.h lj_vm.h[m
[31m-lj_meta.o: lj_meta.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_meta.h lj_frame.h \[m
[31m- lj_bc.h lj_vm.h lj_strscan.h lj_strfmt.h lj_lib.h[m
[31m-lj_obj.o: lj_obj.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h[m
[31m-lj_opt_dce.o: lj_opt_dce.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_ir.h lj_jit.h lj_iropt.h[m
[31m-lj_opt_fold.o: lj_opt_fold.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_buf.h lj_gc.h lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_ircall.h \[m
[31m- lj_iropt.h lj_trace.h lj_dispatch.h lj_bc.h lj_traceerr.h lj_ctype.h \[m
[31m- lj_carith.h lj_vm.h lj_strscan.h lj_strfmt.h lj_folddef.h[m
[31m-lj_opt_loop.o: lj_opt_loop.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_ir.h lj_jit.h \[m
[31m- lj_iropt.h lj_trace.h lj_dispatch.h lj_bc.h lj_traceerr.h lj_snap.h \[m
[31m- lj_vm.h[m
[31m-lj_opt_mem.o: lj_opt_mem.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_ircall.h[m
[31m-lj_opt_narrow.o: lj_opt_narrow.c lj_obj.h lua.h luaconf.h lj_def.h \[m
[31m- lj_arch.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \[m
[31m- lj_traceerr.h lj_vm.h lj_strscan.h[m
[31m-lj_opt_sink.o: lj_opt_sink.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_ir.h lj_jit.h lj_iropt.h lj_target.h lj_target_*.h[m
[31m-lj_opt_split.o: lj_opt_split.c lj_obj.h lua.h luaconf.h lj_def.h \[m
[31m- lj_arch.h lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_ir.h \[m
[31m- lj_jit.h lj_ircall.h lj_iropt.h lj_vm.h[m
[31m-lj_parse.o: lj_parse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_buf.h lj_str.h lj_tab.h \[m
[31m- lj_func.h lj_state.h lj_bc.h lj_ctype.h lj_strfmt.h lj_lex.h lj_parse.h \[m
[31m- lj_vm.h lj_vmevent.h[m
[31m-lj_profile.o: lj_profile.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_buf.h lj_gc.h lj_str.h lj_frame.h lj_bc.h lj_debug.h lj_dispatch.h \[m
[31m- lj_jit.h lj_ir.h lj_trace.h lj_traceerr.h lj_profile.h luajit.h[m
[31m-lj_record.o: lj_record.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_meta.h lj_frame.h lj_bc.h \[m
[31m- lj_ctype.h lj_gc.h lj_ff.h lj_ffdef.h lj_debug.h lj_ir.h lj_jit.h \[m
[31m- lj_ircall.h lj_iropt.h lj_trace.h lj_dispatch.h lj_traceerr.h \[m
[31m- lj_record.h lj_ffrecord.h lj_snap.h lj_vm.h[m
[31m-lj_snap.o: lj_snap.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_tab.h lj_state.h lj_frame.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h \[m
[31m- lj_trace.h lj_dispatch.h lj_traceerr.h lj_snap.h lj_target.h \[m
[31m- lj_target_*.h lj_ctype.h lj_cdata.h[m
[31m-lj_state.o: lj_state.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_func.h \[m
[31m- lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_trace.h lj_jit.h \[m
[31m- lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h lj_lex.h lj_alloc.h luajit.h[m
[31m-lj_str.o: lj_str.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_str.h lj_char.h[m
[31m-lj_strfmt.o: lj_strfmt.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_buf.h lj_gc.h lj_str.h lj_state.h lj_char.h lj_strfmt.h[m
[31m-lj_strfmt_num.o: lj_strfmt_num.c lj_obj.h lua.h luaconf.h lj_def.h \[m
[31m- lj_arch.h lj_buf.h lj_gc.h lj_str.h lj_strfmt.h[m
[31m-lj_strscan.o: lj_strscan.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_char.h lj_strscan.h[m
[31m-lj_tab.o: lj_tab.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_tab.h[m
[31m-lj_trace.o: lj_trace.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_frame.h lj_bc.h \[m
[31m- lj_state.h lj_ir.h lj_jit.h lj_iropt.h lj_mcode.h lj_trace.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_snap.h lj_gdbjit.h lj_record.h lj_asm.h \[m
[31m- lj_vm.h lj_vmevent.h lj_target.h lj_target_*.h[m
[31m-lj_udata.o: lj_udata.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_udata.h[m
[31m-lj_vmevent.o: lj_vmevent.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_str.h lj_tab.h lj_state.h lj_dispatch.h lj_bc.h lj_jit.h lj_ir.h \[m
[31m- lj_vm.h lj_vmevent.h[m
[31m-lj_vmmath.o: lj_vmmath.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_ir.h lj_vm.h[m
[31m-ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h \[m
[31m- lj_func.h lj_udata.h lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h \[m
[31m- lj_cdata.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h \[m
[31m- lj_vm.h lj_err.c lj_debug.h lj_ff.h lj_ffdef.h lj_strfmt.h lj_char.c \[m
[31m- lj_char.h lj_bc.c lj_bcdef.h lj_obj.c lj_buf.c lj_str.c lj_tab.c \[m
[31m- lj_func.c lj_udata.c lj_meta.c lj_strscan.h lj_lib.h lj_debug.c \[m
[31m- lj_state.c lj_lex.h lj_alloc.h luajit.h lj_dispatch.c lj_ccallback.h \[m
[31m- lj_profile.h lj_vmevent.c lj_vmevent.h lj_vmmath.c lj_strscan.c \[m
[31m- lj_strfmt.c lj_api.c lj_profile.c lj_lex.c lualib.h lj_parse.h \[m
[31m- lj_parse.c lj_bcread.c lj_bcdump.h lj_bcwrite.c lj_load.c lj_ctype.c \[m
[31m- lj_cdata.c lj_cconv.h lj_cconv.c lj_ccall.c lj_ccall.h lj_ccallback.c \[m
[31m- lj_target.h lj_target_*.h lj_mcode.h lj_carith.c lj_carith.h lj_clib.c \[m
[31m- lj_clib.h lj_cparse.c lj_cparse.h lj_lib.c lj_ir.c lj_ircall.h \[m
[31m- lj_iropt.h lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c \[m
[31m- lj_opt_dce.c lj_opt_loop.c lj_snap.h lj_opt_split.c lj_opt_sink.c \[m
[31m- lj_mcode.c lj_snap.c lj_record.c lj_record.h lj_ffrecord.h lj_crecord.c \[m
[31m- lj_crecord.h lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h \[m
[31m- lj_asm_*.h lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c \[m
[31m- lib_base.c lj_libdef.h lib_math.c lib_string.c lib_table.c lib_io.c \[m
[31m- lib_os.c lib_package.c lib_debug.c lib_bit.c lib_jit.c lib_ffi.c \[m
[31m- lib_init.c[m
[31m-luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h[m
[31m-host/buildvm.o: host/buildvm.c host/buildvm.h lj_def.h lua.h luaconf.h \[m
[31m- lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_gc.h lj_obj.h lj_bc.h lj_ir.h \[m
[31m- lj_ircall.h lj_ir.h lj_jit.h lj_frame.h lj_bc.h lj_dispatch.h lj_ctype.h \[m
[31m- lj_gc.h lj_ccall.h lj_ctype.h luajit.h \[m
[31m- host/buildvm_arch.h lj_traceerr.h[m
[31m-host/buildvm_asm.o: host/buildvm_asm.c host/buildvm.h lj_def.h lua.h luaconf.h \[m
[31m- lj_arch.h lj_bc.h lj_def.h lj_arch.h[m
[31m-host/buildvm_fold.o: host/buildvm_fold.c host/buildvm.h lj_def.h lua.h \[m
[31m- luaconf.h lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_ir.h lj_obj.h[m
[31m-host/buildvm_lib.o: host/buildvm_lib.c host/buildvm.h lj_def.h lua.h luaconf.h \[m
[31m- lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_bc.h lj_lib.h lj_obj.h \[m
[31m- host/buildvm_libbc.h[m
[31m-host/buildvm_peobj.o: host/buildvm_peobj.c host/buildvm.h lj_def.h lua.h \[m
[31m- luaconf.h lj_arch.h lj_bc.h lj_def.h lj_arch.h[m
[31m-host/minilua.o: host/minilua.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 762ac2a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-minilua[m
[31m-buildvm[m
[31m-buildvm_arch.h[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/README[m
[1mdeleted file mode 100644[m
[1mindex abfcdaa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/README[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-The files in this directory are only used during the build process of LuaJIT.[m
[31m-For cross-compilation, they must be executed on the host, not on the target.[m
[31m-[m
[31m-These files should NOT be installed![m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.c[m
[1mdeleted file mode 100644[m
[1mindex 6d9e09e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.c[m
[1m+++ /dev/null[m
[36m@@ -1,518 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** This is a tool to build the hand-tuned assembler code required for[m
[31m-** LuaJIT's bytecode interpreter. It supports a variety of output formats[m
[31m-** to feed different toolchains (see usage() below).[m
[31m-**[m
[31m-** This tool is not particularly optimized because it's only used while[m
[31m-** _building_ LuaJIT. There's no point in distributing or installing it.[m
[31m-** Only the object code generated by this tool is linked into LuaJIT.[m
[31m-**[m
[31m-** Caveat: some memory is not free'd, error handling is lazy.[m
[31m-** It's a one-shot tool -- any effort fixing this would be wasted.[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#endif[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-#if defined(_WIN32)[m
[31m-#include <fcntl.h>[m
[31m-#include <io.h>[m
[31m-#endif[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* DynASM glue definitions. */[m
[31m-#define Dst		ctx[m
[31m-#define Dst_DECL	BuildCtx *ctx[m
[31m-#define Dst_REF		(ctx->D)[m
[31m-#define DASM_CHECKS	1[m
[31m-[m
[31m-#include "../dynasm/dasm_proto.h"[m
[31m-[m
[31m-/* Glue macros for DynASM. */[m
[31m-static int collect_reloc(BuildCtx *ctx, uint8_t *addr, int idx, int type);[m
[31m-[m
[31m-#define DASM_EXTERN(ctx, addr, idx, type) \[m
[31m-  collect_reloc(ctx, addr, idx, type)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Avoid trouble if cross-compiling for an x86 target. Speed doesn't matter. */[m
[31m-#define DASM_ALIGNED_WRITES	1[m
[31m-[m
[31m-/* Embed architecture-specific DynASM encoder. */[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#include "../dynasm/dasm_x86.h"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#include "../dynasm/dasm_arm.h"[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#include "../dynasm/dasm_arm64.h"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#include "../dynasm/dasm_ppc.h"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#include "../dynasm/dasm_mips.h"[m
[31m-#else[m
[31m-#error "No support for this architecture (yet)"[m
[31m-#endif[m
[31m-[m
[31m-/* Embed generated architecture-specific backend. */[m
[31m-#include "buildvm_arch.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-void owrite(BuildCtx *ctx, const void *ptr, size_t sz)[m
[31m-{[m
[31m-  if (fwrite(ptr, 1, sz, ctx->fp) != sz) {[m
[31m-    fprintf(stderr, "Error: cannot write to output file: %s\n",[m
[31m-	    strerror(errno));[m
[31m-    exit(1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Emit code as raw bytes. Only used for DynASM debugging. */[m
[31m-static void emit_raw(BuildCtx *ctx)[m
[31m-{[m
[31m-  owrite(ctx, ctx->code, ctx->codesz);[m
[31m-}[m
[31m-[m
[31m-/* -- Build machine code -------------------------------------------------- */[m
[31m-[m
[31m-static const char *sym_decorate(BuildCtx *ctx,[m
[31m-				const char *prefix, const char *suffix)[m
[31m-{[m
[31m-  char name[256];[m
[31m-  char *p;[m
[31m-#if LJ_64[m
[31m-  const char *symprefix = ctx->mode == BUILD_machasm ? "_" : "";[m
[31m-#elif LJ_TARGET_XBOX360[m
[31m-  const char *symprefix = "";[m
[31m-#else[m
[31m-  const char *symprefix = ctx->mode != BUILD_elfasm ? "_" : "";[m
[31m-#endif[m
[31m-  sprintf(name, "%s%s%s", symprefix, prefix, suffix);[m
[31m-  p = strchr(name, '@');[m
[31m-  if (p) {[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    if (!LJ_64 && (ctx->mode == BUILD_coffasm || ctx->mode == BUILD_peobj))[m
[31m-      name[0] = '@';[m
[31m-    else[m
[31m-      *p = '\0';[m
[31m-#elif LJ_TARGET_PPC && !LJ_TARGET_CONSOLE[m
[31m-    /* Keep @plt etc. */[m
[31m-#else[m
[31m-    *p = '\0';[m
[31m-#endif[m
[31m-  }[m
[31m-  p = (char *)malloc(strlen(name)+1);  /* MSVC doesn't like strdup. */[m
[31m-  strcpy(p, name);[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-#define NRELOCSYM	(sizeof(extnames)/sizeof(extnames[0])-1)[m
[31m-[m
[31m-static int relocmap[NRELOCSYM];[m
[31m-[m
[31m-/* Collect external relocations. */[m
[31m-static int collect_reloc(BuildCtx *ctx, uint8_t *addr, int idx, int type)[m
[31m-{[m
[31m-  if (ctx->nreloc >= BUILD_MAX_RELOC) {[m
[31m-    fprintf(stderr, "Error: too many relocations, increase BUILD_MAX_RELOC.\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  if (relocmap[idx] < 0) {[m
[31m-    relocmap[idx] = ctx->nrelocsym;[m
[31m-    ctx->relocsym[ctx->nrelocsym] = sym_decorate(ctx, "", extnames[idx]);[m
[31m-    ctx->nrelocsym++;[m
[31m-  }[m
[31m-  ctx->reloc[ctx->nreloc].ofs = (int32_t)(addr - ctx->code);[m
[31m-  ctx->reloc[ctx->nreloc].sym = relocmap[idx];[m
[31m-  ctx->reloc[ctx->nreloc].type = type;[m
[31m-  ctx->nreloc++;[m
[31m-#if LJ_TARGET_XBOX360[m
[31m-  return (int)(ctx->code - addr) + 4;  /* Encode symbol offset of .text. */[m
[31m-#else[m
[31m-  return 0;  /* Encode symbol offset of 0. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Naive insertion sort. Performance doesn't matter here. */[m
[31m-static void sym_insert(BuildCtx *ctx, int32_t ofs,[m
[31m-		       const char *prefix, const char *suffix)[m
[31m-{[m
[31m-  ptrdiff_t i = ctx->nsym++;[m
[31m-  while (i > 0) {[m
[31m-    if (ctx->sym[i-1].ofs <= ofs)[m
[31m-      break;[m
[31m-    ctx->sym[i] = ctx->sym[i-1];[m
[31m-    i--;[m
[31m-  }[m
[31m-  ctx->sym[i].ofs = ofs;[m
[31m-  ctx->sym[i].name = sym_decorate(ctx, prefix, suffix);[m
[31m-}[m
[31m-[m
[31m-/* Build the machine code. */[m
[31m-static int build_code(BuildCtx *ctx)[m
[31m-{[m
[31m-  int status;[m
[31m-  int i;[m
[31m-[m
[31m-  /* Initialize DynASM structures. */[m
[31m-  ctx->nglob = GLOB__MAX;[m
[31m-  ctx->glob = (void **)malloc(ctx->nglob*sizeof(void *));[m
[31m-  memset(ctx->glob, 0, ctx->nglob*sizeof(void *));[m
[31m-  ctx->nreloc = 0;[m
[31m-[m
[31m-  ctx->globnames = globnames;[m
[31m-  ctx->extnames = extnames;[m
[31m-  ctx->relocsym = (const char **)malloc(NRELOCSYM*sizeof(const char *));[m
[31m-  ctx->nrelocsym = 0;[m
[31m-  for (i = 0; i < (int)NRELOCSYM; i++) relocmap[i] = -1;[m
[31m-[m
[31m-  ctx->dasm_ident = DASM_IDENT;[m
[31m-  ctx->dasm_arch = DASM_ARCH;[m
[31m-[m
[31m-  dasm_init(Dst, DASM_MAXSECTION);[m
[31m-  dasm_setupglobal(Dst, ctx->glob, ctx->nglob);[m
[31m-  dasm_setup(Dst, build_actionlist);[m
[31m-[m
[31m-  /* Call arch-specific backend to emit the code. */[m
[31m-  ctx->npc = build_backend(ctx);[m
[31m-[m
[31m-  /* Finalize the code. */[m
[31m-  (void)dasm_checkstep(Dst, -1);[m
[31m-  if ((status = dasm_link(Dst, &ctx->codesz))) return status;[m
[31m-  ctx->code = (uint8_t *)malloc(ctx->codesz);[m
[31m-  if ((status = dasm_encode(Dst, (void *)ctx->code))) return status;[m
[31m-[m
[31m-  /* Allocate symbol table and bytecode offsets. */[m
[31m-  ctx->beginsym = sym_decorate(ctx, "", LABEL_PREFIX "vm_asm_begin");[m
[31m-  ctx->sym = (BuildSym *)malloc((ctx->npc+ctx->nglob+1)*sizeof(BuildSym));[m
[31m-  ctx->nsym = 0;[m
[31m-  ctx->bc_ofs = (int32_t *)malloc(ctx->npc*sizeof(int32_t));[m
[31m-[m
[31m-  /* Collect the opcodes (PC labels). */[m
[31m-  for (i = 0; i < ctx->npc; i++) {[m
[31m-    int32_t ofs = dasm_getpclabel(Dst, i);[m
[31m-    if (ofs < 0) return 0x22000000|i;[m
[31m-    ctx->bc_ofs[i] = ofs;[m
[31m-    if ((LJ_HASJIT ||[m
[31m-	 !(i == BC_JFORI || i == BC_JFORL || i == BC_JITERL || i == BC_JLOOP ||[m
[31m-	   i == BC_IFORL || i == BC_IITERL || i == BC_ILOOP)) &&[m
[31m-	(LJ_HASFFI || i != BC_KCDATA))[m
[31m-      sym_insert(ctx, ofs, LABEL_PREFIX_BC, bc_names[i]);[m
[31m-  }[m
[31m-[m
[31m-  /* Collect the globals (named labels). */[m
[31m-  for (i = 0; i < ctx->nglob; i++) {[m
[31m-    const char *gl = globnames[i];[m
[31m-    int len = (int)strlen(gl);[m
[31m-    if (!ctx->glob[i]) {[m
[31m-      fprintf(stderr, "Error: undefined global %s\n", gl);[m
[31m-      exit(2);[m
[31m-    }[m
[31m-    /* Skip the _Z symbols. */[m
[31m-    if (!(len >= 2 && gl[len-2] == '_' && gl[len-1] == 'Z'))[m
[31m-      sym_insert(ctx, (int32_t)((uint8_t *)(ctx->glob[i]) - ctx->code),[m
[31m-		 LABEL_PREFIX, globnames[i]);[m
[31m-  }[m
[31m-[m
[31m-  /* Close the address range. */[m
[31m-  sym_insert(ctx, (int32_t)ctx->codesz, "", "");[m
[31m-  ctx->nsym--;[m
[31m-[m
[31m-  dasm_free(Dst);[m
[31m-[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Generate VM enums --------------------------------------------------- */[m
[31m-[m
[31m-const char *const bc_names[] = {[m
[31m-#define BCNAME(name, ma, mb, mc, mt)       #name,[m
[31m-BCDEF(BCNAME)[m
[31m-#undef BCNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const ir_names[] = {[m
[31m-#define IRNAME(name, m, m1, m2)	#name,[m
[31m-IRDEF(IRNAME)[m
[31m-#undef IRNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const irt_names[] = {[m
[31m-#define IRTNAME(name, size)	#name,[m
[31m-IRTDEF(IRTNAME)[m
[31m-#undef IRTNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const irfpm_names[] = {[m
[31m-#define FPMNAME(name)		#name,[m
[31m-IRFPMDEF(FPMNAME)[m
[31m-#undef FPMNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const irfield_names[] = {[m
[31m-#define FLNAME(name, ofs)	#name,[m
[31m-IRFLDEF(FLNAME)[m
[31m-#undef FLNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const ircall_names[] = {[m
[31m-#define IRCALLNAME(cond, name, nargs, kind, type, flags)	#name,[m
[31m-IRCALLDEF(IRCALLNAME)[m
[31m-#undef IRCALLNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-static const char *const trace_errors[] = {[m
[31m-#define TREDEF(name, msg)	msg,[m
[31m-#include "lj_traceerr.h"[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-static const char *lower(char *buf, const char *s)[m
[31m-{[m
[31m-  char *p = buf;[m
[31m-  while (*s) {[m
[31m-    *p++ = (*s >= 'A' && *s <= 'Z') ? *s+0x20 : *s;[m
[31m-    s++;[m
[31m-  }[m
[31m-  *p = '\0';[m
[31m-  return buf;[m
[31m-}[m
[31m-[m
[31m-/* Emit C source code for bytecode-related definitions. */[m
[31m-static void emit_bcdef(BuildCtx *ctx)[m
[31m-{[m
[31m-  int i;[m
[31m-  fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n");[m
[31m-  fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_ofs[] = {\n");[m
[31m-  for (i = 0; i < ctx->npc; i++) {[m
[31m-    if (i != 0)[m
[31m-      fprintf(ctx->fp, ",\n");[m
[31m-    fprintf(ctx->fp, "%d", ctx->bc_ofs[i]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit VM definitions as Lua code for debug modules. */[m
[31m-static void emit_vmdef(BuildCtx *ctx)[m
[31m-{[m
[31m-  char buf[80];[m
[31m-  int i;[m
[31m-  fprintf(ctx->fp, "-- This is a generated file. DO NOT EDIT!\n\n");[m
[31m-  fprintf(ctx->fp, "return {\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "bcnames = \"");[m
[31m-  for (i = 0; bc_names[i]; i++) fprintf(ctx->fp, "%-6s", bc_names[i]);[m
[31m-  fprintf(ctx->fp, "\",\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "irnames = \"");[m
[31m-  for (i = 0; ir_names[i]; i++) fprintf(ctx->fp, "%-6s", ir_names[i]);[m
[31m-  fprintf(ctx->fp, "\",\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "irfpm = { [0]=");[m
[31m-  for (i = 0; irfpm_names[i]; i++)[m
[31m-    fprintf(ctx->fp, "\"%s\", ", lower(buf, irfpm_names[i]));[m
[31m-  fprintf(ctx->fp, "},\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "irfield = { [0]=");[m
[31m-  for (i = 0; irfield_names[i]; i++) {[m
[31m-    char *p;[m
[31m-    lower(buf, irfield_names[i]);[m
[31m-    p = strchr(buf, '_');[m
[31m-    if (p) *p = '.';[m
[31m-    fprintf(ctx->fp, "\"%s\", ", buf);[m
[31m-  }[m
[31m-  fprintf(ctx->fp, "},\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "ircall = {\n[0]=");[m
[31m-  for (i = 0; ircall_names[i]; i++)[m
[31m-    fprintf(ctx->fp, "\"%s\",\n", ircall_names[i]);[m
[31m-  fprintf(ctx->fp, "},\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "traceerr = {\n[0]=");[m
[31m-  for (i = 0; trace_errors[i]; i++)[m
[31m-    fprintf(ctx->fp, "\"%s\",\n", trace_errors[i]);[m
[31m-  fprintf(ctx->fp, "},\n\n");[m
[31m-}[m
[31m-[m
[31m-/* -- Argument parsing ---------------------------------------------------- */[m
[31m-[m
[31m-/* Build mode names. */[m
[31m-static const char *const modenames[] = {[m
[31m-#define BUILDNAME(name)		#name,[m
[31m-BUILDDEF(BUILDNAME)[m
[31m-#undef BUILDNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-/* Print usage information and exit. */[m
[31m-static void usage(void)[m
[31m-{[m
[31m-  int i;[m
[31m-  fprintf(stderr, LUAJIT_VERSION " VM builder.\n");[m
[31m-  fprintf(stderr, LUAJIT_COPYRIGHT ", " LUAJIT_URL "\n");[m
[31m-  fprintf(stderr, "Target architecture: " LJ_ARCH_NAME "\n\n");[m
[31m-  fprintf(stderr, "Usage: buildvm -m mode [-o outfile] [infiles...]\n\n");[m
[31m-  fprintf(stderr, "Available modes:\n");[m
[31m-  for (i = 0; i < BUILD__MAX; i++)[m
[31m-    fprintf(stderr, "  %s\n", modenames[i]);[m
[31m-  exit(1);[m
[31m-}[m
[31m-[m
[31m-/* Parse the output mode name. */[m
[31m-static BuildMode parsemode(const char *mode)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; modenames[i]; i++)[m
[31m-    if (!strcmp(mode, modenames[i]))[m
[31m-      return (BuildMode)i;[m
[31m-  usage();[m
[31m-  return (BuildMode)-1;[m
[31m-}[m
[31m-[m
[31m-/* Parse arguments. */[m
[31m-static void parseargs(BuildCtx *ctx, char **argv)[m
[31m-{[m
[31m-  const char *a;[m
[31m-  int i;[m
[31m-  ctx->mode = (BuildMode)-1;[m
[31m-  ctx->outname = "-";[m
[31m-  for (i = 1; (a = argv[i]) != NULL; i++) {[m
[31m-    if (a[0] != '-')[m
[31m-      break;[m
[31m-    switch (a[1]) {[m
[31m-    case '-':[m
[31m-      if (a[2]) goto err;[m
[31m-      i++;[m
[31m-      goto ok;[m
[31m-    case '\0':[m
[31m-      goto ok;[m
[31m-    case 'm':[m
[31m-      i++;[m
[31m-      if (a[2] || argv[i] == NULL) goto err;[m
[31m-      ctx->mode = parsemode(argv[i]);[m
[31m-      break;[m
[31m-    case 'o':[m
[31m-      i++;[m
[31m-      if (a[2] || argv[i] == NULL) goto err;[m
[31m-      ctx->outname = argv[i];[m
[31m-      break;[m
[31m-    default: err:[m
[31m-      usage();[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-ok:[m
[31m-  ctx->args = argv+i;[m
[31m-  if (ctx->mode == (BuildMode)-1) goto err;[m
[31m-}[m
[31m-[m
[31m-int main(int argc, char **argv)[m
[31m-{[m
[31m-  BuildCtx ctx_;[m
[31m-  BuildCtx *ctx = &ctx_;[m
[31m-  int status, binmode;[m
[31m-[m
[31m-  if (sizeof(void *) != 4*LJ_32+8*LJ_64) {[m
[31m-    fprintf(stderr,"Error: pointer size mismatch in cross-build.\n");[m
[31m-    fprintf(stderr,"Try: make HOST_CC=\"gcc -m32\" CROSS=...\n\n");[m
[31m-    return 1;[m
[31m-  }[m
[31m-[m
[31m-  UNUSED(argc);[m
[31m-  parseargs(ctx, argv);[m
[31m-[m
[31m-  if ((status = build_code(ctx))) {[m
[31m-    fprintf(stderr,"Error: DASM error %08x\n", status);[m
[31m-    return 1;[m
[31m-  }[m
[31m-[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_peobj:[m
[31m-  case BUILD_raw:[m
[31m-    binmode = 1;[m
[31m-    break;[m
[31m-  default:[m
[31m-    binmode = 0;[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  if (ctx->outname[0] == '-' && ctx->outname[1] == '\0') {[m
[31m-    ctx->fp = stdout;[m
[31m-#if defined(_WIN32)[m
[31m-    if (binmode)[m
[31m-      _setmode(_fileno(stdout), _O_BINARY);  /* Yuck. */[m
[31m-#endif[m
[31m-  } else if (!(ctx->fp = fopen(ctx->outname, binmode ? "wb" : "w"))) {[m
[31m-    fprintf(stderr, "Error: cannot open output file '%s': %s\n",[m
[31m-	    ctx->outname, strerror(errno));[m
[31m-    exit(1);[m
[31m-  }[m
[31m-[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-  case BUILD_coffasm:[m
[31m-  case BUILD_machasm:[m
[31m-    emit_asm(ctx);[m
[31m-    emit_asm_debug(ctx);[m
[31m-    break;[m
[31m-  case BUILD_peobj:[m
[31m-    emit_peobj(ctx);[m
[31m-    break;[m
[31m-  case BUILD_raw:[m
[31m-    emit_raw(ctx);[m
[31m-    break;[m
[31m-  case BUILD_bcdef:[m
[31m-    emit_bcdef(ctx);[m
[31m-    emit_lib(ctx);[m
[31m-    break;[m
[31m-  case BUILD_vmdef:[m
[31m-    emit_vmdef(ctx);[m
[31m-    emit_lib(ctx);[m
[31m-    fprintf(ctx->fp, "}\n\n");[m
[31m-    break;[m
[31m-  case BUILD_ffdef:[m
[31m-  case BUILD_libdef:[m
[31m-  case BUILD_recdef:[m
[31m-    emit_lib(ctx);[m
[31m-    break;[m
[31m-  case BUILD_folddef:[m
[31m-    emit_fold(ctx);[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  fflush(ctx->fp);[m
[31m-  if (ferror(ctx->fp)) {[m
[31m-    fprintf(stderr, "Error: cannot write to output file: %s\n",[m
[31m-	    strerror(errno));[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  fclose(ctx->fp);[m
[31m-[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.h[m
[1mdeleted file mode 100644[m
[1mindex 90d21b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm.h[m
[1m+++ /dev/null[m
[36m@@ -1,105 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _BUILDVM_H[m
[31m-#define _BUILDVM_H[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-#include <errno.h>[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-/* Hardcoded limits. Increase as needed. */[m
[31m-#define BUILD_MAX_RELOC		200	/* Max. number of relocations. */[m
[31m-#define BUILD_MAX_FOLD		4096	/* Max. number of fold rules. */[m
[31m-[m
[31m-/* Prefix for scanned library definitions. */[m
[31m-#define LIBDEF_PREFIX		"LJLIB_"[m
[31m-[m
[31m-/* Prefix for scanned fold definitions. */[m
[31m-#define FOLDDEF_PREFIX		"LJFOLD"[m
[31m-[m
[31m-/* Prefixes for generated labels. */[m
[31m-#define LABEL_PREFIX		"lj_"[m
[31m-#define LABEL_PREFIX_BC		LABEL_PREFIX "BC_"[m
[31m-#define LABEL_PREFIX_FF		LABEL_PREFIX "ff_"[m
[31m-#define LABEL_PREFIX_CF		LABEL_PREFIX "cf_"[m
[31m-#define LABEL_PREFIX_FFH	LABEL_PREFIX "ffh_"[m
[31m-#define LABEL_PREFIX_LIBCF	LABEL_PREFIX "lib_cf_"[m
[31m-#define LABEL_PREFIX_LIBINIT	LABEL_PREFIX "lib_init_"[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-struct dasm_State;[m
[31m-[m
[31m-/* Build modes. */[m
[31m-#define BUILDDEF(_) \[m
[31m-  _(elfasm) _(coffasm) _(machasm) _(peobj) _(raw) \[m
[31m-  _(bcdef) _(ffdef) _(libdef) _(recdef) _(vmdef) \[m
[31m-  _(folddef)[m
[31m-[m
[31m-typedef enum {[m
[31m-#define BUILDENUM(name)		BUILD_##name,[m
[31m-BUILDDEF(BUILDENUM)[m
[31m-#undef BUILDENUM[m
[31m-  BUILD__MAX[m
[31m-} BuildMode;[m
[31m-[m
[31m-/* Code relocation. */[m
[31m-typedef struct BuildReloc {[m
[31m-  int32_t ofs;[m
[31m-  int sym;[m
[31m-  int type;[m
[31m-} BuildReloc;[m
[31m-[m
[31m-typedef struct BuildSym {[m
[31m-  const char *name;[m
[31m-  int32_t ofs;[m
[31m-} BuildSym;[m
[31m-[m
[31m-/* Build context structure. */[m
[31m-typedef struct BuildCtx {[m
[31m-  /* DynASM state pointer. Should be first member. */[m
[31m-  struct dasm_State *D;[m
[31m-  /* Parsed command line. */[m
[31m-  BuildMode mode;[m
[31m-  FILE *fp;[m
[31m-  const char *outname;[m
[31m-  char **args;[m
[31m-  /* Code and symbols generated by DynASM. */[m
[31m-  uint8_t *code;[m
[31m-  size_t codesz;[m
[31m-  int npc, nglob, nsym, nreloc, nrelocsym;[m
[31m-  void **glob;[m
[31m-  BuildSym *sym;[m
[31m-  const char **relocsym;[m
[31m-  int32_t *bc_ofs;[m
[31m-  const char *beginsym;[m
[31m-  /* Strings generated by DynASM. */[m
[31m-  const char *const *globnames;[m
[31m-  const char *const *extnames;[m
[31m-  const char *dasm_ident;[m
[31m-  const char *dasm_arch;[m
[31m-  /* Relocations. */[m
[31m-  BuildReloc reloc[BUILD_MAX_RELOC];[m
[31m-} BuildCtx;[m
[31m-[m
[31m-extern void owrite(BuildCtx *ctx, const void *ptr, size_t sz);[m
[31m-extern void emit_asm(BuildCtx *ctx);[m
[31m-extern void emit_peobj(BuildCtx *ctx);[m
[31m-extern void emit_lib(BuildCtx *ctx);[m
[31m-extern void emit_fold(BuildCtx *ctx);[m
[31m-[m
[31m-extern const char *const bc_names[];[m
[31m-extern const char *const ir_names[];[m
[31m-extern const char *const irt_names[];[m
[31m-extern const char *const irfpm_names[];[m
[31m-extern const char *const irfield_names[];[m
[31m-extern const char *const ircall_names[];[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_asm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_asm.c[m
[1mdeleted file mode 100644[m
[1mindex 28419c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_asm.c[m
[1m+++ /dev/null[m
[36m@@ -1,354 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder: Assembler source code emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_bc.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-/* Emit bytes piecewise as assembler text. */[m
[31m-static void emit_asm_bytes(BuildCtx *ctx, uint8_t *p, int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; i < n; i++) {[m
[31m-    if ((i & 15) == 0)[m
[31m-      fprintf(ctx->fp, "\t.byte %d", p[i]);[m
[31m-    else[m
[31m-      fprintf(ctx->fp, ",%d", p[i]);[m
[31m-    if ((i & 15) == 15) putc('\n', ctx->fp);[m
[31m-  }[m
[31m-  if ((n & 15) != 0) putc('\n', ctx->fp);[m
[31m-}[m
[31m-[m
[31m-/* Emit relocation */[m
[31m-static void emit_asm_reloc(BuildCtx *ctx, int type, const char *sym)[m
[31m-{[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    if (type)[m
[31m-      fprintf(ctx->fp, "\t.long %s-.-4\n", sym);[m
[31m-    else[m
[31m-      fprintf(ctx->fp, "\t.long %s\n", sym);[m
[31m-    break;[m
[31m-  case BUILD_coffasm:[m
[31m-    fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", sym);[m
[31m-    if (type)[m
[31m-      fprintf(ctx->fp, "\t.long %s-.-4\n", sym);[m
[31m-    else[m
[31m-      fprintf(ctx->fp, "\t.long %s\n", sym);[m
[31m-    break;[m
[31m-  default:  /* BUILD_machasm for relative relocations handled below. */[m
[31m-    fprintf(ctx->fp, "\t.long %s\n", sym);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const char *const jccnames[] = {[m
[31m-  "jo", "jno", "jb", "jnb", "jz", "jnz", "jbe", "ja",[m
[31m-  "js", "jns", "jpe", "jpo", "jl", "jge", "jle", "jg"[m
[31m-};[m
[31m-[m
[31m-/* Emit x86/x64 text relocations. */[m
[31m-static void emit_asm_reloc_text(BuildCtx *ctx, uint8_t *cp, int n,[m
[31m-				const char *sym)[m
[31m-{[m
[31m-  const char *opname = NULL;[m
[31m-  if (--n < 0) goto err;[m
[31m-  if (cp[n] == 0xe8) {[m
[31m-    opname = "call";[m
[31m-  } else if (cp[n] == 0xe9) {[m
[31m-    opname = "jmp";[m
[31m-  } else if (cp[n] >= 0x80 && cp[n] <= 0x8f && n > 0 && cp[n-1] == 0x0f) {[m
[31m-    opname = jccnames[cp[n]-0x80];[m
[31m-    n--;[m
[31m-  } else {[m
[31m-err:[m
[31m-    fprintf(stderr, "Error: unsupported opcode for %s symbol relocation.\n",[m
[31m-	    sym);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  emit_asm_bytes(ctx, cp, n);[m
[31m-  if (strncmp(sym+(*sym == '_'), LABEL_PREFIX, sizeof(LABEL_PREFIX)-1)) {[m
[31m-    /* Various fixups for external symbols outside of our binary. */[m
[31m-    if (ctx->mode == BUILD_elfasm) {[m
[31m-      if (LJ_32)[m
[31m-	fprintf(ctx->fp, "#if __PIC__\n\t%s lj_wrap_%s\n#else\n", opname, sym);[m
[31m-      fprintf(ctx->fp, "\t%s %s@PLT\n", opname, sym);[m
[31m-      if (LJ_32)[m
[31m-	fprintf(ctx->fp, "#endif\n");[m
[31m-      return;[m
[31m-    } else if (LJ_32 && ctx->mode == BUILD_machasm) {[m
[31m-      fprintf(ctx->fp, "\t%s L%s$stub\n", opname, sym);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  fprintf(ctx->fp, "\t%s %s\n", opname, sym);[m
[31m-}[m
[31m-#else[m
[31m-/* Emit words piecewise as assembler text. */[m
[31m-static void emit_asm_words(BuildCtx *ctx, uint8_t *p, int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; i < n; i += 4) {[m
[31m-    if ((i & 15) == 0)[m
[31m-      fprintf(ctx->fp, "\t.long 0x%08x", *(uint32_t *)(p+i));[m
[31m-    else[m
[31m-      fprintf(ctx->fp, ",0x%08x", *(uint32_t *)(p+i));[m
[31m-    if ((i & 15) == 12) putc('\n', ctx->fp);[m
[31m-  }[m
[31m-  if ((n & 15) != 0) putc('\n', ctx->fp);[m
[31m-}[m
[31m-[m
[31m-/* Emit relocation as part of an instruction. */[m
[31m-static void emit_asm_wordreloc(BuildCtx *ctx, uint8_t *p, int n,[m
[31m-			       const char *sym)[m
[31m-{[m
[31m-  uint32_t ins;[m
[31m-  emit_asm_words(ctx, p, n-4);[m
[31m-  ins = *(uint32_t *)(p+n-4);[m
[31m-#if LJ_TARGET_ARM[m
[31m-  if ((ins & 0xff000000u) == 0xfa000000u) {[m
[31m-    fprintf(ctx->fp, "\tblx %s\n", sym);[m
[31m-  } else if ((ins & 0x0e000000u) == 0x0a000000u) {[m
[31m-    fprintf(ctx->fp, "\t%s%.2s %s\n", (ins & 0x01000000u) ? "bl" : "b",[m
[31m-	    &"eqnecsccmiplvsvchilsgeltgtle"[2*(ins >> 28)], sym);[m
[31m-  } else {[m
[31m-    fprintf(stderr,[m
[31m-	    "Error: unsupported opcode %08x for %s symbol relocation.\n",[m
[31m-	    ins, sym);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-  if ((ins >> 26) == 0x25u) {[m
[31m-    fprintf(ctx->fp, "\tbl %s\n", sym);[m
[31m-  } else {[m
[31m-    fprintf(stderr,[m
[31m-	    "Error: unsupported opcode %08x for %s symbol relocation.\n",[m
[31m-	    ins, sym);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#if LJ_TARGET_PS3[m
[31m-#define TOCPREFIX "."[m
[31m-#else[m
[31m-#define TOCPREFIX ""[m
[31m-#endif[m
[31m-  if ((ins >> 26) == 16) {[m
[31m-    fprintf(ctx->fp, "\t%s %d, %d, " TOCPREFIX "%s\n",[m
[31m-	    (ins & 1) ? "bcl" : "bc", (ins >> 21) & 31, (ins >> 16) & 31, sym);[m
[31m-  } else if ((ins >> 26) == 18) {[m
[31m-#if LJ_ARCH_PPC64[m
[31m-    const char *suffix = strchr(sym, '@');[m
[31m-    if (suffix && suffix[1] == 'h') {[m
[31m-      fprintf(ctx->fp, "\taddis 11, 2, %s\n", sym);[m
[31m-    } else if (suffix && suffix[1] == 'l') {[m
[31m-      fprintf(ctx->fp, "\tld 12, %s\n", sym);[m
[31m-    } else[m
[31m-#endif[m
[31m-    fprintf(ctx->fp, "\t%s " TOCPREFIX "%s\n", (ins & 1) ? "bl" : "b", sym);[m
[31m-  } else {[m
[31m-    fprintf(stderr,[m
[31m-	    "Error: unsupported opcode %08x for %s symbol relocation.\n",[m
[31m-	    ins, sym);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-  fprintf(stderr,[m
[31m-	  "Error: unsupported opcode %08x for %s symbol relocation.\n",[m
[31m-	  ins, sym);[m
[31m-  exit(1);[m
[31m-#else[m
[31m-#error "missing relocation support for this architecture"[m
[31m-#endif[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_ARM[m
[31m-#define ELFASM_PX	"%%"[m
[31m-#else[m
[31m-#define ELFASM_PX	"@"[m
[31m-#endif[m
[31m-[m
[31m-/* Emit an assembler label. */[m
[31m-static void emit_asm_label(BuildCtx *ctx, const char *name, int size, int isfunc)[m
[31m-{[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-#if LJ_TARGET_PS3[m
[31m-    if (!strncmp(name, "lj_vm_", 6) &&[m
[31m-	strcmp(name, ctx->beginsym) &&[m
[31m-	!strstr(name, "hook")) {[m
[31m-      fprintf(ctx->fp,[m
[31m-	"\n\t.globl %s\n"[m
[31m-	"\t.section \".opd\",\"aw\"\n"[m
[31m-	"%s:\n"[m
[31m-	"\t.long .%s,.TOC.@tocbase32\n"[m
[31m-	"\t.size %s,8\n"[m
[31m-	"\t.previous\n"[m
[31m-	"\t.globl .%s\n"[m
[31m-	"\t.hidden .%s\n"[m
[31m-	"\t.type .%s, " ELFASM_PX "function\n"[m
[31m-	"\t.size .%s, %d\n"[m
[31m-	".%s:\n",[m
[31m-	name, name, name, name, name, name, name, name, size, name);[m
[31m-      break;[m
[31m-    }[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-      "\n\t.globl %s\n"[m
[31m-      "\t.hidden %s\n"[m
[31m-      "\t.type %s, " ELFASM_PX "%s\n"[m
[31m-      "\t.size %s, %d\n"[m
[31m-      "%s:\n",[m
[31m-      name, name, name, isfunc ? "function" : "object", name, size, name);[m
[31m-    break;[m
[31m-  case BUILD_coffasm:[m
[31m-    fprintf(ctx->fp, "\n\t.globl %s\n", name);[m
[31m-    if (isfunc)[m
[31m-      fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", name);[m
[31m-    fprintf(ctx->fp, "%s:\n", name);[m
[31m-    break;[m
[31m-  case BUILD_machasm:[m
[31m-    fprintf(ctx->fp,[m
[31m-      "\n\t.private_extern %s\n"[m
[31m-      "%s:\n", name, name);[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit alignment. */[m
[31m-static void emit_asm_align(BuildCtx *ctx, int bits)[m
[31m-{[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-  case BUILD_coffasm:[m
[31m-    fprintf(ctx->fp, "\t.p2align %d\n", bits);[m
[31m-    break;[m
[31m-  case BUILD_machasm:[m
[31m-    fprintf(ctx->fp, "\t.align %d\n", bits);[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Emit assembler source code. */[m
[31m-void emit_asm(BuildCtx *ctx)[m
[31m-{[m
[31m-  int i, rel;[m
[31m-[m
[31m-  fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch);[m
[31m-#if LJ_ARCH_PPC64[m
[31m-  fprintf(ctx->fp, "\t.abiversion 2\n");[m
[31m-#endif[m
[31m-  fprintf(ctx->fp, "\t.text\n");[m
[31m-  emit_asm_align(ctx, 4);[m
[31m-[m
[31m-#if LJ_TARGET_PS3[m
[31m-  emit_asm_label(ctx, ctx->beginsym, ctx->codesz, 0);[m
[31m-#else[m
[31m-  emit_asm_label(ctx, ctx->beginsym, 0, 0);[m
[31m-#endif[m
[31m-  if (ctx->mode != BUILD_machasm)[m
[31m-    fprintf(ctx->fp, ".Lbegin:\n");[m
[31m-[m
[31m-#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND[m
[31m-  /* This should really be moved into buildvm_arm.dasc. */[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-  fprintf(ctx->fp,[m
[31m-	  ".fnstart\n"[m
[31m-	  ".save {r5, r6, r7, r8, r9, r10, r11, lr}\n"[m
[31m-	  ".vsave {d8-d15}\n"[m
[31m-	  ".save {r4}\n"[m
[31m-	  ".pad #28\n");[m
[31m-#else[m
[31m-  fprintf(ctx->fp,[m
[31m-	  ".fnstart\n"[m
[31m-	  ".save {r4, r5, r6, r7, r8, r9, r10, r11, lr}\n"[m
[31m-	  ".pad #28\n");[m
[31m-#endif[m
[31m-#endif[m
[31m-#if LJ_TARGET_MIPS[m
[31m-  fprintf(ctx->fp, ".set nomips16\n.abicalls\n.set noreorder\n.set nomacro\n");[m
[31m-#endif[m
[31m-[m
[31m-  for (i = rel = 0; i < ctx->nsym; i++) {[m
[31m-    int32_t ofs = ctx->sym[i].ofs;[m
[31m-    int32_t next = ctx->sym[i+1].ofs;[m
[31m-#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND && LJ_HASFFI[m
[31m-    if (!strcmp(ctx->sym[i].name, "lj_vm_ffi_call"))[m
[31m-      fprintf(ctx->fp,[m
[31m-	      ".globl lj_err_unwind_arm\n"[m
[31m-	      ".personality lj_err_unwind_arm\n"[m
[31m-	      ".fnend\n"[m
[31m-	      ".fnstart\n"[m
[31m-	      ".save {r4, r5, r11, lr}\n"[m
[31m-	      ".setfp r11, sp\n");[m
[31m-#endif[m
[31m-    emit_asm_label(ctx, ctx->sym[i].name, next - ofs, 1);[m
[31m-    while (rel < ctx->nreloc && ctx->reloc[rel].ofs <= next) {[m
[31m-      BuildReloc *r = &ctx->reloc[rel];[m
[31m-      int n = r->ofs - ofs;[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-      if (r->type != 0 &&[m
[31m-	  (ctx->mode == BUILD_elfasm || ctx->mode == BUILD_machasm)) {[m
[31m-	emit_asm_reloc_text(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]);[m
[31m-      } else {[m
[31m-	emit_asm_bytes(ctx, ctx->code+ofs, n);[m
[31m-	emit_asm_reloc(ctx, r->type, ctx->relocsym[r->sym]);[m
[31m-      }[m
[31m-      ofs += n+4;[m
[31m-#else[m
[31m-      emit_asm_wordreloc(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]);[m
[31m-      ofs += n;[m
[31m-#endif[m
[31m-      rel++;[m
[31m-    }[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    emit_asm_bytes(ctx, ctx->code+ofs, next-ofs);[m
[31m-#else[m
[31m-    emit_asm_words(ctx, ctx->code+ofs, next-ofs);[m
[31m-#endif[m
[31m-  }[m
[31m-[m
[31m-#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND[m
[31m-  fprintf(ctx->fp,[m
[31m-#if !LJ_HASFFI[m
[31m-	  ".globl lj_err_unwind_arm\n"[m
[31m-	  ".personality lj_err_unwind_arm\n"[m
[31m-#endif[m
[31m-	  ".fnend\n");[m
[31m-#endif[m
[31m-[m
[31m-  fprintf(ctx->fp, "\n");[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-#if !(LJ_TARGET_PS3 || LJ_TARGET_PSVITA)[m
[31m-    fprintf(ctx->fp, "\t.section .note.GNU-stack,\"\"," ELFASM_PX "progbits\n");[m
[31m-#endif[m
[31m-#if LJ_TARGET_PPC && !LJ_TARGET_PS3[m
[31m-    /* Hard-float ABI. */[m
[31m-    fprintf(ctx->fp, "\t.gnu_attribute 4, 1\n");[m
[31m-#endif[m
[31m-    /* fallthrough */[m
[31m-  case BUILD_coffasm:[m
[31m-    fprintf(ctx->fp, "\t.ident \"%s\"\n", ctx->dasm_ident);[m
[31m-    break;[m
[31m-  case BUILD_machasm:[m
[31m-    fprintf(ctx->fp,[m
[31m-      "\t.cstring\n"[m
[31m-      "\t.ascii \"%s\\0\"\n", ctx->dasm_ident);[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-  fprintf(ctx->fp, "\n");[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_fold.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_fold.c[m
[1mdeleted file mode 100644[m
[1mindex e87a0af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_fold.c[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder: IR folding hash table generator.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ir.h"[m
[31m-[m
[31m-/* Context for the folding hash table generator. */[m
[31m-static int lineno;[m
[31m-static uint32_t funcidx;[m
[31m-static uint32_t foldkeys[BUILD_MAX_FOLD];[m
[31m-static uint32_t nkeys;[m
[31m-[m
[31m-/* Try to fill the hash table with keys using the hash parameters. */[m
[31m-static int tryhash(uint32_t *htab, uint32_t sz, uint32_t r, int dorol)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-  if (dorol && ((r & 31) == 0 || (r>>5) == 0))[m
[31m-    return 0;  /* Avoid zero rotates. */[m
[31m-  memset(htab, 0xff, (sz+1)*sizeof(uint32_t));[m
[31m-  for (i = 0; i < nkeys; i++) {[m
[31m-    uint32_t key = foldkeys[i];[m
[31m-    uint32_t k = key & 0xffffff;[m
[31m-    uint32_t h = (dorol ? lj_rol(lj_rol(k, r>>5) - k, r&31) :[m
[31m-			  (((k << (r>>5)) - k) << (r&31))) % sz;[m
[31m-    if (htab[h] != 0xffffffff) {  /* Collision on primary slot. */[m
[31m-      if (htab[h+1] != 0xffffffff) {  /* Collision on secondary slot. */[m
[31m-	/* Try to move the colliding key, if possible. */[m
[31m-	if (h < sz-1 && htab[h+2] == 0xffffffff) {[m
[31m-	  uint32_t k2 = htab[h+1] & 0xffffff;[m
[31m-	  uint32_t h2 = (dorol ? lj_rol(lj_rol(k2, r>>5) - k2, r&31) :[m
[31m-				 (((k2 << (r>>5)) - k2) << (r&31))) % sz;[m
[31m-	  if (h2 != h+1) return 0;  /* Cannot resolve collision. */[m
[31m-	  htab[h+2] = htab[h+1];  /* Move colliding key to secondary slot. */[m
[31m-	} else {[m
[31m-	  return 0;  /* Collision. */[m
[31m-	}[m
[31m-      }[m
[31m-      htab[h+1] = key;[m
[31m-    } else {[m
[31m-      htab[h] = key;[m
[31m-    }[m
[31m-  }[m
[31m-  return 1;  /* Success, all keys could be stored. */[m
[31m-}[m
[31m-[m
[31m-/* Print the generated hash table. */[m
[31m-static void printhash(BuildCtx *ctx, uint32_t *htab, uint32_t sz)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-  fprintf(ctx->fp, "static const uint32_t fold_hash[%d] = {\n0x%08x",[m
[31m-	  sz+1, htab[0]);[m
[31m-  for (i = 1; i < sz+1; i++)[m
[31m-    fprintf(ctx->fp, ",\n0x%08x", htab[i]);[m
[31m-  fprintf(ctx->fp, "\n};\n\n");[m
[31m-}[m
[31m-[m
[31m-/* Exhaustive search for the shortest semi-perfect hash table. */[m
[31m-static void makehash(BuildCtx *ctx)[m
[31m-{[m
[31m-  uint32_t htab[BUILD_MAX_FOLD*2+1];[m
[31m-  uint32_t sz, r;[m
[31m-  /* Search for the smallest hash table with an odd size. */[m
[31m-  for (sz = (nkeys|1); sz < BUILD_MAX_FOLD*2; sz += 2) {[m
[31m-    /* First try all shift hash combinations. */[m
[31m-    for (r = 0; r < 32*32; r++) {[m
[31m-      if (tryhash(htab, sz, r, 0)) {[m
[31m-	printhash(ctx, htab, sz);[m
[31m-	fprintf(ctx->fp,[m
[31m-		"#define fold_hashkey(k)\t(((((k)<<%u)-(k))<<%u)%%%u)\n\n",[m
[31m-		r>>5, r&31, sz);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    /* Then try all rotate hash combinations. */[m
[31m-    for (r = 0; r < 32*32; r++) {[m
[31m-      if (tryhash(htab, sz, r, 1)) {[m
[31m-	printhash(ctx, htab, sz);[m
[31m-	fprintf(ctx->fp,[m
[31m-	  "#define fold_hashkey(k)\t(lj_rol(lj_rol((k),%u)-(k),%u)%%%u)\n\n",[m
[31m-		r>>5, r&31, sz);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  fprintf(stderr, "Error: search for perfect hash failed\n");[m
[31m-  exit(1);[m
[31m-}[m
[31m-[m
[31m-/* Parse one token of a fold rule. */[m
[31m-static uint32_t nexttoken(char **pp, int allowlit, int allowany)[m
[31m-{[m
[31m-  char *p = *pp;[m
[31m-  if (p) {[m
[31m-    uint32_t i;[m
[31m-    char *q = strchr(p, ' ');[m
[31m-    if (q) *q++ = '\0';[m
[31m-    *pp = q;[m
[31m-    if (allowlit && !strncmp(p, "IRFPM_", 6)) {[m
[31m-      for (i = 0; irfpm_names[i]; i++)[m
[31m-	if (!strcmp(irfpm_names[i], p+6))[m
[31m-	  return i;[m
[31m-    } else if (allowlit && !strncmp(p, "IRFL_", 5)) {[m
[31m-      for (i = 0; irfield_names[i]; i++)[m
[31m-	if (!strcmp(irfield_names[i], p+5))[m
[31m-	  return i;[m
[31m-    } else if (allowlit && !strncmp(p, "IRCALL_", 7)) {[m
[31m-      for (i = 0; ircall_names[i]; i++)[m
[31m-	if (!strcmp(ircall_names[i], p+7))[m
[31m-	  return i;[m
[31m-    } else if (allowlit && !strncmp(p, "IRCONV_", 7)) {[m
[31m-      for (i = 0; irt_names[i]; i++) {[m
[31m-	const char *r = strchr(p+7, '_');[m
[31m-	if (r && !strncmp(irt_names[i], p+7, r-(p+7))) {[m
[31m-	  uint32_t j;[m
[31m-	  for (j = 0; irt_names[j]; j++)[m
[31m-	    if (!strcmp(irt_names[j], r+1))[m
[31m-	      return (i << 5) + j;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (allowlit && *p >= '0' && *p <= '9') {[m
[31m-      for (i = 0; *p >= '0' && *p <= '9'; p++)[m
[31m-	i = i*10 + (*p - '0');[m
[31m-      if (*p == '\0')[m
[31m-	return i;[m
[31m-    } else if (allowany && !strcmp("any", p)) {[m
[31m-      return allowany;[m
[31m-    } else {[m
[31m-      for (i = 0; ir_names[i]; i++)[m
[31m-	if (!strcmp(ir_names[i], p))[m
[31m-	  return i;[m
[31m-    }[m
[31m-    fprintf(stderr, "Error: bad fold definition token \"%s\" at line %d\n", p, lineno);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Parse a fold rule. */[m
[31m-static void foldrule(char *p)[m
[31m-{[m
[31m-  uint32_t op = nexttoken(&p, 0, 0);[m
[31m-  uint32_t left = nexttoken(&p, 0, 0x7f);[m
[31m-  uint32_t right = nexttoken(&p, 1, 0x3ff);[m
[31m-  uint32_t key = (funcidx << 24) | (op << 17) | (left << 10) | right;[m
[31m-  uint32_t i;[m
[31m-  if (nkeys >= BUILD_MAX_FOLD) {[m
[31m-    fprintf(stderr, "Error: too many fold rules, increase BUILD_MAX_FOLD.\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  /* Simple insertion sort to detect duplicates. */[m
[31m-  for (i = nkeys; i > 0; i--) {[m
[31m-    if ((foldkeys[i-1]&0xffffff) < (key & 0xffffff))[m
[31m-      break;[m
[31m-    if ((foldkeys[i-1]&0xffffff) == (key & 0xffffff)) {[m
[31m-      fprintf(stderr, "Error: duplicate fold definition at line %d\n", lineno);[m
[31m-      exit(1);[m
[31m-    }[m
[31m-    foldkeys[i] = foldkeys[i-1];[m
[31m-  }[m
[31m-  foldkeys[i] = key;[m
[31m-  nkeys++;[m
[31m-}[m
[31m-[m
[31m-/* Emit C source code for IR folding hash table. */[m
[31m-void emit_fold(BuildCtx *ctx)[m
[31m-{[m
[31m-  char buf[256];  /* We don't care about analyzing lines longer than that. */[m
[31m-  const char *fname = ctx->args[0];[m
[31m-  FILE *fp;[m
[31m-[m
[31m-  if (fname == NULL) {[m
[31m-    fprintf(stderr, "Error: missing input filename\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-[m
[31m-  if (fname[0] == '-' && fname[1] == '\0') {[m
[31m-    fp = stdin;[m
[31m-  } else {[m
[31m-    fp = fopen(fname, "r");[m
[31m-    if (!fp) {[m
[31m-      fprintf(stderr, "Error: cannot open input file '%s': %s\n",[m
[31m-	      fname, strerror(errno));[m
[31m-      exit(1);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n");[m
[31m-  fprintf(ctx->fp, "static const FoldFunc fold_func[] = {\n");[m
[31m-[m
[31m-  lineno = 0;[m
[31m-  funcidx = 0;[m
[31m-  nkeys = 0;[m
[31m-  while (fgets(buf, sizeof(buf), fp) != NULL) {[m
[31m-    lineno++;[m
[31m-    /* The prefix must be at the start of a line, otherwise it's ignored. */[m
[31m-    if (!strncmp(buf, FOLDDEF_PREFIX, sizeof(FOLDDEF_PREFIX)-1)) {[m
[31m-      char *p = buf+sizeof(FOLDDEF_PREFIX)-1;[m
[31m-      char *q = strchr(p, ')');[m
[31m-      if (p[0] == '(' && q) {[m
[31m-	p++;[m
[31m-	*q = '\0';[m
[31m-	foldrule(p);[m
[31m-      } else if ((p[0] == 'F' || p[0] == 'X') && p[1] == '(' && q) {[m
[31m-	p += 2;[m
[31m-	*q = '\0';[m
[31m-	if (funcidx)[m
[31m-	  fprintf(ctx->fp, ",\n");[m
[31m-	if (p[-2] == 'X')[m
[31m-	  fprintf(ctx->fp, "  %s", p);[m
[31m-	else[m
[31m-	  fprintf(ctx->fp, "  fold_%s", p);[m
[31m-	funcidx++;[m
[31m-      } else {[m
[31m-	buf[strlen(buf)-1] = '\0';[m
[31m-	fprintf(stderr, "Error: unknown fold definition tag %s%s at line %d\n",[m
[31m-		FOLDDEF_PREFIX, p, lineno);[m
[31m-	exit(1);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  fclose(fp);[m
[31m-  fprintf(ctx->fp, "\n};\n\n");[m
[31m-[m
[31m-  makehash(ctx);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_lib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_lib.c[m
[1mdeleted file mode 100644[m
[1mindex 1adc3cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_lib.c[m
[1m+++ /dev/null[m
[36m@@ -1,457 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder: library definition compiler.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_lib.h"[m
[31m-#include "buildvm_libbc.h"[m
[31m-[m
[31m-/* Context for library definitions. */[m
[31m-static uint8_t obuf[8192];[m
[31m-static uint8_t *optr;[m
[31m-static char modname[80];[m
[31m-static size_t modnamelen;[m
[31m-static char funcname[80];[m
[31m-static int modstate, regfunc;[m
[31m-static int ffid, recffid, ffasmfunc;[m
[31m-[m
[31m-enum {[m
[31m-  REGFUNC_OK,[m
[31m-  REGFUNC_NOREG,[m
[31m-  REGFUNC_NOREGUV[m
[31m-};[m
[31m-[m
[31m-static void libdef_name(const char *p, int kind)[m
[31m-{[m
[31m-  size_t n = strlen(p);[m
[31m-  if (kind != LIBINIT_STRING) {[m
[31m-    if (n > modnamelen && p[modnamelen] == '_' &&[m
[31m-	!strncmp(p, modname, modnamelen)) {[m
[31m-      p += modnamelen+1;[m
[31m-      n -= modnamelen+1;[m
[31m-    }[m
[31m-  }[m
[31m-  if (n > LIBINIT_MAXSTR) {[m
[31m-    fprintf(stderr, "Error: string too long: '%s'\n",  p);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  if (optr+1+n+2 > obuf+sizeof(obuf)) {  /* +2 for caller. */[m
[31m-    fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  *optr++ = (uint8_t)(n | kind);[m
[31m-  memcpy(optr, p, n);[m
[31m-  optr += n;[m
[31m-}[m
[31m-[m
[31m-static void libdef_endmodule(BuildCtx *ctx)[m
[31m-{[m
[31m-  if (modstate != 0) {[m
[31m-    char line[80];[m
[31m-    const uint8_t *p;[m
[31m-    int n;[m
[31m-    if (modstate == 1)[m
[31m-      fprintf(ctx->fp, "  (lua_CFunction)0");[m
[31m-    fprintf(ctx->fp, "\n};\n");[m
[31m-    fprintf(ctx->fp, "static const uint8_t %s%s[] = {\n",[m
[31m-	    LABEL_PREFIX_LIBINIT, modname);[m
[31m-    line[0] = '\0';[m
[31m-    for (n = 0, p = obuf; p < optr; p++) {[m
[31m-      n += sprintf(line+n, "%d,", *p);[m
[31m-      if (n >= 75) {[m
[31m-	fprintf(ctx->fp, "%s\n", line);[m
[31m-	n = 0;[m
[31m-	line[0] = '\0';[m
[31m-      }[m
[31m-    }[m
[31m-    fprintf(ctx->fp, "%s%d\n};\n#endif\n\n", line, LIBINIT_END);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_module(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    libdef_endmodule(ctx);[m
[31m-    optr = obuf;[m
[31m-    *optr++ = (uint8_t)ffid;[m
[31m-    *optr++ = (uint8_t)ffasmfunc;[m
[31m-    *optr++ = 0;  /* Hash table size. */[m
[31m-    modstate = 1;[m
[31m-    fprintf(ctx->fp, "#ifdef %sMODULE_%s\n", LIBDEF_PREFIX, p);[m
[31m-    fprintf(ctx->fp, "#undef %sMODULE_%s\n", LIBDEF_PREFIX, p);[m
[31m-    fprintf(ctx->fp, "static const lua_CFunction %s%s[] = {\n",[m
[31m-	    LABEL_PREFIX_LIBCF, p);[m
[31m-  }[m
[31m-  modnamelen = strlen(p);[m
[31m-  if (modnamelen > sizeof(modname)-1) {[m
[31m-    fprintf(stderr, "Error: module name too long: '%s'\n", p);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  strcpy(modname, p);[m
[31m-}[m
[31m-[m
[31m-static int find_ffofs(BuildCtx *ctx, const char *name)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; i < ctx->nglob; i++) {[m
[31m-    const char *gl = ctx->globnames[i];[m
[31m-    if (gl[0] == 'f' && gl[1] == 'f' && gl[2] == '_' && !strcmp(gl+3, name)) {[m
[31m-      return (int)((uint8_t *)ctx->glob[i] - ctx->code);[m
[31m-    }[m
[31m-  }[m
[31m-  fprintf(stderr, "Error: undefined fast function %s%s\n",[m
[31m-	  LABEL_PREFIX_FF, name);[m
[31m-  exit(1);[m
[31m-}[m
[31m-[m
[31m-static void libdef_func(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  if (arg != LIBINIT_CF)[m
[31m-    ffasmfunc++;[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    if (modstate == 0) {[m
[31m-      fprintf(stderr, "Error: no module for function definition %s\n", p);[m
[31m-      exit(1);[m
[31m-    }[m
[31m-    if (regfunc == REGFUNC_NOREG) {[m
[31m-      if (optr+1 > obuf+sizeof(obuf)) {[m
[31m-	fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-	exit(1);[m
[31m-      }[m
[31m-      *optr++ = LIBINIT_FFID;[m
[31m-    } else {[m
[31m-      if (arg != LIBINIT_ASM_) {[m
[31m-	if (modstate != 1) fprintf(ctx->fp, ",\n");[m
[31m-	modstate = 2;[m
[31m-	fprintf(ctx->fp, "  %s%s", arg ? LABEL_PREFIX_FFH : LABEL_PREFIX_CF, p);[m
[31m-      }[m
[31m-      if (regfunc != REGFUNC_NOREGUV) obuf[2]++;  /* Bump hash table size. */[m
[31m-      libdef_name(regfunc == REGFUNC_NOREGUV ? "" : p, arg);[m
[31m-    }[m
[31m-  } else if (ctx->mode == BUILD_ffdef) {[m
[31m-    fprintf(ctx->fp, "FFDEF(%s)\n", p);[m
[31m-  } else if (ctx->mode == BUILD_recdef) {[m
[31m-    if (strlen(p) > sizeof(funcname)-1) {[m
[31m-      fprintf(stderr, "Error: function name too long: '%s'\n", p);[m
[31m-      exit(1);[m
[31m-    }[m
[31m-    strcpy(funcname, p);[m
[31m-  } else if (ctx->mode == BUILD_vmdef) {[m
[31m-    int i;[m
[31m-    for (i = 1; p[i] && modname[i-1]; i++)[m
[31m-      if (p[i] == '_') p[i] = '.';[m
[31m-    fprintf(ctx->fp, "\"%s\",\n", p);[m
[31m-  } else if (ctx->mode == BUILD_bcdef) {[m
[31m-    if (arg != LIBINIT_CF)[m
[31m-      fprintf(ctx->fp, ",\n%d", find_ffofs(ctx, p));[m
[31m-  }[m
[31m-  ffid++;[m
[31m-  regfunc = REGFUNC_OK;[m
[31m-}[m
[31m-[m
[31m-static uint8_t *libdef_uleb128(uint8_t *p, uint32_t *vv)[m
[31m-{[m
[31m-  uint32_t v = *p++;[m
[31m-  if (v >= 0x80) {[m
[31m-    int sh = 0; v &= 0x7f;[m
[31m-    do { v |= ((*p & 0x7f) << (sh += 7)); } while (*p++ >= 0x80);[m
[31m-  }[m
[31m-  *vv = v;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-static void libdef_fixupbc(uint8_t *p)[m
[31m-{[m
[31m-  uint32_t i, sizebc;[m
[31m-  p += 4;[m
[31m-  p = libdef_uleb128(p, &sizebc);[m
[31m-  p = libdef_uleb128(p, &sizebc);[m
[31m-  p = libdef_uleb128(p, &sizebc);[m
[31m-  for (i = 0; i < sizebc; i++, p += 4) {[m
[31m-    uint8_t op = p[libbc_endian ? 3 : 0];[m
[31m-    uint8_t ra = p[libbc_endian ? 2 : 1];[m
[31m-    uint8_t rc = p[libbc_endian ? 1 : 2];[m
[31m-    uint8_t rb = p[libbc_endian ? 0 : 3];[m
[31m-    if (!LJ_DUALNUM && op == BC_ISTYPE && rc == ~LJ_TNUMX+1) {[m
[31m-      op = BC_ISNUM; rc++;[m
[31m-    }[m
[31m-    p[LJ_ENDIAN_SELECT(0, 3)] = op;[m
[31m-    p[LJ_ENDIAN_SELECT(1, 2)] = ra;[m
[31m-    p[LJ_ENDIAN_SELECT(2, 1)] = rc;[m
[31m-    p[LJ_ENDIAN_SELECT(3, 0)] = rb;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_lua(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    int i;[m
[31m-    for (i = 0; libbc_map[i].name != NULL; i++) {[m
[31m-      if (!strcmp(libbc_map[i].name, p)) {[m
[31m-	int ofs = libbc_map[i].ofs;[m
[31m-	int len = libbc_map[i+1].ofs - ofs;[m
[31m-	obuf[2]++;  /* Bump hash table size. */[m
[31m-	*optr++ = LIBINIT_LUA;[m
[31m-	libdef_name(p, 0);[m
[31m-	memcpy(optr, libbc_code + ofs, len);[m
[31m-	libdef_fixupbc(optr);[m
[31m-	optr += len;[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    fprintf(stderr, "Error: missing libbc definition for %s\n", p);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static uint32_t find_rec(char *name)[m
[31m-{[m
[31m-  char *p = (char *)obuf;[m
[31m-  uint32_t n;[m
[31m-  for (n = 2; *p; n++) {[m
[31m-    if (strcmp(p, name) == 0)[m
[31m-      return n;[m
[31m-    p += strlen(p)+1;[m
[31m-  }[m
[31m-  if (p+strlen(name)+1 >= (char *)obuf+sizeof(obuf)) {[m
[31m-    fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  strcpy(p, name);[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-static void libdef_rec(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_recdef) {[m
[31m-    char *q;[m
[31m-    uint32_t n;[m
[31m-    for (; recffid+1 < ffid; recffid++)[m
[31m-      fprintf(ctx->fp, ",\n0");[m
[31m-    recffid = ffid;[m
[31m-    if (*p == '.') p = funcname;[m
[31m-    q = strchr(p, ' ');[m
[31m-    if (q) *q++ = '\0';[m
[31m-    n = find_rec(p);[m
[31m-    if (q)[m
[31m-      fprintf(ctx->fp, ",\n0x%02x00+(%s)", n, q);[m
[31m-    else[m
[31m-      fprintf(ctx->fp, ",\n0x%02x00", n);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void memcpy_endian(void *dst, void *src, size_t n)[m
[31m-{[m
[31m-  union { uint8_t b; uint32_t u; } host_endian;[m
[31m-  host_endian.u = 1;[m
[31m-  if (host_endian.b == LJ_ENDIAN_SELECT(1, 0)) {[m
[31m-    memcpy(dst, src, n);[m
[31m-  } else {[m
[31m-    size_t i;[m
[31m-    for (i = 0; i < n; i++)[m
[31m-      ((uint8_t *)dst)[i] = ((uint8_t *)src)[n-i-1];[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_push(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    int len = (int)strlen(p);[m
[31m-    if (*p == '"') {[m
[31m-      if (len > 1 && p[len-1] == '"') {[m
[31m-	p[len-1] = '\0';[m
[31m-	libdef_name(p+1, LIBINIT_STRING);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else if (*p >= '0' && *p <= '9') {[m
[31m-      char *ep;[m
[31m-      double d = strtod(p, &ep);[m
[31m-      if (*ep == '\0') {[m
[31m-	if (optr+1+sizeof(double) > obuf+sizeof(obuf)) {[m
[31m-	  fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-	  exit(1);[m
[31m-	}[m
[31m-	*optr++ = LIBINIT_NUMBER;[m
[31m-	memcpy_endian(optr, &d, sizeof(double));[m
[31m-	optr += sizeof(double);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else if (!strcmp(p, "lastcl")) {[m
[31m-      if (optr+1 > obuf+sizeof(obuf)) {[m
[31m-	fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-	exit(1);[m
[31m-      }[m
[31m-      *optr++ = LIBINIT_LASTCL;[m
[31m-      return;[m
[31m-    } else if (len > 4 && !strncmp(p, "top-", 4)) {[m
[31m-      if (optr+2 > obuf+sizeof(obuf)) {[m
[31m-	fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-	exit(1);[m
[31m-      }[m
[31m-      *optr++ = LIBINIT_COPY;[m
[31m-      *optr++ = (uint8_t)atoi(p+4);[m
[31m-      return;[m
[31m-    }[m
[31m-    fprintf(stderr, "Error: bad value for %sPUSH(%s)\n", LIBDEF_PREFIX, p);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_set(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    if (p[0] == '!' && p[1] == '\0') p[0] = '\0';  /* Set env. */[m
[31m-    libdef_name(p, LIBINIT_STRING);[m
[31m-    *optr++ = LIBINIT_SET;[m
[31m-    obuf[2]++;  /* Bump hash table size. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_regfunc(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(ctx); UNUSED(p);[m
[31m-  regfunc = arg;[m
[31m-}[m
[31m-[m
[31m-typedef void (*LibDefFunc)(BuildCtx *ctx, char *p, int arg);[m
[31m-[m
[31m-typedef struct LibDefHandler {[m
[31m-  const char *suffix;[m
[31m-  const char *stop;[m
[31m-  const LibDefFunc func;[m
[31m-  const int arg;[m
[31m-} LibDefHandler;[m
[31m-[m
[31m-static const LibDefHandler libdef_handlers[] = {[m
[31m-  { "MODULE_",	" \t\r\n",	libdef_module,		0 },[m
[31m-  { "CF(",	")",		libdef_func,		LIBINIT_CF },[m
[31m-  { "ASM(",	")",		libdef_func,		LIBINIT_ASM },[m
[31m-  { "ASM_(",	")",		libdef_func,		LIBINIT_ASM_ },[m
[31m-  { "LUA(",	")",		libdef_lua,		0 },[m
[31m-  { "REC(",	")",		libdef_rec,		0 },[m
[31m-  { "PUSH(",	")",		libdef_push,		0 },[m
[31m-  { "SET(",	")",		libdef_set,		0 },[m
[31m-  { "NOREGUV",	NULL,		libdef_regfunc,		REGFUNC_NOREGUV },[m
[31m-  { "NOREG",	NULL,		libdef_regfunc,		REGFUNC_NOREG },[m
[31m-  { NULL,	NULL,		(LibDefFunc)0,		0 }[m
[31m-};[m
[31m-[m
[31m-/* Emit C source code for library function definitions. */[m
[31m-void emit_lib(BuildCtx *ctx)[m
[31m-{[m
[31m-  const char *fname;[m
[31m-[m
[31m-  if (ctx->mode == BUILD_ffdef || ctx->mode == BUILD_libdef ||[m
[31m-      ctx->mode == BUILD_recdef)[m
[31m-    fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n");[m
[31m-  else if (ctx->mode == BUILD_vmdef)[m
[31m-    fprintf(ctx->fp, "ffnames = {\n[0]=\"Lua\",\n\"C\",\n");[m
[31m-  if (ctx->mode == BUILD_recdef)[m
[31m-    fprintf(ctx->fp, "static const uint16_t recff_idmap[] = {\n0,\n0x0100");[m
[31m-  recffid = ffid = FF_C+1;[m
[31m-  ffasmfunc = 0;[m
[31m-[m
[31m-  while ((fname = *ctx->args++)) {[m
[31m-    char buf[256];  /* We don't care about analyzing lines longer than that. */[m
[31m-    FILE *fp;[m
[31m-    if (fname[0] == '-' && fname[1] == '\0') {[m
[31m-      fp = stdin;[m
[31m-    } else {[m
[31m-      fp = fopen(fname, "r");[m
[31m-      if (!fp) {[m
[31m-	fprintf(stderr, "Error: cannot open input file '%s': %s\n",[m
[31m-		fname, strerror(errno));[m
[31m-	exit(1);[m
[31m-      }[m
[31m-    }[m
[31m-    modstate = 0;[m
[31m-    regfunc = REGFUNC_OK;[m
[31m-    while (fgets(buf, sizeof(buf), fp) != NULL) {[m
[31m-      char *p;[m
[31m-      /* Simplistic pre-processor. Only handles top-level #if/#endif. */[m
[31m-      if (buf[0] == '#' && buf[1] == 'i' && buf[2] == 'f') {[m
[31m-	int ok = 1;[m
[31m-	if (!strcmp(buf, "#if LJ_52\n"))[m
[31m-	  ok = LJ_52;[m
[31m-	else if (!strcmp(buf, "#if LJ_HASJIT\n"))[m
[31m-	  ok = LJ_HASJIT;[m
[31m-	else if (!strcmp(buf, "#if LJ_HASFFI\n"))[m
[31m-	  ok = LJ_HASFFI;[m
[31m-	if (!ok) {[m
[31m-	  int lvl = 1;[m
[31m-	  while (fgets(buf, sizeof(buf), fp) != NULL) {[m
[31m-	    if (buf[0] == '#' && buf[1] == 'e' && buf[2] == 'n') {[m
[31m-	      if (--lvl == 0) break;[m
[31m-	    } else if (buf[0] == '#' && buf[1] == 'i' && buf[2] == 'f') {[m
[31m-	      lvl++;[m
[31m-	    }[m
[31m-	  }[m
[31m-	  continue;[m
[31m-	}[m
[31m-      }[m
[31m-      for (p = buf; (p = strstr(p, LIBDEF_PREFIX)) != NULL; ) {[m
[31m-	const LibDefHandler *ldh;[m
[31m-	p += sizeof(LIBDEF_PREFIX)-1;[m
[31m-	for (ldh = libdef_handlers; ldh->suffix != NULL; ldh++) {[m
[31m-	  size_t n, len = strlen(ldh->suffix);[m
[31m-	  if (!strncmp(p, ldh->suffix, len)) {[m
[31m-	    p += len;[m
[31m-	    n = ldh->stop ? strcspn(p, ldh->stop) : 0;[m
[31m-	    if (!p[n]) break;[m
[31m-	    p[n] = '\0';[m
[31m-	    ldh->func(ctx, p, ldh->arg);[m
[31m-	    p += n+1;[m
[31m-	    break;[m
[31m-	  }[m
[31m-	}[m
[31m-	if (ldh->suffix == NULL) {[m
[31m-	  buf[strlen(buf)-1] = '\0';[m
[31m-	  fprintf(stderr, "Error: unknown library definition tag %s%s\n",[m
[31m-		  LIBDEF_PREFIX, p);[m
[31m-	  exit(1);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    fclose(fp);[m
[31m-    if (ctx->mode == BUILD_libdef) {[m
[31m-      libdef_endmodule(ctx);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (ctx->mode == BUILD_ffdef) {[m
[31m-    fprintf(ctx->fp, "\n#undef FFDEF\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-      "#ifndef FF_NUM_ASMFUNC\n#define FF_NUM_ASMFUNC %d\n#endif\n\n",[m
[31m-      ffasmfunc);[m
[31m-  } else if (ctx->mode == BUILD_vmdef) {[m
[31m-    fprintf(ctx->fp, "},\n\n");[m
[31m-  } else if (ctx->mode == BUILD_bcdef) {[m
[31m-    int i;[m
[31m-    fprintf(ctx->fp, "\n};\n\n");[m
[31m-    fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_mode[] = {\n");[m
[31m-    fprintf(ctx->fp, "BCDEF(BCMODE)\n");[m
[31m-    for (i = ffasmfunc-1; i > 0; i--)[m
[31m-      fprintf(ctx->fp, "BCMODE_FF,\n");[m
[31m-    fprintf(ctx->fp, "BCMODE_FF\n};\n\n");[m
[31m-  } else if (ctx->mode == BUILD_recdef) {[m
[31m-    char *p = (char *)obuf;[m
[31m-    fprintf(ctx->fp, "\n};\n\n");[m
[31m-    fprintf(ctx->fp, "static const RecordFunc recff_func[] = {\n"[m
[31m-	    "recff_nyi,\n"[m
[31m-	    "recff_c");[m
[31m-    while (*p) {[m
[31m-      fprintf(ctx->fp, ",\nrecff_%s", p);[m
[31m-      p += strlen(p)+1;[m
[31m-    }[m
[31m-    fprintf(ctx->fp, "\n};\n\n");[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_libbc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_libbc.h[m
[1mdeleted file mode 100644[m
[1mindex 45f8f8c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_libbc.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-/* This is a generated file. DO NOT EDIT! */[m
[31m-[m
[31m-static const int libbc_endian = 0;[m
[31m-[m
[31m-static const uint8_t libbc_code[] = {[m
[31m-#if LJ_FR2[m
[31m-0,1,2,0,0,1,2,24,1,0,0,76,1,2,0,241,135,158,166,3,220,203,178,130,4,0,1,2,0,[m
[31m-0,1,2,24,1,0,0,76,1,2,0,243,244,148,165,20,198,190,199,252,3,0,1,2,0,0,0,3,[m
[31m-16,0,5,0,21,1,0,0,76,1,2,0,0,2,10,0,0,0,15,16,0,12,0,16,1,9,0,41,2,1,0,21,3,[m
[31m-0,0,41,4,1,0,77,2,8,128,18,6,1,0,18,8,5,0,59,9,5,0,66,6,3,2,10,6,0,0,88,7,1,[m
[31m-128,76,6,2,0,79,2,248,127,75,0,1,0,0,2,11,0,0,0,16,16,0,12,0,16,1,9,0,43,2,[m
[31m-0,0,18,3,0,0,41,4,0,0,88,5,7,128,18,7,1,0,18,9,5,0,18,10,6,0,66,7,3,2,10,7,[m
[31m-0,0,88,8,1,128,76,7,2,0,70,5,3,3,82,5,247,127,75,0,1,0,0,1,2,0,0,0,3,16,0,12,[m
[31m-0,21,1,0,0,76,1,2,0,0,2,10,0,0,2,30,16,0,12,0,21,2,0,0,11,1,0,0,88,3,7,128,[m
[31m-8,2,0,0,88,3,23,128,59,3,2,0,43,4,0,0,64,4,2,0,76,3,2,0,88,3,18,128,16,1,14,[m
[31m-0,41,3,1,0,3,3,1,0,88,3,14,128,3,1,2,0,88,3,12,128,59,3,1,0,22,4,1,1,18,5,2,[m
[31m-0,41,6,1,0,77,4,4,128,23,8,1,7,59,9,7,0,64,9,8,0,79,4,252,127,43,4,0,0,64,4,[m
[31m-2,0,76,3,2,0,75,0,1,0,0,2,0[m
[31m-#else[m
[31m-0,1,2,0,0,1,2,24,1,0,0,76,1,2,0,241,135,158,166,3,220,203,178,130,4,0,1,2,0,[m
[31m-0,1,2,24,1,0,0,76,1,2,0,243,244,148,165,20,198,190,199,252,3,0,1,2,0,0,0,3,[m
[31m-16,0,5,0,21,1,0,0,76,1,2,0,0,2,9,0,0,0,15,16,0,12,0,16,1,9,0,41,2,1,0,21,3,[m
[31m-0,0,41,4,1,0,77,2,8,128,18,6,1,0,18,7,5,0,59,8,5,0,66,6,3,2,10,6,0,0,88,7,1,[m
[31m-128,76,6,2,0,79,2,248,127,75,0,1,0,0,2,10,0,0,0,16,16,0,12,0,16,1,9,0,43,2,[m
[31m-0,0,18,3,0,0,41,4,0,0,88,5,7,128,18,7,1,0,18,8,5,0,18,9,6,0,66,7,3,2,10,7,0,[m
[31m-0,88,8,1,128,76,7,2,0,70,5,3,3,82,5,247,127,75,0,1,0,0,1,2,0,0,0,3,16,0,12,[m
[31m-0,21,1,0,0,76,1,2,0,0,2,10,0,0,2,30,16,0,12,0,21,2,0,0,11,1,0,0,88,3,7,128,[m
[31m-8,2,0,0,88,3,23,128,59,3,2,0,43,4,0,0,64,4,2,0,76,3,2,0,88,3,18,128,16,1,14,[m
[31m-0,41,3,1,0,3,3,1,0,88,3,14,128,3,1,2,0,88,3,12,128,59,3,1,0,22,4,1,1,18,5,2,[m
[31m-0,41,6,1,0,77,4,4,128,23,8,1,7,59,9,7,0,64,9,8,0,79,4,252,127,43,4,0,0,64,4,[m
[31m-2,0,76,3,2,0,75,0,1,0,0,2,0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-static const struct { const char *name; int ofs; } libbc_map[] = {[m
[31m-{"math_deg",0},[m
[31m-{"math_rad",25},[m
[31m-{"string_len",50},[m
[31m-{"table_foreachi",69},[m
[31m-{"table_foreach",136},[m
[31m-{"table_getn",207},[m
[31m-{"table_remove",226},[m
[31m-{NULL,355}[m
[31m-};[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_peobj.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_peobj.c[m
[1mdeleted file mode 100644[m
[1mindex e8c927d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/buildvm_peobj.c[m
[1m+++ /dev/null[m
[36m@@ -1,368 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder: PE object emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Only used for building on Windows, since we cannot assume the presence[m
[31m-** of a suitable assembler. The host and target byte order must match.[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_bc.h"[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64 || LJ_TARGET_PPC[m
[31m-[m
[31m-/* Context for PE object emitter. */[m
[31m-static char *strtab;[m
[31m-static size_t strtabofs;[m
[31m-[m
[31m-/* -- PE object definitions ----------------------------------------------- */[m
[31m-[m
[31m-/* PE header. */[m
[31m-typedef struct PEheader {[m
[31m-  uint16_t arch;[m
[31m-  uint16_t nsects;[m
[31m-  uint32_t time;[m
[31m-  uint32_t symtabofs;[m
[31m-  uint32_t nsyms;[m
[31m-  uint16_t opthdrsz;[m
[31m-  uint16_t flags;[m
[31m-} PEheader;[m
[31m-[m
[31m-/* PE section. */[m
[31m-typedef struct PEsection {[m
[31m-  char name[8];[m
[31m-  uint32_t vsize;[m
[31m-  uint32_t vaddr;[m
[31m-  uint32_t size;[m
[31m-  uint32_t ofs;[m
[31m-  uint32_t relocofs;[m
[31m-  uint32_t lineofs;[m
[31m-  uint16_t nreloc;[m
[31m-  uint16_t nline;[m
[31m-  uint32_t flags;[m
[31m-} PEsection;[m
[31m-[m
[31m-/* PE relocation. */[m
[31m-typedef struct PEreloc {[m
[31m-  uint32_t vaddr;[m
[31m-  uint32_t symidx;[m
[31m-  uint16_t type;[m
[31m-} PEreloc;[m
[31m-[m
[31m-/* Cannot use sizeof, because it pads up to the max. alignment. */[m
[31m-#define PEOBJ_RELOC_SIZE	(4+4+2)[m
[31m-[m
[31m-/* PE symbol table entry. */[m
[31m-typedef struct PEsym {[m
[31m-  union {[m
[31m-    char name[8];[m
[31m-    uint32_t nameref[2];[m
[31m-  } n;[m
[31m-  uint32_t value;[m
[31m-  int16_t sect;[m
[31m-  uint16_t type;[m
[31m-  uint8_t scl;[m
[31m-  uint8_t naux;[m
[31m-} PEsym;[m
[31m-[m
[31m-/* PE symbol table auxiliary entry for a section. */[m
[31m-typedef struct PEsymaux {[m
[31m-  uint32_t size;[m
[31m-  uint16_t nreloc;[m
[31m-  uint16_t nline;[m
[31m-  uint32_t cksum;[m
[31m-  uint16_t assoc;[m
[31m-  uint8_t comdatsel;[m
[31m-  uint8_t unused[3];[m
[31m-} PEsymaux;[m
[31m-[m
[31m-/* Cannot use sizeof, because it pads up to the max. alignment. */[m
[31m-#define PEOBJ_SYM_SIZE	(8+4+2+2+1+1)[m
[31m-[m
[31m-/* PE object CPU specific defines. */[m
[31m-#if LJ_TARGET_X86[m
[31m-#define PEOBJ_ARCH_TARGET	0x014c[m
[31m-#define PEOBJ_RELOC_REL32	0x14  /* MS: REL32, GNU: DISP32. */[m
[31m-#define PEOBJ_RELOC_DIR32	0x06[m
[31m-#define PEOBJ_RELOC_OFS		0[m
[31m-#define PEOBJ_TEXT_FLAGS	0x60500020  /* 60=r+x, 50=align16, 20=code. */[m
[31m-#elif LJ_TARGET_X64[m
[31m-#define PEOBJ_ARCH_TARGET	0x8664[m
[31m-#define PEOBJ_RELOC_REL32	0x04  /* MS: REL32, GNU: DISP32. */[m
[31m-#define PEOBJ_RELOC_DIR32	0x02[m
[31m-#define PEOBJ_RELOC_ADDR32NB	0x03[m
[31m-#define PEOBJ_RELOC_OFS		0[m
[31m-#define PEOBJ_TEXT_FLAGS	0x60500020  /* 60=r+x, 50=align16, 20=code. */[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#define PEOBJ_ARCH_TARGET	0x01f2[m
[31m-#define PEOBJ_RELOC_REL32	0x06[m
[31m-#define PEOBJ_RELOC_DIR32	0x02[m
[31m-#define PEOBJ_RELOC_OFS		(-4)[m
[31m-#define PEOBJ_TEXT_FLAGS	0x60400020  /* 60=r+x, 40=align8, 20=code. */[m
[31m-#endif[m
[31m-[m
[31m-/* Section numbers (0-based). */[m
[31m-enum {[m
[31m-  PEOBJ_SECT_ABS = -2,[m
[31m-  PEOBJ_SECT_UNDEF = -1,[m
[31m-  PEOBJ_SECT_TEXT,[m
[31m-#if LJ_TARGET_X64[m
[31m-  PEOBJ_SECT_PDATA,[m
[31m-  PEOBJ_SECT_XDATA,[m
[31m-#endif[m
[31m-  PEOBJ_SECT_RDATA_Z,[m
[31m-  PEOBJ_NSECTIONS[m
[31m-};[m
[31m-[m
[31m-/* Symbol types. */[m
[31m-#define PEOBJ_TYPE_NULL		0[m
[31m-#define PEOBJ_TYPE_FUNC		0x20[m
[31m-[m
[31m-/* Symbol storage class. */[m
[31m-#define PEOBJ_SCL_EXTERN	2[m
[31m-#define PEOBJ_SCL_STATIC	3[m
[31m-[m
[31m-/* -- PE object emitter --------------------------------------------------- */[m
[31m-[m
[31m-/* Emit PE object symbol. */[m
[31m-static void emit_peobj_sym(BuildCtx *ctx, const char *name, uint32_t value,[m
[31m-			   int sect, int type, int scl)[m
[31m-{[m
[31m-  PEsym sym;[m
[31m-  size_t len = strlen(name);[m
[31m-  if (!strtab) {  /* Pass 1: only calculate string table length. */[m
[31m-    if (len > 8) strtabofs += len+1;[m
[31m-    return;[m
[31m-  }[m
[31m-  if (len <= 8) {[m
[31m-    memcpy(sym.n.name, name, len);[m
[31m-    memset(sym.n.name+len, 0, 8-len);[m
[31m-  } else {[m
[31m-    sym.n.nameref[0] = 0;[m
[31m-    sym.n.nameref[1] = (uint32_t)strtabofs;[m
[31m-    memcpy(strtab + strtabofs, name, len);[m
[31m-    strtab[strtabofs+len] = 0;[m
[31m-    strtabofs += len+1;[m
[31m-  }[m
[31m-  sym.value = value;[m
[31m-  sym.sect = (int16_t)(sect+1);  /* 1-based section number. */[m
[31m-  sym.type = (uint16_t)type;[m
[31m-  sym.scl = (uint8_t)scl;[m
[31m-  sym.naux = 0;[m
[31m-  owrite(ctx, &sym, PEOBJ_SYM_SIZE);[m
[31m-}[m
[31m-[m
[31m-/* Emit PE object section symbol. */[m
[31m-static void emit_peobj_sym_sect(BuildCtx *ctx, PEsection *pesect, int sect)[m
[31m-{[m
[31m-  PEsym sym;[m
[31m-  PEsymaux aux;[m
[31m-  if (!strtab) return;  /* Pass 1: no output. */[m
[31m-  memcpy(sym.n.name, pesect[sect].name, 8);[m
[31m-  sym.value = 0;[m
[31m-  sym.sect = (int16_t)(sect+1);  /* 1-based section number. */[m
[31m-  sym.type = PEOBJ_TYPE_NULL;[m
[31m-  sym.scl = PEOBJ_SCL_STATIC;[m
[31m-  sym.naux = 1;[m
[31m-  owrite(ctx, &sym, PEOBJ_SYM_SIZE);[m
[31m-  memset(&aux, 0, sizeof(PEsymaux));[m
[31m-  aux.size = pesect[sect].size;[m
[31m-  aux.nreloc = pesect[sect].nreloc;[m
[31m-  owrite(ctx, &aux, PEOBJ_SYM_SIZE);[m
[31m-}[m
[31m-[m
[31m-/* Emit Windows PE object file. */[m
[31m-void emit_peobj(BuildCtx *ctx)[m
[31m-{[m
[31m-  PEheader pehdr;[m
[31m-  PEsection pesect[PEOBJ_NSECTIONS];[m
[31m-  uint32_t sofs;[m
[31m-  int i, nrsym;[m
[31m-  union { uint8_t b; uint32_t u; } host_endian;[m
[31m-[m
[31m-  sofs = sizeof(PEheader) + PEOBJ_NSECTIONS*sizeof(PEsection);[m
[31m-[m
[31m-  /* Fill in PE sections. */[m
[31m-  memset(&pesect, 0, PEOBJ_NSECTIONS*sizeof(PEsection));[m
[31m-  memcpy(pesect[PEOBJ_SECT_TEXT].name, ".text", sizeof(".text")-1);[m
[31m-  pesect[PEOBJ_SECT_TEXT].ofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_TEXT].size = (uint32_t)ctx->codesz);[m
[31m-  pesect[PEOBJ_SECT_TEXT].relocofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_TEXT].nreloc = (uint16_t)ctx->nreloc) * PEOBJ_RELOC_SIZE;[m
[31m-  /* Flags: 60 = read+execute, 50 = align16, 20 = code. */[m
[31m-  pesect[PEOBJ_SECT_TEXT].flags = PEOBJ_TEXT_FLAGS;[m
[31m-[m
[31m-#if LJ_TARGET_X64[m
[31m-  memcpy(pesect[PEOBJ_SECT_PDATA].name, ".pdata", sizeof(".pdata")-1);[m
[31m-  pesect[PEOBJ_SECT_PDATA].ofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_PDATA].size = 6*4);[m
[31m-  pesect[PEOBJ_SECT_PDATA].relocofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_PDATA].nreloc = 6) * PEOBJ_RELOC_SIZE;[m
[31m-  /* Flags: 40 = read, 30 = align4, 40 = initialized data. */[m
[31m-  pesect[PEOBJ_SECT_PDATA].flags = 0x40300040;[m
[31m-[m
[31m-  memcpy(pesect[PEOBJ_SECT_XDATA].name, ".xdata", sizeof(".xdata")-1);[m
[31m-  pesect[PEOBJ_SECT_XDATA].ofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_XDATA].size = 8*2+4+6*2);  /* See below. */[m
[31m-  pesect[PEOBJ_SECT_XDATA].relocofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_XDATA].nreloc = 1) * PEOBJ_RELOC_SIZE;[m
[31m-  /* Flags: 40 = read, 30 = align4, 40 = initialized data. */[m
[31m-  pesect[PEOBJ_SECT_XDATA].flags = 0x40300040;[m
[31m-#endif[m
[31m-[m
[31m-  memcpy(pesect[PEOBJ_SECT_RDATA_Z].name, ".rdata$Z", sizeof(".rdata$Z")-1);[m
[31m-  pesect[PEOBJ_SECT_RDATA_Z].ofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_RDATA_Z].size = (uint32_t)strlen(ctx->dasm_ident)+1);[m
[31m-  /* Flags: 40 = read, 30 = align4, 40 = initialized data. */[m
[31m-  pesect[PEOBJ_SECT_RDATA_Z].flags = 0x40300040;[m
[31m-[m
[31m-  /* Fill in PE header. */[m
[31m-  pehdr.arch = PEOBJ_ARCH_TARGET;[m
[31m-  pehdr.nsects = PEOBJ_NSECTIONS;[m
[31m-  pehdr.time = 0;  /* Timestamp is optional. */[m
[31m-  pehdr.symtabofs = sofs;[m
[31m-  pehdr.opthdrsz = 0;[m
[31m-  pehdr.flags = 0;[m
[31m-[m
[31m-  /* Compute the size of the symbol table:[m
[31m-  ** @feat.00 + nsections*2[m
[31m-  ** + asm_start + nsym[m
[31m-  ** + nrsym[m
[31m-  */[m
[31m-  nrsym = ctx->nrelocsym;[m
[31m-  pehdr.nsyms = 1+PEOBJ_NSECTIONS*2 + 1+ctx->nsym + nrsym;[m
[31m-#if LJ_TARGET_X64[m
[31m-  pehdr.nsyms += 1;  /* Symbol for lj_err_unwind_win64. */[m
[31m-#endif[m
[31m-[m
[31m-  /* Write PE object header and all sections. */[m
[31m-  owrite(ctx, &pehdr, sizeof(PEheader));[m
[31m-  owrite(ctx, &pesect, sizeof(PEsection)*PEOBJ_NSECTIONS);[m
[31m-[m
[31m-  /* Write .text section. */[m
[31m-  host_endian.u = 1;[m
[31m-  if (host_endian.b != LJ_ENDIAN_SELECT(1, 0)) {[m
[31m-#if LJ_TARGET_PPC[m
[31m-    uint32_t *p = (uint32_t *)ctx->code;[m
[31m-    int n = (int)(ctx->codesz >> 2);[m
[31m-    for (i = 0; i < n; i++, p++)[m
[31m-      *p = lj_bswap(*p);  /* Byteswap .text section. */[m
[31m-#else[m
[31m-    fprintf(stderr, "Error: different byte order for host and target\n");[m
[31m-    exit(1);[m
[31m-#endif[m
[31m-  }[m
[31m-  owrite(ctx, ctx->code, ctx->codesz);[m
[31m-  for (i = 0; i < ctx->nreloc; i++) {[m
[31m-    PEreloc reloc;[m
[31m-    reloc.vaddr = (uint32_t)ctx->reloc[i].ofs + PEOBJ_RELOC_OFS;[m
[31m-    reloc.symidx = 1+2+ctx->reloc[i].sym;  /* Reloc syms are after .text sym. */[m
[31m-    reloc.type = ctx->reloc[i].type ? PEOBJ_RELOC_REL32 : PEOBJ_RELOC_DIR32;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-  }[m
[31m-[m
[31m-#if LJ_TARGET_X64[m
[31m-  { /* Write .pdata section. */[m
[31m-    uint32_t fcofs = (uint32_t)ctx->sym[ctx->nsym-1].ofs;[m
[31m-    uint32_t pdata[3];  /* Start of .text, end of .text and .xdata. */[m
[31m-    PEreloc reloc;[m
[31m-    pdata[0] = 0; pdata[1] = fcofs; pdata[2] = 0;[m
[31m-    owrite(ctx, &pdata, sizeof(pdata));[m
[31m-    pdata[0] = fcofs; pdata[1] = (uint32_t)ctx->codesz; pdata[2] = 20;[m
[31m-    owrite(ctx, &pdata, sizeof(pdata));[m
[31m-    reloc.vaddr = 0; reloc.symidx = 1+2+nrsym+2+2+1;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 4; reloc.symidx = 1+2+nrsym+2+2+1;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 8; reloc.symidx = 1+2+nrsym+2;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 12; reloc.symidx = 1+2+nrsym+2+2+1;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 16; reloc.symidx = 1+2+nrsym+2+2+1;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 20; reloc.symidx = 1+2+nrsym+2;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-  }[m
[31m-  { /* Write .xdata section. */[m
[31m-    uint16_t xdata[8+2+6];[m
[31m-    PEreloc reloc;[m
[31m-    xdata[0] = 0x01|0x08|0x10;  /* Ver. 1, uhandler/ehandler, prolog size 0. */[m
[31m-    xdata[1] = 0x0005;  /* Number of unwind codes, no frame pointer. */[m
[31m-    xdata[2] = 0x4200;  /* Stack offset 4*8+8 = aword*5. */[m
[31m-    xdata[3] = 0x3000;  /* Push rbx. */[m
[31m-    xdata[4] = 0x6000;  /* Push rsi. */[m
[31m-    xdata[5] = 0x7000;  /* Push rdi. */[m
[31m-    xdata[6] = 0x5000;  /* Push rbp. */[m
[31m-    xdata[7] = 0;  /* Alignment. */[m
[31m-    xdata[8] = xdata[9] = 0;  /* Relocated address of exception handler. */[m
[31m-    xdata[10] = 0x01;  /* Ver. 1, no handler, prolog size 0. */[m
[31m-    xdata[11] = 0x1504;  /* Number of unwind codes, fp = rbp, fpofs = 16. */[m
[31m-    xdata[12] = 0x0300;  /* set_fpreg. */[m
[31m-    xdata[13] = 0x0200;  /* stack offset 0*8+8 = aword*1. */[m
[31m-    xdata[14] = 0x3000;  /* Push rbx. */[m
[31m-    xdata[15] = 0x5000;  /* Push rbp. */[m
[31m-    owrite(ctx, &xdata, sizeof(xdata));[m
[31m-    reloc.vaddr = 2*8; reloc.symidx = 1+2+nrsym+2+2;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  /* Write .rdata$Z section. */[m
[31m-  owrite(ctx, ctx->dasm_ident, strlen(ctx->dasm_ident)+1);[m
[31m-[m
[31m-  /* Write symbol table. */[m
[31m-  strtab = NULL;  /* 1st pass: collect string sizes. */[m
[31m-  for (;;) {[m
[31m-    strtabofs = 4;[m
[31m-    /* Mark as SafeSEH compliant. */[m
[31m-    emit_peobj_sym(ctx, "@feat.00", 1,[m
[31m-		   PEOBJ_SECT_ABS, PEOBJ_TYPE_NULL, PEOBJ_SCL_STATIC);[m
[31m-[m
[31m-    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_TEXT);[m
[31m-    for (i = 0; i < nrsym; i++)[m
[31m-      emit_peobj_sym(ctx, ctx->relocsym[i], 0,[m
[31m-		     PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN);[m
[31m-[m
[31m-#if LJ_TARGET_X64[m
[31m-    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_PDATA);[m
[31m-    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_XDATA);[m
[31m-    emit_peobj_sym(ctx, "lj_err_unwind_win64", 0,[m
[31m-		   PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN);[m
[31m-#endif[m
[31m-[m
[31m-    emit_peobj_sym(ctx, ctx->beginsym, 0,[m
[31m-		   PEOBJ_SECT_TEXT, PEOBJ_TYPE_NULL, PEOBJ_SCL_EXTERN);[m
[31m-    for (i = 0; i < ctx->nsym; i++)[m
[31m-      emit_peobj_sym(ctx, ctx->sym[i].name, (uint32_t)ctx->sym[i].ofs,[m
[31m-		     PEOBJ_SECT_TEXT, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN);[m
[31m-[m
[31m-    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_RDATA_Z);[m
[31m-[m
[31m-    if (strtab)[m
[31m-      break;[m
[31m-    /* 2nd pass: alloc strtab, write syms and copy strings. */[m
[31m-    strtab = (char *)malloc(strtabofs);[m
[31m-    *(uint32_t *)strtab = (uint32_t)strtabofs;[m
[31m-  }[m
[31m-[m
[31m-  /* Write string table. */[m
[31m-  owrite(ctx, strtab, strtabofs);[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-void emit_peobj(BuildCtx *ctx)[m
[31m-{[m
[31m-  UNUSED(ctx);[m
[31m-  fprintf(stderr, "Error: no PE object support for this target\n");[m
[31m-  exit(1);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/genlibbc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/genlibbc.lua[m
[1mdeleted file mode 100644[m
[1mindex 7a17a3d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/genlibbc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,197 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- Lua script to dump the bytecode of the library functions written in Lua.[m
[31m--- The resulting 'buildvm_libbc.h' is used for the build process of LuaJIT.[m
[31m-----------------------------------------------------------------------------[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m-local ffi = require("ffi")[m
[31m-local bit = require("bit")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local bcnames = vmdef.bcnames[m
[31m-[m
[31m-local format = string.format[m
[31m-[m
[31m-local isbe = (string.byte(string.dump(function() end), 5) % 2 == 1)[m
[31m-[m
[31m-local function usage(arg)[m
[31m-  io.stderr:write("Usage: ", arg and arg[0] or "genlibbc",[m
[31m-		  " [-o buildvm_libbc.h] lib_*.c\n")[m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function parse_arg(arg)[m
[31m-  local outfile = "-"[m
[31m-  if not (arg and arg[1]) then[m
[31m-    usage(arg)[m
[31m-  end[m
[31m-  if arg[1] == "-o" then[m
[31m-    outfile = arg[2][m
[31m-    if not outfile then usage(arg) end[m
[31m-    table.remove(arg, 1)[m
[31m-    table.remove(arg, 1)[m
[31m-  end[m
[31m-  return outfile[m
[31m-end[m
[31m-[m
[31m-local function read_files(names)[m
[31m-  local src = ""[m
[31m-  for _,name in ipairs(names) do[m
[31m-    local fp = assert(io.open(name))[m
[31m-    src = src .. fp:read("*a")[m
[31m-    fp:close()[m
[31m-  end[m
[31m-  return src[m
[31m-end[m
[31m-[m
[31m-local function transform_lua(code)[m
[31m-  local fixup = {}[m
[31m-  local n = -30000[m
[31m-  code = string.gsub(code, "CHECK_(%w*)%((.-)%)", function(tp, var)[m
[31m-    n = n + 1[m
[31m-    fixup[n] = { "CHECK", tp }[m
[31m-    return format("%s=%d", var, n)[m
[31m-  end)[m
[31m-  code = string.gsub(code, "PAIRS%((.-)%)", function(var)[m
[31m-    fixup.PAIRS = true[m
[31m-    return format("nil, %s, 0", var)[m
[31m-  end)[m
[31m-  return "return "..code, fixup[m
[31m-end[m
[31m-[m
[31m-local function read_uleb128(p)[m
[31m-  local v = p[0]; p = p + 1[m
[31m-  if v >= 128 then[m
[31m-    local sh = 7; v = v - 128[m
[31m-    repeat[m
[31m-      local r = p[0][m
[31m-      v = v + bit.lshift(bit.band(r, 127), sh)[m
[31m-      sh = sh + 7[m
[31m-      p = p + 1[m
[31m-    until r < 128[m
[31m-  end[m
[31m-  return p, v[m
[31m-end[m
[31m-[m
[31m--- ORDER LJ_T[m
[31m-local name2itype = {[m
[31m-  str = 5, func = 9, tab = 12, int = 14, num = 15[m
[31m-}[m
[31m-[m
[31m-local BC = {}[m
[31m-for i=0,#bcnames/6-1 do[m
[31m-  BC[string.gsub(string.sub(bcnames, i*6+1, i*6+6), " ", "")] = i[m
[31m-end[m
[31m-local xop, xra = isbe and 3 or 0, isbe and 2 or 1[m
[31m-local xrc, xrb = isbe and 1 or 2, isbe and 0 or 3[m
[31m-[m
[31m-local function fixup_dump(dump, fixup)[m
[31m-  local buf = ffi.new("uint8_t[?]", #dump+1, dump)[m
[31m-  local p = buf+5[m
[31m-  local n, sizebc[m
[31m-  p, n = read_uleb128(p)[m
[31m-  local start = p[m
[31m-  p = p + 4[m
[31m-  p = read_uleb128(p)[m
[31m-  p = read_uleb128(p)[m
[31m-  p, sizebc = read_uleb128(p)[m
[31m-  local rawtab = {}[m
[31m-  for i=0,sizebc-1 do[m
[31m-    local op = p[xop][m
[31m-    if op == BC.KSHORT then[m
[31m-      local rd = p[xrc] + 256*p[xrb][m
[31m-      rd = bit.arshift(bit.lshift(rd, 16), 16)[m
[31m-      local f = fixup[rd][m
[31m-      if f then[m
[31m-	if f[1] == "CHECK" then[m
[31m-	  local tp = f[2][m
[31m-	  if tp == "tab" then rawtab[p[xra]] = true end[m
[31m-	  p[xop] = tp == "num" and BC.ISNUM or BC.ISTYPE[m
[31m-	  p[xrb] = 0[m
[31m-	  p[xrc] = name2itype[tp][m
[31m-	else[m
[31m-	  error("unhandled fixup type: "..f[1])[m
[31m-	end[m
[31m-      end[m
[31m-    elseif op == BC.TGETV then[m
[31m-      if rawtab[p[xrb]] then[m
[31m-	p[xop] = BC.TGETR[m
[31m-      end[m
[31m-    elseif op == BC.TSETV then[m
[31m-      if rawtab[p[xrb]] then[m
[31m-	p[xop] = BC.TSETR[m
[31m-      end[m
[31m-    elseif op == BC.ITERC then[m
[31m-      if fixup.PAIRS then[m
[31m-	p[xop] = BC.ITERN[m
[31m-      end[m
[31m-    end[m
[31m-    p = p + 4[m
[31m-  end[m
[31m-  return ffi.string(start, n)[m
[31m-end[m
[31m-[m
[31m-local function find_defs(src)[m
[31m-  local defs = {}[m
[31m-  for name, code in string.gmatch(src, "LJLIB_LUA%(([^)]*)%)%s*/%*(.-)%*/") do[m
[31m-    local env = {}[m
[31m-    local tcode, fixup = transform_lua(code)[m
[31m-    local func = assert(load(tcode, "", nil, env))()[m
[31m-    defs[name] = fixup_dump(string.dump(func, true), fixup)[m
[31m-    defs[#defs+1] = name[m
[31m-  end[m
[31m-  return defs[m
[31m-end[m
[31m-[m
[31m-local function gen_header(defs)[m
[31m-  local t = {}[m
[31m-  local function w(x) t[#t+1] = x end[m
[31m-  w("/* This is a generated file. DO NOT EDIT! */\n\n")[m
[31m-  w("static const int libbc_endian = ") w(isbe and 1 or 0) w(";\n\n")[m
[31m-  local s = ""[m
[31m-  for _,name in ipairs(defs) do[m
[31m-    s = s .. defs[name][m
[31m-  end[m
[31m-  w("static const uint8_t libbc_code[] = {\n")[m
[31m-  local n = 0[m
[31m-  for i=1,#s do[m
[31m-    local x = string.byte(s, i)[m
[31m-    w(x); w(",")[m
[31m-    n = n + (x < 10 and 2 or (x < 100 and 3 or 4))[m
[31m-    if n >= 75 then n = 0; w("\n") end[m
[31m-  end[m
[31m-  w("0\n};\n\n")[m
[31m-  w("static const struct { const char *name; int ofs; } libbc_map[] = {\n")[m
[31m-  local m = 0[m
[31m-  for _,name in ipairs(defs) do[m
[31m-    w('{"'); w(name); w('",'); w(m) w('},\n')[m
[31m-    m = m + #defs[name][m
[31m-  end[m
[31m-  w("{NULL,"); w(m); w("}\n};\n\n")[m
[31m-  return table.concat(t)[m
[31m-end[m
[31m-[m
[31m-local function write_file(name, data)[m
[31m-  if name == "-" then[m
[31m-    assert(io.write(data))[m
[31m-    assert(io.flush())[m
[31m-  else[m
[31m-    local fp = io.open(name)[m
[31m-    if fp then[m
[31m-      local old = fp:read("*a")[m
[31m-      fp:close()[m
[31m-      if data == old then return end[m
[31m-    end[m
[31m-    fp = assert(io.open(name, "w"))[m
[31m-    assert(fp:write(data))[m
[31m-    assert(fp:close())[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local outfile = parse_arg(arg)[m
[31m-local src = read_files(arg)[m
[31m-local defs = find_defs(src)[m
[31m-local hdr = gen_header(defs)[m
[31m-write_file(outfile, hdr)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/genminilua.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/genminilua.lua[m
[1mdeleted file mode 100644[m
[1mindex e9a6829..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/genminilua.lua[m
[1m+++ /dev/null[m
[36m@@ -1,429 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- Lua script to generate a customized, minified version of Lua.[m
[31m--- The resulting 'minilua' is used for the build process of LuaJIT.[m
[31m-----------------------------------------------------------------------------[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m-local sub, match, gsub = string.sub, string.match, string.gsub[m
[31m-[m
[31m-local LUA_VERSION = "5.1.5"[m
[31m-local LUA_SOURCE[m
[31m-[m
[31m-local function usage()[m
[31m-  io.stderr:write("Usage: ", arg and arg[0] or "genminilua",[m
[31m-		  " lua-", LUA_VERSION, "-source-dir\n")[m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function find_sources()[m
[31m-  LUA_SOURCE = arg and arg[1][m
[31m-  if not LUA_SOURCE then usage() end[m
[31m-  if sub(LUA_SOURCE, -1) ~= "/" then LUA_SOURCE = LUA_SOURCE.."/" end[m
[31m-  local fp = io.open(LUA_SOURCE .. "lua.h")[m
[31m-  if not fp then[m
[31m-    LUA_SOURCE = LUA_SOURCE.."src/"[m
[31m-    fp = io.open(LUA_SOURCE .. "lua.h")[m
[31m-    if not fp then usage() end[m
[31m-  end[m
[31m-  local all = fp:read("*a")[m
[31m-  fp:close()[m
[31m-  if not match(all, 'LUA_RELEASE%s*"Lua '..LUA_VERSION..'"') then[m
[31m-    io.stderr:write("Error: version mismatch\n")[m
[31m-    usage()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local LUA_FILES = {[m
[31m-"lmem.c", "lobject.c", "ltm.c", "lfunc.c", "ldo.c", "lstring.c", "ltable.c",[m
[31m-"lgc.c", "lstate.c", "ldebug.c", "lzio.c", "lopcodes.c",[m
[31m-"llex.c", "lcode.c", "lparser.c", "lvm.c", "lapi.c", "lauxlib.c",[m
[31m-"lbaselib.c", "ltablib.c", "liolib.c", "loslib.c", "lstrlib.c", "linit.c",[m
[31m-}[m
[31m-[m
[31m-local REMOVE_LIB = {}[m
[31m-gsub([[[m
[31m-collectgarbage dofile gcinfo getfenv getmetatable load print rawequal rawset[m
[31m-select tostring xpcall[m
[31m-foreach foreachi getn maxn setn[m
[31m-popen tmpfile seek setvbuf __tostring[m
[31m-clock date difftime execute getenv rename setlocale time tmpname[m
[31m-dump gfind len reverse[m
[31m-LUA_LOADLIBNAME LUA_MATHLIBNAME LUA_DBLIBNAME[m
[31m-]], "%S+", function(name)[m
[31m-  REMOVE_LIB[name] = true[m
[31m-end)[m
[31m-[m
[31m-local REMOVE_EXTINC = { ["<assert.h>"] = true, ["<locale.h>"] = true, }[m
[31m-[m
[31m-local CUSTOM_MAIN = [[[m
[31m-typedef unsigned int UB;[m
[31m-static UB barg(lua_State *L,int idx){[m
[31m-union{lua_Number n;U64 b;}bn;[m
[31m-bn.n=lua_tonumber(L,idx)+6755399441055744.0;[m
[31m-if (bn.n==0.0&&!lua_isnumber(L,idx))luaL_typerror(L,idx,"number");[m
[31m-return(UB)bn.b;[m
[31m-}[m
[31m-#define BRET(b) lua_pushnumber(L,(lua_Number)(int)(b));return 1;[m
[31m-static int tobit(lua_State *L){[m
[31m-BRET(barg(L,1))}[m
[31m-static int bnot(lua_State *L){[m
[31m-BRET(~barg(L,1))}[m
[31m-static int band(lua_State *L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b&=barg(L,i);BRET(b)}[m
[31m-static int bor(lua_State *L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b|=barg(L,i);BRET(b)}[m
[31m-static int bxor(lua_State *L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b^=barg(L,i);BRET(b)}[m
[31m-static int lshift(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET(b<<n)}[m
[31m-static int rshift(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET(b>>n)}[m
[31m-static int arshift(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((int)b>>n)}[m
[31m-static int rol(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((b<<n)|(b>>(32-n)))}[m
[31m-static int ror(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((b>>n)|(b<<(32-n)))}[m
[31m-static int bswap(lua_State *L){[m
[31m-UB b=barg(L,1);b=(b>>24)|((b>>8)&0xff00)|((b&0xff00)<<8)|(b<<24);BRET(b)}[m
[31m-static int tohex(lua_State *L){[m
[31m-UB b=barg(L,1);[m
[31m-int n=lua_isnone(L,2)?8:(int)barg(L,2);[m
[31m-const char *hexdigits="0123456789abcdef";[m
[31m-char buf[8];[m
[31m-int i;[m
[31m-if(n<0){n=-n;hexdigits="0123456789ABCDEF";}[m
[31m-if(n>8)n=8;[m
[31m-for(i=(int)n;--i>=0;){buf[i]=hexdigits[b&15];b>>=4;}[m
[31m-lua_pushlstring(L,buf,(size_t)n);[m
[31m-return 1;[m
[31m-}[m
[31m-static const struct luaL_Reg bitlib[] = {[m
[31m-{"tobit",tobit},[m
[31m-{"bnot",bnot},[m
[31m-{"band",band},[m
[31m-{"bor",bor},[m
[31m-{"bxor",bxor},[m
[31m-{"lshift",lshift},[m
[31m-{"rshift",rshift},[m
[31m-{"arshift",arshift},[m
[31m-{"rol",rol},[m
[31m-{"ror",ror},[m
[31m-{"bswap",bswap},[m
[31m-{"tohex",tohex},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-int main(int argc, char **argv){[m
[31m-  lua_State *L = luaL_newstate();[m
[31m-  int i;[m
[31m-  luaL_openlibs(L);[m
[31m-  luaL_register(L, "bit", bitlib);[m
[31m-  if (argc < 2) return sizeof(void *);[m
[31m-  lua_createtable(L, 0, 1);[m
[31m-  lua_pushstring(L, argv[1]);[m
[31m-  lua_rawseti(L, -2, 0);[m
[31m-  lua_setglobal(L, "arg");[m
[31m-  if (luaL_loadfile(L, argv[1]))[m
[31m-    goto err;[m
[31m-  for (i = 2; i < argc; i++)[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-  if (lua_pcall(L, argc - 2, 0, 0)) {[m
[31m-  err:[m
[31m-    fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  lua_close(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-]][m
[31m-[m
[31m-local function read_sources()[m
[31m-  local t = {}[m
[31m-  for i, name in ipairs(LUA_FILES) do[m
[31m-    local fp = assert(io.open(LUA_SOURCE..name, "r"))[m
[31m-    t[i] = fp:read("*a")[m
[31m-    assert(fp:close())[m
[31m-  end[m
[31m-  t[#t+1] = CUSTOM_MAIN[m
[31m-  return table.concat(t)[m
[31m-end[m
[31m-[m
[31m-local includes = {}[m
[31m-[m
[31m-local function merge_includes(src)[m
[31m-  return gsub(src, '#include%s*"([^"]*)"%s*\n', function(name)[m
[31m-    if includes[name] then return "" end[m
[31m-    includes[name] = true[m
[31m-    local fp = assert(io.open(LUA_SOURCE..name, "r"))[m
[31m-    local src = fp:read("*a")[m
[31m-    assert(fp:close())[m
[31m-    src = gsub(src, "#ifndef%s+%w+_h\n#define%s+%w+_h\n", "")[m
[31m-    src = gsub(src, "#endif%s*$", "")[m
[31m-    return merge_includes(src)[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-local function get_license(src)[m
[31m-  return match(src, "/%*+\n%* Copyright %(.-%*/\n")[m
[31m-end[m
[31m-[m
[31m-local function fold_lines(src)[m
[31m-  return gsub(src, "\\\n", " ")[m
[31m-end[m
[31m-[m
[31m-local strings = {}[m
[31m-[m
[31m-local function save_str(str)[m
[31m-  local n = #strings+1[m
[31m-  strings[n] = str[m
[31m-  return "\1"..n.."\2"[m
[31m-end[m
[31m-[m
[31m-local function save_strings(src)[m
[31m-  src = gsub(src, '"[^"\n]*"', save_str)[m
[31m-  return gsub(src, "'[^'\n]*'", save_str)[m
[31m-end[m
[31m-[m
[31m-local function restore_strings(src)[m
[31m-  return gsub(src, "\1(%d+)\2", function(numstr)[m
[31m-    return strings[tonumber(numstr)][m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-local function def_istrue(def)[m
[31m-  return def == "INT_MAX > 2147483640L" or[m
[31m-	 def == "LUAI_BITSINT >= 32" or[m
[31m-	 def == "SIZE_Bx < LUAI_BITSINT-1" or[m
[31m-	 def == "cast" or[m
[31m-	 def == "defined(LUA_CORE)" or[m
[31m-	 def == "MINSTRTABSIZE" or[m
[31m-	 def == "LUA_MINBUFFER" or[m
[31m-	 def == "HARDSTACKTESTS" or[m
[31m-	 def == "UNUSED"[m
[31m-end[m
[31m-[m
[31m-local head, defs = {[[[m
[31m-#ifdef _MSC_VER[m
[31m-typedef unsigned __int64 U64;[m
[31m-#else[m
[31m-typedef unsigned long long U64;[m
[31m-#endif[m
[31m-int _CRT_glob = 0;[m
[31m-]]}, {}[m
[31m-[m
[31m-local function preprocess(src)[m
[31m-  local t = { match(src, "^(.-)#") }[m
[31m-  local lvl, on, oldon = 0, true, {}[m
[31m-  for pp, def, txt in string.gmatch(src, "#(%w+) *([^\n]*)\n([^#]*)") do[m
[31m-    if pp == "if" or pp == "ifdef" or pp == "ifndef" then[m
[31m-      lvl = lvl + 1[m
[31m-      oldon[lvl] = on[m
[31m-      on = def_istrue(def)[m
[31m-    elseif pp == "else" then[m
[31m-      if oldon[lvl] then[m
[31m-	if on == false then on = true else on = false end[m
[31m-      end[m
[31m-    elseif pp == "elif" then[m
[31m-      if oldon[lvl] then[m
[31m-	on = def_istrue(def)[m
[31m-      end[m
[31m-    elseif pp == "endif" then[m
[31m-      on = oldon[lvl][m
[31m-      lvl = lvl - 1[m
[31m-    elseif on then[m
[31m-      if pp == "include" then[m
[31m-	if not head[def] and not REMOVE_EXTINC[def] then[m
[31m-	  head[def] = true[m
[31m-	  head[#head+1] = "#include "..def.."\n"[m
[31m-	end[m
[31m-      elseif pp == "define" then[m
[31m-	local k, sp, v = match(def, "([%w_]+)(%s*)(.*)")[m
[31m-	if k and not (sp == "" and sub(v, 1, 1) == "(") then[m
[31m-	  defs[k] = gsub(v, "%a[%w_]*", function(tok)[m
[31m-	    return defs[tok] or tok[m
[31m-	  end)[m
[31m-	else[m
[31m-	  t[#t+1] = "#define "..def.."\n"[m
[31m-	end[m
[31m-      elseif pp ~= "undef" then[m
[31m-	error("unexpected directive: "..pp.." "..def)[m
[31m-      end[m
[31m-    end[m
[31m-    if on then t[#t+1] = txt end[m
[31m-  end[m
[31m-  return gsub(table.concat(t), "%a[%w_]*", function(tok)[m
[31m-    return defs[tok] or tok[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-local function merge_header(src, license)[m
[31m-  local hdr = string.format([[[m
[31m-/* This is a heavily customized and minimized copy of Lua %s. */[m
[31m-/* It's only used to build LuaJIT. It does NOT have all standard functions! */[m
[31m-]], LUA_VERSION)[m
[31m-  return hdr..license..table.concat(head)..src[m
[31m-end[m
[31m-[m
[31m-local function strip_unused1(src)[m
[31m-  return gsub(src, '(  {"?([%w_]+)"?,%s+%a[%w_]*},\n)', function(line, func)[m
[31m-    return REMOVE_LIB[func] and "" or line[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-local function strip_unused2(src)[m
[31m-  return gsub(src, "Symbolic Execution.-}=", "")[m
[31m-end[m
[31m-[m
[31m-local function strip_unused3(src)[m
[31m-  src = gsub(src, "extern", "static")[m
[31m-  src = gsub(src, "\nstatic([^\n]-)%(([^)]*)%)%(", "\nstatic%1 %2(")[m
[31m-  src = gsub(src, "#define lua_assert[^\n]*\n", "")[m
[31m-  src = gsub(src, "lua_assert%b();?", "")[m
[31m-  src = gsub(src, "default:\n}", "default:;\n}")[m
[31m-  src = gsub(src, "lua_lock%b();", "")[m
[31m-  src = gsub(src, "lua_unlock%b();", "")[m
[31m-  src = gsub(src, "luai_threadyield%b();", "")[m
[31m-  src = gsub(src, "luai_userstateopen%b();", "{}")[m
[31m-  src = gsub(src, "luai_userstate%w+%b();", "")[m
[31m-  src = gsub(src, "%(%(c==.*luaY_parser%)", "luaY_parser")[m
[31m-  src = gsub(src, "trydecpoint%(ls,seminfo%)",[m
[31m-		  "luaX_lexerror(ls,\"malformed number\",TK_NUMBER)")[m
[31m-  src = gsub(src, "int c=luaZ_lookahead%b();", "")[m
[31m-  src = gsub(src, "luaL_register%(L,[^,]*,co_funcs%);\nreturn 2;",[m
[31m-		  "return 1;")[m
[31m-  src = gsub(src, "getfuncname%b():", "NULL:")[m
[31m-  src = gsub(src, "getobjname%b():", "NULL:")[m
[31m-  src = gsub(src, "if%([^\n]*hookmask[^\n]*%)\n[^\n]*\n", "")[m
[31m-  src = gsub(src, "if%([^\n]*hookmask[^\n]*%)%b{}\n", "")[m
[31m-  src = gsub(src, "if%([^\n]*hookmask[^\n]*&&\n[^\n]*%b{}\n", "")[m
[31m-  src = gsub(src, "(twoto%b()%()", "%1(size_t)")[m
[31m-  src = gsub(src, "i<sizenode", "i<(int)sizenode")[m
[31m-  src = gsub(src, "cast%(unsigned int,key%-1%)", "cast(unsigned int,key)-1")[m
[31m-  return gsub(src, "\n\n+", "\n")[m
[31m-end[m
[31m-[m
[31m-local function strip_comments(src)[m
[31m-  return gsub(src, "/%*.-%*/", " ")[m
[31m-end[m
[31m-[m
[31m-local function strip_whitespace(src)[m
[31m-  src = gsub(src, "^%s+", "")[m
[31m-  src = gsub(src, "%s*\n%s*", "\n")[m
[31m-  src = gsub(src, "[ \t]+", " ")[m
[31m-  src = gsub(src, "(%W) ", "%1")[m
[31m-  return gsub(src, " (%W)", "%1")[m
[31m-end[m
[31m-[m
[31m-local function rename_tokens1(src)[m
[31m-  src = gsub(src, "getline", "getline_")[m
[31m-  src = gsub(src, "struct ([%w_]+)", "ZX%1")[m
[31m-  return gsub(src, "union ([%w_]+)", "ZY%1")[m
[31m-end[m
[31m-[m
[31m-local function rename_tokens2(src)[m
[31m-  src = gsub(src, "ZX([%w_]+)", "struct %1")[m
[31m-  return gsub(src, "ZY([%w_]+)", "union %1")[m
[31m-end[m
[31m-[m
[31m-local function func_gather(src)[m
[31m-  local nodes, list = {}, {}[m
[31m-  local pos, len = 1, #src[m
[31m-  while pos < len do[m
[31m-    local d, w = match(src, "^(#define ([%w_]+)[^\n]*\n)", pos)[m
[31m-    if d then[m
[31m-      local n = #list+1[m
[31m-      list[n] = d[m
[31m-      nodes[w] = n[m
[31m-    else[m
[31m-      local s[m
[31m-      d, w, s = match(src, "^(([%w_]+)[^\n]*([{;])\n)", pos)[m
[31m-      if not d then[m
[31m-	d, w, s = match(src, "^(([%w_]+)[^(]*%b()([{;])\n)", pos)[m
[31m-	if not d then d = match(src, "^[^\n]*\n", pos) end[m
[31m-      end[m
[31m-      if s == "{" then[m
[31m-	d = d..sub(match(src, "^%b{}[^;\n]*;?\n", pos+#d-2), 3)[m
[31m-	if sub(d, -2) == "{\n" then[m
[31m-	  d = d..sub(match(src, "^%b{}[^;\n]*;?\n", pos+#d-2), 3)[m
[31m-	end[m
[31m-      end[m
[31m-      local k, v = nil, d[m
[31m-      if w == "typedef" then[m
[31m-	if match(d, "^typedef enum") then[m
[31m-	  head[#head+1] = d[m
[31m-	else[m
[31m-	  k = match(d, "([%w_]+);\n$")[m
[31m-	  if not k then k = match(d, "^.-%(.-([%w_]+)%)%(") end[m
[31m-	end[m
[31m-      elseif w == "enum" then[m
[31m-	head[#head+1] = v[m
[31m-      elseif w ~= nil then[m
[31m-	k = match(d, "^[^\n]-([%w_]+)[(%[=]")[m
[31m-	if k then[m
[31m-	  if w ~= "static" and k ~= "main" then v = "static "..d end[m
[31m-	else[m
[31m-	  k = w[m
[31m-	end[m
[31m-      end[m
[31m-      if w and k then[m
[31m-	local o = nodes[k][m
[31m-	if o then nodes["*"..k] = o end[m
[31m-	local n = #list+1[m
[31m-	list[n] = v[m
[31m-	nodes[k] = n[m
[31m-      end[m
[31m-    end[m
[31m-    pos = pos + #d[m
[31m-  end[m
[31m-  return nodes, list[m
[31m-end[m
[31m-[m
[31m-local function func_visit(nodes, list, used, n)[m
[31m-  local i = nodes[n][m
[31m-  for m in string.gmatch(list[i], "[%w_]+") do[m
[31m-    if nodes[m] then[m
[31m-      local j = used[m][m
[31m-      if not j then[m
[31m-	used[m] = i[m
[31m-	func_visit(nodes, list, used, m)[m
[31m-      elseif i < j then[m
[31m-	used[m] = i[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function func_collect(src)[m
[31m-  local nodes, list = func_gather(src)[m
[31m-  local used = {}[m
[31m-  func_visit(nodes, list, used, "main")[m
[31m-  for n,i in pairs(nodes) do[m
[31m-    local j = used[n][m
[31m-    if j and j < i then used["*"..n] = j end[m
[31m-  end[m
[31m-  for n,i in pairs(nodes) do[m
[31m-    if not used[n] then list[i] = "" end[m
[31m-  end[m
[31m-  return table.concat(list)[m
[31m-end[m
[31m-[m
[31m-find_sources()[m
[31m-local src = read_sources()[m
[31m-src = merge_includes(src)[m
[31m-local license = get_license(src)[m
[31m-src = fold_lines(src)[m
[31m-src = strip_unused1(src)[m
[31m-src = save_strings(src)[m
[31m-src = strip_unused2(src)[m
[31m-src = strip_comments(src)[m
[31m-src = preprocess(src)[m
[31m-src = strip_whitespace(src)[m
[31m-src = strip_unused3(src)[m
[31m-src = rename_tokens1(src)[m
[31m-src = func_collect(src)[m
[31m-src = rename_tokens2(src)[m
[31m-src = restore_strings(src)[m
[31m-src = merge_header(src, license)[m
[31m-io.write(src)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua.c[m
[1mdeleted file mode 100644[m
[1mindex 7915028..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/host/minilua.c[m
[1m+++ /dev/null[m
[36m@@ -1,7770 +0,0 @@[m
[31m-/* This is a heavily customized and minimized copy of Lua 5.1.5. */[m
[31m-/* It's only used to build LuaJIT. It does NOT have all standard functions! */[m
[31m-/******************************************************************************[m
[31m-* Copyright (C) 1994-2012 Lua.org, PUC-Rio.  All rights reserved.[m
[31m-*[m
[31m-* Permission is hereby granted, free of charge, to any person obtaining[m
[31m-* a copy of this software and associated documentation files (the[m
[31m-* "Software"), to deal in the Software without restriction, including[m
[31m-* without limitation the rights to use, copy, modify, merge, publish,[m
[31m-* distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-* permit persons to whom the Software is furnished to do so, subject to[m
[31m-* the following conditions:[m
[31m-*[m
[31m-* The above copyright notice and this permission notice shall be[m
[31m-* included in all copies or substantial portions of the Software.[m
[31m-*[m
[31m-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-******************************************************************************/[m
[31m-#ifdef _MSC_VER[m
[31m-typedef unsigned __int64 U64;[m
[31m-#else[m
[31m-typedef unsigned long long U64;[m
[31m-#endif[m
[31m-int _CRT_glob = 0;[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <limits.h>[m
[31m-#include <math.h>[m
[31m-#include <ctype.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-#include <setjmp.h>[m
[31m-#include <errno.h>[m
[31m-#include <time.h>[m
[31m-typedef enum{[m
[31m-TM_INDEX,[m
[31m-TM_NEWINDEX,[m
[31m-TM_GC,[m
[31m-TM_MODE,[m
[31m-TM_EQ,[m
[31m-TM_ADD,[m
[31m-TM_SUB,[m
[31m-TM_MUL,[m
[31m-TM_DIV,[m
[31m-TM_MOD,[m
[31m-TM_POW,[m
[31m-TM_UNM,[m
[31m-TM_LEN,[m
[31m-TM_LT,[m
[31m-TM_LE,[m
[31m-TM_CONCAT,[m
[31m-TM_CALL,[m
[31m-TM_N[m
[31m-}TMS;[m
[31m-enum OpMode{iABC,iABx,iAsBx};[m
[31m-typedef enum{[m
[31m-OP_MOVE,[m
[31m-OP_LOADK,[m
[31m-OP_LOADBOOL,[m
[31m-OP_LOADNIL,[m
[31m-OP_GETUPVAL,[m
[31m-OP_GETGLOBAL,[m
[31m-OP_GETTABLE,[m
[31m-OP_SETGLOBAL,[m
[31m-OP_SETUPVAL,[m
[31m-OP_SETTABLE,[m
[31m-OP_NEWTABLE,[m
[31m-OP_SELF,[m
[31m-OP_ADD,[m
[31m-OP_SUB,[m
[31m-OP_MUL,[m
[31m-OP_DIV,[m
[31m-OP_MOD,[m
[31m-OP_POW,[m
[31m-OP_UNM,[m
[31m-OP_NOT,[m
[31m-OP_LEN,[m
[31m-OP_CONCAT,[m
[31m-OP_JMP,[m
[31m-OP_EQ,[m
[31m-OP_LT,[m
[31m-OP_LE,[m
[31m-OP_TEST,[m
[31m-OP_TESTSET,[m
[31m-OP_CALL,[m
[31m-OP_TAILCALL,[m
[31m-OP_RETURN,[m
[31m-OP_FORLOOP,[m
[31m-OP_FORPREP,[m
[31m-OP_TFORLOOP,[m
[31m-OP_SETLIST,[m
[31m-OP_CLOSE,[m
[31m-OP_CLOSURE,[m
[31m-OP_VARARG[m
[31m-}OpCode;[m
[31m-enum OpArgMask{[m
[31m-OpArgN,[m
[31m-OpArgU,[m
[31m-OpArgR,[m
[31m-OpArgK[m
[31m-};[m
[31m-typedef enum{[m
[31m-VVOID,[m
[31m-VNIL,[m
[31m-VTRUE,[m
[31m-VFALSE,[m
[31m-VK,[m
[31m-VKNUM,[m
[31m-VLOCAL,[m
[31m-VUPVAL,[m
[31m-VGLOBAL,[m
[31m-VINDEXED,[m
[31m-VJMP,[m
[31m-VRELOCABLE,[m
[31m-VNONRELOC,[m
[31m-VCALL,[m
[31m-VVARARG[m
[31m-}expkind;[m
[31m-enum RESERVED{[m
[31m-TK_AND=257,TK_BREAK,[m
[31m-TK_DO,TK_ELSE,TK_ELSEIF,TK_END,TK_FALSE,TK_FOR,TK_FUNCTION,[m
[31m-TK_IF,TK_IN,TK_LOCAL,TK_NIL,TK_NOT,TK_OR,TK_REPEAT,[m
[31m-TK_RETURN,TK_THEN,TK_TRUE,TK_UNTIL,TK_WHILE,[m
[31m-TK_CONCAT,TK_DOTS,TK_EQ,TK_GE,TK_LE,TK_NE,TK_NUMBER,[m
[31m-TK_NAME,TK_STRING,TK_EOS[m
[31m-};[m
[31m-typedef enum BinOpr{[m
[31m-OPR_ADD,OPR_SUB,OPR_MUL,OPR_DIV,OPR_MOD,OPR_POW,[m
[31m-OPR_CONCAT,[m
[31m-OPR_NE,OPR_EQ,[m
[31m-OPR_LT,OPR_LE,OPR_GT,OPR_GE,[m
[31m-OPR_AND,OPR_OR,[m
[31m-OPR_NOBINOPR[m
[31m-}BinOpr;[m
[31m-typedef enum UnOpr{OPR_MINUS,OPR_NOT,OPR_LEN,OPR_NOUNOPR}UnOpr;[m
[31m-#define LUA_QL(x)"'"x"'"[m
[31m-#define luai_apicheck(L,o){(void)L;}[m
[31m-#define lua_number2str(s,n)sprintf((s),"%.14g",(n))[m
[31m-#define lua_str2number(s,p)strtod((s),(p))[m
[31m-#define luai_numadd(a,b)((a)+(b))[m
[31m-#define luai_numsub(a,b)((a)-(b))[m
[31m-#define luai_nummul(a,b)((a)*(b))[m
[31m-#define luai_numdiv(a,b)((a)/(b))[m
[31m-#define luai_nummod(a,b)((a)-floor((a)/(b))*(b))[m
[31m-#define luai_numpow(a,b)(pow(a,b))[m
[31m-#define luai_numunm(a)(-(a))[m
[31m-#define luai_numeq(a,b)((a)==(b))[m
[31m-#define luai_numlt(a,b)((a)<(b))[m
[31m-#define luai_numle(a,b)((a)<=(b))[m
[31m-#define luai_numisnan(a)(!luai_numeq((a),(a)))[m
[31m-#define lua_number2int(i,d)((i)=(int)(d))[m
[31m-#define lua_number2integer(i,d)((i)=(lua_Integer)(d))[m
[31m-#define LUAI_THROW(L,c)longjmp((c)->b,1)[m
[31m-#define LUAI_TRY(L,c,a)if(setjmp((c)->b)==0){a}[m
[31m-#define lua_pclose(L,file)((void)((void)L,file),0)[m
[31m-#define lua_upvalueindex(i)((-10002)-(i))[m
[31m-typedef struct lua_State lua_State;[m
[31m-typedef int(*lua_CFunction)(lua_State*L);[m
[31m-typedef const char*(*lua_Reader)(lua_State*L,void*ud,size_t*sz);[m
[31m-typedef void*(*lua_Alloc)(void*ud,void*ptr,size_t osize,size_t nsize);[m
[31m-typedef double lua_Number;[m
[31m-typedef ptrdiff_t lua_Integer;[m
[31m-static void lua_settop(lua_State*L,int idx);[m
[31m-static int lua_type(lua_State*L,int idx);[m
[31m-static const char* lua_tolstring(lua_State*L,int idx,size_t*len);[m
[31m-static size_t lua_objlen(lua_State*L,int idx);[m
[31m-static void lua_pushlstring(lua_State*L,const char*s,size_t l);[m
[31m-static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n);[m
[31m-static void lua_createtable(lua_State*L,int narr,int nrec);[m
[31m-static void lua_setfield(lua_State*L,int idx,const char*k);[m
[31m-#define lua_pop(L,n)lua_settop(L,-(n)-1)[m
[31m-#define lua_newtable(L)lua_createtable(L,0,0)[m
[31m-#define lua_pushcfunction(L,f)lua_pushcclosure(L,(f),0)[m
[31m-#define lua_strlen(L,i)lua_objlen(L,(i))[m
[31m-#define lua_isfunction(L,n)(lua_type(L,(n))==6)[m
[31m-#define lua_istable(L,n)(lua_type(L,(n))==5)[m
[31m-#define lua_isnil(L,n)(lua_type(L,(n))==0)[m
[31m-#define lua_isboolean(L,n)(lua_type(L,(n))==1)[m
[31m-#define lua_isnone(L,n)(lua_type(L,(n))==(-1))[m
[31m-#define lua_isnoneornil(L,n)(lua_type(L,(n))<=0)[m
[31m-#define lua_pushliteral(L,s)lua_pushlstring(L,""s,(sizeof(s)/sizeof(char))-1)[m
[31m-#define lua_setglobal(L,s)lua_setfield(L,(-10002),(s))[m
[31m-#define lua_tostring(L,i)lua_tolstring(L,(i),NULL)[m
[31m-typedef struct lua_Debug lua_Debug;[m
[31m-typedef void(*lua_Hook)(lua_State*L,lua_Debug*ar);[m
[31m-struct lua_Debug{[m
[31m-int event;[m
[31m-const char*name;[m
[31m-const char*namewhat;[m
[31m-const char*what;[m
[31m-const char*source;[m
[31m-int currentline;[m
[31m-int nups;[m
[31m-int linedefined;[m
[31m-int lastlinedefined;[m
[31m-char short_src[60];[m
[31m-int i_ci;[m
[31m-};[m
[31m-typedef unsigned int lu_int32;[m
[31m-typedef size_t lu_mem;[m
[31m-typedef ptrdiff_t l_mem;[m
[31m-typedef unsigned char lu_byte;[m
[31m-#define IntPoint(p)((unsigned int)(lu_mem)(p))[m
[31m-typedef union{double u;void*s;long l;}L_Umaxalign;[m
[31m-typedef double l_uacNumber;[m
[31m-#define check_exp(c,e)(e)[m
[31m-#define UNUSED(x)((void)(x))[m
[31m-#define cast(t,exp)((t)(exp))[m
[31m-#define cast_byte(i)cast(lu_byte,(i))[m
[31m-#define cast_num(i)cast(lua_Number,(i))[m
[31m-#define cast_int(i)cast(int,(i))[m
[31m-typedef lu_int32 Instruction;[m
[31m-#define condhardstacktests(x)((void)0)[m
[31m-typedef union GCObject GCObject;[m
[31m-typedef struct GCheader{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-}GCheader;[m
[31m-typedef union{[m
[31m-GCObject*gc;[m
[31m-void*p;[m
[31m-lua_Number n;[m
[31m-int b;[m
[31m-}Value;[m
[31m-typedef struct lua_TValue{[m
[31m-Value value;int tt;[m
[31m-}TValue;[m
[31m-#define ttisnil(o)(ttype(o)==0)[m
[31m-#define ttisnumber(o)(ttype(o)==3)[m
[31m-#define ttisstring(o)(ttype(o)==4)[m
[31m-#define ttistable(o)(ttype(o)==5)[m
[31m-#define ttisfunction(o)(ttype(o)==6)[m
[31m-#define ttisboolean(o)(ttype(o)==1)[m
[31m-#define ttisuserdata(o)(ttype(o)==7)[m
[31m-#define ttisthread(o)(ttype(o)==8)[m
[31m-#define ttislightuserdata(o)(ttype(o)==2)[m
[31m-#define ttype(o)((o)->tt)[m
[31m-#define gcvalue(o)check_exp(iscollectable(o),(o)->value.gc)[m
[31m-#define pvalue(o)check_exp(ttislightuserdata(o),(o)->value.p)[m
[31m-#define nvalue(o)check_exp(ttisnumber(o),(o)->value.n)[m
[31m-#define rawtsvalue(o)check_exp(ttisstring(o),&(o)->value.gc->ts)[m
[31m-#define tsvalue(o)(&rawtsvalue(o)->tsv)[m
[31m-#define rawuvalue(o)check_exp(ttisuserdata(o),&(o)->value.gc->u)[m
[31m-#define uvalue(o)(&rawuvalue(o)->uv)[m
[31m-#define clvalue(o)check_exp(ttisfunction(o),&(o)->value.gc->cl)[m
[31m-#define hvalue(o)check_exp(ttistable(o),&(o)->value.gc->h)[m
[31m-#define bvalue(o)check_exp(ttisboolean(o),(o)->value.b)[m
[31m-#define thvalue(o)check_exp(ttisthread(o),&(o)->value.gc->th)[m
[31m-#define l_isfalse(o)(ttisnil(o)||(ttisboolean(o)&&bvalue(o)==0))[m
[31m-#define checkconsistency(obj)[m
[31m-#define checkliveness(g,obj)[m
[31m-#define setnilvalue(obj)((obj)->tt=0)[m
[31m-#define setnvalue(obj,x){TValue*i_o=(obj);i_o->value.n=(x);i_o->tt=3;}[m
[31m-#define setbvalue(obj,x){TValue*i_o=(obj);i_o->value.b=(x);i_o->tt=1;}[m
[31m-#define setsvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=4;checkliveness(G(L),i_o);}[m
[31m-#define setuvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=7;checkliveness(G(L),i_o);}[m
[31m-#define setthvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=8;checkliveness(G(L),i_o);}[m
[31m-#define setclvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=6;checkliveness(G(L),i_o);}[m
[31m-#define sethvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=5;checkliveness(G(L),i_o);}[m
[31m-#define setptvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=(8+1);checkliveness(G(L),i_o);}[m
[31m-#define setobj(L,obj1,obj2){const TValue*o2=(obj2);TValue*o1=(obj1);o1->value=o2->value;o1->tt=o2->tt;checkliveness(G(L),o1);}[m
[31m-#define setttype(obj,tt)(ttype(obj)=(tt))[m
[31m-#define iscollectable(o)(ttype(o)>=4)[m
[31m-typedef TValue*StkId;[m
[31m-typedef union TString{[m
[31m-L_Umaxalign dummy;[m
[31m-struct{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-lu_byte reserved;[m
[31m-unsigned int hash;[m
[31m-size_t len;[m
[31m-}tsv;[m
[31m-}TString;[m
[31m-#define getstr(ts)cast(const char*,(ts)+1)[m
[31m-#define svalue(o)getstr(rawtsvalue(o))[m
[31m-typedef union Udata{[m
[31m-L_Umaxalign dummy;[m
[31m-struct{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-struct Table*metatable;[m
[31m-struct Table*env;[m
[31m-size_t len;[m
[31m-}uv;[m
[31m-}Udata;[m
[31m-typedef struct Proto{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-TValue*k;[m
[31m-Instruction*code;[m
[31m-struct Proto**p;[m
[31m-int*lineinfo;[m
[31m-struct LocVar*locvars;[m
[31m-TString**upvalues;[m
[31m-TString*source;[m
[31m-int sizeupvalues;[m
[31m-int sizek;[m
[31m-int sizecode;[m
[31m-int sizelineinfo;[m
[31m-int sizep;[m
[31m-int sizelocvars;[m
[31m-int linedefined;[m
[31m-int lastlinedefined;[m
[31m-GCObject*gclist;[m
[31m-lu_byte nups;[m
[31m-lu_byte numparams;[m
[31m-lu_byte is_vararg;[m
[31m-lu_byte maxstacksize;[m
[31m-}Proto;[m
[31m-typedef struct LocVar{[m
[31m-TString*varname;[m
[31m-int startpc;[m
[31m-int endpc;[m
[31m-}LocVar;[m
[31m-typedef struct UpVal{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-TValue*v;[m
[31m-union{[m
[31m-TValue value;[m
[31m-struct{[m
[31m-struct UpVal*prev;[m
[31m-struct UpVal*next;[m
[31m-}l;[m
[31m-}u;[m
[31m-}UpVal;[m
[31m-typedef struct CClosure{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env;[m
[31m-lua_CFunction f;[m
[31m-TValue upvalue[1];[m
[31m-}CClosure;[m
[31m-typedef struct LClosure{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env;[m
[31m-struct Proto*p;[m
[31m-UpVal*upvals[1];[m
[31m-}LClosure;[m
[31m-typedef union Closure{[m
[31m-CClosure c;[m
[31m-LClosure l;[m
[31m-}Closure;[m
[31m-#define iscfunction(o)(ttype(o)==6&&clvalue(o)->c.isC)[m
[31m-typedef union TKey{[m
[31m-struct{[m
[31m-Value value;int tt;[m
[31m-struct Node*next;[m
[31m-}nk;[m
[31m-TValue tvk;[m
[31m-}TKey;[m
[31m-typedef struct Node{[m
[31m-TValue i_val;[m
[31m-TKey i_key;[m
[31m-}Node;[m
[31m-typedef struct Table{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-lu_byte flags;[m
[31m-lu_byte lsizenode;[m
[31m-struct Table*metatable;[m
[31m-TValue*array;[m
[31m-Node*node;[m
[31m-Node*lastfree;[m
[31m-GCObject*gclist;[m
[31m-int sizearray;[m
[31m-}Table;[m
[31m-#define lmod(s,size)(check_exp((size&(size-1))==0,(cast(int,(s)&((size)-1)))))[m
[31m-#define twoto(x)((size_t)1<<(x))[m
[31m-#define sizenode(t)(twoto((t)->lsizenode))[m
[31m-static const TValue luaO_nilobject_;[m
[31m-#define ceillog2(x)(luaO_log2((x)-1)+1)[m
[31m-static int luaO_log2(unsigned int x);[m
[31m-#define gfasttm(g,et,e)((et)==NULL?NULL:((et)->flags&(1u<<(e)))?NULL:luaT_gettm(et,e,(g)->tmname[e]))[m
[31m-#define fasttm(l,et,e)gfasttm(G(l),et,e)[m
[31m-static const TValue*luaT_gettm(Table*events,TMS event,TString*ename);[m
[31m-#define luaM_reallocv(L,b,on,n,e)((cast(size_t,(n)+1)<=((size_t)(~(size_t)0)-2)/(e))?luaM_realloc_(L,(b),(on)*(e),(n)*(e)):luaM_toobig(L))[m
[31m-#define luaM_freemem(L,b,s)luaM_realloc_(L,(b),(s),0)[m
[31m-#define luaM_free(L,b)luaM_realloc_(L,(b),sizeof(*(b)),0)[m
[31m-#define luaM_freearray(L,b,n,t)luaM_reallocv(L,(b),n,0,sizeof(t))[m
[31m-#define luaM_malloc(L,t)luaM_realloc_(L,NULL,0,(t))[m
[31m-#define luaM_new(L,t)cast(t*,luaM_malloc(L,sizeof(t)))[m
[31m-#define luaM_newvector(L,n,t)cast(t*,luaM_reallocv(L,NULL,0,n,sizeof(t)))[m
[31m-#define luaM_growvector(L,v,nelems,size,t,limit,e)if((nelems)+1>(size))((v)=cast(t*,luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))[m
[31m-#define luaM_reallocvector(L,v,oldn,n,t)((v)=cast(t*,luaM_reallocv(L,v,oldn,n,sizeof(t))))[m
[31m-static void*luaM_realloc_(lua_State*L,void*block,size_t oldsize,[m
[31m-size_t size);[m
[31m-static void*luaM_toobig(lua_State*L);[m
[31m-static void*luaM_growaux_(lua_State*L,void*block,int*size,[m
[31m-size_t size_elem,int limit,[m
[31m-const char*errormsg);[m
[31m-typedef struct Zio ZIO;[m
[31m-#define char2int(c)cast(int,cast(unsigned char,(c)))[m
[31m-#define zgetc(z)(((z)->n--)>0?char2int(*(z)->p++):luaZ_fill(z))[m
[31m-typedef struct Mbuffer{[m
[31m-char*buffer;[m
[31m-size_t n;[m
[31m-size_t buffsize;[m
[31m-}Mbuffer;[m
[31m-#define luaZ_initbuffer(L,buff)((buff)->buffer=NULL,(buff)->buffsize=0)[m
[31m-#define luaZ_buffer(buff)((buff)->buffer)[m
[31m-#define luaZ_sizebuffer(buff)((buff)->buffsize)[m
[31m-#define luaZ_bufflen(buff)((buff)->n)[m
[31m-#define luaZ_resetbuffer(buff)((buff)->n=0)[m
[31m-#define luaZ_resizebuffer(L,buff,size)(luaM_reallocvector(L,(buff)->buffer,(buff)->buffsize,size,char),(buff)->buffsize=size)[m
[31m-#define luaZ_freebuffer(L,buff)luaZ_resizebuffer(L,buff,0)[m
[31m-struct Zio{[m
[31m-size_t n;[m
[31m-const char*p;[m
[31m-lua_Reader reader;[m
[31m-void*data;[m
[31m-lua_State*L;[m
[31m-};[m
[31m-static int luaZ_fill(ZIO*z);[m
[31m-struct lua_longjmp;[m
[31m-#define gt(L)(&L->l_gt)[m
[31m-#define registry(L)(&G(L)->l_registry)[m
[31m-typedef struct stringtable{[m
[31m-GCObject**hash;[m
[31m-lu_int32 nuse;[m
[31m-int size;[m
[31m-}stringtable;[m
[31m-typedef struct CallInfo{[m
[31m-StkId base;[m
[31m-StkId func;[m
[31m-StkId top;[m
[31m-const Instruction*savedpc;[m
[31m-int nresults;[m
[31m-int tailcalls;[m
[31m-}CallInfo;[m
[31m-#define curr_func(L)(clvalue(L->ci->func))[m
[31m-#define ci_func(ci)(clvalue((ci)->func))[m
[31m-#define f_isLua(ci)(!ci_func(ci)->c.isC)[m
[31m-#define isLua(ci)(ttisfunction((ci)->func)&&f_isLua(ci))[m
[31m-typedef struct global_State{[m
[31m-stringtable strt;[m
[31m-lua_Alloc frealloc;[m
[31m-void*ud;[m
[31m-lu_byte currentwhite;[m
[31m-lu_byte gcstate;[m
[31m-int sweepstrgc;[m
[31m-GCObject*rootgc;[m
[31m-GCObject**sweepgc;[m
[31m-GCObject*gray;[m
[31m-GCObject*grayagain;[m
[31m-GCObject*weak;[m
[31m-GCObject*tmudata;[m
[31m-Mbuffer buff;[m
[31m-lu_mem GCthreshold;[m
[31m-lu_mem totalbytes;[m
[31m-lu_mem estimate;[m
[31m-lu_mem gcdept;[m
[31m-int gcpause;[m
[31m-int gcstepmul;[m
[31m-lua_CFunction panic;[m
[31m-TValue l_registry;[m
[31m-struct lua_State*mainthread;[m
[31m-UpVal uvhead;[m
[31m-struct Table*mt[(8+1)];[m
[31m-TString*tmname[TM_N];[m
[31m-}global_State;[m
[31m-struct lua_State{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-lu_byte status;[m
[31m-StkId top;[m
[31m-StkId base;[m
[31m-global_State*l_G;[m
[31m-CallInfo*ci;[m
[31m-const Instruction*savedpc;[m
[31m-StkId stack_last;[m
[31m-StkId stack;[m
[31m-CallInfo*end_ci;[m
[31m-CallInfo*base_ci;[m
[31m-int stacksize;[m
[31m-int size_ci;[m
[31m-unsigned short nCcalls;[m
[31m-unsigned short baseCcalls;[m
[31m-lu_byte hookmask;[m
[31m-lu_byte allowhook;[m
[31m-int basehookcount;[m
[31m-int hookcount;[m
[31m-lua_Hook hook;[m
[31m-TValue l_gt;[m
[31m-TValue env;[m
[31m-GCObject*openupval;[m
[31m-GCObject*gclist;[m
[31m-struct lua_longjmp*errorJmp;[m
[31m-ptrdiff_t errfunc;[m
[31m-};[m
[31m-#define G(L)(L->l_G)[m
[31m-union GCObject{[m
[31m-GCheader gch;[m
[31m-union TString ts;[m
[31m-union Udata u;[m
[31m-union Closure cl;[m
[31m-struct Table h;[m
[31m-struct Proto p;[m
[31m-struct UpVal uv;[m
[31m-struct lua_State th;[m
[31m-};[m
[31m-#define rawgco2ts(o)check_exp((o)->gch.tt==4,&((o)->ts))[m
[31m-#define gco2ts(o)(&rawgco2ts(o)->tsv)[m
[31m-#define rawgco2u(o)check_exp((o)->gch.tt==7,&((o)->u))[m
[31m-#define gco2u(o)(&rawgco2u(o)->uv)[m
[31m-#define gco2cl(o)check_exp((o)->gch.tt==6,&((o)->cl))[m
[31m-#define gco2h(o)check_exp((o)->gch.tt==5,&((o)->h))[m
[31m-#define gco2p(o)check_exp((o)->gch.tt==(8+1),&((o)->p))[m
[31m-#define gco2uv(o)check_exp((o)->gch.tt==(8+2),&((o)->uv))[m
[31m-#define ngcotouv(o)check_exp((o)==NULL||(o)->gch.tt==(8+2),&((o)->uv))[m
[31m-#define gco2th(o)check_exp((o)->gch.tt==8,&((o)->th))[m
[31m-#define obj2gco(v)(cast(GCObject*,(v)))[m
[31m-static void luaE_freethread(lua_State*L,lua_State*L1);[m
[31m-#define pcRel(pc,p)(cast(int,(pc)-(p)->code)-1)[m
[31m-#define getline_(f,pc)(((f)->lineinfo)?(f)->lineinfo[pc]:0)[m
[31m-#define resethookcount(L)(L->hookcount=L->basehookcount)[m
[31m-static void luaG_typeerror(lua_State*L,const TValue*o,[m
[31m-const char*opname);[m
[31m-static void luaG_runerror(lua_State*L,const char*fmt,...);[m
[31m-#define luaD_checkstack(L,n)if((char*)L->stack_last-(char*)L->top<=(n)*(int)sizeof(TValue))luaD_growstack(L,n);else condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));[m
[31m-#define incr_top(L){luaD_checkstack(L,1);L->top++;}[m
[31m-#define savestack(L,p)((char*)(p)-(char*)L->stack)[m
[31m-#define restorestack(L,n)((TValue*)((char*)L->stack+(n)))[m
[31m-#define saveci(L,p)((char*)(p)-(char*)L->base_ci)[m
[31m-#define restoreci(L,n)((CallInfo*)((char*)L->base_ci+(n)))[m
[31m-typedef void(*Pfunc)(lua_State*L,void*ud);[m
[31m-static int luaD_poscall(lua_State*L,StkId firstResult);[m
[31m-static void luaD_reallocCI(lua_State*L,int newsize);[m
[31m-static void luaD_reallocstack(lua_State*L,int newsize);[m
[31m-static void luaD_growstack(lua_State*L,int n);[m
[31m-static void luaD_throw(lua_State*L,int errcode);[m
[31m-static void*luaM_growaux_(lua_State*L,void*block,int*size,size_t size_elems,[m
[31m-int limit,const char*errormsg){[m
[31m-void*newblock;[m
[31m-int newsize;[m
[31m-if(*size>=limit/2){[m
[31m-if(*size>=limit)[m
[31m-luaG_runerror(L,errormsg);[m
[31m-newsize=limit;[m
[31m-}[m
[31m-else{[m
[31m-newsize=(*size)*2;[m
[31m-if(newsize<4)[m
[31m-newsize=4;[m
[31m-}[m
[31m-newblock=luaM_reallocv(L,block,*size,newsize,size_elems);[m
[31m-*size=newsize;[m
[31m-return newblock;[m
[31m-}[m
[31m-static void*luaM_toobig(lua_State*L){[m
[31m-luaG_runerror(L,"memory allocation error: block too big");[m
[31m-return NULL;[m
[31m-}[m
[31m-static void*luaM_realloc_(lua_State*L,void*block,size_t osize,size_t nsize){[m
[31m-global_State*g=G(L);[m
[31m-block=(*g->frealloc)(g->ud,block,osize,nsize);[m
[31m-if(block==NULL&&nsize>0)[m
[31m-luaD_throw(L,4);[m
[31m-g->totalbytes=(g->totalbytes-osize)+nsize;[m
[31m-return block;[m
[31m-}[m
[31m-#define resetbits(x,m)((x)&=cast(lu_byte,~(m)))[m
[31m-#define setbits(x,m)((x)|=(m))[m
[31m-#define testbits(x,m)((x)&(m))[m
[31m-#define bitmask(b)(1<<(b))[m
[31m-#define bit2mask(b1,b2)(bitmask(b1)|bitmask(b2))[m
[31m-#define l_setbit(x,b)setbits(x,bitmask(b))[m
[31m-#define resetbit(x,b)resetbits(x,bitmask(b))[m
[31m-#define testbit(x,b)testbits(x,bitmask(b))[m
[31m-#define set2bits(x,b1,b2)setbits(x,(bit2mask(b1,b2)))[m
[31m-#define reset2bits(x,b1,b2)resetbits(x,(bit2mask(b1,b2)))[m
[31m-#define test2bits(x,b1,b2)testbits(x,(bit2mask(b1,b2)))[m
[31m-#define iswhite(x)test2bits((x)->gch.marked,0,1)[m
[31m-#define isblack(x)testbit((x)->gch.marked,2)[m
[31m-#define isgray(x)(!isblack(x)&&!iswhite(x))[m
[31m-#define otherwhite(g)(g->currentwhite^bit2mask(0,1))[m
[31m-#define isdead(g,v)((v)->gch.marked&otherwhite(g)&bit2mask(0,1))[m
[31m-#define changewhite(x)((x)->gch.marked^=bit2mask(0,1))[m
[31m-#define gray2black(x)l_setbit((x)->gch.marked,2)[m
[31m-#define valiswhite(x)(iscollectable(x)&&iswhite(gcvalue(x)))[m
[31m-#define luaC_white(g)cast(lu_byte,(g)->currentwhite&bit2mask(0,1))[m
[31m-#define luaC_checkGC(L){condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));if(G(L)->totalbytes>=G(L)->GCthreshold)luaC_step(L);}[m
[31m-#define luaC_barrier(L,p,v){if(valiswhite(v)&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),gcvalue(v));}[m
[31m-#define luaC_barriert(L,t,v){if(valiswhite(v)&&isblack(obj2gco(t)))luaC_barrierback(L,t);}[m
[31m-#define luaC_objbarrier(L,p,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),obj2gco(o));}[m
[31m-#define luaC_objbarriert(L,t,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(t)))luaC_barrierback(L,t);}[m
[31m-static void luaC_step(lua_State*L);[m
[31m-static void luaC_link(lua_State*L,GCObject*o,lu_byte tt);[m
[31m-static void luaC_linkupval(lua_State*L,UpVal*uv);[m
[31m-static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v);[m
[31m-static void luaC_barrierback(lua_State*L,Table*t);[m
[31m-#define sizestring(s)(sizeof(union TString)+((s)->len+1)*sizeof(char))[m
[31m-#define sizeudata(u)(sizeof(union Udata)+(u)->len)[m
[31m-#define luaS_new(L,s)(luaS_newlstr(L,s,strlen(s)))[m
[31m-#define luaS_newliteral(L,s)(luaS_newlstr(L,""s,(sizeof(s)/sizeof(char))-1))[m
[31m-#define luaS_fix(s)l_setbit((s)->tsv.marked,5)[m
[31m-static TString*luaS_newlstr(lua_State*L,const char*str,size_t l);[m
[31m-#define tostring(L,o)((ttype(o)==4)||(luaV_tostring(L,o)))[m
[31m-#define tonumber(o,n)(ttype(o)==3||(((o)=luaV_tonumber(o,n))!=NULL))[m
[31m-#define equalobj(L,o1,o2)(ttype(o1)==ttype(o2)&&luaV_equalval(L,o1,o2))[m
[31m-static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2);[m
[31m-static const TValue*luaV_tonumber(const TValue*obj,TValue*n);[m
[31m-static int luaV_tostring(lua_State*L,StkId obj);[m
[31m-static void luaV_execute(lua_State*L,int nexeccalls);[m
[31m-static void luaV_concat(lua_State*L,int total,int last);[m
[31m-static const TValue luaO_nilobject_={{NULL},0};[m
[31m-static int luaO_int2fb(unsigned int x){[m
[31m-int e=0;[m
[31m-while(x>=16){[m
[31m-x=(x+1)>>1;[m
[31m-e++;[m
[31m-}[m
[31m-if(x<8)return x;[m
[31m-else return((e+1)<<3)|(cast_int(x)-8);[m
[31m-}[m
[31m-static int luaO_fb2int(int x){[m
[31m-int e=(x>>3)&31;[m
[31m-if(e==0)return x;[m
[31m-else return((x&7)+8)<<(e-1);[m
[31m-}[m
[31m-static int luaO_log2(unsigned int x){[m
[31m-static const lu_byte log_2[256]={[m
[31m-0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,[m
[31m-6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,[m
[31m-7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,[m
[31m-7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,[m
[31m-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8[m
[31m-};[m
[31m-int l=-1;[m
[31m-while(x>=256){l+=8;x>>=8;}[m
[31m-return l+log_2[x];[m
[31m-}[m
[31m-static int luaO_rawequalObj(const TValue*t1,const TValue*t2){[m
[31m-if(ttype(t1)!=ttype(t2))return 0;[m
[31m-else switch(ttype(t1)){[m
[31m-case 0:[m
[31m-return 1;[m
[31m-case 3:[m
[31m-return luai_numeq(nvalue(t1),nvalue(t2));[m
[31m-case 1:[m
[31m-return bvalue(t1)==bvalue(t2);[m
[31m-case 2:[m
[31m-return pvalue(t1)==pvalue(t2);[m
[31m-default:[m
[31m-return gcvalue(t1)==gcvalue(t2);[m
[31m-}[m
[31m-}[m
[31m-static int luaO_str2d(const char*s,lua_Number*result){[m
[31m-char*endptr;[m
[31m-*result=lua_str2number(s,&endptr);[m
[31m-if(endptr==s)return 0;[m
[31m-if(*endptr=='x'||*endptr=='X')[m
[31m-*result=cast_num(strtoul(s,&endptr,16));[m
[31m-if(*endptr=='\0')return 1;[m
[31m-while(isspace(cast(unsigned char,*endptr)))endptr++;[m
[31m-if(*endptr!='\0')return 0;[m
[31m-return 1;[m
[31m-}[m
[31m-static void pushstr(lua_State*L,const char*str){[m
[31m-setsvalue(L,L->top,luaS_new(L,str));[m
[31m-incr_top(L);[m
[31m-}[m
[31m-static const char*luaO_pushvfstring(lua_State*L,const char*fmt,va_list argp){[m
[31m-int n=1;[m
[31m-pushstr(L,"");[m
[31m-for(;;){[m
[31m-const char*e=strchr(fmt,'%');[m
[31m-if(e==NULL)break;[m
[31m-setsvalue(L,L->top,luaS_newlstr(L,fmt,e-fmt));[m
[31m-incr_top(L);[m
[31m-switch(*(e+1)){[m
[31m-case's':{[m
[31m-const char*s=va_arg(argp,char*);[m
[31m-if(s==NULL)s="(null)";[m
[31m-pushstr(L,s);[m
[31m-break;[m
[31m-}[m
[31m-case'c':{[m
[31m-char buff[2];[m
[31m-buff[0]=cast(char,va_arg(argp,int));[m
[31m-buff[1]='\0';[m
[31m-pushstr(L,buff);[m
[31m-break;[m
[31m-}[m
[31m-case'd':{[m
[31m-setnvalue(L->top,cast_num(va_arg(argp,int)));[m
[31m-incr_top(L);[m
[31m-break;[m
[31m-}[m
[31m-case'f':{[m
[31m-setnvalue(L->top,cast_num(va_arg(argp,l_uacNumber)));[m
[31m-incr_top(L);[m
[31m-break;[m
[31m-}[m
[31m-case'p':{[m
[31m-char buff[4*sizeof(void*)+8];[m
[31m-sprintf(buff,"%p",va_arg(argp,void*));[m
[31m-pushstr(L,buff);[m
[31m-break;[m
[31m-}[m
[31m-case'%':{[m
[31m-pushstr(L,"%");[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-char buff[3];[m
[31m-buff[0]='%';[m
[31m-buff[1]=*(e+1);[m
[31m-buff[2]='\0';[m
[31m-pushstr(L,buff);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-n+=2;[m
[31m-fmt=e+2;[m
[31m-}[m
[31m-pushstr(L,fmt);[m
[31m-luaV_concat(L,n+1,cast_int(L->top-L->base)-1);[m
[31m-L->top-=n;[m
[31m-return svalue(L->top-1);[m
[31m-}[m
[31m-static const char*luaO_pushfstring(lua_State*L,const char*fmt,...){[m
[31m-const char*msg;[m
[31m-va_list argp;[m
[31m-va_start(argp,fmt);[m
[31m-msg=luaO_pushvfstring(L,fmt,argp);[m
[31m-va_end(argp);[m
[31m-return msg;[m
[31m-}[m
[31m-static void luaO_chunkid(char*out,const char*source,size_t bufflen){[m
[31m-if(*source=='='){[m
[31m-strncpy(out,source+1,bufflen);[m
[31m-out[bufflen-1]='\0';[m
[31m-}[m
[31m-else{[m
[31m-if(*source=='@'){[m
[31m-size_t l;[m
[31m-source++;[m
[31m-bufflen-=sizeof(" '...' ");[m
[31m-l=strlen(source);[m
[31m-strcpy(out,"");[m
[31m-if(l>bufflen){[m
[31m-source+=(l-bufflen);[m
[31m-strcat(out,"...");[m
[31m-}[m
[31m-strcat(out,source);[m
[31m-}[m
[31m-else{[m
[31m-size_t len=strcspn(source,"\n\r");[m
[31m-bufflen-=sizeof(" [string \"...\"] ");[m
[31m-if(len>bufflen)len=bufflen;[m
[31m-strcpy(out,"[string \"");[m
[31m-if(source[len]!='\0'){[m
[31m-strncat(out,source,len);[m
[31m-strcat(out,"...");[m
[31m-}[m
[31m-else[m
[31m-strcat(out,source);[m
[31m-strcat(out,"\"]");[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-#define gnode(t,i)(&(t)->node[i])[m
[31m-#define gkey(n)(&(n)->i_key.nk)[m
[31m-#define gval(n)(&(n)->i_val)[m
[31m-#define gnext(n)((n)->i_key.nk.next)[m
[31m-#define key2tval(n)(&(n)->i_key.tvk)[m
[31m-static TValue*luaH_setnum(lua_State*L,Table*t,int key);[m
[31m-static const TValue*luaH_getstr(Table*t,TString*key);[m
[31m-static TValue*luaH_set(lua_State*L,Table*t,const TValue*key);[m
[31m-static const char*const luaT_typenames[]={[m
[31m-"nil","boolean","userdata","number",[m
[31m-"string","table","function","userdata","thread",[m
[31m-"proto","upval"[m
[31m-};[m
[31m-static void luaT_init(lua_State*L){[m
[31m-static const char*const luaT_eventname[]={[m
[31m-"__index","__newindex",[m
[31m-"__gc","__mode","__eq",[m
[31m-"__add","__sub","__mul","__div","__mod",[m
[31m-"__pow","__unm","__len","__lt","__le",[m
[31m-"__concat","__call"[m
[31m-};[m
[31m-int i;[m
[31m-for(i=0;i<TM_N;i++){[m
[31m-G(L)->tmname[i]=luaS_new(L,luaT_eventname[i]);[m
[31m-luaS_fix(G(L)->tmname[i]);[m
[31m-}[m
[31m-}[m
[31m-static const TValue*luaT_gettm(Table*events,TMS event,TString*ename){[m
[31m-const TValue*tm=luaH_getstr(events,ename);[m
[31m-if(ttisnil(tm)){[m
[31m-events->flags|=cast_byte(1u<<event);[m
[31m-return NULL;[m
[31m-}[m
[31m-else return tm;[m
[31m-}[m
[31m-static const TValue*luaT_gettmbyobj(lua_State*L,const TValue*o,TMS event){[m
[31m-Table*mt;[m
[31m-switch(ttype(o)){[m
[31m-case 5:[m
[31m-mt=hvalue(o)->metatable;[m
[31m-break;[m
[31m-case 7:[m
[31m-mt=uvalue(o)->metatable;[m
[31m-break;[m
[31m-default:[m
[31m-mt=G(L)->mt[ttype(o)];[m
[31m-}[m
[31m-return(mt?luaH_getstr(mt,G(L)->tmname[event]):(&luaO_nilobject_));[m
[31m-}[m
[31m-#define sizeCclosure(n)(cast(int,sizeof(CClosure))+cast(int,sizeof(TValue)*((n)-1)))[m
[31m-#define sizeLclosure(n)(cast(int,sizeof(LClosure))+cast(int,sizeof(TValue*)*((n)-1)))[m
[31m-static Closure*luaF_newCclosure(lua_State*L,int nelems,Table*e){[m
[31m-Closure*c=cast(Closure*,luaM_malloc(L,sizeCclosure(nelems)));[m
[31m-luaC_link(L,obj2gco(c),6);[m
[31m-c->c.isC=1;[m
[31m-c->c.env=e;[m
[31m-c->c.nupvalues=cast_byte(nelems);[m
[31m-return c;[m
[31m-}[m
[31m-static Closure*luaF_newLclosure(lua_State*L,int nelems,Table*e){[m
[31m-Closure*c=cast(Closure*,luaM_malloc(L,sizeLclosure(nelems)));[m
[31m-luaC_link(L,obj2gco(c),6);[m
[31m-c->l.isC=0;[m
[31m-c->l.env=e;[m
[31m-c->l.nupvalues=cast_byte(nelems);[m
[31m-while(nelems--)c->l.upvals[nelems]=NULL;[m
[31m-return c;[m
[31m-}[m
[31m-static UpVal*luaF_newupval(lua_State*L){[m
[31m-UpVal*uv=luaM_new(L,UpVal);[m
[31m-luaC_link(L,obj2gco(uv),(8+2));[m
[31m-uv->v=&uv->u.value;[m
[31m-setnilvalue(uv->v);[m
[31m-return uv;[m
[31m-}[m
[31m-static UpVal*luaF_findupval(lua_State*L,StkId level){[m
[31m-global_State*g=G(L);[m
[31m-GCObject**pp=&L->openupval;[m
[31m-UpVal*p;[m
[31m-UpVal*uv;[m
[31m-while(*pp!=NULL&&(p=ngcotouv(*pp))->v>=level){[m
[31m-if(p->v==level){[m
[31m-if(isdead(g,obj2gco(p)))[m
[31m-changewhite(obj2gco(p));[m
[31m-return p;[m
[31m-}[m
[31m-pp=&p->next;[m
[31m-}[m
[31m-uv=luaM_new(L,UpVal);[m
[31m-uv->tt=(8+2);[m
[31m-uv->marked=luaC_white(g);[m
[31m-uv->v=level;[m
[31m-uv->next=*pp;[m
[31m-*pp=obj2gco(uv);[m
[31m-uv->u.l.prev=&g->uvhead;[m
[31m-uv->u.l.next=g->uvhead.u.l.next;[m
[31m-uv->u.l.next->u.l.prev=uv;[m
[31m-g->uvhead.u.l.next=uv;[m
[31m-return uv;[m
[31m-}[m
[31m-static void unlinkupval(UpVal*uv){[m
[31m-uv->u.l.next->u.l.prev=uv->u.l.prev;[m
[31m-uv->u.l.prev->u.l.next=uv->u.l.next;[m
[31m-}[m
[31m-static void luaF_freeupval(lua_State*L,UpVal*uv){[m
[31m-if(uv->v!=&uv->u.value)[m
[31m-unlinkupval(uv);[m
[31m-luaM_free(L,uv);[m
[31m-}[m
[31m-static void luaF_close(lua_State*L,StkId level){[m
[31m-UpVal*uv;[m
[31m-global_State*g=G(L);[m
[31m-while(L->openupval!=NULL&&(uv=ngcotouv(L->openupval))->v>=level){[m
[31m-GCObject*o=obj2gco(uv);[m
[31m-L->openupval=uv->next;[m
[31m-if(isdead(g,o))[m
[31m-luaF_freeupval(L,uv);[m
[31m-else{[m
[31m-unlinkupval(uv);[m
[31m-setobj(L,&uv->u.value,uv->v);[m
[31m-uv->v=&uv->u.value;[m
[31m-luaC_linkupval(L,uv);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static Proto*luaF_newproto(lua_State*L){[m
[31m-Proto*f=luaM_new(L,Proto);[m
[31m-luaC_link(L,obj2gco(f),(8+1));[m
[31m-f->k=NULL;[m
[31m-f->sizek=0;[m
[31m-f->p=NULL;[m
[31m-f->sizep=0;[m
[31m-f->code=NULL;[m
[31m-f->sizecode=0;[m
[31m-f->sizelineinfo=0;[m
[31m-f->sizeupvalues=0;[m
[31m-f->nups=0;[m
[31m-f->upvalues=NULL;[m
[31m-f->numparams=0;[m
[31m-f->is_vararg=0;[m
[31m-f->maxstacksize=0;[m
[31m-f->lineinfo=NULL;[m
[31m-f->sizelocvars=0;[m
[31m-f->locvars=NULL;[m
[31m-f->linedefined=0;[m
[31m-f->lastlinedefined=0;[m
[31m-f->source=NULL;[m
[31m-return f;[m
[31m-}[m
[31m-static void luaF_freeproto(lua_State*L,Proto*f){[m
[31m-luaM_freearray(L,f->code,f->sizecode,Instruction);[m
[31m-luaM_freearray(L,f->p,f->sizep,Proto*);[m
[31m-luaM_freearray(L,f->k,f->sizek,TValue);[m
[31m-luaM_freearray(L,f->lineinfo,f->sizelineinfo,int);[m
[31m-luaM_freearray(L,f->locvars,f->sizelocvars,struct LocVar);[m
[31m-luaM_freearray(L,f->upvalues,f->sizeupvalues,TString*);[m
[31m-luaM_free(L,f);[m
[31m-}[m
[31m-static void luaF_freeclosure(lua_State*L,Closure*c){[m
[31m-int size=(c->c.isC)?sizeCclosure(c->c.nupvalues):[m
[31m-sizeLclosure(c->l.nupvalues);[m
[31m-luaM_freemem(L,c,size);[m
[31m-}[m
[31m-#define MASK1(n,p)((~((~(Instruction)0)<<n))<<p)[m
[31m-#define MASK0(n,p)(~MASK1(n,p))[m
[31m-#define GET_OPCODE(i)(cast(OpCode,((i)>>0)&MASK1(6,0)))[m
[31m-#define SET_OPCODE(i,o)((i)=(((i)&MASK0(6,0))|((cast(Instruction,o)<<0)&MASK1(6,0))))[m
[31m-#define GETARG_A(i)(cast(int,((i)>>(0+6))&MASK1(8,0)))[m
[31m-#define SETARG_A(i,u)((i)=(((i)&MASK0(8,(0+6)))|((cast(Instruction,u)<<(0+6))&MASK1(8,(0+6)))))[m
[31m-#define GETARG_B(i)(cast(int,((i)>>(((0+6)+8)+9))&MASK1(9,0)))[m
[31m-#define SETARG_B(i,b)((i)=(((i)&MASK0(9,(((0+6)+8)+9)))|((cast(Instruction,b)<<(((0+6)+8)+9))&MASK1(9,(((0+6)+8)+9)))))[m
[31m-#define GETARG_C(i)(cast(int,((i)>>((0+6)+8))&MASK1(9,0)))[m
[31m-#define SETARG_C(i,b)((i)=(((i)&MASK0(9,((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1(9,((0+6)+8)))))[m
[31m-#define GETARG_Bx(i)(cast(int,((i)>>((0+6)+8))&MASK1((9+9),0)))[m
[31m-#define SETARG_Bx(i,b)((i)=(((i)&MASK0((9+9),((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1((9+9),((0+6)+8)))))[m
[31m-#define GETARG_sBx(i)(GETARG_Bx(i)-(((1<<(9+9))-1)>>1))[m
[31m-#define SETARG_sBx(i,b)SETARG_Bx((i),cast(unsigned int,(b)+(((1<<(9+9))-1)>>1)))[m
[31m-#define CREATE_ABC(o,a,b,c)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,b)<<(((0+6)+8)+9))|(cast(Instruction,c)<<((0+6)+8)))[m
[31m-#define CREATE_ABx(o,a,bc)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,bc)<<((0+6)+8)))[m
[31m-#define ISK(x)((x)&(1<<(9-1)))[m
[31m-#define INDEXK(r)((int)(r)&~(1<<(9-1)))[m
[31m-#define RKASK(x)((x)|(1<<(9-1)))[m
[31m-static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)];[m
[31m-#define getBMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>4)&3))[m
[31m-#define getCMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>2)&3))[m
[31m-#define testTMode(m)(luaP_opmodes[m]&(1<<7))[m
[31m-typedef struct expdesc{[m
[31m-expkind k;[m
[31m-union{[m
[31m-struct{int info,aux;}s;[m
[31m-lua_Number nval;[m
[31m-}u;[m
[31m-int t;[m
[31m-int f;[m
[31m-}expdesc;[m
[31m-typedef struct upvaldesc{[m
[31m-lu_byte k;[m
[31m-lu_byte info;[m
[31m-}upvaldesc;[m
[31m-struct BlockCnt;[m
[31m-typedef struct FuncState{[m
[31m-Proto*f;[m
[31m-Table*h;[m
[31m-struct FuncState*prev;[m
[31m-struct LexState*ls;[m
[31m-struct lua_State*L;[m
[31m-struct BlockCnt*bl;[m
[31m-int pc;[m
[31m-int lasttarget;[m
[31m-int jpc;[m
[31m-int freereg;[m
[31m-int nk;[m
[31m-int np;[m
[31m-short nlocvars;[m
[31m-lu_byte nactvar;[m
[31m-upvaldesc upvalues[60];[m
[31m-unsigned short actvar[200];[m
[31m-}FuncState;[m
[31m-static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,[m
[31m-const char*name);[m
[31m-struct lua_longjmp{[m
[31m-struct lua_longjmp*previous;[m
[31m-jmp_buf b;[m
[31m-volatile int status;[m
[31m-};[m
[31m-static void luaD_seterrorobj(lua_State*L,int errcode,StkId oldtop){[m
[31m-switch(errcode){[m
[31m-case 4:{[m
[31m-setsvalue(L,oldtop,luaS_newliteral(L,"not enough memory"));[m
[31m-break;[m
[31m-}[m
[31m-case 5:{[m
[31m-setsvalue(L,oldtop,luaS_newliteral(L,"error in error handling"));[m
[31m-break;[m
[31m-}[m
[31m-case 3:[m
[31m-case 2:{[m
[31m-setobj(L,oldtop,L->top-1);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-L->top=oldtop+1;[m
[31m-}[m
[31m-static void restore_stack_limit(lua_State*L){[m
[31m-if(L->size_ci>20000){[m
[31m-int inuse=cast_int(L->ci-L->base_ci);[m
[31m-if(inuse+1<20000)[m
[31m-luaD_reallocCI(L,20000);[m
[31m-}[m
[31m-}[m
[31m-static void resetstack(lua_State*L,int status){[m
[31m-L->ci=L->base_ci;[m
[31m-L->base=L->ci->base;[m
[31m-luaF_close(L,L->base);[m
[31m-luaD_seterrorobj(L,status,L->base);[m
[31m-L->nCcalls=L->baseCcalls;[m
[31m-L->allowhook=1;[m
[31m-restore_stack_limit(L);[m
[31m-L->errfunc=0;[m
[31m-L->errorJmp=NULL;[m
[31m-}[m
[31m-static void luaD_throw(lua_State*L,int errcode){[m
[31m-if(L->errorJmp){[m
[31m-L->errorJmp->status=errcode;[m
[31m-LUAI_THROW(L,L->errorJmp);[m
[31m-}[m
[31m-else{[m
[31m-L->status=cast_byte(errcode);[m
[31m-if(G(L)->panic){[m
[31m-resetstack(L,errcode);[m
[31m-G(L)->panic(L);[m
[31m-}[m
[31m-exit(EXIT_FAILURE);[m
[31m-}[m
[31m-}[m
[31m-static int luaD_rawrunprotected(lua_State*L,Pfunc f,void*ud){[m
[31m-struct lua_longjmp lj;[m
[31m-lj.status=0;[m
[31m-lj.previous=L->errorJmp;[m
[31m-L->errorJmp=&lj;[m
[31m-LUAI_TRY(L,&lj,[m
[31m-(*f)(L,ud);[m
[31m-);[m
[31m-L->errorJmp=lj.previous;[m
[31m-return lj.status;[m
[31m-}[m
[31m-static void correctstack(lua_State*L,TValue*oldstack){[m
[31m-CallInfo*ci;[m
[31m-GCObject*up;[m
[31m-L->top=(L->top-oldstack)+L->stack;[m
[31m-for(up=L->openupval;up!=NULL;up=up->gch.next)[m
[31m-gco2uv(up)->v=(gco2uv(up)->v-oldstack)+L->stack;[m
[31m-for(ci=L->base_ci;ci<=L->ci;ci++){[m
[31m-ci->top=(ci->top-oldstack)+L->stack;[m
[31m-ci->base=(ci->base-oldstack)+L->stack;[m
[31m-ci->func=(ci->func-oldstack)+L->stack;[m
[31m-}[m
[31m-L->base=(L->base-oldstack)+L->stack;[m
[31m-}[m
[31m-static void luaD_reallocstack(lua_State*L,int newsize){[m
[31m-TValue*oldstack=L->stack;[m
[31m-int realsize=newsize+1+5;[m
[31m-luaM_reallocvector(L,L->stack,L->stacksize,realsize,TValue);[m
[31m-L->stacksize=realsize;[m
[31m-L->stack_last=L->stack+newsize;[m
[31m-correctstack(L,oldstack);[m
[31m-}[m
[31m-static void luaD_reallocCI(lua_State*L,int newsize){[m
[31m-CallInfo*oldci=L->base_ci;[m
[31m-luaM_reallocvector(L,L->base_ci,L->size_ci,newsize,CallInfo);[m
[31m-L->size_ci=newsize;[m
[31m-L->ci=(L->ci-oldci)+L->base_ci;[m
[31m-L->end_ci=L->base_ci+L->size_ci-1;[m
[31m-}[m
[31m-static void luaD_growstack(lua_State*L,int n){[m
[31m-if(n<=L->stacksize)[m
[31m-luaD_reallocstack(L,2*L->stacksize);[m
[31m-else[m
[31m-luaD_reallocstack(L,L->stacksize+n);[m
[31m-}[m
[31m-static CallInfo*growCI(lua_State*L){[m
[31m-if(L->size_ci>20000)[m
[31m-luaD_throw(L,5);[m
[31m-else{[m
[31m-luaD_reallocCI(L,2*L->size_ci);[m
[31m-if(L->size_ci>20000)[m
[31m-luaG_runerror(L,"stack overflow");[m
[31m-}[m
[31m-return++L->ci;[m
[31m-}[m
[31m-static StkId adjust_varargs(lua_State*L,Proto*p,int actual){[m
[31m-int i;[m
[31m-int nfixargs=p->numparams;[m
[31m-Table*htab=NULL;[m
[31m-StkId base,fixed;[m
[31m-for(;actual<nfixargs;++actual)[m
[31m-setnilvalue(L->top++);[m
[31m-fixed=L->top-actual;[m
[31m-base=L->top;[m
[31m-for(i=0;i<nfixargs;i++){[m
[31m-setobj(L,L->top++,fixed+i);[m
[31m-setnilvalue(fixed+i);[m
[31m-}[m
[31m-if(htab){[m
[31m-sethvalue(L,L->top++,htab);[m
[31m-}[m
[31m-return base;[m
[31m-}[m
[31m-static StkId tryfuncTM(lua_State*L,StkId func){[m
[31m-const TValue*tm=luaT_gettmbyobj(L,func,TM_CALL);[m
[31m-StkId p;[m
[31m-ptrdiff_t funcr=savestack(L,func);[m
[31m-if(!ttisfunction(tm))[m
[31m-luaG_typeerror(L,func,"call");[m
[31m-for(p=L->top;p>func;p--)setobj(L,p,p-1);[m
[31m-incr_top(L);[m
[31m-func=restorestack(L,funcr);[m
[31m-setobj(L,func,tm);[m
[31m-return func;[m
[31m-}[m
[31m-#define inc_ci(L)((L->ci==L->end_ci)?growCI(L):(condhardstacktests(luaD_reallocCI(L,L->size_ci)),++L->ci))[m
[31m-static int luaD_precall(lua_State*L,StkId func,int nresults){[m
[31m-LClosure*cl;[m
[31m-ptrdiff_t funcr;[m
[31m-if(!ttisfunction(func))[m
[31m-func=tryfuncTM(L,func);[m
[31m-funcr=savestack(L,func);[m
[31m-cl=&clvalue(func)->l;[m
[31m-L->ci->savedpc=L->savedpc;[m
[31m-if(!cl->isC){[m
[31m-CallInfo*ci;[m
[31m-StkId st,base;[m
[31m-Proto*p=cl->p;[m
[31m-luaD_checkstack(L,p->maxstacksize);[m
[31m-func=restorestack(L,funcr);[m
[31m-if(!p->is_vararg){[m
[31m-base=func+1;[m
[31m-if(L->top>base+p->numparams)[m
[31m-L->top=base+p->numparams;[m
[31m-}[m
[31m-else{[m
[31m-int nargs=cast_int(L->top-func)-1;[m
[31m-base=adjust_varargs(L,p,nargs);[m
[31m-func=restorestack(L,funcr);[m
[31m-}[m
[31m-ci=inc_ci(L);[m
[31m-ci->func=func;[m
[31m-L->base=ci->base=base;[m
[31m-ci->top=L->base+p->maxstacksize;[m
[31m-L->savedpc=p->code;[m
[31m-ci->tailcalls=0;[m
[31m-ci->nresults=nresults;[m
[31m-for(st=L->top;st<ci->top;st++)[m
[31m-setnilvalue(st);[m
[31m-L->top=ci->top;[m
[31m-return 0;[m
[31m-}[m
[31m-else{[m
[31m-CallInfo*ci;[m
[31m-int n;[m
[31m-luaD_checkstack(L,20);[m
[31m-ci=inc_ci(L);[m
[31m-ci->func=restorestack(L,funcr);[m
[31m-L->base=ci->base=ci->func+1;[m
[31m-ci->top=L->top+20;[m
[31m-ci->nresults=nresults;[m
[31m-n=(*curr_func(L)->c.f)(L);[m
[31m-if(n<0)[m
[31m-return 2;[m
[31m-else{[m
[31m-luaD_poscall(L,L->top-n);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static int luaD_poscall(lua_State*L,StkId firstResult){[m
[31m-StkId res;[m
[31m-int wanted,i;[m
[31m-CallInfo*ci;[m
[31m-ci=L->ci--;[m
[31m-res=ci->func;[m
[31m-wanted=ci->nresults;[m
[31m-L->base=(ci-1)->base;[m
[31m-L->savedpc=(ci-1)->savedpc;[m
[31m-for(i=wanted;i!=0&&firstResult<L->top;i--)[m
[31m-setobj(L,res++,firstResult++);[m
[31m-while(i-->0)[m
[31m-setnilvalue(res++);[m
[31m-L->top=res;[m
[31m-return(wanted-(-1));[m
[31m-}[m
[31m-static void luaD_call(lua_State*L,StkId func,int nResults){[m
[31m-if(++L->nCcalls>=200){[m
[31m-if(L->nCcalls==200)[m
[31m-luaG_runerror(L,"C stack overflow");[m
[31m-else if(L->nCcalls>=(200+(200>>3)))[m
[31m-luaD_throw(L,5);[m
[31m-}[m
[31m-if(luaD_precall(L,func,nResults)==0)[m
[31m-luaV_execute(L,1);[m
[31m-L->nCcalls--;[m
[31m-luaC_checkGC(L);[m
[31m-}[m
[31m-static int luaD_pcall(lua_State*L,Pfunc func,void*u,[m
[31m-ptrdiff_t old_top,ptrdiff_t ef){[m
[31m-int status;[m
[31m-unsigned short oldnCcalls=L->nCcalls;[m
[31m-ptrdiff_t old_ci=saveci(L,L->ci);[m
[31m-lu_byte old_allowhooks=L->allowhook;[m
[31m-ptrdiff_t old_errfunc=L->errfunc;[m
[31m-L->errfunc=ef;[m
[31m-status=luaD_rawrunprotected(L,func,u);[m
[31m-if(status!=0){[m
[31m-StkId oldtop=restorestack(L,old_top);[m
[31m-luaF_close(L,oldtop);[m
[31m-luaD_seterrorobj(L,status,oldtop);[m
[31m-L->nCcalls=oldnCcalls;[m
[31m-L->ci=restoreci(L,old_ci);[m
[31m-L->base=L->ci->base;[m
[31m-L->savedpc=L->ci->savedpc;[m
[31m-L->allowhook=old_allowhooks;[m
[31m-restore_stack_limit(L);[m
[31m-}[m
[31m-L->errfunc=old_errfunc;[m
[31m-return status;[m
[31m-}[m
[31m-struct SParser{[m
[31m-ZIO*z;[m
[31m-Mbuffer buff;[m
[31m-const char*name;[m
[31m-};[m
[31m-static void f_parser(lua_State*L,void*ud){[m
[31m-int i;[m
[31m-Proto*tf;[m
[31m-Closure*cl;[m
[31m-struct SParser*p=cast(struct SParser*,ud);[m
[31m-luaC_checkGC(L);[m
[31m-tf=luaY_parser(L,p->z,[m
[31m-&p->buff,p->name);[m
[31m-cl=luaF_newLclosure(L,tf->nups,hvalue(gt(L)));[m
[31m-cl->l.p=tf;[m
[31m-for(i=0;i<tf->nups;i++)[m
[31m-cl->l.upvals[i]=luaF_newupval(L);[m
[31m-setclvalue(L,L->top,cl);[m
[31m-incr_top(L);[m
[31m-}[m
[31m-static int luaD_protectedparser(lua_State*L,ZIO*z,const char*name){[m
[31m-struct SParser p;[m
[31m-int status;[m
[31m-p.z=z;p.name=name;[m
[31m-luaZ_initbuffer(L,&p.buff);[m
[31m-status=luaD_pcall(L,f_parser,&p,savestack(L,L->top),L->errfunc);[m
[31m-luaZ_freebuffer(L,&p.buff);[m
[31m-return status;[m
[31m-}[m
[31m-static void luaS_resize(lua_State*L,int newsize){[m
[31m-GCObject**newhash;[m
[31m-stringtable*tb;[m
[31m-int i;[m
[31m-if(G(L)->gcstate==2)[m
[31m-return;[m
[31m-newhash=luaM_newvector(L,newsize,GCObject*);[m
[31m-tb=&G(L)->strt;[m
[31m-for(i=0;i<newsize;i++)newhash[i]=NULL;[m
[31m-for(i=0;i<tb->size;i++){[m
[31m-GCObject*p=tb->hash[i];[m
[31m-while(p){[m
[31m-GCObject*next=p->gch.next;[m
[31m-unsigned int h=gco2ts(p)->hash;[m
[31m-int h1=lmod(h,newsize);[m
[31m-p->gch.next=newhash[h1];[m
[31m-newhash[h1]=p;[m
[31m-p=next;[m
[31m-}[m
[31m-}[m
[31m-luaM_freearray(L,tb->hash,tb->size,TString*);[m
[31m-tb->size=newsize;[m
[31m-tb->hash=newhash;[m
[31m-}[m
[31m-static TString*newlstr(lua_State*L,const char*str,size_t l,[m
[31m-unsigned int h){[m
[31m-TString*ts;[m
[31m-stringtable*tb;[m
[31m-if(l+1>(((size_t)(~(size_t)0)-2)-sizeof(TString))/sizeof(char))[m
[31m-luaM_toobig(L);[m
[31m-ts=cast(TString*,luaM_malloc(L,(l+1)*sizeof(char)+sizeof(TString)));[m
[31m-ts->tsv.len=l;[m
[31m-ts->tsv.hash=h;[m
[31m-ts->tsv.marked=luaC_white(G(L));[m
[31m-ts->tsv.tt=4;[m
[31m-ts->tsv.reserved=0;[m
[31m-memcpy(ts+1,str,l*sizeof(char));[m
[31m-((char*)(ts+1))[l]='\0';[m
[31m-tb=&G(L)->strt;[m
[31m-h=lmod(h,tb->size);[m
[31m-ts->tsv.next=tb->hash[h];[m
[31m-tb->hash[h]=obj2gco(ts);[m
[31m-tb->nuse++;[m
[31m-if(tb->nuse>cast(lu_int32,tb->size)&&tb->size<=(INT_MAX-2)/2)[m
[31m-luaS_resize(L,tb->size*2);[m
[31m-return ts;[m
[31m-}[m
[31m-static TString*luaS_newlstr(lua_State*L,const char*str,size_t l){[m
[31m-GCObject*o;[m
[31m-unsigned int h=cast(unsigned int,l);[m
[31m-size_t step=(l>>5)+1;[m
[31m-size_t l1;[m
[31m-for(l1=l;l1>=step;l1-=step)[m
[31m-h=h^((h<<5)+(h>>2)+cast(unsigned char,str[l1-1]));[m
[31m-for(o=G(L)->strt.hash[lmod(h,G(L)->strt.size)];[m
[31m-o!=NULL;[m
[31m-o=o->gch.next){[m
[31m-TString*ts=rawgco2ts(o);[m
[31m-if(ts->tsv.len==l&&(memcmp(str,getstr(ts),l)==0)){[m
[31m-if(isdead(G(L),o))changewhite(o);[m
[31m-return ts;[m
[31m-}[m
[31m-}[m
[31m-return newlstr(L,str,l,h);[m
[31m-}[m
[31m-static Udata*luaS_newudata(lua_State*L,size_t s,Table*e){[m
[31m-Udata*u;[m
[31m-if(s>((size_t)(~(size_t)0)-2)-sizeof(Udata))[m
[31m-luaM_toobig(L);[m
[31m-u=cast(Udata*,luaM_malloc(L,s+sizeof(Udata)));[m
[31m-u->uv.marked=luaC_white(G(L));[m
[31m-u->uv.tt=7;[m
[31m-u->uv.len=s;[m
[31m-u->uv.metatable=NULL;[m
[31m-u->uv.env=e;[m
[31m-u->uv.next=G(L)->mainthread->next;[m
[31m-G(L)->mainthread->next=obj2gco(u);[m
[31m-return u;[m
[31m-}[m
[31m-#define hashpow2(t,n)(gnode(t,lmod((n),sizenode(t))))[m
[31m-#define hashstr(t,str)hashpow2(t,(str)->tsv.hash)[m
[31m-#define hashboolean(t,p)hashpow2(t,p)[m
[31m-#define hashmod(t,n)(gnode(t,((n)%((sizenode(t)-1)|1))))[m
[31m-#define hashpointer(t,p)hashmod(t,IntPoint(p))[m
[31m-static const Node dummynode_={[m
[31m-{{NULL},0},[m
[31m-{{{NULL},0,NULL}}[m
[31m-};[m
[31m-static Node*hashnum(const Table*t,lua_Number n){[m
[31m-unsigned int a[cast_int(sizeof(lua_Number)/sizeof(int))];[m
[31m-int i;[m
[31m-if(luai_numeq(n,0))[m
[31m-return gnode(t,0);[m
[31m-memcpy(a,&n,sizeof(a));[m
[31m-for(i=1;i<cast_int(sizeof(lua_Number)/sizeof(int));i++)a[0]+=a[i];[m
[31m-return hashmod(t,a[0]);[m
[31m-}[m
[31m-static Node*mainposition(const Table*t,const TValue*key){[m
[31m-switch(ttype(key)){[m
[31m-case 3:[m
[31m-return hashnum(t,nvalue(key));[m
[31m-case 4:[m
[31m-return hashstr(t,rawtsvalue(key));[m
[31m-case 1:[m
[31m-return hashboolean(t,bvalue(key));[m
[31m-case 2:[m
[31m-return hashpointer(t,pvalue(key));[m
[31m-default:[m
[31m-return hashpointer(t,gcvalue(key));[m
[31m-}[m
[31m-}[m
[31m-static int arrayindex(const TValue*key){[m
[31m-if(ttisnumber(key)){[m
[31m-lua_Number n=nvalue(key);[m
[31m-int k;[m
[31m-lua_number2int(k,n);[m
[31m-if(luai_numeq(cast_num(k),n))[m
[31m-return k;[m
[31m-}[m
[31m-return-1;[m
[31m-}[m
[31m-static int findindex(lua_State*L,Table*t,StkId key){[m
[31m-int i;[m
[31m-if(ttisnil(key))return-1;[m
[31m-i=arrayindex(key);[m
[31m-if(0<i&&i<=t->sizearray)[m
[31m-return i-1;[m
[31m-else{[m
[31m-Node*n=mainposition(t,key);[m
[31m-do{[m
[31m-if(luaO_rawequalObj(key2tval(n),key)||[m
[31m-(ttype(gkey(n))==(8+3)&&iscollectable(key)&&[m
[31m-gcvalue(gkey(n))==gcvalue(key))){[m
[31m-i=cast_int(n-gnode(t,0));[m
[31m-return i+t->sizearray;[m
[31m-}[m
[31m-else n=gnext(n);[m
[31m-}while(n);[m
[31m-luaG_runerror(L,"invalid key to "LUA_QL("next"));[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-static int luaH_next(lua_State*L,Table*t,StkId key){[m
[31m-int i=findindex(L,t,key);[m
[31m-for(i++;i<t->sizearray;i++){[m
[31m-if(!ttisnil(&t->array[i])){[m
[31m-setnvalue(key,cast_num(i+1));[m
[31m-setobj(L,key+1,&t->array[i]);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-for(i-=t->sizearray;i<(int)sizenode(t);i++){[m
[31m-if(!ttisnil(gval(gnode(t,i)))){[m
[31m-setobj(L,key,key2tval(gnode(t,i)));[m
[31m-setobj(L,key+1,gval(gnode(t,i)));[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-return 0;[m
[31m-}[m
[31m-static int computesizes(int nums[],int*narray){[m
[31m-int i;[m
[31m-int twotoi;[m
[31m-int a=0;[m
[31m-int na=0;[m
[31m-int n=0;[m
[31m-for(i=0,twotoi=1;twotoi/2<*narray;i++,twotoi*=2){[m
[31m-if(nums[i]>0){[m
[31m-a+=nums[i];[m
[31m-if(a>twotoi/2){[m
[31m-n=twotoi;[m
[31m-na=a;[m
[31m-}[m
[31m-}[m
[31m-if(a==*narray)break;[m
[31m-}[m
[31m-*narray=n;[m
[31m-return na;[m
[31m-}[m
[31m-static int countint(const TValue*key,int*nums){[m
[31m-int k=arrayindex(key);[m
[31m-if(0<k&&k<=(1<<(32-2))){[m
[31m-nums[ceillog2(k)]++;[m
[31m-return 1;[m
[31m-}[m
[31m-else[m
[31m-return 0;[m
[31m-}[m
[31m-static int numusearray(const Table*t,int*nums){[m
[31m-int lg;[m
[31m-int ttlg;[m
[31m-int ause=0;[m
[31m-int i=1;[m
[31m-for(lg=0,ttlg=1;lg<=(32-2);lg++,ttlg*=2){[m
[31m-int lc=0;[m
[31m-int lim=ttlg;[m
[31m-if(lim>t->sizearray){[m
[31m-lim=t->sizearray;[m
[31m-if(i>lim)[m
[31m-break;[m
[31m-}[m
[31m-for(;i<=lim;i++){[m
[31m-if(!ttisnil(&t->array[i-1]))[m
[31m-lc++;[m
[31m-}[m
[31m-nums[lg]+=lc;[m
[31m-ause+=lc;[m
[31m-}[m
[31m-return ause;[m
[31m-}[m
[31m-static int numusehash(const Table*t,int*nums,int*pnasize){[m
[31m-int totaluse=0;[m
[31m-int ause=0;[m
[31m-int i=sizenode(t);[m
[31m-while(i--){[m
[31m-Node*n=&t->node[i];[m
[31m-if(!ttisnil(gval(n))){[m
[31m-ause+=countint(key2tval(n),nums);[m
[31m-totaluse++;[m
[31m-}[m
[31m-}[m
[31m-*pnasize+=ause;[m
[31m-return totaluse;[m
[31m-}[m
[31m-static void setarrayvector(lua_State*L,Table*t,int size){[m
[31m-int i;[m
[31m-luaM_reallocvector(L,t->array,t->sizearray,size,TValue);[m
[31m-for(i=t->sizearray;i<size;i++)[m
[31m-setnilvalue(&t->array[i]);[m
[31m-t->sizearray=size;[m
[31m-}[m
[31m-static void setnodevector(lua_State*L,Table*t,int size){[m
[31m-int lsize;[m
[31m-if(size==0){[m
[31m-t->node=cast(Node*,(&dummynode_));[m
[31m-lsize=0;[m
[31m-}[m
[31m-else{[m
[31m-int i;[m
[31m-lsize=ceillog2(size);[m
[31m-if(lsize>(32-2))[m
[31m-luaG_runerror(L,"table overflow");[m
[31m-size=twoto(lsize);[m
[31m-t->node=luaM_newvector(L,size,Node);[m
[31m-for(i=0;i<size;i++){[m
[31m-Node*n=gnode(t,i);[m
[31m-gnext(n)=NULL;[m
[31m-setnilvalue(gkey(n));[m
[31m-setnilvalue(gval(n));[m
[31m-}[m
[31m-}[m
[31m-t->lsizenode=cast_byte(lsize);[m
[31m-t->lastfree=gnode(t,size);[m
[31m-}[m
[31m-static void resize(lua_State*L,Table*t,int nasize,int nhsize){[m
[31m-int i;[m
[31m-int oldasize=t->sizearray;[m
[31m-int oldhsize=t->lsizenode;[m
[31m-Node*nold=t->node;[m
[31m-if(nasize>oldasize)[m
[31m-setarrayvector(L,t,nasize);[m
[31m-setnodevector(L,t,nhsize);[m
[31m-if(nasize<oldasize){[m
[31m-t->sizearray=nasize;[m
[31m-for(i=nasize;i<oldasize;i++){[m
[31m-if(!ttisnil(&t->array[i]))[m
[31m-setobj(L,luaH_setnum(L,t,i+1),&t->array[i]);[m
[31m-}[m
[31m-luaM_reallocvector(L,t->array,oldasize,nasize,TValue);[m
[31m-}[m
[31m-for(i=twoto(oldhsize)-1;i>=0;i--){[m
[31m-Node*old=nold+i;[m
[31m-if(!ttisnil(gval(old)))[m
[31m-setobj(L,luaH_set(L,t,key2tval(old)),gval(old));[m
[31m-}[m
[31m-if(nold!=(&dummynode_))[m
[31m-luaM_freearray(L,nold,twoto(oldhsize),Node);[m
[31m-}[m
[31m-static void luaH_resizearray(lua_State*L,Table*t,int nasize){[m
[31m-int nsize=(t->node==(&dummynode_))?0:sizenode(t);[m
[31m-resize(L,t,nasize,nsize);[m
[31m-}[m
[31m-static void rehash(lua_State*L,Table*t,const TValue*ek){[m
[31m-int nasize,na;[m
[31m-int nums[(32-2)+1];[m
[31m-int i;[m
[31m-int totaluse;[m
[31m-for(i=0;i<=(32-2);i++)nums[i]=0;[m
[31m-nasize=numusearray(t,nums);[m
[31m-totaluse=nasize;[m
[31m-totaluse+=numusehash(t,nums,&nasize);[m
[31m-nasize+=countint(ek,nums);[m
[31m-totaluse++;[m
[31m-na=computesizes(nums,&nasize);[m
[31m-resize(L,t,nasize,totaluse-na);[m
[31m-}[m
[31m-static Table*luaH_new(lua_State*L,int narray,int nhash){[m
[31m-Table*t=luaM_new(L,Table);[m
[31m-luaC_link(L,obj2gco(t),5);[m
[31m-t->metatable=NULL;[m
[31m-t->flags=cast_byte(~0);[m
[31m-t->array=NULL;[m
[31m-t->sizearray=0;[m
[31m-t->lsizenode=0;[m
[31m-t->node=cast(Node*,(&dummynode_));[m
[31m-setarrayvector(L,t,narray);[m
[31m-setnodevector(L,t,nhash);[m
[31m-return t;[m
[31m-}[m
[31m-static void luaH_free(lua_State*L,Table*t){[m
[31m-if(t->node!=(&dummynode_))[m
[31m-luaM_freearray(L,t->node,sizenode(t),Node);[m
[31m-luaM_freearray(L,t->array,t->sizearray,TValue);[m
[31m-luaM_free(L,t);[m
[31m-}[m
[31m-static Node*getfreepos(Table*t){[m
[31m-while(t->lastfree-->t->node){[m
[31m-if(ttisnil(gkey(t->lastfree)))[m
[31m-return t->lastfree;[m
[31m-}[m
[31m-return NULL;[m
[31m-}[m
[31m-static TValue*newkey(lua_State*L,Table*t,const TValue*key){[m
[31m-Node*mp=mainposition(t,key);[m
[31m-if(!ttisnil(gval(mp))||mp==(&dummynode_)){[m
[31m-Node*othern;[m
[31m-Node*n=getfreepos(t);[m
[31m-if(n==NULL){[m
[31m-rehash(L,t,key);[m
[31m-return luaH_set(L,t,key);[m
[31m-}[m
[31m-othern=mainposition(t,key2tval(mp));[m
[31m-if(othern!=mp){[m
[31m-while(gnext(othern)!=mp)othern=gnext(othern);[m
[31m-gnext(othern)=n;[m
[31m-*n=*mp;[m
[31m-gnext(mp)=NULL;[m
[31m-setnilvalue(gval(mp));[m
[31m-}[m
[31m-else{[m
[31m-gnext(n)=gnext(mp);[m
[31m-gnext(mp)=n;[m
[31m-mp=n;[m
[31m-}[m
[31m-}[m
[31m-gkey(mp)->value=key->value;gkey(mp)->tt=key->tt;[m
[31m-luaC_barriert(L,t,key);[m
[31m-return gval(mp);[m
[31m-}[m
[31m-static const TValue*luaH_getnum(Table*t,int key){[m
[31m-if(cast(unsigned int,key)-1<cast(unsigned int,t->sizearray))[m
[31m-return&t->array[key-1];[m
[31m-else{[m
[31m-lua_Number nk=cast_num(key);[m
[31m-Node*n=hashnum(t,nk);[m
[31m-do{[m
[31m-if(ttisnumber(gkey(n))&&luai_numeq(nvalue(gkey(n)),nk))[m
[31m-return gval(n);[m
[31m-else n=gnext(n);[m
[31m-}while(n);[m
[31m-return(&luaO_nilobject_);[m
[31m-}[m
[31m-}[m
[31m-static const TValue*luaH_getstr(Table*t,TString*key){[m
[31m-Node*n=hashstr(t,key);[m
[31m-do{[m
[31m-if(ttisstring(gkey(n))&&rawtsvalue(gkey(n))==key)[m
[31m-return gval(n);[m
[31m-else n=gnext(n);[m
[31m-}while(n);[m
[31m-return(&luaO_nilobject_);[m
[31m-}[m
[31m-static const TValue*luaH_get(Table*t,const TValue*key){[m
[31m-switch(ttype(key)){[m
[31m-case 0:return(&luaO_nilobject_);[m
[31m-case 4:return luaH_getstr(t,rawtsvalue(key));[m
[31m-case 3:{[m
[31m-int k;[m
[31m-lua_Number n=nvalue(key);[m
[31m-lua_number2int(k,n);[m
[31m-if(luai_numeq(cast_num(k),nvalue(key)))[m
[31m-return luaH_getnum(t,k);[m
[31m-}[m
[31m-default:{[m
[31m-Node*n=mainposition(t,key);[m
[31m-do{[m
[31m-if(luaO_rawequalObj(key2tval(n),key))[m
[31m-return gval(n);[m
[31m-else n=gnext(n);[m
[31m-}while(n);[m
[31m-return(&luaO_nilobject_);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static TValue*luaH_set(lua_State*L,Table*t,const TValue*key){[m
[31m-const TValue*p=luaH_get(t,key);[m
[31m-t->flags=0;[m
[31m-if(p!=(&luaO_nilobject_))[m
[31m-return cast(TValue*,p);[m
[31m-else{[m
[31m-if(ttisnil(key))luaG_runerror(L,"table index is nil");[m
[31m-else if(ttisnumber(key)&&luai_numisnan(nvalue(key)))[m
[31m-luaG_runerror(L,"table index is NaN");[m
[31m-return newkey(L,t,key);[m
[31m-}[m
[31m-}[m
[31m-static TValue*luaH_setnum(lua_State*L,Table*t,int key){[m
[31m-const TValue*p=luaH_getnum(t,key);[m
[31m-if(p!=(&luaO_nilobject_))[m
[31m-return cast(TValue*,p);[m
[31m-else{[m
[31m-TValue k;[m
[31m-setnvalue(&k,cast_num(key));[m
[31m-return newkey(L,t,&k);[m
[31m-}[m
[31m-}[m
[31m-static TValue*luaH_setstr(lua_State*L,Table*t,TString*key){[m
[31m-const TValue*p=luaH_getstr(t,key);[m
[31m-if(p!=(&luaO_nilobject_))[m
[31m-return cast(TValue*,p);[m
[31m-else{[m
[31m-TValue k;[m
[31m-setsvalue(L,&k,key);[m
[31m-return newkey(L,t,&k);[m
[31m-}[m
[31m-}[m
[31m-static int unbound_search(Table*t,unsigned int j){[m
[31m-unsigned int i=j;[m
[31m-j++;[m
[31m-while(!ttisnil(luaH_getnum(t,j))){[m
[31m-i=j;[m
[31m-j*=2;[m
[31m-if(j>cast(unsigned int,(INT_MAX-2))){[m
[31m-i=1;[m
[31m-while(!ttisnil(luaH_getnum(t,i)))i++;[m
[31m-return i-1;[m
[31m-}[m
[31m-}[m
[31m-while(j-i>1){[m
[31m-unsigned int m=(i+j)/2;[m
[31m-if(ttisnil(luaH_getnum(t,m)))j=m;[m
[31m-else i=m;[m
[31m-}[m
[31m-return i;[m
[31m-}[m
[31m-static int luaH_getn(Table*t){[m
[31m-unsigned int j=t->sizearray;[m
[31m-if(j>0&&ttisnil(&t->array[j-1])){[m
[31m-unsigned int i=0;[m
[31m-while(j-i>1){[m
[31m-unsigned int m=(i+j)/2;[m
[31m-if(ttisnil(&t->array[m-1]))j=m;[m
[31m-else i=m;[m
[31m-}[m
[31m-return i;[m
[31m-}[m
[31m-else if(t->node==(&dummynode_))[m
[31m-return j;[m
[31m-else return unbound_search(t,j);[m
[31m-}[m
[31m-#define makewhite(g,x)((x)->gch.marked=cast_byte(((x)->gch.marked&cast_byte(~(bitmask(2)|bit2mask(0,1))))|luaC_white(g)))[m
[31m-#define white2gray(x)reset2bits((x)->gch.marked,0,1)[m
[31m-#define black2gray(x)resetbit((x)->gch.marked,2)[m
[31m-#define stringmark(s)reset2bits((s)->tsv.marked,0,1)[m
[31m-#define isfinalized(u)testbit((u)->marked,3)[m
[31m-#define markfinalized(u)l_setbit((u)->marked,3)[m
[31m-#define markvalue(g,o){checkconsistency(o);if(iscollectable(o)&&iswhite(gcvalue(o)))reallymarkobject(g,gcvalue(o));}[m
[31m-#define markobject(g,t){if(iswhite(obj2gco(t)))reallymarkobject(g,obj2gco(t));}[m
[31m-#define setthreshold(g)(g->GCthreshold=(g->estimate/100)*g->gcpause)[m
[31m-static void removeentry(Node*n){[m
[31m-if(iscollectable(gkey(n)))[m
[31m-setttype(gkey(n),(8+3));[m
[31m-}[m
[31m-static void reallymarkobject(global_State*g,GCObject*o){[m
[31m-white2gray(o);[m
[31m-switch(o->gch.tt){[m
[31m-case 4:{[m
[31m-return;[m
[31m-}[m
[31m-case 7:{[m
[31m-Table*mt=gco2u(o)->metatable;[m
[31m-gray2black(o);[m
[31m-if(mt)markobject(g,mt);[m
[31m-markobject(g,gco2u(o)->env);[m
[31m-return;[m
[31m-}[m
[31m-case(8+2):{[m
[31m-UpVal*uv=gco2uv(o);[m
[31m-markvalue(g,uv->v);[m
[31m-if(uv->v==&uv->u.value)[m
[31m-gray2black(o);[m
[31m-return;[m
[31m-}[m
[31m-case 6:{[m
[31m-gco2cl(o)->c.gclist=g->gray;[m
[31m-g->gray=o;[m
[31m-break;[m
[31m-}[m
[31m-case 5:{[m
[31m-gco2h(o)->gclist=g->gray;[m
[31m-g->gray=o;[m
[31m-break;[m
[31m-}[m
[31m-case 8:{[m
[31m-gco2th(o)->gclist=g->gray;[m
[31m-g->gray=o;[m
[31m-break;[m
[31m-}[m
[31m-case(8+1):{[m
[31m-gco2p(o)->gclist=g->gray;[m
[31m-g->gray=o;[m
[31m-break;[m
[31m-}[m
[31m-default:;[m
[31m-}[m
[31m-}[m
[31m-static void marktmu(global_State*g){[m
[31m-GCObject*u=g->tmudata;[m
[31m-if(u){[m
[31m-do{[m
[31m-u=u->gch.next;[m
[31m-makewhite(g,u);[m
[31m-reallymarkobject(g,u);[m
[31m-}while(u!=g->tmudata);[m
[31m-}[m
[31m-}[m
[31m-static size_t luaC_separateudata(lua_State*L,int all){[m
[31m-global_State*g=G(L);[m
[31m-size_t deadmem=0;[m
[31m-GCObject**p=&g->mainthread->next;[m
[31m-GCObject*curr;[m
[31m-while((curr=*p)!=NULL){[m
[31m-if(!(iswhite(curr)||all)||isfinalized(gco2u(curr)))[m
[31m-p=&curr->gch.next;[m
[31m-else if(fasttm(L,gco2u(curr)->metatable,TM_GC)==NULL){[m
[31m-markfinalized(gco2u(curr));[m
[31m-p=&curr->gch.next;[m
[31m-}[m
[31m-else{[m
[31m-deadmem+=sizeudata(gco2u(curr));[m
[31m-markfinalized(gco2u(curr));[m
[31m-*p=curr->gch.next;[m
[31m-if(g->tmudata==NULL)[m
[31m-g->tmudata=curr->gch.next=curr;[m
[31m-else{[m
[31m-curr->gch.next=g->tmudata->gch.next;[m
[31m-g->tmudata->gch.next=curr;[m
[31m-g->tmudata=curr;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-return deadmem;[m
[31m-}[m
[31m-static int traversetable(global_State*g,Table*h){[m
[31m-int i;[m
[31m-int weakkey=0;[m
[31m-int weakvalue=0;[m
[31m-const TValue*mode;[m
[31m-if(h->metatable)[m
[31m-markobject(g,h->metatable);[m
[31m-mode=gfasttm(g,h->metatable,TM_MODE);[m
[31m-if(mode&&ttisstring(mode)){[m
[31m-weakkey=(strchr(svalue(mode),'k')!=NULL);[m
[31m-weakvalue=(strchr(svalue(mode),'v')!=NULL);[m
[31m-if(weakkey||weakvalue){[m
[31m-h->marked&=~(bitmask(3)|bitmask(4));[m
[31m-h->marked|=cast_byte((weakkey<<3)|[m
[31m-(weakvalue<<4));[m
[31m-h->gclist=g->weak;[m
[31m-g->weak=obj2gco(h);[m
[31m-}[m
[31m-}[m
[31m-if(weakkey&&weakvalue)return 1;[m
[31m-if(!weakvalue){[m
[31m-i=h->sizearray;[m
[31m-while(i--)[m
[31m-markvalue(g,&h->array[i]);[m
[31m-}[m
[31m-i=sizenode(h);[m
[31m-while(i--){[m
[31m-Node*n=gnode(h,i);[m
[31m-if(ttisnil(gval(n)))[m
[31m-removeentry(n);[m
[31m-else{[m
[31m-if(!weakkey)markvalue(g,gkey(n));[m
[31m-if(!weakvalue)markvalue(g,gval(n));[m
[31m-}[m
[31m-}[m
[31m-return weakkey||weakvalue;[m
[31m-}[m
[31m-static void traverseproto(global_State*g,Proto*f){[m
[31m-int i;[m
[31m-if(f->source)stringmark(f->source);[m
[31m-for(i=0;i<f->sizek;i++)[m
[31m-markvalue(g,&f->k[i]);[m
[31m-for(i=0;i<f->sizeupvalues;i++){[m
[31m-if(f->upvalues[i])[m
[31m-stringmark(f->upvalues[i]);[m
[31m-}[m
[31m-for(i=0;i<f->sizep;i++){[m
[31m-if(f->p[i])[m
[31m-markobject(g,f->p[i]);[m
[31m-}[m
[31m-for(i=0;i<f->sizelocvars;i++){[m
[31m-if(f->locvars[i].varname)[m
[31m-stringmark(f->locvars[i].varname);[m
[31m-}[m
[31m-}[m
[31m-static void traverseclosure(global_State*g,Closure*cl){[m
[31m-markobject(g,cl->c.env);[m
[31m-if(cl->c.isC){[m
[31m-int i;[m
[31m-for(i=0;i<cl->c.nupvalues;i++)[m
[31m-markvalue(g,&cl->c.upvalue[i]);[m
[31m-}[m
[31m-else{[m
[31m-int i;[m
[31m-markobject(g,cl->l.p);[m
[31m-for(i=0;i<cl->l.nupvalues;i++)[m
[31m-markobject(g,cl->l.upvals[i]);[m
[31m-}[m
[31m-}[m
[31m-static void checkstacksizes(lua_State*L,StkId max){[m
[31m-int ci_used=cast_int(L->ci-L->base_ci);[m
[31m-int s_used=cast_int(max-L->stack);[m
[31m-if(L->size_ci>20000)[m
[31m-return;[m
[31m-if(4*ci_used<L->size_ci&&2*8<L->size_ci)[m
[31m-luaD_reallocCI(L,L->size_ci/2);[m
[31m-condhardstacktests(luaD_reallocCI(L,ci_used+1));[m
[31m-if(4*s_used<L->stacksize&&[m
[31m-2*((2*20)+5)<L->stacksize)[m
[31m-luaD_reallocstack(L,L->stacksize/2);[m
[31m-condhardstacktests(luaD_reallocstack(L,s_used));[m
[31m-}[m
[31m-static void traversestack(global_State*g,lua_State*l){[m
[31m-StkId o,lim;[m
[31m-CallInfo*ci;[m
[31m-markvalue(g,gt(l));[m
[31m-lim=l->top;[m
[31m-for(ci=l->base_ci;ci<=l->ci;ci++){[m
[31m-if(lim<ci->top)lim=ci->top;[m
[31m-}[m
[31m-for(o=l->stack;o<l->top;o++)[m
[31m-markvalue(g,o);[m
[31m-for(;o<=lim;o++)[m
[31m-setnilvalue(o);[m
[31m-checkstacksizes(l,lim);[m
[31m-}[m
[31m-static l_mem propagatemark(global_State*g){[m
[31m-GCObject*o=g->gray;[m
[31m-gray2black(o);[m
[31m-switch(o->gch.tt){[m
[31m-case 5:{[m
[31m-Table*h=gco2h(o);[m
[31m-g->gray=h->gclist;[m
[31m-if(traversetable(g,h))[m
[31m-black2gray(o);[m
[31m-return sizeof(Table)+sizeof(TValue)*h->sizearray+[m
[31m-sizeof(Node)*sizenode(h);[m
[31m-}[m
[31m-case 6:{[m
[31m-Closure*cl=gco2cl(o);[m
[31m-g->gray=cl->c.gclist;[m
[31m-traverseclosure(g,cl);[m
[31m-return(cl->c.isC)?sizeCclosure(cl->c.nupvalues):[m
[31m-sizeLclosure(cl->l.nupvalues);[m
[31m-}[m
[31m-case 8:{[m
[31m-lua_State*th=gco2th(o);[m
[31m-g->gray=th->gclist;[m
[31m-th->gclist=g->grayagain;[m
[31m-g->grayagain=o;[m
[31m-black2gray(o);[m
[31m-traversestack(g,th);[m
[31m-return sizeof(lua_State)+sizeof(TValue)*th->stacksize+[m
[31m-sizeof(CallInfo)*th->size_ci;[m
[31m-}[m
[31m-case(8+1):{[m
[31m-Proto*p=gco2p(o);[m
[31m-g->gray=p->gclist;[m
[31m-traverseproto(g,p);[m
[31m-return sizeof(Proto)+sizeof(Instruction)*p->sizecode+[m
[31m-sizeof(Proto*)*p->sizep+[m
[31m-sizeof(TValue)*p->sizek+[m
[31m-sizeof(int)*p->sizelineinfo+[m
[31m-sizeof(LocVar)*p->sizelocvars+[m
[31m-sizeof(TString*)*p->sizeupvalues;[m
[31m-}[m
[31m-default:return 0;[m
[31m-}[m
[31m-}[m
[31m-static size_t propagateall(global_State*g){[m
[31m-size_t m=0;[m
[31m-while(g->gray)m+=propagatemark(g);[m
[31m-return m;[m
[31m-}[m
[31m-static int iscleared(const TValue*o,int iskey){[m
[31m-if(!iscollectable(o))return 0;[m
[31m-if(ttisstring(o)){[m
[31m-stringmark(rawtsvalue(o));[m
[31m-return 0;[m
[31m-}[m
[31m-return iswhite(gcvalue(o))||[m
[31m-(ttisuserdata(o)&&(!iskey&&isfinalized(uvalue(o))));[m
[31m-}[m
[31m-static void cleartable(GCObject*l){[m
[31m-while(l){[m
[31m-Table*h=gco2h(l);[m
[31m-int i=h->sizearray;[m
[31m-if(testbit(h->marked,4)){[m
[31m-while(i--){[m
[31m-TValue*o=&h->array[i];[m
[31m-if(iscleared(o,0))[m
[31m-setnilvalue(o);[m
[31m-}[m
[31m-}[m
[31m-i=sizenode(h);[m
[31m-while(i--){[m
[31m-Node*n=gnode(h,i);[m
[31m-if(!ttisnil(gval(n))&&[m
[31m-(iscleared(key2tval(n),1)||iscleared(gval(n),0))){[m
[31m-setnilvalue(gval(n));[m
[31m-removeentry(n);[m
[31m-}[m
[31m-}[m
[31m-l=h->gclist;[m
[31m-}[m
[31m-}[m
[31m-static void freeobj(lua_State*L,GCObject*o){[m
[31m-switch(o->gch.tt){[m
[31m-case(8+1):luaF_freeproto(L,gco2p(o));break;[m
[31m-case 6:luaF_freeclosure(L,gco2cl(o));break;[m
[31m-case(8+2):luaF_freeupval(L,gco2uv(o));break;[m
[31m-case 5:luaH_free(L,gco2h(o));break;[m
[31m-case 8:{[m
[31m-luaE_freethread(L,gco2th(o));[m
[31m-break;[m
[31m-}[m
[31m-case 4:{[m
[31m-G(L)->strt.nuse--;[m
[31m-luaM_freemem(L,o,sizestring(gco2ts(o)));[m
[31m-break;[m
[31m-}[m
[31m-case 7:{[m
[31m-luaM_freemem(L,o,sizeudata(gco2u(o)));[m
[31m-break;[m
[31m-}[m
[31m-default:;[m
[31m-}[m
[31m-}[m
[31m-#define sweepwholelist(L,p)sweeplist(L,p,((lu_mem)(~(lu_mem)0)-2))[m
[31m-static GCObject**sweeplist(lua_State*L,GCObject**p,lu_mem count){[m
[31m-GCObject*curr;[m
[31m-global_State*g=G(L);[m
[31m-int deadmask=otherwhite(g);[m
[31m-while((curr=*p)!=NULL&&count-->0){[m
[31m-if(curr->gch.tt==8)[m
[31m-sweepwholelist(L,&gco2th(curr)->openupval);[m
[31m-if((curr->gch.marked^bit2mask(0,1))&deadmask){[m
[31m-makewhite(g,curr);[m
[31m-p=&curr->gch.next;[m
[31m-}[m
[31m-else{[m
[31m-*p=curr->gch.next;[m
[31m-if(curr==g->rootgc)[m
[31m-g->rootgc=curr->gch.next;[m
[31m-freeobj(L,curr);[m
[31m-}[m
[31m-}[m
[31m-return p;[m
[31m-}[m
[31m-static void checkSizes(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-if(g->strt.nuse<cast(lu_int32,g->strt.size/4)&&[m
[31m-g->strt.size>32*2)[m
[31m-luaS_resize(L,g->strt.size/2);[m
[31m-if(luaZ_sizebuffer(&g->buff)>32*2){[m
[31m-size_t newsize=luaZ_sizebuffer(&g->buff)/2;[m
[31m-luaZ_resizebuffer(L,&g->buff,newsize);[m
[31m-}[m
[31m-}[m
[31m-static void GCTM(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-GCObject*o=g->tmudata->gch.next;[m
[31m-Udata*udata=rawgco2u(o);[m
[31m-const TValue*tm;[m
[31m-if(o==g->tmudata)[m
[31m-g->tmudata=NULL;[m
[31m-else[m
[31m-g->tmudata->gch.next=udata->uv.next;[m
[31m-udata->uv.next=g->mainthread->next;[m
[31m-g->mainthread->next=o;[m
[31m-makewhite(g,o);[m
[31m-tm=fasttm(L,udata->uv.metatable,TM_GC);[m
[31m-if(tm!=NULL){[m
[31m-lu_byte oldah=L->allowhook;[m
[31m-lu_mem oldt=g->GCthreshold;[m
[31m-L->allowhook=0;[m
[31m-g->GCthreshold=2*g->totalbytes;[m
[31m-setobj(L,L->top,tm);[m
[31m-setuvalue(L,L->top+1,udata);[m
[31m-L->top+=2;[m
[31m-luaD_call(L,L->top-2,0);[m
[31m-L->allowhook=oldah;[m
[31m-g->GCthreshold=oldt;[m
[31m-}[m
[31m-}[m
[31m-static void luaC_callGCTM(lua_State*L){[m
[31m-while(G(L)->tmudata)[m
[31m-GCTM(L);[m
[31m-}[m
[31m-static void luaC_freeall(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-int i;[m
[31m-g->currentwhite=bit2mask(0,1)|bitmask(6);[m
[31m-sweepwholelist(L,&g->rootgc);[m
[31m-for(i=0;i<g->strt.size;i++)[m
[31m-sweepwholelist(L,&g->strt.hash[i]);[m
[31m-}[m
[31m-static void markmt(global_State*g){[m
[31m-int i;[m
[31m-for(i=0;i<(8+1);i++)[m
[31m-if(g->mt[i])markobject(g,g->mt[i]);[m
[31m-}[m
[31m-static void markroot(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-g->gray=NULL;[m
[31m-g->grayagain=NULL;[m
[31m-g->weak=NULL;[m
[31m-markobject(g,g->mainthread);[m
[31m-markvalue(g,gt(g->mainthread));[m
[31m-markvalue(g,registry(L));[m
[31m-markmt(g);[m
[31m-g->gcstate=1;[m
[31m-}[m
[31m-static void remarkupvals(global_State*g){[m
[31m-UpVal*uv;[m
[31m-for(uv=g->uvhead.u.l.next;uv!=&g->uvhead;uv=uv->u.l.next){[m
[31m-if(isgray(obj2gco(uv)))[m
[31m-markvalue(g,uv->v);[m
[31m-}[m
[31m-}[m
[31m-static void atomic(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-size_t udsize;[m
[31m-remarkupvals(g);[m
[31m-propagateall(g);[m
[31m-g->gray=g->weak;[m
[31m-g->weak=NULL;[m
[31m-markobject(g,L);[m
[31m-markmt(g);[m
[31m-propagateall(g);[m
[31m-g->gray=g->grayagain;[m
[31m-g->grayagain=NULL;[m
[31m-propagateall(g);[m
[31m-udsize=luaC_separateudata(L,0);[m
[31m-marktmu(g);[m
[31m-udsize+=propagateall(g);[m
[31m-cleartable(g->weak);[m
[31m-g->currentwhite=cast_byte(otherwhite(g));[m
[31m-g->sweepstrgc=0;[m
[31m-g->sweepgc=&g->rootgc;[m
[31m-g->gcstate=2;[m
[31m-g->estimate=g->totalbytes-udsize;[m
[31m-}[m
[31m-static l_mem singlestep(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-switch(g->gcstate){[m
[31m-case 0:{[m
[31m-markroot(L);[m
[31m-return 0;[m
[31m-}[m
[31m-case 1:{[m
[31m-if(g->gray)[m
[31m-return propagatemark(g);[m
[31m-else{[m
[31m-atomic(L);[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-case 2:{[m
[31m-lu_mem old=g->totalbytes;[m
[31m-sweepwholelist(L,&g->strt.hash[g->sweepstrgc++]);[m
[31m-if(g->sweepstrgc>=g->strt.size)[m
[31m-g->gcstate=3;[m
[31m-g->estimate-=old-g->totalbytes;[m
[31m-return 10;[m
[31m-}[m
[31m-case 3:{[m
[31m-lu_mem old=g->totalbytes;[m
[31m-g->sweepgc=sweeplist(L,g->sweepgc,40);[m
[31m-if(*g->sweepgc==NULL){[m
[31m-checkSizes(L);[m
[31m-g->gcstate=4;[m
[31m-}[m
[31m-g->estimate-=old-g->totalbytes;[m
[31m-return 40*10;[m
[31m-}[m
[31m-case 4:{[m
[31m-if(g->tmudata){[m
[31m-GCTM(L);[m
[31m-if(g->estimate>100)[m
[31m-g->estimate-=100;[m
[31m-return 100;[m
[31m-}[m
[31m-else{[m
[31m-g->gcstate=0;[m
[31m-g->gcdept=0;[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-default:return 0;[m
[31m-}[m
[31m-}[m
[31m-static void luaC_step(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-l_mem lim=(1024u/100)*g->gcstepmul;[m
[31m-if(lim==0)[m
[31m-lim=(((lu_mem)(~(lu_mem)0)-2)-1)/2;[m
[31m-g->gcdept+=g->totalbytes-g->GCthreshold;[m
[31m-do{[m
[31m-lim-=singlestep(L);[m
[31m-if(g->gcstate==0)[m
[31m-break;[m
[31m-}while(lim>0);[m
[31m-if(g->gcstate!=0){[m
[31m-if(g->gcdept<1024u)[m
[31m-g->GCthreshold=g->totalbytes+1024u;[m
[31m-else{[m
[31m-g->gcdept-=1024u;[m
[31m-g->GCthreshold=g->totalbytes;[m
[31m-}[m
[31m-}[m
[31m-else{[m
[31m-setthreshold(g);[m
[31m-}[m
[31m-}[m
[31m-static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v){[m
[31m-global_State*g=G(L);[m
[31m-if(g->gcstate==1)[m
[31m-reallymarkobject(g,v);[m
[31m-else[m
[31m-makewhite(g,o);[m
[31m-}[m
[31m-static void luaC_barrierback(lua_State*L,Table*t){[m
[31m-global_State*g=G(L);[m
[31m-GCObject*o=obj2gco(t);[m
[31m-black2gray(o);[m
[31m-t->gclist=g->grayagain;[m
[31m-g->grayagain=o;[m
[31m-}[m
[31m-static void luaC_link(lua_State*L,GCObject*o,lu_byte tt){[m
[31m-global_State*g=G(L);[m
[31m-o->gch.next=g->rootgc;[m
[31m-g->rootgc=o;[m
[31m-o->gch.marked=luaC_white(g);[m
[31m-o->gch.tt=tt;[m
[31m-}[m
[31m-static void luaC_linkupval(lua_State*L,UpVal*uv){[m
[31m-global_State*g=G(L);[m
[31m-GCObject*o=obj2gco(uv);[m
[31m-o->gch.next=g->rootgc;[m
[31m-g->rootgc=o;[m
[31m-if(isgray(o)){[m
[31m-if(g->gcstate==1){[m
[31m-gray2black(o);[m
[31m-luaC_barrier(L,uv,uv->v);[m
[31m-}[m
[31m-else{[m
[31m-makewhite(g,o);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-typedef union{[m
[31m-lua_Number r;[m
[31m-TString*ts;[m
[31m-}SemInfo;[m
[31m-typedef struct Token{[m
[31m-int token;[m
[31m-SemInfo seminfo;[m
[31m-}Token;[m
[31m-typedef struct LexState{[m
[31m-int current;[m
[31m-int linenumber;[m
[31m-int lastline;[m
[31m-Token t;[m
[31m-Token lookahead;[m
[31m-struct FuncState*fs;[m
[31m-struct lua_State*L;[m
[31m-ZIO*z;[m
[31m-Mbuffer*buff;[m
[31m-TString*source;[m
[31m-char decpoint;[m
[31m-}LexState;[m
[31m-static void luaX_init(lua_State*L);[m
[31m-static void luaX_lexerror(LexState*ls,const char*msg,int token);[m
[31m-#define state_size(x)(sizeof(x)+0)[m
[31m-#define fromstate(l)(cast(lu_byte*,(l))-0)[m
[31m-#define tostate(l)(cast(lua_State*,cast(lu_byte*,l)+0))[m
[31m-typedef struct LG{[m
[31m-lua_State l;[m
[31m-global_State g;[m
[31m-}LG;[m
[31m-static void stack_init(lua_State*L1,lua_State*L){[m
[31m-L1->base_ci=luaM_newvector(L,8,CallInfo);[m
[31m-L1->ci=L1->base_ci;[m
[31m-L1->size_ci=8;[m
[31m-L1->end_ci=L1->base_ci+L1->size_ci-1;[m
[31m-L1->stack=luaM_newvector(L,(2*20)+5,TValue);[m
[31m-L1->stacksize=(2*20)+5;[m
[31m-L1->top=L1->stack;[m
[31m-L1->stack_last=L1->stack+(L1->stacksize-5)-1;[m
[31m-L1->ci->func=L1->top;[m
[31m-setnilvalue(L1->top++);[m
[31m-L1->base=L1->ci->base=L1->top;[m
[31m-L1->ci->top=L1->top+20;[m
[31m-}[m
[31m-static void freestack(lua_State*L,lua_State*L1){[m
[31m-luaM_freearray(L,L1->base_ci,L1->size_ci,CallInfo);[m
[31m-luaM_freearray(L,L1->stack,L1->stacksize,TValue);[m
[31m-}[m
[31m-static void f_luaopen(lua_State*L,void*ud){[m
[31m-global_State*g=G(L);[m
[31m-UNUSED(ud);[m
[31m-stack_init(L,L);[m
[31m-sethvalue(L,gt(L),luaH_new(L,0,2));[m
[31m-sethvalue(L,registry(L),luaH_new(L,0,2));[m
[31m-luaS_resize(L,32);[m
[31m-luaT_init(L);[m
[31m-luaX_init(L);[m
[31m-luaS_fix(luaS_newliteral(L,"not enough memory"));[m
[31m-g->GCthreshold=4*g->totalbytes;[m
[31m-}[m
[31m-static void preinit_state(lua_State*L,global_State*g){[m
[31m-G(L)=g;[m
[31m-L->stack=NULL;[m
[31m-L->stacksize=0;[m
[31m-L->errorJmp=NULL;[m
[31m-L->hook=NULL;[m
[31m-L->hookmask=0;[m
[31m-L->basehookcount=0;[m
[31m-L->allowhook=1;[m
[31m-resethookcount(L);[m
[31m-L->openupval=NULL;[m
[31m-L->size_ci=0;[m
[31m-L->nCcalls=L->baseCcalls=0;[m
[31m-L->status=0;[m
[31m-L->base_ci=L->ci=NULL;[m
[31m-L->savedpc=NULL;[m
[31m-L->errfunc=0;[m
[31m-setnilvalue(gt(L));[m
[31m-}[m
[31m-static void close_state(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-luaF_close(L,L->stack);[m
[31m-luaC_freeall(L);[m
[31m-luaM_freearray(L,G(L)->strt.hash,G(L)->strt.size,TString*);[m
[31m-luaZ_freebuffer(L,&g->buff);[m
[31m-freestack(L,L);[m
[31m-(*g->frealloc)(g->ud,fromstate(L),state_size(LG),0);[m
[31m-}[m
[31m-static void luaE_freethread(lua_State*L,lua_State*L1){[m
[31m-luaF_close(L1,L1->stack);[m
[31m-freestack(L,L1);[m
[31m-luaM_freemem(L,fromstate(L1),state_size(lua_State));[m
[31m-}[m
[31m-static lua_State*lua_newstate(lua_Alloc f,void*ud){[m
[31m-int i;[m
[31m-lua_State*L;[m
[31m-global_State*g;[m
[31m-void*l=(*f)(ud,NULL,0,state_size(LG));[m
[31m-if(l==NULL)return NULL;[m
[31m-L=tostate(l);[m
[31m-g=&((LG*)L)->g;[m
[31m-L->next=NULL;[m
[31m-L->tt=8;[m
[31m-g->currentwhite=bit2mask(0,5);[m
[31m-L->marked=luaC_white(g);[m
[31m-set2bits(L->marked,5,6);[m
[31m-preinit_state(L,g);[m
[31m-g->frealloc=f;[m
[31m-g->ud=ud;[m
[31m-g->mainthread=L;[m
[31m-g->uvhead.u.l.prev=&g->uvhead;[m
[31m-g->uvhead.u.l.next=&g->uvhead;[m
[31m-g->GCthreshold=0;[m
[31m-g->strt.size=0;[m
[31m-g->strt.nuse=0;[m
[31m-g->strt.hash=NULL;[m
[31m-setnilvalue(registry(L));[m
[31m-luaZ_initbuffer(L,&g->buff);[m
[31m-g->panic=NULL;[m
[31m-g->gcstate=0;[m
[31m-g->rootgc=obj2gco(L);[m
[31m-g->sweepstrgc=0;[m
[31m-g->sweepgc=&g->rootgc;[m
[31m-g->gray=NULL;[m
[31m-g->grayagain=NULL;[m
[31m-g->weak=NULL;[m
[31m-g->tmudata=NULL;[m
[31m-g->totalbytes=sizeof(LG);[m
[31m-g->gcpause=200;[m
[31m-g->gcstepmul=200;[m
[31m-g->gcdept=0;[m
[31m-for(i=0;i<(8+1);i++)g->mt[i]=NULL;[m
[31m-if(luaD_rawrunprotected(L,f_luaopen,NULL)!=0){[m
[31m-close_state(L);[m
[31m-L=NULL;[m
[31m-}[m
[31m-else[m
[31m-{}[m
[31m-return L;[m
[31m-}[m
[31m-static void callallgcTM(lua_State*L,void*ud){[m
[31m-UNUSED(ud);[m
[31m-luaC_callGCTM(L);[m
[31m-}[m
[31m-static void lua_close(lua_State*L){[m
[31m-L=G(L)->mainthread;[m
[31m-luaF_close(L,L->stack);[m
[31m-luaC_separateudata(L,1);[m
[31m-L->errfunc=0;[m
[31m-do{[m
[31m-L->ci=L->base_ci;[m
[31m-L->base=L->top=L->ci->base;[m
[31m-L->nCcalls=L->baseCcalls=0;[m
[31m-}while(luaD_rawrunprotected(L,callallgcTM,NULL)!=0);[m
[31m-close_state(L);[m
[31m-}[m
[31m-#define getcode(fs,e)((fs)->f->code[(e)->u.s.info])[m
[31m-#define luaK_codeAsBx(fs,o,A,sBx)luaK_codeABx(fs,o,A,(sBx)+(((1<<(9+9))-1)>>1))[m
[31m-#define luaK_setmultret(fs,e)luaK_setreturns(fs,e,(-1))[m
[31m-static int luaK_codeABx(FuncState*fs,OpCode o,int A,unsigned int Bx);[m
[31m-static int luaK_codeABC(FuncState*fs,OpCode o,int A,int B,int C);[m
[31m-static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults);[m
[31m-static void luaK_patchtohere(FuncState*fs,int list);[m
[31m-static void luaK_concat(FuncState*fs,int*l1,int l2);[m
[31m-static int currentpc(lua_State*L,CallInfo*ci){[m
[31m-if(!isLua(ci))return-1;[m
[31m-if(ci==L->ci)[m
[31m-ci->savedpc=L->savedpc;[m
[31m-return pcRel(ci->savedpc,ci_func(ci)->l.p);[m
[31m-}[m
[31m-static int currentline(lua_State*L,CallInfo*ci){[m
[31m-int pc=currentpc(L,ci);[m
[31m-if(pc<0)[m
[31m-return-1;[m
[31m-else[m
[31m-return getline_(ci_func(ci)->l.p,pc);[m
[31m-}[m
[31m-static int lua_getstack(lua_State*L,int level,lua_Debug*ar){[m
[31m-int status;[m
[31m-CallInfo*ci;[m
[31m-for(ci=L->ci;level>0&&ci>L->base_ci;ci--){[m
[31m-level--;[m
[31m-if(f_isLua(ci))[m
[31m-level-=ci->tailcalls;[m
[31m-}[m
[31m-if(level==0&&ci>L->base_ci){[m
[31m-status=1;[m
[31m-ar->i_ci=cast_int(ci-L->base_ci);[m
[31m-}[m
[31m-else if(level<0){[m
[31m-status=1;[m
[31m-ar->i_ci=0;[m
[31m-}[m
[31m-else status=0;[m
[31m-return status;[m
[31m-}[m
[31m-static Proto*getluaproto(CallInfo*ci){[m
[31m-return(isLua(ci)?ci_func(ci)->l.p:NULL);[m
[31m-}[m
[31m-static void funcinfo(lua_Debug*ar,Closure*cl){[m
[31m-if(cl->c.isC){[m
[31m-ar->source="=[C]";[m
[31m-ar->linedefined=-1;[m
[31m-ar->lastlinedefined=-1;[m
[31m-ar->what="C";[m
[31m-}[m
[31m-else{[m
[31m-ar->source=getstr(cl->l.p->source);[m
[31m-ar->linedefined=cl->l.p->linedefined;[m
[31m-ar->lastlinedefined=cl->l.p->lastlinedefined;[m
[31m-ar->what=(ar->linedefined==0)?"main":"Lua";[m
[31m-}[m
[31m-luaO_chunkid(ar->short_src,ar->source,60);[m
[31m-}[m
[31m-static void info_tailcall(lua_Debug*ar){[m
[31m-ar->name=ar->namewhat="";[m
[31m-ar->what="tail";[m
[31m-ar->lastlinedefined=ar->linedefined=ar->currentline=-1;[m
[31m-ar->source="=(tail call)";[m
[31m-luaO_chunkid(ar->short_src,ar->source,60);[m
[31m-ar->nups=0;[m
[31m-}[m
[31m-static void collectvalidlines(lua_State*L,Closure*f){[m
[31m-if(f==NULL||f->c.isC){[m
[31m-setnilvalue(L->top);[m
[31m-}[m
[31m-else{[m
[31m-Table*t=luaH_new(L,0,0);[m
[31m-int*lineinfo=f->l.p->lineinfo;[m
[31m-int i;[m
[31m-for(i=0;i<f->l.p->sizelineinfo;i++)[m
[31m-setbvalue(luaH_setnum(L,t,lineinfo[i]),1);[m
[31m-sethvalue(L,L->top,t);[m
[31m-}[m
[31m-incr_top(L);[m
[31m-}[m
[31m-static int auxgetinfo(lua_State*L,const char*what,lua_Debug*ar,[m
[31m-Closure*f,CallInfo*ci){[m
[31m-int status=1;[m
[31m-if(f==NULL){[m
[31m-info_tailcall(ar);[m
[31m-return status;[m
[31m-}[m
[31m-for(;*what;what++){[m
[31m-switch(*what){[m
[31m-case'S':{[m
[31m-funcinfo(ar,f);[m
[31m-break;[m
[31m-}[m
[31m-case'l':{[m
[31m-ar->currentline=(ci)?currentline(L,ci):-1;[m
[31m-break;[m
[31m-}[m
[31m-case'u':{[m
[31m-ar->nups=f->c.nupvalues;[m
[31m-break;[m
[31m-}[m
[31m-case'n':{[m
[31m-ar->namewhat=(ci)?NULL:NULL;[m
[31m-if(ar->namewhat==NULL){[m
[31m-ar->namewhat="";[m
[31m-ar->name=NULL;[m
[31m-}[m
[31m-break;[m
[31m-}[m
[31m-case'L':[m
[31m-case'f':[m
[31m-break;[m
[31m-default:status=0;[m
[31m-}[m
[31m-}[m
[31m-return status;[m
[31m-}[m
[31m-static int lua_getinfo(lua_State*L,const char*what,lua_Debug*ar){[m
[31m-int status;[m
[31m-Closure*f=NULL;[m
[31m-CallInfo*ci=NULL;[m
[31m-if(*what=='>'){[m
[31m-StkId func=L->top-1;[m
[31m-luai_apicheck(L,ttisfunction(func));[m
[31m-what++;[m
[31m-f=clvalue(func);[m
[31m-L->top--;[m
[31m-}[m
[31m-else if(ar->i_ci!=0){[m
[31m-ci=L->base_ci+ar->i_ci;[m
[31m-f=clvalue(ci->func);[m
[31m-}[m
[31m-status=auxgetinfo(L,what,ar,f,ci);[m
[31m-if(strchr(what,'f')){[m
[31m-if(f==NULL)setnilvalue(L->top);[m
[31m-else setclvalue(L,L->top,f);[m
[31m-incr_top(L);[m
[31m-}[m
[31m-if(strchr(what,'L'))[m
[31m-collectvalidlines(L,f);[m
[31m-return status;[m
[31m-}[m
[31m-static int isinstack(CallInfo*ci,const TValue*o){[m
[31m-StkId p;[m
[31m-for(p=ci->base;p<ci->top;p++)[m
[31m-if(o==p)return 1;[m
[31m-return 0;[m
[31m-}[m
[31m-static void luaG_typeerror(lua_State*L,const TValue*o,const char*op){[m
[31m-const char*name=NULL;[m
[31m-const char*t=luaT_typenames[ttype(o)];[m
[31m-const char*kind=(isinstack(L->ci,o))?[m
[31m-NULL:[m
[31m-NULL;[m
[31m-if(kind)[m
[31m-luaG_runerror(L,"attempt to %s %s "LUA_QL("%s")" (a %s value)",[m
[31m-op,kind,name,t);[m
[31m-else[m
[31m-luaG_runerror(L,"attempt to %s a %s value",op,t);[m
[31m-}[m
[31m-static void luaG_concaterror(lua_State*L,StkId p1,StkId p2){[m
[31m-if(ttisstring(p1)||ttisnumber(p1))p1=p2;[m
[31m-luaG_typeerror(L,p1,"concatenate");[m
[31m-}[m
[31m-static void luaG_aritherror(lua_State*L,const TValue*p1,const TValue*p2){[m
[31m-TValue temp;[m
[31m-if(luaV_tonumber(p1,&temp)==NULL)[m
[31m-p2=p1;[m
[31m-luaG_typeerror(L,p2,"perform arithmetic on");[m
[31m-}[m
[31m-static int luaG_ordererror(lua_State*L,const TValue*p1,const TValue*p2){[m
[31m-const char*t1=luaT_typenames[ttype(p1)];[m
[31m-const char*t2=luaT_typenames[ttype(p2)];[m
[31m-if(t1[2]==t2[2])[m
[31m-luaG_runerror(L,"attempt to compare two %s values",t1);[m
[31m-else[m
[31m-luaG_runerror(L,"attempt to compare %s with %s",t1,t2);[m
[31m-return 0;[m
[31m-}[m
[31m-static void addinfo(lua_State*L,const char*msg){[m
[31m-CallInfo*ci=L->ci;[m
[31m-if(isLua(ci)){[m
[31m-char buff[60];[m
[31m-int line=currentline(L,ci);[m
[31m-luaO_chunkid(buff,getstr(getluaproto(ci)->source),60);[m
[31m-luaO_pushfstring(L,"%s:%d: %s",buff,line,msg);[m
[31m-}[m
[31m-}[m
[31m-static void luaG_errormsg(lua_State*L){[m
[31m-if(L->errfunc!=0){[m
[31m-StkId errfunc=restorestack(L,L->errfunc);[m
[31m-if(!ttisfunction(errfunc))luaD_throw(L,5);[m
[31m-setobj(L,L->top,L->top-1);[m
[31m-setobj(L,L->top-1,errfunc);[m
[31m-incr_top(L);[m
[31m-luaD_call(L,L->top-2,1);[m
[31m-}[m
[31m-luaD_throw(L,2);[m
[31m-}[m
[31m-static void luaG_runerror(lua_State*L,const char*fmt,...){[m
[31m-va_list argp;[m
[31m-va_start(argp,fmt);[m
[31m-addinfo(L,luaO_pushvfstring(L,fmt,argp));[m
[31m-va_end(argp);[m
[31m-luaG_errormsg(L);[m
[31m-}[m
[31m-static int luaZ_fill(ZIO*z){[m
[31m-size_t size;[m
[31m-lua_State*L=z->L;[m
[31m-const char*buff;[m
[31m-buff=z->reader(L,z->data,&size);[m
[31m-if(buff==NULL||size==0)return(-1);[m
[31m-z->n=size-1;[m
[31m-z->p=buff;[m
[31m-return char2int(*(z->p++));[m
[31m-}[m
[31m-static void luaZ_init(lua_State*L,ZIO*z,lua_Reader reader,void*data){[m
[31m-z->L=L;[m
[31m-z->reader=reader;[m
[31m-z->data=data;[m
[31m-z->n=0;[m
[31m-z->p=NULL;[m
[31m-}[m
[31m-static char*luaZ_openspace(lua_State*L,Mbuffer*buff,size_t n){[m
[31m-if(n>buff->buffsize){[m
[31m-if(n<32)n=32;[m
[31m-luaZ_resizebuffer(L,buff,n);[m
[31m-}[m
[31m-return buff->buffer;[m
[31m-}[m
[31m-#define opmode(t,a,b,c,m)(((t)<<7)|((a)<<6)|((b)<<4)|((c)<<2)|(m))[m
[31m-static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]={[m
[31m-opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgN,iABx)[m
[31m-,opmode(0,1,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgN,iABx)[m
[31m-,opmode(0,1,OpArgR,OpArgK,iABC)[m
[31m-,opmode(0,0,OpArgK,OpArgN,iABx)[m
[31m-,opmode(0,0,OpArgU,OpArgN,iABC)[m
[31m-,opmode(0,0,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgR,iABC)[m
[31m-,opmode(0,0,OpArgR,OpArgN,iAsBx)[m
[31m-,opmode(1,0,OpArgK,OpArgK,iABC)[m
[31m-,opmode(1,0,OpArgK,OpArgK,iABC)[m
[31m-,opmode(1,0,OpArgK,OpArgK,iABC)[m
[31m-,opmode(1,1,OpArgR,OpArgU,iABC)[m
[31m-,opmode(1,1,OpArgR,OpArgU,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,0,OpArgU,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iAsBx)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iAsBx)[m
[31m-,opmode(1,0,OpArgN,OpArgU,iABC)[m
[31m-,opmode(0,0,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,0,OpArgN,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgN,iABx)[m
[31m-,opmode(0,1,OpArgU,OpArgN,iABC)[m
[31m-};[m
[31m-#define next(ls)(ls->current=zgetc(ls->z))[m
[31m-#define currIsNewline(ls)(ls->current=='\n'||ls->current=='\r')[m
[31m-static const char*const luaX_tokens[]={[m
[31m-"and","break","do","else","elseif",[m
[31m-"end","false","for","function","if",[m
[31m-"in","local","nil","not","or","repeat",[m
[31m-"return","then","true","until","while",[m
[31m-"..","...","==",">=","<=","~=",[m
[31m-"<number>","<name>","<string>","<eof>",[m
[31m-NULL[m
[31m-};[m
[31m-#define save_and_next(ls)(save(ls,ls->current),next(ls))[m
[31m-static void save(LexState*ls,int c){[m
[31m-Mbuffer*b=ls->buff;[m
[31m-if(b->n+1>b->buffsize){[m
[31m-size_t newsize;[m
[31m-if(b->buffsize>=((size_t)(~(size_t)0)-2)/2)[m
[31m-luaX_lexerror(ls,"lexical element too long",0);[m
[31m-newsize=b->buffsize*2;[m
[31m-luaZ_resizebuffer(ls->L,b,newsize);[m
[31m-}[m
[31m-b->buffer[b->n++]=cast(char,c);[m
[31m-}[m
[31m-static void luaX_init(lua_State*L){[m
[31m-int i;[m
[31m-for(i=0;i<(cast(int,TK_WHILE-257+1));i++){[m
[31m-TString*ts=luaS_new(L,luaX_tokens[i]);[m
[31m-luaS_fix(ts);[m
[31m-ts->tsv.reserved=cast_byte(i+1);[m
[31m-}[m
[31m-}[m
[31m-static const char*luaX_token2str(LexState*ls,int token){[m
[31m-if(token<257){[m
[31m-return(iscntrl(token))?luaO_pushfstring(ls->L,"char(%d)",token):[m
[31m-luaO_pushfstring(ls->L,"%c",token);[m
[31m-}[m
[31m-else[m
[31m-return luaX_tokens[token-257];[m
[31m-}[m
[31m-static const char*txtToken(LexState*ls,int token){[m
[31m-switch(token){[m
[31m-case TK_NAME:[m
[31m-case TK_STRING:[m
[31m-case TK_NUMBER:[m
[31m-save(ls,'\0');[m
[31m-return luaZ_buffer(ls->buff);[m
[31m-default:[m
[31m-return luaX_token2str(ls,token);[m
[31m-}[m
[31m-}[m
[31m-static void luaX_lexerror(LexState*ls,const char*msg,int token){[m
[31m-char buff[80];[m
[31m-luaO_chunkid(buff,getstr(ls->source),80);[m
[31m-msg=luaO_pushfstring(ls->L,"%s:%d: %s",buff,ls->linenumber,msg);[m
[31m-if(token)[m
[31m-luaO_pushfstring(ls->L,"%s near "LUA_QL("%s"),msg,txtToken(ls,token));[m
[31m-luaD_throw(ls->L,3);[m
[31m-}[m
[31m-static void luaX_syntaxerror(LexState*ls,const char*msg){[m
[31m-luaX_lexerror(ls,msg,ls->t.token);[m
[31m-}[m
[31m-static TString*luaX_newstring(LexState*ls,const char*str,size_t l){[m
[31m-lua_State*L=ls->L;[m
[31m-TString*ts=luaS_newlstr(L,str,l);[m
[31m-TValue*o=luaH_setstr(L,ls->fs->h,ts);[m
[31m-if(ttisnil(o)){[m
[31m-setbvalue(o,1);[m
[31m-luaC_checkGC(L);[m
[31m-}[m
[31m-return ts;[m
[31m-}[m
[31m-static void inclinenumber(LexState*ls){[m
[31m-int old=ls->current;[m
[31m-next(ls);[m
[31m-if(currIsNewline(ls)&&ls->current!=old)[m
[31m-next(ls);[m
[31m-if(++ls->linenumber>=(INT_MAX-2))[m
[31m-luaX_syntaxerror(ls,"chunk has too many lines");[m
[31m-}[m
[31m-static void luaX_setinput(lua_State*L,LexState*ls,ZIO*z,TString*source){[m
[31m-ls->decpoint='.';[m
[31m-ls->L=L;[m
[31m-ls->lookahead.token=TK_EOS;[m
[31m-ls->z=z;[m
[31m-ls->fs=NULL;[m
[31m-ls->linenumber=1;[m
[31m-ls->lastline=1;[m
[31m-ls->source=source;[m
[31m-luaZ_resizebuffer(ls->L,ls->buff,32);[m
[31m-next(ls);[m
[31m-}[m
[31m-static int check_next(LexState*ls,const char*set){[m
[31m-if(!strchr(set,ls->current))[m
[31m-return 0;[m
[31m-save_and_next(ls);[m
[31m-return 1;[m
[31m-}[m
[31m-static void buffreplace(LexState*ls,char from,char to){[m
[31m-size_t n=luaZ_bufflen(ls->buff);[m
[31m-char*p=luaZ_buffer(ls->buff);[m
[31m-while(n--)[m
[31m-if(p[n]==from)p[n]=to;[m
[31m-}[m
[31m-static void read_numeral(LexState*ls,SemInfo*seminfo){[m
[31m-do{[m
[31m-save_and_next(ls);[m
[31m-}while(isdigit(ls->current)||ls->current=='.');[m
[31m-if(check_next(ls,"Ee"))[m
[31m-check_next(ls,"+-");[m
[31m-while(isalnum(ls->current)||ls->current=='_')[m
[31m-save_and_next(ls);[m
[31m-save(ls,'\0');[m
[31m-buffreplace(ls,'.',ls->decpoint);[m
[31m-if(!luaO_str2d(luaZ_buffer(ls->buff),&seminfo->r))[m
[31m-luaX_lexerror(ls,"malformed number",TK_NUMBER);[m
[31m-}[m
[31m-static int skip_sep(LexState*ls){[m
[31m-int count=0;[m
[31m-int s=ls->current;[m
[31m-save_and_next(ls);[m
[31m-while(ls->current=='='){[m
[31m-save_and_next(ls);[m
[31m-count++;[m
[31m-}[m
[31m-return(ls->current==s)?count:(-count)-1;[m
[31m-}[m
[31m-static void read_long_string(LexState*ls,SemInfo*seminfo,int sep){[m
[31m-int cont=0;[m
[31m-(void)(cont);[m
[31m-save_and_next(ls);[m
[31m-if(currIsNewline(ls))[m
[31m-inclinenumber(ls);[m
[31m-for(;;){[m
[31m-switch(ls->current){[m
[31m-case(-1):[m
[31m-luaX_lexerror(ls,(seminfo)?"unfinished long string":[m
[31m-"unfinished long comment",TK_EOS);[m
[31m-break;[m
[31m-case']':{[m
[31m-if(skip_sep(ls)==sep){[m
[31m-save_and_next(ls);[m
[31m-goto endloop;[m
[31m-}[m
[31m-break;[m
[31m-}[m
[31m-case'\n':[m
[31m-case'\r':{[m
[31m-save(ls,'\n');[m
[31m-inclinenumber(ls);[m
[31m-if(!seminfo)luaZ_resetbuffer(ls->buff);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-if(seminfo)save_and_next(ls);[m
[31m-else next(ls);[m
[31m-}[m
[31m-}[m
[31m-}endloop:[m
[31m-if(seminfo)[m
[31m-seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+(2+sep),[m
[31m-luaZ_bufflen(ls->buff)-2*(2+sep));[m
[31m-}[m
[31m-static void read_string(LexState*ls,int del,SemInfo*seminfo){[m
[31m-save_and_next(ls);[m
[31m-while(ls->current!=del){[m
[31m-switch(ls->current){[m
[31m-case(-1):[m
[31m-luaX_lexerror(ls,"unfinished string",TK_EOS);[m
[31m-continue;[m
[31m-case'\n':[m
[31m-case'\r':[m
[31m-luaX_lexerror(ls,"unfinished string",TK_STRING);[m
[31m-continue;[m
[31m-case'\\':{[m
[31m-int c;[m
[31m-next(ls);[m
[31m-switch(ls->current){[m
[31m-case'a':c='\a';break;[m
[31m-case'b':c='\b';break;[m
[31m-case'f':c='\f';break;[m
[31m-case'n':c='\n';break;[m
[31m-case'r':c='\r';break;[m
[31m-case't':c='\t';break;[m
[31m-case'v':c='\v';break;[m
[31m-case'\n':[m
[31m-case'\r':save(ls,'\n');inclinenumber(ls);continue;[m
[31m-case(-1):continue;[m
[31m-default:{[m
[31m-if(!isdigit(ls->current))[m
[31m-save_and_next(ls);[m
[31m-else{[m
[31m-int i=0;[m
[31m-c=0;[m
[31m-do{[m
[31m-c=10*c+(ls->current-'0');[m
[31m-next(ls);[m
[31m-}while(++i<3&&isdigit(ls->current));[m
[31m-if(c>UCHAR_MAX)[m
[31m-luaX_lexerror(ls,"escape sequence too large",TK_STRING);[m
[31m-save(ls,c);[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-}[m
[31m-save(ls,c);[m
[31m-next(ls);[m
[31m-continue;[m
[31m-}[m
[31m-default:[m
[31m-save_and_next(ls);[m
[31m-}[m
[31m-}[m
[31m-save_and_next(ls);[m
[31m-seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+1,[m
[31m-luaZ_bufflen(ls->buff)-2);[m
[31m-}[m
[31m-static int llex(LexState*ls,SemInfo*seminfo){[m
[31m-luaZ_resetbuffer(ls->buff);[m
[31m-for(;;){[m
[31m-switch(ls->current){[m
[31m-case'\n':[m
[31m-case'\r':{[m
[31m-inclinenumber(ls);[m
[31m-continue;[m
[31m-}[m
[31m-case'-':{[m
[31m-next(ls);[m
[31m-if(ls->current!='-')return'-';[m
[31m-next(ls);[m
[31m-if(ls->current=='['){[m
[31m-int sep=skip_sep(ls);[m
[31m-luaZ_resetbuffer(ls->buff);[m
[31m-if(sep>=0){[m
[31m-read_long_string(ls,NULL,sep);[m
[31m-luaZ_resetbuffer(ls->buff);[m
[31m-continue;[m
[31m-}[m
[31m-}[m
[31m-while(!currIsNewline(ls)&&ls->current!=(-1))[m
[31m-next(ls);[m
[31m-continue;[m
[31m-}[m
[31m-case'[':{[m
[31m-int sep=skip_sep(ls);[m
[31m-if(sep>=0){[m
[31m-read_long_string(ls,seminfo,sep);[m
[31m-return TK_STRING;[m
[31m-}[m
[31m-else if(sep==-1)return'[';[m
[31m-else luaX_lexerror(ls,"invalid long string delimiter",TK_STRING);[m
[31m-}[m
[31m-case'=':{[m
[31m-next(ls);[m
[31m-if(ls->current!='=')return'=';[m
[31m-else{next(ls);return TK_EQ;}[m
[31m-}[m
[31m-case'<':{[m
[31m-next(ls);[m
[31m-if(ls->current!='=')return'<';[m
[31m-else{next(ls);return TK_LE;}[m
[31m-}[m
[31m-case'>':{[m
[31m-next(ls);[m
[31m-if(ls->current!='=')return'>';[m
[31m-else{next(ls);return TK_GE;}[m
[31m-}[m
[31m-case'~':{[m
[31m-next(ls);[m
[31m-if(ls->current!='=')return'~';[m
[31m-else{next(ls);return TK_NE;}[m
[31m-}[m
[31m-case'"':[m
[31m-case'\'':{[m
[31m-read_string(ls,ls->current,seminfo);[m
[31m-return TK_STRING;[m
[31m-}[m
[31m-case'.':{[m
[31m-save_and_next(ls);[m
[31m-if(check_next(ls,".")){[m
[31m-if(check_next(ls,"."))[m
[31m-return TK_DOTS;[m
[31m-else return TK_CONCAT;[m
[31m-}[m
[31m-else if(!isdigit(ls->current))return'.';[m
[31m-else{[m
[31m-read_numeral(ls,seminfo);[m
[31m-return TK_NUMBER;[m
[31m-}[m
[31m-}[m
[31m-case(-1):{[m
[31m-return TK_EOS;[m
[31m-}[m
[31m-default:{[m
[31m-if(isspace(ls->current)){[m
[31m-next(ls);[m
[31m-continue;[m
[31m-}[m
[31m-else if(isdigit(ls->current)){[m
[31m-read_numeral(ls,seminfo);[m
[31m-return TK_NUMBER;[m
[31m-}[m
[31m-else if(isalpha(ls->current)||ls->current=='_'){[m
[31m-TString*ts;[m
[31m-do{[m
[31m-save_and_next(ls);[m
[31m-}while(isalnum(ls->current)||ls->current=='_');[m
[31m-ts=luaX_newstring(ls,luaZ_buffer(ls->buff),[m
[31m-luaZ_bufflen(ls->buff));[m
[31m-if(ts->tsv.reserved>0)[m
[31m-return ts->tsv.reserved-1+257;[m
[31m-else{[m
[31m-seminfo->ts=ts;[m
[31m-return TK_NAME;[m
[31m-}[m
[31m-}[m
[31m-else{[m
[31m-int c=ls->current;[m
[31m-next(ls);[m
[31m-return c;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void luaX_next(LexState*ls){[m
[31m-ls->lastline=ls->linenumber;[m
[31m-if(ls->lookahead.token!=TK_EOS){[m
[31m-ls->t=ls->lookahead;[m
[31m-ls->lookahead.token=TK_EOS;[m
[31m-}[m
[31m-else[m
[31m-ls->t.token=llex(ls,&ls->t.seminfo);[m
[31m-}[m
[31m-static void luaX_lookahead(LexState*ls){[m
[31m-ls->lookahead.token=llex(ls,&ls->lookahead.seminfo);[m
[31m-}[m
[31m-#define hasjumps(e)((e)->t!=(e)->f)[m
[31m-static int isnumeral(expdesc*e){[m
[31m-return(e->k==VKNUM&&e->t==(-1)&&e->f==(-1));[m
[31m-}[m
[31m-static void luaK_nil(FuncState*fs,int from,int n){[m
[31m-Instruction*previous;[m
[31m-if(fs->pc>fs->lasttarget){[m
[31m-if(fs->pc==0){[m
[31m-if(from>=fs->nactvar)[m
[31m-return;[m
[31m-}[m
[31m-else{[m
[31m-previous=&fs->f->code[fs->pc-1];[m
[31m-if(GET_OPCODE(*previous)==OP_LOADNIL){[m
[31m-int pfrom=GETARG_A(*previous);[m
[31m-int pto=GETARG_B(*previous);[m
[31m-if(pfrom<=from&&from<=pto+1){[m
[31m-if(from+n-1>pto)[m
[31m-SETARG_B(*previous,from+n-1);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-luaK_codeABC(fs,OP_LOADNIL,from,from+n-1,0);[m
[31m-}[m
[31m-static int luaK_jump(FuncState*fs){[m
[31m-int jpc=fs->jpc;[m
[31m-int j;[m
[31m-fs->jpc=(-1);[m
[31m-j=luaK_codeAsBx(fs,OP_JMP,0,(-1));[m
[31m-luaK_concat(fs,&j,jpc);[m
[31m-return j;[m
[31m-}[m
[31m-static void luaK_ret(FuncState*fs,int first,int nret){[m
[31m-luaK_codeABC(fs,OP_RETURN,first,nret+1,0);[m
[31m-}[m
[31m-static int condjump(FuncState*fs,OpCode op,int A,int B,int C){[m
[31m-luaK_codeABC(fs,op,A,B,C);[m
[31m-return luaK_jump(fs);[m
[31m-}[m
[31m-static void fixjump(FuncState*fs,int pc,int dest){[m
[31m-Instruction*jmp=&fs->f->code[pc];[m
[31m-int offset=dest-(pc+1);[m
[31m-if(abs(offset)>(((1<<(9+9))-1)>>1))[m
[31m-luaX_syntaxerror(fs->ls,"control structure too long");[m
[31m-SETARG_sBx(*jmp,offset);[m
[31m-}[m
[31m-static int luaK_getlabel(FuncState*fs){[m
[31m-fs->lasttarget=fs->pc;[m
[31m-return fs->pc;[m
[31m-}[m
[31m-static int getjump(FuncState*fs,int pc){[m
[31m-int offset=GETARG_sBx(fs->f->code[pc]);[m
[31m-if(offset==(-1))[m
[31m-return(-1);[m
[31m-else[m
[31m-return(pc+1)+offset;[m
[31m-}[m
[31m-static Instruction*getjumpcontrol(FuncState*fs,int pc){[m
[31m-Instruction*pi=&fs->f->code[pc];[m
[31m-if(pc>=1&&testTMode(GET_OPCODE(*(pi-1))))[m
[31m-return pi-1;[m
[31m-else[m
[31m-return pi;[m
[31m-}[m
[31m-static int need_value(FuncState*fs,int list){[m
[31m-for(;list!=(-1);list=getjump(fs,list)){[m
[31m-Instruction i=*getjumpcontrol(fs,list);[m
[31m-if(GET_OPCODE(i)!=OP_TESTSET)return 1;[m
[31m-}[m
[31m-return 0;[m
[31m-}[m
[31m-static int patchtestreg(FuncState*fs,int node,int reg){[m
[31m-Instruction*i=getjumpcontrol(fs,node);[m
[31m-if(GET_OPCODE(*i)!=OP_TESTSET)[m
[31m-return 0;[m
[31m-if(reg!=((1<<8)-1)&&reg!=GETARG_B(*i))[m
[31m-SETARG_A(*i,reg);[m
[31m-else[m
[31m-*i=CREATE_ABC(OP_TEST,GETARG_B(*i),0,GETARG_C(*i));[m
[31m-return 1;[m
[31m-}[m
[31m-static void removevalues(FuncState*fs,int list){[m
[31m-for(;list!=(-1);list=getjump(fs,list))[m
[31m-patchtestreg(fs,list,((1<<8)-1));[m
[31m-}[m
[31m-static void patchlistaux(FuncState*fs,int list,int vtarget,int reg,[m
[31m-int dtarget){[m
[31m-while(list!=(-1)){[m
[31m-int next=getjump(fs,list);[m
[31m-if(patchtestreg(fs,list,reg))[m
[31m-fixjump(fs,list,vtarget);[m
[31m-else[m
[31m-fixjump(fs,list,dtarget);[m
[31m-list=next;[m
[31m-}[m
[31m-}[m
[31m-static void dischargejpc(FuncState*fs){[m
[31m-patchlistaux(fs,fs->jpc,fs->pc,((1<<8)-1),fs->pc);[m
[31m-fs->jpc=(-1);[m
[31m-}[m
[31m-static void luaK_patchlist(FuncState*fs,int list,int target){[m
[31m-if(target==fs->pc)[m
[31m-luaK_patchtohere(fs,list);[m
[31m-else{[m
[31m-patchlistaux(fs,list,target,((1<<8)-1),target);[m
[31m-}[m
[31m-}[m
[31m-static void luaK_patchtohere(FuncState*fs,int list){[m
[31m-luaK_getlabel(fs);[m
[31m-luaK_concat(fs,&fs->jpc,list);[m
[31m-}[m
[31m-static void luaK_concat(FuncState*fs,int*l1,int l2){[m
[31m-if(l2==(-1))return;[m
[31m-else if(*l1==(-1))[m
[31m-*l1=l2;[m
[31m-else{[m
[31m-int list=*l1;[m
[31m-int next;[m
[31m-while((next=getjump(fs,list))!=(-1))[m
[31m-list=next;[m
[31m-fixjump(fs,list,l2);[m
[31m-}[m
[31m-}[m
[31m-static void luaK_checkstack(FuncState*fs,int n){[m
[31m-int newstack=fs->freereg+n;[m
[31m-if(newstack>fs->f->maxstacksize){[m
[31m-if(newstack>=250)[m
[31m-luaX_syntaxerror(fs->ls,"function or expression too complex");[m
[31m-fs->f->maxstacksize=cast_byte(newstack);[m
[31m-}[m
[31m-}[m
[31m-static void luaK_reserveregs(FuncState*fs,int n){[m
[31m-luaK_checkstack(fs,n);[m
[31m-fs->freereg+=n;[m
[31m-}[m
[31m-static void freereg(FuncState*fs,int reg){[m
[31m-if(!ISK(reg)&&reg>=fs->nactvar){[m
[31m-fs->freereg--;[m
[31m-}[m
[31m-}[m
[31m-static void freeexp(FuncState*fs,expdesc*e){[m
[31m-if(e->k==VNONRELOC)[m
[31m-freereg(fs,e->u.s.info);[m
[31m-}[m
[31m-static int addk(FuncState*fs,TValue*k,TValue*v){[m
[31m-lua_State*L=fs->L;[m
[31m-TValue*idx=luaH_set(L,fs->h,k);[m
[31m-Proto*f=fs->f;[m
[31m-int oldsize=f->sizek;[m
[31m-if(ttisnumber(idx)){[m
[31m-return cast_int(nvalue(idx));[m
[31m-}[m
[31m-else{[m
[31m-setnvalue(idx,cast_num(fs->nk));[m
[31m-luaM_growvector(L,f->k,fs->nk,f->sizek,TValue,[m
[31m-((1<<(9+9))-1),"constant table overflow");[m
[31m-while(oldsize<f->sizek)setnilvalue(&f->k[oldsize++]);[m
[31m-setobj(L,&f->k[fs->nk],v);[m
[31m-luaC_barrier(L,f,v);[m
[31m-return fs->nk++;[m
[31m-}[m
[31m-}[m
[31m-static int luaK_stringK(FuncState*fs,TString*s){[m
[31m-TValue o;[m
[31m-setsvalue(fs->L,&o,s);[m
[31m-return addk(fs,&o,&o);[m
[31m-}[m
[31m-static int luaK_numberK(FuncState*fs,lua_Number r){[m
[31m-TValue o;[m
[31m-setnvalue(&o,r);[m
[31m-return addk(fs,&o,&o);[m
[31m-}[m
[31m-static int boolK(FuncState*fs,int b){[m
[31m-TValue o;[m
[31m-setbvalue(&o,b);[m
[31m-return addk(fs,&o,&o);[m
[31m-}[m
[31m-static int nilK(FuncState*fs){[m
[31m-TValue k,v;[m
[31m-setnilvalue(&v);[m
[31m-sethvalue(fs->L,&k,fs->h);[m
[31m-return addk(fs,&k,&v);[m
[31m-}[m
[31m-static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults){[m
[31m-if(e->k==VCALL){[m
[31m-SETARG_C(getcode(fs,e),nresults+1);[m
[31m-}[m
[31m-else if(e->k==VVARARG){[m
[31m-SETARG_B(getcode(fs,e),nresults+1);[m
[31m-SETARG_A(getcode(fs,e),fs->freereg);[m
[31m-luaK_reserveregs(fs,1);[m
[31m-}[m
[31m-}[m
[31m-static void luaK_setoneret(FuncState*fs,expdesc*e){[m
[31m-if(e->k==VCALL){[m
[31m-e->k=VNONRELOC;[m
[31m-e->u.s.info=GETARG_A(getcode(fs,e));[m
[31m-}[m
[31m-else if(e->k==VVARARG){[m
[31m-SETARG_B(getcode(fs,e),2);[m
[31m-e->k=VRELOCABLE;[m
[31m-}[m
[31m-}[m
[31m-static void luaK_dischargevars(FuncState*fs,expdesc*e){[m
[31m-switch(e->k){[m
[31m-case VLOCAL:{[m
[31m-e->k=VNONRELOC;[m
[31m-break;[m
[31m-}[m
[31m-case VUPVAL:{[m
[31m-e->u.s.info=luaK_codeABC(fs,OP_GETUPVAL,0,e->u.s.info,0);[m
[31m-e->k=VRELOCABLE;[m
[31m-break;[m
[31m-}[m
[31m-case VGLOBAL:{[m
[31m-e->u.s.info=luaK_codeABx(fs,OP_GETGLOBAL,0,e->u.s.info);[m
[31m-e->k=VRELOCABLE;[m
[31m-break;[m
[31m-}[m
[31m-case VINDEXED:{[m
[31m-freereg(fs,e->u.s.aux);[m
[31m-freereg(fs,e->u.s.info);[m
[31m-e->u.s.info=luaK_codeABC(fs,OP_GETTABLE,0,e->u.s.info,e->u.s.aux);[m
[31m-e->k=VRELOCABLE;[m
[31m-break;[m
[31m-}[m
[31m-case VVARARG:[m
[31m-case VCALL:{[m
[31m-luaK_setoneret(fs,e);[m
[31m-break;[m
[31m-}[m
[31m-default:break;[m
[31m-}[m
[31m-}[m
[31m-static int code_label(FuncState*fs,int A,int b,int jump){[m
[31m-luaK_getlabel(fs);[m
[31m-return luaK_codeABC(fs,OP_LOADBOOL,A,b,jump);[m
[31m-}[m
[31m-static void discharge2reg(FuncState*fs,expdesc*e,int reg){[m
[31m-luaK_dischargevars(fs,e);[m
[31m-switch(e->k){[m
[31m-case VNIL:{[m
[31m-luaK_nil(fs,reg,1);[m
[31m-break;[m
[31m-}[m
[31m-case VFALSE:case VTRUE:{[m
[31m-luaK_codeABC(fs,OP_LOADBOOL,reg,e->k==VTRUE,0);[m
[31m-break;[m
[31m-}[m
[31m-case VK:{[m
[31m-luaK_codeABx(fs,OP_LOADK,reg,e->u.s.info);[m
[31m-break;[m
[31m-}[m
[31m-case VKNUM:{[m
[31m-luaK_codeABx(fs,OP_LOADK,reg,luaK_numberK(fs,e->u.nval));[m
[31m-break;[m
[31m-}[m
[31m-case VRELOCABLE:{[m
[31m-Instruction*pc=&getcode(fs,e);[m
[31m-SETARG_A(*pc,reg);[m
[31m-break;[m
[31m-}[m
[31m-case VNONRELOC:{[m
[31m-if(reg!=e->u.s.info)[m
[31m-luaK_codeABC(fs,OP_MOVE,reg,e->u.s.info,0);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-e->u.s.info=reg;[m
[31m-e->k=VNONRELOC;[m
[31m-}[m
[31m-static void discharge2anyreg(FuncState*fs,expdesc*e){[m
[31m-if(e->k!=VNONRELOC){[m
[31m-luaK_reserveregs(fs,1);[m
[31m-discharge2reg(fs,e,fs->freereg-1);[m
[31m-}[m
[31m-}[m
[31m-static void exp2reg(FuncState*fs,expdesc*e,int reg){[m
[31m-discharge2reg(fs,e,reg);[m
[31m-if(e->k==VJMP)[m
[31m-luaK_concat(fs,&e->t,e->u.s.info);[m
[31m-if(hasjumps(e)){[m
[31m-int final;[m
[31m-int p_f=(-1);[m
[31m-int p_t=(-1);[m
[31m-if(need_value(fs,e->t)||need_value(fs,e->f)){[m
[31m-int fj=(e->k==VJMP)?(-1):luaK_jump(fs);[m
[31m-p_f=code_label(fs,reg,0,1);[m
[31m-p_t=code_label(fs,reg,1,0);[m
[31m-luaK_patchtohere(fs,fj);[m
[31m-}[m
[31m-final=luaK_getlabel(fs);[m
[31m-patchlistaux(fs,e->f,final,reg,p_f);[m
[31m-patchlistaux(fs,e->t,final,reg,p_t);[m
[31m-}[m
[31m-e->f=e->t=(-1);[m
[31m-e->u.s.info=reg;[m
[31m-e->k=VNONRELOC;[m
[31m-}[m
[31m-static void luaK_exp2nextreg(FuncState*fs,expdesc*e){[m
[31m-luaK_dischargevars(fs,e);[m
[31m-freeexp(fs,e);[m
[31m-luaK_reserveregs(fs,1);[m
[31m-exp2reg(fs,e,fs->freereg-1);[m
[31m-}[m
[31m-static int luaK_exp2anyreg(FuncState*fs,expdesc*e){[m
[31m-luaK_dischargevars(fs,e);[m
[31m-if(e->k==VNONRELOC){[m
[31m-if(!hasjumps(e))return e->u.s.info;[m
[31m-if(e->u.s.info>=fs->nactvar){[m
[31m-exp2reg(fs,e,e->u.s.info);[m
[31m-return e->u.s.info;[m
[31m-}[m
[31m-}[m
[31m-luaK_exp2nextreg(fs,e);[m
[31m-return e->u.s.info;[m
[31m-}[m
[31m-static void luaK_exp2val(FuncState*fs,expdesc*e){[m
[31m-if(hasjumps(e))[m
[31m-luaK_exp2anyreg(fs,e);[m
[31m-else[m
[31m-luaK_dischargevars(fs,e);[m
[31m-}[m
[31m-static int luaK_exp2RK(FuncState*fs,expdesc*e){[m
[31m-luaK_exp2val(fs,e);[m
[31m-switch(e->k){[m
[31m-case VKNUM:[m
[31m-case VTRUE:[m
[31m-case VFALSE:[m
[31m-case VNIL:{[m
[31m-if(fs->nk<=((1<<(9-1))-1)){[m
[31m-e->u.s.info=(e->k==VNIL)?nilK(fs):[m
[31m-(e->k==VKNUM)?luaK_numberK(fs,e->u.nval):[m
[31m-boolK(fs,(e->k==VTRUE));[m
[31m-e->k=VK;[m
[31m-return RKASK(e->u.s.info);[m
[31m-}[m
[31m-else break;[m
[31m-}[m
[31m-case VK:{[m
[31m-if(e->u.s.info<=((1<<(9-1))-1))[m
[31m-return RKASK(e->u.s.info);[m
[31m-else break;[m
[31m-}[m
[31m-default:break;[m
[31m-}[m
[31m-return luaK_exp2anyreg(fs,e);[m
[31m-}[m
[31m-static void luaK_storevar(FuncState*fs,expdesc*var,expdesc*ex){[m
[31m-switch(var->k){[m
[31m-case VLOCAL:{[m
[31m-freeexp(fs,ex);[m
[31m-exp2reg(fs,ex,var->u.s.info);[m
[31m-return;[m
[31m-}[m
[31m-case VUPVAL:{[m
[31m-int e=luaK_exp2anyreg(fs,ex);[m
[31m-luaK_codeABC(fs,OP_SETUPVAL,e,var->u.s.info,0);[m
[31m-break;[m
[31m-}[m
[31m-case VGLOBAL:{[m
[31m-int e=luaK_exp2anyreg(fs,ex);[m
[31m-luaK_codeABx(fs,OP_SETGLOBAL,e,var->u.s.info);[m
[31m-break;[m
[31m-}[m
[31m-case VINDEXED:{[m
[31m-int e=luaK_exp2RK(fs,ex);[m
[31m-luaK_codeABC(fs,OP_SETTABLE,var->u.s.info,var->u.s.aux,e);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-freeexp(fs,ex);[m
[31m-}[m
[31m-static void luaK_self(FuncState*fs,expdesc*e,expdesc*key){[m
[31m-int func;[m
[31m-luaK_exp2anyreg(fs,e);[m
[31m-freeexp(fs,e);[m
[31m-func=fs->freereg;[m
[31m-luaK_reserveregs(fs,2);[m
[31m-luaK_codeABC(fs,OP_SELF,func,e->u.s.info,luaK_exp2RK(fs,key));[m
[31m-freeexp(fs,key);[m
[31m-e->u.s.info=func;[m
[31m-e->k=VNONRELOC;[m
[31m-}[m
[31m-static void invertjump(FuncState*fs,expdesc*e){[m
[31m-Instruction*pc=getjumpcontrol(fs,e->u.s.info);[m
[31m-SETARG_A(*pc,!(GETARG_A(*pc)));[m
[31m-}[m
[31m-static int jumponcond(FuncState*fs,expdesc*e,int cond){[m
[31m-if(e->k==VRELOCABLE){[m
[31m-Instruction ie=getcode(fs,e);[m
[31m-if(GET_OPCODE(ie)==OP_NOT){[m
[31m-fs->pc--;[m
[31m-return condjump(fs,OP_TEST,GETARG_B(ie),0,!cond);[m
[31m-}[m
[31m-}[m
[31m-discharge2anyreg(fs,e);[m
[31m-freeexp(fs,e);[m
[31m-return condjump(fs,OP_TESTSET,((1<<8)-1),e->u.s.info,cond);[m
[31m-}[m
[31m-static void luaK_goiftrue(FuncState*fs,expdesc*e){[m
[31m-int pc;[m
[31m-luaK_dischargevars(fs,e);[m
[31m-switch(e->k){[m
[31m-case VK:case VKNUM:case VTRUE:{[m
[31m-pc=(-1);[m
[31m-break;[m
[31m-}[m
[31m-case VJMP:{[m
[31m-invertjump(fs,e);[m
[31m-pc=e->u.s.info;[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-pc=jumponcond(fs,e,0);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-luaK_concat(fs,&e->f,pc);[m
[31m-luaK_patchtohere(fs,e->t);[m
[31m-e->t=(-1);[m
[31m-}[m
[31m-static void luaK_goiffalse(FuncState*fs,expdesc*e){[m
[31m-int pc;[m
[31m-luaK_dischargevars(fs,e);[m
[31m-switch(e->k){[m
[31m-case VNIL:case VFALSE:{[m
[31m-pc=(-1);[m
[31m-break;[m
[31m-}[m
[31m-case VJMP:{[m
[31m-pc=e->u.s.info;[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-pc=jumponcond(fs,e,1);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-luaK_concat(fs,&e->t,pc);[m
[31m-luaK_patchtohere(fs,e->f);[m
[31m-e->f=(-1);[m
[31m-}[m
[31m-static void codenot(FuncState*fs,expdesc*e){[m
[31m-luaK_dischargevars(fs,e);[m
[31m-switch(e->k){[m
[31m-case VNIL:case VFALSE:{[m
[31m-e->k=VTRUE;[m
[31m-break;[m
[31m-}[m
[31m-case VK:case VKNUM:case VTRUE:{[m
[31m-e->k=VFALSE;[m
[31m-break;[m
[31m-}[m
[31m-case VJMP:{[m
[31m-invertjump(fs,e);[m
[31m-break;[m
[31m-}[m
[31m-case VRELOCABLE:[m
[31m-case VNONRELOC:{[m
[31m-discharge2anyreg(fs,e);[m
[31m-freeexp(fs,e);[m
[31m-e->u.s.info=luaK_codeABC(fs,OP_NOT,0,e->u.s.info,0);[m
[31m-e->k=VRELOCABLE;[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-{int temp=e->f;e->f=e->t;e->t=temp;}[m
[31m-removevalues(fs,e->f);[m
[31m-removevalues(fs,e->t);[m
[31m-}[m
[31m-static void luaK_indexed(FuncState*fs,expdesc*t,expdesc*k){[m
[31m-t->u.s.aux=luaK_exp2RK(fs,k);[m
[31m-t->k=VINDEXED;[m
[31m-}[m
[31m-static int constfolding(OpCode op,expdesc*e1,expdesc*e2){[m
[31m-lua_Number v1,v2,r;[m
[31m-if(!isnumeral(e1)||!isnumeral(e2))return 0;[m
[31m-v1=e1->u.nval;[m
[31m-v2=e2->u.nval;[m
[31m-switch(op){[m
[31m-case OP_ADD:r=luai_numadd(v1,v2);break;[m
[31m-case OP_SUB:r=luai_numsub(v1,v2);break;[m
[31m-case OP_MUL:r=luai_nummul(v1,v2);break;[m
[31m-case OP_DIV:[m
[31m-if(v2==0)return 0;[m
[31m-r=luai_numdiv(v1,v2);break;[m
[31m-case OP_MOD:[m
[31m-if(v2==0)return 0;[m
[31m-r=luai_nummod(v1,v2);break;[m
[31m-case OP_POW:r=luai_numpow(v1,v2);break;[m
[31m-case OP_UNM:r=luai_numunm(v1);break;[m
[31m-case OP_LEN:return 0;[m
[31m-default:r=0;break;[m
[31m-}[m
[31m-if(luai_numisnan(r))return 0;[m
[31m-e1->u.nval=r;[m
[31m-return 1;[m
[31m-}[m
[31m-static void codearith(FuncState*fs,OpCode op,expdesc*e1,expdesc*e2){[m
[31m-if(constfolding(op,e1,e2))[m
[31m-return;[m
[31m-else{[m
[31m-int o2=(op!=OP_UNM&&op!=OP_LEN)?luaK_exp2RK(fs,e2):0;[m
[31m-int o1=luaK_exp2RK(fs,e1);[m
[31m-if(o1>o2){[m
[31m-freeexp(fs,e1);[m
[31m-freeexp(fs,e2);[m
[31m-}[m
[31m-else{[m
[31m-freeexp(fs,e2);[m
[31m-freeexp(fs,e1);[m
[31m-}[m
[31m-e1->u.s.info=luaK_codeABC(fs,op,0,o1,o2);[m
[31m-e1->k=VRELOCABLE;[m
[31m-}[m
[31m-}[m
[31m-static void codecomp(FuncState*fs,OpCode op,int cond,expdesc*e1,[m
[31m-expdesc*e2){[m
[31m-int o1=luaK_exp2RK(fs,e1);[m
[31m-int o2=luaK_exp2RK(fs,e2);[m
[31m-freeexp(fs,e2);[m
[31m-freeexp(fs,e1);[m
[31m-if(cond==0&&op!=OP_EQ){[m
[31m-int temp;[m
[31m-temp=o1;o1=o2;o2=temp;[m
[31m-cond=1;[m
[31m-}[m
[31m-e1->u.s.info=condjump(fs,op,cond,o1,o2);[m
[31m-e1->k=VJMP;[m
[31m-}[m
[31m-static void luaK_prefix(FuncState*fs,UnOpr op,expdesc*e){[m
[31m-expdesc e2;[m
[31m-e2.t=e2.f=(-1);e2.k=VKNUM;e2.u.nval=0;[m
[31m-switch(op){[m
[31m-case OPR_MINUS:{[m
[31m-if(!isnumeral(e))[m
[31m-luaK_exp2anyreg(fs,e);[m
[31m-codearith(fs,OP_UNM,e,&e2);[m
[31m-break;[m
[31m-}[m
[31m-case OPR_NOT:codenot(fs,e);break;[m
[31m-case OPR_LEN:{[m
[31m-luaK_exp2anyreg(fs,e);[m
[31m-codearith(fs,OP_LEN,e,&e2);[m
[31m-break;[m
[31m-}[m
[31m-default:;[m
[31m-}[m
[31m-}[m
[31m-static void luaK_infix(FuncState*fs,BinOpr op,expdesc*v){[m
[31m-switch(op){[m
[31m-case OPR_AND:{[m
[31m-luaK_goiftrue(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-case OPR_OR:{[m
[31m-luaK_goiffalse(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-case OPR_CONCAT:{[m
[31m-luaK_exp2nextreg(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-case OPR_ADD:case OPR_SUB:case OPR_MUL:case OPR_DIV:[m
[31m-case OPR_MOD:case OPR_POW:{[m
[31m-if(!isnumeral(v))luaK_exp2RK(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-luaK_exp2RK(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void luaK_posfix(FuncState*fs,BinOpr op,expdesc*e1,expdesc*e2){[m
[31m-switch(op){[m
[31m-case OPR_AND:{[m
[31m-luaK_dischargevars(fs,e2);[m
[31m-luaK_concat(fs,&e2->f,e1->f);[m
[31m-*e1=*e2;[m
[31m-break;[m
[31m-}[m
[31m-case OPR_OR:{[m
[31m-luaK_dischargevars(fs,e2);[m
[31m-luaK_concat(fs,&e2->t,e1->t);[m
[31m-*e1=*e2;[m
[31m-break;[m
[31m-}[m
[31m-case OPR_CONCAT:{[m
[31m-luaK_exp2val(fs,e2);[m
[31m-if(e2->k==VRELOCABLE&&GET_OPCODE(getcode(fs,e2))==OP_CONCAT){[m
[31m-freeexp(fs,e1);[m
[31m-SETARG_B(getcode(fs,e2),e1->u.s.info);[m
[31m-e1->k=VRELOCABLE;e1->u.s.info=e2->u.s.info;[m
[31m-}[m
[31m-else{[m
[31m-luaK_exp2nextreg(fs,e2);[m
[31m-codearith(fs,OP_CONCAT,e1,e2);[m
[31m-}[m
[31m-break;[m
[31m-}[m
[31m-case OPR_ADD:codearith(fs,OP_ADD,e1,e2);break;[m
[31m-case OPR_SUB:codearith(fs,OP_SUB,e1,e2);break;[m
[31m-case OPR_MUL:codearith(fs,OP_MUL,e1,e2);break;[m
[31m-case OPR_DIV:codearith(fs,OP_DIV,e1,e2);break;[m
[31m-case OPR_MOD:codearith(fs,OP_MOD,e1,e2);break;[m
[31m-case OPR_POW:codearith(fs,OP_POW,e1,e2);break;[m
[31m-case OPR_EQ:codecomp(fs,OP_EQ,1,e1,e2);break;[m
[31m-case OPR_NE:codecomp(fs,OP_EQ,0,e1,e2);break;[m
[31m-case OPR_LT:codecomp(fs,OP_LT,1,e1,e2);break;[m
[31m-case OPR_LE:codecomp(fs,OP_LE,1,e1,e2);break;[m
[31m-case OPR_GT:codecomp(fs,OP_LT,0,e1,e2);break;[m
[31m-case OPR_GE:codecomp(fs,OP_LE,0,e1,e2);break;[m
[31m-default:;[m
[31m-}[m
[31m-}[m
[31m-static void luaK_fixline(FuncState*fs,int line){[m
[31m-fs->f->lineinfo[fs->pc-1]=line;[m
[31m-}[m
[31m-static int luaK_code(FuncState*fs,Instruction i,int line){[m
[31m-Proto*f=fs->f;[m
[31m-dischargejpc(fs);[m
[31m-luaM_growvector(fs->L,f->code,fs->pc,f->sizecode,Instruction,[m
[31m-(INT_MAX-2),"code size overflow");[m
[31m-f->code[fs->pc]=i;[m
[31m-luaM_growvector(fs->L,f->lineinfo,fs->pc,f->sizelineinfo,int,[m
[31m-(INT_MAX-2),"code size overflow");[m
[31m-f->lineinfo[fs->pc]=line;[m
[31m-return fs->pc++;[m
[31m-}[m
[31m-static int luaK_codeABC(FuncState*fs,OpCode o,int a,int b,int c){[m
[31m-return luaK_code(fs,CREATE_ABC(o,a,b,c),fs->ls->lastline);[m
[31m-}[m
[31m-static int luaK_codeABx(FuncState*fs,OpCode o,int a,unsigned int bc){[m
[31m-return luaK_code(fs,CREATE_ABx(o,a,bc),fs->ls->lastline);[m
[31m-}[m
[31m-static void luaK_setlist(FuncState*fs,int base,int nelems,int tostore){[m
[31m-int c=(nelems-1)/50+1;[m
[31m-int b=(tostore==(-1))?0:tostore;[m
[31m-if(c<=((1<<9)-1))[m
[31m-luaK_codeABC(fs,OP_SETLIST,base,b,c);[m
[31m-else{[m
[31m-luaK_codeABC(fs,OP_SETLIST,base,b,0);[m
[31m-luaK_code(fs,cast(Instruction,c),fs->ls->lastline);[m
[31m-}[m
[31m-fs->freereg=base+1;[m
[31m-}[m
[31m-#define hasmultret(k)((k)==VCALL||(k)==VVARARG)[m
[31m-#define getlocvar(fs,i)((fs)->f->locvars[(fs)->actvar[i]])[m
[31m-#define luaY_checklimit(fs,v,l,m)if((v)>(l))errorlimit(fs,l,m)[m
[31m-typedef struct BlockCnt{[m
[31m-struct BlockCnt*previous;[m
[31m-int breaklist;[m
[31m-lu_byte nactvar;[m
[31m-lu_byte upval;[m
[31m-lu_byte isbreakable;[m
[31m-}BlockCnt;[m
[31m-static void chunk(LexState*ls);[m
[31m-static void expr(LexState*ls,expdesc*v);[m
[31m-static void anchor_token(LexState*ls){[m
[31m-if(ls->t.token==TK_NAME||ls->t.token==TK_STRING){[m
[31m-TString*ts=ls->t.seminfo.ts;[m
[31m-luaX_newstring(ls,getstr(ts),ts->tsv.len);[m
[31m-}[m
[31m-}[m
[31m-static void error_expected(LexState*ls,int token){[m
[31m-luaX_syntaxerror(ls,[m
[31m-luaO_pushfstring(ls->L,LUA_QL("%s")" expected",luaX_token2str(ls,token)));[m
[31m-}[m
[31m-static void errorlimit(FuncState*fs,int limit,const char*what){[m
[31m-const char*msg=(fs->f->linedefined==0)?[m
[31m-luaO_pushfstring(fs->L,"main function has more than %d %s",limit,what):[m
[31m-luaO_pushfstring(fs->L,"function at line %d has more than %d %s",[m
[31m-fs->f->linedefined,limit,what);[m
[31m-luaX_lexerror(fs->ls,msg,0);[m
[31m-}[m
[31m-static int testnext(LexState*ls,int c){[m
[31m-if(ls->t.token==c){[m
[31m-luaX_next(ls);[m
[31m-return 1;[m
[31m-}[m
[31m-else return 0;[m
[31m-}[m
[31m-static void check(LexState*ls,int c){[m
[31m-if(ls->t.token!=c)[m
[31m-error_expected(ls,c);[m
[31m-}[m
[31m-static void checknext(LexState*ls,int c){[m
[31m-check(ls,c);[m
[31m-luaX_next(ls);[m
[31m-}[m
[31m-#define check_condition(ls,c,msg){if(!(c))luaX_syntaxerror(ls,msg);}[m
[31m-static void check_match(LexState*ls,int what,int who,int where){[m
[31m-if(!testnext(ls,what)){[m
[31m-if(where==ls->linenumber)[m
[31m-error_expected(ls,what);[m
[31m-else{[m
[31m-luaX_syntaxerror(ls,luaO_pushfstring(ls->L,[m
[31m-LUA_QL("%s")" expected (to close "LUA_QL("%s")" at line %d)",[m
[31m-luaX_token2str(ls,what),luaX_token2str(ls,who),where));[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static TString*str_checkname(LexState*ls){[m
[31m-TString*ts;[m
[31m-check(ls,TK_NAME);[m
[31m-ts=ls->t.seminfo.ts;[m
[31m-luaX_next(ls);[m
[31m-return ts;[m
[31m-}[m
[31m-static void init_exp(expdesc*e,expkind k,int i){[m
[31m-e->f=e->t=(-1);[m
[31m-e->k=k;[m
[31m-e->u.s.info=i;[m
[31m-}[m
[31m-static void codestring(LexState*ls,expdesc*e,TString*s){[m
[31m-init_exp(e,VK,luaK_stringK(ls->fs,s));[m
[31m-}[m
[31m-static void checkname(LexState*ls,expdesc*e){[m
[31m-codestring(ls,e,str_checkname(ls));[m
[31m-}[m
[31m-static int registerlocalvar(LexState*ls,TString*varname){[m
[31m-FuncState*fs=ls->fs;[m
[31m-Proto*f=fs->f;[m
[31m-int oldsize=f->sizelocvars;[m
[31m-luaM_growvector(ls->L,f->locvars,fs->nlocvars,f->sizelocvars,[m
[31m-LocVar,SHRT_MAX,"too many local variables");[m
[31m-while(oldsize<f->sizelocvars)f->locvars[oldsize++].varname=NULL;[m
[31m-f->locvars[fs->nlocvars].varname=varname;[m
[31m-luaC_objbarrier(ls->L,f,varname);[m
[31m-return fs->nlocvars++;[m
[31m-}[m
[31m-#define new_localvarliteral(ls,v,n)new_localvar(ls,luaX_newstring(ls,""v,(sizeof(v)/sizeof(char))-1),n)[m
[31m-static void new_localvar(LexState*ls,TString*name,int n){[m
[31m-FuncState*fs=ls->fs;[m
[31m-luaY_checklimit(fs,fs->nactvar+n+1,200,"local variables");[m
[31m-fs->actvar[fs->nactvar+n]=cast(unsigned short,registerlocalvar(ls,name));[m
[31m-}[m
[31m-static void adjustlocalvars(LexState*ls,int nvars){[m
[31m-FuncState*fs=ls->fs;[m
[31m-fs->nactvar=cast_byte(fs->nactvar+nvars);[m
[31m-for(;nvars;nvars--){[m
[31m-getlocvar(fs,fs->nactvar-nvars).startpc=fs->pc;[m
[31m-}[m
[31m-}[m
[31m-static void removevars(LexState*ls,int tolevel){[m
[31m-FuncState*fs=ls->fs;[m
[31m-while(fs->nactvar>tolevel)[m
[31m-getlocvar(fs,--fs->nactvar).endpc=fs->pc;[m
[31m-}[m
[31m-static int indexupvalue(FuncState*fs,TString*name,expdesc*v){[m
[31m-int i;[m
[31m-Proto*f=fs->f;[m
[31m-int oldsize=f->sizeupvalues;[m
[31m-for(i=0;i<f->nups;i++){[m
[31m-if(fs->upvalues[i].k==v->k&&fs->upvalues[i].info==v->u.s.info){[m
[31m-return i;[m
[31m-}[m
[31m-}[m
[31m-luaY_checklimit(fs,f->nups+1,60,"upvalues");[m
[31m-luaM_growvector(fs->L,f->upvalues,f->nups,f->sizeupvalues,[m
[31m-TString*,(INT_MAX-2),"");[m
[31m-while(oldsize<f->sizeupvalues)f->upvalues[oldsize++]=NULL;[m
[31m-f->upvalues[f->nups]=name;[m
[31m-luaC_objbarrier(fs->L,f,name);[m
[31m-fs->upvalues[f->nups].k=cast_byte(v->k);[m
[31m-fs->upvalues[f->nups].info=cast_byte(v->u.s.info);[m
[31m-return f->nups++;[m
[31m-}[m
[31m-static int searchvar(FuncState*fs,TString*n){[m
[31m-int i;[m
[31m-for(i=fs->nactvar-1;i>=0;i--){[m
[31m-if(n==getlocvar(fs,i).varname)[m
[31m-return i;[m
[31m-}[m
[31m-return-1;[m
[31m-}[m
[31m-static void markupval(FuncState*fs,int level){[m
[31m-BlockCnt*bl=fs->bl;[m
[31m-while(bl&&bl->nactvar>level)bl=bl->previous;[m
[31m-if(bl)bl->upval=1;[m
[31m-}[m
[31m-static int singlevaraux(FuncState*fs,TString*n,expdesc*var,int base){[m
[31m-if(fs==NULL){[m
[31m-init_exp(var,VGLOBAL,((1<<8)-1));[m
[31m-return VGLOBAL;[m
[31m-}[m
[31m-else{[m
[31m-int v=searchvar(fs,n);[m
[31m-if(v>=0){[m
[31m-init_exp(var,VLOCAL,v);[m
[31m-if(!base)[m
[31m-markupval(fs,v);[m
[31m-return VLOCAL;[m
[31m-}[m
[31m-else{[m
[31m-if(singlevaraux(fs->prev,n,var,0)==VGLOBAL)[m
[31m-return VGLOBAL;[m
[31m-var->u.s.info=indexupvalue(fs,n,var);[m
[31m-var->k=VUPVAL;[m
[31m-return VUPVAL;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void singlevar(LexState*ls,expdesc*var){[m
[31m-TString*varname=str_checkname(ls);[m
[31m-FuncState*fs=ls->fs;[m
[31m-if(singlevaraux(fs,varname,var,1)==VGLOBAL)[m
[31m-var->u.s.info=luaK_stringK(fs,varname);[m
[31m-}[m
[31m-static void adjust_assign(LexState*ls,int nvars,int nexps,expdesc*e){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int extra=nvars-nexps;[m
[31m-if(hasmultret(e->k)){[m
[31m-extra++;[m
[31m-if(extra<0)extra=0;[m
[31m-luaK_setreturns(fs,e,extra);[m
[31m-if(extra>1)luaK_reserveregs(fs,extra-1);[m
[31m-}[m
[31m-else{[m
[31m-if(e->k!=VVOID)luaK_exp2nextreg(fs,e);[m
[31m-if(extra>0){[m
[31m-int reg=fs->freereg;[m
[31m-luaK_reserveregs(fs,extra);[m
[31m-luaK_nil(fs,reg,extra);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void enterlevel(LexState*ls){[m
[31m-if(++ls->L->nCcalls>200)[m
[31m-luaX_lexerror(ls,"chunk has too many syntax levels",0);[m
[31m-}[m
[31m-#define leavelevel(ls)((ls)->L->nCcalls--)[m
[31m-static void enterblock(FuncState*fs,BlockCnt*bl,lu_byte isbreakable){[m
[31m-bl->breaklist=(-1);[m
[31m-bl->isbreakable=isbreakable;[m
[31m-bl->nactvar=fs->nactvar;[m
[31m-bl->upval=0;[m
[31m-bl->previous=fs->bl;[m
[31m-fs->bl=bl;[m
[31m-}[m
[31m-static void leaveblock(FuncState*fs){[m
[31m-BlockCnt*bl=fs->bl;[m
[31m-fs->bl=bl->previous;[m
[31m-removevars(fs->ls,bl->nactvar);[m
[31m-if(bl->upval)[m
[31m-luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0);[m
[31m-fs->freereg=fs->nactvar;[m
[31m-luaK_patchtohere(fs,bl->breaklist);[m
[31m-}[m
[31m-static void pushclosure(LexState*ls,FuncState*func,expdesc*v){[m
[31m-FuncState*fs=ls->fs;[m
[31m-Proto*f=fs->f;[m
[31m-int oldsize=f->sizep;[m
[31m-int i;[m
[31m-luaM_growvector(ls->L,f->p,fs->np,f->sizep,Proto*,[m
[31m-((1<<(9+9))-1),"constant table overflow");[m
[31m-while(oldsize<f->sizep)f->p[oldsize++]=NULL;[m
[31m-f->p[fs->np++]=func->f;[m
[31m-luaC_objbarrier(ls->L,f,func->f);[m
[31m-init_exp(v,VRELOCABLE,luaK_codeABx(fs,OP_CLOSURE,0,fs->np-1));[m
[31m-for(i=0;i<func->f->nups;i++){[m
[31m-OpCode o=(func->upvalues[i].k==VLOCAL)?OP_MOVE:OP_GETUPVAL;[m
[31m-luaK_codeABC(fs,o,0,func->upvalues[i].info,0);[m
[31m-}[m
[31m-}[m
[31m-static void open_func(LexState*ls,FuncState*fs){[m
[31m-lua_State*L=ls->L;[m
[31m-Proto*f=luaF_newproto(L);[m
[31m-fs->f=f;[m
[31m-fs->prev=ls->fs;[m
[31m-fs->ls=ls;[m
[31m-fs->L=L;[m
[31m-ls->fs=fs;[m
[31m-fs->pc=0;[m
[31m-fs->lasttarget=-1;[m
[31m-fs->jpc=(-1);[m
[31m-fs->freereg=0;[m
[31m-fs->nk=0;[m
[31m-fs->np=0;[m
[31m-fs->nlocvars=0;[m
[31m-fs->nactvar=0;[m
[31m-fs->bl=NULL;[m
[31m-f->source=ls->source;[m
[31m-f->maxstacksize=2;[m
[31m-fs->h=luaH_new(L,0,0);[m
[31m-sethvalue(L,L->top,fs->h);[m
[31m-incr_top(L);[m
[31m-setptvalue(L,L->top,f);[m
[31m-incr_top(L);[m
[31m-}[m
[31m-static void close_func(LexState*ls){[m
[31m-lua_State*L=ls->L;[m
[31m-FuncState*fs=ls->fs;[m
[31m-Proto*f=fs->f;[m
[31m-removevars(ls,0);[m
[31m-luaK_ret(fs,0,0);[m
[31m-luaM_reallocvector(L,f->code,f->sizecode,fs->pc,Instruction);[m
[31m-f->sizecode=fs->pc;[m
[31m-luaM_reallocvector(L,f->lineinfo,f->sizelineinfo,fs->pc,int);[m
[31m-f->sizelineinfo=fs->pc;[m
[31m-luaM_reallocvector(L,f->k,f->sizek,fs->nk,TValue);[m
[31m-f->sizek=fs->nk;[m
[31m-luaM_reallocvector(L,f->p,f->sizep,fs->np,Proto*);[m
[31m-f->sizep=fs->np;[m
[31m-luaM_reallocvector(L,f->locvars,f->sizelocvars,fs->nlocvars,LocVar);[m
[31m-f->sizelocvars=fs->nlocvars;[m
[31m-luaM_reallocvector(L,f->upvalues,f->sizeupvalues,f->nups,TString*);[m
[31m-f->sizeupvalues=f->nups;[m
[31m-ls->fs=fs->prev;[m
[31m-if(fs)anchor_token(ls);[m
[31m-L->top-=2;[m
[31m-}[m
[31m-static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,const char*name){[m
[31m-struct LexState lexstate;[m
[31m-struct FuncState funcstate;[m
[31m-lexstate.buff=buff;[m
[31m-luaX_setinput(L,&lexstate,z,luaS_new(L,name));[m
[31m-open_func(&lexstate,&funcstate);[m
[31m-funcstate.f->is_vararg=2;[m
[31m-luaX_next(&lexstate);[m
[31m-chunk(&lexstate);[m
[31m-check(&lexstate,TK_EOS);[m
[31m-close_func(&lexstate);[m
[31m-return funcstate.f;[m
[31m-}[m
[31m-static void field(LexState*ls,expdesc*v){[m
[31m-FuncState*fs=ls->fs;[m
[31m-expdesc key;[m
[31m-luaK_exp2anyreg(fs,v);[m
[31m-luaX_next(ls);[m
[31m-checkname(ls,&key);[m
[31m-luaK_indexed(fs,v,&key);[m
[31m-}[m
[31m-static void yindex(LexState*ls,expdesc*v){[m
[31m-luaX_next(ls);[m
[31m-expr(ls,v);[m
[31m-luaK_exp2val(ls->fs,v);[m
[31m-checknext(ls,']');[m
[31m-}[m
[31m-struct ConsControl{[m
[31m-expdesc v;[m
[31m-expdesc*t;[m
[31m-int nh;[m
[31m-int na;[m
[31m-int tostore;[m
[31m-};[m
[31m-static void recfield(LexState*ls,struct ConsControl*cc){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int reg=ls->fs->freereg;[m
[31m-expdesc key,val;[m
[31m-int rkkey;[m
[31m-if(ls->t.token==TK_NAME){[m
[31m-luaY_checklimit(fs,cc->nh,(INT_MAX-2),"items in a constructor");[m
[31m-checkname(ls,&key);[m
[31m-}[m
[31m-else[m
[31m-yindex(ls,&key);[m
[31m-cc->nh++;[m
[31m-checknext(ls,'=');[m
[31m-rkkey=luaK_exp2RK(fs,&key);[m
[31m-expr(ls,&val);[m
[31m-luaK_codeABC(fs,OP_SETTABLE,cc->t->u.s.info,rkkey,luaK_exp2RK(fs,&val));[m
[31m-fs->freereg=reg;[m
[31m-}[m
[31m-static void closelistfield(FuncState*fs,struct ConsControl*cc){[m
[31m-if(cc->v.k==VVOID)return;[m
[31m-luaK_exp2nextreg(fs,&cc->v);[m
[31m-cc->v.k=VVOID;[m
[31m-if(cc->tostore==50){[m
[31m-luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore);[m
[31m-cc->tostore=0;[m
[31m-}[m
[31m-}[m
[31m-static void lastlistfield(FuncState*fs,struct ConsControl*cc){[m
[31m-if(cc->tostore==0)return;[m
[31m-if(hasmultret(cc->v.k)){[m
[31m-luaK_setmultret(fs,&cc->v);[m
[31m-luaK_setlist(fs,cc->t->u.s.info,cc->na,(-1));[m
[31m-cc->na--;[m
[31m-}[m
[31m-else{[m
[31m-if(cc->v.k!=VVOID)[m
[31m-luaK_exp2nextreg(fs,&cc->v);[m
[31m-luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore);[m
[31m-}[m
[31m-}[m
[31m-static void listfield(LexState*ls,struct ConsControl*cc){[m
[31m-expr(ls,&cc->v);[m
[31m-luaY_checklimit(ls->fs,cc->na,(INT_MAX-2),"items in a constructor");[m
[31m-cc->na++;[m
[31m-cc->tostore++;[m
[31m-}[m
[31m-static void constructor(LexState*ls,expdesc*t){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int line=ls->linenumber;[m
[31m-int pc=luaK_codeABC(fs,OP_NEWTABLE,0,0,0);[m
[31m-struct ConsControl cc;[m
[31m-cc.na=cc.nh=cc.tostore=0;[m
[31m-cc.t=t;[m
[31m-init_exp(t,VRELOCABLE,pc);[m
[31m-init_exp(&cc.v,VVOID,0);[m
[31m-luaK_exp2nextreg(ls->fs,t);[m
[31m-checknext(ls,'{');[m
[31m-do{[m
[31m-if(ls->t.token=='}')break;[m
[31m-closelistfield(fs,&cc);[m
[31m-switch(ls->t.token){[m
[31m-case TK_NAME:{[m
[31m-luaX_lookahead(ls);[m
[31m-if(ls->lookahead.token!='=')[m
[31m-listfield(ls,&cc);[m
[31m-else[m
[31m-recfield(ls,&cc);[m
[31m-break;[m
[31m-}[m
[31m-case'[':{[m
[31m-recfield(ls,&cc);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-listfield(ls,&cc);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-}while(testnext(ls,',')||testnext(ls,';'));[m
[31m-check_match(ls,'}','{',line);[m
[31m-lastlistfield(fs,&cc);[m
[31m-SETARG_B(fs->f->code[pc],luaO_int2fb(cc.na));[m
[31m-SETARG_C(fs->f->code[pc],luaO_int2fb(cc.nh));[m
[31m-}[m
[31m-static void parlist(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-Proto*f=fs->f;[m
[31m-int nparams=0;[m
[31m-f->is_vararg=0;[m
[31m-if(ls->t.token!=')'){[m
[31m-do{[m
[31m-switch(ls->t.token){[m
[31m-case TK_NAME:{[m
[31m-new_localvar(ls,str_checkname(ls),nparams++);[m
[31m-break;[m
[31m-}[m
[31m-case TK_DOTS:{[m
[31m-luaX_next(ls);[m
[31m-f->is_vararg|=2;[m
[31m-break;[m
[31m-}[m
[31m-default:luaX_syntaxerror(ls,"<name> or "LUA_QL("...")" expected");[m
[31m-}[m
[31m-}while(!f->is_vararg&&testnext(ls,','));[m
[31m-}[m
[31m-adjustlocalvars(ls,nparams);[m
[31m-f->numparams=cast_byte(fs->nactvar-(f->is_vararg&1));[m
[31m-luaK_reserveregs(fs,fs->nactvar);[m
[31m-}[m
[31m-static void body(LexState*ls,expdesc*e,int needself,int line){[m
[31m-FuncState new_fs;[m
[31m-open_func(ls,&new_fs);[m
[31m-new_fs.f->linedefined=line;[m
[31m-checknext(ls,'(');[m
[31m-if(needself){[m
[31m-new_localvarliteral(ls,"self",0);[m
[31m-adjustlocalvars(ls,1);[m
[31m-}[m
[31m-parlist(ls);[m
[31m-checknext(ls,')');[m
[31m-chunk(ls);[m
[31m-new_fs.f->lastlinedefined=ls->linenumber;[m
[31m-check_match(ls,TK_END,TK_FUNCTION,line);[m
[31m-close_func(ls);[m
[31m-pushclosure(ls,&new_fs,e);[m
[31m-}[m
[31m-static int explist1(LexState*ls,expdesc*v){[m
[31m-int n=1;[m
[31m-expr(ls,v);[m
[31m-while(testnext(ls,',')){[m
[31m-luaK_exp2nextreg(ls->fs,v);[m
[31m-expr(ls,v);[m
[31m-n++;[m
[31m-}[m
[31m-return n;[m
[31m-}[m
[31m-static void funcargs(LexState*ls,expdesc*f){[m
[31m-FuncState*fs=ls->fs;[m
[31m-expdesc args;[m
[31m-int base,nparams;[m
[31m-int line=ls->linenumber;[m
[31m-switch(ls->t.token){[m
[31m-case'(':{[m
[31m-if(line!=ls->lastline)[m
[31m-luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)");[m
[31m-luaX_next(ls);[m
[31m-if(ls->t.token==')')[m
[31m-args.k=VVOID;[m
[31m-else{[m
[31m-explist1(ls,&args);[m
[31m-luaK_setmultret(fs,&args);[m
[31m-}[m
[31m-check_match(ls,')','(',line);[m
[31m-break;[m
[31m-}[m
[31m-case'{':{[m
[31m-constructor(ls,&args);[m
[31m-break;[m
[31m-}[m
[31m-case TK_STRING:{[m
[31m-codestring(ls,&args,ls->t.seminfo.ts);[m
[31m-luaX_next(ls);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-luaX_syntaxerror(ls,"function arguments expected");[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-base=f->u.s.info;[m
[31m-if(hasmultret(args.k))[m
[31m-nparams=(-1);[m
[31m-else{[m
[31m-if(args.k!=VVOID)[m
[31m-luaK_exp2nextreg(fs,&args);[m
[31m-nparams=fs->freereg-(base+1);[m
[31m-}[m
[31m-init_exp(f,VCALL,luaK_codeABC(fs,OP_CALL,base,nparams+1,2));[m
[31m-luaK_fixline(fs,line);[m
[31m-fs->freereg=base+1;[m
[31m-}[m
[31m-static void prefixexp(LexState*ls,expdesc*v){[m
[31m-switch(ls->t.token){[m
[31m-case'(':{[m
[31m-int line=ls->linenumber;[m
[31m-luaX_next(ls);[m
[31m-expr(ls,v);[m
[31m-check_match(ls,')','(',line);[m
[31m-luaK_dischargevars(ls->fs,v);[m
[31m-return;[m
[31m-}[m
[31m-case TK_NAME:{[m
[31m-singlevar(ls,v);[m
[31m-return;[m
[31m-}[m
[31m-default:{[m
[31m-luaX_syntaxerror(ls,"unexpected symbol");[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void primaryexp(LexState*ls,expdesc*v){[m
[31m-FuncState*fs=ls->fs;[m
[31m-prefixexp(ls,v);[m
[31m-for(;;){[m
[31m-switch(ls->t.token){[m
[31m-case'.':{[m
[31m-field(ls,v);[m
[31m-break;[m
[31m-}[m
[31m-case'[':{[m
[31m-expdesc key;[m
[31m-luaK_exp2anyreg(fs,v);[m
[31m-yindex(ls,&key);[m
[31m-luaK_indexed(fs,v,&key);[m
[31m-break;[m
[31m-}[m
[31m-case':':{[m
[31m-expdesc key;[m
[31m-luaX_next(ls);[m
[31m-checkname(ls,&key);[m
[31m-luaK_self(fs,v,&key);[m
[31m-funcargs(ls,v);[m
[31m-break;[m
[31m-}[m
[31m-case'(':case TK_STRING:case'{':{[m
[31m-luaK_exp2nextreg(fs,v);[m
[31m-funcargs(ls,v);[m
[31m-break;[m
[31m-}[m
[31m-default:return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void simpleexp(LexState*ls,expdesc*v){[m
[31m-switch(ls->t.token){[m
[31m-case TK_NUMBER:{[m
[31m-init_exp(v,VKNUM,0);[m
[31m-v->u.nval=ls->t.seminfo.r;[m
[31m-break;[m
[31m-}[m
[31m-case TK_STRING:{[m
[31m-codestring(ls,v,ls->t.seminfo.ts);[m
[31m-break;[m
[31m-}[m
[31m-case TK_NIL:{[m
[31m-init_exp(v,VNIL,0);[m
[31m-break;[m
[31m-}[m
[31m-case TK_TRUE:{[m
[31m-init_exp(v,VTRUE,0);[m
[31m-break;[m
[31m-}[m
[31m-case TK_FALSE:{[m
[31m-init_exp(v,VFALSE,0);[m
[31m-break;[m
[31m-}[m
[31m-case TK_DOTS:{[m
[31m-FuncState*fs=ls->fs;[m
[31m-check_condition(ls,fs->f->is_vararg,[m
[31m-"cannot use "LUA_QL("...")" outside a vararg function");[m
[31m-fs->f->is_vararg&=~4;[m
[31m-init_exp(v,VVARARG,luaK_codeABC(fs,OP_VARARG,0,1,0));[m
[31m-break;[m
[31m-}[m
[31m-case'{':{[m
[31m-constructor(ls,v);[m
[31m-return;[m
[31m-}[m
[31m-case TK_FUNCTION:{[m
[31m-luaX_next(ls);[m
[31m-body(ls,v,0,ls->linenumber);[m
[31m-return;[m
[31m-}[m
[31m-default:{[m
[31m-primaryexp(ls,v);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-luaX_next(ls);[m
[31m-}[m
[31m-static UnOpr getunopr(int op){[m
[31m-switch(op){[m
[31m-case TK_NOT:return OPR_NOT;[m
[31m-case'-':return OPR_MINUS;[m
[31m-case'#':return OPR_LEN;[m
[31m-default:return OPR_NOUNOPR;[m
[31m-}[m
[31m-}[m
[31m-static BinOpr getbinopr(int op){[m
[31m-switch(op){[m
[31m-case'+':return OPR_ADD;[m
[31m-case'-':return OPR_SUB;[m
[31m-case'*':return OPR_MUL;[m
[31m-case'/':return OPR_DIV;[m
[31m-case'%':return OPR_MOD;[m
[31m-case'^':return OPR_POW;[m
[31m-case TK_CONCAT:return OPR_CONCAT;[m
[31m-case TK_NE:return OPR_NE;[m
[31m-case TK_EQ:return OPR_EQ;[m
[31m-case'<':return OPR_LT;[m
[31m-case TK_LE:return OPR_LE;[m
[31m-case'>':return OPR_GT;[m
[31m-case TK_GE:return OPR_GE;[m
[31m-case TK_AND:return OPR_AND;[m
[31m-case TK_OR:return OPR_OR;[m
[31m-default:return OPR_NOBINOPR;[m
[31m-}[m
[31m-}[m
[31m-static const struct{[m
[31m-lu_byte left;[m
[31m-lu_byte right;[m
[31m-}priority[]={[m
[31m-{6,6},{6,6},{7,7},{7,7},{7,7},[m
[31m-{10,9},{5,4},[m
[31m-{3,3},{3,3},[m
[31m-{3,3},{3,3},{3,3},{3,3},[m
[31m-{2,2},{1,1}[m
[31m-};[m
[31m-static BinOpr subexpr(LexState*ls,expdesc*v,unsigned int limit){[m
[31m-BinOpr op;[m
[31m-UnOpr uop;[m
[31m-enterlevel(ls);[m
[31m-uop=getunopr(ls->t.token);[m
[31m-if(uop!=OPR_NOUNOPR){[m
[31m-luaX_next(ls);[m
[31m-subexpr(ls,v,8);[m
[31m-luaK_prefix(ls->fs,uop,v);[m
[31m-}[m
[31m-else simpleexp(ls,v);[m
[31m-op=getbinopr(ls->t.token);[m
[31m-while(op!=OPR_NOBINOPR&&priority[op].left>limit){[m
[31m-expdesc v2;[m
[31m-BinOpr nextop;[m
[31m-luaX_next(ls);[m
[31m-luaK_infix(ls->fs,op,v);[m
[31m-nextop=subexpr(ls,&v2,priority[op].right);[m
[31m-luaK_posfix(ls->fs,op,v,&v2);[m
[31m-op=nextop;[m
[31m-}[m
[31m-leavelevel(ls);[m
[31m-return op;[m
[31m-}[m
[31m-static void expr(LexState*ls,expdesc*v){[m
[31m-subexpr(ls,v,0);[m
[31m-}[m
[31m-static int block_follow(int token){[m
[31m-switch(token){[m
[31m-case TK_ELSE:case TK_ELSEIF:case TK_END:[m
[31m-case TK_UNTIL:case TK_EOS:[m
[31m-return 1;[m
[31m-default:return 0;[m
[31m-}[m
[31m-}[m
[31m-static void block(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-BlockCnt bl;[m
[31m-enterblock(fs,&bl,0);[m
[31m-chunk(ls);[m
[31m-leaveblock(fs);[m
[31m-}[m
[31m-struct LHS_assign{[m
[31m-struct LHS_assign*prev;[m
[31m-expdesc v;[m
[31m-};[m
[31m-static void check_conflict(LexState*ls,struct LHS_assign*lh,expdesc*v){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int extra=fs->freereg;[m
[31m-int conflict=0;[m
[31m-for(;lh;lh=lh->prev){[m
[31m-if(lh->v.k==VINDEXED){[m
[31m-if(lh->v.u.s.info==v->u.s.info){[m
[31m-conflict=1;[m
[31m-lh->v.u.s.info=extra;[m
[31m-}[m
[31m-if(lh->v.u.s.aux==v->u.s.info){[m
[31m-conflict=1;[m
[31m-lh->v.u.s.aux=extra;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-if(conflict){[m
[31m-luaK_codeABC(fs,OP_MOVE,fs->freereg,v->u.s.info,0);[m
[31m-luaK_reserveregs(fs,1);[m
[31m-}[m
[31m-}[m
[31m-static void assignment(LexState*ls,struct LHS_assign*lh,int nvars){[m
[31m-expdesc e;[m
[31m-check_condition(ls,VLOCAL<=lh->v.k&&lh->v.k<=VINDEXED,[m
[31m-"syntax error");[m
[31m-if(testnext(ls,',')){[m
[31m-struct LHS_assign nv;[m
[31m-nv.prev=lh;[m
[31m-primaryexp(ls,&nv.v);[m
[31m-if(nv.v.k==VLOCAL)[m
[31m-check_conflict(ls,lh,&nv.v);[m
[31m-luaY_checklimit(ls->fs,nvars,200-ls->L->nCcalls,[m
[31m-"variables in assignment");[m
[31m-assignment(ls,&nv,nvars+1);[m
[31m-}[m
[31m-else{[m
[31m-int nexps;[m
[31m-checknext(ls,'=');[m
[31m-nexps=explist1(ls,&e);[m
[31m-if(nexps!=nvars){[m
[31m-adjust_assign(ls,nvars,nexps,&e);[m
[31m-if(nexps>nvars)[m
[31m-ls->fs->freereg-=nexps-nvars;[m
[31m-}[m
[31m-else{[m
[31m-luaK_setoneret(ls->fs,&e);[m
[31m-luaK_storevar(ls->fs,&lh->v,&e);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-init_exp(&e,VNONRELOC,ls->fs->freereg-1);[m
[31m-luaK_storevar(ls->fs,&lh->v,&e);[m
[31m-}[m
[31m-static int cond(LexState*ls){[m
[31m-expdesc v;[m
[31m-expr(ls,&v);[m
[31m-if(v.k==VNIL)v.k=VFALSE;[m
[31m-luaK_goiftrue(ls->fs,&v);[m
[31m-return v.f;[m
[31m-}[m
[31m-static void breakstat(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-BlockCnt*bl=fs->bl;[m
[31m-int upval=0;[m
[31m-while(bl&&!bl->isbreakable){[m
[31m-upval|=bl->upval;[m
[31m-bl=bl->previous;[m
[31m-}[m
[31m-if(!bl)[m
[31m-luaX_syntaxerror(ls,"no loop to break");[m
[31m-if(upval)[m
[31m-luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0);[m
[31m-luaK_concat(fs,&bl->breaklist,luaK_jump(fs));[m
[31m-}[m
[31m-static void whilestat(LexState*ls,int line){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int whileinit;[m
[31m-int condexit;[m
[31m-BlockCnt bl;[m
[31m-luaX_next(ls);[m
[31m-whileinit=luaK_getlabel(fs);[m
[31m-condexit=cond(ls);[m
[31m-enterblock(fs,&bl,1);[m
[31m-checknext(ls,TK_DO);[m
[31m-block(ls);[m
[31m-luaK_patchlist(fs,luaK_jump(fs),whileinit);[m
[31m-check_match(ls,TK_END,TK_WHILE,line);[m
[31m-leaveblock(fs);[m
[31m-luaK_patchtohere(fs,condexit);[m
[31m-}[m
[31m-static void repeatstat(LexState*ls,int line){[m
[31m-int condexit;[m
[31m-FuncState*fs=ls->fs;[m
[31m-int repeat_init=luaK_getlabel(fs);[m
[31m-BlockCnt bl1,bl2;[m
[31m-enterblock(fs,&bl1,1);[m
[31m-enterblock(fs,&bl2,0);[m
[31m-luaX_next(ls);[m
[31m-chunk(ls);[m
[31m-check_match(ls,TK_UNTIL,TK_REPEAT,line);[m
[31m-condexit=cond(ls);[m
[31m-if(!bl2.upval){[m
[31m-leaveblock(fs);[m
[31m-luaK_patchlist(ls->fs,condexit,repeat_init);[m
[31m-}[m
[31m-else{[m
[31m-breakstat(ls);[m
[31m-luaK_patchtohere(ls->fs,condexit);[m
[31m-leaveblock(fs);[m
[31m-luaK_patchlist(ls->fs,luaK_jump(fs),repeat_init);[m
[31m-}[m
[31m-leaveblock(fs);[m
[31m-}[m
[31m-static int exp1(LexState*ls){[m
[31m-expdesc e;[m
[31m-int k;[m
[31m-expr(ls,&e);[m
[31m-k=e.k;[m
[31m-luaK_exp2nextreg(ls->fs,&e);[m
[31m-return k;[m
[31m-}[m
[31m-static void forbody(LexState*ls,int base,int line,int nvars,int isnum){[m
[31m-BlockCnt bl;[m
[31m-FuncState*fs=ls->fs;[m
[31m-int prep,endfor;[m
[31m-adjustlocalvars(ls,3);[m
[31m-checknext(ls,TK_DO);[m
[31m-prep=isnum?luaK_codeAsBx(fs,OP_FORPREP,base,(-1)):luaK_jump(fs);[m
[31m-enterblock(fs,&bl,0);[m
[31m-adjustlocalvars(ls,nvars);[m
[31m-luaK_reserveregs(fs,nvars);[m
[31m-block(ls);[m
[31m-leaveblock(fs);[m
[31m-luaK_patchtohere(fs,prep);[m
[31m-endfor=(isnum)?luaK_codeAsBx(fs,OP_FORLOOP,base,(-1)):[m
[31m-luaK_codeABC(fs,OP_TFORLOOP,base,0,nvars);[m
[31m-luaK_fixline(fs,line);[m
[31m-luaK_patchlist(fs,(isnum?endfor:luaK_jump(fs)),prep+1);[m
[31m-}[m
[31m-static void fornum(LexState*ls,TString*varname,int line){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int base=fs->freereg;[m
[31m-new_localvarliteral(ls,"(for index)",0);[m
[31m-new_localvarliteral(ls,"(for limit)",1);[m
[31m-new_localvarliteral(ls,"(for step)",2);[m
[31m-new_localvar(ls,varname,3);[m
[31m-checknext(ls,'=');[m
[31m-exp1(ls);[m
[31m-checknext(ls,',');[m
[31m-exp1(ls);[m
[31m-if(testnext(ls,','))[m
[31m-exp1(ls);[m
[31m-else{[m
[31m-luaK_codeABx(fs,OP_LOADK,fs->freereg,luaK_numberK(fs,1));[m
[31m-luaK_reserveregs(fs,1);[m
[31m-}[m
[31m-forbody(ls,base,line,1,1);[m
[31m-}[m
[31m-static void forlist(LexState*ls,TString*indexname){[m
[31m-FuncState*fs=ls->fs;[m
[31m-expdesc e;[m
[31m-int nvars=0;[m
[31m-int line;[m
[31m-int base=fs->freereg;[m
[31m-new_localvarliteral(ls,"(for generator)",nvars++);[m
[31m-new_localvarliteral(ls,"(for state)",nvars++);[m
[31m-new_localvarliteral(ls,"(for control)",nvars++);[m
[31m-new_localvar(ls,indexname,nvars++);[m
[31m-while(testnext(ls,','))[m
[31m-new_localvar(ls,str_checkname(ls),nvars++);[m
[31m-checknext(ls,TK_IN);[m
[31m-line=ls->linenumber;[m
[31m-adjust_assign(ls,3,explist1(ls,&e),&e);[m
[31m-luaK_checkstack(fs,3);[m
[31m-forbody(ls,base,line,nvars-3,0);[m
[31m-}[m
[31m-static void forstat(LexState*ls,int line){[m
[31m-FuncState*fs=ls->fs;[m
[31m-TString*varname;[m
[31m-BlockCnt bl;[m
[31m-enterblock(fs,&bl,1);[m
[31m-luaX_next(ls);[m
[31m-varname=str_checkname(ls);[m
[31m-switch(ls->t.token){[m
[31m-case'=':fornum(ls,varname,line);break;[m
[31m-case',':case TK_IN:forlist(ls,varname);break;[m
[31m-default:luaX_syntaxerror(ls,LUA_QL("=")" or "LUA_QL("in")" expected");[m
[31m-}[m
[31m-check_match(ls,TK_END,TK_FOR,line);[m
[31m-leaveblock(fs);[m
[31m-}[m
[31m-static int test_then_block(LexState*ls){[m
[31m-int condexit;[m
[31m-luaX_next(ls);[m
[31m-condexit=cond(ls);[m
[31m-checknext(ls,TK_THEN);[m
[31m-block(ls);[m
[31m-return condexit;[m
[31m-}[m
[31m-static void ifstat(LexState*ls,int line){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int flist;[m
[31m-int escapelist=(-1);[m
[31m-flist=test_then_block(ls);[m
[31m-while(ls->t.token==TK_ELSEIF){[m
[31m-luaK_concat(fs,&escapelist,luaK_jump(fs));[m
[31m-luaK_patchtohere(fs,flist);[m
[31m-flist=test_then_block(ls);[m
[31m-}[m
[31m-if(ls->t.token==TK_ELSE){[m
[31m-luaK_concat(fs,&escapelist,luaK_jump(fs));[m
[31m-luaK_patchtohere(fs,flist);[m
[31m-luaX_next(ls);[m
[31m-block(ls);[m
[31m-}[m
[31m-else[m
[31m-luaK_concat(fs,&escapelist,flist);[m
[31m-luaK_patchtohere(fs,escapelist);[m
[31m-check_match(ls,TK_END,TK_IF,line);[m
[31m-}[m
[31m-static void localfunc(LexState*ls){[m
[31m-expdesc v,b;[m
[31m-FuncState*fs=ls->fs;[m
[31m-new_localvar(ls,str_checkname(ls),0);[m
[31m-init_exp(&v,VLOCAL,fs->freereg);[m
[31m-luaK_reserveregs(fs,1);[m
[31m-adjustlocalvars(ls,1);[m
[31m-body(ls,&b,0,ls->linenumber);[m
[31m-luaK_storevar(fs,&v,&b);[m
[31m-getlocvar(fs,fs->nactvar-1).startpc=fs->pc;[m
[31m-}[m
[31m-static void localstat(LexState*ls){[m
[31m-int nvars=0;[m
[31m-int nexps;[m
[31m-expdesc e;[m
[31m-do{[m
[31m-new_localvar(ls,str_checkname(ls),nvars++);[m
[31m-}while(testnext(ls,','));[m
[31m-if(testnext(ls,'='))[m
[31m-nexps=explist1(ls,&e);[m
[31m-else{[m
[31m-e.k=VVOID;[m
[31m-nexps=0;[m
[31m-}[m
[31m-adjust_assign(ls,nvars,nexps,&e);[m
[31m-adjustlocalvars(ls,nvars);[m
[31m-}[m
[31m-static int funcname(LexState*ls,expdesc*v){[m
[31m-int needself=0;[m
[31m-singlevar(ls,v);[m
[31m-while(ls->t.token=='.')[m
[31m-field(ls,v);[m
[31m-if(ls->t.token==':'){[m
[31m-needself=1;[m
[31m-field(ls,v);[m
[31m-}[m
[31m-return needself;[m
[31m-}[m
[31m-static void funcstat(LexState*ls,int line){[m
[31m-int needself;[m
[31m-expdesc v,b;[m
[31m-luaX_next(ls);[m
[31m-needself=funcname(ls,&v);[m
[31m-body(ls,&b,needself,line);[m
[31m-luaK_storevar(ls->fs,&v,&b);[m
[31m-luaK_fixline(ls->fs,line);[m
[31m-}[m
[31m-static void exprstat(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-struct LHS_assign v;[m
[31m-primaryexp(ls,&v.v);[m
[31m-if(v.v.k==VCALL)[m
[31m-SETARG_C(getcode(fs,&v.v),1);[m
[31m-else{[m
[31m-v.prev=NULL;[m
[31m-assignment(ls,&v,1);[m
[31m-}[m
[31m-}[m
[31m-static void retstat(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-expdesc e;[m
[31m-int first,nret;[m
[31m-luaX_next(ls);[m
[31m-if(block_follow(ls->t.token)||ls->t.token==';')[m
[31m-first=nret=0;[m
[31m-else{[m
[31m-nret=explist1(ls,&e);[m
[31m-if(hasmultret(e.k)){[m
[31m-luaK_setmultret(fs,&e);[m
[31m-if(e.k==VCALL&&nret==1){[m
[31m-SET_OPCODE(getcode(fs,&e),OP_TAILCALL);[m
[31m-}[m
[31m-first=fs->nactvar;[m
[31m-nret=(-1);[m
[31m-}[m
[31m-else{[m
[31m-if(nret==1)[m
[31m-first=luaK_exp2anyreg(fs,&e);[m
[31m-else{[m
[31m-luaK_exp2nextreg(fs,&e);[m
[31m-first=fs->nactvar;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-luaK_ret(fs,first,nret);[m
[31m-}[m
[31m-static int statement(LexState*ls){[m
[31m-int line=ls->linenumber;[m
[31m-switch(ls->t.token){[m
[31m-case TK_IF:{[m
[31m-ifstat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_WHILE:{[m
[31m-whilestat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_DO:{[m
[31m-luaX_next(ls);[m
[31m-block(ls);[m
[31m-check_match(ls,TK_END,TK_DO,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_FOR:{[m
[31m-forstat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_REPEAT:{[m
[31m-repeatstat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_FUNCTION:{[m
[31m-funcstat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_LOCAL:{[m
[31m-luaX_next(ls);[m
[31m-if(testnext(ls,TK_FUNCTION))[m
[31m-localfunc(ls);[m
[31m-else[m
[31m-localstat(ls);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_RETURN:{[m
[31m-retstat(ls);[m
[31m-return 1;[m
[31m-}[m
[31m-case TK_BREAK:{[m
[31m-luaX_next(ls);[m
[31m-breakstat(ls);[m
[31m-return 1;[m
[31m-}[m
[31m-default:{[m
[31m-exprstat(ls);[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void chunk(LexState*ls){[m
[31m-int islast=0;[m
[31m-enterlevel(ls);[m
[31m-while(!islast&&!block_follow(ls->t.token)){[m
[31m-islast=statement(ls);[m
[31m-testnext(ls,';');[m
[31m-ls->fs->freereg=ls->fs->nactvar;[m
[31m-}[m
[31m-leavelevel(ls);[m
[31m-}[m
[31m-static const TValue*luaV_tonumber(const TValue*obj,TValue*n){[m
[31m-lua_Number num;[m
[31m-if(ttisnumber(obj))return obj;[m
[31m-if(ttisstring(obj)&&luaO_str2d(svalue(obj),&num)){[m
[31m-setnvalue(n,num);[m
[31m-return n;[m
[31m-}[m
[31m-else[m
[31m-return NULL;[m
[31m-}[m
[31m-static int luaV_tostring(lua_State*L,StkId obj){[m
[31m-if(!ttisnumber(obj))[m
[31m-return 0;[m
[31m-else{[m
[31m-char s[32];[m
[31m-lua_Number n=nvalue(obj);[m
[31m-lua_number2str(s,n);[m
[31m-setsvalue(L,obj,luaS_new(L,s));[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static void callTMres(lua_State*L,StkId res,const TValue*f,[m
[31m-const TValue*p1,const TValue*p2){[m
[31m-ptrdiff_t result=savestack(L,res);[m
[31m-setobj(L,L->top,f);[m
[31m-setobj(L,L->top+1,p1);[m
[31m-setobj(L,L->top+2,p2);[m
[31m-luaD_checkstack(L,3);[m
[31m-L->top+=3;[m
[31m-luaD_call(L,L->top-3,1);[m
[31m-res=restorestack(L,result);[m
[31m-L->top--;[m
[31m-setobj(L,res,L->top);[m
[31m-}[m
[31m-static void callTM(lua_State*L,const TValue*f,const TValue*p1,[m
[31m-const TValue*p2,const TValue*p3){[m
[31m-setobj(L,L->top,f);[m
[31m-setobj(L,L->top+1,p1);[m
[31m-setobj(L,L->top+2,p2);[m
[31m-setobj(L,L->top+3,p3);[m
[31m-luaD_checkstack(L,4);[m
[31m-L->top+=4;[m
[31m-luaD_call(L,L->top-4,0);[m
[31m-}[m
[31m-static void luaV_gettable(lua_State*L,const TValue*t,TValue*key,StkId val){[m
[31m-int loop;[m
[31m-for(loop=0;loop<100;loop++){[m
[31m-const TValue*tm;[m
[31m-if(ttistable(t)){[m
[31m-Table*h=hvalue(t);[m
[31m-const TValue*res=luaH_get(h,key);[m
[31m-if(!ttisnil(res)||[m
[31m-(tm=fasttm(L,h->metatable,TM_INDEX))==NULL){[m
[31m-setobj(L,val,res);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_INDEX)))[m
[31m-luaG_typeerror(L,t,"index");[m
[31m-if(ttisfunction(tm)){[m
[31m-callTMres(L,val,tm,t,key);[m
[31m-return;[m
[31m-}[m
[31m-t=tm;[m
[31m-}[m
[31m-luaG_runerror(L,"loop in gettable");[m
[31m-}[m
[31m-static void luaV_settable(lua_State*L,const TValue*t,TValue*key,StkId val){[m
[31m-int loop;[m
[31m-TValue temp;[m
[31m-for(loop=0;loop<100;loop++){[m
[31m-const TValue*tm;[m
[31m-if(ttistable(t)){[m
[31m-Table*h=hvalue(t);[m
[31m-TValue*oldval=luaH_set(L,h,key);[m
[31m-if(!ttisnil(oldval)||[m
[31m-(tm=fasttm(L,h->metatable,TM_NEWINDEX))==NULL){[m
[31m-setobj(L,oldval,val);[m
[31m-h->flags=0;[m
[31m-luaC_barriert(L,h,val);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_NEWINDEX)))[m
[31m-luaG_typeerror(L,t,"index");[m
[31m-if(ttisfunction(tm)){[m
[31m-callTM(L,tm,t,key,val);[m
[31m-return;[m
[31m-}[m
[31m-setobj(L,&temp,tm);[m
[31m-t=&temp;[m
[31m-}[m
[31m-luaG_runerror(L,"loop in settable");[m
[31m-}[m
[31m-static int call_binTM(lua_State*L,const TValue*p1,const TValue*p2,[m
[31m-StkId res,TMS event){[m
[31m-const TValue*tm=luaT_gettmbyobj(L,p1,event);[m
[31m-if(ttisnil(tm))[m
[31m-tm=luaT_gettmbyobj(L,p2,event);[m
[31m-if(ttisnil(tm))return 0;[m
[31m-callTMres(L,res,tm,p1,p2);[m
[31m-return 1;[m
[31m-}[m
[31m-static const TValue*get_compTM(lua_State*L,Table*mt1,Table*mt2,[m
[31m-TMS event){[m
[31m-const TValue*tm1=fasttm(L,mt1,event);[m
[31m-const TValue*tm2;[m
[31m-if(tm1==NULL)return NULL;[m
[31m-if(mt1==mt2)return tm1;[m
[31m-tm2=fasttm(L,mt2,event);[m
[31m-if(tm2==NULL)return NULL;[m
[31m-if(luaO_rawequalObj(tm1,tm2))[m
[31m-return tm1;[m
[31m-return NULL;[m
[31m-}[m
[31m-static int call_orderTM(lua_State*L,const TValue*p1,const TValue*p2,[m
[31m-TMS event){[m
[31m-const TValue*tm1=luaT_gettmbyobj(L,p1,event);[m
[31m-const TValue*tm2;[m
[31m-if(ttisnil(tm1))return-1;[m
[31m-tm2=luaT_gettmbyobj(L,p2,event);[m
[31m-if(!luaO_rawequalObj(tm1,tm2))[m
[31m-return-1;[m
[31m-callTMres(L,L->top,tm1,p1,p2);[m
[31m-return!l_isfalse(L->top);[m
[31m-}[m
[31m-static int l_strcmp(const TString*ls,const TString*rs){[m
[31m-const char*l=getstr(ls);[m
[31m-size_t ll=ls->tsv.len;[m
[31m-const char*r=getstr(rs);[m
[31m-size_t lr=rs->tsv.len;[m
[31m-for(;;){[m
[31m-int temp=strcoll(l,r);[m
[31m-if(temp!=0)return temp;[m
[31m-else{[m
[31m-size_t len=strlen(l);[m
[31m-if(len==lr)[m
[31m-return(len==ll)?0:1;[m
[31m-else if(len==ll)[m
[31m-return-1;[m
[31m-len++;[m
[31m-l+=len;ll-=len;r+=len;lr-=len;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static int luaV_lessthan(lua_State*L,const TValue*l,const TValue*r){[m
[31m-int res;[m
[31m-if(ttype(l)!=ttype(r))[m
[31m-return luaG_ordererror(L,l,r);[m
[31m-else if(ttisnumber(l))[m
[31m-return luai_numlt(nvalue(l),nvalue(r));[m
[31m-else if(ttisstring(l))[m
[31m-return l_strcmp(rawtsvalue(l),rawtsvalue(r))<0;[m
[31m-else if((res=call_orderTM(L,l,r,TM_LT))!=-1)[m
[31m-return res;[m
[31m-return luaG_ordererror(L,l,r);[m
[31m-}[m
[31m-static int lessequal(lua_State*L,const TValue*l,const TValue*r){[m
[31m-int res;[m
[31m-if(ttype(l)!=ttype(r))[m
[31m-return luaG_ordererror(L,l,r);[m
[31m-else if(ttisnumber(l))[m
[31m-return luai_numle(nvalue(l),nvalue(r));[m
[31m-else if(ttisstring(l))[m
[31m-return l_strcmp(rawtsvalue(l),rawtsvalue(r))<=0;[m
[31m-else if((res=call_orderTM(L,l,r,TM_LE))!=-1)[m
[31m-return res;[m
[31m-else if((res=call_orderTM(L,r,l,TM_LT))!=-1)[m
[31m-return!res;[m
[31m-return luaG_ordererror(L,l,r);[m
[31m-}[m
[31m-static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2){[m
[31m-const TValue*tm;[m
[31m-switch(ttype(t1)){[m
[31m-case 0:return 1;[m
[31m-case 3:return luai_numeq(nvalue(t1),nvalue(t2));[m
[31m-case 1:return bvalue(t1)==bvalue(t2);[m
[31m-case 2:return pvalue(t1)==pvalue(t2);[m
[31m-case 7:{[m
[31m-if(uvalue(t1)==uvalue(t2))return 1;[m
[31m-tm=get_compTM(L,uvalue(t1)->metatable,uvalue(t2)->metatable,[m
[31m-TM_EQ);[m
[31m-break;[m
[31m-}[m
[31m-case 5:{[m
[31m-if(hvalue(t1)==hvalue(t2))return 1;[m
[31m-tm=get_compTM(L,hvalue(t1)->metatable,hvalue(t2)->metatable,TM_EQ);[m
[31m-break;[m
[31m-}[m
[31m-default:return gcvalue(t1)==gcvalue(t2);[m
[31m-}[m
[31m-if(tm==NULL)return 0;[m
[31m-callTMres(L,L->top,tm,t1,t2);[m
[31m-return!l_isfalse(L->top);[m
[31m-}[m
[31m-static void luaV_concat(lua_State*L,int total,int last){[m
[31m-do{[m
[31m-StkId top=L->base+last+1;[m
[31m-int n=2;[m
[31m-if(!(ttisstring(top-2)||ttisnumber(top-2))||!tostring(L,top-1)){[m
[31m-if(!call_binTM(L,top-2,top-1,top-2,TM_CONCAT))[m
[31m-luaG_concaterror(L,top-2,top-1);[m
[31m-}else if(tsvalue(top-1)->len==0)[m
[31m-(void)tostring(L,top-2);[m
[31m-else{[m
[31m-size_t tl=tsvalue(top-1)->len;[m
[31m-char*buffer;[m
[31m-int i;[m
[31m-for(n=1;n<total&&tostring(L,top-n-1);n++){[m
[31m-size_t l=tsvalue(top-n-1)->len;[m
[31m-if(l>=((size_t)(~(size_t)0)-2)-tl)luaG_runerror(L,"string length overflow");[m
[31m-tl+=l;[m
[31m-}[m
[31m-buffer=luaZ_openspace(L,&G(L)->buff,tl);[m
[31m-tl=0;[m
[31m-for(i=n;i>0;i--){[m
[31m-size_t l=tsvalue(top-i)->len;[m
[31m-memcpy(buffer+tl,svalue(top-i),l);[m
[31m-tl+=l;[m
[31m-}[m
[31m-setsvalue(L,top-n,luaS_newlstr(L,buffer,tl));[m
[31m-}[m
[31m-total-=n-1;[m
[31m-last-=n-1;[m
[31m-}while(total>1);[m
[31m-}[m
[31m-static void Arith(lua_State*L,StkId ra,const TValue*rb,[m
[31m-const TValue*rc,TMS op){[m
[31m-TValue tempb,tempc;[m
[31m-const TValue*b,*c;[m
[31m-if((b=luaV_tonumber(rb,&tempb))!=NULL&&[m
[31m-(c=luaV_tonumber(rc,&tempc))!=NULL){[m
[31m-lua_Number nb=nvalue(b),nc=nvalue(c);[m
[31m-switch(op){[m
[31m-case TM_ADD:setnvalue(ra,luai_numadd(nb,nc));break;[m
[31m-case TM_SUB:setnvalue(ra,luai_numsub(nb,nc));break;[m
[31m-case TM_MUL:setnvalue(ra,luai_nummul(nb,nc));break;[m
[31m-case TM_DIV:setnvalue(ra,luai_numdiv(nb,nc));break;[m
[31m-case TM_MOD:setnvalue(ra,luai_nummod(nb,nc));break;[m
[31m-case TM_POW:setnvalue(ra,luai_numpow(nb,nc));break;[m
[31m-case TM_UNM:setnvalue(ra,luai_numunm(nb));break;[m
[31m-default:break;[m
[31m-}[m
[31m-}[m
[31m-else if(!call_binTM(L,rb,rc,ra,op))[m
[31m-luaG_aritherror(L,rb,rc);[m
[31m-}[m
[31m-#define runtime_check(L,c){if(!(c))break;}[m
[31m-#define RA(i)(base+GETARG_A(i))[m
[31m-#define RB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgR,base+GETARG_B(i))[m
[31m-#define RKB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_B(i))?k+INDEXK(GETARG_B(i)):base+GETARG_B(i))[m
[31m-#define RKC(i)check_exp(getCMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_C(i))?k+INDEXK(GETARG_C(i)):base+GETARG_C(i))[m
[31m-#define KBx(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,k+GETARG_Bx(i))[m
[31m-#define dojump(L,pc,i){(pc)+=(i);}[m
[31m-#define Protect(x){L->savedpc=pc;{x;};base=L->base;}[m
[31m-#define arith_op(op,tm){TValue*rb=RKB(i);TValue*rc=RKC(i);if(ttisnumber(rb)&&ttisnumber(rc)){lua_Number nb=nvalue(rb),nc=nvalue(rc);setnvalue(ra,op(nb,nc));}else Protect(Arith(L,ra,rb,rc,tm));}[m
[31m-static void luaV_execute(lua_State*L,int nexeccalls){[m
[31m-LClosure*cl;[m
[31m-StkId base;[m
[31m-TValue*k;[m
[31m-const Instruction*pc;[m
[31m-reentry:[m
[31m-pc=L->savedpc;[m
[31m-cl=&clvalue(L->ci->func)->l;[m
[31m-base=L->base;[m
[31m-k=cl->p->k;[m
[31m-for(;;){[m
[31m-const Instruction i=*pc++;[m
[31m-StkId ra;[m
[31m-ra=RA(i);[m
[31m-switch(GET_OPCODE(i)){[m
[31m-case OP_MOVE:{[m
[31m-setobj(L,ra,RB(i));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LOADK:{[m
[31m-setobj(L,ra,KBx(i));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LOADBOOL:{[m
[31m-setbvalue(ra,GETARG_B(i));[m
[31m-if(GETARG_C(i))pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LOADNIL:{[m
[31m-TValue*rb=RB(i);[m
[31m-do{[m
[31m-setnilvalue(rb--);[m
[31m-}while(rb>=ra);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_GETUPVAL:{[m
[31m-int b=GETARG_B(i);[m
[31m-setobj(L,ra,cl->upvals[b]->v);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_GETGLOBAL:{[m
[31m-TValue g;[m
[31m-TValue*rb=KBx(i);[m
[31m-sethvalue(L,&g,cl->env);[m
[31m-Protect(luaV_gettable(L,&g,rb,ra));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_GETTABLE:{[m
[31m-Protect(luaV_gettable(L,RB(i),RKC(i),ra));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SETGLOBAL:{[m
[31m-TValue g;[m
[31m-sethvalue(L,&g,cl->env);[m
[31m-Protect(luaV_settable(L,&g,KBx(i),ra));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SETUPVAL:{[m
[31m-UpVal*uv=cl->upvals[GETARG_B(i)];[m
[31m-setobj(L,uv->v,ra);[m
[31m-luaC_barrier(L,uv,ra);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SETTABLE:{[m
[31m-Protect(luaV_settable(L,ra,RKB(i),RKC(i)));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_NEWTABLE:{[m
[31m-int b=GETARG_B(i);[m
[31m-int c=GETARG_C(i);[m
[31m-sethvalue(L,ra,luaH_new(L,luaO_fb2int(b),luaO_fb2int(c)));[m
[31m-Protect(luaC_checkGC(L));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SELF:{[m
[31m-StkId rb=RB(i);[m
[31m-setobj(L,ra+1,rb);[m
[31m-Protect(luaV_gettable(L,rb,RKC(i),ra));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_ADD:{[m
[31m-arith_op(luai_numadd,TM_ADD);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SUB:{[m
[31m-arith_op(luai_numsub,TM_SUB);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_MUL:{[m
[31m-arith_op(luai_nummul,TM_MUL);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_DIV:{[m
[31m-arith_op(luai_numdiv,TM_DIV);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_MOD:{[m
[31m-arith_op(luai_nummod,TM_MOD);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_POW:{[m
[31m-arith_op(luai_numpow,TM_POW);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_UNM:{[m
[31m-TValue*rb=RB(i);[m
[31m-if(ttisnumber(rb)){[m
[31m-lua_Number nb=nvalue(rb);[m
[31m-setnvalue(ra,luai_numunm(nb));[m
[31m-}[m
[31m-else{[m
[31m-Protect(Arith(L,ra,rb,rb,TM_UNM));[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-case OP_NOT:{[m
[31m-int res=l_isfalse(RB(i));[m
[31m-setbvalue(ra,res);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LEN:{[m
[31m-const TValue*rb=RB(i);[m
[31m-switch(ttype(rb)){[m
[31m-case 5:{[m
[31m-setnvalue(ra,cast_num(luaH_getn(hvalue(rb))));[m
[31m-break;[m
[31m-}[m
[31m-case 4:{[m
[31m-setnvalue(ra,cast_num(tsvalue(rb)->len));[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-Protect([m
[31m-if(!call_binTM(L,rb,(&luaO_nilobject_),ra,TM_LEN))[m
[31m-luaG_typeerror(L,rb,"get length of");[m
[31m-)[m
[31m-}[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-case OP_CONCAT:{[m
[31m-int b=GETARG_B(i);[m
[31m-int c=GETARG_C(i);[m
[31m-Protect(luaV_concat(L,c-b+1,c);luaC_checkGC(L));[m
[31m-setobj(L,RA(i),base+b);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_JMP:{[m
[31m-dojump(L,pc,GETARG_sBx(i));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_EQ:{[m
[31m-TValue*rb=RKB(i);[m
[31m-TValue*rc=RKC(i);[m
[31m-Protect([m
[31m-if(equalobj(L,rb,rc)==GETARG_A(i))[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-)[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LT:{[m
[31m-Protect([m
[31m-if(luaV_lessthan(L,RKB(i),RKC(i))==GETARG_A(i))[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-)[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LE:{[m
[31m-Protect([m
[31m-if(lessequal(L,RKB(i),RKC(i))==GETARG_A(i))[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-)[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_TEST:{[m
[31m-if(l_isfalse(ra)!=GETARG_C(i))[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_TESTSET:{[m
[31m-TValue*rb=RB(i);[m
[31m-if(l_isfalse(rb)!=GETARG_C(i)){[m
[31m-setobj(L,ra,rb);[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-}[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_CALL:{[m
[31m-int b=GETARG_B(i);[m
[31m-int nresults=GETARG_C(i)-1;[m
[31m-if(b!=0)L->top=ra+b;[m
[31m-L->savedpc=pc;[m
[31m-switch(luaD_precall(L,ra,nresults)){[m
[31m-case 0:{[m
[31m-nexeccalls++;[m
[31m-goto reentry;[m
[31m-}[m
[31m-case 1:{[m
[31m-if(nresults>=0)L->top=L->ci->top;[m
[31m-base=L->base;[m
[31m-continue;[m
[31m-}[m
[31m-default:{[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-case OP_TAILCALL:{[m
[31m-int b=GETARG_B(i);[m
[31m-if(b!=0)L->top=ra+b;[m
[31m-L->savedpc=pc;[m
[31m-switch(luaD_precall(L,ra,(-1))){[m
[31m-case 0:{[m
[31m-CallInfo*ci=L->ci-1;[m
[31m-int aux;[m
[31m-StkId func=ci->func;[m
[31m-StkId pfunc=(ci+1)->func;[m
[31m-if(L->openupval)luaF_close(L,ci->base);[m
[31m-L->base=ci->base=ci->func+((ci+1)->base-pfunc);[m
[31m-for(aux=0;pfunc+aux<L->top;aux++)[m
[31m-setobj(L,func+aux,pfunc+aux);[m
[31m-ci->top=L->top=func+aux;[m
[31m-ci->savedpc=L->savedpc;[m
[31m-ci->tailcalls++;[m
[31m-L->ci--;[m
[31m-goto reentry;[m
[31m-}[m
[31m-case 1:{[m
[31m-base=L->base;[m
[31m-continue;[m
[31m-}[m
[31m-default:{[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-case OP_RETURN:{[m
[31m-int b=GETARG_B(i);[m
[31m-if(b!=0)L->top=ra+b-1;[m
[31m-if(L->openupval)luaF_close(L,base);[m
[31m-L->savedpc=pc;[m
[31m-b=luaD_poscall(L,ra);[m
[31m-if(--nexeccalls==0)[m
[31m-return;[m
[31m-else{[m
[31m-if(b)L->top=L->ci->top;[m
[31m-goto reentry;[m
[31m-}[m
[31m-}[m
[31m-case OP_FORLOOP:{[m
[31m-lua_Number step=nvalue(ra+2);[m
[31m-lua_Number idx=luai_numadd(nvalue(ra),step);[m
[31m-lua_Number limit=nvalue(ra+1);[m
[31m-if(luai_numlt(0,step)?luai_numle(idx,limit)[m
[31m-:luai_numle(limit,idx)){[m
[31m-dojump(L,pc,GETARG_sBx(i));[m
[31m-setnvalue(ra,idx);[m
[31m-setnvalue(ra+3,idx);[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-case OP_FORPREP:{[m
[31m-const TValue*init=ra;[m
[31m-const TValue*plimit=ra+1;[m
[31m-const TValue*pstep=ra+2;[m
[31m-L->savedpc=pc;[m
[31m-if(!tonumber(init,ra))[m
[31m-luaG_runerror(L,LUA_QL("for")" initial value must be a number");[m
[31m-else if(!tonumber(plimit,ra+1))[m
[31m-luaG_runerror(L,LUA_QL("for")" limit must be a number");[m
[31m-else if(!tonumber(pstep,ra+2))[m
[31m-luaG_runerror(L,LUA_QL("for")" step must be a number");[m
[31m-setnvalue(ra,luai_numsub(nvalue(ra),nvalue(pstep)));[m
[31m-dojump(L,pc,GETARG_sBx(i));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_TFORLOOP:{[m
[31m-StkId cb=ra+3;[m
[31m-setobj(L,cb+2,ra+2);[m
[31m-setobj(L,cb+1,ra+1);[m
[31m-setobj(L,cb,ra);[m
[31m-L->top=cb+3;[m
[31m-Protect(luaD_call(L,cb,GETARG_C(i)));[m
[31m-L->top=L->ci->top;[m
[31m-cb=RA(i)+3;[m
[31m-if(!ttisnil(cb)){[m
[31m-setobj(L,cb-1,cb);[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-}[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SETLIST:{[m
[31m-int n=GETARG_B(i);[m
[31m-int c=GETARG_C(i);[m
[31m-int last;[m
[31m-Table*h;[m
[31m-if(n==0){[m
[31m-n=cast_int(L->top-ra)-1;[m
[31m-L->top=L->ci->top;[m
[31m-}[m
[31m-if(c==0)c=cast_int(*pc++);[m
[31m-runtime_check(L,ttistable(ra));[m
[31m-h=hvalue(ra);[m
[31m-last=((c-1)*50)+n;[m
[31m-if(last>h->sizearray)[m
[31m-luaH_resizearray(L,h,last);[m
[31m-for(;n>0;n--){[m
[31m-TValue*val=ra+n;[m
[31m-setobj(L,luaH_setnum(L,h,last--),val);[m
[31m-luaC_barriert(L,h,val);[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-case OP_CLOSE:{[m
[31m-luaF_close(L,ra);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_CLOSURE:{[m
[31m-Proto*p;[m
[31m-Closure*ncl;[m
[31m-int nup,j;[m
[31m-p=cl->p->p[GETARG_Bx(i)];[m
[31m-nup=p->nups;[m
[31m-ncl=luaF_newLclosure(L,nup,cl->env);[m
[31m-ncl->l.p=p;[m
[31m-for(j=0;j<nup;j++,pc++){[m
[31m-if(GET_OPCODE(*pc)==OP_GETUPVAL)[m
[31m-ncl->l.upvals[j]=cl->upvals[GETARG_B(*pc)];[m
[31m-else{[m
[31m-ncl->l.upvals[j]=luaF_findupval(L,base+GETARG_B(*pc));[m
[31m-}[m
[31m-}[m
[31m-setclvalue(L,ra,ncl);[m
[31m-Protect(luaC_checkGC(L));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_VARARG:{[m
[31m-int b=GETARG_B(i)-1;[m
[31m-int j;[m
[31m-CallInfo*ci=L->ci;[m
[31m-int n=cast_int(ci->base-ci->func)-cl->p->numparams-1;[m
[31m-if(b==(-1)){[m
[31m-Protect(luaD_checkstack(L,n));[m
[31m-ra=RA(i);[m
[31m-b=n;[m
[31m-L->top=ra+n;[m
[31m-}[m
[31m-for(j=0;j<b;j++){[m
[31m-if(j<n){[m
[31m-setobj(L,ra+j,ci->base-n+j);[m
[31m-}[m
[31m-else{[m
[31m-setnilvalue(ra+j);[m
[31m-}[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-#define api_checknelems(L,n)luai_apicheck(L,(n)<=(L->top-L->base))[m
[31m-#define api_checkvalidindex(L,i)luai_apicheck(L,(i)!=(&luaO_nilobject_))[m
[31m-#define api_incr_top(L){luai_apicheck(L,L->top<L->ci->top);L->top++;}[m
[31m-static TValue*index2adr(lua_State*L,int idx){[m
[31m-if(idx>0){[m
[31m-TValue*o=L->base+(idx-1);[m
[31m-luai_apicheck(L,idx<=L->ci->top-L->base);[m
[31m-if(o>=L->top)return cast(TValue*,(&luaO_nilobject_));[m
[31m-else return o;[m
[31m-}[m
[31m-else if(idx>(-10000)){[m
[31m-luai_apicheck(L,idx!=0&&-idx<=L->top-L->base);[m
[31m-return L->top+idx;[m
[31m-}[m
[31m-else switch(idx){[m
[31m-case(-10000):return registry(L);[m
[31m-case(-10001):{[m
[31m-Closure*func=curr_func(L);[m
[31m-sethvalue(L,&L->env,func->c.env);[m
[31m-return&L->env;[m
[31m-}[m
[31m-case(-10002):return gt(L);[m
[31m-default:{[m
[31m-Closure*func=curr_func(L);[m
[31m-idx=(-10002)-idx;[m
[31m-return(idx<=func->c.nupvalues)[m
[31m-?&func->c.upvalue[idx-1][m
[31m-:cast(TValue*,(&luaO_nilobject_));[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static Table*getcurrenv(lua_State*L){[m
[31m-if(L->ci==L->base_ci)[m
[31m-return hvalue(gt(L));[m
[31m-else{[m
[31m-Closure*func=curr_func(L);[m
[31m-return func->c.env;[m
[31m-}[m
[31m-}[m
[31m-static int lua_checkstack(lua_State*L,int size){[m
[31m-int res=1;[m
[31m-if(size>8000||(L->top-L->base+size)>8000)[m
[31m-res=0;[m
[31m-else if(size>0){[m
[31m-luaD_checkstack(L,size);[m
[31m-if(L->ci->top<L->top+size)[m
[31m-L->ci->top=L->top+size;[m
[31m-}[m
[31m-return res;[m
[31m-}[m
[31m-static lua_CFunction lua_atpanic(lua_State*L,lua_CFunction panicf){[m
[31m-lua_CFunction old;[m
[31m-old=G(L)->panic;[m
[31m-G(L)->panic=panicf;[m
[31m-return old;[m
[31m-}[m
[31m-static int lua_gettop(lua_State*L){[m
[31m-return cast_int(L->top-L->base);[m
[31m-}[m
[31m-static void lua_settop(lua_State*L,int idx){[m
[31m-if(idx>=0){[m
[31m-luai_apicheck(L,idx<=L->stack_last-L->base);[m
[31m-while(L->top<L->base+idx)[m
[31m-setnilvalue(L->top++);[m
[31m-L->top=L->base+idx;[m
[31m-}[m
[31m-else{[m
[31m-luai_apicheck(L,-(idx+1)<=(L->top-L->base));[m
[31m-L->top+=idx+1;[m
[31m-}[m
[31m-}[m
[31m-static void lua_remove(lua_State*L,int idx){[m
[31m-StkId p;[m
[31m-p=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,p);[m
[31m-while(++p<L->top)setobj(L,p-1,p);[m
[31m-L->top--;[m
[31m-}[m
[31m-static void lua_insert(lua_State*L,int idx){[m
[31m-StkId p;[m
[31m-StkId q;[m
[31m-p=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,p);[m
[31m-for(q=L->top;q>p;q--)setobj(L,q,q-1);[m
[31m-setobj(L,p,L->top);[m
[31m-}[m
[31m-static void lua_replace(lua_State*L,int idx){[m
[31m-StkId o;[m
[31m-if(idx==(-10001)&&L->ci==L->base_ci)[m
[31m-luaG_runerror(L,"no calling environment");[m
[31m-api_checknelems(L,1);[m
[31m-o=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,o);[m
[31m-if(idx==(-10001)){[m
[31m-Closure*func=curr_func(L);[m
[31m-luai_apicheck(L,ttistable(L->top-1));[m
[31m-func->c.env=hvalue(L->top-1);[m
[31m-luaC_barrier(L,func,L->top-1);[m
[31m-}[m
[31m-else{[m
[31m-setobj(L,o,L->top-1);[m
[31m-if(idx<(-10002))[m
[31m-luaC_barrier(L,curr_func(L),L->top-1);[m
[31m-}[m
[31m-L->top--;[m
[31m-}[m
[31m-static void lua_pushvalue(lua_State*L,int idx){[m
[31m-setobj(L,L->top,index2adr(L,idx));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static int lua_type(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-return(o==(&luaO_nilobject_))?(-1):ttype(o);[m
[31m-}[m
[31m-static const char*lua_typename(lua_State*L,int t){[m
[31m-UNUSED(L);[m
[31m-return(t==(-1))?"no value":luaT_typenames[t];[m
[31m-}[m
[31m-static int lua_iscfunction(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-return iscfunction(o);[m
[31m-}[m
[31m-static int lua_isnumber(lua_State*L,int idx){[m
[31m-TValue n;[m
[31m-const TValue*o=index2adr(L,idx);[m
[31m-return tonumber(o,&n);[m
[31m-}[m
[31m-static int lua_isstring(lua_State*L,int idx){[m
[31m-int t=lua_type(L,idx);[m
[31m-return(t==4||t==3);[m
[31m-}[m
[31m-static int lua_rawequal(lua_State*L,int index1,int index2){[m
[31m-StkId o1=index2adr(L,index1);[m
[31m-StkId o2=index2adr(L,index2);[m
[31m-return(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0[m
[31m-:luaO_rawequalObj(o1,o2);[m
[31m-}[m
[31m-static int lua_lessthan(lua_State*L,int index1,int index2){[m
[31m-StkId o1,o2;[m
[31m-int i;[m
[31m-o1=index2adr(L,index1);[m
[31m-o2=index2adr(L,index2);[m
[31m-i=(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0[m
[31m-:luaV_lessthan(L,o1,o2);[m
[31m-return i;[m
[31m-}[m
[31m-static lua_Number lua_tonumber(lua_State*L,int idx){[m
[31m-TValue n;[m
[31m-const TValue*o=index2adr(L,idx);[m
[31m-if(tonumber(o,&n))[m
[31m-return nvalue(o);[m
[31m-else[m
[31m-return 0;[m
[31m-}[m
[31m-static lua_Integer lua_tointeger(lua_State*L,int idx){[m
[31m-TValue n;[m
[31m-const TValue*o=index2adr(L,idx);[m
[31m-if(tonumber(o,&n)){[m
[31m-lua_Integer res;[m
[31m-lua_Number num=nvalue(o);[m
[31m-lua_number2integer(res,num);[m
[31m-return res;[m
[31m-}[m
[31m-else[m
[31m-return 0;[m
[31m-}[m
[31m-static int lua_toboolean(lua_State*L,int idx){[m
[31m-const TValue*o=index2adr(L,idx);[m
[31m-return!l_isfalse(o);[m
[31m-}[m
[31m-static const char*lua_tolstring(lua_State*L,int idx,size_t*len){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-if(!ttisstring(o)){[m
[31m-if(!luaV_tostring(L,o)){[m
[31m-if(len!=NULL)*len=0;[m
[31m-return NULL;[m
[31m-}[m
[31m-luaC_checkGC(L);[m
[31m-o=index2adr(L,idx);[m
[31m-}[m
[31m-if(len!=NULL)*len=tsvalue(o)->len;[m
[31m-return svalue(o);[m
[31m-}[m
[31m-static size_t lua_objlen(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-switch(ttype(o)){[m
[31m-case 4:return tsvalue(o)->len;[m
[31m-case 7:return uvalue(o)->len;[m
[31m-case 5:return luaH_getn(hvalue(o));[m
[31m-case 3:{[m
[31m-size_t l;[m
[31m-l=(luaV_tostring(L,o)?tsvalue(o)->len:0);[m
[31m-return l;[m
[31m-}[m
[31m-default:return 0;[m
[31m-}[m
[31m-}[m
[31m-static lua_CFunction lua_tocfunction(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-return(!iscfunction(o))?NULL:clvalue(o)->c.f;[m
[31m-}[m
[31m-static void*lua_touserdata(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-switch(ttype(o)){[m
[31m-case 7:return(rawuvalue(o)+1);[m
[31m-case 2:return pvalue(o);[m
[31m-default:return NULL;[m
[31m-}[m
[31m-}[m
[31m-static void lua_pushnil(lua_State*L){[m
[31m-setnilvalue(L->top);[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushnumber(lua_State*L,lua_Number n){[m
[31m-setnvalue(L->top,n);[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushinteger(lua_State*L,lua_Integer n){[m
[31m-setnvalue(L->top,cast_num(n));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushlstring(lua_State*L,const char*s,size_t len){[m
[31m-luaC_checkGC(L);[m
[31m-setsvalue(L,L->top,luaS_newlstr(L,s,len));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushstring(lua_State*L,const char*s){[m
[31m-if(s==NULL)[m
[31m-lua_pushnil(L);[m
[31m-else[m
[31m-lua_pushlstring(L,s,strlen(s));[m
[31m-}[m
[31m-static const char*lua_pushvfstring(lua_State*L,const char*fmt,[m
[31m-va_list argp){[m
[31m-const char*ret;[m
[31m-luaC_checkGC(L);[m
[31m-ret=luaO_pushvfstring(L,fmt,argp);[m
[31m-return ret;[m
[31m-}[m
[31m-static const char*lua_pushfstring(lua_State*L,const char*fmt,...){[m
[31m-const char*ret;[m
[31m-va_list argp;[m
[31m-luaC_checkGC(L);[m
[31m-va_start(argp,fmt);[m
[31m-ret=luaO_pushvfstring(L,fmt,argp);[m
[31m-va_end(argp);[m
[31m-return ret;[m
[31m-}[m
[31m-static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n){[m
[31m-Closure*cl;[m
[31m-luaC_checkGC(L);[m
[31m-api_checknelems(L,n);[m
[31m-cl=luaF_newCclosure(L,n,getcurrenv(L));[m
[31m-cl->c.f=fn;[m
[31m-L->top-=n;[m
[31m-while(n--)[m
[31m-setobj(L,&cl->c.upvalue[n],L->top+n);[m
[31m-setclvalue(L,L->top,cl);[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushboolean(lua_State*L,int b){[m
[31m-setbvalue(L->top,(b!=0));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static int lua_pushthread(lua_State*L){[m
[31m-setthvalue(L,L->top,L);[m
[31m-api_incr_top(L);[m
[31m-return(G(L)->mainthread==L);[m
[31m-}[m
[31m-static void lua_gettable(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-t=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,t);[m
[31m-luaV_gettable(L,t,L->top-1,L->top-1);[m
[31m-}[m
[31m-static void lua_getfield(lua_State*L,int idx,const char*k){[m
[31m-StkId t;[m
[31m-TValue key;[m
[31m-t=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,t);[m
[31m-setsvalue(L,&key,luaS_new(L,k));[m
[31m-luaV_gettable(L,t,&key,L->top);[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_rawget(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-t=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(t));[m
[31m-setobj(L,L->top-1,luaH_get(hvalue(t),L->top-1));[m
[31m-}[m
[31m-static void lua_rawgeti(lua_State*L,int idx,int n){[m
[31m-StkId o;[m
[31m-o=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(o));[m
[31m-setobj(L,L->top,luaH_getnum(hvalue(o),n));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_createtable(lua_State*L,int narray,int nrec){[m
[31m-luaC_checkGC(L);[m
[31m-sethvalue(L,L->top,luaH_new(L,narray,nrec));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static int lua_getmetatable(lua_State*L,int objindex){[m
[31m-const TValue*obj;[m
[31m-Table*mt=NULL;[m
[31m-int res;[m
[31m-obj=index2adr(L,objindex);[m
[31m-switch(ttype(obj)){[m
[31m-case 5:[m
[31m-mt=hvalue(obj)->metatable;[m
[31m-break;[m
[31m-case 7:[m
[31m-mt=uvalue(obj)->metatable;[m
[31m-break;[m
[31m-default:[m
[31m-mt=G(L)->mt[ttype(obj)];[m
[31m-break;[m
[31m-}[m
[31m-if(mt==NULL)[m
[31m-res=0;[m
[31m-else{[m
[31m-sethvalue(L,L->top,mt);[m
[31m-api_incr_top(L);[m
[31m-res=1;[m
[31m-}[m
[31m-return res;[m
[31m-}[m
[31m-static void lua_getfenv(lua_State*L,int idx){[m
[31m-StkId o;[m
[31m-o=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,o);[m
[31m-switch(ttype(o)){[m
[31m-case 6:[m
[31m-sethvalue(L,L->top,clvalue(o)->c.env);[m
[31m-break;[m
[31m-case 7:[m
[31m-sethvalue(L,L->top,uvalue(o)->env);[m
[31m-break;[m
[31m-case 8:[m
[31m-setobj(L,L->top,gt(thvalue(o)));[m
[31m-break;[m
[31m-default:[m
[31m-setnilvalue(L->top);[m
[31m-break;[m
[31m-}[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_settable(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-api_checknelems(L,2);[m
[31m-t=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,t);[m
[31m-luaV_settable(L,t,L->top-2,L->top-1);[m
[31m-L->top-=2;[m
[31m-}[m
[31m-static void lua_setfield(lua_State*L,int idx,const char*k){[m
[31m-StkId t;[m
[31m-TValue key;[m
[31m-api_checknelems(L,1);[m
[31m-t=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,t);[m
[31m-setsvalue(L,&key,luaS_new(L,k));[m
[31m-luaV_settable(L,t,&key,L->top-1);[m
[31m-L->top--;[m
[31m-}[m
[31m-static void lua_rawset(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-api_checknelems(L,2);[m
[31m-t=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(t));[m
[31m-setobj(L,luaH_set(L,hvalue(t),L->top-2),L->top-1);[m
[31m-luaC_barriert(L,hvalue(t),L->top-1);[m
[31m-L->top-=2;[m
[31m-}[m
[31m-static void lua_rawseti(lua_State*L,int idx,int n){[m
[31m-StkId o;[m
[31m-api_checknelems(L,1);[m
[31m-o=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(o));[m
[31m-setobj(L,luaH_setnum(L,hvalue(o),n),L->top-1);[m
[31m-luaC_barriert(L,hvalue(o),L->top-1);[m
[31m-L->top--;[m
[31m-}[m
[31m-static int lua_setmetatable(lua_State*L,int objindex){[m
[31m-TValue*obj;[m
[31m-Table*mt;[m
[31m-api_checknelems(L,1);[m
[31m-obj=index2adr(L,objindex);[m
[31m-api_checkvalidindex(L,obj);[m
[31m-if(ttisnil(L->top-1))[m
[31m-mt=NULL;[m
[31m-else{[m
[31m-luai_apicheck(L,ttistable(L->top-1));[m
[31m-mt=hvalue(L->top-1);[m
[31m-}[m
[31m-switch(ttype(obj)){[m
[31m-case 5:{[m
[31m-hvalue(obj)->metatable=mt;[m
[31m-if(mt)[m
[31m-luaC_objbarriert(L,hvalue(obj),mt);[m
[31m-break;[m
[31m-}[m
[31m-case 7:{[m
[31m-uvalue(obj)->metatable=mt;[m
[31m-if(mt)[m
[31m-luaC_objbarrier(L,rawuvalue(obj),mt);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-G(L)->mt[ttype(obj)]=mt;[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-L->top--;[m
[31m-return 1;[m
[31m-}[m
[31m-static int lua_setfenv(lua_State*L,int idx){[m
[31m-StkId o;[m
[31m-int res=1;[m
[31m-api_checknelems(L,1);[m
[31m-o=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,o);[m
[31m-luai_apicheck(L,ttistable(L->top-1));[m
[31m-switch(ttype(o)){[m
[31m-case 6:[m
[31m-clvalue(o)->c.env=hvalue(L->top-1);[m
[31m-break;[m
[31m-case 7:[m
[31m-uvalue(o)->env=hvalue(L->top-1);[m
[31m-break;[m
[31m-case 8:[m
[31m-sethvalue(L,gt(thvalue(o)),hvalue(L->top-1));[m
[31m-break;[m
[31m-default:[m
[31m-res=0;[m
[31m-break;[m
[31m-}[m
[31m-if(res)luaC_objbarrier(L,gcvalue(o),hvalue(L->top-1));[m
[31m-L->top--;[m
[31m-return res;[m
[31m-}[m
[31m-#define adjustresults(L,nres){if(nres==(-1)&&L->top>=L->ci->top)L->ci->top=L->top;}[m
[31m-#define checkresults(L,na,nr)luai_apicheck(L,(nr)==(-1)||(L->ci->top-L->top>=(nr)-(na)))[m
[31m-static void lua_call(lua_State*L,int nargs,int nresults){[m
[31m-StkId func;[m
[31m-api_checknelems(L,nargs+1);[m
[31m-checkresults(L,nargs,nresults);[m
[31m-func=L->top-(nargs+1);[m
[31m-luaD_call(L,func,nresults);[m
[31m-adjustresults(L,nresults);[m
[31m-}[m
[31m-struct CallS{[m
[31m-StkId func;[m
[31m-int nresults;[m
[31m-};[m
[31m-static void f_call(lua_State*L,void*ud){[m
[31m-struct CallS*c=cast(struct CallS*,ud);[m
[31m-luaD_call(L,c->func,c->nresults);[m
[31m-}[m
[31m-static int lua_pcall(lua_State*L,int nargs,int nresults,int errfunc){[m
[31m-struct CallS c;[m
[31m-int status;[m
[31m-ptrdiff_t func;[m
[31m-api_checknelems(L,nargs+1);[m
[31m-checkresults(L,nargs,nresults);[m
[31m-if(errfunc==0)[m
[31m-func=0;[m
[31m-else{[m
[31m-StkId o=index2adr(L,errfunc);[m
[31m-api_checkvalidindex(L,o);[m
[31m-func=savestack(L,o);[m
[31m-}[m
[31m-c.func=L->top-(nargs+1);[m
[31m-c.nresults=nresults;[m
[31m-status=luaD_pcall(L,f_call,&c,savestack(L,c.func),func);[m
[31m-adjustresults(L,nresults);[m
[31m-return status;[m
[31m-}[m
[31m-static int lua_load(lua_State*L,lua_Reader reader,void*data,[m
[31m-const char*chunkname){[m
[31m-ZIO z;[m
[31m-int status;[m
[31m-if(!chunkname)chunkname="?";[m
[31m-luaZ_init(L,&z,reader,data);[m
[31m-status=luaD_protectedparser(L,&z,chunkname);[m
[31m-return status;[m
[31m-}[m
[31m-static int lua_error(lua_State*L){[m
[31m-api_checknelems(L,1);[m
[31m-luaG_errormsg(L);[m
[31m-return 0;[m
[31m-}[m
[31m-static int lua_next(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-int more;[m
[31m-t=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(t));[m
[31m-more=luaH_next(L,hvalue(t),L->top-1);[m
[31m-if(more){[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-else[m
[31m-L->top-=1;[m
[31m-return more;[m
[31m-}[m
[31m-static void lua_concat(lua_State*L,int n){[m
[31m-api_checknelems(L,n);[m
[31m-if(n>=2){[m
[31m-luaC_checkGC(L);[m
[31m-luaV_concat(L,n,cast_int(L->top-L->base)-1);[m
[31m-L->top-=(n-1);[m
[31m-}[m
[31m-else if(n==0){[m
[31m-setsvalue(L,L->top,luaS_newlstr(L,"",0));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-}[m
[31m-static void*lua_newuserdata(lua_State*L,size_t size){[m
[31m-Udata*u;[m
[31m-luaC_checkGC(L);[m
[31m-u=luaS_newudata(L,size,getcurrenv(L));[m
[31m-setuvalue(L,L->top,u);[m
[31m-api_incr_top(L);[m
[31m-return u+1;[m
[31m-}[m
[31m-#define luaL_getn(L,i)((int)lua_objlen(L,i))[m
[31m-#define luaL_setn(L,i,j)((void)0)[m
[31m-typedef struct luaL_Reg{[m
[31m-const char*name;[m
[31m-lua_CFunction func;[m
[31m-}luaL_Reg;[m
[31m-static void luaI_openlib(lua_State*L,const char*libname,[m
[31m-const luaL_Reg*l,int nup);[m
[31m-static int luaL_argerror(lua_State*L,int numarg,const char*extramsg);[m
[31m-static const char* luaL_checklstring(lua_State*L,int numArg,[m
[31m-size_t*l);[m
[31m-static const char* luaL_optlstring(lua_State*L,int numArg,[m
[31m-const char*def,size_t*l);[m
[31m-static lua_Integer luaL_checkinteger(lua_State*L,int numArg);[m
[31m-static lua_Integer luaL_optinteger(lua_State*L,int nArg,[m
[31m-lua_Integer def);[m
[31m-static int luaL_error(lua_State*L,const char*fmt,...);[m
[31m-static const char* luaL_findtable(lua_State*L,int idx,[m
[31m-const char*fname,int szhint);[m
[31m-#define luaL_argcheck(L,cond,numarg,extramsg)((void)((cond)||luaL_argerror(L,(numarg),(extramsg))))[m
[31m-#define luaL_checkstring(L,n)(luaL_checklstring(L,(n),NULL))[m
[31m-#define luaL_optstring(L,n,d)(luaL_optlstring(L,(n),(d),NULL))[m
[31m-#define luaL_checkint(L,n)((int)luaL_checkinteger(L,(n)))[m
[31m-#define luaL_optint(L,n,d)((int)luaL_optinteger(L,(n),(d)))[m
[31m-#define luaL_typename(L,i)lua_typename(L,lua_type(L,(i)))[m
[31m-#define luaL_getmetatable(L,n)(lua_getfield(L,(-10000),(n)))[m
[31m-#define luaL_opt(L,f,n,d)(lua_isnoneornil(L,(n))?(d):f(L,(n)))[m
[31m-typedef struct luaL_Buffer{[m
[31m-char*p;[m
[31m-int lvl;[m
[31m-lua_State*L;[m
[31m-char buffer[BUFSIZ];[m
[31m-}luaL_Buffer;[m
[31m-#define luaL_addchar(B,c)((void)((B)->p<((B)->buffer+BUFSIZ)||luaL_prepbuffer(B)),(*(B)->p++=(char)(c)))[m
[31m-#define luaL_addsize(B,n)((B)->p+=(n))[m
[31m-static char* luaL_prepbuffer(luaL_Buffer*B);[m
[31m-static int luaL_argerror(lua_State*L,int narg,const char*extramsg){[m
[31m-lua_Debug ar;[m
[31m-if(!lua_getstack(L,0,&ar))[m
[31m-return luaL_error(L,"bad argument #%d (%s)",narg,extramsg);[m
[31m-lua_getinfo(L,"n",&ar);[m
[31m-if(strcmp(ar.namewhat,"method")==0){[m
[31m-narg--;[m
[31m-if(narg==0)[m
[31m-return luaL_error(L,"calling "LUA_QL("%s")" on bad self (%s)",[m
[31m-ar.name,extramsg);[m
[31m-}[m
[31m-if(ar.name==NULL)[m
[31m-ar.name="?";[m
[31m-return luaL_error(L,"bad argument #%d to "LUA_QL("%s")" (%s)",[m
[31m-narg,ar.name,extramsg);[m
[31m-}[m
[31m-static int luaL_typerror(lua_State*L,int narg,const char*tname){[m
[31m-const char*msg=lua_pushfstring(L,"%s expected, got %s",[m
[31m-tname,luaL_typename(L,narg));[m
[31m-return luaL_argerror(L,narg,msg);[m
[31m-}[m
[31m-static void tag_error(lua_State*L,int narg,int tag){[m
[31m-luaL_typerror(L,narg,lua_typename(L,tag));[m
[31m-}[m
[31m-static void luaL_where(lua_State*L,int level){[m
[31m-lua_Debug ar;[m
[31m-if(lua_getstack(L,level,&ar)){[m
[31m-lua_getinfo(L,"Sl",&ar);[m
[31m-if(ar.currentline>0){[m
[31m-lua_pushfstring(L,"%s:%d: ",ar.short_src,ar.currentline);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-lua_pushliteral(L,"");[m
[31m-}[m
[31m-static int luaL_error(lua_State*L,const char*fmt,...){[m
[31m-va_list argp;[m
[31m-va_start(argp,fmt);[m
[31m-luaL_where(L,1);[m
[31m-lua_pushvfstring(L,fmt,argp);[m
[31m-va_end(argp);[m
[31m-lua_concat(L,2);[m
[31m-return lua_error(L);[m
[31m-}[m
[31m-static int luaL_newmetatable(lua_State*L,const char*tname){[m
[31m-lua_getfield(L,(-10000),tname);[m
[31m-if(!lua_isnil(L,-1))[m
[31m-return 0;[m
[31m-lua_pop(L,1);[m
[31m-lua_newtable(L);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_setfield(L,(-10000),tname);[m
[31m-return 1;[m
[31m-}[m
[31m-static void*luaL_checkudata(lua_State*L,int ud,const char*tname){[m
[31m-void*p=lua_touserdata(L,ud);[m
[31m-if(p!=NULL){[m
[31m-if(lua_getmetatable(L,ud)){[m
[31m-lua_getfield(L,(-10000),tname);[m
[31m-if(lua_rawequal(L,-1,-2)){[m
[31m-lua_pop(L,2);[m
[31m-return p;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-luaL_typerror(L,ud,tname);[m
[31m-return NULL;[m
[31m-}[m
[31m-static void luaL_checkstack(lua_State*L,int space,const char*mes){[m
[31m-if(!lua_checkstack(L,space))[m
[31m-luaL_error(L,"stack overflow (%s)",mes);[m
[31m-}[m
[31m-static void luaL_checktype(lua_State*L,int narg,int t){[m
[31m-if(lua_type(L,narg)!=t)[m
[31m-tag_error(L,narg,t);[m
[31m-}[m
[31m-static void luaL_checkany(lua_State*L,int narg){[m
[31m-if(lua_type(L,narg)==(-1))[m
[31m-luaL_argerror(L,narg,"value expected");[m
[31m-}[m
[31m-static const char*luaL_checklstring(lua_State*L,int narg,size_t*len){[m
[31m-const char*s=lua_tolstring(L,narg,len);[m
[31m-if(!s)tag_error(L,narg,4);[m
[31m-return s;[m
[31m-}[m
[31m-static const char*luaL_optlstring(lua_State*L,int narg,[m
[31m-const char*def,size_t*len){[m
[31m-if(lua_isnoneornil(L,narg)){[m
[31m-if(len)[m
[31m-*len=(def?strlen(def):0);[m
[31m-return def;[m
[31m-}[m
[31m-else return luaL_checklstring(L,narg,len);[m
[31m-}[m
[31m-static lua_Number luaL_checknumber(lua_State*L,int narg){[m
[31m-lua_Number d=lua_tonumber(L,narg);[m
[31m-if(d==0&&!lua_isnumber(L,narg))[m
[31m-tag_error(L,narg,3);[m
[31m-return d;[m
[31m-}[m
[31m-static lua_Integer luaL_checkinteger(lua_State*L,int narg){[m
[31m-lua_Integer d=lua_tointeger(L,narg);[m
[31m-if(d==0&&!lua_isnumber(L,narg))[m
[31m-tag_error(L,narg,3);[m
[31m-return d;[m
[31m-}[m
[31m-static lua_Integer luaL_optinteger(lua_State*L,int narg,[m
[31m-lua_Integer def){[m
[31m-return luaL_opt(L,luaL_checkinteger,narg,def);[m
[31m-}[m
[31m-static int luaL_getmetafield(lua_State*L,int obj,const char*event){[m
[31m-if(!lua_getmetatable(L,obj))[m
[31m-return 0;[m
[31m-lua_pushstring(L,event);[m
[31m-lua_rawget(L,-2);[m
[31m-if(lua_isnil(L,-1)){[m
[31m-lua_pop(L,2);[m
[31m-return 0;[m
[31m-}[m
[31m-else{[m
[31m-lua_remove(L,-2);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static void luaL_register(lua_State*L,const char*libname,[m
[31m-const luaL_Reg*l){[m
[31m-luaI_openlib(L,libname,l,0);[m
[31m-}[m
[31m-static int libsize(const luaL_Reg*l){[m
[31m-int size=0;[m
[31m-for(;l->name;l++)size++;[m
[31m-return size;[m
[31m-}[m
[31m-static void luaI_openlib(lua_State*L,const char*libname,[m
[31m-const luaL_Reg*l,int nup){[m
[31m-if(libname){[m
[31m-int size=libsize(l);[m
[31m-luaL_findtable(L,(-10000),"_LOADED",1);[m
[31m-lua_getfield(L,-1,libname);[m
[31m-if(!lua_istable(L,-1)){[m
[31m-lua_pop(L,1);[m
[31m-if(luaL_findtable(L,(-10002),libname,size)!=NULL)[m
[31m-luaL_error(L,"name conflict for module "LUA_QL("%s"),libname);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_setfield(L,-3,libname);[m
[31m-}[m
[31m-lua_remove(L,-2);[m
[31m-lua_insert(L,-(nup+1));[m
[31m-}[m
[31m-for(;l->name;l++){[m
[31m-int i;[m
[31m-for(i=0;i<nup;i++)[m
[31m-lua_pushvalue(L,-nup);[m
[31m-lua_pushcclosure(L,l->func,nup);[m
[31m-lua_setfield(L,-(nup+2),l->name);[m
[31m-}[m
[31m-lua_pop(L,nup);[m
[31m-}[m
[31m-static const char*luaL_findtable(lua_State*L,int idx,[m
[31m-const char*fname,int szhint){[m
[31m-const char*e;[m
[31m-lua_pushvalue(L,idx);[m
[31m-do{[m
[31m-e=strchr(fname,'.');[m
[31m-if(e==NULL)e=fname+strlen(fname);[m
[31m-lua_pushlstring(L,fname,e-fname);[m
[31m-lua_rawget(L,-2);[m
[31m-if(lua_isnil(L,-1)){[m
[31m-lua_pop(L,1);[m
[31m-lua_createtable(L,0,(*e=='.'?1:szhint));[m
[31m-lua_pushlstring(L,fname,e-fname);[m
[31m-lua_pushvalue(L,-2);[m
[31m-lua_settable(L,-4);[m
[31m-}[m
[31m-else if(!lua_istable(L,-1)){[m
[31m-lua_pop(L,2);[m
[31m-return fname;[m
[31m-}[m
[31m-lua_remove(L,-2);[m
[31m-fname=e+1;[m
[31m-}while(*e=='.');[m
[31m-return NULL;[m
[31m-}[m
[31m-#define bufflen(B)((B)->p-(B)->buffer)[m
[31m-#define bufffree(B)((size_t)(BUFSIZ-bufflen(B)))[m
[31m-static int emptybuffer(luaL_Buffer*B){[m
[31m-size_t l=bufflen(B);[m
[31m-if(l==0)return 0;[m
[31m-else{[m
[31m-lua_pushlstring(B->L,B->buffer,l);[m
[31m-B->p=B->buffer;[m
[31m-B->lvl++;[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static void adjuststack(luaL_Buffer*B){[m
[31m-if(B->lvl>1){[m
[31m-lua_State*L=B->L;[m
[31m-int toget=1;[m
[31m-size_t toplen=lua_strlen(L,-1);[m
[31m-do{[m
[31m-size_t l=lua_strlen(L,-(toget+1));[m
[31m-if(B->lvl-toget+1>=(20/2)||toplen>l){[m
[31m-toplen+=l;[m
[31m-toget++;[m
[31m-}[m
[31m-else break;[m
[31m-}while(toget<B->lvl);[m
[31m-lua_concat(L,toget);[m
[31m-B->lvl=B->lvl-toget+1;[m
[31m-}[m
[31m-}[m
[31m-static char*luaL_prepbuffer(luaL_Buffer*B){[m
[31m-if(emptybuffer(B))[m
[31m-adjuststack(B);[m
[31m-return B->buffer;[m
[31m-}[m
[31m-static void luaL_addlstring(luaL_Buffer*B,const char*s,size_t l){[m
[31m-while(l--)[m
[31m-luaL_addchar(B,*s++);[m
[31m-}[m
[31m-static void luaL_pushresult(luaL_Buffer*B){[m
[31m-emptybuffer(B);[m
[31m-lua_concat(B->L,B->lvl);[m
[31m-B->lvl=1;[m
[31m-}[m
[31m-static void luaL_addvalue(luaL_Buffer*B){[m
[31m-lua_State*L=B->L;[m
[31m-size_t vl;[m
[31m-const char*s=lua_tolstring(L,-1,&vl);[m
[31m-if(vl<=bufffree(B)){[m
[31m-memcpy(B->p,s,vl);[m
[31m-B->p+=vl;[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-else{[m
[31m-if(emptybuffer(B))[m
[31m-lua_insert(L,-2);[m
[31m-B->lvl++;[m
[31m-adjuststack(B);[m
[31m-}[m
[31m-}[m
[31m-static void luaL_buffinit(lua_State*L,luaL_Buffer*B){[m
[31m-B->L=L;[m
[31m-B->p=B->buffer;[m
[31m-B->lvl=0;[m
[31m-}[m
[31m-typedef struct LoadF{[m
[31m-int extraline;[m
[31m-FILE*f;[m
[31m-char buff[BUFSIZ];[m
[31m-}LoadF;[m
[31m-static const char*getF(lua_State*L,void*ud,size_t*size){[m
[31m-LoadF*lf=(LoadF*)ud;[m
[31m-(void)L;[m
[31m-if(lf->extraline){[m
[31m-lf->extraline=0;[m
[31m-*size=1;[m
[31m-return"\n";[m
[31m-}[m
[31m-if(feof(lf->f))return NULL;[m
[31m-*size=fread(lf->buff,1,sizeof(lf->buff),lf->f);[m
[31m-return(*size>0)?lf->buff:NULL;[m
[31m-}[m
[31m-static int errfile(lua_State*L,const char*what,int fnameindex){[m
[31m-const char*serr=strerror(errno);[m
[31m-const char*filename=lua_tostring(L,fnameindex)+1;[m
[31m-lua_pushfstring(L,"cannot %s %s: %s",what,filename,serr);[m
[31m-lua_remove(L,fnameindex);[m
[31m-return(5+1);[m
[31m-}[m
[31m-static int luaL_loadfile(lua_State*L,const char*filename){[m
[31m-LoadF lf;[m
[31m-int status,readstatus;[m
[31m-int c;[m
[31m-int fnameindex=lua_gettop(L)+1;[m
[31m-lf.extraline=0;[m
[31m-if(filename==NULL){[m
[31m-lua_pushliteral(L,"=stdin");[m
[31m-lf.f=stdin;[m
[31m-}[m
[31m-else{[m
[31m-lua_pushfstring(L,"@%s",filename);[m
[31m-lf.f=fopen(filename,"r");[m
[31m-if(lf.f==NULL)return errfile(L,"open",fnameindex);[m
[31m-}[m
[31m-c=getc(lf.f);[m
[31m-if(c=='#'){[m
[31m-lf.extraline=1;[m
[31m-while((c=getc(lf.f))!=EOF&&c!='\n');[m
[31m-if(c=='\n')c=getc(lf.f);[m
[31m-}[m
[31m-if(c=="\033Lua"[0]&&filename){[m
[31m-lf.f=freopen(filename,"rb",lf.f);[m
[31m-if(lf.f==NULL)return errfile(L,"reopen",fnameindex);[m
[31m-while((c=getc(lf.f))!=EOF&&c!="\033Lua"[0]);[m
[31m-lf.extraline=0;[m
[31m-}[m
[31m-ungetc(c,lf.f);[m
[31m-status=lua_load(L,getF,&lf,lua_tostring(L,-1));[m
[31m-readstatus=ferror(lf.f);[m
[31m-if(filename)fclose(lf.f);[m
[31m-if(readstatus){[m
[31m-lua_settop(L,fnameindex);[m
[31m-return errfile(L,"read",fnameindex);[m
[31m-}[m
[31m-lua_remove(L,fnameindex);[m
[31m-return status;[m
[31m-}[m
[31m-typedef struct LoadS{[m
[31m-const char*s;[m
[31m-size_t size;[m
[31m-}LoadS;[m
[31m-static const char*getS(lua_State*L,void*ud,size_t*size){[m
[31m-LoadS*ls=(LoadS*)ud;[m
[31m-(void)L;[m
[31m-if(ls->size==0)return NULL;[m
[31m-*size=ls->size;[m
[31m-ls->size=0;[m
[31m-return ls->s;[m
[31m-}[m
[31m-static int luaL_loadbuffer(lua_State*L,const char*buff,size_t size,[m
[31m-const char*name){[m
[31m-LoadS ls;[m
[31m-ls.s=buff;[m
[31m-ls.size=size;[m
[31m-return lua_load(L,getS,&ls,name);[m
[31m-}[m
[31m-static void*l_alloc(void*ud,void*ptr,size_t osize,size_t nsize){[m
[31m-(void)ud;[m
[31m-(void)osize;[m
[31m-if(nsize==0){[m
[31m-free(ptr);[m
[31m-return NULL;[m
[31m-}[m
[31m-else[m
[31m-return realloc(ptr,nsize);[m
[31m-}[m
[31m-static int panic(lua_State*L){[m
[31m-(void)L;[m
[31m-fprintf(stderr,"PANIC: unprotected error in call to Lua API (%s)\n",[m
[31m-lua_tostring(L,-1));[m
[31m-return 0;[m
[31m-}[m
[31m-static lua_State*luaL_newstate(void){[m
[31m-lua_State*L=lua_newstate(l_alloc,NULL);[m
[31m-if(L)lua_atpanic(L,&panic);[m
[31m-return L;[m
[31m-}[m
[31m-static int luaB_tonumber(lua_State*L){[m
[31m-int base=luaL_optint(L,2,10);[m
[31m-if(base==10){[m
[31m-luaL_checkany(L,1);[m
[31m-if(lua_isnumber(L,1)){[m
[31m-lua_pushnumber(L,lua_tonumber(L,1));[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-else{[m
[31m-const char*s1=luaL_checkstring(L,1);[m
[31m-char*s2;[m
[31m-unsigned long n;[m
[31m-luaL_argcheck(L,2<=base&&base<=36,2,"base out of range");[m
[31m-n=strtoul(s1,&s2,base);[m
[31m-if(s1!=s2){[m
[31m-while(isspace((unsigned char)(*s2)))s2++;[m
[31m-if(*s2=='\0'){[m
[31m-lua_pushnumber(L,(lua_Number)n);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-lua_pushnil(L);[m
[31m-return 1;[m
[31m-}[m
[31m-static int luaB_error(lua_State*L){[m
[31m-int level=luaL_optint(L,2,1);[m
[31m-lua_settop(L,1);[m
[31m-if(lua_isstring(L,1)&&level>0){[m
[31m-luaL_where(L,level);[m
[31m-lua_pushvalue(L,1);[m
[31m-lua_concat(L,2);[m
[31m-}[m
[31m-return lua_error(L);[m
[31m-}[m
[31m-static int luaB_setmetatable(lua_State*L){[m
[31m-int t=lua_type(L,2);[m
[31m-luaL_checktype(L,1,5);[m
[31m-luaL_argcheck(L,t==0||t==5,2,[m
[31m-"nil or table expected");[m
[31m-if(luaL_getmetafield(L,1,"__metatable"))[m
[31m-luaL_error(L,"cannot change a protected metatable");[m
[31m-lua_settop(L,2);[m
[31m-lua_setmetatable(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-static void getfunc(lua_State*L,int opt){[m
[31m-if(lua_isfunction(L,1))lua_pushvalue(L,1);[m
[31m-else{[m
[31m-lua_Debug ar;[m
[31m-int level=opt?luaL_optint(L,1,1):luaL_checkint(L,1);[m
[31m-luaL_argcheck(L,level>=0,1,"level must be non-negative");[m
[31m-if(lua_getstack(L,level,&ar)==0)[m
[31m-luaL_argerror(L,1,"invalid level");[m
[31m-lua_getinfo(L,"f",&ar);[m
[31m-if(lua_isnil(L,-1))[m
[31m-luaL_error(L,"no function environment for tail call at level %d",[m
[31m-level);[m
[31m-}[m
[31m-}[m
[31m-static int luaB_setfenv(lua_State*L){[m
[31m-luaL_checktype(L,2,5);[m
[31m-getfunc(L,0);[m
[31m-lua_pushvalue(L,2);[m
[31m-if(lua_isnumber(L,1)&&lua_tonumber(L,1)==0){[m
[31m-lua_pushthread(L);[m
[31m-lua_insert(L,-2);[m
[31m-lua_setfenv(L,-2);[m
[31m-return 0;[m
[31m-}[m
[31m-else if(lua_iscfunction(L,-2)||lua_setfenv(L,-2)==0)[m
[31m-luaL_error(L,[m
[31m-LUA_QL("setfenv")" cannot change environment of given object");[m
[31m-return 1;[m
[31m-}[m
[31m-static int luaB_rawget(lua_State*L){[m
[31m-luaL_checktype(L,1,5);[m
[31m-luaL_checkany(L,2);[m
[31m-lua_settop(L,2);[m
[31m-lua_rawget(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-static int luaB_type(lua_State*L){[m
[31m-luaL_checkany(L,1);[m
[31m-lua_pushstring(L,luaL_typename(L,1));[m
[31m-return 1;[m
[31m-}[m
[31m-static int luaB_next(lua_State*L){[m
[31m-luaL_checktype(L,1,5);[m
[31m-lua_settop(L,2);[m
[31m-if(lua_next(L,1))[m
[31m-return 2;[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static int luaB_pairs(lua_State*L){[m
[31m-luaL_checktype(L,1,5);[m
[31m-lua_pushvalue(L,lua_upvalueindex(1));[m
[31m-lua_pushvalue(L,1);[m
[31m-lua_pushnil(L);[m
[31m-return 3;[m
[31m-}[m
[31m-static int ipairsaux(lua_State*L){[m
[31m-int i=luaL_checkint(L,2);[m
[31m-luaL_checktype(L,1,5);[m
[31m-i++;[m
[31m-lua_pushinteger(L,i);[m
[31m-lua_rawgeti(L,1,i);[m
[31m-return(lua_isnil(L,-1))?0:2;[m
[31m-}[m
[31m-static int luaB_ipairs(lua_State*L){[m
[31m-luaL_checktype(L,1,5);[m
[31m-lua_pushvalue(L,lua_upvalueindex(1));[m
[31m-lua_pushvalue(L,1);[m
[31m-lua_pushinteger(L,0);[m
[31m-return 3;[m
[31m-}[m
[31m-static int load_aux(lua_State*L,int status){[m
[31m-if(status==0)[m
[31m-return 1;[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-lua_insert(L,-2);[m
[31m-return 2;[m
[31m-}[m
[31m-}[m
[31m-static int luaB_loadstring(lua_State*L){[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-const char*chunkname=luaL_optstring(L,2,s);[m
[31m-return load_aux(L,luaL_loadbuffer(L,s,l,chunkname));[m
[31m-}[m
[31m-static int luaB_loadfile(lua_State*L){[m
[31m-const char*fname=luaL_optstring(L,1,NULL);[m
[31m-return load_aux(L,luaL_loadfile(L,fname));[m
[31m-}[m
[31m-static int luaB_assert(lua_State*L){[m
[31m-luaL_checkany(L,1);[m
[31m-if(!lua_toboolean(L,1))[m
[31m-return luaL_error(L,"%s",luaL_optstring(L,2,"assertion failed!"));[m
[31m-return lua_gettop(L);[m
[31m-}[m
[31m-static int luaB_unpack(lua_State*L){[m
[31m-int i,e,n;[m
[31m-luaL_checktype(L,1,5);[m
[31m-i=luaL_optint(L,2,1);[m
[31m-e=luaL_opt(L,luaL_checkint,3,luaL_getn(L,1));[m
[31m-if(i>e)return 0;[m
[31m-n=e-i+1;[m
[31m-if(n<=0||!lua_checkstack(L,n))[m
[31m-return luaL_error(L,"too many results to unpack");[m
[31m-lua_rawgeti(L,1,i);[m
[31m-while(i++<e)[m
[31m-lua_rawgeti(L,1,i);[m
[31m-return n;[m
[31m-}[m
[31m-static int luaB_pcall(lua_State*L){[m
[31m-int status;[m
[31m-luaL_checkany(L,1);[m
[31m-status=lua_pcall(L,lua_gettop(L)-1,(-1),0);[m
[31m-lua_pushboolean(L,(status==0));[m
[31m-lua_insert(L,1);[m
[31m-return lua_gettop(L);[m
[31m-}[m
[31m-static int luaB_newproxy(lua_State*L){[m
[31m-lua_settop(L,1);[m
[31m-lua_newuserdata(L,0);[m
[31m-if(lua_toboolean(L,1)==0)[m
[31m-return 1;[m
[31m-else if(lua_isboolean(L,1)){[m
[31m-lua_newtable(L);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_pushboolean(L,1);[m
[31m-lua_rawset(L,lua_upvalueindex(1));[m
[31m-}[m
[31m-else{[m
[31m-int validproxy=0;[m
[31m-if(lua_getmetatable(L,1)){[m
[31m-lua_rawget(L,lua_upvalueindex(1));[m
[31m-validproxy=lua_toboolean(L,-1);[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-luaL_argcheck(L,validproxy,1,"boolean or proxy expected");[m
[31m-lua_getmetatable(L,1);[m
[31m-}[m
[31m-lua_setmetatable(L,2);[m
[31m-return 1;[m
[31m-}[m
[31m-static const luaL_Reg base_funcs[]={[m
[31m-{"assert",luaB_assert},[m
[31m-{"error",luaB_error},[m
[31m-{"loadfile",luaB_loadfile},[m
[31m-{"loadstring",luaB_loadstring},[m
[31m-{"next",luaB_next},[m
[31m-{"pcall",luaB_pcall},[m
[31m-{"rawget",luaB_rawget},[m
[31m-{"setfenv",luaB_setfenv},[m
[31m-{"setmetatable",luaB_setmetatable},[m
[31m-{"tonumber",luaB_tonumber},[m
[31m-{"type",luaB_type},[m
[31m-{"unpack",luaB_unpack},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static void auxopen(lua_State*L,const char*name,[m
[31m-lua_CFunction f,lua_CFunction u){[m
[31m-lua_pushcfunction(L,u);[m
[31m-lua_pushcclosure(L,f,1);[m
[31m-lua_setfield(L,-2,name);[m
[31m-}[m
[31m-static void base_open(lua_State*L){[m
[31m-lua_pushvalue(L,(-10002));[m
[31m-lua_setglobal(L,"_G");[m
[31m-luaL_register(L,"_G",base_funcs);[m
[31m-lua_pushliteral(L,"Lua 5.1");[m
[31m-lua_setglobal(L,"_VERSION");[m
[31m-auxopen(L,"ipairs",luaB_ipairs,ipairsaux);[m
[31m-auxopen(L,"pairs",luaB_pairs,luaB_next);[m
[31m-lua_createtable(L,0,1);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_setmetatable(L,-2);[m
[31m-lua_pushliteral(L,"kv");[m
[31m-lua_setfield(L,-2,"__mode");[m
[31m-lua_pushcclosure(L,luaB_newproxy,1);[m
[31m-lua_setglobal(L,"newproxy");[m
[31m-}[m
[31m-static int luaopen_base(lua_State*L){[m
[31m-base_open(L);[m
[31m-return 1;[m
[31m-}[m
[31m-#define aux_getn(L,n)(luaL_checktype(L,n,5),luaL_getn(L,n))[m
[31m-static int tinsert(lua_State*L){[m
[31m-int e=aux_getn(L,1)+1;[m
[31m-int pos;[m
[31m-switch(lua_gettop(L)){[m
[31m-case 2:{[m
[31m-pos=e;[m
[31m-break;[m
[31m-}[m
[31m-case 3:{[m
[31m-int i;[m
[31m-pos=luaL_checkint(L,2);[m
[31m-if(pos>e)e=pos;[m
[31m-for(i=e;i>pos;i--){[m
[31m-lua_rawgeti(L,1,i-1);[m
[31m-lua_rawseti(L,1,i);[m
[31m-}[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-return luaL_error(L,"wrong number of arguments to "LUA_QL("insert"));[m
[31m-}[m
[31m-}[m
[31m-luaL_setn(L,1,e);[m
[31m-lua_rawseti(L,1,pos);[m
[31m-return 0;[m
[31m-}[m
[31m-static int tremove(lua_State*L){[m
[31m-int e=aux_getn(L,1);[m
[31m-int pos=luaL_optint(L,2,e);[m
[31m-if(!(1<=pos&&pos<=e))[m
[31m-return 0;[m
[31m-luaL_setn(L,1,e-1);[m
[31m-lua_rawgeti(L,1,pos);[m
[31m-for(;pos<e;pos++){[m
[31m-lua_rawgeti(L,1,pos+1);[m
[31m-lua_rawseti(L,1,pos);[m
[31m-}[m
[31m-lua_pushnil(L);[m
[31m-lua_rawseti(L,1,e);[m
[31m-return 1;[m
[31m-}[m
[31m-static void addfield(lua_State*L,luaL_Buffer*b,int i){[m
[31m-lua_rawgeti(L,1,i);[m
[31m-if(!lua_isstring(L,-1))[m
[31m-luaL_error(L,"invalid value (%s) at index %d in table for "[m
[31m-LUA_QL("concat"),luaL_typename(L,-1),i);[m
[31m-luaL_addvalue(b);[m
[31m-}[m
[31m-static int tconcat(lua_State*L){[m
[31m-luaL_Buffer b;[m
[31m-size_t lsep;[m
[31m-int i,last;[m
[31m-const char*sep=luaL_optlstring(L,2,"",&lsep);[m
[31m-luaL_checktype(L,1,5);[m
[31m-i=luaL_optint(L,3,1);[m
[31m-last=luaL_opt(L,luaL_checkint,4,luaL_getn(L,1));[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(;i<last;i++){[m
[31m-addfield(L,&b,i);[m
[31m-luaL_addlstring(&b,sep,lsep);[m
[31m-}[m
[31m-if(i==last)[m
[31m-addfield(L,&b,i);[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static void set2(lua_State*L,int i,int j){[m
[31m-lua_rawseti(L,1,i);[m
[31m-lua_rawseti(L,1,j);[m
[31m-}[m
[31m-static int sort_comp(lua_State*L,int a,int b){[m
[31m-if(!lua_isnil(L,2)){[m
[31m-int res;[m
[31m-lua_pushvalue(L,2);[m
[31m-lua_pushvalue(L,a-1);[m
[31m-lua_pushvalue(L,b-2);[m
[31m-lua_call(L,2,1);[m
[31m-res=lua_toboolean(L,-1);[m
[31m-lua_pop(L,1);[m
[31m-return res;[m
[31m-}[m
[31m-else[m
[31m-return lua_lessthan(L,a,b);[m
[31m-}[m
[31m-static void auxsort(lua_State*L,int l,int u){[m
[31m-while(l<u){[m
[31m-int i,j;[m
[31m-lua_rawgeti(L,1,l);[m
[31m-lua_rawgeti(L,1,u);[m
[31m-if(sort_comp(L,-1,-2))[m
[31m-set2(L,l,u);[m
[31m-else[m
[31m-lua_pop(L,2);[m
[31m-if(u-l==1)break;[m
[31m-i=(l+u)/2;[m
[31m-lua_rawgeti(L,1,i);[m
[31m-lua_rawgeti(L,1,l);[m
[31m-if(sort_comp(L,-2,-1))[m
[31m-set2(L,i,l);[m
[31m-else{[m
[31m-lua_pop(L,1);[m
[31m-lua_rawgeti(L,1,u);[m
[31m-if(sort_comp(L,-1,-2))[m
[31m-set2(L,i,u);[m
[31m-else[m
[31m-lua_pop(L,2);[m
[31m-}[m
[31m-if(u-l==2)break;[m
[31m-lua_rawgeti(L,1,i);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_rawgeti(L,1,u-1);[m
[31m-set2(L,i,u-1);[m
[31m-i=l;j=u-1;[m
[31m-for(;;){[m
[31m-while(lua_rawgeti(L,1,++i),sort_comp(L,-1,-2)){[m
[31m-if(i>u)luaL_error(L,"invalid order function for sorting");[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-while(lua_rawgeti(L,1,--j),sort_comp(L,-3,-1)){[m
[31m-if(j<l)luaL_error(L,"invalid order function for sorting");[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-if(j<i){[m
[31m-lua_pop(L,3);[m
[31m-break;[m
[31m-}[m
[31m-set2(L,i,j);[m
[31m-}[m
[31m-lua_rawgeti(L,1,u-1);[m
[31m-lua_rawgeti(L,1,i);[m
[31m-set2(L,u-1,i);[m
[31m-if(i-l<u-i){[m
[31m-j=l;i=i-1;l=i+2;[m
[31m-}[m
[31m-else{[m
[31m-j=i+1;i=u;u=j-2;[m
[31m-}[m
[31m-auxsort(L,j,i);[m
[31m-}[m
[31m-}[m
[31m-static int sort(lua_State*L){[m
[31m-int n=aux_getn(L,1);[m
[31m-luaL_checkstack(L,40,"");[m
[31m-if(!lua_isnoneornil(L,2))[m
[31m-luaL_checktype(L,2,6);[m
[31m-lua_settop(L,2);[m
[31m-auxsort(L,1,n);[m
[31m-return 0;[m
[31m-}[m
[31m-static const luaL_Reg tab_funcs[]={[m
[31m-{"concat",tconcat},[m
[31m-{"insert",tinsert},[m
[31m-{"remove",tremove},[m
[31m-{"sort",sort},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static int luaopen_table(lua_State*L){[m
[31m-luaL_register(L,"table",tab_funcs);[m
[31m-return 1;[m
[31m-}[m
[31m-static const char*const fnames[]={"input","output"};[m
[31m-static int pushresult(lua_State*L,int i,const char*filename){[m
[31m-int en=errno;[m
[31m-if(i){[m
[31m-lua_pushboolean(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-if(filename)[m
[31m-lua_pushfstring(L,"%s: %s",filename,strerror(en));[m
[31m-else[m
[31m-lua_pushfstring(L,"%s",strerror(en));[m
[31m-lua_pushinteger(L,en);[m
[31m-return 3;[m
[31m-}[m
[31m-}[m
[31m-static void fileerror(lua_State*L,int arg,const char*filename){[m
[31m-lua_pushfstring(L,"%s: %s",filename,strerror(errno));[m
[31m-luaL_argerror(L,arg,lua_tostring(L,-1));[m
[31m-}[m
[31m-#define tofilep(L)((FILE**)luaL_checkudata(L,1,"FILE*"))[m
[31m-static int io_type(lua_State*L){[m
[31m-void*ud;[m
[31m-luaL_checkany(L,1);[m
[31m-ud=lua_touserdata(L,1);[m
[31m-lua_getfield(L,(-10000),"FILE*");[m
[31m-if(ud==NULL||!lua_getmetatable(L,1)||!lua_rawequal(L,-2,-1))[m
[31m-lua_pushnil(L);[m
[31m-else if(*((FILE**)ud)==NULL)[m
[31m-lua_pushliteral(L,"closed file");[m
[31m-else[m
[31m-lua_pushliteral(L,"file");[m
[31m-return 1;[m
[31m-}[m
[31m-static FILE*tofile(lua_State*L){[m
[31m-FILE**f=tofilep(L);[m
[31m-if(*f==NULL)[m
[31m-luaL_error(L,"attempt to use a closed file");[m
[31m-return*f;[m
[31m-}[m
[31m-static FILE**newfile(lua_State*L){[m
[31m-FILE**pf=(FILE**)lua_newuserdata(L,sizeof(FILE*));[m
[31m-*pf=NULL;[m
[31m-luaL_getmetatable(L,"FILE*");[m
[31m-lua_setmetatable(L,-2);[m
[31m-return pf;[m
[31m-}[m
[31m-static int io_noclose(lua_State*L){[m
[31m-lua_pushnil(L);[m
[31m-lua_pushliteral(L,"cannot close standard file");[m
[31m-return 2;[m
[31m-}[m
[31m-static int io_pclose(lua_State*L){[m
[31m-FILE**p=tofilep(L);[m
[31m-int ok=lua_pclose(L,*p);[m
[31m-*p=NULL;[m
[31m-return pushresult(L,ok,NULL);[m
[31m-}[m
[31m-static int io_fclose(lua_State*L){[m
[31m-FILE**p=tofilep(L);[m
[31m-int ok=(fclose(*p)==0);[m
[31m-*p=NULL;[m
[31m-return pushresult(L,ok,NULL);[m
[31m-}[m
[31m-static int aux_close(lua_State*L){[m
[31m-lua_getfenv(L,1);[m
[31m-lua_getfield(L,-1,"__close");[m
[31m-return(lua_tocfunction(L,-1))(L);[m
[31m-}[m
[31m-static int io_close(lua_State*L){[m
[31m-if(lua_isnone(L,1))[m
[31m-lua_rawgeti(L,(-10001),2);[m
[31m-tofile(L);[m
[31m-return aux_close(L);[m
[31m-}[m
[31m-static int io_gc(lua_State*L){[m
[31m-FILE*f=*tofilep(L);[m
[31m-if(f!=NULL)[m
[31m-aux_close(L);[m
[31m-return 0;[m
[31m-}[m
[31m-static int io_open(lua_State*L){[m
[31m-const char*filename=luaL_checkstring(L,1);[m
[31m-const char*mode=luaL_optstring(L,2,"r");[m
[31m-FILE**pf=newfile(L);[m
[31m-*pf=fopen(filename,mode);[m
[31m-return(*pf==NULL)?pushresult(L,0,filename):1;[m
[31m-}[m
[31m-static FILE*getiofile(lua_State*L,int findex){[m
[31m-FILE*f;[m
[31m-lua_rawgeti(L,(-10001),findex);[m
[31m-f=*(FILE**)lua_touserdata(L,-1);[m
[31m-if(f==NULL)[m
[31m-luaL_error(L,"standard %s file is closed",fnames[findex-1]);[m
[31m-return f;[m
[31m-}[m
[31m-static int g_iofile(lua_State*L,int f,const char*mode){[m
[31m-if(!lua_isnoneornil(L,1)){[m
[31m-const char*filename=lua_tostring(L,1);[m
[31m-if(filename){[m
[31m-FILE**pf=newfile(L);[m
[31m-*pf=fopen(filename,mode);[m
[31m-if(*pf==NULL)[m
[31m-fileerror(L,1,filename);[m
[31m-}[m
[31m-else{[m
[31m-tofile(L);[m
[31m-lua_pushvalue(L,1);[m
[31m-}[m
[31m-lua_rawseti(L,(-10001),f);[m
[31m-}[m
[31m-lua_rawgeti(L,(-10001),f);[m
[31m-return 1;[m
[31m-}[m
[31m-static int io_input(lua_State*L){[m
[31m-return g_iofile(L,1,"r");[m
[31m-}[m
[31m-static int io_output(lua_State*L){[m
[31m-return g_iofile(L,2,"w");[m
[31m-}[m
[31m-static int io_readline(lua_State*L);[m
[31m-static void aux_lines(lua_State*L,int idx,int toclose){[m
[31m-lua_pushvalue(L,idx);[m
[31m-lua_pushboolean(L,toclose);[m
[31m-lua_pushcclosure(L,io_readline,2);[m
[31m-}[m
[31m-static int f_lines(lua_State*L){[m
[31m-tofile(L);[m
[31m-aux_lines(L,1,0);[m
[31m-return 1;[m
[31m-}[m
[31m-static int io_lines(lua_State*L){[m
[31m-if(lua_isnoneornil(L,1)){[m
[31m-lua_rawgeti(L,(-10001),1);[m
[31m-return f_lines(L);[m
[31m-}[m
[31m-else{[m
[31m-const char*filename=luaL_checkstring(L,1);[m
[31m-FILE**pf=newfile(L);[m
[31m-*pf=fopen(filename,"r");[m
[31m-if(*pf==NULL)[m
[31m-fileerror(L,1,filename);[m
[31m-aux_lines(L,lua_gettop(L),1);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static int read_number(lua_State*L,FILE*f){[m
[31m-lua_Number d;[m
[31m-if(fscanf(f,"%lf",&d)==1){[m
[31m-lua_pushnumber(L,d);[m
[31m-return 1;[m
[31m-}[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-static int test_eof(lua_State*L,FILE*f){[m
[31m-int c=getc(f);[m
[31m-ungetc(c,f);[m
[31m-lua_pushlstring(L,NULL,0);[m
[31m-return(c!=EOF);[m
[31m-}[m
[31m-static int read_line(lua_State*L,FILE*f){[m
[31m-luaL_Buffer b;[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(;;){[m
[31m-size_t l;[m
[31m-char*p=luaL_prepbuffer(&b);[m
[31m-if(fgets(p,BUFSIZ,f)==NULL){[m
[31m-luaL_pushresult(&b);[m
[31m-return(lua_objlen(L,-1)>0);[m
[31m-}[m
[31m-l=strlen(p);[m
[31m-if(l==0||p[l-1]!='\n')[m
[31m-luaL_addsize(&b,l);[m
[31m-else{[m
[31m-luaL_addsize(&b,l-1);[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static int read_chars(lua_State*L,FILE*f,size_t n){[m
[31m-size_t rlen;[m
[31m-size_t nr;[m
[31m-luaL_Buffer b;[m
[31m-luaL_buffinit(L,&b);[m
[31m-rlen=BUFSIZ;[m
[31m-do{[m
[31m-char*p=luaL_prepbuffer(&b);[m
[31m-if(rlen>n)rlen=n;[m
[31m-nr=fread(p,sizeof(char),rlen,f);[m
[31m-luaL_addsize(&b,nr);[m
[31m-n-=nr;[m
[31m-}while(n>0&&nr==rlen);[m
[31m-luaL_pushresult(&b);[m
[31m-return(n==0||lua_objlen(L,-1)>0);[m
[31m-}[m
[31m-static int g_read(lua_State*L,FILE*f,int first){[m
[31m-int nargs=lua_gettop(L)-1;[m
[31m-int success;[m
[31m-int n;[m
[31m-clearerr(f);[m
[31m-if(nargs==0){[m
[31m-success=read_line(L,f);[m
[31m-n=first+1;[m
[31m-}[m
[31m-else{[m
[31m-luaL_checkstack(L,nargs+20,"too many arguments");[m
[31m-success=1;[m
[31m-for(n=first;nargs--&&success;n++){[m
[31m-if(lua_type(L,n)==3){[m
[31m-size_t l=(size_t)lua_tointeger(L,n);[m
[31m-success=(l==0)?test_eof(L,f):read_chars(L,f,l);[m
[31m-}[m
[31m-else{[m
[31m-const char*p=lua_tostring(L,n);[m
[31m-luaL_argcheck(L,p&&p[0]=='*',n,"invalid option");[m
[31m-switch(p[1]){[m
[31m-case'n':[m
[31m-success=read_number(L,f);[m
[31m-break;[m
[31m-case'l':[m
[31m-success=read_line(L,f);[m
[31m-break;[m
[31m-case'a':[m
[31m-read_chars(L,f,~((size_t)0));[m
[31m-success=1;[m
[31m-break;[m
[31m-default:[m
[31m-return luaL_argerror(L,n,"invalid format");[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-if(ferror(f))[m
[31m-return pushresult(L,0,NULL);[m
[31m-if(!success){[m
[31m-lua_pop(L,1);[m
[31m-lua_pushnil(L);[m
[31m-}[m
[31m-return n-first;[m
[31m-}[m
[31m-static int io_read(lua_State*L){[m
[31m-return g_read(L,getiofile(L,1),1);[m
[31m-}[m
[31m-static int f_read(lua_State*L){[m
[31m-return g_read(L,tofile(L),2);[m
[31m-}[m
[31m-static int io_readline(lua_State*L){[m
[31m-FILE*f=*(FILE**)lua_touserdata(L,lua_upvalueindex(1));[m
[31m-int sucess;[m
[31m-if(f==NULL)[m
[31m-luaL_error(L,"file is already closed");[m
[31m-sucess=read_line(L,f);[m
[31m-if(ferror(f))[m
[31m-return luaL_error(L,"%s",strerror(errno));[m
[31m-if(sucess)return 1;[m
[31m-else{[m
[31m-if(lua_toboolean(L,lua_upvalueindex(2))){[m
[31m-lua_settop(L,0);[m
[31m-lua_pushvalue(L,lua_upvalueindex(1));[m
[31m-aux_close(L);[m
[31m-}[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-static int g_write(lua_State*L,FILE*f,int arg){[m
[31m-int nargs=lua_gettop(L)-1;[m
[31m-int status=1;[m
[31m-for(;nargs--;arg++){[m
[31m-if(lua_type(L,arg)==3){[m
[31m-status=status&&[m
[31m-fprintf(f,"%.14g",lua_tonumber(L,arg))>0;[m
[31m-}[m
[31m-else{[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,arg,&l);[m
[31m-status=status&&(fwrite(s,sizeof(char),l,f)==l);[m
[31m-}[m
[31m-}[m
[31m-return pushresult(L,status,NULL);[m
[31m-}[m
[31m-static int io_write(lua_State*L){[m
[31m-return g_write(L,getiofile(L,2),1);[m
[31m-}[m
[31m-static int f_write(lua_State*L){[m
[31m-return g_write(L,tofile(L),2);[m
[31m-}[m
[31m-static int io_flush(lua_State*L){[m
[31m-return pushresult(L,fflush(getiofile(L,2))==0,NULL);[m
[31m-}[m
[31m-static int f_flush(lua_State*L){[m
[31m-return pushresult(L,fflush(tofile(L))==0,NULL);[m
[31m-}[m
[31m-static const luaL_Reg iolib[]={[m
[31m-{"close",io_close},[m
[31m-{"flush",io_flush},[m
[31m-{"input",io_input},[m
[31m-{"lines",io_lines},[m
[31m-{"open",io_open},[m
[31m-{"output",io_output},[m
[31m-{"read",io_read},[m
[31m-{"type",io_type},[m
[31m-{"write",io_write},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static const luaL_Reg flib[]={[m
[31m-{"close",io_close},[m
[31m-{"flush",f_flush},[m
[31m-{"lines",f_lines},[m
[31m-{"read",f_read},[m
[31m-{"write",f_write},[m
[31m-{"__gc",io_gc},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static void createmeta(lua_State*L){[m
[31m-luaL_newmetatable(L,"FILE*");[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_setfield(L,-2,"__index");[m
[31m-luaL_register(L,NULL,flib);[m
[31m-}[m
[31m-static void createstdfile(lua_State*L,FILE*f,int k,const char*fname){[m
[31m-*newfile(L)=f;[m
[31m-if(k>0){[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_rawseti(L,(-10001),k);[m
[31m-}[m
[31m-lua_pushvalue(L,-2);[m
[31m-lua_setfenv(L,-2);[m
[31m-lua_setfield(L,-3,fname);[m
[31m-}[m
[31m-static void newfenv(lua_State*L,lua_CFunction cls){[m
[31m-lua_createtable(L,0,1);[m
[31m-lua_pushcfunction(L,cls);[m
[31m-lua_setfield(L,-2,"__close");[m
[31m-}[m
[31m-static int luaopen_io(lua_State*L){[m
[31m-createmeta(L);[m
[31m-newfenv(L,io_fclose);[m
[31m-lua_replace(L,(-10001));[m
[31m-luaL_register(L,"io",iolib);[m
[31m-newfenv(L,io_noclose);[m
[31m-createstdfile(L,stdin,1,"stdin");[m
[31m-createstdfile(L,stdout,2,"stdout");[m
[31m-createstdfile(L,stderr,0,"stderr");[m
[31m-lua_pop(L,1);[m
[31m-lua_getfield(L,-1,"popen");[m
[31m-newfenv(L,io_pclose);[m
[31m-lua_setfenv(L,-2);[m
[31m-lua_pop(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-static int os_pushresult(lua_State*L,int i,const char*filename){[m
[31m-int en=errno;[m
[31m-if(i){[m
[31m-lua_pushboolean(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-lua_pushfstring(L,"%s: %s",filename,strerror(en));[m
[31m-lua_pushinteger(L,en);[m
[31m-return 3;[m
[31m-}[m
[31m-}[m
[31m-static int os_remove(lua_State*L){[m
[31m-const char*filename=luaL_checkstring(L,1);[m
[31m-return os_pushresult(L,remove(filename)==0,filename);[m
[31m-}[m
[31m-static int os_exit(lua_State*L){[m
[31m-exit(luaL_optint(L,1,EXIT_SUCCESS));[m
[31m-}[m
[31m-static const luaL_Reg syslib[]={[m
[31m-{"exit",os_exit},[m
[31m-{"remove",os_remove},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static int luaopen_os(lua_State*L){[m
[31m-luaL_register(L,"os",syslib);[m
[31m-return 1;[m
[31m-}[m
[31m-#define uchar(c)((unsigned char)(c))[m
[31m-static ptrdiff_t posrelat(ptrdiff_t pos,size_t len){[m
[31m-if(pos<0)pos+=(ptrdiff_t)len+1;[m
[31m-return(pos>=0)?pos:0;[m
[31m-}[m
[31m-static int str_sub(lua_State*L){[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-ptrdiff_t start=posrelat(luaL_checkinteger(L,2),l);[m
[31m-ptrdiff_t end=posrelat(luaL_optinteger(L,3,-1),l);[m
[31m-if(start<1)start=1;[m
[31m-if(end>(ptrdiff_t)l)end=(ptrdiff_t)l;[m
[31m-if(start<=end)[m
[31m-lua_pushlstring(L,s+start-1,end-start+1);[m
[31m-else lua_pushliteral(L,"");[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_lower(lua_State*L){[m
[31m-size_t l;[m
[31m-size_t i;[m
[31m-luaL_Buffer b;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(i=0;i<l;i++)[m
[31m-luaL_addchar(&b,tolower(uchar(s[i])));[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_upper(lua_State*L){[m
[31m-size_t l;[m
[31m-size_t i;[m
[31m-luaL_Buffer b;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(i=0;i<l;i++)[m
[31m-luaL_addchar(&b,toupper(uchar(s[i])));[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_rep(lua_State*L){[m
[31m-size_t l;[m
[31m-luaL_Buffer b;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-int n=luaL_checkint(L,2);[m
[31m-luaL_buffinit(L,&b);[m
[31m-while(n-->0)[m
[31m-luaL_addlstring(&b,s,l);[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_byte(lua_State*L){[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-ptrdiff_t posi=posrelat(luaL_optinteger(L,2,1),l);[m
[31m-ptrdiff_t pose=posrelat(luaL_optinteger(L,3,posi),l);[m
[31m-int n,i;[m
[31m-if(posi<=0)posi=1;[m
[31m-if((size_t)pose>l)pose=l;[m
[31m-if(posi>pose)return 0;[m
[31m-n=(int)(pose-posi+1);[m
[31m-if(posi+n<=pose)[m
[31m-luaL_error(L,"string slice too long");[m
[31m-luaL_checkstack(L,n,"string slice too long");[m
[31m-for(i=0;i<n;i++)[m
[31m-lua_pushinteger(L,uchar(s[posi+i-1]));[m
[31m-return n;[m
[31m-}[m
[31m-static int str_char(lua_State*L){[m
[31m-int n=lua_gettop(L);[m
[31m-int i;[m
[31m-luaL_Buffer b;[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(i=1;i<=n;i++){[m
[31m-int c=luaL_checkint(L,i);[m
[31m-luaL_argcheck(L,uchar(c)==c,i,"invalid value");[m
[31m-luaL_addchar(&b,uchar(c));[m
[31m-}[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-typedef struct MatchState{[m
[31m-const char*src_init;[m
[31m-const char*src_end;[m
[31m-lua_State*L;[m
[31m-int level;[m
[31m-struct{[m
[31m-const char*init;[m
[31m-ptrdiff_t len;[m
[31m-}capture[32];[m
[31m-}MatchState;[m
[31m-static int check_capture(MatchState*ms,int l){[m
[31m-l-='1';[m
[31m-if(l<0||l>=ms->level||ms->capture[l].len==(-1))[m
[31m-return luaL_error(ms->L,"invalid capture index");[m
[31m-return l;[m
[31m-}[m
[31m-static int capture_to_close(MatchState*ms){[m
[31m-int level=ms->level;[m
[31m-for(level--;level>=0;level--)[m
[31m-if(ms->capture[level].len==(-1))return level;[m
[31m-return luaL_error(ms->L,"invalid pattern capture");[m
[31m-}[m
[31m-static const char*classend(MatchState*ms,const char*p){[m
[31m-switch(*p++){[m
[31m-case'%':{[m
[31m-if(*p=='\0')[m
[31m-luaL_error(ms->L,"malformed pattern (ends with "LUA_QL("%%")")");[m
[31m-return p+1;[m
[31m-}[m
[31m-case'[':{[m
[31m-if(*p=='^')p++;[m
[31m-do{[m
[31m-if(*p=='\0')[m
[31m-luaL_error(ms->L,"malformed pattern (missing "LUA_QL("]")")");[m
[31m-if(*(p++)=='%'&&*p!='\0')[m
[31m-p++;[m
[31m-}while(*p!=']');[m
[31m-return p+1;[m
[31m-}[m
[31m-default:{[m
[31m-return p;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static int match_class(int c,int cl){[m
[31m-int res;[m
[31m-switch(tolower(cl)){[m
[31m-case'a':res=isalpha(c);break;[m
[31m-case'c':res=iscntrl(c);break;[m
[31m-case'd':res=isdigit(c);break;[m
[31m-case'l':res=islower(c);break;[m
[31m-case'p':res=ispunct(c);break;[m
[31m-case's':res=isspace(c);break;[m
[31m-case'u':res=isupper(c);break;[m
[31m-case'w':res=isalnum(c);break;[m
[31m-case'x':res=isxdigit(c);break;[m
[31m-case'z':res=(c==0);break;[m
[31m-default:return(cl==c);[m
[31m-}[m
[31m-return(islower(cl)?res:!res);[m
[31m-}[m
[31m-static int matchbracketclass(int c,const char*p,const char*ec){[m
[31m-int sig=1;[m
[31m-if(*(p+1)=='^'){[m
[31m-sig=0;[m
[31m-p++;[m
[31m-}[m
[31m-while(++p<ec){[m
[31m-if(*p=='%'){[m
[31m-p++;[m
[31m-if(match_class(c,uchar(*p)))[m
[31m-return sig;[m
[31m-}[m
[31m-else if((*(p+1)=='-')&&(p+2<ec)){[m
[31m-p+=2;[m
[31m-if(uchar(*(p-2))<=c&&c<=uchar(*p))[m
[31m-return sig;[m
[31m-}[m
[31m-else if(uchar(*p)==c)return sig;[m
[31m-}[m
[31m-return!sig;[m
[31m-}[m
[31m-static int singlematch(int c,const char*p,const char*ep){[m
[31m-switch(*p){[m
[31m-case'.':return 1;[m
[31m-case'%':return match_class(c,uchar(*(p+1)));[m
[31m-case'[':return matchbracketclass(c,p,ep-1);[m
[31m-default:return(uchar(*p)==c);[m
[31m-}[m
[31m-}[m
[31m-static const char*match(MatchState*ms,const char*s,const char*p);[m
[31m-static const char*matchbalance(MatchState*ms,const char*s,[m
[31m-const char*p){[m
[31m-if(*p==0||*(p+1)==0)[m
[31m-luaL_error(ms->L,"unbalanced pattern");[m
[31m-if(*s!=*p)return NULL;[m
[31m-else{[m
[31m-int b=*p;[m
[31m-int e=*(p+1);[m
[31m-int cont=1;[m
[31m-while(++s<ms->src_end){[m
[31m-if(*s==e){[m
[31m-if(--cont==0)return s+1;[m
[31m-}[m
[31m-else if(*s==b)cont++;[m
[31m-}[m
[31m-}[m
[31m-return NULL;[m
[31m-}[m
[31m-static const char*max_expand(MatchState*ms,const char*s,[m
[31m-const char*p,const char*ep){[m
[31m-ptrdiff_t i=0;[m
[31m-while((s+i)<ms->src_end&&singlematch(uchar(*(s+i)),p,ep))[m
[31m-i++;[m
[31m-while(i>=0){[m
[31m-const char*res=match(ms,(s+i),ep+1);[m
[31m-if(res)return res;[m
[31m-i--;[m
[31m-}[m
[31m-return NULL;[m
[31m-}[m
[31m-static const char*min_expand(MatchState*ms,const char*s,[m
[31m-const char*p,const char*ep){[m
[31m-for(;;){[m
[31m-const char*res=match(ms,s,ep+1);[m
[31m-if(res!=NULL)[m
[31m-return res;[m
[31m-else if(s<ms->src_end&&singlematch(uchar(*s),p,ep))[m
[31m-s++;[m
[31m-else return NULL;[m
[31m-}[m
[31m-}[m
[31m-static const char*start_capture(MatchState*ms,const char*s,[m
[31m-const char*p,int what){[m
[31m-const char*res;[m
[31m-int level=ms->level;[m
[31m-if(level>=32)luaL_error(ms->L,"too many captures");[m
[31m-ms->capture[level].init=s;[m
[31m-ms->capture[level].len=what;[m
[31m-ms->level=level+1;[m
[31m-if((res=match(ms,s,p))==NULL)[m
[31m-ms->level--;[m
[31m-return res;[m
[31m-}[m
[31m-static const char*end_capture(MatchState*ms,const char*s,[m
[31m-const char*p){[m
[31m-int l=capture_to_close(ms);[m
[31m-const char*res;[m
[31m-ms->capture[l].len=s-ms->capture[l].init;[m
[31m-if((res=match(ms,s,p))==NULL)[m
[31m-ms->capture[l].len=(-1);[m
[31m-return res;[m
[31m-}[m
[31m-static const char*match_capture(MatchState*ms,const char*s,int l){[m
[31m-size_t len;[m
[31m-l=check_capture(ms,l);[m
[31m-len=ms->capture[l].len;[m
[31m-if((size_t)(ms->src_end-s)>=len&&[m
[31m-memcmp(ms->capture[l].init,s,len)==0)[m
[31m-return s+len;[m
[31m-else return NULL;[m
[31m-}[m
[31m-static const char*match(MatchState*ms,const char*s,const char*p){[m
[31m-init:[m
[31m-switch(*p){[m
[31m-case'(':{[m
[31m-if(*(p+1)==')')[m
[31m-return start_capture(ms,s,p+2,(-2));[m
[31m-else[m
[31m-return start_capture(ms,s,p+1,(-1));[m
[31m-}[m
[31m-case')':{[m
[31m-return end_capture(ms,s,p+1);[m
[31m-}[m
[31m-case'%':{[m
[31m-switch(*(p+1)){[m
[31m-case'b':{[m
[31m-s=matchbalance(ms,s,p+2);[m
[31m-if(s==NULL)return NULL;[m
[31m-p+=4;goto init;[m
[31m-}[m
[31m-case'f':{[m
[31m-const char*ep;char previous;[m
[31m-p+=2;[m
[31m-if(*p!='[')[m
[31m-luaL_error(ms->L,"missing "LUA_QL("[")" after "[m
[31m-LUA_QL("%%f")" in pattern");[m
[31m-ep=classend(ms,p);[m
[31m-previous=(s==ms->src_init)?'\0':*(s-1);[m
[31m-if(matchbracketclass(uchar(previous),p,ep-1)||[m
[31m-!matchbracketclass(uchar(*s),p,ep-1))return NULL;[m
[31m-p=ep;goto init;[m
[31m-}[m
[31m-default:{[m
[31m-if(isdigit(uchar(*(p+1)))){[m
[31m-s=match_capture(ms,s,uchar(*(p+1)));[m
[31m-if(s==NULL)return NULL;[m
[31m-p+=2;goto init;[m
[31m-}[m
[31m-goto dflt;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-case'\0':{[m
[31m-return s;[m
[31m-}[m
[31m-case'$':{[m
[31m-if(*(p+1)=='\0')[m
[31m-return(s==ms->src_end)?s:NULL;[m
[31m-else goto dflt;[m
[31m-}[m
[31m-default:dflt:{[m
[31m-const char*ep=classend(ms,p);[m
[31m-int m=s<ms->src_end&&singlematch(uchar(*s),p,ep);[m
[31m-switch(*ep){[m
[31m-case'?':{[m
[31m-const char*res;[m
[31m-if(m&&((res=match(ms,s+1,ep+1))!=NULL))[m
[31m-return res;[m
[31m-p=ep+1;goto init;[m
[31m-}[m
[31m-case'*':{[m
[31m-return max_expand(ms,s,p,ep);[m
[31m-}[m
[31m-case'+':{[m
[31m-return(m?max_expand(ms,s+1,p,ep):NULL);[m
[31m-}[m
[31m-case'-':{[m
[31m-return min_expand(ms,s,p,ep);[m
[31m-}[m
[31m-default:{[m
[31m-if(!m)return NULL;[m
[31m-s++;p=ep;goto init;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static const char*lmemfind(const char*s1,size_t l1,[m
[31m-const char*s2,size_t l2){[m
[31m-if(l2==0)return s1;[m
[31m-else if(l2>l1)return NULL;[m
[31m-else{[m
[31m-const char*init;[m
[31m-l2--;[m
[31m-l1=l1-l2;[m
[31m-while(l1>0&&(init=(const char*)memchr(s1,*s2,l1))!=NULL){[m
[31m-init++;[m
[31m-if(memcmp(init,s2+1,l2)==0)[m
[31m-return init-1;[m
[31m-else{[m
[31m-l1-=init-s1;[m
[31m-s1=init;[m
[31m-}[m
[31m-}[m
[31m-return NULL;[m
[31m-}[m
[31m-}[m
[31m-static void push_onecapture(MatchState*ms,int i,const char*s,[m
[31m-const char*e){[m
[31m-if(i>=ms->level){[m
[31m-if(i==0)[m
[31m-lua_pushlstring(ms->L,s,e-s);[m
[31m-else[m
[31m-luaL_error(ms->L,"invalid capture index");[m
[31m-}[m
[31m-else{[m
[31m-ptrdiff_t l=ms->capture[i].len;[m
[31m-if(l==(-1))luaL_error(ms->L,"unfinished capture");[m
[31m-if(l==(-2))[m
[31m-lua_pushinteger(ms->L,ms->capture[i].init-ms->src_init+1);[m
[31m-else[m
[31m-lua_pushlstring(ms->L,ms->capture[i].init,l);[m
[31m-}[m
[31m-}[m
[31m-static int push_captures(MatchState*ms,const char*s,const char*e){[m
[31m-int i;[m
[31m-int nlevels=(ms->level==0&&s)?1:ms->level;[m
[31m-luaL_checkstack(ms->L,nlevels,"too many captures");[m
[31m-for(i=0;i<nlevels;i++)[m
[31m-push_onecapture(ms,i,s,e);[m
[31m-return nlevels;[m
[31m-}[m
[31m-static int str_find_aux(lua_State*L,int find){[m
[31m-size_t l1,l2;[m
[31m-const char*s=luaL_checklstring(L,1,&l1);[m
[31m-const char*p=luaL_checklstring(L,2,&l2);[m
[31m-ptrdiff_t init=posrelat(luaL_optinteger(L,3,1),l1)-1;[m
[31m-if(init<0)init=0;[m
[31m-else if((size_t)(init)>l1)init=(ptrdiff_t)l1;[m
[31m-if(find&&(lua_toboolean(L,4)||[m
[31m-strpbrk(p,"^$*+?.([%-")==NULL)){[m
[31m-const char*s2=lmemfind(s+init,l1-init,p,l2);[m
[31m-if(s2){[m
[31m-lua_pushinteger(L,s2-s+1);[m
[31m-lua_pushinteger(L,s2-s+l2);[m
[31m-return 2;[m
[31m-}[m
[31m-}[m
[31m-else{[m
[31m-MatchState ms;[m
[31m-int anchor=(*p=='^')?(p++,1):0;[m
[31m-const char*s1=s+init;[m
[31m-ms.L=L;[m
[31m-ms.src_init=s;[m
[31m-ms.src_end=s+l1;[m
[31m-do{[m
[31m-const char*res;[m
[31m-ms.level=0;[m
[31m-if((res=match(&ms,s1,p))!=NULL){[m
[31m-if(find){[m
[31m-lua_pushinteger(L,s1-s+1);[m
[31m-lua_pushinteger(L,res-s);[m
[31m-return push_captures(&ms,NULL,0)+2;[m
[31m-}[m
[31m-else[m
[31m-return push_captures(&ms,s1,res);[m
[31m-}[m
[31m-}while(s1++<ms.src_end&&!anchor);[m
[31m-}[m
[31m-lua_pushnil(L);[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_find(lua_State*L){[m
[31m-return str_find_aux(L,1);[m
[31m-}[m
[31m-static int str_match(lua_State*L){[m
[31m-return str_find_aux(L,0);[m
[31m-}[m
[31m-static int gmatch_aux(lua_State*L){[m
[31m-MatchState ms;[m
[31m-size_t ls;[m
[31m-const char*s=lua_tolstring(L,lua_upvalueindex(1),&ls);[m
[31m-const char*p=lua_tostring(L,lua_upvalueindex(2));[m
[31m-const char*src;[m
[31m-ms.L=L;[m
[31m-ms.src_init=s;[m
[31m-ms.src_end=s+ls;[m
[31m-for(src=s+(size_t)lua_tointeger(L,lua_upvalueindex(3));[m
[31m-src<=ms.src_end;[m
[31m-src++){[m
[31m-const char*e;[m
[31m-ms.level=0;[m
[31m-if((e=match(&ms,src,p))!=NULL){[m
[31m-lua_Integer newstart=e-s;[m
[31m-if(e==src)newstart++;[m
[31m-lua_pushinteger(L,newstart);[m
[31m-lua_replace(L,lua_upvalueindex(3));[m
[31m-return push_captures(&ms,src,e);[m
[31m-}[m
[31m-}[m
[31m-return 0;[m
[31m-}[m
[31m-static int gmatch(lua_State*L){[m
[31m-luaL_checkstring(L,1);[m
[31m-luaL_checkstring(L,2);[m
[31m-lua_settop(L,2);[m
[31m-lua_pushinteger(L,0);[m
[31m-lua_pushcclosure(L,gmatch_aux,3);[m
[31m-return 1;[m
[31m-}[m
[31m-static void add_s(MatchState*ms,luaL_Buffer*b,const char*s,[m
[31m-const char*e){[m
[31m-size_t l,i;[m
[31m-const char*news=lua_tolstring(ms->L,3,&l);[m
[31m-for(i=0;i<l;i++){[m
[31m-if(news[i]!='%')[m
[31m-luaL_addchar(b,news[i]);[m
[31m-else{[m
[31m-i++;[m
[31m-if(!isdigit(uchar(news[i])))[m
[31m-luaL_addchar(b,news[i]);[m
[31m-else if(news[i]=='0')[m
[31m-luaL_addlstring(b,s,e-s);[m
[31m-else{[m
[31m-push_onecapture(ms,news[i]-'1',s,e);[m
[31m-luaL_addvalue(b);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void add_value(MatchState*ms,luaL_Buffer*b,const char*s,[m
[31m-const char*e){[m
[31m-lua_State*L=ms->L;[m
[31m-switch(lua_type(L,3)){[m
[31m-case 3:[m
[31m-case 4:{[m
[31m-add_s(ms,b,s,e);[m
[31m-return;[m
[31m-}[m
[31m-case 6:{[m
[31m-int n;[m
[31m-lua_pushvalue(L,3);[m
[31m-n=push_captures(ms,s,e);[m
[31m-lua_call(L,n,1);[m
[31m-break;[m
[31m-}[m
[31m-case 5:{[m
[31m-push_onecapture(ms,0,s,e);[m
[31m-lua_gettable(L,3);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-if(!lua_toboolean(L,-1)){[m
[31m-lua_pop(L,1);[m
[31m-lua_pushlstring(L,s,e-s);[m
[31m-}[m
[31m-else if(!lua_isstring(L,-1))[m
[31m-luaL_error(L,"invalid replacement value (a %s)",luaL_typename(L,-1));[m
[31m-luaL_addvalue(b);[m
[31m-}[m
[31m-static int str_gsub(lua_State*L){[m
[31m-size_t srcl;[m
[31m-const char*src=luaL_checklstring(L,1,&srcl);[m
[31m-const char*p=luaL_checkstring(L,2);[m
[31m-int tr=lua_type(L,3);[m
[31m-int max_s=luaL_optint(L,4,srcl+1);[m
[31m-int anchor=(*p=='^')?(p++,1):0;[m
[31m-int n=0;[m
[31m-MatchState ms;[m
[31m-luaL_Buffer b;[m
[31m-luaL_argcheck(L,tr==3||tr==4||[m
[31m-tr==6||tr==5,3,[m
[31m-"string/function/table expected");[m
[31m-luaL_buffinit(L,&b);[m
[31m-ms.L=L;[m
[31m-ms.src_init=src;[m
[31m-ms.src_end=src+srcl;[m
[31m-while(n<max_s){[m
[31m-const char*e;[m
[31m-ms.level=0;[m
[31m-e=match(&ms,src,p);[m
[31m-if(e){[m
[31m-n++;[m
[31m-add_value(&ms,&b,src,e);[m
[31m-}[m
[31m-if(e&&e>src)[m
[31m-src=e;[m
[31m-else if(src<ms.src_end)[m
[31m-luaL_addchar(&b,*src++);[m
[31m-else break;[m
[31m-if(anchor)break;[m
[31m-}[m
[31m-luaL_addlstring(&b,src,ms.src_end-src);[m
[31m-luaL_pushresult(&b);[m
[31m-lua_pushinteger(L,n);[m
[31m-return 2;[m
[31m-}[m
[31m-static void addquoted(lua_State*L,luaL_Buffer*b,int arg){[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,arg,&l);[m
[31m-luaL_addchar(b,'"');[m
[31m-while(l--){[m
[31m-switch(*s){[m
[31m-case'"':case'\\':case'\n':{[m
[31m-luaL_addchar(b,'\\');[m
[31m-luaL_addchar(b,*s);[m
[31m-break;[m
[31m-}[m
[31m-case'\r':{[m
[31m-luaL_addlstring(b,"\\r",2);[m
[31m-break;[m
[31m-}[m
[31m-case'\0':{[m
[31m-luaL_addlstring(b,"\\000",4);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-luaL_addchar(b,*s);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-s++;[m
[31m-}[m
[31m-luaL_addchar(b,'"');[m
[31m-}[m
[31m-static const char*scanformat(lua_State*L,const char*strfrmt,char*form){[m
[31m-const char*p=strfrmt;[m
[31m-while(*p!='\0'&&strchr("-+ #0",*p)!=NULL)p++;[m
[31m-if((size_t)(p-strfrmt)>=sizeof("-+ #0"))[m
[31m-luaL_error(L,"invalid format (repeated flags)");[m
[31m-if(isdigit(uchar(*p)))p++;[m
[31m-if(isdigit(uchar(*p)))p++;[m
[31m-if(*p=='.'){[m
[31m-p++;[m
[31m-if(isdigit(uchar(*p)))p++;[m
[31m-if(isdigit(uchar(*p)))p++;[m
[31m-}[m
[31m-if(isdigit(uchar(*p)))[m
[31m-luaL_error(L,"invalid format (width or precision too long)");[m
[31m-*(form++)='%';[m
[31m-strncpy(form,strfrmt,p-strfrmt+1);[m
[31m-form+=p-strfrmt+1;[m
[31m-*form='\0';[m
[31m-return p;[m
[31m-}[m
[31m-static void addintlen(char*form){[m
[31m-size_t l=strlen(form);[m
[31m-char spec=form[l-1];[m
[31m-strcpy(form+l-1,"l");[m
[31m-form[l+sizeof("l")-2]=spec;[m
[31m-form[l+sizeof("l")-1]='\0';[m
[31m-}[m
[31m-static int str_format(lua_State*L){[m
[31m-int top=lua_gettop(L);[m
[31m-int arg=1;[m
[31m-size_t sfl;[m
[31m-const char*strfrmt=luaL_checklstring(L,arg,&sfl);[m
[31m-const char*strfrmt_end=strfrmt+sfl;[m
[31m-luaL_Buffer b;[m
[31m-luaL_buffinit(L,&b);[m
[31m-while(strfrmt<strfrmt_end){[m
[31m-if(*strfrmt!='%')[m
[31m-luaL_addchar(&b,*strfrmt++);[m
[31m-else if(*++strfrmt=='%')[m
[31m-luaL_addchar(&b,*strfrmt++);[m
[31m-else{[m
[31m-char form[(sizeof("-+ #0")+sizeof("l")+10)];[m
[31m-char buff[512];[m
[31m-if(++arg>top)[m
[31m-luaL_argerror(L,arg,"no value");[m
[31m-strfrmt=scanformat(L,strfrmt,form);[m
[31m-switch(*strfrmt++){[m
[31m-case'c':{[m
[31m-sprintf(buff,form,(int)luaL_checknumber(L,arg));[m
[31m-break;[m
[31m-}[m
[31m-case'd':case'i':{[m
[31m-addintlen(form);[m
[31m-sprintf(buff,form,(long)luaL_checknumber(L,arg));[m
[31m-break;[m
[31m-}[m
[31m-case'o':case'u':case'x':case'X':{[m
[31m-addintlen(form);[m
[31m-sprintf(buff,form,(unsigned long)luaL_checknumber(L,arg));[m
[31m-break;[m
[31m-}[m
[31m-case'e':case'E':case'f':[m
[31m-case'g':case'G':{[m
[31m-sprintf(buff,form,(double)luaL_checknumber(L,arg));[m
[31m-break;[m
[31m-}[m
[31m-case'q':{[m
[31m-addquoted(L,&b,arg);[m
[31m-continue;[m
[31m-}[m
[31m-case's':{[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,arg,&l);[m
[31m-if(!strchr(form,'.')&&l>=100){[m
[31m-lua_pushvalue(L,arg);[m
[31m-luaL_addvalue(&b);[m
[31m-continue;[m
[31m-}[m
[31m-else{[m
[31m-sprintf(buff,form,s);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-default:{[m
[31m-return luaL_error(L,"invalid option "LUA_QL("%%%c")" to "[m
[31m-LUA_QL("format"),*(strfrmt-1));[m
[31m-}[m
[31m-}[m
[31m-luaL_addlstring(&b,buff,strlen(buff));[m
[31m-}[m
[31m-}[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static const luaL_Reg strlib[]={[m
[31m-{"byte",str_byte},[m
[31m-{"char",str_char},[m
[31m-{"find",str_find},[m
[31m-{"format",str_format},[m
[31m-{"gmatch",gmatch},[m
[31m-{"gsub",str_gsub},[m
[31m-{"lower",str_lower},[m
[31m-{"match",str_match},[m
[31m-{"rep",str_rep},[m
[31m-{"sub",str_sub},[m
[31m-{"upper",str_upper},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static void createmetatable(lua_State*L){[m
[31m-lua_createtable(L,0,1);[m
[31m-lua_pushliteral(L,"");[m
[31m-lua_pushvalue(L,-2);[m
[31m-lua_setmetatable(L,-2);[m
[31m-lua_pop(L,1);[m
[31m-lua_pushvalue(L,-2);[m
[31m-lua_setfield(L,-2,"__index");[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-static int luaopen_string(lua_State*L){[m
[31m-luaL_register(L,"string",strlib);[m
[31m-createmetatable(L);[m
[31m-return 1;[m
[31m-}[m
[31m-static const luaL_Reg lualibs[]={[m
[31m-{"",luaopen_base},[m
[31m-{"table",luaopen_table},[m
[31m-{"io",luaopen_io},[m
[31m-{"os",luaopen_os},[m
[31m-{"string",luaopen_string},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static void luaL_openlibs(lua_State*L){[m
[31m-const luaL_Reg*lib=lualibs;[m
[31m-for(;lib->func;lib++){[m
[31m-lua_pushcfunction(L,lib->func);[m
[31m-lua_pushstring(L,lib->name);[m
[31m-lua_call(L,1,0);[m
[31m-}[m
[31m-}[m
[31m-typedef unsigned int UB;[m
[31m-static UB barg(lua_State*L,int idx){[m
[31m-union{lua_Number n;U64 b;}bn;[m
[31m-bn.n=lua_tonumber(L,idx)+6755399441055744.0;[m
[31m-if(bn.n==0.0&&!lua_isnumber(L,idx))luaL_typerror(L,idx,"number");[m
[31m-return(UB)bn.b;[m
[31m-}[m
[31m-#define BRET(b)lua_pushnumber(L,(lua_Number)(int)(b));return 1;[m
[31m-static int tobit(lua_State*L){[m
[31m-BRET(barg(L,1))}[m
[31m-static int bnot(lua_State*L){[m
[31m-BRET(~barg(L,1))}[m
[31m-static int band(lua_State*L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b&=barg(L,i);BRET(b)}[m
[31m-static int bor(lua_State*L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b|=barg(L,i);BRET(b)}[m
[31m-static int bxor(lua_State*L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b^=barg(L,i);BRET(b)}[m
[31m-static int lshift(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET(b<<n)}[m
[31m-static int rshift(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET(b>>n)}[m
[31m-static int arshift(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((int)b>>n)}[m
[31m-static int rol(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((b<<n)|(b>>(32-n)))}[m
[31m-static int ror(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((b>>n)|(b<<(32-n)))}[m
[31m-static int bswap(lua_State*L){[m
[31m-UB b=barg(L,1);b=(b>>24)|((b>>8)&0xff00)|((b&0xff00)<<8)|(b<<24);BRET(b)}[m
[31m-static int tohex(lua_State*L){[m
[31m-UB b=barg(L,1);[m
[31m-int n=lua_isnone(L,2)?8:(int)barg(L,2);[m
[31m-const char*hexdigits="0123456789abcdef";[m
[31m-char buf[8];[m
[31m-int i;[m
[31m-if(n<0){n=-n;hexdigits="0123456789ABCDEF";}[m
[31m-if(n>8)n=8;[m
[31m-for(i=(int)n;--i>=0;){buf[i]=hexdigits[b&15];b>>=4;}[m
[31m-lua_pushlstring(L,buf,(size_t)n);[m
[31m-return 1;[m
[31m-}[m
[31m-static const struct luaL_Reg bitlib[]={[m
[31m-{"tobit",tobit},[m
[31m-{"bnot",bnot},[m
[31m-{"band",band},[m
[31m-{"bor",bor},[m
[31m-{"bxor",bxor},[m
[31m-{"lshift",lshift},[m
[31m-{"rshift",rshift},[m
[31m-{"arshift",arshift},[m
[31m-{"rol",rol},[m
[31m-{"ror",ror},[m
[31m-{"bswap",bswap},[m
[31m-{"tohex",tohex},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-int main(int argc,char**argv){[m
[31m-lua_State*L=luaL_newstate();[m
[31m-int i;[m
[31m-luaL_openlibs(L);[m
[31m-luaL_register(L,"bit",bitlib);[m
[31m-if(argc<2)return sizeof(void*);[m
[31m-lua_createtable(L,0,1);[m
[31m-lua_pushstring(L,argv[1]);[m
[31m-lua_rawseti(L,-2,0);[m
[31m-lua_setglobal(L,"arg");[m
[31m-if(luaL_loadfile(L,argv[1]))[m
[31m-goto err;[m
[31m-for(i=2;i<argc;i++)[m
[31m-lua_pushstring(L,argv[i]);[m
[31m-if(lua_pcall(L,argc-2,0,0)){[m
[31m-err:[m
[31m-fprintf(stderr,"Error: %s\n",lua_tostring(L,-1));[m
[31m-return 1;[m
[31m-}[m
[31m-lua_close(L);[m
[31m-return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 500e285..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-vmdef.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/bc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/bc.lua[m
[1mdeleted file mode 100644[m
[1mindex a8cb849..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/bc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT bytecode listing module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module lists the bytecode of a Lua function. If it's loaded by -jbc[m
[31m--- it hooks into the parser and lists all functions of a chunk as they[m
[31m--- are parsed.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jbc -e 'local x=0; for i=1,1e6 do x=x+i end; print(x)'[m
[31m---   luajit -jbc=- foo.lua[m
[31m---   luajit -jbc=foo.list foo.lua[m
[31m---[m
[31m--- Default output is to stderr. To redirect the output to a file, pass a[m
[31m--- filename as an argument (use '-' for stdout) or set the environment[m
[31m--- variable LUAJIT_LISTFILE. The file is overwritten every time the module[m
[31m--- is started.[m
[31m---[m
[31m--- This module can also be used programmatically:[m
[31m---[m
[31m---   local bc = require("jit.bc")[m
[31m---[m
[31m---   local function foo() print("hello") end[m
[31m---[m
[31m---   bc.dump(foo)           --> -- BYTECODE -- [...][m
[31m---   print(bc.line(foo, 2)) --> 0002    KSTR     1   1      ; "hello"[m
[31m---[m
[31m---   local out = {[m
[31m---     -- Do something with each line:[m
[31m---     write = function(t, ...) io.write(...) end,[m
[31m---     close = function(t) end,[m
[31m---     flush = function(t) end,[m
[31m---   }[m
[31m---   bc.dump(foo, out)[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local bit = require("bit")[m
[31m-local sub, gsub, format = string.sub, string.gsub, string.format[m
[31m-local byte, band, shr = string.byte, bit.band, bit.rshift[m
[31m-local funcinfo, funcbc, funck = jutil.funcinfo, jutil.funcbc, jutil.funck[m
[31m-local funcuvname = jutil.funcuvname[m
[31m-local bcnames = vmdef.bcnames[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function ctlsub(c)[m
[31m-  if c == "\n" then return "\\n"[m
[31m-  elseif c == "\r" then return "\\r"[m
[31m-  elseif c == "\t" then return "\\t"[m
[31m-  else return format("\\%03d", byte(c))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Return one bytecode line.[m
[31m-local function bcline(func, pc, prefix)[m
[31m-  local ins, m = funcbc(func, pc)[m
[31m-  if not ins then return end[m
[31m-  local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128)[m
[31m-  local a = band(shr(ins, 8), 0xff)[m
[31m-  local oidx = 6*band(ins, 0xff)[m
[31m-  local op = sub(bcnames, oidx+1, oidx+6)[m
[31m-  local s = format("%04d %s %-6s %3s ",[m
[31m-    pc, prefix or "  ", op, ma == 0 and "" or a)[m
[31m-  local d = shr(ins, 16)[m
[31m-  if mc == 13*128 then -- BCMjump[m
[31m-    return format("%s=> %04d\n", s, pc+d-0x7fff)[m
[31m-  end[m
[31m-  if mb ~= 0 then[m
[31m-    d = band(d, 0xff)[m
[31m-  elseif mc == 0 then[m
[31m-    return s.."\n"[m
[31m-  end[m
[31m-  local kc[m
[31m-  if mc == 10*128 then -- BCMstr[m
[31m-    kc = funck(func, -d-1)[m
[31m-    kc = format(#kc > 40 and '"%.40s"~' or '"%s"', gsub(kc, "%c", ctlsub))[m
[31m-  elseif mc == 9*128 then -- BCMnum[m
[31m-    kc = funck(func, d)[m
[31m-    if op == "TSETM " then kc = kc - 2^52 end[m
[31m-  elseif mc == 12*128 then -- BCMfunc[m
[31m-    local fi = funcinfo(funck(func, -d-1))[m
[31m-    if fi.ffid then[m
[31m-      kc = vmdef.ffnames[fi.ffid][m
[31m-    else[m
[31m-      kc = fi.loc[m
[31m-    end[m
[31m-  elseif mc == 5*128 then -- BCMuv[m
[31m-    kc = funcuvname(func, d)[m
[31m-  end[m
[31m-  if ma == 5 then -- BCMuv[m
[31m-    local ka = funcuvname(func, a)[m
[31m-    if kc then kc = ka.." ; "..kc else kc = ka end[m
[31m-  end[m
[31m-  if mb ~= 0 then[m
[31m-    local b = shr(ins, 24)[m
[31m-    if kc then return format("%s%3d %3d  ; %s\n", s, b, d, kc) end[m
[31m-    return format("%s%3d %3d\n", s, b, d)[m
[31m-  end[m
[31m-  if kc then return format("%s%3d      ; %s\n", s, d, kc) end[m
[31m-  if mc == 7*128 and d > 32767 then d = d - 65536 end -- BCMlits[m
[31m-  return format("%s%3d\n", s, d)[m
[31m-end[m
[31m-[m
[31m--- Collect branch targets of a function.[m
[31m-local function bctargets(func)[m
[31m-  local target = {}[m
[31m-  for pc=1,1000000000 do[m
[31m-    local ins, m = funcbc(func, pc)[m
[31m-    if not ins then break end[m
[31m-    if band(m, 15*128) == 13*128 then target[pc+shr(ins, 16)-0x7fff] = true end[m
[31m-  end[m
[31m-  return target[m
[31m-end[m
[31m-[m
[31m--- Dump bytecode instructions of a function.[m
[31m-local function bcdump(func, out, all)[m
[31m-  if not out then out = stdout end[m
[31m-  local fi = funcinfo(func)[m
[31m-  if all and fi.children then[m
[31m-    for n=-1,-1000000000,-1 do[m
[31m-      local k = funck(func, n)[m
[31m-      if not k then break end[m
[31m-      if type(k) == "proto" then bcdump(k, out, true) end[m
[31m-    end[m
[31m-  end[m
[31m-  out:write(format("-- BYTECODE -- %s-%d\n", fi.loc, fi.lastlinedefined))[m
[31m-  local target = bctargets(func)[m
[31m-  for pc=1,1000000000 do[m
[31m-    local s = bcline(func, pc, target[pc] and "=>")[m
[31m-    if not s then break end[m
[31m-    out:write(s)[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-  out:flush()[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Active flag and output file handle.[m
[31m-local active, out[m
[31m-[m
[31m--- List handler.[m
[31m-local function h_list(func)[m
[31m-  return bcdump(func, out)[m
[31m-end[m
[31m-[m
[31m--- Detach list handler.[m
[31m-local function bclistoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(h_list)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach list handler.[m
[31m-local function bcliston(outfile)[m
[31m-  if active then bclistoff() end[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_LISTFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stderr[m
[31m-  end[m
[31m-  jit.attach(h_list, "bc")[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  line = bcline,[m
[31m-  dump = bcdump,[m
[31m-  targets = bctargets,[m
[31m-  on = bcliston,[m
[31m-  off = bclistoff,[m
[31m-  start = bcliston -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/bcsave.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/bcsave.lua[m
[1mdeleted file mode 100644[m
[1mindex d0968b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/bcsave.lua[m
[1m+++ /dev/null[m
[36m@@ -1,661 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT module to save/list bytecode.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module saves or lists the bytecode for an input file.[m
[31m--- It's run by the -b command line option.[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local bit = require("bit")[m
[31m-[m
[31m--- Symbol name prefix for LuaJIT bytecode.[m
[31m-local LJBC_PREFIX = "luaJIT_BC_"[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function usage()[m
[31m-  io.stderr:write[[[m
[31m-Save LuaJIT bytecode: luajit -b[options] input output[m
[31m-  -l        Only list bytecode.[m
[31m-  -s        Strip debug info (default).[m
[31m-  -g        Keep debug info.[m
[31m-  -n name   Set module name (default: auto-detect from input name).[m
[31m-  -t type   Set output file type (default: auto-detect from output name).[m
[31m-  -a arch   Override architecture for object files (default: native).[m
[31m-  -o os     Override OS for object files (default: native).[m
[31m-  -e chunk  Use chunk string as input.[m
[31m-  --        Stop handling options.[m
[31m-  -         Use stdin as input and/or stdout as output.[m
[31m-[m
[31m-File types: c h obj o raw (default)[m
[31m-]][m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function check(ok, ...)[m
[31m-  if ok then return ok, ... end[m
[31m-  io.stderr:write("luajit: ", ...)[m
[31m-  io.stderr:write("\n")[m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function readfile(input)[m
[31m-  if type(input) == "function" then return input end[m
[31m-  if input == "-" then input = nil end[m
[31m-  return check(loadfile(input))[m
[31m-end[m
[31m-[m
[31m-local function savefile(name, mode)[m
[31m-  if name == "-" then return io.stdout end[m
[31m-  return check(io.open(name, mode))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_type = {[m
[31m-  raw = "raw", c = "c", h = "h", o = "obj", obj = "obj",[m
[31m-}[m
[31m-[m
[31m-local map_arch = {[m
[31m-  x86 = true, x64 = true, arm = true, arm64 = true, ppc = true,[m
[31m-  mips = true, mipsel = true,[m
[31m-}[m
[31m-[m
[31m-local map_os = {[m
[31m-  linux = true, windows = true, osx = true, freebsd = true, netbsd = true,[m
[31m-  openbsd = true, dragonfly = true, solaris = true,[m
[31m-}[m
[31m-[m
[31m-local function checkarg(str, map, err)[m
[31m-  str = string.lower(str)[m
[31m-  local s = check(map[str], "unknown ", err)[m
[31m-  return s == true and str or s[m
[31m-end[m
[31m-[m
[31m-local function detecttype(str)[m
[31m-  local ext = string.match(string.lower(str), "%.(%a+)$")[m
[31m-  return map_type[ext] or "raw"[m
[31m-end[m
[31m-[m
[31m-local function checkmodname(str)[m
[31m-  check(string.match(str, "^[%w_.%-]+$"), "bad module name")[m
[31m-  return string.gsub(str, "[%.%-]", "_")[m
[31m-end[m
[31m-[m
[31m-local function detectmodname(str)[m
[31m-  if type(str) == "string" then[m
[31m-    local tail = string.match(str, "[^/\\]+$")[m
[31m-    if tail then str = tail end[m
[31m-    local head = string.match(str, "^(.*)%.[^.]*$")[m
[31m-    if head then str = head end[m
[31m-    str = string.match(str, "^[%w_.%-]+")[m
[31m-  else[m
[31m-    str = nil[m
[31m-  end[m
[31m-  check(str, "cannot derive module name, use -n name")[m
[31m-  return string.gsub(str, "[%.%-]", "_")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function bcsave_tail(fp, output, s)[m
[31m-  local ok, err = fp:write(s)[m
[31m-  if ok and output ~= "-" then ok, err = fp:close() end[m
[31m-  check(ok, "cannot write ", output, ": ", err)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_raw(output, s)[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_c(ctx, output, s)[m
[31m-  local fp = savefile(output, "w")[m
[31m-  if ctx.type == "c" then[m
[31m-    fp:write(string.format([[[m
[31m-#ifdef _cplusplus[m
[31m-extern "C"[m
[31m-#endif[m
[31m-#ifdef _WIN32[m
[31m-__declspec(dllexport)[m
[31m-#endif[m
[31m-const char %s%s[] = {[m
[31m-]], LJBC_PREFIX, ctx.modname))[m
[31m-  else[m
[31m-    fp:write(string.format([[[m
[31m-#define %s%s_SIZE %d[m
[31m-static const char %s%s[] = {[m
[31m-]], LJBC_PREFIX, ctx.modname, #s, LJBC_PREFIX, ctx.modname))[m
[31m-  end[m
[31m-  local t, n, m = {}, 0, 0[m
[31m-  for i=1,#s do[m
[31m-    local b = tostring(string.byte(s, i))[m
[31m-    m = m + #b + 1[m
[31m-    if m > 78 then[m
[31m-      fp:write(table.concat(t, ",", 1, n), ",\n")[m
[31m-      n, m = 0, #b + 1[m
[31m-    end[m
[31m-    n = n + 1[m
[31m-    t[n] = b[m
[31m-  end[m
[31m-  bcsave_tail(fp, output, table.concat(t, ",", 1, n).."\n};\n")[m
[31m-end[m
[31m-[m
[31m-local function bcsave_elfobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct {[m
[31m-  uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7];[m
[31m-  uint16_t type, machine;[m
[31m-  uint32_t version;[m
[31m-  uint32_t entry, phofs, shofs;[m
[31m-  uint32_t flags;[m
[31m-  uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx;[m
[31m-} ELF32header;[m
[31m-typedef struct {[m
[31m-  uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7];[m
[31m-  uint16_t type, machine;[m
[31m-  uint32_t version;[m
[31m-  uint64_t entry, phofs, shofs;[m
[31m-  uint32_t flags;[m
[31m-  uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx;[m
[31m-} ELF64header;[m
[31m-typedef struct {[m
[31m-  uint32_t name, type, flags, addr, ofs, size, link, info, align, entsize;[m
[31m-} ELF32sectheader;[m
[31m-typedef struct {[m
[31m-  uint32_t name, type;[m
[31m-  uint64_t flags, addr, ofs, size;[m
[31m-  uint32_t link, info;[m
[31m-  uint64_t align, entsize;[m
[31m-} ELF64sectheader;[m
[31m-typedef struct {[m
[31m-  uint32_t name, value, size;[m
[31m-  uint8_t info, other;[m
[31m-  uint16_t sectidx;[m
[31m-} ELF32symbol;[m
[31m-typedef struct {[m
[31m-  uint32_t name;[m
[31m-  uint8_t info, other;[m
[31m-  uint16_t sectidx;[m
[31m-  uint64_t value, size;[m
[31m-} ELF64symbol;[m
[31m-typedef struct {[m
[31m-  ELF32header hdr;[m
[31m-  ELF32sectheader sect[6];[m
[31m-  ELF32symbol sym[2];[m
[31m-  uint8_t space[4096];[m
[31m-} ELF32obj;[m
[31m-typedef struct {[m
[31m-  ELF64header hdr;[m
[31m-  ELF64sectheader sect[6];[m
[31m-  ELF64symbol sym[2];[m
[31m-  uint8_t space[4096];[m
[31m-} ELF64obj;[m
[31m-]][m
[31m-  local symname = LJBC_PREFIX..ctx.modname[m
[31m-  local is64, isbe = false, false[m
[31m-  if ctx.arch == "x64" or ctx.arch == "arm64" then[m
[31m-    is64 = true[m
[31m-  elseif ctx.arch == "ppc" or ctx.arch == "mips" then[m
[31m-    isbe = true[m
[31m-  end[m
[31m-[m
[31m-  -- Handle different host/target endianess.[m
[31m-  local function f32(x) return x end[m
[31m-  local f16, fofs = f32, f32[m
[31m-  if ffi.abi("be") ~= isbe then[m
[31m-    f32 = bit.bswap[m
[31m-    function f16(x) return bit.rshift(bit.bswap(x), 16) end[m
[31m-    if is64 then[m
[31m-      local two32 = ffi.cast("int64_t", 2^32)[m
[31m-      function fofs(x) return bit.bswap(x)*two32 end[m
[31m-    else[m
[31m-      fofs = f32[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  -- Create ELF object and fill in header.[m
[31m-  local o = ffi.new(is64 and "ELF64obj" or "ELF32obj")[m
[31m-  local hdr = o.hdr[m
[31m-  if ctx.os == "bsd" or ctx.os == "other" then -- Determine native hdr.eosabi.[m
[31m-    local bf = assert(io.open("/bin/ls", "rb"))[m
[31m-    local bs = bf:read(9)[m
[31m-    bf:close()[m
[31m-    ffi.copy(o, bs, 9)[m
[31m-    check(hdr.emagic[0] == 127, "no support for writing native object files")[m
[31m-  else[m
[31m-    hdr.emagic = "\127ELF"[m
[31m-    hdr.eosabi = ({ freebsd=9, netbsd=2, openbsd=12, solaris=6 })[ctx.os] or 0[m
[31m-  end[m
[31m-  hdr.eclass = is64 and 2 or 1[m
[31m-  hdr.eendian = isbe and 2 or 1[m
[31m-  hdr.eversion = 1[m
[31m-  hdr.type = f16(1)[m
[31m-  hdr.machine = f16(({ x86=3, x64=62, arm=40, arm64=183, ppc=20, mips=8, mipsel=8 })[ctx.arch])[m
[31m-  if ctx.arch == "mips" or ctx.arch == "mipsel" then[m
[31m-    hdr.flags = 0x50001006[m
[31m-  end[m
[31m-  hdr.version = f32(1)[m
[31m-  hdr.shofs = fofs(ffi.offsetof(o, "sect"))[m
[31m-  hdr.ehsize = f16(ffi.sizeof(hdr))[m
[31m-  hdr.shentsize = f16(ffi.sizeof(o.sect[0]))[m
[31m-  hdr.shnum = f16(6)[m
[31m-  hdr.shstridx = f16(2)[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  local sofs, ofs = ffi.offsetof(o, "space"), 1[m
[31m-  for i,name in ipairs{[m
[31m-      ".symtab", ".shstrtab", ".strtab", ".rodata", ".note.GNU-stack",[m
[31m-    } do[m
[31m-    local sect = o.sect[i][m
[31m-    sect.align = fofs(1)[m
[31m-    sect.name = f32(ofs)[m
[31m-    ffi.copy(o.space+ofs, name)[m
[31m-    ofs = ofs + #name+1[m
[31m-  end[m
[31m-  o.sect[1].type = f32(2) -- .symtab[m
[31m-  o.sect[1].link = f32(3)[m
[31m-  o.sect[1].info = f32(1)[m
[31m-  o.sect[1].align = fofs(8)[m
[31m-  o.sect[1].ofs = fofs(ffi.offsetof(o, "sym"))[m
[31m-  o.sect[1].entsize = fofs(ffi.sizeof(o.sym[0]))[m
[31m-  o.sect[1].size = fofs(ffi.sizeof(o.sym))[m
[31m-  o.sym[1].name = f32(1)[m
[31m-  o.sym[1].sectidx = f16(4)[m
[31m-  o.sym[1].size = fofs(#s)[m
[31m-  o.sym[1].info = 17[m
[31m-  o.sect[2].type = f32(3) -- .shstrtab[m
[31m-  o.sect[2].ofs = fofs(sofs)[m
[31m-  o.sect[2].size = fofs(ofs)[m
[31m-  o.sect[3].type = f32(3) -- .strtab[m
[31m-  o.sect[3].ofs = fofs(sofs + ofs)[m
[31m-  o.sect[3].size = fofs(#symname+1)[m
[31m-  ffi.copy(o.space+ofs+1, symname)[m
[31m-  ofs = ofs + #symname + 2[m
[31m-  o.sect[4].type = f32(1) -- .rodata[m
[31m-  o.sect[4].flags = fofs(2)[m
[31m-  o.sect[4].ofs = fofs(sofs + ofs)[m
[31m-  o.sect[4].size = fofs(#s)[m
[31m-  o.sect[5].type = f32(1) -- .note.GNU-stack[m
[31m-  o.sect[5].ofs = fofs(sofs + ofs + #s)[m
[31m-[m
[31m-  -- Write ELF object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_peobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct {[m
[31m-  uint16_t arch, nsects;[m
[31m-  uint32_t time, symtabofs, nsyms;[m
[31m-  uint16_t opthdrsz, flags;[m
[31m-} PEheader;[m
[31m-typedef struct {[m
[31m-  char name[8];[m
[31m-  uint32_t vsize, vaddr, size, ofs, relocofs, lineofs;[m
[31m-  uint16_t nreloc, nline;[m
[31m-  uint32_t flags;[m
[31m-} PEsection;[m
[31m-typedef struct __attribute((packed)) {[m
[31m-  union {[m
[31m-    char name[8];[m
[31m-    uint32_t nameref[2];[m
[31m-  };[m
[31m-  uint32_t value;[m
[31m-  int16_t sect;[m
[31m-  uint16_t type;[m
[31m-  uint8_t scl, naux;[m
[31m-} PEsym;[m
[31m-typedef struct __attribute((packed)) {[m
[31m-  uint32_t size;[m
[31m-  uint16_t nreloc, nline;[m
[31m-  uint32_t cksum;[m
[31m-  uint16_t assoc;[m
[31m-  uint8_t comdatsel, unused[3];[m
[31m-} PEsymaux;[m
[31m-typedef struct {[m
[31m-  PEheader hdr;[m
[31m-  PEsection sect[2];[m
[31m-  // Must be an even number of symbol structs.[m
[31m-  PEsym sym0;[m
[31m-  PEsymaux sym0aux;[m
[31m-  PEsym sym1;[m
[31m-  PEsymaux sym1aux;[m
[31m-  PEsym sym2;[m
[31m-  PEsym sym3;[m
[31m-  uint32_t strtabsize;[m
[31m-  uint8_t space[4096];[m
[31m-} PEobj;[m
[31m-]][m
[31m-  local symname = LJBC_PREFIX..ctx.modname[m
[31m-  local is64 = false[m
[31m-  if ctx.arch == "x86" then[m
[31m-    symname = "_"..symname[m
[31m-  elseif ctx.arch == "x64" then[m
[31m-    is64 = true[m
[31m-  end[m
[31m-  local symexport = "   /EXPORT:"..symname..",DATA "[m
[31m-[m
[31m-  -- The file format is always little-endian. Swap if the host is big-endian.[m
[31m-  local function f32(x) return x end[m
[31m-  local f16 = f32[m
[31m-  if ffi.abi("be") then[m
[31m-    f32 = bit.bswap[m
[31m-    function f16(x) return bit.rshift(bit.bswap(x), 16) end[m
[31m-  end[m
[31m-[m
[31m-  -- Create PE object and fill in header.[m
[31m-  local o = ffi.new("PEobj")[m
[31m-  local hdr = o.hdr[m
[31m-  hdr.arch = f16(({ x86=0x14c, x64=0x8664, arm=0x1c0, ppc=0x1f2, mips=0x366, mipsel=0x366 })[ctx.arch])[m
[31m-  hdr.nsects = f16(2)[m
[31m-  hdr.symtabofs = f32(ffi.offsetof(o, "sym0"))[m
[31m-  hdr.nsyms = f32(6)[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  o.sect[0].name = ".drectve"[m
[31m-  o.sect[0].size = f32(#symexport)[m
[31m-  o.sect[0].flags = f32(0x00100a00)[m
[31m-  o.sym0.sect = f16(1)[m
[31m-  o.sym0.scl = 3[m
[31m-  o.sym0.name = ".drectve"[m
[31m-  o.sym0.naux = 1[m
[31m-  o.sym0aux.size = f32(#symexport)[m
[31m-  o.sect[1].name = ".rdata"[m
[31m-  o.sect[1].size = f32(#s)[m
[31m-  o.sect[1].flags = f32(0x40300040)[m
[31m-  o.sym1.sect = f16(2)[m
[31m-  o.sym1.scl = 3[m
[31m-  o.sym1.name = ".rdata"[m
[31m-  o.sym1.naux = 1[m
[31m-  o.sym1aux.size = f32(#s)[m
[31m-  o.sym2.sect = f16(2)[m
[31m-  o.sym2.scl = 2[m
[31m-  o.sym2.nameref[1] = f32(4)[m
[31m-  o.sym3.sect = f16(-1)[m
[31m-  o.sym3.scl = 2[m
[31m-  o.sym3.value = f32(1)[m
[31m-  o.sym3.name = "@feat.00" -- Mark as SafeSEH compliant.[m
[31m-  ffi.copy(o.space, symname)[m
[31m-  local ofs = #symname + 1[m
[31m-  o.strtabsize = f32(ofs + 4)[m
[31m-  o.sect[0].ofs = f32(ffi.offsetof(o, "space") + ofs)[m
[31m-  ffi.copy(o.space + ofs, symexport)[m
[31m-  ofs = ofs + #symexport[m
[31m-  o.sect[1].ofs = f32(ffi.offsetof(o, "space") + ofs)[m
[31m-[m
[31m-  -- Write PE object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_machobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags;[m
[31m-} mach_header;[m
[31m-typedef struct[m
[31m-{[m
[31m-  mach_header; uint32_t reserved;[m
[31m-} mach_header_64;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize;[m
[31m-  char segname[16];[m
[31m-  uint32_t vmaddr, vmsize, fileoff, filesize;[m
[31m-  uint32_t maxprot, initprot, nsects, flags;[m
[31m-} mach_segment_command;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize;[m
[31m-  char segname[16];[m
[31m-  uint64_t vmaddr, vmsize, fileoff, filesize;[m
[31m-  uint32_t maxprot, initprot, nsects, flags;[m
[31m-} mach_segment_command_64;[m
[31m-typedef struct {[m
[31m-  char sectname[16], segname[16];[m
[31m-  uint32_t addr, size;[m
[31m-  uint32_t offset, align, reloff, nreloc, flags;[m
[31m-  uint32_t reserved1, reserved2;[m
[31m-} mach_section;[m
[31m-typedef struct {[m
[31m-  char sectname[16], segname[16];[m
[31m-  uint64_t addr, size;[m
[31m-  uint32_t offset, align, reloff, nreloc, flags;[m
[31m-  uint32_t reserved1, reserved2, reserved3;[m
[31m-} mach_section_64;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize, symoff, nsyms, stroff, strsize;[m
[31m-} mach_symtab_command;[m
[31m-typedef struct {[m
[31m-  int32_t strx;[m
[31m-  uint8_t type, sect;[m
[31m-  int16_t desc;[m
[31m-  uint32_t value;[m
[31m-} mach_nlist;[m
[31m-typedef struct {[m
[31m-  uint32_t strx;[m
[31m-  uint8_t type, sect;[m
[31m-  uint16_t desc;[m
[31m-  uint64_t value;[m
[31m-} mach_nlist_64;[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t magic, nfat_arch;[m
[31m-} mach_fat_header;[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t cputype, cpusubtype, offset, size, align;[m
[31m-} mach_fat_arch;[m
[31m-typedef struct {[m
[31m-  struct {[m
[31m-    mach_header hdr;[m
[31m-    mach_segment_command seg;[m
[31m-    mach_section sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[1];[m
[31m-  mach_nlist sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_obj;[m
[31m-typedef struct {[m
[31m-  struct {[m
[31m-    mach_header_64 hdr;[m
[31m-    mach_segment_command_64 seg;[m
[31m-    mach_section_64 sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[1];[m
[31m-  mach_nlist_64 sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_obj_64;[m
[31m-typedef struct {[m
[31m-  mach_fat_header fat;[m
[31m-  mach_fat_arch fat_arch[2];[m
[31m-  struct {[m
[31m-    mach_header hdr;[m
[31m-    mach_segment_command seg;[m
[31m-    mach_section sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[2];[m
[31m-  mach_nlist sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_fat_obj;[m
[31m-]][m
[31m-  local symname = '_'..LJBC_PREFIX..ctx.modname[m
[31m-  local isfat, is64, align, mobj = false, false, 4, "mach_obj"[m
[31m-  if ctx.arch == "x64" then[m
[31m-    is64, align, mobj = true, 8, "mach_obj_64"[m
[31m-  elseif ctx.arch == "arm" then[m
[31m-    isfat, mobj = true, "mach_fat_obj"[m
[31m-  elseif ctx.arch == "arm64" then[m
[31m-    is64, align, isfat, mobj = true, 8, true, "mach_fat_obj"[m
[31m-  else[m
[31m-    check(ctx.arch == "x86", "unsupported architecture for OSX")[m
[31m-  end[m
[31m-  local function aligned(v, a) return bit.band(v+a-1, -a) end[m
[31m-  local be32 = bit.bswap -- Mach-O FAT is BE, supported archs are LE.[m
[31m-[m
[31m-  -- Create Mach-O object and fill in header.[m
[31m-  local o = ffi.new(mobj)[m
[31m-  local mach_size = aligned(ffi.offsetof(o, "space")+#symname+2, align)[m
[31m-  local cputype = ({ x86={7}, x64={0x01000007}, arm={7,12}, arm64={0x01000007,0x0100000c} })[ctx.arch][m
[31m-  local cpusubtype = ({ x86={3}, x64={3}, arm={3,9}, arm64={3,0} })[ctx.arch][m
[31m-  if isfat then[m
[31m-    o.fat.magic = be32(0xcafebabe)[m
[31m-    o.fat.nfat_arch = be32(#cpusubtype)[m
[31m-  end[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  for i=0,#cpusubtype-1 do[m
[31m-    local ofs = 0[m
[31m-    if isfat then[m
[31m-      local a = o.fat_arch[i][m
[31m-      a.cputype = be32(cputype[i+1])[m
[31m-      a.cpusubtype = be32(cpusubtype[i+1])[m
[31m-      -- Subsequent slices overlap each other to share data.[m
[31m-      ofs = ffi.offsetof(o, "arch") + i*ffi.sizeof(o.arch[0])[m
[31m-      a.offset = be32(ofs)[m
[31m-      a.size = be32(mach_size-ofs+#s)[m
[31m-    end[m
[31m-    local a = o.arch[i][m
[31m-    a.hdr.magic = is64 and 0xfeedfacf or 0xfeedface[m
[31m-    a.hdr.cputype = cputype[i+1][m
[31m-    a.hdr.cpusubtype = cpusubtype[i+1][m
[31m-    a.hdr.filetype = 1[m
[31m-    a.hdr.ncmds = 2[m
[31m-    a.hdr.sizeofcmds = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)+ffi.sizeof(a.sym)[m
[31m-    a.seg.cmd = is64 and 0x19 or 0x1[m
[31m-    a.seg.cmdsize = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)[m
[31m-    a.seg.vmsize = #s[m
[31m-    a.seg.fileoff = mach_size-ofs[m
[31m-    a.seg.filesize = #s[m
[31m-    a.seg.maxprot = 1[m
[31m-    a.seg.initprot = 1[m
[31m-    a.seg.nsects = 1[m
[31m-    ffi.copy(a.sec.sectname, "__data")[m
[31m-    ffi.copy(a.sec.segname, "__DATA")[m
[31m-    a.sec.size = #s[m
[31m-    a.sec.offset = mach_size-ofs[m
[31m-    a.sym.cmd = 2[m
[31m-    a.sym.cmdsize = ffi.sizeof(a.sym)[m
[31m-    a.sym.symoff = ffi.offsetof(o, "sym_entry")-ofs[m
[31m-    a.sym.nsyms = 1[m
[31m-    a.sym.stroff = ffi.offsetof(o, "sym_entry")+ffi.sizeof(o.sym_entry)-ofs[m
[31m-    a.sym.strsize = aligned(#symname+2, align)[m
[31m-  end[m
[31m-  o.sym_entry.type = 0xf[m
[31m-  o.sym_entry.sect = 1[m
[31m-  o.sym_entry.strx = 1[m
[31m-  ffi.copy(o.space+1, symname)[m
[31m-[m
[31m-  -- Write Macho-O object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, mach_size))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_obj(ctx, output, s)[m
[31m-  local ok, ffi = pcall(require, "ffi")[m
[31m-  check(ok, "FFI library required to write this file type")[m
[31m-  if ctx.os == "windows" then[m
[31m-    return bcsave_peobj(ctx, output, s, ffi)[m
[31m-  elseif ctx.os == "osx" then[m
[31m-    return bcsave_machobj(ctx, output, s, ffi)[m
[31m-  else[m
[31m-    return bcsave_elfobj(ctx, output, s, ffi)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function bclist(input, output)[m
[31m-  local f = readfile(input)[m
[31m-  require("jit.bc").dump(f, savefile(output, "w"), true)[m
[31m-end[m
[31m-[m
[31m-local function bcsave(ctx, input, output)[m
[31m-  local f = readfile(input)[m
[31m-  local s = string.dump(f, ctx.strip)[m
[31m-  local t = ctx.type[m
[31m-  if not t then[m
[31m-    t = detecttype(output)[m
[31m-    ctx.type = t[m
[31m-  end[m
[31m-  if t == "raw" then[m
[31m-    bcsave_raw(output, s)[m
[31m-  else[m
[31m-    if not ctx.modname then ctx.modname = detectmodname(input) end[m
[31m-    if t == "obj" then[m
[31m-      bcsave_obj(ctx, output, s)[m
[31m-    else[m
[31m-      bcsave_c(ctx, output, s)[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function docmd(...)[m
[31m-  local arg = {...}[m
[31m-  local n = 1[m
[31m-  local list = false[m
[31m-  local ctx = {[m
[31m-    strip = true, arch = jit.arch, os = string.lower(jit.os),[m
[31m-    type = false, modname = false,[m
[31m-  }[m
[31m-  while n <= #arg do[m
[31m-    local a = arg[n][m
[31m-    if type(a) == "string" and string.sub(a, 1, 1) == "-" and a ~= "-" then[m
[31m-      table.remove(arg, n)[m
[31m-      if a == "--" then break end[m
[31m-      for m=2,#a do[m
[31m-	local opt = string.sub(a, m, m)[m
[31m-	if opt == "l" then[m
[31m-	  list = true[m
[31m-	elseif opt == "s" then[m
[31m-	  ctx.strip = true[m
[31m-	elseif opt == "g" then[m
[31m-	  ctx.strip = false[m
[31m-	else[m
[31m-	  if arg[n] == nil or m ~= #a then usage() end[m
[31m-	  if opt == "e" then[m
[31m-	    if n ~= 1 then usage() end[m
[31m-	    arg[1] = check(loadstring(arg[1]))[m
[31m-	  elseif opt == "n" then[m
[31m-	    ctx.modname = checkmodname(table.remove(arg, n))[m
[31m-	  elseif opt == "t" then[m
[31m-	    ctx.type = checkarg(table.remove(arg, n), map_type, "file type")[m
[31m-	  elseif opt == "a" then[m
[31m-	    ctx.arch = checkarg(table.remove(arg, n), map_arch, "architecture")[m
[31m-	  elseif opt == "o" then[m
[31m-	    ctx.os = checkarg(table.remove(arg, n), map_os, "OS name")[m
[31m-	  else[m
[31m-	    usage()[m
[31m-	  end[m
[31m-	end[m
[31m-      end[m
[31m-    else[m
[31m-      n = n + 1[m
[31m-    end[m
[31m-  end[m
[31m-  if list then[m
[31m-    if #arg == 0 or #arg > 2 then usage() end[m
[31m-    bclist(arg[1], arg[2] or "-")[m
[31m-  else[m
[31m-    if #arg ~= 2 then usage() end[m
[31m-    bcsave(ctx, arg[1], arg[2])[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  start = docmd -- Process -b command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_arm.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_arm.lua[m
[1mdeleted file mode 100644[m
[1mindex 1296d81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_arm.lua[m
[1m+++ /dev/null[m
[36m@@ -1,689 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT ARM disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles most user-mode ARMv7 instructions[m
[31m--- NYI: Advanced SIMD and VFP instructions.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, ror, tohex = bit.band, bit.bor, bit.ror, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_loadc = {[m
[31m-  shift = 8, mask = 15,[m
[31m-  [10] = {[m
[31m-    shift = 20, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovFmDN", "vstmFNdr",[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vstrFdl",[m
[31m-	{ shift = 16, mask = 15, [13] = "vpushFdr", _ = "vstmdbFNdr", }[m
[31m-      },[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovFDNm",[m
[31m-      { shift = 16, mask = 15, [13] = "vpopFdr", _ = "vldmFNdr", },[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vldrFdl", "vldmdbFNdr",[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  [11] = {[m
[31m-    shift = 20, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovGmDN", "vstmGNdr",[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vstrGdl",[m
[31m-	{ shift = 16, mask = 15, [13] = "vpushGdr", _ = "vstmdbGNdr", }[m
[31m-      },[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovGDNm",[m
[31m-      { shift = 16, mask = 15, [13] = "vpopGdr", _ = "vldmGNdr", },[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vldrGdl", "vldmdbGNdr",[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 0, mask = 0 -- NYI ldc, mcrr, mrrc.[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_vfps = {[m
[31m-  shift = 6, mask = 0x2c001,[m
[31m-  [0] = "vmlaF.dnm", "vmlsF.dnm",[m
[31m-  [0x04000] = "vnmlsF.dnm", [0x04001] = "vnmlaF.dnm",[m
[31m-  [0x08000] = "vmulF.dnm", [0x08001] = "vnmulF.dnm",[m
[31m-  [0x0c000] = "vaddF.dnm", [0x0c001] = "vsubF.dnm",[m
[31m-  [0x20000] = "vdivF.dnm",[m
[31m-  [0x24000] = "vfnmsF.dnm", [0x24001] = "vfnmaF.dnm",[m
[31m-  [0x28000] = "vfmaF.dnm", [0x28001] = "vfmsF.dnm",[m
[31m-  [0x2c000] = "vmovF.dY",[m
[31m-  [0x2c001] = {[m
[31m-    shift = 7, mask = 0x1e01,[m
[31m-    [0] = "vmovF.dm", "vabsF.dm",[m
[31m-    [0x0200] = "vnegF.dm", [0x0201] = "vsqrtF.dm",[m
[31m-    [0x0800] = "vcmpF.dm", [0x0801] = "vcmpeF.dm",[m
[31m-    [0x0a00] = "vcmpzF.d", [0x0a01] = "vcmpzeF.d",[m
[31m-    [0x0e01] = "vcvtG.dF.m",[m
[31m-    [0x1000] = "vcvt.f32.u32Fdm", [0x1001] = "vcvt.f32.s32Fdm",[m
[31m-    [0x1800] = "vcvtr.u32F.dm", [0x1801] = "vcvt.u32F.dm",[m
[31m-    [0x1a00] = "vcvtr.s32F.dm", [0x1a01] = "vcvt.s32F.dm",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_vfpd = {[m
[31m-  shift = 6, mask = 0x2c001,[m
[31m-  [0] = "vmlaG.dnm", "vmlsG.dnm",[m
[31m-  [0x04000] = "vnmlsG.dnm", [0x04001] = "vnmlaG.dnm",[m
[31m-  [0x08000] = "vmulG.dnm", [0x08001] = "vnmulG.dnm",[m
[31m-  [0x0c000] = "vaddG.dnm", [0x0c001] = "vsubG.dnm",[m
[31m-  [0x20000] = "vdivG.dnm",[m
[31m-  [0x24000] = "vfnmsG.dnm", [0x24001] = "vfnmaG.dnm",[m
[31m-  [0x28000] = "vfmaG.dnm", [0x28001] = "vfmsG.dnm",[m
[31m-  [0x2c000] = "vmovG.dY",[m
[31m-  [0x2c001] = {[m
[31m-    shift = 7, mask = 0x1e01,[m
[31m-    [0] = "vmovG.dm", "vabsG.dm",[m
[31m-    [0x0200] = "vnegG.dm", [0x0201] = "vsqrtG.dm",[m
[31m-    [0x0800] = "vcmpG.dm", [0x0801] = "vcmpeG.dm",[m
[31m-    [0x0a00] = "vcmpzG.d", [0x0a01] = "vcmpzeG.d",[m
[31m-    [0x0e01] = "vcvtF.dG.m",[m
[31m-    [0x1000] = "vcvt.f64.u32GdFm", [0x1001] = "vcvt.f64.s32GdFm",[m
[31m-    [0x1800] = "vcvtr.u32FdG.m", [0x1801] = "vcvt.u32FdG.m",[m
[31m-    [0x1a00] = "vcvtr.s32FdG.m", [0x1a01] = "vcvt.s32FdG.m",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_datac = {[m
[31m-  shift = 24, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 4, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 8, mask = 15,[m
[31m-      [10] = map_vfps,[m
[31m-      [11] = map_vfpd,[m
[31m-      -- NYI cdp, mcr, mrc.[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 8, mask = 15,[m
[31m-      [10] = {[m
[31m-	shift = 20, mask = 15,[m
[31m-	[0] = "vmovFnD", "vmovFDn",[m
[31m-	[14] = "vmsrD",[m
[31m-	[15] = { shift = 12, mask = 15, [15] = "vmrs", _ = "vmrsD", },[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  "svcT",[m
[31m-}[m
[31m-[m
[31m-local map_loadcu = {[m
[31m-  shift = 0, mask = 0, -- NYI unconditional CP load/store.[m
[31m-}[m
[31m-[m
[31m-local map_datacu = {[m
[31m-  shift = 0, mask = 0, -- NYI unconditional CP data.[m
[31m-}[m
[31m-[m
[31m-local map_simddata = {[m
[31m-  shift = 0, mask = 0, -- NYI SIMD data.[m
[31m-}[m
[31m-[m
[31m-local map_simdload = {[m
[31m-  shift = 0, mask = 0, -- NYI SIMD load/store, preload.[m
[31m-}[m
[31m-[m
[31m-local map_preload = {[m
[31m-  shift = 0, mask = 0, -- NYI preload.[m
[31m-}[m
[31m-[m
[31m-local map_media = {[m
[31m-  shift = 20, mask = 31,[m
[31m-  [0] = false,[m
[31m-  { --01[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "sadd16DNM", "sasxDNM", "ssaxDNM", "ssub16DNM",[m
[31m-    "sadd8DNM", false, false, "ssub8DNM",[m
[31m-  },[m
[31m-  { --02[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "qadd16DNM", "qasxDNM", "qsaxDNM", "qsub16DNM",[m
[31m-    "qadd8DNM", false, false, "qsub8DNM",[m
[31m-  },[m
[31m-  { --03[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "shadd16DNM", "shasxDNM", "shsaxDNM", "shsub16DNM",[m
[31m-    "shadd8DNM", false, false, "shsub8DNM",[m
[31m-  },[m
[31m-  false,[m
[31m-  { --05[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uadd16DNM", "uasxDNM", "usaxDNM", "usub16DNM",[m
[31m-    "uadd8DNM", false, false, "usub8DNM",[m
[31m-  },[m
[31m-  { --06[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uqadd16DNM", "uqasxDNM", "uqsaxDNM", "uqsub16DNM",[m
[31m-    "uqadd8DNM", false, false, "uqsub8DNM",[m
[31m-  },[m
[31m-  { --07[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uhadd16DNM", "uhasxDNM", "uhsaxDNM", "uhsub16DNM",[m
[31m-    "uhadd8DNM", false, false, "uhsub8DNM",[m
[31m-  },[m
[31m-  { --08[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "pkhbtDNMU", false, "pkhtbDNMU",[m
[31m-    { shift = 16, mask = 15, [15] = "sxtb16DMU", _ = "sxtab16DNMU", },[m
[31m-    "pkhbtDNMU", "selDNM", "pkhtbDNMU",[m
[31m-  },[m
[31m-  false,[m
[31m-  { --0a[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "ssatDxMu", "ssat16DxM", "ssatDxMu",[m
[31m-    { shift = 16, mask = 15, [15] = "sxtbDMU", _ = "sxtabDNMU", },[m
[31m-    "ssatDxMu", false, "ssatDxMu",[m
[31m-  },[m
[31m-  { --0b[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "ssatDxMu", "revDM", "ssatDxMu",[m
[31m-    { shift = 16, mask = 15, [15] = "sxthDMU", _ = "sxtahDNMU", },[m
[31m-    "ssatDxMu", "rev16DM", "ssatDxMu",[m
[31m-  },[m
[31m-  { --0c[m
[31m-    shift = 5, mask = 7,[m
[31m-    [3] = { shift = 16, mask = 15, [15] = "uxtb16DMU", _ = "uxtab16DNMU", },[m
[31m-  },[m
[31m-  false,[m
[31m-  { --0e[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "usatDwMu", "usat16DwM", "usatDwMu",[m
[31m-    { shift = 16, mask = 15, [15] = "uxtbDMU", _ = "uxtabDNMU", },[m
[31m-    "usatDwMu", false, "usatDwMu",[m
[31m-  },[m
[31m-  { --0f[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "usatDwMu", "rbitDM", "usatDwMu",[m
[31m-    { shift = 16, mask = 15, [15] = "uxthDMU", _ = "uxtahDNMU", },[m
[31m-    "usatDwMu", "revshDM", "usatDwMu",[m
[31m-  },[m
[31m-  { --10[m
[31m-    shift = 12, mask = 15,[m
[31m-    [15] = {[m
[31m-      shift = 5, mask = 7,[m
[31m-      "smuadNMS", "smuadxNMS", "smusdNMS", "smusdxNMS",[m
[31m-    },[m
[31m-    _ = {[m
[31m-      shift = 5, mask = 7,[m
[31m-      [0] = "smladNMSD", "smladxNMSD", "smlsdNMSD", "smlsdxNMSD",[m
[31m-    },[m
[31m-  },[m
[31m-  false, false, false,[m
[31m-  { --14[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "smlaldDNMS", "smlaldxDNMS", "smlsldDNMS", "smlsldxDNMS",[m
[31m-  },[m
[31m-  { --15[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = { shift = 12, mask = 15, [15] = "smmulNMS", _ = "smmlaNMSD", },[m
[31m-    { shift = 12, mask = 15, [15] = "smmulrNMS", _ = "smmlarNMSD", },[m
[31m-    false, false, false, false,[m
[31m-    "smmlsNMSD", "smmlsrNMSD",[m
[31m-  },[m
[31m-  false, false,[m
[31m-  { --18[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = { shift = 12, mask = 15, [15] = "usad8NMS", _ = "usada8NMSD", },[m
[31m-  },[m
[31m-  false,[m
[31m-  { --1a[m
[31m-    shift = 5, mask = 3, [2] = "sbfxDMvw",[m
[31m-  },[m
[31m-  { --1b[m
[31m-    shift = 5, mask = 3, [2] = "sbfxDMvw",[m
[31m-  },[m
[31m-  { --1c[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 0, mask = 15, [15] = "bfcDvX", _ = "bfiDMvX", },[m
[31m-  },[m
[31m-  { --1d[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 0, mask = 15, [15] = "bfcDvX", _ = "bfiDMvX", },[m
[31m-  },[m
[31m-  { --1e[m
[31m-    shift = 5, mask = 3, [2] = "ubfxDMvw",[m
[31m-  },[m
[31m-  { --1f[m
[31m-    shift = 5, mask = 3, [2] = "ubfxDMvw",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_load = {[m
[31m-  shift = 21, mask = 9,[m
[31m-  {[m
[31m-    shift = 20, mask = 5,[m
[31m-    [0] = "strtDL", "ldrtDL", [4] = "strbtDL", [5] = "ldrbtDL",[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 20, mask = 5,[m
[31m-    [0] = "strDL", "ldrDL", [4] = "strbDL", [5] = "ldrbDL",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_load1 = {[m
[31m-  shift = 4, mask = 1,[m
[31m-  [0] = map_load, map_media,[m
[31m-}[m
[31m-[m
[31m-local map_loadm = {[m
[31m-  shift = 20, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 23, mask = 3,[m
[31m-    [0] = "stmdaNR", "stmNR",[m
[31m-    { shift = 16, mask = 63, [45] = "pushR", _ = "stmdbNR", }, "stmibNR",[m
[31m-  },[m
[31m-  {[m
[31m-    shift = 23, mask = 3,[m
[31m-    [0] = "ldmdaNR", { shift = 16, mask = 63, [61] = "popR", _ = "ldmNR", },[m
[31m-    "ldmdbNR", "ldmibNR",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_data = {[m
[31m-  shift = 21, mask = 15,[m
[31m-  [0] = "andDNPs", "eorDNPs", "subDNPs", "rsbDNPs",[m
[31m-  "addDNPs", "adcDNPs", "sbcDNPs", "rscDNPs",[m
[31m-  "tstNP", "teqNP", "cmpNP", "cmnNP",[m
[31m-  "orrDNPs", "movDPs", "bicDNPs", "mvnDPs",[m
[31m-}[m
[31m-[m
[31m-local map_mul = {[m
[31m-  shift = 21, mask = 7,[m
[31m-  [0] = "mulNMSs", "mlaNMSDs", "umaalDNMS", "mlsDNMS",[m
[31m-  "umullDNMSs", "umlalDNMSs", "smullDNMSs", "smlalDNMSs",[m
[31m-}[m
[31m-[m
[31m-local map_sync = {[m
[31m-  shift = 20, mask = 15, -- NYI: brackets around N. R(D+1) for ldrexd/strexd.[m
[31m-  [0] = "swpDMN", false, false, false,[m
[31m-  "swpbDMN", false, false, false,[m
[31m-  "strexDMN", "ldrexDN", "strexdDN", "ldrexdDN",[m
[31m-  "strexbDMN", "ldrexbDN", "strexhDN", "ldrexhDN",[m
[31m-}[m
[31m-[m
[31m-local map_mulh = {[m
[31m-  shift = 21, mask = 3,[m
[31m-  [0] = { shift = 5, mask = 3,[m
[31m-    [0] = "smlabbNMSD", "smlatbNMSD", "smlabtNMSD", "smlattNMSD", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smlawbNMSD", "smulwbNMS", "smlawtNMSD", "smulwtNMS", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smlalbbDNMS", "smlaltbDNMS", "smlalbtDNMS", "smlalttDNMS", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smulbbNMS", "smultbNMS", "smulbtNMS", "smulttNMS", },[m
[31m-}[m
[31m-[m
[31m-local map_misc = {[m
[31m-  shift = 4, mask = 7,[m
[31m-  -- NYI: decode PSR bits of msr.[m
[31m-  [0] = { shift = 21, mask = 1, [0] = "mrsD", "msrM", },[m
[31m-  { shift = 21, mask = 3, "bxM", false, "clzDM", },[m
[31m-  { shift = 21, mask = 3, "bxjM", },[m
[31m-  { shift = 21, mask = 3, "blxM", },[m
[31m-  false,[m
[31m-  { shift = 21, mask = 3, [0] = "qaddDMN", "qsubDMN", "qdaddDMN", "qdsubDMN", },[m
[31m-  false,[m
[31m-  { shift = 21, mask = 3, "bkptK", },[m
[31m-}[m
[31m-[m
[31m-local map_datar = {[m
[31m-  shift = 4, mask = 9,[m
[31m-  [9] = {[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 24, mask = 1, [0] = map_mul, map_sync, },[m
[31m-    { shift = 20, mask = 1, [0] = "strhDL", "ldrhDL", },[m
[31m-    { shift = 20, mask = 1, [0] = "ldrdDL", "ldrsbDL", },[m
[31m-    { shift = 20, mask = 1, [0] = "strdDL", "ldrshDL", },[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 20, mask = 25,[m
[31m-    [16] = { shift = 7, mask = 1, [0] = map_misc, map_mulh, },[m
[31m-    _ = {[m
[31m-      shift = 0, mask = 0xffffffff,[m
[31m-      [bor(0xe1a00000)] = "nop",[m
[31m-      _ = map_data,[m
[31m-    }[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_datai = {[m
[31m-  shift = 20, mask = 31, -- NYI: decode PSR bits of msr. Decode imm12.[m
[31m-  [16] = "movwDW", [20] = "movtDW",[m
[31m-  [18] = { shift = 0, mask = 0xf00ff, [0] = "nopv6", _ = "msrNW", },[m
[31m-  [22] = "msrNW",[m
[31m-  _ = map_data,[m
[31m-}[m
[31m-[m
[31m-local map_branch = {[m
[31m-  shift = 24, mask = 1,[m
[31m-  [0] = "bB", "blB"[m
[31m-}[m
[31m-[m
[31m-local map_condins = {[m
[31m-  [0] = map_datar, map_datai, map_load, map_load1,[m
[31m-  map_loadm, map_branch, map_loadc, map_datac[m
[31m-}[m
[31m-[m
[31m--- NYI: setend.[m
[31m-local map_uncondins = {[m
[31m-  [0] = false, map_simddata, map_simdload, map_preload,[m
[31m-  false, "blxB", map_loadcu, map_datacu,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",[m
[31m-}[m
[31m-[m
[31m-local map_cond = {[m
[31m-  [0] = "eq", "ne", "hs", "lo", "mi", "pl", "vs", "vc",[m
[31m-  "hi", "ls", "ge", "lt", "gt", "le", "al",[m
[31m-}[m
[31m-[m
[31m-local map_shift = { [0] = "lsl", "lsr", "asr", "ror", }[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then[m
[31m-      extra = "\t->"..sym[m
[31m-    elseif band(ctx.op, 0x0e000000) ~= 0x0a000000 then[m
[31m-      extra = "\t; 0x"..tohex(ctx.rel)[m
[31m-    end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-5s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-5s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m--- Format operand 2 of load/store opcodes.[m
[31m-local function fmtload(ctx, op, pos)[m
[31m-  local base = map_gpr[band(rshift(op, 16), 15)][m
[31m-  local x, ofs[m
[31m-  local ext = (band(op, 0x04000000) == 0)[m
[31m-  if not ext and band(op, 0x02000000) == 0 then[m
[31m-    ofs = band(op, 4095)[m
[31m-    if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-    if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-    ofs = "#"..ofs[m
[31m-  elseif ext and band(op, 0x00400000) ~= 0 then[m
[31m-    ofs = band(op, 15) + band(rshift(op, 4), 0xf0)[m
[31m-    if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-    if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-    ofs = "#"..ofs[m
[31m-  else[m
[31m-    ofs = map_gpr[band(op, 15)][m
[31m-    if ext or band(op, 0xfe0) == 0 then[m
[31m-    elseif band(op, 0xfe0) == 0x60 then[m
[31m-      ofs = format("%s, rrx", ofs)[m
[31m-    else[m
[31m-      local sh = band(rshift(op, 7), 31)[m
[31m-      if sh == 0 then sh = 32 end[m
[31m-      ofs = format("%s, %s #%d", ofs, map_shift[band(rshift(op, 5), 3)], sh)[m
[31m-    end[m
[31m-    if band(op, 0x00800000) == 0 then ofs = "-"..ofs end[m
[31m-  end[m
[31m-  if ofs == "#0" then[m
[31m-    x = format("[%s]", base)[m
[31m-  elseif band(op, 0x01000000) == 0 then[m
[31m-    x = format("[%s], %s", base, ofs)[m
[31m-  else[m
[31m-    x = format("[%s, %s]", base, ofs)[m
[31m-  end[m
[31m-  if band(op, 0x01200000) == 0x01200000 then x = x.."!" end[m
[31m-  return x[m
[31m-end[m
[31m-[m
[31m--- Format operand 2 of vector load/store opcodes.[m
[31m-local function fmtvload(ctx, op, pos)[m
[31m-  local base = map_gpr[band(rshift(op, 16), 15)][m
[31m-  local ofs = band(op, 255)*4[m
[31m-  if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-  if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-  if ofs == 0 then[m
[31m-    return format("[%s]", base)[m
[31m-  else[m
[31m-    return format("[%s, #%d]", base, ofs)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function fmtvr(op, vr, sh0, sh1)[m
[31m-  if vr == "s" then[m
[31m-    return format("s%d", 2*band(rshift(op, sh0), 15)+band(rshift(op, sh1), 1))[m
[31m-  else[m
[31m-    return format("d%d", band(rshift(op, sh0), 15)+band(rshift(op, sh1-4), 16))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  local op = bor(lshift(b3, 24), lshift(b2, 16), lshift(b1, 8), b0)[m
[31m-  local operands = {}[m
[31m-  local suffix = ""[m
[31m-  local last, name, pat[m
[31m-  local vr[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local cond = rshift(op, 28)[m
[31m-  local opat[m
[31m-  if cond == 15 then[m
[31m-    opat = map_uncondins[band(rshift(op, 25), 7)][m
[31m-  else[m
[31m-    if cond ~= 14 then suffix = map_cond[cond] end[m
[31m-    opat = map_condins[band(rshift(op, 25), 7)][m
[31m-  end[m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)] or opat._[m
[31m-  end[m
[31m-  name, pat = match(opat, "^([a-z0-9]*)(.*)")[m
[31m-  if sub(pat, 1, 1) == "." then[m
[31m-    local s2, p2 = match(pat, "^([a-z0-9.]*)(.*)")[m
[31m-    suffix = suffix..s2[m
[31m-    pat = p2[m
[31m-  end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "D" then[m
[31m-      x = map_gpr[band(rshift(op, 12), 15)][m
[31m-    elseif p == "N" then[m
[31m-      x = map_gpr[band(rshift(op, 16), 15)][m
[31m-    elseif p == "S" then[m
[31m-      x = map_gpr[band(rshift(op, 8), 15)][m
[31m-    elseif p == "M" then[m
[31m-      x = map_gpr[band(op, 15)][m
[31m-    elseif p == "d" then[m
[31m-      x = fmtvr(op, vr, 12, 22)[m
[31m-    elseif p == "n" then[m
[31m-      x = fmtvr(op, vr, 16, 7)[m
[31m-    elseif p == "m" then[m
[31m-      x = fmtvr(op, vr, 0, 5)[m
[31m-    elseif p == "P" then[m
[31m-      if band(op, 0x02000000) ~= 0 then[m
[31m-	x = ror(band(op, 255), 2*band(rshift(op, 8), 15))[m
[31m-      else[m
[31m-	x = map_gpr[band(op, 15)][m
[31m-	if band(op, 0xff0) ~= 0 then[m
[31m-	  operands[#operands+1] = x[m
[31m-	  local s = map_shift[band(rshift(op, 5), 3)][m
[31m-	  local r = nil[m
[31m-	  if band(op, 0xf90) == 0 then[m
[31m-	    if s == "ror" then s = "rrx" else r = "#32" end[m
[31m-	  elseif band(op, 0x10) == 0 then[m
[31m-	    r = "#"..band(rshift(op, 7), 31)[m
[31m-	  else[m
[31m-	    r = map_gpr[band(rshift(op, 8), 15)][m
[31m-	  end[m
[31m-	  if name == "mov" then name = s; x = r[m
[31m-	  elseif r then x = format("%s %s", s, r)[m
[31m-	  else x = s end[m
[31m-	end[m
[31m-      end[m
[31m-    elseif p == "L" then[m
[31m-      x = fmtload(ctx, op, pos)[m
[31m-    elseif p == "l" then[m
[31m-      x = fmtvload(ctx, op, pos)[m
[31m-    elseif p == "B" then[m
[31m-      local addr = ctx.addr + pos + 8 + arshift(lshift(op, 8), 6)[m
[31m-      if cond == 15 then addr = addr + band(rshift(op, 23), 2) end[m
[31m-      ctx.rel = addr[m
[31m-      x = "0x"..tohex(addr)[m
[31m-    elseif p == "F" then[m
[31m-      vr = "s"[m
[31m-    elseif p == "G" then[m
[31m-      vr = "d"[m
[31m-    elseif p == "." then[m
[31m-      suffix = suffix..(vr == "s" and ".f32" or ".f64")[m
[31m-    elseif p == "R" then[m
[31m-      if band(op, 0x00200000) ~= 0 and #operands == 1 then[m
[31m-	operands[1] = operands[1].."!"[m
[31m-      end[m
[31m-      local t = {}[m
[31m-      for i=0,15 do[m
[31m-	if band(rshift(op, i), 1) == 1 then t[#t+1] = map_gpr[i] end[m
[31m-      end[m
[31m-      x = "{"..concat(t, ", ").."}"[m
[31m-    elseif p == "r" then[m
[31m-      if band(op, 0x00200000) ~= 0 and #operands == 2 then[m
[31m-	operands[1] = operands[1].."!"[m
[31m-      end[m
[31m-      local s = tonumber(sub(last, 2))[m
[31m-      local n = band(op, 255)[m
[31m-      if vr == "d" then n = rshift(n, 1) end[m
[31m-      operands[#operands] = format("{%s-%s%d}", last, vr, s+n-1)[m
[31m-    elseif p == "W" then[m
[31m-      x = band(op, 0x0fff) + band(rshift(op, 4), 0xf000)[m
[31m-    elseif p == "T" then[m
[31m-      x = "#0x"..tohex(band(op, 0x00ffffff), 6)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "u" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-      if band(op, 0x40) == 0 then[m
[31m-	if x == 0 then x = nil else x = "lsl #"..x end[m
[31m-      else[m
[31m-	if x == 0 then x = "asr #32" else x = "asr #"..x end[m
[31m-      end[m
[31m-    elseif p == "v" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-    elseif p == "w" then[m
[31m-      x = band(rshift(op, 16), 31)[m
[31m-    elseif p == "x" then[m
[31m-      x = band(rshift(op, 16), 31) + 1[m
[31m-    elseif p == "X" then[m
[31m-      x = band(rshift(op, 16), 31) - last + 1[m
[31m-    elseif p == "Y" then[m
[31m-      x = band(rshift(op, 12), 0xf0) + band(op, 0x0f)[m
[31m-    elseif p == "K" then[m
[31m-      x = "#0x"..tohex(band(rshift(op, 4), 0x0000fff0) + band(op, 15), 4)[m
[31m-    elseif p == "s" then[m
[31m-      if band(op, 0x00100000) ~= 0 then suffix = "s"..suffix end[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then[m
[31m-      last = x[m
[31m-      if type(x) == "number" then x = "#"..x end[m
[31m-      operands[#operands+1] = x[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name..suffix, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  ctx.pos = ofs[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 16 then return map_gpr[r] end[m
[31m-  return "d"..(r-16)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  disass = disass,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_mips.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_mips.lua[m
[1mdeleted file mode 100644[m
[1mindex 2bf8b38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_mips.lua[m
[1m+++ /dev/null[m
[36m@@ -1,428 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT MIPS disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT/X license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles all standard MIPS32R1/R2 instructions.[m
[31m--- Default mode is big-endian, but see: dis_mipsel.lua[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, tohex = bit.band, bit.bor, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Primary and extended opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_movci = { shift = 16, mask = 1, [0] = "movfDSC", "movtDSC", }[m
[31m-local map_srl = { shift = 21, mask = 1, [0] = "srlDTA", "rotrDTA", }[m
[31m-local map_srlv = { shift = 6, mask = 1, [0] = "srlvDTS", "rotrvDTS", }[m
[31m-[m
[31m-local map_special = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = { shift = 0, mask = -1, [0] = "nop", _ = "sllDTA" },[m
[31m-  map_movci,	map_srl,	"sraDTA",[m
[31m-  "sllvDTS",	false,		map_srlv,	"sravDTS",[m
[31m-  "jrS",	"jalrD1S",	"movzDST",	"movnDST",[m
[31m-  "syscallY",	"breakY",	false,		"sync",[m
[31m-  "mfhiD",	"mthiS",	"mfloD",	"mtloS",[m
[31m-  false,	false,		false,		false,[m
[31m-  "multST",	"multuST",	"divST",	"divuST",[m
[31m-  false,	false,		false,		false,[m
[31m-  "addDST",	"addu|moveDST0", "subDST",	"subu|neguDS0T",[m
[31m-  "andDST",	"orDST",	"xorDST",	"nor|notDST0",[m
[31m-  false,	false,		"sltDST",	"sltuDST",[m
[31m-  false,	false,		false,		false,[m
[31m-  "tgeSTZ",	"tgeuSTZ",	"tltSTZ",	"tltuSTZ",[m
[31m-  "teqSTZ",	false,		"tneSTZ",[m
[31m-}[m
[31m-[m
[31m-local map_special2 = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "maddST", "madduST",	"mulDST",	false,[m
[31m-  "msubST",	"msubuST",[m
[31m-  [32] = "clzDS", [33] = "cloDS",[m
[31m-  [63] = "sdbbpY",[m
[31m-}[m
[31m-[m
[31m-local map_bshfl = {[m
[31m-  shift = 6, mask = 31,[m
[31m-  [2] = "wsbhDT",[m
[31m-  [16] = "sebDT",[m
[31m-  [24] = "sehDT",[m
[31m-}[m
[31m-[m
[31m-local map_special3 = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "extTSAK", [4] = "insTSAL",[m
[31m-  [32] = map_bshfl,[m
[31m-  [59] = "rdhwrTD",[m
[31m-}[m
[31m-[m
[31m-local map_regimm = {[m
[31m-  shift = 16, mask = 31,[m
[31m-  [0] = "bltzSB",	"bgezSB",	"bltzlSB",	"bgezlSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  "tgeiSI",	"tgeiuSI",	"tltiSI",	"tltiuSI",[m
[31m-  "teqiSI",	false,		"tneiSI",	false,[m
[31m-  "bltzalSB",	"bgezalSB",	"bltzallSB",	"bgezallSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		"synciSO",[m
[31m-}[m
[31m-[m
[31m-local map_cop0 = {[m
[31m-  shift = 25, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 21, mask = 15,[m
[31m-    [0] = "mfc0TDW", [4] = "mtc0TDW",[m
[31m-    [10] = "rdpgprDT",[m
[31m-    [11] = { shift = 5, mask = 1, [0] = "diT0", "eiT0", },[m
[31m-    [14] = "wrpgprDT",[m
[31m-  }, {[m
[31m-    shift = 0, mask = 63,[m
[31m-    [1] = "tlbr", [2] = "tlbwi", [6] = "tlbwr", [8] = "tlbp",[m
[31m-    [24] = "eret", [31] = "deret",[m
[31m-    [32] = "wait",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_cop1s = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.sFGH",	"sub.sFGH",	"mul.sFGH",	"div.sFGH",[m
[31m-  "sqrt.sFG",		"abs.sFG",	"mov.sFG",	"neg.sFG",[m
[31m-  "round.l.sFG",	"trunc.l.sFG",	"ceil.l.sFG",	"floor.l.sFG",[m
[31m-  "round.w.sFG",	"trunc.w.sFG",	"ceil.w.sFG",	"floor.w.sFG",[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.sFGC", "movt.sFGC" },[m
[31m-  "movz.sFGT",	"movn.sFGT",[m
[31m-  false,	"recip.sFG",	"rsqrt.sFG",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	"cvt.d.sFG",	false,		false,[m
[31m-  "cvt.w.sFG",	"cvt.l.sFG",	"cvt.ps.sFGH",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "c.f.sVGH",	"c.un.sVGH",	"c.eq.sVGH",	"c.ueq.sVGH",[m
[31m-  "c.olt.sVGH",	"c.ult.sVGH",	"c.ole.sVGH",	"c.ule.sVGH",[m
[31m-  "c.sf.sVGH",	"c.ngle.sVGH",	"c.seq.sVGH",	"c.ngl.sVGH",[m
[31m-  "c.lt.sVGH",	"c.nge.sVGH",	"c.le.sVGH",	"c.ngt.sVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1d = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.dFGH",	"sub.dFGH",	"mul.dFGH",	"div.dFGH",[m
[31m-  "sqrt.dFG",		"abs.dFG",	"mov.dFG",	"neg.dFG",[m
[31m-  "round.l.dFG",	"trunc.l.dFG",	"ceil.l.dFG",	"floor.l.dFG",[m
[31m-  "round.w.dFG",	"trunc.w.dFG",	"ceil.w.dFG",	"floor.w.dFG",[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.dFGC", "movt.dFGC" },[m
[31m-  "movz.dFGT",	"movn.dFGT",[m
[31m-  false,	"recip.dFG",	"rsqrt.dFG",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.dFG",	false,		false,		false,[m
[31m-  "cvt.w.dFG",	"cvt.l.dFG",	false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "c.f.dVGH",	"c.un.dVGH",	"c.eq.dVGH",	"c.ueq.dVGH",[m
[31m-  "c.olt.dVGH",	"c.ult.dVGH",	"c.ole.dVGH",	"c.ule.dVGH",[m
[31m-  "c.df.dVGH",	"c.ngle.dVGH",	"c.deq.dVGH",	"c.ngl.dVGH",[m
[31m-  "c.lt.dVGH",	"c.nge.dVGH",	"c.le.dVGH",	"c.ngt.dVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1ps = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.psFGH",	"sub.psFGH",	"mul.psFGH",	false,[m
[31m-  false,		"abs.psFG",	"mov.psFG",	"neg.psFG",[m
[31m-  false,		false,		false,		false,[m
[31m-  false,		false,		false,		false,[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.psFGC", "movt.psFGC" },[m
[31m-  "movz.psFGT",	"movn.psFGT",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.puFG",	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.plFG",	false,		false,		false,[m
[31m-  "pll.psFGH",	"plu.psFGH",	"pul.psFGH",	"puu.psFGH",[m
[31m-  "c.f.psVGH",	"c.un.psVGH",	"c.eq.psVGH",	"c.ueq.psVGH",[m
[31m-  "c.olt.psVGH", "c.ult.psVGH",	"c.ole.psVGH",	"c.ule.psVGH",[m
[31m-  "c.psf.psVGH", "c.ngle.psVGH", "c.pseq.psVGH", "c.ngl.psVGH",[m
[31m-  "c.lt.psVGH",	"c.nge.psVGH",	"c.le.psVGH",	"c.ngt.psVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1w = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [32] = "cvt.s.wFG", [33] = "cvt.d.wFG",[m
[31m-}[m
[31m-[m
[31m-local map_cop1l = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [32] = "cvt.s.lFG", [33] = "cvt.d.lFG",[m
[31m-}[m
[31m-[m
[31m-local map_cop1bc = {[m
[31m-  shift = 16, mask = 3,[m
[31m-  [0] = "bc1fCB", "bc1tCB",	"bc1flCB",	"bc1tlCB",[m
[31m-}[m
[31m-[m
[31m-local map_cop1 = {[m
[31m-  shift = 21, mask = 31,[m
[31m-  [0] = "mfc1TG", false,	"cfc1TG",	"mfhc1TG",[m
[31m-  "mtc1TG",	false,		"ctc1TG",	"mthc1TG",[m
[31m-  map_cop1bc,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  map_cop1s,	map_cop1d,	false,		false,[m
[31m-  map_cop1w,	map_cop1l,	map_cop1ps,[m
[31m-}[m
[31m-[m
[31m-local map_cop1x = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "lwxc1FSX",	"ldxc1FSX",	false,		false,[m
[31m-  false,	"luxc1FSX",	false,		false,[m
[31m-  "swxc1FSX",	"sdxc1FSX",	false,		false,[m
[31m-  false,	"suxc1FSX",	false,		"prefxMSX",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		"alnv.psFGHS",	false,[m
[31m-  "madd.sFRGH",	"madd.dFRGH",	false,		false,[m
[31m-  false,	false,		"madd.psFRGH",	false,[m
[31m-  "msub.sFRGH",	"msub.dFRGH",	false,		false,[m
[31m-  false,	false,		"msub.psFRGH",	false,[m
[31m-  "nmadd.sFRGH", "nmadd.dFRGH",	false,		false,[m
[31m-  false,	false,		"nmadd.psFRGH",	false,[m
[31m-  "nmsub.sFRGH", "nmsub.dFRGH",	false,		false,[m
[31m-  false,	false,		"nmsub.psFRGH",	false,[m
[31m-}[m
[31m-[m
[31m-local map_pri = {[m
[31m-  [0] = map_special,	map_regimm,	"jJ",	"jalJ",[m
[31m-  "beq|beqz|bST00B",	"bne|bnezST0B",		"blezSB",	"bgtzSB",[m
[31m-  "addiTSI",	"addiu|liTS0I",	"sltiTSI",	"sltiuTSI",[m
[31m-  "andiTSU",	"ori|liTS0U",	"xoriTSU",	"luiTU",[m
[31m-  map_cop0,	map_cop1,	false,		map_cop1x,[m
[31m-  "beql|beqzlST0B",	"bnel|bnezlST0B",	"blezlSB",	"bgtzlSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  map_special2,	false,		false,		map_special3,[m
[31m-  "lbTSO",	"lhTSO",	"lwlTSO",	"lwTSO",[m
[31m-  "lbuTSO",	"lhuTSO",	"lwrTSO",	false,[m
[31m-  "sbTSO",	"shTSO",	"swlTSO",	"swTSO",[m
[31m-  false,	false,		"swrTSO",	"cacheNSO",[m
[31m-  "llTSO",	"lwc1HSO",	"lwc2TSO",	"prefNSO",[m
[31m-  false,	"ldc1HSO",	"ldc2TSO",	false,[m
[31m-  "scTSO",	"swc1HSO",	"swc2TSO",	false,[m
[31m-  false,	"sdc1HSO",	"sdc2TSO",	false,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",[m
[31m-  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",[m
[31m-  "r24", "r25", "r26", "r27", "r28", "sp", "r30", "ra",[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then extra = "\t->"..sym end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m-local function get_be(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  return bor(lshift(b0, 24), lshift(b1, 16), lshift(b2, 8), b3)[m
[31m-end[m
[31m-[m
[31m-local function get_le(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  return bor(lshift(b3, 24), lshift(b2, 16), lshift(b1, 8), b0)[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local op = ctx:get()[m
[31m-  local operands = {}[m
[31m-  local last = nil[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local opat = map_pri[rshift(op, 26)][m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)] or opat._[m
[31m-  end[m
[31m-  local name, pat = match(opat, "^([a-z0-9_.]*)(.*)")[m
[31m-  local altname, pat2 = match(pat, "|([a-z0-9_.|]*)(.*)")[m
[31m-  if altname then pat = pat2 end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "S" then[m
[31m-      x = map_gpr[band(rshift(op, 21), 31)][m
[31m-    elseif p == "T" then[m
[31m-      x = map_gpr[band(rshift(op, 16), 31)][m
[31m-    elseif p == "D" then[m
[31m-      x = map_gpr[band(rshift(op, 11), 31)][m
[31m-    elseif p == "F" then[m
[31m-      x = "f"..band(rshift(op, 6), 31)[m
[31m-    elseif p == "G" then[m
[31m-      x = "f"..band(rshift(op, 11), 31)[m
[31m-    elseif p == "H" then[m
[31m-      x = "f"..band(rshift(op, 16), 31)[m
[31m-    elseif p == "R" then[m
[31m-      x = "f"..band(rshift(op, 21), 31)[m
[31m-    elseif p == "A" then[m
[31m-      x = band(rshift(op, 6), 31)[m
[31m-    elseif p == "M" then[m
[31m-      x = band(rshift(op, 11), 31)[m
[31m-    elseif p == "N" then[m
[31m-      x = band(rshift(op, 16), 31)[m
[31m-    elseif p == "C" then[m
[31m-      x = band(rshift(op, 18), 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "K" then[m
[31m-      x = band(rshift(op, 11), 31) + 1[m
[31m-    elseif p == "L" then[m
[31m-      x = band(rshift(op, 11), 31) - last + 1[m
[31m-    elseif p == "I" then[m
[31m-      x = arshift(lshift(op, 16), 16)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(op, 0xffff)[m
[31m-    elseif p == "O" then[m
[31m-      local disp = arshift(lshift(op, 16), 16)[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p == "X" then[m
[31m-      local index = map_gpr[band(rshift(op, 16), 31)][m
[31m-      operands[#operands] = format("%s(%s)", index, last)[m
[31m-    elseif p == "B" then[m
[31m-      x = ctx.addr + ctx.pos + arshift(lshift(op, 16), 16)*4 + 4[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "J" then[m
[31m-      x = band(ctx.addr + ctx.pos, 0xf0000000) + band(op, 0x03ffffff)*4[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "V" then[m
[31m-      x = band(rshift(op, 8), 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "W" then[m
[31m-      x = band(op, 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "Y" then[m
[31m-      x = band(rshift(op, 6), 0x000fffff)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "Z" then[m
[31m-      x = band(rshift(op, 6), 1023)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "0" then[m
[31m-      if last == "r0" or last == 0 then[m
[31m-	local n = #operands[m
[31m-	operands[n] = nil[m
[31m-	last = operands[n-1][m
[31m-	if altname then[m
[31m-	  local a1, a2 = match(altname, "([^|]*)|(.*)")[m
[31m-	  if a1 then name, altname = a1, a2[m
[31m-	  else name = altname end[m
[31m-	end[m
[31m-      end[m
[31m-    elseif p == "1" then[m
[31m-      if last == "ra" then[m
[31m-	operands[#operands] = nil[m
[31m-      end[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then operands[#operands+1] = x; last = x end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  stop = stop - stop % 4[m
[31m-  ctx.pos = ofs - ofs % 4[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  ctx.get = get_be[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m-local function create_el(code, addr, out)[m
[31m-  local ctx = create(code, addr, out)[m
[31m-  ctx.get = get_le[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m-local function disass_el(code, addr, out)[m
[31m-  create_el(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 32 then return map_gpr[r] end[m
[31m-  return "f"..(r-32)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  create_el = create_el,[m
[31m-  disass = disass,[m
[31m-  disass_el = disass_el,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_mipsel.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_mipsel.lua[m
[1mdeleted file mode 100644[m
[1mindex 3f2f6ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_mipsel.lua[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT MIPSEL disassembler wrapper module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This module just exports the little-endian functions from the[m
[31m--- MIPS disassembler module. All the interesting stuff is there.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local dis_mips = require((string.match(..., ".*%.") or "").."dis_mips")[m
[31m-return {[m
[31m-  create = dis_mips.create_el,[m
[31m-  disass = dis_mips.disass_el,[m
[31m-  regname = dis_mips.regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_ppc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_ppc.lua[m
[1mdeleted file mode 100644[m
[1mindex 30f51ec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_ppc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,591 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT PPC disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT/X license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles all common, non-privileged 32/64 bit PowerPC instructions[m
[31m--- plus the e500 SPE instructions and some Cell/Xenon extensions.[m
[31m---[m
[31m--- NYI: VMX, VMX128[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, tohex = bit.band, bit.bor, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Primary and extended opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_crops = {[m
[31m-  shift = 1, mask = 1023,[m
[31m-  [0] = "mcrfXX",[m
[31m-  [33] = "crnor|crnotCCC=", [129] = "crandcCCC",[m
[31m-  [193] = "crxor|crclrCCC%", [225] = "crnandCCC",[m
[31m-  [257] = "crandCCC", [289] = "creqv|crsetCCC%",[m
[31m-  [417] = "crorcCCC", [449] = "cror|crmoveCCC=",[m
[31m-  [16] = "b_lrKB", [528] = "b_ctrKB",[m
[31m-  [150] = "isync",[m
[31m-}[m
[31m-[m
[31m-local map_rlwinm = setmetatable({[m
[31m-  shift = 0, mask = -1,[m
[31m-},[m
[31m-{ __index = function(t, x)[m
[31m-    local rot = band(rshift(x, 11), 31)[m
[31m-    local mb = band(rshift(x, 6), 31)[m
[31m-    local me = band(rshift(x, 1), 31)[m
[31m-    if mb == 0 and me == 31-rot then[m
[31m-      return "slwiRR~A."[m
[31m-    elseif me == 31 and mb == 32-rot then[m
[31m-      return "srwiRR~-A."[m
[31m-    else[m
[31m-      return "rlwinmRR~AAA."[m
[31m-    end[m
[31m-  end[m
[31m-})[m
[31m-[m
[31m-local map_rld = {[m
[31m-  shift = 2, mask = 7,[m
[31m-  [0] = "rldiclRR~HM.", "rldicrRR~HM.", "rldicRR~HM.", "rldimiRR~HM.",[m
[31m-  {[m
[31m-    shift = 1, mask = 1,[m
[31m-    [0] = "rldclRR~RM.", "rldcrRR~RM.",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_ext = setmetatable({[m
[31m-  shift = 1, mask = 1023,[m
[31m-[m
[31m-  [0] = "cmp_YLRR", [32] = "cmpl_YLRR",[m
[31m-  [4] = "twARR", [68] = "tdARR",[m
[31m-[m
[31m-  [8] = "subfcRRR.", [40] = "subfRRR.",[m
[31m-  [104] = "negRR.", [136] = "subfeRRR.",[m
[31m-  [200] = "subfzeRR.", [232] = "subfmeRR.",[m
[31m-  [520] = "subfcoRRR.", [552] = "subfoRRR.",[m
[31m-  [616] = "negoRR.", [648] = "subfeoRRR.",[m
[31m-  [712] = "subfzeoRR.", [744] = "subfmeoRR.",[m
[31m-[m
[31m-  [9] = "mulhduRRR.", [73] = "mulhdRRR.", [233] = "mulldRRR.",[m
[31m-  [457] = "divduRRR.", [489] = "divdRRR.",[m
[31m-  [745] = "mulldoRRR.",[m
[31m-  [969] = "divduoRRR.", [1001] = "divdoRRR.",[m
[31m-[m
[31m-  [10] = "addcRRR.", [138] = "addeRRR.",[m
[31m-  [202] = "addzeRR.", [234] = "addmeRR.", [266] = "addRRR.",[m
[31m-  [522] = "addcoRRR.", [650] = "addeoRRR.",[m
[31m-  [714] = "addzeoRR.", [746] = "addmeoRR.", [778] = "addoRRR.",[m
[31m-[m
[31m-  [11] = "mulhwuRRR.", [75] = "mulhwRRR.", [235] = "mullwRRR.",[m
[31m-  [459] = "divwuRRR.", [491] = "divwRRR.",[m
[31m-  [747] = "mullwoRRR.",[m
[31m-  [971] = "divwouRRR.", [1003] = "divwoRRR.",[m
[31m-[m
[31m-  [15] = "iselltRRR", [47] = "iselgtRRR", [79] = "iseleqRRR",[m
[31m-[m
[31m-  [144] = { shift = 20, mask = 1, [0] = "mtcrfRZ~", "mtocrfRZ~", },[m
[31m-  [19] = { shift = 20, mask = 1, [0] = "mfcrR", "mfocrfRZ", },[m
[31m-  [371] = { shift = 11, mask = 1023, [392] = "mftbR", [424] = "mftbuR", },[m
[31m-  [339] = {[m
[31m-    shift = 11, mask = 1023,[m
[31m-    [32] = "mferR", [256] = "mflrR", [288] = "mfctrR", [16] = "mfspefscrR",[m
[31m-  },[m
[31m-  [467] = {[m
[31m-    shift = 11, mask = 1023,[m
[31m-    [32] = "mtxerR", [256] = "mtlrR", [288] = "mtctrR", [16] = "mtspefscrR",[m
[31m-  },[m
[31m-[m
[31m-  [20] = "lwarxRR0R", [84] = "ldarxRR0R",[m
[31m-[m
[31m-  [21] = "ldxRR0R", [53] = "lduxRRR",[m
[31m-  [149] = "stdxRR0R", [181] = "stduxRRR",[m
[31m-  [341] = "lwaxRR0R", [373] = "lwauxRRR",[m
[31m-[m
[31m-  [23] = "lwzxRR0R", [55] = "lwzuxRRR",[m
[31m-  [87] = "lbzxRR0R", [119] = "lbzuxRRR",[m
[31m-  [151] = "stwxRR0R", [183] = "stwuxRRR",[m
[31m-  [215] = "stbxRR0R", [247] = "stbuxRRR",[m
[31m-  [279] = "lhzxRR0R", [311] = "lhzuxRRR",[m
[31m-  [343] = "lhaxRR0R", [375] = "lhauxRRR",[m
[31m-  [407] = "sthxRR0R", [439] = "sthuxRRR",[m
[31m-[m
[31m-  [54] = "dcbst-R0R", [86] = "dcbf-R0R",[m
[31m-  [150] = "stwcxRR0R.", [214] = "stdcxRR0R.",[m
[31m-  [246] = "dcbtst-R0R", [278] = "dcbt-R0R",[m
[31m-  [310] = "eciwxRR0R", [438] = "ecowxRR0R",[m
[31m-  [470] = "dcbi-RR",[m
[31m-[m
[31m-  [598] = {[m
[31m-    shift = 21, mask = 3,[m
[31m-    [0] = "sync", "lwsync", "ptesync",[m
[31m-  },[m
[31m-  [758] = "dcba-RR",[m
[31m-  [854] = "eieio", [982] = "icbi-R0R", [1014] = "dcbz-R0R",[m
[31m-[m
[31m-  [26] = "cntlzwRR~", [58] = "cntlzdRR~",[m
[31m-  [122] = "popcntbRR~",[m
[31m-  [154] = "prtywRR~", [186] = "prtydRR~",[m
[31m-[m
[31m-  [28] = "andRR~R.", [60] = "andcRR~R.", [124] = "nor|notRR~R=.",[m
[31m-  [284] = "eqvRR~R.", [316] = "xorRR~R.",[m
[31m-  [412] = "orcRR~R.", [444] = "or|mrRR~R=.", [476] = "nandRR~R.",[m
[31m-  [508] = "cmpbRR~R",[m
[31m-[m
[31m-  [512] = "mcrxrX",[m
[31m-[m
[31m-  [532] = "ldbrxRR0R", [660] = "stdbrxRR0R",[m
[31m-[m
[31m-  [533] = "lswxRR0R", [597] = "lswiRR0A",[m
[31m-  [661] = "stswxRR0R", [725] = "stswiRR0A",[m
[31m-[m
[31m-  [534] = "lwbrxRR0R", [662] = "stwbrxRR0R",[m
[31m-  [790] = "lhbrxRR0R", [918] = "sthbrxRR0R",[m
[31m-[m
[31m-  [535] = "lfsxFR0R", [567] = "lfsuxFRR",[m
[31m-  [599] = "lfdxFR0R", [631] = "lfduxFRR",[m
[31m-  [663] = "stfsxFR0R", [695] = "stfsuxFRR",[m
[31m-  [727] = "stfdxFR0R", [759] = "stfduxFR0R",[m
[31m-  [855] = "lfiwaxFR0R",[m
[31m-  [983] = "stfiwxFR0R",[m
[31m-[m
[31m-  [24] = "slwRR~R.",[m
[31m-[m
[31m-  [27] = "sldRR~R.", [536] = "srwRR~R.",[m
[31m-  [792] = "srawRR~R.", [824] = "srawiRR~A.",[m
[31m-[m
[31m-  [794] = "sradRR~R.", [826] = "sradiRR~H.", [827] = "sradiRR~H.",[m
[31m-  [922] = "extshRR~.", [954] = "extsbRR~.", [986] = "extswRR~.",[m
[31m-[m
[31m-  [539] = "srdRR~R.",[m
[31m-},[m
[31m-{ __index = function(t, x)[m
[31m-    if band(x, 31) == 15 then return "iselRRRC" end[m
[31m-  end[m
[31m-})[m
[31m-[m
[31m-local map_ld = {[m
[31m-  shift = 0, mask = 3,[m
[31m-  [0] = "ldRRE", "lduRRE", "lwaRRE",[m
[31m-}[m
[31m-[m
[31m-local map_std = {[m
[31m-  shift = 0, mask = 3,[m
[31m-  [0] = "stdRRE", "stduRRE",[m
[31m-}[m
[31m-[m
[31m-local map_fps = {[m
[31m-  shift = 5, mask = 1,[m
[31m-  {[m
[31m-    shift = 1, mask = 15,[m
[31m-    [0] = false, false, "fdivsFFF.", false,[m
[31m-    "fsubsFFF.", "faddsFFF.", "fsqrtsF-F.", false,[m
[31m-    "fresF-F.", "fmulsFF-F.", "frsqrtesF-F.", false,[m
[31m-    "fmsubsFFFF~.", "fmaddsFFFF~.", "fnmsubsFFFF~.", "fnmaddsFFFF~.",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_fpd = {[m
[31m-  shift = 5, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 1, mask = 1023,[m
[31m-    [0] = "fcmpuXFF", [32] = "fcmpoXFF", [64] = "mcrfsXX",[m
[31m-    [38] = "mtfsb1A.", [70] = "mtfsb0A.", [134] = "mtfsfiA>>-A>",[m
[31m-    [8] = "fcpsgnFFF.", [40] = "fnegF-F.", [72] = "fmrF-F.",[m
[31m-    [136] = "fnabsF-F.", [264] = "fabsF-F.",[m
[31m-    [12] = "frspF-F.",[m
[31m-    [14] = "fctiwF-F.", [15] = "fctiwzF-F.",[m
[31m-    [583] = "mffsF.", [711] = "mtfsfZF.",[m
[31m-    [392] = "frinF-F.", [424] = "frizF-F.",[m
[31m-    [456] = "fripF-F.", [488] = "frimF-F.",[m
[31m-    [814] = "fctidF-F.", [815] = "fctidzF-F.", [846] = "fcfidF-F.",[m
[31m-  },[m
[31m-  {[m
[31m-    shift = 1, mask = 15,[m
[31m-    [0] = false, false, "fdivFFF.", false,[m
[31m-    "fsubFFF.", "faddFFF.", "fsqrtF-F.", "fselFFFF~.",[m
[31m-    "freF-F.", "fmulFF-F.", "frsqrteF-F.", false,[m
[31m-    "fmsubFFFF~.", "fmaddFFFF~.", "fnmsubFFFF~.", "fnmaddFFFF~.",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_spe = {[m
[31m-  shift = 0, mask = 2047,[m
[31m-[m
[31m-  [512] = "evaddwRRR", [514] = "evaddiwRAR~",[m
[31m-  [516] = "evsubwRRR~", [518] = "evsubiwRAR~",[m
[31m-  [520] = "evabsRR", [521] = "evnegRR",[m
[31m-  [522] = "evextsbRR", [523] = "evextshRR", [524] = "evrndwRR",[m
[31m-  [525] = "evcntlzwRR", [526] = "evcntlswRR",[m
[31m-[m
[31m-  [527] = "brincRRR",[m
[31m-[m
[31m-  [529] = "evandRRR", [530] = "evandcRRR", [534] = "evxorRRR",[m
[31m-  [535] = "evor|evmrRRR=", [536] = "evnor|evnotRRR=",[m
[31m-  [537] = "eveqvRRR", [539] = "evorcRRR", [542] = "evnandRRR",[m
[31m-[m
[31m-  [544] = "evsrwuRRR", [545] = "evsrwsRRR",[m
[31m-  [546] = "evsrwiuRRA", [547] = "evsrwisRRA",[m
[31m-  [548] = "evslwRRR", [550] = "evslwiRRA",[m
[31m-  [552] = "evrlwRRR", [553] = "evsplatiRS",[m
[31m-  [554] = "evrlwiRRA", [555] = "evsplatfiRS",[m
[31m-  [556] = "evmergehiRRR", [557] = "evmergeloRRR",[m
[31m-  [558] = "evmergehiloRRR", [559] = "evmergelohiRRR",[m
[31m-[m
[31m-  [560] = "evcmpgtuYRR", [561] = "evcmpgtsYRR",[m
[31m-  [562] = "evcmpltuYRR", [563] = "evcmpltsYRR",[m
[31m-  [564] = "evcmpeqYRR",[m
[31m-[m
[31m-  [632] = "evselRRR", [633] = "evselRRRW",[m
[31m-  [634] = "evselRRRW", [635] = "evselRRRW",[m
[31m-  [636] = "evselRRRW", [637] = "evselRRRW",[m
[31m-  [638] = "evselRRRW", [639] = "evselRRRW",[m
[31m-[m
[31m-  [640] = "evfsaddRRR", [641] = "evfssubRRR",[m
[31m-  [644] = "evfsabsRR", [645] = "evfsnabsRR", [646] = "evfsnegRR",[m
[31m-  [648] = "evfsmulRRR", [649] = "evfsdivRRR",[m
[31m-  [652] = "evfscmpgtYRR", [653] = "evfscmpltYRR", [654] = "evfscmpeqYRR",[m
[31m-  [656] = "evfscfuiR-R", [657] = "evfscfsiR-R",[m
[31m-  [658] = "evfscfufR-R", [659] = "evfscfsfR-R",[m
[31m-  [660] = "evfsctuiR-R", [661] = "evfsctsiR-R",[m
[31m-  [662] = "evfsctufR-R", [663] = "evfsctsfR-R",[m
[31m-  [664] = "evfsctuizR-R", [666] = "evfsctsizR-R",[m
[31m-  [668] = "evfststgtYRR", [669] = "evfststltYRR", [670] = "evfststeqYRR",[m
[31m-[m
[31m-  [704] = "efsaddRRR", [705] = "efssubRRR",[m
[31m-  [708] = "efsabsRR", [709] = "efsnabsRR", [710] = "efsnegRR",[m
[31m-  [712] = "efsmulRRR", [713] = "efsdivRRR",[m
[31m-  [716] = "efscmpgtYRR", [717] = "efscmpltYRR", [718] = "efscmpeqYRR",[m
[31m-  [719] = "efscfdR-R",[m
[31m-  [720] = "efscfuiR-R", [721] = "efscfsiR-R",[m
[31m-  [722] = "efscfufR-R", [723] = "efscfsfR-R",[m
[31m-  [724] = "efsctuiR-R", [725] = "efsctsiR-R",[m
[31m-  [726] = "efsctufR-R", [727] = "efsctsfR-R",[m
[31m-  [728] = "efsctuizR-R", [730] = "efsctsizR-R",[m
[31m-  [732] = "efststgtYRR", [733] = "efststltYRR", [734] = "efststeqYRR",[m
[31m-[m
[31m-  [736] = "efdaddRRR", [737] = "efdsubRRR",[m
[31m-  [738] = "efdcfuidR-R", [739] = "efdcfsidR-R",[m
[31m-  [740] = "efdabsRR", [741] = "efdnabsRR", [742] = "efdnegRR",[m
[31m-  [744] = "efdmulRRR", [745] = "efddivRRR",[m
[31m-  [746] = "efdctuidzR-R", [747] = "efdctsidzR-R",[m
[31m-  [748] = "efdcmpgtYRR", [749] = "efdcmpltYRR", [750] = "efdcmpeqYRR",[m
[31m-  [751] = "efdcfsR-R",[m
[31m-  [752] = "efdcfuiR-R", [753] = "efdcfsiR-R",[m
[31m-  [754] = "efdcfufR-R", [755] = "efdcfsfR-R",[m
[31m-  [756] = "efdctuiR-R", [757] = "efdctsiR-R",[m
[31m-  [758] = "efdctufR-R", [759] = "efdctsfR-R",[m
[31m-  [760] = "efdctuizR-R", [762] = "efdctsizR-R",[m
[31m-  [764] = "efdtstgtYRR", [765] = "efdtstltYRR", [766] = "efdtsteqYRR",[m
[31m-[m
[31m-  [768] = "evlddxRR0R", [769] = "evlddRR8",[m
[31m-  [770] = "evldwxRR0R", [771] = "evldwRR8",[m
[31m-  [772] = "evldhxRR0R", [773] = "evldhRR8",[m
[31m-  [776] = "evlhhesplatxRR0R", [777] = "evlhhesplatRR2",[m
[31m-  [780] = "evlhhousplatxRR0R", [781] = "evlhhousplatRR2",[m
[31m-  [782] = "evlhhossplatxRR0R", [783] = "evlhhossplatRR2",[m
[31m-  [784] = "evlwhexRR0R", [785] = "evlwheRR4",[m
[31m-  [788] = "evlwhouxRR0R", [789] = "evlwhouRR4",[m
[31m-  [790] = "evlwhosxRR0R", [791] = "evlwhosRR4",[m
[31m-  [792] = "evlwwsplatxRR0R", [793] = "evlwwsplatRR4",[m
[31m-  [796] = "evlwhsplatxRR0R", [797] = "evlwhsplatRR4",[m
[31m-[m
[31m-  [800] = "evstddxRR0R", [801] = "evstddRR8",[m
[31m-  [802] = "evstdwxRR0R", [803] = "evstdwRR8",[m
[31m-  [804] = "evstdhxRR0R", [805] = "evstdhRR8",[m
[31m-  [816] = "evstwhexRR0R", [817] = "evstwheRR4",[m
[31m-  [820] = "evstwhoxRR0R", [821] = "evstwhoRR4",[m
[31m-  [824] = "evstwwexRR0R", [825] = "evstwweRR4",[m
[31m-  [828] = "evstwwoxRR0R", [829] = "evstwwoRR4",[m
[31m-[m
[31m-  [1027] = "evmhessfRRR", [1031] = "evmhossfRRR", [1032] = "evmheumiRRR",[m
[31m-  [1033] = "evmhesmiRRR", [1035] = "evmhesmfRRR", [1036] = "evmhoumiRRR",[m
[31m-  [1037] = "evmhosmiRRR", [1039] = "evmhosmfRRR", [1059] = "evmhessfaRRR",[m
[31m-  [1063] = "evmhossfaRRR", [1064] = "evmheumiaRRR", [1065] = "evmhesmiaRRR",[m
[31m-  [1067] = "evmhesmfaRRR", [1068] = "evmhoumiaRRR", [1069] = "evmhosmiaRRR",[m
[31m-  [1071] = "evmhosmfaRRR", [1095] = "evmwhssfRRR", [1096] = "evmwlumiRRR",[m
[31m-  [1100] = "evmwhumiRRR", [1101] = "evmwhsmiRRR", [1103] = "evmwhsmfRRR",[m
[31m-  [1107] = "evmwssfRRR", [1112] = "evmwumiRRR", [1113] = "evmwsmiRRR",[m
[31m-  [1115] = "evmwsmfRRR", [1127] = "evmwhssfaRRR", [1128] = "evmwlumiaRRR",[m
[31m-  [1132] = "evmwhumiaRRR", [1133] = "evmwhsmiaRRR", [1135] = "evmwhsmfaRRR",[m
[31m-  [1139] = "evmwssfaRRR", [1144] = "evmwumiaRRR", [1145] = "evmwsmiaRRR",[m
[31m-  [1147] = "evmwsmfaRRR",[m
[31m-[m
[31m-  [1216] = "evaddusiaawRR", [1217] = "evaddssiaawRR",[m
[31m-  [1218] = "evsubfusiaawRR", [1219] = "evsubfssiaawRR",[m
[31m-  [1220] = "evmraRR",[m
[31m-  [1222] = "evdivwsRRR", [1223] = "evdivwuRRR",[m
[31m-  [1224] = "evaddumiaawRR", [1225] = "evaddsmiaawRR",[m
[31m-  [1226] = "evsubfumiaawRR", [1227] = "evsubfsmiaawRR",[m
[31m-[m
[31m-  [1280] = "evmheusiaawRRR", [1281] = "evmhessiaawRRR",[m
[31m-  [1283] = "evmhessfaawRRR", [1284] = "evmhousiaawRRR",[m
[31m-  [1285] = "evmhossiaawRRR", [1287] = "evmhossfaawRRR",[m
[31m-  [1288] = "evmheumiaawRRR", [1289] = "evmhesmiaawRRR",[m
[31m-  [1291] = "evmhesmfaawRRR", [1292] = "evmhoumiaawRRR",[m
[31m-  [1293] = "evmhosmiaawRRR", [1295] = "evmhosmfaawRRR",[m
[31m-  [1320] = "evmhegumiaaRRR", [1321] = "evmhegsmiaaRRR",[m
[31m-  [1323] = "evmhegsmfaaRRR", [1324] = "evmhogumiaaRRR",[m
[31m-  [1325] = "evmhogsmiaaRRR", [1327] = "evmhogsmfaaRRR",[m
[31m-  [1344] = "evmwlusiaawRRR", [1345] = "evmwlssiaawRRR",[m
[31m-  [1352] = "evmwlumiaawRRR", [1353] = "evmwlsmiaawRRR",[m
[31m-  [1363] = "evmwssfaaRRR", [1368] = "evmwumiaaRRR",[m
[31m-  [1369] = "evmwsmiaaRRR", [1371] = "evmwsmfaaRRR",[m
[31m-  [1408] = "evmheusianwRRR", [1409] = "evmhessianwRRR",[m
[31m-  [1411] = "evmhessfanwRRR", [1412] = "evmhousianwRRR",[m
[31m-  [1413] = "evmhossianwRRR", [1415] = "evmhossfanwRRR",[m
[31m-  [1416] = "evmheumianwRRR", [1417] = "evmhesmianwRRR",[m
[31m-  [1419] = "evmhesmfanwRRR", [1420] = "evmhoumianwRRR",[m
[31m-  [1421] = "evmhosmianwRRR", [1423] = "evmhosmfanwRRR",[m
[31m-  [1448] = "evmhegumianRRR", [1449] = "evmhegsmianRRR",[m
[31m-  [1451] = "evmhegsmfanRRR", [1452] = "evmhogumianRRR",[m
[31m-  [1453] = "evmhogsmianRRR", [1455] = "evmhogsmfanRRR",[m
[31m-  [1472] = "evmwlusianwRRR", [1473] = "evmwlssianwRRR",[m
[31m-  [1480] = "evmwlumianwRRR", [1481] = "evmwlsmianwRRR",[m
[31m-  [1491] = "evmwssfanRRR", [1496] = "evmwumianRRR",[m
[31m-  [1497] = "evmwsmianRRR", [1499] = "evmwsmfanRRR",[m
[31m-}[m
[31m-[m
[31m-local map_pri = {[m
[31m-  [0] = false,	false,		"tdiARI",	"twiARI",[m
[31m-  map_spe,	false,		false,		"mulliRRI",[m
[31m-  "subficRRI",	false,		"cmpl_iYLRU",	"cmp_iYLRI",[m
[31m-  "addicRRI",	"addic.RRI",	"addi|liRR0I",	"addis|lisRR0I",[m
[31m-  "b_KBJ",	"sc",		 "bKJ",		map_crops,[m
[31m-  "rlwimiRR~AAA.", map_rlwinm,	false,		"rlwnmRR~RAA.",[m
[31m-  "oriNRR~U",	"orisRR~U",	"xoriRR~U",	"xorisRR~U",[m
[31m-  "andi.RR~U",	"andis.RR~U",	map_rld,	map_ext,[m
[31m-  "lwzRRD",	"lwzuRRD",	"lbzRRD",	"lbzuRRD",[m
[31m-  "stwRRD",	"stwuRRD",	"stbRRD",	"stbuRRD",[m
[31m-  "lhzRRD",	"lhzuRRD",	"lhaRRD",	"lhauRRD",[m
[31m-  "sthRRD",	"sthuRRD",	"lmwRRD",	"stmwRRD",[m
[31m-  "lfsFRD",	"lfsuFRD",	"lfdFRD",	"lfduFRD",[m
[31m-  "stfsFRD",	"stfsuFRD",	"stfdFRD",	"stfduFRD",[m
[31m-  false,	false,		map_ld,		map_fps,[m
[31m-  false,	false,		map_std,	map_fpd,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "sp", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",[m
[31m-  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",[m
[31m-  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",[m
[31m-}[m
[31m-[m
[31m-local map_cond = { [0] = "lt", "gt", "eq", "so", "ge", "le", "ne", "ns", }[m
[31m-[m
[31m--- Format a condition bit.[m
[31m-local function condfmt(cond)[m
[31m-  if cond <= 3 then[m
[31m-    return map_cond[band(cond, 3)][m
[31m-  else[m
[31m-    return format("4*cr%d+%s", rshift(cond, 2), map_cond[band(cond, 3)])[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then extra = "\t->"..sym end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  local op = bor(lshift(b0, 24), lshift(b1, 16), lshift(b2, 8), b3)[m
[31m-  local operands = {}[m
[31m-  local last = nil[m
[31m-  local rs = 21[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local opat = map_pri[rshift(b0, 2)][m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)][m
[31m-  end[m
[31m-  local name, pat = match(opat, "^([a-z0-9_.]*)(.*)")[m
[31m-  local altname, pat2 = match(pat, "|([a-z0-9_.]*)(.*)")[m
[31m-  if altname then pat = pat2 end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "R" then[m
[31m-      x = map_gpr[band(rshift(op, rs), 31)][m
[31m-      rs = rs - 5[m
[31m-    elseif p == "F" then[m
[31m-      x = "f"..band(rshift(op, rs), 31)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "A" then[m
[31m-      x = band(rshift(op, rs), 31)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "S" then[m
[31m-      x = arshift(lshift(op, 27-rs), 27)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "I" then[m
[31m-      x = arshift(lshift(op, 16), 16)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(op, 0xffff)[m
[31m-    elseif p == "D" or p == "E" then[m
[31m-      local disp = arshift(lshift(op, 16), 16)[m
[31m-      if p == "E" then disp = band(disp, -4) end[m
[31m-      if last == "r0" then last = "0" end[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p >= "2" and p <= "8" then[m
[31m-      local disp = band(rshift(op, rs), 31) * p[m
[31m-      if last == "r0" then last = "0" end[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p == "H" then[m
[31m-      x = band(rshift(op, rs), 31) + lshift(band(op, 2), 4)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "M" then[m
[31m-      x = band(rshift(op, rs), 31) + band(op, 0x20)[m
[31m-    elseif p == "C" then[m
[31m-      x = condfmt(band(rshift(op, rs), 31))[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "B" then[m
[31m-      local bo = rshift(op, 21)[m
[31m-      local cond = band(rshift(op, 16), 31)[m
[31m-      local cn = ""[m
[31m-      rs = rs - 10[m
[31m-      if band(bo, 4) == 0 then[m
[31m-	cn = band(bo, 2) == 0 and "dnz" or "dz"[m
[31m-	if band(bo, 0x10) == 0 then[m
[31m-	  cn = cn..(band(bo, 8) == 0 and "f" or "t")[m
[31m-	end[m
[31m-	if band(bo, 0x10) == 0 then x = condfmt(cond) end[m
[31m-	name = name..(band(bo, 1) == band(rshift(op, 15), 1) and "-" or "+")[m
[31m-      elseif band(bo, 0x10) == 0 then[m
[31m-	cn = map_cond[band(cond, 3) + (band(bo, 8) == 0 and 4 or 0)][m
[31m-	if cond > 3 then x = "cr"..rshift(cond, 2) end[m
[31m-	name = name..(band(bo, 1) == band(rshift(op, 15), 1) and "-" or "+")[m
[31m-      end[m
[31m-      name = gsub(name, "_", cn)[m
[31m-    elseif p == "J" then[m
[31m-      x = arshift(lshift(op, 27-rs), 29-rs)*4[m
[31m-      if band(op, 2) == 0 then x = ctx.addr + pos + x end[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "K" then[m
[31m-      if band(op, 1) ~= 0 then name = name.."l" end[m
[31m-      if band(op, 2) ~= 0 then name = name.."a" end[m
[31m-    elseif p == "X" or p == "Y" then[m
[31m-      x = band(rshift(op, rs+2), 7)[m
[31m-      if x == 0 and p == "Y" then x = nil else x = "cr"..x end[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "W" then[m
[31m-      x = "cr"..band(op, 7)[m
[31m-    elseif p == "Z" then[m
[31m-      x = band(rshift(op, rs-4), 255)[m
[31m-      rs = rs - 10[m
[31m-    elseif p == ">" then[m
[31m-      operands[#operands] = rshift(operands[#operands], 1)[m
[31m-    elseif p == "0" then[m
[31m-      if last == "r0" then[m
[31m-	operands[#operands] = nil[m
[31m-	if altname then name = altname end[m
[31m-      end[m
[31m-    elseif p == "L" then[m
[31m-      name = gsub(name, "_", band(op, 0x00200000) ~= 0 and "d" or "w")[m
[31m-    elseif p == "." then[m
[31m-      if band(op, 1) == 1 then name = name.."." end[m
[31m-    elseif p == "N" then[m
[31m-      if op == 0x60000000 then name = "nop"; break end[m
[31m-    elseif p == "~" then[m
[31m-      local n = #operands[m
[31m-      operands[n-1],  operands[n] = operands[n], operands[n-1][m
[31m-    elseif p == "=" then[m
[31m-      local n = #operands[m
[31m-      if last == operands[n-1] then[m
[31m-	operands[n] = nil[m
[31m-	name = altname[m
[31m-      end[m
[31m-    elseif p == "%" then[m
[31m-      local n = #operands[m
[31m-      if last == operands[n-1] and last == operands[n-2] then[m
[31m-	operands[n] = nil[m
[31m-	operands[n-1] = nil[m
[31m-	name = altname[m
[31m-      end[m
[31m-    elseif p == "-" then[m
[31m-      rs = rs - 5[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then operands[#operands+1] = x; last = x end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  stop = stop - stop % 4[m
[31m-  ctx.pos = ofs - ofs % 4[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 32 then return map_gpr[r] end[m
[31m-  return "f"..(r-32)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  disass = disass,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_x64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_x64.lua[m
[1mdeleted file mode 100644[m
[1mindex 077b1b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_x64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT x64 disassembler wrapper module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This module just exports the 64 bit functions from the combined[m
[31m--- x86/x64 disassembler module. All the interesting stuff is there.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local dis_x86 = require((string.match(..., ".*%.") or "").."dis_x86")[m
[31m-return {[m
[31m-  create = dis_x86.create64,[m
[31m-  disass = dis_x86.disass64,[m
[31m-  regname = dis_x86.regname64[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_x86.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_x86.lua[m
[1mdeleted file mode 100644[m
[1mindex 0bbd198..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dis_x86.lua[m
[1m+++ /dev/null[m
[36m@@ -1,931 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT x86/x64 disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- Sending small code snippets to an external disassembler and mixing the[m
[31m--- output with our own stuff was too fragile. So I had to bite the bullet[m
[31m--- and write yet another x86 disassembler. Oh well ...[m
[31m---[m
[31m--- The output format is very similar to what ndisasm generates. But it has[m
[31m--- been developed independently by looking at the opcode tables from the[m
[31m--- Intel and AMD manuals. The supported instruction set is quite extensive[m
[31m--- and reflects what a current generation Intel or AMD CPU implements in[m
[31m--- 32 bit and 64 bit mode. Yes, this includes MMX, SSE, SSE2, SSE3, SSSE3,[m
[31m--- SSE4.1, SSE4.2, SSE4a, AVX, AVX2 and even privileged and hypervisor[m
[31m--- (VMX/SVM) instructions.[m
[31m---[m
[31m--- Notes:[m
[31m--- * The (useless) a16 prefix, 3DNow and pre-586 opcodes are unsupported.[m
[31m--- * No attempt at optimization has been made -- it's fast enough for my needs.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local lower, rep = string.lower, string.rep[m
[31m-local bit = require("bit")[m
[31m-local tohex = bit.tohex[m
[31m-[m
[31m--- Map for 1st opcode byte in 32 bit mode. Ugly? Well ... read on.[m
[31m-local map_opc1_32 = {[m
[31m---0x[m
[31m-[0]="addBmr","addVmr","addBrm","addVrm","addBai","addVai","push es","pop es",[m
[31m-"orBmr","orVmr","orBrm","orVrm","orBai","orVai","push cs","opc2*",[m
[31m---1x[m
[31m-"adcBmr","adcVmr","adcBrm","adcVrm","adcBai","adcVai","push ss","pop ss",[m
[31m-"sbbBmr","sbbVmr","sbbBrm","sbbVrm","sbbBai","sbbVai","push ds","pop ds",[m
[31m---2x[m
[31m-"andBmr","andVmr","andBrm","andVrm","andBai","andVai","es:seg","daa",[m
[31m-"subBmr","subVmr","subBrm","subVrm","subBai","subVai","cs:seg","das",[m
[31m---3x[m
[31m-"xorBmr","xorVmr","xorBrm","xorVrm","xorBai","xorVai","ss:seg","aaa",[m
[31m-"cmpBmr","cmpVmr","cmpBrm","cmpVrm","cmpBai","cmpVai","ds:seg","aas",[m
[31m---4x[m
[31m-"incVR","incVR","incVR","incVR","incVR","incVR","incVR","incVR",[m
[31m-"decVR","decVR","decVR","decVR","decVR","decVR","decVR","decVR",[m
[31m---5x[m
[31m-"pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR",[m
[31m-"popUR","popUR","popUR","popUR","popUR","popUR","popUR","popUR",[m
[31m---6x[m
[31m-"sz*pushaw,pusha","sz*popaw,popa","boundVrm","arplWmr",[m
[31m-"fs:seg","gs:seg","o16:","a16",[m
[31m-"pushUi","imulVrmi","pushBs","imulVrms",[m
[31m-"insb","insVS","outsb","outsVS",[m
[31m---7x[m
[31m-"joBj","jnoBj","jbBj","jnbBj","jzBj","jnzBj","jbeBj","jaBj",[m
[31m-"jsBj","jnsBj","jpeBj","jpoBj","jlBj","jgeBj","jleBj","jgBj",[m
[31m---8x[m
[31m-"arith!Bmi","arith!Vmi","arith!Bmi","arith!Vms",[m
[31m-"testBmr","testVmr","xchgBrm","xchgVrm",[m
[31m-"movBmr","movVmr","movBrm","movVrm",[m
[31m-"movVmg","leaVrm","movWgm","popUm",[m
[31m---9x[m
[31m-"nop*xchgVaR|pause|xchgWaR|repne nop","xchgVaR","xchgVaR","xchgVaR",[m
[31m-"xchgVaR","xchgVaR","xchgVaR","xchgVaR",[m
[31m-"sz*cbw,cwde,cdqe","sz*cwd,cdq,cqo","call farViw","wait",[m
[31m-"sz*pushfw,pushf","sz*popfw,popf","sahf","lahf",[m
[31m---Ax[m
[31m-"movBao","movVao","movBoa","movVoa",[m
[31m-"movsb","movsVS","cmpsb","cmpsVS",[m
[31m-"testBai","testVai","stosb","stosVS",[m
[31m-"lodsb","lodsVS","scasb","scasVS",[m
[31m---Bx[m
[31m-"movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi",[m
[31m-"movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI",[m
[31m---Cx[m
[31m-"shift!Bmu","shift!Vmu","retBw","ret","vex*3$lesVrm","vex*2$ldsVrm","movBmi","movVmi",[m
[31m-"enterBwu","leave","retfBw","retf","int3","intBu","into","iretVS",[m
[31m---Dx[m
[31m-"shift!Bm1","shift!Vm1","shift!Bmc","shift!Vmc","aamBu","aadBu","salc","xlatb",[m
[31m-"fp*0","fp*1","fp*2","fp*3","fp*4","fp*5","fp*6","fp*7",[m
[31m---Ex[m
[31m-"loopneBj","loopeBj","loopBj","sz*jcxzBj,jecxzBj,jrcxzBj",[m
[31m-"inBau","inVau","outBua","outVua",[m
[31m-"callVj","jmpVj","jmp farViw","jmpBj","inBad","inVad","outBda","outVda",[m
[31m---Fx[m
[31m-"lock:","int1","repne:rep","rep:","hlt","cmc","testb!Bm","testv!Vm",[m
[31m-"clc","stc","cli","sti","cld","std","incb!Bm","incd!Vm",[m
[31m-}[m
[31m-assert(#map_opc1_32 == 255)[m
[31m-[m
[31m--- Map for 1st opcode byte in 64 bit mode (overrides only).[m
[31m-local map_opc1_64 = setmetatable({[m
[31m-  [0x06]=false, [0x07]=false, [0x0e]=false,[m
[31m-  [0x16]=false, [0x17]=false, [0x1e]=false, [0x1f]=false,[m
[31m-  [0x27]=false, [0x2f]=false, [0x37]=false, [0x3f]=false,[m
[31m-  [0x60]=false, [0x61]=false, [0x62]=false, [0x63]="movsxdVrDmt", [0x67]="a32:",[m
[31m-  [0x40]="rex*",   [0x41]="rex*b",   [0x42]="rex*x",   [0x43]="rex*xb",[m
[31m-  [0x44]="rex*r",  [0x45]="rex*rb",  [0x46]="rex*rx",  [0x47]="rex*rxb",[m
[31m-  [0x48]="rex*w",  [0x49]="rex*wb",  [0x4a]="rex*wx",  [0x4b]="rex*wxb",[m
[31m-  [0x4c]="rex*wr", [0x4d]="rex*wrb", [0x4e]="rex*wrx", [0x4f]="rex*wrxb",[m
[31m-  [0x82]=false, [0x9a]=false, [0xc4]="vex*3", [0xc5]="vex*2", [0xce]=false,[m
[31m-  [0xd4]=false, [0xd5]=false, [0xd6]=false, [0xea]=false,[m
[31m-}, { __index = map_opc1_32 })[m
[31m-[m
[31m--- Map for 2nd opcode byte (0F xx). True CISC hell. Hey, I told you.[m
[31m--- Prefix dependent MMX/SSE opcodes: (none)|rep|o16|repne, -|F3|66|F2[m
[31m-local map_opc2 = {[m
[31m---0x[m
[31m-[0]="sldt!Dmp","sgdt!Ump","larVrm","lslVrm",nil,"syscall","clts","sysret",[m
[31m-"invd","wbinvd",nil,"ud1",nil,"$prefetch!Bm","femms","3dnowMrmu",[m
[31m---1x[m
[31m-"movupsXrm|movssXrvm|movupdXrm|movsdXrvm",[m
[31m-"movupsXmr|movssXmvr|movupdXmr|movsdXmvr",[m
[31m-"movhlpsXrm$movlpsXrm|movsldupXrm|movlpdXrm|movddupXrm",[m
[31m-"movlpsXmr||movlpdXmr",[m
[31m-"unpcklpsXrvm||unpcklpdXrvm",[m
[31m-"unpckhpsXrvm||unpckhpdXrvm",[m
[31m-"movlhpsXrm$movhpsXrm|movshdupXrm|movhpdXrm",[m
[31m-"movhpsXmr||movhpdXmr",[m
[31m-"$prefetcht!Bm","hintnopVm","hintnopVm","hintnopVm",[m
[31m-"hintnopVm","hintnopVm","hintnopVm","hintnopVm",[m
[31m---2x[m
[31m-"movUmx$","movUmy$","movUxm$","movUym$","movUmz$",nil,"movUzm$",nil,[m
[31m-"movapsXrm||movapdXrm",[m
[31m-"movapsXmr||movapdXmr",[m
[31m-"cvtpi2psXrMm|cvtsi2ssXrvVmt|cvtpi2pdXrMm|cvtsi2sdXrvVmt",[m
[31m-"movntpsXmr|movntssXmr|movntpdXmr|movntsdXmr",[m
[31m-"cvttps2piMrXm|cvttss2siVrXm|cvttpd2piMrXm|cvttsd2siVrXm",[m
[31m-"cvtps2piMrXm|cvtss2siVrXm|cvtpd2piMrXm|cvtsd2siVrXm",[m
[31m-"ucomissXrm||ucomisdXrm",[m
[31m-"comissXrm||comisdXrm",[m
[31m---3x[m
[31m-"wrmsr","rdtsc","rdmsr","rdpmc","sysenter","sysexit",nil,"getsec",[m
[31m-"opc3*38",nil,"opc3*3a",nil,nil,nil,nil,nil,[m
[31m---4x[m
[31m-"cmovoVrm","cmovnoVrm","cmovbVrm","cmovnbVrm",[m
[31m-"cmovzVrm","cmovnzVrm","cmovbeVrm","cmovaVrm",[m
[31m-"cmovsVrm","cmovnsVrm","cmovpeVrm","cmovpoVrm",[m
[31m-"cmovlVrm","cmovgeVrm","cmovleVrm","cmovgVrm",[m
[31m---5x[m
[31m-"movmskpsVrXm$||movmskpdVrXm$","sqrtpsXrm|sqrtssXrm|sqrtpdXrm|sqrtsdXrm",[m
[31m-"rsqrtpsXrm|rsqrtssXrvm","rcppsXrm|rcpssXrvm",[m
[31m-"andpsXrvm||andpdXrvm","andnpsXrvm||andnpdXrvm",[m
[31m-"orpsXrvm||orpdXrvm","xorpsXrvm||xorpdXrvm",[m
[31m-"addpsXrvm|addssXrvm|addpdXrvm|addsdXrvm","mulpsXrvm|mulssXrvm|mulpdXrvm|mulsdXrvm",[m
[31m-"cvtps2pdXrm|cvtss2sdXrvm|cvtpd2psXrm|cvtsd2ssXrvm",[m
[31m-"cvtdq2psXrm|cvttps2dqXrm|cvtps2dqXrm",[m
[31m-"subpsXrvm|subssXrvm|subpdXrvm|subsdXrvm","minpsXrvm|minssXrvm|minpdXrvm|minsdXrvm",[m
[31m-"divpsXrvm|divssXrvm|divpdXrvm|divsdXrvm","maxpsXrvm|maxssXrvm|maxpdXrvm|maxsdXrvm",[m
[31m---6x[m
[31m-"punpcklbwPrvm","punpcklwdPrvm","punpckldqPrvm","packsswbPrvm",[m
[31m-"pcmpgtbPrvm","pcmpgtwPrvm","pcmpgtdPrvm","packuswbPrvm",[m
[31m-"punpckhbwPrvm","punpckhwdPrvm","punpckhdqPrvm","packssdwPrvm",[m
[31m-"||punpcklqdqXrvm","||punpckhqdqXrvm",[m
[31m-"movPrVSm","movqMrm|movdquXrm|movdqaXrm",[m
[31m---7x[m
[31m-"pshufwMrmu|pshufhwXrmu|pshufdXrmu|pshuflwXrmu","pshiftw!Pvmu",[m
[31m-"pshiftd!Pvmu","pshiftq!Mvmu||pshiftdq!Xvmu",[m
[31m-"pcmpeqbPrvm","pcmpeqwPrvm","pcmpeqdPrvm","emms*|",[m
[31m-"vmreadUmr||extrqXmuu$|insertqXrmuu$","vmwriteUrm||extrqXrm$|insertqXrm$",[m
[31m-nil,nil,[m
[31m-"||haddpdXrvm|haddpsXrvm","||hsubpdXrvm|hsubpsXrvm",[m
[31m-"movVSmMr|movqXrm|movVSmXr","movqMmr|movdquXmr|movdqaXmr",[m
[31m---8x[m
[31m-"joVj","jnoVj","jbVj","jnbVj","jzVj","jnzVj","jbeVj","jaVj",[m
[31m-"jsVj","jnsVj","jpeVj","jpoVj","jlVj","jgeVj","jleVj","jgVj",[m
[31m---9x[m
[31m-"setoBm","setnoBm","setbBm","setnbBm","setzBm","setnzBm","setbeBm","setaBm",[m
[31m-"setsBm","setnsBm","setpeBm","setpoBm","setlBm","setgeBm","setleBm","setgBm",[m
[31m---Ax[m
[31m-"push fs","pop fs","cpuid","btVmr","shldVmru","shldVmrc",nil,nil,[m
[31m-"push gs","pop gs","rsm","btsVmr","shrdVmru","shrdVmrc","fxsave!Dmp","imulVrm",[m
[31m---Bx[m
[31m-"cmpxchgBmr","cmpxchgVmr","$lssVrm","btrVmr",[m
[31m-"$lfsVrm","$lgsVrm","movzxVrBmt","movzxVrWmt",[m
[31m-"|popcntVrm","ud2Dp","bt!Vmu","btcVmr",[m
[31m-"bsfVrm","bsrVrm|lzcntVrm|bsrWrm","movsxVrBmt","movsxVrWmt",[m
[31m---Cx[m
[31m-"xaddBmr","xaddVmr",[m
[31m-"cmppsXrvmu|cmpssXrvmu|cmppdXrvmu|cmpsdXrvmu","$movntiVmr|",[m
[31m-"pinsrwPrvWmu","pextrwDrPmu",[m
[31m-"shufpsXrvmu||shufpdXrvmu","$cmpxchg!Qmp",[m
[31m-"bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR",[m
[31m---Dx[m
[31m-"||addsubpdXrvm|addsubpsXrvm","psrlwPrvm","psrldPrvm","psrlqPrvm",[m
[31m-"paddqPrvm","pmullwPrvm",[m
[31m-"|movq2dqXrMm|movqXmr|movdq2qMrXm$","pmovmskbVrMm||pmovmskbVrXm",[m
[31m-"psubusbPrvm","psubuswPrvm","pminubPrvm","pandPrvm",[m
[31m-"paddusbPrvm","padduswPrvm","pmaxubPrvm","pandnPrvm",[m
[31m---Ex[m
[31m-"pavgbPrvm","psrawPrvm","psradPrvm","pavgwPrvm",[m
[31m-"pmulhuwPrvm","pmulhwPrvm",[m
[31m-"|cvtdq2pdXrm|cvttpd2dqXrm|cvtpd2dqXrm","$movntqMmr||$movntdqXmr",[m
[31m-"psubsbPrvm","psubswPrvm","pminswPrvm","porPrvm",[m
[31m-"paddsbPrvm","paddswPrvm","pmaxswPrvm","pxorPrvm",[m
[31m---Fx[m
[31m-"|||lddquXrm","psllwPrvm","pslldPrvm","psllqPrvm",[m
[31m-"pmuludqPrvm","pmaddwdPrvm","psadbwPrvm","maskmovqMrm||maskmovdquXrm$",[m
[31m-"psubbPrvm","psubwPrvm","psubdPrvm","psubqPrvm",[m
[31m-"paddbPrvm","paddwPrvm","padddPrvm","ud",[m
[31m-}[m
[31m-assert(map_opc2[255] == "ud")[m
[31m-[m
[31m--- Map for three-byte opcodes. Can't wait for their next invention.[m
[31m-local map_opc3 = {[m
[31m-["38"] = { -- [66] 0f 38 xx[m
[31m---0x[m
[31m-[0]="pshufbPrvm","phaddwPrvm","phadddPrvm","phaddswPrvm",[m
[31m-"pmaddubswPrvm","phsubwPrvm","phsubdPrvm","phsubswPrvm",[m
[31m-"psignbPrvm","psignwPrvm","psigndPrvm","pmulhrswPrvm",[m
[31m-"||permilpsXrvm","||permilpdXrvm",nil,nil,[m
[31m---1x[m
[31m-"||pblendvbXrma",nil,nil,nil,[m
[31m-"||blendvpsXrma","||blendvpdXrma","||permpsXrvm","||ptestXrm",[m
[31m-"||broadcastssXrm","||broadcastsdXrm","||broadcastf128XrlXm",nil,[m
[31m-"pabsbPrm","pabswPrm","pabsdPrm",nil,[m
[31m---2x[m
[31m-"||pmovsxbwXrm","||pmovsxbdXrm","||pmovsxbqXrm","||pmovsxwdXrm",[m
[31m-"||pmovsxwqXrm","||pmovsxdqXrm",nil,nil,[m
[31m-"||pmuldqXrvm","||pcmpeqqXrvm","||$movntdqaXrm","||packusdwXrvm",[m
[31m-"||maskmovpsXrvm","||maskmovpdXrvm","||maskmovpsXmvr","||maskmovpdXmvr",[m
[31m---3x[m
[31m-"||pmovzxbwXrm","||pmovzxbdXrm","||pmovzxbqXrm","||pmovzxwdXrm",[m
[31m-"||pmovzxwqXrm","||pmovzxdqXrm","||permdXrvm","||pcmpgtqXrvm",[m
[31m-"||pminsbXrvm","||pminsdXrvm","||pminuwXrvm","||pminudXrvm",[m
[31m-"||pmaxsbXrvm","||pmaxsdXrvm","||pmaxuwXrvm","||pmaxudXrvm",[m
[31m---4x[m
[31m-"||pmulddXrvm","||phminposuwXrm",nil,nil,[m
[31m-nil,"||psrlvVSXrvm","||psravdXrvm","||psllvVSXrvm",[m
[31m---5x[m
[31m-[0x58] = "||pbroadcastdXrlXm",[0x59] = "||pbroadcastqXrlXm",[m
[31m-[0x5a] = "||broadcasti128XrlXm",[m
[31m---7x[m
[31m-[0x78] = "||pbroadcastbXrlXm",[0x79] = "||pbroadcastwXrlXm",[m
[31m---8x[m
[31m-[0x8c] = "||pmaskmovXrvVSm",[m
[31m-[0x8e] = "||pmaskmovVSmXvr",[m
[31m---Dx[m
[31m-[0xdc] = "||aesencXrvm", [0xdd] = "||aesenclastXrvm",[m
[31m-[0xde] = "||aesdecXrvm", [0xdf] = "||aesdeclastXrvm",[m
[31m---Fx[m
[31m-[0xf0] = "|||crc32TrBmt",[0xf1] = "|||crc32TrVmt",[m
[31m-[0xf7] = "| sarxVrmv| shlxVrmv| shrxVrmv",[m
[31m-},[m
[31m-[m
[31m-["3a"] = { -- [66] 0f 3a xx[m
[31m---0x[m
[31m-[0x00]="||permqXrmu","||permpdXrmu","||pblenddXrvmu",nil,[m
[31m-"||permilpsXrmu","||permilpdXrmu","||perm2f128Xrvmu",nil,[m
[31m-"||roundpsXrmu","||roundpdXrmu","||roundssXrvmu","||roundsdXrvmu",[m
[31m-"||blendpsXrvmu","||blendpdXrvmu","||pblendwXrvmu","palignrPrvmu",[m
[31m---1x[m
[31m-nil,nil,nil,nil,[m
[31m-"||pextrbVmXru","||pextrwVmXru","||pextrVmSXru","||extractpsVmXru",[m
[31m-"||insertf128XrvlXmu","||extractf128XlXmYru",nil,nil,[m
[31m-nil,nil,nil,nil,[m
[31m---2x[m
[31m-"||pinsrbXrvVmu","||insertpsXrvmu","||pinsrXrvVmuS",nil,[m
[31m---3x[m
[31m-[0x38] = "||inserti128Xrvmu",[0x39] = "||extracti128XlXmYru",[m
[31m---4x[m
[31m-[0x40] = "||dppsXrvmu",[m
[31m-[0x41] = "||dppdXrvmu",[m
[31m-[0x42] = "||mpsadbwXrvmu",[m
[31m-[0x44] = "||pclmulqdqXrvmu",[m
[31m-[0x46] = "||perm2i128Xrvmu",[m
[31m-[0x4a] = "||blendvpsXrvmb",[0x4b] = "||blendvpdXrvmb",[m
[31m-[0x4c] = "||pblendvbXrvmb",[m
[31m---6x[m
[31m-[0x60] = "||pcmpestrmXrmu",[0x61] = "||pcmpestriXrmu",[m
[31m-[0x62] = "||pcmpistrmXrmu",[0x63] = "||pcmpistriXrmu",[m
[31m-[0xdf] = "||aeskeygenassistXrmu",[m
[31m---Fx[m
[31m-[0xf0] = "||| rorxVrmu",[m
[31m-},[m
[31m-}[m
[31m-[m
[31m--- Map for VMX/SVM opcodes 0F 01 C0-FF (sgdt group with register operands).[m
[31m-local map_opcvm = {[m
[31m-[0xc1]="vmcall",[0xc2]="vmlaunch",[0xc3]="vmresume",[0xc4]="vmxoff",[m
[31m-[0xc8]="monitor",[0xc9]="mwait",[m
[31m-[0xd8]="vmrun",[0xd9]="vmmcall",[0xda]="vmload",[0xdb]="vmsave",[m
[31m-[0xdc]="stgi",[0xdd]="clgi",[0xde]="skinit",[0xdf]="invlpga",[m
[31m-[0xf8]="swapgs",[0xf9]="rdtscp",[m
[31m-}[m
[31m-[m
[31m--- Map for FP opcodes. And you thought stack machines are simple?[m
[31m-local map_opcfp = {[m
[31m--- D8-DF 00-BF: opcodes with a memory operand.[m
[31m--- D8[m
[31m-[0]="faddFm","fmulFm","fcomFm","fcompFm","fsubFm","fsubrFm","fdivFm","fdivrFm",[m
[31m-"fldFm",nil,"fstFm","fstpFm","fldenvVm","fldcwWm","fnstenvVm","fnstcwWm",[m
[31m--- DA[m
[31m-"fiaddDm","fimulDm","ficomDm","ficompDm",[m
[31m-"fisubDm","fisubrDm","fidivDm","fidivrDm",[m
[31m--- DB[m
[31m-"fildDm","fisttpDm","fistDm","fistpDm",nil,"fld twordFmp",nil,"fstp twordFmp",[m
[31m--- DC[m
[31m-"faddGm","fmulGm","fcomGm","fcompGm","fsubGm","fsubrGm","fdivGm","fdivrGm",[m
[31m--- DD[m
[31m-"fldGm","fisttpQm","fstGm","fstpGm","frstorDmp",nil,"fnsaveDmp","fnstswWm",[m
[31m--- DE[m
[31m-"fiaddWm","fimulWm","ficomWm","ficompWm",[m
[31m-"fisubWm","fisubrWm","fidivWm","fidivrWm",[m
[31m--- DF[m
[31m-"fildWm","fisttpWm","fistWm","fistpWm",[m
[31m-"fbld twordFmp","fildQm","fbstp twordFmp","fistpQm",[m
[31m--- xx C0-FF: opcodes with a pseudo-register operand.[m
[31m--- D8[m
[31m-"faddFf","fmulFf","fcomFf","fcompFf","fsubFf","fsubrFf","fdivFf","fdivrFf",[m
[31m--- D9[m
[31m-"fldFf","fxchFf",{"fnop"},nil,[m
[31m-{"fchs","fabs",nil,nil,"ftst","fxam"},[m
[31m-{"fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz"},[m
[31m-{"f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp"},[m
[31m-{"fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos"},[m
[31m--- DA[m
[31m-"fcmovbFf","fcmoveFf","fcmovbeFf","fcmovuFf",nil,{nil,"fucompp"},nil,nil,[m
[31m--- DB[m
[31m-"fcmovnbFf","fcmovneFf","fcmovnbeFf","fcmovnuFf",[m
[31m-{nil,nil,"fnclex","fninit"},"fucomiFf","fcomiFf",nil,[m
[31m--- DC[m
[31m-"fadd toFf","fmul toFf",nil,nil,[m
[31m-"fsub toFf","fsubr toFf","fdivr toFf","fdiv toFf",[m
[31m--- DD[m
[31m-"ffreeFf",nil,"fstFf","fstpFf","fucomFf","fucompFf",nil,nil,[m
[31m--- DE[m
[31m-"faddpFf","fmulpFf",nil,{nil,"fcompp"},[m
[31m-"fsubrpFf","fsubpFf","fdivrpFf","fdivpFf",[m
[31m--- DF[m
[31m-nil,nil,nil,nil,{"fnstsw ax"},"fucomipFf","fcomipFf",nil,[m
[31m-}[m
[31m-assert(map_opcfp[126] == "fcomipFf")[m
[31m-[m
[31m--- Map for opcode groups. The subkey is sp from the ModRM byte.[m
[31m-local map_opcgroup = {[m
[31m-  arith = { "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" },[m
[31m-  shift = { "rol", "ror", "rcl", "rcr", "shl", "shr", "sal", "sar" },[m
[31m-  testb = { "testBmi", "testBmi", "not", "neg", "mul", "imul", "div", "idiv" },[m
[31m-  testv = { "testVmi", "testVmi", "not", "neg", "mul", "imul", "div", "idiv" },[m
[31m-  incb = { "inc", "dec" },[m
[31m-  incd = { "inc", "dec", "callUmp", "$call farDmp",[m
[31m-	   "jmpUmp", "$jmp farDmp", "pushUm" },[m
[31m-  sldt = { "sldt", "str", "lldt", "ltr", "verr", "verw" },[m
[31m-  sgdt = { "vm*$sgdt", "vm*$sidt", "$lgdt", "vm*$lidt",[m
[31m-	   "smsw", nil, "lmsw", "vm*$invlpg" },[m
[31m-  bt = { nil, nil, nil, nil, "bt", "bts", "btr", "btc" },[m
[31m-  cmpxchg = { nil, "sz*,cmpxchg8bQmp,cmpxchg16bXmp", nil, nil,[m
[31m-	      nil, nil, "vmptrld|vmxon|vmclear", "vmptrst" },[m
[31m-  pshiftw = { nil, nil, "psrlw", nil, "psraw", nil, "psllw" },[m
[31m-  pshiftd = { nil, nil, "psrld", nil, "psrad", nil, "pslld" },[m
[31m-  pshiftq = { nil, nil, "psrlq", nil, nil, nil, "psllq" },[m
[31m-  pshiftdq = { nil, nil, "psrlq", "psrldq", nil, nil, "psllq", "pslldq" },[m
[31m-  fxsave = { "$fxsave", "$fxrstor", "$ldmxcsr", "$stmxcsr",[m
[31m-	     nil, "lfenceDp$", "mfenceDp$", "sfenceDp$clflush" },[m
[31m-  prefetch = { "prefetch", "prefetchw" },[m
[31m-  prefetcht = { "prefetchnta", "prefetcht0", "prefetcht1", "prefetcht2" },[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Maps for register names.[m
[31m-local map_regs = {[m
[31m-  B = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",[m
[31m-	"r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" },[m
[31m-  B64 = { "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",[m
[31m-	  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" },[m
[31m-  W = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",[m
[31m-	"r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" },[m
[31m-  D = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",[m
[31m-	"r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" },[m
[31m-  Q = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",[m
[31m-	"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" },[m
[31m-  M = { "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",[m
[31m-	"mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7" }, -- No x64 ext![m
[31m-  X = { "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",[m
[31m-	"xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" },[m
[31m-  Y = { "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",[m
[31m-	"ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15" },[m
[31m-}[m
[31m-local map_segregs = { "es", "cs", "ss", "ds", "fs", "gs", "segr6", "segr7" }[m
[31m-[m
[31m--- Maps for size names.[m
[31m-local map_sz2n = {[m
[31m-  B = 1, W = 2, D = 4, Q = 8, M = 8, X = 16, Y = 32,[m
[31m-}[m
[31m-local map_sz2prefix = {[m
[31m-  B = "byte", W = "word", D = "dword",[m
[31m-  Q = "qword",[m
[31m-  M = "qword", X = "xword", Y = "yword",[m
[31m-  F = "dword", G = "qword", -- No need for sizes/register names for these two.[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local code, pos, hex = ctx.code, ctx.pos, ""[m
[31m-  local hmax = ctx.hexdump[m
[31m-  if hmax > 0 then[m
[31m-    for i=ctx.start,pos-1 do[m
[31m-      hex = hex..format("%02X", byte(code, i, i))[m
[31m-    end[m
[31m-    if #hex > hmax then hex = sub(hex, 1, hmax)..". "[m
[31m-    else hex = hex..rep(" ", hmax-#hex+2) end[m
[31m-  end[m
[31m-  if operands then text = text.." "..operands end[m
[31m-  if ctx.o16 then text = "o16 "..text; ctx.o16 = false end[m
[31m-  if ctx.a32 then text = "a32 "..text; ctx.a32 = false end[m
[31m-  if ctx.rep then text = ctx.rep.." "..text; ctx.rep = false end[m
[31m-  if ctx.rex then[m
[31m-    local t = (ctx.rexw and "w" or "")..(ctx.rexr and "r" or "")..[m
[31m-	      (ctx.rexx and "x" or "")..(ctx.rexb and "b" or "")..[m
[31m-	      (ctx.vexl and "l" or "")[m
[31m-    if ctx.vexv and ctx.vexv ~= 0 then t = t.."v"..ctx.vexv end[m
[31m-    if t ~= "" then text = ctx.rex.."."..t.." "..gsub(text, "^ ", "")[m
[31m-    elseif ctx.rex == "vex" then text = gsub("v"..text, "^v ", "") end[m
[31m-    ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false[m
[31m-    ctx.rex = false; ctx.vexl = false; ctx.vexv = false[m
[31m-  end[m
[31m-  if ctx.seg then[m
[31m-    local text2, n = gsub(text, "%[", "["..ctx.seg..":")[m
[31m-    if n == 0 then text = ctx.seg.." "..text else text = text2 end[m
[31m-    ctx.seg = false[m
[31m-  end[m
[31m-  if ctx.lock then text = "lock "..text; ctx.lock = false end[m
[31m-  local imm = ctx.imm[m
[31m-  if imm then[m
[31m-    local sym = ctx.symtab[imm][m
[31m-    if sym then text = text.."\t->"..sym end[m
[31m-  end[m
[31m-  ctx.out(format("%08x  %s%s\n", ctx.addr+ctx.start, hex, text))[m
[31m-  ctx.mrm = false[m
[31m-  ctx.vexv = false[m
[31m-  ctx.start = pos[m
[31m-  ctx.imm = nil[m
[31m-end[m
[31m-[m
[31m--- Clear all prefix flags.[m
[31m-local function clearprefixes(ctx)[m
[31m-  ctx.o16 = false; ctx.seg = false; ctx.lock = false; ctx.rep = false[m
[31m-  ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false[m
[31m-  ctx.rex = false; ctx.a32 = false; ctx.vexl = false[m
[31m-end[m
[31m-[m
[31m--- Fallback for incomplete opcodes at the end.[m
[31m-local function incomplete(ctx)[m
[31m-  ctx.pos = ctx.stop+1[m
[31m-  clearprefixes(ctx)[m
[31m-  return putop(ctx, "(incomplete)")[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  clearprefixes(ctx)[m
[31m-  return putop(ctx, "(unknown)")[m
[31m-end[m
[31m-[m
[31m--- Return an immediate of the specified size.[m
[31m-local function getimm(ctx, pos, n)[m
[31m-  if pos+n-1 > ctx.stop then return incomplete(ctx) end[m
[31m-  local code = ctx.code[m
[31m-  if n == 1 then[m
[31m-    local b1 = byte(code, pos, pos)[m
[31m-    return b1[m
[31m-  elseif n == 2 then[m
[31m-    local b1, b2 = byte(code, pos, pos+1)[m
[31m-    return b1+b2*256[m
[31m-  else[m
[31m-    local b1, b2, b3, b4 = byte(code, pos, pos+3)[m
[31m-    local imm = b1+b2*256+b3*65536+b4*16777216[m
[31m-    ctx.imm = imm[m
[31m-    return imm[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Process pattern string and generate the operands.[m
[31m-local function putpat(ctx, name, pat)[m
[31m-  local operands, regs, sz, mode, sp, rm, sc, rx, sdisp[m
[31m-  local code, pos, stop, vexl = ctx.code, ctx.pos, ctx.stop, ctx.vexl[m
[31m-[m
[31m-  -- Chars used: 1DFGIMPQRSTUVWXYabcdfgijlmoprstuvwxyz[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "V" or p == "U" then[m
[31m-      if ctx.rexw then sz = "Q"; ctx.rexw = false[m
[31m-      elseif ctx.o16 then sz = "W"; ctx.o16 = false[m
[31m-      elseif p == "U" and ctx.x64 then sz = "Q"[m
[31m-      else sz = "D" end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "T" then[m
[31m-      if ctx.rexw then sz = "Q"; ctx.rexw = false else sz = "D" end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "B" then[m
[31m-      sz = "B"[m
[31m-      regs = ctx.rex and map_regs.B64 or map_regs.B[m
[31m-    elseif match(p, "[WDQMXYFG]") then[m
[31m-      sz = p[m
[31m-      if sz == "X" and vexl then sz = "Y"; ctx.vexl = false end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "P" then[m
[31m-      sz = ctx.o16 and "X" or "M"; ctx.o16 = false[m
[31m-      if sz == "X" and vexl then sz = "Y"; ctx.vexl = false end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "S" then[m
[31m-      name = name..lower(sz)[m
[31m-    elseif p == "s" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = imm <= 127 and format("+0x%02x", imm)[m
[31m-		     or format("-0x%02x", 256-imm)[m
[31m-      pos = pos+1[m
[31m-    elseif p == "u" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = format("0x%02x", imm)[m
[31m-      pos = pos+1[m
[31m-    elseif p == "b" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = regs[imm/16+1][m
[31m-      pos = pos+1[m
[31m-    elseif p == "w" then[m
[31m-      local imm = getimm(ctx, pos, 2); if not imm then return end[m
[31m-      x = format("0x%x", imm)[m
[31m-      pos = pos+2[m
[31m-    elseif p == "o" then -- [offset][m
[31m-      if ctx.x64 then[m
[31m-	local imm1 = getimm(ctx, pos, 4); if not imm1 then return end[m
[31m-	local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end[m
[31m-	x = format("[0x%08x%08x]", imm2, imm1)[m
[31m-	pos = pos+8[m
[31m-      else[m
[31m-	local imm = getimm(ctx, pos, 4); if not imm then return end[m
[31m-	x = format("[0x%08x]", imm)[m
[31m-	pos = pos+4[m
[31m-      end[m
[31m-    elseif p == "i" or p == "I" then[m
[31m-      local n = map_sz2n[sz][m
[31m-      if n == 8 and ctx.x64 and p == "I" then[m
[31m-	local imm1 = getimm(ctx, pos, 4); if not imm1 then return end[m
[31m-	local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end[m
[31m-	x = format("0x%08x%08x", imm2, imm1)[m
[31m-      else[m
[31m-	if n == 8 then n = 4 end[m
[31m-	local imm = getimm(ctx, pos, n); if not imm then return end[m
[31m-	if sz == "Q" and (imm < 0 or imm > 0x7fffffff) then[m
[31m-	  imm = (0xffffffff+1)-imm[m
[31m-	  x = format(imm > 65535 and "-0x%08x" or "-0x%x", imm)[m
[31m-	else[m
[31m-	  x = format(imm > 65535 and "0x%08x" or "0x%x", imm)[m
[31m-	end[m
[31m-      end[m
[31m-      pos = pos+n[m
[31m-    elseif p == "j" then[m
[31m-      local n = map_sz2n[sz][m
[31m-      if n == 8 then n = 4 end[m
[31m-      local imm = getimm(ctx, pos, n); if not imm then return end[m
[31m-      if sz == "B" and imm > 127 then imm = imm-256[m
[31m-      elseif imm > 2147483647 then imm = imm-4294967296 end[m
[31m-      pos = pos+n[m
[31m-      imm = imm + pos + ctx.addr[m
[31m-      if imm > 4294967295 and not ctx.x64 then imm = imm-4294967296 end[m
[31m-      ctx.imm = imm[m
[31m-      if sz == "W" then[m
[31m-	x = format("word 0x%04x", imm%65536)[m
[31m-      elseif ctx.x64 then[m
[31m-	local lo = imm % 0x1000000[m
[31m-	x = format("0x%02x%06x", (imm-lo) / 0x1000000, lo)[m
[31m-      else[m
[31m-	x = "0x"..tohex(imm)[m
[31m-      end[m
[31m-    elseif p == "R" then[m
[31m-      local r = byte(code, pos-1, pos-1)%8[m
[31m-      if ctx.rexb then r = r + 8; ctx.rexb = false end[m
[31m-      x = regs[r+1][m
[31m-    elseif p == "a" then x = regs[1][m
[31m-    elseif p == "c" then x = "cl"[m
[31m-    elseif p == "d" then x = "dx"[m
[31m-    elseif p == "1" then x = "1"[m
[31m-    else[m
[31m-      if not mode then[m
[31m-	mode = ctx.mrm[m
[31m-	if not mode then[m
[31m-	  if pos > stop then return incomplete(ctx) end[m
[31m-	  mode = byte(code, pos, pos)[m
[31m-	  pos = pos+1[m
[31m-	end[m
[31m-	rm = mode%8; mode = (mode-rm)/8[m
[31m-	sp = mode%8; mode = (mode-sp)/8[m
[31m-	sdisp = ""[m
[31m-	if mode < 3 then[m
[31m-	  if rm == 4 then[m
[31m-	    if pos > stop then return incomplete(ctx) end[m
[31m-	    sc = byte(code, pos, pos)[m
[31m-	    pos = pos+1[m
[31m-	    rm = sc%8; sc = (sc-rm)/8[m
[31m-	    rx = sc%8; sc = (sc-rx)/8[m
[31m-	    if ctx.rexx then rx = rx + 8; ctx.rexx = false end[m
[31m-	    if rx == 4 then rx = nil end[m
[31m-	  end[m
[31m-	  if mode > 0 or rm == 5 then[m
[31m-	    local dsz = mode[m
[31m-	    if dsz ~= 1 then dsz = 4 end[m
[31m-	    local disp = getimm(ctx, pos, dsz); if not disp then return end[m
[31m-	    if mode == 0 then rm = nil end[m
[31m-	    if rm or rx or (not sc and ctx.x64 and not ctx.a32) then[m
[31m-	      if dsz == 1 and disp > 127 then[m
[31m-		sdisp = format("-0x%x", 256-disp)[m
[31m-	      elseif disp >= 0 and disp <= 0x7fffffff then[m
[31m-		sdisp = format("+0x%x", disp)[m
[31m-	      else[m
[31m-		sdisp = format("-0x%x", (0xffffffff+1)-disp)[m
[31m-	      end[m
[31m-	    else[m
[31m-	      sdisp = format(ctx.x64 and not ctx.a32 and[m
[31m-		not (disp >= 0 and disp <= 0x7fffffff)[m
[31m-		and "0xffffffff%08x" or "0x%08x", disp)[m
[31m-	    end[m
[31m-	    pos = pos+dsz[m
[31m-	  end[m
[31m-	end[m
[31m-	if rm and ctx.rexb then rm = rm + 8; ctx.rexb = false end[m
[31m-	if ctx.rexr then sp = sp + 8; ctx.rexr = false end[m
[31m-      end[m
[31m-      if p == "m" then[m
[31m-	if mode == 3 then x = regs[rm+1][m
[31m-	else[m
[31m-	  local aregs = ctx.a32 and map_regs.D or ctx.aregs[m
[31m-	  local srm, srx = "", ""[m
[31m-	  if rm then srm = aregs[rm+1][m
[31m-	  elseif not sc and ctx.x64 and not ctx.a32 then srm = "rip" end[m
[31m-	  ctx.a32 = false[m
[31m-	  if rx then[m
[31m-	    if rm then srm = srm.."+" end[m
[31m-	    srx = aregs[rx+1][m
[31m-	    if sc > 0 then srx = srx.."*"..(2^sc) end[m
[31m-	  end[m
[31m-	  x = format("[%s%s%s]", srm, srx, sdisp)[m
[31m-	end[m
[31m-	if mode < 3 and[m
[31m-	   (not match(pat, "[aRrgp]") or match(pat, "t")) then -- Yuck.[m
[31m-	  x = map_sz2prefix[sz].." "..x[m
[31m-	end[m
[31m-      elseif p == "r" then x = regs[sp+1][m
[31m-      elseif p == "g" then x = map_segregs[sp+1][m
[31m-      elseif p == "p" then -- Suppress prefix.[m
[31m-      elseif p == "f" then x = "st"..rm[m
[31m-      elseif p == "x" then[m
[31m-	if sp == 0 and ctx.lock and not ctx.x64 then[m
[31m-	  x = "CR8"; ctx.lock = false[m
[31m-	else[m
[31m-	  x = "CR"..sp[m
[31m-	end[m
[31m-      elseif p == "v" then[m
[31m-	if ctx.vexv then[m
[31m-	  x = regs[ctx.vexv+1]; ctx.vexv = false[m
[31m-	end[m
[31m-      elseif p == "y" then x = "DR"..sp[m
[31m-      elseif p == "z" then x = "TR"..sp[m
[31m-      elseif p == "l" then vexl = false[m
[31m-      elseif p == "t" then[m
[31m-      else[m
[31m-	error("bad pattern `"..pat.."'")[m
[31m-      end[m
[31m-    end[m
[31m-    if x then operands = operands and operands..", "..x or x end[m
[31m-  end[m
[31m-  ctx.pos = pos[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m--- Forward declaration.[m
[31m-local map_act[m
[31m-[m
[31m--- Fetch and cache MRM byte.[m
[31m-local function getmrm(ctx)[m
[31m-  local mrm = ctx.mrm[m
[31m-  if not mrm then[m
[31m-    local pos = ctx.pos[m
[31m-    if pos > ctx.stop then return nil end[m
[31m-    mrm = byte(ctx.code, pos, pos)[m
[31m-    ctx.pos = pos+1[m
[31m-    ctx.mrm = mrm[m
[31m-  end[m
[31m-  return mrm[m
[31m-end[m
[31m-[m
[31m--- Dispatch to handler depending on pattern.[m
[31m-local function dispatch(ctx, opat, patgrp)[m
[31m-  if not opat then return unknown(ctx) end[m
[31m-  if match(opat, "%|") then -- MMX/SSE variants depending on prefix.[m
[31m-    local p[m
[31m-    if ctx.rep then[m
[31m-      p = ctx.rep=="rep" and "%|([^%|]*)" or "%|[^%|]*%|[^%|]*%|([^%|]*)"[m
[31m-      ctx.rep = false[m
[31m-    elseif ctx.o16 then p = "%|[^%|]*%|([^%|]*)"; ctx.o16 = false[m
[31m-    else p = "^[^%|]*" end[m
[31m-    opat = match(opat, p)[m
[31m-    if not opat then return unknown(ctx) end[m
[31m---    ctx.rep = false; ctx.o16 = false[m
[31m-    --XXX fails for 66 f2 0f 38 f1 06  crc32 eax,WORD PTR [esi][m
[31m-    --XXX remove in branches?[m
[31m-  end[m
[31m-  if match(opat, "%$") then -- reg$mem variants.[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    opat = match(opat, mrm >= 192 and "^[^%$]*" or "%$(.*)")[m
[31m-    if opat == "" then return unknown(ctx) end[m
[31m-  end[m
[31m-  if opat == "" then return unknown(ctx) end[m
[31m-  local name, pat = match(opat, "^([a-z0-9 ]*)(.*)")[m
[31m-  if pat == "" and patgrp then pat = patgrp end[m
[31m-  return map_act[sub(pat, 1, 1)](ctx, name, pat)[m
[31m-end[m
[31m-[m
[31m--- Get a pattern from an opcode map and dispatch to handler.[m
[31m-local function dispatchmap(ctx, opcmap)[m
[31m-  local pos = ctx.pos[m
[31m-  local opat = opcmap[byte(ctx.code, pos, pos)][m
[31m-  pos = pos + 1[m
[31m-  ctx.pos = pos[m
[31m-  return dispatch(ctx, opat)[m
[31m-end[m
[31m-[m
[31m--- Map for action codes. The key is the first char after the name.[m
[31m-map_act = {[m
[31m-  -- Simple opcodes without operands.[m
[31m-  [""] = function(ctx, name, pat)[m
[31m-    return putop(ctx, name)[m
[31m-  end,[m
[31m-[m
[31m-  -- Operand size chars fall right through.[m
[31m-  B = putpat, W = putpat, D = putpat, Q = putpat,[m
[31m-  V = putpat, U = putpat, T = putpat,[m
[31m-  M = putpat, X = putpat, P = putpat,[m
[31m-  F = putpat, G = putpat, Y = putpat,[m
[31m-[m
[31m-  -- Collect prefixes.[m
[31m-  [":"] = function(ctx, name, pat)[m
[31m-    ctx[pat == ":" and name or sub(pat, 2)] = name[m
[31m-    if ctx.pos - ctx.start > 5 then return unknown(ctx) end -- Limit #prefixes.[m
[31m-  end,[m
[31m-[m
[31m-  -- Chain to special handler specified by name.[m
[31m-  ["*"] = function(ctx, name, pat)[m
[31m-    return map_act[name](ctx, name, sub(pat, 2))[m
[31m-  end,[m
[31m-[m
[31m-  -- Use named subtable for opcode group.[m
[31m-  ["!"] = function(ctx, name, pat)[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    return dispatch(ctx, map_opcgroup[name][((mrm-(mrm%8))/8)%8+1], sub(pat, 2))[m
[31m-  end,[m
[31m-[m
[31m-  -- o16,o32[,o64] variants.[m
[31m-  sz = function(ctx, name, pat)[m
[31m-    if ctx.o16 then ctx.o16 = false[m
[31m-    else[m
[31m-      pat = match(pat, ",(.*)")[m
[31m-      if ctx.rexw then[m
[31m-	local p = match(pat, ",(.*)")[m
[31m-	if p then pat = p; ctx.rexw = false end[m
[31m-      end[m
[31m-    end[m
[31m-    pat = match(pat, "^[^,]*")[m
[31m-    return dispatch(ctx, pat)[m
[31m-  end,[m
[31m-[m
[31m-  -- Two-byte opcode dispatch.[m
[31m-  opc2 = function(ctx, name, pat)[m
[31m-    return dispatchmap(ctx, map_opc2)[m
[31m-  end,[m
[31m-[m
[31m-  -- Three-byte opcode dispatch.[m
[31m-  opc3 = function(ctx, name, pat)[m
[31m-    return dispatchmap(ctx, map_opc3[pat])[m
[31m-  end,[m
[31m-[m
[31m-  -- VMX/SVM dispatch.[m
[31m-  vm = function(ctx, name, pat)[m
[31m-    return dispatch(ctx, map_opcvm[ctx.mrm])[m
[31m-  end,[m
[31m-[m
[31m-  -- Floating point opcode dispatch.[m
[31m-  fp = function(ctx, name, pat)[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    local rm = mrm%8[m
[31m-    local idx = pat*8 + ((mrm-rm)/8)%8[m
[31m-    if mrm >= 192 then idx = idx + 64 end[m
[31m-    local opat = map_opcfp[idx][m
[31m-    if type(opat) == "table" then opat = opat[rm+1] end[m
[31m-    return dispatch(ctx, opat)[m
[31m-  end,[m
[31m-[m
[31m-  -- REX prefix.[m
[31m-  rex = function(ctx, name, pat)[m
[31m-    if ctx.rex then return unknown(ctx) end -- Only 1 REX or VEX prefix allowed.[m
[31m-    for p in gmatch(pat, ".") do ctx["rex"..p] = true end[m
[31m-    ctx.rex = "rex"[m
[31m-  end,[m
[31m-[m
[31m-  -- VEX prefix.[m
[31m-  vex = function(ctx, name, pat)[m
[31m-    if ctx.rex then return unknown(ctx) end -- Only 1 REX or VEX prefix allowed.[m
[31m-    ctx.rex = "vex"[m
[31m-    local pos = ctx.pos[m
[31m-    if ctx.mrm then[m
[31m-      ctx.mrm = nil[m
[31m-      pos = pos-1[m
[31m-    end[m
[31m-    local b = byte(ctx.code, pos, pos)[m
[31m-    if not b then return incomplete(ctx) end[m
[31m-    pos = pos+1[m
[31m-    if b < 128 then ctx.rexr = true end[m
[31m-    local m = 1[m
[31m-    if pat == "3" then[m
[31m-      m = b%32; b = (b-m)/32[m
[31m-      local nb = b%2; b = (b-nb)/2[m
[31m-      if nb == 0 then ctx.rexb = true end[m
[31m-      local nx = b%2; b = (b-nx)/2[m
[31m-      if nx == 0 then ctx.rexx = true end[m
[31m-      b = byte(ctx.code, pos, pos)[m
[31m-      if not b then return incomplete(ctx) end[m
[31m-      pos = pos+1[m
[31m-      if b >= 128 then ctx.rexw = true end[m
[31m-    end[m
[31m-    ctx.pos = pos[m
[31m-    local map[m
[31m-    if m == 1 then map = map_opc2[m
[31m-    elseif m == 2 then map = map_opc3["38"][m
[31m-    elseif m == 3 then map = map_opc3["3a"][m
[31m-    else return unknown(ctx) end[m
[31m-    local p = b%4; b = (b-p)/4[m
[31m-    if p == 1 then ctx.o16 = "o16"[m
[31m-    elseif p == 2 then ctx.rep = "rep"[m
[31m-    elseif p == 3 then ctx.rep = "repne" end[m
[31m-    local l = b%2; b = (b-l)/2[m
[31m-    if l ~= 0 then ctx.vexl = true end[m
[31m-    ctx.vexv = (-1-b)%16[m
[31m-    return dispatchmap(ctx, map)[m
[31m-  end,[m
[31m-[m
[31m-  -- Special case for nop with REX prefix.[m
[31m-  nop = function(ctx, name, pat)[m
[31m-    return dispatch(ctx, ctx.rex and pat or "nop")[m
[31m-  end,[m
[31m-[m
[31m-  -- Special case for 0F 77.[m
[31m-  emms = function(ctx, name, pat)[m
[31m-    if ctx.rex ~= "vex" then[m
[31m-      return putop(ctx, "emms")[m
[31m-    elseif ctx.vexl then[m
[31m-      ctx.vexl = false[m
[31m-      return putop(ctx, "zeroall")[m
[31m-    else[m
[31m-      return putop(ctx, "zeroupper")[m
[31m-    end[m
[31m-  end,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  ofs = ofs + 1[m
[31m-  ctx.start = ofs[m
[31m-  ctx.pos = ofs[m
[31m-  ctx.stop = stop[m
[31m-  ctx.imm = nil[m
[31m-  ctx.mrm = false[m
[31m-  clearprefixes(ctx)[m
[31m-  while ctx.pos <= stop do dispatchmap(ctx, ctx.map1) end[m
[31m-  if ctx.pos ~= ctx.start then incomplete(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = (addr or 0) - 1[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 16[m
[31m-  ctx.x64 = false[m
[31m-  ctx.map1 = map_opc1_32[m
[31m-  ctx.aregs = map_regs.D[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m-local function create64(code, addr, out)[m
[31m-  local ctx = create(code, addr, out)[m
[31m-  ctx.x64 = true[m
[31m-  ctx.map1 = map_opc1_64[m
[31m-  ctx.aregs = map_regs.Q[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m-local function disass64(code, addr, out)[m
[31m-  create64(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 8 then return map_regs.D[r+1] end[m
[31m-  return map_regs.X[r-7][m
[31m-end[m
[31m-[m
[31m-local function regname64(r)[m
[31m-  if r < 16 then return map_regs.Q[r+1] end[m
[31m-  return map_regs.X[r-15][m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  create64 = create64,[m
[31m-  disass = disass,[m
[31m-  disass64 = disass64,[m
[31m-  regname = regname,[m
[31m-  regname64 = regname64[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dump.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dump.lua[m
[1mdeleted file mode 100644[m
[1mindex 6531c6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/dump.lua[m
[1m+++ /dev/null[m
[36m@@ -1,710 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT compiler dump module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module can be used to debug the JIT compiler itself. It dumps the[m
[31m--- code representations and structures used in various compiler stages.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jdump -e "local x=0; for i=1,1e6 do x=x+i end; print(x)"[m
[31m---   luajit -jdump=im -e "for i=1,1000 do for j=1,1000 do end end" | less -R[m
[31m---   luajit -jdump=is myapp.lua | less -R[m
[31m---   luajit -jdump=-b myapp.lua[m
[31m---   luajit -jdump=+aH,myapp.html myapp.lua[m
[31m---   luajit -jdump=ixT,myapp.dump myapp.lua[m
[31m---[m
[31m--- The first argument specifies the dump mode. The second argument gives[m
[31m--- the output file name. Default output is to stdout, unless the environment[m
[31m--- variable LUAJIT_DUMPFILE is set. The file is overwritten every time the[m
[31m--- module is started.[m
[31m---[m
[31m--- Different features can be turned on or off with the dump mode. If the[m
[31m--- mode starts with a '+', the following features are added to the default[m
[31m--- set of features; a '-' removes them. Otherwise the features are replaced.[m
[31m---[m
[31m--- The following dump features are available (* marks the default):[m
[31m---[m
[31m---  * t  Print a line for each started, ended or aborted trace (see also -jv).[m
[31m---  * b  Dump the traced bytecode.[m
[31m---  * i  Dump the IR (intermediate representation).[m
[31m---    r  Augment the IR with register/stack slots.[m
[31m---    s  Dump the snapshot map.[m
[31m---  * m  Dump the generated machine code.[m
[31m---    x  Print each taken trace exit.[m
[31m---    X  Print each taken trace exit and the contents of all registers.[m
[31m---    a  Print the IR of aborted traces, too.[m
[31m---[m
[31m--- The output format can be set with the following characters:[m
[31m---[m
[31m---    T  Plain text output.[m
[31m---    A  ANSI-colored text output[m
[31m---    H  Colorized HTML + CSS output.[m
[31m---[m
[31m--- The default output format is plain text. It's set to ANSI-colored text[m
[31m--- if the COLORTERM variable is set. Note: this is independent of any output[m
[31m--- redirection, which is actually considered a feature.[m
[31m---[m
[31m--- You probably want to use less -R to enjoy viewing ANSI-colored text from[m
[31m--- a pipe or a file. Add this to your ~/.bashrc: export LESS="-R"[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local funcinfo, funcbc = jutil.funcinfo, jutil.funcbc[m
[31m-local traceinfo, traceir, tracek = jutil.traceinfo, jutil.traceir, jutil.tracek[m
[31m-local tracemc, tracesnap = jutil.tracemc, jutil.tracesnap[m
[31m-local traceexitstub, ircalladdr = jutil.traceexitstub, jutil.ircalladdr[m
[31m-local bit = require("bit")[m
[31m-local band, shl, shr, tohex = bit.band, bit.lshift, bit.rshift, bit.tohex[m
[31m-local sub, gsub, format = string.sub, string.gsub, string.format[m
[31m-local byte, char, rep = string.byte, string.char, string.rep[m
[31m-local type, tostring = type, tostring[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m--- Load other modules on-demand.[m
[31m-local bcline, disass[m
[31m-[m
[31m--- Active flag, output file handle and dump mode.[m
[31m-local active, out, dumpmode[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local symtabmt = { __index = false }[m
[31m-local symtab = {}[m
[31m-local nexitsym = 0[m
[31m-[m
[31m--- Fill nested symbol table with per-trace exit stub addresses.[m
[31m-local function fillsymtab_tr(tr, nexit)[m
[31m-  local t = {}[m
[31m-  symtabmt.__index = t[m
[31m-  if jit.arch == "mips" or jit.arch == "mipsel" then[m
[31m-    t[traceexitstub(tr, 0)] = "exit"[m
[31m-    return[m
[31m-  end[m
[31m-  for i=0,nexit-1 do[m
[31m-    local addr = traceexitstub(tr, i)[m
[31m-    if addr < 0 then addr = addr + 2^32 end[m
[31m-    t[addr] = tostring(i)[m
[31m-  end[m
[31m-  local addr = traceexitstub(tr, nexit)[m
[31m-  if addr then t[addr] = "stack_check" end[m
[31m-end[m
[31m-[m
[31m--- Fill symbol table with trace exit stub addresses.[m
[31m-local function fillsymtab(tr, nexit)[m
[31m-  local t = symtab[m
[31m-  if nexitsym == 0 then[m
[31m-    local ircall = vmdef.ircall[m
[31m-    for i=0,#ircall do[m
[31m-      local addr = ircalladdr(i)[m
[31m-      if addr ~= 0 then[m
[31m-	if addr < 0 then addr = addr + 2^32 end[m
[31m-	t[addr] = ircall[i][m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  if nexitsym == 1000000 then -- Per-trace exit stubs.[m
[31m-    fillsymtab_tr(tr, nexit)[m
[31m-  elseif nexit > nexitsym then -- Shared exit stubs.[m
[31m-    for i=nexitsym,nexit-1 do[m
[31m-      local addr = traceexitstub(i)[m
[31m-      if addr == nil then -- Fall back to per-trace exit stubs.[m
[31m-	fillsymtab_tr(tr, nexit)[m
[31m-	setmetatable(symtab, symtabmt)[m
[31m-	nexit = 1000000[m
[31m-	break[m
[31m-      end[m
[31m-      if addr < 0 then addr = addr + 2^32 end[m
[31m-      t[addr] = tostring(i)[m
[31m-    end[m
[31m-    nexitsym = nexit[m
[31m-  end[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m-local function dumpwrite(s)[m
[31m-  out:write(s)[m
[31m-end[m
[31m-[m
[31m--- Disassemble machine code.[m
[31m-local function dump_mcode(tr)[m
[31m-  local info = traceinfo(tr)[m
[31m-  if not info then return end[m
[31m-  local mcode, addr, loop = tracemc(tr)[m
[31m-  if not mcode then return end[m
[31m-  if not disass then disass = require("jit.dis_"..jit.arch) end[m
[31m-  if addr < 0 then addr = addr + 2^32 end[m
[31m-  out:write("---- TRACE ", tr, " mcode ", #mcode, "\n")[m
[31m-  local ctx = disass.create(mcode, addr, dumpwrite)[m
[31m-  ctx.hexdump = 0[m
[31m-  ctx.symtab = fillsymtab(tr, info.nexit)[m
[31m-  if loop ~= 0 then[m
[31m-    symtab[addr+loop] = "LOOP"[m
[31m-    ctx:disass(0, loop)[m
[31m-    out:write("->LOOP:\n")[m
[31m-    ctx:disass(loop, #mcode-loop)[m
[31m-    symtab[addr+loop] = nil[m
[31m-  else[m
[31m-    ctx:disass(0, #mcode)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local irtype_text = {[m
[31m-  [0] = "nil",[m
[31m-  "fal",[m
[31m-  "tru",[m
[31m-  "lud",[m
[31m-  "str",[m
[31m-  "p32",[m
[31m-  "thr",[m
[31m-  "pro",[m
[31m-  "fun",[m
[31m-  "p64",[m
[31m-  "cdt",[m
[31m-  "tab",[m
[31m-  "udt",[m
[31m-  "flt",[m
[31m-  "num",[m
[31m-  "i8 ",[m
[31m-  "u8 ",[m
[31m-  "i16",[m
[31m-  "u16",[m
[31m-  "int",[m
[31m-  "u32",[m
[31m-  "i64",[m
[31m-  "u64",[m
[31m-  "sfp",[m
[31m-}[m
[31m-[m
[31m-local colortype_ansi = {[m
[31m-  [0] = "%s",[m
[31m-  "%s",[m
[31m-  "%s",[m
[31m-  "\027[36m%s\027[m",[m
[31m-  "\027[32m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[1m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[1m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[33m%s\027[m",[m
[31m-  "\027[31m%s\027[m",[m
[31m-  "\027[36m%s\027[m",[m
[31m-  "\027[34m%s\027[m",[m
[31m-  "\027[34m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-}[m
[31m-[m
[31m-local function colorize_text(s, t)[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-local function colorize_ansi(s, t)[m
[31m-  return format(colortype_ansi[t], s)[m
[31m-end[m
[31m-[m
[31m-local irtype_ansi = setmetatable({},[m
[31m-  { __index = function(tab, t)[m
[31m-      local s = colorize_ansi(irtype_text[t], t); tab[t] = s; return s; end })[m
[31m-[m
[31m-local html_escape = { ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;", }[m
[31m-[m
[31m-local function colorize_html(s, t)[m
[31m-  s = gsub(s, "[<>&]", html_escape)[m
[31m-  return format('<span class="irt_%s">%s</span>', irtype_text[t], s)[m
[31m-end[m
[31m-[m
[31m-local irtype_html = setmetatable({},[m
[31m-  { __index = function(tab, t)[m
[31m-      local s = colorize_html(irtype_text[t], t); tab[t] = s; return s; end })[m
[31m-[m
[31m-local header_html = [[[m
[31m-<style type="text/css">[m
[31m-background { background: #ffffff; color: #000000; }[m
[31m-pre.ljdump {[m
[31m-font-size: 10pt;[m
[31m-background: #f0f4ff;[m
[31m-color: #000000;[m
[31m-border: 1px solid #bfcfff;[m
[31m-padding: 0.5em;[m
[31m-margin-left: 2em;[m
[31m-margin-right: 2em;[m
[31m-}[m
[31m-span.irt_str { color: #00a000; }[m
[31m-span.irt_thr, span.irt_fun { color: #404040; font-weight: bold; }[m
[31m-span.irt_tab { color: #c00000; }[m
[31m-span.irt_udt, span.irt_lud { color: #00c0c0; }[m
[31m-span.irt_num { color: #4040c0; }[m
[31m-span.irt_int, span.irt_i8, span.irt_u8, span.irt_i16, span.irt_u16 { color: #b040b0; }[m
[31m-</style>[m
[31m-]][m
[31m-[m
[31m-local colorize, irtype[m
[31m-[m
[31m--- Lookup tables to convert some literals into names.[m
[31m-local litname = {[m
[31m-  ["SLOAD "] = setmetatable({}, { __index = function(t, mode)[m
[31m-    local s = ""[m
[31m-    if band(mode, 1) ~= 0 then s = s.."P" end[m
[31m-    if band(mode, 2) ~= 0 then s = s.."F" end[m
[31m-    if band(mode, 4) ~= 0 then s = s.."T" end[m
[31m-    if band(mode, 8) ~= 0 then s = s.."C" end[m
[31m-    if band(mode, 16) ~= 0 then s = s.."R" end[m
[31m-    if band(mode, 32) ~= 0 then s = s.."I" end[m
[31m-    t[mode] = s[m
[31m-    return s[m
[31m-  end}),[m
[31m-  ["XLOAD "] = { [0] = "", "R", "V", "RV", "U", "RU", "VU", "RVU", },[m
[31m-  ["CONV  "] = setmetatable({}, { __index = function(t, mode)[m
[31m-    local s = irtype[band(mode, 31)][m
[31m-    s = irtype[band(shr(mode, 5), 31)].."."..s[m
[31m-    if band(mode, 0x800) ~= 0 then s = s.." sext" end[m
[31m-    local c = shr(mode, 14)[m
[31m-    if c == 2 then s = s.." index" elseif c == 3 then s = s.." check" end[m
[31m-    t[mode] = s[m
[31m-    return s[m
[31m-  end}),[m
[31m-  ["FLOAD "] = vmdef.irfield,[m
[31m-  ["FREF  "] = vmdef.irfield,[m
[31m-  ["FPMATH"] = vmdef.irfpm,[m
[31m-  ["BUFHDR"] = { [0] = "RESET", "APPEND" },[m
[31m-  ["TOSTR "] = { [0] = "INT", "NUM", "CHAR" },[m
[31m-}[m
[31m-[m
[31m-local function ctlsub(c)[m
[31m-  if c == "\n" then return "\\n"[m
[31m-  elseif c == "\r" then return "\\r"[m
[31m-  elseif c == "\t" then return "\\t"[m
[31m-  else return format("\\%03d", byte(c))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function fmtfunc(func, pc)[m
[31m-  local fi = funcinfo(func, pc)[m
[31m-  if fi.loc then[m
[31m-    return fi.loc[m
[31m-  elseif fi.ffid then[m
[31m-    return vmdef.ffnames[fi.ffid][m
[31m-  elseif fi.addr then[m
[31m-    return format("C:%x", fi.addr)[m
[31m-  else[m
[31m-    return "(?)"[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function formatk(tr, idx)[m
[31m-  local k, t, slot = tracek(tr, idx)[m
[31m-  local tn = type(k)[m
[31m-  local s[m
[31m-  if tn == "number" then[m
[31m-    if k == 2^52+2^51 then[m
[31m-      s = "bias"[m
[31m-    else[m
[31m-      s = format("%+.14g", k)[m
[31m-    end[m
[31m-  elseif tn == "string" then[m
[31m-    s = format(#k > 20 and '"%.20s"~' or '"%s"', gsub(k, "%c", ctlsub))[m
[31m-  elseif tn == "function" then[m
[31m-    s = fmtfunc(k)[m
[31m-  elseif tn == "table" then[m
[31m-    s = format("{%p}", k)[m
[31m-  elseif tn == "userdata" then[m
[31m-    if t == 12 then[m
[31m-      s = format("userdata:%p", k)[m
[31m-    else[m
[31m-      s = format("[%p]", k)[m
[31m-      if s == "[NULL]" then s = "NULL" end[m
[31m-    end[m
[31m-  elseif t == 21 then -- int64_t[m
[31m-    s = sub(tostring(k), 1, -3)[m
[31m-    if sub(s, 1, 1) ~= "-" then s = "+"..s end[m
[31m-  else[m
[31m-    s = tostring(k) -- For primitives.[m
[31m-  end[m
[31m-  s = colorize(format("%-4s", s), t)[m
[31m-  if slot then[m
[31m-    s = format("%s @%d", s, slot)[m
[31m-  end[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-local function printsnap(tr, snap)[m
[31m-  local n = 2[m
[31m-  for s=0,snap[1]-1 do[m
[31m-    local sn = snap[n][m
[31m-    if shr(sn, 24) == s then[m
[31m-      n = n + 1[m
[31m-      local ref = band(sn, 0xffff) - 0x8000 -- REF_BIAS[m
[31m-      if ref < 0 then[m
[31m-	out:write(formatk(tr, ref))[m
[31m-      elseif band(sn, 0x80000) ~= 0 then -- SNAP_SOFTFPNUM[m
[31m-	out:write(colorize(format("%04d/%04d", ref, ref+1), 14))[m
[31m-      else[m
[31m-	local m, ot, op1, op2 = traceir(tr, ref)[m
[31m-	out:write(colorize(format("%04d", ref), band(ot, 31)))[m
[31m-      end[m
[31m-      out:write(band(sn, 0x10000) == 0 and " " or "|") -- SNAP_FRAME[m
[31m-    else[m
[31m-      out:write("---- ")[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("]\n")[m
[31m-end[m
[31m-[m
[31m--- Dump snapshots (not interleaved with IR).[m
[31m-local function dump_snap(tr)[m
[31m-  out:write("---- TRACE ", tr, " snapshots\n")[m
[31m-  for i=0,1000000000 do[m
[31m-    local snap = tracesnap(tr, i)[m
[31m-    if not snap then break end[m
[31m-    out:write(format("#%-3d %04d [ ", i, snap[0]))[m
[31m-    printsnap(tr, snap)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Return a register name or stack slot for a rid/sp location.[m
[31m-local function ridsp_name(ridsp, ins)[m
[31m-  if not disass then disass = require("jit.dis_"..jit.arch) end[m
[31m-  local rid, slot = band(ridsp, 0xff), shr(ridsp, 8)[m
[31m-  if rid == 253 or rid == 254 then[m
[31m-    return (slot == 0 or slot == 255) and " {sink" or format(" {%04d", ins-slot)[m
[31m-  end[m
[31m-  if ridsp > 255 then return format("[%x]", slot*4) end[m
[31m-  if rid < 128 then return disass.regname(rid) end[m
[31m-  return ""[m
[31m-end[m
[31m-[m
[31m--- Dump CALL* function ref and return optional ctype.[m
[31m-local function dumpcallfunc(tr, ins)[m
[31m-  local ctype[m
[31m-  if ins > 0 then[m
[31m-    local m, ot, op1, op2 = traceir(tr, ins)[m
[31m-    if band(ot, 31) == 0 then -- nil type means CARG(func, ctype).[m
[31m-      ins = op1[m
[31m-      ctype = formatk(tr, op2)[m
[31m-    end[m
[31m-  end[m
[31m-  if ins < 0 then[m
[31m-    out:write(format("[0x%x](", tonumber((tracek(tr, ins)))))[m
[31m-  else[m
[31m-    out:write(format("%04d (", ins))[m
[31m-  end[m
[31m-  return ctype[m
[31m-end[m
[31m-[m
[31m--- Recursively gather CALL* args and dump them.[m
[31m-local function dumpcallargs(tr, ins)[m
[31m-  if ins < 0 then[m
[31m-    out:write(formatk(tr, ins))[m
[31m-  else[m
[31m-    local m, ot, op1, op2 = traceir(tr, ins)[m
[31m-    local oidx = 6*shr(ot, 8)[m
[31m-    local op = sub(vmdef.irnames, oidx+1, oidx+6)[m
[31m-    if op == "CARG  " then[m
[31m-      dumpcallargs(tr, op1)[m
[31m-      if op2 < 0 then[m
[31m-	out:write(" ", formatk(tr, op2))[m
[31m-      else[m
[31m-	out:write(" ", format("%04d", op2))[m
[31m-      end[m
[31m-    else[m
[31m-      out:write(format("%04d", ins))[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Dump IR and interleaved snapshots.[m
[31m-local function dump_ir(tr, dumpsnap, dumpreg)[m
[31m-  local info = traceinfo(tr)[m
[31m-  if not info then return end[m
[31m-  local nins = info.nins[m
[31m-  out:write("---- TRACE ", tr, " IR\n")[m
[31m-  local irnames = vmdef.irnames[m
[31m-  local snapref = 65536[m
[31m-  local snap, snapno[m
[31m-  if dumpsnap then[m
[31m-    snap = tracesnap(tr, 0)[m
[31m-    snapref = snap[0][m
[31m-    snapno = 0[m
[31m-  end[m
[31m-  for ins=1,nins do[m
[31m-    if ins >= snapref then[m
[31m-      if dumpreg then[m
[31m-	out:write(format("....              SNAP   #%-3d [ ", snapno))[m
[31m-      else[m
[31m-	out:write(format("....        SNAP   #%-3d [ ", snapno))[m
[31m-      end[m
[31m-      printsnap(tr, snap)[m
[31m-      snapno = snapno + 1[m
[31m-      snap = tracesnap(tr, snapno)[m
[31m-      snapref = snap and snap[0] or 65536[m
[31m-    end[m
[31m-    local m, ot, op1, op2, ridsp = traceir(tr, ins)[m
[31m-    local oidx, t = 6*shr(ot, 8), band(ot, 31)[m
[31m-    local op = sub(irnames, oidx+1, oidx+6)[m
[31m-    if op == "LOOP  " then[m
[31m-      if dumpreg then[m
[31m-	out:write(format("%04d ------------ LOOP ------------\n", ins))[m
[31m-      else[m
[31m-	out:write(format("%04d ------ LOOP ------------\n", ins))[m
[31m-      end[m
[31m-    elseif op ~= "NOP   " and op ~= "CARG  " and[m
[31m-	   (dumpreg or op ~= "RENAME") then[m
[31m-      local rid = band(ridsp, 255)[m
[31m-      if dumpreg then[m
[31m-	out:write(format("%04d %-6s", ins, ridsp_name(ridsp, ins)))[m
[31m-      else[m
[31m-	out:write(format("%04d ", ins))[m
[31m-      end[m
[31m-      out:write(format("%s%s %s %s ",[m
[31m-		       (rid == 254 or rid == 253) and "}" or[m
[31m-		       (band(ot, 128) == 0 and " " or ">"),[m
[31m-		       band(ot, 64) == 0 and " " or "+",[m
[31m-		       irtype[t], op))[m
[31m-      local m1, m2 = band(m, 3), band(m, 3*4)[m
[31m-      if sub(op, 1, 4) == "CALL" then[m
[31m-	local ctype[m
[31m-	if m2 == 1*4 then -- op2 == IRMlit[m
[31m-	  out:write(format("%-10s  (", vmdef.ircall[op2]))[m
[31m-	else[m
[31m-	  ctype = dumpcallfunc(tr, op2)[m
[31m-	end[m
[31m-	if op1 ~= -1 then dumpcallargs(tr, op1) end[m
[31m-	out:write(")")[m
[31m-	if ctype then out:write(" ctype ", ctype) end[m
[31m-      elseif op == "CNEW  " and op2 == -1 then[m
[31m-	out:write(formatk(tr, op1))[m
[31m-      elseif m1 ~= 3 then -- op1 != IRMnone[m
[31m-	if op1 < 0 then[m
[31m-	  out:write(formatk(tr, op1))[m
[31m-	else[m
[31m-	  out:write(format(m1 == 0 and "%04d" or "#%-3d", op1))[m
[31m-	end[m
[31m-	if m2 ~= 3*4 then -- op2 != IRMnone[m
[31m-	  if m2 == 1*4 then -- op2 == IRMlit[m
[31m-	    local litn = litname[op][m
[31m-	    if litn and litn[op2] then[m
[31m-	      out:write("  ", litn[op2])[m
[31m-	    elseif op == "UREFO " or op == "UREFC " then[m
[31m-	      out:write(format("  #%-3d", shr(op2, 8)))[m
[31m-	    else[m
[31m-	      out:write(format("  #%-3d", op2))[m
[31m-	    end[m
[31m-	  elseif op2 < 0 then[m
[31m-	    out:write("  ", formatk(tr, op2))[m
[31m-	  else[m
[31m-	    out:write(format("  %04d", op2))[m
[31m-	  end[m
[31m-	end[m
[31m-      end[m
[31m-      out:write("\n")[m
[31m-    end[m
[31m-  end[m
[31m-  if snap then[m
[31m-    if dumpreg then[m
[31m-      out:write(format("....              SNAP   #%-3d [ ", snapno))[m
[31m-    else[m
[31m-      out:write(format("....        SNAP   #%-3d [ ", snapno))[m
[31m-    end[m
[31m-    printsnap(tr, snap)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local recprefix = ""[m
[31m-local recdepth = 0[m
[31m-[m
[31m--- Format trace error message.[m
[31m-local function fmterr(err, info)[m
[31m-  if type(err) == "number" then[m
[31m-    if type(info) == "function" then info = fmtfunc(info) end[m
[31m-    err = format(vmdef.traceerr[err], info)[m
[31m-  end[m
[31m-  return err[m
[31m-end[m
[31m-[m
[31m--- Dump trace states.[m
[31m-local function dump_trace(what, tr, func, pc, otr, oex)[m
[31m-  if what == "stop" or (what == "abort" and dumpmode.a) then[m
[31m-    if dumpmode.i then dump_ir(tr, dumpmode.s, dumpmode.r and what == "stop")[m
[31m-    elseif dumpmode.s then dump_snap(tr) end[m
[31m-    if dumpmode.m then dump_mcode(tr) end[m
[31m-  end[m
[31m-  if what == "start" then[m
[31m-    if dumpmode.H then out:write('<pre class="ljdump">\n') end[m
[31m-    out:write("---- TRACE ", tr, " ", what)[m
[31m-    if otr then out:write(" ", otr, "/", oex) end[m
[31m-    out:write(" ", fmtfunc(func, pc), "\n")[m
[31m-  elseif what == "stop" or what == "abort" then[m
[31m-    out:write("---- TRACE ", tr, " ", what)[m
[31m-    if what == "abort" then[m
[31m-      out:write(" ", fmtfunc(func, pc), " -- ", fmterr(otr, oex), "\n")[m
[31m-    else[m
[31m-      local info = traceinfo(tr)[m
[31m-      local link, ltype = info.link, info.linktype[m
[31m-      if link == tr or link == 0 then[m
[31m-	out:write(" -> ", ltype, "\n")[m
[31m-      elseif ltype == "root" then[m
[31m-	out:write(" -> ", link, "\n")[m
[31m-      else[m
[31m-	out:write(" -> ", link, " ", ltype, "\n")[m
[31m-      end[m
[31m-    end[m
[31m-    if dumpmode.H then out:write("</pre>\n\n") else out:write("\n") end[m
[31m-  else[m
[31m-    if what == "flush" then symtab, nexitsym = {}, 0 end[m
[31m-    out:write("---- TRACE ", what, "\n\n")[m
[31m-  end[m
[31m-  out:flush()[m
[31m-end[m
[31m-[m
[31m--- Dump recorded bytecode.[m
[31m-local function dump_record(tr, func, pc, depth, callee)[m
[31m-  if depth ~= recdepth then[m
[31m-    recdepth = depth[m
[31m-    recprefix = rep(" .", depth)[m
[31m-  end[m
[31m-  local line[m
[31m-  if pc >= 0 then[m
[31m-    line = bcline(func, pc, recprefix)[m
[31m-    if dumpmode.H then line = gsub(line, "[<>&]", html_escape) end[m
[31m-    if pc > 0 then[m
[31m-      line = sub(line, 1, -2) .. "       (" .. fmtfunc(func, pc) .. ")\n"[m
[31m-    end[m
[31m-  else[m
[31m-    line = "0000 "..recprefix.." FUNCC      \n"[m
[31m-    callee = func[m
[31m-  end[m
[31m-  if pc <= 0 then[m
[31m-    out:write(sub(line, 1, -2), "         ; ", fmtfunc(func), "\n")[m
[31m-  else[m
[31m-    out:write(line)[m
[31m-  end[m
[31m-  if pc >= 0 and band(funcbc(func, pc), 0xff) < 16 then -- ORDER BC[m
[31m-    out:write(bcline(func, pc+1, recprefix)) -- Write JMP for cond.[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump taken trace exits.[m
[31m-local function dump_texit(tr, ex, ngpr, nfpr, ...)[m
[31m-  out:write("---- TRACE ", tr, " exit ", ex, "\n")[m
[31m-  if dumpmode.X then[m
[31m-    local regs = {...}[m
[31m-    if jit.arch == "x64" then[m
[31m-      for i=1,ngpr do[m
[31m-	out:write(format(" %016x", regs[i]))[m
[31m-	if i % 4 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    else[m
[31m-      for i=1,ngpr do[m
[31m-	out:write(" ", tohex(regs[i]))[m
[31m-	if i % 8 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    end[m
[31m-    if jit.arch == "mips" or jit.arch == "mipsel" then[m
[31m-      for i=1,nfpr,2 do[m
[31m-	out:write(format(" %+17.14g", regs[ngpr+i]))[m
[31m-	if i % 8 == 7 then out:write("\n") end[m
[31m-      end[m
[31m-    else[m
[31m-      for i=1,nfpr do[m
[31m-	out:write(format(" %+17.14g", regs[ngpr+i]))[m
[31m-	if i % 4 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Detach dump handlers.[m
[31m-local function dumpoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(dump_texit)[m
[31m-    jit.attach(dump_record)[m
[31m-    jit.attach(dump_trace)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach dump handlers.[m
[31m-local function dumpon(opt, outfile)[m
[31m-  if active then dumpoff() end[m
[31m-[m
[31m-  local colormode = os.getenv("COLORTERM") and "A" or "T"[m
[31m-  if opt then[m
[31m-    opt = gsub(opt, "[TAH]", function(mode) colormode = mode; return ""; end)[m
[31m-  end[m
[31m-[m
[31m-  local m = { t=true, b=true, i=true, m=true, }[m
[31m-  if opt and opt ~= "" then[m
[31m-    local o = sub(opt, 1, 1)[m
[31m-    if o ~= "+" and o ~= "-" then m = {} end[m
[31m-    for i=1,#opt do m[sub(opt, i, i)] = (o ~= "-") end[m
[31m-  end[m
[31m-  dumpmode = m[m
[31m-[m
[31m-  if m.t or m.b or m.i or m.s or m.m then[m
[31m-    jit.attach(dump_trace, "trace")[m
[31m-  end[m
[31m-  if m.b then[m
[31m-    jit.attach(dump_record, "record")[m
[31m-    if not bcline then bcline = require("jit.bc").line end[m
[31m-  end[m
[31m-  if m.x or m.X then[m
[31m-    jit.attach(dump_texit, "texit")[m
[31m-  end[m
[31m-[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_DUMPFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stdout[m
[31m-  end[m
[31m-[m
[31m-  m[colormode] = true[m
[31m-  if colormode == "A" then[m
[31m-    colorize = colorize_ansi[m
[31m-    irtype = irtype_ansi[m
[31m-  elseif colormode == "H" then[m
[31m-    colorize = colorize_html[m
[31m-    irtype = irtype_html[m
[31m-    out:write(header_html)[m
[31m-  else[m
[31m-    colorize = colorize_text[m
[31m-    irtype = irtype_text[m
[31m-  end[m
[31m-[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  on = dumpon,[m
[31m-  off = dumpoff,[m
[31m-  start = dumpon -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/p.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/p.lua[m
[1mdeleted file mode 100644[m
[1mindex 5323728..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/p.lua[m
[1m+++ /dev/null[m
[36m@@ -1,310 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT profiler.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module is a simple command line interface to the built-in[m
[31m--- low-overhead profiler of LuaJIT.[m
[31m---[m
[31m--- The lower-level API of the profiler is accessible via the "jit.profile"[m
[31m--- module or the luaJIT_profile_* C API.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jp myapp.lua[m
[31m---   luajit -jp=s myapp.lua[m
[31m---   luajit -jp=-s myapp.lua[m
[31m---   luajit -jp=vl myapp.lua[m
[31m---   luajit -jp=G,profile.txt myapp.lua[m
[31m---[m
[31m--- The following dump features are available:[m
[31m---[m
[31m---   f  Stack dump: function name, otherwise module:line. Default mode.[m
[31m---   F  Stack dump: ditto, but always prepend module.[m
[31m---   l  Stack dump: module:line.[m
[31m---   <number> stack dump depth (callee < caller). Default: 1.[m
[31m---   -<number> Inverse stack dump depth (caller > callee).[m
[31m---   s  Split stack dump after first stack level. Implies abs(depth) >= 2.[m
[31m---   p  Show full path for module names.[m
[31m---   v  Show VM states. Can be combined with stack dumps, e.g. vf or fv.[m
[31m---   z  Show zones. Can be combined with stack dumps, e.g. zf or fz.[m
[31m---   r  Show raw sample counts. Default: show percentages.[m
[31m---   a  Annotate excerpts from source code files.[m
[31m---   A  Annotate complete source code files.[m
[31m---   G  Produce raw output suitable for graphical tools (e.g. flame graphs).[m
[31m---   m<number> Minimum sample percentage to be shown. Default: 3.[m
[31m---   i<number> Sampling interval in milliseconds. Default: 10.[m
[31m---[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local profile = require("jit.profile")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local math = math[m
[31m-local pairs, ipairs, tonumber, floor = pairs, ipairs, tonumber, math.floor[m
[31m-local sort, format = table.sort, string.format[m
[31m-local stdout = io.stdout[m
[31m-local zone -- Load jit.zone module on demand.[m
[31m-[m
[31m--- Output file handle.[m
[31m-local out[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local prof_ud[m
[31m-local prof_states, prof_split, prof_min, prof_raw, prof_fmt, prof_depth[m
[31m-local prof_ann, prof_count1, prof_count2, prof_samples[m
[31m-[m
[31m-local map_vmmode = {[m
[31m-  N = "Compiled",[m
[31m-  I = "Interpreted",[m
[31m-  C = "C code",[m
[31m-  G = "Garbage Collector",[m
[31m-  J = "JIT Compiler",[m
[31m-}[m
[31m-[m
[31m--- Profiler callback.[m
[31m-local function prof_cb(th, samples, vmmode)[m
[31m-  prof_samples = prof_samples + samples[m
[31m-  local key_stack, key_stack2, key_state[m
[31m-  -- Collect keys for sample.[m
[31m-  if prof_states then[m
[31m-    if prof_states == "v" then[m
[31m-      key_state = map_vmmode[vmmode] or vmmode[m
[31m-    else[m
[31m-      key_state = zone:get() or "(none)"[m
[31m-    end[m
[31m-  end[m
[31m-  if prof_fmt then[m
[31m-    key_stack = profile.dumpstack(th, prof_fmt, prof_depth)[m
[31m-    key_stack = key_stack:gsub("%[builtin#(%d+)%]", function(x)[m
[31m-      return vmdef.ffnames[tonumber(x)][m
[31m-    end)[m
[31m-    if prof_split == 2 then[m
[31m-      local k1, k2 = key_stack:match("(.-) [<>] (.*)")[m
[31m-      if k2 then key_stack, key_stack2 = k1, k2 end[m
[31m-    elseif prof_split == 3 then[m
[31m-      key_stack2 = profile.dumpstack(th, "l", 1)[m
[31m-    end[m
[31m-  end[m
[31m-  -- Order keys.[m
[31m-  local k1, k2[m
[31m-  if prof_split == 1 then[m
[31m-    if key_state then[m
[31m-      k1 = key_state[m
[31m-      if key_stack then k2 = key_stack end[m
[31m-    end[m
[31m-  elseif key_stack then[m
[31m-    k1 = key_stack[m
[31m-    if key_stack2 then k2 = key_stack2 elseif key_state then k2 = key_state end[m
[31m-  end[m
[31m-  -- Coalesce samples in one or two levels.[m
[31m-  if k1 then[m
[31m-    local t1 = prof_count1[m
[31m-    t1[k1] = (t1[k1] or 0) + samples[m
[31m-    if k2 then[m
[31m-      local t2 = prof_count2[m
[31m-      local t3 = t2[k1][m
[31m-      if not t3 then t3 = {}; t2[k1] = t3 end[m
[31m-      t3[k2] = (t3[k2] or 0) + samples[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Show top N list.[m
[31m-local function prof_top(count1, count2, samples, indent)[m
[31m-  local t, n = {}, 0[m
[31m-  for k, v in pairs(count1) do[m
[31m-    n = n + 1[m
[31m-    t[n] = k[m
[31m-  end[m
[31m-  sort(t, function(a, b) return count1[a] > count1[b] end)[m
[31m-  for i=1,n do[m
[31m-    local k = t[i][m
[31m-    local v = count1[k][m
[31m-    local pct = floor(v*100/samples + 0.5)[m
[31m-    if pct < prof_min then break end[m
[31m-    if not prof_raw then[m
[31m-      out:write(format("%s%2d%%  %s\n", indent, pct, k))[m
[31m-    elseif prof_raw == "r" then[m
[31m-      out:write(format("%s%5d  %s\n", indent, v, k))[m
[31m-    else[m
[31m-      out:write(format("%s %d\n", k, v))[m
[31m-    end[m
[31m-    if count2 then[m
[31m-      local r = count2[k][m
[31m-      if r then[m
[31m-	prof_top(r, nil, v, (prof_split == 3 or prof_split == 1) and "  -- " or[m
[31m-			    (prof_depth < 0 and "  -> " or "  <- "))[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Annotate source code[m
[31m-local function prof_annotate(count1, samples)[m
[31m-  local files = {}[m
[31m-  local ms = 0[m
[31m-  for k, v in pairs(count1) do[m
[31m-    local pct = floor(v*100/samples + 0.5)[m
[31m-    ms = math.max(ms, v)[m
[31m-    if pct >= prof_min then[m
[31m-      local file, line = k:match("^(.*):(%d+)$")[m
[31m-      local fl = files[file][m
[31m-      if not fl then fl = {}; files[file] = fl; files[#files+1] = file end[m
[31m-      line = tonumber(line)[m
[31m-      fl[line] = prof_raw and v or pct[m
[31m-    end[m
[31m-  end[m
[31m-  sort(files)[m
[31m-  local fmtv, fmtn = " %3d%% | %s\n", "      | %s\n"[m
[31m-  if prof_raw then[m
[31m-    local n = math.max(5, math.ceil(math.log10(ms)))[m
[31m-    fmtv = "%"..n.."d | %s\n"[m
[31m-    fmtn = (" "):rep(n).." | %s\n"[m
[31m-  end[m
[31m-  local ann = prof_ann[m
[31m-  for _, file in ipairs(files) do[m
[31m-    local f0 = file:byte()[m
[31m-    if f0 == 40 or f0 == 91 then[m
[31m-      out:write(format("\n====== %s ======\n[Cannot annotate non-file]\n", file))[m
[31m-      break[m
[31m-    end[m
[31m-    local fp, err = io.open(file)[m
[31m-    if not fp then[m
[31m-      out:write(format("====== ERROR: %s: %s\n", file, err))[m
[31m-      break[m
[31m-    end[m
[31m-    out:write(format("\n====== %s ======\n", file))[m
[31m-    local fl = files[file][m
[31m-    local n, show = 1, false[m
[31m-    if ann ~= 0 then[m
[31m-      for i=1,ann do[m
[31m-	if fl[i] then show = true; out:write("@@ 1 @@\n"); break end[m
[31m-      end[m
[31m-    end[m
[31m-    for line in fp:lines() do[m
[31m-      if line:byte() == 27 then[m
[31m-	out:write("[Cannot annotate bytecode file]\n")[m
[31m-	break[m
[31m-      end[m
[31m-      local v = fl[n][m
[31m-      if ann ~= 0 then[m
[31m-	local v2 = fl[n+ann][m
[31m-	if show then[m
[31m-	  if v2 then show = n+ann elseif v then show = n[m
[31m-	  elseif show+ann < n then show = false end[m
[31m-	elseif v2 then[m
[31m-	  show = n+ann[m
[31m-	  out:write(format("@@ %d @@\n", n))[m
[31m-	end[m
[31m-	if not show then goto next end[m
[31m-      end[m
[31m-      if v then[m
[31m-	out:write(format(fmtv, v, line))[m
[31m-      else[m
[31m-	out:write(format(fmtn, line))[m
[31m-      end[m
[31m-    ::next::[m
[31m-      n = n + 1[m
[31m-    end[m
[31m-    fp:close()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Finish profiling and dump result.[m
[31m-local function prof_finish()[m
[31m-  if prof_ud then[m
[31m-    profile.stop()[m
[31m-    local samples = prof_samples[m
[31m-    if samples == 0 then[m
[31m-      if prof_raw ~= true then out:write("[No samples collected]\n") end[m
[31m-      return[m
[31m-    end[m
[31m-    if prof_ann then[m
[31m-      prof_annotate(prof_count1, samples)[m
[31m-    else[m
[31m-      prof_top(prof_count1, prof_count2, samples, "")[m
[31m-    end[m
[31m-    prof_count1 = nil[m
[31m-    prof_count2 = nil[m
[31m-    prof_ud = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Start profiling.[m
[31m-local function prof_start(mode)[m
[31m-  local interval = ""[m
[31m-  mode = mode:gsub("i%d*", function(s) interval = s; return "" end)[m
[31m-  prof_min = 3[m
[31m-  mode = mode:gsub("m(%d+)", function(s) prof_min = tonumber(s); return "" end)[m
[31m-  prof_depth = 1[m
[31m-  mode = mode:gsub("%-?%d+", function(s) prof_depth = tonumber(s); return "" end)[m
[31m-  local m = {}[m
[31m-  for c in mode:gmatch(".") do m[c] = c end[m
[31m-  prof_states = m.z or m.v[m
[31m-  if prof_states == "z" then zone = require("jit.zone") end[m
[31m-  local scope = m.l or m.f or m.F or (prof_states and "" or "f")[m
[31m-  local flags = (m.p or "")[m
[31m-  prof_raw = m.r[m
[31m-  if m.s then[m
[31m-    prof_split = 2[m
[31m-    if prof_depth == -1 or m["-"] then prof_depth = -2[m
[31m-    elseif prof_depth == 1 then prof_depth = 2 end[m
[31m-  elseif mode:find("[fF].*l") then[m
[31m-    scope = "l"[m
[31m-    prof_split = 3[m
[31m-  else[m
[31m-    prof_split = (scope == "" or mode:find("[zv].*[lfF]")) and 1 or 0[m
[31m-  end[m
[31m-  prof_ann = m.A and 0 or (m.a and 3)[m
[31m-  if prof_ann then[m
[31m-    scope = "l"[m
[31m-    prof_fmt = "pl"[m
[31m-    prof_split = 0[m
[31m-    prof_depth = 1[m
[31m-  elseif m.G and scope ~= "" then[m
[31m-    prof_fmt = flags..scope.."Z;"[m
[31m-    prof_depth = -100[m
[31m-    prof_raw = true[m
[31m-    prof_min = 0[m
[31m-  elseif scope == "" then[m
[31m-    prof_fmt = false[m
[31m-  else[m
[31m-    local sc = prof_split == 3 and m.f or m.F or scope[m
[31m-    prof_fmt = flags..sc..(prof_depth >= 0 and "Z < " or "Z > ")[m
[31m-  end[m
[31m-  prof_count1 = {}[m
[31m-  prof_count2 = {}[m
[31m-  prof_samples = 0[m
[31m-  profile.start(scope:lower()..interval, prof_cb)[m
[31m-  prof_ud = newproxy(true)[m
[31m-  getmetatable(prof_ud).__gc = prof_finish[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function start(mode, outfile)[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_PROFILEFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stdout[m
[31m-  end[m
[31m-  prof_start(mode or "f")[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  start = start, -- For -j command line option.[m
[31m-  stop = prof_finish[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/v.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/v.lua[m
[1mdeleted file mode 100644[m
[1mindex 60c8b05..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/v.lua[m
[1m+++ /dev/null[m
[36m@@ -1,170 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- Verbose mode of the LuaJIT compiler.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module shows verbose information about the progress of the[m
[31m--- JIT compiler. It prints one line for each generated trace. This module[m
[31m--- is useful to see which code has been compiled or where the compiler[m
[31m--- punts and falls back to the interpreter.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jv -e "for i=1,1000 do for j=1,1000 do end end"[m
[31m---   luajit -jv=myapp.out myapp.lua[m
[31m---[m
[31m--- Default output is to stderr. To redirect the output to a file, pass a[m
[31m--- filename as an argument (use '-' for stdout) or set the environment[m
[31m--- variable LUAJIT_VERBOSEFILE. The file is overwritten every time the[m
[31m--- module is started.[m
[31m---[m
[31m--- The output from the first example should look like this:[m
[31m---[m
[31m--- [TRACE   1 (command line):1 loop][m
[31m--- [TRACE   2 (1/3) (command line):1 -> 1][m
[31m---[m
[31m--- The first number in each line is the internal trace number. Next are[m
[31m--- the file name ('(command line)') and the line number (':1') where the[m
[31m--- trace has started. Side traces also show the parent trace number and[m
[31m--- the exit number where they are attached to in parentheses ('(1/3)').[m
[31m--- An arrow at the end shows where the trace links to ('-> 1'), unless[m
[31m--- it loops to itself.[m
[31m---[m
[31m--- In this case the inner loop gets hot and is traced first, generating[m
[31m--- a root trace. Then the last exit from the 1st trace gets hot, too,[m
[31m--- and triggers generation of the 2nd trace. The side trace follows the[m
[31m--- path along the outer loop and *around* the inner loop, back to its[m
[31m--- start, and then links to the 1st trace. Yes, this may seem unusual,[m
[31m--- if you know how traditional compilers work. Trace compilers are full[m
[31m--- of surprises like this -- have fun! :-)[m
[31m---[m
[31m--- Aborted traces are shown like this:[m
[31m---[m
[31m--- [TRACE --- foo.lua:44 -- leaving loop in root trace at foo:lua:50][m
[31m---[m
[31m--- Don't worry -- trace aborts are quite common, even in programs which[m
[31m--- can be fully compiled. The compiler may retry several times until it[m
[31m--- finds a suitable trace.[m
[31m---[m
[31m--- Of course this doesn't work with features that are not-yet-implemented[m
[31m--- (NYI error messages). The VM simply falls back to the interpreter. This[m
[31m--- may not matter at all if the particular trace is not very high up in[m
[31m--- the CPU usage profile. Oh, and the interpreter is quite fast, too.[m
[31m---[m
[31m--- Also check out the -jdump module, which prints all the gory details.[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local funcinfo, traceinfo = jutil.funcinfo, jutil.traceinfo[m
[31m-local type, format = type, string.format[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m--- Active flag and output file handle.[m
[31m-local active, out[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local startloc, startex[m
[31m-[m
[31m-local function fmtfunc(func, pc)[m
[31m-  local fi = funcinfo(func, pc)[m
[31m-  if fi.loc then[m
[31m-    return fi.loc[m
[31m-  elseif fi.ffid then[m
[31m-    return vmdef.ffnames[fi.ffid][m
[31m-  elseif fi.addr then[m
[31m-    return format("C:%x", fi.addr)[m
[31m-  else[m
[31m-    return "(?)"[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Format trace error message.[m
[31m-local function fmterr(err, info)[m
[31m-  if type(err) == "number" then[m
[31m-    if type(info) == "function" then info = fmtfunc(info) end[m
[31m-    err = format(vmdef.traceerr[err], info)[m
[31m-  end[m
[31m-  return err[m
[31m-end[m
[31m-[m
[31m--- Dump trace states.[m
[31m-local function dump_trace(what, tr, func, pc, otr, oex)[m
[31m-  if what == "start" then[m
[31m-    startloc = fmtfunc(func, pc)[m
[31m-    startex = otr and "("..otr.."/"..oex..") " or ""[m
[31m-  else[m
[31m-    if what == "abort" then[m
[31m-      local loc = fmtfunc(func, pc)[m
[31m-      if loc ~= startloc then[m
[31m-	out:write(format("[TRACE --- %s%s -- %s at %s]\n",[m
[31m-	  startex, startloc, fmterr(otr, oex), loc))[m
[31m-      else[m
[31m-	out:write(format("[TRACE --- %s%s -- %s]\n",[m
[31m-	  startex, startloc, fmterr(otr, oex)))[m
[31m-      end[m
[31m-    elseif what == "stop" then[m
[31m-      local info = traceinfo(tr)[m
[31m-      local link, ltype = info.link, info.linktype[m
[31m-      if ltype == "interpreter" then[m
[31m-	out:write(format("[TRACE %3s %s%s -- fallback to interpreter]\n",[m
[31m-	  tr, startex, startloc))[m
[31m-      elseif ltype == "stitch" then[m
[31m-	out:write(format("[TRACE %3s %s%s %s %s]\n",[m
[31m-	  tr, startex, startloc, ltype, fmtfunc(func, pc)))[m
[31m-      elseif link == tr or link == 0 then[m
[31m-	out:write(format("[TRACE %3s %s%s %s]\n",[m
[31m-	  tr, startex, startloc, ltype))[m
[31m-      elseif ltype == "root" then[m
[31m-	out:write(format("[TRACE %3s %s%s -> %d]\n",[m
[31m-	  tr, startex, startloc, link))[m
[31m-      else[m
[31m-	out:write(format("[TRACE %3s %s%s -> %d %s]\n",[m
[31m-	  tr, startex, startloc, link, ltype))[m
[31m-      end[m
[31m-    else[m
[31m-      out:write(format("[TRACE %s]\n", what))[m
[31m-    end[m
[31m-    out:flush()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Detach dump handlers.[m
[31m-local function dumpoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(dump_trace)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach dump handlers.[m
[31m-local function dumpon(outfile)[m
[31m-  if active then dumpoff() end[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_VERBOSEFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stderr[m
[31m-  end[m
[31m-  jit.attach(dump_trace, "trace")[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  on = dumpon,[m
[31m-  off = dumpoff,[m
[31m-  start = dumpon -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/zone.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/zone.lua[m
[1mdeleted file mode 100644[m
[1mindex f5f9656..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/jit/zone.lua[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT profiler zones.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module implements a simple hierarchical zone model.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   local zone = require("jit.zone")[m
[31m---   zone("AI")[m
[31m---   ...[m
[31m---     zone("A*")[m
[31m---     ...[m
[31m---     print(zone:get()) --> "A*"[m
[31m---     ...[m
[31m---     zone()[m
[31m---   ...[m
[31m---   print(zone:get()) --> "AI"[m
[31m---   ...[m
[31m---   zone()[m
[31m---[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m-local remove = table.remove[m
[31m-[m
[31m-return setmetatable({[m
[31m-  flush = function(t)[m
[31m-    for i=#t,1,-1 do t[i] = nil end[m
[31m-  end,[m
[31m-  get = function(t)[m
[31m-    return t[#t][m
[31m-  end[m
[31m-}, {[m
[31m-  __call = function(t, zone)[m
[31m-    if zone then[m
[31m-      t[#t+1] = zone[m
[31m-    else[m
[31m-      return (assert(remove(t), "empty zone stack"))[m
[31m-    end[m
[31m-  end[m
[31m-})[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lauxlib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lauxlib.h[m
[1mdeleted file mode 100644[m
[1mindex fed1491..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lauxlib.h[m
[1m+++ /dev/null[m
[36m@@ -1,167 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions for building Lua libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lauxlib_h[m
[31m-#define lauxlib_h[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-#define luaL_getn(L,i)          ((int)lua_objlen(L, i))[m
[31m-#define luaL_setn(L,i,j)        ((void)0)  /* no op! */[m
[31m-[m
[31m-/* extra error code for `luaL_load' */[m
[31m-#define LUA_ERRFILE     (LUA_ERRERR+1)[m
[31m-[m
[31m-typedef struct luaL_Reg {[m
[31m-  const char *name;[m
[31m-  lua_CFunction func;[m
[31m-} luaL_Reg;[m
[31m-[m
[31m-LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l, int nup);[m
[31m-LUALIB_API void (luaL_register) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l);[m
[31m-LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);[m
[31m-LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);[m
[31m-LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,[m
[31m-                                                          size_t *l);[m
[31m-LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,[m
[31m-                                          const char *def, size_t *l);[m
[31m-LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);[m
[31m-[m
[31m-LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,[m
[31m-                                          lua_Integer def);[m
[31m-[m
[31m-LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);[m
[31m-LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);[m
[31m-LUALIB_API void (luaL_checkany) (lua_State *L, int narg);[m
[31m-[m
[31m-LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);[m
[31m-LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);[m
[31m-[m
[31m-LUALIB_API void (luaL_where) (lua_State *L, int lvl);[m
[31m-LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);[m
[31m-[m
[31m-LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,[m
[31m-                                   const char *const lst[]);[m
[31m-[m
[31m-LUALIB_API int (luaL_ref) (lua_State *L, int t);[m
[31m-LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);[m
[31m-[m
[31m-LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);[m
[31m-LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,[m
[31m-                                  const char *name);[m
[31m-LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);[m
[31m-[m
[31m-LUALIB_API lua_State *(luaL_newstate) (void);[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,[m
[31m-                                                  const char *r);[m
[31m-[m
[31m-LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,[m
[31m-                                         const char *fname, int szhint);[m
[31m-[m
[31m-/* From Lua 5.2. */[m
[31m-LUALIB_API int luaL_fileresult(lua_State *L, int stat, const char *fname);[m
[31m-LUALIB_API int luaL_execresult(lua_State *L, int stat);[m
[31m-LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,[m
[31m-				 const char *mode);[m
[31m-LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,[m
[31m-				   const char *name, const char *mode);[m
[31m-LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,[m
[31m-				int level);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define luaL_argcheck(L, cond,numarg,extramsg)	\[m
[31m-		((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))[m
[31m-#define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))[m
[31m-#define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))[m
[31m-#define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))[m
[31m-#define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))[m
[31m-[m
[31m-#define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))[m
[31m-[m
[31m-#define luaL_dofile(L, fn) \[m
[31m-	(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_dostring(L, s) \[m
[31m-	(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))[m
[31m-[m
[31m-#define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Generic Buffer manipulation[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct luaL_Buffer {[m
[31m-  char *p;			/* current position in buffer */[m
[31m-  int lvl;  /* number of strings in the stack (level) */[m
[31m-  lua_State *L;[m
[31m-  char buffer[LUAL_BUFFERSIZE];[m
[31m-} luaL_Buffer;[m
[31m-[m
[31m-#define luaL_addchar(B,c) \[m
[31m-  ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \[m
[31m-   (*(B)->p++ = (char)(c)))[m
[31m-[m
[31m-/* compatibility only */[m
[31m-#define luaL_putchar(B,c)	luaL_addchar(B,c)[m
[31m-[m
[31m-#define luaL_addsize(B,n)	((B)->p += (n))[m
[31m-[m
[31m-LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);[m
[31m-LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);[m
[31m-LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);[m
[31m-LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-/* compatibility with ref system */[m
[31m-[m
[31m-/* pre-defined references */[m
[31m-#define LUA_NOREF       (-2)[m
[31m-#define LUA_REFNIL      (-1)[m
[31m-[m
[31m-#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \[m
[31m-      (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))[m
[31m-[m
[31m-#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-[m
[31m-#define luaL_reg	luaL_Reg[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux.c[m
[1mdeleted file mode 100644[m
[1mindex 0e61d95..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_aux.c[m
[1m+++ /dev/null[m
[36m@@ -1,356 +0,0 @@[m
[31m-/*[m
[31m-** Auxiliary library for the Lua/C API.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major parts taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lib_aux_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-#if LJ_TARGET_POSIX[m
[31m-#include <sys/wait.h>[m
[31m-#endif[m
[31m-[m
[31m-/* -- I/O error handling -------------------------------------------------- */[m
[31m-[m
[31m-LUALIB_API int luaL_fileresult(lua_State *L, int stat, const char *fname)[m
[31m-{[m
[31m-  if (stat) {[m
[31m-    setboolV(L->top++, 1);[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    int en = errno;  /* Lua API calls may change this value. */[m
[31m-    setnilV(L->top++);[m
[31m-    if (fname)[m
[31m-      lua_pushfstring(L, "%s: %s", fname, strerror(en));[m
[31m-    else[m
[31m-      lua_pushfstring(L, "%s", strerror(en));[m
[31m-    setintV(L->top++, en);[m
[31m-    lj_trace_abort(G(L));[m
[31m-    return 3;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_execresult(lua_State *L, int stat)[m
[31m-{[m
[31m-  if (stat != -1) {[m
[31m-#if LJ_TARGET_POSIX[m
[31m-    if (WIFSIGNALED(stat)) {[m
[31m-      stat = WTERMSIG(stat);[m
[31m-      setnilV(L->top++);[m
[31m-      lua_pushliteral(L, "signal");[m
[31m-    } else {[m
[31m-      if (WIFEXITED(stat))[m
[31m-	stat = WEXITSTATUS(stat);[m
[31m-      if (stat == 0)[m
[31m-	setboolV(L->top++, 1);[m
[31m-      else[m
[31m-	setnilV(L->top++);[m
[31m-      lua_pushliteral(L, "exit");[m
[31m-    }[m
[31m-#else[m
[31m-    if (stat == 0)[m
[31m-      setboolV(L->top++, 1);[m
[31m-    else[m
[31m-      setnilV(L->top++);[m
[31m-    lua_pushliteral(L, "exit");[m
[31m-#endif[m
[31m-    setintV(L->top++, stat);[m
[31m-    return 3;[m
[31m-  }[m
[31m-  return luaL_fileresult(L, 0, NULL);[m
[31m-}[m
[31m-[m
[31m-/* -- Module registration ------------------------------------------------- */[m
[31m-[m
[31m-LUALIB_API const char *luaL_findtable(lua_State *L, int idx,[m
[31m-				      const char *fname, int szhint)[m
[31m-{[m
[31m-  const char *e;[m
[31m-  lua_pushvalue(L, idx);[m
[31m-  do {[m
[31m-    e = strchr(fname, '.');[m
[31m-    if (e == NULL) e = fname + strlen(fname);[m
[31m-    lua_pushlstring(L, fname, (size_t)(e - fname));[m
[31m-    lua_rawget(L, -2);[m
[31m-    if (lua_isnil(L, -1)) {  /* no such field? */[m
[31m-      lua_pop(L, 1);  /* remove this nil */[m
[31m-      lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */[m
[31m-      lua_pushlstring(L, fname, (size_t)(e - fname));[m
[31m-      lua_pushvalue(L, -2);[m
[31m-      lua_settable(L, -4);  /* set new table into field */[m
[31m-    } else if (!lua_istable(L, -1)) {  /* field has a non-table value? */[m
[31m-      lua_pop(L, 2);  /* remove table and value */[m
[31m-      return fname;  /* return problematic part of the name */[m
[31m-    }[m
[31m-    lua_remove(L, -2);  /* remove previous table */[m
[31m-    fname = e + 1;[m
[31m-  } while (*e == '.');[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static int libsize(const luaL_Reg *l)[m
[31m-{[m
[31m-  int size = 0;[m
[31m-  for (; l->name; l++) size++;[m
[31m-  return size;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_openlib(lua_State *L, const char *libname,[m
[31m-			     const luaL_Reg *l, int nup)[m
[31m-{[m
[31m-  lj_lib_checkfpu(L);[m
[31m-  if (libname) {[m
[31m-    int size = libsize(l);[m
[31m-    /* check whether lib already exists */[m
[31m-    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);[m
[31m-    lua_getfield(L, -1, libname);  /* get _LOADED[libname] */[m
[31m-    if (!lua_istable(L, -1)) {  /* not found? */[m
[31m-      lua_pop(L, 1);  /* remove previous result */[m
[31m-      /* try global variable (and create one if it does not exist) */[m
[31m-      if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL)[m
[31m-	lj_err_callerv(L, LJ_ERR_BADMODN, libname);[m
[31m-      lua_pushvalue(L, -1);[m
[31m-      lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */[m
[31m-    }[m
[31m-    lua_remove(L, -2);  /* remove _LOADED table */[m
[31m-    lua_insert(L, -(nup+1));  /* move library table to below upvalues */[m
[31m-  }[m
[31m-  for (; l->name; l++) {[m
[31m-    int i;[m
[31m-    for (i = 0; i < nup; i++)  /* copy upvalues to the top */[m
[31m-      lua_pushvalue(L, -nup);[m
[31m-    lua_pushcclosure(L, l->func, nup);[m
[31m-    lua_setfield(L, -(nup+2), l->name);[m
[31m-  }[m
[31m-  lua_pop(L, nup);  /* remove upvalues */[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_register(lua_State *L, const char *libname,[m
[31m-			      const luaL_Reg *l)[m
[31m-{[m
[31m-  luaL_openlib(L, libname, l, 0);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API const char *luaL_gsub(lua_State *L, const char *s,[m
[31m-				 const char *p, const char *r)[m
[31m-{[m
[31m-  const char *wild;[m
[31m-  size_t l = strlen(p);[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while ((wild = strstr(s, p)) != NULL) {[m
[31m-    luaL_addlstring(&b, s, (size_t)(wild - s));  /* push prefix */[m
[31m-    luaL_addstring(&b, r);  /* push replacement in place of pattern */[m
[31m-    s = wild + l;  /* continue after `p' */[m
[31m-  }[m
[31m-  luaL_addstring(&b, s);  /* push last suffix */[m
[31m-  luaL_pushresult(&b);[m
[31m-  return lua_tostring(L, -1);[m
[31m-}[m
[31m-[m
[31m-/* -- Buffer handling ----------------------------------------------------- */[m
[31m-[m
[31m-#define bufflen(B)	((size_t)((B)->p - (B)->buffer))[m
[31m-#define bufffree(B)	((size_t)(LUAL_BUFFERSIZE - bufflen(B)))[m
[31m-[m
[31m-static int emptybuffer(luaL_Buffer *B)[m
[31m-{[m
[31m-  size_t l = bufflen(B);[m
[31m-  if (l == 0)[m
[31m-    return 0;  /* put nothing on stack */[m
[31m-  lua_pushlstring(B->L, B->buffer, l);[m
[31m-  B->p = B->buffer;[m
[31m-  B->lvl++;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static void adjuststack(luaL_Buffer *B)[m
[31m-{[m
[31m-  if (B->lvl > 1) {[m
[31m-    lua_State *L = B->L;[m
[31m-    int toget = 1;  /* number of levels to concat */[m
[31m-    size_t toplen = lua_strlen(L, -1);[m
[31m-    do {[m
[31m-      size_t l = lua_strlen(L, -(toget+1));[m
[31m-      if (!(B->lvl - toget + 1 >= LUA_MINSTACK/2 || toplen > l))[m
[31m-	break;[m
[31m-      toplen += l;[m
[31m-      toget++;[m
[31m-    } while (toget < B->lvl);[m
[31m-    lua_concat(L, toget);[m
[31m-    B->lvl = B->lvl - toget + 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API char *luaL_prepbuffer(luaL_Buffer *B)[m
[31m-{[m
[31m-  if (emptybuffer(B))[m
[31m-    adjuststack(B);[m
[31m-  return B->buffer;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_addlstring(luaL_Buffer *B, const char *s, size_t l)[m
[31m-{[m
[31m-  while (l--)[m
[31m-    luaL_addchar(B, *s++);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_addstring(luaL_Buffer *B, const char *s)[m
[31m-{[m
[31m-  luaL_addlstring(B, s, strlen(s));[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_pushresult(luaL_Buffer *B)[m
[31m-{[m
[31m-  emptybuffer(B);[m
[31m-  lua_concat(B->L, B->lvl);[m
[31m-  B->lvl = 1;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_addvalue(luaL_Buffer *B)[m
[31m-{[m
[31m-  lua_State *L = B->L;[m
[31m-  size_t vl;[m
[31m-  const char *s = lua_tolstring(L, -1, &vl);[m
[31m-  if (vl <= bufffree(B)) {  /* fit into buffer? */[m
[31m-    memcpy(B->p, s, vl);  /* put it there */[m
[31m-    B->p += vl;[m
[31m-    lua_pop(L, 1);  /* remove from stack */[m
[31m-  } else {[m
[31m-    if (emptybuffer(B))[m
[31m-      lua_insert(L, -2);  /* put buffer before new value */[m
[31m-    B->lvl++;  /* add new value into B stack */[m
[31m-    adjuststack(B);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_buffinit(lua_State *L, luaL_Buffer *B)[m
[31m-{[m
[31m-  B->L = L;[m
[31m-  B->p = B->buffer;[m
[31m-  B->lvl = 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Reference management ------------------------------------------------ */[m
[31m-[m
[31m-#define FREELIST_REF	0[m
[31m-[m
[31m-/* Convert a stack index to an absolute index. */[m
[31m-#define abs_index(L, i) \[m
[31m-  ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : lua_gettop(L) + (i) + 1)[m
[31m-[m
[31m-LUALIB_API int luaL_ref(lua_State *L, int t)[m
[31m-{[m
[31m-  int ref;[m
[31m-  t = abs_index(L, t);[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-    lua_pop(L, 1);  /* remove from stack */[m
[31m-    return LUA_REFNIL;  /* `nil' has a unique fixed reference */[m
[31m-  }[m
[31m-  lua_rawgeti(L, t, FREELIST_REF);  /* get first free element */[m
[31m-  ref = (int)lua_tointeger(L, -1);  /* ref = t[FREELIST_REF] */[m
[31m-  lua_pop(L, 1);  /* remove it from stack */[m
[31m-  if (ref != 0) {  /* any free element? */[m
[31m-    lua_rawgeti(L, t, ref);  /* remove it from list */[m
[31m-    lua_rawseti(L, t, FREELIST_REF);  /* (t[FREELIST_REF] = t[ref]) */[m
[31m-  } else {  /* no free elements */[m
[31m-    ref = (int)lua_objlen(L, t);[m
[31m-    ref++;  /* create new reference */[m
[31m-  }[m
[31m-  lua_rawseti(L, t, ref);[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_unref(lua_State *L, int t, int ref)[m
[31m-{[m
[31m-  if (ref >= 0) {[m
[31m-    t = abs_index(L, t);[m
[31m-    lua_rawgeti(L, t, FREELIST_REF);[m
[31m-    lua_rawseti(L, t, ref);  /* t[ref] = t[FREELIST_REF] */[m
[31m-    lua_pushinteger(L, ref);[m
[31m-    lua_rawseti(L, t, FREELIST_REF);  /* t[FREELIST_REF] = ref */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Default allocator and panic function -------------------------------- */[m
[31m-[m
[31m-static int panic(lua_State *L)[m
[31m-{[m
[31m-  const char *s = lua_tostring(L, -1);[m
[31m-  fputs("PANIC: unprotected error in call to Lua API (", stderr);[m
[31m-  fputs(s ? s : "?", stderr);[m
[31m-  fputc(')', stderr); fputc('\n', stderr);[m
[31m-  fflush(stderr);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#ifdef LUAJIT_USE_SYSMALLOC[m
[31m-[m
[31m-#if LJ_64 && !defined(LUAJIT_USE_VALGRIND)[m
[31m-#error "Must use builtin allocator for 64 bit target"[m
[31m-#endif[m
[31m-[m
[31m-static void *mem_alloc(void *ud, void *ptr, size_t osize, size_t nsize)[m
[31m-{[m
[31m-  (void)ud;[m
[31m-  (void)osize;[m
[31m-  if (nsize == 0) {[m
[31m-    free(ptr);[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    return realloc(ptr, nsize);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_State *luaL_newstate(void)[m
[31m-{[m
[31m-  lua_State *L = lua_newstate(mem_alloc, NULL);[m
[31m-  if (L) G(L)->panic = panic;[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#include "lj_alloc.h"[m
[31m-[m
[31m-LUALIB_API lua_State *luaL_newstate(void)[m
[31m-{[m
[31m-  lua_State *L;[m
[31m-  void *ud = lj_alloc_create();[m
[31m-  if (ud == NULL) return NULL;[m
[31m-#if LJ_64[m
[31m-  L = lj_state_newstate(lj_alloc_f, ud);[m
[31m-#else[m
[31m-  L = lua_newstate(lj_alloc_f, ud);[m
[31m-#endif[m
[31m-  if (L) G(L)->panic = panic;[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[31m-#if LJ_64[m
[31m-LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)[m
[31m-{[m
[31m-  UNUSED(f); UNUSED(ud);[m
[31m-  fputs("Must use luaL_newstate() for 64 bit target\n", stderr);[m
[31m-  return NULL;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base.c[m
[1mdeleted file mode 100644[m
[1mindex 6107bde..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_base.c[m
[1m+++ /dev/null[m
[36m@@ -1,663 +0,0 @@[m
[31m-/*[m
[31m-** Base and coroutine library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lib_base_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#endif[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* -- Base library: checks ------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_base[m
[31m-[m
[31m-LJLIB_ASM(assert)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCstr *s;[m
[31m-  lj_lib_checkany(L, 1);[m
[31m-  s = lj_lib_optstr(L, 2);[m
[31m-  if (s)[m
[31m-    lj_err_callermsg(L, strdata(s));[m
[31m-  else[m
[31m-    lj_err_caller(L, LJ_ERR_ASSERT);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-/* ORDER LJ_T */[m
[31m-LJLIB_PUSH("nil")[m
[31m-LJLIB_PUSH("boolean")[m
[31m-LJLIB_PUSH(top-1)  /* boolean */[m
[31m-LJLIB_PUSH("userdata")[m
[31m-LJLIB_PUSH("string")[m
[31m-LJLIB_PUSH("upval")[m
[31m-LJLIB_PUSH("thread")[m
[31m-LJLIB_PUSH("proto")[m
[31m-LJLIB_PUSH("function")[m
[31m-LJLIB_PUSH("trace")[m
[31m-LJLIB_PUSH("cdata")[m
[31m-LJLIB_PUSH("table")[m
[31m-LJLIB_PUSH(top-9)  /* userdata */[m
[31m-LJLIB_PUSH("number")[m
[31m-LJLIB_ASM_(type)		LJLIB_REC(.)[m
[31m-/* Recycle the lj_lib_checkany(L, 1) from assert. */[m
[31m-[m
[31m-/* -- Base library: iterators --------------------------------------------- */[m
[31m-[m
[31m-/* This solves a circular dependency problem -- change FF_next_N as needed. */[m
[31m-LJ_STATIC_ASSERT((int)FF_next == FF_next_N);[m
[31m-[m
[31m-LJLIB_ASM(next)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 1);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-#if LJ_52 || LJ_HASFFI[m
[31m-static int ffh_pairs(lua_State *L, MMS mm)[m
[31m-{[m
[31m-  TValue *o = lj_lib_checkany(L, 1);[m
[31m-  cTValue *mo = lj_meta_lookup(L, o, mm);[m
[31m-  if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) {[m
[31m-    L->top = o+1;  /* Only keep one argument. */[m
[31m-    copyTV(L, L->base-1-LJ_FR2, mo);  /* Replace callable. */[m
[31m-    return FFH_TAILCALL;[m
[31m-  } else {[m
[31m-    if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE);[m
[31m-    if (LJ_FR2) { copyTV(L, o-1, o); o--; }[m
[31m-    setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1)));[m
[31m-    if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0);[m
[31m-    return FFH_RES(3);[m
[31m-  }[m
[31m-}[m
[31m-#else[m
[31m-#define ffh_pairs(L, mm)	(lj_lib_checktab(L, 1), FFH_UNREACHABLE)[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_PUSH(lastcl)[m
[31m-LJLIB_ASM(pairs)		LJLIB_REC(xpairs 0)[m
[31m-{[m
[31m-  return ffh_pairs(L, MM_pairs);[m
[31m-}[m
[31m-[m
[31m-LJLIB_NOREGUV LJLIB_ASM(ipairs_aux)	LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 1);[m
[31m-  lj_lib_checkint(L, 2);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(lastcl)[m
[31m-LJLIB_ASM(ipairs)		LJLIB_REC(xpairs 1)[m
[31m-{[m
[31m-  return ffh_pairs(L, MM_ipairs);[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: getters and setters ----------------------------------- */[m
[31m-[m
[31m-LJLIB_ASM_(getmetatable)	LJLIB_REC(.)[m
[31m-/* Recycle the lj_lib_checkany(L, 1) from assert. */[m
[31m-[m
[31m-LJLIB_ASM(setmetatable)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  GCtab *mt = lj_lib_checktabornil(L, 2);[m
[31m-  if (!tvisnil(lj_meta_lookup(L, L->base, MM_metatable)))[m
[31m-    lj_err_caller(L, LJ_ERR_PROTMT);[m
[31m-  setgcref(t->metatable, obj2gco(mt));[m
[31m-  if (mt) { lj_gc_objbarriert(L, t, mt); }[m
[31m-  settabV(L, L->base-1-LJ_FR2, t);[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(getfenv)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  cTValue *o = L->base;[m
[31m-  if (!(o < L->top && tvisfunc(o))) {[m
[31m-    int level = lj_lib_optint(L, 1, 1);[m
[31m-    o = lj_debug_frame(L, level, &level);[m
[31m-    if (o == NULL)[m
[31m-      lj_err_arg(L, 1, LJ_ERR_INVLVL);[m
[31m-    if (LJ_FR2) o--;[m
[31m-  }[m
[31m-  fn = &gcval(o)->fn;[m
[31m-  settabV(L, L->top++, isluafunc(fn) ? tabref(fn->l.env) : tabref(L->env));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(setfenv)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  GCtab *t = lj_lib_checktab(L, 2);[m
[31m-  cTValue *o = L->base;[m
[31m-  if (!(o < L->top && tvisfunc(o))) {[m
[31m-    int level = lj_lib_checkint(L, 1);[m
[31m-    if (level == 0) {[m
[31m-      /* NOBARRIER: A thread (i.e. L) is never black. */[m
[31m-      setgcref(L->env, obj2gco(t));[m
[31m-      return 0;[m
[31m-    }[m
[31m-    o = lj_debug_frame(L, level, &level);[m
[31m-    if (o == NULL)[m
[31m-      lj_err_arg(L, 1, LJ_ERR_INVLVL);[m
[31m-    if (LJ_FR2) o--;[m
[31m-  }[m
[31m-  fn = &gcval(o)->fn;[m
[31m-  if (!isluafunc(fn))[m
[31m-    lj_err_caller(L, LJ_ERR_SETFENV);[m
[31m-  setgcref(fn->l.env, obj2gco(t));[m
[31m-  lj_gc_objbarrier(L, obj2gco(fn), t);[m
[31m-  setfuncV(L, L->top++, fn);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(rawget)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 1);[m
[31m-  lj_lib_checkany(L, 2);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(rawset)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 1);[m
[31m-  lj_lib_checkany(L, 2);[m
[31m-  L->top = 1+lj_lib_checkany(L, 3);[m
[31m-  lua_rawset(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(rawequal)		LJLIB_REC(.)[m
[31m-{[m
[31m-  cTValue *o1 = lj_lib_checkany(L, 1);[m
[31m-  cTValue *o2 = lj_lib_checkany(L, 2);[m
[31m-  setboolV(L->top-1, lj_obj_equal(o1, o2));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#if LJ_52[m
[31m-LJLIB_CF(rawlen)		LJLIB_REC(.)[m
[31m-{[m
[31m-  cTValue *o = L->base;[m
[31m-  int32_t len;[m
[31m-  if (L->top > o && tvisstr(o))[m
[31m-    len = (int32_t)strV(o)->len;[m
[31m-  else[m
[31m-    len = (int32_t)lj_tab_len(lj_lib_checktab(L, 1));[m
[31m-  setintV(L->top-1, len);[m
[31m-  return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_CF(unpack)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  int32_t n, i = lj_lib_optint(L, 2, 1);[m
[31m-  int32_t e = (L->base+3-1 < L->top && !tvisnil(L->base+3-1)) ?[m
[31m-	      lj_lib_checkint(L, 3) : (int32_t)lj_tab_len(t);[m
[31m-  if (i > e) return 0;[m
[31m-  n = e - i + 1;[m
[31m-  if (n <= 0 || !lua_checkstack(L, n))[m
[31m-    lj_err_caller(L, LJ_ERR_UNPACK);[m
[31m-  do {[m
[31m-    cTValue *tv = lj_tab_getint(t, i);[m
[31m-    if (tv) {[m
[31m-      copyTV(L, L->top++, tv);[m
[31m-    } else {[m
[31m-      setnilV(L->top++);[m
[31m-    }[m
[31m-  } while (i++ < e);[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(select)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int32_t n = (int32_t)(L->top - L->base);[m
[31m-  if (n >= 1 && tvisstr(L->base) && *strVdata(L->base) == '#') {[m
[31m-    setintV(L->top-1, n-1);[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    int32_t i = lj_lib_checkint(L, 1);[m
[31m-    if (i < 0) i = n + i; else if (i > n) i = n;[m
[31m-    if (i < 1)[m
[31m-      lj_err_arg(L, 1, LJ_ERR_IDXRNG);[m
[31m-    return n - i;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: conversions ------------------------------------------- */[m
[31m-[m
[31m-LJLIB_ASM(tonumber)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int32_t base = lj_lib_optint(L, 2, 10);[m
[31m-  if (base == 10) {[m
[31m-    TValue *o = lj_lib_checkany(L, 1);[m
[31m-    if (lj_strscan_numberobj(o)) {[m
[31m-      copyTV(L, L->base-1-LJ_FR2, o);[m
[31m-      return FFH_RES(1);[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (tviscdata(o)) {[m
[31m-      CTState *cts = ctype_cts(L);[m
[31m-      CType *ct = lj_ctype_rawref(cts, cdataV(o)->ctypeid);[m
[31m-      if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-      if (ctype_isnum(ct->info) || ctype_iscomplex(ct->info)) {[m
[31m-	if (LJ_DUALNUM && ctype_isinteger_or_bool(ct->info) &&[m
[31m-	    ct->size <= 4 && !(ct->size == 4 && (ct->info & CTF_UNSIGNED))) {[m
[31m-	  int32_t i;[m
[31m-	  lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT32), (uint8_t *)&i, o, 0);[m
[31m-	  setintV(L->base-1-LJ_FR2, i);[m
[31m-	  return FFH_RES(1);[m
[31m-	}[m
[31m-	lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE),[m
[31m-		       (uint8_t *)&(L->base-1-LJ_FR2)->n, o, 0);[m
[31m-	return FFH_RES(1);[m
[31m-      }[m
[31m-    }[m
[31m-#endif[m
[31m-  } else {[m
[31m-    const char *p = strdata(lj_lib_checkstr(L, 1));[m
[31m-    char *ep;[m
[31m-    unsigned long ul;[m
[31m-    if (base < 2 || base > 36)[m
[31m-      lj_err_arg(L, 2, LJ_ERR_BASERNG);[m
[31m-    ul = strtoul(p, &ep, base);[m
[31m-    if (p != ep) {[m
[31m-      while (lj_char_isspace((unsigned char)(*ep))) ep++;[m
[31m-      if (*ep == '\0') {[m
[31m-	if (LJ_DUALNUM && LJ_LIKELY(ul < 0x80000000u))[m
[31m-	  setintV(L->base-1-LJ_FR2, (int32_t)ul);[m
[31m-	else[m
[31m-	  setnumV(L->base-1-LJ_FR2, (lua_Number)ul);[m
[31m-	return FFH_RES(1);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  setnilV(L->base-1-LJ_FR2);[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(tostring)		LJLIB_REC(.)[m
[31m-{[m
[31m-  TValue *o = lj_lib_checkany(L, 1);[m
[31m-  cTValue *mo;[m
[31m-  L->top = o+1;  /* Only keep one argument. */[m
[31m-  if (!tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) {[m
[31m-    copyTV(L, L->base-1-LJ_FR2, mo);  /* Replace callable. */[m
[31m-    return FFH_TAILCALL;[m
[31m-  }[m
[31m-  lj_gc_check(L);[m
[31m-  setstrV(L, L->base-1-LJ_FR2, lj_strfmt_obj(L, L->base));[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: throw and catch errors -------------------------------- */[m
[31m-[m
[31m-LJLIB_CF(error)[m
[31m-{[m
[31m-  int32_t level = lj_lib_optint(L, 2, 1);[m
[31m-  lua_settop(L, 1);[m
[31m-  if (lua_isstring(L, 1) && level > 0) {[m
[31m-    luaL_where(L, level);[m
[31m-    lua_pushvalue(L, 1);[m
[31m-    lua_concat(L, 2);[m
[31m-  }[m
[31m-  return lua_error(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(pcall)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checkany(L, 1);[m
[31m-  lj_lib_checkfunc(L, 2);  /* For xpcall only. */[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-LJLIB_ASM_(xpcall)		LJLIB_REC(.)[m
[31m-[m
[31m-/* -- Base library: load Lua code ----------------------------------------- */[m
[31m-[m
[31m-static int load_aux(lua_State *L, int status, int envarg)[m
[31m-{[m
[31m-  if (status == 0) {[m
[31m-    if (tvistab(L->base+envarg-1)) {[m
[31m-      GCfunc *fn = funcV(L->top-1);[m
[31m-      GCtab *t = tabV(L->base+envarg-1);[m
[31m-      setgcref(fn->c.env, obj2gco(t));[m
[31m-      lj_gc_objbarrier(L, fn, t);[m
[31m-    }[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    setnilV(L->top-2);[m
[31m-    return 2;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(loadfile)[m
[31m-{[m
[31m-  GCstr *fname = lj_lib_optstr(L, 1);[m
[31m-  GCstr *mode = lj_lib_optstr(L, 2);[m
[31m-  int status;[m
[31m-  lua_settop(L, 3);  /* Ensure env arg exists. */[m
[31m-  status = luaL_loadfilex(L, fname ? strdata(fname) : NULL,[m
[31m-			  mode ? strdata(mode) : NULL);[m
[31m-  return load_aux(L, status, 3);[m
[31m-}[m
[31m-[m
[31m-static const char *reader_func(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-  UNUSED(ud);[m
[31m-  luaL_checkstack(L, 2, "too many nested functions");[m
[31m-  copyTV(L, L->top++, L->base);[m
[31m-  lua_call(L, 0, 1);  /* Call user-supplied function. */[m
[31m-  L->top--;[m
[31m-  if (tvisnil(L->top)) {[m
[31m-    *size = 0;[m
[31m-    return NULL;[m
[31m-  } else if (tvisstr(L->top) || tvisnumber(L->top)) {[m
[31m-    copyTV(L, L->base+4, L->top);  /* Anchor string in reserved stack slot. */[m
[31m-    return lua_tolstring(L, 5, size);[m
[31m-  } else {[m
[31m-    lj_err_caller(L, LJ_ERR_RDRSTR);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(load)[m
[31m-{[m
[31m-  GCstr *name = lj_lib_optstr(L, 2);[m
[31m-  GCstr *mode = lj_lib_optstr(L, 3);[m
[31m-  int status;[m
[31m-  if (L->base < L->top && (tvisstr(L->base) || tvisnumber(L->base))) {[m
[31m-    GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-    lua_settop(L, 4);  /* Ensure env arg exists. */[m
[31m-    status = luaL_loadbufferx(L, strdata(s), s->len, strdata(name ? name : s),[m
[31m-			      mode ? strdata(mode) : NULL);[m
[31m-  } else {[m
[31m-    lj_lib_checkfunc(L, 1);[m
[31m-    lua_settop(L, 5);  /* Reserve a slot for the string from the reader. */[m
[31m-    status = lua_loadx(L, reader_func, NULL, name ? strdata(name) : "=(load)",[m
[31m-		       mode ? strdata(mode) : NULL);[m
[31m-  }[m
[31m-  return load_aux(L, status, 4);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(loadstring)[m
[31m-{[m
[31m-  return lj_cf_load(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(dofile)[m
[31m-{[m
[31m-  GCstr *fname = lj_lib_optstr(L, 1);[m
[31m-  setnilV(L->top);[m
[31m-  L->top = L->base+1;[m
[31m-  if (luaL_loadfile(L, fname ? strdata(fname) : NULL) != 0)[m
[31m-    lua_error(L);[m
[31m-  lua_call(L, 0, LUA_MULTRET);[m
[31m-  return (int)(L->top - L->base) - 1;[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: GC control -------------------------------------------- */[m
[31m-[m
[31m-LJLIB_CF(gcinfo)[m
[31m-{[m
[31m-  setintV(L->top++, (int32_t)(G(L)->gc.total >> 10));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(collectgarbage)[m
[31m-{[m
[31m-  int opt = lj_lib_checkopt(L, 1, LUA_GCCOLLECT,  /* ORDER LUA_GC* */[m
[31m-    "\4stop\7restart\7collect\5count\1\377\4step\10setpause\12setstepmul\1\377\11isrunning");[m
[31m-  int32_t data = lj_lib_optint(L, 2, 0);[m
[31m-  if (opt == LUA_GCCOUNT) {[m
[31m-    setnumV(L->top, (lua_Number)G(L)->gc.total/1024.0);[m
[31m-  } else {[m
[31m-    int res = lua_gc(L, opt, data);[m
[31m-    if (opt == LUA_GCSTEP || opt == LUA_GCISRUNNING)[m
[31m-      setboolV(L->top, res);[m
[31m-    else[m
[31m-      setintV(L->top, res);[m
[31m-  }[m
[31m-  L->top++;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: miscellaneous functions ------------------------------- */[m
[31m-[m
[31m-LJLIB_PUSH(top-2)  /* Upvalue holds weak table. */[m
[31m-LJLIB_CF(newproxy)[m
[31m-{[m
[31m-  lua_settop(L, 1);[m
[31m-  lua_newuserdata(L, 0);[m
[31m-  if (lua_toboolean(L, 1) == 0) {  /* newproxy(): without metatable. */[m
[31m-    return 1;[m
[31m-  } else if (lua_isboolean(L, 1)) {  /* newproxy(true): with metatable. */[m
[31m-    lua_newtable(L);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_rawset(L, lua_upvalueindex(1));  /* Remember mt in weak table. */[m
[31m-  } else {  /* newproxy(proxy): inherit metatable. */[m
[31m-    int validproxy = 0;[m
[31m-    if (lua_getmetatable(L, 1)) {[m
[31m-      lua_rawget(L, lua_upvalueindex(1));[m
[31m-      validproxy = lua_toboolean(L, -1);[m
[31m-      lua_pop(L, 1);[m
[31m-    }[m
[31m-    if (!validproxy)[m
[31m-      lj_err_arg(L, 1, LJ_ERR_NOPROXY);[m
[31m-    lua_getmetatable(L, 1);[m
[31m-  }[m
[31m-  lua_setmetatable(L, 2);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH("tostring")[m
[31m-LJLIB_CF(print)[m
[31m-{[m
[31m-  ptrdiff_t i, nargs = L->top - L->base;[m
[31m-  cTValue *tv = lj_tab_getstr(tabref(L->env), strV(lj_lib_upvalue(L, 1)));[m
[31m-  int shortcut;[m
[31m-  if (tv && !tvisnil(tv)) {[m
[31m-    copyTV(L, L->top++, tv);[m
[31m-  } else {[m
[31m-    setstrV(L, L->top++, strV(lj_lib_upvalue(L, 1)));[m
[31m-    lua_gettable(L, LUA_GLOBALSINDEX);[m
[31m-    tv = L->top-1;[m
[31m-  }[m
[31m-  shortcut = (tvisfunc(tv) && funcV(tv)->c.ffid == FF_tostring);[m
[31m-  for (i = 0; i < nargs; i++) {[m
[31m-    cTValue *o = &L->base[i];[m
[31m-    const char *str;[m
[31m-    size_t size;[m
[31m-    MSize len;[m
[31m-    if (shortcut && (str = lj_strfmt_wstrnum(L, o, &len)) != NULL) {[m
[31m-      size = len;[m
[31m-    } else {[m
[31m-      copyTV(L, L->top+1, o);[m
[31m-      copyTV(L, L->top, L->top-1);[m
[31m-      L->top += 2;[m
[31m-      lua_call(L, 1, 1);[m
[31m-      str = lua_tolstring(L, -1, &size);[m
[31m-      if (!str)[m
[31m-	lj_err_caller(L, LJ_ERR_PRTOSTR);[m
[31m-      L->top--;[m
[31m-    }[m
[31m-    if (i)[m
[31m-      putchar('\t');[m
[31m-    fwrite(str, 1, size, stdout);[m
[31m-  }[m
[31m-  putchar('\n');[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-3)[m
[31m-LJLIB_SET(_VERSION)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- Coroutine library --------------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_coroutine[m
[31m-[m
[31m-LJLIB_CF(coroutine_status)[m
[31m-{[m
[31m-  const char *s;[m
[31m-  lua_State *co;[m
[31m-  if (!(L->top > L->base && tvisthread(L->base)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_NOCORO);[m
[31m-  co = threadV(L->base);[m
[31m-  if (co == L) s = "running";[m
[31m-  else if (co->status == LUA_YIELD) s = "suspended";[m
[31m-  else if (co->status != 0) s = "dead";[m
[31m-  else if (co->base > tvref(co->stack)+1+LJ_FR2) s = "normal";[m
[31m-  else if (co->top == co->base) s = "dead";[m
[31m-  else s = "suspended";[m
[31m-  lua_pushstring(L, s);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(coroutine_running)[m
[31m-{[m
[31m-#if LJ_52[m
[31m-  int ismain = lua_pushthread(L);[m
[31m-  setboolV(L->top++, ismain);[m
[31m-  return 2;[m
[31m-#else[m
[31m-  if (lua_pushthread(L))[m
[31m-    setnilV(L->top++);[m
[31m-  return 1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(coroutine_create)[m
[31m-{[m
[31m-  lua_State *L1;[m
[31m-  if (!(L->base < L->top && tvisfunc(L->base)))[m
[31m-    lj_err_argt(L, 1, LUA_TFUNCTION);[m
[31m-  L1 = lua_newthread(L);[m
[31m-  setfuncV(L, L1->top++, funcV(L->base));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(coroutine_yield)[m
[31m-{[m
[31m-  lj_err_caller(L, LJ_ERR_CYIELD);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-static int ffh_resume(lua_State *L, lua_State *co, int wrap)[m
[31m-{[m
[31m-  if (co->cframe != NULL || co->status > LUA_YIELD ||[m
[31m-      (co->status == 0 && co->top == co->base)) {[m
[31m-    ErrMsg em = co->cframe ? LJ_ERR_CORUN : LJ_ERR_CODEAD;[m
[31m-    if (wrap) lj_err_caller(L, em);[m
[31m-    setboolV(L->base-1-LJ_FR2, 0);[m
[31m-    setstrV(L, L->base-LJ_FR2, lj_err_str(L, em));[m
[31m-    return FFH_RES(2);[m
[31m-  }[m
[31m-  lj_state_growstack(co, (MSize)(L->top - L->base));[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(coroutine_resume)[m
[31m-{[m
[31m-  if (!(L->top > L->base && tvisthread(L->base)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_NOCORO);[m
[31m-  return ffh_resume(L, threadV(L->base), 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_NOREG LJLIB_ASM(coroutine_wrap_aux)[m
[31m-{[m
[31m-  return ffh_resume(L, threadV(lj_lib_upvalue(L, 1)), 1);[m
[31m-}[m
[31m-[m
[31m-/* Inline declarations. */[m
[31m-LJ_ASMF void lj_ff_coroutine_wrap_aux(void);[m
[31m-#if !(LJ_TARGET_MIPS && defined(ljamalg_c))[m
[31m-LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L,[m
[31m-							  lua_State *co);[m
[31m-#endif[m
[31m-[m
[31m-/* Error handler, called from assembler VM. */[m
[31m-void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L, lua_State *co)[m
[31m-{[m
[31m-  co->top--; copyTV(L, L->top, co->top); L->top++;[m
[31m-  if (tvisstr(L->top-1))[m
[31m-    lj_err_callermsg(L, strVdata(L->top-1));[m
[31m-  else[m
[31m-    lj_err_run(L);[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static void setpc_wrap_aux(lua_State *L, GCfunc *fn);[m
[31m-[m
[31m-LJLIB_CF(coroutine_wrap)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  lj_cf_coroutine_create(L);[m
[31m-  fn = lj_lib_pushcc(L, lj_ffh_coroutine_wrap_aux, FF_coroutine_wrap_aux, 1);[m
[31m-  setpc_wrap_aux(L, fn);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* Fix the PC of wrap_aux. Really ugly workaround. */[m
[31m-static void setpc_wrap_aux(lua_State *L, GCfunc *fn)[m
[31m-{[m
[31m-  setmref(fn->c.pc, &L2GG(L)->bcff[lj_lib_init_coroutine[1]+2]);[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void newproxy_weaktable(lua_State *L)[m
[31m-{[m
[31m-  /* NOBARRIER: The table is new (marked white). */[m
[31m-  GCtab *t = lj_tab_new(L, 0, 1);[m
[31m-  settabV(L, L->top++, t);[m
[31m-  setgcref(t->metatable, obj2gco(t));[m
[31m-  setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")),[m
[31m-	    lj_str_newlit(L, "kv"));[m
[31m-  t->nomm = (uint8_t)(~(1u<<MM_mode));[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaopen_base(lua_State *L)[m
[31m-{[m
[31m-  /* NOBARRIER: Table and value are the same. */[m
[31m-  GCtab *env = tabref(L->env);[m
[31m-  settabV(L, lj_tab_setstr(L, env, lj_str_newlit(L, "_G")), env);[m
[31m-  lua_pushliteral(L, LUA_VERSION);  /* top-3. */[m
[31m-  newproxy_weaktable(L);  /* top-2. */[m
[31m-  LJ_LIB_REG(L, "_G", base);[m
[31m-  LJ_LIB_REG(L, LUA_COLIBNAME, coroutine);[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit.c[m
[1mdeleted file mode 100644[m
[1mindex 1344d24..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_bit.c[m
[1m+++ /dev/null[m
[36m@@ -1,180 +0,0 @@[m
[31m-/*[m
[31m-** Bit manipulation library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_bit_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_carith.h"[m
[31m-#endif[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_bit[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static int bit_result64(lua_State *L, CTypeID id, uint64_t x)[m
[31m-{[m
[31m-  GCcdata *cd = lj_cdata_new_(L, id, 8);[m
[31m-  *(uint64_t *)cdataptr(cd) = x;[m
[31m-  setcdataV(L, L->base-1-LJ_FR2, cd);[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-#else[m
[31m-static int32_t bit_checkbit(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && lj_strscan_numberobj(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else {[m
[31m-    int32_t i = lj_num2bit(numV(o));[m
[31m-    if (LJ_DUALNUM) setintV(o, i);[m
[31m-    return i;[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_ASM(bit_tobit)		LJLIB_REC(bit_tobit)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0;[m
[31m-  setintV(L->base-1-LJ_FR2, (int32_t)lj_carith_check64(L, 1, &id));[m
[31m-  return FFH_RES(1);[m
[31m-#else[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(bit_bnot)		LJLIB_REC(bit_unary IR_BNOT)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0;[m
[31m-  uint64_t x = lj_carith_check64(L, 1, &id);[m
[31m-  return id ? bit_result64(L, id, ~x) : FFH_RETRY;[m
[31m-#else[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(bit_bswap)		LJLIB_REC(bit_unary IR_BSWAP)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0;[m
[31m-  uint64_t x = lj_carith_check64(L, 1, &id);[m
[31m-  return id ? bit_result64(L, id, lj_bswap64(x)) : FFH_RETRY;[m
[31m-#else[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(bit_lshift)		LJLIB_REC(bit_shift IR_BSHL)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0, id2 = 0;[m
[31m-  uint64_t x = lj_carith_check64(L, 1, &id);[m
[31m-  int32_t sh = (int32_t)lj_carith_check64(L, 2, &id2);[m
[31m-  if (id) {[m
[31m-    x = lj_carith_shift64(x, sh, curr_func(L)->c.ffid - (int)FF_bit_lshift);[m
[31m-    return bit_result64(L, id, x);[m
[31m-  }[m
[31m-  if (id2) setintV(L->base+1, sh);[m
[31m-  return FFH_RETRY;[m
[31m-#else[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  bit_checkbit(L, 2);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-LJLIB_ASM_(bit_rshift)		LJLIB_REC(bit_shift IR_BSHR)[m
[31m-LJLIB_ASM_(bit_arshift)		LJLIB_REC(bit_shift IR_BSAR)[m
[31m-LJLIB_ASM_(bit_rol)		LJLIB_REC(bit_shift IR_BROL)[m
[31m-LJLIB_ASM_(bit_ror)		LJLIB_REC(bit_shift IR_BROR)[m
[31m-[m
[31m-LJLIB_ASM(bit_band)		LJLIB_REC(bit_nary IR_BAND)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0;[m
[31m-  TValue *o = L->base, *top = L->top;[m
[31m-  int i = 0;[m
[31m-  do { lj_carith_check64(L, ++i, &id); } while (++o < top);[m
[31m-  if (id) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    int op = curr_func(L)->c.ffid - (int)FF_bit_bor;[m
[31m-    uint64_t x, y = op >= 0 ? 0 : ~(uint64_t)0;[m
[31m-    o = L->base;[m
[31m-    do {[m
[31m-      lj_cconv_ct_tv(cts, ct, (uint8_t *)&x, o, 0);[m
[31m-      if (op < 0) y &= x; else if (op == 0) y |= x; else y ^= x;[m
[31m-    } while (++o < top);[m
[31m-    return bit_result64(L, id, y);[m
[31m-  }[m
[31m-  return FFH_RETRY;[m
[31m-#else[m
[31m-  int i = 0;[m
[31m-  do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-LJLIB_ASM_(bit_bor)		LJLIB_REC(bit_nary IR_BOR)[m
[31m-LJLIB_ASM_(bit_bxor)		LJLIB_REC(bit_nary IR_BXOR)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-LJLIB_CF(bit_tohex)		LJLIB_REC(.)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0, id2 = 0;[m
[31m-  uint64_t b = lj_carith_check64(L, 1, &id);[m
[31m-  int32_t n = L->base+1>=L->top ? (id ? 16 : 8) :[m
[31m-				  (int32_t)lj_carith_check64(L, 2, &id2);[m
[31m-#else[m
[31m-  uint32_t b = (uint32_t)bit_checkbit(L, 1);[m
[31m-  int32_t n = L->base+1>=L->top ? 8 : bit_checkbit(L, 2);[m
[31m-#endif[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  SFormat sf = (STRFMT_UINT|STRFMT_T_HEX);[m
[31m-  if (n < 0) { n = -n; sf |= STRFMT_F_UPPER; }[m
[31m-  sf |= ((SFormat)((n+1)&255) << STRFMT_SH_PREC);[m
[31m-#if LJ_HASFFI[m
[31m-  if (n < 16) b &= ((uint64_t)1 << 4*n)-1;[m
[31m-#else[m
[31m-  if (n < 8) b &= (1u << 4*n)-1;[m
[31m-#endif[m
[31m-  sb = lj_strfmt_putfxint(sb, sf, b);[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sb));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_bit(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, LUA_BITLIBNAME, bit);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug.c[m
[1mdeleted file mode 100644[m
[1mindex cda7137..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_debug.c[m
[1m+++ /dev/null[m
[36m@@ -1,405 +0,0 @@[m
[31m-/*[m
[31m-** Debug library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_debug_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_debug[m
[31m-[m
[31m-LJLIB_CF(debug_getregistry)[m
[31m-{[m
[31m-  copyTV(L, L->top++, registry(L));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getmetatable)	LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checkany(L, 1);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    setnilV(L->top-1);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setmetatable)[m
[31m-{[m
[31m-  lj_lib_checktabornil(L, 2);[m
[31m-  L->top = L->base+2;[m
[31m-  lua_setmetatable(L, 1);[m
[31m-#if !LJ_52[m
[31m-  setboolV(L->top-1, 1);[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getfenv)[m
[31m-{[m
[31m-  lj_lib_checkany(L, 1);[m
[31m-  lua_getfenv(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setfenv)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 2);[m
[31m-  L->top = L->base+2;[m
[31m-  if (!lua_setfenv(L, 1))[m
[31m-    lj_err_caller(L, LJ_ERR_SETFENV);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void settabss(lua_State *L, const char *i, const char *v)[m
[31m-{[m
[31m-  lua_pushstring(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-static void settabsi(lua_State *L, const char *i, int v)[m
[31m-{[m
[31m-  lua_pushinteger(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-static void settabsb(lua_State *L, const char *i, int v)[m
[31m-{[m
[31m-  lua_pushboolean(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-static lua_State *getthread(lua_State *L, int *arg)[m
[31m-{[m
[31m-  if (L->base < L->top && tvisthread(L->base)) {[m
[31m-    *arg = 1;[m
[31m-    return threadV(L->base);[m
[31m-  } else {[m
[31m-    *arg = 0;[m
[31m-    return L;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void treatstackoption(lua_State *L, lua_State *L1, const char *fname)[m
[31m-{[m
[31m-  if (L == L1) {[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_remove(L, -3);[m
[31m-  }[m
[31m-  else[m
[31m-    lua_xmove(L1, L, 1);[m
[31m-  lua_setfield(L, -2, fname);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getinfo)[m
[31m-{[m
[31m-  lj_Debug ar;[m
[31m-  int arg, opt_f = 0, opt_L = 0;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  const char *options = luaL_optstring(L, arg+2, "flnSu");[m
[31m-  if (lua_isnumber(L, arg+1)) {[m
[31m-    if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), (lua_Debug *)&ar)) {[m
[31m-      setnilV(L->top-1);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  } else if (L->base+arg < L->top && tvisfunc(L->base+arg)) {[m
[31m-    options = lua_pushfstring(L, ">%s", options);[m
[31m-    setfuncV(L1, L1->top++, funcV(L->base+arg));[m
[31m-  } else {[m
[31m-    lj_err_arg(L, arg+1, LJ_ERR_NOFUNCL);[m
[31m-  }[m
[31m-  if (!lj_debug_getinfo(L1, options, &ar, 1))[m
[31m-    lj_err_arg(L, arg+2, LJ_ERR_INVOPT);[m
[31m-  lua_createtable(L, 0, 16);  /* Create result table. */[m
[31m-  for (; *options; options++) {[m
[31m-    switch (*options) {[m
[31m-    case 'S':[m
[31m-      settabss(L, "source", ar.source);[m
[31m-      settabss(L, "short_src", ar.short_src);[m
[31m-      settabsi(L, "linedefined", ar.linedefined);[m
[31m-      settabsi(L, "lastlinedefined", ar.lastlinedefined);[m
[31m-      settabss(L, "what", ar.what);[m
[31m-      break;[m
[31m-    case 'l':[m
[31m-      settabsi(L, "currentline", ar.currentline);[m
[31m-      break;[m
[31m-    case 'u':[m
[31m-      settabsi(L, "nups", ar.nups);[m
[31m-      settabsi(L, "nparams", ar.nparams);[m
[31m-      settabsb(L, "isvararg", ar.isvararg);[m
[31m-      break;[m
[31m-    case 'n':[m
[31m-      settabss(L, "name", ar.name);[m
[31m-      settabss(L, "namewhat", ar.namewhat);[m
[31m-      break;[m
[31m-    case 'f': opt_f = 1; break;[m
[31m-    case 'L': opt_L = 1; break;[m
[31m-    default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  if (opt_L) treatstackoption(L, L1, "activelines");[m
[31m-  if (opt_f) treatstackoption(L, L1, "func");[m
[31m-  return 1;  /* Return result table. */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getlocal)[m
[31m-{[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  const char *name;[m
[31m-  int slot = lj_lib_checkint(L, arg+2);[m
[31m-  if (tvisfunc(L->base+arg)) {[m
[31m-    L->top = L->base+arg+1;[m
[31m-    lua_pushstring(L, lua_getlocal(L, NULL, slot));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  if (!lua_getstack(L1, lj_lib_checkint(L, arg+1), &ar))[m
[31m-    lj_err_arg(L, arg+1, LJ_ERR_LVLRNG);[m
[31m-  name = lua_getlocal(L1, &ar, slot);[m
[31m-  if (name) {[m
[31m-    lua_xmove(L1, L, 1);[m
[31m-    lua_pushstring(L, name);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    return 2;[m
[31m-  } else {[m
[31m-    setnilV(L->top-1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setlocal)[m
[31m-{[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  TValue *tv;[m
[31m-  if (!lua_getstack(L1, lj_lib_checkint(L, arg+1), &ar))[m
[31m-    lj_err_arg(L, arg+1, LJ_ERR_LVLRNG);[m
[31m-  tv = lj_lib_checkany(L, arg+3);[m
[31m-  copyTV(L1, L1->top++, tv);[m
[31m-  lua_pushstring(L, lua_setlocal(L1, &ar, lj_lib_checkint(L, arg+2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int debug_getupvalue(lua_State *L, int get)[m
[31m-{[m
[31m-  int32_t n = lj_lib_checkint(L, 2);[m
[31m-  const char *name;[m
[31m-  lj_lib_checkfunc(L, 1);[m
[31m-  name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n);[m
[31m-  if (name) {[m
[31m-    lua_pushstring(L, name);[m
[31m-    if (!get) return 1;[m
[31m-    copyTV(L, L->top, L->top-2);[m
[31m-    L->top++;[m
[31m-    return 2;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getupvalue)[m
[31m-{[m
[31m-  return debug_getupvalue(L, 1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setupvalue)[m
[31m-{[m
[31m-  lj_lib_checkany(L, 3);[m
[31m-  return debug_getupvalue(L, 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_upvalueid)[m
[31m-{[m
[31m-  GCfunc *fn = lj_lib_checkfunc(L, 1);[m
[31m-  int32_t n = lj_lib_checkint(L, 2) - 1;[m
[31m-  if ((uint32_t)n >= fn->l.nupvalues)[m
[31m-    lj_err_arg(L, 2, LJ_ERR_IDXRNG);[m
[31m-  setlightudV(L->top-1, isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :[m
[31m-					(void *)&fn->c.upvalue[n]);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_upvaluejoin)[m
[31m-{[m
[31m-  GCfunc *fn[2];[m
[31m-  GCRef *p[2];[m
[31m-  int i;[m
[31m-  for (i = 0; i < 2; i++) {[m
[31m-    int32_t n;[m
[31m-    fn[i] = lj_lib_checkfunc(L, 2*i+1);[m
[31m-    if (!isluafunc(fn[i]))[m
[31m-      lj_err_arg(L, 2*i+1, LJ_ERR_NOLFUNC);[m
[31m-    n = lj_lib_checkint(L, 2*i+2) - 1;[m
[31m-    if ((uint32_t)n >= fn[i]->l.nupvalues)[m
[31m-      lj_err_arg(L, 2*i+2, LJ_ERR_IDXRNG);[m
[31m-    p[i] = &fn[i]->l.uvptr[n];[m
[31m-  }[m
[31m-  setgcrefr(*p[0], *p[1]);[m
[31m-  lj_gc_objbarrier(L, fn[0], gcref(*p[1]));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#if LJ_52[m
[31m-LJLIB_CF(debug_getuservalue)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (o < L->top && tvisudata(o))[m
[31m-    settabV(L, o, tabref(udataV(o)->env));[m
[31m-  else[m
[31m-    setnilV(o);[m
[31m-  L->top = o+1;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setuservalue)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (!(o < L->top && tvisudata(o)))[m
[31m-    lj_err_argt(L, 1, LUA_TUSERDATA);[m
[31m-  if (!(o+1 < L->top && tvistab(o+1)))[m
[31m-    lj_err_argt(L, 2, LUA_TTABLE);[m
[31m-  L->top = o+2;[m
[31m-  lua_setfenv(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static const char KEY_HOOK = 'h';[m
[31m-[m
[31m-static void hookf(lua_State *L, lua_Debug *ar)[m
[31m-{[m
[31m-  static const char *const hooknames[] =[m
[31m-    {"call", "return", "line", "count", "tail return"};[m
[31m-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-  lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-  if (lua_isfunction(L, -1)) {[m
[31m-    lua_pushstring(L, hooknames[(int)ar->event]);[m
[31m-    if (ar->currentline >= 0)[m
[31m-      lua_pushinteger(L, ar->currentline);[m
[31m-    else lua_pushnil(L);[m
[31m-    lua_call(L, 2, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int makemask(const char *smask, int count)[m
[31m-{[m
[31m-  int mask = 0;[m
[31m-  if (strchr(smask, 'c')) mask |= LUA_MASKCALL;[m
[31m-  if (strchr(smask, 'r')) mask |= LUA_MASKRET;[m
[31m-  if (strchr(smask, 'l')) mask |= LUA_MASKLINE;[m
[31m-  if (count > 0) mask |= LUA_MASKCOUNT;[m
[31m-  return mask;[m
[31m-}[m
[31m-[m
[31m-static char *unmakemask(int mask, char *smask)[m
[31m-{[m
[31m-  int i = 0;[m
[31m-  if (mask & LUA_MASKCALL) smask[i++] = 'c';[m
[31m-  if (mask & LUA_MASKRET) smask[i++] = 'r';[m
[31m-  if (mask & LUA_MASKLINE) smask[i++] = 'l';[m
[31m-  smask[i] = '\0';[m
[31m-  return smask;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_sethook)[m
[31m-{[m
[31m-  int arg, mask, count;[m
[31m-  lua_Hook func;[m
[31m-  (void)getthread(L, &arg);[m
[31m-  if (lua_isnoneornil(L, arg+1)) {[m
[31m-    lua_settop(L, arg+1);[m
[31m-    func = NULL; mask = 0; count = 0;  /* turn off hooks */[m
[31m-  } else {[m
[31m-    const char *smask = luaL_checkstring(L, arg+2);[m
[31m-    luaL_checktype(L, arg+1, LUA_TFUNCTION);[m
[31m-    count = luaL_optint(L, arg+3, 0);[m
[31m-    func = hookf; mask = makemask(smask, count);[m
[31m-  }[m
[31m-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-  lua_pushvalue(L, arg+1);[m
[31m-  lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-  lua_sethook(L, func, mask, count);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_gethook)[m
[31m-{[m
[31m-  char buff[5];[m
[31m-  int mask = lua_gethookmask(L);[m
[31m-  lua_Hook hook = lua_gethook(L);[m
[31m-  if (hook != NULL && hook != hookf) {  /* external hook? */[m
[31m-    lua_pushliteral(L, "external hook");[m
[31m-  } else {[m
[31m-    lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);   /* get hook */[m
[31m-  }[m
[31m-  lua_pushstring(L, unmakemask(mask, buff));[m
[31m-  lua_pushinteger(L, lua_gethookcount(L));[m
[31m-  return 3;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-LJLIB_CF(debug_debug)[m
[31m-{[m
[31m-  for (;;) {[m
[31m-    char buffer[250];[m
[31m-    fputs("lua_debug> ", stderr);[m
[31m-    if (fgets(buffer, sizeof(buffer), stdin) == 0 ||[m
[31m-	strcmp(buffer, "cont\n") == 0)[m
[31m-      return 0;[m
[31m-    if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||[m
[31m-	lua_pcall(L, 0, 0, 0)) {[m
[31m-      fputs(lua_tostring(L, -1), stderr);[m
[31m-      fputs("\n", stderr);[m
[31m-    }[m
[31m-    lua_settop(L, 0);  /* remove eventual returns */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LEVELS1	12	/* size of the first part of the stack */[m
[31m-#define LEVELS2	10	/* size of the second part of the stack */[m
[31m-[m
[31m-LJLIB_CF(debug_traceback)[m
[31m-{[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  const char *msg = lua_tostring(L, arg+1);[m
[31m-  if (msg == NULL && L->top > L->base+arg)[m
[31m-    L->top = L->base+arg+1;[m
[31m-  else[m
[31m-    luaL_traceback(L, L1, msg, lj_lib_optint(L, arg+2, (L == L1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_debug(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, LUA_DBLIBNAME, debug);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi.c[m
[1mdeleted file mode 100644[m
[1mindex 1feee21..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_ffi.c[m
[1m+++ /dev/null[m
[36m@@ -1,869 +0,0 @@[m
[31m-/*[m
[31m-** FFI library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_ffi_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include <errno.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cparse.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_carith.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#include "lj_ccallback.h"[m
[31m-#include "lj_clib.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* -- C type checks ------------------------------------------------------- */[m
[31m-[m
[31m-/* Check first argument for a C type and returns its ID. */[m
[31m-static CTypeID ffi_checkctype(lua_State *L, CTState *cts, TValue *param)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (!(o < L->top)) {[m
[31m-  err_argtype:[m
[31m-    lj_err_argtype(L, 1, "C type");[m
[31m-  }[m
[31m-  if (tvisstr(o)) {  /* Parse an abstract C type declaration. */[m
[31m-    GCstr *s = strV(o);[m
[31m-    CPState cp;[m
[31m-    int errcode;[m
[31m-    cp.L = L;[m
[31m-    cp.cts = cts;[m
[31m-    cp.srcname = strdata(s);[m
[31m-    cp.p = strdata(s);[m
[31m-    cp.param = param;[m
[31m-    cp.mode = CPARSE_MODE_ABSTRACT|CPARSE_MODE_NOIMPLICIT;[m
[31m-    errcode = lj_cparse(&cp);[m
[31m-    if (errcode) lj_err_throw(L, errcode);  /* Propagate errors. */[m
[31m-    return cp.val.id;[m
[31m-  } else {[m
[31m-    GCcdata *cd;[m
[31m-    if (!tviscdata(o)) goto err_argtype;[m
[31m-    if (param && param < L->top) lj_err_arg(L, 1, LJ_ERR_FFI_NUMPARAM);[m
[31m-    cd = cdataV(o);[m
[31m-    return cd->ctypeid == CTID_CTYPEID ? *(CTypeID *)cdataptr(cd) : cd->ctypeid;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Check argument for C data and return it. */[m
[31m-static GCcdata *ffi_checkcdata(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && tviscdata(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TCDATA);[m
[31m-  return cdataV(o);[m
[31m-}[m
[31m-[m
[31m-/* Convert argument to C pointer. */[m
[31m-static void *ffi_checkptr(lua_State *L, int narg, CTypeID id)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  void *p;[m
[31m-  if (o >= L->top)[m
[31m-    lj_err_arg(L, narg, LJ_ERR_NOVAL);[m
[31m-  lj_cconv_ct_tv(cts, ctype_get(cts, id), (uint8_t *)&p, o, CCF_ARG(narg));[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Convert argument to int32_t. */[m
[31m-static int32_t ffi_checkint(lua_State *L, int narg)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  int32_t i;[m
[31m-  if (o >= L->top)[m
[31m-    lj_err_arg(L, narg, LJ_ERR_NOVAL);[m
[31m-  lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT32), (uint8_t *)&i, o,[m
[31m-		 CCF_ARG(narg));[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-/* -- C type metamethods -------------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_ffi_meta[m
[31m-[m
[31m-/* Handle ctype __index/__newindex metamethods. */[m
[31m-static int ffi_index_meta(lua_State *L, CTState *cts, CType *ct, MMS mm)[m
[31m-{[m
[31m-  CTypeID id = ctype_typeid(cts, ct);[m
[31m-  cTValue *tv = lj_ctype_meta(cts, id, mm);[m
[31m-  TValue *base = L->base;[m
[31m-  if (!tv) {[m
[31m-    const char *s;[m
[31m-  err_index:[m
[31m-    s = strdata(lj_ctype_repr(L, id, NULL));[m
[31m-    if (tvisstr(L->base+1)) {[m
[31m-      lj_err_callerv(L, LJ_ERR_FFI_BADMEMBER, s, strVdata(L->base+1));[m
[31m-    } else {[m
[31m-      const char *key = tviscdata(L->base+1) ?[m
[31m-	strdata(lj_ctype_repr(L, cdataV(L->base+1)->ctypeid, NULL)) :[m
[31m-	lj_typename(L->base+1);[m
[31m-      lj_err_callerv(L, LJ_ERR_FFI_BADIDXW, s, key);[m
[31m-    }[m
[31m-  }[m
[31m-  if (!tvisfunc(tv)) {[m
[31m-    if (mm == MM_index) {[m
[31m-      cTValue *o = lj_meta_tget(L, tv, base+1);[m
[31m-      if (o) {[m
[31m-	if (tvisnil(o)) goto err_index;[m
[31m-	copyTV(L, L->top-1, o);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    } else {[m
[31m-      TValue *o = lj_meta_tset(L, tv, base+1);[m
[31m-      if (o) {[m
[31m-	copyTV(L, o, base+2);[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    copyTV(L, base, L->top);[m
[31m-    tv = L->top-1-LJ_FR2;[m
[31m-  }[m
[31m-  return lj_meta_tailcall(L, tv);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___index)	LJLIB_REC(cdata_index 0)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTInfo qual = 0;[m
[31m-  CType *ct;[m
[31m-  uint8_t *p;[m
[31m-  TValue *o = L->base;[m
[31m-  if (!(o+1 < L->top && tviscdata(o)))  /* Also checks for presence of key. */[m
[31m-    lj_err_argt(L, 1, LUA_TCDATA);[m
[31m-  ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual);[m
[31m-  if ((qual & 1))[m
[31m-    return ffi_index_meta(L, cts, ct, MM_index);[m
[31m-  if (lj_cdata_get(cts, ct, L->top-1, p))[m
[31m-    lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___newindex)	LJLIB_REC(cdata_index 1)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTInfo qual = 0;[m
[31m-  CType *ct;[m
[31m-  uint8_t *p;[m
[31m-  TValue *o = L->base;[m
[31m-  if (!(o+2 < L->top && tviscdata(o)))  /* Also checks for key and value. */[m
[31m-    lj_err_argt(L, 1, LUA_TCDATA);[m
[31m-  ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual);[m
[31m-  if ((qual & 1)) {[m
[31m-    if ((qual & CTF_CONST))[m
[31m-      lj_err_caller(L, LJ_ERR_FFI_WRCONST);[m
[31m-    return ffi_index_meta(L, cts, ct, MM_newindex);[m
[31m-  }[m
[31m-  lj_cdata_set(cts, ct, p, o+2, qual);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Common handler for cdata arithmetic. */[m
[31m-static int ffi_arith(lua_State *L)[m
[31m-{[m
[31m-  MMS mm = (MMS)(curr_func(L)->c.ffid - (int)FF_ffi_meta___eq + (int)MM_eq);[m
[31m-  return lj_carith_op(L, mm);[m
[31m-}[m
[31m-[m
[31m-/* The following functions must be in contiguous ORDER MM. */[m
[31m-LJLIB_CF(ffi_meta___eq)		LJLIB_REC(cdata_arith MM_eq)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___len)	LJLIB_REC(cdata_arith MM_len)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___lt)		LJLIB_REC(cdata_arith MM_lt)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___le)		LJLIB_REC(cdata_arith MM_le)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___concat)	LJLIB_REC(cdata_arith MM_concat)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static int lj_cf_ffi_new(lua_State *L);[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___call)	LJLIB_REC(cdata_call)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  GCcdata *cd = ffi_checkcdata(L, 1);[m
[31m-  CTypeID id = cd->ctypeid;[m
[31m-  CType *ct;[m
[31m-  cTValue *tv;[m
[31m-  MMS mm = MM_call;[m
[31m-  if (cd->ctypeid == CTID_CTYPEID) {[m
[31m-    id = *(CTypeID *)cdataptr(cd);[m
[31m-    mm = MM_new;[m
[31m-  } else {[m
[31m-    int ret = lj_ccall_func(L, cd);[m
[31m-    if (ret >= 0)[m
[31m-      return ret;[m
[31m-  }[m
[31m-  /* Handle ctype __call/__new metamethod. */[m
[31m-  ct = ctype_raw(cts, id);[m
[31m-  if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-  tv = lj_ctype_meta(cts, id, mm);[m
[31m-  if (tv)[m
[31m-    return lj_meta_tailcall(L, tv);[m
[31m-  else if (mm == MM_call)[m
[31m-    lj_err_callerv(L, LJ_ERR_FFI_BADCALL, strdata(lj_ctype_repr(L, id, NULL)));[m
[31m-  return lj_cf_ffi_new(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___add)	LJLIB_REC(cdata_arith MM_add)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___sub)	LJLIB_REC(cdata_arith MM_sub)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___mul)	LJLIB_REC(cdata_arith MM_mul)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___div)	LJLIB_REC(cdata_arith MM_div)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___mod)	LJLIB_REC(cdata_arith MM_mod)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___pow)	LJLIB_REC(cdata_arith MM_pow)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___unm)	LJLIB_REC(cdata_arith MM_unm)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-/* End of contiguous ORDER MM. */[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___tostring)[m
[31m-{[m
[31m-  GCcdata *cd = ffi_checkcdata(L, 1);[m
[31m-  const char *msg = "cdata<%s>: %p";[m
[31m-  CTypeID id = cd->ctypeid;[m
[31m-  void *p = cdataptr(cd);[m
[31m-  if (id == CTID_CTYPEID) {[m
[31m-    msg = "ctype<%s>";[m
[31m-    id = *(CTypeID *)p;[m
[31m-  } else {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    CType *ct = ctype_raw(cts, id);[m
[31m-    if (ctype_isref(ct->info)) {[m
[31m-      p = *(void **)p;[m
[31m-      ct = ctype_rawchild(cts, ct);[m
[31m-    }[m
[31m-    if (ctype_iscomplex(ct->info)) {[m
[31m-      setstrV(L, L->top-1, lj_ctype_repr_complex(L, cdataptr(cd), ct->size));[m
[31m-      goto checkgc;[m
[31m-    } else if (ct->size == 8 && ctype_isinteger(ct->info)) {[m
[31m-      setstrV(L, L->top-1, lj_ctype_repr_int64(L, *(uint64_t *)cdataptr(cd),[m
[31m-					       (ct->info & CTF_UNSIGNED)));[m
[31m-      goto checkgc;[m
[31m-    } else if (ctype_isfunc(ct->info)) {[m
[31m-      p = *(void **)p;[m
[31m-    } else if (ctype_isenum(ct->info)) {[m
[31m-      msg = "cdata<%s>: %d";[m
[31m-      p = (void *)(uintptr_t)*(uint32_t **)p;[m
[31m-    } else {[m
[31m-      if (ctype_isptr(ct->info)) {[m
[31m-	p = cdata_getptr(p, ct->size);[m
[31m-	ct = ctype_rawchild(cts, ct);[m
[31m-      }[m
[31m-      if (ctype_isstruct(ct->info) || ctype_isvector(ct->info)) {[m
[31m-	/* Handle ctype __tostring metamethod. */[m
[31m-	cTValue *tv = lj_ctype_meta(cts, ctype_typeid(cts, ct), MM_tostring);[m
[31m-	if (tv)[m
[31m-	  return lj_meta_tailcall(L, tv);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lj_strfmt_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), p);[m
[31m-checkgc:[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int ffi_pairs(lua_State *L, MMS mm)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkcdata(L, 1)->ctypeid;[m
[31m-  CType *ct = ctype_raw(cts, id);[m
[31m-  cTValue *tv;[m
[31m-  if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-  tv = lj_ctype_meta(cts, id, mm);[m
[31m-  if (!tv)[m
[31m-    lj_err_callerv(L, LJ_ERR_FFI_BADMM, strdata(lj_ctype_repr(L, id, NULL)),[m
[31m-		   strdata(mmname_str(G(L), mm)));[m
[31m-  return lj_meta_tailcall(L, tv);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___pairs)[m
[31m-{[m
[31m-  return ffi_pairs(L, MM_pairs);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___ipairs)[m
[31m-{[m
[31m-  return ffi_pairs(L, MM_ipairs);[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH("ffi") LJLIB_SET(__metatable)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- C library metamethods ----------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_ffi_clib[m
[31m-[m
[31m-/* Index C library by a name. */[m
[31m-static TValue *ffi_clib_index(lua_State *L)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  CLibrary *cl;[m
[31m-  if (!(o < L->top && tvisudata(o) && udataV(o)->udtype == UDTYPE_FFI_CLIB))[m
[31m-    lj_err_argt(L, 1, LUA_TUSERDATA);[m
[31m-  cl = (CLibrary *)uddata(udataV(o));[m
[31m-  if (!(o+1 < L->top && tvisstr(o+1)))[m
[31m-    lj_err_argt(L, 2, LUA_TSTRING);[m
[31m-  return lj_clib_index(L, cl, strV(o+1));[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_clib___index)	LJLIB_REC(clib_index 1)[m
[31m-{[m
[31m-  TValue *tv = ffi_clib_index(L);[m
[31m-  if (tviscdata(tv)) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    GCcdata *cd = cdataV(tv);[m
[31m-    CType *s = ctype_get(cts, cd->ctypeid);[m
[31m-    if (ctype_isextern(s->info)) {[m
[31m-      CTypeID sid = ctype_cid(s->info);[m
[31m-      void *sp = *(void **)cdataptr(cd);[m
[31m-      CType *ct = ctype_raw(cts, sid);[m
[31m-      if (lj_cconv_tv_ct(cts, ct, sid, L->top-1, sp))[m
[31m-	lj_gc_check(L);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  copyTV(L, L->top-1, tv);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_clib___newindex)	LJLIB_REC(clib_index 0)[m
[31m-{[m
[31m-  TValue *tv = ffi_clib_index(L);[m
[31m-  TValue *o = L->base+2;[m
[31m-  if (o < L->top && tviscdata(tv)) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    GCcdata *cd = cdataV(tv);[m
[31m-    CType *d = ctype_get(cts, cd->ctypeid);[m
[31m-    if (ctype_isextern(d->info)) {[m
[31m-      CTInfo qual = 0;[m
[31m-      for (;;) {  /* Skip attributes and collect qualifiers. */[m
[31m-	d = ctype_child(cts, d);[m
[31m-	if (!ctype_isattrib(d->info)) break;[m
[31m-	if (ctype_attrib(d->info) == CTA_QUAL) qual |= d->size;[m
[31m-      }[m
[31m-      if (!((d->info|qual) & CTF_CONST)) {[m
[31m-	lj_cconv_ct_tv(cts, d, *(void **)cdataptr(cd), o, 0);[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_caller(L, LJ_ERR_FFI_WRCONST);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_clib___gc)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (o < L->top && tvisudata(o) && udataV(o)->udtype == UDTYPE_FFI_CLIB)[m
[31m-    lj_clib_unload((CLibrary *)uddata(udataV(o)));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- Callback function metamethods --------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_ffi_callback[m
[31m-[m
[31m-static int ffi_callback_set(lua_State *L, GCfunc *fn)[m
[31m-{[m
[31m-  GCcdata *cd = ffi_checkcdata(L, 1);[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  if (ctype_isptr(ct->info) && (LJ_32 || ct->size == 8)) {[m
[31m-    MSize slot = lj_ccallback_ptr2slot(cts, *(void **)cdataptr(cd));[m
[31m-    if (slot < cts->cb.sizeid && cts->cb.cbid[slot] != 0) {[m
[31m-      GCtab *t = cts->miscmap;[m
[31m-      TValue *tv = lj_tab_setint(L, t, (int32_t)slot);[m
[31m-      if (fn) {[m
[31m-	setfuncV(L, tv, fn);[m
[31m-	lj_gc_anybarriert(L, t);[m
[31m-      } else {[m
[31m-	setnilV(tv);[m
[31m-	cts->cb.cbid[slot] = 0;[m
[31m-	cts->cb.topid = slot < cts->cb.topid ? slot : cts->cb.topid;[m
[31m-      }[m
[31m-      return 0;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_caller(L, LJ_ERR_FFI_BADCBACK);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_callback_free)[m
[31m-{[m
[31m-  return ffi_callback_set(L, NULL);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_callback_set)[m
[31m-{[m
[31m-  GCfunc *fn = lj_lib_checkfunc(L, 2);[m
[31m-  return ffi_callback_set(L, fn);[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-1) LJLIB_SET(__index)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- FFI library functions ----------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_ffi[m
[31m-[m
[31m-LJLIB_CF(ffi_cdef)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  CPState cp;[m
[31m-  int errcode;[m
[31m-  cp.L = L;[m
[31m-  cp.cts = ctype_cts(L);[m
[31m-  cp.srcname = strdata(s);[m
[31m-  cp.p = strdata(s);[m
[31m-  cp.param = L->base+1;[m
[31m-  cp.mode = CPARSE_MODE_MULTI|CPARSE_MODE_DIRECT;[m
[31m-  errcode = lj_cparse(&cp);[m
[31m-  if (errcode) lj_err_throw(L, errcode);  /* Propagate errors. */[m
[31m-  lj_gc_check(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_new)	LJLIB_REC(.)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  CType *ct = ctype_raw(cts, id);[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  TValue *o = L->base+1;[m
[31m-  GCcdata *cd;[m
[31m-  if ((info & CTF_VLA)) {[m
[31m-    o++;[m
[31m-    sz = lj_ctype_vlsize(cts, ct, (CTSize)ffi_checkint(L, 2));[m
[31m-  }[m
[31m-  if (sz == CTSIZE_INVALID)[m
[31m-    lj_err_arg(L, 1, LJ_ERR_FFI_INVSIZE);[m
[31m-  cd = lj_cdata_newx(cts, id, sz, info);[m
[31m-  setcdataV(L, o-1, cd);  /* Anchor the uninitialized cdata. */[m
[31m-  lj_cconv_ct_init(cts, ct, sz, cdataptr(cd),[m
[31m-		   o, (MSize)(L->top - o));  /* Initialize cdata. */[m
[31m-  if (ctype_isstruct(ct->info)) {[m
[31m-    /* Handle ctype __gc metamethod. Use the fast lookup here. */[m
[31m-    cTValue *tv = lj_tab_getinth(cts->miscmap, -(int32_t)id);[m
[31m-    if (tv && tvistab(tv) && (tv = lj_meta_fast(L, tabV(tv), MM_gc))) {[m
[31m-      GCtab *t = cts->finalizer;[m
[31m-      if (gcref(t->metatable)) {[m
[31m-	/* Add to finalizer table, if still enabled. */[m
[31m-	copyTV(L, lj_tab_set(L, t, o-1), tv);[m
[31m-	lj_gc_anybarriert(L, t);[m
[31m-	cd->marked |= LJ_GC_CDATA_FIN;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  L->top = o;  /* Only return the cdata itself. */[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_cast)	LJLIB_REC(ffi_new)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  CType *d = ctype_raw(cts, id);[m
[31m-  TValue *o = lj_lib_checkany(L, 2);[m
[31m-  L->top = o+1;  /* Make sure this is the last item on the stack. */[m
[31m-  if (!(ctype_isnum(d->info) || ctype_isptr(d->info) || ctype_isenum(d->info)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE);[m
[31m-  if (!(tviscdata(o) && cdataV(o)->ctypeid == id)) {[m
[31m-    GCcdata *cd = lj_cdata_new(cts, id, d->size);[m
[31m-    lj_cconv_ct_tv(cts, d, cdataptr(cd), o, CCF_CAST);[m
[31m-    setcdataV(L, o, cd);[m
[31m-    lj_gc_check(L);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_typeof)	LJLIB_REC(.)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, L->base+1);[m
[31m-  GCcdata *cd = lj_cdata_new(cts, CTID_CTYPEID, 4);[m
[31m-  *(CTypeID *)cdataptr(cd) = id;[m
[31m-  setcdataV(L, L->top-1, cd);[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Internal and unsupported API. */[m
[31m-LJLIB_CF(ffi_typeinfo)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = (CTypeID)ffi_checkint(L, 1);[m
[31m-  if (id > 0 && id < cts->top) {[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, 0, 4);  /* Increment hash size if fields are added. */[m
[31m-    t = tabV(L->top-1);[m
[31m-    setintV(lj_tab_setstr(L, t, lj_str_newlit(L, "info")), (int32_t)ct->info);[m
[31m-    if (ct->size != CTSIZE_INVALID)[m
[31m-      setintV(lj_tab_setstr(L, t, lj_str_newlit(L, "size")), (int32_t)ct->size);[m
[31m-    if (ct->sib)[m
[31m-      setintV(lj_tab_setstr(L, t, lj_str_newlit(L, "sib")), (int32_t)ct->sib);[m
[31m-    if (gcref(ct->name)) {[m
[31m-      GCstr *s = gco2str(gcref(ct->name));[m
[31m-      setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "name")), s);[m
[31m-    }[m
[31m-    lj_gc_check(L);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_istype)	LJLIB_REC(.)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id1 = ffi_checkctype(L, cts, NULL);[m
[31m-  TValue *o = lj_lib_checkany(L, 2);[m
[31m-  int b = 0;[m
[31m-  if (tviscdata(o)) {[m
[31m-    GCcdata *cd = cdataV(o);[m
[31m-    CTypeID id2 = cd->ctypeid == CTID_CTYPEID ? *(CTypeID *)cdataptr(cd) :[m
[31m-						cd->ctypeid;[m
[31m-    CType *ct1 = lj_ctype_rawref(cts, id1);[m
[31m-    CType *ct2 = lj_ctype_rawref(cts, id2);[m
[31m-    if (ct1 == ct2) {[m
[31m-      b = 1;[m
[31m-    } else if (ctype_type(ct1->info) == ctype_type(ct2->info) &&[m
[31m-	       ct1->size == ct2->size) {[m
[31m-      if (ctype_ispointer(ct1->info))[m
[31m-	b = lj_cconv_compatptr(cts, ct1, ct2, CCF_IGNQUAL);[m
[31m-      else if (ctype_isnum(ct1->info) || ctype_isvoid(ct1->info))[m
[31m-	b = (((ct1->info ^ ct2->info) & ~(CTF_QUAL|CTF_LONG)) == 0);[m
[31m-    } else if (ctype_isstruct(ct1->info) && ctype_isptr(ct2->info) &&[m
[31m-	       ct1 == ctype_rawchild(cts, ct2)) {[m
[31m-      b = 1;[m
[31m-    }[m
[31m-  }[m
[31m-  setboolV(L->top-1, b);[m
[31m-  setboolV(&G(L)->tmptv2, b);  /* Remember for trace recorder. */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_sizeof)	LJLIB_REC(ffi_xof FF_ffi_sizeof)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  CTSize sz;[m
[31m-  if (LJ_UNLIKELY(tviscdata(L->base) && cdataisv(cdataV(L->base)))) {[m
[31m-    sz = cdatavlen(cdataV(L->base));[m
[31m-  } else {[m
[31m-    CType *ct = lj_ctype_rawref(cts, id);[m
[31m-    if (ctype_isvltype(ct->info))[m
[31m-      sz = lj_ctype_vlsize(cts, ct, (CTSize)ffi_checkint(L, 2));[m
[31m-    else[m
[31m-      sz = ctype_hassize(ct->info) ? ct->size : CTSIZE_INVALID;[m
[31m-    if (LJ_UNLIKELY(sz == CTSIZE_INVALID)) {[m
[31m-      setnilV(L->top-1);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  setintV(L->top-1, (int32_t)sz);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_alignof)	LJLIB_REC(ffi_xof FF_ffi_alignof)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  CTSize sz = 0;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  setintV(L->top-1, 1 << ctype_align(info));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_offsetof)	LJLIB_REC(ffi_xof FF_ffi_offsetof)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  GCstr *name = lj_lib_checkstr(L, 2);[m
[31m-  CType *ct = lj_ctype_rawref(cts, id);[m
[31m-  CTSize ofs;[m
[31m-  if (ctype_isstruct(ct->info) && ct->size != CTSIZE_INVALID) {[m
[31m-    CType *fct = lj_ctype_getfield(cts, ct, name, &ofs);[m
[31m-    if (fct) {[m
[31m-      setintV(L->top-1, ofs);[m
[31m-      if (ctype_isfield(fct->info)) {[m
[31m-	return 1;[m
[31m-      } else if (ctype_isbitfield(fct->info)) {[m
[31m-	setintV(L->top++, ctype_bitpos(fct->info));[m
[31m-	setintV(L->top++, ctype_bitbsz(fct->info));[m
[31m-	return 3;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_errno)	LJLIB_REC(.)[m
[31m-{[m
[31m-  int err = errno;[m
[31m-  if (L->top > L->base)[m
[31m-    errno = ffi_checkint(L, 1);[m
[31m-  setintV(L->top++, err);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_string)	LJLIB_REC(.)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  TValue *o = lj_lib_checkany(L, 1);[m
[31m-  const char *p;[m
[31m-  size_t len;[m
[31m-  if (o+1 < L->top && !tvisnil(o+1)) {[m
[31m-    len = (size_t)ffi_checkint(L, 2);[m
[31m-    lj_cconv_ct_tv(cts, ctype_get(cts, CTID_P_CVOID), (uint8_t *)&p, o,[m
[31m-		   CCF_ARG(1));[m
[31m-  } else {[m
[31m-    lj_cconv_ct_tv(cts, ctype_get(cts, CTID_P_CCHAR), (uint8_t *)&p, o,[m
[31m-		   CCF_ARG(1));[m
[31m-    len = strlen(p);[m
[31m-  }[m
[31m-  L->top = o+1;  /* Make sure this is the last item on the stack. */[m
[31m-  setstrV(L, o, lj_str_new(L, p, len));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_copy)	LJLIB_REC(.)[m
[31m-{[m
[31m-  void *dp = ffi_checkptr(L, 1, CTID_P_VOID);[m
[31m-  void *sp = ffi_checkptr(L, 2, CTID_P_CVOID);[m
[31m-  TValue *o = L->base+1;[m
[31m-  CTSize len;[m
[31m-  if (tvisstr(o) && o+1 >= L->top)[m
[31m-    len = strV(o)->len+1;  /* Copy Lua string including trailing '\0'. */[m
[31m-  else[m
[31m-    len = (CTSize)ffi_checkint(L, 3);[m
[31m-  memcpy(dp, sp, len);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_fill)	LJLIB_REC(.)[m
[31m-{[m
[31m-  void *dp = ffi_checkptr(L, 1, CTID_P_VOID);[m
[31m-  CTSize len = (CTSize)ffi_checkint(L, 2);[m
[31m-  int32_t fill = 0;[m
[31m-  if (L->base+2 < L->top && !tvisnil(L->base+2)) fill = ffi_checkint(L, 3);[m
[31m-  memset(dp, fill, len);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#define H_(le, be)	LJ_ENDIAN_SELECT(0x##le, 0x##be)[m
[31m-[m
[31m-/* Test ABI string. */[m
[31m-LJLIB_CF(ffi_abi)	LJLIB_REC(.)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  int b = 0;[m
[31m-  switch (s->hash) {[m
[31m-#if LJ_64[m
[31m-  case H_(849858eb,ad35fd06): b = 1; break;  /* 64bit */[m
[31m-#else[m
[31m-  case H_(662d3c79,d0e22477): b = 1; break;  /* 32bit */[m
[31m-#endif[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-  case H_(e33ee463,e33ee463): b = 1; break;  /* fpu */[m
[31m-#endif[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-  case H_(61211a23,c2e8c81c): b = 1; break;  /* softfp */[m
[31m-#else[m
[31m-  case H_(539417a8,8ce0812f): b = 1; break;  /* hardfp */[m
[31m-#endif[m
[31m-#if LJ_ABI_EABI[m
[31m-  case H_(2182df8f,f2ed1152): b = 1; break;  /* eabi */[m
[31m-#endif[m
[31m-#if LJ_ABI_WIN[m
[31m-  case H_(4ab624a8,4ab624a8): b = 1; break;  /* win */[m
[31m-#endif[m
[31m-  case H_(3af93066,1f001464): b = 1; break;  /* le/be */[m
[31m-#if LJ_GC64[m
[31m-  case H_(9e89d2c9,13c83c92): b = 1; break;  /* gc64 */[m
[31m-#endif[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-  setboolV(L->top-1, b);[m
[31m-  setboolV(&G(L)->tmptv2, b);  /* Remember for trace recorder. */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#undef H_[m
[31m-[m
[31m-LJLIB_PUSH(top-8) LJLIB_SET(!)  /* Store reference to miscmap table. */[m
[31m-[m
[31m-LJLIB_CF(ffi_metatype)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  GCtab *mt = lj_lib_checktab(L, 2);[m
[31m-  GCtab *t = cts->miscmap;[m
[31m-  CType *ct = ctype_get(cts, id);  /* Only allow raw types. */[m
[31m-  TValue *tv;[m
[31m-  GCcdata *cd;[m
[31m-  if (!(ctype_isstruct(ct->info) || ctype_iscomplex(ct->info) ||[m
[31m-	ctype_isvector(ct->info)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE);[m
[31m-  tv = lj_tab_setinth(L, t, -(int32_t)id);[m
[31m-  if (!tvisnil(tv))[m
[31m-    lj_err_caller(L, LJ_ERR_PROTMT);[m
[31m-  settabV(L, tv, mt);[m
[31m-  lj_gc_anybarriert(L, t);[m
[31m-  cd = lj_cdata_new(cts, CTID_CTYPEID, 4);[m
[31m-  *(CTypeID *)cdataptr(cd) = id;[m
[31m-  setcdataV(L, L->top-1, cd);[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-7) LJLIB_SET(!)  /* Store reference to finalizer table. */[m
[31m-[m
[31m-LJLIB_CF(ffi_gc)	LJLIB_REC(.)[m
[31m-{[m
[31m-  GCcdata *cd = ffi_checkcdata(L, 1);[m
[31m-  TValue *fin = lj_lib_checkany(L, 2);[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  if (!(ctype_isptr(ct->info) || ctype_isstruct(ct->info) ||[m
[31m-	ctype_isrefarray(ct->info)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE);[m
[31m-  lj_cdata_setfin(L, cd, gcval(fin), itype(fin));[m
[31m-  L->top = L->base+1;  /* Pass through the cdata object. */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-5) LJLIB_SET(!)  /* Store clib metatable in func environment. */[m
[31m-[m
[31m-LJLIB_CF(ffi_load)[m
[31m-{[m
[31m-  GCstr *name = lj_lib_checkstr(L, 1);[m
[31m-  int global = (L->base+1 < L->top && tvistruecond(L->base+1));[m
[31m-  lj_clib_load(L, tabref(curr_func(L)->c.env), name, global);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-4) LJLIB_SET(C)[m
[31m-LJLIB_PUSH(top-3) LJLIB_SET(os)[m
[31m-LJLIB_PUSH(top-2) LJLIB_SET(arch)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Create special weak-keyed finalizer table. */[m
[31m-static GCtab *ffi_finalizer(lua_State *L)[m
[31m-{[m
[31m-  /* NOBARRIER: The table is new (marked white). */[m
[31m-  GCtab *t = lj_tab_new(L, 0, 1);[m
[31m-  settabV(L, L->top++, t);[m
[31m-  setgcref(t->metatable, obj2gco(t));[m
[31m-  setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")),[m
[31m-	  lj_str_newlit(L, "K"));[m
[31m-  t->nomm = (uint8_t)(~(1u<<MM_mode));[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* Register FFI module as loaded. */[m
[31m-static void ffi_register_module(lua_State *L)[m
[31m-{[m
[31m-  cTValue *tmp = lj_tab_getstr(tabV(registry(L)), lj_str_newlit(L, "_LOADED"));[m
[31m-  if (tmp && tvistab(tmp)) {[m
[31m-    GCtab *t = tabV(tmp);[m
[31m-    copyTV(L, lj_tab_setstr(L, t, lj_str_newlit(L, LUA_FFILIBNAME)), L->top-1);[m
[31m-    lj_gc_anybarriert(L, t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaopen_ffi(lua_State *L)[m
[31m-{[m
[31m-  CTState *cts = lj_ctype_init(L);[m
[31m-  settabV(L, L->top++, (cts->miscmap = lj_tab_new(L, 0, 1)));[m
[31m-  cts->finalizer = ffi_finalizer(L);[m
[31m-  LJ_LIB_REG(L, NULL, ffi_meta);[m
[31m-  /* NOBARRIER: basemt is a GC root. */[m
[31m-  setgcref(basemt_it(G(L), LJ_TCDATA), obj2gco(tabV(L->top-1)));[m
[31m-  LJ_LIB_REG(L, NULL, ffi_clib);[m
[31m-  LJ_LIB_REG(L, NULL, ffi_callback);[m
[31m-  /* NOBARRIER: the key is new and lj_tab_newkey() handles the barrier. */[m
[31m-  settabV(L, lj_tab_setstr(L, cts->miscmap, &cts->g->strempty), tabV(L->top-1));[m
[31m-  L->top--;[m
[31m-  lj_clib_default(L, tabV(L->top-1));  /* Create ffi.C default namespace. */[m
[31m-  lua_pushliteral(L, LJ_OS_NAME);[m
[31m-  lua_pushliteral(L, LJ_ARCH_NAME);[m
[31m-  LJ_LIB_REG(L, NULL, ffi);  /* Note: no global "ffi" created! */[m
[31m-  ffi_register_module(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init.c[m
[1mdeleted file mode 100644[m
[1mindex 63c2ace..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-/*[m
[31m-** Library initialization.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major parts taken verbatim from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_init_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-static const luaL_Reg lj_lib_load[] = {[m
[31m-  { "",			luaopen_base },[m
[31m-  { LUA_LOADLIBNAME,	luaopen_package },[m
[31m-  { LUA_TABLIBNAME,	luaopen_table },[m
[31m-  { LUA_IOLIBNAME,	luaopen_io },[m
[31m-  { LUA_OSLIBNAME,	luaopen_os },[m
[31m-  { LUA_STRLIBNAME,	luaopen_string },[m
[31m-  { LUA_MATHLIBNAME,	luaopen_math },[m
[31m-  { LUA_DBLIBNAME,	luaopen_debug },[m
[31m-  { LUA_BITLIBNAME,	luaopen_bit },[m
[31m-  { LUA_JITLIBNAME,	luaopen_jit },[m
[31m-  { NULL,		NULL }[m
[31m-};[m
[31m-[m
[31m-static const luaL_Reg lj_lib_preload[] = {[m
[31m-#if LJ_HASFFI[m
[31m-  { LUA_FFILIBNAME,	luaopen_ffi },[m
[31m-#endif[m
[31m-  { NULL,		NULL }[m
[31m-};[m
[31m-[m
[31m-LUALIB_API void luaL_openlibs(lua_State *L)[m
[31m-{[m
[31m-  const luaL_Reg *lib;[m
[31m-  for (lib = lj_lib_load; lib->func; lib++) {[m
[31m-    lua_pushcfunction(L, lib->func);[m
[31m-    lua_pushstring(L, lib->name);[m
[31m-    lua_call(L, 1, 0);[m
[31m-  }[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD",[m
[31m-		 sizeof(lj_lib_preload)/sizeof(lj_lib_preload[0])-1);[m
[31m-  for (lib = lj_lib_preload; lib->func; lib++) {[m
[31m-    lua_pushcfunction(L, lib->func);[m
[31m-    lua_setfield(L, -2, lib->name);[m
[31m-  }[m
[31m-  lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io.c[m
[1mdeleted file mode 100644[m
[1mindex 31f0ea9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_io.c[m
[1m+++ /dev/null[m
[36m@@ -1,540 +0,0 @@[m
[31m-/*[m
[31m-** I/O library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lib_io_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* Userdata payload for I/O file. */[m
[31m-typedef struct IOFileUD {[m
[31m-  FILE *fp;		/* File handle. */[m
[31m-  uint32_t type;	/* File type. */[m
[31m-} IOFileUD;[m
[31m-[m
[31m-#define IOFILE_TYPE_FILE	0	/* Regular file. */[m
[31m-#define IOFILE_TYPE_PIPE	1	/* Pipe. */[m
[31m-#define IOFILE_TYPE_STDF	2	/* Standard file handle. */[m
[31m-#define IOFILE_TYPE_MASK	3[m
[31m-[m
[31m-#define IOFILE_FLAG_CLOSE	4	/* Close after io.lines() iterator. */[m
[31m-[m
[31m-#define IOSTDF_UD(L, id)	(&gcref(G(L)->gcroot[(id)])->ud)[m
[31m-#define IOSTDF_IOF(L, id)	((IOFileUD *)uddata(IOSTDF_UD(L, (id))))[m
[31m-[m
[31m-/* -- Open/close helpers -------------------------------------------------- */[m
[31m-[m
[31m-static IOFileUD *io_tofilep(lua_State *L)[m
[31m-{[m
[31m-  if (!(L->base < L->top && tvisudata(L->base) &&[m
[31m-	udataV(L->base)->udtype == UDTYPE_IO_FILE))[m
[31m-    lj_err_argtype(L, 1, "FILE*");[m
[31m-  return (IOFileUD *)uddata(udataV(L->base));[m
[31m-}[m
[31m-[m
[31m-static IOFileUD *io_tofile(lua_State *L)[m
[31m-{[m
[31m-  IOFileUD *iof = io_tofilep(L);[m
[31m-  if (iof->fp == NULL)[m
[31m-    lj_err_caller(L, LJ_ERR_IOCLFL);[m
[31m-  return iof;[m
[31m-}[m
[31m-[m
[31m-static FILE *io_stdfile(lua_State *L, ptrdiff_t id)[m
[31m-{[m
[31m-  IOFileUD *iof = IOSTDF_IOF(L, id);[m
[31m-  if (iof->fp == NULL)[m
[31m-    lj_err_caller(L, LJ_ERR_IOSTDCL);[m
[31m-  return iof->fp;[m
[31m-}[m
[31m-[m
[31m-static IOFileUD *io_file_new(lua_State *L)[m
[31m-{[m
[31m-  IOFileUD *iof = (IOFileUD *)lua_newuserdata(L, sizeof(IOFileUD));[m
[31m-  GCudata *ud = udataV(L->top-1);[m
[31m-  ud->udtype = UDTYPE_IO_FILE;[m
[31m-  /* NOBARRIER: The GCudata is new (marked white). */[m
[31m-  setgcrefr(ud->metatable, curr_func(L)->c.env);[m
[31m-  iof->fp = NULL;[m
[31m-  iof->type = IOFILE_TYPE_FILE;[m
[31m-  return iof;[m
[31m-}[m
[31m-[m
[31m-static IOFileUD *io_file_open(lua_State *L, const char *mode)[m
[31m-{[m
[31m-  const char *fname = strdata(lj_lib_checkstr(L, 1));[m
[31m-  IOFileUD *iof = io_file_new(L);[m
[31m-  iof->fp = fopen(fname, mode);[m
[31m-  if (iof->fp == NULL)[m
[31m-    luaL_argerror(L, 1, lj_strfmt_pushf(L, "%s: %s", fname, strerror(errno)));[m
[31m-  return iof;[m
[31m-}[m
[31m-[m
[31m-static int io_file_close(lua_State *L, IOFileUD *iof)[m
[31m-{[m
[31m-  int ok;[m
[31m-  if ((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_FILE) {[m
[31m-    ok = (fclose(iof->fp) == 0);[m
[31m-  } else if ((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_PIPE) {[m
[31m-    int stat = -1;[m
[31m-#if LJ_TARGET_POSIX[m
[31m-    stat = pclose(iof->fp);[m
[31m-#elif LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE[m
[31m-    stat = _pclose(iof->fp);[m
[31m-#else[m
[31m-    lua_assert(0);[m
[31m-    return 0;[m
[31m-#endif[m
[31m-#if LJ_52[m
[31m-    iof->fp = NULL;[m
[31m-    return luaL_execresult(L, stat);[m
[31m-#else[m
[31m-    ok = (stat != -1);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    lua_assert((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_STDF);[m
[31m-    setnilV(L->top++);[m
[31m-    lua_pushliteral(L, "cannot close standard file");[m
[31m-    return 2;[m
[31m-  }[m
[31m-  iof->fp = NULL;[m
[31m-  return luaL_fileresult(L, ok, NULL);[m
[31m-}[m
[31m-[m
[31m-/* -- Read/write helpers -------------------------------------------------- */[m
[31m-[m
[31m-static int io_file_readnum(lua_State *L, FILE *fp)[m
[31m-{[m
[31m-  lua_Number d;[m
[31m-  if (fscanf(fp, LUA_NUMBER_SCAN, &d) == 1) {[m
[31m-    if (LJ_DUALNUM) {[m
[31m-      int32_t i = lj_num2int(d);[m
[31m-      if (d == (lua_Number)i && !tvismzero((cTValue *)&d)) {[m
[31m-	setintV(L->top++, i);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    setnumV(L->top++, d);[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    setnilV(L->top++);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int io_file_readline(lua_State *L, FILE *fp, MSize chop)[m
[31m-{[m
[31m-  MSize m = LUAL_BUFFERSIZE, n = 0, ok = 0;[m
[31m-  char *buf;[m
[31m-  for (;;) {[m
[31m-    buf = lj_buf_tmp(L, m);[m
[31m-    if (fgets(buf+n, m-n, fp) == NULL) break;[m
[31m-    n += (MSize)strlen(buf+n);[m
[31m-    ok |= n;[m
[31m-    if (n && buf[n-1] == '\n') { n -= chop; break; }[m
[31m-    if (n >= m - 64) m += m;[m
[31m-  }[m
[31m-  setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n));[m
[31m-  lj_gc_check(L);[m
[31m-  return (int)ok;[m
[31m-}[m
[31m-[m
[31m-static void io_file_readall(lua_State *L, FILE *fp)[m
[31m-{[m
[31m-  MSize m, n;[m
[31m-  for (m = LUAL_BUFFERSIZE, n = 0; ; m += m) {[m
[31m-    char *buf = lj_buf_tmp(L, m);[m
[31m-    n += (MSize)fread(buf+n, 1, m-n, fp);[m
[31m-    if (n != m) {[m
[31m-      setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n));[m
[31m-      lj_gc_check(L);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int io_file_readlen(lua_State *L, FILE *fp, MSize m)[m
[31m-{[m
[31m-  if (m) {[m
[31m-    char *buf = lj_buf_tmp(L, m);[m
[31m-    MSize n = (MSize)fread(buf, 1, m, fp);[m
[31m-    setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n));[m
[31m-    lj_gc_check(L);[m
[31m-    return (n > 0 || m == 0);[m
[31m-  } else {[m
[31m-    int c = getc(fp);[m
[31m-    ungetc(c, fp);[m
[31m-    setstrV(L, L->top++, &G(L)->strempty);[m
[31m-    return (c != EOF);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int io_file_read(lua_State *L, FILE *fp, int start)[m
[31m-{[m
[31m-  int ok, n, nargs = (int)(L->top - L->base) - start;[m
[31m-  clearerr(fp);[m
[31m-  if (nargs == 0) {[m
[31m-    ok = io_file_readline(L, fp, 1);[m
[31m-    n = start+1;  /* Return 1 result. */[m
[31m-  } else {[m
[31m-    /* The results plus the buffers go on top of the args. */[m
[31m-    luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments");[m
[31m-    ok = 1;[m
[31m-    for (n = start; nargs-- && ok; n++) {[m
[31m-      if (tvisstr(L->base+n)) {[m
[31m-	const char *p = strVdata(L->base+n);[m
[31m-	if (p[0] != '*')[m
[31m-	  lj_err_arg(L, n+1, LJ_ERR_INVOPT);[m
[31m-	if (p[1] == 'n')[m
[31m-	  ok = io_file_readnum(L, fp);[m
[31m-	else if ((p[1] & ~0x20) == 'L')[m
[31m-	  ok = io_file_readline(L, fp, (p[1] == 'l'));[m
[31m-	else if (p[1] == 'a')[m
[31m-	  io_file_readall(L, fp);[m
[31m-	else[m
[31m-	  lj_err_arg(L, n+1, LJ_ERR_INVFMT);[m
[31m-      } else if (tvisnumber(L->base+n)) {[m
[31m-	ok = io_file_readlen(L, fp, (MSize)lj_lib_checkint(L, n+1));[m
[31m-      } else {[m
[31m-	lj_err_arg(L, n+1, LJ_ERR_INVOPT);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (ferror(fp))[m
[31m-    return luaL_fileresult(L, 0, NULL);[m
[31m-  if (!ok)[m
[31m-    setnilV(L->top-1);  /* Replace last result with nil. */[m
[31m-  return n - start;[m
[31m-}[m
[31m-[m
[31m-static int io_file_write(lua_State *L, FILE *fp, int start)[m
[31m-{[m
[31m-  cTValue *tv;[m
[31m-  int status = 1;[m
[31m-  for (tv = L->base+start; tv < L->top; tv++) {[m
[31m-    MSize len;[m
[31m-    const char *p = lj_strfmt_wstrnum(L, tv, &len);[m
[31m-    if (!p)[m
[31m-      lj_err_argt(L, (int)(tv - L->base) + 1, LUA_TSTRING);[m
[31m-    status = status && (fwrite(p, 1, len, fp) == len);[m
[31m-  }[m
[31m-  if (LJ_52 && status) {[m
[31m-    L->top = L->base+1;[m
[31m-    if (start == 0)[m
[31m-      setudataV(L, L->base, IOSTDF_UD(L, GCROOT_IO_OUTPUT));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return luaL_fileresult(L, status, NULL);[m
[31m-}[m
[31m-[m
[31m-static int io_file_iter(lua_State *L)[m
[31m-{[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  IOFileUD *iof = uddata(udataV(&fn->c.upvalue[0]));[m
[31m-  int n = fn->c.nupvalues - 1;[m
[31m-  if (iof->fp == NULL)[m
[31m-    lj_err_caller(L, LJ_ERR_IOCLFL);[m
[31m-  L->top = L->base;[m
[31m-  if (n) {  /* Copy upvalues with options to stack. */[m
[31m-    if (n > LUAI_MAXCSTACK)[m
[31m-      lj_err_caller(L, LJ_ERR_STKOV);[m
[31m-    lj_state_checkstack(L, (MSize)n);[m
[31m-    memcpy(L->top, &fn->c.upvalue[1], n*sizeof(TValue));[m
[31m-    L->top += n;[m
[31m-  }[m
[31m-  n = io_file_read(L, iof->fp, 0);[m
[31m-  if (ferror(iof->fp))[m
[31m-    lj_err_callermsg(L, strVdata(L->top-2));[m
[31m-  if (tvisnil(L->base) && (iof->type & IOFILE_FLAG_CLOSE)) {[m
[31m-    io_file_close(L, iof);  /* Return values are ignored. */[m
[31m-    return 0;[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-static int io_file_lines(lua_State *L)[m
[31m-{[m
[31m-  int n = (int)(L->top - L->base);[m
[31m-  if (n > LJ_MAX_UPVAL)[m
[31m-    lj_err_caller(L, LJ_ERR_UNPACK);[m
[31m-  lua_pushcclosure(L, io_file_iter, n);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* -- I/O file methods ---------------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_io_method[m
[31m-[m
[31m-LJLIB_CF(io_method_close)[m
[31m-{[m
[31m-  IOFileUD *iof = L->base < L->top ? io_tofile(L) :[m
[31m-		  IOSTDF_IOF(L, GCROOT_IO_OUTPUT);[m
[31m-  return io_file_close(L, iof);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_read)[m
[31m-{[m
[31m-  return io_file_read(L, io_tofile(L)->fp, 1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_write)		LJLIB_REC(io_write 0)[m
[31m-{[m
[31m-  return io_file_write(L, io_tofile(L)->fp, 1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_flush)		LJLIB_REC(io_flush 0)[m
[31m-{[m
[31m-  return luaL_fileresult(L, fflush(io_tofile(L)->fp) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_seek)[m
[31m-{[m
[31m-  FILE *fp = io_tofile(L)->fp;[m
[31m-  int opt = lj_lib_checkopt(L, 2, 1, "\3set\3cur\3end");[m
[31m-  int64_t ofs = 0;[m
[31m-  cTValue *o;[m
[31m-  int res;[m
[31m-  if (opt == 0) opt = SEEK_SET;[m
[31m-  else if (opt == 1) opt = SEEK_CUR;[m
[31m-  else if (opt == 2) opt = SEEK_END;[m
[31m-  o = L->base+2;[m
[31m-  if (o < L->top) {[m
[31m-    if (tvisint(o))[m
[31m-      ofs = (int64_t)intV(o);[m
[31m-    else if (tvisnum(o))[m
[31m-      ofs = (int64_t)numV(o);[m
[31m-    else if (!tvisnil(o))[m
[31m-      lj_err_argt(L, 3, LUA_TNUMBER);[m
[31m-  }[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  res = fseeko(fp, ofs, opt);[m
[31m-#elif _MSC_VER >= 1400[m
[31m-  res = _fseeki64(fp, ofs, opt);[m
[31m-#elif defined(__MINGW32__)[m
[31m-  res = fseeko64(fp, ofs, opt);[m
[31m-#else[m
[31m-  res = fseek(fp, (long)ofs, opt);[m
[31m-#endif[m
[31m-  if (res)[m
[31m-    return luaL_fileresult(L, 0, NULL);[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  ofs = ftello(fp);[m
[31m-#elif _MSC_VER >= 1400[m
[31m-  ofs = _ftelli64(fp);[m
[31m-#elif defined(__MINGW32__)[m
[31m-  ofs = ftello64(fp);[m
[31m-#else[m
[31m-  ofs = (int64_t)ftell(fp);[m
[31m-#endif[m
[31m-  setint64V(L->top-1, ofs);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_setvbuf)[m
[31m-{[m
[31m-  FILE *fp = io_tofile(L)->fp;[m
[31m-  int opt = lj_lib_checkopt(L, 2, -1, "\4full\4line\2no");[m
[31m-  size_t sz = (size_t)lj_lib_optint(L, 3, LUAL_BUFFERSIZE);[m
[31m-  if (opt == 0) opt = _IOFBF;[m
[31m-  else if (opt == 1) opt = _IOLBF;[m
[31m-  else if (opt == 2) opt = _IONBF;[m
[31m-  return luaL_fileresult(L, setvbuf(fp, NULL, opt, sz) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_lines)[m
[31m-{[m
[31m-  io_tofile(L);[m
[31m-  return io_file_lines(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method___gc)[m
[31m-{[m
[31m-  IOFileUD *iof = io_tofilep(L);[m
[31m-  if (iof->fp != NULL && (iof->type & IOFILE_TYPE_MASK) != IOFILE_TYPE_STDF)[m
[31m-    io_file_close(L, iof);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method___tostring)[m
[31m-{[m
[31m-  IOFileUD *iof = io_tofilep(L);[m
[31m-  if (iof->fp != NULL)[m
[31m-    lua_pushfstring(L, "file (%p)", iof->fp);[m
[31m-  else[m
[31m-    lua_pushliteral(L, "file (closed)");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-1) LJLIB_SET(__index)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- I/O library functions ----------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_io[m
[31m-[m
[31m-LJLIB_PUSH(top-2) LJLIB_SET(!)  /* Set environment. */[m
[31m-[m
[31m-LJLIB_CF(io_open)[m
[31m-{[m
[31m-  const char *fname = strdata(lj_lib_checkstr(L, 1));[m
[31m-  GCstr *s = lj_lib_optstr(L, 2);[m
[31m-  const char *mode = s ? strdata(s) : "r";[m
[31m-  IOFileUD *iof = io_file_new(L);[m
[31m-  iof->fp = fopen(fname, mode);[m
[31m-  return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, fname);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_popen)[m
[31m-{[m
[31m-#if LJ_TARGET_POSIX || (LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE)[m
[31m-  const char *fname = strdata(lj_lib_checkstr(L, 1));[m
[31m-  GCstr *s = lj_lib_optstr(L, 2);[m
[31m-  const char *mode = s ? strdata(s) : "r";[m
[31m-  IOFileUD *iof = io_file_new(L);[m
[31m-  iof->type = IOFILE_TYPE_PIPE;[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  fflush(NULL);[m
[31m-  iof->fp = popen(fname, mode);[m
[31m-#else[m
[31m-  iof->fp = _popen(fname, mode);[m
[31m-#endif[m
[31m-  return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, fname);[m
[31m-#else[m
[31m-  return luaL_error(L, LUA_QL("popen") " not supported");[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_tmpfile)[m
[31m-{[m
[31m-  IOFileUD *iof = io_file_new(L);[m
[31m-#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PSVITA[m
[31m-  iof->fp = NULL; errno = ENOSYS;[m
[31m-#else[m
[31m-  iof->fp = tmpfile();[m
[31m-#endif[m
[31m-  return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, NULL);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_close)[m
[31m-{[m
[31m-  return lj_cf_io_method_close(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_read)[m
[31m-{[m
[31m-  return io_file_read(L, io_stdfile(L, GCROOT_IO_INPUT), 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_write)		LJLIB_REC(io_write GCROOT_IO_OUTPUT)[m
[31m-{[m
[31m-  return io_file_write(L, io_stdfile(L, GCROOT_IO_OUTPUT), 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_flush)		LJLIB_REC(io_flush GCROOT_IO_OUTPUT)[m
[31m-{[m
[31m-  return luaL_fileresult(L, fflush(io_stdfile(L, GCROOT_IO_OUTPUT)) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-static int io_std_getset(lua_State *L, ptrdiff_t id, const char *mode)[m
[31m-{[m
[31m-  if (L->base < L->top && !tvisnil(L->base)) {[m
[31m-    if (tvisudata(L->base)) {[m
[31m-      io_tofile(L);[m
[31m-      L->top = L->base+1;[m
[31m-    } else {[m
[31m-      io_file_open(L, mode);[m
[31m-    }[m
[31m-    /* NOBARRIER: The standard I/O handles are GC roots. */[m
[31m-    setgcref(G(L)->gcroot[id], gcV(L->top-1));[m
[31m-  } else {[m
[31m-    setudataV(L, L->top++, IOSTDF_UD(L, id));[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_input)[m
[31m-{[m
[31m-  return io_std_getset(L, GCROOT_IO_INPUT, "r");[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_output)[m
[31m-{[m
[31m-  return io_std_getset(L, GCROOT_IO_OUTPUT, "w");[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_lines)[m
[31m-{[m
[31m-  if (L->base == L->top) setnilV(L->top++);[m
[31m-  if (!tvisnil(L->base)) {  /* io.lines(fname) */[m
[31m-    IOFileUD *iof = io_file_open(L, "r");[m
[31m-    iof->type = IOFILE_TYPE_FILE|IOFILE_FLAG_CLOSE;[m
[31m-    L->top--;[m
[31m-    setudataV(L, L->base, udataV(L->top));[m
[31m-  } else {  /* io.lines() iterates over stdin. */[m
[31m-    setudataV(L, L->base, IOSTDF_UD(L, GCROOT_IO_INPUT));[m
[31m-  }[m
[31m-  return io_file_lines(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_type)[m
[31m-{[m
[31m-  cTValue *o = lj_lib_checkany(L, 1);[m
[31m-  if (!(tvisudata(o) && udataV(o)->udtype == UDTYPE_IO_FILE))[m
[31m-    setnilV(L->top++);[m
[31m-  else if (((IOFileUD *)uddata(udataV(o)))->fp != NULL)[m
[31m-    lua_pushliteral(L, "file");[m
[31m-  else[m
[31m-    lua_pushliteral(L, "closed file");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static GCobj *io_std_new(lua_State *L, FILE *fp, const char *name)[m
[31m-{[m
[31m-  IOFileUD *iof = (IOFileUD *)lua_newuserdata(L, sizeof(IOFileUD));[m
[31m-  GCudata *ud = udataV(L->top-1);[m
[31m-  ud->udtype = UDTYPE_IO_FILE;[m
[31m-  /* NOBARRIER: The GCudata is new (marked white). */[m
[31m-  setgcref(ud->metatable, gcV(L->top-3));[m
[31m-  iof->fp = fp;[m
[31m-  iof->type = IOFILE_TYPE_STDF;[m
[31m-  lua_setfield(L, -2, name);[m
[31m-  return obj2gco(ud);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaopen_io(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, NULL, io_method);[m
[31m-  copyTV(L, L->top, L->top-1); L->top++;[m
[31m-  lua_setfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE);[m
[31m-  LJ_LIB_REG(L, LUA_IOLIBNAME, io);[m
[31m-  setgcref(G(L)->gcroot[GCROOT_IO_INPUT], io_std_new(L, stdin, "stdin"));[m
[31m-  setgcref(G(L)->gcroot[GCROOT_IO_OUTPUT], io_std_new(L, stdout, "stdout"));[m
[31m-  io_std_new(L, stderr, "stderr");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit.c[m
[1mdeleted file mode 100644[m
[1mindex c6330c4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_jit.c[m
[1m+++ /dev/null[m
[36m@@ -1,772 +0,0 @@[m
[31m-/*[m
[31m-** JIT library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_jit_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_target.h"[m
[31m-#endif[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_vmevent.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-/* -- jit.* functions ----------------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_jit[m
[31m-[m
[31m-static int setjitmode(lua_State *L, int mode)[m
[31m-{[m
[31m-  int idx = 0;[m
[31m-  if (L->base == L->top || tvisnil(L->base)) {  /* jit.on/off/flush([nil]) */[m
[31m-    mode |= LUAJIT_MODE_ENGINE;[m
[31m-  } else {[m
[31m-    /* jit.on/off/flush(func|proto, nil|true|false) */[m
[31m-    if (tvisfunc(L->base) || tvisproto(L->base))[m
[31m-      idx = 1;[m
[31m-    else if (!tvistrue(L->base))  /* jit.on/off/flush(true, nil|true|false) */[m
[31m-      goto err;[m
[31m-    if (L->base+1 < L->top && tvisbool(L->base+1))[m
[31m-      mode |= boolV(L->base+1) ? LUAJIT_MODE_ALLFUNC : LUAJIT_MODE_ALLSUBFUNC;[m
[31m-    else[m
[31m-      mode |= LUAJIT_MODE_FUNC;[m
[31m-  }[m
[31m-  if (luaJIT_setmode(L, idx, mode) != 1) {[m
[31m-    if ((mode & LUAJIT_MODE_MASK) == LUAJIT_MODE_ENGINE)[m
[31m-      lj_err_caller(L, LJ_ERR_NOJIT);[m
[31m-  err:[m
[31m-    lj_err_argt(L, 1, LUA_TFUNCTION);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(jit_on)[m
[31m-{[m
[31m-  return setjitmode(L, LUAJIT_MODE_ON);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(jit_off)[m
[31m-{[m
[31m-  return setjitmode(L, LUAJIT_MODE_OFF);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(jit_flush)[m
[31m-{[m
[31m-#if LJ_HASJIT[m
[31m-  if (L->base < L->top && tvisnumber(L->base)) {[m
[31m-    int traceno = lj_lib_checkint(L, 1);[m
[31m-    luaJIT_setmode(L, traceno, LUAJIT_MODE_FLUSH|LUAJIT_MODE_TRACE);[m
[31m-    return 0;[m
[31m-  }[m
[31m-#endif[m
[31m-  return setjitmode(L, LUAJIT_MODE_FLUSH);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Push a string for every flag bit that is set. */[m
[31m-static void flagbits_to_strings(lua_State *L, uint32_t flags, uint32_t base,[m
[31m-				const char *str)[m
[31m-{[m
[31m-  for (; *str; base <<= 1, str += 1+*str)[m
[31m-    if (flags & base)[m
[31m-      setstrV(L, L->top++, lj_str_new(L, str+1, *(uint8_t *)str));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_CF(jit_status)[m
[31m-{[m
[31m-#if LJ_HASJIT[m
[31m-  jit_State *J = L2J(L);[m
[31m-  L->top = L->base;[m
[31m-  setboolV(L->top++, (J->flags & JIT_F_ON) ? 1 : 0);[m
[31m-  flagbits_to_strings(L, J->flags, JIT_F_CPU_FIRST, JIT_F_CPUSTRING);[m
[31m-  flagbits_to_strings(L, J->flags, JIT_F_OPT_FIRST, JIT_F_OPTSTRING);[m
[31m-  return (int)(L->top - L->base);[m
[31m-#else[m
[31m-  setboolV(L->top++, 0);[m
[31m-  return 1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(jit_attach)[m
[31m-{[m
[31m-#ifdef LUAJIT_DISABLE_VMEVENT[m
[31m-  luaL_error(L, "vmevent API disabled");[m
[31m-#else[m
[31m-  GCfunc *fn = lj_lib_checkfunc(L, 1);[m
[31m-  GCstr *s = lj_lib_optstr(L, 2);[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, LJ_VMEVENTS_REGKEY, LJ_VMEVENTS_HSIZE);[m
[31m-  if (s) {  /* Attach to given event. */[m
[31m-    const uint8_t *p = (const uint8_t *)strdata(s);[m
[31m-    uint32_t h = s->len;[m
[31m-    while (*p) h = h ^ (lj_rol(h, 6) + *p++);[m
[31m-    lua_pushvalue(L, 1);[m
[31m-    lua_rawseti(L, -2, VMEVENT_HASHIDX(h));[m
[31m-    G(L)->vmevmask = VMEVENT_NOCACHE;  /* Invalidate cache. */[m
[31m-  } else {  /* Detach if no event given. */[m
[31m-    setnilV(L->top++);[m
[31m-    while (lua_next(L, -2)) {[m
[31m-      L->top--;[m
[31m-      if (tvisfunc(L->top) && funcV(L->top) == fn) {[m
[31m-	setnilV(lj_tab_set(L, tabV(L->top-2), L->top-1));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-5) LJLIB_SET(os)[m
[31m-LJLIB_PUSH(top-4) LJLIB_SET(arch)[m
[31m-LJLIB_PUSH(top-3) LJLIB_SET(version_num)[m
[31m-LJLIB_PUSH(top-2) LJLIB_SET(version)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- jit.util.* functions ------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_jit_util[m
[31m-[m
[31m-/* -- Reflection API for Lua functions ------------------------------------ */[m
[31m-[m
[31m-/* Return prototype of first argument (Lua function or prototype object) */[m
[31m-static GCproto *check_Lproto(lua_State *L, int nolua)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (L->top > o) {[m
[31m-    if (tvisproto(o)) {[m
[31m-      return protoV(o);[m
[31m-    } else if (tvisfunc(o)) {[m
[31m-      if (isluafunc(funcV(o)))[m
[31m-	return funcproto(funcV(o));[m
[31m-      else if (nolua)[m
[31m-	return NULL;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_argt(L, 1, LUA_TFUNCTION);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-static void setintfield(lua_State *L, GCtab *t, const char *name, int32_t val)[m
[31m-{[m
[31m-  setintV(lj_tab_setstr(L, t, lj_str_newz(L, name)), val);[m
[31m-}[m
[31m-[m
[31m-/* local info = jit.util.funcinfo(func [,pc]) */[m
[31m-LJLIB_CF(jit_util_funcinfo)[m
[31m-{[m
[31m-  GCproto *pt = check_Lproto(L, 1);[m
[31m-  if (pt) {[m
[31m-    BCPos pc = (BCPos)lj_lib_optint(L, 2, 0);[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, 0, 16);  /* Increment hash size if fields are added. */[m
[31m-    t = tabV(L->top-1);[m
[31m-    setintfield(L, t, "linedefined", pt->firstline);[m
[31m-    setintfield(L, t, "lastlinedefined", pt->firstline + pt->numline);[m
[31m-    setintfield(L, t, "stackslots", pt->framesize);[m
[31m-    setintfield(L, t, "params", pt->numparams);[m
[31m-    setintfield(L, t, "bytecodes", (int32_t)pt->sizebc);[m
[31m-    setintfield(L, t, "gcconsts", (int32_t)pt->sizekgc);[m
[31m-    setintfield(L, t, "nconsts", (int32_t)pt->sizekn);[m
[31m-    setintfield(L, t, "upvalues", (int32_t)pt->sizeuv);[m
[31m-    if (pc < pt->sizebc)[m
[31m-      setintfield(L, t, "currentline", lj_debug_line(pt, pc));[m
[31m-    lua_pushboolean(L, (pt->flags & PROTO_VARARG));[m
[31m-    lua_setfield(L, -2, "isvararg");[m
[31m-    lua_pushboolean(L, (pt->flags & PROTO_CHILD));[m
[31m-    lua_setfield(L, -2, "children");[m
[31m-    setstrV(L, L->top++, proto_chunkname(pt));[m
[31m-    lua_setfield(L, -2, "source");[m
[31m-    lj_debug_pushloc(L, pt, pc);[m
[31m-    lua_setfield(L, -2, "loc");[m
[31m-  } else {[m
[31m-    GCfunc *fn = funcV(L->base);[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, 0, 4);  /* Increment hash size if fields are added. */[m
[31m-    t = tabV(L->top-1);[m
[31m-    if (!iscfunc(fn))[m
[31m-      setintfield(L, t, "ffid", fn->c.ffid);[m
[31m-    setintptrV(lj_tab_setstr(L, t, lj_str_newlit(L, "addr")),[m
[31m-	       (intptr_t)(void *)fn->c.f);[m
[31m-    setintfield(L, t, "upvalues", fn->c.nupvalues);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* local ins, m = jit.util.funcbc(func, pc) */[m
[31m-LJLIB_CF(jit_util_funcbc)[m
[31m-{[m
[31m-  GCproto *pt = check_Lproto(L, 0);[m
[31m-  BCPos pc = (BCPos)lj_lib_checkint(L, 2);[m
[31m-  if (pc < pt->sizebc) {[m
[31m-    BCIns ins = proto_bc(pt)[pc];[m
[31m-    BCOp op = bc_op(ins);[m
[31m-    lua_assert(op < BC__MAX);[m
[31m-    setintV(L->top, ins);[m
[31m-    setintV(L->top+1, lj_bc_mode[op]);[m
[31m-    L->top += 2;[m
[31m-    return 2;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local k = jit.util.funck(func, idx) */[m
[31m-LJLIB_CF(jit_util_funck)[m
[31m-{[m
[31m-  GCproto *pt = check_Lproto(L, 0);[m
[31m-  ptrdiff_t idx = (ptrdiff_t)lj_lib_checkint(L, 2);[m
[31m-  if (idx >= 0) {[m
[31m-    if (idx < (ptrdiff_t)pt->sizekn) {[m
[31m-      copyTV(L, L->top-1, proto_knumtv(pt, idx));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (~idx < (ptrdiff_t)pt->sizekgc) {[m
[31m-      GCobj *gc = proto_kgc(pt, idx);[m
[31m-      setgcV(L, L->top-1, gc, ~gc->gch.gct);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local name = jit.util.funcuvname(func, idx) */[m
[31m-LJLIB_CF(jit_util_funcuvname)[m
[31m-{[m
[31m-  GCproto *pt = check_Lproto(L, 0);[m
[31m-  uint32_t idx = (uint32_t)lj_lib_checkint(L, 2);[m
[31m-  if (idx < pt->sizeuv) {[m
[31m-    setstrV(L, L->top-1, lj_str_newz(L, lj_debug_uvname(pt, idx)));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Reflection API for traces ------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-/* Check trace argument. Must not throw for non-existent trace numbers. */[m
[31m-static GCtrace *jit_checktrace(lua_State *L)[m
[31m-{[m
[31m-  TraceNo tr = (TraceNo)lj_lib_checkint(L, 1);[m
[31m-  jit_State *J = L2J(L);[m
[31m-  if (tr > 0 && tr < J->sizetrace)[m
[31m-    return traceref(J, tr);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Names of link types. ORDER LJ_TRLINK */[m
[31m-static const char *const jit_trlinkname[] = {[m
[31m-  "none", "root", "loop", "tail-recursion", "up-recursion", "down-recursion",[m
[31m-  "interpreter", "return", "stitch"[m
[31m-};[m
[31m-[m
[31m-/* local info = jit.util.traceinfo(tr) */[m
[31m-LJLIB_CF(jit_util_traceinfo)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  if (T) {[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, 0, 8);  /* Increment hash size if fields are added. */[m
[31m-    t = tabV(L->top-1);[m
[31m-    setintfield(L, t, "nins", (int32_t)T->nins - REF_BIAS - 1);[m
[31m-    setintfield(L, t, "nk", REF_BIAS - (int32_t)T->nk);[m
[31m-    setintfield(L, t, "link", T->link);[m
[31m-    setintfield(L, t, "nexit", T->nsnap);[m
[31m-    setstrV(L, L->top++, lj_str_newz(L, jit_trlinkname[T->linktype]));[m
[31m-    lua_setfield(L, -2, "linktype");[m
[31m-    /* There are many more fields. Add them only when needed. */[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local m, ot, op1, op2, prev = jit.util.traceir(tr, idx) */[m
[31m-LJLIB_CF(jit_util_traceir)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  IRRef ref = (IRRef)lj_lib_checkint(L, 2) + REF_BIAS;[m
[31m-  if (T && ref >= REF_BIAS && ref < T->nins) {[m
[31m-    IRIns *ir = &T->ir[ref];[m
[31m-    int32_t m = lj_ir_mode[ir->o];[m
[31m-    setintV(L->top-2, m);[m
[31m-    setintV(L->top-1, ir->ot);[m
[31m-    setintV(L->top++, (int32_t)ir->op1 - (irm_op1(m)==IRMref ? REF_BIAS : 0));[m
[31m-    setintV(L->top++, (int32_t)ir->op2 - (irm_op2(m)==IRMref ? REF_BIAS : 0));[m
[31m-    setintV(L->top++, ir->prev);[m
[31m-    return 5;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local k, t [, slot] = jit.util.tracek(tr, idx) */[m
[31m-LJLIB_CF(jit_util_tracek)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  IRRef ref = (IRRef)lj_lib_checkint(L, 2) + REF_BIAS;[m
[31m-  if (T && ref >= T->nk && ref < REF_BIAS) {[m
[31m-    IRIns *ir = &T->ir[ref];[m
[31m-    int32_t slot = -1;[m
[31m-    if (ir->o == IR_KSLOT) {[m
[31m-      slot = ir->op2;[m
[31m-      ir = &T->ir[ir->op1];[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (ir->o == IR_KINT64 && !ctype_ctsG(G(L))) {[m
[31m-      ptrdiff_t oldtop = savestack(L, L->top);[m
[31m-      luaopen_ffi(L);  /* Load FFI library on-demand. */[m
[31m-      L->top = restorestack(L, oldtop);[m
[31m-    }[m
[31m-#endif[m
[31m-    lj_ir_kvalue(L, L->top-2, ir);[m
[31m-    setintV(L->top-1, (int32_t)irt_type(ir->t));[m
[31m-    if (slot == -1)[m
[31m-      return 2;[m
[31m-    setintV(L->top++, slot);[m
[31m-    return 3;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local snap = jit.util.tracesnap(tr, sn) */[m
[31m-LJLIB_CF(jit_util_tracesnap)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  SnapNo sn = (SnapNo)lj_lib_checkint(L, 2);[m
[31m-  if (T && sn < T->nsnap) {[m
[31m-    SnapShot *snap = &T->snap[sn];[m
[31m-    SnapEntry *map = &T->snapmap[snap->mapofs];[m
[31m-    MSize n, nent = snap->nent;[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, nent+2, 0);[m
[31m-    t = tabV(L->top-1);[m
[31m-    setintV(lj_tab_setint(L, t, 0), (int32_t)snap->ref - REF_BIAS);[m
[31m-    setintV(lj_tab_setint(L, t, 1), (int32_t)snap->nslots);[m
[31m-    for (n = 0; n < nent; n++)[m
[31m-      setintV(lj_tab_setint(L, t, (int32_t)(n+2)), (int32_t)map[n]);[m
[31m-    setintV(lj_tab_setint(L, t, (int32_t)(nent+2)), (int32_t)SNAP(255, 0, 0));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local mcode, addr, loop = jit.util.tracemc(tr) */[m
[31m-LJLIB_CF(jit_util_tracemc)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  if (T && T->mcode != NULL) {[m
[31m-    setstrV(L, L->top-1, lj_str_new(L, (const char *)T->mcode, T->szmcode));[m
[31m-    setintptrV(L->top++, (intptr_t)(void *)T->mcode);[m
[31m-    setintV(L->top++, T->mcloop);[m
[31m-    return 3;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local addr = jit.util.traceexitstub([tr,] exitno) */[m
[31m-LJLIB_CF(jit_util_traceexitstub)[m
[31m-{[m
[31m-#ifdef EXITSTUBS_PER_GROUP[m
[31m-  ExitNo exitno = (ExitNo)lj_lib_checkint(L, 1);[m
[31m-  jit_State *J = L2J(L);[m
[31m-  if (exitno < EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR) {[m
[31m-    setintptrV(L->top-1, (intptr_t)(void *)exitstub_addr(J, exitno));[m
[31m-    return 1;[m
[31m-  }[m
[31m-#else[m
[31m-  if (L->top > L->base+1) {  /* Don't throw for one-argument variant. */[m
[31m-    GCtrace *T = jit_checktrace(L);[m
[31m-    ExitNo exitno = (ExitNo)lj_lib_checkint(L, 2);[m
[31m-    ExitNo maxexit = T->root ? T->nsnap+1 : T->nsnap;[m
[31m-    if (T && T->mcode != NULL && exitno < maxexit) {[m
[31m-      setintptrV(L->top-1, (intptr_t)(void *)exitstub_trace_addr(T, exitno));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local addr = jit.util.ircalladdr(idx) */[m
[31m-LJLIB_CF(jit_util_ircalladdr)[m
[31m-{[m
[31m-  uint32_t idx = (uint32_t)lj_lib_checkint(L, 1);[m
[31m-  if (idx < IRCALL__MAX) {[m
[31m-    setintptrV(L->top-1, (intptr_t)(void *)lj_ir_callinfo[idx].func);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-static int luaopen_jit_util(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, NULL, jit_util);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* -- jit.opt module ------------------------------------------------------ */[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#define LJLIB_MODULE_jit_opt[m
[31m-[m
[31m-/* Parse optimization level. */[m
[31m-static int jitopt_level(jit_State *J, const char *str)[m
[31m-{[m
[31m-  if (str[0] >= '0' && str[0] <= '9' && str[1] == '\0') {[m
[31m-    uint32_t flags;[m
[31m-    if (str[0] == '0') flags = JIT_F_OPT_0;[m
[31m-    else if (str[0] == '1') flags = JIT_F_OPT_1;[m
[31m-    else if (str[0] == '2') flags = JIT_F_OPT_2;[m
[31m-    else flags = JIT_F_OPT_3;[m
[31m-    J->flags = (J->flags & ~JIT_F_OPT_MASK) | flags;[m
[31m-    return 1;  /* Ok. */[m
[31m-  }[m
[31m-  return 0;  /* No match. */[m
[31m-}[m
[31m-[m
[31m-/* Parse optimization flag. */[m
[31m-static int jitopt_flag(jit_State *J, const char *str)[m
[31m-{[m
[31m-  const char *lst = JIT_F_OPTSTRING;[m
[31m-  uint32_t opt;[m
[31m-  int set = 1;[m
[31m-  if (str[0] == '+') {[m
[31m-    str++;[m
[31m-  } else if (str[0] == '-') {[m
[31m-    str++;[m
[31m-    set = 0;[m
[31m-  } else if (str[0] == 'n' && str[1] == 'o') {[m
[31m-    str += str[2] == '-' ? 3 : 2;[m
[31m-    set = 0;[m
[31m-  }[m
[31m-  for (opt = JIT_F_OPT_FIRST; ; opt <<= 1) {[m
[31m-    size_t len = *(const uint8_t *)lst;[m
[31m-    if (len == 0)[m
[31m-      break;[m
[31m-    if (strncmp(str, lst+1, len) == 0 && str[len] == '\0') {[m
[31m-      if (set) J->flags |= opt; else J->flags &= ~opt;[m
[31m-      return 1;  /* Ok. */[m
[31m-    }[m
[31m-    lst += 1+len;[m
[31m-  }[m
[31m-  return 0;  /* No match. */[m
[31m-}[m
[31m-[m
[31m-/* Parse optimization parameter. */[m
[31m-static int jitopt_param(jit_State *J, const char *str)[m
[31m-{[m
[31m-  const char *lst = JIT_P_STRING;[m
[31m-  int i;[m
[31m-  for (i = 0; i < JIT_P__MAX; i++) {[m
[31m-    size_t len = *(const uint8_t *)lst;[m
[31m-    lua_assert(len != 0);[m
[31m-    if (strncmp(str, lst+1, len) == 0 && str[len] == '=') {[m
[31m-      int32_t n = 0;[m
[31m-      const char *p = &str[len+1];[m
[31m-      while (*p >= '0' && *p <= '9')[m
[31m-	n = n*10 + (*p++ - '0');[m
[31m-      if (*p) return 0;  /* Malformed number. */[m
[31m-      J->param[i] = n;[m
[31m-      if (i == JIT_P_hotloop)[m
[31m-	lj_dispatch_init_hotcount(J2G(J));[m
[31m-      return 1;  /* Ok. */[m
[31m-    }[m
[31m-    lst += 1+len;[m
[31m-  }[m
[31m-  return 0;  /* No match. */[m
[31m-}[m
[31m-[m
[31m-/* jit.opt.start(flags...) */[m
[31m-LJLIB_CF(jit_opt_start)[m
[31m-{[m
[31m-  jit_State *J = L2J(L);[m
[31m-  int nargs = (int)(L->top - L->base);[m
[31m-  if (nargs == 0) {[m
[31m-    J->flags = (J->flags & ~JIT_F_OPT_MASK) | JIT_F_OPT_DEFAULT;[m
[31m-  } else {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-      const char *str = strdata(lj_lib_checkstr(L, i));[m
[31m-      if (!jitopt_level(J, str) &&[m
[31m-	  !jitopt_flag(J, str) &&[m
[31m-	  !jitopt_param(J, str))[m
[31m-	lj_err_callerv(L, LJ_ERR_JITOPT, str);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- jit.profile module -------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-[m
[31m-#define LJLIB_MODULE_jit_profile[m
[31m-[m
[31m-/* Not loaded by default, use: local profile = require("jit.profile") */[m
[31m-[m
[31m-static const char KEY_PROFILE_THREAD = 't';[m
[31m-static const char KEY_PROFILE_FUNC = 'f';[m
[31m-[m
[31m-static void jit_profile_callback(lua_State *L2, lua_State *L, int samples,[m
[31m-				 int vmstate)[m
[31m-{[m
[31m-  TValue key;[m
[31m-  cTValue *tv;[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_FUNC);[m
[31m-  tv = lj_tab_get(L, tabV(registry(L)), &key);[m
[31m-  if (tvisfunc(tv)) {[m
[31m-    char vmst = (char)vmstate;[m
[31m-    int status;[m
[31m-    setfuncV(L2, L2->top++, funcV(tv));[m
[31m-    setthreadV(L2, L2->top++, L);[m
[31m-    setintV(L2->top++, samples);[m
[31m-    setstrV(L2, L2->top++, lj_str_new(L2, &vmst, 1));[m
[31m-    status = lua_pcall(L2, 3, 0, 0);  /* callback(thread, samples, vmstate) */[m
[31m-    if (status) {[m
[31m-      if (G(L2)->panic) G(L2)->panic(L2);[m
[31m-      exit(EXIT_FAILURE);[m
[31m-    }[m
[31m-    lj_trace_abort(G(L2));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* profile.start(mode, cb) */[m
[31m-LJLIB_CF(jit_profile_start)[m
[31m-{[m
[31m-  GCtab *registry = tabV(registry(L));[m
[31m-  GCstr *mode = lj_lib_optstr(L, 1);[m
[31m-  GCfunc *func = lj_lib_checkfunc(L, 2);[m
[31m-  lua_State *L2 = lua_newthread(L);  /* Thread that runs profiler callback. */[m
[31m-  TValue key;[m
[31m-  /* Anchor thread and function in registry. */[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_THREAD);[m
[31m-  setthreadV(L, lj_tab_set(L, registry, &key), L2);[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_FUNC);[m
[31m-  setfuncV(L, lj_tab_set(L, registry, &key), func);[m
[31m-  lj_gc_anybarriert(L, registry);[m
[31m-  luaJIT_profile_start(L, mode ? strdata(mode) : "",[m
[31m-		       (luaJIT_profile_callback)jit_profile_callback, L2);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* profile.stop() */[m
[31m-LJLIB_CF(jit_profile_stop)[m
[31m-{[m
[31m-  GCtab *registry;[m
[31m-  TValue key;[m
[31m-  luaJIT_profile_stop(L);[m
[31m-  registry = tabV(registry(L));[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_THREAD);[m
[31m-  setnilV(lj_tab_set(L, registry, &key));[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_FUNC);[m
[31m-  setnilV(lj_tab_set(L, registry, &key));[m
[31m-  lj_gc_anybarriert(L, registry);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* dump = profile.dumpstack([thread,] fmt, depth) */[m
[31m-LJLIB_CF(jit_profile_dumpstack)[m
[31m-{[m
[31m-  lua_State *L2 = L;[m
[31m-  int arg = 0;[m
[31m-  size_t len;[m
[31m-  int depth;[m
[31m-  GCstr *fmt;[m
[31m-  const char *p;[m
[31m-  if (L->top > L->base && tvisthread(L->base)) {[m
[31m-    L2 = threadV(L->base);[m
[31m-    arg = 1;[m
[31m-  }[m
[31m-  fmt = lj_lib_checkstr(L, arg+1);[m
[31m-  depth = lj_lib_checkint(L, arg+2);[m
[31m-  p = luaJIT_profile_dumpstack(L2, strdata(fmt), depth, &len);[m
[31m-  lua_pushlstring(L, p, len);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-static int luaopen_jit_profile(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, NULL, jit_profile);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- JIT compiler initialization ----------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Default values for JIT parameters. */[m
[31m-static const int32_t jit_param_default[JIT_P__MAX+1] = {[m
[31m-#define JIT_PARAMINIT(len, name, value)	(value),[m
[31m-JIT_PARAMDEF(JIT_PARAMINIT)[m
[31m-#undef JIT_PARAMINIT[m
[31m-  0[m
[31m-};[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_ARM && LJ_TARGET_LINUX[m
[31m-#include <sys/utsname.h>[m
[31m-#endif[m
[31m-[m
[31m-/* Arch-dependent CPU detection. */[m
[31m-static uint32_t jit_cpudetect(lua_State *L)[m
[31m-{[m
[31m-  uint32_t flags = 0;[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  uint32_t vendor[4];[m
[31m-  uint32_t features[4];[m
[31m-  if (lj_vm_cpuid(0, vendor) && lj_vm_cpuid(1, features)) {[m
[31m-#if !LJ_HASJIT[m
[31m-#define JIT_F_SSE2	2[m
[31m-#endif[m
[31m-    flags |= ((features[3] >> 26)&1) * JIT_F_SSE2;[m
[31m-#if LJ_HASJIT[m
[31m-    flags |= ((features[2] >> 0)&1) * JIT_F_SSE3;[m
[31m-    flags |= ((features[2] >> 19)&1) * JIT_F_SSE4_1;[m
[31m-    if (vendor[2] == 0x6c65746e) {  /* Intel. */[m
[31m-      if ((features[0] & 0x0fff0ff0) == 0x000106c0)  /* Atom. */[m
[31m-	flags |= JIT_F_LEA_AGU;[m
[31m-    } else if (vendor[2] == 0x444d4163) {  /* AMD. */[m
[31m-      uint32_t fam = (features[0] & 0x0ff00f00);[m
[31m-      if (fam >= 0x00000f00)  /* K8, K10. */[m
[31m-	flags |= JIT_F_PREFER_IMUL;[m
[31m-    }[m
[31m-    if (vendor[0] >= 7) {[m
[31m-      uint32_t xfeatures[4];[m
[31m-      lj_vm_cpuid(7, xfeatures);[m
[31m-      flags |= ((xfeatures[1] >> 8)&1) * JIT_F_BMI2;[m
[31m-    }[m
[31m-#endif[m
[31m-  }[m
[31m-  /* Check for required instruction set support on x86 (unnecessary on x64). */[m
[31m-#if LJ_TARGET_X86[m
[31m-  if (!(flags & JIT_F_SSE2))[m
[31m-    luaL_error(L, "CPU with SSE2 required");[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#if LJ_HASJIT[m
[31m-  int ver = LJ_ARCH_VERSION;  /* Compile-time ARM CPU detection. */[m
[31m-#if LJ_TARGET_LINUX[m
[31m-  if (ver < 70) {  /* Runtime ARM CPU detection. */[m
[31m-    struct utsname ut;[m
[31m-    uname(&ut);[m
[31m-    if (strncmp(ut.machine, "armv", 4) == 0) {[m
[31m-      if (ut.machine[4] >= '7')[m
[31m-	ver = 70;[m
[31m-      else if (ut.machine[4] == '6')[m
[31m-	ver = 60;[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  flags |= ver >= 70 ? JIT_F_ARMV7 :[m
[31m-	   ver >= 61 ? JIT_F_ARMV6T2_ :[m
[31m-	   ver >= 60 ? JIT_F_ARMV6_ : 0;[m
[31m-  flags |= LJ_ARCH_HASFPU == 0 ? 0 : ver >= 70 ? JIT_F_VFPV3 : JIT_F_VFPV2;[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-  /* No optional CPU features to detect (for now). */[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#if LJ_HASJIT[m
[31m-#if LJ_ARCH_SQRT[m
[31m-  flags |= JIT_F_SQRT;[m
[31m-#endif[m
[31m-#if LJ_ARCH_ROUND[m
[31m-  flags |= JIT_F_ROUND;[m
[31m-#endif[m
[31m-#endif[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#if LJ_HASJIT[m
[31m-  /* Compile-time MIPS CPU detection. */[m
[31m-#if LJ_ARCH_VERSION >= 20[m
[31m-  flags |= JIT_F_MIPS32R2;[m
[31m-#endif[m
[31m-  /* Runtime MIPS CPU detection. */[m
[31m-#if defined(__GNUC__)[m
[31m-  if (!(flags & JIT_F_MIPS32R2)) {[m
[31m-    int x;[m
[31m-    /* On MIPS32R1 rotr is treated as srl. rotr r2,r2,1 -> srl r2,r2,1. */[m
[31m-    __asm__("li $2, 1\n\t.long 0x00221042\n\tmove %0, $2" : "=r"(x) : : "$2");[m
[31m-    if (x) flags |= JIT_F_MIPS32R2;  /* Either 0x80000000 (R2) or 0 (R1). */[m
[31m-  }[m
[31m-#endif[m
[31m-#endif[m
[31m-#else[m
[31m-#error "Missing CPU detection for this architecture"[m
[31m-#endif[m
[31m-  UNUSED(L);[m
[31m-  return flags;[m
[31m-}[m
[31m-[m
[31m-/* Initialize JIT compiler. */[m
[31m-static void jit_init(lua_State *L)[m
[31m-{[m
[31m-  uint32_t flags = jit_cpudetect(L);[m
[31m-#if LJ_HASJIT[m
[31m-  jit_State *J = L2J(L);[m
[31m-  J->flags = flags | JIT_F_ON | JIT_F_OPT_DEFAULT;[m
[31m-  memcpy(J->param, jit_param_default, sizeof(J->param));[m
[31m-  lj_dispatch_update(G(L));[m
[31m-#else[m
[31m-  UNUSED(flags);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaopen_jit(lua_State *L)[m
[31m-{[m
[31m-  jit_init(L);[m
[31m-  lua_pushliteral(L, LJ_OS_NAME);[m
[31m-  lua_pushliteral(L, LJ_ARCH_NAME);[m
[31m-  lua_pushinteger(L, LUAJIT_VERSION_NUM);[m
[31m-  lua_pushliteral(L, LUAJIT_VERSION);[m
[31m-  LJ_LIB_REG(L, LUA_JITLIBNAME, jit);[m
[31m-#if LJ_HASPROFILE[m
[31m-  lj_lib_prereg(L, LUA_JITLIBNAME ".profile", luaopen_jit_profile,[m
[31m-		tabref(L->env));[m
[31m-#endif[m
[31m-#ifndef LUAJIT_DISABLE_JITUTIL[m
[31m-  lj_lib_prereg(L, LUA_JITLIBNAME ".util", luaopen_jit_util, tabref(L->env));[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-  LJ_LIB_REG(L, "jit.opt", jit_opt);[m
[31m-#endif[m
[31m-  L->top -= 2;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math.c[m
[1mdeleted file mode 100644[m
[1mindex f90dd33..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_math.c[m
[1m+++ /dev/null[m
[36m@@ -1,230 +0,0 @@[m
[31m-/*[m
[31m-** Math library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <math.h>[m
[31m-[m
[31m-#define lib_math_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_lib.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_math[m
[31m-[m
[31m-LJLIB_ASM(math_abs)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(math_floor)		LJLIB_REC(math_round IRFPM_FLOOR)[m
[31m-LJLIB_ASM_(math_ceil)		LJLIB_REC(math_round IRFPM_CEIL)[m
[31m-[m
[31m-LJLIB_ASM(math_sqrt)		LJLIB_REC(math_unary IRFPM_SQRT)[m
[31m-{[m
[31m-  lj_lib_checknum(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(math_log10)		LJLIB_REC(math_unary IRFPM_LOG10)[m
[31m-LJLIB_ASM_(math_exp)		LJLIB_REC(math_unary IRFPM_EXP)[m
[31m-LJLIB_ASM_(math_sin)		LJLIB_REC(math_unary IRFPM_SIN)[m
[31m-LJLIB_ASM_(math_cos)		LJLIB_REC(math_unary IRFPM_COS)[m
[31m-LJLIB_ASM_(math_tan)		LJLIB_REC(math_unary IRFPM_TAN)[m
[31m-LJLIB_ASM_(math_asin)		LJLIB_REC(math_atrig FF_math_asin)[m
[31m-LJLIB_ASM_(math_acos)		LJLIB_REC(math_atrig FF_math_acos)[m
[31m-LJLIB_ASM_(math_atan)		LJLIB_REC(math_atrig FF_math_atan)[m
[31m-LJLIB_ASM_(math_sinh)		LJLIB_REC(math_htrig IRCALL_sinh)[m
[31m-LJLIB_ASM_(math_cosh)		LJLIB_REC(math_htrig IRCALL_cosh)[m
[31m-LJLIB_ASM_(math_tanh)		LJLIB_REC(math_htrig IRCALL_tanh)[m
[31m-LJLIB_ASM_(math_frexp)[m
[31m-LJLIB_ASM_(math_modf)		LJLIB_REC(.)[m
[31m-[m
[31m-LJLIB_ASM(math_log)		LJLIB_REC(math_log)[m
[31m-{[m
[31m-  double x = lj_lib_checknum(L, 1);[m
[31m-  if (L->base+1 < L->top) {[m
[31m-    double y = lj_lib_checknum(L, 2);[m
[31m-#ifdef LUAJIT_NO_LOG2[m
[31m-    x = log(x); y = 1.0 / log(y);[m
[31m-#else[m
[31m-    x = lj_vm_log2(x); y = 1.0 / lj_vm_log2(y);[m
[31m-#endif[m
[31m-    setnumV(L->base-1-LJ_FR2, x*y);  /* Do NOT join the expression to x / y. */[m
[31m-    return FFH_RES(1);[m
[31m-  }[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-[m
[31m-LJLIB_LUA(math_deg) /* function(x) return x * 57.29577951308232 end */[m
[31m-LJLIB_LUA(math_rad) /* function(x) return x * 0.017453292519943295 end */[m
[31m-[m
[31m-LJLIB_ASM(math_atan2)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checknum(L, 1);[m
[31m-  lj_lib_checknum(L, 2);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(math_pow)		LJLIB_REC(.)[m
[31m-LJLIB_ASM_(math_fmod)[m
[31m-[m
[31m-LJLIB_ASM(math_ldexp)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checknum(L, 1);[m
[31m-#if LJ_DUALNUM && !LJ_TARGET_X86ORX64[m
[31m-  lj_lib_checkint(L, 2);[m
[31m-#else[m
[31m-  lj_lib_checknum(L, 2);[m
[31m-#endif[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(math_min)		LJLIB_REC(math_minmax IR_MIN)[m
[31m-{[m
[31m-  int i = 0;[m
[31m-  do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(math_max)		LJLIB_REC(math_minmax IR_MAX)[m
[31m-[m
[31m-LJLIB_PUSH(3.14159265358979323846) LJLIB_SET(pi)[m
[31m-LJLIB_PUSH(1e310) LJLIB_SET(huge)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* This implements a Tausworthe PRNG with period 2^223. Based on:[m
[31m-**   Tables of maximally-equidistributed combined LFSR generators,[m
[31m-**   Pierre L'Ecuyer, 1991, table 3, 1st entry.[m
[31m-** Full-period ME-CF generator with L=64, J=4, k=223, N1=49.[m
[31m-*/[m
[31m-[m
[31m-/* PRNG state. */[m
[31m-struct RandomState {[m
[31m-  uint64_t gen[4];	/* State of the 4 LFSR generators. */[m
[31m-  int valid;		/* State is valid. */[m
[31m-};[m
[31m-[m
[31m-/* Union needed for bit-pattern conversion between uint64_t and double. */[m
[31m-typedef union { uint64_t u64; double d; } U64double;[m
[31m-[m
[31m-/* Update generator i and compute a running xor of all states. */[m
[31m-#define TW223_GEN(i, k, q, s) \[m
[31m-  z = rs->gen[i]; \[m
[31m-  z = (((z<<q)^z) >> (k-s)) ^ ((z&((uint64_t)(int64_t)-1 << (64-k)))<<s); \[m
[31m-  r ^= z; rs->gen[i] = z;[m
[31m-[m
[31m-/* PRNG step function. Returns a double in the range 1.0 <= d < 2.0. */[m
[31m-LJ_NOINLINE uint64_t LJ_FASTCALL lj_math_random_step(RandomState *rs)[m
[31m-{[m
[31m-  uint64_t z, r = 0;[m
[31m-  TW223_GEN(0, 63, 31, 18)[m
[31m-  TW223_GEN(1, 58, 19, 28)[m
[31m-  TW223_GEN(2, 55, 24,  7)[m
[31m-  TW223_GEN(3, 47, 21,  8)[m
[31m-  return (r & U64x(000fffff,ffffffff)) | U64x(3ff00000,00000000);[m
[31m-}[m
[31m-[m
[31m-/* PRNG initialization function. */[m
[31m-static void random_init(RandomState *rs, double d)[m
[31m-{[m
[31m-  uint32_t r = 0x11090601;  /* 64-k[i] as four 8 bit constants. */[m
[31m-  int i;[m
[31m-  for (i = 0; i < 4; i++) {[m
[31m-    U64double u;[m
[31m-    uint32_t m = 1u << (r&255);[m
[31m-    r >>= 8;[m
[31m-    u.d = d = d * 3.14159265358979323846 + 2.7182818284590452354;[m
[31m-    if (u.u64 < m) u.u64 += m;  /* Ensure k[i] MSB of gen[i] are non-zero. */[m
[31m-    rs->gen[i] = u.u64;[m
[31m-  }[m
[31m-  rs->valid = 1;[m
[31m-  for (i = 0; i < 10; i++)[m
[31m-    lj_math_random_step(rs);[m
[31m-}[m
[31m-[m
[31m-/* PRNG extract function. */[m
[31m-LJLIB_PUSH(top-2)  /* Upvalue holds userdata with RandomState. */[m
[31m-LJLIB_CF(math_random)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int n = (int)(L->top - L->base);[m
[31m-  RandomState *rs = (RandomState *)(uddata(udataV(lj_lib_upvalue(L, 1))));[m
[31m-  U64double u;[m
[31m-  double d;[m
[31m-  if (LJ_UNLIKELY(!rs->valid)) random_init(rs, 0.0);[m
[31m-  u.u64 = lj_math_random_step(rs);[m
[31m-  d = u.d - 1.0;[m
[31m-  if (n > 0) {[m
[31m-#if LJ_DUALNUM[m
[31m-    int isint = 1;[m
[31m-    double r1;[m
[31m-    lj_lib_checknumber(L, 1);[m
[31m-    if (tvisint(L->base)) {[m
[31m-      r1 = (lua_Number)intV(L->base);[m
[31m-    } else {[m
[31m-      isint = 0;[m
[31m-      r1 = numV(L->base);[m
[31m-    }[m
[31m-#else[m
[31m-    double r1 = lj_lib_checknum(L, 1);[m
[31m-#endif[m
[31m-    if (n == 1) {[m
[31m-      d = lj_vm_floor(d*r1) + 1.0;  /* d is an int in range [1, r1] */[m
[31m-    } else {[m
[31m-#if LJ_DUALNUM[m
[31m-      double r2;[m
[31m-      lj_lib_checknumber(L, 2);[m
[31m-      if (tvisint(L->base+1)) {[m
[31m-	r2 = (lua_Number)intV(L->base+1);[m
[31m-      } else {[m
[31m-	isint = 0;[m
[31m-	r2 = numV(L->base+1);[m
[31m-      }[m
[31m-#else[m
[31m-      double r2 = lj_lib_checknum(L, 2);[m
[31m-#endif[m
[31m-      d = lj_vm_floor(d*(r2-r1+1.0)) + r1;  /* d is an int in range [r1, r2] */[m
[31m-    }[m
[31m-#if LJ_DUALNUM[m
[31m-    if (isint) {[m
[31m-      setintV(L->top-1, lj_num2int(d));[m
[31m-      return 1;[m
[31m-    }[m
[31m-#endif[m
[31m-  }  /* else: d is a double in range [0, 1] */[m
[31m-  setnumV(L->top++, d);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* PRNG seed function. */[m
[31m-LJLIB_PUSH(top-2)  /* Upvalue holds userdata with RandomState. */[m
[31m-LJLIB_CF(math_randomseed)[m
[31m-{[m
[31m-  RandomState *rs = (RandomState *)(uddata(udataV(lj_lib_upvalue(L, 1))));[m
[31m-  random_init(rs, lj_lib_checknum(L, 1));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_math(lua_State *L)[m
[31m-{[m
[31m-  RandomState *rs;[m
[31m-  rs = (RandomState *)lua_newuserdata(L, sizeof(RandomState));[m
[31m-  rs->valid = 0;  /* Use lazy initialization to save some time on startup. */[m
[31m-  LJ_LIB_REG(L, LUA_MATHLIBNAME, math);[m
[31m-#if defined(LUA_COMPAT_MOD) && !LJ_52[m
[31m-  lua_getfield(L, -1, "fmod");[m
[31m-  lua_setfield(L, -2, "mod");[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os.c[m
[1mdeleted file mode 100644[m
[1mindex 941c2a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_os.c[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-/*[m
[31m-** OS library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <time.h>[m
[31m-[m
[31m-#define lib_os_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-#if LJ_TARGET_POSIX[m
[31m-#include <unistd.h>[m
[31m-#else[m
[31m-#include <stdio.h>[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_TARGET_PSVITA[m
[31m-#include <locale.h>[m
[31m-#endif[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_os[m
[31m-[m
[31m-LJLIB_CF(os_execute)[m
[31m-{[m
[31m-#if LJ_NO_SYSTEM[m
[31m-#if LJ_52[m
[31m-  errno = ENOSYS;[m
[31m-  return luaL_fileresult(L, 0, NULL);[m
[31m-#else[m
[31m-  lua_pushinteger(L, -1);[m
[31m-  return 1;[m
[31m-#endif[m
[31m-#else[m
[31m-  const char *cmd = luaL_optstring(L, 1, NULL);[m
[31m-  int stat = system(cmd);[m
[31m-#if LJ_52[m
[31m-  if (cmd)[m
[31m-    return luaL_execresult(L, stat);[m
[31m-  setboolV(L->top++, 1);[m
[31m-#else[m
[31m-  setintV(L->top++, stat);[m
[31m-#endif[m
[31m-  return 1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_remove)[m
[31m-{[m
[31m-  const char *filename = luaL_checkstring(L, 1);[m
[31m-  return luaL_fileresult(L, remove(filename) == 0, filename);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_rename)[m
[31m-{[m
[31m-  const char *fromname = luaL_checkstring(L, 1);[m
[31m-  const char *toname = luaL_checkstring(L, 2);[m
[31m-  return luaL_fileresult(L, rename(fromname, toname) == 0, fromname);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_tmpname)[m
[31m-{[m
[31m-#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PSVITA[m
[31m-  lj_err_caller(L, LJ_ERR_OSUNIQF);[m
[31m-  return 0;[m
[31m-#else[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  char buf[15+1];[m
[31m-  int fp;[m
[31m-  strcpy(buf, "/tmp/lua_XXXXXX");[m
[31m-  fp = mkstemp(buf);[m
[31m-  if (fp != -1)[m
[31m-    close(fp);[m
[31m-  else[m
[31m-    lj_err_caller(L, LJ_ERR_OSUNIQF);[m
[31m-#else[m
[31m-  char buf[L_tmpnam];[m
[31m-  if (tmpnam(buf) == NULL)[m
[31m-    lj_err_caller(L, LJ_ERR_OSUNIQF);[m
[31m-#endif[m
[31m-  lua_pushstring(L, buf);[m
[31m-  return 1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_getenv)[m
[31m-{[m
[31m-#if LJ_TARGET_CONSOLE[m
[31m-  lua_pushnil(L);[m
[31m-#else[m
[31m-  lua_pushstring(L, getenv(luaL_checkstring(L, 1)));  /* if NULL push nil */[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_exit)[m
[31m-{[m
[31m-  int status;[m
[31m-  if (L->base < L->top && tvisbool(L->base))[m
[31m-    status = boolV(L->base) ? EXIT_SUCCESS : EXIT_FAILURE;[m
[31m-  else[m
[31m-    status = lj_lib_optint(L, 1, EXIT_SUCCESS);[m
[31m-  if (L->base+1 < L->top && tvistruecond(L->base+1))[m
[31m-    lua_close(L);[m
[31m-  exit(status);[m
[31m-  return 0;  /* Unreachable. */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_clock)[m
[31m-{[m
[31m-  setnumV(L->top++, ((lua_Number)clock())*(1.0/(lua_Number)CLOCKS_PER_SEC));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void setfield(lua_State *L, const char *key, int value)[m
[31m-{[m
[31m-  lua_pushinteger(L, value);[m
[31m-  lua_setfield(L, -2, key);[m
[31m-}[m
[31m-[m
[31m-static void setboolfield(lua_State *L, const char *key, int value)[m
[31m-{[m
[31m-  if (value < 0)  /* undefined? */[m
[31m-    return;  /* does not set field */[m
[31m-  lua_pushboolean(L, value);[m
[31m-  lua_setfield(L, -2, key);[m
[31m-}[m
[31m-[m
[31m-static int getboolfield(lua_State *L, const char *key)[m
[31m-{[m
[31m-  int res;[m
[31m-  lua_getfield(L, -1, key);[m
[31m-  res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1);[m
[31m-  lua_pop(L, 1);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-static int getfield(lua_State *L, const char *key, int d)[m
[31m-{[m
[31m-  int res;[m
[31m-  lua_getfield(L, -1, key);[m
[31m-  if (lua_isnumber(L, -1)) {[m
[31m-    res = (int)lua_tointeger(L, -1);[m
[31m-  } else {[m
[31m-    if (d < 0)[m
[31m-      lj_err_callerv(L, LJ_ERR_OSDATEF, key);[m
[31m-    res = d;[m
[31m-  }[m
[31m-  lua_pop(L, 1);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_date)[m
[31m-{[m
[31m-  const char *s = luaL_optstring(L, 1, "%c");[m
[31m-  time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL));[m
[31m-  struct tm *stm;[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  struct tm rtm;[m
[31m-#endif[m
[31m-  if (*s == '!') {  /* UTC? */[m
[31m-    s++;  /* Skip '!' */[m
[31m-#if LJ_TARGET_POSIX[m
[31m-    stm = gmtime_r(&t, &rtm);[m
[31m-#else[m
[31m-    stm = gmtime(&t);[m
[31m-#endif[m
[31m-  } else {[m
[31m-#if LJ_TARGET_POSIX[m
[31m-    stm = localtime_r(&t, &rtm);[m
[31m-#else[m
[31m-    stm = localtime(&t);[m
[31m-#endif[m
[31m-  }[m
[31m-  if (stm == NULL) {  /* Invalid date? */[m
[31m-    setnilV(L->top++);[m
[31m-  } else if (strcmp(s, "*t") == 0) {[m
[31m-    lua_createtable(L, 0, 9);  /* 9 = number of fields */[m
[31m-    setfield(L, "sec", stm->tm_sec);[m
[31m-    setfield(L, "min", stm->tm_min);[m
[31m-    setfield(L, "hour", stm->tm_hour);[m
[31m-    setfield(L, "day", stm->tm_mday);[m
[31m-    setfield(L, "month", stm->tm_mon+1);[m
[31m-    setfield(L, "year", stm->tm_year+1900);[m
[31m-    setfield(L, "wday", stm->tm_wday+1);[m
[31m-    setfield(L, "yday", stm->tm_yday+1);[m
[31m-    setboolfield(L, "isdst", stm->tm_isdst);[m
[31m-  } else if (*s) {[m
[31m-    SBuf *sb = &G(L)->tmpbuf;[m
[31m-    MSize sz = 0;[m
[31m-    const char *q;[m
[31m-    for (q = s; *q; q++)[m
[31m-      sz += (*q == '%') ? 30 : 1;  /* Overflow doesn't matter. */[m
[31m-    setsbufL(sb, L);[m
[31m-    for (;;) {[m
[31m-      char *buf = lj_buf_need(sb, sz);[m
[31m-      size_t len = strftime(buf, sbufsz(sb), s, stm);[m
[31m-      if (len) {[m
[31m-	setstrV(L, L->top++, lj_str_new(L, buf, len));[m
[31m-	lj_gc_check(L);[m
[31m-	break;[m
[31m-      }[m
[31m-      sz += (sz|1);[m
[31m-    }[m
[31m-  } else {[m
[31m-    setstrV(L, L->top++, &G(L)->strempty);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_time)[m
[31m-{[m
[31m-  time_t t;[m
[31m-  if (lua_isnoneornil(L, 1)) {  /* called without args? */[m
[31m-    t = time(NULL);  /* get current time */[m
[31m-  } else {[m
[31m-    struct tm ts;[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-    lua_settop(L, 1);  /* make sure table is at the top */[m
[31m-    ts.tm_sec = getfield(L, "sec", 0);[m
[31m-    ts.tm_min = getfield(L, "min", 0);[m
[31m-    ts.tm_hour = getfield(L, "hour", 12);[m
[31m-    ts.tm_mday = getfield(L, "day", -1);[m
[31m-    ts.tm_mon = getfield(L, "month", -1) - 1;[m
[31m-    ts.tm_year = getfield(L, "year", -1) - 1900;[m
[31m-    ts.tm_isdst = getboolfield(L, "isdst");[m
[31m-    t = mktime(&ts);[m
[31m-  }[m
[31m-  if (t == (time_t)(-1))[m
[31m-    lua_pushnil(L);[m
[31m-  else[m
[31m-    lua_pushnumber(L, (lua_Number)t);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_difftime)[m
[31m-{[m
[31m-  lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)),[m
[31m-			     (time_t)(luaL_optnumber(L, 2, (lua_Number)0))));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-LJLIB_CF(os_setlocale)[m
[31m-{[m
[31m-#if LJ_TARGET_PSVITA[m
[31m-  lua_pushliteral(L, "C");[m
[31m-#else[m
[31m-  GCstr *s = lj_lib_optstr(L, 1);[m
[31m-  const char *str = s ? strdata(s) : NULL;[m
[31m-  int opt = lj_lib_checkopt(L, 2, 6,[m
[31m-    "\5ctype\7numeric\4time\7collate\10monetary\1\377\3all");[m
[31m-  if (opt == 0) opt = LC_CTYPE;[m
[31m-  else if (opt == 1) opt = LC_NUMERIC;[m
[31m-  else if (opt == 2) opt = LC_TIME;[m
[31m-  else if (opt == 3) opt = LC_COLLATE;[m
[31m-  else if (opt == 4) opt = LC_MONETARY;[m
[31m-  else if (opt == 6) opt = LC_ALL;[m
[31m-  lua_pushstring(L, setlocale(opt, str));[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_os(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, LUA_OSLIBNAME, os);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package.c[m
[1mdeleted file mode 100644[m
[1mindex 8c336b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_package.c[m
[1m+++ /dev/null[m
[36m@@ -1,610 +0,0 @@[m
[31m-/*[m
[31m-** Package library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2012 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_package_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Error codes for ll_loadfunc. */[m
[31m-#define PACKAGE_ERR_LIB		1[m
[31m-#define PACKAGE_ERR_FUNC	2[m
[31m-#define PACKAGE_ERR_LOAD	3[m
[31m-[m
[31m-/* Redefined in platform specific part. */[m
[31m-#define PACKAGE_LIB_FAIL	"open"[m
[31m-#define setprogdir(L)		((void)0)[m
[31m-[m
[31m-/* Symbol name prefixes. */[m
[31m-#define SYMPREFIX_CF		"luaopen_%s"[m
[31m-#define SYMPREFIX_BC		"luaJIT_BC_%s"[m
[31m-[m
[31m-#if LJ_TARGET_DLOPEN[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-static void ll_unloadlib(void *lib)[m
[31m-{[m
[31m-  dlclose(lib);[m
[31m-}[m
[31m-[m
[31m-static void *ll_load(lua_State *L, const char *path, int gl)[m
[31m-{[m
[31m-  void *lib = dlopen(path, RTLD_NOW | (gl ? RTLD_GLOBAL : RTLD_LOCAL));[m
[31m-  if (lib == NULL) lua_pushstring(L, dlerror());[m
[31m-  return lib;[m
[31m-}[m
[31m-[m
[31m-static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym)[m
[31m-{[m
[31m-  lua_CFunction f = (lua_CFunction)dlsym(lib, sym);[m
[31m-  if (f == NULL) lua_pushstring(L, dlerror());[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-static const char *ll_bcsym(void *lib, const char *sym)[m
[31m-{[m
[31m-#if defined(RTLD_DEFAULT)[m
[31m-  if (lib == NULL) lib = RTLD_DEFAULT;[m
[31m-#elif LJ_TARGET_OSX || LJ_TARGET_BSD[m
[31m-  if (lib == NULL) lib = (void *)(intptr_t)-2;[m
[31m-#endif[m
[31m-  return (const char *)dlsym(lib, sym);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS[m
[31m-#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS  4[m
[31m-#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT  2[m
[31m-BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*);[m
[31m-#endif[m
[31m-[m
[31m-#undef setprogdir[m
[31m-[m
[31m-static void setprogdir(lua_State *L)[m
[31m-{[m
[31m-  char buff[MAX_PATH + 1];[m
[31m-  char *lb;[m
[31m-  DWORD nsize = sizeof(buff);[m
[31m-  DWORD n = GetModuleFileNameA(NULL, buff, nsize);[m
[31m-  if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) {[m
[31m-    luaL_error(L, "unable to get ModuleFileName");[m
[31m-  } else {[m
[31m-    *lb = '\0';[m
[31m-    luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff);[m
[31m-    lua_remove(L, -2);  /* remove original string */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void pusherror(lua_State *L)[m
[31m-{[m
[31m-  DWORD error = GetLastError();[m
[31m-#if LJ_TARGET_XBOXONE[m
[31m-  wchar_t wbuffer[128];[m
[31m-  char buffer[128*2];[m
[31m-  if (FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-      NULL, error, 0, wbuffer, sizeof(wbuffer)/sizeof(wchar_t), NULL) &&[m
[31m-      WideCharToMultiByte(CP_ACP, 0, wbuffer, 128, buffer, 128*2, NULL, NULL))[m
[31m-#else[m
[31m-  char buffer[128];[m
[31m-  if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-      NULL, error, 0, buffer, sizeof(buffer), NULL))[m
[31m-#endif[m
[31m-    lua_pushstring(L, buffer);[m
[31m-  else[m
[31m-    lua_pushfstring(L, "system error %d\n", error);[m
[31m-}[m
[31m-[m
[31m-static void ll_unloadlib(void *lib)[m
[31m-{[m
[31m-  FreeLibrary((HINSTANCE)lib);[m
[31m-}[m
[31m-[m
[31m-static void *ll_load(lua_State *L, const char *path, int gl)[m
[31m-{[m
[31m-  HINSTANCE lib = LoadLibraryExA(path, NULL, 0);[m
[31m-  if (lib == NULL) pusherror(L);[m
[31m-  UNUSED(gl);[m
[31m-  return lib;[m
[31m-}[m
[31m-[m
[31m-static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym)[m
[31m-{[m
[31m-  lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym);[m
[31m-  if (f == NULL) pusherror(L);[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-static const char *ll_bcsym(void *lib, const char *sym)[m
[31m-{[m
[31m-  if (lib) {[m
[31m-    return (const char *)GetProcAddress((HINSTANCE)lib, sym);[m
[31m-  } else {[m
[31m-    HINSTANCE h = GetModuleHandleA(NULL);[m
[31m-    const char *p = (const char *)GetProcAddress(h, sym);[m
[31m-    if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,[m
[31m-					(const char *)ll_bcsym, &h))[m
[31m-      p = (const char *)GetProcAddress(h, sym);[m
[31m-    return p;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#undef PACKAGE_LIB_FAIL[m
[31m-#define PACKAGE_LIB_FAIL	"absent"[m
[31m-[m
[31m-#define DLMSG	"dynamic libraries not enabled; no support for target OS"[m
[31m-[m
[31m-static void ll_unloadlib(void *lib)[m
[31m-{[m
[31m-  UNUSED(lib);[m
[31m-}[m
[31m-[m
[31m-static void *ll_load(lua_State *L, const char *path, int gl)[m
[31m-{[m
[31m-  UNUSED(path); UNUSED(gl);[m
[31m-  lua_pushliteral(L, DLMSG);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym)[m
[31m-{[m
[31m-  UNUSED(lib); UNUSED(sym);[m
[31m-  lua_pushliteral(L, DLMSG);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static const char *ll_bcsym(void *lib, const char *sym)[m
[31m-{[m
[31m-  UNUSED(lib); UNUSED(sym);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void **ll_register(lua_State *L, const char *path)[m
[31m-{[m
[31m-  void **plib;[m
[31m-  lua_pushfstring(L, "LOADLIB: %s", path);[m
[31m-  lua_gettable(L, LUA_REGISTRYINDEX);  /* check library in registry? */[m
[31m-  if (!lua_isnil(L, -1)) {  /* is there an entry? */[m
[31m-    plib = (void **)lua_touserdata(L, -1);[m
[31m-  } else {  /* no entry yet; create one */[m
[31m-    lua_pop(L, 1);[m
[31m-    plib = (void **)lua_newuserdata(L, sizeof(void *));[m
[31m-    *plib = NULL;[m
[31m-    luaL_getmetatable(L, "_LOADLIB");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-    lua_pushfstring(L, "LOADLIB: %s", path);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_settable(L, LUA_REGISTRYINDEX);[m
[31m-  }[m
[31m-  return plib;[m
[31m-}[m
[31m-[m
[31m-static const char *mksymname(lua_State *L, const char *modname,[m
[31m-			     const char *prefix)[m
[31m-{[m
[31m-  const char *funcname;[m
[31m-  const char *mark = strchr(modname, *LUA_IGMARK);[m
[31m-  if (mark) modname = mark + 1;[m
[31m-  funcname = luaL_gsub(L, modname, ".", "_");[m
[31m-  funcname = lua_pushfstring(L, prefix, funcname);[m
[31m-  lua_remove(L, -2);  /* remove 'gsub' result */[m
[31m-  return funcname;[m
[31m-}[m
[31m-[m
[31m-static int ll_loadfunc(lua_State *L, const char *path, const char *name, int r)[m
[31m-{[m
[31m-  void **reg = ll_register(L, path);[m
[31m-  if (*reg == NULL) *reg = ll_load(L, path, (*name == '*'));[m
[31m-  if (*reg == NULL) {[m
[31m-    return PACKAGE_ERR_LIB;  /* Unable to load library. */[m
[31m-  } else if (*name == '*') {  /* Only load library into global namespace. */[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    return 0;[m
[31m-  } else {[m
[31m-    const char *sym = r ? name : mksymname(L, name, SYMPREFIX_CF);[m
[31m-    lua_CFunction f = ll_sym(L, *reg, sym);[m
[31m-    if (f) {[m
[31m-      lua_pushcfunction(L, f);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    if (!r) {[m
[31m-      const char *bcdata = ll_bcsym(*reg, mksymname(L, name, SYMPREFIX_BC));[m
[31m-      lua_pop(L, 1);[m
[31m-      if (bcdata) {[m
[31m-	if (luaL_loadbuffer(L, bcdata, LJ_MAX_BUF, name) != 0)[m
[31m-	  return PACKAGE_ERR_LOAD;[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    return PACKAGE_ERR_FUNC;  /* Unable to find function. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loadlib(lua_State *L)[m
[31m-{[m
[31m-  const char *path = luaL_checkstring(L, 1);[m
[31m-  const char *init = luaL_checkstring(L, 2);[m
[31m-  int st = ll_loadfunc(L, path, init, 1);[m
[31m-  if (st == 0) {  /* no errors? */[m
[31m-    return 1;  /* return the loaded function */[m
[31m-  } else {  /* error; error message is on stack top */[m
[31m-    lua_pushnil(L);[m
[31m-    lua_insert(L, -2);[m
[31m-    lua_pushstring(L, (st == PACKAGE_ERR_LIB) ?  PACKAGE_LIB_FAIL : "init");[m
[31m-    return 3;  /* return nil, error message, and where */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_unloadlib(lua_State *L)[m
[31m-{[m
[31m-  void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB");[m
[31m-  if (*lib) ll_unloadlib(*lib);[m
[31m-  *lib = NULL;  /* mark library as closed */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static int readable(const char *filename)[m
[31m-{[m
[31m-  FILE *f = fopen(filename, "r");  /* try to open file */[m
[31m-  if (f == NULL) return 0;  /* open failed */[m
[31m-  fclose(f);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static const char *pushnexttemplate(lua_State *L, const char *path)[m
[31m-{[m
[31m-  const char *l;[m
[31m-  while (*path == *LUA_PATHSEP) path++;  /* skip separators */[m
[31m-  if (*path == '\0') return NULL;  /* no more templates */[m
[31m-  l = strchr(path, *LUA_PATHSEP);  /* find next separator */[m
[31m-  if (l == NULL) l = path + strlen(path);[m
[31m-  lua_pushlstring(L, path, (size_t)(l - path));  /* template */[m
[31m-  return l;[m
[31m-}[m
[31m-[m
[31m-static const char *searchpath (lua_State *L, const char *name,[m
[31m-			       const char *path, const char *sep,[m
[31m-			       const char *dirsep)[m
[31m-{[m
[31m-  luaL_Buffer msg;  /* to build error message */[m
[31m-  luaL_buffinit(L, &msg);[m
[31m-  if (*sep != '\0')  /* non-empty separator? */[m
[31m-    name = luaL_gsub(L, name, sep, dirsep);  /* replace it by 'dirsep' */[m
[31m-  while ((path = pushnexttemplate(L, path)) != NULL) {[m
[31m-    const char *filename = luaL_gsub(L, lua_tostring(L, -1),[m
[31m-				     LUA_PATH_MARK, name);[m
[31m-    lua_remove(L, -2);  /* remove path template */[m
[31m-    if (readable(filename))  /* does file exist and is readable? */[m
[31m-      return filename;  /* return that file name */[m
[31m-    lua_pushfstring(L, "\n\tno file " LUA_QS, filename);[m
[31m-    lua_remove(L, -2);  /* remove file name */[m
[31m-    luaL_addvalue(&msg);  /* concatenate error msg. entry */[m
[31m-  }[m
[31m-  luaL_pushresult(&msg);  /* create error message */[m
[31m-  return NULL;  /* not found */[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_searchpath(lua_State *L)[m
[31m-{[m
[31m-  const char *f = searchpath(L, luaL_checkstring(L, 1),[m
[31m-				luaL_checkstring(L, 2),[m
[31m-				luaL_optstring(L, 3, "."),[m
[31m-				luaL_optstring(L, 4, LUA_DIRSEP));[m
[31m-  if (f != NULL) {[m
[31m-    return 1;[m
[31m-  } else {  /* error message is on top of the stack */[m
[31m-    lua_pushnil(L);[m
[31m-    lua_insert(L, -2);[m
[31m-    return 2;  /* return nil + error message */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const char *findfile(lua_State *L, const char *name,[m
[31m-			    const char *pname)[m
[31m-{[m
[31m-  const char *path;[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, pname);[m
[31m-  path = lua_tostring(L, -1);[m
[31m-  if (path == NULL)[m
[31m-    luaL_error(L, LUA_QL("package.%s") " must be a string", pname);[m
[31m-  return searchpath(L, name, path, ".", LUA_DIRSEP);[m
[31m-}[m
[31m-[m
[31m-static void loaderror(lua_State *L, const char *filename)[m
[31m-{[m
[31m-  luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s",[m
[31m-	     lua_tostring(L, 1), filename, lua_tostring(L, -1));[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loader_lua(lua_State *L)[m
[31m-{[m
[31m-  const char *filename;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  filename = findfile(L, name, "path");[m
[31m-  if (filename == NULL) return 1;  /* library not found in this path */[m
[31m-  if (luaL_loadfile(L, filename) != 0)[m
[31m-    loaderror(L, filename);[m
[31m-  return 1;  /* library loaded successfully */[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loader_c(lua_State *L)[m
[31m-{[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  const char *filename = findfile(L, name, "cpath");[m
[31m-  if (filename == NULL) return 1;  /* library not found in this path */[m
[31m-  if (ll_loadfunc(L, filename, name, 0) != 0)[m
[31m-    loaderror(L, filename);[m
[31m-  return 1;  /* library loaded successfully */[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loader_croot(lua_State *L)[m
[31m-{[m
[31m-  const char *filename;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  const char *p = strchr(name, '.');[m
[31m-  int st;[m
[31m-  if (p == NULL) return 0;  /* is root */[m
[31m-  lua_pushlstring(L, name, (size_t)(p - name));[m
[31m-  filename = findfile(L, lua_tostring(L, -1), "cpath");[m
[31m-  if (filename == NULL) return 1;  /* root not found */[m
[31m-  if ((st = ll_loadfunc(L, filename, name, 0)) != 0) {[m
[31m-    if (st != PACKAGE_ERR_FUNC) loaderror(L, filename);  /* real error */[m
[31m-    lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS,[m
[31m-		    name, filename);[m
[31m-    return 1;  /* function not found */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loader_preload(lua_State *L)[m
[31m-{[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, "preload");[m
[31m-  if (!lua_istable(L, -1))[m
[31m-    luaL_error(L, LUA_QL("package.preload") " must be a table");[m
[31m-  lua_getfield(L, -1, name);[m
[31m-  if (lua_isnil(L, -1)) {  /* Not found? */[m
[31m-    const char *bcname = mksymname(L, name, SYMPREFIX_BC);[m
[31m-    const char *bcdata = ll_bcsym(NULL, bcname);[m
[31m-    if (bcdata == NULL || luaL_loadbuffer(L, bcdata, LJ_MAX_BUF, name) != 0)[m
[31m-      lua_pushfstring(L, "\n\tno field package.preload['%s']", name);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static const int sentinel_ = 0;[m
[31m-#define sentinel	((void *)&sentinel_)[m
[31m-[m
[31m-static int lj_cf_package_require(lua_State *L)[m
[31m-{[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  int i;[m
[31m-  lua_settop(L, 1);  /* _LOADED table will be at index 2 */[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, 2, name);[m
[31m-  if (lua_toboolean(L, -1)) {  /* is it there? */[m
[31m-    if (lua_touserdata(L, -1) == sentinel)  /* check loops */[m
[31m-      luaL_error(L, "loop or previous error loading module " LUA_QS, name);[m
[31m-    return 1;  /* package is already loaded */[m
[31m-  }[m
[31m-  /* else must load it; iterate over available loaders */[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, "loaders");[m
[31m-  if (!lua_istable(L, -1))[m
[31m-    luaL_error(L, LUA_QL("package.loaders") " must be a table");[m
[31m-  lua_pushliteral(L, "");  /* error message accumulator */[m
[31m-  for (i = 1; ; i++) {[m
[31m-    lua_rawgeti(L, -2, i);  /* get a loader */[m
[31m-    if (lua_isnil(L, -1))[m
[31m-      luaL_error(L, "module " LUA_QS " not found:%s",[m
[31m-		 name, lua_tostring(L, -2));[m
[31m-    lua_pushstring(L, name);[m
[31m-    lua_call(L, 1, 1);  /* call it */[m
[31m-    if (lua_isfunction(L, -1))  /* did it find module? */[m
[31m-      break;  /* module loaded successfully */[m
[31m-    else if (lua_isstring(L, -1))  /* loader returned error message? */[m
[31m-      lua_concat(L, 2);  /* accumulate it */[m
[31m-    else[m
[31m-      lua_pop(L, 1);[m
[31m-  }[m
[31m-  lua_pushlightuserdata(L, sentinel);[m
[31m-  lua_setfield(L, 2, name);  /* _LOADED[name] = sentinel */[m
[31m-  lua_pushstring(L, name);  /* pass name as argument to module */[m
[31m-  lua_call(L, 1, 1);  /* run loaded module */[m
[31m-  if (!lua_isnil(L, -1))  /* non-nil return? */[m
[31m-    lua_setfield(L, 2, name);  /* _LOADED[name] = returned value */[m
[31m-  lua_getfield(L, 2, name);[m
[31m-  if (lua_touserdata(L, -1) == sentinel) {   /* module did not set a value? */[m
[31m-    lua_pushboolean(L, 1);  /* use true as result */[m
[31m-    lua_pushvalue(L, -1);  /* extra copy to be returned */[m
[31m-    lua_setfield(L, 2, name);  /* _LOADED[name] = true */[m
[31m-  }[m
[31m-  lj_lib_checkfpu(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void setfenv(lua_State *L)[m
[31m-{[m
[31m-  lua_Debug ar;[m
[31m-  if (lua_getstack(L, 1, &ar) == 0 ||[m
[31m-      lua_getinfo(L, "f", &ar) == 0 ||  /* get calling function */[m
[31m-      lua_iscfunction(L, -1))[m
[31m-    luaL_error(L, LUA_QL("module") " not called from a Lua function");[m
[31m-  lua_pushvalue(L, -2);[m
[31m-  lua_setfenv(L, -2);[m
[31m-  lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-static void dooptions(lua_State *L, int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 2; i <= n; i++) {[m
[31m-    lua_pushvalue(L, i);  /* get option (a function) */[m
[31m-    lua_pushvalue(L, -2);  /* module */[m
[31m-    lua_call(L, 1, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void modinit(lua_State *L, const char *modname)[m
[31m-{[m
[31m-  const char *dot;[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_setfield(L, -2, "_M");  /* module._M = module */[m
[31m-  lua_pushstring(L, modname);[m
[31m-  lua_setfield(L, -2, "_NAME");[m
[31m-  dot = strrchr(modname, '.');  /* look for last dot in module name */[m
[31m-  if (dot == NULL) dot = modname; else dot++;[m
[31m-  /* set _PACKAGE as package name (full module name minus last part) */[m
[31m-  lua_pushlstring(L, modname, (size_t)(dot - modname));[m
[31m-  lua_setfield(L, -2, "_PACKAGE");[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_module(lua_State *L)[m
[31m-{[m
[31m-  const char *modname = luaL_checkstring(L, 1);[m
[31m-  int loaded = lua_gettop(L) + 1;  /* index of _LOADED table */[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, loaded, modname);  /* get _LOADED[modname] */[m
[31m-  if (!lua_istable(L, -1)) {  /* not found? */[m
[31m-    lua_pop(L, 1);  /* remove previous result */[m
[31m-    /* try global variable (and create one if it does not exist) */[m
[31m-    if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL)[m
[31m-      lj_err_callerv(L, LJ_ERR_BADMODN, modname);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, loaded, modname);  /* _LOADED[modname] = new table */[m
[31m-  }[m
[31m-  /* check whether table already has a _NAME field */[m
[31m-  lua_getfield(L, -1, "_NAME");[m
[31m-  if (!lua_isnil(L, -1)) {  /* is table an initialized module? */[m
[31m-    lua_pop(L, 1);[m
[31m-  } else {  /* no; initialize it */[m
[31m-    lua_pop(L, 1);[m
[31m-    modinit(L, modname);[m
[31m-  }[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  setfenv(L);[m
[31m-  dooptions(L, loaded - 1);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_seeall(lua_State *L)[m
[31m-{[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    lua_createtable(L, 0, 1); /* create new metatable */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setmetatable(L, 1);[m
[31m-  }[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  lua_setfield(L, -2, "__index");  /* mt.__index = _G */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define AUXMARK		"\1"[m
[31m-[m
[31m-static void setpath(lua_State *L, const char *fieldname, const char *envname,[m
[31m-		    const char *def, int noenv)[m
[31m-{[m
[31m-#if LJ_TARGET_CONSOLE[m
[31m-  const char *path = NULL;[m
[31m-  UNUSED(envname);[m
[31m-#else[m
[31m-  const char *path = getenv(envname);[m
[31m-#endif[m
[31m-  if (path == NULL || noenv) {[m
[31m-    lua_pushstring(L, def);[m
[31m-  } else {[m
[31m-    path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP,[m
[31m-			      LUA_PATHSEP AUXMARK LUA_PATHSEP);[m
[31m-    luaL_gsub(L, path, AUXMARK, def);[m
[31m-    lua_remove(L, -2);[m
[31m-  }[m
[31m-  setprogdir(L);[m
[31m-  lua_setfield(L, -2, fieldname);[m
[31m-}[m
[31m-[m
[31m-static const luaL_Reg package_lib[] = {[m
[31m-  { "loadlib",	lj_cf_package_loadlib },[m
[31m-  { "searchpath",  lj_cf_package_searchpath },[m
[31m-  { "seeall",	lj_cf_package_seeall },[m
[31m-  { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static const luaL_Reg package_global[] = {[m
[31m-  { "module",	lj_cf_package_module },[m
[31m-  { "require",	lj_cf_package_require },[m
[31m-  { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static const lua_CFunction package_loaders[] =[m
[31m-{[m
[31m-  lj_cf_package_loader_preload,[m
[31m-  lj_cf_package_loader_lua,[m
[31m-  lj_cf_package_loader_c,[m
[31m-  lj_cf_package_loader_croot,[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-LUALIB_API int luaopen_package(lua_State *L)[m
[31m-{[m
[31m-  int i;[m
[31m-  int noenv;[m
[31m-  luaL_newmetatable(L, "_LOADLIB");[m
[31m-  lj_lib_pushcf(L, lj_cf_package_unloadlib, 1);[m
[31m-  lua_setfield(L, -2, "__gc");[m
[31m-  luaL_register(L, LUA_LOADLIBNAME, package_lib);[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_replace(L, LUA_ENVIRONINDEX);[m
[31m-  lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0);[m
[31m-  for (i = 0; package_loaders[i] != NULL; i++) {[m
[31m-    lj_lib_pushcf(L, package_loaders[i], 1);[m
[31m-    lua_rawseti(L, -2, i+1);[m
[31m-  }[m
[31m-  lua_setfield(L, -2, "loaders");[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");[m
[31m-  noenv = lua_toboolean(L, -1);[m
[31m-  lua_pop(L, 1);[m
[31m-  setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT, noenv);[m
[31m-  setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT, noenv);[m
[31m-  lua_pushliteral(L, LUA_PATH_CONFIG);[m
[31m-  lua_setfield(L, -2, "config");[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);[m
[31m-  lua_setfield(L, -2, "loaded");[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD", 4);[m
[31m-  lua_setfield(L, -2, "preload");[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  luaL_register(L, NULL, package_global);[m
[31m-  lua_pop(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string.c[m
[1mdeleted file mode 100644[m
[1mindex 46b54a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_string.c[m
[1m+++ /dev/null[m
[36m@@ -1,752 +0,0 @@[m
[31m-/*[m
[31m-** String library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_string_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_string[m
[31m-[m
[31m-LJLIB_LUA(string_len) /*[m
[31m-  function(s)[m
[31m-    CHECK_str(s)[m
[31m-    return #s[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_ASM(string_byte)		LJLIB_REC(string_range 0)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  int32_t len = (int32_t)s->len;[m
[31m-  int32_t start = lj_lib_optint(L, 2, 1);[m
[31m-  int32_t stop = lj_lib_optint(L, 3, start);[m
[31m-  int32_t n, i;[m
[31m-  const unsigned char *p;[m
[31m-  if (stop < 0) stop += len+1;[m
[31m-  if (start < 0) start += len+1;[m
[31m-  if (start <= 0) start = 1;[m
[31m-  if (stop > len) stop = len;[m
[31m-  if (start > stop) return FFH_RES(0);  /* Empty interval: return no results. */[m
[31m-  start--;[m
[31m-  n = stop - start;[m
[31m-  if ((uint32_t)n > LUAI_MAXCSTACK)[m
[31m-    lj_err_caller(L, LJ_ERR_STRSLC);[m
[31m-  lj_state_checkstack(L, (MSize)n);[m
[31m-  p = (const unsigned char *)strdata(s) + start;[m
[31m-  for (i = 0; i < n; i++)[m
[31m-    setintV(L->base + i-1-LJ_FR2, p[i]);[m
[31m-  return FFH_RES(n);[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(string_char)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int i, nargs = (int)(L->top - L->base);[m
[31m-  char *buf = lj_buf_tmp(L, (MSize)nargs);[m
[31m-  for (i = 1; i <= nargs; i++) {[m
[31m-    int32_t k = lj_lib_checkint(L, i);[m
[31m-    if (!checku8(k))[m
[31m-      lj_err_arg(L, i, LJ_ERR_BADVAL);[m
[31m-    buf[i-1] = (char)k;[m
[31m-  }[m
[31m-  setstrV(L, L->base-1-LJ_FR2, lj_str_new(L, buf, (size_t)nargs));[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(string_sub)		LJLIB_REC(string_range 1)[m
[31m-{[m
[31m-  lj_lib_checkstr(L, 1);[m
[31m-  lj_lib_checkint(L, 2);[m
[31m-  setintV(L->base+2, lj_lib_optint(L, 3, -1));[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_rep)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  int32_t rep = lj_lib_checkint(L, 2);[m
[31m-  GCstr *sep = lj_lib_optstr(L, 3);[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  if (sep && rep > 1) {[m
[31m-    GCstr *s2 = lj_buf_cat2str(L, sep, s);[m
[31m-    lj_buf_reset(sb);[m
[31m-    lj_buf_putstr(sb, s);[m
[31m-    s = s2;[m
[31m-    rep--;[m
[31m-  }[m
[31m-  sb = lj_buf_putstr_rep(sb, s, rep);[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sb));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(string_reverse)  LJLIB_REC(string_op IRCALL_lj_buf_putstr_reverse)[m
[31m-{[m
[31m-  lj_lib_checkstr(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(string_lower)  LJLIB_REC(string_op IRCALL_lj_buf_putstr_lower)[m
[31m-LJLIB_ASM_(string_upper)  LJLIB_REC(string_op IRCALL_lj_buf_putstr_upper)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static int writer_buf(lua_State *L, const void *p, size_t size, void *sb)[m
[31m-{[m
[31m-  lj_buf_putmem((SBuf *)sb, p, (MSize)size);[m
[31m-  UNUSED(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_dump)[m
[31m-{[m
[31m-  GCfunc *fn = lj_lib_checkfunc(L, 1);[m
[31m-  int strip = L->base+1 < L->top && tvistruecond(L->base+1);[m
[31m-  SBuf *sb = lj_buf_tmp_(L);  /* Assumes lj_bcwrite() doesn't use tmpbuf. */[m
[31m-  L->top = L->base+1;[m
[31m-  if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip))[m
[31m-    lj_err_caller(L, LJ_ERR_STRDUMP);[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sb));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* macro to `unsign' a character */[m
[31m-#define uchar(c)        ((unsigned char)(c))[m
[31m-[m
[31m-#define CAP_UNFINISHED	(-1)[m
[31m-#define CAP_POSITION	(-2)[m
[31m-[m
[31m-typedef struct MatchState {[m
[31m-  const char *src_init;  /* init of source string */[m
[31m-  const char *src_end;  /* end (`\0') of source string */[m
[31m-  lua_State *L;[m
[31m-  int level;  /* total number of captures (finished or unfinished) */[m
[31m-  int depth;[m
[31m-  struct {[m
[31m-    const char *init;[m
[31m-    ptrdiff_t len;[m
[31m-  } capture[LUA_MAXCAPTURES];[m
[31m-} MatchState;[m
[31m-[m
[31m-#define L_ESC		'%'[m
[31m-[m
[31m-static int check_capture(MatchState *ms, int l)[m
[31m-{[m
[31m-  l -= '1';[m
[31m-  if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)[m
[31m-    lj_err_caller(ms->L, LJ_ERR_STRCAPI);[m
[31m-  return l;[m
[31m-}[m
[31m-[m
[31m-static int capture_to_close(MatchState *ms)[m
[31m-{[m
[31m-  int level = ms->level;[m
[31m-  for (level--; level>=0; level--)[m
[31m-    if (ms->capture[level].len == CAP_UNFINISHED) return level;[m
[31m-  lj_err_caller(ms->L, LJ_ERR_STRPATC);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-static const char *classend(MatchState *ms, const char *p)[m
[31m-{[m
[31m-  switch (*p++) {[m
[31m-  case L_ESC:[m
[31m-    if (*p == '\0')[m
[31m-      lj_err_caller(ms->L, LJ_ERR_STRPATE);[m
[31m-    return p+1;[m
[31m-  case '[':[m
[31m-    if (*p == '^') p++;[m
[31m-    do {  /* look for a `]' */[m
[31m-      if (*p == '\0')[m
[31m-	lj_err_caller(ms->L, LJ_ERR_STRPATM);[m
[31m-      if (*(p++) == L_ESC && *p != '\0')[m
[31m-	p++;  /* skip escapes (e.g. `%]') */[m
[31m-    } while (*p != ']');[m
[31m-    return p+1;[m
[31m-  default:[m
[31m-    return p;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const unsigned char match_class_map[32] = {[m
[31m-  0,LJ_CHAR_ALPHA,0,LJ_CHAR_CNTRL,LJ_CHAR_DIGIT,0,0,LJ_CHAR_GRAPH,0,0,0,0,[m
[31m-  LJ_CHAR_LOWER,0,0,0,LJ_CHAR_PUNCT,0,0,LJ_CHAR_SPACE,0,[m
[31m-  LJ_CHAR_UPPER,0,LJ_CHAR_ALNUM,LJ_CHAR_XDIGIT,0,0,0,0,0,0,0[m
[31m-};[m
[31m-[m
[31m-static int match_class(int c, int cl)[m
[31m-{[m
[31m-  if ((cl & 0xc0) == 0x40) {[m
[31m-    int t = match_class_map[(cl&0x1f)];[m
[31m-    if (t) {[m
[31m-      t = lj_char_isa(c, t);[m
[31m-      return (cl & 0x20) ? t : !t;[m
[31m-    }[m
[31m-    if (cl == 'z') return c == 0;[m
[31m-    if (cl == 'Z') return c != 0;[m
[31m-  }[m
[31m-  return (cl == c);[m
[31m-}[m
[31m-[m
[31m-static int matchbracketclass(int c, const char *p, const char *ec)[m
[31m-{[m
[31m-  int sig = 1;[m
[31m-  if (*(p+1) == '^') {[m
[31m-    sig = 0;[m
[31m-    p++;  /* skip the `^' */[m
[31m-  }[m
[31m-  while (++p < ec) {[m
[31m-    if (*p == L_ESC) {[m
[31m-      p++;[m
[31m-      if (match_class(c, uchar(*p)))[m
[31m-	return sig;[m
[31m-    }[m
[31m-    else if ((*(p+1) == '-') && (p+2 < ec)) {[m
[31m-      p+=2;[m
[31m-      if (uchar(*(p-2)) <= c && c <= uchar(*p))[m
[31m-	return sig;[m
[31m-    }[m
[31m-    else if (uchar(*p) == c) return sig;[m
[31m-  }[m
[31m-  return !sig;[m
[31m-}[m
[31m-[m
[31m-static int singlematch(int c, const char *p, const char *ep)[m
[31m-{[m
[31m-  switch (*p) {[m
[31m-  case '.': return 1;  /* matches any char */[m
[31m-  case L_ESC: return match_class(c, uchar(*(p+1)));[m
[31m-  case '[': return matchbracketclass(c, p, ep-1);[m
[31m-  default:  return (uchar(*p) == c);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const char *match(MatchState *ms, const char *s, const char *p);[m
[31m-[m
[31m-static const char *matchbalance(MatchState *ms, const char *s, const char *p)[m
[31m-{[m
[31m-  if (*p == 0 || *(p+1) == 0)[m
[31m-    lj_err_caller(ms->L, LJ_ERR_STRPATU);[m
[31m-  if (*s != *p) {[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    int b = *p;[m
[31m-    int e = *(p+1);[m
[31m-    int cont = 1;[m
[31m-    while (++s < ms->src_end) {[m
[31m-      if (*s == e) {[m
[31m-	if (--cont == 0) return s+1;[m
[31m-      } else if (*s == b) {[m
[31m-	cont++;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* string ends out of balance */[m
[31m-}[m
[31m-[m
[31m-static const char *max_expand(MatchState *ms, const char *s,[m
[31m-			      const char *p, const char *ep)[m
[31m-{[m
[31m-  ptrdiff_t i = 0;  /* counts maximum expand for item */[m
[31m-  while ((s+i)<ms->src_end && singlematch(uchar(*(s+i)), p, ep))[m
[31m-    i++;[m
[31m-  /* keeps trying to match with the maximum repetitions */[m
[31m-  while (i>=0) {[m
[31m-    const char *res = match(ms, (s+i), ep+1);[m
[31m-    if (res) return res;[m
[31m-    i--;  /* else didn't match; reduce 1 repetition to try again */[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static const char *min_expand(MatchState *ms, const char *s,[m
[31m-			      const char *p, const char *ep)[m
[31m-{[m
[31m-  for (;;) {[m
[31m-    const char *res = match(ms, s, ep+1);[m
[31m-    if (res != NULL)[m
[31m-      return res;[m
[31m-    else if (s<ms->src_end && singlematch(uchar(*s), p, ep))[m
[31m-      s++;  /* try with one more repetition */[m
[31m-    else[m
[31m-      return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const char *start_capture(MatchState *ms, const char *s,[m
[31m-				 const char *p, int what)[m
[31m-{[m
[31m-  const char *res;[m
[31m-  int level = ms->level;[m
[31m-  if (level >= LUA_MAXCAPTURES) lj_err_caller(ms->L, LJ_ERR_STRCAPN);[m
[31m-  ms->capture[level].init = s;[m
[31m-  ms->capture[level].len = what;[m
[31m-  ms->level = level+1;[m
[31m-  if ((res=match(ms, s, p)) == NULL)  /* match failed? */[m
[31m-    ms->level--;  /* undo capture */[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-static const char *end_capture(MatchState *ms, const char *s,[m
[31m-			       const char *p)[m
[31m-{[m
[31m-  int l = capture_to_close(ms);[m
[31m-  const char *res;[m
[31m-  ms->capture[l].len = s - ms->capture[l].init;  /* close capture */[m
[31m-  if ((res = match(ms, s, p)) == NULL)  /* match failed? */[m
[31m-    ms->capture[l].len = CAP_UNFINISHED;  /* undo capture */[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-static const char *match_capture(MatchState *ms, const char *s, int l)[m
[31m-{[m
[31m-  size_t len;[m
[31m-  l = check_capture(ms, l);[m
[31m-  len = (size_t)ms->capture[l].len;[m
[31m-  if ((size_t)(ms->src_end-s) >= len &&[m
[31m-      memcmp(ms->capture[l].init, s, len) == 0)[m
[31m-    return s+len;[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-static const char *match(MatchState *ms, const char *s, const char *p)[m
[31m-{[m
[31m-  if (++ms->depth > LJ_MAX_XLEVEL)[m
[31m-    lj_err_caller(ms->L, LJ_ERR_STRPATX);[m
[31m-  init: /* using goto's to optimize tail recursion */[m
[31m-  switch (*p) {[m
[31m-  case '(':  /* start capture */[m
[31m-    if (*(p+1) == ')')  /* position capture? */[m
[31m-      s = start_capture(ms, s, p+2, CAP_POSITION);[m
[31m-    else[m
[31m-      s = start_capture(ms, s, p+1, CAP_UNFINISHED);[m
[31m-    break;[m
[31m-  case ')':  /* end capture */[m
[31m-    s = end_capture(ms, s, p+1);[m
[31m-    break;[m
[31m-  case L_ESC:[m
[31m-    switch (*(p+1)) {[m
[31m-    case 'b':  /* balanced string? */[m
[31m-      s = matchbalance(ms, s, p+2);[m
[31m-      if (s == NULL) break;[m
[31m-      p+=4;[m
[31m-      goto init;  /* else s = match(ms, s, p+4); */[m
[31m-    case 'f': {  /* frontier? */[m
[31m-      const char *ep; char previous;[m
[31m-      p += 2;[m
[31m-      if (*p != '[')[m
[31m-	lj_err_caller(ms->L, LJ_ERR_STRPATB);[m
[31m-      ep = classend(ms, p);  /* points to what is next */[m
[31m-      previous = (s == ms->src_init) ? '\0' : *(s-1);[m
[31m-      if (matchbracketclass(uchar(previous), p, ep-1) ||[m
[31m-	 !matchbracketclass(uchar(*s), p, ep-1)) { s = NULL; break; }[m
[31m-      p=ep;[m
[31m-      goto init;  /* else s = match(ms, s, ep); */[m
[31m-      }[m
[31m-    default:[m
[31m-      if (lj_char_isdigit(uchar(*(p+1)))) {  /* capture results (%0-%9)? */[m
[31m-	s = match_capture(ms, s, uchar(*(p+1)));[m
[31m-	if (s == NULL) break;[m
[31m-	p+=2;[m
[31m-	goto init;  /* else s = match(ms, s, p+2) */[m
[31m-      }[m
[31m-      goto dflt;  /* case default */[m
[31m-    }[m
[31m-    break;[m
[31m-  case '\0':  /* end of pattern */[m
[31m-    break;  /* match succeeded */[m
[31m-  case '$':[m
[31m-    /* is the `$' the last char in pattern? */[m
[31m-    if (*(p+1) != '\0') goto dflt;[m
[31m-    if (s != ms->src_end) s = NULL;  /* check end of string */[m
[31m-    break;[m
[31m-  default: dflt: {  /* it is a pattern item */[m
[31m-    const char *ep = classend(ms, p);  /* points to what is next */[m
[31m-    int m = s<ms->src_end && singlematch(uchar(*s), p, ep);[m
[31m-    switch (*ep) {[m
[31m-    case '?': {  /* optional */[m
[31m-      const char *res;[m
[31m-      if (m && ((res=match(ms, s+1, ep+1)) != NULL)) {[m
[31m-	s = res;[m
[31m-	break;[m
[31m-      }[m
[31m-      p=ep+1;[m
[31m-      goto init;  /* else s = match(ms, s, ep+1); */[m
[31m-      }[m
[31m-    case '*':  /* 0 or more repetitions */[m
[31m-      s = max_expand(ms, s, p, ep);[m
[31m-      break;[m
[31m-    case '+':  /* 1 or more repetitions */[m
[31m-      s = (m ? max_expand(ms, s+1, p, ep) : NULL);[m
[31m-      break;[m
[31m-    case '-':  /* 0 or more repetitions (minimum) */[m
[31m-      s = min_expand(ms, s, p, ep);[m
[31m-      break;[m
[31m-    default:[m
[31m-      if (m) { s++; p=ep; goto init; }  /* else s = match(ms, s+1, ep); */[m
[31m-      s = NULL;[m
[31m-      break;[m
[31m-    }[m
[31m-    break;[m
[31m-    }[m
[31m-  }[m
[31m-  ms->depth--;[m
[31m-  return s;[m
[31m-}[m
[31m-[m
[31m-static void push_onecapture(MatchState *ms, int i, const char *s, const char *e)[m
[31m-{[m
[31m-  if (i >= ms->level) {[m
[31m-    if (i == 0)  /* ms->level == 0, too */[m
[31m-      lua_pushlstring(ms->L, s, (size_t)(e - s));  /* add whole match */[m
[31m-    else[m
[31m-      lj_err_caller(ms->L, LJ_ERR_STRCAPI);[m
[31m-  } else {[m
[31m-    ptrdiff_t l = ms->capture[i].len;[m
[31m-    if (l == CAP_UNFINISHED) lj_err_caller(ms->L, LJ_ERR_STRCAPU);[m
[31m-    if (l == CAP_POSITION)[m
[31m-      lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1);[m
[31m-    else[m
[31m-      lua_pushlstring(ms->L, ms->capture[i].init, (size_t)l);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int push_captures(MatchState *ms, const char *s, const char *e)[m
[31m-{[m
[31m-  int i;[m
[31m-  int nlevels = (ms->level == 0 && s) ? 1 : ms->level;[m
[31m-  luaL_checkstack(ms->L, nlevels, "too many captures");[m
[31m-  for (i = 0; i < nlevels; i++)[m
[31m-    push_onecapture(ms, i, s, e);[m
[31m-  return nlevels;  /* number of strings pushed */[m
[31m-}[m
[31m-[m
[31m-static int str_find_aux(lua_State *L, int find)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  GCstr *p = lj_lib_checkstr(L, 2);[m
[31m-  int32_t start = lj_lib_optint(L, 3, 1);[m
[31m-  MSize st;[m
[31m-  if (start < 0) start += (int32_t)s->len; else start--;[m
[31m-  if (start < 0) start = 0;[m
[31m-  st = (MSize)start;[m
[31m-  if (st > s->len) {[m
[31m-#if LJ_52[m
[31m-    setnilV(L->top-1);[m
[31m-    return 1;[m
[31m-#else[m
[31m-    st = s->len;[m
[31m-#endif[m
[31m-  }[m
[31m-  if (find && ((L->base+3 < L->top && tvistruecond(L->base+3)) ||[m
[31m-	       !lj_str_haspattern(p))) {  /* Search for fixed string. */[m
[31m-    const char *q = lj_str_find(strdata(s)+st, strdata(p), s->len-st, p->len);[m
[31m-    if (q) {[m
[31m-      setintV(L->top-2, (int32_t)(q-strdata(s)) + 1);[m
[31m-      setintV(L->top-1, (int32_t)(q-strdata(s)) + (int32_t)p->len);[m
[31m-      return 2;[m
[31m-    }[m
[31m-  } else {  /* Search for pattern. */[m
[31m-    MatchState ms;[m
[31m-    const char *pstr = strdata(p);[m
[31m-    const char *sstr = strdata(s) + st;[m
[31m-    int anchor = 0;[m
[31m-    if (*pstr == '^') { pstr++; anchor = 1; }[m
[31m-    ms.L = L;[m
[31m-    ms.src_init = strdata(s);[m
[31m-    ms.src_end = strdata(s) + s->len;[m
[31m-    do {  /* Loop through string and try to match the pattern. */[m
[31m-      const char *q;[m
[31m-      ms.level = ms.depth = 0;[m
[31m-      q = match(&ms, sstr, pstr);[m
[31m-      if (q) {[m
[31m-	if (find) {[m
[31m-	  setintV(L->top++, (int32_t)(sstr-(strdata(s)-1)));[m
[31m-	  setintV(L->top++, (int32_t)(q-strdata(s)));[m
[31m-	  return push_captures(&ms, NULL, NULL) + 2;[m
[31m-	} else {[m
[31m-	  return push_captures(&ms, sstr, q);[m
[31m-	}[m
[31m-      }[m
[31m-    } while (sstr++ < ms.src_end && !anchor);[m
[31m-  }[m
[31m-  setnilV(L->top-1);  /* Not found. */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_find)		LJLIB_REC(.)[m
[31m-{[m
[31m-  return str_find_aux(L, 1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_match)[m
[31m-{[m
[31m-  return str_find_aux(L, 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_NOREG LJLIB_CF(string_gmatch_aux)[m
[31m-{[m
[31m-  const char *p = strVdata(lj_lib_upvalue(L, 2));[m
[31m-  GCstr *str = strV(lj_lib_upvalue(L, 1));[m
[31m-  const char *s = strdata(str);[m
[31m-  TValue *tvpos = lj_lib_upvalue(L, 3);[m
[31m-  const char *src = s + tvpos->u32.lo;[m
[31m-  MatchState ms;[m
[31m-  ms.L = L;[m
[31m-  ms.src_init = s;[m
[31m-  ms.src_end = s + str->len;[m
[31m-  for (; src <= ms.src_end; src++) {[m
[31m-    const char *e;[m
[31m-    ms.level = ms.depth = 0;[m
[31m-    if ((e = match(&ms, src, p)) != NULL) {[m
[31m-      int32_t pos = (int32_t)(e - s);[m
[31m-      if (e == src) pos++;  /* Ensure progress for empty match. */[m
[31m-      tvpos->u32.lo = (uint32_t)pos;[m
[31m-      return push_captures(&ms, src, e);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* not found */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_gmatch)[m
[31m-{[m
[31m-  lj_lib_checkstr(L, 1);[m
[31m-  lj_lib_checkstr(L, 2);[m
[31m-  L->top = L->base+3;[m
[31m-  (L->top-1)->u64 = 0;[m
[31m-  lj_lib_pushcc(L, lj_cf_string_gmatch_aux, FF_string_gmatch_aux, 3);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static void add_s(MatchState *ms, luaL_Buffer *b, const char *s, const char *e)[m
[31m-{[m
[31m-  size_t l, i;[m
[31m-  const char *news = lua_tolstring(ms->L, 3, &l);[m
[31m-  for (i = 0; i < l; i++) {[m
[31m-    if (news[i] != L_ESC) {[m
[31m-      luaL_addchar(b, news[i]);[m
[31m-    } else {[m
[31m-      i++;  /* skip ESC */[m
[31m-      if (!lj_char_isdigit(uchar(news[i]))) {[m
[31m-	luaL_addchar(b, news[i]);[m
[31m-      } else if (news[i] == '0') {[m
[31m-	luaL_addlstring(b, s, (size_t)(e - s));[m
[31m-      } else {[m
[31m-	push_onecapture(ms, news[i] - '1', s, e);[m
[31m-	luaL_addvalue(b);  /* add capture to accumulated result */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void add_value(MatchState *ms, luaL_Buffer *b,[m
[31m-		      const char *s, const char *e)[m
[31m-{[m
[31m-  lua_State *L = ms->L;[m
[31m-  switch (lua_type(L, 3)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-    case LUA_TSTRING: {[m
[31m-      add_s(ms, b, s, e);[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TFUNCTION: {[m
[31m-      int n;[m
[31m-      lua_pushvalue(L, 3);[m
[31m-      n = push_captures(ms, s, e);[m
[31m-      lua_call(L, n, 1);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TTABLE: {[m
[31m-      push_onecapture(ms, 0, s, e);[m
[31m-      lua_gettable(L, 3);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  if (!lua_toboolean(L, -1)) {  /* nil or false? */[m
[31m-    lua_pop(L, 1);[m
[31m-    lua_pushlstring(L, s, (size_t)(e - s));  /* keep original text */[m
[31m-  } else if (!lua_isstring(L, -1)) {[m
[31m-    lj_err_callerv(L, LJ_ERR_STRGSRV, luaL_typename(L, -1));[m
[31m-  }[m
[31m-  luaL_addvalue(b);  /* add result to accumulator */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_gsub)[m
[31m-{[m
[31m-  size_t srcl;[m
[31m-  const char *src = luaL_checklstring(L, 1, &srcl);[m
[31m-  const char *p = luaL_checkstring(L, 2);[m
[31m-  int  tr = lua_type(L, 3);[m
[31m-  int max_s = luaL_optint(L, 4, (int)(srcl+1));[m
[31m-  int anchor = (*p == '^') ? (p++, 1) : 0;[m
[31m-  int n = 0;[m
[31m-  MatchState ms;[m
[31m-  luaL_Buffer b;[m
[31m-  if (!(tr == LUA_TNUMBER || tr == LUA_TSTRING ||[m
[31m-	tr == LUA_TFUNCTION || tr == LUA_TTABLE))[m
[31m-    lj_err_arg(L, 3, LJ_ERR_NOSFT);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  ms.L = L;[m
[31m-  ms.src_init = src;[m
[31m-  ms.src_end = src+srcl;[m
[31m-  while (n < max_s) {[m
[31m-    const char *e;[m
[31m-    ms.level = ms.depth = 0;[m
[31m-    e = match(&ms, src, p);[m
[31m-    if (e) {[m
[31m-      n++;[m
[31m-      add_value(&ms, &b, src, e);[m
[31m-    }[m
[31m-    if (e && e>src) /* non empty match? */[m
[31m-      src = e;  /* skip it */[m
[31m-    else if (src < ms.src_end)[m
[31m-      luaL_addchar(&b, *src++);[m
[31m-    else[m
[31m-      break;[m
[31m-    if (anchor)[m
[31m-      break;[m
[31m-  }[m
[31m-  luaL_addlstring(&b, src, (size_t)(ms.src_end-src));[m
[31m-  luaL_pushresult(&b);[m
[31m-  lua_pushinteger(L, n);  /* number of substitutions */[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Emulate tostring() inline. */[m
[31m-static GCstr *string_fmt_tostring(lua_State *L, int arg, int retry)[m
[31m-{[m
[31m-  TValue *o = L->base+arg-1;[m
[31m-  cTValue *mo;[m
[31m-  lua_assert(o < L->top);  /* Caller already checks for existence. */[m
[31m-  if (LJ_LIKELY(tvisstr(o)))[m
[31m-    return strV(o);[m
[31m-  if (retry != 2 && !tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) {[m
[31m-    copyTV(L, L->top++, mo);[m
[31m-    copyTV(L, L->top++, o);[m
[31m-    lua_call(L, 1, 1);[m
[31m-    copyTV(L, L->base+arg-1, --L->top);[m
[31m-    return NULL;  /* Buffer may be overwritten, retry. */[m
[31m-  }[m
[31m-  return lj_strfmt_obj(L, o);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_format)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int arg, top = (int)(L->top - L->base);[m
[31m-  GCstr *fmt;[m
[31m-  SBuf *sb;[m
[31m-  FormatState fs;[m
[31m-  SFormat sf;[m
[31m-  int retry = 0;[m
[31m-again:[m
[31m-  arg = 1;[m
[31m-  sb = lj_buf_tmp_(L);[m
[31m-  fmt = lj_lib_checkstr(L, arg);[m
[31m-  lj_strfmt_init(&fs, strdata(fmt), fmt->len);[m
[31m-  while ((sf = lj_strfmt_parse(&fs)) != STRFMT_EOF) {[m
[31m-    if (sf == STRFMT_LIT) {[m
[31m-      lj_buf_putmem(sb, fs.str, fs.len);[m
[31m-    } else if (sf == STRFMT_ERR) {[m
[31m-      lj_err_callerv(L, LJ_ERR_STRFMT, strdata(lj_str_new(L, fs.str, fs.len)));[m
[31m-    } else {[m
[31m-      if (++arg > top)[m
[31m-	luaL_argerror(L, arg, lj_obj_typename[0]);[m
[31m-      switch (STRFMT_TYPE(sf)) {[m
[31m-      case STRFMT_INT:[m
[31m-	if (tvisint(L->base+arg-1)) {[m
[31m-	  int32_t k = intV(L->base+arg-1);[m
[31m-	  if (sf == STRFMT_INT)[m
[31m-	    lj_strfmt_putint(sb, k);  /* Shortcut for plain %d. */[m
[31m-	  else[m
[31m-	    lj_strfmt_putfxint(sb, sf, k);[m
[31m-	} else {[m
[31m-	  lj_strfmt_putfnum_int(sb, sf, lj_lib_checknum(L, arg));[m
[31m-	}[m
[31m-	break;[m
[31m-      case STRFMT_UINT:[m
[31m-	if (tvisint(L->base+arg-1))[m
[31m-	  lj_strfmt_putfxint(sb, sf, intV(L->base+arg-1));[m
[31m-	else[m
[31m-	  lj_strfmt_putfnum_uint(sb, sf, lj_lib_checknum(L, arg));[m
[31m-	break;[m
[31m-      case STRFMT_NUM:[m
[31m-	lj_strfmt_putfnum(sb, sf, lj_lib_checknum(L, arg));[m
[31m-	break;[m
[31m-      case STRFMT_STR: {[m
[31m-	GCstr *str = string_fmt_tostring(L, arg, retry);[m
[31m-	if (str == NULL)[m
[31m-	  retry = 1;[m
[31m-	else if ((sf & STRFMT_T_QUOTED))[m
[31m-	  lj_strfmt_putquoted(sb, str);  /* No formatting. */[m
[31m-	else[m
[31m-	  lj_strfmt_putfstr(sb, sf, str);[m
[31m-	break;[m
[31m-	}[m
[31m-      case STRFMT_CHAR:[m
[31m-	lj_strfmt_putfchar(sb, sf, lj_lib_checkint(L, arg));[m
[31m-	break;[m
[31m-      case STRFMT_PTR:  /* No formatting. */[m
[31m-	lj_strfmt_putptr(sb, lj_obj_ptr(L->base+arg-1));[m
[31m-	break;[m
[31m-      default:[m
[31m-	lua_assert(0);[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (retry++ == 1) goto again;[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sb));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_string(lua_State *L)[m
[31m-{[m
[31m-  GCtab *mt;[m
[31m-  global_State *g;[m
[31m-  LJ_LIB_REG(L, LUA_STRLIBNAME, string);[m
[31m-#if defined(LUA_COMPAT_GFIND) && !LJ_52[m
[31m-  lua_getfield(L, -1, "gmatch");[m
[31m-  lua_setfield(L, -2, "gfind");[m
[31m-#endif[m
[31m-  mt = lj_tab_new(L, 0, 1);[m
[31m-  /* NOBARRIER: basemt is a GC root. */[m
[31m-  g = G(L);[m
[31m-  setgcref(basemt_it(g, LJ_TSTR), obj2gco(mt));[m
[31m-  settabV(L, lj_tab_setstr(L, mt, mmname_str(g, MM_index)), tabV(L->top-1));[m
[31m-  mt->nomm = (uint8_t)(~(1u<<MM_index));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table.c[m
[1mdeleted file mode 100644[m
[1mindex f9a3693..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lib_table.c[m
[1m+++ /dev/null[m
[36m@@ -1,307 +0,0 @@[m
[31m-/*[m
[31m-** Table library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_table_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_table[m
[31m-[m
[31m-LJLIB_LUA(table_foreachi) /*[m
[31m-  function(t, f)[m
[31m-    CHECK_tab(t)[m
[31m-    CHECK_func(f)[m
[31m-    for i=1,#t do[m
[31m-      local r = f(i, t[i])[m
[31m-      if r ~= nil then return r end[m
[31m-    end[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_LUA(table_foreach) /*[m
[31m-  function(t, f)[m
[31m-    CHECK_tab(t)[m
[31m-    CHECK_func(f)[m
[31m-    for k, v in PAIRS(t) do[m
[31m-      local r = f(k, v)[m
[31m-      if r ~= nil then return r end[m
[31m-    end[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_LUA(table_getn) /*[m
[31m-  function(t)[m
[31m-    CHECK_tab(t)[m
[31m-    return #t[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_CF(table_maxn)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  TValue *array = tvref(t->array);[m
[31m-  Node *node;[m
[31m-  lua_Number m = 0;[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = (ptrdiff_t)t->asize - 1; i >= 0; i--)[m
[31m-    if (!tvisnil(&array[i])) {[m
[31m-      m = (lua_Number)(int32_t)i;[m
[31m-      break;[m
[31m-    }[m
[31m-  node = noderef(t->node);[m
[31m-  for (i = (ptrdiff_t)t->hmask; i >= 0; i--)[m
[31m-    if (!tvisnil(&node[i].val) && tvisnumber(&node[i].key)) {[m
[31m-      lua_Number n = numberVnum(&node[i].key);[m
[31m-      if (n > m) m = n;[m
[31m-    }[m
[31m-  setnumV(L->top-1, m);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(table_insert)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  int32_t n, i = (int32_t)lj_tab_len(t) + 1;[m
[31m-  int nargs = (int)((char *)L->top - (char *)L->base);[m
[31m-  if (nargs != 2*sizeof(TValue)) {[m
[31m-    if (nargs != 3*sizeof(TValue))[m
[31m-      lj_err_caller(L, LJ_ERR_TABINS);[m
[31m-    /* NOBARRIER: This just moves existing elements around. */[m
[31m-    for (n = lj_lib_checkint(L, 2); i > n; i--) {[m
[31m-      /* The set may invalidate the get pointer, so need to do it first! */[m
[31m-      TValue *dst = lj_tab_setint(L, t, i);[m
[31m-      cTValue *src = lj_tab_getint(t, i-1);[m
[31m-      if (src) {[m
[31m-	copyTV(L, dst, src);[m
[31m-      } else {[m
[31m-	setnilV(dst);[m
[31m-      }[m
[31m-    }[m
[31m-    i = n;[m
[31m-  }[m
[31m-  {[m
[31m-    TValue *dst = lj_tab_setint(L, t, i);[m
[31m-    copyTV(L, dst, L->top-1);  /* Set new value. */[m
[31m-    lj_gc_barriert(L, t, dst);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_LUA(table_remove) /*[m
[31m-  function(t, pos)[m
[31m-    CHECK_tab(t)[m
[31m-    local len = #t[m
[31m-    if pos == nil then[m
[31m-      if len ~= 0 then[m
[31m-	local old = t[len][m
[31m-	t[len] = nil[m
[31m-	return old[m
[31m-      end[m
[31m-    else[m
[31m-      CHECK_int(pos)[m
[31m-      if pos >= 1 and pos <= len then[m
[31m-	local old = t[pos][m
[31m-	for i=pos+1,len do[m
[31m-	  t[i-1] = t[i][m
[31m-	end[m
[31m-	t[len] = nil[m
[31m-	return old[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_CF(table_concat)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  GCstr *sep = lj_lib_optstr(L, 2);[m
[31m-  int32_t i = lj_lib_optint(L, 3, 1);[m
[31m-  int32_t e = (L->base+3 < L->top && !tvisnil(L->base+3)) ?[m
[31m-	      lj_lib_checkint(L, 4) : (int32_t)lj_tab_len(t);[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  SBuf *sbx = lj_buf_puttab(sb, t, sep, i, e);[m
[31m-  if (LJ_UNLIKELY(!sbx)) {  /* Error: bad element type. */[m
[31m-    int32_t idx = (int32_t)(intptr_t)sbufP(sb);[m
[31m-    cTValue *o = lj_tab_getint(t, idx);[m
[31m-    lj_err_callerv(L, LJ_ERR_TABCAT,[m
[31m-		   lj_obj_itypename[o ? itypemap(o) : ~LJ_TNIL], idx);[m
[31m-  }[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sbx));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void set2(lua_State *L, int i, int j)[m
[31m-{[m
[31m-  lua_rawseti(L, 1, i);[m
[31m-  lua_rawseti(L, 1, j);[m
[31m-}[m
[31m-[m
[31m-static int sort_comp(lua_State *L, int a, int b)[m
[31m-{[m
[31m-  if (!lua_isnil(L, 2)) {  /* function? */[m
[31m-    int res;[m
[31m-    lua_pushvalue(L, 2);[m
[31m-    lua_pushvalue(L, a-1);  /* -1 to compensate function */[m
[31m-    lua_pushvalue(L, b-2);  /* -2 to compensate function and `a' */[m
[31m-    lua_call(L, 2, 1);[m
[31m-    res = lua_toboolean(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-    return res;[m
[31m-  } else {  /* a < b? */[m
[31m-    return lua_lessthan(L, a, b);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void auxsort(lua_State *L, int l, int u)[m
[31m-{[m
[31m-  while (l < u) {  /* for tail recursion */[m
[31m-    int i, j;[m
[31m-    /* sort elements a[l], a[(l+u)/2] and a[u] */[m
[31m-    lua_rawgeti(L, 1, l);[m
[31m-    lua_rawgeti(L, 1, u);[m
[31m-    if (sort_comp(L, -1, -2))  /* a[u] < a[l]? */[m
[31m-      set2(L, l, u);  /* swap a[l] - a[u] */[m
[31m-    else[m
[31m-      lua_pop(L, 2);[m
[31m-    if (u-l == 1) break;  /* only 2 elements */[m
[31m-    i = (l+u)/2;[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-    lua_rawgeti(L, 1, l);[m
[31m-    if (sort_comp(L, -2, -1)) {  /* a[i]<a[l]? */[m
[31m-      set2(L, i, l);[m
[31m-    } else {[m
[31m-      lua_pop(L, 1);  /* remove a[l] */[m
[31m-      lua_rawgeti(L, 1, u);[m
[31m-      if (sort_comp(L, -1, -2))  /* a[u]<a[i]? */[m
[31m-	set2(L, i, u);[m
[31m-      else[m
[31m-	lua_pop(L, 2);[m
[31m-    }[m
[31m-    if (u-l == 2) break;  /* only 3 elements */[m
[31m-    lua_rawgeti(L, 1, i);  /* Pivot */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_rawgeti(L, 1, u-1);[m
[31m-    set2(L, i, u-1);[m
[31m-    /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */[m
[31m-    i = l; j = u-1;[m
[31m-    for (;;) {  /* invariant: a[l..i] <= P <= a[j..u] */[m
[31m-      /* repeat ++i until a[i] >= P */[m
[31m-      while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {[m
[31m-	if (i>=u) lj_err_caller(L, LJ_ERR_TABSORT);[m
[31m-	lua_pop(L, 1);  /* remove a[i] */[m
[31m-      }[m
[31m-      /* repeat --j until a[j] <= P */[m
[31m-      while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {[m
[31m-	if (j<=l) lj_err_caller(L, LJ_ERR_TABSORT);[m
[31m-	lua_pop(L, 1);  /* remove a[j] */[m
[31m-      }[m
[31m-      if (j<i) {[m
[31m-	lua_pop(L, 3);  /* pop pivot, a[i], a[j] */[m
[31m-	break;[m
[31m-      }[m
[31m-      set2(L, i, j);[m
[31m-    }[m
[31m-    lua_rawgeti(L, 1, u-1);[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-    set2(L, u-1, i);  /* swap pivot (a[u-1]) with a[i] */[m
[31m-    /* a[l..i-1] <= a[i] == P <= a[i+1..u] */[m
[31m-    /* adjust so that smaller half is in [j..i] and larger one in [l..u] */[m
[31m-    if (i-l < u-i) {[m
[31m-      j=l; i=i-1; l=i+2;[m
[31m-    } else {[m
[31m-      j=i+1; i=u; u=j-2;[m
[31m-    }[m
[31m-    auxsort(L, j, i);  /* call recursively the smaller one */[m
[31m-  }  /* repeat the routine for the larger one */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(table_sort)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  int32_t n = (int32_t)lj_tab_len(t);[m
[31m-  lua_settop(L, 2);[m
[31m-  if (!tvisnil(L->base+1))[m
[31m-    lj_lib_checkfunc(L, 2);[m
[31m-  auxsort(L, 1, n);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#if LJ_52[m
[31m-LJLIB_PUSH("n")[m
[31m-LJLIB_CF(table_pack)[m
[31m-{[m
[31m-  TValue *array, *base = L->base;[m
[31m-  MSize i, n = (uint32_t)(L->top - base);[m
[31m-  GCtab *t = lj_tab_new(L, n ? n+1 : 0, 1);[m
[31m-  /* NOBARRIER: The table is new (marked white). */[m
[31m-  setintV(lj_tab_setstr(L, t, strV(lj_lib_upvalue(L, 1))), (int32_t)n);[m
[31m-  for (array = tvref(t->array) + 1, i = 0; i < n; i++)[m
[31m-    copyTV(L, &array[i], &base[i]);[m
[31m-  settabV(L, base, t);[m
[31m-  L->top = base+1;[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_NOREG LJLIB_CF(table_new)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int32_t a = lj_lib_checkint(L, 1);[m
[31m-  int32_t h = lj_lib_checkint(L, 2);[m
[31m-  lua_createtable(L, a, h);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_NOREG LJLIB_CF(table_clear)	LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_tab_clear(lj_lib_checktab(L, 1));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int luaopen_table_new(lua_State *L)[m
[31m-{[m
[31m-  return lj_lib_postreg(L, lj_cf_table_new, FF_table_new, "new");[m
[31m-}[m
[31m-[m
[31m-static int luaopen_table_clear(lua_State *L)[m
[31m-{[m
[31m-  return lj_lib_postreg(L, lj_cf_table_clear, FF_table_clear, "clear");[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_table(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, LUA_TABLIBNAME, table);[m
[31m-#if LJ_52[m
[31m-  lua_getglobal(L, "unpack");[m
[31m-  lua_setfield(L, -2, "unpack");[m
[31m-#endif[m
[31m-  lj_lib_prereg(L, LUA_TABLIBNAME ".new", luaopen_table_new, tabV(L->top-1));[m
[31m-  lj_lib_prereg(L, LUA_TABLIBNAME ".clear", luaopen_table_clear, tabV(L->top-1));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj.supp b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj.supp[m
[1mdeleted file mode 100644[m
[1mindex acb9e78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj.supp[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_fastcmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_fastcmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_fastcmp[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.c[m
[1mdeleted file mode 100644[m
[1mindex 5d0834e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.c[m
[1m+++ /dev/null[m
[36m@@ -1,1483 +0,0 @@[m
[31m-/*[m
[31m-** Bundled memory allocator.[m
[31m-**[m
[31m-** Beware: this is a HEAVILY CUSTOMIZED version of dlmalloc.[m
[31m-** The original bears the following remark:[m
[31m-**[m
[31m-**   This is a version (aka dlmalloc) of malloc/free/realloc written by[m
[31m-**   Doug Lea and released to the public domain, as explained at[m
[31m-**   http://creativecommons.org/licenses/publicdomain.[m
[31m-**[m
[31m-**   * Version pre-2.8.4 Wed Mar 29 19:46:29 2006    (dl at gee)[m
[31m-**[m
[31m-** No additional copyright is claimed over the customizations.[m
[31m-** Please do NOT bother the original author about this version here![m
[31m-**[m
[31m-** If you want to use dlmalloc in another project, you should get[m
[31m-** the original from: ftp://gee.cs.oswego.edu/pub/misc/[m
[31m-** For thread-safe derivatives, take a look at:[m
[31m-** - ptmalloc: http://www.malloc.de/[m
[31m-** - nedmalloc: http://www.nedprod.com/programs/portable/nedmalloc/[m
[31m-*/[m
[31m-[m
[31m-#define lj_alloc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-/* To get the mremap prototype. Must be defined before any system includes. */[m
[31m-#if defined(__linux__) && !defined(_GNU_SOURCE)[m
[31m-#define _GNU_SOURCE[m
[31m-#endif[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-#include "lj_alloc.h"[m
[31m-[m
[31m-#ifndef LUAJIT_USE_SYSMALLOC[m
[31m-[m
[31m-#define MAX_SIZE_T		(~(size_t)0)[m
[31m-#define MALLOC_ALIGNMENT	((size_t)8U)[m
[31m-[m
[31m-#define DEFAULT_GRANULARITY	((size_t)128U * (size_t)1024U)[m
[31m-#define DEFAULT_TRIM_THRESHOLD	((size_t)2U * (size_t)1024U * (size_t)1024U)[m
[31m-#define DEFAULT_MMAP_THRESHOLD	((size_t)128U * (size_t)1024U)[m
[31m-#define MAX_RELEASE_CHECK_RATE	255[m
[31m-[m
[31m-/* ------------------- size_t and alignment properties -------------------- */[m
[31m-[m
[31m-/* The byte and bit size of a size_t */[m
[31m-#define SIZE_T_SIZE		(sizeof(size_t))[m
[31m-#define SIZE_T_BITSIZE		(sizeof(size_t) << 3)[m
[31m-[m
[31m-/* Some constants coerced to size_t */[m
[31m-/* Annoying but necessary to avoid errors on some platforms */[m
[31m-#define SIZE_T_ZERO		((size_t)0)[m
[31m-#define SIZE_T_ONE		((size_t)1)[m
[31m-#define SIZE_T_TWO		((size_t)2)[m
[31m-#define TWO_SIZE_T_SIZES	(SIZE_T_SIZE<<1)[m
[31m-#define FOUR_SIZE_T_SIZES	(SIZE_T_SIZE<<2)[m
[31m-#define SIX_SIZE_T_SIZES	(FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)[m
[31m-[m
[31m-/* The bit mask value corresponding to MALLOC_ALIGNMENT */[m
[31m-#define CHUNK_ALIGN_MASK	(MALLOC_ALIGNMENT - SIZE_T_ONE)[m
[31m-[m
[31m-/* the number of bytes to offset an address to align it */[m
[31m-#define align_offset(A)\[m
[31m- ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\[m
[31m-  ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))[m
[31m-[m
[31m-/* -------------------------- MMAP support ------------------------------- */[m
[31m-[m
[31m-#define MFAIL			((void *)(MAX_SIZE_T))[m
[31m-#define CMFAIL			((char *)(MFAIL)) /* defined for convenience */[m
[31m-[m
[31m-#define IS_DIRECT_BIT		(SIZE_T_ONE)[m
[31m-[m
[31m-[m
[31m-/* Determine system-specific block allocation method. */[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#define LJ_ALLOC_VIRTUALALLOC	1[m
[31m-[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define LJ_ALLOC_NTAVM		1[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#include <errno.h>[m
[31m-/* If this include fails, then rebuild with: -DLUAJIT_USE_SYSMALLOC */[m
[31m-#include <sys/mman.h>[m
[31m-[m
[31m-#define LJ_ALLOC_MMAP		1[m
[31m-[m
[31m-#if LJ_64[m
[31m-[m
[31m-#define LJ_ALLOC_MMAP_PROBE	1[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define LJ_ALLOC_MBITS		47	/* 128 TB in LJ_GC64 mode. */[m
[31m-#elif LJ_TARGET_X64 && LJ_HASJIT[m
[31m-/* Due to limitations in the x64 compiler backend. */[m
[31m-#define LJ_ALLOC_MBITS		31	/* 2 GB on x64 with !LJ_GC64. */[m
[31m-#else[m
[31m-#define LJ_ALLOC_MBITS		32	/* 4 GB on other archs with !LJ_GC64. */[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_64 && !LJ_GC64 && defined(MAP_32BIT)[m
[31m-#define LJ_ALLOC_MMAP32		1[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_LINUX[m
[31m-#define LJ_ALLOC_MREMAP		1[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if LJ_ALLOC_VIRTUALALLOC[m
[31m-[m
[31m-#if LJ_ALLOC_NTAVM[m
[31m-/* Undocumented, but hey, that's what we all love so much about Windows. */[m
[31m-typedef long (*PNTAVM)(HANDLE handle, void **addr, ULONG zbits,[m
[31m-		       size_t *size, ULONG alloctype, ULONG prot);[m
[31m-static PNTAVM ntavm;[m
[31m-[m
[31m-/* Number of top bits of the lower 32 bits of an address that must be zero.[m
[31m-** Apparently 0 gives us full 64 bit addresses and 1 gives us the lower 2GB.[m
[31m-*/[m
[31m-#define NTAVM_ZEROBITS		1[m
[31m-[m
[31m-static void init_mmap(void)[m
[31m-{[m
[31m-  ntavm = (PNTAVM)GetProcAddress(GetModuleHandleA("ntdll.dll"),[m
[31m-				 "NtAllocateVirtualMemory");[m
[31m-}[m
[31m-#define INIT_MMAP()	init_mmap()[m
[31m-[m
[31m-/* Win64 32 bit MMAP via NtAllocateVirtualMemory. */[m
[31m-static void *CALL_MMAP(size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  void *ptr = NULL;[m
[31m-  long st = ntavm(INVALID_HANDLE_VALUE, &ptr, NTAVM_ZEROBITS, &size,[m
[31m-		  MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);[m
[31m-  SetLastError(olderr);[m
[31m-  return st == 0 ? ptr : MFAIL;[m
[31m-}[m
[31m-[m
[31m-/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */[m
[31m-static void *DIRECT_MMAP(size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  void *ptr = NULL;[m
[31m-  long st = ntavm(INVALID_HANDLE_VALUE, &ptr, NTAVM_ZEROBITS, &size,[m
[31m-		  MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE);[m
[31m-  SetLastError(olderr);[m
[31m-  return st == 0 ? ptr : MFAIL;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* Win32 MMAP via VirtualAlloc */[m
[31m-static void *CALL_MMAP(size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);[m
[31m-  SetLastError(olderr);[m
[31m-  return ptr ? ptr : MFAIL;[m
[31m-}[m
[31m-[m
[31m-/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */[m
[31m-static void *DIRECT_MMAP(size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,[m
[31m-			   PAGE_READWRITE);[m
[31m-  SetLastError(olderr);[m
[31m-  return ptr ? ptr : MFAIL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* This function supports releasing coalesed segments */[m
[31m-static int CALL_MUNMAP(void *ptr, size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  MEMORY_BASIC_INFORMATION minfo;[m
[31m-  char *cptr = (char *)ptr;[m
[31m-  while (size) {[m
[31m-    if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)[m
[31m-      return -1;[m
[31m-    if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||[m
[31m-	minfo.State != MEM_COMMIT || minfo.RegionSize > size)[m
[31m-      return -1;[m
[31m-    if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)[m
[31m-      return -1;[m
[31m-    cptr += minfo.RegionSize;[m
[31m-    size -= minfo.RegionSize;[m
[31m-  }[m
[31m-  SetLastError(olderr);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#elif LJ_ALLOC_MMAP[m
[31m-[m
[31m-#define MMAP_PROT		(PROT_READ|PROT_WRITE)[m
[31m-#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)[m
[31m-#define MAP_ANONYMOUS		MAP_ANON[m
[31m-#endif[m
[31m-#define MMAP_FLAGS		(MAP_PRIVATE|MAP_ANONYMOUS)[m
[31m-[m
[31m-#if LJ_ALLOC_MMAP_PROBE[m
[31m-[m
[31m-#define LJ_ALLOC_MMAP_PROBE_MAX		30[m
[31m-#define LJ_ALLOC_MMAP_PROBE_LINEAR	5[m
[31m-[m
[31m-#define LJ_ALLOC_MMAP_PROBE_LOWER	((uintptr_t)0x4000)[m
[31m-[m
[31m-/* No point in a giant ifdef mess. Just try to open /dev/urandom.[m
[31m-** It doesn't really matter if this fails, since we get some ASLR bits from[m
[31m-** every unsuitable allocation, too. And we prefer linear allocation, anyway.[m
[31m-*/[m
[31m-#include <fcntl.h>[m
[31m-#include <unistd.h>[m
[31m-[m
[31m-static uintptr_t mmap_probe_seed(void)[m
[31m-{[m
[31m-  uintptr_t val;[m
[31m-  int fd = open("/dev/urandom", O_RDONLY);[m
[31m-  if (fd != -1) {[m
[31m-    int ok = ((size_t)read(fd, &val, sizeof(val)) == sizeof(val));[m
[31m-    (void)close(fd);[m
[31m-    if (ok) return val;[m
[31m-  }[m
[31m-  return 1;  /* Punt. */[m
[31m-}[m
[31m-[m
[31m-static void *mmap_probe(size_t size)[m
[31m-{[m
[31m-  /* Hint for next allocation. Doesn't need to be thread-safe. */[m
[31m-  static uintptr_t hint_addr = 0;[m
[31m-  static uintptr_t hint_prng = 0;[m
[31m-  int olderr = errno;[m
[31m-  int retry;[m
[31m-  for (retry = 0; retry < LJ_ALLOC_MMAP_PROBE_MAX; retry++) {[m
[31m-    void *p = mmap((void *)hint_addr, size, MMAP_PROT, MMAP_FLAGS, -1, 0);[m
[31m-    uintptr_t addr = (uintptr_t)p;[m
[31m-    if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER) {[m
[31m-      /* We got a suitable address. Bump the hint address. */[m
[31m-      hint_addr = addr + size;[m
[31m-      errno = olderr;[m
[31m-      return p;[m
[31m-    }[m
[31m-    if (p != MFAIL) {[m
[31m-      munmap(p, size);[m
[31m-    } else if (errno == ENOMEM) {[m
[31m-      return MFAIL;[m
[31m-    }[m
[31m-    if (hint_addr) {[m
[31m-      /* First, try linear probing. */[m
[31m-      if (retry < LJ_ALLOC_MMAP_PROBE_LINEAR) {[m
[31m-	hint_addr += 0x1000000;[m
[31m-	if (((hint_addr + size) >> LJ_ALLOC_MBITS) != 0)[m
[31m-	  hint_addr = 0;[m
[31m-	continue;[m
[31m-      } else if (retry == LJ_ALLOC_MMAP_PROBE_LINEAR) {[m
[31m-	/* Next, try a no-hint probe to get back an ASLR address. */[m
[31m-	hint_addr = 0;[m
[31m-	continue;[m
[31m-      }[m
[31m-    }[m
[31m-    /* Finally, try pseudo-random probing. */[m
[31m-    if (LJ_UNLIKELY(hint_prng == 0)) {[m
[31m-      hint_prng = mmap_probe_seed();[m
[31m-    }[m
[31m-    /* The unsuitable address we got has some ASLR PRNG bits. */[m
[31m-    hint_addr ^= addr & ~((uintptr_t)(LJ_PAGESIZE-1));[m
[31m-    do {  /* The PRNG itself is very weak, but see above. */[m
[31m-      hint_prng = hint_prng * 1103515245 + 12345;[m
[31m-      hint_addr ^= hint_prng * (uintptr_t)LJ_PAGESIZE;[m
[31m-      hint_addr &= (((uintptr_t)1 << LJ_ALLOC_MBITS)-1);[m
[31m-    } while (hint_addr < LJ_ALLOC_MMAP_PROBE_LOWER);[m
[31m-  }[m
[31m-  errno = olderr;[m
[31m-  return MFAIL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_ALLOC_MMAP32[m
[31m-[m
[31m-#if defined(__sun__)[m
[31m-#define LJ_ALLOC_MMAP32_START	((uintptr_t)0x1000)[m
[31m-#else[m
[31m-#define LJ_ALLOC_MMAP32_START	((uintptr_t)0)[m
[31m-#endif[m
[31m-[m
[31m-static void *mmap_map32(size_t size)[m
[31m-{[m
[31m-#if LJ_ALLOC_MMAP_PROBE[m
[31m-  static int fallback = 0;[m
[31m-  if (fallback)[m
[31m-    return mmap_probe(size);[m
[31m-#endif[m
[31m-  {[m
[31m-    int olderr = errno;[m
[31m-    void *ptr = mmap((void *)LJ_ALLOC_MMAP32_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);[m
[31m-    errno = olderr;[m
[31m-    /* This only allows 1GB on Linux. So fallback to probing to get 2GB. */[m
[31m-#if LJ_ALLOC_MMAP_PROBE[m
[31m-    if (ptr == MFAIL) {[m
[31m-      fallback = 1;[m
[31m-      return mmap_probe(size);[m
[31m-    }[m
[31m-#endif[m
[31m-    return ptr;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_ALLOC_MMAP32[m
[31m-#define CALL_MMAP(size)		mmap_map32(size)[m
[31m-#elif LJ_ALLOC_MMAP_PROBE[m
[31m-#define CALL_MMAP(size)		mmap_probe(size)[m
[31m-#else[m
[31m-static void *CALL_MMAP(size_t size)[m
[31m-{[m
[31m-  int olderr = errno;[m
[31m-  void *ptr = mmap(NULL, size, MMAP_PROT, MMAP_FLAGS, -1, 0);[m
[31m-  errno = olderr;[m
[31m-  return ptr;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4[m
[31m-[m
[31m-#include <sys/resource.h>[m
[31m-[m
[31m-static void init_mmap(void)[m
[31m-{[m
[31m-  struct rlimit rlim;[m
[31m-  rlim.rlim_cur = rlim.rlim_max = 0x10000;[m
[31m-  setrlimit(RLIMIT_DATA, &rlim);  /* Ignore result. May fail later. */[m
[31m-}[m
[31m-#define INIT_MMAP()	init_mmap()[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-static int CALL_MUNMAP(void *ptr, size_t size)[m
[31m-{[m
[31m-  int olderr = errno;[m
[31m-  int ret = munmap(ptr, size);[m
[31m-  errno = olderr;[m
[31m-  return ret;[m
[31m-}[m
[31m-[m
[31m-#if LJ_ALLOC_MREMAP[m
[31m-/* Need to define _GNU_SOURCE to get the mremap prototype. */[m
[31m-static void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz, int flags)[m
[31m-{[m
[31m-  int olderr = errno;[m
[31m-  ptr = mremap(ptr, osz, nsz, flags);[m
[31m-  errno = olderr;[m
[31m-  return ptr;[m
[31m-}[m
[31m-[m
[31m-#define CALL_MREMAP(addr, osz, nsz, mv) CALL_MREMAP_((addr), (osz), (nsz), (mv))[m
[31m-#define CALL_MREMAP_NOMOVE	0[m
[31m-#define CALL_MREMAP_MAYMOVE	1[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define CALL_MREMAP_MV		CALL_MREMAP_NOMOVE[m
[31m-#else[m
[31m-#define CALL_MREMAP_MV		CALL_MREMAP_MAYMOVE[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef INIT_MMAP[m
[31m-#define INIT_MMAP()		((void)0)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef DIRECT_MMAP[m
[31m-#define DIRECT_MMAP(s)		CALL_MMAP(s)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CALL_MREMAP[m
[31m-#define CALL_MREMAP(addr, osz, nsz, mv) ((void)osz, MFAIL)[m
[31m-#endif[m
[31m-[m
[31m-/* -----------------------  Chunk representations ------------------------ */[m
[31m-[m
[31m-struct malloc_chunk {[m
[31m-  size_t               prev_foot;  /* Size of previous chunk (if free).  */[m
[31m-  size_t               head;       /* Size and inuse bits. */[m
[31m-  struct malloc_chunk *fd;         /* double links -- used only if free. */[m
[31m-  struct malloc_chunk *bk;[m
[31m-};[m
[31m-[m
[31m-typedef struct malloc_chunk  mchunk;[m
[31m-typedef struct malloc_chunk *mchunkptr;[m
[31m-typedef struct malloc_chunk *sbinptr;  /* The type of bins of chunks */[m
[31m-typedef size_t bindex_t;               /* Described below */[m
[31m-typedef unsigned int binmap_t;         /* Described below */[m
[31m-typedef unsigned int flag_t;           /* The type of various bit flag sets */[m
[31m-[m
[31m-/* ------------------- Chunks sizes and alignments ----------------------- */[m
[31m-[m
[31m-#define MCHUNK_SIZE		(sizeof(mchunk))[m
[31m-[m
[31m-#define CHUNK_OVERHEAD		(SIZE_T_SIZE)[m
[31m-[m
[31m-/* Direct chunks need a second word of overhead ... */[m
[31m-#define DIRECT_CHUNK_OVERHEAD	(TWO_SIZE_T_SIZES)[m
[31m-/* ... and additional padding for fake next-chunk at foot */[m
[31m-#define DIRECT_FOOT_PAD		(FOUR_SIZE_T_SIZES)[m
[31m-[m
[31m-/* The smallest size we can malloc is an aligned minimal chunk */[m
[31m-#define MIN_CHUNK_SIZE\[m
[31m-  ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)[m
[31m-[m
[31m-/* conversion from malloc headers to user pointers, and back */[m
[31m-#define chunk2mem(p)		((void *)((char *)(p) + TWO_SIZE_T_SIZES))[m
[31m-#define mem2chunk(mem)		((mchunkptr)((char *)(mem) - TWO_SIZE_T_SIZES))[m
[31m-/* chunk associated with aligned address A */[m
[31m-#define align_as_chunk(A)	(mchunkptr)((A) + align_offset(chunk2mem(A)))[m
[31m-[m
[31m-/* Bounds on request (not chunk) sizes. */[m
[31m-#define MAX_REQUEST		((~MIN_CHUNK_SIZE+1) << 2)[m
[31m-#define MIN_REQUEST		(MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)[m
[31m-[m
[31m-/* pad request bytes into a usable size */[m
[31m-#define pad_request(req) \[m
[31m-   (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)[m
[31m-[m
[31m-/* pad request, checking for minimum (but not maximum) */[m
[31m-#define request2size(req) \[m
[31m-  (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))[m
[31m-[m
[31m-/* ------------------ Operations on head and foot fields ----------------- */[m
[31m-[m
[31m-#define PINUSE_BIT		(SIZE_T_ONE)[m
[31m-#define CINUSE_BIT		(SIZE_T_TWO)[m
[31m-#define INUSE_BITS		(PINUSE_BIT|CINUSE_BIT)[m
[31m-[m
[31m-/* Head value for fenceposts */[m
[31m-#define FENCEPOST_HEAD		(INUSE_BITS|SIZE_T_SIZE)[m
[31m-[m
[31m-/* extraction of fields from head words */[m
[31m-#define cinuse(p)		((p)->head & CINUSE_BIT)[m
[31m-#define pinuse(p)		((p)->head & PINUSE_BIT)[m
[31m-#define chunksize(p)		((p)->head & ~(INUSE_BITS))[m
[31m-[m
[31m-#define clear_pinuse(p)		((p)->head &= ~PINUSE_BIT)[m
[31m-#define clear_cinuse(p)		((p)->head &= ~CINUSE_BIT)[m
[31m-[m
[31m-/* Treat space at ptr +/- offset as a chunk */[m
[31m-#define chunk_plus_offset(p, s)		((mchunkptr)(((char *)(p)) + (s)))[m
[31m-#define chunk_minus_offset(p, s)	((mchunkptr)(((char *)(p)) - (s)))[m
[31m-[m
[31m-/* Ptr to next or previous physical malloc_chunk. */[m
[31m-#define next_chunk(p)	((mchunkptr)(((char *)(p)) + ((p)->head & ~INUSE_BITS)))[m
[31m-#define prev_chunk(p)	((mchunkptr)(((char *)(p)) - ((p)->prev_foot) ))[m
[31m-[m
[31m-/* extract next chunk's pinuse bit */[m
[31m-#define next_pinuse(p)	((next_chunk(p)->head) & PINUSE_BIT)[m
[31m-[m
[31m-/* Get/set size at footer */[m
[31m-#define get_foot(p, s)	(((mchunkptr)((char *)(p) + (s)))->prev_foot)[m
[31m-#define set_foot(p, s)	(((mchunkptr)((char *)(p) + (s)))->prev_foot = (s))[m
[31m-[m
[31m-/* Set size, pinuse bit, and foot */[m
[31m-#define set_size_and_pinuse_of_free_chunk(p, s)\[m
[31m-  ((p)->head = (s|PINUSE_BIT), set_foot(p, s))[m
[31m-[m
[31m-/* Set size, pinuse bit, foot, and clear next pinuse */[m
[31m-#define set_free_with_pinuse(p, s, n)\[m
[31m-  (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))[m
[31m-[m
[31m-#define is_direct(p)\[m
[31m-  (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_DIRECT_BIT))[m
[31m-[m
[31m-/* Get the internal overhead associated with chunk p */[m
[31m-#define overhead_for(p)\[m
[31m- (is_direct(p)? DIRECT_CHUNK_OVERHEAD : CHUNK_OVERHEAD)[m
[31m-[m
[31m-/* ---------------------- Overlaid data structures ----------------------- */[m
[31m-[m
[31m-struct malloc_tree_chunk {[m
[31m-  /* The first four fields must be compatible with malloc_chunk */[m
[31m-  size_t                    prev_foot;[m
[31m-  size_t                    head;[m
[31m-  struct malloc_tree_chunk *fd;[m
[31m-  struct malloc_tree_chunk *bk;[m
[31m-[m
[31m-  struct malloc_tree_chunk *child[2];[m
[31m-  struct malloc_tree_chunk *parent;[m
[31m-  bindex_t                  index;[m
[31m-};[m
[31m-[m
[31m-typedef struct malloc_tree_chunk  tchunk;[m
[31m-typedef struct malloc_tree_chunk *tchunkptr;[m
[31m-typedef struct malloc_tree_chunk *tbinptr; /* The type of bins of trees */[m
[31m-[m
[31m-/* A little helper macro for trees */[m
[31m-#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])[m
[31m-[m
[31m-/* ----------------------------- Segments -------------------------------- */[m
[31m-[m
[31m-struct malloc_segment {[m
[31m-  char        *base;             /* base address */[m
[31m-  size_t       size;             /* allocated size */[m
[31m-  struct malloc_segment *next;   /* ptr to next segment */[m
[31m-};[m
[31m-[m
[31m-typedef struct malloc_segment  msegment;[m
[31m-typedef struct malloc_segment *msegmentptr;[m
[31m-[m
[31m-/* ---------------------------- malloc_state ----------------------------- */[m
[31m-[m
[31m-/* Bin types, widths and sizes */[m
[31m-#define NSMALLBINS		(32U)[m
[31m-#define NTREEBINS		(32U)[m
[31m-#define SMALLBIN_SHIFT		(3U)[m
[31m-#define SMALLBIN_WIDTH		(SIZE_T_ONE << SMALLBIN_SHIFT)[m
[31m-#define TREEBIN_SHIFT		(8U)[m
[31m-#define MIN_LARGE_SIZE		(SIZE_T_ONE << TREEBIN_SHIFT)[m
[31m-#define MAX_SMALL_SIZE		(MIN_LARGE_SIZE - SIZE_T_ONE)[m
[31m-#define MAX_SMALL_REQUEST  (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)[m
[31m-[m
[31m-struct malloc_state {[m
[31m-  binmap_t   smallmap;[m
[31m-  binmap_t   treemap;[m
[31m-  size_t     dvsize;[m
[31m-  size_t     topsize;[m
[31m-  mchunkptr  dv;[m
[31m-  mchunkptr  top;[m
[31m-  size_t     trim_check;[m
[31m-  size_t     release_checks;[m
[31m-  mchunkptr  smallbins[(NSMALLBINS+1)*2];[m
[31m-  tbinptr    treebins[NTREEBINS];[m
[31m-  msegment   seg;[m
[31m-};[m
[31m-[m
[31m-typedef struct malloc_state *mstate;[m
[31m-[m
[31m-#define is_initialized(M)	((M)->top != 0)[m
[31m-[m
[31m-/* -------------------------- system alloc setup ------------------------- */[m
[31m-[m
[31m-/* page-align a size */[m
[31m-#define page_align(S)\[m
[31m- (((S) + (LJ_PAGESIZE - SIZE_T_ONE)) & ~(LJ_PAGESIZE - SIZE_T_ONE))[m
[31m-[m
[31m-/* granularity-align a size */[m
[31m-#define granularity_align(S)\[m
[31m-  (((S) + (DEFAULT_GRANULARITY - SIZE_T_ONE))\[m
[31m-   & ~(DEFAULT_GRANULARITY - SIZE_T_ONE))[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-#define mmap_align(S)	granularity_align(S)[m
[31m-#else[m
[31m-#define mmap_align(S)	page_align(S)[m
[31m-#endif[m
[31m-[m
[31m-/*  True if segment S holds address A */[m
[31m-#define segment_holds(S, A)\[m
[31m-  ((char *)(A) >= S->base && (char *)(A) < S->base + S->size)[m
[31m-[m
[31m-/* Return segment holding given address */[m
[31m-static msegmentptr segment_holding(mstate m, char *addr)[m
[31m-{[m
[31m-  msegmentptr sp = &m->seg;[m
[31m-  for (;;) {[m
[31m-    if (addr >= sp->base && addr < sp->base + sp->size)[m
[31m-      return sp;[m
[31m-    if ((sp = sp->next) == 0)[m
[31m-      return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return true if segment contains a segment link */[m
[31m-static int has_segment_link(mstate m, msegmentptr ss)[m
[31m-{[m
[31m-  msegmentptr sp = &m->seg;[m
[31m-  for (;;) {[m
[31m-    if ((char *)sp >= ss->base && (char *)sp < ss->base + ss->size)[m
[31m-      return 1;[m
[31m-    if ((sp = sp->next) == 0)[m
[31m-      return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-  TOP_FOOT_SIZE is padding at the end of a segment, including space[m
[31m-  that may be needed to place segment records and fenceposts when new[m
[31m-  noncontiguous segments are added.[m
[31m-*/[m
[31m-#define TOP_FOOT_SIZE\[m
[31m-  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)[m
[31m-[m
[31m-/* ---------------------------- Indexing Bins ---------------------------- */[m
[31m-[m
[31m-#define is_small(s)		(((s) >> SMALLBIN_SHIFT) < NSMALLBINS)[m
[31m-#define small_index(s)		((s)  >> SMALLBIN_SHIFT)[m
[31m-#define small_index2size(i)	((i)  << SMALLBIN_SHIFT)[m
[31m-#define MIN_SMALL_INDEX		(small_index(MIN_CHUNK_SIZE))[m
[31m-[m
[31m-/* addressing by index. See above about smallbin repositioning */[m
[31m-#define smallbin_at(M, i)	((sbinptr)((char *)&((M)->smallbins[(i)<<1])))[m
[31m-#define treebin_at(M,i)		(&((M)->treebins[i]))[m
[31m-[m
[31m-/* assign tree index for size S to variable I */[m
[31m-#define compute_tree_index(S, I)\[m
[31m-{\[m
[31m-  unsigned int X = (unsigned int)(S >> TREEBIN_SHIFT);\[m
[31m-  if (X == 0) {\[m
[31m-    I = 0;\[m
[31m-  } else if (X > 0xFFFF) {\[m
[31m-    I = NTREEBINS-1;\[m
[31m-  } else {\[m
[31m-    unsigned int K = lj_fls(X);\[m
[31m-    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-/* Bit representing maximum resolved size in a treebin at i */[m
[31m-#define bit_for_tree_index(i) \[m
[31m-   (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)[m
[31m-[m
[31m-/* Shift placing maximum resolved bit in a treebin at i as sign bit */[m
[31m-#define leftshift_for_tree_index(i) \[m
[31m-   ((i == NTREEBINS-1)? 0 : \[m
[31m-    ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))[m
[31m-[m
[31m-/* The size of the smallest chunk held in bin with index i */[m
[31m-#define minsize_for_tree_index(i) \[m
[31m-   ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  \[m
[31m-   (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))[m
[31m-[m
[31m-/* ------------------------ Operations on bin maps ----------------------- */[m
[31m-[m
[31m-/* bit corresponding to given index */[m
[31m-#define idx2bit(i)		((binmap_t)(1) << (i))[m
[31m-[m
[31m-/* Mark/Clear bits with given index */[m
[31m-#define mark_smallmap(M,i)	((M)->smallmap |=  idx2bit(i))[m
[31m-#define clear_smallmap(M,i)	((M)->smallmap &= ~idx2bit(i))[m
[31m-#define smallmap_is_marked(M,i)	((M)->smallmap &   idx2bit(i))[m
[31m-[m
[31m-#define mark_treemap(M,i)	((M)->treemap  |=  idx2bit(i))[m
[31m-#define clear_treemap(M,i)	((M)->treemap  &= ~idx2bit(i))[m
[31m-#define treemap_is_marked(M,i)	((M)->treemap  &   idx2bit(i))[m
[31m-[m
[31m-/* mask with all bits to left of least bit of x on */[m
[31m-#define left_bits(x)		((x<<1) | (~(x<<1)+1))[m
[31m-[m
[31m-/* Set cinuse bit and pinuse bit of next chunk */[m
[31m-#define set_inuse(M,p,s)\[m
[31m-  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\[m
[31m-  ((mchunkptr)(((char *)(p)) + (s)))->head |= PINUSE_BIT)[m
[31m-[m
[31m-/* Set cinuse and pinuse of this chunk and pinuse of next chunk */[m
[31m-#define set_inuse_and_pinuse(M,p,s)\[m
[31m-  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\[m
[31m-  ((mchunkptr)(((char *)(p)) + (s)))->head |= PINUSE_BIT)[m
[31m-[m
[31m-/* Set size, cinuse and pinuse bit of this chunk */[m
[31m-#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\[m
[31m-  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))[m
[31m-[m
[31m-/* ----------------------- Operations on smallbins ----------------------- */[m
[31m-[m
[31m-/* Link a free chunk into a smallbin  */[m
[31m-#define insert_small_chunk(M, P, S) {\[m
[31m-  bindex_t I = small_index(S);\[m
[31m-  mchunkptr B = smallbin_at(M, I);\[m
[31m-  mchunkptr F = B;\[m
[31m-  if (!smallmap_is_marked(M, I))\[m
[31m-    mark_smallmap(M, I);\[m
[31m-  else\[m
[31m-    F = B->fd;\[m
[31m-  B->fd = P;\[m
[31m-  F->bk = P;\[m
[31m-  P->fd = F;\[m
[31m-  P->bk = B;\[m
[31m-}[m
[31m-[m
[31m-/* Unlink a chunk from a smallbin  */[m
[31m-#define unlink_small_chunk(M, P, S) {\[m
[31m-  mchunkptr F = P->fd;\[m
[31m-  mchunkptr B = P->bk;\[m
[31m-  bindex_t I = small_index(S);\[m
[31m-  if (F == B) {\[m
[31m-    clear_smallmap(M, I);\[m
[31m-  } else {\[m
[31m-    F->bk = B;\[m
[31m-    B->fd = F;\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-/* Unlink the first chunk from a smallbin */[m
[31m-#define unlink_first_small_chunk(M, B, P, I) {\[m
[31m-  mchunkptr F = P->fd;\[m
[31m-  if (B == F) {\[m
[31m-    clear_smallmap(M, I);\[m
[31m-  } else {\[m
[31m-    B->fd = F;\[m
[31m-    F->bk = B;\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-/* Replace dv node, binning the old one */[m
[31m-/* Used only when dvsize known to be small */[m
[31m-#define replace_dv(M, P, S) {\[m
[31m-  size_t DVS = M->dvsize;\[m
[31m-  if (DVS != 0) {\[m
[31m-    mchunkptr DV = M->dv;\[m
[31m-    insert_small_chunk(M, DV, DVS);\[m
[31m-  }\[m
[31m-  M->dvsize = S;\[m
[31m-  M->dv = P;\[m
[31m-}[m
[31m-[m
[31m-/* ------------------------- Operations on trees ------------------------- */[m
[31m-[m
[31m-/* Insert chunk into tree */[m
[31m-#define insert_large_chunk(M, X, S) {\[m
[31m-  tbinptr *H;\[m
[31m-  bindex_t I;\[m
[31m-  compute_tree_index(S, I);\[m
[31m-  H = treebin_at(M, I);\[m
[31m-  X->index = I;\[m
[31m-  X->child[0] = X->child[1] = 0;\[m
[31m-  if (!treemap_is_marked(M, I)) {\[m
[31m-    mark_treemap(M, I);\[m
[31m-    *H = X;\[m
[31m-    X->parent = (tchunkptr)H;\[m
[31m-    X->fd = X->bk = X;\[m
[31m-  } else {\[m
[31m-    tchunkptr T = *H;\[m
[31m-    size_t K = S << leftshift_for_tree_index(I);\[m
[31m-    for (;;) {\[m
[31m-      if (chunksize(T) != S) {\[m
[31m-	tchunkptr *C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\[m
[31m-	K <<= 1;\[m
[31m-	if (*C != 0) {\[m
[31m-	  T = *C;\[m
[31m-	} else {\[m
[31m-	  *C = X;\[m
[31m-	  X->parent = T;\[m
[31m-	  X->fd = X->bk = X;\[m
[31m-	  break;\[m
[31m-	}\[m
[31m-      } else {\[m
[31m-	tchunkptr F = T->fd;\[m
[31m-	T->fd = F->bk = X;\[m
[31m-	X->fd = F;\[m
[31m-	X->bk = T;\[m
[31m-	X->parent = 0;\[m
[31m-	break;\[m
[31m-      }\[m
[31m-    }\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-#define unlink_large_chunk(M, X) {\[m
[31m-  tchunkptr XP = X->parent;\[m
[31m-  tchunkptr R;\[m
[31m-  if (X->bk != X) {\[m
[31m-    tchunkptr F = X->fd;\[m
[31m-    R = X->bk;\[m
[31m-    F->bk = R;\[m
[31m-    R->fd = F;\[m
[31m-  } else {\[m
[31m-    tchunkptr *RP;\[m
[31m-    if (((R = *(RP = &(X->child[1]))) != 0) ||\[m
[31m-	((R = *(RP = &(X->child[0]))) != 0)) {\[m
[31m-      tchunkptr *CP;\[m
[31m-      while ((*(CP = &(R->child[1])) != 0) ||\[m
[31m-	     (*(CP = &(R->child[0])) != 0)) {\[m
[31m-	R = *(RP = CP);\[m
[31m-      }\[m
[31m-      *RP = 0;\[m
[31m-    }\[m
[31m-  }\[m
[31m-  if (XP != 0) {\[m
[31m-    tbinptr *H = treebin_at(M, X->index);\[m
[31m-    if (X == *H) {\[m
[31m-      if ((*H = R) == 0) \[m
[31m-	clear_treemap(M, X->index);\[m
[31m-    } else {\[m
[31m-      if (XP->child[0] == X) \[m
[31m-	XP->child[0] = R;\[m
[31m-      else \[m
[31m-	XP->child[1] = R;\[m
[31m-    }\[m
[31m-    if (R != 0) {\[m
[31m-      tchunkptr C0, C1;\[m
[31m-      R->parent = XP;\[m
[31m-      if ((C0 = X->child[0]) != 0) {\[m
[31m-	R->child[0] = C0;\[m
[31m-	C0->parent = R;\[m
[31m-      }\[m
[31m-      if ((C1 = X->child[1]) != 0) {\[m
[31m-	R->child[1] = C1;\[m
[31m-	C1->parent = R;\[m
[31m-      }\[m
[31m-    }\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-/* Relays to large vs small bin operations */[m
[31m-[m
[31m-#define insert_chunk(M, P, S)\[m
[31m-  if (is_small(S)) { insert_small_chunk(M, P, S)\[m
[31m-  } else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }[m
[31m-[m
[31m-#define unlink_chunk(M, P, S)\[m
[31m-  if (is_small(S)) { unlink_small_chunk(M, P, S)\[m
[31m-  } else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }[m
[31m-[m
[31m-/* -----------------------  Direct-mmapping chunks ----------------------- */[m
[31m-[m
[31m-static void *direct_alloc(size_t nb)[m
[31m-{[m
[31m-  size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);[m
[31m-  if (LJ_LIKELY(mmsize > nb)) {     /* Check for wrap around 0 */[m
[31m-    char *mm = (char *)(DIRECT_MMAP(mmsize));[m
[31m-    if (mm != CMFAIL) {[m
[31m-      size_t offset = align_offset(chunk2mem(mm));[m
[31m-      size_t psize = mmsize - offset - DIRECT_FOOT_PAD;[m
[31m-      mchunkptr p = (mchunkptr)(mm + offset);[m
[31m-      p->prev_foot = offset | IS_DIRECT_BIT;[m
[31m-      p->head = psize|CINUSE_BIT;[m
[31m-      chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;[m
[31m-      chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;[m
[31m-      return chunk2mem(p);[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static mchunkptr direct_resize(mchunkptr oldp, size_t nb)[m
[31m-{[m
[31m-  size_t oldsize = chunksize(oldp);[m
[31m-  if (is_small(nb)) /* Can't shrink direct regions below small size */[m
[31m-    return NULL;[m
[31m-  /* Keep old chunk if big enough but not too big */[m
[31m-  if (oldsize >= nb + SIZE_T_SIZE &&[m
[31m-      (oldsize - nb) <= (DEFAULT_GRANULARITY >> 1)) {[m
[31m-    return oldp;[m
[31m-  } else {[m
[31m-    size_t offset = oldp->prev_foot & ~IS_DIRECT_BIT;[m
[31m-    size_t oldmmsize = oldsize + offset + DIRECT_FOOT_PAD;[m
[31m-    size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);[m
[31m-    char *cp = (char *)CALL_MREMAP((char *)oldp - offset,[m
[31m-				   oldmmsize, newmmsize, CALL_MREMAP_MV);[m
[31m-    if (cp != CMFAIL) {[m
[31m-      mchunkptr newp = (mchunkptr)(cp + offset);[m
[31m-      size_t psize = newmmsize - offset - DIRECT_FOOT_PAD;[m
[31m-      newp->head = psize|CINUSE_BIT;[m
[31m-      chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;[m
[31m-      chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;[m
[31m-      return newp;[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -------------------------- mspace management -------------------------- */[m
[31m-[m
[31m-/* Initialize top chunk and its size */[m
[31m-static void init_top(mstate m, mchunkptr p, size_t psize)[m
[31m-{[m
[31m-  /* Ensure alignment */[m
[31m-  size_t offset = align_offset(chunk2mem(p));[m
[31m-  p = (mchunkptr)((char *)p + offset);[m
[31m-  psize -= offset;[m
[31m-[m
[31m-  m->top = p;[m
[31m-  m->topsize = psize;[m
[31m-  p->head = psize | PINUSE_BIT;[m
[31m-  /* set size of fake trailing chunk holding overhead space only once */[m
[31m-  chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;[m
[31m-  m->trim_check = DEFAULT_TRIM_THRESHOLD; /* reset on each update */[m
[31m-}[m
[31m-[m
[31m-/* Initialize bins for a new mstate that is otherwise zeroed out */[m
[31m-static void init_bins(mstate m)[m
[31m-{[m
[31m-  /* Establish circular links for smallbins */[m
[31m-  bindex_t i;[m
[31m-  for (i = 0; i < NSMALLBINS; i++) {[m
[31m-    sbinptr bin = smallbin_at(m,i);[m
[31m-    bin->fd = bin->bk = bin;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocate chunk and prepend remainder with chunk in successor base. */[m
[31m-static void *prepend_alloc(mstate m, char *newbase, char *oldbase, size_t nb)[m
[31m-{[m
[31m-  mchunkptr p = align_as_chunk(newbase);[m
[31m-  mchunkptr oldfirst = align_as_chunk(oldbase);[m
[31m-  size_t psize = (size_t)((char *)oldfirst - (char *)p);[m
[31m-  mchunkptr q = chunk_plus_offset(p, nb);[m
[31m-  size_t qsize = psize - nb;[m
[31m-  set_size_and_pinuse_of_inuse_chunk(m, p, nb);[m
[31m-[m
[31m-  /* consolidate remainder with first chunk of old base */[m
[31m-  if (oldfirst == m->top) {[m
[31m-    size_t tsize = m->topsize += qsize;[m
[31m-    m->top = q;[m
[31m-    q->head = tsize | PINUSE_BIT;[m
[31m-  } else if (oldfirst == m->dv) {[m
[31m-    size_t dsize = m->dvsize += qsize;[m
[31m-    m->dv = q;[m
[31m-    set_size_and_pinuse_of_free_chunk(q, dsize);[m
[31m-  } else {[m
[31m-    if (!cinuse(oldfirst)) {[m
[31m-      size_t nsize = chunksize(oldfirst);[m
[31m-      unlink_chunk(m, oldfirst, nsize);[m
[31m-      oldfirst = chunk_plus_offset(oldfirst, nsize);[m
[31m-      qsize += nsize;[m
[31m-    }[m
[31m-    set_free_with_pinuse(q, qsize, oldfirst);[m
[31m-    insert_chunk(m, q, qsize);[m
[31m-  }[m
[31m-[m
[31m-  return chunk2mem(p);[m
[31m-}[m
[31m-[m
[31m-/* Add a segment to hold a new noncontiguous region */[m
[31m-static void add_segment(mstate m, char *tbase, size_t tsize)[m
[31m-{[m
[31m-  /* Determine locations and sizes of segment, fenceposts, old top */[m
[31m-  char *old_top = (char *)m->top;[m
[31m-  msegmentptr oldsp = segment_holding(m, old_top);[m
[31m-  char *old_end = oldsp->base + oldsp->size;[m
[31m-  size_t ssize = pad_request(sizeof(struct malloc_segment));[m
[31m-  char *rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);[m
[31m-  size_t offset = align_offset(chunk2mem(rawsp));[m
[31m-  char *asp = rawsp + offset;[m
[31m-  char *csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;[m
[31m-  mchunkptr sp = (mchunkptr)csp;[m
[31m-  msegmentptr ss = (msegmentptr)(chunk2mem(sp));[m
[31m-  mchunkptr tnext = chunk_plus_offset(sp, ssize);[m
[31m-  mchunkptr p = tnext;[m
[31m-[m
[31m-  /* reset top to new space */[m
[31m-  init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);[m
[31m-[m
[31m-  /* Set up segment record */[m
[31m-  set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);[m
[31m-  *ss = m->seg; /* Push current record */[m
[31m-  m->seg.base = tbase;[m
[31m-  m->seg.size = tsize;[m
[31m-  m->seg.next = ss;[m
[31m-[m
[31m-  /* Insert trailing fenceposts */[m
[31m-  for (;;) {[m
[31m-    mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);[m
[31m-    p->head = FENCEPOST_HEAD;[m
[31m-    if ((char *)(&(nextp->head)) < old_end)[m
[31m-      p = nextp;[m
[31m-    else[m
[31m-      break;[m
[31m-  }[m
[31m-[m
[31m-  /* Insert the rest of old top into a bin as an ordinary free chunk */[m
[31m-  if (csp != old_top) {[m
[31m-    mchunkptr q = (mchunkptr)old_top;[m
[31m-    size_t psize = (size_t)(csp - old_top);[m
[31m-    mchunkptr tn = chunk_plus_offset(q, psize);[m
[31m-    set_free_with_pinuse(q, psize, tn);[m
[31m-    insert_chunk(m, q, psize);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -------------------------- System allocation -------------------------- */[m
[31m-[m
[31m-static void *alloc_sys(mstate m, size_t nb)[m
[31m-{[m
[31m-  char *tbase = CMFAIL;[m
[31m-  size_t tsize = 0;[m
[31m-[m
[31m-  /* Directly map large chunks */[m
[31m-  if (LJ_UNLIKELY(nb >= DEFAULT_MMAP_THRESHOLD)) {[m
[31m-    void *mem = direct_alloc(nb);[m
[31m-    if (mem != 0)[m
[31m-      return mem;[m
[31m-  }[m
[31m-[m
[31m-  {[m
[31m-    size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE;[m
[31m-    size_t rsize = granularity_align(req);[m
[31m-    if (LJ_LIKELY(rsize > nb)) { /* Fail if wraps around zero */[m
[31m-      char *mp = (char *)(CALL_MMAP(rsize));[m
[31m-      if (mp != CMFAIL) {[m
[31m-	tbase = mp;[m
[31m-	tsize = rsize;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (tbase != CMFAIL) {[m
[31m-    msegmentptr sp = &m->seg;[m
[31m-    /* Try to merge with an existing segment */[m
[31m-    while (sp != 0 && tbase != sp->base + sp->size)[m
[31m-      sp = sp->next;[m
[31m-    if (sp != 0 && segment_holds(sp, m->top)) { /* append */[m
[31m-      sp->size += tsize;[m
[31m-      init_top(m, m->top, m->topsize + tsize);[m
[31m-    } else {[m
[31m-      sp = &m->seg;[m
[31m-      while (sp != 0 && sp->base != tbase + tsize)[m
[31m-	sp = sp->next;[m
[31m-      if (sp != 0) {[m
[31m-	char *oldbase = sp->base;[m
[31m-	sp->base = tbase;[m
[31m-	sp->size += tsize;[m
[31m-	return prepend_alloc(m, tbase, oldbase, nb);[m
[31m-      } else {[m
[31m-	add_segment(m, tbase, tsize);[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    if (nb < m->topsize) { /* Allocate from new or extended top space */[m
[31m-      size_t rsize = m->topsize -= nb;[m
[31m-      mchunkptr p = m->top;[m
[31m-      mchunkptr r = m->top = chunk_plus_offset(p, nb);[m
[31m-      r->head = rsize | PINUSE_BIT;[m
[31m-      set_size_and_pinuse_of_inuse_chunk(m, p, nb);[m
[31m-      return chunk2mem(p);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -----------------------  system deallocation -------------------------- */[m
[31m-[m
[31m-/* Unmap and unlink any mmapped segments that don't contain used chunks */[m
[31m-static size_t release_unused_segments(mstate m)[m
[31m-{[m
[31m-  size_t released = 0;[m
[31m-  size_t nsegs = 0;[m
[31m-  msegmentptr pred = &m->seg;[m
[31m-  msegmentptr sp = pred->next;[m
[31m-  while (sp != 0) {[m
[31m-    char *base = sp->base;[m
[31m-    size_t size = sp->size;[m
[31m-    msegmentptr next = sp->next;[m
[31m-    nsegs++;[m
[31m-    {[m
[31m-      mchunkptr p = align_as_chunk(base);[m
[31m-      size_t psize = chunksize(p);[m
[31m-      /* Can unmap if first chunk holds entire segment and not pinned */[m
[31m-      if (!cinuse(p) && (char *)p + psize >= base + size - TOP_FOOT_SIZE) {[m
[31m-	tchunkptr tp = (tchunkptr)p;[m
[31m-	if (p == m->dv) {[m
[31m-	  m->dv = 0;[m
[31m-	  m->dvsize = 0;[m
[31m-	} else {[m
[31m-	  unlink_large_chunk(m, tp);[m
[31m-	}[m
[31m-	if (CALL_MUNMAP(base, size) == 0) {[m
[31m-	  released += size;[m
[31m-	  /* unlink obsoleted record */[m
[31m-	  sp = pred;[m
[31m-	  sp->next = next;[m
[31m-	} else { /* back out if cannot unmap */[m
[31m-	  insert_large_chunk(m, tp, psize);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    pred = sp;[m
[31m-    sp = next;[m
[31m-  }[m
[31m-  /* Reset check counter */[m
[31m-  m->release_checks = nsegs > MAX_RELEASE_CHECK_RATE ?[m
[31m-		      nsegs : MAX_RELEASE_CHECK_RATE;[m
[31m-  return released;[m
[31m-}[m
[31m-[m
[31m-static int alloc_trim(mstate m, size_t pad)[m
[31m-{[m
[31m-  size_t released = 0;[m
[31m-  if (pad < MAX_REQUEST && is_initialized(m)) {[m
[31m-    pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */[m
[31m-[m
[31m-    if (m->topsize > pad) {[m
[31m-      /* Shrink top space in granularity-size units, keeping at least one */[m
[31m-      size_t unit = DEFAULT_GRANULARITY;[m
[31m-      size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -[m
[31m-		      SIZE_T_ONE) * unit;[m
[31m-      msegmentptr sp = segment_holding(m, (char *)m->top);[m
[31m-[m
[31m-      if (sp->size >= extra &&[m
[31m-	  !has_segment_link(m, sp)) { /* can't shrink if pinned */[m
[31m-	size_t newsize = sp->size - extra;[m
[31m-	/* Prefer mremap, fall back to munmap */[m
[31m-	if ((CALL_MREMAP(sp->base, sp->size, newsize, CALL_MREMAP_NOMOVE) != MFAIL) ||[m
[31m-	    (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {[m
[31m-	  released = extra;[m
[31m-	}[m
[31m-      }[m
[31m-[m
[31m-      if (released != 0) {[m
[31m-	sp->size -= released;[m
[31m-	init_top(m, m->top, m->topsize - released);[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Unmap any unused mmapped segments */[m
[31m-    released += release_unused_segments(m);[m
[31m-[m
[31m-    /* On failure, disable autotrim to avoid repeated failed future calls */[m
[31m-    if (released == 0 && m->topsize > m->trim_check)[m
[31m-      m->trim_check = MAX_SIZE_T;[m
[31m-  }[m
[31m-[m
[31m-  return (released != 0)? 1 : 0;[m
[31m-}[m
[31m-[m
[31m-/* ---------------------------- malloc support --------------------------- */[m
[31m-[m
[31m-/* allocate a large request from the best fitting chunk in a treebin */[m
[31m-static void *tmalloc_large(mstate m, size_t nb)[m
[31m-{[m
[31m-  tchunkptr v = 0;[m
[31m-  size_t rsize = ~nb+1; /* Unsigned negation */[m
[31m-  tchunkptr t;[m
[31m-  bindex_t idx;[m
[31m-  compute_tree_index(nb, idx);[m
[31m-[m
[31m-  if ((t = *treebin_at(m, idx)) != 0) {[m
[31m-    /* Traverse tree for this bin looking for node with size == nb */[m
[31m-    size_t sizebits = nb << leftshift_for_tree_index(idx);[m
[31m-    tchunkptr rst = 0;  /* The deepest untaken right subtree */[m
[31m-    for (;;) {[m
[31m-      tchunkptr rt;[m
[31m-      size_t trem = chunksize(t) - nb;[m
[31m-      if (trem < rsize) {[m
[31m-	v = t;[m
[31m-	if ((rsize = trem) == 0)[m
[31m-	  break;[m
[31m-      }[m
[31m-      rt = t->child[1];[m
[31m-      t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];[m
[31m-      if (rt != 0 && rt != t)[m
[31m-	rst = rt;[m
[31m-      if (t == 0) {[m
[31m-	t = rst; /* set t to least subtree holding sizes > nb */[m
[31m-	break;[m
[31m-      }[m
[31m-      sizebits <<= 1;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */[m
[31m-    binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;[m
[31m-    if (leftbits != 0)[m
[31m-      t = *treebin_at(m, lj_ffs(leftbits));[m
[31m-  }[m
[31m-[m
[31m-  while (t != 0) { /* find smallest of tree or subtree */[m
[31m-    size_t trem = chunksize(t) - nb;[m
[31m-    if (trem < rsize) {[m
[31m-      rsize = trem;[m
[31m-      v = t;[m
[31m-    }[m
[31m-    t = leftmost_child(t);[m
[31m-  }[m
[31m-[m
[31m-  /*  If dv is a better fit, return NULL so malloc will use it */[m
[31m-  if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {[m
[31m-    mchunkptr r = chunk_plus_offset(v, nb);[m
[31m-    unlink_large_chunk(m, v);[m
[31m-    if (rsize < MIN_CHUNK_SIZE) {[m
[31m-      set_inuse_and_pinuse(m, v, (rsize + nb));[m
[31m-    } else {[m
[31m-      set_size_and_pinuse_of_inuse_chunk(m, v, nb);[m
[31m-      set_size_and_pinuse_of_free_chunk(r, rsize);[m
[31m-      insert_chunk(m, r, rsize);[m
[31m-    }[m
[31m-    return chunk2mem(v);[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* allocate a small request from the best fitting chunk in a treebin */[m
[31m-static void *tmalloc_small(mstate m, size_t nb)[m
[31m-{[m
[31m-  tchunkptr t, v;[m
[31m-  mchunkptr r;[m
[31m-  size_t rsize;[m
[31m-  bindex_t i = lj_ffs(m->treemap);[m
[31m-[m
[31m-  v = t = *treebin_at(m, i);[m
[31m-  rsize = chunksize(t) - nb;[m
[31m-[m
[31m-  while ((t = leftmost_child(t)) != 0) {[m
[31m-    size_t trem = chunksize(t) - nb;[m
[31m-    if (trem < rsize) {[m
[31m-      rsize = trem;[m
[31m-      v = t;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  r = chunk_plus_offset(v, nb);[m
[31m-  unlink_large_chunk(m, v);[m
[31m-  if (rsize < MIN_CHUNK_SIZE) {[m
[31m-    set_inuse_and_pinuse(m, v, (rsize + nb));[m
[31m-  } else {[m
[31m-    set_size_and_pinuse_of_inuse_chunk(m, v, nb);[m
[31m-    set_size_and_pinuse_of_free_chunk(r, rsize);[m
[31m-    replace_dv(m, r, rsize);[m
[31m-  }[m
[31m-  return chunk2mem(v);[m
[31m-}[m
[31m-[m
[31m-/* ----------------------------------------------------------------------- */[m
[31m-[m
[31m-void *lj_alloc_create(void)[m
[31m-{[m
[31m-  size_t tsize = DEFAULT_GRANULARITY;[m
[31m-  char *tbase;[m
[31m-  INIT_MMAP();[m
[31m-  tbase = (char *)(CALL_MMAP(tsize));[m
[31m-  if (tbase != CMFAIL) {[m
[31m-    size_t msize = pad_request(sizeof(struct malloc_state));[m
[31m-    mchunkptr mn;[m
[31m-    mchunkptr msp = align_as_chunk(tbase);[m
[31m-    mstate m = (mstate)(chunk2mem(msp));[m
[31m-    memset(m, 0, msize);[m
[31m-    msp->head = (msize|PINUSE_BIT|CINUSE_BIT);[m
[31m-    m->seg.base = tbase;[m
[31m-    m->seg.size = tsize;[m
[31m-    m->release_checks = MAX_RELEASE_CHECK_RATE;[m
[31m-    init_bins(m);[m
[31m-    mn = next_chunk(mem2chunk(m));[m
[31m-    init_top(m, mn, (size_t)((tbase + tsize) - (char *)mn) - TOP_FOOT_SIZE);[m
[31m-    return m;[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-void lj_alloc_destroy(void *msp)[m
[31m-{[m
[31m-  mstate ms = (mstate)msp;[m
[31m-  msegmentptr sp = &ms->seg;[m
[31m-  while (sp != 0) {[m
[31m-    char *base = sp->base;[m
[31m-    size_t size = sp->size;[m
[31m-    sp = sp->next;[m
[31m-    CALL_MUNMAP(base, size);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE void *lj_alloc_malloc(void *msp, size_t nsize)[m
[31m-{[m
[31m-  mstate ms = (mstate)msp;[m
[31m-  void *mem;[m
[31m-  size_t nb;[m
[31m-  if (nsize <= MAX_SMALL_REQUEST) {[m
[31m-    bindex_t idx;[m
[31m-    binmap_t smallbits;[m
[31m-    nb = (nsize < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(nsize);[m
[31m-    idx = small_index(nb);[m
[31m-    smallbits = ms->smallmap >> idx;[m
[31m-[m
[31m-    if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */[m
[31m-      mchunkptr b, p;[m
[31m-      idx += ~smallbits & 1;       /* Uses next bin if idx empty */[m
[31m-      b = smallbin_at(ms, idx);[m
[31m-      p = b->fd;[m
[31m-      unlink_first_small_chunk(ms, b, p, idx);[m
[31m-      set_inuse_and_pinuse(ms, p, small_index2size(idx));[m
[31m-      mem = chunk2mem(p);[m
[31m-      return mem;[m
[31m-    } else if (nb > ms->dvsize) {[m
[31m-      if (smallbits != 0) { /* Use chunk in next nonempty smallbin */[m
[31m-	mchunkptr b, p, r;[m
[31m-	size_t rsize;[m
[31m-	binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));[m
[31m-	bindex_t i = lj_ffs(leftbits);[m
[31m-	b = smallbin_at(ms, i);[m
[31m-	p = b->fd;[m
[31m-	unlink_first_small_chunk(ms, b, p, i);[m
[31m-	rsize = small_index2size(i) - nb;[m
[31m-	/* Fit here cannot be remainderless if 4byte sizes */[m
[31m-	if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) {[m
[31m-	  set_inuse_and_pinuse(ms, p, small_index2size(i));[m
[31m-	} else {[m
[31m-	  set_size_and_pinuse_of_inuse_chunk(ms, p, nb);[m
[31m-	  r = chunk_plus_offset(p, nb);[m
[31m-	  set_size_and_pinuse_of_free_chunk(r, rsize);[m
[31m-	  replace_dv(ms, r, rsize);[m
[31m-	}[m
[31m-	mem = chunk2mem(p);[m
[31m-	return mem;[m
[31m-      } else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {[m
[31m-	return mem;[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (nsize >= MAX_REQUEST) {[m
[31m-    nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */[m
[31m-  } else {[m
[31m-    nb = pad_request(nsize);[m
[31m-    if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {[m
[31m-      return mem;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (nb <= ms->dvsize) {[m
[31m-    size_t rsize = ms->dvsize - nb;[m
[31m-    mchunkptr p = ms->dv;[m
[31m-    if (rsize >= MIN_CHUNK_SIZE) { /* split dv */[m
[31m-      mchunkptr r = ms->dv = chunk_plus_offset(p, nb);[m
[31m-      ms->dvsize = rsize;[m
[31m-      set_size_and_pinuse_of_free_chunk(r, rsize);[m
[31m-      set_size_and_pinuse_of_inuse_chunk(ms, p, nb);[m
[31m-    } else { /* exhaust dv */[m
[31m-      size_t dvs = ms->dvsize;[m
[31m-      ms->dvsize = 0;[m
[31m-      ms->dv = 0;[m
[31m-      set_inuse_and_pinuse(ms, p, dvs);[m
[31m-    }[m
[31m-    mem = chunk2mem(p);[m
[31m-    return mem;[m
[31m-  } else if (nb < ms->topsize) { /* Split top */[m
[31m-    size_t rsize = ms->topsize -= nb;[m
[31m-    mchunkptr p = ms->top;[m
[31m-    mchunkptr r = ms->top = chunk_plus_offset(p, nb);[m
[31m-    r->head = rsize | PINUSE_BIT;[m
[31m-    set_size_and_pinuse_of_inuse_chunk(ms, p, nb);[m
[31m-    mem = chunk2mem(p);[m
[31m-    return mem;[m
[31m-  }[m
[31m-  return alloc_sys(ms, nb);[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE void *lj_alloc_free(void *msp, void *ptr)[m
[31m-{[m
[31m-  if (ptr != 0) {[m
[31m-    mchunkptr p = mem2chunk(ptr);[m
[31m-    mstate fm = (mstate)msp;[m
[31m-    size_t psize = chunksize(p);[m
[31m-    mchunkptr next = chunk_plus_offset(p, psize);[m
[31m-    if (!pinuse(p)) {[m
[31m-      size_t prevsize = p->prev_foot;[m
[31m-      if ((prevsize & IS_DIRECT_BIT) != 0) {[m
[31m-	prevsize &= ~IS_DIRECT_BIT;[m
[31m-	psize += prevsize + DIRECT_FOOT_PAD;[m
[31m-	CALL_MUNMAP((char *)p - prevsize, psize);[m
[31m-	return NULL;[m
[31m-      } else {[m
[31m-	mchunkptr prev = chunk_minus_offset(p, prevsize);[m
[31m-	psize += prevsize;[m
[31m-	p = prev;[m
[31m-	/* consolidate backward */[m
[31m-	if (p != fm->dv) {[m
[31m-	  unlink_chunk(fm, p, prevsize);[m
[31m-	} else if ((next->head & INUSE_BITS) == INUSE_BITS) {[m
[31m-	  fm->dvsize = psize;[m
[31m-	  set_free_with_pinuse(p, psize, next);[m
[31m-	  return NULL;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    if (!cinuse(next)) {  /* consolidate forward */[m
[31m-      if (next == fm->top) {[m
[31m-	size_t tsize = fm->topsize += psize;[m
[31m-	fm->top = p;[m
[31m-	p->head = tsize | PINUSE_BIT;[m
[31m-	if (p == fm->dv) {[m
[31m-	  fm->dv = 0;[m
[31m-	  fm->dvsize = 0;[m
[31m-	}[m
[31m-	if (tsize > fm->trim_check)[m
[31m-	  alloc_trim(fm, 0);[m
[31m-	return NULL;[m
[31m-      } else if (next == fm->dv) {[m
[31m-	size_t dsize = fm->dvsize += psize;[m
[31m-	fm->dv = p;[m
[31m-	set_size_and_pinuse_of_free_chunk(p, dsize);[m
[31m-	return NULL;[m
[31m-      } else {[m
[31m-	size_t nsize = chunksize(next);[m
[31m-	psize += nsize;[m
[31m-	unlink_chunk(fm, next, nsize);[m
[31m-	set_size_and_pinuse_of_free_chunk(p, psize);[m
[31m-	if (p == fm->dv) {[m
[31m-	  fm->dvsize = psize;[m
[31m-	  return NULL;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      set_free_with_pinuse(p, psize, next);[m
[31m-    }[m
[31m-[m
[31m-    if (is_small(psize)) {[m
[31m-      insert_small_chunk(fm, p, psize);[m
[31m-    } else {[m
[31m-      tchunkptr tp = (tchunkptr)p;[m
[31m-      insert_large_chunk(fm, tp, psize);[m
[31m-      if (--fm->release_checks == 0)[m
[31m-	release_unused_segments(fm);[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE void *lj_alloc_realloc(void *msp, void *ptr, size_t nsize)[m
[31m-{[m
[31m-  if (nsize >= MAX_REQUEST) {[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    mstate m = (mstate)msp;[m
[31m-    mchunkptr oldp = mem2chunk(ptr);[m
[31m-    size_t oldsize = chunksize(oldp);[m
[31m-    mchunkptr next = chunk_plus_offset(oldp, oldsize);[m
[31m-    mchunkptr newp = 0;[m
[31m-    size_t nb = request2size(nsize);[m
[31m-[m
[31m-    /* Try to either shrink or extend into top. Else malloc-copy-free */[m
[31m-    if (is_direct(oldp)) {[m
[31m-      newp = direct_resize(oldp, nb);  /* this may return NULL. */[m
[31m-    } else if (oldsize >= nb) { /* already big enough */[m
[31m-      size_t rsize = oldsize - nb;[m
[31m-      newp = oldp;[m
[31m-      if (rsize >= MIN_CHUNK_SIZE) {[m
[31m-	mchunkptr rem = chunk_plus_offset(newp, nb);[m
[31m-	set_inuse(m, newp, nb);[m
[31m-	set_inuse(m, rem, rsize);[m
[31m-	lj_alloc_free(m, chunk2mem(rem));[m
[31m-      }[m
[31m-    } else if (next == m->top && oldsize + m->topsize > nb) {[m
[31m-      /* Expand into top */[m
[31m-      size_t newsize = oldsize + m->topsize;[m
[31m-      size_t newtopsize = newsize - nb;[m
[31m-      mchunkptr newtop = chunk_plus_offset(oldp, nb);[m
[31m-      set_inuse(m, oldp, nb);[m
[31m-      newtop->head = newtopsize |PINUSE_BIT;[m
[31m-      m->top = newtop;[m
[31m-      m->topsize = newtopsize;[m
[31m-      newp = oldp;[m
[31m-    }[m
[31m-[m
[31m-    if (newp != 0) {[m
[31m-      return chunk2mem(newp);[m
[31m-    } else {[m
[31m-      void *newmem = lj_alloc_malloc(m, nsize);[m
[31m-      if (newmem != 0) {[m
[31m-	size_t oc = oldsize - overhead_for(oldp);[m
[31m-	memcpy(newmem, ptr, oc < nsize ? oc : nsize);[m
[31m-	lj_alloc_free(m, ptr);[m
[31m-      }[m
[31m-      return newmem;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void *lj_alloc_f(void *msp, void *ptr, size_t osize, size_t nsize)[m
[31m-{[m
[31m-  (void)osize;[m
[31m-  if (nsize == 0) {[m
[31m-    return lj_alloc_free(msp, ptr);[m
[31m-  } else if (ptr == NULL) {[m
[31m-    return lj_alloc_malloc(msp, nsize);[m
[31m-  } else {[m
[31m-    return lj_alloc_realloc(msp, ptr, nsize);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.h[m
[1mdeleted file mode 100644[m
[1mindex f87a7cf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_alloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-/*[m
[31m-** Bundled memory allocator.[m
[31m-** Donated to the public domain.[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_ALLOC_H[m
[31m-#define _LJ_ALLOC_H[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-[m
[31m-#ifndef LUAJIT_USE_SYSMALLOC[m
[31m-LJ_FUNC void *lj_alloc_create(void);[m
[31m-LJ_FUNC void lj_alloc_destroy(void *msp);[m
[31m-LJ_FUNC void *lj_alloc_f(void *msp, void *ptr, size_t osize, size_t nsize);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api.c[m
[1mdeleted file mode 100644[m
[1mindex 0fbb925..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_api.c[m
[1m+++ /dev/null[m
[36m@@ -1,1213 +0,0 @@[m
[31m-/*[m
[31m-** Public Lua/C API.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_api_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_udata.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- Common helper functions --------------------------------------------- */[m
[31m-[m
[31m-#define api_checknelems(L, n)		api_check(L, (n) <= (L->top - L->base))[m
[31m-#define api_checkvalidindex(L, i)	api_check(L, (i) != niltv(L))[m
[31m-[m
[31m-static TValue *index2adr(lua_State *L, int idx)[m
[31m-{[m
[31m-  if (idx > 0) {[m
[31m-    TValue *o = L->base + (idx - 1);[m
[31m-    return o < L->top ? o : niltv(L);[m
[31m-  } else if (idx > LUA_REGISTRYINDEX) {[m
[31m-    api_check(L, idx != 0 && -idx <= L->top - L->base);[m
[31m-    return L->top + idx;[m
[31m-  } else if (idx == LUA_GLOBALSINDEX) {[m
[31m-    TValue *o = &G(L)->tmptv;[m
[31m-    settabV(L, o, tabref(L->env));[m
[31m-    return o;[m
[31m-  } else if (idx == LUA_REGISTRYINDEX) {[m
[31m-    return registry(L);[m
[31m-  } else {[m
[31m-    GCfunc *fn = curr_func(L);[m
[31m-    api_check(L, fn->c.gct == ~LJ_TFUNC && !isluafunc(fn));[m
[31m-    if (idx == LUA_ENVIRONINDEX) {[m
[31m-      TValue *o = &G(L)->tmptv;[m
[31m-      settabV(L, o, tabref(fn->c.env));[m
[31m-      return o;[m
[31m-    } else {[m
[31m-      idx = LUA_GLOBALSINDEX - idx;[m
[31m-      return idx <= fn->c.nupvalues ? &fn->c.upvalue[idx-1] : niltv(L);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static TValue *stkindex2adr(lua_State *L, int idx)[m
[31m-{[m
[31m-  if (idx > 0) {[m
[31m-    TValue *o = L->base + (idx - 1);[m
[31m-    return o < L->top ? o : niltv(L);[m
[31m-  } else {[m
[31m-    api_check(L, idx != 0 && -idx <= L->top - L->base);[m
[31m-    return L->top + idx;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static GCtab *getcurrenv(lua_State *L)[m
[31m-{[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  return fn->c.gct == ~LJ_TFUNC ? tabref(fn->c.env) : tabref(L->env);[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous API functions ----------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_status(lua_State *L)[m
[31m-{[m
[31m-  return L->status;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_checkstack(lua_State *L, int size)[m
[31m-{[m
[31m-  if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) {[m
[31m-    return 0;  /* Stack overflow. */[m
[31m-  } else if (size > 0) {[m
[31m-    lj_state_checkstack(L, (MSize)size);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_checkstack(lua_State *L, int size, const char *msg)[m
[31m-{[m
[31m-  if (!lua_checkstack(L, size))[m
[31m-    lj_err_callerv(L, LJ_ERR_STKOVM, msg);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_xmove(lua_State *from, lua_State *to, int n)[m
[31m-{[m
[31m-  TValue *f, *t;[m
[31m-  if (from == to) return;[m
[31m-  api_checknelems(from, n);[m
[31m-  api_check(from, G(from) == G(to));[m
[31m-  lj_state_checkstack(to, (MSize)n);[m
[31m-  f = from->top;[m
[31m-  t = to->top = to->top + n;[m
[31m-  while (--n >= 0) copyTV(to, --t, --f);[m
[31m-  from->top = f;[m
[31m-}[m
[31m-[m
[31m-/* -- Stack manipulation -------------------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_gettop(lua_State *L)[m
[31m-{[m
[31m-  return (int)(L->top - L->base);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_settop(lua_State *L, int idx)[m
[31m-{[m
[31m-  if (idx >= 0) {[m
[31m-    api_check(L, idx <= tvref(L->maxstack) - L->base);[m
[31m-    if (L->base + idx > L->top) {[m
[31m-      if (L->base + idx >= tvref(L->maxstack))[m
[31m-	lj_state_growstack(L, (MSize)idx - (MSize)(L->top - L->base));[m
[31m-      do { setnilV(L->top++); } while (L->top < L->base + idx);[m
[31m-    } else {[m
[31m-      L->top = L->base + idx;[m
[31m-    }[m
[31m-  } else {[m
[31m-    api_check(L, -(idx+1) <= (L->top - L->base));[m
[31m-    L->top += idx+1;  /* Shrinks top (idx < 0). */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_remove(lua_State *L, int idx)[m
[31m-{[m
[31m-  TValue *p = stkindex2adr(L, idx);[m
[31m-  api_checkvalidindex(L, p);[m
[31m-  while (++p < L->top) copyTV(L, p-1, p);[m
[31m-  L->top--;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_insert(lua_State *L, int idx)[m
[31m-{[m
[31m-  TValue *q, *p = stkindex2adr(L, idx);[m
[31m-  api_checkvalidindex(L, p);[m
[31m-  for (q = L->top; q > p; q--) copyTV(L, q, q-1);[m
[31m-  copyTV(L, p, L->top);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_replace(lua_State *L, int idx)[m
[31m-{[m
[31m-  api_checknelems(L, 1);[m
[31m-  if (idx == LUA_GLOBALSINDEX) {[m
[31m-    api_check(L, tvistab(L->top-1));[m
[31m-    /* NOBARRIER: A thread (i.e. L) is never black. */[m
[31m-    setgcref(L->env, obj2gco(tabV(L->top-1)));[m
[31m-  } else if (idx == LUA_ENVIRONINDEX) {[m
[31m-    GCfunc *fn = curr_func(L);[m
[31m-    if (fn->c.gct != ~LJ_TFUNC)[m
[31m-      lj_err_msg(L, LJ_ERR_NOENV);[m
[31m-    api_check(L, tvistab(L->top-1));[m
[31m-    setgcref(fn->c.env, obj2gco(tabV(L->top-1)));[m
[31m-    lj_gc_barrier(L, fn, L->top-1);[m
[31m-  } else {[m
[31m-    TValue *o = index2adr(L, idx);[m
[31m-    api_checkvalidindex(L, o);[m
[31m-    copyTV(L, o, L->top-1);[m
[31m-    if (idx < LUA_GLOBALSINDEX)  /* Need a barrier for upvalues. */[m
[31m-      lj_gc_barrier(L, curr_func(L), L->top-1);[m
[31m-  }[m
[31m-  L->top--;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushvalue(lua_State *L, int idx)[m
[31m-{[m
[31m-  copyTV(L, L->top, index2adr(L, idx));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-/* -- Stack getters ------------------------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_type(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  if (tvisnumber(o)) {[m
[31m-    return LUA_TNUMBER;[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-  } else if (tvislightud(o)) {[m
[31m-    return LUA_TLIGHTUSERDATA;[m
[31m-#endif[m
[31m-  } else if (o == niltv(L)) {[m
[31m-    return LUA_TNONE;[m
[31m-  } else {  /* Magic internal/external tag conversion. ORDER LJ_T */[m
[31m-    uint32_t t = ~itype(o);[m
[31m-#if LJ_64[m
[31m-    int tt = (int)((U64x(75a06,98042110) >> 4*t) & 15u);[m
[31m-#else[m
[31m-    int tt = (int)(((t < 8 ? 0x98042110u : 0x75a06u) >> 4*(t&7)) & 15u);[m
[31m-#endif[m
[31m-    lua_assert(tt != LUA_TNIL || tvisnil(o));[m
[31m-    return tt;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_checktype(lua_State *L, int idx, int tt)[m
[31m-{[m
[31m-  if (lua_type(L, idx) != tt)[m
[31m-    lj_err_argt(L, idx, tt);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_checkany(lua_State *L, int idx)[m
[31m-{[m
[31m-  if (index2adr(L, idx) == niltv(L))[m
[31m-    lj_err_arg(L, idx, LJ_ERR_NOVAL);[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_typename(lua_State *L, int t)[m
[31m-{[m
[31m-  UNUSED(L);[m
[31m-  return lj_obj_typename[t+1];[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_iscfunction(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return tvisfunc(o) && !isluafunc(funcV(o));[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_isnumber(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  return (tvisnumber(o) || (tvisstr(o) && lj_strscan_number(strV(o), &tmp)));[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_isstring(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return (tvisstr(o) || tvisnumber(o));[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_isuserdata(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return (tvisudata(o) || tvislightud(o));[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_rawequal(lua_State *L, int idx1, int idx2)[m
[31m-{[m
[31m-  cTValue *o1 = index2adr(L, idx1);[m
[31m-  cTValue *o2 = index2adr(L, idx2);[m
[31m-  return (o1 == niltv(L) || o2 == niltv(L)) ? 0 : lj_obj_equal(o1, o2);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_equal(lua_State *L, int idx1, int idx2)[m
[31m-{[m
[31m-  cTValue *o1 = index2adr(L, idx1);[m
[31m-  cTValue *o2 = index2adr(L, idx2);[m
[31m-  if (tvisint(o1) && tvisint(o2)) {[m
[31m-    return intV(o1) == intV(o2);[m
[31m-  } else if (tvisnumber(o1) && tvisnumber(o2)) {[m
[31m-    return numberVnum(o1) == numberVnum(o2);[m
[31m-  } else if (itype(o1) != itype(o2)) {[m
[31m-    return 0;[m
[31m-  } else if (tvispri(o1)) {[m
[31m-    return o1 != niltv(L) && o2 != niltv(L);[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-  } else if (tvislightud(o1)) {[m
[31m-    return o1->u64 == o2->u64;[m
[31m-#endif[m
[31m-  } else if (gcrefeq(o1->gcr, o2->gcr)) {[m
[31m-    return 1;[m
[31m-  } else if (!tvistabud(o1)) {[m
[31m-    return 0;[m
[31m-  } else {[m
[31m-    TValue *base = lj_meta_equal(L, gcV(o1), gcV(o2), 0);[m
[31m-    if ((uintptr_t)base <= 1) {[m
[31m-      return (int)(uintptr_t)base;[m
[31m-    } else {[m
[31m-      L->top = base+2;[m
[31m-      lj_vm_call(L, base, 1+1);[m
[31m-      L->top -= 2+LJ_FR2;[m
[31m-      return tvistruecond(L->top+1+LJ_FR2);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_lessthan(lua_State *L, int idx1, int idx2)[m
[31m-{[m
[31m-  cTValue *o1 = index2adr(L, idx1);[m
[31m-  cTValue *o2 = index2adr(L, idx2);[m
[31m-  if (o1 == niltv(L) || o2 == niltv(L)) {[m
[31m-    return 0;[m
[31m-  } else if (tvisint(o1) && tvisint(o2)) {[m
[31m-    return intV(o1) < intV(o2);[m
[31m-  } else if (tvisnumber(o1) && tvisnumber(o2)) {[m
[31m-    return numberVnum(o1) < numberVnum(o2);[m
[31m-  } else {[m
[31m-    TValue *base = lj_meta_comp(L, o1, o2, 0);[m
[31m-    if ((uintptr_t)base <= 1) {[m
[31m-      return (int)(uintptr_t)base;[m
[31m-    } else {[m
[31m-      L->top = base+2;[m
[31m-      lj_vm_call(L, base, 1+1);[m
[31m-      L->top -= 2+LJ_FR2;[m
[31m-      return tvistruecond(L->top+1+LJ_FR2);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_Number lua_tonumber(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  if (LJ_LIKELY(tvisnumber(o)))[m
[31m-    return numberVnum(o);[m
[31m-  else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp))[m
[31m-    return numV(&tmp);[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  if (LJ_LIKELY(tvisnumber(o)))[m
[31m-    return numberVnum(o);[m
[31m-  else if (!(tvisstr(o) && lj_strscan_num(strV(o), &tmp)))[m
[31m-    lj_err_argt(L, idx, LUA_TNUMBER);[m
[31m-  return numV(&tmp);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_Number luaL_optnumber(lua_State *L, int idx, lua_Number def)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  if (LJ_LIKELY(tvisnumber(o)))[m
[31m-    return numberVnum(o);[m
[31m-  else if (tvisnil(o))[m
[31m-    return def;[m
[31m-  else if (!(tvisstr(o) && lj_strscan_num(strV(o), &tmp)))[m
[31m-    lj_err_argt(L, idx, LUA_TNUMBER);[m
[31m-  return numV(&tmp);[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  lua_Number n;[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else if (LJ_LIKELY(tvisnum(o))) {[m
[31m-    n = numV(o);[m
[31m-  } else {[m
[31m-    if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))[m
[31m-      return 0;[m
[31m-    if (tvisint(&tmp))[m
[31m-      return (lua_Integer)intV(&tmp);[m
[31m-    n = numV(&tmp);[m
[31m-  }[m
[31m-#if LJ_64[m
[31m-  return (lua_Integer)n;[m
[31m-#else[m
[31m-  return lj_num2int(n);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  lua_Number n;[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else if (LJ_LIKELY(tvisnum(o))) {[m
[31m-    n = numV(o);[m
[31m-  } else {[m
[31m-    if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))[m
[31m-      lj_err_argt(L, idx, LUA_TNUMBER);[m
[31m-    if (tvisint(&tmp))[m
[31m-      return (lua_Integer)intV(&tmp);[m
[31m-    n = numV(&tmp);[m
[31m-  }[m
[31m-#if LJ_64[m
[31m-  return (lua_Integer)n;[m
[31m-#else[m
[31m-  return lj_num2int(n);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_Integer luaL_optinteger(lua_State *L, int idx, lua_Integer def)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  lua_Number n;[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else if (LJ_LIKELY(tvisnum(o))) {[m
[31m-    n = numV(o);[m
[31m-  } else if (tvisnil(o)) {[m
[31m-    return def;[m
[31m-  } else {[m
[31m-    if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))[m
[31m-      lj_err_argt(L, idx, LUA_TNUMBER);[m
[31m-    if (tvisint(&tmp))[m
[31m-      return (lua_Integer)intV(&tmp);[m
[31m-    n = numV(&tmp);[m
[31m-  }[m
[31m-#if LJ_64[m
[31m-  return (lua_Integer)n;[m
[31m-#else[m
[31m-  return lj_num2int(n);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_toboolean(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return tvistruecond(o);[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_tolstring(lua_State *L, int idx, size_t *len)[m
[31m-{[m
[31m-  TValue *o = index2adr(L, idx);[m
[31m-  GCstr *s;[m
[31m-  if (LJ_LIKELY(tvisstr(o))) {[m
[31m-    s = strV(o);[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    lj_gc_check(L);[m
[31m-    o = index2adr(L, idx);  /* GC may move the stack. */[m
[31m-    s = lj_strfmt_number(L, o);[m
[31m-    setstrV(L, o, s);[m
[31m-  } else {[m
[31m-    if (len != NULL) *len = 0;[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  if (len != NULL) *len = s->len;[m
[31m-  return strdata(s);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API const char *luaL_checklstring(lua_State *L, int idx, size_t *len)[m
[31m-{[m
[31m-  TValue *o = index2adr(L, idx);[m
[31m-  GCstr *s;[m
[31m-  if (LJ_LIKELY(tvisstr(o))) {[m
[31m-    s = strV(o);[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    lj_gc_check(L);[m
[31m-    o = index2adr(L, idx);  /* GC may move the stack. */[m
[31m-    s = lj_strfmt_number(L, o);[m
[31m-    setstrV(L, o, s);[m
[31m-  } else {[m
[31m-    lj_err_argt(L, idx, LUA_TSTRING);[m
[31m-  }[m
[31m-  if (len != NULL) *len = s->len;[m
[31m-  return strdata(s);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API const char *luaL_optlstring(lua_State *L, int idx,[m
[31m-				       const char *def, size_t *len)[m
[31m-{[m
[31m-  TValue *o = index2adr(L, idx);[m
[31m-  GCstr *s;[m
[31m-  if (LJ_LIKELY(tvisstr(o))) {[m
[31m-    s = strV(o);[m
[31m-  } else if (tvisnil(o)) {[m
[31m-    if (len != NULL) *len = def ? strlen(def) : 0;[m
[31m-    return def;[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    lj_gc_check(L);[m
[31m-    o = index2adr(L, idx);  /* GC may move the stack. */[m
[31m-    s = lj_strfmt_number(L, o);[m
[31m-    setstrV(L, o, s);[m
[31m-  } else {[m
[31m-    lj_err_argt(L, idx, LUA_TSTRING);[m
[31m-  }[m
[31m-  if (len != NULL) *len = s->len;[m
[31m-  return strdata(s);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_checkoption(lua_State *L, int idx, const char *def,[m
[31m-				const char *const lst[])[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  const char *s = lua_tolstring(L, idx, NULL);[m
[31m-  if (s == NULL && (s = def) == NULL)[m
[31m-    lj_err_argt(L, idx, LUA_TSTRING);[m
[31m-  for (i = 0; lst[i]; i++)[m
[31m-    if (strcmp(lst[i], s) == 0)[m
[31m-      return (int)i;[m
[31m-  lj_err_argv(L, idx, LJ_ERR_INVOPTM, s);[m
[31m-}[m
[31m-[m
[31m-LUA_API size_t lua_objlen(lua_State *L, int idx)[m
[31m-{[m
[31m-  TValue *o = index2adr(L, idx);[m
[31m-  if (tvisstr(o)) {[m
[31m-    return strV(o)->len;[m
[31m-  } else if (tvistab(o)) {[m
[31m-    return (size_t)lj_tab_len(tabV(o));[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    return udataV(o)->len;[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    GCstr *s = lj_strfmt_number(L, o);[m
[31m-    setstrV(L, o, s);[m
[31m-    return s->len;[m
[31m-  } else {[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_CFunction lua_tocfunction(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  if (tvisfunc(o)) {[m
[31m-    BCOp op = bc_op(*mref(funcV(o)->c.pc, BCIns));[m
[31m-    if (op == BC_FUNCC || op == BC_FUNCCW)[m
[31m-      return funcV(o)->c.f;[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-LUA_API void *lua_touserdata(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  if (tvisudata(o))[m
[31m-    return uddata(udataV(o));[m
[31m-  else if (tvislightud(o))[m
[31m-    return lightudV(o);[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_State *lua_tothread(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return (!tvisthread(o)) ? NULL : threadV(o);[m
[31m-}[m
[31m-[m
[31m-LUA_API const void *lua_topointer(lua_State *L, int idx)[m
[31m-{[m
[31m-  return lj_obj_ptr(index2adr(L, idx));[m
[31m-}[m
[31m-[m
[31m-/* -- Stack setters (object creation) ------------------------------------- */[m
[31m-[m
[31m-LUA_API void lua_pushnil(lua_State *L)[m
[31m-{[m
[31m-  setnilV(L->top);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushnumber(lua_State *L, lua_Number n)[m
[31m-{[m
[31m-  setnumV(L->top, n);[m
[31m-  if (LJ_UNLIKELY(tvisnan(L->top)))[m
[31m-    setnanV(L->top);  /* Canonicalize injected NaNs. */[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushinteger(lua_State *L, lua_Integer n)[m
[31m-{[m
[31m-  setintptrV(L->top, n);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushlstring(lua_State *L, const char *str, size_t len)[m
[31m-{[m
[31m-  GCstr *s;[m
[31m-  lj_gc_check(L);[m
[31m-  s = lj_str_new(L, str, len);[m
[31m-  setstrV(L, L->top, s);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushstring(lua_State *L, const char *str)[m
[31m-{[m
[31m-  if (str == NULL) {[m
[31m-    setnilV(L->top);[m
[31m-  } else {[m
[31m-    GCstr *s;[m
[31m-    lj_gc_check(L);[m
[31m-    s = lj_str_newz(L, str);[m
[31m-    setstrV(L, L->top, s);[m
[31m-  }[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_pushvfstring(lua_State *L, const char *fmt,[m
[31m-				     va_list argp)[m
[31m-{[m
[31m-  lj_gc_check(L);[m
[31m-  return lj_strfmt_pushvf(L, fmt, argp);[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_pushfstring(lua_State *L, const char *fmt, ...)[m
[31m-{[m
[31m-  const char *ret;[m
[31m-  va_list argp;[m
[31m-  lj_gc_check(L);[m
[31m-  va_start(argp, fmt);[m
[31m-  ret = lj_strfmt_pushvf(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  return ret;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushcclosure(lua_State *L, lua_CFunction f, int n)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  lj_gc_check(L);[m
[31m-  api_checknelems(L, n);[m
[31m-  fn = lj_func_newC(L, (MSize)n, getcurrenv(L));[m
[31m-  fn->c.f = f;[m
[31m-  L->top -= n;[m
[31m-  while (n--)[m
[31m-    copyTV(L, &fn->c.upvalue[n], L->top+n);[m
[31m-  setfuncV(L, L->top, fn);[m
[31m-  lua_assert(iswhite(obj2gco(fn)));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushboolean(lua_State *L, int b)[m
[31m-{[m
[31m-  setboolV(L->top, (b != 0));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushlightuserdata(lua_State *L, void *p)[m
[31m-{[m
[31m-  setlightudV(L->top, checklightudptr(L, p));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_createtable(lua_State *L, int narray, int nrec)[m
[31m-{[m
[31m-  lj_gc_check(L);[m
[31m-  settabV(L, L->top, lj_tab_new_ah(L, narray, nrec));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_newmetatable(lua_State *L, const char *tname)[m
[31m-{[m
[31m-  GCtab *regt = tabV(registry(L));[m
[31m-  TValue *tv = lj_tab_setstr(L, regt, lj_str_newz(L, tname));[m
[31m-  if (tvisnil(tv)) {[m
[31m-    GCtab *mt = lj_tab_new(L, 0, 1);[m
[31m-    settabV(L, tv, mt);[m
[31m-    settabV(L, L->top++, mt);[m
[31m-    lj_gc_anybarriert(L, regt);[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    copyTV(L, L->top++, tv);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_pushthread(lua_State *L)[m
[31m-{[m
[31m-  setthreadV(L, L->top, L);[m
[31m-  incr_top(L);[m
[31m-  return (mainthread(G(L)) == L);[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_State *lua_newthread(lua_State *L)[m
[31m-{[m
[31m-  lua_State *L1;[m
[31m-  lj_gc_check(L);[m
[31m-  L1 = lj_state_new(L);[m
[31m-  setthreadV(L, L->top, L1);[m
[31m-  incr_top(L);[m
[31m-  return L1;[m
[31m-}[m
[31m-[m
[31m-LUA_API void *lua_newuserdata(lua_State *L, size_t size)[m
[31m-{[m
[31m-  GCudata *ud;[m
[31m-  lj_gc_check(L);[m
[31m-  if (size > LJ_MAX_UDATA)[m
[31m-    lj_err_msg(L, LJ_ERR_UDATAOV);[m
[31m-  ud = lj_udata_new(L, (MSize)size, getcurrenv(L));[m
[31m-  setudataV(L, L->top, ud);[m
[31m-  incr_top(L);[m
[31m-  return uddata(ud);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_concat(lua_State *L, int n)[m
[31m-{[m
[31m-  api_checknelems(L, n);[m
[31m-  if (n >= 2) {[m
[31m-    n--;[m
[31m-    do {[m
[31m-      TValue *top = lj_meta_cat(L, L->top-1, -n);[m
[31m-      if (top == NULL) {[m
[31m-	L->top -= n;[m
[31m-	break;[m
[31m-      }[m
[31m-      n -= (int)(L->top - top);[m
[31m-      L->top = top+2;[m
[31m-      lj_vm_call(L, top, 1+1);[m
[31m-      L->top -= 1+LJ_FR2;[m
[31m-      copyTV(L, L->top-1, L->top+LJ_FR2);[m
[31m-    } while (--n > 0);[m
[31m-  } else if (n == 0) {  /* Push empty string. */[m
[31m-    setstrV(L, L->top, &G(L)->strempty);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  /* else n == 1: nothing to do. */[m
[31m-}[m
[31m-[m
[31m-/* -- Object getters ------------------------------------------------------ */[m
[31m-[m
[31m-LUA_API void lua_gettable(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *v, *t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  v = lj_meta_tget(L, t, L->top-1);[m
[31m-  if (v == NULL) {[m
[31m-    L->top += 2;[m
[31m-    lj_vm_call(L, L->top-2, 1+1);[m
[31m-    L->top -= 2+LJ_FR2;[m
[31m-    v = L->top+1+LJ_FR2;[m
[31m-  }[m
[31m-  copyTV(L, L->top-1, v);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_getfield(lua_State *L, int idx, const char *k)[m
[31m-{[m
[31m-  cTValue *v, *t = index2adr(L, idx);[m
[31m-  TValue key;[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  setstrV(L, &key, lj_str_newz(L, k));[m
[31m-  v = lj_meta_tget(L, t, &key);[m
[31m-  if (v == NULL) {[m
[31m-    L->top += 2;[m
[31m-    lj_vm_call(L, L->top-2, 1+1);[m
[31m-    L->top -= 2+LJ_FR2;[m
[31m-    v = L->top+1+LJ_FR2;[m
[31m-  }[m
[31m-  copyTV(L, L->top, v);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_rawget(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *t = index2adr(L, idx);[m
[31m-  api_check(L, tvistab(t));[m
[31m-  copyTV(L, L->top-1, lj_tab_get(L, tabV(t), L->top-1));[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_rawgeti(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  cTValue *v, *t = index2adr(L, idx);[m
[31m-  api_check(L, tvistab(t));[m
[31m-  v = lj_tab_getint(tabV(t), n);[m
[31m-  if (v) {[m
[31m-    copyTV(L, L->top, v);[m
[31m-  } else {[m
[31m-    setnilV(L->top);[m
[31m-  }[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_getmetatable(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  GCtab *mt = NULL;[m
[31m-  if (tvistab(o))[m
[31m-    mt = tabref(tabV(o)->metatable);[m
[31m-  else if (tvisudata(o))[m
[31m-    mt = tabref(udataV(o)->metatable);[m
[31m-  else[m
[31m-    mt = tabref(basemt_obj(G(L), o));[m
[31m-  if (mt == NULL)[m
[31m-    return 0;[m
[31m-  settabV(L, L->top, mt);[m
[31m-  incr_top(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_getmetafield(lua_State *L, int idx, const char *field)[m
[31m-{[m
[31m-  if (lua_getmetatable(L, idx)) {[m
[31m-    cTValue *tv = lj_tab_getstr(tabV(L->top-1), lj_str_newz(L, field));[m
[31m-    if (tv && !tvisnil(tv)) {[m
[31m-      copyTV(L, L->top-1, tv);[m
[31m-      return 1;[m
[31m-    }[m
[31m-    L->top--;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_getfenv(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  if (tvisfunc(o)) {[m
[31m-    settabV(L, L->top, tabref(funcV(o)->c.env));[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    settabV(L, L->top, tabref(udataV(o)->env));[m
[31m-  } else if (tvisthread(o)) {[m
[31m-    settabV(L, L->top, tabref(threadV(o)->env));[m
[31m-  } else {[m
[31m-    setnilV(L->top);[m
[31m-  }[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_next(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *t = index2adr(L, idx);[m
[31m-  int more;[m
[31m-  api_check(L, tvistab(t));[m
[31m-  more = lj_tab_next(L, tabV(t), L->top-1);[m
[31m-  if (more) {[m
[31m-    incr_top(L);  /* Return new key and value slot. */[m
[31m-  } else {  /* End of traversal. */[m
[31m-    L->top--;  /* Remove key slot. */[m
[31m-  }[m
[31m-  return more;[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_getupvalue(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  TValue *val;[m
[31m-  const char *name = lj_debug_uvnamev(index2adr(L, idx), (uint32_t)(n-1), &val);[m
[31m-  if (name) {[m
[31m-    copyTV(L, L->top, val);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-LUA_API void *lua_upvalueid(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  GCfunc *fn = funcV(index2adr(L, idx));[m
[31m-  n--;[m
[31m-  api_check(L, (uint32_t)n < fn->l.nupvalues);[m
[31m-  return isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :[m
[31m-			 (void *)&fn->c.upvalue[n];[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_upvaluejoin(lua_State *L, int idx1, int n1, int idx2, int n2)[m
[31m-{[m
[31m-  GCfunc *fn1 = funcV(index2adr(L, idx1));[m
[31m-  GCfunc *fn2 = funcV(index2adr(L, idx2));[m
[31m-  n1--; n2--;[m
[31m-  api_check(L, isluafunc(fn1) && (uint32_t)n1 < fn1->l.nupvalues);[m
[31m-  api_check(L, isluafunc(fn2) && (uint32_t)n2 < fn2->l.nupvalues);[m
[31m-  setgcrefr(fn1->l.uvptr[n1], fn2->l.uvptr[n2]);[m
[31m-  lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1]));[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  if (tvisudata(o)) {[m
[31m-    GCudata *ud = udataV(o);[m
[31m-    cTValue *tv = lj_tab_getstr(tabV(registry(L)), lj_str_newz(L, tname));[m
[31m-    if (tv && tvistab(tv) && tabV(tv) == tabref(ud->metatable))[m
[31m-      return uddata(ud);[m
[31m-  }[m
[31m-  lj_err_argtype(L, idx, tname);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-/* -- Object setters ------------------------------------------------------ */[m
[31m-[m
[31m-LUA_API void lua_settable(lua_State *L, int idx)[m
[31m-{[m
[31m-  TValue *o;[m
[31m-  cTValue *t = index2adr(L, idx);[m
[31m-  api_checknelems(L, 2);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  o = lj_meta_tset(L, t, L->top-2);[m
[31m-  if (o) {[m
[31m-    /* NOBARRIER: lj_meta_tset ensures the table is not black. */[m
[31m-    L->top -= 2;[m
[31m-    copyTV(L, o, L->top+1);[m
[31m-  } else {[m
[31m-    TValue *base = L->top;[m
[31m-    copyTV(L, base+2, base-3-2*LJ_FR2);[m
[31m-    L->top = base+3;[m
[31m-    lj_vm_call(L, base, 0+1);[m
[31m-    L->top -= 3+LJ_FR2;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_setfield(lua_State *L, int idx, const char *k)[m
[31m-{[m
[31m-  TValue *o;[m
[31m-  TValue key;[m
[31m-  cTValue *t = index2adr(L, idx);[m
[31m-  api_checknelems(L, 1);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  setstrV(L, &key, lj_str_newz(L, k));[m
[31m-  o = lj_meta_tset(L, t, &key);[m
[31m-  if (o) {[m
[31m-    /* NOBARRIER: lj_meta_tset ensures the table is not black. */[m
[31m-    copyTV(L, o, --L->top);[m
[31m-  } else {[m
[31m-    TValue *base = L->top;[m
[31m-    copyTV(L, base+2, base-3-2*LJ_FR2);[m
[31m-    L->top = base+3;[m
[31m-    lj_vm_call(L, base, 0+1);[m
[31m-    L->top -= 2+LJ_FR2;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_rawset(lua_State *L, int idx)[m
[31m-{[m
[31m-  GCtab *t = tabV(index2adr(L, idx));[m
[31m-  TValue *dst, *key;[m
[31m-  api_checknelems(L, 2);[m
[31m-  key = L->top-2;[m
[31m-  dst = lj_tab_set(L, t, key);[m
[31m-  copyTV(L, dst, key+1);[m
[31m-  lj_gc_anybarriert(L, t);[m
[31m-  L->top = key;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_rawseti(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  GCtab *t = tabV(index2adr(L, idx));[m
[31m-  TValue *dst, *src;[m
[31m-  api_checknelems(L, 1);[m
[31m-  dst = lj_tab_setint(L, t, n);[m
[31m-  src = L->top-1;[m
[31m-  copyTV(L, dst, src);[m
[31m-  lj_gc_barriert(L, t, dst);[m
[31m-  L->top = src;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_setmetatable(lua_State *L, int idx)[m
[31m-{[m
[31m-  global_State *g;[m
[31m-  GCtab *mt;[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  api_checknelems(L, 1);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  if (tvisnil(L->top-1)) {[m
[31m-    mt = NULL;[m
[31m-  } else {[m
[31m-    api_check(L, tvistab(L->top-1));[m
[31m-    mt = tabV(L->top-1);[m
[31m-  }[m
[31m-  g = G(L);[m
[31m-  if (tvistab(o)) {[m
[31m-    setgcref(tabV(o)->metatable, obj2gco(mt));[m
[31m-    if (mt)[m
[31m-      lj_gc_objbarriert(L, tabV(o), mt);[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    setgcref(udataV(o)->metatable, obj2gco(mt));[m
[31m-    if (mt)[m
[31m-      lj_gc_objbarrier(L, udataV(o), mt);[m
[31m-  } else {[m
[31m-    /* Flush cache, since traces specialize to basemt. But not during __gc. */[m
[31m-    if (lj_trace_flushall(L))[m
[31m-      lj_err_caller(L, LJ_ERR_NOGCMM);[m
[31m-    if (tvisbool(o)) {[m
[31m-      /* NOBARRIER: basemt is a GC root. */[m
[31m-      setgcref(basemt_it(g, LJ_TTRUE), obj2gco(mt));[m
[31m-      setgcref(basemt_it(g, LJ_TFALSE), obj2gco(mt));[m
[31m-    } else {[m
[31m-      /* NOBARRIER: basemt is a GC root. */[m
[31m-      setgcref(basemt_obj(g, o), obj2gco(mt));[m
[31m-    }[m
[31m-  }[m
[31m-  L->top--;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_setfenv(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  GCtab *t;[m
[31m-  api_checknelems(L, 1);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  api_check(L, tvistab(L->top-1));[m
[31m-  t = tabV(L->top-1);[m
[31m-  if (tvisfunc(o)) {[m
[31m-    setgcref(funcV(o)->c.env, obj2gco(t));[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    setgcref(udataV(o)->env, obj2gco(t));[m
[31m-  } else if (tvisthread(o)) {[m
[31m-    setgcref(threadV(o)->env, obj2gco(t));[m
[31m-  } else {[m
[31m-    L->top--;[m
[31m-    return 0;[m
[31m-  }[m
[31m-  lj_gc_objbarrier(L, gcV(o), t);[m
[31m-  L->top--;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_setupvalue(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  cTValue *f = index2adr(L, idx);[m
[31m-  TValue *val;[m
[31m-  const char *name;[m
[31m-  api_checknelems(L, 1);[m
[31m-  name = lj_debug_uvnamev(f, (uint32_t)(n-1), &val);[m
[31m-  if (name) {[m
[31m-    L->top--;[m
[31m-    copyTV(L, val, L->top);[m
[31m-    lj_gc_barrier(L, funcV(f), L->top);[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_FR2[m
[31m-static TValue *api_call_base(lua_State *L, int nargs)[m
[31m-{[m
[31m-  TValue *o = L->top, *base = o - nargs;[m
[31m-  L->top = o+1;[m
[31m-  for (; o > base; o--) copyTV(L, o, o-1);[m
[31m-  setnilV(o);[m
[31m-  return o+1;[m
[31m-}[m
[31m-#else[m
[31m-#define api_call_base(L, nargs)	(L->top - (nargs))[m
[31m-#endif[m
[31m-[m
[31m-LUA_API void lua_call(lua_State *L, int nargs, int nresults)[m
[31m-{[m
[31m-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);[m
[31m-  api_checknelems(L, nargs+1);[m
[31m-  lj_vm_call(L, api_call_base(L, nargs), nresults+1);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_pcall(lua_State *L, int nargs, int nresults, int errfunc)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  uint8_t oldh = hook_save(g);[m
[31m-  ptrdiff_t ef;[m
[31m-  int status;[m
[31m-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);[m
[31m-  api_checknelems(L, nargs+1);[m
[31m-  if (errfunc == 0) {[m
[31m-    ef = 0;[m
[31m-  } else {[m
[31m-    cTValue *o = stkindex2adr(L, errfunc);[m
[31m-    api_checkvalidindex(L, o);[m
[31m-    ef = savestack(L, o);[m
[31m-  }[m
[31m-  status = lj_vm_pcall(L, api_call_base(L, nargs), nresults+1, ef);[m
[31m-  if (status) hook_restore(g, oldh);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-static TValue *cpcall(lua_State *L, lua_CFunction func, void *ud)[m
[31m-{[m
[31m-  GCfunc *fn = lj_func_newC(L, 0, getcurrenv(L));[m
[31m-  TValue *top = L->top;[m
[31m-  fn->c.f = func;[m
[31m-  setfuncV(L, top++, fn);[m
[31m-  if (LJ_FR2) setnilV(top++);[m
[31m-  setlightudV(top++, checklightudptr(L, ud));[m
[31m-  cframe_nres(L->cframe) = 1+0;  /* Zero results. */[m
[31m-  L->top = top;[m
[31m-  return top-1;  /* Now call the newly allocated C function. */[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  uint8_t oldh = hook_save(g);[m
[31m-  int status;[m
[31m-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);[m
[31m-  status = lj_vm_cpcall(L, func, ud, cpcall);[m
[31m-  if (status) hook_restore(g, oldh);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_callmeta(lua_State *L, int idx, const char *field)[m
[31m-{[m
[31m-  if (luaL_getmetafield(L, idx, field)) {[m
[31m-    TValue *top = L->top--;[m
[31m-    if (LJ_FR2) setnilV(top++);[m
[31m-    copyTV(L, top++, index2adr(L, idx));[m
[31m-    L->top = top;[m
[31m-    lj_vm_call(L, top-1, 1+1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Coroutine yield and resume ------------------------------------------ */[m
[31m-[m
[31m-LUA_API int lua_yield(lua_State *L, int nresults)[m
[31m-{[m
[31m-  void *cf = L->cframe;[m
[31m-  global_State *g = G(L);[m
[31m-  if (cframe_canyield(cf)) {[m
[31m-    cf = cframe_raw(cf);[m
[31m-    if (!hook_active(g)) {  /* Regular yield: move results down if needed. */[m
[31m-      cTValue *f = L->top - nresults;[m
[31m-      if (f > L->base) {[m
[31m-	TValue *t = L->base;[m
[31m-	while (--nresults >= 0) copyTV(L, t++, f++);[m
[31m-	L->top = t;[m
[31m-      }[m
[31m-      L->cframe = NULL;[m
[31m-      L->status = LUA_YIELD;[m
[31m-      return -1;[m
[31m-    } else {  /* Yield from hook: add a pseudo-frame. */[m
[31m-      TValue *top = L->top;[m
[31m-      hook_leave(g);[m
[31m-      (top++)->u64 = cframe_multres(cf);[m
[31m-      setcont(top, lj_cont_hook);[m
[31m-      if (LJ_FR2) top++;[m
[31m-      setframe_pc(top, cframe_pc(cf)-1);[m
[31m-      if (LJ_FR2) top++;[m
[31m-      setframe_gc(top, obj2gco(L), LJ_TTHREAD);[m
[31m-      setframe_ftsz(top, ((char *)(top+1)-(char *)L->base)+FRAME_CONT);[m
[31m-      L->top = L->base = top+1;[m
[31m-#if LJ_TARGET_X64[m
[31m-      lj_err_throw(L, LUA_YIELD);[m
[31m-#else[m
[31m-      L->cframe = NULL;[m
[31m-      L->status = LUA_YIELD;[m
[31m-      lj_vm_unwind_c(cf, LUA_YIELD);[m
[31m-#endif[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_msg(L, LJ_ERR_CYIELD);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_resume(lua_State *L, int nargs)[m
[31m-{[m
[31m-  if (L->cframe == NULL && L->status <= LUA_YIELD)[m
[31m-    return lj_vm_resume(L,[m
[31m-      L->status == 0 ? api_call_base(L, nargs) : L->top - nargs,[m
[31m-      0, 0);[m
[31m-  L->top = L->base;[m
[31m-  setstrV(L, L->top, lj_err_str(L, LJ_ERR_COSUSP));[m
[31m-  incr_top(L);[m
[31m-  return LUA_ERRRUN;[m
[31m-}[m
[31m-[m
[31m-/* -- GC and memory management -------------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_gc(lua_State *L, int what, int data)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  int res = 0;[m
[31m-  switch (what) {[m
[31m-  case LUA_GCSTOP:[m
[31m-    g->gc.threshold = LJ_MAX_MEM;[m
[31m-    break;[m
[31m-  case LUA_GCRESTART:[m
[31m-    g->gc.threshold = data == -1 ? (g->gc.total/100)*g->gc.pause : g->gc.total;[m
[31m-    break;[m
[31m-  case LUA_GCCOLLECT:[m
[31m-    lj_gc_fullgc(L);[m
[31m-    break;[m
[31m-  case LUA_GCCOUNT:[m
[31m-    res = (int)(g->gc.total >> 10);[m
[31m-    break;[m
[31m-  case LUA_GCCOUNTB:[m
[31m-    res = (int)(g->gc.total & 0x3ff);[m
[31m-    break;[m
[31m-  case LUA_GCSTEP: {[m
[31m-    GCSize a = (GCSize)data << 10;[m
[31m-    g->gc.threshold = (a <= g->gc.total) ? (g->gc.total - a) : 0;[m
[31m-    while (g->gc.total >= g->gc.threshold)[m
[31m-      if (lj_gc_step(L) > 0) {[m
[31m-	res = 1;[m
[31m-	break;[m
[31m-      }[m
[31m-    break;[m
[31m-  }[m
[31m-  case LUA_GCSETPAUSE:[m
[31m-    res = (int)(g->gc.pause);[m
[31m-    g->gc.pause = (MSize)data;[m
[31m-    break;[m
[31m-  case LUA_GCSETSTEPMUL:[m
[31m-    res = (int)(g->gc.stepmul);[m
[31m-    g->gc.stepmul = (MSize)data;[m
[31m-    break;[m
[31m-  case LUA_GCISRUNNING:[m
[31m-    res = (g->gc.threshold != LJ_MAX_MEM);[m
[31m-    break;[m
[31m-  default:[m
[31m-    res = -1;  /* Invalid option. */[m
[31m-  }[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_Alloc lua_getallocf(lua_State *L, void **ud)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  if (ud) *ud = g->allocd;[m
[31m-  return g->allocf;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_setallocf(lua_State *L, lua_Alloc f, void *ud)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  g->allocd = ud;[m
[31m-  g->allocf = f;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_arch.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_arch.h[m
[1mdeleted file mode 100644[m
[1mindex b7105a9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_arch.h[m
[1m+++ /dev/null[m
[36m@@ -1,538 +0,0 @@[m
[31m-/*[m
[31m-** Target architecture selection.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_ARCH_H[m
[31m-#define _LJ_ARCH_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-/* Target endianess. */[m
[31m-#define LUAJIT_LE	0[m
[31m-#define LUAJIT_BE	1[m
[31m-[m
[31m-/* Target architectures. */[m
[31m-#define LUAJIT_ARCH_X86		1[m
[31m-#define LUAJIT_ARCH_x86		1[m
[31m-#define LUAJIT_ARCH_X64		2[m
[31m-#define LUAJIT_ARCH_x64		2[m
[31m-#define LUAJIT_ARCH_ARM		3[m
[31m-#define LUAJIT_ARCH_arm		3[m
[31m-#define LUAJIT_ARCH_ARM64	4[m
[31m-#define LUAJIT_ARCH_arm64	4[m
[31m-#define LUAJIT_ARCH_PPC		5[m
[31m-#define LUAJIT_ARCH_ppc		5[m
[31m-#define LUAJIT_ARCH_MIPS	6[m
[31m-#define LUAJIT_ARCH_mips	6[m
[31m-[m
[31m-/* Target OS. */[m
[31m-#define LUAJIT_OS_OTHER		0[m
[31m-#define LUAJIT_OS_WINDOWS	1[m
[31m-#define LUAJIT_OS_LINUX		2[m
[31m-#define LUAJIT_OS_OSX		3[m
[31m-#define LUAJIT_OS_BSD		4[m
[31m-#define LUAJIT_OS_POSIX		5[m
[31m-[m
[31m-/* Select native target if no target defined. */[m
[31m-#ifndef LUAJIT_TARGET[m
[31m-[m
[31m-#if defined(__i386) || defined(__i386__) || defined(_M_IX86)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_X86[m
[31m-#elif defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_X64[m
[31m-#elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_ARM[m
[31m-#elif defined(__aarch64__)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_ARM64[m
[31m-#elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_PPC[m
[31m-#elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_MIPS[m
[31m-#else[m
[31m-#error "No support for this architecture (yet)"[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Select native OS if no target OS defined. */[m
[31m-#ifndef LUAJIT_OS[m
[31m-[m
[31m-#if defined(_WIN32) && !defined(_XBOX_VER)[m
[31m-#define LUAJIT_OS	LUAJIT_OS_WINDOWS[m
[31m-#elif defined(__linux__)[m
[31m-#define LUAJIT_OS	LUAJIT_OS_LINUX[m
[31m-#elif defined(__MACH__) && defined(__APPLE__)[m
[31m-#define LUAJIT_OS	LUAJIT_OS_OSX[m
[31m-#elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \[m
[31m-       defined(__NetBSD__) || defined(__OpenBSD__) || \[m
[31m-       defined(__DragonFly__)) && !defined(__ORBIS__)[m
[31m-#define LUAJIT_OS	LUAJIT_OS_BSD[m
[31m-#elif (defined(__sun__) && defined(__svr4__))[m
[31m-#define LUAJIT_OS	LUAJIT_OS_POSIX[m
[31m-#elif defined(__CYGWIN__)[m
[31m-#define LJ_TARGET_CYGWIN	1[m
[31m-#define LUAJIT_OS	LUAJIT_OS_POSIX[m
[31m-#else[m
[31m-#define LUAJIT_OS	LUAJIT_OS_OTHER[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Set target OS properties. */[m
[31m-#if LUAJIT_OS == LUAJIT_OS_WINDOWS[m
[31m-#define LJ_OS_NAME	"Windows"[m
[31m-#elif LUAJIT_OS == LUAJIT_OS_LINUX[m
[31m-#define LJ_OS_NAME	"Linux"[m
[31m-#elif LUAJIT_OS == LUAJIT_OS_OSX[m
[31m-#define LJ_OS_NAME	"OSX"[m
[31m-#elif LUAJIT_OS == LUAJIT_OS_BSD[m
[31m-#define LJ_OS_NAME	"BSD"[m
[31m-#elif LUAJIT_OS == LUAJIT_OS_POSIX[m
[31m-#define LJ_OS_NAME	"POSIX"[m
[31m-#else[m
[31m-#define LJ_OS_NAME	"Other"[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_TARGET_WINDOWS	(LUAJIT_OS == LUAJIT_OS_WINDOWS)[m
[31m-#define LJ_TARGET_LINUX		(LUAJIT_OS == LUAJIT_OS_LINUX)[m
[31m-#define LJ_TARGET_OSX		(LUAJIT_OS == LUAJIT_OS_OSX)[m
[31m-#define LJ_TARGET_IOS		(LJ_TARGET_OSX && (LUAJIT_TARGET == LUAJIT_ARCH_ARM || LUAJIT_TARGET == LUAJIT_ARCH_ARM64))[m
[31m-#define LJ_TARGET_POSIX		(LUAJIT_OS > LUAJIT_OS_WINDOWS)[m
[31m-#define LJ_TARGET_DLOPEN	LJ_TARGET_POSIX[m
[31m-[m
[31m-#ifdef __CELLOS_LV2__[m
[31m-#define LJ_TARGET_PS3		1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#endif[m
[31m-[m
[31m-#ifdef __ORBIS__[m
[31m-#define LJ_TARGET_PS4		1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#undef NULL[m
[31m-#define NULL ((void*)0)[m
[31m-#endif[m
[31m-[m
[31m-#ifdef __psp2__[m
[31m-#define LJ_TARGET_PSVITA	1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#endif[m
[31m-[m
[31m-#if _XBOX_VER >= 200[m
[31m-#define LJ_TARGET_XBOX360	1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#endif[m
[31m-[m
[31m-#ifdef _DURANGO[m
[31m-#define LJ_TARGET_XBOXONE	1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#define LJ_TARGET_GC64		1[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_NUMMODE_SINGLE	0	/* Single-number mode only. */[m
[31m-#define LJ_NUMMODE_SINGLE_DUAL	1	/* Default to single-number mode. */[m
[31m-#define LJ_NUMMODE_DUAL		2	/* Dual-number mode only. */[m
[31m-#define LJ_NUMMODE_DUAL_SINGLE	3	/* Default to dual-number mode. */[m
[31m-[m
[31m-/* Set target architecture properties. */[m
[31m-#if LUAJIT_TARGET == LUAJIT_ARCH_X86[m
[31m-[m
[31m-#define LJ_ARCH_NAME		"x86"[m
[31m-#define LJ_ARCH_BITS		32[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN[m
[31m-#define LJ_ABI_WIN		1[m
[31m-#else[m
[31m-#define LJ_ABI_WIN		0[m
[31m-#endif[m
[31m-#define LJ_TARGET_X86		1[m
[31m-#define LJ_TARGET_X86ORX64	1[m
[31m-#define LJ_TARGET_EHRETREG	0[m
[31m-#define LJ_TARGET_MASKSHIFT	1[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNALIGNED	1[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_SINGLE_DUAL[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_X64[m
[31m-[m
[31m-#define LJ_ARCH_NAME		"x64"[m
[31m-#define LJ_ARCH_BITS		64[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN[m
[31m-#define LJ_ABI_WIN		1[m
[31m-#else[m
[31m-#define LJ_ABI_WIN		0[m
[31m-#endif[m
[31m-#define LJ_TARGET_X64		1[m
[31m-#define LJ_TARGET_X86ORX64	1[m
[31m-#define LJ_TARGET_EHRETREG	0[m
[31m-#define LJ_TARGET_JUMPRANGE	31	/* +-2^31 = +-2GB */[m
[31m-#define LJ_TARGET_MASKSHIFT	1[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNALIGNED	1[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_SINGLE_DUAL[m
[31m-#ifdef LUAJIT_ENABLE_GC64[m
[31m-#define LJ_TARGET_GC64		1[m
[31m-#endif[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM[m
[31m-[m
[31m-#define LJ_ARCH_NAME		"arm"[m
[31m-#define LJ_ARCH_BITS		32[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#if !defined(LJ_ARCH_HASFPU) && __SOFTFP__[m
[31m-#define LJ_ARCH_HASFPU		0[m
[31m-#endif[m
[31m-#if !defined(LJ_ABI_SOFTFP) && !__ARM_PCS_VFP[m
[31m-#define LJ_ABI_SOFTFP		1[m
[31m-#endif[m
[31m-#define LJ_ABI_EABI		1[m
[31m-#define LJ_TARGET_ARM		1[m
[31m-#define LJ_TARGET_EHRETREG	0[m
[31m-#define LJ_TARGET_JUMPRANGE	25	/* +-2^25 = +-32MB */[m
[31m-#define LJ_TARGET_MASKSHIFT	0[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL[m
[31m-[m
[31m-#if __ARM_ARCH____ARM_ARCH_8__ || __ARM_ARCH_8A__[m
[31m-#define LJ_ARCH_VERSION		80[m
[31m-#elif __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__[m
[31m-#define LJ_ARCH_VERSION		70[m
[31m-#elif __ARM_ARCH_6T2__[m
[31m-#define LJ_ARCH_VERSION		61[m
[31m-#elif __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__[m
[31m-#define LJ_ARCH_VERSION		60[m
[31m-#else[m
[31m-#define LJ_ARCH_VERSION		50[m
[31m-#endif[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM64[m
[31m-[m
[31m-#define LJ_ARCH_NAME		"arm64"[m
[31m-#define LJ_ARCH_BITS		64[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#define LJ_TARGET_ARM64		1[m
[31m-#define LJ_TARGET_EHRETREG	0[m
[31m-#define LJ_TARGET_JUMPRANGE	27	/* +-2^27 = +-128MB */[m
[31m-#define LJ_TARGET_MASKSHIFT	1[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */[m
[31m-#define LJ_TARGET_GC64		1[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL[m
[31m-#define LJ_ARCH_NOJIT		1	/* NYI */[m
[31m-[m
[31m-#define LJ_ARCH_VERSION		80[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_PPC[m
[31m-[m
[31m-#ifndef LJ_ARCH_ENDIAN[m
[31m-#if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#else[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_BE[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if _LP64[m
[31m-#define LJ_ARCH_BITS		64[m
[31m-#if LJ_ARCH_ENDIAN == LUAJIT_LE[m
[31m-#define LJ_ARCH_NAME		"ppc64le"[m
[31m-#else[m
[31m-#define LJ_ARCH_NAME		"ppc64"[m
[31m-#endif[m
[31m-#else[m
[31m-#define LJ_ARCH_BITS		32[m
[31m-#define LJ_ARCH_NAME		"ppc"[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_TARGET_PPC		1[m
[31m-#define LJ_TARGET_EHRETREG	3[m
[31m-#define LJ_TARGET_JUMPRANGE	25	/* +-2^25 = +-32MB */[m
[31m-#define LJ_TARGET_MASKSHIFT	0[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNIFYROT	1	/* Want only IR_BROL. */[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL_SINGLE[m
[31m-[m
[31m-#if LJ_TARGET_CONSOLE[m
[31m-#define LJ_ARCH_PPC32ON64	1[m
[31m-#define LJ_ARCH_NOFFI		1[m
[31m-#elif LJ_ARCH_BITS == 64[m
[31m-#define LJ_ARCH_PPC64		1[m
[31m-#define LJ_TARGET_GC64		1[m
[31m-#define LJ_ARCH_NOJIT		1	/* NYI */[m
[31m-#endif[m
[31m-[m
[31m-#if _ARCH_PWR7[m
[31m-#define LJ_ARCH_VERSION		70[m
[31m-#elif _ARCH_PWR6[m
[31m-#define LJ_ARCH_VERSION		60[m
[31m-#elif _ARCH_PWR5X[m
[31m-#define LJ_ARCH_VERSION		51[m
[31m-#elif _ARCH_PWR5[m
[31m-#define LJ_ARCH_VERSION		50[m
[31m-#elif _ARCH_PWR4[m
[31m-#define LJ_ARCH_VERSION		40[m
[31m-#else[m
[31m-#define LJ_ARCH_VERSION		0[m
[31m-#endif[m
[31m-#if _ARCH_PPCSQ[m
[31m-#define LJ_ARCH_SQRT		1[m
[31m-#endif[m
[31m-#if _ARCH_PWR5X[m
[31m-#define LJ_ARCH_ROUND		1[m
[31m-#endif[m
[31m-#if __PPU__[m
[31m-#define LJ_ARCH_CELL		1[m
[31m-#endif[m
[31m-#if LJ_TARGET_XBOX360[m
[31m-#define LJ_ARCH_XENON		1[m
[31m-#endif[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS[m
[31m-[m
[31m-#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL)[m
[31m-#define LJ_ARCH_NAME		"mipsel"[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#else[m
[31m-#define LJ_ARCH_NAME		"mips"[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_BE[m
[31m-#endif[m
[31m-[m
[31m-#if !defined(LJ_ARCH_HASFPU)[m
[31m-#ifdef __mips_soft_float[m
[31m-#define LJ_ARCH_HASFPU		0[m
[31m-#else[m
[31m-#define LJ_ARCH_HASFPU		1[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Temporarily disable features until the code has been merged. */[m
[31m-#if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__[m
[31m-#define LUAJIT_NO_UNWIND	1[m
[31m-#endif[m
[31m-[m
[31m-#if !defined(LJ_ABI_SOFTFP)[m
[31m-#ifdef __mips_soft_float[m
[31m-#define LJ_ABI_SOFTFP		1[m
[31m-#else[m
[31m-#define LJ_ABI_SOFTFP		0[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_ARCH_BITS		32[m
[31m-#define LJ_TARGET_MIPS		1[m
[31m-#define LJ_TARGET_EHRETREG	4[m
[31m-#define LJ_TARGET_JUMPRANGE	27	/* 2*2^27 = 256MB-aligned region */[m
[31m-#define LJ_TARGET_MASKSHIFT	1[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL[m
[31m-[m
[31m-#if _MIPS_ARCH_MIPS32R2[m
[31m-#define LJ_ARCH_VERSION		20[m
[31m-#else[m
[31m-#define LJ_ARCH_VERSION		10[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-#error "No target architecture defined"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef LJ_PAGESIZE[m
[31m-#define LJ_PAGESIZE		4096[m
[31m-#endif[m
[31m-[m
[31m-/* Check for minimum required compiler versions. */[m
[31m-#if defined(__GNUC__)[m
[31m-#if LJ_TARGET_X86[m
[31m-#if (__GNUC__ < 3) || ((__GNUC__ == 3) && __GNUC_MINOR__ < 4)[m
[31m-#error "Need at least GCC 3.4 or newer"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_X64[m
[31m-#if 0 && __GNUC__ < 4[m
[31m-#error "Need at least GCC 4.0 or newer"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)[m
[31m-#error "Need at least GCC 4.2 or newer"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#if __clang__[m
[31m-#if (__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)[m
[31m-#error "Need at least Clang 3.5 or newer"[m
[31m-#endif[m
[31m-#else[m
[31m-#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 8)[m
[31m-#error "Need at least GCC 4.8 or newer"[m
[31m-#endif[m
[31m-#endif[m
[31m-#elif !LJ_TARGET_PS3[m
[31m-#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3)[m
[31m-#error "Need at least GCC 4.3 or newer"[m
[31m-#endif[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Check target-specific constraints. */[m
[31m-#ifndef _BUILDVM_H[m
[31m-#if LJ_TARGET_X64[m
[31m-#if __USING_SJLJ_EXCEPTIONS__[m
[31m-#error "Need a C compiler with native exception handling on x64"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#if defined(__ARMEB__)[m
[31m-#error "No support for big-endian ARM"[m
[31m-#endif[m
[31m-#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__[m
[31m-#error "No support for Cortex-M CPUs"[m
[31m-#endif[m
[31m-#if !(__ARM_EABI__ || LJ_TARGET_IOS)[m
[31m-#error "Only ARM EABI or iOS 3.0+ ABI is supported"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#if defined(__AARCH64EB__)[m
[31m-#error "No support for big-endian ARM64"[m
[31m-#endif[m
[31m-#if defined(_ILP32)[m
[31m-#error "No support for ILP32 model on ARM64"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE)[m
[31m-#error "No support for PowerPC CPUs without double-precision FPU"[m
[31m-#endif[m
[31m-#if !LJ_ARCH_PPC64 && LJ_ARCH_ENDIAN == LUAJIT_LE[m
[31m-#error "No support for little-endian PPC32"[m
[31m-#endif[m
[31m-#if LJ_ARCH_PPC64[m
[31m-#error "No support for PowerPC 64 bit mode (yet)"[m
[31m-#endif[m
[31m-#ifdef __NO_FPRS__[m
[31m-#error "No support for PPC/e500 anymore (use LuaJIT 2.0)"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#if defined(_LP64)[m
[31m-#error "No support for MIPS64"[m
[31m-#endif[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Enable or disable the dual-number mode for the VM. */[m
[31m-#if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \[m
[31m-    (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL && LUAJIT_NUMMODE == 1)[m
[31m-#error "No support for this number mode on this architecture"[m
[31m-#endif[m
[31m-#if LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL || \[m
[31m-    (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL_SINGLE && LUAJIT_NUMMODE != 1) || \[m
[31m-    (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE_DUAL && LUAJIT_NUMMODE == 2)[m
[31m-#define LJ_DUALNUM		1[m
[31m-#else[m
[31m-#define LJ_DUALNUM		0[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_IOS || LJ_TARGET_CONSOLE[m
[31m-/* Runtime code generation is restricted on iOS. Complain to Apple, not me. */[m
[31m-/* Ditto for the consoles. Complain to Sony or MS, not me. */[m
[31m-#ifndef LUAJIT_ENABLE_JIT[m
[31m-#define LJ_OS_NOJIT		1[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* 64 bit GC references. */[m
[31m-#if LJ_TARGET_GC64[m
[31m-#define LJ_GC64			1[m
[31m-#else[m
[31m-#define LJ_GC64			0[m
[31m-#endif[m
[31m-[m
[31m-/* 2-slot frame info. */[m
[31m-#if LJ_GC64[m
[31m-#define LJ_FR2			1[m
[31m-#else[m
[31m-#define LJ_FR2			0[m
[31m-#endif[m
[31m-[m
[31m-/* Disable or enable the JIT compiler. */[m
[31m-#if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) || LJ_FR2 || LJ_GC64[m
[31m-#define LJ_HASJIT		0[m
[31m-#else[m
[31m-#define LJ_HASJIT		1[m
[31m-#endif[m
[31m-[m
[31m-/* Disable or enable the FFI extension. */[m
[31m-#if defined(LUAJIT_DISABLE_FFI) || defined(LJ_ARCH_NOFFI)[m
[31m-#define LJ_HASFFI		0[m
[31m-#else[m
[31m-#define LJ_HASFFI		1[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUAJIT_DISABLE_PROFILE)[m
[31m-#define LJ_HASPROFILE		0[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-#define LJ_HASPROFILE		1[m
[31m-#define LJ_PROFILE_SIGPROF	1[m
[31m-#elif LJ_TARGET_PS3[m
[31m-#define LJ_HASPROFILE		1[m
[31m-#define LJ_PROFILE_PTHREAD	1[m
[31m-#elif LJ_TARGET_WINDOWS || LJ_TARGET_XBOX360[m
[31m-#define LJ_HASPROFILE		1[m
[31m-#define LJ_PROFILE_WTHREAD	1[m
[31m-#else[m
[31m-#define LJ_HASPROFILE		0[m
[31m-#endif[m
[31m-[m
[31m-#ifndef LJ_ARCH_HASFPU[m
[31m-#define LJ_ARCH_HASFPU		1[m
[31m-#endif[m
[31m-#ifndef LJ_ABI_SOFTFP[m
[31m-#define LJ_ABI_SOFTFP		0[m
[31m-#endif[m
[31m-#define LJ_SOFTFP		(!LJ_ARCH_HASFPU)[m
[31m-[m
[31m-#if LJ_ARCH_ENDIAN == LUAJIT_BE[m
[31m-#define LJ_LE			0[m
[31m-#define LJ_BE			1[m
[31m-#define LJ_ENDIAN_SELECT(le, be)	be[m
[31m-#define LJ_ENDIAN_LOHI(lo, hi)		hi lo[m
[31m-#else[m
[31m-#define LJ_LE			1[m
[31m-#define LJ_BE			0[m
[31m-#define LJ_ENDIAN_SELECT(le, be)	le[m
[31m-#define LJ_ENDIAN_LOHI(lo, hi)		lo hi[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_ARCH_BITS == 32[m
[31m-#define LJ_32			1[m
[31m-#define LJ_64			0[m
[31m-#else[m
[31m-#define LJ_32			0[m
[31m-#define LJ_64			1[m
[31m-#endif[m
[31m-[m
[31m-#ifndef LJ_TARGET_UNALIGNED[m
[31m-#define LJ_TARGET_UNALIGNED	0[m
[31m-#endif[m
[31m-[m
[31m-/* Various workarounds for embedded operating systems or weak C runtimes. */[m
[31m-#if defined(__ANDROID__) || defined(__symbian__) || LJ_TARGET_XBOX360 || LJ_TARGET_WINDOWS[m
[31m-#define LUAJIT_NO_LOG2[m
[31m-#endif[m
[31m-#if defined(__symbian__) || LJ_TARGET_WINDOWS[m
[31m-#define LUAJIT_NO_EXP2[m
[31m-#endif[m
[31m-#if LJ_TARGET_CONSOLE || (LJ_TARGET_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0)[m
[31m-#define LJ_NO_SYSTEM		1[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4[m
[31m-#define LJ_NO_UNWIND		1[m
[31m-#endif[m
[31m-[m
[31m-/* Compatibility with Lua 5.1 vs. 5.2. */[m
[31m-#ifdef LUAJIT_ENABLE_LUA52COMPAT[m
[31m-#define LJ_52			1[m
[31m-#else[m
[31m-#define LJ_52			0[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.c[m
[1mdeleted file mode 100644[m
[1mindex 94d7bfc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.c[m
[1m+++ /dev/null[m
[36m@@ -1,2288 +0,0 @@[m
[31m-/*[m
[31m-** IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_asm_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_frame.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_mcode.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_asm.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_target.h"[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-#include <stdio.h>[m
[31m-#endif[m
[31m-[m
[31m-/* -- Assembler state and common macros ----------------------------------- */[m
[31m-[m
[31m-/* Assembler state. */[m
[31m-typedef struct ASMState {[m
[31m-  RegCost cost[RID_MAX];  /* Reference and blended allocation cost for regs. */[m
[31m-[m
[31m-  MCode *mcp;		/* Current MCode pointer (grows down). */[m
[31m-  MCode *mclim;		/* Lower limit for MCode memory + red zone. */[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  MCode *mcp_prev;	/* Red zone overflow check. */[m
[31m-#endif[m
[31m-[m
[31m-  IRIns *ir;		/* Copy of pointer to IR instructions/constants. */[m
[31m-  jit_State *J;		/* JIT compiler state. */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  x86ModRM mrm;		/* Fused x86 address operand. */[m
[31m-#endif[m
[31m-[m
[31m-  RegSet freeset;	/* Set of free registers. */[m
[31m-  RegSet modset;	/* Set of registers modified inside the loop. */[m
[31m-  RegSet weakset;	/* Set of weakly referenced registers. */[m
[31m-  RegSet phiset;	/* Set of PHI registers. */[m
[31m-[m
[31m-  uint32_t flags;	/* Copy of JIT compiler flags. */[m
[31m-  int loopinv;		/* Loop branch inversion (0:no, 1:yes, 2:yes+CC_P). */[m
[31m-[m
[31m-  int32_t evenspill;	/* Next even spill slot. */[m
[31m-  int32_t oddspill;	/* Next odd spill slot (or 0). */[m
[31m-[m
[31m-  IRRef curins;		/* Reference of current instruction. */[m
[31m-  IRRef stopins;	/* Stop assembly before hitting this instruction. */[m
[31m-  IRRef orignins;	/* Original T->nins. */[m
[31m-[m
[31m-  IRRef snapref;	/* Current snapshot is active after this reference. */[m
[31m-  IRRef snaprename;	/* Rename highwater mark for snapshot check. */[m
[31m-  SnapNo snapno;	/* Current snapshot number. */[m
[31m-  SnapNo loopsnapno;	/* Loop snapshot number. */[m
[31m-[m
[31m-  IRRef fuseref;	/* Fusion limit (loopref, 0 or FUSE_DISABLED). */[m
[31m-  IRRef sectref;	/* Section base reference (loopref or 0). */[m
[31m-  IRRef loopref;	/* Reference of LOOP instruction (or 0). */[m
[31m-[m
[31m-  BCReg topslot;	/* Number of slots for stack check (unless 0). */[m
[31m-  int32_t gcsteps;	/* Accumulated number of GC steps (per section). */[m
[31m-[m
[31m-  GCtrace *T;		/* Trace to assemble. */[m
[31m-  GCtrace *parent;	/* Parent trace (or NULL). */[m
[31m-[m
[31m-  MCode *mcbot;		/* Bottom of reserved MCode. */[m
[31m-  MCode *mctop;		/* Top of generated MCode. */[m
[31m-  MCode *mcloop;	/* Pointer to loop MCode (or NULL). */[m
[31m-  MCode *invmcp;	/* Points to invertible loop branch (or NULL). */[m
[31m-  MCode *flagmcp;	/* Pending opportunity to merge flag setting ins. */[m
[31m-  MCode *realign;	/* Realign loop if not NULL. */[m
[31m-[m
[31m-#ifdef RID_NUM_KREF[m
[31m-  int32_t krefk[RID_NUM_KREF];[m
[31m-#endif[m
[31m-  IRRef1 phireg[RID_MAX];  /* PHI register references. */[m
[31m-  uint16_t parentmap[LJ_MAX_JSLOTS];  /* Parent instruction to RegSP map. */[m
[31m-} ASMState;[m
[31m-[m
[31m-#define IR(ref)			(&as->ir[(ref)])[m
[31m-[m
[31m-#define ASMREF_TMP1		REF_TRUE	/* Temp. register. */[m
[31m-#define ASMREF_TMP2		REF_FALSE	/* Temp. register. */[m
[31m-#define ASMREF_L		REF_NIL		/* Stores register for L. */[m
[31m-[m
[31m-/* Check for variant to invariant references. */[m
[31m-#define iscrossref(as, ref)	((ref) < as->sectref)[m
[31m-[m
[31m-/* Inhibit memory op fusion from variant to invariant references. */[m
[31m-#define FUSE_DISABLED		(~(IRRef)0)[m
[31m-#define mayfuse(as, ref)	((ref) > as->fuseref)[m
[31m-#define neverfuse(as)		(as->fuseref == FUSE_DISABLED)[m
[31m-#define canfuse(as, ir)		(!neverfuse(as) && !irt_isphi((ir)->t))[m
[31m-#define opisfusableload(o) \[m
[31m-  ((o) == IR_ALOAD || (o) == IR_HLOAD || (o) == IR_ULOAD || \[m
[31m-   (o) == IR_FLOAD || (o) == IR_XLOAD || (o) == IR_SLOAD || (o) == IR_VLOAD)[m
[31m-[m
[31m-/* Sparse limit checks using a red zone before the actual limit. */[m
[31m-#define MCLIM_REDZONE	64[m
[31m-[m
[31m-static LJ_NORET LJ_NOINLINE void asm_mclimit(ASMState *as)[m
[31m-{[m
[31m-  lj_mcode_limiterr(as->J, (size_t)(as->mctop - as->mcp + 4*MCLIM_REDZONE));[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void checkmclim(ASMState *as)[m
[31m-{[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  if (as->mcp + MCLIM_REDZONE < as->mcp_prev) {[m
[31m-    IRIns *ir = IR(as->curins+1);[m
[31m-    fprintf(stderr, "RED ZONE OVERFLOW: %p IR %04d  %02d %04d %04d\n", as->mcp,[m
[31m-	    as->curins+1-REF_BIAS, ir->o, ir->op1-REF_BIAS, ir->op2-REF_BIAS);[m
[31m-    lua_assert(0);[m
[31m-  }[m
[31m-#endif[m
[31m-  if (LJ_UNLIKELY(as->mcp < as->mclim)) asm_mclimit(as);[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  as->mcp_prev = as->mcp;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#ifdef RID_NUM_KREF[m
[31m-#define ra_iskref(ref)		((ref) < RID_NUM_KREF)[m
[31m-#define ra_krefreg(ref)		((Reg)(RID_MIN_KREF + (Reg)(ref)))[m
[31m-#define ra_krefk(as, ref)	(as->krefk[(ref)])[m
[31m-[m
[31m-static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, int32_t k)[m
[31m-{[m
[31m-  IRRef ref = (IRRef)(r - RID_MIN_KREF);[m
[31m-  as->krefk[ref] = k;[m
[31m-  as->cost[r] = REGCOST(ref, ref);[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-#define ra_iskref(ref)		0[m
[31m-#define ra_krefreg(ref)		RID_MIN_GPR[m
[31m-#define ra_krefk(as, ref)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Arch-specific field offsets. */[m
[31m-static const uint8_t field_ofs[IRFL__MAX+1] = {[m
[31m-#define FLOFS(name, ofs)	(uint8_t)(ofs),[m
[31m-IRFLDEF(FLOFS)[m
[31m-#undef FLOFS[m
[31m-  0[m
[31m-};[m
[31m-[m
[31m-/* -- Target-specific instruction emitter --------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#include "lj_emit_x86.h"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#include "lj_emit_arm.h"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#include "lj_emit_ppc.h"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#include "lj_emit_mips.h"[m
[31m-#else[m
[31m-#error "Missing instruction emitter for target CPU"[m
[31m-#endif[m
[31m-[m
[31m-/* Generic load/store of register from/to stack slot. */[m
[31m-#define emit_spload(as, ir, r, ofs) \[m
[31m-  emit_loadofs(as, ir, (r), RID_SP, (ofs))[m
[31m-#define emit_spstore(as, ir, r, ofs) \[m
[31m-  emit_storeofs(as, ir, (r), RID_SP, (ofs))[m
[31m-[m
[31m-/* -- Register allocator debugging ---------------------------------------- */[m
[31m-[m
[31m-/* #define LUAJIT_DEBUG_RA */[m
[31m-[m
[31m-#ifdef LUAJIT_DEBUG_RA[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#define RIDNAME(name)	#name,[m
[31m-static const char *const ra_regname[] = {[m
[31m-  GPRDEF(RIDNAME)[m
[31m-  FPRDEF(RIDNAME)[m
[31m-  VRIDDEF(RIDNAME)[m
[31m-  NULL[m
[31m-};[m
[31m-#undef RIDNAME[m
[31m-[m
[31m-static char ra_dbg_buf[65536];[m
[31m-static char *ra_dbg_p;[m
[31m-static char *ra_dbg_merge;[m
[31m-static MCode *ra_dbg_mcp;[m
[31m-[m
[31m-static void ra_dstart(void)[m
[31m-{[m
[31m-  ra_dbg_p = ra_dbg_buf;[m
[31m-  ra_dbg_merge = NULL;[m
[31m-  ra_dbg_mcp = NULL;[m
[31m-}[m
[31m-[m
[31m-static void ra_dflush(void)[m
[31m-{[m
[31m-  fwrite(ra_dbg_buf, 1, (size_t)(ra_dbg_p-ra_dbg_buf), stdout);[m
[31m-  ra_dstart();[m
[31m-}[m
[31m-[m
[31m-static void ra_dprintf(ASMState *as, const char *fmt, ...)[m
[31m-{[m
[31m-  char *p;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  p = ra_dbg_mcp == as->mcp ? ra_dbg_merge : ra_dbg_p;[m
[31m-  ra_dbg_mcp = NULL;[m
[31m-  p += sprintf(p, "%08x  \e[36m%04d ", (uintptr_t)as->mcp, as->curins-REF_BIAS);[m
[31m-  for (;;) {[m
[31m-    const char *e = strchr(fmt, '$');[m
[31m-    if (e == NULL) break;[m
[31m-    memcpy(p, fmt, (size_t)(e-fmt));[m
[31m-    p += e-fmt;[m
[31m-    if (e[1] == 'r') {[m
[31m-      Reg r = va_arg(argp, Reg) & RID_MASK;[m
[31m-      if (r <= RID_MAX) {[m
[31m-	const char *q;[m
[31m-	for (q = ra_regname[r]; *q; q++)[m
[31m-	  *p++ = *q >= 'A' && *q <= 'Z' ? *q + 0x20 : *q;[m
[31m-      } else {[m
[31m-	*p++ = '?';[m
[31m-	lua_assert(0);[m
[31m-      }[m
[31m-    } else if (e[1] == 'f' || e[1] == 'i') {[m
[31m-      IRRef ref;[m
[31m-      if (e[1] == 'f')[m
[31m-	ref = va_arg(argp, IRRef);[m
[31m-      else[m
[31m-	ref = va_arg(argp, IRIns *) - as->ir;[m
[31m-      if (ref >= REF_BIAS)[m
[31m-	p += sprintf(p, "%04d", ref - REF_BIAS);[m
[31m-      else[m
[31m-	p += sprintf(p, "K%03d", REF_BIAS - ref);[m
[31m-    } else if (e[1] == 's') {[m
[31m-      uint32_t slot = va_arg(argp, uint32_t);[m
[31m-      p += sprintf(p, "[sp+0x%x]", sps_scale(slot));[m
[31m-    } else if (e[1] == 'x') {[m
[31m-      p += sprintf(p, "%08x", va_arg(argp, int32_t));[m
[31m-    } else {[m
[31m-      lua_assert(0);[m
[31m-    }[m
[31m-    fmt = e+2;[m
[31m-  }[m
[31m-  va_end(argp);[m
[31m-  while (*fmt)[m
[31m-    *p++ = *fmt++;[m
[31m-  *p++ = '\e'; *p++ = '['; *p++ = 'm'; *p++ = '\n';[m
[31m-  if (p > ra_dbg_buf+sizeof(ra_dbg_buf)-256) {[m
[31m-    fwrite(ra_dbg_buf, 1, (size_t)(p-ra_dbg_buf), stdout);[m
[31m-    p = ra_dbg_buf;[m
[31m-  }[m
[31m-  ra_dbg_p = p;[m
[31m-}[m
[31m-[m
[31m-#define RA_DBG_START()	ra_dstart()[m
[31m-#define RA_DBG_FLUSH()	ra_dflush()[m
[31m-#define RA_DBG_REF() \[m
[31m-  do { char *_p = ra_dbg_p; ra_dprintf(as, ""); \[m
[31m-       ra_dbg_merge = _p; ra_dbg_mcp = as->mcp; } while (0)[m
[31m-#define RA_DBGX(x)	ra_dprintf x[m
[31m-[m
[31m-#else[m
[31m-#define RA_DBG_START()	((void)0)[m
[31m-#define RA_DBG_FLUSH()	((void)0)[m
[31m-#define RA_DBG_REF()	((void)0)[m
[31m-#define RA_DBGX(x)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Register allocator -------------------------------------------------- */[m
[31m-[m
[31m-#define ra_free(as, r)		rset_set(as->freeset, (r))[m
[31m-#define ra_modified(as, r)	rset_set(as->modset, (r))[m
[31m-#define ra_weak(as, r)		rset_set(as->weakset, (r))[m
[31m-#define ra_noweak(as, r)	rset_clear(as->weakset, (r))[m
[31m-[m
[31m-#define ra_used(ir)		(ra_hasreg((ir)->r) || ra_hasspill((ir)->s))[m
[31m-[m
[31m-/* Setup register allocator. */[m
[31m-static void ra_setup(ASMState *as)[m
[31m-{[m
[31m-  Reg r;[m
[31m-  /* Initially all regs (except the stack pointer) are free for use. */[m
[31m-  as->freeset = RSET_INIT;[m
[31m-  as->modset = RSET_EMPTY;[m
[31m-  as->weakset = RSET_EMPTY;[m
[31m-  as->phiset = RSET_EMPTY;[m
[31m-  memset(as->phireg, 0, sizeof(as->phireg));[m
[31m-  for (r = RID_MIN_GPR; r < RID_MAX; r++)[m
[31m-    as->cost[r] = REGCOST(~0u, 0u);[m
[31m-}[m
[31m-[m
[31m-/* Rematerialize constants. */[m
[31m-static Reg ra_rematk(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  Reg r;[m
[31m-  if (ra_iskref(ref)) {[m
[31m-    r = ra_krefreg(ref);[m
[31m-    lua_assert(!rset_test(as->freeset, r));[m
[31m-    ra_free(as, r);[m
[31m-    ra_modified(as, r);[m
[31m-    emit_loadi(as, r, ra_krefk(as, ref));[m
[31m-    return r;[m
[31m-  }[m
[31m-  ir = IR(ref);[m
[31m-  r = ir->r;[m
[31m-  lua_assert(ra_hasreg(r) && !ra_hasspill(ir->s));[m
[31m-  ra_free(as, r);[m
[31m-  ra_modified(as, r);[m
[31m-  ir->r = RID_INIT;  /* Do not keep any hint. */[m
[31m-  RA_DBGX((as, "remat     $i $r", ir, r));[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (ir->o == IR_KNUM) {[m
[31m-    emit_loadn(as, r, ir_knum(ir));[m
[31m-  } else[m
[31m-#endif[m
[31m-  if (emit_canremat(REF_BASE) && ir->o == IR_BASE) {[m
[31m-    ra_sethint(ir->r, RID_BASE);  /* Restore BASE register hint. */[m
[31m-    emit_getgl(as, r, jit_base);[m
[31m-  } else if (emit_canremat(ASMREF_L) && ir->o == IR_KPRI) {[m
[31m-    lua_assert(irt_isnil(ir->t));  /* REF_NIL stores ASMREF_L register. */[m
[31m-    emit_getgl(as, r, cur_L);[m
[31m-#if LJ_64[m
[31m-  } else if (ir->o == IR_KINT64) {[m
[31m-    emit_loadu64(as, r, ir_kint64(ir)->u64);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||[m
[31m-	       ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL);[m
[31m-    emit_loadi(as, r, ir->i);[m
[31m-  }[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Force a spill. Allocate a new spill slot if needed. */[m
[31m-static int32_t ra_spill(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t slot = ir->s;[m
[31m-  lua_assert(ir >= as->ir + REF_TRUE);[m
[31m-  if (!ra_hasspill(slot)) {[m
[31m-    if (irt_is64(ir->t)) {[m
[31m-      slot = as->evenspill;[m
[31m-      as->evenspill += 2;[m
[31m-    } else if (as->oddspill) {[m
[31m-      slot = as->oddspill;[m
[31m-      as->oddspill = 0;[m
[31m-    } else {[m
[31m-      slot = as->evenspill;[m
[31m-      as->oddspill = slot+1;[m
[31m-      as->evenspill += 2;[m
[31m-    }[m
[31m-    if (as->evenspill > 256)[m
[31m-      lj_trace_err(as->J, LJ_TRERR_SPILLOV);[m
[31m-    ir->s = (uint8_t)slot;[m
[31m-  }[m
[31m-  return sps_scale(slot);[m
[31m-}[m
[31m-[m
[31m-/* Release the temporarily allocated register in ASMREF_TMP1/ASMREF_TMP2. */[m
[31m-static Reg ra_releasetmp(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  Reg r = ir->r;[m
[31m-  lua_assert(ra_hasreg(r) && !ra_hasspill(ir->s));[m
[31m-  ra_free(as, r);[m
[31m-  ra_modified(as, r);[m
[31m-  ir->r = RID_INIT;[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Restore a register (marked as free). Rematerialize or force a spill. */[m
[31m-static Reg ra_restore(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  if (emit_canremat(ref)) {[m
[31m-    return ra_rematk(as, ref);[m
[31m-  } else {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    int32_t ofs = ra_spill(as, ir);  /* Force a spill slot. */[m
[31m-    Reg r = ir->r;[m
[31m-    lua_assert(ra_hasreg(r));[m
[31m-    ra_sethint(ir->r, r);  /* Keep hint. */[m
[31m-    ra_free(as, r);[m
[31m-    if (!rset_test(as->weakset, r)) {  /* Only restore non-weak references. */[m
[31m-      ra_modified(as, r);[m
[31m-      RA_DBGX((as, "restore   $i $r", ir, r));[m
[31m-      emit_spload(as, ir, r, ofs);[m
[31m-    }[m
[31m-    return r;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Save a register to a spill slot. */[m
[31m-static void ra_save(ASMState *as, IRIns *ir, Reg r)[m
[31m-{[m
[31m-  RA_DBGX((as, "save      $i $r", ir, r));[m
[31m-  emit_spstore(as, ir, r, sps_scale(ir->s));[m
[31m-}[m
[31m-[m
[31m-#define MINCOST(name) \[m
[31m-  if (rset_test(RSET_ALL, RID_##name) && \[m
[31m-      LJ_LIKELY(allow&RID2RSET(RID_##name)) && as->cost[RID_##name] < cost) \[m
[31m-    cost = as->cost[RID_##name];[m
[31m-[m
[31m-/* Evict the register with the lowest cost, forcing a restore. */[m
[31m-static Reg ra_evict(ASMState *as, RegSet allow)[m
[31m-{[m
[31m-  IRRef ref;[m
[31m-  RegCost cost = ~(RegCost)0;[m
[31m-  lua_assert(allow != RSET_EMPTY);[m
[31m-  if (RID_NUM_FPR == 0 || allow < RID2RSET(RID_MAX_GPR)) {[m
[31m-    GPRDEF(MINCOST)[m
[31m-  } else {[m
[31m-    FPRDEF(MINCOST)[m
[31m-  }[m
[31m-  ref = regcost_ref(cost);[m
[31m-  lua_assert(ra_iskref(ref) || (ref >= as->T->nk && ref < as->T->nins));[m
[31m-  /* Preferably pick any weak ref instead of a non-weak, non-const ref. */[m
[31m-  if (!irref_isk(ref) && (as->weakset & allow)) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (!rset_test(as->weakset, ir->r))[m
[31m-      ref = regcost_ref(as->cost[rset_pickbot((as->weakset & allow))]);[m
[31m-  }[m
[31m-  return ra_restore(as, ref);[m
[31m-}[m
[31m-[m
[31m-/* Pick any register (marked as free). Evict on-demand. */[m
[31m-static Reg ra_pick(ASMState *as, RegSet allow)[m
[31m-{[m
[31m-  RegSet pick = as->freeset & allow;[m
[31m-  if (!pick)[m
[31m-    return ra_evict(as, allow);[m
[31m-  else[m
[31m-    return rset_picktop(pick);[m
[31m-}[m
[31m-[m
[31m-/* Get a scratch register (marked as free). */[m
[31m-static Reg ra_scratch(ASMState *as, RegSet allow)[m
[31m-{[m
[31m-  Reg r = ra_pick(as, allow);[m
[31m-  ra_modified(as, r);[m
[31m-  RA_DBGX((as, "scratch        $r", r));[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Evict all registers from a set (if not free). */[m
[31m-static void ra_evictset(ASMState *as, RegSet drop)[m
[31m-{[m
[31m-  RegSet work;[m
[31m-  as->modset |= drop;[m
[31m-#if !LJ_SOFTFP[m
[31m-  work = (drop & ~as->freeset) & RSET_FPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    rset_clear(work, r);[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-#endif[m
[31m-  work = (drop & ~as->freeset);[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    rset_clear(work, r);[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Evict (rematerialize) all registers allocated to constants. */[m
[31m-static void ra_evictk(ASMState *as)[m
[31m-{[m
[31m-  RegSet work;[m
[31m-#if !LJ_SOFTFP[m
[31m-  work = ~as->freeset & RSET_FPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    if (emit_canremat(ref) && irref_isk(ref)) {[m
[31m-      ra_rematk(as, ref);[m
[31m-      checkmclim(as);[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-#endif[m
[31m-  work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    if (emit_canremat(ref) && irref_isk(ref)) {[m
[31m-      ra_rematk(as, ref);[m
[31m-      checkmclim(as);[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#ifdef RID_NUM_KREF[m
[31m-/* Allocate a register for a constant. */[m
[31m-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow)[m
[31m-{[m
[31m-  /* First try to find a register which already holds the same constant. */[m
[31m-  RegSet pick, work = ~as->freeset & RSET_GPR;[m
[31m-  Reg r;[m
[31m-  while (work) {[m
[31m-    IRRef ref;[m
[31m-    r = rset_pickbot(work);[m
[31m-    ref = regcost_ref(as->cost[r]);[m
[31m-    if (ref < ASMREF_L &&[m
[31m-	k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i))[m
[31m-      return r;[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  pick = as->freeset & allow;[m
[31m-  if (pick) {[m
[31m-    /* Constants should preferably get unmodified registers. */[m
[31m-    if ((pick & ~as->modset))[m
[31m-      pick &= ~as->modset;[m
[31m-    r = rset_pickbot(pick);  /* Reduce conflicts with inverse allocation. */[m
[31m-  } else {[m
[31m-    r = ra_evict(as, allow);[m
[31m-  }[m
[31m-  RA_DBGX((as, "allock    $x $r", k, r));[m
[31m-  ra_setkref(as, r, k);[m
[31m-  rset_clear(as->freeset, r);[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate a specific register for a constant. */[m
[31m-static void ra_allockreg(ASMState *as, int32_t k, Reg r)[m
[31m-{[m
[31m-  Reg kr = ra_allock(as, k, RID2RSET(r));[m
[31m-  if (kr != r) {[m
[31m-    IRIns irdummy;[m
[31m-    irdummy.t.irt = IRT_INT;[m
[31m-    ra_scratch(as, RID2RSET(r));[m
[31m-    emit_movrr(as, &irdummy, r, kr);[m
[31m-  }[m
[31m-}[m
[31m-#else[m
[31m-#define ra_allockreg(as, k, r)		emit_loadi(as, (r), (k))[m
[31m-#endif[m
[31m-[m
[31m-/* Allocate a register for ref from the allowed set of registers.[m
[31m-** Note: this function assumes the ref does NOT have a register yet![m
[31m-** Picks an optimal register, sets the cost and marks the register as non-free.[m
[31m-*/[m
[31m-static Reg ra_allocref(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  RegSet pick = as->freeset & allow;[m
[31m-  Reg r;[m
[31m-  lua_assert(ra_noreg(ir->r));[m
[31m-  if (pick) {[m
[31m-    /* First check register hint from propagation or PHI. */[m
[31m-    if (ra_hashint(ir->r)) {[m
[31m-      r = ra_gethint(ir->r);[m
[31m-      if (rset_test(pick, r))  /* Use hint register if possible. */[m
[31m-	goto found;[m
[31m-      /* Rematerialization is cheaper than missing a hint. */[m
[31m-      if (rset_test(allow, r) && emit_canremat(regcost_ref(as->cost[r]))) {[m
[31m-	ra_rematk(as, regcost_ref(as->cost[r]));[m
[31m-	goto found;[m
[31m-      }[m
[31m-      RA_DBGX((as, "hintmiss  $f $r", ref, r));[m
[31m-    }[m
[31m-    /* Invariants should preferably get unmodified registers. */[m
[31m-    if (ref < as->loopref && !irt_isphi(ir->t)) {[m
[31m-      if ((pick & ~as->modset))[m
[31m-	pick &= ~as->modset;[m
[31m-      r = rset_pickbot(pick);  /* Reduce conflicts with inverse allocation. */[m
[31m-    } else {[m
[31m-      /* We've got plenty of regs, so get callee-save regs if possible. */[m
[31m-      if (RID_NUM_GPR > 8 && (pick & ~RSET_SCRATCH))[m
[31m-	pick &= ~RSET_SCRATCH;[m
[31m-      r = rset_picktop(pick);[m
[31m-    }[m
[31m-  } else {[m
[31m-    r = ra_evict(as, allow);[m
[31m-  }[m
[31m-found:[m
[31m-  RA_DBGX((as, "alloc     $f $r", ref, r));[m
[31m-  ir->r = (uint8_t)r;[m
[31m-  rset_clear(as->freeset, r);[m
[31m-  ra_noweak(as, r);[m
[31m-  as->cost[r] = REGCOST_REF_T(ref, irt_t(ir->t));[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate a register on-demand. */[m
[31m-static Reg ra_alloc1(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  /* Note: allow is ignored if the register is already allocated. */[m
[31m-  if (ra_noreg(r)) r = ra_allocref(as, ref, allow);[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Rename register allocation and emit move. */[m
[31m-static void ra_rename(ASMState *as, Reg down, Reg up)[m
[31m-{[m
[31m-  IRRef ren, ref = regcost_ref(as->cost[up] = as->cost[down]);[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  ir->r = (uint8_t)up;[m
[31m-  as->cost[down] = 0;[m
[31m-  lua_assert((down < RID_MAX_GPR) == (up < RID_MAX_GPR));[m
[31m-  lua_assert(!rset_test(as->freeset, down) && rset_test(as->freeset, up));[m
[31m-  ra_free(as, down);  /* 'down' is free ... */[m
[31m-  ra_modified(as, down);[m
[31m-  rset_clear(as->freeset, up);  /* ... and 'up' is now allocated. */[m
[31m-  ra_noweak(as, up);[m
[31m-  RA_DBGX((as, "rename    $f $r $r", regcost_ref(as->cost[up]), down, up));[m
[31m-  emit_movrr(as, ir, down, up);  /* Backwards codegen needs inverse move. */[m
[31m-  if (!ra_hasspill(IR(ref)->s)) {  /* Add the rename to the IR. */[m
[31m-    lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), ref, as->snapno);[m
[31m-    ren = tref_ref(lj_ir_emit(as->J));[m
[31m-    as->ir = as->T->ir;  /* The IR may have been reallocated. */[m
[31m-    IR(ren)->r = (uint8_t)down;[m
[31m-    IR(ren)->s = SPS_NONE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Pick a destination register (marked as free).[m
[31m-** Caveat: allow is ignored if there's already a destination register.[m
[31m-** Use ra_destreg() to get a specific register.[m
[31m-*/[m
[31m-static Reg ra_dest(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  Reg dest = ir->r;[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    ra_free(as, dest);[m
[31m-    ra_modified(as, dest);[m
[31m-  } else {[m
[31m-    if (ra_hashint(dest) && rset_test((as->freeset&allow), ra_gethint(dest))) {[m
[31m-      dest = ra_gethint(dest);[m
[31m-      ra_modified(as, dest);[m
[31m-      RA_DBGX((as, "dest           $r", dest));[m
[31m-    } else {[m
[31m-      dest = ra_scratch(as, allow);[m
[31m-    }[m
[31m-    ir->r = dest;[m
[31m-  }[m
[31m-  if (LJ_UNLIKELY(ra_hasspill(ir->s))) ra_save(as, ir, dest);[m
[31m-  return dest;[m
[31m-}[m
[31m-[m
[31m-/* Force a specific destination register (marked as free). */[m
[31m-static void ra_destreg(ASMState *as, IRIns *ir, Reg r)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RID2RSET(r));[m
[31m-  if (dest != r) {[m
[31m-    lua_assert(rset_test(as->freeset, r));[m
[31m-    ra_modified(as, r);[m
[31m-    emit_movrr(as, ir, dest, r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-/* Propagate dest register to left reference. Emit moves as needed.[m
[31m-** This is a required fixup step for all 2-operand machine instructions.[m
[31m-*/[m
[31m-static void ra_left(ASMState *as, Reg dest, IRRef lref)[m
[31m-{[m
[31m-  IRIns *ir = IR(lref);[m
[31m-  Reg left = ir->r;[m
[31m-  if (ra_noreg(left)) {[m
[31m-    if (irref_isk(lref)) {[m
[31m-      if (ir->o == IR_KNUM) {[m
[31m-	cTValue *tv = ir_knum(ir);[m
[31m-	/* FP remat needs a load except for +0. Still better than eviction. */[m
[31m-	if (tvispzero(tv) || !(as->freeset & RSET_FPR)) {[m
[31m-	  emit_loadn(as, dest, tv);[m
[31m-	  return;[m
[31m-	}[m
[31m-#if LJ_64[m
[31m-      } else if (ir->o == IR_KINT64) {[m
[31m-	emit_loadu64(as, dest, ir_kint64(ir)->u64);[m
[31m-	return;[m
[31m-#endif[m
[31m-      } else if (ir->o != IR_KPRI) {[m
[31m-	lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||[m
[31m-		   ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL);[m
[31m-	emit_loadi(as, dest, ir->i);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!ra_hashint(left) && !iscrossref(as, lref))[m
[31m-      ra_sethint(ir->r, dest);  /* Propagate register hint. */[m
[31m-    left = ra_allocref(as, lref, dest < RID_MAX_GPR ? RSET_GPR : RSET_FPR);[m
[31m-  }[m
[31m-  ra_noweak(as, left);[m
[31m-  /* Move needed for true 3-operand instruction: y=a+b ==> y=a; y+=b. */[m
[31m-  if (dest != left) {[m
[31m-    /* Use register renaming if dest is the PHI reg. */[m
[31m-    if (irt_isphi(ir->t) && as->phireg[dest] == lref) {[m
[31m-      ra_modified(as, left);[m
[31m-      ra_rename(as, left, dest);[m
[31m-    } else {[m
[31m-      emit_movrr(as, ir, dest, left);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-#else[m
[31m-/* Similar to ra_left, except we override any hints. */[m
[31m-static void ra_leftov(ASMState *as, Reg dest, IRRef lref)[m
[31m-{[m
[31m-  IRIns *ir = IR(lref);[m
[31m-  Reg left = ir->r;[m
[31m-  if (ra_noreg(left)) {[m
[31m-    ra_sethint(ir->r, dest);  /* Propagate register hint. */[m
[31m-    left = ra_allocref(as, lref,[m
[31m-		       (LJ_SOFTFP || dest < RID_MAX_GPR) ? RSET_GPR : RSET_FPR);[m
[31m-  }[m
[31m-  ra_noweak(as, left);[m
[31m-  if (dest != left) {[m
[31m-    /* Use register renaming if dest is the PHI reg. */[m
[31m-    if (irt_isphi(ir->t) && as->phireg[dest] == lref) {[m
[31m-      ra_modified(as, left);[m
[31m-      ra_rename(as, left, dest);[m
[31m-    } else {[m
[31m-      emit_movrr(as, ir, dest, left);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_64[m
[31m-/* Force a RID_RETLO/RID_RETHI destination register pair (marked as free). */[m
[31m-static void ra_destpair(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg destlo = ir->r, desthi = (ir+1)->r;[m
[31m-  /* First spill unrelated refs blocking the destination registers. */[m
[31m-  if (!rset_test(as->freeset, RID_RETLO) &&[m
[31m-      destlo != RID_RETLO && desthi != RID_RETLO)[m
[31m-    ra_restore(as, regcost_ref(as->cost[RID_RETLO]));[m
[31m-  if (!rset_test(as->freeset, RID_RETHI) &&[m
[31m-      destlo != RID_RETHI && desthi != RID_RETHI)[m
[31m-    ra_restore(as, regcost_ref(as->cost[RID_RETHI]));[m
[31m-  /* Next free the destination registers (if any). */[m
[31m-  if (ra_hasreg(destlo)) {[m
[31m-    ra_free(as, destlo);[m
[31m-    ra_modified(as, destlo);[m
[31m-  } else {[m
[31m-    destlo = RID_RETLO;[m
[31m-  }[m
[31m-  if (ra_hasreg(desthi)) {[m
[31m-    ra_free(as, desthi);[m
[31m-    ra_modified(as, desthi);[m
[31m-  } else {[m
[31m-    desthi = RID_RETHI;[m
[31m-  }[m
[31m-  /* Check for conflicts and shuffle the registers as needed. */[m
[31m-  if (destlo == RID_RETHI) {[m
[31m-    if (desthi == RID_RETLO) {[m
[31m-#if LJ_TARGET_X86[m
[31m-      *--as->mcp = XI_XCHGa + RID_RETHI;[m
[31m-#else[m
[31m-      emit_movrr(as, ir, RID_RETHI, RID_TMP);[m
[31m-      emit_movrr(as, ir, RID_RETLO, RID_RETHI);[m
[31m-      emit_movrr(as, ir, RID_TMP, RID_RETLO);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      emit_movrr(as, ir, RID_RETHI, RID_RETLO);[m
[31m-      if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI);[m
[31m-    }[m
[31m-  } else if (desthi == RID_RETLO) {[m
[31m-    emit_movrr(as, ir, RID_RETLO, RID_RETHI);[m
[31m-    if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO);[m
[31m-  } else {[m
[31m-    if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI);[m
[31m-    if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO);[m
[31m-  }[m
[31m-  /* Restore spill slots (if any). */[m
[31m-  if (ra_hasspill((ir+1)->s)) ra_save(as, ir+1, RID_RETHI);[m
[31m-  if (ra_hasspill(ir->s)) ra_save(as, ir, RID_RETLO);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Snapshot handling --------- ----------------------------------------- */[m
[31m-[m
[31m-/* Can we rematerialize a KNUM instead of forcing a spill? */[m
[31m-static int asm_snap_canremat(ASMState *as)[m
[31m-{[m
[31m-  Reg r;[m
[31m-  for (r = RID_MIN_FPR; r < RID_MAX_FPR; r++)[m
[31m-    if (irref_isk(regcost_ref(as->cost[r])))[m
[31m-      return 1;[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a sunk store corresponds to an allocation. */[m
[31m-static int asm_sunk_store(ASMState *as, IRIns *ira, IRIns *irs)[m
[31m-{[m
[31m-  if (irs->s == 255) {[m
[31m-    if (irs->o == IR_ASTORE || irs->o == IR_HSTORE ||[m
[31m-	irs->o == IR_FSTORE || irs->o == IR_XSTORE) {[m
[31m-      IRIns *irk = IR(irs->op1);[m
[31m-      if (irk->o == IR_AREF || irk->o == IR_HREFK)[m
[31m-	irk = IR(irk->op1);[m
[31m-      return (IR(irk->op1) == ira);[m
[31m-    }[m
[31m-    return 0;[m
[31m-  } else {[m
[31m-    return (ira + irs->s == irs);  /* Quick check. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocate register or spill slot for a ref that escapes to a snapshot. */[m
[31m-static void asm_snap_alloc1(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (!irref_isk(ref) && (!(ra_used(ir) || ir->r == RID_SUNK))) {[m
[31m-    if (ir->r == RID_SINK) {[m
[31m-      ir->r = RID_SUNK;[m
[31m-#if LJ_HASFFI[m
[31m-      if (ir->o == IR_CNEWI) {  /* Allocate CNEWI value. */[m
[31m-	asm_snap_alloc1(as, ir->op2);[m
[31m-	if (LJ_32 && (ir+1)->o == IR_HIOP)[m
[31m-	  asm_snap_alloc1(as, (ir+1)->op2);[m
[31m-      } else[m
[31m-#endif[m
[31m-      {  /* Allocate stored values for TNEW, TDUP and CNEW. */[m
[31m-	IRIns *irs;[m
[31m-	lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP || ir->o == IR_CNEW);[m
[31m-	for (irs = IR(as->snapref-1); irs > ir; irs--)[m
[31m-	  if (irs->r == RID_SINK && asm_sunk_store(as, ir, irs)) {[m
[31m-	    lua_assert(irs->o == IR_ASTORE || irs->o == IR_HSTORE ||[m
[31m-		       irs->o == IR_FSTORE || irs->o == IR_XSTORE);[m
[31m-	    asm_snap_alloc1(as, irs->op2);[m
[31m-	    if (LJ_32 && (irs+1)->o == IR_HIOP)[m
[31m-	      asm_snap_alloc1(as, (irs+1)->op2);[m
[31m-	  }[m
[31m-      }[m
[31m-    } else {[m
[31m-      RegSet allow;[m
[31m-      if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT) {[m
[31m-	IRIns *irc;[m
[31m-	for (irc = IR(as->curins); irc > ir; irc--)[m
[31m-	  if ((irc->op1 == ref || irc->op2 == ref) &&[m
[31m-	      !(irc->r == RID_SINK || irc->r == RID_SUNK))[m
[31m-	    goto nosink;  /* Don't sink conversion if result is used. */[m
[31m-	asm_snap_alloc1(as, ir->op1);[m
[31m-	return;[m
[31m-      }[m
[31m-    nosink:[m
[31m-      allow = (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR;[m
[31m-      if ((as->freeset & allow) ||[m
[31m-	       (allow == RSET_FPR && asm_snap_canremat(as))) {[m
[31m-	/* Get a weak register if we have a free one or can rematerialize. */[m
[31m-	Reg r = ra_allocref(as, ref, allow);  /* Allocate a register. */[m
[31m-	if (!irt_isphi(ir->t))[m
[31m-	  ra_weak(as, r);  /* But mark it as weakly referenced. */[m
[31m-	checkmclim(as);[m
[31m-	RA_DBGX((as, "snapreg   $f $r", ref, ir->r));[m
[31m-      } else {[m
[31m-	ra_spill(as, ir);  /* Otherwise force a spill slot. */[m
[31m-	RA_DBGX((as, "snapspill $f $s", ref, ir->s));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocate refs escaping to a snapshot. */[m
[31m-static void asm_snap_alloc(ASMState *as)[m
[31m-{[m
[31m-  SnapShot *snap = &as->T->snap[as->snapno];[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    if (!irref_isk(ref)) {[m
[31m-      asm_snap_alloc1(as, ref);[m
[31m-      if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) {[m
[31m-	lua_assert(irt_type(IR(ref+1)->t) == IRT_SOFTFP);[m
[31m-	asm_snap_alloc1(as, ref+1);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* All guards for a snapshot use the same exitno. This is currently the[m
[31m-** same as the snapshot number. Since the exact origin of the exit cannot[m
[31m-** be determined, all guards for the same snapshot must exit with the same[m
[31m-** RegSP mapping.[m
[31m-** A renamed ref which has been used in a prior guard for the same snapshot[m
[31m-** would cause an inconsistency. The easy way out is to force a spill slot.[m
[31m-*/[m
[31m-static int asm_snap_checkrename(ASMState *as, IRRef ren)[m
[31m-{[m
[31m-  SnapShot *snap = &as->T->snap[as->snapno];[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    if (ref == ren || (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && ++ref == ren)) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      ra_spill(as, ir);  /* Register renamed, so force a spill slot. */[m
[31m-      RA_DBGX((as, "snaprensp $f $s", ref, ir->s));[m
[31m-      return 1;  /* Found. */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* Not found. */[m
[31m-}[m
[31m-[m
[31m-/* Prepare snapshot for next guard instruction. */[m
[31m-static void asm_snap_prep(ASMState *as)[m
[31m-{[m
[31m-  if (as->curins < as->snapref) {[m
[31m-    do {[m
[31m-      if (as->snapno == 0) return;  /* Called by sunk stores before snap #0. */[m
[31m-      as->snapno--;[m
[31m-      as->snapref = as->T->snap[as->snapno].ref;[m
[31m-    } while (as->curins < as->snapref);[m
[31m-    asm_snap_alloc(as);[m
[31m-    as->snaprename = as->T->nins;[m
[31m-  } else {[m
[31m-    /* Process any renames above the highwater mark. */[m
[31m-    for (; as->snaprename < as->T->nins; as->snaprename++) {[m
[31m-      IRIns *ir = IR(as->snaprename);[m
[31m-      if (asm_snap_checkrename(as, ir->op1))[m
[31m-	ir->op2 = REF_BIAS-1;  /* Kill rename. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous helpers ----------------------------------------------- */[m
[31m-[m
[31m-/* Calculate stack adjustment. */[m
[31m-static int32_t asm_stack_adjust(ASMState *as)[m
[31m-{[m
[31m-  if (as->evenspill <= SPS_FIXED)[m
[31m-    return 0;[m
[31m-  return sps_scale(sps_align(as->evenspill));[m
[31m-}[m
[31m-[m
[31m-/* Must match with hash*() in lj_tab.c. */[m
[31m-static uint32_t ir_khash(IRIns *ir)[m
[31m-{[m
[31m-  uint32_t lo, hi;[m
[31m-  if (irt_isstr(ir->t)) {[m
[31m-    return ir_kstr(ir)->hash;[m
[31m-  } else if (irt_isnum(ir->t)) {[m
[31m-    lo = ir_knum(ir)->u32.lo;[m
[31m-    hi = ir_knum(ir)->u32.hi << 1;[m
[31m-  } else if (irt_ispri(ir->t)) {[m
[31m-    lua_assert(!irt_isnil(ir->t));[m
[31m-    return irt_type(ir->t)-IRT_FALSE;[m
[31m-  } else {[m
[31m-    lua_assert(irt_isgcv(ir->t));[m
[31m-    lo = u32ptr(ir_kgc(ir));[m
[31m-    hi = lo + HASH_BIAS;[m
[31m-  }[m
[31m-  return hashrot(lo, hi);[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args);[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci);[m
[31m-[m
[31m-static void asm_snew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_new];[m
[31m-  IRRef args[3];[m
[31m-  args[0] = ASMREF_L;  /* lua_State *L    */[m
[31m-  args[1] = ir->op1;   /* const char *str */[m
[31m-  args[2] = ir->op2;   /* size_t len      */[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCstr * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-static void asm_tnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_new1];[m
[31m-  IRRef args[2];[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L    */[m
[31m-  args[1] = ASMREF_TMP1;  /* uint32_t ahsize */[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCtab * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  ra_allockreg(as, ir->op1 | (ir->op2 << 24), ra_releasetmp(as, ASMREF_TMP1));[m
[31m-}[m
[31m-[m
[31m-static void asm_tdup(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_dup];[m
[31m-  IRRef args[2];[m
[31m-  args[0] = ASMREF_L;  /* lua_State *L    */[m
[31m-  args[1] = ir->op1;   /* const GCtab *kt */[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCtab * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-static void asm_gc_check(ASMState *as);[m
[31m-[m
[31m-/* Explicit GC step. */[m
[31m-static void asm_gcstep(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *ira;[m
[31m-  for (ira = IR(as->stopins+1); ira < ir; ira++)[m
[31m-    if ((ira->o == IR_TNEW || ira->o == IR_TDUP ||[m
[31m-	 (LJ_HASFFI && (ira->o == IR_CNEW || ira->o == IR_CNEWI))) &&[m
[31m-	ra_used(ira))[m
[31m-      as->gcsteps++;[m
[31m-  if (as->gcsteps)[m
[31m-    asm_gc_check(as);[m
[31m-  as->gcsteps = 0x80000000;  /* Prevent implicit GC check further up. */[m
[31m-}[m
[31m-[m
[31m-/* -- Buffer operations --------------------------------------------------- */[m
[31m-[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref);[m
[31m-[m
[31m-static void asm_bufhdr(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg sb = ra_dest(as, ir, RSET_GPR);[m
[31m-  if ((ir->op2 & IRBUFHDR_APPEND)) {[m
[31m-    /* Rematerialize const buffer pointer instead of likely spill. */[m
[31m-    IRIns *irp = IR(ir->op1);[m
[31m-    if (!(ra_hasreg(irp->r) || irp == ir-1 ||[m
[31m-	  (irp == ir-2 && !ra_used(ir-1)))) {[m
[31m-      while (!(irp->o == IR_BUFHDR && !(irp->op2 & IRBUFHDR_APPEND)))[m
[31m-	irp = IR(irp->op1);[m
[31m-      if (irref_isk(irp->op1)) {[m
[31m-	ra_weak(as, ra_allocref(as, ir->op1, RSET_GPR));[m
[31m-	ir = irp;[m
[31m-      }[m
[31m-    }[m
[31m-  } else {[m
[31m-    Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, sb));[m
[31m-    /* Passing ir isn't strictly correct, but it's an IRT_P32, too. */[m
[31m-    emit_storeofs(as, ir, tmp, sb, offsetof(SBuf, p));[m
[31m-    emit_loadofs(as, ir, tmp, sb, offsetof(SBuf, b));[m
[31m-  }[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  ra_left(as, sb, ir->op1);[m
[31m-#else[m
[31m-  ra_leftov(as, sb, ir->op1);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static void asm_bufput(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_buf_putstr];[m
[31m-  IRRef args[3];[m
[31m-  IRIns *irs;[m
[31m-  int kchar = -1;[m
[31m-  args[0] = ir->op1;  /* SBuf * */[m
[31m-  args[1] = ir->op2;  /* GCstr * */[m
[31m-  irs = IR(ir->op2);[m
[31m-  lua_assert(irt_isstr(irs->t));[m
[31m-  if (irs->o == IR_KGC) {[m
[31m-    GCstr *s = ir_kstr(irs);[m
[31m-    if (s->len == 1) {  /* Optimize put of single-char string constant. */[m
[31m-      kchar = strdata(s)[0];[m
[31m-      args[1] = ASMREF_TMP1;  /* int, truncated to char */[m
[31m-      ci = &lj_ir_callinfo[IRCALL_lj_buf_putchar];[m
[31m-    }[m
[31m-  } else if (mayfuse(as, ir->op2) && ra_noreg(irs->r)) {[m
[31m-    if (irs->o == IR_TOSTR) {  /* Fuse number to string conversions. */[m
[31m-      if (irs->op2 == IRTOSTR_NUM) {[m
[31m-	args[1] = ASMREF_TMP1;  /* TValue * */[m
[31m-	ci = &lj_ir_callinfo[IRCALL_lj_strfmt_putnum];[m
[31m-      } else {[m
[31m-	lua_assert(irt_isinteger(IR(irs->op1)->t));[m
[31m-	args[1] = irs->op1;  /* int */[m
[31m-	if (irs->op2 == IRTOSTR_INT)[m
[31m-	  ci = &lj_ir_callinfo[IRCALL_lj_strfmt_putint];[m
[31m-	else[m
[31m-	  ci = &lj_ir_callinfo[IRCALL_lj_buf_putchar];[m
[31m-      }[m
[31m-    } else if (irs->o == IR_SNEW) {  /* Fuse string allocation. */[m
[31m-      args[1] = irs->op1;  /* const void * */[m
[31m-      args[2] = irs->op2;  /* MSize */[m
[31m-      ci = &lj_ir_callinfo[IRCALL_lj_buf_putmem];[m
[31m-    }[m
[31m-  }[m
[31m-  asm_setupresult(as, ir, ci);  /* SBuf * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  if (args[1] == ASMREF_TMP1) {[m
[31m-    Reg tmp = ra_releasetmp(as, ASMREF_TMP1);[m
[31m-    if (kchar == -1)[m
[31m-      asm_tvptr(as, tmp, irs->op1);[m
[31m-    else[m
[31m-      ra_allockreg(as, kchar, tmp);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_bufstr(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_buf_tostr];[m
[31m-  IRRef args[1];[m
[31m-  args[0] = ir->op1;  /* SBuf *sb */[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCstr * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-static void asm_tostr(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci;[m
[31m-  IRRef args[2];[m
[31m-  args[0] = ASMREF_L;[m
[31m-  as->gcsteps++;[m
[31m-  if (ir->op2 == IRTOSTR_NUM) {[m
[31m-    args[1] = ASMREF_TMP1;  /* cTValue * */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_strfmt_num];[m
[31m-  } else {[m
[31m-    args[1] = ir->op1;  /* int32_t k */[m
[31m-    if (ir->op2 == IRTOSTR_INT)[m
[31m-      ci = &lj_ir_callinfo[IRCALL_lj_strfmt_int];[m
[31m-    else[m
[31m-      ci = &lj_ir_callinfo[IRCALL_lj_strfmt_char];[m
[31m-  }[m
[31m-  asm_setupresult(as, ir, ci);  /* GCstr * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  if (ir->op2 == IRTOSTR_NUM)[m
[31m-    asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op1);[m
[31m-}[m
[31m-[m
[31m-#if LJ_32 && LJ_HASFFI && !LJ_SOFTFP && !LJ_TARGET_X86[m
[31m-static void asm_conv64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK);[m
[31m-  IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH);[m
[31m-  IRCallID id;[m
[31m-  IRRef args[2];[m
[31m-  lua_assert((ir-1)->o == IR_CONV && ir->o == IR_HIOP);[m
[31m-  args[LJ_BE] = (ir-1)->op1;[m
[31m-  args[LJ_LE] = ir->op1;[m
[31m-  if (st == IRT_NUM || st == IRT_FLOAT) {[m
[31m-    id = IRCALL_fp64_d2l + ((st == IRT_FLOAT) ? 2 : 0) + (dt - IRT_I64);[m
[31m-    ir--;[m
[31m-  } else {[m
[31m-    id = IRCALL_fp64_l2d + ((dt == IRT_FLOAT) ? 2 : 0) + (st - IRT_I64);[m
[31m-  }[m
[31m-  {[m
[31m-#if LJ_TARGET_ARM && !LJ_ABI_SOFTFP[m
[31m-    CCallInfo cim = lj_ir_callinfo[id], *ci = &cim;[m
[31m-    cim.flags |= CCI_VARARG;  /* These calls don't use the hard-float ABI! */[m
[31m-#else[m
[31m-    const CCallInfo *ci = &lj_ir_callinfo[id];[m
[31m-#endif[m
[31m-    asm_setupresult(as, ir, ci);[m
[31m-    asm_gencall(as, ci, args);[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-static void asm_newref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_newkey];[m
[31m-  IRRef args[3];[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ir->op1;      /* GCtab *t     */[m
[31m-  args[2] = ASMREF_TMP1;  /* cTValue *key */[m
[31m-  asm_setupresult(as, ir, ci);  /* TValue * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op2);[m
[31m-}[m
[31m-[m
[31m-static void asm_lref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg r = ra_dest(as, ir, RSET_GPR);[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  ra_left(as, r, ASMREF_L);[m
[31m-#else[m
[31m-  ra_leftov(as, r, ASMREF_L);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Collect arguments from CALL* and CARG instructions. */[m
[31m-static void asm_collectargs(ASMState *as, IRIns *ir,[m
[31m-			    const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n = CCI_XNARGS(ci);[m
[31m-  lua_assert(n <= CCI_NARGS_MAX*2);  /* Account for split args. */[m
[31m-  if ((ci->flags & CCI_L)) { *args++ = ASMREF_L; n--; }[m
[31m-  while (n-- > 1) {[m
[31m-    ir = IR(ir->op1);[m
[31m-    lua_assert(ir->o == IR_CARG);[m
[31m-    args[n] = ir->op2 == REF_NIL ? 0 : ir->op2;[m
[31m-  }[m
[31m-  args[0] = ir->op1 == REF_NIL ? 0 : ir->op1;[m
[31m-  lua_assert(IR(ir->op1)->o != IR_CARG);[m
[31m-}[m
[31m-[m
[31m-/* Reconstruct CCallInfo flags for CALLX*. */[m
[31m-static uint32_t asm_callx_flags(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  uint32_t nargs = 0;[m
[31m-  if (ir->op1 != REF_NIL) {  /* Count number of arguments first. */[m
[31m-    IRIns *ira = IR(ir->op1);[m
[31m-    nargs++;[m
[31m-    while (ira->o == IR_CARG) { nargs++; ira = IR(ira->op1); }[m
[31m-  }[m
[31m-#if LJ_HASFFI[m
[31m-  if (IR(ir->op2)->o == IR_CARG) {  /* Copy calling convention info. */[m
[31m-    CTypeID id = (CTypeID)IR(IR(ir->op2)->op2)->i;[m
[31m-    CType *ct = ctype_get(ctype_ctsG(J2G(as->J)), id);[m
[31m-    nargs |= ((ct->info & CTF_VARARG) ? CCI_VARARG : 0);[m
[31m-#if LJ_TARGET_X86[m
[31m-    nargs |= (ctype_cconv(ct->info) << CCI_CC_SHIFT);[m
[31m-#endif[m
[31m-  }[m
[31m-#endif[m
[31m-  return (nargs | (ir->t.irt << CCI_OTSHIFT));[m
[31m-}[m
[31m-[m
[31m-static void asm_callid(ASMState *as, IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[id];[m
[31m-  IRRef args[2];[m
[31m-  args[0] = ir->op1;[m
[31m-  args[1] = ir->op2;[m
[31m-  asm_setupresult(as, ir, ci);[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-static void asm_call(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX];[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[ir->op2];[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  asm_setupresult(as, ir, ci);[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_fppow(ASMState *as, IRIns *ir, IRRef lref, IRRef rref)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_pow];[m
[31m-  IRRef args[2];[m
[31m-  args[0] = lref;[m
[31m-  args[1] = rref;[m
[31m-  asm_setupresult(as, ir, ci);[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-static int asm_fpjoin_pow(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *irp = IR(ir->op1);[m
[31m-  if (irp == ir-1 && irp->o == IR_MUL && !ra_used(irp)) {[m
[31m-    IRIns *irpp = IR(irp->op1);[m
[31m-    if (irpp == ir-2 && irpp->o == IR_FPMATH &&[m
[31m-	irpp->op2 == IRFPM_LOG2 && !ra_used(irpp)) {[m
[31m-      asm_fppow(as, ir, irpp->op1, irp->op2);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- PHI and loop handling ----------------------------------------------- */[m
[31m-[m
[31m-/* Break a PHI cycle by renaming to a free register (evict if needed). */[m
[31m-static void asm_phi_break(ASMState *as, RegSet blocked, RegSet blockedby,[m
[31m-			  RegSet allow)[m
[31m-{[m
[31m-  RegSet candidates = blocked & allow;[m
[31m-  if (candidates) {  /* If this register file has candidates. */[m
[31m-    /* Note: the set for ra_pick cannot be empty, since each register file[m
[31m-    ** has some registers never allocated to PHIs.[m
[31m-    */[m
[31m-    Reg down, up = ra_pick(as, ~blocked & allow);  /* Get a free register. */[m
[31m-    if (candidates & ~blockedby)  /* Optimize shifts, else it's a cycle. */[m
[31m-      candidates = candidates & ~blockedby;[m
[31m-    down = rset_picktop(candidates);  /* Pick candidate PHI register. */[m
[31m-    ra_rename(as, down, up);  /* And rename it to the free register. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* PHI register shuffling.[m
[31m-**[m
[31m-** The allocator tries hard to preserve PHI register assignments across[m
[31m-** the loop body. Most of the time this loop does nothing, since there[m
[31m-** are no register mismatches.[m
[31m-**[m
[31m-** If a register mismatch is detected and ...[m
[31m-** - the register is currently free: rename it.[m
[31m-** - the register is blocked by an invariant: restore/remat and rename it.[m
[31m-** - Otherwise the register is used by another PHI, so mark it as blocked.[m
[31m-**[m
[31m-** The renames are order-sensitive, so just retry the loop if a register[m
[31m-** is marked as blocked, but has been freed in the meantime. A cycle is[m
[31m-** detected if all of the blocked registers are allocated. To break the[m
[31m-** cycle rename one of them to a free register and retry.[m
[31m-**[m
[31m-** Note that PHI spill slots are kept in sync and don't need to be shuffled.[m
[31m-*/[m
[31m-static void asm_phi_shuffle(ASMState *as)[m
[31m-{[m
[31m-  RegSet work;[m
[31m-[m
[31m-  /* Find and resolve PHI register mismatches. */[m
[31m-  for (;;) {[m
[31m-    RegSet blocked = RSET_EMPTY;[m
[31m-    RegSet blockedby = RSET_EMPTY;[m
[31m-    RegSet phiset = as->phiset;[m
[31m-    while (phiset) {  /* Check all left PHI operand registers. */[m
[31m-      Reg r = rset_pickbot(phiset);[m
[31m-      IRIns *irl = IR(as->phireg[r]);[m
[31m-      Reg left = irl->r;[m
[31m-      if (r != left) {  /* Mismatch? */[m
[31m-	if (!rset_test(as->freeset, r)) {  /* PHI register blocked? */[m
[31m-	  IRRef ref = regcost_ref(as->cost[r]);[m
[31m-	  /* Blocked by other PHI (w/reg)? */[m
[31m-	  if (!ra_iskref(ref) && irt_ismarked(IR(ref)->t)) {[m
[31m-	    rset_set(blocked, r);[m
[31m-	    if (ra_hasreg(left))[m
[31m-	      rset_set(blockedby, left);[m
[31m-	    left = RID_NONE;[m
[31m-	  } else {  /* Otherwise grab register from invariant. */[m
[31m-	    ra_restore(as, ref);[m
[31m-	    checkmclim(as);[m
[31m-	  }[m
[31m-	}[m
[31m-	if (ra_hasreg(left)) {[m
[31m-	  ra_rename(as, left, r);[m
[31m-	  checkmclim(as);[m
[31m-	}[m
[31m-      }[m
[31m-      rset_clear(phiset, r);[m
[31m-    }[m
[31m-    if (!blocked) break;  /* Finished. */[m
[31m-    if (!(as->freeset & blocked)) {  /* Break cycles if none are free. */[m
[31m-      asm_phi_break(as, blocked, blockedby, RSET_GPR);[m
[31m-      if (!LJ_SOFTFP) asm_phi_break(as, blocked, blockedby, RSET_FPR);[m
[31m-      checkmclim(as);[m
[31m-    }  /* Else retry some more renames. */[m
[31m-  }[m
[31m-[m
[31m-  /* Restore/remat invariants whose registers are modified inside the loop. */[m
[31m-#if !LJ_SOFTFP[m
[31m-  work = as->modset & ~(as->freeset | as->phiset) & RSET_FPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    rset_clear(work, r);[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-#endif[m
[31m-  work = as->modset & ~(as->freeset | as->phiset);[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    rset_clear(work, r);[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-[m
[31m-  /* Allocate and save all unsaved PHI regs and clear marks. */[m
[31m-  work = as->phiset;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef lref = as->phireg[r];[m
[31m-    IRIns *ir = IR(lref);[m
[31m-    if (ra_hasspill(ir->s)) {  /* Left PHI gained a spill slot? */[m
[31m-      irt_clearmark(ir->t);  /* Handled here, so clear marker now. */[m
[31m-      ra_alloc1(as, lref, RID2RSET(r));[m
[31m-      ra_save(as, ir, r);  /* Save to spill slot inside the loop. */[m
[31m-      checkmclim(as);[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Copy unsynced left/right PHI spill slots. Rarely needed. */[m
[31m-static void asm_phi_copyspill(ASMState *as)[m
[31m-{[m
[31m-  int need = 0;[m
[31m-  IRIns *ir;[m
[31m-  for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--)[m
[31m-    if (ra_hasspill(ir->s) && ra_hasspill(IR(ir->op1)->s))[m
[31m-      need |= irt_isfp(ir->t) ? 2 : 1;  /* Unsynced spill slot? */[m
[31m-  if ((need & 1)) {  /* Copy integer spill slots. */[m
[31m-#if !LJ_TARGET_X86ORX64[m
[31m-    Reg r = RID_TMP;[m
[31m-#else[m
[31m-    Reg r = RID_RET;[m
[31m-    if ((as->freeset & RSET_GPR))[m
[31m-      r = rset_pickbot((as->freeset & RSET_GPR));[m
[31m-    else[m
[31m-      emit_spload(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);[m
[31m-#endif[m
[31m-    for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) {[m
[31m-      if (ra_hasspill(ir->s)) {[m
[31m-	IRIns *irl = IR(ir->op1);[m
[31m-	if (ra_hasspill(irl->s) && !irt_isfp(ir->t)) {[m
[31m-	  emit_spstore(as, irl, r, sps_scale(irl->s));[m
[31m-	  emit_spload(as, ir, r, sps_scale(ir->s));[m
[31m-	  checkmclim(as);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    if (!rset_test(as->freeset, r))[m
[31m-      emit_spstore(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);[m
[31m-#endif[m
[31m-  }[m
[31m-#if !LJ_SOFTFP[m
[31m-  if ((need & 2)) {  /* Copy FP spill slots. */[m
[31m-#if LJ_TARGET_X86[m
[31m-    Reg r = RID_XMM0;[m
[31m-#else[m
[31m-    Reg r = RID_FPRET;[m
[31m-#endif[m
[31m-    if ((as->freeset & RSET_FPR))[m
[31m-      r = rset_pickbot((as->freeset & RSET_FPR));[m
[31m-    if (!rset_test(as->freeset, r))[m
[31m-      emit_spload(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);[m
[31m-    for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) {[m
[31m-      if (ra_hasspill(ir->s)) {[m
[31m-	IRIns *irl = IR(ir->op1);[m
[31m-	if (ra_hasspill(irl->s) && irt_isfp(ir->t)) {[m
[31m-	  emit_spstore(as, irl, r, sps_scale(irl->s));[m
[31m-	  emit_spload(as, ir, r, sps_scale(ir->s));[m
[31m-	  checkmclim(as);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    if (!rset_test(as->freeset, r))[m
[31m-      emit_spstore(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Emit renames for left PHIs which are only spilled outside the loop. */[m
[31m-static void asm_phi_fixup(ASMState *as)[m
[31m-{[m
[31m-  RegSet work = as->phiset;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef lref = as->phireg[r];[m
[31m-    IRIns *ir = IR(lref);[m
[31m-    if (irt_ismarked(ir->t)) {[m
[31m-      irt_clearmark(ir->t);[m
[31m-      /* Left PHI gained a spill slot before the loop? */[m
[31m-      if (ra_hasspill(ir->s)) {[m
[31m-	IRRef ren;[m
[31m-	lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno);[m
[31m-	ren = tref_ref(lj_ir_emit(as->J));[m
[31m-	as->ir = as->T->ir;  /* The IR may have been reallocated. */[m
[31m-	IR(ren)->r = (uint8_t)r;[m
[31m-	IR(ren)->s = SPS_NONE;[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup right PHI reference. */[m
[31m-static void asm_phi(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = ((!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR) &[m
[31m-		 ~as->phiset;[m
[31m-  RegSet afree = (as->freeset & allow);[m
[31m-  IRIns *irl = IR(ir->op1);[m
[31m-  IRIns *irr = IR(ir->op2);[m
[31m-  if (ir->r == RID_SINK)  /* Sink PHI. */[m
[31m-    return;[m
[31m-  /* Spill slot shuffling is not implemented yet (but rarely needed). */[m
[31m-  if (ra_hasspill(irl->s) || ra_hasspill(irr->s))[m
[31m-    lj_trace_err(as->J, LJ_TRERR_NYIPHI);[m
[31m-  /* Leave at least one register free for non-PHIs (and PHI cycle breaking). */[m
[31m-  if ((afree & (afree-1))) {  /* Two or more free registers? */[m
[31m-    Reg r;[m
[31m-    if (ra_noreg(irr->r)) {  /* Get a register for the right PHI. */[m
[31m-      r = ra_allocref(as, ir->op2, allow);[m
[31m-    } else {  /* Duplicate right PHI, need a copy (rare). */[m
[31m-      r = ra_scratch(as, allow);[m
[31m-      emit_movrr(as, irr, r, irr->r);[m
[31m-    }[m
[31m-    ir->r = (uint8_t)r;[m
[31m-    rset_set(as->phiset, r);[m
[31m-    as->phireg[r] = (IRRef1)ir->op1;[m
[31m-    irt_setmark(irl->t);  /* Marks left PHIs _with_ register. */[m
[31m-    if (ra_noreg(irl->r))[m
[31m-      ra_sethint(irl->r, r); /* Set register hint for left PHI. */[m
[31m-  } else {  /* Otherwise allocate a spill slot. */[m
[31m-    /* This is overly restrictive, but it triggers only on synthetic code. */[m
[31m-    if (ra_hasreg(irl->r) || ra_hasreg(irr->r))[m
[31m-      lj_trace_err(as->J, LJ_TRERR_NYIPHI);[m
[31m-    ra_spill(as, ir);[m
[31m-    irr->s = ir->s;  /* Set right PHI spill slot. Sync left slot later. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_loop_fixup(ASMState *as);[m
[31m-[m
[31m-/* Middle part of a loop. */[m
[31m-static void asm_loop(ASMState *as)[m
[31m-{[m
[31m-  MCode *mcspill;[m
[31m-  /* LOOP is a guard, so the snapno is up to date. */[m
[31m-  as->loopsnapno = as->snapno;[m
[31m-  if (as->gcsteps)[m
[31m-    asm_gc_check(as);[m
[31m-  /* LOOP marks the transition from the variant to the invariant part. */[m
[31m-  as->flagmcp = as->invmcp = NULL;[m
[31m-  as->sectref = 0;[m
[31m-  if (!neverfuse(as)) as->fuseref = 0;[m
[31m-  asm_phi_shuffle(as);[m
[31m-  mcspill = as->mcp;[m
[31m-  asm_phi_copyspill(as);[m
[31m-  asm_loop_fixup(as);[m
[31m-  as->mcloop = as->mcp;[m
[31m-  RA_DBGX((as, "===== LOOP ====="));[m
[31m-  if (!as->realign) RA_DBG_FLUSH();[m
[31m-  if (as->mcp != mcspill)[m
[31m-    emit_jmp(as, mcspill);[m
[31m-}[m
[31m-[m
[31m-/* -- Target-specific assembler ------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#include "lj_asm_x86.h"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#include "lj_asm_arm.h"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#include "lj_asm_ppc.h"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#include "lj_asm_mips.h"[m
[31m-#else[m
[31m-#error "Missing assembler for target CPU"[m
[31m-#endif[m
[31m-[m
[31m-/* -- Instruction dispatch ------------------------------------------------ */[m
[31m-[m
[31m-/* Assemble a single instruction. */[m
[31m-static void asm_ir(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  switch ((IROp)ir->o) {[m
[31m-  /* Miscellaneous ops. */[m
[31m-  case IR_LOOP: asm_loop(as); break;[m
[31m-  case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break;[m
[31m-  case IR_USE:[m
[31m-    ra_alloc1(as, ir->op1, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); break;[m
[31m-  case IR_PHI: asm_phi(as, ir); break;[m
[31m-  case IR_HIOP: asm_hiop(as, ir); break;[m
[31m-  case IR_GCSTEP: asm_gcstep(as, ir); break;[m
[31m-  case IR_PROF: asm_prof(as, ir); break;[m
[31m-[m
[31m-  /* Guarded assertions. */[m
[31m-  case IR_LT: case IR_GE: case IR_LE: case IR_GT:[m
[31m-  case IR_ULT: case IR_UGE: case IR_ULE: case IR_UGT:[m
[31m-  case IR_ABC:[m
[31m-    asm_comp(as, ir);[m
[31m-    break;[m
[31m-  case IR_EQ: case IR_NE:[m
[31m-    if ((ir-1)->o == IR_HREF && ir->op1 == as->curins-1) {[m
[31m-      as->curins--;[m
[31m-      asm_href(as, ir-1, (IROp)ir->o);[m
[31m-    } else {[m
[31m-      asm_equal(as, ir);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case IR_RETF: asm_retf(as, ir); break;[m
[31m-[m
[31m-  /* Bit ops. */[m
[31m-  case IR_BNOT: asm_bnot(as, ir); break;[m
[31m-  case IR_BSWAP: asm_bswap(as, ir); break;[m
[31m-  case IR_BAND: asm_band(as, ir); break;[m
[31m-  case IR_BOR: asm_bor(as, ir); break;[m
[31m-  case IR_BXOR: asm_bxor(as, ir); break;[m
[31m-  case IR_BSHL: asm_bshl(as, ir); break;[m
[31m-  case IR_BSHR: asm_bshr(as, ir); break;[m
[31m-  case IR_BSAR: asm_bsar(as, ir); break;[m
[31m-  case IR_BROL: asm_brol(as, ir); break;[m
[31m-  case IR_BROR: asm_bror(as, ir); break;[m
[31m-[m
[31m-  /* Arithmetic ops. */[m
[31m-  case IR_ADD: asm_add(as, ir); break;[m
[31m-  case IR_SUB: asm_sub(as, ir); break;[m
[31m-  case IR_MUL: asm_mul(as, ir); break;[m
[31m-  case IR_MOD: asm_mod(as, ir); break;[m
[31m-  case IR_NEG: asm_neg(as, ir); break;[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_DIV: case IR_POW: case IR_ABS:[m
[31m-  case IR_ATAN2: case IR_LDEXP: case IR_FPMATH: case IR_TOBIT:[m
[31m-    lua_assert(0);  /* Unused for LJ_SOFTFP. */[m
[31m-    break;[m
[31m-#else[m
[31m-  case IR_DIV: asm_div(as, ir); break;[m
[31m-  case IR_POW: asm_pow(as, ir); break;[m
[31m-  case IR_ABS: asm_abs(as, ir); break;[m
[31m-  case IR_ATAN2: asm_atan2(as, ir); break;[m
[31m-  case IR_LDEXP: asm_ldexp(as, ir); break;[m
[31m-  case IR_FPMATH: asm_fpmath(as, ir); break;[m
[31m-  case IR_TOBIT: asm_tobit(as, ir); break;[m
[31m-#endif[m
[31m-  case IR_MIN: asm_min(as, ir); break;[m
[31m-  case IR_MAX: asm_max(as, ir); break;[m
[31m-[m
[31m-  /* Overflow-checking arithmetic ops. */[m
[31m-  case IR_ADDOV: asm_addov(as, ir); break;[m
[31m-  case IR_SUBOV: asm_subov(as, ir); break;[m
[31m-  case IR_MULOV: asm_mulov(as, ir); break;[m
[31m-[m
[31m-  /* Memory references. */[m
[31m-  case IR_AREF: asm_aref(as, ir); break;[m
[31m-  case IR_HREF: asm_href(as, ir, 0); break;[m
[31m-  case IR_HREFK: asm_hrefk(as, ir); break;[m
[31m-  case IR_NEWREF: asm_newref(as, ir); break;[m
[31m-  case IR_UREFO: case IR_UREFC: asm_uref(as, ir); break;[m
[31m-  case IR_FREF: asm_fref(as, ir); break;[m
[31m-  case IR_STRREF: asm_strref(as, ir); break;[m
[31m-  case IR_LREF: asm_lref(as, ir); break;[m
[31m-[m
[31m-  /* Loads and stores. */[m
[31m-  case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-    asm_ahuvload(as, ir);[m
[31m-    break;[m
[31m-  case IR_FLOAD: asm_fload(as, ir); break;[m
[31m-  case IR_XLOAD: asm_xload(as, ir); break;[m
[31m-  case IR_SLOAD: asm_sload(as, ir); break;[m
[31m-[m
[31m-  case IR_ASTORE: case IR_HSTORE: case IR_USTORE: asm_ahustore(as, ir); break;[m
[31m-  case IR_FSTORE: asm_fstore(as, ir); break;[m
[31m-  case IR_XSTORE: asm_xstore(as, ir); break;[m
[31m-[m
[31m-  /* Allocations. */[m
[31m-  case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break;[m
[31m-  case IR_TNEW: asm_tnew(as, ir); break;[m
[31m-  case IR_TDUP: asm_tdup(as, ir); break;[m
[31m-  case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break;[m
[31m-[m
[31m-  /* Buffer operations. */[m
[31m-  case IR_BUFHDR: asm_bufhdr(as, ir); break;[m
[31m-  case IR_BUFPUT: asm_bufput(as, ir); break;[m
[31m-  case IR_BUFSTR: asm_bufstr(as, ir); break;[m
[31m-[m
[31m-  /* Write barriers. */[m
[31m-  case IR_TBAR: asm_tbar(as, ir); break;[m
[31m-  case IR_OBAR: asm_obar(as, ir); break;[m
[31m-[m
[31m-  /* Type conversions. */[m
[31m-  case IR_CONV: asm_conv(as, ir); break;[m
[31m-  case IR_TOSTR: asm_tostr(as, ir); break;[m
[31m-  case IR_STRTO: asm_strto(as, ir); break;[m
[31m-[m
[31m-  /* Calls. */[m
[31m-  case IR_CALLA:[m
[31m-    as->gcsteps++;[m
[31m-    /* fallthrough */[m
[31m-  case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break;[m
[31m-  case IR_CALLXS: asm_callx(as, ir); break;[m
[31m-  case IR_CARG: break;[m
[31m-[m
[31m-  default:[m
[31m-    setintV(&as->J->errinfo, ir->o);[m
[31m-    lj_trace_err_info(as->J, LJ_TRERR_NYIIR);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Head of a root trace. */[m
[31m-static void asm_head_root(ASMState *as)[m
[31m-{[m
[31m-  int32_t spadj;[m
[31m-  asm_head_root_base(as);[m
[31m-  emit_setvmstate(as, (int32_t)as->T->traceno);[m
[31m-  spadj = asm_stack_adjust(as);[m
[31m-  as->T->spadjust = (uint16_t)spadj;[m
[31m-  emit_spsub(as, spadj);[m
[31m-  /* Root traces assume a checked stack for the starting proto. */[m
[31m-  as->T->topslot = gcref(as->T->startpt)->pt.framesize;[m
[31m-}[m
[31m-[m
[31m-/* Head of a side trace.[m
[31m-**[m
[31m-** The current simplistic algorithm requires that all slots inherited[m
[31m-** from the parent are live in a register between pass 2 and pass 3. This[m
[31m-** avoids the complexity of stack slot shuffling. But of course this may[m
[31m-** overflow the register set in some cases and cause the dreaded error:[m
[31m-** "NYI: register coalescing too complex". A refined algorithm is needed.[m
[31m-*/[m
[31m-static void asm_head_side(ASMState *as)[m
[31m-{[m
[31m-  IRRef1 sloadins[RID_MAX];[m
[31m-  RegSet allow = RSET_ALL;  /* Inverse of all coalesced registers. */[m
[31m-  RegSet live = RSET_EMPTY;  /* Live parent registers. */[m
[31m-  IRIns *irp = &as->parent->ir[REF_BASE];  /* Parent base. */[m
[31m-  int32_t spadj, spdelta;[m
[31m-  int pass2 = 0;[m
[31m-  int pass3 = 0;[m
[31m-  IRRef i;[m
[31m-[m
[31m-  if (as->snapno && as->topslot > as->parent->topslot) {[m
[31m-    /* Force snap #0 alloc to prevent register overwrite in stack check. */[m
[31m-    as->snapno = 0;[m
[31m-    asm_snap_alloc(as);[m
[31m-  }[m
[31m-  allow = asm_head_side_base(as, irp, allow);[m
[31m-[m
[31m-  /* Scan all parent SLOADs and collect register dependencies. */[m
[31m-  for (i = as->stopins; i > REF_BASE; i--) {[m
[31m-    IRIns *ir = IR(i);[m
[31m-    RegSP rs;[m
[31m-    lua_assert((ir->o == IR_SLOAD && (ir->op2 & IRSLOAD_PARENT)) ||[m
[31m-	       (LJ_SOFTFP && ir->o == IR_HIOP) || ir->o == IR_PVAL);[m
[31m-    rs = as->parentmap[i - REF_FIRST];[m
[31m-    if (ra_hasreg(ir->r)) {[m
[31m-      rset_clear(allow, ir->r);[m
[31m-      if (ra_hasspill(ir->s)) {[m
[31m-	ra_save(as, ir, ir->r);[m
[31m-	checkmclim(as);[m
[31m-      }[m
[31m-    } else if (ra_hasspill(ir->s)) {[m
[31m-      irt_setmark(ir->t);[m
[31m-      pass2 = 1;[m
[31m-    }[m
[31m-    if (ir->r == rs) {  /* Coalesce matching registers right now. */[m
[31m-      ra_free(as, ir->r);[m
[31m-    } else if (ra_hasspill(regsp_spill(rs))) {[m
[31m-      if (ra_hasreg(ir->r))[m
[31m-	pass3 = 1;[m
[31m-    } else if (ra_used(ir)) {[m
[31m-      sloadins[rs] = (IRRef1)i;[m
[31m-      rset_set(live, rs);  /* Block live parent register. */[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Calculate stack frame adjustment. */[m
[31m-  spadj = asm_stack_adjust(as);[m
[31m-  spdelta = spadj - (int32_t)as->parent->spadjust;[m
[31m-  if (spdelta < 0) {  /* Don't shrink the stack frame. */[m
[31m-    spadj = (int32_t)as->parent->spadjust;[m
[31m-    spdelta = 0;[m
[31m-  }[m
[31m-  as->T->spadjust = (uint16_t)spadj;[m
[31m-[m
[31m-  /* Reload spilled target registers. */[m
[31m-  if (pass2) {[m
[31m-    for (i = as->stopins; i > REF_BASE; i--) {[m
[31m-      IRIns *ir = IR(i);[m
[31m-      if (irt_ismarked(ir->t)) {[m
[31m-	RegSet mask;[m
[31m-	Reg r;[m
[31m-	RegSP rs;[m
[31m-	irt_clearmark(ir->t);[m
[31m-	rs = as->parentmap[i - REF_FIRST];[m
[31m-	if (!ra_hasspill(regsp_spill(rs)))[m
[31m-	  ra_sethint(ir->r, rs);  /* Hint may be gone, set it again. */[m
[31m-	else if (sps_scale(regsp_spill(rs))+spdelta == sps_scale(ir->s))[m
[31m-	  continue;  /* Same spill slot, do nothing. */[m
[31m-	mask = ((!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR) & allow;[m
[31m-	if (mask == RSET_EMPTY)[m
[31m-	  lj_trace_err(as->J, LJ_TRERR_NYICOAL);[m
[31m-	r = ra_allocref(as, i, mask);[m
[31m-	ra_save(as, ir, r);[m
[31m-	rset_clear(allow, r);[m
[31m-	if (r == rs) {  /* Coalesce matching registers right now. */[m
[31m-	  ra_free(as, r);[m
[31m-	  rset_clear(live, r);[m
[31m-	} else if (ra_hasspill(regsp_spill(rs))) {[m
[31m-	  pass3 = 1;[m
[31m-	}[m
[31m-	checkmclim(as);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Store trace number and adjust stack frame relative to the parent. */[m
[31m-  emit_setvmstate(as, (int32_t)as->T->traceno);[m
[31m-  emit_spsub(as, spdelta);[m
[31m-[m
[31m-#if !LJ_TARGET_X86ORX64[m
[31m-  /* Restore BASE register from parent spill slot. */[m
[31m-  if (ra_hasspill(irp->s))[m
[31m-    emit_spload(as, IR(REF_BASE), IR(REF_BASE)->r, sps_scale(irp->s));[m
[31m-#endif[m
[31m-[m
[31m-  /* Restore target registers from parent spill slots. */[m
[31m-  if (pass3) {[m
[31m-    RegSet work = ~as->freeset & RSET_ALL;[m
[31m-    while (work) {[m
[31m-      Reg r = rset_pickbot(work);[m
[31m-      IRRef ref = regcost_ref(as->cost[r]);[m
[31m-      RegSP rs = as->parentmap[ref - REF_FIRST];[m
[31m-      rset_clear(work, r);[m
[31m-      if (ra_hasspill(regsp_spill(rs))) {[m
[31m-	int32_t ofs = sps_scale(regsp_spill(rs));[m
[31m-	ra_free(as, r);[m
[31m-	emit_spload(as, IR(ref), r, ofs);[m
[31m-	checkmclim(as);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Shuffle registers to match up target regs with parent regs. */[m
[31m-  for (;;) {[m
[31m-    RegSet work;[m
[31m-[m
[31m-    /* Repeatedly coalesce free live registers by moving to their target. */[m
[31m-    while ((work = as->freeset & live) != RSET_EMPTY) {[m
[31m-      Reg rp = rset_pickbot(work);[m
[31m-      IRIns *ir = IR(sloadins[rp]);[m
[31m-      rset_clear(live, rp);[m
[31m-      rset_clear(allow, rp);[m
[31m-      ra_free(as, ir->r);[m
[31m-      emit_movrr(as, ir, ir->r, rp);[m
[31m-      checkmclim(as);[m
[31m-    }[m
[31m-[m
[31m-    /* We're done if no live registers remain. */[m
[31m-    if (live == RSET_EMPTY)[m
[31m-      break;[m
[31m-[m
[31m-    /* Break cycles by renaming one target to a temp. register. */[m
[31m-    if (live & RSET_GPR) {[m
[31m-      RegSet tmpset = as->freeset & ~live & allow & RSET_GPR;[m
[31m-      if (tmpset == RSET_EMPTY)[m
[31m-	lj_trace_err(as->J, LJ_TRERR_NYICOAL);[m
[31m-      ra_rename(as, rset_pickbot(live & RSET_GPR), rset_pickbot(tmpset));[m
[31m-    }[m
[31m-    if (!LJ_SOFTFP && (live & RSET_FPR)) {[m
[31m-      RegSet tmpset = as->freeset & ~live & allow & RSET_FPR;[m
[31m-      if (tmpset == RSET_EMPTY)[m
[31m-	lj_trace_err(as->J, LJ_TRERR_NYICOAL);[m
[31m-      ra_rename(as, rset_pickbot(live & RSET_FPR), rset_pickbot(tmpset));[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-    /* Continue with coalescing to fix up the broken cycle(s). */[m
[31m-  }[m
[31m-[m
[31m-  /* Inherit top stack slot already checked by parent trace. */[m
[31m-  as->T->topslot = as->parent->topslot;[m
[31m-  if (as->topslot > as->T->topslot) {  /* Need to check for higher slot? */[m
[31m-#ifdef EXITSTATE_CHECKEXIT[m
[31m-    /* Highest exit + 1 indicates stack check. */[m
[31m-    ExitNo exitno = as->T->nsnap;[m
[31m-#else[m
[31m-    /* Reuse the parent exit in the context of the parent trace. */[m
[31m-    ExitNo exitno = as->J->exitno;[m
[31m-#endif[m
[31m-    as->T->topslot = (uint8_t)as->topslot;  /* Remember for child traces. */[m
[31m-    asm_stack_check(as, as->topslot, irp, allow & RSET_GPR, exitno);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Get base slot for a snapshot. */[m
[31m-static BCReg asm_baseslot(ASMState *as, SnapShot *snap, int *gotframe)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  MSize n;[m
[31m-  for (n = snap->nent; n > 0; n--) {[m
[31m-    SnapEntry sn = map[n-1];[m
[31m-    if ((sn & SNAP_FRAME)) {[m
[31m-      *gotframe = 1;[m
[31m-      return snap_slot(sn);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Link to another trace. */[m
[31m-static void asm_tail_link(ASMState *as)[m
[31m-{[m
[31m-  SnapNo snapno = as->T->nsnap-1;  /* Last snapshot. */[m
[31m-  SnapShot *snap = &as->T->snap[snapno];[m
[31m-  int gotframe = 0;[m
[31m-  BCReg baseslot = asm_baseslot(as, snap, &gotframe);[m
[31m-[m
[31m-  as->topslot = snap->topslot;[m
[31m-  checkmclim(as);[m
[31m-  ra_allocref(as, REF_BASE, RID2RSET(RID_BASE));[m
[31m-[m
[31m-  if (as->T->link == 0) {[m
[31m-    /* Setup fixed registers for exit to interpreter. */[m
[31m-    const BCIns *pc = snap_pc(as->T->snapmap[snap->mapofs + snap->nent]);[m
[31m-    int32_t mres;[m
[31m-    if (bc_op(*pc) == BC_JLOOP) {  /* NYI: find a better way to do this. */[m
[31m-      BCIns *retpc = &traceref(as->J, bc_d(*pc))->startins;[m
[31m-      if (bc_isret(bc_op(*retpc)))[m
[31m-	pc = retpc;[m
[31m-    }[m
[31m-    ra_allockreg(as, i32ptr(J2GG(as->J)->dispatch), RID_DISPATCH);[m
[31m-    ra_allockreg(as, i32ptr(pc), RID_LPC);[m
[31m-    mres = (int32_t)(snap->nslots - baseslot);[m
[31m-    switch (bc_op(*pc)) {[m
[31m-    case BC_CALLM: case BC_CALLMT:[m
[31m-      mres -= (int32_t)(1 + LJ_FR2 + bc_a(*pc) + bc_c(*pc)); break;[m
[31m-    case BC_RETM: mres -= (int32_t)(bc_a(*pc) + bc_d(*pc)); break;[m
[31m-    case BC_TSETM: mres -= (int32_t)bc_a(*pc); break;[m
[31m-    default: if (bc_op(*pc) < BC_FUNCF) mres = 0; break;[m
[31m-    }[m
[31m-    ra_allockreg(as, mres, RID_RET);  /* Return MULTRES or 0. */[m
[31m-  } else if (baseslot) {[m
[31m-    /* Save modified BASE for linking to trace with higher start frame. */[m
[31m-    emit_setgl(as, RID_BASE, jit_base);[m
[31m-  }[m
[31m-  emit_addptr(as, RID_BASE, 8*(int32_t)baseslot);[m
[31m-[m
[31m-  /* Sync the interpreter state with the on-trace state. */[m
[31m-  asm_stack_restore(as, snap);[m
[31m-[m
[31m-  /* Root traces that add frames need to check the stack at the end. */[m
[31m-  if (!as->parent && gotframe)[m
[31m-    asm_stack_check(as, as->topslot, NULL, as->freeset & RSET_GPR, snapno);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Clear reg/sp for all instructions and add register hints. */[m
[31m-static void asm_setup_regsp(ASMState *as)[m
[31m-{[m
[31m-  GCtrace *T = as->T;[m
[31m-  int sink = T->sinktags;[m
[31m-  IRRef nins = T->nins;[m
[31m-  IRIns *ir, *lastir;[m
[31m-  int inloop;[m
[31m-#if LJ_TARGET_ARM[m
[31m-  uint32_t rload = 0xa6402a64;[m
[31m-#endif[m
[31m-[m
[31m-  ra_setup(as);[m
[31m-[m
[31m-  /* Clear reg/sp for constants. */[m
[31m-  for (ir = IR(T->nk), lastir = IR(REF_BASE); ir < lastir; ir++)[m
[31m-    ir->prev = REGSP_INIT;[m
[31m-[m
[31m-  /* REF_BASE is used for implicit references to the BASE register. */[m
[31m-  lastir->prev = REGSP_HINT(RID_BASE);[m
[31m-[m
[31m-  ir = IR(nins-1);[m
[31m-  if (ir->o == IR_RENAME) {[m
[31m-    do { ir--; nins--; } while (ir->o == IR_RENAME);[m
[31m-    T->nins = nins;  /* Remove any renames left over from ASM restart. */[m
[31m-  }[m
[31m-  as->snaprename = nins;[m
[31m-  as->snapref = nins;[m
[31m-  as->snapno = T->nsnap;[m
[31m-[m
[31m-  as->stopins = REF_BASE;[m
[31m-  as->orignins = nins;[m
[31m-  as->curins = nins;[m
[31m-[m
[31m-  /* Setup register hints for parent link instructions. */[m
[31m-  ir = IR(REF_FIRST);[m
[31m-  if (as->parent) {[m
[31m-    uint16_t *p;[m
[31m-    lastir = lj_snap_regspmap(as->parent, as->J->exitno, ir);[m
[31m-    if (lastir - ir > LJ_MAX_JSLOTS)[m
[31m-      lj_trace_err(as->J, LJ_TRERR_NYICOAL);[m
[31m-    as->stopins = (IRRef)((lastir-1) - as->ir);[m
[31m-    for (p = as->parentmap; ir < lastir; ir++) {[m
[31m-      RegSP rs = ir->prev;[m
[31m-      *p++ = (uint16_t)rs;  /* Copy original parent RegSP to parentmap. */[m
[31m-      if (!ra_hasspill(regsp_spill(rs)))[m
[31m-	ir->prev = (uint16_t)REGSP_HINT(regsp_reg(rs));[m
[31m-      else[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  inloop = 0;[m
[31m-  as->evenspill = SPS_FIRST;[m
[31m-  for (lastir = IR(nins); ir < lastir; ir++) {[m
[31m-    if (sink) {[m
[31m-      if (ir->r == RID_SINK)[m
[31m-	continue;[m
[31m-      if (ir->r == RID_SUNK) {  /* Revert after ASM restart. */[m
[31m-	ir->r = RID_SINK;[m
[31m-	continue;[m
[31m-      }[m
[31m-    }[m
[31m-    switch (ir->o) {[m
[31m-    case IR_LOOP:[m
[31m-      inloop = 1;[m
[31m-      break;[m
[31m-#if LJ_TARGET_ARM[m
[31m-    case IR_SLOAD:[m
[31m-      if (!((ir->op2 & IRSLOAD_TYPECHECK) || (ir+1)->o == IR_HIOP))[m
[31m-	break;[m
[31m-      /* fallthrough */[m
[31m-    case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-      if (!LJ_SOFTFP && irt_isnum(ir->t)) break;[m
[31m-      ir->prev = (uint16_t)REGSP_HINT((rload & 15));[m
[31m-      rload = lj_ror(rload, 4);[m
[31m-      continue;[m
[31m-#endif[m
[31m-    case IR_CALLXS: {[m
[31m-      CCallInfo ci;[m
[31m-      ci.flags = asm_callx_flags(as, ir);[m
[31m-      ir->prev = asm_setup_call_slots(as, ir, &ci);[m
[31m-      if (inloop)[m
[31m-	as->modset |= RSET_SCRATCH;[m
[31m-      continue;[m
[31m-      }[m
[31m-    case IR_CALLN: case IR_CALLA: case IR_CALLL: case IR_CALLS: {[m
[31m-      const CCallInfo *ci = &lj_ir_callinfo[ir->op2];[m
[31m-      ir->prev = asm_setup_call_slots(as, ir, ci);[m
[31m-      if (inloop)[m
[31m-	as->modset |= (ci->flags & CCI_NOFPRCLOBBER) ?[m
[31m-		      (RSET_SCRATCH & ~RSET_FPR) : RSET_SCRATCH;[m
[31m-      continue;[m
[31m-      }[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-    case IR_HIOP:[m
[31m-      switch ((ir-1)->o) {[m
[31m-#if LJ_SOFTFP && LJ_TARGET_ARM[m
[31m-      case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-	if (ra_hashint((ir-1)->r)) {[m
[31m-	  ir->prev = (ir-1)->prev + 1;[m
[31m-	  continue;[m
[31m-	}[m
[31m-	break;[m
[31m-#endif[m
[31m-#if !LJ_SOFTFP && LJ_NEED_FP64[m
[31m-      case IR_CONV:[m
[31m-	if (irt_isfp((ir-1)->t)) {[m
[31m-	  ir->prev = REGSP_HINT(RID_FPRET);[m
[31m-	  continue;[m
[31m-	}[m
[31m-	/* fallthrough */[m
[31m-#endif[m
[31m-      case IR_CALLN: case IR_CALLXS:[m
[31m-#if LJ_SOFTFP[m
[31m-      case IR_MIN: case IR_MAX:[m
[31m-#endif[m
[31m-	(ir-1)->prev = REGSP_HINT(RID_RETLO);[m
[31m-	ir->prev = REGSP_HINT(RID_RETHI);[m
[31m-	continue;[m
[31m-      default:[m
[31m-	break;[m
[31m-      }[m
[31m-      break;[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-    case IR_MIN: case IR_MAX:[m
[31m-      if ((ir+1)->o != IR_HIOP) break;[m
[31m-      /* fallthrough */[m
[31m-#endif[m
[31m-    /* C calls evict all scratch regs and return results in RID_RET. */[m
[31m-    case IR_SNEW: case IR_XSNEW: case IR_NEWREF: case IR_BUFPUT:[m
[31m-      if (REGARG_NUMGPR < 3 && as->evenspill < 3)[m
[31m-	as->evenspill = 3;  /* lj_str_new and lj_tab_newkey need 3 args. */[m
[31m-#if LJ_TARGET_X86 && LJ_HASFFI[m
[31m-      if (0) {[m
[31m-    case IR_CNEW:[m
[31m-	if (ir->op2 != REF_NIL && as->evenspill < 4)[m
[31m-	  as->evenspill = 4;  /* lj_cdata_newv needs 4 args. */[m
[31m-      }[m
[31m-#else[m
[31m-    case IR_CNEW:[m
[31m-#endif[m
[31m-    case IR_TNEW: case IR_TDUP: case IR_CNEWI: case IR_TOSTR:[m
[31m-    case IR_BUFSTR:[m
[31m-      ir->prev = REGSP_HINT(RID_RET);[m
[31m-      if (inloop)[m
[31m-	as->modset = RSET_SCRATCH;[m
[31m-      continue;[m
[31m-    case IR_STRTO: case IR_OBAR:[m
[31m-      if (inloop)[m
[31m-	as->modset = RSET_SCRATCH;[m
[31m-      break;[m
[31m-#if !LJ_SOFTFP[m
[31m-    case IR_ATAN2:[m
[31m-#if LJ_TARGET_X86[m
[31m-      if (as->evenspill < 4)  /* Leave room to call atan2(). */[m
[31m-	as->evenspill = 4;[m
[31m-#endif[m
[31m-#if !LJ_TARGET_X86ORX64[m
[31m-    case IR_LDEXP:[m
[31m-#endif[m
[31m-#endif[m
[31m-    case IR_POW:[m
[31m-      if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-	if (inloop)[m
[31m-	  as->modset |= RSET_SCRATCH;[m
[31m-#if LJ_TARGET_X86[m
[31m-	break;[m
[31m-#else[m
[31m-	ir->prev = REGSP_HINT(RID_FPRET);[m
[31m-	continue;[m
[31m-#endif[m
[31m-      }[m
[31m-      /* fallthrough for integer POW */[m
[31m-    case IR_DIV: case IR_MOD:[m
[31m-      if (!irt_isnum(ir->t)) {[m
[31m-	ir->prev = REGSP_HINT(RID_RET);[m
[31m-	if (inloop)[m
[31m-	  as->modset |= (RSET_SCRATCH & RSET_GPR);[m
[31m-	continue;[m
[31m-      }[m
[31m-      break;[m
[31m-    case IR_FPMATH:[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-      if (ir->op2 <= IRFPM_TRUNC) {[m
[31m-	if (!(as->flags & JIT_F_SSE4_1)) {[m
[31m-	  ir->prev = REGSP_HINT(RID_XMM0);[m
[31m-	  if (inloop)[m
[31m-	    as->modset |= RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX);[m
[31m-	  continue;[m
[31m-	}[m
[31m-	break;[m
[31m-      } else if (ir->op2 == IRFPM_EXP2 && !LJ_64) {[m
[31m-	if (as->evenspill < 4)  /* Leave room to call pow(). */[m
[31m-	  as->evenspill = 4;[m
[31m-      }[m
[31m-#endif[m
[31m-      if (inloop)[m
[31m-	as->modset |= RSET_SCRATCH;[m
[31m-#if LJ_TARGET_X86[m
[31m-      break;[m
[31m-#else[m
[31m-      ir->prev = REGSP_HINT(RID_FPRET);[m
[31m-      continue;[m
[31m-#endif[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    /* Non-constant shift counts need to be in RID_ECX on x86/x64. */[m
[31m-    case IR_BSHL: case IR_BSHR: case IR_BSAR:[m
[31m-      if ((as->flags & JIT_F_BMI2))  /* Except if BMI2 is available. */[m
[31m-	break;[m
[31m-    case IR_BROL: case IR_BROR:[m
[31m-      if (!irref_isk(ir->op2) && !ra_hashint(IR(ir->op2)->r)) {[m
[31m-	IR(ir->op2)->r = REGSP_HINT(RID_ECX);[m
[31m-	if (inloop)[m
[31m-	  rset_set(as->modset, RID_ECX);[m
[31m-      }[m
[31m-      break;[m
[31m-#endif[m
[31m-    /* Do not propagate hints across type conversions or loads. */[m
[31m-    case IR_TOBIT:[m
[31m-    case IR_XLOAD:[m
[31m-#if !LJ_TARGET_ARM[m
[31m-    case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-#endif[m
[31m-      break;[m
[31m-    case IR_CONV:[m
[31m-      if (irt_isfp(ir->t) || (ir->op2 & IRCONV_SRCMASK) == IRT_NUM ||[m
[31m-	  (ir->op2 & IRCONV_SRCMASK) == IRT_FLOAT)[m
[31m-	break;[m
[31m-      /* fallthrough */[m
[31m-    default:[m
[31m-      /* Propagate hints across likely 'op reg, imm' or 'op reg'. */[m
[31m-      if (irref_isk(ir->op2) && !irref_isk(ir->op1) &&[m
[31m-	  ra_hashint(regsp_reg(IR(ir->op1)->prev))) {[m
[31m-	ir->prev = IR(ir->op1)->prev;[m
[31m-	continue;[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-    ir->prev = REGSP_INIT;[m
[31m-  }[m
[31m-  if ((as->evenspill & 1))[m
[31m-    as->oddspill = as->evenspill++;[m
[31m-  else[m
[31m-    as->oddspill = 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Assembler core ------------------------------------------------------ */[m
[31m-[m
[31m-/* Assemble a trace. */[m
[31m-void lj_asm_trace(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  ASMState as_;[m
[31m-  ASMState *as = &as_;[m
[31m-  MCode *origtop;[m
[31m-[m
[31m-  /* Ensure an initialized instruction beyond the last one for HIOP checks. */[m
[31m-  J->cur.nins = lj_ir_nextins(J);[m
[31m-  J->cur.ir[J->cur.nins].o = IR_NOP;[m
[31m-[m
[31m-  /* Setup initial state. Copy some fields to reduce indirections. */[m
[31m-  as->J = J;[m
[31m-  as->T = T;[m
[31m-  as->ir = T->ir;[m
[31m-  as->flags = J->flags;[m
[31m-  as->loopref = J->loopref;[m
[31m-  as->realign = NULL;[m
[31m-  as->loopinv = 0;[m
[31m-  as->parent = J->parent ? traceref(J, J->parent) : NULL;[m
[31m-[m
[31m-  /* Reserve MCode memory. */[m
[31m-  as->mctop = origtop = lj_mcode_reserve(J, &as->mcbot);[m
[31m-  as->mcp = as->mctop;[m
[31m-  as->mclim = as->mcbot + MCLIM_REDZONE;[m
[31m-  asm_setup_target(as);[m
[31m-[m
[31m-  do {[m
[31m-    as->mcp = as->mctop;[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-    as->mcp_prev = as->mcp;[m
[31m-#endif[m
[31m-    as->curins = T->nins;[m
[31m-    RA_DBG_START();[m
[31m-    RA_DBGX((as, "===== STOP ====="));[m
[31m-[m
[31m-    /* General trace setup. Emit tail of trace. */[m
[31m-    asm_tail_prep(as);[m
[31m-    as->mcloop = NULL;[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->topslot = 0;[m
[31m-    as->gcsteps = 0;[m
[31m-    as->sectref = as->loopref;[m
[31m-    as->fuseref = (as->flags & JIT_F_OPT_FUSE) ? as->loopref : FUSE_DISABLED;[m
[31m-    asm_setup_regsp(as);[m
[31m-    if (!as->loopref)[m
[31m-      asm_tail_link(as);[m
[31m-[m
[31m-    /* Assemble a trace in linear backwards order. */[m
[31m-    for (as->curins--; as->curins > as->stopins; as->curins--) {[m
[31m-      IRIns *ir = IR(as->curins);[m
[31m-      lua_assert(!(LJ_32 && irt_isint64(ir->t)));  /* Handled by SPLIT. */[m
[31m-      if (!ra_used(ir) && !ir_sideeff(ir) && (as->flags & JIT_F_OPT_DCE))[m
[31m-	continue;  /* Dead-code elimination can be soooo easy. */[m
[31m-      if (irt_isguard(ir->t))[m
[31m-	asm_snap_prep(as);[m
[31m-      RA_DBG_REF();[m
[31m-      checkmclim(as);[m
[31m-      asm_ir(as, ir);[m
[31m-    }[m
[31m-  } while (as->realign);  /* Retry in case the MCode needs to be realigned. */[m
[31m-[m
[31m-  /* Emit head of trace. */[m
[31m-  RA_DBG_REF();[m
[31m-  checkmclim(as);[m
[31m-  if (as->gcsteps > 0) {[m
[31m-    as->curins = as->T->snap[0].ref;[m
[31m-    asm_snap_prep(as);  /* The GC check is a guard. */[m
[31m-    asm_gc_check(as);[m
[31m-  }[m
[31m-  ra_evictk(as);[m
[31m-  if (as->parent)[m
[31m-    asm_head_side(as);[m
[31m-  else[m
[31m-    asm_head_root(as);[m
[31m-  asm_phi_fixup(as);[m
[31m-[m
[31m-  RA_DBGX((as, "===== START ===="));[m
[31m-  RA_DBG_FLUSH();[m
[31m-  if (as->freeset != RSET_ALL)[m
[31m-    lj_trace_err(as->J, LJ_TRERR_BADRA);  /* Ouch! Should never happen. */[m
[31m-[m
[31m-  /* Set trace entry point before fixing up tail to allow link to self. */[m
[31m-  T->mcode = as->mcp;[m
[31m-  T->mcloop = as->mcloop ? (MSize)((char *)as->mcloop - (char *)as->mcp) : 0;[m
[31m-  if (!as->loopref)[m
[31m-    asm_tail_fixup(as, T->link);  /* Note: this may change as->mctop! */[m
[31m-  T->szmcode = (MSize)((char *)as->mctop - (char *)as->mcp);[m
[31m-  lj_mcode_sync(T->mcode, origtop);[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.h[m
[1mdeleted file mode 100644[m
[1mindex 9f4654e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-/*[m
[31m-** IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_ASM_H[m
[31m-#define _LJ_ASM_H[m
[31m-[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC void lj_asm_trace(jit_State *J, GCtrace *T);[m
[31m-LJ_FUNC void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno,[m
[31m-			      MCode *target);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_arm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_arm.h[m
[1mdeleted file mode 100644[m
[1mindex ff4068a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_arm.h[m
[1m+++ /dev/null[m
[36m@@ -1,2207 +0,0 @@[m
[31m-/*[m
[31m-** ARM IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Register allocator extensions --------------------------------------- */[m
[31m-[m
[31m-/* Allocate a register with a hint. */[m
[31m-static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  if (ra_noreg(r)) {[m
[31m-    if (!ra_hashint(r) && !iscrossref(as, ref))[m
[31m-      ra_sethint(IR(ref)->r, hint);  /* Propagate register hint. */[m
[31m-    r = ra_allocref(as, ref, allow);[m
[31m-  }[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate a scratch register pair. */[m
[31m-static Reg ra_scratchpair(ASMState *as, RegSet allow)[m
[31m-{[m
[31m-  RegSet pick1 = as->freeset & allow;[m
[31m-  RegSet pick2 = pick1 & (pick1 >> 1) & RSET_GPREVEN;[m
[31m-  Reg r;[m
[31m-  if (pick2) {[m
[31m-    r = rset_picktop(pick2);[m
[31m-  } else {[m
[31m-    RegSet pick = pick1 & (allow >> 1) & RSET_GPREVEN;[m
[31m-    if (pick) {[m
[31m-      r = rset_picktop(pick);[m
[31m-      ra_restore(as, regcost_ref(as->cost[r+1]));[m
[31m-    } else {[m
[31m-      pick = pick1 & (allow << 1) & RSET_GPRODD;[m
[31m-      if (pick) {[m
[31m-	r = ra_restore(as, regcost_ref(as->cost[rset_picktop(pick)-1]));[m
[31m-      } else {[m
[31m-	r = ra_evict(as, allow & (allow >> 1) & RSET_GPREVEN);[m
[31m-	ra_restore(as, regcost_ref(as->cost[r+1]));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(rset_test(RSET_GPREVEN, r));[m
[31m-  ra_modified(as, r);[m
[31m-  ra_modified(as, r+1);[m
[31m-  RA_DBGX((as, "scratchpair    $r $r", r, r+1));[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-/* Allocate two source registers for three-operand instructions. */[m
[31m-static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-  Reg left = irl->r, right = irr->r;[m
[31m-  if (ra_hasreg(left)) {[m
[31m-    ra_noweak(as, left);[m
[31m-    if (ra_noreg(right))[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(allow, left));[m
[31m-    else[m
[31m-      ra_noweak(as, right);[m
[31m-  } else if (ra_hasreg(right)) {[m
[31m-    ra_noweak(as, right);[m
[31m-    left = ra_allocref(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else if (ra_hashint(right)) {[m
[31m-    right = ra_allocref(as, ir->op2, allow);[m
[31m-    left = ra_alloc1(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else {[m
[31m-    left = ra_allocref(as, ir->op1, allow);[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(allow, left));[m
[31m-  }[m
[31m-  return left | (right << 8);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Guard handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Generate an exit stub group at the bottom of the reserved MCode memory. */[m
[31m-static MCode *asm_exitstub_gen(ASMState *as, ExitNo group)[m
[31m-{[m
[31m-  MCode *mxp = as->mcbot;[m
[31m-  int i;[m
[31m-  if (mxp + 4*4+4*EXITSTUBS_PER_GROUP >= as->mctop)[m
[31m-    asm_mclimit(as);[m
[31m-  /* str lr, [sp]; bl ->vm_exit_handler; .long DISPATCH_address, group. */[m
[31m-  *mxp++ = ARMI_STR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_LR)|ARMF_N(RID_SP);[m
[31m-  *mxp = ARMI_BL|((((MCode *)(void *)lj_vm_exit_handler-mxp)-2)&0x00ffffffu);[m
[31m-  mxp++;[m
[31m-  *mxp++ = (MCode)i32ptr(J2GG(as->J)->dispatch);  /* DISPATCH address */[m
[31m-  *mxp++ = group*EXITSTUBS_PER_GROUP;[m
[31m-  for (i = 0; i < EXITSTUBS_PER_GROUP; i++)[m
[31m-    *mxp++ = ARMI_B|((-6-i)&0x00ffffffu);[m
[31m-  lj_mcode_sync(as->mcbot, mxp);[m
[31m-  lj_mcode_commitbot(as->J, mxp);[m
[31m-  as->mcbot = mxp;[m
[31m-  as->mclim = as->mcbot + MCLIM_REDZONE;[m
[31m-  return mxp - EXITSTUBS_PER_GROUP;[m
[31m-}[m
[31m-[m
[31m-/* Setup all needed exit stubs. */[m
[31m-static void asm_exitstub_setup(ASMState *as, ExitNo nexits)[m
[31m-{[m
[31m-  ExitNo i;[m
[31m-  if (nexits >= EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR)[m
[31m-    lj_trace_err(as->J, LJ_TRERR_SNAPOV);[m
[31m-  for (i = 0; i < (nexits+EXITSTUBS_PER_GROUP-1)/EXITSTUBS_PER_GROUP; i++)[m
[31m-    if (as->J->exitstubgroup[i] == NULL)[m
[31m-      as->J->exitstubgroup[i] = asm_exitstub_gen(as, i);[m
[31m-}[m
[31m-[m
[31m-/* Emit conditional branch to exit for guard. */[m
[31m-static void asm_guardcc(ASMState *as, ARMCC cc)[m
[31m-{[m
[31m-  MCode *target = exitstub_addr(as->J, as->snapno);[m
[31m-  MCode *p = as->mcp;[m
[31m-  if (LJ_UNLIKELY(p == as->invmcp)) {[m
[31m-    as->loopinv = 1;[m
[31m-    *p = ARMI_BL | ((target-p-2) & 0x00ffffffu);[m
[31m-    emit_branch(as, ARMF_CC(ARMI_B, cc^1), p+1);[m
[31m-    return;[m
[31m-  }[m
[31m-  emit_branch(as, ARMF_CC(ARMI_BL, cc), target);[m
[31m-}[m
[31m-[m
[31m-/* -- Operand fusion ------------------------------------------------------ */[m
[31m-[m
[31m-/* Limit linear search to this distance. Avoids O(n^2) behavior. */[m
[31m-#define CONFLICT_SEARCH_LIM	31[m
[31m-[m
[31m-/* Check if there's no conflicting instruction between curins and ref. */[m
[31m-static int noconflict(ASMState *as, IRRef ref, IROp conflict)[m
[31m-{[m
[31m-  IRIns *ir = as->ir;[m
[31m-  IRRef i = as->curins;[m
[31m-  if (i > ref + CONFLICT_SEARCH_LIM)[m
[31m-    return 0;  /* Give up, ref is too far away. */[m
[31m-  while (--i > ref)[m
[31m-    if (ir[i].o == conflict)[m
[31m-      return 0;  /* Conflict found. */[m
[31m-  return 1;  /* Ok, no conflict. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse the array base of colocated arrays. */[m
[31m-static int32_t asm_fuseabase(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE &&[m
[31m-      !neverfuse(as) && noconflict(as, ref, IR_NEWREF))[m
[31m-    return (int32_t)sizeof(GCtab);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Fuse array/hash/upvalue reference into register+offset operand. */[m
[31m-static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow,[m
[31m-			  int lim)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r)) {[m
[31m-    if (ir->o == IR_AREF) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	if (irref_isk(ir->op2)) {[m
[31m-	  IRRef tab = IR(ir->op1)->op1;[m
[31m-	  int32_t ofs = asm_fuseabase(as, tab);[m
[31m-	  IRRef refa = ofs ? tab : ir->op1;[m
[31m-	  ofs += 8*IR(ir->op2)->i;[m
[31m-	  if (ofs > -lim && ofs < lim) {[m
[31m-	    *ofsp = ofs;[m
[31m-	    return ra_alloc1(as, refa, allow);[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_HREFK) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node));[m
[31m-	if (ofs < lim) {[m
[31m-	  *ofsp = ofs;[m
[31m-	  return ra_alloc1(as, ir->op1, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_UREFC) {[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-	int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv);[m
[31m-	*ofsp = (ofs & 255);  /* Mask out less bits to allow LDRD. */[m
[31m-	return ra_allock(as, (ofs & ~255), allow);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  *ofsp = 0;[m
[31m-  return ra_alloc1(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-/* Fuse m operand into arithmetic/logic instructions. */[m
[31m-static uint32_t asm_fuseopm(ASMState *as, ARMIns ai, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_hasreg(ir->r)) {[m
[31m-    ra_noweak(as, ir->r);[m
[31m-    return ARMF_M(ir->r);[m
[31m-  } else if (irref_isk(ref)) {[m
[31m-    uint32_t k = emit_isk12(ai, ir->i);[m
[31m-    if (k)[m
[31m-      return k;[m
[31m-  } else if (mayfuse(as, ref)) {[m
[31m-    if (ir->o >= IR_BSHL && ir->o <= IR_BROR) {[m
[31m-      Reg m = ra_alloc1(as, ir->op1, allow);[m
[31m-      ARMShift sh = ir->o == IR_BSHL ? ARMSH_LSL :[m
[31m-		    ir->o == IR_BSHR ? ARMSH_LSR :[m
[31m-		    ir->o == IR_BSAR ? ARMSH_ASR : ARMSH_ROR;[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	return m | ARMF_SH(sh, (IR(ir->op2)->i & 31));[m
[31m-      } else {[m
[31m-	Reg s = ra_alloc1(as, ir->op2, rset_exclude(allow, m));[m
[31m-	return m | ARMF_RSH(sh, s);[m
[31m-      }[m
[31m-    } else if (ir->o == IR_ADD && ir->op1 == ir->op2) {[m
[31m-      Reg m = ra_alloc1(as, ir->op1, allow);[m
[31m-      return m | ARMF_SH(ARMSH_LSL, 1);[m
[31m-    }[m
[31m-  }[m
[31m-  return ra_allocref(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-/* Fuse shifts into loads/stores. Only bother with BSHL 2 => lsl #2. */[m
[31m-static IRRef asm_fuselsl2(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r) && mayfuse(as, ref) && ir->o == IR_BSHL &&[m
[31m-      irref_isk(ir->op2) && IR(ir->op2)->i == 2)[m
[31m-    return ir->op1;[m
[31m-  return 0;  /* No fusion. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse XLOAD/XSTORE reference into load/store operand. */[m
[31m-static void asm_fusexref(ASMState *as, ARMIns ai, Reg rd, IRRef ref,[m
[31m-			 RegSet allow, int32_t ofs)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  Reg base;[m
[31m-  if (ra_noreg(ir->r) && canfuse(as, ir)) {[m
[31m-    int32_t lim = (!LJ_SOFTFP && (ai & 0x08000000)) ? 1024 :[m
[31m-		   (ai & 0x04000000) ? 4096 : 256;[m
[31m-    if (ir->o == IR_ADD) {[m
[31m-      int32_t ofs2;[m
[31m-      if (irref_isk(ir->op2) &&[m
[31m-	  (ofs2 = ofs + IR(ir->op2)->i) > -lim && ofs2 < lim &&[m
[31m-	  (!(!LJ_SOFTFP && (ai & 0x08000000)) || !(ofs2 & 3))) {[m
[31m-	ofs = ofs2;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (ofs == 0 && !(!LJ_SOFTFP && (ai & 0x08000000))) {[m
[31m-	IRRef lref = ir->op1, rref = ir->op2;[m
[31m-	Reg rn, rm;[m
[31m-	if ((ai & 0x04000000)) {[m
[31m-	  IRRef sref = asm_fuselsl2(as, rref);[m
[31m-	  if (sref) {[m
[31m-	    rref = sref;[m
[31m-	    ai |= ARMF_SH(ARMSH_LSL, 2);[m
[31m-	  } else if ((sref = asm_fuselsl2(as, lref)) != 0) {[m
[31m-	    lref = rref;[m
[31m-	    rref = sref;[m
[31m-	    ai |= ARMF_SH(ARMSH_LSL, 2);[m
[31m-	  }[m
[31m-	}[m
[31m-	rn = ra_alloc1(as, lref, allow);[m
[31m-	rm = ra_alloc1(as, rref, rset_exclude(allow, rn));[m
[31m-	if ((ai & 0x04000000)) ai |= ARMI_LS_R;[m
[31m-	emit_dnm(as, ai|ARMI_LS_P|ARMI_LS_U, rd, rn, rm);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_STRREF && !(!LJ_SOFTFP && (ai & 0x08000000))) {[m
[31m-      lua_assert(ofs == 0);[m
[31m-      ofs = (int32_t)sizeof(GCstr);[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	ofs += IR(ir->op2)->i;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (irref_isk(ir->op1)) {[m
[31m-	ofs += IR(ir->op1)->i;[m
[31m-	ref = ir->op2;[m
[31m-      } else {[m
[31m-	/* NYI: Fuse ADD with constant. */[m
[31m-	Reg rn = ra_alloc1(as, ir->op1, allow);[m
[31m-	uint32_t m = asm_fuseopm(as, 0, ir->op2, rset_exclude(allow, rn));[m
[31m-	if ((ai & 0x04000000))[m
[31m-	  emit_lso(as, ai, rd, rd, ofs);[m
[31m-	else[m
[31m-	  emit_lsox(as, ai, rd, rd, ofs);[m
[31m-	emit_dn(as, ARMI_ADD^m, rd, rn);[m
[31m-	return;[m
[31m-      }[m
[31m-      if (ofs <= -lim || ofs >= lim) {[m
[31m-	Reg rn = ra_alloc1(as, ref, allow);[m
[31m-	Reg rm = ra_allock(as, ofs, rset_exclude(allow, rn));[m
[31m-	if ((ai & 0x04000000)) ai |= ARMI_LS_R;[m
[31m-	emit_dnm(as, ai|ARMI_LS_P|ARMI_LS_U, rd, rn, rm);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ref, allow);[m
[31m-#if !LJ_SOFTFP[m
[31m-  if ((ai & 0x08000000))[m
[31m-    emit_vlso(as, ai, rd, base, ofs);[m
[31m-  else[m
[31m-#endif[m
[31m-  if ((ai & 0x04000000))[m
[31m-    emit_lso(as, ai, rd, base, ofs);[m
[31m-  else[m
[31m-    emit_lsox(as, ai, rd, base, ofs);[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-/* Fuse to multiply-add/sub instruction. */[m
[31m-static int asm_fusemadd(ASMState *as, IRIns *ir, ARMIns ai, ARMIns air)[m
[31m-{[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  IRIns *irm;[m
[31m-  if (lref != rref &&[m
[31m-      ((mayfuse(as, lref) && (irm = IR(lref), irm->o == IR_MUL) &&[m
[31m-	ra_noreg(irm->r)) ||[m
[31m-       (mayfuse(as, rref) && (irm = IR(rref), irm->o == IR_MUL) &&[m
[31m-	(rref = lref, ai = air, ra_noreg(irm->r))))) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg add = ra_hintalloc(as, rref, dest, RSET_FPR);[m
[31m-    Reg right, left = ra_alloc2(as, irm,[m
[31m-			rset_exclude(rset_exclude(RSET_FPR, dest), add));[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_dnm(as, ai, (dest & 15), (left & 15), (right & 15));[m
[31m-    if (dest != add) emit_dm(as, ARMI_VMOV_D, (dest & 15), (add & 15));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Generate a call to a C function. */[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n, nargs = CCI_XNARGS(ci);[m
[31m-  int32_t ofs = 0;[m
[31m-#if LJ_SOFTFP[m
[31m-  Reg gpr = REGARG_FIRSTGPR;[m
[31m-#else[m
[31m-  Reg gpr, fpr = REGARG_FIRSTFPR, fprodd = 0;[m
[31m-#endif[m
[31m-  if ((void *)ci->func)[m
[31m-    emit_call(as, (void *)ci->func);[m
[31m-#if !LJ_SOFTFP[m
[31m-  for (gpr = REGARG_FIRSTGPR; gpr <= REGARG_LASTGPR; gpr++)[m
[31m-    as->cost[gpr] = REGCOST(~0u, ASMREF_L);[m
[31m-  gpr = REGARG_FIRSTGPR;[m
[31m-#endif[m
[31m-  for (n = 0; n < nargs; n++) {  /* Setup args. */[m
[31m-    IRRef ref = args[n];[m
[31m-    IRIns *ir = IR(ref);[m
[31m-#if !LJ_SOFTFP[m
[31m-    if (ref && irt_isfp(ir->t)) {[m
[31m-      RegSet of = as->freeset;[m
[31m-      Reg src;[m
[31m-      if (!LJ_ABI_SOFTFP && !(ci->flags & CCI_VARARG)) {[m
[31m-	if (irt_isnum(ir->t)) {[m
[31m-	  if (fpr <= REGARG_LASTFPR) {[m
[31m-	    ra_leftov(as, fpr, ref);[m
[31m-	    fpr++;[m
[31m-	    continue;[m
[31m-	  }[m
[31m-	} else if (fprodd) {  /* Ick. */[m
[31m-	  src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-	  emit_dm(as, ARMI_VMOV_S, (fprodd & 15), (src & 15) | 0x00400000);[m
[31m-	  fprodd = 0;[m
[31m-	  continue;[m
[31m-	} else if (fpr <= REGARG_LASTFPR) {[m
[31m-	  ra_leftov(as, fpr, ref);[m
[31m-	  fprodd = fpr++;[m
[31m-	  continue;[m
[31m-	}[m
[31m-	/* Workaround to protect argument GPRs from being used for remat. */[m
[31m-	as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1);[m
[31m-	src = ra_alloc1(as, ref, RSET_FPR);  /* May alloc GPR to remat FPR. */[m
[31m-	as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1));[m
[31m-	fprodd = 0;[m
[31m-	goto stackfp;[m
[31m-      }[m
[31m-      /* Workaround to protect argument GPRs from being used for remat. */[m
[31m-      as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1);[m
[31m-      src = ra_alloc1(as, ref, RSET_FPR);  /* May alloc GPR to remat FPR. */[m
[31m-      as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1));[m
[31m-      if (irt_isnum(ir->t)) gpr = (gpr+1) & ~1u;[m
[31m-      if (gpr <= REGARG_LASTGPR) {[m
[31m-	lua_assert(rset_test(as->freeset, gpr));  /* Must have been evicted. */[m
[31m-	if (irt_isnum(ir->t)) {[m
[31m-	  lua_assert(rset_test(as->freeset, gpr+1));  /* Ditto. */[m
[31m-	  emit_dnm(as, ARMI_VMOV_RR_D, gpr, gpr+1, (src & 15));[m
[31m-	  gpr += 2;[m
[31m-	} else {[m
[31m-	  emit_dn(as, ARMI_VMOV_R_S, gpr, (src & 15));[m
[31m-	  gpr++;[m
[31m-	}[m
[31m-      } else {[m
[31m-      stackfp:[m
[31m-	if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4;[m
[31m-	emit_spstore(as, ir, src, ofs);[m
[31m-	ofs += irt_isnum(ir->t) ? 8 : 4;[m
[31m-      }[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-      if (gpr <= REGARG_LASTGPR) {[m
[31m-	lua_assert(rset_test(as->freeset, gpr));  /* Must have been evicted. */[m
[31m-	if (ref) ra_leftov(as, gpr, ref);[m
[31m-	gpr++;[m
[31m-      } else {[m
[31m-	if (ref) {[m
[31m-	  Reg r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-	  emit_spstore(as, ir, r, ofs);[m
[31m-	}[m
[31m-	ofs += 4;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup result reg/sp for call. Evict scratch regs. */[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  int hiop = ((ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  if (hiop && ra_hasreg((ir+1)->r))[m
[31m-    rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);  /* Evictions must be performed first. */[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert(!irt_ispri(ir->t));[m
[31m-    if (!LJ_SOFTFP && irt_isfp(ir->t)) {[m
[31m-      if (LJ_ABI_SOFTFP || (ci->flags & (CCI_CASTU64|CCI_VARARG))) {[m
[31m-	Reg dest = (ra_dest(as, ir, RSET_FPR) & 15);[m
[31m-	if (irt_isnum(ir->t))[m
[31m-	  emit_dnm(as, ARMI_VMOV_D_RR, RID_RETLO, RID_RETHI, dest);[m
[31m-	else[m
[31m-	  emit_dn(as, ARMI_VMOV_S_R, RID_RET, dest);[m
[31m-      } else {[m
[31m-	ra_destreg(as, ir, RID_FPRET);[m
[31m-      }[m
[31m-    } else if (hiop) {[m
[31m-      ra_destpair(as, ir);[m
[31m-    } else {[m
[31m-      ra_destreg(as, ir, RID_RET);[m
[31m-    }[m
[31m-  }[m
[31m-  UNUSED(ci);[m
[31m-}[m
[31m-[m
[31m-static void asm_callx(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  CCallInfo ci;[m
[31m-  IRRef func;[m
[31m-  IRIns *irf;[m
[31m-  ci.flags = asm_callx_flags(as, ir);[m
[31m-  asm_collectargs(as, ir, &ci, args);[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-  func = ir->op2; irf = IR(func);[m
[31m-  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }[m
[31m-  if (irref_isk(func)) {  /* Call to constant address. */[m
[31m-    ci.func = (ASMFunction)(void *)(irf->i);[m
[31m-  } else {  /* Need a non-argument register for indirect calls. */[m
[31m-    Reg freg = ra_alloc1(as, func, RSET_RANGE(RID_R4, RID_R12+1));[m
[31m-    emit_m(as, ARMI_BLXr, freg);[m
[31m-    ci.func = (ASMFunction)(void *)0;[m
[31m-  }[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-[m
[31m-/* -- Returns ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Return to lower frame. Guard that it goes to the right spot. */[m
[31m-static void asm_retf(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  void *pc = ir_kptr(IR(ir->op2));[m
[31m-  int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));[m
[31m-  as->topslot -= (BCReg)delta;[m
[31m-  if ((int32_t)as->topslot < 0) as->topslot = 0;[m
[31m-  irt_setmark(IR(REF_BASE)->t);  /* Children must not coalesce with BASE reg. */[m
[31m-  /* Need to force a spill on REF_BASE now to update the stack slot. */[m
[31m-  emit_lso(as, ARMI_STR, base, RID_SP, ra_spill(as, IR(REF_BASE)));[m
[31m-  emit_setgl(as, base, jit_base);[m
[31m-  emit_addptr(as, base, -8*delta);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_nm(as, ARMI_CMP, RID_TMP,[m
[31m-	  ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base)));[m
[31m-  emit_lso(as, ARMI_LDR, RID_TMP, base, -4);[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_tointg(ASMState *as, IRIns *ir, Reg left)[m
[31m-{[m
[31m-  Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_d(as, ARMI_VMRS, 0);[m
[31m-  emit_dm(as, ARMI_VCMP_D, (tmp & 15), (left & 15));[m
[31m-  emit_dm(as, ARMI_VCVT_F64_S32, (tmp & 15), (tmp & 15));[m
[31m-  emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15));[m
[31m-  emit_dm(as, ARMI_VCVT_S32_F64, (tmp & 15), (left & 15));[m
[31m-}[m
[31m-[m
[31m-static void asm_tobit(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg left = ra_alloc1(as, ir->op1, allow);[m
[31m-  Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left));[m
[31m-  Reg tmp = ra_scratch(as, rset_clear(allow, right));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15));[m
[31m-  emit_dnm(as, ARMI_VADD_D, (tmp & 15), (left & 15), (right & 15));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_conv(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-#if !LJ_SOFTFP[m
[31m-  int stfp = (st == IRT_NUM || st == IRT_FLOAT);[m
[31m-#endif[m
[31m-  IRRef lref = ir->op1;[m
[31m-  /* 64 bit integer conversions are handled by SPLIT. */[m
[31m-  lua_assert(!irt_isint64(ir->t) && !(st == IRT_I64 || st == IRT_U64));[m
[31m-#if LJ_SOFTFP[m
[31m-  /* FP conversions are handled by SPLIT. */[m
[31m-  lua_assert(!irt_isfp(ir->t) && !(st == IRT_NUM || st == IRT_FLOAT));[m
[31m-  /* Can't check for same types: SPLIT uses CONV int.int + BXOR for sfp NEG. */[m
[31m-#else[m
[31m-  lua_assert(irt_type(ir->t) != st);[m
[31m-  if (irt_isfp(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    if (stfp) {  /* FP to FP conversion. */[m
[31m-      emit_dm(as, st == IRT_NUM ? ARMI_VCVT_F32_F64 : ARMI_VCVT_F64_F32,[m
[31m-	      (dest & 15), (ra_alloc1(as, lref, RSET_FPR) & 15));[m
[31m-    } else {  /* Integer to FP conversion. */[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      ARMIns ai = irt_isfloat(ir->t) ?[m
[31m-	(st == IRT_INT ? ARMI_VCVT_F32_S32 : ARMI_VCVT_F32_U32) :[m
[31m-	(st == IRT_INT ? ARMI_VCVT_F64_S32 : ARMI_VCVT_F64_U32);[m
[31m-      emit_dm(as, ai, (dest & 15), (dest & 15));[m
[31m-      emit_dn(as, ARMI_VMOV_S_R, left, (dest & 15));[m
[31m-    }[m
[31m-  } else if (stfp) {  /* FP to integer conversion. */[m
[31m-    if (irt_isguard(ir->t)) {[m
[31m-      /* Checked conversions are only supported from number to int. */[m
[31m-      lua_assert(irt_isint(ir->t) && st == IRT_NUM);[m
[31m-      asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else {[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_FPR);[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      ARMIns ai;[m
[31m-      emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15));[m
[31m-      ai = irt_isint(ir->t) ?[m
[31m-	(st == IRT_NUM ? ARMI_VCVT_S32_F64 : ARMI_VCVT_S32_F32) :[m
[31m-	(st == IRT_NUM ? ARMI_VCVT_U32_F64 : ARMI_VCVT_U32_F32);[m
[31m-      emit_dm(as, ai, (tmp & 15), (left & 15));[m
[31m-    }[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));[m
[31m-      if ((as->flags & JIT_F_ARMV6)) {[m
[31m-	ARMIns ai = st == IRT_I8 ? ARMI_SXTB :[m
[31m-		    st == IRT_U8 ? ARMI_UXTB :[m
[31m-		    st == IRT_I16 ? ARMI_SXTH : ARMI_UXTH;[m
[31m-	emit_dm(as, ai, dest, left);[m
[31m-      } else if (st == IRT_U8) {[m
[31m-	emit_dn(as, ARMI_AND|ARMI_K12|255, dest, left);[m
[31m-      } else {[m
[31m-	uint32_t shift = st == IRT_I8 ? 24 : 16;[m
[31m-	ARMShift sh = st == IRT_U16 ? ARMSH_LSR : ARMSH_ASR;[m
[31m-	emit_dm(as, ARMI_MOV|ARMF_SH(sh, shift), dest, RID_TMP);[m
[31m-	emit_dm(as, ARMI_MOV|ARMF_SH(ARMSH_LSL, shift), RID_TMP, left);[m
[31m-      }[m
[31m-    } else {  /* Handle 32/32 bit no-op (cast). */[m
[31m-      ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_strto(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];[m
[31m-  IRRef args[2];[m
[31m-  Reg rlo = 0, rhi = 0, tmp;[m
[31m-  int destused = ra_used(ir);[m
[31m-  int32_t ofs = 0;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-#if LJ_SOFTFP[m
[31m-  if (destused) {[m
[31m-    if (ra_hasspill(ir->s) && ra_hasspill((ir+1)->s) &&[m
[31m-	(ir->s & 1) == 0 && ir->s + 1 == (ir+1)->s) {[m
[31m-      int i;[m
[31m-      for (i = 0; i < 2; i++) {[m
[31m-	Reg r = (ir+i)->r;[m
[31m-	if (ra_hasreg(r)) {[m
[31m-	  ra_free(as, r);[m
[31m-	  ra_modified(as, r);[m
[31m-	  emit_spload(as, ir+i, r, sps_scale((ir+i)->s));[m
[31m-	}[m
[31m-      }[m
[31m-      ofs = sps_scale(ir->s);[m
[31m-      destused = 0;[m
[31m-    } else {[m
[31m-      rhi = ra_dest(as, ir+1, RSET_GPR);[m
[31m-      rlo = ra_dest(as, ir, rset_exclude(RSET_GPR, rhi));[m
[31m-    }[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_EQ);[m
[31m-  if (destused) {[m
[31m-    emit_lso(as, ARMI_LDR, rhi, RID_SP, 4);[m
[31m-    emit_lso(as, ARMI_LDR, rlo, RID_SP, 0);[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(rhi);[m
[31m-  if (destused) {[m
[31m-    if (ra_hasspill(ir->s)) {[m
[31m-      ofs = sps_scale(ir->s);[m
[31m-      destused = 0;[m
[31m-      if (ra_hasreg(ir->r)) {[m
[31m-	ra_free(as, ir->r);[m
[31m-	ra_modified(as, ir->r);[m
[31m-	emit_spload(as, ir, ir->r, ofs);[m
[31m-      }[m
[31m-    } else {[m
[31m-      rlo = ra_dest(as, ir, RSET_FPR);[m
[31m-    }[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_EQ);[m
[31m-  if (destused)[m
[31m-    emit_vlso(as, ARMI_VLDR_D, rlo, RID_SP, 0);[m
[31m-#endif[m
[31m-  emit_n(as, ARMI_CMP|ARMI_K12|0, RID_RET);  /* Test return status. */[m
[31m-  args[0] = ir->op1;      /* GCstr *str */[m
[31m-  args[1] = ASMREF_TMP1;  /* TValue *n  */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  tmp = ra_releasetmp(as, ASMREF_TMP1);[m
[31m-  if (ofs == 0)[m
[31m-    emit_dm(as, ARMI_MOV, tmp, RID_SP);[m
[31m-  else[m
[31m-    emit_opk(as, ARMI_ADD, tmp, RID_SP, ofs, RSET_GPR);[m
[31m-}[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-/* Get pointer to TValue. */[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (irref_isk(ref)) {[m
[31m-      /* Use the number constant itself as a TValue. */[m
[31m-      ra_allockreg(as, i32ptr(ir_knum(ir)), dest);[m
[31m-    } else {[m
[31m-#if LJ_SOFTFP[m
[31m-      lua_assert(0);[m
[31m-#else[m
[31m-      /* Otherwise force a spill and use the spill slot. */[m
[31m-      emit_opk(as, ARMI_ADD, dest, RID_SP, ra_spill(as, ir), RSET_GPR);[m
[31m-#endif[m
[31m-    }[m
[31m-  } else {[m
[31m-    /* Otherwise use [sp] and [sp+4] to hold the TValue. */[m
[31m-    RegSet allow = rset_exclude(RSET_GPR, dest);[m
[31m-    Reg type;[m
[31m-    emit_dm(as, ARMI_MOV, dest, RID_SP);[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, allow);[m
[31m-      emit_lso(as, ARMI_STR, src, RID_SP, 0);[m
[31m-    }[m
[31m-    if (LJ_SOFTFP && (ir+1)->o == IR_HIOP)[m
[31m-      type = ra_alloc1(as, ref+1, allow);[m
[31m-    else[m
[31m-      type = ra_allock(as, irt_toitype(ir->t), allow);[m
[31m-    emit_lso(as, ARMI_STR, type, RID_SP, 4);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_aref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx, base;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    IRRef tab = IR(ir->op1)->op1;[m
[31m-    int32_t ofs = asm_fuseabase(as, tab);[m
[31m-    IRRef refa = ofs ? tab : ir->op1;[m
[31m-    uint32_t k = emit_isk12(ARMI_ADD, ofs + 8*IR(ir->op2)->i);[m
[31m-    if (k) {[m
[31m-      base = ra_alloc1(as, refa, RSET_GPR);[m
[31m-      emit_dn(as, ARMI_ADD^k, dest, base);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));[m
[31m-  emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 3), dest, base, idx);[m
[31m-}[m
[31m-[m
[31m-/* Inlined hash lookup. Specialized for key type and for const keys.[m
[31m-** The equivalent C code is:[m
[31m-**   Node *n = hashkey(t, key);[m
[31m-**   do {[m
[31m-**     if (lj_obj_equal(&n->key, key)) return &n->val;[m
[31m-**   } while ((n = nextnode(n)));[m
[31m-**   return niltv(L);[m
[31m-*/[m
[31m-static void asm_href(ASMState *as, IRIns *ir, IROp merge)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int destused = ra_used(ir);[m
[31m-  Reg dest = ra_dest(as, ir, allow);[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));[m
[31m-  Reg key = 0, keyhi = 0, keynumhi = RID_NONE, tmp = RID_TMP;[m
[31m-  IRRef refkey = ir->op2;[m
[31m-  IRIns *irkey = IR(refkey);[m
[31m-  IRType1 kt = irkey->t;[m
[31m-  int32_t k = 0, khi = emit_isk12(ARMI_CMP, irt_toitype(kt));[m
[31m-  uint32_t khash;[m
[31m-  MCLabel l_end, l_loop;[m
[31m-  rset_clear(allow, tab);[m
[31m-  if (!irref_isk(refkey) || irt_isstr(kt)) {[m
[31m-#if LJ_SOFTFP[m
[31m-    key = ra_alloc1(as, refkey, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-    if (irkey[1].o == IR_HIOP) {[m
[31m-      if (ra_hasreg((irkey+1)->r)) {[m
[31m-	keynumhi = (irkey+1)->r;[m
[31m-	keyhi = RID_TMP;[m
[31m-	ra_noweak(as, keynumhi);[m
[31m-      } else {[m
[31m-	keyhi = keynumhi = ra_allocref(as, refkey+1, allow);[m
[31m-      }[m
[31m-      rset_clear(allow, keynumhi);[m
[31m-      khi = 0;[m
[31m-    }[m
[31m-#else[m
[31m-    if (irt_isnum(kt)) {[m
[31m-      key = ra_scratch(as, allow);[m
[31m-      rset_clear(allow, key);[m
[31m-      keyhi = keynumhi = ra_scratch(as, allow);[m
[31m-      rset_clear(allow, keyhi);[m
[31m-      khi = 0;[m
[31m-    } else {[m
[31m-      key = ra_alloc1(as, refkey, allow);[m
[31m-      rset_clear(allow, key);[m
[31m-    }[m
[31m-#endif[m
[31m-  } else if (irt_isnum(kt)) {[m
[31m-    int32_t val = (int32_t)ir_knum(irkey)->u32.lo;[m
[31m-    k = emit_isk12(ARMI_CMP, val);[m
[31m-    if (!k) {[m
[31m-      key = ra_allock(as, val, allow);[m
[31m-      rset_clear(allow, key);[m
[31m-    }[m
[31m-    val = (int32_t)ir_knum(irkey)->u32.hi;[m
[31m-    khi = emit_isk12(ARMI_CMP, val);[m
[31m-    if (!khi) {[m
[31m-      keyhi = ra_allock(as, val, allow);[m
[31m-      rset_clear(allow, keyhi);[m
[31m-    }[m
[31m-  } else if (!irt_ispri(kt)) {[m
[31m-    k = emit_isk12(ARMI_CMP, irkey->i);[m
[31m-    if (!k) {[m
[31m-      key = ra_alloc1(as, refkey, allow);[m
[31m-      rset_clear(allow, key);[m
[31m-    }[m
[31m-  }[m
[31m-  if (!irt_ispri(kt))[m
[31m-    tmp = ra_scratchpair(as, allow);[m
[31m-[m
[31m-  /* Key not found in chain: jump to exit (if merged) or load niltv. */[m
[31m-  l_end = emit_label(as);[m
[31m-  as->invmcp = NULL;[m
[31m-  if (merge == IR_NE)[m
[31m-    asm_guardcc(as, CC_AL);[m
[31m-  else if (destused)[m
[31m-    emit_loada(as, dest, niltvg(J2G(as->J)));[m
[31m-[m
[31m-  /* Follow hash chain until the end. */[m
[31m-  l_loop = --as->mcp;[m
[31m-  emit_n(as, ARMI_CMP|ARMI_K12|0, dest);[m
[31m-  emit_lso(as, ARMI_LDR, dest, dest, (int32_t)offsetof(Node, next));[m
[31m-[m
[31m-  /* Type and value comparison. */[m
[31m-  if (merge == IR_EQ)[m
[31m-    asm_guardcc(as, CC_EQ);[m
[31m-  else[m
[31m-    emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end);[m
[31m-  if (!irt_ispri(kt)) {[m
[31m-    emit_nm(as, ARMF_CC(ARMI_CMP, CC_EQ)^k, tmp, key);[m
[31m-    emit_nm(as, ARMI_CMP^khi, tmp+1, keyhi);[m
[31m-    emit_lsox(as, ARMI_LDRD, tmp, dest, (int32_t)offsetof(Node, key));[m
[31m-  } else {[m
[31m-    emit_n(as, ARMI_CMP^khi, tmp);[m
[31m-    emit_lso(as, ARMI_LDR, tmp, dest, (int32_t)offsetof(Node, key.it));[m
[31m-  }[m
[31m-  *l_loop = ARMF_CC(ARMI_B, CC_NE) | ((as->mcp-l_loop-2) & 0x00ffffffu);[m
[31m-[m
[31m-  /* Load main position relative to tab->node into dest. */[m
[31m-  khash = irref_isk(refkey) ? ir_khash(irkey) : 1;[m
[31m-  if (khash == 0) {[m
[31m-    emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-  } else {[m
[31m-    emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 3), dest, dest, tmp);[m
[31m-    emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 1), tmp, tmp, tmp);[m
[31m-    if (irt_isstr(kt)) {  /* Fetch of str->hash is cheaper than ra_allock. */[m
[31m-      emit_dnm(as, ARMI_AND, tmp, tmp+1, RID_TMP);[m
[31m-      emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-      emit_lso(as, ARMI_LDR, tmp+1, key, (int32_t)offsetof(GCstr, hash));[m
[31m-      emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-    } else if (irref_isk(refkey)) {[m
[31m-      emit_opk(as, ARMI_AND, tmp, RID_TMP, (int32_t)khash,[m
[31m-	       rset_exclude(rset_exclude(RSET_GPR, tab), dest));[m
[31m-      emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-      emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-    } else {  /* Must match with hash*() in lj_tab.c. */[m
[31m-      if (ra_hasreg(keynumhi)) {  /* Canonicalize +-0.0 to 0.0. */[m
[31m-	if (keyhi == RID_TMP)[m
[31m-	  emit_dm(as, ARMF_CC(ARMI_MOV, CC_NE), keyhi, keynumhi);[m
[31m-	emit_d(as, ARMF_CC(ARMI_MOV, CC_EQ)|ARMI_K12|0, keyhi);[m
[31m-      }[m
[31m-      emit_dnm(as, ARMI_AND, tmp, tmp, RID_TMP);[m
[31m-      emit_dnm(as, ARMI_SUB|ARMF_SH(ARMSH_ROR, 32-HASH_ROT3), tmp, tmp, tmp+1);[m
[31m-      emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-      emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_ROR, 32-((HASH_ROT2+HASH_ROT1)&31)),[m
[31m-	       tmp, tmp+1, tmp);[m
[31m-      emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-      emit_dnm(as, ARMI_SUB|ARMF_SH(ARMSH_ROR, 32-HASH_ROT1), tmp+1, tmp+1, tmp);[m
[31m-      if (ra_hasreg(keynumhi)) {[m
[31m-	emit_dnm(as, ARMI_EOR, tmp+1, tmp, key);[m
[31m-	emit_dnm(as, ARMI_ORR|ARMI_S, RID_TMP, tmp, key);  /* Test for +-0.0. */[m
[31m-	emit_dnm(as, ARMI_ADD, tmp, keynumhi, keynumhi);[m
[31m-#if !LJ_SOFTFP[m
[31m-	emit_dnm(as, ARMI_VMOV_RR_D, key, keynumhi,[m
[31m-		 (ra_alloc1(as, refkey, RSET_FPR) & 15));[m
[31m-#endif[m
[31m-      } else {[m
[31m-	emit_dnm(as, ARMI_EOR, tmp+1, tmp, key);[m
[31m-	emit_opk(as, ARMI_ADD, tmp, key, (int32_t)HASH_BIAS,[m
[31m-		 rset_exclude(rset_exclude(RSET_GPR, tab), key));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_hrefk(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *kslot = IR(ir->op2);[m
[31m-  IRIns *irkey = IR(kslot->op1);[m
[31m-  int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node));[m
[31m-  int32_t kofs = ofs + (int32_t)offsetof(Node, key);[m
[31m-  Reg dest = (ra_used(ir) || ofs > 4095) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;[m
[31m-  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg key = RID_NONE, type = RID_TMP, idx = node;[m
[31m-  RegSet allow = rset_exclude(RSET_GPR, node);[m
[31m-  lua_assert(ofs % sizeof(Node) == 0);[m
[31m-  if (ofs > 4095) {[m
[31m-    idx = dest;[m
[31m-    rset_clear(allow, dest);[m
[31m-    kofs = (int32_t)offsetof(Node, key);[m
[31m-  } else if (ra_hasreg(dest)) {[m
[31m-    emit_opk(as, ARMI_ADD, dest, node, ofs, allow);[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  if (!irt_ispri(irkey->t)) {[m
[31m-    RegSet even = (as->freeset & allow);[m
[31m-    even = even & (even >> 1) & RSET_GPREVEN;[m
[31m-    if (even) {[m
[31m-      key = ra_scratch(as, even);[m
[31m-      if (rset_test(as->freeset, key+1)) {[m
[31m-	type = key+1;[m
[31m-	ra_modified(as, type);[m
[31m-      }[m
[31m-    } else {[m
[31m-      key = ra_scratch(as, allow);[m
[31m-    }[m
[31m-    rset_clear(allow, key);[m
[31m-  }[m
[31m-  rset_clear(allow, type);[m
[31m-  if (irt_isnum(irkey->t)) {[m
[31m-    emit_opk(as, ARMF_CC(ARMI_CMP, CC_EQ), 0, type,[m
[31m-	     (int32_t)ir_knum(irkey)->u32.hi, allow);[m
[31m-    emit_opk(as, ARMI_CMP, 0, key,[m
[31m-	     (int32_t)ir_knum(irkey)->u32.lo, allow);[m
[31m-  } else {[m
[31m-    if (ra_hasreg(key))[m
[31m-      emit_opk(as, ARMF_CC(ARMI_CMP, CC_EQ), 0, key, irkey->i, allow);[m
[31m-    emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype(irkey->t), type);[m
[31m-  }[m
[31m-  emit_lso(as, ARMI_LDR, type, idx, kofs+4);[m
[31m-  if (ra_hasreg(key)) emit_lso(as, ARMI_LDR, key, idx, kofs);[m
[31m-  if (ofs > 4095)[m
[31m-    emit_opk(as, ARMI_ADD, dest, node, ofs, RSET_GPR);[m
[31m-}[m
[31m-[m
[31m-static void asm_uref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* NYI: Check that UREFO is still open and not aliasing a slot. */[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-    MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;[m
[31m-    emit_lsptr(as, ARMI_LDR, dest, v);[m
[31m-  } else {[m
[31m-    Reg uv = ra_scratch(as, RSET_GPR);[m
[31m-    Reg func = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (ir->o == IR_UREFC) {[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_n(as, ARMI_CMP|ARMI_K12|1, RID_TMP);[m
[31m-      emit_opk(as, ARMI_ADD, dest, uv,[m
[31m-	       (int32_t)offsetof(GCupval, tv), RSET_GPR);[m
[31m-      emit_lso(as, ARMI_LDRB, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));[m
[31m-    } else {[m
[31m-      emit_lso(as, ARMI_LDR, dest, uv, (int32_t)offsetof(GCupval, v));[m
[31m-    }[m
[31m-    emit_lso(as, ARMI_LDR, uv, func,[m
[31m-	     (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(as); UNUSED(ir);[m
[31m-  lua_assert(!ra_used(ir));[m
[31m-}[m
[31m-[m
[31m-static void asm_strref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRRef ref = ir->op2, refk = ir->op1;[m
[31m-  Reg r;[m
[31m-  if (irref_isk(ref)) {[m
[31m-    IRRef tmp = refk; refk = ref; ref = tmp;[m
[31m-  } else if (!irref_isk(refk)) {[m
[31m-    uint32_t k, m = ARMI_K12|sizeof(GCstr);[m
[31m-    Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    IRIns *irr = IR(ir->op2);[m
[31m-    if (ra_hasreg(irr->r)) {[m
[31m-      ra_noweak(as, irr->r);[m
[31m-      right = irr->r;[m
[31m-    } else if (mayfuse(as, irr->op2) &&[m
[31m-	       irr->o == IR_ADD && irref_isk(irr->op2) &&[m
[31m-	       (k = emit_isk12(ARMI_ADD,[m
[31m-			       (int32_t)sizeof(GCstr) + IR(irr->op2)->i))) {[m
[31m-      m = k;[m
[31m-      right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left));[m
[31m-    } else {[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    }[m
[31m-    emit_dn(as, ARMI_ADD^m, dest, dest);[m
[31m-    emit_dnm(as, ARMI_ADD, dest, left, right);[m
[31m-    return;[m
[31m-  }[m
[31m-  r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-  emit_opk(as, ARMI_ADD, dest, r,[m
[31m-	   sizeof(GCstr) + IR(refk)->i, rset_exclude(RSET_GPR, r));[m
[31m-}[m
[31m-[m
[31m-/* -- Loads and stores ---------------------------------------------------- */[m
[31m-[m
[31m-static ARMIns asm_fxloadins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: return ARMI_LDRSB;[m
[31m-  case IRT_U8: return ARMI_LDRB;[m
[31m-  case IRT_I16: return ARMI_LDRSH;[m
[31m-  case IRT_U16: return ARMI_LDRH;[m
[31m-  case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VLDR_D;[m
[31m-  case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VLDR_S;[m
[31m-  default: return ARMI_LDR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static ARMIns asm_fxstoreins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: case IRT_U8: return ARMI_STRB;[m
[31m-  case IRT_I16: case IRT_U16: return ARMI_STRH;[m
[31m-  case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VSTR_D;[m
[31m-  case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VSTR_S;[m
[31m-  default: return ARMI_STR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  ARMIns ai = asm_fxloadins(ir);[m
[31m-  int32_t ofs;[m
[31m-  if (ir->op2 == IRFL_TAB_ARRAY) {[m
[31m-    ofs = asm_fuseabase(as, ir->op1);[m
[31m-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */[m
[31m-      emit_dn(as, ARMI_ADD|ARMI_K12|ofs, dest, idx);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  ofs = field_ofs[ir->op2];[m
[31m-  if ((ai & 0x04000000))[m
[31m-    emit_lso(as, ai, dest, idx, ofs);[m
[31m-  else[m
[31m-    emit_lsox(as, ai, dest, idx, ofs);[m
[31m-}[m
[31m-[m
[31m-static void asm_fstore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-    IRIns *irf = IR(ir->op1);[m
[31m-    Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src));[m
[31m-    int32_t ofs = field_ofs[irf->op2];[m
[31m-    ARMIns ai = asm_fxstoreins(ir);[m
[31m-    if ((ai & 0x04000000))[m
[31m-      emit_lso(as, ai, src, idx, ofs);[m
[31m-    else[m
[31m-      emit_lsox(as, ai, src, idx, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_xload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir,[m
[31m-		     (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-  lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED));[m
[31m-  asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0);[m
[31m-}[m
[31m-[m
[31m-static void asm_xstore_(ASMState *as, IRIns *ir, int32_t ofs)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2,[m
[31m-			(!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-    asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1,[m
[31m-		 rset_exclude(RSET_GPR, src), ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_xstore(as, ir)	asm_xstore_(as, ir, 0)[m
[31m-[m
[31m-static void asm_ahuvload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);[m
[31m-  Reg dest = RID_NONE, type = RID_NONE, idx;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int32_t ofs = 0;[m
[31m-  if (hiop && ra_used(ir+1)) {[m
[31m-    type = ra_dest(as, ir+1, allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||[m
[31m-	       irt_isint(ir->t) || irt_isaddr(ir->t));[m
[31m-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);[m
[31m-    rset_clear(allow, dest);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow,[m
[31m-		       (!LJ_SOFTFP && t == IRT_NUM) ? 1024 : 4096);[m
[31m-  if (!hiop || type == RID_NONE) {[m
[31m-    rset_clear(allow, idx);[m
[31m-    if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 &&[m
[31m-	rset_test((as->freeset & allow), dest+1)) {[m
[31m-      type = dest+1;[m
[31m-      ra_modified(as, type);[m
[31m-    } else {[m
[31m-      type = RID_TMP;[m
[31m-    }[m
[31m-  }[m
[31m-  asm_guardcc(as, t == IRT_NUM ? CC_HS : CC_NE);[m
[31m-  emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype_(t), type);[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-#if !LJ_SOFTFP[m
[31m-    if (t == IRT_NUM)[m
[31m-      emit_vlso(as, ARMI_VLDR_D, dest, idx, ofs);[m
[31m-    else[m
[31m-#endif[m
[31m-      emit_lso(as, ARMI_LDR, dest, idx, ofs);[m
[31m-  }[m
[31m-  emit_lso(as, ARMI_LDR, type, idx, ofs+4);[m
[31m-}[m
[31m-[m
[31m-static void asm_ahustore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    RegSet allow = RSET_GPR;[m
[31m-    Reg idx, src = RID_NONE, type = RID_NONE;[m
[31m-    int32_t ofs = 0;[m
[31m-#if !LJ_SOFTFP[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-      src = ra_alloc1(as, ir->op2, RSET_FPR);[m
[31m-      idx = asm_fuseahuref(as, ir->op1, &ofs, allow, 1024);[m
[31m-      emit_vlso(as, ARMI_VSTR_D, src, idx, ofs);[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-      int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-      if (!irt_ispri(ir->t)) {[m
[31m-	src = ra_alloc1(as, ir->op2, allow);[m
[31m-	rset_clear(allow, src);[m
[31m-      }[m
[31m-      if (hiop)[m
[31m-	type = ra_alloc1(as, (ir+1)->op2, allow);[m
[31m-      else[m
[31m-	type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-      idx = asm_fuseahuref(as, ir->op1, &ofs, rset_exclude(allow, type), 4096);[m
[31m-      if (ra_hasreg(src)) emit_lso(as, ARMI_STR, src, idx, ofs);[m
[31m-      emit_lso(as, ARMI_STR, type, idx, ofs+4);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);[m
[31m-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);[m
[31m-  Reg dest = RID_NONE, type = RID_NONE, base;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */[m
[31m-  lua_assert(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_CONVERT));  /* Handled by LJ_SOFTFP SPLIT. */[m
[31m-  if (hiop && ra_used(ir+1)) {[m
[31m-    type = ra_dest(as, ir+1, allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-#else[m
[31m-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(ir->t) && t == IRT_INT) {[m
[31m-    dest = ra_scratch(as, RSET_FPR);[m
[31m-    asm_tointg(as, ir, dest);[m
[31m-    t = IRT_NUM;  /* Continue with a regular number type check. */[m
[31m-  } else[m
[31m-#endif[m
[31m-  if (ra_used(ir)) {[m
[31m-    Reg tmp = RID_NONE;[m
[31m-    if ((ir->op2 & IRSLOAD_CONVERT))[m
[31m-      tmp = ra_scratch(as, t == IRT_INT ? RSET_FPR : RSET_GPR);[m
[31m-    lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||[m
[31m-	       irt_isint(ir->t) || irt_isaddr(ir->t));[m
[31m-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);[m
[31m-    rset_clear(allow, dest);[m
[31m-    base = ra_alloc1(as, REF_BASE, allow);[m
[31m-    if ((ir->op2 & IRSLOAD_CONVERT)) {[m
[31m-      if (t == IRT_INT) {[m
[31m-	emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15));[m
[31m-	emit_dm(as, ARMI_VCVT_S32_F64, (tmp & 15), (tmp & 15));[m
[31m-	t = IRT_NUM;  /* Check for original type. */[m
[31m-      } else {[m
[31m-	emit_dm(as, ARMI_VCVT_F64_S32, (dest & 15), (dest & 15));[m
[31m-	emit_dn(as, ARMI_VMOV_S_R, tmp, (dest & 15));[m
[31m-	t = IRT_INT;  /* Check for original type. */[m
[31m-      }[m
[31m-      dest = tmp;[m
[31m-    }[m
[31m-    goto dotypecheck;[m
[31m-  }[m
[31m-  base = ra_alloc1(as, REF_BASE, allow);[m
[31m-dotypecheck:[m
[31m-  rset_clear(allow, base);[m
[31m-  if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-    if (ra_noreg(type)) {[m
[31m-      if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 &&[m
[31m-	  rset_test((as->freeset & allow), dest+1)) {[m
[31m-	type = dest+1;[m
[31m-	ra_modified(as, type);[m
[31m-      } else {[m
[31m-	type = RID_TMP;[m
[31m-      }[m
[31m-    }[m
[31m-    asm_guardcc(as, t == IRT_NUM ? CC_HS : CC_NE);[m
[31m-    emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype_(t), type);[m
[31m-  }[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-#if !LJ_SOFTFP[m
[31m-    if (t == IRT_NUM) {[m
[31m-      if (ofs < 1024) {[m
[31m-	emit_vlso(as, ARMI_VLDR_D, dest, base, ofs);[m
[31m-      } else {[m
[31m-	if (ra_hasreg(type)) emit_lso(as, ARMI_LDR, type, base, ofs+4);[m
[31m-	emit_vlso(as, ARMI_VLDR_D, dest, RID_TMP, 0);[m
[31m-	emit_opk(as, ARMI_ADD, RID_TMP, base, ofs, allow);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else[m
[31m-#endif[m
[31m-      emit_lso(as, ARMI_LDR, dest, base, ofs);[m
[31m-  }[m
[31m-  if (ra_hasreg(type)) emit_lso(as, ARMI_LDR, type, base, ofs+4);[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_cnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(as->J));[m
[31m-  CTypeID id = (CTypeID)IR(ir->op1)->i;[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco];[m
[31m-  IRRef args[4];[m
[31m-  RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL));[m
[31m-[m
[31m-  as->gcsteps++;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  if (ra_used(ir))[m
[31m-    ra_destreg(as, ir, RID_RET);  /* GCcdata * */[m
[31m-[m
[31m-  /* Initialize immutable cdata object. */[m
[31m-  if (ir->o == IR_CNEWI) {[m
[31m-    int32_t ofs = sizeof(GCcdata);[m
[31m-    lua_assert(sz == 4 || sz == 8);[m
[31m-    if (sz == 8) {[m
[31m-      ofs += 4; ir++;[m
[31m-      lua_assert(ir->o == IR_HIOP);[m
[31m-    }[m
[31m-    for (;;) {[m
[31m-      Reg r = ra_alloc1(as, ir->op2, allow);[m
[31m-      emit_lso(as, ARMI_STR, r, RID_RET, ofs);[m
[31m-      rset_clear(allow, r);[m
[31m-      if (ofs == sizeof(GCcdata)) break;[m
[31m-      ofs -= 4; ir--;[m
[31m-    }[m
[31m-  } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];[m
[31m-    args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-    args[1] = ir->op1;      /* CTypeID id   */[m
[31m-    args[2] = ir->op2;      /* CTSize sz    */[m
[31m-    args[3] = ASMREF_TMP1;  /* CTSize align */[m
[31m-    asm_gencall(as, ci, args);[m
[31m-    emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)ctype_align(info));[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */[m
[31m-  {[m
[31m-    uint32_t k = emit_isk12(ARMI_MOV, id);[m
[31m-    Reg r = k ? RID_R1 : ra_allock(as, id, allow);[m
[31m-    emit_lso(as, ARMI_STRB, RID_TMP, RID_RET, offsetof(GCcdata, gct));[m
[31m-    emit_lsox(as, ARMI_STRH, r, RID_RET, offsetof(GCcdata, ctypeid));[m
[31m-    emit_d(as, ARMI_MOV|ARMI_K12|~LJ_TCDATA, RID_TMP);[m
[31m-    if (k) emit_d(as, ARMI_MOV^k, RID_R1);[m
[31m-  }[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ASMREF_TMP1;  /* MSize size   */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)),[m
[31m-	       ra_releasetmp(as, ASMREF_TMP1));[m
[31m-}[m
[31m-#else[m
[31m-#define asm_cnew(as, ir)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-static void asm_tbar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg link = ra_scratch(as, rset_exclude(RSET_GPR, tab));[m
[31m-  Reg gr = ra_allock(as, i32ptr(J2G(as->J)),[m
[31m-		     rset_exclude(rset_exclude(RSET_GPR, tab), link));[m
[31m-  Reg mark = RID_TMP;[m
[31m-  MCLabel l_end = emit_label(as);[m
[31m-  emit_lso(as, ARMI_STR, link, tab, (int32_t)offsetof(GCtab, gclist));[m
[31m-  emit_lso(as, ARMI_STRB, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-  emit_lso(as, ARMI_STR, tab, gr,[m
[31m-	   (int32_t)offsetof(global_State, gc.grayagain));[m
[31m-  emit_dn(as, ARMI_BIC|ARMI_K12|LJ_GC_BLACK, mark, mark);[m
[31m-  emit_lso(as, ARMI_LDR, link, gr,[m
[31m-	   (int32_t)offsetof(global_State, gc.grayagain));[m
[31m-  emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end);[m
[31m-  emit_n(as, ARMI_TST|ARMI_K12|LJ_GC_BLACK, mark);[m
[31m-  emit_lso(as, ARMI_LDRB, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-}[m
[31m-[m
[31m-static void asm_obar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg obj, val, tmp;[m
[31m-  /* No need for other object barriers (yet). */[m
[31m-  lua_assert(IR(ir->op1)->o == IR_UREFC);[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ir->op1;      /* TValue *tv      */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  if ((l_end[-1] >> 28) == CC_AL)[m
[31m-    l_end[-1] = ARMF_CC(l_end[-1], CC_NE);[m
[31m-  else[m
[31m-    emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end);[m
[31m-  ra_allockreg(as, i32ptr(J2G(as->J)), ra_releasetmp(as, ASMREF_TMP1));[m
[31m-  obj = IR(ir->op1)->r;[m
[31m-  tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_n(as, ARMF_CC(ARMI_TST, CC_NE)|ARMI_K12|LJ_GC_BLACK, tmp);[m
[31m-  emit_n(as, ARMI_TST|ARMI_K12|LJ_GC_WHITES, RID_TMP);[m
[31m-  val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_lso(as, ARMI_LDRB, tmp, obj,[m
[31m-	   (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));[m
[31m-  emit_lso(as, ARMI_LDRB, RID_TMP, val, (int32_t)offsetof(GChead, marked));[m
[31m-}[m
[31m-[m
[31m-/* -- Arithmetic and logic operations ------------------------------------- */[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_fparith(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  emit_dnm(as, ai, (dest & 15), (left & 15), (right & 15));[m
[31m-}[m
[31m-[m
[31m-static void asm_fpunary(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR);[m
[31m-  emit_dm(as, ai, (dest & 15), (left & 15));[m
[31m-}[m
[31m-[m
[31m-static void asm_callround(ASMState *as, IRIns *ir, int id)[m
[31m-{[m
[31m-  /* The modified regs must match with the *.dasc implementation. */[m
[31m-  RegSet drop = RID2RSET(RID_R0)|RID2RSET(RID_R1)|RID2RSET(RID_R2)|[m
[31m-		RID2RSET(RID_R3)|RID2RSET(RID_R12);[m
[31m-  RegSet of;[m
[31m-  Reg dest, src;[m
[31m-  ra_evictset(as, drop);[m
[31m-  dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  emit_dnm(as, ARMI_VMOV_D_RR, RID_RETLO, RID_RETHI, (dest & 15));[m
[31m-  emit_call(as, id == IRFPM_FLOOR ? (void *)lj_vm_floor_sf :[m
[31m-		id == IRFPM_CEIL ? (void *)lj_vm_ceil_sf :[m
[31m-				   (void *)lj_vm_trunc_sf);[m
[31m-  /* Workaround to protect argument GPRs from being used for remat. */[m
[31m-  of = as->freeset;[m
[31m-  as->freeset &= ~RSET_RANGE(RID_R0, RID_R1+1);[m
[31m-  as->cost[RID_R0] = as->cost[RID_R1] = REGCOST(~0u, ASMREF_L);[m
[31m-  src = ra_alloc1(as, ir->op1, RSET_FPR);  /* May alloc GPR to remat FPR. */[m
[31m-  as->freeset |= (of & RSET_RANGE(RID_R0, RID_R1+1));[m
[31m-  emit_dnm(as, ARMI_VMOV_RR_D, RID_R0, RID_R1, (src & 15));[m
[31m-}[m
[31m-[m
[31m-static void asm_fpmath(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir))[m
[31m-    return;[m
[31m-  if (ir->op2 <= IRFPM_TRUNC)[m
[31m-    asm_callround(as, ir, ir->op2);[m
[31m-  else if (ir->op2 == IRFPM_SQRT)[m
[31m-    asm_fpunary(as, ir, ARMI_VSQRT_D);[m
[31m-  else[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static int asm_swapops(ASMState *as, IRRef lref, IRRef rref)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  if (irref_isk(rref))[m
[31m-    return 0;  /* Don't swap constants to the left. */[m
[31m-  if (irref_isk(lref))[m
[31m-    return 1;  /* But swap constants to the right. */[m
[31m-  ir = IR(rref);[m
[31m-  if ((ir->o >= IR_BSHL && ir->o <= IR_BROR) ||[m
[31m-      (ir->o == IR_ADD && ir->op1 == ir->op2))[m
[31m-    return 0;  /* Don't swap fusable operands to the left. */[m
[31m-  ir = IR(lref);[m
[31m-  if ((ir->o >= IR_BSHL && ir->o <= IR_BROR) ||[m
[31m-      (ir->o == IR_ADD && ir->op1 == ir->op2))[m
[31m-    return 1;  /* But swap fusable operands to the right. */[m
[31m-  return 0;  /* Otherwise don't swap. */[m
[31m-}[m
[31m-[m
[31m-static void asm_intop(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  Reg left, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  uint32_t m;[m
[31m-  if (asm_swapops(as, lref, rref)) {[m
[31m-    IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-    if ((ai & ~ARMI_S) == ARMI_SUB || (ai & ~ARMI_S) == ARMI_SBC)[m
[31m-      ai ^= (ARMI_SUB^ARMI_RSB);[m
[31m-  }[m
[31m-  left = ra_hintalloc(as, lref, dest, RSET_GPR);[m
[31m-  m = asm_fuseopm(as, ai, rref, rset_exclude(RSET_GPR, left));[m
[31m-  if (irt_isguard(ir->t)) {  /* For IR_ADDOV etc. */[m
[31m-    asm_guardcc(as, CC_VS);[m
[31m-    ai |= ARMI_S;[m
[31m-  }[m
[31m-  emit_dn(as, ai^m, dest, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_intop_s(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  if (as->flagmcp == as->mcp) {  /* Drop cmp r, #0. */[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    ai |= ARMI_S;[m
[31m-  }[m
[31m-  asm_intop(as, ir, ai);[m
[31m-}[m
[31m-[m
[31m-static void asm_intneg(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  emit_dn(as, ai|ARMI_K12|0, dest, left);[m
[31m-}[m
[31m-[m
[31m-/* NYI: use add/shift for MUL(OV) with constants. FOLD only does 2^k. */[m
[31m-static void asm_intmul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, dest));[m
[31m-  Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  Reg tmp = RID_NONE;[m
[31m-  /* ARMv5 restriction: dest != left and dest_hi != left. */[m
[31m-  if (dest == left && left != right) { left = right; right = dest; }[m
[31m-  if (irt_isguard(ir->t)) {  /* IR_MULOV */[m
[31m-    if (!(as->flags & JIT_F_ARMV6) && dest == left)[m
[31m-      tmp = left = ra_scratch(as, rset_exclude(RSET_GPR, left));[m
[31m-    asm_guardcc(as, CC_NE);[m
[31m-    emit_nm(as, ARMI_TEQ|ARMF_SH(ARMSH_ASR, 31), RID_TMP, dest);[m
[31m-    emit_dnm(as, ARMI_SMULL|ARMF_S(right), dest, RID_TMP, left);[m
[31m-  } else {[m
[31m-    if (!(as->flags & JIT_F_ARMV6) && dest == left) tmp = left = RID_TMP;[m
[31m-    emit_nm(as, ARMI_MUL|ARMF_S(right), dest, left);[m
[31m-  }[m
[31m-  /* Only need this for the dest == left == right case. */[m
[31m-  if (ra_hasreg(tmp)) emit_dm(as, ARMI_MOV, tmp, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_add(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (!asm_fusemadd(as, ir, ARMI_VMLA_D, ARMI_VMLA_D))[m
[31m-      asm_fparith(as, ir, ARMI_VADD_D);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  asm_intop_s(as, ir, ARMI_ADD);[m
[31m-}[m
[31m-[m
[31m-static void asm_sub(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (!asm_fusemadd(as, ir, ARMI_VNMLS_D, ARMI_VMLS_D))[m
[31m-      asm_fparith(as, ir, ARMI_VSUB_D);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  asm_intop_s(as, ir, ARMI_SUB);[m
[31m-}[m
[31m-[m
[31m-static void asm_mul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, ARMI_VMUL_D);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  asm_intmul(as, ir);[m
[31m-}[m
[31m-[m
[31m-#define asm_addov(as, ir)	asm_add(as, ir)[m
[31m-#define asm_subov(as, ir)	asm_sub(as, ir)[m
[31m-#define asm_mulov(as, ir)	asm_mul(as, ir)[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-#define asm_div(as, ir)		asm_fparith(as, ir, ARMI_VDIV_D)[m
[31m-#define asm_pow(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_powi)[m
[31m-#define asm_abs(as, ir)		asm_fpunary(as, ir, ARMI_VABS_D)[m
[31m-#define asm_atan2(as, ir)	asm_callid(as, ir, IRCALL_atan2)[m
[31m-#define asm_ldexp(as, ir)	asm_callid(as, ir, IRCALL_ldexp)[m
[31m-#endif[m
[31m-[m
[31m-#define asm_mod(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_modi)[m
[31m-[m
[31m-static void asm_neg(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fpunary(as, ir, ARMI_VNEG_D);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  asm_intneg(as, ir, ARMI_RSB);[m
[31m-}[m
[31m-[m
[31m-static void asm_bitop(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  if (as->flagmcp == as->mcp) {  /* Try to drop cmp r, #0. */[m
[31m-    uint32_t cc = (as->mcp[1] >> 28);[m
[31m-    as->flagmcp = NULL;[m
[31m-    if (cc <= CC_NE) {[m
[31m-      as->mcp++;[m
[31m-      ai |= ARMI_S;[m
[31m-    } else if (cc == CC_GE) {[m
[31m-      *++as->mcp ^= ((CC_GE^CC_PL) << 28);[m
[31m-      ai |= ARMI_S;[m
[31m-    } else if (cc == CC_LT) {[m
[31m-      *++as->mcp ^= ((CC_LT^CC_MI) << 28);[m
[31m-      ai |= ARMI_S;[m
[31m-    }  /* else: other conds don't work with bit ops. */[m
[31m-  }[m
[31m-  if (ir->op2 == 0) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    uint32_t m = asm_fuseopm(as, ai, ir->op1, RSET_GPR);[m
[31m-    emit_d(as, ai^m, dest);[m
[31m-  } else {[m
[31m-    /* NYI: Turn BAND !k12 into uxtb, uxth or bfc or shl+shr. */[m
[31m-    asm_intop(as, ir, ai);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_bnot(as, ir)	asm_bitop(as, ir, ARMI_MVN)[m
[31m-[m
[31m-static void asm_bswap(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if ((as->flags & JIT_F_ARMV6)) {[m
[31m-    emit_dm(as, ARMI_REV, dest, left);[m
[31m-  } else {[m
[31m-    Reg tmp2 = dest;[m
[31m-    if (tmp2 == left)[m
[31m-      tmp2 = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, dest), left));[m
[31m-    emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_LSR, 8), dest, tmp2, RID_TMP);[m
[31m-    emit_dm(as, ARMI_MOV|ARMF_SH(ARMSH_ROR, 8), tmp2, left);[m
[31m-    emit_dn(as, ARMI_BIC|ARMI_K12|256*8|255, RID_TMP, RID_TMP);[m
[31m-    emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_ROR, 16), RID_TMP, left, left);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_band(as, ir)	asm_bitop(as, ir, ARMI_AND)[m
[31m-#define asm_bor(as, ir)		asm_bitop(as, ir, ARMI_ORR)[m
[31m-#define asm_bxor(as, ir)	asm_bitop(as, ir, ARMI_EOR)[m
[31m-[m
[31m-static void asm_bitshift(ASMState *as, IRIns *ir, ARMShift sh)[m
[31m-{[m
[31m-  if (irref_isk(ir->op2)) {  /* Constant shifts. */[m
[31m-    /* NYI: Turn SHL+SHR or BAND+SHR into uxtb, uxth or ubfx. */[m
[31m-    /* NYI: Turn SHL+ASR into sxtb, sxth or sbfx. */[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    int32_t shift = (IR(ir->op2)->i & 31);[m
[31m-    emit_dm(as, ARMI_MOV|ARMF_SH(sh, shift), dest, left);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_dm(as, ARMI_MOV|ARMF_RSH(sh, right), dest, left);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_bshl(as, ir)	asm_bitshift(as, ir, ARMSH_LSL)[m
[31m-#define asm_bshr(as, ir)	asm_bitshift(as, ir, ARMSH_LSR)[m
[31m-#define asm_bsar(as, ir)	asm_bitshift(as, ir, ARMSH_ASR)[m
[31m-#define asm_bror(as, ir)	asm_bitshift(as, ir, ARMSH_ROR)[m
[31m-#define asm_brol(as, ir)	lua_assert(0)[m
[31m-[m
[31m-static void asm_intmin_max(ASMState *as, IRIns *ir, int cc)[m
[31m-{[m
[31m-  uint32_t kcmp = 0, kmov = 0;[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  Reg right = 0;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    kcmp = emit_isk12(ARMI_CMP, IR(ir->op2)->i);[m
[31m-    if (kcmp) kmov = emit_isk12(ARMI_MOV, IR(ir->op2)->i);[m
[31m-  }[m
[31m-  if (!kmov) {[m
[31m-    kcmp = 0;[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  }[m
[31m-  if (kmov || dest != right) {[m
[31m-    emit_dm(as, ARMF_CC(ARMI_MOV, cc)^kmov, dest, right);[m
[31m-    cc ^= 1;  /* Must use opposite conditions for paired moves. */[m
[31m-  } else {[m
[31m-    cc ^= (CC_LT^CC_GT);  /* Otherwise may swap CC_LT <-> CC_GT. */[m
[31m-  }[m
[31m-  if (dest != left) emit_dm(as, ARMF_CC(ARMI_MOV, cc), dest, left);[m
[31m-  emit_nm(as, ARMI_CMP^kcmp, left, right);[m
[31m-}[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-static void asm_sfpmin_max(ASMState *as, IRIns *ir, int cc)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_softfp_cmp];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  Reg r;[m
[31m-  IRRef args[4];[m
[31m-  args[0] = ir->op1; args[1] = (ir+1)->op1;[m
[31m-  args[2] = ir->op2; args[3] = (ir+1)->op2;[m
[31m-  /* __aeabi_cdcmple preserves r0-r3. */[m
[31m-  if (ra_hasreg(ir->r)) rset_clear(drop, ir->r);[m
[31m-  if (ra_hasreg((ir+1)->r)) rset_clear(drop, (ir+1)->r);[m
[31m-  if (!rset_test(as->freeset, RID_R2) &&[m
[31m-      regcost_ref(as->cost[RID_R2]) == args[2]) rset_clear(drop, RID_R2);[m
[31m-  if (!rset_test(as->freeset, RID_R3) &&[m
[31m-      regcost_ref(as->cost[RID_R3]) == args[3]) rset_clear(drop, RID_R3);[m
[31m-  ra_evictset(as, drop);[m
[31m-  ra_destpair(as, ir);[m
[31m-  emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETHI, RID_R3);[m
[31m-  emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETLO, RID_R2);[m
[31m-  emit_call(as, (void *)ci->func);[m
[31m-  for (r = RID_R0; r <= RID_R3; r++)[m
[31m-    ra_leftov(as, r, args[r-RID_R0]);[m
[31m-}[m
[31m-#else[m
[31m-static void asm_fpmin_max(ASMState *as, IRIns *ir, int cc)[m
[31m-{[m
[31m-  Reg dest = (ra_dest(as, ir, RSET_FPR) & 15);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-  right = ((left >> 8) & 15); left &= 15;[m
[31m-  if (dest != left) emit_dm(as, ARMF_CC(ARMI_VMOV_D, cc^1), dest, left);[m
[31m-  if (dest != right) emit_dm(as, ARMF_CC(ARMI_VMOV_D, cc), dest, right);[m
[31m-  emit_d(as, ARMI_VMRS, 0);[m
[31m-  emit_dm(as, ARMI_VCMP_D, left, right);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_min_max(ASMState *as, IRIns *ir, int cc, int fcc)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  UNUSED(fcc);[m
[31m-#else[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fpmin_max(as, ir, fcc);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_intmin_max(as, ir, cc);[m
[31m-}[m
[31m-[m
[31m-#define asm_min(as, ir)		asm_min_max(as, ir, CC_GT, CC_HI)[m
[31m-#define asm_max(as, ir)		asm_min_max(as, ir, CC_LT, CC_LO)[m
[31m-[m
[31m-/* -- Comparisons --------------------------------------------------------- */[m
[31m-[m
[31m-/* Map of comparisons to flags. ORDER IR. */[m
[31m-static const uint8_t asm_compmap[IR_ABC+1] = {[m
[31m-  /* op  FP swp  int cc   FP cc */[m
[31m-  /* LT       */ CC_GE + (CC_HS << 4),[m
[31m-  /* GE    x  */ CC_LT + (CC_HI << 4),[m
[31m-  /* LE       */ CC_GT + (CC_HI << 4),[m
[31m-  /* GT    x  */ CC_LE + (CC_HS << 4),[m
[31m-  /* ULT   x  */ CC_HS + (CC_LS << 4),[m
[31m-  /* UGE      */ CC_LO + (CC_LO << 4),[m
[31m-  /* ULE   x  */ CC_HI + (CC_LO << 4),[m
[31m-  /* UGT      */ CC_LS + (CC_LS << 4),[m
[31m-  /* EQ       */ CC_NE + (CC_NE << 4),[m
[31m-  /* NE       */ CC_EQ + (CC_EQ << 4),[m
[31m-  /* ABC      */ CC_LS + (CC_LS << 4)  /* Same as UGT. */[m
[31m-};[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-/* FP comparisons. */[m
[31m-static void asm_sfpcomp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_softfp_cmp];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  Reg r;[m
[31m-  IRRef args[4];[m
[31m-  int swp = (((ir->o ^ (ir->o >> 2)) & ~(ir->o >> 3) & 1) << 1);[m
[31m-  args[swp^0] = ir->op1; args[swp^1] = (ir+1)->op1;[m
[31m-  args[swp^2] = ir->op2; args[swp^3] = (ir+1)->op2;[m
[31m-  /* __aeabi_cdcmple preserves r0-r3. This helps to reduce spills. */[m
[31m-  for (r = RID_R0; r <= RID_R3; r++)[m
[31m-    if (!rset_test(as->freeset, r) &&[m
[31m-	regcost_ref(as->cost[r]) == args[r-RID_R0]) rset_clear(drop, r);[m
[31m-  ra_evictset(as, drop);[m
[31m-  asm_guardcc(as, (asm_compmap[ir->o] >> 4));[m
[31m-  emit_call(as, (void *)ci->func);[m
[31m-  for (r = RID_R0; r <= RID_R3; r++)[m
[31m-    ra_leftov(as, r, args[r-RID_R0]);[m
[31m-}[m
[31m-#else[m
[31m-/* FP comparisons. */[m
[31m-static void asm_fpcomp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg left, right;[m
[31m-  ARMIns ai;[m
[31m-  int swp = ((ir->o ^ (ir->o >> 2)) & ~(ir->o >> 3) & 1);[m
[31m-  if (!swp && irref_isk(ir->op2) && ir_knum(IR(ir->op2))->u64 == 0) {[m
[31m-    left = (ra_alloc1(as, ir->op1, RSET_FPR) & 15);[m
[31m-    right = 0;[m
[31m-    ai = ARMI_VCMPZ_D;[m
[31m-  } else {[m
[31m-    left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    if (swp) {[m
[31m-      right = (left & 15); left = ((left >> 8) & 15);[m
[31m-    } else {[m
[31m-      right = ((left >> 8) & 15); left &= 15;[m
[31m-    }[m
[31m-    ai = ARMI_VCMP_D;[m
[31m-  }[m
[31m-  asm_guardcc(as, (asm_compmap[ir->o] >> 4));[m
[31m-  emit_d(as, ARMI_VMRS, 0);[m
[31m-  emit_dm(as, ai, left, right);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Integer comparisons. */[m
[31m-static void asm_intcomp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  ARMCC cc = (asm_compmap[ir->o] & 15);[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  Reg left;[m
[31m-  uint32_t m;[m
[31m-  int cmpprev0 = 0;[m
[31m-  lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t));[m
[31m-  if (asm_swapops(as, lref, rref)) {[m
[31m-    Reg tmp = lref; lref = rref; rref = tmp;[m
[31m-    if (cc >= CC_GE) cc ^= 7;  /* LT <-> GT, LE <-> GE */[m
[31m-    else if (cc > CC_NE) cc ^= 11;  /* LO <-> HI, LS <-> HS */[m
[31m-  }[m
[31m-  if (irref_isk(rref) && IR(rref)->i == 0) {[m
[31m-    IRIns *irl = IR(lref);[m
[31m-    cmpprev0 = (irl+1 == ir);[m
[31m-    /* Combine comp(BAND(left, right), 0) into tst left, right. */[m
[31m-    if (cmpprev0 && irl->o == IR_BAND && !ra_used(irl)) {[m
[31m-      IRRef blref = irl->op1, brref = irl->op2;[m
[31m-      uint32_t m2 = 0;[m
[31m-      Reg bleft;[m
[31m-      if (asm_swapops(as, blref, brref)) {[m
[31m-	Reg tmp = blref; blref = brref; brref = tmp;[m
[31m-      }[m
[31m-      if (irref_isk(brref)) {[m
[31m-	m2 = emit_isk12(ARMI_AND, IR(brref)->i);[m
[31m-	if ((m2 & (ARMI_AND^ARMI_BIC)))[m
[31m-	  goto notst;  /* Not beneficial if we miss a constant operand. */[m
[31m-      }[m
[31m-      if (cc == CC_GE) cc = CC_PL;[m
[31m-      else if (cc == CC_LT) cc = CC_MI;[m
[31m-      else if (cc > CC_NE) goto notst;  /* Other conds don't work with tst. */[m
[31m-      bleft = ra_alloc1(as, blref, RSET_GPR);[m
[31m-      if (!m2) m2 = asm_fuseopm(as, 0, brref, rset_exclude(RSET_GPR, bleft));[m
[31m-      asm_guardcc(as, cc);[m
[31m-      emit_n(as, ARMI_TST^m2, bleft);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-notst:[m
[31m-  left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-  m = asm_fuseopm(as, ARMI_CMP, rref, rset_exclude(RSET_GPR, left));[m
[31m-  asm_guardcc(as, cc);[m
[31m-  emit_n(as, ARMI_CMP^m, left);[m
[31m-  /* Signed comparison with zero and referencing previous ins? */[m
[31m-  if (cmpprev0 && (cc <= CC_NE || cc >= CC_GE))[m
[31m-    as->flagmcp = as->mcp;  /* Allow elimination of the compare. */[m
[31m-}[m
[31m-[m
[31m-static void asm_comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fpcomp(as, ir);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_intcomp(as, ir);[m
[31m-}[m
[31m-[m
[31m-#define asm_equal(as, ir)	asm_comp(as, ir)[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* 64 bit integer comparisons. */[m
[31m-static void asm_int64comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int signedcomp = (ir->o <= IR_GT);[m
[31m-  ARMCC cclo, cchi;[m
[31m-  Reg leftlo, lefthi;[m
[31m-  uint32_t mlo, mhi;[m
[31m-  RegSet allow = RSET_GPR, oldfree;[m
[31m-[m
[31m-  /* Always use unsigned comparison for loword. */[m
[31m-  cclo = asm_compmap[ir->o + (signedcomp ? 4 : 0)] & 15;[m
[31m-  leftlo = ra_alloc1(as, ir->op1, allow);[m
[31m-  oldfree = as->freeset;[m
[31m-  mlo = asm_fuseopm(as, ARMI_CMP, ir->op2, rset_clear(allow, leftlo));[m
[31m-  allow &= ~(oldfree & ~as->freeset);  /* Update for allocs of asm_fuseopm. */[m
[31m-[m
[31m-  /* Use signed or unsigned comparison for hiword. */[m
[31m-  cchi = asm_compmap[ir->o] & 15;[m
[31m-  lefthi = ra_alloc1(as, (ir+1)->op1, allow);[m
[31m-  mhi = asm_fuseopm(as, ARMI_CMP, (ir+1)->op2, rset_clear(allow, lefthi));[m
[31m-[m
[31m-  /* All register allocations must be performed _before_ this point. */[m
[31m-  if (signedcomp) {[m
[31m-    MCLabel l_around = emit_label(as);[m
[31m-    asm_guardcc(as, cclo);[m
[31m-    emit_n(as, ARMI_CMP^mlo, leftlo);[m
[31m-    emit_branch(as, ARMF_CC(ARMI_B, CC_NE), l_around);[m
[31m-    if (cchi == CC_GE || cchi == CC_LE) cchi ^= 6;  /* GE -> GT, LE -> LT */[m
[31m-    asm_guardcc(as, cchi);[m
[31m-  } else {[m
[31m-    asm_guardcc(as, cclo);[m
[31m-    emit_n(as, ARMF_CC(ARMI_CMP, CC_EQ)^mlo, leftlo);[m
[31m-  }[m
[31m-  emit_n(as, ARMI_CMP^mhi, lefthi);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */[m
[31m-[m
[31m-/* Hiword op of a split 64 bit op. Previous op must be the loword op. */[m
[31m-static void asm_hiop(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_HASFFI || LJ_SOFTFP[m
[31m-  /* HIOP is marked as a store because it needs its own DCE logic. */[m
[31m-  int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */[m
[31m-  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;[m
[31m-  if ((ir-1)->o <= IR_NE) {  /* 64 bit integer or FP comparisons. ORDER IR. */[m
[31m-    as->curins--;  /* Always skip the loword comparison. */[m
[31m-#if LJ_SOFTFP[m
[31m-    if (!irt_isint(ir->t)) {[m
[31m-      asm_sfpcomp(as, ir-1);[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-    asm_int64comp(as, ir-1);[m
[31m-#endif[m
[31m-    return;[m
[31m-#if LJ_SOFTFP[m
[31m-  } else if ((ir-1)->o == IR_MIN || (ir-1)->o == IR_MAX) {[m
[31m-    as->curins--;  /* Always skip the loword min/max. */[m
[31m-    if (uselo || usehi)[m
[31m-      asm_sfpmin_max(as, ir-1, (ir-1)->o == IR_MIN ? CC_HI : CC_LO);[m
[31m-    return;[m
[31m-#elif LJ_HASFFI[m
[31m-  } else if ((ir-1)->o == IR_CONV) {[m
[31m-    as->curins--;  /* Always skip the CONV. */[m
[31m-    if (usehi || uselo)[m
[31m-      asm_conv64(as, ir);[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else if ((ir-1)->o == IR_XSTORE) {[m
[31m-    if ((ir-1)->r != RID_SINK)[m
[31m-      asm_xstore_(as, ir, 4);[m
[31m-    return;[m
[31m-  }[m
[31m-  if (!usehi) return;  /* Skip unused hiword op for all remaining ops. */[m
[31m-  switch ((ir-1)->o) {[m
[31m-#if LJ_HASFFI[m
[31m-  case IR_ADD:[m
[31m-    as->curins--;[m
[31m-    asm_intop(as, ir, ARMI_ADC);[m
[31m-    asm_intop(as, ir-1, ARMI_ADD|ARMI_S);[m
[31m-    break;[m
[31m-  case IR_SUB:[m
[31m-    as->curins--;[m
[31m-    asm_intop(as, ir, ARMI_SBC);[m
[31m-    asm_intop(as, ir-1, ARMI_SUB|ARMI_S);[m
[31m-    break;[m
[31m-  case IR_NEG:[m
[31m-    as->curins--;[m
[31m-    asm_intneg(as, ir, ARMI_RSC);[m
[31m-    asm_intneg(as, ir-1, ARMI_RSB|ARMI_S);[m
[31m-    break;[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-  case IR_STRTO:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RSET_GPR);  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-#endif[m
[31m-  case IR_CALLN:[m
[31m-  case IR_CALLS:[m
[31m-  case IR_CALLXS:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RID2RSET(RID_RETLO));  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_TOSTR:[m
[31m-#endif[m
[31m-  case IR_CNEWI:[m
[31m-    /* Nothing to do here. Handled by lo op itself. */[m
[31m-    break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(as); UNUSED(ir); lua_assert(0);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_prof(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_n(as, ARMI_TST|ARMI_K12|HOOK_PROFILE, RID_TMP);[m
[31m-  emit_lsptr(as, ARMI_LDRB, RID_TMP, (void *)&J2G(as->J)->hookmask);[m
[31m-}[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check Lua stack size for overflow. Use exit handler as fallback. */[m
[31m-static void asm_stack_check(ASMState *as, BCReg topslot,[m
[31m-			    IRIns *irp, RegSet allow, ExitNo exitno)[m
[31m-{[m
[31m-  Reg pbase;[m
[31m-  uint32_t k;[m
[31m-  if (irp) {[m
[31m-    if (!ra_hasspill(irp->s)) {[m
[31m-      pbase = irp->r;[m
[31m-      lua_assert(ra_hasreg(pbase));[m
[31m-    } else if (allow) {[m
[31m-      pbase = rset_pickbot(allow);[m
[31m-    } else {[m
[31m-      pbase = RID_RET;[m
[31m-      emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0);  /* Restore temp. register. */[m
[31m-    }[m
[31m-  } else {[m
[31m-    pbase = RID_BASE;[m
[31m-  }[m
[31m-  emit_branch(as, ARMF_CC(ARMI_BL, CC_LS), exitstub_addr(as->J, exitno));[m
[31m-  k = emit_isk12(0, (int32_t)(8*topslot));[m
[31m-  lua_assert(k);[m
[31m-  emit_n(as, ARMI_CMP^k, RID_TMP);[m
[31m-  emit_dnm(as, ARMI_SUB, RID_TMP, RID_TMP, pbase);[m
[31m-  emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP,[m
[31m-	   (int32_t)offsetof(lua_State, maxstack));[m
[31m-  if (irp) {  /* Must not spill arbitrary registers in head of side trace. */[m
[31m-    int32_t i = i32ptr(&J2G(as->J)->cur_L);[m
[31m-    if (ra_hasspill(irp->s))[m
[31m-      emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s));[m
[31m-    emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095));[m
[31m-    if (ra_hasspill(irp->s) && !allow)[m
[31m-      emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0);  /* Save temp. register. */[m
[31m-    emit_loadi(as, RID_TMP, (i & ~4095));[m
[31m-  } else {[m
[31m-    emit_getgl(as, RID_TMP, cur_L);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Restore Lua stack from on-trace state. */[m
[31m-static void asm_stack_restore(ASMState *as, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  /* Store the value of all modified slots to the Lua stack. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    int32_t ofs = 8*((int32_t)s-1);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if ((sn & SNAP_NORESTORE))[m
[31m-      continue;[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-#if LJ_SOFTFP[m
[31m-      RegSet odd = rset_exclude(RSET_GPRODD, RID_BASE);[m
[31m-      Reg tmp;[m
[31m-      lua_assert(irref_isk(ref));  /* LJ_SOFTFP: must be a number constant. */[m
[31m-      tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.lo,[m
[31m-		      rset_exclude(RSET_GPREVEN, RID_BASE));[m
[31m-      emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs);[m
[31m-      if (rset_test(as->freeset, tmp+1)) odd = RID2RSET(tmp+1);[m
[31m-      tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.hi, odd);[m
[31m-      emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs+4);[m
[31m-#else[m
[31m-      Reg src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-      emit_vlso(as, ARMI_VSTR_D, src, RID_BASE, ofs);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      RegSet odd = rset_exclude(RSET_GPRODD, RID_BASE);[m
[31m-      Reg type;[m
[31m-      lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));[m
[31m-      if (!irt_ispri(ir->t)) {[m
[31m-	Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPREVEN, RID_BASE));[m
[31m-	emit_lso(as, ARMI_STR, src, RID_BASE, ofs);[m
[31m-	if (rset_test(as->freeset, src+1)) odd = RID2RSET(src+1);[m
[31m-      }[m
[31m-      if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	if (s == 0) continue;  /* Do not overwrite link to previous frame. */[m
[31m-	type = ra_allock(as, (int32_t)(*flinks--), odd);[m
[31m-#if LJ_SOFTFP[m
[31m-      } else if ((sn & SNAP_SOFTFPNUM)) {[m
[31m-	type = ra_alloc1(as, ref+1, rset_exclude(RSET_GPRODD, RID_BASE));[m
[31m-#endif[m
[31m-      } else {[m
[31m-	type = ra_allock(as, (int32_t)irt_toitype(ir->t), odd);[m
[31m-      }[m
[31m-      emit_lso(as, ARMI_STR, type, RID_BASE, ofs+4);[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-}[m
[31m-[m
[31m-/* -- GC handling --------------------------------------------------------- */[m
[31m-[m
[31m-/* Check GC threshold and do one or more GC steps. */[m
[31m-static void asm_gc_check(ASMState *as)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg tmp1, tmp2;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */[m
[31m-  asm_guardcc(as, CC_NE);  /* Assumes asm_snap_prep() already done. */[m
[31m-  emit_n(as, ARMI_CMP|ARMI_K12|0, RID_RET);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ASMREF_TMP2;  /* MSize steps     */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  tmp1 = ra_releasetmp(as, ASMREF_TMP1);[m
[31m-  tmp2 = ra_releasetmp(as, ASMREF_TMP2);[m
[31m-  emit_loadi(as, tmp2, as->gcsteps);[m
[31m-  /* Jump around GC step if GC total < GC threshold. */[m
[31m-  emit_branch(as, ARMF_CC(ARMI_B, CC_LS), l_end);[m
[31m-  emit_nm(as, ARMI_CMP, RID_TMP, tmp2);[m
[31m-  emit_lso(as, ARMI_LDR, tmp2, tmp1,[m
[31m-	   (int32_t)offsetof(global_State, gc.threshold));[m
[31m-  emit_lso(as, ARMI_LDR, RID_TMP, tmp1,[m
[31m-	   (int32_t)offsetof(global_State, gc.total));[m
[31m-  ra_allockreg(as, i32ptr(J2G(as->J)), tmp1);[m
[31m-  as->gcsteps = 0;[m
[31m-  checkmclim(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Loop handling ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the loop branch. */[m
[31m-static void asm_loop_fixup(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target = as->mcp;[m
[31m-  if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-    /* asm_guardcc already inverted the bcc and patched the final bl. */[m
[31m-    p[-2] |= ((uint32_t)(target-p) & 0x00ffffffu);[m
[31m-  } else {[m
[31m-    p[-1] = ARMI_B | ((uint32_t)((target-p)-1) & 0x00ffffffu);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Reload L register from g->cur_L. */[m
[31m-static void asm_head_lreg(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir = IR(ASMREF_L);[m
[31m-  if (ra_used(ir)) {[m
[31m-    Reg r = ra_dest(as, ir, RSET_GPR);[m
[31m-    emit_getgl(as, r, cur_L);[m
[31m-    ra_evictk(as);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Coalesce BASE register for a root trace. */[m
[31m-static void asm_head_root_base(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  asm_head_lreg(as);[m
[31m-  ir = IR(REF_BASE);[m
[31m-  if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t)))[m
[31m-    ra_spill(as, ir);[m
[31m-  ra_destreg(as, ir, RID_BASE);[m
[31m-}[m
[31m-[m
[31m-/* Coalesce BASE register for a side trace. */[m
[31m-static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  asm_head_lreg(as);[m
[31m-  ir = IR(REF_BASE);[m
[31m-  if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t)))[m
[31m-    ra_spill(as, ir);[m
[31m-  if (ra_hasspill(irp->s)) {[m
[31m-    rset_clear(allow, ra_dest(as, ir, allow));[m
[31m-  } else {[m
[31m-    Reg r = irp->r;[m
[31m-    lua_assert(ra_hasreg(r));[m
[31m-    rset_clear(allow, r);[m
[31m-    if (r != ir->r && !rset_test(as->freeset, r))[m
[31m-      ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    ra_destreg(as, ir, r);[m
[31m-  }[m
[31m-  return allow;[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the tail code. */[m
[31m-static void asm_tail_fixup(ASMState *as, TraceNo lnk)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target;[m
[31m-  int32_t spadj = as->T->spadjust;[m
[31m-  if (spadj == 0) {[m
[31m-    as->mctop = --p;[m
[31m-  } else {[m
[31m-    /* Patch stack adjustment. */[m
[31m-    uint32_t k = emit_isk12(ARMI_ADD, spadj);[m
[31m-    lua_assert(k);[m
[31m-    p[-2] = (ARMI_ADD^k) | ARMF_D(RID_SP) | ARMF_N(RID_SP);[m
[31m-  }[m
[31m-  /* Patch exit branch. */[m
[31m-  target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;[m
[31m-  p[-1] = ARMI_B|(((target-p)-1)&0x00ffffffu);[m
[31m-}[m
[31m-[m
[31m-/* Prepare tail of code. */[m
[31m-static void asm_tail_prep(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop - 1;  /* Leave room for exit branch. */[m
[31m-  if (as->loopref) {[m
[31m-    as->invmcp = as->mcp = p;[m
[31m-  } else {[m
[31m-    as->mcp = p-1;  /* Leave room for stack pointer adjustment. */[m
[31m-    as->invmcp = NULL;[m
[31m-  }[m
[31m-  *p = 0;  /* Prevent load/store merging. */[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Ensure there are enough stack slots for call arguments. */[m
[31m-static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  uint32_t i, nargs = CCI_XNARGS(ci);[m
[31m-  int nslots = 0, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR, fprodd = 0;[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  for (i = 0; i < nargs; i++) {[m
[31m-    if (!LJ_SOFTFP && args[i] && irt_isfp(IR(args[i])->t)) {[m
[31m-      if (!LJ_ABI_SOFTFP && !(ci->flags & CCI_VARARG)) {[m
[31m-	if (irt_isnum(IR(args[i])->t)) {[m
[31m-	  if (nfpr > 0) nfpr--;[m
[31m-	  else fprodd = 0, nslots = (nslots + 3) & ~1;[m
[31m-	} else {[m
[31m-	  if (fprodd) fprodd--;[m
[31m-	  else if (nfpr > 0) fprodd = 1, nfpr--;[m
[31m-	  else nslots++;[m
[31m-	}[m
[31m-      } else if (irt_isnum(IR(args[i])->t)) {[m
[31m-	ngpr &= ~1;[m
[31m-	if (ngpr > 0) ngpr -= 2; else nslots += 2;[m
[31m-      } else {[m
[31m-	if (ngpr > 0) ngpr--; else nslots++;[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (ngpr > 0) ngpr--; else nslots++;[m
[31m-    }[m
[31m-  }[m
[31m-  if (nslots > as->evenspill)  /* Leave room for args in stack slots. */[m
[31m-    as->evenspill = nslots;[m
[31m-  return REGSP_HINT(RID_RET);[m
[31m-}[m
[31m-[m
[31m-static void asm_setup_target(ASMState *as)[m
[31m-{[m
[31m-  /* May need extra exit for asm_stack_check on side traces. */[m
[31m-  asm_exitstub_setup(as, as->T->nsnap + (as->parent ? 1 : 0));[m
[31m-}[m
[31m-[m
[31m-/* -- Trace patching ------------------------------------------------------ */[m
[31m-[m
[31m-/* Patch exit jumps of existing machine code to a new target. */[m
[31m-void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)[m
[31m-{[m
[31m-  MCode *p = T->mcode;[m
[31m-  MCode *pe = (MCode *)((char *)p + T->szmcode);[m
[31m-  MCode *cstart = NULL, *cend = p;[m
[31m-  MCode *mcarea = lj_mcode_patch(J, p, 0);[m
[31m-  MCode *px = exitstub_addr(J, exitno) - 2;[m
[31m-  for (; p < pe; p++) {[m
[31m-    /* Look for bl_cc exitstub, replace with b_cc target. */[m
[31m-    uint32_t ins = *p;[m
[31m-    if ((ins & 0x0f000000u) == 0x0b000000u && ins < 0xf0000000u &&[m
[31m-	((ins ^ (px-p)) & 0x00ffffffu) == 0) {[m
[31m-      *p = (ins & 0xfe000000u) | (((target-p)-2) & 0x00ffffffu);[m
[31m-      cend = p+1;[m
[31m-      if (!cstart) cstart = p;[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(cstart != NULL);[m
[31m-  lj_mcode_sync(cstart, cend);[m
[31m-  lj_mcode_patch(J, mcarea, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_mips.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_mips.h[m
[1mdeleted file mode 100644[m
[1mindex 7bd72fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_mips.h[m
[1m+++ /dev/null[m
[36m@@ -1,2098 +0,0 @@[m
[31m-/*[m
[31m-** MIPS IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Register allocator extensions --------------------------------------- */[m
[31m-[m
[31m-/* Allocate a register with a hint. */[m
[31m-static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  if (ra_noreg(r)) {[m
[31m-    if (!ra_hashint(r) && !iscrossref(as, ref))[m
[31m-      ra_sethint(IR(ref)->r, hint);  /* Propagate register hint. */[m
[31m-    r = ra_allocref(as, ref, allow);[m
[31m-  }[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate a register or RID_ZERO. */[m
[31m-static Reg ra_alloc1z(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  if (ra_noreg(r)) {[m
[31m-    if (!(allow & RSET_FPR) && irref_isk(ref) && IR(ref)->i == 0)[m
[31m-      return RID_ZERO;[m
[31m-    r = ra_allocref(as, ref, allow);[m
[31m-  } else {[m
[31m-    ra_noweak(as, r);[m
[31m-  }[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate two source registers for three-operand instructions. */[m
[31m-static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-  Reg left = irl->r, right = irr->r;[m
[31m-  if (ra_hasreg(left)) {[m
[31m-    ra_noweak(as, left);[m
[31m-    if (ra_noreg(right))[m
[31m-      right = ra_alloc1z(as, ir->op2, rset_exclude(allow, left));[m
[31m-    else[m
[31m-      ra_noweak(as, right);[m
[31m-  } else if (ra_hasreg(right)) {[m
[31m-    ra_noweak(as, right);[m
[31m-    left = ra_alloc1z(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else if (ra_hashint(right)) {[m
[31m-    right = ra_alloc1z(as, ir->op2, allow);[m
[31m-    left = ra_alloc1z(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else {[m
[31m-    left = ra_alloc1z(as, ir->op1, allow);[m
[31m-    right = ra_alloc1z(as, ir->op2, rset_exclude(allow, left));[m
[31m-  }[m
[31m-  return left | (right << 8);[m
[31m-}[m
[31m-[m
[31m-/* -- Guard handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Need some spare long-range jump slots, for out-of-range branches. */[m
[31m-#define MIPS_SPAREJUMP		4[m
[31m-[m
[31m-/* Setup spare long-range jump slots per mcarea. */[m
[31m-static void asm_sparejump_setup(ASMState *as)[m
[31m-{[m
[31m-  MCode *mxp = as->mcbot;[m
[31m-  /* Assumes sizeof(MCLink) == 8. */[m
[31m-  if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == 8) {[m
[31m-    lua_assert(MIPSI_NOP == 0);[m
[31m-    memset(mxp+2, 0, MIPS_SPAREJUMP*8);[m
[31m-    mxp += MIPS_SPAREJUMP*2;[m
[31m-    lua_assert(mxp < as->mctop);[m
[31m-    lj_mcode_sync(as->mcbot, mxp);[m
[31m-    lj_mcode_commitbot(as->J, mxp);[m
[31m-    as->mcbot = mxp;[m
[31m-    as->mclim = as->mcbot + MCLIM_REDZONE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup exit stub after the end of each trace. */[m
[31m-static void asm_exitstub_setup(ASMState *as)[m
[31m-{[m
[31m-  MCode *mxp = as->mctop;[m
[31m-  /* sw TMP, 0(sp); j ->vm_exit_handler; li TMP, traceno */[m
[31m-  *--mxp = MIPSI_LI|MIPSF_T(RID_TMP)|as->T->traceno;[m
[31m-  *--mxp = MIPSI_J|((((uintptr_t)(void *)lj_vm_exit_handler)>>2)&0x03ffffffu);[m
[31m-  lua_assert(((uintptr_t)mxp ^ (uintptr_t)(void *)lj_vm_exit_handler)>>28 == 0);[m
[31m-  *--mxp = MIPSI_SW|MIPSF_T(RID_TMP)|MIPSF_S(RID_SP)|0;[m
[31m-  as->mctop = mxp;[m
[31m-}[m
[31m-[m
[31m-/* Keep this in-sync with exitstub_trace_addr(). */[m
[31m-#define asm_exitstub_addr(as)	((as)->mctop)[m
[31m-[m
[31m-/* Emit conditional branch to exit for guard. */[m
[31m-static void asm_guard(ASMState *as, MIPSIns mi, Reg rs, Reg rt)[m
[31m-{[m
[31m-  MCode *target = asm_exitstub_addr(as);[m
[31m-  MCode *p = as->mcp;[m
[31m-  if (LJ_UNLIKELY(p == as->invmcp)) {[m
[31m-    as->invmcp = NULL;[m
[31m-    as->loopinv = 1;[m
[31m-    as->mcp = p+1;[m
[31m-    mi = mi ^ ((mi>>28) == 1 ? 0x04000000u : 0x00010000u);  /* Invert cond. */[m
[31m-    target = p;  /* Patch target later in asm_loop_fixup. */[m
[31m-  }[m
[31m-  emit_ti(as, MIPSI_LI, RID_TMP, as->snapno);[m
[31m-  emit_branch(as, mi, rs, rt, target);[m
[31m-}[m
[31m-[m
[31m-/* -- Operand fusion ------------------------------------------------------ */[m
[31m-[m
[31m-/* Limit linear search to this distance. Avoids O(n^2) behavior. */[m
[31m-#define CONFLICT_SEARCH_LIM	31[m
[31m-[m
[31m-/* Check if there's no conflicting instruction between curins and ref. */[m
[31m-static int noconflict(ASMState *as, IRRef ref, IROp conflict)[m
[31m-{[m
[31m-  IRIns *ir = as->ir;[m
[31m-  IRRef i = as->curins;[m
[31m-  if (i > ref + CONFLICT_SEARCH_LIM)[m
[31m-    return 0;  /* Give up, ref is too far away. */[m
[31m-  while (--i > ref)[m
[31m-    if (ir[i].o == conflict)[m
[31m-      return 0;  /* Conflict found. */[m
[31m-  return 1;  /* Ok, no conflict. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse the array base of colocated arrays. */[m
[31m-static int32_t asm_fuseabase(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE &&[m
[31m-      !neverfuse(as) && noconflict(as, ref, IR_NEWREF))[m
[31m-    return (int32_t)sizeof(GCtab);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Fuse array/hash/upvalue reference into register+offset operand. */[m
[31m-static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r)) {[m
[31m-    if (ir->o == IR_AREF) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	if (irref_isk(ir->op2)) {[m
[31m-	  IRRef tab = IR(ir->op1)->op1;[m
[31m-	  int32_t ofs = asm_fuseabase(as, tab);[m
[31m-	  IRRef refa = ofs ? tab : ir->op1;[m
[31m-	  ofs += 8*IR(ir->op2)->i;[m
[31m-	  if (checki16(ofs)) {[m
[31m-	    *ofsp = ofs;[m
[31m-	    return ra_alloc1(as, refa, allow);[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_HREFK) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node));[m
[31m-	if (checki16(ofs)) {[m
[31m-	  *ofsp = ofs;[m
[31m-	  return ra_alloc1(as, ir->op1, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_UREFC) {[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-	int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv);[m
[31m-	int32_t jgl = (intptr_t)J2G(as->J);[m
[31m-	if ((uint32_t)(ofs-jgl) < 65536) {[m
[31m-	  *ofsp = ofs-jgl-32768;[m
[31m-	  return RID_JGL;[m
[31m-	} else {[m
[31m-	  *ofsp = (int16_t)ofs;[m
[31m-	  return ra_allock(as, ofs-(int16_t)ofs, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  *ofsp = 0;[m
[31m-  return ra_alloc1(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-/* Fuse XLOAD/XSTORE reference into load/store operand. */[m
[31m-static void asm_fusexref(ASMState *as, MIPSIns mi, Reg rt, IRRef ref,[m
[31m-			 RegSet allow, int32_t ofs)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  Reg base;[m
[31m-  if (ra_noreg(ir->r) && canfuse(as, ir)) {[m
[31m-    if (ir->o == IR_ADD) {[m
[31m-      int32_t ofs2;[m
[31m-      if (irref_isk(ir->op2) && (ofs2 = ofs + IR(ir->op2)->i, checki16(ofs2))) {[m
[31m-	ref = ir->op1;[m
[31m-	ofs = ofs2;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_STRREF) {[m
[31m-      int32_t ofs2 = 65536;[m
[31m-      lua_assert(ofs == 0);[m
[31m-      ofs = (int32_t)sizeof(GCstr);[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	ofs2 = ofs + IR(ir->op2)->i;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (irref_isk(ir->op1)) {[m
[31m-	ofs2 = ofs + IR(ir->op1)->i;[m
[31m-	ref = ir->op2;[m
[31m-      }[m
[31m-      if (!checki16(ofs2)) {[m
[31m-	/* NYI: Fuse ADD with constant. */[m
[31m-	Reg right, left = ra_alloc2(as, ir, allow);[m
[31m-	right = (left >> 8); left &= 255;[m
[31m-	emit_hsi(as, mi, rt, RID_TMP, ofs);[m
[31m-	emit_dst(as, MIPSI_ADDU, RID_TMP, left, right);[m
[31m-	return;[m
[31m-      }[m
[31m-      ofs = ofs2;[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ref, allow);[m
[31m-  emit_hsi(as, mi, rt, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Generate a call to a C function. */[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n, nargs = CCI_XNARGS(ci);[m
[31m-  int32_t ofs = 16;[m
[31m-#if LJ_SOFTFP[m
[31m-  Reg gpr = REGARG_FIRSTGPR;[m
[31m-#else[m
[31m-  Reg gpr, fpr = REGARG_FIRSTFPR;[m
[31m-#endif[m
[31m-  if ((void *)ci->func)[m
[31m-    emit_call(as, (void *)ci->func, 1);[m
[31m-#if !LJ_SOFTFP[m
[31m-  for (gpr = REGARG_FIRSTGPR; gpr <= REGARG_LASTGPR; gpr++)[m
[31m-    as->cost[gpr] = REGCOST(~0u, ASMREF_L);[m
[31m-  gpr = REGARG_FIRSTGPR;[m
[31m-#endif[m
[31m-  for (n = 0; n < nargs; n++) {  /* Setup args. */[m
[31m-    IRRef ref = args[n];[m
[31m-    if (ref) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-#if !LJ_SOFTFP[m
[31m-      if (irt_isfp(ir->t) && fpr <= REGARG_LASTFPR &&[m
[31m-	  !(ci->flags & CCI_VARARG)) {[m
[31m-	lua_assert(rset_test(as->freeset, fpr));  /* Already evicted. */[m
[31m-	ra_leftov(as, fpr, ref);[m
[31m-	fpr += 2;[m
[31m-	gpr += irt_isnum(ir->t) ? 2 : 1;[m
[31m-      } else[m
[31m-#endif[m
[31m-      {[m
[31m-#if !LJ_SOFTFP[m
[31m-	fpr = REGARG_LASTFPR+1;[m
[31m-#endif[m
[31m-	if (irt_isnum(ir->t)) gpr = (gpr+1) & ~1;[m
[31m-	if (gpr <= REGARG_LASTGPR) {[m
[31m-	  lua_assert(rset_test(as->freeset, gpr));  /* Already evicted. */[m
[31m-#if !LJ_SOFTFP[m
[31m-	  if (irt_isfp(ir->t)) {[m
[31m-	    RegSet of = as->freeset;[m
[31m-	    Reg r;[m
[31m-	    /* Workaround to protect argument GPRs from being used for remat. */[m
[31m-	    as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1);[m
[31m-	    r = ra_alloc1(as, ref, RSET_FPR);[m
[31m-	    as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1));[m
[31m-	    if (irt_isnum(ir->t)) {[m
[31m-	      emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?0:1), r+1);[m
[31m-	      emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?1:0), r);[m
[31m-	      lua_assert(rset_test(as->freeset, gpr+1));  /* Already evicted. */[m
[31m-	      gpr += 2;[m
[31m-	    } else if (irt_isfloat(ir->t)) {[m
[31m-	      emit_tg(as, MIPSI_MFC1, gpr, r);[m
[31m-	      gpr++;[m
[31m-	    }[m
[31m-	  } else[m
[31m-#endif[m
[31m-	  {[m
[31m-	    ra_leftov(as, gpr, ref);[m
[31m-	    gpr++;[m
[31m-	  }[m
[31m-	} else {[m
[31m-	  Reg r = ra_alloc1z(as, ref, !LJ_SOFTFP && irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);[m
[31m-	  if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4;[m
[31m-	  emit_spstore(as, ir, r, ofs);[m
[31m-	  ofs += irt_isnum(ir->t) ? 8 : 4;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-#if !LJ_SOFTFP[m
[31m-      fpr = REGARG_LASTFPR+1;[m
[31m-#endif[m
[31m-      if (gpr <= REGARG_LASTGPR)[m
[31m-	gpr++;[m
[31m-      else[m
[31m-	ofs += 4;[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup result reg/sp for call. Evict scratch regs. */[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  int hiop = ((ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));[m
[31m-#if !LJ_SOFTFP[m
[31m-  if ((ci->flags & CCI_NOFPRCLOBBER))[m
[31m-    drop &= ~RSET_FPR;[m
[31m-#endif[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  if (hiop && ra_hasreg((ir+1)->r))[m
[31m-    rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);  /* Evictions must be performed first. */[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert(!irt_ispri(ir->t));[m
[31m-    if (!LJ_SOFTFP && irt_isfp(ir->t)) {[m
[31m-      if ((ci->flags & CCI_CASTU64)) {[m
[31m-	int32_t ofs = sps_scale(ir->s);[m
[31m-	Reg dest = ir->r;[m
[31m-	if (ra_hasreg(dest)) {[m
[31m-	  ra_free(as, dest);[m
[31m-	  ra_modified(as, dest);[m
[31m-	  emit_tg(as, MIPSI_MTC1, RID_RETHI, dest+1);[m
[31m-	  emit_tg(as, MIPSI_MTC1, RID_RETLO, dest);[m
[31m-	}[m
[31m-	if (ofs) {[m
[31m-	  emit_tsi(as, MIPSI_SW, RID_RETLO, RID_SP, ofs+(LJ_BE?4:0));[m
[31m-	  emit_tsi(as, MIPSI_SW, RID_RETHI, RID_SP, ofs+(LJ_BE?0:4));[m
[31m-	}[m
[31m-      } else {[m
[31m-	ra_destreg(as, ir, RID_FPRET);[m
[31m-      }[m
[31m-    } else if (hiop) {[m
[31m-      ra_destpair(as, ir);[m
[31m-    } else {[m
[31m-      ra_destreg(as, ir, RID_RET);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_callx(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  CCallInfo ci;[m
[31m-  IRRef func;[m
[31m-  IRIns *irf;[m
[31m-  ci.flags = asm_callx_flags(as, ir);[m
[31m-  asm_collectargs(as, ir, &ci, args);[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-  func = ir->op2; irf = IR(func);[m
[31m-  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }[m
[31m-  if (irref_isk(func)) {  /* Call to constant address. */[m
[31m-    ci.func = (ASMFunction)(void *)(irf->i);[m
[31m-  } else {  /* Need specific register for indirect calls. */[m
[31m-    Reg r = ra_alloc1(as, func, RID2RSET(RID_CFUNCADDR));[m
[31m-    MCode *p = as->mcp;[m
[31m-    if (r == RID_CFUNCADDR)[m
[31m-      *--p = MIPSI_NOP;[m
[31m-    else[m
[31m-      *--p = MIPSI_MOVE | MIPSF_D(RID_CFUNCADDR) | MIPSF_S(r);[m
[31m-    *--p = MIPSI_JALR | MIPSF_S(r);[m
[31m-    as->mcp = p;[m
[31m-    ci.func = (ASMFunction)(void *)0;[m
[31m-  }[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_callround(ASMState *as, IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  /* The modified regs must match with the *.dasc implementation. */[m
[31m-  RegSet drop = RID2RSET(RID_R1)|RID2RSET(RID_R12)|RID2RSET(RID_FPRET)|[m
[31m-		RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(REGARG_FIRSTFPR);[m
[31m-  if (ra_hasreg(ir->r)) rset_clear(drop, ir->r);[m
[31m-  ra_evictset(as, drop);[m
[31m-  ra_destreg(as, ir, RID_FPRET);[m
[31m-  emit_call(as, (void *)lj_ir_callinfo[id].func, 0);[m
[31m-  ra_leftov(as, REGARG_FIRSTFPR, ir->op1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Returns ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Return to lower frame. Guard that it goes to the right spot. */[m
[31m-static void asm_retf(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  void *pc = ir_kptr(IR(ir->op2));[m
[31m-  int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));[m
[31m-  as->topslot -= (BCReg)delta;[m
[31m-  if ((int32_t)as->topslot < 0) as->topslot = 0;[m
[31m-  irt_setmark(IR(REF_BASE)->t);  /* Children must not coalesce with BASE reg. */[m
[31m-  emit_setgl(as, base, jit_base);[m
[31m-  emit_addptr(as, base, -8*delta);[m
[31m-  asm_guard(as, MIPSI_BNE, RID_TMP,[m
[31m-	    ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base)));[m
[31m-  emit_tsi(as, MIPSI_LW, RID_TMP, base, -8);[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_tointg(ASMState *as, IRIns *ir, Reg left)[m
[31m-{[m
[31m-  Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_guard(as, MIPSI_BC1F, 0, 0);[m
[31m-  emit_fgh(as, MIPSI_C_EQ_D, 0, tmp, left);[m
[31m-  emit_fg(as, MIPSI_CVT_D_W, tmp, tmp);[m
[31m-  emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-  emit_fg(as, MIPSI_CVT_W_D, tmp, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_tobit(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, allow);[m
[31m-  Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left));[m
[31m-  Reg tmp = ra_scratch(as, rset_clear(allow, right));[m
[31m-  emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-  emit_fgh(as, MIPSI_ADD_D, tmp, left, right);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_conv(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-#if !LJ_SOFTFP[m
[31m-  int stfp = (st == IRT_NUM || st == IRT_FLOAT);[m
[31m-#endif[m
[31m-  IRRef lref = ir->op1;[m
[31m-  lua_assert(!(irt_isint64(ir->t) ||[m
[31m-	       (st == IRT_I64 || st == IRT_U64))); /* Handled by SPLIT. */[m
[31m-#if LJ_SOFTFP[m
[31m-  /* FP conversions are handled by SPLIT. */[m
[31m-  lua_assert(!irt_isfp(ir->t) && !(st == IRT_NUM || st == IRT_FLOAT));[m
[31m-  /* Can't check for same types: SPLIT uses CONV int.int + BXOR for sfp NEG. */[m
[31m-#else[m
[31m-  lua_assert(irt_type(ir->t) != st);[m
[31m-  if (irt_isfp(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    if (stfp) {  /* FP to FP conversion. */[m
[31m-      emit_fg(as, st == IRT_NUM ? MIPSI_CVT_S_D : MIPSI_CVT_D_S,[m
[31m-	      dest, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else if (st == IRT_U32) {  /* U32 to FP conversion. */[m
[31m-      /* y = (x ^ 0x8000000) + 2147483648.0 */[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, dest));[m
[31m-      emit_fgh(as, irt_isfloat(ir->t) ? MIPSI_ADD_S : MIPSI_ADD_D,[m
[31m-	       dest, dest, tmp);[m
[31m-      emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W,[m
[31m-	      dest, dest);[m
[31m-      if (irt_isfloat(ir->t))[m
[31m-	emit_lsptr(as, MIPSI_LWC1, (tmp & 31),[m
[31m-		   (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)),[m
[31m-		   RSET_GPR);[m
[31m-      else[m
[31m-	emit_lsptr(as, MIPSI_LDC1, (tmp & 31),[m
[31m-		   (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)),[m
[31m-		   RSET_GPR);[m
[31m-      emit_tg(as, MIPSI_MTC1, RID_TMP, dest);[m
[31m-      emit_dst(as, MIPSI_XOR, RID_TMP, RID_TMP, left);[m
[31m-      emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000);[m
[31m-    } else {  /* Integer to FP conversion. */[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W,[m
[31m-	      dest, dest);[m
[31m-      emit_tg(as, MIPSI_MTC1, left, dest);[m
[31m-    }[m
[31m-  } else if (stfp) {  /* FP to integer conversion. */[m
[31m-    if (irt_isguard(ir->t)) {[m
[31m-      /* Checked conversions are only supported from number to int. */[m
[31m-      lua_assert(irt_isint(ir->t) && st == IRT_NUM);[m
[31m-      asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_FPR);[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-      if (irt_isu32(ir->t)) {[m
[31m-	/* y = (int)floor(x - 2147483648.0) ^ 0x80000000 */[m
[31m-	emit_dst(as, MIPSI_XOR, dest, dest, RID_TMP);[m
[31m-	emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000);[m
[31m-	emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-	emit_fg(as, st == IRT_FLOAT ? MIPSI_FLOOR_W_S : MIPSI_FLOOR_W_D,[m
[31m-		tmp, tmp);[m
[31m-	emit_fgh(as, st == IRT_FLOAT ? MIPSI_SUB_S : MIPSI_SUB_D,[m
[31m-		 tmp, left, tmp);[m
[31m-	if (st == IRT_FLOAT)[m
[31m-	  emit_lsptr(as, MIPSI_LWC1, (tmp & 31),[m
[31m-		     (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)),[m
[31m-		     RSET_GPR);[m
[31m-	else[m
[31m-	  emit_lsptr(as, MIPSI_LDC1, (tmp & 31),[m
[31m-		     (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)),[m
[31m-		     RSET_GPR);[m
[31m-      } else {[m
[31m-	emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-	emit_fg(as, st == IRT_FLOAT ? MIPSI_TRUNC_W_S : MIPSI_TRUNC_W_D,[m
[31m-		tmp, left);[m
[31m-      }[m
[31m-    }[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */[m
[31m-      Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-      lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));[m
[31m-      if ((ir->op2 & IRCONV_SEXT)) {[m
[31m-	if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-	  emit_dst(as, st == IRT_I8 ? MIPSI_SEB : MIPSI_SEH, dest, 0, left);[m
[31m-	} else {[m
[31m-	  uint32_t shift = st == IRT_I8 ? 24 : 16;[m
[31m-	  emit_dta(as, MIPSI_SRA, dest, dest, shift);[m
[31m-	  emit_dta(as, MIPSI_SLL, dest, left, shift);[m
[31m-	}[m
[31m-      } else {[m
[31m-	emit_tsi(as, MIPSI_ANDI, dest, left,[m
[31m-		 (int32_t)(st == IRT_U8 ? 0xff : 0xffff));[m
[31m-      }[m
[31m-    } else {  /* 32/64 bit integer conversions. */[m
[31m-      /* Only need to handle 32/32 bit no-op (cast) on 32 bit archs. */[m
[31m-      ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_strto(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];[m
[31m-  IRRef args[2];[m
[31m-  int32_t ofs = 0;[m
[31m-#if LJ_SOFTFP[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  if (ra_used(ir)) {[m
[31m-    if (ra_hasspill(ir->s) && ra_hasspill((ir+1)->s) &&[m
[31m-	(ir->s & 1) == LJ_BE && (ir->s ^ 1) == (ir+1)->s) {[m
[31m-      int i;[m
[31m-      for (i = 0; i < 2; i++) {[m
[31m-	Reg r = (ir+i)->r;[m
[31m-	if (ra_hasreg(r)) {[m
[31m-	  ra_free(as, r);[m
[31m-	  ra_modified(as, r);[m
[31m-	  emit_spload(as, ir+i, r, sps_scale((ir+i)->s));[m
[31m-	}[m
[31m-      }[m
[31m-      ofs = sps_scale(ir->s & ~1);[m
[31m-    } else {[m
[31m-      Reg rhi = ra_dest(as, ir+1, RSET_GPR);[m
[31m-      Reg rlo = ra_dest(as, ir, rset_exclude(RSET_GPR, rhi));[m
[31m-      emit_tsi(as, MIPSI_LW, rhi, RID_SP, ofs+(LJ_BE?0:4));[m
[31m-      emit_tsi(as, MIPSI_LW, rlo, RID_SP, ofs+(LJ_BE?4:0));[m
[31m-    }[m
[31m-  }[m
[31m-#else[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  if (ra_hasreg(ir->r)) rset_set(drop, ir->r);  /* Spill dest reg (if any). */[m
[31m-  ra_evictset(as, drop);[m
[31m-  ofs = sps_scale(ir->s);[m
[31m-#endif[m
[31m-  asm_guard(as, MIPSI_BEQ, RID_RET, RID_ZERO);  /* Test return status. */[m
[31m-  args[0] = ir->op1;      /* GCstr *str */[m
[31m-  args[1] = ASMREF_TMP1;  /* TValue *n  */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  /* Store the result to the spill slot or temp slots. */[m
[31m-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1),[m
[31m-	   RID_SP, ofs);[m
[31m-}[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-/* Get pointer to TValue. */[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (irref_isk(ref))  /* Use the number constant itself as a TValue. */[m
[31m-      ra_allockreg(as, i32ptr(ir_knum(ir)), dest);[m
[31m-    else  /* Otherwise force a spill and use the spill slot. */[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, RID_SP, ra_spill(as, ir));[m
[31m-  } else {[m
[31m-    /* Otherwise use g->tmptv to hold the TValue. */[m
[31m-    RegSet allow = rset_exclude(RSET_GPR, dest);[m
[31m-    Reg type;[m
[31m-    emit_tsi(as, MIPSI_ADDIU, dest, RID_JGL, (int32_t)(offsetof(global_State, tmptv)-32768));[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, allow);[m
[31m-      emit_setgl(as, src, tmptv.gcr);[m
[31m-    }[m
[31m-    if (LJ_SOFTFP && (ir+1)->o == IR_HIOP)[m
[31m-      type = ra_alloc1(as, ref+1, allow);[m
[31m-    else[m
[31m-      type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-    emit_setgl(as, type, tmptv.it);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_aref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx, base;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    IRRef tab = IR(ir->op1)->op1;[m
[31m-    int32_t ofs = asm_fuseabase(as, tab);[m
[31m-    IRRef refa = ofs ? tab : ir->op1;[m
[31m-    ofs += 8*IR(ir->op2)->i;[m
[31m-    if (checki16(ofs)) {[m
[31m-      base = ra_alloc1(as, refa, RSET_GPR);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, base, ofs);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));[m
[31m-  emit_dst(as, MIPSI_ADDU, dest, RID_TMP, base);[m
[31m-  emit_dta(as, MIPSI_SLL, RID_TMP, idx, 3);[m
[31m-}[m
[31m-[m
[31m-/* Inlined hash lookup. Specialized for key type and for const keys.[m
[31m-** The equivalent C code is:[m
[31m-**   Node *n = hashkey(t, key);[m
[31m-**   do {[m
[31m-**     if (lj_obj_equal(&n->key, key)) return &n->val;[m
[31m-**   } while ((n = nextnode(n)));[m
[31m-**   return niltv(L);[m
[31m-*/[m
[31m-static void asm_href(ASMState *as, IRIns *ir, IROp merge)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int destused = ra_used(ir);[m
[31m-  Reg dest = ra_dest(as, ir, allow);[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));[m
[31m-  Reg key = RID_NONE, type = RID_NONE, tmpnum = RID_NONE, tmp1 = RID_TMP, tmp2;[m
[31m-  IRRef refkey = ir->op2;[m
[31m-  IRIns *irkey = IR(refkey);[m
[31m-  IRType1 kt = irkey->t;[m
[31m-  uint32_t khash;[m
[31m-  MCLabel l_end, l_loop, l_next;[m
[31m-[m
[31m-  rset_clear(allow, tab);[m
[31m-#if LJ_SOFTFP[m
[31m-  if (!irref_isk(refkey)) {[m
[31m-    key = ra_alloc1(as, refkey, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-    if (irkey[1].o == IR_HIOP) {[m
[31m-      if (ra_hasreg((irkey+1)->r)) {[m
[31m-	type = tmpnum = (irkey+1)->r;[m
[31m-	tmp1 = ra_scratch(as, allow);[m
[31m-	rset_clear(allow, tmp1);[m
[31m-	ra_noweak(as, tmpnum);[m
[31m-      } else {[m
[31m-	type = tmpnum = ra_allocref(as, refkey+1, allow);[m
[31m-      }[m
[31m-      rset_clear(allow, tmpnum);[m
[31m-    } else {[m
[31m-      type = ra_allock(as, (int32_t)irt_toitype(irkey->t), allow);[m
[31m-      rset_clear(allow, type);[m
[31m-    }[m
[31m-  }[m
[31m-#else[m
[31m-  if (irt_isnum(kt)) {[m
[31m-    key = ra_alloc1(as, refkey, RSET_FPR);[m
[31m-    tmpnum = ra_scratch(as, rset_exclude(RSET_FPR, key));[m
[31m-  } else if (!irt_ispri(kt)) {[m
[31m-    key = ra_alloc1(as, refkey, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-    type = ra_allock(as, (int32_t)irt_toitype(irkey->t), allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-#endif[m
[31m-  tmp2 = ra_scratch(as, allow);[m
[31m-  rset_clear(allow, tmp2);[m
[31m-[m
[31m-  /* Key not found in chain: jump to exit (if merged) or load niltv. */[m
[31m-  l_end = emit_label(as);[m
[31m-  as->invmcp = NULL;[m
[31m-  if (merge == IR_NE)[m
[31m-    asm_guard(as, MIPSI_B, RID_ZERO, RID_ZERO);[m
[31m-  else if (destused)[m
[31m-    emit_loada(as, dest, niltvg(J2G(as->J)));[m
[31m-  /* Follow hash chain until the end. */[m
[31m-  emit_move(as, dest, tmp2);[m
[31m-  l_loop = --as->mcp;[m
[31m-  emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, next));[m
[31m-  l_next = emit_label(as);[m
[31m-[m
[31m-  /* Type and value comparison. */[m
[31m-  if (merge == IR_EQ) {  /* Must match asm_guard(). */[m
[31m-    emit_ti(as, MIPSI_LI, RID_TMP, as->snapno);[m
[31m-    l_end = asm_exitstub_addr(as);[m
[31m-  }[m
[31m-  if (!LJ_SOFTFP && irt_isnum(kt)) {[m
[31m-    emit_branch(as, MIPSI_BC1T, 0, 0, l_end);[m
[31m-    emit_fgh(as, MIPSI_C_EQ_D, 0, tmpnum, key);[m
[31m-    *--as->mcp = MIPSI_NOP;  /* Avoid NaN comparison overhead. */[m
[31m-    emit_branch(as, MIPSI_BEQ, tmp2, RID_ZERO, l_next);[m
[31m-    emit_tsi(as, MIPSI_SLTIU, tmp2, tmp2, (int32_t)LJ_TISNUM);[m
[31m-    emit_hsi(as, MIPSI_LDC1, tmpnum, dest, (int32_t)offsetof(Node, key.n));[m
[31m-  } else {[m
[31m-    if (irt_ispri(kt)) {[m
[31m-      emit_branch(as, MIPSI_BEQ, tmp2, type, l_end);[m
[31m-    } else {[m
[31m-      emit_branch(as, MIPSI_BEQ, tmp1, key, l_end);[m
[31m-      emit_tsi(as, MIPSI_LW, tmp1, dest, (int32_t)offsetof(Node, key.gcr));[m
[31m-      emit_branch(as, MIPSI_BNE, tmp2, type, l_next);[m
[31m-    }[m
[31m-  }[m
[31m-  emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, key.it));[m
[31m-  *l_loop = MIPSI_BNE | MIPSF_S(tmp2) | ((as->mcp-l_loop-1) & 0xffffu);[m
[31m-[m
[31m-  /* Load main position relative to tab->node into dest. */[m
[31m-  khash = irref_isk(refkey) ? ir_khash(irkey) : 1;[m
[31m-  if (khash == 0) {[m
[31m-    emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-  } else {[m
[31m-    Reg tmphash = tmp1;[m
[31m-    if (irref_isk(refkey))[m
[31m-      tmphash = ra_allock(as, khash, allow);[m
[31m-    emit_dst(as, MIPSI_ADDU, dest, dest, tmp1);[m
[31m-    lua_assert(sizeof(Node) == 24);[m
[31m-    emit_dst(as, MIPSI_SUBU, tmp1, tmp2, tmp1);[m
[31m-    emit_dta(as, MIPSI_SLL, tmp1, tmp1, 3);[m
[31m-    emit_dta(as, MIPSI_SLL, tmp2, tmp1, 5);[m
[31m-    emit_dst(as, MIPSI_AND, tmp1, tmp2, tmphash);[m
[31m-    emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-    emit_tsi(as, MIPSI_LW, tmp2, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-    if (irref_isk(refkey)) {[m
[31m-      /* Nothing to do. */[m
[31m-    } else if (irt_isstr(kt)) {[m
[31m-      emit_tsi(as, MIPSI_LW, tmp1, key, (int32_t)offsetof(GCstr, hash));[m
[31m-    } else {  /* Must match with hash*() in lj_tab.c. */[m
[31m-      emit_dst(as, MIPSI_SUBU, tmp1, tmp1, tmp2);[m
[31m-      emit_rotr(as, tmp2, tmp2, dest, (-HASH_ROT3)&31);[m
[31m-      emit_dst(as, MIPSI_XOR, tmp1, tmp1, tmp2);[m
[31m-      emit_rotr(as, tmp1, tmp1, dest, (-HASH_ROT2-HASH_ROT1)&31);[m
[31m-      emit_dst(as, MIPSI_SUBU, tmp2, tmp2, dest);[m
[31m-      if (LJ_SOFTFP ? (irkey[1].o == IR_HIOP) : irt_isnum(kt)) {[m
[31m-	emit_dst(as, MIPSI_XOR, tmp2, tmp2, tmp1);[m
[31m-	if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-	  emit_dta(as, MIPSI_ROTR, dest, tmp1, (-HASH_ROT1)&31);[m
[31m-	} else {[m
[31m-	  emit_dst(as, MIPSI_OR, dest, dest, tmp1);[m
[31m-	  emit_dta(as, MIPSI_SLL, tmp1, tmp1, HASH_ROT1);[m
[31m-	  emit_dta(as, MIPSI_SRL, dest, tmp1, (-HASH_ROT1)&31);[m
[31m-	}[m
[31m-	emit_dst(as, MIPSI_ADDU, tmp1, tmp1, tmp1);[m
[31m-#if LJ_SOFTFP[m
[31m-	emit_ds(as, MIPSI_MOVE, tmp1, type);[m
[31m-	emit_ds(as, MIPSI_MOVE, tmp2, key);[m
[31m-#else[m
[31m-	emit_tg(as, MIPSI_MFC1, tmp2, key);[m
[31m-	emit_tg(as, MIPSI_MFC1, tmp1, key+1);[m
[31m-#endif[m
[31m-      } else {[m
[31m-	emit_dst(as, MIPSI_XOR, tmp2, key, tmp1);[m
[31m-	emit_rotr(as, dest, tmp1, tmp2, (-HASH_ROT1)&31);[m
[31m-	emit_dst(as, MIPSI_ADDU, tmp1, key, ra_allock(as, HASH_BIAS, allow));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_hrefk(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *kslot = IR(ir->op2);[m
[31m-  IRIns *irkey = IR(kslot->op1);[m
[31m-  int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node));[m
[31m-  int32_t kofs = ofs + (int32_t)offsetof(Node, key);[m
[31m-  Reg dest = (ra_used(ir)||ofs > 32736) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;[m
[31m-  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg key = RID_NONE, type = RID_TMP, idx = node;[m
[31m-  RegSet allow = rset_exclude(RSET_GPR, node);[m
[31m-  int32_t lo, hi;[m
[31m-  lua_assert(ofs % sizeof(Node) == 0);[m
[31m-  if (ofs > 32736) {[m
[31m-    idx = dest;[m
[31m-    rset_clear(allow, dest);[m
[31m-    kofs = (int32_t)offsetof(Node, key);[m
[31m-  } else if (ra_hasreg(dest)) {[m
[31m-    emit_tsi(as, MIPSI_ADDIU, dest, node, ofs);[m
[31m-  }[m
[31m-  if (!irt_ispri(irkey->t)) {[m
[31m-    key = ra_scratch(as, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-  }[m
[31m-  if (irt_isnum(irkey->t)) {[m
[31m-    lo = (int32_t)ir_knum(irkey)->u32.lo;[m
[31m-    hi = (int32_t)ir_knum(irkey)->u32.hi;[m
[31m-  } else {[m
[31m-    lo = irkey->i;[m
[31m-    hi = irt_toitype(irkey->t);[m
[31m-    if (!ra_hasreg(key))[m
[31m-      goto nolo;[m
[31m-  }[m
[31m-  asm_guard(as, MIPSI_BNE, key, lo ? ra_allock(as, lo, allow) : RID_ZERO);[m
[31m-nolo:[m
[31m-  asm_guard(as, MIPSI_BNE, type, hi ? ra_allock(as, hi, allow) : RID_ZERO);[m
[31m-  if (ra_hasreg(key)) emit_tsi(as, MIPSI_LW, key, idx, kofs+(LJ_BE?4:0));[m
[31m-  emit_tsi(as, MIPSI_LW, type, idx, kofs+(LJ_BE?0:4));[m
[31m-  if (ofs > 32736)[m
[31m-    emit_tsi(as, MIPSI_ADDU, dest, node, ra_allock(as, ofs, allow));[m
[31m-}[m
[31m-[m
[31m-static void asm_uref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* NYI: Check that UREFO is still open and not aliasing a slot. */[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-    MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;[m
[31m-    emit_lsptr(as, MIPSI_LW, dest, v, RSET_GPR);[m
[31m-  } else {[m
[31m-    Reg uv = ra_scratch(as, RSET_GPR);[m
[31m-    Reg func = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (ir->o == IR_UREFC) {[m
[31m-      asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, uv, (int32_t)offsetof(GCupval, tv));[m
[31m-      emit_tsi(as, MIPSI_LBU, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));[m
[31m-    } else {[m
[31m-      emit_tsi(as, MIPSI_LW, dest, uv, (int32_t)offsetof(GCupval, v));[m
[31m-    }[m
[31m-    emit_tsi(as, MIPSI_LW, uv, func,[m
[31m-	     (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(as); UNUSED(ir);[m
[31m-  lua_assert(!ra_used(ir));[m
[31m-}[m
[31m-[m
[31m-static void asm_strref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRRef ref = ir->op2, refk = ir->op1;[m
[31m-  int32_t ofs = (int32_t)sizeof(GCstr);[m
[31m-  Reg r;[m
[31m-  if (irref_isk(ref)) {[m
[31m-    IRRef tmp = refk; refk = ref; ref = tmp;[m
[31m-  } else if (!irref_isk(refk)) {[m
[31m-    Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    IRIns *irr = IR(ir->op2);[m
[31m-    if (ra_hasreg(irr->r)) {[m
[31m-      ra_noweak(as, irr->r);[m
[31m-      right = irr->r;[m
[31m-    } else if (mayfuse(as, irr->op2) &&[m
[31m-	       irr->o == IR_ADD && irref_isk(irr->op2) &&[m
[31m-	       checki16(ofs + IR(irr->op2)->i)) {[m
[31m-      ofs += IR(irr->op2)->i;[m
[31m-      right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left));[m
[31m-    } else {[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    }[m
[31m-    emit_tsi(as, MIPSI_ADDIU, dest, dest, ofs);[m
[31m-    emit_dst(as, MIPSI_ADDU, dest, left, right);[m
[31m-    return;[m
[31m-  }[m
[31m-  r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-  ofs += IR(refk)->i;[m
[31m-  if (checki16(ofs))[m
[31m-    emit_tsi(as, MIPSI_ADDIU, dest, r, ofs);[m
[31m-  else[m
[31m-    emit_dst(as, MIPSI_ADDU, dest, r,[m
[31m-	     ra_allock(as, ofs, rset_exclude(RSET_GPR, r)));[m
[31m-}[m
[31m-[m
[31m-/* -- Loads and stores ---------------------------------------------------- */[m
[31m-[m
[31m-static MIPSIns asm_fxloadins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: return MIPSI_LB;[m
[31m-  case IRT_U8: return MIPSI_LBU;[m
[31m-  case IRT_I16: return MIPSI_LH;[m
[31m-  case IRT_U16: return MIPSI_LHU;[m
[31m-  case IRT_NUM: lua_assert(!LJ_SOFTFP); return MIPSI_LDC1;[m
[31m-  case IRT_FLOAT: if (!LJ_SOFTFP) return MIPSI_LWC1;[m
[31m-  default: return MIPSI_LW;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static MIPSIns asm_fxstoreins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: case IRT_U8: return MIPSI_SB;[m
[31m-  case IRT_I16: case IRT_U16: return MIPSI_SH;[m
[31m-  case IRT_NUM: lua_assert(!LJ_SOFTFP); return MIPSI_SDC1;[m
[31m-  case IRT_FLOAT: if (!LJ_SOFTFP) return MIPSI_SWC1;[m
[31m-  default: return MIPSI_SW;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  MIPSIns mi = asm_fxloadins(ir);[m
[31m-  int32_t ofs;[m
[31m-  if (ir->op2 == IRFL_TAB_ARRAY) {[m
[31m-    ofs = asm_fuseabase(as, ir->op1);[m
[31m-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, idx, ofs);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  ofs = field_ofs[ir->op2];[m
[31m-  lua_assert(!irt_isfp(ir->t));[m
[31m-  emit_tsi(as, mi, dest, idx, ofs);[m
[31m-}[m
[31m-[m
[31m-static void asm_fstore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1z(as, ir->op2, RSET_GPR);[m
[31m-    IRIns *irf = IR(ir->op1);[m
[31m-    Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src));[m
[31m-    int32_t ofs = field_ofs[irf->op2];[m
[31m-    MIPSIns mi = asm_fxstoreins(ir);[m
[31m-    lua_assert(!irt_isfp(ir->t));[m
[31m-    emit_tsi(as, mi, src, idx, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_xload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir,[m
[31m-    (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-  lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED));[m
[31m-  asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0);[m
[31m-}[m
[31m-[m
[31m-static void asm_xstore_(ASMState *as, IRIns *ir, int32_t ofs)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1z(as, ir->op2,[m
[31m-      (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-    asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1,[m
[31m-		 rset_exclude(RSET_GPR, src), ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_xstore(as, ir)	asm_xstore_(as, ir, 0)[m
[31m-[m
[31m-static void asm_ahuvload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);[m
[31m-  Reg dest = RID_NONE, type = RID_TMP, idx;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int32_t ofs = 0;[m
[31m-  if (hiop && ra_used(ir+1)) {[m
[31m-    type = ra_dest(as, ir+1, allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||[m
[31m-	       irt_isint(ir->t) || irt_isaddr(ir->t));[m
[31m-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);[m
[31m-    rset_clear(allow, dest);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);[m
[31m-  rset_clear(allow, idx);[m
[31m-  if (t == IRT_NUM) {[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-    emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);[m
[31m-  } else {[m
[31m-    asm_guard(as, MIPSI_BNE, type, ra_allock(as, irt_toitype_(t), allow));[m
[31m-  }[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    if (!LJ_SOFTFP && t == IRT_NUM)[m
[31m-      emit_hsi(as, MIPSI_LDC1, dest, idx, ofs);[m
[31m-    else[m
[31m-      emit_tsi(as, MIPSI_LW, dest, idx, ofs+(LJ_BE?4:0));[m
[31m-  }[m
[31m-  emit_tsi(as, MIPSI_LW, type, idx, ofs+(LJ_BE?0:4));[m
[31m-}[m
[31m-[m
[31m-static void asm_ahustore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg idx, src = RID_NONE, type = RID_NONE;[m
[31m-  int32_t ofs = 0;[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    src = ra_alloc1(as, ir->op2, RSET_FPR);[m
[31m-  } else {[m
[31m-    int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      src = ra_alloc1(as, ir->op2, allow);[m
[31m-      rset_clear(allow, src);[m
[31m-    }[m
[31m-    if (hiop)[m
[31m-      type = ra_alloc1(as, (ir+1)->op2, allow);[m
[31m-    else[m
[31m-      type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    emit_hsi(as, MIPSI_SDC1, src, idx, ofs);[m
[31m-  } else {[m
[31m-    if (ra_hasreg(src))[m
[31m-      emit_tsi(as, MIPSI_SW, src, idx, ofs+(LJ_BE?4:0));[m
[31m-    emit_tsi(as, MIPSI_SW, type, idx, ofs+(LJ_BE?0:4));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);[m
[31m-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);[m
[31m-  Reg dest = RID_NONE, type = RID_NONE, base;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */[m
[31m-  lua_assert(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_CONVERT));  /* Handled by LJ_SOFTFP SPLIT. */[m
[31m-  if (hiop && ra_used(ir+1)) {[m
[31m-    type = ra_dest(as, ir+1, allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-#else[m
[31m-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(ir->t) && t == IRT_INT) {[m
[31m-    dest = ra_scratch(as, RSET_FPR);[m
[31m-    asm_tointg(as, ir, dest);[m
[31m-    t = IRT_NUM;  /* Continue with a regular number type check. */[m
[31m-  } else[m
[31m-#endif[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||[m
[31m-	       irt_isint(ir->t) || irt_isaddr(ir->t));[m
[31m-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);[m
[31m-    rset_clear(allow, dest);[m
[31m-    base = ra_alloc1(as, REF_BASE, allow);[m
[31m-    rset_clear(allow, base);[m
[31m-    if (!LJ_SOFTFP && (ir->op2 & IRSLOAD_CONVERT)) {[m
[31m-      if (t == IRT_INT) {[m
[31m-	Reg tmp = ra_scratch(as, RSET_FPR);[m
[31m-	emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-	emit_fg(as, MIPSI_TRUNC_W_D, tmp, tmp);[m
[31m-	dest = tmp;[m
[31m-	t = IRT_NUM;  /* Check for original type. */[m
[31m-      } else {[m
[31m-	Reg tmp = ra_scratch(as, RSET_GPR);[m
[31m-	emit_fg(as, MIPSI_CVT_D_W, dest, dest);[m
[31m-	emit_tg(as, MIPSI_MTC1, tmp, dest);[m
[31m-	dest = tmp;[m
[31m-	t = IRT_INT;  /* Check for original type. */[m
[31m-      }[m
[31m-    }[m
[31m-    goto dotypecheck;[m
[31m-  }[m
[31m-  base = ra_alloc1(as, REF_BASE, allow);[m
[31m-  rset_clear(allow, base);[m
[31m-dotypecheck:[m
[31m-  if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-    if (ra_noreg(type)) {[m
[31m-      if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 &&[m
[31m-	  rset_test((as->freeset & allow), dest+1)) {[m
[31m-	type = dest+1;[m
[31m-	ra_modified(as, type);[m
[31m-      } else {[m
[31m-	type = RID_TMP;[m
[31m-      }[m
[31m-    }[m
[31m-    if (t == IRT_NUM) {[m
[31m-      asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-      emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);[m
[31m-    } else {[m
[31m-      Reg ktype = ra_allock(as, irt_toitype_(t), allow);[m
[31m-      asm_guard(as, MIPSI_BNE, type, ktype);[m
[31m-    }[m
[31m-  }[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    if (!LJ_SOFTFP && t == IRT_NUM)[m
[31m-      emit_hsi(as, MIPSI_LDC1, dest, base, ofs);[m
[31m-    else[m
[31m-      emit_tsi(as, MIPSI_LW, dest, base, ofs ^ (LJ_BE?4:0));[m
[31m-  }[m
[31m-  if (ra_hasreg(type))[m
[31m-    emit_tsi(as, MIPSI_LW, type, base, ofs ^ (LJ_BE?0:4));[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_cnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(as->J));[m
[31m-  CTypeID id = (CTypeID)IR(ir->op1)->i;[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco];[m
[31m-  IRRef args[4];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL));[m
[31m-[m
[31m-  as->gcsteps++;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  if (ra_used(ir))[m
[31m-    ra_destreg(as, ir, RID_RET);  /* GCcdata * */[m
[31m-[m
[31m-  /* Initialize immutable cdata object. */[m
[31m-  if (ir->o == IR_CNEWI) {[m
[31m-    RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-    int32_t ofs = sizeof(GCcdata);[m
[31m-    lua_assert(sz == 4 || sz == 8);[m
[31m-    if (sz == 8) {[m
[31m-      ofs += 4;[m
[31m-      lua_assert((ir+1)->o == IR_HIOP);[m
[31m-      if (LJ_LE) ir++;[m
[31m-    }[m
[31m-    for (;;) {[m
[31m-      Reg r = ra_alloc1z(as, ir->op2, allow);[m
[31m-      emit_tsi(as, MIPSI_SW, r, RID_RET, ofs);[m
[31m-      rset_clear(allow, r);[m
[31m-      if (ofs == sizeof(GCcdata)) break;[m
[31m-      ofs -= 4; if (LJ_BE) ir++; else ir--;[m
[31m-    }[m
[31m-  } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];[m
[31m-    args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-    args[1] = ir->op1;      /* CTypeID id   */[m
[31m-    args[2] = ir->op2;      /* CTSize sz    */[m
[31m-    args[3] = ASMREF_TMP1;  /* CTSize align */[m
[31m-    asm_gencall(as, ci, args);[m
[31m-    emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)ctype_align(info));[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */[m
[31m-  emit_tsi(as, MIPSI_SB, RID_RET+1, RID_RET, offsetof(GCcdata, gct));[m
[31m-  emit_tsi(as, MIPSI_SH, RID_TMP, RID_RET, offsetof(GCcdata, ctypeid));[m
[31m-  emit_ti(as, MIPSI_LI, RID_RET+1, ~LJ_TCDATA);[m
[31m-  emit_ti(as, MIPSI_LI, RID_TMP, id); /* Lower 16 bit used. Sign-ext ok. */[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ASMREF_TMP1;  /* MSize size   */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)),[m
[31m-	       ra_releasetmp(as, ASMREF_TMP1));[m
[31m-}[m
[31m-#else[m
[31m-#define asm_cnew(as, ir)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-static void asm_tbar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg mark = ra_scratch(as, rset_exclude(RSET_GPR, tab));[m
[31m-  Reg link = RID_TMP;[m
[31m-  MCLabel l_end = emit_label(as);[m
[31m-  emit_tsi(as, MIPSI_SW, link, tab, (int32_t)offsetof(GCtab, gclist));[m
[31m-  emit_tsi(as, MIPSI_SB, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-  emit_setgl(as, tab, gc.grayagain);[m
[31m-  emit_getgl(as, link, gc.grayagain);[m
[31m-  emit_dst(as, MIPSI_XOR, mark, mark, RID_TMP);  /* Clear black bit. */[m
[31m-  emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);[m
[31m-  emit_tsi(as, MIPSI_ANDI, RID_TMP, mark, LJ_GC_BLACK);[m
[31m-  emit_tsi(as, MIPSI_LBU, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-}[m
[31m-[m
[31m-static void asm_obar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg obj, val, tmp;[m
[31m-  /* No need for other object barriers (yet). */[m
[31m-  lua_assert(IR(ir->op1)->o == IR_UREFC);[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ir->op1;      /* TValue *tv      */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);[m
[31m-  obj = IR(ir->op1)->r;[m
[31m-  tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);[m
[31m-  emit_tsi(as, MIPSI_ANDI, tmp, tmp, LJ_GC_BLACK);[m
[31m-  emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);[m
[31m-  emit_tsi(as, MIPSI_ANDI, RID_TMP, RID_TMP, LJ_GC_WHITES);[m
[31m-  val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_tsi(as, MIPSI_LBU, tmp, obj,[m
[31m-	   (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));[m
[31m-  emit_tsi(as, MIPSI_LBU, RID_TMP, val, (int32_t)offsetof(GChead, marked));[m
[31m-}[m
[31m-[m
[31m-/* -- Arithmetic and logic operations ------------------------------------- */[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_fparith(ASMState *as, IRIns *ir, MIPSIns mi)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  emit_fgh(as, mi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_fpunary(ASMState *as, IRIns *ir, MIPSIns mi)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR);[m
[31m-  emit_fg(as, mi, dest, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_fpmath(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir))[m
[31m-    return;[m
[31m-  if (ir->op2 <= IRFPM_TRUNC)[m
[31m-    asm_callround(as, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-  else if (ir->op2 == IRFPM_SQRT)[m
[31m-    asm_fpunary(as, ir, MIPSI_SQRT_D);[m
[31m-  else[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_add(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, MIPSI_ADD_D);[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      int32_t k = IR(ir->op2)->i;[m
[31m-      if (checki16(k)) {[m
[31m-	emit_tsi(as, MIPSI_ADDIU, dest, left, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_dst(as, MIPSI_ADDU, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sub(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, MIPSI_SUB_D);[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_dst(as, MIPSI_SUBU, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_mul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, MIPSI_MUL_D);[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_dst(as, MIPSI_MUL, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_div(as, ir)		asm_fparith(as, ir, MIPSI_DIV_D)[m
[31m-#define asm_mod(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_modi)[m
[31m-#define asm_pow(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_powi)[m
[31m-[m
[31m-static void asm_neg(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fpunary(as, ir, MIPSI_NEG_D);[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_abs(as, ir)		asm_fpunary(as, ir, MIPSI_ABS_D)[m
[31m-#define asm_atan2(as, ir)	asm_callid(as, ir, IRCALL_atan2)[m
[31m-#define asm_ldexp(as, ir)	asm_callid(as, ir, IRCALL_ldexp)[m
[31m-[m
[31m-static void asm_arithov(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg right, left, tmp, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int k = IR(ir->op2)->i;[m
[31m-    if (ir->o == IR_SUBOV) k = -k;[m
[31m-    if (checki16(k)) {  /* (dest < left) == (k >= 0 ? 1 : 0) */[m
[31m-      left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-      asm_guard(as, k >= 0 ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-      emit_dst(as, MIPSI_SLT, RID_TMP, dest, dest == left ? RID_TMP : left);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, left, k);[m
[31m-      if (dest == left) emit_move(as, RID_TMP, left);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  tmp = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_GPR, left),[m
[31m-						 right), dest));[m
[31m-  asm_guard(as, MIPSI_BLTZ, RID_TMP, 0);[m
[31m-  emit_dst(as, MIPSI_AND, RID_TMP, RID_TMP, tmp);[m
[31m-  if (ir->o == IR_ADDOV) {  /* ((dest^left) & (dest^right)) < 0 */[m
[31m-    emit_dst(as, MIPSI_XOR, RID_TMP, dest, dest == right ? RID_TMP : right);[m
[31m-  } else {  /* ((dest^left) & (dest^~right)) < 0 */[m
[31m-    emit_dst(as, MIPSI_XOR, RID_TMP, RID_TMP, dest);[m
[31m-    emit_dst(as, MIPSI_NOR, RID_TMP, dest == right ? RID_TMP : right, RID_ZERO);[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_XOR, tmp, dest, dest == left ? RID_TMP : left);[m
[31m-  emit_dst(as, ir->o == IR_ADDOV ? MIPSI_ADDU : MIPSI_SUBU, dest, left, right);[m
[31m-  if (dest == left || dest == right)[m
[31m-    emit_move(as, RID_TMP, dest == left ? left : right);[m
[31m-}[m
[31m-[m
[31m-#define asm_addov(as, ir)	asm_arithov(as, ir)[m
[31m-#define asm_subov(as, ir)	asm_arithov(as, ir)[m
[31m-[m
[31m-static void asm_mulov(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg tmp, right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  tmp = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_GPR, left),[m
[31m-						 right), dest));[m
[31m-  asm_guard(as, MIPSI_BNE, RID_TMP, tmp);[m
[31m-  emit_dta(as, MIPSI_SRA, RID_TMP, dest, 31);[m
[31m-  emit_dst(as, MIPSI_MFHI, tmp, 0, 0);[m
[31m-  emit_dst(as, MIPSI_MFLO, dest, 0, 0);[m
[31m-  emit_dst(as, MIPSI_MULT, 0, left, right);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_add64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (k == 0) {[m
[31m-      emit_dst(as, MIPSI_ADDU, dest, left, RID_TMP);[m
[31m-      goto loarith;[m
[31m-    } else if (checki16(k)) {[m
[31m-      emit_dst(as, MIPSI_ADDU, dest, dest, RID_TMP);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, left, k);[m
[31m-      goto loarith;[m
[31m-    }[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_ADDU, dest, dest, RID_TMP);[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_dst(as, MIPSI_ADDU, dest, left, right);[m
[31m-loarith:[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (k == 0) {[m
[31m-      if (dest != left)[m
[31m-	emit_move(as, dest, left);[m
[31m-      return;[m
[31m-    } else if (checki16(k)) {[m
[31m-      if (dest == left) {[m
[31m-	Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, left));[m
[31m-	emit_move(as, dest, tmp);[m
[31m-	dest = tmp;[m
[31m-      }[m
[31m-      emit_dst(as, MIPSI_SLTU, RID_TMP, dest, left);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, left, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  if (dest == left && dest == right) {[m
[31m-    Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right));[m
[31m-    emit_move(as, dest, tmp);[m
[31m-    dest = tmp;[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP, dest, dest == left ? right : left);[m
[31m-  emit_dst(as, MIPSI_ADDU, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_sub64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, dest, RID_TMP);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, left, right);[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  if (dest == left) {[m
[31m-    Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right));[m
[31m-    emit_move(as, dest, tmp);[m
[31m-    dest = tmp;[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP, left, dest);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_neg64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, dest, RID_TMP);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left);[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP, RID_ZERO, dest);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_bnot(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg left, right, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRIns *irl = IR(ir->op1);[m
[31m-  if (mayfuse(as, ir->op1) && irl->o == IR_BOR) {[m
[31m-    left = ra_alloc2(as, irl, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-  } else {[m
[31m-    left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    right = RID_ZERO;[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_NOR, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_bswap(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-    emit_dta(as, MIPSI_ROTR, dest, RID_TMP, 16);[m
[31m-    emit_dst(as, MIPSI_WSBH, RID_TMP, 0, left);[m
[31m-  } else {[m
[31m-    Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), dest));[m
[31m-    emit_dst(as, MIPSI_OR, dest, dest, tmp);[m
[31m-    emit_dst(as, MIPSI_OR, dest, dest, RID_TMP);[m
[31m-    emit_tsi(as, MIPSI_ANDI, dest, dest, 0xff00);[m
[31m-    emit_dta(as, MIPSI_SLL, RID_TMP, RID_TMP, 8);[m
[31m-    emit_dta(as, MIPSI_SRL, dest, left, 8);[m
[31m-    emit_tsi(as, MIPSI_ANDI, RID_TMP, left, 0xff00);[m
[31m-    emit_dst(as, MIPSI_OR, tmp, tmp, RID_TMP);[m
[31m-    emit_dta(as, MIPSI_SRL, tmp, left, 24);[m
[31m-    emit_dta(as, MIPSI_SLL, RID_TMP, left, 24);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_bitop(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (checku16(k)) {[m
[31m-      emit_tsi(as, mik, dest, left, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_dst(as, mi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-#define asm_band(as, ir)	asm_bitop(as, ir, MIPSI_AND, MIPSI_ANDI)[m
[31m-#define asm_bor(as, ir)		asm_bitop(as, ir, MIPSI_OR, MIPSI_ORI)[m
[31m-#define asm_bxor(as, ir)	asm_bitop(as, ir, MIPSI_XOR, MIPSI_XORI)[m
[31m-[m
[31m-static void asm_bitshift(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {  /* Constant shifts. */[m
[31m-    uint32_t shift = (uint32_t)(IR(ir->op2)->i & 31);[m
[31m-    emit_dta(as, mik, dest, ra_hintalloc(as, ir->op1, dest, RSET_GPR), shift);[m
[31m-  } else {[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_dst(as, mi, dest, right, left);  /* Shift amount is in rs. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_bshl(as, ir)	asm_bitshift(as, ir, MIPSI_SLLV, MIPSI_SLL)[m
[31m-#define asm_bshr(as, ir)	asm_bitshift(as, ir, MIPSI_SRLV, MIPSI_SRL)[m
[31m-#define asm_bsar(as, ir)	asm_bitshift(as, ir, MIPSI_SRAV, MIPSI_SRA)[m
[31m-#define asm_brol(as, ir)	lua_assert(0)[m
[31m-[m
[31m-static void asm_bror(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-    asm_bitshift(as, ir, MIPSI_ROTRV, MIPSI_ROTR);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (irref_isk(ir->op2)) {  /* Constant shifts. */[m
[31m-      uint32_t shift = (uint32_t)(IR(ir->op2)->i & 31);[m
[31m-      Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-      emit_rotr(as, dest, left, RID_TMP, shift);[m
[31m-    } else {[m
[31m-      Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-      right = (left >> 8); left &= 255;[m
[31m-      emit_dst(as, MIPSI_OR, dest, dest, RID_TMP);[m
[31m-      emit_dst(as, MIPSI_SRLV, dest, right, left);[m
[31m-      emit_dst(as, MIPSI_SLLV, RID_TMP, RID_TMP, left);[m
[31m-      emit_dst(as, MIPSI_SUBU, RID_TMP, ra_allock(as, 32, RSET_GPR), right);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-static void asm_sfpmin_max(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CCallInfo ci = lj_ir_callinfo[(IROp)ir->o == IR_MIN ? IRCALL_lj_vm_sfmin : IRCALL_lj_vm_sfmax];[m
[31m-  IRRef args[4];[m
[31m-  args[0^LJ_BE] = ir->op1;[m
[31m-  args[1^LJ_BE] = (ir+1)->op1;[m
[31m-  args[2^LJ_BE] = ir->op2;[m
[31m-  args[3^LJ_BE] = (ir+1)->op2;[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-  emit_call(as, (void *)ci.func, 0);[m
[31m-  ci.func = NULL;[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_min_max(ASMState *as, IRIns *ir, int ismax)[m
[31m-{[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    if (dest == left) {[m
[31m-      emit_fg(as, MIPSI_MOVT_D, dest, right);[m
[31m-    } else {[m
[31m-      emit_fg(as, MIPSI_MOVF_D, dest, left);[m
[31m-      if (dest != right) emit_fg(as, MIPSI_MOV_D, dest, right);[m
[31m-    }[m
[31m-    emit_fgh(as, MIPSI_C_OLT_D, 0, ismax ? left : right, ismax ? right : left);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    if (dest == left) {[m
[31m-      emit_dst(as, MIPSI_MOVN, dest, right, RID_TMP);[m
[31m-    } else {[m
[31m-      emit_dst(as, MIPSI_MOVZ, dest, left, RID_TMP);[m
[31m-      if (dest != right) emit_move(as, dest, right);[m
[31m-    }[m
[31m-    emit_dst(as, MIPSI_SLT, RID_TMP,[m
[31m-	     ismax ? left : right, ismax ? right : left);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_min(as, ir)		asm_min_max(as, ir, 0)[m
[31m-#define asm_max(as, ir)		asm_min_max(as, ir, 1)[m
[31m-[m
[31m-/* -- Comparisons --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-/* SFP comparisons. */[m
[31m-static void asm_sfpcomp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_softfp_cmp];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  Reg r;[m
[31m-  IRRef args[4];[m
[31m-  args[LJ_LE ? 0 : 1] = ir->op1; args[LJ_LE ? 1 : 0] = (ir+1)->op1;[m
[31m-  args[LJ_LE ? 2 : 3] = ir->op2; args[LJ_LE ? 3 : 2] = (ir+1)->op2;[m
[31m-[m
[31m-  for (r = REGARG_FIRSTGPR; r <= REGARG_FIRSTGPR+3; r++) {[m
[31m-    if (!rset_test(as->freeset, r) &&[m
[31m-	regcost_ref(as->cost[r]) == args[r-REGARG_FIRSTGPR])[m
[31m-      rset_clear(drop, r);[m
[31m-  }[m
[31m-  ra_evictset(as, drop);[m
[31m-[m
[31m-  asm_setupresult(as, ir, ci);[m
[31m-[m
[31m-  switch ((IROp)ir->o) {[m
[31m-  case IR_LT:[m
[31m-    asm_guard(as, MIPSI_BGEZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_ULT:[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_TMP);[m
[31m-    emit_loadi(as, RID_TMP, 1);[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_ZERO);[m
[31m-    break;[m
[31m-  case IR_GE:[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_TMP);[m
[31m-    emit_loadi(as, RID_TMP, 2);[m
[31m-    asm_guard(as, MIPSI_BLTZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_LE:[m
[31m-    asm_guard(as, MIPSI_BGTZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_GT:[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_TMP);[m
[31m-    emit_loadi(as, RID_TMP, 2);[m
[31m-    asm_guard(as, MIPSI_BLEZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_UGE:[m
[31m-    asm_guard(as, MIPSI_BLTZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_ULE:[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_TMP);[m
[31m-    emit_loadi(as, RID_TMP, 1);[m
[31m-    break;[m
[31m-  case IR_UGT: case IR_ABC:[m
[31m-    asm_guard(as, MIPSI_BLEZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_EQ: case IR_NE:[m
[31m-    asm_guard(as, (ir->o & 1) ? MIPSI_BEQ : MIPSI_BNE, RID_RET, RID_ZERO);[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* ORDER IR: LT GE LE GT  ULT UGE ULE UGT. */[m
[31m-  IROp op = ir->o;[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    asm_guard(as, (op&1) ? MIPSI_BC1T : MIPSI_BC1F, 0, 0);[m
[31m-    emit_fgh(as, MIPSI_C_OLT_D + ((op&3) ^ ((op>>2)&1)), 0, left, right);[m
[31m-  } else {[m
[31m-    Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (op == IR_ABC) op = IR_UGT;[m
[31m-    if ((op&4) == 0 && irref_isk(ir->op2) && IR(ir->op2)->i == 0) {[m
[31m-      MIPSIns mi = (op&2) ? ((op&1) ? MIPSI_BLEZ : MIPSI_BGTZ) :[m
[31m-			    ((op&1) ? MIPSI_BLTZ : MIPSI_BGEZ);[m
[31m-      asm_guard(as, mi, left, 0);[m
[31m-    } else {[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	int32_t k = IR(ir->op2)->i;[m
[31m-	if ((op&2)) k++;[m
[31m-	if (checki16(k)) {[m
[31m-	  asm_guard(as, (op&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-	  emit_tsi(as, (op&4) ? MIPSI_SLTIU : MIPSI_SLTI,[m
[31m-		   RID_TMP, left, k);[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-      right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-      asm_guard(as, ((op^(op>>1))&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-      emit_dst(as, (op&4) ? MIPSI_SLTU : MIPSI_SLT,[m
[31m-	       RID_TMP, (op&2) ? right : left, (op&2) ? left : right);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_equal(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg right, left = ra_alloc2(as, ir, (!LJ_SOFTFP && irt_isnum(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    asm_guard(as, (ir->o & 1) ? MIPSI_BC1T : MIPSI_BC1F, 0, 0);[m
[31m-    emit_fgh(as, MIPSI_C_EQ_D, 0, left, right);[m
[31m-  } else {[m
[31m-    asm_guard(as, (ir->o & 1) ? MIPSI_BEQ : MIPSI_BNE, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* 64 bit integer comparisons. */[m
[31m-static void asm_comp64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* ORDER IR: LT GE LE GT  ULT UGE ULE UGT. */[m
[31m-  IROp op = (ir-1)->o;[m
[31m-  MCLabel l_end;[m
[31m-  Reg rightlo, leftlo, righthi, lefthi = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  righthi = (lefthi >> 8); lefthi &= 255;[m
[31m-  leftlo = ra_alloc2(as, ir-1,[m
[31m-		     rset_exclude(rset_exclude(RSET_GPR, lefthi), righthi));[m
[31m-  rightlo = (leftlo >> 8); leftlo &= 255;[m
[31m-  asm_guard(as, ((op^(op>>1))&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-  l_end = emit_label(as);[m
[31m-  if (lefthi != righthi)[m
[31m-    emit_dst(as, (op&4) ? MIPSI_SLTU : MIPSI_SLT, RID_TMP,[m
[31m-	     (op&2) ? righthi : lefthi, (op&2) ? lefthi : righthi);[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP,[m
[31m-	   (op&2) ? rightlo : leftlo, (op&2) ? leftlo : rightlo);[m
[31m-  if (lefthi != righthi)[m
[31m-    emit_branch(as, MIPSI_BEQ, lefthi, righthi, l_end);[m
[31m-}[m
[31m-[m
[31m-static void asm_comp64eq(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tmp, right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  asm_guard(as, ((ir-1)->o & 1) ? MIPSI_BEQ : MIPSI_BNE, RID_TMP, RID_ZERO);[m
[31m-  tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right));[m
[31m-  emit_dst(as, MIPSI_OR, RID_TMP, RID_TMP, tmp);[m
[31m-  emit_dst(as, MIPSI_XOR, tmp, left, right);[m
[31m-  left = ra_alloc2(as, ir-1, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  emit_dst(as, MIPSI_XOR, RID_TMP, left, right);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */[m
[31m-[m
[31m-/* Hiword op of a split 64 bit op. Previous op must be the loword op. */[m
[31m-static void asm_hiop(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_HASFFI || LJ_SOFTFP[m
[31m-  /* HIOP is marked as a store because it needs its own DCE logic. */[m
[31m-  int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */[m
[31m-  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;[m
[31m-  if ((ir-1)->o == IR_CONV) {  /* Conversions to/from 64 bit. */[m
[31m-    as->curins--;  /* Always skip the CONV. */[m
[31m-#if LJ_HASFFI && !LJ_SOFTFP[m
[31m-    if (usehi || uselo)[m
[31m-      asm_conv64(as, ir);[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else if ((ir-1)->o < IR_EQ) {  /* 64 bit integer comparisons. ORDER IR. */[m
[31m-    as->curins--;  /* Always skip the loword comparison. */[m
[31m-#if LJ_SOFTFP[m
[31m-    if (!irt_isint(ir->t)) {[m
[31m-      asm_sfpcomp(as, ir-1);[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-    asm_comp64(as, ir);[m
[31m-#endif[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o <= IR_NE) {  /* 64 bit integer comparisons. ORDER IR. */[m
[31m-    as->curins--;  /* Always skip the loword comparison. */[m
[31m-#if LJ_SOFTFP[m
[31m-    if (!irt_isint(ir->t)) {[m
[31m-      asm_sfpcomp(as, ir-1);[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-    asm_comp64eq(as, ir);[m
[31m-#endif[m
[31m-    return;[m
[31m-#if LJ_SOFTFP[m
[31m-  } else if ((ir-1)->o == IR_MIN || (ir-1)->o == IR_MAX) {[m
[31m-      as->curins--;  /* Always skip the loword min/max. */[m
[31m-    if (uselo || usehi)[m
[31m-      asm_sfpmin_max(as, ir-1);[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else if ((ir-1)->o == IR_XSTORE) {[m
[31m-    as->curins--;  /* Handle both stores here. */[m
[31m-    if ((ir-1)->r != RID_SINK) {[m
[31m-      asm_xstore_(as, ir, LJ_LE ? 4 : 0);[m
[31m-      asm_xstore_(as, ir-1, LJ_LE ? 0 : 4);[m
[31m-    }[m
[31m-    return;[m
[31m-  }[m
[31m-  if (!usehi) return;  /* Skip unused hiword op for all remaining ops. */[m
[31m-  switch ((ir-1)->o) {[m
[31m-#if LJ_HASFFI[m
[31m-  case IR_ADD: as->curins--; asm_add64(as, ir); break;[m
[31m-  case IR_SUB: as->curins--; asm_sub64(as, ir); break;[m
[31m-  case IR_NEG: as->curins--; asm_neg64(as, ir); break;[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-  case IR_STRTO:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RSET_GPR);  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-#endif[m
[31m-  case IR_CALLN:[m
[31m-  case IR_CALLS:[m
[31m-  case IR_CALLXS:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RID2RSET(RID_RETLO));  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_TOSTR:[m
[31m-#endif[m
[31m-  case IR_CNEWI:[m
[31m-    /* Nothing to do here. Handled by lo op itself. */[m
[31m-    break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(as); UNUSED(ir); lua_assert(0);  /* Unused without FFI. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_prof(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  asm_guard(as, MIPSI_BNE, RID_TMP, RID_ZERO);[m
[31m-  emit_tsi(as, MIPSI_ANDI, RID_TMP, RID_TMP, HOOK_PROFILE);[m
[31m-  emit_lsglptr(as, MIPSI_LBU, RID_TMP,[m
[31m-	       (int32_t)offsetof(global_State, hookmask));[m
[31m-}[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check Lua stack size for overflow. Use exit handler as fallback. */[m
[31m-static void asm_stack_check(ASMState *as, BCReg topslot,[m
[31m-			    IRIns *irp, RegSet allow, ExitNo exitno)[m
[31m-{[m
[31m-  /* Try to get an unused temp. register, otherwise spill/restore RID_RET*. */[m
[31m-  Reg tmp, pbase = irp ? (ra_hasreg(irp->r) ? irp->r : RID_TMP) : RID_BASE;[m
[31m-  ExitNo oldsnap = as->snapno;[m
[31m-  rset_clear(allow, pbase);[m
[31m-  tmp = allow ? rset_pickbot(allow) :[m
[31m-		(pbase == RID_RETHI ? RID_RETLO : RID_RETHI);[m
[31m-  as->snapno = exitno;[m
[31m-  asm_guard(as, MIPSI_BNE, RID_TMP, RID_ZERO);[m
[31m-  as->snapno = oldsnap;[m
[31m-  if (allow == RSET_EMPTY)  /* Restore temp. register. */[m
[31m-    emit_tsi(as, MIPSI_LW, tmp, RID_SP, 0);[m
[31m-  else[m
[31m-    ra_modified(as, tmp);[m
[31m-  emit_tsi(as, MIPSI_SLTIU, RID_TMP, RID_TMP, (int32_t)(8*topslot));[m
[31m-  emit_dst(as, MIPSI_SUBU, RID_TMP, tmp, pbase);[m
[31m-  emit_tsi(as, MIPSI_LW, tmp, tmp, offsetof(lua_State, maxstack));[m
[31m-  if (pbase == RID_TMP)[m
[31m-    emit_getgl(as, RID_TMP, jit_base);[m
[31m-  emit_getgl(as, tmp, cur_L);[m
[31m-  if (allow == RSET_EMPTY)  /* Spill temp. register. */[m
[31m-    emit_tsi(as, MIPSI_SW, tmp, RID_SP, 0);[m
[31m-}[m
[31m-[m
[31m-/* Restore Lua stack from on-trace state. */[m
[31m-static void asm_stack_restore(ASMState *as, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  /* Store the value of all modified slots to the Lua stack. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    int32_t ofs = 8*((int32_t)s-1);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if ((sn & SNAP_NORESTORE))[m
[31m-      continue;[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-#if LJ_SOFTFP[m
[31m-      Reg tmp;[m
[31m-      RegSet allow = rset_exclude(RSET_GPR, RID_BASE);[m
[31m-      lua_assert(irref_isk(ref));  /* LJ_SOFTFP: must be a number constant. */[m
[31m-      tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.lo, allow);[m
[31m-      emit_tsi(as, MIPSI_SW, tmp, RID_BASE, ofs+(LJ_BE?4:0));[m
[31m-      if (rset_test(as->freeset, tmp+1)) allow = RID2RSET(tmp+1);[m
[31m-      tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.hi, allow);[m
[31m-      emit_tsi(as, MIPSI_SW, tmp, RID_BASE, ofs+(LJ_BE?0:4));[m
[31m-#else[m
[31m-      Reg src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-      emit_hsi(as, MIPSI_SDC1, src, RID_BASE, ofs);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      Reg type;[m
[31m-      RegSet allow = rset_exclude(RSET_GPR, RID_BASE);[m
[31m-      lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));[m
[31m-      if (!irt_ispri(ir->t)) {[m
[31m-	Reg src = ra_alloc1(as, ref, allow);[m
[31m-	rset_clear(allow, src);[m
[31m-	emit_tsi(as, MIPSI_SW, src, RID_BASE, ofs+(LJ_BE?4:0));[m
[31m-      }[m
[31m-      if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	if (s == 0) continue;  /* Do not overwrite link to previous frame. */[m
[31m-	type = ra_allock(as, (int32_t)(*flinks--), allow);[m
[31m-#if LJ_SOFTFP[m
[31m-      } else if ((sn & SNAP_SOFTFPNUM)) {[m
[31m-	type = ra_alloc1(as, ref+1, rset_exclude(RSET_GPR, RID_BASE));[m
[31m-#endif[m
[31m-      } else {[m
[31m-	type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-      }[m
[31m-      emit_tsi(as, MIPSI_SW, type, RID_BASE, ofs+(LJ_BE?0:4));[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-}[m
[31m-[m
[31m-/* -- GC handling --------------------------------------------------------- */[m
[31m-[m
[31m-/* Check GC threshold and do one or more GC steps. */[m
[31m-static void asm_gc_check(ASMState *as)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg tmp;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */[m
[31m-  /* Assumes asm_snap_prep() already done. */[m
[31m-  asm_guard(as, MIPSI_BNE, RID_RET, RID_ZERO);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ASMREF_TMP2;  /* MSize steps     */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);[m
[31m-  tmp = ra_releasetmp(as, ASMREF_TMP2);[m
[31m-  emit_loadi(as, tmp, as->gcsteps);[m
[31m-  /* Jump around GC step if GC total < GC threshold. */[m
[31m-  emit_branch(as, MIPSI_BNE, RID_TMP, RID_ZERO, l_end);[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP, RID_TMP, tmp);[m
[31m-  emit_getgl(as, tmp, gc.threshold);[m
[31m-  emit_getgl(as, RID_TMP, gc.total);[m
[31m-  as->gcsteps = 0;[m
[31m-  checkmclim(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Loop handling ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the loop branch. */[m
[31m-static void asm_loop_fixup(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target = as->mcp;[m
[31m-  p[-1] = MIPSI_NOP;[m
[31m-  if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-    /* asm_guard already inverted the cond branch. Only patch the target. */[m
[31m-    p[-3] |= ((target-p+2) & 0x0000ffffu);[m
[31m-  } else {[m
[31m-    p[-2] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Coalesce BASE register for a root trace. */[m
[31m-static void asm_head_root_base(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (as->loopinv) as->mctop--;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (r != RID_BASE)[m
[31m-      emit_move(as, r, RID_BASE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Coalesce BASE register for a side trace. */[m
[31m-static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (as->loopinv) as->mctop--;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (irp->r == r) {[m
[31m-      rset_clear(allow, r);  /* Mark same BASE register as coalesced. */[m
[31m-    } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) {[m
[31m-      rset_clear(allow, irp->r);[m
[31m-      emit_move(as, r, irp->r);  /* Move from coalesced parent reg. */[m
[31m-    } else {[m
[31m-      emit_getgl(as, r, jit_base);  /* Otherwise reload BASE. */[m
[31m-    }[m
[31m-  }[m
[31m-  return allow;[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the tail code. */[m
[31m-static void asm_tail_fixup(ASMState *as, TraceNo lnk)[m
[31m-{[m
[31m-  MCode *target = lnk ? traceref(as->J,lnk)->mcode : (MCode *)lj_vm_exit_interp;[m
[31m-  int32_t spadj = as->T->spadjust;[m
[31m-  MCode *p = as->mctop-1;[m
[31m-  *p = spadj ? (MIPSI_ADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP;[m
[31m-  p[-1] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);[m
[31m-}[m
[31m-[m
[31m-/* Prepare tail of code. */[m
[31m-static void asm_tail_prep(ASMState *as)[m
[31m-{[m
[31m-  as->mcp = as->mctop-2;  /* Leave room for branch plus nop or stack adj. */[m
[31m-  as->invmcp = as->loopref ? as->mcp : NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Ensure there are enough stack slots for call arguments. */[m
[31m-static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  uint32_t i, nargs = CCI_XNARGS(ci);[m
[31m-  int nslots = 4, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  for (i = 0; i < nargs; i++) {[m
[31m-    if (!LJ_SOFTFP && args[i] && irt_isfp(IR(args[i])->t) &&[m
[31m-	nfpr > 0 && !(ci->flags & CCI_VARARG)) {[m
[31m-      nfpr--;[m
[31m-      ngpr -= irt_isnum(IR(args[i])->t) ? 2 : 1;[m
[31m-    } else if (!LJ_SOFTFP && args[i] && irt_isnum(IR(args[i])->t)) {[m
[31m-      nfpr = 0;[m
[31m-      ngpr = ngpr & ~1;[m
[31m-      if (ngpr > 0) ngpr -= 2; else nslots = (nslots+3) & ~1;[m
[31m-    } else {[m
[31m-      nfpr = 0;[m
[31m-      if (ngpr > 0) ngpr--; else nslots++;[m
[31m-    }[m
[31m-  }[m
[31m-  if (nslots > as->evenspill)  /* Leave room for args in stack slots. */[m
[31m-    as->evenspill = nslots;[m
[31m-  return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET);[m
[31m-}[m
[31m-[m
[31m-static void asm_setup_target(ASMState *as)[m
[31m-{[m
[31m-  asm_sparejump_setup(as);[m
[31m-  asm_exitstub_setup(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace patching ------------------------------------------------------ */[m
[31m-[m
[31m-/* Patch exit jumps of existing machine code to a new target. */[m
[31m-void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)[m
[31m-{[m
[31m-  MCode *p = T->mcode;[m
[31m-  MCode *pe = (MCode *)((char *)p + T->szmcode);[m
[31m-  MCode *px = exitstub_trace_addr(T, exitno);[m
[31m-  MCode *cstart = NULL, *cstop = NULL;[m
[31m-  MCode *mcarea = lj_mcode_patch(J, p, 0);[m
[31m-  MCode exitload = MIPSI_LI | MIPSF_T(RID_TMP) | exitno;[m
[31m-  MCode tjump = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);[m
[31m-  for (p++; p < pe; p++) {[m
[31m-    if (*p == exitload) {  /* Look for load of exit number. */[m
[31m-      if (((p[-1] ^ (px-p)) & 0xffffu) == 0) {  /* Look for exitstub branch. */[m
[31m-	ptrdiff_t delta = target - p;[m
[31m-	if (((delta + 0x8000) >> 16) == 0) {  /* Patch in-range branch. */[m
[31m-	patchbranch:[m
[31m-	  p[-1] = (p[-1] & 0xffff0000u) | (delta & 0xffffu);[m
[31m-	  *p = MIPSI_NOP;  /* Replace the load of the exit number. */[m
[31m-	  cstop = p;[m
[31m-	  if (!cstart) cstart = p-1;[m
[31m-	} else {  /* Branch out of range. Use spare jump slot in mcarea. */[m
[31m-	  int i;[m
[31m-	  for (i = 2; i < 2+MIPS_SPAREJUMP*2; i += 2) {[m
[31m-	    if (mcarea[i] == tjump) {[m
[31m-	      delta = mcarea+i - p;[m
[31m-	      goto patchbranch;[m
[31m-	    } else if (mcarea[i] == MIPSI_NOP) {[m
[31m-	      mcarea[i] = tjump;[m
[31m-	      cstart = mcarea+i;[m
[31m-	      delta = mcarea+i - p;[m
[31m-	      goto patchbranch;[m
[31m-	    }[m
[31m-	  }[m
[31m-	  /* Ignore jump slot overflow. Child trace is simply not attached. */[m
[31m-	}[m
[31m-      } else if (p+1 == pe) {[m
[31m-	/* Patch NOP after code for inverted loop branch. Use of J is ok. */[m
[31m-	lua_assert(p[1] == MIPSI_NOP);[m
[31m-	p[1] = tjump;[m
[31m-	*p = MIPSI_NOP;  /* Replace the load of the exit number. */[m
[31m-	cstop = p+2;[m
[31m-	if (!cstart) cstart = p+1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (cstart) lj_mcode_sync(cstart, cstop);[m
[31m-  lj_mcode_patch(J, mcarea, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex 0ebed40..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,2015 +0,0 @@[m
[31m-/*[m
[31m-** PPC IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Register allocator extensions --------------------------------------- */[m
[31m-[m
[31m-/* Allocate a register with a hint. */[m
[31m-static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  if (ra_noreg(r)) {[m
[31m-    if (!ra_hashint(r) && !iscrossref(as, ref))[m
[31m-      ra_sethint(IR(ref)->r, hint);  /* Propagate register hint. */[m
[31m-    r = ra_allocref(as, ref, allow);[m
[31m-  }[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate two source registers for three-operand instructions. */[m
[31m-static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-  Reg left = irl->r, right = irr->r;[m
[31m-  if (ra_hasreg(left)) {[m
[31m-    ra_noweak(as, left);[m
[31m-    if (ra_noreg(right))[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(allow, left));[m
[31m-    else[m
[31m-      ra_noweak(as, right);[m
[31m-  } else if (ra_hasreg(right)) {[m
[31m-    ra_noweak(as, right);[m
[31m-    left = ra_allocref(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else if (ra_hashint(right)) {[m
[31m-    right = ra_allocref(as, ir->op2, allow);[m
[31m-    left = ra_alloc1(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else {[m
[31m-    left = ra_allocref(as, ir->op1, allow);[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(allow, left));[m
[31m-  }[m
[31m-  return left | (right << 8);[m
[31m-}[m
[31m-[m
[31m-/* -- Guard handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Setup exit stubs after the end of each trace. */[m
[31m-static void asm_exitstub_setup(ASMState *as, ExitNo nexits)[m
[31m-{[m
[31m-  ExitNo i;[m
[31m-  MCode *mxp = as->mctop;[m
[31m-  if (mxp - (nexits + 3 + MCLIM_REDZONE) < as->mclim)[m
[31m-    asm_mclimit(as);[m
[31m-  /* 1: mflr r0; bl ->vm_exit_handler; li r0, traceno; bl <1; bl <1; ... */[m
[31m-  for (i = nexits-1; (int32_t)i >= 0; i--)[m
[31m-    *--mxp = PPCI_BL|(((-3-i)&0x00ffffffu)<<2);[m
[31m-  *--mxp = PPCI_LI|PPCF_T(RID_TMP)|as->T->traceno;  /* Read by exit handler. */[m
[31m-  mxp--;[m
[31m-  *mxp = PPCI_BL|((((MCode *)(void *)lj_vm_exit_handler-mxp)&0x00ffffffu)<<2);[m
[31m-  *--mxp = PPCI_MFLR|PPCF_T(RID_TMP);[m
[31m-  as->mctop = mxp;[m
[31m-}[m
[31m-[m
[31m-static MCode *asm_exitstub_addr(ASMState *as, ExitNo exitno)[m
[31m-{[m
[31m-  /* Keep this in-sync with exitstub_trace_addr(). */[m
[31m-  return as->mctop + exitno + 3;[m
[31m-}[m
[31m-[m
[31m-/* Emit conditional branch to exit for guard. */[m
[31m-static void asm_guardcc(ASMState *as, PPCCC cc)[m
[31m-{[m
[31m-  MCode *target = asm_exitstub_addr(as, as->snapno);[m
[31m-  MCode *p = as->mcp;[m
[31m-  if (LJ_UNLIKELY(p == as->invmcp)) {[m
[31m-    as->loopinv = 1;[m
[31m-    *p = PPCI_B | (((target-p) & 0x00ffffffu) << 2);[m
[31m-    emit_condbranch(as, PPCI_BC, cc^4, p);[m
[31m-    return;[m
[31m-  }[m
[31m-  emit_condbranch(as, PPCI_BC, cc, target);[m
[31m-}[m
[31m-[m
[31m-/* -- Operand fusion ------------------------------------------------------ */[m
[31m-[m
[31m-/* Limit linear search to this distance. Avoids O(n^2) behavior. */[m
[31m-#define CONFLICT_SEARCH_LIM	31[m
[31m-[m
[31m-/* Check if there's no conflicting instruction between curins and ref. */[m
[31m-static int noconflict(ASMState *as, IRRef ref, IROp conflict)[m
[31m-{[m
[31m-  IRIns *ir = as->ir;[m
[31m-  IRRef i = as->curins;[m
[31m-  if (i > ref + CONFLICT_SEARCH_LIM)[m
[31m-    return 0;  /* Give up, ref is too far away. */[m
[31m-  while (--i > ref)[m
[31m-    if (ir[i].o == conflict)[m
[31m-      return 0;  /* Conflict found. */[m
[31m-  return 1;  /* Ok, no conflict. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse the array base of colocated arrays. */[m
[31m-static int32_t asm_fuseabase(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE &&[m
[31m-      !neverfuse(as) && noconflict(as, ref, IR_NEWREF))[m
[31m-    return (int32_t)sizeof(GCtab);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Indicates load/store indexed is ok. */[m
[31m-#define AHUREF_LSX	((int32_t)0x80000000)[m
[31m-[m
[31m-/* Fuse array/hash/upvalue reference into register+offset operand. */[m
[31m-static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r)) {[m
[31m-    if (ir->o == IR_AREF) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	if (irref_isk(ir->op2)) {[m
[31m-	  IRRef tab = IR(ir->op1)->op1;[m
[31m-	  int32_t ofs = asm_fuseabase(as, tab);[m
[31m-	  IRRef refa = ofs ? tab : ir->op1;[m
[31m-	  ofs += 8*IR(ir->op2)->i;[m
[31m-	  if (checki16(ofs)) {[m
[31m-	    *ofsp = ofs;[m
[31m-	    return ra_alloc1(as, refa, allow);[m
[31m-	  }[m
[31m-	}[m
[31m-	if (*ofsp == AHUREF_LSX) {[m
[31m-	  Reg base = ra_alloc1(as, ir->op1, allow);[m
[31m-	  Reg idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));[m
[31m-	  return base | (idx << 8);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_HREFK) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node));[m
[31m-	if (checki16(ofs)) {[m
[31m-	  *ofsp = ofs;[m
[31m-	  return ra_alloc1(as, ir->op1, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_UREFC) {[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-	int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv);[m
[31m-	int32_t jgl = (intptr_t)J2G(as->J);[m
[31m-	if ((uint32_t)(ofs-jgl) < 65536) {[m
[31m-	  *ofsp = ofs-jgl-32768;[m
[31m-	  return RID_JGL;[m
[31m-	} else {[m
[31m-	  *ofsp = (int16_t)ofs;[m
[31m-	  return ra_allock(as, ofs-(int16_t)ofs, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  *ofsp = 0;[m
[31m-  return ra_alloc1(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-/* Fuse XLOAD/XSTORE reference into load/store operand. */[m
[31m-static void asm_fusexref(ASMState *as, PPCIns pi, Reg rt, IRRef ref,[m
[31m-			 RegSet allow, int32_t ofs)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  Reg base;[m
[31m-  if (ra_noreg(ir->r) && canfuse(as, ir)) {[m
[31m-    if (ir->o == IR_ADD) {[m
[31m-      int32_t ofs2;[m
[31m-      if (irref_isk(ir->op2) && (ofs2 = ofs + IR(ir->op2)->i, checki16(ofs2))) {[m
[31m-	ofs = ofs2;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (ofs == 0) {[m
[31m-	Reg right, left = ra_alloc2(as, ir, allow);[m
[31m-	right = (left >> 8); left &= 255;[m
[31m-	emit_fab(as, PPCI_LWZX | ((pi >> 20) & 0x780), rt, left, right);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_STRREF) {[m
[31m-      lua_assert(ofs == 0);[m
[31m-      ofs = (int32_t)sizeof(GCstr);[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	ofs += IR(ir->op2)->i;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (irref_isk(ir->op1)) {[m
[31m-	ofs += IR(ir->op1)->i;[m
[31m-	ref = ir->op2;[m
[31m-      } else {[m
[31m-	/* NYI: Fuse ADD with constant. */[m
[31m-	Reg tmp, right, left = ra_alloc2(as, ir, allow);[m
[31m-	right = (left >> 8); left &= 255;[m
[31m-	tmp = ra_scratch(as, rset_exclude(rset_exclude(allow, left), right));[m
[31m-	emit_fai(as, pi, rt, tmp, ofs);[m
[31m-	emit_tab(as, PPCI_ADD, tmp, left, right);[m
[31m-	return;[m
[31m-      }[m
[31m-      if (!checki16(ofs)) {[m
[31m-	Reg left = ra_alloc1(as, ref, allow);[m
[31m-	Reg right = ra_allock(as, ofs, rset_exclude(allow, left));[m
[31m-	emit_fab(as, PPCI_LWZX | ((pi >> 20) & 0x780), rt, left, right);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ref, allow);[m
[31m-  emit_fai(as, pi, rt, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Fuse XLOAD/XSTORE reference into indexed-only load/store operand. */[m
[31m-static void asm_fusexrefx(ASMState *as, PPCIns pi, Reg rt, IRRef ref,[m
[31m-			  RegSet allow)[m
[31m-{[m
[31m-  IRIns *ira = IR(ref);[m
[31m-  Reg right, left;[m
[31m-  if (canfuse(as, ira) && ira->o == IR_ADD && ra_noreg(ira->r)) {[m
[31m-    left = ra_alloc2(as, ira, allow);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-  } else {[m
[31m-    right = ra_alloc1(as, ref, allow);[m
[31m-    left = RID_R0;[m
[31m-  }[m
[31m-  emit_tab(as, pi, rt, left, right);[m
[31m-}[m
[31m-[m
[31m-/* Fuse to multiply-add/sub instruction. */[m
[31m-static int asm_fusemadd(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pir)[m
[31m-{[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  IRIns *irm;[m
[31m-  if (lref != rref &&[m
[31m-      ((mayfuse(as, lref) && (irm = IR(lref), irm->o == IR_MUL) &&[m
[31m-	ra_noreg(irm->r)) ||[m
[31m-       (mayfuse(as, rref) && (irm = IR(rref), irm->o == IR_MUL) &&[m
[31m-	(rref = lref, pi = pir, ra_noreg(irm->r))))) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg add = ra_alloc1(as, rref, RSET_FPR);[m
[31m-    Reg right, left = ra_alloc2(as, irm, rset_exclude(RSET_FPR, add));[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_facb(as, pi, dest, left, right, add);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Generate a call to a C function. */[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n, nargs = CCI_XNARGS(ci);[m
[31m-  int32_t ofs = 8;[m
[31m-  Reg gpr = REGARG_FIRSTGPR, fpr = REGARG_FIRSTFPR;[m
[31m-  if ((void *)ci->func)[m
[31m-    emit_call(as, (void *)ci->func);[m
[31m-  for (n = 0; n < nargs; n++) {  /* Setup args. */[m
[31m-    IRRef ref = args[n];[m
[31m-    if (ref) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      if (irt_isfp(ir->t)) {[m
[31m-	if (fpr <= REGARG_LASTFPR) {[m
[31m-	  lua_assert(rset_test(as->freeset, fpr));  /* Already evicted. */[m
[31m-	  ra_leftov(as, fpr, ref);[m
[31m-	  fpr++;[m
[31m-	} else {[m
[31m-	  Reg r = ra_alloc1(as, ref, RSET_FPR);[m
[31m-	  if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4;[m
[31m-	  emit_spstore(as, ir, r, ofs);[m
[31m-	  ofs += irt_isnum(ir->t) ? 8 : 4;[m
[31m-	}[m
[31m-      } else {[m
[31m-	if (gpr <= REGARG_LASTGPR) {[m
[31m-	  lua_assert(rset_test(as->freeset, gpr));  /* Already evicted. */[m
[31m-	  ra_leftov(as, gpr, ref);[m
[31m-	  gpr++;[m
[31m-	} else {[m
[31m-	  Reg r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-	  emit_spstore(as, ir, r, ofs);[m
[31m-	  ofs += 4;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (gpr <= REGARG_LASTGPR)[m
[31m-	gpr++;[m
[31m-      else[m
[31m-	ofs += 4;[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  if ((ci->flags & CCI_VARARG))  /* Vararg calls need to know about FPR use. */[m
[31m-    emit_tab(as, fpr == REGARG_FIRSTFPR ? PPCI_CRXOR : PPCI_CREQV, 6, 6, 6);[m
[31m-}[m
[31m-[m
[31m-/* Setup result reg/sp for call. Evict scratch regs. */[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  int hiop = ((ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));[m
[31m-  if ((ci->flags & CCI_NOFPRCLOBBER))[m
[31m-    drop &= ~RSET_FPR;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  if (hiop && ra_hasreg((ir+1)->r))[m
[31m-    rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);  /* Evictions must be performed first. */[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert(!irt_ispri(ir->t));[m
[31m-    if (irt_isfp(ir->t)) {[m
[31m-      if ((ci->flags & CCI_CASTU64)) {[m
[31m-	/* Use spill slot or temp slots. */[m
[31m-	int32_t ofs = ir->s ? sps_scale(ir->s) : SPOFS_TMP;[m
[31m-	Reg dest = ir->r;[m
[31m-	if (ra_hasreg(dest)) {[m
[31m-	  ra_free(as, dest);[m
[31m-	  ra_modified(as, dest);[m
[31m-	  emit_fai(as, PPCI_LFD, dest, RID_SP, ofs);[m
[31m-	}[m
[31m-	emit_tai(as, PPCI_STW, RID_RETHI, RID_SP, ofs);[m
[31m-	emit_tai(as, PPCI_STW, RID_RETLO, RID_SP, ofs+4);[m
[31m-      } else {[m
[31m-	ra_destreg(as, ir, RID_FPRET);[m
[31m-      }[m
[31m-#if LJ_32[m
[31m-    } else if (hiop) {[m
[31m-      ra_destpair(as, ir);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      ra_destreg(as, ir, RID_RET);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_callx(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  CCallInfo ci;[m
[31m-  IRRef func;[m
[31m-  IRIns *irf;[m
[31m-  ci.flags = asm_callx_flags(as, ir);[m
[31m-  asm_collectargs(as, ir, &ci, args);[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-  func = ir->op2; irf = IR(func);[m
[31m-  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }[m
[31m-  if (irref_isk(func)) {  /* Call to constant address. */[m
[31m-    ci.func = (ASMFunction)(void *)(intptr_t)(irf->i);[m
[31m-  } else {  /* Need a non-argument register for indirect calls. */[m
[31m-    RegSet allow = RSET_GPR & ~RSET_RANGE(RID_R0, REGARG_LASTGPR+1);[m
[31m-    Reg freg = ra_alloc1(as, func, allow);[m
[31m-    *--as->mcp = PPCI_BCTRL;[m
[31m-    *--as->mcp = PPCI_MTCTR | PPCF_T(freg);[m
[31m-    ci.func = (ASMFunction)(void *)0;[m
[31m-  }[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-[m
[31m-/* -- Returns ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Return to lower frame. Guard that it goes to the right spot. */[m
[31m-static void asm_retf(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  void *pc = ir_kptr(IR(ir->op2));[m
[31m-  int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));[m
[31m-  as->topslot -= (BCReg)delta;[m
[31m-  if ((int32_t)as->topslot < 0) as->topslot = 0;[m
[31m-  irt_setmark(IR(REF_BASE)->t);  /* Children must not coalesce with BASE reg. */[m
[31m-  emit_setgl(as, base, jit_base);[m
[31m-  emit_addptr(as, base, -8*delta);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_ab(as, PPCI_CMPW, RID_TMP,[m
[31m-	  ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base)));[m
[31m-  emit_tai(as, PPCI_LWZ, RID_TMP, base, -8);[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-static void asm_tointg(ASMState *as, IRIns *ir, Reg left)[m
[31m-{[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg tmp = ra_scratch(as, rset_clear(allow, left));[m
[31m-  Reg fbias = ra_scratch(as, rset_clear(allow, tmp));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg hibias = ra_allock(as, 0x43300000, rset_exclude(RSET_GPR, dest));[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_fab(as, PPCI_FCMPU, 0, tmp, left);[m
[31m-  emit_fab(as, PPCI_FSUB, tmp, tmp, fbias);[m
[31m-  emit_fai(as, PPCI_LFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-  emit_tai(as, PPCI_STW, RID_TMP, RID_SP, SPOFS_TMPLO);[m
[31m-  emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI);[m
[31m-  emit_asi(as, PPCI_XORIS, RID_TMP, dest, 0x8000);[m
[31m-  emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);[m
[31m-  emit_lsptr(as, PPCI_LFS, (fbias & 31),[m
[31m-	     (void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)),[m
[31m-	     RSET_GPR);[m
[31m-  emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-  emit_fb(as, PPCI_FCTIWZ, tmp, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_tobit(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, allow);[m
[31m-  Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left));[m
[31m-  Reg tmp = ra_scratch(as, rset_clear(allow, right));[m
[31m-  emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);[m
[31m-  emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-  emit_fab(as, PPCI_FADD, tmp, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_conv(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-  int stfp = (st == IRT_NUM || st == IRT_FLOAT);[m
[31m-  IRRef lref = ir->op1;[m
[31m-  lua_assert(irt_type(ir->t) != st);[m
[31m-  lua_assert(!(irt_isint64(ir->t) ||[m
[31m-	       (st == IRT_I64 || st == IRT_U64))); /* Handled by SPLIT. */[m
[31m-  if (irt_isfp(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    if (stfp) {  /* FP to FP conversion. */[m
[31m-      if (st == IRT_NUM)  /* double -> float conversion. */[m
[31m-	emit_fb(as, PPCI_FRSP, dest, ra_alloc1(as, lref, RSET_FPR));[m
[31m-      else  /* float -> double conversion is a no-op on PPC. */[m
[31m-	ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    } else {  /* Integer to FP conversion. */[m
[31m-      /* IRT_INT: Flip hibit, bias with 2^52, subtract 2^52+2^31. */[m
[31m-      /* IRT_U32: Bias with 2^52, subtract 2^52. */[m
[31m-      RegSet allow = RSET_GPR;[m
[31m-      Reg left = ra_alloc1(as, lref, allow);[m
[31m-      Reg hibias = ra_allock(as, 0x43300000, rset_clear(allow, left));[m
[31m-      Reg fbias = ra_scratch(as, rset_exclude(RSET_FPR, dest));[m
[31m-      const float *kbias;[m
[31m-      if (irt_isfloat(ir->t)) emit_fb(as, PPCI_FRSP, dest, dest);[m
[31m-      emit_fab(as, PPCI_FSUB, dest, dest, fbias);[m
[31m-      emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP);[m
[31m-      kbias = (const float *)lj_ir_k64_find(as->J, U64x(59800004,59800000));[m
[31m-      if (st == IRT_U32) kbias++;[m
[31m-      emit_lsptr(as, PPCI_LFS, (fbias & 31), (void *)kbias,[m
[31m-		 rset_clear(allow, hibias));[m
[31m-      emit_tai(as, PPCI_STW, st == IRT_U32 ? left : RID_TMP,[m
[31m-	       RID_SP, SPOFS_TMPLO);[m
[31m-      emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI);[m
[31m-      if (st != IRT_U32) emit_asi(as, PPCI_XORIS, RID_TMP, left, 0x8000);[m
[31m-    }[m
[31m-  } else if (stfp) {  /* FP to integer conversion. */[m
[31m-    if (irt_isguard(ir->t)) {[m
[31m-      /* Checked conversions are only supported from number to int. */[m
[31m-      lua_assert(irt_isint(ir->t) && st == IRT_NUM);[m
[31m-      asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_FPR);[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-      if (irt_isu32(ir->t)) {[m
[31m-	/* Convert both x and x-2^31 to int and merge results. */[m
[31m-	Reg tmpi = ra_scratch(as, rset_exclude(RSET_GPR, dest));[m
[31m-	emit_asb(as, PPCI_OR, dest, dest, tmpi);  /* Select with mask idiom. */[m
[31m-	emit_asb(as, PPCI_AND, tmpi, tmpi, RID_TMP);[m
[31m-	emit_asb(as, PPCI_ANDC, dest, dest, RID_TMP);[m
[31m-	emit_tai(as, PPCI_LWZ, tmpi, RID_SP, SPOFS_TMPLO);  /* tmp = (int)(x) */[m
[31m-	emit_tai(as, PPCI_ADDIS, dest, dest, 0x8000);  /* dest += 2^31 */[m
[31m-	emit_asb(as, PPCI_SRAWI, RID_TMP, dest, 31);  /* mask = -(dest < 0) */[m
[31m-	emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-	emit_tai(as, PPCI_LWZ, dest,[m
[31m-		 RID_SP, SPOFS_TMPLO);  /* dest = (int)(x-2^31) */[m
[31m-	emit_fb(as, PPCI_FCTIWZ, tmp, left);[m
[31m-	emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-	emit_fb(as, PPCI_FCTIWZ, tmp, tmp);[m
[31m-	emit_fab(as, PPCI_FSUB, tmp, left, tmp);[m
[31m-	emit_lsptr(as, PPCI_LFS, (tmp & 31),[m
[31m-		   (void *)lj_ir_k64_find(as->J, U64x(4f000000,00000000)),[m
[31m-		   RSET_GPR);[m
[31m-      } else {[m
[31m-	emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);[m
[31m-	emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-	emit_fb(as, PPCI_FCTIWZ, tmp, left);[m
[31m-      }[m
[31m-    }[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */[m
[31m-      Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-      lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));[m
[31m-      if ((ir->op2 & IRCONV_SEXT))[m
[31m-	emit_as(as, st == IRT_I8 ? PPCI_EXTSB : PPCI_EXTSH, dest, left);[m
[31m-      else[m
[31m-	emit_rot(as, PPCI_RLWINM, dest, left, 0, st == IRT_U8 ? 24 : 16, 31);[m
[31m-    } else {  /* 32/64 bit integer conversions. */[m
[31m-      /* Only need to handle 32/32 bit no-op (cast) on 32 bit archs. */[m
[31m-      ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_strto(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];[m
[31m-  IRRef args[2];[m
[31m-  int32_t ofs;[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  if (ra_hasreg(ir->r)) rset_set(drop, ir->r);  /* Spill dest reg (if any). */[m
[31m-  ra_evictset(as, drop);[m
[31m-  asm_guardcc(as, CC_EQ);[m
[31m-  emit_ai(as, PPCI_CMPWI, RID_RET, 0);  /* Test return status. */[m
[31m-  args[0] = ir->op1;      /* GCstr *str */[m
[31m-  args[1] = ASMREF_TMP1;  /* TValue *n  */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  /* Store the result to the spill slot or temp slots. */[m
[31m-  ofs = ir->s ? sps_scale(ir->s) : SPOFS_TMP;[m
[31m-  emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_SP, ofs);[m
[31m-}[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-/* Get pointer to TValue. */[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (irref_isk(ref))  /* Use the number constant itself as a TValue. */[m
[31m-      ra_allockreg(as, i32ptr(ir_knum(ir)), dest);[m
[31m-    else  /* Otherwise force a spill and use the spill slot. */[m
[31m-      emit_tai(as, PPCI_ADDI, dest, RID_SP, ra_spill(as, ir));[m
[31m-  } else {[m
[31m-    /* Otherwise use g->tmptv to hold the TValue. */[m
[31m-    RegSet allow = rset_exclude(RSET_GPR, dest);[m
[31m-    Reg type;[m
[31m-    emit_tai(as, PPCI_ADDI, dest, RID_JGL, (int32_t)offsetof(global_State, tmptv)-32768);[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, allow);[m
[31m-      emit_setgl(as, src, tmptv.gcr);[m
[31m-    }[m
[31m-    type = ra_allock(as, irt_toitype(ir->t), allow);[m
[31m-    emit_setgl(as, type, tmptv.it);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_aref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx, base;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    IRRef tab = IR(ir->op1)->op1;[m
[31m-    int32_t ofs = asm_fuseabase(as, tab);[m
[31m-    IRRef refa = ofs ? tab : ir->op1;[m
[31m-    ofs += 8*IR(ir->op2)->i;[m
[31m-    if (checki16(ofs)) {[m
[31m-      base = ra_alloc1(as, refa, RSET_GPR);[m
[31m-      emit_tai(as, PPCI_ADDI, dest, base, ofs);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));[m
[31m-  emit_tab(as, PPCI_ADD, dest, RID_TMP, base);[m
[31m-  emit_slwi(as, RID_TMP, idx, 3);[m
[31m-}[m
[31m-[m
[31m-/* Inlined hash lookup. Specialized for key type and for const keys.[m
[31m-** The equivalent C code is:[m
[31m-**   Node *n = hashkey(t, key);[m
[31m-**   do {[m
[31m-**     if (lj_obj_equal(&n->key, key)) return &n->val;[m
[31m-**   } while ((n = nextnode(n)));[m
[31m-**   return niltv(L);[m
[31m-*/[m
[31m-static void asm_href(ASMState *as, IRIns *ir, IROp merge)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int destused = ra_used(ir);[m
[31m-  Reg dest = ra_dest(as, ir, allow);[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));[m
[31m-  Reg key = RID_NONE, tmp1 = RID_TMP, tmp2;[m
[31m-  Reg tisnum = RID_NONE, tmpnum = RID_NONE;[m
[31m-  IRRef refkey = ir->op2;[m
[31m-  IRIns *irkey = IR(refkey);[m
[31m-  IRType1 kt = irkey->t;[m
[31m-  uint32_t khash;[m
[31m-  MCLabel l_end, l_loop, l_next;[m
[31m-[m
[31m-  rset_clear(allow, tab);[m
[31m-  if (irt_isnum(kt)) {[m
[31m-    key = ra_alloc1(as, refkey, RSET_FPR);[m
[31m-    tmpnum = ra_scratch(as, rset_exclude(RSET_FPR, key));[m
[31m-    tisnum = ra_allock(as, (int32_t)LJ_TISNUM, allow);[m
[31m-    rset_clear(allow, tisnum);[m
[31m-  } else if (!irt_ispri(kt)) {[m
[31m-    key = ra_alloc1(as, refkey, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-  }[m
[31m-  tmp2 = ra_scratch(as, allow);[m
[31m-  rset_clear(allow, tmp2);[m
[31m-[m
[31m-  /* Key not found in chain: jump to exit (if merged) or load niltv. */[m
[31m-  l_end = emit_label(as);[m
[31m-  as->invmcp = NULL;[m
[31m-  if (merge == IR_NE)[m
[31m-    asm_guardcc(as, CC_EQ);[m
[31m-  else if (destused)[m
[31m-    emit_loada(as, dest, niltvg(J2G(as->J)));[m
[31m-[m
[31m-  /* Follow hash chain until the end. */[m
[31m-  l_loop = --as->mcp;[m
[31m-  emit_ai(as, PPCI_CMPWI, dest, 0);[m
[31m-  emit_tai(as, PPCI_LWZ, dest, dest, (int32_t)offsetof(Node, next));[m
[31m-  l_next = emit_label(as);[m
[31m-[m
[31m-  /* Type and value comparison. */[m
[31m-  if (merge == IR_EQ)[m
[31m-    asm_guardcc(as, CC_EQ);[m
[31m-  else[m
[31m-    emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end);[m
[31m-  if (irt_isnum(kt)) {[m
[31m-    emit_fab(as, PPCI_FCMPU, 0, tmpnum, key);[m
[31m-    emit_condbranch(as, PPCI_BC, CC_GE, l_next);[m
[31m-    emit_ab(as, PPCI_CMPLW, tmp1, tisnum);[m
[31m-    emit_fai(as, PPCI_LFD, tmpnum, dest, (int32_t)offsetof(Node, key.n));[m
[31m-  } else {[m
[31m-    if (!irt_ispri(kt)) {[m
[31m-      emit_ab(as, PPCI_CMPW, tmp2, key);[m
[31m-      emit_condbranch(as, PPCI_BC, CC_NE, l_next);[m
[31m-    }[m
[31m-    emit_ai(as, PPCI_CMPWI, tmp1, irt_toitype(irkey->t));[m
[31m-    if (!irt_ispri(kt))[m
[31m-      emit_tai(as, PPCI_LWZ, tmp2, dest, (int32_t)offsetof(Node, key.gcr));[m
[31m-  }[m
[31m-  emit_tai(as, PPCI_LWZ, tmp1, dest, (int32_t)offsetof(Node, key.it));[m
[31m-  *l_loop = PPCI_BC | PPCF_Y | PPCF_CC(CC_NE) |[m
[31m-	    (((char *)as->mcp-(char *)l_loop) & 0xffffu);[m
[31m-[m
[31m-  /* Load main position relative to tab->node into dest. */[m
[31m-  khash = irref_isk(refkey) ? ir_khash(irkey) : 1;[m
[31m-  if (khash == 0) {[m
[31m-    emit_tai(as, PPCI_LWZ, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-  } else {[m
[31m-    Reg tmphash = tmp1;[m
[31m-    if (irref_isk(refkey))[m
[31m-      tmphash = ra_allock(as, khash, allow);[m
[31m-    emit_tab(as, PPCI_ADD, dest, dest, tmp1);[m
[31m-    emit_tai(as, PPCI_MULLI, tmp1, tmp1, sizeof(Node));[m
[31m-    emit_asb(as, PPCI_AND, tmp1, tmp2, tmphash);[m
[31m-    emit_tai(as, PPCI_LWZ, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-    emit_tai(as, PPCI_LWZ, tmp2, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-    if (irref_isk(refkey)) {[m
[31m-      /* Nothing to do. */[m
[31m-    } else if (irt_isstr(kt)) {[m
[31m-      emit_tai(as, PPCI_LWZ, tmp1, key, (int32_t)offsetof(GCstr, hash));[m
[31m-    } else {  /* Must match with hash*() in lj_tab.c. */[m
[31m-      emit_tab(as, PPCI_SUBF, tmp1, tmp2, tmp1);[m
[31m-      emit_rotlwi(as, tmp2, tmp2, HASH_ROT3);[m
[31m-      emit_asb(as, PPCI_XOR, tmp1, tmp1, tmp2);[m
[31m-      emit_rotlwi(as, tmp1, tmp1, (HASH_ROT2+HASH_ROT1)&31);[m
[31m-      emit_tab(as, PPCI_SUBF, tmp2, dest, tmp2);[m
[31m-      if (irt_isnum(kt)) {[m
[31m-	int32_t ofs = ra_spill(as, irkey);[m
[31m-	emit_asb(as, PPCI_XOR, tmp2, tmp2, tmp1);[m
[31m-	emit_rotlwi(as, dest, tmp1, HASH_ROT1);[m
[31m-	emit_tab(as, PPCI_ADD, tmp1, tmp1, tmp1);[m
[31m-	emit_tai(as, PPCI_LWZ, tmp2, RID_SP, ofs+4);[m
[31m-	emit_tai(as, PPCI_LWZ, tmp1, RID_SP, ofs);[m
[31m-      } else {[m
[31m-	emit_asb(as, PPCI_XOR, tmp2, key, tmp1);[m
[31m-	emit_rotlwi(as, dest, tmp1, HASH_ROT1);[m
[31m-	emit_tai(as, PPCI_ADDI, tmp1, tmp2, HASH_BIAS);[m
[31m-	emit_tai(as, PPCI_ADDIS, tmp2, key, (HASH_BIAS + 32768)>>16);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_hrefk(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *kslot = IR(ir->op2);[m
[31m-  IRIns *irkey = IR(kslot->op1);[m
[31m-  int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node));[m
[31m-  int32_t kofs = ofs + (int32_t)offsetof(Node, key);[m
[31m-  Reg dest = (ra_used(ir)||ofs > 32736) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;[m
[31m-  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg key = RID_NONE, type = RID_TMP, idx = node;[m
[31m-  RegSet allow = rset_exclude(RSET_GPR, node);[m
[31m-  lua_assert(ofs % sizeof(Node) == 0);[m
[31m-  if (ofs > 32736) {[m
[31m-    idx = dest;[m
[31m-    rset_clear(allow, dest);[m
[31m-    kofs = (int32_t)offsetof(Node, key);[m
[31m-  } else if (ra_hasreg(dest)) {[m
[31m-    emit_tai(as, PPCI_ADDI, dest, node, ofs);[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  if (!irt_ispri(irkey->t)) {[m
[31m-    key = ra_scratch(as, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-  }[m
[31m-  rset_clear(allow, type);[m
[31m-  if (irt_isnum(irkey->t)) {[m
[31m-    emit_cmpi(as, key, (int32_t)ir_knum(irkey)->u32.lo);[m
[31m-    asm_guardcc(as, CC_NE);[m
[31m-    emit_cmpi(as, type, (int32_t)ir_knum(irkey)->u32.hi);[m
[31m-  } else {[m
[31m-    if (ra_hasreg(key)) {[m
[31m-      emit_cmpi(as, key, irkey->i);  /* May use RID_TMP, i.e. type. */[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-    }[m
[31m-    emit_ai(as, PPCI_CMPWI, type, irt_toitype(irkey->t));[m
[31m-  }[m
[31m-  if (ra_hasreg(key)) emit_tai(as, PPCI_LWZ, key, idx, kofs+4);[m
[31m-  emit_tai(as, PPCI_LWZ, type, idx, kofs);[m
[31m-  if (ofs > 32736) {[m
[31m-    emit_tai(as, PPCI_ADDIS, dest, dest, (ofs + 32768) >> 16);[m
[31m-    emit_tai(as, PPCI_ADDI, dest, node, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_uref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* NYI: Check that UREFO is still open and not aliasing a slot. */[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-    MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;[m
[31m-    emit_lsptr(as, PPCI_LWZ, dest, v, RSET_GPR);[m
[31m-  } else {[m
[31m-    Reg uv = ra_scratch(as, RSET_GPR);[m
[31m-    Reg func = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (ir->o == IR_UREFC) {[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_ai(as, PPCI_CMPWI, RID_TMP, 1);[m
[31m-      emit_tai(as, PPCI_ADDI, dest, uv, (int32_t)offsetof(GCupval, tv));[m
[31m-      emit_tai(as, PPCI_LBZ, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));[m
[31m-    } else {[m
[31m-      emit_tai(as, PPCI_LWZ, dest, uv, (int32_t)offsetof(GCupval, v));[m
[31m-    }[m
[31m-    emit_tai(as, PPCI_LWZ, uv, func,[m
[31m-	     (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(as); UNUSED(ir);[m
[31m-  lua_assert(!ra_used(ir));[m
[31m-}[m
[31m-[m
[31m-static void asm_strref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRRef ref = ir->op2, refk = ir->op1;[m
[31m-  int32_t ofs = (int32_t)sizeof(GCstr);[m
[31m-  Reg r;[m
[31m-  if (irref_isk(ref)) {[m
[31m-    IRRef tmp = refk; refk = ref; ref = tmp;[m
[31m-  } else if (!irref_isk(refk)) {[m
[31m-    Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    IRIns *irr = IR(ir->op2);[m
[31m-    if (ra_hasreg(irr->r)) {[m
[31m-      ra_noweak(as, irr->r);[m
[31m-      right = irr->r;[m
[31m-    } else if (mayfuse(as, irr->op2) &&[m
[31m-	       irr->o == IR_ADD && irref_isk(irr->op2) &&[m
[31m-	       checki16(ofs + IR(irr->op2)->i)) {[m
[31m-      ofs += IR(irr->op2)->i;[m
[31m-      right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left));[m
[31m-    } else {[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    }[m
[31m-    emit_tai(as, PPCI_ADDI, dest, dest, ofs);[m
[31m-    emit_tab(as, PPCI_ADD, dest, left, right);[m
[31m-    return;[m
[31m-  }[m
[31m-  r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-  ofs += IR(refk)->i;[m
[31m-  if (checki16(ofs))[m
[31m-    emit_tai(as, PPCI_ADDI, dest, r, ofs);[m
[31m-  else[m
[31m-    emit_tab(as, PPCI_ADD, dest, r,[m
[31m-	     ra_allock(as, ofs, rset_exclude(RSET_GPR, r)));[m
[31m-}[m
[31m-[m
[31m-/* -- Loads and stores ---------------------------------------------------- */[m
[31m-[m
[31m-static PPCIns asm_fxloadins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: return PPCI_LBZ;  /* Needs sign-extension. */[m
[31m-  case IRT_U8: return PPCI_LBZ;[m
[31m-  case IRT_I16: return PPCI_LHA;[m
[31m-  case IRT_U16: return PPCI_LHZ;[m
[31m-  case IRT_NUM: return PPCI_LFD;[m
[31m-  case IRT_FLOAT: return PPCI_LFS;[m
[31m-  default: return PPCI_LWZ;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static PPCIns asm_fxstoreins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: case IRT_U8: return PPCI_STB;[m
[31m-  case IRT_I16: case IRT_U16: return PPCI_STH;[m
[31m-  case IRT_NUM: return PPCI_STFD;[m
[31m-  case IRT_FLOAT: return PPCI_STFS;[m
[31m-  default: return PPCI_STW;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  PPCIns pi = asm_fxloadins(ir);[m
[31m-  int32_t ofs;[m
[31m-  if (ir->op2 == IRFL_TAB_ARRAY) {[m
[31m-    ofs = asm_fuseabase(as, ir->op1);[m
[31m-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */[m
[31m-      emit_tai(as, PPCI_ADDI, dest, idx, ofs);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  ofs = field_ofs[ir->op2];[m
[31m-  lua_assert(!irt_isi8(ir->t));[m
[31m-  emit_tai(as, pi, dest, idx, ofs);[m
[31m-}[m
[31m-[m
[31m-static void asm_fstore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-    IRIns *irf = IR(ir->op1);[m
[31m-    Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src));[m
[31m-    int32_t ofs = field_ofs[irf->op2];[m
[31m-    PPCIns pi = asm_fxstoreins(ir);[m
[31m-    emit_tai(as, pi, src, idx, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_xload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);[m
[31m-  lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED));[m
[31m-  if (irt_isi8(ir->t))[m
[31m-    emit_as(as, PPCI_EXTSB, dest, dest);[m
[31m-  asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0);[m
[31m-}[m
[31m-[m
[31m-static void asm_xstore_(ASMState *as, IRIns *ir, int32_t ofs)[m
[31m-{[m
[31m-  IRIns *irb;[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  if (ofs == 0 && mayfuse(as, ir->op2) && (irb = IR(ir->op2))->o == IR_BSWAP &&[m
[31m-      ra_noreg(irb->r) && (irt_isint(ir->t) || irt_isu32(ir->t))) {[m
[31m-    /* Fuse BSWAP with XSTORE to stwbrx. */[m
[31m-    Reg src = ra_alloc1(as, irb->op1, RSET_GPR);[m
[31m-    asm_fusexrefx(as, PPCI_STWBRX, src, ir->op1, rset_exclude(RSET_GPR, src));[m
[31m-  } else {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);[m
[31m-    asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1,[m
[31m-		 rset_exclude(RSET_GPR, src), ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_xstore(as, ir)	asm_xstore_(as, ir, 0)[m
[31m-[m
[31m-static void asm_ahuvload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType1 t = ir->t;[m
[31m-  Reg dest = RID_NONE, type = RID_TMP, tmp = RID_TMP, idx;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int32_t ofs = AHUREF_LSX;[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t));[m
[31m-    if (!irt_isnum(t)) ofs = 0;[m
[31m-    dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : RSET_GPR);[m
[31m-    rset_clear(allow, dest);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);[m
[31m-  if (irt_isnum(t)) {[m
[31m-    Reg tisnum = ra_allock(as, (int32_t)LJ_TISNUM, rset_exclude(allow, idx));[m
[31m-    asm_guardcc(as, CC_GE);[m
[31m-    emit_ab(as, PPCI_CMPLW, type, tisnum);[m
[31m-    if (ra_hasreg(dest)) {[m
[31m-      if (ofs == AHUREF_LSX) {[m
[31m-	tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR,[m
[31m-						       (idx&255)), (idx>>8)));[m
[31m-	emit_fab(as, PPCI_LFDX, dest, (idx&255), tmp);[m
[31m-      } else {[m
[31m-	emit_fai(as, PPCI_LFD, dest, idx, ofs);[m
[31m-      }[m
[31m-    }[m
[31m-  } else {[m
[31m-    asm_guardcc(as, CC_NE);[m
[31m-    emit_ai(as, PPCI_CMPWI, type, irt_toitype(t));[m
[31m-    if (ra_hasreg(dest)) emit_tai(as, PPCI_LWZ, dest, idx, ofs+4);[m
[31m-  }[m
[31m-  if (ofs == AHUREF_LSX) {[m
[31m-    emit_tab(as, PPCI_LWZX, type, (idx&255), tmp);[m
[31m-    emit_slwi(as, tmp, (idx>>8), 3);[m
[31m-  } else {[m
[31m-    emit_tai(as, PPCI_LWZ, type, idx, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_ahustore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg idx, src = RID_NONE, type = RID_NONE;[m
[31m-  int32_t ofs = AHUREF_LSX;[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    src = ra_alloc1(as, ir->op2, RSET_FPR);[m
[31m-  } else {[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      src = ra_alloc1(as, ir->op2, allow);[m
[31m-      rset_clear(allow, src);[m
[31m-      ofs = 0;[m
[31m-    }[m
[31m-    type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (ofs == AHUREF_LSX) {[m
[31m-      emit_fab(as, PPCI_STFDX, src, (idx&255), RID_TMP);[m
[31m-      emit_slwi(as, RID_TMP, (idx>>8), 3);[m
[31m-    } else {[m
[31m-      emit_fai(as, PPCI_STFD, src, idx, ofs);[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (ra_hasreg(src))[m
[31m-      emit_tai(as, PPCI_STW, src, idx, ofs+4);[m
[31m-    if (ofs == AHUREF_LSX) {[m
[31m-      emit_tab(as, PPCI_STWX, type, (idx&255), RID_TMP);[m
[31m-      emit_slwi(as, RID_TMP, (idx>>8), 3);[m
[31m-    } else {[m
[31m-      emit_tai(as, PPCI_STW, type, idx, ofs);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 0 : 4);[m
[31m-  IRType1 t = ir->t;[m
[31m-  Reg dest = RID_NONE, type = RID_NONE, base;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */[m
[31m-  lua_assert(irt_isguard(t) || !(ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-  lua_assert(LJ_DUALNUM ||[m
[31m-	     !irt_isint(t) || (ir->op2 & (IRSLOAD_CONVERT|IRSLOAD_FRAME)));[m
[31m-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) {[m
[31m-    dest = ra_scratch(as, RSET_FPR);[m
[31m-    asm_tointg(as, ir, dest);[m
[31m-    t.irt = IRT_NUM;  /* Continue with a regular number type check. */[m
[31m-  } else if (ra_used(ir)) {[m
[31m-    lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t));[m
[31m-    dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : RSET_GPR);[m
[31m-    rset_clear(allow, dest);[m
[31m-    base = ra_alloc1(as, REF_BASE, allow);[m
[31m-    rset_clear(allow, base);[m
[31m-    if ((ir->op2 & IRSLOAD_CONVERT)) {[m
[31m-      if (irt_isint(t)) {[m
[31m-	emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);[m
[31m-	dest = ra_scratch(as, RSET_FPR);[m
[31m-	emit_fai(as, PPCI_STFD, dest, RID_SP, SPOFS_TMP);[m
[31m-	emit_fb(as, PPCI_FCTIWZ, dest, dest);[m
[31m-	t.irt = IRT_NUM;  /* Check for original type. */[m
[31m-      } else {[m
[31m-	Reg tmp = ra_scratch(as, allow);[m
[31m-	Reg hibias = ra_allock(as, 0x43300000, rset_clear(allow, tmp));[m
[31m-	Reg fbias = ra_scratch(as, rset_exclude(RSET_FPR, dest));[m
[31m-	emit_fab(as, PPCI_FSUB, dest, dest, fbias);[m
[31m-	emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP);[m
[31m-	emit_lsptr(as, PPCI_LFS, (fbias & 31),[m
[31m-		   (void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)),[m
[31m-		   rset_clear(allow, hibias));[m
[31m-	emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPLO);[m
[31m-	emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI);[m
[31m-	emit_asi(as, PPCI_XORIS, tmp, tmp, 0x8000);[m
[31m-	dest = tmp;[m
[31m-	t.irt = IRT_INT;  /* Check for original type. */[m
[31m-      }[m
[31m-    }[m
[31m-    goto dotypecheck;[m
[31m-  }[m
[31m-  base = ra_alloc1(as, REF_BASE, allow);[m
[31m-  rset_clear(allow, base);[m
[31m-dotypecheck:[m
[31m-  if (irt_isnum(t)) {[m
[31m-    if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-      Reg tisnum = ra_allock(as, (int32_t)LJ_TISNUM, allow);[m
[31m-      asm_guardcc(as, CC_GE);[m
[31m-      emit_ab(as, PPCI_CMPLW, RID_TMP, tisnum);[m
[31m-      type = RID_TMP;[m
[31m-    }[m
[31m-    if (ra_hasreg(dest)) emit_fai(as, PPCI_LFD, dest, base, ofs-4);[m
[31m-  } else {[m
[31m-    if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_ai(as, PPCI_CMPWI, RID_TMP, irt_toitype(t));[m
[31m-      type = RID_TMP;[m
[31m-    }[m
[31m-    if (ra_hasreg(dest)) emit_tai(as, PPCI_LWZ, dest, base, ofs);[m
[31m-  }[m
[31m-  if (ra_hasreg(type)) emit_tai(as, PPCI_LWZ, type, base, ofs-4);[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_cnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(as->J));[m
[31m-  CTypeID id = (CTypeID)IR(ir->op1)->i;[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco];[m
[31m-  IRRef args[4];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL));[m
[31m-[m
[31m-  as->gcsteps++;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  if (ra_used(ir))[m
[31m-    ra_destreg(as, ir, RID_RET);  /* GCcdata * */[m
[31m-[m
[31m-  /* Initialize immutable cdata object. */[m
[31m-  if (ir->o == IR_CNEWI) {[m
[31m-    RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-    int32_t ofs = sizeof(GCcdata);[m
[31m-    lua_assert(sz == 4 || sz == 8);[m
[31m-    if (sz == 8) {[m
[31m-      ofs += 4;[m
[31m-      lua_assert((ir+1)->o == IR_HIOP);[m
[31m-    }[m
[31m-    for (;;) {[m
[31m-      Reg r = ra_alloc1(as, ir->op2, allow);[m
[31m-      emit_tai(as, PPCI_STW, r, RID_RET, ofs);[m
[31m-      rset_clear(allow, r);[m
[31m-      if (ofs == sizeof(GCcdata)) break;[m
[31m-      ofs -= 4; ir++;[m
[31m-    }[m
[31m-  } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];[m
[31m-    args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-    args[1] = ir->op1;      /* CTypeID id   */[m
[31m-    args[2] = ir->op2;      /* CTSize sz    */[m
[31m-    args[3] = ASMREF_TMP1;  /* CTSize align */[m
[31m-    asm_gencall(as, ci, args);[m
[31m-    emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)ctype_align(info));[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */[m
[31m-  emit_tai(as, PPCI_STB, RID_RET+1, RID_RET, offsetof(GCcdata, gct));[m
[31m-  emit_tai(as, PPCI_STH, RID_TMP, RID_RET, offsetof(GCcdata, ctypeid));[m
[31m-  emit_ti(as, PPCI_LI, RID_RET+1, ~LJ_TCDATA);[m
[31m-  emit_ti(as, PPCI_LI, RID_TMP, id);  /* Lower 16 bit used. Sign-ext ok. */[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ASMREF_TMP1;  /* MSize size   */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)),[m
[31m-	       ra_releasetmp(as, ASMREF_TMP1));[m
[31m-}[m
[31m-#else[m
[31m-#define asm_cnew(as, ir)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-static void asm_tbar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg mark = ra_scratch(as, rset_exclude(RSET_GPR, tab));[m
[31m-  Reg link = RID_TMP;[m
[31m-  MCLabel l_end = emit_label(as);[m
[31m-  emit_tai(as, PPCI_STW, link, tab, (int32_t)offsetof(GCtab, gclist));[m
[31m-  emit_tai(as, PPCI_STB, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-  emit_setgl(as, tab, gc.grayagain);[m
[31m-  lua_assert(LJ_GC_BLACK == 0x04);[m
[31m-  emit_rot(as, PPCI_RLWINM, mark, mark, 0, 30, 28);  /* Clear black bit. */[m
[31m-  emit_getgl(as, link, gc.grayagain);[m
[31m-  emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end);[m
[31m-  emit_asi(as, PPCI_ANDIDOT, RID_TMP, mark, LJ_GC_BLACK);[m
[31m-  emit_tai(as, PPCI_LBZ, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-}[m
[31m-[m
[31m-static void asm_obar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg obj, val, tmp;[m
[31m-  /* No need for other object barriers (yet). */[m
[31m-  lua_assert(IR(ir->op1)->o == IR_UREFC);[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ir->op1;      /* TValue *tv      */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);[m
[31m-  obj = IR(ir->op1)->r;[m
[31m-  tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end);[m
[31m-  emit_asi(as, PPCI_ANDIDOT, tmp, tmp, LJ_GC_BLACK);[m
[31m-  emit_condbranch(as, PPCI_BC, CC_EQ, l_end);[m
[31m-  emit_asi(as, PPCI_ANDIDOT, RID_TMP, RID_TMP, LJ_GC_WHITES);[m
[31m-  val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_tai(as, PPCI_LBZ, tmp, obj,[m
[31m-	   (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));[m
[31m-  emit_tai(as, PPCI_LBZ, RID_TMP, val, (int32_t)offsetof(GChead, marked));[m
[31m-}[m
[31m-[m
[31m-/* -- Arithmetic and logic operations ------------------------------------- */[m
[31m-[m
[31m-static void asm_fparith(ASMState *as, IRIns *ir, PPCIns pi)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  if (pi == PPCI_FMUL)[m
[31m-    emit_fac(as, pi, dest, left, right);[m
[31m-  else[m
[31m-    emit_fab(as, pi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_fpunary(ASMState *as, IRIns *ir, PPCIns pi)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR);[m
[31m-  emit_fb(as, pi, dest, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_fpmath(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir))[m
[31m-    return;[m
[31m-  if (ir->op2 == IRFPM_SQRT && (as->flags & JIT_F_SQRT))[m
[31m-    asm_fpunary(as, ir, PPCI_FSQRT);[m
[31m-  else[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-}[m
[31m-[m
[31m-static void asm_add(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (!asm_fusemadd(as, ir, PPCI_FMADD, PPCI_FMADD))[m
[31m-      asm_fparith(as, ir, PPCI_FADD);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    PPCIns pi;[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      int32_t k = IR(ir->op2)->i;[m
[31m-      if (checki16(k)) {[m
[31m-	pi = PPCI_ADDI;[m
[31m-	/* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-	if (as->flagmcp == as->mcp) {[m
[31m-	  as->flagmcp = NULL;[m
[31m-	  as->mcp++;[m
[31m-	  pi = PPCI_ADDICDOT;[m
[31m-	}[m
[31m-	emit_tai(as, pi, dest, left, k);[m
[31m-	return;[m
[31m-      } else if ((k & 0xffff) == 0) {[m
[31m-	emit_tai(as, PPCI_ADDIS, dest, left, (k >> 16));[m
[31m-	return;[m
[31m-      } else if (!as->sectref) {[m
[31m-	emit_tai(as, PPCI_ADDIS, dest, dest, (k + 32768) >> 16);[m
[31m-	emit_tai(as, PPCI_ADDI, dest, left, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    pi = PPCI_ADD;[m
[31m-    /* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-    if (as->flagmcp == as->mcp) {[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp++;[m
[31m-      pi |= PPCF_DOT;[m
[31m-    }[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_tab(as, pi, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sub(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (!asm_fusemadd(as, ir, PPCI_FMSUB, PPCI_FNMSUB))[m
[31m-      asm_fparith(as, ir, PPCI_FSUB);[m
[31m-  } else {[m
[31m-    PPCIns pi = PPCI_SUBF;[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg left, right;[m
[31m-    if (irref_isk(ir->op1)) {[m
[31m-      int32_t k = IR(ir->op1)->i;[m
[31m-      if (checki16(k)) {[m
[31m-	right = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-	emit_tai(as, PPCI_SUBFIC, dest, right, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    /* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-    if (as->flagmcp == as->mcp) {[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp++;[m
[31m-      pi |= PPCF_DOT;[m
[31m-    }[m
[31m-    left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_tab(as, pi, dest, right, left);  /* Subtract right _from_ left. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_mul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, PPCI_FMUL);[m
[31m-  } else {[m
[31m-    PPCIns pi = PPCI_MULLW;[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      int32_t k = IR(ir->op2)->i;[m
[31m-      if (checki16(k)) {[m
[31m-	emit_tai(as, PPCI_MULLI, dest, left, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    /* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-    if (as->flagmcp == as->mcp) {[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp++;[m
[31m-      pi |= PPCF_DOT;[m
[31m-    }[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_tab(as, pi, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_div(as, ir)		asm_fparith(as, ir, PPCI_FDIV)[m
[31m-#define asm_mod(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_modi)[m
[31m-#define asm_pow(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_powi)[m
[31m-[m
[31m-static void asm_neg(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fpunary(as, ir, PPCI_FNEG);[m
[31m-  } else {[m
[31m-    Reg dest, left;[m
[31m-    PPCIns pi = PPCI_NEG;[m
[31m-    if (as->flagmcp == as->mcp) {[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp++;[m
[31m-      pi |= PPCF_DOT;[m
[31m-    }[m
[31m-    dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    emit_tab(as, pi, dest, left, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_abs(as, ir)		asm_fpunary(as, ir, PPCI_FABS)[m
[31m-#define asm_atan2(as, ir)	asm_callid(as, ir, IRCALL_atan2)[m
[31m-#define asm_ldexp(as, ir)	asm_callid(as, ir, IRCALL_ldexp)[m
[31m-[m
[31m-static void asm_arithov(ASMState *as, IRIns *ir, PPCIns pi)[m
[31m-{[m
[31m-  Reg dest, left, right;[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_SO);[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  if (pi == PPCI_SUBFO) { Reg tmp = left; left = right; right = tmp; }[m
[31m-  emit_tab(as, pi|PPCF_DOT, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-#define asm_addov(as, ir)	asm_arithov(as, ir, PPCI_ADDO)[m
[31m-#define asm_subov(as, ir)	asm_arithov(as, ir, PPCI_SUBFO)[m
[31m-#define asm_mulov(as, ir)	asm_arithov(as, ir, PPCI_MULLWO)[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_add64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  PPCIns pi = PPCI_ADDE;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (k == 0)[m
[31m-      pi = PPCI_ADDZE;[m
[31m-    else if (k == -1)[m
[31m-      pi = PPCI_ADDME;[m
[31m-    else[m
[31m-      goto needright;[m
[31m-    right = 0;[m
[31m-  } else {[m
[31m-  needright:[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  }[m
[31m-  emit_tab(as, pi, dest, left, right);[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (checki16(k)) {[m
[31m-      emit_tai(as, PPCI_ADDIC, dest, left, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_tab(as, PPCI_ADDC, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_sub64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left, right = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-  PPCIns pi = PPCI_SUBFE;[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    int32_t k = IR(ir->op1)->i;[m
[31m-    if (k == 0)[m
[31m-      pi = PPCI_SUBFZE;[m
[31m-    else if (k == -1)[m
[31m-      pi = PPCI_SUBFME;[m
[31m-    else[m
[31m-      goto needleft;[m
[31m-    left = 0;[m
[31m-  } else {[m
[31m-  needleft:[m
[31m-    left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, right));[m
[31m-  }[m
[31m-  emit_tab(as, pi, dest, right, left);  /* Subtract right _from_ left. */[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  right = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    int32_t k = IR(ir->op1)->i;[m
[31m-    if (checki16(k)) {[m
[31m-      emit_tai(as, PPCI_SUBFIC, dest, right, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, right));[m
[31m-  emit_tab(as, PPCI_SUBFC, dest, right, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_neg64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  emit_tab(as, PPCI_SUBFZE, dest, left, 0);[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  emit_tai(as, PPCI_SUBFIC, dest, left, 0);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_bnot(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest, left, right;[m
[31m-  PPCIns pi = PPCI_NOR;[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    pi |= PPCF_DOT;[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (mayfuse(as, ir->op1)) {[m
[31m-    IRIns *irl = IR(ir->op1);[m
[31m-    if (irl->o == IR_BAND)[m
[31m-      pi ^= (PPCI_NOR ^ PPCI_NAND);[m
[31m-    else if (irl->o == IR_BXOR)[m
[31m-      pi ^= (PPCI_NOR ^ PPCI_EQV);[m
[31m-    else if (irl->o != IR_BOR)[m
[31m-      goto nofuse;[m
[31m-    left = ra_hintalloc(as, irl->op1, dest, RSET_GPR);[m
[31m-    right = ra_alloc1(as, irl->op2, rset_exclude(RSET_GPR, left));[m
[31m-  } else {[m
[31m-nofuse:[m
[31m-    left = right = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  }[m
[31m-  emit_asb(as, pi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_bswap(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRIns *irx;[m
[31m-  if (mayfuse(as, ir->op1) && (irx = IR(ir->op1))->o == IR_XLOAD &&[m
[31m-      ra_noreg(irx->r) && (irt_isint(irx->t) || irt_isu32(irx->t))) {[m
[31m-    /* Fuse BSWAP with XLOAD to lwbrx. */[m
[31m-    asm_fusexrefx(as, PPCI_LWBRX, dest, irx->op1, RSET_GPR);[m
[31m-  } else {[m
[31m-    Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    Reg tmp = dest;[m
[31m-    if (tmp == left) {[m
[31m-      tmp = RID_TMP;[m
[31m-      emit_mr(as, dest, RID_TMP);[m
[31m-    }[m
[31m-    emit_rot(as, PPCI_RLWIMI, tmp, left, 24, 16, 23);[m
[31m-    emit_rot(as, PPCI_RLWIMI, tmp, left, 24, 0, 7);[m
[31m-    emit_rotlwi(as, tmp, left, 8);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fuse BAND with contiguous bitmask and a shift to rlwinm. */[m
[31m-static void asm_fuseandsh(ASMState *as, PPCIns pi, int32_t mask, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  Reg left;[m
[31m-  if (mayfuse(as, ref) && (ir = IR(ref), ra_noreg(ir->r)) &&[m
[31m-      irref_isk(ir->op2) && ir->o >= IR_BSHL && ir->o <= IR_BROR) {[m
[31m-    int32_t sh = (IR(ir->op2)->i & 31);[m
[31m-    switch (ir->o) {[m
[31m-    case IR_BSHL:[m
[31m-      if ((mask & ((1u<<sh)-1))) goto nofuse;[m
[31m-      break;[m
[31m-    case IR_BSHR:[m
[31m-      if ((mask & ~((~0u)>>sh))) goto nofuse;[m
[31m-      sh = ((32-sh)&31);[m
[31m-      break;[m
[31m-    case IR_BROL:[m
[31m-      break;[m
[31m-    default:[m
[31m-      goto nofuse;[m
[31m-    }[m
[31m-    left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    *--as->mcp = pi | PPCF_T(left) | PPCF_B(sh);[m
[31m-    return;[m
[31m-  }[m
[31m-nofuse:[m
[31m-  left = ra_alloc1(as, ref, RSET_GPR);[m
[31m-  *--as->mcp = pi | PPCF_T(left);[m
[31m-}[m
[31m-[m
[31m-static void asm_band(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest, left, right;[m
[31m-  IRRef lref = ir->op1;[m
[31m-  PPCIns dot = 0;[m
[31m-  IRRef op2;[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    dot = PPCF_DOT;[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (k) {[m
[31m-      /* First check for a contiguous bitmask as used by rlwinm. */[m
[31m-      uint32_t s1 = lj_ffs((uint32_t)k);[m
[31m-      uint32_t k1 = ((uint32_t)k >> s1);[m
[31m-      if ((k1 & (k1+1)) == 0) {[m
[31m-	asm_fuseandsh(as, PPCI_RLWINM|dot | PPCF_A(dest) |[m
[31m-			  PPCF_MB(31-lj_fls((uint32_t)k)) | PPCF_ME(31-s1),[m
[31m-			  k, lref);[m
[31m-	return;[m
[31m-      }[m
[31m-      if (~(uint32_t)k) {[m
[31m-	uint32_t s2 = lj_ffs(~(uint32_t)k);[m
[31m-	uint32_t k2 = (~(uint32_t)k >> s2);[m
[31m-	if ((k2 & (k2+1)) == 0) {[m
[31m-	  asm_fuseandsh(as, PPCI_RLWINM|dot | PPCF_A(dest) |[m
[31m-			    PPCF_MB(32-s2) | PPCF_ME(30-lj_fls(~(uint32_t)k)),[m
[31m-			    k, lref);[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    if (checku16(k)) {[m
[31m-      left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      emit_asi(as, PPCI_ANDIDOT, dest, left, k);[m
[31m-      return;[m
[31m-    } else if ((k & 0xffff) == 0) {[m
[31m-      left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      emit_asi(as, PPCI_ANDISDOT, dest, left, (k >> 16));[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  op2 = ir->op2;[m
[31m-  if (mayfuse(as, op2) && IR(op2)->o == IR_BNOT && ra_noreg(IR(op2)->r)) {[m
[31m-    dot ^= (PPCI_AND ^ PPCI_ANDC);[m
[31m-    op2 = IR(op2)->op1;[m
[31m-  }[m
[31m-  left = ra_hintalloc(as, lref, dest, RSET_GPR);[m
[31m-  right = ra_alloc1(as, op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_asb(as, PPCI_AND ^ dot, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_bitop(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pik)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    Reg tmp = left;[m
[31m-    if ((checku16(k) || (k & 0xffff) == 0) || (tmp = dest, !as->sectref)) {[m
[31m-      if (!checku16(k)) {[m
[31m-	emit_asi(as, pik ^ (PPCI_ORI ^ PPCI_ORIS), dest, tmp, (k >> 16));[m
[31m-	if ((k & 0xffff) == 0) return;[m
[31m-      }[m
[31m-      emit_asi(as, pik, dest, left, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  /* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    pi |= PPCF_DOT;[m
[31m-  }[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_asb(as, pi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-#define asm_bor(as, ir)		asm_bitop(as, ir, PPCI_OR, PPCI_ORI)[m
[31m-#define asm_bxor(as, ir)	asm_bitop(as, ir, PPCI_XOR, PPCI_XORI)[m
[31m-[m
[31m-static void asm_bitshift(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pik)[m
[31m-{[m
[31m-  Reg dest, left;[m
[31m-  Reg dot = 0;[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    dot = PPCF_DOT;[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {  /* Constant shifts. */[m
[31m-    int32_t shift = (IR(ir->op2)->i & 31);[m
[31m-    if (pik == 0)  /* SLWI */[m
[31m-      emit_rot(as, PPCI_RLWINM|dot, dest, left, shift, 0, 31-shift);[m
[31m-    else if (pik == 1)  /* SRWI */[m
[31m-      emit_rot(as, PPCI_RLWINM|dot, dest, left, (32-shift)&31, shift, 31);[m
[31m-    else[m
[31m-      emit_asb(as, pik|dot, dest, left, shift);[m
[31m-  } else {[m
[31m-    Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_asb(as, pi|dot, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_bshl(as, ir)	asm_bitshift(as, ir, PPCI_SLW, 0)[m
[31m-#define asm_bshr(as, ir)	asm_bitshift(as, ir, PPCI_SRW, 1)[m
[31m-#define asm_bsar(as, ir)	asm_bitshift(as, ir, PPCI_SRAW, PPCI_SRAWI)[m
[31m-#define asm_brol(as, ir) \[m
[31m-  asm_bitshift(as, ir, PPCI_RLWNM|PPCF_MB(0)|PPCF_ME(31), \[m
[31m-		       PPCI_RLWINM|PPCF_MB(0)|PPCF_ME(31))[m
[31m-#define asm_bror(as, ir)	lua_assert(0)[m
[31m-[m
[31m-static void asm_min_max(ASMState *as, IRIns *ir, int ismax)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg tmp = dest;[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    if (tmp == left || tmp == right)[m
[31m-      tmp = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_FPR,[m
[31m-					dest), left), right));[m
[31m-    emit_facb(as, PPCI_FSEL, dest, tmp,[m
[31m-	      ismax ? left : right, ismax ? right : left);[m
[31m-    emit_fab(as, PPCI_FSUB, tmp, left, right);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg tmp1 = RID_TMP, tmp2 = dest;[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    if (tmp2 == left || tmp2 == right)[m
[31m-      tmp2 = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_GPR,[m
[31m-					 dest), left), right));[m
[31m-    emit_tab(as, PPCI_ADD, dest, tmp2, right);[m
[31m-    emit_asb(as, ismax ? PPCI_ANDC : PPCI_AND, tmp2, tmp2, tmp1);[m
[31m-    emit_tab(as, PPCI_SUBFE, tmp1, tmp1, tmp1);[m
[31m-    emit_tab(as, PPCI_SUBFC, tmp2, tmp2, tmp1);[m
[31m-    emit_asi(as, PPCI_XORIS, tmp2, right, 0x8000);[m
[31m-    emit_asi(as, PPCI_XORIS, tmp1, left, 0x8000);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_min(as, ir)		asm_min_max(as, ir, 0)[m
[31m-#define asm_max(as, ir)		asm_min_max(as, ir, 1)[m
[31m-[m
[31m-/* -- Comparisons --------------------------------------------------------- */[m
[31m-[m
[31m-#define CC_UNSIGNED	0x08	/* Unsigned integer comparison. */[m
[31m-#define CC_TWO		0x80	/* Check two flags for FP comparison. */[m
[31m-[m
[31m-/* Map of comparisons to flags. ORDER IR. */[m
[31m-static const uint8_t asm_compmap[IR_ABC+1] = {[m
[31m-  /* op     int cc                 FP cc */[m
[31m-  /* LT  */ CC_GE               + (CC_GE<<4),[m
[31m-  /* GE  */ CC_LT               + (CC_LE<<4) + CC_TWO,[m
[31m-  /* LE  */ CC_GT               + (CC_GE<<4) + CC_TWO,[m
[31m-  /* GT  */ CC_LE               + (CC_LE<<4),[m
[31m-  /* ULT */ CC_GE + CC_UNSIGNED + (CC_GT<<4) + CC_TWO,[m
[31m-  /* UGE */ CC_LT + CC_UNSIGNED + (CC_LT<<4),[m
[31m-  /* ULE */ CC_GT + CC_UNSIGNED + (CC_GT<<4),[m
[31m-  /* UGT */ CC_LE + CC_UNSIGNED + (CC_LT<<4) + CC_TWO,[m
[31m-  /* EQ  */ CC_NE               + (CC_NE<<4),[m
[31m-  /* NE  */ CC_EQ               + (CC_EQ<<4),[m
[31m-  /* ABC */ CC_LE + CC_UNSIGNED + (CC_LT<<4) + CC_TWO  /* Same as UGT. */[m
[31m-};[m
[31m-[m
[31m-static void asm_intcomp_(ASMState *as, IRRef lref, IRRef rref, Reg cr, PPCCC cc)[m
[31m-{[m
[31m-  Reg right, left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-  if (irref_isk(rref)) {[m
[31m-    int32_t k = IR(rref)->i;[m
[31m-    if ((cc & CC_UNSIGNED) == 0) {  /* Signed comparison with constant. */[m
[31m-      if (checki16(k)) {[m
[31m-	emit_tai(as, PPCI_CMPWI, cr, left, k);[m
[31m-	/* Signed comparison with zero and referencing previous ins? */[m
[31m-	if (k == 0 && lref == as->curins-1)[m
[31m-	  as->flagmcp = as->mcp;  /* Allow elimination of the compare. */[m
[31m-	return;[m
[31m-      } else if ((cc & 3) == (CC_EQ & 3)) {  /* Use CMPLWI for EQ or NE. */[m
[31m-	if (checku16(k)) {[m
[31m-	  emit_tai(as, PPCI_CMPLWI, cr, left, k);[m
[31m-	  return;[m
[31m-	} else if (!as->sectref && ra_noreg(IR(rref)->r)) {[m
[31m-	  emit_tai(as, PPCI_CMPLWI, cr, RID_TMP, k);[m
[31m-	  emit_asi(as, PPCI_XORIS, RID_TMP, left, (k >> 16));[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {  /* Unsigned comparison with constant. */[m
[31m-      if (checku16(k)) {[m
[31m-	emit_tai(as, PPCI_CMPLWI, cr, left, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  right = ra_alloc1(as, rref, rset_exclude(RSET_GPR, left));[m
[31m-  emit_tab(as, (cc & CC_UNSIGNED) ? PPCI_CMPLW : PPCI_CMPW, cr, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  PPCCC cc = asm_compmap[ir->o];[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    asm_guardcc(as, (cc >> 4));[m
[31m-    if ((cc & CC_TWO))[m
[31m-      emit_tab(as, PPCI_CROR, ((cc>>4)&3), ((cc>>4)&3), (CC_EQ&3));[m
[31m-    emit_fab(as, PPCI_FCMPU, 0, left, right);[m
[31m-  } else {[m
[31m-    IRRef lref = ir->op1, rref = ir->op2;[m
[31m-    if (irref_isk(lref) && !irref_isk(rref)) {[m
[31m-      /* Swap constants to the right (only for ABC). */[m
[31m-      IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-      if ((cc & 2) == 0) cc ^= 1;  /* LT <-> GT, LE <-> GE */[m
[31m-    }[m
[31m-    asm_guardcc(as, cc);[m
[31m-    asm_intcomp_(as, lref, rref, 0, cc);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_equal(as, ir)	asm_comp(as, ir)[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* 64 bit integer comparisons. */[m
[31m-static void asm_comp64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  PPCCC cc = asm_compmap[(ir-1)->o];[m
[31m-  if ((cc&3) == (CC_EQ&3)) {[m
[31m-    asm_guardcc(as, cc);[m
[31m-    emit_tab(as, (cc&4) ? PPCI_CRAND : PPCI_CROR,[m
[31m-	     (CC_EQ&3), (CC_EQ&3), 4+(CC_EQ&3));[m
[31m-  } else {[m
[31m-    asm_guardcc(as, CC_EQ);[m
[31m-    emit_tab(as, PPCI_CROR, (CC_EQ&3), (CC_EQ&3), ((cc^~(cc>>2))&1));[m
[31m-    emit_tab(as, (cc&4) ? PPCI_CRAND : PPCI_CRANDC,[m
[31m-	     (CC_EQ&3), (CC_EQ&3), 4+(cc&3));[m
[31m-  }[m
[31m-  /* Loword comparison sets cr1 and is unsigned, except for equality. */[m
[31m-  asm_intcomp_(as, (ir-1)->op1, (ir-1)->op2, 4,[m
[31m-	       cc | ((cc&3) == (CC_EQ&3) ? 0 : CC_UNSIGNED));[m
[31m-  /* Hiword comparison sets cr0. */[m
[31m-  asm_intcomp_(as, ir->op1, ir->op2, 0, cc);[m
[31m-  as->flagmcp = NULL;  /* Doesn't work here. */[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */[m
[31m-[m
[31m-/* Hiword op of a split 64 bit op. Previous op must be the loword op. */[m
[31m-static void asm_hiop(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  /* HIOP is marked as a store because it needs its own DCE logic. */[m
[31m-  int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */[m
[31m-  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;[m
[31m-  if ((ir-1)->o == IR_CONV) {  /* Conversions to/from 64 bit. */[m
[31m-    as->curins--;  /* Always skip the CONV. */[m
[31m-    if (usehi || uselo)[m
[31m-      asm_conv64(as, ir);[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o <= IR_NE) {  /* 64 bit integer comparisons. ORDER IR. */[m
[31m-    as->curins--;  /* Always skip the loword comparison. */[m
[31m-    asm_comp64(as, ir);[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o == IR_XSTORE) {[m
[31m-    as->curins--;  /* Handle both stores here. */[m
[31m-    if ((ir-1)->r != RID_SINK) {[m
[31m-      asm_xstore_(as, ir, 0);[m
[31m-      asm_xstore_(as, ir-1, 4);[m
[31m-    }[m
[31m-    return;[m
[31m-  }[m
[31m-  if (!usehi) return;  /* Skip unused hiword op for all remaining ops. */[m
[31m-  switch ((ir-1)->o) {[m
[31m-  case IR_ADD: as->curins--; asm_add64(as, ir); break;[m
[31m-  case IR_SUB: as->curins--; asm_sub64(as, ir); break;[m
[31m-  case IR_NEG: as->curins--; asm_neg64(as, ir); break;[m
[31m-  case IR_CALLN:[m
[31m-  case IR_CALLXS:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RID2RSET(RID_RETLO));  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-  case IR_CNEWI:[m
[31m-    /* Nothing to do here. Handled by lo op itself. */[m
[31m-    break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(as); UNUSED(ir); lua_assert(0);  /* Unused without FFI. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_prof(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_asi(as, PPCI_ANDIDOT, RID_TMP, RID_TMP, HOOK_PROFILE);[m
[31m-  emit_lsglptr(as, PPCI_LBZ, RID_TMP,[m
[31m-	       (int32_t)offsetof(global_State, hookmask));[m
[31m-}[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check Lua stack size for overflow. Use exit handler as fallback. */[m
[31m-static void asm_stack_check(ASMState *as, BCReg topslot,[m
[31m-			    IRIns *irp, RegSet allow, ExitNo exitno)[m
[31m-{[m
[31m-  /* Try to get an unused temp. register, otherwise spill/restore RID_RET*. */[m
[31m-  Reg tmp, pbase = irp ? (ra_hasreg(irp->r) ? irp->r : RID_TMP) : RID_BASE;[m
[31m-  rset_clear(allow, pbase);[m
[31m-  tmp = allow ? rset_pickbot(allow) :[m
[31m-		(pbase == RID_RETHI ? RID_RETLO : RID_RETHI);[m
[31m-  emit_condbranch(as, PPCI_BC, CC_LT, asm_exitstub_addr(as, exitno));[m
[31m-  if (allow == RSET_EMPTY)  /* Restore temp. register. */[m
[31m-    emit_tai(as, PPCI_LWZ, tmp, RID_SP, SPOFS_TMPW);[m
[31m-  else[m
[31m-    ra_modified(as, tmp);[m
[31m-  emit_ai(as, PPCI_CMPLWI, RID_TMP, (int32_t)(8*topslot));[m
[31m-  emit_tab(as, PPCI_SUBF, RID_TMP, pbase, tmp);[m
[31m-  emit_tai(as, PPCI_LWZ, tmp, tmp, offsetof(lua_State, maxstack));[m
[31m-  if (pbase == RID_TMP)[m
[31m-    emit_getgl(as, RID_TMP, jit_base);[m
[31m-  emit_getgl(as, tmp, cur_L);[m
[31m-  if (allow == RSET_EMPTY)  /* Spill temp. register. */[m
[31m-    emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPW);[m
[31m-}[m
[31m-[m
[31m-/* Restore Lua stack from on-trace state. */[m
[31m-static void asm_stack_restore(ASMState *as, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  /* Store the value of all modified slots to the Lua stack. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    int32_t ofs = 8*((int32_t)s-1);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if ((sn & SNAP_NORESTORE))[m
[31m-      continue;[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-      emit_fai(as, PPCI_STFD, src, RID_BASE, ofs);[m
[31m-    } else {[m
[31m-      Reg type;[m
[31m-      RegSet allow = rset_exclude(RSET_GPR, RID_BASE);[m
[31m-      lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));[m
[31m-      if (!irt_ispri(ir->t)) {[m
[31m-	Reg src = ra_alloc1(as, ref, allow);[m
[31m-	rset_clear(allow, src);[m
[31m-	emit_tai(as, PPCI_STW, src, RID_BASE, ofs+4);[m
[31m-      }[m
[31m-      if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	if (s == 0) continue;  /* Do not overwrite link to previous frame. */[m
[31m-	type = ra_allock(as, (int32_t)(*flinks--), allow);[m
[31m-      } else {[m
[31m-	type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-      }[m
[31m-      emit_tai(as, PPCI_STW, type, RID_BASE, ofs);[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-}[m
[31m-[m
[31m-/* -- GC handling --------------------------------------------------------- */[m
[31m-[m
[31m-/* Check GC threshold and do one or more GC steps. */[m
[31m-static void asm_gc_check(ASMState *as)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg tmp;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */[m
[31m-  asm_guardcc(as, CC_NE);  /* Assumes asm_snap_prep() already done. */[m
[31m-  emit_ai(as, PPCI_CMPWI, RID_RET, 0);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ASMREF_TMP2;  /* MSize steps     */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);[m
[31m-  tmp = ra_releasetmp(as, ASMREF_TMP2);[m
[31m-  emit_loadi(as, tmp, as->gcsteps);[m
[31m-  /* Jump around GC step if GC total < GC threshold. */[m
[31m-  emit_condbranch(as, PPCI_BC|PPCF_Y, CC_LT, l_end);[m
[31m-  emit_ab(as, PPCI_CMPLW, RID_TMP, tmp);[m
[31m-  emit_getgl(as, tmp, gc.threshold);[m
[31m-  emit_getgl(as, RID_TMP, gc.total);[m
[31m-  as->gcsteps = 0;[m
[31m-  checkmclim(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Loop handling ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the loop branch. */[m
[31m-static void asm_loop_fixup(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target = as->mcp;[m
[31m-  if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-    /* asm_guardcc already inverted the cond branch and patched the final b. */[m
[31m-    p[-2] = (p[-2] & (0xffff0000u & ~PPCF_Y)) | (((target-p+2) & 0x3fffu) << 2);[m
[31m-  } else {[m
[31m-    p[-1] = PPCI_B|(((target-p+1)&0x00ffffffu)<<2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Coalesce BASE register for a root trace. */[m
[31m-static void asm_head_root_base(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (r != RID_BASE)[m
[31m-      emit_mr(as, r, RID_BASE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Coalesce BASE register for a side trace. */[m
[31m-static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (irp->r == r) {[m
[31m-      rset_clear(allow, r);  /* Mark same BASE register as coalesced. */[m
[31m-    } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) {[m
[31m-      rset_clear(allow, irp->r);[m
[31m-      emit_mr(as, r, irp->r);  /* Move from coalesced parent reg. */[m
[31m-    } else {[m
[31m-      emit_getgl(as, r, jit_base);  /* Otherwise reload BASE. */[m
[31m-    }[m
[31m-  }[m
[31m-  return allow;[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the tail code. */[m
[31m-static void asm_tail_fixup(ASMState *as, TraceNo lnk)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target;[m
[31m-  int32_t spadj = as->T->spadjust;[m
[31m-  if (spadj == 0) {[m
[31m-    *--p = PPCI_NOP;[m
[31m-    *--p = PPCI_NOP;[m
[31m-    as->mctop = p;[m
[31m-  } else {[m
[31m-    /* Patch stack adjustment. */[m
[31m-    lua_assert(checki16(CFRAME_SIZE+spadj));[m
[31m-    p[-3] = PPCI_ADDI | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | (CFRAME_SIZE+spadj);[m
[31m-    p[-2] = PPCI_STWU | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | spadj;[m
[31m-  }[m
[31m-  /* Patch exit branch. */[m
[31m-  target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;[m
[31m-  p[-1] = PPCI_B|(((target-p+1)&0x00ffffffu)<<2);[m
[31m-}[m
[31m-[m
[31m-/* Prepare tail of code. */[m
[31m-static void asm_tail_prep(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop - 1;  /* Leave room for exit branch. */[m
[31m-  if (as->loopref) {[m
[31m-    as->invmcp = as->mcp = p;[m
[31m-  } else {[m
[31m-    as->mcp = p-2;  /* Leave room for stack pointer adjustment. */[m
[31m-    as->invmcp = NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Ensure there are enough stack slots for call arguments. */[m
[31m-static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  uint32_t i, nargs = CCI_XNARGS(ci);[m
[31m-  int nslots = 2, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  for (i = 0; i < nargs; i++)[m
[31m-    if (args[i] && irt_isfp(IR(args[i])->t)) {[m
[31m-      if (nfpr > 0) nfpr--; else nslots = (nslots+3) & ~1;[m
[31m-    } else {[m
[31m-      if (ngpr > 0) ngpr--; else nslots++;[m
[31m-    }[m
[31m-  if (nslots > as->evenspill)  /* Leave room for args in stack slots. */[m
[31m-    as->evenspill = nslots;[m
[31m-  return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET);[m
[31m-}[m
[31m-[m
[31m-static void asm_setup_target(ASMState *as)[m
[31m-{[m
[31m-  asm_exitstub_setup(as, as->T->nsnap + (as->parent ? 1 : 0));[m
[31m-}[m
[31m-[m
[31m-/* -- Trace patching ------------------------------------------------------ */[m
[31m-[m
[31m-/* Patch exit jumps of existing machine code to a new target. */[m
[31m-void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)[m
[31m-{[m
[31m-  MCode *p = T->mcode;[m
[31m-  MCode *pe = (MCode *)((char *)p + T->szmcode);[m
[31m-  MCode *px = exitstub_trace_addr(T, exitno);[m
[31m-  MCode *cstart = NULL;[m
[31m-  MCode *mcarea = lj_mcode_patch(J, p, 0);[m
[31m-  int clearso = 0;[m
[31m-  for (; p < pe; p++) {[m
[31m-    /* Look for exitstub branch, try to replace with branch to target. */[m
[31m-    uint32_t ins = *p;[m
[31m-    if ((ins & 0xfc000000u) == 0x40000000u &&[m
[31m-	((ins ^ ((char *)px-(char *)p)) & 0xffffu) == 0) {[m
[31m-      ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-      if (((ins >> 16) & 3) == (CC_SO&3)) {[m
[31m-	clearso = sizeof(MCode);[m
[31m-	delta -= sizeof(MCode);[m
[31m-      }[m
[31m-      /* Many, but not all short-range branches can be patched directly. */[m
[31m-      if (((delta + 0x8000) >> 16) == 0) {[m
[31m-	*p = (ins & 0xffdf0000u) | ((uint32_t)delta & 0xffffu) |[m
[31m-	     ((delta & 0x8000) * (PPCF_Y/0x8000));[m
[31m-	if (!cstart) cstart = p;[m
[31m-      }[m
[31m-    } else if ((ins & 0xfc000000u) == PPCI_B &&[m
[31m-	       ((ins ^ ((char *)px-(char *)p)) & 0x03ffffffu) == 0) {[m
[31m-      ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-      lua_assert(((delta + 0x02000000) >> 26) == 0);[m
[31m-      *p = PPCI_B | ((uint32_t)delta & 0x03ffffffu);[m
[31m-      if (!cstart) cstart = p;[m
[31m-    }[m
[31m-  }[m
[31m-  {  /* Always patch long-range branch in exit stub itself. */[m
[31m-    ptrdiff_t delta = (char *)target - (char *)px - clearso;[m
[31m-    lua_assert(((delta + 0x02000000) >> 26) == 0);[m
[31m-    *px = PPCI_B | ((uint32_t)delta & 0x03ffffffu);[m
[31m-  }[m
[31m-  if (!cstart) cstart = px;[m
[31m-  lj_mcode_sync(cstart, px+1);[m
[31m-  if (clearso) {  /* Extend the current trace. Ugly workaround. */[m
[31m-    MCode *pp = J->cur.mcode;[m
[31m-    J->cur.szmcode += sizeof(MCode);[m
[31m-    *--pp = PPCI_MCRXR;  /* Clear SO flag. */[m
[31m-    J->cur.mcode = pp;[m
[31m-    lj_mcode_sync(pp, pp+1);[m
[31m-  }[m
[31m-  lj_mcode_patch(J, mcarea, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_x86.h[m
[1mdeleted file mode 100644[m
[1mindex 651d703..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_asm_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,2745 +0,0 @@[m
[31m-/*[m
[31m-** x86/x64 IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Guard handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Generate an exit stub group at the bottom of the reserved MCode memory. */[m
[31m-static MCode *asm_exitstub_gen(ASMState *as, ExitNo group)[m
[31m-{[m
[31m-  ExitNo i, groupofs = (group*EXITSTUBS_PER_GROUP) & 0xff;[m
[31m-  MCode *mxp = as->mcbot;[m
[31m-  MCode *mxpstart = mxp;[m
[31m-  if (mxp + (2+2)*EXITSTUBS_PER_GROUP+8+5 >= as->mctop)[m
[31m-    asm_mclimit(as);[m
[31m-  /* Push low byte of exitno for each exit stub. */[m
[31m-  *mxp++ = XI_PUSHi8; *mxp++ = (MCode)groupofs;[m
[31m-  for (i = 1; i < EXITSTUBS_PER_GROUP; i++) {[m
[31m-    *mxp++ = XI_JMPs; *mxp++ = (MCode)((2+2)*(EXITSTUBS_PER_GROUP - i) - 2);[m
[31m-    *mxp++ = XI_PUSHi8; *mxp++ = (MCode)(groupofs + i);[m
[31m-  }[m
[31m-  /* Push the high byte of the exitno for each exit stub group. */[m
[31m-  *mxp++ = XI_PUSHi8; *mxp++ = (MCode)((group*EXITSTUBS_PER_GROUP)>>8);[m
[31m-  /* Store DISPATCH at original stack slot 0. Account for the two push ops. */[m
[31m-  *mxp++ = XI_MOVmi;[m
[31m-  *mxp++ = MODRM(XM_OFS8, 0, RID_ESP);[m
[31m-  *mxp++ = MODRM(XM_SCALE1, RID_ESP, RID_ESP);[m
[31m-  *mxp++ = 2*sizeof(void *);[m
[31m-  *(int32_t *)mxp = ptr2addr(J2GG(as->J)->dispatch); mxp += 4;[m
[31m-  /* Jump to exit handler which fills in the ExitState. */[m
[31m-  *mxp++ = XI_JMP; mxp += 4;[m
[31m-  *((int32_t *)(mxp-4)) = jmprel(mxp, (MCode *)(void *)lj_vm_exit_handler);[m
[31m-  /* Commit the code for this group (even if assembly fails later on). */[m
[31m-  lj_mcode_commitbot(as->J, mxp);[m
[31m-  as->mcbot = mxp;[m
[31m-  as->mclim = as->mcbot + MCLIM_REDZONE;[m
[31m-  return mxpstart;[m
[31m-}[m
[31m-[m
[31m-/* Setup all needed exit stubs. */[m
[31m-static void asm_exitstub_setup(ASMState *as, ExitNo nexits)[m
[31m-{[m
[31m-  ExitNo i;[m
[31m-  if (nexits >= EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR)[m
[31m-    lj_trace_err(as->J, LJ_TRERR_SNAPOV);[m
[31m-  for (i = 0; i < (nexits+EXITSTUBS_PER_GROUP-1)/EXITSTUBS_PER_GROUP; i++)[m
[31m-    if (as->J->exitstubgroup[i] == NULL)[m
[31m-      as->J->exitstubgroup[i] = asm_exitstub_gen(as, i);[m
[31m-}[m
[31m-[m
[31m-/* Emit conditional branch to exit for guard.[m
[31m-** It's important to emit this *after* all registers have been allocated,[m
[31m-** because rematerializations may invalidate the flags.[m
[31m-*/[m
[31m-static void asm_guardcc(ASMState *as, int cc)[m
[31m-{[m
[31m-  MCode *target = exitstub_addr(as->J, as->snapno);[m
[31m-  MCode *p = as->mcp;[m
[31m-  if (LJ_UNLIKELY(p == as->invmcp)) {[m
[31m-    as->loopinv = 1;[m
[31m-    *(int32_t *)(p+1) = jmprel(p+5, target);[m
[31m-    target = p;[m
[31m-    cc ^= 1;[m
[31m-    if (as->realign) {[m
[31m-      emit_sjcc(as, cc, target);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  emit_jcc(as, cc, target);[m
[31m-}[m
[31m-[m
[31m-/* -- Memory operand fusion ----------------------------------------------- */[m
[31m-[m
[31m-/* Limit linear search to this distance. Avoids O(n^2) behavior. */[m
[31m-#define CONFLICT_SEARCH_LIM	31[m
[31m-[m
[31m-/* Check if a reference is a signed 32 bit constant. */[m
[31m-static int asm_isk32(ASMState *as, IRRef ref, int32_t *k)[m
[31m-{[m
[31m-  if (irref_isk(ref)) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (ir->o != IR_KINT64) {[m
[31m-      *k = ir->i;[m
[31m-      return 1;[m
[31m-    } else if (checki32((int64_t)ir_kint64(ir)->u64)) {[m
[31m-      *k = (int32_t)ir_kint64(ir)->u64;[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check if there's no conflicting instruction between curins and ref.[m
[31m-** Also avoid fusing loads if there are multiple references.[m
[31m-*/[m
[31m-static int noconflict(ASMState *as, IRRef ref, IROp conflict, int noload)[m
[31m-{[m
[31m-  IRIns *ir = as->ir;[m
[31m-  IRRef i = as->curins;[m
[31m-  if (i > ref + CONFLICT_SEARCH_LIM)[m
[31m-    return 0;  /* Give up, ref is too far away. */[m
[31m-  while (--i > ref) {[m
[31m-    if (ir[i].o == conflict)[m
[31m-      return 0;  /* Conflict found. */[m
[31m-    else if (!noload && (ir[i].op1 == ref || ir[i].op2 == ref))[m
[31m-      return 0;[m
[31m-  }[m
[31m-  return 1;  /* Ok, no conflict. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse array base into memory operand. */[m
[31m-static IRRef asm_fuseabase(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *irb = IR(ref);[m
[31m-  as->mrm.ofs = 0;[m
[31m-  if (irb->o == IR_FLOAD) {[m
[31m-    IRIns *ira = IR(irb->op1);[m
[31m-    lua_assert(irb->op2 == IRFL_TAB_ARRAY);[m
[31m-    /* We can avoid the FLOAD of t->array for colocated arrays. */[m
[31m-    if (ira->o == IR_TNEW && ira->op1 <= LJ_MAX_COLOSIZE &&[m
[31m-	!neverfuse(as) && noconflict(as, irb->op1, IR_NEWREF, 1)) {[m
[31m-      as->mrm.ofs = (int32_t)sizeof(GCtab);  /* Ofs to colocated array. */[m
[31m-      return irb->op1;  /* Table obj. */[m
[31m-    }[m
[31m-  } else if (irb->o == IR_ADD && irref_isk(irb->op2)) {[m
[31m-    /* Fuse base offset (vararg load). */[m
[31m-    as->mrm.ofs = IR(irb->op2)->i;[m
[31m-    return irb->op1;[m
[31m-  }[m
[31m-  return ref;  /* Otherwise use the given array base. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse array reference into memory operand. */[m
[31m-static void asm_fusearef(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irx;[m
[31m-  lua_assert(ir->o == IR_AREF);[m
[31m-  as->mrm.base = (uint8_t)ra_alloc1(as, asm_fuseabase(as, ir->op1), allow);[m
[31m-  irx = IR(ir->op2);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    as->mrm.ofs += 8*irx->i;[m
[31m-    as->mrm.idx = RID_NONE;[m
[31m-  } else {[m
[31m-    rset_clear(allow, as->mrm.base);[m
[31m-    as->mrm.scale = XM_SCALE8;[m
[31m-    /* Fuse a constant ADD (e.g. t[i+1]) into the offset.[m
[31m-    ** Doesn't help much without ABCelim, but reduces register pressure.[m
[31m-    */[m
[31m-    if (!LJ_64 &&  /* Has bad effects with negative index on x64. */[m
[31m-	mayfuse(as, ir->op2) && ra_noreg(irx->r) &&[m
[31m-	irx->o == IR_ADD && irref_isk(irx->op2)) {[m
[31m-      as->mrm.ofs += 8*IR(irx->op2)->i;[m
[31m-      as->mrm.idx = (uint8_t)ra_alloc1(as, irx->op1, allow);[m
[31m-    } else {[m
[31m-      as->mrm.idx = (uint8_t)ra_alloc1(as, ir->op2, allow);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fuse array/hash/upvalue reference into memory operand.[m
[31m-** Caveat: this may allocate GPRs for the base/idx registers. Be sure to[m
[31m-** pass the final allow mask, excluding any GPRs used for other inputs.[m
[31m-** In particular: 2-operand GPR instructions need to call ra_dest() first![m
[31m-*/[m
[31m-static void asm_fuseahuref(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r)) {[m
[31m-    switch ((IROp)ir->o) {[m
[31m-    case IR_AREF:[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	asm_fusearef(as, ir, allow);[m
[31m-	return;[m
[31m-      }[m
[31m-      break;[m
[31m-    case IR_HREFK:[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	as->mrm.base = (uint8_t)ra_alloc1(as, ir->op1, allow);[m
[31m-	as->mrm.ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node));[m
[31m-	as->mrm.idx = RID_NONE;[m
[31m-	return;[m
[31m-      }[m
[31m-      break;[m
[31m-    case IR_UREFC:[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-	GCupval *uv = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv;[m
[31m-	as->mrm.ofs = ptr2addr(&uv->tv);[m
[31m-	as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-	return;[m
[31m-      }[m
[31m-      break;[m
[31m-    default:[m
[31m-      lua_assert(ir->o == IR_HREF || ir->o == IR_NEWREF || ir->o == IR_UREFO ||[m
[31m-		 ir->o == IR_KKPTR);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  as->mrm.base = (uint8_t)ra_alloc1(as, ref, allow);[m
[31m-  as->mrm.ofs = 0;[m
[31m-  as->mrm.idx = RID_NONE;[m
[31m-}[m
[31m-[m
[31m-/* Fuse FLOAD/FREF reference into memory operand. */[m
[31m-static void asm_fusefref(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  lua_assert(ir->o == IR_FLOAD || ir->o == IR_FREF);[m
[31m-  as->mrm.ofs = field_ofs[ir->op2];[m
[31m-  as->mrm.idx = RID_NONE;[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    as->mrm.ofs += IR(ir->op1)->i;[m
[31m-    as->mrm.base = RID_NONE;[m
[31m-  } else {[m
[31m-    as->mrm.base = (uint8_t)ra_alloc1(as, ir->op1, allow);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fuse string reference into memory operand. */[m
[31m-static void asm_fusestrref(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irr;[m
[31m-  lua_assert(ir->o == IR_STRREF);[m
[31m-  as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-  as->mrm.scale = XM_SCALE1;[m
[31m-  as->mrm.ofs = sizeof(GCstr);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    as->mrm.ofs += IR(ir->op1)->i;[m
[31m-  } else {[m
[31m-    Reg r = ra_alloc1(as, ir->op1, allow);[m
[31m-    rset_clear(allow, r);[m
[31m-    as->mrm.base = (uint8_t)r;[m
[31m-  }[m
[31m-  irr = IR(ir->op2);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    as->mrm.ofs += irr->i;[m
[31m-  } else {[m
[31m-    Reg r;[m
[31m-    /* Fuse a constant add into the offset, e.g. string.sub(s, i+10). */[m
[31m-    if (!LJ_64 &&  /* Has bad effects with negative index on x64. */[m
[31m-	mayfuse(as, ir->op2) && irr->o == IR_ADD && irref_isk(irr->op2)) {[m
[31m-      as->mrm.ofs += IR(irr->op2)->i;[m
[31m-      r = ra_alloc1(as, irr->op1, allow);[m
[31m-    } else {[m
[31m-      r = ra_alloc1(as, ir->op2, allow);[m
[31m-    }[m
[31m-    if (as->mrm.base == RID_NONE)[m
[31m-      as->mrm.base = (uint8_t)r;[m
[31m-    else[m
[31m-      as->mrm.idx = (uint8_t)r;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fusexref(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  as->mrm.idx = RID_NONE;[m
[31m-  if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {[m
[31m-    as->mrm.ofs = ir->i;[m
[31m-    as->mrm.base = RID_NONE;[m
[31m-  } else if (ir->o == IR_STRREF) {[m
[31m-    asm_fusestrref(as, ir, allow);[m
[31m-  } else {[m
[31m-    as->mrm.ofs = 0;[m
[31m-    if (canfuse(as, ir) && ir->o == IR_ADD && ra_noreg(ir->r)) {[m
[31m-      /* Gather (base+idx*sz)+ofs as emitted by cdata ptr/array indexing. */[m
[31m-      IRIns *irx;[m
[31m-      IRRef idx;[m
[31m-      Reg r;[m
[31m-      if (asm_isk32(as, ir->op2, &as->mrm.ofs)) {  /* Recognize x+ofs. */[m
[31m-	ref = ir->op1;[m
[31m-	ir = IR(ref);[m
[31m-	if (!(ir->o == IR_ADD && canfuse(as, ir) && ra_noreg(ir->r)))[m
[31m-	  goto noadd;[m
[31m-      }[m
[31m-      as->mrm.scale = XM_SCALE1;[m
[31m-      idx = ir->op1;[m
[31m-      ref = ir->op2;[m
[31m-      irx = IR(idx);[m
[31m-      if (!(irx->o == IR_BSHL || irx->o == IR_ADD)) {  /* Try other operand. */[m
[31m-	idx = ir->op2;[m
[31m-	ref = ir->op1;[m
[31m-	irx = IR(idx);[m
[31m-      }[m
[31m-      if (canfuse(as, irx) && ra_noreg(irx->r)) {[m
[31m-	if (irx->o == IR_BSHL && irref_isk(irx->op2) && IR(irx->op2)->i <= 3) {[m
[31m-	  /* Recognize idx<<b with b = 0-3, corresponding to sz = (1),2,4,8. */[m
[31m-	  idx = irx->op1;[m
[31m-	  as->mrm.scale = (uint8_t)(IR(irx->op2)->i << 6);[m
[31m-	} else if (irx->o == IR_ADD && irx->op1 == irx->op2) {[m
[31m-	  /* FOLD does idx*2 ==> idx<<1 ==> idx+idx. */[m
[31m-	  idx = irx->op1;[m
[31m-	  as->mrm.scale = XM_SCALE2;[m
[31m-	}[m
[31m-      }[m
[31m-      r = ra_alloc1(as, idx, allow);[m
[31m-      rset_clear(allow, r);[m
[31m-      as->mrm.idx = (uint8_t)r;[m
[31m-    }[m
[31m-  noadd:[m
[31m-    as->mrm.base = (uint8_t)ra_alloc1(as, ref, allow);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fuse load into memory operand. */[m
[31m-static Reg asm_fuseload(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_hasreg(ir->r)) {[m
[31m-    if (allow != RSET_EMPTY) {  /* Fast path. */[m
[31m-      ra_noweak(as, ir->r);[m
[31m-      return ir->r;[m
[31m-    }[m
[31m-  fusespill:[m
[31m-    /* Force a spill if only memory operands are allowed (asm_x87load). */[m
[31m-    as->mrm.base = RID_ESP;[m
[31m-    as->mrm.ofs = ra_spill(as, ir);[m
[31m-    as->mrm.idx = RID_NONE;[m
[31m-    return RID_MRM;[m
[31m-  }[m
[31m-  if (ir->o == IR_KNUM) {[m
[31m-    RegSet avail = as->freeset & ~as->modset & RSET_FPR;[m
[31m-    lua_assert(allow != RSET_EMPTY);[m
[31m-    if (!(avail & (avail-1))) {  /* Fuse if less than two regs available. */[m
[31m-      as->mrm.ofs = ptr2addr(ir_knum(ir));[m
[31m-      as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-      return RID_MRM;[m
[31m-    }[m
[31m-  } else if (ir->o == IR_KINT64) {[m
[31m-    RegSet avail = as->freeset & ~as->modset & RSET_GPR;[m
[31m-    lua_assert(allow != RSET_EMPTY);[m
[31m-    if (!(avail & (avail-1))) {  /* Fuse if less than two regs available. */[m
[31m-      as->mrm.ofs = ptr2addr(ir_kint64(ir));[m
[31m-      as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-      return RID_MRM;[m
[31m-    }[m
[31m-  } else if (mayfuse(as, ref)) {[m
[31m-    RegSet xallow = (allow & RSET_GPR) ? allow : RSET_GPR;[m
[31m-    if (ir->o == IR_SLOAD) {[m
[31m-      if (!(ir->op2 & (IRSLOAD_PARENT|IRSLOAD_CONVERT)) &&[m
[31m-	  noconflict(as, ref, IR_RETF, 0)) {[m
[31m-	as->mrm.base = (uint8_t)ra_alloc1(as, REF_BASE, xallow);[m
[31m-	as->mrm.ofs = 8*((int32_t)ir->op1-1) + ((ir->op2&IRSLOAD_FRAME)?4:0);[m
[31m-	as->mrm.idx = RID_NONE;[m
[31m-	return RID_MRM;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_FLOAD) {[m
[31m-      /* Generic fusion is only ok for 32 bit operand (but see asm_comp). */[m
[31m-      if ((irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t)) &&[m
[31m-	  noconflict(as, ref, IR_FSTORE, 0)) {[m
[31m-	asm_fusefref(as, ir, xallow);[m
[31m-	return RID_MRM;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_ALOAD || ir->o == IR_HLOAD || ir->o == IR_ULOAD) {[m
[31m-      if (noconflict(as, ref, ir->o + IRDELTA_L2S, 0)) {[m
[31m-	asm_fuseahuref(as, ir->op1, xallow);[m
[31m-	return RID_MRM;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_XLOAD) {[m
[31m-      /* Generic fusion is not ok for 8/16 bit operands (but see asm_comp).[m
[31m-      ** Fusing unaligned memory operands is ok on x86 (except for SIMD types).[m
[31m-      */[m
[31m-      if ((!irt_typerange(ir->t, IRT_I8, IRT_U16)) &&[m
[31m-	  noconflict(as, ref, IR_XSTORE, 0)) {[m
[31m-	asm_fusexref(as, ir->op1, xallow);[m
[31m-	return RID_MRM;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_VLOAD) {[m
[31m-      asm_fuseahuref(as, ir->op1, xallow);[m
[31m-      return RID_MRM;[m
[31m-    }[m
[31m-  }[m
[31m-  if (!(as->freeset & allow) && !irref_isk(ref) &&[m
[31m-      (allow == RSET_EMPTY || ra_hasspill(ir->s) || iscrossref(as, ref)))[m
[31m-    goto fusespill;[m
[31m-  return ra_allocref(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-#if LJ_64[m
[31m-/* Don't fuse a 32 bit load into a 64 bit operation. */[m
[31m-static Reg asm_fuseloadm(ASMState *as, IRRef ref, RegSet allow, int is64)[m
[31m-{[m
[31m-  if (is64 && !irt_is64(IR(ref)->t))[m
[31m-    return ra_alloc1(as, ref, allow);[m
[31m-  return asm_fuseload(as, ref, allow);[m
[31m-}[m
[31m-#else[m
[31m-#define asm_fuseloadm(as, ref, allow, is64)  asm_fuseload(as, (ref), (allow))[m
[31m-#endif[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Count the required number of stack slots for a call. */[m
[31m-static int asm_count_call_slots(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t i, nargs = CCI_XNARGS(ci);[m
[31m-  int nslots = 0;[m
[31m-#if LJ_64[m
[31m-  if (LJ_ABI_WIN) {[m
[31m-    nslots = (int)(nargs*2);  /* Only matters for more than four args. */[m
[31m-  } else {[m
[31m-    int ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;[m
[31m-    for (i = 0; i < nargs; i++)[m
[31m-      if (args[i] && irt_isfp(IR(args[i])->t)) {[m
[31m-	if (nfpr > 0) nfpr--; else nslots += 2;[m
[31m-      } else {[m
[31m-	if (ngpr > 0) ngpr--; else nslots += 2;[m
[31m-      }[m
[31m-  }[m
[31m-#else[m
[31m-  int ngpr = 0;[m
[31m-  if ((ci->flags & CCI_CC_MASK) == CCI_CC_FASTCALL)[m
[31m-    ngpr = 2;[m
[31m-  else if ((ci->flags & CCI_CC_MASK) == CCI_CC_THISCALL)[m
[31m-    ngpr = 1;[m
[31m-  for (i = 0; i < nargs; i++)[m
[31m-    if (args[i] && irt_isfp(IR(args[i])->t)) {[m
[31m-      nslots += irt_isnum(IR(args[i])->t) ? 2 : 1;[m
[31m-    } else {[m
[31m-      if (ngpr > 0) ngpr--; else nslots++;[m
[31m-    }[m
[31m-#endif[m
[31m-  return nslots;[m
[31m-}[m
[31m-[m
[31m-/* Generate a call to a C function. */[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n, nargs = CCI_XNARGS(ci);[m
[31m-  int32_t ofs = STACKARG_OFS;[m
[31m-#if LJ_64[m
[31m-  uint32_t gprs = REGARG_GPRS;[m
[31m-  Reg fpr = REGARG_FIRSTFPR;[m
[31m-#if !LJ_ABI_WIN[m
[31m-  MCode *patchnfpr = NULL;[m
[31m-#endif[m
[31m-#else[m
[31m-  uint32_t gprs = 0;[m
[31m-  if ((ci->flags & CCI_CC_MASK) != CCI_CC_CDECL) {[m
[31m-    if ((ci->flags & CCI_CC_MASK) == CCI_CC_THISCALL)[m
[31m-      gprs = (REGARG_GPRS & 31);[m
[31m-    else if ((ci->flags & CCI_CC_MASK) == CCI_CC_FASTCALL)[m
[31m-      gprs = REGARG_GPRS;[m
[31m-  }[m
[31m-#endif[m
[31m-  if ((void *)ci->func)[m
[31m-    emit_call(as, ci->func);[m
[31m-#if LJ_64[m
[31m-  if ((ci->flags & CCI_VARARG)) {  /* Special handling for vararg calls. */[m
[31m-#if LJ_ABI_WIN[m
[31m-    for (n = 0; n < 4 && n < nargs; n++) {[m
[31m-      IRIns *ir = IR(args[n]);[m
[31m-      if (irt_isfp(ir->t))  /* Duplicate FPRs in GPRs. */[m
[31m-	emit_rr(as, XO_MOVDto, (irt_isnum(ir->t) ? REX_64 : 0) | (fpr+n),[m
[31m-		((gprs >> (n*5)) & 31));  /* Either MOVD or MOVQ. */[m
[31m-    }[m
[31m-#else[m
[31m-    patchnfpr = --as->mcp;  /* Indicate number of used FPRs in register al. */[m
[31m-    *--as->mcp = XI_MOVrib | RID_EAX;[m
[31m-#endif[m
[31m-  }[m
[31m-#endif[m
[31m-  for (n = 0; n < nargs; n++) {  /* Setup args. */[m
[31m-    IRRef ref = args[n];[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    Reg r;[m
[31m-#if LJ_64 && LJ_ABI_WIN[m
[31m-    /* Windows/x64 argument registers are strictly positional. */[m
[31m-    r = irt_isfp(ir->t) ? (fpr <= REGARG_LASTFPR ? fpr : 0) : (gprs & 31);[m
[31m-    fpr++; gprs >>= 5;[m
[31m-#elif LJ_64[m
[31m-    /* POSIX/x64 argument registers are used in order of appearance. */[m
[31m-    if (irt_isfp(ir->t)) {[m
[31m-      r = fpr <= REGARG_LASTFPR ? fpr++ : 0;[m
[31m-    } else {[m
[31m-      r = gprs & 31; gprs >>= 5;[m
[31m-    }[m
[31m-#else[m
[31m-    if (ref && irt_isfp(ir->t)) {[m
[31m-      r = 0;[m
[31m-    } else {[m
[31m-      r = gprs & 31; gprs >>= 5;[m
[31m-      if (!ref) continue;[m
[31m-    }[m
[31m-#endif[m
[31m-    if (r) {  /* Argument is in a register. */[m
[31m-      if (r < RID_MAX_GPR && ref < ASMREF_TMP1) {[m
[31m-#if LJ_64[m
[31m-	if (ir->o == IR_KINT64)[m
[31m-	  emit_loadu64(as, r, ir_kint64(ir)->u64);[m
[31m-	else[m
[31m-#endif[m
[31m-	  emit_loadi(as, r, ir->i);[m
[31m-      } else {[m
[31m-	lua_assert(rset_test(as->freeset, r));  /* Must have been evicted. */[m
[31m-	if (ra_hasreg(ir->r)) {[m
[31m-	  ra_noweak(as, ir->r);[m
[31m-	  emit_movrr(as, ir, r, ir->r);[m
[31m-	} else {[m
[31m-	  ra_allocref(as, ref, RID2RSET(r));[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (irt_isfp(ir->t)) {  /* FP argument is on stack. */[m
[31m-      lua_assert(!(irt_isfloat(ir->t) && irref_isk(ref)));  /* No float k. */[m
[31m-      if (LJ_32 && (ofs & 4) && irref_isk(ref)) {[m
[31m-	/* Split stores for unaligned FP consts. */[m
[31m-	emit_movmroi(as, RID_ESP, ofs, (int32_t)ir_knum(ir)->u32.lo);[m
[31m-	emit_movmroi(as, RID_ESP, ofs+4, (int32_t)ir_knum(ir)->u32.hi);[m
[31m-      } else {[m
[31m-	r = ra_alloc1(as, ref, RSET_FPR);[m
[31m-	emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSDto : XO_MOVSSto,[m
[31m-		  r, RID_ESP, ofs);[m
[31m-      }[m
[31m-      ofs += (LJ_32 && irt_isfloat(ir->t)) ? 4 : 8;[m
[31m-    } else {  /* Non-FP argument is on stack. */[m
[31m-      if (LJ_32 && ref < ASMREF_TMP1) {[m
[31m-	emit_movmroi(as, RID_ESP, ofs, ir->i);[m
[31m-      } else {[m
[31m-	r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-	emit_movtomro(as, REX_64 + r, RID_ESP, ofs);[m
[31m-      }[m
[31m-      ofs += sizeof(intptr_t);[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-#if LJ_64 && !LJ_ABI_WIN[m
[31m-  if (patchnfpr) *patchnfpr = fpr - REGARG_FIRSTFPR;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Setup result reg/sp for call. Evict scratch regs. */[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  int hiop = (LJ_32 && (ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));[m
[31m-  if ((ci->flags & CCI_NOFPRCLOBBER))[m
[31m-    drop &= ~RSET_FPR;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  if (hiop && ra_hasreg((ir+1)->r))[m
[31m-    rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);  /* Evictions must be performed first. */[m
[31m-  if (ra_used(ir)) {[m
[31m-    if (irt_isfp(ir->t)) {[m
[31m-      int32_t ofs = sps_scale(ir->s);  /* Use spill slot or temp slots. */[m
[31m-#if LJ_64[m
[31m-      if ((ci->flags & CCI_CASTU64)) {[m
[31m-	Reg dest = ir->r;[m
[31m-	if (ra_hasreg(dest)) {[m
[31m-	  ra_free(as, dest);[m
[31m-	  ra_modified(as, dest);[m
[31m-	  emit_rr(as, XO_MOVD, dest|REX_64, RID_RET);  /* Really MOVQ. */[m
[31m-	}[m
[31m-	if (ofs) emit_movtomro(as, RID_RET|REX_64, RID_ESP, ofs);[m
[31m-      } else {[m
[31m-	ra_destreg(as, ir, RID_FPRET);[m
[31m-      }[m
[31m-#else[m
[31m-      /* Number result is in x87 st0 for x86 calling convention. */[m
[31m-      Reg dest = ir->r;[m
[31m-      if (ra_hasreg(dest)) {[m
[31m-	ra_free(as, dest);[m
[31m-	ra_modified(as, dest);[m
[31m-	emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSD : XO_MOVSS,[m
[31m-		  dest, RID_ESP, ofs);[m
[31m-      }[m
[31m-      if ((ci->flags & CCI_CASTU64)) {[m
[31m-	emit_movtomro(as, RID_RETLO, RID_ESP, ofs);[m
[31m-	emit_movtomro(as, RID_RETHI, RID_ESP, ofs+4);[m
[31m-      } else {[m
[31m-	emit_rmro(as, irt_isnum(ir->t) ? XO_FSTPq : XO_FSTPd,[m
[31m-		  irt_isnum(ir->t) ? XOg_FSTPq : XOg_FSTPd, RID_ESP, ofs);[m
[31m-      }[m
[31m-#endif[m
[31m-#if LJ_32[m
[31m-    } else if (hiop) {[m
[31m-      ra_destpair(as, ir);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      lua_assert(!irt_ispri(ir->t));[m
[31m-      ra_destreg(as, ir, RID_RET);[m
[31m-    }[m
[31m-  } else if (LJ_32 && irt_isfp(ir->t) && !(ci->flags & CCI_CASTU64)) {[m
[31m-    emit_x87op(as, XI_FPOP);  /* Pop unused result from x87 st0. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return a constant function pointer or NULL for indirect calls. */[m
[31m-static void *asm_callx_func(ASMState *as, IRIns *irf, IRRef func)[m
[31m-{[m
[31m-#if LJ_32[m
[31m-  UNUSED(as);[m
[31m-  if (irref_isk(func))[m
[31m-    return (void *)irf->i;[m
[31m-#else[m
[31m-  if (irref_isk(func)) {[m
[31m-    MCode *p;[m
[31m-    if (irf->o == IR_KINT64)[m
[31m-      p = (MCode *)(void *)ir_k64(irf)->u64;[m
[31m-    else[m
[31m-      p = (MCode *)(void *)(uintptr_t)(uint32_t)irf->i;[m
[31m-    if (p - as->mcp == (int32_t)(p - as->mcp))[m
[31m-      return p;  /* Call target is still in +-2GB range. */[m
[31m-    /* Avoid the indirect case of emit_call(). Try to hoist func addr. */[m
[31m-  }[m
[31m-#endif[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static void asm_callx(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  CCallInfo ci;[m
[31m-  IRRef func;[m
[31m-  IRIns *irf;[m
[31m-  int32_t spadj = 0;[m
[31m-  ci.flags = asm_callx_flags(as, ir);[m
[31m-  asm_collectargs(as, ir, &ci, args);[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-#if LJ_32[m
[31m-  /* Have to readjust stack after non-cdecl calls due to callee cleanup. */[m
[31m-  if ((ci.flags & CCI_CC_MASK) != CCI_CC_CDECL)[m
[31m-    spadj = 4 * asm_count_call_slots(as, &ci, args);[m
[31m-#endif[m
[31m-  func = ir->op2; irf = IR(func);[m
[31m-  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }[m
[31m-  ci.func = (ASMFunction)asm_callx_func(as, irf, func);[m
[31m-  if (!(void *)ci.func) {[m
[31m-    /* Use a (hoistable) non-scratch register for indirect calls. */[m
[31m-    RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-    Reg r = ra_alloc1(as, func, allow);[m
[31m-    if (LJ_32) emit_spsub(as, spadj);  /* Above code may cause restores! */[m
[31m-    emit_rr(as, XO_GROUP5, XOg_CALL, r);[m
[31m-  } else if (LJ_32) {[m
[31m-    emit_spsub(as, spadj);[m
[31m-  }[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-[m
[31m-/* -- Returns ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Return to lower frame. Guard that it goes to the right spot. */[m
[31m-static void asm_retf(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  void *pc = ir_kptr(IR(ir->op2));[m
[31m-  int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));[m
[31m-  as->topslot -= (BCReg)delta;[m
[31m-  if ((int32_t)as->topslot < 0) as->topslot = 0;[m
[31m-  irt_setmark(IR(REF_BASE)->t);  /* Children must not coalesce with BASE reg. */[m
[31m-  emit_setgl(as, base, jit_base);[m
[31m-  emit_addptr(as, base, -8*delta);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_gmroi(as, XG_ARITHi(XOg_CMP), base, -4, ptr2addr(pc));[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-static void asm_tointg(ASMState *as, IRIns *ir, Reg left)[m
[31m-{[m
[31m-  Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_guardcc(as, CC_P);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_rr(as, XO_UCOMISD, left, tmp);[m
[31m-  emit_rr(as, XO_CVTSI2SD, tmp, dest);[m
[31m-  emit_rr(as, XO_XORPS, tmp, tmp);  /* Avoid partial register stall. */[m
[31m-  emit_rr(as, XO_CVTTSD2SI, dest, left);[m
[31m-  /* Can't fuse since left is needed twice. */[m
[31m-}[m
[31m-[m
[31m-static void asm_tobit(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg tmp = ra_noreg(IR(ir->op1)->r) ?[m
[31m-	      ra_alloc1(as, ir->op1, RSET_FPR) :[m
[31m-	      ra_scratch(as, RSET_FPR);[m
[31m-  Reg right = asm_fuseload(as, ir->op2, rset_exclude(RSET_FPR, tmp));[m
[31m-  emit_rr(as, XO_MOVDto, tmp, dest);[m
[31m-  emit_mrm(as, XO_ADDSD, tmp, right);[m
[31m-  ra_left(as, tmp, ir->op1);[m
[31m-}[m
[31m-[m
[31m-static void asm_conv(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-  int st64 = (st == IRT_I64 || st == IRT_U64 || (LJ_64 && st == IRT_P64));[m
[31m-  int stfp = (st == IRT_NUM || st == IRT_FLOAT);[m
[31m-  IRRef lref = ir->op1;[m
[31m-  lua_assert(irt_type(ir->t) != st);[m
[31m-  lua_assert(!(LJ_32 && (irt_isint64(ir->t) || st64)));  /* Handled by SPLIT. */[m
[31m-  if (irt_isfp(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    if (stfp) {  /* FP to FP conversion. */[m
[31m-      Reg left = asm_fuseload(as, lref, RSET_FPR);[m
[31m-      emit_mrm(as, st == IRT_NUM ? XO_CVTSD2SS : XO_CVTSS2SD, dest, left);[m
[31m-      if (left == dest) return;  /* Avoid the XO_XORPS. */[m
[31m-    } else if (LJ_32 && st == IRT_U32) {  /* U32 to FP conversion on x86. */[m
[31m-      /* number = (2^52+2^51 .. u32) - (2^52+2^51) */[m
[31m-      cTValue *k = lj_ir_k64_find(as->J, U64x(43380000,00000000));[m
[31m-      Reg bias = ra_scratch(as, rset_exclude(RSET_FPR, dest));[m
[31m-      if (irt_isfloat(ir->t))[m
[31m-	emit_rr(as, XO_CVTSD2SS, dest, dest);[m
[31m-      emit_rr(as, XO_SUBSD, dest, bias);  /* Subtract 2^52+2^51 bias. */[m
[31m-      emit_rr(as, XO_XORPS, dest, bias);  /* Merge bias and integer. */[m
[31m-      emit_loadn(as, bias, k);[m
[31m-      emit_mrm(as, XO_MOVD, dest, asm_fuseload(as, lref, RSET_GPR));[m
[31m-      return;[m
[31m-    } else {  /* Integer to FP conversion. */[m
[31m-      Reg left = (LJ_64 && (st == IRT_U32 || st == IRT_U64)) ?[m
[31m-		 ra_alloc1(as, lref, RSET_GPR) :[m
[31m-		 asm_fuseloadm(as, lref, RSET_GPR, st64);[m
[31m-      if (LJ_64 && st == IRT_U64) {[m
[31m-	MCLabel l_end = emit_label(as);[m
[31m-	const void *k = lj_ir_k64_find(as->J, U64x(43f00000,00000000));[m
[31m-	emit_rma(as, XO_ADDSD, dest, k);  /* Add 2^64 to compensate. */[m
[31m-	emit_sjcc(as, CC_NS, l_end);[m
[31m-	emit_rr(as, XO_TEST, left|REX_64, left);  /* Check if u64 >= 2^63. */[m
[31m-      }[m
[31m-      emit_mrm(as, irt_isnum(ir->t) ? XO_CVTSI2SD : XO_CVTSI2SS,[m
[31m-	       dest|((LJ_64 && (st64 || st == IRT_U32)) ? REX_64 : 0), left);[m
[31m-    }[m
[31m-    emit_rr(as, XO_XORPS, dest, dest);  /* Avoid partial register stall. */[m
[31m-  } else if (stfp) {  /* FP to integer conversion. */[m
[31m-    if (irt_isguard(ir->t)) {[m
[31m-      /* Checked conversions are only supported from number to int. */[m
[31m-      lua_assert(irt_isint(ir->t) && st == IRT_NUM);[m
[31m-      asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      x86Op op = st == IRT_NUM ? XO_CVTTSD2SI : XO_CVTTSS2SI;[m
[31m-      if (LJ_64 ? irt_isu64(ir->t) : irt_isu32(ir->t)) {[m
[31m-	/* LJ_64: For inputs >= 2^63 add -2^64, convert again. */[m
[31m-	/* LJ_32: For inputs >= 2^31 add -2^31, convert again and add 2^31. */[m
[31m-	Reg tmp = ra_noreg(IR(lref)->r) ? ra_alloc1(as, lref, RSET_FPR) :[m
[31m-					  ra_scratch(as, RSET_FPR);[m
[31m-	MCLabel l_end = emit_label(as);[m
[31m-	if (LJ_32)[m
[31m-	  emit_gri(as, XG_ARITHi(XOg_ADD), dest, (int32_t)0x80000000);[m
[31m-	emit_rr(as, op, dest|REX_64, tmp);[m
[31m-	if (st == IRT_NUM)[m
[31m-	  emit_rma(as, XO_ADDSD, tmp, lj_ir_k64_find(as->J,[m
[31m-		   LJ_64 ? U64x(c3f00000,00000000) : U64x(c1e00000,00000000)));[m
[31m-	else[m
[31m-	  emit_rma(as, XO_ADDSS, tmp, lj_ir_k64_find(as->J,[m
[31m-		   LJ_64 ? U64x(00000000,df800000) : U64x(00000000,cf000000)));[m
[31m-	emit_sjcc(as, CC_NS, l_end);[m
[31m-	emit_rr(as, XO_TEST, dest|REX_64, dest);  /* Check if dest negative. */[m
[31m-	emit_rr(as, op, dest|REX_64, tmp);[m
[31m-	ra_left(as, tmp, lref);[m
[31m-      } else {[m
[31m-	Reg left = asm_fuseload(as, lref, RSET_FPR);[m
[31m-	if (LJ_64 && irt_isu32(ir->t))[m
[31m-	  emit_rr(as, XO_MOV, dest, dest);  /* Zero hiword. */[m
[31m-	emit_mrm(as, op,[m
[31m-		 dest|((LJ_64 &&[m
[31m-			(irt_is64(ir->t) || irt_isu32(ir->t))) ? REX_64 : 0),[m
[31m-		 left);[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */[m
[31m-    Reg left, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    RegSet allow = RSET_GPR;[m
[31m-    x86Op op;[m
[31m-    lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));[m
[31m-    if (st == IRT_I8) {[m
[31m-      op = XO_MOVSXb; allow = RSET_GPR8; dest |= FORCE_REX;[m
[31m-    } else if (st == IRT_U8) {[m
[31m-      op = XO_MOVZXb; allow = RSET_GPR8; dest |= FORCE_REX;[m
[31m-    } else if (st == IRT_I16) {[m
[31m-      op = XO_MOVSXw;[m
[31m-    } else {[m
[31m-      op = XO_MOVZXw;[m
[31m-    }[m
[31m-    left = asm_fuseload(as, lref, allow);[m
[31m-    /* Add extra MOV if source is already in wrong register. */[m
[31m-    if (!LJ_64 && left != RID_MRM && !rset_test(allow, left)) {[m
[31m-      Reg tmp = ra_scratch(as, allow);[m
[31m-      emit_rr(as, op, dest, tmp);[m
[31m-      emit_rr(as, XO_MOV, tmp, left);[m
[31m-    } else {[m
[31m-      emit_mrm(as, op, dest, left);[m
[31m-    }[m
[31m-  } else {  /* 32/64 bit integer conversions. */[m
[31m-    if (LJ_32) {  /* Only need to handle 32/32 bit no-op (cast) on x86. */[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      ra_left(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    } else if (irt_is64(ir->t)) {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      if (st64 || !(ir->op2 & IRCONV_SEXT)) {[m
[31m-	/* 64/64 bit no-op (cast) or 32 to 64 bit zero extension. */[m
[31m-	ra_left(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-      } else {  /* 32 to 64 bit sign extension. */[m
[31m-	Reg left = asm_fuseload(as, lref, RSET_GPR);[m
[31m-	emit_mrm(as, XO_MOVSXd, dest|REX_64, left);[m
[31m-      }[m
[31m-    } else {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      if (st64) {[m
[31m-	Reg left = asm_fuseload(as, lref, RSET_GPR);[m
[31m-	/* This is either a 32 bit reg/reg mov which zeroes the hiword[m
[31m-	** or a load of the loword from a 64 bit address.[m
[31m-	*/[m
[31m-	emit_mrm(as, XO_MOV, dest, left);[m
[31m-      } else {  /* 32/32 bit no-op (cast). */[m
[31m-	ra_left(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-/* No SSE conversions to/from 64 bit on x86, so resort to ugly x87 code. */[m
[31m-[m
[31m-/* 64 bit integer to FP conversion in 32 bit mode. */[m
[31m-static void asm_conv_fp_int64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg hi = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg lo = ra_alloc1(as, (ir-1)->op1, rset_exclude(RSET_GPR, hi));[m
[31m-  int32_t ofs = sps_scale(ir->s);  /* Use spill slot or temp slots. */[m
[31m-  Reg dest = ir->r;[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    ra_free(as, dest);[m
[31m-    ra_modified(as, dest);[m
[31m-    emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSD : XO_MOVSS, dest, RID_ESP, ofs);[m
[31m-  }[m
[31m-  emit_rmro(as, irt_isnum(ir->t) ? XO_FSTPq : XO_FSTPd,[m
[31m-	    irt_isnum(ir->t) ? XOg_FSTPq : XOg_FSTPd, RID_ESP, ofs);[m
[31m-  if (((ir-1)->op2 & IRCONV_SRCMASK) == IRT_U64) {[m
[31m-    /* For inputs in [2^63,2^64-1] add 2^64 to compensate. */[m
[31m-    MCLabel l_end = emit_label(as);[m
[31m-    emit_rma(as, XO_FADDq, XOg_FADDq,[m
[31m-	     lj_ir_k64_find(as->J, U64x(43f00000,00000000)));[m
[31m-    emit_sjcc(as, CC_NS, l_end);[m
[31m-    emit_rr(as, XO_TEST, hi, hi);  /* Check if u64 >= 2^63. */[m
[31m-  } else {[m
[31m-    lua_assert(((ir-1)->op2 & IRCONV_SRCMASK) == IRT_I64);[m
[31m-  }[m
[31m-  emit_rmro(as, XO_FILDq, XOg_FILDq, RID_ESP, 0);[m
[31m-  /* NYI: Avoid narrow-to-wide store-to-load forwarding stall. */[m
[31m-  emit_rmro(as, XO_MOVto, hi, RID_ESP, 4);[m
[31m-  emit_rmro(as, XO_MOVto, lo, RID_ESP, 0);[m
[31m-}[m
[31m-[m
[31m-/* FP to 64 bit integer conversion in 32 bit mode. */[m
[31m-static void asm_conv_int64_fp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK);[m
[31m-  IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH);[m
[31m-  Reg lo, hi;[m
[31m-  lua_assert(st == IRT_NUM || st == IRT_FLOAT);[m
[31m-  lua_assert(dt == IRT_I64 || dt == IRT_U64);[m
[31m-  hi = ra_dest(as, ir, RSET_GPR);[m
[31m-  lo = ra_dest(as, ir-1, rset_exclude(RSET_GPR, hi));[m
[31m-  if (ra_used(ir-1)) emit_rmro(as, XO_MOV, lo, RID_ESP, 0);[m
[31m-  /* NYI: Avoid wide-to-narrow store-to-load forwarding stall. */[m
[31m-  if (!(as->flags & JIT_F_SSE3)) {  /* Set FPU rounding mode to default. */[m
[31m-    emit_rmro(as, XO_FLDCW, XOg_FLDCW, RID_ESP, 4);[m
[31m-    emit_rmro(as, XO_MOVto, lo, RID_ESP, 4);[m
[31m-    emit_gri(as, XG_ARITHi(XOg_AND), lo, 0xf3ff);[m
[31m-  }[m
[31m-  if (dt == IRT_U64) {[m
[31m-    /* For inputs in [2^63,2^64-1] add -2^64 and convert again. */[m
[31m-    MCLabel l_pop, l_end = emit_label(as);[m
[31m-    emit_x87op(as, XI_FPOP);[m
[31m-    l_pop = emit_label(as);[m
[31m-    emit_sjmp(as, l_end);[m
[31m-    emit_rmro(as, XO_MOV, hi, RID_ESP, 4);[m
[31m-    if ((as->flags & JIT_F_SSE3))[m
[31m-      emit_rmro(as, XO_FISTTPq, XOg_FISTTPq, RID_ESP, 0);[m
[31m-    else[m
[31m-      emit_rmro(as, XO_FISTPq, XOg_FISTPq, RID_ESP, 0);[m
[31m-    emit_rma(as, XO_FADDq, XOg_FADDq,[m
[31m-	     lj_ir_k64_find(as->J, U64x(c3f00000,00000000)));[m
[31m-    emit_sjcc(as, CC_NS, l_pop);[m
[31m-    emit_rr(as, XO_TEST, hi, hi);  /* Check if out-of-range (2^63). */[m
[31m-  }[m
[31m-  emit_rmro(as, XO_MOV, hi, RID_ESP, 4);[m
[31m-  if ((as->flags & JIT_F_SSE3)) {  /* Truncation is easy with SSE3. */[m
[31m-    emit_rmro(as, XO_FISTTPq, XOg_FISTTPq, RID_ESP, 0);[m
[31m-  } else {  /* Otherwise set FPU rounding mode to truncate before the store. */[m
[31m-    emit_rmro(as, XO_FISTPq, XOg_FISTPq, RID_ESP, 0);[m
[31m-    emit_rmro(as, XO_FLDCW, XOg_FLDCW, RID_ESP, 0);[m
[31m-    emit_rmro(as, XO_MOVtow, lo, RID_ESP, 0);[m
[31m-    emit_rmro(as, XO_ARITHw(XOg_OR), lo, RID_ESP, 0);[m
[31m-    emit_loadi(as, lo, 0xc00);[m
[31m-    emit_rmro(as, XO_FNSTCW, XOg_FNSTCW, RID_ESP, 0);[m
[31m-  }[m
[31m-  if (dt == IRT_U64)[m
[31m-    emit_x87op(as, XI_FDUP);[m
[31m-  emit_mrm(as, st == IRT_NUM ? XO_FLDq : XO_FLDd,[m
[31m-	   st == IRT_NUM ? XOg_FLDq: XOg_FLDd,[m
[31m-	   asm_fuseload(as, ir->op1, RSET_EMPTY));[m
[31m-}[m
[31m-[m
[31m-static void asm_conv64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isfp(ir->t))[m
[31m-    asm_conv_fp_int64(as, ir);[m
[31m-  else[m
[31m-    asm_conv_int64_fp(as, ir);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_strto(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* Force a spill slot for the destination register (if any). */[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];[m
[31m-  IRRef args[2];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  if ((drop & RSET_FPR) != RSET_FPR && ra_hasreg(ir->r))[m
[31m-    rset_set(drop, ir->r);  /* WIN64 doesn't spill all FPRs. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  asm_guardcc(as, CC_E);[m
[31m-  emit_rr(as, XO_TEST, RID_RET, RID_RET);  /* Test return status. */[m
[31m-  args[0] = ir->op1;      /* GCstr *str */[m
[31m-  args[1] = ASMREF_TMP1;  /* TValue *n  */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  /* Store the result to the spill slot or temp slots. */[m
[31m-  emit_rmro(as, XO_LEA, ra_releasetmp(as, ASMREF_TMP1)|REX_64,[m
[31m-	    RID_ESP, sps_scale(ir->s));[m
[31m-}[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-/* Get pointer to TValue. */[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    /* For numbers use the constant itself or a spill slot as a TValue. */[m
[31m-    if (irref_isk(ref))[m
[31m-      emit_loada(as, dest, ir_knum(ir));[m
[31m-    else[m
[31m-      emit_rmro(as, XO_LEA, dest|REX_64, RID_ESP, ra_spill(as, ir));[m
[31m-  } else {[m
[31m-    /* Otherwise use g->tmptv to hold the TValue. */[m
[31m-    if (!irref_isk(ref)) {[m
[31m-      Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, dest));[m
[31m-      emit_movtomro(as, REX_64IR(ir, src), dest, 0);[m
[31m-    } else if (!irt_ispri(ir->t)) {[m
[31m-      emit_movmroi(as, dest, 0, ir->i);[m
[31m-    }[m
[31m-    if (!(LJ_64 && irt_islightud(ir->t)))[m
[31m-      emit_movmroi(as, dest, 4, irt_toitype(ir->t));[m
[31m-    emit_loada(as, dest, &J2G(as->J)->tmptv);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_aref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_fusearef(as, ir, RSET_GPR);[m
[31m-  if (!(as->mrm.idx == RID_NONE && as->mrm.ofs == 0))[m
[31m-    emit_mrm(as, XO_LEA, dest, RID_MRM);[m
[31m-  else if (as->mrm.base != dest)[m
[31m-    emit_rr(as, XO_MOV, dest, as->mrm.base);[m
[31m-}[m
[31m-[m
[31m-/* Inlined hash lookup. Specialized for key type and for const keys.[m
[31m-** The equivalent C code is:[m
[31m-**   Node *n = hashkey(t, key);[m
[31m-**   do {[m
[31m-**     if (lj_obj_equal(&n->key, key)) return &n->val;[m
[31m-**   } while ((n = nextnode(n)));[m
[31m-**   return niltv(L);[m
[31m-*/[m
[31m-static void asm_href(ASMState *as, IRIns *ir, IROp merge)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int destused = ra_used(ir);[m
[31m-  Reg dest = ra_dest(as, ir, allow);[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));[m
[31m-  Reg key = RID_NONE, tmp = RID_NONE;[m
[31m-  IRIns *irkey = IR(ir->op2);[m
[31m-  int isk = irref_isk(ir->op2);[m
[31m-  IRType1 kt = irkey->t;[m
[31m-  uint32_t khash;[m
[31m-  MCLabel l_end, l_loop, l_next;[m
[31m-[m
[31m-  if (!isk) {[m
[31m-    rset_clear(allow, tab);[m
[31m-    key = ra_alloc1(as, ir->op2, irt_isnum(kt) ? RSET_FPR : allow);[m
[31m-    if (!irt_isstr(kt))[m
[31m-      tmp = ra_scratch(as, rset_exclude(allow, key));[m
[31m-  }[m
[31m-[m
[31m-  /* Key not found in chain: jump to exit (if merged) or load niltv. */[m
[31m-  l_end = emit_label(as);[m
[31m-  if (merge == IR_NE)[m
[31m-    asm_guardcc(as, CC_E);  /* XI_JMP is not found by lj_asm_patchexit. */[m
[31m-  else if (destused)[m
[31m-    emit_loada(as, dest, niltvg(J2G(as->J)));[m
[31m-[m
[31m-  /* Follow hash chain until the end. */[m
[31m-  l_loop = emit_sjcc_label(as, CC_NZ);[m
[31m-  emit_rr(as, XO_TEST, dest, dest);[m
[31m-  emit_rmro(as, XO_MOV, dest, dest, offsetof(Node, next));[m
[31m-  l_next = emit_label(as);[m
[31m-[m
[31m-  /* Type and value comparison. */[m
[31m-  if (merge == IR_EQ)[m
[31m-    asm_guardcc(as, CC_E);[m
[31m-  else[m
[31m-    emit_sjcc(as, CC_E, l_end);[m
[31m-  if (irt_isnum(kt)) {[m
[31m-    if (isk) {[m
[31m-      /* Assumes -0.0 is already canonicalized to +0.0. */[m
[31m-      emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.u32.lo),[m
[31m-		 (int32_t)ir_knum(irkey)->u32.lo);[m
[31m-      emit_sjcc(as, CC_NE, l_next);[m
[31m-      emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.u32.hi),[m
[31m-		 (int32_t)ir_knum(irkey)->u32.hi);[m
[31m-    } else {[m
[31m-      emit_sjcc(as, CC_P, l_next);[m
[31m-      emit_rmro(as, XO_UCOMISD, key, dest, offsetof(Node, key.n));[m
[31m-      emit_sjcc(as, CC_AE, l_next);[m
[31m-      /* The type check avoids NaN penalties and complaints from Valgrind. */[m
[31m-#if LJ_64[m
[31m-      emit_u32(as, LJ_TISNUM);[m
[31m-      emit_rmro(as, XO_ARITHi, XOg_CMP, dest, offsetof(Node, key.it));[m
[31m-#else[m
[31m-      emit_i8(as, LJ_TISNUM);[m
[31m-      emit_rmro(as, XO_ARITHi8, XOg_CMP, dest, offsetof(Node, key.it));[m
[31m-#endif[m
[31m-    }[m
[31m-#if LJ_64[m
[31m-  } else if (irt_islightud(kt)) {[m
[31m-    emit_rmro(as, XO_CMP, key|REX_64, dest, offsetof(Node, key.u64));[m
[31m-#endif[m
[31m-  } else {[m
[31m-    if (!irt_ispri(kt)) {[m
[31m-      lua_assert(irt_isaddr(kt));[m
[31m-      if (isk)[m
[31m-	emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.gcr),[m
[31m-		   ptr2addr(ir_kgc(irkey)));[m
[31m-      else[m
[31m-	emit_rmro(as, XO_CMP, key, dest, offsetof(Node, key.gcr));[m
[31m-      emit_sjcc(as, CC_NE, l_next);[m
[31m-    }[m
[31m-    lua_assert(!irt_isnil(kt));[m
[31m-    emit_i8(as, irt_toitype(kt));[m
[31m-    emit_rmro(as, XO_ARITHi8, XOg_CMP, dest, offsetof(Node, key.it));[m
[31m-  }[m
[31m-  emit_sfixup(as, l_loop);[m
[31m-  checkmclim(as);[m
[31m-[m
[31m-  /* Load main position relative to tab->node into dest. */[m
[31m-  khash = isk ? ir_khash(irkey) : 1;[m
[31m-  if (khash == 0) {[m
[31m-    emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, node));[m
[31m-  } else {[m
[31m-    emit_rmro(as, XO_ARITH(XOg_ADD), dest, tab, offsetof(GCtab, node));[m
[31m-    if ((as->flags & JIT_F_PREFER_IMUL)) {[m
[31m-      emit_i8(as, sizeof(Node));[m
[31m-      emit_rr(as, XO_IMULi8, dest, dest);[m
[31m-    } else {[m
[31m-      emit_shifti(as, XOg_SHL, dest, 3);[m
[31m-      emit_rmrxo(as, XO_LEA, dest, dest, dest, XM_SCALE2, 0);[m
[31m-    }[m
[31m-    if (isk) {[m
[31m-      emit_gri(as, XG_ARITHi(XOg_AND), dest, (int32_t)khash);[m
[31m-      emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, hmask));[m
[31m-    } else if (irt_isstr(kt)) {[m
[31m-      emit_rmro(as, XO_ARITH(XOg_AND), dest, key, offsetof(GCstr, hash));[m
[31m-      emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, hmask));[m
[31m-    } else {  /* Must match with hashrot() in lj_tab.c. */[m
[31m-      emit_rmro(as, XO_ARITH(XOg_AND), dest, tab, offsetof(GCtab, hmask));[m
[31m-      emit_rr(as, XO_ARITH(XOg_SUB), dest, tmp);[m
[31m-      emit_shifti(as, XOg_ROL, tmp, HASH_ROT3);[m
[31m-      emit_rr(as, XO_ARITH(XOg_XOR), dest, tmp);[m
[31m-      emit_shifti(as, XOg_ROL, dest, HASH_ROT2);[m
[31m-      emit_rr(as, XO_ARITH(XOg_SUB), tmp, dest);[m
[31m-      emit_shifti(as, XOg_ROL, dest, HASH_ROT1);[m
[31m-      emit_rr(as, XO_ARITH(XOg_XOR), tmp, dest);[m
[31m-      if (irt_isnum(kt)) {[m
[31m-	emit_rr(as, XO_ARITH(XOg_ADD), dest, dest);[m
[31m-#if LJ_64[m
[31m-	emit_shifti(as, XOg_SHR|REX_64, dest, 32);[m
[31m-	emit_rr(as, XO_MOV, tmp, dest);[m
[31m-	emit_rr(as, XO_MOVDto, key|REX_64, dest);[m
[31m-#else[m
[31m-	emit_rmro(as, XO_MOV, dest, RID_ESP, ra_spill(as, irkey)+4);[m
[31m-	emit_rr(as, XO_MOVDto, key, tmp);[m
[31m-#endif[m
[31m-      } else {[m
[31m-	emit_rr(as, XO_MOV, tmp, key);[m
[31m-	emit_rmro(as, XO_LEA, dest, key, HASH_BIAS);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_hrefk(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *kslot = IR(ir->op2);[m
[31m-  IRIns *irkey = IR(kslot->op1);[m
[31m-  int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node));[m
[31m-  Reg dest = ra_used(ir) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;[m
[31m-  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-#if !LJ_64 || defined(LUAJIT_USE_VALGRIND)[m
[31m-  MCLabel l_exit;[m
[31m-#endif[m
[31m-  lua_assert(ofs % sizeof(Node) == 0);[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    if (ofs != 0) {[m
[31m-      if (dest == node && !(as->flags & JIT_F_LEA_AGU))[m
[31m-	emit_gri(as, XG_ARITHi(XOg_ADD), dest, ofs);[m
[31m-      else[m
[31m-	emit_rmro(as, XO_LEA, dest, node, ofs);[m
[31m-    } else if (dest != node) {[m
[31m-      emit_rr(as, XO_MOV, dest, node);[m
[31m-    }[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-#if LJ_64 && !defined(LUAJIT_USE_VALGRIND)[m
[31m-  if (!irt_ispri(irkey->t)) {[m
[31m-    Reg key = ra_scratch(as, rset_exclude(RSET_GPR, node));[m
[31m-    emit_rmro(as, XO_CMP, key|REX_64, node,[m
[31m-	       ofs + (int32_t)offsetof(Node, key.u64));[m
[31m-    lua_assert(irt_isnum(irkey->t) || irt_isgcv(irkey->t));[m
[31m-    /* Assumes -0.0 is already canonicalized to +0.0. */[m
[31m-    emit_loadu64(as, key, irt_isnum(irkey->t) ? ir_knum(irkey)->u64 :[m
[31m-			  ((uint64_t)irt_toitype(irkey->t) << 32) |[m
[31m-			  (uint64_t)(uint32_t)ptr2addr(ir_kgc(irkey)));[m
[31m-  } else {[m
[31m-    lua_assert(!irt_isnil(irkey->t));[m
[31m-    emit_i8(as, irt_toitype(irkey->t));[m
[31m-    emit_rmro(as, XO_ARITHi8, XOg_CMP, node,[m
[31m-	      ofs + (int32_t)offsetof(Node, key.it));[m
[31m-  }[m
[31m-#else[m
[31m-  l_exit = emit_label(as);[m
[31m-  if (irt_isnum(irkey->t)) {[m
[31m-    /* Assumes -0.0 is already canonicalized to +0.0. */[m
[31m-    emit_gmroi(as, XG_ARITHi(XOg_CMP), node,[m
[31m-	       ofs + (int32_t)offsetof(Node, key.u32.lo),[m
[31m-	       (int32_t)ir_knum(irkey)->u32.lo);[m
[31m-    emit_sjcc(as, CC_NE, l_exit);[m
[31m-    emit_gmroi(as, XG_ARITHi(XOg_CMP), node,[m
[31m-	       ofs + (int32_t)offsetof(Node, key.u32.hi),[m
[31m-	       (int32_t)ir_knum(irkey)->u32.hi);[m
[31m-  } else {[m
[31m-    if (!irt_ispri(irkey->t)) {[m
[31m-      lua_assert(irt_isgcv(irkey->t));[m
[31m-      emit_gmroi(as, XG_ARITHi(XOg_CMP), node,[m
[31m-		 ofs + (int32_t)offsetof(Node, key.gcr),[m
[31m-		 ptr2addr(ir_kgc(irkey)));[m
[31m-      emit_sjcc(as, CC_NE, l_exit);[m
[31m-    }[m
[31m-    lua_assert(!irt_isnil(irkey->t));[m
[31m-    emit_i8(as, irt_toitype(irkey->t));[m
[31m-    emit_rmro(as, XO_ARITHi8, XOg_CMP, node,[m
[31m-	      ofs + (int32_t)offsetof(Node, key.it));[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static void asm_uref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* NYI: Check that UREFO is still open and not aliasing a slot. */[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-    MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;[m
[31m-    emit_rma(as, XO_MOV, dest, v);[m
[31m-  } else {[m
[31m-    Reg uv = ra_scratch(as, RSET_GPR);[m
[31m-    Reg func = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (ir->o == IR_UREFC) {[m
[31m-      emit_rmro(as, XO_LEA, dest, uv, offsetof(GCupval, tv));[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_i8(as, 1);[m
[31m-      emit_rmro(as, XO_ARITHib, XOg_CMP, uv, offsetof(GCupval, closed));[m
[31m-    } else {[m
[31m-      emit_rmro(as, XO_MOV, dest, uv, offsetof(GCupval, v));[m
[31m-    }[m
[31m-    emit_rmro(as, XO_MOV, uv, func,[m
[31m-	      (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_fusefref(as, ir, RSET_GPR);[m
[31m-  emit_mrm(as, XO_LEA, dest, RID_MRM);[m
[31m-}[m
[31m-[m
[31m-static void asm_strref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_fusestrref(as, ir, RSET_GPR);[m
[31m-  if (as->mrm.base == RID_NONE)[m
[31m-    emit_loadi(as, dest, as->mrm.ofs);[m
[31m-  else if (as->mrm.base == dest && as->mrm.idx == RID_NONE)[m
[31m-    emit_gri(as, XG_ARITHi(XOg_ADD), dest, as->mrm.ofs);[m
[31m-  else[m
[31m-    emit_mrm(as, XO_LEA, dest, RID_MRM);[m
[31m-}[m
[31m-[m
[31m-/* -- Loads and stores ---------------------------------------------------- */[m
[31m-[m
[31m-static void asm_fxload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);[m
[31m-  x86Op xo;[m
[31m-  if (ir->o == IR_FLOAD)[m
[31m-    asm_fusefref(as, ir, RSET_GPR);[m
[31m-  else[m
[31m-    asm_fusexref(as, ir->op1, RSET_GPR);[m
[31m-  /* ir->op2 is ignored -- unaligned loads are ok on x86. */[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: xo = XO_MOVSXb; break;[m
[31m-  case IRT_U8: xo = XO_MOVZXb; break;[m
[31m-  case IRT_I16: xo = XO_MOVSXw; break;[m
[31m-  case IRT_U16: xo = XO_MOVZXw; break;[m
[31m-  case IRT_NUM: xo = XO_MOVSD; break;[m
[31m-  case IRT_FLOAT: xo = XO_MOVSS; break;[m
[31m-  default:[m
[31m-    if (LJ_64 && irt_is64(ir->t))[m
[31m-      dest |= REX_64;[m
[31m-    else[m
[31m-      lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t));[m
[31m-    xo = XO_MOV;[m
[31m-    break;[m
[31m-  }[m
[31m-  emit_mrm(as, xo, dest, RID_MRM);[m
[31m-}[m
[31m-[m
[31m-#define asm_fload(as, ir)	asm_fxload(as, ir)[m
[31m-#define asm_xload(as, ir)	asm_fxload(as, ir)[m
[31m-[m
[31m-static void asm_fxstore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg src = RID_NONE, osrc = RID_NONE;[m
[31m-  int32_t k = 0;[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  /* The IRT_I16/IRT_U16 stores should never be simplified for constant[m
[31m-  ** values since mov word [mem], imm16 has a length-changing prefix.[m
[31m-  */[m
[31m-  if (irt_isi16(ir->t) || irt_isu16(ir->t) || irt_isfp(ir->t) ||[m
[31m-      !asm_isk32(as, ir->op2, &k)) {[m
[31m-    RegSet allow8 = irt_isfp(ir->t) ? RSET_FPR :[m
[31m-		    (irt_isi8(ir->t) || irt_isu8(ir->t)) ? RSET_GPR8 : RSET_GPR;[m
[31m-    src = osrc = ra_alloc1(as, ir->op2, allow8);[m
[31m-    if (!LJ_64 && !rset_test(allow8, src)) {  /* Already in wrong register. */[m
[31m-      rset_clear(allow, osrc);[m
[31m-      src = ra_scratch(as, allow8);[m
[31m-    }[m
[31m-    rset_clear(allow, src);[m
[31m-  }[m
[31m-  if (ir->o == IR_FSTORE) {[m
[31m-    asm_fusefref(as, IR(ir->op1), allow);[m
[31m-  } else {[m
[31m-    asm_fusexref(as, ir->op1, allow);[m
[31m-    if (LJ_32 && ir->o == IR_HIOP) as->mrm.ofs += 4;[m
[31m-  }[m
[31m-  if (ra_hasreg(src)) {[m
[31m-    x86Op xo;[m
[31m-    switch (irt_type(ir->t)) {[m
[31m-    case IRT_I8: case IRT_U8: xo = XO_MOVtob; src |= FORCE_REX; break;[m
[31m-    case IRT_I16: case IRT_U16: xo = XO_MOVtow; break;[m
[31m-    case IRT_NUM: xo = XO_MOVSDto; break;[m
[31m-    case IRT_FLOAT: xo = XO_MOVSSto; break;[m
[31m-#if LJ_64[m
[31m-    case IRT_LIGHTUD: lua_assert(0);  /* NYI: mask 64 bit lightuserdata. */[m
[31m-#endif[m
[31m-    default:[m
[31m-      if (LJ_64 && irt_is64(ir->t))[m
[31m-	src |= REX_64;[m
[31m-      else[m
[31m-	lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t));[m
[31m-      xo = XO_MOVto;[m
[31m-      break;[m
[31m-    }[m
[31m-    emit_mrm(as, xo, src, RID_MRM);[m
[31m-    if (!LJ_64 && src != osrc) {[m
[31m-      ra_noweak(as, osrc);[m
[31m-      emit_rr(as, XO_MOV, src, osrc);[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (irt_isi8(ir->t) || irt_isu8(ir->t)) {[m
[31m-      emit_i8(as, k);[m
[31m-      emit_mrm(as, XO_MOVmib, 0, RID_MRM);[m
[31m-    } else {[m
[31m-      lua_assert(irt_is64(ir->t) || irt_isint(ir->t) || irt_isu32(ir->t) ||[m
[31m-		 irt_isaddr(ir->t));[m
[31m-      emit_i32(as, k);[m
[31m-      emit_mrm(as, XO_MOVmi, REX_64IR(ir, 0), RID_MRM);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_fstore(as, ir)	asm_fxstore(as, ir)[m
[31m-#define asm_xstore(as, ir)	asm_fxstore(as, ir)[m
[31m-[m
[31m-#if LJ_64[m
[31m-static Reg asm_load_lightud64(ASMState *as, IRIns *ir, int typecheck)[m
[31m-{[m
[31m-  if (ra_used(ir) || typecheck) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (typecheck) {[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, dest));[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_i8(as, -2);[m
[31m-      emit_rr(as, XO_ARITHi8, XOg_CMP, tmp);[m
[31m-      emit_shifti(as, XOg_SAR|REX_64, tmp, 47);[m
[31m-      emit_rr(as, XO_MOV, tmp|REX_64, dest);[m
[31m-    }[m
[31m-    return dest;[m
[31m-  } else {[m
[31m-    return RID_NONE;[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_ahuvload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  lua_assert(irt_isnum(ir->t) || irt_ispri(ir->t) || irt_isaddr(ir->t) ||[m
[31m-	     (LJ_DUALNUM && irt_isint(ir->t)));[m
[31m-#if LJ_64[m
[31m-  if (irt_islightud(ir->t)) {[m
[31m-    Reg dest = asm_load_lightud64(as, ir, 1);[m
[31m-    if (ra_hasreg(dest)) {[m
[31m-      asm_fuseahuref(as, ir->op1, RSET_GPR);[m
[31m-      emit_mrm(as, XO_MOV, dest|REX_64, RID_MRM);[m
[31m-    }[m
[31m-    return;[m
[31m-  } else[m
[31m-#endif[m
[31m-  if (ra_used(ir)) {[m
[31m-    RegSet allow = irt_isnum(ir->t) ? RSET_FPR : RSET_GPR;[m
[31m-    Reg dest = ra_dest(as, ir, allow);[m
[31m-    asm_fuseahuref(as, ir->op1, RSET_GPR);[m
[31m-    emit_mrm(as, dest < RID_MAX_GPR ? XO_MOV : XO_MOVSD, dest, RID_MRM);[m
[31m-  } else {[m
[31m-    asm_fuseahuref(as, ir->op1, RSET_GPR);[m
[31m-  }[m
[31m-  /* Always do the type check, even if the load result is unused. */[m
[31m-  as->mrm.ofs += 4;[m
[31m-  asm_guardcc(as, irt_isnum(ir->t) ? CC_AE : CC_NE);[m
[31m-  if (LJ_64 && irt_type(ir->t) >= IRT_NUM) {[m
[31m-    lua_assert(irt_isinteger(ir->t) || irt_isnum(ir->t));[m
[31m-    emit_u32(as, LJ_TISNUM);[m
[31m-    emit_mrm(as, XO_ARITHi, XOg_CMP, RID_MRM);[m
[31m-  } else {[m
[31m-    emit_i8(as, irt_toitype(ir->t));[m
[31m-    emit_mrm(as, XO_ARITHi8, XOg_CMP, RID_MRM);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_ahustore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, RSET_FPR);[m
[31m-    asm_fuseahuref(as, ir->op1, RSET_GPR);[m
[31m-    emit_mrm(as, XO_MOVSDto, src, RID_MRM);[m
[31m-#if LJ_64[m
[31m-  } else if (irt_islightud(ir->t)) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-    asm_fuseahuref(as, ir->op1, rset_exclude(RSET_GPR, src));[m
[31m-    emit_mrm(as, XO_MOVto, src|REX_64, RID_MRM);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    IRIns *irr = IR(ir->op2);[m
[31m-    RegSet allow = RSET_GPR;[m
[31m-    Reg src = RID_NONE;[m
[31m-    if (!irref_isk(ir->op2)) {[m
[31m-      src = ra_alloc1(as, ir->op2, allow);[m
[31m-      rset_clear(allow, src);[m
[31m-    }[m
[31m-    asm_fuseahuref(as, ir->op1, allow);[m
[31m-    if (ra_hasreg(src)) {[m
[31m-      emit_mrm(as, XO_MOVto, src, RID_MRM);[m
[31m-    } else if (!irt_ispri(irr->t)) {[m
[31m-      lua_assert(irt_isaddr(ir->t) || (LJ_DUALNUM && irt_isinteger(ir->t)));[m
[31m-      emit_i32(as, irr->i);[m
[31m-      emit_mrm(as, XO_MOVmi, 0, RID_MRM);[m
[31m-    }[m
[31m-    as->mrm.ofs += 4;[m
[31m-    emit_i32(as, (int32_t)irt_toitype(ir->t));[m
[31m-    emit_mrm(as, XO_MOVmi, 0, RID_MRM);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);[m
[31m-  IRType1 t = ir->t;[m
[31m-  Reg base;[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */[m
[31m-  lua_assert(irt_isguard(t) || !(ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-  lua_assert(LJ_DUALNUM ||[m
[31m-	     !irt_isint(t) || (ir->op2 & (IRSLOAD_CONVERT|IRSLOAD_FRAME)));[m
[31m-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) {[m
[31m-    Reg left = ra_scratch(as, RSET_FPR);[m
[31m-    asm_tointg(as, ir, left);  /* Frees dest reg. Do this before base alloc. */[m
[31m-    base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-    emit_rmro(as, XO_MOVSD, left, base, ofs);[m
[31m-    t.irt = IRT_NUM;  /* Continue with a regular number type check. */[m
[31m-#if LJ_64[m
[31m-  } else if (irt_islightud(t)) {[m
[31m-    Reg dest = asm_load_lightud64(as, ir, (ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-    if (ra_hasreg(dest)) {[m
[31m-      base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-      emit_rmro(as, XO_MOV, dest|REX_64, base, ofs);[m
[31m-    }[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else if (ra_used(ir)) {[m
[31m-    RegSet allow = irt_isnum(t) ? RSET_FPR : RSET_GPR;[m
[31m-    Reg dest = ra_dest(as, ir, allow);[m
[31m-    base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-    lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t));[m
[31m-    if ((ir->op2 & IRSLOAD_CONVERT)) {[m
[31m-      t.irt = irt_isint(t) ? IRT_NUM : IRT_INT;  /* Check for original type. */[m
[31m-      emit_rmro(as, irt_isint(t) ? XO_CVTSI2SD : XO_CVTTSD2SI, dest, base, ofs);[m
[31m-    } else {[m
[31m-      emit_rmro(as, irt_isnum(t) ? XO_MOVSD : XO_MOV, dest, base, ofs);[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (!(ir->op2 & IRSLOAD_TYPECHECK))[m
[31m-      return;  /* No type check: avoid base alloc. */[m
[31m-    base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  }[m
[31m-  if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-    /* Need type check, even if the load result is unused. */[m
[31m-    asm_guardcc(as, irt_isnum(t) ? CC_AE : CC_NE);[m
[31m-    if (LJ_64 && irt_type(t) >= IRT_NUM) {[m
[31m-      lua_assert(irt_isinteger(t) || irt_isnum(t));[m
[31m-      emit_u32(as, LJ_TISNUM);[m
[31m-      emit_rmro(as, XO_ARITHi, XOg_CMP, base, ofs+4);[m
[31m-    } else {[m
[31m-      emit_i8(as, irt_toitype(t));[m
[31m-      emit_rmro(as, XO_ARITHi8, XOg_CMP, base, ofs+4);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_cnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(as->J));[m
[31m-  CTypeID id = (CTypeID)IR(ir->op1)->i;[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco];[m
[31m-  IRRef args[4];[m
[31m-  lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL));[m
[31m-[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCcdata * */[m
[31m-[m
[31m-  /* Initialize immutable cdata object. */[m
[31m-  if (ir->o == IR_CNEWI) {[m
[31m-    RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-#if LJ_64[m
[31m-    Reg r64 = sz == 8 ? REX_64 : 0;[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      IRIns *irk = IR(ir->op2);[m
[31m-      uint64_t k = irk->o == IR_KINT64 ? ir_k64(irk)->u64 :[m
[31m-					 (uint64_t)(uint32_t)irk->i;[m
[31m-      if (sz == 4 || checki32((int64_t)k)) {[m
[31m-	emit_i32(as, (int32_t)k);[m
[31m-	emit_rmro(as, XO_MOVmi, r64, RID_RET, sizeof(GCcdata));[m
[31m-      } else {[m
[31m-	emit_movtomro(as, RID_ECX + r64, RID_RET, sizeof(GCcdata));[m
[31m-	emit_loadu64(as, RID_ECX, k);[m
[31m-      }[m
[31m-    } else {[m
[31m-      Reg r = ra_alloc1(as, ir->op2, allow);[m
[31m-      emit_movtomro(as, r + r64, RID_RET, sizeof(GCcdata));[m
[31m-    }[m
[31m-#else[m
[31m-    int32_t ofs = sizeof(GCcdata);[m
[31m-    if (sz == 8) {[m
[31m-      ofs += 4; ir++;[m
[31m-      lua_assert(ir->o == IR_HIOP);[m
[31m-    }[m
[31m-    do {[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	emit_movmroi(as, RID_RET, ofs, IR(ir->op2)->i);[m
[31m-      } else {[m
[31m-	Reg r = ra_alloc1(as, ir->op2, allow);[m
[31m-	emit_movtomro(as, r, RID_RET, ofs);[m
[31m-	rset_clear(allow, r);[m
[31m-      }[m
[31m-      if (ofs == sizeof(GCcdata)) break;[m
[31m-      ofs -= 4; ir--;[m
[31m-    } while (1);[m
[31m-#endif[m
[31m-    lua_assert(sz == 4 || sz == 8);[m
[31m-  } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];[m
[31m-    args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-    args[1] = ir->op1;      /* CTypeID id   */[m
[31m-    args[2] = ir->op2;      /* CTSize sz    */[m
[31m-    args[3] = ASMREF_TMP1;  /* CTSize align */[m
[31m-    asm_gencall(as, ci, args);[m
[31m-    emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)ctype_align(info));[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Combine initialization of marked, gct and ctypeid. */[m
[31m-  emit_movtomro(as, RID_ECX, RID_RET, offsetof(GCcdata, marked));[m
[31m-  emit_gri(as, XG_ARITHi(XOg_OR), RID_ECX,[m
[31m-	   (int32_t)((~LJ_TCDATA<<8)+(id<<16)));[m
[31m-  emit_gri(as, XG_ARITHi(XOg_AND), RID_ECX, LJ_GC_WHITES);[m
[31m-  emit_opgl(as, XO_MOVZXb, RID_ECX, gc.currentwhite);[m
[31m-[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ASMREF_TMP1;  /* MSize size   */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)(sz+sizeof(GCcdata)));[m
[31m-}[m
[31m-#else[m
[31m-#define asm_cnew(as, ir)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-static void asm_tbar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, tab));[m
[31m-  MCLabel l_end = emit_label(as);[m
[31m-  emit_movtomro(as, tmp, tab, offsetof(GCtab, gclist));[m
[31m-  emit_setgl(as, tab, gc.grayagain);[m
[31m-  emit_getgl(as, tmp, gc.grayagain);[m
[31m-  emit_i8(as, ~LJ_GC_BLACK);[m
[31m-  emit_rmro(as, XO_ARITHib, XOg_AND, tab, offsetof(GCtab, marked));[m
[31m-  emit_sjcc(as, CC_Z, l_end);[m
[31m-  emit_i8(as, LJ_GC_BLACK);[m
[31m-  emit_rmro(as, XO_GROUP3b, XOg_TEST, tab, offsetof(GCtab, marked));[m
[31m-}[m
[31m-[m
[31m-static void asm_obar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg obj;[m
[31m-  /* No need for other object barriers (yet). */[m
[31m-  lua_assert(IR(ir->op1)->o == IR_UREFC);[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ir->op1;      /* TValue *tv      */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_loada(as, ra_releasetmp(as, ASMREF_TMP1), J2G(as->J));[m
[31m-  obj = IR(ir->op1)->r;[m
[31m-  emit_sjcc(as, CC_Z, l_end);[m
[31m-  emit_i8(as, LJ_GC_WHITES);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    GCobj *vp = ir_kgc(IR(ir->op2));[m
[31m-    emit_rma(as, XO_GROUP3b, XOg_TEST, &vp->gch.marked);[m
[31m-  } else {[m
[31m-    Reg val = ra_alloc1(as, ir->op2, rset_exclude(RSET_SCRATCH&RSET_GPR, obj));[m
[31m-    emit_rmro(as, XO_GROUP3b, XOg_TEST, val, (int32_t)offsetof(GChead, marked));[m
[31m-  }[m
[31m-  emit_sjcc(as, CC_Z, l_end);[m
[31m-  emit_i8(as, LJ_GC_BLACK);[m
[31m-  emit_rmro(as, XO_GROUP3b, XOg_TEST, obj,[m
[31m-	    (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));[m
[31m-}[m
[31m-[m
[31m-/* -- FP/int arithmetic and logic operations ------------------------------ */[m
[31m-[m
[31m-/* Load reference onto x87 stack. Force a spill to memory if needed. */[m
[31m-static void asm_x87load(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_KNUM) {[m
[31m-    cTValue *tv = ir_knum(ir);[m
[31m-    if (tvispzero(tv))  /* Use fldz only for +0. */[m
[31m-      emit_x87op(as, XI_FLDZ);[m
[31m-    else if (tvispone(tv))[m
[31m-      emit_x87op(as, XI_FLD1);[m
[31m-    else[m
[31m-      emit_rma(as, XO_FLDq, XOg_FLDq, tv);[m
[31m-  } else if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT && !ra_used(ir) &&[m
[31m-	     !irref_isk(ir->op1) && mayfuse(as, ir->op1)) {[m
[31m-    IRIns *iri = IR(ir->op1);[m
[31m-    emit_rmro(as, XO_FILDd, XOg_FILDd, RID_ESP, ra_spill(as, iri));[m
[31m-  } else {[m
[31m-    emit_mrm(as, XO_FLDq, XOg_FLDq, asm_fuseload(as, ref, RSET_EMPTY));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fpmath(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRFPMathOp fpm = (IRFPMathOp)ir->op2;[m
[31m-  if (fpm == IRFPM_SQRT) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg left = asm_fuseload(as, ir->op1, RSET_FPR);[m
[31m-    emit_mrm(as, XO_SQRTSD, dest, left);[m
[31m-  } else if (fpm <= IRFPM_TRUNC) {[m
[31m-    if (as->flags & JIT_F_SSE4_1) {  /* SSE4.1 has a rounding instruction. */[m
[31m-      Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-      Reg left = asm_fuseload(as, ir->op1, RSET_FPR);[m
[31m-      /* ROUNDSD has a 4-byte opcode which doesn't fit in x86Op.[m
[31m-      ** Let's pretend it's a 3-byte opcode, and compensate afterwards.[m
[31m-      ** This is atrocious, but the alternatives are much worse.[m
[31m-      */[m
[31m-      /* Round down/up/trunc == 1001/1010/1011. */[m
[31m-      emit_i8(as, 0x09 + fpm);[m
[31m-      emit_mrm(as, XO_ROUNDSD, dest, left);[m
[31m-      if (LJ_64 && as->mcp[1] != (MCode)(XO_ROUNDSD >> 16)) {[m
[31m-	as->mcp[0] = as->mcp[1]; as->mcp[1] = 0x0f;  /* Swap 0F and REX. */[m
[31m-      }[m
[31m-      *--as->mcp = 0x66;  /* 1st byte of ROUNDSD opcode. */[m
[31m-    } else {  /* Call helper functions for SSE2 variant. */[m
[31m-      /* The modified regs must match with the *.dasc implementation. */[m
[31m-      RegSet drop = RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX);[m
[31m-      if (ra_hasreg(ir->r))[m
[31m-	rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-      ra_evictset(as, drop);[m
[31m-      ra_destreg(as, ir, RID_XMM0);[m
[31m-      emit_call(as, fpm == IRFPM_FLOOR ? lj_vm_floor_sse :[m
[31m-		    fpm == IRFPM_CEIL ? lj_vm_ceil_sse : lj_vm_trunc_sse);[m
[31m-      ra_left(as, RID_XMM0, ir->op1);[m
[31m-    }[m
[31m-  } else if (fpm == IRFPM_EXP2 && asm_fpjoin_pow(as, ir)) {[m
[31m-    /* Rejoined to pow(). */[m
[31m-  } else {[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_floor + fpm);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_atan2(as, ir)	asm_callid(as, ir, IRCALL_atan2)[m
[31m-[m
[31m-static void asm_ldexp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = sps_scale(ir->s);  /* Use spill slot or temp slots. */[m
[31m-  Reg dest = ir->r;[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    ra_free(as, dest);[m
[31m-    ra_modified(as, dest);[m
[31m-    emit_rmro(as, XO_MOVSD, dest, RID_ESP, ofs);[m
[31m-  }[m
[31m-  emit_rmro(as, XO_FSTPq, XOg_FSTPq, RID_ESP, ofs);[m
[31m-  emit_x87op(as, XI_FPOP1);[m
[31m-  emit_x87op(as, XI_FSCALE);[m
[31m-  asm_x87load(as, ir->op1);[m
[31m-  asm_x87load(as, ir->op2);[m
[31m-}[m
[31m-[m
[31m-static void asm_fppowi(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* The modified regs must match with the *.dasc implementation. */[m
[31m-  RegSet drop = RSET_RANGE(RID_XMM0, RID_XMM1+1)|RID2RSET(RID_EAX);[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  ra_destreg(as, ir, RID_XMM0);[m
[31m-  emit_call(as, lj_vm_powi_sse);[m
[31m-  ra_left(as, RID_XMM0, ir->op1);[m
[31m-  ra_left(as, RID_EAX, ir->op2);[m
[31m-}[m
[31m-[m
[31m-static void asm_pow(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_64 && LJ_HASFFI[m
[31m-  if (!irt_isnum(ir->t))[m
[31m-    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 :[m
[31m-					  IRCALL_lj_carith_powu64);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_fppowi(as, ir);[m
[31m-}[m
[31m-[m
[31m-static int asm_swapops(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1);[m
[31m-  IRIns *irr = IR(ir->op2);[m
[31m-  lua_assert(ra_noreg(irr->r));[m
[31m-  if (!irm_iscomm(lj_ir_mode[ir->o]))[m
[31m-    return 0;  /* Can't swap non-commutative operations. */[m
[31m-  if (irref_isk(ir->op2))[m
[31m-    return 0;  /* Don't swap constants to the left. */[m
[31m-  if (ra_hasreg(irl->r))[m
[31m-    return 1;  /* Swap if left already has a register. */[m
[31m-  if (ra_samehint(ir->r, irr->r))[m
[31m-    return 1;  /* Swap if dest and right have matching hints. */[m
[31m-  if (as->curins > as->loopref) {  /* In variant part? */[m
[31m-    if (ir->op2 < as->loopref && !irt_isphi(irr->t))[m
[31m-      return 0;  /* Keep invariants on the right. */[m
[31m-    if (ir->op1 < as->loopref && !irt_isphi(irl->t))[m
[31m-      return 1;  /* Swap invariants to the right. */[m
[31m-  }[m
[31m-  if (opisfusableload(irl->o))[m
[31m-    return 1;  /* Swap fusable loads to the right. */[m
[31m-  return 0;  /* Otherwise don't swap. */[m
[31m-}[m
[31m-[m
[31m-static void asm_fparith(ASMState *as, IRIns *ir, x86Op xo)[m
[31m-{[m
[31m-  IRRef lref = ir->op1;[m
[31m-  IRRef rref = ir->op2;[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg dest;[m
[31m-  Reg right = IR(rref)->r;[m
[31m-  if (ra_hasreg(right)) {[m
[31m-    rset_clear(allow, right);[m
[31m-    ra_noweak(as, right);[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, allow);[m
[31m-  if (lref == rref) {[m
[31m-    right = dest;[m
[31m-  } else if (ra_noreg(right)) {[m
[31m-    if (asm_swapops(as, ir)) {[m
[31m-      IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-    }[m
[31m-    right = asm_fuseload(as, rref, rset_clear(allow, dest));[m
[31m-  }[m
[31m-  emit_mrm(as, xo, dest, right);[m
[31m-  ra_left(as, dest, lref);[m
[31m-}[m
[31m-[m
[31m-static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa)[m
[31m-{[m
[31m-  IRRef lref = ir->op1;[m
[31m-  IRRef rref = ir->op2;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg dest, right;[m
[31m-  int32_t k = 0;[m
[31m-  if (as->flagmcp == as->mcp) {  /* Drop test r,r instruction. */[m
[31m-    MCode *p = as->mcp + ((LJ_64 && *as->mcp < XI_TESTb) ? 3 : 2);[m
[31m-    if ((p[1] & 15) < 14) {[m
[31m-      if ((p[1] & 15) >= 12) p[1] -= 4;  /* L <->S, NL <-> NS */[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp = p;[m
[31m-    }  /* else: cannot transform LE/NLE to cc without use of OF. */[m
[31m-  }[m
[31m-  right = IR(rref)->r;[m
[31m-  if (ra_hasreg(right)) {[m
[31m-    rset_clear(allow, right);[m
[31m-    ra_noweak(as, right);[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, allow);[m
[31m-  if (lref == rref) {[m
[31m-    right = dest;[m
[31m-  } else if (ra_noreg(right) && !asm_isk32(as, rref, &k)) {[m
[31m-    if (asm_swapops(as, ir)) {[m
[31m-      IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-    }[m
[31m-    right = asm_fuseloadm(as, rref, rset_clear(allow, dest), irt_is64(ir->t));[m
[31m-  }[m
[31m-  if (irt_isguard(ir->t))  /* For IR_ADDOV etc. */[m
[31m-    asm_guardcc(as, CC_O);[m
[31m-  if (xa != XOg_X_IMUL) {[m
[31m-    if (ra_hasreg(right))[m
[31m-      emit_mrm(as, XO_ARITH(xa), REX_64IR(ir, dest), right);[m
[31m-    else[m
[31m-      emit_gri(as, XG_ARITHi(xa), REX_64IR(ir, dest), k);[m
[31m-  } else if (ra_hasreg(right)) {  /* IMUL r, mrm. */[m
[31m-    emit_mrm(as, XO_IMUL, REX_64IR(ir, dest), right);[m
[31m-  } else {  /* IMUL r, r, k. */[m
[31m-    /* NYI: use lea/shl/add/sub (FOLD only does 2^k) depending on CPU. */[m
[31m-    Reg left = asm_fuseloadm(as, lref, RSET_GPR, irt_is64(ir->t));[m
[31m-    x86Op xo;[m
[31m-    if (checki8(k)) { emit_i8(as, k); xo = XO_IMULi8;[m
[31m-    } else { emit_i32(as, k); xo = XO_IMULi; }[m
[31m-    emit_mrm(as, xo, REX_64IR(ir, dest), left);[m
[31m-    return;[m
[31m-  }[m
[31m-  ra_left(as, dest, lref);[m
[31m-}[m
[31m-[m
[31m-/* LEA is really a 4-operand ADD with an independent destination register,[m
[31m-** up to two source registers and an immediate. One register can be scaled[m
[31m-** by 1, 2, 4 or 8. This can be used to avoid moves or to fuse several[m
[31m-** instructions.[m
[31m-**[m
[31m-** Currently only a few common cases are supported:[m
[31m-** - 3-operand ADD:    y = a+b; y = a+k   with a and b already allocated[m
[31m-** - Left ADD fusion:  y = (a+b)+k; y = (a+k)+b[m
[31m-** - Right ADD fusion: y = a+(b+k)[m
[31m-** The ommited variants have already been reduced by FOLD.[m
[31m-**[m
[31m-** There are more fusion opportunities, like gathering shifts or joining[m
[31m-** common references. But these are probably not worth the trouble, since[m
[31m-** array indexing is not decomposed and already makes use of all fields[m
[31m-** of the ModRM operand.[m
[31m-*/[m
[31m-static int asm_lea(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1);[m
[31m-  IRIns *irr = IR(ir->op2);[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg dest;[m
[31m-  as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-  as->mrm.scale = XM_SCALE1;[m
[31m-  as->mrm.ofs = 0;[m
[31m-  if (ra_hasreg(irl->r)) {[m
[31m-    rset_clear(allow, irl->r);[m
[31m-    ra_noweak(as, irl->r);[m
[31m-    as->mrm.base = irl->r;[m
[31m-    if (irref_isk(ir->op2) || ra_hasreg(irr->r)) {[m
[31m-      /* The PHI renaming logic does a better job in some cases. */[m
[31m-      if (ra_hasreg(ir->r) &&[m
[31m-	  ((irt_isphi(irl->t) && as->phireg[ir->r] == ir->op1) ||[m
[31m-	   (irt_isphi(irr->t) && as->phireg[ir->r] == ir->op2)))[m
[31m-	return 0;[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	as->mrm.ofs = irr->i;[m
[31m-      } else {[m
[31m-	rset_clear(allow, irr->r);[m
[31m-	ra_noweak(as, irr->r);[m
[31m-	as->mrm.idx = irr->r;[m
[31m-      }[m
[31m-    } else if (irr->o == IR_ADD && mayfuse(as, ir->op2) &&[m
[31m-	       irref_isk(irr->op2)) {[m
[31m-      Reg idx = ra_alloc1(as, irr->op1, allow);[m
[31m-      rset_clear(allow, idx);[m
[31m-      as->mrm.idx = (uint8_t)idx;[m
[31m-      as->mrm.ofs = IR(irr->op2)->i;[m
[31m-    } else {[m
[31m-      return 0;[m
[31m-    }[m
[31m-  } else if (ir->op1 != ir->op2 && irl->o == IR_ADD && mayfuse(as, ir->op1) &&[m
[31m-	     (irref_isk(ir->op2) || irref_isk(irl->op2))) {[m
[31m-    Reg idx, base = ra_alloc1(as, irl->op1, allow);[m
[31m-    rset_clear(allow, base);[m
[31m-    as->mrm.base = (uint8_t)base;[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      as->mrm.ofs = irr->i;[m
[31m-      idx = ra_alloc1(as, irl->op2, allow);[m
[31m-    } else {[m
[31m-      as->mrm.ofs = IR(irl->op2)->i;[m
[31m-      idx = ra_alloc1(as, ir->op2, allow);[m
[31m-    }[m
[31m-    rset_clear(allow, idx);[m
[31m-    as->mrm.idx = (uint8_t)idx;[m
[31m-  } else {[m
[31m-    return 0;[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, allow);[m
[31m-  emit_mrm(as, XO_LEA, dest, RID_MRM);[m
[31m-  return 1;  /* Success. */[m
[31m-}[m
[31m-[m
[31m-static void asm_add(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_ADDSD);[m
[31m-  else if ((as->flags & JIT_F_LEA_AGU) || as->flagmcp == as->mcp ||[m
[31m-	   irt_is64(ir->t) || !asm_lea(as, ir))[m
[31m-    asm_intarith(as, ir, XOg_ADD);[m
[31m-}[m
[31m-[m
[31m-static void asm_sub(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_SUBSD);[m
[31m-  else  /* Note: no need for LEA trick here. i-k is encoded as i+(-k). */[m
[31m-    asm_intarith(as, ir, XOg_SUB);[m
[31m-}[m
[31m-[m
[31m-static void asm_mul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_MULSD);[m
[31m-  else[m
[31m-    asm_intarith(as, ir, XOg_X_IMUL);[m
[31m-}[m
[31m-[m
[31m-static void asm_div(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_64 && LJ_HASFFI[m
[31m-  if (!irt_isnum(ir->t))[m
[31m-    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 :[m
[31m-					  IRCALL_lj_carith_divu64);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_fparith(as, ir, XO_DIVSD);[m
[31m-}[m
[31m-[m
[31m-static void asm_mod(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_64 && LJ_HASFFI[m
[31m-  if (!irt_isint(ir->t))[m
[31m-    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 :[m
[31m-					  IRCALL_lj_carith_modu64);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_modi);[m
[31m-}[m
[31m-[m
[31m-static void asm_neg_not(ASMState *as, IRIns *ir, x86Group3 xg)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  emit_rr(as, XO_GROUP3, REX_64IR(ir, xg), dest);[m
[31m-  ra_left(as, dest, ir->op1);[m
[31m-}[m
[31m-[m
[31m-static void asm_neg(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_XORPS);[m
[31m-  else[m
[31m-    asm_neg_not(as, ir, XOg_NEG);[m
[31m-}[m
[31m-[m
[31m-#define asm_abs(as, ir)		asm_fparith(as, ir, XO_ANDPS)[m
[31m-[m
[31m-static void asm_intmin_max(ASMState *as, IRIns *ir, int cc)[m
[31m-{[m
[31m-  Reg right, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  if (irref_isk(rref)) { lref = rref; rref = ir->op1; }[m
[31m-  right = ra_alloc1(as, rref, rset_exclude(RSET_GPR, dest));[m
[31m-  emit_rr(as, XO_CMOV + (cc<<24), REX_64IR(ir, dest), right);[m
[31m-  emit_rr(as, XO_CMP, REX_64IR(ir, dest), right);[m
[31m-  ra_left(as, dest, lref);[m
[31m-}[m
[31m-[m
[31m-static void asm_min(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_MINSD);[m
[31m-  else[m
[31m-    asm_intmin_max(as, ir, CC_G);[m
[31m-}[m
[31m-[m
[31m-static void asm_max(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_MAXSD);[m
[31m-  else[m
[31m-    asm_intmin_max(as, ir, CC_L);[m
[31m-}[m
[31m-[m
[31m-/* Note: don't use LEA for overflow-checking arithmetic! */[m
[31m-#define asm_addov(as, ir)	asm_intarith(as, ir, XOg_ADD)[m
[31m-#define asm_subov(as, ir)	asm_intarith(as, ir, XOg_SUB)[m
[31m-#define asm_mulov(as, ir)	asm_intarith(as, ir, XOg_X_IMUL)[m
[31m-[m
[31m-#define asm_bnot(as, ir)	asm_neg_not(as, ir, XOg_NOT)[m
[31m-[m
[31m-static void asm_bswap(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  as->mcp = emit_op(XO_BSWAP + ((dest&7) << 24),[m
[31m-		    REX_64IR(ir, 0), dest, 0, as->mcp, 1);[m
[31m-  ra_left(as, dest, ir->op1);[m
[31m-}[m
[31m-[m
[31m-#define asm_band(as, ir)	asm_intarith(as, ir, XOg_AND)[m
[31m-#define asm_bor(as, ir)		asm_intarith(as, ir, XOg_OR)[m
[31m-#define asm_bxor(as, ir)	asm_intarith(as, ir, XOg_XOR)[m
[31m-[m
[31m-static void asm_bitshift(ASMState *as, IRIns *ir, x86Shift xs, x86Op xv)[m
[31m-{[m
[31m-  IRRef rref = ir->op2;[m
[31m-  IRIns *irr = IR(rref);[m
[31m-  Reg dest;[m
[31m-  if (irref_isk(rref)) {  /* Constant shifts. */[m
[31m-    int shift;[m
[31m-    dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    shift = irr->i & (irt_is64(ir->t) ? 63 : 31);[m
[31m-    if (!xv && shift && (as->flags & JIT_F_BMI2)) {[m
[31m-      Reg left = asm_fuseloadm(as, ir->op1, RSET_GPR, irt_is64(ir->t));[m
[31m-      if (left != dest) {  /* BMI2 rotate right by constant. */[m
[31m-	emit_i8(as, xs == XOg_ROL ? -shift : shift);[m
[31m-	emit_mrm(as, VEX_64IR(ir, XV_RORX), dest, left);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    switch (shift) {[m
[31m-    case 0: break;[m
[31m-    case 1: emit_rr(as, XO_SHIFT1, REX_64IR(ir, xs), dest); break;[m
[31m-    default: emit_shifti(as, REX_64IR(ir, xs), dest, shift); break;[m
[31m-    }[m
[31m-  } else if ((as->flags & JIT_F_BMI2) && xv) {	/* BMI2 variable shifts. */[m
[31m-    Reg left, right;[m
[31m-    dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    right = ra_alloc1(as, rref, RSET_GPR);[m
[31m-    left = asm_fuseloadm(as, ir->op1, rset_exclude(RSET_GPR, right),[m
[31m-			 irt_is64(ir->t));[m
[31m-    emit_mrm(as, VEX_64IR(ir, xv) ^ (right << 19), dest, left);[m
[31m-    return;[m
[31m-  } else {  /* Variable shifts implicitly use register cl (i.e. ecx). */[m
[31m-    Reg right;[m
[31m-    dest = ra_dest(as, ir, rset_exclude(RSET_GPR, RID_ECX));[m
[31m-    if (dest == RID_ECX) {[m
[31m-      dest = ra_scratch(as, rset_exclude(RSET_GPR, RID_ECX));[m
[31m-      emit_rr(as, XO_MOV, RID_ECX, dest);[m
[31m-    }[m
[31m-    right = irr->r;[m
[31m-    if (ra_noreg(right))[m
[31m-      right = ra_allocref(as, rref, RID2RSET(RID_ECX));[m
[31m-    else if (right != RID_ECX)[m
[31m-      ra_scratch(as, RID2RSET(RID_ECX));[m
[31m-    emit_rr(as, XO_SHIFTcl, REX_64IR(ir, xs), dest);[m
[31m-    ra_noweak(as, right);[m
[31m-    if (right != RID_ECX)[m
[31m-      emit_rr(as, XO_MOV, RID_ECX, right);[m
[31m-  }[m
[31m-  ra_left(as, dest, ir->op1);[m
[31m-  /*[m
[31m-  ** Note: avoid using the flags resulting from a shift or rotate![m
[31m-  ** All of them cause a partial flag stall, except for r,1 shifts[m
[31m-  ** (but not rotates). And a shift count of 0 leaves the flags unmodified.[m
[31m-  */[m
[31m-}[m
[31m-[m
[31m-#define asm_bshl(as, ir)	asm_bitshift(as, ir, XOg_SHL, XV_SHLX)[m
[31m-#define asm_bshr(as, ir)	asm_bitshift(as, ir, XOg_SHR, XV_SHRX)[m
[31m-#define asm_bsar(as, ir)	asm_bitshift(as, ir, XOg_SAR, XV_SARX)[m
[31m-#define asm_brol(as, ir)	asm_bitshift(as, ir, XOg_ROL, 0)[m
[31m-#define asm_bror(as, ir)	asm_bitshift(as, ir, XOg_ROR, 0)[m
[31m-[m
[31m-/* -- Comparisons --------------------------------------------------------- */[m
[31m-[m
[31m-/* Virtual flags for unordered FP comparisons. */[m
[31m-#define VCC_U	0x1000		/* Unordered. */[m
[31m-#define VCC_P	0x2000		/* Needs extra CC_P branch. */[m
[31m-#define VCC_S	0x4000		/* Swap avoids CC_P branch. */[m
[31m-#define VCC_PS	(VCC_P|VCC_S)[m
[31m-[m
[31m-/* Map of comparisons to flags. ORDER IR. */[m
[31m-#define COMPFLAGS(ci, cin, cu, cf)	((ci)+((cu)<<4)+((cin)<<8)+(cf))[m
[31m-static const uint16_t asm_compmap[IR_ABC+1] = {[m
[31m-  /*                 signed non-eq unsigned flags */[m
[31m-  /* LT  */ COMPFLAGS(CC_GE, CC_G,  CC_AE, VCC_PS),[m
[31m-  /* GE  */ COMPFLAGS(CC_L,  CC_L,  CC_B,  0),[m
[31m-  /* LE  */ COMPFLAGS(CC_G,  CC_G,  CC_A,  VCC_PS),[m
[31m-  /* GT  */ COMPFLAGS(CC_LE, CC_L,  CC_BE, 0),[m
[31m-  /* ULT */ COMPFLAGS(CC_AE, CC_A,  CC_AE, VCC_U),[m
[31m-  /* UGE */ COMPFLAGS(CC_B,  CC_B,  CC_B,  VCC_U|VCC_PS),[m
[31m-  /* ULE */ COMPFLAGS(CC_A,  CC_A,  CC_A,  VCC_U),[m
[31m-  /* UGT */ COMPFLAGS(CC_BE, CC_B,  CC_BE, VCC_U|VCC_PS),[m
[31m-  /* EQ  */ COMPFLAGS(CC_NE, CC_NE, CC_NE, VCC_P),[m
[31m-  /* NE  */ COMPFLAGS(CC_E,  CC_E,  CC_E,  VCC_U|VCC_P),[m
[31m-  /* ABC */ COMPFLAGS(CC_BE, CC_B,  CC_BE, VCC_U|VCC_PS)  /* Same as UGT. */[m
[31m-};[m
[31m-[m
[31m-/* FP and integer comparisons. */[m
[31m-static void asm_comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  uint32_t cc = asm_compmap[ir->o];[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    IRRef lref = ir->op1;[m
[31m-    IRRef rref = ir->op2;[m
[31m-    Reg left, right;[m
[31m-    MCLabel l_around;[m
[31m-    /*[m
[31m-    ** An extra CC_P branch is required to preserve ordered/unordered[m
[31m-    ** semantics for FP comparisons. This can be avoided by swapping[m
[31m-    ** the operands and inverting the condition (except for EQ and UNE).[m
[31m-    ** So always try to swap if possible.[m
[31m-    **[m
[31m-    ** Another option would be to swap operands to achieve better memory[m
[31m-    ** operand fusion. But it's unlikely that this outweighs the cost[m
[31m-    ** of the extra branches.[m
[31m-    */[m
[31m-    if (cc & VCC_S) {  /* Swap? */[m
[31m-      IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-      cc ^= (VCC_PS|(5<<4));  /* A <-> B, AE <-> BE, PS <-> none */[m
[31m-    }[m
[31m-    left = ra_alloc1(as, lref, RSET_FPR);[m
[31m-    right = asm_fuseload(as, rref, rset_exclude(RSET_FPR, left));[m
[31m-    l_around = emit_label(as);[m
[31m-    asm_guardcc(as, cc >> 4);[m
[31m-    if (cc & VCC_P) {  /* Extra CC_P branch required? */[m
[31m-      if (!(cc & VCC_U)) {[m
[31m-	asm_guardcc(as, CC_P);  /* Branch to exit for ordered comparisons. */[m
[31m-      } else if (l_around != as->invmcp) {[m
[31m-	emit_sjcc(as, CC_P, l_around);  /* Branch around for unordered. */[m
[31m-      } else {[m
[31m-	/* Patched to mcloop by asm_loop_fixup. */[m
[31m-	as->loopinv = 2;[m
[31m-	if (as->realign)[m
[31m-	  emit_sjcc(as, CC_P, as->mcp);[m
[31m-	else[m
[31m-	  emit_jcc(as, CC_P, as->mcp);[m
[31m-      }[m
[31m-    }[m
[31m-    emit_mrm(as, XO_UCOMISD, left, right);[m
[31m-  } else {[m
[31m-    IRRef lref = ir->op1, rref = ir->op2;[m
[31m-    IROp leftop = (IROp)(IR(lref)->o);[m
[31m-    Reg r64 = REX_64IR(ir, 0);[m
[31m-    int32_t imm = 0;[m
[31m-    lua_assert(irt_is64(ir->t) || irt_isint(ir->t) ||[m
[31m-	       irt_isu32(ir->t) || irt_isaddr(ir->t) || irt_isu8(ir->t));[m
[31m-    /* Swap constants (only for ABC) and fusable loads to the right. */[m
[31m-    if (irref_isk(lref) || (!irref_isk(rref) && opisfusableload(leftop))) {[m
[31m-      if ((cc & 0xc) == 0xc) cc ^= 0x53;  /* L <-> G, LE <-> GE */[m
[31m-      else if ((cc & 0xa) == 0x2) cc ^= 0x55;  /* A <-> B, AE <-> BE */[m
[31m-      lref = ir->op2; rref = ir->op1;[m
[31m-    }[m
[31m-    if (asm_isk32(as, rref, &imm)) {[m
[31m-      IRIns *irl = IR(lref);[m
[31m-      /* Check wether we can use test ins. Not for unsigned, since CF=0. */[m
[31m-      int usetest = (imm == 0 && (cc & 0xa) != 0x2);[m
[31m-      if (usetest && irl->o == IR_BAND && irl+1 == ir && !ra_used(irl)) {[m
[31m-	/* Combine comp(BAND(ref, r/imm), 0) into test mrm, r/imm. */[m
[31m-	Reg right, left = RID_NONE;[m
[31m-	RegSet allow = RSET_GPR;[m
[31m-	if (!asm_isk32(as, irl->op2, &imm)) {[m
[31m-	  left = ra_alloc1(as, irl->op2, allow);[m
[31m-	  rset_clear(allow, left);[m
[31m-	} else {  /* Try to Fuse IRT_I8/IRT_U8 loads, too. See below. */[m
[31m-	  IRIns *irll = IR(irl->op1);[m
[31m-	  if (opisfusableload((IROp)irll->o) &&[m
[31m-	      (irt_isi8(irll->t) || irt_isu8(irll->t))) {[m
[31m-	    IRType1 origt = irll->t;  /* Temporarily flip types. */[m
[31m-	    irll->t.irt = (irll->t.irt & ~IRT_TYPE) | IRT_INT;[m
[31m-	    as->curins--;  /* Skip to BAND to avoid failing in noconflict(). */[m
[31m-	    right = asm_fuseload(as, irl->op1, RSET_GPR);[m
[31m-	    as->curins++;[m
[31m-	    irll->t = origt;[m
[31m-	    if (right != RID_MRM) goto test_nofuse;[m
[31m-	    /* Fusion succeeded, emit test byte mrm, imm8. */[m
[31m-	    asm_guardcc(as, cc);[m
[31m-	    emit_i8(as, (imm & 0xff));[m
[31m-	    emit_mrm(as, XO_GROUP3b, XOg_TEST, RID_MRM);[m
[31m-	    return;[m
[31m-	  }[m
[31m-	}[m
[31m-	as->curins--;  /* Skip to BAND to avoid failing in noconflict(). */[m
[31m-	right = asm_fuseloadm(as, irl->op1, allow, r64);[m
[31m-	as->curins++;  /* Undo the above. */[m
[31m-      test_nofuse:[m
[31m-	asm_guardcc(as, cc);[m
[31m-	if (ra_noreg(left)) {[m
[31m-	  emit_i32(as, imm);[m
[31m-	  emit_mrm(as, XO_GROUP3, r64 + XOg_TEST, right);[m
[31m-	} else {[m
[31m-	  emit_mrm(as, XO_TEST, r64 + left, right);[m
[31m-	}[m
[31m-      } else {[m
[31m-	Reg left;[m
[31m-	if (opisfusableload((IROp)irl->o) &&[m
[31m-	    ((irt_isu8(irl->t) && checku8(imm)) ||[m
[31m-	     ((irt_isi8(irl->t) || irt_isi16(irl->t)) && checki8(imm)) ||[m
[31m-	     (irt_isu16(irl->t) && checku16(imm) && checki8((int16_t)imm)))) {[m
[31m-	  /* Only the IRT_INT case is fused by asm_fuseload.[m
[31m-	  ** The IRT_I8/IRT_U8 loads and some IRT_I16/IRT_U16 loads[m
[31m-	  ** are handled here.[m
[31m-	  ** Note that cmp word [mem], imm16 should not be generated,[m
[31m-	  ** since it has a length-changing prefix. Compares of a word[m
[31m-	  ** against a sign-extended imm8 are ok, however.[m
[31m-	  */[m
[31m-	  IRType1 origt = irl->t;  /* Temporarily flip types. */[m
[31m-	  irl->t.irt = (irl->t.irt & ~IRT_TYPE) | IRT_INT;[m
[31m-	  left = asm_fuseload(as, lref, RSET_GPR);[m
[31m-	  irl->t = origt;[m
[31m-	  if (left == RID_MRM) {  /* Fusion succeeded? */[m
[31m-	    if (irt_isu8(irl->t) || irt_isu16(irl->t))[m
[31m-	      cc >>= 4;  /* Need unsigned compare. */[m
[31m-	    asm_guardcc(as, cc);[m
[31m-	    emit_i8(as, imm);[m
[31m-	    emit_mrm(as, (irt_isi8(origt) || irt_isu8(origt)) ?[m
[31m-			 XO_ARITHib : XO_ARITHiw8, r64 + XOg_CMP, RID_MRM);[m
[31m-	    return;[m
[31m-	  }  /* Otherwise handle register case as usual. */[m
[31m-	} else {[m
[31m-	  left = asm_fuseloadm(as, lref,[m
[31m-			       irt_isu8(ir->t) ? RSET_GPR8 : RSET_GPR, r64);[m
[31m-	}[m
[31m-	asm_guardcc(as, cc);[m
[31m-	if (usetest && left != RID_MRM) {[m
[31m-	  /* Use test r,r instead of cmp r,0. */[m
[31m-	  x86Op xo = XO_TEST;[m
[31m-	  if (irt_isu8(ir->t)) {[m
[31m-	    lua_assert(ir->o == IR_EQ || ir->o == IR_NE);[m
[31m-	    xo = XO_TESTb;[m
[31m-	    if (!rset_test(RSET_RANGE(RID_EAX, RID_EBX+1), left)) {[m
[31m-	      if (LJ_64) {[m
[31m-		left |= FORCE_REX;[m
[31m-	      } else {[m
[31m-		emit_i32(as, 0xff);[m
[31m-		emit_mrm(as, XO_GROUP3, XOg_TEST, left);[m
[31m-		return;[m
[31m-	      }[m
[31m-	    }[m
[31m-	  }[m
[31m-	  emit_rr(as, xo, r64 + left, left);[m
[31m-	  if (irl+1 == ir)  /* Referencing previous ins? */[m
[31m-	    as->flagmcp = as->mcp;  /* Set flag to drop test r,r if possible. */[m
[31m-	} else {[m
[31m-	  emit_gmrmi(as, XG_ARITHi(XOg_CMP), r64 + left, imm);[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      Reg right = asm_fuseloadm(as, rref, rset_exclude(RSET_GPR, left), r64);[m
[31m-      asm_guardcc(as, cc);[m
[31m-      emit_mrm(as, XO_CMP, r64 + left, right);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_equal(as, ir)	asm_comp(as, ir)[m
[31m-[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-/* 64 bit integer comparisons in 32 bit mode. */[m
[31m-static void asm_comp_int64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  uint32_t cc = asm_compmap[(ir-1)->o];[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg lefthi = RID_NONE, leftlo = RID_NONE;[m
[31m-  Reg righthi = RID_NONE, rightlo = RID_NONE;[m
[31m-  MCLabel l_around;[m
[31m-  x86ModRM mrm;[m
[31m-[m
[31m-  as->curins--;  /* Skip loword ins. Avoids failing in noconflict(), too. */[m
[31m-[m
[31m-  /* Allocate/fuse hiword operands. */[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    lefthi = asm_fuseload(as, ir->op1, allow);[m
[31m-  } else {[m
[31m-    lefthi = ra_alloc1(as, ir->op1, allow);[m
[31m-    rset_clear(allow, lefthi);[m
[31m-    righthi = asm_fuseload(as, ir->op2, allow);[m
[31m-    if (righthi == RID_MRM) {[m
[31m-      if (as->mrm.base != RID_NONE) rset_clear(allow, as->mrm.base);[m
[31m-      if (as->mrm.idx != RID_NONE) rset_clear(allow, as->mrm.idx);[m
[31m-    } else {[m
[31m-      rset_clear(allow, righthi);[m
[31m-    }[m
[31m-  }[m
[31m-  mrm = as->mrm;  /* Save state for hiword instruction. */[m
[31m-[m
[31m-  /* Allocate/fuse loword operands. */[m
[31m-  if (irref_isk((ir-1)->op2)) {[m
[31m-    leftlo = asm_fuseload(as, (ir-1)->op1, allow);[m
[31m-  } else {[m
[31m-    leftlo = ra_alloc1(as, (ir-1)->op1, allow);[m
[31m-    rset_clear(allow, leftlo);[m
[31m-    rightlo = asm_fuseload(as, (ir-1)->op2, allow);[m
[31m-  }[m
[31m-[m
[31m-  /* All register allocations must be performed _before_ this point. */[m
[31m-  l_around = emit_label(as);[m
[31m-  as->invmcp = as->flagmcp = NULL;  /* Cannot use these optimizations. */[m
[31m-[m
[31m-  /* Loword comparison and branch. */[m
[31m-  asm_guardcc(as, cc >> 4);  /* Always use unsigned compare for loword. */[m
[31m-  if (ra_noreg(rightlo)) {[m
[31m-    int32_t imm = IR((ir-1)->op2)->i;[m
[31m-    if (imm == 0 && ((cc >> 4) & 0xa) != 0x2 && leftlo != RID_MRM)[m
[31m-      emit_rr(as, XO_TEST, leftlo, leftlo);[m
[31m-    else[m
[31m-      emit_gmrmi(as, XG_ARITHi(XOg_CMP), leftlo, imm);[m
[31m-  } else {[m
[31m-    emit_mrm(as, XO_CMP, leftlo, rightlo);[m
[31m-  }[m
[31m-[m
[31m-  /* Hiword comparison and branches. */[m
[31m-  if ((cc & 15) != CC_NE)[m
[31m-    emit_sjcc(as, CC_NE, l_around);  /* Hiword unequal: skip loword compare. */[m
[31m-  if ((cc & 15) != CC_E)[m
[31m-    asm_guardcc(as, cc >> 8);  /* Hiword compare without equality check. */[m
[31m-  as->mrm = mrm;  /* Restore state. */[m
[31m-  if (ra_noreg(righthi)) {[m
[31m-    int32_t imm = IR(ir->op2)->i;[m
[31m-    if (imm == 0 && (cc & 0xa) != 0x2 && lefthi != RID_MRM)[m
[31m-      emit_rr(as, XO_TEST, lefthi, lefthi);[m
[31m-    else[m
[31m-      emit_gmrmi(as, XG_ARITHi(XOg_CMP), lefthi, imm);[m
[31m-  } else {[m
[31m-    emit_mrm(as, XO_CMP, lefthi, righthi);[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */[m
[31m-[m
[31m-/* Hiword op of a split 64 bit op. Previous op must be the loword op. */[m
[31m-static void asm_hiop(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-  /* HIOP is marked as a store because it needs its own DCE logic. */[m
[31m-  int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */[m
[31m-  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;[m
[31m-  if ((ir-1)->o == IR_CONV) {  /* Conversions to/from 64 bit. */[m
[31m-    as->curins--;  /* Always skip the CONV. */[m
[31m-    if (usehi || uselo)[m
[31m-      asm_conv64(as, ir);[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o <= IR_NE) {  /* 64 bit integer comparisons. ORDER IR. */[m
[31m-    asm_comp_int64(as, ir);[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o == IR_XSTORE) {[m
[31m-    if ((ir-1)->r != RID_SINK)[m
[31m-      asm_fxstore(as, ir);[m
[31m-    return;[m
[31m-  }[m
[31m-  if (!usehi) return;  /* Skip unused hiword op for all remaining ops. */[m
[31m-  switch ((ir-1)->o) {[m
[31m-  case IR_ADD:[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->curins--;[m
[31m-    asm_intarith(as, ir, XOg_ADC);[m
[31m-    asm_intarith(as, ir-1, XOg_ADD);[m
[31m-    break;[m
[31m-  case IR_SUB:[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->curins--;[m
[31m-    asm_intarith(as, ir, XOg_SBB);[m
[31m-    asm_intarith(as, ir-1, XOg_SUB);[m
[31m-    break;[m
[31m-  case IR_NEG: {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    emit_rr(as, XO_GROUP3, XOg_NEG, dest);[m
[31m-    emit_i8(as, 0);[m
[31m-    emit_rr(as, XO_ARITHi8, XOg_ADC, dest);[m
[31m-    ra_left(as, dest, ir->op1);[m
[31m-    as->curins--;[m
[31m-    asm_neg_not(as, ir-1, XOg_NEG);[m
[31m-    break;[m
[31m-    }[m
[31m-  case IR_CALLN:[m
[31m-  case IR_CALLXS:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RID2RSET(RID_RETLO));  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-  case IR_CNEWI:[m
[31m-    /* Nothing to do here. Handled by CNEWI itself. */[m
[31m-    break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(as); UNUSED(ir); lua_assert(0);  /* Unused on x64 or without FFI. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_prof(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_i8(as, HOOK_PROFILE);[m
[31m-  emit_rma(as, XO_GROUP3b, XOg_TEST, &J2G(as->J)->hookmask);[m
[31m-}[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check Lua stack size for overflow. Use exit handler as fallback. */[m
[31m-static void asm_stack_check(ASMState *as, BCReg topslot,[m
[31m-			    IRIns *irp, RegSet allow, ExitNo exitno)[m
[31m-{[m
[31m-  /* Try to get an unused temp. register, otherwise spill/restore eax. */[m
[31m-  Reg pbase = irp ? irp->r : RID_BASE;[m
[31m-  Reg r = allow ? rset_pickbot(allow) : RID_EAX;[m
[31m-  emit_jcc(as, CC_B, exitstub_addr(as->J, exitno));[m
[31m-  if (allow == RSET_EMPTY)  /* Restore temp. register. */[m
[31m-    emit_rmro(as, XO_MOV, r|REX_64, RID_ESP, 0);[m
[31m-  else[m
[31m-    ra_modified(as, r);[m
[31m-  emit_gri(as, XG_ARITHi(XOg_CMP), r, (int32_t)(8*topslot));[m
[31m-  if (ra_hasreg(pbase) && pbase != r)[m
[31m-    emit_rr(as, XO_ARITH(XOg_SUB), r, pbase);[m
[31m-  else[m
[31m-    emit_rmro(as, XO_ARITH(XOg_SUB), r, RID_NONE,[m
[31m-	      ptr2addr(&J2G(as->J)->jit_base));[m
[31m-  emit_rmro(as, XO_MOV, r, r, offsetof(lua_State, maxstack));[m
[31m-  emit_getgl(as, r, cur_L);[m
[31m-  if (allow == RSET_EMPTY)  /* Spill temp. register. */[m
[31m-    emit_rmro(as, XO_MOVto, r|REX_64, RID_ESP, 0);[m
[31m-}[m
[31m-[m
[31m-/* Restore Lua stack from on-trace state. */[m
[31m-static void asm_stack_restore(ASMState *as, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  /* Store the value of all modified slots to the Lua stack. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    int32_t ofs = 8*((int32_t)s-1);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if ((sn & SNAP_NORESTORE))[m
[31m-      continue;[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-      emit_rmro(as, XO_MOVSDto, src, RID_BASE, ofs);[m
[31m-    } else {[m
[31m-      lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) ||[m
[31m-		 (LJ_DUALNUM && irt_isinteger(ir->t)));[m
[31m-      if (!irref_isk(ref)) {[m
[31m-	Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, RID_BASE));[m
[31m-	emit_movtomro(as, REX_64IR(ir, src), RID_BASE, ofs);[m
[31m-      } else if (!irt_ispri(ir->t)) {[m
[31m-	emit_movmroi(as, RID_BASE, ofs, ir->i);[m
[31m-      }[m
[31m-      if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	if (s != 0)  /* Do not overwrite link to previous frame. */[m
[31m-	  emit_movmroi(as, RID_BASE, ofs+4, (int32_t)(*flinks--));[m
[31m-      } else {[m
[31m-	if (!(LJ_64 && irt_islightud(ir->t)))[m
[31m-	  emit_movmroi(as, RID_BASE, ofs+4, irt_toitype(ir->t));[m
[31m-      }[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-}[m
[31m-[m
[31m-/* -- GC handling --------------------------------------------------------- */[m
[31m-[m
[31m-/* Check GC threshold and do one or more GC steps. */[m
[31m-static void asm_gc_check(ASMState *as)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg tmp;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */[m
[31m-  asm_guardcc(as, CC_NE);  /* Assumes asm_snap_prep() already done. */[m
[31m-  emit_rr(as, XO_TEST, RID_RET, RID_RET);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ASMREF_TMP2;  /* MSize steps     */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  tmp = ra_releasetmp(as, ASMREF_TMP1);[m
[31m-  emit_loada(as, tmp, J2G(as->J));[m
[31m-  emit_loadi(as, ra_releasetmp(as, ASMREF_TMP2), as->gcsteps);[m
[31m-  /* Jump around GC step if GC total < GC threshold. */[m
[31m-  emit_sjcc(as, CC_B, l_end);[m
[31m-  emit_opgl(as, XO_ARITH(XOg_CMP), tmp, gc.threshold);[m
[31m-  emit_getgl(as, tmp, gc.total);[m
[31m-  as->gcsteps = 0;[m
[31m-  checkmclim(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Loop handling ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the loop branch. */[m
[31m-static void asm_loop_fixup(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target = as->mcp;[m
[31m-  if (as->realign) {  /* Realigned loops use short jumps. */[m
[31m-    as->realign = NULL;  /* Stop another retry. */[m
[31m-    lua_assert(((intptr_t)target & 15) == 0);[m
[31m-    if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-      p -= 5;[m
[31m-      p[0] = XI_JMP;[m
[31m-      lua_assert(target - p >= -128);[m
[31m-      p[-1] = (MCode)(target - p);  /* Patch sjcc. */[m
[31m-      if (as->loopinv == 2)[m
[31m-	p[-3] = (MCode)(target - p + 2);  /* Patch opt. short jp. */[m
[31m-    } else {[m
[31m-      lua_assert(target - p >= -128);[m
[31m-      p[-1] = (MCode)(int8_t)(target - p);  /* Patch short jmp. */[m
[31m-      p[-2] = XI_JMPs;[m
[31m-    }[m
[31m-  } else {[m
[31m-    MCode *newloop;[m
[31m-    p[-5] = XI_JMP;[m
[31m-    if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-      /* asm_guardcc already inverted the jcc and patched the jmp. */[m
[31m-      p -= 5;[m
[31m-      newloop = target+4;[m
[31m-      *(int32_t *)(p-4) = (int32_t)(target - p);  /* Patch jcc. */[m
[31m-      if (as->loopinv == 2) {[m
[31m-	*(int32_t *)(p-10) = (int32_t)(target - p + 6);  /* Patch opt. jp. */[m
[31m-	newloop = target+8;[m
[31m-      }[m
[31m-    } else {  /* Otherwise just patch jmp. */[m
[31m-      *(int32_t *)(p-4) = (int32_t)(target - p);[m
[31m-      newloop = target+3;[m
[31m-    }[m
[31m-    /* Realign small loops and shorten the loop branch. */[m
[31m-    if (newloop >= p - 128) {[m
[31m-      as->realign = newloop;  /* Force a retry and remember alignment. */[m
[31m-      as->curins = as->stopins;  /* Abort asm_trace now. */[m
[31m-      as->T->nins = as->orignins;  /* Remove any added renames. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Coalesce BASE register for a root trace. */[m
[31m-static void asm_head_root_base(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (r != RID_BASE)[m
[31m-      emit_rr(as, XO_MOV, r, RID_BASE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Coalesce or reload BASE register for a side trace. */[m
[31m-static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (irp->r == r) {[m
[31m-      rset_clear(allow, r);  /* Mark same BASE register as coalesced. */[m
[31m-    } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) {[m
[31m-      rset_clear(allow, irp->r);[m
[31m-      emit_rr(as, XO_MOV, r, irp->r);  /* Move from coalesced parent reg. */[m
[31m-    } else {[m
[31m-      emit_getgl(as, r, jit_base);  /* Otherwise reload BASE. */[m
[31m-    }[m
[31m-  }[m
[31m-  return allow;[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the tail code. */[m
[31m-static void asm_tail_fixup(ASMState *as, TraceNo lnk)[m
[31m-{[m
[31m-  /* Note: don't use as->mcp swap + emit_*: emit_op overwrites more bytes. */[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target, *q;[m
[31m-  int32_t spadj = as->T->spadjust;[m
[31m-  if (spadj == 0) {[m
[31m-    p -= ((as->flags & JIT_F_LEA_AGU) ? 7 : 6) + (LJ_64 ? 1 : 0);[m
[31m-  } else {[m
[31m-    MCode *p1;[m
[31m-    /* Patch stack adjustment. */[m
[31m-    if (checki8(spadj)) {[m
[31m-      p -= 3;[m
[31m-      p1 = p-6;[m
[31m-      *p1 = (MCode)spadj;[m
[31m-    } else {[m
[31m-      p1 = p-9;[m
[31m-      *(int32_t *)p1 = spadj;[m
[31m-    }[m
[31m-    if ((as->flags & JIT_F_LEA_AGU)) {[m
[31m-#if LJ_64[m
[31m-      p1[-4] = 0x48;[m
[31m-#endif[m
[31m-      p1[-3] = (MCode)XI_LEA;[m
[31m-      p1[-2] = MODRM(checki8(spadj) ? XM_OFS8 : XM_OFS32, RID_ESP, RID_ESP);[m
[31m-      p1[-1] = MODRM(XM_SCALE1, RID_ESP, RID_ESP);[m
[31m-    } else {[m
[31m-#if LJ_64[m
[31m-      p1[-3] = 0x48;[m
[31m-#endif[m
[31m-      p1[-2] = (MCode)(checki8(spadj) ? XI_ARITHi8 : XI_ARITHi);[m
[31m-      p1[-1] = MODRM(XM_REG, XOg_ADD, RID_ESP);[m
[31m-    }[m
[31m-  }[m
[31m-  /* Patch exit branch. */[m
[31m-  target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;[m
[31m-  *(int32_t *)(p-4) = jmprel(p, target);[m
[31m-  p[-5] = XI_JMP;[m
[31m-  /* Drop unused mcode tail. Fill with NOPs to make the prefetcher happy. */[m
[31m-  for (q = as->mctop-1; q >= p; q--)[m
[31m-    *q = XI_NOP;[m
[31m-  as->mctop = p;[m
[31m-}[m
[31m-[m
[31m-/* Prepare tail of code. */[m
[31m-static void asm_tail_prep(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  /* Realign and leave room for backwards loop branch or exit branch. */[m
[31m-  if (as->realign) {[m
[31m-    int i = ((int)(intptr_t)as->realign) & 15;[m
[31m-    /* Fill unused mcode tail with NOPs to make the prefetcher happy. */[m
[31m-    while (i-- > 0)[m
[31m-      *--p = XI_NOP;[m
[31m-    as->mctop = p;[m
[31m-    p -= (as->loopinv ? 5 : 2);  /* Space for short/near jmp. */[m
[31m-  } else {[m
[31m-    p -= 5;  /* Space for exit branch (near jmp). */[m
[31m-  }[m
[31m-  if (as->loopref) {[m
[31m-    as->invmcp = as->mcp = p;[m
[31m-  } else {[m
[31m-    /* Leave room for ESP adjustment: add esp, imm or lea esp, [esp+imm] */[m
[31m-    as->mcp = p - (((as->flags & JIT_F_LEA_AGU) ? 7 : 6)  + (LJ_64 ? 1 : 0));[m
[31m-    as->invmcp = NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Ensure there are enough stack slots for call arguments. */[m
[31m-static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  int nslots;[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  nslots = asm_count_call_slots(as, ci, args);[m
[31m-  if (nslots > as->evenspill)  /* Leave room for args in stack slots. */[m
[31m-    as->evenspill = nslots;[m
[31m-#if LJ_64[m
[31m-  return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET);[m
[31m-#else[m
[31m-  return irt_isfp(ir->t) ? REGSP_INIT : REGSP_HINT(RID_RET);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Target-specific setup. */[m
[31m-static void asm_setup_target(ASMState *as)[m
[31m-{[m
[31m-  asm_exitstub_setup(as, as->T->nsnap);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace patching ------------------------------------------------------ */[m
[31m-[m
[31m-static const uint8_t map_op1[256] = {[m
[31m-0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x20,[m
[31m-0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,[m
[31m-0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,[m
[31m-0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,[m
[31m-#if LJ_64[m
[31m-0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,[m
[31m-#else[m
[31m-0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,[m
[31m-#endif[m
[31m-0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,[m
[31m-0x51,0x51,0x92,0x92,0x10,0x10,0x12,0x11,0x45,0x86,0x52,0x93,0x51,0x51,0x51,0x51,[m
[31m-0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,[m
[31m-0x93,0x86,0x93,0x93,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,[m
[31m-0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x47,0x51,0x51,0x51,0x51,0x51,[m
[31m-#if LJ_64[m
[31m-0x59,0x59,0x59,0x59,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51,[m
[31m-#else[m
[31m-0x55,0x55,0x55,0x55,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51,[m
[31m-#endif[m
[31m-0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,[m
[31m-0x93,0x93,0x53,0x51,0x70,0x71,0x93,0x86,0x54,0x51,0x53,0x51,0x51,0x52,0x51,0x51,[m
[31m-0x92,0x92,0x92,0x92,0x52,0x52,0x51,0x51,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,[m
[31m-0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x45,0x45,0x47,0x52,0x51,0x51,0x51,0x51,[m
[31m-0x10,0x51,0x10,0x10,0x51,0x51,0x63,0x66,0x51,0x51,0x51,0x51,0x51,0x51,0x92,0x92[m
[31m-};[m
[31m-[m
[31m-static const uint8_t map_op2[256] = {[m
[31m-0x93,0x93,0x93,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x93,0x52,0x94,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x34,0x51,0x35,0x51,0x51,0x51,0x51,0x51,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x94,0x54,0x54,0x54,0x93,0x93,0x93,0x52,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x52,0x52,0x52,0x93,0x94,0x93,0x51,0x51,0x52,0x52,0x52,0x93,0x94,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x94,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x94,0x93,0x94,0x94,0x94,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x52[m
[31m-};[m
[31m-[m
[31m-static uint32_t asm_x86_inslen(const uint8_t* p)[m
[31m-{[m
[31m-  uint32_t result = 0;[m
[31m-  uint32_t prefixes = 0;[m
[31m-  uint32_t x = map_op1[*p];[m
[31m-  for (;;) {[m
[31m-    switch (x >> 4) {[m
[31m-    case 0: return result + x + (prefixes & 4);[m
[31m-    case 1: prefixes |= x; x = map_op1[*++p]; result++; break;[m
[31m-    case 2: x = map_op2[*++p]; break;[m
[31m-    case 3: p++; goto mrm;[m
[31m-    case 4: result -= (prefixes & 2);  /* fallthrough */[m
[31m-    case 5: return result + (x & 15);[m
[31m-    case 6:  /* Group 3. */[m
[31m-      if (p[1] & 0x38) x = 2;[m
[31m-      else if ((prefixes & 2) && (x == 0x66)) x = 4;[m
[31m-      goto mrm;[m
[31m-    case 7: /* VEX c4/c5. */[m
[31m-      if (LJ_32 && p[1] < 0xc0) {[m
[31m-	x = 2;[m
[31m-	goto mrm;[m
[31m-      }[m
[31m-      if (x == 0x70) {[m
[31m-	x = *++p & 0x1f;[m
[31m-	result++;[m
[31m-	if (x >= 2) {[m
[31m-	  p += 2;[m
[31m-	  result += 2;[m
[31m-	  goto mrm;[m
[31m-	}[m
[31m-      }[m
[31m-      p++;[m
[31m-      result++;[m
[31m-      x = map_op2[*++p];[m
[31m-      break;[m
[31m-    case 8: result -= (prefixes & 2);  /* fallthrough */[m
[31m-    case 9: mrm:  /* ModR/M and possibly SIB. */[m
[31m-      result += (x & 15);[m
[31m-      x = *++p;[m
[31m-      switch (x >> 6) {[m
[31m-      case 0: if ((x & 7) == 5) return result + 4; break;[m
[31m-      case 1: result++; break;[m
[31m-      case 2: result += 4; break;[m
[31m-      case 3: return result;[m
[31m-      }[m
[31m-      if ((x & 7) == 4) {[m
[31m-	result++;[m
[31m-	if (x < 0x40 && (p[1] & 7) == 5) result += 4;[m
[31m-      }[m
[31m-      return result;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Patch exit jumps of existing machine code to a new target. */[m
[31m-void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)[m
[31m-{[m
[31m-  MCode *p = T->mcode;[m
[31m-  MCode *mcarea = lj_mcode_patch(J, p, 0);[m
[31m-  MSize len = T->szmcode;[m
[31m-  MCode *px = exitstub_addr(J, exitno) - 6;[m
[31m-  MCode *pe = p+len-6;[m
[31m-  uint32_t stateaddr = u32ptr(&J2G(J)->vmstate);[m
[31m-  if (len > 5 && p[len-5] == XI_JMP && p+len-6 + *(int32_t *)(p+len-4) == px)[m
[31m-    *(int32_t *)(p+len-4) = jmprel(p+len, target);[m
[31m-  /* Do not patch parent exit for a stack check. Skip beyond vmstate update. */[m
[31m-  for (; p < pe; p += asm_x86_inslen(p))[m
[31m-    if (*(uint32_t *)(p+(LJ_64 ? 3 : 2)) == stateaddr && p[0] == XI_MOVmi)[m
[31m-      break;[m
[31m-  lua_assert(p < pe);[m
[31m-  for (; p < pe; p += asm_x86_inslen(p))[m
[31m-    if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px)[m
[31m-      *(int32_t *)(p+2) = jmprel(p+6, target);[m
[31m-  lj_mcode_sync(T->mcode, T->mcode + T->szmcode);[m
[31m-  lj_mcode_patch(J, mcarea, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.c[m
[1mdeleted file mode 100644[m
[1mindex f038769..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.c[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode instruction modes.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_bc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_bc.h"[m
[31m-[m
[31m-/* Bytecode offsets and bytecode instruction modes. */[m
[31m-#include "lj_bcdef.h"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.h[m
[1mdeleted file mode 100644[m
[1mindex 7882606..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bc.h[m
[1m+++ /dev/null[m
[36m@@ -1,265 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode instruction format.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_BC_H[m
[31m-#define _LJ_BC_H[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-/* Bytecode instruction format, 32 bit wide, fields of 8 or 16 bit:[m
[31m-**[m
[31m-** +----+----+----+----+[m
[31m-** | B  | C  | A  | OP | Format ABC[m
[31m-** +----+----+----+----+[m
[31m-** |    D    | A  | OP | Format AD[m
[31m-** +--------------------[m
[31m-** MSB               LSB[m
[31m-**[m
[31m-** In-memory instructions are always stored in host byte order.[m
[31m-*/[m
[31m-[m
[31m-/* Operand ranges and related constants. */[m
[31m-#define BCMAX_A		0xff[m
[31m-#define BCMAX_B		0xff[m
[31m-#define BCMAX_C		0xff[m
[31m-#define BCMAX_D		0xffff[m
[31m-#define BCBIAS_J	0x8000[m
[31m-#define NO_REG		BCMAX_A[m
[31m-#define NO_JMP		(~(BCPos)0)[m
[31m-[m
[31m-/* Macros to get instruction fields. */[m
[31m-#define bc_op(i)	((BCOp)((i)&0xff))[m
[31m-#define bc_a(i)		((BCReg)(((i)>>8)&0xff))[m
[31m-#define bc_b(i)		((BCReg)((i)>>24))[m
[31m-#define bc_c(i)		((BCReg)(((i)>>16)&0xff))[m
[31m-#define bc_d(i)		((BCReg)((i)>>16))[m
[31m-#define bc_j(i)		((ptrdiff_t)bc_d(i)-BCBIAS_J)[m
[31m-[m
[31m-/* Macros to set instruction fields. */[m
[31m-#define setbc_byte(p, x, ofs) \[m
[31m-  ((uint8_t *)(p))[LJ_ENDIAN_SELECT(ofs, 3-ofs)] = (uint8_t)(x)[m
[31m-#define setbc_op(p, x)	setbc_byte(p, (x), 0)[m
[31m-#define setbc_a(p, x)	setbc_byte(p, (x), 1)[m
[31m-#define setbc_b(p, x)	setbc_byte(p, (x), 3)[m
[31m-#define setbc_c(p, x)	setbc_byte(p, (x), 2)[m
[31m-#define setbc_d(p, x) \[m
[31m-  ((uint16_t *)(p))[LJ_ENDIAN_SELECT(1, 0)] = (uint16_t)(x)[m
[31m-#define setbc_j(p, x)	setbc_d(p, (BCPos)((int32_t)(x)+BCBIAS_J))[m
[31m-[m
[31m-/* Macros to compose instructions. */[m
[31m-#define BCINS_ABC(o, a, b, c) \[m
[31m-  (((BCIns)(o))|((BCIns)(a)<<8)|((BCIns)(b)<<24)|((BCIns)(c)<<16))[m
[31m-#define BCINS_AD(o, a, d) \[m
[31m-  (((BCIns)(o))|((BCIns)(a)<<8)|((BCIns)(d)<<16))[m
[31m-#define BCINS_AJ(o, a, j)	BCINS_AD(o, a, (BCPos)((int32_t)(j)+BCBIAS_J))[m
[31m-[m
[31m-/* Bytecode instruction definition. Order matters, see below.[m
[31m-**[m
[31m-** (name, filler, Amode, Bmode, Cmode or Dmode, metamethod)[m
[31m-**[m
[31m-** The opcode name suffixes specify the type for RB/RC or RD:[m
[31m-** V = variable slot[m
[31m-** S = string const[m
[31m-** N = number const[m
[31m-** P = primitive type (~itype)[m
[31m-** B = unsigned byte literal[m
[31m-** M = multiple args/results[m
[31m-*/[m
[31m-#define BCDEF(_) \[m
[31m-  /* Comparison ops. ORDER OPR. */ \[m
[31m-  _(ISLT,	var,	___,	var,	lt) \[m
[31m-  _(ISGE,	var,	___,	var,	lt) \[m
[31m-  _(ISLE,	var,	___,	var,	le) \[m
[31m-  _(ISGT,	var,	___,	var,	le) \[m
[31m-  \[m
[31m-  _(ISEQV,	var,	___,	var,	eq) \[m
[31m-  _(ISNEV,	var,	___,	var,	eq) \[m
[31m-  _(ISEQS,	var,	___,	str,	eq) \[m
[31m-  _(ISNES,	var,	___,	str,	eq) \[m
[31m-  _(ISEQN,	var,	___,	num,	eq) \[m
[31m-  _(ISNEN,	var,	___,	num,	eq) \[m
[31m-  _(ISEQP,	var,	___,	pri,	eq) \[m
[31m-  _(ISNEP,	var,	___,	pri,	eq) \[m
[31m-  \[m
[31m-  /* Unary test and copy ops. */ \[m
[31m-  _(ISTC,	dst,	___,	var,	___) \[m
[31m-  _(ISFC,	dst,	___,	var,	___) \[m
[31m-  _(IST,	___,	___,	var,	___) \[m
[31m-  _(ISF,	___,	___,	var,	___) \[m
[31m-  _(ISTYPE,	var,	___,	lit,	___) \[m
[31m-  _(ISNUM,	var,	___,	lit,	___) \[m
[31m-  \[m
[31m-  /* Unary ops. */ \[m
[31m-  _(MOV,	dst,	___,	var,	___) \[m
[31m-  _(NOT,	dst,	___,	var,	___) \[m
[31m-  _(UNM,	dst,	___,	var,	unm) \[m
[31m-  _(LEN,	dst,	___,	var,	len) \[m
[31m-  \[m
[31m-  /* Binary ops. ORDER OPR. VV last, POW must be next. */ \[m
[31m-  _(ADDVN,	dst,	var,	num,	add) \[m
[31m-  _(SUBVN,	dst,	var,	num,	sub) \[m
[31m-  _(MULVN,	dst,	var,	num,	mul) \[m
[31m-  _(DIVVN,	dst,	var,	num,	div) \[m
[31m-  _(MODVN,	dst,	var,	num,	mod) \[m
[31m-  \[m
[31m-  _(ADDNV,	dst,	var,	num,	add) \[m
[31m-  _(SUBNV,	dst,	var,	num,	sub) \[m
[31m-  _(MULNV,	dst,	var,	num,	mul) \[m
[31m-  _(DIVNV,	dst,	var,	num,	div) \[m
[31m-  _(MODNV,	dst,	var,	num,	mod) \[m
[31m-  \[m
[31m-  _(ADDVV,	dst,	var,	var,	add) \[m
[31m-  _(SUBVV,	dst,	var,	var,	sub) \[m
[31m-  _(MULVV,	dst,	var,	var,	mul) \[m
[31m-  _(DIVVV,	dst,	var,	var,	div) \[m
[31m-  _(MODVV,	dst,	var,	var,	mod) \[m
[31m-  \[m
[31m-  _(POW,	dst,	var,	var,	pow) \[m
[31m-  _(CAT,	dst,	rbase,	rbase,	concat) \[m
[31m-  \[m
[31m-  /* Constant ops. */ \[m
[31m-  _(KSTR,	dst,	___,	str,	___) \[m
[31m-  _(KCDATA,	dst,	___,	cdata,	___) \[m
[31m-  _(KSHORT,	dst,	___,	lits,	___) \[m
[31m-  _(KNUM,	dst,	___,	num,	___) \[m
[31m-  _(KPRI,	dst,	___,	pri,	___) \[m
[31m-  _(KNIL,	base,	___,	base,	___) \[m
[31m-  \[m
[31m-  /* Upvalue and function ops. */ \[m
[31m-  _(UGET,	dst,	___,	uv,	___) \[m
[31m-  _(USETV,	uv,	___,	var,	___) \[m
[31m-  _(USETS,	uv,	___,	str,	___) \[m
[31m-  _(USETN,	uv,	___,	num,	___) \[m
[31m-  _(USETP,	uv,	___,	pri,	___) \[m
[31m-  _(UCLO,	rbase,	___,	jump,	___) \[m
[31m-  _(FNEW,	dst,	___,	func,	gc) \[m
[31m-  \[m
[31m-  /* Table ops. */ \[m
[31m-  _(TNEW,	dst,	___,	lit,	gc) \[m
[31m-  _(TDUP,	dst,	___,	tab,	gc) \[m
[31m-  _(GGET,	dst,	___,	str,	index) \[m
[31m-  _(GSET,	var,	___,	str,	newindex) \[m
[31m-  _(TGETV,	dst,	var,	var,	index) \[m
[31m-  _(TGETS,	dst,	var,	str,	index) \[m
[31m-  _(TGETB,	dst,	var,	lit,	index) \[m
[31m-  _(TGETR,	dst,	var,	var,	index) \[m
[31m-  _(TSETV,	var,	var,	var,	newindex) \[m
[31m-  _(TSETS,	var,	var,	str,	newindex) \[m
[31m-  _(TSETB,	var,	var,	lit,	newindex) \[m
[31m-  _(TSETM,	base,	___,	num,	newindex) \[m
[31m-  _(TSETR,	var,	var,	var,	newindex) \[m
[31m-  \[m
[31m-  /* Calls and vararg handling. T = tail call. */ \[m
[31m-  _(CALLM,	base,	lit,	lit,	call) \[m
[31m-  _(CALL,	base,	lit,	lit,	call) \[m
[31m-  _(CALLMT,	base,	___,	lit,	call) \[m
[31m-  _(CALLT,	base,	___,	lit,	call) \[m
[31m-  _(ITERC,	base,	lit,	lit,	call) \[m
[31m-  _(ITERN,	base,	lit,	lit,	call) \[m
[31m-  _(VARG,	base,	lit,	lit,	___) \[m
[31m-  _(ISNEXT,	base,	___,	jump,	___) \[m
[31m-  \[m
[31m-  /* Returns. */ \[m
[31m-  _(RETM,	base,	___,	lit,	___) \[m
[31m-  _(RET,	rbase,	___,	lit,	___) \[m
[31m-  _(RET0,	rbase,	___,	lit,	___) \[m
[31m-  _(RET1,	rbase,	___,	lit,	___) \[m
[31m-  \[m
[31m-  /* Loops and branches. I/J = interp/JIT, I/C/L = init/call/loop. */ \[m
[31m-  _(FORI,	base,	___,	jump,	___) \[m
[31m-  _(JFORI,	base,	___,	jump,	___) \[m
[31m-  \[m
[31m-  _(FORL,	base,	___,	jump,	___) \[m
[31m-  _(IFORL,	base,	___,	jump,	___) \[m
[31m-  _(JFORL,	base,	___,	lit,	___) \[m
[31m-  \[m
[31m-  _(ITERL,	base,	___,	jump,	___) \[m
[31m-  _(IITERL,	base,	___,	jump,	___) \[m
[31m-  _(JITERL,	base,	___,	lit,	___) \[m
[31m-  \[m
[31m-  _(LOOP,	rbase,	___,	jump,	___) \[m
[31m-  _(ILOOP,	rbase,	___,	jump,	___) \[m
[31m-  _(JLOOP,	rbase,	___,	lit,	___) \[m
[31m-  \[m
[31m-  _(JMP,	rbase,	___,	jump,	___) \[m
[31m-  \[m
[31m-  /* Function headers. I/J = interp/JIT, F/V/C = fixarg/vararg/C func. */ \[m
[31m-  _(FUNCF,	rbase,	___,	___,	___) \[m
[31m-  _(IFUNCF,	rbase,	___,	___,	___) \[m
[31m-  _(JFUNCF,	rbase,	___,	lit,	___) \[m
[31m-  _(FUNCV,	rbase,	___,	___,	___) \[m
[31m-  _(IFUNCV,	rbase,	___,	___,	___) \[m
[31m-  _(JFUNCV,	rbase,	___,	lit,	___) \[m
[31m-  _(FUNCC,	rbase,	___,	___,	___) \[m
[31m-  _(FUNCCW,	rbase,	___,	___,	___)[m
[31m-[m
[31m-/* Bytecode opcode numbers. */[m
[31m-typedef enum {[m
[31m-#define BCENUM(name, ma, mb, mc, mt)	BC_##name,[m
[31m-BCDEF(BCENUM)[m
[31m-#undef BCENUM[m
[31m-  BC__MAX[m
[31m-} BCOp;[m
[31m-[m
[31m-LJ_STATIC_ASSERT((int)BC_ISEQV+1 == (int)BC_ISNEV);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISEQV^1) == (int)BC_ISNEV);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISEQS^1) == (int)BC_ISNES);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISEQN^1) == (int)BC_ISNEN);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISEQP^1) == (int)BC_ISNEP);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISLT^1) == (int)BC_ISGE);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISLE^1) == (int)BC_ISGT);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISLT^3) == (int)BC_ISGT);[m
[31m-LJ_STATIC_ASSERT((int)BC_IST-(int)BC_ISTC == (int)BC_ISF-(int)BC_ISFC);[m
[31m-LJ_STATIC_ASSERT((int)BC_CALLT-(int)BC_CALL == (int)BC_CALLMT-(int)BC_CALLM);[m
[31m-LJ_STATIC_ASSERT((int)BC_CALLMT + 1 == (int)BC_CALLT);[m
[31m-LJ_STATIC_ASSERT((int)BC_RETM + 1 == (int)BC_RET);[m
[31m-LJ_STATIC_ASSERT((int)BC_FORL + 1 == (int)BC_IFORL);[m
[31m-LJ_STATIC_ASSERT((int)BC_FORL + 2 == (int)BC_JFORL);[m
[31m-LJ_STATIC_ASSERT((int)BC_ITERL + 1 == (int)BC_IITERL);[m
[31m-LJ_STATIC_ASSERT((int)BC_ITERL + 2 == (int)BC_JITERL);[m
[31m-LJ_STATIC_ASSERT((int)BC_LOOP + 1 == (int)BC_ILOOP);[m
[31m-LJ_STATIC_ASSERT((int)BC_LOOP + 2 == (int)BC_JLOOP);[m
[31m-LJ_STATIC_ASSERT((int)BC_FUNCF + 1 == (int)BC_IFUNCF);[m
[31m-LJ_STATIC_ASSERT((int)BC_FUNCF + 2 == (int)BC_JFUNCF);[m
[31m-LJ_STATIC_ASSERT((int)BC_FUNCV + 1 == (int)BC_IFUNCV);[m
[31m-LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV);[m
[31m-[m
[31m-/* This solves a circular dependency problem, change as needed. */[m
[31m-#define FF_next_N	4[m
[31m-[m
[31m-/* Stack slots used by FORI/FORL, relative to operand A. */[m
[31m-enum {[m
[31m-  FORL_IDX, FORL_STOP, FORL_STEP, FORL_EXT[m
[31m-};[m
[31m-[m
[31m-/* Bytecode operand modes. ORDER BCMode */[m
[31m-typedef enum {[m
[31m-  BCMnone, BCMdst, BCMbase, BCMvar, BCMrbase, BCMuv,  /* Mode A must be <= 7 */[m
[31m-  BCMlit, BCMlits, BCMpri, BCMnum, BCMstr, BCMtab, BCMfunc, BCMjump, BCMcdata,[m
[31m-  BCM_max[m
[31m-} BCMode;[m
[31m-#define BCM___		BCMnone[m
[31m-[m
[31m-#define bcmode_a(op)	((BCMode)(lj_bc_mode[op] & 7))[m
[31m-#define bcmode_b(op)	((BCMode)((lj_bc_mode[op]>>3) & 15))[m
[31m-#define bcmode_c(op)	((BCMode)((lj_bc_mode[op]>>7) & 15))[m
[31m-#define bcmode_d(op)	bcmode_c(op)[m
[31m-#define bcmode_hasd(op)	((lj_bc_mode[op] & (15<<3)) == (BCMnone<<3))[m
[31m-#define bcmode_mm(op)	((MMS)(lj_bc_mode[op]>>11))[m
[31m-[m
[31m-#define BCMODE(name, ma, mb, mc, mm) \[m
[31m-  (BCM##ma|(BCM##mb<<3)|(BCM##mc<<7)|(MM_##mm<<11)),[m
[31m-#define BCMODE_FF	0[m
[31m-[m
[31m-static LJ_AINLINE int bc_isret(BCOp op)[m
[31m-{[m
[31m-  return (op == BC_RETM || op == BC_RET || op == BC_RET0 || op == BC_RET1);[m
[31m-}[m
[31m-[m
[31m-LJ_DATA const uint16_t lj_bc_mode[];[m
[31m-LJ_DATA const uint16_t lj_bc_ofs[];[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcdump.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcdump.h[m
[1mdeleted file mode 100644[m
[1mindex 3752f15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcdump.h[m
[1m+++ /dev/null[m
[36m@@ -1,68 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode dump definitions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_BCDUMP_H[m
[31m-#define _LJ_BCDUMP_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_lex.h"[m
[31m-[m
[31m-/* -- Bytecode dump format ------------------------------------------------ */[m
[31m-[m
[31m-/*[m
[31m-** dump   = header proto+ 0U[m
[31m-** header = ESC 'L' 'J' versionB flagsU [namelenU nameB*][m
[31m-** proto  = lengthU pdata[m
[31m-** pdata  = phead bcinsW* uvdataH* kgc* knum* [debugB*][m
[31m-** phead  = flagsB numparamsB framesizeB numuvB numkgcU numknU numbcU[m
[31m-**          [debuglenU [firstlineU numlineU]][m
[31m-** kgc    = kgctypeU { ktab | (loU hiU) | (rloU rhiU iloU ihiU) | strB* }[m
[31m-** knum   = intU0 | (loU1 hiU)[m
[31m-** ktab   = narrayU nhashU karray* khash*[m
[31m-** karray = ktabk[m
[31m-** khash  = ktabk ktabk[m
[31m-** ktabk  = ktabtypeU { intU | (loU hiU) | strB* }[m
[31m-**[m
[31m-** B = 8 bit, H = 16 bit, W = 32 bit, U = ULEB128 of W, U0/U1 = ULEB128 of W+1[m
[31m-*/[m
[31m-[m
[31m-/* Bytecode dump header. */[m
[31m-#define BCDUMP_HEAD1		0x1b[m
[31m-#define BCDUMP_HEAD2		0x4c[m
[31m-#define BCDUMP_HEAD3		0x4a[m
[31m-[m
[31m-/* If you perform *any* kind of private modifications to the bytecode itself[m
[31m-** or to the dump format, you *must* set BCDUMP_VERSION to 0x80 or higher.[m
[31m-*/[m
[31m-#define BCDUMP_VERSION		2[m
[31m-[m
[31m-/* Compatibility flags. */[m
[31m-#define BCDUMP_F_BE		0x01[m
[31m-#define BCDUMP_F_STRIP		0x02[m
[31m-#define BCDUMP_F_FFI		0x04[m
[31m-#define BCDUMP_F_FR2		0x08[m
[31m-[m
[31m-#define BCDUMP_F_KNOWN		(BCDUMP_F_FR2*2-1)[m
[31m-[m
[31m-/* Type codes for the GC constants of a prototype. Plus length for strings. */[m
[31m-enum {[m
[31m-  BCDUMP_KGC_CHILD, BCDUMP_KGC_TAB, BCDUMP_KGC_I64, BCDUMP_KGC_U64,[m
[31m-  BCDUMP_KGC_COMPLEX, BCDUMP_KGC_STR[m
[31m-};[m
[31m-[m
[31m-/* Type codes for the keys/values of a constant table. */[m
[31m-enum {[m
[31m-  BCDUMP_KTAB_NIL, BCDUMP_KTAB_FALSE, BCDUMP_KTAB_TRUE,[m
[31m-  BCDUMP_KTAB_INT, BCDUMP_KTAB_NUM, BCDUMP_KTAB_STR[m
[31m-};[m
[31m-[m
[31m-/* -- Bytecode reader/writer ---------------------------------------------- */[m
[31m-[m
[31m-LJ_FUNC int lj_bcwrite(lua_State *L, GCproto *pt, lua_Writer writer,[m
[31m-		       void *data, int strip);[m
[31m-LJ_FUNC GCproto *lj_bcread_proto(LexState *ls);[m
[31m-LJ_FUNC GCproto *lj_bcread(LexState *ls);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread.c[m
[1mdeleted file mode 100644[m
[1mindex 455c9d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcread.c[m
[1m+++ /dev/null[m
[36m@@ -1,457 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode reader.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_bcread_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lualib.h"[m
[31m-#endif[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Reuse some lexer fields for our own purposes. */[m
[31m-#define bcread_flags(ls)	ls->level[m
[31m-#define bcread_swap(ls) \[m
[31m-  ((bcread_flags(ls) & BCDUMP_F_BE) != LJ_BE*BCDUMP_F_BE)[m
[31m-#define bcread_oldtop(L, ls)	restorestack(L, ls->lastline)[m
[31m-#define bcread_savetop(L, ls, top) \[m
[31m-  ls->lastline = (BCLine)savestack(L, (top))[m
[31m-[m
[31m-/* -- Input buffer handling ----------------------------------------------- */[m
[31m-[m
[31m-/* Throw reader error. */[m
[31m-static LJ_NOINLINE void bcread_error(LexState *ls, ErrMsg em)[m
[31m-{[m
[31m-  lua_State *L = ls->L;[m
[31m-  const char *name = ls->chunkarg;[m
[31m-  if (*name == BCDUMP_HEAD1) name = "(binary)";[m
[31m-  else if (*name == '@' || *name == '=') name++;[m
[31m-  lj_strfmt_pushf(L, "%s: %s", name, err2msg(em));[m
[31m-  lj_err_throw(L, LUA_ERRSYNTAX);[m
[31m-}[m
[31m-[m
[31m-/* Refill buffer. */[m
[31m-static LJ_NOINLINE void bcread_fill(LexState *ls, MSize len, int need)[m
[31m-{[m
[31m-  lua_assert(len != 0);[m
[31m-  if (len > LJ_MAX_BUF || ls->c < 0)[m
[31m-    bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-  do {[m
[31m-    const char *buf;[m
[31m-    size_t sz;[m
[31m-    char *p = sbufB(&ls->sb);[m
[31m-    MSize n = (MSize)(ls->pe - ls->p);[m
[31m-    if (n) {  /* Copy remainder to buffer. */[m
[31m-      if (sbuflen(&ls->sb)) {  /* Move down in buffer. */[m
[31m-	lua_assert(ls->pe == sbufP(&ls->sb));[m
[31m-	if (ls->p != p) memmove(p, ls->p, n);[m
[31m-      } else {  /* Copy from buffer provided by reader. */[m
[31m-	p = lj_buf_need(&ls->sb, len);[m
[31m-	memcpy(p, ls->p, n);[m
[31m-      }[m
[31m-      ls->p = p;[m
[31m-      ls->pe = p + n;[m
[31m-    }[m
[31m-    setsbufP(&ls->sb, p + n);[m
[31m-    buf = ls->rfunc(ls->L, ls->rdata, &sz);  /* Get more data from reader. */[m
[31m-    if (buf == NULL || sz == 0) {  /* EOF? */[m
[31m-      if (need) bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-      ls->c = -1;  /* Only bad if we get called again. */[m
[31m-      break;[m
[31m-    }[m
[31m-    if (n) {  /* Append to buffer. */[m
[31m-      n += (MSize)sz;[m
[31m-      p = lj_buf_need(&ls->sb, n < len ? len : n);[m
[31m-      memcpy(sbufP(&ls->sb), buf, sz);[m
[31m-      setsbufP(&ls->sb, p + n);[m
[31m-      ls->p = p;[m
[31m-      ls->pe = p + n;[m
[31m-    } else {  /* Return buffer provided by reader. */[m
[31m-      ls->p = buf;[m
[31m-      ls->pe = buf + sz;[m
[31m-    }[m
[31m-  } while (ls->p + len > ls->pe);[m
[31m-}[m
[31m-[m
[31m-/* Need a certain number of bytes. */[m
[31m-static LJ_AINLINE void bcread_need(LexState *ls, MSize len)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(ls->p + len > ls->pe))[m
[31m-    bcread_fill(ls, len, 1);[m
[31m-}[m
[31m-[m
[31m-/* Want to read up to a certain number of bytes, but may need less. */[m
[31m-static LJ_AINLINE void bcread_want(LexState *ls, MSize len)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(ls->p + len > ls->pe))[m
[31m-    bcread_fill(ls, len, 0);[m
[31m-}[m
[31m-[m
[31m-/* Return memory block from buffer. */[m
[31m-static LJ_AINLINE uint8_t *bcread_mem(LexState *ls, MSize len)[m
[31m-{[m
[31m-  uint8_t *p = (uint8_t *)ls->p;[m
[31m-  ls->p += len;[m
[31m-  lua_assert(ls->p <= ls->pe);[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Copy memory block from buffer. */[m
[31m-static void bcread_block(LexState *ls, void *q, MSize len)[m
[31m-{[m
[31m-  memcpy(q, bcread_mem(ls, len), len);[m
[31m-}[m
[31m-[m
[31m-/* Read byte from buffer. */[m
[31m-static LJ_AINLINE uint32_t bcread_byte(LexState *ls)[m
[31m-{[m
[31m-  lua_assert(ls->p < ls->pe);[m
[31m-  return (uint32_t)(uint8_t)*ls->p++;[m
[31m-}[m
[31m-[m
[31m-/* Read ULEB128 value from buffer. */[m
[31m-static LJ_AINLINE uint32_t bcread_uleb128(LexState *ls)[m
[31m-{[m
[31m-  uint32_t v = lj_buf_ruleb128(&ls->p);[m
[31m-  lua_assert(ls->p <= ls->pe);[m
[31m-  return v;[m
[31m-}[m
[31m-[m
[31m-/* Read top 32 bits of 33 bit ULEB128 value from buffer. */[m
[31m-static uint32_t bcread_uleb128_33(LexState *ls)[m
[31m-{[m
[31m-  const uint8_t *p = (const uint8_t *)ls->p;[m
[31m-  uint32_t v = (*p++ >> 1);[m
[31m-  if (LJ_UNLIKELY(v >= 0x40)) {[m
[31m-    int sh = -1;[m
[31m-    v &= 0x3f;[m
[31m-    do {[m
[31m-     v |= ((*p & 0x7f) << (sh += 7));[m
[31m-   } while (*p++ >= 0x80);[m
[31m-  }[m
[31m-  ls->p = (char *)p;[m
[31m-  lua_assert(ls->p <= ls->pe);[m
[31m-  return v;[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode reader ----------------------------------------------------- */[m
[31m-[m
[31m-/* Read debug info of a prototype. */[m
[31m-static void bcread_dbg(LexState *ls, GCproto *pt, MSize sizedbg)[m
[31m-{[m
[31m-  void *lineinfo = (void *)proto_lineinfo(pt);[m
[31m-  bcread_block(ls, lineinfo, sizedbg);[m
[31m-  /* Swap lineinfo if the endianess differs. */[m
[31m-  if (bcread_swap(ls) && pt->numline >= 256) {[m
[31m-    MSize i, n = pt->sizebc-1;[m
[31m-    if (pt->numline < 65536) {[m
[31m-      uint16_t *p = (uint16_t *)lineinfo;[m
[31m-      for (i = 0; i < n; i++) p[i] = (uint16_t)((p[i] >> 8)|(p[i] << 8));[m
[31m-    } else {[m
[31m-      uint32_t *p = (uint32_t *)lineinfo;[m
[31m-      for (i = 0; i < n; i++) p[i] = lj_bswap(p[i]);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Find pointer to varinfo. */[m
[31m-static const void *bcread_varinfo(GCproto *pt)[m
[31m-{[m
[31m-  const uint8_t *p = proto_uvinfo(pt);[m
[31m-  MSize n = pt->sizeuv;[m
[31m-  if (n) while (*p++ || --n) ;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Read a single constant key/value of a template table. */[m
[31m-static void bcread_ktabk(LexState *ls, TValue *o)[m
[31m-{[m
[31m-  MSize tp = bcread_uleb128(ls);[m
[31m-  if (tp >= BCDUMP_KTAB_STR) {[m
[31m-    MSize len = tp - BCDUMP_KTAB_STR;[m
[31m-    const char *p = (const char *)bcread_mem(ls, len);[m
[31m-    setstrV(ls->L, o, lj_str_new(ls->L, p, len));[m
[31m-  } else if (tp == BCDUMP_KTAB_INT) {[m
[31m-    setintV(o, (int32_t)bcread_uleb128(ls));[m
[31m-  } else if (tp == BCDUMP_KTAB_NUM) {[m
[31m-    o->u32.lo = bcread_uleb128(ls);[m
[31m-    o->u32.hi = bcread_uleb128(ls);[m
[31m-  } else {[m
[31m-    lua_assert(tp <= BCDUMP_KTAB_TRUE);[m
[31m-    setpriV(o, ~tp);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read a template table. */[m
[31m-static GCtab *bcread_ktab(LexState *ls)[m
[31m-{[m
[31m-  MSize narray = bcread_uleb128(ls);[m
[31m-  MSize nhash = bcread_uleb128(ls);[m
[31m-  GCtab *t = lj_tab_new(ls->L, narray, hsize2hbits(nhash));[m
[31m-  if (narray) {  /* Read array entries. */[m
[31m-    MSize i;[m
[31m-    TValue *o = tvref(t->array);[m
[31m-    for (i = 0; i < narray; i++, o++)[m
[31m-      bcread_ktabk(ls, o);[m
[31m-  }[m
[31m-  if (nhash) {  /* Read hash entries. */[m
[31m-    MSize i;[m
[31m-    for (i = 0; i < nhash; i++) {[m
[31m-      TValue key;[m
[31m-      bcread_ktabk(ls, &key);[m
[31m-      lua_assert(!tvisnil(&key));[m
[31m-      bcread_ktabk(ls, lj_tab_set(ls->L, t, &key));[m
[31m-    }[m
[31m-  }[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* Read GC constants of a prototype. */[m
[31m-static void bcread_kgc(LexState *ls, GCproto *pt, MSize sizekgc)[m
[31m-{[m
[31m-  MSize i;[m
[31m-  GCRef *kr = mref(pt->k, GCRef) - (ptrdiff_t)sizekgc;[m
[31m-  for (i = 0; i < sizekgc; i++, kr++) {[m
[31m-    MSize tp = bcread_uleb128(ls);[m
[31m-    if (tp >= BCDUMP_KGC_STR) {[m
[31m-      MSize len = tp - BCDUMP_KGC_STR;[m
[31m-      const char *p = (const char *)bcread_mem(ls, len);[m
[31m-      setgcref(*kr, obj2gco(lj_str_new(ls->L, p, len)));[m
[31m-    } else if (tp == BCDUMP_KGC_TAB) {[m
[31m-      setgcref(*kr, obj2gco(bcread_ktab(ls)));[m
[31m-#if LJ_HASFFI[m
[31m-    } else if (tp != BCDUMP_KGC_CHILD) {[m
[31m-      CTypeID id = tp == BCDUMP_KGC_COMPLEX ? CTID_COMPLEX_DOUBLE :[m
[31m-		   tp == BCDUMP_KGC_I64 ? CTID_INT64 : CTID_UINT64;[m
[31m-      CTSize sz = tp == BCDUMP_KGC_COMPLEX ? 16 : 8;[m
[31m-      GCcdata *cd = lj_cdata_new_(ls->L, id, sz);[m
[31m-      TValue *p = (TValue *)cdataptr(cd);[m
[31m-      setgcref(*kr, obj2gco(cd));[m
[31m-      p[0].u32.lo = bcread_uleb128(ls);[m
[31m-      p[0].u32.hi = bcread_uleb128(ls);[m
[31m-      if (tp == BCDUMP_KGC_COMPLEX) {[m
[31m-	p[1].u32.lo = bcread_uleb128(ls);[m
[31m-	p[1].u32.hi = bcread_uleb128(ls);[m
[31m-      }[m
[31m-#endif[m
[31m-    } else {[m
[31m-      lua_State *L = ls->L;[m
[31m-      lua_assert(tp == BCDUMP_KGC_CHILD);[m
[31m-      if (L->top <= bcread_oldtop(L, ls))  /* Stack underflow? */[m
[31m-	bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-      L->top--;[m
[31m-      setgcref(*kr, obj2gco(protoV(L->top)));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read number constants of a prototype. */[m
[31m-static void bcread_knum(LexState *ls, GCproto *pt, MSize sizekn)[m
[31m-{[m
[31m-  MSize i;[m
[31m-  TValue *o = mref(pt->k, TValue);[m
[31m-  for (i = 0; i < sizekn; i++, o++) {[m
[31m-    int isnum = (ls->p[0] & 1);[m
[31m-    uint32_t lo = bcread_uleb128_33(ls);[m
[31m-    if (isnum) {[m
[31m-      o->u32.lo = lo;[m
[31m-      o->u32.hi = bcread_uleb128(ls);[m
[31m-    } else {[m
[31m-      setintV(o, lo);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read bytecode instructions. */[m
[31m-static void bcread_bytecode(LexState *ls, GCproto *pt, MSize sizebc)[m
[31m-{[m
[31m-  BCIns *bc = proto_bc(pt);[m
[31m-  bc[0] = BCINS_AD((pt->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF,[m
[31m-		   pt->framesize, 0);[m
[31m-  bcread_block(ls, bc+1, (sizebc-1)*(MSize)sizeof(BCIns));[m
[31m-  /* Swap bytecode instructions if the endianess differs. */[m
[31m-  if (bcread_swap(ls)) {[m
[31m-    MSize i;[m
[31m-    for (i = 1; i < sizebc; i++) bc[i] = lj_bswap(bc[i]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read upvalue refs. */[m
[31m-static void bcread_uv(LexState *ls, GCproto *pt, MSize sizeuv)[m
[31m-{[m
[31m-  if (sizeuv) {[m
[31m-    uint16_t *uv = proto_uv(pt);[m
[31m-    bcread_block(ls, uv, sizeuv*2);[m
[31m-    /* Swap upvalue refs if the endianess differs. */[m
[31m-    if (bcread_swap(ls)) {[m
[31m-      MSize i;[m
[31m-      for (i = 0; i < sizeuv; i++)[m
[31m-	uv[i] = (uint16_t)((uv[i] >> 8)|(uv[i] << 8));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read a prototype. */[m
[31m-GCproto *lj_bcread_proto(LexState *ls)[m
[31m-{[m
[31m-  GCproto *pt;[m
[31m-  MSize framesize, numparams, flags, sizeuv, sizekgc, sizekn, sizebc, sizept;[m
[31m-  MSize ofsk, ofsuv, ofsdbg;[m
[31m-  MSize sizedbg = 0;[m
[31m-  BCLine firstline = 0, numline = 0;[m
[31m-[m
[31m-  /* Read prototype header. */[m
[31m-  flags = bcread_byte(ls);[m
[31m-  numparams = bcread_byte(ls);[m
[31m-  framesize = bcread_byte(ls);[m
[31m-  sizeuv = bcread_byte(ls);[m
[31m-  sizekgc = bcread_uleb128(ls);[m
[31m-  sizekn = bcread_uleb128(ls);[m
[31m-  sizebc = bcread_uleb128(ls) + 1;[m
[31m-  if (!(bcread_flags(ls) & BCDUMP_F_STRIP)) {[m
[31m-    sizedbg = bcread_uleb128(ls);[m
[31m-    if (sizedbg) {[m
[31m-      firstline = bcread_uleb128(ls);[m
[31m-      numline = bcread_uleb128(ls);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Calculate total size of prototype including all colocated arrays. */[m
[31m-  sizept = (MSize)sizeof(GCproto) +[m
[31m-	   sizebc*(MSize)sizeof(BCIns) +[m
[31m-	   sizekgc*(MSize)sizeof(GCRef);[m
[31m-  sizept = (sizept + (MSize)sizeof(TValue)-1) & ~((MSize)sizeof(TValue)-1);[m
[31m-  ofsk = sizept; sizept += sizekn*(MSize)sizeof(TValue);[m
[31m-  ofsuv = sizept; sizept += ((sizeuv+1)&~1)*2;[m
[31m-  ofsdbg = sizept; sizept += sizedbg;[m
[31m-[m
[31m-  /* Allocate prototype object and initialize its fields. */[m
[31m-  pt = (GCproto *)lj_mem_newgco(ls->L, (MSize)sizept);[m
[31m-  pt->gct = ~LJ_TPROTO;[m
[31m-  pt->numparams = (uint8_t)numparams;[m
[31m-  pt->framesize = (uint8_t)framesize;[m
[31m-  pt->sizebc = sizebc;[m
[31m-  setmref(pt->k, (char *)pt + ofsk);[m
[31m-  setmref(pt->uv, (char *)pt + ofsuv);[m
[31m-  pt->sizekgc = 0;  /* Set to zero until fully initialized. */[m
[31m-  pt->sizekn = sizekn;[m
[31m-  pt->sizept = sizept;[m
[31m-  pt->sizeuv = (uint8_t)sizeuv;[m
[31m-  pt->flags = (uint8_t)flags;[m
[31m-  pt->trace = 0;[m
[31m-  setgcref(pt->chunkname, obj2gco(ls->chunkname));[m
[31m-[m
[31m-  /* Close potentially uninitialized gap between bc and kgc. */[m
[31m-  *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(sizekgc+1)) = 0;[m
[31m-[m
[31m-  /* Read bytecode instructions and upvalue refs. */[m
[31m-  bcread_bytecode(ls, pt, sizebc);[m
[31m-  bcread_uv(ls, pt, sizeuv);[m
[31m-[m
[31m-  /* Read constants. */[m
[31m-  bcread_kgc(ls, pt, sizekgc);[m
[31m-  pt->sizekgc = sizekgc;[m
[31m-  bcread_knum(ls, pt, sizekn);[m
[31m-[m
[31m-  /* Read and initialize debug info. */[m
[31m-  pt->firstline = firstline;[m
[31m-  pt->numline = numline;[m
[31m-  if (sizedbg) {[m
[31m-    MSize sizeli = (sizebc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2);[m
[31m-    setmref(pt->lineinfo, (char *)pt + ofsdbg);[m
[31m-    setmref(pt->uvinfo, (char *)pt + ofsdbg + sizeli);[m
[31m-    bcread_dbg(ls, pt, sizedbg);[m
[31m-    setmref(pt->varinfo, bcread_varinfo(pt));[m
[31m-  } else {[m
[31m-    setmref(pt->lineinfo, NULL);[m
[31m-    setmref(pt->uvinfo, NULL);[m
[31m-    setmref(pt->varinfo, NULL);[m
[31m-  }[m
[31m-  return pt;[m
[31m-}[m
[31m-[m
[31m-/* Read and check header of bytecode dump. */[m
[31m-static int bcread_header(LexState *ls)[m
[31m-{[m
[31m-  uint32_t flags;[m
[31m-  bcread_want(ls, 3+5+5);[m
[31m-  if (bcread_byte(ls) != BCDUMP_HEAD2 ||[m
[31m-      bcread_byte(ls) != BCDUMP_HEAD3 ||[m
[31m-      bcread_byte(ls) != BCDUMP_VERSION) return 0;[m
[31m-  bcread_flags(ls) = flags = bcread_uleb128(ls);[m
[31m-  if ((flags & ~(BCDUMP_F_KNOWN)) != 0) return 0;[m
[31m-  if ((flags & BCDUMP_F_FR2) != LJ_FR2*BCDUMP_F_FR2) return 0;[m
[31m-  if ((flags & BCDUMP_F_FFI)) {[m
[31m-#if LJ_HASFFI[m
[31m-    lua_State *L = ls->L;[m
[31m-    if (!ctype_ctsG(G(L))) {[m
[31m-      ptrdiff_t oldtop = savestack(L, L->top);[m
[31m-      luaopen_ffi(L);  /* Load FFI library on-demand. */[m
[31m-      L->top = restorestack(L, oldtop);[m
[31m-    }[m
[31m-#else[m
[31m-    return 0;[m
[31m-#endif[m
[31m-  }[m
[31m-  if ((flags & BCDUMP_F_STRIP)) {[m
[31m-    ls->chunkname = lj_str_newz(ls->L, ls->chunkarg);[m
[31m-  } else {[m
[31m-    MSize len = bcread_uleb128(ls);[m
[31m-    bcread_need(ls, len);[m
[31m-    ls->chunkname = lj_str_new(ls->L, (const char *)bcread_mem(ls, len), len);[m
[31m-  }[m
[31m-  return 1;  /* Ok. */[m
[31m-}[m
[31m-[m
[31m-/* Read a bytecode dump. */[m
[31m-GCproto *lj_bcread(LexState *ls)[m
[31m-{[m
[31m-  lua_State *L = ls->L;[m
[31m-  lua_assert(ls->c == BCDUMP_HEAD1);[m
[31m-  bcread_savetop(L, ls, L->top);[m
[31m-  lj_buf_reset(&ls->sb);[m
[31m-  /* Check for a valid bytecode dump header. */[m
[31m-  if (!bcread_header(ls))[m
[31m-    bcread_error(ls, LJ_ERR_BCFMT);[m
[31m-  for (;;) {  /* Process all prototypes in the bytecode dump. */[m
[31m-    GCproto *pt;[m
[31m-    MSize len;[m
[31m-    const char *startp;[m
[31m-    /* Read length. */[m
[31m-    if (ls->p < ls->pe && ls->p[0] == 0) {  /* Shortcut EOF. */[m
[31m-      ls->p++;[m
[31m-      break;[m
[31m-    }[m
[31m-    bcread_want(ls, 5);[m
[31m-    len = bcread_uleb128(ls);[m
[31m-    if (!len) break;  /* EOF */[m
[31m-    bcread_need(ls, len);[m
[31m-    startp = ls->p;[m
[31m-    pt = lj_bcread_proto(ls);[m
[31m-    if (ls->p != startp + len)[m
[31m-      bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-    setprotoV(L, L->top, pt);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  if ((int32_t)(2*(uint32_t)(ls->pe - ls->p)) > 0 ||[m
[31m-      L->top-1 != bcread_oldtop(L, ls))[m
[31m-    bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-  /* Pop off last prototype. */[m
[31m-  L->top--;[m
[31m-  return protoV(L->top);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite.c[m
[1mdeleted file mode 100644[m
[1mindex 4728305..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_bcwrite.c[m
[1m+++ /dev/null[m
[36m@@ -1,361 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode writer.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_bcwrite_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_jit.h"[m
[31m-#endif[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* Context for bytecode writer. */[m
[31m-typedef struct BCWriteCtx {[m
[31m-  SBuf sb;			/* Output buffer. */[m
[31m-  GCproto *pt;			/* Root prototype. */[m
[31m-  lua_Writer wfunc;		/* Writer callback. */[m
[31m-  void *wdata;			/* Writer callback data. */[m
[31m-  int strip;			/* Strip debug info. */[m
[31m-  int status;			/* Status from writer callback. */[m
[31m-} BCWriteCtx;[m
[31m-[m
[31m-/* -- Bytecode writer ----------------------------------------------------- */[m
[31m-[m
[31m-/* Write a single constant key/value of a template table. */[m
[31m-static void bcwrite_ktabk(BCWriteCtx *ctx, cTValue *o, int narrow)[m
[31m-{[m
[31m-  char *p = lj_buf_more(&ctx->sb, 1+10);[m
[31m-  if (tvisstr(o)) {[m
[31m-    const GCstr *str = strV(o);[m
[31m-    MSize len = str->len;[m
[31m-    p = lj_buf_more(&ctx->sb, 5+len);[m
[31m-    p = lj_strfmt_wuleb128(p, BCDUMP_KTAB_STR+len);[m
[31m-    p = lj_buf_wmem(p, strdata(str), len);[m
[31m-  } else if (tvisint(o)) {[m
[31m-    *p++ = BCDUMP_KTAB_INT;[m
[31m-    p = lj_strfmt_wuleb128(p, intV(o));[m
[31m-  } else if (tvisnum(o)) {[m
[31m-    if (!LJ_DUALNUM && narrow) {  /* Narrow number constants to integers. */[m
[31m-      lua_Number num = numV(o);[m
[31m-      int32_t k = lj_num2int(num);[m
[31m-      if (num == (lua_Number)k) {  /* -0 is never a constant. */[m
[31m-	*p++ = BCDUMP_KTAB_INT;[m
[31m-	p = lj_strfmt_wuleb128(p, k);[m
[31m-	setsbufP(&ctx->sb, p);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    *p++ = BCDUMP_KTAB_NUM;[m
[31m-    p = lj_strfmt_wuleb128(p, o->u32.lo);[m
[31m-    p = lj_strfmt_wuleb128(p, o->u32.hi);[m
[31m-  } else {[m
[31m-    lua_assert(tvispri(o));[m
[31m-    *p++ = BCDUMP_KTAB_NIL+~itype(o);[m
[31m-  }[m
[31m-  setsbufP(&ctx->sb, p);[m
[31m-}[m
[31m-[m
[31m-/* Write a template table. */[m
[31m-static void bcwrite_ktab(BCWriteCtx *ctx, char *p, const GCtab *t)[m
[31m-{[m
[31m-  MSize narray = 0, nhash = 0;[m
[31m-  if (t->asize > 0) {  /* Determine max. length of array part. */[m
[31m-    ptrdiff_t i;[m
[31m-    TValue *array = tvref(t->array);[m
[31m-    for (i = (ptrdiff_t)t->asize-1; i >= 0; i--)[m
[31m-      if (!tvisnil(&array[i]))[m
[31m-	break;[m
[31m-    narray = (MSize)(i+1);[m
[31m-  }[m
[31m-  if (t->hmask > 0) {  /* Count number of used hash slots. */[m
[31m-    MSize i, hmask = t->hmask;[m
[31m-    Node *node = noderef(t->node);[m
[31m-    for (i = 0; i <= hmask; i++)[m
[31m-      nhash += !tvisnil(&node[i].val);[m
[31m-  }[m
[31m-  /* Write number of array slots and hash slots. */[m
[31m-  p = lj_strfmt_wuleb128(p, narray);[m
[31m-  p = lj_strfmt_wuleb128(p, nhash);[m
[31m-  setsbufP(&ctx->sb, p);[m
[31m-  if (narray) {  /* Write array entries (may contain nil). */[m
[31m-    MSize i;[m
[31m-    TValue *o = tvref(t->array);[m
[31m-    for (i = 0; i < narray; i++, o++)[m
[31m-      bcwrite_ktabk(ctx, o, 1);[m
[31m-  }[m
[31m-  if (nhash) {  /* Write hash entries. */[m
[31m-    MSize i = nhash;[m
[31m-    Node *node = noderef(t->node) + t->hmask;[m
[31m-    for (;; node--)[m
[31m-      if (!tvisnil(&node->val)) {[m
[31m-	bcwrite_ktabk(ctx, &node->key, 0);[m
[31m-	bcwrite_ktabk(ctx, &node->val, 1);[m
[31m-	if (--i == 0) break;[m
[31m-      }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Write GC constants of a prototype. */[m
[31m-static void bcwrite_kgc(BCWriteCtx *ctx, GCproto *pt)[m
[31m-{[m
[31m-  MSize i, sizekgc = pt->sizekgc;[m
[31m-  GCRef *kr = mref(pt->k, GCRef) - (ptrdiff_t)sizekgc;[m
[31m-  for (i = 0; i < sizekgc; i++, kr++) {[m
[31m-    GCobj *o = gcref(*kr);[m
[31m-    MSize tp, need = 1;[m
[31m-    char *p;[m
[31m-    /* Determine constant type and needed size. */[m
[31m-    if (o->gch.gct == ~LJ_TSTR) {[m
[31m-      tp = BCDUMP_KGC_STR + gco2str(o)->len;[m
[31m-      need = 5+gco2str(o)->len;[m
[31m-    } else if (o->gch.gct == ~LJ_TPROTO) {[m
[31m-      lua_assert((pt->flags & PROTO_CHILD));[m
[31m-      tp = BCDUMP_KGC_CHILD;[m
[31m-#if LJ_HASFFI[m
[31m-    } else if (o->gch.gct == ~LJ_TCDATA) {[m
[31m-      CTypeID id = gco2cd(o)->ctypeid;[m
[31m-      need = 1+4*5;[m
[31m-      if (id == CTID_INT64) {[m
[31m-	tp = BCDUMP_KGC_I64;[m
[31m-      } else if (id == CTID_UINT64) {[m
[31m-	tp = BCDUMP_KGC_U64;[m
[31m-      } else {[m
[31m-	lua_assert(id == CTID_COMPLEX_DOUBLE);[m
[31m-	tp = BCDUMP_KGC_COMPLEX;[m
[31m-      }[m
[31m-#endif[m
[31m-    } else {[m
[31m-      lua_assert(o->gch.gct == ~LJ_TTAB);[m
[31m-      tp = BCDUMP_KGC_TAB;[m
[31m-      need = 1+2*5;[m
[31m-    }[m
[31m-    /* Write constant type. */[m
[31m-    p = lj_buf_more(&ctx->sb, need);[m
[31m-    p = lj_strfmt_wuleb128(p, tp);[m
[31m-    /* Write constant data (if any). */[m
[31m-    if (tp >= BCDUMP_KGC_STR) {[m
[31m-      p = lj_buf_wmem(p, strdata(gco2str(o)), gco2str(o)->len);[m
[31m-    } else if (tp == BCDUMP_KGC_TAB) {[m
[31m-      bcwrite_ktab(ctx, p, gco2tab(o));[m
[31m-      continue;[m
[31m-#if LJ_HASFFI[m
[31m-    } else if (tp != BCDUMP_KGC_CHILD) {[m
[31m-      cTValue *q = (TValue *)cdataptr(gco2cd(o));[m
[31m-      p = lj_strfmt_wuleb128(p, q[0].u32.lo);[m
[31m-      p = lj_strfmt_wuleb128(p, q[0].u32.hi);[m
[31m-      if (tp == BCDUMP_KGC_COMPLEX) {[m
[31m-	p = lj_strfmt_wuleb128(p, q[1].u32.lo);[m
[31m-	p = lj_strfmt_wuleb128(p, q[1].u32.hi);[m
[31m-      }[m
[31m-#endif[m
[31m-    }[m
[31m-    setsbufP(&ctx->sb, p);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Write number constants of a prototype. */[m
[31m-static void bcwrite_knum(BCWriteCtx *ctx, GCproto *pt)[m
[31m-{[m
[31m-  MSize i, sizekn = pt->sizekn;[m
[31m-  cTValue *o = mref(pt->k, TValue);[m
[31m-  char *p = lj_buf_more(&ctx->sb, 10*sizekn);[m
[31m-  for (i = 0; i < sizekn; i++, o++) {[m
[31m-    int32_t k;[m
[31m-    if (tvisint(o)) {[m
[31m-      k = intV(o);[m
[31m-      goto save_int;[m
[31m-    } else {[m
[31m-      /* Write a 33 bit ULEB128 for the int (lsb=0) or loword (lsb=1). */[m
[31m-      if (!LJ_DUALNUM) {  /* Narrow number constants to integers. */[m
[31m-	lua_Number num = numV(o);[m
[31m-	k = lj_num2int(num);[m
[31m-	if (num == (lua_Number)k) {  /* -0 is never a constant. */[m
[31m-	save_int:[m
[31m-	  p = lj_strfmt_wuleb128(p, 2*(uint32_t)k | ((uint32_t)k&0x80000000u));[m
[31m-	  if (k < 0)[m
[31m-	    p[-1] = (p[-1] & 7) | ((k>>27) & 0x18);[m
[31m-	  continue;[m
[31m-	}[m
[31m-      }[m
[31m-      p = lj_strfmt_wuleb128(p, 1+(2*o->u32.lo | (o->u32.lo & 0x80000000u)));[m
[31m-      if (o->u32.lo >= 0x80000000u)[m
[31m-	p[-1] = (p[-1] & 7) | ((o->u32.lo>>27) & 0x18);[m
[31m-      p = lj_strfmt_wuleb128(p, o->u32.hi);[m
[31m-    }[m
[31m-  }[m
[31m-  setsbufP(&ctx->sb, p);[m
[31m-}[m
[31m-[m
[31m-/* Write bytecode instructions. */[m
[31m-static char *bcwrite_bytecode(BCWriteCtx *ctx, char *p, GCproto *pt)[m
[31m-{[m
[31m-  MSize nbc = pt->sizebc-1;  /* Omit the [JI]FUNC* header. */[m
[31m-#if LJ_HASJIT[m
[31m-  uint8_t *q = (uint8_t *)p;[m
[31m-#endif[m
[31m-  p = lj_buf_wmem(p, proto_bc(pt)+1, nbc*(MSize)sizeof(BCIns));[m
[31m-  UNUSED(ctx);[m
[31m-#if LJ_HASJIT[m
[31m-  /* Unpatch modified bytecode containing ILOOP/JLOOP etc. */[m
[31m-  if ((pt->flags & PROTO_ILOOP) || pt->trace) {[m
[31m-    jit_State *J = L2J(sbufL(&ctx->sb));[m
[31m-    MSize i;[m
[31m-    for (i = 0; i < nbc; i++, q += sizeof(BCIns)) {[m
[31m-      BCOp op = (BCOp)q[LJ_ENDIAN_SELECT(0, 3)];[m
[31m-      if (op == BC_IFORL || op == BC_IITERL || op == BC_ILOOP ||[m
[31m-	  op == BC_JFORI) {[m
[31m-	q[LJ_ENDIAN_SELECT(0, 3)] = (uint8_t)(op-BC_IFORL+BC_FORL);[m
[31m-      } else if (op == BC_JFORL || op == BC_JITERL || op == BC_JLOOP) {[m
[31m-	BCReg rd = q[LJ_ENDIAN_SELECT(2, 1)] + (q[LJ_ENDIAN_SELECT(3, 0)] << 8);[m
[31m-	BCIns ins = traceref(J, rd)->startins;[m
[31m-	q[LJ_ENDIAN_SELECT(0, 3)] = (uint8_t)(op-BC_JFORL+BC_FORL);[m
[31m-	q[LJ_ENDIAN_SELECT(2, 1)] = bc_c(ins);[m
[31m-	q[LJ_ENDIAN_SELECT(3, 0)] = bc_b(ins);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Write prototype. */[m
[31m-static void bcwrite_proto(BCWriteCtx *ctx, GCproto *pt)[m
[31m-{[m
[31m-  MSize sizedbg = 0;[m
[31m-  char *p;[m
[31m-[m
[31m-  /* Recursively write children of prototype. */[m
[31m-  if ((pt->flags & PROTO_CHILD)) {[m
[31m-    ptrdiff_t i, n = pt->sizekgc;[m
[31m-    GCRef *kr = mref(pt->k, GCRef) - 1;[m
[31m-    for (i = 0; i < n; i++, kr--) {[m
[31m-      GCobj *o = gcref(*kr);[m
[31m-      if (o->gch.gct == ~LJ_TPROTO)[m
[31m-	bcwrite_proto(ctx, gco2pt(o));[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Start writing the prototype info to a buffer. */[m
[31m-  p = lj_buf_need(&ctx->sb,[m
[31m-		  5+4+6*5+(pt->sizebc-1)*(MSize)sizeof(BCIns)+pt->sizeuv*2);[m
[31m-  p += 5;  /* Leave room for final size. */[m
[31m-[m
[31m-  /* Write prototype header. */[m
[31m-  *p++ = (pt->flags & (PROTO_CHILD|PROTO_VARARG|PROTO_FFI));[m
[31m-  *p++ = pt->numparams;[m
[31m-  *p++ = pt->framesize;[m
[31m-  *p++ = pt->sizeuv;[m
[31m-  p = lj_strfmt_wuleb128(p, pt->sizekgc);[m
[31m-  p = lj_strfmt_wuleb128(p, pt->sizekn);[m
[31m-  p = lj_strfmt_wuleb128(p, pt->sizebc-1);[m
[31m-  if (!ctx->strip) {[m
[31m-    if (proto_lineinfo(pt))[m
[31m-      sizedbg = pt->sizept - (MSize)((char *)proto_lineinfo(pt) - (char *)pt);[m
[31m-    p = lj_strfmt_wuleb128(p, sizedbg);[m
[31m-    if (sizedbg) {[m
[31m-      p = lj_strfmt_wuleb128(p, pt->firstline);[m
[31m-      p = lj_strfmt_wuleb128(p, pt->numline);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Write bytecode instructions and upvalue refs. */[m
[31m-  p = bcwrite_bytecode(ctx, p, pt);[m
[31m-  p = lj_buf_wmem(p, proto_uv(pt), pt->sizeuv*2);[m
[31m-  setsbufP(&ctx->sb, p);[m
[31m-[m
[31m-  /* Write constants. */[m
[31m-  bcwrite_kgc(ctx, pt);[m
[31m-  bcwrite_knum(ctx, pt);[m
[31m-[m
[31m-  /* Write debug info, if not stripped. */[m
[31m-  if (sizedbg) {[m
[31m-    p = lj_buf_more(&ctx->sb, sizedbg);[m
[31m-    p = lj_buf_wmem(p, proto_lineinfo(pt), sizedbg);[m
[31m-    setsbufP(&ctx->sb, p);[m
[31m-  }[m
[31m-[m
[31m-  /* Pass buffer to writer function. */[m
[31m-  if (ctx->status == 0) {[m
[31m-    MSize n = sbuflen(&ctx->sb) - 5;[m
[31m-    MSize nn = (lj_fls(n)+8)*9 >> 6;[m
[31m-    char *q = sbufB(&ctx->sb) + (5 - nn);[m
[31m-    p = lj_strfmt_wuleb128(q, n);  /* Fill in final size. */[m
[31m-    lua_assert(p == sbufB(&ctx->sb) + 5);[m
[31m-    ctx->status = ctx->wfunc(sbufL(&ctx->sb), q, nn+n, ctx->wdata);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Write header of bytecode dump. */[m
[31m-static void bcwrite_header(BCWriteCtx *ctx)[m
[31m-{[m
[31m-  GCstr *chunkname = proto_chunkname(ctx->pt);[m
[31m-  const char *name = strdata(chunkname);[m
[31m-  MSize len = chunkname->len;[m
[31m-  char *p = lj_buf_need(&ctx->sb, 5+5+len);[m
[31m-  *p++ = BCDUMP_HEAD1;[m
[31m-  *p++ = BCDUMP_HEAD2;[m
[31m-  *p++ = BCDUMP_HEAD3;[m
[31m-  *p++ = BCDUMP_VERSION;[m
[31m-  *p++ = (ctx->strip ? BCDUMP_F_STRIP : 0) +[m
[31m-	 LJ_BE*BCDUMP_F_BE +[m
[31m-	 ((ctx->pt->flags & PROTO_FFI) ? BCDUMP_F_FFI : 0) +[m
[31m-	 LJ_FR2*BCDUMP_F_FR2;[m
[31m-  if (!ctx->strip) {[m
[31m-    p = lj_strfmt_wuleb128(p, len);[m
[31m-    p = lj_buf_wmem(p, name, len);[m
[31m-  }[m
[31m-  ctx->status = ctx->wfunc(sbufL(&ctx->sb), sbufB(&ctx->sb),[m
[31m-			   (MSize)(p - sbufB(&ctx->sb)), ctx->wdata);[m
[31m-}[m
[31m-[m
[31m-/* Write footer of bytecode dump. */[m
[31m-static void bcwrite_footer(BCWriteCtx *ctx)[m
[31m-{[m
[31m-  if (ctx->status == 0) {[m
[31m-    uint8_t zero = 0;[m
[31m-    ctx->status = ctx->wfunc(sbufL(&ctx->sb), &zero, 1, ctx->wdata);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Protected callback for bytecode writer. */[m
[31m-static TValue *cpwriter(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  BCWriteCtx *ctx = (BCWriteCtx *)ud;[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  lj_buf_need(&ctx->sb, 1024);  /* Avoids resize for most prototypes. */[m
[31m-  bcwrite_header(ctx);[m
[31m-  bcwrite_proto(ctx, ctx->pt);[m
[31m-  bcwrite_footer(ctx);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Write bytecode for a prototype. */[m
[31m-int lj_bcwrite(lua_State *L, GCproto *pt, lua_Writer writer, void *data,[m
[31m-	      int strip)[m
[31m-{[m
[31m-  BCWriteCtx ctx;[m
[31m-  int status;[m
[31m-  ctx.pt = pt;[m
[31m-  ctx.wfunc = writer;[m
[31m-  ctx.wdata = data;[m
[31m-  ctx.strip = strip;[m
[31m-  ctx.status = 0;[m
[31m-  lj_buf_init(L, &ctx.sb);[m
[31m-  status = lj_vm_cpcall(L, NULL, &ctx, cpwriter);[m
[31m-  if (status == 0) status = ctx.status;[m
[31m-  lj_buf_free(G(sbufL(&ctx.sb)), &ctx.sb);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.c[m
[1mdeleted file mode 100644[m
[1mindex 6251b07..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.c[m
[1m+++ /dev/null[m
[36m@@ -1,232 +0,0 @@[m
[31m-/*[m
[31m-** Buffer handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_buf_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- Buffer management --------------------------------------------------- */[m
[31m-[m
[31m-static void buf_grow(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  MSize osz = sbufsz(sb), len = sbuflen(sb), nsz = osz;[m
[31m-  char *b;[m
[31m-  if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF;[m
[31m-  while (nsz < sz) nsz += nsz;[m
[31m-  b = (char *)lj_mem_realloc(sbufL(sb), sbufB(sb), osz, nsz);[m
[31m-  setmref(sb->b, b);[m
[31m-  setmref(sb->p, b + len);[m
[31m-  setmref(sb->e, b + nsz);[m
[31m-}[m
[31m-[m
[31m-LJ_NOINLINE char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  lua_assert(sz > sbufsz(sb));[m
[31m-  if (LJ_UNLIKELY(sz > LJ_MAX_BUF))[m
[31m-    lj_err_mem(sbufL(sb));[m
[31m-  buf_grow(sb, sz);[m
[31m-  return sbufB(sb);[m
[31m-}[m
[31m-[m
[31m-LJ_NOINLINE char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  MSize len = sbuflen(sb);[m
[31m-  lua_assert(sz > sbufleft(sb));[m
[31m-  if (LJ_UNLIKELY(sz > LJ_MAX_BUF || len + sz > LJ_MAX_BUF))[m
[31m-    lj_err_mem(sbufL(sb));[m
[31m-  buf_grow(sb, len + sz);[m
[31m-  return sbufP(sb);[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb)[m
[31m-{[m
[31m-  char *b = sbufB(sb);[m
[31m-  MSize osz = (MSize)(sbufE(sb) - b);[m
[31m-  if (osz > 2*LJ_MIN_SBUF) {[m
[31m-    MSize n = (MSize)(sbufP(sb) - b);[m
[31m-    b = lj_mem_realloc(L, b, osz, (osz >> 1));[m
[31m-    setmref(sb->b, b);[m
[31m-    setmref(sb->p, b + n);[m
[31m-    setmref(sb->e, b + (osz >> 1));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz)[m
[31m-{[m
[31m-  SBuf *sb = &G(L)->tmpbuf;[m
[31m-  setsbufL(sb, L);[m
[31m-  return lj_buf_need(sb, sz);[m
[31m-}[m
[31m-[m
[31m-/* -- Low-level buffer put operations ------------------------------------- */[m
[31m-[m
[31m-SBuf *lj_buf_putmem(SBuf *sb, const void *q, MSize len)[m
[31m-{[m
[31m-  char *p = lj_buf_more(sb, len);[m
[31m-  p = lj_buf_wmem(p, q, len);[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c)[m
[31m-{[m
[31m-  char *p = lj_buf_more(sb, 1);[m
[31m-  *p++ = (char)c;[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putstr(SBuf *sb, GCstr *s)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  char *p = lj_buf_more(sb, len);[m
[31m-  p = lj_buf_wmem(p, strdata(s), len);[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* -- High-level buffer put operations ------------------------------------ */[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  char *p = lj_buf_more(sb, len), *e = p+len;[m
[31m-  const char *q = strdata(s)+len-1;[m
[31m-  while (p < e)[m
[31m-    *p++ = *q--;[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  char *p = lj_buf_more(sb, len), *e = p+len;[m
[31m-  const char *q = strdata(s);[m
[31m-  for (; p < e; p++, q++) {[m
[31m-    uint32_t c = *(unsigned char *)q;[m
[31m-#if LJ_TARGET_PPC[m
[31m-    *p = c + ((c >= 'A' && c <= 'Z') << 5);[m
[31m-#else[m
[31m-    if (c >= 'A' && c <= 'Z') c += 0x20;[m
[31m-    *p = c;[m
[31m-#endif[m
[31m-  }[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  char *p = lj_buf_more(sb, len), *e = p+len;[m
[31m-  const char *q = strdata(s);[m
[31m-  for (; p < e; p++, q++) {[m
[31m-    uint32_t c = *(unsigned char *)q;[m
[31m-#if LJ_TARGET_PPC[m
[31m-    *p = c - ((c >= 'a' && c <= 'z') << 5);[m
[31m-#else[m
[31m-    if (c >= 'a' && c <= 'z') c -= 0x20;[m
[31m-    *p = c;[m
[31m-#endif[m
[31m-  }[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf *lj_buf_putstr_rep(SBuf *sb, GCstr *s, int32_t rep)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  if (rep > 0 && len) {[m
[31m-    uint64_t tlen = (uint64_t)rep * len;[m
[31m-    char *p;[m
[31m-    if (LJ_UNLIKELY(tlen > LJ_MAX_STR))[m
[31m-      lj_err_mem(sbufL(sb));[m
[31m-    p = lj_buf_more(sb, (MSize)tlen);[m
[31m-    if (len == 1) {  /* Optimize a common case. */[m
[31m-      uint32_t c = strdata(s)[0];[m
[31m-      do { *p++ = c; } while (--rep > 0);[m
[31m-    } else {[m
[31m-      const char *e = strdata(s) + len;[m
[31m-      do {[m
[31m-	const char *q = strdata(s);[m
[31m-	do { *p++ = *q++; } while (q < e);[m
[31m-      } while (--rep > 0);[m
[31m-    }[m
[31m-    setsbufP(sb, p);[m
[31m-  }[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf *lj_buf_puttab(SBuf *sb, GCtab *t, GCstr *sep, int32_t i, int32_t e)[m
[31m-{[m
[31m-  MSize seplen = sep ? sep->len : 0;[m
[31m-  if (i <= e) {[m
[31m-    for (;;) {[m
[31m-      cTValue *o = lj_tab_getint(t, i);[m
[31m-      char *p;[m
[31m-      if (!o) {[m
[31m-      badtype:  /* Error: bad element type. */[m
[31m-	setsbufP(sb, (void *)(intptr_t)i);  /* Store failing index. */[m
[31m-	return NULL;[m
[31m-      } else if (tvisstr(o)) {[m
[31m-	MSize len = strV(o)->len;[m
[31m-	p = lj_buf_wmem(lj_buf_more(sb, len + seplen), strVdata(o), len);[m
[31m-      } else if (tvisint(o)) {[m
[31m-	p = lj_strfmt_wint(lj_buf_more(sb, STRFMT_MAXBUF_INT+seplen), intV(o));[m
[31m-      } else if (tvisnum(o)) {[m
[31m-	p = lj_buf_more(lj_strfmt_putfnum(sb, STRFMT_G14, numV(o)), seplen);[m
[31m-      } else {[m
[31m-	goto badtype;[m
[31m-      }[m
[31m-      if (i++ == e) {[m
[31m-	setsbufP(sb, p);[m
[31m-	break;[m
[31m-      }[m
[31m-      if (seplen) p = lj_buf_wmem(p, strdata(sep), seplen);[m
[31m-      setsbufP(sb, p);[m
[31m-    }[m
[31m-  }[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous buffer operations ------------------------------------- */[m
[31m-[m
[31m-GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb)[m
[31m-{[m
[31m-  return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb));[m
[31m-}[m
[31m-[m
[31m-/* Concatenate two strings. */[m
[31m-GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2)[m
[31m-{[m
[31m-  MSize len1 = s1->len, len2 = s2->len;[m
[31m-  char *buf = lj_buf_tmp(L, len1 + len2);[m
[31m-  memcpy(buf, strdata(s1), len1);[m
[31m-  memcpy(buf+len1, strdata(s2), len2);[m
[31m-  return lj_str_new(L, buf, len1 + len2);[m
[31m-}[m
[31m-[m
[31m-/* Read ULEB128 from buffer. */[m
[31m-uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp)[m
[31m-{[m
[31m-  const uint8_t *p = (const uint8_t *)*pp;[m
[31m-  uint32_t v = *p++;[m
[31m-  if (LJ_UNLIKELY(v >= 0x80)) {[m
[31m-    int sh = 0;[m
[31m-    v &= 0x7f;[m
[31m-    do { v |= ((*p & 0x7f) << (sh += 7)); } while (*p++ >= 0x80);[m
[31m-  }[m
[31m-  *pp = (const char *)p;[m
[31m-  return v;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.h[m
[1mdeleted file mode 100644[m
[1mindex fb632ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_buf.h[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-/*[m
[31m-** Buffer handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_BUF_H[m
[31m-#define _LJ_BUF_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_str.h"[m
[31m-[m
[31m-/* Resizable string buffers. Struct definition in lj_obj.h. */[m
[31m-#define sbufB(sb)	(mref((sb)->b, char))[m
[31m-#define sbufP(sb)	(mref((sb)->p, char))[m
[31m-#define sbufE(sb)	(mref((sb)->e, char))[m
[31m-#define sbufL(sb)	(mref((sb)->L, lua_State))[m
[31m-#define sbufsz(sb)	((MSize)(sbufE((sb)) - sbufB((sb))))[m
[31m-#define sbuflen(sb)	((MSize)(sbufP((sb)) - sbufB((sb))))[m
[31m-#define sbufleft(sb)	((MSize)(sbufE((sb)) - sbufP((sb))))[m
[31m-#define setsbufP(sb, q)	(setmref((sb)->p, (q)))[m
[31m-#define setsbufL(sb, l)	(setmref((sb)->L, (l)))[m
[31m-[m
[31m-/* Buffer management */[m
[31m-LJ_FUNC char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz);[m
[31m-LJ_FUNC char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb);[m
[31m-LJ_FUNC char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz);[m
[31m-[m
[31m-static LJ_AINLINE void lj_buf_init(lua_State *L, SBuf *sb)[m
[31m-{[m
[31m-  setsbufL(sb, L);[m
[31m-  setmref(sb->p, NULL); setmref(sb->e, NULL); setmref(sb->b, NULL);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void lj_buf_reset(SBuf *sb)[m
[31m-{[m
[31m-  setmrefr(sb->p, sb->b);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE SBuf *lj_buf_tmp_(lua_State *L)[m
[31m-{[m
[31m-  SBuf *sb = &G(L)->tmpbuf;[m
[31m-  setsbufL(sb, L);[m
[31m-  lj_buf_reset(sb);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb)[m
[31m-{[m
[31m-  lj_mem_free(g, sbufB(sb), sbufsz(sb));[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE char *lj_buf_need(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(sz > sbufsz(sb)))[m
[31m-    return lj_buf_need2(sb, sz);[m
[31m-  return sbufB(sb);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE char *lj_buf_more(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(sz > sbufleft(sb)))[m
[31m-    return lj_buf_more2(sb, sz);[m
[31m-  return sbufP(sb);[m
[31m-}[m
[31m-[m
[31m-/* Low-level buffer put operations */[m
[31m-LJ_FUNC SBuf *lj_buf_putmem(SBuf *sb, const void *q, MSize len);[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c);[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_buf_putstr(SBuf *sb, GCstr *s);[m
[31m-[m
[31m-static LJ_AINLINE char *lj_buf_wmem(char *p, const void *q, MSize len)[m
[31m-{[m
[31m-  return (char *)memcpy(p, q, len) + len;[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void lj_buf_putb(SBuf *sb, int c)[m
[31m-{[m
[31m-  char *p = lj_buf_more(sb, 1);[m
[31m-  *p++ = (char)c;[m
[31m-  setsbufP(sb, p);[m
[31m-}[m
[31m-[m
[31m-/* High-level buffer put operations */[m
[31m-LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s);[m
[31m-LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s);[m
[31m-LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s);[m
[31m-LJ_FUNC SBuf *lj_buf_putstr_rep(SBuf *sb, GCstr *s, int32_t rep);[m
[31m-LJ_FUNC SBuf *lj_buf_puttab(SBuf *sb, GCtab *t, GCstr *sep,[m
[31m-			    int32_t i, int32_t e);[m
[31m-[m
[31m-/* Miscellaneous buffer operations */[m
[31m-LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb);[m
[31m-LJ_FUNC GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2);[m
[31m-LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp);[m
[31m-[m
[31m-static LJ_AINLINE GCstr *lj_buf_str(lua_State *L, SBuf *sb)[m
[31m-{[m
[31m-  return lj_str_new(L, sbufB(sb), sbuflen(sb));[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.c[m
[1mdeleted file mode 100644[m
[1mindex 6102dca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.c[m
[1m+++ /dev/null[m
[36m@@ -1,429 +0,0 @@[m
[31m-/*[m
[31m-** C data arithmetic.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_carith.h"[m
[31m-#include "lj_strscan.h"[m
[31m-[m
[31m-/* -- C data arithmetic --------------------------------------------------- */[m
[31m-[m
[31m-/* Binary operands of an operator converted to ctypes. */[m
[31m-typedef struct CDArith {[m
[31m-  uint8_t *p[2];[m
[31m-  CType *ct[2];[m
[31m-} CDArith;[m
[31m-[m
[31m-/* Check arguments for arithmetic metamethods. */[m
[31m-static int carith_checkarg(lua_State *L, CTState *cts, CDArith *ca)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  int ok = 1;[m
[31m-  MSize i;[m
[31m-  if (o+1 >= L->top)[m
[31m-    lj_err_argt(L, 1, LUA_TCDATA);[m
[31m-  for (i = 0; i < 2; i++, o++) {[m
[31m-    if (tviscdata(o)) {[m
[31m-      GCcdata *cd = cdataV(o);[m
[31m-      CTypeID id = (CTypeID)cd->ctypeid;[m
[31m-      CType *ct = ctype_raw(cts, id);[m
[31m-      uint8_t *p = (uint8_t *)cdataptr(cd);[m
[31m-      if (ctype_isptr(ct->info)) {[m
[31m-	p = (uint8_t *)cdata_getptr(p, ct->size);[m
[31m-	if (ctype_isref(ct->info)) ct = ctype_rawchild(cts, ct);[m
[31m-      } else if (ctype_isfunc(ct->info)) {[m
[31m-	p = (uint8_t *)*(void **)p;[m
[31m-	ct = ctype_get(cts,[m
[31m-	  lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR));[m
[31m-      }[m
[31m-      if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-      ca->ct[i] = ct;[m
[31m-      ca->p[i] = p;[m
[31m-    } else if (tvisint(o)) {[m
[31m-      ca->ct[i] = ctype_get(cts, CTID_INT32);[m
[31m-      ca->p[i] = (uint8_t *)&o->i;[m
[31m-    } else if (tvisnum(o)) {[m
[31m-      ca->ct[i] = ctype_get(cts, CTID_DOUBLE);[m
[31m-      ca->p[i] = (uint8_t *)&o->n;[m
[31m-    } else if (tvisnil(o)) {[m
[31m-      ca->ct[i] = ctype_get(cts, CTID_P_VOID);[m
[31m-      ca->p[i] = (uint8_t *)0;[m
[31m-    } else if (tvisstr(o)) {[m
[31m-      TValue *o2 = i == 0 ? o+1 : o-1;[m
[31m-      CType *ct = ctype_raw(cts, cdataV(o2)->ctypeid);[m
[31m-      ca->ct[i] = NULL;[m
[31m-      ca->p[i] = (uint8_t *)strVdata(o);[m
[31m-      ok = 0;[m
[31m-      if (ctype_isenum(ct->info)) {[m
[31m-	CTSize ofs;[m
[31m-	CType *cct = lj_ctype_getfield(cts, ct, strV(o), &ofs);[m
[31m-	if (cct && ctype_isconstval(cct->info)) {[m
[31m-	  ca->ct[i] = ctype_child(cts, cct);[m
[31m-	  ca->p[i] = (uint8_t *)&cct->size;  /* Assumes ct does not grow. */[m
[31m-	  ok = 1;[m
[31m-	} else {[m
[31m-	  ca->ct[1-i] = ct;  /* Use enum to improve error message. */[m
[31m-	  ca->p[1-i] = NULL;[m
[31m-	  break;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      ca->ct[i] = NULL;[m
[31m-      ca->p[i] = (void *)(intptr_t)1;  /* To make it unequal. */[m
[31m-      ok = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  return ok;[m
[31m-}[m
[31m-[m
[31m-/* Pointer arithmetic. */[m
[31m-static int carith_ptr(lua_State *L, CTState *cts, CDArith *ca, MMS mm)[m
[31m-{[m
[31m-  CType *ctp = ca->ct[0];[m
[31m-  uint8_t *pp = ca->p[0];[m
[31m-  ptrdiff_t idx;[m
[31m-  CTSize sz;[m
[31m-  CTypeID id;[m
[31m-  GCcdata *cd;[m
[31m-  if (ctype_isptr(ctp->info) || ctype_isrefarray(ctp->info)) {[m
[31m-    if ((mm == MM_sub || mm == MM_eq || mm == MM_lt || mm == MM_le) &&[m
[31m-	(ctype_isptr(ca->ct[1]->info) || ctype_isrefarray(ca->ct[1]->info))) {[m
[31m-      uint8_t *pp2 = ca->p[1];[m
[31m-      if (mm == MM_eq) {  /* Pointer equality. Incompatible pointers are ok. */[m
[31m-	setboolV(L->top-1, (pp == pp2));[m
[31m-	return 1;[m
[31m-      }[m
[31m-      if (!lj_cconv_compatptr(cts, ctp, ca->ct[1], CCF_IGNQUAL))[m
[31m-	return 0;[m
[31m-      if (mm == MM_sub) {  /* Pointer difference. */[m
[31m-	intptr_t diff;[m
[31m-	sz = lj_ctype_size(cts, ctype_cid(ctp->info));  /* Element size. */[m
[31m-	if (sz == 0 || sz == CTSIZE_INVALID)[m
[31m-	  return 0;[m
[31m-	diff = ((intptr_t)pp - (intptr_t)pp2) / (int32_t)sz;[m
[31m-	/* All valid pointer differences on x64 are in (-2^47, +2^47),[m
[31m-	** which fits into a double without loss of precision.[m
[31m-	*/[m
[31m-	setintptrV(L->top-1, (int32_t)diff);[m
[31m-	return 1;[m
[31m-      } else if (mm == MM_lt) {  /* Pointer comparison (unsigned). */[m
[31m-	setboolV(L->top-1, ((uintptr_t)pp < (uintptr_t)pp2));[m
[31m-	return 1;[m
[31m-      } else {[m
[31m-	lua_assert(mm == MM_le);[m
[31m-	setboolV(L->top-1, ((uintptr_t)pp <= (uintptr_t)pp2));[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!((mm == MM_add || mm == MM_sub) && ctype_isnum(ca->ct[1]->info)))[m
[31m-      return 0;[m
[31m-    lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ca->ct[1],[m
[31m-		   (uint8_t *)&idx, ca->p[1], 0);[m
[31m-    if (mm == MM_sub) idx = -idx;[m
[31m-  } else if (mm == MM_add && ctype_isnum(ctp->info) &&[m
[31m-      (ctype_isptr(ca->ct[1]->info) || ctype_isrefarray(ca->ct[1]->info))) {[m
[31m-    /* Swap pointer and index. */[m
[31m-    ctp = ca->ct[1]; pp = ca->p[1];[m
[31m-    lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ca->ct[0],[m
[31m-		   (uint8_t *)&idx, ca->p[0], 0);[m
[31m-  } else {[m
[31m-    return 0;[m
[31m-  }[m
[31m-  sz = lj_ctype_size(cts, ctype_cid(ctp->info));  /* Element size. */[m
[31m-  if (sz == CTSIZE_INVALID)[m
[31m-    return 0;[m
[31m-  pp += idx*(int32_t)sz;  /* Compute pointer + index. */[m
[31m-  id = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ctp->info)),[m
[31m-		       CTSIZE_PTR);[m
[31m-  cd = lj_cdata_new(cts, id, CTSIZE_PTR);[m
[31m-  *(uint8_t **)cdataptr(cd) = pp;[m
[31m-  setcdataV(L, L->top-1, cd);[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* 64 bit integer arithmetic. */[m
[31m-static int carith_int64(lua_State *L, CTState *cts, CDArith *ca, MMS mm)[m
[31m-{[m
[31m-  if (ctype_isnum(ca->ct[0]->info) && ca->ct[0]->size <= 8 &&[m
[31m-      ctype_isnum(ca->ct[1]->info) && ca->ct[1]->size <= 8) {[m
[31m-    CTypeID id = (((ca->ct[0]->info & CTF_UNSIGNED) && ca->ct[0]->size == 8) ||[m
[31m-		  ((ca->ct[1]->info & CTF_UNSIGNED) && ca->ct[1]->size == 8)) ?[m
[31m-		 CTID_UINT64 : CTID_INT64;[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    GCcdata *cd;[m
[31m-    uint64_t u0, u1, *up;[m
[31m-    lj_cconv_ct_ct(cts, ct, ca->ct[0], (uint8_t *)&u0, ca->p[0], 0);[m
[31m-    if (mm != MM_unm)[m
[31m-      lj_cconv_ct_ct(cts, ct, ca->ct[1], (uint8_t *)&u1, ca->p[1], 0);[m
[31m-    switch (mm) {[m
[31m-    case MM_eq:[m
[31m-      setboolV(L->top-1, (u0 == u1));[m
[31m-      return 1;[m
[31m-    case MM_lt:[m
[31m-      setboolV(L->top-1,[m
[31m-	       id == CTID_INT64 ? ((int64_t)u0 < (int64_t)u1) : (u0 < u1));[m
[31m-      return 1;[m
[31m-    case MM_le:[m
[31m-      setboolV(L->top-1,[m
[31m-	       id == CTID_INT64 ? ((int64_t)u0 <= (int64_t)u1) : (u0 <= u1));[m
[31m-      return 1;[m
[31m-    default: break;[m
[31m-    }[m
[31m-    cd = lj_cdata_new(cts, id, 8);[m
[31m-    up = (uint64_t *)cdataptr(cd);[m
[31m-    setcdataV(L, L->top-1, cd);[m
[31m-    switch (mm) {[m
[31m-    case MM_add: *up = u0 + u1; break;[m
[31m-    case MM_sub: *up = u0 - u1; break;[m
[31m-    case MM_mul: *up = u0 * u1; break;[m
[31m-    case MM_div:[m
[31m-      if (id == CTID_INT64)[m
[31m-	*up = (uint64_t)lj_carith_divi64((int64_t)u0, (int64_t)u1);[m
[31m-      else[m
[31m-	*up = lj_carith_divu64(u0, u1);[m
[31m-      break;[m
[31m-    case MM_mod:[m
[31m-      if (id == CTID_INT64)[m
[31m-	*up = (uint64_t)lj_carith_modi64((int64_t)u0, (int64_t)u1);[m
[31m-      else[m
[31m-	*up = lj_carith_modu64(u0, u1);[m
[31m-      break;[m
[31m-    case MM_pow:[m
[31m-      if (id == CTID_INT64)[m
[31m-	*up = (uint64_t)lj_carith_powi64((int64_t)u0, (int64_t)u1);[m
[31m-      else[m
[31m-	*up = lj_carith_powu64(u0, u1);[m
[31m-      break;[m
[31m-    case MM_unm: *up = (uint64_t)-(int64_t)u0; break;[m
[31m-    default: lua_assert(0); break;[m
[31m-    }[m
[31m-    lj_gc_check(L);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Handle ctype arithmetic metamethods. */[m
[31m-static int lj_carith_meta(lua_State *L, CTState *cts, CDArith *ca, MMS mm)[m
[31m-{[m
[31m-  cTValue *tv = NULL;[m
[31m-  if (tviscdata(L->base)) {[m
[31m-    CTypeID id = cdataV(L->base)->ctypeid;[m
[31m-    CType *ct = ctype_raw(cts, id);[m
[31m-    if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-    tv = lj_ctype_meta(cts, id, mm);[m
[31m-  }[m
[31m-  if (!tv && L->base+1 < L->top && tviscdata(L->base+1)) {[m
[31m-    CTypeID id = cdataV(L->base+1)->ctypeid;[m
[31m-    CType *ct = ctype_raw(cts, id);[m
[31m-    if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-    tv = lj_ctype_meta(cts, id, mm);[m
[31m-  }[m
[31m-  if (!tv) {[m
[31m-    const char *repr[2];[m
[31m-    int i, isenum = -1, isstr = -1;[m
[31m-    if (mm == MM_eq) {  /* Equality checks never raise an error. */[m
[31m-      int eq = ca->p[0] == ca->p[1];[m
[31m-      setboolV(L->top-1, eq);[m
[31m-      setboolV(&G(L)->tmptv2, eq);  /* Remember for trace recorder. */[m
[31m-      return 1;[m
[31m-    }[m
[31m-    for (i = 0; i < 2; i++) {[m
[31m-      if (ca->ct[i] && tviscdata(L->base+i)) {[m
[31m-	if (ctype_isenum(ca->ct[i]->info)) isenum = i;[m
[31m-	repr[i] = strdata(lj_ctype_repr(L, ctype_typeid(cts, ca->ct[i]), NULL));[m
[31m-      } else {[m
[31m-	if (tvisstr(&L->base[i])) isstr = i;[m
[31m-	repr[i] = lj_typename(&L->base[i]);[m
[31m-      }[m
[31m-    }[m
[31m-    if ((isenum ^ isstr) == 1)[m
[31m-      lj_err_callerv(L, LJ_ERR_FFI_BADCONV, repr[isstr], repr[isenum]);[m
[31m-    lj_err_callerv(L, mm == MM_len ? LJ_ERR_FFI_BADLEN :[m
[31m-		      mm == MM_concat ? LJ_ERR_FFI_BADCONCAT :[m
[31m-		      mm < MM_add ? LJ_ERR_FFI_BADCOMP : LJ_ERR_FFI_BADARITH,[m
[31m-		   repr[0], repr[1]);[m
[31m-  }[m
[31m-  return lj_meta_tailcall(L, tv);[m
[31m-}[m
[31m-[m
[31m-/* Arithmetic operators for cdata. */[m
[31m-int lj_carith_op(lua_State *L, MMS mm)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CDArith ca;[m
[31m-  if (carith_checkarg(L, cts, &ca)) {[m
[31m-    if (carith_int64(L, cts, &ca, mm) || carith_ptr(L, cts, &ca, mm)) {[m
[31m-      copyTV(L, &G(L)->tmptv2, L->top-1);  /* Remember for trace recorder. */[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return lj_carith_meta(L, cts, &ca, mm);[m
[31m-}[m
[31m-[m
[31m-/* -- 64 bit bit operations helpers --------------------------------------- */[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define B64DEF(name) \[m
[31m-  static LJ_AINLINE uint64_t lj_carith_##name(uint64_t x, int32_t sh)[m
[31m-#else[m
[31m-/* Not inlined on 32 bit archs, since some of these are quite lengthy. */[m
[31m-#define B64DEF(name) \[m
[31m-  uint64_t LJ_NOINLINE lj_carith_##name(uint64_t x, int32_t sh)[m
[31m-#endif[m
[31m-[m
[31m-B64DEF(shl64) { return x << (sh&63); }[m
[31m-B64DEF(shr64) { return x >> (sh&63); }[m
[31m-B64DEF(sar64) { return (uint64_t)((int64_t)x >> (sh&63)); }[m
[31m-B64DEF(rol64) { return lj_rol(x, (sh&63)); }[m
[31m-B64DEF(ror64) { return lj_ror(x, (sh&63)); }[m
[31m-[m
[31m-#undef B64DEF[m
[31m-[m
[31m-uint64_t lj_carith_shift64(uint64_t x, int32_t sh, int op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case IR_BSHL-IR_BSHL: x = lj_carith_shl64(x, sh); break;[m
[31m-  case IR_BSHR-IR_BSHL: x = lj_carith_shr64(x, sh); break;[m
[31m-  case IR_BSAR-IR_BSHL: x = lj_carith_sar64(x, sh); break;[m
[31m-  case IR_BROL-IR_BSHL: x = lj_carith_rol64(x, sh); break;[m
[31m-  case IR_BROR-IR_BSHL: x = lj_carith_ror64(x, sh); break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-  return x;[m
[31m-}[m
[31m-[m
[31m-/* Equivalent to lj_lib_checkbit(), but handles cdata. */[m
[31m-uint64_t lj_carith_check64(lua_State *L, int narg, CTypeID *id)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (o >= L->top) {[m
[31m-  err:[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-  } else if (LJ_LIKELY(tvisnumber(o))) {[m
[31m-    /* Handled below. */[m
[31m-  } else if (tviscdata(o)) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    uint8_t *sp = (uint8_t *)cdataptr(cdataV(o));[m
[31m-    CTypeID sid = cdataV(o)->ctypeid;[m
[31m-    CType *s = ctype_get(cts, sid);[m
[31m-    uint64_t x;[m
[31m-    if (ctype_isref(s->info)) {[m
[31m-      sp = *(void **)sp;[m
[31m-      sid = ctype_cid(s->info);[m
[31m-    }[m
[31m-    s = ctype_raw(cts, sid);[m
[31m-    if (ctype_isenum(s->info)) s = ctype_child(cts, s);[m
[31m-    if ((s->info & (CTMASK_NUM|CTF_BOOL|CTF_FP|CTF_UNSIGNED)) ==[m
[31m-	CTINFO(CT_NUM, CTF_UNSIGNED) && s->size == 8)[m
[31m-      *id = CTID_UINT64;  /* Use uint64_t, since it has the highest rank. */[m
[31m-    else if (!*id)[m
[31m-      *id = CTID_INT64;  /* Use int64_t, unless already set. */[m
[31m-    lj_cconv_ct_ct(cts, ctype_get(cts, *id), s,[m
[31m-		   (uint8_t *)&x, sp, CCF_ARG(narg));[m
[31m-    return x;[m
[31m-  } else if (!(tvisstr(o) && lj_strscan_number(strV(o), o))) {[m
[31m-    goto err;[m
[31m-  }[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return (uint32_t)intV(o);[m
[31m-  } else {[m
[31m-    int32_t i = lj_num2bit(numV(o));[m
[31m-    if (LJ_DUALNUM) setintV(o, i);[m
[31m-    return (uint32_t)i;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* -- 64 bit integer arithmetic helpers ----------------------------------- */[m
[31m-[m
[31m-#if LJ_32 && LJ_HASJIT[m
[31m-/* Signed/unsigned 64 bit multiplication. */[m
[31m-int64_t lj_carith_mul64(int64_t a, int64_t b)[m
[31m-{[m
[31m-  return a * b;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Unsigned 64 bit division. */[m
[31m-uint64_t lj_carith_divu64(uint64_t a, uint64_t b)[m
[31m-{[m
[31m-  if (b == 0) return U64x(80000000,00000000);[m
[31m-  return a / b;[m
[31m-}[m
[31m-[m
[31m-/* Signed 64 bit division. */[m
[31m-int64_t lj_carith_divi64(int64_t a, int64_t b)[m
[31m-{[m
[31m-  if (b == 0 || (a == (int64_t)U64x(80000000,00000000) && b == -1))[m
[31m-    return U64x(80000000,00000000);[m
[31m-  return a / b;[m
[31m-}[m
[31m-[m
[31m-/* Unsigned 64 bit modulo. */[m
[31m-uint64_t lj_carith_modu64(uint64_t a, uint64_t b)[m
[31m-{[m
[31m-  if (b == 0) return U64x(80000000,00000000);[m
[31m-  return a % b;[m
[31m-}[m
[31m-[m
[31m-/* Signed 64 bit modulo. */[m
[31m-int64_t lj_carith_modi64(int64_t a, int64_t b)[m
[31m-{[m
[31m-  if (b == 0) return U64x(80000000,00000000);[m
[31m-  if (a == (int64_t)U64x(80000000,00000000) && b == -1) return 0;[m
[31m-  return a % b;[m
[31m-}[m
[31m-[m
[31m-/* Unsigned 64 bit x^k. */[m
[31m-uint64_t lj_carith_powu64(uint64_t x, uint64_t k)[m
[31m-{[m
[31m-  uint64_t y;[m
[31m-  if (k == 0)[m
[31m-    return 1;[m
[31m-  for (; (k & 1) == 0; k >>= 1) x *= x;[m
[31m-  y = x;[m
[31m-  if ((k >>= 1) != 0) {[m
[31m-    for (;;) {[m
[31m-      x *= x;[m
[31m-      if (k == 1) break;[m
[31m-      if (k & 1) y *= x;[m
[31m-      k >>= 1;[m
[31m-    }[m
[31m-    y *= x;[m
[31m-  }[m
[31m-  return y;[m
[31m-}[m
[31m-[m
[31m-/* Signed 64 bit x^k. */[m
[31m-int64_t lj_carith_powi64(int64_t x, int64_t k)[m
[31m-{[m
[31m-  if (k == 0)[m
[31m-    return 1;[m
[31m-  if (k < 0) {[m
[31m-    if (x == 0)[m
[31m-      return U64x(7fffffff,ffffffff);[m
[31m-    else if (x == 1)[m
[31m-      return 1;[m
[31m-    else if (x == -1)[m
[31m-      return (k & 1) ? -1 : 1;[m
[31m-    else[m
[31m-      return 0;[m
[31m-  }[m
[31m-  return (int64_t)lj_carith_powu64((uint64_t)x, (uint64_t)k);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.h[m
[1mdeleted file mode 100644[m
[1mindex b3bdff8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_carith.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-/*[m
[31m-** C data arithmetic.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CARITH_H[m
[31m-#define _LJ_CARITH_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-LJ_FUNC int lj_carith_op(lua_State *L, MMS mm);[m
[31m-[m
[31m-#if LJ_32[m
[31m-LJ_FUNC uint64_t lj_carith_shl64(uint64_t x, int32_t sh);[m
[31m-LJ_FUNC uint64_t lj_carith_shr64(uint64_t x, int32_t sh);[m
[31m-LJ_FUNC uint64_t lj_carith_sar64(uint64_t x, int32_t sh);[m
[31m-LJ_FUNC uint64_t lj_carith_rol64(uint64_t x, int32_t sh);[m
[31m-LJ_FUNC uint64_t lj_carith_ror64(uint64_t x, int32_t sh);[m
[31m-#endif[m
[31m-LJ_FUNC uint64_t lj_carith_shift64(uint64_t x, int32_t sh, int op);[m
[31m-LJ_FUNC uint64_t lj_carith_check64(lua_State *L, int narg, CTypeID *id);[m
[31m-[m
[31m-#if LJ_32 && LJ_HASJIT[m
[31m-LJ_FUNC int64_t lj_carith_mul64(int64_t x, int64_t k);[m
[31m-#endif[m
[31m-LJ_FUNC uint64_t lj_carith_divu64(uint64_t a, uint64_t b);[m
[31m-LJ_FUNC int64_t lj_carith_divi64(int64_t a, int64_t b);[m
[31m-LJ_FUNC uint64_t lj_carith_modu64(uint64_t a, uint64_t b);[m
[31m-LJ_FUNC int64_t lj_carith_modi64(int64_t a, int64_t b);[m
[31m-LJ_FUNC uint64_t lj_carith_powu64(uint64_t x, uint64_t k);[m
[31m-LJ_FUNC int64_t lj_carith_powi64(int64_t x, int64_t k);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.c[m
[1mdeleted file mode 100644[m
[1mindex eb7c1ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.c[m
[1m+++ /dev/null[m
[36m@@ -1,1007 +0,0 @@[m
[31m-/*[m
[31m-** FFI C call handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#include "lj_trace.h"[m
[31m-[m
[31m-/* Target-specific handling of register arguments. */[m
[31m-#if LJ_TARGET_X86[m
[31m-/* -- x86 calling conventions --------------------------------------------- */[m
[31m-[m
[31m-#if LJ_ABI_WIN[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  /* Return structs bigger than 8 by reference (on stack only). */ \[m
[31m-  cc->retref = (sz > 8); \[m
[31m-  if (cc->retref) cc->stack[nsp++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET CCALL_HANDLE_STRUCTRET[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#if LJ_TARGET_OSX[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  /* Return structs of size 1, 2, 4 or 8 in registers. */ \[m
[31m-  cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \[m
[31m-  if (cc->retref) { \[m
[31m-    if (ngpr < maxgpr) \[m
[31m-      cc->gpr[ngpr++] = (GPRArg)dp; \[m
[31m-    else \[m
[31m-      cc->stack[nsp++] = (GPRArg)dp; \[m
[31m-  } else {  /* Struct with single FP field ends up in FPR. */ \[m
[31m-    cc->resx87 = ccall_classify_struct(cts, ctr); \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  if (cc->resx87) sp = (uint8_t *)&cc->fpr[0]; \[m
[31m-  memcpy(dp, sp, ctr->size);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = 1;  /* Return all structs by reference (in reg or on stack). */ \[m
[31m-  if (ngpr < maxgpr) \[m
[31m-    cc->gpr[ngpr++] = (GPRArg)dp; \[m
[31m-  else \[m
[31m-    cc->stack[nsp++] = (GPRArg)dp;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Return complex float in GPRs and complex double by reference. */ \[m
[31m-  cc->retref = (sz > 8); \[m
[31m-  if (cc->retref) { \[m
[31m-    if (ngpr < maxgpr) \[m
[31m-      cc->gpr[ngpr++] = (GPRArg)dp; \[m
[31m-    else \[m
[31m-      cc->stack[nsp++] = (GPRArg)dp; \[m
[31m-  }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (!cc->retref) \[m
[31m-    *(int64_t *)dp = *(int64_t *)sp;  /* Copy complex float from GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  ngpr = maxgpr;  /* Pass all structs by value on the stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  isfp = 1;  /* Pass complex by value on stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (!isfp) {  /* Only non-FP values may be passed in registers. */ \[m
[31m-    if (n > 1) {  /* Anything > 32 bit is passed on the stack. */ \[m
[31m-      if (!LJ_ABI_WIN) ngpr = maxgpr;  /* Prevent reordering. */ \[m
[31m-    } else if (ngpr + 1 <= maxgpr) { \[m
[31m-      dp = &cc->gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_X64 && LJ_ABI_WIN[m
[31m-/* -- Windows/x64 calling conventions ------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  /* Return structs of size 1, 2, 4 or 8 in a GPR. */ \[m
[31m-  cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \[m
[31m-  if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET CCALL_HANDLE_STRUCTRET[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (!cc->retref) \[m
[31m-    *(int64_t *)dp = *(int64_t *)sp;  /* Copy complex float from GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  /* Pass structs of size 1, 2, 4 or 8 in a GPR by value. */ \[m
[31m-  if (!(sz == 1 || sz == 2 || sz == 4 || sz == 8)) { \[m
[31m-    rp = cdataptr(lj_cdata_new(cts, did, sz)); \[m
[31m-    sz = CTSIZE_PTR;  /* Pass all other structs by reference. */ \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex float in a GPR and complex double by reference. */ \[m
[31m-  if (sz != 2*sizeof(float)) { \[m
[31m-    rp = cdataptr(lj_cdata_new(cts, did, sz)); \[m
[31m-    sz = CTSIZE_PTR; \[m
[31m-  }[m
[31m-[m
[31m-/* Windows/x64 argument registers are strictly positional (use ngpr). */[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (ngpr < maxgpr) { dp = &cc->fpr[ngpr++]; nfpr = ngpr; goto done; } \[m
[31m-  } else { \[m
[31m-    if (ngpr < maxgpr) { dp = &cc->gpr[ngpr++]; goto done; } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_X64[m
[31m-/* -- POSIX/x64 calling conventions --------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  int rcl[2]; rcl[0] = rcl[1] = 0; \[m
[31m-  if (ccall_classify_struct(cts, ctr, rcl, 0)) { \[m
[31m-    cc->retref = 1;  /* Return struct by reference. */ \[m
[31m-    cc->gpr[ngpr++] = (GPRArg)dp; \[m
[31m-  } else { \[m
[31m-    cc->retref = 0;  /* Return small structs in registers. */ \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  int rcl[2]; rcl[0] = rcl[1] = 0; \[m
[31m-  ccall_classify_struct(cts, ctr, rcl, 0); \[m
[31m-  ccall_struct_ret(cc, rcl, dp, ctr->size);[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Complex values are returned in one or two FPRs. */ \[m
[31m-  cc->retref = 0;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from FPR. */ \[m
[31m-    *(int64_t *)dp = cc->fpr[0].l[0]; \[m
[31m-  } else {  /* Copy non-contiguous complex double from FPRs. */ \[m
[31m-    ((int64_t *)dp)[0] = cc->fpr[0].l[0]; \[m
[31m-    ((int64_t *)dp)[1] = cc->fpr[1].l[0]; \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  int rcl[2]; rcl[0] = rcl[1] = 0; \[m
[31m-  if (!ccall_classify_struct(cts, d, rcl, 0)) { \[m
[31m-    cc->nsp = nsp; cc->ngpr = ngpr; cc->nfpr = nfpr; \[m
[31m-    if (ccall_struct_arg(cc, cts, d, rcl, o, narg)) goto err_nyi; \[m
[31m-    nsp = cc->nsp; ngpr = cc->ngpr; nfpr = cc->nfpr; \[m
[31m-    continue; \[m
[31m-  }  /* Pass all other structs by value on stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  isfp = 2;  /* Pass complex in FPRs or on stack. Needs postprocessing. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (isfp) {  /* Try to pass argument in FPRs. */ \[m
[31m-    int n2 = ctype_isvector(d->info) ? 1 : n; \[m
[31m-    if (nfpr + n2 <= CCALL_NARG_FPR) { \[m
[31m-      dp = &cc->fpr[nfpr]; \[m
[31m-      nfpr += n2; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    /* Note that reordering is explicitly allowed in the x64 ABI. */ \[m
[31m-    if (n <= 2 && ngpr + n <= maxgpr) { \[m
[31m-      dp = &cc->gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_ARM[m
[31m-/* -- ARM calling conventions --------------------------------------------- */[m
[31m-[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  /* Return structs of size <= 4 in a GPR. */ \[m
[31m-  cc->retref = !(sz <= 4); \[m
[31m-  if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  cc->retref = 1;  /* Return all complex values by reference. */ \[m
[31m-  cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  UNUSED(dp); /* Nothing to do. */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  /* Pass all structs by value in registers and/or on the stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex by value in 2 or 4 GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG_FP1[m
[31m-#define CCALL_HANDLE_REGARG_FP2[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = !ccall_classify_struct(cts, ctr, ct); \[m
[31m-  if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  if (ccall_classify_struct(cts, ctr, ct) > 1) sp = (uint8_t *)&cc->fpr[0]; \[m
[31m-  memcpy(dp, sp, ctr->size);[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  if (!(ct->info & CTF_VARARG)) cc->retref = 0;  /* Return complex in FPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (!(ct->info & CTF_VARARG)) memcpy(dp, &cc->fpr[0], ctr->size);[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  isfp = (ccall_classify_struct(cts, d, ct) > 1);[m
[31m-  /* Pass all structs by value in registers and/or on the stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  isfp = 1;  /* Pass complex by value in FPRs or on stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG_FP1 \[m
[31m-  if (isfp && !(ct->info & CTF_VARARG)) { \[m
[31m-    if ((d->info & CTF_ALIGN) > CTALIGN_PTR) { \[m
[31m-      if (nfpr + (n >> 1) <= CCALL_NARG_FPR) { \[m
[31m-	dp = &cc->fpr[nfpr]; \[m
[31m-	nfpr += (n >> 1); \[m
[31m-	goto done; \[m
[31m-      } \[m
[31m-    } else { \[m
[31m-      if (sz > 1 && fprodd != nfpr) fprodd = 0; \[m
[31m-      if (fprodd) { \[m
[31m-	if (2*nfpr+n <= 2*CCALL_NARG_FPR+1) { \[m
[31m-	  dp = (void *)&cc->fpr[fprodd-1].f[1]; \[m
[31m-	  nfpr += (n >> 1); \[m
[31m-	  if ((n & 1)) fprodd = 0; else fprodd = nfpr-1; \[m
[31m-	  goto done; \[m
[31m-	} \[m
[31m-      } else { \[m
[31m-	if (2*nfpr+n <= 2*CCALL_NARG_FPR) { \[m
[31m-	  dp = (void *)&cc->fpr[nfpr]; \[m
[31m-	  nfpr += (n >> 1); \[m
[31m-	  if ((n & 1)) fprodd = ++nfpr; else fprodd = 0; \[m
[31m-	  goto done; \[m
[31m-	} \[m
[31m-      } \[m
[31m-    } \[m
[31m-    fprodd = 0;  /* No reordering after the first FP value is on stack. */ \[m
[31m-  } else {[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG_FP2	}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  CCALL_HANDLE_REGARG_FP1 \[m
[31m-  if ((d->info & CTF_ALIGN) > CTALIGN_PTR) { \[m
[31m-    if (ngpr < maxgpr) \[m
[31m-      ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-  } \[m
[31m-  if (ngpr < maxgpr) { \[m
[31m-    dp = &cc->gpr[ngpr]; \[m
[31m-    if (ngpr + n > maxgpr) { \[m
[31m-      nsp += ngpr + n - maxgpr;  /* Assumes contiguous gpr/stack fields. */ \[m
[31m-      if (nsp > CCALL_MAXSTACK) goto err_nyi;  /* Too many arguments. */ \[m
[31m-      ngpr = maxgpr; \[m
[31m-    } else { \[m
[31m-      ngpr += n; \[m
[31m-    } \[m
[31m-    goto done; \[m
[31m-  } CCALL_HANDLE_REGARG_FP2[m
[31m-[m
[31m-#define CCALL_HANDLE_RET \[m
[31m-  if ((ct->info & CTF_VARARG)) sp = (uint8_t *)&cc->gpr[0];[m
[31m-[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-/* -- ARM64 calling conventions ------------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = !ccall_classify_struct(cts, ctr); \[m
[31m-  if (cc->retref) cc->retp = dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  unsigned int cl = ccall_classify_struct(cts, ctr); \[m
[31m-  if ((cl & 4)) { /* Combine float HFA from separate registers. */ \[m
[31m-    CTSize i = (cl >> 8) - 1; \[m
[31m-    do { ((uint32_t *)dp)[i] = cc->fpr[i].u32; } while (i--); \[m
[31m-  } else { \[m
[31m-    if (cl > 1) sp = (uint8_t *)&cc->fpr[0]; \[m
[31m-    memcpy(dp, sp, ctr->size); \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Complex values are returned in one or two FPRs. */ \[m
[31m-  cc->retref = 0;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from FPRs. */ \[m
[31m-    ((float *)dp)[0] = cc->fpr[0].f; \[m
[31m-    ((float *)dp)[1] = cc->fpr[1].f; \[m
[31m-  } else {  /* Copy complex double from FPRs. */ \[m
[31m-    ((double *)dp)[0] = cc->fpr[0].d; \[m
[31m-    ((double *)dp)[1] = cc->fpr[1].d; \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  unsigned int cl = ccall_classify_struct(cts, d); \[m
[31m-  if (cl == 0) {  /* Pass struct by reference. */ \[m
[31m-    rp = cdataptr(lj_cdata_new(cts, did, sz)); \[m
[31m-    sz = CTSIZE_PTR; \[m
[31m-  } else if (cl > 1) {  /* Pass struct in FPRs or on stack. */ \[m
[31m-    isfp = (cl & 4) ? 2 : 1; \[m
[31m-  }  /* else: Pass struct in GPRs or on stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex by value in separate (!) FPRs or on stack. */ \[m
[31m-  isfp = ctr->size == 2*sizeof(float) ? 2 : 1;[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (LJ_TARGET_IOS && isva) { \[m
[31m-    /* IOS: All variadic arguments are on the stack. */ \[m
[31m-  } else if (isfp) {  /* Try to pass argument in FPRs. */ \[m
[31m-    int n2 = ctype_isvector(d->info) ? 1 : n*isfp; \[m
[31m-    if (nfpr + n2 <= CCALL_NARG_FPR) { \[m
[31m-      dp = &cc->fpr[nfpr]; \[m
[31m-      nfpr += n2; \[m
[31m-      goto done; \[m
[31m-    } else { \[m
[31m-      nfpr = CCALL_NARG_FPR;  /* Prevent reordering. */ \[m
[31m-      if (LJ_TARGET_IOS && d->size < 8) goto err_nyi; \[m
[31m-    } \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    if (!LJ_TARGET_IOS && (d->info & CTF_ALIGN) > CTALIGN_PTR) \[m
[31m-      ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      dp = &cc->gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } else { \[m
[31m-      ngpr = maxgpr;  /* Prevent reordering. */ \[m
[31m-      if (LJ_TARGET_IOS && d->size < 8) goto err_nyi; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_PPC[m
[31m-/* -- PPC calling conventions --------------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = 1;  /* Return all structs by reference. */ \[m
[31m-  cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Complex values are returned in 2 or 4 GPRs. */ \[m
[31m-  cc->retref = 0;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  memcpy(dp, sp, ctr->size);  /* Copy complex from GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  rp = cdataptr(lj_cdata_new(cts, did, sz)); \[m
[31m-  sz = CTSIZE_PTR;  /* Pass all structs by reference. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex by value in 2 or 4 GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (isfp) {  /* Try to pass argument in FPRs. */ \[m
[31m-    if (nfpr + 1 <= CCALL_NARG_FPR) { \[m
[31m-      dp = &cc->fpr[nfpr]; \[m
[31m-      nfpr += 1; \[m
[31m-      d = ctype_get(cts, CTID_DOUBLE);  /* FPRs always hold doubles. */ \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    if (n > 1) { \[m
[31m-      lua_assert(n == 2 || n == 4);  /* int64_t or complex (float). */ \[m
[31m-      if (ctype_isinteger(d->info)) \[m
[31m-	ngpr = (ngpr + 1u) & ~1u;  /* Align int64_t to regpair. */ \[m
[31m-      else if (ngpr + n > maxgpr) \[m
[31m-	ngpr = maxgpr;  /* Prevent reordering. */ \[m
[31m-    } \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      dp = &cc->gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_RET \[m
[31m-  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \[m
[31m-    ctr = ctype_get(cts, CTID_DOUBLE);  /* FPRs always hold doubles. */[m
[31m-[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-/* -- MIPS calling conventions -------------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = 1;  /* Return all structs by reference. */ \[m
[31m-  cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Complex values are returned in 1 or 2 FPRs. */ \[m
[31m-  cc->retref = 0;[m
[31m-[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from GPRs. */ \[m
[31m-    ((intptr_t *)dp)[0] = cc->gpr[0]; \[m
[31m-    ((intptr_t *)dp)[1] = cc->gpr[1]; \[m
[31m-  } else {  /* Copy complex double from GPRs. */ \[m
[31m-    ((intptr_t *)dp)[0] = cc->gpr[0]; \[m
[31m-    ((intptr_t *)dp)[1] = cc->gpr[1]; \[m
[31m-    ((intptr_t *)dp)[2] = cc->gpr[2]; \[m
[31m-    ((intptr_t *)dp)[3] = cc->gpr[3]; \[m
[31m-  }[m
[31m-#else[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from FPRs. */ \[m
[31m-    ((float *)dp)[0] = cc->fpr[0].f; \[m
[31m-    ((float *)dp)[1] = cc->fpr[1].f; \[m
[31m-  } else {  /* Copy complex double from FPRs. */ \[m
[31m-    ((double *)dp)[0] = cc->fpr[0].d; \[m
[31m-    ((double *)dp)[1] = cc->fpr[1].d; \[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  /* Pass all structs by value in registers and/or on the stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex by value in 2 or 4 GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_GPR \[m
[31m-  if ((d->info & CTF_ALIGN) > CTALIGN_PTR) \[m
[31m-    ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-  if (ngpr < maxgpr) { \[m
[31m-    dp = &cc->gpr[ngpr]; \[m
[31m-    if (ngpr + n > maxgpr) { \[m
[31m-     nsp += ngpr + n - maxgpr;  /* Assumes contiguous gpr/stack fields. */ \[m
[31m-     if (nsp > CCALL_MAXSTACK) goto err_nyi;  /* Too many arguments. */ \[m
[31m-     ngpr = maxgpr; \[m
[31m-    } else { \[m
[31m-     ngpr += n; \[m
[31m-    } \[m
[31m-    goto done; \[m
[31m-  }[m
[31m-[m
[31m-#if !LJ_ABI_SOFTFP	/* MIPS32 hard-float */[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (isfp && nfpr < CCALL_NARG_FPR && !(ct->info & CTF_VARARG)) { \[m
[31m-    /* Try to pass argument in FPRs. */ \[m
[31m-    dp = n == 1 ? (void *)&cc->fpr[nfpr].f : (void *)&cc->fpr[nfpr].d; \[m
[31m-    nfpr++; ngpr += n; \[m
[31m-    goto done; \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    nfpr = CCALL_NARG_FPR; \[m
[31m-    CCALL_HANDLE_GPR \[m
[31m-  }[m
[31m-#else			/* MIPS32 soft-float */[m
[31m-#define CCALL_HANDLE_REGARG CCALL_HANDLE_GPR[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_ABI_SOFTFP[m
[31m-/* On MIPS64 soft-float, position of float return values is endian-dependant. */[m
[31m-#define CCALL_HANDLE_RET \[m
[31m-  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \[m
[31m-    sp = (uint8_t *)&cc->fpr[0].f;[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-#error "Missing calling convention definitions for this architecture"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CCALL_HANDLE_STRUCTRET2[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  memcpy(dp, sp, ctr->size);  /* Copy struct return value from GPRs. */[m
[31m-#endif[m
[31m-[m
[31m-/* -- x86 OSX ABI struct classification ----------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86 && LJ_TARGET_OSX[m
[31m-[m
[31m-/* Check for struct with single FP field. */[m
[31m-static int ccall_classify_struct(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTSize sz = ct->size;[m
[31m-  if (!(sz == sizeof(float) || sz == sizeof(double))) return 0;[m
[31m-  if ((ct->info & CTF_UNION)) return 0;[m
[31m-  while (ct->sib) {[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isfield(ct->info)) {[m
[31m-      CType *sct = ctype_rawchild(cts, ct);[m
[31m-      if (ctype_isfp(sct->info)) {[m
[31m-	if (sct->size == sz)[m
[31m-	  return (sz >> 2);  /* Return 1 for float or 2 for double. */[m
[31m-      } else if (ctype_isstruct(sct->info)) {[m
[31m-	if (sct->size)[m
[31m-	  return ccall_classify_struct(cts, sct);[m
[31m-      } else {[m
[31m-	break;[m
[31m-      }[m
[31m-    } else if (ctype_isbitfield(ct->info)) {[m
[31m-      break;[m
[31m-    } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {[m
[31m-      CType *sct = ctype_rawchild(cts, ct);[m
[31m-      if (sct->size)[m
[31m-	return ccall_classify_struct(cts, sct);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- x64 struct classification ------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X64 && !LJ_ABI_WIN[m
[31m-[m
[31m-/* Register classes for x64 struct classification. */[m
[31m-#define CCALL_RCL_INT	1[m
[31m-#define CCALL_RCL_SSE	2[m
[31m-#define CCALL_RCL_MEM	4[m
[31m-/* NYI: classify vectors. */[m
[31m-[m
[31m-static int ccall_classify_struct(CTState *cts, CType *ct, int *rcl, CTSize ofs);[m
[31m-[m
[31m-/* Classify a C type. */[m
[31m-static void ccall_classify_ct(CTState *cts, CType *ct, int *rcl, CTSize ofs)[m
[31m-{[m
[31m-  if (ctype_isarray(ct->info)) {[m
[31m-    CType *cct = ctype_rawchild(cts, ct);[m
[31m-    CTSize eofs, esz = cct->size, asz = ct->size;[m
[31m-    for (eofs = 0; eofs < asz; eofs += esz)[m
[31m-      ccall_classify_ct(cts, cct, rcl, ofs+eofs);[m
[31m-  } else if (ctype_isstruct(ct->info)) {[m
[31m-    ccall_classify_struct(cts, ct, rcl, ofs);[m
[31m-  } else {[m
[31m-    int cl = ctype_isfp(ct->info) ? CCALL_RCL_SSE : CCALL_RCL_INT;[m
[31m-    lua_assert(ctype_hassize(ct->info));[m
[31m-    if ((ofs & (ct->size-1))) cl = CCALL_RCL_MEM;  /* Unaligned. */[m
[31m-    rcl[(ofs >= 8)] |= cl;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Recursively classify a struct based on its fields. */[m
[31m-static int ccall_classify_struct(CTState *cts, CType *ct, int *rcl, CTSize ofs)[m
[31m-{[m
[31m-  if (ct->size > 16) return CCALL_RCL_MEM;  /* Too big, gets memory class. */[m
[31m-  while (ct->sib) {[m
[31m-    CTSize fofs;[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    fofs = ofs+ct->size;[m
[31m-    if (ctype_isfield(ct->info))[m
[31m-      ccall_classify_ct(cts, ctype_rawchild(cts, ct), rcl, fofs);[m
[31m-    else if (ctype_isbitfield(ct->info))[m
[31m-      rcl[(fofs >= 8)] |= CCALL_RCL_INT;  /* NYI: unaligned bitfields? */[m
[31m-    else if (ctype_isxattrib(ct->info, CTA_SUBTYPE))[m
[31m-      ccall_classify_struct(cts, ctype_rawchild(cts, ct), rcl, fofs);[m
[31m-  }[m
[31m-  return ((rcl[0]|rcl[1]) & CCALL_RCL_MEM);  /* Memory class? */[m
[31m-}[m
[31m-[m
[31m-/* Try to split up a small struct into registers. */[m
[31m-static int ccall_struct_reg(CCallState *cc, GPRArg *dp, int *rcl)[m
[31m-{[m
[31m-  MSize ngpr = cc->ngpr, nfpr = cc->nfpr;[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < 2; i++) {[m
[31m-    lua_assert(!(rcl[i] & CCALL_RCL_MEM));[m
[31m-    if ((rcl[i] & CCALL_RCL_INT)) {  /* Integer class takes precedence. */[m
[31m-      if (ngpr >= CCALL_NARG_GPR) return 1;  /* Register overflow. */[m
[31m-      cc->gpr[ngpr++] = dp[i];[m
[31m-    } else if ((rcl[i] & CCALL_RCL_SSE)) {[m
[31m-      if (nfpr >= CCALL_NARG_FPR) return 1;  /* Register overflow. */[m
[31m-      cc->fpr[nfpr++].l[0] = dp[i];[m
[31m-    }[m
[31m-  }[m
[31m-  cc->ngpr = ngpr; cc->nfpr = nfpr;[m
[31m-  return 0;  /* Ok. */[m
[31m-}[m
[31m-[m
[31m-/* Pass a small struct argument. */[m
[31m-static int ccall_struct_arg(CCallState *cc, CTState *cts, CType *d, int *rcl,[m
[31m-			    TValue *o, int narg)[m
[31m-{[m
[31m-  GPRArg dp[2];[m
[31m-  dp[0] = dp[1] = 0;[m
[31m-  /* Convert to temp. struct. */[m
[31m-  lj_cconv_ct_tv(cts, d, (uint8_t *)dp, o, CCF_ARG(narg));[m
[31m-  if (ccall_struct_reg(cc, dp, rcl)) {  /* Register overflow? Pass on stack. */[m
[31m-    MSize nsp = cc->nsp, n = rcl[1] ? 2 : 1;[m
[31m-    if (nsp + n > CCALL_MAXSTACK) return 1;  /* Too many arguments. */[m
[31m-    cc->nsp = nsp + n;[m
[31m-    memcpy(&cc->stack[nsp], dp, n*CTSIZE_PTR);[m
[31m-  }[m
[31m-  return 0;  /* Ok. */[m
[31m-}[m
[31m-[m
[31m-/* Combine returned small struct. */[m
[31m-static void ccall_struct_ret(CCallState *cc, int *rcl, uint8_t *dp, CTSize sz)[m
[31m-{[m
[31m-  GPRArg sp[2];[m
[31m-  MSize ngpr = 0, nfpr = 0;[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < 2; i++) {[m
[31m-    if ((rcl[i] & CCALL_RCL_INT)) {  /* Integer class takes precedence. */[m
[31m-      sp[i] = cc->gpr[ngpr++];[m
[31m-    } else if ((rcl[i] & CCALL_RCL_SSE)) {[m
[31m-      sp[i] = cc->fpr[nfpr++].l[0];[m
[31m-    }[m
[31m-  }[m
[31m-  memcpy(dp, sp, sz);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- ARM hard-float ABI struct classification ---------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_ARM && !LJ_ABI_SOFTFP[m
[31m-[m
[31m-/* Classify a struct based on its fields. */[m
[31m-static unsigned int ccall_classify_struct(CTState *cts, CType *ct, CType *ctf)[m
[31m-{[m
[31m-  CTSize sz = ct->size;[m
[31m-  unsigned int r = 0, n = 0, isu = (ct->info & CTF_UNION);[m
[31m-  if ((ctf->info & CTF_VARARG)) goto noth;[m
[31m-  while (ct->sib) {[m
[31m-    CType *sct;[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isfield(ct->info)) {[m
[31m-      sct = ctype_rawchild(cts, ct);[m
[31m-      if (ctype_isfp(sct->info)) {[m
[31m-	r |= sct->size;[m
[31m-	if (!isu) n++; else if (n == 0) n = 1;[m
[31m-      } else if (ctype_iscomplex(sct->info)) {[m
[31m-	r |= (sct->size >> 1);[m
[31m-	if (!isu) n += 2; else if (n < 2) n = 2;[m
[31m-      } else if (ctype_isstruct(sct->info)) {[m
[31m-	goto substruct;[m
[31m-      } else {[m
[31m-	goto noth;[m
[31m-      }[m
[31m-    } else if (ctype_isbitfield(ct->info)) {[m
[31m-      goto noth;[m
[31m-    } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {[m
[31m-      sct = ctype_rawchild(cts, ct);[m
[31m-    substruct:[m
[31m-      if (sct->size > 0) {[m
[31m-	unsigned int s = ccall_classify_struct(cts, sct, ctf);[m
[31m-	if (s <= 1) goto noth;[m
[31m-	r |= (s & 255);[m
[31m-	if (!isu) n += (s >> 8); else if (n < (s >>8)) n = (s >> 8);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if ((r == 4 || r == 8) && n <= 4)[m
[31m-    return r + (n << 8);[m
[31m-noth:  /* Not a homogeneous float/double aggregate. */[m
[31m-  return (sz <= 4);  /* Return structs of size <= 4 in a GPR. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- ARM64 ABI struct classification ------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_ARM64[m
[31m-[m
[31m-/* Classify a struct based on its fields. */[m
[31m-static unsigned int ccall_classify_struct(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTSize sz = ct->size;[m
[31m-  unsigned int r = 0, n = 0, isu = (ct->info & CTF_UNION);[m
[31m-  while (ct->sib) {[m
[31m-    CType *sct;[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isfield(ct->info)) {[m
[31m-      sct = ctype_rawchild(cts, ct);[m
[31m-      if (ctype_isfp(sct->info)) {[m
[31m-	r |= sct->size;[m
[31m-	if (!isu) n++; else if (n == 0) n = 1;[m
[31m-      } else if (ctype_iscomplex(sct->info)) {[m
[31m-	r |= (sct->size >> 1);[m
[31m-	if (!isu) n += 2; else if (n < 2) n = 2;[m
[31m-      } else if (ctype_isstruct(sct->info)) {[m
[31m-	goto substruct;[m
[31m-      } else {[m
[31m-	goto noth;[m
[31m-      }[m
[31m-    } else if (ctype_isbitfield(ct->info)) {[m
[31m-      goto noth;[m
[31m-    } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {[m
[31m-      sct = ctype_rawchild(cts, ct);[m
[31m-    substruct:[m
[31m-      if (sct->size > 0) {[m
[31m-	unsigned int s = ccall_classify_struct(cts, sct);[m
[31m-	if (s <= 1) goto noth;[m
[31m-	r |= (s & 255);[m
[31m-	if (!isu) n += (s >> 8); else if (n < (s >>8)) n = (s >> 8);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if ((r == 4 || r == 8) && n <= 4)[m
[31m-    return r + (n << 8);[m
[31m-noth:  /* Not a homogeneous float/double aggregate. */[m
[31m-  return (sz <= 16);  /* Return structs of size <= 16 in GPRs. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- Common C call handling ---------------------------------------------- */[m
[31m-[m
[31m-/* Infer the destination CTypeID for a vararg argument. */[m
[31m-CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o)[m
[31m-{[m
[31m-  if (tvisnumber(o)) {[m
[31m-    return CTID_DOUBLE;[m
[31m-  } else if (tviscdata(o)) {[m
[31m-    CTypeID id = cdataV(o)->ctypeid;[m
[31m-    CType *s = ctype_get(cts, id);[m
[31m-    if (ctype_isrefarray(s->info)) {[m
[31m-      return lj_ctype_intern(cts,[m
[31m-	       CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(s->info)), CTSIZE_PTR);[m
[31m-    } else if (ctype_isstruct(s->info) || ctype_isfunc(s->info)) {[m
[31m-      /* NYI: how to pass a struct by value in a vararg argument? */[m
[31m-      return lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR);[m
[31m-    } else if (ctype_isfp(s->info) && s->size == sizeof(float)) {[m
[31m-      return CTID_DOUBLE;[m
[31m-    } else {[m
[31m-      return id;[m
[31m-    }[m
[31m-  } else if (tvisstr(o)) {[m
[31m-    return CTID_P_CCHAR;[m
[31m-  } else if (tvisbool(o)) {[m
[31m-    return CTID_BOOL;[m
[31m-  } else {[m
[31m-    return CTID_P_VOID;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup arguments for C call. */[m
[31m-static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,[m
[31m-			  CCallState *cc)[m
[31m-{[m
[31m-  int gcsteps = 0;[m
[31m-  TValue *o, *top = L->top;[m
[31m-  CTypeID fid;[m
[31m-  CType *ctr;[m
[31m-  MSize maxgpr, ngpr = 0, nsp = 0, narg;[m
[31m-#if CCALL_NARG_FPR[m
[31m-  MSize nfpr = 0;[m
[31m-#if LJ_TARGET_ARM[m
[31m-  MSize fprodd = 0;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-  /* Clear unused regs to get some determinism in case of misdeclaration. */[m
[31m-  memset(cc->gpr, 0, sizeof(cc->gpr));[m
[31m-#if CCALL_NUM_FPR[m
[31m-  memset(cc->fpr, 0, sizeof(cc->fpr));[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_X86[m
[31m-  /* x86 has several different calling conventions. */[m
[31m-  cc->resx87 = 0;[m
[31m-  switch (ctype_cconv(ct->info)) {[m
[31m-  case CTCC_FASTCALL: maxgpr = 2; break;[m
[31m-  case CTCC_THISCALL: maxgpr = 1; break;[m
[31m-  default: maxgpr = 0; break;[m
[31m-  }[m
[31m-#else[m
[31m-  maxgpr = CCALL_NARG_GPR;[m
[31m-#endif[m
[31m-[m
[31m-  /* Perform required setup for some result types. */[m
[31m-  ctr = ctype_rawchild(cts, ct);[m
[31m-  if (ctype_isvector(ctr->info)) {[m
[31m-    if (!(CCALL_VECTOR_REG && (ctr->size == 8 || ctr->size == 16)))[m
[31m-      goto err_nyi;[m
[31m-  } else if (ctype_iscomplex(ctr->info) || ctype_isstruct(ctr->info)) {[m
[31m-    /* Preallocate cdata object and anchor it after arguments. */[m
[31m-    CTSize sz = ctr->size;[m
[31m-    GCcdata *cd = lj_cdata_new(cts, ctype_cid(ct->info), sz);[m
[31m-    void *dp = cdataptr(cd);[m
[31m-    setcdataV(L, L->top++, cd);[m
[31m-    if (ctype_isstruct(ctr->info)) {[m
[31m-      CCALL_HANDLE_STRUCTRET[m
[31m-    } else {[m
[31m-      CCALL_HANDLE_COMPLEXRET[m
[31m-    }[m
[31m-#if LJ_TARGET_X86[m
[31m-  } else if (ctype_isfp(ctr->info)) {[m
[31m-    cc->resx87 = ctr->size == sizeof(float) ? 1 : 2;[m
[31m-#endif[m
[31m-  }[m
[31m-[m
[31m-  /* Skip initial attributes. */[m
[31m-  fid = ct->sib;[m
[31m-  while (fid) {[m
[31m-    CType *ctf = ctype_get(cts, fid);[m
[31m-    if (!ctype_isattrib(ctf->info)) break;[m
[31m-    fid = ctf->sib;[m
[31m-  }[m
[31m-[m
[31m-  /* Walk through all passed arguments. */[m
[31m-  for (o = L->base+1, narg = 1; o < top; o++, narg++) {[m
[31m-    CTypeID did;[m
[31m-    CType *d;[m
[31m-    CTSize sz;[m
[31m-    MSize n, isfp = 0, isva = 0;[m
[31m-    void *dp, *rp = NULL;[m
[31m-[m
[31m-    if (fid) {  /* Get argument type from field. */[m
[31m-      CType *ctf = ctype_get(cts, fid);[m
[31m-      fid = ctf->sib;[m
[31m-      lua_assert(ctype_isfield(ctf->info));[m
[31m-      did = ctype_cid(ctf->info);[m
[31m-    } else {[m
[31m-      if (!(ct->info & CTF_VARARG))[m
[31m-	lj_err_caller(L, LJ_ERR_FFI_NUMARG);  /* Too many arguments. */[m
[31m-      did = lj_ccall_ctid_vararg(cts, o);  /* Infer vararg type. */[m
[31m-      isva = 1;[m
[31m-    }[m
[31m-    d = ctype_raw(cts, did);[m
[31m-    sz = d->size;[m
[31m-[m
[31m-    /* Find out how (by value/ref) and where (GPR/FPR) to pass an argument. */[m
[31m-    if (ctype_isnum(d->info)) {[m
[31m-      if (sz > 8) goto err_nyi;[m
[31m-      if ((d->info & CTF_FP))[m
[31m-	isfp = 1;[m
[31m-    } else if (ctype_isvector(d->info)) {[m
[31m-      if (CCALL_VECTOR_REG && (sz == 8 || sz == 16))[m
[31m-	isfp = 1;[m
[31m-      else[m
[31m-	goto err_nyi;[m
[31m-    } else if (ctype_isstruct(d->info)) {[m
[31m-      CCALL_HANDLE_STRUCTARG[m
[31m-    } else if (ctype_iscomplex(d->info)) {[m
[31m-      CCALL_HANDLE_COMPLEXARG[m
[31m-    } else {[m
[31m-      sz = CTSIZE_PTR;[m
[31m-    }[m
[31m-    sz = (sz + CTSIZE_PTR-1) & ~(CTSIZE_PTR-1);[m
[31m-    n = sz / CTSIZE_PTR;  /* Number of GPRs or stack slots needed. */[m
[31m-[m
[31m-    CCALL_HANDLE_REGARG  /* Handle register arguments. */[m
[31m-[m
[31m-    /* Otherwise pass argument on stack. */[m
[31m-    if (CCALL_ALIGN_STACKARG && !rp && (d->info & CTF_ALIGN) > CTALIGN_PTR) {[m
[31m-      MSize align = (1u << ctype_align(d->info-CTALIGN_PTR)) -1;[m
[31m-      nsp = (nsp + align) & ~align;  /* Align argument on stack. */[m
[31m-    }[m
[31m-    if (nsp + n > CCALL_MAXSTACK) {  /* Too many arguments. */[m
[31m-    err_nyi:[m
[31m-      lj_err_caller(L, LJ_ERR_FFI_NYICALL);[m
[31m-    }[m
[31m-    dp = &cc->stack[nsp];[m
[31m-    nsp += n;[m
[31m-    isva = 0;[m
[31m-[m
[31m-  done:[m
[31m-    if (rp) {  /* Pass by reference. */[m
[31m-      gcsteps++;[m
[31m-      *(void **)dp = rp;[m
[31m-      dp = rp;[m
[31m-    }[m
[31m-    lj_cconv_ct_tv(cts, d, (uint8_t *)dp, o, CCF_ARG(narg));[m
[31m-    /* Extend passed integers to 32 bits at least. */[m
[31m-    if (ctype_isinteger_or_bool(d->info) && d->size < 4) {[m
[31m-      if (d->info & CTF_UNSIGNED)[m
[31m-	*(uint32_t *)dp = d->size == 1 ? (uint32_t)*(uint8_t *)dp :[m
[31m-					 (uint32_t)*(uint16_t *)dp;[m
[31m-      else[m
[31m-	*(int32_t *)dp = d->size == 1 ? (int32_t)*(int8_t *)dp :[m
[31m-					(int32_t)*(int16_t *)dp;[m
[31m-    }[m
[31m-#if LJ_TARGET_X64 && LJ_ABI_WIN[m
[31m-    if (isva) {  /* Windows/x64 mirrors varargs in both register sets. */[m
[31m-      if (nfpr == ngpr)[m
[31m-	cc->gpr[ngpr-1] = cc->fpr[ngpr-1].l[0];[m
[31m-      else[m
[31m-	cc->fpr[ngpr-1].l[0] = cc->gpr[ngpr-1];[m
[31m-    }[m
[31m-#else[m
[31m-    UNUSED(isva);[m
[31m-#endif[m
[31m-#if LJ_TARGET_X64 && !LJ_ABI_WIN[m
[31m-    if (isfp == 2 && n == 2 && (uint8_t *)dp == (uint8_t *)&cc->fpr[nfpr-2]) {[m
[31m-      cc->fpr[nfpr-1].d[0] = cc->fpr[nfpr-2].d[1];  /* Split complex double. */[m
[31m-      cc->fpr[nfpr-2].d[1] = 0;[m
[31m-    }[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-    if (isfp == 2 && (uint8_t *)dp < (uint8_t *)cc->stack) {[m
[31m-      /* Split float HFA or complex float into separate registers. */[m
[31m-      CTSize i = (sz >> 2) - 1;[m
[31m-      do { ((uint64_t *)dp)[i] = ((uint32_t *)dp)[i]; } while (i--);[m
[31m-    }[m
[31m-#else[m
[31m-    UNUSED(isfp);[m
[31m-#endif[m
[31m-  }[m
[31m-  if (fid) lj_err_caller(L, LJ_ERR_FFI_NUMARG);  /* Too few arguments. */[m
[31m-[m
[31m-#if LJ_TARGET_X64 || LJ_TARGET_PPC[m
[31m-  cc->nfpr = nfpr;  /* Required for vararg functions. */[m
[31m-#endif[m
[31m-  cc->nsp = nsp;[m
[31m-  cc->spadj = (CCALL_SPS_FREE + CCALL_SPS_EXTRA)*CTSIZE_PTR;[m
[31m-  if (nsp > CCALL_SPS_FREE)[m
[31m-    cc->spadj += (((nsp-CCALL_SPS_FREE)*CTSIZE_PTR + 15u) & ~15u);[m
[31m-  return gcsteps;[m
[31m-}[m
[31m-[m
[31m-/* Get results from C call. */[m
[31m-static int ccall_get_results(lua_State *L, CTState *cts, CType *ct,[m
[31m-			     CCallState *cc, int *ret)[m
[31m-{[m
[31m-  CType *ctr = ctype_rawchild(cts, ct);[m
[31m-  uint8_t *sp = (uint8_t *)&cc->gpr[0];[m
[31m-  if (ctype_isvoid(ctr->info)) {[m
[31m-    *ret = 0;  /* Zero results. */[m
[31m-    return 0;  /* No additional GC step. */[m
[31m-  }[m
[31m-  *ret = 1;  /* One result. */[m
[31m-  if (ctype_isstruct(ctr->info)) {[m
[31m-    /* Return cdata object which is already on top of stack. */[m
[31m-    if (!cc->retref) {[m
[31m-      void *dp = cdataptr(cdataV(L->top-1));  /* Use preallocated object. */[m
[31m-      CCALL_HANDLE_STRUCTRET2[m
[31m-    }[m
[31m-    return 1;  /* One GC step. */[m
[31m-  }[m
[31m-  if (ctype_iscomplex(ctr->info)) {[m
[31m-    /* Return cdata object which is already on top of stack. */[m
[31m-    void *dp = cdataptr(cdataV(L->top-1));  /* Use preallocated object. */[m
[31m-    CCALL_HANDLE_COMPLEXRET2[m
[31m-    return 1;  /* One GC step. */[m
[31m-  }[m
[31m-  if (LJ_BE && ctype_isinteger_or_bool(ctr->info) && ctr->size < CTSIZE_PTR)[m
[31m-    sp += (CTSIZE_PTR - ctr->size);[m
[31m-#if CCALL_NUM_FPR[m
[31m-  if (ctype_isfp(ctr->info) || ctype_isvector(ctr->info))[m
[31m-    sp = (uint8_t *)&cc->fpr[0];[m
[31m-#endif[m
[31m-#ifdef CCALL_HANDLE_RET[m
[31m-  CCALL_HANDLE_RET[m
[31m-#endif[m
[31m-  /* No reference types end up here, so there's no need for the CTypeID. */[m
[31m-  lua_assert(!(ctype_isrefarray(ctr->info) || ctype_isstruct(ctr->info)));[m
[31m-  return lj_cconv_tv_ct(cts, ctr, 0, L->top-1, sp);[m
[31m-}[m
[31m-[m
[31m-/* Call C function. */[m
[31m-int lj_ccall_func(lua_State *L, GCcdata *cd)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  CTSize sz = CTSIZE_PTR;[m
[31m-  if (ctype_isptr(ct->info)) {[m
[31m-    sz = ct->size;[m
[31m-    ct = ctype_rawchild(cts, ct);[m
[31m-  }[m
[31m-  if (ctype_isfunc(ct->info)) {[m
[31m-    CCallState cc;[m
[31m-    int gcsteps, ret;[m
[31m-    cc.func = (void (*)(void))cdata_getptr(cdataptr(cd), sz);[m
[31m-    gcsteps = ccall_set_args(L, cts, ct, &cc);[m
[31m-    ct = (CType *)((intptr_t)ct-(intptr_t)cts->tab);[m
[31m-    cts->cb.slot = ~0u;[m
[31m-    lj_vm_ffi_call(&cc);[m
[31m-    if (cts->cb.slot != ~0u) {  /* Blacklist function that called a callback. */[m
[31m-      TValue tv;[m
[31m-      setlightudV(&tv, (void *)cc.func);[m
[31m-      setboolV(lj_tab_set(L, cts->miscmap, &tv), 1);[m
[31m-    }[m
[31m-    ct = (CType *)((intptr_t)ct+(intptr_t)cts->tab);  /* May be reallocated. */[m
[31m-    gcsteps += ccall_get_results(L, cts, ct, &cc, &ret);[m
[31m-#if LJ_TARGET_X86 && LJ_ABI_WIN[m
[31m-    /* Automatically detect __stdcall and fix up C function declaration. */[m
[31m-    if (cc.spadj && ctype_cconv(ct->info) == CTCC_CDECL) {[m
[31m-      CTF_INSERT(ct->info, CCONV, CTCC_STDCALL);[m
[31m-      lj_trace_abort(G(L));[m
[31m-    }[m
[31m-#endif[m
[31m-    while (gcsteps-- > 0)[m
[31m-      lj_gc_check(L);[m
[31m-    return ret;[m
[31m-  }[m
[31m-  return -1;  /* Not a function. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.h[m
[1mdeleted file mode 100644[m
[1mindex a77afae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccall.h[m
[1m+++ /dev/null[m
[36m@@ -1,178 +0,0 @@[m
[31m-/*[m
[31m-** FFI C call handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CCALL_H[m
[31m-#define _LJ_CCALL_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* -- C calling conventions ----------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-[m
[31m-#if LJ_TARGET_X86[m
[31m-#define CCALL_NARG_GPR		2	/* For fastcall arguments. */[m
[31m-#define CCALL_NARG_FPR		0[m
[31m-#define CCALL_NRET_GPR		2[m
[31m-#define CCALL_NRET_FPR		1	/* For FP results on x87 stack. */[m
[31m-#define CCALL_ALIGN_STACKARG	0	/* Don't align argument on stack. */[m
[31m-#elif LJ_ABI_WIN[m
[31m-#define CCALL_NARG_GPR		4[m
[31m-#define CCALL_NARG_FPR		4[m
[31m-#define CCALL_NRET_GPR		1[m
[31m-#define CCALL_NRET_FPR		1[m
[31m-#define CCALL_SPS_EXTRA		4[m
[31m-#else[m
[31m-#define CCALL_NARG_GPR		6[m
[31m-#define CCALL_NARG_FPR		8[m
[31m-#define CCALL_NRET_GPR		2[m
[31m-#define CCALL_NRET_FPR		2[m
[31m-#define CCALL_VECTOR_REG	1	/* Pass vectors in registers. */[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_SPS_FREE		1[m
[31m-#define CCALL_ALIGN_CALLSTATE	16[m
[31m-[m
[31m-typedef LJ_ALIGN(16) union FPRArg {[m
[31m-  double d[2];[m
[31m-  float f[4];[m
[31m-  uint8_t b[16];[m
[31m-  uint16_t s[8];[m
[31m-  int i[4];[m
[31m-  int64_t l[2];[m
[31m-} FPRArg;[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-[m
[31m-#elif LJ_TARGET_ARM[m
[31m-[m
[31m-#define CCALL_NARG_GPR		4[m
[31m-#define CCALL_NRET_GPR		2	/* For softfp double. */[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-#define CCALL_NARG_FPR		0[m
[31m-#define CCALL_NRET_FPR		0[m
[31m-#else[m
[31m-#define CCALL_NARG_FPR		8[m
[31m-#define CCALL_NRET_FPR		4[m
[31m-#endif[m
[31m-#define CCALL_SPS_FREE		0[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-typedef union FPRArg {[m
[31m-  double d;[m
[31m-  float f[2];[m
[31m-} FPRArg;[m
[31m-[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-[m
[31m-#define CCALL_NARG_GPR		8[m
[31m-#define CCALL_NRET_GPR		2[m
[31m-#define CCALL_NARG_FPR		8[m
[31m-#define CCALL_NRET_FPR		4[m
[31m-#define CCALL_SPS_FREE		0[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-typedef union FPRArg {[m
[31m-  double d;[m
[31m-  float f;[m
[31m-  uint32_t u32;[m
[31m-} FPRArg;[m
[31m-[m
[31m-#elif LJ_TARGET_PPC[m
[31m-[m
[31m-#define CCALL_NARG_GPR		8[m
[31m-#define CCALL_NARG_FPR		8[m
[31m-#define CCALL_NRET_GPR		4	/* For complex double. */[m
[31m-#define CCALL_NRET_FPR		1[m
[31m-#define CCALL_SPS_EXTRA		4[m
[31m-#define CCALL_SPS_FREE		0[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-typedef double FPRArg;[m
[31m-[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-[m
[31m-#define CCALL_NARG_GPR		4[m
[31m-#define CCALL_NARG_FPR		(LJ_ABI_SOFTFP ? 0 : 2)[m
[31m-#define CCALL_NRET_GPR		2[m
[31m-#define CCALL_NRET_FPR		(LJ_ABI_SOFTFP ? 0 : 2)[m
[31m-#define CCALL_SPS_EXTRA		7[m
[31m-#define CCALL_SPS_FREE		1[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-typedef union FPRArg {[m
[31m-  double d;[m
[31m-  struct { LJ_ENDIAN_LOHI(float f; , float g;) };[m
[31m-} FPRArg;[m
[31m-[m
[31m-#else[m
[31m-#error "Missing calling convention definitions for this architecture"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CCALL_SPS_EXTRA[m
[31m-#define CCALL_SPS_EXTRA		0[m
[31m-#endif[m
[31m-#ifndef CCALL_VECTOR_REG[m
[31m-#define CCALL_VECTOR_REG	0[m
[31m-#endif[m
[31m-#ifndef CCALL_ALIGN_STACKARG[m
[31m-#define CCALL_ALIGN_STACKARG	1[m
[31m-#endif[m
[31m-#ifndef CCALL_ALIGN_CALLSTATE[m
[31m-#define CCALL_ALIGN_CALLSTATE	8[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_NUM_GPR \[m
[31m-  (CCALL_NARG_GPR > CCALL_NRET_GPR ? CCALL_NARG_GPR : CCALL_NRET_GPR)[m
[31m-#define CCALL_NUM_FPR \[m
[31m-  (CCALL_NARG_FPR > CCALL_NRET_FPR ? CCALL_NARG_FPR : CCALL_NRET_FPR)[m
[31m-[m
[31m-/* Check against constants in lj_ctype.h. */[m
[31m-LJ_STATIC_ASSERT(CCALL_NUM_GPR <= CCALL_MAX_GPR);[m
[31m-LJ_STATIC_ASSERT(CCALL_NUM_FPR <= CCALL_MAX_FPR);[m
[31m-[m
[31m-#define CCALL_MAXSTACK		32[m
[31m-[m
[31m-/* -- C call state -------------------------------------------------------- */[m
[31m-[m
[31m-typedef LJ_ALIGN(CCALL_ALIGN_CALLSTATE) struct CCallState {[m
[31m-  void (*func)(void);		/* Pointer to called function. */[m
[31m-  uint32_t spadj;		/* Stack pointer adjustment. */[m
[31m-  uint8_t nsp;			/* Number of stack slots. */[m
[31m-  uint8_t retref;		/* Return value by reference. */[m
[31m-#if LJ_TARGET_X64[m
[31m-  uint8_t ngpr;			/* Number of arguments in GPRs. */[m
[31m-  uint8_t nfpr;			/* Number of arguments in FPRs. */[m
[31m-#elif LJ_TARGET_X86[m
[31m-  uint8_t resx87;		/* Result on x87 stack: 1:float, 2:double. */[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-  void *retp;			/* Aggregate return pointer in x8. */[m
[31m-#elif LJ_TARGET_PPC[m
[31m-  uint8_t nfpr;			/* Number of arguments in FPRs. */[m
[31m-#endif[m
[31m-#if LJ_32[m
[31m-  int32_t align1;[m
[31m-#endif[m
[31m-#if CCALL_NUM_FPR[m
[31m-  FPRArg fpr[CCALL_NUM_FPR];	/* Arguments/results in FPRs. */[m
[31m-#endif[m
[31m-  GPRArg gpr[CCALL_NUM_GPR];	/* Arguments/results in GPRs. */[m
[31m-  GPRArg stack[CCALL_MAXSTACK];	/* Stack slots. */[m
[31m-} CCallState;[m
[31m-[m
[31m-/* -- C call handling ----------------------------------------------------- */[m
[31m-[m
[31m-/* Really belongs to lj_vm.h. */[m
[31m-LJ_ASMF void LJ_FASTCALL lj_vm_ffi_call(CCallState *cc);[m
[31m-[m
[31m-LJ_FUNC CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o);[m
[31m-LJ_FUNC int lj_ccall_func(lua_State *L, GCcdata *cd);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.c[m
[1mdeleted file mode 100644[m
[1mindex 43c29e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.c[m
[1m+++ /dev/null[m
[36m@@ -1,721 +0,0 @@[m
[31m-/*[m
[31m-** FFI C callback handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#include "lj_ccallback.h"[m
[31m-#include "lj_target.h"[m
[31m-#include "lj_mcode.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* -- Target-specific handling of callback slots -------------------------- */[m
[31m-[m
[31m-#define CALLBACK_MCODE_SIZE	(LJ_PAGESIZE * LJ_NUM_CBPAGE)[m
[31m-[m
[31m-#if LJ_OS_NOJIT[m
[31m-[m
[31m-/* Callbacks disabled. */[m
[31m-#define CALLBACK_SLOT2OFS(slot)	(0*(slot))[m
[31m-#define CALLBACK_OFS2SLOT(ofs)	(0*(ofs))[m
[31m-#define CALLBACK_MAX_SLOT	0[m
[31m-[m
[31m-#elif LJ_TARGET_X86ORX64[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD	(LJ_64 ? 8 : 0)[m
[31m-#define CALLBACK_MCODE_GROUP	(-2+1+2+(LJ_GC64 ? 10 : 5)+(LJ_64 ? 6 : 5))[m
[31m-[m
[31m-#define CALLBACK_SLOT2OFS(slot) \[m
[31m-  (CALLBACK_MCODE_HEAD + CALLBACK_MCODE_GROUP*((slot)/32) + 4*(slot))[m
[31m-[m
[31m-static MSize CALLBACK_OFS2SLOT(MSize ofs)[m
[31m-{[m
[31m-  MSize group;[m
[31m-  ofs -= CALLBACK_MCODE_HEAD;[m
[31m-  group = ofs / (32*4 + CALLBACK_MCODE_GROUP);[m
[31m-  return (ofs % (32*4 + CALLBACK_MCODE_GROUP))/4 + group*32;[m
[31m-}[m
[31m-[m
[31m-#define CALLBACK_MAX_SLOT \[m
[31m-  (((CALLBACK_MCODE_SIZE-CALLBACK_MCODE_HEAD)/(CALLBACK_MCODE_GROUP+4*32))*32)[m
[31m-[m
[31m-#elif LJ_TARGET_ARM[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD		32[m
[31m-[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD		32[m
[31m-[m
[31m-#elif LJ_TARGET_PPC[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD		24[m
[31m-[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD		24[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* Missing support for this architecture. */[m
[31m-#define CALLBACK_SLOT2OFS(slot)	(0*(slot))[m
[31m-#define CALLBACK_OFS2SLOT(ofs)	(0*(ofs))[m
[31m-#define CALLBACK_MAX_SLOT	0[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CALLBACK_SLOT2OFS[m
[31m-#define CALLBACK_SLOT2OFS(slot)		(CALLBACK_MCODE_HEAD + 8*(slot))[m
[31m-#define CALLBACK_OFS2SLOT(ofs)		(((ofs)-CALLBACK_MCODE_HEAD)/8)[m
[31m-#define CALLBACK_MAX_SLOT		(CALLBACK_OFS2SLOT(CALLBACK_MCODE_SIZE))[m
[31m-#endif[m
[31m-[m
[31m-/* Convert callback slot number to callback function pointer. */[m
[31m-static void *callback_slot2ptr(CTState *cts, MSize slot)[m
[31m-{[m
[31m-  return (uint8_t *)cts->cb.mcode + CALLBACK_SLOT2OFS(slot);[m
[31m-}[m
[31m-[m
[31m-/* Convert callback function pointer to slot number. */[m
[31m-MSize lj_ccallback_ptr2slot(CTState *cts, void *p)[m
[31m-{[m
[31m-  uintptr_t ofs = (uintptr_t)((uint8_t *)p -(uint8_t *)cts->cb.mcode);[m
[31m-  if (ofs < CALLBACK_MCODE_SIZE) {[m
[31m-    MSize slot = CALLBACK_OFS2SLOT((MSize)ofs);[m
[31m-    if (CALLBACK_SLOT2OFS(slot) == (MSize)ofs)[m
[31m-      return slot;[m
[31m-  }[m
[31m-  return ~0u;  /* Not a known callback function pointer. */[m
[31m-}[m
[31m-[m
[31m-/* Initialize machine code for callback function pointers. */[m
[31m-#if LJ_OS_NOJIT[m
[31m-/* Disabled callback support. */[m
[31m-#define callback_mcode_init(g, p)	UNUSED(p)[m
[31m-#elif LJ_TARGET_X86ORX64[m
[31m-static void callback_mcode_init(global_State *g, uint8_t *page)[m
[31m-{[m
[31m-  uint8_t *p = page;[m
[31m-  uint8_t *target = (uint8_t *)(void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-#if LJ_64[m
[31m-  *(void **)p = target; p += 8;[m
[31m-#endif[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    /* mov al, slot; jmp group */[m
[31m-    *p++ = XI_MOVrib | RID_EAX; *p++ = (uint8_t)slot;[m
[31m-    if ((slot & 31) == 31 || slot == CALLBACK_MAX_SLOT-1) {[m
[31m-      /* push ebp/rbp; mov ah, slot>>8; mov ebp, &g. */[m
[31m-      *p++ = XI_PUSH + RID_EBP;[m
[31m-      *p++ = XI_MOVrib | (RID_EAX+4); *p++ = (uint8_t)(slot >> 8);[m
[31m-#if LJ_GC64[m
[31m-      *p++ = 0x48; *p++ = XI_MOVri | RID_EBP;[m
[31m-      *(uint64_t *)p = (uint64_t)(g); p += 8;[m
[31m-#else[m
[31m-      *p++ = XI_MOVri | RID_EBP;[m
[31m-      *(int32_t *)p = i32ptr(g); p += 4;[m
[31m-#endif[m
[31m-#if LJ_64[m
[31m-      /* jmp [rip-pageofs] where lj_vm_ffi_callback is stored. */[m
[31m-      *p++ = XI_GROUP5; *p++ = XM_OFS0 + (XOg_JMP<<3) + RID_EBP;[m
[31m-      *(int32_t *)p = (int32_t)(page-(p+4)); p += 4;[m
[31m-#else[m
[31m-      /* jmp lj_vm_ffi_callback. */[m
[31m-      *p++ = XI_JMP; *(int32_t *)p = target-(p+4); p += 4;[m
[31m-#endif[m
[31m-    } else {[m
[31m-      *p++ = XI_JMPs; *p++ = (uint8_t)((2+2)*(31-(slot&31)) - 2);[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#elif LJ_TARGET_ARM[m
[31m-static void callback_mcode_init(global_State *g, uint32_t *page)[m
[31m-{[m
[31m-  uint32_t *p = page;[m
[31m-  void *target = (void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-  /* This must match with the saveregs macro in buildvm_arm.dasc. */[m
[31m-  *p++ = ARMI_SUB|ARMF_D(RID_R12)|ARMF_N(RID_R12)|ARMF_M(RID_PC);[m
[31m-  *p++ = ARMI_PUSH|ARMF_N(RID_SP)|RSET_RANGE(RID_R4,RID_R11+1)|RID2RSET(RID_LR);[m
[31m-  *p++ = ARMI_SUB|ARMI_K12|ARMF_D(RID_R12)|ARMF_N(RID_R12)|CALLBACK_MCODE_HEAD;[m
[31m-  *p++ = ARMI_STR|ARMI_LS_P|ARMI_LS_W|ARMF_D(RID_R12)|ARMF_N(RID_SP)|(CFRAME_SIZE-4*9);[m
[31m-  *p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_R12)|ARMF_N(RID_PC);[m
[31m-  *p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_PC)|ARMF_N(RID_PC);[m
[31m-  *p++ = u32ptr(g);[m
[31m-  *p++ = u32ptr(target);[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    *p++ = ARMI_MOV|ARMF_D(RID_R12)|ARMF_M(RID_PC);[m
[31m-    *p = ARMI_B | ((page-p-2) & 0x00ffffffu);[m
[31m-    p++;[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-static void callback_mcode_init(global_State *g, uint32_t *page)[m
[31m-{[m
[31m-  uint32_t *p = page;[m
[31m-  void *target = (void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-  *p++ = A64I_LDRLx | A64F_D(RID_X11) | A64F_S19(4);[m
[31m-  *p++ = A64I_LDRLx | A64F_D(RID_X10) | A64F_S19(5);[m
[31m-  *p++ = A64I_BR | A64F_N(RID_X11);[m
[31m-  *p++ = A64I_NOP;[m
[31m-  ((void **)p)[0] = target;[m
[31m-  ((void **)p)[1] = g;[m
[31m-  p += 4;[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    *p++ = A64I_MOVZw | A64F_D(RID_X9) | A64F_U16(slot);[m
[31m-    *p = A64I_B | A64F_S26((page-p) & 0x03ffffffu);[m
[31m-    p++;[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#elif LJ_TARGET_PPC[m
[31m-static void callback_mcode_init(global_State *g, uint32_t *page)[m
[31m-{[m
[31m-  uint32_t *p = page;[m
[31m-  void *target = (void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-  *p++ = PPCI_LIS | PPCF_T(RID_TMP) | (u32ptr(target) >> 16);[m
[31m-  *p++ = PPCI_LIS | PPCF_T(RID_R12) | (u32ptr(g) >> 16);[m
[31m-  *p++ = PPCI_ORI | PPCF_A(RID_TMP)|PPCF_T(RID_TMP) | (u32ptr(target) & 0xffff);[m
[31m-  *p++ = PPCI_ORI | PPCF_A(RID_R12)|PPCF_T(RID_R12) | (u32ptr(g) & 0xffff);[m
[31m-  *p++ = PPCI_MTCTR | PPCF_T(RID_TMP);[m
[31m-  *p++ = PPCI_BCTR;[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    *p++ = PPCI_LI | PPCF_T(RID_R11) | slot;[m
[31m-    *p = PPCI_B | (((page-p) & 0x00ffffffu) << 2);[m
[31m-    p++;[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-static void callback_mcode_init(global_State *g, uint32_t *page)[m
[31m-{[m
[31m-  uint32_t *p = page;[m
[31m-  void *target = (void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-  *p++ = MIPSI_SW | MIPSF_T(RID_R1)|MIPSF_S(RID_SP) | 0;[m
[31m-  *p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (u32ptr(target) >> 16);[m
[31m-  *p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (u32ptr(g) >> 16);[m
[31m-  *p++ = MIPSI_ORI | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) |(u32ptr(target)&0xffff);[m
[31m-  *p++ = MIPSI_JR | MIPSF_S(RID_R3);[m
[31m-  *p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | (u32ptr(g)&0xffff);[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    *p = MIPSI_B | ((page-p-1) & 0x0000ffffu);[m
[31m-    p++;[m
[31m-    *p++ = MIPSI_LI | MIPSF_T(RID_R1) | slot;[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#else[m
[31m-/* Missing support for this architecture. */[m
[31m-#define callback_mcode_init(g, p)	UNUSED(p)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Machine code management --------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-[m
[31m-#include <sys/mman.h>[m
[31m-#ifndef MAP_ANONYMOUS[m
[31m-#define MAP_ANONYMOUS   MAP_ANON[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Allocate and initialize area for callback function pointers. */[m
[31m-static void callback_mcode_new(CTState *cts)[m
[31m-{[m
[31m-  size_t sz = (size_t)CALLBACK_MCODE_SIZE;[m
[31m-  void *p;[m
[31m-  if (CALLBACK_MAX_SLOT == 0)[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  p = VirtualAlloc(NULL, sz, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);[m
[31m-  if (!p)[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-  p = mmap(NULL, sz, (PROT_READ|PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS,[m
[31m-	   -1, 0);[m
[31m-  if (p == MAP_FAILED)[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);[m
[31m-#else[m
[31m-  /* Fallback allocator. Fails if memory is not executable by default. */[m
[31m-  p = lj_mem_new(cts->L, sz);[m
[31m-#endif[m
[31m-  cts->cb.mcode = p;[m
[31m-  callback_mcode_init(cts->g, p);[m
[31m-  lj_mcode_sync(p, (char *)p + sz);[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  {[m
[31m-    DWORD oprot;[m
[31m-    VirtualProtect(p, sz, PAGE_EXECUTE_READ, &oprot);[m
[31m-  }[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-  mprotect(p, sz, (PROT_READ|PROT_EXEC));[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Free area for callback function pointers. */[m
[31m-void lj_ccallback_mcode_free(CTState *cts)[m
[31m-{[m
[31m-  size_t sz = (size_t)CALLBACK_MCODE_SIZE;[m
[31m-  void *p = cts->cb.mcode;[m
[31m-  if (p == NULL) return;[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  VirtualFree(p, 0, MEM_RELEASE);[m
[31m-  UNUSED(sz);[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-  munmap(p, sz);[m
[31m-#else[m
[31m-  lj_mem_free(cts->g, p, sz);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- C callback entry ---------------------------------------------------- */[m
[31m-[m
[31m-/* Target-specific handling of register arguments. Similar to lj_ccall.c. */[m
[31m-#if LJ_TARGET_X86[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (!isfp) {  /* Only non-FP values may be passed in registers. */ \[m
[31m-    if (n > 1) {  /* Anything > 32 bit is passed on the stack. */ \[m
[31m-      if (!LJ_ABI_WIN) ngpr = maxgpr;  /* Prevent reordering. */ \[m
[31m-    } else if (ngpr + 1 <= maxgpr) { \[m
[31m-      sp = &cts->cb.gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_X64 && LJ_ABI_WIN[m
[31m-[m
[31m-/* Windows/x64 argument registers are strictly positional (use ngpr). */[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (ngpr < maxgpr) { sp = &cts->cb.fpr[ngpr++]; UNUSED(nfpr); goto done; } \[m
[31m-  } else { \[m
[31m-    if (ngpr < maxgpr) { sp = &cts->cb.gpr[ngpr++]; goto done; } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_X64[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (nfpr + n <= CCALL_NARG_FPR) { \[m
[31m-      sp = &cts->cb.fpr[nfpr]; \[m
[31m-      nfpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  } else { \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      sp = &cts->cb.gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_ARM[m
[31m-[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG_FP1	UNUSED(isfp);[m
[31m-#define CALLBACK_HANDLE_REGARG_FP2[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG_FP1 \[m
[31m-  if (isfp) { \[m
[31m-    if (n == 1) { \[m
[31m-      if (fprodd) { \[m
[31m-	sp = &cts->cb.fpr[fprodd-1]; \[m
[31m-	fprodd = 0; \[m
[31m-	goto done; \[m
[31m-      } else if (nfpr + 1 <= CCALL_NARG_FPR) { \[m
[31m-	sp = &cts->cb.fpr[nfpr++]; \[m
[31m-	fprodd = nfpr; \[m
[31m-	goto done; \[m
[31m-      } \[m
[31m-    } else { \[m
[31m-      if (nfpr + 1 <= CCALL_NARG_FPR) { \[m
[31m-	sp = &cts->cb.fpr[nfpr++]; \[m
[31m-	goto done; \[m
[31m-      } \[m
[31m-    } \[m
[31m-    fprodd = 0;  /* No reordering after the first FP value is on stack. */ \[m
[31m-  } else {[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG_FP2	}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  CALLBACK_HANDLE_REGARG_FP1 \[m
[31m-  if (n > 1) ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-  if (ngpr + n <= maxgpr) { \[m
[31m-    sp = &cts->cb.gpr[ngpr]; \[m
[31m-    ngpr += n; \[m
[31m-    goto done; \[m
[31m-  } CALLBACK_HANDLE_REGARG_FP2[m
[31m-[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (nfpr + n <= CCALL_NARG_FPR) { \[m
[31m-      sp = &cts->cb.fpr[nfpr]; \[m
[31m-      nfpr += n; \[m
[31m-      goto done; \[m
[31m-    } else { \[m
[31m-      nfpr = CCALL_NARG_FPR;  /* Prevent reordering. */ \[m
[31m-    } \[m
[31m-  } else { \[m
[31m-    if (!LJ_TARGET_IOS && n > 1) \[m
[31m-      ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      sp = &cts->cb.gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } else { \[m
[31m-      ngpr = CCALL_NARG_GPR;  /* Prevent reordering. */ \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_PPC[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (nfpr + 1 <= CCALL_NARG_FPR) { \[m
[31m-      sp = &cts->cb.fpr[nfpr++]; \[m
[31m-      cta = ctype_get(cts, CTID_DOUBLE);  /* FPRs always hold doubles. */ \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    if (n > 1) { \[m
[31m-      lua_assert(ctype_isinteger(cta->info) && n == 2);  /* int64_t. */ \[m
[31m-      ngpr = (ngpr + 1u) & ~1u;  /* Align int64_t to regpair. */ \[m
[31m-    } \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      sp = &cts->cb.gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#define CALLBACK_HANDLE_RET \[m
[31m-  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \[m
[31m-    *(double *)dp = *(float *)dp;  /* FPRs always hold doubles. */[m
[31m-[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-[m
[31m-#define CALLBACK_HANDLE_GPR \[m
[31m-  if (n > 1) ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-  if (ngpr + n <= maxgpr) { \[m
[31m-    sp = &cts->cb.gpr[ngpr]; \[m
[31m-    ngpr += n; \[m
[31m-    goto done; \[m
[31m-  }[m
[31m-[m
[31m-#if !LJ_ABI_SOFTFP	/* MIPS32 hard-float */[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp && nfpr < CCALL_NARG_FPR) {  /* Try to pass argument in FPRs. */ \[m
[31m-    sp = (void *)((uint8_t *)&cts->cb.fpr[nfpr] + ((LJ_BE && n==1) ? 4 : 0)); \[m
[31m-    nfpr++; ngpr += n; \[m
[31m-    goto done; \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    nfpr = CCALL_NARG_FPR; \[m
[31m-    CALLBACK_HANDLE_GPR \[m
[31m-  }[m
[31m-#else			/* MIPS32 soft-float */[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  CALLBACK_HANDLE_GPR \[m
[31m-  UNUSED(isfp);[m
[31m-#endif[m
[31m-[m
[31m-#define CALLBACK_HANDLE_RET \[m
[31m-  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \[m
[31m-    ((float *)dp)[1] = *(float *)dp;[m
[31m-[m
[31m-#else[m
[31m-#error "Missing calling convention definitions for this architecture"[m
[31m-#endif[m
[31m-[m
[31m-/* Convert and push callback arguments to Lua stack. */[m
[31m-static void callback_conv_args(CTState *cts, lua_State *L)[m
[31m-{[m
[31m-  TValue *o = L->top;[m
[31m-  intptr_t *stack = cts->cb.stack;[m
[31m-  MSize slot = cts->cb.slot;[m
[31m-  CTypeID id = 0, rid, fid;[m
[31m-  int gcsteps = 0;[m
[31m-  CType *ct;[m
[31m-  GCfunc *fn;[m
[31m-  int fntp;[m
[31m-  MSize ngpr = 0, nsp = 0, maxgpr = CCALL_NARG_GPR;[m
[31m-#if CCALL_NARG_FPR[m
[31m-  MSize nfpr = 0;[m
[31m-#if LJ_TARGET_ARM[m
[31m-  MSize fprodd = 0;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-  if (slot < cts->cb.sizeid && (id = cts->cb.cbid[slot]) != 0) {[m
[31m-    ct = ctype_get(cts, id);[m
[31m-    rid = ctype_cid(ct->info);  /* Return type. x86: +(spadj<<16). */[m
[31m-    fn = funcV(lj_tab_getint(cts->miscmap, (int32_t)slot));[m
[31m-    fntp = LJ_TFUNC;[m
[31m-  } else {  /* Must set up frame first, before throwing the error. */[m
[31m-    ct = NULL;[m
[31m-    rid = 0;[m
[31m-    fn = (GCfunc *)L;[m
[31m-    fntp = LJ_TTHREAD;[m
[31m-  }[m
[31m-  /* Continuation returns from callback. */[m
[31m-  if (LJ_FR2) {[m
[31m-    (o++)->u64 = LJ_CONT_FFI_CALLBACK;[m
[31m-    (o++)->u64 = rid;[m
[31m-    o++;[m
[31m-  } else {[m
[31m-    o->u32.lo = LJ_CONT_FFI_CALLBACK;[m
[31m-    o->u32.hi = rid;[m
[31m-    o++;[m
[31m-  }[m
[31m-  setframe_gc(o, obj2gco(fn), fntp);[m
[31m-  setframe_ftsz(o, ((char *)(o+1) - (char *)L->base) + FRAME_CONT);[m
[31m-  L->top = L->base = ++o;[m
[31m-  if (!ct)[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_BADCBACK);[m
[31m-  if (isluafunc(fn))[m
[31m-    setcframe_pc(L->cframe, proto_bc(funcproto(fn))+1);[m
[31m-  lj_state_checkstack(L, LUA_MINSTACK);  /* May throw. */[m
[31m-  o = L->base;  /* Might have been reallocated. */[m
[31m-[m
[31m-#if LJ_TARGET_X86[m
[31m-  /* x86 has several different calling conventions. */[m
[31m-  switch (ctype_cconv(ct->info)) {[m
[31m-  case CTCC_FASTCALL: maxgpr = 2; break;[m
[31m-  case CTCC_THISCALL: maxgpr = 1; break;[m
[31m-  default: maxgpr = 0; break;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  fid = ct->sib;[m
[31m-  while (fid) {[m
[31m-    CType *ctf = ctype_get(cts, fid);[m
[31m-    if (!ctype_isattrib(ctf->info)) {[m
[31m-      CType *cta;[m
[31m-      void *sp;[m
[31m-      CTSize sz;[m
[31m-      int isfp;[m
[31m-      MSize n;[m
[31m-      lua_assert(ctype_isfield(ctf->info));[m
[31m-      cta = ctype_rawchild(cts, ctf);[m
[31m-      isfp = ctype_isfp(cta->info);[m
[31m-      sz = (cta->size + CTSIZE_PTR-1) & ~(CTSIZE_PTR-1);[m
[31m-      n = sz / CTSIZE_PTR;  /* Number of GPRs or stack slots needed. */[m
[31m-[m
[31m-      CALLBACK_HANDLE_REGARG  /* Handle register arguments. */[m
[31m-[m
[31m-      /* Otherwise pass argument on stack. */[m
[31m-      if (CCALL_ALIGN_STACKARG && LJ_32 && sz == 8)[m
[31m-	nsp = (nsp + 1) & ~1u;  /* Align 64 bit argument on stack. */[m
[31m-      sp = &stack[nsp];[m
[31m-      nsp += n;[m
[31m-[m
[31m-    done:[m
[31m-      if (LJ_BE && cta->size < CTSIZE_PTR)[m
[31m-	sp = (void *)((uint8_t *)sp + CTSIZE_PTR-cta->size);[m
[31m-      gcsteps += lj_cconv_tv_ct(cts, cta, 0, o++, sp);[m
[31m-    }[m
[31m-    fid = ctf->sib;[m
[31m-  }[m
[31m-  L->top = o;[m
[31m-#if LJ_TARGET_X86[m
[31m-  /* Store stack adjustment for returns from non-cdecl callbacks. */[m
[31m-  if (ctype_cconv(ct->info) != CTCC_CDECL) {[m
[31m-#if LJ_FR2[m
[31m-    (L->base-3)->u64 |= (nsp << (16+2));[m
[31m-#else[m
[31m-    (L->base-2)->u32.hi |= (nsp << (16+2));[m
[31m-#endif[m
[31m-  }[m
[31m-#endif[m
[31m-  while (gcsteps-- > 0)[m
[31m-    lj_gc_check(L);[m
[31m-}[m
[31m-[m
[31m-/* Convert Lua object to callback result. */[m
[31m-static void callback_conv_result(CTState *cts, lua_State *L, TValue *o)[m
[31m-{[m
[31m-#if LJ_FR2[m
[31m-  CType *ctr = ctype_raw(cts, (uint16_t)(L->base-3)->u64);[m
[31m-#else[m
[31m-  CType *ctr = ctype_raw(cts, (uint16_t)(L->base-2)->u32.hi);[m
[31m-#endif[m
[31m-#if LJ_TARGET_X86[m
[31m-  cts->cb.gpr[2] = 0;[m
[31m-#endif[m
[31m-  if (!ctype_isvoid(ctr->info)) {[m
[31m-    uint8_t *dp = (uint8_t *)&cts->cb.gpr[0];[m
[31m-#if CCALL_NUM_FPR[m
[31m-    if (ctype_isfp(ctr->info))[m
[31m-      dp = (uint8_t *)&cts->cb.fpr[0];[m
[31m-#endif[m
[31m-    lj_cconv_ct_tv(cts, ctr, dp, o, 0);[m
[31m-#ifdef CALLBACK_HANDLE_RET[m
[31m-    CALLBACK_HANDLE_RET[m
[31m-#endif[m
[31m-    /* Extend returned integers to (at least) 32 bits. */[m
[31m-    if (ctype_isinteger_or_bool(ctr->info) && ctr->size < 4) {[m
[31m-      if (ctr->info & CTF_UNSIGNED)[m
[31m-	*(uint32_t *)dp = ctr->size == 1 ? (uint32_t)*(uint8_t *)dp :[m
[31m-					   (uint32_t)*(uint16_t *)dp;[m
[31m-      else[m
[31m-	*(int32_t *)dp = ctr->size == 1 ? (int32_t)*(int8_t *)dp :[m
[31m-					  (int32_t)*(int16_t *)dp;[m
[31m-    }[m
[31m-#if LJ_TARGET_X86[m
[31m-    if (ctype_isfp(ctr->info))[m
[31m-      cts->cb.gpr[2] = ctr->size == sizeof(float) ? 1 : 2;[m
[31m-#endif[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Enter callback. */[m
[31m-lua_State * LJ_FASTCALL lj_ccallback_enter(CTState *cts, void *cf)[m
[31m-{[m
[31m-  lua_State *L = cts->L;[m
[31m-  global_State *g = cts->g;[m
[31m-  lua_assert(L != NULL);[m
[31m-  if (tvref(g->jit_base)) {[m
[31m-    setstrV(L, L->top++, lj_err_str(L, LJ_ERR_FFI_BADCBACK));[m
[31m-    if (g->panic) g->panic(L);[m
[31m-    exit(EXIT_FAILURE);[m
[31m-  }[m
[31m-  lj_trace_abort(g);  /* Never record across callback. */[m
[31m-  /* Setup C frame. */[m
[31m-  cframe_prev(cf) = L->cframe;[m
[31m-  setcframe_L(cf, L);[m
[31m-  cframe_errfunc(cf) = -1;[m
[31m-  cframe_nres(cf) = 0;[m
[31m-  L->cframe = cf;[m
[31m-  callback_conv_args(cts, L);[m
[31m-  return L;  /* Now call the function on this stack. */[m
[31m-}[m
[31m-[m
[31m-/* Leave callback. */[m
[31m-void LJ_FASTCALL lj_ccallback_leave(CTState *cts, TValue *o)[m
[31m-{[m
[31m-  lua_State *L = cts->L;[m
[31m-  GCfunc *fn;[m
[31m-  TValue *obase = L->base;[m
[31m-  L->base = L->top;  /* Keep continuation frame for throwing errors. */[m
[31m-  if (o >= L->base) {[m
[31m-    /* PC of RET* is lost. Point to last line for result conv. errors. */[m
[31m-    fn = curr_func(L);[m
[31m-    if (isluafunc(fn)) {[m
[31m-      GCproto *pt = funcproto(fn);[m
[31m-      setcframe_pc(L->cframe, proto_bc(pt)+pt->sizebc+1);[m
[31m-    }[m
[31m-  }[m
[31m-  callback_conv_result(cts, L, o);[m
[31m-  /* Finally drop C frame and continuation frame. */[m
[31m-  L->top -= 2+2*LJ_FR2;[m
[31m-  L->base = obase;[m
[31m-  L->cframe = cframe_prev(L->cframe);[m
[31m-  cts->cb.slot = 0;  /* Blacklist C function that called the callback. */[m
[31m-}[m
[31m-[m
[31m-/* -- C callback management ----------------------------------------------- */[m
[31m-[m
[31m-/* Get an unused slot in the callback slot table. */[m
[31m-static MSize callback_slot_new(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTypeID id = ctype_typeid(cts, ct);[m
[31m-  CTypeID1 *cbid = cts->cb.cbid;[m
[31m-  MSize top;[m
[31m-  for (top = cts->cb.topid; top < cts->cb.sizeid; top++)[m
[31m-    if (LJ_LIKELY(cbid[top] == 0))[m
[31m-      goto found;[m
[31m-#if CALLBACK_MAX_SLOT[m
[31m-  if (top >= CALLBACK_MAX_SLOT)[m
[31m-#endif[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);[m
[31m-  if (!cts->cb.mcode)[m
[31m-    callback_mcode_new(cts);[m
[31m-  lj_mem_growvec(cts->L, cbid, cts->cb.sizeid, CALLBACK_MAX_SLOT, CTypeID1);[m
[31m-  cts->cb.cbid = cbid;[m
[31m-  memset(cbid+top, 0, (cts->cb.sizeid-top)*sizeof(CTypeID1));[m
[31m-found:[m
[31m-  cbid[top] = id;[m
[31m-  cts->cb.topid = top+1;[m
[31m-  return top;[m
[31m-}[m
[31m-[m
[31m-/* Check for function pointer and supported argument/result types. */[m
[31m-static CType *callback_checkfunc(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  int narg = 0;[m
[31m-  if (!ctype_isptr(ct->info) || (LJ_64 && ct->size != CTSIZE_PTR))[m
[31m-    return NULL;[m
[31m-  ct = ctype_rawchild(cts, ct);[m
[31m-  if (ctype_isfunc(ct->info)) {[m
[31m-    CType *ctr = ctype_rawchild(cts, ct);[m
[31m-    CTypeID fid = ct->sib;[m
[31m-    if (!(ctype_isvoid(ctr->info) || ctype_isenum(ctr->info) ||[m
[31m-	  ctype_isptr(ctr->info) || (ctype_isnum(ctr->info) && ctr->size <= 8)))[m
[31m-      return NULL;[m
[31m-    if ((ct->info & CTF_VARARG))[m
[31m-      return NULL;[m
[31m-    while (fid) {[m
[31m-      CType *ctf = ctype_get(cts, fid);[m
[31m-      if (!ctype_isattrib(ctf->info)) {[m
[31m-	CType *cta;[m
[31m-	lua_assert(ctype_isfield(ctf->info));[m
[31m-	cta = ctype_rawchild(cts, ctf);[m
[31m-	if (!(ctype_isenum(cta->info) || ctype_isptr(cta->info) ||[m
[31m-	      (ctype_isnum(cta->info) && cta->size <= 8)) ||[m
[31m-	    ++narg >= LUA_MINSTACK-3)[m
[31m-	  return NULL;[m
[31m-      }[m
[31m-      fid = ctf->sib;[m
[31m-    }[m
[31m-    return ct;[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Create a new callback and return the callback function pointer. */[m
[31m-void *lj_ccallback_new(CTState *cts, CType *ct, GCfunc *fn)[m
[31m-{[m
[31m-  ct = callback_checkfunc(cts, ct);[m
[31m-  if (ct) {[m
[31m-    MSize slot = callback_slot_new(cts, ct);[m
[31m-    GCtab *t = cts->miscmap;[m
[31m-    setfuncV(cts->L, lj_tab_setint(cts->L, t, (int32_t)slot), fn);[m
[31m-    lj_gc_anybarriert(cts->L, t);[m
[31m-    return callback_slot2ptr(cts, slot);[m
[31m-  }[m
[31m-  return NULL;  /* Bad conversion. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.h[m
[1mdeleted file mode 100644[m
[1mindex 99c778d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ccallback.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-/*[m
[31m-** FFI C callback handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CCALLBACK_H[m
[31m-#define _LJ_CCALLBACK_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* Really belongs to lj_vm.h. */[m
[31m-LJ_ASMF void lj_vm_ffi_callback(void);[m
[31m-[m
[31m-LJ_FUNC MSize lj_ccallback_ptr2slot(CTState *cts, void *p);[m
[31m-LJ_FUNCA lua_State * LJ_FASTCALL lj_ccallback_enter(CTState *cts, void *cf);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_ccallback_leave(CTState *cts, TValue *o);[m
[31m-LJ_FUNC void *lj_ccallback_new(CTState *cts, CType *ct, GCfunc *fn);[m
[31m-LJ_FUNC void lj_ccallback_mcode_free(CTState *cts);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.c[m
[1mdeleted file mode 100644[m
[1mindex 81f3c87..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.c[m
[1m+++ /dev/null[m
[36m@@ -1,752 +0,0 @@[m
[31m-/*[m
[31m-** C type conversions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_ccallback.h"[m
[31m-[m
[31m-/* -- Conversion errors --------------------------------------------------- */[m
[31m-[m
[31m-/* Bad conversion. */[m
[31m-LJ_NORET static void cconv_err_conv(CTState *cts, CType *d, CType *s,[m
[31m-				    CTInfo flags)[m
[31m-{[m
[31m-  const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL));[m
[31m-  const char *src;[m
[31m-  if ((flags & CCF_FROMTV))[m
[31m-    src = lj_obj_typename[1+(ctype_isnum(s->info) ? LUA_TNUMBER :[m
[31m-			     ctype_isarray(s->info) ? LUA_TSTRING : LUA_TNIL)];[m
[31m-  else[m
[31m-    src = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, s), NULL));[m
[31m-  if (CCF_GETARG(flags))[m
[31m-    lj_err_argv(cts->L, CCF_GETARG(flags), LJ_ERR_FFI_BADCONV, src, dst);[m
[31m-  else[m
[31m-    lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst);[m
[31m-}[m
[31m-[m
[31m-/* Bad conversion from TValue. */[m
[31m-LJ_NORET static void cconv_err_convtv(CTState *cts, CType *d, TValue *o,[m
[31m-				      CTInfo flags)[m
[31m-{[m
[31m-  const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL));[m
[31m-  const char *src = lj_typename(o);[m
[31m-  if (CCF_GETARG(flags))[m
[31m-    lj_err_argv(cts->L, CCF_GETARG(flags), LJ_ERR_FFI_BADCONV, src, dst);[m
[31m-  else[m
[31m-    lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst);[m
[31m-}[m
[31m-[m
[31m-/* Initializer overflow. */[m
[31m-LJ_NORET static void cconv_err_initov(CTState *cts, CType *d)[m
[31m-{[m
[31m-  const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL));[m
[31m-  lj_err_callerv(cts->L, LJ_ERR_FFI_INITOV, dst);[m
[31m-}[m
[31m-[m
[31m-/* -- C type compatibility checks ----------------------------------------- */[m
[31m-[m
[31m-/* Get raw type and qualifiers for a child type. Resolves enums, too. */[m
[31m-static CType *cconv_childqual(CTState *cts, CType *ct, CTInfo *qual)[m
[31m-{[m
[31m-  ct = ctype_child(cts, ct);[m
[31m-  for (;;) {[m
[31m-    if (ctype_isattrib(ct->info)) {[m
[31m-      if (ctype_attrib(ct->info) == CTA_QUAL) *qual |= ct->size;[m
[31m-    } else if (!ctype_isenum(ct->info)) {[m
[31m-      break;[m
[31m-    }[m
[31m-    ct = ctype_child(cts, ct);[m
[31m-  }[m
[31m-  *qual |= (ct->info & CTF_QUAL);[m
[31m-  return ct;[m
[31m-}[m
[31m-[m
[31m-/* Check for compatible types when converting to a pointer.[m
[31m-** Note: these checks are more relaxed than what C99 mandates.[m
[31m-*/[m
[31m-int lj_cconv_compatptr(CTState *cts, CType *d, CType *s, CTInfo flags)[m
[31m-{[m
[31m-  if (!((flags & CCF_CAST) || d == s)) {[m
[31m-    CTInfo dqual = 0, squal = 0;[m
[31m-    d = cconv_childqual(cts, d, &dqual);[m
[31m-    if (!ctype_isstruct(s->info))[m
[31m-      s = cconv_childqual(cts, s, &squal);[m
[31m-    if ((flags & CCF_SAME)) {[m
[31m-      if (dqual != squal)[m
[31m-	return 0;  /* Different qualifiers. */[m
[31m-    } else if (!(flags & CCF_IGNQUAL)) {[m
[31m-      if ((dqual & squal) != squal)[m
[31m-	return 0;  /* Discarded qualifiers. */[m
[31m-      if (ctype_isvoid(d->info) || ctype_isvoid(s->info))[m
[31m-	return 1;  /* Converting to/from void * is always ok. */[m
[31m-    }[m
[31m-    if (ctype_type(d->info) != ctype_type(s->info) ||[m
[31m-	d->size != s->size)[m
[31m-      return 0;  /* Different type or different size. */[m
[31m-    if (ctype_isnum(d->info)) {[m
[31m-      if (((d->info ^ s->info) & (CTF_BOOL|CTF_FP)))[m
[31m-	return 0;  /* Different numeric types. */[m
[31m-    } else if (ctype_ispointer(d->info)) {[m
[31m-      /* Check child types for compatibility. */[m
[31m-      return lj_cconv_compatptr(cts, d, s, flags|CCF_SAME);[m
[31m-    } else if (ctype_isstruct(d->info)) {[m
[31m-      if (d != s)[m
[31m-	return 0;  /* Must be exact same type for struct/union. */[m
[31m-    } else if (ctype_isfunc(d->info)) {[m
[31m-      /* NYI: structural equality of functions. */[m
[31m-    }[m
[31m-  }[m
[31m-  return 1;  /* Types are compatible. */[m
[31m-}[m
[31m-[m
[31m-/* -- C type to C type conversion ----------------------------------------- */[m
[31m-[m
[31m-/* Convert C type to C type. Caveat: expects to get the raw CType![m
[31m-**[m
[31m-** Note: This is only used by the interpreter and not optimized at all.[m
[31m-** The JIT compiler will do a much better job specializing for each case.[m
[31m-*/[m
[31m-void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,[m
[31m-		    uint8_t *dp, uint8_t *sp, CTInfo flags)[m
[31m-{[m
[31m-  CTSize dsize = d->size, ssize = s->size;[m
[31m-  CTInfo dinfo = d->info, sinfo = s->info;[m
[31m-  void *tmpptr;[m
[31m-[m
[31m-  lua_assert(!ctype_isenum(dinfo) && !ctype_isenum(sinfo));[m
[31m-  lua_assert(!ctype_isattrib(dinfo) && !ctype_isattrib(sinfo));[m
[31m-[m
[31m-  if (ctype_type(dinfo) > CT_MAYCONVERT || ctype_type(sinfo) > CT_MAYCONVERT)[m
[31m-    goto err_conv;[m
[31m-[m
[31m-  /* Some basic sanity checks. */[m
[31m-  lua_assert(!ctype_isnum(dinfo) || dsize > 0);[m
[31m-  lua_assert(!ctype_isnum(sinfo) || ssize > 0);[m
[31m-  lua_assert(!ctype_isbool(dinfo) || dsize == 1 || dsize == 4);[m
[31m-  lua_assert(!ctype_isbool(sinfo) || ssize == 1 || ssize == 4);[m
[31m-  lua_assert(!ctype_isinteger(dinfo) || (1u<<lj_fls(dsize)) == dsize);[m
[31m-  lua_assert(!ctype_isinteger(sinfo) || (1u<<lj_fls(ssize)) == ssize);[m
[31m-[m
[31m-  switch (cconv_idx2(dinfo, sinfo)) {[m
[31m-  /* Destination is a bool. */[m
[31m-  case CCX(B, B):[m
[31m-    /* Source operand is already normalized. */[m
[31m-    if (dsize == 1) *dp = *sp; else *(int *)dp = *sp;[m
[31m-    break;[m
[31m-  case CCX(B, I): {[m
[31m-    MSize i;[m
[31m-    uint8_t b = 0;[m
[31m-    for (i = 0; i < ssize; i++) b |= sp[i];[m
[31m-    b = (b != 0);[m
[31m-    if (dsize == 1) *dp = b; else *(int *)dp = b;[m
[31m-    break;[m
[31m-    }[m
[31m-  case CCX(B, F): {[m
[31m-    uint8_t b;[m
[31m-    if (ssize == sizeof(double)) b = (*(double *)sp != 0);[m
[31m-    else if (ssize == sizeof(float)) b = (*(float *)sp != 0);[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    if (dsize == 1) *dp = b; else *(int *)dp = b;[m
[31m-    break;[m
[31m-    }[m
[31m-[m
[31m-  /* Destination is an integer. */[m
[31m-  case CCX(I, B):[m
[31m-  case CCX(I, I):[m
[31m-  conv_I_I:[m
[31m-    if (dsize > ssize) {  /* Zero-extend or sign-extend LSB. */[m
[31m-#if LJ_LE[m
[31m-      uint8_t fill = (!(sinfo & CTF_UNSIGNED) && (sp[ssize-1]&0x80)) ? 0xff : 0;[m
[31m-      memcpy(dp, sp, ssize);[m
[31m-      memset(dp + ssize, fill, dsize-ssize);[m
[31m-#else[m
[31m-      uint8_t fill = (!(sinfo & CTF_UNSIGNED) && (sp[0]&0x80)) ? 0xff : 0;[m
[31m-      memset(dp, fill, dsize-ssize);[m
[31m-      memcpy(dp + (dsize-ssize), sp, ssize);[m
[31m-#endif[m
[31m-    } else {  /* Copy LSB. */[m
[31m-#if LJ_LE[m
[31m-      memcpy(dp, sp, dsize);[m
[31m-#else[m
[31m-      memcpy(dp, sp + (ssize-dsize), dsize);[m
[31m-#endif[m
[31m-    }[m
[31m-    break;[m
[31m-  case CCX(I, F): {[m
[31m-    double n;  /* Always convert via double. */[m
[31m-  conv_I_F:[m
[31m-    /* Convert source to double. */[m
[31m-    if (ssize == sizeof(double)) n = *(double *)sp;[m
[31m-    else if (ssize == sizeof(float)) n = (double)*(float *)sp;[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    /* Then convert double to integer. */[m
[31m-    /* The conversion must exactly match the semantics of JIT-compiled code! */[m
[31m-    if (dsize < 4 || (dsize == 4 && !(dinfo & CTF_UNSIGNED))) {[m
[31m-      int32_t i = (int32_t)n;[m
[31m-      if (dsize == 4) *(int32_t *)dp = i;[m
[31m-      else if (dsize == 2) *(int16_t *)dp = (int16_t)i;[m
[31m-      else *(int8_t *)dp = (int8_t)i;[m
[31m-    } else if (dsize == 4) {[m
[31m-      *(uint32_t *)dp = (uint32_t)n;[m
[31m-    } else if (dsize == 8) {[m
[31m-      if (!(dinfo & CTF_UNSIGNED))[m
[31m-	*(int64_t *)dp = (int64_t)n;[m
[31m-      else[m
[31m-	*(uint64_t *)dp = lj_num2u64(n);[m
[31m-    } else {[m
[31m-      goto err_conv;  /* NYI: conversion to >64 bit integers. */[m
[31m-    }[m
[31m-    break;[m
[31m-    }[m
[31m-  case CCX(I, C):[m
[31m-    s = ctype_child(cts, s);[m
[31m-    sinfo = s->info;[m
[31m-    ssize = s->size;[m
[31m-    goto conv_I_F;  /* Just convert re. */[m
[31m-  case CCX(I, P):[m
[31m-    if (!(flags & CCF_CAST)) goto err_conv;[m
[31m-    sinfo = CTINFO(CT_NUM, CTF_UNSIGNED);[m
[31m-    goto conv_I_I;[m
[31m-  case CCX(I, A):[m
[31m-    if (!(flags & CCF_CAST)) goto err_conv;[m
[31m-    sinfo = CTINFO(CT_NUM, CTF_UNSIGNED);[m
[31m-    ssize = CTSIZE_PTR;[m
[31m-    tmpptr = sp;[m
[31m-    sp = (uint8_t *)&tmpptr;[m
[31m-    goto conv_I_I;[m
[31m-[m
[31m-  /* Destination is a floating-point number. */[m
[31m-  case CCX(F, B):[m
[31m-  case CCX(F, I): {[m
[31m-    double n;  /* Always convert via double. */[m
[31m-  conv_F_I:[m
[31m-    /* First convert source to double. */[m
[31m-    /* The conversion must exactly match the semantics of JIT-compiled code! */[m
[31m-    if (ssize < 4 || (ssize == 4 && !(sinfo & CTF_UNSIGNED))) {[m
[31m-      int32_t i;[m
[31m-      if (ssize == 4) {[m
[31m-	i = *(int32_t *)sp;[m
[31m-      } else if (!(sinfo & CTF_UNSIGNED)) {[m
[31m-	if (ssize == 2) i = *(int16_t *)sp;[m
[31m-	else i = *(int8_t *)sp;[m
[31m-      } else {[m
[31m-	if (ssize == 2) i = *(uint16_t *)sp;[m
[31m-	else i = *(uint8_t *)sp;[m
[31m-      }[m
[31m-      n = (double)i;[m
[31m-    } else if (ssize == 4) {[m
[31m-      n = (double)*(uint32_t *)sp;[m
[31m-    } else if (ssize == 8) {[m
[31m-      if (!(sinfo & CTF_UNSIGNED)) n = (double)*(int64_t *)sp;[m
[31m-      else n = (double)*(uint64_t *)sp;[m
[31m-    } else {[m
[31m-      goto err_conv;  /* NYI: conversion from >64 bit integers. */[m
[31m-    }[m
[31m-    /* Convert double to destination. */[m
[31m-    if (dsize == sizeof(double)) *(double *)dp = n;[m
[31m-    else if (dsize == sizeof(float)) *(float *)dp = (float)n;[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    break;[m
[31m-    }[m
[31m-  case CCX(F, F): {[m
[31m-    double n;  /* Always convert via double. */[m
[31m-  conv_F_F:[m
[31m-    if (ssize == dsize) goto copyval;[m
[31m-    /* Convert source to double. */[m
[31m-    if (ssize == sizeof(double)) n = *(double *)sp;[m
[31m-    else if (ssize == sizeof(float)) n = (double)*(float *)sp;[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    /* Convert double to destination. */[m
[31m-    if (dsize == sizeof(double)) *(double *)dp = n;[m
[31m-    else if (dsize == sizeof(float)) *(float *)dp = (float)n;[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    break;[m
[31m-    }[m
[31m-  case CCX(F, C):[m
[31m-    s = ctype_child(cts, s);[m
[31m-    sinfo = s->info;[m
[31m-    ssize = s->size;[m
[31m-    goto conv_F_F;  /* Ignore im, and convert from re. */[m
[31m-[m
[31m-  /* Destination is a complex number. */[m
[31m-  case CCX(C, I):[m
[31m-    d = ctype_child(cts, d);[m
[31m-    dinfo = d->info;[m
[31m-    dsize = d->size;[m
[31m-    memset(dp + dsize, 0, dsize);  /* Clear im. */[m
[31m-    goto conv_F_I;  /* Convert to re. */[m
[31m-  case CCX(C, F):[m
[31m-    d = ctype_child(cts, d);[m
[31m-    dinfo = d->info;[m
[31m-    dsize = d->size;[m
[31m-    memset(dp + dsize, 0, dsize);  /* Clear im. */[m
[31m-    goto conv_F_F;  /* Convert to re. */[m
[31m-[m
[31m-  case CCX(C, C):[m
[31m-    if (dsize != ssize) {  /* Different types: convert re/im separately. */[m
[31m-      CType *dc = ctype_child(cts, d);[m
[31m-      CType *sc = ctype_child(cts, s);[m
[31m-      lj_cconv_ct_ct(cts, dc, sc, dp, sp, flags);[m
[31m-      lj_cconv_ct_ct(cts, dc, sc, dp + dc->size, sp + sc->size, flags);[m
[31m-      return;[m
[31m-    }[m
[31m-    goto copyval;  /* Otherwise this is easy. */[m
[31m-[m
[31m-  /* Destination is a vector. */[m
[31m-  case CCX(V, I):[m
[31m-  case CCX(V, F):[m
[31m-  case CCX(V, C): {[m
[31m-    CType *dc = ctype_child(cts, d);[m
[31m-    CTSize esize;[m
[31m-    /* First convert the scalar to the first element. */[m
[31m-    lj_cconv_ct_ct(cts, dc, s, dp, sp, flags);[m
[31m-    /* Then replicate it to the other elements (splat). */[m
[31m-    for (sp = dp, esize = dc->size; dsize > esize; dsize -= esize) {[m
[31m-      dp += esize;[m
[31m-      memcpy(dp, sp, esize);[m
[31m-    }[m
[31m-    break;[m
[31m-    }[m
[31m-[m
[31m-  case CCX(V, V):[m
[31m-    /* Copy same-sized vectors, even for different lengths/element-types. */[m
[31m-    if (dsize != ssize) goto err_conv;[m
[31m-    goto copyval;[m
[31m-[m
[31m-  /* Destination is a pointer. */[m
[31m-  case CCX(P, I):[m
[31m-    if (!(flags & CCF_CAST)) goto err_conv;[m
[31m-    dinfo = CTINFO(CT_NUM, CTF_UNSIGNED);[m
[31m-    goto conv_I_I;[m
[31m-[m
[31m-  case CCX(P, F):[m
[31m-    if (!(flags & CCF_CAST) || !(flags & CCF_FROMTV)) goto err_conv;[m
[31m-    /* The signed conversion is cheaper. x64 really has 47 bit pointers. */[m
[31m-    dinfo = CTINFO(CT_NUM, (LJ_64 && dsize == 8) ? 0 : CTF_UNSIGNED);[m
[31m-    goto conv_I_F;[m
[31m-[m
[31m-  case CCX(P, P):[m
[31m-    if (!lj_cconv_compatptr(cts, d, s, flags)) goto err_conv;[m
[31m-    cdata_setptr(dp, dsize, cdata_getptr(sp, ssize));[m
[31m-    break;[m
[31m-[m
[31m-  case CCX(P, A):[m
[31m-  case CCX(P, S):[m
[31m-    if (!lj_cconv_compatptr(cts, d, s, flags)) goto err_conv;[m
[31m-    cdata_setptr(dp, dsize, sp);[m
[31m-    break;[m
[31m-[m
[31m-  /* Destination is an array. */[m
[31m-  case CCX(A, A):[m
[31m-    if ((flags & CCF_CAST) || (d->info & CTF_VLA) || dsize != ssize ||[m
[31m-	d->size == CTSIZE_INVALID || !lj_cconv_compatptr(cts, d, s, flags))[m
[31m-      goto err_conv;[m
[31m-    goto copyval;[m
[31m-[m
[31m-  /* Destination is a struct/union. */[m
[31m-  case CCX(S, S):[m
[31m-    if ((flags & CCF_CAST) || (d->info & CTF_VLA) || d != s)[m
[31m-      goto err_conv;  /* Must be exact same type. */[m
[31m-copyval:  /* Copy value. */[m
[31m-    lua_assert(dsize == ssize);[m
[31m-    memcpy(dp, sp, dsize);[m
[31m-    break;[m
[31m-[m
[31m-  default:[m
[31m-  err_conv:[m
[31m-    cconv_err_conv(cts, d, s, flags);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- C type to TValue conversion ----------------------------------------- */[m
[31m-[m
[31m-/* Convert C type to TValue. Caveat: expects to get the raw CType! */[m
[31m-int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,[m
[31m-		   TValue *o, uint8_t *sp)[m
[31m-{[m
[31m-  CTInfo sinfo = s->info;[m
[31m-  if (ctype_isnum(sinfo)) {[m
[31m-    if (!ctype_isbool(sinfo)) {[m
[31m-      if (ctype_isinteger(sinfo) && s->size > 4) goto copyval;[m
[31m-      if (LJ_DUALNUM && ctype_isinteger(sinfo)) {[m
[31m-	int32_t i;[m
[31m-	lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT32), s,[m
[31m-		       (uint8_t *)&i, sp, 0);[m
[31m-	if ((sinfo & CTF_UNSIGNED) && i < 0)[m
[31m-	  setnumV(o, (lua_Number)(uint32_t)i);[m
[31m-	else[m
[31m-	  setintV(o, i);[m
[31m-      } else {[m
[31m-	lj_cconv_ct_ct(cts, ctype_get(cts, CTID_DOUBLE), s,[m
[31m-		       (uint8_t *)&o->n, sp, 0);[m
[31m-	/* Numbers are NOT canonicalized here! Beware of uninitialized data. */[m
[31m-	lua_assert(tvisnum(o));[m
[31m-      }[m
[31m-    } else {[m
[31m-      uint32_t b = s->size == 1 ? (*sp != 0) : (*(int *)sp != 0);[m
[31m-      setboolV(o, b);[m
[31m-      setboolV(&cts->g->tmptv2, b);  /* Remember for trace recorder. */[m
[31m-    }[m
[31m-    return 0;[m
[31m-  } else if (ctype_isrefarray(sinfo) || ctype_isstruct(sinfo)) {[m
[31m-    /* Create reference. */[m
[31m-    setcdataV(cts->L, o, lj_cdata_newref(cts, sp, sid));[m
[31m-    return 1;  /* Need GC step. */[m
[31m-  } else {[m
[31m-    GCcdata *cd;[m
[31m-    CTSize sz;[m
[31m-  copyval:  /* Copy value. */[m
[31m-    sz = s->size;[m
[31m-    lua_assert(sz != CTSIZE_INVALID);[m
[31m-    /* Attributes are stripped, qualifiers are kept (but mostly ignored). */[m
[31m-    cd = lj_cdata_new(cts, ctype_typeid(cts, s), sz);[m
[31m-    setcdataV(cts->L, o, cd);[m
[31m-    memcpy(cdataptr(cd), sp, sz);[m
[31m-    return 1;  /* Need GC step. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Convert bitfield to TValue. */[m
[31m-int lj_cconv_tv_bf(CTState *cts, CType *s, TValue *o, uint8_t *sp)[m
[31m-{[m
[31m-  CTInfo info = s->info;[m
[31m-  CTSize pos, bsz;[m
[31m-  uint32_t val;[m
[31m-  lua_assert(ctype_isbitfield(info));[m
[31m-  /* NYI: packed bitfields may cause misaligned reads. */[m
[31m-  switch (ctype_bitcsz(info)) {[m
[31m-  case 4: val = *(uint32_t *)sp; break;[m
[31m-  case 2: val = *(uint16_t *)sp; break;[m
[31m-  case 1: val = *(uint8_t *)sp; break;[m
[31m-  default: lua_assert(0); val = 0; break;[m
[31m-  }[m
[31m-  /* Check if a packed bitfield crosses a container boundary. */[m
[31m-  pos = ctype_bitpos(info);[m
[31m-  bsz = ctype_bitbsz(info);[m
[31m-  lua_assert(pos < 8*ctype_bitcsz(info));[m
[31m-  lua_assert(bsz > 0 && bsz <= 8*ctype_bitcsz(info));[m
[31m-  if (pos + bsz > 8*ctype_bitcsz(info))[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_NYIPACKBIT);[m
[31m-  if (!(info & CTF_BOOL)) {[m
[31m-    CTSize shift = 32 - bsz;[m
[31m-    if (!(info & CTF_UNSIGNED)) {[m
[31m-      setintV(o, (int32_t)(val << (shift-pos)) >> shift);[m
[31m-    } else {[m
[31m-      val = (val << (shift-pos)) >> shift;[m
[31m-      if (!LJ_DUALNUM || (int32_t)val < 0)[m
[31m-	setnumV(o, (lua_Number)(uint32_t)val);[m
[31m-      else[m
[31m-	setintV(o, (int32_t)val);[m
[31m-    }[m
[31m-  } else {[m
[31m-    lua_assert(bsz == 1);[m
[31m-    setboolV(o, (val >> pos) & 1);[m
[31m-  }[m
[31m-  return 0;  /* No GC step needed. */[m
[31m-}[m
[31m-[m
[31m-/* -- TValue to C type conversion ----------------------------------------- */[m
[31m-[m
[31m-/* Convert table to array. */[m
[31m-static void cconv_array_tab(CTState *cts, CType *d,[m
[31m-			    uint8_t *dp, GCtab *t, CTInfo flags)[m
[31m-{[m
[31m-  int32_t i;[m
[31m-  CType *dc = ctype_rawchild(cts, d);  /* Array element type. */[m
[31m-  CTSize size = d->size, esize = dc->size, ofs = 0;[m
[31m-  for (i = 0; ; i++) {[m
[31m-    TValue *tv = (TValue *)lj_tab_getint(t, i);[m
[31m-    if (!tv || tvisnil(tv)) {[m
[31m-      if (i == 0) continue;  /* Try again for 1-based tables. */[m
[31m-      break;  /* Stop at first nil. */[m
[31m-    }[m
[31m-    if (ofs >= size)[m
[31m-      cconv_err_initov(cts, d);[m
[31m-    lj_cconv_ct_tv(cts, dc, dp + ofs, tv, flags);[m
[31m-    ofs += esize;[m
[31m-  }[m
[31m-  if (size != CTSIZE_INVALID) {  /* Only fill up arrays with known size. */[m
[31m-    if (ofs == esize) {  /* Replicate a single element. */[m
[31m-      for (; ofs < size; ofs += esize) memcpy(dp + ofs, dp, esize);[m
[31m-    } else {  /* Otherwise fill the remainder with zero. */[m
[31m-      memset(dp + ofs, 0, size - ofs);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Convert table to sub-struct/union. */[m
[31m-static void cconv_substruct_tab(CTState *cts, CType *d, uint8_t *dp,[m
[31m-				GCtab *t, int32_t *ip, CTInfo flags)[m
[31m-{[m
[31m-  CTypeID id = d->sib;[m
[31m-  while (id) {[m
[31m-    CType *df = ctype_get(cts, id);[m
[31m-    id = df->sib;[m
[31m-    if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) {[m
[31m-      TValue *tv;[m
[31m-      int32_t i = *ip, iz = i;[m
[31m-      if (!gcref(df->name)) continue;  /* Ignore unnamed fields. */[m
[31m-      if (i >= 0) {[m
[31m-      retry:[m
[31m-	tv = (TValue *)lj_tab_getint(t, i);[m
[31m-	if (!tv || tvisnil(tv)) {[m
[31m-	  if (i == 0) { i = 1; goto retry; }  /* 1-based tables. */[m
[31m-	  if (iz == 0) { *ip = i = -1; goto tryname; }  /* Init named fields. */[m
[31m-	  break;  /* Stop at first nil. */[m
[31m-	}[m
[31m-	*ip = i + 1;[m
[31m-      } else {[m
[31m-      tryname:[m
[31m-	tv = (TValue *)lj_tab_getstr(t, gco2str(gcref(df->name)));[m
[31m-	if (!tv || tvisnil(tv)) continue;[m
[31m-      }[m
[31m-      if (ctype_isfield(df->info))[m
[31m-	lj_cconv_ct_tv(cts, ctype_rawchild(cts, df), dp+df->size, tv, flags);[m
[31m-      else[m
[31m-	lj_cconv_bf_tv(cts, df, dp+df->size, tv);[m
[31m-      if ((d->info & CTF_UNION)) break;[m
[31m-    } else if (ctype_isxattrib(df->info, CTA_SUBTYPE)) {[m
[31m-      cconv_substruct_tab(cts, ctype_rawchild(cts, df),[m
[31m-			  dp+df->size, t, ip, flags);[m
[31m-    }  /* Ignore all other entries in the chain. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Convert table to struct/union. */[m
[31m-static void cconv_struct_tab(CTState *cts, CType *d,[m
[31m-			     uint8_t *dp, GCtab *t, CTInfo flags)[m
[31m-{[m
[31m-  int32_t i = 0;[m
[31m-  memset(dp, 0, d->size);  /* Much simpler to clear the struct first. */[m
[31m-  cconv_substruct_tab(cts, d, dp, t, &i, flags);[m
[31m-}[m
[31m-[m
[31m-/* Convert TValue to C type. Caveat: expects to get the raw CType! */[m
[31m-void lj_cconv_ct_tv(CTState *cts, CType *d,[m
[31m-		    uint8_t *dp, TValue *o, CTInfo flags)[m
[31m-{[m
[31m-  CTypeID sid = CTID_P_VOID;[m
[31m-  CType *s;[m
[31m-  void *tmpptr;[m
[31m-  uint8_t tmpbool, *sp = (uint8_t *)&tmpptr;[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    sp = (uint8_t *)&o->i;[m
[31m-    sid = CTID_INT32;[m
[31m-    flags |= CCF_FROMTV;[m
[31m-  } else if (LJ_LIKELY(tvisnum(o))) {[m
[31m-    sp = (uint8_t *)&o->n;[m
[31m-    sid = CTID_DOUBLE;[m
[31m-    flags |= CCF_FROMTV;[m
[31m-  } else if (tviscdata(o)) {[m
[31m-    sp = cdataptr(cdataV(o));[m
[31m-    sid = cdataV(o)->ctypeid;[m
[31m-    s = ctype_get(cts, sid);[m
[31m-    if (ctype_isref(s->info)) {  /* Resolve reference for value. */[m
[31m-      lua_assert(s->size == CTSIZE_PTR);[m
[31m-      sp = *(void **)sp;[m
[31m-      sid = ctype_cid(s->info);[m
[31m-    }[m
[31m-    s = ctype_raw(cts, sid);[m
[31m-    if (ctype_isfunc(s->info)) {[m
[31m-      sid = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|sid), CTSIZE_PTR);[m
[31m-    } else {[m
[31m-      if (ctype_isenum(s->info)) s = ctype_child(cts, s);[m
[31m-      goto doconv;[m
[31m-    }[m
[31m-  } else if (tvisstr(o)) {[m
[31m-    GCstr *str = strV(o);[m
[31m-    if (ctype_isenum(d->info)) {  /* Match string against enum constant. */[m
[31m-      CTSize ofs;[m
[31m-      CType *cct = lj_ctype_getfield(cts, d, str, &ofs);[m
[31m-      if (!cct || !ctype_isconstval(cct->info))[m
[31m-	goto err_conv;[m
[31m-      lua_assert(d->size == 4);[m
[31m-      sp = (uint8_t *)&cct->size;[m
[31m-      sid = ctype_cid(cct->info);[m
[31m-    } else if (ctype_isrefarray(d->info)) {  /* Copy string to array. */[m
[31m-      CType *dc = ctype_rawchild(cts, d);[m
[31m-      CTSize sz = str->len+1;[m
[31m-      if (!ctype_isinteger(dc->info) || dc->size != 1)[m
[31m-	goto err_conv;[m
[31m-      if (d->size != 0 && d->size < sz)[m
[31m-	sz = d->size;[m
[31m-      memcpy(dp, strdata(str), sz);[m
[31m-      return;[m
[31m-    } else {  /* Otherwise pass it as a const char[]. */[m
[31m-      sp = (uint8_t *)strdata(str);[m
[31m-      sid = CTID_A_CCHAR;[m
[31m-      flags |= CCF_FROMTV;[m
[31m-    }[m
[31m-  } else if (tvistab(o)) {[m
[31m-    if (ctype_isarray(d->info)) {[m
[31m-      cconv_array_tab(cts, d, dp, tabV(o), flags);[m
[31m-      return;[m
[31m-    } else if (ctype_isstruct(d->info)) {[m
[31m-      cconv_struct_tab(cts, d, dp, tabV(o), flags);[m
[31m-      return;[m
[31m-    } else {[m
[31m-      goto err_conv;[m
[31m-    }[m
[31m-  } else if (tvisbool(o)) {[m
[31m-    tmpbool = boolV(o);[m
[31m-    sp = &tmpbool;[m
[31m-    sid = CTID_BOOL;[m
[31m-  } else if (tvisnil(o)) {[m
[31m-    tmpptr = (void *)0;[m
[31m-    flags |= CCF_FROMTV;[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    GCudata *ud = udataV(o);[m
[31m-    tmpptr = uddata(ud);[m
[31m-    if (ud->udtype == UDTYPE_IO_FILE)[m
[31m-      tmpptr = *(void **)tmpptr;[m
[31m-  } else if (tvislightud(o)) {[m
[31m-    tmpptr = lightudV(o);[m
[31m-  } else if (tvisfunc(o)) {[m
[31m-    void *p = lj_ccallback_new(cts, d, funcV(o));[m
[31m-    if (p) {[m
[31m-      *(void **)dp = p;[m
[31m-      return;[m
[31m-    }[m
[31m-    goto err_conv;[m
[31m-  } else {[m
[31m-  err_conv:[m
[31m-    cconv_err_convtv(cts, d, o, flags);[m
[31m-  }[m
[31m-  s = ctype_get(cts, sid);[m
[31m-doconv:[m
[31m-  if (ctype_isenum(d->info)) d = ctype_child(cts, d);[m
[31m-  lj_cconv_ct_ct(cts, d, s, dp, sp, flags);[m
[31m-}[m
[31m-[m
[31m-/* Convert TValue to bitfield. */[m
[31m-void lj_cconv_bf_tv(CTState *cts, CType *d, uint8_t *dp, TValue *o)[m
[31m-{[m
[31m-  CTInfo info = d->info;[m
[31m-  CTSize pos, bsz;[m
[31m-  uint32_t val, mask;[m
[31m-  lua_assert(ctype_isbitfield(info));[m
[31m-  if ((info & CTF_BOOL)) {[m
[31m-    uint8_t tmpbool;[m
[31m-    lua_assert(ctype_bitbsz(info) == 1);[m
[31m-    lj_cconv_ct_tv(cts, ctype_get(cts, CTID_BOOL), &tmpbool, o, 0);[m
[31m-    val = tmpbool;[m
[31m-  } else {[m
[31m-    CTypeID did = (info & CTF_UNSIGNED) ? CTID_UINT32 : CTID_INT32;[m
[31m-    lj_cconv_ct_tv(cts, ctype_get(cts, did), (uint8_t *)&val, o, 0);[m
[31m-  }[m
[31m-  pos = ctype_bitpos(info);[m
[31m-  bsz = ctype_bitbsz(info);[m
[31m-  lua_assert(pos < 8*ctype_bitcsz(info));[m
[31m-  lua_assert(bsz > 0 && bsz <= 8*ctype_bitcsz(info));[m
[31m-  /* Check if a packed bitfield crosses a container boundary. */[m
[31m-  if (pos + bsz > 8*ctype_bitcsz(info))[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_NYIPACKBIT);[m
[31m-  mask = ((1u << bsz) - 1u) << pos;[m
[31m-  val = (val << pos) & mask;[m
[31m-  /* NYI: packed bitfields may cause misaligned reads/writes. */[m
[31m-  switch (ctype_bitcsz(info)) {[m
[31m-  case 4: *(uint32_t *)dp = (*(uint32_t *)dp & ~mask) | (uint32_t)val; break;[m
[31m-  case 2: *(uint16_t *)dp = (*(uint16_t *)dp & ~mask) | (uint16_t)val; break;[m
[31m-  case 1: *(uint8_t *)dp = (*(uint8_t *)dp & ~mask) | (uint8_t)val; break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Initialize C type with TValues -------------------------------------- */[m
[31m-[m
[31m-/* Initialize an array with TValues. */[m
[31m-static void cconv_array_init(CTState *cts, CType *d, CTSize sz, uint8_t *dp,[m
[31m-			     TValue *o, MSize len)[m
[31m-{[m
[31m-  CType *dc = ctype_rawchild(cts, d);  /* Array element type. */[m
[31m-  CTSize ofs, esize = dc->size;[m
[31m-  MSize i;[m
[31m-  if (len*esize > sz)[m
[31m-    cconv_err_initov(cts, d);[m
[31m-  for (i = 0, ofs = 0; i < len; i++, ofs += esize)[m
[31m-    lj_cconv_ct_tv(cts, dc, dp + ofs, o + i, 0);[m
[31m-  if (ofs == esize) {  /* Replicate a single element. */[m
[31m-    for (; ofs < sz; ofs += esize) memcpy(dp + ofs, dp, esize);[m
[31m-  } else {  /* Otherwise fill the remainder with zero. */[m
[31m-    memset(dp + ofs, 0, sz - ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Initialize a sub-struct/union with TValues. */[m
[31m-static void cconv_substruct_init(CTState *cts, CType *d, uint8_t *dp,[m
[31m-				 TValue *o, MSize len, MSize *ip)[m
[31m-{[m
[31m-  CTypeID id = d->sib;[m
[31m-  while (id) {[m
[31m-    CType *df = ctype_get(cts, id);[m
[31m-    id = df->sib;[m
[31m-    if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) {[m
[31m-      MSize i = *ip;[m
[31m-      if (!gcref(df->name)) continue;  /* Ignore unnamed fields. */[m
[31m-      if (i >= len) break;[m
[31m-      *ip = i + 1;[m
[31m-      if (ctype_isfield(df->info))[m
[31m-	lj_cconv_ct_tv(cts, ctype_rawchild(cts, df), dp+df->size, o + i, 0);[m
[31m-      else[m
[31m-	lj_cconv_bf_tv(cts, df, dp+df->size, o + i);[m
[31m-      if ((d->info & CTF_UNION)) break;[m
[31m-    } else if (ctype_isxattrib(df->info, CTA_SUBTYPE)) {[m
[31m-      cconv_substruct_init(cts, ctype_rawchild(cts, df),[m
[31m-			   dp+df->size, o, len, ip);[m
[31m-      if ((d->info & CTF_UNION)) break;[m
[31m-    }  /* Ignore all other entries in the chain. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Initialize a struct/union with TValues. */[m
[31m-static void cconv_struct_init(CTState *cts, CType *d, CTSize sz, uint8_t *dp,[m
[31m-			      TValue *o, MSize len)[m
[31m-{[m
[31m-  MSize i = 0;[m
[31m-  memset(dp, 0, sz);  /* Much simpler to clear the struct first. */[m
[31m-  cconv_substruct_init(cts, d, dp, o, len, &i);[m
[31m-  if (i < len)[m
[31m-    cconv_err_initov(cts, d);[m
[31m-}[m
[31m-[m
[31m-/* Check whether to use a multi-value initializer.[m
[31m-** This is true if an aggregate is to be initialized with a value.[m
[31m-** Valarrays are treated as values here so ct_tv handles (V|C, I|F).[m
[31m-*/[m
[31m-int lj_cconv_multi_init(CTState *cts, CType *d, TValue *o)[m
[31m-{[m
[31m-  if (!(ctype_isrefarray(d->info) || ctype_isstruct(d->info)))[m
[31m-    return 0;  /* Destination is not an aggregate. */[m
[31m-  if (tvistab(o) || (tvisstr(o) && !ctype_isstruct(d->info)))[m
[31m-    return 0;  /* Initializer is not a value. */[m
[31m-  if (tviscdata(o) && lj_ctype_rawref(cts, cdataV(o)->ctypeid) == d)[m
[31m-    return 0;  /* Source and destination are identical aggregates. */[m
[31m-  return 1;  /* Otherwise the initializer is a value. */[m
[31m-}[m
[31m-[m
[31m-/* Initialize C type with TValues. Caveat: expects to get the raw CType! */[m
[31m-void lj_cconv_ct_init(CTState *cts, CType *d, CTSize sz,[m
[31m-		      uint8_t *dp, TValue *o, MSize len)[m
[31m-{[m
[31m-  if (len == 0)[m
[31m-    memset(dp, 0, sz);[m
[31m-  else if (len == 1 && !lj_cconv_multi_init(cts, d, o))[m
[31m-    lj_cconv_ct_tv(cts, d, dp, o, 0);[m
[31m-  else if (ctype_isarray(d->info))  /* Also handles valarray init with len>1. */[m
[31m-    cconv_array_init(cts, d, sz, dp, o, len);[m
[31m-  else if (ctype_isstruct(d->info))[m
[31m-    cconv_struct_init(cts, d, sz, dp, o, len);[m
[31m-  else[m
[31m-    cconv_err_initov(cts, d);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.h[m
[1mdeleted file mode 100644[m
[1mindex 35e72cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cconv.h[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-/*[m
[31m-** C type conversions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CCONV_H[m
[31m-#define _LJ_CCONV_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* Compressed C type index. ORDER CCX. */[m
[31m-enum {[m
[31m-  CCX_B,	/* Bool. */[m
[31m-  CCX_I,	/* Integer. */[m
[31m-  CCX_F,	/* Floating-point number. */[m
[31m-  CCX_C,	/* Complex. */[m
[31m-  CCX_V,	/* Vector. */[m
[31m-  CCX_P,	/* Pointer. */[m
[31m-  CCX_A,	/* Refarray. */[m
[31m-  CCX_S		/* Struct/union. */[m
[31m-};[m
[31m-[m
[31m-/* Convert C type info to compressed C type index. ORDER CT. ORDER CCX. */[m
[31m-static LJ_AINLINE uint32_t cconv_idx(CTInfo info)[m
[31m-{[m
[31m-  uint32_t idx = ((info >> 26) & 15u);  /* Dispatch bits. */[m
[31m-  lua_assert(ctype_type(info) <= CT_MAYCONVERT);[m
[31m-#if LJ_64[m
[31m-  idx = ((uint32_t)(U64x(f436fff5,fff7f021) >> 4*idx) & 15u);[m
[31m-#else[m
[31m-  idx = (((idx < 8 ? 0xfff7f021u : 0xf436fff5) >> 4*(idx & 7u)) & 15u);[m
[31m-#endif[m
[31m-  lua_assert(idx < 8);[m
[31m-  return idx;[m
[31m-}[m
[31m-[m
[31m-#define cconv_idx2(dinfo, sinfo) \[m
[31m-  ((cconv_idx((dinfo)) << 3) + cconv_idx((sinfo)))[m
[31m-[m
[31m-#define CCX(dst, src)		((CCX_##dst << 3) + CCX_##src)[m
[31m-[m
[31m-/* Conversion flags. */[m
[31m-#define CCF_CAST	0x00000001u[m
[31m-#define CCF_FROMTV	0x00000002u[m
[31m-#define CCF_SAME	0x00000004u[m
[31m-#define CCF_IGNQUAL	0x00000008u[m
[31m-[m
[31m-#define CCF_ARG_SHIFT	8[m
[31m-#define CCF_ARG(n)	((n) << CCF_ARG_SHIFT)[m
[31m-#define CCF_GETARG(f)	((f) >> CCF_ARG_SHIFT)[m
[31m-[m
[31m-LJ_FUNC int lj_cconv_compatptr(CTState *cts, CType *d, CType *s, CTInfo flags);[m
[31m-LJ_FUNC void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,[m
[31m-			    uint8_t *dp, uint8_t *sp, CTInfo flags);[m
[31m-LJ_FUNC int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,[m
[31m-			   TValue *o, uint8_t *sp);[m
[31m-LJ_FUNC int lj_cconv_tv_bf(CTState *cts, CType *s, TValue *o, uint8_t *sp);[m
[31m-LJ_FUNC void lj_cconv_ct_tv(CTState *cts, CType *d,[m
[31m-			    uint8_t *dp, TValue *o, CTInfo flags);[m
[31m-LJ_FUNC void lj_cconv_bf_tv(CTState *cts, CType *d, uint8_t *dp, TValue *o);[m
[31m-LJ_FUNC int lj_cconv_multi_init(CTState *cts, CType *d, TValue *o);[m
[31m-LJ_FUNC void lj_cconv_ct_init(CTState *cts, CType *d, CTSize sz,[m
[31m-			      uint8_t *dp, TValue *o, MSize len);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.c[m
[1mdeleted file mode 100644[m
[1mindex 05e27da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.c[m
[1m+++ /dev/null[m
[36m@@ -1,297 +0,0 @@[m
[31m-/*[m
[31m-** C data management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_cdata.h"[m
[31m-[m
[31m-/* -- C data allocation --------------------------------------------------- */[m
[31m-[m
[31m-/* Allocate a new C data object holding a reference to another object. */[m
[31m-GCcdata *lj_cdata_newref(CTState *cts, const void *p, CTypeID id)[m
[31m-{[m
[31m-  CTypeID refid = lj_ctype_intern(cts, CTINFO_REF(id), CTSIZE_PTR);[m
[31m-  GCcdata *cd = lj_cdata_new(cts, refid, CTSIZE_PTR);[m
[31m-  *(const void **)cdataptr(cd) = p;[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-/* Allocate variable-sized or specially aligned C data object. */[m
[31m-GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, CTSize align)[m
[31m-{[m
[31m-  global_State *g;[m
[31m-  MSize extra = sizeof(GCcdataVar) + sizeof(GCcdata) +[m
[31m-		(align > CT_MEMALIGN ? (1u<<align) - (1u<<CT_MEMALIGN) : 0);[m
[31m-  char *p = lj_mem_newt(L, extra + sz, char);[m
[31m-  uintptr_t adata = (uintptr_t)p + sizeof(GCcdataVar) + sizeof(GCcdata);[m
[31m-  uintptr_t almask = (1u << align) - 1u;[m
[31m-  GCcdata *cd = (GCcdata *)(((adata + almask) & ~almask) - sizeof(GCcdata));[m
[31m-  lua_assert((char *)cd - p < 65536);[m
[31m-  cdatav(cd)->offset = (uint16_t)((char *)cd - p);[m
[31m-  cdatav(cd)->extra = extra;[m
[31m-  cdatav(cd)->len = sz;[m
[31m-  g = G(L);[m
[31m-  setgcrefr(cd->nextgc, g->gc.root);[m
[31m-  setgcref(g->gc.root, obj2gco(cd));[m
[31m-  newwhite(g, obj2gco(cd));[m
[31m-  cd->marked |= 0x80;[m
[31m-  cd->gct = ~LJ_TCDATA;[m
[31m-  cd->ctypeid = id;[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-/* Allocate arbitrary C data object. */[m
[31m-GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz, CTInfo info)[m
[31m-{[m
[31m-  if (!(info & CTF_VLA) && ctype_align(info) <= CT_MEMALIGN)[m
[31m-    return lj_cdata_new(cts, id, sz);[m
[31m-  else[m
[31m-    return lj_cdata_newv(cts->L, id, sz, ctype_align(info));[m
[31m-}[m
[31m-[m
[31m-/* Free a C data object. */[m
[31m-void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(cd->marked & LJ_GC_CDATA_FIN)) {[m
[31m-    GCobj *root;[m
[31m-    makewhite(g, obj2gco(cd));[m
[31m-    markfinalized(obj2gco(cd));[m
[31m-    if ((root = gcref(g->gc.mmudata)) != NULL) {[m
[31m-      setgcrefr(cd->nextgc, root->gch.nextgc);[m
[31m-      setgcref(root->gch.nextgc, obj2gco(cd));[m
[31m-      setgcref(g->gc.mmudata, obj2gco(cd));[m
[31m-    } else {[m
[31m-      setgcref(cd->nextgc, obj2gco(cd));[m
[31m-      setgcref(g->gc.mmudata, obj2gco(cd));[m
[31m-    }[m
[31m-  } else if (LJ_LIKELY(!cdataisv(cd))) {[m
[31m-    CType *ct = ctype_raw(ctype_ctsG(g), cd->ctypeid);[m
[31m-    CTSize sz = ctype_hassize(ct->info) ? ct->size : CTSIZE_PTR;[m
[31m-    lua_assert(ctype_hassize(ct->info) || ctype_isfunc(ct->info) ||[m
[31m-	       ctype_isextern(ct->info));[m
[31m-    lj_mem_free(g, cd, sizeof(GCcdata) + sz);[m
[31m-  } else {[m
[31m-    lj_mem_free(g, memcdatav(cd), sizecdatav(cd));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj, uint32_t it)[m
[31m-{[m
[31m-  GCtab *t = ctype_ctsG(G(L))->finalizer;[m
[31m-  if (gcref(t->metatable)) {[m
[31m-    /* Add cdata to finalizer table, if still enabled. */[m
[31m-    TValue *tv, tmp;[m
[31m-    setcdataV(L, &tmp, cd);[m
[31m-    lj_gc_anybarriert(L, t);[m
[31m-    tv = lj_tab_set(L, t, &tmp);[m
[31m-    setgcV(L, tv, obj, it);[m
[31m-    if (!tvisnil(tv))[m
[31m-      cd->marked |= LJ_GC_CDATA_FIN;[m
[31m-    else[m
[31m-      cd->marked &= ~LJ_GC_CDATA_FIN;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- C data indexing ----------------------------------------------------- */[m
[31m-[m
[31m-/* Index C data by a TValue. Return CType and pointer. */[m
[31m-CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key, uint8_t **pp,[m
[31m-		      CTInfo *qual)[m
[31m-{[m
[31m-  uint8_t *p = (uint8_t *)cdataptr(cd);[m
[31m-  CType *ct = ctype_get(cts, cd->ctypeid);[m
[31m-  ptrdiff_t idx;[m
[31m-[m
[31m-  /* Resolve reference for cdata object. */[m
[31m-  if (ctype_isref(ct->info)) {[m
[31m-    lua_assert(ct->size == CTSIZE_PTR);[m
[31m-    p = *(uint8_t **)p;[m
[31m-    ct = ctype_child(cts, ct);[m
[31m-  }[m
[31m-[m
[31m-collect_attrib:[m
[31m-  /* Skip attributes and collect qualifiers. */[m
[31m-  while (ctype_isattrib(ct->info)) {[m
[31m-    if (ctype_attrib(ct->info) == CTA_QUAL) *qual |= ct->size;[m
[31m-    ct = ctype_child(cts, ct);[m
[31m-  }[m
[31m-  lua_assert(!ctype_isref(ct->info));  /* Interning rejects refs to refs. */[m
[31m-[m
[31m-  if (tvisint(key)) {[m
[31m-    idx = (ptrdiff_t)intV(key);[m
[31m-    goto integer_key;[m
[31m-  } else if (tvisnum(key)) {  /* Numeric key. */[m
[31m-#ifdef _MSC_VER[m
[31m-    /* Workaround for MSVC bug. */[m
[31m-    volatile[m
[31m-#endif[m
[31m-    lua_Number n = numV(key);[m
[31m-    idx = LJ_64 ? (ptrdiff_t)n : (ptrdiff_t)lj_num2int(n);[m
[31m-  integer_key:[m
[31m-    if (ctype_ispointer(ct->info)) {[m
[31m-      CTSize sz = lj_ctype_size(cts, ctype_cid(ct->info));  /* Element size. */[m
[31m-      if (sz == CTSIZE_INVALID)[m
[31m-	lj_err_caller(cts->L, LJ_ERR_FFI_INVSIZE);[m
[31m-      if (ctype_isptr(ct->info)) {[m
[31m-	p = (uint8_t *)cdata_getptr(p, ct->size);[m
[31m-      } else if ((ct->info & (CTF_VECTOR|CTF_COMPLEX))) {[m
[31m-	if ((ct->info & CTF_COMPLEX)) idx &= 1;[m
[31m-	*qual |= CTF_CONST;  /* Valarray elements are constant. */[m
[31m-      }[m
[31m-      *pp = p + idx*(int32_t)sz;[m
[31m-      return ct;[m
[31m-    }[m
[31m-  } else if (tviscdata(key)) {  /* Integer cdata key. */[m
[31m-    GCcdata *cdk = cdataV(key);[m
[31m-    CType *ctk = ctype_raw(cts, cdk->ctypeid);[m
[31m-    if (ctype_isenum(ctk->info)) ctk = ctype_child(cts, ctk);[m
[31m-    if (ctype_isinteger(ctk->info)) {[m
[31m-      lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ctk,[m
[31m-		     (uint8_t *)&idx, cdataptr(cdk), 0);[m
[31m-      goto integer_key;[m
[31m-    }[m
[31m-  } else if (tvisstr(key)) {  /* String key. */[m
[31m-    GCstr *name = strV(key);[m
[31m-    if (ctype_isstruct(ct->info)) {[m
[31m-      CTSize ofs;[m
[31m-      CType *fct = lj_ctype_getfieldq(cts, ct, name, &ofs, qual);[m
[31m-      if (fct) {[m
[31m-	*pp = p + ofs;[m
[31m-	return fct;[m
[31m-      }[m
[31m-    } else if (ctype_iscomplex(ct->info)) {[m
[31m-      if (name->len == 2) {[m
[31m-	*qual |= CTF_CONST;  /* Complex fields are constant. */[m
[31m-	if (strdata(name)[0] == 'r' && strdata(name)[1] == 'e') {[m
[31m-	  *pp = p;[m
[31m-	  return ct;[m
[31m-	} else if (strdata(name)[0] == 'i' && strdata(name)[1] == 'm') {[m
[31m-	  *pp = p + (ct->size >> 1);[m
[31m-	  return ct;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (cd->ctypeid == CTID_CTYPEID) {[m
[31m-      /* Allow indexing a (pointer to) struct constructor to get constants. */[m
[31m-      CType *sct = ctype_raw(cts, *(CTypeID *)p);[m
[31m-      if (ctype_isptr(sct->info))[m
[31m-	sct = ctype_rawchild(cts, sct);[m
[31m-      if (ctype_isstruct(sct->info)) {[m
[31m-	CTSize ofs;[m
[31m-	CType *fct = lj_ctype_getfield(cts, sct, name, &ofs);[m
[31m-	if (fct && ctype_isconstval(fct->info))[m
[31m-	  return fct;[m
[31m-      }[m
[31m-      ct = sct;  /* Allow resolving metamethods for constructors, too. */[m
[31m-    }[m
[31m-  }[m
[31m-  if (ctype_isptr(ct->info)) {  /* Automatically perform '->'. */[m
[31m-    if (ctype_isstruct(ctype_rawchild(cts, ct)->info)) {[m
[31m-      p = (uint8_t *)cdata_getptr(p, ct->size);[m
[31m-      ct = ctype_child(cts, ct);[m
[31m-      goto collect_attrib;[m
[31m-    }[m
[31m-  }[m
[31m-  *qual |= 1;  /* Lookup failed. */[m
[31m-  return ct;  /* But return the resolved raw type. */[m
[31m-}[m
[31m-[m
[31m-/* -- C data getters ------------------------------------------------------ */[m
[31m-[m
[31m-/* Get constant value and convert to TValue. */[m
[31m-static void cdata_getconst(CTState *cts, TValue *o, CType *ct)[m
[31m-{[m
[31m-  CType *ctt = ctype_child(cts, ct);[m
[31m-  lua_assert(ctype_isinteger(ctt->info) && ctt->size <= 4);[m
[31m-  /* Constants are already zero-extended/sign-extended to 32 bits. */[m
[31m-  if ((ctt->info & CTF_UNSIGNED) && (int32_t)ct->size < 0)[m
[31m-    setnumV(o, (lua_Number)(uint32_t)ct->size);[m
[31m-  else[m
[31m-    setintV(o, (int32_t)ct->size);[m
[31m-}[m
[31m-[m
[31m-/* Get C data value and convert to TValue. */[m
[31m-int lj_cdata_get(CTState *cts, CType *s, TValue *o, uint8_t *sp)[m
[31m-{[m
[31m-  CTypeID sid;[m
[31m-[m
[31m-  if (ctype_isconstval(s->info)) {[m
[31m-    cdata_getconst(cts, o, s);[m
[31m-    return 0;  /* No GC step needed. */[m
[31m-  } else if (ctype_isbitfield(s->info)) {[m
[31m-    return lj_cconv_tv_bf(cts, s, o, sp);[m
[31m-  }[m
[31m-[m
[31m-  /* Get child type of pointer/array/field. */[m
[31m-  lua_assert(ctype_ispointer(s->info) || ctype_isfield(s->info));[m
[31m-  sid = ctype_cid(s->info);[m
[31m-  s = ctype_get(cts, sid);[m
[31m-[m
[31m-  /* Resolve reference for field. */[m
[31m-  if (ctype_isref(s->info)) {[m
[31m-    lua_assert(s->size == CTSIZE_PTR);[m
[31m-    sp = *(uint8_t **)sp;[m
[31m-    sid = ctype_cid(s->info);[m
[31m-    s = ctype_get(cts, sid);[m
[31m-  }[m
[31m-[m
[31m-  /* Skip attributes. */[m
[31m-  while (ctype_isattrib(s->info))[m
[31m-    s = ctype_child(cts, s);[m
[31m-[m
[31m-  return lj_cconv_tv_ct(cts, s, sid, o, sp);[m
[31m-}[m
[31m-[m
[31m-/* -- C data setters ------------------------------------------------------ */[m
[31m-[m
[31m-/* Convert TValue and set C data value. */[m
[31m-void lj_cdata_set(CTState *cts, CType *d, uint8_t *dp, TValue *o, CTInfo qual)[m
[31m-{[m
[31m-  if (ctype_isconstval(d->info)) {[m
[31m-    goto err_const;[m
[31m-  } else if (ctype_isbitfield(d->info)) {[m
[31m-    if (((d->info|qual) & CTF_CONST)) goto err_const;[m
[31m-    lj_cconv_bf_tv(cts, d, dp, o);[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Get child type of pointer/array/field. */[m
[31m-  lua_assert(ctype_ispointer(d->info) || ctype_isfield(d->info));[m
[31m-  d = ctype_child(cts, d);[m
[31m-[m
[31m-  /* Resolve reference for field. */[m
[31m-  if (ctype_isref(d->info)) {[m
[31m-    lua_assert(d->size == CTSIZE_PTR);[m
[31m-    dp = *(uint8_t **)dp;[m
[31m-    d = ctype_child(cts, d);[m
[31m-  }[m
[31m-[m
[31m-  /* Skip attributes and collect qualifiers. */[m
[31m-  for (;;) {[m
[31m-    if (ctype_isattrib(d->info)) {[m
[31m-      if (ctype_attrib(d->info) == CTA_QUAL) qual |= d->size;[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-    d = ctype_child(cts, d);[m
[31m-  }[m
[31m-[m
[31m-  lua_assert(ctype_hassize(d->info) && !ctype_isvoid(d->info));[m
[31m-[m
[31m-  if (((d->info|qual) & CTF_CONST)) {[m
[31m-  err_const:[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_WRCONST);[m
[31m-  }[m
[31m-[m
[31m-  lj_cconv_ct_tv(cts, d, dp, o, 0);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.h[m
[1mdeleted file mode 100644[m
[1mindex ee5b740..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cdata.h[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-/*[m
[31m-** C data management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CDATA_H[m
[31m-#define _LJ_CDATA_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* Get C data pointer. */[m
[31m-static LJ_AINLINE void *cdata_getptr(void *p, CTSize sz)[m
[31m-{[m
[31m-  if (LJ_64 && sz == 4) {  /* Support 32 bit pointers on 64 bit targets. */[m
[31m-    return ((void *)(uintptr_t)*(uint32_t *)p);[m
[31m-  } else {[m
[31m-    lua_assert(sz == CTSIZE_PTR);[m
[31m-    return *(void **)p;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Set C data pointer. */[m
[31m-static LJ_AINLINE void cdata_setptr(void *p, CTSize sz, const void *v)[m
[31m-{[m
[31m-  if (LJ_64 && sz == 4) {  /* Support 32 bit pointers on 64 bit targets. */[m
[31m-    *(uint32_t *)p = (uint32_t)(uintptr_t)v;[m
[31m-  } else {[m
[31m-    lua_assert(sz == CTSIZE_PTR);[m
[31m-    *(void **)p = (void *)v;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocate fixed-size C data object. */[m
[31m-static LJ_AINLINE GCcdata *lj_cdata_new(CTState *cts, CTypeID id, CTSize sz)[m
[31m-{[m
[31m-  GCcdata *cd;[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  CType *ct = ctype_raw(cts, id);[m
[31m-  lua_assert((ctype_hassize(ct->info) ? ct->size : CTSIZE_PTR) == sz);[m
[31m-#endif[m
[31m-  cd = (GCcdata *)lj_mem_newgco(cts->L, sizeof(GCcdata) + sz);[m
[31m-  cd->gct = ~LJ_TCDATA;[m
[31m-  cd->ctypeid = ctype_check(cts, id);[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-/* Variant which works without a valid CTState. */[m
[31m-static LJ_AINLINE GCcdata *lj_cdata_new_(lua_State *L, CTypeID id, CTSize sz)[m
[31m-{[m
[31m-  GCcdata *cd = (GCcdata *)lj_mem_newgco(L, sizeof(GCcdata) + sz);[m
[31m-  cd->gct = ~LJ_TCDATA;[m
[31m-  cd->ctypeid = id;[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id);[m
[31m-LJ_FUNC GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz,[m
[31m-			       CTSize align);[m
[31m-LJ_FUNC GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz,[m
[31m-			       CTInfo info);[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd);[m
[31m-LJ_FUNC void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj,[m
[31m-			     uint32_t it);[m
[31m-[m
[31m-LJ_FUNC CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key,[m
[31m-			      uint8_t **pp, CTInfo *qual);[m
[31m-LJ_FUNC int lj_cdata_get(CTState *cts, CType *s, TValue *o, uint8_t *sp);[m
[31m-LJ_FUNC void lj_cdata_set(CTState *cts, CType *d, uint8_t *dp, TValue *o,[m
[31m-			  CTInfo qual);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.c[m
[1mdeleted file mode 100644[m
[1mindex 11f23ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.c[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/*[m
[31m-** Character types.[m
[31m-** Donated to the public domain.[m
[31m-**[m
[31m-** This is intended to replace the problematic libc single-byte NLS functions.[m
[31m-** These just don't make sense anymore with UTF-8 locales becoming the norm[m
[31m-** on POSIX systems. It never worked too well on Windows systems since hardly[m
[31m-** anyone bothered to call setlocale().[m
[31m-**[m
[31m-** This table is hardcoded for ASCII. Identifiers include the characters[m
[31m-** 128-255, too. This allows for the use of all non-ASCII chars as identifiers[m
[31m-** in the lexer. This is a broad definition, but works well in practice[m
[31m-** for both UTF-8 locales and most single-byte locales (such as ISO-8859-*).[m
[31m-**[m
[31m-** If you really need proper character types for UTF-8 strings, please use[m
[31m-** an add-on library such as slnunicode: http://luaforge.net/projects/sln/[m
[31m-*/[m
[31m-[m
[31m-#define lj_char_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_char.h"[m
[31m-[m
[31m-LJ_DATADEF const uint8_t lj_char_bits[257] = {[m
[31m-    0,[m
[31m-    1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  3,  3,  3,  3,  1,  1,[m
[31m-    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,[m
[31m-    2,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,[m
[31m-  152,152,152,152,152,152,152,152,152,152,  4,  4,  4,  4,  4,  4,[m
[31m-    4,176,176,176,176,176,176,160,160,160,160,160,160,160,160,160,[m
[31m-  160,160,160,160,160,160,160,160,160,160,160,  4,  4,  4,  4,132,[m
[31m-    4,208,208,208,208,208,208,192,192,192,192,192,192,192,192,192,[m
[31m-  192,192,192,192,192,192,192,192,192,192,192,  4,  4,  4,  4,  1,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128[m
[31m-};[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.h[m
[1mdeleted file mode 100644[m
[1mindex c3c86d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_char.h[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-/*[m
[31m-** Character types.[m
[31m-** Donated to the public domain.[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CHAR_H[m
[31m-#define _LJ_CHAR_H[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-[m
[31m-#define LJ_CHAR_CNTRL	0x01[m
[31m-#define LJ_CHAR_SPACE	0x02[m
[31m-#define LJ_CHAR_PUNCT	0x04[m
[31m-#define LJ_CHAR_DIGIT	0x08[m
[31m-#define LJ_CHAR_XDIGIT	0x10[m
[31m-#define LJ_CHAR_UPPER	0x20[m
[31m-#define LJ_CHAR_LOWER	0x40[m
[31m-#define LJ_CHAR_IDENT	0x80[m
[31m-#define LJ_CHAR_ALPHA	(LJ_CHAR_LOWER|LJ_CHAR_UPPER)[m
[31m-#define LJ_CHAR_ALNUM	(LJ_CHAR_ALPHA|LJ_CHAR_DIGIT)[m
[31m-#define LJ_CHAR_GRAPH	(LJ_CHAR_ALNUM|LJ_CHAR_PUNCT)[m
[31m-[m
[31m-/* Only pass -1 or 0..255 to these macros. Never pass a signed char! */[m
[31m-#define lj_char_isa(c, t)	((lj_char_bits+1)[(c)] & t)[m
[31m-#define lj_char_iscntrl(c)	lj_char_isa((c), LJ_CHAR_CNTRL)[m
[31m-#define lj_char_isspace(c)	lj_char_isa((c), LJ_CHAR_SPACE)[m
[31m-#define lj_char_ispunct(c)	lj_char_isa((c), LJ_CHAR_PUNCT)[m
[31m-#define lj_char_isdigit(c)	lj_char_isa((c), LJ_CHAR_DIGIT)[m
[31m-#define lj_char_isxdigit(c)	lj_char_isa((c), LJ_CHAR_XDIGIT)[m
[31m-#define lj_char_isupper(c)	lj_char_isa((c), LJ_CHAR_UPPER)[m
[31m-#define lj_char_islower(c)	lj_char_isa((c), LJ_CHAR_LOWER)[m
[31m-#define lj_char_isident(c)	lj_char_isa((c), LJ_CHAR_IDENT)[m
[31m-#define lj_char_isalpha(c)	lj_char_isa((c), LJ_CHAR_ALPHA)[m
[31m-#define lj_char_isalnum(c)	lj_char_isa((c), LJ_CHAR_ALNUM)[m
[31m-#define lj_char_isgraph(c)	lj_char_isa((c), LJ_CHAR_GRAPH)[m
[31m-[m
[31m-#define lj_char_toupper(c)	((c) - (lj_char_islower(c) >> 1))[m
[31m-#define lj_char_tolower(c)	((c) + lj_char_isupper(c))[m
[31m-[m
[31m-LJ_DATA const uint8_t lj_char_bits[257];[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.c[m
[1mdeleted file mode 100644[m
[1mindex 8398e80..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.c[m
[1m+++ /dev/null[m
[36m@@ -1,418 +0,0 @@[m
[31m-/*[m
[31m-** FFI C library loader.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_udata.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_clib.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- OS-specific functions ----------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_DLOPEN[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#if defined(RTLD_DEFAULT)[m
[31m-#define CLIB_DEFHANDLE	RTLD_DEFAULT[m
[31m-#elif LJ_TARGET_OSX || LJ_TARGET_BSD[m
[31m-#define CLIB_DEFHANDLE	((void *)(intptr_t)-2)[m
[31m-#else[m
[31m-#define CLIB_DEFHANDLE	NULL[m
[31m-#endif[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void clib_error_(lua_State *L)[m
[31m-{[m
[31m-  lj_err_callermsg(L, dlerror());[m
[31m-}[m
[31m-[m
[31m-#define clib_error(L, fmt, name)	clib_error_(L)[m
[31m-[m
[31m-#if LJ_TARGET_CYGWIN[m
[31m-#define CLIB_SOPREFIX	"cyg"[m
[31m-#else[m
[31m-#define CLIB_SOPREFIX	"lib"[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_OSX[m
[31m-#define CLIB_SOEXT	"%s.dylib"[m
[31m-#elif LJ_TARGET_CYGWIN[m
[31m-#define CLIB_SOEXT	"%s.dll"[m
[31m-#else[m
[31m-#define CLIB_SOEXT	"%s.so"[m
[31m-#endif[m
[31m-[m
[31m-static const char *clib_extname(lua_State *L, const char *name)[m
[31m-{[m
[31m-  if (!strchr(name, '/')[m
[31m-#if LJ_TARGET_CYGWIN[m
[31m-      && !strchr(name, '\\')[m
[31m-#endif[m
[31m-     ) {[m
[31m-    if (!strchr(name, '.')) {[m
[31m-      name = lj_strfmt_pushf(L, CLIB_SOEXT, name);[m
[31m-      L->top--;[m
[31m-#if LJ_TARGET_CYGWIN[m
[31m-    } else {[m
[31m-      return name;[m
[31m-#endif[m
[31m-    }[m
[31m-    if (!(name[0] == CLIB_SOPREFIX[0] && name[1] == CLIB_SOPREFIX[1] &&[m
[31m-	  name[2] == CLIB_SOPREFIX[2])) {[m
[31m-      name = lj_strfmt_pushf(L, CLIB_SOPREFIX "%s", name);[m
[31m-      L->top--;[m
[31m-    }[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-/* Check for a recognized ld script line. */[m
[31m-static const char *clib_check_lds(lua_State *L, const char *buf)[m
[31m-{[m
[31m-  char *p, *e;[m
[31m-  if ((!strncmp(buf, "GROUP", 5) || !strncmp(buf, "INPUT", 5)) &&[m
[31m-      (p = strchr(buf, '('))) {[m
[31m-    while (*++p == ' ') ;[m
[31m-    for (e = p; *e && *e != ' ' && *e != ')'; e++) ;[m
[31m-    return strdata(lj_str_new(L, p, e-p));[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Quick and dirty solution to resolve shared library name from ld script. */[m
[31m-static const char *clib_resolve_lds(lua_State *L, const char *name)[m
[31m-{[m
[31m-  FILE *fp = fopen(name, "r");[m
[31m-  const char *p = NULL;[m
[31m-  if (fp) {[m
[31m-    char buf[256];[m
[31m-    if (fgets(buf, sizeof(buf), fp)) {[m
[31m-      if (!strncmp(buf, "/* GNU ld script", 16)) {  /* ld script magic? */[m
[31m-	while (fgets(buf, sizeof(buf), fp)) {  /* Check all lines. */[m
[31m-	  p = clib_check_lds(L, buf);[m
[31m-	  if (p) break;[m
[31m-	}[m
[31m-      } else {  /* Otherwise check only the first line. */[m
[31m-	p = clib_check_lds(L, buf);[m
[31m-      }[m
[31m-    }[m
[31m-    fclose(fp);[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-static void *clib_loadlib(lua_State *L, const char *name, int global)[m
[31m-{[m
[31m-  void *h = dlopen(clib_extname(L, name),[m
[31m-		   RTLD_LAZY | (global?RTLD_GLOBAL:RTLD_LOCAL));[m
[31m-  if (!h) {[m
[31m-    const char *e, *err = dlerror();[m
[31m-    if (*err == '/' && (e = strchr(err, ':')) &&[m
[31m-	(name = clib_resolve_lds(L, strdata(lj_str_new(L, err, e-err))))) {[m
[31m-      h = dlopen(name, RTLD_LAZY | (global?RTLD_GLOBAL:RTLD_LOCAL));[m
[31m-      if (h) return h;[m
[31m-      err = dlerror();[m
[31m-    }[m
[31m-    lj_err_callermsg(L, err);[m
[31m-  }[m
[31m-  return h;[m
[31m-}[m
[31m-[m
[31m-static void clib_unloadlib(CLibrary *cl)[m
[31m-{[m
[31m-  if (cl->handle && cl->handle != CLIB_DEFHANDLE)[m
[31m-    dlclose(cl->handle);[m
[31m-}[m
[31m-[m
[31m-static void *clib_getsym(CLibrary *cl, const char *name)[m
[31m-{[m
[31m-  void *p = dlsym(cl->handle, name);[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-#elif LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS[m
[31m-#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS	4[m
[31m-#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT	2[m
[31m-BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*);[m
[31m-#endif[m
[31m-[m
[31m-#define CLIB_DEFHANDLE	((void *)-1)[m
[31m-[m
[31m-/* Default libraries. */[m
[31m-enum {[m
[31m-  CLIB_HANDLE_EXE,[m
[31m-  CLIB_HANDLE_DLL,[m
[31m-  CLIB_HANDLE_CRT,[m
[31m-  CLIB_HANDLE_KERNEL32,[m
[31m-  CLIB_HANDLE_USER32,[m
[31m-  CLIB_HANDLE_GDI32,[m
[31m-  CLIB_HANDLE_MAX[m
[31m-};[m
[31m-[m
[31m-static void *clib_def_handle[CLIB_HANDLE_MAX];[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt,[m
[31m-					    const char *name)[m
[31m-{[m
[31m-  DWORD err = GetLastError();[m
[31m-#if LJ_TARGET_XBOXONE[m
[31m-  wchar_t wbuf[128];[m
[31m-  char buf[128*2];[m
[31m-  if (!FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-		      NULL, err, 0, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL) ||[m
[31m-      !WideCharToMultiByte(CP_ACP, 0, wbuf, 128, buf, 128*2, NULL, NULL))[m
[31m-#else[m
[31m-  char buf[128];[m
[31m-  if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-		      NULL, err, 0, buf, sizeof(buf), NULL))[m
[31m-#endif[m
[31m-    buf[0] = '\0';[m
[31m-  lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, buf));[m
[31m-}[m
[31m-[m
[31m-static int clib_needext(const char *s)[m
[31m-{[m
[31m-  while (*s) {[m
[31m-    if (*s == '/' || *s == '\\' || *s == '.') return 0;[m
[31m-    s++;[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static const char *clib_extname(lua_State *L, const char *name)[m
[31m-{[m
[31m-  if (clib_needext(name)) {[m
[31m-    name = lj_strfmt_pushf(L, "%s.dll", name);[m
[31m-    L->top--;[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-static void *clib_loadlib(lua_State *L, const char *name, int global)[m
[31m-{[m
[31m-  DWORD oldwerr = GetLastError();[m
[31m-  void *h = (void *)LoadLibraryExA(clib_extname(L, name), NULL, 0);[m
[31m-  if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name);[m
[31m-  SetLastError(oldwerr);[m
[31m-  UNUSED(global);[m
[31m-  return h;[m
[31m-}[m
[31m-[m
[31m-static void clib_unloadlib(CLibrary *cl)[m
[31m-{[m
[31m-  if (cl->handle == CLIB_DEFHANDLE) {[m
[31m-    MSize i;[m
[31m-    for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) {[m
[31m-      void *h = clib_def_handle[i];[m
[31m-      if (h) {[m
[31m-	clib_def_handle[i] = NULL;[m
[31m-	FreeLibrary((HINSTANCE)h);[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (cl->handle) {[m
[31m-    FreeLibrary((HINSTANCE)cl->handle);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void *clib_getsym(CLibrary *cl, const char *name)[m
[31m-{[m
[31m-  void *p = NULL;[m
[31m-  if (cl->handle == CLIB_DEFHANDLE) {  /* Search default libraries. */[m
[31m-    MSize i;[m
[31m-    for (i = 0; i < CLIB_HANDLE_MAX; i++) {[m
[31m-      HINSTANCE h = (HINSTANCE)clib_def_handle[i];[m
[31m-      if (!(void *)h) {  /* Resolve default library handles (once). */[m
[31m-	switch (i) {[m
[31m-	case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break;[m
[31m-	case CLIB_HANDLE_DLL:[m
[31m-	  GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,[m
[31m-			     (const char *)clib_def_handle, &h);[m
[31m-	  break;[m
[31m-	case CLIB_HANDLE_CRT:[m
[31m-	  GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,[m
[31m-			     (const char *)&_fmode, &h);[m
[31m-	  break;[m
[31m-	case CLIB_HANDLE_KERNEL32: h = LoadLibraryExA("kernel32.dll", NULL, 0); break;[m
[31m-	case CLIB_HANDLE_USER32: h = LoadLibraryExA("user32.dll", NULL, 0); break;[m
[31m-	case CLIB_HANDLE_GDI32: h = LoadLibraryExA("gdi32.dll", NULL, 0); break;[m
[31m-	}[m
[31m-	if (!h) continue;[m
[31m-	clib_def_handle[i] = (void *)h;[m
[31m-      }[m
[31m-      p = (void *)GetProcAddress(h, name);[m
[31m-      if (p) break;[m
[31m-    }[m
[31m-  } else {[m
[31m-    p = (void *)GetProcAddress((HINSTANCE)cl->handle, name);[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define CLIB_DEFHANDLE	NULL[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt,[m
[31m-					    const char *name)[m
[31m-{[m
[31m-  lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, "no support for this OS"));[m
[31m-}[m
[31m-[m
[31m-static void *clib_loadlib(lua_State *L, const char *name, int global)[m
[31m-{[m
[31m-  lj_err_callermsg(L, "no support for loading dynamic libraries for this OS");[m
[31m-  UNUSED(name); UNUSED(global);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static void clib_unloadlib(CLibrary *cl)[m
[31m-{[m
[31m-  UNUSED(cl);[m
[31m-}[m
[31m-[m
[31m-static void *clib_getsym(CLibrary *cl, const char *name)[m
[31m-{[m
[31m-  UNUSED(cl); UNUSED(name);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- C library indexing -------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86 && LJ_ABI_WIN[m
[31m-/* Compute argument size for fastcall/stdcall functions. */[m
[31m-static CTSize clib_func_argsize(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTSize n = 0;[m
[31m-  while (ct->sib) {[m
[31m-    CType *d;[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isfield(ct->info)) {[m
[31m-      d = ctype_rawchild(cts, ct);[m
[31m-      n += ((d->size + 3) & ~3);[m
[31m-    }[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Get redirected or mangled external symbol. */[m
[31m-static const char *clib_extsym(CTState *cts, CType *ct, GCstr *name)[m
[31m-{[m
[31m-  if (ct->sib) {[m
[31m-    CType *ctf = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isxattrib(ctf->info, CTA_REDIR))[m
[31m-      return strdata(gco2str(gcref(ctf->name)));[m
[31m-  }[m
[31m-  return strdata(name);[m
[31m-}[m
[31m-[m
[31m-/* Index a C library by name. */[m
[31m-TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)[m
[31m-{[m
[31m-  TValue *tv = lj_tab_setstr(L, cl->cache, name);[m
[31m-  if (LJ_UNLIKELY(tvisnil(tv))) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    CType *ct;[m
[31m-    CTypeID id = lj_ctype_getname(cts, &ct, name, CLNS_INDEX);[m
[31m-    if (!id)[m
[31m-      lj_err_callerv(L, LJ_ERR_FFI_NODECL, strdata(name));[m
[31m-    if (ctype_isconstval(ct->info)) {[m
[31m-      CType *ctt = ctype_child(cts, ct);[m
[31m-      lua_assert(ctype_isinteger(ctt->info) && ctt->size <= 4);[m
[31m-      if ((ctt->info & CTF_UNSIGNED) && (int32_t)ct->size < 0)[m
[31m-	setnumV(tv, (lua_Number)(uint32_t)ct->size);[m
[31m-      else[m
[31m-	setintV(tv, (int32_t)ct->size);[m
[31m-    } else {[m
[31m-      const char *sym = clib_extsym(cts, ct, name);[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-      DWORD oldwerr = GetLastError();[m
[31m-#endif[m
[31m-      void *p = clib_getsym(cl, sym);[m
[31m-      GCcdata *cd;[m
[31m-      lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info));[m
[31m-#if LJ_TARGET_X86 && LJ_ABI_WIN[m
[31m-      /* Retry with decorated name for fastcall/stdcall functions. */[m
[31m-      if (!p && ctype_isfunc(ct->info)) {[m
[31m-	CTInfo cconv = ctype_cconv(ct->info);[m
[31m-	if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) {[m
[31m-	  CTSize sz = clib_func_argsize(cts, ct);[m
[31m-	  const char *symd = lj_strfmt_pushf(L,[m
[31m-			       cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d",[m
[31m-			       sym, sz);[m
[31m-	  L->top--;[m
[31m-	  p = clib_getsym(cl, symd);[m
[31m-	}[m
[31m-      }[m
[31m-#endif[m
[31m-      if (!p)[m
[31m-	clib_error(L, "cannot resolve symbol " LUA_QS ": %s", sym);[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-      SetLastError(oldwerr);[m
[31m-#endif[m
[31m-      cd = lj_cdata_new(cts, id, CTSIZE_PTR);[m
[31m-      *(void **)cdataptr(cd) = p;[m
[31m-      setcdataV(L, tv, cd);[m
[31m-    }[m
[31m-  }[m
[31m-  return tv;[m
[31m-}[m
[31m-[m
[31m-/* -- C library management ------------------------------------------------ */[m
[31m-[m
[31m-/* Create a new CLibrary object and push it on the stack. */[m
[31m-static CLibrary *clib_new(lua_State *L, GCtab *mt)[m
[31m-{[m
[31m-  GCtab *t = lj_tab_new(L, 0, 0);[m
[31m-  GCudata *ud = lj_udata_new(L, sizeof(CLibrary), t);[m
[31m-  CLibrary *cl = (CLibrary *)uddata(ud);[m
[31m-  cl->cache = t;[m
[31m-  ud->udtype = UDTYPE_FFI_CLIB;[m
[31m-  /* NOBARRIER: The GCudata is new (marked white). */[m
[31m-  setgcref(ud->metatable, obj2gco(mt));[m
[31m-  setudataV(L, L->top++, ud);[m
[31m-  return cl;[m
[31m-}[m
[31m-[m
[31m-/* Load a C library. */[m
[31m-void lj_clib_load(lua_State *L, GCtab *mt, GCstr *name, int global)[m
[31m-{[m
[31m-  void *handle = clib_loadlib(L, strdata(name), global);[m
[31m-  CLibrary *cl = clib_new(L, mt);[m
[31m-  cl->handle = handle;[m
[31m-}[m
[31m-[m
[31m-/* Unload a C library. */[m
[31m-void lj_clib_unload(CLibrary *cl)[m
[31m-{[m
[31m-  clib_unloadlib(cl);[m
[31m-  cl->handle = NULL;[m
[31m-}[m
[31m-[m
[31m-/* Create the default C library object. */[m
[31m-void lj_clib_default(lua_State *L, GCtab *mt)[m
[31m-{[m
[31m-  CLibrary *cl = clib_new(L, mt);[m
[31m-  cl->handle = CLIB_DEFHANDLE;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.h[m
[1mdeleted file mode 100644[m
[1mindex ce3ab85..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_clib.h[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-/*[m
[31m-** FFI C library loader.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CLIB_H[m
[31m-#define _LJ_CLIB_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* Namespace for C library indexing. */[m
[31m-#define CLNS_INDEX	((1u<<CT_FUNC)|(1u<<CT_EXTERN)|(1u<<CT_CONSTVAL))[m
[31m-[m
[31m-/* C library namespace. */[m
[31m-typedef struct CLibrary {[m
[31m-  void *handle;		/* Opaque handle for dynamic library loader. */[m
[31m-  GCtab *cache;		/* Cache for resolved symbols. Anchored in ud->env. */[m
[31m-} CLibrary;[m
[31m-[m
[31m-LJ_FUNC TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name);[m
[31m-LJ_FUNC void lj_clib_load(lua_State *L, GCtab *mt, GCstr *name, int global);[m
[31m-LJ_FUNC void lj_clib_unload(CLibrary *cl);[m
[31m-LJ_FUNC void lj_clib_default(lua_State *L, GCtab *mt);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.c[m
[1mdeleted file mode 100644[m
[1mindex 16d2cb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.c[m
[1m+++ /dev/null[m
[36m@@ -1,1888 +0,0 @@[m
[31m-/*[m
[31m-** C declaration parser.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cparse.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/*[m
[31m-** Important note: this is NOT a validating C parser! This is a minimal[m
[31m-** C declaration parser, solely for use by the LuaJIT FFI.[m
[31m-**[m
[31m-** It ought to return correct results for properly formed C declarations,[m
[31m-** but it may accept some invalid declarations, too (and return nonsense).[m
[31m-** Also, it shows rather generic error messages to avoid unnecessary bloat.[m
[31m-** If in doubt, please check the input against your favorite C compiler.[m
[31m-*/[m
[31m-[m
[31m-/* -- C lexer ------------------------------------------------------------- */[m
[31m-[m
[31m-/* C lexer token names. */[m
[31m-static const char *const ctoknames[] = {[m
[31m-#define CTOKSTR(name, str)	str,[m
[31m-CTOKDEF(CTOKSTR)[m
[31m-#undef CTOKSTR[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-LJ_NORET static void cp_err(CPState *cp, ErrMsg em);[m
[31m-[m
[31m-static const char *cp_tok2str(CPState *cp, CPToken tok)[m
[31m-{[m
[31m-  lua_assert(tok < CTOK_FIRSTDECL);[m
[31m-  if (tok > CTOK_OFS)[m
[31m-    return ctoknames[tok-CTOK_OFS-1];[m
[31m-  else if (!lj_char_iscntrl(tok))[m
[31m-    return lj_strfmt_pushf(cp->L, "%c", tok);[m
[31m-  else[m
[31m-    return lj_strfmt_pushf(cp->L, "char(%d)", tok);[m
[31m-}[m
[31m-[m
[31m-/* End-of-line? */[m
[31m-static LJ_AINLINE int cp_iseol(CPChar c)[m
[31m-{[m
[31m-  return (c == '\n' || c == '\r');[m
[31m-}[m
[31m-[m
[31m-/* Peek next raw character. */[m
[31m-static LJ_AINLINE CPChar cp_rawpeek(CPState *cp)[m
[31m-{[m
[31m-  return (CPChar)(uint8_t)(*cp->p);[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE CPChar cp_get_bs(CPState *cp);[m
[31m-[m
[31m-/* Get next character. */[m
[31m-static LJ_AINLINE CPChar cp_get(CPState *cp)[m
[31m-{[m
[31m-  cp->c = (CPChar)(uint8_t)(*cp->p++);[m
[31m-  if (LJ_LIKELY(cp->c != '\\')) return cp->c;[m
[31m-  return cp_get_bs(cp);[m
[31m-}[m
[31m-[m
[31m-/* Transparently skip backslash-escaped line breaks. */[m
[31m-static LJ_NOINLINE CPChar cp_get_bs(CPState *cp)[m
[31m-{[m
[31m-  CPChar c2, c = cp_rawpeek(cp);[m
[31m-  if (!cp_iseol(c)) return cp->c;[m
[31m-  cp->p++;[m
[31m-  c2 = cp_rawpeek(cp);[m
[31m-  if (cp_iseol(c2) && c2 != c) cp->p++;[m
[31m-  cp->linenumber++;[m
[31m-  return cp_get(cp);[m
[31m-}[m
[31m-[m
[31m-/* Save character in buffer. */[m
[31m-static LJ_AINLINE void cp_save(CPState *cp, CPChar c)[m
[31m-{[m
[31m-  lj_buf_putb(&cp->sb, c);[m
[31m-}[m
[31m-[m
[31m-/* Skip line break. Handles "\n", "\r", "\r\n" or "\n\r". */[m
[31m-static void cp_newline(CPState *cp)[m
[31m-{[m
[31m-  CPChar c = cp_rawpeek(cp);[m
[31m-  if (cp_iseol(c) && c != cp->c) cp->p++;[m
[31m-  cp->linenumber++;[m
[31m-}[m
[31m-[m
[31m-LJ_NORET static void cp_errmsg(CPState *cp, CPToken tok, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *msg, *tokstr;[m
[31m-  lua_State *L;[m
[31m-  va_list argp;[m
[31m-  if (tok == 0) {[m
[31m-    tokstr = NULL;[m
[31m-  } else if (tok == CTOK_IDENT || tok == CTOK_INTEGER || tok == CTOK_STRING ||[m
[31m-	     tok >= CTOK_FIRSTDECL) {[m
[31m-    if (sbufP(&cp->sb) == sbufB(&cp->sb)) cp_save(cp, '$');[m
[31m-    cp_save(cp, '\0');[m
[31m-    tokstr = sbufB(&cp->sb);[m
[31m-  } else {[m
[31m-    tokstr = cp_tok2str(cp, tok);[m
[31m-  }[m
[31m-  L = cp->L;[m
[31m-  va_start(argp, em);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  va_end(argp);[m
[31m-  if (tokstr)[m
[31m-    msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tokstr);[m
[31m-  if (cp->linenumber > 1)[m
[31m-    msg = lj_strfmt_pushf(L, "%s at line %d", msg, cp->linenumber);[m
[31m-  lj_err_callermsg(L, msg);[m
[31m-}[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void cp_err_token(CPState *cp, CPToken tok)[m
[31m-{[m
[31m-  cp_errmsg(cp, cp->tok, LJ_ERR_XTOKEN, cp_tok2str(cp, tok));[m
[31m-}[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void cp_err_badidx(CPState *cp, CType *ct)[m
[31m-{[m
[31m-  GCstr *s = lj_ctype_repr(cp->cts->L, ctype_typeid(cp->cts, ct), NULL);[m
[31m-  cp_errmsg(cp, 0, LJ_ERR_FFI_BADIDX, strdata(s));[m
[31m-}[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void cp_err(CPState *cp, ErrMsg em)[m
[31m-{[m
[31m-  cp_errmsg(cp, 0, em);[m
[31m-}[m
[31m-[m
[31m-/* -- Main lexical scanner ------------------------------------------------ */[m
[31m-[m
[31m-/* Parse number literal. Only handles int32_t/uint32_t right now. */[m
[31m-static CPToken cp_number(CPState *cp)[m
[31m-{[m
[31m-  StrScanFmt fmt;[m
[31m-  TValue o;[m
[31m-  do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp)));[m
[31m-  cp_save(cp, '\0');[m
[31m-  fmt = lj_strscan_scan((const uint8_t *)sbufB(&cp->sb), &o, STRSCAN_OPT_C);[m
[31m-  if (fmt == STRSCAN_INT) cp->val.id = CTID_INT32;[m
[31m-  else if (fmt == STRSCAN_U32) cp->val.id = CTID_UINT32;[m
[31m-  else if (!(cp->mode & CPARSE_MODE_SKIP))[m
[31m-    cp_errmsg(cp, CTOK_INTEGER, LJ_ERR_XNUMBER);[m
[31m-  cp->val.u32 = (uint32_t)o.i;[m
[31m-  return CTOK_INTEGER;[m
[31m-}[m
[31m-[m
[31m-/* Parse identifier or keyword. */[m
[31m-static CPToken cp_ident(CPState *cp)[m
[31m-{[m
[31m-  do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp)));[m
[31m-  cp->str = lj_buf_str(cp->L, &cp->sb);[m
[31m-  cp->val.id = lj_ctype_getname(cp->cts, &cp->ct, cp->str, cp->tmask);[m
[31m-  if (ctype_type(cp->ct->info) == CT_KW)[m
[31m-    return ctype_cid(cp->ct->info);[m
[31m-  return CTOK_IDENT;[m
[31m-}[m
[31m-[m
[31m-/* Parse parameter. */[m
[31m-static CPToken cp_param(CPState *cp)[m
[31m-{[m
[31m-  CPChar c = cp_get(cp);[m
[31m-  TValue *o = cp->param;[m
[31m-  if (lj_char_isident(c) || c == '$')  /* Reserve $xyz for future extensions. */[m
[31m-    cp_errmsg(cp, c, LJ_ERR_XSYNTAX);[m
[31m-  if (!o || o >= cp->L->top)[m
[31m-    cp_err(cp, LJ_ERR_FFI_NUMPARAM);[m
[31m-  cp->param = o+1;[m
[31m-  if (tvisstr(o)) {[m
[31m-    cp->str = strV(o);[m
[31m-    cp->val.id = 0;[m
[31m-    cp->ct = &cp->cts->tab[0];[m
[31m-    return CTOK_IDENT;[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    cp->val.i32 = numberVint(o);[m
[31m-    cp->val.id = CTID_INT32;[m
[31m-    return CTOK_INTEGER;[m
[31m-  } else {[m
[31m-    GCcdata *cd;[m
[31m-    if (!tviscdata(o))[m
[31m-      lj_err_argtype(cp->L, (int)(o-cp->L->base)+1, "type parameter");[m
[31m-    cd = cdataV(o);[m
[31m-    if (cd->ctypeid == CTID_CTYPEID)[m
[31m-      cp->val.id = *(CTypeID *)cdataptr(cd);[m
[31m-    else[m
[31m-      cp->val.id = cd->ctypeid;[m
[31m-    return '$';[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse string or character constant. */[m
[31m-static CPToken cp_string(CPState *cp)[m
[31m-{[m
[31m-  CPChar delim = cp->c;[m
[31m-  cp_get(cp);[m
[31m-  while (cp->c != delim) {[m
[31m-    CPChar c = cp->c;[m
[31m-    if (c == '\0') cp_errmsg(cp, CTOK_EOF, LJ_ERR_XSTR);[m
[31m-    if (c == '\\') {[m
[31m-      c = cp_get(cp);[m
[31m-      switch (c) {[m
[31m-      case '\0': cp_errmsg(cp, CTOK_EOF, LJ_ERR_XSTR); break;[m
[31m-      case 'a': c = '\a'; break;[m
[31m-      case 'b': c = '\b'; break;[m
[31m-      case 'f': c = '\f'; break;[m
[31m-      case 'n': c = '\n'; break;[m
[31m-      case 'r': c = '\r'; break;[m
[31m-      case 't': c = '\t'; break;[m
[31m-      case 'v': c = '\v'; break;[m
[31m-      case 'e': c = 27; break;[m
[31m-      case 'x':[m
[31m-	c = 0;[m
[31m-	while (lj_char_isxdigit(cp_get(cp)))[m
[31m-	  c = (c<<4) + (lj_char_isdigit(cp->c) ? cp->c-'0' : (cp->c&15)+9);[m
[31m-	cp_save(cp, (c & 0xff));[m
[31m-	continue;[m
[31m-      default:[m
[31m-	if (lj_char_isdigit(c)) {[m
[31m-	  c -= '0';[m
[31m-	  if (lj_char_isdigit(cp_get(cp))) {[m
[31m-	    c = c*8 + (cp->c - '0');[m
[31m-	    if (lj_char_isdigit(cp_get(cp))) {[m
[31m-	      c = c*8 + (cp->c - '0');[m
[31m-	      cp_get(cp);[m
[31m-	    }[m
[31m-	  }[m
[31m-	  cp_save(cp, (c & 0xff));[m
[31m-	  continue;[m
[31m-	}[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-    cp_save(cp, c);[m
[31m-    cp_get(cp);[m
[31m-  }[m
[31m-  cp_get(cp);[m
[31m-  if (delim == '"') {[m
[31m-    cp->str = lj_buf_str(cp->L, &cp->sb);[m
[31m-    return CTOK_STRING;[m
[31m-  } else {[m
[31m-    if (sbuflen(&cp->sb) != 1) cp_err_token(cp, '\'');[m
[31m-    cp->val.i32 = (int32_t)(char)*sbufB(&cp->sb);[m
[31m-    cp->val.id = CTID_INT32;[m
[31m-    return CTOK_INTEGER;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Skip C comment. */[m
[31m-static void cp_comment_c(CPState *cp)[m
[31m-{[m
[31m-  do {[m
[31m-    if (cp_get(cp) == '*') {[m
[31m-      do {[m
[31m-	if (cp_get(cp) == '/') { cp_get(cp); return; }[m
[31m-      } while (cp->c == '*');[m
[31m-    }[m
[31m-    if (cp_iseol(cp->c)) cp_newline(cp);[m
[31m-  } while (cp->c != '\0');[m
[31m-}[m
[31m-[m
[31m-/* Skip C++ comment. */[m
[31m-static void cp_comment_cpp(CPState *cp)[m
[31m-{[m
[31m-  while (!cp_iseol(cp_get(cp)) && cp->c != '\0')[m
[31m-    ;[m
[31m-}[m
[31m-[m
[31m-/* Lexical scanner for C. Only a minimal subset is implemented. */[m
[31m-static CPToken cp_next_(CPState *cp)[m
[31m-{[m
[31m-  lj_buf_reset(&cp->sb);[m
[31m-  for (;;) {[m
[31m-    if (lj_char_isident(cp->c))[m
[31m-      return lj_char_isdigit(cp->c) ? cp_number(cp) : cp_ident(cp);[m
[31m-    switch (cp->c) {[m
[31m-    case '\n': case '\r': cp_newline(cp);  /* fallthrough. */[m
[31m-    case ' ': case '\t': case '\v': case '\f': cp_get(cp); break;[m
[31m-    case '"': case '\'': return cp_string(cp);[m
[31m-    case '/':[m
[31m-      if (cp_get(cp) == '*') cp_comment_c(cp);[m
[31m-      else if (cp->c == '/') cp_comment_cpp(cp);[m
[31m-      else return '/';[m
[31m-      break;[m
[31m-    case '|':[m
[31m-      if (cp_get(cp) != '|') return '|';[m
[31m-      cp_get(cp); return CTOK_OROR;[m
[31m-    case '&':[m
[31m-      if (cp_get(cp) != '&') return '&';[m
[31m-      cp_get(cp); return CTOK_ANDAND;[m
[31m-    case '=':[m
[31m-      if (cp_get(cp) != '=') return '=';[m
[31m-      cp_get(cp); return CTOK_EQ;[m
[31m-    case '!':[m
[31m-      if (cp_get(cp) != '=') return '!';[m
[31m-      cp_get(cp); return CTOK_NE;[m
[31m-    case '<':[m
[31m-      if (cp_get(cp) == '=') { cp_get(cp); return CTOK_LE; }[m
[31m-      else if (cp->c == '<') { cp_get(cp); return CTOK_SHL; }[m
[31m-      return '<';[m
[31m-    case '>':[m
[31m-      if (cp_get(cp) == '=') { cp_get(cp); return CTOK_GE; }[m
[31m-      else if (cp->c == '>') { cp_get(cp); return CTOK_SHR; }[m
[31m-      return '>';[m
[31m-    case '-':[m
[31m-      if (cp_get(cp) != '>') return '-';[m
[31m-      cp_get(cp); return CTOK_DEREF;[m
[31m-    case '$':[m
[31m-      return cp_param(cp);[m
[31m-    case '\0': return CTOK_EOF;[m
[31m-    default: { CPToken c = cp->c; cp_get(cp); return c; }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE CPToken cp_next(CPState *cp)[m
[31m-{[m
[31m-  return (cp->tok = cp_next_(cp));[m
[31m-}[m
[31m-[m
[31m-/* -- C parser ------------------------------------------------------------ */[m
[31m-[m
[31m-/* Namespaces for resolving identifiers. */[m
[31m-#define CPNS_DEFAULT \[m
[31m-  ((1u<<CT_KW)|(1u<<CT_TYPEDEF)|(1u<<CT_FUNC)|(1u<<CT_EXTERN)|(1u<<CT_CONSTVAL))[m
[31m-#define CPNS_STRUCT	((1u<<CT_KW)|(1u<<CT_STRUCT)|(1u<<CT_ENUM))[m
[31m-[m
[31m-typedef CTypeID CPDeclIdx;	/* Index into declaration stack. */[m
[31m-typedef uint32_t CPscl;		/* Storage class flags. */[m
[31m-[m
[31m-/* Type declaration context. */[m
[31m-typedef struct CPDecl {[m
[31m-  CPDeclIdx top;	/* Top of declaration stack. */[m
[31m-  CPDeclIdx pos;	/* Insertion position in declaration chain. */[m
[31m-  CPDeclIdx specpos;	/* Saved position for declaration specifier. */[m
[31m-  uint32_t mode;	/* Declarator mode. */[m
[31m-  CPState *cp;		/* C parser state. */[m
[31m-  GCstr *name;		/* Name of declared identifier (if direct). */[m
[31m-  GCstr *redir;		/* Redirected symbol name. */[m
[31m-  CTypeID nameid;	/* Existing typedef for declared identifier. */[m
[31m-  CTInfo attr;		/* Attributes. */[m
[31m-  CTInfo fattr;		/* Function attributes. */[m
[31m-  CTInfo specattr;	/* Saved attributes. */[m
[31m-  CTInfo specfattr;	/* Saved function attributes. */[m
[31m-  CTSize bits;		/* Field size in bits (if any). */[m
[31m-  CType stack[CPARSE_MAX_DECLSTACK];  /* Type declaration stack. */[m
[31m-} CPDecl;[m
[31m-[m
[31m-/* Forward declarations. */[m
[31m-static CPscl cp_decl_spec(CPState *cp, CPDecl *decl, CPscl scl);[m
[31m-static void cp_declarator(CPState *cp, CPDecl *decl);[m
[31m-static CTypeID cp_decl_abstract(CPState *cp);[m
[31m-[m
[31m-/* Initialize C parser state. Caller must set up: L, p, srcname, mode. */[m
[31m-static void cp_init(CPState *cp)[m
[31m-{[m
[31m-  cp->linenumber = 1;[m
[31m-  cp->depth = 0;[m
[31m-  cp->curpack = 0;[m
[31m-  cp->packstack[0] = 255;[m
[31m-  lj_buf_init(cp->L, &cp->sb);[m
[31m-  lua_assert(cp->p != NULL);[m
[31m-  cp_get(cp);  /* Read-ahead first char. */[m
[31m-  cp->tok = 0;[m
[31m-  cp->tmask = CPNS_DEFAULT;[m
[31m-  cp_next(cp);  /* Read-ahead first token. */[m
[31m-}[m
[31m-[m
[31m-/* Cleanup C parser state. */[m
[31m-static void cp_cleanup(CPState *cp)[m
[31m-{[m
[31m-  global_State *g = G(cp->L);[m
[31m-  lj_buf_free(g, &cp->sb);[m
[31m-}[m
[31m-[m
[31m-/* Check and consume optional token. */[m
[31m-static int cp_opt(CPState *cp, CPToken tok)[m
[31m-{[m
[31m-  if (cp->tok == tok) { cp_next(cp); return 1; }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check and consume token. */[m
[31m-static void cp_check(CPState *cp, CPToken tok)[m
[31m-{[m
[31m-  if (cp->tok != tok) cp_err_token(cp, tok);[m
[31m-  cp_next(cp);[m
[31m-}[m
[31m-[m
[31m-/* Check if the next token may start a type declaration. */[m
[31m-static int cp_istypedecl(CPState *cp)[m
[31m-{[m
[31m-  if (cp->tok >= CTOK_FIRSTDECL && cp->tok <= CTOK_LASTDECL) return 1;[m
[31m-  if (cp->tok == CTOK_IDENT && ctype_istypedef(cp->ct->info)) return 1;[m
[31m-  if (cp->tok == '$') return 1;[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant expression evaluator --------------------------------------- */[m
[31m-[m
[31m-/* Forward declarations. */[m
[31m-static void cp_expr_unary(CPState *cp, CPValue *k);[m
[31m-static void cp_expr_sub(CPState *cp, CPValue *k, int pri);[m
[31m-[m
[31m-/* Please note that type handling is very weak here. Most ops simply[m
[31m-** assume integer operands. Accessors are only needed to compute types and[m
[31m-** return synthetic values. The only purpose of the expression evaluator[m
[31m-** is to compute the values of constant expressions one would typically[m
[31m-** find in C header files. And again: this is NOT a validating C parser![m
[31m-*/[m
[31m-[m
[31m-/* Parse comma separated expression and return last result. */[m
[31m-static void cp_expr_comma(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  do { cp_expr_sub(cp, k, 0); } while (cp_opt(cp, ','));[m
[31m-}[m
[31m-[m
[31m-/* Parse sizeof/alignof operator. */[m
[31m-static void cp_expr_sizeof(CPState *cp, CPValue *k, int wantsz)[m
[31m-{[m
[31m-  CTSize sz;[m
[31m-  CTInfo info;[m
[31m-  if (cp_opt(cp, '(')) {[m
[31m-    if (cp_istypedecl(cp))[m
[31m-      k->id = cp_decl_abstract(cp);[m
[31m-    else[m
[31m-      cp_expr_comma(cp, k);[m
[31m-    cp_check(cp, ')');[m
[31m-  } else {[m
[31m-    cp_expr_unary(cp, k);[m
[31m-  }[m
[31m-  info = lj_ctype_info(cp->cts, k->id, &sz);[m
[31m-  if (wantsz) {[m
[31m-    if (sz != CTSIZE_INVALID)[m
[31m-      k->u32 = sz;[m
[31m-    else if (k->id != CTID_A_CCHAR)  /* Special case for sizeof("string"). */[m
[31m-      cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-  } else {[m
[31m-    k->u32 = 1u << ctype_align(info);[m
[31m-  }[m
[31m-  k->id = CTID_UINT32;  /* Really size_t. */[m
[31m-}[m
[31m-[m
[31m-/* Parse prefix operators. */[m
[31m-static void cp_expr_prefix(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  if (cp->tok == CTOK_INTEGER) {[m
[31m-    *k = cp->val; cp_next(cp);[m
[31m-  } else if (cp_opt(cp, '+')) {[m
[31m-    cp_expr_unary(cp, k);  /* Nothing to do (well, integer promotion). */[m
[31m-  } else if (cp_opt(cp, '-')) {[m
[31m-    cp_expr_unary(cp, k); k->i32 = -k->i32;[m
[31m-  } else if (cp_opt(cp, '~')) {[m
[31m-    cp_expr_unary(cp, k); k->i32 = ~k->i32;[m
[31m-  } else if (cp_opt(cp, '!')) {[m
[31m-    cp_expr_unary(cp, k); k->i32 = !k->i32; k->id = CTID_INT32;[m
[31m-  } else if (cp_opt(cp, '(')) {[m
[31m-    if (cp_istypedecl(cp)) {  /* Cast operator. */[m
[31m-      CTypeID id = cp_decl_abstract(cp);[m
[31m-      cp_check(cp, ')');[m
[31m-      cp_expr_unary(cp, k);[m
[31m-      k->id = id;  /* No conversion performed. */[m
[31m-    } else {  /* Sub-expression. */[m
[31m-      cp_expr_comma(cp, k);[m
[31m-      cp_check(cp, ')');[m
[31m-    }[m
[31m-  } else if (cp_opt(cp, '*')) {  /* Indirection. */[m
[31m-    CType *ct;[m
[31m-    cp_expr_unary(cp, k);[m
[31m-    ct = lj_ctype_rawref(cp->cts, k->id);[m
[31m-    if (!ctype_ispointer(ct->info))[m
[31m-      cp_err_badidx(cp, ct);[m
[31m-    k->u32 = 0; k->id = ctype_cid(ct->info);[m
[31m-  } else if (cp_opt(cp, '&')) {  /* Address operator. */[m
[31m-    cp_expr_unary(cp, k);[m
[31m-    k->id = lj_ctype_intern(cp->cts, CTINFO(CT_PTR, CTALIGN_PTR+k->id),[m
[31m-			    CTSIZE_PTR);[m
[31m-  } else if (cp_opt(cp, CTOK_SIZEOF)) {[m
[31m-    cp_expr_sizeof(cp, k, 1);[m
[31m-  } else if (cp_opt(cp, CTOK_ALIGNOF)) {[m
[31m-    cp_expr_sizeof(cp, k, 0);[m
[31m-  } else if (cp->tok == CTOK_IDENT) {[m
[31m-    if (ctype_type(cp->ct->info) == CT_CONSTVAL) {[m
[31m-      k->u32 = cp->ct->size; k->id = ctype_cid(cp->ct->info);[m
[31m-    } else if (ctype_type(cp->ct->info) == CT_EXTERN) {[m
[31m-      k->u32 = cp->val.id; k->id = ctype_cid(cp->ct->info);[m
[31m-    } else if (ctype_type(cp->ct->info) == CT_FUNC) {[m
[31m-      k->u32 = cp->val.id; k->id = cp->val.id;[m
[31m-    } else {[m
[31m-      goto err_expr;[m
[31m-    }[m
[31m-    cp_next(cp);[m
[31m-  } else if (cp->tok == CTOK_STRING) {[m
[31m-    CTSize sz = cp->str->len;[m
[31m-    while (cp_next(cp) == CTOK_STRING)[m
[31m-      sz += cp->str->len;[m
[31m-    k->u32 = sz + 1;[m
[31m-    k->id = CTID_A_CCHAR;[m
[31m-  } else {[m
[31m-  err_expr:[m
[31m-    cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse postfix operators. */[m
[31m-static void cp_expr_postfix(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  for (;;) {[m
[31m-    CType *ct;[m
[31m-    if (cp_opt(cp, '[')) {  /* Array/pointer index. */[m
[31m-      CPValue k2;[m
[31m-      cp_expr_comma(cp, &k2);[m
[31m-      ct = lj_ctype_rawref(cp->cts, k->id);[m
[31m-      if (!ctype_ispointer(ct->info)) {[m
[31m-	ct = lj_ctype_rawref(cp->cts, k2.id);[m
[31m-	if (!ctype_ispointer(ct->info))[m
[31m-	  cp_err_badidx(cp, ct);[m
[31m-      }[m
[31m-      cp_check(cp, ']');[m
[31m-      k->u32 = 0;[m
[31m-    } else if (cp->tok == '.' || cp->tok == CTOK_DEREF) {  /* Struct deref. */[m
[31m-      CTSize ofs;[m
[31m-      CType *fct;[m
[31m-      ct = lj_ctype_rawref(cp->cts, k->id);[m
[31m-      if (cp->tok == CTOK_DEREF) {[m
[31m-	if (!ctype_ispointer(ct->info))[m
[31m-	  cp_err_badidx(cp, ct);[m
[31m-	ct = lj_ctype_rawref(cp->cts, ctype_cid(ct->info));[m
[31m-      }[m
[31m-      cp_next(cp);[m
[31m-      if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT);[m
[31m-      if (!ctype_isstruct(ct->info) || ct->size == CTSIZE_INVALID ||[m
[31m-	  !(fct = lj_ctype_getfield(cp->cts, ct, cp->str, &ofs)) ||[m
[31m-	  ctype_isbitfield(fct->info)) {[m
[31m-	GCstr *s = lj_ctype_repr(cp->cts->L, ctype_typeid(cp->cts, ct), NULL);[m
[31m-	cp_errmsg(cp, 0, LJ_ERR_FFI_BADMEMBER, strdata(s), strdata(cp->str));[m
[31m-      }[m
[31m-      ct = fct;[m
[31m-      k->u32 = ctype_isconstval(ct->info) ? ct->size : 0;[m
[31m-      cp_next(cp);[m
[31m-    } else {[m
[31m-      return;[m
[31m-    }[m
[31m-    k->id = ctype_cid(ct->info);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse infix operators. */[m
[31m-static void cp_expr_infix(CPState *cp, CPValue *k, int pri)[m
[31m-{[m
[31m-  CPValue k2;[m
[31m-  k2.u32 = 0; k2.id = 0;  /* Silence the compiler. */[m
[31m-  for (;;) {[m
[31m-    switch (pri) {[m
[31m-    case 0:[m
[31m-      if (cp_opt(cp, '?')) {[m
[31m-	CPValue k3;[m
[31m-	cp_expr_comma(cp, &k2);  /* Right-associative. */[m
[31m-	cp_check(cp, ':');[m
[31m-	cp_expr_sub(cp, &k3, 0);[m
[31m-	k->u32 = k->u32 ? k2.u32 : k3.u32;[m
[31m-	k->id = k2.id > k3.id ? k2.id : k3.id;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 1:[m
[31m-      if (cp_opt(cp, CTOK_OROR)) {[m
[31m-	cp_expr_sub(cp, &k2, 2); k->i32 = k->u32 || k2.u32; k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 2:[m
[31m-      if (cp_opt(cp, CTOK_ANDAND)) {[m
[31m-	cp_expr_sub(cp, &k2, 3); k->i32 = k->u32 && k2.u32; k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 3:[m
[31m-      if (cp_opt(cp, '|')) {[m
[31m-	cp_expr_sub(cp, &k2, 4); k->u32 = k->u32 | k2.u32; goto arith_result;[m
[31m-      }[m
[31m-    case 4:[m
[31m-      if (cp_opt(cp, '^')) {[m
[31m-	cp_expr_sub(cp, &k2, 5); k->u32 = k->u32 ^ k2.u32; goto arith_result;[m
[31m-      }[m
[31m-    case 5:[m
[31m-      if (cp_opt(cp, '&')) {[m
[31m-	cp_expr_sub(cp, &k2, 6); k->u32 = k->u32 & k2.u32; goto arith_result;[m
[31m-      }[m
[31m-    case 6:[m
[31m-      if (cp_opt(cp, CTOK_EQ)) {[m
[31m-	cp_expr_sub(cp, &k2, 7); k->i32 = k->u32 == k2.u32; k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, CTOK_NE)) {[m
[31m-	cp_expr_sub(cp, &k2, 7); k->i32 = k->u32 != k2.u32; k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 7:[m
[31m-      if (cp_opt(cp, '<')) {[m
[31m-	cp_expr_sub(cp, &k2, 8);[m
[31m-	if (k->id == CTID_INT32 && k2.id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 < k2.i32;[m
[31m-	else[m
[31m-	  k->i32 = k->u32 < k2.u32;[m
[31m-	k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, '>')) {[m
[31m-	cp_expr_sub(cp, &k2, 8);[m
[31m-	if (k->id == CTID_INT32 && k2.id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 > k2.i32;[m
[31m-	else[m
[31m-	  k->i32 = k->u32 > k2.u32;[m
[31m-	k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, CTOK_LE)) {[m
[31m-	cp_expr_sub(cp, &k2, 8);[m
[31m-	if (k->id == CTID_INT32 && k2.id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 <= k2.i32;[m
[31m-	else[m
[31m-	  k->i32 = k->u32 <= k2.u32;[m
[31m-	k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, CTOK_GE)) {[m
[31m-	cp_expr_sub(cp, &k2, 8);[m
[31m-	if (k->id == CTID_INT32 && k2.id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 >= k2.i32;[m
[31m-	else[m
[31m-	  k->i32 = k->u32 >= k2.u32;[m
[31m-	k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 8:[m
[31m-      if (cp_opt(cp, CTOK_SHL)) {[m
[31m-	cp_expr_sub(cp, &k2, 9); k->u32 = k->u32 << k2.u32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, CTOK_SHR)) {[m
[31m-	cp_expr_sub(cp, &k2, 9);[m
[31m-	if (k->id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 >> k2.i32;[m
[31m-	else[m
[31m-	  k->u32 = k->u32 >> k2.u32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 9:[m
[31m-      if (cp_opt(cp, '+')) {[m
[31m-	cp_expr_sub(cp, &k2, 10); k->u32 = k->u32 + k2.u32;[m
[31m-      arith_result:[m
[31m-	if (k2.id > k->id) k->id = k2.id;  /* Trivial promotion to unsigned. */[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, '-')) {[m
[31m-	cp_expr_sub(cp, &k2, 10); k->u32 = k->u32 - k2.u32; goto arith_result;[m
[31m-      }[m
[31m-    case 10:[m
[31m-      if (cp_opt(cp, '*')) {[m
[31m-	cp_expr_unary(cp, &k2); k->u32 = k->u32 * k2.u32; goto arith_result;[m
[31m-      } else if (cp_opt(cp, '/')) {[m
[31m-	cp_expr_unary(cp, &k2);[m
[31m-	if (k2.id > k->id) k->id = k2.id;  /* Trivial promotion to unsigned. */[m
[31m-	if (k2.u32 == 0 ||[m
[31m-	    (k->id == CTID_INT32 && k->u32 == 0x80000000u && k2.i32 == -1))[m
[31m-	  cp_err(cp, LJ_ERR_BADVAL);[m
[31m-	if (k->id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 / k2.i32;[m
[31m-	else[m
[31m-	  k->u32 = k->u32 / k2.u32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, '%')) {[m
[31m-	cp_expr_unary(cp, &k2);[m
[31m-	if (k2.id > k->id) k->id = k2.id;  /* Trivial promotion to unsigned. */[m
[31m-	if (k2.u32 == 0 ||[m
[31m-	    (k->id == CTID_INT32 && k->u32 == 0x80000000u && k2.i32 == -1))[m
[31m-	  cp_err(cp, LJ_ERR_BADVAL);[m
[31m-	if (k->id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 % k2.i32;[m
[31m-	else[m
[31m-	  k->u32 = k->u32 % k2.u32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    default:[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse and evaluate unary expression. */[m
[31m-static void cp_expr_unary(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  if (++cp->depth > CPARSE_MAX_DECLDEPTH) cp_err(cp, LJ_ERR_XLEVELS);[m
[31m-  cp_expr_prefix(cp, k);[m
[31m-  cp_expr_postfix(cp, k);[m
[31m-  cp->depth--;[m
[31m-}[m
[31m-[m
[31m-/* Parse and evaluate sub-expression. */[m
[31m-static void cp_expr_sub(CPState *cp, CPValue *k, int pri)[m
[31m-{[m
[31m-  cp_expr_unary(cp, k);[m
[31m-  cp_expr_infix(cp, k, pri);[m
[31m-}[m
[31m-[m
[31m-/* Parse constant integer expression. */[m
[31m-static void cp_expr_kint(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  CType *ct;[m
[31m-  cp_expr_sub(cp, k, 0);[m
[31m-  ct = ctype_raw(cp->cts, k->id);[m
[31m-  if (!ctype_isinteger(ct->info)) cp_err(cp, LJ_ERR_BADVAL);[m
[31m-}[m
[31m-[m
[31m-/* Parse (non-negative) size expression. */[m
[31m-static CTSize cp_expr_ksize(CPState *cp)[m
[31m-{[m
[31m-  CPValue k;[m
[31m-  cp_expr_kint(cp, &k);[m
[31m-  if (k.u32 >= 0x80000000u) cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-  return k.u32;[m
[31m-}[m
[31m-[m
[31m-/* -- Type declaration stack management ----------------------------------- */[m
[31m-[m
[31m-/* Add declaration element behind the insertion position. */[m
[31m-static CPDeclIdx cp_add(CPDecl *decl, CTInfo info, CTSize size)[m
[31m-{[m
[31m-  CPDeclIdx top = decl->top;[m
[31m-  if (top >= CPARSE_MAX_DECLSTACK) cp_err(decl->cp, LJ_ERR_XLEVELS);[m
[31m-  decl->stack[top].info = info;[m
[31m-  decl->stack[top].size = size;[m
[31m-  decl->stack[top].sib = 0;[m
[31m-  setgcrefnull(decl->stack[top].name);[m
[31m-  decl->stack[top].next = decl->stack[decl->pos].next;[m
[31m-  decl->stack[decl->pos].next = (CTypeID1)top;[m
[31m-  decl->top = top+1;[m
[31m-  return top;[m
[31m-}[m
[31m-[m
[31m-/* Push declaration element before the insertion position. */[m
[31m-static CPDeclIdx cp_push(CPDecl *decl, CTInfo info, CTSize size)[m
[31m-{[m
[31m-  return (decl->pos = cp_add(decl, info, size));[m
[31m-}[m
[31m-[m
[31m-/* Push or merge attributes. */[m
[31m-static void cp_push_attributes(CPDecl *decl)[m
[31m-{[m
[31m-  CType *ct = &decl->stack[decl->pos];[m
[31m-  if (ctype_isfunc(ct->info)) {  /* Ok to modify in-place. */[m
[31m-#if LJ_TARGET_X86[m
[31m-    if ((decl->fattr & CTFP_CCONV))[m
[31m-      ct->info = (ct->info & (CTMASK_NUM|CTF_VARARG|CTMASK_CID)) +[m
[31m-		 (decl->fattr & ~CTMASK_CID);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    if ((decl->attr & CTFP_ALIGNED) && !(decl->mode & CPARSE_MODE_FIELD))[m
[31m-      cp_push(decl, CTINFO(CT_ATTRIB, CTATTRIB(CTA_ALIGN)),[m
[31m-	      ctype_align(decl->attr));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Push unrolled type to declaration stack and merge qualifiers. */[m
[31m-static void cp_push_type(CPDecl *decl, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_get(decl->cp->cts, id);[m
[31m-  CTInfo info = ct->info;[m
[31m-  CTSize size = ct->size;[m
[31m-  switch (ctype_type(info)) {[m
[31m-  case CT_STRUCT: case CT_ENUM:[m
[31m-    cp_push(decl, CTINFO(CT_TYPEDEF, id), 0);  /* Don't copy unique types. */[m
[31m-    if ((decl->attr & CTF_QUAL)) {  /* Push unmerged qualifiers. */[m
[31m-      cp_push(decl, CTINFO(CT_ATTRIB, CTATTRIB(CTA_QUAL)),[m
[31m-	      (decl->attr & CTF_QUAL));[m
[31m-      decl->attr &= ~CTF_QUAL;[m
[31m-    }[m
[31m-    break;[m
[31m-  case CT_ATTRIB:[m
[31m-    if (ctype_isxattrib(info, CTA_QUAL))[m
[31m-      decl->attr &= ~size;  /* Remove redundant qualifiers. */[m
[31m-    cp_push_type(decl, ctype_cid(info));  /* Unroll. */[m
[31m-    cp_push(decl, info & ~CTMASK_CID, size);  /* Copy type. */[m
[31m-    break;[m
[31m-  case CT_ARRAY:[m
[31m-    if ((ct->info & (CTF_VECTOR|CTF_COMPLEX))) {[m
[31m-      info |= (decl->attr & CTF_QUAL);[m
[31m-      decl->attr &= ~CTF_QUAL;[m
[31m-    }[m
[31m-    cp_push_type(decl, ctype_cid(info));  /* Unroll. */[m
[31m-    cp_push(decl, info & ~CTMASK_CID, size);  /* Copy type. */[m
[31m-    decl->stack[decl->pos].sib = 1;  /* Mark as already checked and sized. */[m
[31m-    /* Note: this is not copied to the ct->sib in the C type table. */[m
[31m-    break;[m
[31m-  case CT_FUNC:[m
[31m-    /* Copy type, link parameters (shared). */[m
[31m-    decl->stack[cp_push(decl, info, size)].sib = ct->sib;[m
[31m-    break;[m
[31m-  default:[m
[31m-    /* Copy type, merge common qualifiers. */[m
[31m-    cp_push(decl, info|(decl->attr & CTF_QUAL), size);[m
[31m-    decl->attr &= ~CTF_QUAL;[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Consume the declaration element chain and intern the C type. */[m
[31m-static CTypeID cp_decl_intern(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  CTypeID id = 0;[m
[31m-  CPDeclIdx idx = 0;[m
[31m-  CTSize csize = CTSIZE_INVALID;[m
[31m-  CTSize cinfo = 0;[m
[31m-  do {[m
[31m-    CType *ct = &decl->stack[idx];[m
[31m-    CTInfo info = ct->info;[m
[31m-    CTInfo size = ct->size;[m
[31m-    /* The cid is already part of info for copies of pointers/functions. */[m
[31m-    idx = ct->next;[m
[31m-    if (ctype_istypedef(info)) {[m
[31m-      lua_assert(id == 0);[m
[31m-      id = ctype_cid(info);[m
[31m-      /* Always refetch info/size, since struct/enum may have been completed. */[m
[31m-      cinfo = ctype_get(cp->cts, id)->info;[m
[31m-      csize = ctype_get(cp->cts, id)->size;[m
[31m-      lua_assert(ctype_isstruct(cinfo) || ctype_isenum(cinfo));[m
[31m-    } else if (ctype_isfunc(info)) {  /* Intern function. */[m
[31m-      CType *fct;[m
[31m-      CTypeID fid;[m
[31m-      CTypeID sib;[m
[31m-      if (id) {[m
[31m-	CType *refct = ctype_raw(cp->cts, id);[m
[31m-	/* Reject function or refarray return types. */[m
[31m-	if (ctype_isfunc(refct->info) || ctype_isrefarray(refct->info))[m
[31m-	  cp_err(cp, LJ_ERR_FFI_INVTYPE);[m
[31m-      }[m
[31m-      /* No intervening attributes allowed, skip forward. */[m
[31m-      while (idx) {[m
[31m-	CType *ctn = &decl->stack[idx];[m
[31m-	if (!ctype_isattrib(ctn->info)) break;[m
[31m-	idx = ctn->next;  /* Skip attribute. */[m
[31m-      }[m
[31m-      sib = ct->sib;  /* Next line may reallocate the C type table. */[m
[31m-      fid = lj_ctype_new(cp->cts, &fct);[m
[31m-      csize = CTSIZE_INVALID;[m
[31m-      fct->info = cinfo = info + id;[m
[31m-      fct->size = size;[m
[31m-      fct->sib = sib;[m
[31m-      id = fid;[m
[31m-    } else if (ctype_isattrib(info)) {[m
[31m-      if (ctype_isxattrib(info, CTA_QUAL))[m
[31m-	cinfo |= size;[m
[31m-      else if (ctype_isxattrib(info, CTA_ALIGN))[m
[31m-	CTF_INSERT(cinfo, ALIGN, size);[m
[31m-      id = lj_ctype_intern(cp->cts, info+id, size);[m
[31m-      /* Inherit csize/cinfo from original type. */[m
[31m-    } else {[m
[31m-      if (ctype_isnum(info)) {  /* Handle mode/vector-size attributes. */[m
[31m-	lua_assert(id == 0);[m
[31m-	if (!(info & CTF_BOOL)) {[m
[31m-	  CTSize msize = ctype_msizeP(decl->attr);[m
[31m-	  CTSize vsize = ctype_vsizeP(decl->attr);[m
[31m-	  if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) {[m
[31m-	    CTSize malign = lj_fls(msize);[m
[31m-	    if (malign > 4) malign = 4;  /* Limit alignment. */[m
[31m-	    CTF_INSERT(info, ALIGN, malign);[m
[31m-	    size = msize;  /* Override size via mode. */[m
[31m-	  }[m
[31m-	  if (vsize) {  /* Vector size set? */[m
[31m-	    CTSize esize = lj_fls(size);[m
[31m-	    if (vsize >= esize) {[m
[31m-	      /* Intern the element type first. */[m
[31m-	      id = lj_ctype_intern(cp->cts, info, size);[m
[31m-	      /* Then create a vector (array) with vsize alignment. */[m
[31m-	      size = (1u << vsize);[m
[31m-	      if (vsize > 4) vsize = 4;  /* Limit alignment. */[m
[31m-	      if (ctype_align(info) > vsize) vsize = ctype_align(info);[m
[31m-	      info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR +[m
[31m-				      CTALIGN(vsize));[m
[31m-	    }[m
[31m-	  }[m
[31m-	}[m
[31m-      } else if (ctype_isptr(info)) {[m
[31m-	/* Reject pointer/ref to ref. */[m
[31m-	if (id && ctype_isref(ctype_raw(cp->cts, id)->info))[m
[31m-	  cp_err(cp, LJ_ERR_FFI_INVTYPE);[m
[31m-	if (ctype_isref(info)) {[m
[31m-	  info &= ~CTF_VOLATILE;  /* Refs are always const, never volatile. */[m
[31m-	  /* No intervening attributes allowed, skip forward. */[m
[31m-	  while (idx) {[m
[31m-	    CType *ctn = &decl->stack[idx];[m
[31m-	    if (!ctype_isattrib(ctn->info)) break;[m
[31m-	    idx = ctn->next;  /* Skip attribute. */[m
[31m-	  }[m
[31m-	}[m
[31m-      } else if (ctype_isarray(info)) {  /* Check for valid array size etc. */[m
[31m-	if (ct->sib == 0) {  /* Only check/size arrays not copied by unroll. */[m
[31m-	  if (ctype_isref(cinfo))  /* Reject arrays of refs. */[m
[31m-	    cp_err(cp, LJ_ERR_FFI_INVTYPE);[m
[31m-	  /* Reject VLS or unknown-sized types. */[m
[31m-	  if (ctype_isvltype(cinfo) || csize == CTSIZE_INVALID)[m
[31m-	    cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-	  /* a[] and a[?] keep their invalid size. */[m
[31m-	  if (size != CTSIZE_INVALID) {[m
[31m-	    uint64_t xsz = (uint64_t)size * csize;[m
[31m-	    if (xsz >= 0x80000000u) cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-	    size = (CTSize)xsz;[m
[31m-	  }[m
[31m-	}[m
[31m-	if ((cinfo & CTF_ALIGN) > (info & CTF_ALIGN))  /* Find max. align. */[m
[31m-	  info = (info & ~CTF_ALIGN) | (cinfo & CTF_ALIGN);[m
[31m-	info |= (cinfo & CTF_QUAL);  /* Inherit qual. */[m
[31m-      } else {[m
[31m-	lua_assert(ctype_isvoid(info));[m
[31m-      }[m
[31m-      csize = size;[m
[31m-      cinfo = info+id;[m
[31m-      id = lj_ctype_intern(cp->cts, info+id, size);[m
[31m-    }[m
[31m-  } while (idx);[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-/* -- C declaration parser ------------------------------------------------ */[m
[31m-[m
[31m-#define H_(le, be)	LJ_ENDIAN_SELECT(0x##le, 0x##be)[m
[31m-[m
[31m-/* Reset declaration state to declaration specifier. */[m
[31m-static void cp_decl_reset(CPDecl *decl)[m
[31m-{[m
[31m-  decl->pos = decl->specpos;[m
[31m-  decl->top = decl->specpos+1;[m
[31m-  decl->stack[decl->specpos].next = 0;[m
[31m-  decl->attr = decl->specattr;[m
[31m-  decl->fattr = decl->specfattr;[m
[31m-  decl->name = NULL;[m
[31m-  decl->redir = NULL;[m
[31m-}[m
[31m-[m
[31m-/* Parse constant initializer. */[m
[31m-/* NYI: FP constants and strings as initializers. */[m
[31m-static CTypeID cp_decl_constinit(CPState *cp, CType **ctp, CTypeID ctypeid)[m
[31m-{[m
[31m-  CType *ctt = ctype_get(cp->cts, ctypeid);[m
[31m-  CTInfo info;[m
[31m-  CTSize size;[m
[31m-  CPValue k;[m
[31m-  CTypeID constid;[m
[31m-  while (ctype_isattrib(ctt->info)) {  /* Skip attributes. */[m
[31m-    ctypeid = ctype_cid(ctt->info);  /* Update ID, too. */[m
[31m-    ctt = ctype_get(cp->cts, ctypeid);[m
[31m-  }[m
[31m-  info = ctt->info;[m
[31m-  size = ctt->size;[m
[31m-  if (!ctype_isinteger(info) || !(info & CTF_CONST) || size > 4)[m
[31m-    cp_err(cp, LJ_ERR_FFI_INVTYPE);[m
[31m-  cp_check(cp, '=');[m
[31m-  cp_expr_sub(cp, &k, 0);[m
[31m-  constid = lj_ctype_new(cp->cts, ctp);[m
[31m-  (*ctp)->info = CTINFO(CT_CONSTVAL, CTF_CONST|ctypeid);[m
[31m-  k.u32 <<= 8*(4-size);[m
[31m-  if ((info & CTF_UNSIGNED))[m
[31m-    k.u32 >>= 8*(4-size);[m
[31m-  else[m
[31m-    k.u32 = (uint32_t)((int32_t)k.u32 >> 8*(4-size));[m
[31m-  (*ctp)->size = k.u32;[m
[31m-  return constid;[m
[31m-}[m
[31m-[m
[31m-/* Parse size in parentheses as part of attribute. */[m
[31m-static CTSize cp_decl_sizeattr(CPState *cp)[m
[31m-{[m
[31m-  CTSize sz;[m
[31m-  uint32_t oldtmask = cp->tmask;[m
[31m-  cp->tmask = CPNS_DEFAULT;  /* Required for expression evaluator. */[m
[31m-  cp_check(cp, '(');[m
[31m-  sz = cp_expr_ksize(cp);[m
[31m-  cp->tmask = oldtmask;[m
[31m-  cp_check(cp, ')');[m
[31m-  return sz;[m
[31m-}[m
[31m-[m
[31m-/* Parse alignment attribute. */[m
[31m-static void cp_decl_align(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  CTSize al = 4;  /* Unspecified alignment is 16 bytes. */[m
[31m-  if (cp->tok == '(') {[m
[31m-    al = cp_decl_sizeattr(cp);[m
[31m-    al = al ? lj_fls(al) : 0;[m
[31m-  }[m
[31m-  CTF_INSERT(decl->attr, ALIGN, al);[m
[31m-  decl->attr |= CTFP_ALIGNED;[m
[31m-}[m
[31m-[m
[31m-/* Parse GCC asm("name") redirect. */[m
[31m-static void cp_decl_asm(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  UNUSED(decl);[m
[31m-  cp_next(cp);[m
[31m-  cp_check(cp, '(');[m
[31m-  if (cp->tok == CTOK_STRING) {[m
[31m-    GCstr *str = cp->str;[m
[31m-    while (cp_next(cp) == CTOK_STRING) {[m
[31m-      lj_strfmt_pushf(cp->L, "%s%s", strdata(str), strdata(cp->str));[m
[31m-      cp->L->top--;[m
[31m-      str = strV(cp->L->top);[m
[31m-    }[m
[31m-    decl->redir = str;[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-}[m
[31m-[m
[31m-/* Parse GCC __attribute__((mode(...))). */[m
[31m-static void cp_decl_mode(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  cp_check(cp, '(');[m
[31m-  if (cp->tok == CTOK_IDENT) {[m
[31m-    const char *s = strdata(cp->str);[m
[31m-    CTSize sz = 0, vlen = 0;[m
[31m-    if (s[0] == '_' && s[1] == '_') s += 2;[m
[31m-    if (*s == 'V') {[m
[31m-      s++;[m
[31m-      vlen = *s++ - '0';[m
[31m-      if (*s >= '0' && *s <= '9')[m
[31m-	vlen = vlen*10 + (*s++ - '0');[m
[31m-    }[m
[31m-    switch (*s++) {[m
[31m-    case 'Q': sz = 1; break;[m
[31m-    case 'H': sz = 2; break;[m
[31m-    case 'S': sz = 4; break;[m
[31m-    case 'D': sz = 8; break;[m
[31m-    case 'T': sz = 16; break;[m
[31m-    case 'O': sz = 32; break;[m
[31m-    default: goto bad_size;[m
[31m-    }[m
[31m-    if (*s == 'I' || *s == 'F') {[m
[31m-      CTF_INSERT(decl->attr, MSIZEP, sz);[m
[31m-      if (vlen) CTF_INSERT(decl->attr, VSIZEP, lj_fls(vlen*sz));[m
[31m-    }[m
[31m-  bad_size:[m
[31m-    cp_next(cp);[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-}[m
[31m-[m
[31m-/* Parse GCC __attribute__((...)). */[m
[31m-static void cp_decl_gccattribute(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  cp_next(cp);[m
[31m-  cp_check(cp, '(');[m
[31m-  cp_check(cp, '(');[m
[31m-  while (cp->tok != ')') {[m
[31m-    if (cp->tok == CTOK_IDENT) {[m
[31m-      GCstr *attrstr = cp->str;[m
[31m-      cp_next(cp);[m
[31m-      switch (attrstr->hash) {[m
[31m-      case H_(64a9208e,8ce14319): case H_(8e6331b2,95a282af):  /* aligned */[m
[31m-	cp_decl_align(cp, decl);[m
[31m-	break;[m
[31m-      case H_(42eb47de,f0ede26c): case H_(29f48a09,cf383e0c):  /* packed */[m
[31m-	decl->attr |= CTFP_PACKED;[m
[31m-	break;[m
[31m-      case H_(0a84eef6,8dfab04c): case H_(995cf92c,d5696591):  /* mode */[m
[31m-	cp_decl_mode(cp, decl);[m
[31m-	break;[m
[31m-      case H_(0ab31997,2d5213fa): case H_(bf875611,200e9990):  /* vector_size */[m
[31m-	{[m
[31m-	  CTSize vsize = cp_decl_sizeattr(cp);[m
[31m-	  if (vsize) CTF_INSERT(decl->attr, VSIZEP, lj_fls(vsize));[m
[31m-	}[m
[31m-	break;[m
[31m-#if LJ_TARGET_X86[m
[31m-      case H_(5ad22db8,c689b848): case H_(439150fa,65ea78cb):  /* regparm */[m
[31m-	CTF_INSERT(decl->fattr, REGPARM, cp_decl_sizeattr(cp));[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(18fc0b98,7ff4c074): case H_(4e62abed,0a747424):  /* cdecl */[m
[31m-	CTF_INSERT(decl->fattr, CCONV, CTCC_CDECL);[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(72b2e41b,494c5a44): case H_(f2356d59,f25fc9bd):  /* thiscall */[m
[31m-	CTF_INSERT(decl->fattr, CCONV, CTCC_THISCALL);[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(0d0ffc42,ab746f88): case H_(21c54ba1,7f0ca7e3):  /* fastcall */[m
[31m-	CTF_INSERT(decl->fattr, CCONV, CTCC_FASTCALL);[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(ef76b040,9412e06a): case H_(de56697b,c750e6e1):  /* stdcall */[m
[31m-	CTF_INSERT(decl->fattr, CCONV, CTCC_STDCALL);[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(ea78b622,f234bd8e): case H_(252ffb06,8d50f34b):  /* sseregparm */[m
[31m-	decl->fattr |= CTF_SSEREGPARM;[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-#endif[m
[31m-      default:  /* Skip all other attributes. */[m
[31m-	goto skip_attr;[m
[31m-      }[m
[31m-    } else if (cp->tok >= CTOK_FIRSTDECL) {  /* For __attribute((const)) etc. */[m
[31m-      cp_next(cp);[m
[31m-    skip_attr:[m
[31m-      if (cp_opt(cp, '(')) {[m
[31m-	while (cp->tok != ')' && cp->tok != CTOK_EOF) cp_next(cp);[m
[31m-	cp_check(cp, ')');[m
[31m-      }[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-    if (!cp_opt(cp, ',')) break;[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-  cp_check(cp, ')');[m
[31m-}[m
[31m-[m
[31m-/* Parse MSVC __declspec(...). */[m
[31m-static void cp_decl_msvcattribute(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  cp_next(cp);[m
[31m-  cp_check(cp, '(');[m
[31m-  while (cp->tok == CTOK_IDENT) {[m
[31m-    GCstr *attrstr = cp->str;[m
[31m-    cp_next(cp);[m
[31m-    switch (attrstr->hash) {[m
[31m-    case H_(bc2395fa,98f267f8):  /* align */[m
[31m-      cp_decl_align(cp, decl);[m
[31m-      break;[m
[31m-    default:  /* Ignore all other attributes. */[m
[31m-      if (cp_opt(cp, '(')) {[m
[31m-	while (cp->tok != ')' && cp->tok != CTOK_EOF) cp_next(cp);[m
[31m-	cp_check(cp, ')');[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-}[m
[31m-[m
[31m-/* Parse declaration attributes (and common qualifiers). */[m
[31m-static void cp_decl_attributes(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  for (;;) {[m
[31m-    switch (cp->tok) {[m
[31m-    case CTOK_CONST: decl->attr |= CTF_CONST; break;[m
[31m-    case CTOK_VOLATILE: decl->attr |= CTF_VOLATILE; break;[m
[31m-    case CTOK_RESTRICT: break;  /* Ignore. */[m
[31m-    case CTOK_EXTENSION: break;  /* Ignore. */[m
[31m-    case CTOK_ATTRIBUTE: cp_decl_gccattribute(cp, decl); continue;[m
[31m-    case CTOK_ASM: cp_decl_asm(cp, decl); continue;[m
[31m-    case CTOK_DECLSPEC: cp_decl_msvcattribute(cp, decl); continue;[m
[31m-    case CTOK_CCDECL:[m
[31m-#if LJ_TARGET_X86[m
[31m-      CTF_INSERT(decl->fattr, CCONV, cp->ct->size);[m
[31m-      decl->fattr |= CTFP_CCONV;[m
[31m-#endif[m
[31m-      break;[m
[31m-    case CTOK_PTRSZ:[m
[31m-#if LJ_64[m
[31m-      CTF_INSERT(decl->attr, MSIZEP, cp->ct->size);[m
[31m-#endif[m
[31m-      break;[m
[31m-    default: return;[m
[31m-    }[m
[31m-    cp_next(cp);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse struct/union/enum name. */[m
[31m-static CTypeID cp_struct_name(CPState *cp, CPDecl *sdecl, CTInfo info)[m
[31m-{[m
[31m-  CTypeID sid;[m
[31m-  CType *ct;[m
[31m-  cp->tmask = CPNS_STRUCT;[m
[31m-  cp_next(cp);[m
[31m-  cp_decl_attributes(cp, sdecl);[m
[31m-  cp->tmask = CPNS_DEFAULT;[m
[31m-  if (cp->tok != '{') {[m
[31m-    if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT);[m
[31m-    if (cp->val.id) {  /* Name of existing struct/union/enum. */[m
[31m-      sid = cp->val.id;[m
[31m-      ct = cp->ct;[m
[31m-      if ((ct->info ^ info) & (CTMASK_NUM|CTF_UNION))  /* Wrong type. */[m
[31m-	cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(gco2str(gcref(ct->name))));[m
[31m-    } else {  /* Create named, incomplete struct/union/enum. */[m
[31m-      if ((cp->mode & CPARSE_MODE_NOIMPLICIT))[m
[31m-	cp_errmsg(cp, 0, LJ_ERR_FFI_BADTAG, strdata(cp->str));[m
[31m-      sid = lj_ctype_new(cp->cts, &ct);[m
[31m-      ct->info = info;[m
[31m-      ct->size = CTSIZE_INVALID;[m
[31m-      ctype_setname(ct, cp->str);[m
[31m-      lj_ctype_addname(cp->cts, ct, sid);[m
[31m-    }[m
[31m-    cp_next(cp);[m
[31m-  } else {  /* Create anonymous, incomplete struct/union/enum. */[m
[31m-    sid = lj_ctype_new(cp->cts, &ct);[m
[31m-    ct->info = info;[m
[31m-    ct->size = CTSIZE_INVALID;[m
[31m-  }[m
[31m-  if (cp->tok == '{') {[m
[31m-    if (ct->size != CTSIZE_INVALID || ct->sib)[m
[31m-      cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(gco2str(gcref(ct->name))));[m
[31m-    ct->sib = 1;  /* Indicate the type is currently being defined. */[m
[31m-  }[m
[31m-  return sid;[m
[31m-}[m
[31m-[m
[31m-/* Determine field alignment. */[m
[31m-static CTSize cp_field_align(CPState *cp, CType *ct, CTInfo info)[m
[31m-{[m
[31m-  CTSize align = ctype_align(info);[m
[31m-  UNUSED(cp); UNUSED(ct);[m
[31m-#if (LJ_TARGET_X86 && !LJ_ABI_WIN) || (LJ_TARGET_ARM && __APPLE__)[m
[31m-  /* The SYSV i386 and iOS ABIs limit alignment of non-vector fields to 2^2. */[m
[31m-  if (align > 2 && !(info & CTFP_ALIGNED)) {[m
[31m-    if (ctype_isarray(info) && !(info & CTF_VECTOR)) {[m
[31m-      do {[m
[31m-	ct = ctype_rawchild(cp->cts, ct);[m
[31m-	info = ct->info;[m
[31m-      } while (ctype_isarray(info) && !(info & CTF_VECTOR));[m
[31m-    }[m
[31m-    if (ctype_isnum(info) || ctype_isenum(info))[m
[31m-      align = 2;[m
[31m-  }[m
[31m-#endif[m
[31m-  return align;[m
[31m-}[m
[31m-[m
[31m-/* Layout struct/union fields. */[m
[31m-static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr)[m
[31m-{[m
[31m-  CTSize bofs = 0, bmaxofs = 0;  /* Bit offset and max. bit offset. */[m
[31m-  CTSize maxalign = ctype_align(sattr);[m
[31m-  CType *sct = ctype_get(cp->cts, sid);[m
[31m-  CTInfo sinfo = sct->info;[m
[31m-  CTypeID fieldid = sct->sib;[m
[31m-  while (fieldid) {[m
[31m-    CType *ct = ctype_get(cp->cts, fieldid);[m
[31m-    CTInfo attr = ct->size;  /* Field declaration attributes (temp.). */[m
[31m-[m
[31m-    if (ctype_isfield(ct->info) ||[m
[31m-	(ctype_isxattrib(ct->info, CTA_SUBTYPE) && attr)) {[m
[31m-      CTSize align, amask;  /* Alignment (pow2) and alignment mask (bits). */[m
[31m-      CTSize sz;[m
[31m-      CTInfo info = lj_ctype_info(cp->cts, ctype_cid(ct->info), &sz);[m
[31m-      CTSize bsz, csz = 8*sz;  /* Field size and container size (in bits). */[m
[31m-      sinfo |= (info & (CTF_QUAL|CTF_VLA));  /* Merge pseudo-qualifiers. */[m
[31m-[m
[31m-      /* Check for size overflow and determine alignment. */[m
[31m-      if (sz >= 0x20000000u || bofs + csz < bofs || (info & CTF_VLA)) {[m
[31m-	if (!(sz == CTSIZE_INVALID && ctype_isarray(info) &&[m
[31m-	      !(sinfo & CTF_UNION)))[m
[31m-	  cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-	csz = sz = 0;  /* Treat a[] and a[?] as zero-sized. */[m
[31m-      }[m
[31m-      align = cp_field_align(cp, ct, info);[m
[31m-      if (((attr|sattr) & CTFP_PACKED) ||[m
[31m-	  ((attr & CTFP_ALIGNED) && ctype_align(attr) > align))[m
[31m-	align = ctype_align(attr);[m
[31m-      if (cp->packstack[cp->curpack] < align)[m
[31m-	align = cp->packstack[cp->curpack];[m
[31m-      if (align > maxalign) maxalign = align;[m
[31m-      amask = (8u << align) - 1;[m
[31m-[m
[31m-      bsz = ctype_bitcsz(ct->info);  /* Bitfield size (temp.). */[m
[31m-      if (bsz == CTBSZ_FIELD || !ctype_isfield(ct->info)) {[m
[31m-	bsz = csz;  /* Regular fields or subtypes always fill the container. */[m
[31m-	bofs = (bofs + amask) & ~amask;  /* Start new aligned field. */[m
[31m-	ct->size = (bofs >> 3);  /* Store field offset. */[m
[31m-      } else {  /* Bitfield. */[m
[31m-	if (bsz == 0 || (attr & CTFP_ALIGNED) ||[m
[31m-	    (!((attr|sattr) & CTFP_PACKED) && (bofs & amask) + bsz > csz))[m
[31m-	  bofs = (bofs + amask) & ~amask;  /* Start new aligned field. */[m
[31m-[m
[31m-	/* Prefer regular field over bitfield. */[m
[31m-	if (bsz == csz && (bofs & amask) == 0) {[m
[31m-	  ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info));[m
[31m-	  ct->size = (bofs >> 3);  /* Store field offset. */[m
[31m-	} else {[m
[31m-	  ct->info = CTINFO(CT_BITFIELD,[m
[31m-	    (info & (CTF_QUAL|CTF_UNSIGNED|CTF_BOOL)) +[m
[31m-	    (csz << (CTSHIFT_BITCSZ-3)) + (bsz << CTSHIFT_BITBSZ));[m
[31m-#if LJ_BE[m
[31m-	  ct->info += ((csz - (bofs & (csz-1)) - bsz) << CTSHIFT_BITPOS);[m
[31m-#else[m
[31m-	  ct->info += ((bofs & (csz-1)) << CTSHIFT_BITPOS);[m
[31m-#endif[m
[31m-	  ct->size = ((bofs & ~(csz-1)) >> 3);  /* Store container offset. */[m
[31m-	}[m
[31m-      }[m
[31m-[m
[31m-      /* Determine next offset or max. offset. */[m
[31m-      if ((sinfo & CTF_UNION)) {[m
[31m-	if (bsz > bmaxofs) bmaxofs = bsz;[m
[31m-      } else {[m
[31m-	bofs += bsz;[m
[31m-      }[m
[31m-    }  /* All other fields in the chain are already set up. */[m
[31m-[m
[31m-    fieldid = ct->sib;[m
[31m-  }[m
[31m-[m
[31m-  /* Complete struct/union. */[m
[31m-  sct->info = sinfo + CTALIGN(maxalign);[m
[31m-  bofs = (sinfo & CTF_UNION) ? bmaxofs : bofs;[m
[31m-  maxalign = (8u << maxalign) - 1;[m
[31m-  sct->size = (((bofs + maxalign) & ~maxalign) >> 3);[m
[31m-}[m
[31m-[m
[31m-/* Parse struct/union declaration. */[m
[31m-static CTypeID cp_decl_struct(CPState *cp, CPDecl *sdecl, CTInfo sinfo)[m
[31m-{[m
[31m-  CTypeID sid = cp_struct_name(cp, sdecl, sinfo);[m
[31m-  if (cp_opt(cp, '{')) {  /* Struct/union definition. */[m
[31m-    CTypeID lastid = sid;[m
[31m-    int lastdecl = 0;[m
[31m-    while (cp->tok != '}') {[m
[31m-      CPDecl decl;[m
[31m-      CPscl scl = cp_decl_spec(cp, &decl, CDF_STATIC);[m
[31m-      decl.mode = scl ? CPARSE_MODE_DIRECT :[m
[31m-	CPARSE_MODE_DIRECT|CPARSE_MODE_ABSTRACT|CPARSE_MODE_FIELD;[m
[31m-[m
[31m-      for (;;) {[m
[31m-	CTypeID ctypeid;[m
[31m-[m
[31m-	if (lastdecl) cp_err_token(cp, '}');[m
[31m-[m
[31m-	/* Parse field declarator. */[m
[31m-	decl.bits = CTSIZE_INVALID;[m
[31m-	cp_declarator(cp, &decl);[m
[31m-	ctypeid = cp_decl_intern(cp, &decl);[m
[31m-[m
[31m-	if ((scl & CDF_STATIC)) {  /* Static constant in struct namespace. */[m
[31m-	  CType *ct;[m
[31m-	  CTypeID fieldid = cp_decl_constinit(cp, &ct, ctypeid);[m
[31m-	  ctype_get(cp->cts, lastid)->sib = fieldid;[m
[31m-	  lastid = fieldid;[m
[31m-	  ctype_setname(ct, decl.name);[m
[31m-	} else {[m
[31m-	  CTSize bsz = CTBSZ_FIELD;  /* Temp. for layout phase. */[m
[31m-	  CType *ct;[m
[31m-	  CTypeID fieldid = lj_ctype_new(cp->cts, &ct);  /* Do this first. */[m
[31m-	  CType *tct = ctype_raw(cp->cts, ctypeid);[m
[31m-[m
[31m-	  if (decl.bits == CTSIZE_INVALID) {  /* Regular field. */[m
[31m-	    if (ctype_isarray(tct->info) && tct->size == CTSIZE_INVALID)[m
[31m-	      lastdecl = 1;  /* a[] or a[?] must be the last declared field. */[m
[31m-[m
[31m-	    /* Accept transparent struct/union/enum. */[m
[31m-	    if (!decl.name) {[m
[31m-	      if (!((ctype_isstruct(tct->info) && !(tct->info & CTF_VLA)) ||[m
[31m-		    ctype_isenum(tct->info)))[m
[31m-		cp_err_token(cp, CTOK_IDENT);[m
[31m-	      ct->info = CTINFO(CT_ATTRIB, CTATTRIB(CTA_SUBTYPE) + ctypeid);[m
[31m-	      ct->size = ctype_isstruct(tct->info) ?[m
[31m-			 (decl.attr|0x80000000u) : 0;  /* For layout phase. */[m
[31m-	      goto add_field;[m
[31m-	    }[m
[31m-	  } else {  /* Bitfield. */[m
[31m-	    bsz = decl.bits;[m
[31m-	    if (!ctype_isinteger_or_bool(tct->info) ||[m
[31m-		(bsz == 0 && decl.name) || 8*tct->size > CTBSZ_MAX ||[m
[31m-		bsz > ((tct->info & CTF_BOOL) ? 1 : 8*tct->size))[m
[31m-	      cp_errmsg(cp, ':', LJ_ERR_BADVAL);[m
[31m-	  }[m
[31m-[m
[31m-	  /* Create temporary field for layout phase. */[m
[31m-	  ct->info = CTINFO(CT_FIELD, ctypeid + (bsz << CTSHIFT_BITCSZ));[m
[31m-	  ct->size = decl.attr;[m
[31m-	  if (decl.name) ctype_setname(ct, decl.name);[m
[31m-[m
[31m-	add_field:[m
[31m-	  ctype_get(cp->cts, lastid)->sib = fieldid;[m
[31m-	  lastid = fieldid;[m
[31m-	}[m
[31m-	if (!cp_opt(cp, ',')) break;[m
[31m-	cp_decl_reset(&decl);[m
[31m-      }[m
[31m-      cp_check(cp, ';');[m
[31m-    }[m
[31m-    cp_check(cp, '}');[m
[31m-    ctype_get(cp->cts, lastid)->sib = 0;  /* Drop sib = 1 for empty structs. */[m
[31m-    cp_decl_attributes(cp, sdecl);  /* Layout phase needs postfix attributes. */[m
[31m-    cp_struct_layout(cp, sid, sdecl->attr);[m
[31m-  }[m
[31m-  return sid;[m
[31m-}[m
[31m-[m
[31m-/* Parse enum declaration. */[m
[31m-static CTypeID cp_decl_enum(CPState *cp, CPDecl *sdecl)[m
[31m-{[m
[31m-  CTypeID eid = cp_struct_name(cp, sdecl, CTINFO(CT_ENUM, CTID_VOID));[m
[31m-  CTInfo einfo = CTINFO(CT_ENUM, CTALIGN(2) + CTID_UINT32);[m
[31m-  CTSize esize = 4;  /* Only 32 bit enums are supported. */[m
[31m-  if (cp_opt(cp, '{')) {  /* Enum definition. */[m
[31m-    CPValue k;[m
[31m-    CTypeID lastid = eid;[m
[31m-    k.u32 = 0;[m
[31m-    k.id = CTID_INT32;[m
[31m-    do {[m
[31m-      GCstr *name = cp->str;[m
[31m-      if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT);[m
[31m-      if (cp->val.id) cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(name));[m
[31m-      cp_next(cp);[m
[31m-      if (cp_opt(cp, '=')) {[m
[31m-	cp_expr_kint(cp, &k);[m
[31m-	if (k.id == CTID_UINT32) {[m
[31m-	  /* C99 says that enum constants are always (signed) integers.[m
[31m-	  ** But since unsigned constants like 0x80000000 are quite common,[m
[31m-	  ** those are left as uint32_t.[m
[31m-	  */[m
[31m-	  if (k.i32 >= 0) k.id = CTID_INT32;[m
[31m-	} else {[m
[31m-	  /* OTOH it's common practice and even mandated by some ABIs[m
[31m-	  ** that the enum type itself is unsigned, unless there are any[m
[31m-	  ** negative constants.[m
[31m-	  */[m
[31m-	  k.id = CTID_INT32;[m
[31m-	  if (k.i32 < 0) einfo = CTINFO(CT_ENUM, CTALIGN(2) + CTID_INT32);[m
[31m-	}[m
[31m-      }[m
[31m-      /* Add named enum constant. */[m
[31m-      {[m
[31m-	CType *ct;[m
[31m-	CTypeID constid = lj_ctype_new(cp->cts, &ct);[m
[31m-	ctype_get(cp->cts, lastid)->sib = constid;[m
[31m-	lastid = constid;[m
[31m-	ctype_setname(ct, name);[m
[31m-	ct->info = CTINFO(CT_CONSTVAL, CTF_CONST|k.id);[m
[31m-	ct->size = k.u32++;[m
[31m-	if (k.u32 == 0x80000000u) k.id = CTID_UINT32;[m
[31m-	lj_ctype_addname(cp->cts, ct, constid);[m
[31m-      }[m
[31m-      if (!cp_opt(cp, ',')) break;[m
[31m-    } while (cp->tok != '}');  /* Trailing ',' is ok. */[m
[31m-    cp_check(cp, '}');[m
[31m-    /* Complete enum. */[m
[31m-    ctype_get(cp->cts, eid)->info = einfo;[m
[31m-    ctype_get(cp->cts, eid)->size = esize;[m
[31m-  }[m
[31m-  return eid;[m
[31m-}[m
[31m-[m
[31m-/* Parse declaration specifiers. */[m
[31m-static CPscl cp_decl_spec(CPState *cp, CPDecl *decl, CPscl scl)[m
[31m-{[m
[31m-  uint32_t cds = 0, sz = 0;[m
[31m-  CTypeID tdef = 0;[m
[31m-[m
[31m-  decl->cp = cp;[m
[31m-  decl->mode = cp->mode;[m
[31m-  decl->name = NULL;[m
[31m-  decl->redir = NULL;[m
[31m-  decl->attr = 0;[m
[31m-  decl->fattr = 0;[m
[31m-  decl->pos = decl->top = 0;[m
[31m-  decl->stack[0].next = 0;[m
[31m-[m
[31m-  for (;;) {  /* Parse basic types. */[m
[31m-    cp_decl_attributes(cp, decl);[m
[31m-    if (cp->tok >= CTOK_FIRSTDECL && cp->tok <= CTOK_LASTDECLFLAG) {[m
[31m-      uint32_t cbit;[m
[31m-      if (cp->ct->size) {[m
[31m-	if (sz) goto end_decl;[m
[31m-	sz = cp->ct->size;[m
[31m-      }[m
[31m-      cbit = (1u << (cp->tok - CTOK_FIRSTDECL));[m
[31m-      cds = cds | cbit | ((cbit & cds & CDF_LONG) << 1);[m
[31m-      if (cp->tok >= CTOK_FIRSTSCL) {[m
[31m-	if (!(scl & cbit)) cp_errmsg(cp, cp->tok, LJ_ERR_FFI_BADSCL);[m
[31m-      } else if (tdef) {[m
[31m-	goto end_decl;[m
[31m-      }[m
[31m-      cp_next(cp);[m
[31m-      continue;[m
[31m-    }[m
[31m-    if (sz || tdef ||[m
[31m-	(cds & (CDF_SHORT|CDF_LONG|CDF_SIGNED|CDF_UNSIGNED|CDF_COMPLEX)))[m
[31m-      break;[m
[31m-    switch (cp->tok) {[m
[31m-    case CTOK_STRUCT:[m
[31m-      tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, 0));[m
[31m-      continue;[m
[31m-    case CTOK_UNION:[m
[31m-      tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, CTF_UNION));[m
[31m-      continue;[m
[31m-    case CTOK_ENUM:[m
[31m-      tdef = cp_decl_enum(cp, decl);[m
[31m-      continue;[m
[31m-    case CTOK_IDENT:[m
[31m-      if (ctype_istypedef(cp->ct->info)) {[m
[31m-	tdef = ctype_cid(cp->ct->info);  /* Get typedef. */[m
[31m-	cp_next(cp);[m
[31m-	continue;[m
[31m-      }[m
[31m-      break;[m
[31m-    case '$':[m
[31m-      tdef = cp->val.id;[m
[31m-      cp_next(cp);[m
[31m-      continue;[m
[31m-    default:[m
[31m-      break;[m
[31m-    }[m
[31m-    break;[m
[31m-  }[m
[31m-end_decl:[m
[31m-[m
[31m-  if ((cds & CDF_COMPLEX))  /* Use predefined complex types. */[m
[31m-    tdef = sz == 4 ? CTID_COMPLEX_FLOAT : CTID_COMPLEX_DOUBLE;[m
[31m-[m
[31m-  if (tdef) {[m
[31m-    cp_push_type(decl, tdef);[m
[31m-  } else if ((cds & CDF_VOID)) {[m
[31m-    cp_push(decl, CTINFO(CT_VOID, (decl->attr & CTF_QUAL)), CTSIZE_INVALID);[m
[31m-    decl->attr &= ~CTF_QUAL;[m
[31m-  } else {[m
[31m-    /* Determine type info and size. */[m
[31m-    CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0);[m
[31m-    if ((cds & CDF_BOOL)) {[m
[31m-      if ((cds & ~(CDF_SCL|CDF_BOOL|CDF_INT|CDF_SIGNED|CDF_UNSIGNED)))[m
[31m-	cp_errmsg(cp, 0, LJ_ERR_FFI_INVTYPE);[m
[31m-      info |= CTF_BOOL;[m
[31m-      if (!(cds & CDF_SIGNED)) info |= CTF_UNSIGNED;[m
[31m-      if (!sz) {[m
[31m-	sz = 1;[m
[31m-      }[m
[31m-    } else if ((cds & CDF_FP)) {[m
[31m-      info = CTINFO(CT_NUM, CTF_FP);[m
[31m-      if ((cds & CDF_LONG)) sz = sizeof(long double);[m
[31m-    } else if ((cds & CDF_CHAR)) {[m
[31m-      if ((cds & (CDF_CHAR|CDF_SIGNED|CDF_UNSIGNED)) == CDF_CHAR)[m
[31m-	info |= CTF_UCHAR;  /* Handle platforms where char is unsigned. */[m
[31m-    } else if ((cds & CDF_SHORT)) {[m
[31m-      sz = sizeof(short);[m
[31m-    } else if ((cds & CDF_LONGLONG)) {[m
[31m-      sz = 8;[m
[31m-    } else if ((cds & CDF_LONG)) {[m
[31m-      info |= CTF_LONG;[m
[31m-      sz = sizeof(long);[m
[31m-    } else if (!sz) {[m
[31m-      if (!(cds & (CDF_SIGNED|CDF_UNSIGNED)))[m
[31m-	cp_errmsg(cp, cp->tok, LJ_ERR_FFI_DECLSPEC);[m
[31m-      sz = sizeof(int);[m
[31m-    }[m
[31m-    lua_assert(sz != 0);[m
[31m-    info += CTALIGN(lj_fls(sz));  /* Use natural alignment. */[m
[31m-    info += (decl->attr & CTF_QUAL);  /* Merge qualifiers. */[m
[31m-    cp_push(decl, info, sz);[m
[31m-    decl->attr &= ~CTF_QUAL;[m
[31m-  }[m
[31m-  decl->specpos = decl->pos;[m
[31m-  decl->specattr = decl->attr;[m
[31m-  decl->specfattr = decl->fattr;[m
[31m-  return (cds & CDF_SCL);  /* Return storage class. */[m
[31m-}[m
[31m-[m
[31m-/* Parse array declaration. */[m
[31m-static void cp_decl_array(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  CTInfo info = CTINFO(CT_ARRAY, 0);[m
[31m-  CTSize nelem = CTSIZE_INVALID;  /* Default size for a[] or a[?]. */[m
[31m-  cp_decl_attributes(cp, decl);[m
[31m-  if (cp_opt(cp, '?'))[m
[31m-    info |= CTF_VLA;  /* Create variable-length array a[?]. */[m
[31m-  else if (cp->tok != ']')[m
[31m-    nelem = cp_expr_ksize(cp);[m
[31m-  cp_check(cp, ']');[m
[31m-  cp_add(decl, info, nelem);[m
[31m-}[m
[31m-[m
[31m-/* Parse function declaration. */[m
[31m-static void cp_decl_func(CPState *cp, CPDecl *fdecl)[m
[31m-{[m
[31m-  CTSize nargs = 0;[m
[31m-  CTInfo info = CTINFO(CT_FUNC, 0);[m
[31m-  CTypeID lastid = 0, anchor = 0;[m
[31m-  if (cp->tok != ')') {[m
[31m-    do {[m
[31m-      CPDecl decl;[m
[31m-      CTypeID ctypeid, fieldid;[m
[31m-      CType *ct;[m
[31m-      if (cp_opt(cp, '.')) {  /* Vararg function. */[m
[31m-	cp_check(cp, '.');  /* Workaround for the minimalistic lexer. */[m
[31m-	cp_check(cp, '.');[m
[31m-	info |= CTF_VARARG;[m
[31m-	break;[m
[31m-      }[m
[31m-      cp_decl_spec(cp, &decl, CDF_REGISTER);[m
[31m-      decl.mode = CPARSE_MODE_DIRECT|CPARSE_MODE_ABSTRACT;[m
[31m-      cp_declarator(cp, &decl);[m
[31m-      ctypeid = cp_decl_intern(cp, &decl);[m
[31m-      ct = ctype_raw(cp->cts, ctypeid);[m
[31m-      if (ctype_isvoid(ct->info))[m
[31m-	break;[m
[31m-      else if (ctype_isrefarray(ct->info))[m
[31m-	ctypeid = lj_ctype_intern(cp->cts,[m
[31m-	  CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ct->info)), CTSIZE_PTR);[m
[31m-      else if (ctype_isfunc(ct->info))[m
[31m-	ctypeid = lj_ctype_intern(cp->cts,[m
[31m-	  CTINFO(CT_PTR, CTALIGN_PTR|ctypeid), CTSIZE_PTR);[m
[31m-      /* Add new parameter. */[m
[31m-      fieldid = lj_ctype_new(cp->cts, &ct);[m
[31m-      if (anchor)[m
[31m-	ctype_get(cp->cts, lastid)->sib = fieldid;[m
[31m-      else[m
[31m-	anchor = fieldid;[m
[31m-      lastid = fieldid;[m
[31m-      if (decl.name) ctype_setname(ct, decl.name);[m
[31m-      ct->info = CTINFO(CT_FIELD, ctypeid);[m
[31m-      ct->size = nargs++;[m
[31m-    } while (cp_opt(cp, ','));[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-  if (cp_opt(cp, '{')) {  /* Skip function definition. */[m
[31m-    int level = 1;[m
[31m-    cp->mode |= CPARSE_MODE_SKIP;[m
[31m-    for (;;) {[m
[31m-      if (cp->tok == '{') level++;[m
[31m-      else if (cp->tok == '}' && --level == 0) break;[m
[31m-      else if (cp->tok == CTOK_EOF) cp_err_token(cp, '}');[m
[31m-      cp_next(cp);[m
[31m-    }[m
[31m-    cp->mode &= ~CPARSE_MODE_SKIP;[m
[31m-    cp->tok = ';';  /* Ok for cp_decl_multi(), error in cp_decl_single(). */[m
[31m-  }[m
[31m-  info |= (fdecl->fattr & ~CTMASK_CID);[m
[31m-  fdecl->fattr = 0;[m
[31m-  fdecl->stack[cp_add(fdecl, info, nargs)].sib = anchor;[m
[31m-}[m
[31m-[m
[31m-/* Parse declarator. */[m
[31m-static void cp_declarator(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  if (++cp->depth > CPARSE_MAX_DECLDEPTH) cp_err(cp, LJ_ERR_XLEVELS);[m
[31m-[m
[31m-  for (;;) {  /* Head of declarator. */[m
[31m-    if (cp_opt(cp, '*')) {  /* Pointer. */[m
[31m-      CTSize sz;[m
[31m-      CTInfo info;[m
[31m-      cp_decl_attributes(cp, decl);[m
[31m-      sz = CTSIZE_PTR;[m
[31m-      info = CTINFO(CT_PTR, CTALIGN_PTR);[m
[31m-#if LJ_64[m
[31m-      if (ctype_msizeP(decl->attr) == 4) {[m
[31m-	sz = 4;[m
[31m-	info = CTINFO(CT_PTR, CTALIGN(2));[m
[31m-      }[m
[31m-#endif[m
[31m-      info += (decl->attr & (CTF_QUAL|CTF_REF));[m
[31m-      decl->attr &= ~(CTF_QUAL|(CTMASK_MSIZEP<<CTSHIFT_MSIZEP));[m
[31m-      cp_push(decl, info, sz);[m
[31m-    } else if (cp_opt(cp, '&') || cp_opt(cp, CTOK_ANDAND)) {  /* Reference. */[m
[31m-      decl->attr &= ~(CTF_QUAL|(CTMASK_MSIZEP<<CTSHIFT_MSIZEP));[m
[31m-      cp_push(decl, CTINFO_REF(0), CTSIZE_PTR);[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (cp_opt(cp, '(')) {  /* Inner declarator. */[m
[31m-    CPDeclIdx pos;[m
[31m-    cp_decl_attributes(cp, decl);[m
[31m-    /* Resolve ambiguity between inner declarator and 1st function parameter. */[m
[31m-    if ((decl->mode & CPARSE_MODE_ABSTRACT) &&[m
[31m-	(cp->tok == ')' || cp_istypedecl(cp))) goto func_decl;[m
[31m-    pos = decl->pos;[m
[31m-    cp_declarator(cp, decl);[m
[31m-    cp_check(cp, ')');[m
[31m-    decl->pos = pos;[m
[31m-  } else if (cp->tok == CTOK_IDENT) {  /* Direct declarator. */[m
[31m-    if (!(decl->mode & CPARSE_MODE_DIRECT)) cp_err_token(cp, CTOK_EOF);[m
[31m-    decl->name = cp->str;[m
[31m-    decl->nameid = cp->val.id;[m
[31m-    cp_next(cp);[m
[31m-  } else {  /* Abstract declarator. */[m
[31m-    if (!(decl->mode & CPARSE_MODE_ABSTRACT)) cp_err_token(cp, CTOK_IDENT);[m
[31m-  }[m
[31m-[m
[31m-  for (;;) {  /* Tail of declarator. */[m
[31m-    if (cp_opt(cp, '[')) {  /* Array. */[m
[31m-      cp_decl_array(cp, decl);[m
[31m-    } else if (cp_opt(cp, '(')) {  /* Function. */[m
[31m-    func_decl:[m
[31m-      cp_decl_func(cp, decl);[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if ((decl->mode & CPARSE_MODE_FIELD) && cp_opt(cp, ':'))  /* Field width. */[m
[31m-    decl->bits = cp_expr_ksize(cp);[m
[31m-[m
[31m-  /* Process postfix attributes. */[m
[31m-  cp_decl_attributes(cp, decl);[m
[31m-  cp_push_attributes(decl);[m
[31m-[m
[31m-  cp->depth--;[m
[31m-}[m
[31m-[m
[31m-/* Parse an abstract type declaration and return it's C type ID. */[m
[31m-static CTypeID cp_decl_abstract(CPState *cp)[m
[31m-{[m
[31m-  CPDecl decl;[m
[31m-  cp_decl_spec(cp, &decl, 0);[m
[31m-  decl.mode = CPARSE_MODE_ABSTRACT;[m
[31m-  cp_declarator(cp, &decl);[m
[31m-  return cp_decl_intern(cp, &decl);[m
[31m-}[m
[31m-[m
[31m-/* Handle pragmas. */[m
[31m-static void cp_pragma(CPState *cp, BCLine pragmaline)[m
[31m-{[m
[31m-  cp_next(cp);[m
[31m-  if (cp->tok == CTOK_IDENT &&[m
[31m-      cp->str->hash == H_(e79b999f,42ca3e85))  {  /* pack */[m
[31m-    cp_next(cp);[m
[31m-    cp_check(cp, '(');[m
[31m-    if (cp->tok == CTOK_IDENT) {[m
[31m-      if (cp->str->hash == H_(738e923c,a1b65954)) {  /* push */[m
[31m-	if (cp->curpack < CPARSE_MAX_PACKSTACK) {[m
[31m-	  cp->packstack[cp->curpack+1] = cp->packstack[cp->curpack];[m
[31m-	  cp->curpack++;[m
[31m-	}[m
[31m-      } else if (cp->str->hash == H_(6c71cf27,6c71cf27)) {  /* pop */[m
[31m-	if (cp->curpack > 0) cp->curpack--;[m
[31m-      } else {[m
[31m-	cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL);[m
[31m-      }[m
[31m-      cp_next(cp);[m
[31m-      if (!cp_opt(cp, ',')) goto end_pack;[m
[31m-    }[m
[31m-    if (cp->tok == CTOK_INTEGER) {[m
[31m-      cp->packstack[cp->curpack] = cp->val.u32 ? lj_fls(cp->val.u32) : 0;[m
[31m-      cp_next(cp);[m
[31m-    } else {[m
[31m-      cp->packstack[cp->curpack] = 255;[m
[31m-    }[m
[31m-  end_pack:[m
[31m-    cp_check(cp, ')');[m
[31m-  } else {  /* Ignore all other pragmas. */[m
[31m-    while (cp->tok != CTOK_EOF && cp->linenumber == pragmaline)[m
[31m-      cp_next(cp);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Handle line number. */[m
[31m-static void cp_line(CPState *cp, BCLine hashline)[m
[31m-{[m
[31m-  BCLine newline = cp->val.u32;[m
[31m-  /* TODO: Handle file name and include it in error messages. */[m
[31m-  while (cp->tok != CTOK_EOF && cp->linenumber == hashline)[m
[31m-    cp_next(cp);[m
[31m-  cp->linenumber = newline;[m
[31m-}[m
[31m-[m
[31m-/* Parse multiple C declarations of types or extern identifiers. */[m
[31m-static void cp_decl_multi(CPState *cp)[m
[31m-{[m
[31m-  int first = 1;[m
[31m-  while (cp->tok != CTOK_EOF) {[m
[31m-    CPDecl decl;[m
[31m-    CPscl scl;[m
[31m-    if (cp_opt(cp, ';')) {  /* Skip empty statements. */[m
[31m-      first = 0;[m
[31m-      continue;[m
[31m-    }[m
[31m-    if (cp->tok == '#') {  /* Workaround, since we have no preprocessor, yet. */[m
[31m-      BCLine hashline = cp->linenumber;[m
[31m-      CPToken tok = cp_next(cp);[m
[31m-      if (tok == CTOK_INTEGER) {[m
[31m-	cp_line(cp, hashline);[m
[31m-	continue;[m
[31m-      } else if (tok == CTOK_IDENT &&[m
[31m-		 cp->str->hash == H_(187aab88,fcb60b42)) { /* line */[m
[31m-	if (cp_next(cp) != CTOK_INTEGER) cp_err_token(cp, tok);[m
[31m-	cp_line(cp, hashline);[m
[31m-	continue;[m
[31m-      } else if (tok == CTOK_IDENT &&[m
[31m-	  cp->str->hash == H_(f5e6b4f8,1d509107)) { /* pragma */[m
[31m-	cp_pragma(cp, hashline);[m
[31m-	continue;[m
[31m-      } else {[m
[31m-	cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL);[m
[31m-      }[m
[31m-    }[m
[31m-    scl = cp_decl_spec(cp, &decl, CDF_TYPEDEF|CDF_EXTERN|CDF_STATIC);[m
[31m-    if ((cp->tok == ';' || cp->tok == CTOK_EOF) &&[m
[31m-	ctype_istypedef(decl.stack[0].info)) {[m
[31m-      CTInfo info = ctype_rawchild(cp->cts, &decl.stack[0])->info;[m
[31m-      if (ctype_isstruct(info) || ctype_isenum(info))[m
[31m-	goto decl_end;  /* Accept empty declaration of struct/union/enum. */[m
[31m-    }[m
[31m-    for (;;) {[m
[31m-      CTypeID ctypeid;[m
[31m-      cp_declarator(cp, &decl);[m
[31m-      ctypeid = cp_decl_intern(cp, &decl);[m
[31m-      if (decl.name && !decl.nameid) {  /* NYI: redeclarations are ignored. */[m
[31m-	CType *ct;[m
[31m-	CTypeID id;[m
[31m-	if ((scl & CDF_TYPEDEF)) {  /* Create new typedef. */[m
[31m-	  id = lj_ctype_new(cp->cts, &ct);[m
[31m-	  ct->info = CTINFO(CT_TYPEDEF, ctypeid);[m
[31m-	  goto noredir;[m
[31m-	} else if (ctype_isfunc(ctype_get(cp->cts, ctypeid)->info)) {[m
[31m-	  /* Treat both static and extern function declarations as extern. */[m
[31m-	  ct = ctype_get(cp->cts, ctypeid);[m
[31m-	  /* We always get new anonymous functions (typedefs are copied). */[m
[31m-	  lua_assert(gcref(ct->name) == NULL);[m
[31m-	  id = ctypeid;  /* Just name it. */[m
[31m-	} else if ((scl & CDF_STATIC)) {  /* Accept static constants. */[m
[31m-	  id = cp_decl_constinit(cp, &ct, ctypeid);[m
[31m-	  goto noredir;[m
[31m-	} else {  /* External references have extern or no storage class. */[m
[31m-	  id = lj_ctype_new(cp->cts, &ct);[m
[31m-	  ct->info = CTINFO(CT_EXTERN, ctypeid);[m
[31m-	}[m
[31m-	if (decl.redir) {  /* Add attribute for redirected symbol name. */[m
[31m-	  CType *cta;[m
[31m-	  CTypeID aid = lj_ctype_new(cp->cts, &cta);[m
[31m-	  ct = ctype_get(cp->cts, id);  /* Table may have been reallocated. */[m
[31m-	  cta->info = CTINFO(CT_ATTRIB, CTATTRIB(CTA_REDIR));[m
[31m-	  cta->sib = ct->sib;[m
[31m-	  ct->sib = aid;[m
[31m-	  ctype_setname(cta, decl.redir);[m
[31m-	}[m
[31m-      noredir:[m
[31m-	ctype_setname(ct, decl.name);[m
[31m-	lj_ctype_addname(cp->cts, ct, id);[m
[31m-      }[m
[31m-      if (!cp_opt(cp, ',')) break;[m
[31m-      cp_decl_reset(&decl);[m
[31m-    }[m
[31m-  decl_end:[m
[31m-    if (cp->tok == CTOK_EOF && first) break;  /* May omit ';' for 1 decl. */[m
[31m-    first = 0;[m
[31m-    cp_check(cp, ';');[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse a single C type declaration. */[m
[31m-static void cp_decl_single(CPState *cp)[m
[31m-{[m
[31m-  CPDecl decl;[m
[31m-  cp_decl_spec(cp, &decl, 0);[m
[31m-  cp_declarator(cp, &decl);[m
[31m-  cp->val.id = cp_decl_intern(cp, &decl);[m
[31m-  if (cp->tok != CTOK_EOF) cp_err_token(cp, CTOK_EOF);[m
[31m-}[m
[31m-[m
[31m-#undef H_[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Protected callback for C parser. */[m
[31m-static TValue *cpcparser(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  CPState *cp = (CPState *)ud;[m
[31m-  UNUSED(dummy);[m
[31m-  cframe_errfunc(L->cframe) = -1;  /* Inherit error function. */[m
[31m-  cp_init(cp);[m
[31m-  if ((cp->mode & CPARSE_MODE_MULTI))[m
[31m-    cp_decl_multi(cp);[m
[31m-  else[m
[31m-    cp_decl_single(cp);[m
[31m-  if (cp->param && cp->param != cp->L->top)[m
[31m-    cp_err(cp, LJ_ERR_FFI_NUMPARAM);[m
[31m-  lua_assert(cp->depth == 0);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* C parser. */[m
[31m-int lj_cparse(CPState *cp)[m
[31m-{[m
[31m-  LJ_CTYPE_SAVE(cp->cts);[m
[31m-  int errcode = lj_vm_cpcall(cp->L, NULL, cp, cpcparser);[m
[31m-  if (errcode)[m
[31m-    LJ_CTYPE_RESTORE(cp->cts);[m
[31m-  cp_cleanup(cp);[m
[31m-  return errcode;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.h[m
[1mdeleted file mode 100644[m
[1mindex bfd1a9b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_cparse.h[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-/*[m
[31m-** C declaration parser.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CPARSE_H[m
[31m-#define _LJ_CPARSE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* C parser limits. */[m
[31m-#define CPARSE_MAX_BUF		32768	/* Max. token buffer size. */[m
[31m-#define CPARSE_MAX_DECLSTACK	100	/* Max. declaration stack depth. */[m
[31m-#define CPARSE_MAX_DECLDEPTH	20	/* Max. recursive declaration depth. */[m
[31m-#define CPARSE_MAX_PACKSTACK	7	/* Max. pack pragma stack depth. */[m
[31m-[m
[31m-/* Flags for C parser mode. */[m
[31m-#define CPARSE_MODE_MULTI	1	/* Process multiple declarations. */[m
[31m-#define CPARSE_MODE_ABSTRACT	2	/* Accept abstract declarators. */[m
[31m-#define CPARSE_MODE_DIRECT	4	/* Accept direct declarators. */[m
[31m-#define CPARSE_MODE_FIELD	8	/* Accept field width in bits, too. */[m
[31m-#define CPARSE_MODE_NOIMPLICIT	16	/* Reject implicit declarations. */[m
[31m-#define CPARSE_MODE_SKIP	32	/* Skip definitions, ignore errors. */[m
[31m-[m
[31m-typedef int CPChar;	/* C parser character. Unsigned ext. from char. */[m
[31m-typedef int CPToken;	/* C parser token. */[m
[31m-[m
[31m-/* C parser internal value representation. */[m
[31m-typedef struct CPValue {[m
[31m-  union {[m
[31m-    int32_t i32;	/* Value for CTID_INT32. */[m
[31m-    uint32_t u32;	/* Value for CTID_UINT32. */[m
[31m-  };[m
[31m-  CTypeID id;		/* C Type ID of the value. */[m
[31m-} CPValue;[m
[31m-[m
[31m-/* C parser state. */[m
[31m-typedef struct CPState {[m
[31m-  CPChar c;		/* Current character. */[m
[31m-  CPToken tok;		/* Current token. */[m
[31m-  CPValue val;		/* Token value. */[m
[31m-  GCstr *str;		/* Interned string of identifier/keyword. */[m
[31m-  CType *ct;		/* C type table entry. */[m
[31m-  const char *p;	/* Current position in input buffer. */[m
[31m-  SBuf sb;		/* String buffer for tokens. */[m
[31m-  lua_State *L;		/* Lua state. */[m
[31m-  CTState *cts;		/* C type state. */[m
[31m-  TValue *param;	/* C type parameters. */[m
[31m-  const char *srcname;	/* Current source name. */[m
[31m-  BCLine linenumber;	/* Input line counter. */[m
[31m-  int depth;		/* Recursive declaration depth. */[m
[31m-  uint32_t tmask;	/* Type mask for next identifier. */[m
[31m-  uint32_t mode;	/* C parser mode. */[m
[31m-  uint8_t packstack[CPARSE_MAX_PACKSTACK];  /* Stack for pack pragmas. */[m
[31m-  uint8_t curpack;	/* Current position in pack pragma stack. */[m
[31m-} CPState;[m
[31m-[m
[31m-LJ_FUNC int lj_cparse(CPState *cp);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.c[m
[1mdeleted file mode 100644[m
[1mindex c0f7e3d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.c[m
[1m+++ /dev/null[m
[36m@@ -1,1834 +0,0 @@[m
[31m-/*[m
[31m-** Trace recorder for C data operations.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_ffrecord_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT && LJ_HASFFI[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_cparse.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_carith.h"[m
[31m-#include "lj_clib.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_record.h"[m
[31m-#include "lj_ffrecord.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_crecord.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-#define emitconv(a, dt, st, flags) \[m
[31m-  emitir(IRT(IR_CONV, (dt)), (a), (st)|((dt) << 5)|(flags))[m
[31m-[m
[31m-/* -- C type checks ------------------------------------------------------- */[m
[31m-[m
[31m-static GCcdata *argv2cdata(jit_State *J, TRef tr, cTValue *o)[m
[31m-{[m
[31m-  GCcdata *cd;[m
[31m-  TRef trtypeid;[m
[31m-  if (!tref_iscdata(tr))[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  cd = cdataV(o);[m
[31m-  /* Specialize to the CTypeID. */[m
[31m-  trtypeid = emitir(IRT(IR_FLOAD, IRT_U16), tr, IRFL_CDATA_CTYPEID);[m
[31m-  emitir(IRTG(IR_EQ, IRT_INT), trtypeid, lj_ir_kint(J, (int32_t)cd->ctypeid));[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-/* Specialize to the CTypeID held by a cdata constructor. */[m
[31m-static CTypeID crec_constructor(jit_State *J, GCcdata *cd, TRef tr)[m
[31m-{[m
[31m-  CTypeID id;[m
[31m-  lua_assert(tref_iscdata(tr) && cd->ctypeid == CTID_CTYPEID);[m
[31m-  id = *(CTypeID *)cdataptr(cd);[m
[31m-  tr = emitir(IRT(IR_FLOAD, IRT_INT), tr, IRFL_CDATA_INT);[m
[31m-  emitir(IRTG(IR_EQ, IRT_INT), tr, lj_ir_kint(J, (int32_t)id));[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-static CTypeID argv2ctype(jit_State *J, TRef tr, cTValue *o)[m
[31m-{[m
[31m-  if (tref_isstr(tr)) {[m
[31m-    GCstr *s = strV(o);[m
[31m-    CPState cp;[m
[31m-    CTypeID oldtop;[m
[31m-    /* Specialize to the string containing the C type declaration. */[m
[31m-    emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, s));[m
[31m-    cp.L = J->L;[m
[31m-    cp.cts = ctype_ctsG(J2G(J));[m
[31m-    oldtop = cp.cts->top;[m
[31m-    cp.srcname = strdata(s);[m
[31m-    cp.p = strdata(s);[m
[31m-    cp.param = NULL;[m
[31m-    cp.mode = CPARSE_MODE_ABSTRACT|CPARSE_MODE_NOIMPLICIT;[m
[31m-    if (lj_cparse(&cp) || cp.cts->top > oldtop)  /* Avoid new struct defs. */[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    return cp.val.id;[m
[31m-  } else {[m
[31m-    GCcdata *cd = argv2cdata(J, tr, o);[m
[31m-    return cd->ctypeid == CTID_CTYPEID ? crec_constructor(J, cd, tr) :[m
[31m-					cd->ctypeid;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Convert CType to IRType (if possible). */[m
[31m-static IRType crec_ct2irt(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-  if (LJ_LIKELY(ctype_isnum(ct->info))) {[m
[31m-    if ((ct->info & CTF_FP)) {[m
[31m-      if (ct->size == sizeof(double))[m
[31m-	return IRT_NUM;[m
[31m-      else if (ct->size == sizeof(float))[m
[31m-	return IRT_FLOAT;[m
[31m-    } else {[m
[31m-      uint32_t b = lj_fls(ct->size);[m
[31m-      if (b <= 3)[m
[31m-	return IRT_I8 + 2*b + ((ct->info & CTF_UNSIGNED) ? 1 : 0);[m
[31m-    }[m
[31m-  } else if (ctype_isptr(ct->info)) {[m
[31m-    return (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32;[m
[31m-  } else if (ctype_iscomplex(ct->info)) {[m
[31m-    if (ct->size == 2*sizeof(double))[m
[31m-      return IRT_NUM;[m
[31m-    else if (ct->size == 2*sizeof(float))[m
[31m-      return IRT_FLOAT;[m
[31m-  }[m
[31m-  return IRT_CDATA;[m
[31m-}[m
[31m-[m
[31m-/* -- Optimized memory fill and copy -------------------------------------- */[m
[31m-[m
[31m-/* Maximum length and unroll of inlined copy/fill. */[m
[31m-#define CREC_COPY_MAXUNROLL		16[m
[31m-#define CREC_COPY_MAXLEN		128[m
[31m-[m
[31m-#define CREC_FILL_MAXUNROLL		16[m
[31m-[m
[31m-/* Number of windowed registers used for optimized memory copy. */[m
[31m-#if LJ_TARGET_X86[m
[31m-#define CREC_COPY_REGWIN		2[m
[31m-#elif LJ_TARGET_PPC || LJ_TARGET_MIPS[m
[31m-#define CREC_COPY_REGWIN		8[m
[31m-#else[m
[31m-#define CREC_COPY_REGWIN		4[m
[31m-#endif[m
[31m-[m
[31m-/* List of memory offsets for copy/fill. */[m
[31m-typedef struct CRecMemList {[m
[31m-  CTSize ofs;		/* Offset in bytes. */[m
[31m-  IRType tp;		/* Type of load/store. */[m
[31m-  TRef trofs;		/* TRef of interned offset. */[m
[31m-  TRef trval;		/* TRef of load value. */[m
[31m-} CRecMemList;[m
[31m-[m
[31m-/* Generate copy list for element-wise struct copy. */[m
[31m-static MSize crec_copy_struct(CRecMemList *ml, CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTypeID fid = ct->sib;[m
[31m-  MSize mlp = 0;[m
[31m-  while (fid) {[m
[31m-    CType *df = ctype_get(cts, fid);[m
[31m-    fid = df->sib;[m
[31m-    if (ctype_isfield(df->info)) {[m
[31m-      CType *cct;[m
[31m-      IRType tp;[m
[31m-      if (!gcref(df->name)) continue;  /* Ignore unnamed fields. */[m
[31m-      cct = ctype_rawchild(cts, df);  /* Field type. */[m
[31m-      tp = crec_ct2irt(cts, cct);[m
[31m-      if (tp == IRT_CDATA) return 0;  /* NYI: aggregates. */[m
[31m-      if (mlp >= CREC_COPY_MAXUNROLL) return 0;[m
[31m-      ml[mlp].ofs = df->size;[m
[31m-      ml[mlp].tp = tp;[m
[31m-      mlp++;[m
[31m-      if (ctype_iscomplex(cct->info)) {[m
[31m-	if (mlp >= CREC_COPY_MAXUNROLL) return 0;[m
[31m-	ml[mlp].ofs = df->size + (cct->size >> 1);[m
[31m-	ml[mlp].tp = tp;[m
[31m-	mlp++;[m
[31m-      }[m
[31m-    } else if (!ctype_isconstval(df->info)) {[m
[31m-      /* NYI: bitfields and sub-structures. */[m
[31m-      return 0;[m
[31m-    }[m
[31m-  }[m
[31m-  return mlp;[m
[31m-}[m
[31m-[m
[31m-/* Generate unrolled copy list, from highest to lowest step size/alignment. */[m
[31m-static MSize crec_copy_unroll(CRecMemList *ml, CTSize len, CTSize step,[m
[31m-			      IRType tp)[m
[31m-{[m
[31m-  CTSize ofs = 0;[m
[31m-  MSize mlp = 0;[m
[31m-  if (tp == IRT_CDATA) tp = IRT_U8 + 2*lj_fls(step);[m
[31m-  do {[m
[31m-    while (ofs + step <= len) {[m
[31m-      if (mlp >= CREC_COPY_MAXUNROLL) return 0;[m
[31m-      ml[mlp].ofs = ofs;[m
[31m-      ml[mlp].tp = tp;[m
[31m-      mlp++;[m
[31m-      ofs += step;[m
[31m-    }[m
[31m-    step >>= 1;[m
[31m-    tp -= 2;[m
[31m-  } while (ofs < len);[m
[31m-  return mlp;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** Emit copy list with windowed loads/stores.[m
[31m-** LJ_TARGET_UNALIGNED: may emit unaligned loads/stores (not marked as such).[m
[31m-*/[m
[31m-static void crec_copy_emit(jit_State *J, CRecMemList *ml, MSize mlp,[m
[31m-			   TRef trdst, TRef trsrc)[m
[31m-{[m
[31m-  MSize i, j, rwin = 0;[m
[31m-  for (i = 0, j = 0; i < mlp; ) {[m
[31m-    TRef trofs = lj_ir_kintp(J, ml[i].ofs);[m
[31m-    TRef trsptr = emitir(IRT(IR_ADD, IRT_PTR), trsrc, trofs);[m
[31m-    ml[i].trval = emitir(IRT(IR_XLOAD, ml[i].tp), trsptr, 0);[m
[31m-    ml[i].trofs = trofs;[m
[31m-    i++;[m
[31m-    rwin += (LJ_SOFTFP && ml[i].tp == IRT_NUM) ? 2 : 1;[m
[31m-    if (rwin >= CREC_COPY_REGWIN || i >= mlp) {  /* Flush buffered stores. */[m
[31m-      rwin = 0;[m
[31m-      for ( ; j < i; j++) {[m
[31m-	TRef trdptr = emitir(IRT(IR_ADD, IRT_PTR), trdst, ml[j].trofs);[m
[31m-	emitir(IRT(IR_XSTORE, ml[j].tp), trdptr, ml[j].trval);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Optimized memory copy. */[m
[31m-static void crec_copy(jit_State *J, TRef trdst, TRef trsrc, TRef trlen,[m
[31m-		      CType *ct)[m
[31m-{[m
[31m-  if (tref_isk(trlen)) {  /* Length must be constant. */[m
[31m-    CRecMemList ml[CREC_COPY_MAXUNROLL];[m
[31m-    MSize mlp = 0;[m
[31m-    CTSize step = 1, len = (CTSize)IR(tref_ref(trlen))->i;[m
[31m-    IRType tp = IRT_CDATA;[m
[31m-    int needxbar = 0;[m
[31m-    if (len == 0) return;  /* Shortcut. */[m
[31m-    if (len > CREC_COPY_MAXLEN) goto fallback;[m
[31m-    if (ct) {[m
[31m-      CTState *cts = ctype_ctsG(J2G(J));[m
[31m-      lua_assert(ctype_isarray(ct->info) || ctype_isstruct(ct->info));[m
[31m-      if (ctype_isarray(ct->info)) {[m
[31m-	CType *cct = ctype_rawchild(cts, ct);[m
[31m-	tp = crec_ct2irt(cts, cct);[m
[31m-	if (tp == IRT_CDATA) goto rawcopy;[m
[31m-	step = lj_ir_type_size[tp];[m
[31m-	lua_assert((len & (step-1)) == 0);[m
[31m-      } else if ((ct->info & CTF_UNION)) {[m
[31m-	step = (1u << ctype_align(ct->info));[m
[31m-	goto rawcopy;[m
[31m-      } else {[m
[31m-	mlp = crec_copy_struct(ml, cts, ct);[m
[31m-	goto emitcopy;[m
[31m-      }[m
[31m-    } else {[m
[31m-    rawcopy:[m
[31m-      needxbar = 1;[m
[31m-      if (LJ_TARGET_UNALIGNED || step >= CTSIZE_PTR)[m
[31m-	step = CTSIZE_PTR;[m
[31m-    }[m
[31m-    mlp = crec_copy_unroll(ml, len, step, tp);[m
[31m-  emitcopy:[m
[31m-    if (mlp) {[m
[31m-      crec_copy_emit(J, ml, mlp, trdst, trsrc);[m
[31m-      if (needxbar)[m
[31m-	emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-fallback:[m
[31m-  /* Call memcpy. Always needs a barrier to disable alias analysis. */[m
[31m-  lj_ir_call(J, IRCALL_memcpy, trdst, trsrc, trlen);[m
[31m-  emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);[m
[31m-}[m
[31m-[m
[31m-/* Generate unrolled fill list, from highest to lowest step size/alignment. */[m
[31m-static MSize crec_fill_unroll(CRecMemList *ml, CTSize len, CTSize step)[m
[31m-{[m
[31m-  CTSize ofs = 0;[m
[31m-  MSize mlp = 0;[m
[31m-  IRType tp = IRT_U8 + 2*lj_fls(step);[m
[31m-  do {[m
[31m-    while (ofs + step <= len) {[m
[31m-      if (mlp >= CREC_COPY_MAXUNROLL) return 0;[m
[31m-      ml[mlp].ofs = ofs;[m
[31m-      ml[mlp].tp = tp;[m
[31m-      mlp++;[m
[31m-      ofs += step;[m
[31m-    }[m
[31m-    step >>= 1;[m
[31m-    tp -= 2;[m
[31m-  } while (ofs < len);[m
[31m-  return mlp;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** Emit stores for fill list.[m
[31m-** LJ_TARGET_UNALIGNED: may emit unaligned stores (not marked as such).[m
[31m-*/[m
[31m-static void crec_fill_emit(jit_State *J, CRecMemList *ml, MSize mlp,[m
[31m-			   TRef trdst, TRef trfill)[m
[31m-{[m
[31m-  MSize i;[m
[31m-  for (i = 0; i < mlp; i++) {[m
[31m-    TRef trofs = lj_ir_kintp(J, ml[i].ofs);[m
[31m-    TRef trdptr = emitir(IRT(IR_ADD, IRT_PTR), trdst, trofs);[m
[31m-    emitir(IRT(IR_XSTORE, ml[i].tp), trdptr, trfill);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Optimized memory fill. */[m
[31m-static void crec_fill(jit_State *J, TRef trdst, TRef trlen, TRef trfill,[m
[31m-		      CTSize step)[m
[31m-{[m
[31m-  if (tref_isk(trlen)) {  /* Length must be constant. */[m
[31m-    CRecMemList ml[CREC_FILL_MAXUNROLL];[m
[31m-    MSize mlp;[m
[31m-    CTSize len = (CTSize)IR(tref_ref(trlen))->i;[m
[31m-    if (len == 0) return;  /* Shortcut. */[m
[31m-    if (LJ_TARGET_UNALIGNED || step >= CTSIZE_PTR)[m
[31m-      step = CTSIZE_PTR;[m
[31m-    if (step * CREC_FILL_MAXUNROLL < len) goto fallback;[m
[31m-    mlp = crec_fill_unroll(ml, len, step);[m
[31m-    if (!mlp) goto fallback;[m
[31m-    if (tref_isk(trfill) || ml[0].tp != IRT_U8)[m
[31m-      trfill = emitconv(trfill, IRT_INT, IRT_U8, 0);[m
[31m-    if (ml[0].tp != IRT_U8) {  /* Scatter U8 to U16/U32/U64. */[m
[31m-      if (CTSIZE_PTR == 8 && ml[0].tp == IRT_U64) {[m
[31m-	if (tref_isk(trfill))  /* Pointless on x64 with zero-extended regs. */[m
[31m-	  trfill = emitconv(trfill, IRT_U64, IRT_U32, 0);[m
[31m-	trfill = emitir(IRT(IR_MUL, IRT_U64), trfill,[m
[31m-			lj_ir_kint64(J, U64x(01010101,01010101)));[m
[31m-      } else {[m
[31m-	trfill = emitir(IRTI(IR_MUL), trfill,[m
[31m-		   lj_ir_kint(J, ml[0].tp == IRT_U16 ? 0x0101 : 0x01010101));[m
[31m-      }[m
[31m-    }[m
[31m-    crec_fill_emit(J, ml, mlp, trdst, trfill);[m
[31m-  } else {[m
[31m-fallback:[m
[31m-    /* Call memset. Always needs a barrier to disable alias analysis. */[m
[31m-    lj_ir_call(J, IRCALL_memset, trdst, trfill, trlen);  /* Note: arg order! */[m
[31m-  }[m
[31m-  emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);[m
[31m-}[m
[31m-[m
[31m-/* -- Convert C type to C type -------------------------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** This code mirrors the code in lj_cconv.c. It performs the same steps[m
[31m-** for the trace recorder that lj_cconv.c does for the interpreter.[m
[31m-**[m
[31m-** One major difference is that we can get away with much fewer checks[m
[31m-** here. E.g. checks for casts, constness or correct types can often be[m
[31m-** omitted, even if they might fail. The interpreter subsequently throws[m
[31m-** an error, which aborts the trace.[m
[31m-**[m
[31m-** All operations are specialized to their C types, so the on-trace[m
[31m-** outcome must be the same as the outcome in the interpreter. If the[m
[31m-** interpreter doesn't throw an error, then the trace is correct, too.[m
[31m-** Care must be taken not to generate invalid (temporary) IR or to[m
[31m-** trigger asserts.[m
[31m-*/[m
[31m-[m
[31m-/* Determine whether a passed number or cdata number is non-zero. */[m
[31m-static int crec_isnonzero(CType *s, void *p)[m
[31m-{[m
[31m-  if (p == (void *)0)[m
[31m-    return 0;[m
[31m-  if (p == (void *)1)[m
[31m-    return 1;[m
[31m-  if ((s->info & CTF_FP)) {[m
[31m-    if (s->size == sizeof(float))[m
[31m-      return (*(float *)p != 0);[m
[31m-    else[m
[31m-      return (*(double *)p != 0);[m
[31m-  } else {[m
[31m-    if (s->size == 1)[m
[31m-      return (*(uint8_t *)p != 0);[m
[31m-    else if (s->size == 2)[m
[31m-      return (*(uint16_t *)p != 0);[m
[31m-    else if (s->size == 4)[m
[31m-      return (*(uint32_t *)p != 0);[m
[31m-    else[m
[31m-      return (*(uint64_t *)p != 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static TRef crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp,[m
[31m-		       void *svisnz)[m
[31m-{[m
[31m-  IRType dt = crec_ct2irt(ctype_ctsG(J2G(J)), d);[m
[31m-  IRType st = crec_ct2irt(ctype_ctsG(J2G(J)), s);[m
[31m-  CTSize dsize = d->size, ssize = s->size;[m
[31m-  CTInfo dinfo = d->info, sinfo = s->info;[m
[31m-[m
[31m-  if (ctype_type(dinfo) > CT_MAYCONVERT || ctype_type(sinfo) > CT_MAYCONVERT)[m
[31m-    goto err_conv;[m
[31m-[m
[31m-  /*[m
[31m-  ** Note: Unlike lj_cconv_ct_ct(), sp holds the _value_ of pointers and[m
[31m-  ** numbers up to 8 bytes. Otherwise sp holds a pointer.[m
[31m-  */[m
[31m-[m
[31m-  switch (cconv_idx2(dinfo, sinfo)) {[m
[31m-  /* Destination is a bool. */[m
[31m-  case CCX(B, B):[m
[31m-    goto xstore;  /* Source operand is already normalized. */[m
[31m-  case CCX(B, I):[m
[31m-  case CCX(B, F):[m
[31m-    if (st != IRT_CDATA) {[m
[31m-      /* Specialize to the result of a comparison against 0. */[m
[31m-      TRef zero = (st == IRT_NUM  || st == IRT_FLOAT) ? lj_ir_knum(J, 0) :[m
[31m-		  (st == IRT_I64 || st == IRT_U64) ? lj_ir_kint64(J, 0) :[m
[31m-		  lj_ir_kint(J, 0);[m
[31m-      int isnz = crec_isnonzero(s, svisnz);[m
[31m-      emitir(IRTG(isnz ? IR_NE : IR_EQ, st), sp, zero);[m
[31m-      sp = lj_ir_kint(J, isnz);[m
[31m-      goto xstore;[m
[31m-    }[m
[31m-    goto err_nyi;[m
[31m-[m
[31m-  /* Destination is an integer. */[m
[31m-  case CCX(I, B):[m
[31m-  case CCX(I, I):[m
[31m-  conv_I_I:[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    /* Extend 32 to 64 bit integer. */[m
[31m-    if (dsize == 8 && ssize < 8 && !(LJ_64 && (sinfo & CTF_UNSIGNED)))[m
[31m-      sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st,[m
[31m-		    (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT);[m
[31m-    else if (dsize < 8 && ssize == 8)  /* Truncate from 64 bit integer. */[m
[31m-      sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0);[m
[31m-    else if (st == IRT_INT)[m
[31m-      sp = lj_opt_narrow_toint(J, sp);[m
[31m-  xstore:[m
[31m-    if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J);[m
[31m-    if (dp == 0) return sp;[m
[31m-    emitir(IRT(IR_XSTORE, dt), dp, sp);[m
[31m-    break;[m
[31m-  case CCX(I, C):[m
[31m-    sp = emitir(IRT(IR_XLOAD, st), sp, 0);  /* Load re. */[m
[31m-    /* fallthrough */[m
[31m-  case CCX(I, F):[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, IRCONV_ANY);[m
[31m-    goto xstore;[m
[31m-  case CCX(I, P):[m
[31m-  case CCX(I, A):[m
[31m-    sinfo = CTINFO(CT_NUM, CTF_UNSIGNED);[m
[31m-    ssize = CTSIZE_PTR;[m
[31m-    st = IRT_UINTP;[m
[31m-    if (((dsize ^ ssize) & 8) == 0) {  /* Must insert no-op type conversion. */[m
[31m-      sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, IRT_PTR, 0);[m
[31m-      goto xstore;[m
[31m-    }[m
[31m-    goto conv_I_I;[m
[31m-[m
[31m-  /* Destination is a floating-point number. */[m
[31m-  case CCX(F, B):[m
[31m-  case CCX(F, I):[m
[31m-  conv_F_I:[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st, 0);[m
[31m-    goto xstore;[m
[31m-  case CCX(F, C):[m
[31m-    sp = emitir(IRT(IR_XLOAD, st), sp, 0);  /* Load re. */[m
[31m-    /* fallthrough */[m
[31m-  case CCX(F, F):[m
[31m-  conv_F_F:[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    if (dt != st) sp = emitconv(sp, dt, st, 0);[m
[31m-    goto xstore;[m
[31m-[m
[31m-  /* Destination is a complex number. */[m
[31m-  case CCX(C, I):[m
[31m-  case CCX(C, F):[m
[31m-    {  /* Clear im. */[m
[31m-      TRef ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, (dsize >> 1)));[m
[31m-      emitir(IRT(IR_XSTORE, dt), ptr, lj_ir_knum(J, 0));[m
[31m-    }[m
[31m-    /* Convert to re. */[m
[31m-    if ((sinfo & CTF_FP)) goto conv_F_F; else goto conv_F_I;[m
[31m-[m
[31m-  case CCX(C, C):[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    {[m
[31m-      TRef re, im, ptr;[m
[31m-      re = emitir(IRT(IR_XLOAD, st), sp, 0);[m
[31m-      ptr = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, (ssize >> 1)));[m
[31m-      im = emitir(IRT(IR_XLOAD, st), ptr, 0);[m
[31m-      if (dt != st) {[m
[31m-	re = emitconv(re, dt, st, 0);[m
[31m-	im = emitconv(im, dt, st, 0);[m
[31m-      }[m
[31m-      emitir(IRT(IR_XSTORE, dt), dp, re);[m
[31m-      ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, (dsize >> 1)));[m
[31m-      emitir(IRT(IR_XSTORE, dt), ptr, im);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* Destination is a vector. */[m
[31m-  case CCX(V, I):[m
[31m-  case CCX(V, F):[m
[31m-  case CCX(V, C):[m
[31m-  case CCX(V, V):[m
[31m-    goto err_nyi;[m
[31m-[m
[31m-  /* Destination is a pointer. */[m
[31m-  case CCX(P, P):[m
[31m-  case CCX(P, A):[m
[31m-  case CCX(P, S):[m
[31m-    /* There are only 32 bit pointers/addresses on 32 bit machines.[m
[31m-    ** Also ok on x64, since all 32 bit ops clear the upper part of the reg.[m
[31m-    */[m
[31m-    goto xstore;[m
[31m-  case CCX(P, I):[m
[31m-    if (st == IRT_CDATA) goto err_nyi;[m
[31m-    if (!LJ_64 && ssize == 8)  /* Truncate from 64 bit integer. */[m
[31m-      sp = emitconv(sp, IRT_U32, st, 0);[m
[31m-    goto xstore;[m
[31m-  case CCX(P, F):[m
[31m-    if (st == IRT_CDATA) goto err_nyi;[m
[31m-    /* The signed conversion is cheaper. x64 really has 47 bit pointers. */[m
[31m-    sp = emitconv(sp, (LJ_64 && dsize == 8) ? IRT_I64 : IRT_U32,[m
[31m-		  st, IRCONV_ANY);[m
[31m-    goto xstore;[m
[31m-[m
[31m-  /* Destination is an array. */[m
[31m-  case CCX(A, A):[m
[31m-  /* Destination is a struct/union. */[m
[31m-  case CCX(S, S):[m
[31m-    if (dp == 0) goto err_conv;[m
[31m-    crec_copy(J, dp, sp, lj_ir_kint(J, dsize), d);[m
[31m-    break;[m
[31m-[m
[31m-  default:[m
[31m-  err_conv:[m
[31m-  err_nyi:[m
[31m-    lj_trace_err(J, LJ_TRERR_NYICONV);[m
[31m-    break;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Convert C type to TValue (load) ------------------------------------- */[m
[31m-[m
[31m-static TRef crec_tv_ct(jit_State *J, CType *s, CTypeID sid, TRef sp)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  IRType t = crec_ct2irt(cts, s);[m
[31m-  CTInfo sinfo = s->info;[m
[31m-  if (ctype_isnum(sinfo)) {[m
[31m-    TRef tr;[m
[31m-    if (t == IRT_CDATA)[m
[31m-      goto err_nyi;  /* NYI: copyval of >64 bit integers. */[m
[31m-    tr = emitir(IRT(IR_XLOAD, t), sp, 0);[m
[31m-    if (t == IRT_FLOAT || t == IRT_U32) {  /* Keep uint32_t/float as numbers. */[m
[31m-      return emitconv(tr, IRT_NUM, t, 0);[m
[31m-    } else if (t == IRT_I64 || t == IRT_U64) {  /* Box 64 bit integer. */[m
[31m-      sp = tr;[m
[31m-      lj_needsplit(J);[m
[31m-    } else if ((sinfo & CTF_BOOL)) {[m
[31m-      /* Assume not equal to zero. Fixup and emit pending guard later. */[m
[31m-      lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0));[m
[31m-      J->postproc = LJ_POST_FIXGUARD;[m
[31m-      return TREF_TRUE;[m
[31m-    } else {[m
[31m-      return tr;[m
[31m-    }[m
[31m-  } else if (ctype_isptr(sinfo) || ctype_isenum(sinfo)) {[m
[31m-    sp = emitir(IRT(IR_XLOAD, t), sp, 0);  /* Box pointers and enums. */[m
[31m-  } else if (ctype_isrefarray(sinfo) || ctype_isstruct(sinfo)) {[m
[31m-    cts->L = J->L;[m
[31m-    sid = lj_ctype_intern(cts, CTINFO_REF(sid), CTSIZE_PTR);  /* Create ref. */[m
[31m-  } else if (ctype_iscomplex(sinfo)) {  /* Unbox/box complex. */[m
[31m-    ptrdiff_t esz = (ptrdiff_t)(s->size >> 1);[m
[31m-    TRef ptr, tr1, tr2, dp;[m
[31m-    dp = emitir(IRTG(IR_CNEW, IRT_CDATA), lj_ir_kint(J, sid), TREF_NIL);[m
[31m-    tr1 = emitir(IRT(IR_XLOAD, t), sp, 0);[m
[31m-    ptr = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, esz));[m
[31m-    tr2 = emitir(IRT(IR_XLOAD, t), ptr, 0);[m
[31m-    ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-    emitir(IRT(IR_XSTORE, t), ptr, tr1);[m
[31m-    ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, sizeof(GCcdata)+esz));[m
[31m-    emitir(IRT(IR_XSTORE, t), ptr, tr2);[m
[31m-    return dp;[m
[31m-  } else {[m
[31m-    /* NYI: copyval of vectors. */[m
[31m-  err_nyi:[m
[31m-    lj_trace_err(J, LJ_TRERR_NYICONV);[m
[31m-  }[m
[31m-  /* Box pointer, ref, enum or 64 bit integer. */[m
[31m-  return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, sid), sp);[m
[31m-}[m
[31m-[m
[31m-/* -- Convert TValue to C type (store) ------------------------------------ */[m
[31m-[m
[31m-static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID sid = CTID_P_VOID;[m
[31m-  void *svisnz = 0;[m
[31m-  CType *s;[m
[31m-  if (LJ_LIKELY(tref_isinteger(sp))) {[m
[31m-    sid = CTID_INT32;[m
[31m-    svisnz = (void *)(intptr_t)(tvisint(sval)?(intV(sval)!=0):!tviszero(sval));[m
[31m-  } else if (tref_isnum(sp)) {[m
[31m-    sid = CTID_DOUBLE;[m
[31m-    svisnz = (void *)(intptr_t)(tvisint(sval)?(intV(sval)!=0):!tviszero(sval));[m
[31m-  } else if (tref_isbool(sp)) {[m
[31m-    sp = lj_ir_kint(J, tref_istrue(sp) ? 1 : 0);[m
[31m-    sid = CTID_BOOL;[m
[31m-  } else if (tref_isnil(sp)) {[m
[31m-    sp = lj_ir_kptr(J, NULL);[m
[31m-  } else if (tref_isudata(sp)) {[m
[31m-    GCudata *ud = udataV(sval);[m
[31m-    if (ud->udtype == UDTYPE_IO_FILE) {[m
[31m-      TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), sp, IRFL_UDATA_UDTYPE);[m
[31m-      emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE));[m
[31m-      sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_UDATA_FILE);[m
[31m-    } else {[m
[31m-      sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCudata)));[m
[31m-    }[m
[31m-  } else if (tref_isstr(sp)) {[m
[31m-    if (ctype_isenum(d->info)) {  /* Match string against enum constant. */[m
[31m-      GCstr *str = strV(sval);[m
[31m-      CTSize ofs;[m
[31m-      CType *cct = lj_ctype_getfield(cts, d, str, &ofs);[m
[31m-      /* Specialize to the name of the enum constant. */[m
[31m-      emitir(IRTG(IR_EQ, IRT_STR), sp, lj_ir_kstr(J, str));[m
[31m-      if (cct && ctype_isconstval(cct->info)) {[m
[31m-	lua_assert(ctype_child(cts, cct)->size == 4);[m
[31m-	svisnz = (void *)(intptr_t)(ofs != 0);[m
[31m-	sp = lj_ir_kint(J, (int32_t)ofs);[m
[31m-	sid = ctype_cid(cct->info);[m
[31m-      }  /* else: interpreter will throw. */[m
[31m-    } else if (ctype_isrefarray(d->info)) {  /* Copy string to array. */[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);  /* NYI */[m
[31m-    } else {  /* Otherwise pass the string data as a const char[]. */[m
[31m-      /* Don't use STRREF. It folds with SNEW, which loses the trailing NUL. */[m
[31m-      sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCstr)));[m
[31m-      sid = CTID_A_CCHAR;[m
[31m-    }[m
[31m-  } else if (tref_islightud(sp)) {[m
[31m-#if LJ_64[m
[31m-    sp = emitir(IRT(IR_BAND, IRT_P64), sp,[m
[31m-		lj_ir_kint64(J, U64x(00007fff,ffffffff)));[m
[31m-#endif[m
[31m-  } else {  /* NYI: tref_istab(sp). */[m
[31m-    IRType t;[m
[31m-    sid = argv2cdata(J, sp, sval)->ctypeid;[m
[31m-    s = ctype_raw(cts, sid);[m
[31m-    svisnz = cdataptr(cdataV(sval));[m
[31m-    if (ctype_isfunc(s->info)) {[m
[31m-      sid = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|sid), CTSIZE_PTR);[m
[31m-      s = ctype_get(cts, sid);[m
[31m-      t = IRT_PTR;[m
[31m-    } else {[m
[31m-      t = crec_ct2irt(cts, s);[m
[31m-    }[m
[31m-    if (ctype_isptr(s->info)) {[m
[31m-      sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_PTR);[m
[31m-      if (ctype_isref(s->info)) {[m
[31m-	svisnz = *(void **)svisnz;[m
[31m-	s = ctype_rawchild(cts, s);[m
[31m-	if (ctype_isenum(s->info)) s = ctype_child(cts, s);[m
[31m-	t = crec_ct2irt(cts, s);[m
[31m-      } else {[m
[31m-	goto doconv;[m
[31m-      }[m
[31m-    } else if (t == IRT_I64 || t == IRT_U64) {[m
[31m-      sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT64);[m
[31m-      lj_needsplit(J);[m
[31m-      goto doconv;[m
[31m-    } else if (t == IRT_INT || t == IRT_U32) {[m
[31m-      if (ctype_isenum(s->info)) s = ctype_child(cts, s);[m
[31m-      sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT);[m
[31m-      goto doconv;[m
[31m-    } else {[m
[31m-      sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-    }[m
[31m-    if (ctype_isnum(s->info) && t != IRT_CDATA)[m
[31m-      sp = emitir(IRT(IR_XLOAD, t), sp, 0);  /* Load number value. */[m
[31m-    goto doconv;[m
[31m-  }[m
[31m-  s = ctype_get(cts, sid);[m
[31m-doconv:[m
[31m-  if (ctype_isenum(d->info)) d = ctype_child(cts, d);[m
[31m-  return crec_ct_ct(J, d, s, dp, sp, svisnz);[m
[31m-}[m
[31m-[m
[31m-/* -- C data metamethods -------------------------------------------------- */[m
[31m-[m
[31m-/* This would be rather difficult in FOLD, so do it here:[m
[31m-** (base+k)+(idx*sz)+ofs ==> (base+idx*sz)+(ofs+k)[m
[31m-** (base+(idx+k)*sz)+ofs ==> (base+idx*sz)+(ofs+k*sz)[m
[31m-*/[m
[31m-static TRef crec_reassoc_ofs(jit_State *J, TRef tr, ptrdiff_t *ofsp, MSize sz)[m
[31m-{[m
[31m-  IRIns *ir = IR(tref_ref(tr));[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && irref_isk(ir->op2) &&[m
[31m-      (ir->o == IR_ADD || ir->o == IR_ADDOV || ir->o == IR_SUBOV)) {[m
[31m-    IRIns *irk = IR(ir->op2);[m
[31m-    ptrdiff_t k;[m
[31m-    if (LJ_64 && irk->o == IR_KINT64)[m
[31m-      k = (ptrdiff_t)ir_kint64(irk)->u64 * sz;[m
[31m-    else[m
[31m-      k = (ptrdiff_t)irk->i * sz;[m
[31m-    if (ir->o == IR_SUBOV) *ofsp -= k; else *ofsp += k;[m
[31m-    tr = ir->op1;  /* Not a TRef, but the caller doesn't care. */[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Record ctype __index/__newindex metamethods. */[m
[31m-static void crec_index_meta(jit_State *J, CTState *cts, CType *ct,[m
[31m-			    RecordFFData *rd)[m
[31m-{[m
[31m-  CTypeID id = ctype_typeid(cts, ct);[m
[31m-  cTValue *tv = lj_ctype_meta(cts, id, rd->data ? MM_newindex : MM_index);[m
[31m-  if (!tv)[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  if (tvisfunc(tv)) {[m
[31m-    J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;[m
[31m-    rd->nres = -1;  /* Pending tailcall. */[m
[31m-  } else if (rd->data == 0 && tvistab(tv) && tref_isstr(J->base[1])) {[m
[31m-    /* Specialize to result of __index lookup. */[m
[31m-    cTValue *o = lj_tab_get(J->L, tabV(tv), &rd->argv[1]);[m
[31m-    J->base[0] = lj_record_constify(J, o);[m
[31m-    if (!J->base[0])[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    /* Always specialize to the key. */[m
[31m-    emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, strV(&rd->argv[1])));[m
[31m-  } else {[m
[31m-    /* NYI: resolving of non-function metamethods. */[m
[31m-    /* NYI: non-string keys for __index table. */[m
[31m-    /* NYI: stores to __newindex table. */[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef idx, ptr = J->base[0];[m
[31m-  ptrdiff_t ofs = sizeof(GCcdata);[m
[31m-  GCcdata *cd = argv2cdata(J, ptr, &rd->argv[0]);[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  CTypeID sid = 0;[m
[31m-[m
[31m-  /* Resolve pointer or reference for cdata object. */[m
[31m-  if (ctype_isptr(ct->info)) {[m
[31m-    IRType t = (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32;[m
[31m-    if (ctype_isref(ct->info)) ct = ctype_rawchild(cts, ct);[m
[31m-    ptr = emitir(IRT(IR_FLOAD, t), ptr, IRFL_CDATA_PTR);[m
[31m-    ofs = 0;[m
[31m-    ptr = crec_reassoc_ofs(J, ptr, &ofs, 1);[m
[31m-  }[m
[31m-[m
[31m-again:[m
[31m-  idx = J->base[1];[m
[31m-  if (tref_isnumber(idx)) {[m
[31m-    idx = lj_opt_narrow_cindex(J, idx);[m
[31m-    if (ctype_ispointer(ct->info)) {[m
[31m-      CTSize sz;[m
[31m-  integer_key:[m
[31m-      if ((ct->info & CTF_COMPLEX))[m
[31m-	idx = emitir(IRT(IR_BAND, IRT_INTP), idx, lj_ir_kintp(J, 1));[m
[31m-      sz = lj_ctype_size(cts, (sid = ctype_cid(ct->info)));[m
[31m-      idx = crec_reassoc_ofs(J, idx, &ofs, sz);[m
[31m-#if LJ_TARGET_ARM || LJ_TARGET_PPC[m
[31m-      /* Hoist base add to allow fusion of index/shift into operands. */[m
[31m-      if (LJ_LIKELY(J->flags & JIT_F_OPT_LOOP) && ofs[m
[31m-#if LJ_TARGET_ARM[m
[31m-	  && (sz == 1 || sz == 4)[m
[31m-#endif[m
[31m-	  ) {[m
[31m-	ptr = emitir(IRT(IR_ADD, IRT_PTR), ptr, lj_ir_kintp(J, ofs));[m
[31m-	ofs = 0;[m
[31m-      }[m
[31m-#endif[m
[31m-      idx = emitir(IRT(IR_MUL, IRT_INTP), idx, lj_ir_kintp(J, sz));[m
[31m-      ptr = emitir(IRT(IR_ADD, IRT_PTR), idx, ptr);[m
[31m-    }[m
[31m-  } else if (tref_iscdata(idx)) {[m
[31m-    GCcdata *cdk = cdataV(&rd->argv[1]);[m
[31m-    CType *ctk = ctype_raw(cts, cdk->ctypeid);[m
[31m-    IRType t = crec_ct2irt(cts, ctk);[m
[31m-    if (ctype_ispointer(ct->info) && t >= IRT_I8 && t <= IRT_U64) {[m
[31m-      if (ctk->size == 8) {[m
[31m-	idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT64);[m
[31m-      } else if (ctk->size == 4) {[m
[31m-	idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT);[m
[31m-      } else {[m
[31m-	idx = emitir(IRT(IR_ADD, IRT_PTR), idx,[m
[31m-		     lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-	idx = emitir(IRT(IR_XLOAD, t), idx, 0);[m
[31m-      }[m
[31m-      if (LJ_64 && ctk->size < sizeof(intptr_t) && !(ctk->info & CTF_UNSIGNED))[m
[31m-	idx = emitconv(idx, IRT_INTP, IRT_INT, IRCONV_SEXT);[m
[31m-      if (!LJ_64 && ctk->size > sizeof(intptr_t)) {[m
[31m-	idx = emitconv(idx, IRT_INTP, t, 0);[m
[31m-	lj_needsplit(J);[m
[31m-      }[m
[31m-      goto integer_key;[m
[31m-    }[m
[31m-  } else if (tref_isstr(idx)) {[m
[31m-    GCstr *name = strV(&rd->argv[1]);[m
[31m-    if (cd && cd->ctypeid == CTID_CTYPEID)[m
[31m-      ct = ctype_raw(cts, crec_constructor(J, cd, ptr));[m
[31m-    if (ctype_isstruct(ct->info)) {[m
[31m-      CTSize fofs;[m
[31m-      CType *fct;[m
[31m-      fct = lj_ctype_getfield(cts, ct, name, &fofs);[m
[31m-      if (fct) {[m
[31m-	/* Always specialize to the field name. */[m
[31m-	emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name));[m
[31m-	if (ctype_isconstval(fct->info)) {[m
[31m-	  if (fct->size >= 0x80000000u &&[m
[31m-	      (ctype_child(cts, fct)->info & CTF_UNSIGNED)) {[m
[31m-	    J->base[0] = lj_ir_knum(J, (lua_Number)(uint32_t)fct->size);[m
[31m-	    return;[m
[31m-	  }[m
[31m-	  J->base[0] = lj_ir_kint(J, (int32_t)fct->size);[m
[31m-	  return;  /* Interpreter will throw for newindex. */[m
[31m-	} else if (ctype_isbitfield(fct->info)) {[m
[31m-	  lj_trace_err(J, LJ_TRERR_NYICONV);[m
[31m-	} else {[m
[31m-	  lua_assert(ctype_isfield(fct->info));[m
[31m-	  sid = ctype_cid(fct->info);[m
[31m-	}[m
[31m-	ofs += (ptrdiff_t)fofs;[m
[31m-      }[m
[31m-    } else if (ctype_iscomplex(ct->info)) {[m
[31m-      if (name->len == 2 &&[m
[31m-	  ((strdata(name)[0] == 'r' && strdata(name)[1] == 'e') ||[m
[31m-	   (strdata(name)[0] == 'i' && strdata(name)[1] == 'm'))) {[m
[31m-	/* Always specialize to the field name. */[m
[31m-	emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name));[m
[31m-	if (strdata(name)[0] == 'i') ofs += (ct->size >> 1);[m
[31m-	sid = ctype_cid(ct->info);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (!sid) {[m
[31m-    if (ctype_isptr(ct->info)) {  /* Automatically perform '->'. */[m
[31m-      CType *cct = ctype_rawchild(cts, ct);[m
[31m-      if (ctype_isstruct(cct->info)) {[m
[31m-	ct = cct;[m
[31m-	cd = NULL;[m
[31m-	if (tref_isstr(idx)) goto again;[m
[31m-      }[m
[31m-    }[m
[31m-    crec_index_meta(J, cts, ct, rd);[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  if (ofs)[m
[31m-    ptr = emitir(IRT(IR_ADD, IRT_PTR), ptr, lj_ir_kintp(J, ofs));[m
[31m-[m
[31m-  /* Resolve reference for field. */[m
[31m-  ct = ctype_get(cts, sid);[m
[31m-  if (ctype_isref(ct->info)) {[m
[31m-    ptr = emitir(IRT(IR_XLOAD, IRT_PTR), ptr, 0);[m
[31m-    sid = ctype_cid(ct->info);[m
[31m-    ct = ctype_get(cts, sid);[m
[31m-  }[m
[31m-[m
[31m-  while (ctype_isattrib(ct->info))[m
[31m-    ct = ctype_child(cts, ct);  /* Skip attributes. */[m
[31m-[m
[31m-  if (rd->data == 0) {  /* __index metamethod. */[m
[31m-    J->base[0] = crec_tv_ct(J, ct, sid, ptr);[m
[31m-  } else {  /* __newindex metamethod. */[m
[31m-    rd->nres = 0;[m
[31m-    J->needsnap = 1;[m
[31m-    crec_ct_tv(J, ct, ptr, J->base[2], &rd->argv[2]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record setting a finalizer. */[m
[31m-static void crec_finalizer(jit_State *J, TRef trcd, TRef trfin, cTValue *fin)[m
[31m-{[m
[31m-  if (tvisgcv(fin)) {[m
[31m-    if (!trfin) trfin = lj_ir_kptr(J, gcval(fin));[m
[31m-  } else if (tvisnil(fin)) {[m
[31m-    trfin = lj_ir_kptr(J, NULL);[m
[31m-  } else {[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-  lj_ir_call(J, IRCALL_lj_cdata_setfin, trcd,[m
[31m-	     trfin, lj_ir_kint(J, (int32_t)itype(fin)));[m
[31m-  J->needsnap = 1;[m
[31m-}[m
[31m-[m
[31m-/* Record cdata allocation. */[m
[31m-static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  CType *d = ctype_raw(cts, id);[m
[31m-  TRef trcd, trid = lj_ir_kint(J, id);[m
[31m-  cTValue *fin;[m
[31m-  /* Use special instruction to box pointer or 32/64 bit integer. */[m
[31m-  if (ctype_isptr(info) || (ctype_isinteger(info) && (sz == 4 || sz == 8))) {[m
[31m-    TRef sp = J->base[1] ? crec_ct_tv(J, d, 0, J->base[1], &rd->argv[1]) :[m
[31m-	      ctype_isptr(info) ? lj_ir_kptr(J, NULL) :[m
[31m-	      sz == 4 ? lj_ir_kint(J, 0) :[m
[31m-	      (lj_needsplit(J), lj_ir_kint64(J, 0));[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), trid, sp);[m
[31m-    return;[m
[31m-  } else {[m
[31m-    TRef trsz = TREF_NIL;[m
[31m-    if ((info & CTF_VLA)) {  /* Calculate VLA/VLS size at runtime. */[m
[31m-      CTSize sz0, sz1;[m
[31m-      if (!J->base[1] || J->base[2])[m
[31m-	lj_trace_err(J, LJ_TRERR_NYICONV);  /* NYI: init VLA/VLS. */[m
[31m-      trsz = crec_ct_tv(J, ctype_get(cts, CTID_INT32), 0,[m
[31m-			J->base[1], &rd->argv[1]);[m
[31m-      sz0 = lj_ctype_vlsize(cts, d, 0);[m
[31m-      sz1 = lj_ctype_vlsize(cts, d, 1);[m
[31m-      trsz = emitir(IRTGI(IR_MULOV), trsz, lj_ir_kint(J, (int32_t)(sz1-sz0)));[m
[31m-      trsz = emitir(IRTGI(IR_ADDOV), trsz, lj_ir_kint(J, (int32_t)sz0));[m
[31m-      J->base[1] = 0;  /* Simplify logic below. */[m
[31m-    } else if (ctype_align(info) > CT_MEMALIGN) {[m
[31m-      trsz = lj_ir_kint(J, sz);[m
[31m-    }[m
[31m-    trcd = emitir(IRTG(IR_CNEW, IRT_CDATA), trid, trsz);[m
[31m-    if (sz > 128 || (info & CTF_VLA)) {[m
[31m-      TRef dp;[m
[31m-      CTSize align;[m
[31m-    special:  /* Only handle bulk zero-fill for large/VLA/VLS types. */[m
[31m-      if (J->base[1])[m
[31m-	lj_trace_err(J, LJ_TRERR_NYICONV);  /* NYI: init large/VLA/VLS types. */[m
[31m-      dp = emitir(IRT(IR_ADD, IRT_PTR), trcd, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-      if (trsz == TREF_NIL) trsz = lj_ir_kint(J, sz);[m
[31m-      align = ctype_align(info);[m
[31m-      if (align < CT_MEMALIGN) align = CT_MEMALIGN;[m
[31m-      crec_fill(J, dp, trsz, lj_ir_kint(J, 0), (1u << align));[m
[31m-    } else if (J->base[1] && !J->base[2] &&[m
[31m-	!lj_cconv_multi_init(cts, d, &rd->argv[1])) {[m
[31m-      goto single_init;[m
[31m-    } else if (ctype_isarray(d->info)) {[m
[31m-      CType *dc = ctype_rawchild(cts, d);  /* Array element type. */[m
[31m-      CTSize ofs, esize = dc->size;[m
[31m-      TRef sp = 0;[m
[31m-      TValue tv;[m
[31m-      TValue *sval = &tv;[m
[31m-      MSize i;[m
[31m-      tv.u64 = 0;[m
[31m-      if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info)) ||[m
[31m-	  esize * CREC_FILL_MAXUNROLL < sz)[m
[31m-	goto special;[m
[31m-      for (i = 1, ofs = 0; ofs < sz; ofs += esize) {[m
[31m-	TRef dp = emitir(IRT(IR_ADD, IRT_PTR), trcd,[m
[31m-			 lj_ir_kintp(J, ofs + sizeof(GCcdata)));[m
[31m-	if (J->base[i]) {[m
[31m-	  sp = J->base[i];[m
[31m-	  sval = &rd->argv[i];[m
[31m-	  i++;[m
[31m-	} else if (i != 2) {[m
[31m-	  sp = ctype_isnum(dc->info) ? lj_ir_kint(J, 0) : TREF_NIL;[m
[31m-	}[m
[31m-	crec_ct_tv(J, dc, dp, sp, sval);[m
[31m-      }[m
[31m-    } else if (ctype_isstruct(d->info)) {[m
[31m-      CTypeID fid = d->sib;[m
[31m-      MSize i = 1;[m
[31m-      while (fid) {[m
[31m-	CType *df = ctype_get(cts, fid);[m
[31m-	fid = df->sib;[m
[31m-	if (ctype_isfield(df->info)) {[m
[31m-	  CType *dc;[m
[31m-	  TRef sp, dp;[m
[31m-	  TValue tv;[m
[31m-	  TValue *sval = &tv;[m
[31m-	  setintV(&tv, 0);[m
[31m-	  if (!gcref(df->name)) continue;  /* Ignore unnamed fields. */[m
[31m-	  dc = ctype_rawchild(cts, df);  /* Field type. */[m
[31m-	  if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info) ||[m
[31m-		ctype_isenum(dc->info)))[m
[31m-	    lj_trace_err(J, LJ_TRERR_NYICONV);  /* NYI: init aggregates. */[m
[31m-	  if (J->base[i]) {[m
[31m-	    sp = J->base[i];[m
[31m-	    sval = &rd->argv[i];[m
[31m-	    i++;[m
[31m-	  } else {[m
[31m-	    sp = ctype_isptr(dc->info) ? TREF_NIL : lj_ir_kint(J, 0);[m
[31m-	  }[m
[31m-	  dp = emitir(IRT(IR_ADD, IRT_PTR), trcd,[m
[31m-		      lj_ir_kintp(J, df->size + sizeof(GCcdata)));[m
[31m-	  crec_ct_tv(J, dc, dp, sp, sval);[m
[31m-	} else if (!ctype_isconstval(df->info)) {[m
[31m-	  /* NYI: init bitfields and sub-structures. */[m
[31m-	  lj_trace_err(J, LJ_TRERR_NYICONV);[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      TRef dp;[m
[31m-    single_init:[m
[31m-      dp = emitir(IRT(IR_ADD, IRT_PTR), trcd, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-      if (J->base[1]) {[m
[31m-	crec_ct_tv(J, d, dp, J->base[1], &rd->argv[1]);[m
[31m-      } else {[m
[31m-	TValue tv;[m
[31m-	tv.u64 = 0;[m
[31m-	crec_ct_tv(J, d, dp, lj_ir_kint(J, 0), &tv);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  J->base[0] = trcd;[m
[31m-  /* Handle __gc metamethod. */[m
[31m-  fin = lj_ctype_meta(cts, id, MM_gc);[m
[31m-  if (fin)[m
[31m-    crec_finalizer(J, trcd, 0, fin);[m
[31m-}[m
[31m-[m
[31m-/* Record argument conversions. */[m
[31m-static TRef crec_call_args(jit_State *J, RecordFFData *rd,[m
[31m-			   CTState *cts, CType *ct)[m
[31m-{[m
[31m-  TRef args[CCI_NARGS_MAX];[m
[31m-  CTypeID fid;[m
[31m-  MSize i, n;[m
[31m-  TRef tr, *base;[m
[31m-  cTValue *o;[m
[31m-#if LJ_TARGET_X86[m
[31m-#if LJ_ABI_WIN[m
[31m-  TRef *arg0 = NULL, *arg1 = NULL;[m
[31m-#endif[m
[31m-  int ngpr = 0;[m
[31m-  if (ctype_cconv(ct->info) == CTCC_THISCALL)[m
[31m-    ngpr = 1;[m
[31m-  else if (ctype_cconv(ct->info) == CTCC_FASTCALL)[m
[31m-    ngpr = 2;[m
[31m-#endif[m
[31m-[m
[31m-  /* Skip initial attributes. */[m
[31m-  fid = ct->sib;[m
[31m-  while (fid) {[m
[31m-    CType *ctf = ctype_get(cts, fid);[m
[31m-    if (!ctype_isattrib(ctf->info)) break;[m
[31m-    fid = ctf->sib;[m
[31m-  }[m
[31m-  args[0] = TREF_NIL;[m
[31m-  for (n = 0, base = J->base+1, o = rd->argv+1; *base; n++, base++, o++) {[m
[31m-    CTypeID did;[m
[31m-    CType *d;[m
[31m-[m
[31m-    if (n >= CCI_NARGS_MAX)[m
[31m-      lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-[m
[31m-    if (fid) {  /* Get argument type from field. */[m
[31m-      CType *ctf = ctype_get(cts, fid);[m
[31m-      fid = ctf->sib;[m
[31m-      lua_assert(ctype_isfield(ctf->info));[m
[31m-      did = ctype_cid(ctf->info);[m
[31m-    } else {[m
[31m-      if (!(ct->info & CTF_VARARG))[m
[31m-	lj_trace_err(J, LJ_TRERR_NYICALL);  /* Too many arguments. */[m
[31m-      did = lj_ccall_ctid_vararg(cts, o);  /* Infer vararg type. */[m
[31m-    }[m
[31m-    d = ctype_raw(cts, did);[m
[31m-    if (!(ctype_isnum(d->info) || ctype_isptr(d->info) ||[m
[31m-	  ctype_isenum(d->info)))[m
[31m-      lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-    tr = crec_ct_tv(J, d, 0, *base, o);[m
[31m-    if (ctype_isinteger_or_bool(d->info)) {[m
[31m-      if (d->size < 4) {[m
[31m-	if ((d->info & CTF_UNSIGNED))[m
[31m-	  tr = emitconv(tr, IRT_INT, d->size==1 ? IRT_U8 : IRT_U16, 0);[m
[31m-	else[m
[31m-	  tr = emitconv(tr, IRT_INT, d->size==1 ? IRT_I8 : IRT_I16,IRCONV_SEXT);[m
[31m-      }[m
[31m-    } else if (LJ_SOFTFP && ctype_isfp(d->info) && d->size > 4) {[m
[31m-      lj_needsplit(J);[m
[31m-    }[m
[31m-#if LJ_TARGET_X86[m
[31m-    /* 64 bit args must not end up in registers for fastcall/thiscall. */[m
[31m-#if LJ_ABI_WIN[m
[31m-    if (!ctype_isfp(d->info)) {[m
[31m-      /* Sigh, the Windows/x86 ABI allows reordering across 64 bit args. */[m
[31m-      if (tref_typerange(tr, IRT_I64, IRT_U64)) {[m
[31m-	if (ngpr) {[m
[31m-	  arg0 = &args[n]; args[n++] = TREF_NIL; ngpr--;[m
[31m-	  if (ngpr) {[m
[31m-	    arg1 = &args[n]; args[n++] = TREF_NIL; ngpr--;[m
[31m-	  }[m
[31m-	}[m
[31m-      } else {[m
[31m-	if (arg0) { *arg0 = tr; arg0 = NULL; n--; continue; }[m
[31m-	if (arg1) { *arg1 = tr; arg1 = NULL; n--; continue; }[m
[31m-	if (ngpr) ngpr--;[m
[31m-      }[m
[31m-    }[m
[31m-#else[m
[31m-    if (!ctype_isfp(d->info) && ngpr) {[m
[31m-      if (tref_typerange(tr, IRT_I64, IRT_U64)) {[m
[31m-	/* No reordering for other x86 ABIs. Simply add alignment args. */[m
[31m-	do { args[n++] = TREF_NIL; } while (--ngpr);[m
[31m-      } else {[m
[31m-	ngpr--;[m
[31m-      }[m
[31m-    }[m
[31m-#endif[m
[31m-#endif[m
[31m-    args[n] = tr;[m
[31m-  }[m
[31m-  tr = args[0];[m
[31m-  for (i = 1; i < n; i++)[m
[31m-    tr = emitir(IRT(IR_CARG, IRT_NIL), tr, args[i]);[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Create a snapshot for the caller, simulating a 'false' return value. */[m
[31m-static void crec_snap_caller(jit_State *J)[m
[31m-{[m
[31m-  lua_State *L = J->L;[m
[31m-  TValue *base = L->base, *top = L->top;[m
[31m-  const BCIns *pc = J->pc;[m
[31m-  TRef ftr = J->base[-1];[m
[31m-  ptrdiff_t delta;[m
[31m-  if (!frame_islua(base-1) || J->framedepth <= 0)[m
[31m-    lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-  J->pc = frame_pc(base-1); delta = 1+LJ_FR2+bc_a(J->pc[-1]);[m
[31m-  L->top = base; L->base = base - delta;[m
[31m-  J->base[-1] = TREF_FALSE;[m
[31m-  J->base -= delta; J->baseslot -= (BCReg)delta;[m
[31m-  J->maxslot = (BCReg)delta; J->framedepth--;[m
[31m-  lj_snap_add(J);[m
[31m-  L->base = base; L->top = top;[m
[31m-  J->framedepth++; J->maxslot = 1;[m
[31m-  J->base += delta; J->baseslot += (BCReg)delta;[m
[31m-  J->base[-1] = ftr; J->pc = pc;[m
[31m-}[m
[31m-[m
[31m-/* Record function call. */[m
[31m-static int crec_call(jit_State *J, RecordFFData *rd, GCcdata *cd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  IRType tp = IRT_PTR;[m
[31m-  if (ctype_isptr(ct->info)) {[m
[31m-    tp = (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32;[m
[31m-    ct = ctype_rawchild(cts, ct);[m
[31m-  }[m
[31m-  if (ctype_isfunc(ct->info)) {[m
[31m-    TRef func = emitir(IRT(IR_FLOAD, tp), J->base[0], IRFL_CDATA_PTR);[m
[31m-    CType *ctr = ctype_rawchild(cts, ct);[m
[31m-    IRType t = crec_ct2irt(cts, ctr);[m
[31m-    TRef tr;[m
[31m-    TValue tv;[m
[31m-    /* Check for blacklisted C functions that might call a callback. */[m
[31m-    setlightudV(&tv,[m
[31m-		cdata_getptr(cdataptr(cd), (LJ_64 && tp == IRT_P64) ? 8 : 4));[m
[31m-    if (tvistrue(lj_tab_get(J->L, cts->miscmap, &tv)))[m
[31m-      lj_trace_err(J, LJ_TRERR_BLACKL);[m
[31m-    if (ctype_isvoid(ctr->info)) {[m
[31m-      t = IRT_NIL;[m
[31m-      rd->nres = 0;[m
[31m-    } else if (!(ctype_isnum(ctr->info) || ctype_isptr(ctr->info) ||[m
[31m-		 ctype_isenum(ctr->info)) || t == IRT_CDATA) {[m
[31m-      lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-    }[m
[31m-    if ((ct->info & CTF_VARARG)[m
[31m-#if LJ_TARGET_X86[m
[31m-	|| ctype_cconv(ct->info) != CTCC_CDECL[m
[31m-#endif[m
[31m-	)[m
[31m-      func = emitir(IRT(IR_CARG, IRT_NIL), func,[m
[31m-		    lj_ir_kint(J, ctype_typeid(cts, ct)));[m
[31m-    tr = emitir(IRT(IR_CALLXS, t), crec_call_args(J, rd, cts, ct), func);[m
[31m-    if (ctype_isbool(ctr->info)) {[m
[31m-      if (frame_islua(J->L->base-1) && bc_b(frame_pc(J->L->base-1)[-1]) == 1) {[m
[31m-	/* Don't check result if ignored. */[m
[31m-	tr = TREF_NIL;[m
[31m-      } else {[m
[31m-	crec_snap_caller(J);[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-	/* Note: only the x86/x64 backend supports U8 and only for EQ(tr, 0). */[m
[31m-	lj_ir_set(J, IRTG(IR_NE, IRT_U8), tr, lj_ir_kint(J, 0));[m
[31m-#else[m
[31m-	lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0));[m
[31m-#endif[m
[31m-	J->postproc = LJ_POST_FIXGUARDSNAP;[m
[31m-	tr = TREF_TRUE;[m
[31m-      }[m
[31m-    } else if (t == IRT_PTR || (LJ_64 && t == IRT_P32) ||[m
[31m-	       t == IRT_I64 || t == IRT_U64 || ctype_isenum(ctr->info)) {[m
[31m-      TRef trid = lj_ir_kint(J, ctype_cid(ct->info));[m
[31m-      tr = emitir(IRTG(IR_CNEWI, IRT_CDATA), trid, tr);[m
[31m-      if (t == IRT_I64 || t == IRT_U64) lj_needsplit(J);[m
[31m-    } else if (t == IRT_FLOAT || t == IRT_U32) {[m
[31m-      tr = emitconv(tr, IRT_NUM, t, 0);[m
[31m-    } else if (t == IRT_I8 || t == IRT_I16) {[m
[31m-      tr = emitconv(tr, IRT_INT, t, IRCONV_SEXT);[m
[31m-    } else if (t == IRT_U8 || t == IRT_U16) {[m
[31m-      tr = emitconv(tr, IRT_INT, t, 0);[m
[31m-    }[m
[31m-    J->base[0] = tr;[m
[31m-    J->needsnap = 1;[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  GCcdata *cd = argv2cdata(J, J->base[0], &rd->argv[0]);[m
[31m-  CTypeID id = cd->ctypeid;[m
[31m-  CType *ct;[m
[31m-  cTValue *tv;[m
[31m-  MMS mm = MM_call;[m
[31m-  if (id == CTID_CTYPEID) {[m
[31m-    id = crec_constructor(J, cd, J->base[0]);[m
[31m-    mm = MM_new;[m
[31m-  } else if (crec_call(J, rd, cd)) {[m
[31m-    return;[m
[31m-  }[m
[31m-  /* Record ctype __call/__new metamethod. */[m
[31m-  ct = ctype_raw(cts, id);[m
[31m-  tv = lj_ctype_meta(cts, ctype_isptr(ct->info) ? ctype_cid(ct->info) : id, mm);[m
[31m-  if (tv) {[m
[31m-    if (tvisfunc(tv)) {[m
[31m-      J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;[m
[31m-      rd->nres = -1;  /* Pending tailcall. */[m
[31m-      return;[m
[31m-    }[m
[31m-  } else if (mm == MM_new) {[m
[31m-    crec_alloc(J, rd, id);[m
[31m-    return;[m
[31m-  }[m
[31m-  /* No metamethod or NYI: non-function metamethods. */[m
[31m-  lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-}[m
[31m-[m
[31m-static TRef crec_arith_int64(jit_State *J, TRef *sp, CType **s, MMS mm)[m
[31m-{[m
[31m-  if (ctype_isnum(s[0]->info) && ctype_isnum(s[1]->info)) {[m
[31m-    IRType dt;[m
[31m-    CTypeID id;[m
[31m-    TRef tr;[m
[31m-    MSize i;[m
[31m-    IROp op;[m
[31m-    lj_needsplit(J);[m
[31m-    if (((s[0]->info & CTF_UNSIGNED) && s[0]->size == 8) ||[m
[31m-	((s[1]->info & CTF_UNSIGNED) && s[1]->size == 8)) {[m
[31m-      dt = IRT_U64; id = CTID_UINT64;[m
[31m-    } else {[m
[31m-      dt = IRT_I64; id = CTID_INT64;[m
[31m-      if (mm < MM_add &&[m
[31m-	  !((s[0]->info | s[1]->info) & CTF_FP) &&[m
[31m-	  s[0]->size == 4 && s[1]->size == 4) {  /* Try to narrow comparison. */[m
[31m-	if (!((s[0]->info ^ s[1]->info) & CTF_UNSIGNED) ||[m
[31m-	    (tref_isk(sp[1]) && IR(tref_ref(sp[1]))->i >= 0)) {[m
[31m-	  dt = (s[0]->info & CTF_UNSIGNED) ? IRT_U32 : IRT_INT;[m
[31m-	  goto comp;[m
[31m-	} else if (tref_isk(sp[0]) && IR(tref_ref(sp[0]))->i >= 0) {[m
[31m-	  dt = (s[1]->info & CTF_UNSIGNED) ? IRT_U32 : IRT_INT;[m
[31m-	  goto comp;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    for (i = 0; i < 2; i++) {[m
[31m-      IRType st = tref_type(sp[i]);[m
[31m-      if (st == IRT_NUM || st == IRT_FLOAT)[m
[31m-	sp[i] = emitconv(sp[i], dt, st, IRCONV_ANY);[m
[31m-      else if (!(st == IRT_I64 || st == IRT_U64))[m
[31m-	sp[i] = emitconv(sp[i], dt, IRT_INT,[m
[31m-			 (s[i]->info & CTF_UNSIGNED) ? 0 : IRCONV_SEXT);[m
[31m-    }[m
[31m-    if (mm < MM_add) {[m
[31m-    comp:[m
[31m-      /* Assume true comparison. Fixup and emit pending guard later. */[m
[31m-      if (mm == MM_eq) {[m
[31m-	op = IR_EQ;[m
[31m-      } else {[m
[31m-	op = mm == MM_lt ? IR_LT : IR_LE;[m
[31m-	if (dt == IRT_U32 || dt == IRT_U64)[m
[31m-	  op += (IR_ULT-IR_LT);[m
[31m-      }[m
[31m-      lj_ir_set(J, IRTG(op, dt), sp[0], sp[1]);[m
[31m-      J->postproc = LJ_POST_FIXGUARD;[m
[31m-      return TREF_TRUE;[m
[31m-    } else {[m
[31m-      tr = emitir(IRT(mm+(int)IR_ADD-(int)MM_add, dt), sp[0], sp[1]);[m
[31m-    }[m
[31m-    return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static TRef crec_arith_ptr(jit_State *J, TRef *sp, CType **s, MMS mm)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CType *ctp = s[0];[m
[31m-  if (ctype_isptr(ctp->info) || ctype_isrefarray(ctp->info)) {[m
[31m-    if ((mm == MM_sub || mm == MM_eq || mm == MM_lt || mm == MM_le) &&[m
[31m-	(ctype_isptr(s[1]->info) || ctype_isrefarray(s[1]->info))) {[m
[31m-      if (mm == MM_sub) {  /* Pointer difference. */[m
[31m-	TRef tr;[m
[31m-	CTSize sz = lj_ctype_size(cts, ctype_cid(ctp->info));[m
[31m-	if (sz == 0 || (sz & (sz-1)) != 0)[m
[31m-	  return 0;  /* NYI: integer division. */[m
[31m-	tr = emitir(IRT(IR_SUB, IRT_INTP), sp[0], sp[1]);[m
[31m-	tr = emitir(IRT(IR_BSAR, IRT_INTP), tr, lj_ir_kint(J, lj_fls(sz)));[m
[31m-#if LJ_64[m
[31m-	tr = emitconv(tr, IRT_NUM, IRT_INTP, 0);[m
[31m-#endif[m
[31m-	return tr;[m
[31m-      } else {  /* Pointer comparison (unsigned). */[m
[31m-	/* Assume true comparison. Fixup and emit pending guard later. */[m
[31m-	IROp op = mm == MM_eq ? IR_EQ : mm == MM_lt ? IR_ULT : IR_ULE;[m
[31m-	lj_ir_set(J, IRTG(op, IRT_PTR), sp[0], sp[1]);[m
[31m-	J->postproc = LJ_POST_FIXGUARD;[m
[31m-	return TREF_TRUE;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!((mm == MM_add || mm == MM_sub) && ctype_isnum(s[1]->info)))[m
[31m-      return 0;[m
[31m-  } else if (mm == MM_add && ctype_isnum(ctp->info) &&[m
[31m-	     (ctype_isptr(s[1]->info) || ctype_isrefarray(s[1]->info))) {[m
[31m-    TRef tr = sp[0]; sp[0] = sp[1]; sp[1] = tr;  /* Swap pointer and index. */[m
[31m-    ctp = s[1];[m
[31m-  } else {[m
[31m-    return 0;[m
[31m-  }[m
[31m-  {[m
[31m-    TRef tr = sp[1];[m
[31m-    IRType t = tref_type(tr);[m
[31m-    CTSize sz = lj_ctype_size(cts, ctype_cid(ctp->info));[m
[31m-    CTypeID id;[m
[31m-#if LJ_64[m
[31m-    if (t == IRT_NUM || t == IRT_FLOAT)[m
[31m-      tr = emitconv(tr, IRT_INTP, t, IRCONV_ANY);[m
[31m-    else if (!(t == IRT_I64 || t == IRT_U64))[m
[31m-      tr = emitconv(tr, IRT_INTP, IRT_INT,[m
[31m-		    ((t - IRT_I8) & 1) ? 0 : IRCONV_SEXT);[m
[31m-#else[m
[31m-    if (!tref_typerange(sp[1], IRT_I8, IRT_U32)) {[m
[31m-      tr = emitconv(tr, IRT_INTP, t,[m
[31m-		    (t == IRT_NUM || t == IRT_FLOAT) ? IRCONV_ANY : 0);[m
[31m-    }[m
[31m-#endif[m
[31m-    tr = emitir(IRT(IR_MUL, IRT_INTP), tr, lj_ir_kintp(J, sz));[m
[31m-    tr = emitir(IRT(mm+(int)IR_ADD-(int)MM_add, IRT_PTR), sp[0], tr);[m
[31m-    id = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ctp->info)),[m
[31m-			 CTSIZE_PTR);[m
[31m-    return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record ctype arithmetic metamethods. */[m
[31m-static TRef crec_arith_meta(jit_State *J, TRef *sp, CType **s, CTState *cts,[m
[31m-			    RecordFFData *rd)[m
[31m-{[m
[31m-  cTValue *tv = NULL;[m
[31m-  if (J->base[0]) {[m
[31m-    if (tviscdata(&rd->argv[0])) {[m
[31m-      CTypeID id = argv2cdata(J, J->base[0], &rd->argv[0])->ctypeid;[m
[31m-      CType *ct = ctype_raw(cts, id);[m
[31m-      if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-      tv = lj_ctype_meta(cts, id, (MMS)rd->data);[m
[31m-    }[m
[31m-    if (!tv && J->base[1] && tviscdata(&rd->argv[1])) {[m
[31m-      CTypeID id = argv2cdata(J, J->base[1], &rd->argv[1])->ctypeid;[m
[31m-      CType *ct = ctype_raw(cts, id);[m
[31m-      if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-      tv = lj_ctype_meta(cts, id, (MMS)rd->data);[m
[31m-    }[m
[31m-  }[m
[31m-  if (tv) {[m
[31m-    if (tvisfunc(tv)) {[m
[31m-      J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;[m
[31m-      rd->nres = -1;  /* Pending tailcall. */[m
[31m-      return 0;[m
[31m-    }  /* NYI: non-function metamethods. */[m
[31m-  } else if ((MMS)rd->data == MM_eq) {  /* Fallback cdata pointer comparison. */[m
[31m-    if (sp[0] && sp[1] && ctype_isnum(s[0]->info) == ctype_isnum(s[1]->info)) {[m
[31m-      /* Assume true comparison. Fixup and emit pending guard later. */[m
[31m-      lj_ir_set(J, IRTG(IR_EQ, IRT_PTR), sp[0], sp[1]);[m
[31m-      J->postproc = LJ_POST_FIXGUARD;[m
[31m-      return TREF_TRUE;[m
[31m-    } else {[m
[31m-      return TREF_FALSE;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef sp[2];[m
[31m-  CType *s[2];[m
[31m-  MSize i;[m
[31m-  for (i = 0; i < 2; i++) {[m
[31m-    TRef tr = J->base[i];[m
[31m-    CType *ct = ctype_get(cts, CTID_DOUBLE);[m
[31m-    if (!tr) {[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    } else if (tref_iscdata(tr)) {[m
[31m-      CTypeID id = argv2cdata(J, tr, &rd->argv[i])->ctypeid;[m
[31m-      IRType t;[m
[31m-      ct = ctype_raw(cts, id);[m
[31m-      t = crec_ct2irt(cts, ct);[m
[31m-      if (ctype_isptr(ct->info)) {  /* Resolve pointer or reference. */[m
[31m-	tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_PTR);[m
[31m-	if (ctype_isref(ct->info)) {[m
[31m-	  ct = ctype_rawchild(cts, ct);[m
[31m-	  t = crec_ct2irt(cts, ct);[m
[31m-	}[m
[31m-      } else if (t == IRT_I64 || t == IRT_U64) {[m
[31m-	tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_INT64);[m
[31m-	lj_needsplit(J);[m
[31m-	goto ok;[m
[31m-      } else if (t == IRT_INT || t == IRT_U32) {[m
[31m-	tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_INT);[m
[31m-	if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-	goto ok;[m
[31m-      } else if (ctype_isfunc(ct->info)) {[m
[31m-	tr = emitir(IRT(IR_FLOAD, IRT_PTR), tr, IRFL_CDATA_PTR);[m
[31m-	ct = ctype_get(cts,[m
[31m-	  lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR));[m
[31m-	goto ok;[m
[31m-      } else {[m
[31m-	tr = emitir(IRT(IR_ADD, IRT_PTR), tr, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-      }[m
[31m-      if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-      if (ctype_isnum(ct->info)) {[m
[31m-	if (t == IRT_CDATA) {[m
[31m-	  tr = 0;[m
[31m-	} else {[m
[31m-	  if (t == IRT_I64 || t == IRT_U64) lj_needsplit(J);[m
[31m-	  tr = emitir(IRT(IR_XLOAD, t), tr, 0);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (tref_isnil(tr)) {[m
[31m-      tr = lj_ir_kptr(J, NULL);[m
[31m-      ct = ctype_get(cts, CTID_P_VOID);[m
[31m-    } else if (tref_isinteger(tr)) {[m
[31m-      ct = ctype_get(cts, CTID_INT32);[m
[31m-    } else if (tref_isstr(tr)) {[m
[31m-      TRef tr2 = J->base[1-i];[m
[31m-      CTypeID id = argv2cdata(J, tr2, &rd->argv[1-i])->ctypeid;[m
[31m-      ct = ctype_raw(cts, id);[m
[31m-      if (ctype_isenum(ct->info)) {  /* Match string against enum constant. */[m
[31m-	GCstr *str = strV(&rd->argv[i]);[m
[31m-	CTSize ofs;[m
[31m-	CType *cct = lj_ctype_getfield(cts, ct, str, &ofs);[m
[31m-	if (cct && ctype_isconstval(cct->info)) {[m
[31m-	  /* Specialize to the name of the enum constant. */[m
[31m-	  emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, str));[m
[31m-	  ct = ctype_child(cts, cct);[m
[31m-	  tr = lj_ir_kint(J, (int32_t)ofs);[m
[31m-	} else {  /* Interpreter will throw or return false. */[m
[31m-	  ct = ctype_get(cts, CTID_P_VOID);[m
[31m-	}[m
[31m-      } else if (ctype_isptr(ct->info)) {[m
[31m-	tr = emitir(IRT(IR_ADD, IRT_PTR), tr, lj_ir_kintp(J, sizeof(GCstr)));[m
[31m-      } else {[m
[31m-	ct = ctype_get(cts, CTID_P_VOID);[m
[31m-      }[m
[31m-    } else if (!tref_isnum(tr)) {[m
[31m-      tr = 0;[m
[31m-      ct = ctype_get(cts, CTID_P_VOID);[m
[31m-    }[m
[31m-  ok:[m
[31m-    s[i] = ct;[m
[31m-    sp[i] = tr;[m
[31m-  }[m
[31m-  {[m
[31m-    TRef tr;[m
[31m-    if (!(tr = crec_arith_int64(J, sp, s, (MMS)rd->data)) &&[m
[31m-	!(tr = crec_arith_ptr(J, sp, s, (MMS)rd->data)) &&[m
[31m-	!(tr = crec_arith_meta(J, sp, s, cts, rd)))[m
[31m-      return;[m
[31m-    J->base[0] = tr;[m
[31m-    /* Fixup cdata comparisons, too. Avoids some cdata escapes. */[m
[31m-    if (J->postproc == LJ_POST_FIXGUARD && frame_iscont(J->L->base-1) &&[m
[31m-	!irt_isguard(J->guardemit)) {[m
[31m-      const BCIns *pc = frame_contpc(J->L->base-1) - 1;[m
[31m-      if (bc_op(*pc) <= BC_ISNEP) {[m
[31m-	J2G(J)->tmptv.u64 = (uint64_t)(uintptr_t)pc;[m
[31m-	J->postproc = LJ_POST_FIXCOMP;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- C library namespace metamethods ------------------------------------- */[m
[31m-[m
[31m-void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  if (tref_isudata(J->base[0]) && tref_isstr(J->base[1]) &&[m
[31m-      udataV(&rd->argv[0])->udtype == UDTYPE_FFI_CLIB) {[m
[31m-    CLibrary *cl = (CLibrary *)uddata(udataV(&rd->argv[0]));[m
[31m-    GCstr *name = strV(&rd->argv[1]);[m
[31m-    CType *ct;[m
[31m-    CTypeID id = lj_ctype_getname(cts, &ct, name, CLNS_INDEX);[m
[31m-    cTValue *tv = lj_tab_getstr(cl->cache, name);[m
[31m-    rd->nres = rd->data;[m
[31m-    if (id && tv && !tvisnil(tv)) {[m
[31m-      /* Specialize to the symbol name and make the result a constant. */[m
[31m-      emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, name));[m
[31m-      if (ctype_isconstval(ct->info)) {[m
[31m-	if (ct->size >= 0x80000000u &&[m
[31m-	    (ctype_child(cts, ct)->info & CTF_UNSIGNED))[m
[31m-	  J->base[0] = lj_ir_knum(J, (lua_Number)(uint32_t)ct->size);[m
[31m-	else[m
[31m-	  J->base[0] = lj_ir_kint(J, (int32_t)ct->size);[m
[31m-      } else if (ctype_isextern(ct->info)) {[m
[31m-	CTypeID sid = ctype_cid(ct->info);[m
[31m-	void *sp = *(void **)cdataptr(cdataV(tv));[m
[31m-	TRef ptr;[m
[31m-	ct = ctype_raw(cts, sid);[m
[31m-	if (LJ_64 && !checkptr32(sp))[m
[31m-	  ptr = lj_ir_kintp(J, (uintptr_t)sp);[m
[31m-	else[m
[31m-	  ptr = lj_ir_kptr(J, sp);[m
[31m-	if (rd->data) {[m
[31m-	  J->base[0] = crec_tv_ct(J, ct, sid, ptr);[m
[31m-	} else {[m
[31m-	  J->needsnap = 1;[m
[31m-	  crec_ct_tv(J, ct, ptr, J->base[2], &rd->argv[2]);[m
[31m-	}[m
[31m-      } else {[m
[31m-	J->base[0] = lj_ir_kgc(J, obj2gco(cdataV(tv)), IRT_CDATA);[m
[31m-      }[m
[31m-    } else {[m
[31m-      lj_trace_err(J, LJ_TRERR_NOCACHE);[m
[31m-    }[m
[31m-  }  /* else: interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-/* -- FFI library functions ----------------------------------------------- */[m
[31m-[m
[31m-static TRef crec_toint(jit_State *J, CTState *cts, TRef sp, TValue *sval)[m
[31m-{[m
[31m-  return crec_ct_tv(J, ctype_get(cts, CTID_INT32), 0, sp, sval);[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  crec_alloc(J, rd, argv2ctype(J, J->base[0], &rd->argv[0]));[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  UNUSED(rd);[m
[31m-  if (J->base[0])[m
[31m-    lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-  J->base[0] = lj_ir_call(J, IRCALL_lj_vm_errno);[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tr) {[m
[31m-    TRef trlen = J->base[1];[m
[31m-    if (!tref_isnil(trlen)) {[m
[31m-      trlen = crec_toint(J, cts, trlen, &rd->argv[1]);[m
[31m-      tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CVOID), 0, tr, &rd->argv[0]);[m
[31m-    } else {[m
[31m-      tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CCHAR), 0, tr, &rd->argv[0]);[m
[31m-      trlen = lj_ir_call(J, IRCALL_strlen, tr);[m
[31m-    }[m
[31m-    J->base[0] = emitir(IRT(IR_XSNEW, IRT_STR), tr, trlen);[m
[31m-  }  /* else: interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef trdst = J->base[0], trsrc = J->base[1], trlen = J->base[2];[m
[31m-  if (trdst && trsrc && (trlen || tref_isstr(trsrc))) {[m
[31m-    trdst = crec_ct_tv(J, ctype_get(cts, CTID_P_VOID), 0, trdst, &rd->argv[0]);[m
[31m-    trsrc = crec_ct_tv(J, ctype_get(cts, CTID_P_CVOID), 0, trsrc, &rd->argv[1]);[m
[31m-    if (trlen) {[m
[31m-      trlen = crec_toint(J, cts, trlen, &rd->argv[2]);[m
[31m-    } else {[m
[31m-      trlen = emitir(IRTI(IR_FLOAD), J->base[1], IRFL_STR_LEN);[m
[31m-      trlen = emitir(IRTI(IR_ADD), trlen, lj_ir_kint(J, 1));[m
[31m-    }[m
[31m-    rd->nres = 0;[m
[31m-    crec_copy(J, trdst, trsrc, trlen, NULL);[m
[31m-  }  /* else: interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef trdst = J->base[0], trlen = J->base[1], trfill = J->base[2];[m
[31m-  if (trdst && trlen) {[m
[31m-    CTSize step = 1;[m
[31m-    if (tviscdata(&rd->argv[0])) {  /* Get alignment of original destination. */[m
[31m-      CTSize sz;[m
[31m-      CType *ct = ctype_raw(cts, cdataV(&rd->argv[0])->ctypeid);[m
[31m-      if (ctype_isptr(ct->info))[m
[31m-	ct = ctype_rawchild(cts, ct);[m
[31m-      step = (1u<<ctype_align(lj_ctype_info(cts, ctype_typeid(cts, ct), &sz)));[m
[31m-    }[m
[31m-    trdst = crec_ct_tv(J, ctype_get(cts, CTID_P_VOID), 0, trdst, &rd->argv[0]);[m
[31m-    trlen = crec_toint(J, cts, trlen, &rd->argv[1]);[m
[31m-    if (trfill)[m
[31m-      trfill = crec_toint(J, cts, trfill, &rd->argv[2]);[m
[31m-    else[m
[31m-      trfill = lj_ir_kint(J, 0);[m
[31m-    rd->nres = 0;[m
[31m-    crec_fill(J, trdst, trlen, trfill, step);[m
[31m-  }  /* else: interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (tref_iscdata(J->base[0])) {[m
[31m-    TRef trid = lj_ir_kint(J, argv2ctype(J, J->base[0], &rd->argv[0]));[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA),[m
[31m-			lj_ir_kint(J, CTID_CTYPEID), trid);[m
[31m-  } else {[m
[31m-    setfuncV(J->L, &J->errinfo, J->fn);[m
[31m-    lj_trace_err_info(J, LJ_TRERR_NYIFFU);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  argv2ctype(J, J->base[0], &rd->argv[0]);[m
[31m-  if (tref_iscdata(J->base[1])) {[m
[31m-    argv2ctype(J, J->base[1], &rd->argv[1]);[m
[31m-    J->postproc = LJ_POST_FIXBOOL;[m
[31m-    J->base[0] = TREF_TRUE;[m
[31m-  } else {[m
[31m-    J->base[0] = TREF_FALSE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (tref_isstr(J->base[0])) {[m
[31m-    /* Specialize to the ABI string to make the boolean result a constant. */[m
[31m-    emitir(IRTG(IR_EQ, IRT_STR), J->base[0], lj_ir_kstr(J, strV(&rd->argv[0])));[m
[31m-    J->postproc = LJ_POST_FIXBOOL;[m
[31m-    J->base[0] = TREF_TRUE;[m
[31m-  } else {[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record ffi.sizeof(), ffi.alignof(), ffi.offsetof(). */[m
[31m-void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTypeID id = argv2ctype(J, J->base[0], &rd->argv[0]);[m
[31m-  if (rd->data == FF_ffi_sizeof) {[m
[31m-    CType *ct = lj_ctype_rawref(ctype_ctsG(J2G(J)), id);[m
[31m-    if (ctype_isvltype(ct->info))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  } else if (rd->data == FF_ffi_offsetof) {  /* Specialize to the field name. */[m
[31m-    if (!tref_isstr(J->base[1]))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, strV(&rd->argv[1])));[m
[31m-    rd->nres = 3;  /* Just in case. */[m
[31m-  }[m
[31m-  J->postproc = LJ_POST_FIXCONST;[m
[31m-  J->base[0] = J->base[1] = J->base[2] = TREF_NIL;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  argv2cdata(J, J->base[0], &rd->argv[0]);[m
[31m-  if (!J->base[1])[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  crec_finalizer(J, J->base[0], J->base[1], &rd->argv[1]);[m
[31m-}[m
[31m-[m
[31m-/* -- 64 bit bit.* library functions -------------------------------------- */[m
[31m-[m
[31m-/* Determine bit operation type from argument type. */[m
[31m-static CTypeID crec_bit64_type(CTState *cts, cTValue *tv)[m
[31m-{[m
[31m-  if (tviscdata(tv)) {[m
[31m-    CType *ct = lj_ctype_rawref(cts, cdataV(tv)->ctypeid);[m
[31m-    if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-    if ((ct->info & (CTMASK_NUM|CTF_BOOL|CTF_FP|CTF_UNSIGNED)) ==[m
[31m-	CTINFO(CT_NUM, CTF_UNSIGNED) && ct->size == 8)[m
[31m-      return CTID_UINT64;  /* Use uint64_t, since it has the highest rank. */[m
[31m-    return CTID_INT64;  /* Otherwise use int64_t. */[m
[31m-  }[m
[31m-  return 0;  /* Use regular 32 bit ops. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_bit64_tobit(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef tr = crec_ct_tv(J, ctype_get(cts, CTID_INT64), 0,[m
[31m-		       J->base[0], &rd->argv[0]);[m
[31m-  if (!tref_isinteger(tr))[m
[31m-    tr = emitconv(tr, IRT_INT, tref_type(tr), 0);[m
[31m-  J->base[0] = tr;[m
[31m-}[m
[31m-[m
[31m-int LJ_FASTCALL recff_bit64_unary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID id = crec_bit64_type(cts, &rd->argv[0]);[m
[31m-  if (id) {[m
[31m-    TRef tr = crec_ct_tv(J, ctype_get(cts, id), 0, J->base[0], &rd->argv[0]);[m
[31m-    tr = emitir(IRT(rd->data, id-CTID_INT64+IRT_I64), tr, 0);[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-int LJ_FASTCALL recff_bit64_nary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID id = 0;[m
[31m-  MSize i;[m
[31m-  for (i = 0; J->base[i] != 0; i++) {[m
[31m-    CTypeID aid = crec_bit64_type(cts, &rd->argv[i]);[m
[31m-    if (id < aid) id = aid;  /* Determine highest type rank of all arguments. */[m
[31m-  }[m
[31m-  if (id) {[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    uint32_t ot = IRT(rd->data, id-CTID_INT64+IRT_I64);[m
[31m-    TRef tr = crec_ct_tv(J, ct, 0, J->base[0], &rd->argv[0]);[m
[31m-    for (i = 1; J->base[i] != 0; i++) {[m
[31m-      TRef tr2 = crec_ct_tv(J, ct, 0, J->base[i], &rd->argv[i]);[m
[31m-      tr = emitir(ot, tr, tr2);[m
[31m-    }[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-int LJ_FASTCALL recff_bit64_shift(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID id;[m
[31m-  TRef tsh = 0;[m
[31m-  if (J->base[0] && tref_iscdata(J->base[1])) {[m
[31m-    tsh = crec_ct_tv(J, ctype_get(cts, CTID_INT64), 0,[m
[31m-		     J->base[1], &rd->argv[1]);[m
[31m-    if (!tref_isinteger(tsh))[m
[31m-      tsh = emitconv(tsh, IRT_INT, tref_type(tsh), 0);[m
[31m-    J->base[1] = tsh;[m
[31m-  }[m
[31m-  id = crec_bit64_type(cts, &rd->argv[0]);[m
[31m-  if (id) {[m
[31m-    TRef tr = crec_ct_tv(J, ctype_get(cts, id), 0, J->base[0], &rd->argv[0]);[m
[31m-    uint32_t op = rd->data;[m
[31m-    if (!tsh) tsh = lj_opt_narrow_tobit(J, J->base[1]);[m
[31m-    if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) &&[m
[31m-	!tref_isk(tsh))[m
[31m-      tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 63));[m
[31m-#ifdef LJ_TARGET_UNIFYROT[m
[31m-      if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) {[m
[31m-	op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR;[m
[31m-	tsh = emitir(IRTI(IR_NEG), tsh, tsh);[m
[31m-      }[m
[31m-#endif[m
[31m-    tr = emitir(IRT(op, id-CTID_INT64+IRT_I64), tr, tsh);[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-TRef recff_bit64_tohex(jit_State *J, RecordFFData *rd, TRef hdr)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID id = crec_bit64_type(cts, &rd->argv[0]);[m
[31m-  TRef tr, trsf = J->base[1];[m
[31m-  SFormat sf = (STRFMT_UINT|STRFMT_T_HEX);[m
[31m-  int32_t n;[m
[31m-  if (trsf) {[m
[31m-    CTypeID id2 = 0;[m
[31m-    n = (int32_t)lj_carith_check64(J->L, 2, &id2);[m
[31m-    if (id2)[m
[31m-      trsf = crec_ct_tv(J, ctype_get(cts, CTID_INT32), 0, trsf, &rd->argv[1]);[m
[31m-    else[m
[31m-      trsf = lj_opt_narrow_tobit(J, trsf);[m
[31m-    emitir(IRTGI(IR_EQ), trsf, lj_ir_kint(J, n));  /* Specialize to n. */[m
[31m-  } else {[m
[31m-    n = id ? 16 : 8;[m
[31m-  }[m
[31m-  if (n < 0) { n = -n; sf |= STRFMT_F_UPPER; }[m
[31m-  sf |= ((SFormat)((n+1)&255) << STRFMT_SH_PREC);[m
[31m-  if (id) {[m
[31m-    tr = crec_ct_tv(J, ctype_get(cts, id), 0, J->base[0], &rd->argv[0]);[m
[31m-    if (n < 16)[m
[31m-      tr = emitir(IRT(IR_BAND, IRT_U64), tr,[m
[31m-		  lj_ir_kint64(J, ((uint64_t)1 << 4*n)-1));[m
[31m-  } else {[m
[31m-    tr = lj_opt_narrow_tobit(J, J->base[0]);[m
[31m-    if (n < 8)[m
[31m-      tr = emitir(IRTI(IR_BAND), tr, lj_ir_kint(J, (int32_t)((1u << 4*n)-1)));[m
[31m-    tr = emitconv(tr, IRT_U64, IRT_INT, 0);  /* No sign-extension. */[m
[31m-    lj_needsplit(J);[m
[31m-  }[m
[31m-  return lj_ir_call(J, IRCALL_lj_strfmt_putfxint, hdr, lj_ir_kint(J, sf), tr);[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous library functions ------------------------------------- */[m
[31m-[m
[31m-void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CType *d, *ct = lj_ctype_rawref(cts, cdataV(&rd->argv[0])->ctypeid);[m
[31m-  if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-  if (ctype_isnum(ct->info) || ctype_iscomplex(ct->info)) {[m
[31m-    if (ctype_isinteger_or_bool(ct->info) && ct->size <= 4 &&[m
[31m-	!(ct->size == 4 && (ct->info & CTF_UNSIGNED)))[m
[31m-      d = ctype_get(cts, CTID_INT32);[m
[31m-    else[m
[31m-      d = ctype_get(cts, CTID_DOUBLE);[m
[31m-    J->base[0] = crec_ct_tv(J, d, 0, J->base[0], &rd->argv[0]);[m
[31m-  } else {[m
[31m-    J->base[0] = TREF_NIL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef emitir[m
[31m-#undef emitconv[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.h[m
[1mdeleted file mode 100644[m
[1mindex 7a05881..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_crecord.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-/*[m
[31m-** Trace recorder for C data operations.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CRECORD_H[m
[31m-#define _LJ_CRECORD_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ffrecord.h"[m
[31m-[m
[31m-#if LJ_HASJIT && LJ_HASFFI[m
[31m-LJ_FUNC void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd);[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL recff_bit64_tobit(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC int LJ_FASTCALL recff_bit64_unary(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC int LJ_FASTCALL recff_bit64_nary(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC int LJ_FASTCALL recff_bit64_shift(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC TRef recff_bit64_tohex(jit_State *J, RecordFFData *rd, TRef hdr);[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.c[m
[1mdeleted file mode 100644[m
[1mindex bc47cc5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.c[m
[1m+++ /dev/null[m
[36m@@ -1,637 +0,0 @@[m
[31m-/*[m
[31m-** C type management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_ccallback.h"[m
[31m-#include "lj_buf.h"[m
[31m-[m
[31m-/* -- C type definitions -------------------------------------------------- */[m
[31m-[m
[31m-/* Predefined typedefs. */[m
[31m-#define CTTDDEF(_) \[m
[31m-  /* Vararg handling. */ \[m
[31m-  _("va_list",			P_VOID) \[m
[31m-  _("__builtin_va_list",	P_VOID) \[m
[31m-  _("__gnuc_va_list",		P_VOID) \[m
[31m-  /* From stddef.h. */ \[m
[31m-  _("ptrdiff_t",		INT_PSZ) \[m
[31m-  _("size_t",			UINT_PSZ) \[m
[31m-  _("wchar_t",			WCHAR) \[m
[31m-  /* Subset of stdint.h. */ \[m
[31m-  _("int8_t",			INT8) \[m
[31m-  _("int16_t",			INT16) \[m
[31m-  _("int32_t",			INT32) \[m
[31m-  _("int64_t",			INT64) \[m
[31m-  _("uint8_t",			UINT8) \[m
[31m-  _("uint16_t",			UINT16) \[m
[31m-  _("uint32_t",			UINT32) \[m
[31m-  _("uint64_t",			UINT64) \[m
[31m-  _("intptr_t",			INT_PSZ) \[m
[31m-  _("uintptr_t",		UINT_PSZ) \[m
[31m-  /* From POSIX. */ \[m
[31m-  _("ssize_t",			INT_PSZ) \[m
[31m-  /* End of typedef list. */[m
[31m-[m
[31m-/* Keywords (only the ones we actually care for). */[m
[31m-#define CTKWDEF(_) \[m
[31m-  /* Type specifiers. */ \[m
[31m-  _("void",		-1,	CTOK_VOID) \[m
[31m-  _("_Bool",		0,	CTOK_BOOL) \[m
[31m-  _("bool",		1,	CTOK_BOOL) \[m
[31m-  _("char",		1,	CTOK_CHAR) \[m
[31m-  _("int",		4,	CTOK_INT) \[m
[31m-  _("__int8",		1,	CTOK_INT) \[m
[31m-  _("__int16",		2,	CTOK_INT) \[m
[31m-  _("__int32",		4,	CTOK_INT) \[m
[31m-  _("__int64",		8,	CTOK_INT) \[m
[31m-  _("float",		4,	CTOK_FP) \[m
[31m-  _("double",		8,	CTOK_FP) \[m
[31m-  _("long",		0,	CTOK_LONG) \[m
[31m-  _("short",		0,	CTOK_SHORT) \[m
[31m-  _("_Complex",		0,	CTOK_COMPLEX) \[m
[31m-  _("complex",		0,	CTOK_COMPLEX) \[m
[31m-  _("__complex",	0,	CTOK_COMPLEX) \[m
[31m-  _("__complex__",	0,	CTOK_COMPLEX) \[m
[31m-  _("signed",		0,	CTOK_SIGNED) \[m
[31m-  _("__signed",		0,	CTOK_SIGNED) \[m
[31m-  _("__signed__",	0,	CTOK_SIGNED) \[m
[31m-  _("unsigned",		0,	CTOK_UNSIGNED) \[m
[31m-  /* Type qualifiers. */ \[m
[31m-  _("const",		0,	CTOK_CONST) \[m
[31m-  _("__const",		0,	CTOK_CONST) \[m
[31m-  _("__const__",	0,	CTOK_CONST) \[m
[31m-  _("volatile",		0,	CTOK_VOLATILE) \[m
[31m-  _("__volatile",	0,	CTOK_VOLATILE) \[m
[31m-  _("__volatile__",	0,	CTOK_VOLATILE) \[m
[31m-  _("restrict",		0,	CTOK_RESTRICT) \[m
[31m-  _("__restrict",	0,	CTOK_RESTRICT) \[m
[31m-  _("__restrict__",	0,	CTOK_RESTRICT) \[m
[31m-  _("inline",		0,	CTOK_INLINE) \[m
[31m-  _("__inline",		0,	CTOK_INLINE) \[m
[31m-  _("__inline__",	0,	CTOK_INLINE) \[m
[31m-  /* Storage class specifiers. */ \[m
[31m-  _("typedef",		0,	CTOK_TYPEDEF) \[m
[31m-  _("extern",		0,	CTOK_EXTERN) \[m
[31m-  _("static",		0,	CTOK_STATIC) \[m
[31m-  _("auto",		0,	CTOK_AUTO) \[m
[31m-  _("register",		0,	CTOK_REGISTER) \[m
[31m-  /* GCC Attributes. */ \[m
[31m-  _("__extension__",	0,	CTOK_EXTENSION) \[m
[31m-  _("__attribute",	0,	CTOK_ATTRIBUTE) \[m
[31m-  _("__attribute__",	0,	CTOK_ATTRIBUTE) \[m
[31m-  _("asm",		0,	CTOK_ASM) \[m
[31m-  _("__asm",		0,	CTOK_ASM) \[m
[31m-  _("__asm__",		0,	CTOK_ASM) \[m
[31m-  /* MSVC Attributes. */ \[m
[31m-  _("__declspec",	0,	CTOK_DECLSPEC) \[m
[31m-  _("__cdecl",		CTCC_CDECL,	CTOK_CCDECL) \[m
[31m-  _("__thiscall",	CTCC_THISCALL,	CTOK_CCDECL) \[m
[31m-  _("__fastcall",	CTCC_FASTCALL,	CTOK_CCDECL) \[m
[31m-  _("__stdcall",	CTCC_STDCALL,	CTOK_CCDECL) \[m
[31m-  _("__ptr32",		4,	CTOK_PTRSZ) \[m
[31m-  _("__ptr64",		8,	CTOK_PTRSZ) \[m
[31m-  /* Other type specifiers. */ \[m
[31m-  _("struct",		0,	CTOK_STRUCT) \[m
[31m-  _("union",		0,	CTOK_UNION) \[m
[31m-  _("enum",		0,	CTOK_ENUM) \[m
[31m-  /* Operators. */ \[m
[31m-  _("sizeof",		0,	CTOK_SIZEOF) \[m
[31m-  _("__alignof",	0,	CTOK_ALIGNOF) \[m
[31m-  _("__alignof__",	0,	CTOK_ALIGNOF) \[m
[31m-  /* End of keyword list. */[m
[31m-[m
[31m-/* Type info for predefined types. Size merged in. */[m
[31m-static CTInfo lj_ctype_typeinfo[] = {[m
[31m-#define CTTYINFODEF(id, sz, ct, info)	CTINFO((ct),(((sz)&0x3fu)<<10)+(info)),[m
[31m-#define CTTDINFODEF(name, id)		CTINFO(CT_TYPEDEF, CTID_##id),[m
[31m-#define CTKWINFODEF(name, sz, kw)	CTINFO(CT_KW,(((sz)&0x3fu)<<10)+(kw)),[m
[31m-CTTYDEF(CTTYINFODEF)[m
[31m-CTTDDEF(CTTDINFODEF)[m
[31m-CTKWDEF(CTKWINFODEF)[m
[31m-#undef CTTYINFODEF[m
[31m-#undef CTTDINFODEF[m
[31m-#undef CTKWINFODEF[m
[31m-  0[m
[31m-};[m
[31m-[m
[31m-/* Predefined type names collected in a single string. */[m
[31m-static const char * const lj_ctype_typenames =[m
[31m-#define CTTDNAMEDEF(name, id)		name "\0"[m
[31m-#define CTKWNAMEDEF(name, sz, cds)	name "\0"[m
[31m-CTTDDEF(CTTDNAMEDEF)[m
[31m-CTKWDEF(CTKWNAMEDEF)[m
[31m-#undef CTTDNAMEDEF[m
[31m-#undef CTKWNAMEDEF[m
[31m-;[m
[31m-[m
[31m-#define CTTYPEINFO_NUM		(sizeof(lj_ctype_typeinfo)/sizeof(CTInfo)-1)[m
[31m-#ifdef LUAJIT_CTYPE_CHECK_ANCHOR[m
[31m-#define CTTYPETAB_MIN		CTTYPEINFO_NUM[m
[31m-#else[m
[31m-#define CTTYPETAB_MIN		128[m
[31m-#endif[m
[31m-[m
[31m-/* -- C type interning ---------------------------------------------------- */[m
[31m-[m
[31m-#define ct_hashtype(info, size)	(hashrot(info, size) & CTHASH_MASK)[m
[31m-#define ct_hashname(name) \[m
[31m-  (hashrot(u32ptr(name), u32ptr(name) + HASH_BIAS) & CTHASH_MASK)[m
[31m-[m
[31m-/* Create new type element. */[m
[31m-CTypeID lj_ctype_new(CTState *cts, CType **ctp)[m
[31m-{[m
[31m-  CTypeID id = cts->top;[m
[31m-  CType *ct;[m
[31m-  lua_assert(cts->L);[m
[31m-  if (LJ_UNLIKELY(id >= cts->sizetab)) {[m
[31m-    if (id >= CTID_MAX) lj_err_msg(cts->L, LJ_ERR_TABOV);[m
[31m-#ifdef LUAJIT_CTYPE_CHECK_ANCHOR[m
[31m-    ct = lj_mem_newvec(cts->L, id+1, CType);[m
[31m-    memcpy(ct, cts->tab, id*sizeof(CType));[m
[31m-    memset(cts->tab, 0, id*sizeof(CType));[m
[31m-    lj_mem_freevec(cts->g, cts->tab, cts->sizetab, CType);[m
[31m-    cts->tab = ct;[m
[31m-    cts->sizetab = id+1;[m
[31m-#else[m
[31m-    lj_mem_growvec(cts->L, cts->tab, cts->sizetab, CTID_MAX, CType);[m
[31m-#endif[m
[31m-  }[m
[31m-  cts->top = id+1;[m
[31m-  *ctp = ct = &cts->tab[id];[m
[31m-  ct->info = 0;[m
[31m-  ct->size = 0;[m
[31m-  ct->sib = 0;[m
[31m-  ct->next = 0;[m
[31m-  setgcrefnull(ct->name);[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-/* Intern a type element. */[m
[31m-CTypeID lj_ctype_intern(CTState *cts, CTInfo info, CTSize size)[m
[31m-{[m
[31m-  uint32_t h = ct_hashtype(info, size);[m
[31m-  CTypeID id = cts->hash[h];[m
[31m-  lua_assert(cts->L);[m
[31m-  while (id) {[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    if (ct->info == info && ct->size == size)[m
[31m-      return id;[m
[31m-    id = ct->next;[m
[31m-  }[m
[31m-  id = cts->top;[m
[31m-  if (LJ_UNLIKELY(id >= cts->sizetab)) {[m
[31m-    if (id >= CTID_MAX) lj_err_msg(cts->L, LJ_ERR_TABOV);[m
[31m-    lj_mem_growvec(cts->L, cts->tab, cts->sizetab, CTID_MAX, CType);[m
[31m-  }[m
[31m-  cts->top = id+1;[m
[31m-  cts->tab[id].info = info;[m
[31m-  cts->tab[id].size = size;[m
[31m-  cts->tab[id].sib = 0;[m
[31m-  cts->tab[id].next = cts->hash[h];[m
[31m-  setgcrefnull(cts->tab[id].name);[m
[31m-  cts->hash[h] = (CTypeID1)id;[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-/* Add type element to hash table. */[m
[31m-static void ctype_addtype(CTState *cts, CType *ct, CTypeID id)[m
[31m-{[m
[31m-  uint32_t h = ct_hashtype(ct->info, ct->size);[m
[31m-  ct->next = cts->hash[h];[m
[31m-  cts->hash[h] = (CTypeID1)id;[m
[31m-}[m
[31m-[m
[31m-/* Add named element to hash table. */[m
[31m-void lj_ctype_addname(CTState *cts, CType *ct, CTypeID id)[m
[31m-{[m
[31m-  uint32_t h = ct_hashname(gcref(ct->name));[m
[31m-  ct->next = cts->hash[h];[m
[31m-  cts->hash[h] = (CTypeID1)id;[m
[31m-}[m
[31m-[m
[31m-/* Get a C type by name, matching the type mask. */[m
[31m-CTypeID lj_ctype_getname(CTState *cts, CType **ctp, GCstr *name, uint32_t tmask)[m
[31m-{[m
[31m-  CTypeID id = cts->hash[ct_hashname(name)];[m
[31m-  while (id) {[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    if (gcref(ct->name) == obj2gco(name) &&[m
[31m-	((tmask >> ctype_type(ct->info)) & 1)) {[m
[31m-      *ctp = ct;[m
[31m-      return id;[m
[31m-    }[m
[31m-    id = ct->next;[m
[31m-  }[m
[31m-  *ctp = &cts->tab[0];  /* Simplify caller logic. ctype_get() would assert. */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Get a struct/union/enum/function field by name. */[m
[31m-CType *lj_ctype_getfieldq(CTState *cts, CType *ct, GCstr *name, CTSize *ofs,[m
[31m-			  CTInfo *qual)[m
[31m-{[m
[31m-  while (ct->sib) {[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (gcref(ct->name) == obj2gco(name)) {[m
[31m-      *ofs = ct->size;[m
[31m-      return ct;[m
[31m-    }[m
[31m-    if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {[m
[31m-      CType *fct, *cct = ctype_child(cts, ct);[m
[31m-      CTInfo q = 0;[m
[31m-      while (ctype_isattrib(cct->info)) {[m
[31m-	if (ctype_attrib(cct->info) == CTA_QUAL) q |= cct->size;[m
[31m-	cct = ctype_child(cts, cct);[m
[31m-      }[m
[31m-      fct = lj_ctype_getfieldq(cts, cct, name, ofs, qual);[m
[31m-      if (fct) {[m
[31m-	if (qual) *qual |= q;[m
[31m-	*ofs += ct->size;[m
[31m-	return fct;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* Not found. */[m
[31m-}[m
[31m-[m
[31m-/* -- C type information -------------------------------------------------- */[m
[31m-[m
[31m-/* Follow references and get raw type for a C type ID. */[m
[31m-CType *lj_ctype_rawref(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_get(cts, id);[m
[31m-  while (ctype_isattrib(ct->info) || ctype_isref(ct->info))[m
[31m-    ct = ctype_child(cts, ct);[m
[31m-  return ct;[m
[31m-}[m
[31m-[m
[31m-/* Get size for a C type ID. Does NOT support VLA/VLS. */[m
[31m-CTSize lj_ctype_size(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_raw(cts, id);[m
[31m-  return ctype_hassize(ct->info) ? ct->size : CTSIZE_INVALID;[m
[31m-}[m
[31m-[m
[31m-/* Get size for a variable-length C type. Does NOT support other C types. */[m
[31m-CTSize lj_ctype_vlsize(CTState *cts, CType *ct, CTSize nelem)[m
[31m-{[m
[31m-  uint64_t xsz = 0;[m
[31m-  if (ctype_isstruct(ct->info)) {[m
[31m-    CTypeID arrid = 0, fid = ct->sib;[m
[31m-    xsz = ct->size;  /* Add the struct size. */[m
[31m-    while (fid) {[m
[31m-      CType *ctf = ctype_get(cts, fid);[m
[31m-      if (ctype_type(ctf->info) == CT_FIELD)[m
[31m-	arrid = ctype_cid(ctf->info);  /* Remember last field of VLS. */[m
[31m-      fid = ctf->sib;[m
[31m-    }[m
[31m-    ct = ctype_raw(cts, arrid);[m
[31m-  }[m
[31m-  lua_assert(ctype_isvlarray(ct->info));  /* Must be a VLA. */[m
[31m-  ct = ctype_rawchild(cts, ct);  /* Get array element. */[m
[31m-  lua_assert(ctype_hassize(ct->info));[m
[31m-  /* Calculate actual size of VLA and check for overflow. */[m
[31m-  xsz += (uint64_t)ct->size * nelem;[m
[31m-  return xsz < 0x80000000u ? (CTSize)xsz : CTSIZE_INVALID;[m
[31m-}[m
[31m-[m
[31m-/* Get type, qualifiers, size and alignment for a C type ID. */[m
[31m-CTInfo lj_ctype_info(CTState *cts, CTypeID id, CTSize *szp)[m
[31m-{[m
[31m-  CTInfo qual = 0;[m
[31m-  CType *ct = ctype_get(cts, id);[m
[31m-  for (;;) {[m
[31m-    CTInfo info = ct->info;[m
[31m-    if (ctype_isenum(info)) {[m
[31m-      /* Follow child. Need to look at its attributes, too. */[m
[31m-    } else if (ctype_isattrib(info)) {[m
[31m-      if (ctype_isxattrib(info, CTA_QUAL))[m
[31m-	qual |= ct->size;[m
[31m-      else if (ctype_isxattrib(info, CTA_ALIGN) && !(qual & CTFP_ALIGNED))[m
[31m-	qual |= CTFP_ALIGNED + CTALIGN(ct->size);[m
[31m-    } else {[m
[31m-      if (!(qual & CTFP_ALIGNED)) qual |= (info & CTF_ALIGN);[m
[31m-      qual |= (info & ~(CTF_ALIGN|CTMASK_CID));[m
[31m-      lua_assert(ctype_hassize(info) || ctype_isfunc(info));[m
[31m-      *szp = ctype_isfunc(info) ? CTSIZE_INVALID : ct->size;[m
[31m-      break;[m
[31m-    }[m
[31m-    ct = ctype_get(cts, ctype_cid(info));[m
[31m-  }[m
[31m-  return qual;[m
[31m-}[m
[31m-[m
[31m-/* Get ctype metamethod. */[m
[31m-cTValue *lj_ctype_meta(CTState *cts, CTypeID id, MMS mm)[m
[31m-{[m
[31m-  CType *ct = ctype_get(cts, id);[m
[31m-  cTValue *tv;[m
[31m-  while (ctype_isattrib(ct->info) || ctype_isref(ct->info)) {[m
[31m-    id = ctype_cid(ct->info);[m
[31m-    ct = ctype_get(cts, id);[m
[31m-  }[m
[31m-  if (ctype_isptr(ct->info) &&[m
[31m-      ctype_isfunc(ctype_get(cts, ctype_cid(ct->info))->info))[m
[31m-    tv = lj_tab_getstr(cts->miscmap, &cts->g->strempty);[m
[31m-  else[m
[31m-    tv = lj_tab_getinth(cts->miscmap, -(int32_t)id);[m
[31m-  if (tv && tvistab(tv) &&[m
[31m-      (tv = lj_tab_getstr(tabV(tv), mmname_str(cts->g, mm))) && !tvisnil(tv))[m
[31m-    return tv;[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- C type representation ----------------------------------------------- */[m
[31m-[m
[31m-/* Fixed max. length of a C type representation. */[m
[31m-#define CTREPR_MAX		512[m
[31m-[m
[31m-typedef struct CTRepr {[m
[31m-  char *pb, *pe;[m
[31m-  CTState *cts;[m
[31m-  lua_State *L;[m
[31m-  int needsp;[m
[31m-  int ok;[m
[31m-  char buf[CTREPR_MAX];[m
[31m-} CTRepr;[m
[31m-[m
[31m-/* Prepend string. */[m
[31m-static void ctype_prepstr(CTRepr *ctr, const char *str, MSize len)[m
[31m-{[m
[31m-  char *p = ctr->pb;[m
[31m-  if (ctr->buf + len+1 > p) { ctr->ok = 0; return; }[m
[31m-  if (ctr->needsp) *--p = ' ';[m
[31m-  ctr->needsp = 1;[m
[31m-  p -= len;[m
[31m-  while (len-- > 0) p[len] = str[len];[m
[31m-  ctr->pb = p;[m
[31m-}[m
[31m-[m
[31m-#define ctype_preplit(ctr, str)	ctype_prepstr((ctr), "" str, sizeof(str)-1)[m
[31m-[m
[31m-/* Prepend char. */[m
[31m-static void ctype_prepc(CTRepr *ctr, int c)[m
[31m-{[m
[31m-  if (ctr->buf >= ctr->pb) { ctr->ok = 0; return; }[m
[31m-  *--ctr->pb = c;[m
[31m-}[m
[31m-[m
[31m-/* Prepend number. */[m
[31m-static void ctype_prepnum(CTRepr *ctr, uint32_t n)[m
[31m-{[m
[31m-  char *p = ctr->pb;[m
[31m-  if (ctr->buf + 10+1 > p) { ctr->ok = 0; return; }[m
[31m-  do { *--p = (char)('0' + n % 10); } while (n /= 10);[m
[31m-  ctr->pb = p;[m
[31m-  ctr->needsp = 0;[m
[31m-}[m
[31m-[m
[31m-/* Append char. */[m
[31m-static void ctype_appc(CTRepr *ctr, int c)[m
[31m-{[m
[31m-  if (ctr->pe >= ctr->buf + CTREPR_MAX) { ctr->ok = 0; return; }[m
[31m-  *ctr->pe++ = c;[m
[31m-}[m
[31m-[m
[31m-/* Append number. */[m
[31m-static void ctype_appnum(CTRepr *ctr, uint32_t n)[m
[31m-{[m
[31m-  char buf[10];[m
[31m-  char *p = buf+sizeof(buf);[m
[31m-  char *q = ctr->pe;[m
[31m-  if (q > ctr->buf + CTREPR_MAX - 10) { ctr->ok = 0; return; }[m
[31m-  do { *--p = (char)('0' + n % 10); } while (n /= 10);[m
[31m-  do { *q++ = *p++; } while (p < buf+sizeof(buf));[m
[31m-  ctr->pe = q;[m
[31m-}[m
[31m-[m
[31m-/* Prepend qualifiers. */[m
[31m-static void ctype_prepqual(CTRepr *ctr, CTInfo info)[m
[31m-{[m
[31m-  if ((info & CTF_VOLATILE)) ctype_preplit(ctr, "volatile");[m
[31m-  if ((info & CTF_CONST)) ctype_preplit(ctr, "const");[m
[31m-}[m
[31m-[m
[31m-/* Prepend named type. */[m
[31m-static void ctype_preptype(CTRepr *ctr, CType *ct, CTInfo qual, const char *t)[m
[31m-{[m
[31m-  if (gcref(ct->name)) {[m
[31m-    GCstr *str = gco2str(gcref(ct->name));[m
[31m-    ctype_prepstr(ctr, strdata(str), str->len);[m
[31m-  } else {[m
[31m-    if (ctr->needsp) ctype_prepc(ctr, ' ');[m
[31m-    ctype_prepnum(ctr, ctype_typeid(ctr->cts, ct));[m
[31m-    ctr->needsp = 1;[m
[31m-  }[m
[31m-  ctype_prepstr(ctr, t, (MSize)strlen(t));[m
[31m-  ctype_prepqual(ctr, qual);[m
[31m-}[m
[31m-[m
[31m-static void ctype_repr(CTRepr *ctr, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_get(ctr->cts, id);[m
[31m-  CTInfo qual = 0;[m
[31m-  int ptrto = 0;[m
[31m-  for (;;) {[m
[31m-    CTInfo info = ct->info;[m
[31m-    CTSize size = ct->size;[m
[31m-    switch (ctype_type(info)) {[m
[31m-    case CT_NUM:[m
[31m-      if ((info & CTF_BOOL)) {[m
[31m-	ctype_preplit(ctr, "bool");[m
[31m-      } else if ((info & CTF_FP)) {[m
[31m-	if (size == sizeof(double)) ctype_preplit(ctr, "double");[m
[31m-	else if (size == sizeof(float)) ctype_preplit(ctr, "float");[m
[31m-	else ctype_preplit(ctr, "long double");[m
[31m-      } else if (size == 1) {[m
[31m-	if (!((info ^ CTF_UCHAR) & CTF_UNSIGNED)) ctype_preplit(ctr, "char");[m
[31m-	else if (CTF_UCHAR) ctype_preplit(ctr, "signed char");[m
[31m-	else ctype_preplit(ctr, "unsigned char");[m
[31m-      } else if (size < 8) {[m
[31m-	if (size == 4) ctype_preplit(ctr, "int");[m
[31m-	else ctype_preplit(ctr, "short");[m
[31m-	if ((info & CTF_UNSIGNED)) ctype_preplit(ctr, "unsigned");[m
[31m-      } else {[m
[31m-	ctype_preplit(ctr, "_t");[m
[31m-	ctype_prepnum(ctr, size*8);[m
[31m-	ctype_preplit(ctr, "int");[m
[31m-	if ((info & CTF_UNSIGNED)) ctype_prepc(ctr, 'u');[m
[31m-      }[m
[31m-      ctype_prepqual(ctr, (qual|info));[m
[31m-      return;[m
[31m-    case CT_VOID:[m
[31m-      ctype_preplit(ctr, "void");[m
[31m-      ctype_prepqual(ctr, (qual|info));[m
[31m-      return;[m
[31m-    case CT_STRUCT:[m
[31m-      ctype_preptype(ctr, ct, qual, (info & CTF_UNION) ? "union" : "struct");[m
[31m-      return;[m
[31m-    case CT_ENUM:[m
[31m-      if (id == CTID_CTYPEID) {[m
[31m-	ctype_preplit(ctr, "ctype");[m
[31m-	return;[m
[31m-      }[m
[31m-      ctype_preptype(ctr, ct, qual, "enum");[m
[31m-      return;[m
[31m-    case CT_ATTRIB:[m
[31m-      if (ctype_attrib(info) == CTA_QUAL) qual |= size;[m
[31m-      break;[m
[31m-    case CT_PTR:[m
[31m-      if ((info & CTF_REF)) {[m
[31m-	ctype_prepc(ctr, '&');[m
[31m-      } else {[m
[31m-	ctype_prepqual(ctr, (qual|info));[m
[31m-	if (LJ_64 && size == 4) ctype_preplit(ctr, "__ptr32");[m
[31m-	ctype_prepc(ctr, '*');[m
[31m-      }[m
[31m-      qual = 0;[m
[31m-      ptrto = 1;[m
[31m-      ctr->needsp = 1;[m
[31m-      break;[m
[31m-    case CT_ARRAY:[m
[31m-      if (ctype_isrefarray(info)) {[m
[31m-	ctr->needsp = 1;[m
[31m-	if (ptrto) { ptrto = 0; ctype_prepc(ctr, '('); ctype_appc(ctr, ')'); }[m
[31m-	ctype_appc(ctr, '[');[m
[31m-	if (size != CTSIZE_INVALID) {[m
[31m-	  CTSize csize = ctype_child(ctr->cts, ct)->size;[m
[31m-	  ctype_appnum(ctr, csize ? size/csize : 0);[m
[31m-	} else if ((info & CTF_VLA)) {[m
[31m-	  ctype_appc(ctr, '?');[m
[31m-	}[m
[31m-	ctype_appc(ctr, ']');[m
[31m-      } else if ((info & CTF_COMPLEX)) {[m
[31m-	if (size == 2*sizeof(float)) ctype_preplit(ctr, "float");[m
[31m-	ctype_preplit(ctr, "complex");[m
[31m-	return;[m
[31m-      } else {[m
[31m-	ctype_preplit(ctr, ")))");[m
[31m-	ctype_prepnum(ctr, size);[m
[31m-	ctype_preplit(ctr, "__attribute__((vector_size(");[m
[31m-      }[m
[31m-      break;[m
[31m-    case CT_FUNC:[m
[31m-      ctr->needsp = 1;[m
[31m-      if (ptrto) { ptrto = 0; ctype_prepc(ctr, '('); ctype_appc(ctr, ')'); }[m
[31m-      ctype_appc(ctr, '(');[m
[31m-      ctype_appc(ctr, ')');[m
[31m-      break;[m
[31m-    default:[m
[31m-      lua_assert(0);[m
[31m-      break;[m
[31m-    }[m
[31m-    ct = ctype_get(ctr->cts, ctype_cid(info));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return a printable representation of a C type. */[m
[31m-GCstr *lj_ctype_repr(lua_State *L, CTypeID id, GCstr *name)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  CTRepr ctr;[m
[31m-  ctr.pb = ctr.pe = &ctr.buf[CTREPR_MAX/2];[m
[31m-  ctr.cts = ctype_ctsG(g);[m
[31m-  ctr.L = L;[m
[31m-  ctr.ok = 1;[m
[31m-  ctr.needsp = 0;[m
[31m-  if (name) ctype_prepstr(&ctr, strdata(name), name->len);[m
[31m-  ctype_repr(&ctr, id);[m
[31m-  if (LJ_UNLIKELY(!ctr.ok)) return lj_str_newlit(L, "?");[m
[31m-  return lj_str_new(L, ctr.pb, ctr.pe - ctr.pb);[m
[31m-}[m
[31m-[m
[31m-/* Convert int64_t/uint64_t to string with 'LL' or 'ULL' suffix. */[m
[31m-GCstr *lj_ctype_repr_int64(lua_State *L, uint64_t n, int isunsigned)[m
[31m-{[m
[31m-  char buf[1+20+3];[m
[31m-  char *p = buf+sizeof(buf);[m
[31m-  int sign = 0;[m
[31m-  *--p = 'L'; *--p = 'L';[m
[31m-  if (isunsigned) {[m
[31m-    *--p = 'U';[m
[31m-  } else if ((int64_t)n < 0) {[m
[31m-    n = (uint64_t)-(int64_t)n;[m
[31m-    sign = 1;[m
[31m-  }[m
[31m-  do { *--p = (char)('0' + n % 10); } while (n /= 10);[m
[31m-  if (sign) *--p = '-';[m
[31m-  return lj_str_new(L, p, (size_t)(buf+sizeof(buf)-p));[m
[31m-}[m
[31m-[m
[31m-/* Convert complex to string with 'i' or 'I' suffix. */[m
[31m-GCstr *lj_ctype_repr_complex(lua_State *L, void *sp, CTSize size)[m
[31m-{[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  TValue re, im;[m
[31m-  if (size == 2*sizeof(double)) {[m
[31m-    re.n = *(double *)sp; im.n = ((double *)sp)[1];[m
[31m-  } else {[m
[31m-    re.n = (double)*(float *)sp; im.n = (double)((float *)sp)[1];[m
[31m-  }[m
[31m-  lj_strfmt_putfnum(sb, STRFMT_G14, re.n);[m
[31m-  if (!(im.u32.hi & 0x80000000u) || im.n != im.n) lj_buf_putchar(sb, '+');[m
[31m-  lj_strfmt_putfnum(sb, STRFMT_G14, im.n);[m
[31m-  lj_buf_putchar(sb, sbufP(sb)[-1] >= 'a' ? 'I' : 'i');[m
[31m-  return lj_buf_str(L, sb);[m
[31m-}[m
[31m-[m
[31m-/* -- C type state -------------------------------------------------------- */[m
[31m-[m
[31m-/* Initialize C type table and state. */[m
[31m-CTState *lj_ctype_init(lua_State *L)[m
[31m-{[m
[31m-  CTState *cts = lj_mem_newt(L, sizeof(CTState), CTState);[m
[31m-  CType *ct = lj_mem_newvec(L, CTTYPETAB_MIN, CType);[m
[31m-  const char *name = lj_ctype_typenames;[m
[31m-  CTypeID id;[m
[31m-  memset(cts, 0, sizeof(CTState));[m
[31m-  cts->tab = ct;[m
[31m-  cts->sizetab = CTTYPETAB_MIN;[m
[31m-  cts->top = CTTYPEINFO_NUM;[m
[31m-  cts->L = NULL;[m
[31m-  cts->g = G(L);[m
[31m-  for (id = 0; id < CTTYPEINFO_NUM; id++, ct++) {[m
[31m-    CTInfo info = lj_ctype_typeinfo[id];[m
[31m-    ct->size = (CTSize)((int32_t)(info << 16) >> 26);[m
[31m-    ct->info = info & 0xffff03ffu;[m
[31m-    ct->sib = 0;[m
[31m-    if (ctype_type(info) == CT_KW || ctype_istypedef(info)) {[m
[31m-      size_t len = strlen(name);[m
[31m-      GCstr *str = lj_str_new(L, name, len);[m
[31m-      ctype_setname(ct, str);[m
[31m-      name += len+1;[m
[31m-      lj_ctype_addname(cts, ct, id);[m
[31m-    } else {[m
[31m-      setgcrefnull(ct->name);[m
[31m-      ct->next = 0;[m
[31m-      if (!ctype_isenum(info)) ctype_addtype(cts, ct, id);[m
[31m-    }[m
[31m-  }[m
[31m-  setmref(G(L)->ctype_state, cts);[m
[31m-  return cts;[m
[31m-}[m
[31m-[m
[31m-/* Free C type table and state. */[m
[31m-void lj_ctype_freestate(global_State *g)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(g);[m
[31m-  if (cts) {[m
[31m-    lj_ccallback_mcode_free(cts);[m
[31m-    lj_mem_freevec(g, cts->tab, cts->sizetab, CType);[m
[31m-    lj_mem_freevec(g, cts->cb.cbid, cts->cb.sizeid, CTypeID1);[m
[31m-    lj_mem_freet(g, cts);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.h[m
[1mdeleted file mode 100644[m
[1mindex e9b426f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ctype.h[m
[1m+++ /dev/null[m
[36m@@ -1,461 +0,0 @@[m
[31m-/*[m
[31m-** C type management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CTYPE_H[m
[31m-#define _LJ_CTYPE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* -- C type definitions -------------------------------------------------- */[m
[31m-[m
[31m-/* C type numbers. Highest 4 bits of C type info. ORDER CT. */[m
[31m-enum {[m
[31m-  /* Externally visible types. */[m
[31m-  CT_NUM,		/* Integer or floating-point numbers. */[m
[31m-  CT_STRUCT,		/* Struct or union. */[m
[31m-  CT_PTR,		/* Pointer or reference. */[m
[31m-  CT_ARRAY,		/* Array or complex type. */[m
[31m-  CT_MAYCONVERT = CT_ARRAY,[m
[31m-  CT_VOID,		/* Void type. */[m
[31m-  CT_ENUM,		/* Enumeration. */[m
[31m-  CT_HASSIZE = CT_ENUM,  /* Last type where ct->size holds the actual size. */[m
[31m-  CT_FUNC,		/* Function. */[m
[31m-  CT_TYPEDEF,		/* Typedef. */[m
[31m-  CT_ATTRIB,		/* Miscellaneous attributes. */[m
[31m-  /* Internal element types. */[m
[31m-  CT_FIELD,		/* Struct/union field or function parameter. */[m
[31m-  CT_BITFIELD,		/* Struct/union bitfield. */[m
[31m-  CT_CONSTVAL,		/* Constant value. */[m
[31m-  CT_EXTERN,		/* External reference. */[m
[31m-  CT_KW			/* Keyword. */[m
[31m-};[m
[31m-[m
[31m-LJ_STATIC_ASSERT(((int)CT_PTR & (int)CT_ARRAY) == CT_PTR);[m
[31m-LJ_STATIC_ASSERT(((int)CT_STRUCT & (int)CT_ARRAY) == CT_STRUCT);[m
[31m-[m
[31m-/*[m
[31m-**  ---------- info ------------[m
[31m-** |type      flags...  A   cid | size   |  sib  | next  | name  |[m
[31m-** +----------------------------+--------+-------+-------+-------+--[m
[31m-** |NUM       BFvcUL..  A       | size   |       | type  |       |[m
[31m-** |STRUCT    ..vcU..V  A       | size   | field | name? | name? |[m
[31m-** |PTR       ..vcR...  A   cid | size   |       | type  |       |[m
[31m-** |ARRAY     VCvc...V  A   cid | size   |       | type  |       |[m
[31m-** |VOID      ..vc....  A       | size   |       | type  |       |[m
[31m-** |ENUM                A   cid | size   | const | name? | name? |[m
[31m-** |FUNC      ....VS.. cc   cid | nargs  | field | name? | name? |[m
[31m-** |TYPEDEF                 cid |        |       | name  | name  |[m
[31m-** |ATTRIB        attrnum   cid | attr   | sib?  | type? |       |[m
[31m-** |FIELD                   cid | offset | field |       | name? |[m
[31m-** |BITFIELD  B.vcU csz bsz pos | offset | field |       | name? |[m
[31m-** |CONSTVAL     c          cid | value  | const | name  | name  |[m
[31m-** |EXTERN                  cid |        | sib?  | name  | name  |[m
[31m-** |KW                      tok | size   |       | name  | name  |[m
[31m-** +----------------------------+--------+-------+-------+-------+--[m
[31m-**        ^^  ^^--- bits used for C type conversion dispatch[m
[31m-*/[m
[31m-[m
[31m-/* C type info flags.     TFFArrrr  */[m
[31m-#define CTF_BOOL	0x08000000u	/* Boolean: NUM, BITFIELD. */[m
[31m-#define CTF_FP		0x04000000u	/* Floating-point: NUM. */[m
[31m-#define CTF_CONST	0x02000000u	/* Const qualifier. */[m
[31m-#define CTF_VOLATILE	0x01000000u	/* Volatile qualifier. */[m
[31m-#define CTF_UNSIGNED	0x00800000u	/* Unsigned: NUM, BITFIELD. */[m
[31m-#define CTF_LONG	0x00400000u	/* Long: NUM. */[m
[31m-#define CTF_VLA		0x00100000u	/* Variable-length: ARRAY, STRUCT. */[m
[31m-#define CTF_REF		0x00800000u	/* Reference: PTR. */[m
[31m-#define CTF_VECTOR	0x08000000u	/* Vector: ARRAY. */[m
[31m-#define CTF_COMPLEX	0x04000000u	/* Complex: ARRAY. */[m
[31m-#define CTF_UNION	0x00800000u	/* Union: STRUCT. */[m
[31m-#define CTF_VARARG	0x00800000u	/* Vararg: FUNC. */[m
[31m-#define CTF_SSEREGPARM	0x00400000u	/* SSE register parameters: FUNC. */[m
[31m-[m
[31m-#define CTF_QUAL	(CTF_CONST|CTF_VOLATILE)[m
[31m-#define CTF_ALIGN	(CTMASK_ALIGN<<CTSHIFT_ALIGN)[m
[31m-#define CTF_UCHAR	((char)-1 > 0 ? CTF_UNSIGNED : 0)[m
[31m-[m
[31m-/* Flags used in parser.  .F.Ammvf   cp->attr  */[m
[31m-#define CTFP_ALIGNED	0x00000001u	/* cp->attr + ALIGN */[m
[31m-#define CTFP_PACKED	0x00000002u	/* cp->attr */[m
[31m-/*                        ...C...f   cp->fattr */[m
[31m-#define CTFP_CCONV	0x00000001u	/* cp->fattr + CCONV/[SSE]REGPARM */[m
[31m-[m
[31m-/* C type info bitfields. */[m
[31m-#define CTMASK_CID	0x0000ffffu	/* Max. 65536 type IDs. */[m
[31m-#define CTMASK_NUM	0xf0000000u	/* Max. 16 type numbers. */[m
[31m-#define CTSHIFT_NUM	28[m
[31m-#define CTMASK_ALIGN	15		/* Max. alignment is 2^15. */[m
[31m-#define CTSHIFT_ALIGN	16[m
[31m-#define CTMASK_ATTRIB	255		/* Max. 256 attributes. */[m
[31m-#define CTSHIFT_ATTRIB	16[m
[31m-#define CTMASK_CCONV	3		/* Max. 4 calling conventions. */[m
[31m-#define CTSHIFT_CCONV	16[m
[31m-#define CTMASK_REGPARM	3		/* Max. 0-3 regparms. */[m
[31m-#define CTSHIFT_REGPARM	18[m
[31m-/* Bitfields only used in parser. */[m
[31m-#define CTMASK_VSIZEP	15		/* Max. vector size is 2^15. */[m
[31m-#define CTSHIFT_VSIZEP	4[m
[31m-#define CTMASK_MSIZEP	255		/* Max. type size (via mode) is 128. */[m
[31m-#define CTSHIFT_MSIZEP	8[m
[31m-[m
[31m-/* Info bits for BITFIELD. Max. size of bitfield is 64 bits. */[m
[31m-#define CTBSZ_MAX	32		/* Max. size of bitfield is 32 bit. */[m
[31m-#define CTBSZ_FIELD	127		/* Temp. marker for regular field. */[m
[31m-#define CTMASK_BITPOS	127[m
[31m-#define CTMASK_BITBSZ	127[m
[31m-#define CTMASK_BITCSZ	127[m
[31m-#define CTSHIFT_BITPOS	0[m
[31m-#define CTSHIFT_BITBSZ	8[m
[31m-#define CTSHIFT_BITCSZ	16[m
[31m-[m
[31m-#define CTF_INSERT(info, field, val) \[m
[31m-  info = (info & ~(CTMASK_##field<<CTSHIFT_##field)) | \[m
[31m-	  (((CTSize)(val) & CTMASK_##field) << CTSHIFT_##field)[m
[31m-[m
[31m-/* Calling conventions. ORDER CC */[m
[31m-enum { CTCC_CDECL, CTCC_THISCALL, CTCC_FASTCALL, CTCC_STDCALL };[m
[31m-[m
[31m-/* Attribute numbers. */[m
[31m-enum {[m
[31m-  CTA_NONE,		/* Ignored attribute. Must be zero. */[m
[31m-  CTA_QUAL,		/* Unmerged qualifiers. */[m
[31m-  CTA_ALIGN,		/* Alignment override. */[m
[31m-  CTA_SUBTYPE,		/* Transparent sub-type. */[m
[31m-  CTA_REDIR,		/* Redirected symbol name. */[m
[31m-  CTA_BAD,		/* To catch bad IDs. */[m
[31m-  CTA__MAX[m
[31m-};[m
[31m-[m
[31m-/* Special sizes. */[m
[31m-#define CTSIZE_INVALID	0xffffffffu[m
[31m-[m
[31m-typedef uint32_t CTInfo;	/* Type info. */[m
[31m-typedef uint32_t CTSize;	/* Type size. */[m
[31m-typedef uint32_t CTypeID;	/* Type ID. */[m
[31m-typedef uint16_t CTypeID1;	/* Minimum-sized type ID. */[m
[31m-[m
[31m-/* C type table element. */[m
[31m-typedef struct CType {[m
[31m-  CTInfo info;		/* Type info. */[m
[31m-  CTSize size;		/* Type size or other info. */[m
[31m-  CTypeID1 sib;		/* Sibling element. */[m
[31m-  CTypeID1 next;	/* Next element in hash chain. */[m
[31m-  GCRef name;		/* Element name (GCstr). */[m
[31m-} CType;[m
[31m-[m
[31m-#define CTHASH_SIZE	128	/* Number of hash anchors. */[m
[31m-#define CTHASH_MASK	(CTHASH_SIZE-1)[m
[31m-[m
[31m-/* Simplify target-specific configuration. Checked in lj_ccall.h. */[m
[31m-#define CCALL_MAX_GPR		8[m
[31m-#define CCALL_MAX_FPR		8[m
[31m-[m
[31m-typedef LJ_ALIGN(8) union FPRCBArg { double d; float f[2]; } FPRCBArg;[m
[31m-[m
[31m-/* C callback state. Defined here, to avoid dragging in lj_ccall.h. */[m
[31m-[m
[31m-typedef LJ_ALIGN(8) struct CCallback {[m
[31m-  FPRCBArg fpr[CCALL_MAX_FPR];	/* Arguments/results in FPRs. */[m
[31m-  intptr_t gpr[CCALL_MAX_GPR];	/* Arguments/results in GPRs. */[m
[31m-  intptr_t *stack;		/* Pointer to arguments on stack. */[m
[31m-  void *mcode;			/* Machine code for callback func. pointers. */[m
[31m-  CTypeID1 *cbid;		/* Callback type table. */[m
[31m-  MSize sizeid;			/* Size of callback type table. */[m
[31m-  MSize topid;			/* Highest unused callback type table slot. */[m
[31m-  MSize slot;			/* Current callback slot. */[m
[31m-} CCallback;[m
[31m-[m
[31m-/* C type state. */[m
[31m-typedef struct CTState {[m
[31m-  CType *tab;		/* C type table. */[m
[31m-  CTypeID top;		/* Current top of C type table. */[m
[31m-  MSize sizetab;	/* Size of C type table. */[m
[31m-  lua_State *L;		/* Lua state (needed for errors and allocations). */[m
[31m-  global_State *g;	/* Global state. */[m
[31m-  GCtab *finalizer;	/* Map of cdata to finalizer. */[m
[31m-  GCtab *miscmap;	/* Map of -CTypeID to metatable and cb slot to func. */[m
[31m-  CCallback cb;		/* Temporary callback state. */[m
[31m-  CTypeID1 hash[CTHASH_SIZE];  /* Hash anchors for C type table. */[m
[31m-} CTState;[m
[31m-[m
[31m-#define CTINFO(ct, flags)	(((CTInfo)(ct) << CTSHIFT_NUM) + (flags))[m
[31m-#define CTALIGN(al)		((CTSize)(al) << CTSHIFT_ALIGN)[m
[31m-#define CTATTRIB(at)		((CTInfo)(at) << CTSHIFT_ATTRIB)[m
[31m-[m
[31m-#define ctype_type(info)	((info) >> CTSHIFT_NUM)[m
[31m-#define ctype_cid(info)		((CTypeID)((info) & CTMASK_CID))[m
[31m-#define ctype_align(info)	(((info) >> CTSHIFT_ALIGN) & CTMASK_ALIGN)[m
[31m-#define ctype_attrib(info)	(((info) >> CTSHIFT_ATTRIB) & CTMASK_ATTRIB)[m
[31m-#define ctype_bitpos(info)	(((info) >> CTSHIFT_BITPOS) & CTMASK_BITPOS)[m
[31m-#define ctype_bitbsz(info)	(((info) >> CTSHIFT_BITBSZ) & CTMASK_BITBSZ)[m
[31m-#define ctype_bitcsz(info)	(((info) >> CTSHIFT_BITCSZ) & CTMASK_BITCSZ)[m
[31m-#define ctype_vsizeP(info)	(((info) >> CTSHIFT_VSIZEP) & CTMASK_VSIZEP)[m
[31m-#define ctype_msizeP(info)	(((info) >> CTSHIFT_MSIZEP) & CTMASK_MSIZEP)[m
[31m-#define ctype_cconv(info)	(((info) >> CTSHIFT_CCONV) & CTMASK_CCONV)[m
[31m-[m
[31m-/* Simple type checks. */[m
[31m-#define ctype_isnum(info)	(ctype_type((info)) == CT_NUM)[m
[31m-#define ctype_isvoid(info)	(ctype_type((info)) == CT_VOID)[m
[31m-#define ctype_isptr(info)	(ctype_type((info)) == CT_PTR)[m
[31m-#define ctype_isarray(info)	(ctype_type((info)) == CT_ARRAY)[m
[31m-#define ctype_isstruct(info)	(ctype_type((info)) == CT_STRUCT)[m
[31m-#define ctype_isfunc(info)	(ctype_type((info)) == CT_FUNC)[m
[31m-#define ctype_isenum(info)	(ctype_type((info)) == CT_ENUM)[m
[31m-#define ctype_istypedef(info)	(ctype_type((info)) == CT_TYPEDEF)[m
[31m-#define ctype_isattrib(info)	(ctype_type((info)) == CT_ATTRIB)[m
[31m-#define ctype_isfield(info)	(ctype_type((info)) == CT_FIELD)[m
[31m-#define ctype_isbitfield(info)	(ctype_type((info)) == CT_BITFIELD)[m
[31m-#define ctype_isconstval(info)	(ctype_type((info)) == CT_CONSTVAL)[m
[31m-#define ctype_isextern(info)	(ctype_type((info)) == CT_EXTERN)[m
[31m-#define ctype_hassize(info)	(ctype_type((info)) <= CT_HASSIZE)[m
[31m-[m
[31m-/* Combined type and flag checks. */[m
[31m-#define ctype_isinteger(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_BOOL|CTF_FP)) == CTINFO(CT_NUM, 0))[m
[31m-#define ctype_isinteger_or_bool(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_FP)) == CTINFO(CT_NUM, 0))[m
[31m-#define ctype_isbool(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_BOOL)) == CTINFO(CT_NUM, CTF_BOOL))[m
[31m-#define ctype_isfp(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_FP)) == CTINFO(CT_NUM, CTF_FP))[m
[31m-[m
[31m-#define ctype_ispointer(info) \[m
[31m-  ((ctype_type(info) >> 1) == (CT_PTR >> 1))  /* Pointer or array. */[m
[31m-#define ctype_isref(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_REF)) == CTINFO(CT_PTR, CTF_REF))[m
[31m-[m
[31m-#define ctype_isrefarray(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_VECTOR|CTF_COMPLEX)) == CTINFO(CT_ARRAY, 0))[m
[31m-#define ctype_isvector(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_VECTOR)) == CTINFO(CT_ARRAY, CTF_VECTOR))[m
[31m-#define ctype_iscomplex(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_COMPLEX)) == CTINFO(CT_ARRAY, CTF_COMPLEX))[m
[31m-[m
[31m-#define ctype_isvltype(info) \[m
[31m-  (((info) & ((CTMASK_NUM|CTF_VLA) - (2u<<CTSHIFT_NUM))) == \[m
[31m-   CTINFO(CT_STRUCT, CTF_VLA))  /* VL array or VL struct. */[m
[31m-#define ctype_isvlarray(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_VLA)) == CTINFO(CT_ARRAY, CTF_VLA))[m
[31m-[m
[31m-#define ctype_isxattrib(info, at) \[m
[31m-  (((info) & (CTMASK_NUM|CTATTRIB(CTMASK_ATTRIB))) == \[m
[31m-   CTINFO(CT_ATTRIB, CTATTRIB(at)))[m
[31m-[m
[31m-/* Target-dependent sizes and alignments. */[m
[31m-#if LJ_64[m
[31m-#define CTSIZE_PTR	8[m
[31m-#define CTALIGN_PTR	CTALIGN(3)[m
[31m-#else[m
[31m-#define CTSIZE_PTR	4[m
[31m-#define CTALIGN_PTR	CTALIGN(2)[m
[31m-#endif[m
[31m-[m
[31m-#define CTINFO_REF(ref) \[m
[31m-  CTINFO(CT_PTR, (CTF_CONST|CTF_REF|CTALIGN_PTR) + (ref))[m
[31m-[m
[31m-#define CT_MEMALIGN	3	/* Alignment guaranteed by memory allocator. */[m
[31m-[m
[31m-/* -- Predefined types ---------------------------------------------------- */[m
[31m-[m
[31m-/* Target-dependent types. */[m
[31m-#if LJ_TARGET_PPC[m
[31m-#define CTTYDEFP(_) \[m
[31m-  _(LINT32,		4,	CT_NUM, CTF_LONG|CTALIGN(2))[m
[31m-#else[m
[31m-#define CTTYDEFP(_)[m
[31m-#endif[m
[31m-[m
[31m-/* Common types. */[m
[31m-#define CTTYDEF(_) \[m
[31m-  _(NONE,		0,	CT_ATTRIB, CTATTRIB(CTA_BAD)) \[m
[31m-  _(VOID,		-1,	CT_VOID, CTALIGN(0)) \[m
[31m-  _(CVOID,		-1,	CT_VOID, CTF_CONST|CTALIGN(0)) \[m
[31m-  _(BOOL,		1,	CT_NUM, CTF_BOOL|CTF_UNSIGNED|CTALIGN(0)) \[m
[31m-  _(CCHAR,		1,	CT_NUM, CTF_CONST|CTF_UCHAR|CTALIGN(0)) \[m
[31m-  _(INT8,		1,	CT_NUM, CTALIGN(0)) \[m
[31m-  _(UINT8,		1,	CT_NUM, CTF_UNSIGNED|CTALIGN(0)) \[m
[31m-  _(INT16,		2,	CT_NUM, CTALIGN(1)) \[m
[31m-  _(UINT16,		2,	CT_NUM, CTF_UNSIGNED|CTALIGN(1)) \[m
[31m-  _(INT32,		4,	CT_NUM, CTALIGN(2)) \[m
[31m-  _(UINT32,		4,	CT_NUM, CTF_UNSIGNED|CTALIGN(2)) \[m
[31m-  _(INT64,		8,	CT_NUM, CTF_LONG|CTALIGN(3)) \[m
[31m-  _(UINT64,		8,	CT_NUM, CTF_UNSIGNED|CTF_LONG|CTALIGN(3)) \[m
[31m-  _(FLOAT,		4,	CT_NUM, CTF_FP|CTALIGN(2)) \[m
[31m-  _(DOUBLE,		8,	CT_NUM, CTF_FP|CTALIGN(3)) \[m
[31m-  _(COMPLEX_FLOAT,	8,	CT_ARRAY, CTF_COMPLEX|CTALIGN(2)|CTID_FLOAT) \[m
[31m-  _(COMPLEX_DOUBLE,	16,	CT_ARRAY, CTF_COMPLEX|CTALIGN(3)|CTID_DOUBLE) \[m
[31m-  _(P_VOID,	CTSIZE_PTR,	CT_PTR, CTALIGN_PTR|CTID_VOID) \[m
[31m-  _(P_CVOID,	CTSIZE_PTR,	CT_PTR, CTALIGN_PTR|CTID_CVOID) \[m
[31m-  _(P_CCHAR,	CTSIZE_PTR,	CT_PTR, CTALIGN_PTR|CTID_CCHAR) \[m
[31m-  _(A_CCHAR,		-1,	CT_ARRAY, CTF_CONST|CTALIGN(0)|CTID_CCHAR) \[m
[31m-  _(CTYPEID,		4,	CT_ENUM, CTALIGN(2)|CTID_INT32) \[m
[31m-  CTTYDEFP(_) \[m
[31m-  /* End of type list. */[m
[31m-[m
[31m-/* Public predefined type IDs. */[m
[31m-enum {[m
[31m-#define CTTYIDDEF(id, sz, ct, info)	CTID_##id,[m
[31m-CTTYDEF(CTTYIDDEF)[m
[31m-#undef CTTYIDDEF[m
[31m-  /* Predefined typedefs and keywords follow. */[m
[31m-  CTID_MAX = 65536[m
[31m-};[m
[31m-[m
[31m-/* Target-dependent type IDs. */[m
[31m-#if LJ_64[m
[31m-#define CTID_INT_PSZ	CTID_INT64[m
[31m-#define CTID_UINT_PSZ	CTID_UINT64[m
[31m-#else[m
[31m-#define CTID_INT_PSZ	CTID_INT32[m
[31m-#define CTID_UINT_PSZ	CTID_UINT32[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_ABI_WIN[m
[31m-#define CTID_WCHAR	CTID_UINT16[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#define CTID_WCHAR	CTID_LINT32[m
[31m-#else[m
[31m-#define CTID_WCHAR	CTID_INT32[m
[31m-#endif[m
[31m-[m
[31m-/* -- C tokens and keywords ----------------------------------------------- */[m
[31m-[m
[31m-/* C lexer keywords. */[m
[31m-#define CTOKDEF(_) \[m
[31m-  _(IDENT, "<identifier>") _(STRING, "<string>") \[m
[31m-  _(INTEGER, "<integer>") _(EOF, "<eof>") \[m
[31m-  _(OROR, "||") _(ANDAND, "&&") _(EQ, "==") _(NE, "!=") \[m
[31m-  _(LE, "<=") _(GE, ">=") _(SHL, "<<") _(SHR, ">>") _(DEREF, "->")[m
[31m-[m
[31m-/* Simple declaration specifiers. */[m
[31m-#define CDSDEF(_) \[m
[31m-  _(VOID) _(BOOL) _(CHAR) _(INT) _(FP) \[m
[31m-  _(LONG) _(LONGLONG) _(SHORT) _(COMPLEX) _(SIGNED) _(UNSIGNED) \[m
[31m-  _(CONST) _(VOLATILE) _(RESTRICT) _(INLINE) \[m
[31m-  _(TYPEDEF) _(EXTERN) _(STATIC) _(AUTO) _(REGISTER)[m
[31m-[m
[31m-/* C keywords. */[m
[31m-#define CKWDEF(_) \[m
[31m-  CDSDEF(_) _(EXTENSION) _(ASM) _(ATTRIBUTE) \[m
[31m-  _(DECLSPEC) _(CCDECL) _(PTRSZ) \[m
[31m-  _(STRUCT) _(UNION) _(ENUM) \[m
[31m-  _(SIZEOF) _(ALIGNOF)[m
[31m-[m
[31m-/* C token numbers. */[m
[31m-enum {[m
[31m-  CTOK_OFS = 255,[m
[31m-#define CTOKNUM(name, sym)	CTOK_##name,[m
[31m-#define CKWNUM(name)		CTOK_##name,[m
[31m-CTOKDEF(CTOKNUM)[m
[31m-CKWDEF(CKWNUM)[m
[31m-#undef CTOKNUM[m
[31m-#undef CKWNUM[m
[31m-  CTOK_FIRSTDECL = CTOK_VOID,[m
[31m-  CTOK_FIRSTSCL = CTOK_TYPEDEF,[m
[31m-  CTOK_LASTDECLFLAG = CTOK_REGISTER,[m
[31m-  CTOK_LASTDECL = CTOK_ENUM[m
[31m-};[m
[31m-[m
[31m-/* Declaration specifier flags. */[m
[31m-enum {[m
[31m-#define CDSFLAG(name)	CDF_##name = (1u << (CTOK_##name - CTOK_FIRSTDECL)),[m
[31m-CDSDEF(CDSFLAG)[m
[31m-#undef CDSFLAG[m
[31m-  CDF__END[m
[31m-};[m
[31m-[m
[31m-#define CDF_SCL  (CDF_TYPEDEF|CDF_EXTERN|CDF_STATIC|CDF_AUTO|CDF_REGISTER)[m
[31m-[m
[31m-/* -- C type management --------------------------------------------------- */[m
[31m-[m
[31m-#define ctype_ctsG(g)		(mref((g)->ctype_state, CTState))[m
[31m-[m
[31m-/* Get C type state. */[m
[31m-static LJ_AINLINE CTState *ctype_cts(lua_State *L)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(G(L));[m
[31m-  cts->L = L;  /* Save L for errors and allocations. */[m
[31m-  return cts;[m
[31m-}[m
[31m-[m
[31m-/* Save and restore state of C type table. */[m
[31m-#define LJ_CTYPE_SAVE(cts)	CTState savects_ = *(cts)[m
[31m-#define LJ_CTYPE_RESTORE(cts) \[m
[31m-  ((cts)->top = savects_.top, \[m
[31m-   memcpy((cts)->hash, savects_.hash, sizeof(savects_.hash)))[m
[31m-[m
[31m-/* Check C type ID for validity when assertions are enabled. */[m
[31m-static LJ_AINLINE CTypeID ctype_check(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  lua_assert(id > 0 && id < cts->top); UNUSED(cts);[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-/* Get C type for C type ID. */[m
[31m-static LJ_AINLINE CType *ctype_get(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  return &cts->tab[ctype_check(cts, id)];[m
[31m-}[m
[31m-[m
[31m-/* Get C type ID for a C type. */[m
[31m-#define ctype_typeid(cts, ct)	((CTypeID)((ct) - (cts)->tab))[m
[31m-[m
[31m-/* Get child C type. */[m
[31m-static LJ_AINLINE CType *ctype_child(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  lua_assert(!(ctype_isvoid(ct->info) || ctype_isstruct(ct->info) ||[m
[31m-	     ctype_isbitfield(ct->info)));  /* These don't have children. */[m
[31m-  return ctype_get(cts, ctype_cid(ct->info));[m
[31m-}[m
[31m-[m
[31m-/* Get raw type for a C type ID. */[m
[31m-static LJ_AINLINE CType *ctype_raw(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_get(cts, id);[m
[31m-  while (ctype_isattrib(ct->info)) ct = ctype_child(cts, ct);[m
[31m-  return ct;[m
[31m-}[m
[31m-[m
[31m-/* Get raw type of the child of a C type. */[m
[31m-static LJ_AINLINE CType *ctype_rawchild(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  do { ct = ctype_child(cts, ct); } while (ctype_isattrib(ct->info));[m
[31m-  return ct;[m
[31m-}[m
[31m-[m
[31m-/* Set the name of a C type table element. */[m
[31m-static LJ_AINLINE void ctype_setname(CType *ct, GCstr *s)[m
[31m-{[m
[31m-  /* NOBARRIER: mark string as fixed -- the C type table is never collected. */[m
[31m-  fixstring(s);[m
[31m-  setgcref(ct->name, obj2gco(s));[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC CTypeID lj_ctype_new(CTState *cts, CType **ctp);[m
[31m-LJ_FUNC CTypeID lj_ctype_intern(CTState *cts, CTInfo info, CTSize size);[m
[31m-LJ_FUNC void lj_ctype_addname(CTState *cts, CType *ct, CTypeID id);[m
[31m-LJ_FUNC CTypeID lj_ctype_getname(CTState *cts, CType **ctp, GCstr *name,[m
[31m-				 uint32_t tmask);[m
[31m-LJ_FUNC CType *lj_ctype_getfieldq(CTState *cts, CType *ct, GCstr *name,[m
[31m-				  CTSize *ofs, CTInfo *qual);[m
[31m-#define lj_ctype_getfield(cts, ct, name, ofs) \[m
[31m-  lj_ctype_getfieldq((cts), (ct), (name), (ofs), NULL)[m
[31m-LJ_FUNC CType *lj_ctype_rawref(CTState *cts, CTypeID id);[m
[31m-LJ_FUNC CTSize lj_ctype_size(CTState *cts, CTypeID id);[m
[31m-LJ_FUNC CTSize lj_ctype_vlsize(CTState *cts, CType *ct, CTSize nelem);[m
[31m-LJ_FUNC CTInfo lj_ctype_info(CTState *cts, CTypeID id, CTSize *szp);[m
[31m-LJ_FUNC cTValue *lj_ctype_meta(CTState *cts, CTypeID id, MMS mm);[m
[31m-LJ_FUNC GCstr *lj_ctype_repr(lua_State *L, CTypeID id, GCstr *name);[m
[31m-LJ_FUNC GCstr *lj_ctype_repr_int64(lua_State *L, uint64_t n, int isunsigned);[m
[31m-LJ_FUNC GCstr *lj_ctype_repr_complex(lua_State *L, void *sp, CTSize size);[m
[31m-LJ_FUNC CTState *lj_ctype_init(lua_State *L);[m
[31m-LJ_FUNC void lj_ctype_freestate(global_State *g);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.c[m
[1mdeleted file mode 100644[m
[1mindex 30d1601..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.c[m
[1m+++ /dev/null[m
[36m@@ -1,824 +0,0 @@[m
[31m-/*[m
[31m-** Debugging and introspection.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_debug_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#endif[m
[31m-[m
[31m-/* -- Frames -------------------------------------------------------------- */[m
[31m-[m
[31m-/* Get frame corresponding to a level. */[m
[31m-cTValue *lj_debug_frame(lua_State *L, int level, int *size)[m
[31m-{[m
[31m-  cTValue *frame, *nextframe, *bot = tvref(L->stack)+LJ_FR2;[m
[31m-  /* Traverse frames backwards. */[m
[31m-  for (nextframe = frame = L->base-1; frame > bot; ) {[m
[31m-    if (frame_gc(frame) == obj2gco(L))[m
[31m-      level++;  /* Skip dummy frames. See lj_err_optype_call(). */[m
[31m-    if (level-- == 0) {[m
[31m-      *size = (int)(nextframe - frame);[m
[31m-      return frame;  /* Level found. */[m
[31m-    }[m
[31m-    nextframe = frame;[m
[31m-    if (frame_islua(frame)) {[m
[31m-      frame = frame_prevl(frame);[m
[31m-    } else {[m
[31m-      if (frame_isvarg(frame))[m
[31m-	level++;  /* Skip vararg pseudo-frame. */[m
[31m-      frame = frame_prevd(frame);[m
[31m-    }[m
[31m-  }[m
[31m-  *size = level;[m
[31m-  return NULL;  /* Level not found. */[m
[31m-}[m
[31m-[m
[31m-/* Invalid bytecode position. */[m
[31m-#define NO_BCPOS	(~(BCPos)0)[m
[31m-[m
[31m-/* Return bytecode position for function/frame or NO_BCPOS. */[m
[31m-static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)[m
[31m-{[m
[31m-  const BCIns *ins;[m
[31m-  GCproto *pt;[m
[31m-  BCPos pos;[m
[31m-  lua_assert(fn->c.gct == ~LJ_TFUNC || fn->c.gct == ~LJ_TTHREAD);[m
[31m-  if (!isluafunc(fn)) {  /* Cannot derive a PC for non-Lua functions. */[m
[31m-    return NO_BCPOS;[m
[31m-  } else if (nextframe == NULL) {  /* Lua function on top. */[m
[31m-    void *cf = cframe_raw(L->cframe);[m
[31m-    if (cf == NULL || (char *)cframe_pc(cf) == (char *)cframe_L(cf))[m
[31m-      return NO_BCPOS;[m
[31m-    ins = cframe_pc(cf);  /* Only happens during error/hook handling. */[m
[31m-  } else {[m
[31m-    if (frame_islua(nextframe)) {[m
[31m-      ins = frame_pc(nextframe);[m
[31m-    } else if (frame_iscont(nextframe)) {[m
[31m-      ins = frame_contpc(nextframe);[m
[31m-    } else {[m
[31m-      /* Lua function below errfunc/gc/hook: find cframe to get the PC. */[m
[31m-      void *cf = cframe_raw(L->cframe);[m
[31m-      TValue *f = L->base-1;[m
[31m-      for (;;) {[m
[31m-	if (cf == NULL)[m
[31m-	  return NO_BCPOS;[m
[31m-	while (cframe_nres(cf) < 0) {[m
[31m-	  if (f >= restorestack(L, -cframe_nres(cf)))[m
[31m-	    break;[m
[31m-	  cf = cframe_raw(cframe_prev(cf));[m
[31m-	  if (cf == NULL)[m
[31m-	    return NO_BCPOS;[m
[31m-	}[m
[31m-	if (f < nextframe)[m
[31m-	  break;[m
[31m-	if (frame_islua(f)) {[m
[31m-	  f = frame_prevl(f);[m
[31m-	} else {[m
[31m-	  if (frame_isc(f) || (frame_iscont(f) && frame_iscont_fficb(f)))[m
[31m-	    cf = cframe_raw(cframe_prev(cf));[m
[31m-	  f = frame_prevd(f);[m
[31m-	}[m
[31m-      }[m
[31m-      ins = cframe_pc(cf);[m
[31m-    }[m
[31m-  }[m
[31m-  pt = funcproto(fn);[m
[31m-  pos = proto_bcpos(pt, ins) - 1;[m
[31m-#if LJ_HASJIT[m
[31m-  if (pos > pt->sizebc) {  /* Undo the effects of lj_trace_exit for JLOOP. */[m
[31m-    GCtrace *T = (GCtrace *)((char *)(ins-1) - offsetof(GCtrace, startins));[m
[31m-    lua_assert(bc_isret(bc_op(ins[-1])));[m
[31m-    pos = proto_bcpos(pt, mref(T->startpc, const BCIns));[m
[31m-  }[m
[31m-#endif[m
[31m-  return pos;[m
[31m-}[m
[31m-[m
[31m-/* -- Line numbers -------------------------------------------------------- */[m
[31m-[m
[31m-/* Get line number for a bytecode position. */[m
[31m-BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc)[m
[31m-{[m
[31m-  const void *lineinfo = proto_lineinfo(pt);[m
[31m-  if (pc <= pt->sizebc && lineinfo) {[m
[31m-    BCLine first = pt->firstline;[m
[31m-    if (pc == pt->sizebc) return first + pt->numline;[m
[31m-    if (pc-- == 0) return first;[m
[31m-    if (pt->numline < 256)[m
[31m-      return first + (BCLine)((const uint8_t *)lineinfo)[pc];[m
[31m-    else if (pt->numline < 65536)[m
[31m-      return first + (BCLine)((const uint16_t *)lineinfo)[pc];[m
[31m-    else[m
[31m-      return first + (BCLine)((const uint32_t *)lineinfo)[pc];[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Get line number for function/frame. */[m
[31m-static BCLine debug_frameline(lua_State *L, GCfunc *fn, cTValue *nextframe)[m
[31m-{[m
[31m-  BCPos pc = debug_framepc(L, fn, nextframe);[m
[31m-  if (pc != NO_BCPOS) {[m
[31m-    GCproto *pt = funcproto(fn);[m
[31m-    lua_assert(pc <= pt->sizebc);[m
[31m-    return lj_debug_line(pt, pc);[m
[31m-  }[m
[31m-  return -1;[m
[31m-}[m
[31m-[m
[31m-/* -- Variable names ------------------------------------------------------ */[m
[31m-[m
[31m-/* Get name of a local variable from slot number and PC. */[m
[31m-static const char *debug_varname(const GCproto *pt, BCPos pc, BCReg slot)[m
[31m-{[m
[31m-  const char *p = (const char *)proto_varinfo(pt);[m
[31m-  if (p) {[m
[31m-    BCPos lastpc = 0;[m
[31m-    for (;;) {[m
[31m-      const char *name = p;[m
[31m-      uint32_t vn = *(const uint8_t *)p;[m
[31m-      BCPos startpc, endpc;[m
[31m-      if (vn < VARNAME__MAX) {[m
[31m-	if (vn == VARNAME_END) break;  /* End of varinfo. */[m
[31m-      } else {[m
[31m-	do { p++; } while (*(const uint8_t *)p);  /* Skip over variable name. */[m
[31m-      }[m
[31m-      p++;[m
[31m-      lastpc = startpc = lastpc + lj_buf_ruleb128(&p);[m
[31m-      if (startpc > pc) break;[m
[31m-      endpc = startpc + lj_buf_ruleb128(&p);[m
[31m-      if (pc < endpc && slot-- == 0) {[m
[31m-	if (vn < VARNAME__MAX) {[m
[31m-#define VARNAMESTR(name, str)	str "\0"[m
[31m-	  name = VARNAMEDEF(VARNAMESTR);[m
[31m-#undef VARNAMESTR[m
[31m-	  if (--vn) while (*name++ || --vn) ;[m
[31m-	}[m
[31m-	return name;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Get name of local variable from 1-based slot number and function/frame. */[m
[31m-static TValue *debug_localname(lua_State *L, const lua_Debug *ar,[m
[31m-			       const char **name, BCReg slot1)[m
[31m-{[m
[31m-  uint32_t offset = (uint32_t)ar->i_ci & 0xffff;[m
[31m-  uint32_t size = (uint32_t)ar->i_ci >> 16;[m
[31m-  TValue *frame = tvref(L->stack) + offset;[m
[31m-  TValue *nextframe = size ? frame + size : NULL;[m
[31m-  GCfunc *fn = frame_func(frame);[m
[31m-  BCPos pc = debug_framepc(L, fn, nextframe);[m
[31m-  if (!nextframe) nextframe = L->top+LJ_FR2;[m
[31m-  if ((int)slot1 < 0) {  /* Negative slot number is for varargs. */[m
[31m-    if (pc != NO_BCPOS) {[m
[31m-      GCproto *pt = funcproto(fn);[m
[31m-      if ((pt->flags & PROTO_VARARG)) {[m
[31m-	slot1 = pt->numparams + (BCReg)(-(int)slot1);[m
[31m-	if (frame_isvarg(frame)) {  /* Vararg frame has been set up? (pc!=0) */[m
[31m-	  nextframe = frame;[m
[31m-	  frame = frame_prevd(frame);[m
[31m-	}[m
[31m-	if (frame + slot1+LJ_FR2 < nextframe) {[m
[31m-	  *name = "(*vararg)";[m
[31m-	  return frame+slot1;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  if (pc != NO_BCPOS &&[m
[31m-      (*name = debug_varname(funcproto(fn), pc, slot1-1)) != NULL)[m
[31m-    ;[m
[31m-  else if (slot1 > 0 && frame + slot1+LJ_FR2 < nextframe)[m
[31m-    *name = "(*temporary)";[m
[31m-  return frame+slot1;[m
[31m-}[m
[31m-[m
[31m-/* Get name of upvalue. */[m
[31m-const char *lj_debug_uvname(GCproto *pt, uint32_t idx)[m
[31m-{[m
[31m-  const uint8_t *p = proto_uvinfo(pt);[m
[31m-  lua_assert(idx < pt->sizeuv);[m
[31m-  if (!p) return "";[m
[31m-  if (idx) while (*p++ || --idx) ;[m
[31m-  return (const char *)p;[m
[31m-}[m
[31m-[m
[31m-/* Get name and value of upvalue. */[m
[31m-const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp)[m
[31m-{[m
[31m-  if (tvisfunc(o)) {[m
[31m-    GCfunc *fn = funcV(o);[m
[31m-    if (isluafunc(fn)) {[m
[31m-      GCproto *pt = funcproto(fn);[m
[31m-      if (idx < pt->sizeuv) {[m
[31m-	*tvp = uvval(&gcref(fn->l.uvptr[idx])->uv);[m
[31m-	return lj_debug_uvname(pt, idx);[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (idx < fn->c.nupvalues) {[m
[31m-	*tvp = &fn->c.upvalue[idx];[m
[31m-	return "";[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Deduce name of an object from slot number and PC. */[m
[31m-const char *lj_debug_slotname(GCproto *pt, const BCIns *ip, BCReg slot,[m
[31m-			      const char **name)[m
[31m-{[m
[31m-  const char *lname;[m
[31m-restart:[m
[31m-  lname = debug_varname(pt, proto_bcpos(pt, ip), slot);[m
[31m-  if (lname != NULL) { *name = lname; return "local"; }[m
[31m-  while (--ip > proto_bc(pt)) {[m
[31m-    BCIns ins = *ip;[m
[31m-    BCOp op = bc_op(ins);[m
[31m-    BCReg ra = bc_a(ins);[m
[31m-    if (bcmode_a(op) == BCMbase) {[m
[31m-      if (slot >= ra && (op != BC_KNIL || slot <= bc_d(ins)))[m
[31m-	return NULL;[m
[31m-    } else if (bcmode_a(op) == BCMdst && ra == slot) {[m
[31m-      switch (bc_op(ins)) {[m
[31m-      case BC_MOV:[m
[31m-	if (ra == slot) { slot = bc_d(ins); goto restart; }[m
[31m-	break;[m
[31m-      case BC_GGET:[m
[31m-	*name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_d(ins))));[m
[31m-	return "global";[m
[31m-      case BC_TGETS:[m
[31m-	*name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_c(ins))));[m
[31m-	if (ip > proto_bc(pt)) {[m
[31m-	  BCIns insp = ip[-1];[m
[31m-	  if (bc_op(insp) == BC_MOV && bc_a(insp) == ra+1+LJ_FR2 &&[m
[31m-	      bc_d(insp) == bc_b(ins))[m
[31m-	    return "method";[m
[31m-	}[m
[31m-	return "field";[m
[31m-      case BC_UGET:[m
[31m-	*name = lj_debug_uvname(pt, bc_d(ins));[m
[31m-	return "upvalue";[m
[31m-      default:[m
[31m-	return NULL;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Deduce function name from caller of a frame. */[m
[31m-const char *lj_debug_funcname(lua_State *L, cTValue *frame, const char **name)[m
[31m-{[m
[31m-  cTValue *pframe;[m
[31m-  GCfunc *fn;[m
[31m-  BCPos pc;[m
[31m-  if (frame <= tvref(L->stack)+LJ_FR2)[m
[31m-    return NULL;[m
[31m-  if (frame_isvarg(frame))[m
[31m-    frame = frame_prevd(frame);[m
[31m-  pframe = frame_prev(frame);[m
[31m-  fn = frame_func(pframe);[m
[31m-  pc = debug_framepc(L, fn, frame);[m
[31m-  if (pc != NO_BCPOS) {[m
[31m-    GCproto *pt = funcproto(fn);[m
[31m-    const BCIns *ip = &proto_bc(pt)[check_exp(pc < pt->sizebc, pc)];[m
[31m-    MMS mm = bcmode_mm(bc_op(*ip));[m
[31m-    if (mm == MM_call) {[m
[31m-      BCReg slot = bc_a(*ip);[m
[31m-      if (bc_op(*ip) == BC_ITERC) slot -= 3;[m
[31m-      return lj_debug_slotname(pt, ip, slot, name);[m
[31m-    } else if (mm != MM__MAX) {[m
[31m-      *name = strdata(mmname_str(G(L), mm));[m
[31m-      return "metamethod";[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- Source code locations ----------------------------------------------- */[m
[31m-[m
[31m-/* Generate shortened source name. */[m
[31m-void lj_debug_shortname(char *out, GCstr *str, BCLine line)[m
[31m-{[m
[31m-  const char *src = strdata(str);[m
[31m-  if (*src == '=') {[m
[31m-    strncpy(out, src+1, LUA_IDSIZE);  /* Remove first char. */[m
[31m-    out[LUA_IDSIZE-1] = '\0';  /* Ensures null termination. */[m
[31m-  } else if (*src == '@') {  /* Output "source", or "...source". */[m
[31m-    size_t len = str->len-1;[m
[31m-    src++;  /* Skip the `@' */[m
[31m-    if (len >= LUA_IDSIZE) {[m
[31m-      src += len-(LUA_IDSIZE-4);  /* Get last part of file name. */[m
[31m-      *out++ = '.'; *out++ = '.'; *out++ = '.';[m
[31m-    }[m
[31m-    strcpy(out, src);[m
[31m-  } else {  /* Output [string "string"] or [builtin:name]. */[m
[31m-    size_t len;  /* Length, up to first control char. */[m
[31m-    for (len = 0; len < LUA_IDSIZE-12; len++)[m
[31m-      if (((const unsigned char *)src)[len] < ' ') break;[m
[31m-    strcpy(out, line == ~(BCLine)0 ? "[builtin:" : "[string \""); out += 9;[m
[31m-    if (src[len] != '\0') {  /* Must truncate? */[m
[31m-      if (len > LUA_IDSIZE-15) len = LUA_IDSIZE-15;[m
[31m-      strncpy(out, src, len); out += len;[m
[31m-      strcpy(out, "..."); out += 3;[m
[31m-    } else {[m
[31m-      strcpy(out, src); out += len;[m
[31m-    }[m
[31m-    strcpy(out, line == ~(BCLine)0 ? "]" : "\"]");[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Add current location of a frame to error message. */[m
[31m-void lj_debug_addloc(lua_State *L, const char *msg,[m
[31m-		     cTValue *frame, cTValue *nextframe)[m
[31m-{[m
[31m-  if (frame) {[m
[31m-    GCfunc *fn = frame_func(frame);[m
[31m-    if (isluafunc(fn)) {[m
[31m-      BCLine line = debug_frameline(L, fn, nextframe);[m
[31m-      if (line >= 0) {[m
[31m-	GCproto *pt = funcproto(fn);[m
[31m-	char buf[LUA_IDSIZE];[m
[31m-	lj_debug_shortname(buf, proto_chunkname(pt), pt->firstline);[m
[31m-	lj_strfmt_pushf(L, "%s:%d: %s", buf, line, msg);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lj_strfmt_pushf(L, "%s", msg);[m
[31m-}[m
[31m-[m
[31m-/* Push location string for a bytecode position to Lua stack. */[m
[31m-void lj_debug_pushloc(lua_State *L, GCproto *pt, BCPos pc)[m
[31m-{[m
[31m-  GCstr *name = proto_chunkname(pt);[m
[31m-  const char *s = strdata(name);[m
[31m-  MSize i, len = name->len;[m
[31m-  BCLine line = lj_debug_line(pt, pc);[m
[31m-  if (pt->firstline == ~(BCLine)0) {[m
[31m-    lj_strfmt_pushf(L, "builtin:%s", s);[m
[31m-  } else if (*s == '@') {[m
[31m-    s++; len--;[m
[31m-    for (i = len; i > 0; i--)[m
[31m-      if (s[i] == '/' || s[i] == '\\') {[m
[31m-	s += i+1;[m
[31m-	break;[m
[31m-      }[m
[31m-    lj_strfmt_pushf(L, "%s:%d", s, line);[m
[31m-  } else if (len > 40) {[m
[31m-    lj_strfmt_pushf(L, "%p:%d", pt, line);[m
[31m-  } else if (*s == '=') {[m
[31m-    lj_strfmt_pushf(L, "%s:%d", s+1, line);[m
[31m-  } else {[m
[31m-    lj_strfmt_pushf(L, "\"%s\":%d", s, line);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Public debug API ---------------------------------------------------- */[m
[31m-[m
[31m-/* lua_getupvalue() and lua_setupvalue() are in lj_api.c. */[m
[31m-[m
[31m-LUA_API const char *lua_getlocal(lua_State *L, const lua_Debug *ar, int n)[m
[31m-{[m
[31m-  const char *name = NULL;[m
[31m-  if (ar) {[m
[31m-    TValue *o = debug_localname(L, ar, &name, (BCReg)n);[m
[31m-    if (name) {[m
[31m-      copyTV(L, L->top, o);[m
[31m-      incr_top(L);[m
[31m-    }[m
[31m-  } else if (tvisfunc(L->top-1) && isluafunc(funcV(L->top-1))) {[m
[31m-    name = debug_varname(funcproto(funcV(L->top-1)), 0, (BCReg)n-1);[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_setlocal(lua_State *L, const lua_Debug *ar, int n)[m
[31m-{[m
[31m-  const char *name = NULL;[m
[31m-  TValue *o = debug_localname(L, ar, &name, (BCReg)n);[m
[31m-  if (name)[m
[31m-    copyTV(L, o, L->top-1);[m
[31m-  L->top--;[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-int lj_debug_getinfo(lua_State *L, const char *what, lj_Debug *ar, int ext)[m
[31m-{[m
[31m-  int opt_f = 0, opt_L = 0;[m
[31m-  TValue *frame = NULL;[m
[31m-  TValue *nextframe = NULL;[m
[31m-  GCfunc *fn;[m
[31m-  if (*what == '>') {[m
[31m-    TValue *func = L->top - 1;[m
[31m-    api_check(L, tvisfunc(func));[m
[31m-    fn = funcV(func);[m
[31m-    L->top--;[m
[31m-    what++;[m
[31m-  } else {[m
[31m-    uint32_t offset = (uint32_t)ar->i_ci & 0xffff;[m
[31m-    uint32_t size = (uint32_t)ar->i_ci >> 16;[m
[31m-    lua_assert(offset != 0);[m
[31m-    frame = tvref(L->stack) + offset;[m
[31m-    if (size) nextframe = frame + size;[m
[31m-    lua_assert(frame <= tvref(L->maxstack) &&[m
[31m-	       (!nextframe || nextframe <= tvref(L->maxstack)));[m
[31m-    fn = frame_func(frame);[m
[31m-    lua_assert(fn->c.gct == ~LJ_TFUNC);[m
[31m-  }[m
[31m-  for (; *what; what++) {[m
[31m-    if (*what == 'S') {[m
[31m-      if (isluafunc(fn)) {[m
[31m-	GCproto *pt = funcproto(fn);[m
[31m-	BCLine firstline = pt->firstline;[m
[31m-	GCstr *name = proto_chunkname(pt);[m
[31m-	ar->source = strdata(name);[m
[31m-	lj_debug_shortname(ar->short_src, name, pt->firstline);[m
[31m-	ar->linedefined = (int)firstline;[m
[31m-	ar->lastlinedefined = (int)(firstline + pt->numline);[m
[31m-	ar->what = (firstline || !pt->numline) ? "Lua" : "main";[m
[31m-      } else {[m
[31m-	ar->source = "=[C]";[m
[31m-	ar->short_src[0] = '[';[m
[31m-	ar->short_src[1] = 'C';[m
[31m-	ar->short_src[2] = ']';[m
[31m-	ar->short_src[3] = '\0';[m
[31m-	ar->linedefined = -1;[m
[31m-	ar->lastlinedefined = -1;[m
[31m-	ar->what = "C";[m
[31m-      }[m
[31m-    } else if (*what == 'l') {[m
[31m-      ar->currentline = frame ? debug_frameline(L, fn, nextframe) : -1;[m
[31m-    } else if (*what == 'u') {[m
[31m-      ar->nups = fn->c.nupvalues;[m
[31m-      if (ext) {[m
[31m-	if (isluafunc(fn)) {[m
[31m-	  GCproto *pt = funcproto(fn);[m
[31m-	  ar->nparams = pt->numparams;[m
[31m-	  ar->isvararg = !!(pt->flags & PROTO_VARARG);[m
[31m-	} else {[m
[31m-	  ar->nparams = 0;[m
[31m-	  ar->isvararg = 1;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (*what == 'n') {[m
[31m-      ar->namewhat = frame ? lj_debug_funcname(L, frame, &ar->name) : NULL;[m
[31m-      if (ar->namewhat == NULL) {[m
[31m-	ar->namewhat = "";[m
[31m-	ar->name = NULL;[m
[31m-      }[m
[31m-    } else if (*what == 'f') {[m
[31m-      opt_f = 1;[m
[31m-    } else if (*what == 'L') {[m
[31m-      opt_L = 1;[m
[31m-    } else {[m
[31m-      return 0;  /* Bad option. */[m
[31m-    }[m
[31m-  }[m
[31m-  if (opt_f) {[m
[31m-    setfuncV(L, L->top, fn);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  if (opt_L) {[m
[31m-    if (isluafunc(fn)) {[m
[31m-      GCtab *t = lj_tab_new(L, 0, 0);[m
[31m-      GCproto *pt = funcproto(fn);[m
[31m-      const void *lineinfo = proto_lineinfo(pt);[m
[31m-      if (lineinfo) {[m
[31m-	BCLine first = pt->firstline;[m
[31m-	int sz = pt->numline < 256 ? 1 : pt->numline < 65536 ? 2 : 4;[m
[31m-	MSize i, szl = pt->sizebc-1;[m
[31m-	for (i = 0; i < szl; i++) {[m
[31m-	  BCLine line = first +[m
[31m-	    (sz == 1 ? (BCLine)((const uint8_t *)lineinfo)[i] :[m
[31m-	     sz == 2 ? (BCLine)((const uint16_t *)lineinfo)[i] :[m
[31m-	     (BCLine)((const uint32_t *)lineinfo)[i]);[m
[31m-	  setboolV(lj_tab_setint(L, t, line), 1);[m
[31m-	}[m
[31m-      }[m
[31m-      settabV(L, L->top, t);[m
[31m-    } else {[m
[31m-      setnilV(L->top);[m
[31m-    }[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  return 1;  /* Ok. */[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar)[m
[31m-{[m
[31m-  return lj_debug_getinfo(L, what, (lj_Debug *)ar, 0);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_getstack(lua_State *L, int level, lua_Debug *ar)[m
[31m-{[m
[31m-  int size;[m
[31m-  cTValue *frame = lj_debug_frame(L, level, &size);[m
[31m-  if (frame) {[m
[31m-    ar->i_ci = (size << 16) + (int)(frame - tvref(L->stack));[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    ar->i_ci = level - size;[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-/* Put the chunkname into a buffer. */[m
[31m-static int debug_putchunkname(SBuf *sb, GCproto *pt, int pathstrip)[m
[31m-{[m
[31m-  GCstr *name = proto_chunkname(pt);[m
[31m-  const char *p = strdata(name);[m
[31m-  if (pt->firstline == ~(BCLine)0) {[m
[31m-    lj_buf_putmem(sb, "[builtin:", 9);[m
[31m-    lj_buf_putstr(sb, name);[m
[31m-    lj_buf_putb(sb, ']');[m
[31m-    return 0;[m
[31m-  }[m
[31m-  if (*p == '=' || *p == '@') {[m
[31m-    MSize len = name->len-1;[m
[31m-    p++;[m
[31m-    if (pathstrip) {[m
[31m-      int i;[m
[31m-      for (i = len-1; i >= 0; i--)[m
[31m-	if (p[i] == '/' || p[i] == '\\') {[m
[31m-	  len -= i+1;[m
[31m-	  p = p+i+1;[m
[31m-	  break;[m
[31m-	}[m
[31m-    }[m
[31m-    lj_buf_putmem(sb, p, len);[m
[31m-  } else {[m
[31m-    lj_buf_putmem(sb, "[string]", 8);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Put a compact stack dump into a buffer. */[m
[31m-void lj_debug_dumpstack(lua_State *L, SBuf *sb, const char *fmt, int depth)[m
[31m-{[m
[31m-  int level = 0, dir = 1, pathstrip = 1;[m
[31m-  MSize lastlen = 0;[m
[31m-  if (depth < 0) { level = ~depth; depth = dir = -1; }  /* Reverse frames. */[m
[31m-  while (level != depth) {  /* Loop through all frame. */[m
[31m-    int size;[m
[31m-    cTValue *frame = lj_debug_frame(L, level, &size);[m
[31m-    if (frame) {[m
[31m-      cTValue *nextframe = size ? frame+size : NULL;[m
[31m-      GCfunc *fn = frame_func(frame);[m
[31m-      const uint8_t *p = (const uint8_t *)fmt;[m
[31m-      int c;[m
[31m-      while ((c = *p++)) {[m
[31m-	switch (c) {[m
[31m-	case 'p':  /* Preserve full path. */[m
[31m-	  pathstrip = 0;[m
[31m-	  break;[m
[31m-	case 'F': case 'f': {  /* Dump function name. */[m
[31m-	  const char *name;[m
[31m-	  const char *what = lj_debug_funcname(L, frame, &name);[m
[31m-	  if (what) {[m
[31m-	    if (c == 'F' && isluafunc(fn)) {  /* Dump module:name for 'F'. */[m
[31m-	      GCproto *pt = funcproto(fn);[m
[31m-	      if (pt->firstline != ~(BCLine)0) {  /* Not a bytecode builtin. */[m
[31m-		debug_putchunkname(sb, pt, pathstrip);[m
[31m-		lj_buf_putb(sb, ':');[m
[31m-	      }[m
[31m-	    }[m
[31m-	    lj_buf_putmem(sb, name, (MSize)strlen(name));[m
[31m-	    break;[m
[31m-	  }  /* else: can't derive a name, dump module:line. */[m
[31m-	  }[m
[31m-	  /* fallthrough */[m
[31m-	case 'l':  /* Dump module:line. */[m
[31m-	  if (isluafunc(fn)) {[m
[31m-	    GCproto *pt = funcproto(fn);[m
[31m-	    if (debug_putchunkname(sb, pt, pathstrip)) {[m
[31m-	      /* Regular Lua function. */[m
[31m-	      BCLine line = c == 'l' ? debug_frameline(L, fn, nextframe) :[m
[31m-				       pt->firstline;[m
[31m-	      lj_buf_putb(sb, ':');[m
[31m-	      lj_strfmt_putint(sb, line >= 0 ? line : pt->firstline);[m
[31m-	    }[m
[31m-	  } else if (isffunc(fn)) {  /* Dump numbered builtins. */[m
[31m-	    lj_buf_putmem(sb, "[builtin#", 9);[m
[31m-	    lj_strfmt_putint(sb, fn->c.ffid);[m
[31m-	    lj_buf_putb(sb, ']');[m
[31m-	  } else {  /* Dump C function address. */[m
[31m-	    lj_buf_putb(sb, '@');[m
[31m-	    lj_strfmt_putptr(sb, fn->c.f);[m
[31m-	  }[m
[31m-	  break;[m
[31m-	case 'Z':  /* Zap trailing separator. */[m
[31m-	  lastlen = sbuflen(sb);[m
[31m-	  break;[m
[31m-	default:[m
[31m-	  lj_buf_putb(sb, c);[m
[31m-	  break;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (dir == 1) {[m
[31m-      break;[m
[31m-    } else {[m
[31m-      level -= size;  /* Reverse frame order: quickly skip missing level. */[m
[31m-    }[m
[31m-    level += dir;[m
[31m-  }[m
[31m-  if (lastlen)[m
[31m-    setsbufP(sb, sbufB(sb) + lastlen);  /* Zap trailing separator. */[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Number of frames for the leading and trailing part of a traceback. */[m
[31m-#define TRACEBACK_LEVELS1	12[m
[31m-#define TRACEBACK_LEVELS2	10[m
[31m-[m
[31m-LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,[m
[31m-				int level)[m
[31m-{[m
[31m-  int top = (int)(L->top - L->base);[m
[31m-  int lim = TRACEBACK_LEVELS1;[m
[31m-  lua_Debug ar;[m
[31m-  if (msg) lua_pushfstring(L, "%s\n", msg);[m
[31m-  lua_pushliteral(L, "stack traceback:");[m
[31m-  while (lua_getstack(L1, level++, &ar)) {[m
[31m-    GCfunc *fn;[m
[31m-    if (level > lim) {[m
[31m-      if (!lua_getstack(L1, level + TRACEBACK_LEVELS2, &ar)) {[m
[31m-	level--;[m
[31m-      } else {[m
[31m-	lua_pushliteral(L, "\n\t...");[m
[31m-	lua_getstack(L1, -10, &ar);[m
[31m-	level = ar.i_ci - TRACEBACK_LEVELS2;[m
[31m-      }[m
[31m-      lim = 2147483647;[m
[31m-      continue;[m
[31m-    }[m
[31m-    lua_getinfo(L1, "Snlf", &ar);[m
[31m-    fn = funcV(L1->top-1); L1->top--;[m
[31m-    if (isffunc(fn) && !*ar.namewhat)[m
[31m-      lua_pushfstring(L, "\n\t[builtin#%d]:", fn->c.ffid);[m
[31m-    else[m
[31m-      lua_pushfstring(L, "\n\t%s:", ar.short_src);[m
[31m-    if (ar.currentline > 0)[m
[31m-      lua_pushfstring(L, "%d:", ar.currentline);[m
[31m-    if (*ar.namewhat) {[m
[31m-      lua_pushfstring(L, " in function " LUA_QS, ar.name);[m
[31m-    } else {[m
[31m-      if (*ar.what == 'm') {[m
[31m-	lua_pushliteral(L, " in main chunk");[m
[31m-      } else if (*ar.what == 'C') {[m
[31m-	lua_pushfstring(L, " at %p", fn->c.f);[m
[31m-      } else {[m
[31m-	lua_pushfstring(L, " in function <%s:%d>",[m
[31m-			ar.short_src, ar.linedefined);[m
[31m-      }[m
[31m-    }[m
[31m-    if ((int)(L->top - L->base) - top >= 15)[m
[31m-      lua_concat(L, (int)(L->top - L->base) - top);[m
[31m-  }[m
[31m-  lua_concat(L, (int)(L->top - L->base) - top);[m
[31m-}[m
[31m-[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-[m
[31m-#include "lj_dispatch.h"[m
[31m-[m
[31m-#define MAX_TRACE_EVENTS  64[m
[31m-[m
[31m-enum {[m
[31m-    LJ_TRACE_EVENT_ENTER,[m
[31m-    LJ_TRACE_EVENT_EXIT,[m
[31m-    LJ_TRACE_EVENT_START[m
[31m-};[m
[31m-[m
[31m-typedef struct {[m
[31m-    int              event;[m
[31m-    unsigned         traceno;[m
[31m-    unsigned         exitno;[m
[31m-    int              directexit;[m
[31m-    const BCIns     *ins;[m
[31m-    lua_State       *thread;[m
[31m-    GCfunc          *fn;[m
[31m-} lj_trace_event_record_t;[m
[31m-[m
[31m-static lj_trace_event_record_t lj_trace_events[MAX_TRACE_EVENTS];[m
[31m-[m
[31m-static int  rb_start = 0;[m
[31m-static int  rb_end = 0;[m
[31m-static int  rb_full = 0;[m
[31m-[m
[31m-static void[m
[31m-lj_trace_log_event(lj_trace_event_record_t *rec)[m
[31m-{[m
[31m-  lj_trace_events[rb_end] = *rec;[m
[31m-[m
[31m-  if (rb_full) {[m
[31m-    rb_end++;[m
[31m-    if (rb_end == MAX_TRACE_EVENTS) {[m
[31m-      rb_end = 0;[m
[31m-    }[m
[31m-    rb_start = rb_end;[m
[31m-[m
[31m-  } else {[m
[31m-    rb_end++;[m
[31m-    if (rb_end == MAX_TRACE_EVENTS) {[m
[31m-      rb_end = 0;[m
[31m-      rb_full = MAX_TRACE_EVENTS;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static GCfunc*[m
[31m-lj_debug_top_frame_fn(lua_State *L, const BCIns *pc)[m
[31m-{[m
[31m-  int size;[m
[31m-  cTValue *frame;[m
[31m-[m
[31m-  frame = lj_debug_frame(L, 0, &size);[m
[31m-  if (frame == NULL) {[m
[31m-    return NULL;[m
[31m-  }[m
[31m-[m
[31m-  return frame_func(frame);[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL[m
[31m-lj_log_trace_start_record(lua_State *L, unsigned traceno, const BCIns *pc,[m
[31m-  GCfunc *fn)[m
[31m-{[m
[31m-  lj_trace_event_record_t  r;[m
[31m-[m
[31m-  r.event = LJ_TRACE_EVENT_START;[m
[31m-  r.thread = L;[m
[31m-  r.ins = pc;[m
[31m-  r.traceno = traceno;[m
[31m-  r.fn = fn;[m
[31m-[m
[31m-  lj_trace_log_event(&r);[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL[m
[31m-lj_log_trace_entry(lua_State *L, unsigned traceno, const BCIns *pc)[m
[31m-{[m
[31m-  lj_trace_event_record_t  r;[m
[31m-[m
[31m-  r.event = LJ_TRACE_EVENT_ENTER;[m
[31m-  r.thread = L;[m
[31m-  r.ins = pc;[m
[31m-  r.traceno = traceno;[m
[31m-  r.fn = lj_debug_top_frame_fn(L, pc);[m
[31m-[m
[31m-  lj_trace_log_event(&r);[m
[31m-}[m
[31m-[m
[31m-static void[m
[31m-lj_log_trace_exit_helper(lua_State *L, int vmstate, const BCIns *pc, int direct)[m
[31m-{[m
[31m-  if (vmstate >= 0) {[m
[31m-    lj_trace_event_record_t  r;[m
[31m-[m
[31m-    jit_State *J = L2J(L);[m
[31m-[m
[31m-    r.event = LJ_TRACE_EVENT_EXIT;[m
[31m-    r.thread = L;[m
[31m-    r.ins = pc;[m
[31m-    r.traceno = vmstate;[m
[31m-    r.exitno = J->exitno;[m
[31m-    r.directexit = direct;[m
[31m-    r.fn = lj_debug_top_frame_fn(L, pc);[m
[31m-[m
[31m-    lj_trace_log_event(&r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL[m
[31m-lj_log_trace_normal_exit(lua_State *L, int vmstate, const BCIns *pc)[m
[31m-{[m
[31m-  lj_log_trace_exit_helper(L, vmstate, pc, 0);[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL[m
[31m-lj_log_trace_direct_exit(lua_State *L, int vmstate, const BCIns *pc)[m
[31m-{[m
[31m-  lj_log_trace_exit_helper(L, vmstate, pc, 1);[m
[31m-}[m
[31m-[m
[31m-#endif  /* LUA_USE_TRACE_LOGS */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.h[m
[1mdeleted file mode 100644[m
[1mindex 8ccc809..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_debug.h[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-/*[m
[31m-** Debugging and introspection.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_DEBUG_H[m
[31m-#define _LJ_DEBUG_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-typedef struct lj_Debug {[m
[31m-  /* Common fields. Must be in the same order as in lua.h. */[m
[31m-  int event;[m
[31m-  const char *name;[m
[31m-  const char *namewhat;[m
[31m-  const char *what;[m
[31m-  const char *source;[m
[31m-  int currentline;[m
[31m-  int nups;[m
[31m-  int linedefined;[m
[31m-  int lastlinedefined;[m
[31m-  char short_src[LUA_IDSIZE];[m
[31m-  int i_ci;[m
[31m-  /* Extended fields. Only valid if lj_debug_getinfo() is called with ext = 1.*/[m
[31m-  int nparams;[m
[31m-  int isvararg;[m
[31m-} lj_Debug;[m
[31m-[m
[31m-LJ_FUNC cTValue *lj_debug_frame(lua_State *L, int level, int *size);[m
[31m-LJ_FUNC BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc);[m
[31m-LJ_FUNC const char *lj_debug_uvname(GCproto *pt, uint32_t idx);[m
[31m-LJ_FUNC const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp);[m
[31m-LJ_FUNC const char *lj_debug_slotname(GCproto *pt, const BCIns *pc,[m
[31m-				      BCReg slot, const char **name);[m
[31m-LJ_FUNC const char *lj_debug_funcname(lua_State *L, cTValue *frame,[m
[31m-				      const char **name);[m
[31m-LJ_FUNC void lj_debug_shortname(char *out, GCstr *str, BCLine line);[m
[31m-LJ_FUNC void lj_debug_addloc(lua_State *L, const char *msg,[m
[31m-			     cTValue *frame, cTValue *nextframe);[m
[31m-LJ_FUNC void lj_debug_pushloc(lua_State *L, GCproto *pt, BCPos pc);[m
[31m-LJ_FUNC int lj_debug_getinfo(lua_State *L, const char *what, lj_Debug *ar,[m
[31m-			     int ext);[m
[31m-#if LJ_HASPROFILE[m
[31m-LJ_FUNC void lj_debug_dumpstack(lua_State *L, SBuf *sb, const char *fmt,[m
[31m-				int depth);[m
[31m-#endif[m
[31m-[m
[31m-/* Fixed internal variable names. */[m
[31m-#define VARNAMEDEF(_) \[m
[31m-  _(FOR_IDX, "(for index)") \[m
[31m-  _(FOR_STOP, "(for limit)") \[m
[31m-  _(FOR_STEP, "(for step)") \[m
[31m-  _(FOR_GEN, "(for generator)") \[m
[31m-  _(FOR_STATE, "(for state)") \[m
[31m-  _(FOR_CTL, "(for control)")[m
[31m-[m
[31m-enum {[m
[31m-  VARNAME_END,[m
[31m-#define VARNAMEENUM(name, str)	VARNAME_##name,[m
[31m-  VARNAMEDEF(VARNAMEENUM)[m
[31m-#undef VARNAMEENUM[m
[31m-  VARNAME__MAX[m
[31m-};[m
[31m-[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-LJ_FUNC void LJ_FASTCALL lj_log_trace_direct_exit(lua_State *L,[m
[31m-  int vmstate, const BCIns *pc);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_log_trace_normal_exit(lua_State *L,[m
[31m-  int vmstate, const BCIns *pc);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_log_trace_entry(lua_State *L,[m
[31m-  unsigned traceno, const BCIns *pc);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_log_trace_start_record(lua_State *L, unsigned traceno,[m
[31m-  const BCIns *pc, GCfunc *fn);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_def.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_def.h[m
[1mdeleted file mode 100644[m
[1mindex 29d3fdd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_def.h[m
[1m+++ /dev/null[m
[36m@@ -1,365 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT common internal definitions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_DEF_H[m
[31m-#define _LJ_DEF_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#if defined(_MSC_VER)[m
[31m-/* MSVC is stuck in the last century and doesn't have C99's stdint.h. */[m
[31m-typedef __int8 int8_t;[m
[31m-typedef __int16 int16_t;[m
[31m-typedef __int32 int32_t;[m
[31m-typedef __int64 int64_t;[m
[31m-typedef unsigned __int8 uint8_t;[m
[31m-typedef unsigned __int16 uint16_t;[m
[31m-typedef unsigned __int32 uint32_t;[m
[31m-typedef unsigned __int64 uint64_t;[m
[31m-#ifdef _WIN64[m
[31m-typedef __int64 intptr_t;[m
[31m-typedef unsigned __int64 uintptr_t;[m
[31m-#else[m
[31m-typedef __int32 intptr_t;[m
[31m-typedef unsigned __int32 uintptr_t;[m
[31m-#endif[m
[31m-#elif defined(__symbian__)[m
[31m-/* Cough. */[m
[31m-typedef signed char int8_t;[m
[31m-typedef short int int16_t;[m
[31m-typedef int int32_t;[m
[31m-typedef long long int64_t;[m
[31m-typedef unsigned char uint8_t;[m
[31m-typedef unsigned short int uint16_t;[m
[31m-typedef unsigned int uint32_t;[m
[31m-typedef unsigned long long uint64_t;[m
[31m-typedef int intptr_t;[m
[31m-typedef unsigned int uintptr_t;[m
[31m-#else[m
[31m-#include <stdint.h>[m
[31m-#endif[m
[31m-[m
[31m-/* Needed everywhere. */[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-/* Various VM limits. */[m
[31m-#define LJ_MAX_MEM32	0x7fffff00	/* Max. 32 bit memory allocation. */[m
[31m-#define LJ_MAX_MEM64	((uint64_t)1<<47)  /* Max. 64 bit memory allocation. */[m
[31m-/* Max. total memory allocation. */[m
[31m-#define LJ_MAX_MEM	(LJ_GC64 ? LJ_MAX_MEM64 : LJ_MAX_MEM32)[m
[31m-#define LJ_MAX_ALLOC	LJ_MAX_MEM	/* Max. individual allocation length. */[m
[31m-#define LJ_MAX_STR	LJ_MAX_MEM32	/* Max. string length. */[m
[31m-#define LJ_MAX_BUF	LJ_MAX_MEM32	/* Max. buffer length. */[m
[31m-#define LJ_MAX_UDATA	LJ_MAX_MEM32	/* Max. userdata length. */[m
[31m-[m
[31m-#define LJ_MAX_STRTAB	(1<<26)		/* Max. string table size. */[m
[31m-#define LJ_MAX_HBITS	26		/* Max. hash bits. */[m
[31m-#define LJ_MAX_ABITS	28		/* Max. bits of array key. */[m
[31m-#define LJ_MAX_ASIZE	((1<<(LJ_MAX_ABITS-1))+1)  /* Max. array part size. */[m
[31m-#define LJ_MAX_COLOSIZE	16		/* Max. elems for colocated array. */[m
[31m-[m
[31m-#define LJ_MAX_LINE	LJ_MAX_MEM32	/* Max. source code line number. */[m
[31m-#define LJ_MAX_XLEVEL	200		/* Max. syntactic nesting level. */[m
[31m-#define LJ_MAX_BCINS	(1<<26)		/* Max. # of bytecode instructions. */[m
[31m-#define LJ_MAX_SLOTS	250		/* Max. # of slots in a Lua func. */[m
[31m-#define LJ_MAX_LOCVAR	200		/* Max. # of local variables. */[m
[31m-#define LJ_MAX_UPVAL	60		/* Max. # of upvalues. */[m
[31m-[m
[31m-#define LJ_MAX_IDXCHAIN	100		/* __index/__newindex chain limit. */[m
[31m-#define LJ_STACK_EXTRA	(5+2*LJ_FR2)	/* Extra stack space (metamethods). */[m
[31m-[m
[31m-#define LJ_NUM_CBPAGE	1		/* Number of FFI callback pages. */[m
[31m-[m
[31m-/* Minimum table/buffer sizes. */[m
[31m-#define LJ_MIN_GLOBAL	6		/* Min. global table size (hbits). */[m
[31m-#define LJ_MIN_REGISTRY	2		/* Min. registry size (hbits). */[m
[31m-#define LJ_MIN_STRTAB	256		/* Min. string table size (pow2). */[m
[31m-#define LJ_MIN_SBUF	32		/* Min. string buffer length. */[m
[31m-#define LJ_MIN_VECSZ	8		/* Min. size for growable vectors. */[m
[31m-#define LJ_MIN_IRSZ	32		/* Min. size for growable IR. */[m
[31m-#define LJ_MIN_K64SZ	16		/* Min. size for chained K64Array. */[m
[31m-[m
[31m-/* JIT compiler limits. */[m
[31m-#define LJ_MAX_JSLOTS	250		/* Max. # of stack slots for a trace. */[m
[31m-#define LJ_MAX_PHI	64		/* Max. # of PHIs for a loop. */[m
[31m-#define LJ_MAX_EXITSTUBGR	16	/* Max. # of exit stub groups. */[m
[31m-[m
[31m-/* Various macros. */[m
[31m-#ifndef UNUSED[m
[31m-#define UNUSED(x)	((void)(x))	/* to avoid warnings */[m
[31m-#endif[m
[31m-[m
[31m-#define U64x(hi, lo)	(((uint64_t)0x##hi << 32) + (uint64_t)0x##lo)[m
[31m-#define i32ptr(p)	((int32_t)(intptr_t)(void *)(p))[m
[31m-#define u32ptr(p)	((uint32_t)(intptr_t)(void *)(p))[m
[31m-[m
[31m-#define checki8(x)	((x) == (int32_t)(int8_t)(x))[m
[31m-#define checku8(x)	((x) == (int32_t)(uint8_t)(x))[m
[31m-#define checki16(x)	((x) == (int32_t)(int16_t)(x))[m
[31m-#define checku16(x)	((x) == (int32_t)(uint16_t)(x))[m
[31m-#define checki32(x)	((x) == (int32_t)(x))[m
[31m-#define checku32(x)	((x) == (uint32_t)(x))[m
[31m-#define checkptr32(x)	((uintptr_t)(x) == (uint32_t)(uintptr_t)(x))[m
[31m-#define checkptr47(x)	(((uint64_t)(x) >> 47) == 0)[m
[31m-#if LJ_GC64[m
[31m-#define checkptrGC(x)	(checkptr47((x)))[m
[31m-#elif LJ_64[m
[31m-#define checkptrGC(x)	(checkptr32((x)))[m
[31m-#else[m
[31m-#define checkptrGC(x)	1[m
[31m-#endif[m
[31m-[m
[31m-/* Every half-decent C compiler transforms this into a rotate instruction. */[m
[31m-#define lj_rol(x, n)	(((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1))))[m
[31m-#define lj_ror(x, n)	(((x)<<(-(int)(n)&(8*sizeof(x)-1))) | ((x)>>(n)))[m
[31m-[m
[31m-/* A really naive Bloom filter. But sufficient for our needs. */[m
[31m-typedef uintptr_t BloomFilter;[m
[31m-#define BLOOM_MASK	(8*sizeof(BloomFilter) - 1)[m
[31m-#define bloombit(x)	((uintptr_t)1 << ((x) & BLOOM_MASK))[m
[31m-#define bloomset(b, x)	((b) |= bloombit((x)))[m
[31m-#define bloomtest(b, x)	((b) & bloombit((x)))[m
[31m-[m
[31m-#if defined(__GNUC__) || defined(__psp2__)[m
[31m-[m
[31m-#define LJ_NORET	__attribute__((noreturn))[m
[31m-#define LJ_ALIGN(n)	__attribute__((aligned(n)))[m
[31m-#define LJ_INLINE	inline[m
[31m-#define LJ_AINLINE	inline __attribute__((always_inline))[m
[31m-#define LJ_NOINLINE	__attribute__((noinline))[m
[31m-[m
[31m-#if defined(__ELF__) || defined(__MACH__) || defined(__psp2__)[m
[31m-#if !((defined(__sun__) && defined(__svr4__)) || defined(__CELLOS_LV2__))[m
[31m-#define LJ_NOAPI	extern __attribute__((visibility("hidden")))[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Note: it's only beneficial to use fastcall on x86 and then only for up to[m
[31m-** two non-FP args. The amalgamated compile covers all LJ_FUNC cases. Only[m
[31m-** indirect calls and related tail-called C functions are marked as fastcall.[m
[31m-*/[m
[31m-#if defined(__i386__)[m
[31m-#define LJ_FASTCALL	__attribute__((fastcall))[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_LIKELY(x)	__builtin_expect(!!(x), 1)[m
[31m-#define LJ_UNLIKELY(x)	__builtin_expect(!!(x), 0)[m
[31m-[m
[31m-#define lj_ffs(x)	((uint32_t)__builtin_ctz(x))[m
[31m-/* Don't ask ... */[m
[31m-#if defined(__INTEL_COMPILER) && (defined(__i386__) || defined(__x86_64__))[m
[31m-static LJ_AINLINE uint32_t lj_fls(uint32_t x)[m
[31m-{[m
[31m-  uint32_t r; __asm__("bsrl %1, %0" : "=r" (r) : "rm" (x) : "cc"); return r;[m
[31m-}[m
[31m-#else[m
[31m-#define lj_fls(x)	((uint32_t)(__builtin_clz(x)^31))[m
[31m-#endif[m
[31m-[m
[31m-#if defined(__arm__)[m
[31m-static LJ_AINLINE uint32_t lj_bswap(uint32_t x)[m
[31m-{[m
[31m-#if defined(__psp2__)[m
[31m-  return __builtin_rev(x);[m
[31m-#else[m
[31m-  uint32_t r;[m
[31m-#if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\[m
[31m-    __ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__[m
[31m-  __asm__("rev %0, %1" : "=r" (r) : "r" (x));[m
[31m-  return r;[m
[31m-#else[m
[31m-#ifdef __thumb__[m
[31m-  r = x ^ lj_ror(x, 16);[m
[31m-#else[m
[31m-  __asm__("eor %0, %1, %1, ror #16" : "=r" (r) : "r" (x));[m
[31m-#endif[m
[31m-  return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8);[m
[31m-#endif[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));[m
[31m-}[m
[31m-#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)[m
[31m-static LJ_AINLINE uint32_t lj_bswap(uint32_t x)[m
[31m-{[m
[31m-  return (uint32_t)__builtin_bswap32((int32_t)x);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  return (uint64_t)__builtin_bswap64((int64_t)x);[m
[31m-}[m
[31m-#elif defined(__i386__) || defined(__x86_64__)[m
[31m-static LJ_AINLINE uint32_t lj_bswap(uint32_t x)[m
[31m-{[m
[31m-  uint32_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;[m
[31m-}[m
[31m-[m
[31m-#if defined(__i386__)[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));[m
[31m-}[m
[31m-#else[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  uint64_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;[m
[31m-}[m
[31m-#endif[m
[31m-#else[m
[31m-static LJ_AINLINE uint32_t lj_bswap(uint32_t x)[m
[31m-{[m
[31m-  return (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  return (uint64_t)lj_bswap((uint32_t)(x >> 32)) |[m
[31m-	 ((uint64_t)lj_bswap((uint32_t)x) << 32);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-typedef union __attribute__((packed)) Unaligned16 {[m
[31m-  uint16_t u;[m
[31m-  uint8_t b[2];[m
[31m-} Unaligned16;[m
[31m-[m
[31m-typedef union __attribute__((packed)) Unaligned32 {[m
[31m-  uint32_t u;[m
[31m-  uint8_t b[4];[m
[31m-} Unaligned32;[m
[31m-[m
[31m-/* Unaligned load of uint16_t. */[m
[31m-static LJ_AINLINE uint16_t lj_getu16(const void *p)[m
[31m-{[m
[31m-  return ((const Unaligned16 *)p)->u;[m
[31m-}[m
[31m-[m
[31m-/* Unaligned load of uint32_t. */[m
[31m-static LJ_AINLINE uint32_t lj_getu32(const void *p)[m
[31m-{[m
[31m-  return ((const Unaligned32 *)p)->u;[m
[31m-}[m
[31m-[m
[31m-#elif defined(_MSC_VER)[m
[31m-[m
[31m-#define LJ_NORET	__declspec(noreturn)[m
[31m-#define LJ_ALIGN(n)	__declspec(align(n))[m
[31m-#define LJ_INLINE	__inline[m
[31m-#define LJ_AINLINE	__forceinline[m
[31m-#define LJ_NOINLINE	__declspec(noinline)[m
[31m-#if defined(_M_IX86)[m
[31m-#define LJ_FASTCALL	__fastcall[m
[31m-#endif[m
[31m-[m
[31m-#ifdef _M_PPC[m
[31m-unsigned int _CountLeadingZeros(long);[m
[31m-#pragma intrinsic(_CountLeadingZeros)[m
[31m-static LJ_AINLINE uint32_t lj_fls(uint32_t x)[m
[31m-{[m
[31m-  return _CountLeadingZeros(x) ^ 31;[m
[31m-}[m
[31m-#else[m
[31m-unsigned char _BitScanForward(uint32_t *, unsigned long);[m
[31m-unsigned char _BitScanReverse(uint32_t *, unsigned long);[m
[31m-#pragma intrinsic(_BitScanForward)[m
[31m-#pragma intrinsic(_BitScanReverse)[m
[31m-[m
[31m-static LJ_AINLINE uint32_t lj_ffs(uint32_t x)[m
[31m-{[m
[31m-  uint32_t r; _BitScanForward(&r, x); return r;[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint32_t lj_fls(uint32_t x)[m
[31m-{[m
[31m-  uint32_t r; _BitScanReverse(&r, x); return r;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-unsigned long _byteswap_ulong(unsigned long);[m
[31m-uint64_t _byteswap_uint64(uint64_t);[m
[31m-#define lj_bswap(x)	(_byteswap_ulong((x)))[m
[31m-#define lj_bswap64(x)	(_byteswap_uint64((x)))[m
[31m-[m
[31m-#if defined(_M_PPC) && defined(LUAJIT_NO_UNALIGNED)[m
[31m-/*[m
[31m-** Replacement for unaligned loads on Xbox 360. Disabled by default since it's[m
[31m-** usually more costly than the occasional stall when crossing a cache-line.[m
[31m-*/[m
[31m-static LJ_AINLINE uint16_t lj_getu16(const void *v)[m
[31m-{[m
[31m-  const uint8_t *p = (const uint8_t *)v;[m
[31m-  return (uint16_t)((p[0]<<8) | p[1]);[m
[31m-}[m
[31m-static LJ_AINLINE uint32_t lj_getu32(const void *v)[m
[31m-{[m
[31m-  const uint8_t *p = (const uint8_t *)v;[m
[31m-  return (uint32_t)((p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]);[m
[31m-}[m
[31m-#else[m
[31m-/* Unaligned loads are generally ok on x86/x64. */[m
[31m-#define lj_getu16(p)	(*(uint16_t *)(p))[m
[31m-#define lj_getu32(p)	(*(uint32_t *)(p))[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-#error "missing defines for your compiler"[m
[31m-#endif[m
[31m-[m
[31m-/* Optional defines. */[m
[31m-#ifndef LJ_FASTCALL[m
[31m-#define LJ_FASTCALL[m
[31m-#endif[m
[31m-#ifndef LJ_NORET[m
[31m-#define LJ_NORET[m
[31m-#endif[m
[31m-#ifndef LJ_NOAPI[m
[31m-#define LJ_NOAPI	extern[m
[31m-#endif[m
[31m-#ifndef LJ_LIKELY[m
[31m-#define LJ_LIKELY(x)	(x)[m
[31m-#define LJ_UNLIKELY(x)	(x)[m
[31m-#endif[m
[31m-[m
[31m-/* Attributes for internal functions. */[m
[31m-#define LJ_DATA		LJ_NOAPI[m
[31m-#define LJ_DATADEF[m
[31m-#define LJ_ASMF		LJ_NOAPI[m
[31m-#define LJ_FUNCA	LJ_NOAPI[m
[31m-#if defined(ljamalg_c)[m
[31m-#define LJ_FUNC		static[m
[31m-#else[m
[31m-#define LJ_FUNC		LJ_NOAPI[m
[31m-#endif[m
[31m-#define LJ_FUNC_NORET	LJ_FUNC LJ_NORET[m
[31m-#define LJ_FUNCA_NORET	LJ_FUNCA LJ_NORET[m
[31m-#define LJ_ASMF_NORET	LJ_ASMF LJ_NORET[m
[31m-[m
[31m-/* Runtime assertions. */[m
[31m-#ifdef lua_assert[m
[31m-#define check_exp(c, e)		(lua_assert(c), (e))[m
[31m-#define api_check(l, e)		lua_assert(e)[m
[31m-#else[m
[31m-#define lua_assert(c)		((void)0)[m
[31m-#define check_exp(c, e)		(e)[m
[31m-#define api_check		luai_apicheck[m
[31m-#endif[m
[31m-[m
[31m-/* Static assertions. */[m
[31m-#define LJ_ASSERT_NAME2(name, line)	name ## line[m
[31m-#define LJ_ASSERT_NAME(line)		LJ_ASSERT_NAME2(lj_assert_, line)[m
[31m-#ifdef __COUNTER__[m
[31m-#define LJ_STATIC_ASSERT(cond) \[m
[31m-  extern void LJ_ASSERT_NAME(__COUNTER__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])[m
[31m-#else[m
[31m-#define LJ_STATIC_ASSERT(cond) \[m
[31m-  extern void LJ_ASSERT_NAME(__LINE__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.c[m
[1mdeleted file mode 100644[m
[1mindex 36b920a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.c[m
[1m+++ /dev/null[m
[36m@@ -1,557 +0,0 @@[m
[31m-/*[m
[31m-** Instruction dispatch handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_dispatch_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ccallback.h"[m
[31m-#endif[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#if LJ_HASPROFILE[m
[31m-#include "lj_profile.h"[m
[31m-#endif[m
[31m-#include "lj_vm.h"[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-/* Bump GG_NUM_ASMFF in lj_dispatch.h as needed. Ugly. */[m
[31m-LJ_STATIC_ASSERT(GG_NUM_ASMFF == FF_NUM_ASMFUNC);[m
[31m-[m
[31m-/* -- Dispatch table management ------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_MIPS[m
[31m-#include <math.h>[m
[31m-LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L,[m
[31m-							  lua_State *co);[m
[31m-#if !LJ_HASJIT[m
[31m-#define lj_dispatch_stitch	lj_dispatch_ins[m
[31m-#endif[m
[31m-#if !LJ_HASPROFILE[m
[31m-#define lj_dispatch_profile	lj_dispatch_ins[m
[31m-#endif[m
[31m-[m
[31m-#define GOTFUNC(name)	(ASMFunction)name,[m
[31m-static const ASMFunction dispatch_got[] = {[m
[31m-  GOTDEF(GOTFUNC)[m
[31m-};[m
[31m-#undef GOTFUNC[m
[31m-#endif[m
[31m-[m
[31m-/* Initialize instruction dispatch table and hot counters. */[m
[31m-void lj_dispatch_init(GG_State *GG)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-  ASMFunction *disp = GG->dispatch;[m
[31m-  for (i = 0; i < GG_LEN_SDISP; i++)[m
[31m-    disp[GG_LEN_DDISP+i] = disp[i] = makeasmfunc(lj_bc_ofs[i]);[m
[31m-  for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)[m
[31m-    disp[i] = makeasmfunc(lj_bc_ofs[i]);[m
[31m-  /* The JIT engine is off by default. luaopen_jit() turns it on. */[m
[31m-  disp[BC_FORL] = disp[BC_IFORL];[m
[31m-  disp[BC_ITERL] = disp[BC_IITERL];[m
[31m-  disp[BC_LOOP] = disp[BC_ILOOP];[m
[31m-  disp[BC_FUNCF] = disp[BC_IFUNCF];[m
[31m-  disp[BC_FUNCV] = disp[BC_IFUNCV];[m
[31m-  GG->g.bc_cfunc_ext = GG->g.bc_cfunc_int = BCINS_AD(BC_FUNCC, LUA_MINSTACK, 0);[m
[31m-  for (i = 0; i < GG_NUM_ASMFF; i++)[m
[31m-    GG->bcff[i] = BCINS_AD(BC__MAX+i, 0, 0);[m
[31m-#if LJ_TARGET_MIPS[m
[31m-  memcpy(GG->got, dispatch_got, LJ_GOT__MAX*4);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Initialize hotcount table. */[m
[31m-void lj_dispatch_init_hotcount(global_State *g)[m
[31m-{[m
[31m-  int32_t hotloop = G2J(g)->param[JIT_P_hotloop];[m
[31m-  HotCount start = (HotCount)(hotloop*HOTCOUNT_LOOP - 1);[m
[31m-  HotCount *hotcount = G2GG(g)->hotcount;[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < HOTCOUNT_SIZE; i++)[m
[31m-    hotcount[i] = start;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Internal dispatch mode bits. */[m
[31m-#define DISPMODE_CALL	0x01	/* Override call dispatch. */[m
[31m-#define DISPMODE_RET	0x02	/* Override return dispatch. */[m
[31m-#define DISPMODE_INS	0x04	/* Override instruction dispatch. */[m
[31m-#define DISPMODE_JIT	0x10	/* JIT compiler on. */[m
[31m-#define DISPMODE_REC	0x20	/* Recording active. */[m
[31m-#define DISPMODE_PROF	0x40	/* Profiling active. */[m
[31m-[m
[31m-/* Update dispatch table depending on various flags. */[m
[31m-void lj_dispatch_update(global_State *g)[m
[31m-{[m
[31m-  uint8_t oldmode = g->dispatchmode;[m
[31m-  uint8_t mode = 0;[m
[31m-#if LJ_HASJIT[m
[31m-  mode |= (G2J(g)->flags & JIT_F_ON) ? DISPMODE_JIT : 0;[m
[31m-  mode |= G2J(g)->state != LJ_TRACE_IDLE ?[m
[31m-	    (DISPMODE_REC|DISPMODE_INS|DISPMODE_CALL) : 0;[m
[31m-#endif[m
[31m-#if LJ_HASPROFILE[m
[31m-  mode |= (g->hookmask & HOOK_PROFILE) ? (DISPMODE_PROF|DISPMODE_INS) : 0;[m
[31m-#endif[m
[31m-  mode |= (g->hookmask & (LUA_MASKLINE|LUA_MASKCOUNT)) ? DISPMODE_INS : 0;[m
[31m-  mode |= (g->hookmask & LUA_MASKCALL) ? DISPMODE_CALL : 0;[m
[31m-  mode |= (g->hookmask & LUA_MASKRET) ? DISPMODE_RET : 0;[m
[31m-  if (oldmode != mode) {  /* Mode changed? */[m
[31m-    ASMFunction *disp = G2GG(g)->dispatch;[m
[31m-    ASMFunction f_forl, f_iterl, f_loop, f_funcf, f_funcv;[m
[31m-    g->dispatchmode = mode;[m
[31m-[m
[31m-    /* Hotcount if JIT is on, but not while recording. */[m
[31m-    if ((mode & (DISPMODE_JIT|DISPMODE_REC)) == DISPMODE_JIT) {[m
[31m-      f_forl = makeasmfunc(lj_bc_ofs[BC_FORL]);[m
[31m-      f_iterl = makeasmfunc(lj_bc_ofs[BC_ITERL]);[m
[31m-      f_loop = makeasmfunc(lj_bc_ofs[BC_LOOP]);[m
[31m-      f_funcf = makeasmfunc(lj_bc_ofs[BC_FUNCF]);[m
[31m-      f_funcv = makeasmfunc(lj_bc_ofs[BC_FUNCV]);[m
[31m-    } else {  /* Otherwise use the non-hotcounting instructions. */[m
[31m-      f_forl = disp[GG_LEN_DDISP+BC_IFORL];[m
[31m-      f_iterl = disp[GG_LEN_DDISP+BC_IITERL];[m
[31m-      f_loop = disp[GG_LEN_DDISP+BC_ILOOP];[m
[31m-      f_funcf = makeasmfunc(lj_bc_ofs[BC_IFUNCF]);[m
[31m-      f_funcv = makeasmfunc(lj_bc_ofs[BC_IFUNCV]);[m
[31m-    }[m
[31m-    /* Init static counting instruction dispatch first (may be copied below). */[m
[31m-    disp[GG_LEN_DDISP+BC_FORL] = f_forl;[m
[31m-    disp[GG_LEN_DDISP+BC_ITERL] = f_iterl;[m
[31m-    disp[GG_LEN_DDISP+BC_LOOP] = f_loop;[m
[31m-[m
[31m-    /* Set dynamic instruction dispatch. */[m
[31m-    if ((oldmode ^ mode) & (DISPMODE_PROF|DISPMODE_REC|DISPMODE_INS)) {[m
[31m-      /* Need to update the whole table. */[m
[31m-      if (!(mode & DISPMODE_INS)) {  /* No ins dispatch? */[m
[31m-	/* Copy static dispatch table to dynamic dispatch table. */[m
[31m-	memcpy(&disp[0], &disp[GG_LEN_DDISP], GG_LEN_SDISP*sizeof(ASMFunction));[m
[31m-	/* Overwrite with dynamic return dispatch. */[m
[31m-	if ((mode & DISPMODE_RET)) {[m
[31m-	  disp[BC_RETM] = lj_vm_rethook;[m
[31m-	  disp[BC_RET] = lj_vm_rethook;[m
[31m-	  disp[BC_RET0] = lj_vm_rethook;[m
[31m-	  disp[BC_RET1] = lj_vm_rethook;[m
[31m-	}[m
[31m-      } else {[m
[31m-	/* The recording dispatch also checks for hooks. */[m
[31m-	ASMFunction f = (mode & DISPMODE_PROF) ? lj_vm_profhook :[m
[31m-			(mode & DISPMODE_REC) ? lj_vm_record : lj_vm_inshook;[m
[31m-	uint32_t i;[m
[31m-	for (i = 0; i < GG_LEN_SDISP; i++)[m
[31m-	  disp[i] = f;[m
[31m-      }[m
[31m-    } else if (!(mode & DISPMODE_INS)) {[m
[31m-      /* Otherwise set dynamic counting ins. */[m
[31m-      disp[BC_FORL] = f_forl;[m
[31m-      disp[BC_ITERL] = f_iterl;[m
[31m-      disp[BC_LOOP] = f_loop;[m
[31m-      /* Set dynamic return dispatch. */[m
[31m-      if ((mode & DISPMODE_RET)) {[m
[31m-	disp[BC_RETM] = lj_vm_rethook;[m
[31m-	disp[BC_RET] = lj_vm_rethook;[m
[31m-	disp[BC_RET0] = lj_vm_rethook;[m
[31m-	disp[BC_RET1] = lj_vm_rethook;[m
[31m-      } else {[m
[31m-	disp[BC_RETM] = disp[GG_LEN_DDISP+BC_RETM];[m
[31m-	disp[BC_RET] = disp[GG_LEN_DDISP+BC_RET];[m
[31m-	disp[BC_RET0] = disp[GG_LEN_DDISP+BC_RET0];[m
[31m-	disp[BC_RET1] = disp[GG_LEN_DDISP+BC_RET1];[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Set dynamic call dispatch. */[m
[31m-    if ((oldmode ^ mode) & DISPMODE_CALL) {  /* Update the whole table? */[m
[31m-      uint32_t i;[m
[31m-      if ((mode & DISPMODE_CALL) == 0) {  /* No call hooks? */[m
[31m-	for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)[m
[31m-	  disp[i] = makeasmfunc(lj_bc_ofs[i]);[m
[31m-      } else {[m
[31m-	for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)[m
[31m-	  disp[i] = lj_vm_callhook;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!(mode & DISPMODE_CALL)) {  /* Overwrite dynamic counting ins. */[m
[31m-      disp[BC_FUNCF] = f_funcf;[m
[31m-      disp[BC_FUNCV] = f_funcv;[m
[31m-    }[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-    /* Reset hotcounts for JIT off to on transition. */[m
[31m-    if ((mode & DISPMODE_JIT) && !(oldmode & DISPMODE_JIT))[m
[31m-      lj_dispatch_init_hotcount(g);[m
[31m-#endif[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- JIT mode setting ---------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Set JIT mode for a single prototype. */[m
[31m-static void setptmode(global_State *g, GCproto *pt, int mode)[m
[31m-{[m
[31m-  if ((mode & LUAJIT_MODE_ON)) {  /* (Re-)enable JIT compilation. */[m
[31m-    pt->flags &= ~PROTO_NOJIT;[m
[31m-    lj_trace_reenableproto(pt);  /* Unpatch all ILOOP etc. bytecodes. */[m
[31m-  } else {  /* Flush and/or disable JIT compilation. */[m
[31m-    if (!(mode & LUAJIT_MODE_FLUSH))[m
[31m-      pt->flags |= PROTO_NOJIT;[m
[31m-    lj_trace_flushproto(g, pt);  /* Flush all traces of prototype. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Recursively set the JIT mode for all children of a prototype. */[m
[31m-static void setptmode_all(global_State *g, GCproto *pt, int mode)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  if (!(pt->flags & PROTO_CHILD)) return;[m
[31m-  for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) {[m
[31m-    GCobj *o = proto_kgc(pt, i);[m
[31m-    if (o->gch.gct == ~LJ_TPROTO) {[m
[31m-      setptmode(g, gco2pt(o), mode);[m
[31m-      setptmode_all(g, gco2pt(o), mode);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Public API function: control the JIT engine. */[m
[31m-int luaJIT_setmode(lua_State *L, int idx, int mode)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  int mm = mode & LUAJIT_MODE_MASK;[m
[31m-  lj_trace_abort(g);  /* Abort recording on any state change. */[m
[31m-  /* Avoid pulling the rug from under our own feet. */[m
[31m-  if ((g->hookmask & HOOK_GC))[m
[31m-    lj_err_caller(L, LJ_ERR_NOGCMM);[m
[31m-  switch (mm) {[m
[31m-#if LJ_HASJIT[m
[31m-  case LUAJIT_MODE_ENGINE:[m
[31m-    if ((mode & LUAJIT_MODE_FLUSH)) {[m
[31m-      lj_trace_flushall(L);[m
[31m-    } else {[m
[31m-      if (!(mode & LUAJIT_MODE_ON))[m
[31m-	G2J(g)->flags &= ~(uint32_t)JIT_F_ON;[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-      else if ((G2J(g)->flags & JIT_F_SSE2))[m
[31m-	G2J(g)->flags |= (uint32_t)JIT_F_ON;[m
[31m-      else[m
[31m-	return 0;  /* Don't turn on JIT compiler without SSE2 support. */[m
[31m-#else[m
[31m-      else[m
[31m-	G2J(g)->flags |= (uint32_t)JIT_F_ON;[m
[31m-#endif[m
[31m-      lj_dispatch_update(g);[m
[31m-    }[m
[31m-    break;[m
[31m-  case LUAJIT_MODE_FUNC:[m
[31m-  case LUAJIT_MODE_ALLFUNC:[m
[31m-  case LUAJIT_MODE_ALLSUBFUNC: {[m
[31m-    cTValue *tv = idx == 0 ? frame_prev(L->base-1) :[m
[31m-		  idx > 0 ? L->base + (idx-1) : L->top + idx;[m
[31m-    GCproto *pt;[m
[31m-    if ((idx == 0 || tvisfunc(tv)) && isluafunc(&gcval(tv)->fn))[m
[31m-      pt = funcproto(&gcval(tv)->fn);  /* Cannot use funcV() for frame slot. */[m
[31m-    else if (tvisproto(tv))[m
[31m-      pt = protoV(tv);[m
[31m-    else[m
[31m-      return 0;  /* Failed. */[m
[31m-    if (mm != LUAJIT_MODE_ALLSUBFUNC)[m
[31m-      setptmode(g, pt, mode);[m
[31m-    if (mm != LUAJIT_MODE_FUNC)[m
[31m-      setptmode_all(g, pt, mode);[m
[31m-    break;[m
[31m-    }[m
[31m-  case LUAJIT_MODE_TRACE:[m
[31m-    if (!(mode & LUAJIT_MODE_FLUSH))[m
[31m-      return 0;  /* Failed. */[m
[31m-    lj_trace_flush(G2J(g), idx);[m
[31m-    break;[m
[31m-#else[m
[31m-  case LUAJIT_MODE_ENGINE:[m
[31m-  case LUAJIT_MODE_FUNC:[m
[31m-  case LUAJIT_MODE_ALLFUNC:[m
[31m-  case LUAJIT_MODE_ALLSUBFUNC:[m
[31m-    UNUSED(idx);[m
[31m-    if ((mode & LUAJIT_MODE_ON))[m
[31m-      return 0;  /* Failed. */[m
[31m-    break;[m
[31m-#endif[m
[31m-  case LUAJIT_MODE_WRAPCFUNC:[m
[31m-    if ((mode & LUAJIT_MODE_ON)) {[m
[31m-      if (idx != 0) {[m
[31m-	cTValue *tv = idx > 0 ? L->base + (idx-1) : L->top + idx;[m
[31m-	if (tvislightud(tv))[m
[31m-	  g->wrapf = (lua_CFunction)lightudV(tv);[m
[31m-	else[m
[31m-	  return 0;  /* Failed. */[m
[31m-      } else {[m
[31m-	return 0;  /* Failed. */[m
[31m-      }[m
[31m-      g->bc_cfunc_ext = BCINS_AD(BC_FUNCCW, 0, 0);[m
[31m-    } else {[m
[31m-      g->bc_cfunc_ext = BCINS_AD(BC_FUNCC, 0, 0);[m
[31m-    }[m
[31m-    break;[m
[31m-  default:[m
[31m-    return 0;  /* Failed. */[m
[31m-  }[m
[31m-  return 1;  /* OK. */[m
[31m-}[m
[31m-[m
[31m-/* Enforce (dynamic) linker error for version mismatches. See luajit.c. */[m
[31m-LUA_API void LUAJIT_VERSION_SYM(void)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-/* -- Hooks --------------------------------------------------------------- */[m
[31m-[m
[31m-/* This function can be called asynchronously (e.g. during a signal). */[m
[31m-LUA_API int lua_sethook(lua_State *L, lua_Hook func, int mask, int count)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  mask &= HOOK_EVENTMASK;[m
[31m-  if (func == NULL || mask == 0) { mask = 0; func = NULL; }  /* Consistency. */[m
[31m-  g->hookf = func;[m
[31m-  g->hookcount = g->hookcstart = (int32_t)count;[m
[31m-  g->hookmask = (uint8_t)((g->hookmask & ~HOOK_EVENTMASK) | mask);[m
[31m-  lj_trace_abort(g);  /* Abort recording on any hook change. */[m
[31m-  lj_dispatch_update(g);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_Hook lua_gethook(lua_State *L)[m
[31m-{[m
[31m-  return G(L)->hookf;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_gethookmask(lua_State *L)[m
[31m-{[m
[31m-  return G(L)->hookmask & HOOK_EVENTMASK;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_gethookcount(lua_State *L)[m
[31m-{[m
[31m-  return (int)G(L)->hookcstart;[m
[31m-}[m
[31m-[m
[31m-/* Call a hook. */[m
[31m-static void callhook(lua_State *L, int event, BCLine line)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lua_Hook hookf = g->hookf;[m
[31m-  if (hookf && !hook_active(g)) {[m
[31m-    lua_Debug ar;[m
[31m-    lj_trace_abort(g);  /* Abort recording on any hook call. */[m
[31m-    ar.event = event;[m
[31m-    ar.currentline = line;[m
[31m-    /* Top frame, nextframe = NULL. */[m
[31m-    ar.i_ci = (int)((L->base-1) - tvref(L->stack));[m
[31m-    lj_state_checkstack(L, 1+LUA_MINSTACK);[m
[31m-#if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF[m
[31m-    lj_profile_hook_enter(g);[m
[31m-#else[m
[31m-    hook_enter(g);[m
[31m-#endif[m
[31m-    hookf(L, &ar);[m
[31m-    lua_assert(hook_active(g));[m
[31m-    setgcref(g->cur_L, obj2gco(L));[m
[31m-#if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF[m
[31m-    lj_profile_hook_leave(g);[m
[31m-#else[m
[31m-    hook_leave(g);[m
[31m-#endif[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Dispatch callbacks -------------------------------------------------- */[m
[31m-[m
[31m-/* Calculate number of used stack slots in the current frame. */[m
[31m-static BCReg cur_topslot(GCproto *pt, const BCIns *pc, uint32_t nres)[m
[31m-{[m
[31m-  BCIns ins = pc[-1];[m
[31m-  if (bc_op(ins) == BC_UCLO)[m
[31m-    ins = pc[bc_j(ins)];[m
[31m-  switch (bc_op(ins)) {[m
[31m-  case BC_CALLM: case BC_CALLMT: return bc_a(ins) + bc_c(ins) + nres-1+1+LJ_FR2;[m
[31m-  case BC_RETM: return bc_a(ins) + bc_d(ins) + nres-1;[m
[31m-  case BC_TSETM: return bc_a(ins) + nres-1;[m
[31m-  default: return pt->framesize;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Instruction dispatch. Used by instr/line/return hooks or when recording. */[m
[31m-void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  GCproto *pt = funcproto(fn);[m
[31m-  void *cf = cframe_raw(L->cframe);[m
[31m-  const BCIns *oldpc = cframe_pc(cf);[m
[31m-  global_State *g = G(L);[m
[31m-  BCReg slots;[m
[31m-  setcframe_pc(cf, pc);[m
[31m-  slots = cur_topslot(pt, pc, cframe_multres_n(cf));[m
[31m-  L->top = L->base + slots;  /* Fix top. */[m
[31m-#if LJ_HASJIT[m
[31m-  {[m
[31m-    jit_State *J = G2J(g);[m
[31m-    if (J->state != LJ_TRACE_IDLE) {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-      ptrdiff_t delta = L->top - L->base;[m
[31m-#endif[m
[31m-      J->L = L;[m
[31m-      lj_trace_ins(J, pc-1);  /* The interpreter bytecode PC is offset by 1. */[m
[31m-      lua_assert(L->top - L->base == delta);[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  if ((g->hookmask & LUA_MASKCOUNT) && g->hookcount == 0) {[m
[31m-    g->hookcount = g->hookcstart;[m
[31m-    callhook(L, LUA_HOOKCOUNT, -1);[m
[31m-    L->top = L->base + slots;  /* Fix top again. */[m
[31m-  }[m
[31m-  if ((g->hookmask & LUA_MASKLINE)) {[m
[31m-    BCPos npc = proto_bcpos(pt, pc) - 1;[m
[31m-    BCPos opc = proto_bcpos(pt, oldpc) - 1;[m
[31m-    BCLine line = lj_debug_line(pt, npc);[m
[31m-    if (pc <= oldpc || opc >= pt->sizebc || line != lj_debug_line(pt, opc)) {[m
[31m-      callhook(L, LUA_HOOKLINE, line);[m
[31m-      L->top = L->base + slots;  /* Fix top again. */[m
[31m-    }[m
[31m-  }[m
[31m-  if ((g->hookmask & LUA_MASKRET) && bc_isret(bc_op(pc[-1])))[m
[31m-    callhook(L, LUA_HOOKRET, -1);[m
[31m-  ERRNO_RESTORE[m
[31m-}[m
[31m-[m
[31m-/* Initialize call. Ensure stack space and return # of missing parameters. */[m
[31m-static int call_init(lua_State *L, GCfunc *fn)[m
[31m-{[m
[31m-  if (isluafunc(fn)) {[m
[31m-    GCproto *pt = funcproto(fn);[m
[31m-    int numparams = pt->numparams;[m
[31m-    int gotparams = (int)(L->top - L->base);[m
[31m-    int need = pt->framesize;[m
[31m-    if ((pt->flags & PROTO_VARARG)) need += 1+gotparams;[m
[31m-    lj_state_checkstack(L, (MSize)need);[m
[31m-    numparams -= gotparams;[m
[31m-    return numparams >= 0 ? numparams : 0;[m
[31m-  } else {[m
[31m-    lj_state_checkstack(L, LUA_MINSTACK);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Call dispatch. Used by call hooks, hot calls or when recording. */[m
[31m-ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns *pc)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  BCOp op;[m
[31m-  global_State *g = G(L);[m
[31m-#if LJ_HASJIT[m
[31m-  jit_State *J = G2J(g);[m
[31m-#endif[m
[31m-  int missing = call_init(L, fn);[m
[31m-#if LJ_HASJIT[m
[31m-  J->L = L;[m
[31m-  if ((uintptr_t)pc & 1) {  /* Marker for hot call. */[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-    ptrdiff_t delta = L->top - L->base;[m
[31m-#endif[m
[31m-    pc = (const BCIns *)((uintptr_t)pc & ~(uintptr_t)1);[m
[31m-    lj_trace_hot(J, pc);[m
[31m-    lua_assert(L->top - L->base == delta);[m
[31m-    goto out;[m
[31m-  } else if (J->state != LJ_TRACE_IDLE &&[m
[31m-	     !(g->hookmask & (HOOK_GC|HOOK_VMEVENT))) {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-    ptrdiff_t delta = L->top - L->base;[m
[31m-#endif[m
[31m-    /* Record the FUNC* bytecodes, too. */[m
[31m-    lj_trace_ins(J, pc-1);  /* The interpreter bytecode PC is offset by 1. */[m
[31m-    lua_assert(L->top - L->base == delta);[m
[31m-  }[m
[31m-#endif[m
[31m-  if ((g->hookmask & LUA_MASKCALL)) {[m
[31m-    int i;[m
[31m-    for (i = 0; i < missing; i++)  /* Add missing parameters. */[m
[31m-      setnilV(L->top++);[m
[31m-    callhook(L, LUA_HOOKCALL, -1);[m
[31m-    /* Preserve modifications of missing parameters by lua_setlocal(). */[m
[31m-    while (missing-- > 0 && tvisnil(L->top - 1))[m
[31m-      L->top--;[m
[31m-  }[m
[31m-#if LJ_HASJIT[m
[31m-out:[m
[31m-#endif[m
[31m-  op = bc_op(pc[-1]);  /* Get FUNC* op. */[m
[31m-#if LJ_HASJIT[m
[31m-  /* Use the non-hotcounting variants if JIT is off or while recording. */[m
[31m-  if ((!(J->flags & JIT_F_ON) || J->state != LJ_TRACE_IDLE) &&[m
[31m-      (op == BC_FUNCF || op == BC_FUNCV))[m
[31m-    op = (BCOp)((int)op+(int)BC_IFUNCF-(int)BC_FUNCF);[m
[31m-#endif[m
[31m-  ERRNO_RESTORE[m
[31m-  return makeasmfunc(lj_bc_ofs[op]);  /* Return static dispatch target. */[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Stitch a new trace. */[m
[31m-void LJ_FASTCALL lj_dispatch_stitch(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  lua_State *L = J->L;[m
[31m-  void *cf = cframe_raw(L->cframe);[m
[31m-  const BCIns *oldpc = cframe_pc(cf);[m
[31m-  setcframe_pc(cf, pc);[m
[31m-  /* Before dispatch, have to bias PC by 1. */[m
[31m-  L->top = L->base + cur_topslot(curr_proto(L), pc+1, cframe_multres_n(cf));[m
[31m-  lj_trace_stitch(J, pc-1);  /* Point to the CALL instruction. */[m
[31m-  setcframe_pc(cf, oldpc);[m
[31m-  ERRNO_RESTORE[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-/* Profile dispatch. */[m
[31m-void LJ_FASTCALL lj_dispatch_profile(lua_State *L, const BCIns *pc)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  GCproto *pt = funcproto(fn);[m
[31m-  void *cf = cframe_raw(L->cframe);[m
[31m-  const BCIns *oldpc = cframe_pc(cf);[m
[31m-  global_State *g;[m
[31m-  setcframe_pc(cf, pc);[m
[31m-  L->top = L->base + cur_topslot(pt, pc, cframe_multres_n(cf));[m
[31m-  lj_profile_interpreter(L);[m
[31m-  setcframe_pc(cf, oldpc);[m
[31m-  g = G(L);[m
[31m-  setgcref(g->cur_L, obj2gco(L));[m
[31m-  setvmstate(g, INTERP);[m
[31m-  ERRNO_RESTORE[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.h[m
[1mdeleted file mode 100644[m
[1mindex 8270807..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_dispatch.h[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-/*[m
[31m-** Instruction dispatch handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_DISPATCH_H[m
[31m-#define _LJ_DISPATCH_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_MIPS[m
[31m-/* Need our own global offset table for the dreaded MIPS calling conventions. */[m
[31m-[m
[31m-#ifndef _LJ_VM_H[m
[31m-LJ_ASMF int32_t LJ_FASTCALL lj_vm_modi(int32_t a, int32_t b);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-#ifndef _LJ_IRCALL_H[m
[31m-extern double __adddf3(double a, double b);[m
[31m-extern double __subdf3(double a, double b);[m
[31m-extern double __muldf3(double a, double b);[m
[31m-extern double __divdf3(double a, double b);[m
[31m-#endif[m
[31m-#define SFGOTDEF(_)	_(sqrt) _(__adddf3) _(__subdf3) _(__muldf3) _(__divdf3)[m
[31m-#else[m
[31m-#define SFGOTDEF(_)[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-#define JITGOTDEF(_)	_(lj_trace_exit) _(lj_trace_hot)[m
[31m-#else[m
[31m-#define JITGOTDEF(_)[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-#define FFIGOTDEF(_) \[m
[31m-  _(lj_meta_equal_cd) _(lj_ccallback_enter) _(lj_ccallback_leave)[m
[31m-#else[m
[31m-#define FFIGOTDEF(_)[m
[31m-#endif[m
[31m-#define GOTDEF(_) \[m
[31m-  _(floor) _(ceil) _(trunc) _(log) _(log10) _(exp) _(sin) _(cos) _(tan) \[m
[31m-  _(asin) _(acos) _(atan) _(sinh) _(cosh) _(tanh) _(frexp) _(modf) _(atan2) \[m
[31m-  _(pow) _(fmod) _(ldexp) _(lj_vm_modi) \[m
[31m-  _(lj_dispatch_call) _(lj_dispatch_ins) _(lj_dispatch_stitch) \[m
[31m-  _(lj_dispatch_profile) _(lj_err_throw) \[m
[31m-  _(lj_ffh_coroutine_wrap_err) _(lj_func_closeuv) _(lj_func_newL_gc) \[m
[31m-  _(lj_gc_barrieruv) _(lj_gc_step) _(lj_gc_step_fixtop) _(lj_meta_arith) \[m
[31m-  _(lj_meta_call) _(lj_meta_cat) _(lj_meta_comp) _(lj_meta_equal) \[m
[31m-  _(lj_meta_for) _(lj_meta_istype) _(lj_meta_len) _(lj_meta_tget) \[m
[31m-  _(lj_meta_tset) _(lj_state_growstack) _(lj_strfmt_number) \[m
[31m-  _(lj_str_new) _(lj_tab_dup) _(lj_tab_get) _(lj_tab_getinth) _(lj_tab_len) \[m
[31m-  _(lj_tab_new) _(lj_tab_newkey) _(lj_tab_next) _(lj_tab_reasize) \[m
[31m-  _(lj_tab_setinth) _(lj_buf_putstr_reverse) _(lj_buf_putstr_lower) \[m
[31m-  _(lj_buf_putstr_upper) _(lj_buf_tostr) \[m
[31m-  JITGOTDEF(_) FFIGOTDEF(_) SFGOTDEF(_)[m
[31m-[m
[31m-enum {[m
[31m-#define GOTENUM(name) LJ_GOT_##name,[m
[31m-GOTDEF(GOTENUM)[m
[31m-#undef GOTENUM[m
[31m-  LJ_GOT__MAX[m
[31m-};[m
[31m-#endif[m
[31m-[m
[31m-/* Type of hot counter. Must match the code in the assembler VM. */[m
[31m-/* 16 bits are sufficient. Only 0.0015% overhead with maximum slot penalty. */[m
[31m-typedef uint16_t HotCount;[m
[31m-[m
[31m-/* Number of hot counter hash table entries (must be a power of two). */[m
[31m-#define HOTCOUNT_SIZE		64[m
[31m-#define HOTCOUNT_PCMASK		((HOTCOUNT_SIZE-1)*sizeof(HotCount))[m
[31m-[m
[31m-/* Hotcount decrements. */[m
[31m-#define HOTCOUNT_LOOP		2[m
[31m-#define HOTCOUNT_CALL		1[m
[31m-[m
[31m-/* This solves a circular dependency problem -- bump as needed. Sigh. */[m
[31m-#define GG_NUM_ASMFF	57[m
[31m-[m
[31m-#define GG_LEN_DDISP	(BC__MAX + GG_NUM_ASMFF)[m
[31m-#define GG_LEN_SDISP	BC_FUNCF[m
[31m-#define GG_LEN_DISP	(GG_LEN_DDISP + GG_LEN_SDISP)[m
[31m-[m
[31m-/* Global state, main thread and extra fields are allocated together. */[m
[31m-typedef struct GG_State {[m
[31m-  lua_State L;				/* Main thread. */[m
[31m-  global_State g;			/* Global state. */[m
[31m-#if LJ_TARGET_MIPS[m
[31m-  ASMFunction got[LJ_GOT__MAX];		/* Global offset table. */[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-  jit_State J;				/* JIT state. */[m
[31m-  HotCount hotcount[HOTCOUNT_SIZE];	/* Hot counters. */[m
[31m-#endif[m
[31m-  ASMFunction dispatch[GG_LEN_DISP];	/* Instruction dispatch tables. */[m
[31m-  BCIns bcff[GG_NUM_ASMFF];		/* Bytecode for ASM fast functions. */[m
[31m-} GG_State;[m
[31m-[m
[31m-#define GG_OFS(field)	((int)offsetof(GG_State, field))[m
[31m-#define G2GG(gl)	((GG_State *)((char *)(gl) - GG_OFS(g)))[m
[31m-#define J2GG(j)		((GG_State *)((char *)(j) - GG_OFS(J)))[m
[31m-#define L2GG(L)		(G2GG(G(L)))[m
[31m-#define J2G(J)		(&J2GG(J)->g)[m
[31m-#define G2J(gl)		(&G2GG(gl)->J)[m
[31m-#define L2J(L)		(&L2GG(L)->J)[m
[31m-#define GG_G2DISP	(GG_OFS(dispatch) - GG_OFS(g))[m
[31m-#define GG_DISP2G	(GG_OFS(g) - GG_OFS(dispatch))[m
[31m-#define GG_DISP2J	(GG_OFS(J) - GG_OFS(dispatch))[m
[31m-#define GG_DISP2HOT	(GG_OFS(hotcount) - GG_OFS(dispatch))[m
[31m-#define GG_DISP2STATIC	(GG_LEN_DDISP*(int)sizeof(ASMFunction))[m
[31m-[m
[31m-#define hotcount_get(gg, pc) \[m
[31m-  (gg)->hotcount[(u32ptr(pc)>>2) & (HOTCOUNT_SIZE-1)][m
[31m-#define hotcount_set(gg, pc, val) \[m
[31m-  (hotcount_get((gg), (pc)) = (HotCount)(val))[m
[31m-[m
[31m-/* Dispatch table management. */[m
[31m-LJ_FUNC void lj_dispatch_init(GG_State *GG);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC void lj_dispatch_init_hotcount(global_State *g);[m
[31m-#endif[m
[31m-LJ_FUNC void lj_dispatch_update(global_State *g);[m
[31m-[m
[31m-/* Instruction dispatch callback for hooks or when recording. */[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc);[m
[31m-LJ_FUNCA ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns*pc);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_dispatch_stitch(jit_State *J, const BCIns *pc);[m
[31m-#endif[m
[31m-#if LJ_HASPROFILE[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_dispatch_profile(lua_State *L, const BCIns *pc);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASFFI && !defined(_BUILDVM_H)[m
[31m-/* Save/restore errno and GetLastError() around hooks, exits and recording. */[m
[31m-#include <errno.h>[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-#define ERRNO_SAVE	int olderr = errno; DWORD oldwerr = GetLastError();[m
[31m-#define ERRNO_RESTORE	errno = olderr; SetLastError(oldwerr);[m
[31m-#else[m
[31m-#define ERRNO_SAVE	int olderr = errno;[m
[31m-#define ERRNO_RESTORE	errno = olderr;[m
[31m-#endif[m
[31m-#else[m
[31m-#define ERRNO_SAVE[m
[31m-#define ERRNO_RESTORE[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_arm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_arm.h[m
[1mdeleted file mode 100644[m
[1mindex 47fee5f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_arm.h[m
[1m+++ /dev/null[m
[36m@@ -1,356 +0,0 @@[m
[31m-/*[m
[31m-** ARM instruction emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Constant encoding --------------------------------------------------- */[m
[31m-[m
[31m-static uint8_t emit_invai[16] = {[m
[31m-  /* AND */ (ARMI_AND^ARMI_BIC) >> 21,[m
[31m-  /* EOR */ 0,[m
[31m-  /* SUB */ (ARMI_SUB^ARMI_ADD) >> 21,[m
[31m-  /* RSB */ 0,[m
[31m-  /* ADD */ (ARMI_ADD^ARMI_SUB) >> 21,[m
[31m-  /* ADC */ (ARMI_ADC^ARMI_SBC) >> 21,[m
[31m-  /* SBC */ (ARMI_SBC^ARMI_ADC) >> 21,[m
[31m-  /* RSC */ 0,[m
[31m-  /* TST */ 0,[m
[31m-  /* TEQ */ 0,[m
[31m-  /* CMP */ (ARMI_CMP^ARMI_CMN) >> 21,[m
[31m-  /* CMN */ (ARMI_CMN^ARMI_CMP) >> 21,[m
[31m-  /* ORR */ 0,[m
[31m-  /* MOV */ (ARMI_MOV^ARMI_MVN) >> 21,[m
[31m-  /* BIC */ (ARMI_BIC^ARMI_AND) >> 21,[m
[31m-  /* MVN */ (ARMI_MVN^ARMI_MOV) >> 21[m
[31m-};[m
[31m-[m
[31m-/* Encode constant in K12 format for data processing instructions. */[m
[31m-static uint32_t emit_isk12(ARMIns ai, int32_t n)[m
[31m-{[m
[31m-  uint32_t invai, i, m = (uint32_t)n;[m
[31m-  /* K12: unsigned 8 bit value, rotated in steps of two bits. */[m
[31m-  for (i = 0; i < 4096; i += 256, m = lj_rol(m, 2))[m
[31m-    if (m <= 255) return ARMI_K12|m|i;[m
[31m-  /* Otherwise try negation/complement with the inverse instruction. */[m
[31m-  invai = emit_invai[((ai >> 21) & 15)];[m
[31m-  if (!invai) return 0;  /* Failed. No inverse instruction. */[m
[31m-  m = ~(uint32_t)n;[m
[31m-  if (invai == ((ARMI_SUB^ARMI_ADD) >> 21) ||[m
[31m-      invai == (ARMI_CMP^ARMI_CMN) >> 21) m++;[m
[31m-  for (i = 0; i < 4096; i += 256, m = lj_rol(m, 2))[m
[31m-    if (m <= 255) return ARMI_K12|(invai<<21)|m|i;[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* -- Emit basic instructions --------------------------------------------- */[m
[31m-[m
[31m-static void emit_dnm(ASMState *as, ARMIns ai, Reg rd, Reg rn, Reg rm)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_D(rd) | ARMF_N(rn) | ARMF_M(rm);[m
[31m-}[m
[31m-[m
[31m-static void emit_dm(ASMState *as, ARMIns ai, Reg rd, Reg rm)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_D(rd) | ARMF_M(rm);[m
[31m-}[m
[31m-[m
[31m-static void emit_dn(ASMState *as, ARMIns ai, Reg rd, Reg rn)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_D(rd) | ARMF_N(rn);[m
[31m-}[m
[31m-[m
[31m-static void emit_nm(ASMState *as, ARMIns ai, Reg rn, Reg rm)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_N(rn) | ARMF_M(rm);[m
[31m-}[m
[31m-[m
[31m-static void emit_d(ASMState *as, ARMIns ai, Reg rd)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_D(rd);[m
[31m-}[m
[31m-[m
[31m-static void emit_n(ASMState *as, ARMIns ai, Reg rn)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_N(rn);[m
[31m-}[m
[31m-[m
[31m-static void emit_m(ASMState *as, ARMIns ai, Reg rm)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_M(rm);[m
[31m-}[m
[31m-[m
[31m-static void emit_lsox(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)[m
[31m-{[m
[31m-  lua_assert(ofs >= -255 && ofs <= 255);[m
[31m-  if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;[m
[31m-  *--as->mcp = ai | ARMI_LS_P | ARMI_LSX_I | ARMF_D(rd) | ARMF_N(rn) |[m
[31m-	       ((ofs & 0xf0) << 4) | (ofs & 0x0f);[m
[31m-}[m
[31m-[m
[31m-static void emit_lso(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)[m
[31m-{[m
[31m-  lua_assert(ofs >= -4095 && ofs <= 4095);[m
[31m-  /* Combine LDR/STR pairs to LDRD/STRD. */[m
[31m-  if (*as->mcp == (ai|ARMI_LS_P|ARMI_LS_U|ARMF_D(rd^1)|ARMF_N(rn)|(ofs^4)) &&[m
[31m-      (ai & ~(ARMI_LDR^ARMI_STR)) == ARMI_STR && rd != rn &&[m
[31m-      (uint32_t)ofs <= 252 && !(ofs & 3) && !((rd ^ (ofs >>2)) & 1) &&[m
[31m-      as->mcp != as->mcloop) {[m
[31m-    as->mcp++;[m
[31m-    emit_lsox(as, ai == ARMI_LDR ? ARMI_LDRD : ARMI_STRD, rd&~1, rn, ofs&~4);[m
[31m-    return;[m
[31m-  }[m
[31m-  if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;[m
[31m-  *--as->mcp = ai | ARMI_LS_P | ARMF_D(rd) | ARMF_N(rn) | ofs;[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void emit_vlso(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)[m
[31m-{[m
[31m-  lua_assert(ofs >= -1020 && ofs <= 1020 && (ofs&3) == 0);[m
[31m-  if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;[m
[31m-  *--as->mcp = ai | ARMI_LS_P | ARMF_D(rd & 15) | ARMF_N(rn) | (ofs >> 2);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Emit loads/stores --------------------------------------------------- */[m
[31m-[m
[31m-/* Prefer spills of BASE/L. */[m
[31m-#define emit_canremat(ref)	((ref) < ASMREF_L)[m
[31m-[m
[31m-/* Try to find a one step delta relative to another constant. */[m
[31m-static int emit_kdelta1(ASMState *as, Reg d, int32_t i)[m
[31m-{[m
[31m-  RegSet work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    lua_assert(r != d);[m
[31m-    if (emit_canremat(ref)) {[m
[31m-      int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);[m
[31m-      uint32_t k = emit_isk12(ARMI_ADD, delta);[m
[31m-      if (k) {[m
[31m-	if (k == ARMI_K12)[m
[31m-	  emit_dm(as, ARMI_MOV, d, r);[m
[31m-	else[m
[31m-	  emit_dn(as, ARMI_ADD^k, d, r);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* Try to find a two step delta relative to another constant. */[m
[31m-static int emit_kdelta2(ASMState *as, Reg d, int32_t i)[m
[31m-{[m
[31m-  RegSet work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    lua_assert(r != d);[m
[31m-    if (emit_canremat(ref)) {[m
[31m-      int32_t other = ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i;[m
[31m-      if (other) {[m
[31m-	int32_t delta = i - other;[m
[31m-	uint32_t sh, inv = 0, k2, k;[m
[31m-	if (delta < 0) { delta = -delta; inv = ARMI_ADD^ARMI_SUB; }[m
[31m-	sh = lj_ffs(delta) & ~1;[m
[31m-	k2 = emit_isk12(0, delta & (255 << sh));[m
[31m-	k = emit_isk12(0, delta & ~(255 << sh));[m
[31m-	if (k) {[m
[31m-	  emit_dn(as, ARMI_ADD^k2^inv, d, d);[m
[31m-	  emit_dn(as, ARMI_ADD^k^inv, d, r);[m
[31m-	  return 1;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* Load a 32 bit constant into a GPR. */[m
[31m-static void emit_loadi(ASMState *as, Reg r, int32_t i)[m
[31m-{[m
[31m-  uint32_t k = emit_isk12(ARMI_MOV, i);[m
[31m-  lua_assert(rset_test(as->freeset, r) || r == RID_TMP);[m
[31m-  if (k) {[m
[31m-    /* Standard K12 constant. */[m
[31m-    emit_d(as, ARMI_MOV^k, r);[m
[31m-  } else if ((as->flags & JIT_F_ARMV6T2) && (uint32_t)i < 0x00010000u) {[m
[31m-    /* 16 bit loword constant for ARMv6T2. */[m
[31m-    emit_d(as, ARMI_MOVW|(i & 0x0fff)|((i & 0xf000)<<4), r);[m
[31m-  } else if (emit_kdelta1(as, r, i)) {[m
[31m-    /* One step delta relative to another constant. */[m
[31m-  } else if ((as->flags & JIT_F_ARMV6T2)) {[m
[31m-    /* 32 bit hiword/loword constant for ARMv6T2. */[m
[31m-    emit_d(as, ARMI_MOVT|((i>>16) & 0x0fff)|(((i>>16) & 0xf000)<<4), r);[m
[31m-    emit_d(as, ARMI_MOVW|(i & 0x0fff)|((i & 0xf000)<<4), r);[m
[31m-  } else if (emit_kdelta2(as, r, i)) {[m
[31m-    /* Two step delta relative to another constant. */[m
[31m-  } else {[m
[31m-    /* Otherwise construct the constant with up to 4 instructions. */[m
[31m-    /* NYI: use mvn+bic, use pc-relative loads. */[m
[31m-    for (;;) {[m
[31m-      uint32_t sh = lj_ffs(i) & ~1;[m
[31m-      int32_t m = i & (255 << sh);[m
[31m-      i &= ~(255 << sh);[m
[31m-      if (i == 0) {[m
[31m-	emit_d(as, ARMI_MOV ^ emit_isk12(0, m), r);[m
[31m-	break;[m
[31m-      }[m
[31m-      emit_dn(as, ARMI_ORR ^ emit_isk12(0, m), r, r);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))[m
[31m-[m
[31m-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);[m
[31m-[m
[31m-/* Get/set from constant pointer. */[m
[31m-static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p)[m
[31m-{[m
[31m-  int32_t i = i32ptr(p);[m
[31m-  emit_lso(as, ai, r, ra_allock(as, (i & ~4095), rset_exclude(RSET_GPR, r)),[m
[31m-	   (i & 4095));[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-/* Load a number constant into an FPR. */[m
[31m-static void emit_loadn(ASMState *as, Reg r, cTValue *tv)[m
[31m-{[m
[31m-  int32_t i;[m
[31m-  if ((as->flags & JIT_F_VFPV3) && !tv->u32.lo) {[m
[31m-    uint32_t hi = tv->u32.hi;[m
[31m-    uint32_t b = ((hi >> 22) & 0x1ff);[m
[31m-    if (!(hi & 0xffff) && (b == 0x100 || b == 0x0ff)) {[m
[31m-      *--as->mcp = ARMI_VMOVI_D | ARMF_D(r & 15) |[m
[31m-		   ((tv->u32.hi >> 12) & 0x00080000) |[m
[31m-		   ((tv->u32.hi >> 4) & 0x00070000) |[m
[31m-		   ((tv->u32.hi >> 16) & 0x0000000f);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  i = i32ptr(tv);[m
[31m-  emit_vlso(as, ARMI_VLDR_D, r,[m
[31m-	    ra_allock(as, (i & ~1020), RSET_GPR), (i & 1020));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Get/set global_State fields. */[m
[31m-#define emit_getgl(as, r, field) \[m
[31m-  emit_lsptr(as, ARMI_LDR, (r), (void *)&J2G(as->J)->field)[m
[31m-#define emit_setgl(as, r, field) \[m
[31m-  emit_lsptr(as, ARMI_STR, (r), (void *)&J2G(as->J)->field)[m
[31m-[m
[31m-/* Trace number is determined from pc of exit instruction. */[m
[31m-#define emit_setvmstate(as, i)		UNUSED(i)[m
[31m-[m
[31m-/* -- Emit control-flow instructions -------------------------------------- */[m
[31m-[m
[31m-/* Label for internal jumps. */[m
[31m-typedef MCode *MCLabel;[m
[31m-[m
[31m-/* Return label pointing to current PC. */[m
[31m-#define emit_label(as)		((as)->mcp)[m
[31m-[m
[31m-static void emit_branch(ASMState *as, ARMIns ai, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  ptrdiff_t delta = (target - p) - 1;[m
[31m-  lua_assert(((delta + 0x00800000) >> 24) == 0);[m
[31m-  *--p = ai | ((uint32_t)delta & 0x00ffffffu);[m
[31m-  as->mcp = p;[m
[31m-}[m
[31m-[m
[31m-#define emit_jmp(as, target) emit_branch(as, ARMI_B, (target))[m
[31m-[m
[31m-static void emit_call(ASMState *as, void *target)[m
[31m-{[m
[31m-  MCode *p = --as->mcp;[m
[31m-  ptrdiff_t delta = ((char *)target - (char *)p) - 8;[m
[31m-  if ((((delta>>2) + 0x00800000) >> 24) == 0) {[m
[31m-    if ((delta & 1))[m
[31m-      *p = ARMI_BLX | ((uint32_t)(delta>>2) & 0x00ffffffu) | ((delta&2) << 27);[m
[31m-    else[m
[31m-      *p = ARMI_BL | ((uint32_t)(delta>>2) & 0x00ffffffu);[m
[31m-  } else {  /* Target out of range: need indirect call. But don't use R0-R3. */[m
[31m-    Reg r = ra_allock(as, i32ptr(target), RSET_RANGE(RID_R4, RID_R12+1));[m
[31m-    *p = ARMI_BLXr | ARMF_M(r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Emit generic operations --------------------------------------------- */[m
[31m-[m
[31m-/* Generic move between two regs. */[m
[31m-static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!irt_isnum(ir->t)); UNUSED(ir);[m
[31m-#else[m
[31m-  if (dst >= RID_MAX_GPR) {[m
[31m-    emit_dm(as, irt_isnum(ir->t) ? ARMI_VMOV_D : ARMI_VMOV_S,[m
[31m-	    (dst & 15), (src & 15));[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  if (as->mcp != as->mcloop) {  /* Swap early registers for loads/stores. */[m
[31m-    MCode ins = *as->mcp, swp = (src^dst);[m
[31m-    if ((ins & 0x0c000000) == 0x04000000 && (ins & 0x02000010) != 0x02000010) {[m
[31m-      if (!((ins ^ (dst << 16)) & 0x000f0000))[m
[31m-	*as->mcp = ins ^ (swp << 16);  /* Swap N in load/store. */[m
[31m-      if (!(ins & 0x00100000) && !((ins ^ (dst << 12)) & 0x0000f000))[m
[31m-	*as->mcp = ins ^ (swp << 12);  /* Swap D in store. */[m
[31m-    }[m
[31m-  }[m
[31m-  emit_dm(as, ARMI_MOV, dst, src);[m
[31m-}[m
[31m-[m
[31m-/* Generic load of register with base and (small) offset address. */[m
[31m-static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!irt_isnum(ir->t)); UNUSED(ir);[m
[31m-#else[m
[31m-  if (r >= RID_MAX_GPR)[m
[31m-    emit_vlso(as, irt_isnum(ir->t) ? ARMI_VLDR_D : ARMI_VLDR_S, r, base, ofs);[m
[31m-  else[m
[31m-#endif[m
[31m-    emit_lso(as, ARMI_LDR, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Generic store of register with base and (small) offset address. */[m
[31m-static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!irt_isnum(ir->t)); UNUSED(ir);[m
[31m-#else[m
[31m-  if (r >= RID_MAX_GPR)[m
[31m-    emit_vlso(as, irt_isnum(ir->t) ? ARMI_VSTR_D : ARMI_VSTR_S, r, base, ofs);[m
[31m-  else[m
[31m-#endif[m
[31m-    emit_lso(as, ARMI_STR, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Emit an arithmetic/logic operation with a constant operand. */[m
[31m-static void emit_opk(ASMState *as, ARMIns ai, Reg dest, Reg src,[m
[31m-		     int32_t i, RegSet allow)[m
[31m-{[m
[31m-  uint32_t k = emit_isk12(ai, i);[m
[31m-  if (k)[m
[31m-    emit_dn(as, ai^k, dest, src);[m
[31m-  else[m
[31m-    emit_dnm(as, ai, dest, src, ra_allock(as, i, allow));[m
[31m-}[m
[31m-[m
[31m-/* Add offset to pointer. */[m
[31m-static void emit_addptr(ASMState *as, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs)[m
[31m-    emit_opk(as, ARMI_ADD, r, r, ofs, rset_exclude(RSET_GPR, r));[m
[31m-}[m
[31m-[m
[31m-#define emit_spsub(as, ofs)	emit_addptr(as, RID_SP, -(ofs))[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_mips.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_mips.h[m
[1mdeleted file mode 100644[m
[1mindex fdebe94..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_mips.h[m
[1m+++ /dev/null[m
[36m@@ -1,213 +0,0 @@[m
[31m-/*[m
[31m-** MIPS instruction emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Emit basic instructions --------------------------------------------- */[m
[31m-[m
[31m-static void emit_dst(ASMState *as, MIPSIns mi, Reg rd, Reg rs, Reg rt)[m
[31m-{[m
[31m-  *--as->mcp = mi | MIPSF_D(rd) | MIPSF_S(rs) | MIPSF_T(rt);[m
[31m-}[m
[31m-[m
[31m-static void emit_dta(ASMState *as, MIPSIns mi, Reg rd, Reg rt, uint32_t a)[m
[31m-{[m
[31m-  *--as->mcp = mi | MIPSF_D(rd) | MIPSF_T(rt) | MIPSF_A(a);[m
[31m-}[m
[31m-[m
[31m-#define emit_ds(as, mi, rd, rs)		emit_dst(as, (mi), (rd), (rs), 0)[m
[31m-#define emit_tg(as, mi, rt, rg)		emit_dst(as, (mi), (rg)&31, 0, (rt))[m
[31m-[m
[31m-static void emit_tsi(ASMState *as, MIPSIns mi, Reg rt, Reg rs, int32_t i)[m
[31m-{[m
[31m-  *--as->mcp = mi | MIPSF_T(rt) | MIPSF_S(rs) | (i & 0xffff);[m
[31m-}[m
[31m-[m
[31m-#define emit_ti(as, mi, rt, i)		emit_tsi(as, (mi), (rt), 0, (i))[m
[31m-#define emit_hsi(as, mi, rh, rs, i)	emit_tsi(as, (mi), (rh) & 31, (rs), (i))[m
[31m-[m
[31m-static void emit_fgh(ASMState *as, MIPSIns mi, Reg rf, Reg rg, Reg rh)[m
[31m-{[m
[31m-  *--as->mcp = mi | MIPSF_F(rf&31) | MIPSF_G(rg&31) | MIPSF_H(rh&31);[m
[31m-}[m
[31m-[m
[31m-#define emit_fg(as, mi, rf, rg)		emit_fgh(as, (mi), (rf), (rg), 0)[m
[31m-[m
[31m-static void emit_rotr(ASMState *as, Reg dest, Reg src, Reg tmp, uint32_t shift)[m
[31m-{[m
[31m-  if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-    emit_dta(as, MIPSI_ROTR, dest, src, shift);[m
[31m-  } else {[m
[31m-    emit_dst(as, MIPSI_OR, dest, dest, tmp);[m
[31m-    emit_dta(as, MIPSI_SLL, dest, src, (-shift)&31);[m
[31m-    emit_dta(as, MIPSI_SRL, tmp, src, shift);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Emit loads/stores --------------------------------------------------- */[m
[31m-[m
[31m-/* Prefer rematerialization of BASE/L from global_State over spills. */[m
[31m-#define emit_canremat(ref)	((ref) <= REF_BASE)[m
[31m-[m
[31m-/* Try to find a one step delta relative to another constant. */[m
[31m-static int emit_kdelta1(ASMState *as, Reg t, int32_t i)[m
[31m-{[m
[31m-  RegSet work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    lua_assert(r != t);[m
[31m-    if (ref < ASMREF_L) {[m
[31m-      int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);[m
[31m-      if (checki16(delta)) {[m
[31m-	emit_tsi(as, MIPSI_ADDIU, t, r, delta);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* Load a 32 bit constant into a GPR. */[m
[31m-static void emit_loadi(ASMState *as, Reg r, int32_t i)[m
[31m-{[m
[31m-  if (checki16(i)) {[m
[31m-    emit_ti(as, MIPSI_LI, r, i);[m
[31m-  } else {[m
[31m-    if ((i & 0xffff)) {[m
[31m-      int32_t jgl = i32ptr(J2G(as->J));[m
[31m-      if ((uint32_t)(i-jgl) < 65536) {[m
[31m-	emit_tsi(as, MIPSI_ADDIU, r, RID_JGL, i-jgl-32768);[m
[31m-	return;[m
[31m-      } else if (emit_kdelta1(as, r, i)) {[m
[31m-	return;[m
[31m-      } else if ((i >> 16) == 0) {[m
[31m-	emit_tsi(as, MIPSI_ORI, r, RID_ZERO, i);[m
[31m-	return;[m
[31m-      }[m
[31m-      emit_tsi(as, MIPSI_ORI, r, r, i);[m
[31m-    }[m
[31m-    emit_ti(as, MIPSI_LUI, r, (i >> 16));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))[m
[31m-[m
[31m-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);[m
[31m-static void ra_allockreg(ASMState *as, int32_t k, Reg r);[m
[31m-[m
[31m-/* Get/set from constant pointer. */[m
[31m-static void emit_lsptr(ASMState *as, MIPSIns mi, Reg r, void *p, RegSet allow)[m
[31m-{[m
[31m-  int32_t jgl = i32ptr(J2G(as->J));[m
[31m-  int32_t i = i32ptr(p);[m
[31m-  Reg base;[m
[31m-  if ((uint32_t)(i-jgl) < 65536) {[m
[31m-    i = i-jgl-32768;[m
[31m-    base = RID_JGL;[m
[31m-  } else {[m
[31m-    base = ra_allock(as, i-(int16_t)i, allow);[m
[31m-  }[m
[31m-  emit_tsi(as, mi, r, base, i);[m
[31m-}[m
[31m-[m
[31m-#define emit_loadn(as, r, tv) \[m
[31m-  emit_lsptr(as, MIPSI_LDC1, ((r) & 31), (void *)(tv), RSET_GPR)[m
[31m-[m
[31m-/* Get/set global_State fields. */[m
[31m-static void emit_lsglptr(ASMState *as, MIPSIns mi, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  emit_tsi(as, mi, r, RID_JGL, ofs-32768);[m
[31m-}[m
[31m-[m
[31m-#define emit_getgl(as, r, field) \[m
[31m-  emit_lsglptr(as, MIPSI_LW, (r), (int32_t)offsetof(global_State, field))[m
[31m-#define emit_setgl(as, r, field) \[m
[31m-  emit_lsglptr(as, MIPSI_SW, (r), (int32_t)offsetof(global_State, field))[m
[31m-[m
[31m-/* Trace number is determined from per-trace exit stubs. */[m
[31m-#define emit_setvmstate(as, i)		UNUSED(i)[m
[31m-[m
[31m-/* -- Emit control-flow instructions -------------------------------------- */[m
[31m-[m
[31m-/* Label for internal jumps. */[m
[31m-typedef MCode *MCLabel;[m
[31m-[m
[31m-/* Return label pointing to current PC. */[m
[31m-#define emit_label(as)		((as)->mcp)[m
[31m-[m
[31m-static void emit_branch(ASMState *as, MIPSIns mi, Reg rs, Reg rt, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  ptrdiff_t delta = target - p;[m
[31m-  lua_assert(((delta + 0x8000) >> 16) == 0);[m
[31m-  *--p = mi | MIPSF_S(rs) | MIPSF_T(rt) | ((uint32_t)delta & 0xffffu);[m
[31m-  as->mcp = p;[m
[31m-}[m
[31m-[m
[31m-static void emit_jmp(ASMState *as, MCode *target)[m
[31m-{[m
[31m-  *--as->mcp = MIPSI_NOP;[m
[31m-  emit_branch(as, MIPSI_B, RID_ZERO, RID_ZERO, (target));[m
[31m-}[m
[31m-[m
[31m-static void emit_call(ASMState *as, void *target, int needcfa)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  *--p = MIPSI_NOP;[m
[31m-  if ((((uintptr_t)target ^ (uintptr_t)p) >> 28) == 0) {[m
[31m-    *--p = MIPSI_JAL | (((uintptr_t)target >>2) & 0x03ffffffu);[m
[31m-  } else {  /* Target out of range: need indirect call. */[m
[31m-    *--p = MIPSI_JALR | MIPSF_S(RID_CFUNCADDR);[m
[31m-    needcfa = 1;[m
[31m-  }[m
[31m-  as->mcp = p;[m
[31m-  if (needcfa) ra_allockreg(as, i32ptr(target), RID_CFUNCADDR);[m
[31m-}[m
[31m-[m
[31m-/* -- Emit generic operations --------------------------------------------- */[m
[31m-[m
[31m-#define emit_move(as, dst, src) \[m
[31m-  emit_ds(as, MIPSI_MOVE, (dst), (src))[m
[31m-[m
[31m-/* Generic move between two regs. */[m
[31m-static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)[m
[31m-{[m
[31m-  if (dst < RID_MAX_GPR)[m
[31m-    emit_move(as, dst, src);[m
[31m-  else[m
[31m-    emit_fg(as, irt_isnum(ir->t) ? MIPSI_MOV_D : MIPSI_MOV_S, dst, src);[m
[31m-}[m
[31m-[m
[31m-/* Generic load of register with base and (small) offset address. */[m
[31m-static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_tsi(as, MIPSI_LW, r, base, ofs);[m
[31m-  else[m
[31m-    emit_tsi(as, irt_isnum(ir->t) ? MIPSI_LDC1 : MIPSI_LWC1,[m
[31m-	     (r & 31), base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Generic store of register with base and (small) offset address. */[m
[31m-static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_tsi(as, MIPSI_SW, r, base, ofs);[m
[31m-  else[m
[31m-    emit_tsi(as, irt_isnum(ir->t) ? MIPSI_SDC1 : MIPSI_SWC1,[m
[31m-	     (r&31), base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Add offset to pointer. */[m
[31m-static void emit_addptr(ASMState *as, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs) {[m
[31m-    lua_assert(checki16(ofs));[m
[31m-    emit_tsi(as, MIPSI_ADDIU, r, r, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_spsub(as, ofs)	emit_addptr(as, RID_SP, -(ofs))[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex 4eb933e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,238 +0,0 @@[m
[31m-/*[m
[31m-** PPC instruction emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Emit basic instructions --------------------------------------------- */[m
[31m-[m
[31m-static void emit_tab(ASMState *as, PPCIns pi, Reg rt, Reg ra, Reg rb)[m
[31m-{[m
[31m-  *--as->mcp = pi | PPCF_T(rt) | PPCF_A(ra) | PPCF_B(rb);[m
[31m-}[m
[31m-[m
[31m-#define emit_asb(as, pi, ra, rs, rb)	emit_tab(as, (pi), (rs), (ra), (rb))[m
[31m-#define emit_as(as, pi, ra, rs)		emit_tab(as, (pi), (rs), (ra), 0)[m
[31m-#define emit_ab(as, pi, ra, rb)		emit_tab(as, (pi), 0, (ra), (rb))[m
[31m-[m
[31m-static void emit_tai(ASMState *as, PPCIns pi, Reg rt, Reg ra, int32_t i)[m
[31m-{[m
[31m-  *--as->mcp = pi | PPCF_T(rt) | PPCF_A(ra) | (i & 0xffff);[m
[31m-}[m
[31m-[m
[31m-#define emit_ti(as, pi, rt, i)		emit_tai(as, (pi), (rt), 0, (i))[m
[31m-#define emit_ai(as, pi, ra, i)		emit_tai(as, (pi), 0, (ra), (i))[m
[31m-#define emit_asi(as, pi, ra, rs, i)	emit_tai(as, (pi), (rs), (ra), (i))[m
[31m-[m
[31m-#define emit_fab(as, pi, rf, ra, rb) \[m
[31m-  emit_tab(as, (pi), (rf)&31, (ra)&31, (rb)&31)[m
[31m-#define emit_fb(as, pi, rf, rb)		emit_tab(as, (pi), (rf)&31, 0, (rb)&31)[m
[31m-#define emit_fac(as, pi, rf, ra, rc) \[m
[31m-  emit_tab(as, (pi) | PPCF_C((rc) & 31), (rf)&31, (ra)&31, 0)[m
[31m-#define emit_facb(as, pi, rf, ra, rc, rb) \[m
[31m-  emit_tab(as, (pi) | PPCF_C((rc) & 31), (rf)&31, (ra)&31, (rb)&31)[m
[31m-#define emit_fai(as, pi, rf, ra, i)	emit_tai(as, (pi), (rf)&31, (ra), (i))[m
[31m-[m
[31m-static void emit_rot(ASMState *as, PPCIns pi, Reg ra, Reg rs,[m
[31m-		     int32_t n, int32_t b, int32_t e)[m
[31m-{[m
[31m-  *--as->mcp = pi | PPCF_T(rs) | PPCF_A(ra) | PPCF_B(n) |[m
[31m-	       PPCF_MB(b) | PPCF_ME(e);[m
[31m-}[m
[31m-[m
[31m-static void emit_slwi(ASMState *as, Reg ra, Reg rs, int32_t n)[m
[31m-{[m
[31m-  lua_assert(n >= 0 && n < 32);[m
[31m-  emit_rot(as, PPCI_RLWINM, ra, rs, n, 0, 31-n);[m
[31m-}[m
[31m-[m
[31m-static void emit_rotlwi(ASMState *as, Reg ra, Reg rs, int32_t n)[m
[31m-{[m
[31m-  lua_assert(n >= 0 && n < 32);[m
[31m-  emit_rot(as, PPCI_RLWINM, ra, rs, n, 0, 31);[m
[31m-}[m
[31m-[m
[31m-/* -- Emit loads/stores --------------------------------------------------- */[m
[31m-[m
[31m-/* Prefer rematerialization of BASE/L from global_State over spills. */[m
[31m-#define emit_canremat(ref)	((ref) <= REF_BASE)[m
[31m-[m
[31m-/* Try to find a one step delta relative to another constant. */[m
[31m-static int emit_kdelta1(ASMState *as, Reg t, int32_t i)[m
[31m-{[m
[31m-  RegSet work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    lua_assert(r != t);[m
[31m-    if (ref < ASMREF_L) {[m
[31m-      int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);[m
[31m-      if (checki16(delta)) {[m
[31m-	emit_tai(as, PPCI_ADDI, t, r, delta);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* Load a 32 bit constant into a GPR. */[m
[31m-static void emit_loadi(ASMState *as, Reg r, int32_t i)[m
[31m-{[m
[31m-  if (checki16(i)) {[m
[31m-    emit_ti(as, PPCI_LI, r, i);[m
[31m-  } else {[m
[31m-    if ((i & 0xffff)) {[m
[31m-      int32_t jgl = i32ptr(J2G(as->J));[m
[31m-      if ((uint32_t)(i-jgl) < 65536) {[m
[31m-	emit_tai(as, PPCI_ADDI, r, RID_JGL, i-jgl-32768);[m
[31m-	return;[m
[31m-      } else if (emit_kdelta1(as, r, i)) {[m
[31m-	return;[m
[31m-      }[m
[31m-      emit_asi(as, PPCI_ORI, r, r, i);[m
[31m-    }[m
[31m-    emit_ti(as, PPCI_LIS, r, (i >> 16));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))[m
[31m-[m
[31m-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);[m
[31m-[m
[31m-/* Get/set from constant pointer. */[m
[31m-static void emit_lsptr(ASMState *as, PPCIns pi, Reg r, void *p, RegSet allow)[m
[31m-{[m
[31m-  int32_t jgl = i32ptr(J2G(as->J));[m
[31m-  int32_t i = i32ptr(p);[m
[31m-  Reg base;[m
[31m-  if ((uint32_t)(i-jgl) < 65536) {[m
[31m-    i = i-jgl-32768;[m
[31m-    base = RID_JGL;[m
[31m-  } else {[m
[31m-    base = ra_allock(as, i-(int16_t)i, allow);[m
[31m-  }[m
[31m-  emit_tai(as, pi, r, base, i);[m
[31m-}[m
[31m-[m
[31m-#define emit_loadn(as, r, tv) \[m
[31m-  emit_lsptr(as, PPCI_LFD, ((r) & 31), (void *)(tv), RSET_GPR)[m
[31m-[m
[31m-/* Get/set global_State fields. */[m
[31m-static void emit_lsglptr(ASMState *as, PPCIns pi, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  emit_tai(as, pi, r, RID_JGL, ofs-32768);[m
[31m-}[m
[31m-[m
[31m-#define emit_getgl(as, r, field) \[m
[31m-  emit_lsglptr(as, PPCI_LWZ, (r), (int32_t)offsetof(global_State, field))[m
[31m-#define emit_setgl(as, r, field) \[m
[31m-  emit_lsglptr(as, PPCI_STW, (r), (int32_t)offsetof(global_State, field))[m
[31m-[m
[31m-/* Trace number is determined from per-trace exit stubs. */[m
[31m-#define emit_setvmstate(as, i)		UNUSED(i)[m
[31m-[m
[31m-/* -- Emit control-flow instructions -------------------------------------- */[m
[31m-[m
[31m-/* Label for internal jumps. */[m
[31m-typedef MCode *MCLabel;[m
[31m-[m
[31m-/* Return label pointing to current PC. */[m
[31m-#define emit_label(as)		((as)->mcp)[m
[31m-[m
[31m-static void emit_condbranch(ASMState *as, PPCIns pi, PPCCC cc, MCode *target)[m
[31m-{[m
[31m-  MCode *p = --as->mcp;[m
[31m-  ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-  lua_assert(((delta + 0x8000) >> 16) == 0);[m
[31m-  pi ^= (delta & 0x8000) * (PPCF_Y/0x8000);[m
[31m-  *p = pi | PPCF_CC(cc) | ((uint32_t)delta & 0xffffu);[m
[31m-}[m
[31m-[m
[31m-static void emit_jmp(ASMState *as, MCode *target)[m
[31m-{[m
[31m-  MCode *p = --as->mcp;[m
[31m-  ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-  *p = PPCI_B | (delta & 0x03fffffcu);[m
[31m-}[m
[31m-[m
[31m-static void emit_call(ASMState *as, void *target)[m
[31m-{[m
[31m-  MCode *p = --as->mcp;[m
[31m-  ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-  if ((((delta>>2) + 0x00800000) >> 24) == 0) {[m
[31m-    *p = PPCI_BL | (delta & 0x03fffffcu);[m
[31m-  } else {  /* Target out of range: need indirect call. Don't use arg reg. */[m
[31m-    RegSet allow = RSET_GPR & ~RSET_RANGE(RID_R0, REGARG_LASTGPR+1);[m
[31m-    Reg r = ra_allock(as, i32ptr(target), allow);[m
[31m-    *p = PPCI_BCTRL;[m
[31m-    p[-1] = PPCI_MTCTR | PPCF_T(r);[m
[31m-    as->mcp = p-1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Emit generic operations --------------------------------------------- */[m
[31m-[m
[31m-#define emit_mr(as, dst, src) \[m
[31m-  emit_asb(as, PPCI_MR, (dst), (src), (src))[m
[31m-[m
[31m-/* Generic move between two regs. */[m
[31m-static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  if (dst < RID_MAX_GPR)[m
[31m-    emit_mr(as, dst, src);[m
[31m-  else[m
[31m-    emit_fb(as, PPCI_FMR, dst, src);[m
[31m-}[m
[31m-[m
[31m-/* Generic load of register with base and (small) offset address. */[m
[31m-static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_tai(as, PPCI_LWZ, r, base, ofs);[m
[31m-  else[m
[31m-    emit_fai(as, irt_isnum(ir->t) ? PPCI_LFD : PPCI_LFS, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Generic store of register with base and (small) offset address. */[m
[31m-static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_tai(as, PPCI_STW, r, base, ofs);[m
[31m-  else[m
[31m-    emit_fai(as, irt_isnum(ir->t) ? PPCI_STFD : PPCI_STFS, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Emit a compare (for equality) with a constant operand. */[m
[31m-static void emit_cmpi(ASMState *as, Reg r, int32_t k)[m
[31m-{[m
[31m-  if (checki16(k)) {[m
[31m-    emit_ai(as, PPCI_CMPWI, r, k);[m
[31m-  } else if (checku16(k)) {[m
[31m-    emit_ai(as, PPCI_CMPLWI, r, k);[m
[31m-  } else {[m
[31m-    emit_ai(as, PPCI_CMPLWI, RID_TMP, k);[m
[31m-    emit_asi(as, PPCI_XORIS, RID_TMP, r, (k >> 16));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Add offset to pointer. */[m
[31m-static void emit_addptr(ASMState *as, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs) {[m
[31m-    emit_tai(as, PPCI_ADDI, r, r, ofs);[m
[31m-    if (!checki16(ofs))[m
[31m-      emit_tai(as, PPCI_ADDIS, r, r, (ofs + 32768) >> 16);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void emit_spsub(ASMState *as, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs) {[m
[31m-    emit_tai(as, PPCI_STWU, RID_TMP, RID_SP, -ofs);[m
[31m-    emit_tai(as, PPCI_ADDI, RID_TMP, RID_SP,[m
[31m-	     CFRAME_SIZE + (as->parent ? as->parent->spadjust : 0));[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_x86.h[m
[1mdeleted file mode 100644[m
[1mindex cbaf4e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_emit_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,473 +0,0 @@[m
[31m-/*[m
[31m-** x86/x64 instruction emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Emit basic instructions --------------------------------------------- */[m
[31m-[m
[31m-#define MODRM(mode, r1, r2)	((MCode)((mode)+(((r1)&7)<<3)+((r2)&7)))[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define REXRB(p, rr, rb) \[m
[31m-    { MCode rex = 0x40 + (((rr)>>1)&4) + (((rb)>>3)&1); \[m
[31m-      if (rex != 0x40) *--(p) = rex; }[m
[31m-#define FORCE_REX		0x200[m
[31m-#define REX_64			(FORCE_REX|0x080000)[m
[31m-#define VEX_64			0x800000[m
[31m-#else[m
[31m-#define REXRB(p, rr, rb)	((void)0)[m
[31m-#define FORCE_REX		0[m
[31m-#define REX_64			0[m
[31m-#define VEX_64			0[m
[31m-#endif[m
[31m-[m
[31m-#define emit_i8(as, i)		(*--as->mcp = (MCode)(i))[m
[31m-#define emit_i32(as, i)		(*(int32_t *)(as->mcp-4) = (i), as->mcp -= 4)[m
[31m-#define emit_u32(as, u)		(*(uint32_t *)(as->mcp-4) = (u), as->mcp -= 4)[m
[31m-[m
[31m-#define emit_x87op(as, xo) \[m
[31m-  (*(uint16_t *)(as->mcp-2) = (uint16_t)(xo), as->mcp -= 2)[m
[31m-[m
[31m-/* op */[m
[31m-static LJ_AINLINE MCode *emit_op(x86Op xo, Reg rr, Reg rb, Reg rx,[m
[31m-				 MCode *p, int delta)[m
[31m-{[m
[31m-  int n = (int8_t)xo;[m
[31m-  if (n == -60) {  /* VEX-encoded instruction */[m
[31m-#if LJ_64[m
[31m-    xo ^= (((rr>>1)&4)+((rx>>2)&2)+((rb>>3)&1))<<13;[m
[31m-#endif[m
[31m-    *(uint32_t *)(p+delta-5) = (uint32_t)xo;[m
[31m-    return p+delta-5;[m
[31m-  }[m
[31m-#if defined(__GNUC__)[m
[31m-  if (__builtin_constant_p(xo) && n == -2)[m
[31m-    p[delta-2] = (MCode)(xo >> 24);[m
[31m-  else if (__builtin_constant_p(xo) && n == -3)[m
[31m-    *(uint16_t *)(p+delta-3) = (uint16_t)(xo >> 16);[m
[31m-  else[m
[31m-#endif[m
[31m-    *(uint32_t *)(p+delta-5) = (uint32_t)xo;[m
[31m-  p += n + delta;[m
[31m-#if LJ_64[m
[31m-  {[m
[31m-    uint32_t rex = 0x40 + ((rr>>1)&(4+(FORCE_REX>>1)))+((rx>>2)&2)+((rb>>3)&1);[m
[31m-    if (rex != 0x40) {[m
[31m-      rex |= (rr >> 16);[m
[31m-      if (n == -4) { *p = (MCode)rex; rex = (MCode)(xo >> 8); }[m
[31m-      else if ((xo & 0xffffff) == 0x6600fd) { *p = (MCode)rex; rex = 0x66; }[m
[31m-      *--p = (MCode)rex;[m
[31m-    }[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(rr); UNUSED(rb); UNUSED(rx);[m
[31m-#endif[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* op + modrm */[m
[31m-#define emit_opm(xo, mode, rr, rb, p, delta) \[m
[31m-  (p[(delta)-1] = MODRM((mode), (rr), (rb)), \[m
[31m-   emit_op((xo), (rr), (rb), 0, (p), (delta)))[m
[31m-[m
[31m-/* op + modrm + sib */[m
[31m-#define emit_opmx(xo, mode, scale, rr, rb, rx, p) \[m
[31m-  (p[-1] = MODRM((scale), (rx), (rb)), \[m
[31m-   p[-2] = MODRM((mode), (rr), RID_ESP), \[m
[31m-   emit_op((xo), (rr), (rb), (rx), (p), -1))[m
[31m-[m
[31m-/* op r1, r2 */[m
[31m-static void emit_rr(ASMState *as, x86Op xo, Reg r1, Reg r2)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  as->mcp = emit_opm(xo, XM_REG, r1, r2, p, 0);[m
[31m-}[m
[31m-[m
[31m-#if LJ_64 && defined(LUA_USE_ASSERT)[m
[31m-/* [addr] is sign-extended in x64 and must be in lower 2G (not 4G). */[m
[31m-static int32_t ptr2addr(const void *p)[m
[31m-{[m
[31m-  lua_assert((uintptr_t)p < (uintptr_t)0x80000000);[m
[31m-  return i32ptr(p);[m
[31m-}[m
[31m-#else[m
[31m-#define ptr2addr(p)	(i32ptr((p)))[m
[31m-#endif[m
[31m-[m
[31m-/* op r, [addr] */[m
[31m-static void emit_rma(ASMState *as, x86Op xo, Reg rr, const void *addr)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  *(int32_t *)(p-4) = ptr2addr(addr);[m
[31m-#if LJ_64[m
[31m-  p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP);[m
[31m-  as->mcp = emit_opm(xo, XM_OFS0, rr, RID_ESP, p, -5);[m
[31m-#else[m
[31m-  as->mcp = emit_opm(xo, XM_OFS0, rr, RID_EBP, p, -4);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* op r, [base+ofs] */[m
[31m-static void emit_rmro(ASMState *as, x86Op xo, Reg rr, Reg rb, int32_t ofs)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  x86Mode mode;[m
[31m-  if (ra_hasreg(rb)) {[m
[31m-    if (ofs == 0 && (rb&7) != RID_EBP) {[m
[31m-      mode = XM_OFS0;[m
[31m-    } else if (checki8(ofs)) {[m
[31m-      *--p = (MCode)ofs;[m
[31m-      mode = XM_OFS8;[m
[31m-    } else {[m
[31m-      p -= 4;[m
[31m-      *(int32_t *)p = ofs;[m
[31m-      mode = XM_OFS32;[m
[31m-    }[m
[31m-    if ((rb&7) == RID_ESP)[m
[31m-      *--p = MODRM(XM_SCALE1, RID_ESP, RID_ESP);[m
[31m-  } else {[m
[31m-    *(int32_t *)(p-4) = ofs;[m
[31m-#if LJ_64[m
[31m-    p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP);[m
[31m-    p -= 5;[m
[31m-    rb = RID_ESP;[m
[31m-#else[m
[31m-    p -= 4;[m
[31m-    rb = RID_EBP;[m
[31m-#endif[m
[31m-    mode = XM_OFS0;[m
[31m-  }[m
[31m-  as->mcp = emit_opm(xo, mode, rr, rb, p, 0);[m
[31m-}[m
[31m-[m
[31m-/* op r, [base+idx*scale+ofs] */[m
[31m-static void emit_rmrxo(ASMState *as, x86Op xo, Reg rr, Reg rb, Reg rx,[m
[31m-		       x86Mode scale, int32_t ofs)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  x86Mode mode;[m
[31m-  if (ofs == 0 && (rb&7) != RID_EBP) {[m
[31m-    mode = XM_OFS0;[m
[31m-  } else if (checki8(ofs)) {[m
[31m-    mode = XM_OFS8;[m
[31m-    *--p = (MCode)ofs;[m
[31m-  } else {[m
[31m-    mode = XM_OFS32;[m
[31m-    p -= 4;[m
[31m-    *(int32_t *)p = ofs;[m
[31m-  }[m
[31m-  as->mcp = emit_opmx(xo, mode, scale, rr, rb, rx, p);[m
[31m-}[m
[31m-[m
[31m-/* op r, i */[m
[31m-static void emit_gri(ASMState *as, x86Group xg, Reg rb, int32_t i)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  x86Op xo;[m
[31m-  if (checki8(i)) {[m
[31m-    *--p = (MCode)i;[m
[31m-    xo = XG_TOXOi8(xg);[m
[31m-  } else {[m
[31m-    p -= 4;[m
[31m-    *(int32_t *)p = i;[m
[31m-    xo = XG_TOXOi(xg);[m
[31m-  }[m
[31m-  as->mcp = emit_opm(xo, XM_REG, (Reg)(xg & 7) | (rb & REX_64), rb, p, 0);[m
[31m-}[m
[31m-[m
[31m-/* op [base+ofs], i */[m
[31m-static void emit_gmroi(ASMState *as, x86Group xg, Reg rb, int32_t ofs,[m
[31m-		       int32_t i)[m
[31m-{[m
[31m-  x86Op xo;[m
[31m-  if (checki8(i)) {[m
[31m-    emit_i8(as, i);[m
[31m-    xo = XG_TOXOi8(xg);[m
[31m-  } else {[m
[31m-    emit_i32(as, i);[m
[31m-    xo = XG_TOXOi(xg);[m
[31m-  }[m
[31m-  emit_rmro(as, xo, (Reg)(xg & 7), rb, ofs);[m
[31m-}[m
[31m-[m
[31m-#define emit_shifti(as, xg, r, i) \[m
[31m-  (emit_i8(as, (i)), emit_rr(as, XO_SHIFTi, (Reg)(xg), (r)))[m
[31m-[m
[31m-/* op r, rm/mrm */[m
[31m-static void emit_mrm(ASMState *as, x86Op xo, Reg rr, Reg rb)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  x86Mode mode = XM_REG;[m
[31m-  if (rb == RID_MRM) {[m
[31m-    rb = as->mrm.base;[m
[31m-    if (rb == RID_NONE) {[m
[31m-      rb = RID_EBP;[m
[31m-      mode = XM_OFS0;[m
[31m-      p -= 4;[m
[31m-      *(int32_t *)p = as->mrm.ofs;[m
[31m-      if (as->mrm.idx != RID_NONE)[m
[31m-	goto mrmidx;[m
[31m-#if LJ_64[m
[31m-      *--p = MODRM(XM_SCALE1, RID_ESP, RID_EBP);[m
[31m-      rb = RID_ESP;[m
[31m-#endif[m
[31m-    } else {[m
[31m-      if (as->mrm.ofs == 0 && (rb&7) != RID_EBP) {[m
[31m-	mode = XM_OFS0;[m
[31m-      } else if (checki8(as->mrm.ofs)) {[m
[31m-	*--p = (MCode)as->mrm.ofs;[m
[31m-	mode = XM_OFS8;[m
[31m-      } else {[m
[31m-	p -= 4;[m
[31m-	*(int32_t *)p = as->mrm.ofs;[m
[31m-	mode = XM_OFS32;[m
[31m-      }[m
[31m-      if (as->mrm.idx != RID_NONE) {[m
[31m-      mrmidx:[m
[31m-	as->mcp = emit_opmx(xo, mode, as->mrm.scale, rr, rb, as->mrm.idx, p);[m
[31m-	return;[m
[31m-      }[m
[31m-      if ((rb&7) == RID_ESP)[m
[31m-	*--p = MODRM(XM_SCALE1, RID_ESP, RID_ESP);[m
[31m-    }[m
[31m-  }[m
[31m-  as->mcp = emit_opm(xo, mode, rr, rb, p, 0);[m
[31m-}[m
[31m-[m
[31m-/* op rm/mrm, i */[m
[31m-static void emit_gmrmi(ASMState *as, x86Group xg, Reg rb, int32_t i)[m
[31m-{[m
[31m-  x86Op xo;[m
[31m-  if (checki8(i)) {[m
[31m-    emit_i8(as, i);[m
[31m-    xo = XG_TOXOi8(xg);[m
[31m-  } else {[m
[31m-    emit_i32(as, i);[m
[31m-    xo = XG_TOXOi(xg);[m
[31m-  }[m
[31m-  emit_mrm(as, xo, (Reg)(xg & 7) | (rb & REX_64), (rb & ~REX_64));[m
[31m-}[m
[31m-[m
[31m-/* -- Emit loads/stores --------------------------------------------------- */[m
[31m-[m
[31m-/* mov [base+ofs], i */[m
[31m-static void emit_movmroi(ASMState *as, Reg base, int32_t ofs, int32_t i)[m
[31m-{[m
[31m-  emit_i32(as, i);[m
[31m-  emit_rmro(as, XO_MOVmi, 0, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* mov [base+ofs], r */[m
[31m-#define emit_movtomro(as, r, base, ofs) \[m
[31m-  emit_rmro(as, XO_MOVto, (r), (base), (ofs))[m
[31m-[m
[31m-/* Get/set global_State fields. */[m
[31m-#define emit_opgl(as, xo, r, field) \[m
[31m-  emit_rma(as, (xo), (r), (void *)&J2G(as->J)->field)[m
[31m-#define emit_getgl(as, r, field)	emit_opgl(as, XO_MOV, (r), field)[m
[31m-#define emit_setgl(as, r, field)	emit_opgl(as, XO_MOVto, (r), field)[m
[31m-[m
[31m-#define emit_setvmstate(as, i) \[m
[31m-  (emit_i32(as, i), emit_opgl(as, XO_MOVmi, 0, vmstate))[m
[31m-[m
[31m-/* mov r, i / xor r, r */[m
[31m-static void emit_loadi(ASMState *as, Reg r, int32_t i)[m
[31m-{[m
[31m-  /* XOR r,r is shorter, but modifies the flags. This is bad for HIOP. */[m
[31m-  if (i == 0 && !(LJ_32 && (IR(as->curins)->o == IR_HIOP ||[m
[31m-			    (as->curins+1 < as->T->nins &&[m
[31m-			     IR(as->curins+1)->o == IR_HIOP)))) {[m
[31m-    emit_rr(as, XO_ARITH(XOg_XOR), r, r);[m
[31m-  } else {[m
[31m-    MCode *p = as->mcp;[m
[31m-    *(int32_t *)(p-4) = i;[m
[31m-    p[-5] = (MCode)(XI_MOVri+(r&7));[m
[31m-    p -= 5;[m
[31m-    REXRB(p, 0, r);[m
[31m-    as->mcp = p;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* mov r, addr */[m
[31m-#define emit_loada(as, r, addr) \[m
[31m-  emit_loadi(as, (r), ptr2addr((addr)))[m
[31m-[m
[31m-#if LJ_64[m
[31m-/* mov r, imm64 or shorter 32 bit extended load. */[m
[31m-static void emit_loadu64(ASMState *as, Reg r, uint64_t u64)[m
[31m-{[m
[31m-  if (checku32(u64)) {  /* 32 bit load clears upper 32 bits. */[m
[31m-    emit_loadi(as, r, (int32_t)u64);[m
[31m-  } else if (checki32((int64_t)u64)) {  /* Sign-extended 32 bit load. */[m
[31m-    MCode *p = as->mcp;[m
[31m-    *(int32_t *)(p-4) = (int32_t)u64;[m
[31m-    as->mcp = emit_opm(XO_MOVmi, XM_REG, REX_64, r, p, -4);[m
[31m-  } else {  /* Full-size 64 bit load. */[m
[31m-    MCode *p = as->mcp;[m
[31m-    *(uint64_t *)(p-8) = u64;[m
[31m-    p[-9] = (MCode)(XI_MOVri+(r&7));[m
[31m-    p[-10] = 0x48 + ((r>>3)&1);[m
[31m-    p -= 10;[m
[31m-    as->mcp = p;[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* movsd r, [&tv->n] / xorps r, r */[m
[31m-static void emit_loadn(ASMState *as, Reg r, cTValue *tv)[m
[31m-{[m
[31m-  if (tvispzero(tv))  /* Use xor only for +0. */[m
[31m-    emit_rr(as, XO_XORPS, r, r);[m
[31m-  else[m
[31m-    emit_rma(as, XO_MOVSD, r, &tv->n);[m
[31m-}[m
[31m-[m
[31m-/* -- Emit control-flow instructions -------------------------------------- */[m
[31m-[m
[31m-/* Label for short jumps. */[m
[31m-typedef MCode *MCLabel;[m
[31m-[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-/* jmp short target */[m
[31m-static void emit_sjmp(ASMState *as, MCLabel target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  ptrdiff_t delta = target - p;[m
[31m-  lua_assert(delta == (int8_t)delta);[m
[31m-  p[-1] = (MCode)(int8_t)delta;[m
[31m-  p[-2] = XI_JMPs;[m
[31m-  as->mcp = p - 2;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* jcc short target */[m
[31m-static void emit_sjcc(ASMState *as, int cc, MCLabel target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  ptrdiff_t delta = target - p;[m
[31m-  lua_assert(delta == (int8_t)delta);[m
[31m-  p[-1] = (MCode)(int8_t)delta;[m
[31m-  p[-2] = (MCode)(XI_JCCs+(cc&15));[m
[31m-  as->mcp = p - 2;[m
[31m-}[m
[31m-[m
[31m-/* jcc short (pending target) */[m
[31m-static MCLabel emit_sjcc_label(ASMState *as, int cc)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  p[-1] = 0;[m
[31m-  p[-2] = (MCode)(XI_JCCs+(cc&15));[m
[31m-  as->mcp = p - 2;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Fixup jcc short target. */[m
[31m-static void emit_sfixup(ASMState *as, MCLabel source)[m
[31m-{[m
[31m-  source[-1] = (MCode)(as->mcp-source);[m
[31m-}[m
[31m-[m
[31m-/* Return label pointing to current PC. */[m
[31m-#define emit_label(as)		((as)->mcp)[m
[31m-[m
[31m-/* Compute relative 32 bit offset for jump and call instructions. */[m
[31m-static LJ_AINLINE int32_t jmprel(MCode *p, MCode *target)[m
[31m-{[m
[31m-  ptrdiff_t delta = target - p;[m
[31m-  lua_assert(delta == (int32_t)delta);[m
[31m-  return (int32_t)delta;[m
[31m-}[m
[31m-[m
[31m-/* jcc target */[m
[31m-static void emit_jcc(ASMState *as, int cc, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  *(int32_t *)(p-4) = jmprel(p, target);[m
[31m-  p[-5] = (MCode)(XI_JCCn+(cc&15));[m
[31m-  p[-6] = 0x0f;[m
[31m-  as->mcp = p - 6;[m
[31m-}[m
[31m-[m
[31m-/* jmp target */[m
[31m-static void emit_jmp(ASMState *as, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  *(int32_t *)(p-4) = jmprel(p, target);[m
[31m-  p[-5] = XI_JMP;[m
[31m-  as->mcp = p - 5;[m
[31m-}[m
[31m-[m
[31m-/* call target */[m
[31m-static void emit_call_(ASMState *as, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-#if LJ_64[m
[31m-  if (target-p != (int32_t)(target-p)) {[m
[31m-    /* Assumes RID_RET is never an argument to calls and always clobbered. */[m
[31m-    emit_rr(as, XO_GROUP5, XOg_CALL, RID_RET);[m
[31m-    emit_loadu64(as, RID_RET, (uint64_t)target);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  *(int32_t *)(p-4) = jmprel(p, target);[m
[31m-  p[-5] = XI_CALL;[m
[31m-  as->mcp = p - 5;[m
[31m-}[m
[31m-[m
[31m-#define emit_call(as, f)	emit_call_(as, (MCode *)(void *)(f))[m
[31m-[m
[31m-/* -- Emit generic operations --------------------------------------------- */[m
[31m-[m
[31m-/* Use 64 bit operations to handle 64 bit IR types. */[m
[31m-#if LJ_64[m
[31m-#define REX_64IR(ir, r)		((r) + (irt_is64((ir)->t) ? REX_64 : 0))[m
[31m-#define VEX_64IR(ir, r)		((r) + (irt_is64((ir)->t) ? VEX_64 : 0))[m
[31m-#else[m
[31m-#define REX_64IR(ir, r)		(r)[m
[31m-#define VEX_64IR(ir, r)		(r)[m
[31m-#endif[m
[31m-[m
[31m-/* Generic move between two regs. */[m
[31m-static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  if (dst < RID_MAX_GPR)[m
[31m-    emit_rr(as, XO_MOV, REX_64IR(ir, dst), src);[m
[31m-  else[m
[31m-    emit_rr(as, XO_MOVAPS, dst, src);[m
[31m-}[m
[31m-[m
[31m-/* Generic load of register with base and (small) offset address. */[m
[31m-static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_rmro(as, XO_MOV, REX_64IR(ir, r), base, ofs);[m
[31m-  else[m
[31m-    emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSD : XO_MOVSS, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Generic store of register with base and (small) offset address. */[m
[31m-static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_rmro(as, XO_MOVto, REX_64IR(ir, r), base, ofs);[m
[31m-  else[m
[31m-    emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSDto : XO_MOVSSto, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Add offset to pointer. */[m
[31m-static void emit_addptr(ASMState *as, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs) {[m
[31m-    if ((as->flags & JIT_F_LEA_AGU))[m
[31m-      emit_rmro(as, XO_LEA, r, r, ofs);[m
[31m-    else[m
[31m-      emit_gri(as, XG_ARITHi(XOg_ADD), r, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_spsub(as, ofs)	emit_addptr(as, RID_ESP|REX_64, -(ofs))[m
[31m-[m
[31m-/* Prefer rematerialization of BASE/L from global_State over spills. */[m
[31m-#define emit_canremat(ref)	((ref) <= REF_BASE)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.c[m
[1mdeleted file mode 100644[m
[1mindex 36f96a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.c[m
[1m+++ /dev/null[m
[36m@@ -1,832 +0,0 @@[m
[31m-/*[m
[31m-** Error handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_err_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/*[m
[31m-** LuaJIT can either use internal or external frame unwinding:[m
[31m-**[m
[31m-** - Internal frame unwinding (INT) is free-standing and doesn't require[m
[31m-**   any OS or library support.[m
[31m-**[m
[31m-** - External frame unwinding (EXT) uses the system-provided unwind handler.[m
[31m-**[m
[31m-** Pros and Cons:[m
[31m-**[m
[31m-** - EXT requires unwind tables for *all* functions on the C stack between[m
[31m-**   the pcall/catch and the error/throw. This is the default on x64,[m
[31m-**   but needs to be manually enabled on x86/PPC for non-C++ code.[m
[31m-**[m
[31m-** - INT is faster when actually throwing errors (but this happens rarely).[m
[31m-**   Setting up error handlers is zero-cost in any case.[m
[31m-**[m
[31m-** - EXT provides full interoperability with C++ exceptions. You can throw[m
[31m-**   Lua errors or C++ exceptions through a mix of Lua frames and C++ frames.[m
[31m-**   C++ destructors are called as needed. C++ exceptions caught by pcall[m
[31m-**   are converted to the string "C++ exception". Lua errors can be caught[m
[31m-**   with catch (...) in C++.[m
[31m-**[m
[31m-** - INT has only limited support for automatically catching C++ exceptions[m
[31m-**   on POSIX systems using DWARF2 stack unwinding. Other systems may use[m
[31m-**   the wrapper function feature. Lua errors thrown through C++ frames[m
[31m-**   cannot be caught by C++ code and C++ destructors are not run.[m
[31m-**[m
[31m-** EXT is the default on x64 systems, INT is the default on all other systems.[m
[31m-**[m
[31m-** EXT can be manually enabled on POSIX systems using GCC and DWARF2 stack[m
[31m-** unwinding with -DLUAJIT_UNWIND_EXTERNAL. *All* C code must be compiled[m
[31m-** with -funwind-tables (or -fexceptions). This includes LuaJIT itself (set[m
[31m-** TARGET_CFLAGS), all of your C/Lua binding code, all loadable C modules[m
[31m-** and all C libraries that have callbacks which may be used to call back[m
[31m-** into Lua. C++ code must *not* be compiled with -fno-exceptions.[m
[31m-**[m
[31m-** EXT cannot be enabled on WIN32 since system exceptions use code-driven SEH.[m
[31m-** EXT is mandatory on WIN64 since the calling convention has an abundance[m
[31m-** of callee-saved registers (rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15).[m
[31m-** The POSIX/x64 interpreter only saves r12/r13 for INT (e.g. PS4).[m
[31m-*/[m
[31m-[m
[31m-#if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND[m
[31m-#define LJ_UNWIND_EXT	1[m
[31m-#elif LJ_TARGET_X64 && LJ_TARGET_WINDOWS[m
[31m-#define LJ_UNWIND_EXT	1[m
[31m-#endif[m
[31m-[m
[31m-/* -- Error messages ------------------------------------------------------ */[m
[31m-[m
[31m-/* Error message strings. */[m
[31m-LJ_DATADEF const char *lj_err_allmsg =[m
[31m-#define ERRDEF(name, msg)	msg "\0"[m
[31m-#include "lj_errmsg.h"[m
[31m-;[m
[31m-[m
[31m-/* -- Internal frame unwinding -------------------------------------------- */[m
[31m-[m
[31m-/* Unwind Lua stack and move error message to new top. */[m
[31m-LJ_NOINLINE static void unwindstack(lua_State *L, TValue *top)[m
[31m-{[m
[31m-  lj_func_closeuv(L, top);[m
[31m-  if (top < L->top-1) {[m
[31m-    copyTV(L, top, L->top-1);[m
[31m-    L->top = top+1;[m
[31m-  }[m
[31m-  lj_state_relimitstack(L);[m
[31m-}[m
[31m-[m
[31m-/* Unwind until stop frame. Optionally cleanup frames. */[m
[31m-static void *err_unwind(lua_State *L, void *stopcf, int errcode)[m
[31m-{[m
[31m-  TValue *frame = L->base-1;[m
[31m-  void *cf = L->cframe;[m
[31m-  while (cf) {[m
[31m-    int32_t nres = cframe_nres(cframe_raw(cf));[m
[31m-    if (nres < 0) {  /* C frame without Lua frame? */[m
[31m-      TValue *top = restorestack(L, -nres);[m
[31m-      if (frame < top) {  /* Frame reached? */[m
[31m-	if (errcode) {[m
[31m-	  L->base = frame+1;[m
[31m-	  L->cframe = cframe_prev(cf);[m
[31m-	  unwindstack(L, top);[m
[31m-	}[m
[31m-	return cf;[m
[31m-      }[m
[31m-    }[m
[31m-    if (frame <= tvref(L->stack)+LJ_FR2)[m
[31m-      break;[m
[31m-    switch (frame_typep(frame)) {[m
[31m-    case FRAME_LUA:  /* Lua frame. */[m
[31m-    case FRAME_LUAP:[m
[31m-      frame = frame_prevl(frame);[m
[31m-      break;[m
[31m-    case FRAME_C:  /* C frame. */[m
[31m-    unwind_c:[m
[31m-#if LJ_UNWIND_EXT[m
[31m-      if (errcode) {[m
[31m-	L->base = frame_prevd(frame) + 1;[m
[31m-	L->cframe = cframe_prev(cf);[m
[31m-	unwindstack(L, frame - LJ_FR2);[m
[31m-      } else if (cf != stopcf) {[m
[31m-	cf = cframe_prev(cf);[m
[31m-	frame = frame_prevd(frame);[m
[31m-	break;[m
[31m-      }[m
[31m-      return NULL;  /* Continue unwinding. */[m
[31m-#else[m
[31m-      UNUSED(stopcf);[m
[31m-      cf = cframe_prev(cf);[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-#endif[m
[31m-    case FRAME_CP:  /* Protected C frame. */[m
[31m-      if (cframe_canyield(cf)) {  /* Resume? */[m
[31m-	if (errcode) {[m
[31m-	  hook_leave(G(L));  /* Assumes nobody uses coroutines inside hooks. */[m
[31m-	  L->cframe = NULL;[m
[31m-	  L->status = (uint8_t)errcode;[m
[31m-	}[m
[31m-	return cf;[m
[31m-      }[m
[31m-      if (errcode) {[m
[31m-	L->base = frame_prevd(frame) + 1;[m
[31m-	L->cframe = cframe_prev(cf);[m
[31m-	unwindstack(L, frame - LJ_FR2);[m
[31m-      }[m
[31m-      return cf;[m
[31m-    case FRAME_CONT:  /* Continuation frame. */[m
[31m-      if (frame_iscont_fficb(frame))[m
[31m-	goto unwind_c;[m
[31m-    case FRAME_VARG:  /* Vararg frame. */[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-    case FRAME_PCALL:  /* FF pcall() frame. */[m
[31m-    case FRAME_PCALLH:  /* FF pcall() frame inside hook. */[m
[31m-      if (errcode) {[m
[31m-	if (errcode == LUA_YIELD) {[m
[31m-	  frame = frame_prevd(frame);[m
[31m-	  break;[m
[31m-	}[m
[31m-	if (frame_typep(frame) == FRAME_PCALL)[m
[31m-	  hook_leave(G(L));[m
[31m-	L->base = frame_prevd(frame) + 1;[m
[31m-	L->cframe = cf;[m
[31m-	unwindstack(L, L->base);[m
[31m-      }[m
[31m-      return (void *)((intptr_t)cf | CFRAME_UNWIND_FF);[m
[31m-    }[m
[31m-  }[m
[31m-  /* No C frame. */[m
[31m-  if (errcode) {[m
[31m-    L->base = tvref(L->stack)+1+LJ_FR2;[m
[31m-    L->cframe = NULL;[m
[31m-    unwindstack(L, L->base);[m
[31m-    if (G(L)->panic)[m
[31m-      G(L)->panic(L);[m
[31m-    exit(EXIT_FAILURE);[m
[31m-  }[m
[31m-  return L;  /* Anything non-NULL will do. */[m
[31m-}[m
[31m-[m
[31m-/* -- External frame unwinding -------------------------------------------- */[m
[31m-[m
[31m-#if defined(__GNUC__) && !LJ_NO_UNWIND && !LJ_ABI_WIN[m
[31m-[m
[31m-/*[m
[31m-** We have to use our own definitions instead of the mandatory (!) unwind.h,[m
[31m-** since various OS, distros and compilers mess up the header installation.[m
[31m-*/[m
[31m-[m
[31m-typedef struct _Unwind_Context _Unwind_Context;[m
[31m-[m
[31m-#define _URC_OK			0[m
[31m-#define _URC_FATAL_PHASE1_ERROR	3[m
[31m-#define _URC_HANDLER_FOUND	6[m
[31m-#define _URC_INSTALL_CONTEXT	7[m
[31m-#define _URC_CONTINUE_UNWIND	8[m
[31m-#define _URC_FAILURE		9[m
[31m-[m
[31m-#define LJ_UEXCLASS		0x4c55414a49543200ULL	/* LUAJIT2\0 */[m
[31m-#define LJ_UEXCLASS_MAKE(c)	(LJ_UEXCLASS | (uint64_t)(c))[m
[31m-#define LJ_UEXCLASS_CHECK(cl)	(((cl) ^ LJ_UEXCLASS) <= 0xff)[m
[31m-#define LJ_UEXCLASS_ERRCODE(cl)	((int)((cl) & 0xff))[m
[31m-[m
[31m-#if !LJ_TARGET_ARM[m
[31m-[m
[31m-typedef struct _Unwind_Exception[m
[31m-{[m
[31m-  uint64_t exclass;[m
[31m-  void (*excleanup)(int, struct _Unwind_Exception *);[m
[31m-  uintptr_t p1, p2;[m
[31m-} __attribute__((__aligned__)) _Unwind_Exception;[m
[31m-[m
[31m-extern uintptr_t _Unwind_GetCFA(_Unwind_Context *);[m
[31m-extern void _Unwind_SetGR(_Unwind_Context *, int, uintptr_t);[m
[31m-extern void _Unwind_SetIP(_Unwind_Context *, uintptr_t);[m
[31m-extern void _Unwind_DeleteException(_Unwind_Exception *);[m
[31m-extern int _Unwind_RaiseException(_Unwind_Exception *);[m
[31m-[m
[31m-#define _UA_SEARCH_PHASE	1[m
[31m-#define _UA_CLEANUP_PHASE	2[m
[31m-#define _UA_HANDLER_FRAME	4[m
[31m-#define _UA_FORCE_UNWIND	8[m
[31m-[m
[31m-/* DWARF2 personality handler referenced from interpreter .eh_frame. */[m
[31m-LJ_FUNCA int lj_err_unwind_dwarf(int version, int actions,[m
[31m-  uint64_t uexclass, _Unwind_Exception *uex, _Unwind_Context *ctx)[m
[31m-{[m
[31m-  void *cf;[m
[31m-  lua_State *L;[m
[31m-  if (version != 1)[m
[31m-    return _URC_FATAL_PHASE1_ERROR;[m
[31m-  UNUSED(uexclass);[m
[31m-  cf = (void *)_Unwind_GetCFA(ctx);[m
[31m-  L = cframe_L(cf);[m
[31m-  if ((actions & _UA_SEARCH_PHASE)) {[m
[31m-#if LJ_UNWIND_EXT[m
[31m-    if (err_unwind(L, cf, 0) == NULL)[m
[31m-      return _URC_CONTINUE_UNWIND;[m
[31m-#endif[m
[31m-    if (!LJ_UEXCLASS_CHECK(uexclass)) {[m
[31m-      setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));[m
[31m-    }[m
[31m-    return _URC_HANDLER_FOUND;[m
[31m-  }[m
[31m-  if ((actions & _UA_CLEANUP_PHASE)) {[m
[31m-    int errcode;[m
[31m-    if (LJ_UEXCLASS_CHECK(uexclass)) {[m
[31m-      errcode = LJ_UEXCLASS_ERRCODE(uexclass);[m
[31m-    } else {[m
[31m-      if ((actions & _UA_HANDLER_FRAME))[m
[31m-	_Unwind_DeleteException(uex);[m
[31m-      errcode = LUA_ERRRUN;[m
[31m-    }[m
[31m-#if LJ_UNWIND_EXT[m
[31m-    cf = err_unwind(L, cf, errcode);[m
[31m-    if ((actions & _UA_FORCE_UNWIND)) {[m
[31m-      return _URC_CONTINUE_UNWIND;[m
[31m-    } else if (cf) {[m
[31m-      _Unwind_SetGR(ctx, LJ_TARGET_EHRETREG, errcode);[m
[31m-      _Unwind_SetIP(ctx, (uintptr_t)(cframe_unwind_ff(cf) ?[m
[31m-				     lj_vm_unwind_ff_eh :[m
[31m-				     lj_vm_unwind_c_eh));[m
[31m-      return _URC_INSTALL_CONTEXT;[m
[31m-    }[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    else if ((actions & _UA_HANDLER_FRAME)) {[m
[31m-      /* Workaround for ancient libgcc bug. Still present in RHEL 5.5. :-/[m
[31m-      ** Real fix: http://gcc.gnu.org/viewcvs/trunk/gcc/unwind-dw2.c?r1=121165&r2=124837&pathrev=153877&diff_format=h[m
[31m-      */[m
[31m-      _Unwind_SetGR(ctx, LJ_TARGET_EHRETREG, errcode);[m
[31m-      _Unwind_SetIP(ctx, (uintptr_t)lj_vm_unwind_rethrow);[m
[31m-      return _URC_INSTALL_CONTEXT;[m
[31m-    }[m
[31m-#endif[m
[31m-#else[m
[31m-    /* This is not the proper way to escape from the unwinder. We get away with[m
[31m-    ** it on non-x64 because the interpreter restores all callee-saved regs.[m
[31m-    */[m
[31m-    lj_err_throw(L, errcode);[m
[31m-#endif[m
[31m-  }[m
[31m-  return _URC_CONTINUE_UNWIND;[m
[31m-}[m
[31m-[m
[31m-#if LJ_UNWIND_EXT[m
[31m-#if LJ_TARGET_OSX || defined(__OpenBSD__)[m
[31m-/* Sorry, no thread safety for OSX. Complain to Apple, not me. */[m
[31m-static _Unwind_Exception static_uex;[m
[31m-#else[m
[31m-static __thread _Unwind_Exception static_uex;[m
[31m-#endif[m
[31m-[m
[31m-/* Raise DWARF2 exception. */[m
[31m-static void err_raise_ext(int errcode)[m
[31m-{[m
[31m-  static_uex.exclass = LJ_UEXCLASS_MAKE(errcode);[m
[31m-  static_uex.excleanup = NULL;[m
[31m-  _Unwind_RaiseException(&static_uex);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#else /* LJ_TARGET_ARM */[m
[31m-[m
[31m-#define _US_VIRTUAL_UNWIND_FRAME	0[m
[31m-#define _US_UNWIND_FRAME_STARTING	1[m
[31m-#define _US_ACTION_MASK			3[m
[31m-#define _US_FORCE_UNWIND		8[m
[31m-[m
[31m-typedef struct _Unwind_Control_Block _Unwind_Control_Block;[m
[31m-[m
[31m-struct _Unwind_Control_Block {[m
[31m-  uint64_t exclass;[m
[31m-  uint32_t misc[20];[m
[31m-};[m
[31m-[m
[31m-extern int _Unwind_RaiseException(_Unwind_Control_Block *);[m
[31m-extern int __gnu_unwind_frame(_Unwind_Control_Block *, _Unwind_Context *);[m
[31m-extern int _Unwind_VRS_Set(_Unwind_Context *, int, uint32_t, int, void *);[m
[31m-extern int _Unwind_VRS_Get(_Unwind_Context *, int, uint32_t, int, void *);[m
[31m-[m
[31m-static inline uint32_t _Unwind_GetGR(_Unwind_Context *ctx, int r)[m
[31m-{[m
[31m-  uint32_t v;[m
[31m-  _Unwind_VRS_Get(ctx, 0, r, 0, &v);[m
[31m-  return v;[m
[31m-}[m
[31m-[m
[31m-static inline void _Unwind_SetGR(_Unwind_Context *ctx, int r, uint32_t v)[m
[31m-{[m
[31m-  _Unwind_VRS_Set(ctx, 0, r, 0, &v);[m
[31m-}[m
[31m-[m
[31m-extern void lj_vm_unwind_ext(void);[m
[31m-[m
[31m-/* ARM unwinder personality handler referenced from interpreter .ARM.extab. */[m
[31m-LJ_FUNCA int lj_err_unwind_arm(int state, _Unwind_Control_Block *ucb,[m
[31m-			       _Unwind_Context *ctx)[m
[31m-{[m
[31m-  void *cf = (void *)_Unwind_GetGR(ctx, 13);[m
[31m-  lua_State *L = cframe_L(cf);[m
[31m-  int errcode;[m
[31m-[m
[31m-  switch ((state & _US_ACTION_MASK)) {[m
[31m-  case _US_VIRTUAL_UNWIND_FRAME:[m
[31m-    if ((state & _US_FORCE_UNWIND)) break;[m
[31m-    return _URC_HANDLER_FOUND;[m
[31m-  case _US_UNWIND_FRAME_STARTING:[m
[31m-    if (LJ_UEXCLASS_CHECK(ucb->exclass)) {[m
[31m-      errcode = LJ_UEXCLASS_ERRCODE(ucb->exclass);[m
[31m-    } else {[m
[31m-      errcode = LUA_ERRRUN;[m
[31m-      setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));[m
[31m-    }[m
[31m-    cf = err_unwind(L, cf, errcode);[m
[31m-    if ((state & _US_FORCE_UNWIND) || cf == NULL) break;[m
[31m-    _Unwind_SetGR(ctx, 15, (uint32_t)lj_vm_unwind_ext);[m
[31m-    _Unwind_SetGR(ctx, 0, (uint32_t)ucb);[m
[31m-    _Unwind_SetGR(ctx, 1, (uint32_t)errcode);[m
[31m-    _Unwind_SetGR(ctx, 2, cframe_unwind_ff(cf) ?[m
[31m-			    (uint32_t)lj_vm_unwind_ff_eh :[m
[31m-			    (uint32_t)lj_vm_unwind_c_eh);[m
[31m-    return _URC_INSTALL_CONTEXT;[m
[31m-  default:[m
[31m-    return _URC_FAILURE;[m
[31m-  }[m
[31m-  if (__gnu_unwind_frame(ucb, ctx) != _URC_OK)[m
[31m-    return _URC_FAILURE;[m
[31m-  return _URC_CONTINUE_UNWIND;[m
[31m-}[m
[31m-[m
[31m-#if LJ_UNWIND_EXT[m
[31m-static __thread _Unwind_Control_Block static_uex;[m
[31m-[m
[31m-static void err_raise_ext(int errcode)[m
[31m-{[m
[31m-  memset(&static_uex, 0, sizeof(static_uex));[m
[31m-  static_uex.exclass = LJ_UEXCLASS_MAKE(errcode);[m
[31m-  _Unwind_RaiseException(&static_uex);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif /* LJ_TARGET_ARM */[m
[31m-[m
[31m-#elif LJ_TARGET_X64 && LJ_ABI_WIN[m
[31m-[m
[31m-/*[m
[31m-** Someone in Redmond owes me several days of my life. A lot of this is[m
[31m-** undocumented or just plain wrong on MSDN. Some of it can be gathered[m
[31m-** from 3rd party docs or must be found by trial-and-error. They really[m
[31m-** don't want you to write your own language-specific exception handler[m
[31m-** or to interact gracefully with MSVC. :-([m
[31m-**[m
[31m-** Apparently MSVC doesn't call C++ destructors for foreign exceptions[m
[31m-** unless you compile your C++ code with /EHa. Unfortunately this means[m
[31m-** catch (...) also catches things like access violations. The use of[m
[31m-** _set_se_translator doesn't really help, because it requires /EHa, too.[m
[31m-*/[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-/* Taken from: http://www.nynaeve.net/?p=99 */[m
[31m-typedef struct UndocumentedDispatcherContext {[m
[31m-  ULONG64 ControlPc;[m
[31m-  ULONG64 ImageBase;[m
[31m-  PRUNTIME_FUNCTION FunctionEntry;[m
[31m-  ULONG64 EstablisherFrame;[m
[31m-  ULONG64 TargetIp;[m
[31m-  PCONTEXT ContextRecord;[m
[31m-  void (*LanguageHandler)(void);[m
[31m-  PVOID HandlerData;[m
[31m-  PUNWIND_HISTORY_TABLE HistoryTable;[m
[31m-  ULONG ScopeIndex;[m
[31m-  ULONG Fill0;[m
[31m-} UndocumentedDispatcherContext;[m
[31m-[m
[31m-/* Another wild guess. */[m
[31m-extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);[m
[31m-[m
[31m-#ifdef MINGW_SDK_INIT[m
[31m-/* Workaround for broken MinGW64 declaration. */[m
[31m-VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");[m
[31m-#define RtlUnwindEx RtlUnwindEx_FIXED[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_MSVC_EXCODE		((DWORD)0xe06d7363)[m
[31m-#define LJ_GCC_EXCODE		((DWORD)0x20474343)[m
[31m-[m
[31m-#define LJ_EXCODE		((DWORD)0xe24c4a00)[m
[31m-#define LJ_EXCODE_MAKE(c)	(LJ_EXCODE | (DWORD)(c))[m
[31m-#define LJ_EXCODE_CHECK(cl)	(((cl) ^ LJ_EXCODE) <= 0xff)[m
[31m-#define LJ_EXCODE_ERRCODE(cl)	((int)((cl) & 0xff))[m
[31m-[m
[31m-/* Win64 exception handler for interpreter frame. */[m
[31m-LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,[m
[31m-  void *cf, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)[m
[31m-{[m
[31m-  lua_State *L = cframe_L(cf);[m
[31m-  int errcode = LJ_EXCODE_CHECK(rec->ExceptionCode) ?[m
[31m-		LJ_EXCODE_ERRCODE(rec->ExceptionCode) : LUA_ERRRUN;[m
[31m-  if ((rec->ExceptionFlags & 6)) {  /* EH_UNWINDING|EH_EXIT_UNWIND */[m
[31m-    /* Unwind internal frames. */[m
[31m-    err_unwind(L, cf, errcode);[m
[31m-  } else {[m
[31m-    void *cf2 = err_unwind(L, cf, 0);[m
[31m-    if (cf2) {  /* We catch it, so start unwinding the upper frames. */[m
[31m-      if (rec->ExceptionCode == LJ_MSVC_EXCODE ||[m
[31m-	  rec->ExceptionCode == LJ_GCC_EXCODE) {[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-	__DestructExceptionObject(rec, 1);[m
[31m-#endif[m
[31m-	setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));[m
[31m-      } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) {[m
[31m-	/* Don't catch access violations etc. */[m
[31m-	return ExceptionContinueSearch;[m
[31m-      }[m
[31m-      /* Unwind the stack and call all handlers for all lower C frames[m
[31m-      ** (including ourselves) again with EH_UNWINDING set. Then set[m
[31m-      ** rsp = cf, rax = errcode and jump to the specified target.[m
[31m-      */[m
[31m-      RtlUnwindEx(cf, (void *)((cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ?[m
[31m-			       lj_vm_unwind_ff_eh :[m
[31m-			       lj_vm_unwind_c_eh),[m
[31m-		  rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable);[m
[31m-      /* RtlUnwindEx should never return. */[m
[31m-    }[m
[31m-  }[m
[31m-  return ExceptionContinueSearch;[m
[31m-}[m
[31m-[m
[31m-/* Raise Windows exception. */[m
[31m-static void err_raise_ext(int errcode)[m
[31m-{[m
[31m-  RaiseException(LJ_EXCODE_MAKE(errcode), 1 /* EH_NONCONTINUABLE */, 0, NULL);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- Error handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Throw error. Find catch frame, unwind stack and continue. */[m
[31m-LJ_NOINLINE void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lj_trace_abort(g);[m
[31m-  g->saved_jit_base = g->jit_base;[m
[31m-  setmref(g->jit_base, NULL);[m
[31m-  L->status = 0;[m
[31m-#if LJ_UNWIND_EXT[m
[31m-  err_raise_ext(errcode);[m
[31m-  /*[m
[31m-  ** A return from this function signals a corrupt C stack that cannot be[m
[31m-  ** unwound. We have no choice but to call the panic function and exit.[m
[31m-  **[m
[31m-  ** Usually this is caused by a C function without unwind information.[m
[31m-  ** This should never happen on x64, but may happen if you've manually[m
[31m-  ** enabled LUAJIT_UNWIND_EXTERNAL and forgot to recompile *every*[m
[31m-  ** non-C++ file with -funwind-tables.[m
[31m-  */[m
[31m-  if (G(L)->panic)[m
[31m-    G(L)->panic(L);[m
[31m-#else[m
[31m-  {[m
[31m-    void *cf = err_unwind(L, NULL, errcode);[m
[31m-    if (cframe_unwind_ff(cf))[m
[31m-      lj_vm_unwind_ff(cframe_raw(cf));[m
[31m-    else[m
[31m-      lj_vm_unwind_c(cframe_raw(cf), errcode);[m
[31m-  }[m
[31m-#endif[m
[31m-  exit(EXIT_FAILURE);[m
[31m-}[m
[31m-[m
[31m-/* Return string object for error message. */[m
[31m-LJ_NOINLINE GCstr *lj_err_str(lua_State *L, ErrMsg em)[m
[31m-{[m
[31m-  return lj_str_newz(L, err2msg(em));[m
[31m-}[m
[31m-[m
[31m-/* Out-of-memory error. */[m
[31m-LJ_NOINLINE void lj_err_mem(lua_State *L)[m
[31m-{[m
[31m-  if (L->status == LUA_ERRERR+1)  /* Don't touch the stack during lua_open. */[m
[31m-    lj_vm_unwind_c(L->cframe, LUA_ERRMEM);[m
[31m-  setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRMEM));[m
[31m-  lj_err_throw(L, LUA_ERRMEM);[m
[31m-}[m
[31m-[m
[31m-/* Find error function for runtime errors. Requires an extra stack traversal. */[m
[31m-static ptrdiff_t finderrfunc(lua_State *L)[m
[31m-{[m
[31m-  cTValue *frame = L->base-1, *bot = tvref(L->stack)+LJ_FR2;[m
[31m-  void *cf = L->cframe;[m
[31m-  while (frame > bot && cf) {[m
[31m-    while (cframe_nres(cframe_raw(cf)) < 0) {  /* cframe without frame? */[m
[31m-      if (frame >= restorestack(L, -cframe_nres(cf)))[m
[31m-	break;[m
[31m-      if (cframe_errfunc(cf) >= 0)  /* Error handler not inherited (-1)? */[m
[31m-	return cframe_errfunc(cf);[m
[31m-      cf = cframe_prev(cf);  /* Else unwind cframe and continue searching. */[m
[31m-      if (cf == NULL)[m
[31m-	return 0;[m
[31m-    }[m
[31m-    switch (frame_typep(frame)) {[m
[31m-    case FRAME_LUA:[m
[31m-    case FRAME_LUAP:[m
[31m-      frame = frame_prevl(frame);[m
[31m-      break;[m
[31m-    case FRAME_C:[m
[31m-      cf = cframe_prev(cf);[m
[31m-      /* fallthrough */[m
[31m-    case FRAME_VARG:[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-    case FRAME_CONT:[m
[31m-      if (frame_iscont_fficb(frame))[m
[31m-	cf = cframe_prev(cf);[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-    case FRAME_CP:[m
[31m-      if (cframe_canyield(cf)) return 0;[m
[31m-      if (cframe_errfunc(cf) >= 0)[m
[31m-	return cframe_errfunc(cf);[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-    case FRAME_PCALL:[m
[31m-    case FRAME_PCALLH:[m
[31m-      if (frame_func(frame_prevd(frame))->c.ffid == FF_xpcall)[m
[31m-	return savestack(L, frame_prevd(frame)+1);  /* xpcall's errorfunc. */[m
[31m-      return 0;[m
[31m-    default:[m
[31m-      lua_assert(0);[m
[31m-      return 0;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Runtime error. */[m
[31m-LJ_NOINLINE void lj_err_run(lua_State *L)[m
[31m-{[m
[31m-  ptrdiff_t ef = finderrfunc(L);[m
[31m-  if (ef) {[m
[31m-    TValue *errfunc = restorestack(L, ef);[m
[31m-    TValue *top = L->top;[m
[31m-    lj_trace_abort(G(L));[m
[31m-    if (!tvisfunc(errfunc) || L->status == LUA_ERRERR) {[m
[31m-      setstrV(L, top-1, lj_err_str(L, LJ_ERR_ERRERR));[m
[31m-      lj_err_throw(L, LUA_ERRERR);[m
[31m-    }[m
[31m-    L->status = LUA_ERRERR;[m
[31m-    copyTV(L, top+LJ_FR2, top-1);[m
[31m-    copyTV(L, top-1, errfunc);[m
[31m-    if (LJ_FR2) setnilV(top++);[m
[31m-    L->top = top+1;[m
[31m-    lj_vm_call(L, top, 1+1);  /* Stack: |errfunc|msg| -> |msg| */[m
[31m-  }[m
[31m-  lj_err_throw(L, LUA_ERRRUN);[m
[31m-}[m
[31m-[m
[31m-/* Formatted runtime error message. */[m
[31m-LJ_NORET LJ_NOINLINE static void err_msgv(lua_State *L, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, em);[m
[31m-  if (curr_funcisL(L)) L->top = curr_topL(L);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  va_end(argp);[m
[31m-  lj_debug_addloc(L, msg, L->base-1, NULL);[m
[31m-  lj_err_run(L);[m
[31m-}[m
[31m-[m
[31m-/* Non-vararg variant for better calling conventions. */[m
[31m-LJ_NOINLINE void lj_err_msg(lua_State *L, ErrMsg em)[m
[31m-{[m
[31m-  err_msgv(L, em);[m
[31m-}[m
[31m-[m
[31m-/* Lexer error. */[m
[31m-LJ_NOINLINE void lj_err_lex(lua_State *L, GCstr *src, const char *tok,[m
[31m-			    BCLine line, ErrMsg em, va_list argp)[m
[31m-{[m
[31m-  char buff[LUA_IDSIZE];[m
[31m-  const char *msg;[m
[31m-  lj_debug_shortname(buff, src, line);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  msg = lj_strfmt_pushf(L, "%s:%d: %s", buff, line, msg);[m
[31m-  if (tok)[m
[31m-    lj_strfmt_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tok);[m
[31m-  lj_err_throw(L, LUA_ERRSYNTAX);[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for operands. */[m
[31m-LJ_NOINLINE void lj_err_optype(lua_State *L, cTValue *o, ErrMsg opm)[m
[31m-{[m
[31m-  const char *tname = lj_typename(o);[m
[31m-  const char *opname = err2msg(opm);[m
[31m-  if (curr_funcisL(L)) {[m
[31m-    GCproto *pt = curr_proto(L);[m
[31m-    const BCIns *pc = cframe_Lpc(L) - 1;[m
[31m-    const char *oname = NULL;[m
[31m-    const char *kind = lj_debug_slotname(pt, pc, (BCReg)(o-L->base), &oname);[m
[31m-    if (kind)[m
[31m-      err_msgv(L, LJ_ERR_BADOPRT, opname, kind, oname, tname);[m
[31m-  }[m
[31m-  err_msgv(L, LJ_ERR_BADOPRV, opname, tname);[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for ordered comparisons. */[m
[31m-LJ_NOINLINE void lj_err_comp(lua_State *L, cTValue *o1, cTValue *o2)[m
[31m-{[m
[31m-  const char *t1 = lj_typename(o1);[m
[31m-  const char *t2 = lj_typename(o2);[m
[31m-  err_msgv(L, t1 == t2 ? LJ_ERR_BADCMPV : LJ_ERR_BADCMPT, t1, t2);[m
[31m-  /* This assumes the two "boolean" entries are commoned by the C compiler. */[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for __call. */[m
[31m-LJ_NOINLINE void lj_err_optype_call(lua_State *L, TValue *o)[m
[31m-{[m
[31m-  /* Gross hack if lua_[p]call or pcall/xpcall fail for a non-callable object:[m
[31m-  ** L->base still points to the caller. So add a dummy frame with L instead[m
[31m-  ** of a function. See lua_getstack().[m
[31m-  */[m
[31m-  const BCIns *pc = cframe_Lpc(L);[m
[31m-  if (((ptrdiff_t)pc & FRAME_TYPE) != FRAME_LUA) {[m
[31m-    const char *tname = lj_typename(o);[m
[31m-    if (LJ_FR2) o++;[m
[31m-    setframe_pc(o, pc);[m
[31m-    setframe_gc(o, obj2gco(L), LJ_TTHREAD);[m
[31m-    L->top = L->base = o+1;[m
[31m-    err_msgv(L, LJ_ERR_BADCALL, tname);[m
[31m-  }[m
[31m-  lj_err_optype(L, o, LJ_ERR_OPCALL);[m
[31m-}[m
[31m-[m
[31m-/* Error in context of caller. */[m
[31m-LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg)[m
[31m-{[m
[31m-  TValue *frame = L->base-1;[m
[31m-  TValue *pframe = NULL;[m
[31m-  if (frame_islua(frame)) {[m
[31m-    pframe = frame_prevl(frame);[m
[31m-  } else if (frame_iscont(frame)) {[m
[31m-    if (frame_iscont_fficb(frame)) {[m
[31m-      pframe = frame;[m
[31m-      frame = NULL;[m
[31m-    } else {[m
[31m-      pframe = frame_prevd(frame);[m
[31m-#if LJ_HASFFI[m
[31m-      /* Remove frame for FFI metamethods. */[m
[31m-      if (frame_func(frame)->c.ffid >= FF_ffi_meta___index &&[m
[31m-	  frame_func(frame)->c.ffid <= FF_ffi_meta___tostring) {[m
[31m-	L->base = pframe+1;[m
[31m-	L->top = frame;[m
[31m-	setcframe_pc(cframe_raw(L->cframe), frame_contpc(frame));[m
[31m-      }[m
[31m-#endif[m
[31m-    }[m
[31m-  }[m
[31m-  lj_debug_addloc(L, msg, pframe, frame);[m
[31m-  lj_err_run(L);[m
[31m-}[m
[31m-[m
[31m-/* Formatted error in context of caller. */[m
[31m-LJ_NOINLINE void lj_err_callerv(lua_State *L, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, em);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  va_end(argp);[m
[31m-  lj_err_callermsg(L, msg);[m
[31m-}[m
[31m-[m
[31m-/* Error in context of caller. */[m
[31m-LJ_NOINLINE void lj_err_caller(lua_State *L, ErrMsg em)[m
[31m-{[m
[31m-  lj_err_callermsg(L, err2msg(em));[m
[31m-}[m
[31m-[m
[31m-/* Argument error message. */[m
[31m-LJ_NORET LJ_NOINLINE static void err_argmsg(lua_State *L, int narg,[m
[31m-					    const char *msg)[m
[31m-{[m
[31m-  const char *fname = "?";[m
[31m-  const char *ftype = lj_debug_funcname(L, L->base - 1, &fname);[m
[31m-  if (narg < 0 && narg > LUA_REGISTRYINDEX)[m
[31m-    narg = (int)(L->top - L->base) + narg + 1;[m
[31m-  if (ftype && ftype[3] == 'h' && --narg == 0)  /* Check for "method". */[m
[31m-    msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADSELF), fname, msg);[m
[31m-  else[m
[31m-    msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADARG), narg, fname, msg);[m
[31m-  lj_err_callermsg(L, msg);[m
[31m-}[m
[31m-[m
[31m-/* Formatted argument error. */[m
[31m-LJ_NOINLINE void lj_err_argv(lua_State *L, int narg, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, em);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  va_end(argp);[m
[31m-  err_argmsg(L, narg, msg);[m
[31m-}[m
[31m-[m
[31m-/* Argument error. */[m
[31m-LJ_NOINLINE void lj_err_arg(lua_State *L, int narg, ErrMsg em)[m
[31m-{[m
[31m-  err_argmsg(L, narg, err2msg(em));[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for arguments. */[m
[31m-LJ_NOINLINE void lj_err_argtype(lua_State *L, int narg, const char *xname)[m
[31m-{[m
[31m-  const char *tname, *msg;[m
[31m-  if (narg <= LUA_REGISTRYINDEX) {[m
[31m-    if (narg >= LUA_GLOBALSINDEX) {[m
[31m-      tname = lj_obj_itypename[~LJ_TTAB];[m
[31m-    } else {[m
[31m-      GCfunc *fn = curr_func(L);[m
[31m-      int idx = LUA_GLOBALSINDEX - narg;[m
[31m-      if (idx <= fn->c.nupvalues)[m
[31m-	tname = lj_typename(&fn->c.upvalue[idx-1]);[m
[31m-      else[m
[31m-	tname = lj_obj_typename[0];[m
[31m-    }[m
[31m-  } else {[m
[31m-    TValue *o = narg < 0 ? L->top + narg : L->base + narg-1;[m
[31m-    tname = o < L->top ? lj_typename(o) : lj_obj_typename[0];[m
[31m-  }[m
[31m-  msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADTYPE), xname, tname);[m
[31m-  err_argmsg(L, narg, msg);[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for arguments. */[m
[31m-LJ_NOINLINE void lj_err_argt(lua_State *L, int narg, int tt)[m
[31m-{[m
[31m-  lj_err_argtype(L, narg, lj_obj_typename[tt+1]);[m
[31m-}[m
[31m-[m
[31m-/* -- Public error handling API ------------------------------------------- */[m
[31m-[m
[31m-LUA_API lua_CFunction lua_atpanic(lua_State *L, lua_CFunction panicf)[m
[31m-{[m
[31m-  lua_CFunction old = G(L)->panic;[m
[31m-  G(L)->panic = panicf;[m
[31m-  return old;[m
[31m-}[m
[31m-[m
[31m-/* Forwarders for the public API (C calling convention and no LJ_NORET). */[m
[31m-LUA_API int lua_error(lua_State *L)[m
[31m-{[m
[31m-  lj_err_run(L);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_argerror(lua_State *L, int narg, const char *msg)[m
[31m-{[m
[31m-  err_argmsg(L, narg, msg);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_typerror(lua_State *L, int narg, const char *xname)[m
[31m-{[m
[31m-  lj_err_argtype(L, narg, xname);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_where(lua_State *L, int level)[m
[31m-{[m
[31m-  int size;[m
[31m-  cTValue *frame = lj_debug_frame(L, level, &size);[m
[31m-  lj_debug_addloc(L, "", frame, size ? frame+size : NULL);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_error(lua_State *L, const char *fmt, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  msg = lj_strfmt_pushvf(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  lj_err_callermsg(L, msg);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.h[m
[1mdeleted file mode 100644[m
[1mindex 6c75761..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_err.h[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-/*[m
[31m-** Error handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_ERR_H[m
[31m-#define _LJ_ERR_H[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-typedef enum {[m
[31m-#define ERRDEF(name, msg) \[m
[31m-  LJ_ERR_##name, LJ_ERR_##name##_ = LJ_ERR_##name + sizeof(msg)-1,[m
[31m-#include "lj_errmsg.h"[m
[31m-  LJ_ERR__MAX[m
[31m-} ErrMsg;[m
[31m-[m
[31m-LJ_DATA const char *lj_err_allmsg;[m
[31m-#define err2msg(em)	(lj_err_allmsg+(int)(em))[m
[31m-[m
[31m-LJ_FUNC GCstr *lj_err_str(lua_State *L, ErrMsg em);[m
[31m-LJ_FUNCA_NORET void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode);[m
[31m-LJ_FUNC_NORET void lj_err_mem(lua_State *L);[m
[31m-LJ_FUNC_NORET void lj_err_run(lua_State *L);[m
[31m-LJ_FUNC_NORET void lj_err_msg(lua_State *L, ErrMsg em);[m
[31m-LJ_FUNC_NORET void lj_err_lex(lua_State *L, GCstr *src, const char *tok,[m
[31m-			      BCLine line, ErrMsg em, va_list argp);[m
[31m-LJ_FUNC_NORET void lj_err_optype(lua_State *L, cTValue *o, ErrMsg opm);[m
[31m-LJ_FUNC_NORET void lj_err_comp(lua_State *L, cTValue *o1, cTValue *o2);[m
[31m-LJ_FUNC_NORET void lj_err_optype_call(lua_State *L, TValue *o);[m
[31m-LJ_FUNC_NORET void lj_err_callermsg(lua_State *L, const char *msg);[m
[31m-LJ_FUNC_NORET void lj_err_callerv(lua_State *L, ErrMsg em, ...);[m
[31m-LJ_FUNC_NORET void lj_err_caller(lua_State *L, ErrMsg em);[m
[31m-LJ_FUNC_NORET void lj_err_arg(lua_State *L, int narg, ErrMsg em);[m
[31m-LJ_FUNC_NORET void lj_err_argv(lua_State *L, int narg, ErrMsg em, ...);[m
[31m-LJ_FUNC_NORET void lj_err_argtype(lua_State *L, int narg, const char *xname);[m
[31m-LJ_FUNC_NORET void lj_err_argt(lua_State *L, int narg, int tt);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_errmsg.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_errmsg.h[m
[1mdeleted file mode 100644[m
[1mindex 0ed8f4e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_errmsg.h[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-/*[m
[31m-** VM error messages.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* This file may be included multiple times with different ERRDEF macros. */[m
[31m-[m
[31m-/* Basic error handling. */[m
[31m-ERRDEF(ERRMEM,	"not enough memory")[m
[31m-ERRDEF(ERRERR,	"error in error handling")[m
[31m-ERRDEF(ERRCPP,	"C++ exception")[m
[31m-[m
[31m-/* Allocations. */[m
[31m-ERRDEF(STROV,	"string length overflow")[m
[31m-ERRDEF(UDATAOV,	"userdata length overflow")[m
[31m-ERRDEF(STKOV,	"stack overflow")[m
[31m-ERRDEF(STKOVM,	"stack overflow (%s)")[m
[31m-ERRDEF(TABOV,	"table overflow")[m
[31m-[m
[31m-/* Table indexing. */[m
[31m-ERRDEF(NANIDX,	"table index is NaN")[m
[31m-ERRDEF(NILIDX,	"table index is nil")[m
[31m-ERRDEF(NEXTIDX,	"invalid key to " LUA_QL("next"))[m
[31m-[m
[31m-/* Metamethod resolving. */[m
[31m-ERRDEF(BADCALL,	"attempt to call a %s value")[m
[31m-ERRDEF(BADOPRT,	"attempt to %s %s " LUA_QS " (a %s value)")[m
[31m-ERRDEF(BADOPRV,	"attempt to %s a %s value")[m
[31m-ERRDEF(BADCMPT,	"attempt to compare %s with %s")[m
[31m-ERRDEF(BADCMPV,	"attempt to compare two %s values")[m
[31m-ERRDEF(GETLOOP,	"loop in gettable")[m
[31m-ERRDEF(SETLOOP,	"loop in settable")[m
[31m-ERRDEF(OPCALL,	"call")[m
[31m-ERRDEF(OPINDEX,	"index")[m
[31m-ERRDEF(OPARITH,	"perform arithmetic on")[m
[31m-ERRDEF(OPCAT,	"concatenate")[m
[31m-ERRDEF(OPLEN,	"get length of")[m
[31m-[m
[31m-/* Type checks. */[m
[31m-ERRDEF(BADSELF,	"calling " LUA_QS " on bad self (%s)")[m
[31m-ERRDEF(BADARG,	"bad argument #%d to " LUA_QS " (%s)")[m
[31m-ERRDEF(BADTYPE,	"%s expected, got %s")[m
[31m-ERRDEF(BADVAL,	"invalid value")[m
[31m-ERRDEF(NOVAL,	"value expected")[m
[31m-ERRDEF(NOCORO,	"coroutine expected")[m
[31m-ERRDEF(NOTABN,	"nil or table expected")[m
[31m-ERRDEF(NOLFUNC,	"Lua function expected")[m
[31m-ERRDEF(NOFUNCL,	"function or level expected")[m
[31m-ERRDEF(NOSFT,	"string/function/table expected")[m
[31m-ERRDEF(NOPROXY,	"boolean or proxy expected")[m
[31m-ERRDEF(FORINIT,	LUA_QL("for") " initial value must be a number")[m
[31m-ERRDEF(FORLIM,	LUA_QL("for") " limit must be a number")[m
[31m-ERRDEF(FORSTEP,	LUA_QL("for") " step must be a number")[m
[31m-[m
[31m-/* C API checks. */[m
[31m-ERRDEF(NOENV,	"no calling environment")[m
[31m-ERRDEF(CYIELD,	"attempt to yield across C-call boundary")[m
[31m-ERRDEF(BADLU,	"bad light userdata pointer")[m
[31m-ERRDEF(NOGCMM,	"bad action while in __gc metamethod")[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-ERRDEF(BADFPU,	"bad FPU precision (use D3DCREATE_FPU_PRESERVE with DirectX)")[m
[31m-#endif[m
[31m-[m
[31m-/* Standard library function errors. */[m
[31m-ERRDEF(ASSERT,	"assertion failed!")[m
[31m-ERRDEF(PROTMT,	"cannot change a protected metatable")[m
[31m-ERRDEF(UNPACK,	"too many results to unpack")[m
[31m-ERRDEF(RDRSTR,	"reader function must return a string")[m
[31m-ERRDEF(PRTOSTR,	LUA_QL("tostring") " must return a string to " LUA_QL("print"))[m
[31m-ERRDEF(IDXRNG,	"index out of range")[m
[31m-ERRDEF(BASERNG,	"base out of range")[m
[31m-ERRDEF(LVLRNG,	"level out of range")[m
[31m-ERRDEF(INVLVL,	"invalid level")[m
[31m-ERRDEF(INVOPT,	"invalid option")[m
[31m-ERRDEF(INVOPTM,	"invalid option " LUA_QS)[m
[31m-ERRDEF(INVFMT,	"invalid format")[m
[31m-ERRDEF(SETFENV,	LUA_QL("setfenv") " cannot change environment of given object")[m
[31m-ERRDEF(CORUN,	"cannot resume running coroutine")[m
[31m-ERRDEF(CODEAD,	"cannot resume dead coroutine")[m
[31m-ERRDEF(COSUSP,	"cannot resume non-suspended coroutine")[m
[31m-ERRDEF(TABINS,	"wrong number of arguments to " LUA_QL("insert"))[m
[31m-ERRDEF(TABCAT,	"invalid value (%s) at index %d in table for " LUA_QL("concat"))[m
[31m-ERRDEF(TABSORT,	"invalid order function for sorting")[m
[31m-ERRDEF(IOCLFL,	"attempt to use a closed file")[m
[31m-ERRDEF(IOSTDCL,	"standard file is closed")[m
[31m-ERRDEF(OSUNIQF,	"unable to generate a unique filename")[m
[31m-ERRDEF(OSDATEF,	"field " LUA_QS " missing in date table")[m
[31m-ERRDEF(STRDUMP,	"unable to dump given function")[m
[31m-ERRDEF(STRSLC,	"string slice too long")[m
[31m-ERRDEF(STRPATB,	"missing " LUA_QL("[") " after " LUA_QL("%f") " in pattern")[m
[31m-ERRDEF(STRPATC,	"invalid pattern capture")[m
[31m-ERRDEF(STRPATE,	"malformed pattern (ends with " LUA_QL("%") ")")[m
[31m-ERRDEF(STRPATM,	"malformed pattern (missing " LUA_QL("]") ")")[m
[31m-ERRDEF(STRPATU,	"unbalanced pattern")[m
[31m-ERRDEF(STRPATX,	"pattern too complex")[m
[31m-ERRDEF(STRCAPI,	"invalid capture index")[m
[31m-ERRDEF(STRCAPN,	"too many captures")[m
[31m-ERRDEF(STRCAPU,	"unfinished capture")[m
[31m-ERRDEF(STRFMT,	"invalid option " LUA_QS " to " LUA_QL("format"))[m
[31m-ERRDEF(STRGSRV,	"invalid replacement value (a %s)")[m
[31m-ERRDEF(BADMODN,	"name conflict for module " LUA_QS)[m
[31m-#if LJ_HASJIT[m
[31m-ERRDEF(JITPROT,	"runtime code generation failed, restricted kernel?")[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-ERRDEF(NOJIT,	"JIT compiler disabled, CPU does not support SSE2")[m
[31m-#else[m
[31m-ERRDEF(NOJIT,	"JIT compiler disabled")[m
[31m-#endif[m
[31m-#elif defined(LJ_ARCH_NOJIT)[m
[31m-ERRDEF(NOJIT,	"no JIT compiler for this architecture (yet)")[m
[31m-#else[m
[31m-ERRDEF(NOJIT,	"JIT compiler permanently disabled by build option")[m
[31m-#endif[m
[31m-ERRDEF(JITOPT,	"unknown or malformed optimization flag " LUA_QS)[m
[31m-[m
[31m-/* Lexer/parser errors. */[m
[31m-ERRDEF(XMODE,	"attempt to load chunk with wrong mode")[m
[31m-ERRDEF(XNEAR,	"%s near " LUA_QS)[m
[31m-ERRDEF(XLINES,	"chunk has too many lines")[m
[31m-ERRDEF(XLEVELS,	"chunk has too many syntax levels")[m
[31m-ERRDEF(XNUMBER,	"malformed number")[m
[31m-ERRDEF(XLSTR,	"unfinished long string")[m
[31m-ERRDEF(XLCOM,	"unfinished long comment")[m
[31m-ERRDEF(XSTR,	"unfinished string")[m
[31m-ERRDEF(XESC,	"invalid escape sequence")[m
[31m-ERRDEF(XLDELIM,	"invalid long string delimiter")[m
[31m-ERRDEF(XTOKEN,	LUA_QS " expected")[m
[31m-ERRDEF(XJUMP,	"control structure too long")[m
[31m-ERRDEF(XSLOTS,	"function or expression too complex")[m
[31m-ERRDEF(XLIMC,	"chunk has more than %d local variables")[m
[31m-ERRDEF(XLIMM,	"main function has more than %d %s")[m
[31m-ERRDEF(XLIMF,	"function at line %d has more than %d %s")[m
[31m-ERRDEF(XMATCH,	LUA_QS " expected (to close " LUA_QS " at line %d)")[m
[31m-ERRDEF(XFIXUP,	"function too long for return fixup")[m
[31m-ERRDEF(XPARAM,	"<name> or " LUA_QL("...") " expected")[m
[31m-#if !LJ_52[m
[31m-ERRDEF(XAMBIG,	"ambiguous syntax (function call x new statement)")[m
[31m-#endif[m
[31m-ERRDEF(XFUNARG,	"function arguments expected")[m
[31m-ERRDEF(XSYMBOL,	"unexpected symbol")[m
[31m-ERRDEF(XDOTS,	"cannot use " LUA_QL("...") " outside a vararg function")[m
[31m-ERRDEF(XSYNTAX,	"syntax error")[m
[31m-ERRDEF(XFOR,	LUA_QL("=") " or " LUA_QL("in") " expected")[m
[31m-ERRDEF(XBREAK,	"no loop to break")[m
[31m-ERRDEF(XLUNDEF,	"undefined label " LUA_QS)[m
[31m-ERRDEF(XLDUP,	"duplicate label " LUA_QS)[m
[31m-ERRDEF(XGSCOPE,	"<goto %s> jumps into the scope of local " LUA_QS)[m
[31m-[m
[31m-/* Bytecode reader errors. */[m
[31m-ERRDEF(BCFMT,	"cannot load incompatible bytecode")[m
[31m-ERRDEF(BCBAD,	"cannot load malformed bytecode")[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* FFI errors. */[m
[31m-ERRDEF(FFI_INVTYPE,	"invalid C type")[m
[31m-ERRDEF(FFI_INVSIZE,	"size of C type is unknown or too large")[m
[31m-ERRDEF(FFI_BADSCL,	"bad storage class")[m
[31m-ERRDEF(FFI_DECLSPEC,	"declaration specifier expected")[m
[31m-ERRDEF(FFI_BADTAG,	"undeclared or implicit tag " LUA_QS)[m
[31m-ERRDEF(FFI_REDEF,	"attempt to redefine " LUA_QS)[m
[31m-ERRDEF(FFI_NUMPARAM,	"wrong number of type parameters")[m
[31m-ERRDEF(FFI_INITOV,	"too many initializers for " LUA_QS)[m
[31m-ERRDEF(FFI_BADCONV,	"cannot convert " LUA_QS " to " LUA_QS)[m
[31m-ERRDEF(FFI_BADLEN,	"attempt to get length of " LUA_QS)[m
[31m-ERRDEF(FFI_BADCONCAT,	"attempt to concatenate " LUA_QS " and " LUA_QS)[m
[31m-ERRDEF(FFI_BADARITH,	"attempt to perform arithmetic on " LUA_QS " and " LUA_QS)[m
[31m-ERRDEF(FFI_BADCOMP,	"attempt to compare " LUA_QS " with " LUA_QS)[m
[31m-ERRDEF(FFI_BADCALL,	LUA_QS " is not callable")[m
[31m-ERRDEF(FFI_NUMARG,	"wrong number of arguments for function call")[m
[31m-ERRDEF(FFI_BADMEMBER,	LUA_QS " has no member named " LUA_QS)[m
[31m-ERRDEF(FFI_BADIDX,	LUA_QS " cannot be indexed")[m
[31m-ERRDEF(FFI_BADIDXW,	LUA_QS " cannot be indexed with " LUA_QS)[m
[31m-ERRDEF(FFI_BADMM,	LUA_QS " has no " LUA_QS " metamethod")[m
[31m-ERRDEF(FFI_WRCONST,	"attempt to write to constant location")[m
[31m-ERRDEF(FFI_NODECL,	"missing declaration for symbol " LUA_QS)[m
[31m-ERRDEF(FFI_BADCBACK,	"bad callback")[m
[31m-#if LJ_OS_NOJIT[m
[31m-ERRDEF(FFI_CBACKOV,	"no support for callbacks on this OS")[m
[31m-#else[m
[31m-ERRDEF(FFI_CBACKOV,	"too many callbacks")[m
[31m-#endif[m
[31m-ERRDEF(FFI_NYIPACKBIT,	"NYI: packed bit fields")[m
[31m-ERRDEF(FFI_NYICALL,	"NYI: cannot call this C function (yet)")[m
[31m-#endif[m
[31m-[m
[31m-#undef ERRDEF[m
[31m-[m
[31m-/* Detecting unused error messages:[m
[31m-   awk -F, '/^ERRDEF/ { gsub(/ERRDEF./, ""); printf "grep -q LJ_ERR_%s *.[ch] || echo %s\n", $1, $1}' lj_errmsg.h | sh[m
[31m-*/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ff.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ff.h[m
[1mdeleted file mode 100644[m
[1mindex 9af3b12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ff.h[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-/*[m
[31m-** Fast function IDs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_FF_H[m
[31m-#define _LJ_FF_H[m
[31m-[m
[31m-/* Fast function ID. */[m
[31m-typedef enum {[m
[31m-  FF_LUA_ = FF_LUA,	/* Lua function (must be 0). */[m
[31m-  FF_C_ = FF_C,		/* Regular C function (must be 1). */[m
[31m-#define FFDEF(name)	FF_##name,[m
[31m-#include "lj_ffdef.h"[m
[31m-  FF__MAX[m
[31m-} FastFunc;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.c[m
[1mdeleted file mode 100644[m
[1mindex 942ecdb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.c[m
[1m+++ /dev/null[m
[36m@@ -1,1209 +0,0 @@[m
[31m-/*[m
[31m-** Fast function call recorder.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_ffrecord_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_record.h"[m
[31m-#include "lj_ffrecord.h"[m
[31m-#include "lj_crecord.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* -- Fast function recording handlers ------------------------------------ */[m
[31m-[m
[31m-/* Conventions for fast function call handlers:[m
[31m-**[m
[31m-** The argument slots start at J->base[0]. All of them are guaranteed to be[m
[31m-** valid and type-specialized references. J->base[J->maxslot] is set to 0[m
[31m-** as a sentinel. The runtime argument values start at rd->argv[0].[m
[31m-**[m
[31m-** In general fast functions should check for presence of all of their[m
[31m-** arguments and for the correct argument types. Some simplifications[m
[31m-** are allowed if the interpreter throws instead. But even if recording[m
[31m-** is aborted, the generated IR must be consistent (no zero-refs).[m
[31m-**[m
[31m-** The number of results in rd->nres is set to 1. Handlers that return[m
[31m-** a different number of results need to override it. A negative value[m
[31m-** prevents return processing (e.g. for pending calls).[m
[31m-**[m
[31m-** Results need to be stored starting at J->base[0]. Return processing[m
[31m-** moves them to the right slots later.[m
[31m-**[m
[31m-** The per-ffid auxiliary data is the value of the 2nd part of the[m
[31m-** LJLIB_REC() annotation. This allows handling similar functionality[m
[31m-** in a common handler.[m
[31m-*/[m
[31m-[m
[31m-/* Type of handler to record a fast function. */[m
[31m-typedef void (LJ_FASTCALL *RecordFunc)(jit_State *J, RecordFFData *rd);[m
[31m-[m
[31m-/* Get runtime value of int argument. */[m
[31m-static int32_t argv2int(jit_State *J, TValue *o)[m
[31m-{[m
[31m-  if (!lj_strscan_numberobj(o))[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  return tvisint(o) ? intV(o) : lj_num2int(numV(o));[m
[31m-}[m
[31m-[m
[31m-/* Get runtime value of string argument. */[m
[31m-static GCstr *argv2str(jit_State *J, TValue *o)[m
[31m-{[m
[31m-  if (LJ_LIKELY(tvisstr(o))) {[m
[31m-    return strV(o);[m
[31m-  } else {[m
[31m-    GCstr *s;[m
[31m-    if (!tvisnumber(o))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    s = lj_strfmt_number(J->L, o);[m
[31m-    setstrV(J->L, o, s);[m
[31m-    return s;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return number of results wanted by caller. */[m
[31m-static ptrdiff_t results_wanted(jit_State *J)[m
[31m-{[m
[31m-  TValue *frame = J->L->base-1;[m
[31m-  if (frame_islua(frame))[m
[31m-    return (ptrdiff_t)bc_b(frame_pc(frame)[-1]) - 1;[m
[31m-  else[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-/* Trace stitching: add continuation below frame to start a new trace. */[m
[31m-static void recff_stitch(jit_State *J)[m
[31m-{[m
[31m-  ASMFunction cont = lj_cont_stitch;[m
[31m-  lua_State *L = J->L;[m
[31m-  TValue *base = L->base;[m
[31m-  const BCIns *pc = frame_pc(base-1);[m
[31m-  TValue *pframe = frame_prevl(base-1);[m
[31m-[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle frame shift. */[m
[31m-  /* Move func + args up in Lua stack and insert continuation. */[m
[31m-  memmove(&base[1], &base[-1], sizeof(TValue)*(J->maxslot+1));[m
[31m-  setframe_ftsz(base+1, ((char *)(base+1) - (char *)pframe) + FRAME_CONT);[m
[31m-  setcont(base, cont);[m
[31m-  setframe_pc(base, pc);[m
[31m-  setnilV(base-1);  /* Incorrect, but rec_check_slots() won't run anymore. */[m
[31m-  L->base += 2;[m
[31m-  L->top += 2;[m
[31m-[m
[31m-  /* Ditto for the IR. */[m
[31m-  memmove(&J->base[1], &J->base[-1], sizeof(TRef)*(J->maxslot+1));[m
[31m-  J->base[0] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;[m
[31m-  J->ktracep = lj_ir_k64_reserve(J);[m
[31m-  lua_assert(irt_toitype_(IRT_P64) == LJ_TTRACE);[m
[31m-  J->base[-1] = emitir(IRT(IR_XLOAD, IRT_P64), lj_ir_kptr(J, &J->ktracep->gcr), 0);[m
[31m-  J->base += 2;[m
[31m-  J->baseslot += 2;[m
[31m-  J->framedepth++;[m
[31m-[m
[31m-  lj_record_stop(J, LJ_TRLINK_STITCH, 0);[m
[31m-[m
[31m-  /* Undo Lua stack changes. */[m
[31m-  memmove(&base[-1], &base[1], sizeof(TValue)*(J->maxslot+1));[m
[31m-  setframe_pc(base-1, pc);[m
[31m-  L->base -= 2;[m
[31m-  L->top -= 2;[m
[31m-}[m
[31m-[m
[31m-/* Fallback handler for fast functions that are not recorded (yet). */[m
[31m-static void LJ_FASTCALL recff_nyi(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (J->cur.nins < (IRRef)J->param[JIT_P_minstitch] + REF_BASE) {[m
[31m-    lj_trace_err_info(J, LJ_TRERR_TRACEUV);[m
[31m-  } else {[m
[31m-    /* Can only stitch from Lua call. */[m
[31m-    if (J->framedepth && frame_islua(J->L->base-1)) {[m
[31m-      BCOp op = bc_op(*frame_pc(J->L->base-1));[m
[31m-      /* Stitched trace cannot start with *M op with variable # of args. */[m
[31m-      if (!(op == BC_CALLM || op == BC_CALLMT ||[m
[31m-	    op == BC_RETM || op == BC_TSETM)) {[m
[31m-	switch (J->fn->c.ffid) {[m
[31m-	case FF_error:[m
[31m-	case FF_debug_sethook:[m
[31m-	case FF_jit_flush:[m
[31m-	  break;  /* Don't stitch across special builtins. */[m
[31m-	default:[m
[31m-	  recff_stitch(J);  /* Use trace stitching. */[m
[31m-	  rd->nres = -1;[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    /* Otherwise stop trace and return to interpreter. */[m
[31m-    lj_record_stop(J, LJ_TRLINK_RETURN, 0);[m
[31m-    rd->nres = -1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fallback handler for unsupported variants of fast functions. */[m
[31m-#define recff_nyiu	recff_nyi[m
[31m-[m
[31m-/* Must stop the trace for classic C functions with arbitrary side-effects. */[m
[31m-#define recff_c		recff_nyi[m
[31m-[m
[31m-/* Emit BUFHDR for the global temporary buffer. */[m
[31m-static TRef recff_bufhdr(jit_State *J)[m
[31m-{[m
[31m-  return emitir(IRT(IR_BUFHDR, IRT_P32),[m
[31m-		lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);[m
[31m-}[m
[31m-[m
[31m-/* -- Base library fast functions ----------------------------------------- */[m
[31m-[m
[31m-static void LJ_FASTCALL recff_assert(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  /* Arguments already specialized. The interpreter throws for nil/false. */[m
[31m-  rd->nres = J->maxslot;  /* Pass through all arguments. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_type(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  /* Arguments already specialized. Result is a constant string. Neat, huh? */[m
[31m-  uint32_t t;[m
[31m-  if (tvisnumber(&rd->argv[0]))[m
[31m-    t = ~LJ_TNUMX;[m
[31m-  else if (LJ_64 && !LJ_GC64 && tvislightud(&rd->argv[0]))[m
[31m-    t = ~LJ_TLIGHTUD;[m
[31m-  else[m
[31m-    t = ~itype(&rd->argv[0]);[m
[31m-  J->base[0] = lj_ir_kstr(J, strV(&J->fn->c.upvalue[t]));[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_getmetatable(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tr) {[m
[31m-    RecordIndex ix;[m
[31m-    ix.tab = tr;[m
[31m-    copyTV(J->L, &ix.tabv, &rd->argv[0]);[m
[31m-    if (lj_record_mm_lookup(J, &ix, MM_metatable))[m
[31m-      J->base[0] = ix.mobj;[m
[31m-    else[m
[31m-      J->base[0] = ix.mt;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_setmetatable(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  TRef mt = J->base[1];[m
[31m-  if (tref_istab(tr) && (tref_istab(mt) || (mt && tref_isnil(mt)))) {[m
[31m-    TRef fref, mtref;[m
[31m-    RecordIndex ix;[m
[31m-    ix.tab = tr;[m
[31m-    copyTV(J->L, &ix.tabv, &rd->argv[0]);[m
[31m-    lj_record_mm_lookup(J, &ix, MM_metatable); /* Guard for no __metatable. */[m
[31m-    fref = emitir(IRT(IR_FREF, IRT_P32), tr, IRFL_TAB_META);[m
[31m-    mtref = tref_isnil(mt) ? lj_ir_knull(J, IRT_TAB) : mt;[m
[31m-    emitir(IRT(IR_FSTORE, IRT_TAB), fref, mtref);[m
[31m-    if (!tref_isnil(mt))[m
[31m-      emitir(IRT(IR_TBAR, IRT_TAB), tr, 0);[m
[31m-    J->base[0] = tr;[m
[31m-    J->needsnap = 1;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_rawget(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0]; ix.key = J->base[1];[m
[31m-  if (tref_istab(ix.tab) && ix.key) {[m
[31m-    ix.val = 0; ix.idxchain = 0;[m
[31m-    settabV(J->L, &ix.tabv, tabV(&rd->argv[0]));[m
[31m-    copyTV(J->L, &ix.keyv, &rd->argv[1]);[m
[31m-    J->base[0] = lj_record_idx(J, &ix);[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_rawset(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0]; ix.key = J->base[1]; ix.val = J->base[2];[m
[31m-  if (tref_istab(ix.tab) && ix.key && ix.val) {[m
[31m-    ix.idxchain = 0;[m
[31m-    settabV(J->L, &ix.tabv, tabV(&rd->argv[0]));[m
[31m-    copyTV(J->L, &ix.keyv, &rd->argv[1]);[m
[31m-    copyTV(J->L, &ix.valv, &rd->argv[2]);[m
[31m-    lj_record_idx(J, &ix);[m
[31m-    /* Pass through table at J->base[0] as result. */[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_rawequal(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tra = J->base[0];[m
[31m-  TRef trb = J->base[1];[m
[31m-  if (tra && trb) {[m
[31m-    int diff = lj_record_objcmp(J, tra, trb, &rd->argv[0], &rd->argv[1]);[m
[31m-    J->base[0] = diff ? TREF_FALSE : TREF_TRUE;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-#if LJ_52[m
[31m-static void LJ_FASTCALL recff_rawlen(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_isstr(tr))[m
[31m-    J->base[0] = emitir(IRTI(IR_FLOAD), tr, IRFL_STR_LEN);[m
[31m-  else if (tref_istab(tr))[m
[31m-    J->base[0] = lj_ir_call(J, IRCALL_lj_tab_len, tr);[m
[31m-  /* else: Interpreter will throw. */[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Determine mode of select() call. */[m
[31m-int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv)[m
[31m-{[m
[31m-  if (tref_isstr(tr) && *strVdata(tv) == '#') {  /* select('#', ...) */[m
[31m-    if (strV(tv)->len == 1) {[m
[31m-      emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, strV(tv)));[m
[31m-    } else {[m
[31m-      TRef trptr = emitir(IRT(IR_STRREF, IRT_P32), tr, lj_ir_kint(J, 0));[m
[31m-      TRef trchar = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY);[m
[31m-      emitir(IRTG(IR_EQ, IRT_INT), trchar, lj_ir_kint(J, '#'));[m
[31m-    }[m
[31m-    return 0;[m
[31m-  } else {  /* select(n, ...) */[m
[31m-    int32_t start = argv2int(J, tv);[m
[31m-    if (start == 0) lj_trace_err(J, LJ_TRERR_BADTYPE);  /* A bit misleading. */[m
[31m-    return start;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_select(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tr) {[m
[31m-    ptrdiff_t start = lj_ffrecord_select_mode(J, tr, &rd->argv[0]);[m
[31m-    if (start == 0) {  /* select('#', ...) */[m
[31m-      J->base[0] = lj_ir_kint(J, J->maxslot - 1);[m
[31m-    } else if (tref_isk(tr)) {  /* select(k, ...) */[m
[31m-      ptrdiff_t n = (ptrdiff_t)J->maxslot;[m
[31m-      if (start < 0) start += n;[m
[31m-      else if (start > n) start = n;[m
[31m-      rd->nres = n - start;[m
[31m-      if (start >= 1) {[m
[31m-	ptrdiff_t i;[m
[31m-	for (i = 0; i < n - start; i++)[m
[31m-	  J->base[i] = J->base[start+i];[m
[31m-      }  /* else: Interpreter will throw. */[m
[31m-    } else {[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_tonumber(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  TRef base = J->base[1];[m
[31m-  if (tr && !tref_isnil(base)) {[m
[31m-    base = lj_opt_narrow_toint(J, base);[m
[31m-    if (!tref_isk(base) || IR(tref_ref(base))->i != 10) {[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  if (tref_isnumber_str(tr)) {[m
[31m-    if (tref_isstr(tr)) {[m
[31m-      TValue tmp;[m
[31m-      if (!lj_strscan_num(strV(&rd->argv[0]), &tmp)) {[m
[31m-	recff_nyiu(J, rd);  /* Would need an inverted STRTO for this case. */[m
[31m-	return;[m
[31m-      }[m
[31m-      tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-  } else if (tref_iscdata(tr)) {[m
[31m-    lj_crecord_tonumber(J, rd);[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else {[m
[31m-    tr = TREF_NIL;[m
[31m-  }[m
[31m-  J->base[0] = tr;[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static TValue *recff_metacall_cp(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  jit_State *J = (jit_State *)ud;[m
[31m-  lj_record_tailcall(J, 0, 1);[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static int recff_metacall(jit_State *J, RecordFFData *rd, MMS mm)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0];[m
[31m-  copyTV(J->L, &ix.tabv, &rd->argv[0]);[m
[31m-  if (lj_record_mm_lookup(J, &ix, mm)) {  /* Has metamethod? */[m
[31m-    int errcode;[m
[31m-    TValue argv0;[m
[31m-    /* Temporarily insert metamethod below object. */[m
[31m-    J->base[1] = J->base[0];[m
[31m-    J->base[0] = ix.mobj;[m
[31m-    copyTV(J->L, &argv0, &rd->argv[0]);[m
[31m-    copyTV(J->L, &rd->argv[1], &rd->argv[0]);[m
[31m-    copyTV(J->L, &rd->argv[0], &ix.mobjv);[m
[31m-    /* Need to protect lj_record_tailcall because it may throw. */[m
[31m-    errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp);[m
[31m-    /* Always undo Lua stack changes to avoid confusing the interpreter. */[m
[31m-    copyTV(J->L, &rd->argv[0], &argv0);[m
[31m-    if (errcode)[m
[31m-      lj_err_throw(J->L, errcode);  /* Propagate errors. */[m
[31m-    rd->nres = -1;  /* Pending call. */[m
[31m-    return 1;  /* Tailcalled to metamethod. */[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_tostring(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_isstr(tr)) {[m
[31m-    /* Ignore __tostring in the string base metatable. */[m
[31m-    /* Pass on result in J->base[0]. */[m
[31m-  } else if (tr && !recff_metacall(J, rd, MM_tostring)) {[m
[31m-    if (tref_isnumber(tr)) {[m
[31m-      J->base[0] = emitir(IRT(IR_TOSTR, IRT_STR), tr,[m
[31m-			  tref_isnum(tr) ? IRTOSTR_NUM : IRTOSTR_INT);[m
[31m-    } else if (tref_ispri(tr)) {[m
[31m-      J->base[0] = lj_ir_kstr(J, lj_strfmt_obj(J->L, &rd->argv[0]));[m
[31m-    } else {[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_ipairs_aux(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0];[m
[31m-  if (tref_istab(ix.tab)) {[m
[31m-    if (!tvisnumber(&rd->argv[1]))  /* No support for string coercion. */[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    setintV(&ix.keyv, numberVint(&rd->argv[1])+1);[m
[31m-    settabV(J->L, &ix.tabv, tabV(&rd->argv[0]));[m
[31m-    ix.val = 0; ix.idxchain = 0;[m
[31m-    ix.key = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-    J->base[0] = ix.key = emitir(IRTI(IR_ADD), ix.key, lj_ir_kint(J, 1));[m
[31m-    J->base[1] = lj_record_idx(J, &ix);[m
[31m-    rd->nres = tref_isnil(J->base[1]) ? 0 : 2;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_xpairs(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (!((LJ_52 || (LJ_HASFFI && tref_iscdata(tr))) &&[m
[31m-	recff_metacall(J, rd, MM_pairs + rd->data))) {[m
[31m-    if (tref_istab(tr)) {[m
[31m-      J->base[0] = lj_ir_kfunc(J, funcV(&J->fn->c.upvalue[0]));[m
[31m-      J->base[1] = tr;[m
[31m-      J->base[2] = rd->data ? lj_ir_kint(J, 0) : TREF_NIL;[m
[31m-      rd->nres = 3;[m
[31m-    }  /* else: Interpreter will throw. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_pcall(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (J->maxslot >= 1) {[m
[31m-    lj_record_call(J, 0, J->maxslot - 1);[m
[31m-    rd->nres = -1;  /* Pending call. */[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static TValue *recff_xpcall_cp(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  jit_State *J = (jit_State *)ud;[m
[31m-  lj_record_call(J, 1, J->maxslot - 2);[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_xpcall(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (J->maxslot >= 2) {[m
[31m-    TValue argv0, argv1;[m
[31m-    TRef tmp;[m
[31m-    int errcode;[m
[31m-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-    /* Swap function and traceback. */[m
[31m-    tmp = J->base[0]; J->base[0] = J->base[1]; J->base[1] = tmp;[m
[31m-    copyTV(J->L, &argv0, &rd->argv[0]);[m
[31m-    copyTV(J->L, &argv1, &rd->argv[1]);[m
[31m-    copyTV(J->L, &rd->argv[0], &argv1);[m
[31m-    copyTV(J->L, &rd->argv[1], &argv0);[m
[31m-    /* Need to protect lj_record_call because it may throw. */[m
[31m-    errcode = lj_vm_cpcall(J->L, NULL, J, recff_xpcall_cp);[m
[31m-    /* Always undo Lua stack swap to avoid confusing the interpreter. */[m
[31m-    copyTV(J->L, &rd->argv[0], &argv0);[m
[31m-    copyTV(J->L, &rd->argv[1], &argv1);[m
[31m-    if (errcode)[m
[31m-      lj_err_throw(J->L, errcode);  /* Propagate errors. */[m
[31m-    rd->nres = -1;  /* Pending call. */[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_getfenv(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  /* Only support getfenv(0) for now. */[m
[31m-  if (tref_isint(tr) && tref_isk(tr) && IR(tref_ref(tr))->i == 0) {[m
[31m-    TRef trl = emitir(IRT(IR_LREF, IRT_THREAD), 0, 0);[m
[31m-    J->base[0] = emitir(IRT(IR_FLOAD, IRT_TAB), trl, IRFL_THREAD_ENV);[m
[31m-    return;[m
[31m-  }[m
[31m-  recff_nyiu(J, rd);[m
[31m-}[m
[31m-[m
[31m-/* -- Math library fast functions ----------------------------------------- */[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_abs(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-  J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_knum_abs(J));[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record rounding functions math.floor and math.ceil. */[m
[31m-static void LJ_FASTCALL recff_math_round(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (!tref_isinteger(tr)) {  /* Pass through integers unmodified. */[m
[31m-    tr = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, tr), rd->data);[m
[31m-    /* Result is integral (or NaN/Inf), but may not fit an int32_t. */[m
[31m-    if (LJ_DUALNUM) {  /* Try to narrow using a guarded conversion to int. */[m
[31m-      lua_Number n = lj_vm_foldfpm(numberVnum(&rd->argv[0]), rd->data);[m
[31m-      if (n == (lua_Number)lj_num2int(n))[m
[31m-	tr = emitir(IRTGI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_CHECK);[m
[31m-    }[m
[31m-    J->base[0] = tr;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record unary math.* functions, mapped to IR_FPMATH opcode. */[m
[31m-static void LJ_FASTCALL recff_math_unary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  J->base[0] = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, J->base[0]), rd->data);[m
[31m-}[m
[31m-[m
[31m-/* Record math.log. */[m
[31m-static void LJ_FASTCALL recff_math_log(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-  if (J->base[1]) {[m
[31m-#ifdef LUAJIT_NO_LOG2[m
[31m-    uint32_t fpm = IRFPM_LOG;[m
[31m-#else[m
[31m-    uint32_t fpm = IRFPM_LOG2;[m
[31m-#endif[m
[31m-    TRef trb = lj_ir_tonum(J, J->base[1]);[m
[31m-    tr = emitir(IRTN(IR_FPMATH), tr, fpm);[m
[31m-    trb = emitir(IRTN(IR_FPMATH), trb, fpm);[m
[31m-    trb = emitir(IRTN(IR_DIV), lj_ir_knum_one(J), trb);[m
[31m-    tr = emitir(IRTN(IR_MUL), tr, trb);[m
[31m-  } else {[m
[31m-    tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_LOG);[m
[31m-  }[m
[31m-  J->base[0] = tr;[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record math.atan2. */[m
[31m-static void LJ_FASTCALL recff_math_atan2(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-  TRef tr2 = lj_ir_tonum(J, J->base[1]);[m
[31m-  J->base[0] = emitir(IRTN(IR_ATAN2), tr, tr2);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record math.ldexp. */[m
[31m-static void LJ_FASTCALL recff_math_ldexp(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  TRef tr2 = lj_ir_tonum(J, J->base[1]);[m
[31m-#else[m
[31m-  TRef tr2 = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-#endif[m
[31m-  J->base[0] = emitir(IRTN(IR_LDEXP), tr, tr2);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record math.asin, math.acos, math.atan. */[m
[31m-static void LJ_FASTCALL recff_math_atrig(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef y = lj_ir_tonum(J, J->base[0]);[m
[31m-  TRef x = lj_ir_knum_one(J);[m
[31m-  uint32_t ffid = rd->data;[m
[31m-  if (ffid != FF_math_atan) {[m
[31m-    TRef tmp = emitir(IRTN(IR_MUL), y, y);[m
[31m-    tmp = emitir(IRTN(IR_SUB), x, tmp);[m
[31m-    tmp = emitir(IRTN(IR_FPMATH), tmp, IRFPM_SQRT);[m
[31m-    if (ffid == FF_math_asin) { x = tmp; } else { x = y; y = tmp; }[m
[31m-  }[m
[31m-  J->base[0] = emitir(IRTN(IR_ATAN2), y, x);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_htrig(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-  J->base[0] = emitir(IRTN(IR_CALLN), tr, rd->data);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_modf(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_isinteger(tr)) {[m
[31m-    J->base[0] = tr;[m
[31m-    J->base[1] = lj_ir_kint(J, 0);[m
[31m-  } else {[m
[31m-    TRef trt;[m
[31m-    tr = lj_ir_tonum(J, tr);[m
[31m-    trt = emitir(IRTN(IR_FPMATH), tr, IRFPM_TRUNC);[m
[31m-    J->base[0] = trt;[m
[31m-    J->base[1] = emitir(IRTN(IR_SUB), tr, trt);[m
[31m-  }[m
[31m-  rd->nres = 2;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  J->base[0] = lj_opt_narrow_pow(J, J->base[0], J->base[1],[m
[31m-				 &rd->argv[0], &rd->argv[1]);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_minmax(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonumber(J, J->base[0]);[m
[31m-  uint32_t op = rd->data;[m
[31m-  BCReg i;[m
[31m-  for (i = 1; J->base[i] != 0; i++) {[m
[31m-    TRef tr2 = lj_ir_tonumber(J, J->base[i]);[m
[31m-    IRType t = IRT_INT;[m
[31m-    if (!(tref_isinteger(tr) && tref_isinteger(tr2))) {[m
[31m-      if (tref_isinteger(tr)) tr = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT);[m
[31m-      if (tref_isinteger(tr2)) tr2 = emitir(IRTN(IR_CONV), tr2, IRCONV_NUM_INT);[m
[31m-      t = IRT_NUM;[m
[31m-    }[m
[31m-    tr = emitir(IRT(op, t), tr, tr2);[m
[31m-  }[m
[31m-  J->base[0] = tr;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_random(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  GCudata *ud = udataV(&J->fn->c.upvalue[0]);[m
[31m-  TRef tr, one;[m
[31m-  lj_ir_kgc(J, obj2gco(ud), IRT_UDATA);  /* Prevent collection. */[m
[31m-  tr = lj_ir_call(J, IRCALL_lj_math_random_step, lj_ir_kptr(J, uddata(ud)));[m
[31m-  one = lj_ir_knum_one(J);[m
[31m-  tr = emitir(IRTN(IR_SUB), tr, one);[m
[31m-  if (J->base[0]) {[m
[31m-    TRef tr1 = lj_ir_tonum(J, J->base[0]);[m
[31m-    if (J->base[1]) {  /* d = floor(d*(r2-r1+1.0)) + r1 */[m
[31m-      TRef tr2 = lj_ir_tonum(J, J->base[1]);[m
[31m-      tr2 = emitir(IRTN(IR_SUB), tr2, tr1);[m
[31m-      tr2 = emitir(IRTN(IR_ADD), tr2, one);[m
[31m-      tr = emitir(IRTN(IR_MUL), tr, tr2);[m
[31m-      tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_FLOOR);[m
[31m-      tr = emitir(IRTN(IR_ADD), tr, tr1);[m
[31m-    } else {  /* d = floor(d*r1) + 1.0 */[m
[31m-      tr = emitir(IRTN(IR_MUL), tr, tr1);[m
[31m-      tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_FLOOR);[m
[31m-      tr = emitir(IRTN(IR_ADD), tr, one);[m
[31m-    }[m
[31m-  }[m
[31m-  J->base[0] = tr;[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* -- Bit library fast functions ------------------------------------------ */[m
[31m-[m
[31m-/* Record bit.tobit. */[m
[31m-static void LJ_FASTCALL recff_bit_tobit(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-#if LJ_HASFFI[m
[31m-  if (tref_iscdata(tr)) { recff_bit64_tobit(J, rd); return; }[m
[31m-#endif[m
[31m-  J->base[0] = lj_opt_narrow_tobit(J, tr);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record unary bit.bnot, bit.bswap. */[m
[31m-static void LJ_FASTCALL recff_bit_unary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (recff_bit64_unary(J, rd))[m
[31m-    return;[m
[31m-#endif[m
[31m-  J->base[0] = emitir(IRTI(rd->data), lj_opt_narrow_tobit(J, J->base[0]), 0);[m
[31m-}[m
[31m-[m
[31m-/* Record N-ary bit.band, bit.bor, bit.bxor. */[m
[31m-static void LJ_FASTCALL recff_bit_nary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (recff_bit64_nary(J, rd))[m
[31m-    return;[m
[31m-#endif[m
[31m-  {[m
[31m-    TRef tr = lj_opt_narrow_tobit(J, J->base[0]);[m
[31m-    uint32_t ot = IRTI(rd->data);[m
[31m-    BCReg i;[m
[31m-    for (i = 1; J->base[i] != 0; i++)[m
[31m-      tr = emitir(ot, tr, lj_opt_narrow_tobit(J, J->base[i]));[m
[31m-    J->base[0] = tr;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record bit shifts. */[m
[31m-static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (recff_bit64_shift(J, rd))[m
[31m-    return;[m
[31m-#endif[m
[31m-  {[m
[31m-    TRef tr = lj_opt_narrow_tobit(J, J->base[0]);[m
[31m-    TRef tsh = lj_opt_narrow_tobit(J, J->base[1]);[m
[31m-    IROp op = (IROp)rd->data;[m
[31m-    if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) &&[m
[31m-	!tref_isk(tsh))[m
[31m-      tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31));[m
[31m-#ifdef LJ_TARGET_UNIFYROT[m
[31m-    if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) {[m
[31m-      op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR;[m
[31m-      tsh = emitir(IRTI(IR_NEG), tsh, tsh);[m
[31m-    }[m
[31m-#endif[m
[31m-    J->base[0] = emitir(IRTI(op), tr, tsh);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_bit_tohex(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  TRef hdr = recff_bufhdr(J);[m
[31m-  TRef tr = recff_bit64_tohex(J, rd, hdr);[m
[31m-  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-#else[m
[31m-  recff_nyiu(J, rd);  /* Don't bother working around this NYI. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- String library fast functions --------------------------------------- */[m
[31m-[m
[31m-/* Specialize to relative starting position for string. */[m
[31m-static TRef recff_string_start(jit_State *J, GCstr *s, int32_t *st, TRef tr,[m
[31m-			       TRef trlen, TRef tr0)[m
[31m-{[m
[31m-  int32_t start = *st;[m
[31m-  if (start < 0) {[m
[31m-    emitir(IRTGI(IR_LT), tr, tr0);[m
[31m-    tr = emitir(IRTI(IR_ADD), trlen, tr);[m
[31m-    start = start + (int32_t)s->len;[m
[31m-    emitir(start < 0 ? IRTGI(IR_LT) : IRTGI(IR_GE), tr, tr0);[m
[31m-    if (start < 0) {[m
[31m-      tr = tr0;[m
[31m-      start = 0;[m
[31m-    }[m
[31m-  } else if (start == 0) {[m
[31m-    emitir(IRTGI(IR_EQ), tr, tr0);[m
[31m-    tr = tr0;[m
[31m-  } else {[m
[31m-    tr = emitir(IRTI(IR_ADD), tr, lj_ir_kint(J, -1));[m
[31m-    emitir(IRTGI(IR_GE), tr, tr0);[m
[31m-    start--;[m
[31m-  }[m
[31m-  *st = start;[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Handle string.byte (rd->data = 0) and string.sub (rd->data = 1). */[m
[31m-static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef trstr = lj_ir_tostr(J, J->base[0]);[m
[31m-  TRef trlen = emitir(IRTI(IR_FLOAD), trstr, IRFL_STR_LEN);[m
[31m-  TRef tr0 = lj_ir_kint(J, 0);[m
[31m-  TRef trstart, trend;[m
[31m-  GCstr *str = argv2str(J, &rd->argv[0]);[m
[31m-  int32_t start, end;[m
[31m-  if (rd->data) {  /* string.sub(str, start [,end]) */[m
[31m-    start = argv2int(J, &rd->argv[1]);[m
[31m-    trstart = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-    trend = J->base[2];[m
[31m-    if (tref_isnil(trend)) {[m
[31m-      trend = lj_ir_kint(J, -1);[m
[31m-      end = -1;[m
[31m-    } else {[m
[31m-      trend = lj_opt_narrow_toint(J, trend);[m
[31m-      end = argv2int(J, &rd->argv[2]);[m
[31m-    }[m
[31m-  } else {  /* string.byte(str, [,start [,end]]) */[m
[31m-    if (tref_isnil(J->base[1])) {[m
[31m-      start = 1;[m
[31m-      trstart = lj_ir_kint(J, 1);[m
[31m-    } else {[m
[31m-      start = argv2int(J, &rd->argv[1]);[m
[31m-      trstart = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-    }[m
[31m-    if (J->base[1] && !tref_isnil(J->base[2])) {[m
[31m-      trend = lj_opt_narrow_toint(J, J->base[2]);[m
[31m-      end = argv2int(J, &rd->argv[2]);[m
[31m-    } else {[m
[31m-      trend = trstart;[m
[31m-      end = start;[m
[31m-    }[m
[31m-  }[m
[31m-  if (end < 0) {[m
[31m-    emitir(IRTGI(IR_LT), trend, tr0);[m
[31m-    trend = emitir(IRTI(IR_ADD), emitir(IRTI(IR_ADD), trlen, trend),[m
[31m-		   lj_ir_kint(J, 1));[m
[31m-    end = end+(int32_t)str->len+1;[m
[31m-  } else if ((MSize)end <= str->len) {[m
[31m-    emitir(IRTGI(IR_ULE), trend, trlen);[m
[31m-  } else {[m
[31m-    emitir(IRTGI(IR_UGT), trend, trlen);[m
[31m-    end = (int32_t)str->len;[m
[31m-    trend = trlen;[m
[31m-  }[m
[31m-  trstart = recff_string_start(J, str, &start, trstart, trlen, tr0);[m
[31m-  if (rd->data) {  /* Return string.sub result. */[m
[31m-    if (end - start >= 0) {[m
[31m-      /* Also handle empty range here, to avoid extra traces. */[m
[31m-      TRef trptr, trslen = emitir(IRTI(IR_SUB), trend, trstart);[m
[31m-      emitir(IRTGI(IR_GE), trslen, tr0);[m
[31m-      trptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);[m
[31m-      J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, trslen);[m
[31m-    } else {  /* Range underflow: return empty string. */[m
[31m-      emitir(IRTGI(IR_LT), trend, trstart);[m
[31m-      J->base[0] = lj_ir_kstr(J, &J2G(J)->strempty);[m
[31m-    }[m
[31m-  } else {  /* Return string.byte result(s). */[m
[31m-    ptrdiff_t i, len = end - start;[m
[31m-    if (len > 0) {[m
[31m-      TRef trslen = emitir(IRTI(IR_SUB), trend, trstart);[m
[31m-      emitir(IRTGI(IR_EQ), trslen, lj_ir_kint(J, (int32_t)len));[m
[31m-      if (J->baseslot + len > LJ_MAX_JSLOTS)[m
[31m-	lj_trace_err_info(J, LJ_TRERR_STACKOV);[m
[31m-      rd->nres = len;[m
[31m-      for (i = 0; i < len; i++) {[m
[31m-	TRef tmp = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, (int32_t)i));[m
[31m-	tmp = emitir(IRT(IR_STRREF, IRT_P32), trstr, tmp);[m
[31m-	J->base[i] = emitir(IRT(IR_XLOAD, IRT_U8), tmp, IRXLOAD_READONLY);[m
[31m-      }[m
[31m-    } else {  /* Empty range or range underflow: return no results. */[m
[31m-      emitir(IRTGI(IR_LE), trend, trstart);[m
[31m-      rd->nres = 0;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef k255 = lj_ir_kint(J, 255);[m
[31m-  BCReg i;[m
[31m-  for (i = 0; J->base[i] != 0; i++) {  /* Convert char values to strings. */[m
[31m-    TRef tr = lj_opt_narrow_toint(J, J->base[i]);[m
[31m-    emitir(IRTGI(IR_ULE), tr, k255);[m
[31m-    J->base[i] = emitir(IRT(IR_TOSTR, IRT_STR), tr, IRTOSTR_CHAR);[m
[31m-  }[m
[31m-  if (i > 1) {  /* Concatenate the strings, if there's more than one. */[m
[31m-    TRef hdr = recff_bufhdr(J), tr = hdr;[m
[31m-    for (i = 0; J->base[i] != 0; i++)[m
[31m-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]);[m
[31m-    J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-  }[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_rep(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef str = lj_ir_tostr(J, J->base[0]);[m
[31m-  TRef rep = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-  TRef hdr, tr, str2 = 0;[m
[31m-  if (!tref_isnil(J->base[2])) {[m
[31m-    TRef sep = lj_ir_tostr(J, J->base[2]);[m
[31m-    int32_t vrep = argv2int(J, &rd->argv[1]);[m
[31m-    emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1));[m
[31m-    if (vrep > 1) {[m
[31m-      TRef hdr2 = recff_bufhdr(J);[m
[31m-      TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), hdr2, sep);[m
[31m-      tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), tr2, str);[m
[31m-      str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2);[m
[31m-    }[m
[31m-  }[m
[31m-  tr = hdr = recff_bufhdr(J);[m
[31m-  if (str2) {[m
[31m-    tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, str);[m
[31m-    str = str2;[m
[31m-    rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1));[m
[31m-  }[m
[31m-  tr = lj_ir_call(J, IRCALL_lj_buf_putstr_rep, tr, str, rep);[m
[31m-  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_op(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef str = lj_ir_tostr(J, J->base[0]);[m
[31m-  TRef hdr = recff_bufhdr(J);[m
[31m-  TRef tr = lj_ir_call(J, rd->data, hdr, str);[m
[31m-  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef trstr = lj_ir_tostr(J, J->base[0]);[m
[31m-  TRef trpat = lj_ir_tostr(J, J->base[1]);[m
[31m-  TRef trlen = emitir(IRTI(IR_FLOAD), trstr, IRFL_STR_LEN);[m
[31m-  TRef tr0 = lj_ir_kint(J, 0);[m
[31m-  TRef trstart;[m
[31m-  GCstr *str = argv2str(J, &rd->argv[0]);[m
[31m-  GCstr *pat = argv2str(J, &rd->argv[1]);[m
[31m-  int32_t start;[m
[31m-  J->needsnap = 1;[m
[31m-  if (tref_isnil(J->base[2])) {[m
[31m-    trstart = lj_ir_kint(J, 1);[m
[31m-    start = 1;[m
[31m-  } else {[m
[31m-    trstart = lj_opt_narrow_toint(J, J->base[2]);[m
[31m-    start = argv2int(J, &rd->argv[2]);[m
[31m-  }[m
[31m-  trstart = recff_string_start(J, str, &start, trstart, trlen, tr0);[m
[31m-  if ((MSize)start <= str->len) {[m
[31m-    emitir(IRTGI(IR_ULE), trstart, trlen);[m
[31m-  } else {[m
[31m-    emitir(IRTGI(IR_UGT), trstart, trlen);[m
[31m-#if LJ_52[m
[31m-    J->base[0] = TREF_NIL;[m
[31m-    return;[m
[31m-#else[m
[31m-    trstart = trlen;[m
[31m-    start = str->len;[m
[31m-#endif[m
[31m-  }[m
[31m-  /* Fixed arg or no pattern matching chars? (Specialized to pattern string.) */[m
[31m-  if ((J->base[2] && tref_istruecond(J->base[3])) ||[m
[31m-      (emitir(IRTG(IR_EQ, IRT_STR), trpat, lj_ir_kstr(J, pat)),[m
[31m-       !lj_str_haspattern(pat))) {  /* Search for fixed string. */[m
[31m-    TRef trsptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);[m
[31m-    TRef trpptr = emitir(IRT(IR_STRREF, IRT_P32), trpat, tr0);[m
[31m-    TRef trslen = emitir(IRTI(IR_SUB), trlen, trstart);[m
[31m-    TRef trplen = emitir(IRTI(IR_FLOAD), trpat, IRFL_STR_LEN);[m
[31m-    TRef tr = lj_ir_call(J, IRCALL_lj_str_find, trsptr, trpptr, trslen, trplen);[m
[31m-    TRef trp0 = lj_ir_kkptr(J, NULL);[m
[31m-    if (lj_str_find(strdata(str)+(MSize)start, strdata(pat),[m
[31m-		    str->len-(MSize)start, pat->len)) {[m
[31m-      TRef pos;[m
[31m-      emitir(IRTG(IR_NE, IRT_P32), tr, trp0);[m
[31m-      pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_P32), trstr, tr0));[m
[31m-      J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));[m
[31m-      J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);[m
[31m-      rd->nres = 2;[m
[31m-    } else {[m
[31m-      emitir(IRTG(IR_EQ, IRT_P32), tr, trp0);[m
[31m-      J->base[0] = TREF_NIL;[m
[31m-    }[m
[31m-  } else {  /* Search for pattern. */[m
[31m-    recff_nyiu(J, rd);[m
[31m-    return;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef trfmt = lj_ir_tostr(J, J->base[0]);[m
[31m-  GCstr *fmt = argv2str(J, &rd->argv[0]);[m
[31m-  int arg = 1;[m
[31m-  TRef hdr, tr;[m
[31m-  FormatState fs;[m
[31m-  SFormat sf;[m
[31m-  /* Specialize to the format string. */[m
[31m-  emitir(IRTG(IR_EQ, IRT_STR), trfmt, lj_ir_kstr(J, fmt));[m
[31m-  tr = hdr = recff_bufhdr(J);[m
[31m-  lj_strfmt_init(&fs, strdata(fmt), fmt->len);[m
[31m-  while ((sf = lj_strfmt_parse(&fs)) != STRFMT_EOF) {  /* Parse format. */[m
[31m-    TRef tra = sf == STRFMT_LIT ? 0 : J->base[arg++];[m
[31m-    TRef trsf = lj_ir_kint(J, (int32_t)sf);[m
[31m-    IRCallID id;[m
[31m-    switch (STRFMT_TYPE(sf)) {[m
[31m-    case STRFMT_LIT:[m
[31m-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,[m
[31m-		  lj_ir_kstr(J, lj_str_new(J->L, fs.str, fs.len)));[m
[31m-      break;[m
[31m-    case STRFMT_INT:[m
[31m-      id = IRCALL_lj_strfmt_putfnum_int;[m
[31m-    handle_int:[m
[31m-      if (!tref_isinteger(tra))[m
[31m-	goto handle_num;[m
[31m-      if (sf == STRFMT_INT) { /* Shortcut for plain %d. */[m
[31m-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,[m
[31m-		    emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_INT));[m
[31m-      } else {[m
[31m-#if LJ_HASFFI[m
[31m-	tra = emitir(IRT(IR_CONV, IRT_U64), tra,[m
[31m-		     (IRT_INT|(IRT_U64<<5)|IRCONV_SEXT));[m
[31m-	tr = lj_ir_call(J, IRCALL_lj_strfmt_putfxint, tr, trsf, tra);[m
[31m-	lj_needsplit(J);[m
[31m-#else[m
[31m-	recff_nyiu(J, rd);  /* Don't bother working around this NYI. */[m
[31m-	return;[m
[31m-#endif[m
[31m-      }[m
[31m-      break;[m
[31m-    case STRFMT_UINT:[m
[31m-      id = IRCALL_lj_strfmt_putfnum_uint;[m
[31m-      goto handle_int;[m
[31m-    case STRFMT_NUM:[m
[31m-      id = IRCALL_lj_strfmt_putfnum;[m
[31m-    handle_num:[m
[31m-      tra = lj_ir_tonum(J, tra);[m
[31m-      tr = lj_ir_call(J, id, tr, trsf, tra);[m
[31m-      if (LJ_SOFTFP) lj_needsplit(J);[m
[31m-      break;[m
[31m-    case STRFMT_STR:[m
[31m-      if (!tref_isstr(tra)) {[m
[31m-	recff_nyiu(J, rd);  /* NYI: __tostring and non-string types for %s. */[m
[31m-	return;[m
[31m-      }[m
[31m-      if (sf == STRFMT_STR)  /* Shortcut for plain %s. */[m
[31m-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, tra);[m
[31m-      else if ((sf & STRFMT_T_QUOTED))[m
[31m-	tr = lj_ir_call(J, IRCALL_lj_strfmt_putquoted, tr, tra);[m
[31m-      else[m
[31m-	tr = lj_ir_call(J, IRCALL_lj_strfmt_putfstr, tr, trsf, tra);[m
[31m-      break;[m
[31m-    case STRFMT_CHAR:[m
[31m-      tra = lj_opt_narrow_toint(J, tra);[m
[31m-      if (sf == STRFMT_CHAR)  /* Shortcut for plain %c. */[m
[31m-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,[m
[31m-		    emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_CHAR));[m
[31m-      else[m
[31m-	tr = lj_ir_call(J, IRCALL_lj_strfmt_putfchar, tr, trsf, tra);[m
[31m-      break;[m
[31m-    case STRFMT_PTR:  /* NYI */[m
[31m-    case STRFMT_ERR:[m
[31m-    default:[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-}[m
[31m-[m
[31m-/* -- Table library fast functions ---------------------------------------- */[m
[31m-[m
[31m-static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0];[m
[31m-  ix.val = J->base[1];[m
[31m-  rd->nres = 0;[m
[31m-  if (tref_istab(ix.tab) && ix.val) {[m
[31m-    if (!J->base[2]) {  /* Simple push: t[#t+1] = v */[m
[31m-      TRef trlen = lj_ir_call(J, IRCALL_lj_tab_len, ix.tab);[m
[31m-      GCtab *t = tabV(&rd->argv[0]);[m
[31m-      ix.key = emitir(IRTI(IR_ADD), trlen, lj_ir_kint(J, 1));[m
[31m-      settabV(J->L, &ix.tabv, t);[m
[31m-      setintV(&ix.keyv, lj_tab_len(t) + 1);[m
[31m-      ix.idxchain = 0;[m
[31m-      lj_record_idx(J, &ix);  /* Set new value. */[m
[31m-    } else {  /* Complex case: insert in the middle. */[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_table_concat(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tab = J->base[0];[m
[31m-  if (tref_istab(tab)) {[m
[31m-    TRef sep = !tref_isnil(J->base[1]) ?[m
[31m-	       lj_ir_tostr(J, J->base[1]) : lj_ir_knull(J, IRT_STR);[m
[31m-    TRef tri = (J->base[1] && !tref_isnil(J->base[2])) ?[m
[31m-	       lj_opt_narrow_toint(J, J->base[2]) : lj_ir_kint(J, 1);[m
[31m-    TRef tre = (J->base[1] && J->base[2] && !tref_isnil(J->base[3])) ?[m
[31m-	       lj_opt_narrow_toint(J, J->base[3]) :[m
[31m-	       lj_ir_call(J, IRCALL_lj_tab_len, tab);[m
[31m-    TRef hdr = recff_bufhdr(J);[m
[31m-    TRef tr = lj_ir_call(J, IRCALL_lj_buf_puttab, hdr, tab, sep, tri, tre);[m
[31m-    emitir(IRTG(IR_NE, IRT_PTR), tr, lj_ir_kptr(J, NULL));[m
[31m-    J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_table_new(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tra = lj_opt_narrow_toint(J, J->base[0]);[m
[31m-  TRef trh = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-  J->base[0] = lj_ir_call(J, IRCALL_lj_tab_new_ah, tra, trh);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_table_clear(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_istab(tr)) {[m
[31m-    rd->nres = 0;[m
[31m-    lj_ir_call(J, IRCALL_lj_tab_clear, tr);[m
[31m-    J->needsnap = 1;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-/* -- I/O library fast functions ------------------------------------------ */[m
[31m-[m
[31m-/* Get FILE* for I/O function. Any I/O error aborts recording, so there's[m
[31m-** no need to encode the alternate cases for any of the guards.[m
[31m-*/[m
[31m-static TRef recff_io_fp(jit_State *J, TRef *udp, int32_t id)[m
[31m-{[m
[31m-  TRef tr, ud, fp;[m
[31m-  if (id) {  /* io.func() */[m
[31m-    tr = lj_ir_kptr(J, &J2G(J)->gcroot[id]);[m
[31m-    ud = emitir(IRT(IR_XLOAD, IRT_UDATA), tr, 0);[m
[31m-  } else {  /* fp:method() */[m
[31m-    ud = J->base[0];[m
[31m-    if (!tref_isudata(ud))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    tr = emitir(IRT(IR_FLOAD, IRT_U8), ud, IRFL_UDATA_UDTYPE);[m
[31m-    emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE));[m
[31m-  }[m
[31m-  *udp = ud;[m
[31m-  fp = emitir(IRT(IR_FLOAD, IRT_PTR), ud, IRFL_UDATA_FILE);[m
[31m-  emitir(IRTG(IR_NE, IRT_PTR), fp, lj_ir_knull(J, IRT_PTR));[m
[31m-  return fp;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef ud, fp = recff_io_fp(J, &ud, rd->data);[m
[31m-  TRef zero = lj_ir_kint(J, 0);[m
[31m-  TRef one = lj_ir_kint(J, 1);[m
[31m-  ptrdiff_t i = rd->data == 0 ? 1 : 0;[m
[31m-  for (; J->base[i]; i++) {[m
[31m-    TRef str = lj_ir_tostr(J, J->base[i]);[m
[31m-    TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero);[m
[31m-    TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);[m
[31m-    if (tref_isk(len) && IR(tref_ref(len))->i == 1) {[m
[31m-      IRIns *irs = IR(tref_ref(str));[m
[31m-      TRef tr = (irs->o == IR_TOSTR && irs->op2 == IRTOSTR_CHAR) ?[m
[31m-		irs->op1 :[m
[31m-		emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY);[m
[31m-      tr = lj_ir_call(J, IRCALL_fputc, tr, fp);[m
[31m-      if (results_wanted(J) != 0)  /* Check result only if not ignored. */[m
[31m-	emitir(IRTGI(IR_NE), tr, lj_ir_kint(J, -1));[m
[31m-    } else {[m
[31m-      TRef tr = lj_ir_call(J, IRCALL_fwrite, buf, one, len, fp);[m
[31m-      if (results_wanted(J) != 0)  /* Check result only if not ignored. */[m
[31m-	emitir(IRTGI(IR_EQ), tr, len);[m
[31m-    }[m
[31m-  }[m
[31m-  J->base[0] = LJ_52 ? ud : TREF_TRUE;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_io_flush(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef ud, fp = recff_io_fp(J, &ud, rd->data);[m
[31m-  TRef tr = lj_ir_call(J, IRCALL_fflush, fp);[m
[31m-  if (results_wanted(J) != 0)  /* Check result only if not ignored. */[m
[31m-    emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, 0));[m
[31m-  J->base[0] = TREF_TRUE;[m
[31m-}[m
[31m-[m
[31m-/* -- Debug library fast functions ---------------------------------------- */[m
[31m-[m
[31m-static void LJ_FASTCALL recff_debug_getmetatable(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  GCtab *mt;[m
[31m-  TRef mtref;[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_istab(tr)) {[m
[31m-    mt = tabref(tabV(&rd->argv[0])->metatable);[m
[31m-    mtref = emitir(IRT(IR_FLOAD, IRT_TAB), tr, IRFL_TAB_META);[m
[31m-  } else if (tref_isudata(tr)) {[m
[31m-    mt = tabref(udataV(&rd->argv[0])->metatable);[m
[31m-    mtref = emitir(IRT(IR_FLOAD, IRT_TAB), tr, IRFL_UDATA_META);[m
[31m-  } else {[m
[31m-    mt = tabref(basemt_obj(J2G(J), &rd->argv[0]));[m
[31m-    J->base[0] = mt ? lj_ir_ktab(J, mt) : TREF_NIL;[m
[31m-    return;[m
[31m-  }[m
[31m-  emitir(IRTG(mt ? IR_NE : IR_EQ, IRT_TAB), mtref, lj_ir_knull(J, IRT_TAB));[m
[31m-  J->base[0] = mt ? mtref : TREF_NIL;[m
[31m-}[m
[31m-[m
[31m-/* -- Record calls to fast functions -------------------------------------- */[m
[31m-[m
[31m-#include "lj_recdef.h"[m
[31m-[m
[31m-static uint32_t recdef_lookup(GCfunc *fn)[m
[31m-{[m
[31m-  if (fn->c.ffid < sizeof(recff_idmap)/sizeof(recff_idmap[0]))[m
[31m-    return recff_idmap[fn->c.ffid];[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/* Record entry to a fast function or C function. */[m
[31m-void lj_ffrecord_func(jit_State *J)[m
[31m-{[m
[31m-  RecordFFData rd;[m
[31m-  uint32_t m = recdef_lookup(J->fn);[m
[31m-  rd.data = m & 0xff;[m
[31m-  rd.nres = 1;  /* Default is one result. */[m
[31m-  rd.argv = J->L->base;[m
[31m-  J->base[J->maxslot] = 0;  /* Mark end of arguments. */[m
[31m-  (recff_func[m >> 8])(J, &rd);  /* Call recff_* handler. */[m
[31m-  if (rd.nres >= 0) {[m
[31m-    if (J->postproc == LJ_POST_NONE) J->postproc = LJ_POST_FFRETRY;[m
[31m-    lj_record_ret(J, 0, rd.nres);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.h[m
[1mdeleted file mode 100644[m
[1mindex 7a188be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ffrecord.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-/*[m
[31m-** Fast function call recorder.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_FFRECORD_H[m
[31m-#define _LJ_FFRECORD_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Data used by handlers to record a fast function. */[m
[31m-typedef struct RecordFFData {[m
[31m-  TValue *argv;		/* Runtime argument values. */[m
[31m-  ptrdiff_t nres;	/* Number of returned results (defaults to 1). */[m
[31m-  uint32_t data;	/* Per-ffid auxiliary data (opcode, literal etc.). */[m
[31m-} RecordFFData;[m
[31m-[m
[31m-LJ_FUNC int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv);[m
[31m-LJ_FUNC void lj_ffrecord_func(jit_State *J);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_frame.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_frame.h[m
[1mdeleted file mode 100644[m
[1mindex fc0e281..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_frame.h[m
[1m+++ /dev/null[m
[36m@@ -1,270 +0,0 @@[m
[31m-/*[m
[31m-** Stack frames.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_FRAME_H[m
[31m-#define _LJ_FRAME_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_bc.h"[m
[31m-[m
[31m-/* -- Lua stack frame ----------------------------------------------------- */[m
[31m-[m
[31m-/* Frame type markers in LSB of PC (4-byte aligned) or delta (8-byte aligned:[m
[31m-**[m
[31m-**    PC  00  Lua frame[m
[31m-** delta 001  C frame[m
[31m-** delta 010  Continuation frame[m
[31m-** delta 011  Lua vararg frame[m
[31m-** delta 101  cpcall() frame[m
[31m-** delta 110  ff pcall() frame[m
[31m-** delta 111  ff pcall() frame with active hook[m
[31m-*/[m
[31m-enum {[m
[31m-  FRAME_LUA, FRAME_C, FRAME_CONT, FRAME_VARG,[m
[31m-  FRAME_LUAP, FRAME_CP, FRAME_PCALL, FRAME_PCALLH[m
[31m-};[m
[31m-#define FRAME_TYPE		3[m
[31m-#define FRAME_P			4[m
[31m-#define FRAME_TYPEP		(FRAME_TYPE|FRAME_P)[m
[31m-[m
[31m-/* Macros to access and modify Lua frames. */[m
[31m-#if LJ_FR2[m
[31m-/* Two-slot frame info, required for 64 bit PC/GCRef:[m
[31m-**[m
[31m-**                   base-2  base-1      |  base  base+1 ...[m
[31m-**                  [func   PC/delta/ft] | [slots ...][m
[31m-**                  ^-- frame            | ^-- base   ^-- top[m
[31m-**[m
[31m-** Continuation frames:[m
[31m-**[m
[31m-**   base-4  base-3  base-2  base-1      |  base  base+1 ...[m
[31m-**  [cont      PC ] [func   PC/delta/ft] | [slots ...][m
[31m-**                  ^-- frame            | ^-- base   ^-- top[m
[31m-*/[m
[31m-#define frame_gc(f)		(gcval((f)-1))[m
[31m-#define frame_ftsz(f)		((ptrdiff_t)(f)->ftsz)[m
[31m-#define frame_pc(f)		((const BCIns *)frame_ftsz(f))[m
[31m-#define setframe_gc(f, p, tp)	(setgcVraw((f)-1, (p), (tp)))[m
[31m-#define setframe_ftsz(f, sz)	((f)->ftsz = (sz))[m
[31m-#define setframe_pc(f, pc)	((f)->ftsz = (int64_t)(intptr_t)(pc))[m
[31m-#else[m
[31m-/* One-slot frame info, sufficient for 32 bit PC/GCRef:[m
[31m-**[m
[31m-**              base-1              |  base  base+1 ...[m
[31m-**              lo     hi           |[m
[31m-**             [func | PC/delta/ft] | [slots ...][m
[31m-**             ^-- frame            | ^-- base   ^-- top[m
[31m-**[m
[31m-** Continuation frames:[m
[31m-**[m
[31m-**  base-2      base-1              |  base  base+1 ...[m
[31m-**  lo     hi   lo     hi           |[m
[31m-** [cont | PC] [func | PC/delta/ft] | [slots ...][m
[31m-**             ^-- frame            | ^-- base   ^-- top[m
[31m-*/[m
[31m-#define frame_gc(f)		(gcref((f)->fr.func))[m
[31m-#define frame_ftsz(f)		((ptrdiff_t)(f)->fr.tp.ftsz)[m
[31m-#define frame_pc(f)		(mref((f)->fr.tp.pcr, const BCIns))[m
[31m-#define setframe_gc(f, p, tp)	(setgcref((f)->fr.func, (p)), UNUSED(tp))[m
[31m-#define setframe_ftsz(f, sz)	((f)->fr.tp.ftsz = (int32_t)(sz))[m
[31m-#define setframe_pc(f, pc)	(setmref((f)->fr.tp.pcr, (pc)))[m
[31m-#endif[m
[31m-[m
[31m-#define frame_type(f)		(frame_ftsz(f) & FRAME_TYPE)[m
[31m-#define frame_typep(f)		(frame_ftsz(f) & FRAME_TYPEP)[m
[31m-#define frame_islua(f)		(frame_type(f) == FRAME_LUA)[m
[31m-#define frame_isc(f)		(frame_type(f) == FRAME_C)[m
[31m-#define frame_iscont(f)		(frame_typep(f) == FRAME_CONT)[m
[31m-#define frame_isvarg(f)		(frame_typep(f) == FRAME_VARG)[m
[31m-#define frame_ispcall(f)	((frame_ftsz(f) & 6) == FRAME_PCALL)[m
[31m-[m
[31m-#define frame_func(f)		(&frame_gc(f)->fn)[m
[31m-#define frame_delta(f)		(frame_ftsz(f) >> 3)[m
[31m-#define frame_sized(f)		(frame_ftsz(f) & ~FRAME_TYPEP)[m
[31m-[m
[31m-enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK };  /* Special continuations. */[m
[31m-[m
[31m-#if LJ_FR2[m
[31m-#define frame_contpc(f)		(frame_pc((f)-2))[m
[31m-#define frame_contv(f)		(((f)-3)->u64)[m
[31m-#else[m
[31m-#define frame_contpc(f)		(frame_pc((f)-1))[m
[31m-#define frame_contv(f)		(((f)-1)->u32.lo)[m
[31m-#endif[m
[31m-#if LJ_FR2[m
[31m-#define frame_contf(f)		((ASMFunction)(uintptr_t)((f)-3)->u64)[m
[31m-#elif LJ_64[m
[31m-#define frame_contf(f) \[m
[31m-  ((ASMFunction)(void *)((intptr_t)lj_vm_asm_begin + \[m
[31m-			 (intptr_t)(int32_t)((f)-1)->u32.lo))[m
[31m-#else[m
[31m-#define frame_contf(f)		((ASMFunction)gcrefp(((f)-1)->gcr, void))[m
[31m-#endif[m
[31m-#define frame_iscont_fficb(f) \[m
[31m-  (LJ_HASFFI && frame_contv(f) == LJ_CONT_FFI_CALLBACK)[m
[31m-[m
[31m-#define frame_prevl(f)		((f) - (1+LJ_FR2+bc_a(frame_pc(f)[-1])))[m
[31m-#define frame_prevd(f)		((TValue *)((char *)(f) - frame_sized(f)))[m
[31m-#define frame_prev(f)		(frame_islua(f)?frame_prevl(f):frame_prevd(f))[m
[31m-/* Note: this macro does not skip over FRAME_VARG. */[m
[31m-[m
[31m-/* -- C stack frame ------------------------------------------------------- */[m
[31m-[m
[31m-/* Macros to access and modify the C stack frame chain. */[m
[31m-[m
[31m-/* These definitions must match with the arch-specific *.dasc files. */[m
[31m-#if LJ_TARGET_X86[m
[31m-#define CFRAME_OFS_ERRF		(15*4)[m
[31m-#define CFRAME_OFS_NRES		(14*4)[m
[31m-#define CFRAME_OFS_PREV		(13*4)[m
[31m-#define CFRAME_OFS_L		(12*4)[m
[31m-#define CFRAME_OFS_PC		(6*4)[m
[31m-#define CFRAME_OFS_MULTRES	(5*4)[m
[31m-#define CFRAME_SIZE		(12*4)[m
[31m-#define CFRAME_SHIFT_MULTRES	0[m
[31m-#elif LJ_TARGET_X64[m
[31m-#if LJ_ABI_WIN[m
[31m-#define CFRAME_OFS_PREV		(13*8)[m
[31m-#if LJ_GC64[m
[31m-#define CFRAME_OFS_PC		(12*8)[m
[31m-#define CFRAME_OFS_L		(11*8)[m
[31m-#define CFRAME_OFS_ERRF		(21*4)[m
[31m-#define CFRAME_OFS_NRES		(20*4)[m
[31m-#define CFRAME_OFS_MULTRES	(8*4)[m
[31m-#else[m
[31m-#define CFRAME_OFS_PC		(25*4)[m
[31m-#define CFRAME_OFS_L		(24*4)[m
[31m-#define CFRAME_OFS_ERRF		(23*4)[m
[31m-#define CFRAME_OFS_NRES		(22*4)[m
[31m-#define CFRAME_OFS_MULTRES	(21*4)[m
[31m-#endif[m
[31m-#define CFRAME_SIZE		(10*8)[m
[31m-#define CFRAME_SIZE_JIT		(CFRAME_SIZE + 9*16 + 4*8)[m
[31m-#define CFRAME_SHIFT_MULTRES	0[m
[31m-#else[m
[31m-#define CFRAME_OFS_PREV		(4*8)[m
[31m-#if LJ_GC64[m
[31m-#define CFRAME_OFS_PC		(3*8)[m
[31m-#define CFRAME_OFS_L		(2*8)[m
[31m-#define CFRAME_OFS_ERRF		(3*4)[m
[31m-#define CFRAME_OFS_NRES		(2*4)[m
[31m-#define CFRAME_OFS_MULTRES	(0*4)[m
[31m-#else[m
[31m-#define CFRAME_OFS_PC		(7*4)[m
[31m-#define CFRAME_OFS_L		(6*4)[m
[31m-#define CFRAME_OFS_ERRF		(5*4)[m
[31m-#define CFRAME_OFS_NRES		(4*4)[m
[31m-#define CFRAME_OFS_MULTRES	(1*4)[m
[31m-#endif[m
[31m-#if LJ_NO_UNWIND[m
[31m-#define CFRAME_SIZE		(12*8)[m
[31m-#else[m
[31m-#define CFRAME_SIZE		(10*8)[m
[31m-#endif[m
[31m-#define CFRAME_SIZE_JIT		(CFRAME_SIZE + 16)[m
[31m-#define CFRAME_SHIFT_MULTRES	0[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#define CFRAME_OFS_ERRF		24[m
[31m-#define CFRAME_OFS_NRES		20[m
[31m-#define CFRAME_OFS_PREV		16[m
[31m-#define CFRAME_OFS_L		12[m
[31m-#define CFRAME_OFS_PC		8[m
[31m-#define CFRAME_OFS_MULTRES	4[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-#define CFRAME_SIZE		128[m
[31m-#else[m
[31m-#define CFRAME_SIZE		64[m
[31m-#endif[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#define CFRAME_OFS_ERRF		196[m
[31m-#define CFRAME_OFS_NRES		200[m
[31m-#define CFRAME_OFS_PREV		160[m
[31m-#define CFRAME_OFS_L		176[m
[31m-#define CFRAME_OFS_PC		168[m
[31m-#define CFRAME_OFS_MULTRES	192[m
[31m-#define CFRAME_SIZE		208[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#if LJ_TARGET_XBOX360[m
[31m-#define CFRAME_OFS_ERRF		424[m
[31m-#define CFRAME_OFS_NRES		420[m
[31m-#define CFRAME_OFS_PREV		400[m
[31m-#define CFRAME_OFS_L		416[m
[31m-#define CFRAME_OFS_PC		412[m
[31m-#define CFRAME_OFS_MULTRES	408[m
[31m-#define CFRAME_SIZE		384[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#elif LJ_ARCH_PPC32ON64[m
[31m-#define CFRAME_OFS_ERRF		472[m
[31m-#define CFRAME_OFS_NRES		468[m
[31m-#define CFRAME_OFS_PREV		448[m
[31m-#define CFRAME_OFS_L		464[m
[31m-#define CFRAME_OFS_PC		460[m
[31m-#define CFRAME_OFS_MULTRES	456[m
[31m-#define CFRAME_SIZE		400[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#else[m
[31m-#define CFRAME_OFS_ERRF		48[m
[31m-#define CFRAME_OFS_NRES		44[m
[31m-#define CFRAME_OFS_PREV		40[m
[31m-#define CFRAME_OFS_L		36[m
[31m-#define CFRAME_OFS_PC		32[m
[31m-#define CFRAME_OFS_MULTRES	28[m
[31m-#define CFRAME_SIZE		272[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#endif[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-#define CFRAME_OFS_ERRF		124[m
[31m-#define CFRAME_OFS_NRES		120[m
[31m-#define CFRAME_OFS_PREV		116[m
[31m-#define CFRAME_OFS_L		112[m
[31m-#define CFRAME_OFS_PC		20[m
[31m-#define CFRAME_OFS_MULTRES	16[m
[31m-#define CFRAME_SIZE		112[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#else[m
[31m-#define CFRAME_OFS_ERRF		76[m
[31m-#define CFRAME_OFS_NRES		72[m
[31m-#define CFRAME_OFS_PREV		68[m
[31m-#define CFRAME_OFS_L		64[m
[31m-#define CFRAME_OFS_PC		20[m
[31m-#define CFRAME_OFS_MULTRES	16[m
[31m-#define CFRAME_SIZE		64[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#endif[m
[31m-#else[m
[31m-#error "Missing CFRAME_* definitions for this architecture"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CFRAME_SIZE_JIT[m
[31m-#define CFRAME_SIZE_JIT		CFRAME_SIZE[m
[31m-#endif[m
[31m-[m
[31m-#define CFRAME_RESUME		1[m
[31m-#define CFRAME_UNWIND_FF	2  /* Only used in unwinder. */[m
[31m-#define CFRAME_RAWMASK		(~(intptr_t)(CFRAME_RESUME|CFRAME_UNWIND_FF))[m
[31m-[m
[31m-#define cframe_errfunc(cf)	(*(int32_t *)(((char *)(cf))+CFRAME_OFS_ERRF))[m
[31m-#define cframe_nres(cf)		(*(int32_t *)(((char *)(cf))+CFRAME_OFS_NRES))[m
[31m-#define cframe_prev(cf)		(*(void **)(((char *)(cf))+CFRAME_OFS_PREV))[m
[31m-#define cframe_multres(cf)  (*(uint32_t *)(((char *)(cf))+CFRAME_OFS_MULTRES))[m
[31m-#define cframe_multres_n(cf)	(cframe_multres((cf)) >> CFRAME_SHIFT_MULTRES)[m
[31m-#define cframe_L(cf) \[m
[31m-  (&gcref(*(GCRef *)(((char *)(cf))+CFRAME_OFS_L))->th)[m
[31m-#define cframe_pc(cf) \[m
[31m-  (mref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), const BCIns))[m
[31m-#define setcframe_L(cf, L) \[m
[31m-  (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_L), (L)))[m
[31m-#define setcframe_pc(cf, pc) \[m
[31m-  (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), (pc)))[m
[31m-#define cframe_canyield(cf)	((intptr_t)(cf) & CFRAME_RESUME)[m
[31m-#define cframe_unwind_ff(cf)	((intptr_t)(cf) & CFRAME_UNWIND_FF)[m
[31m-#define cframe_raw(cf)		((void *)((intptr_t)(cf) & CFRAME_RAWMASK))[m
[31m-#define cframe_Lpc(L)		cframe_pc(cframe_raw(L->cframe))[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.c[m
[1mdeleted file mode 100644[m
[1mindex 431a56d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.c[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-/*[m
[31m-** Function handling (prototypes, functions and upvalues).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_func_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* -- Prototypes ---------------------------------------------------------- */[m
[31m-[m
[31m-void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt)[m
[31m-{[m
[31m-  lj_mem_free(g, pt, pt->sizept);[m
[31m-}[m
[31m-[m
[31m-/* -- Upvalues ------------------------------------------------------------ */[m
[31m-[m
[31m-static void unlinkuv(GCupval *uv)[m
[31m-{[m
[31m-  lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv);[m
[31m-  setgcrefr(uvnext(uv)->prev, uv->prev);[m
[31m-  setgcrefr(uvprev(uv)->next, uv->next);[m
[31m-}[m
[31m-[m
[31m-/* Find existing open upvalue for a stack slot or create a new one. */[m
[31m-static GCupval *func_finduv(lua_State *L, TValue *slot)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCRef *pp = &L->openupval;[m
[31m-  GCupval *p;[m
[31m-  GCupval *uv;[m
[31m-  /* Search the sorted list of open upvalues. */[m
[31m-  while (gcref(*pp) != NULL && uvval((p = gco2uv(gcref(*pp)))) >= slot) {[m
[31m-    lua_assert(!p->closed && uvval(p) != &p->tv);[m
[31m-    if (uvval(p) == slot) {  /* Found open upvalue pointing to same slot? */[m
[31m-      if (isdead(g, obj2gco(p)))  /* Resurrect it, if it's dead. */[m
[31m-	flipwhite(obj2gco(p));[m
[31m-      return p;[m
[31m-    }[m
[31m-    pp = &p->nextgc;[m
[31m-  }[m
[31m-  /* No matching upvalue found. Create a new one. */[m
[31m-  uv = lj_mem_newt(L, sizeof(GCupval), GCupval);[m
[31m-  newwhite(g, uv);[m
[31m-  uv->gct = ~LJ_TUPVAL;[m
[31m-  uv->closed = 0;  /* Still open. */[m
[31m-  setmref(uv->v, slot);  /* Pointing to the stack slot. */[m
[31m-  /* NOBARRIER: The GCupval is new (marked white) and open. */[m
[31m-  setgcrefr(uv->nextgc, *pp);  /* Insert into sorted list of open upvalues. */[m
[31m-  setgcref(*pp, obj2gco(uv));[m
[31m-  setgcref(uv->prev, obj2gco(&g->uvhead));  /* Insert into GC list, too. */[m
[31m-  setgcrefr(uv->next, g->uvhead.next);[m
[31m-  setgcref(uvnext(uv)->prev, obj2gco(uv));[m
[31m-  setgcref(g->uvhead.next, obj2gco(uv));[m
[31m-  lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv);[m
[31m-  return uv;[m
[31m-}[m
[31m-[m
[31m-/* Create an empty and closed upvalue. */[m
[31m-static GCupval *func_emptyuv(lua_State *L)[m
[31m-{[m
[31m-  GCupval *uv = (GCupval *)lj_mem_newgco(L, sizeof(GCupval));[m
[31m-  uv->gct = ~LJ_TUPVAL;[m
[31m-  uv->closed = 1;[m
[31m-  setnilV(&uv->tv);[m
[31m-  setmref(uv->v, &uv->tv);[m
[31m-  return uv;[m
[31m-}[m
[31m-[m
[31m-/* Close all open upvalues pointing to some stack level or above. */[m
[31m-void LJ_FASTCALL lj_func_closeuv(lua_State *L, TValue *level)[m
[31m-{[m
[31m-  GCupval *uv;[m
[31m-  global_State *g = G(L);[m
[31m-  while (gcref(L->openupval) != NULL &&[m
[31m-	 uvval((uv = gco2uv(gcref(L->openupval)))) >= level) {[m
[31m-    GCobj *o = obj2gco(uv);[m
[31m-    lua_assert(!isblack(o) && !uv->closed && uvval(uv) != &uv->tv);[m
[31m-    setgcrefr(L->openupval, uv->nextgc);  /* No longer in open list. */[m
[31m-    if (isdead(g, o)) {[m
[31m-      lj_func_freeuv(g, uv);[m
[31m-    } else {[m
[31m-      unlinkuv(uv);[m
[31m-      lj_gc_closeuv(g, uv);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_func_freeuv(global_State *g, GCupval *uv)[m
[31m-{[m
[31m-  if (!uv->closed)[m
[31m-    unlinkuv(uv);[m
[31m-  lj_mem_freet(g, uv);[m
[31m-}[m
[31m-[m
[31m-/* -- Functions (closures) ------------------------------------------------ */[m
[31m-[m
[31m-GCfunc *lj_func_newC(lua_State *L, MSize nelems, GCtab *env)[m
[31m-{[m
[31m-  GCfunc *fn = (GCfunc *)lj_mem_newgco(L, sizeCfunc(nelems));[m
[31m-  fn->c.gct = ~LJ_TFUNC;[m
[31m-  fn->c.ffid = FF_C;[m
[31m-  fn->c.nupvalues = (uint8_t)nelems;[m
[31m-  /* NOBARRIER: The GCfunc is new (marked white). */[m
[31m-  setmref(fn->c.pc, &G(L)->bc_cfunc_ext);[m
[31m-  setgcref(fn->c.env, obj2gco(env));[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-static GCfunc *func_newL(lua_State *L, GCproto *pt, GCtab *env)[m
[31m-{[m
[31m-  uint32_t count;[m
[31m-  GCfunc *fn = (GCfunc *)lj_mem_newgco(L, sizeLfunc((MSize)pt->sizeuv));[m
[31m-  fn->l.gct = ~LJ_TFUNC;[m
[31m-  fn->l.ffid = FF_LUA;[m
[31m-  fn->l.nupvalues = 0;  /* Set to zero until upvalues are initialized. */[m
[31m-  /* NOBARRIER: Really a setgcref. But the GCfunc is new (marked white). */[m
[31m-  setmref(fn->l.pc, proto_bc(pt));[m
[31m-  setgcref(fn->l.env, obj2gco(env));[m
[31m-  /* Saturating 3 bit counter (0..7) for created closures. */[m
[31m-  count = (uint32_t)pt->flags + PROTO_CLCOUNT;[m
[31m-  pt->flags = (uint8_t)(count - ((count >> PROTO_CLC_BITS) & PROTO_CLCOUNT));[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-/* Create a new Lua function with empty upvalues. */[m
[31m-GCfunc *lj_func_newL_empty(lua_State *L, GCproto *pt, GCtab *env)[m
[31m-{[m
[31m-  GCfunc *fn = func_newL(L, pt, env);[m
[31m-  MSize i, nuv = pt->sizeuv;[m
[31m-  /* NOBARRIER: The GCfunc is new (marked white). */[m
[31m-  for (i = 0; i < nuv; i++) {[m
[31m-    GCupval *uv = func_emptyuv(L);[m
[31m-    uv->dhash = (uint32_t)(uintptr_t)pt ^ ((uint32_t)proto_uv(pt)[i] << 24);[m
[31m-    setgcref(fn->l.uvptr[i], obj2gco(uv));[m
[31m-  }[m
[31m-  fn->l.nupvalues = (uint8_t)nuv;[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-/* Do a GC check and create a new Lua function with inherited upvalues. */[m
[31m-GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  GCRef *puv;[m
[31m-  MSize i, nuv;[m
[31m-  TValue *base;[m
[31m-  lj_gc_check_fixtop(L);[m
[31m-  fn = func_newL(L, pt, tabref(parent->env));[m
[31m-  /* NOBARRIER: The GCfunc is new (marked white). */[m
[31m-  puv = parent->uvptr;[m
[31m-  nuv = pt->sizeuv;[m
[31m-  base = L->base;[m
[31m-  for (i = 0; i < nuv; i++) {[m
[31m-    uint32_t v = proto_uv(pt)[i];[m
[31m-    GCupval *uv;[m
[31m-    if ((v & PROTO_UV_LOCAL)) {[m
[31m-      uv = func_finduv(L, base + (v & 0xff));[m
[31m-      uv->immutable = ((v / PROTO_UV_IMMUTABLE) & 1);[m
[31m-      uv->dhash = (uint32_t)(uintptr_t)mref(parent->pc, char) ^ (v << 24);[m
[31m-    } else {[m
[31m-      uv = &gcref(puv[v])->uv;[m
[31m-    }[m
[31m-    setgcref(fn->l.uvptr[i], obj2gco(uv));[m
[31m-  }[m
[31m-  fn->l.nupvalues = (uint8_t)nuv;[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_func_free(global_State *g, GCfunc *fn)[m
[31m-{[m
[31m-  MSize size = isluafunc(fn) ? sizeLfunc((MSize)fn->l.nupvalues) :[m
[31m-			       sizeCfunc((MSize)fn->c.nupvalues);[m
[31m-  lj_mem_free(g, fn, size);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.h[m
[1mdeleted file mode 100644[m
[1mindex e0c3c55..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_func.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-/*[m
[31m-** Function handling (prototypes, functions and upvalues).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_FUNC_H[m
[31m-#define _LJ_FUNC_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Prototypes. */[m
[31m-LJ_FUNC void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt);[m
[31m-[m
[31m-/* Upvalues. */[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_func_closeuv(lua_State *L, TValue *level);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_func_freeuv(global_State *g, GCupval *uv);[m
[31m-[m
[31m-/* Functions (closures). */[m
[31m-LJ_FUNC GCfunc *lj_func_newC(lua_State *L, MSize nelems, GCtab *env);[m
[31m-LJ_FUNC GCfunc *lj_func_newL_empty(lua_State *L, GCproto *pt, GCtab *env);[m
[31m-LJ_FUNCA GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_func_free(global_State *g, GCfunc *c);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.c[m
[1mdeleted file mode 100644[m
[1mindex 53f1d97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.c[m
[1m+++ /dev/null[m
[36m@@ -1,845 +0,0 @@[m
[31m-/*[m
[31m-** Garbage collector.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_gc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_udata.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#endif[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-#define GCSTEPSIZE	1024u[m
[31m-#define GCSWEEPMAX	40[m
[31m-#define GCSWEEPCOST	10[m
[31m-#define GCFINALIZECOST	100[m
[31m-[m
[31m-/* Macros to set GCobj colors and flags. */[m
[31m-#define white2gray(x)		((x)->gch.marked &= (uint8_t)~LJ_GC_WHITES)[m
[31m-#define gray2black(x)		((x)->gch.marked |= LJ_GC_BLACK)[m
[31m-#define isfinalized(u)		((u)->marked & LJ_GC_FINALIZED)[m
[31m-[m
[31m-/* -- Mark phase ---------------------------------------------------------- */[m
[31m-[m
[31m-/* Mark a TValue (if needed). */[m
[31m-#define gc_marktv(g, tv) \[m
[31m-  { lua_assert(!tvisgcv(tv) || (~itype(tv) == gcval(tv)->gch.gct)); \[m
[31m-    if (tviswhite(tv)) gc_mark(g, gcV(tv)); }[m
[31m-[m
[31m-/* Mark a GCobj (if needed). */[m
[31m-#define gc_markobj(g, o) \[m
[31m-  { if (iswhite(obj2gco(o))) gc_mark(g, obj2gco(o)); }[m
[31m-[m
[31m-/* Mark a string object. */[m
[31m-#define gc_mark_str(s)		((s)->marked &= (uint8_t)~LJ_GC_WHITES)[m
[31m-[m
[31m-/* Mark a white GCobj. */[m
[31m-static void gc_mark(global_State *g, GCobj *o)[m
[31m-{[m
[31m-  int gct = o->gch.gct;[m
[31m-  lua_assert(iswhite(o) && !isdead(g, o));[m
[31m-  white2gray(o);[m
[31m-  if (LJ_UNLIKELY(gct == ~LJ_TUDATA)) {[m
[31m-    GCtab *mt = tabref(gco2ud(o)->metatable);[m
[31m-    gray2black(o);  /* Userdata are never gray. */[m
[31m-    if (mt) gc_markobj(g, mt);[m
[31m-    gc_markobj(g, tabref(gco2ud(o)->env));[m
[31m-  } else if (LJ_UNLIKELY(gct == ~LJ_TUPVAL)) {[m
[31m-    GCupval *uv = gco2uv(o);[m
[31m-    gc_marktv(g, uvval(uv));[m
[31m-    if (uv->closed)[m
[31m-      gray2black(o);  /* Closed upvalues are never gray. */[m
[31m-  } else if (gct != ~LJ_TSTR && gct != ~LJ_TCDATA) {[m
[31m-    lua_assert(gct == ~LJ_TFUNC || gct == ~LJ_TTAB ||[m
[31m-	       gct == ~LJ_TTHREAD || gct == ~LJ_TPROTO || gct == ~LJ_TTRACE);[m
[31m-    setgcrefr(o->gch.gclist, g->gc.gray);[m
[31m-    setgcref(g->gc.gray, o);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Mark GC roots. */[m
[31m-static void gc_mark_gcroot(global_State *g)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = 0; i < GCROOT_MAX; i++)[m
[31m-    if (gcref(g->gcroot[i]) != NULL)[m
[31m-      gc_markobj(g, gcref(g->gcroot[i]));[m
[31m-}[m
[31m-[m
[31m-/* Start a GC cycle and mark the root set. */[m
[31m-static void gc_mark_start(global_State *g)[m
[31m-{[m
[31m-  setgcrefnull(g->gc.gray);[m
[31m-  setgcrefnull(g->gc.grayagain);[m
[31m-  setgcrefnull(g->gc.weak);[m
[31m-  gc_markobj(g, mainthread(g));[m
[31m-  gc_markobj(g, tabref(mainthread(g)->env));[m
[31m-  gc_marktv(g, &g->registrytv);[m
[31m-  gc_mark_gcroot(g);[m
[31m-  g->gc.state = GCSpropagate;[m
[31m-}[m
[31m-[m
[31m-/* Mark open upvalues. */[m
[31m-static void gc_mark_uv(global_State *g)[m
[31m-{[m
[31m-  GCupval *uv;[m
[31m-  for (uv = uvnext(&g->uvhead); uv != &g->uvhead; uv = uvnext(uv)) {[m
[31m-    lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv);[m
[31m-    if (isgray(obj2gco(uv)))[m
[31m-      gc_marktv(g, uvval(uv));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Mark userdata in mmudata list. */[m
[31m-static void gc_mark_mmudata(global_State *g)[m
[31m-{[m
[31m-  GCobj *root = gcref(g->gc.mmudata);[m
[31m-  GCobj *u = root;[m
[31m-  if (u) {[m
[31m-    do {[m
[31m-      u = gcnext(u);[m
[31m-      makewhite(g, u);  /* Could be from previous GC. */[m
[31m-      gc_mark(g, u);[m
[31m-    } while (u != root);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Separate userdata objects to be finalized to mmudata list. */[m
[31m-size_t lj_gc_separateudata(global_State *g, int all)[m
[31m-{[m
[31m-  size_t m = 0;[m
[31m-  GCRef *p = &mainthread(g)->nextgc;[m
[31m-  GCobj *o;[m
[31m-  while ((o = gcref(*p)) != NULL) {[m
[31m-    if (!(iswhite(o) || all) || isfinalized(gco2ud(o))) {[m
[31m-      p = &o->gch.nextgc;  /* Nothing to do. */[m
[31m-    } else if (!lj_meta_fastg(g, tabref(gco2ud(o)->metatable), MM_gc)) {[m
[31m-      markfinalized(o);  /* Done, as there's no __gc metamethod. */[m
[31m-      p = &o->gch.nextgc;[m
[31m-    } else {  /* Otherwise move userdata to be finalized to mmudata list. */[m
[31m-      m += sizeudata(gco2ud(o));[m
[31m-      markfinalized(o);[m
[31m-      *p = o->gch.nextgc;[m
[31m-      if (gcref(g->gc.mmudata)) {  /* Link to end of mmudata list. */[m
[31m-	GCobj *root = gcref(g->gc.mmudata);[m
[31m-	setgcrefr(o->gch.nextgc, root->gch.nextgc);[m
[31m-	setgcref(root->gch.nextgc, o);[m
[31m-	setgcref(g->gc.mmudata, o);[m
[31m-      } else {  /* Create circular list. */[m
[31m-	setgcref(o->gch.nextgc, o);[m
[31m-	setgcref(g->gc.mmudata, o);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return m;[m
[31m-}[m
[31m-[m
[31m-/* -- Propagation phase --------------------------------------------------- */[m
[31m-[m
[31m-/* Traverse a table. */[m
[31m-static int gc_traverse_tab(global_State *g, GCtab *t)[m
[31m-{[m
[31m-  int weak = 0;[m
[31m-  cTValue *mode;[m
[31m-  GCtab *mt = tabref(t->metatable);[m
[31m-  if (mt)[m
[31m-    gc_markobj(g, mt);[m
[31m-  mode = lj_meta_fastg(g, mt, MM_mode);[m
[31m-  if (mode && tvisstr(mode)) {  /* Valid __mode field? */[m
[31m-    const char *modestr = strVdata(mode);[m
[31m-    int c;[m
[31m-    while ((c = *modestr++)) {[m
[31m-      if (c == 'k') weak |= LJ_GC_WEAKKEY;[m
[31m-      else if (c == 'v') weak |= LJ_GC_WEAKVAL;[m
[31m-      else if (c == 'K') weak = (int)(~0u & ~LJ_GC_WEAKVAL);[m
[31m-    }[m
[31m-    if (weak > 0) {  /* Weak tables are cleared in the atomic phase. */[m
[31m-      t->marked = (uint8_t)((t->marked & ~LJ_GC_WEAK) | weak);[m
[31m-      setgcrefr(t->gclist, g->gc.weak);[m
[31m-      setgcref(g->gc.weak, obj2gco(t));[m
[31m-    }[m
[31m-  }[m
[31m-  if (weak == LJ_GC_WEAK)  /* Nothing to mark if both keys/values are weak. */[m
[31m-    return 1;[m
[31m-  if (!(weak & LJ_GC_WEAKVAL)) {  /* Mark array part. */[m
[31m-    MSize i, asize = t->asize;[m
[31m-    for (i = 0; i < asize; i++)[m
[31m-      gc_marktv(g, arrayslot(t, i));[m
[31m-  }[m
[31m-  if (t->hmask > 0) {  /* Mark hash part. */[m
[31m-    Node *node = noderef(t->node);[m
[31m-    MSize i, hmask = t->hmask;[m
[31m-    for (i = 0; i <= hmask; i++) {[m
[31m-      Node *n = &node[i];[m
[31m-      if (!tvisnil(&n->val)) {  /* Mark non-empty slot. */[m
[31m-	lua_assert(!tvisnil(&n->key));[m
[31m-	if (!(weak & LJ_GC_WEAKKEY)) gc_marktv(g, &n->key);[m
[31m-	if (!(weak & LJ_GC_WEAKVAL)) gc_marktv(g, &n->val);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return weak;[m
[31m-}[m
[31m-[m
[31m-/* Traverse a function. */[m
[31m-static void gc_traverse_func(global_State *g, GCfunc *fn)[m
[31m-{[m
[31m-  gc_markobj(g, tabref(fn->c.env));[m
[31m-  if (isluafunc(fn)) {[m
[31m-    uint32_t i;[m
[31m-    lua_assert(fn->l.nupvalues <= funcproto(fn)->sizeuv);[m
[31m-    gc_markobj(g, funcproto(fn));[m
[31m-    for (i = 0; i < fn->l.nupvalues; i++)  /* Mark Lua function upvalues. */[m
[31m-      gc_markobj(g, &gcref(fn->l.uvptr[i])->uv);[m
[31m-  } else {[m
[31m-    uint32_t i;[m
[31m-    for (i = 0; i < fn->c.nupvalues; i++)  /* Mark C function upvalues. */[m
[31m-      gc_marktv(g, &fn->c.upvalue[i]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Mark a trace. */[m
[31m-static void gc_marktrace(global_State *g, TraceNo traceno)[m
[31m-{[m
[31m-  GCobj *o = obj2gco(traceref(G2J(g), traceno));[m
[31m-  lua_assert(traceno != G2J(g)->cur.traceno);[m
[31m-  if (iswhite(o)) {[m
[31m-    white2gray(o);[m
[31m-    setgcrefr(o->gch.gclist, g->gc.gray);[m
[31m-    setgcref(g->gc.gray, o);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Traverse a trace. */[m
[31m-static void gc_traverse_trace(global_State *g, GCtrace *T)[m
[31m-{[m
[31m-  IRRef ref;[m
[31m-  if (T->traceno == 0) return;[m
[31m-  for (ref = T->nk; ref < REF_TRUE; ref++) {[m
[31m-    IRIns *ir = &T->ir[ref];[m
[31m-    if (ir->o == IR_KGC)[m
[31m-      gc_markobj(g, ir_kgc(ir));[m
[31m-  }[m
[31m-  if (T->link) gc_marktrace(g, T->link);[m
[31m-  if (T->nextroot) gc_marktrace(g, T->nextroot);[m
[31m-  if (T->nextside) gc_marktrace(g, T->nextside);[m
[31m-  gc_markobj(g, gcref(T->startpt));[m
[31m-}[m
[31m-[m
[31m-/* The current trace is a GC root while not anchored in the prototype (yet). */[m
[31m-#define gc_traverse_curtrace(g)	gc_traverse_trace(g, &G2J(g)->cur)[m
[31m-#else[m
[31m-#define gc_traverse_curtrace(g)	UNUSED(g)[m
[31m-#endif[m
[31m-[m
[31m-/* Traverse a prototype. */[m
[31m-static void gc_traverse_proto(global_State *g, GCproto *pt)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  gc_mark_str(proto_chunkname(pt));[m
[31m-  for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++)  /* Mark collectable consts. */[m
[31m-    gc_markobj(g, proto_kgc(pt, i));[m
[31m-#if LJ_HASJIT[m
[31m-  if (pt->trace) gc_marktrace(g, pt->trace);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Traverse the frame structure of a stack. */[m
[31m-static MSize gc_traverse_frames(global_State *g, lua_State *th)[m
[31m-{[m
[31m-  TValue *frame, *top = th->top-1, *bot = tvref(th->stack);[m
[31m-  /* Note: extra vararg frame not skipped, marks function twice (harmless). */[m
[31m-  for (frame = th->base-1; frame > bot+LJ_FR2; frame = frame_prev(frame)) {[m
[31m-    GCfunc *fn = frame_func(frame);[m
[31m-    TValue *ftop = frame;[m
[31m-    if (isluafunc(fn)) ftop += funcproto(fn)->framesize;[m
[31m-    if (ftop > top) top = ftop;[m
[31m-    if (!LJ_FR2) gc_markobj(g, fn);  /* Need to mark hidden function (or L). */[m
[31m-  }[m
[31m-  top++;  /* Correct bias of -1 (frame == base-1). */[m
[31m-  if (top > tvref(th->maxstack)) top = tvref(th->maxstack);[m
[31m-  return (MSize)(top - bot);  /* Return minimum needed stack size. */[m
[31m-}[m
[31m-[m
[31m-/* Traverse a thread object. */[m
[31m-static void gc_traverse_thread(global_State *g, lua_State *th)[m
[31m-{[m
[31m-  TValue *o, *top = th->top;[m
[31m-  for (o = tvref(th->stack)+1+LJ_FR2; o < top; o++)[m
[31m-    gc_marktv(g, o);[m
[31m-  if (g->gc.state == GCSatomic) {[m
[31m-    top = tvref(th->stack) + th->stacksize;[m
[31m-    for (; o < top; o++)  /* Clear unmarked slots. */[m
[31m-      setnilV(o);[m
[31m-  }[m
[31m-  gc_markobj(g, tabref(th->env));[m
[31m-  lj_state_shrinkstack(th, gc_traverse_frames(g, th));[m
[31m-}[m
[31m-[m
[31m-/* Propagate one gray object. Traverse it and turn it black. */[m
[31m-static size_t propagatemark(global_State *g)[m
[31m-{[m
[31m-  GCobj *o = gcref(g->gc.gray);[m
[31m-  int gct = o->gch.gct;[m
[31m-  lua_assert(isgray(o));[m
[31m-  gray2black(o);[m
[31m-  setgcrefr(g->gc.gray, o->gch.gclist);  /* Remove from gray list. */[m
[31m-  if (LJ_LIKELY(gct == ~LJ_TTAB)) {[m
[31m-    GCtab *t = gco2tab(o);[m
[31m-    if (gc_traverse_tab(g, t) > 0)[m
[31m-      black2gray(o);  /* Keep weak tables gray. */[m
[31m-    return sizeof(GCtab) + sizeof(TValue) * t->asize +[m
[31m-			   sizeof(Node) * (t->hmask + 1);[m
[31m-  } else if (LJ_LIKELY(gct == ~LJ_TFUNC)) {[m
[31m-    GCfunc *fn = gco2func(o);[m
[31m-    gc_traverse_func(g, fn);[m
[31m-    return isluafunc(fn) ? sizeLfunc((MSize)fn->l.nupvalues) :[m
[31m-			   sizeCfunc((MSize)fn->c.nupvalues);[m
[31m-  } else if (LJ_LIKELY(gct == ~LJ_TPROTO)) {[m
[31m-    GCproto *pt = gco2pt(o);[m
[31m-    gc_traverse_proto(g, pt);[m
[31m-    return pt->sizept;[m
[31m-  } else if (LJ_LIKELY(gct == ~LJ_TTHREAD)) {[m
[31m-    lua_State *th = gco2th(o);[m
[31m-    setgcrefr(th->gclist, g->gc.grayagain);[m
[31m-    setgcref(g->gc.grayagain, o);[m
[31m-    black2gray(o);  /* Threads are never black. */[m
[31m-    gc_traverse_thread(g, th);[m
[31m-    return sizeof(lua_State) + sizeof(TValue) * th->stacksize;[m
[31m-  } else {[m
[31m-#if LJ_HASJIT[m
[31m-    GCtrace *T = gco2trace(o);[m
[31m-    gc_traverse_trace(g, T);[m
[31m-    return ((sizeof(GCtrace)+7)&~7) + (T->nins-T->nk)*sizeof(IRIns) +[m
[31m-	   T->nsnap*sizeof(SnapShot) + T->nsnapmap*sizeof(SnapEntry);[m
[31m-#else[m
[31m-    lua_assert(0);[m
[31m-    return 0;[m
[31m-#endif[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Propagate all gray objects. */[m
[31m-static size_t gc_propagate_gray(global_State *g)[m
[31m-{[m
[31m-  size_t m = 0;[m
[31m-  while (gcref(g->gc.gray) != NULL)[m
[31m-    m += propagatemark(g);[m
[31m-  return m;[m
[31m-}[m
[31m-[m
[31m-/* -- Sweep phase --------------------------------------------------------- */[m
[31m-[m
[31m-/* Type of GC free functions. */[m
[31m-typedef void (LJ_FASTCALL *GCFreeFunc)(global_State *g, GCobj *o);[m
[31m-[m
[31m-/* GC free functions for LJ_TSTR .. LJ_TUDATA. ORDER LJ_T */[m
[31m-static const GCFreeFunc gc_freefunc[] = {[m
[31m-  (GCFreeFunc)lj_str_free,[m
[31m-  (GCFreeFunc)lj_func_freeuv,[m
[31m-  (GCFreeFunc)lj_state_free,[m
[31m-  (GCFreeFunc)lj_func_freeproto,[m
[31m-  (GCFreeFunc)lj_func_free,[m
[31m-#if LJ_HASJIT[m
[31m-  (GCFreeFunc)lj_trace_free,[m
[31m-#else[m
[31m-  (GCFreeFunc)0,[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-  (GCFreeFunc)lj_cdata_free,[m
[31m-#else[m
[31m-  (GCFreeFunc)0,[m
[31m-#endif[m
[31m-  (GCFreeFunc)lj_tab_free,[m
[31m-  (GCFreeFunc)lj_udata_free[m
[31m-};[m
[31m-[m
[31m-/* Full sweep of a GC list. */[m
[31m-#define gc_fullsweep(g, p)	gc_sweep(g, (p), ~(uint32_t)0)[m
[31m-[m
[31m-/* Partial sweep of a GC list. */[m
[31m-static GCRef *gc_sweep(global_State *g, GCRef *p, uint32_t lim)[m
[31m-{[m
[31m-  /* Mask with other white and LJ_GC_FIXED. Or LJ_GC_SFIXED on shutdown. */[m
[31m-  int ow = otherwhite(g);[m
[31m-  GCobj *o;[m
[31m-  while ((o = gcref(*p)) != NULL && lim-- > 0) {[m
[31m-    if (o->gch.gct == ~LJ_TTHREAD)  /* Need to sweep open upvalues, too. */[m
[31m-      gc_fullsweep(g, &gco2th(o)->openupval);[m
[31m-    if (((o->gch.marked ^ LJ_GC_WHITES) & ow)) {  /* Black or current white? */[m
[31m-      lua_assert(!isdead(g, o) || (o->gch.marked & LJ_GC_FIXED));[m
[31m-      makewhite(g, o);  /* Value is alive, change to the current white. */[m
[31m-      p = &o->gch.nextgc;[m
[31m-    } else {  /* Otherwise value is dead, free it. */[m
[31m-      lua_assert(isdead(g, o) || ow == LJ_GC_SFIXED);[m
[31m-      setgcrefr(*p, o->gch.nextgc);[m
[31m-      if (o == gcref(g->gc.root))[m
[31m-	setgcrefr(g->gc.root, o->gch.nextgc);  /* Adjust list anchor. */[m
[31m-      gc_freefunc[o->gch.gct - ~LJ_TSTR](g, o);[m
[31m-    }[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Check whether we can clear a key or a value slot from a table. */[m
[31m-static int gc_mayclear(cTValue *o, int val)[m
[31m-{[m
[31m-  if (tvisgcv(o)) {  /* Only collectable objects can be weak references. */[m
[31m-    if (tvisstr(o)) {  /* But strings cannot be used as weak references. */[m
[31m-      gc_mark_str(strV(o));  /* And need to be marked. */[m
[31m-      return 0;[m
[31m-    }[m
[31m-    if (iswhite(gcV(o)))[m
[31m-      return 1;  /* Object is about to be collected. */[m
[31m-    if (tvisudata(o) && val && isfinalized(udataV(o)))[m
[31m-      return 1;  /* Finalized userdata is dropped only from values. */[m
[31m-  }[m
[31m-  return 0;  /* Cannot clear. */[m
[31m-}[m
[31m-[m
[31m-/* Clear collected entries from weak tables. */[m
[31m-static void gc_clearweak(GCobj *o)[m
[31m-{[m
[31m-  while (o) {[m
[31m-    GCtab *t = gco2tab(o);[m
[31m-    lua_assert((t->marked & LJ_GC_WEAK));[m
[31m-    if ((t->marked & LJ_GC_WEAKVAL)) {[m
[31m-      MSize i, asize = t->asize;[m
[31m-      for (i = 0; i < asize; i++) {[m
[31m-	/* Clear array slot when value is about to be collected. */[m
[31m-	TValue *tv = arrayslot(t, i);[m
[31m-	if (gc_mayclear(tv, 1))[m
[31m-	  setnilV(tv);[m
[31m-      }[m
[31m-    }[m
[31m-    if (t->hmask > 0) {[m
[31m-      Node *node = noderef(t->node);[m
[31m-      MSize i, hmask = t->hmask;[m
[31m-      for (i = 0; i <= hmask; i++) {[m
[31m-	Node *n = &node[i];[m
[31m-	/* Clear hash slot when key or value is about to be collected. */[m
[31m-	if (!tvisnil(&n->val) && (gc_mayclear(&n->key, 0) ||[m
[31m-				  gc_mayclear(&n->val, 1)))[m
[31m-	  setnilV(&n->val);[m
[31m-      }[m
[31m-    }[m
[31m-    o = gcref(t->gclist);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Call a userdata or cdata finalizer. */[m
[31m-static void gc_call_finalizer(global_State *g, lua_State *L,[m
[31m-			      cTValue *mo, GCobj *o)[m
[31m-{[m
[31m-  /* Save and restore lots of state around the __gc callback. */[m
[31m-  uint8_t oldh = hook_save(g);[m
[31m-  GCSize oldt = g->gc.threshold;[m
[31m-  int errcode;[m
[31m-  TValue *top;[m
[31m-  lj_trace_abort(g);[m
[31m-  hook_entergc(g);  /* Disable hooks and new traces during __gc. */[m
[31m-  g->gc.threshold = LJ_MAX_MEM;  /* Prevent GC steps. */[m
[31m-  top = L->top;[m
[31m-  copyTV(L, top++, mo);[m
[31m-  if (LJ_FR2) setnilV(top++);[m
[31m-  setgcV(L, top, o, ~o->gch.gct);[m
[31m-  L->top = top+1;[m
[31m-  errcode = lj_vm_pcall(L, top, 1+0, -1);  /* Stack: |mo|o| -> | */[m
[31m-  hook_restore(g, oldh);[m
[31m-  g->gc.threshold = oldt;  /* Restore GC threshold. */[m
[31m-  if (errcode)[m
[31m-    lj_err_throw(L, errcode);  /* Propagate errors. */[m
[31m-}[m
[31m-[m
[31m-/* Finalize one userdata or cdata object from the mmudata list. */[m
[31m-static void gc_finalize(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCobj *o = gcnext(gcref(g->gc.mmudata));[m
[31m-  cTValue *mo;[m
[31m-  lua_assert(tvref(g->jit_base) == NULL);  /* Must not be called on trace. */[m
[31m-  /* Unchain from list of userdata to be finalized. */[m
[31m-  if (o == gcref(g->gc.mmudata))[m
[31m-    setgcrefnull(g->gc.mmudata);[m
[31m-  else[m
[31m-    setgcrefr(gcref(g->gc.mmudata)->gch.nextgc, o->gch.nextgc);[m
[31m-#if LJ_HASFFI[m
[31m-  if (o->gch.gct == ~LJ_TCDATA) {[m
[31m-    TValue tmp, *tv;[m
[31m-    /* Add cdata back to the GC list and make it white. */[m
[31m-    setgcrefr(o->gch.nextgc, g->gc.root);[m
[31m-    setgcref(g->gc.root, o);[m
[31m-    makewhite(g, o);[m
[31m-    o->gch.marked &= (uint8_t)~LJ_GC_CDATA_FIN;[m
[31m-    /* Resolve finalizer. */[m
[31m-    setcdataV(L, &tmp, gco2cd(o));[m
[31m-    tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp);[m
[31m-    if (!tvisnil(tv)) {[m
[31m-      g->gc.nocdatafin = 0;[m
[31m-      copyTV(L, &tmp, tv);[m
[31m-      setnilV(tv);  /* Clear entry in finalizer table. */[m
[31m-      gc_call_finalizer(g, L, &tmp, o);[m
[31m-    }[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  /* Add userdata back to the main userdata list and make it white. */[m
[31m-  setgcrefr(o->gch.nextgc, mainthread(g)->nextgc);[m
[31m-  setgcref(mainthread(g)->nextgc, o);[m
[31m-  makewhite(g, o);[m
[31m-  /* Resolve the __gc metamethod. */[m
[31m-  mo = lj_meta_fastg(g, tabref(gco2ud(o)->metatable), MM_gc);[m
[31m-  if (mo)[m
[31m-    gc_call_finalizer(g, L, mo, o);[m
[31m-}[m
[31m-[m
[31m-/* Finalize all userdata objects from mmudata list. */[m
[31m-void lj_gc_finalize_udata(lua_State *L)[m
[31m-{[m
[31m-  while (gcref(G(L)->gc.mmudata) != NULL)[m
[31m-    gc_finalize(L);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Finalize all cdata objects from finalizer table. */[m
[31m-void lj_gc_finalize_cdata(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  CTState *cts = ctype_ctsG(g);[m
[31m-  if (cts) {[m
[31m-    GCtab *t = cts->finalizer;[m
[31m-    Node *node = noderef(t->node);[m
[31m-    ptrdiff_t i;[m
[31m-    setgcrefnull(t->metatable);  /* Mark finalizer table as disabled. */[m
[31m-    for (i = (ptrdiff_t)t->hmask; i >= 0; i--)[m
[31m-      if (!tvisnil(&node[i].val) && tviscdata(&node[i].key)) {[m
[31m-	GCobj *o = gcV(&node[i].key);[m
[31m-	TValue tmp;[m
[31m-	makewhite(g, o);[m
[31m-	o->gch.marked &= (uint8_t)~LJ_GC_CDATA_FIN;[m
[31m-	copyTV(L, &tmp, &node[i].val);[m
[31m-	setnilV(&node[i].val);[m
[31m-	gc_call_finalizer(g, L, &tmp, o);[m
[31m-      }[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Free all remaining GC objects. */[m
[31m-void lj_gc_freeall(global_State *g)[m
[31m-{[m
[31m-  MSize i, strmask;[m
[31m-  /* Free everything, except super-fixed objects (the main thread). */[m
[31m-  g->gc.currentwhite = LJ_GC_WHITES | LJ_GC_SFIXED;[m
[31m-  gc_fullsweep(g, &g->gc.root);[m
[31m-  strmask = g->strmask;[m
[31m-  for (i = 0; i <= strmask; i++)  /* Free all string hash chains. */[m
[31m-    gc_fullsweep(g, &g->strhash[i]);[m
[31m-}[m
[31m-[m
[31m-/* -- Collector ----------------------------------------------------------- */[m
[31m-[m
[31m-/* Atomic part of the GC cycle, transitioning from mark to sweep phase. */[m
[31m-static void atomic(global_State *g, lua_State *L)[m
[31m-{[m
[31m-  size_t udsize;[m
[31m-[m
[31m-  gc_mark_uv(g);  /* Need to remark open upvalues (the thread may be dead). */[m
[31m-  gc_propagate_gray(g);  /* Propagate any left-overs. */[m
[31m-[m
[31m-  setgcrefr(g->gc.gray, g->gc.weak);  /* Empty the list of weak tables. */[m
[31m-  setgcrefnull(g->gc.weak);[m
[31m-  lua_assert(!iswhite(obj2gco(mainthread(g))));[m
[31m-  gc_markobj(g, L);  /* Mark running thread. */[m
[31m-  gc_traverse_curtrace(g);  /* Traverse current trace. */[m
[31m-  gc_mark_gcroot(g);  /* Mark GC roots (again). */[m
[31m-  gc_propagate_gray(g);  /* Propagate all of the above. */[m
[31m-[m
[31m-  setgcrefr(g->gc.gray, g->gc.grayagain);  /* Empty the 2nd chance list. */[m
[31m-  setgcrefnull(g->gc.grayagain);[m
[31m-  gc_propagate_gray(g);  /* Propagate it. */[m
[31m-[m
[31m-  udsize = lj_gc_separateudata(g, 0);  /* Separate userdata to be finalized. */[m
[31m-  gc_mark_mmudata(g);  /* Mark them. */[m
[31m-  udsize += gc_propagate_gray(g);  /* And propagate the marks. */[m
[31m-[m
[31m-  /* All marking done, clear weak tables. */[m
[31m-  gc_clearweak(gcref(g->gc.weak));[m
[31m-[m
[31m-  lj_buf_shrink(L, &g->tmpbuf);  /* Shrink temp buffer. */[m
[31m-[m
[31m-  /* Prepare for sweep phase. */[m
[31m-  g->gc.currentwhite = (uint8_t)otherwhite(g);  /* Flip current white. */[m
[31m-  g->strempty.marked = g->gc.currentwhite;[m
[31m-  setmref(g->gc.sweep, &g->gc.root);[m
[31m-  g->gc.estimate = g->gc.total - (GCSize)udsize;  /* Initial estimate. */[m
[31m-}[m
[31m-[m
[31m-/* GC state machine. Returns a cost estimate for each step performed. */[m
[31m-static size_t gc_onestep(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  switch (g->gc.state) {[m
[31m-  case GCSpause:[m
[31m-    gc_mark_start(g);  /* Start a new GC cycle by marking all GC roots. */[m
[31m-    return 0;[m
[31m-  case GCSpropagate:[m
[31m-    if (gcref(g->gc.gray) != NULL)[m
[31m-      return propagatemark(g);  /* Propagate one gray object. */[m
[31m-    g->gc.state = GCSatomic;  /* End of mark phase. */[m
[31m-    return 0;[m
[31m-  case GCSatomic:[m
[31m-    if (tvref(g->jit_base))  /* Don't run atomic phase on trace. */[m
[31m-      return LJ_MAX_MEM;[m
[31m-    atomic(g, L);[m
[31m-    g->gc.state = GCSsweepstring;  /* Start of sweep phase. */[m
[31m-    g->gc.sweepstr = 0;[m
[31m-    return 0;[m
[31m-  case GCSsweepstring: {[m
[31m-    GCSize old = g->gc.total;[m
[31m-    gc_fullsweep(g, &g->strhash[g->gc.sweepstr++]);  /* Sweep one chain. */[m
[31m-    if (g->gc.sweepstr > g->strmask)[m
[31m-      g->gc.state = GCSsweep;  /* All string hash chains sweeped. */[m
[31m-    lua_assert(old >= g->gc.total);[m
[31m-    g->gc.estimate -= old - g->gc.total;[m
[31m-    return GCSWEEPCOST;[m
[31m-    }[m
[31m-  case GCSsweep: {[m
[31m-    GCSize old = g->gc.total;[m
[31m-    setmref(g->gc.sweep, gc_sweep(g, mref(g->gc.sweep, GCRef), GCSWEEPMAX));[m
[31m-    lua_assert(old >= g->gc.total);[m
[31m-    g->gc.estimate -= old - g->gc.total;[m
[31m-    if (gcref(*mref(g->gc.sweep, GCRef)) == NULL) {[m
[31m-      if (g->strnum <= (g->strmask >> 2) && g->strmask > LJ_MIN_STRTAB*2-1)[m
[31m-	lj_str_resize(L, g->strmask >> 1);  /* Shrink string table. */[m
[31m-      if (gcref(g->gc.mmudata)) {  /* Need any finalizations? */[m
[31m-	g->gc.state = GCSfinalize;[m
[31m-#if LJ_HASFFI[m
[31m-	g->gc.nocdatafin = 1;[m
[31m-#endif[m
[31m-      } else {  /* Otherwise skip this phase to help the JIT. */[m
[31m-	g->gc.state = GCSpause;  /* End of GC cycle. */[m
[31m-	g->gc.debt = 0;[m
[31m-      }[m
[31m-    }[m
[31m-    return GCSWEEPMAX*GCSWEEPCOST;[m
[31m-    }[m
[31m-  case GCSfinalize:[m
[31m-    if (gcref(g->gc.mmudata) != NULL) {[m
[31m-      if (tvref(g->jit_base))  /* Don't call finalizers on trace. */[m
[31m-	return LJ_MAX_MEM;[m
[31m-      gc_finalize(L);  /* Finalize one userdata object. */[m
[31m-      if (g->gc.estimate > GCFINALIZECOST)[m
[31m-	g->gc.estimate -= GCFINALIZECOST;[m
[31m-      return GCFINALIZECOST;[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (!g->gc.nocdatafin) lj_tab_rehash(L, ctype_ctsG(g)->finalizer);[m
[31m-#endif[m
[31m-    g->gc.state = GCSpause;  /* End of GC cycle. */[m
[31m-    g->gc.debt = 0;[m
[31m-    return 0;[m
[31m-  default:[m
[31m-    lua_assert(0);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Perform a limited amount of incremental GC steps. */[m
[31m-int LJ_FASTCALL lj_gc_step(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCSize lim;[m
[31m-  int32_t ostate = g->vmstate;[m
[31m-  setvmstate(g, GC);[m
[31m-  lim = (GCSTEPSIZE/100) * g->gc.stepmul;[m
[31m-  if (lim == 0)[m
[31m-    lim = LJ_MAX_MEM;[m
[31m-  if (g->gc.total > g->gc.threshold)[m
[31m-    g->gc.debt += g->gc.total - g->gc.threshold;[m
[31m-  do {[m
[31m-    lim -= (GCSize)gc_onestep(L);[m
[31m-    if (g->gc.state == GCSpause) {[m
[31m-      g->gc.threshold = (g->gc.estimate/100) * g->gc.pause;[m
[31m-      g->vmstate = ostate;[m
[31m-      return 1;  /* Finished a GC cycle. */[m
[31m-    }[m
[31m-  } while (sizeof(lim) == 8 ? ((int64_t)lim > 0) : ((int32_t)lim > 0));[m
[31m-  if (g->gc.debt < GCSTEPSIZE) {[m
[31m-    g->gc.threshold = g->gc.total + GCSTEPSIZE;[m
[31m-    g->vmstate = ostate;[m
[31m-    return -1;[m
[31m-  } else {[m
[31m-    g->gc.debt -= GCSTEPSIZE;[m
[31m-    g->gc.threshold = g->gc.total;[m
[31m-    g->vmstate = ostate;[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Ditto, but fix the stack top first. */[m
[31m-void LJ_FASTCALL lj_gc_step_fixtop(lua_State *L)[m
[31m-{[m
[31m-  if (curr_funcisL(L)) L->top = curr_topL(L);[m
[31m-  lj_gc_step(L);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Perform multiple GC steps. Called from JIT-compiled code. */[m
[31m-int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps)[m
[31m-{[m
[31m-  lua_State *L = gco2th(gcref(g->cur_L));[m
[31m-  L->base = tvref(G(L)->jit_base);[m
[31m-  L->top = curr_topL(L);[m
[31m-  while (steps-- > 0 && lj_gc_step(L) == 0)[m
[31m-    ;[m
[31m-  /* Return 1 to force a trace exit. */[m
[31m-  return (G(L)->gc.state == GCSatomic || G(L)->gc.state == GCSfinalize);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Perform a full GC cycle. */[m
[31m-void lj_gc_fullgc(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  int32_t ostate = g->vmstate;[m
[31m-  setvmstate(g, GC);[m
[31m-  if (g->gc.state <= GCSatomic) {  /* Caught somewhere in the middle. */[m
[31m-    setmref(g->gc.sweep, &g->gc.root);  /* Sweep everything (preserving it). */[m
[31m-    setgcrefnull(g->gc.gray);  /* Reset lists from partial propagation. */[m
[31m-    setgcrefnull(g->gc.grayagain);[m
[31m-    setgcrefnull(g->gc.weak);[m
[31m-    g->gc.state = GCSsweepstring;  /* Fast forward to the sweep phase. */[m
[31m-    g->gc.sweepstr = 0;[m
[31m-  }[m
[31m-  while (g->gc.state == GCSsweepstring || g->gc.state == GCSsweep)[m
[31m-    gc_onestep(L);  /* Finish sweep. */[m
[31m-  lua_assert(g->gc.state == GCSfinalize || g->gc.state == GCSpause);[m
[31m-  /* Now perform a full GC. */[m
[31m-  g->gc.state = GCSpause;[m
[31m-  do { gc_onestep(L); } while (g->gc.state != GCSpause);[m
[31m-  g->gc.threshold = (g->gc.estimate/100) * g->gc.pause;[m
[31m-  g->vmstate = ostate;[m
[31m-}[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-/* Move the GC propagation frontier forward. */[m
[31m-void lj_gc_barrierf(global_State *g, GCobj *o, GCobj *v)[m
[31m-{[m
[31m-  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));[m
[31m-  lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause);[m
[31m-  lua_assert(o->gch.gct != ~LJ_TTAB);[m
[31m-  /* Preserve invariant during propagation. Otherwise it doesn't matter. */[m
[31m-  if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic)[m
[31m-    gc_mark(g, v);  /* Move frontier forward. */[m
[31m-  else[m
[31m-    makewhite(g, o);  /* Make it white to avoid the following barrier. */[m
[31m-}[m
[31m-[m
[31m-/* Specialized barrier for closed upvalue. Pass &uv->tv. */[m
[31m-void LJ_FASTCALL lj_gc_barrieruv(global_State *g, TValue *tv)[m
[31m-{[m
[31m-#define TV2MARKED(x) \[m
[31m-  (*((uint8_t *)(x) - offsetof(GCupval, tv) + offsetof(GCupval, marked)))[m
[31m-  if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic)[m
[31m-    gc_mark(g, gcV(tv));[m
[31m-  else[m
[31m-    TV2MARKED(tv) = (TV2MARKED(tv) & (uint8_t)~LJ_GC_COLORS) | curwhite(g);[m
[31m-#undef TV2MARKED[m
[31m-}[m
[31m-[m
[31m-/* Close upvalue. Also needs a write barrier. */[m
[31m-void lj_gc_closeuv(global_State *g, GCupval *uv)[m
[31m-{[m
[31m-  GCobj *o = obj2gco(uv);[m
[31m-  /* Copy stack slot to upvalue itself and point to the copy. */[m
[31m-  copyTV(mainthread(g), &uv->tv, uvval(uv));[m
[31m-  setmref(uv->v, &uv->tv);[m
[31m-  uv->closed = 1;[m
[31m-  setgcrefr(o->gch.nextgc, g->gc.root);[m
[31m-  setgcref(g->gc.root, o);[m
[31m-  if (isgray(o)) {  /* A closed upvalue is never gray, so fix this. */[m
[31m-    if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) {[m
[31m-      gray2black(o);  /* Make it black and preserve invariant. */[m
[31m-      if (tviswhite(&uv->tv))[m
[31m-	lj_gc_barrierf(g, o, gcV(&uv->tv));[m
[31m-    } else {[m
[31m-      makewhite(g, o);  /* Make it white, i.e. sweep the upvalue. */[m
[31m-      lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Mark a trace if it's saved during the propagation phase. */[m
[31m-void lj_gc_barriertrace(global_State *g, uint32_t traceno)[m
[31m-{[m
[31m-  if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic)[m
[31m-    gc_marktrace(g, traceno);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Allocator ----------------------------------------------------------- */[m
[31m-[m
[31m-/* Call pluggable memory allocator to allocate or resize a fragment. */[m
[31m-void *lj_mem_realloc(lua_State *L, void *p, GCSize osz, GCSize nsz)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lua_assert((osz == 0) == (p == NULL));[m
[31m-  p = g->allocf(g->allocd, p, osz, nsz);[m
[31m-  if (p == NULL && nsz > 0)[m
[31m-    lj_err_mem(L);[m
[31m-  lua_assert((nsz == 0) == (p == NULL));[m
[31m-  lua_assert(checkptrGC(p));[m
[31m-  g->gc.total = (g->gc.total - osz) + nsz;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Allocate new GC object and link it to the root set. */[m
[31m-void * LJ_FASTCALL lj_mem_newgco(lua_State *L, GCSize size)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCobj *o = (GCobj *)g->allocf(g->allocd, NULL, 0, size);[m
[31m-  if (o == NULL)[m
[31m-    lj_err_mem(L);[m
[31m-  lua_assert(checkptrGC(o));[m
[31m-  g->gc.total += size;[m
[31m-  setgcrefr(o->gch.nextgc, g->gc.root);[m
[31m-  setgcref(g->gc.root, o);[m
[31m-  newwhite(g, o);[m
[31m-  return o;[m
[31m-}[m
[31m-[m
[31m-/* Resize growable vector. */[m
[31m-void *lj_mem_grow(lua_State *L, void *p, MSize *szp, MSize lim, MSize esz)[m
[31m-{[m
[31m-  MSize sz = (*szp) << 1;[m
[31m-  if (sz < LJ_MIN_VECSZ)[m
[31m-    sz = LJ_MIN_VECSZ;[m
[31m-  if (sz > lim)[m
[31m-    sz = lim;[m
[31m-  p = lj_mem_realloc(L, p, (*szp)*esz, sz*esz);[m
[31m-  *szp = sz;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.h[m
[1mdeleted file mode 100644[m
[1mindex eee09af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gc.h[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-/*[m
[31m-** Garbage collector.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_GC_H[m
[31m-#define _LJ_GC_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Garbage collector states. Order matters. */[m
[31m-enum {[m
[31m-  GCSpause, GCSpropagate, GCSatomic, GCSsweepstring, GCSsweep, GCSfinalize[m
[31m-};[m
[31m-[m
[31m-/* Bitmasks for marked field of GCobj. */[m
[31m-#define LJ_GC_WHITE0	0x01[m
[31m-#define LJ_GC_WHITE1	0x02[m
[31m-#define LJ_GC_BLACK	0x04[m
[31m-#define LJ_GC_FINALIZED	0x08[m
[31m-#define LJ_GC_WEAKKEY	0x08[m
[31m-#define LJ_GC_WEAKVAL	0x10[m
[31m-#define LJ_GC_CDATA_FIN	0x10[m
[31m-#define LJ_GC_FIXED	0x20[m
[31m-#define LJ_GC_SFIXED	0x40[m
[31m-[m
[31m-#define LJ_GC_WHITES	(LJ_GC_WHITE0 | LJ_GC_WHITE1)[m
[31m-#define LJ_GC_COLORS	(LJ_GC_WHITES | LJ_GC_BLACK)[m
[31m-#define LJ_GC_WEAK	(LJ_GC_WEAKKEY | LJ_GC_WEAKVAL)[m
[31m-[m
[31m-/* Macros to test and set GCobj colors. */[m
[31m-#define iswhite(x)	((x)->gch.marked & LJ_GC_WHITES)[m
[31m-#define isblack(x)	((x)->gch.marked & LJ_GC_BLACK)[m
[31m-#define isgray(x)	(!((x)->gch.marked & (LJ_GC_BLACK|LJ_GC_WHITES)))[m
[31m-#define tviswhite(x)	(tvisgcv(x) && iswhite(gcV(x)))[m
[31m-#define otherwhite(g)	(g->gc.currentwhite ^ LJ_GC_WHITES)[m
[31m-#define isdead(g, v)	((v)->gch.marked & otherwhite(g) & LJ_GC_WHITES)[m
[31m-[m
[31m-#define curwhite(g)	((g)->gc.currentwhite & LJ_GC_WHITES)[m
[31m-#define newwhite(g, x)	(obj2gco(x)->gch.marked = (uint8_t)curwhite(g))[m
[31m-#define makewhite(g, x) \[m
[31m-  ((x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g))[m
[31m-#define flipwhite(x)	((x)->gch.marked ^= LJ_GC_WHITES)[m
[31m-#define black2gray(x)	((x)->gch.marked &= (uint8_t)~LJ_GC_BLACK)[m
[31m-#define fixstring(s)	((s)->marked |= LJ_GC_FIXED)[m
[31m-#define markfinalized(x)	((x)->gch.marked |= LJ_GC_FINALIZED)[m
[31m-[m
[31m-/* Collector. */[m
[31m-LJ_FUNC size_t lj_gc_separateudata(global_State *g, int all);[m
[31m-LJ_FUNC void lj_gc_finalize_udata(lua_State *L);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC void lj_gc_finalize_cdata(lua_State *L);[m
[31m-#else[m
[31m-#define lj_gc_finalize_cdata(L)		UNUSED(L)[m
[31m-#endif[m
[31m-LJ_FUNC void lj_gc_freeall(global_State *g);[m
[31m-LJ_FUNCA int LJ_FASTCALL lj_gc_step(lua_State *L);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_gc_step_fixtop(lua_State *L);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps);[m
[31m-#endif[m
[31m-LJ_FUNC void lj_gc_fullgc(lua_State *L);[m
[31m-[m
[31m-/* GC check: drive collector forward if the GC threshold has been reached. */[m
[31m-#define lj_gc_check(L) \[m
[31m-  { if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) \[m
[31m-      lj_gc_step(L); }[m
[31m-#define lj_gc_check_fixtop(L) \[m
[31m-  { if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) \[m
[31m-      lj_gc_step_fixtop(L); }[m
[31m-[m
[31m-/* Write barriers. */[m
[31m-LJ_FUNC void lj_gc_barrierf(global_State *g, GCobj *o, GCobj *v);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_gc_barrieruv(global_State *g, TValue *tv);[m
[31m-LJ_FUNC void lj_gc_closeuv(global_State *g, GCupval *uv);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC void lj_gc_barriertrace(global_State *g, uint32_t traceno);[m
[31m-#endif[m
[31m-[m
[31m-/* Move the GC propagation frontier back for tables (make it gray again). */[m
[31m-static LJ_AINLINE void lj_gc_barrierback(global_State *g, GCtab *t)[m
[31m-{[m
[31m-  GCobj *o = obj2gco(t);[m
[31m-  lua_assert(isblack(o) && !isdead(g, o));[m
[31m-  lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause);[m
[31m-  black2gray(o);[m
[31m-  setgcrefr(t->gclist, g->gc.grayagain);[m
[31m-  setgcref(g->gc.grayagain, o);[m
[31m-}[m
[31m-[m
[31m-/* Barrier for stores to table objects. TValue and GCobj variant. */[m
[31m-#define lj_gc_anybarriert(L, t)  \[m
[31m-  { if (LJ_UNLIKELY(isblack(obj2gco(t)))) lj_gc_barrierback(G(L), (t)); }[m
[31m-#define lj_gc_barriert(L, t, tv) \[m
[31m-  { if (tviswhite(tv) && isblack(obj2gco(t))) \[m
[31m-      lj_gc_barrierback(G(L), (t)); }[m
[31m-#define lj_gc_objbarriert(L, t, o)  \[m
[31m-  { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) \[m
[31m-      lj_gc_barrierback(G(L), (t)); }[m
[31m-[m
[31m-/* Barrier for stores to any other object. TValue and GCobj variant. */[m
[31m-#define lj_gc_barrier(L, p, tv) \[m
[31m-  { if (tviswhite(tv) && isblack(obj2gco(p))) \[m
[31m-      lj_gc_barrierf(G(L), obj2gco(p), gcV(tv)); }[m
[31m-#define lj_gc_objbarrier(L, p, o) \[m
[31m-  { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \[m
[31m-      lj_gc_barrierf(G(L), obj2gco(p), obj2gco(o)); }[m
[31m-[m
[31m-/* Allocator. */[m
[31m-LJ_FUNC void *lj_mem_realloc(lua_State *L, void *p, GCSize osz, GCSize nsz);[m
[31m-LJ_FUNC void * LJ_FASTCALL lj_mem_newgco(lua_State *L, GCSize size);[m
[31m-LJ_FUNC void *lj_mem_grow(lua_State *L, void *p,[m
[31m-			  MSize *szp, MSize lim, MSize esz);[m
[31m-[m
[31m-#define lj_mem_new(L, s)	lj_mem_realloc(L, NULL, 0, (s))[m
[31m-[m
[31m-static LJ_AINLINE void lj_mem_free(global_State *g, void *p, size_t osize)[m
[31m-{[m
[31m-  g->gc.total -= (GCSize)osize;[m
[31m-  g->allocf(g->allocd, p, osize, 0);[m
[31m-}[m
[31m-[m
[31m-#define lj_mem_newvec(L, n, t)	((t *)lj_mem_new(L, (GCSize)((n)*sizeof(t))))[m
[31m-#define lj_mem_reallocvec(L, p, on, n, t) \[m
[31m-  ((p) = (t *)lj_mem_realloc(L, p, (on)*sizeof(t), (GCSize)((n)*sizeof(t))))[m
[31m-#define lj_mem_growvec(L, p, n, m, t) \[m
[31m-  ((p) = (t *)lj_mem_grow(L, (p), &(n), (m), (MSize)sizeof(t)))[m
[31m-#define lj_mem_freevec(g, p, n, t)	lj_mem_free(g, (p), (n)*sizeof(t))[m
[31m-[m
[31m-#define lj_mem_newobj(L, t)	((t *)lj_mem_newgco(L, sizeof(t)))[m
[31m-#define lj_mem_newt(L, s, t)	((t *)lj_mem_new(L, (s)))[m
[31m-#define lj_mem_freet(g, p)	lj_mem_free(g, (p), sizeof(*(p)))[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.c[m
[1mdeleted file mode 100644[m
[1mindex 8b72be7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.c[m
[1m+++ /dev/null[m
[36m@@ -1,805 +0,0 @@[m
[31m-/*[m
[31m-** Client for the GDB JIT API.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_gdbjit_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-[m
[31m-/* This is not compiled in by default.[m
[31m-** Enable with -DLUAJIT_USE_GDBJIT in the Makefile and recompile everything.[m
[31m-*/[m
[31m-#ifdef LUAJIT_USE_GDBJIT[m
[31m-[m
[31m-/* The GDB JIT API allows JIT compilers to pass debug information about[m
[31m-** JIT-compiled code back to GDB. You need at least GDB 7.0 or higher[m
[31m-** to see it in action.[m
[31m-**[m
[31m-** This is a passive API, so it works even when not running under GDB[m
[31m-** or when attaching to an already running process. Alas, this implies[m
[31m-** enabling it always has a non-negligible overhead -- do not use in[m
[31m-** release mode![m
[31m-**[m
[31m-** The LuaJIT GDB JIT client is rather minimal at the moment. It gives[m
[31m-** each trace a symbol name and adds a source location and frame unwind[m
[31m-** information. Obviously LuaJIT itself and any embedding C application[m
[31m-** should be compiled with debug symbols, too (see the Makefile).[m
[31m-**[m
[31m-** Traces are named TRACE_1, TRACE_2, ... these correspond to the trace[m
[31m-** numbers from -jv or -jdump. Use "break TRACE_1" or "tbreak TRACE_1" etc.[m
[31m-** to set breakpoints on specific traces (even ahead of their creation).[m
[31m-**[m
[31m-** The source location for each trace allows listing the corresponding[m
[31m-** source lines with the GDB command "list" (but only if the Lua source[m
[31m-** has been loaded from a file). Currently this is always set to the[m
[31m-** location where the trace has been started.[m
[31m-**[m
[31m-** Frame unwind information can be inspected with the GDB command[m
[31m-** "info frame". This also allows proper backtraces across JIT-compiled[m
[31m-** code with the GDB command "bt".[m
[31m-**[m
[31m-** You probably want to add the following settings to a .gdbinit file[m
[31m-** (or add them to ~/.gdbinit):[m
[31m-**   set disassembly-flavor intel[m
[31m-**   set breakpoint pending on[m
[31m-**[m
[31m-** Here's a sample GDB session:[m
[31m-** ------------------------------------------------------------------------[m
[31m-[m
[31m-$ cat >x.lua[m
[31m-for outer=1,100 do[m
[31m-  for inner=1,100 do end[m
[31m-end[m
[31m-^D[m
[31m-[m
[31m-$ luajit -jv x.lua[m
[31m-[TRACE   1 x.lua:2][m
[31m-[TRACE   2 (1/3) x.lua:1 -> 1][m
[31m-[m
[31m-$ gdb --quiet --args luajit x.lua[m
[31m-(gdb) tbreak TRACE_1[m
[31m-Function "TRACE_1" not defined.[m
[31m-Temporary breakpoint 1 (TRACE_1) pending.[m
[31m-(gdb) run[m
[31m-Starting program: luajit x.lua[m
[31m-[m
[31m-Temporary breakpoint 1, TRACE_1 () at x.lua:2[m
[31m-2	  for inner=1,100 do end[m
[31m-(gdb) list[m
[31m-1	for outer=1,100 do[m
[31m-2	  for inner=1,100 do end[m
[31m-3	end[m
[31m-(gdb) bt[m
[31m-#0  TRACE_1 () at x.lua:2[m
[31m-#1  0x08053690 in lua_pcall [...][m
[31m-[...][m
[31m-#7  0x0806ff90 in main [...][m
[31m-(gdb) disass TRACE_1[m
[31m-Dump of assembler code for function TRACE_1:[m
[31m-0xf7fd9fba <TRACE_1+0>:	mov    DWORD PTR ds:0xf7e0e2a0,0x1[m
[31m-0xf7fd9fc4 <TRACE_1+10>:	movsd  xmm7,QWORD PTR [edx+0x20][m
[31m-[...][m
[31m-0xf7fd9ff8 <TRACE_1+62>:	jmp    0xf7fd2014[m
[31m-End of assembler dump.[m
[31m-(gdb) tbreak TRACE_2[m
[31m-Function "TRACE_2" not defined.[m
[31m-Temporary breakpoint 2 (TRACE_2) pending.[m
[31m-(gdb) cont[m
[31m-Continuing.[m
[31m-[m
[31m-Temporary breakpoint 2, TRACE_2 () at x.lua:1[m
[31m-1	for outer=1,100 do[m
[31m-(gdb) info frame[m
[31m-Stack level 0, frame at 0xffffd7c0:[m
[31m- eip = 0xf7fd9f60 in TRACE_2 (x.lua:1); saved eip 0x8053690[m
[31m- called by frame at 0xffffd7e0[m
[31m- source language unknown.[m
[31m- Arglist at 0xffffd78c, args:[m
[31m- Locals at 0xffffd78c, Previous frame's sp is 0xffffd7c0[m
[31m- Saved registers:[m
[31m-  ebx at 0xffffd7ac, ebp at 0xffffd7b8, esi at 0xffffd7b0, edi at 0xffffd7b4,[m
[31m-  eip at 0xffffd7bc[m
[31m-(gdb)[m
[31m-[m
[31m-** ------------------------------------------------------------------------[m
[31m-*/[m
[31m-[m
[31m-/* -- GDB JIT API --------------------------------------------------------- */[m
[31m-[m
[31m-/* GDB JIT actions. */[m
[31m-enum {[m
[31m-  GDBJIT_NOACTION = 0,[m
[31m-  GDBJIT_REGISTER,[m
[31m-  GDBJIT_UNREGISTER[m
[31m-};[m
[31m-[m
[31m-/* GDB JIT entry. */[m
[31m-typedef struct GDBJITentry {[m
[31m-  struct GDBJITentry *next_entry;[m
[31m-  struct GDBJITentry *prev_entry;[m
[31m-  const char *symfile_addr;[m
[31m-  uint64_t symfile_size;[m
[31m-} GDBJITentry;[m
[31m-[m
[31m-/* GDB JIT descriptor. */[m
[31m-typedef struct GDBJITdesc {[m
[31m-  uint32_t version;[m
[31m-  uint32_t action_flag;[m
[31m-  GDBJITentry *relevant_entry;[m
[31m-  GDBJITentry *first_entry;[m
[31m-} GDBJITdesc;[m
[31m-[m
[31m-GDBJITdesc __jit_debug_descriptor = {[m
[31m-  1, GDBJIT_NOACTION, NULL, NULL[m
[31m-};[m
[31m-[m
[31m-/* GDB sets a breakpoint at this function. */[m
[31m-void LJ_NOINLINE __jit_debug_register_code()[m
[31m-{[m
[31m-  __asm__ __volatile__("");[m
[31m-};[m
[31m-[m
[31m-/* -- In-memory ELF object definitions ------------------------------------ */[m
[31m-[m
[31m-/* ELF definitions. */[m
[31m-typedef struct ELFheader {[m
[31m-  uint8_t emagic[4];[m
[31m-  uint8_t eclass;[m
[31m-  uint8_t eendian;[m
[31m-  uint8_t eversion;[m
[31m-  uint8_t eosabi;[m
[31m-  uint8_t eabiversion;[m
[31m-  uint8_t epad[7];[m
[31m-  uint16_t type;[m
[31m-  uint16_t machine;[m
[31m-  uint32_t version;[m
[31m-  uintptr_t entry;[m
[31m-  uintptr_t phofs;[m
[31m-  uintptr_t shofs;[m
[31m-  uint32_t flags;[m
[31m-  uint16_t ehsize;[m
[31m-  uint16_t phentsize;[m
[31m-  uint16_t phnum;[m
[31m-  uint16_t shentsize;[m
[31m-  uint16_t shnum;[m
[31m-  uint16_t shstridx;[m
[31m-} ELFheader;[m
[31m-[m
[31m-typedef struct ELFsectheader {[m
[31m-  uint32_t name;[m
[31m-  uint32_t type;[m
[31m-  uintptr_t flags;[m
[31m-  uintptr_t addr;[m
[31m-  uintptr_t ofs;[m
[31m-  uintptr_t size;[m
[31m-  uint32_t link;[m
[31m-  uint32_t info;[m
[31m-  uintptr_t align;[m
[31m-  uintptr_t entsize;[m
[31m-} ELFsectheader;[m
[31m-[m
[31m-#define ELFSECT_IDX_ABS		0xfff1[m
[31m-[m
[31m-enum {[m
[31m-  ELFSECT_TYPE_PROGBITS = 1,[m
[31m-  ELFSECT_TYPE_SYMTAB = 2,[m
[31m-  ELFSECT_TYPE_STRTAB = 3,[m
[31m-  ELFSECT_TYPE_NOBITS = 8[m
[31m-};[m
[31m-[m
[31m-#define ELFSECT_FLAGS_WRITE	1[m
[31m-#define ELFSECT_FLAGS_ALLOC	2[m
[31m-#define ELFSECT_FLAGS_EXEC	4[m
[31m-[m
[31m-typedef struct ELFsymbol {[m
[31m-#if LJ_64[m
[31m-  uint32_t name;[m
[31m-  uint8_t info;[m
[31m-  uint8_t other;[m
[31m-  uint16_t sectidx;[m
[31m-  uintptr_t value;[m
[31m-  uint64_t size;[m
[31m-#else[m
[31m-  uint32_t name;[m
[31m-  uintptr_t value;[m
[31m-  uint32_t size;[m
[31m-  uint8_t info;[m
[31m-  uint8_t other;[m
[31m-  uint16_t sectidx;[m
[31m-#endif[m
[31m-} ELFsymbol;[m
[31m-[m
[31m-enum {[m
[31m-  ELFSYM_TYPE_FUNC = 2,[m
[31m-  ELFSYM_TYPE_FILE = 4,[m
[31m-  ELFSYM_BIND_LOCAL = 0 << 4,[m
[31m-  ELFSYM_BIND_GLOBAL = 1 << 4,[m
[31m-};[m
[31m-[m
[31m-/* DWARF definitions. */[m
[31m-#define DW_CIE_VERSION	1[m
[31m-[m
[31m-enum {[m
[31m-  DW_CFA_nop = 0x0,[m
[31m-  DW_CFA_offset_extended = 0x5,[m
[31m-  DW_CFA_def_cfa = 0xc,[m
[31m-  DW_CFA_def_cfa_offset = 0xe,[m
[31m-  DW_CFA_offset_extended_sf = 0x11,[m
[31m-  DW_CFA_advance_loc = 0x40,[m
[31m-  DW_CFA_offset = 0x80[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_EH_PE_udata4 = 3,[m
[31m-  DW_EH_PE_textrel = 0x20[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_TAG_compile_unit = 0x11[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_children_no = 0,[m
[31m-  DW_children_yes = 1[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_AT_name = 0x03,[m
[31m-  DW_AT_stmt_list = 0x10,[m
[31m-  DW_AT_low_pc = 0x11,[m
[31m-  DW_AT_high_pc = 0x12[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_FORM_addr = 0x01,[m
[31m-  DW_FORM_data4 = 0x06,[m
[31m-  DW_FORM_string = 0x08[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_LNS_extended_op = 0,[m
[31m-  DW_LNS_copy = 1,[m
[31m-  DW_LNS_advance_pc = 2,[m
[31m-  DW_LNS_advance_line = 3[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_LNE_end_sequence = 1,[m
[31m-  DW_LNE_set_address = 2[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-#if LJ_TARGET_X86[m
[31m-  DW_REG_AX, DW_REG_CX, DW_REG_DX, DW_REG_BX,[m
[31m-  DW_REG_SP, DW_REG_BP, DW_REG_SI, DW_REG_DI,[m
[31m-  DW_REG_RA,[m
[31m-#elif LJ_TARGET_X64[m
[31m-  /* Yes, the order is strange, but correct. */[m
[31m-  DW_REG_AX, DW_REG_DX, DW_REG_CX, DW_REG_BX,[m
[31m-  DW_REG_SI, DW_REG_DI, DW_REG_BP, DW_REG_SP,[m
[31m-  DW_REG_8, DW_REG_9, DW_REG_10, DW_REG_11,[m
[31m-  DW_REG_12, DW_REG_13, DW_REG_14, DW_REG_15,[m
[31m-  DW_REG_RA,[m
[31m-#elif LJ_TARGET_ARM[m
[31m-  DW_REG_SP = 13,[m
[31m-  DW_REG_RA = 14,[m
[31m-#elif LJ_TARGET_PPC[m
[31m-  DW_REG_SP = 1,[m
[31m-  DW_REG_RA = 65,[m
[31m-  DW_REG_CR = 70,[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-  DW_REG_SP = 29,[m
[31m-  DW_REG_RA = 31,[m
[31m-#else[m
[31m-#error "Unsupported target architecture"[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-/* Minimal list of sections for the in-memory ELF object. */[m
[31m-enum {[m
[31m-  GDBJIT_SECT_NULL,[m
[31m-  GDBJIT_SECT_text,[m
[31m-  GDBJIT_SECT_eh_frame,[m
[31m-  GDBJIT_SECT_shstrtab,[m
[31m-  GDBJIT_SECT_strtab,[m
[31m-  GDBJIT_SECT_symtab,[m
[31m-  GDBJIT_SECT_debug_info,[m
[31m-  GDBJIT_SECT_debug_abbrev,[m
[31m-  GDBJIT_SECT_debug_line,[m
[31m-  GDBJIT_SECT__MAX[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  GDBJIT_SYM_UNDEF,[m
[31m-  GDBJIT_SYM_FILE,[m
[31m-  GDBJIT_SYM_FUNC,[m
[31m-  GDBJIT_SYM__MAX[m
[31m-};[m
[31m-[m
[31m-/* In-memory ELF object. */[m
[31m-typedef struct GDBJITobj {[m
[31m-  ELFheader hdr;			/* ELF header. */[m
[31m-  ELFsectheader sect[GDBJIT_SECT__MAX];	/* ELF sections. */[m
[31m-  ELFsymbol sym[GDBJIT_SYM__MAX];	/* ELF symbol table. */[m
[31m-  uint8_t space[4096];			/* Space for various section data. */[m
[31m-} GDBJITobj;[m
[31m-[m
[31m-/* Combined structure for GDB JIT entry and ELF object. */[m
[31m-typedef struct GDBJITentryobj {[m
[31m-  GDBJITentry entry;[m
[31m-  size_t sz;[m
[31m-  GDBJITobj obj;[m
[31m-} GDBJITentryobj;[m
[31m-[m
[31m-/* Template for in-memory ELF header. */[m
[31m-static const ELFheader elfhdr_template = {[m
[31m-  .emagic = { 0x7f, 'E', 'L', 'F' },[m
[31m-  .eclass = LJ_64 ? 2 : 1,[m
[31m-  .eendian = LJ_ENDIAN_SELECT(1, 2),[m
[31m-  .eversion = 1,[m
[31m-#if LJ_TARGET_LINUX[m
[31m-  .eosabi = 0,  /* Nope, it's not 3. */[m
[31m-#elif defined(__FreeBSD__)[m
[31m-  .eosabi = 9,[m
[31m-#elif defined(__NetBSD__)[m
[31m-  .eosabi = 2,[m
[31m-#elif defined(__OpenBSD__)[m
[31m-  .eosabi = 12,[m
[31m-#elif defined(__DragonFly__)[m
[31m-  .eosabi = 0,[m
[31m-#elif (defined(__sun__) && defined(__svr4__))[m
[31m-  .eosabi = 6,[m
[31m-#else[m
[31m-  .eosabi = 0,[m
[31m-#endif[m
[31m-  .eabiversion = 0,[m
[31m-  .epad = { 0, 0, 0, 0, 0, 0, 0 },[m
[31m-  .type = 1,[m
[31m-#if LJ_TARGET_X86[m
[31m-  .machine = 3,[m
[31m-#elif LJ_TARGET_X64[m
[31m-  .machine = 62,[m
[31m-#elif LJ_TARGET_ARM[m
[31m-  .machine = 40,[m
[31m-#elif LJ_TARGET_PPC[m
[31m-  .machine = 20,[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-  .machine = 8,[m
[31m-#else[m
[31m-#error "Unsupported target architecture"[m
[31m-#endif[m
[31m-  .version = 1,[m
[31m-  .entry = 0,[m
[31m-  .phofs = 0,[m
[31m-  .shofs = offsetof(GDBJITobj, sect),[m
[31m-  .flags = 0,[m
[31m-  .ehsize = sizeof(ELFheader),[m
[31m-  .phentsize = 0,[m
[31m-  .phnum = 0,[m
[31m-  .shentsize = sizeof(ELFsectheader),[m
[31m-  .shnum = GDBJIT_SECT__MAX,[m
[31m-  .shstridx = GDBJIT_SECT_shstrtab[m
[31m-};[m
[31m-[m
[31m-/* -- In-memory ELF object generation ------------------------------------- */[m
[31m-[m
[31m-/* Context for generating the ELF object for the GDB JIT API. */[m
[31m-typedef struct GDBJITctx {[m
[31m-  uint8_t *p;		/* Pointer to next address in obj.space. */[m
[31m-  uint8_t *startp;	/* Pointer to start address in obj.space. */[m
[31m-  GCtrace *T;		/* Generate symbols for this trace. */[m
[31m-  uintptr_t mcaddr;	/* Machine code address. */[m
[31m-  MSize szmcode;	/* Size of machine code. */[m
[31m-  MSize spadjp;		/* Stack adjustment for parent trace or interpreter. */[m
[31m-  MSize spadj;		/* Stack adjustment for trace itself. */[m
[31m-  BCLine lineno;	/* Starting line number. */[m
[31m-  const char *filename;	/* Starting file name. */[m
[31m-  size_t objsize;	/* Final size of ELF object. */[m
[31m-  GDBJITobj obj;	/* In-memory ELF object. */[m
[31m-} GDBJITctx;[m
[31m-[m
[31m-/* Add a zero-terminated string. */[m
[31m-static uint32_t gdbjit_strz(GDBJITctx *ctx, const char *str)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-  uint32_t ofs = (uint32_t)(p - ctx->startp);[m
[31m-  do {[m
[31m-    *p++ = (uint8_t)*str;[m
[31m-  } while (*str++);[m
[31m-  ctx->p = p;[m
[31m-  return ofs;[m
[31m-}[m
[31m-[m
[31m-/* Append a decimal number. */[m
[31m-static void gdbjit_catnum(GDBJITctx *ctx, uint32_t n)[m
[31m-{[m
[31m-  if (n >= 10) { uint32_t m = n / 10; n = n % 10; gdbjit_catnum(ctx, m); }[m
[31m-  *ctx->p++ = '0' + n;[m
[31m-}[m
[31m-[m
[31m-/* Add a SLEB128 value. */[m
[31m-static void gdbjit_sleb128(GDBJITctx *ctx, int32_t v)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-  for (; (uint32_t)(v+0x40) >= 0x80; v >>= 7)[m
[31m-    *p++ = (uint8_t)((v & 0x7f) | 0x80);[m
[31m-  *p++ = (uint8_t)(v & 0x7f);[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-/* Shortcuts to generate DWARF structures. */[m
[31m-#define DB(x)		(*p++ = (x))[m
[31m-#define DI8(x)		(*(int8_t *)p = (x), p++)[m
[31m-#define DU16(x)		(*(uint16_t *)p = (x), p += 2)[m
[31m-#define DU32(x)		(*(uint32_t *)p = (x), p += 4)[m
[31m-#define DADDR(x)	(*(uintptr_t *)p = (x), p += sizeof(uintptr_t))[m
[31m-#define DUV(x)		(p = (uint8_t *)lj_strfmt_wuleb128((char *)p, (x)))[m
[31m-#define DSV(x)		(ctx->p = p, gdbjit_sleb128(ctx, (x)), p = ctx->p)[m
[31m-#define DSTR(str)	(ctx->p = p, gdbjit_strz(ctx, (str)), p = ctx->p)[m
[31m-#define DALIGNNOP(s)	while ((uintptr_t)p & ((s)-1)) *p++ = DW_CFA_nop[m
[31m-#define DSECT(name, stmt) \[m
[31m-  { uint32_t *szp_##name = (uint32_t *)p; p += 4; stmt \[m
[31m-    *szp_##name = (uint32_t)((p-(uint8_t *)szp_##name)-4); } \[m
[31m-[m
[31m-/* Initialize ELF section headers. */[m
[31m-static void LJ_FASTCALL gdbjit_secthdr(GDBJITctx *ctx)[m
[31m-{[m
[31m-  ELFsectheader *sect;[m
[31m-[m
[31m-  *ctx->p++ = '\0';  /* Empty string at start of string table. */[m
[31m-[m
[31m-#define SECTDEF(id, tp, al) \[m
[31m-  sect = &ctx->obj.sect[GDBJIT_SECT_##id]; \[m
[31m-  sect->name = gdbjit_strz(ctx, "." #id); \[m
[31m-  sect->type = ELFSECT_TYPE_##tp; \[m
[31m-  sect->align = (al)[m
[31m-[m
[31m-  SECTDEF(text, NOBITS, 16);[m
[31m-  sect->flags = ELFSECT_FLAGS_ALLOC|ELFSECT_FLAGS_EXEC;[m
[31m-  sect->addr = ctx->mcaddr;[m
[31m-  sect->ofs = 0;[m
[31m-  sect->size = ctx->szmcode;[m
[31m-[m
[31m-  SECTDEF(eh_frame, PROGBITS, sizeof(uintptr_t));[m
[31m-  sect->flags = ELFSECT_FLAGS_ALLOC;[m
[31m-[m
[31m-  SECTDEF(shstrtab, STRTAB, 1);[m
[31m-  SECTDEF(strtab, STRTAB, 1);[m
[31m-[m
[31m-  SECTDEF(symtab, SYMTAB, sizeof(uintptr_t));[m
[31m-  sect->ofs = offsetof(GDBJITobj, sym);[m
[31m-  sect->size = sizeof(ctx->obj.sym);[m
[31m-  sect->link = GDBJIT_SECT_strtab;[m
[31m-  sect->entsize = sizeof(ELFsymbol);[m
[31m-  sect->info = GDBJIT_SYM_FUNC;[m
[31m-[m
[31m-  SECTDEF(debug_info, PROGBITS, 1);[m
[31m-  SECTDEF(debug_abbrev, PROGBITS, 1);[m
[31m-  SECTDEF(debug_line, PROGBITS, 1);[m
[31m-[m
[31m-#undef SECTDEF[m
[31m-}[m
[31m-[m
[31m-/* Initialize symbol table. */[m
[31m-static void LJ_FASTCALL gdbjit_symtab(GDBJITctx *ctx)[m
[31m-{[m
[31m-  ELFsymbol *sym;[m
[31m-[m
[31m-  *ctx->p++ = '\0';  /* Empty string at start of string table. */[m
[31m-[m
[31m-  sym = &ctx->obj.sym[GDBJIT_SYM_FILE];[m
[31m-  sym->name = gdbjit_strz(ctx, "JIT mcode");[m
[31m-  sym->sectidx = ELFSECT_IDX_ABS;[m
[31m-  sym->info = ELFSYM_TYPE_FILE|ELFSYM_BIND_LOCAL;[m
[31m-[m
[31m-  sym = &ctx->obj.sym[GDBJIT_SYM_FUNC];[m
[31m-  sym->name = gdbjit_strz(ctx, "TRACE_"); ctx->p--;[m
[31m-  gdbjit_catnum(ctx, ctx->T->traceno); *ctx->p++ = '\0';[m
[31m-  sym->sectidx = GDBJIT_SECT_text;[m
[31m-  sym->value = 0;[m
[31m-  sym->size = ctx->szmcode;[m
[31m-  sym->info = ELFSYM_TYPE_FUNC|ELFSYM_BIND_GLOBAL;[m
[31m-}[m
[31m-[m
[31m-/* Initialize .eh_frame section. */[m
[31m-static void LJ_FASTCALL gdbjit_ehframe(GDBJITctx *ctx)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-  uint8_t *framep = p;[m
[31m-[m
[31m-  /* Emit DWARF EH CIE. */[m
[31m-  DSECT(CIE,[m
[31m-    DU32(0);			/* Offset to CIE itself. */[m
[31m-    DB(DW_CIE_VERSION);[m
[31m-    DSTR("zR");			/* Augmentation. */[m
[31m-    DUV(1);			/* Code alignment factor. */[m
[31m-    DSV(-(int32_t)sizeof(uintptr_t));  /* Data alignment factor. */[m
[31m-    DB(DW_REG_RA);		/* Return address register. */[m
[31m-    DB(1); DB(DW_EH_PE_textrel|DW_EH_PE_udata4);  /* Augmentation data. */[m
[31m-    DB(DW_CFA_def_cfa); DUV(DW_REG_SP); DUV(sizeof(uintptr_t));[m
[31m-#if LJ_TARGET_PPC[m
[31m-    DB(DW_CFA_offset_extended_sf); DB(DW_REG_RA); DSV(-1);[m
[31m-#else[m
[31m-    DB(DW_CFA_offset|DW_REG_RA); DUV(1);[m
[31m-#endif[m
[31m-    DALIGNNOP(sizeof(uintptr_t));[m
[31m-  )[m
[31m-[m
[31m-  /* Emit DWARF EH FDE. */[m
[31m-  DSECT(FDE,[m
[31m-    DU32((uint32_t)(p-framep));	/* Offset to CIE. */[m
[31m-    DU32(0);			/* Machine code offset relative to .text. */[m
[31m-    DU32(ctx->szmcode);		/* Machine code length. */[m
[31m-    DB(0);			/* Augmentation data. */[m
[31m-    /* Registers saved in CFRAME. */[m
[31m-#if LJ_TARGET_X86[m
[31m-    DB(DW_CFA_offset|DW_REG_BP); DUV(2);[m
[31m-    DB(DW_CFA_offset|DW_REG_DI); DUV(3);[m
[31m-    DB(DW_CFA_offset|DW_REG_SI); DUV(4);[m
[31m-    DB(DW_CFA_offset|DW_REG_BX); DUV(5);[m
[31m-#elif LJ_TARGET_X64[m
[31m-    DB(DW_CFA_offset|DW_REG_BP); DUV(2);[m
[31m-    DB(DW_CFA_offset|DW_REG_BX); DUV(3);[m
[31m-    DB(DW_CFA_offset|DW_REG_15); DUV(4);[m
[31m-    DB(DW_CFA_offset|DW_REG_14); DUV(5);[m
[31m-    /* Extra registers saved for JIT-compiled code. */[m
[31m-    DB(DW_CFA_offset|DW_REG_13); DUV(LJ_GC64 ? 10 : 9);[m
[31m-    DB(DW_CFA_offset|DW_REG_12); DUV(LJ_GC64 ? 11 : 10);[m
[31m-#elif LJ_TARGET_ARM[m
[31m-    {[m
[31m-      int i;[m
[31m-      for (i = 11; i >= 4; i--) { DB(DW_CFA_offset|i); DUV(2+(11-i)); }[m
[31m-    }[m
[31m-#elif LJ_TARGET_PPC[m
[31m-    {[m
[31m-      int i;[m
[31m-      DB(DW_CFA_offset_extended); DB(DW_REG_CR); DUV(55);[m
[31m-      for (i = 14; i <= 31; i++) {[m
[31m-	DB(DW_CFA_offset|i); DUV(37+(31-i));[m
[31m-	DB(DW_CFA_offset|32|i); DUV(2+2*(31-i));[m
[31m-      }[m
[31m-    }[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-    {[m
[31m-      int i;[m
[31m-      DB(DW_CFA_offset|30); DUV(2);[m
[31m-      for (i = 23; i >= 16; i--) { DB(DW_CFA_offset|i); DUV(26-i); }[m
[31m-      for (i = 30; i >= 20; i -= 2) { DB(DW_CFA_offset|32|i); DUV(42-i); }[m
[31m-    }[m
[31m-#else[m
[31m-#error "Unsupported target architecture"[m
[31m-#endif[m
[31m-    if (ctx->spadjp != ctx->spadj) {  /* Parent/interpreter stack frame size. */[m
[31m-      DB(DW_CFA_def_cfa_offset); DUV(ctx->spadjp);[m
[31m-      DB(DW_CFA_advance_loc|1);  /* Only an approximation. */[m
[31m-    }[m
[31m-    DB(DW_CFA_def_cfa_offset); DUV(ctx->spadj);  /* Trace stack frame size. */[m
[31m-    DALIGNNOP(sizeof(uintptr_t));[m
[31m-  )[m
[31m-[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-/* Initialize .debug_info section. */[m
[31m-static void LJ_FASTCALL gdbjit_debuginfo(GDBJITctx *ctx)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-[m
[31m-  DSECT(info,[m
[31m-    DU16(2);			/* DWARF version. */[m
[31m-    DU32(0);			/* Abbrev offset. */[m
[31m-    DB(sizeof(uintptr_t));	/* Pointer size. */[m
[31m-[m
[31m-    DUV(1);			/* Abbrev #1: DW_TAG_compile_unit. */[m
[31m-    DSTR(ctx->filename);	/* DW_AT_name. */[m
[31m-    DADDR(ctx->mcaddr);		/* DW_AT_low_pc. */[m
[31m-    DADDR(ctx->mcaddr + ctx->szmcode);  /* DW_AT_high_pc. */[m
[31m-    DU32(0);			/* DW_AT_stmt_list. */[m
[31m-  )[m
[31m-[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-/* Initialize .debug_abbrev section. */[m
[31m-static void LJ_FASTCALL gdbjit_debugabbrev(GDBJITctx *ctx)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-[m
[31m-  /* Abbrev #1: DW_TAG_compile_unit. */[m
[31m-  DUV(1); DUV(DW_TAG_compile_unit);[m
[31m-  DB(DW_children_no);[m
[31m-  DUV(DW_AT_name);	DUV(DW_FORM_string);[m
[31m-  DUV(DW_AT_low_pc);	DUV(DW_FORM_addr);[m
[31m-  DUV(DW_AT_high_pc);	DUV(DW_FORM_addr);[m
[31m-  DUV(DW_AT_stmt_list);	DUV(DW_FORM_data4);[m
[31m-  DB(0); DB(0);[m
[31m-[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-#define DLNE(op, s)	(DB(DW_LNS_extended_op), DUV(1+(s)), DB((op)))[m
[31m-[m
[31m-/* Initialize .debug_line section. */[m
[31m-static void LJ_FASTCALL gdbjit_debugline(GDBJITctx *ctx)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-[m
[31m-  DSECT(line,[m
[31m-    DU16(2);			/* DWARF version. */[m
[31m-    DSECT(header,[m
[31m-      DB(1);			/* Minimum instruction length. */[m
[31m-      DB(1);			/* is_stmt. */[m
[31m-      DI8(0);			/* Line base for special opcodes. */[m
[31m-      DB(2);			/* Line range for special opcodes. */[m
[31m-      DB(3+1);			/* Opcode base at DW_LNS_advance_line+1. */[m
[31m-      DB(0); DB(1); DB(1);	/* Standard opcode lengths. */[m
[31m-      /* Directory table. */[m
[31m-      DB(0);[m
[31m-      /* File name table. */[m
[31m-      DSTR(ctx->filename); DUV(0); DUV(0); DUV(0);[m
[31m-      DB(0);[m
[31m-    )[m
[31m-[m
[31m-    DLNE(DW_LNE_set_address, sizeof(uintptr_t)); DADDR(ctx->mcaddr);[m
[31m-    if (ctx->lineno) {[m
[31m-      DB(DW_LNS_advance_line); DSV(ctx->lineno-1);[m
[31m-    }[m
[31m-    DB(DW_LNS_copy);[m
[31m-    DB(DW_LNS_advance_pc); DUV(ctx->szmcode);[m
[31m-    DLNE(DW_LNE_end_sequence, 0);[m
[31m-  )[m
[31m-[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-#undef DLNE[m
[31m-[m
[31m-/* Undef shortcuts. */[m
[31m-#undef DB[m
[31m-#undef DI8[m
[31m-#undef DU16[m
[31m-#undef DU32[m
[31m-#undef DADDR[m
[31m-#undef DUV[m
[31m-#undef DSV[m
[31m-#undef DSTR[m
[31m-#undef DALIGNNOP[m
[31m-#undef DSECT[m
[31m-[m
[31m-/* Type of a section initializer callback. */[m
[31m-typedef void (LJ_FASTCALL *GDBJITinitf)(GDBJITctx *ctx);[m
[31m-[m
[31m-/* Call section initializer and set the section offset and size. */[m
[31m-static void gdbjit_initsect(GDBJITctx *ctx, int sect, GDBJITinitf initf)[m
[31m-{[m
[31m-  ctx->startp = ctx->p;[m
[31m-  ctx->obj.sect[sect].ofs = (uintptr_t)((char *)ctx->p - (char *)&ctx->obj);[m
[31m-  initf(ctx);[m
[31m-  ctx->obj.sect[sect].size = (uintptr_t)(ctx->p - ctx->startp);[m
[31m-}[m
[31m-[m
[31m-#define SECTALIGN(p, a) \[m
[31m-  ((p) = (uint8_t *)(((uintptr_t)(p) + ((a)-1)) & ~(uintptr_t)((a)-1)))[m
[31m-[m
[31m-/* Build in-memory ELF object. */[m
[31m-static void gdbjit_buildobj(GDBJITctx *ctx)[m
[31m-{[m
[31m-  GDBJITobj *obj = &ctx->obj;[m
[31m-  /* Fill in ELF header and clear structures. */[m
[31m-  memcpy(&obj->hdr, &elfhdr_template, sizeof(ELFheader));[m
[31m-  memset(&obj->sect, 0, sizeof(ELFsectheader)*GDBJIT_SECT__MAX);[m
[31m-  memset(&obj->sym, 0, sizeof(ELFsymbol)*GDBJIT_SYM__MAX);[m
[31m-  /* Initialize sections. */[m
[31m-  ctx->p = obj->space;[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_shstrtab, gdbjit_secthdr);[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_strtab, gdbjit_symtab);[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_debug_info, gdbjit_debuginfo);[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_debug_abbrev, gdbjit_debugabbrev);[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_debug_line, gdbjit_debugline);[m
[31m-  SECTALIGN(ctx->p, sizeof(uintptr_t));[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_eh_frame, gdbjit_ehframe);[m
[31m-  ctx->objsize = (size_t)((char *)ctx->p - (char *)obj);[m
[31m-  lua_assert(ctx->objsize < sizeof(GDBJITobj));[m
[31m-}[m
[31m-[m
[31m-#undef SECTALIGN[m
[31m-[m
[31m-/* -- Interface to GDB JIT API -------------------------------------------- */[m
[31m-[m
[31m-static int gdbjit_lock;[m
[31m-[m
[31m-static void gdbjit_lock_acquire()[m
[31m-{[m
[31m-  while (__sync_lock_test_and_set(&gdbjit_lock, 1)) {[m
[31m-    /* Just spin; futexes or pthreads aren't worth the portability cost. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void gdbjit_lock_release()[m
[31m-{[m
[31m-  __sync_lock_release(&gdbjit_lock);[m
[31m-}[m
[31m-[m
[31m-/* Add new entry to GDB JIT symbol chain. */[m
[31m-static void gdbjit_newentry(lua_State *L, GDBJITctx *ctx)[m
[31m-{[m
[31m-  /* Allocate memory for GDB JIT entry and ELF object. */[m
[31m-  MSize sz = (MSize)(sizeof(GDBJITentryobj) - sizeof(GDBJITobj) + ctx->objsize);[m
[31m-  GDBJITentryobj *eo = lj_mem_newt(L, sz, GDBJITentryobj);[m
[31m-  memcpy(&eo->obj, &ctx->obj, ctx->objsize);  /* Copy ELF object. */[m
[31m-  eo->sz = sz;[m
[31m-  ctx->T->gdbjit_entry = (void *)eo;[m
[31m-  /* Link new entry to chain and register it. */[m
[31m-  eo->entry.prev_entry = NULL;[m
[31m-  gdbjit_lock_acquire();[m
[31m-  eo->entry.next_entry = __jit_debug_descriptor.first_entry;[m
[31m-  if (eo->entry.next_entry)[m
[31m-    eo->entry.next_entry->prev_entry = &eo->entry;[m
[31m-  eo->entry.symfile_addr = (const char *)&eo->obj;[m
[31m-  eo->entry.symfile_size = ctx->objsize;[m
[31m-  __jit_debug_descriptor.first_entry = &eo->entry;[m
[31m-  __jit_debug_descriptor.relevant_entry = &eo->entry;[m
[31m-  __jit_debug_descriptor.action_flag = GDBJIT_REGISTER;[m
[31m-  __jit_debug_register_code();[m
[31m-  gdbjit_lock_release();[m
[31m-}[m
[31m-[m
[31m-/* Add debug info for newly compiled trace and notify GDB. */[m
[31m-void lj_gdbjit_addtrace(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  GDBJITctx ctx;[m
[31m-  GCproto *pt = &gcref(T->startpt)->pt;[m
[31m-  TraceNo parent = T->ir[REF_BASE].op1;[m
[31m-  const BCIns *startpc = mref(T->startpc, const BCIns);[m
[31m-  ctx.T = T;[m
[31m-  ctx.mcaddr = (uintptr_t)T->mcode;[m
[31m-  ctx.szmcode = T->szmcode;[m
[31m-  ctx.spadjp = CFRAME_SIZE_JIT +[m
[31m-	       (MSize)(parent ? traceref(J, parent)->spadjust : 0);[m
[31m-  ctx.spadj = CFRAME_SIZE_JIT + T->spadjust;[m
[31m-  lua_assert(startpc >= proto_bc(pt) && startpc < proto_bc(pt) + pt->sizebc);[m
[31m-  ctx.lineno = lj_debug_line(pt, proto_bcpos(pt, startpc));[m
[31m-  ctx.filename = proto_chunknamestr(pt);[m
[31m-  if (*ctx.filename == '@' || *ctx.filename == '=')[m
[31m-    ctx.filename++;[m
[31m-  else[m
[31m-    ctx.filename = "(string)";[m
[31m-  gdbjit_buildobj(&ctx);[m
[31m-  gdbjit_newentry(J->L, &ctx);[m
[31m-}[m
[31m-[m
[31m-/* Delete debug info for trace and notify GDB. */[m
[31m-void lj_gdbjit_deltrace(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  GDBJITentryobj *eo = (GDBJITentryobj *)T->gdbjit_entry;[m
[31m-  if (eo) {[m
[31m-    gdbjit_lock_acquire();[m
[31m-    if (eo->entry.prev_entry)[m
[31m-      eo->entry.prev_entry->next_entry = eo->entry.next_entry;[m
[31m-    else[m
[31m-      __jit_debug_descriptor.first_entry = eo->entry.next_entry;[m
[31m-    if (eo->entry.next_entry)[m
[31m-      eo->entry.next_entry->prev_entry = eo->entry.prev_entry;[m
[31m-    __jit_debug_descriptor.relevant_entry = &eo->entry;[m
[31m-    __jit_debug_descriptor.action_flag = GDBJIT_UNREGISTER;[m
[31m-    __jit_debug_register_code();[m
[31m-    gdbjit_lock_release();[m
[31m-    lj_mem_free(J2G(J), eo, eo->sz);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.h[m
[1mdeleted file mode 100644[m
[1mindex 1043bc6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_gdbjit.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-/*[m
[31m-** Client for the GDB JIT API.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_GDBJIT_H[m
[31m-#define _LJ_GDBJIT_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT && defined(LUAJIT_USE_GDBJIT)[m
[31m-[m
[31m-LJ_FUNC void lj_gdbjit_addtrace(jit_State *J, GCtrace *T);[m
[31m-LJ_FUNC void lj_gdbjit_deltrace(jit_State *J, GCtrace *T);[m
[31m-[m
[31m-#else[m
[31m-#define lj_gdbjit_addtrace(J, T)	UNUSED(T)[m
[31m-#define lj_gdbjit_deltrace(J, T)	UNUSED(T)[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.c[m
[1mdeleted file mode 100644[m
[1mindex b4087aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.c[m
[1m+++ /dev/null[m
[36m@@ -1,521 +0,0 @@[m
[31m-/*[m
[31m-** SSA IR (Intermediate Representation) emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_ir_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-/* For pointers to libc/libm functions. */[m
[31m-#include <stdio.h>[m
[31m-#include <math.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_carith.h"[m
[31m-#endif[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-#define fins			(&J->fold.ins)[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)        (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* -- IR tables ----------------------------------------------------------- */[m
[31m-[m
[31m-/* IR instruction modes. */[m
[31m-LJ_DATADEF const uint8_t lj_ir_mode[IR__MAX+1] = {[m
[31m-IRDEF(IRMODE)[m
[31m-  0[m
[31m-};[m
[31m-[m
[31m-/* IR type sizes. */[m
[31m-LJ_DATADEF const uint8_t lj_ir_type_size[IRT__MAX+1] = {[m
[31m-#define IRTSIZE(name, size)	size,[m
[31m-IRTDEF(IRTSIZE)[m
[31m-#undef IRTSIZE[m
[31m-  0[m
[31m-};[m
[31m-[m
[31m-/* C call info for CALL* instructions. */[m
[31m-LJ_DATADEF const CCallInfo lj_ir_callinfo[] = {[m
[31m-#define IRCALLCI(cond, name, nargs, kind, type, flags) \[m
[31m-  { (ASMFunction)IRCALLCOND_##cond(name), \[m
[31m-    (nargs)|(CCI_CALL_##kind)|(IRT_##type<<CCI_OTSHIFT)|(flags) },[m
[31m-IRCALLDEF(IRCALLCI)[m
[31m-#undef IRCALLCI[m
[31m-  { NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-/* -- IR emitter ---------------------------------------------------------- */[m
[31m-[m
[31m-/* Grow IR buffer at the top. */[m
[31m-void LJ_FASTCALL lj_ir_growtop(jit_State *J)[m
[31m-{[m
[31m-  IRIns *baseir = J->irbuf + J->irbotlim;[m
[31m-  MSize szins = J->irtoplim - J->irbotlim;[m
[31m-  if (szins) {[m
[31m-    baseir = (IRIns *)lj_mem_realloc(J->L, baseir, szins*sizeof(IRIns),[m
[31m-				     2*szins*sizeof(IRIns));[m
[31m-    J->irtoplim = J->irbotlim + 2*szins;[m
[31m-  } else {[m
[31m-    baseir = (IRIns *)lj_mem_realloc(J->L, NULL, 0, LJ_MIN_IRSZ*sizeof(IRIns));[m
[31m-    J->irbotlim = REF_BASE - LJ_MIN_IRSZ/4;[m
[31m-    J->irtoplim = J->irbotlim + LJ_MIN_IRSZ;[m
[31m-  }[m
[31m-  J->cur.ir = J->irbuf = baseir - J->irbotlim;[m
[31m-}[m
[31m-[m
[31m-/* Grow IR buffer at the bottom or shift it up. */[m
[31m-static void lj_ir_growbot(jit_State *J)[m
[31m-{[m
[31m-  IRIns *baseir = J->irbuf + J->irbotlim;[m
[31m-  MSize szins = J->irtoplim - J->irbotlim;[m
[31m-  lua_assert(szins != 0);[m
[31m-  lua_assert(J->cur.nk == J->irbotlim);[m
[31m-  if (J->cur.nins + (szins >> 1) < J->irtoplim) {[m
[31m-    /* More than half of the buffer is free on top: shift up by a quarter. */[m
[31m-    MSize ofs = szins >> 2;[m
[31m-    memmove(baseir + ofs, baseir, (J->cur.nins - J->irbotlim)*sizeof(IRIns));[m
[31m-    J->irbotlim -= ofs;[m
[31m-    J->irtoplim -= ofs;[m
[31m-    J->cur.ir = J->irbuf = baseir - J->irbotlim;[m
[31m-  } else {[m
[31m-    /* Double the buffer size, but split the growth amongst top/bottom. */[m
[31m-    IRIns *newbase = lj_mem_newt(J->L, 2*szins*sizeof(IRIns), IRIns);[m
[31m-    MSize ofs = szins >= 256 ? 128 : (szins >> 1);  /* Limit bottom growth. */[m
[31m-    memcpy(newbase + ofs, baseir, (J->cur.nins - J->irbotlim)*sizeof(IRIns));[m
[31m-    lj_mem_free(G(J->L), baseir, szins*sizeof(IRIns));[m
[31m-    J->irbotlim -= ofs;[m
[31m-    J->irtoplim = J->irbotlim + 2*szins;[m
[31m-    J->cur.ir = J->irbuf = newbase - J->irbotlim;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit IR without any optimizations. */[m
[31m-TRef LJ_FASTCALL lj_ir_emit(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref = lj_ir_nextins(J);[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  IROp op = fins->o;[m
[31m-  ir->prev = J->chain[op];[m
[31m-  J->chain[op] = (IRRef1)ref;[m
[31m-  ir->o = op;[m
[31m-  ir->op1 = fins->op1;[m
[31m-  ir->op2 = fins->op2;[m
[31m-  J->guardemit.irt |= fins->t.irt;[m
[31m-  return TREF(ref, irt_t((ir->t = fins->t)));[m
[31m-}[m
[31m-[m
[31m-/* Emit call to a C function. */[m
[31m-TRef lj_ir_call(jit_State *J, IRCallID id, ...)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[id];[m
[31m-  uint32_t n = CCI_NARGS(ci);[m
[31m-  TRef tr = TREF_NIL;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, id);[m
[31m-  if ((ci->flags & CCI_L)) n--;[m
[31m-  if (n > 0)[m
[31m-    tr = va_arg(argp, IRRef);[m
[31m-  while (n-- > 1)[m
[31m-    tr = emitir(IRT(IR_CARG, IRT_NIL), tr, va_arg(argp, IRRef));[m
[31m-  va_end(argp);[m
[31m-  if (CCI_OP(ci) == IR_CALLS)[m
[31m-    J->needsnap = 1;  /* Need snapshot after call with side effect. */[m
[31m-  return emitir(CCI_OPTYPE(ci), tr, id);[m
[31m-}[m
[31m-[m
[31m-/* -- Interning of constants ---------------------------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** IR instructions for constants are kept between J->cur.nk >= ref < REF_BIAS.[m
[31m-** They are chained like all other instructions, but grow downwards.[m
[31m-** The are interned (like strings in the VM) to facilitate reference[m
[31m-** comparisons. The same constant must get the same reference.[m
[31m-*/[m
[31m-[m
[31m-/* Get ref of next IR constant and optionally grow IR.[m
[31m-** Note: this may invalidate all IRIns *![m
[31m-*/[m
[31m-static LJ_AINLINE IRRef ir_nextk(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref = J->cur.nk;[m
[31m-  if (LJ_UNLIKELY(ref <= J->irbotlim)) lj_ir_growbot(J);[m
[31m-  J->cur.nk = --ref;[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-/* Intern int32_t constant. */[m
[31m-TRef LJ_FASTCALL lj_ir_kint(jit_State *J, int32_t k)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  for (ref = J->chain[IR_KINT]; ref; ref = cir[ref].prev)[m
[31m-    if (cir[ref].i == k)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  ir->i = k;[m
[31m-  ir->t.irt = IRT_INT;[m
[31m-  ir->o = IR_KINT;[m
[31m-  ir->prev = J->chain[IR_KINT];[m
[31m-  J->chain[IR_KINT] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, IRT_INT);[m
[31m-}[m
[31m-[m
[31m-/* The MRef inside the KNUM/KINT64 IR instructions holds the address of the[m
[31m-** 64 bit constant. The constants themselves are stored in a chained array[m
[31m-** and shared across traces.[m
[31m-**[m
[31m-** Rationale for choosing this data structure:[m
[31m-** - The address of the constants is embedded in the generated machine code[m
[31m-**   and must never move. A resizable array or hash table wouldn't work.[m
[31m-** - Most apps need very few non-32 bit integer constants (less than a dozen).[m
[31m-** - Linear search is hard to beat in terms of speed and low complexity.[m
[31m-*/[m
[31m-typedef struct K64Array {[m
[31m-  MRef next;			/* Pointer to next list. */[m
[31m-  MSize numk;			/* Number of used elements in this array. */[m
[31m-  TValue k[LJ_MIN_K64SZ];	/* Array of constants. */[m
[31m-} K64Array;[m
[31m-[m
[31m-/* Free all chained arrays. */[m
[31m-void lj_ir_k64_freeall(jit_State *J)[m
[31m-{[m
[31m-  K64Array *k;[m
[31m-  for (k = mref(J->k64, K64Array); k; ) {[m
[31m-    K64Array *next = mref(k->next, K64Array);[m
[31m-    lj_mem_free(J2G(J), k, sizeof(K64Array));[m
[31m-    k = next;[m
[31m-  }[m
[31m-  setmref(J->k64, NULL);[m
[31m-}[m
[31m-[m
[31m-/* Get new 64 bit constant slot. */[m
[31m-static TValue *ir_k64_add(jit_State *J, K64Array *kp, uint64_t u64)[m
[31m-{[m
[31m-  TValue *ntv;[m
[31m-  if (!(kp && kp->numk < LJ_MIN_K64SZ)) {  /* Allocate a new array. */[m
[31m-    K64Array *kn = lj_mem_newt(J->L, sizeof(K64Array), K64Array);[m
[31m-    setmref(kn->next, NULL);[m
[31m-    kn->numk = 0;[m
[31m-    if (kp)[m
[31m-      setmref(kp->next, kn);  /* Chain to the end of the list. */[m
[31m-    else[m
[31m-      setmref(J->k64, kn);  /* Link first array. */[m
[31m-    kp = kn;[m
[31m-  }[m
[31m-  ntv = &kp->k[kp->numk++];  /* Add to current array. */[m
[31m-  ntv->u64 = u64;[m
[31m-  return ntv;[m
[31m-}[m
[31m-[m
[31m-/* Find 64 bit constant in chained array or add it. */[m
[31m-cTValue *lj_ir_k64_find(jit_State *J, uint64_t u64)[m
[31m-{[m
[31m-  K64Array *k, *kp = NULL;[m
[31m-  MSize idx;[m
[31m-  /* Search for the constant in the whole chain of arrays. */[m
[31m-  for (k = mref(J->k64, K64Array); k; k = mref(k->next, K64Array)) {[m
[31m-    kp = k;  /* Remember previous element in list. */[m
[31m-    for (idx = 0; idx < k->numk; idx++) {  /* Search one array. */[m
[31m-      TValue *tv = &k->k[idx];[m
[31m-      if (tv->u64 == u64)  /* Needed for +-0/NaN/absmask. */[m
[31m-	return tv;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Otherwise add a new constant. */[m
[31m-  return ir_k64_add(J, kp, u64);[m
[31m-}[m
[31m-[m
[31m-TValue *lj_ir_k64_reserve(jit_State *J)[m
[31m-{[m
[31m-  K64Array *k, *kp = NULL;[m
[31m-  lj_ir_k64_find(J, 0);  /* Intern dummy 0 to protect the reserved slot. */[m
[31m-  /* Find last K64Array, if any. */[m
[31m-  for (k = mref(J->k64, K64Array); k; k = mref(k->next, K64Array)) kp = k;[m
[31m-  return ir_k64_add(J, kp, 0);  /* Set to 0. Final value is set later. */[m
[31m-}[m
[31m-[m
[31m-/* Intern 64 bit constant, given by its address. */[m
[31m-TRef lj_ir_k64(jit_State *J, IROp op, cTValue *tv)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  IRType t = op == IR_KNUM ? IRT_NUM : IRT_I64;[m
[31m-  for (ref = J->chain[op]; ref; ref = cir[ref].prev)[m
[31m-    if (ir_k64(&cir[ref]) == tv)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  lua_assert(checkptrGC(tv));[m
[31m-  setmref(ir->ptr, tv);[m
[31m-  ir->t.irt = t;[m
[31m-  ir->o = op;[m
[31m-  ir->prev = J->chain[op];[m
[31m-  J->chain[op] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, t);[m
[31m-}[m
[31m-[m
[31m-/* Intern FP constant, given by its 64 bit pattern. */[m
[31m-TRef lj_ir_knum_u64(jit_State *J, uint64_t u64)[m
[31m-{[m
[31m-  return lj_ir_k64(J, IR_KNUM, lj_ir_k64_find(J, u64));[m
[31m-}[m
[31m-[m
[31m-/* Intern 64 bit integer constant. */[m
[31m-TRef lj_ir_kint64(jit_State *J, uint64_t u64)[m
[31m-{[m
[31m-  return lj_ir_k64(J, IR_KINT64, lj_ir_k64_find(J, u64));[m
[31m-}[m
[31m-[m
[31m-/* Check whether a number is int and return it. -0 is NOT considered an int. */[m
[31m-static int numistrueint(lua_Number n, int32_t *kp)[m
[31m-{[m
[31m-  int32_t k = lj_num2int(n);[m
[31m-  if (n == (lua_Number)k) {[m
[31m-    if (kp) *kp = k;[m
[31m-    if (k == 0) {  /* Special check for -0. */[m
[31m-      TValue tv;[m
[31m-      setnumV(&tv, n);[m
[31m-      if (tv.u32.hi != 0)[m
[31m-	return 0;[m
[31m-    }[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Intern number as int32_t constant if possible, otherwise as FP constant. */[m
[31m-TRef lj_ir_knumint(jit_State *J, lua_Number n)[m
[31m-{[m
[31m-  int32_t k;[m
[31m-  if (numistrueint(n, &k))[m
[31m-    return lj_ir_kint(J, k);[m
[31m-  else[m
[31m-    return lj_ir_knum(J, n);[m
[31m-}[m
[31m-[m
[31m-/* Intern GC object "constant". */[m
[31m-TRef lj_ir_kgc(jit_State *J, GCobj *o, IRType t)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  lua_assert(!LJ_GC64);  /* TODO_GC64: major changes required. */[m
[31m-  lua_assert(!isdead(J2G(J), o));[m
[31m-  for (ref = J->chain[IR_KGC]; ref; ref = cir[ref].prev)[m
[31m-    if (ir_kgc(&cir[ref]) == o)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  /* NOBARRIER: Current trace is a GC root. */[m
[31m-  setgcref(ir->gcr, o);[m
[31m-  ir->t.irt = (uint8_t)t;[m
[31m-  ir->o = IR_KGC;[m
[31m-  ir->prev = J->chain[IR_KGC];[m
[31m-  J->chain[IR_KGC] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, t);[m
[31m-}[m
[31m-[m
[31m-/* Intern 32 bit pointer constant. */[m
[31m-TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  lua_assert((void *)(uintptr_t)u32ptr(ptr) == ptr);[m
[31m-  for (ref = J->chain[op]; ref; ref = cir[ref].prev)[m
[31m-    if (mref(cir[ref].ptr, void) == ptr)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  setmref(ir->ptr, ptr);[m
[31m-  ir->t.irt = IRT_P32;[m
[31m-  ir->o = op;[m
[31m-  ir->prev = J->chain[op];[m
[31m-  J->chain[op] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, IRT_P32);[m
[31m-}[m
[31m-[m
[31m-/* Intern typed NULL constant. */[m
[31m-TRef lj_ir_knull(jit_State *J, IRType t)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  for (ref = J->chain[IR_KNULL]; ref; ref = cir[ref].prev)[m
[31m-    if (irt_t(cir[ref].t) == t)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  ir->i = 0;[m
[31m-  ir->t.irt = (uint8_t)t;[m
[31m-  ir->o = IR_KNULL;[m
[31m-  ir->prev = J->chain[IR_KNULL];[m
[31m-  J->chain[IR_KNULL] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, t);[m
[31m-}[m
[31m-[m
[31m-/* Intern key slot. */[m
[31m-TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef2 op12 = IRREF2((IRRef1)key, (IRRef1)slot);[m
[31m-  IRRef ref;[m
[31m-  /* Const part is not touched by CSE/DCE, so 0-65535 is ok for IRMlit here. */[m
[31m-  lua_assert(tref_isk(key) && slot == (IRRef)(IRRef1)slot);[m
[31m-  for (ref = J->chain[IR_KSLOT]; ref; ref = cir[ref].prev)[m
[31m-    if (cir[ref].op12 == op12)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  ir->op12 = op12;[m
[31m-  ir->t.irt = IRT_P32;[m
[31m-  ir->o = IR_KSLOT;[m
[31m-  ir->prev = J->chain[IR_KSLOT];[m
[31m-  J->chain[IR_KSLOT] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, IRT_P32);[m
[31m-}[m
[31m-[m
[31m-/* -- Access to IR constants ---------------------------------------------- */[m
[31m-[m
[31m-/* Copy value of IR constant. */[m
[31m-void lj_ir_kvalue(lua_State *L, TValue *tv, const IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(L);[m
[31m-  lua_assert(ir->o != IR_KSLOT);  /* Common mistake. */[m
[31m-  switch (ir->o) {[m
[31m-  case IR_KPRI: setpriV(tv, irt_toitype(ir->t)); break;[m
[31m-  case IR_KINT: setintV(tv, ir->i); break;[m
[31m-  case IR_KGC: setgcV(L, tv, ir_kgc(ir), irt_toitype(ir->t)); break;[m
[31m-  case IR_KPTR: case IR_KKPTR: case IR_KNULL:[m
[31m-    setlightudV(tv, mref(ir->ptr, void));[m
[31m-    break;[m
[31m-  case IR_KNUM: setnumV(tv, ir_knum(ir)->n); break;[m
[31m-#if LJ_HASFFI[m
[31m-  case IR_KINT64: {[m
[31m-    GCcdata *cd = lj_cdata_new_(L, CTID_INT64, 8);[m
[31m-    *(uint64_t *)cdataptr(cd) = ir_kint64(ir)->u64;[m
[31m-    setcdataV(L, tv, cd);[m
[31m-    break;[m
[31m-    }[m
[31m-#endif[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Convert IR operand types -------------------------------------------- */[m
[31m-[m
[31m-/* Convert from string to number. */[m
[31m-TRef LJ_FASTCALL lj_ir_tonumber(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (!tref_isnumber(tr)) {[m
[31m-    if (tref_isstr(tr))[m
[31m-      tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-    else[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Convert from integer or string to number. */[m
[31m-TRef LJ_FASTCALL lj_ir_tonum(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (!tref_isnum(tr)) {[m
[31m-    if (tref_isinteger(tr))[m
[31m-      tr = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT);[m
[31m-    else if (tref_isstr(tr))[m
[31m-      tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-    else[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Convert from integer or number to string. */[m
[31m-TRef LJ_FASTCALL lj_ir_tostr(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (!tref_isstr(tr)) {[m
[31m-    if (!tref_isnumber(tr))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    tr = emitir(IRT(IR_TOSTR, IRT_STR), tr,[m
[31m-		tref_isnum(tr) ? IRTOSTR_NUM : IRTOSTR_INT);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous IR ops ------------------------------------------------ */[m
[31m-[m
[31m-/* Evaluate numeric comparison. */[m
[31m-int lj_ir_numcmp(lua_Number a, lua_Number b, IROp op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case IR_EQ: return (a == b);[m
[31m-  case IR_NE: return (a != b);[m
[31m-  case IR_LT: return (a < b);[m
[31m-  case IR_GE: return (a >= b);[m
[31m-  case IR_LE: return (a <= b);[m
[31m-  case IR_GT: return (a > b);[m
[31m-  case IR_ULT: return !(a >= b);[m
[31m-  case IR_UGE: return !(a < b);[m
[31m-  case IR_ULE: return !(a > b);[m
[31m-  case IR_UGT: return !(a <= b);[m
[31m-  default: lua_assert(0); return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Evaluate string comparison. */[m
[31m-int lj_ir_strcmp(GCstr *a, GCstr *b, IROp op)[m
[31m-{[m
[31m-  int res = lj_str_cmp(a, b);[m
[31m-  switch (op) {[m
[31m-  case IR_LT: return (res < 0);[m
[31m-  case IR_GE: return (res >= 0);[m
[31m-  case IR_LE: return (res <= 0);[m
[31m-  case IR_GT: return (res > 0);[m
[31m-  default: lua_assert(0); return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Rollback IR to previous state. */[m
[31m-void lj_ir_rollback(jit_State *J, IRRef ref)[m
[31m-{[m
[31m-  IRRef nins = J->cur.nins;[m
[31m-  while (nins > ref) {[m
[31m-    IRIns *ir;[m
[31m-    nins--;[m
[31m-    ir = IR(nins);[m
[31m-    J->chain[ir->o] = ir->prev;[m
[31m-  }[m
[31m-  J->cur.nins = nins;[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef fins[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.h[m
[1mdeleted file mode 100644[m
[1mindex cd8df59..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ir.h[m
[1m+++ /dev/null[m
[36m@@ -1,577 +0,0 @@[m
[31m-/*[m
[31m-** SSA IR (Intermediate Representation) format.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_IR_H[m
[31m-#define _LJ_IR_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* -- IR instructions ----------------------------------------------------- */[m
[31m-[m
[31m-/* IR instruction definition. Order matters, see below. ORDER IR */[m
[31m-#define IRDEF(_) \[m
[31m-  /* Guarded assertions. */ \[m
[31m-  /* Must be properly aligned to flip opposites (^1) and (un)ordered (^4). */ \[m
[31m-  _(LT,		N , ref, ref) \[m
[31m-  _(GE,		N , ref, ref) \[m
[31m-  _(LE,		N , ref, ref) \[m
[31m-  _(GT,		N , ref, ref) \[m
[31m-  \[m
[31m-  _(ULT,	N , ref, ref) \[m
[31m-  _(UGE,	N , ref, ref) \[m
[31m-  _(ULE,	N , ref, ref) \[m
[31m-  _(UGT,	N , ref, ref) \[m
[31m-  \[m
[31m-  _(EQ,		C , ref, ref) \[m
[31m-  _(NE,		C , ref, ref) \[m
[31m-  \[m
[31m-  _(ABC,	N , ref, ref) \[m
[31m-  _(RETF,	S , ref, ref) \[m
[31m-  \[m
[31m-  /* Miscellaneous ops. */ \[m
[31m-  _(NOP,	N , ___, ___) \[m
[31m-  _(BASE,	N , lit, lit) \[m
[31m-  _(PVAL,	N , lit, ___) \[m
[31m-  _(GCSTEP,	S , ___, ___) \[m
[31m-  _(HIOP,	S , ref, ref) \[m
[31m-  _(LOOP,	S , ___, ___) \[m
[31m-  _(USE,	S , ref, ___) \[m
[31m-  _(PHI,	S , ref, ref) \[m
[31m-  _(RENAME,	S , ref, lit) \[m
[31m-  _(PROF,	S , ___, ___) \[m
[31m-  \[m
[31m-  /* Constants. */ \[m
[31m-  _(KPRI,	N , ___, ___) \[m
[31m-  _(KINT,	N , cst, ___) \[m
[31m-  _(KGC,	N , cst, ___) \[m
[31m-  _(KPTR,	N , cst, ___) \[m
[31m-  _(KKPTR,	N , cst, ___) \[m
[31m-  _(KNULL,	N , cst, ___) \[m
[31m-  _(KNUM,	N , cst, ___) \[m
[31m-  _(KINT64,	N , cst, ___) \[m
[31m-  _(KSLOT,	N , ref, lit) \[m
[31m-  \[m
[31m-  /* Bit ops. */ \[m
[31m-  _(BNOT,	N , ref, ___) \[m
[31m-  _(BSWAP,	N , ref, ___) \[m
[31m-  _(BAND,	C , ref, ref) \[m
[31m-  _(BOR,	C , ref, ref) \[m
[31m-  _(BXOR,	C , ref, ref) \[m
[31m-  _(BSHL,	N , ref, ref) \[m
[31m-  _(BSHR,	N , ref, ref) \[m
[31m-  _(BSAR,	N , ref, ref) \[m
[31m-  _(BROL,	N , ref, ref) \[m
[31m-  _(BROR,	N , ref, ref) \[m
[31m-  \[m
[31m-  /* Arithmetic ops. ORDER ARITH */ \[m
[31m-  _(ADD,	C , ref, ref) \[m
[31m-  _(SUB,	N , ref, ref) \[m
[31m-  _(MUL,	C , ref, ref) \[m
[31m-  _(DIV,	N , ref, ref) \[m
[31m-  _(MOD,	N , ref, ref) \[m
[31m-  _(POW,	N , ref, ref) \[m
[31m-  _(NEG,	N , ref, ref) \[m
[31m-  \[m
[31m-  _(ABS,	N , ref, ref) \[m
[31m-  _(ATAN2,	N , ref, ref) \[m
[31m-  _(LDEXP,	N , ref, ref) \[m
[31m-  _(MIN,	C , ref, ref) \[m
[31m-  _(MAX,	C , ref, ref) \[m
[31m-  _(FPMATH,	N , ref, lit) \[m
[31m-  \[m
[31m-  /* Overflow-checking arithmetic ops. */ \[m
[31m-  _(ADDOV,	CW, ref, ref) \[m
[31m-  _(SUBOV,	NW, ref, ref) \[m
[31m-  _(MULOV,	CW, ref, ref) \[m
[31m-  \[m
[31m-  /* Memory ops. A = array, H = hash, U = upvalue, F = field, S = stack. */ \[m
[31m-  \[m
[31m-  /* Memory references. */ \[m
[31m-  _(AREF,	R , ref, ref) \[m
[31m-  _(HREFK,	R , ref, ref) \[m
[31m-  _(HREF,	L , ref, ref) \[m
[31m-  _(NEWREF,	S , ref, ref) \[m
[31m-  _(UREFO,	LW, ref, lit) \[m
[31m-  _(UREFC,	LW, ref, lit) \[m
[31m-  _(FREF,	R , ref, lit) \[m
[31m-  _(STRREF,	N , ref, ref) \[m
[31m-  _(LREF,	L , ___, ___) \[m
[31m-  \[m
[31m-  /* Loads and Stores. These must be in the same order. */ \[m
[31m-  _(ALOAD,	L , ref, ___) \[m
[31m-  _(HLOAD,	L , ref, ___) \[m
[31m-  _(ULOAD,	L , ref, ___) \[m
[31m-  _(FLOAD,	L , ref, lit) \[m
[31m-  _(XLOAD,	L , ref, lit) \[m
[31m-  _(SLOAD,	L , lit, lit) \[m
[31m-  _(VLOAD,	L , ref, ___) \[m
[31m-  \[m
[31m-  _(ASTORE,	S , ref, ref) \[m
[31m-  _(HSTORE,	S , ref, ref) \[m
[31m-  _(USTORE,	S , ref, ref) \[m
[31m-  _(FSTORE,	S , ref, ref) \[m
[31m-  _(XSTORE,	S , ref, ref) \[m
[31m-  \[m
[31m-  /* Allocations. */ \[m
[31m-  _(SNEW,	N , ref, ref)  /* CSE is ok, not marked as A. */ \[m
[31m-  _(XSNEW,	A , ref, ref) \[m
[31m-  _(TNEW,	AW, lit, lit) \[m
[31m-  _(TDUP,	AW, ref, ___) \[m
[31m-  _(CNEW,	AW, ref, ref) \[m
[31m-  _(CNEWI,	NW, ref, ref)  /* CSE is ok, not marked as A. */ \[m
[31m-  \[m
[31m-  /* Buffer operations. */ \[m
[31m-  _(BUFHDR,	L , ref, lit) \[m
[31m-  _(BUFPUT,	L , ref, ref) \[m
[31m-  _(BUFSTR,	A , ref, ref) \[m
[31m-  \[m
[31m-  /* Barriers. */ \[m
[31m-  _(TBAR,	S , ref, ___) \[m
[31m-  _(OBAR,	S , ref, ref) \[m
[31m-  _(XBAR,	S , ___, ___) \[m
[31m-  \[m
[31m-  /* Type conversions. */ \[m
[31m-  _(CONV,	NW, ref, lit) \[m
[31m-  _(TOBIT,	N , ref, ref) \[m
[31m-  _(TOSTR,	N , ref, lit) \[m
[31m-  _(STRTO,	N , ref, ___) \[m
[31m-  \[m
[31m-  /* Calls. */ \[m
[31m-  _(CALLN,	N , ref, lit) \[m
[31m-  _(CALLA,	A , ref, lit) \[m
[31m-  _(CALLL,	L , ref, lit) \[m
[31m-  _(CALLS,	S , ref, lit) \[m
[31m-  _(CALLXS,	S , ref, ref) \[m
[31m-  _(CARG,	N , ref, ref) \[m
[31m-  \[m
[31m-  /* End of list. */[m
[31m-[m
[31m-/* IR opcodes (max. 256). */[m
[31m-typedef enum {[m
[31m-#define IRENUM(name, m, m1, m2)	IR_##name,[m
[31m-IRDEF(IRENUM)[m
[31m-#undef IRENUM[m
[31m-  IR__MAX[m
[31m-} IROp;[m
[31m-[m
[31m-/* Stored opcode. */[m
[31m-typedef uint8_t IROp1;[m
[31m-[m
[31m-LJ_STATIC_ASSERT(((int)IR_EQ^1) == (int)IR_NE);[m
[31m-LJ_STATIC_ASSERT(((int)IR_LT^1) == (int)IR_GE);[m
[31m-LJ_STATIC_ASSERT(((int)IR_LE^1) == (int)IR_GT);[m
[31m-LJ_STATIC_ASSERT(((int)IR_LT^3) == (int)IR_GT);[m
[31m-LJ_STATIC_ASSERT(((int)IR_LT^4) == (int)IR_ULT);[m
[31m-[m
[31m-/* Delta between xLOAD and xSTORE. */[m
[31m-#define IRDELTA_L2S		((int)IR_ASTORE - (int)IR_ALOAD)[m
[31m-[m
[31m-LJ_STATIC_ASSERT((int)IR_HLOAD + IRDELTA_L2S == (int)IR_HSTORE);[m
[31m-LJ_STATIC_ASSERT((int)IR_ULOAD + IRDELTA_L2S == (int)IR_USTORE);[m
[31m-LJ_STATIC_ASSERT((int)IR_FLOAD + IRDELTA_L2S == (int)IR_FSTORE);[m
[31m-LJ_STATIC_ASSERT((int)IR_XLOAD + IRDELTA_L2S == (int)IR_XSTORE);[m
[31m-[m
[31m-/* -- Named IR literals --------------------------------------------------- */[m
[31m-[m
[31m-/* FPMATH sub-functions. ORDER FPM. */[m
[31m-#define IRFPMDEF(_) \[m
[31m-  _(FLOOR) _(CEIL) _(TRUNC)  /* Must be first and in this order. */ \[m
[31m-  _(SQRT) _(EXP) _(EXP2) _(LOG) _(LOG2) _(LOG10) \[m
[31m-  _(SIN) _(COS) _(TAN) \[m
[31m-  _(OTHER)[m
[31m-[m
[31m-typedef enum {[m
[31m-#define FPMENUM(name)		IRFPM_##name,[m
[31m-IRFPMDEF(FPMENUM)[m
[31m-#undef FPMENUM[m
[31m-  IRFPM__MAX[m
[31m-} IRFPMathOp;[m
[31m-[m
[31m-/* FLOAD fields. */[m
[31m-#define IRFLDEF(_) \[m
[31m-  _(STR_LEN,	offsetof(GCstr, len)) \[m
[31m-  _(FUNC_ENV,	offsetof(GCfunc, l.env)) \[m
[31m-  _(FUNC_PC,	offsetof(GCfunc, l.pc)) \[m
[31m-  _(FUNC_FFID,	offsetof(GCfunc, l.ffid)) \[m
[31m-  _(THREAD_ENV,	offsetof(lua_State, env)) \[m
[31m-  _(TAB_META,	offsetof(GCtab, metatable)) \[m
[31m-  _(TAB_ARRAY,	offsetof(GCtab, array)) \[m
[31m-  _(TAB_NODE,	offsetof(GCtab, node)) \[m
[31m-  _(TAB_ASIZE,	offsetof(GCtab, asize)) \[m
[31m-  _(TAB_HMASK,	offsetof(GCtab, hmask)) \[m
[31m-  _(TAB_NOMM,	offsetof(GCtab, nomm)) \[m
[31m-  _(UDATA_META,	offsetof(GCudata, metatable)) \[m
[31m-  _(UDATA_UDTYPE, offsetof(GCudata, udtype)) \[m
[31m-  _(UDATA_FILE,	sizeof(GCudata)) \[m
[31m-  _(CDATA_CTYPEID, offsetof(GCcdata, ctypeid)) \[m
[31m-  _(CDATA_PTR,	sizeof(GCcdata)) \[m
[31m-  _(CDATA_INT, sizeof(GCcdata)) \[m
[31m-  _(CDATA_INT64, sizeof(GCcdata)) \[m
[31m-  _(CDATA_INT64_4, sizeof(GCcdata) + 4)[m
[31m-[m
[31m-typedef enum {[m
[31m-#define FLENUM(name, ofs)	IRFL_##name,[m
[31m-IRFLDEF(FLENUM)[m
[31m-#undef FLENUM[m
[31m-  IRFL__MAX[m
[31m-} IRFieldID;[m
[31m-[m
[31m-/* SLOAD mode bits, stored in op2. */[m
[31m-#define IRSLOAD_PARENT		0x01	/* Coalesce with parent trace. */[m
[31m-#define IRSLOAD_FRAME		0x02	/* Load hiword of frame. */[m
[31m-#define IRSLOAD_TYPECHECK	0x04	/* Needs type check. */[m
[31m-#define IRSLOAD_CONVERT		0x08	/* Number to integer conversion. */[m
[31m-#define IRSLOAD_READONLY	0x10	/* Read-only, omit slot store. */[m
[31m-#define IRSLOAD_INHERIT		0x20	/* Inherited by exits/side traces. */[m
[31m-[m
[31m-/* XLOAD mode, stored in op2. */[m
[31m-#define IRXLOAD_READONLY	1	/* Load from read-only data. */[m
[31m-#define IRXLOAD_VOLATILE	2	/* Load from volatile data. */[m
[31m-#define IRXLOAD_UNALIGNED	4	/* Unaligned load. */[m
[31m-[m
[31m-/* BUFHDR mode, stored in op2. */[m
[31m-#define IRBUFHDR_RESET		0	/* Reset buffer. */[m
[31m-#define IRBUFHDR_APPEND		1	/* Append to buffer. */[m
[31m-[m
[31m-/* CONV mode, stored in op2. */[m
[31m-#define IRCONV_SRCMASK		0x001f	/* Source IRType. */[m
[31m-#define IRCONV_DSTMASK		0x03e0	/* Dest. IRType (also in ir->t). */[m
[31m-#define IRCONV_DSH		5[m
[31m-#define IRCONV_NUM_INT		((IRT_NUM<<IRCONV_DSH)|IRT_INT)[m
[31m-#define IRCONV_INT_NUM		((IRT_INT<<IRCONV_DSH)|IRT_NUM)[m
[31m-#define IRCONV_SEXT		0x0800	/* Sign-extend integer to integer. */[m
[31m-#define IRCONV_MODEMASK		0x0fff[m
[31m-#define IRCONV_CONVMASK		0xf000[m
[31m-#define IRCONV_CSH		12[m
[31m-/* Number to integer conversion mode. Ordered by strength of the checks. */[m
[31m-#define IRCONV_TOBIT  (0<<IRCONV_CSH)	/* None. Cache only: TOBIT conv. */[m
[31m-#define IRCONV_ANY    (1<<IRCONV_CSH)	/* Any FP number is ok. */[m
[31m-#define IRCONV_INDEX  (2<<IRCONV_CSH)	/* Check + special backprop rules. */[m
[31m-#define IRCONV_CHECK  (3<<IRCONV_CSH)	/* Number checked for integerness. */[m
[31m-[m
[31m-/* TOSTR mode, stored in op2. */[m
[31m-#define IRTOSTR_INT		0	/* Convert integer to string. */[m
[31m-#define IRTOSTR_NUM		1	/* Convert number to string. */[m
[31m-#define IRTOSTR_CHAR		2	/* Convert char value to string. */[m
[31m-[m
[31m-/* -- IR operands --------------------------------------------------------- */[m
[31m-[m
[31m-/* IR operand mode (2 bit). */[m
[31m-typedef enum {[m
[31m-  IRMref,		/* IR reference. */[m
[31m-  IRMlit,		/* 16 bit unsigned literal. */[m
[31m-  IRMcst,		/* Constant literal: i, gcr or ptr. */[m
[31m-  IRMnone		/* Unused operand. */[m
[31m-} IRMode;[m
[31m-#define IRM___		IRMnone[m
[31m-[m
[31m-/* Mode bits: Commutative, {Normal/Ref, Alloc, Load, Store}, Non-weak guard. */[m
[31m-#define IRM_C			0x10[m
[31m-[m
[31m-#define IRM_N			0x00[m
[31m-#define IRM_R			IRM_N[m
[31m-#define IRM_A			0x20[m
[31m-#define IRM_L			0x40[m
[31m-#define IRM_S			0x60[m
[31m-[m
[31m-#define IRM_W			0x80[m
[31m-[m
[31m-#define IRM_NW			(IRM_N|IRM_W)[m
[31m-#define IRM_CW			(IRM_C|IRM_W)[m
[31m-#define IRM_AW			(IRM_A|IRM_W)[m
[31m-#define IRM_LW			(IRM_L|IRM_W)[m
[31m-[m
[31m-#define irm_op1(m)		((IRMode)((m)&3))[m
[31m-#define irm_op2(m)		((IRMode)(((m)>>2)&3))[m
[31m-#define irm_iscomm(m)		((m) & IRM_C)[m
[31m-#define irm_kind(m)		((m) & IRM_S)[m
[31m-[m
[31m-#define IRMODE(name, m, m1, m2)	(((IRM##m1)|((IRM##m2)<<2)|(IRM_##m))^IRM_W),[m
[31m-[m
[31m-LJ_DATA const uint8_t lj_ir_mode[IR__MAX+1];[m
[31m-[m
[31m-/* -- IR instruction types ------------------------------------------------ */[m
[31m-[m
[31m-/* Map of itypes to non-negative numbers. ORDER LJ_T.[m
[31m-** LJ_TUPVAL/LJ_TTRACE never appear in a TValue. Use these itypes for[m
[31m-** IRT_P32 and IRT_P64, which never escape the IR.[m
[31m-** The various integers are only used in the IR and can only escape to[m
[31m-** a TValue after implicit or explicit conversion. Their types must be[m
[31m-** contiguous and next to IRT_NUM (see the typerange macros below).[m
[31m-*/[m
[31m-#define IRTDEF(_) \[m
[31m-  _(NIL, 4) _(FALSE, 4) _(TRUE, 4) _(LIGHTUD, LJ_64 ? 8 : 4) _(STR, 4) \[m
[31m-  _(P32, 4) _(THREAD, 4) _(PROTO, 4) _(FUNC, 4) _(P64, 8) _(CDATA, 4) \[m
[31m-  _(TAB, 4) _(UDATA, 4) \[m
[31m-  _(FLOAT, 4) _(NUM, 8) _(I8, 1) _(U8, 1) _(I16, 2) _(U16, 2) \[m
[31m-  _(INT, 4) _(U32, 4) _(I64, 8) _(U64, 8) \[m
[31m-  _(SOFTFP, 4)  /* There is room for 9 more types. */[m
[31m-[m
[31m-/* IR result type and flags (8 bit). */[m
[31m-typedef enum {[m
[31m-#define IRTENUM(name, size)	IRT_##name,[m
[31m-IRTDEF(IRTENUM)[m
[31m-#undef IRTENUM[m
[31m-  IRT__MAX,[m
[31m-[m
[31m-  /* Native pointer type and the corresponding integer type. */[m
[31m-  IRT_PTR = LJ_64 ? IRT_P64 : IRT_P32,[m
[31m-  IRT_INTP = LJ_64 ? IRT_I64 : IRT_INT,[m
[31m-  IRT_UINTP = LJ_64 ? IRT_U64 : IRT_U32,[m
[31m-  /* TODO_GC64: major changes required for all uses of IRT_P32. */[m
[31m-[m
[31m-  /* Additional flags. */[m
[31m-  IRT_MARK = 0x20,	/* Marker for misc. purposes. */[m
[31m-  IRT_ISPHI = 0x40,	/* Instruction is left or right PHI operand. */[m
[31m-  IRT_GUARD = 0x80,	/* Instruction is a guard. */[m
[31m-[m
[31m-  /* Masks. */[m
[31m-  IRT_TYPE = 0x1f,[m
[31m-  IRT_T = 0xff[m
[31m-} IRType;[m
[31m-[m
[31m-#define irtype_ispri(irt)	((uint32_t)(irt) <= IRT_TRUE)[m
[31m-[m
[31m-/* Stored IRType. */[m
[31m-typedef struct IRType1 { uint8_t irt; } IRType1;[m
[31m-[m
[31m-#define IRT(o, t)		((uint32_t)(((o)<<8) | (t)))[m
[31m-#define IRTI(o)			(IRT((o), IRT_INT))[m
[31m-#define IRTN(o)			(IRT((o), IRT_NUM))[m
[31m-#define IRTG(o, t)		(IRT((o), IRT_GUARD|(t)))[m
[31m-#define IRTGI(o)		(IRT((o), IRT_GUARD|IRT_INT))[m
[31m-[m
[31m-#define irt_t(t)		((IRType)(t).irt)[m
[31m-#define irt_type(t)		((IRType)((t).irt & IRT_TYPE))[m
[31m-#define irt_sametype(t1, t2)	((((t1).irt ^ (t2).irt) & IRT_TYPE) == 0)[m
[31m-#define irt_typerange(t, first, last) \[m
[31m-  ((uint32_t)((t).irt & IRT_TYPE) - (uint32_t)(first) <= (uint32_t)(last-first))[m
[31m-[m
[31m-#define irt_isnil(t)		(irt_type(t) == IRT_NIL)[m
[31m-#define irt_ispri(t)		((uint32_t)irt_type(t) <= IRT_TRUE)[m
[31m-#define irt_islightud(t)	(irt_type(t) == IRT_LIGHTUD)[m
[31m-#define irt_isstr(t)		(irt_type(t) == IRT_STR)[m
[31m-#define irt_istab(t)		(irt_type(t) == IRT_TAB)[m
[31m-#define irt_iscdata(t)		(irt_type(t) == IRT_CDATA)[m
[31m-#define irt_isfloat(t)		(irt_type(t) == IRT_FLOAT)[m
[31m-#define irt_isnum(t)		(irt_type(t) == IRT_NUM)[m
[31m-#define irt_isint(t)		(irt_type(t) == IRT_INT)[m
[31m-#define irt_isi8(t)		(irt_type(t) == IRT_I8)[m
[31m-#define irt_isu8(t)		(irt_type(t) == IRT_U8)[m
[31m-#define irt_isi16(t)		(irt_type(t) == IRT_I16)[m
[31m-#define irt_isu16(t)		(irt_type(t) == IRT_U16)[m
[31m-#define irt_isu32(t)		(irt_type(t) == IRT_U32)[m
[31m-#define irt_isi64(t)		(irt_type(t) == IRT_I64)[m
[31m-#define irt_isu64(t)		(irt_type(t) == IRT_U64)[m
[31m-[m
[31m-#define irt_isfp(t)		(irt_isnum(t) || irt_isfloat(t))[m
[31m-#define irt_isinteger(t)	(irt_typerange((t), IRT_I8, IRT_INT))[m
[31m-#define irt_isgcv(t)		(irt_typerange((t), IRT_STR, IRT_UDATA))[m
[31m-#define irt_isaddr(t)		(irt_typerange((t), IRT_LIGHTUD, IRT_UDATA))[m
[31m-#define irt_isint64(t)		(irt_typerange((t), IRT_I64, IRT_U64))[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define IRT_IS64 \[m
[31m-  ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64)|(1u<<IRT_P64)|\[m
[31m-   (1u<<IRT_LIGHTUD)|(1u<<IRT_STR)|(1u<<IRT_THREAD)|(1u<<IRT_PROTO)|\[m
[31m-   (1u<<IRT_FUNC)|(1u<<IRT_CDATA)|(1u<<IRT_TAB)|(1u<<IRT_UDATA))[m
[31m-#elif LJ_64[m
[31m-#define IRT_IS64 \[m
[31m-  ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64)|(1u<<IRT_P64)|(1u<<IRT_LIGHTUD))[m
[31m-#else[m
[31m-#define IRT_IS64 \[m
[31m-  ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64))[m
[31m-#endif[m
[31m-[m
[31m-#define irt_is64(t)		((IRT_IS64 >> irt_type(t)) & 1)[m
[31m-#define irt_is64orfp(t)		(((IRT_IS64|(1u<<IRT_FLOAT))>>irt_type(t)) & 1)[m
[31m-[m
[31m-#define irt_size(t)		(lj_ir_type_size[irt_t((t))])[m
[31m-[m
[31m-LJ_DATA const uint8_t lj_ir_type_size[];[m
[31m-[m
[31m-static LJ_AINLINE IRType itype2irt(const TValue *tv)[m
[31m-{[m
[31m-  if (tvisint(tv))[m
[31m-    return IRT_INT;[m
[31m-  else if (tvisnum(tv))[m
[31m-    return IRT_NUM;[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-  else if (tvislightud(tv))[m
[31m-    return IRT_LIGHTUD;[m
[31m-#endif[m
[31m-  else[m
[31m-    return (IRType)~itype(tv);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint32_t irt_toitype_(IRType t)[m
[31m-{[m
[31m-  lua_assert(!LJ_64 || t != IRT_LIGHTUD);[m
[31m-  if (LJ_DUALNUM && t > IRT_NUM) {[m
[31m-    return LJ_TISNUM;[m
[31m-  } else {[m
[31m-    lua_assert(t <= IRT_NUM);[m
[31m-    return ~(uint32_t)t;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define irt_toitype(t)		irt_toitype_(irt_type((t)))[m
[31m-[m
[31m-#define irt_isguard(t)		((t).irt & IRT_GUARD)[m
[31m-#define irt_ismarked(t)		((t).irt & IRT_MARK)[m
[31m-#define irt_setmark(t)		((t).irt |= IRT_MARK)[m
[31m-#define irt_clearmark(t)	((t).irt &= ~IRT_MARK)[m
[31m-#define irt_isphi(t)		((t).irt & IRT_ISPHI)[m
[31m-#define irt_setphi(t)		((t).irt |= IRT_ISPHI)[m
[31m-#define irt_clearphi(t)		((t).irt &= ~IRT_ISPHI)[m
[31m-[m
[31m-/* Stored combined IR opcode and type. */[m
[31m-typedef uint16_t IROpT;[m
[31m-[m
[31m-/* -- IR references ------------------------------------------------------- */[m
[31m-[m
[31m-/* IR references. */[m
[31m-typedef uint16_t IRRef1;	/* One stored reference. */[m
[31m-typedef uint32_t IRRef2;	/* Two stored references. */[m
[31m-typedef uint32_t IRRef;		/* Used to pass around references. */[m
[31m-[m
[31m-/* Fixed references. */[m
[31m-enum {[m
[31m-  REF_BIAS =	0x8000,[m
[31m-  REF_TRUE =	REF_BIAS-3,[m
[31m-  REF_FALSE =	REF_BIAS-2,[m
[31m-  REF_NIL =	REF_BIAS-1,	/* \--- Constants grow downwards. */[m
[31m-  REF_BASE =	REF_BIAS,	/* /--- IR grows upwards. */[m
[31m-  REF_FIRST =	REF_BIAS+1,[m
[31m-  REF_DROP =	0xffff[m
[31m-};[m
[31m-[m
[31m-/* Note: IRMlit operands must be < REF_BIAS, too![m
[31m-** This allows for fast and uniform manipulation of all operands[m
[31m-** without looking up the operand mode in lj_ir_mode:[m
[31m-** - CSE calculates the maximum reference of two operands.[m
[31m-**   This must work with mixed reference/literal operands, too.[m
[31m-** - DCE marking only checks for operand >= REF_BIAS.[m
[31m-** - LOOP needs to substitute reference operands.[m
[31m-**   Constant references and literals must not be modified.[m
[31m-*/[m
[31m-[m
[31m-#define IRREF2(lo, hi)		((IRRef2)(lo) | ((IRRef2)(hi) << 16))[m
[31m-[m
[31m-#define irref_isk(ref)		((ref) < REF_BIAS)[m
[31m-[m
[31m-/* Tagged IR references (32 bit).[m
[31m-**[m
[31m-** +-------+-------+---------------+[m
[31m-** |  irt  | flags |      ref      |[m
[31m-** +-------+-------+---------------+[m
[31m-**[m
[31m-** The tag holds a copy of the IRType and speeds up IR type checks.[m
[31m-*/[m
[31m-typedef uint32_t TRef;[m
[31m-[m
[31m-#define TREF_REFMASK		0x0000ffff[m
[31m-#define TREF_FRAME		0x00010000[m
[31m-#define TREF_CONT		0x00020000[m
[31m-[m
[31m-#define TREF(ref, t)		((TRef)((ref) + ((t)<<24)))[m
[31m-[m
[31m-#define tref_ref(tr)		((IRRef1)(tr))[m
[31m-#define tref_t(tr)		((IRType)((tr)>>24))[m
[31m-#define tref_type(tr)		((IRType)(((tr)>>24) & IRT_TYPE))[m
[31m-#define tref_typerange(tr, first, last) \[m
[31m-  ((((tr)>>24) & IRT_TYPE) - (TRef)(first) <= (TRef)(last-first))[m
[31m-[m
[31m-#define tref_istype(tr, t)	(((tr) & (IRT_TYPE<<24)) == ((t)<<24))[m
[31m-#define tref_isnil(tr)		(tref_istype((tr), IRT_NIL))[m
[31m-#define tref_isfalse(tr)	(tref_istype((tr), IRT_FALSE))[m
[31m-#define tref_istrue(tr)		(tref_istype((tr), IRT_TRUE))[m
[31m-#define tref_islightud(tr)	(tref_istype((tr), IRT_LIGHTUD))[m
[31m-#define tref_isstr(tr)		(tref_istype((tr), IRT_STR))[m
[31m-#define tref_isfunc(tr)		(tref_istype((tr), IRT_FUNC))[m
[31m-#define tref_iscdata(tr)	(tref_istype((tr), IRT_CDATA))[m
[31m-#define tref_istab(tr)		(tref_istype((tr), IRT_TAB))[m
[31m-#define tref_isudata(tr)	(tref_istype((tr), IRT_UDATA))[m
[31m-#define tref_isnum(tr)		(tref_istype((tr), IRT_NUM))[m
[31m-#define tref_isint(tr)		(tref_istype((tr), IRT_INT))[m
[31m-[m
[31m-#define tref_isbool(tr)		(tref_typerange((tr), IRT_FALSE, IRT_TRUE))[m
[31m-#define tref_ispri(tr)		(tref_typerange((tr), IRT_NIL, IRT_TRUE))[m
[31m-#define tref_istruecond(tr)	(!tref_typerange((tr), IRT_NIL, IRT_FALSE))[m
[31m-#define tref_isinteger(tr)	(tref_typerange((tr), IRT_I8, IRT_INT))[m
[31m-#define tref_isnumber(tr)	(tref_typerange((tr), IRT_NUM, IRT_INT))[m
[31m-#define tref_isnumber_str(tr)	(tref_isnumber((tr)) || tref_isstr((tr)))[m
[31m-#define tref_isgcv(tr)		(tref_typerange((tr), IRT_STR, IRT_UDATA))[m
[31m-[m
[31m-#define tref_isk(tr)		(irref_isk(tref_ref((tr))))[m
[31m-#define tref_isk2(tr1, tr2)	(irref_isk(tref_ref((tr1) | (tr2))))[m
[31m-[m
[31m-#define TREF_PRI(t)		(TREF(REF_NIL-(t), (t)))[m
[31m-#define TREF_NIL		(TREF_PRI(IRT_NIL))[m
[31m-#define TREF_FALSE		(TREF_PRI(IRT_FALSE))[m
[31m-#define TREF_TRUE		(TREF_PRI(IRT_TRUE))[m
[31m-[m
[31m-/* -- IR format ----------------------------------------------------------- */[m
[31m-[m
[31m-/* IR instruction format (64 bit).[m
[31m-**[m
[31m-**    16      16     8   8   8   8[m
[31m-** +-------+-------+---+---+---+---+[m
[31m-** |  op1  |  op2  | t | o | r | s |[m
[31m-** +-------+-------+---+---+---+---+[m
[31m-** |  op12/i/gco   |   ot  | prev  | (alternative fields in union)[m
[31m-** +---------------+-------+-------+[m
[31m-**        32           16      16[m
[31m-**[m
[31m-** prev is only valid prior to register allocation and then reused for r + s.[m
[31m-*/[m
[31m-[m
[31m-typedef union IRIns {[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      IRRef1 op1;	/* IR operand 1. */[m
[31m-    , IRRef1 op2;	/* IR operand 2. */[m
[31m-    )[m
[31m-    IROpT ot;		/* IR opcode and type (overlaps t and o). */[m
[31m-    IRRef1 prev;	/* Previous ins in same chain (overlaps r and s). */[m
[31m-  };[m
[31m-  struct {[m
[31m-    IRRef2 op12;	/* IR operand 1 and 2 (overlaps op1 and op2). */[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      IRType1 t;	/* IR type. */[m
[31m-    , IROp1 o;		/* IR opcode. */[m
[31m-    )[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      uint8_t r;	/* Register allocation (overlaps prev). */[m
[31m-    , uint8_t s;	/* Spill slot allocation (overlaps prev). */[m
[31m-    )[m
[31m-  };[m
[31m-  int32_t i;		/* 32 bit signed integer literal (overlaps op12). */[m
[31m-  GCRef gcr;		/* GCobj constant (overlaps op12). */[m
[31m-  MRef ptr;		/* Pointer constant (overlaps op12). */[m
[31m-} IRIns;[m
[31m-[m
[31m-/* TODO_GC64: major changes required. */[m
[31m-#define ir_kgc(ir)	check_exp((ir)->o == IR_KGC, gcref((ir)->gcr))[m
[31m-#define ir_kstr(ir)	(gco2str(ir_kgc((ir))))[m
[31m-#define ir_ktab(ir)	(gco2tab(ir_kgc((ir))))[m
[31m-#define ir_kfunc(ir)	(gco2func(ir_kgc((ir))))[m
[31m-#define ir_kcdata(ir)	(gco2cd(ir_kgc((ir))))[m
[31m-#define ir_knum(ir)	check_exp((ir)->o == IR_KNUM, mref((ir)->ptr, cTValue))[m
[31m-#define ir_kint64(ir)	check_exp((ir)->o == IR_KINT64, mref((ir)->ptr,cTValue))[m
[31m-#define ir_k64(ir) \[m
[31m-  check_exp((ir)->o == IR_KNUM || (ir)->o == IR_KINT64, mref((ir)->ptr,cTValue))[m
[31m-#define ir_kptr(ir) \[m
[31m-  check_exp((ir)->o == IR_KPTR || (ir)->o == IR_KKPTR, mref((ir)->ptr, void))[m
[31m-[m
[31m-/* A store or any other op with a non-weak guard has a side-effect. */[m
[31m-static LJ_AINLINE int ir_sideeff(IRIns *ir)[m
[31m-{[m
[31m-  return (((ir->t.irt | ~IRT_GUARD) & lj_ir_mode[ir->o]) >= IRM_S);[m
[31m-}[m
[31m-[m
[31m-LJ_STATIC_ASSERT((int)IRT_GUARD == (int)IRM_W);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ircall.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ircall.h[m
[1mdeleted file mode 100644[m
[1mindex 144135a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_ircall.h[m
[1m+++ /dev/null[m
[36m@@ -1,349 +0,0 @@[m
[31m-/*[m
[31m-** IR CALL* instruction definitions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_IRCALL_H[m
[31m-#define _LJ_IRCALL_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-/* C call info for CALL* instructions. */[m
[31m-typedef struct CCallInfo {[m
[31m-  ASMFunction func;		/* Function pointer. */[m
[31m-  uint32_t flags;		/* Number of arguments and flags. */[m
[31m-} CCallInfo;[m
[31m-[m
[31m-#define CCI_NARGS(ci)		((ci)->flags & 0xff)	/* # of args. */[m
[31m-#define CCI_NARGS_MAX		32			/* Max. # of args. */[m
[31m-[m
[31m-#define CCI_OTSHIFT		16[m
[31m-#define CCI_OPTYPE(ci)		((ci)->flags >> CCI_OTSHIFT)  /* Get op/type. */[m
[31m-#define CCI_OPSHIFT		24[m
[31m-#define CCI_OP(ci)		((ci)->flags >> CCI_OPSHIFT)  /* Get op. */[m
[31m-[m
[31m-#define CCI_CALL_N		(IR_CALLN << CCI_OPSHIFT)[m
[31m-#define CCI_CALL_A		(IR_CALLA << CCI_OPSHIFT)[m
[31m-#define CCI_CALL_L		(IR_CALLL << CCI_OPSHIFT)[m
[31m-#define CCI_CALL_S		(IR_CALLS << CCI_OPSHIFT)[m
[31m-#define CCI_CALL_FN		(CCI_CALL_N|CCI_CC_FASTCALL)[m
[31m-#define CCI_CALL_FL		(CCI_CALL_L|CCI_CC_FASTCALL)[m
[31m-#define CCI_CALL_FS		(CCI_CALL_S|CCI_CC_FASTCALL)[m
[31m-[m
[31m-/* C call info flags. */[m
[31m-#define CCI_L			0x0100	/* Implicit L arg. */[m
[31m-#define CCI_CASTU64		0x0200	/* Cast u64 result to number. */[m
[31m-#define CCI_NOFPRCLOBBER	0x0400	/* Does not clobber any FPRs. */[m
[31m-#define CCI_VARARG		0x0800	/* Vararg function. */[m
[31m-[m
[31m-#define CCI_CC_MASK		0x3000	/* Calling convention mask. */[m
[31m-#define CCI_CC_SHIFT		12[m
[31m-/* ORDER CC */[m
[31m-#define CCI_CC_CDECL		0x0000	/* Default cdecl calling convention. */[m
[31m-#define CCI_CC_THISCALL		0x1000	/* Thiscall calling convention. */[m
[31m-#define CCI_CC_FASTCALL		0x2000	/* Fastcall calling convention. */[m
[31m-#define CCI_CC_STDCALL		0x3000	/* Stdcall calling convention. */[m
[31m-[m
[31m-/* Extra args for SOFTFP, SPLIT 64 bit. */[m
[31m-#define CCI_XARGS_SHIFT		14[m
[31m-#define CCI_XARGS(ci)		(((ci)->flags >> CCI_XARGS_SHIFT) & 3)[m
[31m-#define CCI_XA			(1u << CCI_XARGS_SHIFT)[m
[31m-[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-#define CCI_XNARGS(ci)		(CCI_NARGS((ci)) + CCI_XARGS((ci)))[m
[31m-#else[m
[31m-#define CCI_XNARGS(ci)		CCI_NARGS((ci))[m
[31m-#endif[m
[31m-[m
[31m-/* Helpers for conditional function definitions. */[m
[31m-#define IRCALLCOND_ANY(x)		x[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#define IRCALLCOND_FPMATH(x)		NULL[m
[31m-#else[m
[31m-#define IRCALLCOND_FPMATH(x)		x[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-#define IRCALLCOND_SOFTFP(x)		x[m
[31m-#if LJ_HASFFI[m
[31m-#define IRCALLCOND_SOFTFP_FFI(x)	x[m
[31m-#else[m
[31m-#define IRCALLCOND_SOFTFP_FFI(x)	NULL[m
[31m-#endif[m
[31m-#else[m
[31m-#define IRCALLCOND_SOFTFP(x)		NULL[m
[31m-#define IRCALLCOND_SOFTFP_FFI(x)	NULL[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_SOFTFP && LJ_TARGET_MIPS[m
[31m-#define IRCALLCOND_SOFTFP_MIPS(x)	x[m
[31m-#else[m
[31m-#define IRCALLCOND_SOFTFP_MIPS(x)	NULL[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_NEED_FP64	(LJ_TARGET_ARM || LJ_TARGET_PPC || LJ_TARGET_MIPS)[m
[31m-[m
[31m-#if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)[m
[31m-#define IRCALLCOND_FP64_FFI(x)		x[m
[31m-#else[m
[31m-#define IRCALLCOND_FP64_FFI(x)		NULL[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-#define IRCALLCOND_FFI(x)		x[m
[31m-#if LJ_32[m
[31m-#define IRCALLCOND_FFI32(x)		x[m
[31m-#else[m
[31m-#define IRCALLCOND_FFI32(x)		NULL[m
[31m-#endif[m
[31m-#else[m
[31m-#define IRCALLCOND_FFI(x)		NULL[m
[31m-#define IRCALLCOND_FFI32(x)		NULL[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_X86[m
[31m-#define CCI_RANDFPR	0	/* Clang on OSX/x86 is overzealous. */[m
[31m-#else[m
[31m-#define CCI_RANDFPR	CCI_NOFPRCLOBBER[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-#define XA_FP		CCI_XA[m
[31m-#define XA2_FP		(CCI_XA+CCI_XA)[m
[31m-#else[m
[31m-#define XA_FP		0[m
[31m-#define XA2_FP		0[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_32[m
[31m-#define XA_64		CCI_XA[m
[31m-#define XA2_64		(CCI_XA+CCI_XA)[m
[31m-#else[m
[31m-#define XA_64		0[m
[31m-#define XA2_64		0[m
[31m-#endif[m
[31m-[m
[31m-/* Function definitions for CALL* instructions. */[m
[31m-#define IRCALLDEF(_) \[m
[31m-  _(ANY,	lj_str_cmp,		2,  FN, INT, CCI_NOFPRCLOBBER) \[m
[31m-  _(ANY,	lj_str_find,		4,   N, P32, 0) \[m
[31m-  _(ANY,	lj_str_new,		3,   S, STR, CCI_L) \[m
[31m-  _(ANY,	lj_strscan_num,		2,  FN, INT, 0) \[m
[31m-  _(ANY,	lj_strfmt_int,		2,  FN, STR, CCI_L) \[m
[31m-  _(ANY,	lj_strfmt_num,		2,  FN, STR, CCI_L) \[m
[31m-  _(ANY,	lj_strfmt_char,		2,  FN, STR, CCI_L) \[m
[31m-  _(ANY,	lj_strfmt_putint,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_strfmt_putnum,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_strfmt_putquoted,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_strfmt_putfxint,	3,   L, P32, XA_64) \[m
[31m-  _(ANY,	lj_strfmt_putfnum_int,	3,   L, P32, XA_FP) \[m
[31m-  _(ANY,	lj_strfmt_putfnum_uint,	3,   L, P32, XA_FP) \[m
[31m-  _(ANY,	lj_strfmt_putfnum,	3,   L, P32, XA_FP) \[m
[31m-  _(ANY,	lj_strfmt_putfstr,	3,   L, P32, 0) \[m
[31m-  _(ANY,	lj_strfmt_putfchar,	3,   L, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putmem,		3,   S, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr,		2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putchar,		2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr_reverse,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr_lower,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr_upper,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr_rep,	3,   L, P32, 0) \[m
[31m-  _(ANY,	lj_buf_puttab,		5,   L, P32, 0) \[m
[31m-  _(ANY,	lj_buf_tostr,		1,  FL, STR, 0) \[m
[31m-  _(ANY,	lj_tab_new_ah,		3,   A, TAB, CCI_L) \[m
[31m-  _(ANY,	lj_tab_new1,		2,  FS, TAB, CCI_L) \[m
[31m-  _(ANY,	lj_tab_dup,		2,  FS, TAB, CCI_L) \[m
[31m-  _(ANY,	lj_tab_clear,		1,  FS, NIL, 0) \[m
[31m-  _(ANY,	lj_tab_newkey,		3,   S, P32, CCI_L) \[m
[31m-  _(ANY,	lj_tab_len,		1,  FL, INT, 0) \[m
[31m-  _(ANY,	lj_gc_step_jit,		2,  FS, NIL, CCI_L) \[m
[31m-  _(ANY,	lj_gc_barrieruv,	2,  FS, NIL, 0) \[m
[31m-  _(ANY,	lj_mem_newgco,		2,  FS, P32, CCI_L) \[m
[31m-  _(ANY,	lj_math_random_step, 1, FS, NUM, CCI_CASTU64|CCI_RANDFPR)\[m
[31m-  _(ANY,	lj_vm_modi,		2,  FN, INT, 0) \[m
[31m-  _(ANY,	sinh,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	cosh,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	tanh,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	fputc,			2,   S, INT, 0) \[m
[31m-  _(ANY,	fwrite,			4,   S, INT, 0) \[m
[31m-  _(ANY,	fflush,			1,   S, INT, 0) \[m
[31m-  /* ORDER FPM */ \[m
[31m-  _(FPMATH,	lj_vm_floor,		1,   N, NUM, XA_FP) \[m
[31m-  _(FPMATH,	lj_vm_ceil,		1,   N, NUM, XA_FP) \[m
[31m-  _(FPMATH,	lj_vm_trunc,		1,   N, NUM, XA_FP) \[m
[31m-  _(FPMATH,	sqrt,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	exp,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	lj_vm_exp2,		1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	log,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	lj_vm_log2,		1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	log10,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	sin,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	cos,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	tan,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	lj_vm_powi,		2,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	pow,			2,   N, NUM, XA2_FP) \[m
[31m-  _(ANY,	atan2,			2,   N, NUM, XA2_FP) \[m
[31m-  _(ANY,	ldexp,			2,   N, NUM, XA_FP) \[m
[31m-  _(SOFTFP,	lj_vm_tobit,		2,   N, INT, 0) \[m
[31m-  _(SOFTFP,	softfp_add,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_sub,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_mul,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_div,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_cmp,		4,   N, NIL, 0) \[m
[31m-  _(SOFTFP,	softfp_i2d,		1,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_d2i,		2,   N, INT, 0) \[m
[31m-  _(SOFTFP_MIPS, lj_vm_sfmin,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP_MIPS, lj_vm_sfmax,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_ui2d,		1,   N, NUM, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_f2d,		1,   N, NUM, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_d2ui,		2,   N, INT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_d2f,		2,   N, FLOAT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_i2f,		1,   N, FLOAT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_ui2f,		1,   N, FLOAT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_f2i,		1,   N, INT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_f2ui,		1,   N, INT, 0) \[m
[31m-  _(FP64_FFI,	fp64_l2d,		1,   N, NUM, XA_64) \[m
[31m-  _(FP64_FFI,	fp64_ul2d,		1,   N, NUM, XA_64) \[m
[31m-  _(FP64_FFI,	fp64_l2f,		1,   N, FLOAT, XA_64) \[m
[31m-  _(FP64_FFI,	fp64_ul2f,		1,   N, FLOAT, XA_64) \[m
[31m-  _(FP64_FFI,	fp64_d2l,		1,   N, I64, XA_FP) \[m
[31m-  _(FP64_FFI,	fp64_d2ul,		1,   N, U64, XA_FP) \[m
[31m-  _(FP64_FFI,	fp64_f2l,		1,   N, I64, 0) \[m
[31m-  _(FP64_FFI,	fp64_f2ul,		1,   N, U64, 0) \[m
[31m-  _(FFI,	lj_carith_divi64,	2,   N, I64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_divu64,	2,   N, U64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_modi64,	2,   N, I64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_modu64,	2,   N, U64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_powi64,	2,   N, I64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_powu64,	2,   N, U64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_cdata_newv,		4,   S, CDATA, CCI_L) \[m
[31m-  _(FFI,	lj_cdata_setfin,	4,   S, NIL, CCI_L) \[m
[31m-  _(FFI,	strlen,			1,   L, INTP, 0) \[m
[31m-  _(FFI,	memcpy,			3,   S, PTR, 0) \[m
[31m-  _(FFI,	memset,			3,   S, PTR, 0) \[m
[31m-  _(FFI,	lj_vm_errno,		0,   S, INT, CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_mul64,	2,   N, I64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_shl64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_shr64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_sar64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_rol64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_ror64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  \[m
[31m-  /* End of list. */[m
[31m-[m
[31m-typedef enum {[m
[31m-#define IRCALLENUM(cond, name, nargs, kind, type, flags)	IRCALL_##name,[m
[31m-IRCALLDEF(IRCALLENUM)[m
[31m-#undef IRCALLENUM[m
[31m-  IRCALL__MAX[m
[31m-} IRCallID;[m
[31m-[m
[31m-LJ_FUNC TRef lj_ir_call(jit_State *J, IRCallID id, ...);[m
[31m-[m
[31m-LJ_DATA const CCallInfo lj_ir_callinfo[IRCALL__MAX+1];[m
[31m-[m
[31m-/* Soft-float declarations. */[m
[31m-#if LJ_SOFTFP[m
[31m-#if LJ_TARGET_ARM[m
[31m-#define softfp_add __aeabi_dadd[m
[31m-#define softfp_sub __aeabi_dsub[m
[31m-#define softfp_mul __aeabi_dmul[m
[31m-#define softfp_div __aeabi_ddiv[m
[31m-#define softfp_cmp __aeabi_cdcmple[m
[31m-#define softfp_i2d __aeabi_i2d[m
[31m-#define softfp_d2i __aeabi_d2iz[m
[31m-#define softfp_ui2d __aeabi_ui2d[m
[31m-#define softfp_f2d __aeabi_f2d[m
[31m-#define softfp_d2ui __aeabi_d2uiz[m
[31m-#define softfp_d2f __aeabi_d2f[m
[31m-#define softfp_i2f __aeabi_i2f[m
[31m-#define softfp_ui2f __aeabi_ui2f[m
[31m-#define softfp_f2i __aeabi_f2iz[m
[31m-#define softfp_f2ui __aeabi_f2uiz[m
[31m-#define fp64_l2d __aeabi_l2d[m
[31m-#define fp64_ul2d __aeabi_ul2d[m
[31m-#define fp64_l2f __aeabi_l2f[m
[31m-#define fp64_ul2f __aeabi_ul2f[m
[31m-#if LJ_TARGET_IOS[m
[31m-#define fp64_d2l __fixdfdi[m
[31m-#define fp64_d2ul __fixunsdfdi[m
[31m-#define fp64_f2l __fixsfdi[m
[31m-#define fp64_f2ul __fixunssfdi[m
[31m-#else[m
[31m-#define fp64_d2l __aeabi_d2lz[m
[31m-#define fp64_d2ul __aeabi_d2ulz[m
[31m-#define fp64_f2l __aeabi_f2lz[m
[31m-#define fp64_f2ul __aeabi_f2ulz[m
[31m-#endif[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#define softfp_add __adddf3[m
[31m-#define softfp_sub __subdf3[m
[31m-#define softfp_mul __muldf3[m
[31m-#define softfp_div __divdf3[m
[31m-#define softfp_cmp __ledf2[m
[31m-#define softfp_i2d __floatsidf[m
[31m-#define softfp_d2i __fixdfsi[m
[31m-#define softfp_ui2d __floatunsidf[m
[31m-#define softfp_f2d __extendsfdf2[m
[31m-#define softfp_d2ui __fixunsdfsi[m
[31m-#define softfp_d2f __truncdfsf2[m
[31m-#define softfp_i2f __floatsisf[m
[31m-#define softfp_ui2f __floatunsisf[m
[31m-#define softfp_f2i __fixsfsi[m
[31m-#define softfp_f2ui __fixunssfsi[m
[31m-#else[m
[31m-#error "Missing soft-float definitions for target architecture"[m
[31m-#endif[m
[31m-extern double softfp_add(double a, double b);[m
[31m-extern double softfp_sub(double a, double b);[m
[31m-extern double softfp_mul(double a, double b);[m
[31m-extern double softfp_div(double a, double b);[m
[31m-extern void softfp_cmp(double a, double b);[m
[31m-extern double softfp_i2d(int32_t a);[m
[31m-extern int32_t softfp_d2i(double a);[m
[31m-#if LJ_HASFFI[m
[31m-extern double softfp_ui2d(uint32_t a);[m
[31m-extern double softfp_f2d(float a);[m
[31m-extern uint32_t softfp_d2ui(double a);[m
[31m-extern float softfp_d2f(double a);[m
[31m-extern float softfp_i2f(int32_t a);[m
[31m-extern float softfp_ui2f(uint32_t a);[m
[31m-extern int32_t softfp_f2i(float a);[m
[31m-extern uint32_t softfp_f2ui(float a);[m
[31m-#endif[m
[31m-#if LJ_TARGET_MIPS[m
[31m-extern double lj_vm_sfmin(double a, double b);[m
[31m-extern double lj_vm_sfmax(double a, double b);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASFFI && LJ_NEED_FP64 && !(LJ_TARGET_ARM && LJ_SOFTFP)[m
[31m-#ifdef __GNUC__[m
[31m-#define fp64_l2d __floatdidf[m
[31m-#define fp64_ul2d __floatundidf[m
[31m-#define fp64_l2f __floatdisf[m
[31m-#define fp64_ul2f __floatundisf[m
[31m-#define fp64_d2l __fixdfdi[m
[31m-#define fp64_d2ul __fixunsdfdi[m
[31m-#define fp64_f2l __fixsfdi[m
[31m-#define fp64_f2ul __fixunssfdi[m
[31m-#else[m
[31m-#error "Missing fp64 helper definitions for this compiler"[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)[m
[31m-extern double fp64_l2d(int64_t a);[m
[31m-extern double fp64_ul2d(uint64_t a);[m
[31m-extern float fp64_l2f(int64_t a);[m
[31m-extern float fp64_ul2f(uint64_t a);[m
[31m-extern int64_t fp64_d2l(double a);[m
[31m-extern uint64_t fp64_d2ul(double a);[m
[31m-extern int64_t fp64_f2l(float a);[m
[31m-extern uint64_t fp64_f2ul(float a);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_iropt.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_iropt.h[m
[1mdeleted file mode 100644[m
[1mindex 67221c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_iropt.h[m
[1m+++ /dev/null[m
[36m@@ -1,162 +0,0 @@[m
[31m-/*[m
[31m-** Common header for IR emitter and optimizations.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_IROPT_H[m
[31m-#define _LJ_IROPT_H[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* IR emitter. */[m
[31m-LJ_FUNC void LJ_FASTCALL lj_ir_growtop(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_emit(jit_State *J);[m
[31m-[m
[31m-/* Save current IR in J->fold.ins, but do not emit it (yet). */[m
[31m-static LJ_AINLINE void lj_ir_set_(jit_State *J, uint16_t ot, IRRef1 a, IRRef1 b)[m
[31m-{[m
[31m-  J->fold.ins.ot = ot; J->fold.ins.op1 = a; J->fold.ins.op2 = b;[m
[31m-}[m
[31m-[m
[31m-#define lj_ir_set(J, ot, a, b) \[m
[31m-  lj_ir_set_(J, (uint16_t)(ot), (IRRef1)(a), (IRRef1)(b))[m
[31m-[m
[31m-/* Get ref of next IR instruction and optionally grow IR.[m
[31m-** Note: this may invalidate all IRIns*![m
[31m-*/[m
[31m-static LJ_AINLINE IRRef lj_ir_nextins(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref = J->cur.nins;[m
[31m-  if (LJ_UNLIKELY(ref >= J->irtoplim)) lj_ir_growtop(J);[m
[31m-  J->cur.nins = ref + 1;[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-/* Interning of constants. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_kint(jit_State *J, int32_t k);[m
[31m-LJ_FUNC void lj_ir_k64_freeall(jit_State *J);[m
[31m-LJ_FUNC TRef lj_ir_k64(jit_State *J, IROp op, cTValue *tv);[m
[31m-LJ_FUNC TValue *lj_ir_k64_reserve(jit_State *J);[m
[31m-LJ_FUNC cTValue *lj_ir_k64_find(jit_State *J, uint64_t u64);[m
[31m-LJ_FUNC TRef lj_ir_knum_u64(jit_State *J, uint64_t u64);[m
[31m-LJ_FUNC TRef lj_ir_knumint(jit_State *J, lua_Number n);[m
[31m-LJ_FUNC TRef lj_ir_kint64(jit_State *J, uint64_t u64);[m
[31m-LJ_FUNC TRef lj_ir_kgc(jit_State *J, GCobj *o, IRType t);[m
[31m-LJ_FUNC TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr);[m
[31m-LJ_FUNC TRef lj_ir_knull(jit_State *J, IRType t);[m
[31m-LJ_FUNC TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot);[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define lj_ir_kintp(J, k)	lj_ir_kint64(J, (uint64_t)(k))[m
[31m-#else[m
[31m-#define lj_ir_kintp(J, k)	lj_ir_kint(J, (int32_t)(k))[m
[31m-#endif[m
[31m-[m
[31m-static LJ_AINLINE TRef lj_ir_knum(jit_State *J, lua_Number n)[m
[31m-{[m
[31m-  TValue tv;[m
[31m-  tv.n = n;[m
[31m-  return lj_ir_knum_u64(J, tv.u64);[m
[31m-}[m
[31m-[m
[31m-#define lj_ir_kstr(J, str)	lj_ir_kgc(J, obj2gco((str)), IRT_STR)[m
[31m-#define lj_ir_ktab(J, tab)	lj_ir_kgc(J, obj2gco((tab)), IRT_TAB)[m
[31m-#define lj_ir_kfunc(J, func)	lj_ir_kgc(J, obj2gco((func)), IRT_FUNC)[m
[31m-#define lj_ir_kptr(J, ptr)	lj_ir_kptr_(J, IR_KPTR, (ptr))[m
[31m-#define lj_ir_kkptr(J, ptr)	lj_ir_kptr_(J, IR_KKPTR, (ptr))[m
[31m-[m
[31m-/* Special FP constants. */[m
[31m-#define lj_ir_knum_zero(J)	lj_ir_knum_u64(J, U64x(00000000,00000000))[m
[31m-#define lj_ir_knum_one(J)	lj_ir_knum_u64(J, U64x(3ff00000,00000000))[m
[31m-#define lj_ir_knum_tobit(J)	lj_ir_knum_u64(J, U64x(43380000,00000000))[m
[31m-[m
[31m-/* Special 128 bit SIMD constants. */[m
[31m-#define lj_ir_knum_abs(J)	lj_ir_k64(J, IR_KNUM, LJ_KSIMD(J, LJ_KSIMD_ABS))[m
[31m-#define lj_ir_knum_neg(J)	lj_ir_k64(J, IR_KNUM, LJ_KSIMD(J, LJ_KSIMD_NEG))[m
[31m-[m
[31m-/* Access to constants. */[m
[31m-LJ_FUNC void lj_ir_kvalue(lua_State *L, TValue *tv, const IRIns *ir);[m
[31m-[m
[31m-/* Convert IR operand types. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_tonumber(jit_State *J, TRef tr);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_tonum(jit_State *J, TRef tr);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_tostr(jit_State *J, TRef tr);[m
[31m-[m
[31m-/* Miscellaneous IR ops. */[m
[31m-LJ_FUNC int lj_ir_numcmp(lua_Number a, lua_Number b, IROp op);[m
[31m-LJ_FUNC int lj_ir_strcmp(GCstr *a, GCstr *b, IROp op);[m
[31m-LJ_FUNC void lj_ir_rollback(jit_State *J, IRRef ref);[m
[31m-[m
[31m-/* Emit IR instructions with on-the-fly optimizations. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fold(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_cse(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_cselim(jit_State *J, IRRef lim);[m
[31m-[m
[31m-/* Special return values for the fold functions. */[m
[31m-enum {[m
[31m-  NEXTFOLD,		/* Couldn't fold, pass on. */[m
[31m-  RETRYFOLD,		/* Retry fold with modified fins. */[m
[31m-  KINTFOLD,		/* Return ref for int constant in fins->i. */[m
[31m-  FAILFOLD,		/* Guard would always fail. */[m
[31m-  DROPFOLD,		/* Guard eliminated. */[m
[31m-  MAX_FOLD[m
[31m-};[m
[31m-[m
[31m-#define INTFOLD(k)	((J->fold.ins.i = (k)), (TRef)KINTFOLD)[m
[31m-#define INT64FOLD(k)	(lj_ir_kint64(J, (k)))[m
[31m-#define CONDFOLD(cond)	((TRef)FAILFOLD + (TRef)(cond))[m
[31m-#define LEFTFOLD	(J->fold.ins.op1)[m
[31m-#define RIGHTFOLD	(J->fold.ins.op2)[m
[31m-#define CSEFOLD		(lj_opt_cse(J))[m
[31m-#define EMITFOLD	(lj_ir_emit(J))[m
[31m-[m
[31m-/* Load/store forwarding. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_aload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_hload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J);[m
[31m-LJ_FUNC int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J);[m
[31m-LJ_FUNC int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim);[m
[31m-LJ_FUNC int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref);[m
[31m-[m
[31m-/* Dead-store elimination. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_ahstore(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_ustore(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_fstore(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_xstore(jit_State *J);[m
[31m-[m
[31m-/* Narrowing. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_convert(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_index(jit_State *J, TRef key);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_toint(jit_State *J, TRef tr);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_tobit(jit_State *J, TRef tr);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef key);[m
[31m-#endif[m
[31m-LJ_FUNC TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc,[m
[31m-				 TValue *vb, TValue *vc, IROp op);[m
[31m-LJ_FUNC TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc);[m
[31m-LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc);[m
[31m-LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc);[m
[31m-LJ_FUNC IRType lj_opt_narrow_forl(jit_State *J, cTValue *forbase);[m
[31m-[m
[31m-/* Optimization passes. */[m
[31m-LJ_FUNC void lj_opt_dce(jit_State *J);[m
[31m-LJ_FUNC int lj_opt_loop(jit_State *J);[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-LJ_FUNC void lj_opt_split(jit_State *J);[m
[31m-#else[m
[31m-#define lj_opt_split(J)		UNUSED(J)[m
[31m-#endif[m
[31m-LJ_FUNC void lj_opt_sink(jit_State *J);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_jit.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_jit.h[m
[1mdeleted file mode 100644[m
[1mindex 2bebd55..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_jit.h[m
[1m+++ /dev/null[m
[36m@@ -1,442 +0,0 @@[m
[31m-/*[m
[31m-** Common definitions for the JIT compiler.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_JIT_H[m
[31m-#define _LJ_JIT_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ir.h"[m
[31m-[m
[31m-/* JIT engine flags. */[m
[31m-#define JIT_F_ON		0x00000001[m
[31m-[m
[31m-/* CPU-specific JIT engine flags. */[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#define JIT_F_SSE2		0x00000010[m
[31m-#define JIT_F_SSE3		0x00000020[m
[31m-#define JIT_F_SSE4_1		0x00000040[m
[31m-#define JIT_F_PREFER_IMUL	0x00000080[m
[31m-#define JIT_F_LEA_AGU		0x00000100[m
[31m-#define JIT_F_BMI2		0x00000200[m
[31m-[m
[31m-/* Names for the CPU-specific flags. Must match the order above. */[m
[31m-#define JIT_F_CPU_FIRST		JIT_F_SSE2[m
[31m-#define JIT_F_CPUSTRING		"\4SSE2\4SSE3\6SSE4.1\3AMD\4ATOM\4BMI2"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#define JIT_F_ARMV6_		0x00000010[m
[31m-#define JIT_F_ARMV6T2_		0x00000020[m
[31m-#define JIT_F_ARMV7		0x00000040[m
[31m-#define JIT_F_VFPV2		0x00000080[m
[31m-#define JIT_F_VFPV3		0x00000100[m
[31m-[m
[31m-#define JIT_F_ARMV6		(JIT_F_ARMV6_|JIT_F_ARMV6T2_|JIT_F_ARMV7)[m
[31m-#define JIT_F_ARMV6T2		(JIT_F_ARMV6T2_|JIT_F_ARMV7)[m
[31m-#define JIT_F_VFP		(JIT_F_VFPV2|JIT_F_VFPV3)[m
[31m-[m
[31m-/* Names for the CPU-specific flags. Must match the order above. */[m
[31m-#define JIT_F_CPU_FIRST		JIT_F_ARMV6_[m
[31m-#define JIT_F_CPUSTRING		"\5ARMv6\7ARMv6T2\5ARMv7\5VFPv2\5VFPv3"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#define JIT_F_SQRT		0x00000010[m
[31m-#define JIT_F_ROUND		0x00000020[m
[31m-[m
[31m-/* Names for the CPU-specific flags. Must match the order above. */[m
[31m-#define JIT_F_CPU_FIRST		JIT_F_SQRT[m
[31m-#define JIT_F_CPUSTRING		"\4SQRT\5ROUND"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#define JIT_F_MIPS32R2		0x00000010[m
[31m-[m
[31m-/* Names for the CPU-specific flags. Must match the order above. */[m
[31m-#define JIT_F_CPU_FIRST		JIT_F_MIPS32R2[m
[31m-#define JIT_F_CPUSTRING		"\010MIPS32R2"[m
[31m-#else[m
[31m-#define JIT_F_CPU_FIRST		0[m
[31m-#define JIT_F_CPUSTRING		""[m
[31m-#endif[m
[31m-[m
[31m-/* Optimization flags. */[m
[31m-#define JIT_F_OPT_MASK		0x0fff0000[m
[31m-[m
[31m-#define JIT_F_OPT_FOLD		0x00010000[m
[31m-#define JIT_F_OPT_CSE		0x00020000[m
[31m-#define JIT_F_OPT_DCE		0x00040000[m
[31m-#define JIT_F_OPT_FWD		0x00080000[m
[31m-#define JIT_F_OPT_DSE		0x00100000[m
[31m-#define JIT_F_OPT_NARROW	0x00200000[m
[31m-#define JIT_F_OPT_LOOP		0x00400000[m
[31m-#define JIT_F_OPT_ABC		0x00800000[m
[31m-#define JIT_F_OPT_SINK		0x01000000[m
[31m-#define JIT_F_OPT_FUSE		0x02000000[m
[31m-[m
[31m-/* Optimizations names for -O. Must match the order above. */[m
[31m-#define JIT_F_OPT_FIRST		JIT_F_OPT_FOLD[m
[31m-#define JIT_F_OPTSTRING	\[m
[31m-  "\4fold\3cse\3dce\3fwd\3dse\6narrow\4loop\3abc\4sink\4fuse"[m
[31m-[m
[31m-/* Optimization levels set a fixed combination of flags. */[m
[31m-#define JIT_F_OPT_0	0[m
[31m-#define JIT_F_OPT_1	(JIT_F_OPT_FOLD|JIT_F_OPT_CSE|JIT_F_OPT_DCE)[m
[31m-#define JIT_F_OPT_2	(JIT_F_OPT_1|JIT_F_OPT_NARROW|JIT_F_OPT_LOOP)[m
[31m-#define JIT_F_OPT_3	(JIT_F_OPT_2|\[m
[31m-  JIT_F_OPT_FWD|JIT_F_OPT_DSE|JIT_F_OPT_ABC|JIT_F_OPT_SINK|JIT_F_OPT_FUSE)[m
[31m-#define JIT_F_OPT_DEFAULT	JIT_F_OPT_3[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS || LJ_64[m
[31m-/* See: http://blogs.msdn.com/oldnewthing/archive/2003/10/08/55239.aspx */[m
[31m-#define JIT_P_sizemcode_DEFAULT		64[m
[31m-#else[m
[31m-/* Could go as low as 4K, but the mmap() overhead would be rather high. */[m
[31m-#define JIT_P_sizemcode_DEFAULT		32[m
[31m-#endif[m
[31m-[m
[31m-/* Optimization parameters and their defaults. Length is a char in octal! */[m
[31m-#define JIT_PARAMDEF(_) \[m
[31m-  _(\010, maxtrace,	1000)	/* Max. # of traces in cache. */ \[m
[31m-  _(\011, maxrecord,	4000)	/* Max. # of recorded IR instructions. */ \[m
[31m-  _(\012, maxirconst,	500)	/* Max. # of IR constants of a trace. */ \[m
[31m-  _(\007, maxside,	100)	/* Max. # of side traces of a root trace. */ \[m
[31m-  _(\007, maxsnap,	500)	/* Max. # of snapshots for a trace. */ \[m
[31m-  _(\011, minstitch,	1000000)	/* Min. # of IR ins for a stitched trace. */ \[m
[31m-  \[m
[31m-  _(\007, hotloop,	56)	/* # of iter. to detect a hot loop/call. */ \[m
[31m-  _(\007, hotexit,	10)	/* # of taken exits to start a side trace. */ \[m
[31m-  _(\007, tryside,	4)	/* # of attempts to compile a side trace. */ \[m
[31m-  \[m
[31m-  _(\012, instunroll,	4)	/* Max. unroll for instable loops. */ \[m
[31m-  _(\012, loopunroll,	15)	/* Max. unroll for loop ops in side traces. */ \[m
[31m-  _(\012, callunroll,	3)	/* Max. unroll for recursive calls. */ \[m
[31m-  _(\011, recunroll,	2)	/* Min. unroll for true recursion. */ \[m
[31m-  \[m
[31m-  /* Size of each machine code area (in KBytes). */ \[m
[31m-  _(\011, sizemcode,	JIT_P_sizemcode_DEFAULT) \[m
[31m-  /* Max. total size of all machine code areas (in KBytes). */ \[m
[31m-  _(\010, maxmcode,	512) \[m
[31m-  /* End of list. */[m
[31m-[m
[31m-enum {[m
[31m-#define JIT_PARAMENUM(len, name, value)	JIT_P_##name,[m
[31m-JIT_PARAMDEF(JIT_PARAMENUM)[m
[31m-#undef JIT_PARAMENUM[m
[31m-  JIT_P__MAX[m
[31m-};[m
[31m-[m
[31m-#define JIT_PARAMSTR(len, name, value)	#len #name[m
[31m-#define JIT_P_STRING	JIT_PARAMDEF(JIT_PARAMSTR)[m
[31m-[m
[31m-/* Trace compiler state. */[m
[31m-typedef enum {[m
[31m-  LJ_TRACE_IDLE,	/* Trace compiler idle. */[m
[31m-  LJ_TRACE_ACTIVE = 0x10,[m
[31m-  LJ_TRACE_RECORD,	/* Bytecode recording active. */[m
[31m-  LJ_TRACE_START,	/* New trace started. */[m
[31m-  LJ_TRACE_END,		/* End of trace. */[m
[31m-  LJ_TRACE_ASM,		/* Assemble trace. */[m
[31m-  LJ_TRACE_ERR		/* Trace aborted with error. */[m
[31m-} TraceState;[m
[31m-[m
[31m-/* Post-processing action. */[m
[31m-typedef enum {[m
[31m-  LJ_POST_NONE,		/* No action. */[m
[31m-  LJ_POST_FIXCOMP,	/* Fixup comparison and emit pending guard. */[m
[31m-  LJ_POST_FIXGUARD,	/* Fixup and emit pending guard. */[m
[31m-  LJ_POST_FIXGUARDSNAP,	/* Fixup and emit pending guard and snapshot. */[m
[31m-  LJ_POST_FIXBOOL,	/* Fixup boolean result. */[m
[31m-  LJ_POST_FIXCONST,	/* Fixup constant results. */[m
[31m-  LJ_POST_FFRETRY	/* Suppress recording of retried fast functions. */[m
[31m-} PostProc;[m
[31m-[m
[31m-/* Machine code type. */[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-typedef uint8_t MCode;[m
[31m-#else[m
[31m-typedef uint32_t MCode;[m
[31m-#endif[m
[31m-[m
[31m-/* Stack snapshot header. */[m
[31m-typedef struct SnapShot {[m
[31m-  uint16_t mapofs;	/* Offset into snapshot map. */[m
[31m-  IRRef1 ref;		/* First IR ref for this snapshot. */[m
[31m-  uint8_t nslots;	/* Number of valid slots. */[m
[31m-  uint8_t topslot;	/* Maximum frame extent. */[m
[31m-  uint8_t nent;		/* Number of compressed entries. */[m
[31m-  uint8_t count;	/* Count of taken exits for this snapshot. */[m
[31m-} SnapShot;[m
[31m-[m
[31m-#define SNAPCOUNT_DONE	255	/* Already compiled and linked a side trace. */[m
[31m-[m
[31m-/* Compressed snapshot entry. */[m
[31m-typedef uint32_t SnapEntry;[m
[31m-[m
[31m-#define SNAP_FRAME		0x010000	/* Frame slot. */[m
[31m-#define SNAP_CONT		0x020000	/* Continuation slot. */[m
[31m-#define SNAP_NORESTORE		0x040000	/* No need to restore slot. */[m
[31m-#define SNAP_SOFTFPNUM		0x080000	/* Soft-float number. */[m
[31m-LJ_STATIC_ASSERT(SNAP_FRAME == TREF_FRAME);[m
[31m-LJ_STATIC_ASSERT(SNAP_CONT == TREF_CONT);[m
[31m-[m
[31m-#define SNAP(slot, flags, ref)	(((SnapEntry)(slot) << 24) + (flags) + (ref))[m
[31m-#define SNAP_TR(slot, tr) \[m
[31m-  (((SnapEntry)(slot) << 24) + ((tr) & (TREF_CONT|TREF_FRAME|TREF_REFMASK)))[m
[31m-#define SNAP_MKPC(pc)		((SnapEntry)u32ptr(pc))[m
[31m-#define SNAP_MKFTSZ(ftsz)	((SnapEntry)(ftsz))[m
[31m-#define snap_ref(sn)		((sn) & 0xffff)[m
[31m-#define snap_slot(sn)		((BCReg)((sn) >> 24))[m
[31m-#define snap_isframe(sn)	((sn) & SNAP_FRAME)[m
[31m-#define snap_pc(sn)		((const BCIns *)(uintptr_t)(sn))[m
[31m-#define snap_setref(sn, ref)	(((sn) & (0xffff0000&~SNAP_NORESTORE)) | (ref))[m
[31m-[m
[31m-/* Snapshot and exit numbers. */[m
[31m-typedef uint32_t SnapNo;[m
[31m-typedef uint32_t ExitNo;[m
[31m-[m
[31m-/* Trace number. */[m
[31m-typedef uint32_t TraceNo;	/* Used to pass around trace numbers. */[m
[31m-typedef uint16_t TraceNo1;	/* Stored trace number. */[m
[31m-[m
[31m-/* Type of link. ORDER LJ_TRLINK */[m
[31m-typedef enum {[m
[31m-  LJ_TRLINK_NONE,		/* Incomplete trace. No link, yet. */[m
[31m-  LJ_TRLINK_ROOT,		/* Link to other root trace. */[m
[31m-  LJ_TRLINK_LOOP,		/* Loop to same trace. */[m
[31m-  LJ_TRLINK_TAILREC,		/* Tail-recursion. */[m
[31m-  LJ_TRLINK_UPREC,		/* Up-recursion. */[m
[31m-  LJ_TRLINK_DOWNREC,		/* Down-recursion. */[m
[31m-  LJ_TRLINK_INTERP,		/* Fallback to interpreter. */[m
[31m-  LJ_TRLINK_RETURN,		/* Return to interpreter. */[m
[31m-  LJ_TRLINK_STITCH		/* Trace stitching. */[m
[31m-} TraceLink;[m
[31m-[m
[31m-/* Trace object. */[m
[31m-typedef struct GCtrace {[m
[31m-  GCHeader;[m
[31m-  uint8_t topslot;	/* Top stack slot already checked to be allocated. */[m
[31m-  uint8_t linktype;	/* Type of link. */[m
[31m-  IRRef nins;		/* Next IR instruction. Biased with REF_BIAS. */[m
[31m-#if LJ_GC64[m
[31m-  uint32_t unused_gc64;[m
[31m-#endif[m
[31m-  GCRef gclist;[m
[31m-  IRIns *ir;		/* IR instructions/constants. Biased with REF_BIAS. */[m
[31m-  IRRef nk;		/* Lowest IR constant. Biased with REF_BIAS. */[m
[31m-  uint16_t nsnap;	/* Number of snapshots. */[m
[31m-  uint16_t nsnapmap;	/* Number of snapshot map elements. */[m
[31m-  SnapShot *snap;	/* Snapshot array. */[m
[31m-  SnapEntry *snapmap;	/* Snapshot map. */[m
[31m-  GCRef startpt;	/* Starting prototype. */[m
[31m-  MRef startpc;		/* Bytecode PC of starting instruction. */[m
[31m-  BCIns startins;	/* Original bytecode of starting instruction. */[m
[31m-  MSize szmcode;	/* Size of machine code. */[m
[31m-  MCode *mcode;		/* Start of machine code. */[m
[31m-  MSize mcloop;		/* Offset of loop start in machine code. */[m
[31m-  uint16_t nchild;	/* Number of child traces (root trace only). */[m
[31m-  uint16_t spadjust;	/* Stack pointer adjustment (offset in bytes). */[m
[31m-  TraceNo1 traceno;	/* Trace number. */[m
[31m-  TraceNo1 link;	/* Linked trace (or self for loops). */[m
[31m-  TraceNo1 root;	/* Root trace of side trace (or 0 for root traces). */[m
[31m-  TraceNo1 nextroot;	/* Next root trace for same prototype. */[m
[31m-  TraceNo1 nextside;	/* Next side trace of same root trace. */[m
[31m-  uint8_t sinktags;	/* Trace has SINK tags. */[m
[31m-  uint8_t unused1;[m
[31m-#ifdef LUAJIT_USE_GDBJIT[m
[31m-  void *gdbjit_entry;	/* GDB JIT entry. */[m
[31m-#endif[m
[31m-} GCtrace;[m
[31m-[m
[31m-#define gco2trace(o)	check_exp((o)->gch.gct == ~LJ_TTRACE, (GCtrace *)(o))[m
[31m-#define traceref(J, n) \[m
[31m-  check_exp((n)>0 && (MSize)(n)<J->sizetrace, (GCtrace *)gcref(J->trace[(n)]))[m
[31m-[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCtrace, gclist));[m
[31m-[m
[31m-static LJ_AINLINE MSize snap_nextofs(GCtrace *T, SnapShot *snap)[m
[31m-{[m
[31m-  if (snap+1 == &T->snap[T->nsnap])[m
[31m-    return T->nsnapmap;[m
[31m-  else[m
[31m-    return (snap+1)->mapofs;[m
[31m-}[m
[31m-[m
[31m-/* Round-robin penalty cache for bytecodes leading to aborted traces. */[m
[31m-typedef struct HotPenalty {[m
[31m-  MRef pc;		/* Starting bytecode PC. */[m
[31m-  uint16_t val;		/* Penalty value, i.e. hotcount start. */[m
[31m-  uint16_t reason;	/* Abort reason (really TraceErr). */[m
[31m-} HotPenalty;[m
[31m-[m
[31m-#define PENALTY_SLOTS	64	/* Penalty cache slot. Must be a power of 2. */[m
[31m-#define PENALTY_MIN	(36*2)	/* Minimum penalty value. */[m
[31m-#define PENALTY_MAX	60000	/* Maximum penalty value. */[m
[31m-#define PENALTY_RNDBITS	4	/* # of random bits to add to penalty value. */[m
[31m-[m
[31m-/* Round-robin backpropagation cache for narrowing conversions. */[m
[31m-typedef struct BPropEntry {[m
[31m-  IRRef1 key;		/* Key: original reference. */[m
[31m-  IRRef1 val;		/* Value: reference after conversion. */[m
[31m-  IRRef mode;		/* Mode for this entry (currently IRCONV_*). */[m
[31m-} BPropEntry;[m
[31m-[m
[31m-/* Number of slots for the backpropagation cache. Must be a power of 2. */[m
[31m-#define BPROP_SLOTS	16[m
[31m-[m
[31m-/* Scalar evolution analysis cache. */[m
[31m-typedef struct ScEvEntry {[m
[31m-  MRef pc;		/* Bytecode PC of FORI. */[m
[31m-  IRRef1 idx;		/* Index reference. */[m
[31m-  IRRef1 start;		/* Constant start reference. */[m
[31m-  IRRef1 stop;		/* Constant stop reference. */[m
[31m-  IRRef1 step;		/* Constant step reference. */[m
[31m-  IRType1 t;		/* Scalar type. */[m
[31m-  uint8_t dir;		/* Direction. 1: +, 0: -. */[m
[31m-} ScEvEntry;[m
[31m-[m
[31m-/* Reverse bytecode map (IRRef -> PC). Only for selected instructions. */[m
[31m-typedef struct RBCHashEntry {[m
[31m-  MRef pc;		/* Bytecode PC. */[m
[31m-  GCRef pt;		/* Prototype. */[m
[31m-  IRRef ref;		/* IR reference. */[m
[31m-} RBCHashEntry;[m
[31m-[m
[31m-/* Number of slots in the reverse bytecode hash table. Must be a power of 2. */[m
[31m-#define RBCHASH_SLOTS	8[m
[31m-[m
[31m-/* 128 bit SIMD constants. */[m
[31m-enum {[m
[31m-  LJ_KSIMD_ABS,[m
[31m-  LJ_KSIMD_NEG,[m
[31m-  LJ_KSIMD__MAX[m
[31m-};[m
[31m-[m
[31m-/* Get 16 byte aligned pointer to SIMD constant. */[m
[31m-#define LJ_KSIMD(J, n) \[m
[31m-  ((TValue *)(((intptr_t)&J->ksimd[2*(n)] + 15) & ~(intptr_t)15))[m
[31m-[m
[31m-/* Set/reset flag to activate the SPLIT pass for the current trace. */[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-#define lj_needsplit(J)		(J->needsplit = 1)[m
[31m-#define lj_resetsplit(J)	(J->needsplit = 0)[m
[31m-#else[m
[31m-#define lj_needsplit(J)		UNUSED(J)[m
[31m-#define lj_resetsplit(J)	UNUSED(J)[m
[31m-#endif[m
[31m-[m
[31m-/* Fold state is used to fold instructions on-the-fly. */[m
[31m-typedef struct FoldState {[m
[31m-  IRIns ins;		/* Currently emitted instruction. */[m
[31m-  IRIns left;		/* Instruction referenced by left operand. */[m
[31m-  IRIns right;		/* Instruction referenced by right operand. */[m
[31m-} FoldState;[m
[31m-[m
[31m-/* JIT compiler state. */[m
[31m-typedef struct jit_State {[m
[31m-  GCtrace cur;		/* Current trace. */[m
[31m-[m
[31m-  lua_State *L;		/* Current Lua state. */[m
[31m-  const BCIns *pc;	/* Current PC. */[m
[31m-  GCfunc *fn;		/* Current function. */[m
[31m-  GCproto *pt;		/* Current prototype. */[m
[31m-  TRef *base;		/* Current frame base, points into J->slots. */[m
[31m-[m
[31m-  uint32_t flags;	/* JIT engine flags. */[m
[31m-  BCReg maxslot;	/* Relative to baseslot. */[m
[31m-  BCReg baseslot;	/* Current frame base, offset into J->slots. */[m
[31m-[m
[31m-  uint8_t mergesnap;	/* Allowed to merge with next snapshot. */[m
[31m-  uint8_t needsnap;	/* Need snapshot before recording next bytecode. */[m
[31m-  IRType1 guardemit;	/* Accumulated IRT_GUARD for emitted instructions. */[m
[31m-  uint8_t bcskip;	/* Number of bytecode instructions to skip. */[m
[31m-[m
[31m-  FoldState fold;	/* Fold state. */[m
[31m-[m
[31m-  const BCIns *bc_min;	/* Start of allowed bytecode range for root trace. */[m
[31m-  MSize bc_extent;	/* Extent of the range. */[m
[31m-[m
[31m-  TraceState state;	/* Trace compiler state. */[m
[31m-[m
[31m-  int32_t instunroll;	/* Unroll counter for instable loops. */[m
[31m-  int32_t loopunroll;	/* Unroll counter for loop ops in side traces. */[m
[31m-  int32_t tailcalled;	/* Number of successive tailcalls. */[m
[31m-  int32_t framedepth;	/* Current frame depth. */[m
[31m-  int32_t retdepth;	/* Return frame depth (count of RETF). */[m
[31m-[m
[31m-  MRef k64;		/* Pointer to chained array of 64 bit constants. */[m
[31m-  TValue ksimd[LJ_KSIMD__MAX*2+1];  /* 16 byte aligned SIMD constants. */[m
[31m-[m
[31m-  IRIns *irbuf;		/* Temp. IR instruction buffer. Biased with REF_BIAS. */[m
[31m-  IRRef irtoplim;	/* Upper limit of instuction buffer (biased). */[m
[31m-  IRRef irbotlim;	/* Lower limit of instuction buffer (biased). */[m
[31m-  IRRef loopref;	/* Last loop reference or ref of final LOOP (or 0). */[m
[31m-[m
[31m-  MSize sizesnap;	/* Size of temp. snapshot buffer. */[m
[31m-  SnapShot *snapbuf;	/* Temp. snapshot buffer. */[m
[31m-  SnapEntry *snapmapbuf;  /* Temp. snapshot map buffer. */[m
[31m-  MSize sizesnapmap;	/* Size of temp. snapshot map buffer. */[m
[31m-[m
[31m-  PostProc postproc;	/* Required post-processing after execution. */[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-  uint8_t needsplit;	/* Need SPLIT pass. */[m
[31m-#endif[m
[31m-  uint8_t retryrec;	/* Retry recording. */[m
[31m-[m
[31m-  GCRef *trace;		/* Array of traces. */[m
[31m-  TraceNo freetrace;	/* Start of scan for next free trace. */[m
[31m-  MSize sizetrace;	/* Size of trace array. */[m
[31m-  TValue *ktracep;	/* Pointer to K64Array slot with GCtrace pointer. */[m
[31m-[m
[31m-  IRRef1 chain[IR__MAX];  /* IR instruction skip-list chain anchors. */[m
[31m-  TRef slot[LJ_MAX_JSLOTS+LJ_STACK_EXTRA];  /* Stack slot map. */[m
[31m-[m
[31m-  int32_t param[JIT_P__MAX];  /* JIT engine parameters. */[m
[31m-[m
[31m-  MCode *exitstubgroup[LJ_MAX_EXITSTUBGR];  /* Exit stub group addresses. */[m
[31m-[m
[31m-  HotPenalty penalty[PENALTY_SLOTS];  /* Penalty slots. */[m
[31m-  uint32_t penaltyslot;	/* Round-robin index into penalty slots. */[m
[31m-  uint32_t prngstate;	/* PRNG state. */[m
[31m-[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  RBCHashEntry rbchash[RBCHASH_SLOTS];  /* Reverse bytecode map. */[m
[31m-#endif[m
[31m-[m
[31m-  BPropEntry bpropcache[BPROP_SLOTS];  /* Backpropagation cache slots. */[m
[31m-  uint32_t bpropslot;	/* Round-robin index into bpropcache slots. */[m
[31m-[m
[31m-  ScEvEntry scev;	/* Scalar evolution analysis cache slots. */[m
[31m-[m
[31m-  const BCIns *startpc;	/* Bytecode PC of starting instruction. */[m
[31m-  TraceNo parent;	/* Parent of current side trace (0 for root traces). */[m
[31m-  ExitNo exitno;	/* Exit number in parent of current side trace. */[m
[31m-[m
[31m-  BCIns *patchpc;	/* PC for pending re-patch. */[m
[31m-  BCIns patchins;	/* Instruction for pending re-patch. */[m
[31m-[m
[31m-  int mcprot;		/* Protection of current mcode area. */[m
[31m-  MCode *mcarea;	/* Base of current mcode area. */[m
[31m-  MCode *mctop;		/* Top of current mcode area. */[m
[31m-  MCode *mcbot;		/* Bottom of current mcode area. */[m
[31m-  size_t szmcarea;	/* Size of current mcode area. */[m
[31m-  size_t szallmcarea;	/* Total size of all allocated mcode areas. */[m
[31m-[m
[31m-  TValue errinfo;	/* Additional info element for trace errors. */[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-  GCproto *prev_pt;	/* Previous prototype. */[m
[31m-  BCLine prev_line;	/* Previous line. */[m
[31m-  int prof_mode;	/* Profiling mode: 0, 'f', 'l'. */[m
[31m-#endif[m
[31m-}[m
[31m-#if LJ_TARGET_ARM[m
[31m-LJ_ALIGN(16)		/* For DISPATCH-relative addresses in assembler part. */[m
[31m-#endif[m
[31m-jit_State;[m
[31m-[m
[31m-/* Trivial PRNG e.g. used for penalty randomization. */[m
[31m-static LJ_AINLINE uint32_t LJ_PRNG_BITS(jit_State *J, int bits)[m
[31m-{[m
[31m-  /* Yes, this LCG is very weak, but that doesn't matter for our use case. */[m
[31m-  J->prngstate = J->prngstate * 1103515245 + 12345;[m
[31m-  return J->prngstate >> (32-bits);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.c[m
[1mdeleted file mode 100644[m
[1mindex 0187c42..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.c[m
[1m+++ /dev/null[m
[36m@@ -1,509 +0,0 @@[m
[31m-/*[m
[31m-** Lexical analyzer.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_lex_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lualib.h"[m
[31m-#endif[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_parse.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Lua lexer token names. */[m
[31m-static const char *const tokennames[] = {[m
[31m-#define TKSTR1(name)		#name,[m
[31m-#define TKSTR2(name, sym)	#sym,[m
[31m-TKDEF(TKSTR1, TKSTR2)[m
[31m-#undef TKSTR1[m
[31m-#undef TKSTR2[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-/* -- Buffer handling ----------------------------------------------------- */[m
[31m-[m
[31m-#define LEX_EOF			(-1)[m
[31m-#define lex_iseol(ls)		(ls->c == '\n' || ls->c == '\r')[m
[31m-[m
[31m-/* Get more input from reader. */[m
[31m-static LJ_NOINLINE LexChar lex_more(LexState *ls)[m
[31m-{[m
[31m-  size_t sz;[m
[31m-  const char *p = ls->rfunc(ls->L, ls->rdata, &sz);[m
[31m-  if (p == NULL || sz == 0) return LEX_EOF;[m
[31m-  ls->pe = p + sz;[m
[31m-  ls->p = p + 1;[m
[31m-  return (LexChar)(uint8_t)p[0];[m
[31m-}[m
[31m-[m
[31m-/* Get next character. */[m
[31m-static LJ_AINLINE LexChar lex_next(LexState *ls)[m
[31m-{[m
[31m-  return (ls->c = ls->p < ls->pe ? (LexChar)(uint8_t)*ls->p++ : lex_more(ls));[m
[31m-}[m
[31m-[m
[31m-/* Save character. */[m
[31m-static LJ_AINLINE void lex_save(LexState *ls, LexChar c)[m
[31m-{[m
[31m-  lj_buf_putb(&ls->sb, c);[m
[31m-}[m
[31m-[m
[31m-/* Save previous character and get next character. */[m
[31m-static LJ_AINLINE LexChar lex_savenext(LexState *ls)[m
[31m-{[m
[31m-  lex_save(ls, ls->c);[m
[31m-  return lex_next(ls);[m
[31m-}[m
[31m-[m
[31m-/* Skip line break. Handles "\n", "\r", "\r\n" or "\n\r". */[m
[31m-static void lex_newline(LexState *ls)[m
[31m-{[m
[31m-  LexChar old = ls->c;[m
[31m-  lua_assert(lex_iseol(ls));[m
[31m-  lex_next(ls);  /* Skip "\n" or "\r". */[m
[31m-  if (lex_iseol(ls) && ls->c != old) lex_next(ls);  /* Skip "\n\r" or "\r\n". */[m
[31m-  if (++ls->linenumber >= LJ_MAX_LINE)[m
[31m-    lj_lex_error(ls, ls->tok, LJ_ERR_XLINES);[m
[31m-}[m
[31m-[m
[31m-/* -- Scanner for terminals ----------------------------------------------- */[m
[31m-[m
[31m-/* Parse a number literal. */[m
[31m-static void lex_number(LexState *ls, TValue *tv)[m
[31m-{[m
[31m-  StrScanFmt fmt;[m
[31m-  LexChar c, xp = 'e';[m
[31m-  lua_assert(lj_char_isdigit(ls->c));[m
[31m-  if ((c = ls->c) == '0' && (lex_savenext(ls) | 0x20) == 'x')[m
[31m-    xp = 'p';[m
[31m-  while (lj_char_isident(ls->c) || ls->c == '.' ||[m
[31m-	 ((ls->c == '-' || ls->c == '+') && (c | 0x20) == xp)) {[m
[31m-    c = ls->c;[m
[31m-    lex_savenext(ls);[m
[31m-  }[m
[31m-  lex_save(ls, '\0');[m
[31m-  fmt = lj_strscan_scan((const uint8_t *)sbufB(&ls->sb), tv,[m
[31m-	  (LJ_DUALNUM ? STRSCAN_OPT_TOINT : STRSCAN_OPT_TONUM) |[m
[31m-	  (LJ_HASFFI ? (STRSCAN_OPT_LL|STRSCAN_OPT_IMAG) : 0));[m
[31m-  if (LJ_DUALNUM && fmt == STRSCAN_INT) {[m
[31m-    setitype(tv, LJ_TISNUM);[m
[31m-  } else if (fmt == STRSCAN_NUM) {[m
[31m-    /* Already in correct format. */[m
[31m-#if LJ_HASFFI[m
[31m-  } else if (fmt != STRSCAN_ERROR) {[m
[31m-    lua_State *L = ls->L;[m
[31m-    GCcdata *cd;[m
[31m-    lua_assert(fmt == STRSCAN_I64 || fmt == STRSCAN_U64 || fmt == STRSCAN_IMAG);[m
[31m-    if (!ctype_ctsG(G(L))) {[m
[31m-      ptrdiff_t oldtop = savestack(L, L->top);[m
[31m-      luaopen_ffi(L);  /* Load FFI library on-demand. */[m
[31m-      L->top = restorestack(L, oldtop);[m
[31m-    }[m
[31m-    if (fmt == STRSCAN_IMAG) {[m
[31m-      cd = lj_cdata_new_(L, CTID_COMPLEX_DOUBLE, 2*sizeof(double));[m
[31m-      ((double *)cdataptr(cd))[0] = 0;[m
[31m-      ((double *)cdataptr(cd))[1] = numV(tv);[m
[31m-    } else {[m
[31m-      cd = lj_cdata_new_(L, fmt==STRSCAN_I64 ? CTID_INT64 : CTID_UINT64, 8);[m
[31m-      *(uint64_t *)cdataptr(cd) = tv->u64;[m
[31m-    }[m
[31m-    lj_parse_keepcdata(ls, tv, cd);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    lua_assert(fmt == STRSCAN_ERROR);[m
[31m-    lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Skip equal signs for "[=...=[" and "]=...=]" and return their count. */[m
[31m-static int lex_skipeq(LexState *ls)[m
[31m-{[m
[31m-  int count = 0;[m
[31m-  LexChar s = ls->c;[m
[31m-  lua_assert(s == '[' || s == ']');[m
[31m-  while (lex_savenext(ls) == '=')[m
[31m-    count++;[m
[31m-  return (ls->c == s) ? count : (-count) - 1;[m
[31m-}[m
[31m-[m
[31m-/* Parse a long string or long comment (tv set to NULL). */[m
[31m-static void lex_longstring(LexState *ls, TValue *tv, int sep)[m
[31m-{[m
[31m-  lex_savenext(ls);  /* Skip second '['. */[m
[31m-  if (lex_iseol(ls))  /* Skip initial newline. */[m
[31m-    lex_newline(ls);[m
[31m-  for (;;) {[m
[31m-    switch (ls->c) {[m
[31m-    case LEX_EOF:[m
[31m-      lj_lex_error(ls, TK_eof, tv ? LJ_ERR_XLSTR : LJ_ERR_XLCOM);[m
[31m-      break;[m
[31m-    case ']':[m
[31m-      if (lex_skipeq(ls) == sep) {[m
[31m-	lex_savenext(ls);  /* Skip second ']'. */[m
[31m-	goto endloop;[m
[31m-      }[m
[31m-      break;[m
[31m-    case '\n':[m
[31m-    case '\r':[m
[31m-      lex_save(ls, '\n');[m
[31m-      lex_newline(ls);[m
[31m-      if (!tv) lj_buf_reset(&ls->sb);  /* Don't waste space for comments. */[m
[31m-      break;[m
[31m-    default:[m
[31m-      lex_savenext(ls);[m
[31m-      break;[m
[31m-    }[m
[31m-  } endloop:[m
[31m-  if (tv) {[m
[31m-    GCstr *str = lj_parse_keepstr(ls, sbufB(&ls->sb) + (2 + (MSize)sep),[m
[31m-				      sbuflen(&ls->sb) - 2*(2 + (MSize)sep));[m
[31m-    setstrV(ls->L, tv, str);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse a string. */[m
[31m-static void lex_string(LexState *ls, TValue *tv)[m
[31m-{[m
[31m-  LexChar delim = ls->c;  /* Delimiter is '\'' or '"'. */[m
[31m-  lex_savenext(ls);[m
[31m-  while (ls->c != delim) {[m
[31m-    switch (ls->c) {[m
[31m-    case LEX_EOF:[m
[31m-      lj_lex_error(ls, TK_eof, LJ_ERR_XSTR);[m
[31m-      continue;[m
[31m-    case '\n':[m
[31m-    case '\r':[m
[31m-      lj_lex_error(ls, TK_string, LJ_ERR_XSTR);[m
[31m-      continue;[m
[31m-    case '\\': {[m
[31m-      LexChar c = lex_next(ls);  /* Skip the '\\'. */[m
[31m-      switch (c) {[m
[31m-      case 'a': c = '\a'; break;[m
[31m-      case 'b': c = '\b'; break;[m
[31m-      case 'f': c = '\f'; break;[m
[31m-      case 'n': c = '\n'; break;[m
[31m-      case 'r': c = '\r'; break;[m
[31m-      case 't': c = '\t'; break;[m
[31m-      case 'v': c = '\v'; break;[m
[31m-      case 'x':  /* Hexadecimal escape '\xXX'. */[m
[31m-	c = (lex_next(ls) & 15u) << 4;[m
[31m-	if (!lj_char_isdigit(ls->c)) {[m
[31m-	  if (!lj_char_isxdigit(ls->c)) goto err_xesc;[m
[31m-	  c += 9 << 4;[m
[31m-	}[m
[31m-	c += (lex_next(ls) & 15u);[m
[31m-	if (!lj_char_isdigit(ls->c)) {[m
[31m-	  if (!lj_char_isxdigit(ls->c)) goto err_xesc;[m
[31m-	  c += 9;[m
[31m-	}[m
[31m-	break;[m
[31m-      case 'u':  /* Unicode escape '\u{XX...}'. */[m
[31m-	if (lex_next(ls) != '{') goto err_xesc;[m
[31m-	lex_next(ls);[m
[31m-	c = 0;[m
[31m-	do {[m
[31m-	  c = (c << 4) | (ls->c & 15u);[m
[31m-	  if (!lj_char_isdigit(ls->c)) {[m
[31m-	    if (!lj_char_isxdigit(ls->c)) goto err_xesc;[m
[31m-	    c += 9;[m
[31m-	  }[m
[31m-	  if (c >= 0x110000) goto err_xesc;  /* Out of Unicode range. */[m
[31m-	} while (lex_next(ls) != '}');[m
[31m-	if (c < 0x800) {[m
[31m-	  if (c < 0x80) break;[m
[31m-	  lex_save(ls, 0xc0 | (c >> 6));[m
[31m-	} else {[m
[31m-	  if (c >= 0x10000) {[m
[31m-	    lex_save(ls, 0xf0 | (c >> 18));[m
[31m-	    lex_save(ls, 0x80 | ((c >> 12) & 0x3f));[m
[31m-	  } else {[m
[31m-	    if (c >= 0xd800 && c < 0xe000) goto err_xesc;  /* No surrogates. */[m
[31m-	    lex_save(ls, 0xe0 | (c >> 12));[m
[31m-	  }[m
[31m-	  lex_save(ls, 0x80 | ((c >> 6) & 0x3f));[m
[31m-	}[m
[31m-	c = 0x80 | (c & 0x3f);[m
[31m-	break;[m
[31m-      case 'z':  /* Skip whitespace. */[m
[31m-	lex_next(ls);[m
[31m-	while (lj_char_isspace(ls->c))[m
[31m-	  if (lex_iseol(ls)) lex_newline(ls); else lex_next(ls);[m
[31m-	continue;[m
[31m-      case '\n': case '\r': lex_save(ls, '\n'); lex_newline(ls); continue;[m
[31m-      case '\\': case '\"': case '\'': break;[m
[31m-      case LEX_EOF: continue;[m
[31m-      default:[m
[31m-	if (!lj_char_isdigit(c))[m
[31m-	  goto err_xesc;[m
[31m-	c -= '0';  /* Decimal escape '\ddd'. */[m
[31m-	if (lj_char_isdigit(lex_next(ls))) {[m
[31m-	  c = c*10 + (ls->c - '0');[m
[31m-	  if (lj_char_isdigit(lex_next(ls))) {[m
[31m-	    c = c*10 + (ls->c - '0');[m
[31m-	    if (c > 255) {[m
[31m-	    err_xesc:[m
[31m-	      lj_lex_error(ls, TK_string, LJ_ERR_XESC);[m
[31m-	    }[m
[31m-	    lex_next(ls);[m
[31m-	  }[m
[31m-	}[m
[31m-	lex_save(ls, c);[m
[31m-	continue;[m
[31m-      }[m
[31m-      lex_save(ls, c);[m
[31m-      lex_next(ls);[m
[31m-      continue;[m
[31m-      }[m
[31m-    default:[m
[31m-      lex_savenext(ls);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  lex_savenext(ls);  /* Skip trailing delimiter. */[m
[31m-  setstrV(ls->L, tv,[m
[31m-	  lj_parse_keepstr(ls, sbufB(&ls->sb)+1, sbuflen(&ls->sb)-2));[m
[31m-}[m
[31m-[m
[31m-/* -- Main lexical scanner ------------------------------------------------ */[m
[31m-[m
[31m-/* Get next lexical token. */[m
[31m-static LexToken lex_scan(LexState *ls, TValue *tv)[m
[31m-{[m
[31m-  lj_buf_reset(&ls->sb);[m
[31m-  for (;;) {[m
[31m-    if (lj_char_isident(ls->c)) {[m
[31m-      GCstr *s;[m
[31m-      if (lj_char_isdigit(ls->c)) {  /* Numeric literal. */[m
[31m-	lex_number(ls, tv);[m
[31m-	return TK_number;[m
[31m-      }[m
[31m-      /* Identifier or reserved word. */[m
[31m-      do {[m
[31m-	lex_savenext(ls);[m
[31m-      } while (lj_char_isident(ls->c));[m
[31m-      s = lj_parse_keepstr(ls, sbufB(&ls->sb), sbuflen(&ls->sb));[m
[31m-      setstrV(ls->L, tv, s);[m
[31m-      if (s->reserved > 0)  /* Reserved word? */[m
[31m-	return TK_OFS + s->reserved;[m
[31m-      return TK_name;[m
[31m-    }[m
[31m-    switch (ls->c) {[m
[31m-    case '\n':[m
[31m-    case '\r':[m
[31m-      lex_newline(ls);[m
[31m-      continue;[m
[31m-    case ' ':[m
[31m-    case '\t':[m
[31m-    case '\v':[m
[31m-    case '\f':[m
[31m-      lex_next(ls);[m
[31m-      continue;[m
[31m-    case '-':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '-') return '-';[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c == '[') {  /* Long comment "--[=*[...]=*]". */[m
[31m-	int sep = lex_skipeq(ls);[m
[31m-	lj_buf_reset(&ls->sb);  /* `lex_skipeq' may dirty the buffer */[m
[31m-	if (sep >= 0) {[m
[31m-	  lex_longstring(ls, NULL, sep);[m
[31m-	  lj_buf_reset(&ls->sb);[m
[31m-	  continue;[m
[31m-	}[m
[31m-      }[m
[31m-      /* Short comment "--.*\n". */[m
[31m-      while (!lex_iseol(ls) && ls->c != LEX_EOF)[m
[31m-	lex_next(ls);[m
[31m-      continue;[m
[31m-    case '[': {[m
[31m-      int sep = lex_skipeq(ls);[m
[31m-      if (sep >= 0) {[m
[31m-	lex_longstring(ls, tv, sep);[m
[31m-	return TK_string;[m
[31m-      } else if (sep == -1) {[m
[31m-	return '[';[m
[31m-      } else {[m
[31m-	lj_lex_error(ls, TK_string, LJ_ERR_XLDELIM);[m
[31m-	continue;[m
[31m-      }[m
[31m-      }[m
[31m-    case '=':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '=') return '='; else { lex_next(ls); return TK_eq; }[m
[31m-    case '<':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '=') return '<'; else { lex_next(ls); return TK_le; }[m
[31m-    case '>':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '=') return '>'; else { lex_next(ls); return TK_ge; }[m
[31m-    case '~':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '=') return '~'; else { lex_next(ls); return TK_ne; }[m
[31m-    case ':':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != ':') return ':'; else { lex_next(ls); return TK_label; }[m
[31m-    case '"':[m
[31m-    case '\'':[m
[31m-      lex_string(ls, tv);[m
[31m-      return TK_string;[m
[31m-    case '.':[m
[31m-      if (lex_savenext(ls) == '.') {[m
[31m-	lex_next(ls);[m
[31m-	if (ls->c == '.') {[m
[31m-	  lex_next(ls);[m
[31m-	  return TK_dots;   /* ... */[m
[31m-	}[m
[31m-	return TK_concat;   /* .. */[m
[31m-      } else if (!lj_char_isdigit(ls->c)) {[m
[31m-	return '.';[m
[31m-      } else {[m
[31m-	lex_number(ls, tv);[m
[31m-	return TK_number;[m
[31m-      }[m
[31m-    case LEX_EOF:[m
[31m-      return TK_eof;[m
[31m-    default: {[m
[31m-      LexChar c = ls->c;[m
[31m-      lex_next(ls);[m
[31m-      return c;  /* Single-char tokens (+ - / ...). */[m
[31m-    }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Lexer API ----------------------------------------------------------- */[m
[31m-[m
[31m-/* Setup lexer state. */[m
[31m-int lj_lex_setup(lua_State *L, LexState *ls)[m
[31m-{[m
[31m-  int header = 0;[m
[31m-  ls->L = L;[m
[31m-  ls->fs = NULL;[m
[31m-  ls->pe = ls->p = NULL;[m
[31m-  ls->vstack = NULL;[m
[31m-  ls->sizevstack = 0;[m
[31m-  ls->vtop = 0;[m
[31m-  ls->bcstack = NULL;[m
[31m-  ls->sizebcstack = 0;[m
[31m-  ls->tok = 0;[m
[31m-  ls->lookahead = TK_eof;  /* No look-ahead token. */[m
[31m-  ls->linenumber = 1;[m
[31m-  ls->lastline = 1;[m
[31m-  lex_next(ls);  /* Read-ahead first char. */[m
[31m-  if (ls->c == 0xef && ls->p + 2 <= ls->pe && (uint8_t)ls->p[0] == 0xbb &&[m
[31m-      (uint8_t)ls->p[1] == 0xbf) {  /* Skip UTF-8 BOM (if buffered). */[m
[31m-    ls->p += 2;[m
[31m-    lex_next(ls);[m
[31m-    header = 1;[m
[31m-  }[m
[31m-  if (ls->c == '#') {  /* Skip POSIX #! header line. */[m
[31m-    do {[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c == LEX_EOF) return 0;[m
[31m-    } while (!lex_iseol(ls));[m
[31m-    lex_newline(ls);[m
[31m-    header = 1;[m
[31m-  }[m
[31m-  if (ls->c == LUA_SIGNATURE[0]) {  /* Bytecode dump. */[m
[31m-    if (header) {[m
[31m-      /*[m
[31m-      ** Loading bytecode with an extra header is disabled for security[m
[31m-      ** reasons. This may circumvent the usual check for bytecode vs.[m
[31m-      ** Lua code by looking at the first char. Since this is a potential[m
[31m-      ** security violation no attempt is made to echo the chunkname either.[m
[31m-      */[m
[31m-      setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCBAD));[m
[31m-      lj_err_throw(L, LUA_ERRSYNTAX);[m
[31m-    }[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Cleanup lexer state. */[m
[31m-void lj_lex_cleanup(lua_State *L, LexState *ls)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lj_mem_freevec(g, ls->bcstack, ls->sizebcstack, BCInsLine);[m
[31m-  lj_mem_freevec(g, ls->vstack, ls->sizevstack, VarInfo);[m
[31m-  lj_buf_free(g, &ls->sb);[m
[31m-}[m
[31m-[m
[31m-/* Return next lexical token. */[m
[31m-void lj_lex_next(LexState *ls)[m
[31m-{[m
[31m-  ls->lastline = ls->linenumber;[m
[31m-  if (LJ_LIKELY(ls->lookahead == TK_eof)) {  /* No lookahead token? */[m
[31m-    ls->tok = lex_scan(ls, &ls->tokval);  /* Get next token. */[m
[31m-  } else {  /* Otherwise return lookahead token. */[m
[31m-    ls->tok = ls->lookahead;[m
[31m-    ls->lookahead = TK_eof;[m
[31m-    ls->tokval = ls->lookaheadval;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Look ahead for the next token. */[m
[31m-LexToken lj_lex_lookahead(LexState *ls)[m
[31m-{[m
[31m-  lua_assert(ls->lookahead == TK_eof);[m
[31m-  ls->lookahead = lex_scan(ls, &ls->lookaheadval);[m
[31m-  return ls->lookahead;[m
[31m-}[m
[31m-[m
[31m-/* Convert token to string. */[m
[31m-const char *lj_lex_token2str(LexState *ls, LexToken tok)[m
[31m-{[m
[31m-  if (tok > TK_OFS)[m
[31m-    return tokennames[tok-TK_OFS-1];[m
[31m-  else if (!lj_char_iscntrl(tok))[m
[31m-    return lj_strfmt_pushf(ls->L, "%c", tok);[m
[31m-  else[m
[31m-    return lj_strfmt_pushf(ls->L, "char(%d)", tok);[m
[31m-}[m
[31m-[m
[31m-/* Lexer error. */[m
[31m-void lj_lex_error(LexState *ls, LexToken tok, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *tokstr;[m
[31m-  va_list argp;[m
[31m-  if (tok == 0) {[m
[31m-    tokstr = NULL;[m
[31m-  } else if (tok == TK_name || tok == TK_string || tok == TK_number) {[m
[31m-    lex_save(ls, '\0');[m
[31m-    tokstr = sbufB(&ls->sb);[m
[31m-  } else {[m
[31m-    tokstr = lj_lex_token2str(ls, tok);[m
[31m-  }[m
[31m-  va_start(argp, em);[m
[31m-  lj_err_lex(ls->L, ls->chunkname, tokstr, ls->linenumber, em, argp);[m
[31m-  va_end(argp);[m
[31m-}[m
[31m-[m
[31m-/* Initialize strings for reserved words. */[m
[31m-void lj_lex_init(lua_State *L)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < TK_RESERVED; i++) {[m
[31m-    GCstr *s = lj_str_newz(L, tokennames[i]);[m
[31m-    fixstring(s);  /* Reserved words are never collected. */[m
[31m-    s->reserved = (uint8_t)(i+1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.h[m
[1mdeleted file mode 100644[m
[1mindex 7fed1fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lex.h[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-/*[m
[31m-** Lexical analyzer.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_LEX_H[m
[31m-#define _LJ_LEX_H[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-[m
[31m-/* Lua lexer tokens. */[m
[31m-#define TKDEF(_, __) \[m
[31m-  _(and) _(break) _(do) _(else) _(elseif) _(end) _(false) \[m
[31m-  _(for) _(function) _(goto) _(if) _(in) _(local) _(nil) _(not) _(or) \[m
[31m-  _(repeat) _(return) _(then) _(true) _(until) _(while) \[m
[31m-  __(concat, ..) __(dots, ...) __(eq, ==) __(ge, >=) __(le, <=) __(ne, ~=) \[m
[31m-  __(label, ::) __(number, <number>) __(name, <name>) __(string, <string>) \[m
[31m-  __(eof, <eof>)[m
[31m-[m
[31m-enum {[m
[31m-  TK_OFS = 256,[m
[31m-#define TKENUM1(name)		TK_##name,[m
[31m-#define TKENUM2(name, sym)	TK_##name,[m
[31m-TKDEF(TKENUM1, TKENUM2)[m
[31m-#undef TKENUM1[m
[31m-#undef TKENUM2[m
[31m-  TK_RESERVED = TK_while - TK_OFS[m
[31m-};[m
[31m-[m
[31m-typedef int LexChar;	/* Lexical character. Unsigned ext. from char. */[m
[31m-typedef int LexToken;	/* Lexical token. */[m
[31m-[m
[31m-/* Combined bytecode ins/line. Only used during bytecode generation. */[m
[31m-typedef struct BCInsLine {[m
[31m-  BCIns ins;		/* Bytecode instruction. */[m
[31m-  BCLine line;		/* Line number for this bytecode. */[m
[31m-} BCInsLine;[m
[31m-[m
[31m-/* Info for local variables. Only used during bytecode generation. */[m
[31m-typedef struct VarInfo {[m
[31m-  GCRef name;		/* Local variable name or goto/label name. */[m
[31m-  BCPos startpc;	/* First point where the local variable is active. */[m
[31m-  BCPos endpc;		/* First point where the local variable is dead. */[m
[31m-  uint8_t slot;		/* Variable slot. */[m
[31m-  uint8_t info;		/* Variable/goto/label info. */[m
[31m-} VarInfo;[m
[31m-[m
[31m-/* Lua lexer state. */[m
[31m-typedef struct LexState {[m
[31m-  struct FuncState *fs;	/* Current FuncState. Defined in lj_parse.c. */[m
[31m-  struct lua_State *L;	/* Lua state. */[m
[31m-  TValue tokval;	/* Current token value. */[m
[31m-  TValue lookaheadval;	/* Lookahead token value. */[m
[31m-  const char *p;	/* Current position in input buffer. */[m
[31m-  const char *pe;	/* End of input buffer. */[m
[31m-  LexChar c;		/* Current character. */[m
[31m-  LexToken tok;		/* Current token. */[m
[31m-  LexToken lookahead;	/* Lookahead token. */[m
[31m-  SBuf sb;		/* String buffer for tokens. */[m
[31m-  lua_Reader rfunc;	/* Reader callback. */[m
[31m-  void *rdata;		/* Reader callback data. */[m
[31m-  BCLine linenumber;	/* Input line counter. */[m
[31m-  BCLine lastline;	/* Line of last token. */[m
[31m-  GCstr *chunkname;	/* Current chunk name (interned string). */[m
[31m-  const char *chunkarg;	/* Chunk name argument. */[m
[31m-  const char *mode;	/* Allow loading bytecode (b) and/or source text (t). */[m
[31m-  VarInfo *vstack;	/* Stack for names and extents of local variables. */[m
[31m-  MSize sizevstack;	/* Size of variable stack. */[m
[31m-  MSize vtop;		/* Top of variable stack. */[m
[31m-  BCInsLine *bcstack;	/* Stack for bytecode instructions/line numbers. */[m
[31m-  MSize sizebcstack;	/* Size of bytecode stack. */[m
[31m-  uint32_t level;	/* Syntactical nesting level. */[m
[31m-} LexState;[m
[31m-[m
[31m-LJ_FUNC int lj_lex_setup(lua_State *L, LexState *ls);[m
[31m-LJ_FUNC void lj_lex_cleanup(lua_State *L, LexState *ls);[m
[31m-LJ_FUNC void lj_lex_next(LexState *ls);[m
[31m-LJ_FUNC LexToken lj_lex_lookahead(LexState *ls);[m
[31m-LJ_FUNC const char *lj_lex_token2str(LexState *ls, LexToken tok);[m
[31m-LJ_FUNC_NORET void lj_lex_error(LexState *ls, LexToken tok, ErrMsg em, ...);[m
[31m-LJ_FUNC void lj_lex_init(lua_State *L);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.c[m
[1mdeleted file mode 100644[m
[1mindex 8bdf691..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.c[m
[1m+++ /dev/null[m
[36m@@ -1,303 +0,0 @@[m
[31m-/*[m
[31m-** Library function support.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_lib_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* -- Library initialization ---------------------------------------------- */[m
[31m-[m
[31m-static GCtab *lib_create_table(lua_State *L, const char *libname, int hsize)[m
[31m-{[m
[31m-  if (libname) {[m
[31m-    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);[m
[31m-    lua_getfield(L, -1, libname);[m
[31m-    if (!tvistab(L->top-1)) {[m
[31m-      L->top--;[m
[31m-      if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, hsize) != NULL)[m
[31m-	lj_err_callerv(L, LJ_ERR_BADMODN, libname);[m
[31m-      settabV(L, L->top, tabV(L->top-1));[m
[31m-      L->top++;[m
[31m-      lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */[m
[31m-    }[m
[31m-    L->top--;[m
[31m-    settabV(L, L->top-1, tabV(L->top));[m
[31m-  } else {[m
[31m-    lua_createtable(L, 0, hsize);[m
[31m-  }[m
[31m-  return tabV(L->top-1);[m
[31m-}[m
[31m-[m
[31m-static const uint8_t *lib_read_lfunc(lua_State *L, const uint8_t *p, GCtab *tab)[m
[31m-{[m
[31m-  int len = *p++;[m
[31m-  GCstr *name = lj_str_new(L, (const char *)p, len);[m
[31m-  LexState ls;[m
[31m-  GCproto *pt;[m
[31m-  GCfunc *fn;[m
[31m-  memset(&ls, 0, sizeof(ls));[m
[31m-  ls.L = L;[m
[31m-  ls.p = (const char *)(p+len);[m
[31m-  ls.pe = (const char *)~(uintptr_t)0;[m
[31m-  ls.c = -1;[m
[31m-  ls.level = (BCDUMP_F_STRIP|(LJ_BE*BCDUMP_F_BE));[m
[31m-  ls.chunkname = name;[m
[31m-  pt = lj_bcread_proto(&ls);[m
[31m-  pt->firstline = ~(BCLine)0;[m
[31m-  fn = lj_func_newL_empty(L, pt, tabref(L->env));[m
[31m-  /* NOBARRIER: See below for common barrier. */[m
[31m-  setfuncV(L, lj_tab_setstr(L, tab, name), fn);[m
[31m-  return (const uint8_t *)ls.p;[m
[31m-}[m
[31m-[m
[31m-void lj_lib_register(lua_State *L, const char *libname,[m
[31m-		     const uint8_t *p, const lua_CFunction *cf)[m
[31m-{[m
[31m-  GCtab *env = tabref(L->env);[m
[31m-  GCfunc *ofn = NULL;[m
[31m-  int ffid = *p++;[m
[31m-  BCIns *bcff = &L2GG(L)->bcff[*p++];[m
[31m-  GCtab *tab = lib_create_table(L, libname, *p++);[m
[31m-  ptrdiff_t tpos = L->top - L->base;[m
[31m-[m
[31m-  /* Avoid barriers further down. */[m
[31m-  lj_gc_anybarriert(L, tab);[m
[31m-  tab->nomm = 0;[m
[31m-[m
[31m-  for (;;) {[m
[31m-    uint32_t tag = *p++;[m
[31m-    MSize len = tag & LIBINIT_LENMASK;[m
[31m-    tag &= LIBINIT_TAGMASK;[m
[31m-    if (tag != LIBINIT_STRING) {[m
[31m-      const char *name;[m
[31m-      MSize nuv = (MSize)(L->top - L->base - tpos);[m
[31m-      GCfunc *fn = lj_func_newC(L, nuv, env);[m
[31m-      if (nuv) {[m
[31m-	L->top = L->base + tpos;[m
[31m-	memcpy(fn->c.upvalue, L->top, sizeof(TValue)*nuv);[m
[31m-      }[m
[31m-      fn->c.ffid = (uint8_t)(ffid++);[m
[31m-      name = (const char *)p;[m
[31m-      p += len;[m
[31m-      if (tag == LIBINIT_CF)[m
[31m-	setmref(fn->c.pc, &G(L)->bc_cfunc_int);[m
[31m-      else[m
[31m-	setmref(fn->c.pc, bcff++);[m
[31m-      if (tag == LIBINIT_ASM_)[m
[31m-	fn->c.f = ofn->c.f;  /* Copy handler from previous function. */[m
[31m-      else[m
[31m-	fn->c.f = *cf++;  /* Get cf or handler from C function table. */[m
[31m-      if (len) {[m
[31m-	/* NOBARRIER: See above for common barrier. */[m
[31m-	setfuncV(L, lj_tab_setstr(L, tab, lj_str_new(L, name, len)), fn);[m
[31m-      }[m
[31m-      ofn = fn;[m
[31m-    } else {[m
[31m-      switch (tag | len) {[m
[31m-      case LIBINIT_LUA:[m
[31m-	p = lib_read_lfunc(L, p, tab);[m
[31m-	break;[m
[31m-      case LIBINIT_SET:[m
[31m-	L->top -= 2;[m
[31m-	if (tvisstr(L->top+1) && strV(L->top+1)->len == 0)[m
[31m-	  env = tabV(L->top);[m
[31m-	else  /* NOBARRIER: See above for common barrier. */[m
[31m-	  copyTV(L, lj_tab_set(L, tab, L->top+1), L->top);[m
[31m-	break;[m
[31m-      case LIBINIT_NUMBER:[m
[31m-	memcpy(&L->top->n, p, sizeof(double));[m
[31m-	L->top++;[m
[31m-	p += sizeof(double);[m
[31m-	break;[m
[31m-      case LIBINIT_COPY:[m
[31m-	copyTV(L, L->top, L->top - *p++);[m
[31m-	L->top++;[m
[31m-	break;[m
[31m-      case LIBINIT_LASTCL:[m
[31m-	setfuncV(L, L->top++, ofn);[m
[31m-	break;[m
[31m-      case LIBINIT_FFID:[m
[31m-	ffid++;[m
[31m-	break;[m
[31m-      case LIBINIT_END:[m
[31m-	return;[m
[31m-      default:[m
[31m-	setstrV(L, L->top++, lj_str_new(L, (const char *)p, len));[m
[31m-	p += len;[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Push internal function on the stack. */[m
[31m-GCfunc *lj_lib_pushcc(lua_State *L, lua_CFunction f, int id, int n)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  lua_pushcclosure(L, f, n);[m
[31m-  fn = funcV(L->top-1);[m
[31m-  fn->c.ffid = (uint8_t)id;[m
[31m-  setmref(fn->c.pc, &G(L)->bc_cfunc_int);[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f, GCtab *env)[m
[31m-{[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD", 4);[m
[31m-  lua_pushcfunction(L, f);[m
[31m-  /* NOBARRIER: The function is new (marked white). */[m
[31m-  setgcref(funcV(L->top-1)->c.env, obj2gco(env));[m
[31m-  lua_setfield(L, -2, name);[m
[31m-  L->top--;[m
[31m-}[m
[31m-[m
[31m-int lj_lib_postreg(lua_State *L, lua_CFunction cf, int id, const char *name)[m
[31m-{[m
[31m-  GCfunc *fn = lj_lib_pushcf(L, cf, id);[m
[31m-  GCtab *t = tabref(curr_func(L)->c.env);  /* Reference to parent table. */[m
[31m-  setfuncV(L, lj_tab_setstr(L, t, lj_str_newz(L, name)), fn);[m
[31m-  lj_gc_anybarriert(L, t);[m
[31m-  setfuncV(L, L->top++, fn);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* -- Type checks --------------------------------------------------------- */[m
[31m-[m
[31m-TValue *lj_lib_checkany(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (o >= L->top)[m
[31m-    lj_err_arg(L, narg, LJ_ERR_NOVAL);[m
[31m-  return o;[m
[31m-}[m
[31m-[m
[31m-GCstr *lj_lib_checkstr(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (o < L->top) {[m
[31m-    if (LJ_LIKELY(tvisstr(o))) {[m
[31m-      return strV(o);[m
[31m-    } else if (tvisnumber(o)) {[m
[31m-      GCstr *s = lj_strfmt_number(L, o);[m
[31m-      setstrV(L, o, s);[m
[31m-      return s;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_argt(L, narg, LUA_TSTRING);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-GCstr *lj_lib_optstr(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  return (o < L->top && !tvisnil(o)) ? lj_lib_checkstr(L, narg) : NULL;[m
[31m-}[m
[31m-[m
[31m-#if LJ_DUALNUM[m
[31m-void lj_lib_checknumber(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && lj_strscan_numberobj(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-lua_Number lj_lib_checknum(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top &&[m
[31m-	(tvisnumber(o) || (tvisstr(o) && lj_strscan_num(strV(o), o)))))[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-  if (LJ_UNLIKELY(tvisint(o))) {[m
[31m-    lua_Number n = (lua_Number)intV(o);[m
[31m-    setnumV(o, n);[m
[31m-    return n;[m
[31m-  } else {[m
[31m-    return numV(o);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-int32_t lj_lib_checkint(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && lj_strscan_numberobj(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else {[m
[31m-    int32_t i = lj_num2int(numV(o));[m
[31m-    if (LJ_DUALNUM) setintV(o, i);[m
[31m-    return i;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-int32_t lj_lib_optint(lua_State *L, int narg, int32_t def)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  return (o < L->top && !tvisnil(o)) ? lj_lib_checkint(L, narg) : def;[m
[31m-}[m
[31m-[m
[31m-GCfunc *lj_lib_checkfunc(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && tvisfunc(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TFUNCTION);[m
[31m-  return funcV(o);[m
[31m-}[m
[31m-[m
[31m-GCtab *lj_lib_checktab(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && tvistab(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TTABLE);[m
[31m-  return tabV(o);[m
[31m-}[m
[31m-[m
[31m-GCtab *lj_lib_checktabornil(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (o < L->top) {[m
[31m-    if (tvistab(o))[m
[31m-      return tabV(o);[m
[31m-    else if (tvisnil(o))[m
[31m-      return NULL;[m
[31m-  }[m
[31m-  lj_err_arg(L, narg, LJ_ERR_NOTABN);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst)[m
[31m-{[m
[31m-  GCstr *s = def >= 0 ? lj_lib_optstr(L, narg) : lj_lib_checkstr(L, narg);[m
[31m-  if (s) {[m
[31m-    const char *opt = strdata(s);[m
[31m-    MSize len = s->len;[m
[31m-    int i;[m
[31m-    for (i = 0; *(const uint8_t *)lst; i++) {[m
[31m-      if (*(const uint8_t *)lst == len && memcmp(opt, lst+1, len) == 0)[m
[31m-	return i;[m
[31m-      lst += 1+*(const uint8_t *)lst;[m
[31m-    }[m
[31m-    lj_err_argv(L, narg, LJ_ERR_INVOPTM, opt);[m
[31m-  }[m
[31m-  return def;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.h[m
[1mdeleted file mode 100644[m
[1mindex dbc0405..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_lib.h[m
[1m+++ /dev/null[m
[36m@@ -1,115 +0,0 @@[m
[31m-/*[m
[31m-** Library function support.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_LIB_H[m
[31m-#define _LJ_LIB_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/*[m
[31m-** A fallback handler is called by the assembler VM if the fast path fails:[m
[31m-**[m
[31m-** - too few arguments:   unrecoverable.[m
[31m-** - wrong argument type:   recoverable, if coercion succeeds.[m
[31m-** - bad argument value:  unrecoverable.[m
[31m-** - stack overflow:        recoverable, if stack reallocation succeeds.[m
[31m-** - extra handling:        recoverable.[m
[31m-**[m
[31m-** The unrecoverable cases throw an error with lj_err_arg(), lj_err_argtype(),[m
[31m-** lj_err_caller() or lj_err_callermsg().[m
[31m-** The recoverable cases return 0 or the number of results + 1.[m
[31m-** The assembler VM retries the fast path only if 0 is returned.[m
[31m-** This time the fallback must not be called again or it gets stuck in a loop.[m
[31m-*/[m
[31m-[m
[31m-/* Return values from fallback handler. */[m
[31m-#define FFH_RETRY	0[m
[31m-#define FFH_UNREACHABLE	FFH_RETRY[m
[31m-#define FFH_RES(n)	((n)+1)[m
[31m-#define FFH_TAILCALL	(-1)[m
[31m-[m
[31m-LJ_FUNC TValue *lj_lib_checkany(lua_State *L, int narg);[m
[31m-LJ_FUNC GCstr *lj_lib_checkstr(lua_State *L, int narg);[m
[31m-LJ_FUNC GCstr *lj_lib_optstr(lua_State *L, int narg);[m
[31m-#if LJ_DUALNUM[m
[31m-LJ_FUNC void lj_lib_checknumber(lua_State *L, int narg);[m
[31m-#else[m
[31m-#define lj_lib_checknumber(L, narg)	lj_lib_checknum((L), (narg))[m
[31m-#endif[m
[31m-LJ_FUNC lua_Number lj_lib_checknum(lua_State *L, int narg);[m
[31m-LJ_FUNC int32_t lj_lib_checkint(lua_State *L, int narg);[m
[31m-LJ_FUNC int32_t lj_lib_optint(lua_State *L, int narg, int32_t def);[m
[31m-LJ_FUNC GCfunc *lj_lib_checkfunc(lua_State *L, int narg);[m
[31m-LJ_FUNC GCtab *lj_lib_checktab(lua_State *L, int narg);[m
[31m-LJ_FUNC GCtab *lj_lib_checktabornil(lua_State *L, int narg);[m
[31m-LJ_FUNC int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst);[m
[31m-[m
[31m-/* Avoid including lj_frame.h. */[m
[31m-#if LJ_GC64[m
[31m-#define lj_lib_upvalue(L, n) \[m
[31m-  (&gcval(L->base-2)->fn.c.upvalue[(n)-1])[m
[31m-#elif LJ_FR2[m
[31m-#define lj_lib_upvalue(L, n) \[m
[31m-  (&gcref((L->base-2)->gcr)->fn.c.upvalue[(n)-1])[m
[31m-#else[m
[31m-#define lj_lib_upvalue(L, n) \[m
[31m-  (&gcref((L->base-1)->fr.func)->fn.c.upvalue[(n)-1])[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-#define lj_lib_checkfpu(L) \[m
[31m-  do { setnumV(L->top++, (lua_Number)1437217655); \[m
[31m-    if (lua_tointeger(L, -1) != 1437217655) lj_err_caller(L, LJ_ERR_BADFPU); \[m
[31m-    L->top--; } while (0)[m
[31m-#else[m
[31m-#define lj_lib_checkfpu(L)	UNUSED(L)[m
[31m-#endif[m
[31m-[m
[31m-LJ_FUNC GCfunc *lj_lib_pushcc(lua_State *L, lua_CFunction f, int id, int n);[m
[31m-#define lj_lib_pushcf(L, fn, id)	(lj_lib_pushcc(L, (fn), (id), 0))[m
[31m-[m
[31m-/* Library function declarations. Scanned by buildvm. */[m
[31m-#define LJLIB_CF(name)		static int lj_cf_##name(lua_State *L)[m
[31m-#define LJLIB_ASM(name)		static int lj_ffh_##name(lua_State *L)[m
[31m-#define LJLIB_ASM_(name)[m
[31m-#define LJLIB_LUA(name)[m
[31m-#define LJLIB_SET(name)[m
[31m-#define LJLIB_PUSH(arg)[m
[31m-#define LJLIB_REC(handler)[m
[31m-#define LJLIB_NOREGUV[m
[31m-#define LJLIB_NOREG[m
[31m-[m
[31m-#define LJ_LIB_REG(L, regname, name) \[m
[31m-  lj_lib_register(L, regname, lj_lib_init_##name, lj_lib_cf_##name)[m
[31m-[m
[31m-LJ_FUNC void lj_lib_register(lua_State *L, const char *libname,[m
[31m-			     const uint8_t *init, const lua_CFunction *cf);[m
[31m-LJ_FUNC void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f,[m
[31m-			   GCtab *env);[m
[31m-LJ_FUNC int lj_lib_postreg(lua_State *L, lua_CFunction cf, int id,[m
[31m-			   const char *name);[m
[31m-[m
[31m-/* Library init data tags. */[m
[31m-#define LIBINIT_LENMASK	0x3f[m
[31m-#define LIBINIT_TAGMASK	0xc0[m
[31m-#define LIBINIT_CF	0x00[m
[31m-#define LIBINIT_ASM	0x40[m
[31m-#define LIBINIT_ASM_	0x80[m
[31m-#define LIBINIT_STRING	0xc0[m
[31m-#define LIBINIT_MAXSTR	0x38[m
[31m-#define LIBINIT_LUA	0xf9[m
[31m-#define LIBINIT_SET	0xfa[m
[31m-#define LIBINIT_NUMBER	0xfb[m
[31m-#define LIBINIT_COPY	0xfc[m
[31m-#define LIBINIT_LASTCL	0xfd[m
[31m-#define LIBINIT_FFID	0xfe[m
[31m-#define LIBINIT_END	0xff[m
[31m-[m
[31m-/* Exported library functions. */[m
[31m-[m
[31m-typedef struct RandomState RandomState;[m
[31m-LJ_FUNC uint64_t LJ_FASTCALL lj_math_random_step(RandomState *rs);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load.c[m
[1mdeleted file mode 100644[m
[1mindex d500d16..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_load.c[m
[1m+++ /dev/null[m
[36m@@ -1,168 +0,0 @@[m
[31m-/*[m
[31m-** Load and dump code.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lj_load_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_parse.h"[m
[31m-[m
[31m-/* -- Load Lua source code and bytecode ----------------------------------- */[m
[31m-[m
[31m-static TValue *cpparser(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  LexState *ls = (LexState *)ud;[m
[31m-  GCproto *pt;[m
[31m-  GCfunc *fn;[m
[31m-  int bc;[m
[31m-  UNUSED(dummy);[m
[31m-  cframe_errfunc(L->cframe) = -1;  /* Inherit error function. */[m
[31m-  bc = lj_lex_setup(L, ls);[m
[31m-  if (ls->mode && !strchr(ls->mode, bc ? 'b' : 't')) {[m
[31m-    setstrV(L, L->top++, lj_err_str(L, LJ_ERR_XMODE));[m
[31m-    lj_err_throw(L, LUA_ERRSYNTAX);[m
[31m-  }[m
[31m-  pt = bc ? lj_bcread(ls) : lj_parse(ls);[m
[31m-  fn = lj_func_newL_empty(L, pt, tabref(L->env));[m
[31m-  /* Don't combine above/below into one statement. */[m
[31m-  setfuncV(L, L->top++, fn);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_loadx(lua_State *L, lua_Reader reader, void *data,[m
[31m-		      const char *chunkname, const char *mode)[m
[31m-{[m
[31m-  LexState ls;[m
[31m-  int status;[m
[31m-  ls.rfunc = reader;[m
[31m-  ls.rdata = data;[m
[31m-  ls.chunkarg = chunkname ? chunkname : "?";[m
[31m-  ls.mode = mode;[m
[31m-  lj_buf_init(L, &ls.sb);[m
[31m-  status = lj_vm_cpcall(L, NULL, &ls, cpparser);[m
[31m-  lj_lex_cleanup(L, &ls);[m
[31m-  lj_gc_check(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_load(lua_State *L, lua_Reader reader, void *data,[m
[31m-		     const char *chunkname)[m
[31m-{[m
[31m-  return lua_loadx(L, reader, data, chunkname, NULL);[m
[31m-}[m
[31m-[m
[31m-typedef struct FileReaderCtx {[m
[31m-  FILE *fp;[m
[31m-  char buf[LUAL_BUFFERSIZE];[m
[31m-} FileReaderCtx;[m
[31m-[m
[31m-static const char *reader_file(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-  FileReaderCtx *ctx = (FileReaderCtx *)ud;[m
[31m-  UNUSED(L);[m
[31m-  if (feof(ctx->fp)) return NULL;[m
[31m-  *size = fread(ctx->buf, 1, sizeof(ctx->buf), ctx->fp);[m
[31m-  return *size > 0 ? ctx->buf : NULL;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadfilex(lua_State *L, const char *filename,[m
[31m-			      const char *mode)[m
[31m-{[m
[31m-  FileReaderCtx ctx;[m
[31m-  int status;[m
[31m-  const char *chunkname;[m
[31m-  if (filename) {[m
[31m-    ctx.fp = fopen(filename, "rb");[m
[31m-    if (ctx.fp == NULL) {[m
[31m-      lua_pushfstring(L, "cannot open %s: %s", filename, strerror(errno));[m
[31m-      return LUA_ERRFILE;[m
[31m-    }[m
[31m-    chunkname = lua_pushfstring(L, "@%s", filename);[m
[31m-  } else {[m
[31m-    ctx.fp = stdin;[m
[31m-    chunkname = "=stdin";[m
[31m-  }[m
[31m-  status = lua_loadx(L, reader_file, &ctx, chunkname, mode);[m
[31m-  if (ferror(ctx.fp)) {[m
[31m-    L->top -= filename ? 2 : 1;[m
[31m-    lua_pushfstring(L, "cannot read %s: %s", chunkname+1, strerror(errno));[m
[31m-    if (filename)[m
[31m-      fclose(ctx.fp);[m
[31m-    return LUA_ERRFILE;[m
[31m-  }[m
[31m-  if (filename) {[m
[31m-    L->top--;[m
[31m-    copyTV(L, L->top-1, L->top);[m
[31m-    fclose(ctx.fp);[m
[31m-  }[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadfile(lua_State *L, const char *filename)[m
[31m-{[m
[31m-  return luaL_loadfilex(L, filename, NULL);[m
[31m-}[m
[31m-[m
[31m-typedef struct StringReaderCtx {[m
[31m-  const char *str;[m
[31m-  size_t size;[m
[31m-} StringReaderCtx;[m
[31m-[m
[31m-static const char *reader_string(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-  StringReaderCtx *ctx = (StringReaderCtx *)ud;[m
[31m-  UNUSED(L);[m
[31m-  if (ctx->size == 0) return NULL;[m
[31m-  *size = ctx->size;[m
[31m-  ctx->size = 0;[m
[31m-  return ctx->str;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadbufferx(lua_State *L, const char *buf, size_t size,[m
[31m-				const char *name, const char *mode)[m
[31m-{[m
[31m-  StringReaderCtx ctx;[m
[31m-  ctx.str = buf;[m
[31m-  ctx.size = size;[m
[31m-  return lua_loadx(L, reader_string, &ctx, name, mode);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadbuffer(lua_State *L, const char *buf, size_t size,[m
[31m-			       const char *name)[m
[31m-{[m
[31m-  return luaL_loadbufferx(L, buf, size, name, NULL);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadstring(lua_State *L, const char *s)[m
[31m-{[m
[31m-  return luaL_loadbuffer(L, s, strlen(s), s);[m
[31m-}[m
[31m-[m
[31m-/* -- Dump bytecode ------------------------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_dump(lua_State *L, lua_Writer writer, void *data)[m
[31m-{[m
[31m-  cTValue *o = L->top-1;[m
[31m-  api_check(L, L->top > L->base);[m
[31m-  if (tvisfunc(o) && isluafunc(funcV(o)))[m
[31m-    return lj_bcwrite(L, funcproto(funcV(o)), writer, data, 0);[m
[31m-  else[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.c[m
[1mdeleted file mode 100644[m
[1mindex 3eaee05..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.c[m
[1m+++ /dev/null[m
[36m@@ -1,386 +0,0 @@[m
[31m-/*[m
[31m-** Machine code management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_mcode_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_mcode.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#endif[m
[31m-#if LJ_HASJIT || LJ_HASFFI[m
[31m-#include "lj_vm.h"[m
[31m-#endif[m
[31m-[m
[31m-/* -- OS-specific functions ----------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASJIT || LJ_HASFFI[m
[31m-[m
[31m-/* Define this if you want to run LuaJIT with Valgrind. */[m
[31m-#ifdef LUAJIT_USE_VALGRIND[m
[31m-#include <valgrind/valgrind.h>[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_IOS[m
[31m-void sys_icache_invalidate(void *start, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-/* Synchronize data/instruction cache. */[m
[31m-void lj_mcode_sync(void *start, void *end)[m
[31m-{[m
[31m-#ifdef LUAJIT_USE_VALGRIND[m
[31m-  VALGRIND_DISCARD_TRANSLATIONS(start, (char *)end-(char *)start);[m
[31m-#endif[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  UNUSED(start); UNUSED(end);[m
[31m-#elif LJ_TARGET_IOS[m
[31m-  sys_icache_invalidate(start, (char *)end-(char *)start);[m
[31m-#elif LJ_TARGET_PPC[m
[31m-  lj_vm_cachesync(start, end);[m
[31m-#elif defined(__GNUC__)[m
[31m-  __clear_cache(start, end);[m
[31m-#else[m
[31m-#error "Missing builtin to flush instruction cache"[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#define MCPROT_RW	PAGE_READWRITE[m
[31m-#define MCPROT_RX	PAGE_EXECUTE_READ[m
[31m-#define MCPROT_RWX	PAGE_EXECUTE_READWRITE[m
[31m-[m
[31m-static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, DWORD prot)[m
[31m-{[m
[31m-  void *p = VirtualAlloc((void *)hint, sz,[m
[31m-			 MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, prot);[m
[31m-  if (!p && !hint)[m
[31m-    lj_trace_err(J, LJ_TRERR_MCODEAL);[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-static void mcode_free(jit_State *J, void *p, size_t sz)[m
[31m-{[m
[31m-  UNUSED(J); UNUSED(sz);[m
[31m-  VirtualFree(p, 0, MEM_RELEASE);[m
[31m-}[m
[31m-[m
[31m-static int mcode_setprot(void *p, size_t sz, DWORD prot)[m
[31m-{[m
[31m-  DWORD oprot;[m
[31m-  return !VirtualProtect(p, sz, prot, &oprot);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-[m
[31m-#include <sys/mman.h>[m
[31m-[m
[31m-#ifndef MAP_ANONYMOUS[m
[31m-#define MAP_ANONYMOUS	MAP_ANON[m
[31m-#endif[m
[31m-[m
[31m-#define MCPROT_RW	(PROT_READ|PROT_WRITE)[m
[31m-#define MCPROT_RX	(PROT_READ|PROT_EXEC)[m
[31m-#define MCPROT_RWX	(PROT_READ|PROT_WRITE|PROT_EXEC)[m
[31m-[m
[31m-static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)[m
[31m-{[m
[31m-  void *p = mmap((void *)hint, sz, prot, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);[m
[31m-  if (p == MAP_FAILED) {[m
[31m-    if (!hint) lj_trace_err(J, LJ_TRERR_MCODEAL);[m
[31m-    p = NULL;[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-static void mcode_free(jit_State *J, void *p, size_t sz)[m
[31m-{[m
[31m-  UNUSED(J);[m
[31m-  munmap(p, sz);[m
[31m-}[m
[31m-[m
[31m-static int mcode_setprot(void *p, size_t sz, int prot)[m
[31m-{[m
[31m-  return mprotect(p, sz, prot);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_64[m
[31m-[m
[31m-#error "Missing OS support for explicit placement of executable memory"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* Fallback allocator. This will fail if memory is not executable by default. */[m
[31m-#define LUAJIT_UNPROTECT_MCODE[m
[31m-#define MCPROT_RW	0[m
[31m-#define MCPROT_RX	0[m
[31m-#define MCPROT_RWX	0[m
[31m-[m
[31m-static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)[m
[31m-{[m
[31m-  UNUSED(hint); UNUSED(prot);[m
[31m-  return lj_mem_new(J->L, sz);[m
[31m-}[m
[31m-[m
[31m-static void mcode_free(jit_State *J, void *p, size_t sz)[m
[31m-{[m
[31m-  lj_mem_free(J2G(J), p, sz);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- MCode area protection ----------------------------------------------- */[m
[31m-[m
[31m-/* Define this ONLY if page protection twiddling becomes a bottleneck. */[m
[31m-#ifdef LUAJIT_UNPROTECT_MCODE[m
[31m-[m
[31m-/* It's generally considered to be a potential security risk to have[m
[31m-** pages with simultaneous write *and* execute access in a process.[m
[31m-**[m
[31m-** Do not even think about using this mode for server processes or[m
[31m-** apps handling untrusted external data (such as a browser).[m
[31m-**[m
[31m-** The security risk is not in LuaJIT itself -- but if an adversary finds[m
[31m-** any *other* flaw in your C application logic, then any RWX memory page[m
[31m-** simplifies writing an exploit considerably.[m
[31m-*/[m
[31m-#define MCPROT_GEN	MCPROT_RWX[m
[31m-#define MCPROT_RUN	MCPROT_RWX[m
[31m-[m
[31m-static void mcode_protect(jit_State *J, int prot)[m
[31m-{[m
[31m-  UNUSED(J); UNUSED(prot);[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* This is the default behaviour and much safer:[m
[31m-**[m
[31m-** Most of the time the memory pages holding machine code are executable,[m
[31m-** but NONE of them is writable.[m
[31m-**[m
[31m-** The current memory area is marked read-write (but NOT executable) only[m
[31m-** during the short time window while the assembler generates machine code.[m
[31m-*/[m
[31m-#define MCPROT_GEN	MCPROT_RW[m
[31m-#define MCPROT_RUN	MCPROT_RX[m
[31m-[m
[31m-/* Protection twiddling failed. Probably due to kernel security. */[m
[31m-static LJ_NOINLINE void mcode_protfail(jit_State *J)[m
[31m-{[m
[31m-  lua_CFunction panic = J2G(J)->panic;[m
[31m-  if (panic) {[m
[31m-    lua_State *L = J->L;[m
[31m-    setstrV(L, L->top++, lj_err_str(L, LJ_ERR_JITPROT));[m
[31m-    panic(L);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Change protection of MCode area. */[m
[31m-static void mcode_protect(jit_State *J, int prot)[m
[31m-{[m
[31m-  if (J->mcprot != prot) {[m
[31m-    if (LJ_UNLIKELY(mcode_setprot(J->mcarea, J->szmcarea, prot)))[m
[31m-      mcode_protfail(J);[m
[31m-    J->mcprot = prot;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- MCode area allocation ----------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X64[m
[31m-#define mcode_validptr(p)	((p) && (uintptr_t)(p) < (uintptr_t)1<<47)[m
[31m-#else[m
[31m-#define mcode_validptr(p)	((p) && (uintptr_t)(p) < 0xffff0000)[m
[31m-#endif[m
[31m-[m
[31m-#ifdef LJ_TARGET_JUMPRANGE[m
[31m-[m
[31m-/* Get memory within relative jump distance of our code in 64 bit mode. */[m
[31m-static void *mcode_alloc(jit_State *J, size_t sz)[m
[31m-{[m
[31m-  /* Target an address in the static assembler code (64K aligned).[m
[31m-  ** Try addresses within a distance of target-range/2+1MB..target+range/2-1MB.[m
[31m-  ** Use half the jump range so every address in the range can reach any other.[m
[31m-  */[m
[31m-#if LJ_TARGET_MIPS[m
[31m-  /* Use the middle of the 256MB-aligned region. */[m
[31m-  uintptr_t target = ((uintptr_t)(void *)lj_vm_exit_handler & 0xf0000000u) +[m
[31m-		     0x08000000u;[m
[31m-#else[m
[31m-  uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff;[m
[31m-#endif[m
[31m-  const uintptr_t range = (1u << (LJ_TARGET_JUMPRANGE-1)) - (1u << 21);[m
[31m-  /* First try a contiguous area below the last one. */[m
[31m-  uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0;[m
[31m-  int i;[m
[31m-  for (i = 0; i < 32; i++) {  /* 32 attempts ought to be enough ... */[m
[31m-    if (mcode_validptr(hint)) {[m
[31m-      void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN);[m
[31m-[m
[31m-      if (mcode_validptr(p) &&[m
[31m-	  ((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range))[m
[31m-	return p;[m
[31m-      if (p) mcode_free(J, p, sz);  /* Free badly placed area. */[m
[31m-    }[m
[31m-    /* Next try probing pseudo-random addresses. */[m
[31m-    do {[m
[31m-      hint = (0x78fb ^ LJ_PRNG_BITS(J, 15)) << 16;  /* 64K aligned. */[m
[31m-    } while (!(hint + sz < range));[m
[31m-    hint = target + hint - (range>>1);[m
[31m-  }[m
[31m-  lj_trace_err(J, LJ_TRERR_MCODEAL);  /* Give up. OS probably ignores hints? */[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* All memory addresses are reachable by relative jumps. */[m
[31m-static void *mcode_alloc(jit_State *J, size_t sz)[m
[31m-{[m
[31m-#ifdef __OpenBSD__[m
[31m-  /* Allow better executable memory allocation for OpenBSD W^X mode. */[m
[31m-  void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN);[m
[31m-  if (p && mcode_setprot(p, sz, MCPROT_GEN)) {[m
[31m-    mcode_free(J, p, sz);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  return p;[m
[31m-#else[m
[31m-  return mcode_alloc_at(J, 0, sz, MCPROT_GEN);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- MCode area management ----------------------------------------------- */[m
[31m-[m
[31m-/* Linked list of MCode areas. */[m
[31m-typedef struct MCLink {[m
[31m-  MCode *next;		/* Next area. */[m
[31m-  size_t size;		/* Size of current area. */[m
[31m-} MCLink;[m
[31m-[m
[31m-/* Allocate a new MCode area. */[m
[31m-static void mcode_allocarea(jit_State *J)[m
[31m-{[m
[31m-  MCode *oldarea = J->mcarea;[m
[31m-  size_t sz = (size_t)J->param[JIT_P_sizemcode] << 10;[m
[31m-  sz = (sz + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);[m
[31m-  J->mcarea = (MCode *)mcode_alloc(J, sz);[m
[31m-  J->szmcarea = sz;[m
[31m-  J->mcprot = MCPROT_GEN;[m
[31m-  J->mctop = (MCode *)((char *)J->mcarea + J->szmcarea);[m
[31m-  J->mcbot = (MCode *)((char *)J->mcarea + sizeof(MCLink));[m
[31m-  ((MCLink *)J->mcarea)->next = oldarea;[m
[31m-  ((MCLink *)J->mcarea)->size = sz;[m
[31m-  J->szallmcarea += sz;[m
[31m-}[m
[31m-[m
[31m-/* Free all MCode areas. */[m
[31m-void lj_mcode_free(jit_State *J)[m
[31m-{[m
[31m-  MCode *mc = J->mcarea;[m
[31m-  J->mcarea = NULL;[m
[31m-  J->szallmcarea = 0;[m
[31m-  while (mc) {[m
[31m-    MCode *next = ((MCLink *)mc)->next;[m
[31m-    mcode_free(J, mc, ((MCLink *)mc)->size);[m
[31m-    mc = next;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- MCode transactions -------------------------------------------------- */[m
[31m-[m
[31m-/* Reserve the remainder of the current MCode area. */[m
[31m-MCode *lj_mcode_reserve(jit_State *J, MCode **lim)[m
[31m-{[m
[31m-  if (!J->mcarea)[m
[31m-    mcode_allocarea(J);[m
[31m-  else[m
[31m-    mcode_protect(J, MCPROT_GEN);[m
[31m-  *lim = J->mcbot;[m
[31m-  return J->mctop;[m
[31m-}[m
[31m-[m
[31m-/* Commit the top part of the current MCode area. */[m
[31m-void lj_mcode_commit(jit_State *J, MCode *top)[m
[31m-{[m
[31m-  J->mctop = top;[m
[31m-  mcode_protect(J, MCPROT_RUN);[m
[31m-}[m
[31m-[m
[31m-/* Abort the reservation. */[m
[31m-void lj_mcode_abort(jit_State *J)[m
[31m-{[m
[31m-  if (J->mcarea)[m
[31m-    mcode_protect(J, MCPROT_RUN);[m
[31m-}[m
[31m-[m
[31m-/* Set/reset protection to allow patching of MCode areas. */[m
[31m-MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish)[m
[31m-{[m
[31m-#ifdef LUAJIT_UNPROTECT_MCODE[m
[31m-  UNUSED(J); UNUSED(ptr); UNUSED(finish);[m
[31m-  return NULL;[m
[31m-#else[m
[31m-  if (finish) {[m
[31m-    if (J->mcarea == ptr)[m
[31m-      mcode_protect(J, MCPROT_RUN);[m
[31m-    else if (LJ_UNLIKELY(mcode_setprot(ptr, ((MCLink *)ptr)->size, MCPROT_RUN)))[m
[31m-      mcode_protfail(J);[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    MCode *mc = J->mcarea;[m
[31m-    /* Try current area first to use the protection cache. */[m
[31m-    if (ptr >= mc && ptr < (MCode *)((char *)mc + J->szmcarea)) {[m
[31m-      mcode_protect(J, MCPROT_GEN);[m
[31m-      return mc;[m
[31m-    }[m
[31m-    /* Otherwise search through the list of MCode areas. */[m
[31m-    for (;;) {[m
[31m-      mc = ((MCLink *)mc)->next;[m
[31m-      lua_assert(mc != NULL);[m
[31m-      if (ptr >= mc && ptr < (MCode *)((char *)mc + ((MCLink *)mc)->size)) {[m
[31m-	if (LJ_UNLIKELY(mcode_setprot(mc, ((MCLink *)mc)->size, MCPROT_GEN)))[m
[31m-	  mcode_protfail(J);[m
[31m-	return mc;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Limit of MCode reservation reached. */[m
[31m-void lj_mcode_limiterr(jit_State *J, size_t need)[m
[31m-{[m
[31m-  size_t sizemcode, maxmcode;[m
[31m-  lj_mcode_abort(J);[m
[31m-  sizemcode = (size_t)J->param[JIT_P_sizemcode] << 10;[m
[31m-  sizemcode = (sizemcode + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);[m
[31m-  maxmcode = (size_t)J->param[JIT_P_maxmcode] << 10;[m
[31m-  if ((size_t)need > sizemcode)[m
[31m-    lj_trace_err(J, LJ_TRERR_MCODEOV);  /* Too long for any area. */[m
[31m-  if (J->szallmcarea + sizemcode > maxmcode)[m
[31m-    lj_trace_err(J, LJ_TRERR_MCODEAL);[m
[31m-  mcode_allocarea(J);[m
[31m-  lj_trace_err(J, LJ_TRERR_MCODELM);  /* Retry with new area. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.h[m
[1mdeleted file mode 100644[m
[1mindex 503e001..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_mcode.h[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-/*[m
[31m-** Machine code management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_MCODE_H[m
[31m-#define _LJ_MCODE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT || LJ_HASFFI[m
[31m-LJ_FUNC void lj_mcode_sync(void *start, void *end);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-LJ_FUNC void lj_mcode_free(jit_State *J);[m
[31m-LJ_FUNC MCode *lj_mcode_reserve(jit_State *J, MCode **lim);[m
[31m-LJ_FUNC void lj_mcode_commit(jit_State *J, MCode *m);[m
[31m-LJ_FUNC void lj_mcode_abort(jit_State *J);[m
[31m-LJ_FUNC MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish);[m
[31m-LJ_FUNC_NORET void lj_mcode_limiterr(jit_State *J, size_t need);[m
[31m-[m
[31m-#define lj_mcode_commitbot(J, m)	(J->mcbot = (m))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.c[m
[1mdeleted file mode 100644[m
[1mindex c7993ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.c[m
[1m+++ /dev/null[m
[36m@@ -1,477 +0,0 @@[m
[31m-/*[m
[31m-** Metamethod handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_meta_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* -- Metamethod handling ------------------------------------------------- */[m
[31m-[m
[31m-/* String interning of metamethod names for fast indexing. */[m
[31m-void lj_meta_init(lua_State *L)[m
[31m-{[m
[31m-#define MMNAME(name)	"__" #name[m
[31m-  const char *metanames = MMDEF(MMNAME);[m
[31m-#undef MMNAME[m
[31m-  global_State *g = G(L);[m
[31m-  const char *p, *q;[m
[31m-  uint32_t mm;[m
[31m-  for (mm = 0, p = metanames; *p; mm++, p = q) {[m
[31m-    GCstr *s;[m
[31m-    for (q = p+2; *q && *q != '_'; q++) ;[m
[31m-    s = lj_str_new(L, p, (size_t)(q-p));[m
[31m-    /* NOBARRIER: g->gcroot[] is a GC root. */[m
[31m-    setgcref(g->gcroot[GCROOT_MMNAME+mm], obj2gco(s));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Negative caching of a few fast metamethods. See the lj_meta_fast() macro. */[m
[31m-cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name)[m
[31m-{[m
[31m-  cTValue *mo = lj_tab_getstr(mt, name);[m
[31m-  lua_assert(mm <= MM_FAST);[m
[31m-  if (!mo || tvisnil(mo)) {  /* No metamethod? */[m
[31m-    mt->nomm |= (uint8_t)(1u<<mm);  /* Set negative cache flag. */[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  return mo;[m
[31m-}[m
[31m-[m
[31m-/* Lookup metamethod for object. */[m
[31m-cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm)[m
[31m-{[m
[31m-  GCtab *mt;[m
[31m-  if (tvistab(o))[m
[31m-    mt = tabref(tabV(o)->metatable);[m
[31m-  else if (tvisudata(o))[m
[31m-    mt = tabref(udataV(o)->metatable);[m
[31m-  else[m
[31m-    mt = tabref(basemt_obj(G(L), o));[m
[31m-  if (mt) {[m
[31m-    cTValue *mo = lj_tab_getstr(mt, mmname_str(G(L), mm));[m
[31m-    if (mo)[m
[31m-      return mo;[m
[31m-  }[m
[31m-  return niltv(L);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Tailcall from C function. */[m
[31m-int lj_meta_tailcall(lua_State *L, cTValue *tv)[m
[31m-{[m
[31m-  TValue *base = L->base;[m
[31m-  TValue *top = L->top;[m
[31m-  const BCIns *pc = frame_pc(base-1);  /* Preserve old PC from frame. */[m
[31m-  copyTV(L, base-1-LJ_FR2, tv);  /* Replace frame with new object. */[m
[31m-  if (LJ_FR2)[m
[31m-    (top++)->u64 = LJ_CONT_TAILCALL;[m
[31m-  else[m
[31m-    top->u32.lo = LJ_CONT_TAILCALL;[m
[31m-  setframe_pc(top++, pc);[m
[31m-  if (LJ_FR2) top++;[m
[31m-  setframe_gc(top, obj2gco(L), LJ_TTHREAD);  /* Dummy frame object. */[m
[31m-  setframe_ftsz(top, ((char *)(top+1) - (char *)base) + FRAME_CONT);[m
[31m-  L->base = L->top = top+1;[m
[31m-  /*[m
[31m-  ** before:   [old_mo|PC]    [... ...][m
[31m-  **                         ^base     ^top[m
[31m-  ** after:    [new_mo|itype] [... ...] [NULL|PC] [dummy|delta][m
[31m-  **                                                           ^base/top[m
[31m-  ** tailcall: [new_mo|PC]    [... ...][m
[31m-  **                         ^base     ^top[m
[31m-  */[m
[31m-  return 0;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Setup call to metamethod to be run by Assembler VM. */[m
[31m-static TValue *mmcall(lua_State *L, ASMFunction cont, cTValue *mo,[m
[31m-		    cTValue *a, cTValue *b)[m
[31m-{[m
[31m-  /*[m
[31m-  **           |-- framesize -> top       top+1       top+2 top+3[m
[31m-  ** before:   [func slots ...][m
[31m-  ** mm setup: [func slots ...] [cont|?]  [mo|tmtype] [a]   [b][m
[31m-  ** in asm:   [func slots ...] [cont|PC] [mo|delta]  [a]   [b][m
[31m-  **           ^-- func base                          ^-- mm base[m
[31m-  ** after mm: [func slots ...]           [result][m
[31m-  **                ^-- copy to base[PC_RA] --/     for lj_cont_ra[m
[31m-  **                          istruecond + branch   for lj_cont_cond*[m
[31m-  **                                       ignore   for lj_cont_nop[m
[31m-  ** next PC:  [func slots ...][m
[31m-  */[m
[31m-  TValue *top = L->top;[m
[31m-  if (curr_funcisL(L)) top = curr_topL(L);[m
[31m-  setcont(top++, cont);  /* Assembler VM stores PC in upper word or FR2. */[m
[31m-  if (LJ_FR2) setnilV(top++);[m
[31m-  copyTV(L, top++, mo);  /* Store metamethod and two arguments. */[m
[31m-  if (LJ_FR2) setnilV(top++);[m
[31m-  copyTV(L, top, a);[m
[31m-  copyTV(L, top+1, b);[m
[31m-  return top;  /* Return new base. */[m
[31m-}[m
[31m-[m
[31m-/* -- C helpers for some instructions, called from assembler VM ----------- */[m
[31m-[m
[31m-/* Helper for TGET*. __index chain and metamethod. */[m
[31m-cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k)[m
[31m-{[m
[31m-  int loop;[m
[31m-  for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {[m
[31m-    cTValue *mo;[m
[31m-    if (LJ_LIKELY(tvistab(o))) {[m
[31m-      GCtab *t = tabV(o);[m
[31m-      cTValue *tv = lj_tab_get(L, t, k);[m
[31m-      if (!tvisnil(tv) ||[m
[31m-	  !(mo = lj_meta_fast(L, tabref(t->metatable), MM_index)))[m
[31m-	return tv;[m
[31m-    } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_index))) {[m
[31m-      lj_err_optype(L, o, LJ_ERR_OPINDEX);[m
[31m-      return NULL;  /* unreachable */[m
[31m-    }[m
[31m-    if (tvisfunc(mo)) {[m
[31m-      L->top = mmcall(L, lj_cont_ra, mo, o, k);[m
[31m-      return NULL;  /* Trigger metamethod call. */[m
[31m-    }[m
[31m-    o = mo;[m
[31m-  }[m
[31m-  lj_err_msg(L, LJ_ERR_GETLOOP);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-/* Helper for TSET*. __newindex chain and metamethod. */[m
[31m-TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k)[m
[31m-{[m
[31m-  TValue tmp;[m
[31m-  int loop;[m
[31m-  for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {[m
[31m-    cTValue *mo;[m
[31m-    if (LJ_LIKELY(tvistab(o))) {[m
[31m-      GCtab *t = tabV(o);[m
[31m-      cTValue *tv = lj_tab_get(L, t, k);[m
[31m-      if (LJ_LIKELY(!tvisnil(tv))) {[m
[31m-	t->nomm = 0;  /* Invalidate negative metamethod cache. */[m
[31m-	lj_gc_anybarriert(L, t);[m
[31m-	return (TValue *)tv;[m
[31m-      } else if (!(mo = lj_meta_fast(L, tabref(t->metatable), MM_newindex))) {[m
[31m-	t->nomm = 0;  /* Invalidate negative metamethod cache. */[m
[31m-	lj_gc_anybarriert(L, t);[m
[31m-	if (tv != niltv(L))[m
[31m-	  return (TValue *)tv;[m
[31m-	if (tvisnil(k)) lj_err_msg(L, LJ_ERR_NILIDX);[m
[31m-	else if (tvisint(k)) { setnumV(&tmp, (lua_Number)intV(k)); k = &tmp; }[m
[31m-	else if (tvisnum(k) && tvisnan(k)) lj_err_msg(L, LJ_ERR_NANIDX);[m
[31m-	return lj_tab_newkey(L, t, k);[m
[31m-      }[m
[31m-    } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_newindex))) {[m
[31m-      lj_err_optype(L, o, LJ_ERR_OPINDEX);[m
[31m-      return NULL;  /* unreachable */[m
[31m-    }[m
[31m-    if (tvisfunc(mo)) {[m
[31m-      L->top = mmcall(L, lj_cont_nop, mo, o, k);[m
[31m-      /* L->top+2 = v filled in by caller. */[m
[31m-      return NULL;  /* Trigger metamethod call. */[m
[31m-    }[m
[31m-    copyTV(L, &tmp, mo);[m
[31m-    o = &tmp;[m
[31m-  }[m
[31m-  lj_err_msg(L, LJ_ERR_SETLOOP);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-static cTValue *str2num(cTValue *o, TValue *n)[m
[31m-{[m
[31m-  if (tvisnum(o))[m
[31m-    return o;[m
[31m-  else if (tvisint(o))[m
[31m-    return (setnumV(n, (lua_Number)intV(o)), n);[m
[31m-  else if (tvisstr(o) && lj_strscan_num(strV(o), n))[m
[31m-    return n;[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Helper for arithmetic instructions. Coercion, metamethod. */[m
[31m-TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb, cTValue *rc,[m
[31m-		      BCReg op)[m
[31m-{[m
[31m-  MMS mm = bcmode_mm(op);[m
[31m-  TValue tempb, tempc;[m
[31m-  cTValue *b, *c;[m
[31m-  if ((b = str2num(rb, &tempb)) != NULL &&[m
[31m-      (c = str2num(rc, &tempc)) != NULL) {  /* Try coercion first. */[m
[31m-    setnumV(ra, lj_vm_foldarith(numV(b), numV(c), (int)mm-MM_add));[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    cTValue *mo = lj_meta_lookup(L, rb, mm);[m
[31m-    if (tvisnil(mo)) {[m
[31m-      mo = lj_meta_lookup(L, rc, mm);[m
[31m-      if (tvisnil(mo)) {[m
[31m-	if (str2num(rb, &tempb) == NULL) rc = rb;[m
[31m-	lj_err_optype(L, rc, LJ_ERR_OPARITH);[m
[31m-	return NULL;  /* unreachable */[m
[31m-      }[m
[31m-    }[m
[31m-    return mmcall(L, lj_cont_ra, mo, rb, rc);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Helper for CAT. Coercion, iterative concat, __concat metamethod. */[m
[31m-TValue *lj_meta_cat(lua_State *L, TValue *top, int left)[m
[31m-{[m
[31m-  int fromc = 0;[m
[31m-  if (left < 0) { left = -left; fromc = 1; }[m
[31m-  do {[m
[31m-    if (!(tvisstr(top) || tvisnumber(top)) ||[m
[31m-	!(tvisstr(top-1) || tvisnumber(top-1))) {[m
[31m-      cTValue *mo = lj_meta_lookup(L, top-1, MM_concat);[m
[31m-      if (tvisnil(mo)) {[m
[31m-	mo = lj_meta_lookup(L, top, MM_concat);[m
[31m-	if (tvisnil(mo)) {[m
[31m-	  if (tvisstr(top-1) || tvisnumber(top-1)) top++;[m
[31m-	  lj_err_optype(L, top-1, LJ_ERR_OPCAT);[m
[31m-	  return NULL;  /* unreachable */[m
[31m-	}[m
[31m-      }[m
[31m-      /* One of the top two elements is not a string, call __cat metamethod:[m
[31m-      **[m
[31m-      ** before:    [...][CAT stack .........................][m
[31m-      **                                 top-1     top         top+1 top+2[m
[31m-      ** pick two:  [...][CAT stack ...] [o1]      [o2][m
[31m-      ** setup mm:  [...][CAT stack ...] [cont|?]  [mo|tmtype] [o1]  [o2][m
[31m-      ** in asm:    [...][CAT stack ...] [cont|PC] [mo|delta]  [o1]  [o2][m
[31m-      **            ^-- func base                              ^-- mm base[m
[31m-      ** after mm:  [...][CAT stack ...] <--push-- [result][m
[31m-      ** next step: [...][CAT stack .............][m
[31m-      */[m
[31m-      copyTV(L, top+2*LJ_FR2+2, top);  /* Carefully ordered stack copies! */[m
[31m-      copyTV(L, top+2*LJ_FR2+1, top-1);[m
[31m-      copyTV(L, top+LJ_FR2, mo);[m
[31m-      setcont(top-1, lj_cont_cat);[m
[31m-      if (LJ_FR2) { setnilV(top); setnilV(top+2); top += 2; }[m
[31m-      return top+1;  /* Trigger metamethod call. */[m
[31m-    } else {[m
[31m-      /* Pick as many strings as possible from the top and concatenate them:[m
[31m-      **[m
[31m-      ** before:    [...][CAT stack ...........................][m
[31m-      ** pick str:  [...][CAT stack ...] [...... strings ......][m
[31m-      ** concat:    [...][CAT stack ...] [result][m
[31m-      ** next step: [...][CAT stack ............][m
[31m-      */[m
[31m-      TValue *e, *o = top;[m
[31m-      uint64_t tlen = tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;[m
[31m-      SBuf *sb;[m
[31m-      do {[m
[31m-	o--; tlen += tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;[m
[31m-      } while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1)));[m
[31m-      if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV);[m
[31m-      sb = lj_buf_tmp_(L);[m
[31m-      lj_buf_more(sb, (MSize)tlen);[m
[31m-      for (e = top, top = o; o <= e; o++) {[m
[31m-	if (tvisstr(o)) {[m
[31m-	  GCstr *s = strV(o);[m
[31m-	  MSize len = s->len;[m
[31m-	  lj_buf_putmem(sb, strdata(s), len);[m
[31m-	} else if (tvisint(o)) {[m
[31m-	  lj_strfmt_putint(sb, intV(o));[m
[31m-	} else {[m
[31m-	  lj_strfmt_putfnum(sb, STRFMT_G14, numV(o));[m
[31m-	}[m
[31m-      }[m
[31m-      setstrV(L, top, lj_buf_str(L, sb));[m
[31m-    }[m
[31m-  } while (left >= 1);[m
[31m-  if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) {[m
[31m-    if (!fromc) L->top = curr_topL(L);[m
[31m-    lj_gc_step(L);[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Helper for LEN. __len metamethod. */[m
[31m-TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o)[m
[31m-{[m
[31m-  cTValue *mo = lj_meta_lookup(L, o, MM_len);[m
[31m-  if (tvisnil(mo)) {[m
[31m-    if (LJ_52 && tvistab(o))[m
[31m-      tabref(tabV(o)->metatable)->nomm |= (uint8_t)(1u<<MM_len);[m
[31m-    else[m
[31m-      lj_err_optype(L, o, LJ_ERR_OPLEN);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  return mmcall(L, lj_cont_ra, mo, o, LJ_52 ? o : niltv(L));[m
[31m-}[m
[31m-[m
[31m-/* Helper for equality comparisons. __eq metamethod. */[m
[31m-TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne)[m
[31m-{[m
[31m-  /* Field metatable must be at same offset for GCtab and GCudata! */[m
[31m-  cTValue *mo = lj_meta_fast(L, tabref(o1->gch.metatable), MM_eq);[m
[31m-  if (mo) {[m
[31m-    TValue *top;[m
[31m-    uint32_t it;[m
[31m-    if (tabref(o1->gch.metatable) != tabref(o2->gch.metatable)) {[m
[31m-      cTValue *mo2 = lj_meta_fast(L, tabref(o2->gch.metatable), MM_eq);[m
[31m-      if (mo2 == NULL || !lj_obj_equal(mo, mo2))[m
[31m-	return (TValue *)(intptr_t)ne;[m
[31m-    }[m
[31m-    top = curr_top(L);[m
[31m-    setcont(top++, ne ? lj_cont_condf : lj_cont_condt);[m
[31m-    if (LJ_FR2) setnilV(top++);[m
[31m-    copyTV(L, top++, mo);[m
[31m-    if (LJ_FR2) setnilV(top++);[m
[31m-    it = ~(uint32_t)o1->gch.gct;[m
[31m-    setgcV(L, top, o1, it);[m
[31m-    setgcV(L, top+1, o2, it);[m
[31m-    return top;  /* Trigger metamethod call. */[m
[31m-  }[m
[31m-  return (TValue *)(intptr_t)ne;[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins)[m
[31m-{[m
[31m-  ASMFunction cont = (bc_op(ins) & 1) ? lj_cont_condf : lj_cont_condt;[m
[31m-  int op = (int)bc_op(ins) & ~1;[m
[31m-  TValue tv;[m
[31m-  cTValue *mo, *o2, *o1 = &L->base[bc_a(ins)];[m
[31m-  cTValue *o1mm = o1;[m
[31m-  if (op == BC_ISEQV) {[m
[31m-    o2 = &L->base[bc_d(ins)];[m
[31m-    if (!tviscdata(o1mm)) o1mm = o2;[m
[31m-  } else if (op == BC_ISEQS) {[m
[31m-    setstrV(L, &tv, gco2str(proto_kgc(curr_proto(L), ~(ptrdiff_t)bc_d(ins))));[m
[31m-    o2 = &tv;[m
[31m-  } else if (op == BC_ISEQN) {[m
[31m-    o2 = &mref(curr_proto(L)->k, cTValue)[bc_d(ins)];[m
[31m-  } else {[m
[31m-    lua_assert(op == BC_ISEQP);[m
[31m-    setpriV(&tv, ~bc_d(ins));[m
[31m-    o2 = &tv;[m
[31m-  }[m
[31m-  mo = lj_meta_lookup(L, o1mm, MM_eq);[m
[31m-  if (LJ_LIKELY(!tvisnil(mo)))[m
[31m-    return mmcall(L, cont, mo, o1, o2);[m
[31m-  else[m
[31m-    return (TValue *)(intptr_t)(bc_op(ins) & 1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Helper for ordered comparisons. String compare, __lt/__le metamethods. */[m
[31m-TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op)[m
[31m-{[m
[31m-  if (LJ_HASFFI && (tviscdata(o1) || tviscdata(o2))) {[m
[31m-    ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;[m
[31m-    MMS mm = (op & 2) ? MM_le : MM_lt;[m
[31m-    cTValue *mo = lj_meta_lookup(L, tviscdata(o1) ? o1 : o2, mm);[m
[31m-    if (LJ_UNLIKELY(tvisnil(mo))) goto err;[m
[31m-    return mmcall(L, cont, mo, o1, o2);[m
[31m-  } else if (LJ_52 || itype(o1) == itype(o2)) {[m
[31m-    /* Never called with two numbers. */[m
[31m-    if (tvisstr(o1) && tvisstr(o2)) {[m
[31m-      int32_t res = lj_str_cmp(strV(o1), strV(o2));[m
[31m-      return (TValue *)(intptr_t)(((op&2) ? res <= 0 : res < 0) ^ (op&1));[m
[31m-    } else {[m
[31m-    trymt:[m
[31m-      while (1) {[m
[31m-	ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;[m
[31m-	MMS mm = (op & 2) ? MM_le : MM_lt;[m
[31m-	cTValue *mo = lj_meta_lookup(L, o1, mm);[m
[31m-#if LJ_52[m
[31m-	if (tvisnil(mo) && tvisnil((mo = lj_meta_lookup(L, o2, mm))))[m
[31m-#else[m
[31m-	cTValue *mo2 = lj_meta_lookup(L, o2, mm);[m
[31m-	if (tvisnil(mo) || !lj_obj_equal(mo, mo2))[m
[31m-#endif[m
[31m-	{[m
[31m-	  if (op & 2) {  /* MM_le not found: retry with MM_lt. */[m
[31m-	    cTValue *ot = o1; o1 = o2; o2 = ot;  /* Swap operands. */[m
[31m-	    op ^= 3;  /* Use LT and flip condition. */[m
[31m-	    continue;[m
[31m-	  }[m
[31m-	  goto err;[m
[31m-	}[m
[31m-	return mmcall(L, cont, mo, o1, o2);[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (tvisbool(o1) && tvisbool(o2)) {[m
[31m-    goto trymt;[m
[31m-  } else {[m
[31m-  err:[m
[31m-    lj_err_comp(L, o1, o2);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Helper for ISTYPE and ISNUM. Implicit coercion or error. */[m
[31m-void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp)[m
[31m-{[m
[31m-  L->top = curr_topL(L);[m
[31m-  ra++; tp--;[m
[31m-  lua_assert(LJ_DUALNUM || tp != ~LJ_TNUMX);  /* ISTYPE -> ISNUM broken. */[m
[31m-  if (LJ_DUALNUM && tp == ~LJ_TNUMX) lj_lib_checkint(L, ra);[m
[31m-  else if (tp == ~LJ_TNUMX+1) lj_lib_checknum(L, ra);[m
[31m-  else if (tp == ~LJ_TSTR) lj_lib_checkstr(L, ra);[m
[31m-  else lj_err_argtype(L, ra, lj_obj_itypename[tp]);[m
[31m-}[m
[31m-[m
[31m-/* Helper for calls. __call metamethod. */[m
[31m-void lj_meta_call(lua_State *L, TValue *func, TValue *top)[m
[31m-{[m
[31m-  cTValue *mo = lj_meta_lookup(L, func, MM_call);[m
[31m-  TValue *p;[m
[31m-  if (!tvisfunc(mo))[m
[31m-    lj_err_optype_call(L, func);[m
[31m-  for (p = top; p > func+2*LJ_FR2; p--) copyTV(L, p, p-1);[m
[31m-  if (LJ_FR2) copyTV(L, func+2, func);[m
[31m-  copyTV(L, func, mo);[m
[31m-}[m
[31m-[m
[31m-/* Helper for FORI. Coercion. */[m
[31m-void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o)[m
[31m-{[m
[31m-  if (!lj_strscan_numberobj(o)) lj_err_msg(L, LJ_ERR_FORINIT);[m
[31m-  if (!lj_strscan_numberobj(o+1)) lj_err_msg(L, LJ_ERR_FORLIM);[m
[31m-  if (!lj_strscan_numberobj(o+2)) lj_err_msg(L, LJ_ERR_FORSTEP);[m
[31m-  if (LJ_DUALNUM) {[m
[31m-    /* Ensure all slots are integers or all slots are numbers. */[m
[31m-    int32_t k[3];[m
[31m-    int nint = 0;[m
[31m-    ptrdiff_t i;[m
[31m-    for (i = 0; i <= 2; i++) {[m
[31m-      if (tvisint(o+i)) {[m
[31m-	k[i] = intV(o+i); nint++;[m
[31m-      } else {[m
[31m-	k[i] = lj_num2int(numV(o+i)); nint += ((lua_Number)k[i] == numV(o+i));[m
[31m-      }[m
[31m-    }[m
[31m-    if (nint == 3) {  /* Narrow to integers. */[m
[31m-      setintV(o, k[0]);[m
[31m-      setintV(o+1, k[1]);[m
[31m-      setintV(o+2, k[2]);[m
[31m-    } else if (nint != 0) {  /* Widen to numbers. */[m
[31m-      if (tvisint(o)) setnumV(o, (lua_Number)intV(o));[m
[31m-      if (tvisint(o+1)) setnumV(o+1, (lua_Number)intV(o+1));[m
[31m-      if (tvisint(o+2)) setnumV(o+2, (lua_Number)intV(o+2));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.h[m
[1mdeleted file mode 100644[m
[1mindex 52e85cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_meta.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-/*[m
[31m-** Metamethod handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_META_H[m
[31m-#define _LJ_META_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Metamethod handling */[m
[31m-LJ_FUNC void lj_meta_init(lua_State *L);[m
[31m-LJ_FUNC cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name);[m
[31m-LJ_FUNC cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC int lj_meta_tailcall(lua_State *L, cTValue *tv);[m
[31m-#endif[m
[31m-[m
[31m-#define lj_meta_fastg(g, mt, mm) \[m
[31m-  ((mt) == NULL ? NULL : ((mt)->nomm & (1u<<(mm))) ? NULL : \[m
[31m-   lj_meta_cache(mt, mm, mmname_str(g, mm)))[m
[31m-#define lj_meta_fast(L, mt, mm)	lj_meta_fastg(G(L), mt, mm)[m
[31m-[m
[31m-/* C helpers for some instructions, called from assembler VM. */[m
[31m-LJ_FUNCA cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k);[m
[31m-LJ_FUNCA TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k);[m
[31m-LJ_FUNCA TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb,[m
[31m-			       cTValue *rc, BCReg op);[m
[31m-LJ_FUNCA TValue *lj_meta_cat(lua_State *L, TValue *top, int left);[m
[31m-LJ_FUNCA TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o);[m
[31m-LJ_FUNCA TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne);[m
[31m-LJ_FUNCA TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins);[m
[31m-LJ_FUNCA TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op);[m
[31m-LJ_FUNCA void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp);[m
[31m-LJ_FUNCA void lj_meta_call(lua_State *L, TValue *func, TValue *top);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.c[m
[1mdeleted file mode 100644[m
[1mindex 1daea81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.c[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-/*[m
[31m-** Miscellaneous object handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_obj_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Object type names. */[m
[31m-LJ_DATADEF const char *const lj_obj_typename[] = {  /* ORDER LUA_T */[m
[31m-  "no value", "nil", "boolean", "userdata", "number", "string",[m
[31m-  "table", "function", "userdata", "thread", "proto", "cdata"[m
[31m-};[m
[31m-[m
[31m-LJ_DATADEF const char *const lj_obj_itypename[] = {  /* ORDER LJ_T */[m
[31m-  "nil", "boolean", "boolean", "userdata", "string", "upval", "thread",[m
[31m-  "proto", "function", "trace", "cdata", "table", "userdata", "number"[m
[31m-};[m
[31m-[m
[31m-/* Compare two objects without calling metamethods. */[m
[31m-int LJ_FASTCALL lj_obj_equal(cTValue *o1, cTValue *o2)[m
[31m-{[m
[31m-  if (itype(o1) == itype(o2)) {[m
[31m-    if (tvispri(o1))[m
[31m-      return 1;[m
[31m-    if (!tvisnum(o1))[m
[31m-      return gcrefeq(o1->gcr, o2->gcr);[m
[31m-  } else if (!tvisnumber(o1) || !tvisnumber(o2)) {[m
[31m-    return 0;[m
[31m-  }[m
[31m-  return numberVnum(o1) == numberVnum(o2);[m
[31m-}[m
[31m-[m
[31m-/* Return pointer to object or its object data. */[m
[31m-const void * LJ_FASTCALL lj_obj_ptr(cTValue *o)[m
[31m-{[m
[31m-  if (tvisudata(o))[m
[31m-    return uddata(udataV(o));[m
[31m-  else if (tvislightud(o))[m
[31m-    return lightudV(o);[m
[31m-  else if (LJ_HASFFI && tviscdata(o))[m
[31m-    return cdataptr(cdataV(o));[m
[31m-  else if (tvisgcv(o))[m
[31m-    return gcV(o);[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.h[m
[1mdeleted file mode 100644[m
[1mindex fda2820..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_obj.h[m
[1m+++ /dev/null[m
[36m@@ -1,981 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM tags, values and objects.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_OBJ_H[m
[31m-#define _LJ_OBJ_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-/* -- Memory references (32 bit address space) ---------------------------- */[m
[31m-[m
[31m-/* Memory and GC object sizes. */[m
[31m-typedef uint32_t MSize;[m
[31m-#if LJ_GC64[m
[31m-typedef uint64_t GCSize;[m
[31m-#else[m
[31m-typedef uint32_t GCSize;[m
[31m-#endif[m
[31m-[m
[31m-/* Memory reference */[m
[31m-typedef struct MRef {[m
[31m-#if LJ_GC64[m
[31m-  uint64_t ptr64;	/* True 64 bit pointer. */[m
[31m-#else[m
[31m-  uint32_t ptr32;	/* Pseudo 32 bit pointer. */[m
[31m-#endif[m
[31m-} MRef;[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define mref(r, t)	((t *)(void *)(r).ptr64)[m
[31m-[m
[31m-#define setmref(r, p)	((r).ptr64 = (uint64_t)(void *)(p))[m
[31m-#define setmrefr(r, v)	((r).ptr64 = (v).ptr64)[m
[31m-#else[m
[31m-#define mref(r, t)	((t *)(void *)(uintptr_t)(r).ptr32)[m
[31m-[m
[31m-#define setmref(r, p)	((r).ptr32 = (uint32_t)(uintptr_t)(void *)(p))[m
[31m-#define setmrefr(r, v)	((r).ptr32 = (v).ptr32)[m
[31m-#endif[m
[31m-[m
[31m-/* -- GC object references (32 bit address space) ------------------------- */[m
[31m-[m
[31m-/* GCobj reference */[m
[31m-typedef struct GCRef {[m
[31m-#if LJ_GC64[m
[31m-  uint64_t gcptr64;	/* True 64 bit pointer. */[m
[31m-#else[m
[31m-  uint32_t gcptr32;	/* Pseudo 32 bit pointer. */[m
[31m-#endif[m
[31m-} GCRef;[m
[31m-[m
[31m-/* Common GC header for all collectable objects. */[m
[31m-#define GCHeader	GCRef nextgc; uint8_t marked; uint8_t gct[m
[31m-/* This occupies 6 bytes, so use the next 2 bytes for non-32 bit fields. */[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define gcref(r)	((GCobj *)(r).gcptr64)[m
[31m-#define gcrefp(r, t)	((t *)(void *)(r).gcptr64)[m
[31m-#define gcrefu(r)	((r).gcptr64)[m
[31m-#define gcrefeq(r1, r2)	((r1).gcptr64 == (r2).gcptr64)[m
[31m-[m
[31m-#define setgcref(r, gc)	((r).gcptr64 = (uint64_t)&(gc)->gch)[m
[31m-#define setgcreft(r, gc, it) \[m
[31m-  (r).gcptr64 = (uint64_t)&(gc)->gch | (((uint64_t)(it)) << 47)[m
[31m-#define setgcrefp(r, p)	((r).gcptr64 = (uint64_t)(p))[m
[31m-#define setgcrefnull(r)	((r).gcptr64 = 0)[m
[31m-#define setgcrefr(r, v)	((r).gcptr64 = (v).gcptr64)[m
[31m-#else[m
[31m-#define gcref(r)	((GCobj *)(uintptr_t)(r).gcptr32)[m
[31m-#define gcrefp(r, t)	((t *)(void *)(uintptr_t)(r).gcptr32)[m
[31m-#define gcrefu(r)	((r).gcptr32)[m
[31m-#define gcrefeq(r1, r2)	((r1).gcptr32 == (r2).gcptr32)[m
[31m-[m
[31m-#define setgcref(r, gc)	((r).gcptr32 = (uint32_t)(uintptr_t)&(gc)->gch)[m
[31m-#define setgcrefp(r, p)	((r).gcptr32 = (uint32_t)(uintptr_t)(p))[m
[31m-#define setgcrefnull(r)	((r).gcptr32 = 0)[m
[31m-#define setgcrefr(r, v)	((r).gcptr32 = (v).gcptr32)[m
[31m-#endif[m
[31m-[m
[31m-#define gcnext(gc)	(gcref((gc)->gch.nextgc))[m
[31m-[m
[31m-/* IMPORTANT NOTE:[m
[31m-**[m
[31m-** All uses of the setgcref* macros MUST be accompanied with a write barrier.[m
[31m-**[m
[31m-** This is to ensure the integrity of the incremental GC. The invariant[m
[31m-** to preserve is that a black object never points to a white object.[m
[31m-** I.e. never store a white object into a field of a black object.[m
[31m-**[m
[31m-** It's ok to LEAVE OUT the write barrier ONLY in the following cases:[m
[31m-** - The source is not a GC object (NULL).[m
[31m-** - The target is a GC root. I.e. everything in global_State.[m
[31m-** - The target is a lua_State field (threads are never black).[m
[31m-** - The target is a stack slot, see setgcV et al.[m
[31m-** - The target is an open upvalue, i.e. pointing to a stack slot.[m
[31m-** - The target is a newly created object (i.e. marked white). But make[m
[31m-**   sure nothing invokes the GC inbetween.[m
[31m-** - The target and the source are the same object (self-reference).[m
[31m-** - The target already contains the object (e.g. moving elements around).[m
[31m-**[m
[31m-** The most common case is a store to a stack slot. All other cases where[m
[31m-** a barrier has been omitted are annotated with a NOBARRIER comment.[m
[31m-**[m
[31m-** The same logic applies for stores to table slots (array part or hash[m
[31m-** part). ALL uses of lj_tab_set* require a barrier for the stored value[m
[31m-** *and* the stored key, based on the above rules. In practice this means[m
[31m-** a barrier is needed if *either* of the key or value are a GC object.[m
[31m-**[m
[31m-** It's ok to LEAVE OUT the write barrier in the following special cases:[m
[31m-** - The stored value is nil. The key doesn't matter because it's either[m
[31m-**   not resurrected or lj_tab_newkey() will take care of the key barrier.[m
[31m-** - The key doesn't matter if the *previously* stored value is guaranteed[m
[31m-**   to be non-nil (because the key is kept alive in the table).[m
[31m-** - The key doesn't matter if it's guaranteed not to be part of the table,[m
[31m-**   since lj_tab_newkey() takes care of the key barrier. This applies[m
[31m-**   trivially to new tables, but watch out for resurrected keys. Storing[m
[31m-**   a nil value leaves the key in the table![m
[31m-**[m
[31m-** In case of doubt use lj_gc_anybarriert() as it's rather cheap. It's used[m
[31m-** by the interpreter for all table stores.[m
[31m-**[m
[31m-** Note: In contrast to Lua's GC, LuaJIT's GC does *not* specially mark[m
[31m-** dead keys in tables. The reference is left in, but it's guaranteed to[m
[31m-** be never dereferenced as long as the value is nil. It's ok if the key is[m
[31m-** freed or if any object subsequently gets the same address.[m
[31m-**[m
[31m-** Not destroying dead keys helps to keep key hash slots stable. This avoids[m
[31m-** specialization back-off for HREFK when a value flips between nil and[m
[31m-** non-nil and the GC gets in the way. It also allows safely hoisting[m
[31m-** HREF/HREFK across GC steps. Dead keys are only removed if a table is[m
[31m-** resized (i.e. by NEWREF) and xREF must not be CSEd across a resize.[m
[31m-**[m
[31m-** The trade-off is that a write barrier for tables must take the key into[m
[31m-** account, too. Implicitly resurrecting the key by storing a non-nil value[m
[31m-** may invalidate the incremental GC invariant.[m
[31m-*/[m
[31m-[m
[31m-/* -- Common type definitions --------------------------------------------- */[m
[31m-[m
[31m-/* Types for handling bytecodes. Need this here, details in lj_bc.h. */[m
[31m-typedef uint32_t BCIns;  /* Bytecode instruction. */[m
[31m-typedef uint32_t BCPos;  /* Bytecode position. */[m
[31m-typedef uint32_t BCReg;  /* Bytecode register. */[m
[31m-typedef int32_t BCLine;  /* Bytecode line number. */[m
[31m-[m
[31m-/* Internal assembler functions. Never call these directly from C. */[m
[31m-typedef void (*ASMFunction)(void);[m
[31m-[m
[31m-/* Resizable string buffer. Need this here, details in lj_buf.h. */[m
[31m-typedef struct SBuf {[m
[31m-  MRef p;		/* String buffer pointer. */[m
[31m-  MRef e;		/* String buffer end pointer. */[m
[31m-  MRef b;		/* String buffer base. */[m
[31m-  MRef L;		/* lua_State, used for buffer resizing. */[m
[31m-} SBuf;[m
[31m-[m
[31m-/* -- Tags and values ----------------------------------------------------- */[m
[31m-[m
[31m-/* Frame link. */[m
[31m-typedef union {[m
[31m-  int32_t ftsz;		/* Frame type and size of previous frame. */[m
[31m-  MRef pcr;		/* Or PC for Lua frames. */[m
[31m-} FrameLink;[m
[31m-[m
[31m-/* Tagged value. */[m
[31m-typedef LJ_ALIGN(8) union TValue {[m
[31m-  uint64_t u64;		/* 64 bit pattern overlaps number. */[m
[31m-  lua_Number n;		/* Number object overlaps split tag/value object. */[m
[31m-#if LJ_GC64[m
[31m-  GCRef gcr;		/* GCobj reference with tag. */[m
[31m-  int64_t it64;[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      int32_t i;	/* Integer value. */[m
[31m-    , uint32_t it;	/* Internal object tag. Must overlap MSW of number. */[m
[31m-    )[m
[31m-  };[m
[31m-#else[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      union {[m
[31m-	GCRef gcr;	/* GCobj reference (if any). */[m
[31m-	int32_t i;	/* Integer value. */[m
[31m-      };[m
[31m-    , uint32_t it;	/* Internal object tag. Must overlap MSW of number. */[m
[31m-    )[m
[31m-  };[m
[31m-#endif[m
[31m-#if LJ_FR2[m
[31m-  int64_t ftsz;		/* Frame type and size of previous frame, or PC. */[m
[31m-#else[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      GCRef func;	/* Function for next frame (or dummy L). */[m
[31m-    , FrameLink tp;	/* Link to previous frame. */[m
[31m-    )[m
[31m-  } fr;[m
[31m-#endif[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      uint32_t lo;	/* Lower 32 bits of number. */[m
[31m-    , uint32_t hi;	/* Upper 32 bits of number. */[m
[31m-    )[m
[31m-  } u32;[m
[31m-} TValue;[m
[31m-[m
[31m-typedef const TValue cTValue;[m
[31m-[m
[31m-#define tvref(r)	(mref(r, TValue))[m
[31m-[m
[31m-/* More external and GCobj tags for internal objects. */[m
[31m-#define LAST_TT		LUA_TTHREAD[m
[31m-#define LUA_TPROTO	(LAST_TT+1)[m
[31m-#define LUA_TCDATA	(LAST_TT+2)[m
[31m-[m
[31m-/* Internal object tags.[m
[31m-**[m
[31m-** Format for 32 bit GC references (!LJ_GC64):[m
[31m-**[m
[31m-** Internal tags overlap the MSW of a number object (must be a double).[m
[31m-** Interpreted as a double these are special NaNs. The FPU only generates[m
[31m-** one type of NaN (0xfff8_0000_0000_0000). So MSWs > 0xfff80000 are available[m
[31m-** for use as internal tags. Small negative numbers are used to shorten the[m
[31m-** encoding of type comparisons (reg/mem against sign-ext. 8 bit immediate).[m
[31m-**[m
[31m-**                  ---MSW---.---LSW---[m
[31m-** primitive types |  itype  |         |[m
[31m-** lightuserdata   |  itype  |  void * |  (32 bit platforms)[m
[31m-** lightuserdata   |ffff|    void *    |  (64 bit platforms, 47 bit pointers)[m
[31m-** GC objects      |  itype  |  GCRef  |[m
[31m-** int (LJ_DUALNUM)|  itype  |   int   |[m
[31m-** number           -------double------[m
[31m-**[m
[31m-** Format for 64 bit GC references (LJ_GC64):[m
[31m-**[m
[31m-** The upper 13 bits must be 1 (0xfff8...) for a special NaN. The next[m
[31m-** 4 bits hold the internal tag. The lowest 47 bits either hold a pointer,[m
[31m-** a zero-extended 32 bit integer or all bits set to 1 for primitive types.[m
[31m-**[m
[31m-**                     ------MSW------.------LSW------[m
[31m-** primitive types    |1..1|itype|1..................1|[m
[31m-** GC objects/lightud |1..1|itype|-------GCRef--------|[m
[31m-** int (LJ_DUALNUM)   |1..1|itype|0..0|-----int-------|[m
[31m-** number              ------------double-------------[m
[31m-**[m
[31m-** ORDER LJ_T[m
[31m-** Primitive types nil/false/true must be first, lightuserdata next.[m
[31m-** GC objects are at the end, table/userdata must be lowest.[m
[31m-** Also check lj_ir.h for similar ordering constraints.[m
[31m-*/[m
[31m-#define LJ_TNIL			(~0u)[m
[31m-#define LJ_TFALSE		(~1u)[m
[31m-#define LJ_TTRUE		(~2u)[m
[31m-#define LJ_TLIGHTUD		(~3u)[m
[31m-#define LJ_TSTR			(~4u)[m
[31m-#define LJ_TUPVAL		(~5u)[m
[31m-#define LJ_TTHREAD		(~6u)[m
[31m-#define LJ_TPROTO		(~7u)[m
[31m-#define LJ_TFUNC		(~8u)[m
[31m-#define LJ_TTRACE		(~9u)[m
[31m-#define LJ_TCDATA		(~10u)[m
[31m-#define LJ_TTAB			(~11u)[m
[31m-#define LJ_TUDATA		(~12u)[m
[31m-/* This is just the canonical number type used in some places. */[m
[31m-#define LJ_TNUMX		(~13u)[m
[31m-[m
[31m-/* Integers have itype == LJ_TISNUM doubles have itype < LJ_TISNUM */[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define LJ_TISNUM		0xfffeffffu[m
[31m-#else[m
[31m-#define LJ_TISNUM		LJ_TNUMX[m
[31m-#endif[m
[31m-#define LJ_TISTRUECOND		LJ_TFALSE[m
[31m-#define LJ_TISPRI		LJ_TTRUE[m
[31m-#define LJ_TISGCV		(LJ_TSTR+1)[m
[31m-#define LJ_TISTABUD		LJ_TTAB[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define LJ_GCVMASK		(((uint64_t)1 << 47) - 1)[m
[31m-#endif[m
[31m-[m
[31m-/* -- String object ------------------------------------------------------- */[m
[31m-[m
[31m-/* String object header. String payload follows. */[m
[31m-typedef struct GCstr {[m
[31m-  GCHeader;[m
[31m-  uint8_t reserved;	/* Used by lexer for fast lookup of reserved words. */[m
[31m-  uint8_t unused;[m
[31m-  MSize hash;		/* Hash of string. */[m
[31m-  MSize len;		/* Size of string. */[m
[31m-} GCstr;[m
[31m-[m
[31m-#define strref(r)	(&gcref((r))->str)[m
[31m-#define strdata(s)	((const char *)((s)+1))[m
[31m-#define strdatawr(s)	((char *)((s)+1))[m
[31m-#define strVdata(o)	strdata(strV(o))[m
[31m-#define sizestring(s)	(sizeof(struct GCstr)+(s)->len+1)[m
[31m-[m
[31m-/* -- Userdata object ----------------------------------------------------- */[m
[31m-[m
[31m-/* Userdata object. Payload follows. */[m
[31m-typedef struct GCudata {[m
[31m-  GCHeader;[m
[31m-  uint8_t udtype;	/* Userdata type. */[m
[31m-  uint8_t unused2;[m
[31m-  GCRef env;		/* Should be at same offset in GCfunc. */[m
[31m-  MSize len;		/* Size of payload. */[m
[31m-  GCRef metatable;	/* Must be at same offset in GCtab. */[m
[31m-  uint32_t align1;	/* To force 8 byte alignment of the payload. */[m
[31m-} GCudata;[m
[31m-[m
[31m-/* Userdata types. */[m
[31m-enum {[m
[31m-  UDTYPE_USERDATA,	/* Regular userdata. */[m
[31m-  UDTYPE_IO_FILE,	/* I/O library FILE. */[m
[31m-  UDTYPE_FFI_CLIB,	/* FFI C library namespace. */[m
[31m-  UDTYPE__MAX[m
[31m-};[m
[31m-[m
[31m-#define uddata(u)	((void *)((u)+1))[m
[31m-#define sizeudata(u)	(sizeof(struct GCudata)+(u)->len)[m
[31m-[m
[31m-/* -- C data object ------------------------------------------------------- */[m
[31m-[m
[31m-/* C data object. Payload follows. */[m
[31m-typedef struct GCcdata {[m
[31m-  GCHeader;[m
[31m-  uint16_t ctypeid;	/* C type ID. */[m
[31m-} GCcdata;[m
[31m-[m
[31m-/* Prepended to variable-sized or realigned C data objects. */[m
[31m-typedef struct GCcdataVar {[m
[31m-  uint16_t offset;	/* Offset to allocated memory (relative to GCcdata). */[m
[31m-  uint16_t extra;	/* Extra space allocated (incl. GCcdata + GCcdatav). */[m
[31m-  MSize len;		/* Size of payload. */[m
[31m-} GCcdataVar;[m
[31m-[m
[31m-#define cdataptr(cd)	((void *)((cd)+1))[m
[31m-#define cdataisv(cd)	((cd)->marked & 0x80)[m
[31m-#define cdatav(cd)	((GCcdataVar *)((char *)(cd) - sizeof(GCcdataVar)))[m
[31m-#define cdatavlen(cd)	check_exp(cdataisv(cd), cdatav(cd)->len)[m
[31m-#define sizecdatav(cd)	(cdatavlen(cd) + cdatav(cd)->extra)[m
[31m-#define memcdatav(cd)	((void *)((char *)(cd) - cdatav(cd)->offset))[m
[31m-[m
[31m-/* -- Prototype object ---------------------------------------------------- */[m
[31m-[m
[31m-#define SCALE_NUM_GCO	((int32_t)sizeof(lua_Number)/sizeof(GCRef))[m
[31m-#define round_nkgc(n)	(((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1))[m
[31m-[m
[31m-typedef struct GCproto {[m
[31m-  GCHeader;[m
[31m-  uint8_t numparams;	/* Number of parameters. */[m
[31m-  uint8_t framesize;	/* Fixed frame size. */[m
[31m-  MSize sizebc;		/* Number of bytecode instructions. */[m
[31m-#if LJ_GC64[m
[31m-  uint32_t unused_gc64;[m
[31m-#endif[m
[31m-  GCRef gclist;[m
[31m-  MRef k;		/* Split constant array (points to the middle). */[m
[31m-  MRef uv;		/* Upvalue list. local slot|0x8000 or parent uv idx. */[m
[31m-  MSize sizekgc;	/* Number of collectable constants. */[m
[31m-  MSize sizekn;		/* Number of lua_Number constants. */[m
[31m-  MSize sizept;		/* Total size including colocated arrays. */[m
[31m-  uint8_t sizeuv;	/* Number of upvalues. */[m
[31m-  uint8_t flags;	/* Miscellaneous flags (see below). */[m
[31m-  uint16_t trace;	/* Anchor for chain of root traces. */[m
[31m-  /* ------ The following fields are for debugging/tracebacks only ------ */[m
[31m-  GCRef chunkname;	/* Name of the chunk this function was defined in. */[m
[31m-  BCLine firstline;	/* First line of the function definition. */[m
[31m-  BCLine numline;	/* Number of lines for the function definition. */[m
[31m-  MRef lineinfo;	/* Compressed map from bytecode ins. to source line. */[m
[31m-  MRef uvinfo;		/* Upvalue names. */[m
[31m-  MRef varinfo;		/* Names and compressed extents of local variables. */[m
[31m-} GCproto;[m
[31m-[m
[31m-/* Flags for prototype. */[m
[31m-#define PROTO_CHILD		0x01	/* Has child prototypes. */[m
[31m-#define PROTO_VARARG		0x02	/* Vararg function. */[m
[31m-#define PROTO_FFI		0x04	/* Uses BC_KCDATA for FFI datatypes. */[m
[31m-#define PROTO_NOJIT		0x08	/* JIT disabled for this function. */[m
[31m-#define PROTO_ILOOP		0x10	/* Patched bytecode with ILOOP etc. */[m
[31m-/* Only used during parsing. */[m
[31m-#define PROTO_HAS_RETURN	0x20	/* Already emitted a return. */[m
[31m-#define PROTO_FIXUP_RETURN	0x40	/* Need to fixup emitted returns. */[m
[31m-/* Top bits used for counting created closures. */[m
[31m-#define PROTO_CLCOUNT		0x20	/* Base of saturating 3 bit counter. */[m
[31m-#define PROTO_CLC_BITS		3[m
[31m-#define PROTO_CLC_POLY		(3*PROTO_CLCOUNT)  /* Polymorphic threshold. */[m
[31m-[m
[31m-#define PROTO_UV_LOCAL		0x8000	/* Upvalue for local slot. */[m
[31m-#define PROTO_UV_IMMUTABLE	0x4000	/* Immutable upvalue. */[m
[31m-[m
[31m-#define proto_kgc(pt, idx) \[m
[31m-  check_exp((uintptr_t)(intptr_t)(idx) >= (uintptr_t)-(intptr_t)(pt)->sizekgc, \[m
[31m-	    gcref(mref((pt)->k, GCRef)[(idx)]))[m
[31m-#define proto_knumtv(pt, idx) \[m
[31m-  check_exp((uintptr_t)(idx) < (pt)->sizekn, &mref((pt)->k, TValue)[(idx)])[m
[31m-#define proto_bc(pt)		((BCIns *)((char *)(pt) + sizeof(GCproto)))[m
[31m-#define proto_bcpos(pt, pc)	((BCPos)((pc) - proto_bc(pt)))[m
[31m-#define proto_uv(pt)		(mref((pt)->uv, uint16_t))[m
[31m-[m
[31m-#define proto_chunkname(pt)	(strref((pt)->chunkname))[m
[31m-#define proto_chunknamestr(pt)	(strdata(proto_chunkname((pt))))[m
[31m-#define proto_lineinfo(pt)	(mref((pt)->lineinfo, const void))[m
[31m-#define proto_uvinfo(pt)	(mref((pt)->uvinfo, const uint8_t))[m
[31m-#define proto_varinfo(pt)	(mref((pt)->varinfo, const uint8_t))[m
[31m-[m
[31m-/* -- Upvalue object ------------------------------------------------------ */[m
[31m-[m
[31m-typedef struct GCupval {[m
[31m-  GCHeader;[m
[31m-  uint8_t closed;	/* Set if closed (i.e. uv->v == &uv->u.value). */[m
[31m-  uint8_t immutable;	/* Immutable value. */[m
[31m-  union {[m
[31m-    TValue tv;		/* If closed: the value itself. */[m
[31m-    struct {		/* If open: double linked list, anchored at thread. */[m
[31m-      GCRef prev;[m
[31m-      GCRef next;[m
[31m-    };[m
[31m-  };[m
[31m-  MRef v;		/* Points to stack slot (open) or above (closed). */[m
[31m-  uint32_t dhash;	/* Disambiguation hash: dh1 != dh2 => cannot alias. */[m
[31m-} GCupval;[m
[31m-[m
[31m-#define uvprev(uv_)	(&gcref((uv_)->prev)->uv)[m
[31m-#define uvnext(uv_)	(&gcref((uv_)->next)->uv)[m
[31m-#define uvval(uv_)	(mref((uv_)->v, TValue))[m
[31m-[m
[31m-/* -- Function object (closures) ------------------------------------------ */[m
[31m-[m
[31m-/* Common header for functions. env should be at same offset in GCudata. */[m
[31m-#define GCfuncHeader \[m
[31m-  GCHeader; uint8_t ffid; uint8_t nupvalues; \[m
[31m-  GCRef env; GCRef gclist; MRef pc[m
[31m-[m
[31m-typedef struct GCfuncC {[m
[31m-  GCfuncHeader;[m
[31m-  lua_CFunction f;	/* C function to be called. */[m
[31m-  TValue upvalue[1];	/* Array of upvalues (TValue). */[m
[31m-} GCfuncC;[m
[31m-[m
[31m-typedef struct GCfuncL {[m
[31m-  GCfuncHeader;[m
[31m-  GCRef uvptr[1];	/* Array of _pointers_ to upvalue objects (GCupval). */[m
[31m-} GCfuncL;[m
[31m-[m
[31m-typedef union GCfunc {[m
[31m-  GCfuncC c;[m
[31m-  GCfuncL l;[m
[31m-} GCfunc;[m
[31m-[m
[31m-#define FF_LUA		0[m
[31m-#define FF_C		1[m
[31m-#define isluafunc(fn)	((fn)->c.ffid == FF_LUA)[m
[31m-#define iscfunc(fn)	((fn)->c.ffid == FF_C)[m
[31m-#define isffunc(fn)	((fn)->c.ffid > FF_C)[m
[31m-#define funcproto(fn) \[m
[31m-  check_exp(isluafunc(fn), (GCproto *)(mref((fn)->l.pc, char)-sizeof(GCproto)))[m
[31m-#define sizeCfunc(n)	(sizeof(GCfuncC)-sizeof(TValue)+sizeof(TValue)*(n))[m
[31m-#define sizeLfunc(n)	(sizeof(GCfuncL)-sizeof(GCRef)+sizeof(GCRef)*(n))[m
[31m-[m
[31m-/* -- Table object -------------------------------------------------------- */[m
[31m-[m
[31m-/* Hash node. */[m
[31m-typedef struct Node {[m
[31m-  TValue val;		/* Value object. Must be first field. */[m
[31m-  TValue key;		/* Key object. */[m
[31m-  MRef next;		/* Hash chain. */[m
[31m-#if !LJ_GC64[m
[31m-  MRef freetop;		/* Top of free elements (stored in t->node[0]). */[m
[31m-#endif[m
[31m-} Node;[m
[31m-[m
[31m-LJ_STATIC_ASSERT(offsetof(Node, val) == 0);[m
[31m-[m
[31m-typedef struct GCtab {[m
[31m-  GCHeader;[m
[31m-  uint8_t nomm;		/* Negative cache for fast metamethods. */[m
[31m-  int8_t colo;		/* Array colocation. */[m
[31m-  MRef array;		/* Array part. */[m
[31m-  GCRef gclist;[m
[31m-  GCRef metatable;	/* Must be at same offset in GCudata. */[m
[31m-  MRef node;		/* Hash part. */[m
[31m-  uint32_t asize;	/* Size of array part (keys [0, asize-1]). */[m
[31m-  uint32_t hmask;	/* Hash part mask (size of hash part - 1). */[m
[31m-#if LJ_GC64[m
[31m-  MRef freetop;		/* Top of free elements. */[m
[31m-#endif[m
[31m-} GCtab;[m
[31m-[m
[31m-#define sizetabcolo(n)	((n)*sizeof(TValue) + sizeof(GCtab))[m
[31m-#define tabref(r)	(&gcref((r))->tab)[m
[31m-#define noderef(r)	(mref((r), Node))[m
[31m-#define nextnode(n)	(mref((n)->next, Node))[m
[31m-#if LJ_GC64[m
[31m-#define getfreetop(t, n)	(noderef((t)->freetop))[m
[31m-#define setfreetop(t, n, v)	(setmref((t)->freetop, (v)))[m
[31m-#else[m
[31m-#define getfreetop(t, n)	(noderef((n)->freetop))[m
[31m-#define setfreetop(t, n, v)	(setmref((n)->freetop, (v)))[m
[31m-#endif[m
[31m-[m
[31m-/* -- State objects ------------------------------------------------------- */[m
[31m-[m
[31m-/* VM states. */[m
[31m-enum {[m
[31m-  LJ_VMST_INTERP,	/* Interpreter. */[m
[31m-  LJ_VMST_C,		/* C function. */[m
[31m-  LJ_VMST_GC,		/* Garbage collector. */[m
[31m-  LJ_VMST_EXIT,		/* Trace exit handler. */[m
[31m-  LJ_VMST_RECORD,	/* Trace recorder. */[m
[31m-  LJ_VMST_OPT,		/* Optimizer. */[m
[31m-  LJ_VMST_ASM,		/* Assembler. */[m
[31m-  LJ_VMST__MAX[m
[31m-};[m
[31m-[m
[31m-#define setvmstate(g, st)	((g)->vmstate = ~LJ_VMST_##st)[m
[31m-[m
[31m-/* Metamethods. ORDER MM */[m
[31m-#ifdef LJ_HASFFI[m
[31m-#define MMDEF_FFI(_) _(new)[m
[31m-#else[m
[31m-#define MMDEF_FFI(_)[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_52 || LJ_HASFFI[m
[31m-#define MMDEF_PAIRS(_) _(pairs) _(ipairs)[m
[31m-#else[m
[31m-#define MMDEF_PAIRS(_)[m
[31m-#define MM_pairs	255[m
[31m-#define MM_ipairs	255[m
[31m-#endif[m
[31m-[m
[31m-#define MMDEF(_) \[m
[31m-  _(index) _(newindex) _(gc) _(mode) _(eq) _(len) \[m
[31m-  /* Only the above (fast) metamethods are negative cached (max. 8). */ \[m
[31m-  _(lt) _(le) _(concat) _(call) \[m
[31m-  /* The following must be in ORDER ARITH. */ \[m
[31m-  _(add) _(sub) _(mul) _(div) _(mod) _(pow) _(unm) \[m
[31m-  /* The following are used in the standard libraries. */ \[m
[31m-  _(metatable) _(tostring) MMDEF_FFI(_) MMDEF_PAIRS(_)[m
[31m-[m
[31m-typedef enum {[m
[31m-#define MMENUM(name)	MM_##name,[m
[31m-MMDEF(MMENUM)[m
[31m-#undef MMENUM[m
[31m-  MM__MAX,[m
[31m-  MM____ = MM__MAX,[m
[31m-  MM_FAST = MM_len[m
[31m-} MMS;[m
[31m-[m
[31m-/* GC root IDs. */[m
[31m-typedef enum {[m
[31m-  GCROOT_MMNAME,	/* Metamethod names. */[m
[31m-  GCROOT_MMNAME_LAST = GCROOT_MMNAME + MM__MAX-1,[m
[31m-  GCROOT_BASEMT,	/* Metatables for base types. */[m
[31m-  GCROOT_BASEMT_NUM = GCROOT_BASEMT + ~LJ_TNUMX,[m
[31m-  GCROOT_IO_INPUT,	/* Userdata for default I/O input file. */[m
[31m-  GCROOT_IO_OUTPUT,	/* Userdata for default I/O output file. */[m
[31m-  GCROOT_MAX[m
[31m-} GCRootID;[m
[31m-[m
[31m-#define basemt_it(g, it)	((g)->gcroot[GCROOT_BASEMT+~(it)])[m
[31m-#define basemt_obj(g, o)	((g)->gcroot[GCROOT_BASEMT+itypemap(o)])[m
[31m-#define mmname_str(g, mm)	(strref((g)->gcroot[GCROOT_MMNAME+(mm)]))[m
[31m-[m
[31m-typedef struct GCState {[m
[31m-  GCSize total;		/* Memory currently allocated. */[m
[31m-  GCSize threshold;	/* Memory threshold. */[m
[31m-  uint8_t currentwhite;	/* Current white color. */[m
[31m-  uint8_t state;	/* GC state. */[m
[31m-  uint8_t nocdatafin;	/* No cdata finalizer called. */[m
[31m-  uint8_t unused2;[m
[31m-  MSize sweepstr;	/* Sweep position in string table. */[m
[31m-  GCRef root;		/* List of all collectable objects. */[m
[31m-  MRef sweep;		/* Sweep position in root list. */[m
[31m-  GCRef gray;		/* List of gray objects. */[m
[31m-  GCRef grayagain;	/* List of objects for atomic traversal. */[m
[31m-  GCRef weak;		/* List of weak tables (to be cleared). */[m
[31m-  GCRef mmudata;	/* List of userdata (to be finalized). */[m
[31m-  GCSize debt;		/* Debt (how much GC is behind schedule). */[m
[31m-  GCSize estimate;	/* Estimate of memory actually in use. */[m
[31m-  MSize stepmul;	/* Incremental GC step granularity. */[m
[31m-  MSize pause;		/* Pause between successive GC cycles. */[m
[31m-} GCState;[m
[31m-[m
[31m-/* Global state, shared by all threads of a Lua universe. */[m
[31m-typedef struct global_State {[m
[31m-  GCRef *strhash;	/* String hash table (hash chain anchors). */[m
[31m-  MSize strmask;	/* String hash mask (size of hash table - 1). */[m
[31m-  MSize strnum;		/* Number of strings in hash table. */[m
[31m-  lua_Alloc allocf;	/* Memory allocator. */[m
[31m-  void *allocd;		/* Memory allocator data. */[m
[31m-  GCState gc;		/* Garbage collector. */[m
[31m-  volatile int32_t vmstate;  /* VM state or current JIT code trace number. */[m
[31m-  SBuf tmpbuf;		/* Temporary string buffer. */[m
[31m-  GCstr strempty;	/* Empty string. */[m
[31m-  uint8_t stremptyz;	/* Zero terminator of empty string. */[m
[31m-  uint8_t hookmask;	/* Hook mask. */[m
[31m-  uint8_t dispatchmode;	/* Dispatch mode. */[m
[31m-  uint8_t vmevmask;	/* VM event mask. */[m
[31m-  GCRef mainthref;	/* Link to main thread. */[m
[31m-  TValue registrytv;	/* Anchor for registry. */[m
[31m-  TValue tmptv, tmptv2;	/* Temporary TValues. */[m
[31m-  Node nilnode;		/* Fallback 1-element hash part (nil key and value). */[m
[31m-  GCupval uvhead;	/* Head of double-linked list of all open upvalues. */[m
[31m-  int32_t hookcount;	/* Instruction hook countdown. */[m
[31m-  int32_t hookcstart;	/* Start count for instruction hook counter. */[m
[31m-  lua_Hook hookf;	/* Hook function. */[m
[31m-  lua_CFunction wrapf;	/* Wrapper for C function calls. */[m
[31m-  lua_CFunction panic;	/* Called as a last resort for errors. */[m
[31m-  BCIns bc_cfunc_int;	/* Bytecode for internal C function calls. */[m
[31m-  BCIns bc_cfunc_ext;	/* Bytecode for external C function calls. */[m
[31m-  GCRef cur_L;		/* Currently executing lua_State. */[m
[31m-  MRef jit_base;	/* Current JIT code L->base or NULL. */[m
[31m-  MRef saved_jit_base;  /* saved jit_base for lj_err_throw */[m
[31m-  MRef ctype_state;	/* Pointer to C type state. */[m
[31m-  GCRef gcroot[GCROOT_MAX];  /* GC roots. */[m
[31m-} global_State;[m
[31m-[m
[31m-#define mainthread(g)	(&gcref(g->mainthref)->th)[m
[31m-#define niltv(L) \[m
[31m-  check_exp(tvisnil(&G(L)->nilnode.val), &G(L)->nilnode.val)[m
[31m-#define niltvg(g) \[m
[31m-  check_exp(tvisnil(&(g)->nilnode.val), &(g)->nilnode.val)[m
[31m-[m
[31m-/* Hook management. Hook event masks are defined in lua.h. */[m
[31m-#define HOOK_EVENTMASK		0x0f[m
[31m-#define HOOK_ACTIVE		0x10[m
[31m-#define HOOK_ACTIVE_SHIFT	4[m
[31m-#define HOOK_VMEVENT		0x20[m
[31m-#define HOOK_GC			0x40[m
[31m-#define HOOK_PROFILE		0x80[m
[31m-#define hook_active(g)		((g)->hookmask & HOOK_ACTIVE)[m
[31m-#define hook_enter(g)		((g)->hookmask |= HOOK_ACTIVE)[m
[31m-#define hook_entergc(g)		((g)->hookmask |= (HOOK_ACTIVE|HOOK_GC))[m
[31m-#define hook_vmevent(g)		((g)->hookmask |= (HOOK_ACTIVE|HOOK_VMEVENT))[m
[31m-#define hook_leave(g)		((g)->hookmask &= ~HOOK_ACTIVE)[m
[31m-#define hook_save(g)		((g)->hookmask & ~HOOK_EVENTMASK)[m
[31m-#define hook_restore(g, h) \[m
[31m-  ((g)->hookmask = ((g)->hookmask & HOOK_EVENTMASK) | (h))[m
[31m-[m
[31m-/* Per-thread state object. */[m
[31m-struct lua_State {[m
[31m-  GCHeader;[m
[31m-  uint8_t dummy_ffid;	/* Fake FF_C for curr_funcisL() on dummy frames. */[m
[31m-  uint8_t status;	/* Thread status. */[m
[31m-  MRef glref;		/* Link to global state. */[m
[31m-  GCRef gclist;		/* GC chain. */[m
[31m-  TValue *base;		/* Base of currently executing function. */[m
[31m-  TValue *top;		/* First free slot in the stack. */[m
[31m-  MRef maxstack;	/* Last free slot in the stack. */[m
[31m-  MRef stack;		/* Stack base. */[m
[31m-  GCRef openupval;	/* List of open upvalues in the stack. */[m
[31m-  GCRef env;		/* Thread environment (table of globals). */[m
[31m-  void *cframe;		/* End of C stack frame chain. */[m
[31m-  MSize stacksize;	/* True stack size (incl. LJ_STACK_EXTRA). */[m
[31m-};[m
[31m-[m
[31m-#define G(L)			(mref(L->glref, global_State))[m
[31m-#define registry(L)		(&G(L)->registrytv)[m
[31m-[m
[31m-/* Macros to access the currently executing (Lua) function. */[m
[31m-#if LJ_GC64[m
[31m-#define curr_func(L)		(&gcval(L->base-2)->fn)[m
[31m-#elif LJ_FR2[m
[31m-#define curr_func(L)		(&gcref((L->base-2)->gcr)->fn)[m
[31m-#else[m
[31m-#define curr_func(L)		(&gcref((L->base-1)->fr.func)->fn)[m
[31m-#endif[m
[31m-#define curr_funcisL(L)		(isluafunc(curr_func(L)))[m
[31m-#define curr_proto(L)		(funcproto(curr_func(L)))[m
[31m-#define curr_topL(L)		(L->base + curr_proto(L)->framesize)[m
[31m-#define curr_top(L)		(curr_funcisL(L) ? curr_topL(L) : L->top)[m
[31m-[m
[31m-/* -- GC object definition and conversions -------------------------------- */[m
[31m-[m
[31m-/* GC header for generic access to common fields of GC objects. */[m
[31m-typedef struct GChead {[m
[31m-  GCHeader;[m
[31m-  uint8_t unused1;[m
[31m-  uint8_t unused2;[m
[31m-  GCRef env;[m
[31m-  GCRef gclist;[m
[31m-  GCRef metatable;[m
[31m-} GChead;[m
[31m-[m
[31m-/* The env field SHOULD be at the same offset for all GC objects. */[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, env) == offsetof(GCfuncL, env));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, env) == offsetof(GCudata, env));[m
[31m-[m
[31m-/* The metatable field MUST be at the same offset for all GC objects. */[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCtab, metatable));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCudata, metatable));[m
[31m-[m
[31m-/* The gclist field MUST be at the same offset for all GC objects. */[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(lua_State, gclist));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCproto, gclist));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCfuncL, gclist));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCtab, gclist));[m
[31m-[m
[31m-typedef union GCobj {[m
[31m-  GChead gch;[m
[31m-  GCstr str;[m
[31m-  GCupval uv;[m
[31m-  lua_State th;[m
[31m-  GCproto pt;[m
[31m-  GCfunc fn;[m
[31m-  GCcdata cd;[m
[31m-  GCtab tab;[m
[31m-  GCudata ud;[m
[31m-} GCobj;[m
[31m-[m
[31m-/* Macros to convert a GCobj pointer into a specific value. */[m
[31m-#define gco2str(o)	check_exp((o)->gch.gct == ~LJ_TSTR, &(o)->str)[m
[31m-#define gco2uv(o)	check_exp((o)->gch.gct == ~LJ_TUPVAL, &(o)->uv)[m
[31m-#define gco2th(o)	check_exp((o)->gch.gct == ~LJ_TTHREAD, &(o)->th)[m
[31m-#define gco2pt(o)	check_exp((o)->gch.gct == ~LJ_TPROTO, &(o)->pt)[m
[31m-#define gco2func(o)	check_exp((o)->gch.gct == ~LJ_TFUNC, &(o)->fn)[m
[31m-#define gco2cd(o)	check_exp((o)->gch.gct == ~LJ_TCDATA, &(o)->cd)[m
[31m-#define gco2tab(o)	check_exp((o)->gch.gct == ~LJ_TTAB, &(o)->tab)[m
[31m-#define gco2ud(o)	check_exp((o)->gch.gct == ~LJ_TUDATA, &(o)->ud)[m
[31m-[m
[31m-/* Macro to convert any collectable object into a GCobj pointer. */[m
[31m-#define obj2gco(v)	((GCobj *)(v))[m
[31m-[m
[31m-/* -- TValue getters/setters ---------------------------------------------- */[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-#include "lj_gc.h"[m
[31m-#endif[m
[31m-[m
[31m-/* Macros to test types. */[m
[31m-#if LJ_GC64[m
[31m-#define itype(o)	((uint32_t)((o)->it64 >> 47))[m
[31m-#define tvisnil(o)	((o)->it64 == -1)[m
[31m-#else[m
[31m-#define itype(o)	((o)->it)[m
[31m-#define tvisnil(o)	(itype(o) == LJ_TNIL)[m
[31m-#endif[m
[31m-#define tvisfalse(o)	(itype(o) == LJ_TFALSE)[m
[31m-#define tvistrue(o)	(itype(o) == LJ_TTRUE)[m
[31m-#define tvisbool(o)	(tvisfalse(o) || tvistrue(o))[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define tvislightud(o)	(((int32_t)itype(o) >> 15) == -2)[m
[31m-#else[m
[31m-#define tvislightud(o)	(itype(o) == LJ_TLIGHTUD)[m
[31m-#endif[m
[31m-#define tvisstr(o)	(itype(o) == LJ_TSTR)[m
[31m-#define tvisfunc(o)	(itype(o) == LJ_TFUNC)[m
[31m-#define tvisthread(o)	(itype(o) == LJ_TTHREAD)[m
[31m-#define tvisproto(o)	(itype(o) == LJ_TPROTO)[m
[31m-#define tviscdata(o)	(itype(o) == LJ_TCDATA)[m
[31m-#define tvistab(o)	(itype(o) == LJ_TTAB)[m
[31m-#define tvisudata(o)	(itype(o) == LJ_TUDATA)[m
[31m-#define tvisnumber(o)	(itype(o) <= LJ_TISNUM)[m
[31m-#define tvisint(o)	(LJ_DUALNUM && itype(o) == LJ_TISNUM)[m
[31m-#define tvisnum(o)	(itype(o) < LJ_TISNUM)[m
[31m-[m
[31m-#define tvistruecond(o)	(itype(o) < LJ_TISTRUECOND)[m
[31m-#define tvispri(o)	(itype(o) >= LJ_TISPRI)[m
[31m-#define tvistabud(o)	(itype(o) <= LJ_TISTABUD)  /* && !tvisnum() */[m
[31m-#define tvisgcv(o)	((itype(o) - LJ_TISGCV) > (LJ_TNUMX - LJ_TISGCV))[m
[31m-[m
[31m-/* Special macros to test numbers for NaN, +0, -0, +1 and raw equality. */[m
[31m-#define tvisnan(o)	((o)->n != (o)->n)[m
[31m-#if LJ_64[m
[31m-#define tviszero(o)	(((o)->u64 << 1) == 0)[m
[31m-#else[m
[31m-#define tviszero(o)	(((o)->u32.lo | ((o)->u32.hi << 1)) == 0)[m
[31m-#endif[m
[31m-#define tvispzero(o)	((o)->u64 == 0)[m
[31m-#define tvismzero(o)	((o)->u64 == U64x(80000000,00000000))[m
[31m-#define tvispone(o)	((o)->u64 == U64x(3ff00000,00000000))[m
[31m-#define rawnumequal(o1, o2)	((o1)->u64 == (o2)->u64)[m
[31m-[m
[31m-/* Macros to convert type ids. */[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define itypemap(o) \[m
[31m-  (tvisnumber(o) ? ~LJ_TNUMX : tvislightud(o) ? ~LJ_TLIGHTUD : ~itype(o))[m
[31m-#else[m
[31m-#define itypemap(o)	(tvisnumber(o) ? ~LJ_TNUMX : ~itype(o))[m
[31m-#endif[m
[31m-[m
[31m-/* Macros to get tagged values. */[m
[31m-#if LJ_GC64[m
[31m-#define gcval(o)	((GCobj *)(gcrefu((o)->gcr) & LJ_GCVMASK))[m
[31m-#else[m
[31m-#define gcval(o)	(gcref((o)->gcr))[m
[31m-#endif[m
[31m-#define boolV(o)	check_exp(tvisbool(o), (LJ_TFALSE - itype(o)))[m
[31m-#if LJ_64[m
[31m-#define lightudV(o) \[m
[31m-  check_exp(tvislightud(o), (void *)((o)->u64 & U64x(00007fff,ffffffff)))[m
[31m-#else[m
[31m-#define lightudV(o)	check_exp(tvislightud(o), gcrefp((o)->gcr, void))[m
[31m-#endif[m
[31m-#define gcV(o)		check_exp(tvisgcv(o), gcval(o))[m
[31m-#define strV(o)		check_exp(tvisstr(o), &gcval(o)->str)[m
[31m-#define funcV(o)	check_exp(tvisfunc(o), &gcval(o)->fn)[m
[31m-#define threadV(o)	check_exp(tvisthread(o), &gcval(o)->th)[m
[31m-#define protoV(o)	check_exp(tvisproto(o), &gcval(o)->pt)[m
[31m-#define cdataV(o)	check_exp(tviscdata(o), &gcval(o)->cd)[m
[31m-#define tabV(o)		check_exp(tvistab(o), &gcval(o)->tab)[m
[31m-#define udataV(o)	check_exp(tvisudata(o), &gcval(o)->ud)[m
[31m-#define numV(o)		check_exp(tvisnum(o), (o)->n)[m
[31m-#define intV(o)		check_exp(tvisint(o), (int32_t)(o)->i)[m
[31m-[m
[31m-/* Macros to set tagged values. */[m
[31m-#if LJ_GC64[m
[31m-#define setitype(o, i)		((o)->it = ((i) << 15))[m
[31m-#define setnilV(o)		((o)->it64 = -1)[m
[31m-#define setpriV(o, x)		((o)->it64 = (int64_t)~((uint64_t)~(x)<<47))[m
[31m-#define setboolV(o, x)		((o)->it64 = (int64_t)~((uint64_t)((x)+1)<<47))[m
[31m-#else[m
[31m-#define setitype(o, i)		((o)->it = (i))[m
[31m-#define setnilV(o)		((o)->it = LJ_TNIL)[m
[31m-#define setboolV(o, x)		((o)->it = LJ_TFALSE-(uint32_t)(x))[m
[31m-#define setpriV(o, i)		(setitype((o), (i)))[m
[31m-#endif[m
[31m-[m
[31m-static LJ_AINLINE void setlightudV(TValue *o, void *p)[m
[31m-{[m
[31m-#if LJ_GC64[m
[31m-  o->u64 = (uint64_t)p | (((uint64_t)LJ_TLIGHTUD) << 47);[m
[31m-#elif LJ_64[m
[31m-  o->u64 = (uint64_t)p | (((uint64_t)0xffff) << 48);[m
[31m-#else[m
[31m-  setgcrefp(o->gcr, p); setitype(o, LJ_TLIGHTUD);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define checklightudptr(L, p) \[m
[31m-  (((uint64_t)(p) >> 47) ? (lj_err_msg(L, LJ_ERR_BADLU), NULL) : (p))[m
[31m-#else[m
[31m-#define checklightudptr(L, p)	(p)[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_FR2[m
[31m-#define contptr(f)		((void *)(f))[m
[31m-#define setcont(o, f)		((o)->u64 = (uint64_t)(uintptr_t)contptr(f))[m
[31m-#elif LJ_64[m
[31m-#define contptr(f) \[m
[31m-  ((void *)(uintptr_t)(uint32_t)((intptr_t)(f) - (intptr_t)lj_vm_asm_begin))[m
[31m-#define setcont(o, f) \[m
[31m-  ((o)->u64 = (uint64_t)(void *)(f) - (uint64_t)lj_vm_asm_begin)[m
[31m-#else[m
[31m-#define contptr(f)		((void *)(f))[m
[31m-#define setcont(o, f)		setlightudV((o), contptr(f))[m
[31m-#endif[m
[31m-[m
[31m-#define tvchecklive(L, o) \[m
[31m-  UNUSED(L), lua_assert(!tvisgcv(o) || \[m
[31m-  ((~itype(o) == gcval(o)->gch.gct) && !isdead(G(L), gcval(o))))[m
[31m-[m
[31m-static LJ_AINLINE void setgcVraw(TValue *o, GCobj *v, uint32_t itype)[m
[31m-{[m
[31m-#if LJ_GC64[m
[31m-  setgcreft(o->gcr, v, itype);[m
[31m-#else[m
[31m-  setgcref(o->gcr, v); setitype(o, itype);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void setgcV(lua_State *L, TValue *o, GCobj *v, uint32_t it)[m
[31m-{[m
[31m-  setgcVraw(o, v, it); tvchecklive(L, o);[m
[31m-}[m
[31m-[m
[31m-#define define_setV(name, type, tag) \[m
[31m-static LJ_AINLINE void name(lua_State *L, TValue *o, type *v) \[m
[31m-{ \[m
[31m-  setgcV(L, o, obj2gco(v), tag); \[m
[31m-}[m
[31m-define_setV(setstrV, GCstr, LJ_TSTR)[m
[31m-define_setV(setthreadV, lua_State, LJ_TTHREAD)[m
[31m-define_setV(setprotoV, GCproto, LJ_TPROTO)[m
[31m-define_setV(setfuncV, GCfunc, LJ_TFUNC)[m
[31m-define_setV(setcdataV, GCcdata, LJ_TCDATA)[m
[31m-define_setV(settabV, GCtab, LJ_TTAB)[m
[31m-define_setV(setudataV, GCudata, LJ_TUDATA)[m
[31m-[m
[31m-#define setnumV(o, x)		((o)->n = (x))[m
[31m-#define setnanV(o)		((o)->u64 = U64x(fff80000,00000000))[m
[31m-#define setpinfV(o)		((o)->u64 = U64x(7ff00000,00000000))[m
[31m-#define setminfV(o)		((o)->u64 = U64x(fff00000,00000000))[m
[31m-[m
[31m-static LJ_AINLINE void setintV(TValue *o, int32_t i)[m
[31m-{[m
[31m-#if LJ_DUALNUM[m
[31m-  o->i = (uint32_t)i; setitype(o, LJ_TISNUM);[m
[31m-#else[m
[31m-  o->n = (lua_Number)i;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void setint64V(TValue *o, int64_t i)[m
[31m-{[m
[31m-  if (LJ_DUALNUM && LJ_LIKELY(i == (int64_t)(int32_t)i))[m
[31m-    setintV(o, (int32_t)i);[m
[31m-  else[m
[31m-    setnumV(o, (lua_Number)i);[m
[31m-}[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define setintptrV(o, i)	setint64V((o), (i))[m
[31m-#else[m
[31m-#define setintptrV(o, i)	setintV((o), (i))[m
[31m-#endif[m
[31m-[m
[31m-/* Copy tagged values. */[m
[31m-static LJ_AINLINE void copyTV(lua_State *L, TValue *o1, const TValue *o2)[m
[31m-{[m
[31m-  *o1 = *o2; tvchecklive(L, o1);[m
[31m-}[m
[31m-[m
[31m-/* -- Number to integer conversion ---------------------------------------- */[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-LJ_ASMF int32_t lj_vm_tobit(double x);[m
[31m-#endif[m
[31m-[m
[31m-static LJ_AINLINE int32_t lj_num2bit(lua_Number n)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  return lj_vm_tobit(n);[m
[31m-#else[m
[31m-  TValue o;[m
[31m-  o.n = n + 6755399441055744.0;  /* 2^52 + 2^51 */[m
[31m-  return (int32_t)o.u32.lo;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#define lj_num2int(n)   ((int32_t)(n))[m
[31m-[m
[31m-static LJ_AINLINE uint64_t lj_num2u64(lua_Number n)[m
[31m-{[m
[31m-#ifdef _MSC_VER[m
[31m-  if (n >= 9223372036854775808.0)  /* They think it's a feature. */[m
[31m-    return (uint64_t)(int64_t)(n - 18446744073709551616.0);[m
[31m-  else[m
[31m-#endif[m
[31m-    return (uint64_t)n;[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE int32_t numberVint(cTValue *o)[m
[31m-{[m
[31m-  if (LJ_LIKELY(tvisint(o)))[m
[31m-    return intV(o);[m
[31m-  else[m
[31m-    return lj_num2int(numV(o));[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE lua_Number numberVnum(cTValue *o)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(tvisint(o)))[m
[31m-    return (lua_Number)intV(o);[m
[31m-  else[m
[31m-    return numV(o);[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous object handling --------------------------------------- */[m
[31m-[m
[31m-/* Names and maps for internal and external object tags. */[m
[31m-LJ_DATA const char *const lj_obj_typename[1+LUA_TCDATA+1];[m
[31m-LJ_DATA const char *const lj_obj_itypename[~LJ_TNUMX+1];[m
[31m-[m
[31m-#define lj_typename(o)	(lj_obj_itypename[itypemap(o)])[m
[31m-[m
[31m-/* Compare two objects without calling metamethods. */[m
[31m-LJ_FUNC int LJ_FASTCALL lj_obj_equal(cTValue *o1, cTValue *o2);[m
[31m-LJ_FUNC const void * LJ_FASTCALL lj_obj_ptr(cTValue *o);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce.c[m
[1mdeleted file mode 100644[m
[1mindex e5a096a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_dce.c[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-/*[m
[31m-** DCE: Dead Code Elimination. Pre-LOOP only -- ASM already performs DCE.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_dce_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Scan through all snapshots and mark all referenced instructions. */[m
[31m-static void dce_marksnap(jit_State *J)[m
[31m-{[m
[31m-  SnapNo i, nsnap = J->cur.nsnap;[m
[31m-  for (i = 0; i < nsnap; i++) {[m
[31m-    SnapShot *snap = &J->cur.snap[i];[m
[31m-    SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-    MSize n, nent = snap->nent;[m
[31m-    for (n = 0; n < nent; n++) {[m
[31m-      IRRef ref = snap_ref(map[n]);[m
[31m-      if (ref >= REF_FIRST)[m
[31m-	irt_setmark(IR(ref)->t);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Backwards propagate marks. Replace unused instructions with NOPs. */[m
[31m-static void dce_propagate(jit_State *J)[m
[31m-{[m
[31m-  IRRef1 *pchain[IR__MAX];[m
[31m-  IRRef ins;[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < IR__MAX; i++) pchain[i] = &J->chain[i];[m
[31m-  for (ins = J->cur.nins-1; ins >= REF_FIRST; ins--) {[m
[31m-    IRIns *ir = IR(ins);[m
[31m-    if (irt_ismarked(ir->t)) {[m
[31m-      irt_clearmark(ir->t);[m
[31m-      pchain[ir->o] = &ir->prev;[m
[31m-    } else if (!ir_sideeff(ir)) {[m
[31m-      *pchain[ir->o] = ir->prev;  /* Reroute original instruction chain. */[m
[31m-      ir->t.irt = IRT_NIL;[m
[31m-      ir->o = IR_NOP;  /* Replace instruction with NOP. */[m
[31m-      ir->op1 = ir->op2 = 0;[m
[31m-      ir->prev = 0;[m
[31m-      continue;[m
[31m-    }[m
[31m-    if (ir->op1 >= REF_FIRST) irt_setmark(IR(ir->op1)->t);[m
[31m-    if (ir->op2 >= REF_FIRST) irt_setmark(IR(ir->op2)->t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Dead Code Elimination.[m
[31m-**[m
[31m-** First backpropagate marks for all used instructions. Then replace[m
[31m-** the unused ones with a NOP. Note that compressing the IR to eliminate[m
[31m-** the NOPs does not pay off.[m
[31m-*/[m
[31m-void lj_opt_dce(jit_State *J)[m
[31m-{[m
[31m-  if ((J->flags & JIT_F_OPT_DCE)) {[m
[31m-    dce_marksnap(J);[m
[31m-    dce_propagate(J);[m
[31m-    memset(J->bpropcache, 0, sizeof(J->bpropcache));  /* Invalidate cache. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold.c[m
[1mdeleted file mode 100644[m
[1mindex e1d1369..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_fold.c[m
[1m+++ /dev/null[m
[36m@@ -1,2488 +0,0 @@[m
[31m-/*[m
[31m-** FOLD: Constant Folding, Algebraic Simplifications and Reassociation.[m
[31m-** ABCelim: Array Bounds Check Elimination.[m
[31m-** CSE: Common-Subexpression Elimination.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_fold_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include <math.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_carith.h"[m
[31m-#endif[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Here's a short description how the FOLD engine processes instructions:[m
[31m-**[m
[31m-** The FOLD engine receives a single instruction stored in fins (J->fold.ins).[m
[31m-** The instruction and its operands are used to select matching fold rules.[m
[31m-** These are applied iteratively until a fixed point is reached.[m
[31m-**[m
[31m-** The 8 bit opcode of the instruction itself plus the opcodes of the[m
[31m-** two instructions referenced by its operands form a 24 bit key[m
[31m-** 'ins left right' (unused operands -> 0, literals -> lowest 8 bits).[m
[31m-**[m
[31m-** This key is used for partial matching against the fold rules. The[m
[31m-** left/right operand fields of the key are successively masked with[m
[31m-** the 'any' wildcard, from most specific to least specific:[m
[31m-**[m
[31m-**   ins left right[m
[31m-**   ins any  right[m
[31m-**   ins left any[m
[31m-**   ins any  any[m
[31m-**[m
[31m-** The masked key is used to lookup a matching fold rule in a semi-perfect[m
[31m-** hash table. If a matching rule is found, the related fold function is run.[m
[31m-** Multiple rules can share the same fold function. A fold rule may return[m
[31m-** one of several special values:[m
[31m-**[m
[31m-** - NEXTFOLD means no folding was applied, because an additional test[m
[31m-**   inside the fold function failed. Matching continues against less[m
[31m-**   specific fold rules. Finally the instruction is passed on to CSE.[m
[31m-**[m
[31m-** - RETRYFOLD means the instruction was modified in-place. Folding is[m
[31m-**   retried as if this instruction had just been received.[m
[31m-**[m
[31m-** All other return values are terminal actions -- no further folding is[m
[31m-** applied:[m
[31m-**[m
[31m-** - INTFOLD(i) returns a reference to the integer constant i.[m
[31m-**[m
[31m-** - LEFTFOLD and RIGHTFOLD return the left/right operand reference[m
[31m-**   without emitting an instruction.[m
[31m-**[m
[31m-** - CSEFOLD and EMITFOLD pass the instruction directly to CSE or emit[m
[31m-**   it without passing through any further optimizations.[m
[31m-**[m
[31m-** - FAILFOLD, DROPFOLD and CONDFOLD only apply to instructions which have[m
[31m-**   no result (e.g. guarded assertions): FAILFOLD means the guard would[m
[31m-**   always fail, i.e. the current trace is pointless. DROPFOLD means[m
[31m-**   the guard is always true and has been eliminated. CONDFOLD is a[m
[31m-**   shortcut for FAILFOLD + cond (i.e. drop if true, otherwise fail).[m
[31m-**[m
[31m-** - Any other return value is interpreted as an IRRef or TRef. This[m
[31m-**   can be a reference to an existing or a newly created instruction.[m
[31m-**   Only the least-significant 16 bits (IRRef1) are used to form a TRef[m
[31m-**   which is finally returned to the caller.[m
[31m-**[m
[31m-** The FOLD engine receives instructions both from the trace recorder and[m
[31m-** substituted instructions from LOOP unrolling. This means all types[m
[31m-** of instructions may end up here, even though the recorder bypasses[m
[31m-** FOLD in some cases. Thus all loads, stores and allocations must have[m
[31m-** an any/any rule to avoid being passed on to CSE.[m
[31m-**[m
[31m-** Carefully read the following requirements before adding or modifying[m
[31m-** any fold rules:[m
[31m-**[m
[31m-** Requirement #1: All fold rules must preserve their destination type.[m
[31m-**[m
[31m-** Consistently use INTFOLD() (KINT result) or lj_ir_knum() (KNUM result).[m
[31m-** Never use lj_ir_knumint() which can have either a KINT or KNUM result.[m
[31m-**[m
[31m-** Requirement #2: Fold rules should not create *new* instructions which[m
[31m-** reference operands *across* PHIs.[m
[31m-**[m
[31m-** E.g. a RETRYFOLD with 'fins->op1 = fleft->op1' is invalid if the[m
[31m-** left operand is a PHI. Then fleft->op1 would point across the PHI[m
[31m-** frontier to an invariant instruction. Adding a PHI for this instruction[m
[31m-** would be counterproductive. The solution is to add a barrier which[m
[31m-** prevents folding across PHIs, i.e. 'PHIBARRIER(fleft)' in this case.[m
[31m-** The only exception is for recurrences with high latencies like[m
[31m-** repeated int->num->int conversions.[m
[31m-**[m
[31m-** One could relax this condition a bit if the referenced instruction is[m
[31m-** a PHI, too. But this often leads to worse code due to excessive[m
[31m-** register shuffling.[m
[31m-**[m
[31m-** Note: returning *existing* instructions (e.g. LEFTFOLD) is ok, though.[m
[31m-** Even returning fleft->op1 would be ok, because a new PHI will added,[m
[31m-** if needed. But again, this leads to excessive register shuffling and[m
[31m-** should be avoided.[m
[31m-**[m
[31m-** Requirement #3: The set of all fold rules must be monotonic to guarantee[m
[31m-** termination.[m
[31m-**[m
[31m-** The goal is optimization, so one primarily wants to add strength-reducing[m
[31m-** rules. This means eliminating an instruction or replacing an instruction[m
[31m-** with one or more simpler instructions. Don't add fold rules which point[m
[31m-** into the other direction.[m
[31m-**[m
[31m-** Some rules (like commutativity) do not directly reduce the strength of[m
[31m-** an instruction, but enable other fold rules (e.g. by moving constants[m
[31m-** to the right operand). These rules must be made unidirectional to avoid[m
[31m-** cycles.[m
[31m-**[m
[31m-** Rule of thumb: the trace recorder expands the IR and FOLD shrinks it.[m
[31m-*/[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-#define fins		(&J->fold.ins)[m
[31m-#define fleft		(&J->fold.left)[m
[31m-#define fright		(&J->fold.right)[m
[31m-#define knumleft	(ir_knum(fleft)->n)[m
[31m-#define knumright	(ir_knum(fright)->n)[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* Fold function type. Fastcall on x86 significantly reduces their size. */[m
[31m-typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J);[m
[31m-[m
[31m-/* Macros for the fold specs, so buildvm can recognize them. */[m
[31m-#define LJFOLD(x)[m
[31m-#define LJFOLDX(x)[m
[31m-#define LJFOLDF(name)	static TRef LJ_FASTCALL fold_##name(jit_State *J)[m
[31m-/* Note: They must be at the start of a line or buildvm ignores them! */[m
[31m-[m
[31m-/* Barrier to prevent using operands across PHIs. */[m
[31m-#define PHIBARRIER(ir)	if (irt_isphi((ir)->t)) return NEXTFOLD[m
[31m-[m
[31m-/* Barrier to prevent folding across a GC step.[m
[31m-** GC steps can only happen at the head of a trace and at LOOP.[m
[31m-** And the GC is only driven forward if there's at least one allocation.[m
[31m-*/[m
[31m-#define gcstep_barrier(J, ref) \[m
[31m-  ((ref) < J->chain[IR_LOOP] && \[m
[31m-   (J->chain[IR_SNEW] || J->chain[IR_XSNEW] || \[m
[31m-    J->chain[IR_TNEW] || J->chain[IR_TDUP] || \[m
[31m-    J->chain[IR_CNEW] || J->chain[IR_CNEWI] || \[m
[31m-    J->chain[IR_BUFSTR] || J->chain[IR_TOSTR] || J->chain[IR_CALLA]))[m
[31m-[m
[31m-/* -- Constant folding for FP numbers ------------------------------------- */[m
[31m-[m
[31m-LJFOLD(ADD KNUM KNUM)[m
[31m-LJFOLD(SUB KNUM KNUM)[m
[31m-LJFOLD(MUL KNUM KNUM)[m
[31m-LJFOLD(DIV KNUM KNUM)[m
[31m-LJFOLD(NEG KNUM KNUM)[m
[31m-LJFOLD(ABS KNUM KNUM)[m
[31m-LJFOLD(ATAN2 KNUM KNUM)[m
[31m-LJFOLD(LDEXP KNUM KNUM)[m
[31m-LJFOLD(MIN KNUM KNUM)[m
[31m-LJFOLD(MAX KNUM KNUM)[m
[31m-LJFOLDF(kfold_numarith)[m
[31m-{[m
[31m-  lua_Number a = knumleft;[m
[31m-  lua_Number b = knumright;[m
[31m-  lua_Number y = lj_vm_foldarith(a, b, fins->o - IR_ADD);[m
[31m-  return lj_ir_knum(J, y);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(LDEXP KNUM KINT)[m
[31m-LJFOLDF(kfold_ldexp)[m
[31m-{[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  UNUSED(J);[m
[31m-  return NEXTFOLD;[m
[31m-#else[m
[31m-  return lj_ir_knum(J, ldexp(knumleft, fright->i));[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FPMATH KNUM any)[m
[31m-LJFOLDF(kfold_fpmath)[m
[31m-{[m
[31m-  lua_Number a = knumleft;[m
[31m-  lua_Number y = lj_vm_foldfpm(a, fins->op2);[m
[31m-  return lj_ir_knum(J, y);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(POW KNUM KINT)[m
[31m-LJFOLDF(kfold_numpow)[m
[31m-{[m
[31m-  lua_Number a = knumleft;[m
[31m-  lua_Number b = (lua_Number)fright->i;[m
[31m-  lua_Number y = lj_vm_foldarith(a, b, IR_POW - IR_ADD);[m
[31m-  return lj_ir_knum(J, y);[m
[31m-}[m
[31m-[m
[31m-/* Must not use kfold_kref for numbers (could be NaN). */[m
[31m-LJFOLD(EQ KNUM KNUM)[m
[31m-LJFOLD(NE KNUM KNUM)[m
[31m-LJFOLD(LT KNUM KNUM)[m
[31m-LJFOLD(GE KNUM KNUM)[m
[31m-LJFOLD(LE KNUM KNUM)[m
[31m-LJFOLD(GT KNUM KNUM)[m
[31m-LJFOLD(ULT KNUM KNUM)[m
[31m-LJFOLD(UGE KNUM KNUM)[m
[31m-LJFOLD(ULE KNUM KNUM)[m
[31m-LJFOLD(UGT KNUM KNUM)[m
[31m-LJFOLDF(kfold_numcomp)[m
[31m-{[m
[31m-  return CONDFOLD(lj_ir_numcmp(knumleft, knumright, (IROp)fins->o));[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding for 32 bit integers -------------------------------- */[m
[31m-[m
[31m-static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case IR_ADD: k1 += k2; break;[m
[31m-  case IR_SUB: k1 -= k2; break;[m
[31m-  case IR_MUL: k1 *= k2; break;[m
[31m-  case IR_MOD: k1 = lj_vm_modi(k1, k2); break;[m
[31m-  case IR_NEG: k1 = -k1; break;[m
[31m-  case IR_BAND: k1 &= k2; break;[m
[31m-  case IR_BOR: k1 |= k2; break;[m
[31m-  case IR_BXOR: k1 ^= k2; break;[m
[31m-  case IR_BSHL: k1 <<= (k2 & 31); break;[m
[31m-  case IR_BSHR: k1 = (int32_t)((uint32_t)k1 >> (k2 & 31)); break;[m
[31m-  case IR_BSAR: k1 >>= (k2 & 31); break;[m
[31m-  case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 31)); break;[m
[31m-  case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break;[m
[31m-  case IR_MIN: k1 = k1 < k2 ? k1 : k2; break;[m
[31m-  case IR_MAX: k1 = k1 > k2 ? k1 : k2; break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-  return k1;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD KINT KINT)[m
[31m-LJFOLD(SUB KINT KINT)[m
[31m-LJFOLD(MUL KINT KINT)[m
[31m-LJFOLD(MOD KINT KINT)[m
[31m-LJFOLD(NEG KINT KINT)[m
[31m-LJFOLD(BAND KINT KINT)[m
[31m-LJFOLD(BOR KINT KINT)[m
[31m-LJFOLD(BXOR KINT KINT)[m
[31m-LJFOLD(BSHL KINT KINT)[m
[31m-LJFOLD(BSHR KINT KINT)[m
[31m-LJFOLD(BSAR KINT KINT)[m
[31m-LJFOLD(BROL KINT KINT)[m
[31m-LJFOLD(BROR KINT KINT)[m
[31m-LJFOLD(MIN KINT KINT)[m
[31m-LJFOLD(MAX KINT KINT)[m
[31m-LJFOLDF(kfold_intarith)[m
[31m-{[m
[31m-  return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADDOV KINT KINT)[m
[31m-LJFOLD(SUBOV KINT KINT)[m
[31m-LJFOLD(MULOV KINT KINT)[m
[31m-LJFOLDF(kfold_intovarith)[m
[31m-{[m
[31m-  lua_Number n = lj_vm_foldarith((lua_Number)fleft->i, (lua_Number)fright->i,[m
[31m-				 fins->o - IR_ADDOV);[m
[31m-  int32_t k = lj_num2int(n);[m
[31m-  if (n != (lua_Number)k)[m
[31m-    return FAILFOLD;[m
[31m-  return INTFOLD(k);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BNOT KINT)[m
[31m-LJFOLDF(kfold_bnot)[m
[31m-{[m
[31m-  return INTFOLD(~fleft->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSWAP KINT)[m
[31m-LJFOLDF(kfold_bswap)[m
[31m-{[m
[31m-  return INTFOLD((int32_t)lj_bswap((uint32_t)fleft->i));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(LT KINT KINT)[m
[31m-LJFOLD(GE KINT KINT)[m
[31m-LJFOLD(LE KINT KINT)[m
[31m-LJFOLD(GT KINT KINT)[m
[31m-LJFOLD(ULT KINT KINT)[m
[31m-LJFOLD(UGE KINT KINT)[m
[31m-LJFOLD(ULE KINT KINT)[m
[31m-LJFOLD(UGT KINT KINT)[m
[31m-LJFOLD(ABC KINT KINT)[m
[31m-LJFOLDF(kfold_intcomp)[m
[31m-{[m
[31m-  int32_t a = fleft->i, b = fright->i;[m
[31m-  switch ((IROp)fins->o) {[m
[31m-  case IR_LT: return CONDFOLD(a < b);[m
[31m-  case IR_GE: return CONDFOLD(a >= b);[m
[31m-  case IR_LE: return CONDFOLD(a <= b);[m
[31m-  case IR_GT: return CONDFOLD(a > b);[m
[31m-  case IR_ULT: return CONDFOLD((uint32_t)a < (uint32_t)b);[m
[31m-  case IR_UGE: return CONDFOLD((uint32_t)a >= (uint32_t)b);[m
[31m-  case IR_ULE: return CONDFOLD((uint32_t)a <= (uint32_t)b);[m
[31m-  case IR_ABC:[m
[31m-  case IR_UGT: return CONDFOLD((uint32_t)a > (uint32_t)b);[m
[31m-  default: lua_assert(0); return FAILFOLD;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJFOLD(UGE any KINT)[m
[31m-LJFOLDF(kfold_intcomp0)[m
[31m-{[m
[31m-  if (fright->i == 0)[m
[31m-    return DROPFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding for 64 bit integers -------------------------------- */[m
[31m-[m
[31m-static uint64_t kfold_int64arith(uint64_t k1, uint64_t k2, IROp op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-#if LJ_HASFFI[m
[31m-  case IR_ADD: k1 += k2; break;[m
[31m-  case IR_SUB: k1 -= k2; break;[m
[31m-  case IR_MUL: k1 *= k2; break;[m
[31m-  case IR_BAND: k1 &= k2; break;[m
[31m-  case IR_BOR: k1 |= k2; break;[m
[31m-  case IR_BXOR: k1 ^= k2; break;[m
[31m-#endif[m
[31m-  default: UNUSED(k2); lua_assert(0); break;[m
[31m-  }[m
[31m-  return k1;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD KINT64 KINT64)[m
[31m-LJFOLD(SUB KINT64 KINT64)[m
[31m-LJFOLD(MUL KINT64 KINT64)[m
[31m-LJFOLD(BAND KINT64 KINT64)[m
[31m-LJFOLD(BOR KINT64 KINT64)[m
[31m-LJFOLD(BXOR KINT64 KINT64)[m
[31m-LJFOLDF(kfold_int64arith)[m
[31m-{[m
[31m-  return INT64FOLD(kfold_int64arith(ir_k64(fleft)->u64,[m
[31m-				    ir_k64(fright)->u64, (IROp)fins->o));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(DIV KINT64 KINT64)[m
[31m-LJFOLD(MOD KINT64 KINT64)[m
[31m-LJFOLD(POW KINT64 KINT64)[m
[31m-LJFOLDF(kfold_int64arith2)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  uint64_t k1 = ir_k64(fleft)->u64, k2 = ir_k64(fright)->u64;[m
[31m-  if (irt_isi64(fins->t)) {[m
[31m-    k1 = fins->o == IR_DIV ? lj_carith_divi64((int64_t)k1, (int64_t)k2) :[m
[31m-	 fins->o == IR_MOD ? lj_carith_modi64((int64_t)k1, (int64_t)k2) :[m
[31m-			     lj_carith_powi64((int64_t)k1, (int64_t)k2);[m
[31m-  } else {[m
[31m-    k1 = fins->o == IR_DIV ? lj_carith_divu64(k1, k2) :[m
[31m-	 fins->o == IR_MOD ? lj_carith_modu64(k1, k2) :[m
[31m-			     lj_carith_powu64(k1, k2);[m
[31m-  }[m
[31m-  return INT64FOLD(k1);[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL KINT64 KINT)[m
[31m-LJFOLD(BSHR KINT64 KINT)[m
[31m-LJFOLD(BSAR KINT64 KINT)[m
[31m-LJFOLD(BROL KINT64 KINT)[m
[31m-LJFOLD(BROR KINT64 KINT)[m
[31m-LJFOLDF(kfold_int64shift)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  uint64_t k = ir_k64(fleft)->u64;[m
[31m-  int32_t sh = (fright->i & 63);[m
[31m-  return INT64FOLD(lj_carith_shift64(k, sh, fins->o - IR_BSHL));[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BNOT KINT64)[m
[31m-LJFOLDF(kfold_bnot64)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  return INT64FOLD(~ir_k64(fleft)->u64);[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSWAP KINT64)[m
[31m-LJFOLDF(kfold_bswap64)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  return INT64FOLD(lj_bswap64(ir_k64(fleft)->u64));[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(LT KINT64 KINT64)[m
[31m-LJFOLD(GE KINT64 KINT64)[m
[31m-LJFOLD(LE KINT64 KINT64)[m
[31m-LJFOLD(GT KINT64 KINT64)[m
[31m-LJFOLD(ULT KINT64 KINT64)[m
[31m-LJFOLD(UGE KINT64 KINT64)[m
[31m-LJFOLD(ULE KINT64 KINT64)[m
[31m-LJFOLD(UGT KINT64 KINT64)[m
[31m-LJFOLDF(kfold_int64comp)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  uint64_t a = ir_k64(fleft)->u64, b = ir_k64(fright)->u64;[m
[31m-  switch ((IROp)fins->o) {[m
[31m-  case IR_LT: return CONDFOLD(a < b);[m
[31m-  case IR_GE: return CONDFOLD(a >= b);[m
[31m-  case IR_LE: return CONDFOLD(a <= b);[m
[31m-  case IR_GT: return CONDFOLD(a > b);[m
[31m-  case IR_ULT: return CONDFOLD((uint64_t)a < (uint64_t)b);[m
[31m-  case IR_UGE: return CONDFOLD((uint64_t)a >= (uint64_t)b);[m
[31m-  case IR_ULE: return CONDFOLD((uint64_t)a <= (uint64_t)b);[m
[31m-  case IR_UGT: return CONDFOLD((uint64_t)a > (uint64_t)b);[m
[31m-  default: lua_assert(0); return FAILFOLD;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(UGE any KINT64)[m
[31m-LJFOLDF(kfold_int64comp0)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (ir_k64(fright)->u64 == 0)[m
[31m-    return DROPFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding for strings ---------------------------------------- */[m
[31m-[m
[31m-LJFOLD(SNEW KKPTR KINT)[m
[31m-LJFOLDF(kfold_snew_kptr)[m
[31m-{[m
[31m-  GCstr *s = lj_str_new(J->L, (const char *)ir_kptr(fleft), (size_t)fright->i);[m
[31m-  return lj_ir_kstr(J, s);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SNEW any KINT)[m
[31m-LJFOLDF(kfold_snew_empty)[m
[31m-{[m
[31m-  if (fright->i == 0)[m
[31m-    return lj_ir_kstr(J, &J2G(J)->strempty);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(STRREF KGC KINT)[m
[31m-LJFOLDF(kfold_strref)[m
[31m-{[m
[31m-  GCstr *str = ir_kstr(fleft);[m
[31m-  lua_assert((MSize)fright->i <= str->len);[m
[31m-  return lj_ir_kkptr(J, (char *)strdata(str) + fright->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(STRREF SNEW any)[m
[31m-LJFOLDF(kfold_strref_snew)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (irref_isk(fins->op2) && fright->i == 0) {[m
[31m-    return fleft->op1;  /* strref(snew(ptr, len), 0) ==> ptr */[m
[31m-  } else {[m
[31m-    /* Reassociate: strref(snew(strref(str, a), len), b) ==> strref(str, a+b) */[m
[31m-    IRIns *ir = IR(fleft->op1);[m
[31m-    if (ir->o == IR_STRREF) {[m
[31m-      IRRef1 str = ir->op1;  /* IRIns * is not valid across emitir. */[m
[31m-      PHIBARRIER(ir);[m
[31m-      fins->op2 = emitir(IRTI(IR_ADD), ir->op2, fins->op2); /* Clobbers fins! */[m
[31m-      fins->op1 = str;[m
[31m-      fins->ot = IRT(IR_STRREF, IRT_P32);[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CALLN CARG IRCALL_lj_str_cmp)[m
[31m-LJFOLDF(kfold_strcmp)[m
[31m-{[m
[31m-  if (irref_isk(fleft->op1) && irref_isk(fleft->op2)) {[m
[31m-    GCstr *a = ir_kstr(IR(fleft->op1));[m
[31m-    GCstr *b = ir_kstr(IR(fleft->op2));[m
[31m-    return INTFOLD(lj_str_cmp(a, b));[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding and forwarding for buffers ------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** Buffer ops perform stores, but their effect is limited to the buffer[m
[31m-** itself. Also, buffer ops are chained: a use of an op implies a use of[m
[31m-** all other ops up the chain. Conversely, if an op is unused, all ops[m
[31m-** up the chain can go unsed. This largely eliminates the need to treat[m
[31m-** them as stores.[m
[31m-**[m
[31m-** Alas, treating them as normal (IRM_N) ops doesn't work, because they[m
[31m-** cannot be CSEd in isolation. CSE for IRM_N is implicitly done in LOOP[m
[31m-** or if FOLD is disabled.[m
[31m-**[m
[31m-** The compromise is to declare them as loads, emit them like stores and[m
[31m-** CSE whole chains manually when the BUFSTR is to be emitted. Any chain[m
[31m-** fragments left over from CSE are eliminated by DCE.[m
[31m-*/[m
[31m-[m
[31m-/* BUFHDR is emitted like a store, see below. */[m
[31m-[m
[31m-LJFOLD(BUFPUT BUFHDR BUFSTR)[m
[31m-LJFOLDF(bufput_append)[m
[31m-{[m
[31m-  /* New buffer, no other buffer op inbetween and same buffer? */[m
[31m-  if ((J->flags & JIT_F_OPT_FWD) &&[m
[31m-      !(fleft->op2 & IRBUFHDR_APPEND) &&[m
[31m-      fleft->prev == fright->op2 &&[m
[31m-      fleft->op1 == IR(fright->op2)->op1) {[m
[31m-    IRRef ref = fins->op1;[m
[31m-    IR(ref)->op2 = (fleft->op2 | IRBUFHDR_APPEND);  /* Modify BUFHDR. */[m
[31m-    IR(ref)->op1 = fright->op1;[m
[31m-    return ref;[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BUFPUT any any)[m
[31m-LJFOLDF(bufput_kgc)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) {[m
[31m-    GCstr *s2 = ir_kstr(fright);[m
[31m-    if (s2->len == 0) {  /* Empty string? */[m
[31m-      return LEFTFOLD;[m
[31m-    } else {[m
[31m-      if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) &&[m
[31m-	  !irt_isphi(fleft->t)) {  /* Join two constant string puts in a row. */[m
[31m-	GCstr *s1 = ir_kstr(IR(fleft->op2));[m
[31m-	IRRef kref = lj_ir_kstr(J, lj_buf_cat2str(J->L, s1, s2));[m
[31m-	/* lj_ir_kstr() may realloc the IR and invalidates any IRIns *. */[m
[31m-	IR(fins->op1)->op2 = kref;  /* Modify previous BUFPUT. */[m
[31m-	return fins->op1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BUFSTR any any)[m
[31m-LJFOLDF(bufstr_kfold_cse)[m
[31m-{[m
[31m-  lua_assert(fleft->o == IR_BUFHDR || fleft->o == IR_BUFPUT ||[m
[31m-	     fleft->o == IR_CALLL);[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {[m
[31m-    if (fleft->o == IR_BUFHDR) {  /* No put operations? */[m
[31m-      if (!(fleft->op2 & IRBUFHDR_APPEND))  /* Empty buffer? */[m
[31m-	return lj_ir_kstr(J, &J2G(J)->strempty);[m
[31m-      fins->op1 = fleft->op1;[m
[31m-      fins->op2 = fleft->prev;  /* Relies on checks in bufput_append. */[m
[31m-      return CSEFOLD;[m
[31m-    } else if (fleft->o == IR_BUFPUT) {[m
[31m-      IRIns *irb = IR(fleft->op1);[m
[31m-      if (irb->o == IR_BUFHDR && !(irb->op2 & IRBUFHDR_APPEND))[m
[31m-	return fleft->op2;  /* Shortcut for a single put operation. */[m
[31m-    }[m
[31m-  }[m
[31m-  /* Try to CSE the whole chain. */[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {[m
[31m-    IRRef ref = J->chain[IR_BUFSTR];[m
[31m-    while (ref) {[m
[31m-      IRIns *irs = IR(ref), *ira = fleft, *irb = IR(irs->op1);[m
[31m-      while (ira->o == irb->o && ira->op2 == irb->op2) {[m
[31m-	lua_assert(ira->o == IR_BUFHDR || ira->o == IR_BUFPUT ||[m
[31m-		   ira->o == IR_CALLL || ira->o == IR_CARG);[m
[31m-	if (ira->o == IR_BUFHDR && !(ira->op2 & IRBUFHDR_APPEND))[m
[31m-	  return ref;  /* CSE succeeded. */[m
[31m-	if (ira->o == IR_CALLL && ira->op2 == IRCALL_lj_buf_puttab)[m
[31m-	  break;[m
[31m-	ira = IR(ira->op1);[m
[31m-	irb = IR(irb->op1);[m
[31m-      }[m
[31m-      ref = irs->prev;[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;  /* No CSE possible. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_reverse)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_upper)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_lower)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putquoted)[m
[31m-LJFOLDF(bufput_kfold_op)[m
[31m-{[m
[31m-  if (irref_isk(fleft->op2)) {[m
[31m-    const CCallInfo *ci = &lj_ir_callinfo[fins->op2];[m
[31m-    SBuf *sb = lj_buf_tmp_(J->L);[m
[31m-    sb = ((SBuf * (LJ_FASTCALL *)(SBuf *, GCstr *))ci->func)(sb,[m
[31m-						       ir_kstr(IR(fleft->op2)));[m
[31m-    fins->o = IR_BUFPUT;[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_rep)[m
[31m-LJFOLDF(bufput_kfold_rep)[m
[31m-{[m
[31m-  if (irref_isk(fleft->op2)) {[m
[31m-    IRIns *irc = IR(fleft->op1);[m
[31m-    if (irref_isk(irc->op2)) {[m
[31m-      SBuf *sb = lj_buf_tmp_(J->L);[m
[31m-      sb = lj_buf_putstr_rep(sb, ir_kstr(IR(irc->op2)), IR(fleft->op2)->i);[m
[31m-      fins->o = IR_BUFPUT;[m
[31m-      fins->op1 = irc->op1;[m
[31m-      fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfxint)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_int)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_uint)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfstr)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfchar)[m
[31m-LJFOLDF(bufput_kfold_fmt)[m
[31m-{[m
[31m-  IRIns *irc = IR(fleft->op1);[m
[31m-  lua_assert(irref_isk(irc->op2));  /* SFormat must be const. */[m
[31m-  if (irref_isk(fleft->op2)) {[m
[31m-    SFormat sf = (SFormat)IR(irc->op2)->i;[m
[31m-    IRIns *ira = IR(fleft->op2);[m
[31m-    SBuf *sb = lj_buf_tmp_(J->L);[m
[31m-    switch (fins->op2) {[m
[31m-    case IRCALL_lj_strfmt_putfxint:[m
[31m-      sb = lj_strfmt_putfxint(sb, sf, ir_k64(ira)->u64);[m
[31m-      break;[m
[31m-    case IRCALL_lj_strfmt_putfstr:[m
[31m-      sb = lj_strfmt_putfstr(sb, sf, ir_kstr(ira));[m
[31m-      break;[m
[31m-    case IRCALL_lj_strfmt_putfchar:[m
[31m-      sb = lj_strfmt_putfchar(sb, sf, ira->i);[m
[31m-      break;[m
[31m-    case IRCALL_lj_strfmt_putfnum_int:[m
[31m-    case IRCALL_lj_strfmt_putfnum_uint:[m
[31m-    case IRCALL_lj_strfmt_putfnum:[m
[31m-    default: {[m
[31m-      const CCallInfo *ci = &lj_ir_callinfo[fins->op2];[m
[31m-      sb = ((SBuf * (*)(SBuf *, SFormat, lua_Number))ci->func)(sb, sf,[m
[31m-							 ir_knum(ira)->n);[m
[31m-      break;[m
[31m-      }[m
[31m-    }[m
[31m-    fins->o = IR_BUFPUT;[m
[31m-    fins->op1 = irc->op1;[m
[31m-    fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding of pointer arithmetic ------------------------------ */[m
[31m-[m
[31m-LJFOLD(ADD KGC KINT)[m
[31m-LJFOLD(ADD KGC KINT64)[m
[31m-LJFOLDF(kfold_add_kgc)[m
[31m-{[m
[31m-  GCobj *o = ir_kgc(fleft);[m
[31m-#if LJ_64[m
[31m-  ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64;[m
[31m-#else[m
[31m-  ptrdiff_t ofs = fright->i;[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-  if (irt_iscdata(fleft->t)) {[m
[31m-    CType *ct = ctype_raw(ctype_ctsG(J2G(J)), gco2cd(o)->ctypeid);[m
[31m-    if (ctype_isnum(ct->info) || ctype_isenum(ct->info) ||[m
[31m-	ctype_isptr(ct->info) || ctype_isfunc(ct->info) ||[m
[31m-	ctype_iscomplex(ct->info) || ctype_isvector(ct->info))[m
[31m-      return lj_ir_kkptr(J, (char *)o + ofs);[m
[31m-  }[m
[31m-#endif[m
[31m-  return lj_ir_kptr(J, (char *)o + ofs);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD KPTR KINT)[m
[31m-LJFOLD(ADD KPTR KINT64)[m
[31m-LJFOLD(ADD KKPTR KINT)[m
[31m-LJFOLD(ADD KKPTR KINT64)[m
[31m-LJFOLDF(kfold_add_kptr)[m
[31m-{[m
[31m-  void *p = ir_kptr(fleft);[m
[31m-#if LJ_64[m
[31m-  ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64;[m
[31m-#else[m
[31m-  ptrdiff_t ofs = fright->i;[m
[31m-#endif[m
[31m-  return lj_ir_kptr_(J, fleft->o, (char *)p + ofs);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD any KGC)[m
[31m-LJFOLD(ADD any KPTR)[m
[31m-LJFOLD(ADD any KKPTR)[m
[31m-LJFOLDF(kfold_add_kright)[m
[31m-{[m
[31m-  if (fleft->o == IR_KINT || fleft->o == IR_KINT64) {[m
[31m-    IRRef1 tmp = fins->op1; fins->op1 = fins->op2; fins->op2 = tmp;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding of conversions ------------------------------------- */[m
[31m-[m
[31m-LJFOLD(TOBIT KNUM KNUM)[m
[31m-LJFOLDF(kfold_tobit)[m
[31m-{[m
[31m-  return INTFOLD(lj_num2bit(knumleft));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT IRCONV_NUM_INT)[m
[31m-LJFOLDF(kfold_conv_kint_num)[m
[31m-{[m
[31m-  return lj_ir_knum(J, (lua_Number)fleft->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT IRCONV_NUM_U32)[m
[31m-LJFOLDF(kfold_conv_kintu32_num)[m
[31m-{[m
[31m-  return lj_ir_knum(J, (lua_Number)(uint32_t)fleft->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT IRCONV_INT_I8)[m
[31m-LJFOLD(CONV KINT IRCONV_INT_U8)[m
[31m-LJFOLD(CONV KINT IRCONV_INT_I16)[m
[31m-LJFOLD(CONV KINT IRCONV_INT_U16)[m
[31m-LJFOLDF(kfold_conv_kint_ext)[m
[31m-{[m
[31m-  int32_t k = fleft->i;[m
[31m-  if ((fins->op2 & IRCONV_SRCMASK) == IRT_I8) k = (int8_t)k;[m
[31m-  else if ((fins->op2 & IRCONV_SRCMASK) == IRT_U8) k = (uint8_t)k;[m
[31m-  else if ((fins->op2 & IRCONV_SRCMASK) == IRT_I16) k = (int16_t)k;[m
[31m-  else k = (uint16_t)k;[m
[31m-  return INTFOLD(k);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT IRCONV_I64_INT)[m
[31m-LJFOLD(CONV KINT IRCONV_U64_INT)[m
[31m-LJFOLD(CONV KINT IRCONV_I64_U32)[m
[31m-LJFOLD(CONV KINT IRCONV_U64_U32)[m
[31m-LJFOLDF(kfold_conv_kint_i64)[m
[31m-{[m
[31m-  if ((fins->op2 & IRCONV_SEXT))[m
[31m-    return INT64FOLD((uint64_t)(int64_t)fleft->i);[m
[31m-  else[m
[31m-    return INT64FOLD((uint64_t)(int64_t)(uint32_t)fleft->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT64 IRCONV_NUM_I64)[m
[31m-LJFOLDF(kfold_conv_kint64_num_i64)[m
[31m-{[m
[31m-  return lj_ir_knum(J, (lua_Number)(int64_t)ir_kint64(fleft)->u64);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT64 IRCONV_NUM_U64)[m
[31m-LJFOLDF(kfold_conv_kint64_num_u64)[m
[31m-{[m
[31m-  return lj_ir_knum(J, (lua_Number)ir_kint64(fleft)->u64);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT64 IRCONV_INT_I64)[m
[31m-LJFOLD(CONV KINT64 IRCONV_U32_I64)[m
[31m-LJFOLDF(kfold_conv_kint64_int_i64)[m
[31m-{[m
[31m-  return INTFOLD((int32_t)ir_kint64(fleft)->u64);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KNUM IRCONV_INT_NUM)[m
[31m-LJFOLDF(kfold_conv_knum_int_num)[m
[31m-{[m
[31m-  lua_Number n = knumleft;[m
[31m-  int32_t k = lj_num2int(n);[m
[31m-  if (irt_isguard(fins->t) && n != (lua_Number)k) {[m
[31m-    /* We're about to create a guard which always fails, like CONV +1.5.[m
[31m-    ** Some pathological loops cause this during LICM, e.g.:[m
[31m-    **   local x,k,t = 0,1.5,{1,[1.5]=2}[m
[31m-    **   for i=1,200 do x = x+ t[k]; k = k == 1 and 1.5 or 1 end[m
[31m-    **   assert(x == 300)[m
[31m-    */[m
[31m-    return FAILFOLD;[m
[31m-  }[m
[31m-  return INTFOLD(k);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KNUM IRCONV_U32_NUM)[m
[31m-LJFOLDF(kfold_conv_knum_u32_num)[m
[31m-{[m
[31m-#ifdef _MSC_VER[m
[31m-  {  /* Workaround for MSVC bug. */[m
[31m-    volatile uint32_t u = (uint32_t)knumleft;[m
[31m-    return INTFOLD((int32_t)u);[m
[31m-  }[m
[31m-#else[m
[31m-  return INTFOLD((int32_t)(uint32_t)knumleft);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KNUM IRCONV_I64_NUM)[m
[31m-LJFOLDF(kfold_conv_knum_i64_num)[m
[31m-{[m
[31m-  return INT64FOLD((uint64_t)(int64_t)knumleft);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KNUM IRCONV_U64_NUM)[m
[31m-LJFOLDF(kfold_conv_knum_u64_num)[m
[31m-{[m
[31m-  return INT64FOLD(lj_num2u64(knumleft));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(TOSTR KNUM any)[m
[31m-LJFOLDF(kfold_tostr_knum)[m
[31m-{[m
[31m-  return lj_ir_kstr(J, lj_strfmt_num(J->L, ir_knum(fleft)));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(TOSTR KINT any)[m
[31m-LJFOLDF(kfold_tostr_kint)[m
[31m-{[m
[31m-  return lj_ir_kstr(J, fins->op2 == IRTOSTR_INT ?[m
[31m-		       lj_strfmt_int(J->L, fleft->i) :[m
[31m-		       lj_strfmt_char(J->L, fleft->i));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(STRTO KGC)[m
[31m-LJFOLDF(kfold_strto)[m
[31m-{[m
[31m-  TValue n;[m
[31m-  if (lj_strscan_num(ir_kstr(fleft), &n))[m
[31m-    return lj_ir_knum(J, numV(&n));[m
[31m-  return FAILFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding of equality checks --------------------------------- */[m
[31m-[m
[31m-/* Don't constant-fold away FLOAD checks against KNULL. */[m
[31m-LJFOLD(EQ FLOAD KNULL)[m
[31m-LJFOLD(NE FLOAD KNULL)[m
[31m-LJFOLDX(lj_opt_cse)[m
[31m-[m
[31m-/* But fold all other KNULL compares, since only KNULL is equal to KNULL. */[m
[31m-LJFOLD(EQ any KNULL)[m
[31m-LJFOLD(NE any KNULL)[m
[31m-LJFOLD(EQ KNULL any)[m
[31m-LJFOLD(NE KNULL any)[m
[31m-LJFOLD(EQ KINT KINT)  /* Constants are unique, so same refs <==> same value. */[m
[31m-LJFOLD(NE KINT KINT)[m
[31m-LJFOLD(EQ KINT64 KINT64)[m
[31m-LJFOLD(NE KINT64 KINT64)[m
[31m-LJFOLD(EQ KGC KGC)[m
[31m-LJFOLD(NE KGC KGC)[m
[31m-LJFOLDF(kfold_kref)[m
[31m-{[m
[31m-  return CONDFOLD((fins->op1 == fins->op2) ^ (fins->o == IR_NE));[m
[31m-}[m
[31m-[m
[31m-/* -- Algebraic shortcuts ------------------------------------------------- */[m
[31m-[m
[31m-LJFOLD(FPMATH FPMATH IRFPM_FLOOR)[m
[31m-LJFOLD(FPMATH FPMATH IRFPM_CEIL)[m
[31m-LJFOLD(FPMATH FPMATH IRFPM_TRUNC)[m
[31m-LJFOLDF(shortcut_round)[m
[31m-{[m
[31m-  IRFPMathOp op = (IRFPMathOp)fleft->op2;[m
[31m-  if (op == IRFPM_FLOOR || op == IRFPM_CEIL || op == IRFPM_TRUNC)[m
[31m-    return LEFTFOLD;  /* round(round_left(x)) = round_left(x) */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ABS ABS KNUM)[m
[31m-LJFOLDF(shortcut_left)[m
[31m-{[m
[31m-  return LEFTFOLD;  /* f(g(x)) ==> g(x) */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ABS NEG KNUM)[m
[31m-LJFOLDF(shortcut_dropleft)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  fins->op1 = fleft->op1;  /* abs(neg(x)) ==> abs(x) */[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Note: no safe shortcuts with STRTO and TOSTR ("1e2" ==> +100 ==> "100"). */[m
[31m-LJFOLD(NEG NEG any)[m
[31m-LJFOLD(BNOT BNOT)[m
[31m-LJFOLD(BSWAP BSWAP)[m
[31m-LJFOLDF(shortcut_leftleft)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);  /* See above. Fold would be ok, but not beneficial. */[m
[31m-  return fleft->op1;  /* f(g(x)) ==> x */[m
[31m-}[m
[31m-[m
[31m-/* -- FP algebraic simplifications ---------------------------------------- */[m
[31m-[m
[31m-/* FP arithmetic is tricky -- there's not much to simplify.[m
[31m-** Please note the following common pitfalls before sending "improvements":[m
[31m-**   x+0 ==> x  is INVALID for x=-0[m
[31m-**   0-x ==> -x is INVALID for x=+0[m
[31m-**   x*0 ==> 0  is INVALID for x=-0, x=+-Inf or x=NaN[m
[31m-*/[m
[31m-[m
[31m-LJFOLD(ADD NEG any)[m
[31m-LJFOLDF(simplify_numadd_negx)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  fins->o = IR_SUB;  /* (-a) + b ==> b - a */[m
[31m-  fins->op1 = fins->op2;[m
[31m-  fins->op2 = fleft->op1;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD any NEG)[m
[31m-LJFOLDF(simplify_numadd_xneg)[m
[31m-{[m
[31m-  PHIBARRIER(fright);[m
[31m-  fins->o = IR_SUB;  /* a + (-b) ==> a - b */[m
[31m-  fins->op2 = fright->op1;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any KNUM)[m
[31m-LJFOLDF(simplify_numsub_k)[m
[31m-{[m
[31m-  lua_Number n = knumright;[m
[31m-  if (n == 0.0)  /* x - (+-0) ==> x */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB NEG KNUM)[m
[31m-LJFOLDF(simplify_numsub_negk)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  fins->op2 = fleft->op1;  /* (-x) - k ==> (-k) - x */[m
[31m-  fins->op1 = (IRRef1)lj_ir_knum(J, -knumright);[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any NEG)[m
[31m-LJFOLDF(simplify_numsub_xneg)[m
[31m-{[m
[31m-  PHIBARRIER(fright);[m
[31m-  fins->o = IR_ADD;  /* a - (-b) ==> a + b */[m
[31m-  fins->op2 = fright->op1;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL any KNUM)[m
[31m-LJFOLD(DIV any KNUM)[m
[31m-LJFOLDF(simplify_nummuldiv_k)[m
[31m-{[m
[31m-  lua_Number n = knumright;[m
[31m-  if (n == 1.0) {  /* x o 1 ==> x */[m
[31m-    return LEFTFOLD;[m
[31m-  } else if (n == -1.0) {  /* x o -1 ==> -x */[m
[31m-    fins->o = IR_NEG;[m
[31m-    fins->op2 = (IRRef1)lj_ir_knum_neg(J);[m
[31m-    return RETRYFOLD;[m
[31m-  } else if (fins->o == IR_MUL && n == 2.0) {  /* x * 2 ==> x + x */[m
[31m-    fins->o = IR_ADD;[m
[31m-    fins->op2 = fins->op1;[m
[31m-    return RETRYFOLD;[m
[31m-  } else if (fins->o == IR_DIV) {  /* x / 2^k ==> x * 2^-k */[m
[31m-    uint64_t u = ir_knum(fright)->u64;[m
[31m-    uint32_t ex = ((uint32_t)(u >> 52) & 0x7ff);[m
[31m-    if ((u & U64x(000fffff,ffffffff)) == 0 && ex - 1 < 0x7fd) {[m
[31m-      u = (u & ((uint64_t)1 << 63)) | ((uint64_t)(0x7fe - ex) << 52);[m
[31m-      fins->o = IR_MUL;  /* Multiply by exact reciprocal. */[m
[31m-      fins->op2 = lj_ir_knum_u64(J, u);[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL NEG KNUM)[m
[31m-LJFOLD(DIV NEG KNUM)[m
[31m-LJFOLDF(simplify_nummuldiv_negk)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  fins->op1 = fleft->op1;  /* (-a) o k ==> a o (-k) */[m
[31m-  fins->op2 = (IRRef1)lj_ir_knum(J, -knumright);[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL NEG NEG)[m
[31m-LJFOLD(DIV NEG NEG)[m
[31m-LJFOLDF(simplify_nummuldiv_negneg)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  PHIBARRIER(fright);[m
[31m-  fins->op1 = fleft->op1;  /* (-a) o (-b) ==> a o b */[m
[31m-  fins->op2 = fright->op1;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(POW any KINT)[m
[31m-LJFOLDF(simplify_numpow_xk)[m
[31m-{[m
[31m-  int32_t k = fright->i;[m
[31m-  TRef ref = fins->op1;[m
[31m-  if (k == 0)  /* x ^ 0 ==> 1 */[m
[31m-    return lj_ir_knum_one(J);  /* Result must be a number, not an int. */[m
[31m-  if (k == 1)  /* x ^ 1 ==> x */[m
[31m-    return LEFTFOLD;[m
[31m-  if ((uint32_t)(k+65536) > 2*65536u)  /* Limit code explosion. */[m
[31m-    return NEXTFOLD;[m
[31m-  if (k < 0) {  /* x ^ (-k) ==> (1/x) ^ k. */[m
[31m-    ref = emitir(IRTN(IR_DIV), lj_ir_knum_one(J), ref);[m
[31m-    k = -k;[m
[31m-  }[m
[31m-  /* Unroll x^k for 1 <= k <= 65536. */[m
[31m-  for (; (k & 1) == 0; k >>= 1)  /* Handle leading zeros. */[m
[31m-    ref = emitir(IRTN(IR_MUL), ref, ref);[m
[31m-  if ((k >>= 1) != 0) {  /* Handle trailing bits. */[m
[31m-    TRef tmp = emitir(IRTN(IR_MUL), ref, ref);[m
[31m-    for (; k != 1; k >>= 1) {[m
[31m-      if (k & 1)[m
[31m-	ref = emitir(IRTN(IR_MUL), ref, tmp);[m
[31m-      tmp = emitir(IRTN(IR_MUL), tmp, tmp);[m
[31m-    }[m
[31m-    ref = emitir(IRTN(IR_MUL), ref, tmp);[m
[31m-  }[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(POW KNUM any)[m
[31m-LJFOLDF(simplify_numpow_kx)[m
[31m-{[m
[31m-  lua_Number n = knumleft;[m
[31m-  if (n == 2.0) {  /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */[m
[31m-    fins->o = IR_CONV;[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    fins->op1 = fins->op2;[m
[31m-    fins->op2 = IRCONV_NUM_INT;[m
[31m-    fins->op2 = (IRRef1)lj_opt_fold(J);[m
[31m-#endif[m
[31m-    fins->op1 = (IRRef1)lj_ir_knum_one(J);[m
[31m-    fins->o = IR_LDEXP;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Simplify conversions ------------------------------------------------ */[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_NUM_INT)  /* _NUM */[m
[31m-LJFOLDF(shortcut_conv_num_int)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  /* Only safe with a guarded conversion to int. */[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_NUM && irt_isguard(fleft->t))[m
[31m-    return fleft->op1;  /* f(g(x)) ==> x */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_INT_NUM)  /* _INT */[m
[31m-LJFOLD(CONV CONV IRCONV_U32_NUM)  /* _U32*/[m
[31m-LJFOLDF(simplify_conv_int_num)[m
[31m-{[m
[31m-  /* Fold even across PHI to avoid expensive num->int conversions in loop. */[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) ==[m
[31m-      ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH))[m
[31m-    return fleft->op1;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_I64_NUM)  /* _INT or _U32 */[m
[31m-LJFOLD(CONV CONV IRCONV_U64_NUM)  /* _INT or _U32 */[m
[31m-LJFOLDF(simplify_conv_i64_num)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) {[m
[31m-    /* Reduce to a sign-extension. */[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT);[m
[31m-    return RETRYFOLD;[m
[31m-  } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {[m
[31m-#if LJ_TARGET_X64[m
[31m-    return fleft->op1;[m
[31m-#else[m
[31m-    /* Reduce to a zero-extension. */[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRT_I64<<5)|IRT_U32;[m
[31m-    return RETRYFOLD;[m
[31m-#endif[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_INT_I64)  /* _INT or _U32 */[m
[31m-LJFOLD(CONV CONV IRCONV_INT_U64)  /* _INT or _U32 */[m
[31m-LJFOLD(CONV CONV IRCONV_U32_I64)  /* _INT or _U32 */[m
[31m-LJFOLD(CONV CONV IRCONV_U32_U64)  /* _INT or _U32 */[m
[31m-LJFOLDF(simplify_conv_int_i64)[m
[31m-{[m
[31m-  int src;[m
[31m-  PHIBARRIER(fleft);[m
[31m-  src = (fleft->op2 & IRCONV_SRCMASK);[m
[31m-  if (src == IRT_INT || src == IRT_U32) {[m
[31m-    if (src == ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH)) {[m
[31m-      return fleft->op1;[m
[31m-    } else {[m
[31m-      fins->op2 = ((fins->op2 & IRCONV_DSTMASK) | src);[m
[31m-      fins->op1 = fleft->op1;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_FLOAT_NUM)  /* _FLOAT */[m
[31m-LJFOLDF(simplify_conv_flt_num)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_FLOAT)[m
[31m-    return fleft->op1;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */[m
[31m-LJFOLD(TOBIT CONV KNUM)[m
[31m-LJFOLDF(simplify_tobit_conv)[m
[31m-{[m
[31m-  /* Fold even across PHI to avoid expensive num->int conversions in loop. */[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) {[m
[31m-    lua_assert(irt_isnum(fleft->t));[m
[31m-    return fleft->op1;[m
[31m-  } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {[m
[31m-    lua_assert(irt_isnum(fleft->t));[m
[31m-    fins->o = IR_CONV;[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRT_INT<<5)|IRT_U32;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Shortcut floor/ceil/round + IRT_NUM <- IRT_INT/IRT_U32 conversion. */[m
[31m-LJFOLD(FPMATH CONV IRFPM_FLOOR)[m
[31m-LJFOLD(FPMATH CONV IRFPM_CEIL)[m
[31m-LJFOLD(FPMATH CONV IRFPM_TRUNC)[m
[31m-LJFOLDF(simplify_floor_conv)[m
[31m-{[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT ||[m
[31m-      (fleft->op2 & IRCONV_SRCMASK) == IRT_U32)[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Strength reduction of widening. */[m
[31m-LJFOLD(CONV any IRCONV_I64_INT)[m
[31m-LJFOLD(CONV any IRCONV_U64_INT)[m
[31m-LJFOLDF(simplify_conv_sext)[m
[31m-{[m
[31m-  IRRef ref = fins->op1;[m
[31m-  int64_t ofs = 0;[m
[31m-  if (!(fins->op2 & IRCONV_SEXT))[m
[31m-    return NEXTFOLD;[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (fleft->o == IR_XLOAD && (irt_isu8(fleft->t) || irt_isu16(fleft->t)))[m
[31m-    goto ok_reduce;[m
[31m-  if (fleft->o == IR_ADD && irref_isk(fleft->op2)) {[m
[31m-    ofs = (int64_t)IR(fleft->op2)->i;[m
[31m-    ref = fleft->op1;[m
[31m-  }[m
[31m-  /* Use scalar evolution analysis results to strength-reduce sign-extension. */[m
[31m-  if (ref == J->scev.idx) {[m
[31m-    IRRef lo = J->scev.dir ? J->scev.start : J->scev.stop;[m
[31m-    lua_assert(irt_isint(J->scev.t));[m
[31m-    if (lo && IR(lo)->i + ofs >= 0) {[m
[31m-    ok_reduce:[m
[31m-#if LJ_TARGET_X64[m
[31m-      /* Eliminate widening. All 32 bit ops do an implicit zero-extension. */[m
[31m-      return LEFTFOLD;[m
[31m-#else[m
[31m-      /* Reduce to a (cheaper) zero-extension. */[m
[31m-      fins->op2 &= ~IRCONV_SEXT;[m
[31m-      return RETRYFOLD;[m
[31m-#endif[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Strength reduction of narrowing. */[m
[31m-LJFOLD(CONV ADD IRCONV_INT_I64)[m
[31m-LJFOLD(CONV SUB IRCONV_INT_I64)[m
[31m-LJFOLD(CONV MUL IRCONV_INT_I64)[m
[31m-LJFOLD(CONV ADD IRCONV_INT_U64)[m
[31m-LJFOLD(CONV SUB IRCONV_INT_U64)[m
[31m-LJFOLD(CONV MUL IRCONV_INT_U64)[m
[31m-LJFOLD(CONV ADD IRCONV_U32_I64)[m
[31m-LJFOLD(CONV SUB IRCONV_U32_I64)[m
[31m-LJFOLD(CONV MUL IRCONV_U32_I64)[m
[31m-LJFOLD(CONV ADD IRCONV_U32_U64)[m
[31m-LJFOLD(CONV SUB IRCONV_U32_U64)[m
[31m-LJFOLD(CONV MUL IRCONV_U32_U64)[m
[31m-LJFOLDF(simplify_conv_narrow)[m
[31m-{[m
[31m-  IROp op = (IROp)fleft->o;[m
[31m-  IRType t = irt_type(fins->t);[m
[31m-  IRRef op1 = fleft->op1, op2 = fleft->op2, mode = fins->op2;[m
[31m-  PHIBARRIER(fleft);[m
[31m-  op1 = emitir(IRTI(IR_CONV), op1, mode);[m
[31m-  op2 = emitir(IRTI(IR_CONV), op2, mode);[m
[31m-  fins->ot = IRT(op, t);[m
[31m-  fins->op1 = op1;[m
[31m-  fins->op2 = op2;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Special CSE rule for CONV. */[m
[31m-LJFOLD(CONV any any)[m
[31m-LJFOLDF(cse_conv)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {[m
[31m-    IRRef op1 = fins->op1, op2 = (fins->op2 & IRCONV_MODEMASK);[m
[31m-    uint8_t guard = irt_isguard(fins->t);[m
[31m-    IRRef ref = J->chain[IR_CONV];[m
[31m-    while (ref > op1) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      /* Commoning with stronger checks is ok. */[m
[31m-      if (ir->op1 == op1 && (ir->op2 & IRCONV_MODEMASK) == op2 &&[m
[31m-	  irt_isguard(ir->t) >= guard)[m
[31m-	return ref;[m
[31m-      ref = ir->prev;[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;  /* No fallthrough to regular CSE. */[m
[31m-}[m
[31m-[m
[31m-/* FP conversion narrowing. */[m
[31m-LJFOLD(TOBIT ADD KNUM)[m
[31m-LJFOLD(TOBIT SUB KNUM)[m
[31m-LJFOLD(CONV ADD IRCONV_INT_NUM)[m
[31m-LJFOLD(CONV SUB IRCONV_INT_NUM)[m
[31m-LJFOLD(CONV ADD IRCONV_I64_NUM)[m
[31m-LJFOLD(CONV SUB IRCONV_I64_NUM)[m
[31m-LJFOLDF(narrow_convert)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  /* Narrowing ignores PHIs and repeating it inside the loop is not useful. */[m
[31m-  if (J->chain[IR_LOOP])[m
[31m-    return NEXTFOLD;[m
[31m-  lua_assert(fins->o != IR_CONV || (fins->op2&IRCONV_CONVMASK) != IRCONV_TOBIT);[m
[31m-  return lj_opt_narrow_convert(J);[m
[31m-}[m
[31m-[m
[31m-/* -- Integer algebraic simplifications ----------------------------------- */[m
[31m-[m
[31m-LJFOLD(ADD any KINT)[m
[31m-LJFOLD(ADDOV any KINT)[m
[31m-LJFOLD(SUBOV any KINT)[m
[31m-LJFOLDF(simplify_intadd_k)[m
[31m-{[m
[31m-  if (fright->i == 0)  /* i o 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MULOV any KINT)[m
[31m-LJFOLDF(simplify_intmul_k)[m
[31m-{[m
[31m-  if (fright->i == 0)  /* i * 0 ==> 0 */[m
[31m-    return RIGHTFOLD;[m
[31m-  if (fright->i == 1)  /* i * 1 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  if (fright->i == 2) {  /* i * 2 ==> i + i */[m
[31m-    fins->o = IR_ADDOV;[m
[31m-    fins->op2 = fins->op1;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any KINT)[m
[31m-LJFOLDF(simplify_intsub_k)[m
[31m-{[m
[31m-  if (fright->i == 0)  /* i - 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  fins->o = IR_ADD;  /* i - k ==> i + (-k) */[m
[31m-  fins->op2 = (IRRef1)lj_ir_kint(J, -fright->i);  /* Overflow for -2^31 ok. */[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB KINT any)[m
[31m-LJFOLD(SUB KINT64 any)[m
[31m-LJFOLDF(simplify_intsub_kleft)[m
[31m-{[m
[31m-  if (fleft->o == IR_KINT ? (fleft->i == 0) : (ir_kint64(fleft)->u64 == 0)) {[m
[31m-    fins->o = IR_NEG;  /* 0 - i ==> -i */[m
[31m-    fins->op1 = fins->op2;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD any KINT64)[m
[31m-LJFOLDF(simplify_intadd_k64)[m
[31m-{[m
[31m-  if (ir_kint64(fright)->u64 == 0)  /* i + 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any KINT64)[m
[31m-LJFOLDF(simplify_intsub_k64)[m
[31m-{[m
[31m-  uint64_t k = ir_kint64(fright)->u64;[m
[31m-  if (k == 0)  /* i - 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  fins->o = IR_ADD;  /* i - k ==> i + (-k) */[m
[31m-  fins->op2 = (IRRef1)lj_ir_kint64(J, (uint64_t)-(int64_t)k);[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-static TRef simplify_intmul_k(jit_State *J, int32_t k)[m
[31m-{[m
[31m-  /* Note: many more simplifications are possible, e.g. 2^k1 +- 2^k2.[m
[31m-  ** But this is mainly intended for simple address arithmetic.[m
[31m-  ** Also it's easier for the backend to optimize the original multiplies.[m
[31m-  */[m
[31m-  if (k == 0) {  /* i * 0 ==> 0 */[m
[31m-    return RIGHTFOLD;[m
[31m-  } else if (k == 1) {  /* i * 1 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  } else if ((k & (k-1)) == 0) {  /* i * 2^k ==> i << k */[m
[31m-    fins->o = IR_BSHL;[m
[31m-    fins->op2 = lj_ir_kint(J, lj_fls((uint32_t)k));[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL any KINT)[m
[31m-LJFOLDF(simplify_intmul_k32)[m
[31m-{[m
[31m-  if (fright->i >= 0)[m
[31m-    return simplify_intmul_k(J, fright->i);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL any KINT64)[m
[31m-LJFOLDF(simplify_intmul_k64)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (ir_kint64(fright)->u64 < 0x80000000u)[m
[31m-    return simplify_intmul_k(J, (int32_t)ir_kint64(fright)->u64);[m
[31m-  return NEXTFOLD;[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MOD any KINT)[m
[31m-LJFOLDF(simplify_intmod_k)[m
[31m-{[m
[31m-  int32_t k = fright->i;[m
[31m-  lua_assert(k != 0);[m
[31m-  if (k > 0 && (k & (k-1)) == 0) {  /* i % (2^k) ==> i & (2^k-1) */[m
[31m-    fins->o = IR_BAND;[m
[31m-    fins->op2 = lj_ir_kint(J, k-1);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MOD KINT any)[m
[31m-LJFOLDF(simplify_intmod_kleft)[m
[31m-{[m
[31m-  if (fleft->i == 0)[m
[31m-    return INTFOLD(0);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any any)[m
[31m-LJFOLD(SUBOV any any)[m
[31m-LJFOLDF(simplify_intsub)[m
[31m-{[m
[31m-  if (fins->op1 == fins->op2 && !irt_isnum(fins->t))  /* i - i ==> 0 */[m
[31m-    return irt_is64(fins->t) ? INT64FOLD(0) : INTFOLD(0);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB ADD any)[m
[31m-LJFOLDF(simplify_intsubadd_leftcancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fleft);[m
[31m-    if (fins->op2 == fleft->op1)  /* (i + j) - i ==> j */[m
[31m-      return fleft->op2;[m
[31m-    if (fins->op2 == fleft->op2)  /* (i + j) - j ==> i */[m
[31m-      return fleft->op1;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB SUB any)[m
[31m-LJFOLDF(simplify_intsubsub_leftcancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fleft);[m
[31m-    if (fins->op2 == fleft->op1) {  /* (i - j) - i ==> 0 - j */[m
[31m-      fins->op1 = (IRRef1)lj_ir_kint(J, 0);[m
[31m-      fins->op2 = fleft->op2;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any SUB)[m
[31m-LJFOLDF(simplify_intsubsub_rightcancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fright);[m
[31m-    if (fins->op1 == fright->op1)  /* i - (i - j) ==> j */[m
[31m-      return fright->op2;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any ADD)[m
[31m-LJFOLDF(simplify_intsubadd_rightcancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fright);[m
[31m-    if (fins->op1 == fright->op1) {  /* i - (i + j) ==> 0 - j */[m
[31m-      fins->op2 = fright->op2;[m
[31m-      fins->op1 = (IRRef1)lj_ir_kint(J, 0);[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-    if (fins->op1 == fright->op2) {  /* i - (j + i) ==> 0 - j */[m
[31m-      fins->op2 = fright->op1;[m
[31m-      fins->op1 = (IRRef1)lj_ir_kint(J, 0);[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB ADD ADD)[m
[31m-LJFOLDF(simplify_intsubaddadd_cancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fleft);[m
[31m-    PHIBARRIER(fright);[m
[31m-    if (fleft->op1 == fright->op1) {  /* (i + j1) - (i + j2) ==> j1 - j2 */[m
[31m-      fins->op1 = fleft->op2;[m
[31m-      fins->op2 = fright->op2;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-    if (fleft->op1 == fright->op2) {  /* (i + j1) - (j2 + i) ==> j1 - j2 */[m
[31m-      fins->op1 = fleft->op2;[m
[31m-      fins->op2 = fright->op1;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-    if (fleft->op2 == fright->op1) {  /* (j1 + i) - (i + j2) ==> j1 - j2 */[m
[31m-      fins->op1 = fleft->op1;[m
[31m-      fins->op2 = fright->op2;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-    if (fleft->op2 == fright->op2) {  /* (j1 + i) - (j2 + i) ==> j1 - j2 */[m
[31m-      fins->op1 = fleft->op1;[m
[31m-      fins->op2 = fright->op1;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BAND any KINT)[m
[31m-LJFOLD(BAND any KINT64)[m
[31m-LJFOLDF(simplify_band_k)[m
[31m-{[m
[31m-  int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :[m
[31m-				     (int64_t)ir_k64(fright)->u64;[m
[31m-  if (k == 0)  /* i & 0 ==> 0 */[m
[31m-    return RIGHTFOLD;[m
[31m-  if (k == -1)  /* i & -1 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BOR any KINT)[m
[31m-LJFOLD(BOR any KINT64)[m
[31m-LJFOLDF(simplify_bor_k)[m
[31m-{[m
[31m-  int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :[m
[31m-				     (int64_t)ir_k64(fright)->u64;[m
[31m-  if (k == 0)  /* i | 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  if (k == -1)  /* i | -1 ==> -1 */[m
[31m-    return RIGHTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BXOR any KINT)[m
[31m-LJFOLD(BXOR any KINT64)[m
[31m-LJFOLDF(simplify_bxor_k)[m
[31m-{[m
[31m-  int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :[m
[31m-				     (int64_t)ir_k64(fright)->u64;[m
[31m-  if (k == 0)  /* i xor 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  if (k == -1) {  /* i xor -1 ==> ~i */[m
[31m-    fins->o = IR_BNOT;[m
[31m-    fins->op2 = 0;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL any KINT)[m
[31m-LJFOLD(BSHR any KINT)[m
[31m-LJFOLD(BSAR any KINT)[m
[31m-LJFOLD(BROL any KINT)[m
[31m-LJFOLD(BROR any KINT)[m
[31m-LJFOLDF(simplify_shift_ik)[m
[31m-{[m
[31m-  int32_t mask = irt_is64(fins->t) ? 63 : 31;[m
[31m-  int32_t k = (fright->i & mask);[m
[31m-  if (k == 0)  /* i o 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  if (k == 1 && fins->o == IR_BSHL) {  /* i << 1 ==> i + i */[m
[31m-    fins->o = IR_ADD;[m
[31m-    fins->op2 = fins->op1;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  if (k != fright->i) {  /* i o k ==> i o (k & mask) */[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, k);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-#ifndef LJ_TARGET_UNIFYROT[m
[31m-  if (fins->o == IR_BROR) {  /* bror(i, k) ==> brol(i, (-k)&mask) */[m
[31m-    fins->o = IR_BROL;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-#endif[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL any BAND)[m
[31m-LJFOLD(BSHR any BAND)[m
[31m-LJFOLD(BSAR any BAND)[m
[31m-LJFOLD(BROL any BAND)[m
[31m-LJFOLD(BROR any BAND)[m
[31m-LJFOLDF(simplify_shift_andk)[m
[31m-{[m
[31m-  IRIns *irk = IR(fright->op2);[m
[31m-  PHIBARRIER(fright);[m
[31m-  if ((fins->o < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) &&[m
[31m-      irk->o == IR_KINT) {  /* i o (j & mask) ==> i o j */[m
[31m-    int32_t mask = irt_is64(fins->t) ? 63 : 31;[m
[31m-    int32_t k = irk->i & mask;[m
[31m-    if (k == mask) {[m
[31m-      fins->op2 = fright->op1;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL KINT any)[m
[31m-LJFOLD(BSHR KINT any)[m
[31m-LJFOLD(BSHL KINT64 any)[m
[31m-LJFOLD(BSHR KINT64 any)[m
[31m-LJFOLDF(simplify_shift1_ki)[m
[31m-{[m
[31m-  int64_t k = fleft->o == IR_KINT ? (int64_t)fleft->i :[m
[31m-				    (int64_t)ir_k64(fleft)->u64;[m
[31m-  if (k == 0)  /* 0 o i ==> 0 */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSAR KINT any)[m
[31m-LJFOLD(BROL KINT any)[m
[31m-LJFOLD(BROR KINT any)[m
[31m-LJFOLD(BSAR KINT64 any)[m
[31m-LJFOLD(BROL KINT64 any)[m
[31m-LJFOLD(BROR KINT64 any)[m
[31m-LJFOLDF(simplify_shift2_ki)[m
[31m-{[m
[31m-  int64_t k = fleft->o == IR_KINT ? (int64_t)fleft->i :[m
[31m-				    (int64_t)ir_k64(fleft)->u64;[m
[31m-  if (k == 0 || k == -1)  /* 0 o i ==> 0; -1 o i ==> -1 */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL BAND KINT)[m
[31m-LJFOLD(BSHR BAND KINT)[m
[31m-LJFOLD(BROL BAND KINT)[m
[31m-LJFOLD(BROR BAND KINT)[m
[31m-LJFOLDF(simplify_shiftk_andk)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (irk->o == IR_KINT) {  /* (i & k1) o k2 ==> (i o k2) & (k1 o k2) */[m
[31m-    int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op1 = (IRRef1)lj_opt_fold(J);[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, k);[m
[31m-    fins->ot = IRTI(IR_BAND);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BAND BSHL KINT)[m
[31m-LJFOLD(BAND BSHR KINT)[m
[31m-LJFOLDF(simplify_andk_shiftk)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  if (irk->o == IR_KINT &&[m
[31m-      kfold_intop(-1, irk->i, (IROp)fleft->o) == fright->i)[m
[31m-    return LEFTFOLD;  /* (i o k1) & k2 ==> i, if (-1 o k1) == k2 */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Reassociation ------------------------------------------------------- */[m
[31m-[m
[31m-LJFOLD(ADD ADD KINT)[m
[31m-LJFOLD(MUL MUL KINT)[m
[31m-LJFOLD(BAND BAND KINT)[m
[31m-LJFOLD(BOR BOR KINT)[m
[31m-LJFOLD(BXOR BXOR KINT)[m
[31m-LJFOLDF(reassoc_intarith_k)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  if (irk->o == IR_KINT) {[m
[31m-    int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);[m
[31m-    if (k == irk->i)  /* (i o k1) o k2 ==> i o k1, if (k1 o k2) == k1. */[m
[31m-      return LEFTFOLD;[m
[31m-    PHIBARRIER(fleft);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, k);[m
[31m-    return RETRYFOLD;  /* (i o k1) o k2 ==> i o (k1 o k2) */[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD ADD KINT64)[m
[31m-LJFOLD(MUL MUL KINT64)[m
[31m-LJFOLD(BAND BAND KINT64)[m
[31m-LJFOLD(BOR BOR KINT64)[m
[31m-LJFOLD(BXOR BXOR KINT64)[m
[31m-LJFOLDF(reassoc_intarith_k64)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  if (irk->o == IR_KINT64) {[m
[31m-    uint64_t k = kfold_int64arith(ir_k64(irk)->u64,[m
[31m-				  ir_k64(fright)->u64, (IROp)fins->o);[m
[31m-    PHIBARRIER(fleft);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint64(J, k);[m
[31m-    return RETRYFOLD;  /* (i o k1) o k2 ==> i o (k1 o k2) */[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MIN MIN any)[m
[31m-LJFOLD(MAX MAX any)[m
[31m-LJFOLD(BAND BAND any)[m
[31m-LJFOLD(BOR BOR any)[m
[31m-LJFOLDF(reassoc_dup)[m
[31m-{[m
[31m-  if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2)[m
[31m-    return LEFTFOLD;  /* (a o b) o a ==> a o b; (a o b) o b ==> a o b */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BXOR BXOR any)[m
[31m-LJFOLDF(reassoc_bxor)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (fins->op2 == fleft->op1)  /* (a xor b) xor a ==> b */[m
[31m-    return fleft->op2;[m
[31m-  if (fins->op2 == fleft->op2)  /* (a xor b) xor b ==> a */[m
[31m-    return fleft->op1;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL BSHL KINT)[m
[31m-LJFOLD(BSHR BSHR KINT)[m
[31m-LJFOLD(BSAR BSAR KINT)[m
[31m-LJFOLD(BROL BROL KINT)[m
[31m-LJFOLD(BROR BROR KINT)[m
[31m-LJFOLDF(reassoc_shift)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  PHIBARRIER(fleft);  /* The (shift any KINT) rule covers k2 == 0 and more. */[m
[31m-  if (irk->o == IR_KINT) {  /* (i o k1) o k2 ==> i o (k1 + k2) */[m
[31m-    int32_t mask = irt_is64(fins->t) ? 63 : 31;[m
[31m-    int32_t k = (irk->i & mask) + (fright->i & mask);[m
[31m-    if (k > mask) {  /* Combined shift too wide? */[m
[31m-      if (fins->o == IR_BSHL || fins->o == IR_BSHR)[m
[31m-	return mask == 31 ? INTFOLD(0) : INT64FOLD(0);[m
[31m-      else if (fins->o == IR_BSAR)[m
[31m-	k = mask;[m
[31m-      else[m
[31m-	k &= mask;[m
[31m-    }[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, k);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MIN MIN KNUM)[m
[31m-LJFOLD(MAX MAX KNUM)[m
[31m-LJFOLD(MIN MIN KINT)[m
[31m-LJFOLD(MAX MAX KINT)[m
[31m-LJFOLDF(reassoc_minmax_k)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  if (irk->o == IR_KNUM) {[m
[31m-    lua_Number a = ir_knum(irk)->n;[m
[31m-    lua_Number y = lj_vm_foldarith(a, knumright, fins->o - IR_ADD);[m
[31m-    if (a == y)  /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */[m
[31m-      return LEFTFOLD;[m
[31m-    PHIBARRIER(fleft);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_knum(J, y);[m
[31m-    return RETRYFOLD;  /* (x o k1) o k2 ==> x o (k1 o k2) */[m
[31m-  } else if (irk->o == IR_KINT) {[m
[31m-    int32_t a = irk->i;[m
[31m-    int32_t y = kfold_intop(a, fright->i, fins->o);[m
[31m-    if (a == y)  /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */[m
[31m-      return LEFTFOLD;[m
[31m-    PHIBARRIER(fleft);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, y);[m
[31m-    return RETRYFOLD;  /* (x o k1) o k2 ==> x o (k1 o k2) */[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MIN MAX any)[m
[31m-LJFOLD(MAX MIN any)[m
[31m-LJFOLDF(reassoc_minmax_left)[m
[31m-{[m
[31m-  if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2)[m
[31m-    return RIGHTFOLD;  /* (b o1 a) o2 b ==> b; (a o1 b) o2 b ==> b */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MIN any MAX)[m
[31m-LJFOLD(MAX any MIN)[m
[31m-LJFOLDF(reassoc_minmax_right)[m
[31m-{[m
[31m-  if (fins->op1 == fright->op1 || fins->op1 == fright->op2)[m
[31m-    return LEFTFOLD;  /* a o2 (a o1 b) ==> a; a o2 (b o1 a) ==> a */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Array bounds check elimination -------------------------------------- */[m
[31m-[m
[31m-/* Eliminate ABC across PHIs to handle t[i-1] forwarding case.[m
[31m-** ABC(asize, (i+k)+(-k)) ==> ABC(asize, i), but only if it already exists.[m
[31m-** Could be generalized to (i+k1)+k2 ==> i+(k1+k2), but needs better disambig.[m
[31m-*/[m
[31m-LJFOLD(ABC any ADD)[m
[31m-LJFOLDF(abc_fwd)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_ABC)) {[m
[31m-    if (irref_isk(fright->op2)) {[m
[31m-      IRIns *add2 = IR(fright->op1);[m
[31m-      if (add2->o == IR_ADD && irref_isk(add2->op2) &&[m
[31m-	  IR(fright->op2)->i == -IR(add2->op2)->i) {[m
[31m-	IRRef ref = J->chain[IR_ABC];[m
[31m-	IRRef lim = add2->op1;[m
[31m-	if (fins->op1 > lim) lim = fins->op1;[m
[31m-	while (ref > lim) {[m
[31m-	  IRIns *ir = IR(ref);[m
[31m-	  if (ir->op1 == fins->op1 && ir->op2 == add2->op1)[m
[31m-	    return DROPFOLD;[m
[31m-	  ref = ir->prev;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Eliminate ABC for constants.[m
[31m-** ABC(asize, k1), ABC(asize k2) ==> ABC(asize, max(k1, k2))[m
[31m-** Drop second ABC if k2 is lower. Otherwise patch first ABC with k2.[m
[31m-*/[m
[31m-LJFOLD(ABC any KINT)[m
[31m-LJFOLDF(abc_k)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_ABC)) {[m
[31m-    IRRef ref = J->chain[IR_ABC];[m
[31m-    IRRef asize = fins->op1;[m
[31m-    while (ref > asize) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      if (ir->op1 == asize && irref_isk(ir->op2)) {[m
[31m-	int32_t k = IR(ir->op2)->i;[m
[31m-	if (fright->i > k)[m
[31m-	  ir->op2 = fins->op2;[m
[31m-	return DROPFOLD;[m
[31m-      }[m
[31m-      ref = ir->prev;[m
[31m-    }[m
[31m-    return EMITFOLD;  /* Already performed CSE. */[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Eliminate invariant ABC inside loop. */[m
[31m-LJFOLD(ABC any any)[m
[31m-LJFOLDF(abc_invar)[m
[31m-{[m
[31m-  /* Invariant ABC marked as PTR. Drop if op1 is invariant, too. */[m
[31m-  if (!irt_isint(fins->t) && fins->op1 < J->chain[IR_LOOP] &&[m
[31m-      !irt_isphi(IR(fins->op1)->t))[m
[31m-    return DROPFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Commutativity ------------------------------------------------------- */[m
[31m-[m
[31m-/* The refs of commutative ops are canonicalized. Lower refs go to the right.[m
[31m-** Rationale behind this:[m
[31m-** - It (also) moves constants to the right.[m
[31m-** - It reduces the number of FOLD rules (e.g. (BOR any KINT) suffices).[m
[31m-** - It helps CSE to find more matches.[m
[31m-** - The assembler generates better code with constants at the right.[m
[31m-*/[m
[31m-[m
[31m-LJFOLD(ADD any any)[m
[31m-LJFOLD(MUL any any)[m
[31m-LJFOLD(ADDOV any any)[m
[31m-LJFOLD(MULOV any any)[m
[31m-LJFOLDF(comm_swap)[m
[31m-{[m
[31m-  if (fins->op1 < fins->op2) {  /* Move lower ref to the right. */[m
[31m-    IRRef1 tmp = fins->op1;[m
[31m-    fins->op1 = fins->op2;[m
[31m-    fins->op2 = tmp;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(EQ any any)[m
[31m-LJFOLD(NE any any)[m
[31m-LJFOLDF(comm_equal)[m
[31m-{[m
[31m-  /* For non-numbers only: x == x ==> drop; x ~= x ==> fail */[m
[31m-  if (fins->op1 == fins->op2 && !irt_isnum(fins->t))[m
[31m-    return CONDFOLD(fins->o == IR_EQ);[m
[31m-  return fold_comm_swap(J);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(LT any any)[m
[31m-LJFOLD(GE any any)[m
[31m-LJFOLD(LE any any)[m
[31m-LJFOLD(GT any any)[m
[31m-LJFOLD(ULT any any)[m
[31m-LJFOLD(UGE any any)[m
[31m-LJFOLD(ULE any any)[m
[31m-LJFOLD(UGT any any)[m
[31m-LJFOLDF(comm_comp)[m
[31m-{[m
[31m-  /* For non-numbers only: x <=> x ==> drop; x <> x ==> fail */[m
[31m-  if (fins->op1 == fins->op2 && !irt_isnum(fins->t))[m
[31m-    return CONDFOLD((fins->o ^ (fins->o >> 1)) & 1);[m
[31m-  if (fins->op1 < fins->op2) {  /* Move lower ref to the right. */[m
[31m-    IRRef1 tmp = fins->op1;[m
[31m-    fins->op1 = fins->op2;[m
[31m-    fins->op2 = tmp;[m
[31m-    fins->o ^= 3; /* GT <-> LT, GE <-> LE, does not affect U */[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BAND any any)[m
[31m-LJFOLD(BOR any any)[m
[31m-LJFOLD(MIN any any)[m
[31m-LJFOLD(MAX any any)[m
[31m-LJFOLDF(comm_dup)[m
[31m-{[m
[31m-  if (fins->op1 == fins->op2)  /* x o x ==> x */[m
[31m-    return LEFTFOLD;[m
[31m-  return fold_comm_swap(J);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BXOR any any)[m
[31m-LJFOLDF(comm_bxor)[m
[31m-{[m
[31m-  if (fins->op1 == fins->op2)  /* i xor i ==> 0 */[m
[31m-    return irt_is64(fins->t) ? INT64FOLD(0) : INTFOLD(0);[m
[31m-  return fold_comm_swap(J);[m
[31m-}[m
[31m-[m
[31m-/* -- Simplification of compound expressions ------------------------------ */[m
[31m-[m
[31m-static TRef kfold_xload(jit_State *J, IRIns *ir, const void *p)[m
[31m-{[m
[31m-  int32_t k;[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_NUM: return lj_ir_knum_u64(J, *(uint64_t *)p);[m
[31m-  case IRT_I8: k = (int32_t)*(int8_t *)p; break;[m
[31m-  case IRT_U8: k = (int32_t)*(uint8_t *)p; break;[m
[31m-  case IRT_I16: k = (int32_t)(int16_t)lj_getu16(p); break;[m
[31m-  case IRT_U16: k = (int32_t)(uint16_t)lj_getu16(p); break;[m
[31m-  case IRT_INT: case IRT_U32: k = (int32_t)lj_getu32(p); break;[m
[31m-  case IRT_I64: case IRT_U64: return lj_ir_kint64(J, *(uint64_t *)p);[m
[31m-  default: return 0;[m
[31m-  }[m
[31m-  return lj_ir_kint(J, k);[m
[31m-}[m
[31m-[m
[31m-/* Turn: string.sub(str, a, b) == kstr[m
[31m-** into: string.byte(str, a) == string.byte(kstr, 1) etc.[m
[31m-** Note: this creates unaligned XLOADs on x86/x64.[m
[31m-*/[m
[31m-LJFOLD(EQ SNEW KGC)[m
[31m-LJFOLD(NE SNEW KGC)[m
[31m-LJFOLDF(merge_eqne_snew_kgc)[m
[31m-{[m
[31m-  GCstr *kstr = ir_kstr(fright);[m
[31m-  int32_t len = (int32_t)kstr->len;[m
[31m-  lua_assert(irt_isstr(fins->t));[m
[31m-[m
[31m-#if LJ_TARGET_UNALIGNED[m
[31m-#define FOLD_SNEW_MAX_LEN	4  /* Handle string lengths 0, 1, 2, 3, 4. */[m
[31m-#define FOLD_SNEW_TYPE8		IRT_I8	/* Creates shorter immediates. */[m
[31m-#else[m
[31m-#define FOLD_SNEW_MAX_LEN	1  /* Handle string lengths 0 or 1. */[m
[31m-#define FOLD_SNEW_TYPE8		IRT_U8  /* Prefer unsigned loads. */[m
[31m-#endif[m
[31m-[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (len <= FOLD_SNEW_MAX_LEN) {[m
[31m-    IROp op = (IROp)fins->o;[m
[31m-    IRRef strref = fleft->op1;[m
[31m-    if (IR(strref)->o != IR_STRREF)[m
[31m-      return NEXTFOLD;[m
[31m-    if (op == IR_EQ) {[m
[31m-      emitir(IRTGI(IR_EQ), fleft->op2, lj_ir_kint(J, len));[m
[31m-      /* Caveat: fins/fleft/fright is no longer valid after emitir. */[m
[31m-    } else {[m
[31m-      /* NE is not expanded since this would need an OR of two conds. */[m
[31m-      if (!irref_isk(fleft->op2))  /* Only handle the constant length case. */[m
[31m-	return NEXTFOLD;[m
[31m-      if (IR(fleft->op2)->i != len)[m
[31m-	return DROPFOLD;[m
[31m-    }[m
[31m-    if (len > 0) {[m
[31m-      /* A 4 byte load for length 3 is ok -- all strings have an extra NUL. */[m
[31m-      uint16_t ot = (uint16_t)(len == 1 ? IRT(IR_XLOAD, FOLD_SNEW_TYPE8) :[m
[31m-			       len == 2 ? IRT(IR_XLOAD, IRT_U16) :[m
[31m-			       IRTI(IR_XLOAD));[m
[31m-      TRef tmp = emitir(ot, strref,[m
[31m-			IRXLOAD_READONLY | (len > 1 ? IRXLOAD_UNALIGNED : 0));[m
[31m-      TRef val = kfold_xload(J, IR(tref_ref(tmp)), strdata(kstr));[m
[31m-      if (len == 3)[m
[31m-	tmp = emitir(IRTI(IR_BAND), tmp,[m
[31m-		     lj_ir_kint(J, LJ_ENDIAN_SELECT(0x00ffffff, 0xffffff00)));[m
[31m-      fins->op1 = (IRRef1)tmp;[m
[31m-      fins->op2 = (IRRef1)val;[m
[31m-      fins->ot = (IROpT)IRTGI(op);[m
[31m-      return RETRYFOLD;[m
[31m-    } else {[m
[31m-      return DROPFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Loads --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Loads cannot be folded or passed on to CSE in general.[m
[31m-** Alias analysis is needed to check for forwarding opportunities.[m
[31m-**[m
[31m-** Caveat: *all* loads must be listed here or they end up at CSE![m
[31m-*/[m
[31m-[m
[31m-LJFOLD(ALOAD any)[m
[31m-LJFOLDX(lj_opt_fwd_aload)[m
[31m-[m
[31m-/* From HREF fwd (see below). Must eliminate, not supported by fwd/backend. */[m
[31m-LJFOLD(HLOAD KKPTR)[m
[31m-LJFOLDF(kfold_hload_kkptr)[m
[31m-{[m
[31m-  UNUSED(J);[m
[31m-  lua_assert(ir_kptr(fleft) == niltvg(J2G(J)));[m
[31m-  return TREF_NIL;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(HLOAD any)[m
[31m-LJFOLDX(lj_opt_fwd_hload)[m
[31m-[m
[31m-LJFOLD(ULOAD any)[m
[31m-LJFOLDX(lj_opt_fwd_uload)[m
[31m-[m
[31m-LJFOLD(CALLL any IRCALL_lj_tab_len)[m
[31m-LJFOLDX(lj_opt_fwd_tab_len)[m
[31m-[m
[31m-/* Upvalue refs are really loads, but there are no corresponding stores.[m
[31m-** So CSE is ok for them, except for UREFO across a GC step (see below).[m
[31m-** If the referenced function is const, its upvalue addresses are const, too.[m
[31m-** This can be used to improve CSE by looking for the same address,[m
[31m-** even if the upvalues originate from a different function.[m
[31m-*/[m
[31m-LJFOLD(UREFO KGC any)[m
[31m-LJFOLD(UREFC KGC any)[m
[31m-LJFOLDF(cse_uref)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {[m
[31m-    IRRef ref = J->chain[fins->o];[m
[31m-    GCfunc *fn = ir_kfunc(fleft);[m
[31m-    GCupval *uv = gco2uv(gcref(fn->l.uvptr[(fins->op2 >> 8)]));[m
[31m-    while (ref > 0) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn2 = ir_kfunc(IR(ir->op1));[m
[31m-	if (gco2uv(gcref(fn2->l.uvptr[(ir->op2 >> 8)])) == uv) {[m
[31m-	  if (fins->o == IR_UREFO && gcstep_barrier(J, ref))[m
[31m-	    break;[m
[31m-	  return ref;[m
[31m-	}[m
[31m-      }[m
[31m-      ref = ir->prev;[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(HREFK any any)[m
[31m-LJFOLDX(lj_opt_fwd_hrefk)[m
[31m-[m
[31m-LJFOLD(HREF TNEW any)[m
[31m-LJFOLDF(fwd_href_tnew)[m
[31m-{[m
[31m-  if (lj_opt_fwd_href_nokey(J))[m
[31m-    return lj_ir_kkptr(J, niltvg(J2G(J)));[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(HREF TDUP KPRI)[m
[31m-LJFOLD(HREF TDUP KGC)[m
[31m-LJFOLD(HREF TDUP KNUM)[m
[31m-LJFOLDF(fwd_href_tdup)[m
[31m-{[m
[31m-  TValue keyv;[m
[31m-  lj_ir_kvalue(J->L, &keyv, fright);[m
[31m-  if (lj_tab_get(J->L, ir_ktab(IR(fleft->op1)), &keyv) == niltvg(J2G(J)) &&[m
[31m-      lj_opt_fwd_href_nokey(J))[m
[31m-    return lj_ir_kkptr(J, niltvg(J2G(J)));[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* We can safely FOLD/CSE array/hash refs and field loads, since there[m
[31m-** are no corresponding stores. But we need to check for any NEWREF with[m
[31m-** an aliased table, as it may invalidate all of the pointers and fields.[m
[31m-** Only HREF needs the NEWREF check -- AREF and HREFK already depend on[m
[31m-** FLOADs. And NEWREF itself is treated like a store (see below).[m
[31m-** LREF is constant (per trace) since coroutine switches are not inlined.[m
[31m-*/[m
[31m-LJFOLD(FLOAD TNEW IRFL_TAB_ASIZE)[m
[31m-LJFOLDF(fload_tab_tnew_asize)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))[m
[31m-    return INTFOLD(fleft->op1);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD TNEW IRFL_TAB_HMASK)[m
[31m-LJFOLDF(fload_tab_tnew_hmask)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))[m
[31m-    return INTFOLD((1 << fleft->op2)-1);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD TDUP IRFL_TAB_ASIZE)[m
[31m-LJFOLDF(fload_tab_tdup_asize)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))[m
[31m-    return INTFOLD((int32_t)ir_ktab(IR(fleft->op1))->asize);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD TDUP IRFL_TAB_HMASK)[m
[31m-LJFOLDF(fload_tab_tdup_hmask)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))[m
[31m-    return INTFOLD((int32_t)ir_ktab(IR(fleft->op1))->hmask);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(HREF any any)[m
[31m-LJFOLD(FLOAD any IRFL_TAB_ARRAY)[m
[31m-LJFOLD(FLOAD any IRFL_TAB_NODE)[m
[31m-LJFOLD(FLOAD any IRFL_TAB_ASIZE)[m
[31m-LJFOLD(FLOAD any IRFL_TAB_HMASK)[m
[31m-LJFOLDF(fload_tab_ah)[m
[31m-{[m
[31m-  TRef tr = lj_opt_cse(J);[m
[31m-  return lj_opt_fwd_tptr(J, tref_ref(tr)) ? tr : EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Strings are immutable, so we can safely FOLD/CSE the related FLOAD. */[m
[31m-LJFOLD(FLOAD KGC IRFL_STR_LEN)[m
[31m-LJFOLDF(fload_str_len_kgc)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))[m
[31m-    return INTFOLD((int32_t)ir_kstr(fleft)->len);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD SNEW IRFL_STR_LEN)[m
[31m-LJFOLDF(fload_str_len_snew)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {[m
[31m-    PHIBARRIER(fleft);[m
[31m-    return fleft->op2;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD TOSTR IRFL_STR_LEN)[m
[31m-LJFOLDF(fload_str_len_tostr)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fleft->op2 == IRTOSTR_CHAR)[m
[31m-    return INTFOLD(1);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* The C type ID of cdata objects is immutable. */[m
[31m-LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID)[m
[31m-LJFOLDF(fload_cdata_typeid_kgc)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))[m
[31m-    return INTFOLD((int32_t)ir_kcdata(fleft)->ctypeid);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Get the contents of immutable cdata objects. */[m
[31m-LJFOLD(FLOAD KGC IRFL_CDATA_PTR)[m
[31m-LJFOLD(FLOAD KGC IRFL_CDATA_INT)[m
[31m-LJFOLD(FLOAD KGC IRFL_CDATA_INT64)[m
[31m-LJFOLDF(fload_cdata_int64_kgc)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {[m
[31m-    void *p = cdataptr(ir_kcdata(fleft));[m
[31m-    if (irt_is64(fins->t))[m
[31m-      return INT64FOLD(*(uint64_t *)p);[m
[31m-    else[m
[31m-      return INTFOLD(*(int32_t *)p);[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD CNEW IRFL_CDATA_CTYPEID)[m
[31m-LJFOLD(FLOAD CNEWI IRFL_CDATA_CTYPEID)[m
[31m-LJFOLDF(fload_cdata_typeid_cnew)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))[m
[31m-    return fleft->op1;  /* No PHI barrier needed. CNEW/CNEWI op1 is const. */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Pointer, int and int64 cdata objects are immutable. */[m
[31m-LJFOLD(FLOAD CNEWI IRFL_CDATA_PTR)[m
[31m-LJFOLD(FLOAD CNEWI IRFL_CDATA_INT)[m
[31m-LJFOLD(FLOAD CNEWI IRFL_CDATA_INT64)[m
[31m-LJFOLDF(fload_cdata_ptr_int64_cnew)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))[m
[31m-    return fleft->op2;  /* Fold even across PHI to avoid allocations. */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD any IRFL_STR_LEN)[m
[31m-LJFOLD(FLOAD any IRFL_FUNC_ENV)[m
[31m-LJFOLD(FLOAD any IRFL_THREAD_ENV)[m
[31m-LJFOLD(FLOAD any IRFL_CDATA_CTYPEID)[m
[31m-LJFOLD(FLOAD any IRFL_CDATA_PTR)[m
[31m-LJFOLD(FLOAD any IRFL_CDATA_INT)[m
[31m-LJFOLD(FLOAD any IRFL_CDATA_INT64)[m
[31m-LJFOLD(VLOAD any any)  /* Vararg loads have no corresponding stores. */[m
[31m-LJFOLDX(lj_opt_cse)[m
[31m-[m
[31m-/* All other field loads need alias analysis. */[m
[31m-LJFOLD(FLOAD any any)[m
[31m-LJFOLDX(lj_opt_fwd_fload)[m
[31m-[m
[31m-/* This is for LOOP only. Recording handles SLOADs internally. */[m
[31m-LJFOLD(SLOAD any any)[m
[31m-LJFOLDF(fwd_sload)[m
[31m-{[m
[31m-  if ((fins->op2 & IRSLOAD_FRAME)) {[m
[31m-    TRef tr = lj_opt_cse(J);[m
[31m-    return tref_ref(tr) < J->chain[IR_RETF] ? EMITFOLD : tr;[m
[31m-  } else {[m
[31m-    lua_assert(J->slot[fins->op1] != 0);[m
[31m-    return J->slot[fins->op1];[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Only fold for KKPTR. The pointer _and_ the contents must be const. */[m
[31m-LJFOLD(XLOAD KKPTR any)[m
[31m-LJFOLDF(xload_kptr)[m
[31m-{[m
[31m-  TRef tr = kfold_xload(J, fins, ir_kptr(fleft));[m
[31m-  return tr ? tr : NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(XLOAD any any)[m
[31m-LJFOLDX(lj_opt_fwd_xload)[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-/* Write barriers are amenable to CSE, but not across any incremental[m
[31m-** GC steps.[m
[31m-**[m
[31m-** The same logic applies to open upvalue references, because a stack[m
[31m-** may be resized during a GC step (not the current stack, but maybe that[m
[31m-** of a coroutine).[m
[31m-*/[m
[31m-LJFOLD(TBAR any)[m
[31m-LJFOLD(OBAR any any)[m
[31m-LJFOLD(UREFO any any)[m
[31m-LJFOLDF(barrier_tab)[m
[31m-{[m
[31m-  TRef tr = lj_opt_cse(J);[m
[31m-  if (gcstep_barrier(J, tref_ref(tr)))  /* CSE across GC step? */[m
[31m-    return EMITFOLD;  /* Raw emit. Assumes fins is left intact by CSE. */[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(TBAR TNEW)[m
[31m-LJFOLD(TBAR TDUP)[m
[31m-LJFOLDF(barrier_tnew_tdup)[m
[31m-{[m
[31m-  /* New tables are always white and never need a barrier. */[m
[31m-  if (fins->op1 < J->chain[IR_LOOP])  /* Except across a GC step. */[m
[31m-    return NEXTFOLD;[m
[31m-  return DROPFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-LJFOLD(PROF any any)[m
[31m-LJFOLDF(prof)[m
[31m-{[m
[31m-  IRRef ref = J->chain[IR_PROF];[m
[31m-  if (ref+1 == J->cur.nins)  /* Drop neighbouring IR_PROF. */[m
[31m-    return ref;[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Stores and allocations ---------------------------------------------- */[m
[31m-[m
[31m-/* Stores and allocations cannot be folded or passed on to CSE in general.[m
[31m-** But some stores can be eliminated with dead-store elimination (DSE).[m
[31m-**[m
[31m-** Caveat: *all* stores and allocs must be listed here or they end up at CSE![m
[31m-*/[m
[31m-[m
[31m-LJFOLD(ASTORE any any)[m
[31m-LJFOLD(HSTORE any any)[m
[31m-LJFOLDX(lj_opt_dse_ahstore)[m
[31m-[m
[31m-LJFOLD(USTORE any any)[m
[31m-LJFOLDX(lj_opt_dse_ustore)[m
[31m-[m
[31m-LJFOLD(FSTORE any any)[m
[31m-LJFOLDX(lj_opt_dse_fstore)[m
[31m-[m
[31m-LJFOLD(XSTORE any any)[m
[31m-LJFOLDX(lj_opt_dse_xstore)[m
[31m-[m
[31m-LJFOLD(NEWREF any any)  /* Treated like a store. */[m
[31m-LJFOLD(CALLA any any)[m
[31m-LJFOLD(CALLL any any)  /* Safeguard fallback. */[m
[31m-LJFOLD(CALLS any any)[m
[31m-LJFOLD(CALLXS any any)[m
[31m-LJFOLD(XBAR)[m
[31m-LJFOLD(RETF any any)  /* Modifies BASE. */[m
[31m-LJFOLD(TNEW any any)[m
[31m-LJFOLD(TDUP any)[m
[31m-LJFOLD(CNEW any any)[m
[31m-LJFOLD(XSNEW any any)[m
[31m-LJFOLD(BUFHDR any any)[m
[31m-LJFOLDX(lj_ir_emit)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Every entry in the generated hash table is a 32 bit pattern:[m
[31m-**[m
[31m-** xxxxxxxx iiiiiii lllllll rrrrrrrrrr[m
[31m-**[m
[31m-**   xxxxxxxx = 8 bit index into fold function table[m
[31m-**    iiiiiii = 7 bit folded instruction opcode[m
[31m-**    lllllll = 7 bit left instruction opcode[m
[31m-** rrrrrrrrrr = 8 bit right instruction opcode or 10 bits from literal field[m
[31m-*/[m
[31m-[m
[31m-#include "lj_folddef.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Fold IR instruction. */[m
[31m-TRef LJ_FASTCALL lj_opt_fold(jit_State *J)[m
[31m-{[m
[31m-  uint32_t key, any;[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  if (LJ_UNLIKELY((J->flags & JIT_F_OPT_MASK) != JIT_F_OPT_DEFAULT)) {[m
[31m-    lua_assert(((JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE|JIT_F_OPT_DSE) |[m
[31m-		JIT_F_OPT_DEFAULT) == JIT_F_OPT_DEFAULT);[m
[31m-    /* Folding disabled? Chain to CSE, but not for loads/stores/allocs. */[m
[31m-    if (!(J->flags & JIT_F_OPT_FOLD) && irm_kind(lj_ir_mode[fins->o]) == IRM_N)[m
[31m-      return lj_opt_cse(J);[m
[31m-[m
[31m-    /* No FOLD, forwarding or CSE? Emit raw IR for loads, except for SLOAD. */[m
[31m-    if ((J->flags & (JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE)) !=[m
[31m-		    (JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE) &&[m
[31m-	irm_kind(lj_ir_mode[fins->o]) == IRM_L && fins->o != IR_SLOAD)[m
[31m-      return lj_ir_emit(J);[m
[31m-[m
[31m-    /* No FOLD or DSE? Emit raw IR for stores. */[m
[31m-    if ((J->flags & (JIT_F_OPT_FOLD|JIT_F_OPT_DSE)) !=[m
[31m-		    (JIT_F_OPT_FOLD|JIT_F_OPT_DSE) &&[m
[31m-	irm_kind(lj_ir_mode[fins->o]) == IRM_S)[m
[31m-      return lj_ir_emit(J);[m
[31m-  }[m
[31m-[m
[31m-  /* Fold engine start/retry point. */[m
[31m-retry:[m
[31m-  /* Construct key from opcode and operand opcodes (unless literal/none). */[m
[31m-  key = ((uint32_t)fins->o << 17);[m
[31m-  if (fins->op1 >= J->cur.nk) {[m
[31m-    key += (uint32_t)IR(fins->op1)->o << 10;[m
[31m-    *fleft = *IR(fins->op1);[m
[31m-  }[m
[31m-  if (fins->op2 >= J->cur.nk) {[m
[31m-    key += (uint32_t)IR(fins->op2)->o;[m
[31m-    *fright = *IR(fins->op2);[m
[31m-  } else {[m
[31m-    key += (fins->op2 & 0x3ffu);  /* Literal mask. Must include IRCONV_*MASK. */[m
[31m-  }[m
[31m-[m
[31m-  /* Check for a match in order from most specific to least specific. */[m
[31m-  any = 0;[m
[31m-  for (;;) {[m
[31m-    uint32_t k = key | (any & 0x1ffff);[m
[31m-    uint32_t h = fold_hashkey(k);[m
[31m-    uint32_t fh = fold_hash[h];  /* Lookup key in semi-perfect hash table. */[m
[31m-    if ((fh & 0xffffff) == k || (fh = fold_hash[h+1], (fh & 0xffffff) == k)) {[m
[31m-      ref = (IRRef)tref_ref(fold_func[fh >> 24](J));[m
[31m-      if (ref != NEXTFOLD)[m
[31m-	break;[m
[31m-    }[m
[31m-    if (any == 0xfffff)  /* Exhausted folding. Pass on to CSE. */[m
[31m-      return lj_opt_cse(J);[m
[31m-    any = (any | (any >> 10)) ^ 0xffc00;[m
[31m-  }[m
[31m-[m
[31m-  /* Return value processing, ordered by frequency. */[m
[31m-  if (LJ_LIKELY(ref >= MAX_FOLD))[m
[31m-    return TREF(ref, irt_t(IR(ref)->t));[m
[31m-  if (ref == RETRYFOLD)[m
[31m-    goto retry;[m
[31m-  if (ref == KINTFOLD)[m
[31m-    return lj_ir_kint(J, fins->i);[m
[31m-  if (ref == FAILFOLD)[m
[31m-    lj_trace_err(J, LJ_TRERR_GFAIL);[m
[31m-  lua_assert(ref == DROPFOLD);[m
[31m-  return REF_DROP;[m
[31m-}[m
[31m-[m
[31m-/* -- Common-Subexpression Elimination ------------------------------------ */[m
[31m-[m
[31m-/* CSE an IR instruction. This is very fast due to the skip-list chains. */[m
[31m-TRef LJ_FASTCALL lj_opt_cse(jit_State *J)[m
[31m-{[m
[31m-  /* Avoid narrow to wide store-to-load forwarding stall */[m
[31m-  IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16);[m
[31m-  IROp op = fins->o;[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {[m
[31m-    /* Limited search for same operands in per-opcode chain. */[m
[31m-    IRRef ref = J->chain[op];[m
[31m-    IRRef lim = fins->op1;[m
[31m-    if (fins->op2 > lim) lim = fins->op2;  /* Relies on lit < REF_BIAS. */[m
[31m-    while (ref > lim) {[m
[31m-      if (IR(ref)->op12 == op12)[m
[31m-	return TREF(ref, irt_t(IR(ref)->t));  /* Common subexpression found. */[m
[31m-      ref = IR(ref)->prev;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Otherwise emit IR (inlined for speed). */[m
[31m-  {[m
[31m-    IRRef ref = lj_ir_nextins(J);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    ir->prev = J->chain[op];[m
[31m-    ir->op12 = op12;[m
[31m-    J->chain[op] = (IRRef1)ref;[m
[31m-    ir->o = fins->o;[m
[31m-    J->guardemit.irt |= fins->t.irt;[m
[31m-    return TREF(ref, irt_t((ir->t = fins->t)));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* CSE with explicit search limit. */[m
[31m-TRef LJ_FASTCALL lj_opt_cselim(jit_State *J, IRRef lim)[m
[31m-{[m
[31m-  IRRef ref = J->chain[fins->o];[m
[31m-  IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16);[m
[31m-  while (ref > lim) {[m
[31m-    if (IR(ref)->op12 == op12)[m
[31m-      return ref;[m
[31m-    ref = IR(ref)->prev;[m
[31m-  }[m
[31m-  return lj_ir_emit(J);[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#undef IR[m
[31m-#undef fins[m
[31m-#undef fleft[m
[31m-#undef fright[m
[31m-#undef knumleft[m
[31m-#undef knumright[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop.c[m
[1mdeleted file mode 100644[m
[1mindex 7978f3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_loop.c[m
[1m+++ /dev/null[m
[36m@@ -1,449 +0,0 @@[m
[31m-/*[m
[31m-** LOOP: Loop Optimizations.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_loop_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* Loop optimization:[m
[31m-**[m
[31m-** Traditional Loop-Invariant Code Motion (LICM) splits the instructions[m
[31m-** of a loop into invariant and variant instructions. The invariant[m
[31m-** instructions are hoisted out of the loop and only the variant[m
[31m-** instructions remain inside the loop body.[m
[31m-**[m
[31m-** Unfortunately LICM is mostly useless for compiling dynamic languages.[m
[31m-** The IR has many guards and most of the subsequent instructions are[m
[31m-** control-dependent on them. The first non-hoistable guard would[m
[31m-** effectively prevent hoisting of all subsequent instructions.[m
[31m-**[m
[31m-** That's why we use a special form of unrolling using copy-substitution,[m
[31m-** combined with redundancy elimination:[m
[31m-**[m
[31m-** The recorded instruction stream is re-emitted to the compiler pipeline[m
[31m-** with substituted operands. The substitution table is filled with the[m
[31m-** refs returned by re-emitting each instruction. This can be done[m
[31m-** on-the-fly, because the IR is in strict SSA form, where every ref is[m
[31m-** defined before its use.[m
[31m-**[m
[31m-** This aproach generates two code sections, separated by the LOOP[m
[31m-** instruction:[m
[31m-**[m
[31m-** 1. The recorded instructions form a kind of pre-roll for the loop. It[m
[31m-** contains a mix of invariant and variant instructions and performs[m
[31m-** exactly one loop iteration (but not necessarily the 1st iteration).[m
[31m-**[m
[31m-** 2. The loop body contains only the variant instructions and performs[m
[31m-** all remaining loop iterations.[m
[31m-**[m
[31m-** On first sight that looks like a waste of space, because the variant[m
[31m-** instructions are present twice. But the key insight is that the[m
[31m-** pre-roll honors the control-dependencies for *both* the pre-roll itself[m
[31m-** *and* the loop body![m
[31m-**[m
[31m-** It also means one doesn't have to explicitly model control-dependencies[m
[31m-** (which, BTW, wouldn't help LICM much). And it's much easier to[m
[31m-** integrate sparse snapshotting with this approach.[m
[31m-**[m
[31m-** One of the nicest aspects of this approach is that all of the[m
[31m-** optimizations of the compiler pipeline (FOLD, CSE, FWD, etc.) can be[m
[31m-** reused with only minor restrictions (e.g. one should not fold[m
[31m-** instructions across loop-carried dependencies).[m
[31m-**[m
[31m-** But in general all optimizations can be applied which only need to look[m
[31m-** backwards into the generated instruction stream. At any point in time[m
[31m-** during the copy-substitution process this contains both a static loop[m
[31m-** iteration (the pre-roll) and a dynamic one (from the to-be-copied[m
[31m-** instruction up to the end of the partial loop body).[m
[31m-**[m
[31m-** Since control-dependencies are implicitly kept, CSE also applies to all[m
[31m-** kinds of guards. The major advantage is that all invariant guards can[m
[31m-** be hoisted, too.[m
[31m-**[m
[31m-** Load/store forwarding works across loop iterations, too. This is[m
[31m-** important if loop-carried dependencies are kept in upvalues or tables.[m
[31m-** E.g. 'self.idx = self.idx + 1' deep down in some OO-style method may[m
[31m-** become a forwarded loop-recurrence after inlining.[m
[31m-**[m
[31m-** Since the IR is in SSA form, loop-carried dependencies have to be[m
[31m-** modeled with PHI instructions. The potential candidates for PHIs are[m
[31m-** collected on-the-fly during copy-substitution. After eliminating the[m
[31m-** redundant ones, PHI instructions are emitted *below* the loop body.[m
[31m-**[m
[31m-** Note that this departure from traditional SSA form doesn't change the[m
[31m-** semantics of the PHI instructions themselves. But it greatly simplifies[m
[31m-** on-the-fly generation of the IR and the machine code.[m
[31m-*/[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* Emit raw IR without passing through optimizations. */[m
[31m-#define emitir_raw(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))[m
[31m-[m
[31m-/* -- PHI elimination ----------------------------------------------------- */[m
[31m-[m
[31m-/* Emit or eliminate collected PHIs. */[m
[31m-static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi,[m
[31m-			  SnapNo onsnap)[m
[31m-{[m
[31m-  int passx = 0;[m
[31m-  IRRef i, j, nslots;[m
[31m-  IRRef invar = J->chain[IR_LOOP];[m
[31m-  /* Pass #1: mark redundant and potentially redundant PHIs. */[m
[31m-  for (i = 0, j = 0; i < nphi; i++) {[m
[31m-    IRRef lref = phi[i];[m
[31m-    IRRef rref = subst[lref];[m
[31m-    if (lref == rref || rref == REF_DROP) {  /* Invariants are redundant. */[m
[31m-      irt_clearphi(IR(lref)->t);[m
[31m-    } else {[m
[31m-      phi[j++] = (IRRef1)lref;[m
[31m-      if (!(IR(rref)->op1 == lref || IR(rref)->op2 == lref)) {[m
[31m-	/* Quick check for simple recurrences failed, need pass2. */[m
[31m-	irt_setmark(IR(lref)->t);[m
[31m-	passx = 1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  nphi = j;[m
[31m-  /* Pass #2: traverse variant part and clear marks of non-redundant PHIs. */[m
[31m-  if (passx) {[m
[31m-    SnapNo s;[m
[31m-    for (i = J->cur.nins-1; i > invar; i--) {[m
[31m-      IRIns *ir = IR(i);[m
[31m-      if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t);[m
[31m-      if (!irref_isk(ir->op1)) {[m
[31m-	irt_clearmark(IR(ir->op1)->t);[m
[31m-	if (ir->op1 < invar &&[m
[31m-	    ir->o >= IR_CALLN && ir->o <= IR_CARG) {  /* ORDER IR */[m
[31m-	  ir = IR(ir->op1);[m
[31m-	  while (ir->o == IR_CARG) {[m
[31m-	    if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t);[m
[31m-	    if (irref_isk(ir->op1)) break;[m
[31m-	    ir = IR(ir->op1);[m
[31m-	    irt_clearmark(ir->t);[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    for (s = J->cur.nsnap-1; s >= onsnap; s--) {[m
[31m-      SnapShot *snap = &J->cur.snap[s];[m
[31m-      SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-      MSize n, nent = snap->nent;[m
[31m-      for (n = 0; n < nent; n++) {[m
[31m-	IRRef ref = snap_ref(map[n]);[m
[31m-	if (!irref_isk(ref)) irt_clearmark(IR(ref)->t);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  /* Pass #3: add PHIs for variant slots without a corresponding SLOAD. */[m
[31m-  nslots = J->baseslot+J->maxslot;[m
[31m-  for (i = 1; i < nslots; i++) {[m
[31m-    IRRef ref = tref_ref(J->slot[i]);[m
[31m-    while (!irref_isk(ref) && ref != subst[ref]) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      irt_clearmark(ir->t);  /* Unmark potential uses, too. */[m
[31m-      if (irt_isphi(ir->t) || irt_ispri(ir->t))[m
[31m-	break;[m
[31m-      irt_setphi(ir->t);[m
[31m-      if (nphi >= LJ_MAX_PHI)[m
[31m-	lj_trace_err(J, LJ_TRERR_PHIOV);[m
[31m-      phi[nphi++] = (IRRef1)ref;[m
[31m-      ref = subst[ref];[m
[31m-      if (ref > invar)[m
[31m-	break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Pass #4: propagate non-redundant PHIs. */[m
[31m-  while (passx) {[m
[31m-    passx = 0;[m
[31m-    for (i = 0; i < nphi; i++) {[m
[31m-      IRRef lref = phi[i];[m
[31m-      IRIns *ir = IR(lref);[m
[31m-      if (!irt_ismarked(ir->t)) {  /* Propagate only from unmarked PHIs. */[m
[31m-	IRIns *irr = IR(subst[lref]);[m
[31m-	if (irt_ismarked(irr->t)) {  /* Right ref points to other PHI? */[m
[31m-	  irt_clearmark(irr->t);  /* Mark that PHI as non-redundant. */[m
[31m-	  passx = 1;  /* Retry. */[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  /* Pass #5: emit PHI instructions or eliminate PHIs. */[m
[31m-  for (i = 0; i < nphi; i++) {[m
[31m-    IRRef lref = phi[i];[m
[31m-    IRIns *ir = IR(lref);[m
[31m-    if (!irt_ismarked(ir->t)) {  /* Emit PHI if not marked. */[m
[31m-      IRRef rref = subst[lref];[m
[31m-      if (rref > invar)[m
[31m-	irt_setphi(IR(rref)->t);[m
[31m-      emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref);[m
[31m-    } else {  /* Otherwise eliminate PHI. */[m
[31m-      irt_clearmark(ir->t);[m
[31m-      irt_clearphi(ir->t);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Loop unrolling using copy-substitution ------------------------------ */[m
[31m-[m
[31m-/* Copy-substitute snapshot. */[m
[31m-static void loop_subst_snap(jit_State *J, SnapShot *osnap,[m
[31m-			    SnapEntry *loopmap, IRRef1 *subst)[m
[31m-{[m
[31m-  SnapEntry *nmap, *omap = &J->cur.snapmap[osnap->mapofs];[m
[31m-  SnapEntry *nextmap = &J->cur.snapmap[snap_nextofs(&J->cur, osnap)];[m
[31m-  MSize nmapofs;[m
[31m-  MSize on, ln, nn, onent = osnap->nent;[m
[31m-  BCReg nslots = osnap->nslots;[m
[31m-  SnapShot *snap = &J->cur.snap[J->cur.nsnap];[m
[31m-  if (irt_isguard(J->guardemit)) {  /* Guard inbetween? */[m
[31m-    nmapofs = J->cur.nsnapmap;[m
[31m-    J->cur.nsnap++;  /* Add new snapshot. */[m
[31m-  } else {  /* Otherwise overwrite previous snapshot. */[m
[31m-    snap--;[m
[31m-    nmapofs = snap->mapofs;[m
[31m-  }[m
[31m-  J->guardemit.irt = 0;[m
[31m-  /* Setup new snapshot. */[m
[31m-  snap->mapofs = (uint16_t)nmapofs;[m
[31m-  snap->ref = (IRRef1)J->cur.nins;[m
[31m-  snap->nslots = nslots;[m
[31m-  snap->topslot = osnap->topslot;[m
[31m-  snap->count = 0;[m
[31m-  nmap = &J->cur.snapmap[nmapofs];[m
[31m-  /* Substitute snapshot slots. */[m
[31m-  on = ln = nn = 0;[m
[31m-  while (on < onent) {[m
[31m-    SnapEntry osn = omap[on], lsn = loopmap[ln];[m
[31m-    if (snap_slot(lsn) < snap_slot(osn)) {  /* Copy slot from loop map. */[m
[31m-      nmap[nn++] = lsn;[m
[31m-      ln++;[m
[31m-    } else {  /* Copy substituted slot from snapshot map. */[m
[31m-      if (snap_slot(lsn) == snap_slot(osn)) ln++;  /* Shadowed loop slot. */[m
[31m-      if (!irref_isk(snap_ref(osn)))[m
[31m-	osn = snap_setref(osn, subst[snap_ref(osn)]);[m
[31m-      nmap[nn++] = osn;[m
[31m-      on++;[m
[31m-    }[m
[31m-  }[m
[31m-  while (snap_slot(loopmap[ln]) < nslots)  /* Copy remaining loop slots. */[m
[31m-    nmap[nn++] = loopmap[ln++];[m
[31m-  snap->nent = (uint8_t)nn;[m
[31m-  omap += onent;[m
[31m-  nmap += nn;[m
[31m-  while (omap < nextmap)  /* Copy PC + frame links. */[m
[31m-    *nmap++ = *omap++;[m
[31m-  J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap);[m
[31m-}[m
[31m-[m
[31m-typedef struct LoopState {[m
[31m-  jit_State *J;[m
[31m-  IRRef1 *subst;[m
[31m-  MSize sizesubst;[m
[31m-} LoopState;[m
[31m-[m
[31m-/* Unroll loop. */[m
[31m-static void loop_unroll(LoopState *lps)[m
[31m-{[m
[31m-  jit_State *J = lps->J;[m
[31m-  IRRef1 phi[LJ_MAX_PHI];[m
[31m-  uint32_t nphi = 0;[m
[31m-  IRRef1 *subst;[m
[31m-  SnapNo onsnap;[m
[31m-  SnapShot *osnap, *loopsnap;[m
[31m-  SnapEntry *loopmap, *psentinel;[m
[31m-  IRRef ins, invar;[m
[31m-[m
[31m-  /* Allocate substitution table.[m
[31m-  ** Only non-constant refs in [REF_BIAS,invar) are valid indexes.[m
[31m-  */[m
[31m-  invar = J->cur.nins;[m
[31m-  lps->sizesubst = invar - REF_BIAS;[m
[31m-  lps->subst = lj_mem_newvec(J->L, lps->sizesubst, IRRef1);[m
[31m-  subst = lps->subst - REF_BIAS;[m
[31m-  subst[REF_BASE] = REF_BASE;[m
[31m-[m
[31m-  /* LOOP separates the pre-roll from the loop body. */[m
[31m-  emitir_raw(IRTG(IR_LOOP, IRT_NIL), 0, 0);[m
[31m-[m
[31m-  /* Grow snapshot buffer and map for copy-substituted snapshots.[m
[31m-  ** Need up to twice the number of snapshots minus #0 and loop snapshot.[m
[31m-  ** Need up to twice the number of entries plus fallback substitutions[m
[31m-  ** from the loop snapshot entries for each new snapshot.[m
[31m-  ** Caveat: both calls may reallocate J->cur.snap and J->cur.snapmap![m
[31m-  */[m
[31m-  onsnap = J->cur.nsnap;[m
[31m-  lj_snap_grow_buf(J, 2*onsnap-2);[m
[31m-  lj_snap_grow_map(J, J->cur.nsnapmap*2+(onsnap-2)*J->cur.snap[onsnap-1].nent);[m
[31m-[m
[31m-  /* The loop snapshot is used for fallback substitutions. */[m
[31m-  loopsnap = &J->cur.snap[onsnap-1];[m
[31m-  loopmap = &J->cur.snapmap[loopsnap->mapofs];[m
[31m-  /* The PC of snapshot #0 and the loop snapshot must match. */[m
[31m-  psentinel = &loopmap[loopsnap->nent];[m
[31m-  lua_assert(*psentinel == J->cur.snapmap[J->cur.snap[0].nent]);[m
[31m-  *psentinel = SNAP(255, 0, 0);  /* Replace PC with temporary sentinel. */[m
[31m-[m
[31m-  /* Start substitution with snapshot #1 (#0 is empty for root traces). */[m
[31m-  osnap = &J->cur.snap[1];[m
[31m-[m
[31m-  /* Copy and substitute all recorded instructions and snapshots. */[m
[31m-  for (ins = REF_FIRST; ins < invar; ins++) {[m
[31m-    IRIns *ir;[m
[31m-    IRRef op1, op2;[m
[31m-[m
[31m-    if (ins >= osnap->ref)  /* Instruction belongs to next snapshot? */[m
[31m-      loop_subst_snap(J, osnap++, loopmap, subst);  /* Copy-substitute it. */[m
[31m-[m
[31m-    /* Substitute instruction operands. */[m
[31m-    ir = IR(ins);[m
[31m-    op1 = ir->op1;[m
[31m-    if (!irref_isk(op1)) op1 = subst[op1];[m
[31m-    op2 = ir->op2;[m
[31m-    if (!irref_isk(op2)) op2 = subst[op2];[m
[31m-    if (irm_kind(lj_ir_mode[ir->o]) == IRM_N &&[m
[31m-	op1 == ir->op1 && op2 == ir->op2) {  /* Regular invariant ins? */[m
[31m-      subst[ins] = (IRRef1)ins;  /* Shortcut. */[m
[31m-    } else {[m
[31m-      /* Re-emit substituted instruction to the FOLD/CSE/etc. pipeline. */[m
[31m-      IRType1 t = ir->t;  /* Get this first, since emitir may invalidate ir. */[m
[31m-      IRRef ref = tref_ref(emitir(ir->ot & ~IRT_ISPHI, op1, op2));[m
[31m-      subst[ins] = (IRRef1)ref;[m
[31m-      if (ref != ins) {[m
[31m-	IRIns *irr = IR(ref);[m
[31m-	if (ref < invar) {  /* Loop-carried dependency? */[m
[31m-	  /* Potential PHI? */[m
[31m-	  if (!irref_isk(ref) && !irt_isphi(irr->t) && !irt_ispri(irr->t)) {[m
[31m-	    irt_setphi(irr->t);[m
[31m-	    if (nphi >= LJ_MAX_PHI)[m
[31m-	      lj_trace_err(J, LJ_TRERR_PHIOV);[m
[31m-	    phi[nphi++] = (IRRef1)ref;[m
[31m-	  }[m
[31m-	  /* Check all loop-carried dependencies for type instability. */[m
[31m-	  if (!irt_sametype(t, irr->t)) {[m
[31m-	    if (irt_isinteger(t) && irt_isinteger(irr->t))[m
[31m-	      continue;[m
[31m-	    else if (irt_isnum(t) && irt_isinteger(irr->t))  /* Fix int->num. */[m
[31m-	      ref = tref_ref(emitir(IRTN(IR_CONV), ref, IRCONV_NUM_INT));[m
[31m-	    else if (irt_isnum(irr->t) && irt_isinteger(t))  /* Fix num->int. */[m
[31m-	      ref = tref_ref(emitir(IRTGI(IR_CONV), ref,[m
[31m-				    IRCONV_INT_NUM|IRCONV_CHECK));[m
[31m-	    else[m
[31m-	      lj_trace_err(J, LJ_TRERR_TYPEINS);[m
[31m-	    subst[ins] = (IRRef1)ref;[m
[31m-	    irr = IR(ref);[m
[31m-	    goto phiconv;[m
[31m-	  }[m
[31m-	} else if (ref != REF_DROP && irr->o == IR_CONV &&[m
[31m-		   ref > invar && irr->op1 < invar) {[m
[31m-	  /* May need an extra PHI for a CONV. */[m
[31m-	  ref = irr->op1;[m
[31m-	  irr = IR(ref);[m
[31m-	phiconv:[m
[31m-	  if (ref < invar && !irref_isk(ref) && !irt_isphi(irr->t)) {[m
[31m-	    irt_setphi(irr->t);[m
[31m-	    if (nphi >= LJ_MAX_PHI)[m
[31m-	      lj_trace_err(J, LJ_TRERR_PHIOV);[m
[31m-	    phi[nphi++] = (IRRef1)ref;[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (!irt_isguard(J->guardemit))  /* Drop redundant snapshot. */[m
[31m-    J->cur.nsnapmap = (uint16_t)J->cur.snap[--J->cur.nsnap].mapofs;[m
[31m-  lua_assert(J->cur.nsnapmap <= J->sizesnapmap);[m
[31m-  *psentinel = J->cur.snapmap[J->cur.snap[0].nent];  /* Restore PC. */[m
[31m-[m
[31m-  loop_emit_phi(J, subst, phi, nphi, onsnap);[m
[31m-}[m
[31m-[m
[31m-/* Undo any partial changes made by the loop optimization. */[m
[31m-static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  SnapShot *snap = &J->cur.snap[nsnap-1];[m
[31m-  SnapEntry *map = J->cur.snapmap;[m
[31m-  map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent];  /* Restore PC. */[m
[31m-  J->cur.nsnapmap = (uint16_t)nsnapmap;[m
[31m-  J->cur.nsnap = nsnap;[m
[31m-  J->guardemit.irt = 0;[m
[31m-  lj_ir_rollback(J, ins);[m
[31m-  for (i = 0; i < BPROP_SLOTS; i++) {  /* Remove backprop. cache entries. */[m
[31m-    BPropEntry *bp = &J->bpropcache[i];[m
[31m-    if (bp->val >= ins)[m
[31m-      bp->key = 0;[m
[31m-  }[m
[31m-  for (ins--; ins >= REF_FIRST; ins--) {  /* Remove flags. */[m
[31m-    IRIns *ir = IR(ins);[m
[31m-    irt_clearphi(ir->t);[m
[31m-    irt_clearmark(ir->t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Protected callback for loop optimization. */[m
[31m-static TValue *cploop_opt(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  loop_unroll((LoopState *)ud);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Loop optimization. */[m
[31m-int lj_opt_loop(jit_State *J)[m
[31m-{[m
[31m-  IRRef nins = J->cur.nins;[m
[31m-  SnapNo nsnap = J->cur.nsnap;[m
[31m-  MSize nsnapmap = J->cur.nsnapmap;[m
[31m-  LoopState lps;[m
[31m-  int errcode;[m
[31m-  lps.J = J;[m
[31m-  lps.subst = NULL;[m
[31m-  lps.sizesubst = 0;[m
[31m-  errcode = lj_vm_cpcall(J->L, NULL, &lps, cploop_opt);[m
[31m-  lj_mem_freevec(J2G(J), lps.subst, lps.sizesubst, IRRef1);[m
[31m-  if (LJ_UNLIKELY(errcode)) {[m
[31m-    lua_State *L = J->L;[m
[31m-    if (errcode == LUA_ERRRUN && tvisnumber(L->top-1)) {  /* Trace error? */[m
[31m-      int32_t e = numberVint(L->top-1);[m
[31m-      switch ((TraceError)e) {[m
[31m-      case LJ_TRERR_TYPEINS:  /* Type instability. */[m
[31m-      case LJ_TRERR_GFAIL:  /* Guard would always fail. */[m
[31m-	/* Unrolling via recording fixes many cases, e.g. a flipped boolean. */[m
[31m-	if (--J->instunroll < 0)  /* But do not unroll forever. */[m
[31m-	  break;[m
[31m-	L->top--;  /* Remove error object. */[m
[31m-	loop_undo(J, nins, nsnap, nsnapmap);[m
[31m-	return 1;  /* Loop optimization failed, continue recording. */[m
[31m-      default:[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-    lj_err_throw(L, errcode);  /* Propagate all other errors. */[m
[31m-  }[m
[31m-  return 0;  /* Loop optimization is ok. */[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef emitir[m
[31m-#undef emitir_raw[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem.c[m
[1mdeleted file mode 100644[m
[1mindex 5549b0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_mem.c[m
[1m+++ /dev/null[m
[36m@@ -1,935 +0,0 @@[m
[31m-/*[m
[31m-** Memory access optimizations.[m
[31m-** AA: Alias Analysis using high-level semantic disambiguation.[m
[31m-** FWD: Load Forwarding (L2L) + Store Forwarding (S2L).[m
[31m-** DSE: Dead-Store Elimination.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_mem_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_ircall.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-#define fins		(&J->fold.ins)[m
[31m-#define fleft		(&J->fold.left)[m
[31m-#define fright		(&J->fold.right)[m
[31m-[m
[31m-/*[m
[31m-** Caveat #1: return value is not always a TRef -- only use with tref_ref().[m
[31m-** Caveat #2: FWD relies on active CSE for xREF operands -- see lj_opt_fold().[m
[31m-*/[m
[31m-[m
[31m-/* Return values from alias analysis. */[m
[31m-typedef enum {[m
[31m-  ALIAS_NO,	/* The two refs CANNOT alias (exact). */[m
[31m-  ALIAS_MAY,	/* The two refs MAY alias (inexact). */[m
[31m-  ALIAS_MUST	/* The two refs MUST alias (exact). */[m
[31m-} AliasRet;[m
[31m-[m
[31m-/* -- ALOAD/HLOAD forwarding and ASTORE/HSTORE elimination ---------------- */[m
[31m-[m
[31m-/* Simplified escape analysis: check for intervening stores. */[m
[31m-static AliasRet aa_escape(jit_State *J, IRIns *ir, IRIns *stop)[m
[31m-{[m
[31m-  IRRef ref = (IRRef)(ir - J->cur.ir);  /* The ref that might be stored. */[m
[31m-  for (ir++; ir < stop; ir++)[m
[31m-    if (ir->op2 == ref &&[m
[31m-	(ir->o == IR_ASTORE || ir->o == IR_HSTORE ||[m
[31m-	 ir->o == IR_USTORE || ir->o == IR_FSTORE))[m
[31m-      return ALIAS_MAY;  /* Reference was stored and might alias. */[m
[31m-  return ALIAS_NO;  /* Reference was not stored. */[m
[31m-}[m
[31m-[m
[31m-/* Alias analysis for two different table references. */[m
[31m-static AliasRet aa_table(jit_State *J, IRRef ta, IRRef tb)[m
[31m-{[m
[31m-  IRIns *taba = IR(ta), *tabb = IR(tb);[m
[31m-  int newa, newb;[m
[31m-  lua_assert(ta != tb);[m
[31m-  lua_assert(irt_istab(taba->t) && irt_istab(tabb->t));[m
[31m-  /* Disambiguate new allocations. */[m
[31m-  newa = (taba->o == IR_TNEW || taba->o == IR_TDUP);[m
[31m-  newb = (tabb->o == IR_TNEW || tabb->o == IR_TDUP);[m
[31m-  if (newa && newb)[m
[31m-    return ALIAS_NO;  /* Two different allocations never alias. */[m
[31m-  if (newb) {  /* At least one allocation? */[m
[31m-    IRIns *tmp = taba; taba = tabb; tabb = tmp;[m
[31m-  } else if (!newa) {[m
[31m-    return ALIAS_MAY;  /* Anything else: we just don't know. */[m
[31m-  }[m
[31m-  return aa_escape(J, taba, tabb);[m
[31m-}[m
[31m-[m
[31m-/* Alias analysis for array and hash access using key-based disambiguation. */[m
[31m-static AliasRet aa_ahref(jit_State *J, IRIns *refa, IRIns *refb)[m
[31m-{[m
[31m-  IRRef ka = refa->op2;[m
[31m-  IRRef kb = refb->op2;[m
[31m-  IRIns *keya, *keyb;[m
[31m-  IRRef ta, tb;[m
[31m-  if (refa == refb)[m
[31m-    return ALIAS_MUST;  /* Shortcut for same refs. */[m
[31m-  keya = IR(ka);[m
[31m-  if (keya->o == IR_KSLOT) { ka = keya->op1; keya = IR(ka); }[m
[31m-  keyb = IR(kb);[m
[31m-  if (keyb->o == IR_KSLOT) { kb = keyb->op1; keyb = IR(kb); }[m
[31m-  ta = (refa->o==IR_HREFK || refa->o==IR_AREF) ? IR(refa->op1)->op1 : refa->op1;[m
[31m-  tb = (refb->o==IR_HREFK || refb->o==IR_AREF) ? IR(refb->op1)->op1 : refb->op1;[m
[31m-  if (ka == kb) {[m
[31m-    /* Same key. Check for same table with different ref (NEWREF vs. HREF). */[m
[31m-    if (ta == tb)[m
[31m-      return ALIAS_MUST;  /* Same key, same table. */[m
[31m-    else[m
[31m-      return aa_table(J, ta, tb);  /* Same key, possibly different table. */[m
[31m-  }[m
[31m-  if (irref_isk(ka) && irref_isk(kb))[m
[31m-    return ALIAS_NO;  /* Different constant keys. */[m
[31m-  if (refa->o == IR_AREF) {[m
[31m-    /* Disambiguate array references based on index arithmetic. */[m
[31m-    int32_t ofsa = 0, ofsb = 0;[m
[31m-    IRRef basea = ka, baseb = kb;[m
[31m-    lua_assert(refb->o == IR_AREF);[m
[31m-    /* Gather base and offset from t[base] or t[base+-ofs]. */[m
[31m-    if (keya->o == IR_ADD && irref_isk(keya->op2)) {[m
[31m-      basea = keya->op1;[m
[31m-      ofsa = IR(keya->op2)->i;[m
[31m-      if (basea == kb && ofsa != 0)[m
[31m-	return ALIAS_NO;  /* t[base+-ofs] vs. t[base]. */[m
[31m-    }[m
[31m-    if (keyb->o == IR_ADD && irref_isk(keyb->op2)) {[m
[31m-      baseb = keyb->op1;[m
[31m-      ofsb = IR(keyb->op2)->i;[m
[31m-      if (ka == baseb && ofsb != 0)[m
[31m-	return ALIAS_NO;  /* t[base] vs. t[base+-ofs]. */[m
[31m-    }[m
[31m-    if (basea == baseb && ofsa != ofsb)[m
[31m-      return ALIAS_NO;  /* t[base+-o1] vs. t[base+-o2] and o1 != o2. */[m
[31m-  } else {[m
[31m-    /* Disambiguate hash references based on the type of their keys. */[m
[31m-    lua_assert((refa->o==IR_HREF || refa->o==IR_HREFK || refa->o==IR_NEWREF) &&[m
[31m-	       (refb->o==IR_HREF || refb->o==IR_HREFK || refb->o==IR_NEWREF));[m
[31m-    if (!irt_sametype(keya->t, keyb->t))[m
[31m-      return ALIAS_NO;  /* Different key types. */[m
[31m-  }[m
[31m-  if (ta == tb)[m
[31m-    return ALIAS_MAY;  /* Same table, cannot disambiguate keys. */[m
[31m-  else[m
[31m-    return aa_table(J, ta, tb);  /* Try to disambiguate tables. */[m
[31m-}[m
[31m-[m
[31m-/* Array and hash load forwarding. */[m
[31m-static TRef fwd_ahload(jit_State *J, IRRef xref)[m
[31m-{[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef lim = xref;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[fins->o+IRDELTA_L2S];[m
[31m-  while (ref > xref) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_ahref(J, xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:  lim = ref; goto cselim;  /* Limit search for load. */[m
[31m-    case ALIAS_MUST: return store->op2;  /* Store forwarding. */[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* No conflicting store (yet): const-fold loads from allocations. */[m
[31m-  {[m
[31m-    IRIns *ir = (xr->o == IR_HREFK || xr->o == IR_AREF) ? IR(xr->op1) : xr;[m
[31m-    IRRef tab = ir->op1;[m
[31m-    ir = IR(tab);[m
[31m-    if (ir->o == IR_TNEW || (ir->o == IR_TDUP && irref_isk(xr->op2))) {[m
[31m-      /* A NEWREF with a number key may end up pointing to the array part.[m
[31m-      ** But it's referenced from HSTORE and not found in the ASTORE chain.[m
[31m-      ** For now simply consider this a conflict without forwarding anything.[m
[31m-      */[m
[31m-      if (xr->o == IR_AREF) {[m
[31m-	IRRef ref2 = J->chain[IR_NEWREF];[m
[31m-	while (ref2 > tab) {[m
[31m-	  IRIns *newref = IR(ref2);[m
[31m-	  if (irt_isnum(IR(newref->op2)->t))[m
[31m-	    goto cselim;[m
[31m-	  ref2 = newref->prev;[m
[31m-	}[m
[31m-      }[m
[31m-      /* NEWREF inhibits CSE for HREF, and dependent FLOADs from HREFK/AREF.[m
[31m-      ** But the above search for conflicting stores was limited by xref.[m
[31m-      ** So continue searching, limited by the TNEW/TDUP. Store forwarding[m
[31m-      ** is ok, too. A conflict does NOT limit the search for a matching load.[m
[31m-      */[m
[31m-      while (ref > tab) {[m
[31m-	IRIns *store = IR(ref);[m
[31m-	switch (aa_ahref(J, xr, IR(store->op1))) {[m
[31m-	case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-	case ALIAS_MAY:  goto cselim;  /* Conflicting store. */[m
[31m-	case ALIAS_MUST: return store->op2;  /* Store forwarding. */[m
[31m-	}[m
[31m-	ref = store->prev;[m
[31m-      }[m
[31m-      lua_assert(ir->o != IR_TNEW || irt_isnil(fins->t));[m
[31m-      if (irt_ispri(fins->t)) {[m
[31m-	return TREF_PRI(irt_type(fins->t));[m
[31m-      } else if (irt_isnum(fins->t) || (LJ_DUALNUM && irt_isint(fins->t)) ||[m
[31m-		 irt_isstr(fins->t)) {[m
[31m-	TValue keyv;[m
[31m-	cTValue *tv;[m
[31m-	IRIns *key = IR(xr->op2);[m
[31m-	if (key->o == IR_KSLOT) key = IR(key->op1);[m
[31m-	lj_ir_kvalue(J->L, &keyv, key);[m
[31m-	tv = lj_tab_get(J->L, ir_ktab(IR(ir->op1)), &keyv);[m
[31m-	lua_assert(itype2irt(tv) == irt_type(fins->t));[m
[31m-	if (irt_isnum(fins->t))[m
[31m-	  return lj_ir_knum_u64(J, tv->u64);[m
[31m-	else if (LJ_DUALNUM && irt_isint(fins->t))[m
[31m-	  return lj_ir_kint(J, intV(tv));[m
[31m-	else[m
[31m-	  return lj_ir_kstr(J, strV(tv));[m
[31m-      }[m
[31m-      /* Othwerwise: don't intern as a constant. */[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-cselim:[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-  ref = J->chain[fins->o];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *load = IR(ref);[m
[31m-    if (load->op1 == xref)[m
[31m-      return ref;  /* Load forwarding. */[m
[31m-    ref = load->prev;[m
[31m-  }[m
[31m-  return 0;  /* Conflict or no match. */[m
[31m-}[m
[31m-[m
[31m-/* Reassociate ALOAD across PHIs to handle t[i-1] forwarding case. */[m
[31m-static TRef fwd_aload_reassoc(jit_State *J)[m
[31m-{[m
[31m-  IRIns *irx = IR(fins->op1);[m
[31m-  IRIns *key = IR(irx->op2);[m
[31m-  if (key->o == IR_ADD && irref_isk(key->op2)) {[m
[31m-    IRIns *add2 = IR(key->op1);[m
[31m-    if (add2->o == IR_ADD && irref_isk(add2->op2) &&[m
[31m-	IR(key->op2)->i == -IR(add2->op2)->i) {[m
[31m-      IRRef ref = J->chain[IR_AREF];[m
[31m-      IRRef lim = add2->op1;[m
[31m-      if (irx->op1 > lim) lim = irx->op1;[m
[31m-      while (ref > lim) {[m
[31m-	IRIns *ir = IR(ref);[m
[31m-	if (ir->op1 == irx->op1 && ir->op2 == add2->op1)[m
[31m-	  return fwd_ahload(J, ref);[m
[31m-	ref = ir->prev;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ALOAD forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_aload(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref;[m
[31m-  if ((ref = fwd_ahload(J, fins->op1)) ||[m
[31m-      (ref = fwd_aload_reassoc(J)))[m
[31m-    return ref;[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* HLOAD forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_hload(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref = fwd_ahload(J, fins->op1);[m
[31m-  if (ref)[m
[31m-    return ref;[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* HREFK forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J)[m
[31m-{[m
[31m-  IRRef tab = fleft->op1;[m
[31m-  IRRef ref = J->chain[IR_NEWREF];[m
[31m-  while (ref > tab) {[m
[31m-    IRIns *newref = IR(ref);[m
[31m-    if (tab == newref->op1) {[m
[31m-      if (fright->op1 == newref->op2)[m
[31m-	return ref;  /* Forward from NEWREF. */[m
[31m-      else[m
[31m-	goto docse;[m
[31m-    } else if (aa_table(J, tab, newref->op1) != ALIAS_NO) {[m
[31m-      goto docse;[m
[31m-    }[m
[31m-    ref = newref->prev;[m
[31m-  }[m
[31m-  /* No conflicting NEWREF: key location unchanged for HREFK of TDUP. */[m
[31m-  if (IR(tab)->o == IR_TDUP)[m
[31m-    fins->t.irt &= ~IRT_GUARD;  /* Drop HREFK guard. */[m
[31m-docse:[m
[31m-  return CSEFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Check whether HREF of TNEW/TDUP can be folded to niltv. */[m
[31m-int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J)[m
[31m-{[m
[31m-  IRRef lim = fins->op1;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* The key for an ASTORE may end up in the hash part after a NEWREF. */[m
[31m-  if (irt_isnum(fright->t) && J->chain[IR_NEWREF] > lim) {[m
[31m-    ref = J->chain[IR_ASTORE];[m
[31m-    while (ref > lim) {[m
[31m-      if (ref < J->chain[IR_NEWREF])[m
[31m-	return 0;  /* Conflict. */[m
[31m-      ref = IR(ref)->prev;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[IR_HSTORE];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    if (aa_ahref(J, fins, IR(store->op1)) != ALIAS_NO)[m
[31m-      return 0;  /* Conflict. */[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  return 1;  /* No conflict. Can fold to niltv. */[m
[31m-}[m
[31m-[m
[31m-/* Check whether there's no aliasing table.clear. */[m
[31m-static int fwd_aa_tab_clear(jit_State *J, IRRef lim, IRRef ta)[m
[31m-{[m
[31m-  IRRef ref = J->chain[IR_CALLS];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *calls = IR(ref);[m
[31m-    if (calls->op2 == IRCALL_lj_tab_clear &&[m
[31m-	(ta == calls->op1 || aa_table(J, ta, calls->op1) != ALIAS_NO))[m
[31m-      return 0;  /* Conflict. */[m
[31m-    ref = calls->prev;[m
[31m-  }[m
[31m-  return 1;  /* No conflict. Can safely FOLD/CSE. */[m
[31m-}[m
[31m-[m
[31m-/* Check whether there's no aliasing NEWREF/table.clear for the left operand. */[m
[31m-int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim)[m
[31m-{[m
[31m-  IRRef ta = fins->op1;[m
[31m-  IRRef ref = J->chain[IR_NEWREF];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *newref = IR(ref);[m
[31m-    if (ta == newref->op1 || aa_table(J, ta, newref->op1) != ALIAS_NO)[m
[31m-      return 0;  /* Conflict. */[m
[31m-    ref = newref->prev;[m
[31m-  }[m
[31m-  return fwd_aa_tab_clear(J, lim, ta);[m
[31m-}[m
[31m-[m
[31m-/* ASTORE/HSTORE elimination. */[m
[31m-TRef LJ_FASTCALL lj_opt_dse_ahstore(jit_State *J)[m
[31m-{[m
[31m-  IRRef xref = fins->op1;  /* xREF reference. */[m
[31m-  IRRef val = fins->op2;  /* Stored value reference. */[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef1 *refp = &J->chain[fins->o];[m
[31m-  IRRef ref = *refp;[m
[31m-  while (ref > xref) {  /* Search for redundant or conflicting stores. */[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_ahref(J, xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:[m
[31m-      break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:	/* Store to MAYBE the same location. */[m
[31m-      if (store->op2 != val)  /* Conflict if the value is different. */[m
[31m-	goto doemit;[m
[31m-      break;  /* Otherwise continue searching. */[m
[31m-    case ALIAS_MUST:	/* Store to the same location. */[m
[31m-      if (store->op2 == val)  /* Same value: drop the new store. */[m
[31m-	return DROPFOLD;[m
[31m-      /* Different value: try to eliminate the redundant store. */[m
[31m-      if (ref > J->chain[IR_LOOP]) {  /* Quick check to avoid crossing LOOP. */[m
[31m-	IRIns *ir;[m
[31m-	/* Check for any intervening guards (includes conflicting loads). */[m
[31m-	for (ir = IR(J->cur.nins-1); ir > store; ir--)[m
[31m-	  if (irt_isguard(ir->t) || ir->o == IR_CALLL)[m
[31m-	    goto doemit;  /* No elimination possible. */[m
[31m-	/* Remove redundant store from chain and replace with NOP. */[m
[31m-	*refp = store->prev;[m
[31m-	store->o = IR_NOP;[m
[31m-	store->t.irt = IRT_NIL;[m
[31m-	store->op1 = store->op2 = 0;[m
[31m-	store->prev = 0;[m
[31m-	/* Now emit the new store instead. */[m
[31m-      }[m
[31m-      goto doemit;[m
[31m-    }[m
[31m-    ref = *(refp = &store->prev);[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;  /* Otherwise we have a conflict or simply no match. */[m
[31m-}[m
[31m-[m
[31m-/* -- ULOAD forwarding ---------------------------------------------------- */[m
[31m-[m
[31m-/* The current alias analysis for upvalues is very simplistic. It only[m
[31m-** disambiguates between the unique upvalues of the same function.[m
[31m-** This is good enough for now, since most upvalues are read-only.[m
[31m-**[m
[31m-** A more precise analysis would be feasible with the help of the parser:[m
[31m-** generate a unique key for every upvalue, even across all prototypes.[m
[31m-** Lacking a realistic use-case, it's unclear whether this is beneficial.[m
[31m-*/[m
[31m-static AliasRet aa_uref(IRIns *refa, IRIns *refb)[m
[31m-{[m
[31m-  if (refa->o != refb->o)[m
[31m-    return ALIAS_NO;  /* Different UREFx type. */[m
[31m-  if (refa->op1 == refb->op1) {  /* Same function. */[m
[31m-    if (refa->op2 == refb->op2)[m
[31m-      return ALIAS_MUST;  /* Same function, same upvalue idx. */[m
[31m-    else[m
[31m-      return ALIAS_NO;  /* Same function, different upvalue idx. */[m
[31m-  } else {  /* Different functions, check disambiguation hash values. */[m
[31m-    if (((refa->op2 ^ refb->op2) & 0xff))[m
[31m-      return ALIAS_NO;  /* Upvalues with different hash values cannot alias. */[m
[31m-    else[m
[31m-      return ALIAS_MAY;  /* No conclusion can be drawn for same hash value. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* ULOAD forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J)[m
[31m-{[m
[31m-  IRRef uref = fins->op1;[m
[31m-  IRRef lim = REF_BASE;  /* Search limit. */[m
[31m-  IRIns *xr = IR(uref);[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[IR_USTORE];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_uref(xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:  lim = ref; goto cselim;  /* Limit search for load. */[m
[31m-    case ALIAS_MUST: return store->op2;  /* Store forwarding. */[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-cselim:[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-[m
[31m-  ref = J->chain[IR_ULOAD];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (ir->op1 == uref ||[m
[31m-	(IR(ir->op1)->op12 == IR(uref)->op12 && IR(ir->op1)->o == IR(uref)->o))[m
[31m-      return ref;  /* Match for identical or equal UREFx (non-CSEable UREFO). */[m
[31m-    ref = ir->prev;[m
[31m-  }[m
[31m-  return lj_ir_emit(J);[m
[31m-}[m
[31m-[m
[31m-/* USTORE elimination. */[m
[31m-TRef LJ_FASTCALL lj_opt_dse_ustore(jit_State *J)[m
[31m-{[m
[31m-  IRRef xref = fins->op1;  /* xREF reference. */[m
[31m-  IRRef val = fins->op2;  /* Stored value reference. */[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef1 *refp = &J->chain[IR_USTORE];[m
[31m-  IRRef ref = *refp;[m
[31m-  while (ref > xref) {  /* Search for redundant or conflicting stores. */[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_uref(xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:[m
[31m-      break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:	/* Store to MAYBE the same location. */[m
[31m-      if (store->op2 != val)  /* Conflict if the value is different. */[m
[31m-	goto doemit;[m
[31m-      break;  /* Otherwise continue searching. */[m
[31m-    case ALIAS_MUST:	/* Store to the same location. */[m
[31m-      if (store->op2 == val)  /* Same value: drop the new store. */[m
[31m-	return DROPFOLD;[m
[31m-      /* Different value: try to eliminate the redundant store. */[m
[31m-      if (ref > J->chain[IR_LOOP]) {  /* Quick check to avoid crossing LOOP. */[m
[31m-	IRIns *ir;[m
[31m-	/* Check for any intervening guards (includes conflicting loads). */[m
[31m-	for (ir = IR(J->cur.nins-1); ir > store; ir--)[m
[31m-	  if (irt_isguard(ir->t))[m
[31m-	    goto doemit;  /* No elimination possible. */[m
[31m-	/* Remove redundant store from chain and replace with NOP. */[m
[31m-	*refp = store->prev;[m
[31m-	store->o = IR_NOP;[m
[31m-	store->t.irt = IRT_NIL;[m
[31m-	store->op1 = store->op2 = 0;[m
[31m-	store->prev = 0;[m
[31m-	if (ref+1 < J->cur.nins &&[m
[31m-	    store[1].o == IR_OBAR && store[1].op1 == xref) {[m
[31m-	  IRRef1 *bp = &J->chain[IR_OBAR];[m
[31m-	  IRIns *obar;[m
[31m-	  for (obar = IR(*bp); *bp > ref+1; obar = IR(*bp))[m
[31m-	    bp = &obar->prev;[m
[31m-	  /* Remove OBAR, too. */[m
[31m-	  *bp = obar->prev;[m
[31m-	  obar->o = IR_NOP;[m
[31m-	  obar->t.irt = IRT_NIL;[m
[31m-	  obar->op1 = obar->op2 = 0;[m
[31m-	  obar->prev = 0;[m
[31m-	}[m
[31m-	/* Now emit the new store instead. */[m
[31m-      }[m
[31m-      goto doemit;[m
[31m-    }[m
[31m-    ref = *(refp = &store->prev);[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;  /* Otherwise we have a conflict or simply no match. */[m
[31m-}[m
[31m-[m
[31m-/* -- FLOAD forwarding and FSTORE elimination ----------------------------- */[m
[31m-[m
[31m-/* Alias analysis for field access.[m
[31m-** Field loads are cheap and field stores are rare.[m
[31m-** Simple disambiguation based on field types is good enough.[m
[31m-*/[m
[31m-static AliasRet aa_fref(jit_State *J, IRIns *refa, IRIns *refb)[m
[31m-{[m
[31m-  if (refa->op2 != refb->op2)[m
[31m-    return ALIAS_NO;  /* Different fields. */[m
[31m-  if (refa->op1 == refb->op1)[m
[31m-    return ALIAS_MUST;  /* Same field, same object. */[m
[31m-  else if (refa->op2 >= IRFL_TAB_META && refa->op2 <= IRFL_TAB_NOMM)[m
[31m-    return aa_table(J, refa->op1, refb->op1);  /* Disambiguate tables. */[m
[31m-  else[m
[31m-    return ALIAS_MAY;  /* Same field, possibly different object. */[m
[31m-}[m
[31m-[m
[31m-/* Only the loads for mutable fields end up here (see FOLD). */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J)[m
[31m-{[m
[31m-  IRRef oref = fins->op1;  /* Object reference. */[m
[31m-  IRRef fid = fins->op2;  /* Field ID. */[m
[31m-  IRRef lim = oref;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[IR_FSTORE];[m
[31m-  while (ref > oref) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_fref(J, fins, IR(store->op1))) {[m
[31m-    case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:  lim = ref; goto cselim;  /* Limit search for load. */[m
[31m-    case ALIAS_MUST: return store->op2;  /* Store forwarding. */[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* No conflicting store: const-fold field loads from allocations. */[m
[31m-  if (fid == IRFL_TAB_META) {[m
[31m-    IRIns *ir = IR(oref);[m
[31m-    if (ir->o == IR_TNEW || ir->o == IR_TDUP)[m
[31m-      return lj_ir_knull(J, IRT_TAB);[m
[31m-  }[m
[31m-[m
[31m-cselim:[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-  return lj_opt_cselim(J, lim);[m
[31m-}[m
[31m-[m
[31m-/* FSTORE elimination. */[m
[31m-TRef LJ_FASTCALL lj_opt_dse_fstore(jit_State *J)[m
[31m-{[m
[31m-  IRRef fref = fins->op1;  /* FREF reference. */[m
[31m-  IRRef val = fins->op2;  /* Stored value reference. */[m
[31m-  IRIns *xr = IR(fref);[m
[31m-  IRRef1 *refp = &J->chain[IR_FSTORE];[m
[31m-  IRRef ref = *refp;[m
[31m-  while (ref > fref) {  /* Search for redundant or conflicting stores. */[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_fref(J, xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:[m
[31m-      break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:[m
[31m-      if (store->op2 != val)  /* Conflict if the value is different. */[m
[31m-	goto doemit;[m
[31m-      break;  /* Otherwise continue searching. */[m
[31m-    case ALIAS_MUST:[m
[31m-      if (store->op2 == val)  /* Same value: drop the new store. */[m
[31m-	return DROPFOLD;[m
[31m-      /* Different value: try to eliminate the redundant store. */[m
[31m-      if (ref > J->chain[IR_LOOP]) {  /* Quick check to avoid crossing LOOP. */[m
[31m-	IRIns *ir;[m
[31m-	/* Check for any intervening guards or conflicting loads. */[m
[31m-	for (ir = IR(J->cur.nins-1); ir > store; ir--)[m
[31m-	  if (irt_isguard(ir->t) || (ir->o == IR_FLOAD && ir->op2 == xr->op2))[m
[31m-	    goto doemit;  /* No elimination possible. */[m
[31m-	/* Remove redundant store from chain and replace with NOP. */[m
[31m-	*refp = store->prev;[m
[31m-	store->o = IR_NOP;[m
[31m-	store->t.irt = IRT_NIL;[m
[31m-	store->op1 = store->op2 = 0;[m
[31m-	store->prev = 0;[m
[31m-	/* Now emit the new store instead. */[m
[31m-      }[m
[31m-      goto doemit;[m
[31m-    }[m
[31m-    ref = *(refp = &store->prev);[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;  /* Otherwise we have a conflict or simply no match. */[m
[31m-}[m
[31m-[m
[31m-/* -- XLOAD forwarding and XSTORE elimination ----------------------------- */[m
[31m-[m
[31m-/* Find cdata allocation for a reference (if any). */[m
[31m-static IRIns *aa_findcnew(jit_State *J, IRIns *ir)[m
[31m-{[m
[31m-  while (ir->o == IR_ADD) {[m
[31m-    if (!irref_isk(ir->op1)) {[m
[31m-      IRIns *ir1 = aa_findcnew(J, IR(ir->op1));  /* Left-recursion. */[m
[31m-      if (ir1) return ir1;[m
[31m-    }[m
[31m-    if (irref_isk(ir->op2)) return NULL;[m
[31m-    ir = IR(ir->op2);  /* Flatten right-recursion. */[m
[31m-  }[m
[31m-  return ir->o == IR_CNEW ? ir : NULL;[m
[31m-}[m
[31m-[m
[31m-/* Alias analysis for two cdata allocations. */[m
[31m-static AliasRet aa_cnew(jit_State *J, IRIns *refa, IRIns *refb)[m
[31m-{[m
[31m-  IRIns *cnewa = aa_findcnew(J, refa);[m
[31m-  IRIns *cnewb = aa_findcnew(J, refb);[m
[31m-  if (cnewa == cnewb)[m
[31m-    return ALIAS_MAY;  /* Same allocation or neither is an allocation. */[m
[31m-  if (cnewa && cnewb)[m
[31m-    return ALIAS_NO;  /* Two different allocations never alias. */[m
[31m-  if (cnewb) { cnewa = cnewb; refb = refa; }[m
[31m-  return aa_escape(J, cnewa, refb);[m
[31m-}[m
[31m-[m
[31m-/* Alias analysis for XLOAD/XSTORE. */[m
[31m-static AliasRet aa_xref(jit_State *J, IRIns *refa, IRIns *xa, IRIns *xb)[m
[31m-{[m
[31m-  ptrdiff_t ofsa = 0, ofsb = 0;[m
[31m-  IRIns *refb = IR(xb->op1);[m
[31m-  IRIns *basea = refa, *baseb = refb;[m
[31m-  if (refa == refb && irt_sametype(xa->t, xb->t))[m
[31m-    return ALIAS_MUST;  /* Shortcut for same refs with identical type. */[m
[31m-  /* Offset-based disambiguation. */[m
[31m-  if (refa->o == IR_ADD && irref_isk(refa->op2)) {[m
[31m-    IRIns *irk = IR(refa->op2);[m
[31m-    basea = IR(refa->op1);[m
[31m-    ofsa = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 :[m
[31m-					    (ptrdiff_t)irk->i;[m
[31m-  }[m
[31m-  if (refb->o == IR_ADD && irref_isk(refb->op2)) {[m
[31m-    IRIns *irk = IR(refb->op2);[m
[31m-    baseb = IR(refb->op1);[m
[31m-    ofsb = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 :[m
[31m-					    (ptrdiff_t)irk->i;[m
[31m-  }[m
[31m-  /* Treat constified pointers like base vs. base+offset. */[m
[31m-  if (basea->o == IR_KPTR && baseb->o == IR_KPTR) {[m
[31m-    ofsb += (char *)ir_kptr(baseb) - (char *)ir_kptr(basea);[m
[31m-    baseb = basea;[m
[31m-  }[m
[31m-  /* This implements (very) strict aliasing rules.[m
[31m-  ** Different types do NOT alias, except for differences in signedness.[m
[31m-  ** Type punning through unions is allowed (but forces a reload).[m
[31m-  */[m
[31m-  if (basea == baseb) {[m
[31m-    ptrdiff_t sza = irt_size(xa->t), szb = irt_size(xb->t);[m
[31m-    if (ofsa == ofsb) {[m
[31m-      if (sza == szb && irt_isfp(xa->t) == irt_isfp(xb->t))[m
[31m-	return ALIAS_MUST;  /* Same-sized, same-kind. May need to convert. */[m
[31m-    } else if (ofsa + sza <= ofsb || ofsb + szb <= ofsa) {[m
[31m-      return ALIAS_NO;  /* Non-overlapping base+-o1 vs. base+-o2. */[m
[31m-    }[m
[31m-    /* NYI: extract, extend or reinterpret bits (int <-> fp). */[m
[31m-    return ALIAS_MAY;  /* Overlapping or type punning: force reload. */[m
[31m-  }[m
[31m-  if (!irt_sametype(xa->t, xb->t) &&[m
[31m-      !(irt_typerange(xa->t, IRT_I8, IRT_U64) &&[m
[31m-	((xa->t.irt - IRT_I8) ^ (xb->t.irt - IRT_I8)) == 1))[m
[31m-    return ALIAS_NO;[m
[31m-  /* NYI: structural disambiguation. */[m
[31m-  return aa_cnew(J, basea, baseb);  /* Try to disambiguate allocations. */[m
[31m-}[m
[31m-[m
[31m-/* Return CSEd reference or 0. Caveat: swaps lower ref to the right! */[m
[31m-static IRRef reassoc_trycse(jit_State *J, IROp op, IRRef op1, IRRef op2)[m
[31m-{[m
[31m-  IRRef ref = J->chain[op];[m
[31m-  IRRef lim = op1;[m
[31m-  if (op2 > lim) { lim = op2; op2 = op1; op1 = lim; }[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (ir->op1 == op1 && ir->op2 == op2)[m
[31m-      return ref;[m
[31m-    ref = ir->prev;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Reassociate index references. */[m
[31m-static IRRef reassoc_xref(jit_State *J, IRIns *ir)[m
[31m-{[m
[31m-  ptrdiff_t ofs = 0;[m
[31m-  if (ir->o == IR_ADD && irref_isk(ir->op2)) {  /* Get constant offset. */[m
[31m-    IRIns *irk = IR(ir->op2);[m
[31m-    ofs = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 :[m
[31m-					   (ptrdiff_t)irk->i;[m
[31m-    ir = IR(ir->op1);[m
[31m-  }[m
[31m-  if (ir->o == IR_ADD) {  /* Add of base + index. */[m
[31m-    /* Index ref > base ref for loop-carried dependences. Only check op1. */[m
[31m-    IRIns *ir2, *ir1 = IR(ir->op1);[m
[31m-    int32_t shift = 0;[m
[31m-    IRRef idxref;[m
[31m-    /* Determine index shifts. Don't bother with IR_MUL here. */[m
[31m-    if (ir1->o == IR_BSHL && irref_isk(ir1->op2))[m
[31m-      shift = IR(ir1->op2)->i;[m
[31m-    else if (ir1->o == IR_ADD && ir1->op1 == ir1->op2)[m
[31m-      shift = 1;[m
[31m-    else[m
[31m-      ir1 = ir;[m
[31m-    ir2 = IR(ir1->op1);[m
[31m-    /* A non-reassociated add. Must be a loop-carried dependence. */[m
[31m-    if (ir2->o == IR_ADD && irt_isint(ir2->t) && irref_isk(ir2->op2))[m
[31m-      ofs += (ptrdiff_t)IR(ir2->op2)->i << shift;[m
[31m-    else[m
[31m-      return 0;[m
[31m-    idxref = ir2->op1;[m
[31m-    /* Try to CSE the reassociated chain. Give up if not found. */[m
[31m-    if (ir1 != ir &&[m
[31m-	!(idxref = reassoc_trycse(J, ir1->o, idxref,[m
[31m-				  ir1->o == IR_BSHL ? ir1->op2 : idxref)))[m
[31m-      return 0;[m
[31m-    if (!(idxref = reassoc_trycse(J, IR_ADD, idxref, ir->op2)))[m
[31m-      return 0;[m
[31m-    if (ofs != 0) {[m
[31m-      IRRef refk = tref_ref(lj_ir_kintp(J, ofs));[m
[31m-      if (!(idxref = reassoc_trycse(J, IR_ADD, idxref, refk)))[m
[31m-	return 0;[m
[31m-    }[m
[31m-    return idxref;  /* Success, found a reassociated index reference. Phew. */[m
[31m-  }[m
[31m-  return 0;  /* Failure. */[m
[31m-}[m
[31m-[m
[31m-/* XLOAD forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J)[m
[31m-{[m
[31m-  IRRef xref = fins->op1;[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef lim = xref;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  if ((fins->op2 & IRXLOAD_READONLY))[m
[31m-    goto cselim;[m
[31m-  if ((fins->op2 & IRXLOAD_VOLATILE))[m
[31m-    goto doemit;[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[IR_XSTORE];[m
[31m-retry:[m
[31m-  if (J->chain[IR_CALLXS] > lim) lim = J->chain[IR_CALLXS];[m
[31m-  if (J->chain[IR_XBAR] > lim) lim = J->chain[IR_XBAR];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_xref(J, xr, fins, store)) {[m
[31m-    case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:  lim = ref; goto cselim;  /* Limit search for load. */[m
[31m-    case ALIAS_MUST:[m
[31m-      /* Emit conversion if the loaded type doesn't match the forwarded type. */[m
[31m-      if (!irt_sametype(fins->t, IR(store->op2)->t)) {[m
[31m-	IRType dt = irt_type(fins->t), st = irt_type(IR(store->op2)->t);[m
[31m-	if (dt == IRT_I8 || dt == IRT_I16) {  /* Trunc + sign-extend. */[m
[31m-	  st = dt | IRCONV_SEXT;[m
[31m-	  dt = IRT_INT;[m
[31m-	} else if (dt == IRT_U8 || dt == IRT_U16) {  /* Trunc + zero-extend. */[m
[31m-	  st = dt;[m
[31m-	  dt = IRT_INT;[m
[31m-	}[m
[31m-	fins->ot = IRT(IR_CONV, dt);[m
[31m-	fins->op1 = store->op2;[m
[31m-	fins->op2 = (dt<<5)|st;[m
[31m-	return RETRYFOLD;[m
[31m-      }[m
[31m-      return store->op2;  /* Store forwarding. */[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-cselim:[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-  ref = J->chain[IR_XLOAD];[m
[31m-  while (ref > lim) {[m
[31m-    /* CSE for XLOAD depends on the type, but not on the IRXLOAD_* flags. */[m
[31m-    if (IR(ref)->op1 == xref && irt_sametype(IR(ref)->t, fins->t))[m
[31m-      return ref;[m
[31m-    ref = IR(ref)->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* Reassociate XLOAD across PHIs to handle a[i-1] forwarding case. */[m
[31m-  if (!(fins->op2 & IRXLOAD_READONLY) && J->chain[IR_LOOP] &&[m
[31m-      xref == fins->op1 && (xref = reassoc_xref(J, xr)) != 0) {[m
[31m-    ref = J->chain[IR_XSTORE];[m
[31m-    while (ref > lim)  /* Skip stores that have already been checked. */[m
[31m-      ref = IR(ref)->prev;[m
[31m-    lim = xref;[m
[31m-    xr = IR(xref);[m
[31m-    goto retry;  /* Retry with the reassociated reference. */[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* XSTORE elimination. */[m
[31m-TRef LJ_FASTCALL lj_opt_dse_xstore(jit_State *J)[m
[31m-{[m
[31m-  IRRef xref = fins->op1;[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef lim = xref;  /* Search limit. */[m
[31m-  IRRef val = fins->op2;  /* Stored value reference. */[m
[31m-  IRRef1 *refp = &J->chain[IR_XSTORE];[m
[31m-  IRRef ref = *refp;[m
[31m-  if (J->chain[IR_CALLXS] > lim) lim = J->chain[IR_CALLXS];[m
[31m-  if (J->chain[IR_XBAR] > lim) lim = J->chain[IR_XBAR];[m
[31m-  if (J->chain[IR_XSNEW] > lim) lim = J->chain[IR_XSNEW];[m
[31m-  while (ref > lim) {  /* Search for redundant or conflicting stores. */[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_xref(J, xr, fins, store)) {[m
[31m-    case ALIAS_NO:[m
[31m-      break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:[m
[31m-      if (store->op2 != val)  /* Conflict if the value is different. */[m
[31m-	goto doemit;[m
[31m-      break;  /* Otherwise continue searching. */[m
[31m-    case ALIAS_MUST:[m
[31m-      if (store->op2 == val)  /* Same value: drop the new store. */[m
[31m-	return DROPFOLD;[m
[31m-      /* Different value: try to eliminate the redundant store. */[m
[31m-      if (ref > J->chain[IR_LOOP]) {  /* Quick check to avoid crossing LOOP. */[m
[31m-	IRIns *ir;[m
[31m-	/* Check for any intervening guards or any XLOADs (no AA performed). */[m
[31m-	for (ir = IR(J->cur.nins-1); ir > store; ir--)[m
[31m-	  if (irt_isguard(ir->t) || ir->o == IR_XLOAD)[m
[31m-	    goto doemit;  /* No elimination possible. */[m
[31m-	/* Remove redundant store from chain and replace with NOP. */[m
[31m-	*refp = store->prev;[m
[31m-	store->o = IR_NOP;[m
[31m-	store->t.irt = IRT_NIL;[m
[31m-	store->op1 = store->op2 = 0;[m
[31m-	store->prev = 0;[m
[31m-	/* Now emit the new store instead. */[m
[31m-      }[m
[31m-      goto doemit;[m
[31m-    }[m
[31m-    ref = *(refp = &store->prev);[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;  /* Otherwise we have a conflict or simply no match. */[m
[31m-}[m
[31m-[m
[31m-/* -- Forwarding of lj_tab_len -------------------------------------------- */[m
[31m-[m
[31m-/* This is rather simplistic right now, but better than nothing. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J)[m
[31m-{[m
[31m-  IRRef tab = fins->op1;  /* Table reference. */[m
[31m-  IRRef lim = tab;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* Any ASTORE is a conflict and limits the search. */[m
[31m-  if (J->chain[IR_ASTORE] > lim) lim = J->chain[IR_ASTORE];[m
[31m-[m
[31m-  /* Search for conflicting HSTORE with numeric key. */[m
[31m-  ref = J->chain[IR_HSTORE];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    IRIns *href = IR(store->op1);[m
[31m-    IRIns *key = IR(href->op2);[m
[31m-    if (irt_isnum(key->o == IR_KSLOT ? IR(key->op1)->t : key->t)) {[m
[31m-      lim = ref;  /* Conflicting store found, limits search for TLEN. */[m
[31m-      break;[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* Search for aliasing table.clear. */[m
[31m-  if (!fwd_aa_tab_clear(J, lim, tab))[m
[31m-    return lj_ir_emit(J);[m
[31m-[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-  return lj_opt_cselim(J, lim);[m
[31m-}[m
[31m-[m
[31m-/* -- ASTORE/HSTORE previous type analysis -------------------------------- */[m
[31m-[m
[31m-/* Check whether the previous value for a table store is non-nil.[m
[31m-** This can be derived either from a previous store or from a previous[m
[31m-** load (because all loads from tables perform a type check).[m
[31m-**[m
[31m-** The result of the analysis can be used to avoid the metatable check[m
[31m-** and the guard against HREF returning niltv. Both of these are cheap,[m
[31m-** so let's not spend too much effort on the analysis.[m
[31m-**[m
[31m-** A result of 1 is exact: previous value CANNOT be nil.[m
[31m-** A result of 0 is inexact: previous value MAY be nil.[m
[31m-*/[m
[31m-int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref)[m
[31m-{[m
[31m-  /* First check stores. */[m
[31m-  IRRef ref = J->chain[loadop+IRDELTA_L2S];[m
[31m-  while (ref > xref) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    if (store->op1 == xref) {  /* Same xREF. */[m
[31m-      /* A nil store MAY alias, but a non-nil store MUST alias. */[m
[31m-      return !irt_isnil(store->t);[m
[31m-    } else if (irt_isnil(store->t)) {  /* Must check any nil store. */[m
[31m-      IRRef skref = IR(store->op1)->op2;[m
[31m-      IRRef xkref = IR(xref)->op2;[m
[31m-      /* Same key type MAY alias. Need ALOAD check due to multiple int types. */[m
[31m-      if (loadop == IR_ALOAD || irt_sametype(IR(skref)->t, IR(xkref)->t)) {[m
[31m-	if (skref == xkref || !irref_isk(skref) || !irref_isk(xkref))[m
[31m-	  return 0;  /* A nil store with same const key or var key MAY alias. */[m
[31m-	/* Different const keys CANNOT alias. */[m
[31m-      }  /* Different key types CANNOT alias. */[m
[31m-    }  /* Other non-nil stores MAY alias. */[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* Check loads since nothing could be derived from stores. */[m
[31m-  ref = J->chain[loadop];[m
[31m-  while (ref > xref) {[m
[31m-    IRIns *load = IR(ref);[m
[31m-    if (load->op1 == xref) {  /* Same xREF. */[m
[31m-      /* A nil load MAY alias, but a non-nil load MUST alias. */[m
[31m-      return !irt_isnil(load->t);[m
[31m-    }  /* Other non-nil loads MAY alias. */[m
[31m-    ref = load->prev;[m
[31m-  }[m
[31m-  return 0;  /* Nothing derived at all, previous value MAY be nil. */[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#undef IR[m
[31m-#undef fins[m
[31m-#undef fleft[m
[31m-#undef fright[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow.c[m
[1mdeleted file mode 100644[m
[1mindex 36be66e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_narrow.c[m
[1m+++ /dev/null[m
[36m@@ -1,654 +0,0 @@[m
[31m-/*[m
[31m-** NARROW: Narrowing of numbers to integers (double to int32_t).[m
[31m-** STRIPOV: Stripping of overflow checks.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_narrow_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-[m
[31m-/* Rationale for narrowing optimizations:[m
[31m-**[m
[31m-** Lua has only a single number type and this is a FP double by default.[m
[31m-** Narrowing doubles to integers does not pay off for the interpreter on a[m
[31m-** current-generation x86/x64 machine. Most FP operations need the same[m
[31m-** amount of execution resources as their integer counterparts, except[m
[31m-** with slightly longer latencies. Longer latencies are a non-issue for[m
[31m-** the interpreter, since they are usually hidden by other overhead.[m
[31m-**[m
[31m-** The total CPU execution bandwidth is the sum of the bandwidth of the FP[m
[31m-** and the integer units, because they execute in parallel. The FP units[m
[31m-** have an equal or higher bandwidth than the integer units. Not using[m
[31m-** them means losing execution bandwidth. Moving work away from them to[m
[31m-** the already quite busy integer units is a losing proposition.[m
[31m-**[m
[31m-** The situation for JIT-compiled code is a bit different: the higher code[m
[31m-** density makes the extra latencies much more visible. Tight loops expose[m
[31m-** the latencies for updating the induction variables. Array indexing[m
[31m-** requires narrowing conversions with high latencies and additional[m
[31m-** guards (to check that the index is really an integer). And many common[m
[31m-** optimizations only work on integers.[m
[31m-**[m
[31m-** One solution would be speculative, eager narrowing of all number loads.[m
[31m-** This causes many problems, like losing -0 or the need to resolve type[m
[31m-** mismatches between traces. It also effectively forces the integer type[m
[31m-** to have overflow-checking semantics. This impedes many basic[m
[31m-** optimizations and requires adding overflow checks to all integer[m
[31m-** arithmetic operations (whereas FP arithmetics can do without).[m
[31m-**[m
[31m-** Always replacing an FP op with an integer op plus an overflow check is[m
[31m-** counter-productive on a current-generation super-scalar CPU. Although[m
[31m-** the overflow check branches are highly predictable, they will clog the[m
[31m-** execution port for the branch unit and tie up reorder buffers. This is[m
[31m-** turning a pure data-flow dependency into a different data-flow[m
[31m-** dependency (with slightly lower latency) *plus* a control dependency.[m
[31m-** In general, you don't want to do this since latencies due to data-flow[m
[31m-** dependencies can be well hidden by out-of-order execution.[m
[31m-**[m
[31m-** A better solution is to keep all numbers as FP values and only narrow[m
[31m-** when it's beneficial to do so. LuaJIT uses predictive narrowing for[m
[31m-** induction variables and demand-driven narrowing for index expressions,[m
[31m-** integer arguments and bit operations. Additionally it can eliminate or[m
[31m-** hoist most of the resulting overflow checks. Regular arithmetic[m
[31m-** computations are never narrowed to integers.[m
[31m-**[m
[31m-** The integer type in the IR has convenient wrap-around semantics and[m
[31m-** ignores overflow. Extra operations have been added for[m
[31m-** overflow-checking arithmetic (ADDOV/SUBOV) instead of an extra type.[m
[31m-** Apart from reducing overall complexity of the compiler, this also[m
[31m-** nicely solves the problem where you want to apply algebraic[m
[31m-** simplifications to ADD, but not to ADDOV. And the x86/x64 assembler can[m
[31m-** use lea instead of an add for integer ADD, but not for ADDOV (lea does[m
[31m-** not affect the flags, but it helps to avoid register moves).[m
[31m-**[m
[31m-**[m
[31m-** All of the above has to be reconsidered for architectures with slow FP[m
[31m-** operations or without a hardware FPU. The dual-number mode of LuaJIT[m
[31m-** addresses this issue. Arithmetic operations are performed on integers[m
[31m-** as far as possible and overflow checks are added as needed.[m
[31m-**[m
[31m-** This implies that narrowing for integer arguments and bit operations[m
[31m-** should also strip overflow checks, e.g. replace ADDOV with ADD. The[m
[31m-** original overflow guards are weak and can be eliminated by DCE, if[m
[31m-** there's no other use.[m
[31m-**[m
[31m-** A slight twist is that it's usually beneficial to use overflow-checked[m
[31m-** integer arithmetics if all inputs are already integers. This is the only[m
[31m-** change that affects the single-number mode, too.[m
[31m-*/[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-#define fins			(&J->fold.ins)[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-#define emitir_raw(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))[m
[31m-[m
[31m-/* -- Elimination of narrowing type conversions --------------------------- */[m
[31m-[m
[31m-/* Narrowing of index expressions and bit operations is demand-driven. The[m
[31m-** trace recorder emits a narrowing type conversion (CONV.int.num or TOBIT)[m
[31m-** in all of these cases (e.g. array indexing or string indexing). FOLD[m
[31m-** already takes care of eliminating simple redundant conversions like[m
[31m-** CONV.int.num(CONV.num.int(x)) ==> x.[m
[31m-**[m
[31m-** But the surrounding code is FP-heavy and arithmetic operations are[m
[31m-** performed on FP numbers (for the single-number mode). Consider a common[m
[31m-** example such as 'x=t[i+1]', with 'i' already an integer (due to induction[m
[31m-** variable narrowing). The index expression would be recorded as[m
[31m-**   CONV.int.num(ADD(CONV.num.int(i), 1))[m
[31m-** which is clearly suboptimal.[m
[31m-**[m
[31m-** One can do better by recursively backpropagating the narrowing type[m
[31m-** conversion across FP arithmetic operations. This turns FP ops into[m
[31m-** their corresponding integer counterparts. Depending on the semantics of[m
[31m-** the conversion they also need to check for overflow. Currently only ADD[m
[31m-** and SUB are supported.[m
[31m-**[m
[31m-** The above example can be rewritten as[m
[31m-**   ADDOV(CONV.int.num(CONV.num.int(i)), 1)[m
[31m-** and then into ADDOV(i, 1) after folding of the conversions. The original[m
[31m-** FP ops remain in the IR and are eliminated by DCE since all references to[m
[31m-** them are gone.[m
[31m-**[m
[31m-** [In dual-number mode the trace recorder already emits ADDOV etc., but[m
[31m-** this can be further reduced. See below.][m
[31m-**[m
[31m-** Special care has to be taken to avoid narrowing across an operation[m
[31m-** which is potentially operating on non-integral operands. One obvious[m
[31m-** case is when an expression contains a non-integral constant, but ends[m
[31m-** up as an integer index at runtime (like t[x+1.5] with x=0.5).[m
[31m-**[m
[31m-** Operations with two non-constant operands illustrate a similar problem[m
[31m-** (like t[a+b] with a=1.5 and b=2.5). Backpropagation has to stop there,[m
[31m-** unless it can be proven that either operand is integral (e.g. by CSEing[m
[31m-** a previous conversion). As a not-so-obvious corollary this logic also[m
[31m-** applies for a whole expression tree (e.g. t[(a+1)+(b+1)]).[m
[31m-**[m
[31m-** Correctness of the transformation is guaranteed by avoiding to expand[m
[31m-** the tree by adding more conversions than the one we would need to emit[m
[31m-** if not backpropagating. TOBIT employs a more optimistic rule, because[m
[31m-** the conversion has special semantics, designed to make the life of the[m
[31m-** compiler writer easier. ;-)[m
[31m-**[m
[31m-** Using on-the-fly backpropagation of an expression tree doesn't work[m
[31m-** because it's unknown whether the transform is correct until the end.[m
[31m-** This either requires IR rollback and cache invalidation for every[m
[31m-** subtree or a two-pass algorithm. The former didn't work out too well,[m
[31m-** so the code now combines a recursive collector with a stack-based[m
[31m-** emitter.[m
[31m-**[m
[31m-** [A recursive backpropagation algorithm with backtracking, employing[m
[31m-** skip-list lookup and round-robin caching, emitting stack operations[m
[31m-** on-the-fly for a stack-based interpreter -- and all of that in a meager[m
[31m-** kilobyte? Yep, compilers are a great treasure chest. Throw away your[m
[31m-** textbooks and read the codebase of a compiler today!][m
[31m-**[m
[31m-** There's another optimization opportunity for array indexing: it's[m
[31m-** always accompanied by an array bounds-check. The outermost overflow[m
[31m-** check may be delegated to the ABC operation. This works because ABC is[m
[31m-** an unsigned comparison and wrap-around due to overflow creates negative[m
[31m-** numbers.[m
[31m-**[m
[31m-** But this optimization is only valid for constants that cannot overflow[m
[31m-** an int32_t into the range of valid array indexes [0..2^27+1). A check[m
[31m-** for +-2^30 is safe since -2^31 - 2^30 wraps to 2^30 and 2^31-1 + 2^30[m
[31m-** wraps to -2^30-1.[m
[31m-**[m
[31m-** It's also good enough in practice, since e.g. t[i+1] or t[i-10] are[m
[31m-** quite common. So the above example finally ends up as ADD(i, 1)![m
[31m-**[m
[31m-** Later on, the assembler is able to fuse the whole array reference and[m
[31m-** the ADD into the memory operands of loads and other instructions. This[m
[31m-** is why LuaJIT is able to generate very pretty (and fast) machine code[m
[31m-** for array indexing. And that, my dear, concludes another story about[m
[31m-** one of the hidden secrets of LuaJIT ...[m
[31m-*/[m
[31m-[m
[31m-/* Maximum backpropagation depth and maximum stack size. */[m
[31m-#define NARROW_MAX_BACKPROP	100[m
[31m-#define NARROW_MAX_STACK	256[m
[31m-[m
[31m-/* The stack machine has a 32 bit instruction format: [IROpT | IRRef1][m
[31m-** The lower 16 bits hold a reference (or 0). The upper 16 bits hold[m
[31m-** the IR opcode + type or one of the following special opcodes:[m
[31m-*/[m
[31m-enum {[m
[31m-  NARROW_REF,		/* Push ref. */[m
[31m-  NARROW_CONV,		/* Push conversion of ref. */[m
[31m-  NARROW_SEXT,		/* Push sign-extension of ref. */[m
[31m-  NARROW_INT		/* Push KINT ref. The next code holds an int32_t. */[m
[31m-};[m
[31m-[m
[31m-typedef uint32_t NarrowIns;[m
[31m-[m
[31m-#define NARROWINS(op, ref)	(((op) << 16) + (ref))[m
[31m-#define narrow_op(ins)		((IROpT)((ins) >> 16))[m
[31m-#define narrow_ref(ins)		((IRRef1)(ins))[m
[31m-[m
[31m-/* Context used for narrowing of type conversions. */[m
[31m-typedef struct NarrowConv {[m
[31m-  jit_State *J;		/* JIT compiler state. */[m
[31m-  NarrowIns *sp;	/* Current stack pointer. */[m
[31m-  NarrowIns *maxsp;	/* Maximum stack pointer minus redzone. */[m
[31m-  IRRef mode;		/* Conversion mode (IRCONV_*). */[m
[31m-  IRType t;		/* Destination type: IRT_INT or IRT_I64. */[m
[31m-  NarrowIns stack[NARROW_MAX_STACK];  /* Stack holding stack-machine code. */[m
[31m-} NarrowConv;[m
[31m-[m
[31m-/* Lookup a reference in the backpropagation cache. */[m
[31m-static BPropEntry *narrow_bpc_get(jit_State *J, IRRef1 key, IRRef mode)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = 0; i < BPROP_SLOTS; i++) {[m
[31m-    BPropEntry *bp = &J->bpropcache[i];[m
[31m-    /* Stronger checks are ok, too. */[m
[31m-    if (bp->key == key && bp->mode >= mode &&[m
[31m-	((bp->mode ^ mode) & IRCONV_MODEMASK) == 0)[m
[31m-      return bp;[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Add an entry to the backpropagation cache. */[m
[31m-static void narrow_bpc_set(jit_State *J, IRRef1 key, IRRef1 val, IRRef mode)[m
[31m-{[m
[31m-  uint32_t slot = J->bpropslot;[m
[31m-  BPropEntry *bp = &J->bpropcache[slot];[m
[31m-  J->bpropslot = (slot + 1) & (BPROP_SLOTS-1);[m
[31m-  bp->key = key;[m
[31m-  bp->val = val;[m
[31m-  bp->mode = mode;[m
[31m-}[m
[31m-[m
[31m-/* Backpropagate overflow stripping. */[m
[31m-static void narrow_stripov_backprop(NarrowConv *nc, IRRef ref, int depth)[m
[31m-{[m
[31m-  jit_State *J = nc->J;[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_ADDOV || ir->o == IR_SUBOV ||[m
[31m-      (ir->o == IR_MULOV && (nc->mode & IRCONV_CONVMASK) == IRCONV_ANY)) {[m
[31m-    BPropEntry *bp = narrow_bpc_get(nc->J, ref, IRCONV_TOBIT);[m
[31m-    if (bp) {[m
[31m-      ref = bp->val;[m
[31m-    } else if (++depth < NARROW_MAX_BACKPROP && nc->sp < nc->maxsp) {[m
[31m-      NarrowIns *savesp = nc->sp;[m
[31m-      narrow_stripov_backprop(nc, ir->op1, depth);[m
[31m-      if (nc->sp < nc->maxsp) {[m
[31m-	narrow_stripov_backprop(nc, ir->op2, depth);[m
[31m-	if (nc->sp < nc->maxsp) {[m
[31m-	  *nc->sp++ = NARROWINS(IRT(ir->o - IR_ADDOV + IR_ADD, IRT_INT), ref);[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-      nc->sp = savesp;  /* Path too deep, need to backtrack. */[m
[31m-    }[m
[31m-  }[m
[31m-  *nc->sp++ = NARROWINS(NARROW_REF, ref);[m
[31m-}[m
[31m-[m
[31m-/* Backpropagate narrowing conversion. Return number of needed conversions. */[m
[31m-static int narrow_conv_backprop(NarrowConv *nc, IRRef ref, int depth)[m
[31m-{[m
[31m-  jit_State *J = nc->J;[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  IRRef cref;[m
[31m-[m
[31m-  if (nc->sp >= nc->maxsp) return 10;  /* Path too deep. */[m
[31m-[m
[31m-  /* Check the easy cases first. */[m
[31m-  if (ir->o == IR_CONV && (ir->op2 & IRCONV_SRCMASK) == IRT_INT) {[m
[31m-    if ((nc->mode & IRCONV_CONVMASK) <= IRCONV_ANY)[m
[31m-      narrow_stripov_backprop(nc, ir->op1, depth+1);[m
[31m-    else[m
[31m-      *nc->sp++ = NARROWINS(NARROW_REF, ir->op1);  /* Undo conversion. */[m
[31m-    if (nc->t == IRT_I64)[m
[31m-      *nc->sp++ = NARROWINS(NARROW_SEXT, 0);  /* Sign-extend integer. */[m
[31m-    return 0;[m
[31m-  } else if (ir->o == IR_KNUM) {  /* Narrow FP constant. */[m
[31m-    lua_Number n = ir_knum(ir)->n;[m
[31m-    if ((nc->mode & IRCONV_CONVMASK) == IRCONV_TOBIT) {[m
[31m-      /* Allows a wider range of constants. */[m
[31m-      int64_t k64 = (int64_t)n;[m
[31m-      if (n == (lua_Number)k64) {  /* Only if const doesn't lose precision. */[m
[31m-	*nc->sp++ = NARROWINS(NARROW_INT, 0);[m
[31m-	*nc->sp++ = (NarrowIns)k64;  /* But always truncate to 32 bits. */[m
[31m-	return 0;[m
[31m-      }[m
[31m-    } else {[m
[31m-      int32_t k = lj_num2int(n);[m
[31m-      /* Only if constant is a small integer. */[m
[31m-      if (checki16(k) && n == (lua_Number)k) {[m
[31m-	*nc->sp++ = NARROWINS(NARROW_INT, 0);[m
[31m-	*nc->sp++ = (NarrowIns)k;[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    return 10;  /* Never narrow other FP constants (this is rare). */[m
[31m-  }[m
[31m-[m
[31m-  /* Try to CSE the conversion. Stronger checks are ok, too. */[m
[31m-  cref = J->chain[fins->o];[m
[31m-  while (cref > ref) {[m
[31m-    IRIns *cr = IR(cref);[m
[31m-    if (cr->op1 == ref &&[m
[31m-	(fins->o == IR_TOBIT ||[m
[31m-	 ((cr->op2 & IRCONV_MODEMASK) == (nc->mode & IRCONV_MODEMASK) &&[m
[31m-	  irt_isguard(cr->t) >= irt_isguard(fins->t)))) {[m
[31m-      *nc->sp++ = NARROWINS(NARROW_REF, cref);[m
[31m-      return 0;  /* Already there, no additional conversion needed. */[m
[31m-    }[m
[31m-    cref = cr->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* Backpropagate across ADD/SUB. */[m
[31m-  if (ir->o == IR_ADD || ir->o == IR_SUB) {[m
[31m-    /* Try cache lookup first. */[m
[31m-    IRRef mode = nc->mode;[m
[31m-    BPropEntry *bp;[m
[31m-    /* Inner conversions need a stronger check. */[m
[31m-    if ((mode & IRCONV_CONVMASK) == IRCONV_INDEX && depth > 0)[m
[31m-      mode += IRCONV_CHECK-IRCONV_INDEX;[m
[31m-    bp = narrow_bpc_get(nc->J, (IRRef1)ref, mode);[m
[31m-    if (bp) {[m
[31m-      *nc->sp++ = NARROWINS(NARROW_REF, bp->val);[m
[31m-      return 0;[m
[31m-    } else if (nc->t == IRT_I64) {[m
[31m-      /* Try sign-extending from an existing (checked) conversion to int. */[m
[31m-      mode = (IRT_INT<<5)|IRT_NUM|IRCONV_INDEX;[m
[31m-      bp = narrow_bpc_get(nc->J, (IRRef1)ref, mode);[m
[31m-      if (bp) {[m
[31m-	*nc->sp++ = NARROWINS(NARROW_REF, bp->val);[m
[31m-	*nc->sp++ = NARROWINS(NARROW_SEXT, 0);[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    if (++depth < NARROW_MAX_BACKPROP && nc->sp < nc->maxsp) {[m
[31m-      NarrowIns *savesp = nc->sp;[m
[31m-      int count = narrow_conv_backprop(nc, ir->op1, depth);[m
[31m-      count += narrow_conv_backprop(nc, ir->op2, depth);[m
[31m-      if (count <= 1) {  /* Limit total number of conversions. */[m
[31m-	*nc->sp++ = NARROWINS(IRT(ir->o, nc->t), ref);[m
[31m-	return count;[m
[31m-      }[m
[31m-      nc->sp = savesp;  /* Too many conversions, need to backtrack. */[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Otherwise add a conversion. */[m
[31m-  *nc->sp++ = NARROWINS(NARROW_CONV, ref);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Emit the conversions collected during backpropagation. */[m
[31m-static IRRef narrow_conv_emit(jit_State *J, NarrowConv *nc)[m
[31m-{[m
[31m-  /* The fins fields must be saved now -- emitir() overwrites them. */[m
[31m-  IROpT guardot = irt_isguard(fins->t) ? IRTG(IR_ADDOV-IR_ADD, 0) : 0;[m
[31m-  IROpT convot = fins->ot;[m
[31m-  IRRef1 convop2 = fins->op2;[m
[31m-  NarrowIns *next = nc->stack;  /* List of instructions from backpropagation. */[m
[31m-  NarrowIns *last = nc->sp;[m
[31m-  NarrowIns *sp = nc->stack;  /* Recycle the stack to store operands. */[m
[31m-  while (next < last) {  /* Simple stack machine to process the ins. list. */[m
[31m-    NarrowIns ref = *next++;[m
[31m-    IROpT op = narrow_op(ref);[m
[31m-    if (op == NARROW_REF) {[m
[31m-      *sp++ = ref;[m
[31m-    } else if (op == NARROW_CONV) {[m
[31m-      *sp++ = emitir_raw(convot, ref, convop2);  /* Raw emit avoids a loop. */[m
[31m-    } else if (op == NARROW_SEXT) {[m
[31m-      lua_assert(sp >= nc->stack+1);[m
[31m-      sp[-1] = emitir(IRT(IR_CONV, IRT_I64), sp[-1],[m
[31m-		      (IRT_I64<<5)|IRT_INT|IRCONV_SEXT);[m
[31m-    } else if (op == NARROW_INT) {[m
[31m-      lua_assert(next < last);[m
[31m-      *sp++ = nc->t == IRT_I64 ?[m
[31m-	      lj_ir_kint64(J, (int64_t)(int32_t)*next++) :[m
[31m-	      lj_ir_kint(J, *next++);[m
[31m-    } else {  /* Regular IROpT. Pops two operands and pushes one result. */[m
[31m-      IRRef mode = nc->mode;[m
[31m-      lua_assert(sp >= nc->stack+2);[m
[31m-      sp--;[m
[31m-      /* Omit some overflow checks for array indexing. See comments above. */[m
[31m-      if ((mode & IRCONV_CONVMASK) == IRCONV_INDEX) {[m
[31m-	if (next == last && irref_isk(narrow_ref(sp[0])) &&[m
[31m-	  (uint32_t)IR(narrow_ref(sp[0]))->i + 0x40000000u < 0x80000000u)[m
[31m-	  guardot = 0;[m
[31m-	else  /* Otherwise cache a stronger check. */[m
[31m-	  mode += IRCONV_CHECK-IRCONV_INDEX;[m
[31m-      }[m
[31m-      sp[-1] = emitir(op+guardot, sp[-1], sp[0]);[m
[31m-      /* Add to cache. */[m
[31m-      if (narrow_ref(ref))[m
[31m-	narrow_bpc_set(J, narrow_ref(ref), narrow_ref(sp[-1]), mode);[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(sp == nc->stack+1);[m
[31m-  return nc->stack[0];[m
[31m-}[m
[31m-[m
[31m-/* Narrow a type conversion of an arithmetic operation. */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_convert(jit_State *J)[m
[31m-{[m
[31m-  if ((J->flags & JIT_F_OPT_NARROW)) {[m
[31m-    NarrowConv nc;[m
[31m-    nc.J = J;[m
[31m-    nc.sp = nc.stack;[m
[31m-    nc.maxsp = &nc.stack[NARROW_MAX_STACK-4];[m
[31m-    nc.t = irt_type(fins->t);[m
[31m-    if (fins->o == IR_TOBIT) {[m
[31m-      nc.mode = IRCONV_TOBIT;  /* Used only in the backpropagation cache. */[m
[31m-    } else {[m
[31m-      nc.mode = fins->op2;[m
[31m-    }[m
[31m-    if (narrow_conv_backprop(&nc, fins->op1, 0) <= 1)[m
[31m-      return narrow_conv_emit(J, &nc);[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Narrowing of implicit conversions ----------------------------------- */[m
[31m-[m
[31m-/* Recursively strip overflow checks. */[m
[31m-static TRef narrow_stripov(jit_State *J, TRef tr, int lastop, IRRef mode)[m
[31m-{[m
[31m-  IRRef ref = tref_ref(tr);[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  int op = ir->o;[m
[31m-  if (op >= IR_ADDOV && op <= lastop) {[m
[31m-    BPropEntry *bp = narrow_bpc_get(J, ref, mode);[m
[31m-    if (bp) {[m
[31m-      return TREF(bp->val, irt_t(IR(bp->val)->t));[m
[31m-    } else {[m
[31m-      IRRef op1 = ir->op1, op2 = ir->op2;  /* The IR may be reallocated. */[m
[31m-      op1 = narrow_stripov(J, op1, lastop, mode);[m
[31m-      op2 = narrow_stripov(J, op2, lastop, mode);[m
[31m-      tr = emitir(IRT(op - IR_ADDOV + IR_ADD,[m
[31m-		      ((mode & IRCONV_DSTMASK) >> IRCONV_DSH)), op1, op2);[m
[31m-      narrow_bpc_set(J, ref, tref_ref(tr), mode);[m
[31m-    }[m
[31m-  } else if (LJ_64 && (mode & IRCONV_SEXT) && !irt_is64(ir->t)) {[m
[31m-    tr = emitir(IRT(IR_CONV, IRT_INTP), tr, mode);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Narrow array index. */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_index(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  lua_assert(tref_isnumber(tr));[m
[31m-  if (tref_isnum(tr))  /* Conversion may be narrowed, too. See above. */[m
[31m-    return emitir(IRTGI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_INDEX);[m
[31m-  /* Omit some overflow checks for array indexing. See comments above. */[m
[31m-  ir = IR(tref_ref(tr));[m
[31m-  if ((ir->o == IR_ADDOV || ir->o == IR_SUBOV) && irref_isk(ir->op2) &&[m
[31m-      (uint32_t)IR(ir->op2)->i + 0x40000000u < 0x80000000u)[m
[31m-    return emitir(IRTI(ir->o - IR_ADDOV + IR_ADD), ir->op1, ir->op2);[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Narrow conversion to integer operand (overflow undefined). */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_toint(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (tref_isstr(tr))[m
[31m-    tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-  if (tref_isnum(tr))  /* Conversion may be narrowed, too. See above. */[m
[31m-    return emitir(IRTI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_ANY);[m
[31m-  if (!tref_isinteger(tr))[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  /*[m
[31m-  ** Undefined overflow semantics allow stripping of ADDOV, SUBOV and MULOV.[m
[31m-  ** Use IRCONV_TOBIT for the cache entries, since the semantics are the same.[m
[31m-  */[m
[31m-  return narrow_stripov(J, tr, IR_MULOV, (IRT_INT<<5)|IRT_INT|IRCONV_TOBIT);[m
[31m-}[m
[31m-[m
[31m-/* Narrow conversion to bitop operand (overflow wrapped). */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_tobit(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (tref_isstr(tr))[m
[31m-    tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-  if (tref_isnum(tr))  /* Conversion may be narrowed, too. See above. */[m
[31m-    return emitir(IRTI(IR_TOBIT), tr, lj_ir_knum_tobit(J));[m
[31m-  if (!tref_isinteger(tr))[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  /*[m
[31m-  ** Wrapped overflow semantics allow stripping of ADDOV and SUBOV.[m
[31m-  ** MULOV cannot be stripped due to precision widening.[m
[31m-  */[m
[31m-  return narrow_stripov(J, tr, IR_SUBOV, (IRT_INT<<5)|IRT_INT|IRCONV_TOBIT);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Narrow C array index (overflow undefined). */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  lua_assert(tref_isnumber(tr));[m
[31m-  if (tref_isnum(tr))[m
[31m-    return emitir(IRT(IR_CONV, IRT_INTP), tr, (IRT_INTP<<5)|IRT_NUM|IRCONV_ANY);[m
[31m-  /* Undefined overflow semantics allow stripping of ADDOV, SUBOV and MULOV. */[m
[31m-  return narrow_stripov(J, tr, IR_MULOV,[m
[31m-			LJ_64 ? ((IRT_INTP<<5)|IRT_INT|IRCONV_SEXT) :[m
[31m-				((IRT_INTP<<5)|IRT_INT|IRCONV_TOBIT));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Narrowing of arithmetic operators ----------------------------------- */[m
[31m-[m
[31m-/* Check whether a number fits into an int32_t (-0 is ok, too). */[m
[31m-static int numisint(lua_Number n)[m
[31m-{[m
[31m-  return (n == (lua_Number)lj_num2int(n));[m
[31m-}[m
[31m-[m
[31m-/* Convert string to number. Error out for non-numeric string values. */[m
[31m-static TRef conv_str_tonum(jit_State *J, TRef tr, TValue *o)[m
[31m-{[m
[31m-  if (tref_isstr(tr)) {[m
[31m-    tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-    /* Would need an inverted STRTO for this rare and useless case. */[m
[31m-    if (!lj_strscan_num(strV(o), o))  /* Convert in-place. Value used below. */[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);  /* Punt if non-numeric. */[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Narrowing of arithmetic operations. */[m
[31m-TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc,[m
[31m-			 TValue *vb, TValue *vc, IROp op)[m
[31m-{[m
[31m-  rb = conv_str_tonum(J, rb, vb);[m
[31m-  rc = conv_str_tonum(J, rc, vc);[m
[31m-  /* Must not narrow MUL in non-DUALNUM variant, because it loses -0. */[m
[31m-  if ((op >= IR_ADD && op <= (LJ_DUALNUM ? IR_MUL : IR_SUB)) &&[m
[31m-      tref_isinteger(rb) && tref_isinteger(rc) &&[m
[31m-      numisint(lj_vm_foldarith(numberVnum(vb), numberVnum(vc),[m
[31m-			       (int)op - (int)IR_ADD)))[m
[31m-    return emitir(IRTGI((int)op - (int)IR_ADD + (int)IR_ADDOV), rb, rc);[m
[31m-  if (!tref_isnum(rb)) rb = emitir(IRTN(IR_CONV), rb, IRCONV_NUM_INT);[m
[31m-  if (!tref_isnum(rc)) rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT);[m
[31m-  return emitir(IRTN(op), rb, rc);[m
[31m-}[m
[31m-[m
[31m-/* Narrowing of unary minus operator. */[m
[31m-TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc)[m
[31m-{[m
[31m-  rc = conv_str_tonum(J, rc, vc);[m
[31m-  if (tref_isinteger(rc)) {[m
[31m-    if ((uint32_t)numberVint(vc) != 0x80000000u)[m
[31m-      return emitir(IRTGI(IR_SUBOV), lj_ir_kint(J, 0), rc);[m
[31m-    rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT);[m
[31m-  }[m
[31m-  return emitir(IRTN(IR_NEG), rc, lj_ir_knum_neg(J));[m
[31m-}[m
[31m-[m
[31m-/* Narrowing of modulo operator. */[m
[31m-TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc)[m
[31m-{[m
[31m-  TRef tmp;[m
[31m-  rb = conv_str_tonum(J, rb, vb);[m
[31m-  rc = conv_str_tonum(J, rc, vc);[m
[31m-  if ((LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) &&[m
[31m-      tref_isinteger(rb) && tref_isinteger(rc) &&[m
[31m-      (tvisint(vc) ? intV(vc) != 0 : !tviszero(vc))) {[m
[31m-    emitir(IRTGI(IR_NE), rc, lj_ir_kint(J, 0));[m
[31m-    return emitir(IRTI(IR_MOD), rb, rc);[m
[31m-  }[m
[31m-  /* b % c ==> b - floor(b/c)*c */[m
[31m-  rb = lj_ir_tonum(J, rb);[m
[31m-  rc = lj_ir_tonum(J, rc);[m
[31m-  tmp = emitir(IRTN(IR_DIV), rb, rc);[m
[31m-  tmp = emitir(IRTN(IR_FPMATH), tmp, IRFPM_FLOOR);[m
[31m-  tmp = emitir(IRTN(IR_MUL), tmp, rc);[m
[31m-  return emitir(IRTN(IR_SUB), rb, tmp);[m
[31m-}[m
[31m-[m
[31m-/* Narrowing of power operator or math.pow. */[m
[31m-TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc)[m
[31m-{[m
[31m-  rb = conv_str_tonum(J, rb, vb);[m
[31m-  rb = lj_ir_tonum(J, rb);  /* Left arg is always treated as an FP number. */[m
[31m-  rc = conv_str_tonum(J, rc, vc);[m
[31m-  /* Narrowing must be unconditional to preserve (-x)^i semantics. */[m
[31m-  if (tvisint(vc) || numisint(numV(vc))) {[m
[31m-    int checkrange = 0;[m
[31m-    /* Split pow is faster for bigger exponents. But do this only for (+k)^i. */[m
[31m-    if (tref_isk(rb) && (int32_t)ir_knum(IR(tref_ref(rb)))->u32.hi >= 0) {[m
[31m-      int32_t k = numberVint(vc);[m
[31m-      if (!(k >= -65536 && k <= 65536)) goto split_pow;[m
[31m-      checkrange = 1;[m
[31m-    }[m
[31m-    if (!tref_isinteger(rc)) {[m
[31m-      /* Guarded conversion to integer! */[m
[31m-      rc = emitir(IRTGI(IR_CONV), rc, IRCONV_INT_NUM|IRCONV_CHECK);[m
[31m-    }[m
[31m-    if (checkrange && !tref_isk(rc)) {  /* Range guard: -65536 <= i <= 65536 */[m
[31m-      TRef tmp = emitir(IRTI(IR_ADD), rc, lj_ir_kint(J, 65536));[m
[31m-      emitir(IRTGI(IR_ULE), tmp, lj_ir_kint(J, 2*65536));[m
[31m-    }[m
[31m-    return emitir(IRTN(IR_POW), rb, rc);[m
[31m-  }[m
[31m-split_pow:[m
[31m-  /* FOLD covers most cases, but some are easier to do here. */[m
[31m-  if (tref_isk(rb) && tvispone(ir_knum(IR(tref_ref(rb)))))[m
[31m-    return rb;  /* 1 ^ x ==> 1 */[m
[31m-  rc = lj_ir_tonum(J, rc);[m
[31m-  if (tref_isk(rc) && ir_knum(IR(tref_ref(rc)))->n == 0.5)[m
[31m-    return emitir(IRTN(IR_FPMATH), rb, IRFPM_SQRT);  /* x ^ 0.5 ==> sqrt(x) */[m
[31m-  /* Split up b^c into exp2(c*log2(b)). Assembler may rejoin later. */[m
[31m-  rb = emitir(IRTN(IR_FPMATH), rb, IRFPM_LOG2);[m
[31m-  rc = emitir(IRTN(IR_MUL), rb, rc);[m
[31m-  return emitir(IRTN(IR_FPMATH), rc, IRFPM_EXP2);[m
[31m-}[m
[31m-[m
[31m-/* -- Predictive narrowing of induction variables ------------------------- */[m
[31m-[m
[31m-/* Narrow a single runtime value. */[m
[31m-static int narrow_forl(jit_State *J, cTValue *o)[m
[31m-{[m
[31m-  if (tvisint(o)) return 1;[m
[31m-  if (LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) return numisint(numV(o));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Narrow the FORL index type by looking at the runtime values. */[m
[31m-IRType lj_opt_narrow_forl(jit_State *J, cTValue *tv)[m
[31m-{[m
[31m-  lua_assert(tvisnumber(&tv[FORL_IDX]) &&[m
[31m-	     tvisnumber(&tv[FORL_STOP]) &&[m
[31m-	     tvisnumber(&tv[FORL_STEP]));[m
[31m-  /* Narrow only if the runtime values of start/stop/step are all integers. */[m
[31m-  if (narrow_forl(J, &tv[FORL_IDX]) &&[m
[31m-      narrow_forl(J, &tv[FORL_STOP]) &&[m
[31m-      narrow_forl(J, &tv[FORL_STEP])) {[m
[31m-    /* And if the loop index can't possibly overflow. */[m
[31m-    lua_Number step = numberVnum(&tv[FORL_STEP]);[m
[31m-    lua_Number sum = numberVnum(&tv[FORL_STOP]) + step;[m
[31m-    if (0 <= step ? (sum <= 2147483647.0) : (sum >= -2147483648.0))[m
[31m-      return IRT_INT;[m
[31m-  }[m
[31m-  return IRT_NUM;[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef fins[m
[31m-#undef emitir[m
[31m-#undef emitir_raw[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink.c[m
[1mdeleted file mode 100644[m
[1mindex 975ee83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_sink.c[m
[1m+++ /dev/null[m
[36m@@ -1,245 +0,0 @@[m
[31m-/*[m
[31m-** SINK: Allocation Sinking and Store Sinking.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_sink_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_target.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Check whether the store ref points to an eligible allocation. */[m
[31m-static IRIns *sink_checkalloc(jit_State *J, IRIns *irs)[m
[31m-{[m
[31m-  IRIns *ir = IR(irs->op1);[m
[31m-  if (!irref_isk(ir->op2))[m
[31m-    return NULL;  /* Non-constant key. */[m
[31m-  if (ir->o == IR_HREFK || ir->o == IR_AREF)[m
[31m-    ir = IR(ir->op1);[m
[31m-  else if (!(ir->o == IR_HREF || ir->o == IR_NEWREF ||[m
[31m-	     ir->o == IR_FREF || ir->o == IR_ADD))[m
[31m-    return NULL;  /* Unhandled reference type (for XSTORE). */[m
[31m-  ir = IR(ir->op1);[m
[31m-  if (!(ir->o == IR_TNEW || ir->o == IR_TDUP || ir->o == IR_CNEW))[m
[31m-    return NULL;  /* Not an allocation. */[m
[31m-  return ir;  /* Return allocation. */[m
[31m-}[m
[31m-[m
[31m-/* Recursively check whether a value depends on a PHI. */[m
[31m-static int sink_phidep(jit_State *J, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isphi(ir->t)) return 1;[m
[31m-  if (ir->op1 >= REF_FIRST && sink_phidep(J, ir->op1)) return 1;[m
[31m-  if (ir->op2 >= REF_FIRST && sink_phidep(J, ir->op2)) return 1;[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a value is a sinkable PHI or loop-invariant. */[m
[31m-static int sink_checkphi(jit_State *J, IRIns *ira, IRRef ref)[m
[31m-{[m
[31m-  if (ref >= REF_FIRST) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (irt_isphi(ir->t) || (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT &&[m
[31m-			     irt_isphi(IR(ir->op1)->t))) {[m
[31m-      ira->prev++;[m
[31m-      return 1;  /* Sinkable PHI. */[m
[31m-    }[m
[31m-    /* Otherwise the value must be loop-invariant. */[m
[31m-    return ref < J->loopref && !sink_phidep(J, ref);[m
[31m-  }[m
[31m-  return 1;  /* Constant (non-PHI). */[m
[31m-}[m
[31m-[m
[31m-/* Mark non-sinkable allocations using single-pass backward propagation.[m
[31m-**[m
[31m-** Roots for the marking process are:[m
[31m-** - Some PHIs or snapshots (see below).[m
[31m-** - Non-PHI, non-constant values stored to PHI allocations.[m
[31m-** - All guards.[m
[31m-** - Any remaining loads not eliminated by store-to-load forwarding.[m
[31m-** - Stores with non-constant keys.[m
[31m-** - All stored values.[m
[31m-*/[m
[31m-static void sink_mark_ins(jit_State *J)[m
[31m-{[m
[31m-  IRIns *ir, *irlast = IR(J->cur.nins-1);[m
[31m-  for (ir = irlast ; ; ir--) {[m
[31m-    switch (ir->o) {[m
[31m-    case IR_BASE:[m
[31m-      return;  /* Finished. */[m
[31m-    case IR_CALLL:  /* IRCALL_lj_tab_len */[m
[31m-    case IR_ALOAD: case IR_HLOAD: case IR_XLOAD: case IR_TBAR:[m
[31m-      irt_setmark(IR(ir->op1)->t);  /* Mark ref for remaining loads. */[m
[31m-      break;[m
[31m-    case IR_FLOAD:[m
[31m-      if (irt_ismarked(ir->t) || ir->op2 == IRFL_TAB_META)[m
[31m-	irt_setmark(IR(ir->op1)->t);  /* Mark table for remaining loads. */[m
[31m-      break;[m
[31m-    case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: {[m
[31m-      IRIns *ira = sink_checkalloc(J, ir);[m
[31m-      if (!ira || (irt_isphi(ira->t) && !sink_checkphi(J, ira, ir->op2)))[m
[31m-	irt_setmark(IR(ir->op1)->t);  /* Mark ineligible ref. */[m
[31m-      irt_setmark(IR(ir->op2)->t);  /* Mark stored value. */[m
[31m-      break;[m
[31m-      }[m
[31m-#if LJ_HASFFI[m
[31m-    case IR_CNEWI:[m
[31m-      if (irt_isphi(ir->t) &&[m
[31m-	  (!sink_checkphi(J, ir, ir->op2) ||[m
[31m-	   (LJ_32 && ir+1 < irlast && (ir+1)->o == IR_HIOP &&[m
[31m-	    !sink_checkphi(J, ir, (ir+1)->op2))))[m
[31m-	irt_setmark(ir->t);  /* Mark ineligible allocation. */[m
[31m-      /* fallthrough */[m
[31m-#endif[m
[31m-    case IR_USTORE:[m
[31m-      irt_setmark(IR(ir->op2)->t);  /* Mark stored value. */[m
[31m-      break;[m
[31m-#if LJ_HASFFI[m
[31m-    case IR_CALLXS:[m
[31m-#endif[m
[31m-    case IR_CALLS:[m
[31m-      irt_setmark(IR(ir->op1)->t);  /* Mark (potentially) stored values. */[m
[31m-      break;[m
[31m-    case IR_PHI: {[m
[31m-      IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-      irl->prev = irr->prev = 0;  /* Clear PHI value counts. */[m
[31m-      if (irl->o == irr->o &&[m
[31m-	  (irl->o == IR_TNEW || irl->o == IR_TDUP ||[m
[31m-	   (LJ_HASFFI && (irl->o == IR_CNEW || irl->o == IR_CNEWI))))[m
[31m-	break;[m
[31m-      irt_setmark(irl->t);[m
[31m-      irt_setmark(irr->t);[m
[31m-      break;[m
[31m-      }[m
[31m-    default:[m
[31m-      if (irt_ismarked(ir->t) || irt_isguard(ir->t)) {  /* Propagate mark. */[m
[31m-	if (ir->op1 >= REF_FIRST) irt_setmark(IR(ir->op1)->t);[m
[31m-	if (ir->op2 >= REF_FIRST) irt_setmark(IR(ir->op2)->t);[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Mark all instructions referenced by a snapshot. */[m
[31m-static void sink_mark_snap(jit_State *J, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    IRRef ref = snap_ref(map[n]);[m
[31m-    if (!irref_isk(ref))[m
[31m-      irt_setmark(IR(ref)->t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Iteratively remark PHI refs with differing marks or PHI value counts. */[m
[31m-static void sink_remark_phi(jit_State *J)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  int remark;[m
[31m-  do {[m
[31m-    remark = 0;[m
[31m-    for (ir = IR(J->cur.nins-1); ir->o == IR_PHI; ir--) {[m
[31m-      IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-      if (((irl->t.irt ^ irr->t.irt) & IRT_MARK))[m
[31m-	remark = 1;[m
[31m-      else if (irl->prev == irr->prev)[m
[31m-	continue;[m
[31m-      irt_setmark(IR(ir->op1)->t);[m
[31m-      irt_setmark(IR(ir->op2)->t);[m
[31m-    }[m
[31m-  } while (remark);[m
[31m-}[m
[31m-[m
[31m-/* Sweep instructions and tag sunken allocations and stores. */[m
[31m-static void sink_sweep_ins(jit_State *J)[m
[31m-{[m
[31m-  IRIns *ir, *irfirst = IR(J->cur.nk);[m
[31m-  for (ir = IR(J->cur.nins-1) ; ir >= irfirst; ir--) {[m
[31m-    switch (ir->o) {[m
[31m-    case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: {[m
[31m-      IRIns *ira = sink_checkalloc(J, ir);[m
[31m-      if (ira && !irt_ismarked(ira->t)) {[m
[31m-	int delta = (int)(ir - ira);[m
[31m-	ir->prev = REGSP(RID_SINK, delta > 255 ? 255 : delta);[m
[31m-      } else {[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-      }[m
[31m-      break;[m
[31m-      }[m
[31m-    case IR_NEWREF:[m
[31m-      if (!irt_ismarked(IR(ir->op1)->t)) {[m
[31m-	ir->prev = REGSP(RID_SINK, 0);[m
[31m-      } else {[m
[31m-	irt_clearmark(ir->t);[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-      }[m
[31m-      break;[m
[31m-#if LJ_HASFFI[m
[31m-    case IR_CNEW: case IR_CNEWI:[m
[31m-#endif[m
[31m-    case IR_TNEW: case IR_TDUP:[m
[31m-      if (!irt_ismarked(ir->t)) {[m
[31m-	ir->t.irt &= ~IRT_GUARD;[m
[31m-	ir->prev = REGSP(RID_SINK, 0);[m
[31m-	J->cur.sinktags = 1;  /* Signal present SINK tags to assembler. */[m
[31m-      } else {[m
[31m-	irt_clearmark(ir->t);[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-      }[m
[31m-      break;[m
[31m-    case IR_PHI: {[m
[31m-      IRIns *ira = IR(ir->op2);[m
[31m-      if (!irt_ismarked(ira->t) &&[m
[31m-	  (ira->o == IR_TNEW || ira->o == IR_TDUP ||[m
[31m-	   (LJ_HASFFI && (ira->o == IR_CNEW || ira->o == IR_CNEWI)))) {[m
[31m-	ir->prev = REGSP(RID_SINK, 0);[m
[31m-      } else {[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-      }[m
[31m-      break;[m
[31m-      }[m
[31m-    default:[m
[31m-      irt_clearmark(ir->t);[m
[31m-      ir->prev = REGSP_INIT;[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocation sinking and store sinking.[m
[31m-**[m
[31m-** 1. Mark all non-sinkable allocations.[m
[31m-** 2. Then sink all remaining allocations and the related stores.[m
[31m-*/[m
[31m-void lj_opt_sink(jit_State *J)[m
[31m-{[m
[31m-  const uint32_t need = (JIT_F_OPT_SINK|JIT_F_OPT_FWD|[m
[31m-			 JIT_F_OPT_DCE|JIT_F_OPT_CSE|JIT_F_OPT_FOLD);[m
[31m-  if ((J->flags & need) == need &&[m
[31m-      (J->chain[IR_TNEW] || J->chain[IR_TDUP] ||[m
[31m-       (LJ_HASFFI && (J->chain[IR_CNEW] || J->chain[IR_CNEWI])))) {[m
[31m-    if (!J->loopref)[m
[31m-      sink_mark_snap(J, &J->cur.snap[J->cur.nsnap-1]);[m
[31m-    sink_mark_ins(J);[m
[31m-    if (J->loopref)[m
[31m-      sink_remark_phi(J);[m
[31m-    sink_sweep_ins(J);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split.c[m
[1mdeleted file mode 100644[m
[1mindex 6def416..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_opt_split.c[m
[1m+++ /dev/null[m
[36m@@ -1,861 +0,0 @@[m
[31m-/*[m
[31m-** SPLIT: Split 64 bit IR instructions into 32 bit IR instructions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_split_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT && (LJ_SOFTFP || (LJ_32 && LJ_HASFFI))[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* SPLIT pass:[m
[31m-**[m
[31m-** This pass splits up 64 bit IR instructions into multiple 32 bit IR[m
[31m-** instructions. It's only active for soft-float targets or for 32 bit CPUs[m
[31m-** which lack native 64 bit integer operations (the FFI is currently the[m
[31m-** only emitter for 64 bit integer instructions).[m
[31m-**[m
[31m-** Splitting the IR in a separate pass keeps each 32 bit IR assembler[m
[31m-** backend simple. Only a small amount of extra functionality needs to be[m
[31m-** implemented. This is much easier than adding support for allocating[m
[31m-** register pairs to each backend (believe me, I tried). A few simple, but[m
[31m-** important optimizations can be performed by the SPLIT pass, which would[m
[31m-** be tedious to do in the backend.[m
[31m-**[m
[31m-** The basic idea is to replace each 64 bit IR instruction with its 32 bit[m
[31m-** equivalent plus an extra HIOP instruction. The splitted IR is not passed[m
[31m-** through FOLD or any other optimizations, so each HIOP is guaranteed to[m
[31m-** immediately follow it's counterpart. The actual functionality of HIOP is[m
[31m-** inferred from the previous instruction.[m
[31m-**[m
[31m-** The operands of HIOP hold the hiword input references. The output of HIOP[m
[31m-** is the hiword output reference, which is also used to hold the hiword[m
[31m-** register or spill slot information. The register allocator treats this[m
[31m-** instruction independently of any other instruction, which improves code[m
[31m-** quality compared to using fixed register pairs.[m
[31m-**[m
[31m-** It's easier to split up some instructions into two regular 32 bit[m
[31m-** instructions. E.g. XLOAD is split up into two XLOADs with two different[m
[31m-** addresses. Obviously 64 bit constants need to be split up into two 32 bit[m
[31m-** constants, too. Some hiword instructions can be entirely omitted, e.g.[m
[31m-** when zero-extending a 32 bit value to 64 bits. 64 bit arguments for calls[m
[31m-** are split up into two 32 bit arguments each.[m
[31m-**[m
[31m-** On soft-float targets, floating-point instructions are directly converted[m
[31m-** to soft-float calls by the SPLIT pass (except for comparisons and MIN/MAX).[m
[31m-** HIOP for number results has the type IRT_SOFTFP ("sfp" in -jdump).[m
[31m-**[m
[31m-** Here's the IR and x64 machine code for 'x.b = x.a + 1' for a struct with[m
[31m-** two int64_t fields:[m
[31m-**[m
[31m-** 0100    p32 ADD    base  +8[m
[31m-** 0101    i64 XLOAD  0100[m
[31m-** 0102    i64 ADD    0101  +1[m
[31m-** 0103    p32 ADD    base  +16[m
[31m-** 0104    i64 XSTORE 0103  0102[m
[31m-**[m
[31m-**         mov rax, [esi+0x8][m
[31m-**         add rax, +0x01[m
[31m-**         mov [esi+0x10], rax[m
[31m-**[m
[31m-** Here's the transformed IR and the x86 machine code after the SPLIT pass:[m
[31m-**[m
[31m-** 0100    p32 ADD    base  +8[m
[31m-** 0101    int XLOAD  0100[m
[31m-** 0102    p32 ADD    base  +12[m
[31m-** 0103    int XLOAD  0102[m
[31m-** 0104    int ADD    0101  +1[m
[31m-** 0105    int HIOP   0103  +0[m
[31m-** 0106    p32 ADD    base  +16[m
[31m-** 0107    int XSTORE 0106  0104[m
[31m-** 0108    int HIOP   0106  0105[m
[31m-**[m
[31m-**         mov eax, [esi+0x8][m
[31m-**         mov ecx, [esi+0xc][m
[31m-**         add eax, +0x01[m
[31m-**         adc ecx, +0x00[m
[31m-**         mov [esi+0x10], eax[m
[31m-**         mov [esi+0x14], ecx[m
[31m-**[m
[31m-** You may notice the reassociated hiword address computation, which is[m
[31m-** later fused into the mov operands by the assembler.[m
[31m-*/[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Directly emit the transformed IR without updating chains etc. */[m
[31m-static IRRef split_emit(jit_State *J, uint16_t ot, IRRef1 op1, IRRef1 op2)[m
[31m-{[m
[31m-  IRRef nref = lj_ir_nextins(J);[m
[31m-  IRIns *ir = IR(nref);[m
[31m-  ir->ot = ot;[m
[31m-  ir->op1 = op1;[m
[31m-  ir->op2 = op2;[m
[31m-  return nref;[m
[31m-}[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-/* Emit a (checked) number to integer conversion. */[m
[31m-static IRRef split_num2int(jit_State *J, IRRef lo, IRRef hi, int check)[m
[31m-{[m
[31m-  IRRef tmp, res;[m
[31m-#if LJ_LE[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), lo, hi);[m
[31m-#else[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hi, lo);[m
[31m-#endif[m
[31m-  res = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_softfp_d2i);[m
[31m-  if (check) {[m
[31m-    tmp = split_emit(J, IRTI(IR_CALLN), res, IRCALL_softfp_i2d);[m
[31m-    split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp);[m
[31m-    split_emit(J, IRTGI(IR_EQ), tmp, lo);[m
[31m-    split_emit(J, IRTG(IR_HIOP, IRT_SOFTFP), tmp+1, hi);[m
[31m-  }[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-/* Emit a CALLN with one split 64 bit argument. */[m
[31m-static IRRef split_call_l(jit_State *J, IRRef1 *hisubst, IRIns *oir,[m
[31m-			  IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  IRRef tmp, op1 = ir->op1;[m
[31m-  J->cur.nins--;[m
[31m-#if LJ_LE[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]);[m
[31m-#else[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev);[m
[31m-#endif[m
[31m-  ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id);[m
[31m-  return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Emit a CALLN with one split 64 bit argument and a 32 bit argument. */[m
[31m-static IRRef split_call_li(jit_State *J, IRRef1 *hisubst, IRIns *oir,[m
[31m-			   IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  IRRef tmp, op1 = ir->op1, op2 = ir->op2;[m
[31m-  J->cur.nins--;[m
[31m-#if LJ_LE[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]);[m
[31m-#else[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev);[m
[31m-#endif[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev);[m
[31m-  ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id);[m
[31m-  return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp);[m
[31m-}[m
[31m-[m
[31m-/* Emit a CALLN with two split 64 bit arguments. */[m
[31m-static IRRef split_call_ll(jit_State *J, IRRef1 *hisubst, IRIns *oir,[m
[31m-			   IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  IRRef tmp, op1 = ir->op1, op2 = ir->op2;[m
[31m-  J->cur.nins--;[m
[31m-#if LJ_LE[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]);[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev);[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, hisubst[op2]);[m
[31m-#else[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev);[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, hisubst[op2]);[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev);[m
[31m-#endif[m
[31m-  ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id);[m
[31m-  return split_emit(J,[m
[31m-    IRT(IR_HIOP, (LJ_SOFTFP && irt_isnum(ir->t)) ? IRT_SOFTFP : IRT_INT),[m
[31m-    tmp, tmp);[m
[31m-}[m
[31m-[m
[31m-/* Get a pointer to the other 32 bit word (LE: hiword, BE: loword). */[m
[31m-static IRRef split_ptr(jit_State *J, IRIns *oir, IRRef ref)[m
[31m-{[m
[31m-  IRRef nref = oir[ref].prev;[m
[31m-  IRIns *ir = IR(nref);[m
[31m-  int32_t ofs = 4;[m
[31m-  if (ir->o == IR_KPTR)[m
[31m-    return lj_ir_kptr(J, (char *)ir_kptr(ir) + ofs);[m
[31m-  if (ir->o == IR_ADD && irref_isk(ir->op2) && !irt_isphi(oir[ref].t)) {[m
[31m-    /* Reassociate address. */[m
[31m-    ofs += IR(ir->op2)->i;[m
[31m-    nref = ir->op1;[m
[31m-    if (ofs == 0) return nref;[m
[31m-  }[m
[31m-  return split_emit(J, IRT(IR_ADD, IRT_PTR), nref, lj_ir_kint(J, ofs));[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static IRRef split_bitshift(jit_State *J, IRRef1 *hisubst,[m
[31m-			    IRIns *oir, IRIns *nir, IRIns *ir)[m
[31m-{[m
[31m-  IROp op = ir->o;[m
[31m-  IRRef kref = nir->op2;[m
[31m-  if (irref_isk(kref)) {  /* Optimize constant shifts. */[m
[31m-    int32_t k = (IR(kref)->i & 63);[m
[31m-    IRRef lo = nir->op1, hi = hisubst[ir->op1];[m
[31m-    if (op == IR_BROL || op == IR_BROR) {[m
[31m-      if (op == IR_BROR) k = (-k & 63);[m
[31m-      if (k >= 32) { IRRef t = lo; lo = hi; hi = t; k -= 32; }[m
[31m-      if (k == 0) {[m
[31m-      passthrough:[m
[31m-	J->cur.nins--;[m
[31m-	ir->prev = lo;[m
[31m-	return hi;[m
[31m-      } else {[m
[31m-	TRef k1, k2;[m
[31m-	IRRef t1, t2, t3, t4;[m
[31m-	J->cur.nins--;[m
[31m-	k1 = lj_ir_kint(J, k);[m
[31m-	k2 = lj_ir_kint(J, (-k & 31));[m
[31m-	t1 = split_emit(J, IRTI(IR_BSHL), lo, k1);[m
[31m-	t2 = split_emit(J, IRTI(IR_BSHL), hi, k1);[m
[31m-	t3 = split_emit(J, IRTI(IR_BSHR), lo, k2);[m
[31m-	t4 = split_emit(J, IRTI(IR_BSHR), hi, k2);[m
[31m-	ir->prev = split_emit(J, IRTI(IR_BOR), t1, t4);[m
[31m-	return split_emit(J, IRTI(IR_BOR), t2, t3);[m
[31m-      }[m
[31m-    } else if (k == 0) {[m
[31m-      goto passthrough;[m
[31m-    } else if (k < 32) {[m
[31m-      if (op == IR_BSHL) {[m
[31m-	IRRef t1 = split_emit(J, IRTI(IR_BSHL), hi, kref);[m
[31m-	IRRef t2 = split_emit(J, IRTI(IR_BSHR), lo, lj_ir_kint(J, (-k&31)));[m
[31m-	return split_emit(J, IRTI(IR_BOR), t1, t2);[m
[31m-      } else {[m
[31m-	IRRef t1 = ir->prev, t2;[m
[31m-	lua_assert(op == IR_BSHR || op == IR_BSAR);[m
[31m-	nir->o = IR_BSHR;[m
[31m-	t2 = split_emit(J, IRTI(IR_BSHL), hi, lj_ir_kint(J, (-k&31)));[m
[31m-	ir->prev = split_emit(J, IRTI(IR_BOR), t1, t2);[m
[31m-	return split_emit(J, IRTI(op), hi, kref);[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (op == IR_BSHL) {[m
[31m-	if (k == 32)[m
[31m-	  J->cur.nins--;[m
[31m-	else[m
[31m-	  lo = ir->prev;[m
[31m-	ir->prev = lj_ir_kint(J, 0);[m
[31m-	return lo;[m
[31m-      } else {[m
[31m-	lua_assert(op == IR_BSHR || op == IR_BSAR);[m
[31m-	if (k == 32) {[m
[31m-	  J->cur.nins--;[m
[31m-	  ir->prev = hi;[m
[31m-	} else {[m
[31m-	  nir->op1 = hi;[m
[31m-	}[m
[31m-	if (op == IR_BSHR)[m
[31m-	  return lj_ir_kint(J, 0);[m
[31m-	else[m
[31m-	  return split_emit(J, IRTI(IR_BSAR), hi, lj_ir_kint(J, 31));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return split_call_li(J, hisubst, oir, ir,[m
[31m-		       op - IR_BSHL + IRCALL_lj_carith_shl64);[m
[31m-}[m
[31m-[m
[31m-static IRRef split_bitop(jit_State *J, IRRef1 *hisubst,[m
[31m-			 IRIns *nir, IRIns *ir)[m
[31m-{[m
[31m-  IROp op = ir->o;[m
[31m-  IRRef hi, kref = nir->op2;[m
[31m-  if (irref_isk(kref)) {  /* Optimize bit operations with lo constant. */[m
[31m-    int32_t k = IR(kref)->i;[m
[31m-    if (k == 0 || k == -1) {[m
[31m-      if (op == IR_BAND) k = ~k;[m
[31m-      if (k == 0) {[m
[31m-	J->cur.nins--;[m
[31m-	ir->prev = nir->op1;[m
[31m-      } else if (op == IR_BXOR) {[m
[31m-	nir->o = IR_BNOT;[m
[31m-	nir->op2 = 0;[m
[31m-      } else {[m
[31m-	J->cur.nins--;[m
[31m-	ir->prev = kref;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  hi = hisubst[ir->op1];[m
[31m-  kref = hisubst[ir->op2];[m
[31m-  if (irref_isk(kref)) {  /* Optimize bit operations with hi constant. */[m
[31m-    int32_t k = IR(kref)->i;[m
[31m-    if (k == 0 || k == -1) {[m
[31m-      if (op == IR_BAND) k = ~k;[m
[31m-      if (k == 0) {[m
[31m-	return hi;[m
[31m-      } else if (op == IR_BXOR) {[m
[31m-	return split_emit(J, IRTI(IR_BNOT), hi, 0);[m
[31m-      } else {[m
[31m-	return kref;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return split_emit(J, IRTI(op), hi, kref);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Substitute references of a snapshot. */[m
[31m-static void split_subst_snap(jit_State *J, SnapShot *snap, IRIns *oir)[m
[31m-{[m
[31m-  SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    IRIns *ir = &oir[snap_ref(sn)];[m
[31m-    if (!(LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && irref_isk(snap_ref(sn))))[m
[31m-      map[n] = ((sn & 0xffff0000) | ir->prev);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Transform the old IR to the new IR. */[m
[31m-static void split_ir(jit_State *J)[m
[31m-{[m
[31m-  IRRef nins = J->cur.nins, nk = J->cur.nk;[m
[31m-  MSize irlen = nins - nk;[m
[31m-  MSize need = (irlen+1)*(sizeof(IRIns) + sizeof(IRRef1));[m
[31m-  IRIns *oir = (IRIns *)lj_buf_tmp(J->L, need);[m
[31m-  IRRef1 *hisubst;[m
[31m-  IRRef ref, snref;[m
[31m-  SnapShot *snap;[m
[31m-[m
[31m-  /* Copy old IR to buffer. */[m
[31m-  memcpy(oir, IR(nk), irlen*sizeof(IRIns));[m
[31m-  /* Bias hiword substitution table and old IR. Loword kept in field prev. */[m
[31m-  hisubst = (IRRef1 *)&oir[irlen] - nk;[m
[31m-  oir -= nk;[m
[31m-[m
[31m-  /* Remove all IR instructions, but retain IR constants. */[m
[31m-  J->cur.nins = REF_FIRST;[m
[31m-  J->loopref = 0;[m
[31m-[m
[31m-  /* Process constants and fixed references. */[m
[31m-  for (ref = nk; ref <= REF_BASE; ref++) {[m
[31m-    IRIns *ir = &oir[ref];[m
[31m-    if ((LJ_SOFTFP && ir->o == IR_KNUM) || ir->o == IR_KINT64) {[m
[31m-      /* Split up 64 bit constant. */[m
[31m-      TValue tv = *ir_k64(ir);[m
[31m-      ir->prev = lj_ir_kint(J, (int32_t)tv.u32.lo);[m
[31m-      hisubst[ref] = lj_ir_kint(J, (int32_t)tv.u32.hi);[m
[31m-    } else {[m
[31m-      ir->prev = ref;  /* Identity substitution for loword. */[m
[31m-      hisubst[ref] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Process old IR instructions. */[m
[31m-  snap = J->cur.snap;[m
[31m-  snref = snap->ref;[m
[31m-  for (ref = REF_FIRST; ref < nins; ref++) {[m
[31m-    IRIns *ir = &oir[ref];[m
[31m-    IRRef nref = lj_ir_nextins(J);[m
[31m-    IRIns *nir = IR(nref);[m
[31m-    IRRef hi = 0;[m
[31m-[m
[31m-    if (ref >= snref) {[m
[31m-      snap->ref = nref;[m
[31m-      split_subst_snap(J, snap++, oir);[m
[31m-      snref = snap < &J->cur.snap[J->cur.nsnap] ? snap->ref : ~(IRRef)0;[m
[31m-    }[m
[31m-[m
[31m-    /* Copy-substitute old instruction to new instruction. */[m
[31m-    nir->op1 = ir->op1 < nk ? ir->op1 : oir[ir->op1].prev;[m
[31m-    nir->op2 = ir->op2 < nk ? ir->op2 : oir[ir->op2].prev;[m
[31m-    ir->prev = nref;  /* Loword substitution. */[m
[31m-    nir->o = ir->o;[m
[31m-    nir->t.irt = ir->t.irt & ~(IRT_MARK|IRT_ISPHI);[m
[31m-    hisubst[ref] = 0;[m
[31m-[m
[31m-    /* Split 64 bit instructions. */[m
[31m-#if LJ_SOFTFP[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-      nir->t.irt = IRT_INT | (nir->t.irt & IRT_GUARD);  /* Turn into INT op. */[m
[31m-      /* Note: hi ref = lo ref + 1! Required for SNAP_SOFTFPNUM logic. */[m
[31m-      switch (ir->o) {[m
[31m-      case IR_ADD:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_add);[m
[31m-	break;[m
[31m-      case IR_SUB:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_sub);[m
[31m-	break;[m
[31m-      case IR_MUL:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_mul);[m
[31m-	break;[m
[31m-      case IR_DIV:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_div);[m
[31m-	break;[m
[31m-      case IR_POW:[m
[31m-	hi = split_call_li(J, hisubst, oir, ir, IRCALL_lj_vm_powi);[m
[31m-	break;[m
[31m-      case IR_FPMATH:[m
[31m-	/* Try to rejoin pow from EXP2, MUL and LOG2. */[m
[31m-	if (nir->op2 == IRFPM_EXP2 && nir->op1 > J->loopref) {[m
[31m-	  IRIns *irp = IR(nir->op1);[m
[31m-	  if (irp->o == IR_CALLN && irp->op2 == IRCALL_softfp_mul) {[m
[31m-	    IRIns *irm4 = IR(irp->op1);[m
[31m-	    IRIns *irm3 = IR(irm4->op1);[m
[31m-	    IRIns *irm12 = IR(irm3->op1);[m
[31m-	    IRIns *irl1 = IR(irm12->op1);[m
[31m-	    if (irm12->op1 > J->loopref && irl1->o == IR_CALLN &&[m
[31m-		irl1->op2 == IRCALL_lj_vm_log2) {[m
[31m-	      IRRef tmp = irl1->op1;  /* Recycle first two args from LOG2. */[m
[31m-	      IRRef arg3 = irm3->op2, arg4 = irm4->op2;[m
[31m-	      J->cur.nins--;[m
[31m-	      tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, arg3);[m
[31m-	      tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, arg4);[m
[31m-	      ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_pow);[m
[31m-	      hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp);[m
[31m-	      break;[m
[31m-	    }[m
[31m-	  }[m
[31m-	}[m
[31m-	hi = split_call_l(J, hisubst, oir, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-	break;[m
[31m-      case IR_ATAN2:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_atan2);[m
[31m-	break;[m
[31m-      case IR_LDEXP:[m
[31m-	hi = split_call_li(J, hisubst, oir, ir, IRCALL_ldexp);[m
[31m-	break;[m
[31m-      case IR_NEG: case IR_ABS:[m
[31m-	nir->o = IR_CONV;  /* Pass through loword. */[m
[31m-	nir->op2 = (IRT_INT << 5) | IRT_INT;[m
[31m-	hi = split_emit(J, IRT(ir->o == IR_NEG ? IR_BXOR : IR_BAND, IRT_SOFTFP),[m
[31m-			hisubst[ir->op1], hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_SLOAD:[m
[31m-	if ((nir->op2 & IRSLOAD_CONVERT)) {  /* Convert from int to number. */[m
[31m-	  nir->op2 &= ~IRSLOAD_CONVERT;[m
[31m-	  ir->prev = nref = split_emit(J, IRTI(IR_CALLN), nref,[m
[31m-				       IRCALL_softfp_i2d);[m
[31m-	  hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);[m
[31m-	  break;[m
[31m-	}[m
[31m-	/* fallthrough */[m
[31m-      case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-      case IR_STRTO:[m
[31m-	hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);[m
[31m-	break;[m
[31m-      case IR_XLOAD: {[m
[31m-	IRIns inslo = *nir;  /* Save/undo the emit of the lo XLOAD. */[m
[31m-	J->cur.nins--;[m
[31m-	hi = split_ptr(J, oir, ir->op1);  /* Insert the hiref ADD. */[m
[31m-#if LJ_BE[m
[31m-	hi = split_emit(J, IRT(IR_XLOAD, IRT_INT), hi, ir->op2);[m
[31m-	inslo.t.irt = IRT_SOFTFP | (inslo.t.irt & IRT_GUARD);[m
[31m-#endif[m
[31m-	nref = lj_ir_nextins(J);[m
[31m-	nir = IR(nref);[m
[31m-	*nir = inslo;  /* Re-emit lo XLOAD. */[m
[31m-#if LJ_LE[m
[31m-	hi = split_emit(J, IRT(IR_XLOAD, IRT_SOFTFP), hi, ir->op2);[m
[31m-	ir->prev = nref;[m
[31m-#else[m
[31m-	ir->prev = hi; hi = nref;[m
[31m-#endif[m
[31m-	break;[m
[31m-	}[m
[31m-      case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_XSTORE:[m
[31m-	split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nir->op1, hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_CONV: {  /* Conversion to number. Others handled below. */[m
[31m-	IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-	UNUSED(st);[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-	if (st == IRT_I64 || st == IRT_U64) {[m
[31m-	  hi = split_call_l(J, hisubst, oir, ir,[m
[31m-		 st == IRT_I64 ? IRCALL_fp64_l2d : IRCALL_fp64_ul2d);[m
[31m-	  break;[m
[31m-	}[m
[31m-#endif[m
[31m-	lua_assert(st == IRT_INT ||[m
[31m-		   (LJ_32 && LJ_HASFFI && (st == IRT_U32 || st == IRT_FLOAT)));[m
[31m-	nir->o = IR_CALLN;[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-	nir->op2 = st == IRT_INT ? IRCALL_softfp_i2d :[m
[31m-		   st == IRT_FLOAT ? IRCALL_softfp_f2d :[m
[31m-		   IRCALL_softfp_ui2d;[m
[31m-#else[m
[31m-	nir->op2 = IRCALL_softfp_i2d;[m
[31m-#endif[m
[31m-	hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);[m
[31m-	break;[m
[31m-	}[m
[31m-      case IR_CALLN:[m
[31m-      case IR_CALLL:[m
[31m-      case IR_CALLS:[m
[31m-      case IR_CALLXS:[m
[31m-	goto split_call;[m
[31m-      case IR_PHI:[m
[31m-	if (nir->op1 == nir->op2)[m
[31m-	  J->cur.nins--;  /* Drop useless PHIs. */[m
[31m-	if (hisubst[ir->op1] != hisubst[ir->op2])[m
[31m-	  split_emit(J, IRT(IR_PHI, IRT_SOFTFP),[m
[31m-		     hisubst[ir->op1], hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_HIOP:[m
[31m-	J->cur.nins--;  /* Drop joining HIOP. */[m
[31m-	ir->prev = nir->op1;[m
[31m-	hi = nir->op2;[m
[31m-	break;[m
[31m-      default:[m
[31m-	lua_assert(ir->o <= IR_NE || ir->o == IR_MIN || ir->o == IR_MAX);[m
[31m-	hi = split_emit(J, IRTG(IR_HIOP, IRT_SOFTFP),[m
[31m-			hisubst[ir->op1], hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      }[m
[31m-    } else[m
[31m-#endif[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-    if (irt_isint64(ir->t)) {[m
[31m-      IRRef hiref = hisubst[ir->op1];[m
[31m-      nir->t.irt = IRT_INT | (nir->t.irt & IRT_GUARD);  /* Turn into INT op. */[m
[31m-      switch (ir->o) {[m
[31m-      case IR_ADD:[m
[31m-      case IR_SUB:[m
[31m-	/* Use plain op for hiword if loword cannot produce a carry/borrow. */[m
[31m-	if (irref_isk(nir->op2) && IR(nir->op2)->i == 0) {[m
[31m-	  ir->prev = nir->op1;  /* Pass through loword. */[m
[31m-	  nir->op1 = hiref; nir->op2 = hisubst[ir->op2];[m
[31m-	  hi = nref;[m
[31m-	  break;[m
[31m-	}[m
[31m-	/* fallthrough */[m
[31m-      case IR_NEG:[m
[31m-	hi = split_emit(J, IRTI(IR_HIOP), hiref, hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_MUL:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_lj_carith_mul64);[m
[31m-	break;[m
[31m-      case IR_DIV:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir,[m
[31m-			   irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 :[m
[31m-					      IRCALL_lj_carith_divu64);[m
[31m-	break;[m
[31m-      case IR_MOD:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir,[m
[31m-			   irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 :[m
[31m-					      IRCALL_lj_carith_modu64);[m
[31m-	break;[m
[31m-      case IR_POW:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir,[m
[31m-			   irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 :[m
[31m-					      IRCALL_lj_carith_powu64);[m
[31m-	break;[m
[31m-      case IR_BNOT:[m
[31m-	hi = split_emit(J, IRTI(IR_BNOT), hiref, 0);[m
[31m-	break;[m
[31m-      case IR_BSWAP:[m
[31m-	ir->prev = split_emit(J, IRTI(IR_BSWAP), hiref, 0);[m
[31m-	hi = nref;[m
[31m-	break;[m
[31m-      case IR_BAND: case IR_BOR: case IR_BXOR:[m
[31m-	hi = split_bitop(J, hisubst, nir, ir);[m
[31m-	break;[m
[31m-      case IR_BSHL: case IR_BSHR: case IR_BSAR: case IR_BROL: case IR_BROR:[m
[31m-	hi = split_bitshift(J, hisubst, oir, nir, ir);[m
[31m-	break;[m
[31m-      case IR_FLOAD:[m
[31m-	lua_assert(ir->op2 == IRFL_CDATA_INT64);[m
[31m-	hi = split_emit(J, IRTI(IR_FLOAD), nir->op1, IRFL_CDATA_INT64_4);[m
[31m-#if LJ_BE[m
[31m-	ir->prev = hi; hi = nref;[m
[31m-#endif[m
[31m-	break;[m
[31m-      case IR_XLOAD:[m
[31m-	hi = split_emit(J, IRTI(IR_XLOAD), split_ptr(J, oir, ir->op1), ir->op2);[m
[31m-#if LJ_BE[m
[31m-	ir->prev = hi; hi = nref;[m
[31m-#endif[m
[31m-	break;[m
[31m-      case IR_XSTORE:[m
[31m-	split_emit(J, IRTI(IR_HIOP), nir->op1, hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_CONV: {  /* Conversion to 64 bit integer. Others handled below. */[m
[31m-	IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-#if LJ_SOFTFP[m
[31m-	if (st == IRT_NUM) {  /* NUM to 64 bit int conv. */[m
[31m-	  hi = split_call_l(J, hisubst, oir, ir,[m
[31m-		 irt_isi64(ir->t) ? IRCALL_fp64_d2l : IRCALL_fp64_d2ul);[m
[31m-	} else if (st == IRT_FLOAT) {  /* FLOAT to 64 bit int conv. */[m
[31m-	  nir->o = IR_CALLN;[m
[31m-	  nir->op2 = irt_isi64(ir->t) ? IRCALL_fp64_f2l : IRCALL_fp64_f2ul;[m
[31m-	  hi = split_emit(J, IRTI(IR_HIOP), nref, nref);[m
[31m-	}[m
[31m-#else[m
[31m-	if (st == IRT_NUM || st == IRT_FLOAT) {  /* FP to 64 bit int conv. */[m
[31m-	  hi = split_emit(J, IRTI(IR_HIOP), nir->op1, nref);[m
[31m-	}[m
[31m-#endif[m
[31m-	else if (st == IRT_I64 || st == IRT_U64) {  /* 64/64 bit cast. */[m
[31m-	  /* Drop cast, since assembler doesn't care. But fwd both parts. */[m
[31m-	  hi = hiref;[m
[31m-	  goto fwdlo;[m
[31m-	} else if ((ir->op2 & IRCONV_SEXT)) {  /* Sign-extend to 64 bit. */[m
[31m-	  IRRef k31 = lj_ir_kint(J, 31);[m
[31m-	  nir = IR(nref);  /* May have been reallocated. */[m
[31m-	  ir->prev = nir->op1;  /* Pass through loword. */[m
[31m-	  nir->o = IR_BSAR;  /* hi = bsar(lo, 31). */[m
[31m-	  nir->op2 = k31;[m
[31m-	  hi = nref;[m
[31m-	} else {  /* Zero-extend to 64 bit. */[m
[31m-	  hi = lj_ir_kint(J, 0);[m
[31m-	  goto fwdlo;[m
[31m-	}[m
[31m-	break;[m
[31m-	}[m
[31m-      case IR_CALLXS:[m
[31m-	goto split_call;[m
[31m-      case IR_PHI: {[m
[31m-	IRRef hiref2;[m
[31m-	if ((irref_isk(nir->op1) && irref_isk(nir->op2)) ||[m
[31m-	    nir->op1 == nir->op2)[m
[31m-	  J->cur.nins--;  /* Drop useless PHIs. */[m
[31m-	hiref2 = hisubst[ir->op2];[m
[31m-	if (!((irref_isk(hiref) && irref_isk(hiref2)) || hiref == hiref2))[m
[31m-	  split_emit(J, IRTI(IR_PHI), hiref, hiref2);[m
[31m-	break;[m
[31m-	}[m
[31m-      case IR_HIOP:[m
[31m-	J->cur.nins--;  /* Drop joining HIOP. */[m
[31m-	ir->prev = nir->op1;[m
[31m-	hi = nir->op2;[m
[31m-	break;[m
[31m-      default:[m
[31m-	lua_assert(ir->o <= IR_NE);  /* Comparisons. */[m
[31m-	split_emit(J, IRTGI(IR_HIOP), hiref, hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      }[m
[31m-    } else[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-    if (ir->o == IR_SLOAD) {[m
[31m-      if ((nir->op2 & IRSLOAD_CONVERT)) {  /* Convert from number to int. */[m
[31m-	nir->op2 &= ~IRSLOAD_CONVERT;[m
[31m-	if (!(nir->op2 & IRSLOAD_TYPECHECK))[m
[31m-	  nir->t.irt = IRT_INT;  /* Drop guard. */[m
[31m-	split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);[m
[31m-	ir->prev = split_num2int(J, nref, nref+1, irt_isguard(ir->t));[m
[31m-      }[m
[31m-    } else if (ir->o == IR_TOBIT) {[m
[31m-      IRRef tmp, op1 = ir->op1;[m
[31m-      J->cur.nins--;[m
[31m-#if LJ_LE[m
[31m-      tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]);[m
[31m-#else[m
[31m-      tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev);[m
[31m-#endif[m
[31m-      ir->prev = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_lj_vm_tobit);[m
[31m-    } else if (ir->o == IR_TOSTR) {[m
[31m-      if (hisubst[ir->op1]) {[m
[31m-	if (irref_isk(ir->op1))[m
[31m-	  nir->op1 = ir->op1;[m
[31m-	else[m
[31m-	  split_emit(J, IRT(IR_HIOP, IRT_NIL), hisubst[ir->op1], nref);[m
[31m-      }[m
[31m-    } else if (ir->o == IR_HREF || ir->o == IR_NEWREF) {[m
[31m-      if (irref_isk(ir->op2) && hisubst[ir->op2])[m
[31m-	nir->op2 = ir->op2;[m
[31m-    } else[m
[31m-#endif[m
[31m-    if (ir->o == IR_CONV) {  /* See above, too. */[m
[31m-      IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-      if (st == IRT_I64 || st == IRT_U64) {  /* Conversion from 64 bit int. */[m
[31m-#if LJ_SOFTFP[m
[31m-	if (irt_isfloat(ir->t)) {[m
[31m-	  split_call_l(J, hisubst, oir, ir,[m
[31m-		       st == IRT_I64 ? IRCALL_fp64_l2f : IRCALL_fp64_ul2f);[m
[31m-	  J->cur.nins--;  /* Drop unused HIOP. */[m
[31m-	}[m
[31m-#else[m
[31m-	if (irt_isfp(ir->t)) {  /* 64 bit integer to FP conversion. */[m
[31m-	  ir->prev = split_emit(J, IRT(IR_HIOP, irt_type(ir->t)),[m
[31m-				hisubst[ir->op1], nref);[m
[31m-	}[m
[31m-#endif[m
[31m-	else {  /* Truncate to lower 32 bits. */[m
[31m-	fwdlo:[m
[31m-	  ir->prev = nir->op1;  /* Forward loword. */[m
[31m-	  /* Replace with NOP to avoid messing up the snapshot logic. */[m
[31m-	  nir->ot = IRT(IR_NOP, IRT_NIL);[m
[31m-	  nir->op1 = nir->op2 = 0;[m
[31m-	}[m
[31m-      }[m
[31m-#endif[m
[31m-#if LJ_SOFTFP && LJ_32 && LJ_HASFFI[m
[31m-      else if (irt_isfloat(ir->t)) {[m
[31m-	if (st == IRT_NUM) {[m
[31m-	  split_call_l(J, hisubst, oir, ir, IRCALL_softfp_d2f);[m
[31m-	  J->cur.nins--;  /* Drop unused HIOP. */[m
[31m-	} else {[m
[31m-	  nir->o = IR_CALLN;[m
[31m-	  nir->op2 = st == IRT_INT ? IRCALL_softfp_i2f : IRCALL_softfp_ui2f;[m
[31m-	}[m
[31m-      } else if (st == IRT_FLOAT) {[m
[31m-	nir->o = IR_CALLN;[m
[31m-	nir->op2 = irt_isint(ir->t) ? IRCALL_softfp_f2i : IRCALL_softfp_f2ui;[m
[31m-      } else[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-      if (st == IRT_NUM || (LJ_32 && LJ_HASFFI && st == IRT_FLOAT)) {[m
[31m-	if (irt_isguard(ir->t)) {[m
[31m-	  lua_assert(st == IRT_NUM && irt_isint(ir->t));[m
[31m-	  J->cur.nins--;[m
[31m-	  ir->prev = split_num2int(J, nir->op1, hisubst[ir->op1], 1);[m
[31m-	} else {[m
[31m-	  split_call_l(J, hisubst, oir, ir,[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-	    st == IRT_NUM ?[m
[31m-	      (irt_isint(ir->t) ? IRCALL_softfp_d2i : IRCALL_softfp_d2ui) :[m
[31m-	      (irt_isint(ir->t) ? IRCALL_softfp_f2i : IRCALL_softfp_f2ui)[m
[31m-#else[m
[31m-	    IRCALL_softfp_d2i[m
[31m-#endif[m
[31m-	  );[m
[31m-	  J->cur.nins--;  /* Drop unused HIOP. */[m
[31m-	}[m
[31m-      }[m
[31m-#endif[m
[31m-    } else if (ir->o == IR_CALLXS) {[m
[31m-      IRRef hiref;[m
[31m-    split_call:[m
[31m-      hiref = hisubst[ir->op1];[m
[31m-      if (hiref) {[m
[31m-	IROpT ot = nir->ot;[m
[31m-	IRRef op2 = nir->op2;[m
[31m-	nir->ot = IRT(IR_CARG, IRT_NIL);[m
[31m-#if LJ_LE[m
[31m-	nir->op2 = hiref;[m
[31m-#else[m
[31m-	nir->op2 = nir->op1; nir->op1 = hiref;[m
[31m-#endif[m
[31m-	ir->prev = nref = split_emit(J, ot, nref, op2);[m
[31m-      }[m
[31m-      if (LJ_SOFTFP ? irt_is64(ir->t) : irt_isint64(ir->t))[m
[31m-	hi = split_emit(J,[m
[31m-	  IRT(IR_HIOP, (LJ_SOFTFP && irt_isnum(ir->t)) ? IRT_SOFTFP : IRT_INT),[m
[31m-	  nref, nref);[m
[31m-    } else if (ir->o == IR_CARG) {[m
[31m-      IRRef hiref = hisubst[ir->op1];[m
[31m-      if (hiref) {[m
[31m-	IRRef op2 = nir->op2;[m
[31m-#if LJ_LE[m
[31m-	nir->op2 = hiref;[m
[31m-#else[m
[31m-	nir->op2 = nir->op1; nir->op1 = hiref;[m
[31m-#endif[m
[31m-	ir->prev = nref = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, op2);[m
[31m-	nir = IR(nref);[m
[31m-      }[m
[31m-      hiref = hisubst[ir->op2];[m
[31m-      if (hiref) {[m
[31m-#if !LJ_TARGET_X86[m
[31m-	int carg = 0;[m
[31m-	IRIns *cir;[m
[31m-	for (cir = IR(nir->op1); cir->o == IR_CARG; cir = IR(cir->op1))[m
[31m-	  carg++;[m
[31m-	if ((carg & 1) == 0) {  /* Align 64 bit arguments. */[m
[31m-	  IRRef op2 = nir->op2;[m
[31m-	  nir->op2 = REF_NIL;[m
[31m-	  nref = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, op2);[m
[31m-	  nir = IR(nref);[m
[31m-	}[m
[31m-#endif[m
[31m-#if LJ_BE[m
[31m-	{ IRRef tmp = nir->op2; nir->op2 = hiref; hiref = tmp; }[m
[31m-#endif[m
[31m-	ir->prev = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, hiref);[m
[31m-      }[m
[31m-    } else if (ir->o == IR_CNEWI) {[m
[31m-      if (hisubst[ir->op2])[m
[31m-	split_emit(J, IRT(IR_HIOP, IRT_NIL), nref, hisubst[ir->op2]);[m
[31m-    } else if (ir->o == IR_LOOP) {[m
[31m-      J->loopref = nref;  /* Needed by assembler. */[m
[31m-    }[m
[31m-    hisubst[ref] = hi;  /* Store hiword substitution. */[m
[31m-  }[m
[31m-  if (snref == nins) {  /* Substitution for last snapshot. */[m
[31m-    snap->ref = J->cur.nins;[m
[31m-    split_subst_snap(J, snap, oir);[m
[31m-  }[m
[31m-[m
[31m-  /* Add PHI marks. */[m
[31m-  for (ref = J->cur.nins-1; ref >= REF_FIRST; ref--) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (ir->o != IR_PHI) break;[m
[31m-    if (!irref_isk(ir->op1)) irt_setphi(IR(ir->op1)->t);[m
[31m-    if (ir->op2 > J->loopref) irt_setphi(IR(ir->op2)->t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Protected callback for split pass. */[m
[31m-static TValue *cpsplit(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  jit_State *J = (jit_State *)ud;[m
[31m-  split_ir(J);[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#if defined(LUA_USE_ASSERT) || LJ_SOFTFP[m
[31m-/* Slow, but sure way to check whether a SPLIT pass is needed. */[m
[31m-static int split_needsplit(jit_State *J)[m
[31m-{[m
[31m-  IRIns *ir, *irend;[m
[31m-  IRRef ref;[m
[31m-  for (ir = IR(REF_FIRST), irend = IR(J->cur.nins); ir < irend; ir++)[m
[31m-    if (LJ_SOFTFP ? irt_is64orfp(ir->t) : irt_isint64(ir->t))[m
[31m-      return 1;[m
[31m-  if (LJ_SOFTFP) {[m
[31m-    for (ref = J->chain[IR_SLOAD]; ref; ref = IR(ref)->prev)[m
[31m-      if ((IR(ref)->op2 & IRSLOAD_CONVERT))[m
[31m-	return 1;[m
[31m-    if (J->chain[IR_TOBIT])[m
[31m-      return 1;[m
[31m-  }[m
[31m-  for (ref = J->chain[IR_CONV]; ref; ref = IR(ref)->prev) {[m
[31m-    IRType st = (IR(ref)->op2 & IRCONV_SRCMASK);[m
[31m-    if ((LJ_SOFTFP && (st == IRT_NUM || st == IRT_FLOAT)) ||[m
[31m-	st == IRT_I64 || st == IRT_U64)[m
[31m-      return 1;[m
[31m-  }[m
[31m-  return 0;  /* Nope. */[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* SPLIT pass. */[m
[31m-void lj_opt_split(jit_State *J)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  if (!J->needsplit)[m
[31m-    J->needsplit = split_needsplit(J);[m
[31m-#else[m
[31m-  lua_assert(J->needsplit >= split_needsplit(J));  /* Verify flag. */[m
[31m-#endif[m
[31m-  if (J->needsplit) {[m
[31m-    int errcode = lj_vm_cpcall(J->L, NULL, J, cpsplit);[m
[31m-    if (errcode) {[m
[31m-      /* Completely reset the trace to avoid inconsistent dump on abort. */[m
[31m-      J->cur.nins = J->cur.nk = REF_BASE;[m
[31m-      J->cur.nsnap = 0;[m
[31m-      lj_err_throw(J->L, errcode);  /* Propagate errors. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.c[m
[1mdeleted file mode 100644[m
[1mindex 610c861..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.c[m
[1m+++ /dev/null[m
[36m@@ -1,2725 +0,0 @@[m
[31m-/*[m
[31m-** Lua parser (source code -> bytecode).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_parse_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_parse.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_vmevent.h"[m
[31m-[m
[31m-/* -- Parser structures and definitions ----------------------------------- */[m
[31m-[m
[31m-/* Expression kinds. */[m
[31m-typedef enum {[m
[31m-  /* Constant expressions must be first and in this order: */[m
[31m-  VKNIL,[m
[31m-  VKFALSE,[m
[31m-  VKTRUE,[m
[31m-  VKSTR,	/* sval = string value */[m
[31m-  VKNUM,	/* nval = number value */[m
[31m-  VKLAST = VKNUM,[m
[31m-  VKCDATA,	/* nval = cdata value, not treated as a constant expression */[m
[31m-  /* Non-constant expressions follow: */[m
[31m-  VLOCAL,	/* info = local register, aux = vstack index */[m
[31m-  VUPVAL,	/* info = upvalue index, aux = vstack index */[m
[31m-  VGLOBAL,	/* sval = string value */[m
[31m-  VINDEXED,	/* info = table register, aux = index reg/byte/string const */[m
[31m-  VJMP,		/* info = instruction PC */[m
[31m-  VRELOCABLE,	/* info = instruction PC */[m
[31m-  VNONRELOC,	/* info = result register */[m
[31m-  VCALL,	/* info = instruction PC, aux = base */[m
[31m-  VVOID[m
[31m-} ExpKind;[m
[31m-[m
[31m-/* Expression descriptor. */[m
[31m-typedef struct ExpDesc {[m
[31m-  union {[m
[31m-    struct {[m
[31m-      uint32_t info;	/* Primary info. */[m
[31m-      uint32_t aux;	/* Secondary info. */[m
[31m-    } s;[m
[31m-    TValue nval;	/* Number value. */[m
[31m-    GCstr *sval;	/* String value. */[m
[31m-  } u;[m
[31m-  ExpKind k;[m
[31m-  BCPos t;		/* True condition jump list. */[m
[31m-  BCPos f;		/* False condition jump list. */[m
[31m-} ExpDesc;[m
[31m-[m
[31m-/* Macros for expressions. */[m
[31m-#define expr_hasjump(e)		((e)->t != (e)->f)[m
[31m-[m
[31m-#define expr_isk(e)		((e)->k <= VKLAST)[m
[31m-#define expr_isk_nojump(e)	(expr_isk(e) && !expr_hasjump(e))[m
[31m-#define expr_isnumk(e)		((e)->k == VKNUM)[m
[31m-#define expr_isnumk_nojump(e)	(expr_isnumk(e) && !expr_hasjump(e))[m
[31m-#define expr_isstrk(e)		((e)->k == VKSTR)[m
[31m-[m
[31m-#define expr_numtv(e)		check_exp(expr_isnumk((e)), &(e)->u.nval)[m
[31m-#define expr_numberV(e)		numberVnum(expr_numtv((e)))[m
[31m-[m
[31m-/* Initialize expression. */[m
[31m-static LJ_AINLINE void expr_init(ExpDesc *e, ExpKind k, uint32_t info)[m
[31m-{[m
[31m-  e->k = k;[m
[31m-  e->u.s.info = info;[m
[31m-  e->f = e->t = NO_JMP;[m
[31m-}[m
[31m-[m
[31m-/* Check number constant for +-0. */[m
[31m-static int expr_numiszero(ExpDesc *e)[m
[31m-{[m
[31m-  TValue *o = expr_numtv(e);[m
[31m-  return tvisint(o) ? (intV(o) == 0) : tviszero(o);[m
[31m-}[m
[31m-[m
[31m-/* Per-function linked list of scope blocks. */[m
[31m-typedef struct FuncScope {[m
[31m-  struct FuncScope *prev;	/* Link to outer scope. */[m
[31m-  MSize vstart;			/* Start of block-local variables. */[m
[31m-  uint8_t nactvar;		/* Number of active vars outside the scope. */[m
[31m-  uint8_t flags;		/* Scope flags. */[m
[31m-} FuncScope;[m
[31m-[m
[31m-#define FSCOPE_LOOP		0x01	/* Scope is a (breakable) loop. */[m
[31m-#define FSCOPE_BREAK		0x02	/* Break used in scope. */[m
[31m-#define FSCOPE_GOLA		0x04	/* Goto or label used in scope. */[m
[31m-#define FSCOPE_UPVAL		0x08	/* Upvalue in scope. */[m
[31m-#define FSCOPE_NOCLOSE		0x10	/* Do not close upvalues. */[m
[31m-[m
[31m-#define NAME_BREAK		((GCstr *)(uintptr_t)1)[m
[31m-[m
[31m-/* Index into variable stack. */[m
[31m-typedef uint16_t VarIndex;[m
[31m-#define LJ_MAX_VSTACK		(65536 - LJ_MAX_UPVAL)[m
[31m-[m
[31m-/* Variable/goto/label info. */[m
[31m-#define VSTACK_VAR_RW		0x01	/* R/W variable. */[m
[31m-#define VSTACK_GOTO		0x02	/* Pending goto. */[m
[31m-#define VSTACK_LABEL		0x04	/* Label. */[m
[31m-[m
[31m-/* Per-function state. */[m
[31m-typedef struct FuncState {[m
[31m-  GCtab *kt;			/* Hash table for constants. */[m
[31m-  LexState *ls;			/* Lexer state. */[m
[31m-  lua_State *L;			/* Lua state. */[m
[31m-  FuncScope *bl;		/* Current scope. */[m
[31m-  struct FuncState *prev;	/* Enclosing function. */[m
[31m-  BCPos pc;			/* Next bytecode position. */[m
[31m-  BCPos lasttarget;		/* Bytecode position of last jump target. */[m
[31m-  BCPos jpc;			/* Pending jump list to next bytecode. */[m
[31m-  BCReg freereg;		/* First free register. */[m
[31m-  BCReg nactvar;		/* Number of active local variables. */[m
[31m-  BCReg nkn, nkgc;		/* Number of lua_Number/GCobj constants */[m
[31m-  BCLine linedefined;		/* First line of the function definition. */[m
[31m-  BCInsLine *bcbase;		/* Base of bytecode stack. */[m
[31m-  BCPos bclim;			/* Limit of bytecode stack. */[m
[31m-  MSize vbase;			/* Base of variable stack for this function. */[m
[31m-  uint8_t flags;		/* Prototype flags. */[m
[31m-  uint8_t numparams;		/* Number of parameters. */[m
[31m-  uint8_t framesize;		/* Fixed frame size. */[m
[31m-  uint8_t nuv;			/* Number of upvalues */[m
[31m-  VarIndex varmap[LJ_MAX_LOCVAR];  /* Map from register to variable idx. */[m
[31m-  VarIndex uvmap[LJ_MAX_UPVAL];	/* Map from upvalue to variable idx. */[m
[31m-  VarIndex uvtmp[LJ_MAX_UPVAL];	/* Temporary upvalue map. */[m
[31m-} FuncState;[m
[31m-[m
[31m-/* Binary and unary operators. ORDER OPR */[m
[31m-typedef enum BinOpr {[m
[31m-  OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,  /* ORDER ARITH */[m
[31m-  OPR_CONCAT,[m
[31m-  OPR_NE, OPR_EQ,[m
[31m-  OPR_LT, OPR_GE, OPR_LE, OPR_GT,[m
[31m-  OPR_AND, OPR_OR,[m
[31m-  OPR_NOBINOPR[m
[31m-} BinOpr;[m
[31m-[m
[31m-LJ_STATIC_ASSERT((int)BC_ISGE-(int)BC_ISLT == (int)OPR_GE-(int)OPR_LT);[m
[31m-LJ_STATIC_ASSERT((int)BC_ISLE-(int)BC_ISLT == (int)OPR_LE-(int)OPR_LT);[m
[31m-LJ_STATIC_ASSERT((int)BC_ISGT-(int)BC_ISLT == (int)OPR_GT-(int)OPR_LT);[m
[31m-LJ_STATIC_ASSERT((int)BC_SUBVV-(int)BC_ADDVV == (int)OPR_SUB-(int)OPR_ADD);[m
[31m-LJ_STATIC_ASSERT((int)BC_MULVV-(int)BC_ADDVV == (int)OPR_MUL-(int)OPR_ADD);[m
[31m-LJ_STATIC_ASSERT((int)BC_DIVVV-(int)BC_ADDVV == (int)OPR_DIV-(int)OPR_ADD);[m
[31m-LJ_STATIC_ASSERT((int)BC_MODVV-(int)BC_ADDVV == (int)OPR_MOD-(int)OPR_ADD);[m
[31m-[m
[31m-/* -- Error handling ------------------------------------------------------ */[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em)[m
[31m-{[m
[31m-  lj_lex_error(ls, ls->tok, em);[m
[31m-}[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken tok)[m
[31m-{[m
[31m-  lj_lex_error(ls, ls->tok, LJ_ERR_XTOKEN, lj_lex_token2str(ls, tok));[m
[31m-}[m
[31m-[m
[31m-LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what)[m
[31m-{[m
[31m-  if (fs->linedefined == 0)[m
[31m-    lj_lex_error(fs->ls, 0, LJ_ERR_XLIMM, limit, what);[m
[31m-  else[m
[31m-    lj_lex_error(fs->ls, 0, LJ_ERR_XLIMF, fs->linedefined, limit, what);[m
[31m-}[m
[31m-[m
[31m-#define checklimit(fs, v, l, m)		if ((v) >= (l)) err_limit(fs, l, m)[m
[31m-#define checklimitgt(fs, v, l, m)	if ((v) > (l)) err_limit(fs, l, m)[m
[31m-#define checkcond(ls, c, em)		{ if (!(c)) err_syntax(ls, em); }[m
[31m-[m
[31m-/* -- Management of constants --------------------------------------------- */[m
[31m-[m
[31m-/* Return bytecode encoding for primitive constant. */[m
[31m-#define const_pri(e)		check_exp((e)->k <= VKTRUE, (e)->k)[m
[31m-[m
[31m-#define tvhaskslot(o)	((o)->u32.hi == 0)[m
[31m-#define tvkslot(o)	((o)->u32.lo)[m
[31m-[m
[31m-/* Add a number constant. */[m
[31m-static BCReg const_num(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  lua_State *L = fs->L;[m
[31m-  TValue *o;[m
[31m-  lua_assert(expr_isnumk(e));[m
[31m-  o = lj_tab_set(L, fs->kt, &e->u.nval);[m
[31m-  if (tvhaskslot(o))[m
[31m-    return tvkslot(o);[m
[31m-  o->u64 = fs->nkn;[m
[31m-  return fs->nkn++;[m
[31m-}[m
[31m-[m
[31m-/* Add a GC object constant. */[m
[31m-static BCReg const_gc(FuncState *fs, GCobj *gc, uint32_t itype)[m
[31m-{[m
[31m-  lua_State *L = fs->L;[m
[31m-  TValue key, *o;[m
[31m-  setgcV(L, &key, gc, itype);[m
[31m-  /* NOBARRIER: the key is new or kept alive. */[m
[31m-  o = lj_tab_set(L, fs->kt, &key);[m
[31m-  if (tvhaskslot(o))[m
[31m-    return tvkslot(o);[m
[31m-  o->u64 = fs->nkgc;[m
[31m-  return fs->nkgc++;[m
[31m-}[m
[31m-[m
[31m-/* Add a string constant. */[m
[31m-static BCReg const_str(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  lua_assert(expr_isstrk(e) || e->k == VGLOBAL);[m
[31m-  return const_gc(fs, obj2gco(e->u.sval), LJ_TSTR);[m
[31m-}[m
[31m-[m
[31m-/* Anchor string constant to avoid GC. */[m
[31m-GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t len)[m
[31m-{[m
[31m-  /* NOBARRIER: the key is new or kept alive. */[m
[31m-  lua_State *L = ls->L;[m
[31m-  GCstr *s = lj_str_new(L, str, len);[m
[31m-  TValue *tv = lj_tab_setstr(L, ls->fs->kt, s);[m
[31m-  if (tvisnil(tv)) setboolV(tv, 1);[m
[31m-  lj_gc_check(L);[m
[31m-  return s;[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Anchor cdata to avoid GC. */[m
[31m-void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd)[m
[31m-{[m
[31m-  /* NOBARRIER: the key is new or kept alive. */[m
[31m-  lua_State *L = ls->L;[m
[31m-  setcdataV(L, tv, cd);[m
[31m-  setboolV(lj_tab_set(L, ls->fs->kt, tv), 1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Jump list handling -------------------------------------------------- */[m
[31m-[m
[31m-/* Get next element in jump list. */[m
[31m-static BCPos jmp_next(FuncState *fs, BCPos pc)[m
[31m-{[m
[31m-  ptrdiff_t delta = bc_j(fs->bcbase[pc].ins);[m
[31m-  if ((BCPos)delta == NO_JMP)[m
[31m-    return NO_JMP;[m
[31m-  else[m
[31m-    return (BCPos)(((ptrdiff_t)pc+1)+delta);[m
[31m-}[m
[31m-[m
[31m-/* Check if any of the instructions on the jump list produce no value. */[m
[31m-static int jmp_novalue(FuncState *fs, BCPos list)[m
[31m-{[m
[31m-  for (; list != NO_JMP; list = jmp_next(fs, list)) {[m
[31m-    BCIns p = fs->bcbase[list >= 1 ? list-1 : list].ins;[m
[31m-    if (!(bc_op(p) == BC_ISTC || bc_op(p) == BC_ISFC || bc_a(p) == NO_REG))[m
[31m-      return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Patch register of test instructions. */[m
[31m-static int jmp_patchtestreg(FuncState *fs, BCPos pc, BCReg reg)[m
[31m-{[m
[31m-  BCInsLine *ilp = &fs->bcbase[pc >= 1 ? pc-1 : pc];[m
[31m-  BCOp op = bc_op(ilp->ins);[m
[31m-  if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-    if (reg != NO_REG && reg != bc_d(ilp->ins)) {[m
[31m-      setbc_a(&ilp->ins, reg);[m
[31m-    } else {  /* Nothing to store or already in the right register. */[m
[31m-      setbc_op(&ilp->ins, op+(BC_IST-BC_ISTC));[m
[31m-      setbc_a(&ilp->ins, 0);[m
[31m-    }[m
[31m-  } else if (bc_a(ilp->ins) == NO_REG) {[m
[31m-    if (reg == NO_REG) {[m
[31m-      ilp->ins = BCINS_AJ(BC_JMP, bc_a(fs->bcbase[pc].ins), 0);[m
[31m-    } else {[m
[31m-      setbc_a(&ilp->ins, reg);[m
[31m-      if (reg >= bc_a(ilp[1].ins))[m
[31m-	setbc_a(&ilp[1].ins, reg+1);[m
[31m-    }[m
[31m-  } else {[m
[31m-    return 0;  /* Cannot patch other instructions. */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Drop values for all instructions on jump list. */[m
[31m-static void jmp_dropval(FuncState *fs, BCPos list)[m
[31m-{[m
[31m-  for (; list != NO_JMP; list = jmp_next(fs, list))[m
[31m-    jmp_patchtestreg(fs, list, NO_REG);[m
[31m-}[m
[31m-[m
[31m-/* Patch jump instruction to target. */[m
[31m-static void jmp_patchins(FuncState *fs, BCPos pc, BCPos dest)[m
[31m-{[m
[31m-  BCIns *jmp = &fs->bcbase[pc].ins;[m
[31m-  BCPos offset = dest-(pc+1)+BCBIAS_J;[m
[31m-  lua_assert(dest != NO_JMP);[m
[31m-  if (offset > BCMAX_D)[m
[31m-    err_syntax(fs->ls, LJ_ERR_XJUMP);[m
[31m-  setbc_d(jmp, offset);[m
[31m-}[m
[31m-[m
[31m-/* Append to jump list. */[m
[31m-static void jmp_append(FuncState *fs, BCPos *l1, BCPos l2)[m
[31m-{[m
[31m-  if (l2 == NO_JMP) {[m
[31m-    return;[m
[31m-  } else if (*l1 == NO_JMP) {[m
[31m-    *l1 = l2;[m
[31m-  } else {[m
[31m-    BCPos list = *l1;[m
[31m-    BCPos next;[m
[31m-    while ((next = jmp_next(fs, list)) != NO_JMP)  /* Find last element. */[m
[31m-      list = next;[m
[31m-    jmp_patchins(fs, list, l2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Patch jump list and preserve produced values. */[m
[31m-static void jmp_patchval(FuncState *fs, BCPos list, BCPos vtarget,[m
[31m-			 BCReg reg, BCPos dtarget)[m
[31m-{[m
[31m-  while (list != NO_JMP) {[m
[31m-    BCPos next = jmp_next(fs, list);[m
[31m-    if (jmp_patchtestreg(fs, list, reg))[m
[31m-      jmp_patchins(fs, list, vtarget);  /* Jump to target with value. */[m
[31m-    else[m
[31m-      jmp_patchins(fs, list, dtarget);  /* Jump to default target. */[m
[31m-    list = next;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Jump to following instruction. Append to list of pending jumps. */[m
[31m-static void jmp_tohere(FuncState *fs, BCPos list)[m
[31m-{[m
[31m-  fs->lasttarget = fs->pc;[m
[31m-  jmp_append(fs, &fs->jpc, list);[m
[31m-}[m
[31m-[m
[31m-/* Patch jump list to target. */[m
[31m-static void jmp_patch(FuncState *fs, BCPos list, BCPos target)[m
[31m-{[m
[31m-  if (target == fs->pc) {[m
[31m-    jmp_tohere(fs, list);[m
[31m-  } else {[m
[31m-    lua_assert(target < fs->pc);[m
[31m-    jmp_patchval(fs, list, target, NO_REG, target);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode register allocator ----------------------------------------- */[m
[31m-[m
[31m-/* Bump frame size. */[m
[31m-static void bcreg_bump(FuncState *fs, BCReg n)[m
[31m-{[m
[31m-  BCReg sz = fs->freereg + n;[m
[31m-  if (sz > fs->framesize) {[m
[31m-    if (sz >= LJ_MAX_SLOTS)[m
[31m-      err_syntax(fs->ls, LJ_ERR_XSLOTS);[m
[31m-    fs->framesize = (uint8_t)sz;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Reserve registers. */[m
[31m-static void bcreg_reserve(FuncState *fs, BCReg n)[m
[31m-{[m
[31m-  bcreg_bump(fs, n);[m
[31m-  fs->freereg += n;[m
[31m-}[m
[31m-[m
[31m-/* Free register. */[m
[31m-static void bcreg_free(FuncState *fs, BCReg reg)[m
[31m-{[m
[31m-  if (reg >= fs->nactvar) {[m
[31m-    fs->freereg--;[m
[31m-    lua_assert(reg == fs->freereg);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free register for expression. */[m
[31m-static void expr_free(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  if (e->k == VNONRELOC)[m
[31m-    bcreg_free(fs, e->u.s.info);[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode emitter ---------------------------------------------------- */[m
[31m-[m
[31m-/* Emit bytecode instruction. */[m
[31m-static BCPos bcemit_INS(FuncState *fs, BCIns ins)[m
[31m-{[m
[31m-  BCPos pc = fs->pc;[m
[31m-  LexState *ls = fs->ls;[m
[31m-  jmp_patchval(fs, fs->jpc, pc, NO_REG, pc);[m
[31m-  fs->jpc = NO_JMP;[m
[31m-  if (LJ_UNLIKELY(pc >= fs->bclim)) {[m
[31m-    ptrdiff_t base = fs->bcbase - ls->bcstack;[m
[31m-    checklimit(fs, ls->sizebcstack, LJ_MAX_BCINS, "bytecode instructions");[m
[31m-    lj_mem_growvec(fs->L, ls->bcstack, ls->sizebcstack, LJ_MAX_BCINS,BCInsLine);[m
[31m-    fs->bclim = (BCPos)(ls->sizebcstack - base);[m
[31m-    fs->bcbase = ls->bcstack + base;[m
[31m-  }[m
[31m-  fs->bcbase[pc].ins = ins;[m
[31m-  fs->bcbase[pc].line = ls->lastline;[m
[31m-  fs->pc = pc+1;[m
[31m-  return pc;[m
[31m-}[m
[31m-[m
[31m-#define bcemit_ABC(fs, o, a, b, c)	bcemit_INS(fs, BCINS_ABC(o, a, b, c))[m
[31m-#define bcemit_AD(fs, o, a, d)		bcemit_INS(fs, BCINS_AD(o, a, d))[m
[31m-#define bcemit_AJ(fs, o, a, j)		bcemit_INS(fs, BCINS_AJ(o, a, j))[m
[31m-[m
[31m-#define bcptr(fs, e)			(&(fs)->bcbase[(e)->u.s.info].ins)[m
[31m-[m
[31m-/* -- Bytecode emitter for expressions ------------------------------------ */[m
[31m-[m
[31m-/* Discharge non-constant expression to any register. */[m
[31m-static void expr_discharge(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  BCIns ins;[m
[31m-  if (e->k == VUPVAL) {[m
[31m-    ins = BCINS_AD(BC_UGET, 0, e->u.s.info);[m
[31m-  } else if (e->k == VGLOBAL) {[m
[31m-    ins = BCINS_AD(BC_GGET, 0, const_str(fs, e));[m
[31m-  } else if (e->k == VINDEXED) {[m
[31m-    BCReg rc = e->u.s.aux;[m
[31m-    if ((int32_t)rc < 0) {[m
[31m-      ins = BCINS_ABC(BC_TGETS, 0, e->u.s.info, ~rc);[m
[31m-    } else if (rc > BCMAX_C) {[m
[31m-      ins = BCINS_ABC(BC_TGETB, 0, e->u.s.info, rc-(BCMAX_C+1));[m
[31m-    } else {[m
[31m-      bcreg_free(fs, rc);[m
[31m-      ins = BCINS_ABC(BC_TGETV, 0, e->u.s.info, rc);[m
[31m-    }[m
[31m-    bcreg_free(fs, e->u.s.info);[m
[31m-  } else if (e->k == VCALL) {[m
[31m-    e->u.s.info = e->u.s.aux;[m
[31m-    e->k = VNONRELOC;[m
[31m-    return;[m
[31m-  } else if (e->k == VLOCAL) {[m
[31m-    e->k = VNONRELOC;[m
[31m-    return;[m
[31m-  } else {[m
[31m-    return;[m
[31m-  }[m
[31m-  e->u.s.info = bcemit_INS(fs, ins);[m
[31m-  e->k = VRELOCABLE;[m
[31m-}[m
[31m-[m
[31m-/* Emit bytecode to set a range of registers to nil. */[m
[31m-static void bcemit_nil(FuncState *fs, BCReg from, BCReg n)[m
[31m-{[m
[31m-  if (fs->pc > fs->lasttarget) {  /* No jumps to current position? */[m
[31m-    BCIns *ip = &fs->bcbase[fs->pc-1].ins;[m
[31m-    BCReg pto, pfrom = bc_a(*ip);[m
[31m-    switch (bc_op(*ip)) {  /* Try to merge with the previous instruction. */[m
[31m-    case BC_KPRI:[m
[31m-      if (bc_d(*ip) != ~LJ_TNIL) break;[m
[31m-      if (from == pfrom) {[m
[31m-	if (n == 1) return;[m
[31m-      } else if (from == pfrom+1) {[m
[31m-	from = pfrom;[m
[31m-	n++;[m
[31m-      } else {[m
[31m-	break;[m
[31m-      }[m
[31m-      *ip = BCINS_AD(BC_KNIL, from, from+n-1);  /* Replace KPRI. */[m
[31m-      return;[m
[31m-    case BC_KNIL:[m
[31m-      pto = bc_d(*ip);[m
[31m-      if (pfrom <= from && from <= pto+1) {  /* Can we connect both ranges? */[m
[31m-	if (from+n-1 > pto)[m
[31m-	  setbc_d(ip, from+n-1);  /* Patch previous instruction range. */[m
[31m-	return;[m
[31m-      }[m
[31m-      break;[m
[31m-    default:[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Emit new instruction or replace old instruction. */[m
[31m-  bcemit_INS(fs, n == 1 ? BCINS_AD(BC_KPRI, from, VKNIL) :[m
[31m-			  BCINS_AD(BC_KNIL, from, from+n-1));[m
[31m-}[m
[31m-[m
[31m-/* Discharge an expression to a specific register. Ignore branches. */[m
[31m-static void expr_toreg_nobranch(FuncState *fs, ExpDesc *e, BCReg reg)[m
[31m-{[m
[31m-  BCIns ins;[m
[31m-  expr_discharge(fs, e);[m
[31m-  if (e->k == VKSTR) {[m
[31m-    ins = BCINS_AD(BC_KSTR, reg, const_str(fs, e));[m
[31m-  } else if (e->k == VKNUM) {[m
[31m-#if LJ_DUALNUM[m
[31m-    cTValue *tv = expr_numtv(e);[m
[31m-    if (tvisint(tv) && checki16(intV(tv)))[m
[31m-      ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)intV(tv));[m
[31m-    else[m
[31m-#else[m
[31m-    lua_Number n = expr_numberV(e);[m
[31m-    int32_t k = lj_num2int(n);[m
[31m-    if (checki16(k) && n == (lua_Number)k)[m
[31m-      ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k);[m
[31m-    else[m
[31m-#endif[m
[31m-      ins = BCINS_AD(BC_KNUM, reg, const_num(fs, e));[m
[31m-#if LJ_HASFFI[m
[31m-  } else if (e->k == VKCDATA) {[m
[31m-    fs->flags |= PROTO_FFI;[m
[31m-    ins = BCINS_AD(BC_KCDATA, reg,[m
[31m-		   const_gc(fs, obj2gco(cdataV(&e->u.nval)), LJ_TCDATA));[m
[31m-#endif[m
[31m-  } else if (e->k == VRELOCABLE) {[m
[31m-    setbc_a(bcptr(fs, e), reg);[m
[31m-    goto noins;[m
[31m-  } else if (e->k == VNONRELOC) {[m
[31m-    if (reg == e->u.s.info)[m
[31m-      goto noins;[m
[31m-    ins = BCINS_AD(BC_MOV, reg, e->u.s.info);[m
[31m-  } else if (e->k == VKNIL) {[m
[31m-    bcemit_nil(fs, reg, 1);[m
[31m-    goto noins;[m
[31m-  } else if (e->k <= VKTRUE) {[m
[31m-    ins = BCINS_AD(BC_KPRI, reg, const_pri(e));[m
[31m-  } else {[m
[31m-    lua_assert(e->k == VVOID || e->k == VJMP);[m
[31m-    return;[m
[31m-  }[m
[31m-  bcemit_INS(fs, ins);[m
[31m-noins:[m
[31m-  e->u.s.info = reg;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static BCPos bcemit_jmp(FuncState *fs);[m
[31m-[m
[31m-/* Discharge an expression to a specific register. */[m
[31m-static void expr_toreg(FuncState *fs, ExpDesc *e, BCReg reg)[m
[31m-{[m
[31m-  expr_toreg_nobranch(fs, e, reg);[m
[31m-  if (e->k == VJMP)[m
[31m-    jmp_append(fs, &e->t, e->u.s.info);  /* Add it to the true jump list. */[m
[31m-  if (expr_hasjump(e)) {  /* Discharge expression with branches. */[m
[31m-    BCPos jend, jfalse = NO_JMP, jtrue = NO_JMP;[m
[31m-    if (jmp_novalue(fs, e->t) || jmp_novalue(fs, e->f)) {[m
[31m-      BCPos jval = (e->k == VJMP) ? NO_JMP : bcemit_jmp(fs);[m
[31m-      jfalse = bcemit_AD(fs, BC_KPRI, reg, VKFALSE);[m
[31m-      bcemit_AJ(fs, BC_JMP, fs->freereg, 1);[m
[31m-      jtrue = bcemit_AD(fs, BC_KPRI, reg, VKTRUE);[m
[31m-      jmp_tohere(fs, jval);[m
[31m-    }[m
[31m-    jend = fs->pc;[m
[31m-    fs->lasttarget = jend;[m
[31m-    jmp_patchval(fs, e->f, jend, reg, jfalse);[m
[31m-    jmp_patchval(fs, e->t, jend, reg, jtrue);[m
[31m-  }[m
[31m-  e->f = e->t = NO_JMP;[m
[31m-  e->u.s.info = reg;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-/* Discharge an expression to the next free register. */[m
[31m-static void expr_tonextreg(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  expr_discharge(fs, e);[m
[31m-  expr_free(fs, e);[m
[31m-  bcreg_reserve(fs, 1);[m
[31m-  expr_toreg(fs, e, fs->freereg - 1);[m
[31m-}[m
[31m-[m
[31m-/* Discharge an expression to any register. */[m
[31m-static BCReg expr_toanyreg(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  expr_discharge(fs, e);[m
[31m-  if (e->k == VNONRELOC) {[m
[31m-    if (!expr_hasjump(e)) return e->u.s.info;  /* Already in a register. */[m
[31m-    if (e->u.s.info >= fs->nactvar) {[m
[31m-      expr_toreg(fs, e, e->u.s.info);  /* Discharge to temp. register. */[m
[31m-      return e->u.s.info;[m
[31m-    }[m
[31m-  }[m
[31m-  expr_tonextreg(fs, e);  /* Discharge to next register. */[m
[31m-  return e->u.s.info;[m
[31m-}[m
[31m-[m
[31m-/* Partially discharge expression to a value. */[m
[31m-static void expr_toval(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  if (expr_hasjump(e))[m
[31m-    expr_toanyreg(fs, e);[m
[31m-  else[m
[31m-    expr_discharge(fs, e);[m
[31m-}[m
[31m-[m
[31m-/* Emit store for LHS expression. */[m
[31m-static void bcemit_store(FuncState *fs, ExpDesc *var, ExpDesc *e)[m
[31m-{[m
[31m-  BCIns ins;[m
[31m-  if (var->k == VLOCAL) {[m
[31m-    fs->ls->vstack[var->u.s.aux].info |= VSTACK_VAR_RW;[m
[31m-    expr_free(fs, e);[m
[31m-    expr_toreg(fs, e, var->u.s.info);[m
[31m-    return;[m
[31m-  } else if (var->k == VUPVAL) {[m
[31m-    fs->ls->vstack[var->u.s.aux].info |= VSTACK_VAR_RW;[m
[31m-    expr_toval(fs, e);[m
[31m-    if (e->k <= VKTRUE)[m
[31m-      ins = BCINS_AD(BC_USETP, var->u.s.info, const_pri(e));[m
[31m-    else if (e->k == VKSTR)[m
[31m-      ins = BCINS_AD(BC_USETS, var->u.s.info, const_str(fs, e));[m
[31m-    else if (e->k == VKNUM)[m
[31m-      ins = BCINS_AD(BC_USETN, var->u.s.info, const_num(fs, e));[m
[31m-    else[m
[31m-      ins = BCINS_AD(BC_USETV, var->u.s.info, expr_toanyreg(fs, e));[m
[31m-  } else if (var->k == VGLOBAL) {[m
[31m-    BCReg ra = expr_toanyreg(fs, e);[m
[31m-    ins = BCINS_AD(BC_GSET, ra, const_str(fs, var));[m
[31m-  } else {[m
[31m-    BCReg ra, rc;[m
[31m-    lua_assert(var->k == VINDEXED);[m
[31m-    ra = expr_toanyreg(fs, e);[m
[31m-    rc = var->u.s.aux;[m
[31m-    if ((int32_t)rc < 0) {[m
[31m-      ins = BCINS_ABC(BC_TSETS, ra, var->u.s.info, ~rc);[m
[31m-    } else if (rc > BCMAX_C) {[m
[31m-      ins = BCINS_ABC(BC_TSETB, ra, var->u.s.info, rc-(BCMAX_C+1));[m
[31m-    } else {[m
[31m-      /* Free late alloced key reg to avoid assert on free of value reg. */[m
[31m-      /* This can only happen when called from expr_table(). */[m
[31m-      lua_assert(e->k != VNONRELOC || ra < fs->nactvar ||[m
[31m-		 rc < ra || (bcreg_free(fs, rc),1));[m
[31m-      ins = BCINS_ABC(BC_TSETV, ra, var->u.s.info, rc);[m
[31m-    }[m
[31m-  }[m
[31m-  bcemit_INS(fs, ins);[m
[31m-  expr_free(fs, e);[m
[31m-}[m
[31m-[m
[31m-/* Emit method lookup expression. */[m
[31m-static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key)[m
[31m-{[m
[31m-  BCReg idx, func, obj = expr_toanyreg(fs, e);[m
[31m-  expr_free(fs, e);[m
[31m-  func = fs->freereg;[m
[31m-  bcemit_AD(fs, BC_MOV, func+1+LJ_FR2, obj);  /* Copy object to 1st argument. */[m
[31m-  lua_assert(expr_isstrk(key));[m
[31m-  idx = const_str(fs, key);[m
[31m-  if (idx <= BCMAX_C) {[m
[31m-    bcreg_reserve(fs, 2+LJ_FR2);[m
[31m-    bcemit_ABC(fs, BC_TGETS, func, obj, idx);[m
[31m-  } else {[m
[31m-    bcreg_reserve(fs, 3+LJ_FR2);[m
[31m-    bcemit_AD(fs, BC_KSTR, func+2+LJ_FR2, idx);[m
[31m-    bcemit_ABC(fs, BC_TGETV, func, obj, func+2+LJ_FR2);[m
[31m-    fs->freereg--;[m
[31m-  }[m
[31m-  e->u.s.info = func;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode emitter for branches --------------------------------------- */[m
[31m-[m
[31m-/* Emit unconditional branch. */[m
[31m-static BCPos bcemit_jmp(FuncState *fs)[m
[31m-{[m
[31m-  BCPos jpc = fs->jpc;[m
[31m-  BCPos j = fs->pc - 1;[m
[31m-  BCIns *ip = &fs->bcbase[j].ins;[m
[31m-  fs->jpc = NO_JMP;[m
[31m-  if ((int32_t)j >= (int32_t)fs->lasttarget && bc_op(*ip) == BC_UCLO) {[m
[31m-    setbc_j(ip, NO_JMP);[m
[31m-    fs->lasttarget = j+1;[m
[31m-  } else {[m
[31m-    j = bcemit_AJ(fs, BC_JMP, fs->freereg, NO_JMP);[m
[31m-  }[m
[31m-  jmp_append(fs, &j, jpc);[m
[31m-  return j;[m
[31m-}[m
[31m-[m
[31m-/* Invert branch condition of bytecode instruction. */[m
[31m-static void invertcond(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  BCIns *ip = &fs->bcbase[e->u.s.info - 1].ins;[m
[31m-  setbc_op(ip, bc_op(*ip)^1);[m
[31m-}[m
[31m-[m
[31m-/* Emit conditional branch. */[m
[31m-static BCPos bcemit_branch(FuncState *fs, ExpDesc *e, int cond)[m
[31m-{[m
[31m-  BCPos pc;[m
[31m-  if (e->k == VRELOCABLE) {[m
[31m-    BCIns *ip = bcptr(fs, e);[m
[31m-    if (bc_op(*ip) == BC_NOT) {[m
[31m-      *ip = BCINS_AD(cond ? BC_ISF : BC_IST, 0, bc_d(*ip));[m
[31m-      return bcemit_jmp(fs);[m
[31m-    }[m
[31m-  }[m
[31m-  if (e->k != VNONRELOC) {[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-    expr_toreg_nobranch(fs, e, fs->freereg-1);[m
[31m-  }[m
[31m-  bcemit_AD(fs, cond ? BC_ISTC : BC_ISFC, NO_REG, e->u.s.info);[m
[31m-  pc = bcemit_jmp(fs);[m
[31m-  expr_free(fs, e);[m
[31m-  return pc;[m
[31m-}[m
[31m-[m
[31m-/* Emit branch on true condition. */[m
[31m-static void bcemit_branch_t(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  BCPos pc;[m
[31m-  expr_discharge(fs, e);[m
[31m-  if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)[m
[31m-    pc = NO_JMP;  /* Never jump. */[m
[31m-  else if (e->k == VJMP)[m
[31m-    invertcond(fs, e), pc = e->u.s.info;[m
[31m-  else if (e->k == VKFALSE || e->k == VKNIL)[m
[31m-    expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);[m
[31m-  else[m
[31m-    pc = bcemit_branch(fs, e, 0);[m
[31m-  jmp_append(fs, &e->f, pc);[m
[31m-  jmp_tohere(fs, e->t);[m
[31m-  e->t = NO_JMP;[m
[31m-}[m
[31m-[m
[31m-/* Emit branch on false condition. */[m
[31m-static void bcemit_branch_f(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  BCPos pc;[m
[31m-  expr_discharge(fs, e);[m
[31m-  if (e->k == VKNIL || e->k == VKFALSE)[m
[31m-    pc = NO_JMP;  /* Never jump. */[m
[31m-  else if (e->k == VJMP)[m
[31m-    pc = e->u.s.info;[m
[31m-  else if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)[m
[31m-    expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);[m
[31m-  else[m
[31m-    pc = bcemit_branch(fs, e, 1);[m
[31m-  jmp_append(fs, &e->t, pc);[m
[31m-  jmp_tohere(fs, e->f);[m
[31m-  e->f = NO_JMP;[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode emitter for operators -------------------------------------- */[m
[31m-[m
[31m-/* Try constant-folding of arithmetic operators. */[m
[31m-static int foldarith(BinOpr opr, ExpDesc *e1, ExpDesc *e2)[m
[31m-{[m
[31m-  TValue o;[m
[31m-  lua_Number n;[m
[31m-  if (!expr_isnumk_nojump(e1) || !expr_isnumk_nojump(e2)) return 0;[m
[31m-  n = lj_vm_foldarith(expr_numberV(e1), expr_numberV(e2), (int)opr-OPR_ADD);[m
[31m-  setnumV(&o, n);[m
[31m-  if (tvisnan(&o) || tvismzero(&o)) return 0;  /* Avoid NaN and -0 as consts. */[m
[31m-  if (LJ_DUALNUM) {[m
[31m-    int32_t k = lj_num2int(n);[m
[31m-    if ((lua_Number)k == n) {[m
[31m-      setintV(&e1->u.nval, k);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  setnumV(&e1->u.nval, n);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Emit arithmetic operator. */[m
[31m-static void bcemit_arith(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)[m
[31m-{[m
[31m-  BCReg rb, rc, t;[m
[31m-  uint32_t op;[m
[31m-  if (foldarith(opr, e1, e2))[m
[31m-    return;[m
[31m-  if (opr == OPR_POW) {[m
[31m-    op = BC_POW;[m
[31m-    rc = expr_toanyreg(fs, e2);[m
[31m-    rb = expr_toanyreg(fs, e1);[m
[31m-  } else {[m
[31m-    op = opr-OPR_ADD+BC_ADDVV;[m
[31m-    /* Must discharge 2nd operand first since VINDEXED might free regs. */[m
[31m-    expr_toval(fs, e2);[m
[31m-    if (expr_isnumk(e2) && (rc = const_num(fs, e2)) <= BCMAX_C)[m
[31m-      op -= BC_ADDVV-BC_ADDVN;[m
[31m-    else[m
[31m-      rc = expr_toanyreg(fs, e2);[m
[31m-    /* 1st operand discharged by bcemit_binop_left, but need KNUM/KSHORT. */[m
[31m-    lua_assert(expr_isnumk(e1) || e1->k == VNONRELOC);[m
[31m-    expr_toval(fs, e1);[m
[31m-    /* Avoid two consts to satisfy bytecode constraints. */[m
[31m-    if (expr_isnumk(e1) && !expr_isnumk(e2) &&[m
[31m-	(t = const_num(fs, e1)) <= BCMAX_B) {[m
[31m-      rb = rc; rc = t; op -= BC_ADDVV-BC_ADDNV;[m
[31m-    } else {[m
[31m-      rb = expr_toanyreg(fs, e1);[m
[31m-    }[m
[31m-  }[m
[31m-  /* Using expr_free might cause asserts if the order is wrong. */[m
[31m-  if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;[m
[31m-  if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;[m
[31m-  e1->u.s.info = bcemit_ABC(fs, op, 0, rb, rc);[m
[31m-  e1->k = VRELOCABLE;[m
[31m-}[m
[31m-[m
[31m-/* Emit comparison operator. */[m
[31m-static void bcemit_comp(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)[m
[31m-{[m
[31m-  ExpDesc *eret = e1;[m
[31m-  BCIns ins;[m
[31m-  expr_toval(fs, e1);[m
[31m-  if (opr == OPR_EQ || opr == OPR_NE) {[m
[31m-    BCOp op = opr == OPR_EQ ? BC_ISEQV : BC_ISNEV;[m
[31m-    BCReg ra;[m
[31m-    if (expr_isk(e1)) { e1 = e2; e2 = eret; }  /* Need constant in 2nd arg. */[m
[31m-    ra = expr_toanyreg(fs, e1);  /* First arg must be in a reg. */[m
[31m-    expr_toval(fs, e2);[m
[31m-    switch (e2->k) {[m
[31m-    case VKNIL: case VKFALSE: case VKTRUE:[m
[31m-      ins = BCINS_AD(op+(BC_ISEQP-BC_ISEQV), ra, const_pri(e2));[m
[31m-      break;[m
[31m-    case VKSTR:[m
[31m-      ins = BCINS_AD(op+(BC_ISEQS-BC_ISEQV), ra, const_str(fs, e2));[m
[31m-      break;[m
[31m-    case VKNUM:[m
[31m-      ins = BCINS_AD(op+(BC_ISEQN-BC_ISEQV), ra, const_num(fs, e2));[m
[31m-      break;[m
[31m-    default:[m
[31m-      ins = BCINS_AD(op, ra, expr_toanyreg(fs, e2));[m
[31m-      break;[m
[31m-    }[m
[31m-  } else {[m
[31m-    uint32_t op = opr-OPR_LT+BC_ISLT;[m
[31m-    BCReg ra, rd;[m
[31m-    if ((op-BC_ISLT) & 1) {  /* GT -> LT, GE -> LE */[m
[31m-      e1 = e2; e2 = eret;  /* Swap operands. */[m
[31m-      op = ((op-BC_ISLT)^3)+BC_ISLT;[m
[31m-      expr_toval(fs, e1);[m
[31m-    }[m
[31m-    rd = expr_toanyreg(fs, e2);[m
[31m-    ra = expr_toanyreg(fs, e1);[m
[31m-    ins = BCINS_AD(op, ra, rd);[m
[31m-  }[m
[31m-  /* Using expr_free might cause asserts if the order is wrong. */[m
[31m-  if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;[m
[31m-  if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;[m
[31m-  bcemit_INS(fs, ins);[m
[31m-  eret->u.s.info = bcemit_jmp(fs);[m
[31m-  eret->k = VJMP;[m
[31m-}[m
[31m-[m
[31m-/* Fixup left side of binary operator. */[m
[31m-static void bcemit_binop_left(FuncState *fs, BinOpr op, ExpDesc *e)[m
[31m-{[m
[31m-  if (op == OPR_AND) {[m
[31m-    bcemit_branch_t(fs, e);[m
[31m-  } else if (op == OPR_OR) {[m
[31m-    bcemit_branch_f(fs, e);[m
[31m-  } else if (op == OPR_CONCAT) {[m
[31m-    expr_tonextreg(fs, e);[m
[31m-  } else if (op == OPR_EQ || op == OPR_NE) {[m
[31m-    if (!expr_isk_nojump(e)) expr_toanyreg(fs, e);[m
[31m-  } else {[m
[31m-    if (!expr_isnumk_nojump(e)) expr_toanyreg(fs, e);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit binary operator. */[m
[31m-static void bcemit_binop(FuncState *fs, BinOpr op, ExpDesc *e1, ExpDesc *e2)[m
[31m-{[m
[31m-  if (op <= OPR_POW) {[m
[31m-    bcemit_arith(fs, op, e1, e2);[m
[31m-  } else if (op == OPR_AND) {[m
[31m-    lua_assert(e1->t == NO_JMP);  /* List must be closed. */[m
[31m-    expr_discharge(fs, e2);[m
[31m-    jmp_append(fs, &e2->f, e1->f);[m
[31m-    *e1 = *e2;[m
[31m-  } else if (op == OPR_OR) {[m
[31m-    lua_assert(e1->f == NO_JMP);  /* List must be closed. */[m
[31m-    expr_discharge(fs, e2);[m
[31m-    jmp_append(fs, &e2->t, e1->t);[m
[31m-    *e1 = *e2;[m
[31m-  } else if (op == OPR_CONCAT) {[m
[31m-    expr_toval(fs, e2);[m
[31m-    if (e2->k == VRELOCABLE && bc_op(*bcptr(fs, e2)) == BC_CAT) {[m
[31m-      lua_assert(e1->u.s.info == bc_b(*bcptr(fs, e2))-1);[m
[31m-      expr_free(fs, e1);[m
[31m-      setbc_b(bcptr(fs, e2), e1->u.s.info);[m
[31m-      e1->u.s.info = e2->u.s.info;[m
[31m-    } else {[m
[31m-      expr_tonextreg(fs, e2);[m
[31m-      expr_free(fs, e2);[m
[31m-      expr_free(fs, e1);[m
[31m-      e1->u.s.info = bcemit_ABC(fs, BC_CAT, 0, e1->u.s.info, e2->u.s.info);[m
[31m-    }[m
[31m-    e1->k = VRELOCABLE;[m
[31m-  } else {[m
[31m-    lua_assert(op == OPR_NE || op == OPR_EQ ||[m
[31m-	       op == OPR_LT || op == OPR_GE || op == OPR_LE || op == OPR_GT);[m
[31m-    bcemit_comp(fs, op, e1, e2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit unary operator. */[m
[31m-static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e)[m
[31m-{[m
[31m-  if (op == BC_NOT) {[m
[31m-    /* Swap true and false lists. */[m
[31m-    { BCPos temp = e->f; e->f = e->t; e->t = temp; }[m
[31m-    jmp_dropval(fs, e->f);[m
[31m-    jmp_dropval(fs, e->t);[m
[31m-    expr_discharge(fs, e);[m
[31m-    if (e->k == VKNIL || e->k == VKFALSE) {[m
[31m-      e->k = VKTRUE;[m
[31m-      return;[m
[31m-    } else if (expr_isk(e) || (LJ_HASFFI && e->k == VKCDATA)) {[m
[31m-      e->k = VKFALSE;[m
[31m-      return;[m
[31m-    } else if (e->k == VJMP) {[m
[31m-      invertcond(fs, e);[m
[31m-      return;[m
[31m-    } else if (e->k == VRELOCABLE) {[m
[31m-      bcreg_reserve(fs, 1);[m
[31m-      setbc_a(bcptr(fs, e), fs->freereg-1);[m
[31m-      e->u.s.info = fs->freereg-1;[m
[31m-      e->k = VNONRELOC;[m
[31m-    } else {[m
[31m-      lua_assert(e->k == VNONRELOC);[m
[31m-    }[m
[31m-  } else {[m
[31m-    lua_assert(op == BC_UNM || op == BC_LEN);[m
[31m-    if (op == BC_UNM && !expr_hasjump(e)) {  /* Constant-fold negations. */[m
[31m-#if LJ_HASFFI[m
[31m-      if (e->k == VKCDATA) {  /* Fold in-place since cdata is not interned. */[m
[31m-	GCcdata *cd = cdataV(&e->u.nval);[m
[31m-	int64_t *p = (int64_t *)cdataptr(cd);[m
[31m-	if (cd->ctypeid == CTID_COMPLEX_DOUBLE)[m
[31m-	  p[1] ^= (int64_t)U64x(80000000,00000000);[m
[31m-	else[m
[31m-	  *p = -*p;[m
[31m-	return;[m
[31m-      } else[m
[31m-#endif[m
[31m-      if (expr_isnumk(e) && !expr_numiszero(e)) {  /* Avoid folding to -0. */[m
[31m-	TValue *o = expr_numtv(e);[m
[31m-	if (tvisint(o)) {[m
[31m-	  int32_t k = intV(o);[m
[31m-	  if (k == -k)[m
[31m-	    setnumV(o, -(lua_Number)k);[m
[31m-	  else[m
[31m-	    setintV(o, -k);[m
[31m-	  return;[m
[31m-	} else {[m
[31m-	  o->u64 ^= U64x(80000000,00000000);[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    expr_toanyreg(fs, e);[m
[31m-  }[m
[31m-  expr_free(fs, e);[m
[31m-  e->u.s.info = bcemit_AD(fs, op, 0, e->u.s.info);[m
[31m-  e->k = VRELOCABLE;[m
[31m-}[m
[31m-[m
[31m-/* -- Lexer support ------------------------------------------------------- */[m
[31m-[m
[31m-/* Check and consume optional token. */[m
[31m-static int lex_opt(LexState *ls, LexToken tok)[m
[31m-{[m
[31m-  if (ls->tok == tok) {[m
[31m-    lj_lex_next(ls);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check and consume token. */[m
[31m-static void lex_check(LexState *ls, LexToken tok)[m
[31m-{[m
[31m-  if (ls->tok != tok)[m
[31m-    err_token(ls, tok);[m
[31m-  lj_lex_next(ls);[m
[31m-}[m
[31m-[m
[31m-/* Check for matching token. */[m
[31m-static void lex_match(LexState *ls, LexToken what, LexToken who, BCLine line)[m
[31m-{[m
[31m-  if (!lex_opt(ls, what)) {[m
[31m-    if (line == ls->linenumber) {[m
[31m-      err_token(ls, what);[m
[31m-    } else {[m
[31m-      const char *swhat = lj_lex_token2str(ls, what);[m
[31m-      const char *swho = lj_lex_token2str(ls, who);[m
[31m-      lj_lex_error(ls, ls->tok, LJ_ERR_XMATCH, swhat, swho, line);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Check for string token. */[m
[31m-static GCstr *lex_str(LexState *ls)[m
[31m-{[m
[31m-  GCstr *s;[m
[31m-  if (ls->tok != TK_name && (LJ_52 || ls->tok != TK_goto))[m
[31m-    err_token(ls, TK_name);[m
[31m-  s = strV(&ls->tokval);[m
[31m-  lj_lex_next(ls);[m
[31m-  return s;[m
[31m-}[m
[31m-[m
[31m-/* -- Variable handling --------------------------------------------------- */[m
[31m-[m
[31m-#define var_get(ls, fs, i)	((ls)->vstack[(fs)->varmap[(i)]])[m
[31m-[m
[31m-/* Define a new local variable. */[m
[31m-static void var_new(LexState *ls, BCReg n, GCstr *name)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  MSize vtop = ls->vtop;[m
[31m-  checklimit(fs, fs->nactvar+n, LJ_MAX_LOCVAR, "local variables");[m
[31m-  if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {[m
[31m-    if (ls->sizevstack >= LJ_MAX_VSTACK)[m
[31m-      lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);[m
[31m-    lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);[m
[31m-  }[m
[31m-  lua_assert((uintptr_t)name < VARNAME__MAX ||[m
[31m-	     lj_tab_getstr(fs->kt, name) != NULL);[m
[31m-  /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */[m
[31m-  setgcref(ls->vstack[vtop].name, obj2gco(name));[m
[31m-  fs->varmap[fs->nactvar+n] = (uint16_t)vtop;[m
[31m-  ls->vtop = vtop+1;[m
[31m-}[m
[31m-[m
[31m-#define var_new_lit(ls, n, v) \[m
[31m-  var_new(ls, (n), lj_parse_keepstr(ls, "" v, sizeof(v)-1))[m
[31m-[m
[31m-#define var_new_fixed(ls, n, vn) \[m
[31m-  var_new(ls, (n), (GCstr *)(uintptr_t)(vn))[m
[31m-[m
[31m-/* Add local variables. */[m
[31m-static void var_add(LexState *ls, BCReg nvars)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCReg nactvar = fs->nactvar;[m
[31m-  while (nvars--) {[m
[31m-    VarInfo *v = &var_get(ls, fs, nactvar);[m
[31m-    v->startpc = fs->pc;[m
[31m-    v->slot = nactvar++;[m
[31m-    v->info = 0;[m
[31m-  }[m
[31m-  fs->nactvar = nactvar;[m
[31m-}[m
[31m-[m
[31m-/* Remove local variables. */[m
[31m-static void var_remove(LexState *ls, BCReg tolevel)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  while (fs->nactvar > tolevel)[m
[31m-    var_get(ls, fs, --fs->nactvar).endpc = fs->pc;[m
[31m-}[m
[31m-[m
[31m-/* Lookup local variable name. */[m
[31m-static BCReg var_lookup_local(FuncState *fs, GCstr *n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = fs->nactvar-1; i >= 0; i--) {[m
[31m-    if (n == strref(var_get(fs->ls, fs, i).name))[m
[31m-      return (BCReg)i;[m
[31m-  }[m
[31m-  return (BCReg)-1;  /* Not found. */[m
[31m-}[m
[31m-[m
[31m-/* Lookup or add upvalue index. */[m
[31m-static MSize var_lookup_uv(FuncState *fs, MSize vidx, ExpDesc *e)[m
[31m-{[m
[31m-  MSize i, n = fs->nuv;[m
[31m-  for (i = 0; i < n; i++)[m
[31m-    if (fs->uvmap[i] == vidx)[m
[31m-      return i;  /* Already exists. */[m
[31m-  /* Otherwise create a new one. */[m
[31m-  checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues");[m
[31m-  lua_assert(e->k == VLOCAL || e->k == VUPVAL);[m
[31m-  fs->uvmap[n] = (uint16_t)vidx;[m
[31m-  fs->uvtmp[n] = (uint16_t)(e->k == VLOCAL ? vidx : LJ_MAX_VSTACK+e->u.s.info);[m
[31m-  fs->nuv = n+1;[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static void fscope_uvmark(FuncState *fs, BCReg level);[m
[31m-[m
[31m-/* Recursively lookup variables in enclosing functions. */[m
[31m-static MSize var_lookup_(FuncState *fs, GCstr *name, ExpDesc *e, int first)[m
[31m-{[m
[31m-  if (fs) {[m
[31m-    BCReg reg = var_lookup_local(fs, name);[m
[31m-    if ((int32_t)reg >= 0) {  /* Local in this function? */[m
[31m-      expr_init(e, VLOCAL, reg);[m
[31m-      if (!first)[m
[31m-	fscope_uvmark(fs, reg);  /* Scope now has an upvalue. */[m
[31m-      return (MSize)(e->u.s.aux = (uint32_t)fs->varmap[reg]);[m
[31m-    } else {[m
[31m-      MSize vidx = var_lookup_(fs->prev, name, e, 0);  /* Var in outer func? */[m
[31m-      if ((int32_t)vidx >= 0) {  /* Yes, make it an upvalue here. */[m
[31m-	e->u.s.info = (uint8_t)var_lookup_uv(fs, vidx, e);[m
[31m-	e->k = VUPVAL;[m
[31m-	return vidx;[m
[31m-      }[m
[31m-    }[m
[31m-  } else {  /* Not found in any function, must be a global. */[m
[31m-    expr_init(e, VGLOBAL, 0);[m
[31m-    e->u.sval = name;[m
[31m-  }[m
[31m-  return (MSize)-1;  /* Global. */[m
[31m-}[m
[31m-[m
[31m-/* Lookup variable name. */[m
[31m-#define var_lookup(ls, e) \[m
[31m-  var_lookup_((ls)->fs, lex_str(ls), (e), 1)[m
[31m-[m
[31m-/* -- Goto an label handling ---------------------------------------------- */[m
[31m-[m
[31m-/* Add a new goto or label. */[m
[31m-static MSize gola_new(LexState *ls, GCstr *name, uint8_t info, BCPos pc)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  MSize vtop = ls->vtop;[m
[31m-  if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {[m
[31m-    if (ls->sizevstack >= LJ_MAX_VSTACK)[m
[31m-      lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);[m
[31m-    lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);[m
[31m-  }[m
[31m-  lua_assert(name == NAME_BREAK || lj_tab_getstr(fs->kt, name) != NULL);[m
[31m-  /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */[m
[31m-  setgcref(ls->vstack[vtop].name, obj2gco(name));[m
[31m-  ls->vstack[vtop].startpc = pc;[m
[31m-  ls->vstack[vtop].slot = (uint8_t)fs->nactvar;[m
[31m-  ls->vstack[vtop].info = info;[m
[31m-  ls->vtop = vtop+1;[m
[31m-  return vtop;[m
[31m-}[m
[31m-[m
[31m-#define gola_isgoto(v)		((v)->info & VSTACK_GOTO)[m
[31m-#define gola_islabel(v)		((v)->info & VSTACK_LABEL)[m
[31m-#define gola_isgotolabel(v)	((v)->info & (VSTACK_GOTO|VSTACK_LABEL))[m
[31m-[m
[31m-/* Patch goto to jump to label. */[m
[31m-static void gola_patch(LexState *ls, VarInfo *vg, VarInfo *vl)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos pc = vg->startpc;[m
[31m-  setgcrefnull(vg->name);  /* Invalidate pending goto. */[m
[31m-  setbc_a(&fs->bcbase[pc].ins, vl->slot);[m
[31m-  jmp_patch(fs, pc, vl->startpc);[m
[31m-}[m
[31m-[m
[31m-/* Patch goto to close upvalues. */[m
[31m-static void gola_close(LexState *ls, VarInfo *vg)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos pc = vg->startpc;[m
[31m-  BCIns *ip = &fs->bcbase[pc].ins;[m
[31m-  lua_assert(gola_isgoto(vg));[m
[31m-  lua_assert(bc_op(*ip) == BC_JMP || bc_op(*ip) == BC_UCLO);[m
[31m-  setbc_a(ip, vg->slot);[m
[31m-  if (bc_op(*ip) == BC_JMP) {[m
[31m-    BCPos next = jmp_next(fs, pc);[m
[31m-    if (next != NO_JMP) jmp_patch(fs, next, pc);  /* Jump to UCLO. */[m
[31m-    setbc_op(ip, BC_UCLO);  /* Turn into UCLO. */[m
[31m-    setbc_j(ip, NO_JMP);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Resolve pending forward gotos for label. */[m
[31m-static void gola_resolve(LexState *ls, FuncScope *bl, MSize idx)[m
[31m-{[m
[31m-  VarInfo *vg = ls->vstack + bl->vstart;[m
[31m-  VarInfo *vl = ls->vstack + idx;[m
[31m-  for (; vg < vl; vg++)[m
[31m-    if (gcrefeq(vg->name, vl->name) && gola_isgoto(vg)) {[m
[31m-      if (vg->slot < vl->slot) {[m
[31m-	GCstr *name = strref(var_get(ls, ls->fs, vg->slot).name);[m
[31m-	lua_assert((uintptr_t)name >= VARNAME__MAX);[m
[31m-	ls->linenumber = ls->fs->bcbase[vg->startpc].line;[m
[31m-	lua_assert(strref(vg->name) != NAME_BREAK);[m
[31m-	lj_lex_error(ls, 0, LJ_ERR_XGSCOPE,[m
[31m-		     strdata(strref(vg->name)), strdata(name));[m
[31m-      }[m
[31m-      gola_patch(ls, vg, vl);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* Fixup remaining gotos and labels for scope. */[m
[31m-static void gola_fixup(LexState *ls, FuncScope *bl)[m
[31m-{[m
[31m-  VarInfo *v = ls->vstack + bl->vstart;[m
[31m-  VarInfo *ve = ls->vstack + ls->vtop;[m
[31m-  for (; v < ve; v++) {[m
[31m-    GCstr *name = strref(v->name);[m
[31m-    if (name != NULL) {  /* Only consider remaining valid gotos/labels. */[m
[31m-      if (gola_islabel(v)) {[m
[31m-	VarInfo *vg;[m
[31m-	setgcrefnull(v->name);  /* Invalidate label that goes out of scope. */[m
[31m-	for (vg = v+1; vg < ve; vg++)  /* Resolve pending backward gotos. */[m
[31m-	  if (strref(vg->name) == name && gola_isgoto(vg)) {[m
[31m-	    if ((bl->flags&FSCOPE_UPVAL) && vg->slot > v->slot)[m
[31m-	      gola_close(ls, vg);[m
[31m-	    gola_patch(ls, vg, v);[m
[31m-	  }[m
[31m-      } else if (gola_isgoto(v)) {[m
[31m-	if (bl->prev) {  /* Propagate goto or break to outer scope. */[m
[31m-	  bl->prev->flags |= name == NAME_BREAK ? FSCOPE_BREAK : FSCOPE_GOLA;[m
[31m-	  v->slot = bl->nactvar;[m
[31m-	  if ((bl->flags & FSCOPE_UPVAL))[m
[31m-	    gola_close(ls, v);[m
[31m-	} else {  /* No outer scope: undefined goto label or no loop. */[m
[31m-	  ls->linenumber = ls->fs->bcbase[v->startpc].line;[m
[31m-	  if (name == NAME_BREAK)[m
[31m-	    lj_lex_error(ls, 0, LJ_ERR_XBREAK);[m
[31m-	  else[m
[31m-	    lj_lex_error(ls, 0, LJ_ERR_XLUNDEF, strdata(name));[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Find existing label. */[m
[31m-static VarInfo *gola_findlabel(LexState *ls, GCstr *name)[m
[31m-{[m
[31m-  VarInfo *v = ls->vstack + ls->fs->bl->vstart;[m
[31m-  VarInfo *ve = ls->vstack + ls->vtop;[m
[31m-  for (; v < ve; v++)[m
[31m-    if (strref(v->name) == name && gola_islabel(v))[m
[31m-      return v;[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- Scope handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Begin a scope. */[m
[31m-static void fscope_begin(FuncState *fs, FuncScope *bl, int flags)[m
[31m-{[m
[31m-  bl->nactvar = (uint8_t)fs->nactvar;[m
[31m-  bl->flags = flags;[m
[31m-  bl->vstart = fs->ls->vtop;[m
[31m-  bl->prev = fs->bl;[m
[31m-  fs->bl = bl;[m
[31m-  lua_assert(fs->freereg == fs->nactvar);[m
[31m-}[m
[31m-[m
[31m-/* End a scope. */[m
[31m-static void fscope_end(FuncState *fs)[m
[31m-{[m
[31m-  FuncScope *bl = fs->bl;[m
[31m-  LexState *ls = fs->ls;[m
[31m-  fs->bl = bl->prev;[m
[31m-  var_remove(ls, bl->nactvar);[m
[31m-  fs->freereg = fs->nactvar;[m
[31m-  lua_assert(bl->nactvar == fs->nactvar);[m
[31m-  if ((bl->flags & (FSCOPE_UPVAL|FSCOPE_NOCLOSE)) == FSCOPE_UPVAL)[m
[31m-    bcemit_AJ(fs, BC_UCLO, bl->nactvar, 0);[m
[31m-  if ((bl->flags & FSCOPE_BREAK)) {[m
[31m-    if ((bl->flags & FSCOPE_LOOP)) {[m
[31m-      MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc);[m
[31m-      ls->vtop = idx;  /* Drop break label immediately. */[m
[31m-      gola_resolve(ls, bl, idx);[m
[31m-      return;[m
[31m-    }  /* else: need the fixup step to propagate the breaks. */[m
[31m-  } else if (!(bl->flags & FSCOPE_GOLA)) {[m
[31m-    return;[m
[31m-  }[m
[31m-  gola_fixup(ls, bl);[m
[31m-}[m
[31m-[m
[31m-/* Mark scope as having an upvalue. */[m
[31m-static void fscope_uvmark(FuncState *fs, BCReg level)[m
[31m-{[m
[31m-  FuncScope *bl;[m
[31m-  for (bl = fs->bl; bl && bl->nactvar > level; bl = bl->prev)[m
[31m-    ;[m
[31m-  if (bl)[m
[31m-    bl->flags |= FSCOPE_UPVAL;[m
[31m-}[m
[31m-[m
[31m-/* -- Function state management ------------------------------------------- */[m
[31m-[m
[31m-/* Fixup bytecode for prototype. */[m
[31m-static void fs_fixup_bc(FuncState *fs, GCproto *pt, BCIns *bc, MSize n)[m
[31m-{[m
[31m-  BCInsLine *base = fs->bcbase;[m
[31m-  MSize i;[m
[31m-  pt->sizebc = n;[m
[31m-  bc[0] = BCINS_AD((fs->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF,[m
[31m-		   fs->framesize, 0);[m
[31m-  for (i = 1; i < n; i++)[m
[31m-    bc[i] = base[i].ins;[m
[31m-}[m
[31m-[m
[31m-/* Fixup upvalues for child prototype, step #2. */[m
[31m-static void fs_fixup_uv2(FuncState *fs, GCproto *pt)[m
[31m-{[m
[31m-  VarInfo *vstack = fs->ls->vstack;[m
[31m-  uint16_t *uv = proto_uv(pt);[m
[31m-  MSize i, n = pt->sizeuv;[m
[31m-  for (i = 0; i < n; i++) {[m
[31m-    VarIndex vidx = uv[i];[m
[31m-    if (vidx >= LJ_MAX_VSTACK)[m
[31m-      uv[i] = vidx - LJ_MAX_VSTACK;[m
[31m-    else if ((vstack[vidx].info & VSTACK_VAR_RW))[m
[31m-      uv[i] = vstack[vidx].slot | PROTO_UV_LOCAL;[m
[31m-    else[m
[31m-      uv[i] = vstack[vidx].slot | PROTO_UV_LOCAL | PROTO_UV_IMMUTABLE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fixup constants for prototype. */[m
[31m-static void fs_fixup_k(FuncState *fs, GCproto *pt, void *kptr)[m
[31m-{[m
[31m-  GCtab *kt;[m
[31m-  TValue *array;[m
[31m-  Node *node;[m
[31m-  MSize i, hmask;[m
[31m-  checklimitgt(fs, fs->nkn, BCMAX_D+1, "constants");[m
[31m-  checklimitgt(fs, fs->nkgc, BCMAX_D+1, "constants");[m
[31m-  setmref(pt->k, kptr);[m
[31m-  pt->sizekn = fs->nkn;[m
[31m-  pt->sizekgc = fs->nkgc;[m
[31m-  kt = fs->kt;[m
[31m-  array = tvref(kt->array);[m
[31m-  for (i = 0; i < kt->asize; i++)[m
[31m-    if (tvhaskslot(&array[i])) {[m
[31m-      TValue *tv = &((TValue *)kptr)[tvkslot(&array[i])];[m
[31m-      if (LJ_DUALNUM)[m
[31m-	setintV(tv, (int32_t)i);[m
[31m-      else[m
[31m-	setnumV(tv, (lua_Number)i);[m
[31m-    }[m
[31m-  node = noderef(kt->node);[m
[31m-  hmask = kt->hmask;[m
[31m-  for (i = 0; i <= hmask; i++) {[m
[31m-    Node *n = &node[i];[m
[31m-    if (tvhaskslot(&n->val)) {[m
[31m-      ptrdiff_t kidx = (ptrdiff_t)tvkslot(&n->val);[m
[31m-      lua_assert(!tvisint(&n->key));[m
[31m-      if (tvisnum(&n->key)) {[m
[31m-	TValue *tv = &((TValue *)kptr)[kidx];[m
[31m-	if (LJ_DUALNUM) {[m
[31m-	  lua_Number nn = numV(&n->key);[m
[31m-	  int32_t k = lj_num2int(nn);[m
[31m-	  lua_assert(!tvismzero(&n->key));[m
[31m-	  if ((lua_Number)k == nn)[m
[31m-	    setintV(tv, k);[m
[31m-	  else[m
[31m-	    *tv = n->key;[m
[31m-	} else {[m
[31m-	  *tv = n->key;[m
[31m-	}[m
[31m-      } else {[m
[31m-	GCobj *o = gcV(&n->key);[m
[31m-	setgcref(((GCRef *)kptr)[~kidx], o);[m
[31m-	lj_gc_objbarrier(fs->L, pt, o);[m
[31m-	if (tvisproto(&n->key))[m
[31m-	  fs_fixup_uv2(fs, gco2pt(o));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fixup upvalues for prototype, step #1. */[m
[31m-static void fs_fixup_uv1(FuncState *fs, GCproto *pt, uint16_t *uv)[m
[31m-{[m
[31m-  setmref(pt->uv, uv);[m
[31m-  pt->sizeuv = fs->nuv;[m
[31m-  memcpy(uv, fs->uvtmp, fs->nuv*sizeof(VarIndex));[m
[31m-}[m
[31m-[m
[31m-#ifndef LUAJIT_DISABLE_DEBUGINFO[m
[31m-/* Prepare lineinfo for prototype. */[m
[31m-static size_t fs_prep_line(FuncState *fs, BCLine numline)[m
[31m-{[m
[31m-  return (fs->pc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2);[m
[31m-}[m
[31m-[m
[31m-/* Fixup lineinfo for prototype. */[m
[31m-static void fs_fixup_line(FuncState *fs, GCproto *pt,[m
[31m-			  void *lineinfo, BCLine numline)[m
[31m-{[m
[31m-  BCInsLine *base = fs->bcbase + 1;[m
[31m-  BCLine first = fs->linedefined;[m
[31m-  MSize i = 0, n = fs->pc-1;[m
[31m-  pt->firstline = fs->linedefined;[m
[31m-  pt->numline = numline;[m
[31m-  setmref(pt->lineinfo, lineinfo);[m
[31m-  if (LJ_LIKELY(numline < 256)) {[m
[31m-    uint8_t *li = (uint8_t *)lineinfo;[m
[31m-    do {[m
[31m-      BCLine delta = base[i].line - first;[m
[31m-      lua_assert(delta >= 0 && delta < 256);[m
[31m-      li[i] = (uint8_t)delta;[m
[31m-    } while (++i < n);[m
[31m-  } else if (LJ_LIKELY(numline < 65536)) {[m
[31m-    uint16_t *li = (uint16_t *)lineinfo;[m
[31m-    do {[m
[31m-      BCLine delta = base[i].line - first;[m
[31m-      lua_assert(delta >= 0 && delta < 65536);[m
[31m-      li[i] = (uint16_t)delta;[m
[31m-    } while (++i < n);[m
[31m-  } else {[m
[31m-    uint32_t *li = (uint32_t *)lineinfo;[m
[31m-    do {[m
[31m-      BCLine delta = base[i].line - first;[m
[31m-      lua_assert(delta >= 0);[m
[31m-      li[i] = (uint32_t)delta;[m
[31m-    } while (++i < n);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Prepare variable info for prototype. */[m
[31m-static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar)[m
[31m-{[m
[31m-  VarInfo *vs =ls->vstack, *ve;[m
[31m-  MSize i, n;[m
[31m-  BCPos lastpc;[m
[31m-  lj_buf_reset(&ls->sb);  /* Copy to temp. string buffer. */[m
[31m-  /* Store upvalue names. */[m
[31m-  for (i = 0, n = fs->nuv; i < n; i++) {[m
[31m-    GCstr *s = strref(vs[fs->uvmap[i]].name);[m
[31m-    MSize len = s->len+1;[m
[31m-    char *p = lj_buf_more(&ls->sb, len);[m
[31m-    p = lj_buf_wmem(p, strdata(s), len);[m
[31m-    setsbufP(&ls->sb, p);[m
[31m-  }[m
[31m-  *ofsvar = sbuflen(&ls->sb);[m
[31m-  lastpc = 0;[m
[31m-  /* Store local variable names and compressed ranges. */[m
[31m-  for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) {[m
[31m-    if (!gola_isgotolabel(vs)) {[m
[31m-      GCstr *s = strref(vs->name);[m
[31m-      BCPos startpc;[m
[31m-      char *p;[m
[31m-      if ((uintptr_t)s < VARNAME__MAX) {[m
[31m-	p = lj_buf_more(&ls->sb, 1 + 2*5);[m
[31m-	*p++ = (char)(uintptr_t)s;[m
[31m-      } else {[m
[31m-	MSize len = s->len+1;[m
[31m-	p = lj_buf_more(&ls->sb, len + 2*5);[m
[31m-	p = lj_buf_wmem(p, strdata(s), len);[m
[31m-      }[m
[31m-      startpc = vs->startpc;[m
[31m-      p = lj_strfmt_wuleb128(p, startpc-lastpc);[m
[31m-      p = lj_strfmt_wuleb128(p, vs->endpc-startpc);[m
[31m-      setsbufP(&ls->sb, p);[m
[31m-      lastpc = startpc;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_buf_putb(&ls->sb, '\0');  /* Terminator for varinfo. */[m
[31m-  return sbuflen(&ls->sb);[m
[31m-}[m
[31m-[m
[31m-/* Fixup variable info for prototype. */[m
[31m-static void fs_fixup_var(LexState *ls, GCproto *pt, uint8_t *p, size_t ofsvar)[m
[31m-{[m
[31m-  setmref(pt->uvinfo, p);[m
[31m-  setmref(pt->varinfo, (char *)p + ofsvar);[m
[31m-  memcpy(p, sbufB(&ls->sb), sbuflen(&ls->sb));  /* Copy from temp. buffer. */[m
[31m-}[m
[31m-#else[m
[31m-[m
[31m-/* Initialize with empty debug info, if disabled. */[m
[31m-#define fs_prep_line(fs, numline)		(UNUSED(numline), 0)[m
[31m-#define fs_fixup_line(fs, pt, li, numline) \[m
[31m-  pt->firstline = pt->numline = 0, setmref((pt)->lineinfo, NULL)[m
[31m-#define fs_prep_var(ls, fs, ofsvar)		(UNUSED(ofsvar), 0)[m
[31m-#define fs_fixup_var(ls, pt, p, ofsvar) \[m
[31m-  setmref((pt)->uvinfo, NULL), setmref((pt)->varinfo, NULL)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Check if bytecode op returns. */[m
[31m-static int bcopisret(BCOp op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case BC_CALLMT: case BC_CALLT:[m
[31m-  case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-    return 1;[m
[31m-  default:[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fixup return instruction for prototype. */[m
[31m-static void fs_fixup_ret(FuncState *fs)[m
[31m-{[m
[31m-  BCPos lastpc = fs->pc;[m
[31m-  if (lastpc <= fs->lasttarget || !bcopisret(bc_op(fs->bcbase[lastpc-1].ins))) {[m
[31m-    if ((fs->bl->flags & FSCOPE_UPVAL))[m
[31m-      bcemit_AJ(fs, BC_UCLO, 0, 0);[m
[31m-    bcemit_AD(fs, BC_RET0, 0, 1);  /* Need final return. */[m
[31m-  }[m
[31m-  fs->bl->flags |= FSCOPE_NOCLOSE;  /* Handled above. */[m
[31m-  fscope_end(fs);[m
[31m-  lua_assert(fs->bl == NULL);[m
[31m-  /* May need to fixup returns encoded before first function was created. */[m
[31m-  if (fs->flags & PROTO_FIXUP_RETURN) {[m
[31m-    BCPos pc;[m
[31m-    for (pc = 1; pc < lastpc; pc++) {[m
[31m-      BCIns ins = fs->bcbase[pc].ins;[m
[31m-      BCPos offset;[m
[31m-      switch (bc_op(ins)) {[m
[31m-      case BC_CALLMT: case BC_CALLT:[m
[31m-      case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-	offset = bcemit_INS(fs, ins);  /* Copy original instruction. */[m
[31m-	fs->bcbase[offset].line = fs->bcbase[pc].line;[m
[31m-	offset = offset-(pc+1)+BCBIAS_J;[m
[31m-	if (offset > BCMAX_D)[m
[31m-	  err_syntax(fs->ls, LJ_ERR_XFIXUP);[m
[31m-	/* Replace with UCLO plus branch. */[m
[31m-	fs->bcbase[pc].ins = BCINS_AD(BC_UCLO, 0, offset);[m
[31m-	break;[m
[31m-      case BC_UCLO:[m
[31m-	return;  /* We're done. */[m
[31m-      default:[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Finish a FuncState and return the new prototype. */[m
[31m-static GCproto *fs_finish(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  lua_State *L = ls->L;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCLine numline = line - fs->linedefined;[m
[31m-  size_t sizept, ofsk, ofsuv, ofsli, ofsdbg, ofsvar;[m
[31m-  GCproto *pt;[m
[31m-[m
[31m-  /* Apply final fixups. */[m
[31m-  fs_fixup_ret(fs);[m
[31m-[m
[31m-  /* Calculate total size of prototype including all colocated arrays. */[m
[31m-  sizept = sizeof(GCproto) + fs->pc*sizeof(BCIns) + fs->nkgc*sizeof(GCRef);[m
[31m-  sizept = (sizept + sizeof(TValue)-1) & ~(sizeof(TValue)-1);[m
[31m-  ofsk = sizept; sizept += fs->nkn*sizeof(TValue);[m
[31m-  ofsuv = sizept; sizept += ((fs->nuv+1)&~1)*2;[m
[31m-  ofsli = sizept; sizept += fs_prep_line(fs, numline);[m
[31m-  ofsdbg = sizept; sizept += fs_prep_var(ls, fs, &ofsvar);[m
[31m-[m
[31m-  /* Allocate prototype and initialize its fields. */[m
[31m-  pt = (GCproto *)lj_mem_newgco(L, (MSize)sizept);[m
[31m-  pt->gct = ~LJ_TPROTO;[m
[31m-  pt->sizept = (MSize)sizept;[m
[31m-  pt->trace = 0;[m
[31m-  pt->flags = (uint8_t)(fs->flags & ~(PROTO_HAS_RETURN|PROTO_FIXUP_RETURN));[m
[31m-  pt->numparams = fs->numparams;[m
[31m-  pt->framesize = fs->framesize;[m
[31m-  setgcref(pt->chunkname, obj2gco(ls->chunkname));[m
[31m-[m
[31m-  /* Close potentially uninitialized gap between bc and kgc. */[m
[31m-  *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(fs->nkgc+1)) = 0;[m
[31m-  fs_fixup_bc(fs, pt, (BCIns *)((char *)pt + sizeof(GCproto)), fs->pc);[m
[31m-  fs_fixup_k(fs, pt, (void *)((char *)pt + ofsk));[m
[31m-  fs_fixup_uv1(fs, pt, (uint16_t *)((char *)pt + ofsuv));[m
[31m-  fs_fixup_line(fs, pt, (void *)((char *)pt + ofsli), numline);[m
[31m-  fs_fixup_var(ls, pt, (uint8_t *)((char *)pt + ofsdbg), ofsvar);[m
[31m-[m
[31m-  lj_vmevent_send(L, BC,[m
[31m-    setprotoV(L, L->top++, pt);[m
[31m-  );[m
[31m-[m
[31m-  L->top--;  /* Pop table of constants. */[m
[31m-  ls->vtop = fs->vbase;  /* Reset variable stack. */[m
[31m-  ls->fs = fs->prev;[m
[31m-  lua_assert(ls->fs != NULL || ls->tok == TK_eof);[m
[31m-  return pt;[m
[31m-}[m
[31m-[m
[31m-/* Initialize a new FuncState. */[m
[31m-static void fs_init(LexState *ls, FuncState *fs)[m
[31m-{[m
[31m-  lua_State *L = ls->L;[m
[31m-  fs->prev = ls->fs; ls->fs = fs;  /* Append to list. */[m
[31m-  fs->ls = ls;[m
[31m-  fs->vbase = ls->vtop;[m
[31m-  fs->L = L;[m
[31m-  fs->pc = 0;[m
[31m-  fs->lasttarget = 0;[m
[31m-  fs->jpc = NO_JMP;[m
[31m-  fs->freereg = 0;[m
[31m-  fs->nkgc = 0;[m
[31m-  fs->nkn = 0;[m
[31m-  fs->nactvar = 0;[m
[31m-  fs->nuv = 0;[m
[31m-  fs->bl = NULL;[m
[31m-  fs->flags = 0;[m
[31m-  fs->framesize = 1;  /* Minimum frame size. */[m
[31m-  fs->kt = lj_tab_new(L, 0, 0);[m
[31m-  /* Anchor table of constants in stack to avoid being collected. */[m
[31m-  settabV(L, L->top, fs->kt);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-/* -- Expressions --------------------------------------------------------- */[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static void expr(LexState *ls, ExpDesc *v);[m
[31m-[m
[31m-/* Return string expression. */[m
[31m-static void expr_str(LexState *ls, ExpDesc *e)[m
[31m-{[m
[31m-  expr_init(e, VKSTR, 0);[m
[31m-  e->u.sval = lex_str(ls);[m
[31m-}[m
[31m-[m
[31m-/* Return index expression. */[m
[31m-static void expr_index(FuncState *fs, ExpDesc *t, ExpDesc *e)[m
[31m-{[m
[31m-  /* Already called: expr_toval(fs, e). */[m
[31m-  t->k = VINDEXED;[m
[31m-  if (expr_isnumk(e)) {[m
[31m-#if LJ_DUALNUM[m
[31m-    if (tvisint(expr_numtv(e))) {[m
[31m-      int32_t k = intV(expr_numtv(e));[m
[31m-      if (checku8(k)) {[m
[31m-	t->u.s.aux = BCMAX_C+1+(uint32_t)k;  /* 256..511: const byte key */[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-#else[m
[31m-    lua_Number n = expr_numberV(e);[m
[31m-    int32_t k = lj_num2int(n);[m
[31m-    if (checku8(k) && n == (lua_Number)k) {[m
[31m-      t->u.s.aux = BCMAX_C+1+(uint32_t)k;  /* 256..511: const byte key */[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-  } else if (expr_isstrk(e)) {[m
[31m-    BCReg idx = const_str(fs, e);[m
[31m-    if (idx <= BCMAX_C) {[m
[31m-      t->u.s.aux = ~idx;  /* -256..-1: const string key */[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  t->u.s.aux = expr_toanyreg(fs, e);  /* 0..255: register */[m
[31m-}[m
[31m-[m
[31m-/* Parse index expression with named field. */[m
[31m-static void expr_field(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  ExpDesc key;[m
[31m-  expr_toanyreg(fs, v);[m
[31m-  lj_lex_next(ls);  /* Skip dot or colon. */[m
[31m-  expr_str(ls, &key);[m
[31m-  expr_index(fs, v, &key);[m
[31m-}[m
[31m-[m
[31m-/* Parse index expression with brackets. */[m
[31m-static void expr_bracket(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  lj_lex_next(ls);  /* Skip '['. */[m
[31m-  expr(ls, v);[m
[31m-  expr_toval(ls->fs, v);[m
[31m-  lex_check(ls, ']');[m
[31m-}[m
[31m-[m
[31m-/* Get value of constant expression. */[m
[31m-static void expr_kvalue(TValue *v, ExpDesc *e)[m
[31m-{[m
[31m-  if (e->k <= VKTRUE) {[m
[31m-    setpriV(v, ~(uint32_t)e->k);[m
[31m-  } else if (e->k == VKSTR) {[m
[31m-    setgcVraw(v, obj2gco(e->u.sval), LJ_TSTR);[m
[31m-  } else {[m
[31m-    lua_assert(tvisnumber(expr_numtv(e)));[m
[31m-    *v = *expr_numtv(e);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse table constructor expression. */[m
[31m-static void expr_table(LexState *ls, ExpDesc *e)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCLine line = ls->linenumber;[m
[31m-  GCtab *t = NULL;[m
[31m-  int vcall = 0, needarr = 0, fixt = 0;[m
[31m-  uint32_t narr = 1;  /* First array index. */[m
[31m-  uint32_t nhash = 0;  /* Number of hash entries. */[m
[31m-  BCReg freg = fs->freereg;[m
[31m-  BCPos pc = bcemit_AD(fs, BC_TNEW, freg, 0);[m
[31m-  expr_init(e, VNONRELOC, freg);[m
[31m-  bcreg_reserve(fs, 1);[m
[31m-  freg++;[m
[31m-  lex_check(ls, '{');[m
[31m-  while (ls->tok != '}') {[m
[31m-    ExpDesc key, val;[m
[31m-    vcall = 0;[m
[31m-    if (ls->tok == '[') {[m
[31m-      expr_bracket(ls, &key);  /* Already calls expr_toval. */[m
[31m-      if (!expr_isk(&key)) expr_index(fs, e, &key);[m
[31m-      if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++;[m
[31m-      lex_check(ls, '=');[m
[31m-    } else if ((ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) &&[m
[31m-	       lj_lex_lookahead(ls) == '=') {[m
[31m-      expr_str(ls, &key);[m
[31m-      lex_check(ls, '=');[m
[31m-      nhash++;[m
[31m-    } else {[m
[31m-      expr_init(&key, VKNUM, 0);[m
[31m-      setintV(&key.u.nval, (int)narr);[m
[31m-      narr++;[m
[31m-      needarr = vcall = 1;[m
[31m-    }[m
[31m-    expr(ls, &val);[m
[31m-    if (expr_isk(&key) && key.k != VKNIL &&[m
[31m-	(key.k == VKSTR || expr_isk_nojump(&val))) {[m
[31m-      TValue k, *v;[m
[31m-      if (!t) {  /* Create template table on demand. */[m
[31m-	BCReg kidx;[m
[31m-	t = lj_tab_new(fs->L, needarr ? narr : 0, hsize2hbits(nhash));[m
[31m-	kidx = const_gc(fs, obj2gco(t), LJ_TTAB);[m
[31m-	fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx);[m
[31m-      }[m
[31m-      vcall = 0;[m
[31m-      expr_kvalue(&k, &key);[m
[31m-      v = lj_tab_set(fs->L, t, &k);[m
[31m-      lj_gc_anybarriert(fs->L, t);[m
[31m-      if (expr_isk_nojump(&val)) {  /* Add const key/value to template table. */[m
[31m-	expr_kvalue(v, &val);[m
[31m-      } else {  /* Otherwise create dummy string key (avoids lj_tab_newkey). */[m
[31m-	settabV(fs->L, v, t);  /* Preserve key with table itself as value. */[m
[31m-	fixt = 1;   /* Fix this later, after all resizes. */[m
[31m-	goto nonconst;[m
[31m-      }[m
[31m-    } else {[m
[31m-    nonconst:[m
[31m-      if (val.k != VCALL) { expr_toanyreg(fs, &val); vcall = 0; }[m
[31m-      if (expr_isk(&key)) expr_index(fs, e, &key);[m
[31m-      bcemit_store(fs, e, &val);[m
[31m-    }[m
[31m-    fs->freereg = freg;[m
[31m-    if (!lex_opt(ls, ',') && !lex_opt(ls, ';')) break;[m
[31m-  }[m
[31m-  lex_match(ls, '}', '{', line);[m
[31m-  if (vcall) {[m
[31m-    BCInsLine *ilp = &fs->bcbase[fs->pc-1];[m
[31m-    ExpDesc en;[m
[31m-    lua_assert(bc_a(ilp->ins) == freg &&[m
[31m-	       bc_op(ilp->ins) == (narr > 256 ? BC_TSETV : BC_TSETB));[m
[31m-    expr_init(&en, VKNUM, 0);[m
[31m-    en.u.nval.u32.lo = narr-1;[m
[31m-    en.u.nval.u32.hi = 0x43300000;  /* Biased integer to avoid denormals. */[m
[31m-    if (narr > 256) { fs->pc--; ilp--; }[m
[31m-    ilp->ins = BCINS_AD(BC_TSETM, freg, const_num(fs, &en));[m
[31m-    setbc_b(&ilp[-1].ins, 0);[m
[31m-  }[m
[31m-  if (pc == fs->pc-1) {  /* Make expr relocable if possible. */[m
[31m-    e->u.s.info = pc;[m
[31m-    fs->freereg--;[m
[31m-    e->k = VRELOCABLE;[m
[31m-  } else {[m
[31m-    e->k = VNONRELOC;  /* May have been changed by expr_index. */[m
[31m-  }[m
[31m-  if (!t) {  /* Construct TNEW RD: hhhhhaaaaaaaaaaa. */[m
[31m-    BCIns *ip = &fs->bcbase[pc].ins;[m
[31m-    if (!needarr) narr = 0;[m
[31m-    else if (narr < 3) narr = 3;[m
[31m-    else if (narr > 0x7ff) narr = 0x7ff;[m
[31m-    setbc_d(ip, narr|(hsize2hbits(nhash)<<11));[m
[31m-  } else {[m
[31m-    if (needarr && t->asize < narr)[m
[31m-      lj_tab_reasize(fs->L, t, narr-1);[m
[31m-    if (fixt) {  /* Fix value for dummy keys in template table. */[m
[31m-      Node *node = noderef(t->node);[m
[31m-      uint32_t i, hmask = t->hmask;[m
[31m-      for (i = 0; i <= hmask; i++) {[m
[31m-	Node *n = &node[i];[m
[31m-	if (tvistab(&n->val)) {[m
[31m-	  lua_assert(tabV(&n->val) == t);[m
[31m-	  setnilV(&n->val);  /* Turn value into nil. */[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    lj_gc_check(fs->L);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse function parameters. */[m
[31m-static BCReg parse_params(LexState *ls, int needself)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCReg nparams = 0;[m
[31m-  lex_check(ls, '(');[m
[31m-  if (needself)[m
[31m-    var_new_lit(ls, nparams++, "self");[m
[31m-  if (ls->tok != ')') {[m
[31m-    do {[m
[31m-      if (ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) {[m
[31m-	var_new(ls, nparams++, lex_str(ls));[m
[31m-      } else if (ls->tok == TK_dots) {[m
[31m-	lj_lex_next(ls);[m
[31m-	fs->flags |= PROTO_VARARG;[m
[31m-	break;[m
[31m-      } else {[m
[31m-	err_syntax(ls, LJ_ERR_XPARAM);[m
[31m-      }[m
[31m-    } while (lex_opt(ls, ','));[m
[31m-  }[m
[31m-  var_add(ls, nparams);[m
[31m-  lua_assert(fs->nactvar == nparams);[m
[31m-  bcreg_reserve(fs, nparams);[m
[31m-  lex_check(ls, ')');[m
[31m-  return nparams;[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static void parse_chunk(LexState *ls);[m
[31m-[m
[31m-/* Parse body of a function. */[m
[31m-static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line)[m
[31m-{[m
[31m-  FuncState fs, *pfs = ls->fs;[m
[31m-  FuncScope bl;[m
[31m-  GCproto *pt;[m
[31m-  ptrdiff_t oldbase = pfs->bcbase - ls->bcstack;[m
[31m-  fs_init(ls, &fs);[m
[31m-  fscope_begin(&fs, &bl, 0);[m
[31m-  fs.linedefined = line;[m
[31m-  fs.numparams = (uint8_t)parse_params(ls, needself);[m
[31m-  fs.bcbase = pfs->bcbase + pfs->pc;[m
[31m-  fs.bclim = pfs->bclim - pfs->pc;[m
[31m-  bcemit_AD(&fs, BC_FUNCF, 0, 0);  /* Placeholder. */[m
[31m-  parse_chunk(ls);[m
[31m-  if (ls->tok != TK_end) lex_match(ls, TK_end, TK_function, line);[m
[31m-  pt = fs_finish(ls, (ls->lastline = ls->linenumber));[m
[31m-  pfs->bcbase = ls->bcstack + oldbase;  /* May have been reallocated. */[m
[31m-  pfs->bclim = (BCPos)(ls->sizebcstack - oldbase);[m
[31m-  /* Store new prototype in the constant array of the parent. */[m
[31m-  expr_init(e, VRELOCABLE,[m
[31m-	    bcemit_AD(pfs, BC_FNEW, 0, const_gc(pfs, obj2gco(pt), LJ_TPROTO)));[m
[31m-#if LJ_HASFFI[m
[31m-  pfs->flags |= (fs.flags & PROTO_FFI);[m
[31m-#endif[m
[31m-  if (!(pfs->flags & PROTO_CHILD)) {[m
[31m-    if (pfs->flags & PROTO_HAS_RETURN)[m
[31m-      pfs->flags |= PROTO_FIXUP_RETURN;[m
[31m-    pfs->flags |= PROTO_CHILD;[m
[31m-  }[m
[31m-  lj_lex_next(ls);[m
[31m-}[m
[31m-[m
[31m-/* Parse expression list. Last expression is left open. */[m
[31m-static BCReg expr_list(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  BCReg n = 1;[m
[31m-  expr(ls, v);[m
[31m-  while (lex_opt(ls, ',')) {[m
[31m-    expr_tonextreg(ls->fs, v);[m
[31m-    expr(ls, v);[m
[31m-    n++;[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-/* Parse function argument list. */[m
[31m-static void parse_args(LexState *ls, ExpDesc *e)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  ExpDesc args;[m
[31m-  BCIns ins;[m
[31m-  BCReg base;[m
[31m-  BCLine line = ls->linenumber;[m
[31m-  if (ls->tok == '(') {[m
[31m-#if !LJ_52[m
[31m-    if (line != ls->lastline)[m
[31m-      err_syntax(ls, LJ_ERR_XAMBIG);[m
[31m-#endif[m
[31m-    lj_lex_next(ls);[m
[31m-    if (ls->tok == ')') {  /* f(). */[m
[31m-      args.k = VVOID;[m
[31m-    } else {[m
[31m-      expr_list(ls, &args);[m
[31m-      if (args.k == VCALL)  /* f(a, b, g()) or f(a, b, ...). */[m
[31m-	setbc_b(bcptr(fs, &args), 0);  /* Pass on multiple results. */[m
[31m-    }[m
[31m-    lex_match(ls, ')', '(', line);[m
[31m-  } else if (ls->tok == '{') {[m
[31m-    expr_table(ls, &args);[m
[31m-  } else if (ls->tok == TK_string) {[m
[31m-    expr_init(&args, VKSTR, 0);[m
[31m-    args.u.sval = strV(&ls->tokval);[m
[31m-    lj_lex_next(ls);[m
[31m-  } else {[m
[31m-    err_syntax(ls, LJ_ERR_XFUNARG);[m
[31m-    return;  /* Silence compiler. */[m
[31m-  }[m
[31m-  lua_assert(e->k == VNONRELOC);[m
[31m-  base = e->u.s.info;  /* Base register for call. */[m
[31m-  if (args.k == VCALL) {[m
[31m-    ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1 - LJ_FR2);[m
[31m-  } else {[m
[31m-    if (args.k != VVOID)[m
[31m-      expr_tonextreg(fs, &args);[m
[31m-    ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base - LJ_FR2);[m
[31m-  }[m
[31m-  expr_init(e, VCALL, bcemit_INS(fs, ins));[m
[31m-  e->u.s.aux = base;[m
[31m-  fs->bcbase[fs->pc - 1].line = line;[m
[31m-  fs->freereg = base+1;  /* Leave one result by default. */[m
[31m-}[m
[31m-[m
[31m-/* Parse primary expression. */[m
[31m-static void expr_primary(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  /* Parse prefix expression. */[m
[31m-  if (ls->tok == '(') {[m
[31m-    BCLine line = ls->linenumber;[m
[31m-    lj_lex_next(ls);[m
[31m-    expr(ls, v);[m
[31m-    lex_match(ls, ')', '(', line);[m
[31m-    expr_discharge(ls->fs, v);[m
[31m-  } else if (ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) {[m
[31m-    var_lookup(ls, v);[m
[31m-  } else {[m
[31m-    err_syntax(ls, LJ_ERR_XSYMBOL);[m
[31m-  }[m
[31m-  for (;;) {  /* Parse multiple expression suffixes. */[m
[31m-    if (ls->tok == '.') {[m
[31m-      expr_field(ls, v);[m
[31m-    } else if (ls->tok == '[') {[m
[31m-      ExpDesc key;[m
[31m-      expr_toanyreg(fs, v);[m
[31m-      expr_bracket(ls, &key);[m
[31m-      expr_index(fs, v, &key);[m
[31m-    } else if (ls->tok == ':') {[m
[31m-      ExpDesc key;[m
[31m-      lj_lex_next(ls);[m
[31m-      expr_str(ls, &key);[m
[31m-      bcemit_method(fs, v, &key);[m
[31m-      parse_args(ls, v);[m
[31m-    } else if (ls->tok == '(' || ls->tok == TK_string || ls->tok == '{') {[m
[31m-      expr_tonextreg(fs, v);[m
[31m-      if (LJ_FR2) bcreg_reserve(fs, 1);[m
[31m-      parse_args(ls, v);[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse simple expression. */[m
[31m-static void expr_simple(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  switch (ls->tok) {[m
[31m-  case TK_number:[m
[31m-    expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokval)) ? VKCDATA : VKNUM, 0);[m
[31m-    copyTV(ls->L, &v->u.nval, &ls->tokval);[m
[31m-    break;[m
[31m-  case TK_string:[m
[31m-    expr_init(v, VKSTR, 0);[m
[31m-    v->u.sval = strV(&ls->tokval);[m
[31m-    break;[m
[31m-  case TK_nil:[m
[31m-    expr_init(v, VKNIL, 0);[m
[31m-    break;[m
[31m-  case TK_true:[m
[31m-    expr_init(v, VKTRUE, 0);[m
[31m-    break;[m
[31m-  case TK_false:[m
[31m-    expr_init(v, VKFALSE, 0);[m
[31m-    break;[m
[31m-  case TK_dots: {  /* Vararg. */[m
[31m-    FuncState *fs = ls->fs;[m
[31m-    BCReg base;[m
[31m-    checkcond(ls, fs->flags & PROTO_VARARG, LJ_ERR_XDOTS);[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-    base = fs->freereg-1;[m
[31m-    expr_init(v, VCALL, bcemit_ABC(fs, BC_VARG, base, 2, fs->numparams));[m
[31m-    v->u.s.aux = base;[m
[31m-    break;[m
[31m-  }[m
[31m-  case '{':  /* Table constructor. */[m
[31m-    expr_table(ls, v);[m
[31m-    return;[m
[31m-  case TK_function:[m
[31m-    lj_lex_next(ls);[m
[31m-    parse_body(ls, v, 0, ls->linenumber);[m
[31m-    return;[m
[31m-  default:[m
[31m-    expr_primary(ls, v);[m
[31m-    return;[m
[31m-  }[m
[31m-  lj_lex_next(ls);[m
[31m-}[m
[31m-[m
[31m-/* Manage syntactic levels to avoid blowing up the stack. */[m
[31m-static void synlevel_begin(LexState *ls)[m
[31m-{[m
[31m-  if (++ls->level >= LJ_MAX_XLEVEL)[m
[31m-    lj_lex_error(ls, 0, LJ_ERR_XLEVELS);[m
[31m-}[m
[31m-[m
[31m-#define synlevel_end(ls)	((ls)->level--)[m
[31m-[m
[31m-/* Convert token to binary operator. */[m
[31m-static BinOpr token2binop(LexToken tok)[m
[31m-{[m
[31m-  switch (tok) {[m
[31m-  case '+':	return OPR_ADD;[m
[31m-  case '-':	return OPR_SUB;[m
[31m-  case '*':	return OPR_MUL;[m
[31m-  case '/':	return OPR_DIV;[m
[31m-  case '%':	return OPR_MOD;[m
[31m-  case '^':	return OPR_POW;[m
[31m-  case TK_concat: return OPR_CONCAT;[m
[31m-  case TK_ne:	return OPR_NE;[m
[31m-  case TK_eq:	return OPR_EQ;[m
[31m-  case '<':	return OPR_LT;[m
[31m-  case TK_le:	return OPR_LE;[m
[31m-  case '>':	return OPR_GT;[m
[31m-  case TK_ge:	return OPR_GE;[m
[31m-  case TK_and:	return OPR_AND;[m
[31m-  case TK_or:	return OPR_OR;[m
[31m-  default:	return OPR_NOBINOPR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Priorities for each binary operator. ORDER OPR. */[m
[31m-static const struct {[m
[31m-  uint8_t left;		/* Left priority. */[m
[31m-  uint8_t right;	/* Right priority. */[m
[31m-} priority[] = {[m
[31m-  {6,6}, {6,6}, {7,7}, {7,7}, {7,7},	/* ADD SUB MUL DIV MOD */[m
[31m-  {10,9}, {5,4},			/* POW CONCAT (right associative) */[m
[31m-  {3,3}, {3,3},				/* EQ NE */[m
[31m-  {3,3}, {3,3}, {3,3}, {3,3},		/* LT GE GT LE */[m
[31m-  {2,2}, {1,1}				/* AND OR */[m
[31m-};[m
[31m-[m
[31m-#define UNARY_PRIORITY		8  /* Priority for unary operators. */[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit);[m
[31m-[m
[31m-/* Parse unary expression. */[m
[31m-static void expr_unop(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  BCOp op;[m
[31m-  if (ls->tok == TK_not) {[m
[31m-    op = BC_NOT;[m
[31m-  } else if (ls->tok == '-') {[m
[31m-    op = BC_UNM;[m
[31m-  } else if (ls->tok == '#') {[m
[31m-    op = BC_LEN;[m
[31m-  } else {[m
[31m-    expr_simple(ls, v);[m
[31m-    return;[m
[31m-  }[m
[31m-  lj_lex_next(ls);[m
[31m-  expr_binop(ls, v, UNARY_PRIORITY);[m
[31m-  bcemit_unop(ls->fs, op, v);[m
[31m-}[m
[31m-[m
[31m-/* Parse binary expressions with priority higher than the limit. */[m
[31m-static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit)[m
[31m-{[m
[31m-  BinOpr op;[m
[31m-  synlevel_begin(ls);[m
[31m-  expr_unop(ls, v);[m
[31m-  op = token2binop(ls->tok);[m
[31m-  while (op != OPR_NOBINOPR && priority[op].left > limit) {[m
[31m-    ExpDesc v2;[m
[31m-    BinOpr nextop;[m
[31m-    lj_lex_next(ls);[m
[31m-    bcemit_binop_left(ls->fs, op, v);[m
[31m-    /* Parse binary expression with higher priority. */[m
[31m-    nextop = expr_binop(ls, &v2, priority[op].right);[m
[31m-    bcemit_binop(ls->fs, op, v, &v2);[m
[31m-    op = nextop;[m
[31m-  }[m
[31m-  synlevel_end(ls);[m
[31m-  return op;  /* Return unconsumed binary operator (if any). */[m
[31m-}[m
[31m-[m
[31m-/* Parse expression. */[m
[31m-static void expr(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  expr_binop(ls, v, 0);  /* Priority 0: parse whole expression. */[m
[31m-}[m
[31m-[m
[31m-/* Assign expression to the next register. */[m
[31m-static void expr_next(LexState *ls)[m
[31m-{[m
[31m-  ExpDesc e;[m
[31m-  expr(ls, &e);[m
[31m-  expr_tonextreg(ls->fs, &e);[m
[31m-}[m
[31m-[m
[31m-/* Parse conditional expression. */[m
[31m-static BCPos expr_cond(LexState *ls)[m
[31m-{[m
[31m-  ExpDesc v;[m
[31m-  expr(ls, &v);[m
[31m-  if (v.k == VKNIL) v.k = VKFALSE;[m
[31m-  bcemit_branch_t(ls->fs, &v);[m
[31m-  return v.f;[m
[31m-}[m
[31m-[m
[31m-/* -- Assignments --------------------------------------------------------- */[m
[31m-[m
[31m-/* List of LHS variables. */[m
[31m-typedef struct LHSVarList {[m
[31m-  ExpDesc v;			/* LHS variable. */[m
[31m-  struct LHSVarList *prev;	/* Link to previous LHS variable. */[m
[31m-} LHSVarList;[m
[31m-[m
[31m-/* Eliminate write-after-read hazards for local variable assignment. */[m
[31m-static void assign_hazard(LexState *ls, LHSVarList *lh, const ExpDesc *v)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCReg reg = v->u.s.info;  /* Check against this variable. */[m
[31m-  BCReg tmp = fs->freereg;  /* Rename to this temp. register (if needed). */[m
[31m-  int hazard = 0;[m
[31m-  for (; lh; lh = lh->prev) {[m
[31m-    if (lh->v.k == VINDEXED) {[m
[31m-      if (lh->v.u.s.info == reg) {  /* t[i], t = 1, 2 */[m
[31m-	hazard = 1;[m
[31m-	lh->v.u.s.info = tmp;[m
[31m-      }[m
[31m-      if (lh->v.u.s.aux == reg) {  /* t[i], i = 1, 2 */[m
[31m-	hazard = 1;[m
[31m-	lh->v.u.s.aux = tmp;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (hazard) {[m
[31m-    bcemit_AD(fs, BC_MOV, tmp, reg);  /* Rename conflicting variable. */[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Adjust LHS/RHS of an assignment. */[m
[31m-static void assign_adjust(LexState *ls, BCReg nvars, BCReg nexps, ExpDesc *e)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int32_t extra = (int32_t)nvars - (int32_t)nexps;[m
[31m-  if (e->k == VCALL) {[m
[31m-    extra++;  /* Compensate for the VCALL itself. */[m
[31m-    if (extra < 0) extra = 0;[m
[31m-    setbc_b(bcptr(fs, e), extra+1);  /* Fixup call results. */[m
[31m-    if (extra > 1) bcreg_reserve(fs, (BCReg)extra-1);[m
[31m-  } else {[m
[31m-    if (e->k != VVOID)[m
[31m-      expr_tonextreg(fs, e);  /* Close last expression. */[m
[31m-    if (extra > 0) {  /* Leftover LHS are set to nil. */[m
[31m-      BCReg reg = fs->freereg;[m
[31m-      bcreg_reserve(fs, (BCReg)extra);[m
[31m-      bcemit_nil(fs, reg, (BCReg)extra);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Recursively parse assignment statement. */[m
[31m-static void parse_assignment(LexState *ls, LHSVarList *lh, BCReg nvars)[m
[31m-{[m
[31m-  ExpDesc e;[m
[31m-  checkcond(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, LJ_ERR_XSYNTAX);[m
[31m-  if (lex_opt(ls, ',')) {  /* Collect LHS list and recurse upwards. */[m
[31m-    LHSVarList vl;[m
[31m-    vl.prev = lh;[m
[31m-    expr_primary(ls, &vl.v);[m
[31m-    if (vl.v.k == VLOCAL)[m
[31m-      assign_hazard(ls, lh, &vl.v);[m
[31m-    checklimit(ls->fs, ls->level + nvars, LJ_MAX_XLEVEL, "variable names");[m
[31m-    parse_assignment(ls, &vl, nvars+1);[m
[31m-  } else {  /* Parse RHS. */[m
[31m-    BCReg nexps;[m
[31m-    lex_check(ls, '=');[m
[31m-    nexps = expr_list(ls, &e);[m
[31m-    if (nexps == nvars) {[m
[31m-      if (e.k == VCALL) {[m
[31m-	if (bc_op(*bcptr(ls->fs, &e)) == BC_VARG) {  /* Vararg assignment. */[m
[31m-	  ls->fs->freereg--;[m
[31m-	  e.k = VRELOCABLE;[m
[31m-	} else {  /* Multiple call results. */[m
[31m-	  e.u.s.info = e.u.s.aux;  /* Base of call is not relocatable. */[m
[31m-	  e.k = VNONRELOC;[m
[31m-	}[m
[31m-      }[m
[31m-      bcemit_store(ls->fs, &lh->v, &e);[m
[31m-      return;[m
[31m-    }[m
[31m-    assign_adjust(ls, nvars, nexps, &e);[m
[31m-    if (nexps > nvars)[m
[31m-      ls->fs->freereg -= nexps - nvars;  /* Drop leftover regs. */[m
[31m-  }[m
[31m-  /* Assign RHS to LHS and recurse downwards. */[m
[31m-  expr_init(&e, VNONRELOC, ls->fs->freereg-1);[m
[31m-  bcemit_store(ls->fs, &lh->v, &e);[m
[31m-}[m
[31m-[m
[31m-/* Parse call statement or assignment. */[m
[31m-static void parse_call_assign(LexState *ls)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  LHSVarList vl;[m
[31m-  expr_primary(ls, &vl.v);[m
[31m-  if (vl.v.k == VCALL) {  /* Function call statement. */[m
[31m-    setbc_b(bcptr(fs, &vl.v), 1);  /* No results. */[m
[31m-  } else {  /* Start of an assignment. */[m
[31m-    vl.prev = NULL;[m
[31m-    parse_assignment(ls, &vl, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse 'local' statement. */[m
[31m-static void parse_local(LexState *ls)[m
[31m-{[m
[31m-  if (lex_opt(ls, TK_function)) {  /* Local function declaration. */[m
[31m-    ExpDesc v, b;[m
[31m-    FuncState *fs = ls->fs;[m
[31m-    var_new(ls, 0, lex_str(ls));[m
[31m-    expr_init(&v, VLOCAL, fs->freereg);[m
[31m-    v.u.s.aux = fs->varmap[fs->freereg];[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-    var_add(ls, 1);[m
[31m-    parse_body(ls, &b, 0, ls->linenumber);[m
[31m-    /* bcemit_store(fs, &v, &b) without setting VSTACK_VAR_RW. */[m
[31m-    expr_free(fs, &b);[m
[31m-    expr_toreg(fs, &b, v.u.s.info);[m
[31m-    /* The upvalue is in scope, but the local is only valid after the store. */[m
[31m-    var_get(ls, fs, fs->nactvar - 1).startpc = fs->pc;[m
[31m-  } else {  /* Local variable declaration. */[m
[31m-    ExpDesc e;[m
[31m-    BCReg nexps, nvars = 0;[m
[31m-    do {  /* Collect LHS. */[m
[31m-      var_new(ls, nvars++, lex_str(ls));[m
[31m-    } while (lex_opt(ls, ','));[m
[31m-    if (lex_opt(ls, '=')) {  /* Optional RHS. */[m
[31m-      nexps = expr_list(ls, &e);[m
[31m-    } else {  /* Or implicitly set to nil. */[m
[31m-      e.k = VVOID;[m
[31m-      nexps = 0;[m
[31m-    }[m
[31m-    assign_adjust(ls, nvars, nexps, &e);[m
[31m-    var_add(ls, nvars);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse 'function' statement. */[m
[31m-static void parse_func(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs;[m
[31m-  ExpDesc v, b;[m
[31m-  int needself = 0;[m
[31m-  lj_lex_next(ls);  /* Skip 'function'. */[m
[31m-  /* Parse function name. */[m
[31m-  var_lookup(ls, &v);[m
[31m-  while (ls->tok == '.')  /* Multiple dot-separated fields. */[m
[31m-    expr_field(ls, &v);[m
[31m-  if (ls->tok == ':') {  /* Optional colon to signify method call. */[m
[31m-    needself = 1;[m
[31m-    expr_field(ls, &v);[m
[31m-  }[m
[31m-  parse_body(ls, &b, needself, line);[m
[31m-  fs = ls->fs;[m
[31m-  bcemit_store(fs, &v, &b);[m
[31m-  fs->bcbase[fs->pc - 1].line = line;  /* Set line for the store. */[m
[31m-}[m
[31m-[m
[31m-/* -- Control transfer statements ----------------------------------------- */[m
[31m-[m
[31m-/* Check for end of block. */[m
[31m-static int parse_isend(LexToken tok)[m
[31m-{[m
[31m-  switch (tok) {[m
[31m-  case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof:[m
[31m-    return 1;[m
[31m-  default:[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse 'return' statement. */[m
[31m-static void parse_return(LexState *ls)[m
[31m-{[m
[31m-  BCIns ins;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  lj_lex_next(ls);  /* Skip 'return'. */[m
[31m-  fs->flags |= PROTO_HAS_RETURN;[m
[31m-  if (parse_isend(ls->tok) || ls->tok == ';') {  /* Bare return. */[m
[31m-    ins = BCINS_AD(BC_RET0, 0, 1);[m
[31m-  } else {  /* Return with one or more values. */[m
[31m-    ExpDesc e;  /* Receives the _last_ expression in the list. */[m
[31m-    BCReg nret = expr_list(ls, &e);[m
[31m-    if (nret == 1) {  /* Return one result. */[m
[31m-      if (e.k == VCALL) {  /* Check for tail call. */[m
[31m-	BCIns *ip = bcptr(fs, &e);[m
[31m-	/* It doesn't pay off to add BC_VARGT just for 'return ...'. */[m
[31m-	if (bc_op(*ip) == BC_VARG) goto notailcall;[m
[31m-	fs->pc--;[m
[31m-	ins = BCINS_AD(bc_op(*ip)-BC_CALL+BC_CALLT, bc_a(*ip), bc_c(*ip));[m
[31m-      } else {  /* Can return the result from any register. */[m
[31m-	ins = BCINS_AD(BC_RET1, expr_toanyreg(fs, &e), 2);[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (e.k == VCALL) {  /* Append all results from a call. */[m
[31m-      notailcall:[m
[31m-	setbc_b(bcptr(fs, &e), 0);[m
[31m-	ins = BCINS_AD(BC_RETM, fs->nactvar, e.u.s.aux - fs->nactvar);[m
[31m-      } else {[m
[31m-	expr_tonextreg(fs, &e);  /* Force contiguous registers. */[m
[31m-	ins = BCINS_AD(BC_RET, fs->nactvar, nret+1);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (fs->flags & PROTO_CHILD)[m
[31m-    bcemit_AJ(fs, BC_UCLO, 0, 0);  /* May need to close upvalues first. */[m
[31m-  bcemit_INS(fs, ins);[m
[31m-}[m
[31m-[m
[31m-/* Parse 'break' statement. */[m
[31m-static void parse_break(LexState *ls)[m
[31m-{[m
[31m-  ls->fs->bl->flags |= FSCOPE_BREAK;[m
[31m-  gola_new(ls, NAME_BREAK, VSTACK_GOTO, bcemit_jmp(ls->fs));[m
[31m-}[m
[31m-[m
[31m-/* Parse 'goto' statement. */[m
[31m-static void parse_goto(LexState *ls)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  GCstr *name = lex_str(ls);[m
[31m-  VarInfo *vl = gola_findlabel(ls, name);[m
[31m-  if (vl)  /* Treat backwards goto within same scope like a loop. */[m
[31m-    bcemit_AJ(fs, BC_LOOP, vl->slot, -1);  /* No BC range check. */[m
[31m-  fs->bl->flags |= FSCOPE_GOLA;[m
[31m-  gola_new(ls, name, VSTACK_GOTO, bcemit_jmp(fs));[m
[31m-}[m
[31m-[m
[31m-/* Parse label. */[m
[31m-static void parse_label(LexState *ls)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  GCstr *name;[m
[31m-  MSize idx;[m
[31m-  fs->lasttarget = fs->pc;[m
[31m-  fs->bl->flags |= FSCOPE_GOLA;[m
[31m-  lj_lex_next(ls);  /* Skip '::'. */[m
[31m-  name = lex_str(ls);[m
[31m-  if (gola_findlabel(ls, name))[m
[31m-    lj_lex_error(ls, 0, LJ_ERR_XLDUP, strdata(name));[m
[31m-  idx = gola_new(ls, name, VSTACK_LABEL, fs->pc);[m
[31m-  lex_check(ls, TK_label);[m
[31m-  /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */[m
[31m-  for (;;) {[m
[31m-    if (ls->tok == TK_label) {[m
[31m-      synlevel_begin(ls);[m
[31m-      parse_label(ls);[m
[31m-      synlevel_end(ls);[m
[31m-    } else if (LJ_52 && ls->tok == ';') {[m
[31m-      lj_lex_next(ls);[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Trailing label is considered to be outside of scope. */[m
[31m-  if (parse_isend(ls->tok) && ls->tok != TK_until)[m
[31m-    ls->vstack[idx].slot = fs->bl->nactvar;[m
[31m-  gola_resolve(ls, fs->bl, idx);[m
[31m-}[m
[31m-[m
[31m-/* -- Blocks, loops and conditional statements ---------------------------- */[m
[31m-[m
[31m-/* Parse a block. */[m
[31m-static void parse_block(LexState *ls)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  FuncScope bl;[m
[31m-  fscope_begin(fs, &bl, 0);[m
[31m-  parse_chunk(ls);[m
[31m-  fscope_end(fs);[m
[31m-}[m
[31m-[m
[31m-/* Parse 'while' statement. */[m
[31m-static void parse_while(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos start, loop, condexit;[m
[31m-  FuncScope bl;[m
[31m-  lj_lex_next(ls);  /* Skip 'while'. */[m
[31m-  start = fs->lasttarget = fs->pc;[m
[31m-  condexit = expr_cond(ls);[m
[31m-  fscope_begin(fs, &bl, FSCOPE_LOOP);[m
[31m-  lex_check(ls, TK_do);[m
[31m-  loop = bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);[m
[31m-  parse_block(ls);[m
[31m-  jmp_patch(fs, bcemit_jmp(fs), start);[m
[31m-  lex_match(ls, TK_end, TK_while, line);[m
[31m-  fscope_end(fs);[m
[31m-  jmp_tohere(fs, condexit);[m
[31m-  jmp_patchins(fs, loop, fs->pc);[m
[31m-}[m
[31m-[m
[31m-/* Parse 'repeat' statement. */[m
[31m-static void parse_repeat(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos loop = fs->lasttarget = fs->pc;[m
[31m-  BCPos condexit;[m
[31m-  FuncScope bl1, bl2;[m
[31m-  fscope_begin(fs, &bl1, FSCOPE_LOOP);  /* Breakable loop scope. */[m
[31m-  fscope_begin(fs, &bl2, 0);  /* Inner scope. */[m
[31m-  lj_lex_next(ls);  /* Skip 'repeat'. */[m
[31m-  bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);[m
[31m-  parse_chunk(ls);[m
[31m-  lex_match(ls, TK_until, TK_repeat, line);[m
[31m-  condexit = expr_cond(ls);  /* Parse condition (still inside inner scope). */[m
[31m-  if (!(bl2.flags & FSCOPE_UPVAL)) {  /* No upvalues? Just end inner scope. */[m
[31m-    fscope_end(fs);[m
[31m-  } else {  /* Otherwise generate: cond: UCLO+JMP out, !cond: UCLO+JMP loop. */[m
[31m-    parse_break(ls);  /* Break from loop and close upvalues. */[m
[31m-    jmp_tohere(fs, condexit);[m
[31m-    fscope_end(fs);  /* End inner scope and close upvalues. */[m
[31m-    condexit = bcemit_jmp(fs);[m
[31m-  }[m
[31m-  jmp_patch(fs, condexit, loop);  /* Jump backwards if !cond. */[m
[31m-  jmp_patchins(fs, loop, fs->pc);[m
[31m-  fscope_end(fs);  /* End loop scope. */[m
[31m-}[m
[31m-[m
[31m-/* Parse numeric 'for'. */[m
[31m-static void parse_for_num(LexState *ls, GCstr *varname, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCReg base = fs->freereg;[m
[31m-  FuncScope bl;[m
[31m-  BCPos loop, loopend;[m
[31m-  /* Hidden control variables. */[m
[31m-  var_new_fixed(ls, FORL_IDX, VARNAME_FOR_IDX);[m
[31m-  var_new_fixed(ls, FORL_STOP, VARNAME_FOR_STOP);[m
[31m-  var_new_fixed(ls, FORL_STEP, VARNAME_FOR_STEP);[m
[31m-  /* Visible copy of index variable. */[m
[31m-  var_new(ls, FORL_EXT, varname);[m
[31m-  lex_check(ls, '=');[m
[31m-  expr_next(ls);[m
[31m-  lex_check(ls, ',');[m
[31m-  expr_next(ls);[m
[31m-  if (lex_opt(ls, ',')) {[m
[31m-    expr_next(ls);[m
[31m-  } else {[m
[31m-    bcemit_AD(fs, BC_KSHORT, fs->freereg, 1);  /* Default step is 1. */[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-  }[m
[31m-  var_add(ls, 3);  /* Hidden control variables. */[m
[31m-  lex_check(ls, TK_do);[m
[31m-  loop = bcemit_AJ(fs, BC_FORI, base, NO_JMP);[m
[31m-  fscope_begin(fs, &bl, 0);  /* Scope for visible variables. */[m
[31m-  var_add(ls, 1);[m
[31m-  bcreg_reserve(fs, 1);[m
[31m-  parse_block(ls);[m
[31m-  fscope_end(fs);[m
[31m-  /* Perform loop inversion. Loop control instructions are at the end. */[m
[31m-  loopend = bcemit_AJ(fs, BC_FORL, base, NO_JMP);[m
[31m-  fs->bcbase[loopend].line = line;  /* Fix line for control ins. */[m
[31m-  jmp_patchins(fs, loopend, loop+1);[m
[31m-  jmp_patchins(fs, loop, fs->pc);[m
[31m-}[m
[31m-[m
[31m-/* Try to predict whether the iterator is next() and specialize the bytecode.[m
[31m-** Detecting next() and pairs() by name is simplistic, but quite effective.[m
[31m-** The interpreter backs off if the check for the closure fails at runtime.[m
[31m-*/[m
[31m-static int predict_next(LexState *ls, FuncState *fs, BCPos pc)[m
[31m-{[m
[31m-  BCIns ins = fs->bcbase[pc].ins;[m
[31m-  GCstr *name;[m
[31m-  cTValue *o;[m
[31m-  switch (bc_op(ins)) {[m
[31m-  case BC_MOV:[m
[31m-    name = gco2str(gcref(var_get(ls, fs, bc_d(ins)).name));[m
[31m-    break;[m
[31m-  case BC_UGET:[m
[31m-    name = gco2str(gcref(ls->vstack[fs->uvmap[bc_d(ins)]].name));[m
[31m-    break;[m
[31m-  case BC_GGET:[m
[31m-    /* There's no inverse index (yet), so lookup the strings. */[m
[31m-    o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "pairs"));[m
[31m-    if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))[m
[31m-      return 1;[m
[31m-    o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "next"));[m
[31m-    if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))[m
[31m-      return 1;[m
[31m-    return 0;[m
[31m-  default:[m
[31m-    return 0;[m
[31m-  }[m
[31m-  return (name->len == 5 && !strcmp(strdata(name), "pairs")) ||[m
[31m-	 (name->len == 4 && !strcmp(strdata(name), "next"));[m
[31m-}[m
[31m-[m
[31m-/* Parse 'for' iterator. */[m
[31m-static void parse_for_iter(LexState *ls, GCstr *indexname)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  ExpDesc e;[m
[31m-  BCReg nvars = 0;[m
[31m-  BCLine line;[m
[31m-  BCReg base = fs->freereg + 3;[m
[31m-  BCPos loop, loopend, exprpc = fs->pc;[m
[31m-  FuncScope bl;[m
[31m-  int isnext;[m
[31m-  /* Hidden control variables. */[m
[31m-  var_new_fixed(ls, nvars++, VARNAME_FOR_GEN);[m
[31m-  var_new_fixed(ls, nvars++, VARNAME_FOR_STATE);[m
[31m-  var_new_fixed(ls, nvars++, VARNAME_FOR_CTL);[m
[31m-  /* Visible variables returned from iterator. */[m
[31m-  var_new(ls, nvars++, indexname);[m
[31m-  while (lex_opt(ls, ','))[m
[31m-    var_new(ls, nvars++, lex_str(ls));[m
[31m-  lex_check(ls, TK_in);[m
[31m-  line = ls->linenumber;[m
[31m-  assign_adjust(ls, 3, expr_list(ls, &e), &e);[m
[31m-  /* The iterator needs another 3 [4] slots (func [pc] | state ctl). */[m
[31m-  bcreg_bump(fs, 3+LJ_FR2);[m
[31m-  isnext = (nvars <= 5 && predict_next(ls, fs, exprpc));[m
[31m-  var_add(ls, 3);  /* Hidden control variables. */[m
[31m-  lex_check(ls, TK_do);[m
[31m-  loop = bcemit_AJ(fs, isnext ? BC_ISNEXT : BC_JMP, base, NO_JMP);[m
[31m-  fscope_begin(fs, &bl, 0);  /* Scope for visible variables. */[m
[31m-  var_add(ls, nvars-3);[m
[31m-  bcreg_reserve(fs, nvars-3);[m
[31m-  parse_block(ls);[m
[31m-  fscope_end(fs);[m
[31m-  /* Perform loop inversion. Loop control instructions are at the end. */[m
[31m-  jmp_patchins(fs, loop, fs->pc);[m
[31m-  bcemit_ABC(fs, isnext ? BC_ITERN : BC_ITERC, base, nvars-3+1, 2+1);[m
[31m-  loopend = bcemit_AJ(fs, BC_ITERL, base, NO_JMP);[m
[31m-  fs->bcbase[loopend-1].line = line;  /* Fix line for control ins. */[m
[31m-  fs->bcbase[loopend].line = line;[m
[31m-  jmp_patchins(fs, loopend, loop+1);[m
[31m-}[m
[31m-[m
[31m-/* Parse 'for' statement. */[m
[31m-static void parse_for(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  GCstr *varname;[m
[31m-  FuncScope bl;[m
[31m-  fscope_begin(fs, &bl, FSCOPE_LOOP);[m
[31m-  lj_lex_next(ls);  /* Skip 'for'. */[m
[31m-  varname = lex_str(ls);  /* Get first variable name. */[m
[31m-  if (ls->tok == '=')[m
[31m-    parse_for_num(ls, varname, line);[m
[31m-  else if (ls->tok == ',' || ls->tok == TK_in)[m
[31m-    parse_for_iter(ls, varname);[m
[31m-  else[m
[31m-    err_syntax(ls, LJ_ERR_XFOR);[m
[31m-  lex_match(ls, TK_end, TK_for, line);[m
[31m-  fscope_end(fs);  /* Resolve break list. */[m
[31m-}[m
[31m-[m
[31m-/* Parse condition and 'then' block. */[m
[31m-static BCPos parse_then(LexState *ls)[m
[31m-{[m
[31m-  BCPos condexit;[m
[31m-  lj_lex_next(ls);  /* Skip 'if' or 'elseif'. */[m
[31m-  condexit = expr_cond(ls);[m
[31m-  lex_check(ls, TK_then);[m
[31m-  parse_block(ls);[m
[31m-  return condexit;[m
[31m-}[m
[31m-[m
[31m-/* Parse 'if' statement. */[m
[31m-static void parse_if(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos flist;[m
[31m-  BCPos escapelist = NO_JMP;[m
[31m-  flist = parse_then(ls);[m
[31m-  while (ls->tok == TK_elseif) {  /* Parse multiple 'elseif' blocks. */[m
[31m-    jmp_append(fs, &escapelist, bcemit_jmp(fs));[m
[31m-    jmp_tohere(fs, flist);[m
[31m-    flist = parse_then(ls);[m
[31m-  }[m
[31m-  if (ls->tok == TK_else) {  /* Parse optional 'else' block. */[m
[31m-    jmp_append(fs, &escapelist, bcemit_jmp(fs));[m
[31m-    jmp_tohere(fs, flist);[m
[31m-    lj_lex_next(ls);  /* Skip 'else'. */[m
[31m-    parse_block(ls);[m
[31m-  } else {[m
[31m-    jmp_append(fs, &escapelist, flist);[m
[31m-  }[m
[31m-  jmp_tohere(fs, escapelist);[m
[31m-  lex_match(ls, TK_end, TK_if, line);[m
[31m-}[m
[31m-[m
[31m-/* -- Parse statements ---------------------------------------------------- */[m
[31m-[m
[31m-/* Parse a statement. Returns 1 if it must be the last one in a chunk. */[m
[31m-static int parse_stmt(LexState *ls)[m
[31m-{[m
[31m-  BCLine line = ls->linenumber;[m
[31m-  switch (ls->tok) {[m
[31m-  case TK_if:[m
[31m-    parse_if(ls, line);[m
[31m-    break;[m
[31m-  case TK_while:[m
[31m-    parse_while(ls, line);[m
[31m-    break;[m
[31m-  case TK_do:[m
[31m-    lj_lex_next(ls);[m
[31m-    parse_block(ls);[m
[31m-    lex_match(ls, TK_end, TK_do, line);[m
[31m-    break;[m
[31m-  case TK_for:[m
[31m-    parse_for(ls, line);[m
[31m-    break;[m
[31m-  case TK_repeat:[m
[31m-    parse_repeat(ls, line);[m
[31m-    break;[m
[31m-  case TK_function:[m
[31m-    parse_func(ls, line);[m
[31m-    break;[m
[31m-  case TK_local:[m
[31m-    lj_lex_next(ls);[m
[31m-    parse_local(ls);[m
[31m-    break;[m
[31m-  case TK_return:[m
[31m-    parse_return(ls);[m
[31m-    return 1;  /* Must be last. */[m
[31m-  case TK_break:[m
[31m-    lj_lex_next(ls);[m
[31m-    parse_break(ls);[m
[31m-    return !LJ_52;  /* Must be last in Lua 5.1. */[m
[31m-#if LJ_52[m
[31m-  case ';':[m
[31m-    lj_lex_next(ls);[m
[31m-    break;[m
[31m-#endif[m
[31m-  case TK_label:[m
[31m-    parse_label(ls);[m
[31m-    break;[m
[31m-  case TK_goto:[m
[31m-    if (LJ_52 || lj_lex_lookahead(ls) == TK_name) {[m
[31m-      lj_lex_next(ls);[m
[31m-      parse_goto(ls);[m
[31m-      break;[m
[31m-    }  /* else: fallthrough */[m
[31m-  default:[m
[31m-    parse_call_assign(ls);[m
[31m-    break;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* A chunk is a list of statements optionally separated by semicolons. */[m
[31m-static void parse_chunk(LexState *ls)[m
[31m-{[m
[31m-  int islast = 0;[m
[31m-  synlevel_begin(ls);[m
[31m-  while (!islast && !parse_isend(ls->tok)) {[m
[31m-    islast = parse_stmt(ls);[m
[31m-    lex_opt(ls, ';');[m
[31m-    lua_assert(ls->fs->framesize >= ls->fs->freereg &&[m
[31m-	       ls->fs->freereg >= ls->fs->nactvar);[m
[31m-    ls->fs->freereg = ls->fs->nactvar;  /* Free registers after each stmt. */[m
[31m-  }[m
[31m-  synlevel_end(ls);[m
[31m-}[m
[31m-[m
[31m-/* Entry point of bytecode parser. */[m
[31m-GCproto *lj_parse(LexState *ls)[m
[31m-{[m
[31m-  FuncState fs;[m
[31m-  FuncScope bl;[m
[31m-  GCproto *pt;[m
[31m-  lua_State *L = ls->L;[m
[31m-#ifdef LUAJIT_DISABLE_DEBUGINFO[m
[31m-  ls->chunkname = lj_str_newlit(L, "=");[m
[31m-#else[m
[31m-  ls->chunkname = lj_str_newz(L, ls->chunkarg);[m
[31m-#endif[m
[31m-  setstrV(L, L->top, ls->chunkname);  /* Anchor chunkname string. */[m
[31m-  incr_top(L);[m
[31m-  ls->level = 0;[m
[31m-  fs_init(ls, &fs);[m
[31m-  fs.linedefined = 0;[m
[31m-  fs.numparams = 0;[m
[31m-  fs.bcbase = NULL;[m
[31m-  fs.bclim = 0;[m
[31m-  fs.flags |= PROTO_VARARG;  /* Main chunk is always a vararg func. */[m
[31m-  fscope_begin(&fs, &bl, 0);[m
[31m-  bcemit_AD(&fs, BC_FUNCV, 0, 0);  /* Placeholder. */[m
[31m-  lj_lex_next(ls);  /* Read-ahead first token. */[m
[31m-  parse_chunk(ls);[m
[31m-  if (ls->tok != TK_eof)[m
[31m-    err_token(ls, TK_eof);[m
[31m-  pt = fs_finish(ls, ls->linenumber);[m
[31m-  L->top--;  /* Drop chunkname. */[m
[31m-  lua_assert(fs.prev == NULL);[m
[31m-  lua_assert(ls->fs == NULL);[m
[31m-  lua_assert(pt->sizeuv == 0);[m
[31m-  return pt;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.h[m
[1mdeleted file mode 100644[m
[1mindex b383c89..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_parse.h[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-/*[m
[31m-** Lua parser (source code -> bytecode).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_PARSE_H[m
[31m-#define _LJ_PARSE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_lex.h"[m
[31m-[m
[31m-LJ_FUNC GCproto *lj_parse(LexState *ls);[m
[31m-LJ_FUNC GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t l);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.c[m
[1mdeleted file mode 100644[m
[1mindex 95b0a62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.c[m
[1m+++ /dev/null[m
[36m@@ -1,368 +0,0 @@[m
[31m-/*[m
[31m-** Low-overhead profiling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_profile_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_trace.h"[m
[31m-#endif[m
[31m-#include "lj_profile.h"[m
[31m-[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-#if LJ_PROFILE_SIGPROF[m
[31m-[m
[31m-#include <sys/time.h>[m
[31m-#include <signal.h>[m
[31m-#define profile_lock(ps)	UNUSED(ps)[m
[31m-#define profile_unlock(ps)	UNUSED(ps)[m
[31m-[m
[31m-#elif LJ_PROFILE_PTHREAD[m
[31m-[m
[31m-#include <pthread.h>[m
[31m-#include <time.h>[m
[31m-#if LJ_TARGET_PS3[m
[31m-#include <sys/timer.h>[m
[31m-#endif[m
[31m-#define profile_lock(ps)	pthread_mutex_lock(&ps->lock)[m
[31m-#define profile_unlock(ps)	pthread_mutex_unlock(&ps->lock)[m
[31m-[m
[31m-#elif LJ_PROFILE_WTHREAD[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#if LJ_TARGET_XBOX360[m
[31m-#include <xtl.h>[m
[31m-#include <xbox.h>[m
[31m-#else[m
[31m-#include <windows.h>[m
[31m-#endif[m
[31m-typedef unsigned int (WINAPI *WMM_TPFUNC)(unsigned int);[m
[31m-#define profile_lock(ps)	EnterCriticalSection(&ps->lock)[m
[31m-#define profile_unlock(ps)	LeaveCriticalSection(&ps->lock)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Profiler state. */[m
[31m-typedef struct ProfileState {[m
[31m-  global_State *g;		/* VM state that started the profiler. */[m
[31m-  luaJIT_profile_callback cb;	/* Profiler callback. */[m
[31m-  void *data;			/* Profiler callback data. */[m
[31m-  SBuf sb;			/* String buffer for stack dumps. */[m
[31m-  int interval;			/* Sample interval in milliseconds. */[m
[31m-  int samples;			/* Number of samples for next callback. */[m
[31m-  int vmstate;			/* VM state when profile timer triggered. */[m
[31m-#if LJ_PROFILE_SIGPROF[m
[31m-  struct sigaction oldsa;	/* Previous SIGPROF state. */[m
[31m-#elif LJ_PROFILE_PTHREAD[m
[31m-  pthread_mutex_t lock;		/* g->hookmask update lock. */[m
[31m-  pthread_t thread;		/* Timer thread. */[m
[31m-  int abort;			/* Abort timer thread. */[m
[31m-#elif LJ_PROFILE_WTHREAD[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  HINSTANCE wmm;		/* WinMM library handle. */[m
[31m-  WMM_TPFUNC wmm_tbp;		/* WinMM timeBeginPeriod function. */[m
[31m-  WMM_TPFUNC wmm_tep;		/* WinMM timeEndPeriod function. */[m
[31m-#endif[m
[31m-  CRITICAL_SECTION lock;	/* g->hookmask update lock. */[m
[31m-  HANDLE thread;		/* Timer thread. */[m
[31m-  int abort;			/* Abort timer thread. */[m
[31m-#endif[m
[31m-} ProfileState;[m
[31m-[m
[31m-/* Sadly, we have to use a static profiler state.[m
[31m-**[m
[31m-** The SIGPROF variant needs a static pointer to the global state, anyway.[m
[31m-** And it would be hard to extend for multiple threads. You can still use[m
[31m-** multiple VMs in multiple threads, but only profile one at a time.[m
[31m-*/[m
[31m-static ProfileState profile_state;[m
[31m-[m
[31m-/* Default sample interval in milliseconds. */[m
[31m-#define LJ_PROFILE_INTERVAL_DEFAULT	10[m
[31m-[m
[31m-/* -- Profiler/hook interaction ------------------------------------------- */[m
[31m-[m
[31m-#if !LJ_PROFILE_SIGPROF[m
[31m-void LJ_FASTCALL lj_profile_hook_enter(global_State *g)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  if (ps->g) {[m
[31m-    profile_lock(ps);[m
[31m-    hook_enter(g);[m
[31m-    profile_unlock(ps);[m
[31m-  } else {[m
[31m-    hook_enter(g);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_profile_hook_leave(global_State *g)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  if (ps->g) {[m
[31m-    profile_lock(ps);[m
[31m-    hook_leave(g);[m
[31m-    profile_unlock(ps);[m
[31m-  } else {[m
[31m-    hook_leave(g);[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Profile callbacks --------------------------------------------------- */[m
[31m-[m
[31m-/* Callback from profile hook (HOOK_PROFILE already cleared). */[m
[31m-void LJ_FASTCALL lj_profile_interpreter(lua_State *L)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  global_State *g = G(L);[m
[31m-  uint8_t mask;[m
[31m-  profile_lock(ps);[m
[31m-  mask = (g->hookmask & ~HOOK_PROFILE);[m
[31m-  if (!(mask & HOOK_VMEVENT)) {[m
[31m-    int samples = ps->samples;[m
[31m-    ps->samples = 0;[m
[31m-    g->hookmask = HOOK_VMEVENT;[m
[31m-    lj_dispatch_update(g);[m
[31m-    profile_unlock(ps);[m
[31m-    ps->cb(ps->data, L, samples, ps->vmstate);  /* Invoke user callback. */[m
[31m-    profile_lock(ps);[m
[31m-    mask |= (g->hookmask & HOOK_PROFILE);[m
[31m-  }[m
[31m-  g->hookmask = mask;[m
[31m-  lj_dispatch_update(g);[m
[31m-  profile_unlock(ps);[m
[31m-}[m
[31m-[m
[31m-/* Trigger profile hook. Asynchronous call from OS-specific profile timer. */[m
[31m-static void profile_trigger(ProfileState *ps)[m
[31m-{[m
[31m-  global_State *g = ps->g;[m
[31m-  uint8_t mask;[m
[31m-  profile_lock(ps);[m
[31m-  ps->samples++;  /* Always increment number of samples. */[m
[31m-  mask = g->hookmask;[m
[31m-  if (!(mask & (HOOK_PROFILE|HOOK_VMEVENT))) {  /* Set profile hook. */[m
[31m-    int st = g->vmstate;[m
[31m-    ps->vmstate = st >= 0 ? 'N' :[m
[31m-		  st == ~LJ_VMST_INTERP ? 'I' :[m
[31m-		  st == ~LJ_VMST_C ? 'C' :[m
[31m-		  st == ~LJ_VMST_GC ? 'G' : 'J';[m
[31m-    g->hookmask = (mask | HOOK_PROFILE);[m
[31m-    lj_dispatch_update(g);[m
[31m-  }[m
[31m-  profile_unlock(ps);[m
[31m-}[m
[31m-[m
[31m-/* -- OS-specific profile timer handling ---------------------------------- */[m
[31m-[m
[31m-#if LJ_PROFILE_SIGPROF[m
[31m-[m
[31m-/* SIGPROF handler. */[m
[31m-static void profile_signal(int sig)[m
[31m-{[m
[31m-  UNUSED(sig);[m
[31m-  profile_trigger(&profile_state);[m
[31m-}[m
[31m-[m
[31m-/* Start profiling timer. */[m
[31m-static void profile_timer_start(ProfileState *ps)[m
[31m-{[m
[31m-  int interval = ps->interval;[m
[31m-  struct itimerval tm;[m
[31m-  struct sigaction sa;[m
[31m-  tm.it_value.tv_sec = tm.it_interval.tv_sec = interval / 1000;[m
[31m-  tm.it_value.tv_usec = tm.it_interval.tv_usec = (interval % 1000) * 1000;[m
[31m-  setitimer(ITIMER_PROF, &tm, NULL);[m
[31m-  sa.sa_flags = SA_RESTART;[m
[31m-  sa.sa_handler = profile_signal;[m
[31m-  sigemptyset(&sa.sa_mask);[m
[31m-  sigaction(SIGPROF, &sa, &ps->oldsa);[m
[31m-}[m
[31m-[m
[31m-/* Stop profiling timer. */[m
[31m-static void profile_timer_stop(ProfileState *ps)[m
[31m-{[m
[31m-  struct itimerval tm;[m
[31m-  tm.it_value.tv_sec = tm.it_interval.tv_sec = 0;[m
[31m-  tm.it_value.tv_usec = tm.it_interval.tv_usec = 0;[m
[31m-  setitimer(ITIMER_PROF, &tm, NULL);[m
[31m-  sigaction(SIGPROF, &ps->oldsa, NULL);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_PROFILE_PTHREAD[m
[31m-[m
[31m-/* POSIX timer thread. */[m
[31m-static void *profile_thread(ProfileState *ps)[m
[31m-{[m
[31m-  int interval = ps->interval;[m
[31m-#if !LJ_TARGET_PS3[m
[31m-  struct timespec ts;[m
[31m-  ts.tv_sec = interval / 1000;[m
[31m-  ts.tv_nsec = (interval % 1000) * 1000000;[m
[31m-#endif[m
[31m-  while (1) {[m
[31m-#if LJ_TARGET_PS3[m
[31m-    sys_timer_usleep(interval * 1000);[m
[31m-#else[m
[31m-    nanosleep(&ts, NULL);[m
[31m-#endif[m
[31m-    if (ps->abort) break;[m
[31m-    profile_trigger(ps);[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Start profiling timer thread. */[m
[31m-static void profile_timer_start(ProfileState *ps)[m
[31m-{[m
[31m-  pthread_mutex_init(&ps->lock, 0);[m
[31m-  ps->abort = 0;[m
[31m-  pthread_create(&ps->thread, NULL, (void *(*)(void *))profile_thread, ps);[m
[31m-}[m
[31m-[m
[31m-/* Stop profiling timer thread. */[m
[31m-static void profile_timer_stop(ProfileState *ps)[m
[31m-{[m
[31m-  ps->abort = 1;[m
[31m-  pthread_join(ps->thread, NULL);[m
[31m-  pthread_mutex_destroy(&ps->lock);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_PROFILE_WTHREAD[m
[31m-[m
[31m-/* Windows timer thread. */[m
[31m-static DWORD WINAPI profile_thread(void *psx)[m
[31m-{[m
[31m-  ProfileState *ps = (ProfileState *)psx;[m
[31m-  int interval = ps->interval;[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  ps->wmm_tbp(interval);[m
[31m-#endif[m
[31m-  while (1) {[m
[31m-    Sleep(interval);[m
[31m-    if (ps->abort) break;[m
[31m-    profile_trigger(ps);[m
[31m-  }[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  ps->wmm_tep(interval);[m
[31m-#endif[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Start profiling timer thread. */[m
[31m-static void profile_timer_start(ProfileState *ps)[m
[31m-{[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  if (!ps->wmm) {  /* Load WinMM library on-demand. */[m
[31m-    ps->wmm = LoadLibraryExA("winmm.dll", NULL, 0);[m
[31m-    if (ps->wmm) {[m
[31m-      ps->wmm_tbp = (WMM_TPFUNC)GetProcAddress(ps->wmm, "timeBeginPeriod");[m
[31m-      ps->wmm_tep = (WMM_TPFUNC)GetProcAddress(ps->wmm, "timeEndPeriod");[m
[31m-      if (!ps->wmm_tbp || !ps->wmm_tep) {[m
[31m-	ps->wmm = NULL;[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  InitializeCriticalSection(&ps->lock);[m
[31m-  ps->abort = 0;[m
[31m-  ps->thread = CreateThread(NULL, 0, profile_thread, ps, 0, NULL);[m
[31m-}[m
[31m-[m
[31m-/* Stop profiling timer thread. */[m
[31m-static void profile_timer_stop(ProfileState *ps)[m
[31m-{[m
[31m-  ps->abort = 1;[m
[31m-  WaitForSingleObject(ps->thread, INFINITE);[m
[31m-  DeleteCriticalSection(&ps->lock);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- Public profiling API ------------------------------------------------ */[m
[31m-[m
[31m-/* Start profiling. */[m
[31m-LUA_API void luaJIT_profile_start(lua_State *L, const char *mode,[m
[31m-				  luaJIT_profile_callback cb, void *data)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  int interval = LJ_PROFILE_INTERVAL_DEFAULT;[m
[31m-  while (*mode) {[m
[31m-    int m = *mode++;[m
[31m-    switch (m) {[m
[31m-    case 'i':[m
[31m-      interval = 0;[m
[31m-      while (*mode >= '0' && *mode <= '9')[m
[31m-	interval = interval * 10 + (*mode++ - '0');[m
[31m-      if (interval <= 0) interval = 1;[m
[31m-      break;[m
[31m-#if LJ_HASJIT[m
[31m-    case 'l': case 'f':[m
[31m-      L2J(L)->prof_mode = m;[m
[31m-      lj_trace_flushall(L);[m
[31m-      break;[m
[31m-#endif[m
[31m-    default:  /* Ignore unknown mode chars. */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  if (ps->g) {[m
[31m-    luaJIT_profile_stop(L);[m
[31m-    if (ps->g) return;  /* Profiler in use by another VM. */[m
[31m-  }[m
[31m-  ps->g = G(L);[m
[31m-  ps->interval = interval;[m
[31m-  ps->cb = cb;[m
[31m-  ps->data = data;[m
[31m-  ps->samples = 0;[m
[31m-  lj_buf_init(L, &ps->sb);[m
[31m-  profile_timer_start(ps);[m
[31m-}[m
[31m-[m
[31m-/* Stop profiling. */[m
[31m-LUA_API void luaJIT_profile_stop(lua_State *L)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  global_State *g = ps->g;[m
[31m-  if (G(L) == g) {  /* Only stop profiler if started by this VM. */[m
[31m-    profile_timer_stop(ps);[m
[31m-    g->hookmask &= ~HOOK_PROFILE;[m
[31m-    lj_dispatch_update(g);[m
[31m-#if LJ_HASJIT[m
[31m-    G2J(g)->prof_mode = 0;[m
[31m-    lj_trace_flushall(L);[m
[31m-#endif[m
[31m-    lj_buf_free(g, &ps->sb);[m
[31m-    setmref(ps->sb.b, NULL);[m
[31m-    setmref(ps->sb.e, NULL);[m
[31m-    ps->g = NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return a compact stack dump. */[m
[31m-LUA_API const char *luaJIT_profile_dumpstack(lua_State *L, const char *fmt,[m
[31m-					     int depth, size_t *len)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  SBuf *sb = &ps->sb;[m
[31m-  setsbufL(sb, L);[m
[31m-  lj_buf_reset(sb);[m
[31m-  lj_debug_dumpstack(L, sb, fmt, depth);[m
[31m-  *len = (size_t)sbuflen(sb);[m
[31m-  return sbufB(sb);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.h[m
[1mdeleted file mode 100644[m
[1mindex 14c3fc0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_profile.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-/*[m
[31m-** Low-overhead profiling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_PROFILE_H[m
[31m-#define _LJ_PROFILE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL lj_profile_interpreter(lua_State *L);[m
[31m-#if !LJ_PROFILE_SIGPROF[m
[31m-LJ_FUNC void LJ_FASTCALL lj_profile_hook_enter(global_State *g);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_profile_hook_leave(global_State *g);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.c[m
[1mdeleted file mode 100644[m
[1mindex 541fe71..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.c[m
[1m+++ /dev/null[m
[36m@@ -1,2560 +0,0 @@[m
[31m-/*[m
[31m-** Trace recorder (bytecode -> SSA IR).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_record_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_frame.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ff.h"[m
[31m-#if LJ_HASPROFILE[m
[31m-#include "lj_debug.h"[m
[31m-#endif[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_record.h"[m
[31m-#include "lj_ffrecord.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* Emit raw IR without passing through optimizations. */[m
[31m-#define emitir_raw(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))[m
[31m-[m
[31m-/* -- Sanity checks ------------------------------------------------------- */[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-/* Sanity check the whole IR -- sloooow. */[m
[31m-static void rec_check_ir(jit_State *J)[m
[31m-{[m
[31m-  IRRef i, nins = J->cur.nins, nk = J->cur.nk;[m
[31m-  lua_assert(nk <= REF_BIAS && nins >= REF_BIAS && nins < 65536);[m
[31m-  for (i = nins-1; i >= nk; i--) {[m
[31m-    IRIns *ir = IR(i);[m
[31m-    uint32_t mode = lj_ir_mode[ir->o];[m
[31m-    IRRef op1 = ir->op1;[m
[31m-    IRRef op2 = ir->op2;[m
[31m-    switch (irm_op1(mode)) {[m
[31m-    case IRMnone: lua_assert(op1 == 0); break;[m
[31m-    case IRMref: lua_assert(op1 >= nk);[m
[31m-      lua_assert(i >= REF_BIAS ? op1 < i : op1 > i); break;[m
[31m-    case IRMlit: break;[m
[31m-    case IRMcst: lua_assert(i < REF_BIAS); continue;[m
[31m-    }[m
[31m-    switch (irm_op2(mode)) {[m
[31m-    case IRMnone: lua_assert(op2 == 0); break;[m
[31m-    case IRMref: lua_assert(op2 >= nk);[m
[31m-      lua_assert(i >= REF_BIAS ? op2 < i : op2 > i); break;[m
[31m-    case IRMlit: break;[m
[31m-    case IRMcst: lua_assert(0); break;[m
[31m-    }[m
[31m-    if (ir->prev) {[m
[31m-      lua_assert(ir->prev >= nk);[m
[31m-      lua_assert(i >= REF_BIAS ? ir->prev < i : ir->prev > i);[m
[31m-      lua_assert(ir->o == IR_NOP || IR(ir->prev)->o == ir->o);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Compare stack slots and frames of the recorder and the VM. */[m
[31m-static void rec_check_slots(jit_State *J)[m
[31m-{[m
[31m-  BCReg s, nslots = J->baseslot + J->maxslot;[m
[31m-  int32_t depth = 0;[m
[31m-  cTValue *base = J->L->base - J->baseslot;[m
[31m-  lua_assert(J->baseslot >= 1 && J->baseslot < LJ_MAX_JSLOTS);[m
[31m-  lua_assert(J->baseslot == 1 || (J->slot[J->baseslot-1] & TREF_FRAME));[m
[31m-  lua_assert(nslots < LJ_MAX_JSLOTS);[m
[31m-  for (s = 0; s < nslots; s++) {[m
[31m-    TRef tr = J->slot[s];[m
[31m-    if (tr) {[m
[31m-      cTValue *tv = &base[s];[m
[31m-      IRRef ref = tref_ref(tr);[m
[31m-      IRIns *ir;[m
[31m-      lua_assert(ref >= J->cur.nk && ref < J->cur.nins);[m
[31m-      ir = IR(ref);[m
[31m-      lua_assert(irt_t(ir->t) == tref_t(tr));[m
[31m-      if (s == 0) {[m
[31m-	lua_assert(tref_isfunc(tr));[m
[31m-      } else if ((tr & TREF_FRAME)) {[m
[31m-	GCfunc *fn = gco2func(frame_gc(tv));[m
[31m-	BCReg delta = (BCReg)(tv - frame_prev(tv));[m
[31m-	lua_assert(tref_isfunc(tr));[m
[31m-	if (tref_isk(tr)) lua_assert(fn == ir_kfunc(ir));[m
[31m-	lua_assert(s > delta ? (J->slot[s-delta] & TREF_FRAME) : (s == delta));[m
[31m-	depth++;[m
[31m-      } else if ((tr & TREF_CONT)) {[m
[31m-	lua_assert(ir_kptr(ir) == gcrefp(tv->gcr, void));[m
[31m-	lua_assert((J->slot[s+1] & TREF_FRAME));[m
[31m-	depth++;[m
[31m-      } else {[m
[31m-	if (tvisnumber(tv))[m
[31m-	  lua_assert(tref_isnumber(tr));  /* Could be IRT_INT etc., too. */[m
[31m-	else[m
[31m-	  lua_assert(itype2irt(tv) == tref_type(tr));[m
[31m-	if (tref_isk(tr)) {  /* Compare constants. */[m
[31m-	  TValue tvk;[m
[31m-	  lj_ir_kvalue(J->L, &tvk, ir);[m
[31m-	  if (!(tvisnum(&tvk) && tvisnan(&tvk)))[m
[31m-	    lua_assert(lj_obj_equal(tv, &tvk));[m
[31m-	  else[m
[31m-	    lua_assert(tvisnum(tv) && tvisnan(tv));[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(J->framedepth == depth);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Type handling and specialization ------------------------------------ */[m
[31m-[m
[31m-/* Note: these functions return tagged references (TRef). */[m
[31m-[m
[31m-/* Specialize a slot to a specific type. Note: slot can be negative! */[m
[31m-static TRef sloadt(jit_State *J, int32_t slot, IRType t, int mode)[m
[31m-{[m
[31m-  /* Caller may set IRT_GUARD in t. */[m
[31m-  TRef ref = emitir_raw(IRT(IR_SLOAD, t), (int32_t)J->baseslot+slot, mode);[m
[31m-  J->base[slot] = ref;[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-/* Specialize a slot to the runtime type. Note: slot can be negative! */[m
[31m-static TRef sload(jit_State *J, int32_t slot)[m
[31m-{[m
[31m-  IRType t = itype2irt(&J->L->base[slot]);[m
[31m-  TRef ref = emitir_raw(IRTG(IR_SLOAD, t), (int32_t)J->baseslot+slot,[m
[31m-			IRSLOAD_TYPECHECK);[m
[31m-  if (irtype_ispri(t)) ref = TREF_PRI(t);  /* Canonicalize primitive refs. */[m
[31m-  J->base[slot] = ref;[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-/* Get TRef from slot. Load slot and specialize if not done already. */[m
[31m-#define getslot(J, s)	(J->base[(s)] ? J->base[(s)] : sload(J, (int32_t)(s)))[m
[31m-[m
[31m-/* Get TRef for current function. */[m
[31m-static TRef getcurrf(jit_State *J)[m
[31m-{[m
[31m-  if (J->base[-1])[m
[31m-    return J->base[-1];[m
[31m-  lua_assert(J->baseslot == 1);[m
[31m-  return sloadt(J, -1, IRT_FUNC, IRSLOAD_READONLY);[m
[31m-}[m
[31m-[m
[31m-/* Compare for raw object equality.[m
[31m-** Returns 0 if the objects are the same.[m
[31m-** Returns 1 if they are different, but the same type.[m
[31m-** Returns 2 for two different types.[m
[31m-** Comparisons between primitives always return 1 -- no caller cares about it.[m
[31m-*/[m
[31m-int lj_record_objcmp(jit_State *J, TRef a, TRef b, cTValue *av, cTValue *bv)[m
[31m-{[m
[31m-  int diff = !lj_obj_equal(av, bv);[m
[31m-  if (!tref_isk2(a, b)) {  /* Shortcut, also handles primitives. */[m
[31m-    IRType ta = tref_isinteger(a) ? IRT_INT : tref_type(a);[m
[31m-    IRType tb = tref_isinteger(b) ? IRT_INT : tref_type(b);[m
[31m-    if (ta != tb) {[m
[31m-      /* Widen mixed number/int comparisons to number/number comparison. */[m
[31m-      if (ta == IRT_INT && tb == IRT_NUM) {[m
[31m-	a = emitir(IRTN(IR_CONV), a, IRCONV_NUM_INT);[m
[31m-	ta = IRT_NUM;[m
[31m-      } else if (ta == IRT_NUM && tb == IRT_INT) {[m
[31m-	b = emitir(IRTN(IR_CONV), b, IRCONV_NUM_INT);[m
[31m-      } else {[m
[31m-	return 2;  /* Two different types are never equal. */[m
[31m-      }[m
[31m-    }[m
[31m-    emitir(IRTG(diff ? IR_NE : IR_EQ, ta), a, b);[m
[31m-  }[m
[31m-  return diff;[m
[31m-}[m
[31m-[m
[31m-/* Constify a value. Returns 0 for non-representable object types. */[m
[31m-TRef lj_record_constify(jit_State *J, cTValue *o)[m
[31m-{[m
[31m-  if (tvisgcv(o))[m
[31m-    return lj_ir_kgc(J, gcV(o), itype2irt(o));[m
[31m-  else if (tvisint(o))[m
[31m-    return lj_ir_kint(J, intV(o));[m
[31m-  else if (tvisnum(o))[m
[31m-    return lj_ir_knumint(J, numV(o));[m
[31m-  else if (tvisbool(o))[m
[31m-    return TREF_PRI(itype2irt(o));[m
[31m-  else[m
[31m-    return 0;  /* Can't represent lightuserdata (pointless). */[m
[31m-}[m
[31m-[m
[31m-/* -- Record loop ops ----------------------------------------------------- */[m
[31m-[m
[31m-/* Loop event. */[m
[31m-typedef enum {[m
[31m-  LOOPEV_LEAVE,		/* Loop is left or not entered. */[m
[31m-  LOOPEV_ENTERLO,	/* Loop is entered with a low iteration count left. */[m
[31m-  LOOPEV_ENTER		/* Loop is entered. */[m
[31m-} LoopEvent;[m
[31m-[m
[31m-/* Canonicalize slots: convert integers to numbers. */[m
[31m-static void canonicalize_slots(jit_State *J)[m
[31m-{[m
[31m-  BCReg s;[m
[31m-  if (LJ_DUALNUM) return;[m
[31m-  for (s = J->baseslot+J->maxslot-1; s >= 1; s--) {[m
[31m-    TRef tr = J->slot[s];[m
[31m-    if (tref_isinteger(tr)) {[m
[31m-      IRIns *ir = IR(tref_ref(tr));[m
[31m-      if (!(ir->o == IR_SLOAD && (ir->op2 & IRSLOAD_READONLY)))[m
[31m-	J->slot[s] = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Stop recording. */[m
[31m-void lj_record_stop(jit_State *J, TraceLink linktype, TraceNo lnk)[m
[31m-{[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  if (J->retryrec)[m
[31m-    lj_trace_err(J, LJ_TRERR_RETRY);[m
[31m-#endif[m
[31m-  lj_trace_end(J);[m
[31m-  J->cur.linktype = (uint8_t)linktype;[m
[31m-  J->cur.link = (uint16_t)lnk;[m
[31m-  /* Looping back at the same stack level? */[m
[31m-  if (lnk == J->cur.traceno && J->framedepth + J->retdepth == 0) {[m
[31m-    if ((J->flags & JIT_F_OPT_LOOP))  /* Shall we try to create a loop? */[m
[31m-      goto nocanon;  /* Do not canonicalize or we lose the narrowing. */[m
[31m-    if (J->cur.root)  /* Otherwise ensure we always link to the root trace. */[m
[31m-      J->cur.link = J->cur.root;[m
[31m-  }[m
[31m-  canonicalize_slots(J);[m
[31m-nocanon:[m
[31m-  /* Note: all loop ops must set J->pc to the following instruction! */[m
[31m-  lj_snap_add(J);  /* Add loop snapshot. */[m
[31m-  J->needsnap = 0;[m
[31m-  J->mergesnap = 1;  /* In case recording continues. */[m
[31m-}[m
[31m-[m
[31m-/* Search bytecode backwards for a int/num constant slot initializer. */[m
[31m-static TRef find_kinit(jit_State *J, const BCIns *endpc, BCReg slot, IRType t)[m
[31m-{[m
[31m-  /* This algorithm is rather simplistic and assumes quite a bit about[m
[31m-  ** how the bytecode is generated. It works fine for FORI initializers,[m
[31m-  ** but it won't necessarily work in other cases (e.g. iterator arguments).[m
[31m-  ** It doesn't do anything fancy, either (like backpropagating MOVs).[m
[31m-  */[m
[31m-  const BCIns *pc, *startpc = proto_bc(J->pt);[m
[31m-  for (pc = endpc-1; pc > startpc; pc--) {[m
[31m-    BCIns ins = *pc;[m
[31m-    BCOp op = bc_op(ins);[m
[31m-    /* First try to find the last instruction that stores to this slot. */[m
[31m-    if (bcmode_a(op) == BCMbase && bc_a(ins) <= slot) {[m
[31m-      return 0;  /* Multiple results, e.g. from a CALL or KNIL. */[m
[31m-    } else if (bcmode_a(op) == BCMdst && bc_a(ins) == slot) {[m
[31m-      if (op == BC_KSHORT || op == BC_KNUM) {  /* Found const. initializer. */[m
[31m-	/* Now try to verify there's no forward jump across it. */[m
[31m-	const BCIns *kpc = pc;[m
[31m-	for (; pc > startpc; pc--)[m
[31m-	  if (bc_op(*pc) == BC_JMP) {[m
[31m-	    const BCIns *target = pc+bc_j(*pc)+1;[m
[31m-	    if (target > kpc && target <= endpc)[m
[31m-	      return 0;  /* Conditional assignment. */[m
[31m-	  }[m
[31m-	if (op == BC_KSHORT) {[m
[31m-	  int32_t k = (int32_t)(int16_t)bc_d(ins);[m
[31m-	  return t == IRT_INT ? lj_ir_kint(J, k) : lj_ir_knum(J, (lua_Number)k);[m
[31m-	} else {[m
[31m-	  cTValue *tv = proto_knumtv(J->pt, bc_d(ins));[m
[31m-	  if (t == IRT_INT) {[m
[31m-	    int32_t k = numberVint(tv);[m
[31m-	    if (tvisint(tv) || numV(tv) == (lua_Number)k)  /* -0 is ok here. */[m
[31m-	      return lj_ir_kint(J, k);[m
[31m-	    return 0;  /* Type mismatch. */[m
[31m-	  } else {[m
[31m-	    return lj_ir_knum(J, numberVnum(tv));[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-      return 0;  /* Non-constant initializer. */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* No assignment to this slot found? */[m
[31m-}[m
[31m-[m
[31m-/* Load and optionally convert a FORI argument from a slot. */[m
[31m-static TRef fori_load(jit_State *J, BCReg slot, IRType t, int mode)[m
[31m-{[m
[31m-  int conv = (tvisint(&J->L->base[slot]) != (t==IRT_INT)) ? IRSLOAD_CONVERT : 0;[m
[31m-  return sloadt(J, (int32_t)slot,[m
[31m-		t + (((mode & IRSLOAD_TYPECHECK) ||[m
[31m-		      (conv && t == IRT_INT && !(mode >> 16))) ?[m
[31m-		     IRT_GUARD : 0),[m
[31m-		mode + conv);[m
[31m-}[m
[31m-[m
[31m-/* Peek before FORI to find a const initializer. Otherwise load from slot. */[m
[31m-static TRef fori_arg(jit_State *J, const BCIns *fori, BCReg slot,[m
[31m-		     IRType t, int mode)[m
[31m-{[m
[31m-  TRef tr = J->base[slot];[m
[31m-  if (!tr) {[m
[31m-    tr = find_kinit(J, fori, slot, t);[m
[31m-    if (!tr)[m
[31m-      tr = fori_load(J, slot, t, mode);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Return the direction of the FOR loop iterator.[m
[31m-** It's important to exactly reproduce the semantics of the interpreter.[m
[31m-*/[m
[31m-static int rec_for_direction(cTValue *o)[m
[31m-{[m
[31m-  return (tvisint(o) ? intV(o) : (int32_t)o->u32.hi) >= 0;[m
[31m-}[m
[31m-[m
[31m-/* Simulate the runtime behavior of the FOR loop iterator. */[m
[31m-static LoopEvent rec_for_iter(IROp *op, cTValue *o, int isforl)[m
[31m-{[m
[31m-  lua_Number stopv = numberVnum(&o[FORL_STOP]);[m
[31m-  lua_Number idxv = numberVnum(&o[FORL_IDX]);[m
[31m-  lua_Number stepv = numberVnum(&o[FORL_STEP]);[m
[31m-  if (isforl)[m
[31m-    idxv += stepv;[m
[31m-  if (rec_for_direction(&o[FORL_STEP])) {[m
[31m-    if (idxv <= stopv) {[m
[31m-      *op = IR_LE;[m
[31m-      return idxv + 2*stepv > stopv ? LOOPEV_ENTERLO : LOOPEV_ENTER;[m
[31m-    }[m
[31m-    *op = IR_GT; return LOOPEV_LEAVE;[m
[31m-  } else {[m
[31m-    if (stopv <= idxv) {[m
[31m-      *op = IR_GE;[m
[31m-      return idxv + 2*stepv < stopv ? LOOPEV_ENTERLO : LOOPEV_ENTER;[m
[31m-    }[m
[31m-    *op = IR_LT; return LOOPEV_LEAVE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record checks for FOR loop overflow and step direction. */[m
[31m-static void rec_for_check(jit_State *J, IRType t, int dir,[m
[31m-			  TRef stop, TRef step, int init)[m
[31m-{[m
[31m-  if (!tref_isk(step)) {[m
[31m-    /* Non-constant step: need a guard for the direction. */[m
[31m-    TRef zero = (t == IRT_INT) ? lj_ir_kint(J, 0) : lj_ir_knum_zero(J);[m
[31m-    emitir(IRTG(dir ? IR_GE : IR_LT, t), step, zero);[m
[31m-    /* Add hoistable overflow checks for a narrowed FORL index. */[m
[31m-    if (init && t == IRT_INT) {[m
[31m-      if (tref_isk(stop)) {[m
[31m-	/* Constant stop: optimize check away or to a range check for step. */[m
[31m-	int32_t k = IR(tref_ref(stop))->i;[m
[31m-	if (dir) {[m
[31m-	  if (k > 0)[m
[31m-	    emitir(IRTGI(IR_LE), step, lj_ir_kint(J, (int32_t)0x7fffffff-k));[m
[31m-	} else {[m
[31m-	  if (k < 0)[m
[31m-	    emitir(IRTGI(IR_GE), step, lj_ir_kint(J, (int32_t)0x80000000-k));[m
[31m-	}[m
[31m-      } else {[m
[31m-	/* Stop+step variable: need full overflow check. */[m
[31m-	TRef tr = emitir(IRTGI(IR_ADDOV), step, stop);[m
[31m-	emitir(IRTI(IR_USE), tr, 0);  /* ADDOV is weak. Avoid dead result. */[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (init && t == IRT_INT && !tref_isk(stop)) {[m
[31m-    /* Constant step: optimize overflow check to a range check for stop. */[m
[31m-    int32_t k = IR(tref_ref(step))->i;[m
[31m-    k = (int32_t)(dir ? 0x7fffffff : 0x80000000) - k;[m
[31m-    emitir(IRTGI(dir ? IR_LE : IR_GE), stop, lj_ir_kint(J, k));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record a FORL instruction. */[m
[31m-static void rec_for_loop(jit_State *J, const BCIns *fori, ScEvEntry *scev,[m
[31m-			 int init)[m
[31m-{[m
[31m-  BCReg ra = bc_a(*fori);[m
[31m-  cTValue *tv = &J->L->base[ra];[m
[31m-  TRef idx = J->base[ra+FORL_IDX];[m
[31m-  IRType t = idx ? tref_type(idx) :[m
[31m-	     (init || LJ_DUALNUM) ? lj_opt_narrow_forl(J, tv) : IRT_NUM;[m
[31m-  int mode = IRSLOAD_INHERIT +[m
[31m-    ((!LJ_DUALNUM || tvisint(tv) == (t == IRT_INT)) ? IRSLOAD_READONLY : 0);[m
[31m-  TRef stop = fori_arg(J, fori, ra+FORL_STOP, t, mode);[m
[31m-  TRef step = fori_arg(J, fori, ra+FORL_STEP, t, mode);[m
[31m-  int tc, dir = rec_for_direction(&tv[FORL_STEP]);[m
[31m-  lua_assert(bc_op(*fori) == BC_FORI || bc_op(*fori) == BC_JFORI);[m
[31m-  scev->t.irt = t;[m
[31m-  scev->dir = dir;[m
[31m-  scev->stop = tref_ref(stop);[m
[31m-  scev->step = tref_ref(step);[m
[31m-  rec_for_check(J, t, dir, stop, step, init);[m
[31m-  scev->start = tref_ref(find_kinit(J, fori, ra+FORL_IDX, IRT_INT));[m
[31m-  tc = (LJ_DUALNUM &&[m
[31m-	!(scev->start && irref_isk(scev->stop) && irref_isk(scev->step) &&[m
[31m-	  tvisint(&tv[FORL_IDX]) == (t == IRT_INT))) ?[m
[31m-	IRSLOAD_TYPECHECK : 0;[m
[31m-  if (tc) {[m
[31m-    J->base[ra+FORL_STOP] = stop;[m
[31m-    J->base[ra+FORL_STEP] = step;[m
[31m-  }[m
[31m-  if (!idx)[m
[31m-    idx = fori_load(J, ra+FORL_IDX, t,[m
[31m-		    IRSLOAD_INHERIT + tc + (J->scev.start << 16));[m
[31m-  if (!init)[m
[31m-    J->base[ra+FORL_IDX] = idx = emitir(IRT(IR_ADD, t), idx, step);[m
[31m-  J->base[ra+FORL_EXT] = idx;[m
[31m-  scev->idx = tref_ref(idx);[m
[31m-  setmref(scev->pc, fori);[m
[31m-  J->maxslot = ra+FORL_EXT+1;[m
[31m-}[m
[31m-[m
[31m-/* Record FORL/JFORL or FORI/JFORI. */[m
[31m-static LoopEvent rec_for(jit_State *J, const BCIns *fori, int isforl)[m
[31m-{[m
[31m-  BCReg ra = bc_a(*fori);[m
[31m-  TValue *tv = &J->L->base[ra];[m
[31m-  TRef *tr = &J->base[ra];[m
[31m-  IROp op;[m
[31m-  LoopEvent ev;[m
[31m-  TRef stop;[m
[31m-  IRType t;[m
[31m-  if (isforl) {  /* Handle FORL/JFORL opcodes. */[m
[31m-    TRef idx = tr[FORL_IDX];[m
[31m-    if (mref(J->scev.pc, const BCIns) == fori && tref_ref(idx) == J->scev.idx) {[m
[31m-      t = J->scev.t.irt;[m
[31m-      stop = J->scev.stop;[m
[31m-      idx = emitir(IRT(IR_ADD, t), idx, J->scev.step);[m
[31m-      tr[FORL_EXT] = tr[FORL_IDX] = idx;[m
[31m-    } else {[m
[31m-      ScEvEntry scev;[m
[31m-      rec_for_loop(J, fori, &scev, 0);[m
[31m-      t = scev.t.irt;[m
[31m-      stop = scev.stop;[m
[31m-    }[m
[31m-  } else {  /* Handle FORI/JFORI opcodes. */[m
[31m-    BCReg i;[m
[31m-    lj_meta_for(J->L, tv);[m
[31m-    t = (LJ_DUALNUM || tref_isint(tr[FORL_IDX])) ? lj_opt_narrow_forl(J, tv) :[m
[31m-						   IRT_NUM;[m
[31m-    for (i = FORL_IDX; i <= FORL_STEP; i++) {[m
[31m-      if (!tr[i]) sload(J, ra+i);[m
[31m-      lua_assert(tref_isnumber_str(tr[i]));[m
[31m-      if (tref_isstr(tr[i]))[m
[31m-	tr[i] = emitir(IRTG(IR_STRTO, IRT_NUM), tr[i], 0);[m
[31m-      if (t == IRT_INT) {[m
[31m-	if (!tref_isinteger(tr[i]))[m
[31m-	  tr[i] = emitir(IRTGI(IR_CONV), tr[i], IRCONV_INT_NUM|IRCONV_CHECK);[m
[31m-      } else {[m
[31m-	if (!tref_isnum(tr[i]))[m
[31m-	  tr[i] = emitir(IRTN(IR_CONV), tr[i], IRCONV_NUM_INT);[m
[31m-      }[m
[31m-    }[m
[31m-    tr[FORL_EXT] = tr[FORL_IDX];[m
[31m-    stop = tr[FORL_STOP];[m
[31m-    rec_for_check(J, t, rec_for_direction(&tv[FORL_STEP]),[m
[31m-		  stop, tr[FORL_STEP], 1);[m
[31m-  }[m
[31m-[m
[31m-  ev = rec_for_iter(&op, tv, isforl);[m
[31m-  if (ev == LOOPEV_LEAVE) {[m
[31m-    J->maxslot = ra+FORL_EXT+1;[m
[31m-    J->pc = fori+1;[m
[31m-  } else {[m
[31m-    J->maxslot = ra;[m
[31m-    J->pc = fori+bc_j(*fori)+1;[m
[31m-  }[m
[31m-  lj_snap_add(J);[m
[31m-[m
[31m-  emitir(IRTG(op, t), tr[FORL_IDX], stop);[m
[31m-[m
[31m-  if (ev == LOOPEV_LEAVE) {[m
[31m-    J->maxslot = ra;[m
[31m-    J->pc = fori+bc_j(*fori)+1;[m
[31m-  } else {[m
[31m-    J->maxslot = ra+FORL_EXT+1;[m
[31m-    J->pc = fori+1;[m
[31m-  }[m
[31m-  J->needsnap = 1;[m
[31m-  return ev;[m
[31m-}[m
[31m-[m
[31m-/* Record ITERL/JITERL. */[m
[31m-static LoopEvent rec_iterl(jit_State *J, const BCIns iterins)[m
[31m-{[m
[31m-  BCReg ra = bc_a(iterins);[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-  if (!tref_isnil(getslot(J, ra))) {  /* Looping back? */[m
[31m-    J->base[ra-1] = J->base[ra];  /* Copy result of ITERC to control var. */[m
[31m-    J->maxslot = ra-1+bc_b(J->pc[-1]);[m
[31m-    J->pc += bc_j(iterins)+1;[m
[31m-    return LOOPEV_ENTER;[m
[31m-  } else {[m
[31m-    J->maxslot = ra-3;[m
[31m-    J->pc++;[m
[31m-    return LOOPEV_LEAVE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record LOOP/JLOOP. Now, that was easy. */[m
[31m-static LoopEvent rec_loop(jit_State *J, BCReg ra)[m
[31m-{[m
[31m-  if (ra < J->maxslot) J->maxslot = ra;[m
[31m-  J->pc++;[m
[31m-  return LOOPEV_ENTER;[m
[31m-}[m
[31m-[m
[31m-/* Check if a loop repeatedly failed to trace because it didn't loop back. */[m
[31m-static int innerloopleft(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = 0; i < PENALTY_SLOTS; i++)[m
[31m-    if (mref(J->penalty[i].pc, const BCIns) == pc) {[m
[31m-      if ((J->penalty[i].reason == LJ_TRERR_LLEAVE ||[m
[31m-	   J->penalty[i].reason == LJ_TRERR_LINNER) &&[m
[31m-	  J->penalty[i].val >= 2*PENALTY_MIN)[m
[31m-	return 1;[m
[31m-      break;[m
[31m-    }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Handle the case when an interpreted loop op is hit. */[m
[31m-static void rec_loop_interp(jit_State *J, const BCIns *pc, LoopEvent ev)[m
[31m-{[m
[31m-  if (J->parent == 0 && J->exitno == 0) {[m
[31m-    if (pc == J->startpc && J->framedepth + J->retdepth == 0) {[m
[31m-      /* Same loop? */[m
[31m-      if (ev == LOOPEV_LEAVE)  /* Must loop back to form a root trace. */[m
[31m-	lj_trace_err(J, LJ_TRERR_LLEAVE);[m
[31m-      lj_record_stop(J, LJ_TRLINK_LOOP, J->cur.traceno);  /* Looping trace. */[m
[31m-    } else if (ev != LOOPEV_LEAVE) {  /* Entering inner loop? */[m
[31m-      /* It's usually better to abort here and wait until the inner loop[m
[31m-      ** is traced. But if the inner loop repeatedly didn't loop back,[m
[31m-      ** this indicates a low trip count. In this case try unrolling[m
[31m-      ** an inner loop even in a root trace. But it's better to be a bit[m
[31m-      ** more conservative here and only do it for very short loops.[m
[31m-      */[m
[31m-      if (bc_j(*pc) != -1 && !innerloopleft(J, pc))[m
[31m-	lj_trace_err(J, LJ_TRERR_LINNER);  /* Root trace hit an inner loop. */[m
[31m-      if ((ev != LOOPEV_ENTERLO &&[m
[31m-	   J->loopref && J->cur.nins - J->loopref > 100) || --J->loopunroll < 0)[m
[31m-	lj_trace_err(J, LJ_TRERR_LUNROLL);  /* Limit loop unrolling. */[m
[31m-      J->loopref = J->cur.nins;[m
[31m-    }[m
[31m-  } else if (ev != LOOPEV_LEAVE) {  /* Side trace enters an inner loop. */[m
[31m-    J->loopref = J->cur.nins;[m
[31m-    if (--J->loopunroll < 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_LUNROLL);  /* Limit loop unrolling. */[m
[31m-  }  /* Side trace continues across a loop that's left or not entered. */[m
[31m-}[m
[31m-[m
[31m-/* Handle the case when an already compiled loop op is hit. */[m
[31m-static void rec_loop_jit(jit_State *J, TraceNo lnk, LoopEvent ev)[m
[31m-{[m
[31m-  if (J->parent == 0 && J->exitno == 0) {  /* Root trace hit an inner loop. */[m
[31m-    /* Better let the inner loop spawn a side trace back here. */[m
[31m-    lj_trace_err(J, LJ_TRERR_LINNER);[m
[31m-  } else if (ev != LOOPEV_LEAVE) {  /* Side trace enters a compiled loop. */[m
[31m-    J->instunroll = 0;  /* Cannot continue across a compiled loop op. */[m
[31m-    if (J->pc == J->startpc && J->framedepth + J->retdepth == 0)[m
[31m-      lj_record_stop(J, LJ_TRLINK_LOOP, J->cur.traceno);  /* Form extra loop. */[m
[31m-    else[m
[31m-      lj_record_stop(J, LJ_TRLINK_ROOT, lnk);  /* Link to the loop. */[m
[31m-  }  /* Side trace continues across a loop that's left or not entered. */[m
[31m-}[m
[31m-[m
[31m-/* -- Record profiler hook checks ----------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-[m
[31m-/* Need to insert profiler hook check? */[m
[31m-static int rec_profile_need(jit_State *J, GCproto *pt, const BCIns *pc)[m
[31m-{[m
[31m-  GCproto *ppt;[m
[31m-  lua_assert(J->prof_mode == 'f' || J->prof_mode == 'l');[m
[31m-  if (!pt)[m
[31m-    return 0;[m
[31m-  ppt = J->prev_pt;[m
[31m-  J->prev_pt = pt;[m
[31m-  if (pt != ppt && ppt) {[m
[31m-    J->prev_line = -1;[m
[31m-    return 1;[m
[31m-  }[m
[31m-  if (J->prof_mode == 'l') {[m
[31m-    BCLine line = lj_debug_line(pt, proto_bcpos(pt, pc));[m
[31m-    BCLine pline = J->prev_line;[m
[31m-    J->prev_line = line;[m
[31m-    if (pline != line)[m
[31m-      return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static void rec_profile_ins(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  if (J->prof_mode && rec_profile_need(J, J->pt, pc)) {[m
[31m-    emitir(IRTG(IR_PROF, IRT_NIL), 0, 0);[m
[31m-    lj_snap_add(J);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void rec_profile_ret(jit_State *J)[m
[31m-{[m
[31m-  if (J->prof_mode == 'f') {[m
[31m-    emitir(IRTG(IR_PROF, IRT_NIL), 0, 0);[m
[31m-    J->prev_pt = NULL;[m
[31m-    lj_snap_add(J);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- Record calls and returns -------------------------------------------- */[m
[31m-[m
[31m-/* Specialize to the runtime value of the called function or its prototype. */[m
[31m-static TRef rec_call_specialize(jit_State *J, GCfunc *fn, TRef tr)[m
[31m-{[m
[31m-  TRef kfunc;[m
[31m-  if (isluafunc(fn)) {[m
[31m-    GCproto *pt = funcproto(fn);[m
[31m-    /* Too many closures created? Probably not a monomorphic function. */[m
[31m-    if (pt->flags >= PROTO_CLC_POLY) {  /* Specialize to prototype instead. */[m
[31m-      TRef trpt = emitir(IRT(IR_FLOAD, IRT_P32), tr, IRFL_FUNC_PC);[m
[31m-      emitir(IRTG(IR_EQ, IRT_P32), trpt, lj_ir_kptr(J, proto_bc(pt)));[m
[31m-      (void)lj_ir_kgc(J, obj2gco(pt), IRT_PROTO);  /* Prevent GC of proto. */[m
[31m-      return tr;[m
[31m-    }[m
[31m-  } else {[m
[31m-    /* Don't specialize to non-monomorphic builtins. */[m
[31m-    switch (fn->c.ffid) {[m
[31m-    case FF_coroutine_wrap_aux:[m
[31m-    case FF_string_gmatch_aux:[m
[31m-      /* NYI: io_file_iter doesn't have an ffid, yet. */[m
[31m-      {  /* Specialize to the ffid. */[m
[31m-	TRef trid = emitir(IRT(IR_FLOAD, IRT_U8), tr, IRFL_FUNC_FFID);[m
[31m-	emitir(IRTG(IR_EQ, IRT_INT), trid, lj_ir_kint(J, fn->c.ffid));[m
[31m-      }[m
[31m-      return tr;[m
[31m-    default:[m
[31m-      /* NYI: don't specialize to non-monomorphic C functions. */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Otherwise specialize to the function (closure) value itself. */[m
[31m-  kfunc = lj_ir_kfunc(J, fn);[m
[31m-  emitir(IRTG(IR_EQ, IRT_FUNC), tr, kfunc);[m
[31m-  return kfunc;[m
[31m-}[m
[31m-[m
[31m-/* Record call setup. */[m
[31m-static void rec_call_setup(jit_State *J, BCReg func, ptrdiff_t nargs)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  TValue *functv = &J->L->base[func];[m
[31m-  TRef *fbase = &J->base[func];[m
[31m-  ptrdiff_t i;[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-  for (i = 0; i <= nargs; i++)[m
[31m-    (void)getslot(J, func+i);  /* Ensure func and all args have a reference. */[m
[31m-  if (!tref_isfunc(fbase[0])) {  /* Resolve __call metamethod. */[m
[31m-    ix.tab = fbase[0];[m
[31m-    copyTV(J->L, &ix.tabv, functv);[m
[31m-    if (!lj_record_mm_lookup(J, &ix, MM_call) || !tref_isfunc(ix.mobj))[m
[31m-      lj_trace_err(J, LJ_TRERR_NOMM);[m
[31m-    for (i = ++nargs; i > 0; i--)  /* Shift arguments up. */[m
[31m-      fbase[i] = fbase[i-1];[m
[31m-    fbase[0] = ix.mobj;  /* Replace function. */[m
[31m-    functv = &ix.mobjv;[m
[31m-  }[m
[31m-  fbase[0] = TREF_FRAME | rec_call_specialize(J, funcV(functv), fbase[0]);[m
[31m-  J->maxslot = (BCReg)nargs;[m
[31m-}[m
[31m-[m
[31m-/* Record call. */[m
[31m-void lj_record_call(jit_State *J, BCReg func, ptrdiff_t nargs)[m
[31m-{[m
[31m-  rec_call_setup(J, func, nargs);[m
[31m-  /* Bump frame. */[m
[31m-  J->framedepth++;[m
[31m-  J->base += func+1;[m
[31m-  J->baseslot += func+1;[m
[31m-}[m
[31m-[m
[31m-/* Record tail call. */[m
[31m-void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs)[m
[31m-{[m
[31m-  rec_call_setup(J, func, nargs);[m
[31m-  if (frame_isvarg(J->L->base - 1)) {[m
[31m-    BCReg cbase = (BCReg)frame_delta(J->L->base - 1);[m
[31m-    if (--J->framedepth < 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);[m
[31m-    J->baseslot -= (BCReg)cbase;[m
[31m-    J->base -= cbase;[m
[31m-    func += cbase;[m
[31m-  }[m
[31m-  /* Move func + args down. */[m
[31m-  memmove(&J->base[-1], &J->base[func], sizeof(TRef)*(J->maxslot+1));[m
[31m-  /* Note: the new TREF_FRAME is now at J->base[-1] (even for slot #0). */[m
[31m-  /* Tailcalls can form a loop, so count towards the loop unroll limit. */[m
[31m-  if (++J->tailcalled > J->loopunroll)[m
[31m-    lj_trace_err(J, LJ_TRERR_LUNROLL);[m
[31m-}[m
[31m-[m
[31m-/* Check unroll limits for down-recursion. */[m
[31m-static int check_downrec_unroll(jit_State *J, GCproto *pt)[m
[31m-{[m
[31m-  IRRef ptref;[m
[31m-  for (ptref = J->chain[IR_KGC]; ptref; ptref = IR(ptref)->prev)[m
[31m-    if (ir_kgc(IR(ptref)) == obj2gco(pt)) {[m
[31m-      int count = 0;[m
[31m-      IRRef ref;[m
[31m-      for (ref = J->chain[IR_RETF]; ref; ref = IR(ref)->prev)[m
[31m-	if (IR(ref)->op1 == ptref)[m
[31m-	  count++;[m
[31m-      if (count) {[m
[31m-	if (J->pc == J->startpc) {[m
[31m-	  if (count + J->tailcalled > J->param[JIT_P_recunroll])[m
[31m-	    return 1;[m
[31m-	} else {[m
[31m-	  lj_trace_err(J, LJ_TRERR_DOWNREC);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static TRef rec_cat(jit_State *J, BCReg baseslot, BCReg topslot);[m
[31m-[m
[31m-/* Record return. */[m
[31m-void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)[m
[31m-{[m
[31m-  TValue *frame = J->L->base - 1;[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = 0; i < gotresults; i++)[m
[31m-    (void)getslot(J, rbase+i);  /* Ensure all results have a reference. */[m
[31m-  while (frame_ispcall(frame)) {  /* Immediately resolve pcall() returns. */[m
[31m-    BCReg cbase = (BCReg)frame_delta(frame);[m
[31m-    if (--J->framedepth < 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);[m
[31m-    lua_assert(J->baseslot > 1);[m
[31m-    gotresults++;[m
[31m-    rbase += cbase;[m
[31m-    J->baseslot -= (BCReg)cbase;[m
[31m-    J->base -= cbase;[m
[31m-    J->base[--rbase] = TREF_TRUE;  /* Prepend true to results. */[m
[31m-    frame = frame_prevd(frame);[m
[31m-  }[m
[31m-  /* Return to lower frame via interpreter for unhandled cases. */[m
[31m-  if (J->framedepth == 0 && J->pt && bc_isret(bc_op(*J->pc)) &&[m
[31m-       (!frame_islua(frame) ||[m
[31m-	(J->parent == 0 && J->exitno == 0 &&[m
[31m-	 !bc_isret(bc_op(J->cur.startins))))) {[m
[31m-    /* NYI: specialize to frame type and return directly, not via RET*. */[m
[31m-    for (i = 0; i < (ptrdiff_t)rbase; i++)[m
[31m-      J->base[i] = 0;  /* Purge dead slots. */[m
[31m-    J->maxslot = rbase + (BCReg)gotresults;[m
[31m-    lj_record_stop(J, LJ_TRLINK_RETURN, 0);  /* Return to interpreter. */[m
[31m-    return;[m
[31m-  }[m
[31m-  if (frame_isvarg(frame)) {[m
[31m-    BCReg cbase = (BCReg)frame_delta(frame);[m
[31m-    if (--J->framedepth < 0)  /* NYI: return of vararg func to lower frame. */[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);[m
[31m-    lua_assert(J->baseslot > 1);[m
[31m-    rbase += cbase;[m
[31m-    J->baseslot -= (BCReg)cbase;[m
[31m-    J->base -= cbase;[m
[31m-    frame = frame_prevd(frame);[m
[31m-  }[m
[31m-  if (frame_islua(frame)) {  /* Return to Lua frame. */[m
[31m-    BCIns callins = *(frame_pc(frame)-1);[m
[31m-    ptrdiff_t nresults = bc_b(callins) ? (ptrdiff_t)bc_b(callins)-1 :gotresults;[m
[31m-    BCReg cbase = bc_a(callins);[m
[31m-    GCproto *pt = funcproto(frame_func(frame - (cbase+1-LJ_FR2)));[m
[31m-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame teardown. */[m
[31m-    if ((pt->flags & PROTO_NOJIT))[m
[31m-      lj_trace_err(J, LJ_TRERR_CJITOFF);[m
[31m-    if (J->framedepth == 0 && J->pt && frame == J->L->base - 1) {[m
[31m-      if (check_downrec_unroll(J, pt)) {[m
[31m-	J->maxslot = (BCReg)(rbase + gotresults);[m
[31m-	lj_snap_purge(J);[m
[31m-	lj_record_stop(J, LJ_TRLINK_DOWNREC, J->cur.traceno);  /* Down-rec. */[m
[31m-	return;[m
[31m-      }[m
[31m-      lj_snap_add(J);[m
[31m-    }[m
[31m-    for (i = 0; i < nresults; i++)  /* Adjust results. */[m
[31m-      J->base[i-1] = i < gotresults ? J->base[rbase+i] : TREF_NIL;[m
[31m-    J->maxslot = cbase+(BCReg)nresults;[m
[31m-    if (J->framedepth > 0) {  /* Return to a frame that is part of the trace. */[m
[31m-      J->framedepth--;[m
[31m-      lua_assert(J->baseslot > cbase+1);[m
[31m-      J->baseslot -= cbase+1;[m
[31m-      J->base -= cbase+1;[m
[31m-    } else if (J->parent == 0 && J->exitno == 0 &&[m
[31m-	       !bc_isret(bc_op(J->cur.startins))) {[m
[31m-      /* Return to lower frame would leave the loop in a root trace. */[m
[31m-      lj_trace_err(J, LJ_TRERR_LLEAVE);[m
[31m-    } else if (J->needsnap) {  /* Tailcalled to ff with side-effects. */[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);  /* No way to insert snapshot here. */[m
[31m-    } else {  /* Return to lower frame. Guard for the target we return to. */[m
[31m-      TRef trpt = lj_ir_kgc(J, obj2gco(pt), IRT_PROTO);[m
[31m-      TRef trpc = lj_ir_kptr(J, (void *)frame_pc(frame));[m
[31m-      emitir(IRTG(IR_RETF, IRT_P32), trpt, trpc);[m
[31m-      J->retdepth++;[m
[31m-      J->needsnap = 1;[m
[31m-      lua_assert(J->baseslot == 1);[m
[31m-      /* Shift result slots up and clear the slots of the new frame below. */[m
[31m-      memmove(J->base + cbase, J->base-1, sizeof(TRef)*nresults);[m
[31m-      memset(J->base-1, 0, sizeof(TRef)*(cbase+1));[m
[31m-    }[m
[31m-  } else if (frame_iscont(frame)) {  /* Return to continuation frame. */[m
[31m-    ASMFunction cont = frame_contf(frame);[m
[31m-    BCReg cbase = (BCReg)frame_delta(frame);[m
[31m-    if ((J->framedepth -= 2) < 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);[m
[31m-    J->baseslot -= (BCReg)cbase;[m
[31m-    J->base -= cbase;[m
[31m-    J->maxslot = cbase-2;[m
[31m-    if (cont == lj_cont_ra) {[m
[31m-      /* Copy result to destination slot. */[m
[31m-      BCReg dst = bc_a(*(frame_contpc(frame)-1));[m
[31m-      J->base[dst] = gotresults ? J->base[cbase+rbase] : TREF_NIL;[m
[31m-      if (dst >= J->maxslot) J->maxslot = dst+1;[m
[31m-    } else if (cont == lj_cont_nop) {[m
[31m-      /* Nothing to do here. */[m
[31m-    } else if (cont == lj_cont_cat) {[m
[31m-      BCReg bslot = bc_b(*(frame_contpc(frame)-1));[m
[31m-      TRef tr = gotresults ? J->base[cbase+rbase] : TREF_NIL;[m
[31m-      if (bslot != cbase-2) {  /* Concatenate the remainder. */[m
[31m-	TValue *b = J->L->base, save;  /* Simulate lower frame and result. */[m
[31m-	J->base[cbase-2] = tr;[m
[31m-	copyTV(J->L, &save, b-2);[m
[31m-	if (gotresults) copyTV(J->L, b-2, b+rbase); else setnilV(b-2);[m
[31m-	J->L->base = b - cbase;[m
[31m-	tr = rec_cat(J, bslot, cbase-2);[m
[31m-	b = J->L->base + cbase;  /* Undo. */[m
[31m-	J->L->base = b;[m
[31m-	copyTV(J->L, b-2, &save);[m
[31m-      }[m
[31m-      if (tr) {  /* Store final result. */[m
[31m-	BCReg dst = bc_a(*(frame_contpc(frame)-1));[m
[31m-	J->base[dst] = tr;[m
[31m-	if (dst >= J->maxslot) J->maxslot = dst+1;[m
[31m-      }  /* Otherwise continue with another __concat call. */[m
[31m-    } else {[m
[31m-      /* Result type already specialized. */[m
[31m-      lua_assert(cont == lj_cont_condf || cont == lj_cont_condt);[m
[31m-    }[m
[31m-  } else {[m
[31m-    lj_trace_err(J, LJ_TRERR_NYIRETL);  /* NYI: handle return to C frame. */[m
[31m-  }[m
[31m-  lua_assert(J->baseslot >= 1);[m
[31m-}[m
[31m-[m
[31m-/* -- Metamethod handling ------------------------------------------------- */[m
[31m-[m
[31m-/* Prepare to record call to metamethod. */[m
[31m-static BCReg rec_mm_prep(jit_State *J, ASMFunction cont)[m
[31m-{[m
[31m-  BCReg s, top = cont == lj_cont_cat ? J->maxslot : curr_proto(J->L)->framesize;[m
[31m-  J->base[top] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;[m
[31m-  J->framedepth++;[m
[31m-  for (s = J->maxslot; s < top; s++)[m
[31m-    J->base[s] = 0;  /* Clear frame gap to avoid resurrecting previous refs. */[m
[31m-  return top+1;[m
[31m-}[m
[31m-[m
[31m-/* Record metamethod lookup. */[m
[31m-int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm)[m
[31m-{[m
[31m-  RecordIndex mix;[m
[31m-  GCtab *mt;[m
[31m-  if (tref_istab(ix->tab)) {[m
[31m-    mt = tabref(tabV(&ix->tabv)->metatable);[m
[31m-    mix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_TAB_META);[m
[31m-  } else if (tref_isudata(ix->tab)) {[m
[31m-    int udtype = udataV(&ix->tabv)->udtype;[m
[31m-    mt = tabref(udataV(&ix->tabv)->metatable);[m
[31m-    /* The metatables of special userdata objects are treated as immutable. */[m
[31m-    if (udtype != UDTYPE_USERDATA) {[m
[31m-      cTValue *mo;[m
[31m-      if (LJ_HASFFI && udtype == UDTYPE_FFI_CLIB) {[m
[31m-	/* Specialize to the C library namespace object. */[m
[31m-	emitir(IRTG(IR_EQ, IRT_P32), ix->tab, lj_ir_kptr(J, udataV(&ix->tabv)));[m
[31m-      } else {[m
[31m-	/* Specialize to the type of userdata. */[m
[31m-	TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), ix->tab, IRFL_UDATA_UDTYPE);[m
[31m-	emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, udtype));[m
[31m-      }[m
[31m-  immutable_mt:[m
[31m-      mo = lj_tab_getstr(mt, mmname_str(J2G(J), mm));[m
[31m-      if (!mo || tvisnil(mo))[m
[31m-	return 0;  /* No metamethod. */[m
[31m-      /* Treat metamethod or index table as immutable, too. */[m
[31m-      if (!(tvisfunc(mo) || tvistab(mo)))[m
[31m-	lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-      copyTV(J->L, &ix->mobjv, mo);[m
[31m-      ix->mobj = lj_ir_kgc(J, gcV(mo), tvisfunc(mo) ? IRT_FUNC : IRT_TAB);[m
[31m-      ix->mtv = mt;[m
[31m-      ix->mt = TREF_NIL;  /* Dummy value for comparison semantics. */[m
[31m-      return 1;  /* Got metamethod or index table. */[m
[31m-    }[m
[31m-    mix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_UDATA_META);[m
[31m-  } else {[m
[31m-    /* Specialize to base metatable. Must flush mcode in lua_setmetatable(). */[m
[31m-    mt = tabref(basemt_obj(J2G(J), &ix->tabv));[m
[31m-    if (mt == NULL) {[m
[31m-      ix->mt = TREF_NIL;[m
[31m-      return 0;  /* No metamethod. */[m
[31m-    }[m
[31m-    /* The cdata metatable is treated as immutable. */[m
[31m-    if (LJ_HASFFI && tref_iscdata(ix->tab)) goto immutable_mt;[m
[31m-    ix->mt = mix.tab = lj_ir_ktab(J, mt);[m
[31m-    goto nocheck;[m
[31m-  }[m
[31m-  ix->mt = mt ? mix.tab : TREF_NIL;[m
[31m-  emitir(IRTG(mt ? IR_NE : IR_EQ, IRT_TAB), mix.tab, lj_ir_knull(J, IRT_TAB));[m
[31m-nocheck:[m
[31m-  if (mt) {[m
[31m-    GCstr *mmstr = mmname_str(J2G(J), mm);[m
[31m-    cTValue *mo = lj_tab_getstr(mt, mmstr);[m
[31m-    if (mo && !tvisnil(mo))[m
[31m-      copyTV(J->L, &ix->mobjv, mo);[m
[31m-    ix->mtv = mt;[m
[31m-    settabV(J->L, &mix.tabv, mt);[m
[31m-    setstrV(J->L, &mix.keyv, mmstr);[m
[31m-    mix.key = lj_ir_kstr(J, mmstr);[m
[31m-    mix.val = 0;[m
[31m-    mix.idxchain = 0;[m
[31m-    ix->mobj = lj_record_idx(J, &mix);[m
[31m-    return !tref_isnil(ix->mobj);  /* 1 if metamethod found, 0 if not. */[m
[31m-  }[m
[31m-  return 0;  /* No metamethod. */[m
[31m-}[m
[31m-[m
[31m-/* Record call to arithmetic metamethod. */[m
[31m-static TRef rec_mm_arith(jit_State *J, RecordIndex *ix, MMS mm)[m
[31m-{[m
[31m-  /* Set up metamethod call first to save ix->tab and ix->tabv. */[m
[31m-  BCReg func = rec_mm_prep(J, mm == MM_concat ? lj_cont_cat : lj_cont_ra);[m
[31m-  TRef *base = J->base + func;[m
[31m-  TValue *basev = J->L->base + func;[m
[31m-  base[1] = ix->tab; base[2] = ix->key;[m
[31m-  copyTV(J->L, basev+1, &ix->tabv);[m
[31m-  copyTV(J->L, basev+2, &ix->keyv);[m
[31m-  if (!lj_record_mm_lookup(J, ix, mm)) {  /* Lookup mm on 1st operand. */[m
[31m-    if (mm != MM_unm) {[m
[31m-      ix->tab = ix->key;[m
[31m-      copyTV(J->L, &ix->tabv, &ix->keyv);[m
[31m-      if (lj_record_mm_lookup(J, ix, mm))  /* Lookup mm on 2nd operand. */[m
[31m-	goto ok;[m
[31m-    }[m
[31m-    lj_trace_err(J, LJ_TRERR_NOMM);[m
[31m-  }[m
[31m-ok:[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-  base[0] = ix->mobj;[m
[31m-  copyTV(J->L, basev+0, &ix->mobjv);[m
[31m-  lj_record_call(J, func, 2);[m
[31m-  return 0;  /* No result yet. */[m
[31m-}[m
[31m-[m
[31m-/* Record call to __len metamethod. */[m
[31m-static TRef rec_mm_len(jit_State *J, TRef tr, TValue *tv)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = tr;[m
[31m-  copyTV(J->L, &ix.tabv, tv);[m
[31m-  if (lj_record_mm_lookup(J, &ix, MM_len)) {[m
[31m-    BCReg func = rec_mm_prep(J, lj_cont_ra);[m
[31m-    TRef *base = J->base + func;[m
[31m-    TValue *basev = J->L->base + func;[m
[31m-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-    base[0] = ix.mobj; copyTV(J->L, basev+0, &ix.mobjv);[m
[31m-    base[1] = tr; copyTV(J->L, basev+1, tv);[m
[31m-#if LJ_52[m
[31m-    base[2] = tr; copyTV(J->L, basev+2, tv);[m
[31m-#else[m
[31m-    base[2] = TREF_NIL; setnilV(basev+2);[m
[31m-#endif[m
[31m-    lj_record_call(J, func, 2);[m
[31m-  } else {[m
[31m-    if (LJ_52 && tref_istab(tr))[m
[31m-      return lj_ir_call(J, IRCALL_lj_tab_len, tr);[m
[31m-    lj_trace_err(J, LJ_TRERR_NOMM);[m
[31m-  }[m
[31m-  return 0;  /* No result yet. */[m
[31m-}[m
[31m-[m
[31m-/* Call a comparison metamethod. */[m
[31m-static void rec_mm_callcomp(jit_State *J, RecordIndex *ix, int op)[m
[31m-{[m
[31m-  BCReg func = rec_mm_prep(J, (op&1) ? lj_cont_condf : lj_cont_condt);[m
[31m-  TRef *base = J->base + func;[m
[31m-  TValue *tv = J->L->base + func;[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-  base[0] = ix->mobj; base[1] = ix->val; base[2] = ix->key;[m
[31m-  copyTV(J->L, tv+0, &ix->mobjv);[m
[31m-  copyTV(J->L, tv+1, &ix->valv);[m
[31m-  copyTV(J->L, tv+2, &ix->keyv);[m
[31m-  lj_record_call(J, func, 2);[m
[31m-}[m
[31m-[m
[31m-/* Record call to equality comparison metamethod (for tab and udata only). */[m
[31m-static void rec_mm_equal(jit_State *J, RecordIndex *ix, int op)[m
[31m-{[m
[31m-  ix->tab = ix->val;[m
[31m-  copyTV(J->L, &ix->tabv, &ix->valv);[m
[31m-  if (lj_record_mm_lookup(J, ix, MM_eq)) {  /* Lookup mm on 1st operand. */[m
[31m-    cTValue *bv;[m
[31m-    TRef mo1 = ix->mobj;[m
[31m-    TValue mo1v;[m
[31m-    copyTV(J->L, &mo1v, &ix->mobjv);[m
[31m-    /* Avoid the 2nd lookup and the objcmp if the metatables are equal. */[m
[31m-    bv = &ix->keyv;[m
[31m-    if (tvistab(bv) && tabref(tabV(bv)->metatable) == ix->mtv) {[m
[31m-      TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_TAB_META);[m
[31m-      emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt);[m
[31m-    } else if (tvisudata(bv) && tabref(udataV(bv)->metatable) == ix->mtv) {[m
[31m-      TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_UDATA_META);[m
[31m-      emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt);[m
[31m-    } else {  /* Lookup metamethod on 2nd operand and compare both. */[m
[31m-      ix->tab = ix->key;[m
[31m-      copyTV(J->L, &ix->tabv, bv);[m
[31m-      if (!lj_record_mm_lookup(J, ix, MM_eq) ||[m
[31m-	  lj_record_objcmp(J, mo1, ix->mobj, &mo1v, &ix->mobjv))[m
[31m-	return;[m
[31m-    }[m
[31m-    rec_mm_callcomp(J, ix, op);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record call to ordered comparison metamethods (for arbitrary objects). */[m
[31m-static void rec_mm_comp(jit_State *J, RecordIndex *ix, int op)[m
[31m-{[m
[31m-  ix->tab = ix->val;[m
[31m-  copyTV(J->L, &ix->tabv, &ix->valv);[m
[31m-  while (1) {[m
[31m-    MMS mm = (op & 2) ? MM_le : MM_lt;  /* Try __le + __lt or only __lt. */[m
[31m-#if LJ_52[m
[31m-    if (!lj_record_mm_lookup(J, ix, mm)) {  /* Lookup mm on 1st operand. */[m
[31m-      ix->tab = ix->key;[m
[31m-      copyTV(J->L, &ix->tabv, &ix->keyv);[m
[31m-      if (!lj_record_mm_lookup(J, ix, mm))  /* Lookup mm on 2nd operand. */[m
[31m-	goto nomatch;[m
[31m-    }[m
[31m-    rec_mm_callcomp(J, ix, op);[m
[31m-    return;[m
[31m-#else[m
[31m-    if (lj_record_mm_lookup(J, ix, mm)) {  /* Lookup mm on 1st operand. */[m
[31m-      cTValue *bv;[m
[31m-      TRef mo1 = ix->mobj;[m
[31m-      TValue mo1v;[m
[31m-      copyTV(J->L, &mo1v, &ix->mobjv);[m
[31m-      /* Avoid the 2nd lookup and the objcmp if the metatables are equal. */[m
[31m-      bv = &ix->keyv;[m
[31m-      if (tvistab(bv) && tabref(tabV(bv)->metatable) == ix->mtv) {[m
[31m-	TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_TAB_META);[m
[31m-	emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt);[m
[31m-      } else if (tvisudata(bv) && tabref(udataV(bv)->metatable) == ix->mtv) {[m
[31m-	TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_UDATA_META);[m
[31m-	emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt);[m
[31m-      } else {  /* Lookup metamethod on 2nd operand and compare both. */[m
[31m-	ix->tab = ix->key;[m
[31m-	copyTV(J->L, &ix->tabv, bv);[m
[31m-	if (!lj_record_mm_lookup(J, ix, mm) ||[m
[31m-	    lj_record_objcmp(J, mo1, ix->mobj, &mo1v, &ix->mobjv))[m
[31m-	  goto nomatch;[m
[31m-      }[m
[31m-      rec_mm_callcomp(J, ix, op);[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-  nomatch:[m
[31m-    /* Lookup failed. Retry with  __lt and swapped operands. */[m
[31m-    if (!(op & 2)) break;  /* Already at __lt. Interpreter will throw. */[m
[31m-    ix->tab = ix->key; ix->key = ix->val; ix->val = ix->tab;[m
[31m-    copyTV(J->L, &ix->tabv, &ix->keyv);[m
[31m-    copyTV(J->L, &ix->keyv, &ix->valv);[m
[31m-    copyTV(J->L, &ix->valv, &ix->tabv);[m
[31m-    op ^= 3;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Setup call to cdata comparison metamethod. */[m
[31m-static void rec_mm_comp_cdata(jit_State *J, RecordIndex *ix, int op, MMS mm)[m
[31m-{[m
[31m-  lj_snap_add(J);[m
[31m-  if (tref_iscdata(ix->val)) {[m
[31m-    ix->tab = ix->val;[m
[31m-    copyTV(J->L, &ix->tabv, &ix->valv);[m
[31m-  } else {[m
[31m-    lua_assert(tref_iscdata(ix->key));[m
[31m-    ix->tab = ix->key;[m
[31m-    copyTV(J->L, &ix->tabv, &ix->keyv);[m
[31m-  }[m
[31m-  lj_record_mm_lookup(J, ix, mm);[m
[31m-  rec_mm_callcomp(J, ix, op);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Indexed access ------------------------------------------------------ */[m
[31m-[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-/* Bump table allocations in bytecode when they grow during recording. */[m
[31m-static void rec_idx_bump(jit_State *J, RecordIndex *ix)[m
[31m-{[m
[31m-  RBCHashEntry *rbc = &J->rbchash[(ix->tab & (RBCHASH_SLOTS-1))];[m
[31m-  if (tref_ref(ix->tab) == rbc->ref) {[m
[31m-    const BCIns *pc = mref(rbc->pc, const BCIns);[m
[31m-    GCtab *tb = tabV(&ix->tabv);[m
[31m-    uint32_t nhbits;[m
[31m-    IRIns *ir;[m
[31m-    if (!tvisnil(&ix->keyv))[m
[31m-      (void)lj_tab_set(J->L, tb, &ix->keyv);  /* Grow table right now. */[m
[31m-    nhbits = tb->hmask > 0 ? lj_fls(tb->hmask)+1 : 0;[m
[31m-    ir = IR(tref_ref(ix->tab));[m
[31m-    if (ir->o == IR_TNEW) {[m
[31m-      uint32_t ah = bc_d(*pc);[m
[31m-      uint32_t asize = ah & 0x7ff, hbits = ah >> 11;[m
[31m-      if (nhbits > hbits) hbits = nhbits;[m
[31m-      if (tb->asize > asize) {[m
[31m-	asize = tb->asize <= 0x7ff ? tb->asize : 0x7ff;[m
[31m-      }[m
[31m-      if ((asize | (hbits<<11)) != ah) {  /* Has the size changed? */[m
[31m-	/* Patch bytecode, but continue recording (for more patching). */[m
[31m-	setbc_d(pc, (asize | (hbits<<11)));[m
[31m-	/* Patching TNEW operands is only safe if the trace is aborted. */[m
[31m-	ir->op1 = asize; ir->op2 = hbits;[m
[31m-	J->retryrec = 1;  /* Abort the trace at the end of recording. */[m
[31m-      }[m
[31m-    } else if (ir->o == IR_TDUP) {[m
[31m-      GCtab *tpl = gco2tab(proto_kgc(&gcref(rbc->pt)->pt, ~(ptrdiff_t)bc_d(*pc)));[m
[31m-      /* Grow template table, but preserve keys with nil values. */[m
[31m-      if ((tb->asize > tpl->asize && (1u << nhbits)-1 == tpl->hmask) ||[m
[31m-	  (tb->asize == tpl->asize && (1u << nhbits)-1 > tpl->hmask)) {[m
[31m-	Node *node = noderef(tpl->node);[m
[31m-	uint32_t i, hmask = tpl->hmask, asize;[m
[31m-	TValue *array;[m
[31m-	for (i = 0; i <= hmask; i++) {[m
[31m-	  if (!tvisnil(&node[i].key) && tvisnil(&node[i].val))[m
[31m-	    settabV(J->L, &node[i].val, tpl);[m
[31m-	}[m
[31m-	if (!tvisnil(&ix->keyv) && tref_isk(ix->key)) {[m
[31m-	  TValue *o = lj_tab_set(J->L, tpl, &ix->keyv);[m
[31m-	  if (tvisnil(o)) settabV(J->L, o, tpl);[m
[31m-	}[m
[31m-	lj_tab_resize(J->L, tpl, tb->asize, nhbits);[m
[31m-	node = noderef(tpl->node);[m
[31m-	hmask = tpl->hmask;[m
[31m-	for (i = 0; i <= hmask; i++) {[m
[31m-	  /* This is safe, since template tables only hold immutable values. */[m
[31m-	  if (tvistab(&node[i].val))[m
[31m-	    setnilV(&node[i].val);[m
[31m-	}[m
[31m-	/* The shape of the table may have changed. Clean up array part, too. */[m
[31m-	asize = tpl->asize;[m
[31m-	array = tvref(tpl->array);[m
[31m-	for (i = 0; i < asize; i++) {[m
[31m-	  if (tvistab(&array[i]))[m
[31m-	    setnilV(&array[i]);[m
[31m-	}[m
[31m-	J->retryrec = 1;  /* Abort the trace at the end of recording. */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Record bounds-check. */[m
[31m-static void rec_idx_abc(jit_State *J, TRef asizeref, TRef ikey, uint32_t asize)[m
[31m-{[m
[31m-  /* Try to emit invariant bounds checks. */[m
[31m-  if ((J->flags & (JIT_F_OPT_LOOP|JIT_F_OPT_ABC)) ==[m
[31m-      (JIT_F_OPT_LOOP|JIT_F_OPT_ABC)) {[m
[31m-    IRRef ref = tref_ref(ikey);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    int32_t ofs = 0;[m
[31m-    IRRef ofsref = 0;[m
[31m-    /* Handle constant offsets. */[m
[31m-    if (ir->o == IR_ADD && irref_isk(ir->op2)) {[m
[31m-      ofsref = ir->op2;[m
[31m-      ofs = IR(ofsref)->i;[m
[31m-      ref = ir->op1;[m
[31m-      ir = IR(ref);[m
[31m-    }[m
[31m-    /* Got scalar evolution analysis results for this reference? */[m
[31m-    if (ref == J->scev.idx) {[m
[31m-      int32_t stop;[m
[31m-      lua_assert(irt_isint(J->scev.t) && ir->o == IR_SLOAD);[m
[31m-      stop = numberVint(&(J->L->base - J->baseslot)[ir->op1 + FORL_STOP]);[m
[31m-      /* Runtime value for stop of loop is within bounds? */[m
[31m-      if ((uint64_t)stop + ofs < (uint64_t)asize) {[m
[31m-	/* Emit invariant bounds check for stop. */[m
[31m-	emitir(IRTG(IR_ABC, IRT_P32), asizeref, ofs == 0 ? J->scev.stop :[m
[31m-	       emitir(IRTI(IR_ADD), J->scev.stop, ofsref));[m
[31m-	/* Emit invariant bounds check for start, if not const or negative. */[m
[31m-	if (!(J->scev.dir && J->scev.start &&[m
[31m-	      (int64_t)IR(J->scev.start)->i + ofs >= 0))[m
[31m-	  emitir(IRTG(IR_ABC, IRT_P32), asizeref, ikey);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  emitir(IRTGI(IR_ABC), asizeref, ikey);  /* Emit regular bounds check. */[m
[31m-}[m
[31m-[m
[31m-/* Record indexed key lookup. */[m
[31m-static TRef rec_idx_key(jit_State *J, RecordIndex *ix, IRRef *rbref,[m
[31m-			IRType1 *rbguard)[m
[31m-{[m
[31m-  TRef key;[m
[31m-  GCtab *t = tabV(&ix->tabv);[m
[31m-  ix->oldv = lj_tab_get(J->L, t, &ix->keyv);  /* Lookup previous value. */[m
[31m-  *rbref = 0;[m
[31m-  rbguard->irt = 0;[m
[31m-[m
[31m-  /* Integer keys are looked up in the array part first. */[m
[31m-  key = ix->key;[m
[31m-  if (tref_isnumber(key)) {[m
[31m-    int32_t k = numberVint(&ix->keyv);[m
[31m-    if (!tvisint(&ix->keyv) && numV(&ix->keyv) != (lua_Number)k)[m
[31m-      k = LJ_MAX_ASIZE;[m
[31m-    if ((MSize)k < LJ_MAX_ASIZE) {  /* Potential array key? */[m
[31m-      TRef ikey = lj_opt_narrow_index(J, key);[m
[31m-      TRef asizeref = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_ASIZE);[m
[31m-      if ((MSize)k < t->asize) {  /* Currently an array key? */[m
[31m-	TRef arrayref;[m
[31m-	rec_idx_abc(J, asizeref, ikey, t->asize);[m
[31m-	arrayref = emitir(IRT(IR_FLOAD, IRT_P32), ix->tab, IRFL_TAB_ARRAY);[m
[31m-	return emitir(IRT(IR_AREF, IRT_P32), arrayref, ikey);[m
[31m-      } else {  /* Currently not in array (may be an array extension)? */[m
[31m-	emitir(IRTGI(IR_ULE), asizeref, ikey);  /* Inv. bounds check. */[m
[31m-	if (k == 0 && tref_isk(key))[m
[31m-	  key = lj_ir_knum_zero(J);  /* Canonicalize 0 or +-0.0 to +0.0. */[m
[31m-	/* And continue with the hash lookup. */[m
[31m-      }[m
[31m-    } else if (!tref_isk(key)) {[m
[31m-      /* We can rule out const numbers which failed the integerness test[m
[31m-      ** above. But all other numbers are potential array keys.[m
[31m-      */[m
[31m-      if (t->asize == 0) {  /* True sparse tables have an empty array part. */[m
[31m-	/* Guard that the array part stays empty. */[m
[31m-	TRef tmp = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_ASIZE);[m
[31m-	emitir(IRTGI(IR_EQ), tmp, lj_ir_kint(J, 0));[m
[31m-      } else {[m
[31m-	lj_trace_err(J, LJ_TRERR_NYITMIX);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Otherwise the key is located in the hash part. */[m
[31m-  if (t->hmask == 0) {  /* Shortcut for empty hash part. */[m
[31m-    /* Guard that the hash part stays empty. */[m
[31m-    TRef tmp = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK);[m
[31m-    emitir(IRTGI(IR_EQ), tmp, lj_ir_kint(J, 0));[m
[31m-    return lj_ir_kkptr(J, niltvg(J2G(J)));[m
[31m-  }[m
[31m-  if (tref_isinteger(key))  /* Hash keys are based on numbers, not ints. */[m
[31m-    key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT);[m
[31m-  if (tref_isk(key)) {[m
[31m-    /* Optimize lookup of constant hash keys. */[m
[31m-    MSize hslot = (MSize)((char *)ix->oldv - (char *)&noderef(t->node)[0].val);[m
[31m-    if (t->hmask > 0 && hslot <= t->hmask*(MSize)sizeof(Node) &&[m
[31m-	hslot <= 65535*(MSize)sizeof(Node)) {[m
[31m-      TRef node, kslot, hm;[m
[31m-      *rbref = J->cur.nins;  /* Mark possible rollback point. */[m
[31m-      *rbguard = J->guardemit;[m
[31m-      hm = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK);[m
[31m-      emitir(IRTGI(IR_EQ), hm, lj_ir_kint(J, (int32_t)t->hmask));[m
[31m-      node = emitir(IRT(IR_FLOAD, IRT_P32), ix->tab, IRFL_TAB_NODE);[m
[31m-      kslot = lj_ir_kslot(J, key, hslot / sizeof(Node));[m
[31m-      return emitir(IRTG(IR_HREFK, IRT_P32), node, kslot);[m
[31m-    }[m
[31m-  }[m
[31m-  /* Fall back to a regular hash lookup. */[m
[31m-  return emitir(IRT(IR_HREF, IRT_P32), ix->tab, key);[m
[31m-}[m
[31m-[m
[31m-/* Determine whether a key is NOT one of the fast metamethod names. */[m
[31m-static int nommstr(jit_State *J, TRef key)[m
[31m-{[m
[31m-  if (tref_isstr(key)) {[m
[31m-    if (tref_isk(key)) {[m
[31m-      GCstr *str = ir_kstr(IR(tref_ref(key)));[m
[31m-      uint32_t mm;[m
[31m-      for (mm = 0; mm <= MM_FAST; mm++)[m
[31m-	if (mmname_str(J2G(J), mm) == str)[m
[31m-	  return 0;  /* MUST be one the fast metamethod names. */[m
[31m-    } else {[m
[31m-      return 0;  /* Variable string key MAY be a metamethod name. */[m
[31m-    }[m
[31m-  }[m
[31m-  return 1;  /* CANNOT be a metamethod name. */[m
[31m-}[m
[31m-[m
[31m-/* Record indexed load/store. */[m
[31m-TRef lj_record_idx(jit_State *J, RecordIndex *ix)[m
[31m-{[m
[31m-  TRef xref;[m
[31m-  IROp xrefop, loadop;[m
[31m-  IRRef rbref;[m
[31m-  IRType1 rbguard;[m
[31m-  cTValue *oldv;[m
[31m-[m
[31m-  while (!tref_istab(ix->tab)) { /* Handle non-table lookup. */[m
[31m-    /* Never call raw lj_record_idx() on non-table. */[m
[31m-    lua_assert(ix->idxchain != 0);[m
[31m-    if (!lj_record_mm_lookup(J, ix, ix->val ? MM_newindex : MM_index))[m
[31m-      lj_trace_err(J, LJ_TRERR_NOMM);[m
[31m-  handlemm:[m
[31m-    if (tref_isfunc(ix->mobj)) {  /* Handle metamethod call. */[m
[31m-      BCReg func = rec_mm_prep(J, ix->val ? lj_cont_nop : lj_cont_ra);[m
[31m-      TRef *base = J->base + func;[m
[31m-      TValue *tv = J->L->base + func;[m
[31m-      lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-      base[0] = ix->mobj; base[1] = ix->tab; base[2] = ix->key;[m
[31m-      setfuncV(J->L, tv+0, funcV(&ix->mobjv));[m
[31m-      copyTV(J->L, tv+1, &ix->tabv);[m
[31m-      copyTV(J->L, tv+2, &ix->keyv);[m
[31m-      if (ix->val) {[m
[31m-	base[3] = ix->val;[m
[31m-	copyTV(J->L, tv+3, &ix->valv);[m
[31m-	lj_record_call(J, func, 3);  /* mobj(tab, key, val) */[m
[31m-	return 0;[m
[31m-      } else {[m
[31m-	lj_record_call(J, func, 2);  /* res = mobj(tab, key) */[m
[31m-	return 0;  /* No result yet. */[m
[31m-      }[m
[31m-    }[m
[31m-    /* Otherwise retry lookup with metaobject. */[m
[31m-    ix->tab = ix->mobj;[m
[31m-    copyTV(J->L, &ix->tabv, &ix->mobjv);[m
[31m-    if (--ix->idxchain == 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_IDXLOOP);[m
[31m-  }[m
[31m-[m
[31m-  /* First catch nil and NaN keys for tables. */[m
[31m-  if (tvisnil(&ix->keyv) || (tvisnum(&ix->keyv) && tvisnan(&ix->keyv))) {[m
[31m-    if (ix->val)  /* Better fail early. */[m
[31m-      lj_trace_err(J, LJ_TRERR_STORENN);[m
[31m-    if (tref_isk(ix->key)) {[m
[31m-      if (ix->idxchain && lj_record_mm_lookup(J, ix, MM_index))[m
[31m-	goto handlemm;[m
[31m-      return TREF_NIL;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Record the key lookup. */[m
[31m-  xref = rec_idx_key(J, ix, &rbref, &rbguard);[m
[31m-  xrefop = IR(tref_ref(xref))->o;[m
[31m-  loadop = xrefop == IR_AREF ? IR_ALOAD : IR_HLOAD;[m
[31m-  /* The lj_meta_tset() inconsistency is gone, but better play safe. */[m
[31m-  oldv = xrefop == IR_KKPTR ? (cTValue *)ir_kptr(IR(tref_ref(xref))) : ix->oldv;[m
[31m-[m
[31m-  if (ix->val == 0) {  /* Indexed load */[m
[31m-    IRType t = itype2irt(oldv);[m
[31m-    TRef res;[m
[31m-    if (oldv == niltvg(J2G(J))) {[m
[31m-      emitir(IRTG(IR_EQ, IRT_P32), xref, lj_ir_kkptr(J, niltvg(J2G(J))));[m
[31m-      res = TREF_NIL;[m
[31m-    } else {[m
[31m-      res = emitir(IRTG(loadop, t), xref, 0);[m
[31m-    }[m
[31m-    if (tref_ref(res) < rbref) {  /* HREFK + load forwarded? */[m
[31m-      lj_ir_rollback(J, rbref);  /* Rollback to eliminate hmask guard. */[m
[31m-      J->guardemit = rbguard;[m
[31m-    }[m
[31m-    if (t == IRT_NIL && ix->idxchain && lj_record_mm_lookup(J, ix, MM_index))[m
[31m-      goto handlemm;[m
[31m-    if (irtype_ispri(t)) res = TREF_PRI(t);  /* Canonicalize primitives. */[m
[31m-    return res;[m
[31m-  } else {  /* Indexed store. */[m
[31m-    GCtab *mt = tabref(tabV(&ix->tabv)->metatable);[m
[31m-    int keybarrier = tref_isgcv(ix->key) && !tref_isnil(ix->val);[m
[31m-    if (tref_ref(xref) < rbref) {  /* HREFK forwarded? */[m
[31m-      lj_ir_rollback(J, rbref);  /* Rollback to eliminate hmask guard. */[m
[31m-      J->guardemit = rbguard;[m
[31m-    }[m
[31m-    if (tvisnil(oldv)) {  /* Previous value was nil? */[m
[31m-      /* Need to duplicate the hasmm check for the early guards. */[m
[31m-      int hasmm = 0;[m
[31m-      if (ix->idxchain && mt) {[m
[31m-	cTValue *mo = lj_tab_getstr(mt, mmname_str(J2G(J), MM_newindex));[m
[31m-	hasmm = mo && !tvisnil(mo);[m
[31m-      }[m
[31m-      if (hasmm)[m
[31m-	emitir(IRTG(loadop, IRT_NIL), xref, 0);  /* Guard for nil value. */[m
[31m-      else if (xrefop == IR_HREF)[m
[31m-	emitir(IRTG(oldv == niltvg(J2G(J)) ? IR_EQ : IR_NE, IRT_P32),[m
[31m-	       xref, lj_ir_kkptr(J, niltvg(J2G(J))));[m
[31m-      if (ix->idxchain && lj_record_mm_lookup(J, ix, MM_newindex)) {[m
[31m-	lua_assert(hasmm);[m
[31m-	goto handlemm;[m
[31m-      }[m
[31m-      lua_assert(!hasmm);[m
[31m-      if (oldv == niltvg(J2G(J))) {  /* Need to insert a new key. */[m
[31m-	TRef key = ix->key;[m
[31m-	if (tref_isinteger(key))  /* NEWREF needs a TValue as a key. */[m
[31m-	  key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT);[m
[31m-	xref = emitir(IRT(IR_NEWREF, IRT_P32), ix->tab, key);[m
[31m-	keybarrier = 0;  /* NEWREF already takes care of the key barrier. */[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-	if ((J->flags & JIT_F_OPT_SINK))  /* Avoid a separate flag. */[m
[31m-	  rec_idx_bump(J, ix);[m
[31m-#endif[m
[31m-      }[m
[31m-    } else if (!lj_opt_fwd_wasnonnil(J, loadop, tref_ref(xref))) {[m
[31m-      /* Cannot derive that the previous value was non-nil, must do checks. */[m
[31m-      if (xrefop == IR_HREF)  /* Guard against store to niltv. */[m
[31m-	emitir(IRTG(IR_NE, IRT_P32), xref, lj_ir_kkptr(J, niltvg(J2G(J))));[m
[31m-      if (ix->idxchain) {  /* Metamethod lookup required? */[m
[31m-	/* A check for NULL metatable is cheaper (hoistable) than a load. */[m
[31m-	if (!mt) {[m
[31m-	  TRef mtref = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_TAB_META);[m
[31m-	  emitir(IRTG(IR_EQ, IRT_TAB), mtref, lj_ir_knull(J, IRT_TAB));[m
[31m-	} else {[m
[31m-	  IRType t = itype2irt(oldv);[m
[31m-	  emitir(IRTG(loadop, t), xref, 0);  /* Guard for non-nil value. */[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      keybarrier = 0;  /* Previous non-nil value kept the key alive. */[m
[31m-    }[m
[31m-    /* Convert int to number before storing. */[m
[31m-    if (!LJ_DUALNUM && tref_isinteger(ix->val))[m
[31m-      ix->val = emitir(IRTN(IR_CONV), ix->val, IRCONV_NUM_INT);[m
[31m-    emitir(IRT(loadop+IRDELTA_L2S, tref_type(ix->val)), xref, ix->val);[m
[31m-    if (keybarrier || tref_isgcv(ix->val))[m
[31m-      emitir(IRT(IR_TBAR, IRT_NIL), ix->tab, 0);[m
[31m-    /* Invalidate neg. metamethod cache for stores with certain string keys. */[m
[31m-    if (!nommstr(J, ix->key)) {[m
[31m-      TRef fref = emitir(IRT(IR_FREF, IRT_P32), ix->tab, IRFL_TAB_NOMM);[m
[31m-      emitir(IRT(IR_FSTORE, IRT_U8), fref, lj_ir_kint(J, 0));[m
[31m-    }[m
[31m-    J->needsnap = 1;[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void rec_tsetm(jit_State *J, BCReg ra, BCReg rn, int32_t i)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  cTValue *basev = J->L->base;[m
[31m-  GCtab *t = tabV(&basev[ra-1]);[m
[31m-  settabV(J->L, &ix.tabv, t);[m
[31m-  ix.tab = getslot(J, ra-1);[m
[31m-  ix.idxchain = 0;[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  if ((J->flags & JIT_F_OPT_SINK)) {[m
[31m-    if (t->asize < i+rn-ra)[m
[31m-      lj_tab_reasize(J->L, t, i+rn-ra);[m
[31m-    setnilV(&ix.keyv);[m
[31m-    rec_idx_bump(J, &ix);[m
[31m-  }[m
[31m-#endif[m
[31m-  for (; ra < rn; i++, ra++) {[m
[31m-    setintV(&ix.keyv, i);[m
[31m-    ix.key = lj_ir_kint(J, i);[m
[31m-    copyTV(J->L, &ix.valv, &basev[ra]);[m
[31m-    ix.val = getslot(J, ra);[m
[31m-    lj_record_idx(J, &ix);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Upvalue access ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check whether upvalue is immutable and ok to constify. */[m
[31m-static int rec_upvalue_constify(jit_State *J, GCupval *uvp)[m
[31m-{[m
[31m-  if (uvp->immutable) {[m
[31m-    cTValue *o = uvval(uvp);[m
[31m-    /* Don't constify objects that may retain large amounts of memory. */[m
[31m-#if LJ_HASFFI[m
[31m-    if (tviscdata(o)) {[m
[31m-      GCcdata *cd = cdataV(o);[m
[31m-      if (!cdataisv(cd) && !(cd->marked & LJ_GC_CDATA_FIN)) {[m
[31m-	CType *ct = ctype_raw(ctype_ctsG(J2G(J)), cd->ctypeid);[m
[31m-	if (!ctype_hassize(ct->info) || ct->size <= 16)[m
[31m-	  return 1;[m
[31m-      }[m
[31m-      return 0;[m
[31m-    }[m
[31m-#else[m
[31m-    UNUSED(J);[m
[31m-#endif[m
[31m-    if (!(tvistab(o) || tvisudata(o) || tvisthread(o)))[m
[31m-      return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Record upvalue load/store. */[m
[31m-static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val)[m
[31m-{[m
[31m-  GCupval *uvp = &gcref(J->fn->l.uvptr[uv])->uv;[m
[31m-  TRef fn = getcurrf(J);[m
[31m-  IRRef uref;[m
[31m-  int needbarrier = 0;[m
[31m-  if (rec_upvalue_constify(J, uvp)) {  /* Try to constify immutable upvalue. */[m
[31m-    TRef tr, kfunc;[m
[31m-    lua_assert(val == 0);[m
[31m-    if (!tref_isk(fn)) {  /* Late specialization of current function. */[m
[31m-      if (J->pt->flags >= PROTO_CLC_POLY)[m
[31m-	goto noconstify;[m
[31m-      kfunc = lj_ir_kfunc(J, J->fn);[m
[31m-      emitir(IRTG(IR_EQ, IRT_FUNC), fn, kfunc);[m
[31m-      J->base[-1] = TREF_FRAME | kfunc;[m
[31m-      fn = kfunc;[m
[31m-    }[m
[31m-    tr = lj_record_constify(J, uvval(uvp));[m
[31m-    if (tr)[m
[31m-      return tr;[m
[31m-  }[m
[31m-noconstify:[m
[31m-  /* Note: this effectively limits LJ_MAX_UPVAL to 127. */[m
[31m-  uv = (uv << 8) | (hashrot(uvp->dhash, uvp->dhash + HASH_BIAS) & 0xff);[m
[31m-  if (!uvp->closed) {[m
[31m-    /* In current stack? */[m
[31m-    if (uvval(uvp) >= tvref(J->L->stack) &&[m
[31m-	uvval(uvp) < tvref(J->L->maxstack)) {[m
[31m-      int32_t slot = (int32_t)(uvval(uvp) - (J->L->base - J->baseslot));[m
[31m-      if (slot >= 0) {  /* Aliases an SSA slot? */[m
[31m-	slot -= (int32_t)J->baseslot;  /* Note: slot number may be negative! */[m
[31m-	/* NYI: add IR to guard that it's still aliasing the same slot. */[m
[31m-	if (val == 0) {[m
[31m-	  return getslot(J, slot);[m
[31m-	} else {[m
[31m-	  J->base[slot] = val;[m
[31m-	  if (slot >= (int32_t)J->maxslot) J->maxslot = (BCReg)(slot+1);[m
[31m-	  return 0;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    uref = tref_ref(emitir(IRTG(IR_UREFO, IRT_P32), fn, uv));[m
[31m-  } else {[m
[31m-    needbarrier = 1;[m
[31m-    uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_P32), fn, uv));[m
[31m-  }[m
[31m-  if (val == 0) {  /* Upvalue load */[m
[31m-    IRType t = itype2irt(uvval(uvp));[m
[31m-    TRef res = emitir(IRTG(IR_ULOAD, t), uref, 0);[m
[31m-    if (irtype_ispri(t)) res = TREF_PRI(t);  /* Canonicalize primitive refs. */[m
[31m-    return res;[m
[31m-  } else {  /* Upvalue store. */[m
[31m-    /* Convert int to number before storing. */[m
[31m-    if (!LJ_DUALNUM && tref_isinteger(val))[m
[31m-      val = emitir(IRTN(IR_CONV), val, IRCONV_NUM_INT);[m
[31m-    emitir(IRT(IR_USTORE, tref_type(val)), uref, val);[m
[31m-    if (needbarrier && tref_isgcv(val))[m
[31m-      emitir(IRT(IR_OBAR, IRT_NIL), uref, val);[m
[31m-    J->needsnap = 1;[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Record calls to Lua functions --------------------------------------- */[m
[31m-[m
[31m-/* Check unroll limits for calls. */[m
[31m-static void check_call_unroll(jit_State *J, TraceNo lnk)[m
[31m-{[m
[31m-  cTValue *frame = J->L->base - 1;[m
[31m-  void *pc = mref(frame_func(frame)->l.pc, void);[m
[31m-  int32_t depth = J->framedepth;[m
[31m-  int32_t count = 0;[m
[31m-  if ((J->pt->flags & PROTO_VARARG)) depth--;  /* Vararg frame still missing. */[m
[31m-  for (; depth > 0; depth--) {  /* Count frames with same prototype. */[m
[31m-    if (frame_iscont(frame)) depth--;[m
[31m-    frame = frame_prev(frame);[m
[31m-    if (mref(frame_func(frame)->l.pc, void) == pc)[m
[31m-      count++;[m
[31m-  }[m
[31m-  if (J->pc == J->startpc) {[m
[31m-    if (count + J->tailcalled > J->param[JIT_P_recunroll]) {[m
[31m-      J->pc++;[m
[31m-      if (J->framedepth + J->retdepth == 0)[m
[31m-	lj_record_stop(J, LJ_TRLINK_TAILREC, J->cur.traceno);  /* Tail-rec. */[m
[31m-      else[m
[31m-	lj_record_stop(J, LJ_TRLINK_UPREC, J->cur.traceno);  /* Up-recursion. */[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (count > J->param[JIT_P_callunroll]) {[m
[31m-      if (lnk) {  /* Possible tail- or up-recursion. */[m
[31m-	lj_trace_flush(J, lnk);  /* Flush trace that only returns. */[m
[31m-	/* Set a small, pseudo-random hotcount for a quick retry of JFUNC*. */[m
[31m-	hotcount_set(J2GG(J), J->pc+1, LJ_PRNG_BITS(J, 4));[m
[31m-      }[m
[31m-      lj_trace_err(J, LJ_TRERR_CUNROLL);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record Lua function setup. */[m
[31m-static void rec_func_setup(jit_State *J)[m
[31m-{[m
[31m-  GCproto *pt = J->pt;[m
[31m-  BCReg s, numparams = pt->numparams;[m
[31m-  if ((pt->flags & PROTO_NOJIT))[m
[31m-    lj_trace_err(J, LJ_TRERR_CJITOFF);[m
[31m-  if (J->baseslot + pt->framesize >= LJ_MAX_JSLOTS)[m
[31m-    lj_trace_err(J, LJ_TRERR_STACKOV);[m
[31m-  /* Fill up missing parameters with nil. */[m
[31m-  for (s = J->maxslot; s < numparams; s++)[m
[31m-    J->base[s] = TREF_NIL;[m
[31m-  /* The remaining slots should never be read before they are written. */[m
[31m-  J->maxslot = numparams;[m
[31m-}[m
[31m-[m
[31m-/* Record Lua vararg function setup. */[m
[31m-static void rec_func_vararg(jit_State *J)[m
[31m-{[m
[31m-  GCproto *pt = J->pt;[m
[31m-  BCReg s, fixargs, vframe = J->maxslot+1;[m
[31m-  lua_assert((pt->flags & PROTO_VARARG));[m
[31m-  if (J->baseslot + vframe + pt->framesize >= LJ_MAX_JSLOTS)[m
[31m-    lj_trace_err(J, LJ_TRERR_STACKOV);[m
[31m-  J->base[vframe-1] = J->base[-1];  /* Copy function up. */[m
[31m-  /* Copy fixarg slots up and set their original slots to nil. */[m
[31m-  fixargs = pt->numparams < J->maxslot ? pt->numparams : J->maxslot;[m
[31m-  for (s = 0; s < fixargs; s++) {[m
[31m-    J->base[vframe+s] = J->base[s];[m
[31m-    J->base[s] = TREF_NIL;[m
[31m-  }[m
[31m-  J->maxslot = fixargs;[m
[31m-  J->framedepth++;[m
[31m-  J->base += vframe;[m
[31m-  J->baseslot += vframe;[m
[31m-}[m
[31m-[m
[31m-/* Record entry to a Lua function. */[m
[31m-static void rec_func_lua(jit_State *J)[m
[31m-{[m
[31m-  rec_func_setup(J);[m
[31m-  check_call_unroll(J, 0);[m
[31m-}[m
[31m-[m
[31m-/* Record entry to an already compiled function. */[m
[31m-static void rec_func_jit(jit_State *J, TraceNo lnk)[m
[31m-{[m
[31m-  GCtrace *T;[m
[31m-  rec_func_setup(J);[m
[31m-  T = traceref(J, lnk);[m
[31m-  if (T->linktype == LJ_TRLINK_RETURN) {  /* Trace returns to interpreter? */[m
[31m-    check_call_unroll(J, lnk);[m
[31m-    /* Temporarily unpatch JFUNC* to continue recording across function. */[m
[31m-    J->patchins = *J->pc;[m
[31m-    J->patchpc = (BCIns *)J->pc;[m
[31m-    *J->patchpc = T->startins;[m
[31m-    return;[m
[31m-  }[m
[31m-  J->instunroll = 0;  /* Cannot continue across a compiled function. */[m
[31m-  if (J->pc == J->startpc && J->framedepth + J->retdepth == 0)[m
[31m-    lj_record_stop(J, LJ_TRLINK_TAILREC, J->cur.traceno);  /* Extra tail-rec. */[m
[31m-  else[m
[31m-    lj_record_stop(J, LJ_TRLINK_ROOT, lnk);  /* Link to the function. */[m
[31m-}[m
[31m-[m
[31m-/* -- Vararg handling ----------------------------------------------------- */[m
[31m-[m
[31m-/* Detect y = select(x, ...) idiom. */[m
[31m-static int select_detect(jit_State *J)[m
[31m-{[m
[31m-  BCIns ins = J->pc[1];[m
[31m-  if (bc_op(ins) == BC_CALLM && bc_b(ins) == 2 && bc_c(ins) == 1) {[m
[31m-    cTValue *func = &J->L->base[bc_a(ins)];[m
[31m-    if (tvisfunc(func) && funcV(func)->c.ffid == FF_select) {[m
[31m-      TRef kfunc = lj_ir_kfunc(J, funcV(func));[m
[31m-      emitir(IRTG(IR_EQ, IRT_FUNC), getslot(J, bc_a(ins)), kfunc);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Record vararg instruction. */[m
[31m-static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)[m
[31m-{[m
[31m-  int32_t numparams = J->pt->numparams;[m
[31m-  ptrdiff_t nvararg = frame_delta(J->L->base-1) - numparams - 1;[m
[31m-  lua_assert(frame_isvarg(J->L->base-1));[m
[31m-  if (J->framedepth > 0) {  /* Simple case: varargs defined on-trace. */[m
[31m-    ptrdiff_t i;[m
[31m-    if (nvararg < 0) nvararg = 0;[m
[31m-    if (nresults == -1) {[m
[31m-      nresults = nvararg;[m
[31m-      J->maxslot = dst + (BCReg)nvararg;[m
[31m-    } else if (dst + nresults > J->maxslot) {[m
[31m-      J->maxslot = dst + (BCReg)nresults;[m
[31m-    }[m
[31m-    for (i = 0; i < nresults; i++)[m
[31m-      J->base[dst+i] = i < nvararg ? getslot(J, i - nvararg - 1) : TREF_NIL;[m
[31m-  } else {  /* Unknown number of varargs passed to trace. */[m
[31m-    TRef fr = emitir(IRTI(IR_SLOAD), 0, IRSLOAD_READONLY|IRSLOAD_FRAME);[m
[31m-    int32_t frofs = 8*(1+numparams)+FRAME_VARG;[m
[31m-    if (nresults >= 0) {  /* Known fixed number of results. */[m
[31m-      ptrdiff_t i;[m
[31m-      if (nvararg > 0) {[m
[31m-	ptrdiff_t nload = nvararg >= nresults ? nresults : nvararg;[m
[31m-	TRef vbase;[m
[31m-	if (nvararg >= nresults)[m
[31m-	  emitir(IRTGI(IR_GE), fr, lj_ir_kint(J, frofs+8*(int32_t)nresults));[m
[31m-	else[m
[31m-	  emitir(IRTGI(IR_EQ), fr,[m
[31m-		 lj_ir_kint(J, (int32_t)frame_ftsz(J->L->base-1)));[m
[31m-	vbase = emitir(IRTI(IR_SUB), REF_BASE, fr);[m
[31m-	vbase = emitir(IRT(IR_ADD, IRT_P32), vbase, lj_ir_kint(J, frofs-8));[m
[31m-	for (i = 0; i < nload; i++) {[m
[31m-	  IRType t = itype2irt(&J->L->base[i-1-nvararg]);[m
[31m-	  TRef aref = emitir(IRT(IR_AREF, IRT_P32),[m
[31m-			     vbase, lj_ir_kint(J, (int32_t)i));[m
[31m-	  TRef tr = emitir(IRTG(IR_VLOAD, t), aref, 0);[m
[31m-	  if (irtype_ispri(t)) tr = TREF_PRI(t);  /* Canonicalize primitives. */[m
[31m-	  J->base[dst+i] = tr;[m
[31m-	}[m
[31m-      } else {[m
[31m-	emitir(IRTGI(IR_LE), fr, lj_ir_kint(J, frofs));[m
[31m-	nvararg = 0;[m
[31m-      }[m
[31m-      for (i = nvararg; i < nresults; i++)[m
[31m-	J->base[dst+i] = TREF_NIL;[m
[31m-      if (dst + (BCReg)nresults > J->maxslot)[m
[31m-	J->maxslot = dst + (BCReg)nresults;[m
[31m-    } else if (select_detect(J)) {  /* y = select(x, ...) */[m
[31m-      TRef tridx = J->base[dst-1];[m
[31m-      TRef tr = TREF_NIL;[m
[31m-      ptrdiff_t idx = lj_ffrecord_select_mode(J, tridx, &J->L->base[dst-1]);[m
[31m-      if (idx < 0) goto nyivarg;[m
[31m-      if (idx != 0 && !tref_isinteger(tridx))[m
[31m-	tridx = emitir(IRTGI(IR_CONV), tridx, IRCONV_INT_NUM|IRCONV_INDEX);[m
[31m-      if (idx != 0 && tref_isk(tridx)) {[m
[31m-	emitir(IRTGI(idx <= nvararg ? IR_GE : IR_LT),[m
[31m-	       fr, lj_ir_kint(J, frofs+8*(int32_t)idx));[m
[31m-	frofs -= 8;  /* Bias for 1-based index. */[m
[31m-      } else if (idx <= nvararg) {  /* Compute size. */[m
[31m-	TRef tmp = emitir(IRTI(IR_ADD), fr, lj_ir_kint(J, -frofs));[m
[31m-	if (numparams)[m
[31m-	  emitir(IRTGI(IR_GE), tmp, lj_ir_kint(J, 0));[m
[31m-	tr = emitir(IRTI(IR_BSHR), tmp, lj_ir_kint(J, 3));[m
[31m-	if (idx != 0) {[m
[31m-	  tridx = emitir(IRTI(IR_ADD), tridx, lj_ir_kint(J, -1));[m
[31m-	  rec_idx_abc(J, tr, tridx, (uint32_t)nvararg);[m
[31m-	}[m
[31m-      } else {[m
[31m-	TRef tmp = lj_ir_kint(J, frofs);[m
[31m-	if (idx != 0) {[m
[31m-	  TRef tmp2 = emitir(IRTI(IR_BSHL), tridx, lj_ir_kint(J, 3));[m
[31m-	  tmp = emitir(IRTI(IR_ADD), tmp2, tmp);[m
[31m-	} else {[m
[31m-	  tr = lj_ir_kint(J, 0);[m
[31m-	}[m
[31m-	emitir(IRTGI(IR_LT), fr, tmp);[m
[31m-      }[m
[31m-      if (idx != 0 && idx <= nvararg) {[m
[31m-	IRType t;[m
[31m-	TRef aref, vbase = emitir(IRTI(IR_SUB), REF_BASE, fr);[m
[31m-	vbase = emitir(IRT(IR_ADD, IRT_P32), vbase, lj_ir_kint(J, frofs-8));[m
[31m-	t = itype2irt(&J->L->base[idx-2-nvararg]);[m
[31m-	aref = emitir(IRT(IR_AREF, IRT_P32), vbase, tridx);[m
[31m-	tr = emitir(IRTG(IR_VLOAD, t), aref, 0);[m
[31m-	if (irtype_ispri(t)) tr = TREF_PRI(t);  /* Canonicalize primitives. */[m
[31m-      }[m
[31m-      J->base[dst-2] = tr;[m
[31m-      J->maxslot = dst-1;[m
[31m-      J->bcskip = 2;  /* Skip CALLM + select. */[m
[31m-    } else {[m
[31m-    nyivarg:[m
[31m-      setintV(&J->errinfo, BC_VARG);[m
[31m-      lj_trace_err_info(J, LJ_TRERR_NYIBC);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Record allocations -------------------------------------------------- */[m
[31m-[m
[31m-static TRef rec_tnew(jit_State *J, uint32_t ah)[m
[31m-{[m
[31m-  uint32_t asize = ah & 0x7ff;[m
[31m-  uint32_t hbits = ah >> 11;[m
[31m-  TRef tr;[m
[31m-  if (asize == 0x7ff) asize = 0x801;[m
[31m-  tr = emitir(IRTG(IR_TNEW, IRT_TAB), asize, hbits);[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  J->rbchash[(tr & (RBCHASH_SLOTS-1))].ref = tref_ref(tr);[m
[31m-  setmref(J->rbchash[(tr & (RBCHASH_SLOTS-1))].pc, J->pc);[m
[31m-  setgcref(J->rbchash[(tr & (RBCHASH_SLOTS-1))].pt, obj2gco(J->pt));[m
[31m-#endif[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* -- Concatenation ------------------------------------------------------- */[m
[31m-[m
[31m-static TRef rec_cat(jit_State *J, BCReg baseslot, BCReg topslot)[m
[31m-{[m
[31m-  TRef *top = &J->base[topslot];[m
[31m-  TValue savetv[5];[m
[31m-  BCReg s;[m
[31m-  RecordIndex ix;[m
[31m-  lua_assert(baseslot < topslot);[m
[31m-  for (s = baseslot; s <= topslot; s++)[m
[31m-    (void)getslot(J, s);  /* Ensure all arguments have a reference. */[m
[31m-  if (tref_isnumber_str(top[0]) && tref_isnumber_str(top[-1])) {[m
[31m-    TRef tr, hdr, *trp, *xbase, *base = &J->base[baseslot];[m
[31m-    /* First convert numbers to strings. */[m
[31m-    for (trp = top; trp >= base; trp--) {[m
[31m-      if (tref_isnumber(*trp))[m
[31m-	*trp = emitir(IRT(IR_TOSTR, IRT_STR), *trp,[m
[31m-		      tref_isnum(*trp) ? IRTOSTR_NUM : IRTOSTR_INT);[m
[31m-      else if (!tref_isstr(*trp))[m
[31m-	break;[m
[31m-    }[m
[31m-    xbase = ++trp;[m
[31m-    tr = hdr = emitir(IRT(IR_BUFHDR, IRT_P32),[m
[31m-		      lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);[m
[31m-    do {[m
[31m-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, *trp++);[m
[31m-    } while (trp <= top);[m
[31m-    tr = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-    J->maxslot = (BCReg)(xbase - J->base);[m
[31m-    if (xbase == base) return tr;  /* Return simple concatenation result. */[m
[31m-    /* Pass partial result. */[m
[31m-    topslot = J->maxslot--;[m
[31m-    *xbase = tr;[m
[31m-    top = xbase;[m
[31m-    setstrV(J->L, &ix.keyv, &J2G(J)->strempty);  /* Simulate string result. */[m
[31m-  } else {[m
[31m-    J->maxslot = topslot-1;[m
[31m-    copyTV(J->L, &ix.keyv, &J->L->base[topslot]);[m
[31m-  }[m
[31m-  copyTV(J->L, &ix.tabv, &J->L->base[topslot-1]);[m
[31m-  ix.tab = top[-1];[m
[31m-  ix.key = top[0];[m
[31m-  memcpy(savetv, &J->L->base[topslot-1], sizeof(savetv));  /* Save slots. */[m
[31m-  rec_mm_arith(J, &ix, MM_concat);  /* Call __concat metamethod. */[m
[31m-  memcpy(&J->L->base[topslot-1], savetv, sizeof(savetv));  /* Restore slots. */[m
[31m-  return 0;  /* No result yet. */[m
[31m-}[m
[31m-[m
[31m-/* -- Record bytecode ops ------------------------------------------------- */[m
[31m-[m
[31m-/* Prepare for comparison. */[m
[31m-static void rec_comp_prep(jit_State *J)[m
[31m-{[m
[31m-  /* Prevent merging with snapshot #0 (GC exit) since we fixup the PC. */[m
[31m-  if (J->cur.nsnap == 1 && J->cur.snap[0].ref == J->cur.nins)[m
[31m-    emitir_raw(IRT(IR_NOP, IRT_NIL), 0, 0);[m
[31m-  lj_snap_add(J);[m
[31m-}[m
[31m-[m
[31m-/* Fixup comparison. */[m
[31m-static void rec_comp_fixup(jit_State *J, const BCIns *pc, int cond)[m
[31m-{[m
[31m-  BCIns jmpins = pc[1];[m
[31m-  const BCIns *npc = pc + 2 + (cond ? bc_j(jmpins) : 0);[m
[31m-  SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];[m
[31m-  /* Set PC to opposite target to avoid re-recording the comp. in side trace. */[m
[31m-  J->cur.snapmap[snap->mapofs + snap->nent] = SNAP_MKPC(npc);[m
[31m-  J->needsnap = 1;[m
[31m-  if (bc_a(jmpins) < J->maxslot) J->maxslot = bc_a(jmpins);[m
[31m-  lj_snap_shrink(J);  /* Shrink last snapshot if possible. */[m
[31m-}[m
[31m-[m
[31m-/* Record the next bytecode instruction (_before_ it's executed). */[m
[31m-void lj_record_ins(jit_State *J)[m
[31m-{[m
[31m-  cTValue *lbase;[m
[31m-  RecordIndex ix;[m
[31m-  const BCIns *pc;[m
[31m-  BCIns ins;[m
[31m-  BCOp op;[m
[31m-  TRef ra, rb, rc;[m
[31m-[m
[31m-  /* Perform post-processing action before recording the next instruction. */[m
[31m-  if (LJ_UNLIKELY(J->postproc != LJ_POST_NONE)) {[m
[31m-    switch (J->postproc) {[m
[31m-    case LJ_POST_FIXCOMP:  /* Fixup comparison. */[m
[31m-      pc = (const BCIns *)(uintptr_t)J2G(J)->tmptv.u64;[m
[31m-      rec_comp_fixup(J, pc, (!tvistruecond(&J2G(J)->tmptv2) ^ (bc_op(*pc)&1)));[m
[31m-      /* fallthrough */[m
[31m-    case LJ_POST_FIXGUARD:  /* Fixup and emit pending guard. */[m
[31m-    case LJ_POST_FIXGUARDSNAP:  /* Fixup and emit pending guard and snapshot. */[m
[31m-      if (!tvistruecond(&J2G(J)->tmptv2)) {[m
[31m-	J->fold.ins.o ^= 1;  /* Flip guard to opposite. */[m
[31m-	if (J->postproc == LJ_POST_FIXGUARDSNAP) {[m
[31m-	  SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];[m
[31m-	  J->cur.snapmap[snap->mapofs+snap->nent-1]--;  /* False -> true. */[m
[31m-	}[m
[31m-      }[m
[31m-      lj_opt_fold(J);  /* Emit pending guard. */[m
[31m-      /* fallthrough */[m
[31m-    case LJ_POST_FIXBOOL:[m
[31m-      if (!tvistruecond(&J2G(J)->tmptv2)) {[m
[31m-	BCReg s;[m
[31m-	TValue *tv = J->L->base;[m
[31m-	for (s = 0; s < J->maxslot; s++)  /* Fixup stack slot (if any). */[m
[31m-	  if (J->base[s] == TREF_TRUE && tvisfalse(&tv[s])) {[m
[31m-	    J->base[s] = TREF_FALSE;[m
[31m-	    break;[m
[31m-	  }[m
[31m-      }[m
[31m-      break;[m
[31m-    case LJ_POST_FIXCONST:[m
[31m-      {[m
[31m-	BCReg s;[m
[31m-	TValue *tv = J->L->base;[m
[31m-	for (s = 0; s < J->maxslot; s++)  /* Constify stack slots (if any). */[m
[31m-	  if (J->base[s] == TREF_NIL && !tvisnil(&tv[s]))[m
[31m-	    J->base[s] = lj_record_constify(J, &tv[s]);[m
[31m-      }[m
[31m-      break;[m
[31m-    case LJ_POST_FFRETRY:  /* Suppress recording of retried fast function. */[m
[31m-      if (bc_op(*J->pc) >= BC__MAX)[m
[31m-	return;[m
[31m-      break;[m
[31m-    default: lua_assert(0); break;[m
[31m-    }[m
[31m-    J->postproc = LJ_POST_NONE;[m
[31m-  }[m
[31m-[m
[31m-  /* Need snapshot before recording next bytecode (e.g. after a store). */[m
[31m-  if (J->needsnap) {[m
[31m-    J->needsnap = 0;[m
[31m-    lj_snap_purge(J);[m
[31m-    lj_snap_add(J);[m
[31m-    J->mergesnap = 1;[m
[31m-  }[m
[31m-[m
[31m-  /* Skip some bytecodes. */[m
[31m-  if (LJ_UNLIKELY(J->bcskip > 0)) {[m
[31m-    J->bcskip--;[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Record only closed loops for root traces. */[m
[31m-  pc = J->pc;[m
[31m-  if (J->framedepth == 0 &&[m
[31m-     (MSize)((char *)pc - (char *)J->bc_min) >= J->bc_extent)[m
[31m-    lj_trace_err(J, LJ_TRERR_LLEAVE);[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  rec_check_slots(J);[m
[31m-  rec_check_ir(J);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-  rec_profile_ins(J, pc);[m
[31m-#endif[m
[31m-[m
[31m-  /* Keep a copy of the runtime values of var/num/str operands. */[m
[31m-#define rav	(&ix.valv)[m
[31m-#define rbv	(&ix.tabv)[m
[31m-#define rcv	(&ix.keyv)[m
[31m-[m
[31m-  lbase = J->L->base;[m
[31m-  ins = *pc;[m
[31m-  op = bc_op(ins);[m
[31m-  ra = bc_a(ins);[m
[31m-  ix.val = 0;[m
[31m-  switch (bcmode_a(op)) {[m
[31m-  case BCMvar:[m
[31m-    copyTV(J->L, rav, &lbase[ra]); ix.val = ra = getslot(J, ra); break;[m
[31m-  default: break;  /* Handled later. */[m
[31m-  }[m
[31m-  rb = bc_b(ins);[m
[31m-  rc = bc_c(ins);[m
[31m-  switch (bcmode_b(op)) {[m
[31m-  case BCMnone: rb = 0; rc = bc_d(ins); break;  /* Upgrade rc to 'rd'. */[m
[31m-  case BCMvar:[m
[31m-    copyTV(J->L, rbv, &lbase[rb]); ix.tab = rb = getslot(J, rb); break;[m
[31m-  default: break;  /* Handled later. */[m
[31m-  }[m
[31m-  switch (bcmode_c(op)) {[m
[31m-  case BCMvar:[m
[31m-    copyTV(J->L, rcv, &lbase[rc]); ix.key = rc = getslot(J, rc); break;[m
[31m-  case BCMpri: setpriV(rcv, ~rc); ix.key = rc = TREF_PRI(IRT_NIL+rc); break;[m
[31m-  case BCMnum: { cTValue *tv = proto_knumtv(J->pt, rc);[m
[31m-    copyTV(J->L, rcv, tv); ix.key = rc = tvisint(tv) ? lj_ir_kint(J, intV(tv)) :[m
[31m-    lj_ir_knumint(J, numV(tv)); } break;[m
[31m-  case BCMstr: { GCstr *s = gco2str(proto_kgc(J->pt, ~(ptrdiff_t)rc));[m
[31m-    setstrV(J->L, rcv, s); ix.key = rc = lj_ir_kstr(J, s); } break;[m
[31m-  default: break;  /* Handled later. */[m
[31m-  }[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-#if LJ_HASFFI[m
[31m-    if (tref_iscdata(ra) || tref_iscdata(rc)) {[m
[31m-      rec_mm_comp_cdata(J, &ix, op, ((int)op & 2) ? MM_le : MM_lt);[m
[31m-      break;[m
[31m-    }[m
[31m-#endif[m
[31m-    /* Emit nothing for two numeric or string consts. */[m
[31m-    if (!(tref_isk2(ra,rc) && tref_isnumber_str(ra) && tref_isnumber_str(rc))) {[m
[31m-      IRType ta = tref_isinteger(ra) ? IRT_INT : tref_type(ra);[m
[31m-      IRType tc = tref_isinteger(rc) ? IRT_INT : tref_type(rc);[m
[31m-      int irop;[m
[31m-      if (ta != tc) {[m
[31m-	/* Widen mixed number/int comparisons to number/number comparison. */[m
[31m-	if (ta == IRT_INT && tc == IRT_NUM) {[m
[31m-	  ra = emitir(IRTN(IR_CONV), ra, IRCONV_NUM_INT);[m
[31m-	  ta = IRT_NUM;[m
[31m-	} else if (ta == IRT_NUM && tc == IRT_INT) {[m
[31m-	  rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT);[m
[31m-	} else if (LJ_52) {[m
[31m-	  ta = IRT_NIL;  /* Force metamethod for different types. */[m
[31m-	} else if (!((ta == IRT_FALSE || ta == IRT_TRUE) &&[m
[31m-		     (tc == IRT_FALSE || tc == IRT_TRUE))) {[m
[31m-	  break;  /* Interpreter will throw for two different types. */[m
[31m-	}[m
[31m-      }[m
[31m-      rec_comp_prep(J);[m
[31m-      irop = (int)op - (int)BC_ISLT + (int)IR_LT;[m
[31m-      if (ta == IRT_NUM) {[m
[31m-	if ((irop & 1)) irop ^= 4;  /* ISGE/ISGT are unordered. */[m
[31m-	if (!lj_ir_numcmp(numberVnum(rav), numberVnum(rcv), (IROp)irop))[m
[31m-	  irop ^= 5;[m
[31m-      } else if (ta == IRT_INT) {[m
[31m-	if (!lj_ir_numcmp(numberVnum(rav), numberVnum(rcv), (IROp)irop))[m
[31m-	  irop ^= 1;[m
[31m-      } else if (ta == IRT_STR) {[m
[31m-	if (!lj_ir_strcmp(strV(rav), strV(rcv), (IROp)irop)) irop ^= 1;[m
[31m-	ra = lj_ir_call(J, IRCALL_lj_str_cmp, ra, rc);[m
[31m-	rc = lj_ir_kint(J, 0);[m
[31m-	ta = IRT_INT;[m
[31m-      } else {[m
[31m-	rec_mm_comp(J, &ix, (int)op);[m
[31m-	break;[m
[31m-      }[m
[31m-      emitir(IRTG(irop, ta), ra, rc);[m
[31m-      rec_comp_fixup(J, J->pc, ((int)op ^ irop) & 1);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-#if LJ_HASFFI[m
[31m-    if (tref_iscdata(ra) || tref_iscdata(rc)) {[m
[31m-      rec_mm_comp_cdata(J, &ix, op, MM_eq);[m
[31m-      break;[m
[31m-    }[m
[31m-#endif[m
[31m-    /* Emit nothing for two non-table, non-udata consts. */[m
[31m-    if (!(tref_isk2(ra, rc) && !(tref_istab(ra) || tref_isudata(ra)))) {[m
[31m-      int diff;[m
[31m-      rec_comp_prep(J);[m
[31m-      diff = lj_record_objcmp(J, ra, rc, rav, rcv);[m
[31m-      if (diff == 2 || !(tref_istab(ra) || tref_isudata(ra)))[m
[31m-	rec_comp_fixup(J, J->pc, ((int)op & 1) == !diff);[m
[31m-      else if (diff == 1)  /* Only check __eq if different, but same type. */[m
[31m-	rec_mm_equal(J, &ix, (int)op);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC:[m
[31m-    if ((op & 1) == tref_istruecond(rc))[m
[31m-      rc = 0;  /* Don't store if condition is not true. */[m
[31m-    /* fallthrough */[m
[31m-  case BC_IST: case BC_ISF:  /* Type specialization suffices. */[m
[31m-    if (bc_a(pc[1]) < J->maxslot)[m
[31m-      J->maxslot = bc_a(pc[1]);  /* Shrink used slots. */[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE: case BC_ISNUM:[m
[31m-    /* These coercions need to correspond with lj_meta_istype(). */[m
[31m-    if (LJ_DUALNUM && rc == ~LJ_TNUMX+1)[m
[31m-      ra = lj_opt_narrow_toint(J, ra);[m
[31m-    else if (rc == ~LJ_TNUMX+2)[m
[31m-      ra = lj_ir_tonum(J, ra);[m
[31m-    else if (rc == ~LJ_TSTR+1)[m
[31m-      ra = lj_ir_tostr(J, ra);[m
[31m-    /* else: type specialization suffices. */[m
[31m-    J->base[bc_a(ins)] = ra;[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_NOT:[m
[31m-    /* Type specialization already forces const result. */[m
[31m-    rc = tref_istruecond(rc) ? TREF_FALSE : TREF_TRUE;[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LEN:[m
[31m-    if (tref_isstr(rc))[m
[31m-      rc = emitir(IRTI(IR_FLOAD), rc, IRFL_STR_LEN);[m
[31m-    else if (!LJ_52 && tref_istab(rc))[m
[31m-      rc = lj_ir_call(J, IRCALL_lj_tab_len, rc);[m
[31m-    else[m
[31m-      rc = rec_mm_len(J, rc, rcv);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Arithmetic ops ---------------------------------------------------- */[m
[31m-[m
[31m-  case BC_UNM:[m
[31m-    if (tref_isnumber_str(rc)) {[m
[31m-      rc = lj_opt_narrow_unm(J, rc, rcv);[m
[31m-    } else {[m
[31m-      ix.tab = rc;[m
[31m-      copyTV(J->L, &ix.tabv, rcv);[m
[31m-      rc = rec_mm_arith(J, &ix, MM_unm);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ADDNV: case BC_SUBNV: case BC_MULNV: case BC_DIVNV: case BC_MODNV:[m
[31m-    /* Swap rb/rc and rbv/rcv. rav is temp. */[m
[31m-    ix.tab = rc; ix.key = rc = rb; rb = ix.tab;[m
[31m-    copyTV(J->L, rav, rbv);[m
[31m-    copyTV(J->L, rbv, rcv);[m
[31m-    copyTV(J->L, rcv, rav);[m
[31m-    if (op == BC_MODNV)[m
[31m-      goto recmod;[m
[31m-    /* fallthrough */[m
[31m-  case BC_ADDVN: case BC_SUBVN: case BC_MULVN: case BC_DIVVN:[m
[31m-  case BC_ADDVV: case BC_SUBVV: case BC_MULVV: case BC_DIVVV: {[m
[31m-    MMS mm = bcmode_mm(op);[m
[31m-    if (tref_isnumber_str(rb) && tref_isnumber_str(rc))[m
[31m-      rc = lj_opt_narrow_arith(J, rb, rc, rbv, rcv,[m
[31m-			       (int)mm - (int)MM_add + (int)IR_ADD);[m
[31m-    else[m
[31m-      rc = rec_mm_arith(J, &ix, mm);[m
[31m-    break;[m
[31m-    }[m
[31m-[m
[31m-  case BC_MODVN: case BC_MODVV:[m
[31m-  recmod:[m
[31m-    if (tref_isnumber_str(rb) && tref_isnumber_str(rc))[m
[31m-      rc = lj_opt_narrow_mod(J, rb, rc, rbv, rcv);[m
[31m-    else[m
[31m-      rc = rec_mm_arith(J, &ix, MM_mod);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_POW:[m
[31m-    if (tref_isnumber_str(rb) && tref_isnumber_str(rc))[m
[31m-      rc = lj_opt_narrow_pow(J, rb, rc, rbv, rcv);[m
[31m-    else[m
[31m-      rc = rec_mm_arith(J, &ix, MM_pow);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Miscellaneous ops ------------------------------------------------- */[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    rc = rec_cat(J, rb, rc);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant and move ops --------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    /* Clear gap of method call to avoid resurrecting previous refs. */[m
[31m-    if (ra > J->maxslot) J->base[ra-1] = 0;[m
[31m-    break;[m
[31m-  case BC_KSTR: case BC_KNUM: case BC_KPRI:[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    rc = lj_ir_kint(J, (int32_t)(int16_t)rc);[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    while (ra <= rc)[m
[31m-      J->base[ra++] = TREF_NIL;[m
[31m-    if (rc >= J->maxslot) J->maxslot = rc+1;[m
[31m-    break;[m
[31m-#if LJ_HASFFI[m
[31m-  case BC_KCDATA:[m
[31m-    rc = lj_ir_kgc(J, proto_kgc(J->pt, ~(ptrdiff_t)rc), IRT_CDATA);[m
[31m-    break;[m
[31m-#endif[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    rc = rec_upvalue(J, rc, 0);[m
[31m-    break;[m
[31m-  case BC_USETV: case BC_USETS: case BC_USETN: case BC_USETP:[m
[31m-    rec_upvalue(J, ra, rc);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_GGET: case BC_GSET:[m
[31m-    settabV(J->L, &ix.tabv, tabref(J->fn->l.env));[m
[31m-    ix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), getcurrf(J), IRFL_FUNC_ENV);[m
[31m-    ix.idxchain = LJ_MAX_IDXCHAIN;[m
[31m-    rc = lj_record_idx(J, &ix);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETB: case BC_TSETB:[m
[31m-    setintV(&ix.keyv, (int32_t)rc);[m
[31m-    ix.key = lj_ir_kint(J, (int32_t)rc);[m
[31m-    /* fallthrough */[m
[31m-  case BC_TGETV: case BC_TGETS: case BC_TSETV: case BC_TSETS:[m
[31m-    ix.idxchain = LJ_MAX_IDXCHAIN;[m
[31m-    rc = lj_record_idx(J, &ix);[m
[31m-    break;[m
[31m-  case BC_TGETR: case BC_TSETR:[m
[31m-    ix.idxchain = 0;[m
[31m-    rc = lj_record_idx(J, &ix);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    rec_tsetm(J, ra, (BCReg)(J->L->top - J->L->base), (int32_t)rcv->u32.lo);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-    rc = rec_tnew(J, rc);[m
[31m-    break;[m
[31m-  case BC_TDUP:[m
[31m-    rc = emitir(IRTG(IR_TDUP, IRT_TAB),[m
[31m-		lj_ir_ktab(J, gco2tab(proto_kgc(J->pt, ~(ptrdiff_t)rc))), 0);[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-    J->rbchash[(rc & (RBCHASH_SLOTS-1))].ref = tref_ref(rc);[m
[31m-    setmref(J->rbchash[(rc & (RBCHASH_SLOTS-1))].pc, pc);[m
[31m-    setgcref(J->rbchash[(rc & (RBCHASH_SLOTS-1))].pt, obj2gco(J->pt));[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    J->base[ra] = getslot(J, ra-3-LJ_FR2);[m
[31m-    J->base[ra+1] = getslot(J, ra-2-LJ_FR2);[m
[31m-    J->base[ra+2] = getslot(J, ra-1-LJ_FR2);[m
[31m-    { /* Do the actual copy now because lj_record_call needs the values. */[m
[31m-      TValue *b = &J->L->base[ra];[m
[31m-      copyTV(J->L, b, b-3-LJ_FR2);[m
[31m-      copyTV(J->L, b+1, b-2-LJ_FR2);[m
[31m-      copyTV(J->L, b+2, b-1-LJ_FR2);[m
[31m-    }[m
[31m-    lj_record_call(J, ra, (ptrdiff_t)rc-1);[m
[31m-    break;[m
[31m-[m
[31m-  /* L->top is set to L->base+ra+rc+NARGS-1+1. See lj_dispatch_ins(). */[m
[31m-  case BC_CALLM:[m
[31m-    rc = (BCReg)(J->L->top - J->L->base) - ra - LJ_FR2;[m
[31m-    /* fallthrough */[m
[31m-  case BC_CALL:[m
[31m-    lj_record_call(J, ra, (ptrdiff_t)rc-1);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    rc = (BCReg)(J->L->top - J->L->base) - ra - LJ_FR2;[m
[31m-    /* fallthrough */[m
[31m-  case BC_CALLT:[m
[31m-    lj_record_tailcall(J, ra, (ptrdiff_t)rc-1);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    rec_varg(J, ra, (ptrdiff_t)rb-1);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    /* L->top is set to L->base+ra+rc+NRESULTS-1, see lj_dispatch_ins(). */[m
[31m-    rc = (BCReg)(J->L->top - J->L->base) - ra + 1;[m
[31m-    /* fallthrough */[m
[31m-  case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-#if LJ_HASPROFILE[m
[31m-    rec_profile_ret(J);[m
[31m-#endif[m
[31m-    lj_record_ret(J, ra, (ptrdiff_t)rc-1);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  case BC_FORI:[m
[31m-    if (rec_for(J, pc, 0) != LOOPEV_LEAVE)[m
[31m-      J->loopref = J->cur.nins;[m
[31m-    break;[m
[31m-  case BC_JFORI:[m
[31m-    lua_assert(bc_op(pc[(ptrdiff_t)rc-BCBIAS_J]) == BC_JFORL);[m
[31m-    if (rec_for(J, pc, 0) != LOOPEV_LEAVE)  /* Link to existing loop. */[m
[31m-      lj_record_stop(J, LJ_TRLINK_ROOT, bc_d(pc[(ptrdiff_t)rc-BCBIAS_J]));[m
[31m-    /* Continue tracing if the loop is not entered. */[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    rec_loop_interp(J, pc, rec_for(J, pc+((ptrdiff_t)rc-BCBIAS_J), 1));[m
[31m-    break;[m
[31m-  case BC_ITERL:[m
[31m-    rec_loop_interp(J, pc, rec_iterl(J, *pc));[m
[31m-    break;[m
[31m-  case BC_LOOP:[m
[31m-    rec_loop_interp(J, pc, rec_loop(J, ra));[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORL:[m
[31m-    rec_loop_jit(J, rc, rec_for(J, pc+bc_j(traceref(J, rc)->startins), 1));[m
[31m-    break;[m
[31m-  case BC_JITERL:[m
[31m-    rec_loop_jit(J, rc, rec_iterl(J, traceref(J, rc)->startins));[m
[31m-    break;[m
[31m-  case BC_JLOOP:[m
[31m-    rec_loop_jit(J, rc, rec_loop(J, ra));[m
[31m-    break;[m
[31m-[m
[31m-  case BC_IFORL:[m
[31m-  case BC_IITERL:[m
[31m-  case BC_ILOOP:[m
[31m-  case BC_IFUNCF:[m
[31m-  case BC_IFUNCV:[m
[31m-    lj_trace_err(J, LJ_TRERR_BLACKL);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    if (ra < J->maxslot)[m
[31m-      J->maxslot = ra;  /* Shrink used slots. */[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    rec_func_lua(J);[m
[31m-    break;[m
[31m-  case BC_JFUNCF:[m
[31m-    rec_func_jit(J, rc);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCV:[m
[31m-    rec_func_vararg(J);[m
[31m-    rec_func_lua(J);[m
[31m-    break;[m
[31m-  case BC_JFUNCV:[m
[31m-    lua_assert(0);  /* Cannot happen. No hotcall counting for varag funcs. */[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    lj_ffrecord_func(J);[m
[31m-    break;[m
[31m-[m
[31m-  default:[m
[31m-    if (op >= BC__MAX) {[m
[31m-      lj_ffrecord_func(J);[m
[31m-      break;[m
[31m-    }[m
[31m-    /* fallthrough */[m
[31m-  case BC_ITERN:[m
[31m-  case BC_ISNEXT:[m
[31m-  case BC_UCLO:[m
[31m-  case BC_FNEW:[m
[31m-    setintV(&J->errinfo, (int32_t)op);[m
[31m-    lj_trace_err_info(J, LJ_TRERR_NYIBC);[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  /* rc == 0 if we have no result yet, e.g. pending __index metamethod call. */[m
[31m-  if (bcmode_a(op) == BCMdst && rc) {[m
[31m-    J->base[ra] = rc;[m
[31m-    if (ra >= J->maxslot) J->maxslot = ra+1;[m
[31m-  }[m
[31m-[m
[31m-#undef rav[m
[31m-#undef rbv[m
[31m-#undef rcv[m
[31m-[m
[31m-  /* Limit the number of recorded IR instructions. */[m
[31m-  if (J->cur.nins > REF_FIRST+(IRRef)J->param[JIT_P_maxrecord])[m
[31m-    lj_trace_err(J, LJ_TRERR_TRACEOV);[m
[31m-}[m
[31m-[m
[31m-/* -- Recording setup ----------------------------------------------------- */[m
[31m-[m
[31m-/* Setup recording for a root trace started by a hot loop. */[m
[31m-static const BCIns *rec_setup_root(jit_State *J)[m
[31m-{[m
[31m-  /* Determine the next PC and the bytecode range for the loop. */[m
[31m-  const BCIns *pcj, *pc = J->pc;[m
[31m-  BCIns ins = *pc;[m
[31m-  BCReg ra = bc_a(ins);[m
[31m-  switch (bc_op(ins)) {[m
[31m-  case BC_FORL:[m
[31m-    J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns);[m
[31m-    pc += 1+bc_j(ins);[m
[31m-    J->bc_min = pc;[m
[31m-    break;[m
[31m-  case BC_ITERL:[m
[31m-    lua_assert(bc_op(pc[-1]) == BC_ITERC);[m
[31m-    J->maxslot = ra + bc_b(pc[-1]) - 1;[m
[31m-    J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns);[m
[31m-    pc += 1+bc_j(ins);[m
[31m-    lua_assert(bc_op(pc[-1]) == BC_JMP);[m
[31m-    J->bc_min = pc;[m
[31m-    break;[m
[31m-  case BC_LOOP:[m
[31m-    /* Only check BC range for real loops, but not for "repeat until true". */[m
[31m-    pcj = pc + bc_j(ins);[m
[31m-    ins = *pcj;[m
[31m-    if (bc_op(ins) == BC_JMP && bc_j(ins) < 0) {[m
[31m-      J->bc_min = pcj+1 + bc_j(ins);[m
[31m-      J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns);[m
[31m-    }[m
[31m-    J->maxslot = ra;[m
[31m-    pc++;[m
[31m-    break;[m
[31m-  case BC_RET:[m
[31m-  case BC_RET0:[m
[31m-  case BC_RET1:[m
[31m-    /* No bytecode range check for down-recursive root traces. */[m
[31m-    J->maxslot = ra + bc_d(ins) - 1;[m
[31m-    break;[m
[31m-  case BC_FUNCF:[m
[31m-    /* No bytecode range check for root traces started by a hot call. */[m
[31m-    J->maxslot = J->pt->numparams;[m
[31m-    pc++;[m
[31m-    break;[m
[31m-  case BC_CALLM:[m
[31m-  case BC_CALL:[m
[31m-  case BC_ITERC:[m
[31m-    /* No bytecode range check for stitched traces. */[m
[31m-    pc++;[m
[31m-    break;[m
[31m-  default:[m
[31m-    lua_assert(0);[m
[31m-    break;[m
[31m-  }[m
[31m-  return pc;[m
[31m-}[m
[31m-[m
[31m-/* Setup for recording a new trace. */[m
[31m-void lj_record_setup(jit_State *J)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-[m
[31m-  /* Initialize state related to current trace. */[m
[31m-  memset(J->slot, 0, sizeof(J->slot));[m
[31m-  memset(J->chain, 0, sizeof(J->chain));[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  memset(J->rbchash, 0, sizeof(J->rbchash));[m
[31m-#endif[m
[31m-  memset(J->bpropcache, 0, sizeof(J->bpropcache));[m
[31m-  J->scev.idx = REF_NIL;[m
[31m-  setmref(J->scev.pc, NULL);[m
[31m-[m
[31m-  J->baseslot = 1;  /* Invoking function is at base[-1]. */[m
[31m-  J->base = J->slot + J->baseslot;[m
[31m-  J->maxslot = 0;[m
[31m-  J->framedepth = 0;[m
[31m-  J->retdepth = 0;[m
[31m-[m
[31m-  J->instunroll = J->param[JIT_P_instunroll];[m
[31m-  J->loopunroll = J->param[JIT_P_loopunroll];[m
[31m-  J->tailcalled = 0;[m
[31m-  J->loopref = 0;[m
[31m-[m
[31m-  J->bc_min = NULL;  /* Means no limit. */[m
[31m-  J->bc_extent = ~(MSize)0;[m
[31m-[m
[31m-  /* Emit instructions for fixed references. Also triggers initial IR alloc. */[m
[31m-  emitir_raw(IRT(IR_BASE, IRT_P32), J->parent, J->exitno);[m
[31m-  for (i = 0; i <= 2; i++) {[m
[31m-    IRIns *ir = IR(REF_NIL-i);[m
[31m-    ir->i = 0;[m
[31m-    ir->t.irt = (uint8_t)(IRT_NIL+i);[m
[31m-    ir->o = IR_KPRI;[m
[31m-    ir->prev = 0;[m
[31m-  }[m
[31m-  J->cur.nk = REF_TRUE;[m
[31m-[m
[31m-  J->startpc = J->pc;[m
[31m-  setmref(J->cur.startpc, J->pc);[m
[31m-  if (J->parent) {  /* Side trace. */[m
[31m-    GCtrace *T = traceref(J, J->parent);[m
[31m-    TraceNo root = T->root ? T->root : J->parent;[m
[31m-    J->cur.root = (uint16_t)root;[m
[31m-    J->cur.startins = BCINS_AD(BC_JMP, 0, 0);[m
[31m-    /* Check whether we could at least potentially form an extra loop. */[m
[31m-    if (J->exitno == 0 && T->snap[0].nent == 0) {[m
[31m-      /* We can narrow a FORL for some side traces, too. */[m
[31m-      if (J->pc > proto_bc(J->pt) && bc_op(J->pc[-1]) == BC_JFORI &&[m
[31m-	  bc_d(J->pc[bc_j(J->pc[-1])-1]) == root) {[m
[31m-	lj_snap_add(J);[m
[31m-	rec_for_loop(J, J->pc-1, &J->scev, 1);[m
[31m-	goto sidecheck;[m
[31m-      }[m
[31m-    } else {[m
[31m-      J->startpc = NULL;  /* Prevent forming an extra loop. */[m
[31m-    }[m
[31m-    lj_snap_replay(J, T);[m
[31m-  sidecheck:[m
[31m-    if (traceref(J, J->cur.root)->nchild >= J->param[JIT_P_maxside] ||[m
[31m-	T->snap[J->exitno].count >= J->param[JIT_P_hotexit] +[m
[31m-				    J->param[JIT_P_tryside]) {[m
[31m-      lj_record_stop(J, LJ_TRLINK_INTERP, 0);[m
[31m-    }[m
[31m-  } else {  /* Root trace. */[m
[31m-    J->cur.root = 0;[m
[31m-    J->cur.startins = *J->pc;[m
[31m-    J->pc = rec_setup_root(J);[m
[31m-    /* Note: the loop instruction itself is recorded at the end and not[m
[31m-    ** at the start! So snapshot #0 needs to point to the *next* instruction.[m
[31m-    */[m
[31m-    lj_snap_add(J);[m
[31m-    if (bc_op(J->cur.startins) == BC_FORL)[m
[31m-      rec_for_loop(J, J->pc-1, &J->scev, 1);[m
[31m-    else if (bc_op(J->cur.startins) == BC_ITERC)[m
[31m-      J->startpc = NULL;[m
[31m-    if (1 + J->pt->framesize >= LJ_MAX_JSLOTS)[m
[31m-      lj_trace_err(J, LJ_TRERR_STACKOV);[m
[31m-  }[m
[31m-#if LJ_HASPROFILE[m
[31m-  J->prev_pt = NULL;[m
[31m-  J->prev_line = -1;[m
[31m-#endif[m
[31m-#ifdef LUAJIT_ENABLE_CHECKHOOK[m
[31m-  /* Regularly check for instruction/line hooks from compiled code and[m
[31m-  ** exit to the interpreter if the hooks are set.[m
[31m-  **[m
[31m-  ** This is a compile-time option and disabled by default, since the[m
[31m-  ** hook checks may be quite expensive in tight loops.[m
[31m-  **[m
[31m-  ** Note this is only useful if hooks are *not* set most of the time.[m
[31m-  ** Use this only if you want to *asynchronously* interrupt the execution.[m
[31m-  **[m
[31m-  ** You can set the instruction hook via lua_sethook() with a count of 1[m
[31m-  ** from a signal handler or another native thread. Please have a look[m
[31m-  ** at the first few functions in luajit.c for an example (Ctrl-C handler).[m
[31m-  */[m
[31m-  {[m
[31m-    TRef tr = emitir(IRT(IR_XLOAD, IRT_U8),[m
[31m-		     lj_ir_kptr(J, &J2G(J)->hookmask), IRXLOAD_VOLATILE);[m
[31m-    tr = emitir(IRTI(IR_BAND), tr, lj_ir_kint(J, (LUA_MASKLINE|LUA_MASKCOUNT)));[m
[31m-    emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, 0));[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef emitir_raw[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.h[m
[1mdeleted file mode 100644[m
[1mindex cb184e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_record.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-/*[m
[31m-** Trace recorder (bytecode -> SSA IR).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_RECORD_H[m
[31m-#define _LJ_RECORD_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Context for recording an indexed load/store. */[m
[31m-typedef struct RecordIndex {[m
[31m-  TValue tabv;		/* Runtime value of table (or indexed object). */[m
[31m-  TValue keyv;		/* Runtime value of key. */[m
[31m-  TValue valv;		/* Runtime value of stored value. */[m
[31m-  TValue mobjv;		/* Runtime value of metamethod object. */[m
[31m-  GCtab *mtv;		/* Runtime value of metatable object. */[m
[31m-  cTValue *oldv;	/* Runtime value of previously stored value. */[m
[31m-  TRef tab;		/* Table (or indexed object) reference. */[m
[31m-  TRef key;		/* Key reference. */[m
[31m-  TRef val;		/* Value reference for a store or 0 for a load. */[m
[31m-  TRef mt;		/* Metatable reference. */[m
[31m-  TRef mobj;		/* Metamethod object reference. */[m
[31m-  int idxchain;		/* Index indirections left or 0 for raw lookup. */[m
[31m-} RecordIndex;[m
[31m-[m
[31m-LJ_FUNC int lj_record_objcmp(jit_State *J, TRef a, TRef b,[m
[31m-			     cTValue *av, cTValue *bv);[m
[31m-LJ_FUNC void lj_record_stop(jit_State *J, TraceLink linktype, TraceNo lnk);[m
[31m-LJ_FUNC TRef lj_record_constify(jit_State *J, cTValue *o);[m
[31m-[m
[31m-LJ_FUNC void lj_record_call(jit_State *J, BCReg func, ptrdiff_t nargs);[m
[31m-LJ_FUNC void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs);[m
[31m-LJ_FUNC void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults);[m
[31m-[m
[31m-LJ_FUNC int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm);[m
[31m-LJ_FUNC TRef lj_record_idx(jit_State *J, RecordIndex *ix);[m
[31m-[m
[31m-LJ_FUNC void lj_record_ins(jit_State *J);[m
[31m-LJ_FUNC void lj_record_setup(jit_State *J);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.c[m
[1mdeleted file mode 100644[m
[1mindex 8638d9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.c[m
[1m+++ /dev/null[m
[36m@@ -1,867 +0,0 @@[m
[31m-/*[m
[31m-** Snapshot handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_snap_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_target.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#endif[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* Emit raw IR without passing through optimizations. */[m
[31m-#define emitir_raw(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))[m
[31m-[m
[31m-/* -- Snapshot buffer allocation ------------------------------------------ */[m
[31m-[m
[31m-/* Grow snapshot buffer. */[m
[31m-void lj_snap_grow_buf_(jit_State *J, MSize need)[m
[31m-{[m
[31m-  MSize maxsnap = (MSize)J->param[JIT_P_maxsnap];[m
[31m-  if (need > maxsnap)[m
[31m-    lj_trace_err(J, LJ_TRERR_SNAPOV);[m
[31m-  lj_mem_growvec(J->L, J->snapbuf, J->sizesnap, maxsnap, SnapShot);[m
[31m-  J->cur.snap = J->snapbuf;[m
[31m-}[m
[31m-[m
[31m-/* Grow snapshot map buffer. */[m
[31m-void lj_snap_grow_map_(jit_State *J, MSize need)[m
[31m-{[m
[31m-  if (need < 2*J->sizesnapmap)[m
[31m-    need = 2*J->sizesnapmap;[m
[31m-  else if (need < 64)[m
[31m-    need = 64;[m
[31m-  J->snapmapbuf = (SnapEntry *)lj_mem_realloc(J->L, J->snapmapbuf,[m
[31m-		    J->sizesnapmap*sizeof(SnapEntry), need*sizeof(SnapEntry));[m
[31m-  J->cur.snapmap = J->snapmapbuf;[m
[31m-  J->sizesnapmap = need;[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot generation ------------------------------------------------- */[m
[31m-[m
[31m-/* Add all modified slots to the snapshot. */[m
[31m-static MSize snapshot_slots(jit_State *J, SnapEntry *map, BCReg nslots)[m
[31m-{[m
[31m-  IRRef retf = J->chain[IR_RETF];  /* Limits SLOAD restore elimination. */[m
[31m-  BCReg s;[m
[31m-  MSize n = 0;[m
[31m-  for (s = 0; s < nslots; s++) {[m
[31m-    TRef tr = J->slot[s];[m
[31m-    IRRef ref = tref_ref(tr);[m
[31m-    if (ref) {[m
[31m-      SnapEntry sn = SNAP_TR(s, tr);[m
[31m-      IRIns *ir = &J->cur.ir[ref];[m
[31m-      if (!(sn & (SNAP_CONT|SNAP_FRAME)) &&[m
[31m-	  ir->o == IR_SLOAD && ir->op1 == s && ref > retf) {[m
[31m-	/* No need to snapshot unmodified non-inherited slots. */[m
[31m-	if (!(ir->op2 & IRSLOAD_INHERIT))[m
[31m-	  continue;[m
[31m-	/* No need to restore readonly slots and unmodified non-parent slots. */[m
[31m-	if (!(LJ_DUALNUM && (ir->op2 & IRSLOAD_CONVERT)) &&[m
[31m-	    (ir->op2 & (IRSLOAD_READONLY|IRSLOAD_PARENT)) != IRSLOAD_PARENT)[m
[31m-	  sn |= SNAP_NORESTORE;[m
[31m-      }[m
[31m-      if (LJ_SOFTFP && irt_isnum(ir->t))[m
[31m-	sn |= SNAP_SOFTFPNUM;[m
[31m-      map[n++] = sn;[m
[31m-    }[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-/* Add frame links at the end of the snapshot. */[m
[31m-static BCReg snapshot_framelinks(jit_State *J, SnapEntry *map)[m
[31m-{[m
[31m-  cTValue *frame = J->L->base - 1;[m
[31m-  cTValue *lim = J->L->base - J->baseslot;[m
[31m-  GCfunc *fn = frame_func(frame);[m
[31m-  cTValue *ftop = isluafunc(fn) ? (frame+funcproto(fn)->framesize) : J->L->top;[m
[31m-  MSize f = 0;[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: store 64 bit PCs. */[m
[31m-  map[f++] = SNAP_MKPC(J->pc);  /* The current PC is always the first entry. */[m
[31m-  while (frame > lim) {  /* Backwards traversal of all frames above base. */[m
[31m-    if (frame_islua(frame)) {[m
[31m-      map[f++] = SNAP_MKPC(frame_pc(frame));[m
[31m-      frame = frame_prevl(frame);[m
[31m-    } else if (frame_iscont(frame)) {[m
[31m-      map[f++] = SNAP_MKFTSZ(frame_ftsz(frame));[m
[31m-      map[f++] = SNAP_MKPC(frame_contpc(frame));[m
[31m-      frame = frame_prevd(frame);[m
[31m-    } else {[m
[31m-      lua_assert(!frame_isc(frame));[m
[31m-      map[f++] = SNAP_MKFTSZ(frame_ftsz(frame));[m
[31m-      frame = frame_prevd(frame);[m
[31m-      continue;[m
[31m-    }[m
[31m-    if (frame + funcproto(frame_func(frame))->framesize > ftop)[m
[31m-      ftop = frame + funcproto(frame_func(frame))->framesize;[m
[31m-  }[m
[31m-  lua_assert(f == (MSize)(1 + J->framedepth));[m
[31m-  return (BCReg)(ftop - lim);[m
[31m-}[m
[31m-[m
[31m-/* Take a snapshot of the current stack. */[m
[31m-static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap)[m
[31m-{[m
[31m-  BCReg nslots = J->baseslot + J->maxslot;[m
[31m-  MSize nent;[m
[31m-  SnapEntry *p;[m
[31m-  /* Conservative estimate. */[m
[31m-  lj_snap_grow_map(J, nsnapmap + nslots + (MSize)J->framedepth+1);[m
[31m-  p = &J->cur.snapmap[nsnapmap];[m
[31m-  nent = snapshot_slots(J, p, nslots);[m
[31m-  snap->topslot = (uint8_t)snapshot_framelinks(J, p + nent);[m
[31m-  snap->mapofs = (uint16_t)nsnapmap;[m
[31m-  snap->ref = (IRRef1)J->cur.nins;[m
[31m-  snap->nent = (uint8_t)nent;[m
[31m-  snap->nslots = (uint8_t)nslots;[m
[31m-  snap->count = 0;[m
[31m-  J->cur.nsnapmap = (uint16_t)(nsnapmap + nent + 1 + J->framedepth);[m
[31m-}[m
[31m-[m
[31m-/* Add or merge a snapshot. */[m
[31m-void lj_snap_add(jit_State *J)[m
[31m-{[m
[31m-  MSize nsnap = J->cur.nsnap;[m
[31m-  MSize nsnapmap = J->cur.nsnapmap;[m
[31m-  /* Merge if no ins. inbetween or if requested and no guard inbetween. */[m
[31m-  if ((nsnap > 0 && J->cur.snap[nsnap-1].ref == J->cur.nins) ||[m
[31m-      (J->mergesnap && !irt_isguard(J->guardemit))) {[m
[31m-    if (nsnap == 1) {  /* But preserve snap #0 PC. */[m
[31m-      emitir_raw(IRT(IR_NOP, IRT_NIL), 0, 0);[m
[31m-      goto nomerge;[m
[31m-    }[m
[31m-    nsnapmap = J->cur.snap[--nsnap].mapofs;[m
[31m-  } else {[m
[31m-  nomerge:[m
[31m-    lj_snap_grow_buf(J, nsnap+1);[m
[31m-    J->cur.nsnap = (uint16_t)(nsnap+1);[m
[31m-  }[m
[31m-  J->mergesnap = 0;[m
[31m-  J->guardemit.irt = 0;[m
[31m-  snapshot_stack(J, &J->cur.snap[nsnap], nsnapmap);[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot modification ----------------------------------------------- */[m
[31m-[m
[31m-#define SNAP_USEDEF_SLOTS	(LJ_MAX_JSLOTS+LJ_STACK_EXTRA)[m
[31m-[m
[31m-/* Find unused slots with reaching-definitions bytecode data-flow analysis. */[m
[31m-static BCReg snap_usedef(jit_State *J, uint8_t *udf,[m
[31m-			 const BCIns *pc, BCReg maxslot)[m
[31m-{[m
[31m-  BCReg s;[m
[31m-  GCobj *o;[m
[31m-[m
[31m-  if (maxslot == 0) return 0;[m
[31m-#ifdef LUAJIT_USE_VALGRIND[m
[31m-  /* Avoid errors for harmless reads beyond maxslot. */[m
[31m-  memset(udf, 1, SNAP_USEDEF_SLOTS);[m
[31m-#else[m
[31m-  memset(udf, 1, maxslot);[m
[31m-#endif[m
[31m-[m
[31m-  /* Treat open upvalues as used. */[m
[31m-  o = gcref(J->L->openupval);[m
[31m-  while (o) {[m
[31m-    if (uvval(gco2uv(o)) < J->L->base) break;[m
[31m-    udf[uvval(gco2uv(o)) - J->L->base] = 0;[m
[31m-    o = gcref(o->gch.nextgc);[m
[31m-  }[m
[31m-[m
[31m-#define USE_SLOT(s)		udf[(s)] &= ~1[m
[31m-#define DEF_SLOT(s)		udf[(s)] *= 3[m
[31m-[m
[31m-  /* Scan through following bytecode and check for uses/defs. */[m
[31m-  lua_assert(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc);[m
[31m-  for (;;) {[m
[31m-    BCIns ins = *pc++;[m
[31m-    BCOp op = bc_op(ins);[m
[31m-    switch (bcmode_b(op)) {[m
[31m-    case BCMvar: USE_SLOT(bc_b(ins)); break;[m
[31m-    default: break;[m
[31m-    }[m
[31m-    switch (bcmode_c(op)) {[m
[31m-    case BCMvar: USE_SLOT(bc_c(ins)); break;[m
[31m-    case BCMrbase:[m
[31m-      lua_assert(op == BC_CAT);[m
[31m-      for (s = bc_b(ins); s <= bc_c(ins); s++) USE_SLOT(s);[m
[31m-      for (; s < maxslot; s++) DEF_SLOT(s);[m
[31m-      break;[m
[31m-    case BCMjump:[m
[31m-    handle_jump: {[m
[31m-      BCReg minslot = bc_a(ins);[m
[31m-      if (op >= BC_FORI && op <= BC_JFORL) minslot += FORL_EXT;[m
[31m-      else if (op >= BC_ITERL && op <= BC_JITERL) minslot += bc_b(pc[-2])-1;[m
[31m-      else if (op == BC_UCLO) { pc += bc_j(ins); break; }[m
[31m-      for (s = minslot; s < maxslot; s++) DEF_SLOT(s);[m
[31m-      return minslot < maxslot ? minslot : maxslot;[m
[31m-      }[m
[31m-    case BCMlit:[m
[31m-      if (op == BC_JFORL || op == BC_JITERL || op == BC_JLOOP) {[m
[31m-	goto handle_jump;[m
[31m-      } else if (bc_isret(op)) {[m
[31m-	BCReg top = op == BC_RETM ? maxslot : (bc_a(ins) + bc_d(ins)-1);[m
[31m-	for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s);[m
[31m-	for (; s < top; s++) USE_SLOT(s);[m
[31m-	for (; s < maxslot; s++) DEF_SLOT(s);[m
[31m-	return 0;[m
[31m-      }[m
[31m-      break;[m
[31m-    case BCMfunc: return maxslot;  /* NYI: will abort, anyway. */[m
[31m-    default: break;[m
[31m-    }[m
[31m-    switch (bcmode_a(op)) {[m
[31m-    case BCMvar: USE_SLOT(bc_a(ins)); break;[m
[31m-    case BCMdst:[m
[31m-       if (!(op == BC_ISTC || op == BC_ISFC)) DEF_SLOT(bc_a(ins));[m
[31m-       break;[m
[31m-    case BCMbase:[m
[31m-      if (op >= BC_CALLM && op <= BC_VARG) {[m
[31m-	BCReg top = (op == BC_CALLM || op == BC_CALLMT || bc_c(ins) == 0) ?[m
[31m-		    maxslot : (bc_a(ins) + bc_c(ins)+LJ_FR2);[m
[31m-	if (LJ_FR2) DEF_SLOT(bc_a(ins)+1);[m
[31m-	s = bc_a(ins) - ((op == BC_ITERC || op == BC_ITERN) ? 3 : 0);[m
[31m-	for (; s < top; s++) USE_SLOT(s);[m
[31m-	for (; s < maxslot; s++) DEF_SLOT(s);[m
[31m-	if (op == BC_CALLT || op == BC_CALLMT) {[m
[31m-	  for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s);[m
[31m-	  return 0;[m
[31m-	}[m
[31m-      } else if (op == BC_KNIL) {[m
[31m-	for (s = bc_a(ins); s <= bc_d(ins); s++) DEF_SLOT(s);[m
[31m-      } else if (op == BC_TSETM) {[m
[31m-	for (s = bc_a(ins)-1; s < maxslot; s++) USE_SLOT(s);[m
[31m-      }[m
[31m-      break;[m
[31m-    default: break;[m
[31m-    }[m
[31m-    lua_assert(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc);[m
[31m-  }[m
[31m-[m
[31m-#undef USE_SLOT[m
[31m-#undef DEF_SLOT[m
[31m-[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-/* Purge dead slots before the next snapshot. */[m
[31m-void lj_snap_purge(jit_State *J)[m
[31m-{[m
[31m-  uint8_t udf[SNAP_USEDEF_SLOTS];[m
[31m-  BCReg maxslot = J->maxslot;[m
[31m-  BCReg s = snap_usedef(J, udf, J->pc, maxslot);[m
[31m-  for (; s < maxslot; s++)[m
[31m-    if (udf[s] != 0)[m
[31m-      J->base[s] = 0;  /* Purge dead slots. */[m
[31m-}[m
[31m-[m
[31m-/* Shrink last snapshot. */[m
[31m-void lj_snap_shrink(jit_State *J)[m
[31m-{[m
[31m-  SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];[m
[31m-  SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-  MSize n, m, nlim, nent = snap->nent;[m
[31m-  uint8_t udf[SNAP_USEDEF_SLOTS];[m
[31m-  BCReg maxslot = J->maxslot;[m
[31m-  BCReg minslot = snap_usedef(J, udf, snap_pc(map[nent]), maxslot);[m
[31m-  BCReg baseslot = J->baseslot;[m
[31m-  maxslot += baseslot;[m
[31m-  minslot += baseslot;[m
[31m-  snap->nslots = (uint8_t)maxslot;[m
[31m-  for (n = m = 0; n < nent; n++) {  /* Remove unused slots from snapshot. */[m
[31m-    BCReg s = snap_slot(map[n]);[m
[31m-    if (s < minslot || (s < maxslot && udf[s-baseslot] == 0))[m
[31m-      map[m++] = map[n];  /* Only copy used slots. */[m
[31m-  }[m
[31m-  snap->nent = (uint8_t)m;[m
[31m-  nlim = J->cur.nsnapmap - snap->mapofs - 1;[m
[31m-  while (n <= nlim) map[m++] = map[n++];  /* Move PC + frame links down. */[m
[31m-  J->cur.nsnapmap = (uint16_t)(snap->mapofs + m);  /* Free up space in map. */[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot access ----------------------------------------------------- */[m
[31m-[m
[31m-/* Initialize a Bloom Filter with all renamed refs.[m
[31m-** There are very few renames (often none), so the filter has[m
[31m-** very few bits set. This makes it suitable for negative filtering.[m
[31m-*/[m
[31m-static BloomFilter snap_renamefilter(GCtrace *T, SnapNo lim)[m
[31m-{[m
[31m-  BloomFilter rfilt = 0;[m
[31m-  IRIns *ir;[m
[31m-  for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--)[m
[31m-    if (ir->op2 <= lim)[m
[31m-      bloomset(rfilt, ir->op1);[m
[31m-  return rfilt;[m
[31m-}[m
[31m-[m
[31m-/* Process matching renames to find the original RegSP. */[m
[31m-static RegSP snap_renameref(GCtrace *T, SnapNo lim, IRRef ref, RegSP rs)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--)[m
[31m-    if (ir->op1 == ref && ir->op2 <= lim)[m
[31m-      rs = ir->prev;[m
[31m-  return rs;[m
[31m-}[m
[31m-[m
[31m-/* Copy RegSP from parent snapshot to the parent links of the IR. */[m
[31m-IRIns *lj_snap_regspmap(GCtrace *T, SnapNo snapno, IRIns *ir)[m
[31m-{[m
[31m-  SnapShot *snap = &T->snap[snapno];[m
[31m-  SnapEntry *map = &T->snapmap[snap->mapofs];[m
[31m-  BloomFilter rfilt = snap_renamefilter(T, snapno);[m
[31m-  MSize n = 0;[m
[31m-  IRRef ref = 0;[m
[31m-  for ( ; ; ir++) {[m
[31m-    uint32_t rs;[m
[31m-    if (ir->o == IR_SLOAD) {[m
[31m-      if (!(ir->op2 & IRSLOAD_PARENT)) break;[m
[31m-      for ( ; ; n++) {[m
[31m-	lua_assert(n < snap->nent);[m
[31m-	if (snap_slot(map[n]) == ir->op1) {[m
[31m-	  ref = snap_ref(map[n++]);[m
[31m-	  break;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (LJ_SOFTFP && ir->o == IR_HIOP) {[m
[31m-      ref++;[m
[31m-    } else if (ir->o == IR_PVAL) {[m
[31m-      ref = ir->op1 + REF_BIAS;[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-    rs = T->ir[ref].prev;[m
[31m-    if (bloomtest(rfilt, ref))[m
[31m-      rs = snap_renameref(T, snapno, ref, rs);[m
[31m-    ir->prev = (uint16_t)rs;[m
[31m-    lua_assert(regsp_used(rs));[m
[31m-  }[m
[31m-  return ir;[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot replay ----------------------------------------------------- */[m
[31m-[m
[31m-/* Replay constant from parent trace. */[m
[31m-static TRef snap_replay_const(jit_State *J, IRIns *ir)[m
[31m-{[m
[31m-  /* Only have to deal with constants that can occur in stack slots. */[m
[31m-  switch ((IROp)ir->o) {[m
[31m-  case IR_KPRI: return TREF_PRI(irt_type(ir->t));[m
[31m-  case IR_KINT: return lj_ir_kint(J, ir->i);[m
[31m-  case IR_KGC: return lj_ir_kgc(J, ir_kgc(ir), irt_t(ir->t));[m
[31m-  case IR_KNUM: return lj_ir_k64(J, IR_KNUM, ir_knum(ir));[m
[31m-  case IR_KINT64: return lj_ir_k64(J, IR_KINT64, ir_kint64(ir));[m
[31m-  case IR_KPTR: return lj_ir_kptr(J, ir_kptr(ir));  /* Continuation. */[m
[31m-  default: lua_assert(0); return TREF_NIL; break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* De-duplicate parent reference. */[m
[31m-static TRef snap_dedup(jit_State *J, SnapEntry *map, MSize nmax, IRRef ref)[m
[31m-{[m
[31m-  MSize j;[m
[31m-  for (j = 0; j < nmax; j++)[m
[31m-    if (snap_ref(map[j]) == ref)[m
[31m-      return J->slot[snap_slot(map[j])] & ~(SNAP_CONT|SNAP_FRAME);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Emit parent reference with de-duplication. */[m
[31m-static TRef snap_pref(jit_State *J, GCtrace *T, SnapEntry *map, MSize nmax,[m
[31m-		      BloomFilter seen, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = &T->ir[ref];[m
[31m-  TRef tr;[m
[31m-  if (irref_isk(ref))[m
[31m-    tr = snap_replay_const(J, ir);[m
[31m-  else if (!regsp_used(ir->prev))[m
[31m-    tr = 0;[m
[31m-  else if (!bloomtest(seen, ref) || (tr = snap_dedup(J, map, nmax, ref)) == 0)[m
[31m-    tr = emitir(IRT(IR_PVAL, irt_type(ir->t)), ref - REF_BIAS, 0);[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a sunk store corresponds to an allocation. Slow path. */[m
[31m-static int snap_sunk_store2(GCtrace *T, IRIns *ira, IRIns *irs)[m
[31m-{[m
[31m-  if (irs->o == IR_ASTORE || irs->o == IR_HSTORE ||[m
[31m-      irs->o == IR_FSTORE || irs->o == IR_XSTORE) {[m
[31m-    IRIns *irk = &T->ir[irs->op1];[m
[31m-    if (irk->o == IR_AREF || irk->o == IR_HREFK)[m
[31m-      irk = &T->ir[irk->op1];[m
[31m-    return (&T->ir[irk->op1] == ira);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a sunk store corresponds to an allocation. Fast path. */[m
[31m-static LJ_AINLINE int snap_sunk_store(GCtrace *T, IRIns *ira, IRIns *irs)[m
[31m-{[m
[31m-  if (irs->s != 255)[m
[31m-    return (ira + irs->s == irs);  /* Fast check. */[m
[31m-  return snap_sunk_store2(T, ira, irs);[m
[31m-}[m
[31m-[m
[31m-/* Replay snapshot state to setup side trace. */[m
[31m-void lj_snap_replay(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  SnapShot *snap = &T->snap[J->exitno];[m
[31m-  SnapEntry *map = &T->snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  BloomFilter seen = 0;[m
[31m-  int pass23 = 0;[m
[31m-  J->framedepth = 0;[m
[31m-  /* Emit IR for slots inherited from parent snapshot. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = &T->ir[ref];[m
[31m-    TRef tr;[m
[31m-    /* The bloom filter avoids O(nent^2) overhead for de-duping slots. */[m
[31m-    if (bloomtest(seen, ref) && (tr = snap_dedup(J, map, n, ref)) != 0)[m
[31m-      goto setslot;[m
[31m-    bloomset(seen, ref);[m
[31m-    if (irref_isk(ref)) {[m
[31m-      tr = snap_replay_const(J, ir);[m
[31m-    } else if (!regsp_used(ir->prev)) {[m
[31m-      pass23 = 1;[m
[31m-      lua_assert(s != 0);[m
[31m-      tr = s;[m
[31m-    } else {[m
[31m-      IRType t = irt_type(ir->t);[m
[31m-      uint32_t mode = IRSLOAD_INHERIT|IRSLOAD_PARENT;[m
[31m-      if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) t = IRT_NUM;[m
[31m-      if (ir->o == IR_SLOAD) mode |= (ir->op2 & IRSLOAD_READONLY);[m
[31m-      tr = emitir_raw(IRT(IR_SLOAD, t), s, mode);[m
[31m-    }[m
[31m-  setslot:[m
[31m-    J->slot[s] = tr | (sn&(SNAP_CONT|SNAP_FRAME));  /* Same as TREF_* flags. */[m
[31m-    J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && s);[m
[31m-    if ((sn & SNAP_FRAME))[m
[31m-      J->baseslot = s+1;[m
[31m-  }[m
[31m-  if (pass23) {[m
[31m-    IRIns *irlast = &T->ir[snap->ref];[m
[31m-    pass23 = 0;[m
[31m-    /* Emit dependent PVALs. */[m
[31m-    for (n = 0; n < nent; n++) {[m
[31m-      SnapEntry sn = map[n];[m
[31m-      IRRef refp = snap_ref(sn);[m
[31m-      IRIns *ir = &T->ir[refp];[m
[31m-      if (regsp_reg(ir->r) == RID_SUNK) {[m
[31m-	if (J->slot[snap_slot(sn)] != snap_slot(sn)) continue;[m
[31m-	pass23 = 1;[m
[31m-	lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP ||[m
[31m-		   ir->o == IR_CNEW || ir->o == IR_CNEWI);[m
[31m-	if (ir->op1 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op1);[m
[31m-	if (ir->op2 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op2);[m
[31m-	if (LJ_HASFFI && ir->o == IR_CNEWI) {[m
[31m-	  if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP)[m
[31m-	    snap_pref(J, T, map, nent, seen, (ir+1)->op2);[m
[31m-	} else {[m
[31m-	  IRIns *irs;[m
[31m-	  for (irs = ir+1; irs < irlast; irs++)[m
[31m-	    if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) {[m
[31m-	      if (snap_pref(J, T, map, nent, seen, irs->op2) == 0)[m
[31m-		snap_pref(J, T, map, nent, seen, T->ir[irs->op2].op1);[m
[31m-	      else if ((LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) &&[m
[31m-		       irs+1 < irlast && (irs+1)->o == IR_HIOP)[m
[31m-		snap_pref(J, T, map, nent, seen, (irs+1)->op2);[m
[31m-	    }[m
[31m-	}[m
[31m-      } else if (!irref_isk(refp) && !regsp_used(ir->prev)) {[m
[31m-	lua_assert(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);[m
[31m-	J->slot[snap_slot(sn)] = snap_pref(J, T, map, nent, seen, ir->op1);[m
[31m-      }[m
[31m-    }[m
[31m-    /* Replay sunk instructions. */[m
[31m-    for (n = 0; pass23 && n < nent; n++) {[m
[31m-      SnapEntry sn = map[n];[m
[31m-      IRRef refp = snap_ref(sn);[m
[31m-      IRIns *ir = &T->ir[refp];[m
[31m-      if (regsp_reg(ir->r) == RID_SUNK) {[m
[31m-	TRef op1, op2;[m
[31m-	if (J->slot[snap_slot(sn)] != snap_slot(sn)) {  /* De-dup allocs. */[m
[31m-	  J->slot[snap_slot(sn)] = J->slot[J->slot[snap_slot(sn)]];[m
[31m-	  continue;[m
[31m-	}[m
[31m-	op1 = ir->op1;[m
[31m-	if (op1 >= T->nk) op1 = snap_pref(J, T, map, nent, seen, op1);[m
[31m-	op2 = ir->op2;[m
[31m-	if (op2 >= T->nk) op2 = snap_pref(J, T, map, nent, seen, op2);[m
[31m-	if (LJ_HASFFI && ir->o == IR_CNEWI) {[m
[31m-	  if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP) {[m
[31m-	    lj_needsplit(J);  /* Emit joining HIOP. */[m
[31m-	    op2 = emitir_raw(IRT(IR_HIOP, IRT_I64), op2,[m
[31m-			     snap_pref(J, T, map, nent, seen, (ir+1)->op2));[m
[31m-	  }[m
[31m-	  J->slot[snap_slot(sn)] = emitir(ir->ot & ~(IRT_MARK|IRT_ISPHI), op1, op2);[m
[31m-	} else {[m
[31m-	  IRIns *irs;[m
[31m-	  TRef tr = emitir(ir->ot, op1, op2);[m
[31m-	  J->slot[snap_slot(sn)] = tr;[m
[31m-	  for (irs = ir+1; irs < irlast; irs++)[m
[31m-	    if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) {[m
[31m-	      IRIns *irr = &T->ir[irs->op1];[m
[31m-	      TRef val, key = irr->op2, tmp = tr;[m
[31m-	      if (irr->o != IR_FREF) {[m
[31m-		IRIns *irk = &T->ir[key];[m
[31m-		if (irr->o == IR_HREFK)[m
[31m-		  key = lj_ir_kslot(J, snap_replay_const(J, &T->ir[irk->op1]),[m
[31m-				    irk->op2);[m
[31m-		else[m
[31m-		  key = snap_replay_const(J, irk);[m
[31m-		if (irr->o == IR_HREFK || irr->o == IR_AREF) {[m
[31m-		  IRIns *irf = &T->ir[irr->op1];[m
[31m-		  tmp = emitir(irf->ot, tmp, irf->op2);[m
[31m-		}[m
[31m-	      }[m
[31m-	      tmp = emitir(irr->ot, tmp, key);[m
[31m-	      val = snap_pref(J, T, map, nent, seen, irs->op2);[m
[31m-	      if (val == 0) {[m
[31m-		IRIns *irc = &T->ir[irs->op2];[m
[31m-		lua_assert(irc->o == IR_CONV && irc->op2 == IRCONV_NUM_INT);[m
[31m-		val = snap_pref(J, T, map, nent, seen, irc->op1);[m
[31m-		val = emitir(IRTN(IR_CONV), val, IRCONV_NUM_INT);[m
[31m-	      } else if ((LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) &&[m
[31m-			 irs+1 < irlast && (irs+1)->o == IR_HIOP) {[m
[31m-		IRType t = IRT_I64;[m
[31m-		if (LJ_SOFTFP && irt_type((irs+1)->t) == IRT_SOFTFP)[m
[31m-		  t = IRT_NUM;[m
[31m-		lj_needsplit(J);[m
[31m-		if (irref_isk(irs->op2) && irref_isk((irs+1)->op2)) {[m
[31m-		  uint64_t k = (uint32_t)T->ir[irs->op2].i +[m
[31m-			       ((uint64_t)T->ir[(irs+1)->op2].i << 32);[m
[31m-		  val = lj_ir_k64(J, t == IRT_I64 ? IR_KINT64 : IR_KNUM,[m
[31m-				  lj_ir_k64_find(J, k));[m
[31m-		} else {[m
[31m-		  val = emitir_raw(IRT(IR_HIOP, t), val,[m
[31m-			  snap_pref(J, T, map, nent, seen, (irs+1)->op2));[m
[31m-		}[m
[31m-		tmp = emitir(IRT(irs->o, t), tmp, val);[m
[31m-		continue;[m
[31m-	      }[m
[31m-	      tmp = emitir(irs->ot, tmp, val);[m
[31m-	    } else if (LJ_HASFFI && irs->o == IR_XBAR && ir->o == IR_CNEW) {[m
[31m-	      emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);[m
[31m-	    }[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  J->base = J->slot + J->baseslot;[m
[31m-  J->maxslot = snap->nslots - J->baseslot;[m
[31m-  lj_snap_add(J);[m
[31m-  if (pass23)  /* Need explicit GC step _after_ initial snapshot. */[m
[31m-    emitir_raw(IRTG(IR_GCSTEP, IRT_NIL), 0, 0);[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot restore ---------------------------------------------------- */[m
[31m-[m
[31m-static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,[m
[31m-			SnapNo snapno, BloomFilter rfilt,[m
[31m-			IRIns *ir, TValue *o);[m
[31m-[m
[31m-/* Restore a value from the trace exit state. */[m
[31m-static void snap_restoreval(jit_State *J, GCtrace *T, ExitState *ex,[m
[31m-			    SnapNo snapno, BloomFilter rfilt,[m
[31m-			    IRRef ref, TValue *o)[m
[31m-{[m
[31m-  IRIns *ir = &T->ir[ref];[m
[31m-  IRType1 t = ir->t;[m
[31m-  RegSP rs = ir->prev;[m
[31m-  if (irref_isk(ref)) {  /* Restore constant slot. */[m
[31m-    lj_ir_kvalue(J->L, o, ir);[m
[31m-    return;[m
[31m-  }[m
[31m-  if (LJ_UNLIKELY(bloomtest(rfilt, ref)))[m
[31m-    rs = snap_renameref(T, snapno, ref, rs);[m
[31m-  lua_assert(!LJ_GC64);  /* TODO_GC64: handle 64 bit references. */[m
[31m-  if (ra_hasspill(regsp_spill(rs))) {  /* Restore from spill slot. */[m
[31m-    int32_t *sps = &ex->spill[regsp_spill(rs)];[m
[31m-    if (irt_isinteger(t)) {[m
[31m-      setintV(o, *sps);[m
[31m-#if !LJ_SOFTFP[m
[31m-    } else if (irt_isnum(t)) {[m
[31m-      o->u64 = *(uint64_t *)sps;[m
[31m-#endif[m
[31m-    } else if (LJ_64 && irt_islightud(t)) {[m
[31m-      /* 64 bit lightuserdata which may escape already has the tag bits. */[m
[31m-      o->u64 = *(uint64_t *)sps;[m
[31m-    } else {[m
[31m-      lua_assert(!irt_ispri(t));  /* PRI refs never have a spill slot. */[m
[31m-      setgcV(J->L, o, (GCobj *)(uintptr_t)*(GCSize *)sps, irt_toitype(t));[m
[31m-    }[m
[31m-  } else {  /* Restore from register. */[m
[31m-    Reg r = regsp_reg(rs);[m
[31m-    if (ra_noreg(r)) {[m
[31m-      lua_assert(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);[m
[31m-      snap_restoreval(J, T, ex, snapno, rfilt, ir->op1, o);[m
[31m-      if (LJ_DUALNUM) setnumV(o, (lua_Number)intV(o));[m
[31m-      return;[m
[31m-    } else if (irt_isinteger(t)) {[m
[31m-      setintV(o, (int32_t)ex->gpr[r-RID_MIN_GPR]);[m
[31m-#if !LJ_SOFTFP[m
[31m-    } else if (irt_isnum(t)) {[m
[31m-      setnumV(o, ex->fpr[r-RID_MIN_FPR]);[m
[31m-#endif[m
[31m-    } else if (LJ_64 && irt_is64(t)) {[m
[31m-      /* 64 bit values that already have the tag bits. */[m
[31m-      o->u64 = ex->gpr[r-RID_MIN_GPR];[m
[31m-    } else if (irt_ispri(t)) {[m
[31m-      setpriV(o, irt_toitype(t));[m
[31m-    } else {[m
[31m-      setgcV(J->L, o, (GCobj *)ex->gpr[r-RID_MIN_GPR], irt_toitype(t));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Restore raw data from the trace exit state. */[m
[31m-static void snap_restoredata(GCtrace *T, ExitState *ex,[m
[31m-			     SnapNo snapno, BloomFilter rfilt,[m
[31m-			     IRRef ref, void *dst, CTSize sz)[m
[31m-{[m
[31m-  IRIns *ir = &T->ir[ref];[m
[31m-  RegSP rs = ir->prev;[m
[31m-  int32_t *src;[m
[31m-  uint64_t tmp;[m
[31m-  if (irref_isk(ref)) {[m
[31m-    if (ir->o == IR_KNUM || ir->o == IR_KINT64) {[m
[31m-      src = mref(ir->ptr, int32_t);[m
[31m-    } else if (sz == 8) {[m
[31m-      tmp = (uint64_t)(uint32_t)ir->i;[m
[31m-      src = (int32_t *)&tmp;[m
[31m-    } else {[m
[31m-      src = &ir->i;[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (LJ_UNLIKELY(bloomtest(rfilt, ref)))[m
[31m-      rs = snap_renameref(T, snapno, ref, rs);[m
[31m-    if (ra_hasspill(regsp_spill(rs))) {[m
[31m-      src = &ex->spill[regsp_spill(rs)];[m
[31m-      if (sz == 8 && !irt_is64(ir->t)) {[m
[31m-	tmp = (uint64_t)(uint32_t)*src;[m
[31m-	src = (int32_t *)&tmp;[m
[31m-      }[m
[31m-    } else {[m
[31m-      Reg r = regsp_reg(rs);[m
[31m-      if (ra_noreg(r)) {[m
[31m-	/* Note: this assumes CNEWI is never used for SOFTFP split numbers. */[m
[31m-	lua_assert(sz == 8 && ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);[m
[31m-	snap_restoredata(T, ex, snapno, rfilt, ir->op1, dst, 4);[m
[31m-	*(lua_Number *)dst = (lua_Number)*(int32_t *)dst;[m
[31m-	return;[m
[31m-      }[m
[31m-      src = (int32_t *)&ex->gpr[r-RID_MIN_GPR];[m
[31m-#if !LJ_SOFTFP[m
[31m-      if (r >= RID_MAX_GPR) {[m
[31m-	src = (int32_t *)&ex->fpr[r-RID_MIN_FPR];[m
[31m-#if LJ_TARGET_PPC[m
[31m-	if (sz == 4) {  /* PPC FPRs are always doubles. */[m
[31m-	  *(float *)dst = (float)*(double *)src;[m
[31m-	  return;[m
[31m-	}[m
[31m-#else[m
[31m-	if (LJ_BE && sz == 4) src++;[m
[31m-#endif[m
[31m-      }[m
[31m-#endif[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(sz == 1 || sz == 2 || sz == 4 || sz == 8);[m
[31m-  if (sz == 4) *(int32_t *)dst = *src;[m
[31m-  else if (sz == 8) *(int64_t *)dst = *(int64_t *)src;[m
[31m-  else if (sz == 1) *(int8_t *)dst = (int8_t)*src;[m
[31m-  else *(int16_t *)dst = (int16_t)*src;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Unsink allocation from the trace exit state. Unsink sunk stores. */[m
[31m-static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,[m
[31m-			SnapNo snapno, BloomFilter rfilt,[m
[31m-			IRIns *ir, TValue *o)[m
[31m-{[m
[31m-  lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP ||[m
[31m-	     ir->o == IR_CNEW || ir->o == IR_CNEWI);[m
[31m-#if LJ_HASFFI[m
[31m-  if (ir->o == IR_CNEW || ir->o == IR_CNEWI) {[m
[31m-    CTState *cts = ctype_cts(J->L);[m
[31m-    CTypeID id = (CTypeID)T->ir[ir->op1].i;[m
[31m-    CTSize sz;[m
[31m-    CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-    GCcdata *cd = lj_cdata_newx(cts, id, sz, info);[m
[31m-    setcdataV(J->L, o, cd);[m
[31m-    if (ir->o == IR_CNEWI) {[m
[31m-      uint8_t *p = (uint8_t *)cdataptr(cd);[m
[31m-      lua_assert(sz == 4 || sz == 8);[m
[31m-      if (LJ_32 && sz == 8 && ir+1 < T->ir + T->nins && (ir+1)->o == IR_HIOP) {[m
[31m-	snap_restoredata(T, ex, snapno, rfilt, (ir+1)->op2, LJ_LE?p+4:p, 4);[m
[31m-	if (LJ_BE) p += 4;[m
[31m-	sz = 4;[m
[31m-      }[m
[31m-      snap_restoredata(T, ex, snapno, rfilt, ir->op2, p, sz);[m
[31m-    } else {[m
[31m-      IRIns *irs, *irlast = &T->ir[T->snap[snapno].ref];[m
[31m-      for (irs = ir+1; irs < irlast; irs++)[m
[31m-	if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) {[m
[31m-	  IRIns *iro = &T->ir[T->ir[irs->op1].op2];[m
[31m-	  uint8_t *p = (uint8_t *)cd;[m
[31m-	  CTSize szs;[m
[31m-	  lua_assert(irs->o == IR_XSTORE && T->ir[irs->op1].o == IR_ADD);[m
[31m-	  lua_assert(iro->o == IR_KINT || iro->o == IR_KINT64);[m
[31m-	  if (irt_is64(irs->t)) szs = 8;[m
[31m-	  else if (irt_isi8(irs->t) || irt_isu8(irs->t)) szs = 1;[m
[31m-	  else if (irt_isi16(irs->t) || irt_isu16(irs->t)) szs = 2;[m
[31m-	  else szs = 4;[m
[31m-	  if (LJ_64 && iro->o == IR_KINT64)[m
[31m-	    p += (int64_t)ir_k64(iro)->u64;[m
[31m-	  else[m
[31m-	    p += iro->i;[m
[31m-	  lua_assert(p >= (uint8_t *)cdataptr(cd) &&[m
[31m-		     p + szs <= (uint8_t *)cdataptr(cd) + sz);[m
[31m-	  if (LJ_32 && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) {[m
[31m-	    lua_assert(szs == 4);[m
[31m-	    snap_restoredata(T, ex, snapno, rfilt, (irs+1)->op2, LJ_LE?p+4:p,4);[m
[31m-	    if (LJ_BE) p += 4;[m
[31m-	  }[m
[31m-	  snap_restoredata(T, ex, snapno, rfilt, irs->op2, p, szs);[m
[31m-	}[m
[31m-    }[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    IRIns *irs, *irlast;[m
[31m-    GCtab *t = ir->o == IR_TNEW ? lj_tab_new(J->L, ir->op1, ir->op2) :[m
[31m-				  lj_tab_dup(J->L, ir_ktab(&T->ir[ir->op1]));[m
[31m-    settabV(J->L, o, t);[m
[31m-    irlast = &T->ir[T->snap[snapno].ref];[m
[31m-    for (irs = ir+1; irs < irlast; irs++)[m
[31m-      if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) {[m
[31m-	IRIns *irk = &T->ir[irs->op1];[m
[31m-	TValue tmp, *val;[m
[31m-	lua_assert(irs->o == IR_ASTORE || irs->o == IR_HSTORE ||[m
[31m-		   irs->o == IR_FSTORE);[m
[31m-	if (irk->o == IR_FREF) {[m
[31m-	  lua_assert(irk->op2 == IRFL_TAB_META);[m
[31m-	  snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp);[m
[31m-	  /* NOBARRIER: The table is new (marked white). */[m
[31m-	  setgcref(t->metatable, obj2gco(tabV(&tmp)));[m
[31m-	} else {[m
[31m-	  irk = &T->ir[irk->op2];[m
[31m-	  if (irk->o == IR_KSLOT) irk = &T->ir[irk->op1];[m
[31m-	  lj_ir_kvalue(J->L, &tmp, irk);[m
[31m-	  val = lj_tab_set(J->L, t, &tmp);[m
[31m-	  /* NOBARRIER: The table is new (marked white). */[m
[31m-	  snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, val);[m
[31m-	  if (LJ_SOFTFP && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) {[m
[31m-	    snap_restoreval(J, T, ex, snapno, rfilt, (irs+1)->op2, &tmp);[m
[31m-	    val->u32.hi = tmp.u32.lo;[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Restore interpreter state from exit state with the help of a snapshot. */[m
[31m-const BCIns *lj_snap_restore(jit_State *J, void *exptr)[m
[31m-{[m
[31m-  ExitState *ex = (ExitState *)exptr;[m
[31m-  SnapNo snapno = J->exitno;  /* For now, snapno == exitno. */[m
[31m-  GCtrace *T = traceref(J, J->parent);[m
[31m-  SnapShot *snap = &T->snap[snapno];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  SnapEntry *map = &T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &T->snapmap[snap_nextofs(T, snap)-1];[m
[31m-  ptrdiff_t ftsz0;[m
[31m-  TValue *frame;[m
[31m-  BloomFilter rfilt = snap_renamefilter(T, snapno);[m
[31m-  const BCIns *pc = snap_pc(map[nent]);[m
[31m-  lua_State *L = J->L;[m
[31m-[m
[31m-  /* Set interpreter PC to the next PC to get correct error messages. */[m
[31m-  setcframe_pc(cframe_raw(L->cframe), pc+1);[m
[31m-[m
[31m-  /* Make sure the stack is big enough for the slots from the snapshot. */[m
[31m-  if (LJ_UNLIKELY(L->base + snap->topslot >= tvref(L->maxstack))) {[m
[31m-    L->top = curr_topL(L);[m
[31m-    lj_state_growstack(L, snap->topslot - curr_proto(L)->framesize);[m
[31m-  }[m
[31m-[m
[31m-  /* Fill stack slots with data from the registers and spill slots. */[m
[31m-  frame = L->base-1;[m
[31m-  ftsz0 = frame_ftsz(frame);  /* Preserve link to previous frame in slot #0. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    if (!(sn & SNAP_NORESTORE)) {[m
[31m-      TValue *o = &frame[snap_slot(sn)];[m
[31m-      IRRef ref = snap_ref(sn);[m
[31m-      IRIns *ir = &T->ir[ref];[m
[31m-      if (ir->r == RID_SUNK) {[m
[31m-	MSize j;[m
[31m-	for (j = 0; j < n; j++)[m
[31m-	  if (snap_ref(map[j]) == ref) {  /* De-duplicate sunk allocations. */[m
[31m-	    copyTV(L, o, &frame[snap_slot(map[j])]);[m
[31m-	    goto dupslot;[m
[31m-	  }[m
[31m-	snap_unsink(J, T, ex, snapno, rfilt, ir, o);[m
[31m-      dupslot:[m
[31m-	continue;[m
[31m-      }[m
[31m-      snap_restoreval(J, T, ex, snapno, rfilt, ref, o);[m
[31m-      if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && tvisint(o)) {[m
[31m-	TValue tmp;[m
[31m-	snap_restoreval(J, T, ex, snapno, rfilt, ref+1, &tmp);[m
[31m-	o->u32.hi = tmp.u32.lo;[m
[31m-      } else if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	lua_assert(!LJ_FR2);  /* TODO_FR2: store 64 bit PCs. */[m
[31m-	/* Overwrite tag with frame link. */[m
[31m-	setframe_ftsz(o, snap_slot(sn) != 0 ? (int32_t)*flinks-- : ftsz0);[m
[31m-	L->base = o+1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-[m
[31m-  /* Compute current stack top. */[m
[31m-  switch (bc_op(*pc)) {[m
[31m-  default:[m
[31m-    if (bc_op(*pc) < BC_FUNCF) {[m
[31m-      L->top = curr_topL(L);[m
[31m-      break;[m
[31m-    }[m
[31m-    /* fallthrough */[m
[31m-  case BC_CALLM: case BC_CALLMT: case BC_RETM: case BC_TSETM:[m
[31m-    L->top = frame + snap->nslots;[m
[31m-    break;[m
[31m-  }[m
[31m-  return pc;[m
[31m-}[m
[31m-[m
[31m-#undef emitir_raw[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.h[m
[1mdeleted file mode 100644[m
[1mindex 1d3379b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_snap.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-/*[m
[31m-** Snapshot handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_SNAP_H[m
[31m-#define _LJ_SNAP_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC void lj_snap_add(jit_State *J);[m
[31m-LJ_FUNC void lj_snap_purge(jit_State *J);[m
[31m-LJ_FUNC void lj_snap_shrink(jit_State *J);[m
[31m-LJ_FUNC IRIns *lj_snap_regspmap(GCtrace *T, SnapNo snapno, IRIns *ir);[m
[31m-LJ_FUNC void lj_snap_replay(jit_State *J, GCtrace *T);[m
[31m-LJ_FUNC const BCIns *lj_snap_restore(jit_State *J, void *exptr);[m
[31m-LJ_FUNC void lj_snap_grow_buf_(jit_State *J, MSize need);[m
[31m-LJ_FUNC void lj_snap_grow_map_(jit_State *J, MSize need);[m
[31m-[m
[31m-static LJ_AINLINE void lj_snap_grow_buf(jit_State *J, MSize need)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(need > J->sizesnap)) lj_snap_grow_buf_(J, need);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void lj_snap_grow_map(jit_State *J, MSize need)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(need > J->sizesnapmap)) lj_snap_grow_map_(J, need);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.c[m
[1mdeleted file mode 100644[m
[1mindex 66bf439..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.c[m
[1m+++ /dev/null[m
[36m@@ -1,300 +0,0 @@[m
[31m-/*[m
[31m-** State and stack handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_state_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_alloc.h"[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Stack sizes. */[m
[31m-#define LJ_STACK_MIN	LUA_MINSTACK	/* Min. stack size. */[m
[31m-#define LJ_STACK_MAX	LUAI_MAXSTACK	/* Max. stack size. */[m
[31m-#define LJ_STACK_START	(2*LJ_STACK_MIN)	/* Starting stack size. */[m
[31m-#define LJ_STACK_MAXEX	(LJ_STACK_MAX + 1 + LJ_STACK_EXTRA)[m
[31m-[m
[31m-/* Explanation of LJ_STACK_EXTRA:[m
[31m-**[m
[31m-** Calls to metamethods store their arguments beyond the current top[m
[31m-** without checking for the stack limit. This avoids stack resizes which[m
[31m-** would invalidate passed TValue pointers. The stack check is performed[m
[31m-** later by the function header. This can safely resize the stack or raise[m
[31m-** an error. Thus we need some extra slots beyond the current stack limit.[m
[31m-**[m
[31m-** Most metamethods need 4 slots above top (cont, mobj, arg1, arg2) plus[m
[31m-** one extra slot if mobj is not a function. Only lj_meta_tset needs 5[m
[31m-** slots above top, but then mobj is always a function. So we can get by[m
[31m-** with 5 extra slots.[m
[31m-** LJ_FR2: We need 2 more slots for the frame PC and the continuation PC.[m
[31m-*/[m
[31m-[m
[31m-/* Resize stack slots and adjust pointers in state. */[m
[31m-static void resizestack(lua_State *L, MSize n)[m
[31m-{[m
[31m-  TValue *st, *oldst = tvref(L->stack);[m
[31m-  ptrdiff_t delta;[m
[31m-  MSize oldsize = L->stacksize;[m
[31m-  MSize realsize = n + 1 + LJ_STACK_EXTRA;[m
[31m-  GCobj *up;[m
[31m-  lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);[m
[31m-  st = (TValue *)lj_mem_realloc(L, tvref(L->stack),[m
[31m-				(MSize)(oldsize*sizeof(TValue)),[m
[31m-				(MSize)(realsize*sizeof(TValue)));[m
[31m-  setmref(L->stack, st);[m
[31m-  delta = (char *)st - (char *)oldst;[m
[31m-  setmref(L->maxstack, st + n);[m
[31m-  while (oldsize < realsize)  /* Clear new slots. */[m
[31m-    setnilV(st + oldsize++);[m
[31m-  L->stacksize = realsize;[m
[31m-  if ((size_t)(mref(G(L)->jit_base, char) - (char *)oldst) < oldsize)[m
[31m-    setmref(G(L)->jit_base, mref(G(L)->jit_base, char) + delta);[m
[31m-  L->base = (TValue *)((char *)L->base + delta);[m
[31m-  L->top = (TValue *)((char *)L->top + delta);[m
[31m-  for (up = gcref(L->openupval); up != NULL; up = gcnext(up))[m
[31m-    setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));[m
[31m-}[m
[31m-[m
[31m-/* Relimit stack after error, in case the limit was overdrawn. */[m
[31m-void lj_state_relimitstack(lua_State *L)[m
[31m-{[m
[31m-  if (L->stacksize > LJ_STACK_MAXEX && L->top-tvref(L->stack) < LJ_STACK_MAX-1)[m
[31m-    resizestack(L, LJ_STACK_MAX);[m
[31m-}[m
[31m-[m
[31m-/* Try to shrink the stack (called from GC). */[m
[31m-void lj_state_shrinkstack(lua_State *L, MSize used)[m
[31m-{[m
[31m-  if (L->stacksize > LJ_STACK_MAXEX)[m
[31m-    return;  /* Avoid stack shrinking while handling stack overflow. */[m
[31m-  if (4*used < L->stacksize &&[m
[31m-      2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize &&[m
[31m-      /* Don't shrink stack of live trace. */[m
[31m-      (tvref(G(L)->jit_base) == NULL || obj2gco(L) != gcref(G(L)->cur_L)))[m
[31m-    resizestack(L, L->stacksize >> 1);[m
[31m-}[m
[31m-[m
[31m-/* Try to grow stack. */[m
[31m-void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need)[m
[31m-{[m
[31m-  MSize n;[m
[31m-  if (L->stacksize > LJ_STACK_MAXEX)  /* Overflow while handling overflow? */[m
[31m-    lj_err_throw(L, LUA_ERRERR);[m
[31m-  n = L->stacksize + need;[m
[31m-  if (n > LJ_STACK_MAX) {[m
[31m-    n += 2*LUA_MINSTACK;[m
[31m-  } else if (n < 2*L->stacksize) {[m
[31m-    n = 2*L->stacksize;[m
[31m-    if (n >= LJ_STACK_MAX)[m
[31m-      n = LJ_STACK_MAX;[m
[31m-  }[m
[31m-  resizestack(L, n);[m
[31m-  if (L->stacksize > LJ_STACK_MAXEX)[m
[31m-    lj_err_msg(L, LJ_ERR_STKOV);[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_state_growstack1(lua_State *L)[m
[31m-{[m
[31m-  lj_state_growstack(L, 1);[m
[31m-}[m
[31m-[m
[31m-/* Allocate basic stack for new state. */[m
[31m-static void stack_init(lua_State *L1, lua_State *L)[m
[31m-{[m
[31m-  TValue *stend, *st = lj_mem_newvec(L, LJ_STACK_START+LJ_STACK_EXTRA, TValue);[m
[31m-  setmref(L1->stack, st);[m
[31m-  L1->stacksize = LJ_STACK_START + LJ_STACK_EXTRA;[m
[31m-  stend = st + L1->stacksize;[m
[31m-  setmref(L1->maxstack, stend - LJ_STACK_EXTRA - 1);[m
[31m-  setthreadV(L1, st++, L1);  /* Needed for curr_funcisL() on empty stack. */[m
[31m-  if (LJ_FR2) setnilV(st++);[m
[31m-  L1->base = L1->top = st;[m
[31m-  while (st < stend)  /* Clear new slots. */[m
[31m-    setnilV(st++);[m
[31m-}[m
[31m-[m
[31m-/* -- State handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Open parts that may cause memory-allocation errors. */[m
[31m-static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  UNUSED(dummy);[m
[31m-  UNUSED(ud);[m
[31m-  stack_init(L, L);[m
[31m-  /* NOBARRIER: State initialization, all objects are white. */[m
[31m-  setgcref(L->env, obj2gco(lj_tab_new(L, 0, LJ_MIN_GLOBAL)));[m
[31m-  settabV(L, registry(L), lj_tab_new(L, 0, LJ_MIN_REGISTRY));[m
[31m-  lj_str_resize(L, LJ_MIN_STRTAB-1);[m
[31m-  lj_meta_init(L);[m
[31m-  lj_lex_init(L);[m
[31m-  fixstring(lj_err_str(L, LJ_ERR_ERRMEM));  /* Preallocate memory error msg. */[m
[31m-  g->gc.threshold = 4*g->gc.total;[m
[31m-  lj_trace_initstate(g);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static void close_state(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lj_func_closeuv(L, tvref(L->stack));[m
[31m-  lj_gc_freeall(g);[m
[31m-  lua_assert(gcref(g->gc.root) == obj2gco(L));[m
[31m-  lua_assert(g->strnum == 0);[m
[31m-  lj_trace_freestate(g);[m
[31m-#if LJ_HASFFI[m
[31m-  lj_ctype_freestate(g);[m
[31m-#endif[m
[31m-  lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);[m
[31m-  lj_buf_free(g, &g->tmpbuf);[m
[31m-  lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);[m
[31m-  lua_assert(g->gc.total == sizeof(GG_State));[m
[31m-#ifndef LUAJIT_USE_SYSMALLOC[m
[31m-  if (g->allocf == lj_alloc_f)[m
[31m-    lj_alloc_destroy(g->allocd);[m
[31m-  else[m
[31m-#endif[m
[31m-    g->allocf(g->allocd, G2GG(g), sizeof(GG_State), 0);[m
[31m-}[m
[31m-[m
[31m-#if LJ_64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC))[m
[31m-lua_State *lj_state_newstate(lua_Alloc f, void *ud)[m
[31m-#else[m
[31m-LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)[m
[31m-#endif[m
[31m-{[m
[31m-  GG_State *GG = (GG_State *)f(ud, NULL, 0, sizeof(GG_State));[m
[31m-  lua_State *L = &GG->L;[m
[31m-  global_State *g = &GG->g;[m
[31m-  if (GG == NULL || !checkptrGC(GG)) return NULL;[m
[31m-  memset(GG, 0, sizeof(GG_State));[m
[31m-  L->gct = ~LJ_TTHREAD;[m
[31m-  L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED;  /* Prevent free. */[m
[31m-  L->dummy_ffid = FF_C;[m
[31m-  setmref(L->glref, g);[m
[31m-  g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED;[m
[31m-  g->strempty.marked = LJ_GC_WHITE0;[m
[31m-  g->strempty.gct = ~LJ_TSTR;[m
[31m-  g->allocf = f;[m
[31m-  g->allocd = ud;[m
[31m-  setgcref(g->mainthref, obj2gco(L));[m
[31m-  setgcref(g->uvhead.prev, obj2gco(&g->uvhead));[m
[31m-  setgcref(g->uvhead.next, obj2gco(&g->uvhead));[m
[31m-  g->strmask = ~(MSize)0;[m
[31m-  setnilV(registry(L));[m
[31m-  setnilV(&g->nilnode.val);[m
[31m-  setnilV(&g->nilnode.key);[m
[31m-#if !LJ_GC64[m
[31m-  setmref(g->nilnode.freetop, &g->nilnode);[m
[31m-#endif[m
[31m-  lj_buf_init(NULL, &g->tmpbuf);[m
[31m-  g->gc.state = GCSpause;[m
[31m-  setgcref(g->gc.root, obj2gco(L));[m
[31m-  setmref(g->gc.sweep, &g->gc.root);[m
[31m-  g->gc.total = sizeof(GG_State);[m
[31m-  g->gc.pause = LUAI_GCPAUSE;[m
[31m-  g->gc.stepmul = LUAI_GCMUL;[m
[31m-  lj_dispatch_init((GG_State *)L);[m
[31m-  L->status = LUA_ERRERR+1;  /* Avoid touching the stack upon memory error. */[m
[31m-  if (lj_vm_cpcall(L, NULL, NULL, cpluaopen) != 0) {[m
[31m-    /* Memory allocation error: free partial state. */[m
[31m-    close_state(L);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  L->status = 0;[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[31m-static TValue *cpfinalize(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  UNUSED(dummy);[m
[31m-  UNUSED(ud);[m
[31m-  lj_gc_finalize_cdata(L);[m
[31m-  lj_gc_finalize_udata(L);[m
[31m-  /* Frame pop omitted. */[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_close(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  int i;[m
[31m-  L = mainthread(g);  /* Only the main thread can be closed. */[m
[31m-#if LJ_HASPROFILE[m
[31m-  luaJIT_profile_stop(L);[m
[31m-#endif[m
[31m-  setgcrefnull(g->cur_L);[m
[31m-  lj_func_closeuv(L, tvref(L->stack));[m
[31m-  lj_gc_separateudata(g, 1);  /* Separate udata which have GC metamethods. */[m
[31m-#if LJ_HASJIT[m
[31m-  G2J(g)->flags &= ~JIT_F_ON;[m
[31m-  G2J(g)->state = LJ_TRACE_IDLE;[m
[31m-  lj_dispatch_update(g);[m
[31m-#endif[m
[31m-  for (i = 0;;) {[m
[31m-    hook_enter(g);[m
[31m-    L->status = 0;[m
[31m-    L->base = L->top = tvref(L->stack) + 1 + LJ_FR2;[m
[31m-    L->cframe = NULL;[m
[31m-    if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) {[m
[31m-      if (++i >= 10) break;[m
[31m-      lj_gc_separateudata(g, 1);  /* Separate udata again. */[m
[31m-      if (gcref(g->gc.mmudata) == NULL)  /* Until nothing is left to do. */[m
[31m-	break;[m
[31m-    }[m
[31m-  }[m
[31m-  close_state(L);[m
[31m-}[m
[31m-[m
[31m-lua_State *lj_state_new(lua_State *L)[m
[31m-{[m
[31m-  lua_State *L1 = lj_mem_newobj(L, lua_State);[m
[31m-  L1->gct = ~LJ_TTHREAD;[m
[31m-  L1->dummy_ffid = FF_C;[m
[31m-  L1->status = 0;[m
[31m-  L1->stacksize = 0;[m
[31m-  setmref(L1->stack, NULL);[m
[31m-  L1->cframe = NULL;[m
[31m-  /* NOBARRIER: The lua_State is new (marked white). */[m
[31m-  setgcrefnull(L1->openupval);[m
[31m-  setmrefr(L1->glref, L->glref);[m
[31m-  setgcrefr(L1->env, L->env);[m
[31m-  stack_init(L1, L);  /* init stack */[m
[31m-  lua_assert(iswhite(obj2gco(L1)));[m
[31m-  return L1;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L)[m
[31m-{[m
[31m-  lua_assert(L != mainthread(g));[m
[31m-  if (obj2gco(L) == gcref(g->cur_L))[m
[31m-    setgcrefnull(g->cur_L);[m
[31m-  lj_func_closeuv(L, tvref(L->stack));[m
[31m-  lua_assert(gcref(L->openupval) == NULL);[m
[31m-  lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);[m
[31m-  lj_mem_freet(g, L);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.h[m
[1mdeleted file mode 100644[m
[1mindex e128d32..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_state.h[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-/*[m
[31m-** State and stack handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_STATE_H[m
[31m-#define _LJ_STATE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#define incr_top(L) \[m
[31m-  (++L->top >= tvref(L->maxstack) && (lj_state_growstack1(L), 0))[m
[31m-[m
[31m-#define savestack(L, p)		((char *)(p) - mref(L->stack, char))[m
[31m-#define restorestack(L, n)	((TValue *)(mref(L->stack, char) + (n)))[m
[31m-[m
[31m-LJ_FUNC void lj_state_relimitstack(lua_State *L);[m
[31m-LJ_FUNC void lj_state_shrinkstack(lua_State *L, MSize used);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_state_growstack1(lua_State *L);[m
[31m-[m
[31m-static LJ_AINLINE void lj_state_checkstack(lua_State *L, MSize need)[m
[31m-{[m
[31m-  if ((mref(L->maxstack, char) - (char *)L->top) <=[m
[31m-      (ptrdiff_t)need*(ptrdiff_t)sizeof(TValue))[m
[31m-    lj_state_growstack(L, need);[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC lua_State *lj_state_new(lua_State *L);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L);[m
[31m-#if LJ_64[m
[31m-LJ_FUNC lua_State *lj_state_newstate(lua_Alloc f, void *ud);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.c[m
[1mdeleted file mode 100644[m
[1mindex 79a7a70..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.c[m
[1m+++ /dev/null[m
[36m@@ -1,211 +0,0 @@[m
[31m-/*[m
[31m-** String handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_str_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_char.h"[m
[31m-[m
[31m-/* -- String helpers ------------------------------------------------------ */[m
[31m-[m
[31m-/* Ordered compare of strings. Assumes string data is 4-byte aligned. */[m
[31m-int32_t LJ_FASTCALL lj_str_cmp(GCstr *a, GCstr *b)[m
[31m-{[m
[31m-  MSize i, n = a->len > b->len ? b->len : a->len;[m
[31m-#ifdef LUAJIT_USE_VALGRIND[m
[31m-  for (i = 0; i < n; i++) {[m
[31m-    uint8_t va = *(const uint8_t *)(strdata(a)+i);[m
[31m-    uint8_t vb = *(const uint8_t *)(strdata(b)+i);[m
[31m-    if (va != vb) {[m
[31m-        return va < vb ? -1 : 1;[m
[31m-    }[m
[31m-  }[m
[31m-#else[m
[31m-  for (i = 0; i < n; i += 4) {[m
[31m-    /* Note: innocuous access up to end of string + 3. */[m
[31m-    uint32_t va = *(const uint32_t *)(strdata(a)+i);[m
[31m-    uint32_t vb = *(const uint32_t *)(strdata(b)+i);[m
[31m-    if (va != vb) {[m
[31m-#if LJ_LE[m
[31m-      va = lj_bswap(va); vb = lj_bswap(vb);[m
[31m-#endif[m
[31m-      i -= n;[m
[31m-      if ((int32_t)i >= -3) {[m
[31m-	va >>= 32+(i<<3); vb >>= 32+(i<<3);[m
[31m-	if (va == vb) break;[m
[31m-      }[m
[31m-      return va < vb ? -1 : 1;[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  return (int32_t)(a->len - b->len);[m
[31m-}[m
[31m-[m
[31m-/* Fast string data comparison. Caveat: unaligned access to 1st string! */[m
[31m-static LJ_AINLINE int str_fastcmp(const char *a, const char *b, MSize len)[m
[31m-{[m
[31m-  MSize i = 0;[m
[31m-  lua_assert(len > 0);[m
[31m-  lua_assert((((uintptr_t)a+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4);[m
[31m-  do {  /* Note: innocuous access up to end of string + 3. */[m
[31m-    uint32_t v = lj_getu32(a+i) ^ *(const uint32_t *)(b+i);[m
[31m-    if (v) {[m
[31m-      i -= len;[m
[31m-#if LJ_LE[m
[31m-      return (int32_t)i >= -3 ? (v << (32+(i<<3))) : 1;[m
[31m-#else[m
[31m-      return (int32_t)i >= -3 ? (v >> (32+(i<<3))) : 1;[m
[31m-#endif[m
[31m-    }[m
[31m-    i += 4;[m
[31m-  } while (i < len);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Find fixed string p inside string s. */[m
[31m-const char *lj_str_find(const char *s, const char *p, MSize slen, MSize plen)[m
[31m-{[m
[31m-  if (plen <= slen) {[m
[31m-    if (plen == 0) {[m
[31m-      return s;[m
[31m-    } else {[m
[31m-      int c = *(const uint8_t *)p++;[m
[31m-      plen--; slen -= plen;[m
[31m-      while (slen) {[m
[31m-	const char *q = (const char *)memchr(s, c, slen);[m
[31m-	if (!q) break;[m
[31m-	if (memcmp(q+1, p, plen) == 0) return q;[m
[31m-	q++; slen -= (MSize)(q-s); s = q;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a string has a pattern matching character. */[m
[31m-int lj_str_haspattern(GCstr *s)[m
[31m-{[m
[31m-  const char *p = strdata(s), *q = p + s->len;[m
[31m-  while (p < q) {[m
[31m-    int c = *(const uint8_t *)p++;[m
[31m-    if (lj_char_ispunct(c) && strchr("^$*+?.([%-", c))[m
[31m-      return 1;  /* Found a pattern matching char. */[m
[31m-  }[m
[31m-  return 0;  /* No pattern matching chars found. */[m
[31m-}[m
[31m-[m
[31m-/* -- String interning ---------------------------------------------------- */[m
[31m-[m
[31m-/* Resize the string hash table (grow and shrink). */[m
[31m-void lj_str_resize(lua_State *L, MSize newmask)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCRef *newhash;[m
[31m-  MSize i;[m
[31m-  if (g->gc.state == GCSsweepstring || newmask >= LJ_MAX_STRTAB-1)[m
[31m-    return;  /* No resizing during GC traversal or if already too big. */[m
[31m-  newhash = lj_mem_newvec(L, newmask+1, GCRef);[m
[31m-  memset(newhash, 0, (newmask+1)*sizeof(GCRef));[m
[31m-  for (i = g->strmask; i != ~(MSize)0; i--) {  /* Rehash old table. */[m
[31m-    GCobj *p = gcref(g->strhash[i]);[m
[31m-    while (p) {  /* Follow each hash chain and reinsert all strings. */[m
[31m-      MSize h = gco2str(p)->hash & newmask;[m
[31m-      GCobj *next = gcnext(p);[m
[31m-      /* NOBARRIER: The string table is a GC root. */[m
[31m-      setgcrefr(p->gch.nextgc, newhash[h]);[m
[31m-      setgcref(newhash[h], p);[m
[31m-      p = next;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);[m
[31m-  g->strmask = newmask;[m
[31m-  g->strhash = newhash;[m
[31m-}[m
[31m-[m
[31m-/* Intern a string and return string object. */[m
[31m-GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)[m
[31m-{[m
[31m-  global_State *g;[m
[31m-  GCstr *s;[m
[31m-  GCobj *o;[m
[31m-  MSize len = (MSize)lenx;[m
[31m-  MSize a, b, h = len;[m
[31m-  if (lenx >= LJ_MAX_STR)[m
[31m-    lj_err_msg(L, LJ_ERR_STROV);[m
[31m-  g = G(L);[m
[31m-  /* Compute string hash. Constants taken from lookup3 hash by Bob Jenkins. */[m
[31m-  if (len >= 4) {  /* Caveat: unaligned access! */[m
[31m-    a = lj_getu32(str);[m
[31m-    h ^= lj_getu32(str+len-4);[m
[31m-    b = lj_getu32(str+(len>>1)-2);[m
[31m-    h ^= b; h -= lj_rol(b, 14);[m
[31m-    b += lj_getu32(str+(len>>2)-1);[m
[31m-  } else if (len > 0) {[m
[31m-    a = *(const uint8_t *)str;[m
[31m-    h ^= *(const uint8_t *)(str+len-1);[m
[31m-    b = *(const uint8_t *)(str+(len>>1));[m
[31m-    h ^= b; h -= lj_rol(b, 14);[m
[31m-  } else {[m
[31m-    return &g->strempty;[m
[31m-  }[m
[31m-  a ^= h; a -= lj_rol(h, 11);[m
[31m-  b ^= a; b -= lj_rol(a, 25);[m
[31m-  h ^= b; h -= lj_rol(b, 16);[m
[31m-  /* Check if the string has already been interned. */[m
[31m-  o = gcref(g->strhash[h & g->strmask]);[m
[31m-#ifndef LUAJIT_USE_VALGRIND[m
[31m-  if (LJ_LIKELY((((uintptr_t)str+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) {[m
[31m-    while (o != NULL) {[m
[31m-      GCstr *sx = gco2str(o);[m
[31m-      if (sx->len == len && str_fastcmp(str, strdata(sx), len) == 0) {[m
[31m-	/* Resurrect if dead. Can only happen with fixstring() (keywords). */[m
[31m-	if (isdead(g, o)) flipwhite(o);[m
[31m-	return sx;  /* Return existing string. */[m
[31m-      }[m
[31m-      o = gcnext(o);[m
[31m-    }[m
[31m-  } else {  /* Slow path: end of string is too close to a page boundary. */[m
[31m-#endif[m
[31m-    while (o != NULL) {[m
[31m-      GCstr *sx = gco2str(o);[m
[31m-      if (sx->len == len && memcmp(str, strdata(sx), len) == 0) {[m
[31m-	/* Resurrect if dead. Can only happen with fixstring() (keywords). */[m
[31m-	if (isdead(g, o)) flipwhite(o);[m
[31m-	return sx;  /* Return existing string. */[m
[31m-      }[m
[31m-      o = gcnext(o);[m
[31m-    }[m
[31m-#ifndef LUAJIT_USE_VALGRIND[m
[31m-  }[m
[31m-#endif[m
[31m-  /* Nope, create a new string. */[m
[31m-  s = lj_mem_newt(L, sizeof(GCstr)+len+1, GCstr);[m
[31m-  newwhite(g, s);[m
[31m-  s->gct = ~LJ_TSTR;[m
[31m-  s->len = len;[m
[31m-  s->hash = h;[m
[31m-  s->reserved = 0;[m
[31m-  memcpy(strdatawr(s), str, len);[m
[31m-  strdatawr(s)[len] = '\0';  /* Zero-terminate string. */[m
[31m-  /* Add it to string hash table. */[m
[31m-  h &= g->strmask;[m
[31m-  s->nextgc = g->strhash[h];[m
[31m-  /* NOBARRIER: The string table is a GC root. */[m
[31m-  setgcref(g->strhash[h], obj2gco(s));[m
[31m-  if (g->strnum++ > g->strmask)  /* Allow a 100% load factor. */[m
[31m-    lj_str_resize(L, (g->strmask<<1)+1);  /* Grow string table. */[m
[31m-  return s;  /* Return newly interned string. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_str_free(global_State *g, GCstr *s)[m
[31m-{[m
[31m-  g->strnum--;[m
[31m-  lj_mem_free(g, s, sizestring(s));[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.h[m
[1mdeleted file mode 100644[m
[1mindex bb306c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_str.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-/*[m
[31m-** String handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_STR_H[m
[31m-#define _LJ_STR_H[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* String helpers. */[m
[31m-LJ_FUNC int32_t LJ_FASTCALL lj_str_cmp(GCstr *a, GCstr *b);[m
[31m-LJ_FUNC const char *lj_str_find(const char *s, const char *f,[m
[31m-				MSize slen, MSize flen);[m
[31m-LJ_FUNC int lj_str_haspattern(GCstr *s);[m
[31m-[m
[31m-/* String interning. */[m
[31m-LJ_FUNC void lj_str_resize(lua_State *L, MSize newmask);[m
[31m-LJ_FUNCA GCstr *lj_str_new(lua_State *L, const char *str, size_t len);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_str_free(global_State *g, GCstr *s);[m
[31m-[m
[31m-#define lj_str_newz(L, s)	(lj_str_new(L, s, strlen(s)))[m
[31m-#define lj_str_newlit(L, s)	(lj_str_new(L, "" s, sizeof(s)-1))[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.c[m
[1mdeleted file mode 100644[m
[1mindex 04c71e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.c[m
[1m+++ /dev/null[m
[36m@@ -1,472 +0,0 @@[m
[31m-/*[m
[31m-** String formatting.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lj_strfmt_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- Format parser ------------------------------------------------------- */[m
[31m-[m
[31m-static const uint8_t strfmt_map[('x'-'A')+1] = {[m
[31m-  STRFMT_A,0,0,0,STRFMT_E,STRFMT_F,STRFMT_G,0,0,0,0,0,0,[m
[31m-  0,0,0,0,0,0,0,0,0,0,STRFMT_X,0,0,[m
[31m-  0,0,0,0,0,0,[m
[31m-  STRFMT_A,0,STRFMT_C,STRFMT_D,STRFMT_E,STRFMT_F,STRFMT_G,0,STRFMT_I,0,0,0,0,[m
[31m-  0,STRFMT_O,STRFMT_P,STRFMT_Q,0,STRFMT_S,0,STRFMT_U,0,0,STRFMT_X[m
[31m-};[m
[31m-[m
[31m-SFormat LJ_FASTCALL lj_strfmt_parse(FormatState *fs)[m
[31m-{[m
[31m-  const uint8_t *p = fs->p, *e = fs->e;[m
[31m-  fs->str = (const char *)p;[m
[31m-  for (; p < e; p++) {[m
[31m-    if (*p == '%') {  /* Escape char? */[m
[31m-      if (p[1] == '%') {  /* '%%'? */[m
[31m-	fs->p = ++p+1;[m
[31m-	goto retlit;[m
[31m-      } else {[m
[31m-	SFormat sf = 0;[m
[31m-	uint32_t c;[m
[31m-	if (p != (const uint8_t *)fs->str)[m
[31m-	  break;[m
[31m-	for (p++; (uint32_t)*p - ' ' <= (uint32_t)('0' - ' '); p++) {[m
[31m-	  /* Parse flags. */[m
[31m-	  if (*p == '-') sf |= STRFMT_F_LEFT;[m
[31m-	  else if (*p == '+') sf |= STRFMT_F_PLUS;[m
[31m-	  else if (*p == '0') sf |= STRFMT_F_ZERO;[m
[31m-	  else if (*p == ' ') sf |= STRFMT_F_SPACE;[m
[31m-	  else if (*p == '#') sf |= STRFMT_F_ALT;[m
[31m-	  else break;[m
[31m-	}[m
[31m-	if ((uint32_t)*p - '0' < 10) {  /* Parse width. */[m
[31m-	  uint32_t width = (uint32_t)*p++ - '0';[m
[31m-	  if ((uint32_t)*p - '0' < 10)[m
[31m-	    width = (uint32_t)*p++ - '0' + width*10;[m
[31m-	  sf |= (width << STRFMT_SH_WIDTH);[m
[31m-	}[m
[31m-	if (*p == '.') {  /* Parse precision. */[m
[31m-	  uint32_t prec = 0;[m
[31m-	  p++;[m
[31m-	  if ((uint32_t)*p - '0' < 10) {[m
[31m-	    prec = (uint32_t)*p++ - '0';[m
[31m-	    if ((uint32_t)*p - '0' < 10)[m
[31m-	      prec = (uint32_t)*p++ - '0' + prec*10;[m
[31m-	  }[m
[31m-	  sf |= ((prec+1) << STRFMT_SH_PREC);[m
[31m-	}[m
[31m-	/* Parse conversion. */[m
[31m-	c = (uint32_t)*p - 'A';[m
[31m-	if (LJ_LIKELY(c <= (uint32_t)('x' - 'A'))) {[m
[31m-	  uint32_t sx = strfmt_map[c];[m
[31m-	  if (sx) {[m
[31m-	    fs->p = p+1;[m
[31m-	    return (sf | sx | ((c & 0x20) ? 0 : STRFMT_F_UPPER));[m
[31m-	  }[m
[31m-	}[m
[31m-	/* Return error location. */[m
[31m-	if (*p >= 32) p++;[m
[31m-	fs->len = (MSize)(p - (const uint8_t *)fs->str);[m
[31m-	fs->p = fs->e;[m
[31m-	return STRFMT_ERR;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  fs->p = p;[m
[31m-retlit:[m
[31m-  fs->len = (MSize)(p - (const uint8_t *)fs->str);[m
[31m-  return fs->len ? STRFMT_LIT : STRFMT_EOF;[m
[31m-}[m
[31m-[m
[31m-/* -- Raw conversions ----------------------------------------------------- */[m
[31m-[m
[31m-#define WINT_R(x, sh, sc) \[m
[31m-  { uint32_t d = (x*(((1<<sh)+sc-1)/sc))>>sh; x -= d*sc; *p++ = (char)('0'+d); }[m
[31m-[m
[31m-/* Write integer to buffer. */[m
[31m-char * LJ_FASTCALL lj_strfmt_wint(char *p, int32_t k)[m
[31m-{[m
[31m-  uint32_t u = (uint32_t)k;[m
[31m-  if (k < 0) { u = (uint32_t)-k; *p++ = '-'; }[m
[31m-  if (u < 10000) {[m
[31m-    if (u < 10) goto dig1;[m
[31m-    if (u < 100) goto dig2;[m
[31m-    if (u < 1000) goto dig3;[m
[31m-  } else {[m
[31m-    uint32_t v = u / 10000; u -= v * 10000;[m
[31m-    if (v < 10000) {[m
[31m-      if (v < 10) goto dig5;[m
[31m-      if (v < 100) goto dig6;[m
[31m-      if (v < 1000) goto dig7;[m
[31m-    } else {[m
[31m-      uint32_t w = v / 10000; v -= w * 10000;[m
[31m-      if (w >= 10) WINT_R(w, 10, 10)[m
[31m-      *p++ = (char)('0'+w);[m
[31m-    }[m
[31m-    WINT_R(v, 23, 1000)[m
[31m-    dig7: WINT_R(v, 12, 100)[m
[31m-    dig6: WINT_R(v, 10, 10)[m
[31m-    dig5: *p++ = (char)('0'+v);[m
[31m-  }[m
[31m-  WINT_R(u, 23, 1000)[m
[31m-  dig3: WINT_R(u, 12, 100)[m
[31m-  dig2: WINT_R(u, 10, 10)[m
[31m-  dig1: *p++ = (char)('0'+u);[m
[31m-  return p;[m
[31m-}[m
[31m-#undef WINT_R[m
[31m-[m
[31m-/* Write pointer to buffer. */[m
[31m-char * LJ_FASTCALL lj_strfmt_wptr(char *p, const void *v)[m
[31m-{[m
[31m-  ptrdiff_t x = (ptrdiff_t)v;[m
[31m-  MSize i, n = STRFMT_MAXBUF_PTR;[m
[31m-  if (x == 0) {[m
[31m-    *p++ = 'N'; *p++ = 'U'; *p++ = 'L'; *p++ = 'L';[m
[31m-    return p;[m
[31m-  }[m
[31m-#if LJ_64[m
[31m-  /* Shorten output for 64 bit pointers. */[m
[31m-  n = 2+2*4+((x >> 32) ? 2+2*(lj_fls((uint32_t)(x >> 32))>>3) : 0);[m
[31m-#endif[m
[31m-  p[0] = '0';[m
[31m-  p[1] = 'x';[m
[31m-  for (i = n-1; i >= 2; i--, x >>= 4)[m
[31m-    p[i] = "0123456789abcdef"[(x & 15)];[m
[31m-  return p+n;[m
[31m-}[m
[31m-[m
[31m-/* Write ULEB128 to buffer. */[m
[31m-char * LJ_FASTCALL lj_strfmt_wuleb128(char *p, uint32_t v)[m
[31m-{[m
[31m-  for (; v >= 0x80; v >>= 7)[m
[31m-    *p++ = (char)((v & 0x7f) | 0x80);[m
[31m-  *p++ = (char)v;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Return string or write number to tmp buffer and return pointer to start. */[m
[31m-const char *lj_strfmt_wstrnum(lua_State *L, cTValue *o, MSize *lenp)[m
[31m-{[m
[31m-  SBuf *sb;[m
[31m-  if (tvisstr(o)) {[m
[31m-    *lenp = strV(o)->len;[m
[31m-    return strVdata(o);[m
[31m-  } else if (tvisint(o)) {[m
[31m-    sb = lj_strfmt_putint(lj_buf_tmp_(L), intV(o));[m
[31m-  } else if (tvisnum(o)) {[m
[31m-    sb = lj_strfmt_putfnum(lj_buf_tmp_(L), STRFMT_G14, o->n);[m
[31m-  } else {[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  *lenp = sbuflen(sb);[m
[31m-  return sbufB(sb);[m
[31m-}[m
[31m-[m
[31m-/* -- Unformatted conversions to buffer ----------------------------------- */[m
[31m-[m
[31m-/* Add integer to buffer. */[m
[31m-SBuf * LJ_FASTCALL lj_strfmt_putint(SBuf *sb, int32_t k)[m
[31m-{[m
[31m-  setsbufP(sb, lj_strfmt_wint(lj_buf_more(sb, STRFMT_MAXBUF_INT), k));[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Add number to buffer. */[m
[31m-SBuf * LJ_FASTCALL lj_strfmt_putnum(SBuf *sb, cTValue *o)[m
[31m-{[m
[31m-  return lj_strfmt_putfnum(sb, STRFMT_G14, o->n);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_strfmt_putptr(SBuf *sb, const void *v)[m
[31m-{[m
[31m-  setsbufP(sb, lj_strfmt_wptr(lj_buf_more(sb, STRFMT_MAXBUF_PTR), v));[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* Add quoted string to buffer. */[m
[31m-SBuf * LJ_FASTCALL lj_strfmt_putquoted(SBuf *sb, GCstr *str)[m
[31m-{[m
[31m-  const char *s = strdata(str);[m
[31m-  MSize len = str->len;[m
[31m-  lj_buf_putb(sb, '"');[m
[31m-  while (len--) {[m
[31m-    uint32_t c = (uint32_t)(uint8_t)*s++;[m
[31m-    char *p = lj_buf_more(sb, 4);[m
[31m-    if (c == '"' || c == '\\' || c == '\n') {[m
[31m-      *p++ = '\\';[m
[31m-    } else if (lj_char_iscntrl(c)) {  /* This can only be 0-31 or 127. */[m
[31m-      uint32_t d;[m
[31m-      *p++ = '\\';[m
[31m-      if (c >= 100 || lj_char_isdigit((uint8_t)*s)) {[m
[31m-	*p++ = (char)('0'+(c >= 100)); if (c >= 100) c -= 100;[m
[31m-	goto tens;[m
[31m-      } else if (c >= 10) {[m
[31m-      tens:[m
[31m-	d = (c * 205) >> 11; c -= d * 10; *p++ = (char)('0'+d);[m
[31m-      }[m
[31m-      c += '0';[m
[31m-    }[m
[31m-    *p++ = (char)c;[m
[31m-    setsbufP(sb, p);[m
[31m-  }[m
[31m-  lj_buf_putb(sb, '"');[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* -- Formatted conversions to buffer ------------------------------------- */[m
[31m-[m
[31m-/* Add formatted char to buffer. */[m
[31m-SBuf *lj_strfmt_putfchar(SBuf *sb, SFormat sf, int32_t c)[m
[31m-{[m
[31m-  MSize width = STRFMT_WIDTH(sf);[m
[31m-  char *p = lj_buf_more(sb, width > 1 ? width : 1);[m
[31m-  if ((sf & STRFMT_F_LEFT)) *p++ = (char)c;[m
[31m-  while (width-- > 1) *p++ = ' ';[m
[31m-  if (!(sf & STRFMT_F_LEFT)) *p++ = (char)c;[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* Add formatted string to buffer. */[m
[31m-SBuf *lj_strfmt_putfstr(SBuf *sb, SFormat sf, GCstr *str)[m
[31m-{[m
[31m-  MSize len = str->len <= STRFMT_PREC(sf) ? str->len : STRFMT_PREC(sf);[m
[31m-  MSize width = STRFMT_WIDTH(sf);[m
[31m-  char *p = lj_buf_more(sb, width > len ? width : len);[m
[31m-  if ((sf & STRFMT_F_LEFT)) p = lj_buf_wmem(p, strdata(str), len);[m
[31m-  while (width-- > len) *p++ = ' ';[m
[31m-  if (!(sf & STRFMT_F_LEFT)) p = lj_buf_wmem(p, strdata(str), len);[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* Add formatted signed/unsigned integer to buffer. */[m
[31m-SBuf *lj_strfmt_putfxint(SBuf *sb, SFormat sf, uint64_t k)[m
[31m-{[m
[31m-  char buf[STRFMT_MAXBUF_XINT], *q = buf + sizeof(buf), *p;[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  char *ps;[m
[31m-#endif[m
[31m-  MSize prefix = 0, len, prec, pprec, width, need;[m
[31m-[m
[31m-  /* Figure out signed prefixes. */[m
[31m-  if (STRFMT_TYPE(sf) == STRFMT_INT) {[m
[31m-    if ((int64_t)k < 0) {[m
[31m-      k = (uint64_t)-(int64_t)k;[m
[31m-      prefix = 256 + '-';[m
[31m-    } else if ((sf & STRFMT_F_PLUS)) {[m
[31m-      prefix = 256 + '+';[m
[31m-    } else if ((sf & STRFMT_F_SPACE)) {[m
[31m-      prefix = 256 + ' ';[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Convert number and store to fixed-size buffer in reverse order. */[m
[31m-  prec = STRFMT_PREC(sf);[m
[31m-  if ((int32_t)prec >= 0) sf &= ~STRFMT_F_ZERO;[m
[31m-  if (k == 0) {  /* Special-case zero argument. */[m
[31m-    if (prec != 0 ||[m
[31m-	(sf & (STRFMT_T_OCT|STRFMT_F_ALT)) == (STRFMT_T_OCT|STRFMT_F_ALT))[m
[31m-      *--q = '0';[m
[31m-  } else if (!(sf & (STRFMT_T_HEX|STRFMT_T_OCT))) {  /* Decimal. */[m
[31m-    uint32_t k2;[m
[31m-    while ((k >> 32)) { *--q = (char)('0' + k % 10); k /= 10; }[m
[31m-    k2 = (uint32_t)k;[m
[31m-    do { *--q = (char)('0' + k2 % 10); k2 /= 10; } while (k2);[m
[31m-  } else if ((sf & STRFMT_T_HEX)) {  /* Hex. */[m
[31m-    const char *hexdig = (sf & STRFMT_F_UPPER) ? "0123456789ABCDEF" :[m
[31m-						 "0123456789abcdef";[m
[31m-    do { *--q = hexdig[(k & 15)]; k >>= 4; } while (k);[m
[31m-    if ((sf & STRFMT_F_ALT)) prefix = 512 + ((sf & STRFMT_F_UPPER) ? 'X' : 'x');[m
[31m-  } else {  /* Octal. */[m
[31m-    do { *--q = (char)('0' + (uint32_t)(k & 7)); k >>= 3; } while (k);[m
[31m-    if ((sf & STRFMT_F_ALT)) *--q = '0';[m
[31m-  }[m
[31m-[m
[31m-  /* Calculate sizes. */[m
[31m-  len = (MSize)(buf + sizeof(buf) - q);[m
[31m-  if ((int32_t)len >= (int32_t)prec) prec = len;[m
[31m-  width = STRFMT_WIDTH(sf);[m
[31m-  pprec = prec + (prefix >> 8);[m
[31m-  need = width > pprec ? width : pprec;[m
[31m-  p = lj_buf_more(sb, need);[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  ps = p;[m
[31m-#endif[m
[31m-[m
[31m-  /* Format number with leading/trailing whitespace and zeros. */[m
[31m-  if ((sf & (STRFMT_F_LEFT|STRFMT_F_ZERO)) == 0)[m
[31m-    while (width-- > pprec) *p++ = ' ';[m
[31m-  if (prefix) {[m
[31m-    if ((char)prefix >= 'X') *p++ = '0';[m
[31m-    *p++ = (char)prefix;[m
[31m-  }[m
[31m-  if ((sf & (STRFMT_F_LEFT|STRFMT_F_ZERO)) == STRFMT_F_ZERO)[m
[31m-    while (width-- > pprec) *p++ = '0';[m
[31m-  while (prec-- > len) *p++ = '0';[m
[31m-  while (q < buf + sizeof(buf)) *p++ = *q++;  /* Add number itself. */[m
[31m-  if ((sf & STRFMT_F_LEFT))[m
[31m-    while (width-- > pprec) *p++ = ' ';[m
[31m-[m
[31m-  lua_assert(need == (MSize)(p - ps));[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* Add number formatted as signed integer to buffer. */[m
[31m-SBuf *lj_strfmt_putfnum_int(SBuf *sb, SFormat sf, lua_Number n)[m
[31m-{[m
[31m-  int64_t k = (int64_t)n;[m
[31m-  if (checki32(k) && sf == STRFMT_INT)[m
[31m-    return lj_strfmt_putint(sb, (int32_t)k);  /* Shortcut for plain %d. */[m
[31m-  else[m
[31m-    return lj_strfmt_putfxint(sb, sf, (uint64_t)k);[m
[31m-}[m
[31m-[m
[31m-/* Add number formatted as unsigned integer to buffer. */[m
[31m-SBuf *lj_strfmt_putfnum_uint(SBuf *sb, SFormat sf, lua_Number n)[m
[31m-{[m
[31m-  int64_t k;[m
[31m-  if (n >= 9223372036854775808.0)[m
[31m-    k = (int64_t)(n - 18446744073709551616.0);[m
[31m-  else[m
[31m-    k = (int64_t)n;[m
[31m-  return lj_strfmt_putfxint(sb, sf, (uint64_t)k);[m
[31m-}[m
[31m-[m
[31m-/* -- Conversions to strings ---------------------------------------------- */[m
[31m-[m
[31m-/* Convert integer to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_int(lua_State *L, int32_t k)[m
[31m-{[m
[31m-  char buf[STRFMT_MAXBUF_INT];[m
[31m-  MSize len = (MSize)(lj_strfmt_wint(buf, k) - buf);[m
[31m-  return lj_str_new(L, buf, len);[m
[31m-}[m
[31m-[m
[31m-/* Convert integer or number to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_number(lua_State *L, cTValue *o)[m
[31m-{[m
[31m-  return tvisint(o) ? lj_strfmt_int(L, intV(o)) : lj_strfmt_num(L, o);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Convert char value to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_char(lua_State *L, int c)[m
[31m-{[m
[31m-  char buf[1];[m
[31m-  buf[0] = c;[m
[31m-  return lj_str_new(L, buf, 1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Raw conversion of object to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_obj(lua_State *L, cTValue *o)[m
[31m-{[m
[31m-  if (tvisstr(o)) {[m
[31m-    return strV(o);[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    return lj_strfmt_number(L, o);[m
[31m-  } else if (tvisnil(o)) {[m
[31m-    return lj_str_newlit(L, "nil");[m
[31m-  } else if (tvisfalse(o)) {[m
[31m-    return lj_str_newlit(L, "false");[m
[31m-  } else if (tvistrue(o)) {[m
[31m-    return lj_str_newlit(L, "true");[m
[31m-  } else {[m
[31m-    char buf[8+2+2+16], *p = buf;[m
[31m-    p = lj_buf_wmem(p, lj_typename(o), (MSize)strlen(lj_typename(o)));[m
[31m-    *p++ = ':'; *p++ = ' ';[m
[31m-    if (tvisfunc(o) && isffunc(funcV(o))) {[m
[31m-      p = lj_buf_wmem(p, "builtin#", 8);[m
[31m-      p = lj_strfmt_wint(p, funcV(o)->c.ffid);[m
[31m-    } else {[m
[31m-      p = lj_strfmt_wptr(p, lj_obj_ptr(o));[m
[31m-    }[m
[31m-    return lj_str_new(L, buf, (size_t)(p - buf));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Internal string formatting ------------------------------------------ */[m
[31m-[m
[31m-/*[m
[31m-** These functions are only used for lua_pushfstring(), lua_pushvfstring()[m
[31m-** and for internal string formatting (e.g. error messages). Caveat: unlike[m
[31m-** string.format(), only a limited subset of formats and flags are supported![m
[31m-**[m
[31m-** LuaJIT has support for a couple more formats than Lua 5.1/5.2:[m
[31m-** - %d %u %o %x with full formatting, 32 bit integers only.[m
[31m-** - %f and other FP formats are really %.14g.[m
[31m-** - %s %c %p without formatting.[m
[31m-*/[m
[31m-[m
[31m-/* Push formatted message as a string object to Lua stack. va_list variant. */[m
[31m-const char *lj_strfmt_pushvf(lua_State *L, const char *fmt, va_list argp)[m
[31m-{[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  FormatState fs;[m
[31m-  SFormat sf;[m
[31m-  GCstr *str;[m
[31m-  lj_strfmt_init(&fs, fmt, (MSize)strlen(fmt));[m
[31m-  while ((sf = lj_strfmt_parse(&fs)) != STRFMT_EOF) {[m
[31m-    switch (STRFMT_TYPE(sf)) {[m
[31m-    case STRFMT_LIT:[m
[31m-      lj_buf_putmem(sb, fs.str, fs.len);[m
[31m-      break;[m
[31m-    case STRFMT_INT:[m
[31m-      lj_strfmt_putfxint(sb, sf, va_arg(argp, int32_t));[m
[31m-      break;[m
[31m-    case STRFMT_UINT:[m
[31m-      lj_strfmt_putfxint(sb, sf, va_arg(argp, uint32_t));[m
[31m-      break;[m
[31m-    case STRFMT_NUM:[m
[31m-      lj_strfmt_putfnum(sb, STRFMT_G14, va_arg(argp, lua_Number));[m
[31m-      break;[m
[31m-    case STRFMT_STR: {[m
[31m-      const char *s = va_arg(argp, char *);[m
[31m-      if (s == NULL) s = "(null)";[m
[31m-      lj_buf_putmem(sb, s, (MSize)strlen(s));[m
[31m-      break;[m
[31m-      }[m
[31m-    case STRFMT_CHAR:[m
[31m-      lj_buf_putb(sb, va_arg(argp, int));[m
[31m-      break;[m
[31m-    case STRFMT_PTR:[m
[31m-      lj_strfmt_putptr(sb, va_arg(argp, void *));[m
[31m-      break;[m
[31m-    case STRFMT_ERR:[m
[31m-    default:[m
[31m-      lj_buf_putb(sb, '?');[m
[31m-      lua_assert(0);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  str = lj_buf_str(L, sb);[m
[31m-  setstrV(L, L->top, str);[m
[31m-  incr_top(L);[m
[31m-  return strdata(str);[m
[31m-}[m
[31m-[m
[31m-/* Push formatted message as a string object to Lua stack. Vararg variant. */[m
[31m-const char *lj_strfmt_pushf(lua_State *L, const char *fmt, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  msg = lj_strfmt_pushvf(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  return msg;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.h[m
[1mdeleted file mode 100644[m
[1mindex a38bc7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt.h[m
[1m+++ /dev/null[m
[36m@@ -1,125 +0,0 @@[m
[31m-/*[m
[31m-** String formatting.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_STRFMT_H[m
[31m-#define _LJ_STRFMT_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-typedef uint32_t SFormat;  /* Format indicator. */[m
[31m-[m
[31m-/* Format parser state. */[m
[31m-typedef struct FormatState {[m
[31m-  const uint8_t *p;	/* Current format string pointer. */[m
[31m-  const uint8_t *e;	/* End of format string. */[m
[31m-  const char *str;	/* Returned literal string. */[m
[31m-  MSize len;		/* Size of literal string. */[m
[31m-} FormatState;[m
[31m-[m
[31m-/* Format types (max. 16). */[m
[31m-typedef enum FormatType {[m
[31m-  STRFMT_EOF, STRFMT_ERR, STRFMT_LIT,[m
[31m-  STRFMT_INT, STRFMT_UINT, STRFMT_NUM, STRFMT_STR, STRFMT_CHAR, STRFMT_PTR[m
[31m-} FormatType;[m
[31m-[m
[31m-/* Format subtypes (bits are reused). */[m
[31m-#define STRFMT_T_HEX	0x0010	/* STRFMT_UINT */[m
[31m-#define STRFMT_T_OCT	0x0020	/* STRFMT_UINT */[m
[31m-#define STRFMT_T_FP_A	0x0000	/* STRFMT_NUM */[m
[31m-#define STRFMT_T_FP_E	0x0010	/* STRFMT_NUM */[m
[31m-#define STRFMT_T_FP_F	0x0020	/* STRFMT_NUM */[m
[31m-#define STRFMT_T_FP_G	0x0030	/* STRFMT_NUM */[m
[31m-#define STRFMT_T_QUOTED	0x0010	/* STRFMT_STR */[m
[31m-[m
[31m-/* Format flags. */[m
[31m-#define STRFMT_F_LEFT	0x0100[m
[31m-#define STRFMT_F_PLUS	0x0200[m
[31m-#define STRFMT_F_ZERO	0x0400[m
[31m-#define STRFMT_F_SPACE	0x0800[m
[31m-#define STRFMT_F_ALT	0x1000[m
[31m-#define STRFMT_F_UPPER	0x2000[m
[31m-[m
[31m-/* Format indicator fields. */[m
[31m-#define STRFMT_SH_WIDTH	16[m
[31m-#define STRFMT_SH_PREC	24[m
[31m-[m
[31m-#define STRFMT_TYPE(sf)		((FormatType)((sf) & 15))[m
[31m-#define STRFMT_WIDTH(sf)	(((sf) >> STRFMT_SH_WIDTH) & 255u)[m
[31m-#define STRFMT_PREC(sf)		((((sf) >> STRFMT_SH_PREC) & 255u) - 1u)[m
[31m-#define STRFMT_FP(sf)		(((sf) >> 4) & 3)[m
[31m-[m
[31m-/* Formats for conversion characters. */[m
[31m-#define STRFMT_A	(STRFMT_NUM|STRFMT_T_FP_A)[m
[31m-#define STRFMT_C	(STRFMT_CHAR)[m
[31m-#define STRFMT_D	(STRFMT_INT)[m
[31m-#define STRFMT_E	(STRFMT_NUM|STRFMT_T_FP_E)[m
[31m-#define STRFMT_F	(STRFMT_NUM|STRFMT_T_FP_F)[m
[31m-#define STRFMT_G	(STRFMT_NUM|STRFMT_T_FP_G)[m
[31m-#define STRFMT_I	STRFMT_D[m
[31m-#define STRFMT_O	(STRFMT_UINT|STRFMT_T_OCT)[m
[31m-#define STRFMT_P	(STRFMT_PTR)[m
[31m-#define STRFMT_Q	(STRFMT_STR|STRFMT_T_QUOTED)[m
[31m-#define STRFMT_S	(STRFMT_STR)[m
[31m-#define STRFMT_U	(STRFMT_UINT)[m
[31m-#define STRFMT_X	(STRFMT_UINT|STRFMT_T_HEX)[m
[31m-#define STRFMT_G14	(STRFMT_G | ((14+1) << STRFMT_SH_PREC))[m
[31m-[m
[31m-/* Maximum buffer sizes for conversions. */[m
[31m-#define STRFMT_MAXBUF_XINT	(1+22)  /* '0' prefix + uint64_t in octal. */[m
[31m-#define STRFMT_MAXBUF_INT	(1+10)  /* Sign + int32_t in decimal. */[m
[31m-#define STRFMT_MAXBUF_NUM	32  /* Must correspond with STRFMT_G14. */[m
[31m-#define STRFMT_MAXBUF_PTR	(2+2*sizeof(ptrdiff_t))  /* "0x" + hex ptr. */[m
[31m-[m
[31m-/* Format parser. */[m
[31m-LJ_FUNC SFormat LJ_FASTCALL lj_strfmt_parse(FormatState *fs);[m
[31m-[m
[31m-static LJ_AINLINE void lj_strfmt_init(FormatState *fs, const char *p, MSize len)[m
[31m-{[m
[31m-  fs->p = (const uint8_t *)p;[m
[31m-  fs->e = (const uint8_t *)p + len;[m
[31m-  lua_assert(*fs->e == 0);  /* Must be NUL-terminated (may have NULs inside). */[m
[31m-}[m
[31m-[m
[31m-/* Raw conversions. */[m
[31m-LJ_FUNC char * LJ_FASTCALL lj_strfmt_wint(char *p, int32_t k);[m
[31m-LJ_FUNC char * LJ_FASTCALL lj_strfmt_wptr(char *p, const void *v);[m
[31m-LJ_FUNC char * LJ_FASTCALL lj_strfmt_wuleb128(char *p, uint32_t v);[m
[31m-LJ_FUNC const char *lj_strfmt_wstrnum(lua_State *L, cTValue *o, MSize *lenp);[m
[31m-[m
[31m-/* Unformatted conversions to buffer. */[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putint(SBuf *sb, int32_t k);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putnum(SBuf *sb, cTValue *o);[m
[31m-#endif[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putptr(SBuf *sb, const void *v);[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putquoted(SBuf *sb, GCstr *str);[m
[31m-[m
[31m-/* Formatted conversions to buffer. */[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfxint(SBuf *sb, SFormat sf, uint64_t k);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfnum_int(SBuf *sb, SFormat sf, lua_Number n);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfnum_uint(SBuf *sb, SFormat sf, lua_Number n);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfnum(SBuf *sb, SFormat, lua_Number n);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfchar(SBuf *sb, SFormat, int32_t c);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfstr(SBuf *sb, SFormat, GCstr *str);[m
[31m-[m
[31m-/* Conversions to strings. */[m
[31m-LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_int(lua_State *L, int32_t k);[m
[31m-LJ_FUNCA GCstr * LJ_FASTCALL lj_strfmt_num(lua_State *L, cTValue *o);[m
[31m-LJ_FUNCA GCstr * LJ_FASTCALL lj_strfmt_number(lua_State *L, cTValue *o);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_char(lua_State *L, int c);[m
[31m-#endif[m
[31m-LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_obj(lua_State *L, cTValue *o);[m
[31m-[m
[31m-/* Internal string formatting. */[m
[31m-LJ_FUNC const char *lj_strfmt_pushvf(lua_State *L, const char *fmt,[m
[31m-				     va_list argp);[m
[31m-LJ_FUNC const char *lj_strfmt_pushf(lua_State *L, const char *fmt, ...)[m
[31m-#ifdef __GNUC__[m
[31m-  __attribute__ ((format (printf, 2, 3)))[m
[31m-#endif[m
[31m-  ;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num.c[m
[1mdeleted file mode 100644[m
[1mindex 0476925..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strfmt_num.c[m
[1m+++ /dev/null[m
[36m@@ -1,592 +0,0 @@[m
[31m-/*[m
[31m-** String formatting for floating-point numbers.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-** Contributed by Peter Cawley.[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lj_strfmt_num_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- Precomputed tables -------------------------------------------------- */[m
[31m-[m
[31m-/* Rescale factors to push the exponent of a number towards zero. */[m
[31m-#define RESCALE_EXPONENTS(P, N) \[m
[31m-  P(308), P(289), P(270), P(250), P(231), P(212), P(193), P(173), P(154), \[m
[31m-  P(135), P(115), P(96), P(77), P(58), P(38), P(0), P(0), P(0), N(39), N(58), \[m
[31m-  N(77), N(96), N(116), N(135), N(154), N(174), N(193), N(212), N(231), \[m
[31m-  N(251), N(270), N(289)[m
[31m-[m
[31m-#define ONE_E_P(X) 1e+0 ## X[m
[31m-#define ONE_E_N(X) 1e-0 ## X[m
[31m-static const int16_t rescale_e[] = { RESCALE_EXPONENTS(-, +) };[m
[31m-static const double rescale_n[] = { RESCALE_EXPONENTS(ONE_E_P, ONE_E_N) };[m
[31m-#undef ONE_E_N[m
[31m-#undef ONE_E_P[m
[31m-[m
[31m-/*[m
[31m-** For p in range -70 through 57, this table encodes pairs (m, e) such that[m
[31m-** 4*2^p <= (uint8_t)m*10^e, and is the smallest value for which this holds.[m
[31m-*/[m
[31m-static const int8_t four_ulp_m_e[] = {[m
[31m-  34, -21, 68, -21, 14, -20, 28, -20, 55, -20, 2, -19, 3, -19, 5, -19, 9, -19,[m
[31m-  -82, -18, 35, -18, 7, -17, -117, -17, 28, -17, 56, -17, 112, -16, -33, -16,[m
[31m-  45, -16, 89, -16, -78, -15, 36, -15, 72, -15, -113, -14, 29, -14, 57, -14,[m
[31m-  114, -13, -28, -13, 46, -13, 91, -12, -74, -12, 37, -12, 73, -12, 15, -11, 3,[m
[31m-  -11, 59, -11, 2, -10, 3, -10, 5, -10, 1, -9, -69, -9, 38, -9, 75, -9, 15, -7,[m
[31m-  3, -7, 6, -7, 12, -6, -17, -7, 48, -7, 96, -7, -65, -6, 39, -6, 77, -6, -103,[m
[31m-  -5, 31, -5, 62, -5, 123, -4, -11, -4, 49, -4, 98, -4, -60, -3, 4, -2, 79, -3,[m
[31m-  16, -2, 32, -2, 63, -2, 2, -1, 25, 0, 5, 1, 1, 2, 2, 2, 4, 2, 8, 2, 16, 2,[m
[31m-  32, 2, 64, 2, -128, 2, 26, 2, 52, 2, 103, 3, -51, 3, 41, 4, 82, 4, -92, 4,[m
[31m-  33, 4, 66, 4, -124, 5, 27, 5, 53, 5, 105, 6, 21, 6, 42, 6, 84, 6, 17, 7, 34,[m
[31m-  7, 68, 7, 2, 8, 3, 8, 6, 8, 108, 9, -41, 9, 43, 10, 86, 9, -84, 10, 35, 10,[m
[31m-  69, 10, -118, 11, 28, 11, 55, 12, 11, 13, 22, 13, 44, 13, 88, 13, -80, 13,[m
[31m-  36, 13, 71, 13, -115, 14, 29, 14, 57, 14, 113, 15, -30, 15, 46, 15, 91, 15,[m
[31m-  19, 16, 37, 16, 73, 16, 2, 17, 3, 17, 6, 17[m
[31m-};[m
[31m-[m
[31m-/* min(2^32-1, 10^e-1) for e in range 0 through 10 */[m
[31m-static uint32_t ndigits_dec_threshold[] = {[m
[31m-  0, 9U, 99U, 999U, 9999U, 99999U, 999999U,[m
[31m-  9999999U, 99999999U, 999999999U, 0xffffffffU[m
[31m-};[m
[31m-[m
[31m-/* -- Helper functions ---------------------------------------------------- */[m
[31m-[m
[31m-/* Compute the number of digits in the decimal representation of x. */[m
[31m-static MSize ndigits_dec(uint32_t x)[m
[31m-{[m
[31m-  MSize t = ((lj_fls(x | 1) * 77) >> 8) + 1; /* 2^8/77 is roughly log2(10) */[m
[31m-  return t + (x > ndigits_dec_threshold[t]);[m
[31m-}[m
[31m-[m
[31m-#define WINT_R(x, sh, sc) \[m
[31m-  { uint32_t d = (x*(((1<<sh)+sc-1)/sc))>>sh; x -= d*sc; *p++ = (char)('0'+d); }[m
[31m-[m
[31m-/* Write 9-digit unsigned integer to buffer. */[m
[31m-static char *lj_strfmt_wuint9(char *p, uint32_t u)[m
[31m-{[m
[31m-  uint32_t v = u / 10000, w;[m
[31m-  u -= v * 10000;[m
[31m-  w = v / 10000;[m
[31m-  v -= w * 10000;[m
[31m-  *p++ = (char)('0'+w);[m
[31m-  WINT_R(v, 23, 1000)[m
[31m-  WINT_R(v, 12, 100)[m
[31m-  WINT_R(v, 10, 10)[m
[31m-  *p++ = (char)('0'+v);[m
[31m-  WINT_R(u, 23, 1000)[m
[31m-  WINT_R(u, 12, 100)[m
[31m-  WINT_R(u, 10, 10)[m
[31m-  *p++ = (char)('0'+u);[m
[31m-  return p;[m
[31m-}[m
[31m-#undef WINT_R[m
[31m-[m
[31m-/* -- Extended precision arithmetic --------------------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** The "nd" format is a fixed-precision decimal representation for numbers. It[m
[31m-** consists of up to 64 uint32_t values, with each uint32_t storing a value[m
[31m-** in the range [0, 1e9). A number in "nd" format consists of three variables:[m
[31m-**[m
[31m-**  uint32_t nd[64];[m
[31m-**  uint32_t ndlo;[m
[31m-**  uint32_t ndhi;[m
[31m-**[m
[31m-** The integral part of the number is stored in nd[0 ... ndhi], the value of[m
[31m-** which is sum{i in [0, ndhi] | nd[i] * 10^(9*i)}. If the fractional part of[m
[31m-** the number is zero, ndlo is zero. Otherwise, the fractional part is stored[m
[31m-** in nd[ndlo ... 63], the value of which is taken to be[m
[31m-** sum{i in [ndlo, 63] | nd[i] * 10^(9*(i-64))}.[m
[31m-**[m
[31m-** If the array part had 128 elements rather than 64, then every double would[m
[31m-** have an exact representation in "nd" format. With 64 elements, all integral[m
[31m-** doubles have an exact representation, and all non-integral doubles have[m
[31m-** enough digits to make both %.99e and %.99f do the right thing.[m
[31m-*/[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define ND_MUL2K_MAX_SHIFT	29[m
[31m-#define ND_MUL2K_DIV1E9(val)	((uint32_t)((val) / 1000000000))[m
[31m-#else[m
[31m-#define ND_MUL2K_MAX_SHIFT	11[m
[31m-#define ND_MUL2K_DIV1E9(val)	((uint32_t)((val) >> 9) / 1953125)[m
[31m-#endif[m
[31m-[m
[31m-/* Multiply nd by 2^k and add carry_in (ndlo is assumed to be zero). */[m
[31m-static uint32_t nd_mul2k(uint32_t* nd, uint32_t ndhi, uint32_t k,[m
[31m-			 uint32_t carry_in, SFormat sf)[m
[31m-{[m
[31m-  uint32_t i, ndlo = 0, start = 1;[m
[31m-  /* Performance hacks. */[m
[31m-  if (k > ND_MUL2K_MAX_SHIFT*2 && STRFMT_FP(sf) != STRFMT_FP(STRFMT_T_FP_F)) {[m
[31m-    start = ndhi - (STRFMT_PREC(sf) + 17) / 8;[m
[31m-  }[m
[31m-  /* Real logic. */[m
[31m-  while (k >= ND_MUL2K_MAX_SHIFT) {[m
[31m-    for (i = ndlo; i <= ndhi; i++) {[m
[31m-      uint64_t val = ((uint64_t)nd[i] << ND_MUL2K_MAX_SHIFT) | carry_in;[m
[31m-      carry_in = ND_MUL2K_DIV1E9(val);[m
[31m-      nd[i] = (uint32_t)val - carry_in * 1000000000;[m
[31m-    }[m
[31m-    if (carry_in) {[m
[31m-      nd[++ndhi] = carry_in; carry_in = 0;[m
[31m-      if(start++ == ndlo) ++ndlo;[m
[31m-    }[m
[31m-    k -= ND_MUL2K_MAX_SHIFT;[m
[31m-  }[m
[31m-  if (k) {[m
[31m-    for (i = ndlo; i <= ndhi; i++) {[m
[31m-      uint64_t val = ((uint64_t)nd[i] << k) | carry_in;[m
[31m-      carry_in = ND_MUL2K_DIV1E9(val);[m
[31m-      nd[i] = (uint32_t)val - carry_in * 1000000000;[m
[31m-    }[m
[31m-    if (carry_in) nd[++ndhi] = carry_in;[m
[31m-  }[m
[31m-  return ndhi;[m
[31m-}[m
[31m-[m
[31m-/* Divide nd by 2^k (ndlo is assumed to be zero). */[m
[31m-static uint32_t nd_div2k(uint32_t* nd, uint32_t ndhi, uint32_t k, SFormat sf)[m
[31m-{[m
[31m-  uint32_t ndlo = 0, stop1 = ~0, stop2 = ~0;[m
[31m-  /* Performance hacks. */[m
[31m-  if (!ndhi) {[m
[31m-    if (!nd[0]) {[m
[31m-      return 0;[m
[31m-    } else {[m
[31m-      uint32_t s = lj_ffs(nd[0]);[m
[31m-      if (s >= k) { nd[0] >>= k; return 0; }[m
[31m-      nd[0] >>= s; k -= s;[m
[31m-    }[m
[31m-  }[m
[31m-  if (k > 18) {[m
[31m-    if (STRFMT_FP(sf) == STRFMT_FP(STRFMT_T_FP_F)) {[m
[31m-      stop1 = 63 - (int32_t)STRFMT_PREC(sf) / 9;[m
[31m-    } else {[m
[31m-      int32_t floorlog2 = ndhi * 29 + lj_fls(nd[ndhi]) - k;[m
[31m-      int32_t floorlog10 = (int32_t)(floorlog2 * 0.30102999566398114);[m
[31m-      stop1 = 62 + (floorlog10 - (int32_t)STRFMT_PREC(sf)) / 9;[m
[31m-      stop2 = 61 + ndhi - (int32_t)STRFMT_PREC(sf) / 8;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Real logic. */[m
[31m-  while (k >= 9) {[m
[31m-    uint32_t i = ndhi, carry = 0;[m
[31m-    for (;;) {[m
[31m-      uint32_t val = nd[i];[m
[31m-      nd[i] = (val >> 9) + carry;[m
[31m-      carry = (val & 0x1ff) * 1953125;[m
[31m-      if (i == ndlo) break;[m
[31m-      i = (i - 1) & 0x3f;[m
[31m-    }[m
[31m-    if (ndlo != stop1 && ndlo != stop2) {[m
[31m-      if (carry) { ndlo = (ndlo - 1) & 0x3f; nd[ndlo] = carry; }[m
[31m-      if (!nd[ndhi]) { ndhi = (ndhi - 1) & 0x3f; stop2--; }[m
[31m-    } else if (!nd[ndhi]) {[m
[31m-      if (ndhi != ndlo) { ndhi = (ndhi - 1) & 0x3f; stop2--; }[m
[31m-      else return ndlo;[m
[31m-    }[m
[31m-    k -= 9;[m
[31m-  }[m
[31m-  if (k) {[m
[31m-    uint32_t mask = (1U << k) - 1, mul = 1000000000 >> k, i = ndhi, carry = 0;[m
[31m-    for (;;) {[m
[31m-      uint32_t val = nd[i];[m
[31m-      nd[i] = (val >> k) + carry;[m
[31m-      carry = (val & mask) * mul;[m
[31m-      if (i == ndlo) break;[m
[31m-      i = (i - 1) & 0x3f;[m
[31m-    }[m
[31m-    if (carry) { ndlo = (ndlo - 1) & 0x3f; nd[ndlo] = carry; }[m
[31m-  }[m
[31m-  return ndlo;[m
[31m-}[m
[31m-[m
[31m-/* Add m*10^e to nd (assumes ndlo <= e/9 <= ndhi and 0 <= m <= 9). */[m
[31m-static uint32_t nd_add_m10e(uint32_t* nd, uint32_t ndhi, uint8_t m, int32_t e)[m
[31m-{[m
[31m-  uint32_t i, carry;[m
[31m-  if (e >= 0) {[m
[31m-    i = (uint32_t)e/9;[m
[31m-    carry = m * (ndigits_dec_threshold[e - (int32_t)i*9] + 1);[m
[31m-  } else {[m
[31m-    int32_t f = (e-8)/9;[m
[31m-    i = (uint32_t)(64 + f);[m
[31m-    carry = m * (ndigits_dec_threshold[e - f*9] + 1);[m
[31m-  }[m
[31m-  for (;;) {[m
[31m-    uint32_t val = nd[i] + carry;[m
[31m-    if (LJ_UNLIKELY(val >= 1000000000)) {[m
[31m-      val -= 1000000000;[m
[31m-      nd[i] = val;[m
[31m-      if (LJ_UNLIKELY(i == ndhi)) {[m
[31m-	ndhi = (ndhi + 1) & 0x3f;[m
[31m-	nd[ndhi] = 1;[m
[31m-	break;[m
[31m-      }[m
[31m-      carry = 1;[m
[31m-      i = (i + 1) & 0x3f;[m
[31m-    } else {[m
[31m-      nd[i] = val;[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  return ndhi;[m
[31m-}[m
[31m-[m
[31m-/* Test whether two "nd" values are equal in their most significant digits. */[m
[31m-static int nd_similar(uint32_t* nd, uint32_t ndhi, uint32_t* ref, MSize hilen,[m
[31m-		      MSize prec)[m
[31m-{[m
[31m-  char nd9[9], ref9[9];[m
[31m-  if (hilen <= prec) {[m
[31m-    if (LJ_UNLIKELY(nd[ndhi] != *ref)) return 0;[m
[31m-    prec -= hilen; ref--; ndhi = (ndhi - 1) & 0x3f;[m
[31m-    if (prec >= 9) {[m
[31m-      if (LJ_UNLIKELY(nd[ndhi] != *ref)) return 0;[m
[31m-      prec -= 9; ref--; ndhi = (ndhi - 1) & 0x3f;[m
[31m-    }[m
[31m-  } else {[m
[31m-    prec -= hilen - 9;[m
[31m-  }[m
[31m-  lua_assert(prec < 9);[m
[31m-  lj_strfmt_wuint9(nd9, nd[ndhi]);[m
[31m-  lj_strfmt_wuint9(ref9, *ref);[m
[31m-  return !memcmp(nd9, ref9, prec) && (nd9[prec] < '5') == (ref9[prec] < '5');[m
[31m-}[m
[31m-[m
[31m-/* -- Formatted conversions to buffer ------------------------------------- */[m
[31m-[m
[31m-/* Write formatted floating-point number to either sb or p. */[m
[31m-static char *lj_strfmt_wfnum(SBuf *sb, SFormat sf, lua_Number n, char *p)[m
[31m-{[m
[31m-  MSize width = STRFMT_WIDTH(sf), prec = STRFMT_PREC(sf), len;[m
[31m-  TValue t;[m
[31m-  t.n = n;[m
[31m-  if (LJ_UNLIKELY((t.u32.hi << 1) >= 0xffe00000)) {[m
[31m-    /* Handle non-finite values uniformly for %a, %e, %f, %g. */[m
[31m-    int prefix = 0, ch = (sf & STRFMT_F_UPPER) ? 0x202020 : 0;[m
[31m-    if (((t.u32.hi & 0x000fffff) | t.u32.lo) != 0) {[m
[31m-      ch ^= ('n' << 16) | ('a' << 8) | 'n';[m
[31m-      if ((sf & STRFMT_F_SPACE)) prefix = ' ';[m
[31m-    } else {[m
[31m-      ch ^= ('i' << 16) | ('n' << 8) | 'f';[m
[31m-      if ((t.u32.hi & 0x80000000)) prefix = '-';[m
[31m-      else if ((sf & STRFMT_F_PLUS)) prefix = '+';[m
[31m-      else if ((sf & STRFMT_F_SPACE)) prefix = ' ';[m
[31m-    }[m
[31m-    len = 3 + (prefix != 0);[m
[31m-    if (!p) p = lj_buf_more(sb, width > len ? width : len);[m
[31m-    if (!(sf & STRFMT_F_LEFT)) while (width-- > len) *p++ = ' ';[m
[31m-    if (prefix) *p++ = prefix;[m
[31m-    *p++ = (char)(ch >> 16); *p++ = (char)(ch >> 8); *p++ = (char)ch;[m
[31m-  } else if (STRFMT_FP(sf) == STRFMT_FP(STRFMT_T_FP_A)) {[m
[31m-    /* %a */[m
[31m-    const char *hexdig = (sf & STRFMT_F_UPPER) ? "0123456789ABCDEFPX"[m
[31m-					       : "0123456789abcdefpx";[m
[31m-    int32_t e = (t.u32.hi >> 20) & 0x7ff;[m
[31m-    char prefix = 0, eprefix = '+';[m
[31m-    if (t.u32.hi & 0x80000000) prefix = '-';[m
[31m-    else if ((sf & STRFMT_F_PLUS)) prefix = '+';[m
[31m-    else if ((sf & STRFMT_F_SPACE)) prefix = ' ';[m
[31m-    t.u32.hi &= 0xfffff;[m
[31m-    if (e) {[m
[31m-      t.u32.hi |= 0x100000;[m
[31m-      e -= 1023;[m
[31m-    } else if (t.u32.lo | t.u32.hi) {[m
[31m-      /* Non-zero denormal - normalise it. */[m
[31m-      uint32_t shift = t.u32.hi ? 20-lj_fls(t.u32.hi) : 52-lj_fls(t.u32.lo);[m
[31m-      e = -1022 - shift;[m
[31m-      t.u64 <<= shift;[m
[31m-    }[m
[31m-    /* abs(n) == t.u64 * 2^(e - 52) */[m
[31m-    /* If n != 0, bit 52 of t.u64 is set, and is the highest set bit. */[m
[31m-    if ((int32_t)prec < 0) {[m
[31m-      /* Default precision: use smallest precision giving exact result. */[m
[31m-      prec = t.u32.lo ? 13-lj_ffs(t.u32.lo)/4 : 5-lj_ffs(t.u32.hi|0x100000)/4;[m
[31m-    } else if (prec < 13) {[m
[31m-      /* Precision is sufficiently low as to maybe require rounding. */[m
[31m-      t.u64 += (((uint64_t)1) << (51 - prec*4));[m
[31m-    }[m
[31m-    if (e < 0) {[m
[31m-      eprefix = '-';[m
[31m-      e = -e;[m
[31m-    }[m
[31m-    len = 5 + ndigits_dec((uint32_t)e) + prec + (prefix != 0)[m
[31m-	    + ((prec | (sf & STRFMT_F_ALT)) != 0);[m
[31m-    if (!p) p = lj_buf_more(sb, width > len ? width : len);[m
[31m-    if (!(sf & (STRFMT_F_LEFT | STRFMT_F_ZERO))) {[m
[31m-      while (width-- > len) *p++ = ' ';[m
[31m-    }[m
[31m-    if (prefix) *p++ = prefix;[m
[31m-    *p++ = '0';[m
[31m-    *p++ = hexdig[17]; /* x or X */[m
[31m-    if ((sf & (STRFMT_F_LEFT | STRFMT_F_ZERO)) == STRFMT_F_ZERO) {[m
[31m-      while (width-- > len) *p++ = '0';[m
[31m-    }[m
[31m-    *p++ = '0' + (t.u32.hi >> 20); /* Usually '1', sometimes '0' or '2'. */[m
[31m-    if ((prec | (sf & STRFMT_F_ALT))) {[m
[31m-      /* Emit fractional part. */[m
[31m-      char *q = p + 1 + prec;[m
[31m-      *p = '.';[m
[31m-      if (prec < 13) t.u64 >>= (52 - prec*4);[m
[31m-      else while (prec > 13) p[prec--] = '0';[m
[31m-      while (prec) { p[prec--] = hexdig[t.u64 & 15]; t.u64 >>= 4; }[m
[31m-      p = q;[m
[31m-    }[m
[31m-    *p++ = hexdig[16]; /* p or P */[m
[31m-    *p++ = eprefix; /* + or - */[m
[31m-    p = lj_strfmt_wint(p, e);[m
[31m-  } else {[m
[31m-    /* %e or %f or %g - begin by converting n to "nd" format. */[m
[31m-    uint32_t nd[64];[m
[31m-    uint32_t ndhi = 0, ndlo, i;[m
[31m-    int32_t e = (t.u32.hi >> 20) & 0x7ff, ndebias = 0;[m
[31m-    char prefix = 0, *q;[m
[31m-    if (t.u32.hi & 0x80000000) prefix = '-';[m
[31m-    else if ((sf & STRFMT_F_PLUS)) prefix = '+';[m
[31m-    else if ((sf & STRFMT_F_SPACE)) prefix = ' ';[m
[31m-    prec += ((int32_t)prec >> 31) & 7; /* Default precision is 6. */[m
[31m-    if (STRFMT_FP(sf) == STRFMT_FP(STRFMT_T_FP_G)) {[m
[31m-      /* %g - decrement precision if non-zero (to make it like %e). */[m
[31m-      prec--;[m
[31m-      prec ^= (uint32_t)((int32_t)prec >> 31);[m
[31m-    }[m
[31m-    if ((sf & STRFMT_T_FP_E) && prec < 14 && n != 0) {[m
[31m-      /* Precision is sufficiently low that rescaling will probably work. */[m
[31m-      if ((ndebias = rescale_e[e >> 6])) {[m
[31m-	t.n = n * rescale_n[e >> 6];[m
[31m-	if (LJ_UNLIKELY(!e)) t.n *= 1e10, ndebias -= 10;[m
[31m-	t.u64 -= 2; /* Convert 2ulp below (later we convert 2ulp above). */[m
[31m-	nd[0] = 0x100000 | (t.u32.hi & 0xfffff);[m
[31m-	e = ((t.u32.hi >> 20) & 0x7ff) - 1075 - (ND_MUL2K_MAX_SHIFT < 29);[m
[31m-	goto load_t_lo; rescale_failed:[m
[31m-	t.n = n;[m
[31m-	e = (t.u32.hi >> 20) & 0x7ff;[m
[31m-	ndebias = ndhi = 0;[m
[31m-      }[m
[31m-    }[m
[31m-    nd[0] = t.u32.hi & 0xfffff;[m
[31m-    if (e == 0) e++; else nd[0] |= 0x100000;[m
[31m-    e -= 1043;[m
[31m-    if (t.u32.lo) {[m
[31m-      e -= 32 + (ND_MUL2K_MAX_SHIFT < 29); load_t_lo:[m
[31m-#if ND_MUL2K_MAX_SHIFT >= 29[m
[31m-      nd[0] = (nd[0] << 3) | (t.u32.lo >> 29);[m
[31m-      ndhi = nd_mul2k(nd, ndhi, 29, t.u32.lo & 0x1fffffff, sf);[m
[31m-#elif ND_MUL2K_MAX_SHIFT >= 11[m
[31m-      ndhi = nd_mul2k(nd, ndhi, 11, t.u32.lo >> 21, sf);[m
[31m-      ndhi = nd_mul2k(nd, ndhi, 11, (t.u32.lo >> 10) & 0x7ff, sf);[m
[31m-      ndhi = nd_mul2k(nd, ndhi, 11, (t.u32.lo <<  1) & 0x7ff, sf);[m
[31m-#else[m
[31m-#error "ND_MUL2K_MAX_SHIFT too small"[m
[31m-#endif[m
[31m-    }[m
[31m-    if (e >= 0) {[m
[31m-      ndhi = nd_mul2k(nd, ndhi, (uint32_t)e, 0, sf);[m
[31m-      ndlo = 0;[m
[31m-    } else {[m
[31m-      ndlo = nd_div2k(nd, ndhi, (uint32_t)-e, sf);[m
[31m-      if (ndhi && !nd[ndhi]) ndhi--;[m
[31m-    }[m
[31m-    /* abs(n) == nd * 10^ndebias (for slightly loose interpretation of ==) */[m
[31m-    if ((sf & STRFMT_T_FP_E)) {[m
[31m-      /* %e or %g - assume %e and start by calculating nd's exponent (nde). */[m
[31m-      char eprefix = '+';[m
[31m-      int32_t nde = -1;[m
[31m-      MSize hilen;[m
[31m-      if (ndlo && !nd[ndhi]) {[m
[31m-	ndhi = 64; do {} while (!nd[--ndhi]);[m
[31m-	nde -= 64 * 9;[m
[31m-      }[m
[31m-      hilen = ndigits_dec(nd[ndhi]);[m
[31m-      nde += ndhi * 9 + hilen;[m
[31m-      if (ndebias) {[m
[31m-	/*[m
[31m-	** Rescaling was performed, but this introduced some error, and might[m
[31m-	** have pushed us across a rounding boundary. We check whether this[m
[31m-	** error affected the result by introducing even more error (2ulp in[m
[31m-	** either direction), and seeing whether a roundary boundary was[m
[31m-	** crossed. Having already converted the -2ulp case, we save off its[m
[31m-	** most significant digits, convert the +2ulp case, and compare them.[m
[31m-	*/[m
[31m-	int32_t eidx = e + 70 + (ND_MUL2K_MAX_SHIFT < 29)[m
[31m-			 + (t.u32.lo >= 0xfffffffe && !(~t.u32.hi << 12));[m
[31m-	const int8_t *m_e = four_ulp_m_e + eidx * 2;[m
[31m-	lua_assert(0 <= eidx && eidx < 128);[m
[31m-	nd[33] = nd[ndhi];[m
[31m-	nd[32] = nd[(ndhi - 1) & 0x3f];[m
[31m-	nd[31] = nd[(ndhi - 2) & 0x3f];[m
[31m-	nd_add_m10e(nd, ndhi, (uint8_t)*m_e, m_e[1]);[m
[31m-	if (LJ_UNLIKELY(!nd_similar(nd, ndhi, nd + 33, hilen, prec + 1))) {[m
[31m-	  goto rescale_failed;[m
[31m-	}[m
[31m-      }[m
[31m-      if ((int32_t)(prec - nde) < (0x3f & -(int32_t)ndlo) * 9) {[m
[31m-	/* Precision is sufficiently low as to maybe require rounding. */[m
[31m-	ndhi = nd_add_m10e(nd, ndhi, 5, nde - prec - 1);[m
[31m-	nde += (hilen != ndigits_dec(nd[ndhi]));[m
[31m-      }[m
[31m-      nde += ndebias;[m
[31m-      if ((sf & STRFMT_T_FP_F)) {[m
[31m-	/* %g */[m
[31m-	if ((int32_t)prec >= nde && nde >= -4) {[m
[31m-	  if (nde < 0) ndhi = 0;[m
[31m-	  prec -= nde;[m
[31m-	  goto g_format_like_f;[m
[31m-	} else if (!(sf & STRFMT_F_ALT) && prec && width > 5) {[m
[31m-	  /* Decrease precision in order to strip trailing zeroes. */[m
[31m-	  char tail[9];[m
[31m-	  uint32_t maxprec = hilen - 1 + ((ndhi - ndlo) & 0x3f) * 9;[m
[31m-	  if (prec >= maxprec) prec = maxprec;[m
[31m-	  else ndlo = (ndhi - (((int32_t)(prec - hilen) + 9) / 9)) & 0x3f;[m
[31m-	  i = prec - hilen - (((ndhi - ndlo) & 0x3f) * 9) + 10;[m
[31m-	  lj_strfmt_wuint9(tail, nd[ndlo]);[m
[31m-	  while (prec && tail[--i] == '0') {[m
[31m-	    prec--;[m
[31m-	    if (!i) {[m
[31m-	      if (ndlo == ndhi) { prec = 0; break; }[m
[31m-	      lj_strfmt_wuint9(tail, nd[++ndlo]);[m
[31m-	      i = 9;[m
[31m-	    }[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-      if (nde < 0) {[m
[31m-	/* Make nde non-negative. */[m
[31m-	eprefix = '-';[m
[31m-	nde = -nde;[m
[31m-      }[m
[31m-      len = 3 + prec + (prefix != 0) + ndigits_dec((uint32_t)nde) + (nde < 10)[m
[31m-	      + ((prec | (sf & STRFMT_F_ALT)) != 0);[m
[31m-      if (!p) p = lj_buf_more(sb, (width > len ? width : len) + 5);[m
[31m-      if (!(sf & (STRFMT_F_LEFT | STRFMT_F_ZERO))) {[m
[31m-	while (width-- > len) *p++ = ' ';[m
[31m-      }[m
[31m-      if (prefix) *p++ = prefix;[m
[31m-      if ((sf & (STRFMT_F_LEFT | STRFMT_F_ZERO)) == STRFMT_F_ZERO) {[m
[31m-	while (width-- > len) *p++ = '0';[m
[31m-      }[m
[31m-      q = lj_strfmt_wint(p + 1, nd[ndhi]);[m
[31m-      p[0] = p[1]; /* Put leading digit in the correct place. */[m
[31m-      if ((prec | (sf & STRFMT_F_ALT))) {[m
[31m-	/* Emit fractional part. */[m
[31m-	p[1] = '.'; p += 2;[m
[31m-	prec -= (MSize)(q - p); p = q; /* Account for digits already emitted. */[m
[31m-	/* Then emit chunks of 9 digits (this may emit 8 digits too many). */[m
[31m-	for (i = ndhi; (int32_t)prec > 0 && i != ndlo; prec -= 9) {[m
[31m-	  i = (i - 1) & 0x3f;[m
[31m-	  p = lj_strfmt_wuint9(p, nd[i]);[m
[31m-	}[m
[31m-	if ((sf & STRFMT_T_FP_F) && !(sf & STRFMT_F_ALT)) {[m
[31m-	  /* %g (and not %#g) - strip trailing zeroes. */[m
[31m-	  p += (int32_t)prec & ((int32_t)prec >> 31);[m
[31m-	  while (p[-1] == '0') p--;[m
[31m-	  if (p[-1] == '.') p--;[m
[31m-	} else {[m
[31m-	  /* %e (or %#g) - emit trailing zeroes. */[m
[31m-	  while ((int32_t)prec > 0) { *p++ = '0'; prec--; }[m
[31m-	  p += (int32_t)prec;[m
[31m-	}[m
[31m-      } else {[m
[31m-	p++;[m
[31m-      }[m
[31m-      *p++ = (sf & STRFMT_F_UPPER) ? 'E' : 'e';[m
[31m-      *p++ = eprefix; /* + or - */[m
[31m-      if (nde < 10) *p++ = '0'; /* Always at least two digits of exponent. */[m
[31m-      p = lj_strfmt_wint(p, nde);[m
[31m-    } else {[m
[31m-      /* %f (or, shortly, %g in %f style) */[m
[31m-      if (prec < (MSize)(0x3f & -(int32_t)ndlo) * 9) {[m
[31m-	/* Precision is sufficiently low as to maybe require rounding. */[m
[31m-	ndhi = nd_add_m10e(nd, ndhi, 5, 0 - prec - 1);[m
[31m-      }[m
[31m-      g_format_like_f:[m
[31m-      if ((sf & STRFMT_T_FP_E) && !(sf & STRFMT_F_ALT) && prec && width) {[m
[31m-	/* Decrease precision in order to strip trailing zeroes. */[m
[31m-	if (ndlo) {[m
[31m-	  /* nd has a fractional part; we need to look at its digits. */[m
[31m-	  char tail[9];[m
[31m-	  uint32_t maxprec = (64 - ndlo) * 9;[m
[31m-	  if (prec >= maxprec) prec = maxprec;[m
[31m-	  else ndlo = 64 - (prec + 8) / 9;[m
[31m-	  i = prec - ((63 - ndlo) * 9);[m
[31m-	  lj_strfmt_wuint9(tail, nd[ndlo]);[m
[31m-	  while (prec && tail[--i] == '0') {[m
[31m-	    prec--;[m
[31m-	    if (!i) {[m
[31m-	      if (ndlo == 63) { prec = 0; break; }[m
[31m-	      lj_strfmt_wuint9(tail, nd[++ndlo]);[m
[31m-	      i = 9;[m
[31m-	    }[m
[31m-	  }[m
[31m-	} else {[m
[31m-	  /* nd has no fractional part, so precision goes straight to zero. */[m
[31m-	  prec = 0;[m
[31m-	}[m
[31m-      }[m
[31m-      len = ndhi * 9 + ndigits_dec(nd[ndhi]) + prec + (prefix != 0)[m
[31m-		     + ((prec | (sf & STRFMT_F_ALT)) != 0);[m
[31m-      if (!p) p = lj_buf_more(sb, (width > len ? width : len) + 8);[m
[31m-      if (!(sf & (STRFMT_F_LEFT | STRFMT_F_ZERO))) {[m
[31m-	while (width-- > len) *p++ = ' ';[m
[31m-      }[m
[31m-      if (prefix) *p++ = prefix;[m
[31m-      if ((sf & (STRFMT_F_LEFT | STRFMT_F_ZERO)) == STRFMT_F_ZERO) {[m
[31m-	while (width-- > len) *p++ = '0';[m
[31m-      }[m
[31m-      /* Emit integer part. */[m
[31m-      p = lj_strfmt_wint(p, nd[ndhi]);[m
[31m-      i = ndhi;[m
[31m-      while (i) p = lj_strfmt_wuint9(p, nd[--i]);[m
[31m-      if ((prec | (sf & STRFMT_F_ALT))) {[m
[31m-	/* Emit fractional part. */[m
[31m-	*p++ = '.';[m
[31m-	/* Emit chunks of 9 digits (this may emit 8 digits too many). */[m
[31m-	while ((int32_t)prec > 0 && i != ndlo) {[m
[31m-	  i = (i - 1) & 0x3f;[m
[31m-	  p = lj_strfmt_wuint9(p, nd[i]);[m
[31m-	  prec -= 9;[m
[31m-	}[m
[31m-	if ((sf & STRFMT_T_FP_E) && !(sf & STRFMT_F_ALT)) {[m
[31m-	  /* %g (and not %#g) - strip trailing zeroes. */[m
[31m-	  p += (int32_t)prec & ((int32_t)prec >> 31);[m
[31m-	  while (p[-1] == '0') p--;[m
[31m-	  if (p[-1] == '.') p--;[m
[31m-	} else {[m
[31m-	  /* %f (or %#g) - emit trailing zeroes. */[m
[31m-	  while ((int32_t)prec > 0) { *p++ = '0'; prec--; }[m
[31m-	  p += (int32_t)prec;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if ((sf & STRFMT_F_LEFT)) while (width-- > len) *p++ = ' ';[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Add formatted floating-point number to buffer. */[m
[31m-SBuf *lj_strfmt_putfnum(SBuf *sb, SFormat sf, lua_Number n)[m
[31m-{[m
[31m-  setsbufP(sb, lj_strfmt_wfnum(sb, sf, n, NULL));[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* -- Conversions to strings ---------------------------------------------- */[m
[31m-[m
[31m-/* Convert number to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_num(lua_State *L, cTValue *o)[m
[31m-{[m
[31m-  char buf[STRFMT_MAXBUF_NUM];[m
[31m-  MSize len = (MSize)(lj_strfmt_wfnum(NULL, STRFMT_G14, o->n, buf) - buf);[m
[31m-  return lj_str_new(L, buf, len);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.c[m
[1mdeleted file mode 100644[m
[1mindex 7c51713..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.c[m
[1m+++ /dev/null[m
[36m@@ -1,547 +0,0 @@[m
[31m-/*[m
[31m-** String scanning.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <math.h>[m
[31m-[m
[31m-#define lj_strscan_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strscan.h"[m
[31m-[m
[31m-/* -- Scanning numbers ---------------------------------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** Rationale for the builtin string to number conversion library:[m
[31m-**[m
[31m-** It removes a dependency on libc's strtod(), which is a true portability[m
[31m-** nightmare. Mainly due to the plethora of supported OS and toolchain[m
[31m-** combinations. Sadly, the various implementations[m
[31m-** a) are often buggy, incomplete (no hex floats) and/or imprecise,[m
[31m-** b) sometimes crash or hang on certain inputs,[m
[31m-** c) return non-standard NaNs that need to be filtered out, and[m
[31m-** d) fail if the locale-specific decimal separator is not a dot,[m
[31m-**    which can only be fixed with atrocious workarounds.[m
[31m-**[m
[31m-** Also, most of the strtod() implementations are hopelessly bloated,[m
[31m-** which is not just an I-cache hog, but a problem for static linkage[m
[31m-** on embedded systems, too.[m
[31m-**[m
[31m-** OTOH the builtin conversion function is very compact. Even though it[m
[31m-** does a lot more, like parsing long longs, octal or imaginary numbers[m
[31m-** and returning the result in different formats:[m
[31m-** a) It needs less than 3 KB (!) of machine code (on x64 with -Os),[m
[31m-** b) it doesn't perform any dynamic allocation and,[m
[31m-** c) it needs only around 600 bytes of stack space.[m
[31m-**[m
[31m-** The builtin function is faster than strtod() for typical inputs, e.g.[m
[31m-** "123", "1.5" or "1e6". Arguably, it's slower for very large exponents,[m
[31m-** which are not very common (this could be fixed, if needed).[m
[31m-**[m
[31m-** And most importantly, the builtin function is equally precise on all[m
[31m-** platforms. It correctly converts and rounds any input to a double.[m
[31m-** If this is not the case, please send a bug report -- but PLEASE verify[m
[31m-** that the implementation you're comparing to is not the culprit![m
[31m-**[m
[31m-** The implementation quickly pre-scans the entire string first and[m
[31m-** handles simple integers on-the-fly. Otherwise, it dispatches to the[m
[31m-** base-specific parser. Hex and octal is straightforward.[m
[31m-**[m
[31m-** Decimal to binary conversion uses a fixed-length circular buffer in[m
[31m-** base 100. Some simple cases are handled directly. For other cases, the[m
[31m-** number in the buffer is up-scaled or down-scaled until the integer part[m
[31m-** is in the proper range. Then the integer part is rounded and converted[m
[31m-** to a double which is finally rescaled to the result. Denormals need[m
[31m-** special treatment to prevent incorrect 'double rounding'.[m
[31m-*/[m
[31m-[m
[31m-/* Definitions for circular decimal digit buffer (base 100 = 2 digits/byte). */[m
[31m-#define STRSCAN_DIG	1024[m
[31m-#define STRSCAN_MAXDIG	800		/* 772 + extra are sufficient. */[m
[31m-#define STRSCAN_DDIG	(STRSCAN_DIG/2)[m
[31m-#define STRSCAN_DMASK	(STRSCAN_DDIG-1)[m
[31m-[m
[31m-/* Helpers for circular buffer. */[m
[31m-#define DNEXT(a)	(((a)+1) & STRSCAN_DMASK)[m
[31m-#define DPREV(a)	(((a)-1) & STRSCAN_DMASK)[m
[31m-#define DLEN(lo, hi)	((int32_t)(((lo)-(hi)) & STRSCAN_DMASK))[m
[31m-[m
[31m-#define casecmp(c, k)	(((c) | 0x20) == k)[m
[31m-[m
[31m-/* Final conversion to double. */[m
[31m-static void strscan_double(uint64_t x, TValue *o, int32_t ex2, int32_t neg)[m
[31m-{[m
[31m-  double n;[m
[31m-[m
[31m-  /* Avoid double rounding for denormals. */[m
[31m-  if (LJ_UNLIKELY(ex2 <= -1075 && x != 0)) {[m
[31m-    /* NYI: all of this generates way too much code on 32 bit CPUs. */[m
[31m-#if defined(__GNUC__) && LJ_64[m
[31m-    int32_t b = (int32_t)(__builtin_clzll(x)^63);[m
[31m-#else[m
[31m-    int32_t b = (x>>32) ? 32+(int32_t)lj_fls((uint32_t)(x>>32)) :[m
[31m-			  (int32_t)lj_fls((uint32_t)x);[m
[31m-#endif[m
[31m-    if ((int32_t)b + ex2 <= -1023 && (int32_t)b + ex2 >= -1075) {[m
[31m-      uint64_t rb = (uint64_t)1 << (-1075-ex2);[m
[31m-      if ((x & rb) && ((x & (rb+rb+rb-1)))) x += rb+rb;[m
[31m-      x = (x & ~(rb+rb-1));[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Convert to double using a signed int64_t conversion, then rescale. */[m
[31m-  lua_assert((int64_t)x >= 0);[m
[31m-  n = (double)(int64_t)x;[m
[31m-  if (neg) n = -n;[m
[31m-  if (ex2) n = ldexp(n, ex2);[m
[31m-  o->n = n;[m
[31m-}[m
[31m-[m
[31m-/* Parse hexadecimal number. */[m
[31m-static StrScanFmt strscan_hex(const uint8_t *p, TValue *o,[m
[31m-			      StrScanFmt fmt, uint32_t opt,[m
[31m-			      int32_t ex2, int32_t neg, uint32_t dig)[m
[31m-{[m
[31m-  uint64_t x = 0;[m
[31m-  uint32_t i;[m
[31m-[m
[31m-  /* Scan hex digits. */[m
[31m-  for (i = dig > 16 ? 16 : dig ; i; i--, p++) {[m
[31m-    uint32_t d = (*p != '.' ? *p : *++p); if (d > '9') d += 9;[m
[31m-    x = (x << 4) + (d & 15);[m
[31m-  }[m
[31m-[m
[31m-  /* Summarize rounding-effect of excess digits. */[m
[31m-  for (i = 16; i < dig; i++, p++)[m
[31m-    x |= ((*p != '.' ? *p : *++p) != '0'), ex2 += 4;[m
[31m-[m
[31m-  /* Format-specific handling. */[m
[31m-  switch (fmt) {[m
[31m-  case STRSCAN_INT:[m
[31m-    if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {[m
[31m-      o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-      return STRSCAN_INT;  /* Fast path for 32 bit integers. */[m
[31m-    }[m
[31m-    if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; break; }[m
[31m-    /* fallthrough */[m
[31m-  case STRSCAN_U32:[m
[31m-    if (dig > 8) return STRSCAN_ERROR;[m
[31m-    o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-    return STRSCAN_U32;[m
[31m-  case STRSCAN_I64:[m
[31m-  case STRSCAN_U64:[m
[31m-    if (dig > 16) return STRSCAN_ERROR;[m
[31m-    o->u64 = neg ? (uint64_t)-(int64_t)x : x;[m
[31m-    return fmt;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  /* Reduce range, then convert to double. */[m
[31m-  if ((x & U64x(c0000000,0000000))) { x = (x >> 2) | (x & 3); ex2 += 2; }[m
[31m-  strscan_double(x, o, ex2, neg);[m
[31m-  return fmt;[m
[31m-}[m
[31m-[m
[31m-/* Parse octal number. */[m
[31m-static StrScanFmt strscan_oct(const uint8_t *p, TValue *o,[m
[31m-			      StrScanFmt fmt, int32_t neg, uint32_t dig)[m
[31m-{[m
[31m-  uint64_t x = 0;[m
[31m-[m
[31m-  /* Scan octal digits. */[m
[31m-  if (dig > 22 || (dig == 22 && *p > '1')) return STRSCAN_ERROR;[m
[31m-  while (dig-- > 0) {[m
[31m-    if (!(*p >= '0' && *p <= '7')) return STRSCAN_ERROR;[m
[31m-    x = (x << 3) + (*p++ & 7);[m
[31m-  }[m
[31m-[m
[31m-  /* Format-specific handling. */[m
[31m-  switch (fmt) {[m
[31m-  case STRSCAN_INT:[m
[31m-    if (x >= 0x80000000u+neg) fmt = STRSCAN_U32;[m
[31m-    /* fallthrough */[m
[31m-  case STRSCAN_U32:[m
[31m-    if ((x >> 32)) return STRSCAN_ERROR;[m
[31m-    o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-    break;[m
[31m-  default:[m
[31m-  case STRSCAN_I64:[m
[31m-  case STRSCAN_U64:[m
[31m-    o->u64 = neg ? (uint64_t)-(int64_t)x : x;[m
[31m-    break;[m
[31m-  }[m
[31m-  return fmt;[m
[31m-}[m
[31m-[m
[31m-/* Parse decimal number. */[m
[31m-static StrScanFmt strscan_dec(const uint8_t *p, TValue *o,[m
[31m-			      StrScanFmt fmt, uint32_t opt,[m
[31m-			      int32_t ex10, int32_t neg, uint32_t dig)[m
[31m-{[m
[31m-  uint8_t xi[STRSCAN_DDIG], *xip = xi;[m
[31m-[m
[31m-  if (dig) {[m
[31m-    uint32_t i = dig;[m
[31m-    if (i > STRSCAN_MAXDIG) {[m
[31m-      ex10 += (int32_t)(i - STRSCAN_MAXDIG);[m
[31m-      i = STRSCAN_MAXDIG;[m
[31m-    }[m
[31m-    /* Scan unaligned leading digit. */[m
[31m-    if (((ex10^i) & 1))[m
[31m-      *xip++ = ((*p != '.' ? *p : *++p) & 15), i--, p++;[m
[31m-    /* Scan aligned double-digits. */[m
[31m-    for ( ; i > 1; i -= 2) {[m
[31m-      uint32_t d = 10 * ((*p != '.' ? *p : *++p) & 15); p++;[m
[31m-      *xip++ = d + ((*p != '.' ? *p : *++p) & 15); p++;[m
[31m-    }[m
[31m-    /* Scan and realign trailing digit. */[m
[31m-    if (i) *xip++ = 10 * ((*p != '.' ? *p : *++p) & 15), ex10--, dig++, p++;[m
[31m-[m
[31m-    /* Summarize rounding-effect of excess digits. */[m
[31m-    if (dig > STRSCAN_MAXDIG) {[m
[31m-      do {[m
[31m-	if ((*p != '.' ? *p : *++p) != '0') { xip[-1] |= 1; break; }[m
[31m-	p++;[m
[31m-      } while (--dig > STRSCAN_MAXDIG);[m
[31m-      dig = STRSCAN_MAXDIG;[m
[31m-    } else {  /* Simplify exponent. */[m
[31m-      while (ex10 > 0 && dig <= 18) *xip++ = 0, ex10 -= 2, dig += 2;[m
[31m-    }[m
[31m-  } else {  /* Only got zeros. */[m
[31m-    ex10 = 0;[m
[31m-    xi[0] = 0;[m
[31m-  }[m
[31m-[m
[31m-  /* Fast path for numbers in integer format (but handles e.g. 1e6, too). */[m
[31m-  if (dig <= 20 && ex10 == 0) {[m
[31m-    uint8_t *xis;[m
[31m-    uint64_t x = xi[0];[m
[31m-    double n;[m
[31m-    for (xis = xi+1; xis < xip; xis++) x = x * 100 + *xis;[m
[31m-    if (!(dig == 20 && (xi[0] > 18 || (int64_t)x >= 0))) {  /* No overflow? */[m
[31m-      /* Format-specific handling. */[m
[31m-      switch (fmt) {[m
[31m-      case STRSCAN_INT:[m
[31m-	if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {[m
[31m-	  o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-	  return STRSCAN_INT;  /* Fast path for 32 bit integers. */[m
[31m-	}[m
[31m-	if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; goto plainnumber; }[m
[31m-	/* fallthrough */[m
[31m-      case STRSCAN_U32:[m
[31m-	if ((x >> 32) != 0) return STRSCAN_ERROR;[m
[31m-	o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-	return STRSCAN_U32;[m
[31m-      case STRSCAN_I64:[m
[31m-      case STRSCAN_U64:[m
[31m-	o->u64 = neg ? (uint64_t)-(int64_t)x : x;[m
[31m-	return fmt;[m
[31m-      default:[m
[31m-      plainnumber:  /* Fast path for plain numbers < 2^63. */[m
[31m-	if ((int64_t)x < 0) break;[m
[31m-	n = (double)(int64_t)x;[m
[31m-	if (neg) n = -n;[m
[31m-	o->n = n;[m
[31m-	return fmt;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Slow non-integer path. */[m
[31m-  if (fmt == STRSCAN_INT) {[m
[31m-    if ((opt & STRSCAN_OPT_C)) return STRSCAN_ERROR;[m
[31m-    fmt = STRSCAN_NUM;[m
[31m-  } else if (fmt > STRSCAN_INT) {[m
[31m-    return STRSCAN_ERROR;[m
[31m-  }[m
[31m-  {[m
[31m-    uint32_t hi = 0, lo = (uint32_t)(xip-xi);[m
[31m-    int32_t ex2 = 0, idig = (int32_t)lo + (ex10 >> 1);[m
[31m-[m
[31m-    lua_assert(lo > 0 && (ex10 & 1) == 0);[m
[31m-[m
[31m-    /* Handle simple overflow/underflow. */[m
[31m-    if (idig > 310/2) { if (neg) setminfV(o); else setpinfV(o); return fmt; }[m
[31m-    else if (idig < -326/2) { o->n = neg ? -0.0 : 0.0; return fmt; }[m
[31m-[m
[31m-    /* Scale up until we have at least 17 or 18 integer part digits. */[m
[31m-    while (idig < 9 && idig < DLEN(lo, hi)) {[m
[31m-      uint32_t i, cy = 0;[m
[31m-      ex2 -= 6;[m
[31m-      for (i = DPREV(lo); ; i = DPREV(i)) {[m
[31m-	uint32_t d = (xi[i] << 6) + cy;[m
[31m-	cy = (((d >> 2) * 5243) >> 17); d = d - cy * 100;  /* Div/mod 100. */[m
[31m-	xi[i] = (uint8_t)d;[m
[31m-	if (i == hi) break;[m
[31m-	if (d == 0 && i == DPREV(lo)) lo = i;[m
[31m-      }[m
[31m-      if (cy) {[m
[31m-	hi = DPREV(hi);[m
[31m-	if (xi[DPREV(lo)] == 0) lo = DPREV(lo);[m
[31m-	else if (hi == lo) { lo = DPREV(lo); xi[DPREV(lo)] |= xi[lo]; }[m
[31m-	xi[hi] = (uint8_t)cy; idig++;[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Scale down until no more than 17 or 18 integer part digits remain. */[m
[31m-    while (idig > 9) {[m
[31m-      uint32_t i = hi, cy = 0;[m
[31m-      ex2 += 6;[m
[31m-      do {[m
[31m-	cy += xi[i];[m
[31m-	xi[i] = (cy >> 6);[m
[31m-	cy = 100 * (cy & 0x3f);[m
[31m-	if (xi[i] == 0 && i == hi) hi = DNEXT(hi), idig--;[m
[31m-	i = DNEXT(i);[m
[31m-      } while (i != lo);[m
[31m-      while (cy) {[m
[31m-	if (hi == lo) { xi[DPREV(lo)] |= 1; break; }[m
[31m-	xi[lo] = (cy >> 6); lo = DNEXT(lo);[m
[31m-	cy = 100 * (cy & 0x3f);[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Collect integer part digits and convert to rescaled double. */[m
[31m-    {[m
[31m-      uint64_t x = xi[hi];[m
[31m-      uint32_t i;[m
[31m-      for (i = DNEXT(hi); --idig > 0 && i != lo; i = DNEXT(i))[m
[31m-	x = x * 100 + xi[i];[m
[31m-      if (i == lo) {[m
[31m-	while (--idig >= 0) x = x * 100;[m
[31m-      } else {  /* Gather round bit from remaining digits. */[m
[31m-	x <<= 1; ex2--;[m
[31m-	do {[m
[31m-	  if (xi[i]) { x |= 1; break; }[m
[31m-	  i = DNEXT(i);[m
[31m-	} while (i != lo);[m
[31m-      }[m
[31m-      strscan_double(x, o, ex2, neg);[m
[31m-    }[m
[31m-  }[m
[31m-  return fmt;[m
[31m-}[m
[31m-[m
[31m-/* Parse binary number. */[m
[31m-static StrScanFmt strscan_bin(const uint8_t *p, TValue *o,[m
[31m-			      StrScanFmt fmt, uint32_t opt,[m
[31m-			      int32_t ex2, int32_t neg, uint32_t dig)[m
[31m-{[m
[31m-  uint64_t x = 0;[m
[31m-  uint32_t i;[m
[31m-[m
[31m-  if (ex2 || dig > 64) return STRSCAN_ERROR;[m
[31m-[m
[31m-  /* Scan binary digits. */[m
[31m-  for (i = dig; i; i--, p++) {[m
[31m-    if ((*p & ~1) != '0') return STRSCAN_ERROR;[m
[31m-    x = (x << 1) | (*p & 1);[m
[31m-  }[m
[31m-[m
[31m-  /* Format-specific handling. */[m
[31m-  switch (fmt) {[m
[31m-  case STRSCAN_INT:[m
[31m-    if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {[m
[31m-      o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-      return STRSCAN_INT;  /* Fast path for 32 bit integers. */[m
[31m-    }[m
[31m-    if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; break; }[m
[31m-    /* fallthrough */[m
[31m-  case STRSCAN_U32:[m
[31m-    if (dig > 32) return STRSCAN_ERROR;[m
[31m-    o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-    return STRSCAN_U32;[m
[31m-  case STRSCAN_I64:[m
[31m-  case STRSCAN_U64:[m
[31m-    o->u64 = neg ? (uint64_t)-(int64_t)x : x;[m
[31m-    return fmt;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  /* Reduce range, then convert to double. */[m
[31m-  if ((x & U64x(c0000000,0000000))) { x = (x >> 2) | (x & 3); ex2 += 2; }[m
[31m-  strscan_double(x, o, ex2, neg);[m
[31m-  return fmt;[m
[31m-}[m
[31m-[m
[31m-/* Scan string containing a number. Returns format. Returns value in o. */[m
[31m-StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt)[m
[31m-{[m
[31m-  int32_t neg = 0;[m
[31m-[m
[31m-  /* Remove leading space, parse sign and non-numbers. */[m
[31m-  if (LJ_UNLIKELY(!lj_char_isdigit(*p))) {[m
[31m-    while (lj_char_isspace(*p)) p++;[m
[31m-    if (*p == '+' || *p == '-') neg = (*p++ == '-');[m
[31m-    if (LJ_UNLIKELY(*p >= 'A')) {  /* Parse "inf", "infinity" or "nan". */[m
[31m-      TValue tmp;[m
[31m-      setnanV(&tmp);[m
[31m-      if (casecmp(p[0],'i') && casecmp(p[1],'n') && casecmp(p[2],'f')) {[m
[31m-	if (neg) setminfV(&tmp); else setpinfV(&tmp);[m
[31m-	p += 3;[m
[31m-	if (casecmp(p[0],'i') && casecmp(p[1],'n') && casecmp(p[2],'i') &&[m
[31m-	    casecmp(p[3],'t') && casecmp(p[4],'y')) p += 5;[m
[31m-      } else if (casecmp(p[0],'n') && casecmp(p[1],'a') && casecmp(p[2],'n')) {[m
[31m-	p += 3;[m
[31m-      }[m
[31m-      while (lj_char_isspace(*p)) p++;[m
[31m-      if (*p) return STRSCAN_ERROR;[m
[31m-      o->u64 = tmp.u64;[m
[31m-      return STRSCAN_NUM;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Parse regular number. */[m
[31m-  {[m
[31m-    StrScanFmt fmt = STRSCAN_INT;[m
[31m-    int cmask = LJ_CHAR_DIGIT;[m
[31m-    int base = (opt & STRSCAN_OPT_C) && *p == '0' ? 0 : 10;[m
[31m-    const uint8_t *sp, *dp = NULL;[m
[31m-    uint32_t dig = 0, hasdig = 0, x = 0;[m
[31m-    int32_t ex = 0;[m
[31m-[m
[31m-    /* Determine base and skip leading zeros. */[m
[31m-    if (LJ_UNLIKELY(*p <= '0')) {[m
[31m-      if (*p == '0') {[m
[31m-	if (casecmp(p[1], 'x'))[m
[31m-	  base = 16, cmask = LJ_CHAR_XDIGIT, p += 2;[m
[31m-	else if (casecmp(p[1], 'b'))[m
[31m-	  base = 2, cmask = LJ_CHAR_DIGIT, p += 2;[m
[31m-      }[m
[31m-      for ( ; ; p++) {[m
[31m-	if (*p == '0') {[m
[31m-	  hasdig = 1;[m
[31m-	} else if (*p == '.') {[m
[31m-	  if (dp) return STRSCAN_ERROR;[m
[31m-	  dp = p;[m
[31m-	} else {[m
[31m-	  break;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Preliminary digit and decimal point scan. */[m
[31m-    for (sp = p; ; p++) {[m
[31m-      if (LJ_LIKELY(lj_char_isa(*p, cmask))) {[m
[31m-	x = x * 10 + (*p & 15);  /* For fast path below. */[m
[31m-	dig++;[m
[31m-      } else if (*p == '.') {[m
[31m-	if (dp) return STRSCAN_ERROR;[m
[31m-	dp = p;[m
[31m-      } else {[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!(hasdig | dig)) return STRSCAN_ERROR;[m
[31m-[m
[31m-    /* Handle decimal point. */[m
[31m-    if (dp) {[m
[31m-      fmt = STRSCAN_NUM;[m
[31m-      if (dig) {[m
[31m-	ex = (int32_t)(dp-(p-1)); dp = p-1;[m
[31m-	while (ex < 0 && *dp-- == '0') ex++, dig--;  /* Skip trailing zeros. */[m
[31m-	if (base == 16) ex *= 4;[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Parse exponent. */[m
[31m-    if (base >= 10 && casecmp(*p, (uint32_t)(base == 16 ? 'p' : 'e'))) {[m
[31m-      uint32_t xx;[m
[31m-      int negx = 0;[m
[31m-      fmt = STRSCAN_NUM; p++;[m
[31m-      if (*p == '+' || *p == '-') negx = (*p++ == '-');[m
[31m-      if (!lj_char_isdigit(*p)) return STRSCAN_ERROR;[m
[31m-      xx = (*p++ & 15);[m
[31m-      while (lj_char_isdigit(*p)) {[m
[31m-	if (xx < 65536) xx = xx * 10 + (*p & 15);[m
[31m-	p++;[m
[31m-      }[m
[31m-      ex += negx ? -(int32_t)xx : (int32_t)xx;[m
[31m-    }[m
[31m-[m
[31m-    /* Parse suffix. */[m
[31m-    if (*p) {[m
[31m-      /* I (IMAG), U (U32), LL (I64), ULL/LLU (U64), L (long), UL/LU (ulong). */[m
[31m-      /* NYI: f (float). Not needed until cp_number() handles non-integers. */[m
[31m-      if (casecmp(*p, 'i')) {[m
[31m-	if (!(opt & STRSCAN_OPT_IMAG)) return STRSCAN_ERROR;[m
[31m-	p++; fmt = STRSCAN_IMAG;[m
[31m-      } else if (fmt == STRSCAN_INT) {[m
[31m-	if (casecmp(*p, 'u')) p++, fmt = STRSCAN_U32;[m
[31m-	if (casecmp(*p, 'l')) {[m
[31m-	  p++;[m
[31m-	  if (casecmp(*p, 'l')) p++, fmt += STRSCAN_I64 - STRSCAN_INT;[m
[31m-	  else if (!(opt & STRSCAN_OPT_C)) return STRSCAN_ERROR;[m
[31m-	  else if (sizeof(long) == 8) fmt += STRSCAN_I64 - STRSCAN_INT;[m
[31m-	}[m
[31m-	if (casecmp(*p, 'u') && (fmt == STRSCAN_INT || fmt == STRSCAN_I64))[m
[31m-	  p++, fmt += STRSCAN_U32 - STRSCAN_INT;[m
[31m-	if ((fmt == STRSCAN_U32 && !(opt & STRSCAN_OPT_C)) ||[m
[31m-	    (fmt >= STRSCAN_I64 && !(opt & STRSCAN_OPT_LL)))[m
[31m-	  return STRSCAN_ERROR;[m
[31m-      }[m
[31m-      while (lj_char_isspace(*p)) p++;[m
[31m-      if (*p) return STRSCAN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* Fast path for decimal 32 bit integers. */[m
[31m-    if (fmt == STRSCAN_INT && base == 10 &&[m
[31m-	(dig < 10 || (dig == 10 && *sp <= '2' && x < 0x80000000u+neg))) {[m
[31m-      int32_t y = neg ? -(int32_t)x : (int32_t)x;[m
[31m-      if ((opt & STRSCAN_OPT_TONUM)) {[m
[31m-	o->n = (double)y;[m
[31m-	return STRSCAN_NUM;[m
[31m-      } else {[m
[31m-	o->i = y;[m
[31m-	return STRSCAN_INT;[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Dispatch to base-specific parser. */[m
[31m-    if (base == 0 && !(fmt == STRSCAN_NUM || fmt == STRSCAN_IMAG))[m
[31m-      return strscan_oct(sp, o, fmt, neg, dig);[m
[31m-    if (base == 16)[m
[31m-      fmt = strscan_hex(sp, o, fmt, opt, ex, neg, dig);[m
[31m-    else if (base == 2)[m
[31m-      fmt = strscan_bin(sp, o, fmt, opt, ex, neg, dig);[m
[31m-    else[m
[31m-      fmt = strscan_dec(sp, o, fmt, opt, ex, neg, dig);[m
[31m-[m
[31m-    /* Try to convert number to integer, if requested. */[m
[31m-    if (fmt == STRSCAN_NUM && (opt & STRSCAN_OPT_TOINT)) {[m
[31m-      double n = o->n;[m
[31m-      int32_t i = lj_num2int(n);[m
[31m-      if (n == (lua_Number)i) { o->i = i; return STRSCAN_INT; }[m
[31m-    }[m
[31m-    return fmt;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o)[m
[31m-{[m
[31m-  StrScanFmt fmt = lj_strscan_scan((const uint8_t *)strdata(str), o,[m
[31m-				   STRSCAN_OPT_TONUM);[m
[31m-  lua_assert(fmt == STRSCAN_ERROR || fmt == STRSCAN_NUM);[m
[31m-  return (fmt != STRSCAN_ERROR);[m
[31m-}[m
[31m-[m
[31m-#if LJ_DUALNUM[m
[31m-int LJ_FASTCALL lj_strscan_number(GCstr *str, TValue *o)[m
[31m-{[m
[31m-  StrScanFmt fmt = lj_strscan_scan((const uint8_t *)strdata(str), o,[m
[31m-				   STRSCAN_OPT_TOINT);[m
[31m-  lua_assert(fmt == STRSCAN_ERROR || fmt == STRSCAN_NUM || fmt == STRSCAN_INT);[m
[31m-  if (fmt == STRSCAN_INT) setitype(o, LJ_TISNUM);[m
[31m-  return (fmt != STRSCAN_ERROR);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#undef DNEXT[m
[31m-#undef DPREV[m
[31m-#undef DLEN[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.h[m
[1mdeleted file mode 100644[m
[1mindex b3ee9e5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_strscan.h[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-/*[m
[31m-** String scanning.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_STRSCAN_H[m
[31m-#define _LJ_STRSCAN_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Options for accepted/returned formats. */[m
[31m-#define STRSCAN_OPT_TOINT	0x01  /* Convert to int32_t, if possible. */[m
[31m-#define STRSCAN_OPT_TONUM	0x02  /* Always convert to double. */[m
[31m-#define STRSCAN_OPT_IMAG	0x04[m
[31m-#define STRSCAN_OPT_LL		0x08[m
[31m-#define STRSCAN_OPT_C		0x10[m
[31m-[m
[31m-/* Returned format. */[m
[31m-typedef enum {[m
[31m-  STRSCAN_ERROR,[m
[31m-  STRSCAN_NUM, STRSCAN_IMAG,[m
[31m-  STRSCAN_INT, STRSCAN_U32, STRSCAN_I64, STRSCAN_U64,[m
[31m-} StrScanFmt;[m
[31m-[m
[31m-LJ_FUNC StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt);[m
[31m-LJ_FUNC int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o);[m
[31m-#if LJ_DUALNUM[m
[31m-LJ_FUNC int LJ_FASTCALL lj_strscan_number(GCstr *str, TValue *o);[m
[31m-#else[m
[31m-#define lj_strscan_number(s, o)		lj_strscan_num((s), (o))[m
[31m-#endif[m
[31m-[m
[31m-/* Check for number or convert string to number/int in-place (!). */[m
[31m-static LJ_AINLINE int lj_strscan_numberobj(TValue *o)[m
[31m-{[m
[31m-  return tvisnumber(o) || (tvisstr(o) && lj_strscan_number(strV(o), o));[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.c[m
[1mdeleted file mode 100644[m
[1mindex 8011212..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.c[m
[1m+++ /dev/null[m
[36m@@ -1,666 +0,0 @@[m
[31m-/*[m
[31m-** Table handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_tab_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-[m
[31m-/* -- Object hashing ------------------------------------------------------ */[m
[31m-[m
[31m-/* Hash values are masked with the table hash mask and used as an index. */[m
[31m-static LJ_AINLINE Node *hashmask(const GCtab *t, uint32_t hash)[m
[31m-{[m
[31m-  Node *n = noderef(t->node);[m
[31m-  return &n[hash & t->hmask];[m
[31m-}[m
[31m-[m
[31m-/* String hashes are precomputed when they are interned. */[m
[31m-#define hashstr(t, s)		hashmask(t, (s)->hash)[m
[31m-[m
[31m-#define hashlohi(t, lo, hi)	hashmask((t), hashrot((lo), (hi)))[m
[31m-#define hashnum(t, o)		hashlohi((t), (o)->u32.lo, ((o)->u32.hi << 1))[m
[31m-#define hashptr(t, p)		hashlohi((t), u32ptr(p), u32ptr(p) + HASH_BIAS)[m
[31m-#if LJ_GC64[m
[31m-#define hashgcref(t, r) \[m
[31m-  hashlohi((t), (uint32_t)gcrefu(r), (uint32_t)(gcrefu(r) >> 32))[m
[31m-#else[m
[31m-#define hashgcref(t, r)		hashlohi((t), gcrefu(r), gcrefu(r) + HASH_BIAS)[m
[31m-#endif[m
[31m-[m
[31m-/* Hash an arbitrary key and return its anchor position in the hash table. */[m
[31m-static Node *hashkey(const GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  lua_assert(!tvisint(key));[m
[31m-  if (tvisstr(key))[m
[31m-    return hashstr(t, strV(key));[m
[31m-  else if (tvisnum(key))[m
[31m-    return hashnum(t, key);[m
[31m-  else if (tvisbool(key))[m
[31m-    return hashmask(t, boolV(key));[m
[31m-  else[m
[31m-    return hashgcref(t, key->gcr);[m
[31m-  /* Only hash 32 bits of lightuserdata on a 64 bit CPU. Good enough? */[m
[31m-}[m
[31m-[m
[31m-/* -- Table creation and destruction -------------------------------------- */[m
[31m-[m
[31m-/* Create new hash part for table. */[m
[31m-static LJ_AINLINE void newhpart(lua_State *L, GCtab *t, uint32_t hbits)[m
[31m-{[m
[31m-  uint32_t hsize;[m
[31m-  Node *node;[m
[31m-  lua_assert(hbits != 0);[m
[31m-  if (hbits > LJ_MAX_HBITS)[m
[31m-    lj_err_msg(L, LJ_ERR_TABOV);[m
[31m-  hsize = 1u << hbits;[m
[31m-  node = lj_mem_newvec(L, hsize, Node);[m
[31m-  setmref(t->node, node);[m
[31m-  setfreetop(t, node, &node[hsize]);[m
[31m-  t->hmask = hsize-1;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** Q: Why all of these copies of t->hmask, t->node etc. to local variables?[m
[31m-** A: Because alias analysis for C is _really_ tough.[m
[31m-**    Even state-of-the-art C compilers won't produce good code without this.[m
[31m-*/[m
[31m-[m
[31m-/* Clear hash part of table. */[m
[31m-static LJ_AINLINE void clearhpart(GCtab *t)[m
[31m-{[m
[31m-  uint32_t i, hmask = t->hmask;[m
[31m-  Node *node = noderef(t->node);[m
[31m-  lua_assert(t->hmask != 0);[m
[31m-  for (i = 0; i <= hmask; i++) {[m
[31m-    Node *n = &node[i];[m
[31m-    setmref(n->next, NULL);[m
[31m-    setnilV(&n->key);[m
[31m-    setnilV(&n->val);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Clear array part of table. */[m
[31m-static LJ_AINLINE void clearapart(GCtab *t)[m
[31m-{[m
[31m-  uint32_t i, asize = t->asize;[m
[31m-  TValue *array = tvref(t->array);[m
[31m-  for (i = 0; i < asize; i++)[m
[31m-    setnilV(&array[i]);[m
[31m-}[m
[31m-[m
[31m-/* Create a new table. Note: the slots are not initialized (yet). */[m
[31m-static GCtab *newtab(lua_State *L, uint32_t asize, uint32_t hbits)[m
[31m-{[m
[31m-  GCtab *t;[m
[31m-  /* First try to colocate the array part. */[m
[31m-  if (LJ_MAX_COLOSIZE != 0 && asize > 0 && asize <= LJ_MAX_COLOSIZE) {[m
[31m-    Node *nilnode;[m
[31m-    lua_assert((sizeof(GCtab) & 7) == 0);[m
[31m-    t = (GCtab *)lj_mem_newgco(L, sizetabcolo(asize));[m
[31m-    t->gct = ~LJ_TTAB;[m
[31m-    t->nomm = (uint8_t)~0;[m
[31m-    t->colo = (int8_t)asize;[m
[31m-    setmref(t->array, (TValue *)((char *)t + sizeof(GCtab)));[m
[31m-    setgcrefnull(t->metatable);[m
[31m-    t->asize = asize;[m
[31m-    t->hmask = 0;[m
[31m-    nilnode = &G(L)->nilnode;[m
[31m-    setmref(t->node, nilnode);[m
[31m-#if LJ_GC64[m
[31m-    setmref(t->freetop, nilnode);[m
[31m-#endif[m
[31m-  } else {  /* Otherwise separately allocate the array part. */[m
[31m-    Node *nilnode;[m
[31m-    t = lj_mem_newobj(L, GCtab);[m
[31m-    t->gct = ~LJ_TTAB;[m
[31m-    t->nomm = (uint8_t)~0;[m
[31m-    t->colo = 0;[m
[31m-    setmref(t->array, NULL);[m
[31m-    setgcrefnull(t->metatable);[m
[31m-    t->asize = 0;  /* In case the array allocation fails. */[m
[31m-    t->hmask = 0;[m
[31m-    nilnode = &G(L)->nilnode;[m
[31m-    setmref(t->node, nilnode);[m
[31m-#if LJ_GC64[m
[31m-    setmref(t->freetop, nilnode);[m
[31m-#endif[m
[31m-    if (asize > 0) {[m
[31m-      if (asize > LJ_MAX_ASIZE)[m
[31m-	lj_err_msg(L, LJ_ERR_TABOV);[m
[31m-      setmref(t->array, lj_mem_newvec(L, asize, TValue));[m
[31m-      t->asize = asize;[m
[31m-    }[m
[31m-  }[m
[31m-  if (hbits)[m
[31m-    newhpart(L, t, hbits);[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* Create a new table.[m
[31m-**[m
[31m-** IMPORTANT NOTE: The API differs from lua_createtable()![m
[31m-**[m
[31m-** The array size is non-inclusive. E.g. asize=128 creates array slots[m
[31m-** for 0..127, but not for 128. If you need slots 1..128, pass asize=129[m
[31m-** (slot 0 is wasted in this case).[m
[31m-**[m
[31m-** The hash size is given in hash bits. hbits=0 means no hash part.[m
[31m-** hbits=1 creates 2 hash slots, hbits=2 creates 4 hash slots and so on.[m
[31m-*/[m
[31m-GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits)[m
[31m-{[m
[31m-  GCtab *t = newtab(L, asize, hbits);[m
[31m-  clearapart(t);[m
[31m-  if (t->hmask > 0) clearhpart(t);[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* The API of this function conforms to lua_createtable(). */[m
[31m-GCtab *lj_tab_new_ah(lua_State *L, int32_t a, int32_t h)[m
[31m-{[m
[31m-  return lj_tab_new(L, (uint32_t)(a > 0 ? a+1 : 0), hsize2hbits(h));[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize)[m
[31m-{[m
[31m-  GCtab *t = newtab(L, ahsize & 0xffffff, ahsize >> 24);[m
[31m-  clearapart(t);[m
[31m-  if (t->hmask > 0) clearhpart(t);[m
[31m-  return t;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Duplicate a table. */[m
[31m-GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt)[m
[31m-{[m
[31m-  GCtab *t;[m
[31m-  uint32_t asize, hmask;[m
[31m-  t = newtab(L, kt->asize, kt->hmask > 0 ? lj_fls(kt->hmask)+1 : 0);[m
[31m-  lua_assert(kt->asize == t->asize && kt->hmask == t->hmask);[m
[31m-  t->nomm = 0;  /* Keys with metamethod names may be present. */[m
[31m-  asize = kt->asize;[m
[31m-  if (asize > 0) {[m
[31m-    TValue *array = tvref(t->array);[m
[31m-    TValue *karray = tvref(kt->array);[m
[31m-    if (asize < 64) {  /* An inlined loop beats memcpy for < 512 bytes. */[m
[31m-      uint32_t i;[m
[31m-      for (i = 0; i < asize; i++)[m
[31m-	copyTV(L, &array[i], &karray[i]);[m
[31m-    } else {[m
[31m-      memcpy(array, karray, asize*sizeof(TValue));[m
[31m-    }[m
[31m-  }[m
[31m-  hmask = kt->hmask;[m
[31m-  if (hmask > 0) {[m
[31m-    uint32_t i;[m
[31m-    Node *node = noderef(t->node);[m
[31m-    Node *knode = noderef(kt->node);[m
[31m-    ptrdiff_t d = (char *)node - (char *)knode;[m
[31m-    setfreetop(t, node, (Node *)((char *)getfreetop(kt, knode) + d));[m
[31m-    for (i = 0; i <= hmask; i++) {[m
[31m-      Node *kn = &knode[i];[m
[31m-      Node *n = &node[i];[m
[31m-      Node *next = nextnode(kn);[m
[31m-      /* Don't use copyTV here, since it asserts on a copy of a dead key. */[m
[31m-      n->val = kn->val; n->key = kn->key;[m
[31m-      setmref(n->next, next == NULL? next : (Node *)((char *)next + d));[m
[31m-    }[m
[31m-  }[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* Clear a table. */[m
[31m-void LJ_FASTCALL lj_tab_clear(GCtab *t)[m
[31m-{[m
[31m-  clearapart(t);[m
[31m-  if (t->hmask > 0) {[m
[31m-    Node *node = noderef(t->node);[m
[31m-    setfreetop(t, node, &node[t->hmask+1]);[m
[31m-    clearhpart(t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free a table. */[m
[31m-void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t)[m
[31m-{[m
[31m-  if (t->hmask > 0)[m
[31m-    lj_mem_freevec(g, noderef(t->node), t->hmask+1, Node);[m
[31m-  if (t->asize > 0 && LJ_MAX_COLOSIZE != 0 && t->colo <= 0)[m
[31m-    lj_mem_freevec(g, tvref(t->array), t->asize, TValue);[m
[31m-  if (LJ_MAX_COLOSIZE != 0 && t->colo)[m
[31m-    lj_mem_free(g, t, sizetabcolo((uint32_t)t->colo & 0x7f));[m
[31m-  else[m
[31m-    lj_mem_freet(g, t);[m
[31m-}[m
[31m-[m
[31m-/* -- Table resizing ------------------------------------------------------ */[m
[31m-[m
[31m-/* Resize a table to fit the new array/hash part sizes. */[m
[31m-void lj_tab_resize(lua_State *L, GCtab *t, uint32_t asize, uint32_t hbits)[m
[31m-{[m
[31m-  Node *oldnode = noderef(t->node);[m
[31m-  uint32_t oldasize = t->asize;[m
[31m-  uint32_t oldhmask = t->hmask;[m
[31m-  if (asize > oldasize) {  /* Array part grows? */[m
[31m-    TValue *array;[m
[31m-    uint32_t i;[m
[31m-    if (asize > LJ_MAX_ASIZE)[m
[31m-      lj_err_msg(L, LJ_ERR_TABOV);[m
[31m-    if (LJ_MAX_COLOSIZE != 0 && t->colo > 0) {[m
[31m-      /* A colocated array must be separated and copied. */[m
[31m-      TValue *oarray = tvref(t->array);[m
[31m-      array = lj_mem_newvec(L, asize, TValue);[m
[31m-      t->colo = (int8_t)(t->colo | 0x80);  /* Mark as separated (colo < 0). */[m
[31m-      for (i = 0; i < oldasize; i++)[m
[31m-	copyTV(L, &array[i], &oarray[i]);[m
[31m-    } else {[m
[31m-      array = (TValue *)lj_mem_realloc(L, tvref(t->array),[m
[31m-			  oldasize*sizeof(TValue), asize*sizeof(TValue));[m
[31m-    }[m
[31m-    setmref(t->array, array);[m
[31m-    t->asize = asize;[m
[31m-    for (i = oldasize; i < asize; i++)  /* Clear newly allocated slots. */[m
[31m-      setnilV(&array[i]);[m
[31m-  }[m
[31m-  /* Create new (empty) hash part. */[m
[31m-  if (hbits) {[m
[31m-    newhpart(L, t, hbits);[m
[31m-    clearhpart(t);[m
[31m-  } else {[m
[31m-    global_State *g = G(L);[m
[31m-    setmref(t->node, &g->nilnode);[m
[31m-#if LJ_GC64[m
[31m-    setmref(t->freetop, &g->nilnode);[m
[31m-#endif[m
[31m-    t->hmask = 0;[m
[31m-  }[m
[31m-  if (asize < oldasize) {  /* Array part shrinks? */[m
[31m-    TValue *array = tvref(t->array);[m
[31m-    uint32_t i;[m
[31m-    t->asize = asize;  /* Note: This 'shrinks' even colocated arrays. */[m
[31m-    for (i = asize; i < oldasize; i++)  /* Reinsert old array values. */[m
[31m-      if (!tvisnil(&array[i]))[m
[31m-	copyTV(L, lj_tab_setinth(L, t, (int32_t)i), &array[i]);[m
[31m-    /* Physically shrink only separated arrays. */[m
[31m-    if (LJ_MAX_COLOSIZE != 0 && t->colo <= 0)[m
[31m-      setmref(t->array, lj_mem_realloc(L, array,[m
[31m-	      oldasize*sizeof(TValue), asize*sizeof(TValue)));[m
[31m-  }[m
[31m-  if (oldhmask > 0) {  /* Reinsert pairs from old hash part. */[m
[31m-    global_State *g;[m
[31m-    uint32_t i;[m
[31m-    for (i = 0; i <= oldhmask; i++) {[m
[31m-      Node *n = &oldnode[i];[m
[31m-      if (!tvisnil(&n->val))[m
[31m-	copyTV(L, lj_tab_set(L, t, &n->key), &n->val);[m
[31m-    }[m
[31m-    g = G(L);[m
[31m-    lj_mem_freevec(g, oldnode, oldhmask+1, Node);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static uint32_t countint(cTValue *key, uint32_t *bins)[m
[31m-{[m
[31m-  lua_assert(!tvisint(key));[m
[31m-  if (tvisnum(key)) {[m
[31m-    lua_Number nk = numV(key);[m
[31m-    int32_t k = lj_num2int(nk);[m
[31m-    if ((uint32_t)k < LJ_MAX_ASIZE && nk == (lua_Number)k) {[m
[31m-      bins[(k > 2 ? lj_fls((uint32_t)(k-1)) : 0)]++;[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static uint32_t countarray(const GCtab *t, uint32_t *bins)[m
[31m-{[m
[31m-  uint32_t na, b, i;[m
[31m-  if (t->asize == 0) return 0;[m
[31m-  for (na = i = b = 0; b < LJ_MAX_ABITS; b++) {[m
[31m-    uint32_t n, top = 2u << b;[m
[31m-    TValue *array;[m
[31m-    if (top >= t->asize) {[m
[31m-      top = t->asize-1;[m
[31m-      if (i > top)[m
[31m-	break;[m
[31m-    }[m
[31m-    array = tvref(t->array);[m
[31m-    for (n = 0; i <= top; i++)[m
[31m-      if (!tvisnil(&array[i]))[m
[31m-	n++;[m
[31m-    bins[b] += n;[m
[31m-    na += n;[m
[31m-  }[m
[31m-  return na;[m
[31m-}[m
[31m-[m
[31m-static uint32_t counthash(const GCtab *t, uint32_t *bins, uint32_t *narray)[m
[31m-{[m
[31m-  uint32_t total, na, i, hmask = t->hmask;[m
[31m-  Node *node = noderef(t->node);[m
[31m-  for (total = na = 0, i = 0; i <= hmask; i++) {[m
[31m-    Node *n = &node[i];[m
[31m-    if (!tvisnil(&n->val)) {[m
[31m-      na += countint(&n->key, bins);[m
[31m-      total++;[m
[31m-    }[m
[31m-  }[m
[31m-  *narray += na;[m
[31m-  return total;[m
[31m-}[m
[31m-[m
[31m-static uint32_t bestasize(uint32_t bins[], uint32_t *narray)[m
[31m-{[m
[31m-  uint32_t b, sum, na = 0, sz = 0, nn = *narray;[m
[31m-  for (b = 0, sum = 0; 2*nn > (1u<<b) && sum != nn; b++)[m
[31m-    if (bins[b] > 0 && 2*(sum += bins[b]) > (1u<<b)) {[m
[31m-      sz = (2u<<b)+1;[m
[31m-      na = sum;[m
[31m-    }[m
[31m-  *narray = sz;[m
[31m-  return na;[m
[31m-}[m
[31m-[m
[31m-static void rehashtab(lua_State *L, GCtab *t, cTValue *ek)[m
[31m-{[m
[31m-  uint32_t bins[LJ_MAX_ABITS];[m
[31m-  uint32_t total, asize, na, i;[m
[31m-  for (i = 0; i < LJ_MAX_ABITS; i++) bins[i] = 0;[m
[31m-  asize = countarray(t, bins);[m
[31m-  total = 1 + asize;[m
[31m-  total += counthash(t, bins, &asize);[m
[31m-  asize += countint(ek, bins);[m
[31m-  na = bestasize(bins, &asize);[m
[31m-  total -= na;[m
[31m-  lj_tab_resize(L, t, asize, hsize2hbits(total));[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-void lj_tab_rehash(lua_State *L, GCtab *t)[m
[31m-{[m
[31m-  rehashtab(L, t, niltv(L));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize)[m
[31m-{[m
[31m-  lj_tab_resize(L, t, nasize+1, t->hmask > 0 ? lj_fls(t->hmask)+1 : 0);[m
[31m-}[m
[31m-[m
[31m-/* -- Table getters ------------------------------------------------------- */[m
[31m-[m
[31m-cTValue * LJ_FASTCALL lj_tab_getinth(GCtab *t, int32_t key)[m
[31m-{[m
[31m-  TValue k;[m
[31m-  Node *n;[m
[31m-  k.n = (lua_Number)key;[m
[31m-  n = hashnum(t, &k);[m
[31m-  do {[m
[31m-    if (tvisnum(&n->key) && n->key.n == k.n)[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-cTValue *lj_tab_getstr(GCtab *t, GCstr *key)[m
[31m-{[m
[31m-  Node *n = hashstr(t, key);[m
[31m-  do {[m
[31m-    if (tvisstr(&n->key) && strV(&n->key) == key)[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-cTValue *lj_tab_get(lua_State *L, GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  if (tvisstr(key)) {[m
[31m-    cTValue *tv = lj_tab_getstr(t, strV(key));[m
[31m-    if (tv)[m
[31m-      return tv;[m
[31m-  } else if (tvisint(key)) {[m
[31m-    cTValue *tv = lj_tab_getint(t, intV(key));[m
[31m-    if (tv)[m
[31m-      return tv;[m
[31m-  } else if (tvisnum(key)) {[m
[31m-    lua_Number nk = numV(key);[m
[31m-    int32_t k = lj_num2int(nk);[m
[31m-    if (nk == (lua_Number)k) {[m
[31m-      cTValue *tv = lj_tab_getint(t, k);[m
[31m-      if (tv)[m
[31m-	return tv;[m
[31m-    } else {[m
[31m-      goto genlookup;  /* Else use the generic lookup. */[m
[31m-    }[m
[31m-  } else if (!tvisnil(key)) {[m
[31m-    Node *n;[m
[31m-  genlookup:[m
[31m-    n = hashkey(t, key);[m
[31m-    do {[m
[31m-      if (lj_obj_equal(&n->key, key))[m
[31m-	return &n->val;[m
[31m-    } while ((n = nextnode(n)));[m
[31m-  }[m
[31m-  return niltv(L);[m
[31m-}[m
[31m-[m
[31m-/* -- Table setters ------------------------------------------------------- */[m
[31m-[m
[31m-/* Insert new key. Use Brent's variation to optimize the chain length. */[m
[31m-TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  Node *n = hashkey(t, key);[m
[31m-  if (!tvisnil(&n->val) || t->hmask == 0) {[m
[31m-    Node *nodebase = noderef(t->node);[m
[31m-    Node *collide, *freenode = getfreetop(t, nodebase);[m
[31m-    lua_assert(freenode >= nodebase && freenode <= nodebase+t->hmask+1);[m
[31m-    do {[m
[31m-      if (freenode == nodebase) {  /* No free node found? */[m
[31m-	rehashtab(L, t, key);  /* Rehash table. */[m
[31m-	return lj_tab_set(L, t, key);  /* Retry key insertion. */[m
[31m-      }[m
[31m-    } while (!tvisnil(&(--freenode)->key));[m
[31m-    setfreetop(t, nodebase, freenode);[m
[31m-    lua_assert(freenode != &G(L)->nilnode);[m
[31m-    collide = hashkey(t, &n->key);[m
[31m-    if (collide != n) {  /* Colliding node not the main node? */[m
[31m-      while (noderef(collide->next) != n)  /* Find predecessor. */[m
[31m-	collide = nextnode(collide);[m
[31m-      setmref(collide->next, freenode);  /* Relink chain. */[m
[31m-      /* Copy colliding node into free node and free main node. */[m
[31m-      freenode->val = n->val;[m
[31m-      freenode->key = n->key;[m
[31m-      freenode->next = n->next;[m
[31m-      setmref(n->next, NULL);[m
[31m-      setnilV(&n->val);[m
[31m-      /* Rechain pseudo-resurrected string keys with colliding hashes. */[m
[31m-      while (nextnode(freenode)) {[m
[31m-	Node *nn = nextnode(freenode);[m
[31m-	if (tvisstr(&nn->key) && !tvisnil(&nn->val) &&[m
[31m-	    hashstr(t, strV(&nn->key)) == n) {[m
[31m-	  freenode->next = nn->next;[m
[31m-	  nn->next = n->next;[m
[31m-	  setmref(n->next, nn);[m
[31m-	} else {[m
[31m-	  freenode = nn;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {  /* Otherwise use free node. */[m
[31m-      setmrefr(freenode->next, n->next);  /* Insert into chain. */[m
[31m-      setmref(n->next, freenode);[m
[31m-      n = freenode;[m
[31m-    }[m
[31m-  }[m
[31m-  n->key.u64 = key->u64;[m
[31m-  if (LJ_UNLIKELY(tvismzero(&n->key)))[m
[31m-    n->key.u64 = 0;[m
[31m-  lj_gc_anybarriert(L, t);[m
[31m-  lua_assert(tvisnil(&n->val));[m
[31m-  return &n->val;[m
[31m-}[m
[31m-[m
[31m-TValue *lj_tab_setinth(lua_State *L, GCtab *t, int32_t key)[m
[31m-{[m
[31m-  TValue k;[m
[31m-  Node *n;[m
[31m-  k.n = (lua_Number)key;[m
[31m-  n = hashnum(t, &k);[m
[31m-  do {[m
[31m-    if (tvisnum(&n->key) && n->key.n == k.n)[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  return lj_tab_newkey(L, t, &k);[m
[31m-}[m
[31m-[m
[31m-TValue *lj_tab_setstr(lua_State *L, GCtab *t, GCstr *key)[m
[31m-{[m
[31m-  TValue k;[m
[31m-  Node *n = hashstr(t, key);[m
[31m-  do {[m
[31m-    if (tvisstr(&n->key) && strV(&n->key) == key)[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  setstrV(L, &k, key);[m
[31m-  return lj_tab_newkey(L, t, &k);[m
[31m-}[m
[31m-[m
[31m-TValue *lj_tab_set(lua_State *L, GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  Node *n;[m
[31m-  t->nomm = 0;  /* Invalidate negative metamethod cache. */[m
[31m-  if (tvisstr(key)) {[m
[31m-    return lj_tab_setstr(L, t, strV(key));[m
[31m-  } else if (tvisint(key)) {[m
[31m-    return lj_tab_setint(L, t, intV(key));[m
[31m-  } else if (tvisnum(key)) {[m
[31m-    lua_Number nk = numV(key);[m
[31m-    int32_t k = lj_num2int(nk);[m
[31m-    if (nk == (lua_Number)k)[m
[31m-      return lj_tab_setint(L, t, k);[m
[31m-    if (tvisnan(key))[m
[31m-      lj_err_msg(L, LJ_ERR_NANIDX);[m
[31m-    /* Else use the generic lookup. */[m
[31m-  } else if (tvisnil(key)) {[m
[31m-    lj_err_msg(L, LJ_ERR_NILIDX);[m
[31m-  }[m
[31m-  n = hashkey(t, key);[m
[31m-  do {[m
[31m-    if (lj_obj_equal(&n->key, key))[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  return lj_tab_newkey(L, t, key);[m
[31m-}[m
[31m-[m
[31m-/* -- Table traversal ----------------------------------------------------- */[m
[31m-[m
[31m-/* Get the traversal index of a key. */[m
[31m-static uint32_t keyindex(lua_State *L, GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  TValue tmp;[m
[31m-  if (tvisint(key)) {[m
[31m-    int32_t k = intV(key);[m
[31m-    if ((uint32_t)k < t->asize)[m
[31m-      return (uint32_t)k;  /* Array key indexes: [0..t->asize-1] */[m
[31m-    setnumV(&tmp, (lua_Number)k);[m
[31m-    key = &tmp;[m
[31m-  } else if (tvisnum(key)) {[m
[31m-    lua_Number nk = numV(key);[m
[31m-    int32_t k = lj_num2int(nk);[m
[31m-    if ((uint32_t)k < t->asize && nk == (lua_Number)k)[m
[31m-      return (uint32_t)k;  /* Array key indexes: [0..t->asize-1] */[m
[31m-  }[m
[31m-  if (!tvisnil(key)) {[m
[31m-    Node *n = hashkey(t, key);[m
[31m-    do {[m
[31m-      if (lj_obj_equal(&n->key, key))[m
[31m-	return t->asize + (uint32_t)(n - noderef(t->node));[m
[31m-	/* Hash key indexes: [t->asize..t->asize+t->nmask] */[m
[31m-    } while ((n = nextnode(n)));[m
[31m-    if (key->u32.hi == 0xfffe7fff)  /* ITERN was despecialized while running. */[m
[31m-      return key->u32.lo - 1;[m
[31m-    lj_err_msg(L, LJ_ERR_NEXTIDX);[m
[31m-    return 0;  /* unreachable */[m
[31m-  }[m
[31m-  return ~0u;  /* A nil key starts the traversal. */[m
[31m-}[m
[31m-[m
[31m-/* Advance to the next step in a table traversal. */[m
[31m-int lj_tab_next(lua_State *L, GCtab *t, TValue *key)[m
[31m-{[m
[31m-  uint32_t i = keyindex(L, t, key);  /* Find predecessor key index. */[m
[31m-  for (i++; i < t->asize; i++)  /* First traverse the array keys. */[m
[31m-    if (!tvisnil(arrayslot(t, i))) {[m
[31m-      setintV(key, i);[m
[31m-      copyTV(L, key+1, arrayslot(t, i));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  for (i -= t->asize; i <= t->hmask; i++) {  /* Then traverse the hash keys. */[m
[31m-    Node *n = &noderef(t->node)[i];[m
[31m-    if (!tvisnil(&n->val)) {[m
[31m-      copyTV(L, key, &n->key);[m
[31m-      copyTV(L, key+1, &n->val);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* End of traversal. */[m
[31m-}[m
[31m-[m
[31m-/* -- Table length calculation -------------------------------------------- */[m
[31m-[m
[31m-static MSize unbound_search(GCtab *t, MSize j)[m
[31m-{[m
[31m-  cTValue *tv;[m
[31m-  MSize i = j;  /* i is zero or a present index */[m
[31m-  j++;[m
[31m-  /* find `i' and `j' such that i is present and j is not */[m
[31m-  while ((tv = lj_tab_getint(t, (int32_t)j)) && !tvisnil(tv)) {[m
[31m-    i = j;[m
[31m-    j *= 2;[m
[31m-    if (j > (MSize)(INT_MAX-2)) {  /* overflow? */[m
[31m-      /* table was built with bad purposes: resort to linear search */[m
[31m-      i = 1;[m
[31m-      while ((tv = lj_tab_getint(t, (int32_t)i)) && !tvisnil(tv)) i++;[m
[31m-      return i - 1;[m
[31m-    }[m
[31m-  }[m
[31m-  /* now do a binary search between them */[m
[31m-  while (j - i > 1) {[m
[31m-    MSize m = (i+j)/2;[m
[31m-    cTValue *tvb = lj_tab_getint(t, (int32_t)m);[m
[31m-    if (tvb && !tvisnil(tvb)) i = m; else j = m;[m
[31m-  }[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** Try to find a boundary in table `t'. A `boundary' is an integer index[m
[31m-** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).[m
[31m-*/[m
[31m-MSize LJ_FASTCALL lj_tab_len(GCtab *t)[m
[31m-{[m
[31m-  MSize j = (MSize)t->asize;[m
[31m-  if (j > 1 && tvisnil(arrayslot(t, j-1))) {[m
[31m-    MSize i = 1;[m
[31m-    while (j - i > 1) {[m
[31m-      MSize m = (i+j)/2;[m
[31m-      if (tvisnil(arrayslot(t, m-1))) j = m; else i = m;[m
[31m-    }[m
[31m-    return i-1;[m
[31m-  }[m
[31m-  if (j) j--;[m
[31m-  if (t->hmask <= 0)[m
[31m-    return j;[m
[31m-  return unbound_search(t, j);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.h[m
[1mdeleted file mode 100644[m
[1mindex f06fcf6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_tab.h[m
[1m+++ /dev/null[m
[36m@@ -1,73 +0,0 @@[m
[31m-/*[m
[31m-** Table handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TAB_H[m
[31m-#define _LJ_TAB_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Hash constants. Tuned using a brute force search. */[m
[31m-#define HASH_BIAS	(-0x04c11db7)[m
[31m-#define HASH_ROT1	14[m
[31m-#define HASH_ROT2	5[m
[31m-#define HASH_ROT3	13[m
[31m-[m
[31m-/* Scramble the bits of numbers and pointers. */[m
[31m-static LJ_AINLINE uint32_t hashrot(uint32_t lo, uint32_t hi)[m
[31m-{[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  /* Prefer variant that compiles well for a 2-operand CPU. */[m
[31m-  lo ^= hi; hi = lj_rol(hi, HASH_ROT1);[m
[31m-  lo -= hi; hi = lj_rol(hi, HASH_ROT2);[m
[31m-  hi ^= lo; hi -= lj_rol(lo, HASH_ROT3);[m
[31m-#else[m
[31m-  lo ^= hi;[m
[31m-  lo = lo - lj_rol(hi, HASH_ROT1);[m
[31m-  hi = lo ^ lj_rol(hi, HASH_ROT1 + HASH_ROT2);[m
[31m-  hi = hi - lj_rol(lo, HASH_ROT3);[m
[31m-#endif[m
[31m-  return hi;[m
[31m-}[m
[31m-[m
[31m-#define hsize2hbits(s)	((s) ? ((s)==1 ? 1 : 1+lj_fls((uint32_t)((s)-1))) : 0)[m
[31m-[m
[31m-LJ_FUNCA GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits);[m
[31m-LJ_FUNC GCtab *lj_tab_new_ah(lua_State *L, int32_t a, int32_t h);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize);[m
[31m-#endif[m
[31m-LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_tab_clear(GCtab *t);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t);[m
[31m-#endif[m
[31m-LJ_FUNC void lj_tab_resize(lua_State *L, GCtab *t, uint32_t asize, uint32_t hbits);[m
[31m-LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize);[m
[31m-[m
[31m-/* Caveat: all getters except lj_tab_get() can return NULL! */[m
[31m-[m
[31m-LJ_FUNCA cTValue * LJ_FASTCALL lj_tab_getinth(GCtab *t, int32_t key);[m
[31m-LJ_FUNC cTValue *lj_tab_getstr(GCtab *t, GCstr *key);[m
[31m-LJ_FUNCA cTValue *lj_tab_get(lua_State *L, GCtab *t, cTValue *key);[m
[31m-[m
[31m-/* Caveat: all setters require a write barrier for the stored value. */[m
[31m-[m
[31m-LJ_FUNCA TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key);[m
[31m-LJ_FUNCA TValue *lj_tab_setinth(lua_State *L, GCtab *t, int32_t key);[m
[31m-LJ_FUNC TValue *lj_tab_setstr(lua_State *L, GCtab *t, GCstr *key);[m
[31m-LJ_FUNC TValue *lj_tab_set(lua_State *L, GCtab *t, cTValue *key);[m
[31m-[m
[31m-#define inarray(t, key)		((MSize)(key) < (MSize)(t)->asize)[m
[31m-#define arrayslot(t, i)		(&tvref((t)->array)[(i)])[m
[31m-#define lj_tab_getint(t, key) \[m
[31m-  (inarray((t), (key)) ? arrayslot((t), (key)) : lj_tab_getinth((t), (key)))[m
[31m-#define lj_tab_setint(L, t, key) \[m
[31m-  (inarray((t), (key)) ? arrayslot((t), (key)) : lj_tab_setinth(L, (t), (key)))[m
[31m-[m
[31m-LJ_FUNCA int lj_tab_next(lua_State *L, GCtab *t, TValue *key);[m
[31m-LJ_FUNCA MSize LJ_FASTCALL lj_tab_len(GCtab *t);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target.h[m
[1mdeleted file mode 100644[m
[1mindex abea8d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target.h[m
[1m+++ /dev/null[m
[36m@@ -1,164 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for target CPU.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_H[m
[31m-#define _LJ_TARGET_H[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-/* -- Registers and spill slots ------------------------------------------- */[m
[31m-[m
[31m-/* Register type (uint8_t in ir->r). */[m
[31m-typedef uint32_t Reg;[m
[31m-[m
[31m-/* The hi-bit is NOT set for an allocated register. This means the value[m
[31m-** can be directly used without masking. The hi-bit is set for a register[m
[31m-** allocation hint or for RID_INIT, RID_SINK or RID_SUNK.[m
[31m-*/[m
[31m-#define RID_NONE		0x80[m
[31m-#define RID_MASK		0x7f[m
[31m-#define RID_INIT		(RID_NONE|RID_MASK)[m
[31m-#define RID_SINK		(RID_INIT-1)[m
[31m-#define RID_SUNK		(RID_INIT-2)[m
[31m-[m
[31m-#define ra_noreg(r)		((r) & RID_NONE)[m
[31m-#define ra_hasreg(r)		(!((r) & RID_NONE))[m
[31m-[m
[31m-/* The ra_hashint() macro assumes a previous test for ra_noreg(). */[m
[31m-#define ra_hashint(r)		((r) < RID_SUNK)[m
[31m-#define ra_gethint(r)		((Reg)((r) & RID_MASK))[m
[31m-#define ra_sethint(rr, r)	rr = (uint8_t)((r)|RID_NONE)[m
[31m-#define ra_samehint(r1, r2)	(ra_gethint((r1)^(r2)) == 0)[m
[31m-[m
[31m-/* Spill slot 0 means no spill slot has been allocated. */[m
[31m-#define SPS_NONE		0[m
[31m-[m
[31m-#define ra_hasspill(s)		((s) != SPS_NONE)[m
[31m-[m
[31m-/* Combined register and spill slot (uint16_t in ir->prev). */[m
[31m-typedef uint32_t RegSP;[m
[31m-[m
[31m-#define REGSP(r, s)		((r) + ((s) << 8))[m
[31m-#define REGSP_HINT(r)		((r)|RID_NONE)[m
[31m-#define REGSP_INIT		REGSP(RID_INIT, 0)[m
[31m-[m
[31m-#define regsp_reg(rs)		((rs) & 255)[m
[31m-#define regsp_spill(rs)		((rs) >> 8)[m
[31m-#define regsp_used(rs) \[m
[31m-  (((rs) & ~REGSP(RID_MASK, 0)) != REGSP(RID_NONE, 0))[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Bitset for registers. 32 registers suffice for most architectures.[m
[31m-** Note that one set holds bits for both GPRs and FPRs.[m
[31m-*/[m
[31m-#if LJ_TARGET_PPC || LJ_TARGET_MIPS[m
[31m-typedef uint64_t RegSet;[m
[31m-#else[m
[31m-typedef uint32_t RegSet;[m
[31m-#endif[m
[31m-[m
[31m-#define RID2RSET(r)		(((RegSet)1) << (r))[m
[31m-#define RSET_EMPTY		((RegSet)0)[m
[31m-#define RSET_RANGE(lo, hi)	((RID2RSET((hi)-(lo))-1) << (lo))[m
[31m-[m
[31m-#define rset_test(rs, r)	((int)((rs) >> (r)) & 1)[m
[31m-#define rset_set(rs, r)		(rs |= RID2RSET(r))[m
[31m-#define rset_clear(rs, r)	(rs &= ~RID2RSET(r))[m
[31m-#define rset_exclude(rs, r)	(rs & ~RID2RSET(r))[m
[31m-#if LJ_TARGET_PPC || LJ_TARGET_MIPS[m
[31m-#define rset_picktop(rs)	((Reg)(__builtin_clzll(rs)^63))[m
[31m-#define rset_pickbot(rs)	((Reg)__builtin_ctzll(rs))[m
[31m-#else[m
[31m-#define rset_picktop(rs)	((Reg)lj_fls(rs))[m
[31m-#define rset_pickbot(rs)	((Reg)lj_ffs(rs))[m
[31m-#endif[m
[31m-[m
[31m-/* -- Register allocation cost -------------------------------------------- */[m
[31m-[m
[31m-/* The register allocation heuristic keeps track of the cost for allocating[m
[31m-** a specific register:[m
[31m-**[m
[31m-** A free register (obviously) has a cost of 0 and a 1-bit in the free mask.[m
[31m-**[m
[31m-** An already allocated register has the (non-zero) IR reference in the lowest[m
[31m-** bits and the result of a blended cost-model in the higher bits.[m
[31m-**[m
[31m-** The allocator first checks the free mask for a hit. Otherwise an (unrolled)[m
[31m-** linear search for the minimum cost is used. The search doesn't need to[m
[31m-** keep track of the position of the minimum, which makes it very fast.[m
[31m-** The lowest bits of the minimum cost show the desired IR reference whose[m
[31m-** register is the one to evict.[m
[31m-**[m
[31m-** Without the cost-model this degenerates to the standard heuristics for[m
[31m-** (reverse) linear-scan register allocation. Since code generation is done[m
[31m-** in reverse, a live interval extends from the last use to the first def.[m
[31m-** For an SSA IR the IR reference is the first (and only) def and thus[m
[31m-** trivially marks the end of the interval. The LSRA heuristics says to pick[m
[31m-** the register whose live interval has the furthest extent, i.e. the lowest[m
[31m-** IR reference in our case.[m
[31m-**[m
[31m-** A cost-model should take into account other factors, like spill-cost and[m
[31m-** restore- or rematerialization-cost, which depend on the kind of instruction.[m
[31m-** E.g. constants have zero spill costs, variant instructions have higher[m
[31m-** costs than invariants and PHIs should preferably never be spilled.[m
[31m-**[m
[31m-** Here's a first cut at simple, but effective blended cost-model for R-LSRA:[m
[31m-** - Due to careful design of the IR, constants already have lower IR[m
[31m-**   references than invariants and invariants have lower IR references[m
[31m-**   than variants.[m
[31m-** - The cost in the upper 16 bits is the sum of the IR reference and a[m
[31m-**   weighted score. The score currently only takes into account whether[m
[31m-**   the IRT_ISPHI bit is set in the instruction type.[m
[31m-** - The PHI weight is the minimum distance (in IR instructions) a PHI[m
[31m-**   reference has to be further apart from a non-PHI reference to be spilled.[m
[31m-** - It should be a power of two (for speed) and must be between 2 and 32768.[m
[31m-**   Good values for the PHI weight seem to be between 40 and 150.[m
[31m-** - Further study is required.[m
[31m-*/[m
[31m-#define REGCOST_PHI_WEIGHT	64[m
[31m-[m
[31m-/* Cost for allocating a specific register. */[m
[31m-typedef uint32_t RegCost;[m
[31m-[m
[31m-/* Note: assumes 16 bit IRRef1. */[m
[31m-#define REGCOST(cost, ref)	((RegCost)(ref) + ((RegCost)(cost) << 16))[m
[31m-#define regcost_ref(rc)		((IRRef1)(rc))[m
[31m-[m
[31m-#define REGCOST_T(t) \[m
[31m-  ((RegCost)((t)&IRT_ISPHI) * (((RegCost)(REGCOST_PHI_WEIGHT)<<16)/IRT_ISPHI))[m
[31m-#define REGCOST_REF_T(ref, t)	(REGCOST((ref), (ref)) + REGCOST_T((t)))[m
[31m-[m
[31m-/* -- Target-specific definitions ----------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#include "lj_target_x86.h"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#include "lj_target_arm.h"[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#include "lj_target_arm64.h"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#include "lj_target_ppc.h"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#include "lj_target_mips.h"[m
[31m-#else[m
[31m-#error "Missing include for target CPU"[m
[31m-#endif[m
[31m-[m
[31m-#ifdef EXITSTUBS_PER_GROUP[m
[31m-/* Return the address of an exit stub. */[m
[31m-static LJ_AINLINE char *exitstub_addr_(char **group, uint32_t exitno)[m
[31m-{[m
[31m-  lua_assert(group[exitno / EXITSTUBS_PER_GROUP] != NULL);[m
[31m-  return (char *)group[exitno / EXITSTUBS_PER_GROUP] +[m
[31m-	 EXITSTUB_SPACING*(exitno % EXITSTUBS_PER_GROUP);[m
[31m-}[m
[31m-/* Avoid dependence on lj_jit.h if only including lj_target.h. */[m
[31m-#define exitstub_addr(J, exitno) \[m
[31m-  ((MCode *)exitstub_addr_((char **)((J)->exitstubgroup), (exitno)))[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_arm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_arm.h[m
[1mdeleted file mode 100644[m
[1mindex 36959db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_arm.h[m
[1m+++ /dev/null[m
[36m@@ -1,270 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for ARM CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_ARM_H[m
[31m-#define _LJ_TARGET_ARM_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#define GPRDEF(_) \[m
[31m-  _(R0) _(R1) _(R2) _(R3) _(R4) _(R5) _(R6) _(R7) \[m
[31m-  _(R8) _(R9) _(R10) _(R11) _(R12) _(SP) _(LR) _(PC)[m
[31m-#if LJ_SOFTFP[m
[31m-#define FPRDEF(_)[m
[31m-#else[m
[31m-#define FPRDEF(_) \[m
[31m-  _(D0) _(D1) _(D2) _(D3) _(D4) _(D5) _(D6) _(D7) \[m
[31m-  _(D8) _(D9) _(D10) _(D11) _(D12) _(D13) _(D14) _(D15)[m
[31m-#endif[m
[31m-#define VRIDDEF(_)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_TMP = RID_LR,[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_RET = RID_R0,[m
[31m-  RID_RETLO = RID_R0,[m
[31m-  RID_RETHI = RID_R1,[m
[31m-#if LJ_SOFTFP[m
[31m-  RID_FPRET = RID_R0,[m
[31m-#else[m
[31m-  RID_FPRET = RID_D0,[m
[31m-#endif[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_R9,		/* Interpreter BASE. */[m
[31m-  RID_LPC = RID_R6,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_R7,	/* Interpreter DISPATCH table. */[m
[31m-  RID_LREG = RID_R8,		/* Interpreter L. */[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_R0,[m
[31m-  RID_MAX_GPR = RID_PC+1,[m
[31m-  RID_MIN_FPR = RID_MAX_GPR,[m
[31m-#if LJ_SOFTFP[m
[31m-  RID_MAX_FPR = RID_MIN_FPR,[m
[31m-#else[m
[31m-  RID_MAX_FPR = RID_D15+1,[m
[31m-#endif[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR[m
[31m-};[m
[31m-[m
[31m-#define RID_NUM_KREF		RID_NUM_GPR[m
[31m-#define RID_MIN_KREF		RID_R0[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except sp, lr and pc. */[m
[31m-#define RSET_GPR		(RSET_RANGE(RID_MIN_GPR, RID_R12+1))[m
[31m-#define RSET_GPREVEN \[m
[31m-  (RID2RSET(RID_R0)|RID2RSET(RID_R2)|RID2RSET(RID_R4)|RID2RSET(RID_R6)| \[m
[31m-   RID2RSET(RID_R8)|RID2RSET(RID_R10))[m
[31m-#define RSET_GPRODD \[m
[31m-  (RID2RSET(RID_R1)|RID2RSET(RID_R3)|RID2RSET(RID_R5)|RID2RSET(RID_R7)| \[m
[31m-   RID2RSET(RID_R9)|RID2RSET(RID_R11))[m
[31m-#if LJ_SOFTFP[m
[31m-#define RSET_FPR		0[m
[31m-#else[m
[31m-#define RSET_FPR		(RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR))[m
[31m-#endif[m
[31m-#define RSET_ALL		(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT		RSET_ALL[m
[31m-[m
[31m-/* ABI-specific register sets. lr is an implicit scratch register. */[m
[31m-#define RSET_SCRATCH_GPR_	(RSET_RANGE(RID_R0, RID_R3+1)|RID2RSET(RID_R12))[m
[31m-#ifdef __APPLE__[m
[31m-#define RSET_SCRATCH_GPR	(RSET_SCRATCH_GPR_|RID2RSET(RID_R9))[m
[31m-#else[m
[31m-#define RSET_SCRATCH_GPR	RSET_SCRATCH_GPR_[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-#define RSET_SCRATCH_FPR	0[m
[31m-#else[m
[31m-#define RSET_SCRATCH_FPR	(RSET_RANGE(RID_D0, RID_D7+1))[m
[31m-#endif[m
[31m-#define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)[m
[31m-#define REGARG_FIRSTGPR		RID_R0[m
[31m-#define REGARG_LASTGPR		RID_R3[m
[31m-#define REGARG_NUMGPR		4[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-#define REGARG_FIRSTFPR		0[m
[31m-#define REGARG_LASTFPR		0[m
[31m-#define REGARG_NUMFPR		0[m
[31m-#else[m
[31m-#define REGARG_FIRSTFPR		RID_D0[m
[31m-#define REGARG_LASTFPR		RID_D7[m
[31m-#define REGARG_NUMFPR		8[m
[31m-#endif[m
[31m-[m
[31m-/* -- Spill slots --------------------------------------------------------- */[m
[31m-[m
[31m-/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.[m
[31m-**[m
[31m-** SPS_FIXED: Available fixed spill slots in interpreter frame.[m
[31m-** This definition must match with the *.dasc file(s).[m
[31m-**[m
[31m-** SPS_FIRST: First spill slot for general use. Reserve min. two 32 bit slots.[m
[31m-*/[m
[31m-#define SPS_FIXED	2[m
[31m-#define SPS_FIRST	2[m
[31m-[m
[31m-#define SPOFS_TMP	0[m
[31m-[m
[31m-#define sps_scale(slot)		(4 * (int32_t)(slot))[m
[31m-#define sps_align(slot)		(((slot) - SPS_FIXED + 1) & ~1)[m
[31m-[m
[31m-/* -- Exit state ---------------------------------------------------------- */[m
[31m-[m
[31m-/* This definition must match with the *.dasc file(s). */[m
[31m-typedef struct {[m
[31m-#if !LJ_SOFTFP[m
[31m-  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */[m
[31m-#endif[m
[31m-  int32_t gpr[RID_NUM_GPR];	/* General-purpose registers. */[m
[31m-  int32_t spill[256];		/* Spill slots. */[m
[31m-} ExitState;[m
[31m-[m
[31m-/* PC after instruction that caused an exit. Used to find the trace number. */[m
[31m-#define EXITSTATE_PCREG		RID_PC[m
[31m-/* Highest exit + 1 indicates stack check. */[m
[31m-#define EXITSTATE_CHECKEXIT	1[m
[31m-[m
[31m-#define EXITSTUB_SPACING        4[m
[31m-#define EXITSTUBS_PER_GROUP     32[m
[31m-[m
[31m-/* -- Instructions -------------------------------------------------------- */[m
[31m-[m
[31m-/* Instruction fields. */[m
[31m-#define ARMF_CC(ai, cc)	(((ai) ^ ARMI_CCAL) | ((cc) << 28))[m
[31m-#define ARMF_N(r)	((r) << 16)[m
[31m-#define ARMF_D(r)	((r) << 12)[m
[31m-#define ARMF_S(r)	((r) << 8)[m
[31m-#define ARMF_M(r)	(r)[m
[31m-#define ARMF_SH(sh, n)	(((sh) << 5) | ((n) << 7))[m
[31m-#define ARMF_RSH(sh, r)	(0x10 | ((sh) << 5) | ARMF_S(r))[m
[31m-[m
[31m-typedef enum ARMIns {[m
[31m-  ARMI_CCAL = 0xe0000000,[m
[31m-  ARMI_S = 0x000100000,[m
[31m-  ARMI_K12 = 0x02000000,[m
[31m-  ARMI_KNEG = 0x00200000,[m
[31m-  ARMI_LS_W = 0x00200000,[m
[31m-  ARMI_LS_U = 0x00800000,[m
[31m-  ARMI_LS_P = 0x01000000,[m
[31m-  ARMI_LS_R = 0x02000000,[m
[31m-  ARMI_LSX_I = 0x00400000,[m
[31m-[m
[31m-  ARMI_AND = 0xe0000000,[m
[31m-  ARMI_EOR = 0xe0200000,[m
[31m-  ARMI_SUB = 0xe0400000,[m
[31m-  ARMI_RSB = 0xe0600000,[m
[31m-  ARMI_ADD = 0xe0800000,[m
[31m-  ARMI_ADC = 0xe0a00000,[m
[31m-  ARMI_SBC = 0xe0c00000,[m
[31m-  ARMI_RSC = 0xe0e00000,[m
[31m-  ARMI_TST = 0xe1100000,[m
[31m-  ARMI_TEQ = 0xe1300000,[m
[31m-  ARMI_CMP = 0xe1500000,[m
[31m-  ARMI_CMN = 0xe1700000,[m
[31m-  ARMI_ORR = 0xe1800000,[m
[31m-  ARMI_MOV = 0xe1a00000,[m
[31m-  ARMI_BIC = 0xe1c00000,[m
[31m-  ARMI_MVN = 0xe1e00000,[m
[31m-[m
[31m-  ARMI_NOP = 0xe1a00000,[m
[31m-[m
[31m-  ARMI_MUL = 0xe0000090,[m
[31m-  ARMI_SMULL = 0xe0c00090,[m
[31m-[m
[31m-  ARMI_LDR = 0xe4100000,[m
[31m-  ARMI_LDRB = 0xe4500000,[m
[31m-  ARMI_LDRH = 0xe01000b0,[m
[31m-  ARMI_LDRSB = 0xe01000d0,[m
[31m-  ARMI_LDRSH = 0xe01000f0,[m
[31m-  ARMI_LDRD = 0xe00000d0,[m
[31m-  ARMI_STR = 0xe4000000,[m
[31m-  ARMI_STRB = 0xe4400000,[m
[31m-  ARMI_STRH = 0xe00000b0,[m
[31m-  ARMI_STRD = 0xe00000f0,[m
[31m-  ARMI_PUSH = 0xe92d0000,[m
[31m-[m
[31m-  ARMI_B = 0xea000000,[m
[31m-  ARMI_BL = 0xeb000000,[m
[31m-  ARMI_BLX = 0xfa000000,[m
[31m-  ARMI_BLXr = 0xe12fff30,[m
[31m-[m
[31m-  /* ARMv6 */[m
[31m-  ARMI_REV = 0xe6bf0f30,[m
[31m-  ARMI_SXTB = 0xe6af0070,[m
[31m-  ARMI_SXTH = 0xe6bf0070,[m
[31m-  ARMI_UXTB = 0xe6ef0070,[m
[31m-  ARMI_UXTH = 0xe6ff0070,[m
[31m-[m
[31m-  /* ARMv6T2 */[m
[31m-  ARMI_MOVW = 0xe3000000,[m
[31m-  ARMI_MOVT = 0xe3400000,[m
[31m-[m
[31m-  /* VFP */[m
[31m-  ARMI_VMOV_D = 0xeeb00b40,[m
[31m-  ARMI_VMOV_S = 0xeeb00a40,[m
[31m-  ARMI_VMOVI_D = 0xeeb00b00,[m
[31m-[m
[31m-  ARMI_VMOV_R_S = 0xee100a10,[m
[31m-  ARMI_VMOV_S_R = 0xee000a10,[m
[31m-  ARMI_VMOV_RR_D = 0xec500b10,[m
[31m-  ARMI_VMOV_D_RR = 0xec400b10,[m
[31m-[m
[31m-  ARMI_VADD_D = 0xee300b00,[m
[31m-  ARMI_VSUB_D = 0xee300b40,[m
[31m-  ARMI_VMUL_D = 0xee200b00,[m
[31m-  ARMI_VMLA_D = 0xee000b00,[m
[31m-  ARMI_VMLS_D = 0xee000b40,[m
[31m-  ARMI_VNMLS_D = 0xee100b00,[m
[31m-  ARMI_VDIV_D = 0xee800b00,[m
[31m-[m
[31m-  ARMI_VABS_D = 0xeeb00bc0,[m
[31m-  ARMI_VNEG_D = 0xeeb10b40,[m
[31m-  ARMI_VSQRT_D = 0xeeb10bc0,[m
[31m-[m
[31m-  ARMI_VCMP_D = 0xeeb40b40,[m
[31m-  ARMI_VCMPZ_D = 0xeeb50b40,[m
[31m-[m
[31m-  ARMI_VMRS = 0xeef1fa10,[m
[31m-[m
[31m-  ARMI_VCVT_S32_F32 = 0xeebd0ac0,[m
[31m-  ARMI_VCVT_S32_F64 = 0xeebd0bc0,[m
[31m-  ARMI_VCVT_U32_F32 = 0xeebc0ac0,[m
[31m-  ARMI_VCVT_U32_F64 = 0xeebc0bc0,[m
[31m-  ARMI_VCVT_F32_S32 = 0xeeb80ac0,[m
[31m-  ARMI_VCVT_F64_S32 = 0xeeb80bc0,[m
[31m-  ARMI_VCVT_F32_U32 = 0xeeb80a40,[m
[31m-  ARMI_VCVT_F64_U32 = 0xeeb80b40,[m
[31m-  ARMI_VCVT_F32_F64 = 0xeeb70bc0,[m
[31m-  ARMI_VCVT_F64_F32 = 0xeeb70ac0,[m
[31m-[m
[31m-  ARMI_VLDR_S = 0xed100a00,[m
[31m-  ARMI_VLDR_D = 0xed100b00,[m
[31m-  ARMI_VSTR_S = 0xed000a00,[m
[31m-  ARMI_VSTR_D = 0xed000b00,[m
[31m-} ARMIns;[m
[31m-[m
[31m-typedef enum ARMShift {[m
[31m-  ARMSH_LSL, ARMSH_LSR, ARMSH_ASR, ARMSH_ROR[m
[31m-} ARMShift;[m
[31m-[m
[31m-/* ARM condition codes. */[m
[31m-typedef enum ARMCC {[m
[31m-  CC_EQ, CC_NE, CC_CS, CC_CC, CC_MI, CC_PL, CC_VS, CC_VC,[m
[31m-  CC_HI, CC_LS, CC_GE, CC_LT, CC_GT, CC_LE, CC_AL,[m
[31m-  CC_HS = CC_CS, CC_LO = CC_CC[m
[31m-} ARMCC;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_arm64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_arm64.h[m
[1mdeleted file mode 100644[m
[1mindex 57ab134..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_arm64.h[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for ARM64 CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_ARM64_H[m
[31m-#define _LJ_TARGET_ARM64_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#define GPRDEF(_) \[m
[31m-  _(X0) _(X1) _(X2) _(X3) _(X4) _(X5) _(X6) _(X7) \[m
[31m-  _(X8) _(X9) _(X10) _(X11) _(X12) _(X13) _(X14) _(X15) \[m
[31m-  _(X16) _(X17) _(X18) _(X19) _(X20) _(X21) _(X22) _(X23) \[m
[31m-  _(X24) _(X25) _(X26) _(X27) _(X28) _(FP) _(LR) _(SP)[m
[31m-#define FPRDEF(_) \[m
[31m-  _(D0) _(D1) _(D2) _(D3) _(D4) _(D5) _(D6) _(D7) \[m
[31m-  _(D8) _(D9) _(D10) _(D11) _(D12) _(D13) _(D14) _(D15) \[m
[31m-  _(D16) _(D17) _(D18) _(D19) _(D20) _(D21) _(D22) _(D23) \[m
[31m-  _(D24) _(D25) _(D26) _(D27) _(D28) _(D29) _(D30) _(D31)[m
[31m-#define VRIDDEF(_)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_TMP = RID_LR,[m
[31m-  RID_ZERO = RID_SP,[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_RET = RID_X0,[m
[31m-  RID_FPRET = RID_D0,[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_X19,		/* Interpreter BASE. */[m
[31m-  RID_LPC = RID_X21,		/* Interpreter PC. */[m
[31m-  RID_GL = RID_X22,		/* Interpreter GL. */[m
[31m-  RID_LREG = RID_X23,		/* Interpreter L. */[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_X0,[m
[31m-  RID_MAX_GPR = RID_SP+1,[m
[31m-  RID_MIN_FPR = RID_MAX_GPR,[m
[31m-  RID_MAX_FPR = RID_D31+1,[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR[m
[31m-};[m
[31m-[m
[31m-#define RID_NUM_KREF		RID_NUM_GPR[m
[31m-#define RID_MIN_KREF		RID_X0[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except for x18, fp, lr and sp. */[m
[31m-#define RSET_FIXED \[m
[31m-  (RID2RSET(RID_X18)|RID2RSET(RID_FP)|RID2RSET(RID_LR)|RID2RSET(RID_SP))[m
[31m-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)[m
[31m-#define RSET_FPR	RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)[m
[31m-#define RSET_ALL	(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT	RSET_ALL[m
[31m-[m
[31m-/* lr is an implicit scratch register. */[m
[31m-#define RSET_SCRATCH_GPR	(RSET_RANGE(RID_X0, RID_X17+1))[m
[31m-#define RSET_SCRATCH_FPR \[m
[31m-  (RSET_RANGE(RID_D0, RID_D7+1)|RSET_RANGE(RID_D16, RID_D31+1))[m
[31m-#define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)[m
[31m-#define REGARG_FIRSTGPR		RID_X0[m
[31m-#define REGARG_LASTGPR		RID_X7[m
[31m-#define REGARG_NUMGPR		8[m
[31m-#define REGARG_FIRSTFPR		RID_D0[m
[31m-#define REGARG_LASTFPR		RID_D7[m
[31m-#define REGARG_NUMFPR		8[m
[31m-[m
[31m-/* -- Instructions -------------------------------------------------------- */[m
[31m-[m
[31m-/* Instruction fields. */[m
[31m-#define A64F_D(r)	(r)[m
[31m-#define A64F_N(r)       ((r) << 5)[m
[31m-#define A64F_A(r)       ((r) << 10)[m
[31m-#define A64F_M(r)       ((r) << 16)[m
[31m-#define A64F_U16(x)	((x) << 5)[m
[31m-#define A64F_S26(x)	(x)[m
[31m-#define A64F_S19(x)	((x) << 5)[m
[31m-[m
[31m-typedef enum A64Ins {[m
[31m-  A64I_MOVZw = 0x52800000,[m
[31m-  A64I_MOVZx = 0xd2800000,[m
[31m-  A64I_LDRLw = 0x18000000,[m
[31m-  A64I_LDRLx = 0x58000000,[m
[31m-  A64I_NOP = 0xd503201f,[m
[31m-  A64I_B = 0x14000000,[m
[31m-  A64I_BR = 0xd61f0000,[m
[31m-} A64Ins;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_mips.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_mips.h[m
[1mdeleted file mode 100644[m
[1mindex bafa817..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_mips.h[m
[1m+++ /dev/null[m
[36m@@ -1,288 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for MIPS CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_MIPS_H[m
[31m-#define _LJ_TARGET_MIPS_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#define GPRDEF(_) \[m
[31m-  _(R0) _(R1) _(R2) _(R3) _(R4) _(R5) _(R6) _(R7) \[m
[31m-  _(R8) _(R9) _(R10) _(R11) _(R12) _(R13) _(R14) _(R15) \[m
[31m-  _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \[m
[31m-  _(R24) _(R25) _(SYS1) _(SYS2) _(R28) _(SP) _(R30) _(RA)[m
[31m-#if LJ_SOFTFP[m
[31m-#define FPRDEF(_)[m
[31m-#else[m
[31m-#define FPRDEF(_) \[m
[31m-  _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \[m
[31m-  _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \[m
[31m-  _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \[m
[31m-  _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31)[m
[31m-#endif[m
[31m-#define VRIDDEF(_)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_ZERO = RID_R0,[m
[31m-  RID_TMP = RID_RA,[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_RET = RID_R2,[m
[31m-#if LJ_LE[m
[31m-  RID_RETHI = RID_R3,[m
[31m-  RID_RETLO = RID_R2,[m
[31m-#else[m
[31m-  RID_RETHI = RID_R2,[m
[31m-  RID_RETLO = RID_R3,[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-  RID_FPRET = RID_R2,[m
[31m-#else[m
[31m-  RID_FPRET = RID_F0,[m
[31m-#endif[m
[31m-  RID_CFUNCADDR = RID_R25,[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_R16,		/* Interpreter BASE. */[m
[31m-  RID_LPC = RID_R18,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_R19,	/* Interpreter DISPATCH table. */[m
[31m-  RID_LREG = RID_R20,		/* Interpreter L. */[m
[31m-  RID_JGL = RID_R30,		/* On-trace: global_State + 32768. */[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_R0,[m
[31m-  RID_MAX_GPR = RID_RA+1,[m
[31m-  RID_MIN_FPR = RID_MAX_GPR,[m
[31m-#if LJ_SOFTFP[m
[31m-  RID_MAX_FPR = RID_MIN_FPR,[m
[31m-#else[m
[31m-  RID_MAX_FPR = RID_F31+1,[m
[31m-#endif[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR	/* Only even regs are used. */[m
[31m-};[m
[31m-[m
[31m-#define RID_NUM_KREF		RID_NUM_GPR[m
[31m-#define RID_MIN_KREF		RID_R0[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except ZERO, TMP, SP, SYS1, SYS2 and JGL. */[m
[31m-#define RSET_FIXED \[m
[31m-  (RID2RSET(RID_ZERO)|RID2RSET(RID_TMP)|RID2RSET(RID_SP)|\[m
[31m-   RID2RSET(RID_SYS1)|RID2RSET(RID_SYS2)|RID2RSET(RID_JGL))[m
[31m-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)[m
[31m-#if LJ_SOFTFP[m
[31m-#define RSET_FPR	0[m
[31m-#else[m
[31m-#define RSET_FPR \[m
[31m-  (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\[m
[31m-   RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\[m
[31m-   RID2RSET(RID_F16)|RID2RSET(RID_F18)|RID2RSET(RID_F20)|RID2RSET(RID_F22)|\[m
[31m-   RID2RSET(RID_F24)|RID2RSET(RID_F26)|RID2RSET(RID_F28)|RID2RSET(RID_F30))[m
[31m-#endif[m
[31m-#define RSET_ALL	(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT	RSET_ALL[m
[31m-[m
[31m-#define RSET_SCRATCH_GPR \[m
[31m-  (RSET_RANGE(RID_R1, RID_R15+1)|\[m
[31m-   RID2RSET(RID_R24)|RID2RSET(RID_R25)|RID2RSET(RID_R28))[m
[31m-#if LJ_SOFTFP[m
[31m-#define RSET_SCRATCH_FPR	0[m
[31m-#else[m
[31m-#define RSET_SCRATCH_FPR \[m
[31m-  (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\[m
[31m-   RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\[m
[31m-   RID2RSET(RID_F16)|RID2RSET(RID_F18))[m
[31m-#endif[m
[31m-#define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)[m
[31m-#define REGARG_FIRSTGPR		RID_R4[m
[31m-#define REGARG_LASTGPR		RID_R7[m
[31m-#define REGARG_NUMGPR		4[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-#define REGARG_FIRSTFPR		0[m
[31m-#define REGARG_LASTFPR		0[m
[31m-#define REGARG_NUMFPR		0[m
[31m-#else[m
[31m-#define REGARG_FIRSTFPR		RID_F12[m
[31m-#define REGARG_LASTFPR		RID_F14[m
[31m-#define REGARG_NUMFPR		2[m
[31m-#endif[m
[31m-[m
[31m-/* -- Spill slots --------------------------------------------------------- */[m
[31m-[m
[31m-/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.[m
[31m-**[m
[31m-** SPS_FIXED: Available fixed spill slots in interpreter frame.[m
[31m-** This definition must match with the *.dasc file(s).[m
[31m-**[m
[31m-** SPS_FIRST: First spill slot for general use.[m
[31m-*/[m
[31m-#define SPS_FIXED	5[m
[31m-#define SPS_FIRST	4[m
[31m-[m
[31m-#define SPOFS_TMP	0[m
[31m-[m
[31m-#define sps_scale(slot)		(4 * (int32_t)(slot))[m
[31m-#define sps_align(slot)		(((slot) - SPS_FIXED + 1) & ~1)[m
[31m-[m
[31m-/* -- Exit state ---------------------------------------------------------- */[m
[31m-[m
[31m-/* This definition must match with the *.dasc file(s). */[m
[31m-typedef struct {[m
[31m-#if !LJ_SOFTFP[m
[31m-  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */[m
[31m-#endif[m
[31m-  int32_t gpr[RID_NUM_GPR];	/* General-purpose registers. */[m
[31m-  int32_t spill[256];		/* Spill slots. */[m
[31m-} ExitState;[m
[31m-[m
[31m-/* Highest exit + 1 indicates stack check. */[m
[31m-#define EXITSTATE_CHECKEXIT	1[m
[31m-[m
[31m-/* Return the address of a per-trace exit stub. */[m
[31m-static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p)[m
[31m-{[m
[31m-  while (*p == 0x00000000) p++;  /* Skip MIPSI_NOP. */[m
[31m-  return p;[m
[31m-}[m
[31m-/* Avoid dependence on lj_jit.h if only including lj_target.h. */[m
[31m-#define exitstub_trace_addr(T, exitno) \[m
[31m-  exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode))[m
[31m-[m
[31m-/* -- Instructions -------------------------------------------------------- */[m
[31m-[m
[31m-/* Instruction fields. */[m
[31m-#define MIPSF_S(r)	((r) << 21)[m
[31m-#define MIPSF_T(r)	((r) << 16)[m
[31m-#define MIPSF_D(r)	((r) << 11)[m
[31m-#define MIPSF_R(r)	((r) << 21)[m
[31m-#define MIPSF_H(r)	((r) << 16)[m
[31m-#define MIPSF_G(r)	((r) << 11)[m
[31m-#define MIPSF_F(r)	((r) << 6)[m
[31m-#define MIPSF_A(n)	((n) << 6)[m
[31m-#define MIPSF_M(n)	((n) << 11)[m
[31m-[m
[31m-typedef enum MIPSIns {[m
[31m-  /* Integer instructions. */[m
[31m-  MIPSI_MOVE = 0x00000021,[m
[31m-  MIPSI_NOP = 0x00000000,[m
[31m-[m
[31m-  MIPSI_LI = 0x24000000,[m
[31m-  MIPSI_LU = 0x34000000,[m
[31m-  MIPSI_LUI = 0x3c000000,[m
[31m-[m
[31m-  MIPSI_ADDIU = 0x24000000,[m
[31m-  MIPSI_ANDI = 0x30000000,[m
[31m-  MIPSI_ORI = 0x34000000,[m
[31m-  MIPSI_XORI = 0x38000000,[m
[31m-  MIPSI_SLTI = 0x28000000,[m
[31m-  MIPSI_SLTIU = 0x2c000000,[m
[31m-[m
[31m-  MIPSI_ADDU = 0x00000021,[m
[31m-  MIPSI_SUBU = 0x00000023,[m
[31m-  MIPSI_MUL = 0x70000002,[m
[31m-  MIPSI_AND = 0x00000024,[m
[31m-  MIPSI_OR = 0x00000025,[m
[31m-  MIPSI_XOR = 0x00000026,[m
[31m-  MIPSI_NOR = 0x00000027,[m
[31m-  MIPSI_SLT = 0x0000002a,[m
[31m-  MIPSI_SLTU = 0x0000002b,[m
[31m-  MIPSI_MOVZ = 0x0000000a,[m
[31m-  MIPSI_MOVN = 0x0000000b,[m
[31m-  MIPSI_MFHI = 0x00000010,[m
[31m-  MIPSI_MFLO = 0x00000012,[m
[31m-  MIPSI_MULT = 0x00000018,[m
[31m-[m
[31m-  MIPSI_SLL = 0x00000000,[m
[31m-  MIPSI_SRL = 0x00000002,[m
[31m-  MIPSI_SRA = 0x00000003,[m
[31m-  MIPSI_ROTR = 0x00200002,	/* MIPS32R2 */[m
[31m-  MIPSI_SLLV = 0x00000004,[m
[31m-  MIPSI_SRLV = 0x00000006,[m
[31m-  MIPSI_SRAV = 0x00000007,[m
[31m-  MIPSI_ROTRV = 0x00000046,	/* MIPS32R2 */[m
[31m-[m
[31m-  MIPSI_SEB = 0x7c000420,	/* MIPS32R2 */[m
[31m-  MIPSI_SEH = 0x7c000620,	/* MIPS32R2 */[m
[31m-  MIPSI_WSBH = 0x7c0000a0,	/* MIPS32R2 */[m
[31m-[m
[31m-  MIPSI_B = 0x10000000,[m
[31m-  MIPSI_J = 0x08000000,[m
[31m-  MIPSI_JAL = 0x0c000000,[m
[31m-  MIPSI_JR = 0x00000008,[m
[31m-  MIPSI_JALR = 0x0000f809,[m
[31m-[m
[31m-  MIPSI_BEQ = 0x10000000,[m
[31m-  MIPSI_BNE = 0x14000000,[m
[31m-  MIPSI_BLEZ = 0x18000000,[m
[31m-  MIPSI_BGTZ = 0x1c000000,[m
[31m-  MIPSI_BLTZ = 0x04000000,[m
[31m-  MIPSI_BGEZ = 0x04010000,[m
[31m-[m
[31m-  /* Load/store instructions. */[m
[31m-  MIPSI_LW = 0x8c000000,[m
[31m-  MIPSI_SW = 0xac000000,[m
[31m-  MIPSI_LB = 0x80000000,[m
[31m-  MIPSI_SB = 0xa0000000,[m
[31m-  MIPSI_LH = 0x84000000,[m
[31m-  MIPSI_SH = 0xa4000000,[m
[31m-  MIPSI_LBU = 0x90000000,[m
[31m-  MIPSI_LHU = 0x94000000,[m
[31m-  MIPSI_LWC1 = 0xc4000000,[m
[31m-  MIPSI_SWC1 = 0xe4000000,[m
[31m-  MIPSI_LDC1 = 0xd4000000,[m
[31m-  MIPSI_SDC1 = 0xf4000000,[m
[31m-[m
[31m-  /* FP instructions. */[m
[31m-  MIPSI_MOV_S = 0x46000006,[m
[31m-  MIPSI_MOV_D = 0x46200006,[m
[31m-  MIPSI_MOVT_D = 0x46210011,[m
[31m-  MIPSI_MOVF_D = 0x46200011,[m
[31m-[m
[31m-  MIPSI_ABS_D = 0x46200005,[m
[31m-  MIPSI_NEG_D = 0x46200007,[m
[31m-[m
[31m-  MIPSI_ADD_D = 0x46200000,[m
[31m-  MIPSI_SUB_D = 0x46200001,[m
[31m-  MIPSI_MUL_D = 0x46200002,[m
[31m-  MIPSI_DIV_D = 0x46200003,[m
[31m-  MIPSI_SQRT_D = 0x46200004,[m
[31m-[m
[31m-  MIPSI_ADD_S = 0x46000000,[m
[31m-  MIPSI_SUB_S = 0x46000001,[m
[31m-[m
[31m-  MIPSI_CVT_D_S = 0x46000021,[m
[31m-  MIPSI_CVT_W_S = 0x46000024,[m
[31m-  MIPSI_CVT_S_D = 0x46200020,[m
[31m-  MIPSI_CVT_W_D = 0x46200024,[m
[31m-  MIPSI_CVT_S_W = 0x46800020,[m
[31m-  MIPSI_CVT_D_W = 0x46800021,[m
[31m-[m
[31m-  MIPSI_TRUNC_W_S = 0x4600000d,[m
[31m-  MIPSI_TRUNC_W_D = 0x4620000d,[m
[31m-  MIPSI_FLOOR_W_S = 0x4600000f,[m
[31m-  MIPSI_FLOOR_W_D = 0x4620000f,[m
[31m-[m
[31m-  MIPSI_MFC1 = 0x44000000,[m
[31m-  MIPSI_MTC1 = 0x44800000,[m
[31m-[m
[31m-  MIPSI_BC1F = 0x45000000,[m
[31m-  MIPSI_BC1T = 0x45010000,[m
[31m-[m
[31m-  MIPSI_C_EQ_D = 0x46200032,[m
[31m-  MIPSI_C_OLT_D = 0x46200034,[m
[31m-  MIPSI_C_ULT_D = 0x46200035,[m
[31m-  MIPSI_C_OLE_D = 0x46200036,[m
[31m-  MIPSI_C_ULE_D = 0x46200037,[m
[31m-[m
[31m-} MIPSIns;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex bbf2239..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,280 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for PPC CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_PPC_H[m
[31m-#define _LJ_TARGET_PPC_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#define GPRDEF(_) \[m
[31m-  _(R0) _(SP) _(SYS1) _(R3) _(R4) _(R5) _(R6) _(R7) \[m
[31m-  _(R8) _(R9) _(R10) _(R11) _(R12) _(SYS2) _(R14) _(R15) \[m
[31m-  _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \[m
[31m-  _(R24) _(R25) _(R26) _(R27) _(R28) _(R29) _(R30) _(R31)[m
[31m-#define FPRDEF(_) \[m
[31m-  _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \[m
[31m-  _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \[m
[31m-  _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \[m
[31m-  _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31)[m
[31m-#define VRIDDEF(_)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_TMP = RID_R0,[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_RET = RID_R3,[m
[31m-  RID_RETHI = RID_R3,[m
[31m-  RID_RETLO = RID_R4,[m
[31m-  RID_FPRET = RID_F1,[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_R14,		/* Interpreter BASE. */[m
[31m-  RID_LPC = RID_R16,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_R17,	/* Interpreter DISPATCH table. */[m
[31m-  RID_LREG = RID_R18,		/* Interpreter L. */[m
[31m-  RID_JGL = RID_R31,		/* On-trace: global_State + 32768. */[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_R0,[m
[31m-  RID_MAX_GPR = RID_R31+1,[m
[31m-  RID_MIN_FPR = RID_F0,[m
[31m-  RID_MAX_FPR = RID_F31+1,[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR[m
[31m-};[m
[31m-[m
[31m-#define RID_NUM_KREF		RID_NUM_GPR[m
[31m-#define RID_MIN_KREF		RID_R0[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except TMP, SP, SYS1, SYS2 and JGL. */[m
[31m-#define RSET_FIXED \[m
[31m-  (RID2RSET(RID_TMP)|RID2RSET(RID_SP)|RID2RSET(RID_SYS1)|\[m
[31m-   RID2RSET(RID_SYS2)|RID2RSET(RID_JGL))[m
[31m-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)[m
[31m-#define RSET_FPR	RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)[m
[31m-#define RSET_ALL	(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT	RSET_ALL[m
[31m-[m
[31m-#define RSET_SCRATCH_GPR	(RSET_RANGE(RID_R3, RID_R12+1))[m
[31m-#define RSET_SCRATCH_FPR	(RSET_RANGE(RID_F0, RID_F13+1))[m
[31m-#define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)[m
[31m-#define REGARG_FIRSTGPR		RID_R3[m
[31m-#define REGARG_LASTGPR		RID_R10[m
[31m-#define REGARG_NUMGPR		8[m
[31m-#define REGARG_FIRSTFPR		RID_F1[m
[31m-#define REGARG_LASTFPR		RID_F8[m
[31m-#define REGARG_NUMFPR		8[m
[31m-[m
[31m-/* -- Spill slots --------------------------------------------------------- */[m
[31m-[m
[31m-/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.[m
[31m-**[m
[31m-** SPS_FIXED: Available fixed spill slots in interpreter frame.[m
[31m-** This definition must match with the *.dasc file(s).[m
[31m-**[m
[31m-** SPS_FIRST: First spill slot for general use.[m
[31m-** [sp+12] tmplo word \[m
[31m-** [sp+ 8] tmphi word / tmp dword, parameter area for callee[m
[31m-** [sp+ 4] tmpw, LR of callee[m
[31m-** [sp+ 0] stack chain[m
[31m-*/[m
[31m-#define SPS_FIXED	7[m
[31m-#define SPS_FIRST	4[m
[31m-[m
[31m-/* Stack offsets for temporary slots. Used for FP<->int conversions etc. */[m
[31m-#define SPOFS_TMPW	4[m
[31m-#define SPOFS_TMP	8[m
[31m-#define SPOFS_TMPHI	8[m
[31m-#define SPOFS_TMPLO	12[m
[31m-[m
[31m-#define sps_scale(slot)		(4 * (int32_t)(slot))[m
[31m-#define sps_align(slot)		(((slot) - SPS_FIXED + 3) & ~3)[m
[31m-[m
[31m-/* -- Exit state ---------------------------------------------------------- */[m
[31m-[m
[31m-/* This definition must match with the *.dasc file(s). */[m
[31m-typedef struct {[m
[31m-  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */[m
[31m-  intptr_t gpr[RID_NUM_GPR];	/* General-purpose registers. */[m
[31m-  int32_t spill[256];		/* Spill slots. */[m
[31m-} ExitState;[m
[31m-[m
[31m-/* Highest exit + 1 indicates stack check. */[m
[31m-#define EXITSTATE_CHECKEXIT	1[m
[31m-[m
[31m-/* Return the address of a per-trace exit stub. */[m
[31m-static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno)[m
[31m-{[m
[31m-  while (*p == 0x60000000) p++;  /* Skip PPCI_NOP. */[m
[31m-  return p + 3 + exitno;[m
[31m-}[m
[31m-/* Avoid dependence on lj_jit.h if only including lj_target.h. */[m
[31m-#define exitstub_trace_addr(T, exitno) \[m
[31m-  exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode), (exitno))[m
[31m-[m
[31m-/* -- Instructions -------------------------------------------------------- */[m
[31m-[m
[31m-/* Instruction fields. */[m
[31m-#define PPCF_CC(cc)	((((cc) & 3) << 16) | (((cc) & 4) << 22))[m
[31m-#define PPCF_T(r)	((r) << 21)[m
[31m-#define PPCF_A(r)	((r) << 16)[m
[31m-#define PPCF_B(r)	((r) << 11)[m
[31m-#define PPCF_C(r)	((r) << 6)[m
[31m-#define PPCF_MB(n)	((n) << 6)[m
[31m-#define PPCF_ME(n)	((n) << 1)[m
[31m-#define PPCF_Y		0x00200000[m
[31m-#define PPCF_DOT	0x00000001[m
[31m-[m
[31m-typedef enum PPCIns {[m
[31m-  /* Integer instructions. */[m
[31m-  PPCI_MR = 0x7c000378,[m
[31m-  PPCI_NOP = 0x60000000,[m
[31m-[m
[31m-  PPCI_LI = 0x38000000,[m
[31m-  PPCI_LIS = 0x3c000000,[m
[31m-[m
[31m-  PPCI_ADD = 0x7c000214,[m
[31m-  PPCI_ADDC = 0x7c000014,[m
[31m-  PPCI_ADDO = 0x7c000614,[m
[31m-  PPCI_ADDE = 0x7c000114,[m
[31m-  PPCI_ADDZE = 0x7c000194,[m
[31m-  PPCI_ADDME = 0x7c0001d4,[m
[31m-  PPCI_ADDI = 0x38000000,[m
[31m-  PPCI_ADDIS = 0x3c000000,[m
[31m-  PPCI_ADDIC = 0x30000000,[m
[31m-  PPCI_ADDICDOT = 0x34000000,[m
[31m-[m
[31m-  PPCI_SUBF = 0x7c000050,[m
[31m-  PPCI_SUBFC = 0x7c000010,[m
[31m-  PPCI_SUBFO = 0x7c000450,[m
[31m-  PPCI_SUBFE = 0x7c000110,[m
[31m-  PPCI_SUBFZE = 0x7c000190,[m
[31m-  PPCI_SUBFME = 0x7c0001d0,[m
[31m-  PPCI_SUBFIC = 0x20000000,[m
[31m-[m
[31m-  PPCI_NEG = 0x7c0000d0,[m
[31m-[m
[31m-  PPCI_AND = 0x7c000038,[m
[31m-  PPCI_ANDC = 0x7c000078,[m
[31m-  PPCI_NAND = 0x7c0003b8,[m
[31m-  PPCI_ANDIDOT = 0x70000000,[m
[31m-  PPCI_ANDISDOT = 0x74000000,[m
[31m-[m
[31m-  PPCI_OR = 0x7c000378,[m
[31m-  PPCI_NOR = 0x7c0000f8,[m
[31m-  PPCI_ORI = 0x60000000,[m
[31m-  PPCI_ORIS = 0x64000000,[m
[31m-[m
[31m-  PPCI_XOR = 0x7c000278,[m
[31m-  PPCI_EQV = 0x7c000238,[m
[31m-  PPCI_XORI = 0x68000000,[m
[31m-  PPCI_XORIS = 0x6c000000,[m
[31m-[m
[31m-  PPCI_CMPW = 0x7c000000,[m
[31m-  PPCI_CMPLW = 0x7c000040,[m
[31m-  PPCI_CMPWI = 0x2c000000,[m
[31m-  PPCI_CMPLWI = 0x28000000,[m
[31m-[m
[31m-  PPCI_MULLW = 0x7c0001d6,[m
[31m-  PPCI_MULLI = 0x1c000000,[m
[31m-  PPCI_MULLWO = 0x7c0005d6,[m
[31m-[m
[31m-  PPCI_EXTSB = 0x7c000774,[m
[31m-  PPCI_EXTSH = 0x7c000734,[m
[31m-[m
[31m-  PPCI_SLW = 0x7c000030,[m
[31m-  PPCI_SRW = 0x7c000430,[m
[31m-  PPCI_SRAW = 0x7c000630,[m
[31m-  PPCI_SRAWI = 0x7c000670,[m
[31m-[m
[31m-  PPCI_RLWNM = 0x5c000000,[m
[31m-  PPCI_RLWINM = 0x54000000,[m
[31m-  PPCI_RLWIMI = 0x50000000,[m
[31m-[m
[31m-  PPCI_B = 0x48000000,[m
[31m-  PPCI_BL = 0x48000001,[m
[31m-  PPCI_BC = 0x40800000,[m
[31m-  PPCI_BCL = 0x40800001,[m
[31m-  PPCI_BCTR = 0x4e800420,[m
[31m-  PPCI_BCTRL = 0x4e800421,[m
[31m-[m
[31m-  PPCI_CRANDC = 0x4c000102,[m
[31m-  PPCI_CRXOR = 0x4c000182,[m
[31m-  PPCI_CRAND = 0x4c000202,[m
[31m-  PPCI_CREQV = 0x4c000242,[m
[31m-  PPCI_CRORC = 0x4c000342,[m
[31m-  PPCI_CROR = 0x4c000382,[m
[31m-[m
[31m-  PPCI_MFLR = 0x7c0802a6,[m
[31m-  PPCI_MTCTR = 0x7c0903a6,[m
[31m-[m
[31m-  PPCI_MCRXR = 0x7c000400,[m
[31m-[m
[31m-  /* Load/store instructions. */[m
[31m-  PPCI_LWZ = 0x80000000,[m
[31m-  PPCI_LBZ = 0x88000000,[m
[31m-  PPCI_STW = 0x90000000,[m
[31m-  PPCI_STB = 0x98000000,[m
[31m-  PPCI_LHZ = 0xa0000000,[m
[31m-  PPCI_LHA = 0xa8000000,[m
[31m-  PPCI_STH = 0xb0000000,[m
[31m-[m
[31m-  PPCI_STWU = 0x94000000,[m
[31m-[m
[31m-  PPCI_LFS = 0xc0000000,[m
[31m-  PPCI_LFD = 0xc8000000,[m
[31m-  PPCI_STFS = 0xd0000000,[m
[31m-  PPCI_STFD = 0xd8000000,[m
[31m-[m
[31m-  PPCI_LWZX = 0x7c00002e,[m
[31m-  PPCI_LBZX = 0x7c0000ae,[m
[31m-  PPCI_STWX = 0x7c00012e,[m
[31m-  PPCI_STBX = 0x7c0001ae,[m
[31m-  PPCI_LHZX = 0x7c00022e,[m
[31m-  PPCI_LHAX = 0x7c0002ae,[m
[31m-  PPCI_STHX = 0x7c00032e,[m
[31m-[m
[31m-  PPCI_LWBRX = 0x7c00042c,[m
[31m-  PPCI_STWBRX = 0x7c00052c,[m
[31m-[m
[31m-  PPCI_LFSX = 0x7c00042e,[m
[31m-  PPCI_LFDX = 0x7c0004ae,[m
[31m-  PPCI_STFSX = 0x7c00052e,[m
[31m-  PPCI_STFDX = 0x7c0005ae,[m
[31m-[m
[31m-  /* FP instructions. */[m
[31m-  PPCI_FMR = 0xfc000090,[m
[31m-  PPCI_FNEG = 0xfc000050,[m
[31m-  PPCI_FABS = 0xfc000210,[m
[31m-[m
[31m-  PPCI_FRSP = 0xfc000018,[m
[31m-  PPCI_FCTIWZ = 0xfc00001e,[m
[31m-[m
[31m-  PPCI_FADD = 0xfc00002a,[m
[31m-  PPCI_FSUB = 0xfc000028,[m
[31m-  PPCI_FMUL = 0xfc000032,[m
[31m-  PPCI_FDIV = 0xfc000024,[m
[31m-  PPCI_FSQRT = 0xfc00002c,[m
[31m-[m
[31m-  PPCI_FMADD = 0xfc00003a,[m
[31m-  PPCI_FMSUB = 0xfc000038,[m
[31m-  PPCI_FNMSUB = 0xfc00003c,[m
[31m-[m
[31m-  PPCI_FCMPU = 0xfc000000,[m
[31m-  PPCI_FSEL = 0xfc00002e,[m
[31m-} PPCIns;[m
[31m-[m
[31m-typedef enum PPCCC {[m
[31m-  CC_GE, CC_LE, CC_NE, CC_NS, CC_LT, CC_GT, CC_EQ, CC_SO[m
[31m-} PPCCC;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_x86.h[m
[1mdeleted file mode 100644[m
[1mindex e29f474..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_target_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,356 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for x86 and x64 CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_X86_H[m
[31m-#define _LJ_TARGET_X86_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define GPRDEF(_) \[m
[31m-  _(EAX) _(ECX) _(EDX) _(EBX) _(ESP) _(EBP) _(ESI) _(EDI) \[m
[31m-  _(R8D) _(R9D) _(R10D) _(R11D) _(R12D) _(R13D) _(R14D) _(R15D)[m
[31m-#define FPRDEF(_) \[m
[31m-  _(XMM0) _(XMM1) _(XMM2) _(XMM3) _(XMM4) _(XMM5) _(XMM6) _(XMM7) \[m
[31m-  _(XMM8) _(XMM9) _(XMM10) _(XMM11) _(XMM12) _(XMM13) _(XMM14) _(XMM15)[m
[31m-#else[m
[31m-#define GPRDEF(_) \[m
[31m-  _(EAX) _(ECX) _(EDX) _(EBX) _(ESP) _(EBP) _(ESI) _(EDI)[m
[31m-#define FPRDEF(_) \[m
[31m-  _(XMM0) _(XMM1) _(XMM2) _(XMM3) _(XMM4) _(XMM5) _(XMM6) _(XMM7)[m
[31m-#endif[m
[31m-#define VRIDDEF(_) \[m
[31m-  _(MRM)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_MRM = RID_MAX,		/* Pseudo-id for ModRM operand. */[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_SP = RID_ESP,[m
[31m-  RID_RET = RID_EAX,[m
[31m-#if LJ_64[m
[31m-  RID_FPRET = RID_XMM0,[m
[31m-#else[m
[31m-  RID_RETLO = RID_EAX,[m
[31m-  RID_RETHI = RID_EDX,[m
[31m-#endif[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_EDX,		/* Interpreter BASE. */[m
[31m-#if LJ_64 && !LJ_ABI_WIN[m
[31m-  RID_LPC = RID_EBX,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_R14D,	/* Interpreter DISPATCH table. */[m
[31m-#else[m
[31m-  RID_LPC = RID_ESI,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_EBX,	/* Interpreter DISPATCH table. */[m
[31m-#endif[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_EAX,[m
[31m-  RID_MIN_FPR = RID_XMM0,[m
[31m-  RID_MAX_GPR = RID_MIN_FPR,[m
[31m-  RID_MAX_FPR = RID_MAX,[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR,[m
[31m-};[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except the stack pointer. */[m
[31m-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR)-RID2RSET(RID_ESP))[m
[31m-#define RSET_FPR	(RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR))[m
[31m-#define RSET_ALL	(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT	RSET_ALL[m
[31m-[m
[31m-#if LJ_64[m
[31m-/* Note: this requires the use of FORCE_REX! */[m
[31m-#define RSET_GPR8	RSET_GPR[m
[31m-#else[m
[31m-#define RSET_GPR8	(RSET_RANGE(RID_EAX, RID_EBX+1))[m
[31m-#endif[m
[31m-[m
[31m-/* ABI-specific register sets. */[m
[31m-#define RSET_ACD	(RID2RSET(RID_EAX)|RID2RSET(RID_ECX)|RID2RSET(RID_EDX))[m
[31m-#if LJ_64[m
[31m-#if LJ_ABI_WIN[m
[31m-/* Windows x64 ABI. */[m
[31m-#define RSET_SCRATCH \[m
[31m-  (RSET_ACD|RSET_RANGE(RID_R8D, RID_R11D+1)|RSET_RANGE(RID_XMM0, RID_XMM5+1))[m
[31m-#define REGARG_GPRS \[m
[31m-  (RID_ECX|((RID_EDX|((RID_R8D|(RID_R9D<<5))<<5))<<5))[m
[31m-#define REGARG_NUMGPR	4[m
[31m-#define REGARG_NUMFPR	4[m
[31m-#define REGARG_FIRSTFPR	RID_XMM0[m
[31m-#define REGARG_LASTFPR	RID_XMM3[m
[31m-#define STACKARG_OFS	(4*8)[m
[31m-#else[m
[31m-/* The rest of the civilized x64 world has a common ABI. */[m
[31m-#define RSET_SCRATCH \[m
[31m-  (RSET_ACD|RSET_RANGE(RID_ESI, RID_R11D+1)|RSET_FPR)[m
[31m-#define REGARG_GPRS \[m
[31m-  (RID_EDI|((RID_ESI|((RID_EDX|((RID_ECX|((RID_R8D|(RID_R9D \[m
[31m-   <<5))<<5))<<5))<<5))<<5))[m
[31m-#define REGARG_NUMGPR	6[m
[31m-#define REGARG_NUMFPR	8[m
[31m-#define REGARG_FIRSTFPR	RID_XMM0[m
[31m-#define REGARG_LASTFPR	RID_XMM7[m
[31m-#define STACKARG_OFS	0[m
[31m-#endif[m
[31m-#else[m
[31m-/* Common x86 ABI. */[m
[31m-#define RSET_SCRATCH	(RSET_ACD|RSET_FPR)[m
[31m-#define REGARG_GPRS	(RID_ECX|(RID_EDX<<5))  /* Fastcall only. */[m
[31m-#define REGARG_NUMGPR	2  /* Fastcall only. */[m
[31m-#define REGARG_NUMFPR	0[m
[31m-#define STACKARG_OFS	0[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_64[m
[31m-/* Prefer the low 8 regs of each type to reduce REX prefixes. */[m
[31m-#undef rset_picktop[m
[31m-#define rset_picktop(rs)	(lj_fls(lj_bswap(rs)) ^ 0x18)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Spill slots --------------------------------------------------------- */[m
[31m-[m
[31m-/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.[m
[31m-**[m
[31m-** SPS_FIXED: Available fixed spill slots in interpreter frame.[m
[31m-** This definition must match with the *.dasc file(s).[m
[31m-**[m
[31m-** SPS_FIRST: First spill slot for general use. Reserve min. two 32 bit slots.[m
[31m-*/[m
[31m-#if LJ_64[m
[31m-#if LJ_ABI_WIN[m
[31m-#define SPS_FIXED	(4*2)[m
[31m-#define SPS_FIRST	(4*2)	/* Don't use callee register save area. */[m
[31m-#else[m
[31m-#if LJ_GC64[m
[31m-#define SPS_FIXED	2[m
[31m-#else[m
[31m-#define SPS_FIXED	4[m
[31m-#endif[m
[31m-#define SPS_FIRST	2[m
[31m-#endif[m
[31m-#else[m
[31m-#define SPS_FIXED	6[m
[31m-#define SPS_FIRST	2[m
[31m-#endif[m
[31m-[m
[31m-#define SPOFS_TMP	0[m
[31m-[m
[31m-#define sps_scale(slot)		(4 * (int32_t)(slot))[m
[31m-#define sps_align(slot)		(((slot) - SPS_FIXED + 3) & ~3)[m
[31m-[m
[31m-/* -- Exit state ---------------------------------------------------------- */[m
[31m-[m
[31m-/* This definition must match with the *.dasc file(s). */[m
[31m-typedef struct {[m
[31m-  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */[m
[31m-  intptr_t gpr[RID_NUM_GPR];	/* General-purpose registers. */[m
[31m-  int32_t spill[256];		/* Spill slots. */[m
[31m-} ExitState;[m
[31m-[m
[31m-/* Limited by the range of a short fwd jump (127): (2+2)*(32-1)-2 = 122. */[m
[31m-#define EXITSTUB_SPACING	(2+2)[m
[31m-#define EXITSTUBS_PER_GROUP	32[m
[31m-[m
[31m-/* -- x86 ModRM operand encoding ------------------------------------------ */[m
[31m-[m
[31m-typedef enum {[m
[31m-  XM_OFS0 = 0x00, XM_OFS8 = 0x40, XM_OFS32 = 0x80, XM_REG = 0xc0,[m
[31m-  XM_SCALE1 = 0x00, XM_SCALE2 = 0x40, XM_SCALE4 = 0x80, XM_SCALE8 = 0xc0,[m
[31m-  XM_MASK = 0xc0[m
[31m-} x86Mode;[m
[31m-[m
[31m-/* Structure to hold variable ModRM operand. */[m
[31m-typedef struct {[m
[31m-  int32_t ofs;		/* Offset. */[m
[31m-  uint8_t base;		/* Base register or RID_NONE. */[m
[31m-  uint8_t idx;		/* Index register or RID_NONE. */[m
[31m-  uint8_t scale;	/* Index scale (XM_SCALE1 .. XM_SCALE8). */[m
[31m-} x86ModRM;[m
[31m-[m
[31m-/* -- Opcodes ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Macros to construct variable-length x86 opcodes. -(len+1) is in LSB. */[m
[31m-#define XO_(o)		((uint32_t)(0x0000fe + (0x##o<<24)))[m
[31m-#define XO_FPU(a,b)	((uint32_t)(0x00fd + (0x##a<<16)+(0x##b<<24)))[m
[31m-#define XO_0f(o)	((uint32_t)(0x0f00fd + (0x##o<<24)))[m
[31m-#define XO_66(o)	((uint32_t)(0x6600fd + (0x##o<<24)))[m
[31m-#define XO_660f(o)	((uint32_t)(0x0f66fc + (0x##o<<24)))[m
[31m-#define XO_f20f(o)	((uint32_t)(0x0ff2fc + (0x##o<<24)))[m
[31m-#define XO_f30f(o)	((uint32_t)(0x0ff3fc + (0x##o<<24)))[m
[31m-[m
[31m-#define XV_660f38(o)	((uint32_t)(0x79e2c4 + (0x##o<<24)))[m
[31m-#define XV_f20f38(o)	((uint32_t)(0x7be2c4 + (0x##o<<24)))[m
[31m-#define XV_f20f3a(o)	((uint32_t)(0x7be3c4 + (0x##o<<24)))[m
[31m-#define XV_f30f38(o)	((uint32_t)(0x7ae2c4 + (0x##o<<24)))[m
[31m-[m
[31m-/* This list of x86 opcodes is not intended to be complete. Opcodes are only[m
[31m-** included when needed. Take a look at DynASM or jit.dis_x86 to see the[m
[31m-** whole mess.[m
[31m-*/[m
[31m-typedef enum {[m
[31m-  /* Fixed length opcodes. XI_* prefix. */[m
[31m-  XI_NOP =	0x90,[m
[31m-  XI_XCHGa =	0x90,[m
[31m-  XI_CALL =	0xe8,[m
[31m-  XI_JMP =	0xe9,[m
[31m-  XI_JMPs =	0xeb,[m
[31m-  XI_PUSH =	0x50, /* Really 50+r. */[m
[31m-  XI_JCCs =	0x70, /* Really 7x. */[m
[31m-  XI_JCCn =	0x80, /* Really 0f8x. */[m
[31m-  XI_LEA =	0x8d,[m
[31m-  XI_MOVrib =	0xb0, /* Really b0+r. */[m
[31m-  XI_MOVri =	0xb8, /* Really b8+r. */[m
[31m-  XI_ARITHib =	0x80,[m
[31m-  XI_ARITHi =	0x81,[m
[31m-  XI_ARITHi8 =	0x83,[m
[31m-  XI_PUSHi8 =	0x6a,[m
[31m-  XI_TESTb =	0x84,[m
[31m-  XI_TEST =	0x85,[m
[31m-  XI_MOVmi =	0xc7,[m
[31m-  XI_GROUP5 =	0xff,[m
[31m-[m
[31m-  /* Note: little-endian byte-order! */[m
[31m-  XI_FLDZ =	0xeed9,[m
[31m-  XI_FLD1 =	0xe8d9,[m
[31m-  XI_FLDLG2 =	0xecd9,[m
[31m-  XI_FLDLN2 =	0xedd9,[m
[31m-  XI_FDUP =	0xc0d9,  /* Really fld st0. */[m
[31m-  XI_FPOP =	0xd8dd,  /* Really fstp st0. */[m
[31m-  XI_FPOP1 =	0xd9dd,  /* Really fstp st1. */[m
[31m-  XI_FRNDINT =	0xfcd9,[m
[31m-  XI_FSIN =	0xfed9,[m
[31m-  XI_FCOS =	0xffd9,[m
[31m-  XI_FPTAN =	0xf2d9,[m
[31m-  XI_FPATAN =	0xf3d9,[m
[31m-  XI_FSCALE =	0xfdd9,[m
[31m-  XI_FYL2X =	0xf1d9,[m
[31m-[m
[31m-  /* VEX-encoded instructions. XV_* prefix. */[m
[31m-  XV_RORX =	XV_f20f3a(f0),[m
[31m-  XV_SARX =	XV_f30f38(f7),[m
[31m-  XV_SHLX =	XV_660f38(f7),[m
[31m-  XV_SHRX =	XV_f20f38(f7),[m
[31m-[m
[31m-  /* Variable-length opcodes. XO_* prefix. */[m
[31m-  XO_MOV =	XO_(8b),[m
[31m-  XO_MOVto =	XO_(89),[m
[31m-  XO_MOVtow =	XO_66(89),[m
[31m-  XO_MOVtob =	XO_(88),[m
[31m-  XO_MOVmi =	XO_(c7),[m
[31m-  XO_MOVmib =	XO_(c6),[m
[31m-  XO_LEA =	XO_(8d),[m
[31m-  XO_ARITHib =	XO_(80),[m
[31m-  XO_ARITHi =	XO_(81),[m
[31m-  XO_ARITHi8 =	XO_(83),[m
[31m-  XO_ARITHiw8 =	XO_66(83),[m
[31m-  XO_SHIFTi =	XO_(c1),[m
[31m-  XO_SHIFT1 =	XO_(d1),[m
[31m-  XO_SHIFTcl =	XO_(d3),[m
[31m-  XO_IMUL =	XO_0f(af),[m
[31m-  XO_IMULi =	XO_(69),[m
[31m-  XO_IMULi8 =	XO_(6b),[m
[31m-  XO_CMP =	XO_(3b),[m
[31m-  XO_TESTb =	XO_(84),[m
[31m-  XO_TEST =	XO_(85),[m
[31m-  XO_GROUP3b =	XO_(f6),[m
[31m-  XO_GROUP3 =	XO_(f7),[m
[31m-  XO_GROUP5b =	XO_(fe),[m
[31m-  XO_GROUP5 =	XO_(ff),[m
[31m-  XO_MOVZXb =	XO_0f(b6),[m
[31m-  XO_MOVZXw =	XO_0f(b7),[m
[31m-  XO_MOVSXb =	XO_0f(be),[m
[31m-  XO_MOVSXw =	XO_0f(bf),[m
[31m-  XO_MOVSXd =	XO_(63),[m
[31m-  XO_BSWAP =	XO_0f(c8),[m
[31m-  XO_CMOV =	XO_0f(40),[m
[31m-[m
[31m-  XO_MOVSD =	XO_f20f(10),[m
[31m-  XO_MOVSDto =	XO_f20f(11),[m
[31m-  XO_MOVSS =	XO_f30f(10),[m
[31m-  XO_MOVSSto =	XO_f30f(11),[m
[31m-  XO_MOVLPD =	XO_660f(12),[m
[31m-  XO_MOVAPS =	XO_0f(28),[m
[31m-  XO_XORPS =	XO_0f(57),[m
[31m-  XO_ANDPS =	XO_0f(54),[m
[31m-  XO_ADDSD =	XO_f20f(58),[m
[31m-  XO_SUBSD =	XO_f20f(5c),[m
[31m-  XO_MULSD =	XO_f20f(59),[m
[31m-  XO_DIVSD =	XO_f20f(5e),[m
[31m-  XO_SQRTSD =	XO_f20f(51),[m
[31m-  XO_MINSD =	XO_f20f(5d),[m
[31m-  XO_MAXSD =	XO_f20f(5f),[m
[31m-  XO_ROUNDSD =	0x0b3a0ffc,  /* Really 66 0f 3a 0b. See asm_fpmath. */[m
[31m-  XO_UCOMISD =	XO_660f(2e),[m
[31m-  XO_CVTSI2SD =	XO_f20f(2a),[m
[31m-  XO_CVTTSD2SI=	XO_f20f(2c),[m
[31m-  XO_CVTSI2SS =	XO_f30f(2a),[m
[31m-  XO_CVTTSS2SI=	XO_f30f(2c),[m
[31m-  XO_CVTSS2SD =	XO_f30f(5a),[m
[31m-  XO_CVTSD2SS =	XO_f20f(5a),[m
[31m-  XO_ADDSS =	XO_f30f(58),[m
[31m-  XO_MOVD =	XO_660f(6e),[m
[31m-  XO_MOVDto =	XO_660f(7e),[m
[31m-[m
[31m-  XO_FLDd =	XO_(d9), XOg_FLDd = 0,[m
[31m-  XO_FLDq =	XO_(dd), XOg_FLDq = 0,[m
[31m-  XO_FILDd =	XO_(db), XOg_FILDd = 0,[m
[31m-  XO_FILDq =	XO_(df), XOg_FILDq = 5,[m
[31m-  XO_FSTPd =	XO_(d9), XOg_FSTPd = 3,[m
[31m-  XO_FSTPq =	XO_(dd), XOg_FSTPq = 3,[m
[31m-  XO_FISTPq =	XO_(df), XOg_FISTPq = 7,[m
[31m-  XO_FISTTPq =	XO_(dd), XOg_FISTTPq = 1,[m
[31m-  XO_FADDq =	XO_(dc), XOg_FADDq = 0,[m
[31m-  XO_FLDCW =	XO_(d9), XOg_FLDCW = 5,[m
[31m-  XO_FNSTCW =	XO_(d9), XOg_FNSTCW = 7[m
[31m-} x86Op;[m
[31m-[m
[31m-/* x86 opcode groups. */[m
[31m-typedef uint32_t x86Group;[m
[31m-[m
[31m-#define XG_(i8, i, g)	((x86Group)(((i8) << 16) + ((i) << 8) + (g)))[m
[31m-#define XG_ARITHi(g)	XG_(XI_ARITHi8, XI_ARITHi, g)[m
[31m-#define XG_TOXOi(xg)	((x86Op)(0x000000fe + (((xg)<<16) & 0xff000000)))[m
[31m-#define XG_TOXOi8(xg)	((x86Op)(0x000000fe + (((xg)<<8) & 0xff000000)))[m
[31m-[m
[31m-#define XO_ARITH(a)	((x86Op)(0x030000fe + ((a)<<27)))[m
[31m-#define XO_ARITHw(a)	((x86Op)(0x036600fd + ((a)<<27)))[m
[31m-[m
[31m-typedef enum {[m
[31m-  XOg_ADD, XOg_OR, XOg_ADC, XOg_SBB, XOg_AND, XOg_SUB, XOg_XOR, XOg_CMP,[m
[31m-  XOg_X_IMUL[m
[31m-} x86Arith;[m
[31m-[m
[31m-typedef enum {[m
[31m-  XOg_ROL, XOg_ROR, XOg_RCL, XOg_RCR, XOg_SHL, XOg_SHR, XOg_SAL, XOg_SAR[m
[31m-} x86Shift;[m
[31m-[m
[31m-typedef enum {[m
[31m-  XOg_TEST, XOg_TEST_, XOg_NOT, XOg_NEG, XOg_MUL, XOg_IMUL, XOg_DIV, XOg_IDIV[m
[31m-} x86Group3;[m
[31m-[m
[31m-typedef enum {[m
[31m-  XOg_INC, XOg_DEC, XOg_CALL, XOg_CALLfar, XOg_JMP, XOg_JMPfar, XOg_PUSH[m
[31m-} x86Group5;[m
[31m-[m
[31m-/* x86 condition codes. */[m
[31m-typedef enum {[m
[31m-  CC_O, CC_NO, CC_B, CC_NB, CC_E, CC_NE, CC_BE, CC_NBE,[m
[31m-  CC_S, CC_NS, CC_P, CC_NP, CC_L, CC_NL, CC_LE, CC_NLE,[m
[31m-  CC_C = CC_B, CC_NAE = CC_C, CC_NC = CC_NB, CC_AE = CC_NB,[m
[31m-  CC_Z = CC_E, CC_NZ = CC_NE, CC_NA = CC_BE, CC_A = CC_NBE,[m
[31m-  CC_PE = CC_P, CC_PO = CC_NP, CC_NGE = CC_L, CC_GE = CC_NL,[m
[31m-  CC_NG = CC_LE, CC_G = CC_NLE[m
[31m-} x86CC;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.c[m
[1mdeleted file mode 100644[m
[1mindex 66c5ae4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.c[m
[1m+++ /dev/null[m
[36m@@ -1,887 +0,0 @@[m
[31m-/*[m
[31m-** Trace management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_trace_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_mcode.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_gdbjit.h"[m
[31m-#include "lj_record.h"[m
[31m-#include "lj_asm.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_vmevent.h"[m
[31m-#include "lj_target.h"[m
[31m-[m
[31m-/* -- Error handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Synchronous abort with error message. */[m
[31m-void lj_trace_err(jit_State *J, TraceError e)[m
[31m-{[m
[31m-  setnilV(&J->errinfo);  /* No error info. */[m
[31m-  setintV(J->L->top++, (int32_t)e);[m
[31m-  lj_err_throw(J->L, LUA_ERRRUN);[m
[31m-}[m
[31m-[m
[31m-/* Synchronous abort with error message and error info. */[m
[31m-void lj_trace_err_info(jit_State *J, TraceError e)[m
[31m-{[m
[31m-  setintV(J->L->top++, (int32_t)e);[m
[31m-  lj_err_throw(J->L, LUA_ERRRUN);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace management ---------------------------------------------------- */[m
[31m-[m
[31m-/* The current trace is first assembled in J->cur. The variable length[m
[31m-** arrays point to shared, growable buffers (J->irbuf etc.). When trace[m
[31m-** recording ends successfully, the current trace and its data structures[m
[31m-** are copied to a new (compact) GCtrace object.[m
[31m-*/[m
[31m-[m
[31m-/* Find a free trace number. */[m
[31m-static TraceNo trace_findfree(jit_State *J)[m
[31m-{[m
[31m-  MSize osz, lim;[m
[31m-  if (J->freetrace == 0)[m
[31m-    J->freetrace = 1;[m
[31m-  for (; J->freetrace < J->sizetrace; J->freetrace++)[m
[31m-    if (traceref(J, J->freetrace) == NULL)[m
[31m-      return J->freetrace++;[m
[31m-  /* Need to grow trace array. */[m
[31m-  lim = (MSize)J->param[JIT_P_maxtrace] + 1;[m
[31m-  if (lim < 2) lim = 2; else if (lim > 65535) lim = 65535;[m
[31m-  osz = J->sizetrace;[m
[31m-  if (osz >= lim)[m
[31m-    return 0;  /* Too many traces. */[m
[31m-  lj_mem_growvec(J->L, J->trace, J->sizetrace, lim, GCRef);[m
[31m-  for (; osz < J->sizetrace; osz++)[m
[31m-    setgcrefnull(J->trace[osz]);[m
[31m-  return J->freetrace;[m
[31m-}[m
[31m-[m
[31m-#define TRACE_APPENDVEC(field, szfield, tp) \[m
[31m-  T->field = (tp *)p; \[m
[31m-  memcpy(p, J->cur.field, J->cur.szfield*sizeof(tp)); \[m
[31m-  p += J->cur.szfield*sizeof(tp);[m
[31m-[m
[31m-#ifdef LUAJIT_USE_PERFTOOLS[m
[31m-/*[m
[31m-** Create symbol table of JIT-compiled code. For use with Linux perf tools.[m
[31m-** Example usage:[m
[31m-**   perf record -f -e cycles luajit test.lua[m
[31m-**   perf report -s symbol[m
[31m-**   rm perf.data /tmp/perf-*.map[m
[31m-*/[m
[31m-#include <stdio.h>[m
[31m-#include <unistd.h>[m
[31m-[m
[31m-static void perftools_addtrace(GCtrace *T)[m
[31m-{[m
[31m-  static FILE *fp;[m
[31m-  GCproto *pt = &gcref(T->startpt)->pt;[m
[31m-  const BCIns *startpc = mref(T->startpc, const BCIns);[m
[31m-  const char *name = proto_chunknamestr(pt);[m
[31m-  BCLine lineno;[m
[31m-  if (name[0] == '@' || name[0] == '=')[m
[31m-    name++;[m
[31m-  else[m
[31m-    name = "(string)";[m
[31m-  lua_assert(startpc >= proto_bc(pt) && startpc < proto_bc(pt) + pt->sizebc);[m
[31m-  lineno = lj_debug_line(pt, proto_bcpos(pt, startpc));[m
[31m-  if (!fp) {[m
[31m-    char fname[40];[m
[31m-    sprintf(fname, "/tmp/perf-%d.map", getpid());[m
[31m-    if (!(fp = fopen(fname, "w"))) return;[m
[31m-    setlinebuf(fp);[m
[31m-  }[m
[31m-  fprintf(fp, "%lx %x TRACE_%d::%s:%u\n",[m
[31m-	  (long)T->mcode, T->szmcode, T->traceno, name, lineno);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Allocate space for copy of trace. */[m
[31m-static GCtrace *trace_save_alloc(jit_State *J)[m
[31m-{[m
[31m-  size_t sztr = ((sizeof(GCtrace)+7)&~7);[m
[31m-  size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns);[m
[31m-  size_t sz = sztr + szins +[m
[31m-	      J->cur.nsnap*sizeof(SnapShot) +[m
[31m-	      J->cur.nsnapmap*sizeof(SnapEntry);[m
[31m-  return lj_mem_newt(J->L, (MSize)sz, GCtrace);[m
[31m-}[m
[31m-[m
[31m-/* Save current trace by copying and compacting it. */[m
[31m-static void trace_save(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  size_t sztr = ((sizeof(GCtrace)+7)&~7);[m
[31m-  size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns);[m
[31m-  char *p = (char *)T + sztr;[m
[31m-  memcpy(T, &J->cur, sizeof(GCtrace));[m
[31m-  setgcrefr(T->nextgc, J2G(J)->gc.root);[m
[31m-  setgcrefp(J2G(J)->gc.root, T);[m
[31m-  newwhite(J2G(J), T);[m
[31m-  T->gct = ~LJ_TTRACE;[m
[31m-  T->ir = (IRIns *)p - J->cur.nk;[m
[31m-  memcpy(p, J->cur.ir+J->cur.nk, szins);[m
[31m-  p += szins;[m
[31m-  TRACE_APPENDVEC(snap, nsnap, SnapShot)[m
[31m-  TRACE_APPENDVEC(snapmap, nsnapmap, SnapEntry)[m
[31m-  J->cur.traceno = 0;[m
[31m-  setgcrefp(J->trace[T->traceno], T);[m
[31m-  lj_gc_barriertrace(J2G(J), T->traceno);[m
[31m-  lj_gdbjit_addtrace(J, T);[m
[31m-#ifdef LUAJIT_USE_PERFTOOLS[m
[31m-  perftools_addtrace(T);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_trace_free(global_State *g, GCtrace *T)[m
[31m-{[m
[31m-  jit_State *J = G2J(g);[m
[31m-  if (T->traceno) {[m
[31m-    lj_gdbjit_deltrace(J, T);[m
[31m-    if (T->traceno < J->freetrace)[m
[31m-      J->freetrace = T->traceno;[m
[31m-    setgcrefnull(J->trace[T->traceno]);[m
[31m-  }[m
[31m-  lj_mem_free(g, T,[m
[31m-    ((sizeof(GCtrace)+7)&~7) + (T->nins-T->nk)*sizeof(IRIns) +[m
[31m-    T->nsnap*sizeof(SnapShot) + T->nsnapmap*sizeof(SnapEntry));[m
[31m-}[m
[31m-[m
[31m-/* Re-enable compiling a prototype by unpatching any modified bytecode. */[m
[31m-void lj_trace_reenableproto(GCproto *pt)[m
[31m-{[m
[31m-  if ((pt->flags & PROTO_ILOOP)) {[m
[31m-    BCIns *bc = proto_bc(pt);[m
[31m-    BCPos i, sizebc = pt->sizebc;;[m
[31m-    pt->flags &= ~PROTO_ILOOP;[m
[31m-    if (bc_op(bc[0]) == BC_IFUNCF)[m
[31m-      setbc_op(&bc[0], BC_FUNCF);[m
[31m-    for (i = 1; i < sizebc; i++) {[m
[31m-      BCOp op = bc_op(bc[i]);[m
[31m-      if (op == BC_IFORL || op == BC_IITERL || op == BC_ILOOP)[m
[31m-	setbc_op(&bc[i], (int)op+(int)BC_LOOP-(int)BC_ILOOP);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Unpatch the bytecode modified by a root trace. */[m
[31m-static void trace_unpatch(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  BCOp op = bc_op(T->startins);[m
[31m-  BCIns *pc = mref(T->startpc, BCIns);[m
[31m-  UNUSED(J);[m
[31m-  if (op == BC_JMP)[m
[31m-    return;  /* No need to unpatch branches in parent traces (yet). */[m
[31m-  switch (bc_op(*pc)) {[m
[31m-  case BC_JFORL:[m
[31m-    lua_assert(traceref(J, bc_d(*pc)) == T);[m
[31m-    *pc = T->startins;[m
[31m-    pc += bc_j(T->startins);[m
[31m-    lua_assert(bc_op(*pc) == BC_JFORI);[m
[31m-    setbc_op(pc, BC_FORI);[m
[31m-    break;[m
[31m-  case BC_JITERL:[m
[31m-  case BC_JLOOP:[m
[31m-    lua_assert(op == BC_ITERL || op == BC_LOOP || bc_isret(op));[m
[31m-    *pc = T->startins;[m
[31m-    break;[m
[31m-  case BC_JMP:[m
[31m-    lua_assert(op == BC_ITERL);[m
[31m-    pc += bc_j(*pc)+2;[m
[31m-    if (bc_op(*pc) == BC_JITERL) {[m
[31m-      lua_assert(traceref(J, bc_d(*pc)) == T);[m
[31m-      *pc = T->startins;[m
[31m-    }[m
[31m-    break;[m
[31m-  case BC_JFUNCF:[m
[31m-    lua_assert(op == BC_FUNCF);[m
[31m-    *pc = T->startins;[m
[31m-    break;[m
[31m-  default:  /* Already unpatched. */[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Flush a root trace. */[m
[31m-static void trace_flushroot(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  GCproto *pt = &gcref(T->startpt)->pt;[m
[31m-  lua_assert(T->root == 0 && pt != NULL);[m
[31m-  /* First unpatch any modified bytecode. */[m
[31m-  trace_unpatch(J, T);[m
[31m-  /* Unlink root trace from chain anchored in prototype. */[m
[31m-  if (pt->trace == T->traceno) {  /* Trace is first in chain. Easy. */[m
[31m-    pt->trace = T->nextroot;[m
[31m-  } else if (pt->trace) {  /* Otherwise search in chain of root traces. */[m
[31m-    GCtrace *T2 = traceref(J, pt->trace);[m
[31m-    if (T2) {[m
[31m-      for (; T2->nextroot; T2 = traceref(J, T2->nextroot))[m
[31m-	if (T2->nextroot == T->traceno) {[m
[31m-	  T2->nextroot = T->nextroot;  /* Unlink from chain. */[m
[31m-	  break;[m
[31m-	}[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Flush a trace. Only root traces are considered. */[m
[31m-void lj_trace_flush(jit_State *J, TraceNo traceno)[m
[31m-{[m
[31m-  if (traceno > 0 && traceno < J->sizetrace) {[m
[31m-    GCtrace *T = traceref(J, traceno);[m
[31m-    if (T && T->root == 0)[m
[31m-      trace_flushroot(J, T);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Flush all traces associated with a prototype. */[m
[31m-void lj_trace_flushproto(global_State *g, GCproto *pt)[m
[31m-{[m
[31m-  while (pt->trace != 0)[m
[31m-    trace_flushroot(G2J(g), traceref(G2J(g), pt->trace));[m
[31m-}[m
[31m-[m
[31m-/* Flush all traces. */[m
[31m-int lj_trace_flushall(lua_State *L)[m
[31m-{[m
[31m-  jit_State *J = L2J(L);[m
[31m-  ptrdiff_t i;[m
[31m-  if ((J2G(J)->hookmask & HOOK_GC))[m
[31m-    return 1;[m
[31m-  for (i = (ptrdiff_t)J->sizetrace-1; i > 0; i--) {[m
[31m-    GCtrace *T = traceref(J, i);[m
[31m-    if (T) {[m
[31m-      if (T->root == 0)[m
[31m-	trace_flushroot(J, T);[m
[31m-      lj_gdbjit_deltrace(J, T);[m
[31m-      T->traceno = T->link = 0;  /* Blacklist the link for cont_stitch. */[m
[31m-      setgcrefnull(J->trace[i]);[m
[31m-    }[m
[31m-  }[m
[31m-  J->cur.traceno = 0;[m
[31m-  J->freetrace = 0;[m
[31m-  /* Clear penalty cache. */[m
[31m-  memset(J->penalty, 0, sizeof(J->penalty));[m
[31m-  /* Free the whole machine code and invalidate all exit stub groups. */[m
[31m-  lj_mcode_free(J);[m
[31m-  lj_ir_k64_freeall(J);[m
[31m-  memset(J->exitstubgroup, 0, sizeof(J->exitstubgroup));[m
[31m-  lj_vmevent_send(L, TRACE,[m
[31m-    setstrV(L, L->top++, lj_str_newlit(L, "flush"));[m
[31m-  );[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Initialize JIT compiler state. */[m
[31m-void lj_trace_initstate(global_State *g)[m
[31m-{[m
[31m-  jit_State *J = G2J(g);[m
[31m-  TValue *tv;[m
[31m-  /* Initialize SIMD constants. */[m
[31m-  tv = LJ_KSIMD(J, LJ_KSIMD_ABS);[m
[31m-  tv[0].u64 = U64x(7fffffff,ffffffff);[m
[31m-  tv[1].u64 = U64x(7fffffff,ffffffff);[m
[31m-  tv = LJ_KSIMD(J, LJ_KSIMD_NEG);[m
[31m-  tv[0].u64 = U64x(80000000,00000000);[m
[31m-  tv[1].u64 = U64x(80000000,00000000);[m
[31m-}[m
[31m-[m
[31m-/* Free everything associated with the JIT compiler state. */[m
[31m-void lj_trace_freestate(global_State *g)[m
[31m-{[m
[31m-  jit_State *J = G2J(g);[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  {  /* This assumes all traces have already been freed. */[m
[31m-    ptrdiff_t i;[m
[31m-    for (i = 1; i < (ptrdiff_t)J->sizetrace; i++)[m
[31m-      lua_assert(i == (ptrdiff_t)J->cur.traceno || traceref(J, i) == NULL);[m
[31m-  }[m
[31m-#endif[m
[31m-  lj_mcode_free(J);[m
[31m-  lj_ir_k64_freeall(J);[m
[31m-  lj_mem_freevec(g, J->snapmapbuf, J->sizesnapmap, SnapEntry);[m
[31m-  lj_mem_freevec(g, J->snapbuf, J->sizesnap, SnapShot);[m
[31m-  lj_mem_freevec(g, J->irbuf + J->irbotlim, J->irtoplim - J->irbotlim, IRIns);[m
[31m-  lj_mem_freevec(g, J->trace, J->sizetrace, GCRef);[m
[31m-}[m
[31m-[m
[31m-/* -- Penalties and blacklisting ------------------------------------------ */[m
[31m-[m
[31m-/* Blacklist a bytecode instruction. */[m
[31m-static void blacklist_pc(GCproto *pt, BCIns *pc)[m
[31m-{[m
[31m-  setbc_op(pc, (int)bc_op(*pc)+(int)BC_ILOOP-(int)BC_LOOP);[m
[31m-  pt->flags |= PROTO_ILOOP;[m
[31m-}[m
[31m-[m
[31m-/* Penalize a bytecode instruction. */[m
[31m-static void penalty_pc(jit_State *J, GCproto *pt, BCIns *pc, TraceError e)[m
[31m-{[m
[31m-  uint32_t i, val = PENALTY_MIN;[m
[31m-  for (i = 0; i < PENALTY_SLOTS; i++)[m
[31m-    if (mref(J->penalty[i].pc, const BCIns) == pc) {  /* Cache slot found? */[m
[31m-      /* First try to bump its hotcount several times. */[m
[31m-      val = ((uint32_t)J->penalty[i].val << 1) +[m
[31m-	    LJ_PRNG_BITS(J, PENALTY_RNDBITS);[m
[31m-      if (val > PENALTY_MAX) {[m
[31m-	blacklist_pc(pt, pc);  /* Blacklist it, if that didn't help. */[m
[31m-	return;[m
[31m-      }[m
[31m-      goto setpenalty;[m
[31m-    }[m
[31m-  /* Assign a new penalty cache slot. */[m
[31m-  i = J->penaltyslot;[m
[31m-  J->penaltyslot = (J->penaltyslot + 1) & (PENALTY_SLOTS-1);[m
[31m-  setmref(J->penalty[i].pc, pc);[m
[31m-setpenalty:[m
[31m-  J->penalty[i].val = (uint16_t)val;[m
[31m-  J->penalty[i].reason = e;[m
[31m-  hotcount_set(J2GG(J), pc+1, val);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace compiler state machine ---------------------------------------- */[m
[31m-[m
[31m-/* Start tracing. */[m
[31m-static void trace_start(jit_State *J)[m
[31m-{[m
[31m-  lua_State *L;[m
[31m-  TraceNo traceno;[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-  const BCIns *pc = J->pc;[m
[31m-#endif[m
[31m-[m
[31m-  if ((J->pt->flags & PROTO_NOJIT)) {  /* JIT disabled for this proto? */[m
[31m-    if (J->parent == 0 && J->exitno == 0) {[m
[31m-      /* Lazy bytecode patching to disable hotcount events. */[m
[31m-      lua_assert(bc_op(*J->pc) == BC_FORL || bc_op(*J->pc) == BC_ITERL ||[m
[31m-		 bc_op(*J->pc) == BC_LOOP || bc_op(*J->pc) == BC_FUNCF);[m
[31m-      setbc_op(J->pc, (int)bc_op(*J->pc)+(int)BC_ILOOP-(int)BC_LOOP);[m
[31m-      J->pt->flags |= PROTO_ILOOP;[m
[31m-    }[m
[31m-    J->state = LJ_TRACE_IDLE;  /* Silently ignored. */[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Get a new trace number. */[m
[31m-  traceno = trace_findfree(J);[m
[31m-  if (LJ_UNLIKELY(traceno == 0)) {  /* No free trace? */[m
[31m-    lua_assert((J2G(J)->hookmask & HOOK_GC) == 0);[m
[31m-    lj_trace_flushall(J->L);[m
[31m-    J->state = LJ_TRACE_IDLE;  /* Silently ignored. */[m
[31m-    return;[m
[31m-  }[m
[31m-  setgcrefp(J->trace[traceno], &J->cur);[m
[31m-[m
[31m-  /* Setup enough of the current trace to be able to send the vmevent. */[m
[31m-  memset(&J->cur, 0, sizeof(GCtrace));[m
[31m-  J->cur.traceno = traceno;[m
[31m-  J->cur.nins = J->cur.nk = REF_BASE;[m
[31m-  J->cur.ir = J->irbuf;[m
[31m-  J->cur.snap = J->snapbuf;[m
[31m-  J->cur.snapmap = J->snapmapbuf;[m
[31m-  J->mergesnap = 0;[m
[31m-  J->needsnap = 0;[m
[31m-  J->bcskip = 0;[m
[31m-  J->guardemit.irt = 0;[m
[31m-  J->postproc = LJ_POST_NONE;[m
[31m-  lj_resetsplit(J);[m
[31m-  J->retryrec = 0;[m
[31m-  J->ktracep = NULL;[m
[31m-  setgcref(J->cur.startpt, obj2gco(J->pt));[m
[31m-[m
[31m-  L = J->L;[m
[31m-  lj_vmevent_send(L, TRACE,[m
[31m-    setstrV(L, L->top++, lj_str_newlit(L, "start"));[m
[31m-    setintV(L->top++, traceno);[m
[31m-    setfuncV(L, L->top++, J->fn);[m
[31m-    setintV(L->top++, proto_bcpos(J->pt, J->pc));[m
[31m-    if (J->parent) {[m
[31m-      setintV(L->top++, J->parent);[m
[31m-      setintV(L->top++, J->exitno);[m
[31m-    }[m
[31m-  );[m
[31m-  lj_record_setup(J);[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-  lj_log_trace_start_record(L, (unsigned) J->cur.traceno, pc, J->fn);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Stop tracing. */[m
[31m-static void trace_stop(jit_State *J)[m
[31m-{[m
[31m-  BCIns *pc = mref(J->cur.startpc, BCIns);[m
[31m-  BCOp op = bc_op(J->cur.startins);[m
[31m-  GCproto *pt = &gcref(J->cur.startpt)->pt;[m
[31m-  TraceNo traceno = J->cur.traceno;[m
[31m-  GCtrace *T = trace_save_alloc(J);  /* Do this first. May throw OOM. */[m
[31m-  lua_State *L;[m
[31m-[m
[31m-  switch (op) {[m
[31m-  case BC_FORL:[m
[31m-    setbc_op(pc+bc_j(J->cur.startins), BC_JFORI);  /* Patch FORI, too. */[m
[31m-    /* fallthrough */[m
[31m-  case BC_LOOP:[m
[31m-  case BC_ITERL:[m
[31m-  case BC_FUNCF:[m
[31m-    /* Patch bytecode of starting instruction in root trace. */[m
[31m-    setbc_op(pc, (int)op+(int)BC_JLOOP-(int)BC_LOOP);[m
[31m-    setbc_d(pc, traceno);[m
[31m-  addroot:[m
[31m-    /* Add to root trace chain in prototype. */[m
[31m-    J->cur.nextroot = pt->trace;[m
[31m-    pt->trace = (TraceNo1)traceno;[m
[31m-    break;[m
[31m-  case BC_RET:[m
[31m-  case BC_RET0:[m
[31m-  case BC_RET1:[m
[31m-    *pc = BCINS_AD(BC_JLOOP, J->cur.snap[0].nslots, traceno);[m
[31m-    goto addroot;[m
[31m-  case BC_JMP:[m
[31m-    /* Patch exit branch in parent to side trace entry. */[m
[31m-    lua_assert(J->parent != 0 && J->cur.root != 0);[m
[31m-    lj_asm_patchexit(J, traceref(J, J->parent), J->exitno, J->cur.mcode);[m
[31m-    /* Avoid compiling a side trace twice (stack resizing uses parent exit). */[m
[31m-    traceref(J, J->parent)->snap[J->exitno].count = SNAPCOUNT_DONE;[m
[31m-    /* Add to side trace chain in root trace. */[m
[31m-    {[m
[31m-      GCtrace *root = traceref(J, J->cur.root);[m
[31m-      root->nchild++;[m
[31m-      J->cur.nextside = root->nextside;[m
[31m-      root->nextside = (TraceNo1)traceno;[m
[31m-    }[m
[31m-    break;[m
[31m-  case BC_CALLM:[m
[31m-  case BC_CALL:[m
[31m-  case BC_ITERC:[m
[31m-    /* Trace stitching: patch link of previous trace. */[m
[31m-    traceref(J, J->exitno)->link = traceno;[m
[31m-    break;[m
[31m-  default:[m
[31m-    lua_assert(0);[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  /* Commit new mcode only after all patching is done. */[m
[31m-  lj_mcode_commit(J, J->cur.mcode);[m
[31m-  J->postproc = LJ_POST_NONE;[m
[31m-  trace_save(J, T);[m
[31m-  if (J->ktracep) {  /* Patch K64Array slot with the final GCtrace pointer. */[m
[31m-    setgcV(J->L, J->ktracep, obj2gco(T), LJ_TTRACE);[m
[31m-  }[m
[31m-[m
[31m-  L = J->L;[m
[31m-  lj_vmevent_send(L, TRACE,[m
[31m-    setstrV(L, L->top++, lj_str_newlit(L, "stop"));[m
[31m-    setintV(L->top++, traceno);[m
[31m-    setfuncV(L, L->top++, J->fn);[m
[31m-  );[m
[31m-}[m
[31m-[m
[31m-/* Start a new root trace for down-recursion. */[m
[31m-static int trace_downrec(jit_State *J)[m
[31m-{[m
[31m-  /* Restart recording at the return instruction. */[m
[31m-  lua_assert(J->pt != NULL);[m
[31m-  lua_assert(bc_isret(bc_op(*J->pc)));[m
[31m-  if (bc_op(*J->pc) == BC_RETM)[m
[31m-    return 0;  /* NYI: down-recursion with RETM. */[m
[31m-  J->parent = 0;[m
[31m-  J->exitno = 0;[m
[31m-  J->state = LJ_TRACE_RECORD;[m
[31m-  trace_start(J);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Abort tracing. */[m
[31m-static int trace_abort(jit_State *J)[m
[31m-{[m
[31m-  lua_State *L = J->L;[m
[31m-  TraceError e = LJ_TRERR_RECERR;[m
[31m-  TraceNo traceno;[m
[31m-[m
[31m-  J->postproc = LJ_POST_NONE;[m
[31m-  lj_mcode_abort(J);[m
[31m-  if (tvisnumber(L->top-1))[m
[31m-    e = (TraceError)numberVint(L->top-1);[m
[31m-  if (e == LJ_TRERR_MCODELM) {[m
[31m-    L->top--;  /* Remove error object */[m
[31m-    J->state = LJ_TRACE_ASM;[m
[31m-    return 1;  /* Retry ASM with new MCode area. */[m
[31m-  }[m
[31m-  /* Penalize or blacklist starting bytecode instruction. */[m
[31m-  if (J->parent == 0 && !bc_isret(bc_op(J->cur.startins))) {[m
[31m-    if (J->exitno == 0) {[m
[31m-      BCIns *startpc = mref(J->cur.startpc, BCIns);[m
[31m-      if (e == LJ_TRERR_RETRY)[m
[31m-	hotcount_set(J2GG(J), startpc+1, 1);  /* Immediate retry. */[m
[31m-      else[m
[31m-	penalty_pc(J, &gcref(J->cur.startpt)->pt, startpc, e);[m
[31m-    } else {[m
[31m-      traceref(J, J->exitno)->link = J->exitno;  /* Self-link is blacklisted. */[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Is there anything to abort? */[m
[31m-  traceno = J->cur.traceno;[m
[31m-  if (traceno) {[m
[31m-    ptrdiff_t errobj = savestack(L, L->top-1);  /* Stack may be resized. */[m
[31m-    J->cur.link = 0;[m
[31m-    J->cur.linktype = LJ_TRLINK_NONE;[m
[31m-    lj_vmevent_send(L, TRACE,[m
[31m-      TValue *frame;[m
[31m-      const BCIns *pc;[m
[31m-      GCfunc *fn;[m
[31m-      setstrV(L, L->top++, lj_str_newlit(L, "abort"));[m
[31m-      setintV(L->top++, traceno);[m
[31m-      /* Find original Lua function call to generate a better error message. */[m
[31m-      frame = J->L->base-1;[m
[31m-      pc = J->pc;[m
[31m-      while (!isluafunc(frame_func(frame))) {[m
[31m-	pc = (frame_iscont(frame) ? frame_contpc(frame) : frame_pc(frame)) - 1;[m
[31m-	frame = frame_prev(frame);[m
[31m-      }[m
[31m-      fn = frame_func(frame);[m
[31m-      setfuncV(L, L->top++, fn);[m
[31m-      setintV(L->top++, proto_bcpos(funcproto(fn), pc));[m
[31m-      copyTV(L, L->top++, restorestack(L, errobj));[m
[31m-      copyTV(L, L->top++, &J->errinfo);[m
[31m-    );[m
[31m-    /* Drop aborted trace after the vmevent (which may still access it). */[m
[31m-    setgcrefnull(J->trace[traceno]);[m
[31m-    if (traceno < J->freetrace)[m
[31m-      J->freetrace = traceno;[m
[31m-    J->cur.traceno = 0;[m
[31m-  }[m
[31m-  L->top--;  /* Remove error object */[m
[31m-  if (e == LJ_TRERR_DOWNREC)[m
[31m-    return trace_downrec(J);[m
[31m-  else if (e == LJ_TRERR_MCODEAL)[m
[31m-    lj_trace_flushall(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Perform pending re-patch of a bytecode instruction. */[m
[31m-static LJ_AINLINE void trace_pendpatch(jit_State *J, int force)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(J->patchpc)) {[m
[31m-    if (force || J->bcskip == 0) {[m
[31m-      *J->patchpc = J->patchins;[m
[31m-      J->patchpc = NULL;[m
[31m-    } else {[m
[31m-      J->bcskip = 0;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* State machine for the trace compiler. Protected callback. */[m
[31m-static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  jit_State *J = (jit_State *)ud;[m
[31m-  UNUSED(dummy);[m
[31m-  do {[m
[31m-  retry:[m
[31m-    switch (J->state) {[m
[31m-    case LJ_TRACE_START:[m
[31m-      J->state = LJ_TRACE_RECORD;  /* trace_start() may change state. */[m
[31m-      trace_start(J);[m
[31m-      lj_dispatch_update(J2G(J));[m
[31m-      break;[m
[31m-[m
[31m-    case LJ_TRACE_RECORD:[m
[31m-      trace_pendpatch(J, 0);[m
[31m-      setvmstate(J2G(J), RECORD);[m
[31m-      lj_vmevent_send_(L, RECORD,[m
[31m-	/* Save/restore tmptv state for trace recorder. */[m
[31m-	TValue savetv = J2G(J)->tmptv;[m
[31m-	TValue savetv2 = J2G(J)->tmptv2;[m
[31m-	setintV(L->top++, J->cur.traceno);[m
[31m-	setfuncV(L, L->top++, J->fn);[m
[31m-	setintV(L->top++, J->pt ? (int32_t)proto_bcpos(J->pt, J->pc) : -1);[m
[31m-	setintV(L->top++, J->framedepth);[m
[31m-      ,[m
[31m-	J2G(J)->tmptv = savetv;[m
[31m-	J2G(J)->tmptv2 = savetv2;[m
[31m-      );[m
[31m-      lj_record_ins(J);[m
[31m-      break;[m
[31m-[m
[31m-    case LJ_TRACE_END:[m
[31m-      trace_pendpatch(J, 1);[m
[31m-      J->loopref = 0;[m
[31m-      if ((J->flags & JIT_F_OPT_LOOP) &&[m
[31m-	  J->cur.link == J->cur.traceno && J->framedepth + J->retdepth == 0) {[m
[31m-	setvmstate(J2G(J), OPT);[m
[31m-	lj_opt_dce(J);[m
[31m-	if (lj_opt_loop(J)) {  /* Loop optimization failed? */[m
[31m-	  J->cur.link = 0;[m
[31m-	  J->cur.linktype = LJ_TRLINK_NONE;[m
[31m-	  J->loopref = J->cur.nins;[m
[31m-	  J->state = LJ_TRACE_RECORD;  /* Try to continue recording. */[m
[31m-	  break;[m
[31m-	}[m
[31m-	J->loopref = J->chain[IR_LOOP];  /* Needed by assembler. */[m
[31m-      }[m
[31m-      lj_opt_split(J);[m
[31m-      lj_opt_sink(J);[m
[31m-      if (!J->loopref) J->cur.snap[J->cur.nsnap-1].count = SNAPCOUNT_DONE;[m
[31m-      J->state = LJ_TRACE_ASM;[m
[31m-      break;[m
[31m-[m
[31m-    case LJ_TRACE_ASM:[m
[31m-      setvmstate(J2G(J), ASM);[m
[31m-      lj_asm_trace(J, &J->cur);[m
[31m-      trace_stop(J);[m
[31m-      setvmstate(J2G(J), INTERP);[m
[31m-      J->state = LJ_TRACE_IDLE;[m
[31m-      lj_dispatch_update(J2G(J));[m
[31m-      return NULL;[m
[31m-[m
[31m-    default:  /* Trace aborted asynchronously. */[m
[31m-      setintV(L->top++, (int32_t)LJ_TRERR_RECERR);[m
[31m-      /* fallthrough */[m
[31m-    case LJ_TRACE_ERR:[m
[31m-      trace_pendpatch(J, 1);[m
[31m-      if (trace_abort(J))[m
[31m-	goto retry;[m
[31m-      setvmstate(J2G(J), INTERP);[m
[31m-      J->state = LJ_TRACE_IDLE;[m
[31m-      lj_dispatch_update(J2G(J));[m
[31m-      return NULL;[m
[31m-    }[m
[31m-  } while (J->state > LJ_TRACE_RECORD);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- Event handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* A bytecode instruction is about to be executed. Record it. */[m
[31m-void lj_trace_ins(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  /* Note: J->L must already be set. pc is the true bytecode PC here. */[m
[31m-  J->pc = pc;[m
[31m-  J->fn = curr_func(J->L);[m
[31m-  J->pt = isluafunc(J->fn) ? funcproto(J->fn) : NULL;[m
[31m-  while (lj_vm_cpcall(J->L, NULL, (void *)J, trace_state) != 0)[m
[31m-    J->state = LJ_TRACE_ERR;[m
[31m-}[m
[31m-[m
[31m-/* A hotcount triggered. Start recording a root trace. */[m
[31m-void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  /* Note: pc is the interpreter bytecode PC here. It's offset by 1. */[m
[31m-  ERRNO_SAVE[m
[31m-  /* Reset hotcount. */[m
[31m-  hotcount_set(J2GG(J), pc, J->param[JIT_P_hotloop]*HOTCOUNT_LOOP);[m
[31m-  /* Only start a new trace if not recording or inside __gc call or vmevent. */[m
[31m-  if (J->state == LJ_TRACE_IDLE &&[m
[31m-      !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) {[m
[31m-    J->parent = 0;  /* Root trace. */[m
[31m-    J->exitno = 0;[m
[31m-    J->state = LJ_TRACE_START;[m
[31m-    lj_trace_ins(J, pc-1);[m
[31m-  }[m
[31m-  ERRNO_RESTORE[m
[31m-}[m
[31m-[m
[31m-/* Check for a hot side exit. If yes, start recording a side trace. */[m
[31m-static void trace_hotside(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  SnapShot *snap = &traceref(J, J->parent)->snap[J->exitno];[m
[31m-  if (!(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT)) &&[m
[31m-      isluafunc(curr_func(J->L)) &&[m
[31m-      snap->count != SNAPCOUNT_DONE &&[m
[31m-      ++snap->count >= J->param[JIT_P_hotexit]) {[m
[31m-    lua_assert(J->state == LJ_TRACE_IDLE);[m
[31m-    /* J->parent is non-zero for a side trace. */[m
[31m-    J->state = LJ_TRACE_START;[m
[31m-    lj_trace_ins(J, pc);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Stitch a new trace to the previous trace. */[m
[31m-void LJ_FASTCALL lj_trace_stitch(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  /* Only start a new trace if not recording or inside __gc call or vmevent. */[m
[31m-  if (J->state == LJ_TRACE_IDLE &&[m
[31m-      !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) {[m
[31m-    J->parent = 0;  /* Have to treat it like a root trace. */[m
[31m-    /* J->exitno is set to the invoking trace. */[m
[31m-    J->state = LJ_TRACE_START;[m
[31m-    lj_trace_ins(J, pc);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Tiny struct to pass data to protected call. */[m
[31m-typedef struct ExitDataCP {[m
[31m-  jit_State *J;[m
[31m-  void *exptr;		/* Pointer to exit state. */[m
[31m-  const BCIns *pc;	/* Restart interpreter at this PC. */[m
[31m-} ExitDataCP;[m
[31m-[m
[31m-/* Need to protect lj_snap_restore because it may throw. */[m
[31m-static TValue *trace_exit_cp(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  ExitDataCP *exd = (ExitDataCP *)ud;[m
[31m-  cframe_errfunc(L->cframe) = -1;  /* Inherit error function. */[m
[31m-  exd->pc = lj_snap_restore(exd->J, exd->exptr);[m
[31m-  UNUSED(dummy);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#ifndef LUAJIT_DISABLE_VMEVENT[m
[31m-/* Push all registers from exit state. */[m
[31m-static void trace_exit_regs(lua_State *L, ExitState *ex)[m
[31m-{[m
[31m-  int32_t i;[m
[31m-  setintV(L->top++, RID_NUM_GPR);[m
[31m-  setintV(L->top++, RID_NUM_FPR);[m
[31m-  for (i = 0; i < RID_NUM_GPR; i++) {[m
[31m-    if (sizeof(ex->gpr[i]) == sizeof(int32_t))[m
[31m-      setintV(L->top++, (int32_t)ex->gpr[i]);[m
[31m-    else[m
[31m-      setnumV(L->top++, (lua_Number)ex->gpr[i]);[m
[31m-  }[m
[31m-#if !LJ_SOFTFP[m
[31m-  for (i = 0; i < RID_NUM_FPR; i++) {[m
[31m-    setnumV(L->top, ex->fpr[i]);[m
[31m-    if (LJ_UNLIKELY(tvisnan(L->top)))[m
[31m-      setnanV(L->top);[m
[31m-    L->top++;[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#ifdef EXITSTATE_PCREG[m
[31m-/* Determine trace number from pc of exit instruction. */[m
[31m-static TraceNo trace_exit_find(jit_State *J, MCode *pc)[m
[31m-{[m
[31m-  TraceNo traceno;[m
[31m-  for (traceno = 1; traceno < J->sizetrace; traceno++) {[m
[31m-    GCtrace *T = traceref(J, traceno);[m
[31m-    if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode))[m
[31m-      return traceno;[m
[31m-  }[m
[31m-  lua_assert(0);[m
[31m-  return 0;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* A trace exited. Restore interpreter state. */[m
[31m-int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  lua_State *L = J->L;[m
[31m-  ExitState *ex = (ExitState *)exptr;[m
[31m-  ExitDataCP exd;[m
[31m-  int errcode;[m
[31m-  const BCIns *pc;[m
[31m-  void *cf;[m
[31m-  GCtrace *T;[m
[31m-#ifdef EXITSTATE_PCREG[m
[31m-  J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]);[m
[31m-#endif[m
[31m-  T = traceref(J, J->parent); UNUSED(T);[m
[31m-#ifdef EXITSTATE_CHECKEXIT[m
[31m-  if (J->exitno == T->nsnap) {  /* Treat stack check like a parent exit. */[m
[31m-    lua_assert(T->root != 0);[m
[31m-    J->exitno = T->ir[REF_BASE].op2;[m
[31m-    J->parent = T->ir[REF_BASE].op1;[m
[31m-    T = traceref(J, J->parent);[m
[31m-  }[m
[31m-#endif[m
[31m-  lua_assert(T != NULL && J->exitno < T->nsnap);[m
[31m-  exd.J = J;[m
[31m-  exd.exptr = exptr;[m
[31m-  errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);[m
[31m-  if (errcode)[m
[31m-    return -errcode;  /* Return negated error code. */[m
[31m-[m
[31m-  if (!(LJ_HASPROFILE && (G(L)->hookmask & HOOK_PROFILE)))[m
[31m-    lj_vmevent_send(L, TEXIT,[m
[31m-      lj_state_checkstack(L, 4+RID_NUM_GPR+RID_NUM_FPR+LUA_MINSTACK);[m
[31m-      setintV(L->top++, J->parent);[m
[31m-      setintV(L->top++, J->exitno);[m
[31m-      trace_exit_regs(L, ex);[m
[31m-    );[m
[31m-[m
[31m-  pc = exd.pc;[m
[31m-  cf = cframe_raw(L->cframe);[m
[31m-  setcframe_pc(cf, pc);[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  /*[m
[31m-  ** DEBUGGING: Check GC objects in current stack.[m
[31m-  ** NOTE: THIS IS EXPENSIVE -- DON'T LEAVE PERMANENTLY ENABLED![m
[31m-  */[m
[31m-  {[m
[31m-    TValue *o, *top = L->top;[m
[31m-    for (o = tvref(L->stack)+1; o < top; o++) {[m
[31m-      tvchecklive(L, o);[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  if (LJ_HASPROFILE && (G(L)->hookmask & HOOK_PROFILE)) {[m
[31m-    /* Just exit to interpreter. */[m
[31m-  } else if (G(L)->gc.state == GCSatomic || G(L)->gc.state == GCSfinalize) {[m
[31m-    if (!(G(L)->hookmask & HOOK_GC))[m
[31m-      lj_gc_step(L);  /* Exited because of GC: drive GC forward. */[m
[31m-  } else {[m
[31m-    trace_hotside(J, pc);[m
[31m-  }[m
[31m-  if (bc_op(*pc) == BC_JLOOP) {[m
[31m-    BCIns *retpc = &traceref(J, bc_d(*pc))->startins;[m
[31m-    if (bc_isret(bc_op(*retpc))) {[m
[31m-      if (J->state == LJ_TRACE_RECORD) {[m
[31m-	J->patchins = *pc;[m
[31m-	J->patchpc = (BCIns *)pc;[m
[31m-	*J->patchpc = *retpc;[m
[31m-	J->bcskip = 1;[m
[31m-      } else {[m
[31m-	pc = retpc;[m
[31m-	setcframe_pc(cf, pc);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-  lj_log_trace_normal_exit(L, (int) T->traceno, pc);[m
[31m-#endif[m
[31m-  /* Return MULTRES or 0. */[m
[31m-  ERRNO_RESTORE[m
[31m-  switch (bc_op(*pc)) {[m
[31m-  case BC_CALLM: case BC_CALLMT:[m
[31m-    return (int)((BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc) + LJ_FR2);[m
[31m-  case BC_RETM:[m
[31m-    return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc));[m
[31m-  case BC_TSETM:[m
[31m-    return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc));[m
[31m-  default:[m
[31m-    if (bc_op(*pc) >= BC_FUNCF)[m
[31m-      return (int)((BCReg)(L->top - L->base) + 1);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.h[m
[1mdeleted file mode 100644[m
[1mindex 6faa1aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_trace.h[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-/*[m
[31m-** Trace management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TRACE_H[m
[31m-#define _LJ_TRACE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-[m
[31m-/* Trace errors. */[m
[31m-typedef enum {[m
[31m-#define TREDEF(name, msg)	LJ_TRERR_##name,[m
[31m-#include "lj_traceerr.h"[m
[31m-  LJ_TRERR__MAX[m
[31m-} TraceError;[m
[31m-[m
[31m-LJ_FUNC_NORET void lj_trace_err(jit_State *J, TraceError e);[m
[31m-LJ_FUNC_NORET void lj_trace_err_info(jit_State *J, TraceError e);[m
[31m-[m
[31m-/* Trace management. */[m
[31m-LJ_FUNC void LJ_FASTCALL lj_trace_free(global_State *g, GCtrace *T);[m
[31m-LJ_FUNC void lj_trace_reenableproto(GCproto *pt);[m
[31m-LJ_FUNC void lj_trace_flushproto(global_State *g, GCproto *pt);[m
[31m-LJ_FUNC void lj_trace_flush(jit_State *J, TraceNo traceno);[m
[31m-LJ_FUNC int lj_trace_flushall(lua_State *L);[m
[31m-LJ_FUNC void lj_trace_initstate(global_State *g);[m
[31m-LJ_FUNC void lj_trace_freestate(global_State *g);[m
[31m-[m
[31m-/* Event handling. */[m
[31m-LJ_FUNC void lj_trace_ins(jit_State *J, const BCIns *pc);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_trace_stitch(jit_State *J, const BCIns *pc);[m
[31m-LJ_FUNCA int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr);[m
[31m-[m
[31m-/* Signal asynchronous abort of trace or end of trace. */[m
[31m-#define lj_trace_abort(g)	(G2J(g)->state &= ~LJ_TRACE_ACTIVE)[m
[31m-#define lj_trace_end(J)		(J->state = LJ_TRACE_END)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define lj_trace_flushall(L)	(UNUSED(L), 0)[m
[31m-#define lj_trace_initstate(g)	UNUSED(g)[m
[31m-#define lj_trace_freestate(g)	UNUSED(g)[m
[31m-#define lj_trace_abort(g)	UNUSED(g)[m
[31m-#define lj_trace_end(J)		UNUSED(J)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_traceerr.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_traceerr.h[m
[1mdeleted file mode 100644[m
[1mindex 9c01ffb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_traceerr.h[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-/*[m
[31m-** Trace compiler error messages.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* This file may be included multiple times with different TREDEF macros. */[m
[31m-[m
[31m-/* Recording. */[m
[31m-TREDEF(RECERR,	"error thrown or hook called during recording")[m
[31m-TREDEF(TRACEUV,	"trace too short")[m
[31m-TREDEF(TRACEOV,	"trace too long")[m
[31m-TREDEF(STACKOV,	"trace too deep")[m
[31m-TREDEF(SNAPOV,	"too many snapshots")[m
[31m-TREDEF(BLACKL,	"blacklisted")[m
[31m-TREDEF(RETRY,	"retry recording")[m
[31m-TREDEF(NYIBC,	"NYI: bytecode %d")[m
[31m-[m
[31m-/* Recording loop ops. */[m
[31m-TREDEF(LLEAVE,	"leaving loop in root trace")[m
[31m-TREDEF(LINNER,	"inner loop in root trace")[m
[31m-TREDEF(LUNROLL,	"loop unroll limit reached")[m
[31m-[m
[31m-/* Recording calls/returns. */[m
[31m-TREDEF(BADTYPE,	"bad argument type")[m
[31m-TREDEF(CJITOFF,	"JIT compilation disabled for function")[m
[31m-TREDEF(CUNROLL,	"call unroll limit reached")[m
[31m-TREDEF(DOWNREC,	"down-recursion, restarting")[m
[31m-TREDEF(NYIFFU,	"NYI: unsupported variant of FastFunc %s")[m
[31m-TREDEF(NYIRETL,	"NYI: return to lower frame")[m
[31m-[m
[31m-/* Recording indexed load/store. */[m
[31m-TREDEF(STORENN,	"store with nil or NaN key")[m
[31m-TREDEF(NOMM,	"missing metamethod")[m
[31m-TREDEF(IDXLOOP,	"looping index lookup")[m
[31m-TREDEF(NYITMIX,	"NYI: mixed sparse/dense table")[m
[31m-[m
[31m-/* Recording C data operations. */[m
[31m-TREDEF(NOCACHE,	"symbol not in cache")[m
[31m-TREDEF(NYICONV,	"NYI: unsupported C type conversion")[m
[31m-TREDEF(NYICALL,	"NYI: unsupported C function type")[m
[31m-[m
[31m-/* Optimizations. */[m
[31m-TREDEF(GFAIL,	"guard would always fail")[m
[31m-TREDEF(PHIOV,	"too many PHIs")[m
[31m-TREDEF(TYPEINS,	"persistent type instability")[m
[31m-[m
[31m-/* Assembler. */[m
[31m-TREDEF(MCODEAL,	"failed to allocate mcode memory")[m
[31m-TREDEF(MCODEOV,	"machine code too long")[m
[31m-TREDEF(MCODELM,	"hit mcode limit (retrying)")[m
[31m-TREDEF(SPILLOV,	"too many spill slots")[m
[31m-TREDEF(BADRA,	"inconsistent register allocation")[m
[31m-TREDEF(NYIIR,	"NYI: cannot assemble IR instruction %d")[m
[31m-TREDEF(NYIPHI,	"NYI: PHI shuffling too complex")[m
[31m-TREDEF(NYICOAL,	"NYI: register coalescing too complex")[m
[31m-[m
[31m-#undef TREDEF[m
[31m-[m
[31m-/* Detecting unused error messages:[m
[31m-   awk -F, '/^TREDEF/ { gsub(/TREDEF./, ""); printf "grep -q LJ_TRERR_%s *.[ch] || echo %s\n", $1, $1}' lj_traceerr.h | sh[m
[31m-*/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.c[m
[1mdeleted file mode 100644[m
[1mindex 71697a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.c[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-/*[m
[31m-** Userdata handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_udata_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_udata.h"[m
[31m-[m
[31m-GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env)[m
[31m-{[m
[31m-  GCudata *ud = lj_mem_newt(L, sizeof(GCudata) + sz, GCudata);[m
[31m-  global_State *g = G(L);[m
[31m-  newwhite(g, ud);  /* Not finalized. */[m
[31m-  ud->gct = ~LJ_TUDATA;[m
[31m-  ud->udtype = UDTYPE_USERDATA;[m
[31m-  ud->len = sz;[m
[31m-  /* NOBARRIER: The GCudata is new (marked white). */[m
[31m-  setgcrefnull(ud->metatable);[m
[31m-  setgcref(ud->env, obj2gco(env));[m
[31m-  /* Chain to userdata list (after main thread). */[m
[31m-  setgcrefr(ud->nextgc, mainthread(g)->nextgc);[m
[31m-  setgcref(mainthread(g)->nextgc, obj2gco(ud));[m
[31m-  return ud;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud)[m
[31m-{[m
[31m-  lj_mem_free(g, ud, sizeudata(ud));[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.h[m
[1mdeleted file mode 100644[m
[1mindex 81c1581..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_udata.h[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-/*[m
[31m-** Userdata handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_UDATA_H[m
[31m-#define _LJ_UDATA_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-LJ_FUNC GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.h[m
[1mdeleted file mode 100644[m
[1mindex be35295..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vm.h[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-/*[m
[31m-** Assembler VM interface definitions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_VM_H[m
[31m-#define _LJ_VM_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Entry points for ASM parts of VM. */[m
[31m-LJ_ASMF void lj_vm_call(lua_State *L, TValue *base, int nres1);[m
[31m-LJ_ASMF int lj_vm_pcall(lua_State *L, TValue *base, int nres1, ptrdiff_t ef);[m
[31m-typedef TValue *(*lua_CPFunction)(lua_State *L, lua_CFunction func, void *ud);[m
[31m-LJ_ASMF int lj_vm_cpcall(lua_State *L, lua_CFunction func, void *ud,[m
[31m-			 lua_CPFunction cp);[m
[31m-LJ_ASMF int lj_vm_resume(lua_State *L, TValue *base, int nres1, ptrdiff_t ef);[m
[31m-LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_c(void *cframe, int errcode);[m
[31m-LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_ff(void *cframe);[m
[31m-LJ_ASMF void lj_vm_unwind_c_eh(void);[m
[31m-LJ_ASMF void lj_vm_unwind_ff_eh(void);[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-LJ_ASMF void lj_vm_unwind_rethrow(void);[m
[31m-#endif[m
[31m-[m
[31m-/* Miscellaneous functions. */[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-LJ_ASMF int lj_vm_cpuid(uint32_t f, uint32_t res[4]);[m
[31m-#endif[m
[31m-#if LJ_TARGET_PPC[m
[31m-void lj_vm_cachesync(void *start, void *end);[m
[31m-#endif[m
[31m-LJ_ASMF double lj_vm_foldarith(double x, double y, int op);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_ASMF double lj_vm_foldfpm(double x, int op);[m
[31m-#endif[m
[31m-#if !LJ_ARCH_HASFPU[m
[31m-/* Declared in lj_obj.h: LJ_ASMF int32_t lj_vm_tobit(double x); */[m
[31m-#endif[m
[31m-[m
[31m-/* Dispatch targets for recording and hooks. */[m
[31m-LJ_ASMF void lj_vm_record(void);[m
[31m-LJ_ASMF void lj_vm_inshook(void);[m
[31m-LJ_ASMF void lj_vm_rethook(void);[m
[31m-LJ_ASMF void lj_vm_callhook(void);[m
[31m-LJ_ASMF void lj_vm_profhook(void);[m
[31m-[m
[31m-/* Trace exit handling. */[m
[31m-LJ_ASMF void lj_vm_exit_handler(void);[m
[31m-LJ_ASMF void lj_vm_exit_interp(void);[m
[31m-[m
[31m-/* Internal math helper functions. */[m
[31m-#if LJ_TARGET_PPC || LJ_TARGET_ARM64 || (LJ_TARGET_MIPS && LJ_ABI_SOFTFP)[m
[31m-#define lj_vm_floor	floor[m
[31m-#define lj_vm_ceil	ceil[m
[31m-#else[m
[31m-LJ_ASMF double lj_vm_floor(double);[m
[31m-LJ_ASMF double lj_vm_ceil(double);[m
[31m-#if LJ_TARGET_ARM[m
[31m-LJ_ASMF double lj_vm_floor_sf(double);[m
[31m-LJ_ASMF double lj_vm_ceil_sf(double);[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef LUAJIT_NO_LOG2[m
[31m-LJ_ASMF double lj_vm_log2(double);[m
[31m-#else[m
[31m-#define lj_vm_log2	log2[m
[31m-#endif[m
[31m-#if !(defined(_LJ_DISPATCH_H) && LJ_TARGET_MIPS)[m
[31m-LJ_ASMF int32_t LJ_FASTCALL lj_vm_modi(int32_t, int32_t);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-LJ_ASMF void lj_vm_floor_sse(void);[m
[31m-LJ_ASMF void lj_vm_ceil_sse(void);[m
[31m-LJ_ASMF void lj_vm_trunc_sse(void);[m
[31m-LJ_ASMF void lj_vm_powi_sse(void);[m
[31m-#define lj_vm_powi	NULL[m
[31m-#else[m
[31m-LJ_ASMF double lj_vm_powi(double, int32_t);[m
[31m-#endif[m
[31m-#if LJ_TARGET_PPC || LJ_TARGET_ARM64[m
[31m-#define lj_vm_trunc	trunc[m
[31m-#else[m
[31m-LJ_ASMF double lj_vm_trunc(double);[m
[31m-#if LJ_TARGET_ARM[m
[31m-LJ_ASMF double lj_vm_trunc_sf(double);[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef LUAJIT_NO_EXP2[m
[31m-LJ_ASMF double lj_vm_exp2(double);[m
[31m-#else[m
[31m-#define lj_vm_exp2	exp2[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-LJ_ASMF int lj_vm_errno(void);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Continuations for metamethods. */[m
[31m-LJ_ASMF void lj_cont_cat(void);  /* Continue with concatenation. */[m
[31m-LJ_ASMF void lj_cont_ra(void);  /* Store result in RA from instruction. */[m
[31m-LJ_ASMF void lj_cont_nop(void);  /* Do nothing, just continue execution. */[m
[31m-LJ_ASMF void lj_cont_condt(void);  /* Branch if result is true. */[m
[31m-LJ_ASMF void lj_cont_condf(void);  /* Branch if result is false. */[m
[31m-LJ_ASMF void lj_cont_hook(void);  /* Continue from hook yield. */[m
[31m-LJ_ASMF void lj_cont_stitch(void);  /* Trace stitching. */[m
[31m-[m
[31m-/* Start of the ASM code. */[m
[31m-LJ_ASMF char lj_vm_asm_begin[];[m
[31m-[m
[31m-/* Bytecode offsets are relative to lj_vm_asm_begin. */[m
[31m-#define makeasmfunc(ofs)	((ASMFunction)(lj_vm_asm_begin + (ofs)))[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.c[m
[1mdeleted file mode 100644[m
[1mindex 3acdd25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.c[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-/*[m
[31m-** VM event handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lj_vmevent_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_vmevent.h"[m
[31m-[m
[31m-ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCstr *s = lj_str_newlit(L, LJ_VMEVENTS_REGKEY);[m
[31m-  cTValue *tv = lj_tab_getstr(tabV(registry(L)), s);[m
[31m-  if (tvistab(tv)) {[m
[31m-    int hash = VMEVENT_HASH(ev);[m
[31m-    tv = lj_tab_getint(tabV(tv), hash);[m
[31m-    if (tv && tvisfunc(tv)) {[m
[31m-      lj_state_checkstack(L, LUA_MINSTACK);[m
[31m-      setfuncV(L, L->top++, funcV(tv));[m
[31m-      if (LJ_FR2) setnilV(L->top++);[m
[31m-      return savestack(L, L->top);[m
[31m-    }[m
[31m-  }[m
[31m-  g->vmevmask &= ~VMEVENT_MASK(ev);  /* No handler: cache this fact. */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-void lj_vmevent_call(lua_State *L, ptrdiff_t argbase)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  uint8_t oldmask = g->vmevmask;[m
[31m-  uint8_t oldh = hook_save(g);[m
[31m-  int status;[m
[31m-  g->vmevmask = 0;  /* Disable all events. */[m
[31m-  hook_vmevent(g);[m
[31m-  status = lj_vm_pcall(L, restorestack(L, argbase), 0+1, 0);[m
[31m-  if (LJ_UNLIKELY(status)) {[m
[31m-    /* Really shouldn't use stderr here, but where else to complain? */[m
[31m-    L->top--;[m
[31m-    fputs("VM handler failed: ", stderr);[m
[31m-    fputs(tvisstr(L->top) ? strVdata(L->top) : "?", stderr);[m
[31m-    fputc('\n', stderr);[m
[31m-  }[m
[31m-  hook_restore(g, oldh);[m
[31m-  if (g->vmevmask != VMEVENT_NOCACHE)[m
[31m-    g->vmevmask = oldmask;  /* Restore event mask, but not if not modified. */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.h[m
[1mdeleted file mode 100644[m
[1mindex b9495b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmevent.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-/*[m
[31m-** VM event handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_VMEVENT_H[m
[31m-#define _LJ_VMEVENT_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Registry key for VM event handler table. */[m
[31m-#define LJ_VMEVENTS_REGKEY	"_VMEVENTS"[m
[31m-#define LJ_VMEVENTS_HSIZE	4[m
[31m-[m
[31m-#define VMEVENT_MASK(ev)	((uint8_t)1 << ((int)(ev) & 7))[m
[31m-#define VMEVENT_HASH(ev)	((int)(ev) & ~7)[m
[31m-#define VMEVENT_HASHIDX(h)	((int)(h) << 3)[m
[31m-#define VMEVENT_NOCACHE		255[m
[31m-[m
[31m-#define VMEVENT_DEF(name, hash) \[m
[31m-  LJ_VMEVENT_##name##_, \[m
[31m-  LJ_VMEVENT_##name = ((LJ_VMEVENT_##name##_) & 7)|((hash) << 3)[m
[31m-[m
[31m-/* VM event IDs. */[m
[31m-typedef enum {[m
[31m-  VMEVENT_DEF(BC,	0x00003883),[m
[31m-  VMEVENT_DEF(TRACE,	0xb2d91467),[m
[31m-  VMEVENT_DEF(RECORD,	0x9284bf4f),[m
[31m-  VMEVENT_DEF(TEXIT,	0xb29df2b0),[m
[31m-  LJ_VMEVENT__MAX[m
[31m-} VMEvent;[m
[31m-[m
[31m-#ifdef LUAJIT_DISABLE_VMEVENT[m
[31m-#define lj_vmevent_send(L, ev, args)		UNUSED(L)[m
[31m-#define lj_vmevent_send_(L, ev, args, post)	UNUSED(L)[m
[31m-#else[m
[31m-#define lj_vmevent_send(L, ev, args) \[m
[31m-  if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \[m
[31m-    ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \[m
[31m-    if (argbase) { \[m
[31m-      args \[m
[31m-      lj_vmevent_call(L, argbase); \[m
[31m-    } \[m
[31m-  }[m
[31m-#define lj_vmevent_send_(L, ev, args, post) \[m
[31m-  if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \[m
[31m-    ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \[m
[31m-    if (argbase) { \[m
[31m-      args \[m
[31m-      lj_vmevent_call(L, argbase); \[m
[31m-      post \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-LJ_FUNC ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev);[m
[31m-LJ_FUNC void lj_vmevent_call(lua_State *L, ptrdiff_t argbase);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath.c[m
[1mdeleted file mode 100644[m
[1mindex e662265..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lj_vmmath.c[m
[1m+++ /dev/null[m
[36m@@ -1,152 +0,0 @@[m
[31m-/*[m
[31m-** Math helper functions for assembler VM.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_vmmath_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <math.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* -- Wrapper functions --------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86 && __ELF__ && __PIC__[m
[31m-/* Wrapper functions to deal with the ELF/x86 PIC disaster. */[m
[31m-LJ_FUNCA double lj_wrap_log(double x) { return log(x); }[m
[31m-LJ_FUNCA double lj_wrap_log10(double x) { return log10(x); }[m
[31m-LJ_FUNCA double lj_wrap_exp(double x) { return exp(x); }[m
[31m-LJ_FUNCA double lj_wrap_sin(double x) { return sin(x); }[m
[31m-LJ_FUNCA double lj_wrap_cos(double x) { return cos(x); }[m
[31m-LJ_FUNCA double lj_wrap_tan(double x) { return tan(x); }[m
[31m-LJ_FUNCA double lj_wrap_asin(double x) { return asin(x); }[m
[31m-LJ_FUNCA double lj_wrap_acos(double x) { return acos(x); }[m
[31m-LJ_FUNCA double lj_wrap_atan(double x) { return atan(x); }[m
[31m-LJ_FUNCA double lj_wrap_sinh(double x) { return sinh(x); }[m
[31m-LJ_FUNCA double lj_wrap_cosh(double x) { return cosh(x); }[m
[31m-LJ_FUNCA double lj_wrap_tanh(double x) { return tanh(x); }[m
[31m-LJ_FUNCA double lj_wrap_atan2(double x, double y) { return atan2(x, y); }[m
[31m-LJ_FUNCA double lj_wrap_pow(double x, double y) { return pow(x, y); }[m
[31m-LJ_FUNCA double lj_wrap_fmod(double x, double y) { return fmod(x, y); }[m
[31m-#endif[m
[31m-[m
[31m-/* -- Helper functions for generated machine code ------------------------- */[m
[31m-[m
[31m-double lj_vm_foldarith(double x, double y, int op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case IR_ADD - IR_ADD: return x+y; break;[m
[31m-  case IR_SUB - IR_ADD: return x-y; break;[m
[31m-  case IR_MUL - IR_ADD: return x*y; break;[m
[31m-  case IR_DIV - IR_ADD: return x/y; break;[m
[31m-  case IR_MOD - IR_ADD: return x-lj_vm_floor(x/y)*y; break;[m
[31m-  case IR_POW - IR_ADD: return pow(x, y); break;[m
[31m-  case IR_NEG - IR_ADD: return -x; break;[m
[31m-  case IR_ABS - IR_ADD: return fabs(x); break;[m
[31m-#if LJ_HASJIT[m
[31m-  case IR_ATAN2 - IR_ADD: return atan2(x, y); break;[m
[31m-  case IR_LDEXP - IR_ADD: return ldexp(x, (int)y); break;[m
[31m-  case IR_MIN - IR_ADD: return x > y ? y : x; break;[m
[31m-  case IR_MAX - IR_ADD: return x < y ? y : x; break;[m
[31m-#endif[m
[31m-  default: return x;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if (LJ_HASJIT && !(LJ_TARGET_ARM || LJ_TARGET_ARM64 || LJ_TARGET_PPC)) || LJ_TARGET_MIPS[m
[31m-int32_t LJ_FASTCALL lj_vm_modi(int32_t a, int32_t b)[m
[31m-{[m
[31m-  uint32_t y, ua, ub;[m
[31m-  lua_assert(b != 0);  /* This must be checked before using this function. */[m
[31m-  ua = a < 0 ? (uint32_t)-a : (uint32_t)a;[m
[31m-  ub = b < 0 ? (uint32_t)-b : (uint32_t)b;[m
[31m-  y = ua % ub;[m
[31m-  if (y != 0 && (a^b) < 0) y = y - ub;[m
[31m-  if (((int32_t)y^b) < 0) y = (uint32_t)-(int32_t)y;[m
[31m-  return (int32_t)y;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#ifdef LUAJIT_NO_LOG2[m
[31m-double lj_vm_log2(double a)[m
[31m-{[m
[31m-  return log(a) * 1.4426950408889634074;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#ifdef LUAJIT_NO_EXP2[m
[31m-double lj_vm_exp2(double a)[m
[31m-{[m
[31m-  return exp(a * 0.6931471805599453);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_TARGET_X86ORX64[m
[31m-/* Unsigned x^k. */[m
[31m-static double lj_vm_powui(double x, uint32_t k)[m
[31m-{[m
[31m-  double y;[m
[31m-  lua_assert(k != 0);[m
[31m-  for (; (k & 1) == 0; k >>= 1) x *= x;[m
[31m-  y = x;[m
[31m-  if ((k >>= 1) != 0) {[m
[31m-    for (;;) {[m
[31m-      x *= x;[m
[31m-      if (k == 1) break;[m
[31m-      if (k & 1) y *= x;[m
[31m-      k >>= 1;[m
[31m-    }[m
[31m-    y *= x;[m
[31m-  }[m
[31m-  return y;[m
[31m-}[m
[31m-[m
[31m-/* Signed x^k. */[m
[31m-double lj_vm_powi(double x, int32_t k)[m
[31m-{[m
[31m-  if (k > 1)[m
[31m-    return lj_vm_powui(x, (uint32_t)k);[m
[31m-  else if (k == 1)[m
[31m-    return x;[m
[31m-  else if (k == 0)[m
[31m-    return 1.0;[m
[31m-  else[m
[31m-    return 1.0 / lj_vm_powui(x, (uint32_t)-k);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Computes fpm(x) for extended math functions. */[m
[31m-double lj_vm_foldfpm(double x, int fpm)[m
[31m-{[m
[31m-  switch (fpm) {[m
[31m-  case IRFPM_FLOOR: return lj_vm_floor(x);[m
[31m-  case IRFPM_CEIL: return lj_vm_ceil(x);[m
[31m-  case IRFPM_TRUNC: return lj_vm_trunc(x);[m
[31m-  case IRFPM_SQRT: return sqrt(x);[m
[31m-  case IRFPM_EXP: return exp(x);[m
[31m-  case IRFPM_EXP2: return lj_vm_exp2(x);[m
[31m-  case IRFPM_LOG: return log(x);[m
[31m-  case IRFPM_LOG2: return lj_vm_log2(x);[m
[31m-  case IRFPM_LOG10: return log10(x);[m
[31m-  case IRFPM_SIN: return sin(x);[m
[31m-  case IRFPM_COS: return cos(x);[m
[31m-  case IRFPM_TAN: return tan(x);[m
[31m-  default: lua_assert(0);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-int lj_vm_errno(void)[m
[31m-{[m
[31m-  return errno;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/ljamalg.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/ljamalg.c[m
[1mdeleted file mode 100644[m
[1mindex 4c44de2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/ljamalg.c[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT core and libraries amalgamation.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/*[m
[31m-+--------------------------------------------------------------------------+[m
[31m-| WARNING: Compiling the amalgamation needs a lot of virtual memory        |[m
[31m-| (around 300 MB with GCC 4.x)! If you don't have enough physical memory   |[m
[31m-| your machine will start swapping to disk and the compile will not finish |[m
[31m-| within a reasonable amount of time.                                      |[m
[31m-| So either compile on a bigger machine or use the non-amalgamated build.  |[m
[31m-+--------------------------------------------------------------------------+[m
[31m-*/[m
[31m-[m
[31m-#define ljamalg_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-/* To get the mremap prototype. Must be defined before any system includes. */[m
[31m-#if defined(__linux__) && !defined(_GNU_SOURCE)[m
[31m-#define _GNU_SOURCE[m
[31m-#endif[m
[31m-[m
[31m-#ifndef WINVER[m
[31m-#define WINVER 0x0501[m
[31m-#endif[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "lj_gc.c"[m
[31m-#include "lj_err.c"[m
[31m-#include "lj_char.c"[m
[31m-#include "lj_bc.c"[m
[31m-#include "lj_obj.c"[m
[31m-#include "lj_buf.c"[m
[31m-#include "lj_str.c"[m
[31m-#include "lj_tab.c"[m
[31m-#include "lj_func.c"[m
[31m-#include "lj_udata.c"[m
[31m-#include "lj_meta.c"[m
[31m-#include "lj_debug.c"[m
[31m-#include "lj_state.c"[m
[31m-#include "lj_dispatch.c"[m
[31m-#include "lj_vmevent.c"[m
[31m-#include "lj_vmmath.c"[m
[31m-#include "lj_strscan.c"[m
[31m-#include "lj_strfmt.c"[m
[31m-#include "lj_strfmt_num.c"[m
[31m-#include "lj_api.c"[m
[31m-#include "lj_profile.c"[m
[31m-#include "lj_lex.c"[m
[31m-#include "lj_parse.c"[m
[31m-#include "lj_bcread.c"[m
[31m-#include "lj_bcwrite.c"[m
[31m-#include "lj_load.c"[m
[31m-#include "lj_ctype.c"[m
[31m-#include "lj_cdata.c"[m
[31m-#include "lj_cconv.c"[m
[31m-#include "lj_ccall.c"[m
[31m-#include "lj_ccallback.c"[m
[31m-#include "lj_carith.c"[m
[31m-#include "lj_clib.c"[m
[31m-#include "lj_cparse.c"[m
[31m-#include "lj_lib.c"[m
[31m-#include "lj_ir.c"[m
[31m-#include "lj_opt_mem.c"[m
[31m-#include "lj_opt_fold.c"[m
[31m-#include "lj_opt_narrow.c"[m
[31m-#include "lj_opt_dce.c"[m
[31m-#include "lj_opt_loop.c"[m
[31m-#include "lj_opt_split.c"[m
[31m-#include "lj_opt_sink.c"[m
[31m-#include "lj_mcode.c"[m
[31m-#include "lj_snap.c"[m
[31m-#include "lj_record.c"[m
[31m-#include "lj_crecord.c"[m
[31m-#include "lj_ffrecord.c"[m
[31m-#include "lj_asm.c"[m
[31m-#include "lj_trace.c"[m
[31m-#include "lj_gdbjit.c"[m
[31m-#include "lj_alloc.c"[m
[31m-[m
[31m-#include "lib_aux.c"[m
[31m-#include "lib_base.c"[m
[31m-#include "lib_math.c"[m
[31m-#include "lib_string.c"[m
[31m-#include "lib_table.c"[m
[31m-#include "lib_io.c"[m
[31m-#include "lib_os.c"[m
[31m-#include "lib_package.c"[m
[31m-#include "lib_debug.c"[m
[31m-#include "lib_bit.c"[m
[31m-#include "lib_jit.c"[m
[31m-#include "lib_ffi.c"[m
[31m-#include "lib_init.c"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lua.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lua.h[m
[1mdeleted file mode 100644[m
[1mindex 352d29f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lua.h[m
[1m+++ /dev/null[m
[36m@@ -1,394 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $[m
[31m-** Lua - An Extensible Extension Language[m
[31m-** Lua.org, PUC-Rio, Brazil (http://www.lua.org)[m
[31m-** See Copyright Notice at the end of this file[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lua_h[m
[31m-#define lua_h[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-#include "luaconf.h"[m
[31m-[m
[31m-[m
[31m-#define LUA_VERSION	"Lua 5.1"[m
[31m-#define LUA_RELEASE	"Lua 5.1.4"[m
[31m-#define LUA_VERSION_NUM	501[m
[31m-#define LUA_COPYRIGHT	"Copyright (C) 1994-2008 Lua.org, PUC-Rio"[m
[31m-#define LUA_AUTHORS	"R. Ierusalimschy, L. H. de Figueiredo & W. Celes"[m
[31m-[m
[31m-[m
[31m-/* mark for precompiled code (`<esc>Lua') */[m
[31m-#define	LUA_SIGNATURE	"\033Lua"[m
[31m-[m
[31m-/* option for multiple returns in `lua_pcall' and `lua_call' */[m
[31m-#define LUA_MULTRET	(-1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** pseudo-indices[m
[31m-*/[m
[31m-#define LUA_REGISTRYINDEX	(-10000)[m
[31m-#define LUA_ENVIRONINDEX	(-10001)[m
[31m-#define LUA_GLOBALSINDEX	(-10002)[m
[31m-#define lua_upvalueindex(i)	(LUA_GLOBALSINDEX-(i))[m
[31m-[m
[31m-[m
[31m-/* thread status; 0 is OK */[m
[31m-#define LUA_YIELD	1[m
[31m-#define LUA_ERRRUN	2[m
[31m-#define LUA_ERRSYNTAX	3[m
[31m-#define LUA_ERRMEM	4[m
[31m-#define LUA_ERRERR	5[m
[31m-[m
[31m-[m
[31m-typedef struct lua_State lua_State;[m
[31m-[m
[31m-typedef int (*lua_CFunction) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** functions that read/write blocks when loading/dumping Lua chunks[m
[31m-*/[m
[31m-typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);[m
[31m-[m
[31m-typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** prototype for memory-allocation functions[m
[31m-*/[m
[31m-typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic types[m
[31m-*/[m
[31m-#define LUA_TNONE		(-1)[m
[31m-[m
[31m-#define LUA_TNIL		0[m
[31m-#define LUA_TBOOLEAN		1[m
[31m-#define LUA_TLIGHTUSERDATA	2[m
[31m-#define LUA_TNUMBER		3[m
[31m-#define LUA_TSTRING		4[m
[31m-#define LUA_TTABLE		5[m
[31m-#define LUA_TFUNCTION		6[m
[31m-#define LUA_TUSERDATA		7[m
[31m-#define LUA_TTHREAD		8[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* minimum Lua stack available to a C function */[m
[31m-#define LUA_MINSTACK	20[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** generic extra include file[m
[31m-*/[m
[31m-#if defined(LUA_USER_H)[m
[31m-#include LUA_USER_H[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* type of numbers in Lua */[m
[31m-typedef LUA_NUMBER lua_Number;[m
[31m-[m
[31m-[m
[31m-/* type for integer functions */[m
[31m-typedef LUA_INTEGER lua_Integer;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** state manipulation[m
[31m-*/[m
[31m-LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);[m
[31m-LUA_API void       (lua_close) (lua_State *L);[m
[31m-LUA_API lua_State *(lua_newthread) (lua_State *L);[m
[31m-[m
[31m-LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic stack manipulation[m
[31m-*/[m
[31m-LUA_API int   (lua_gettop) (lua_State *L);[m
[31m-LUA_API void  (lua_settop) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_pushvalue) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_remove) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_insert) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_replace) (lua_State *L, int idx);[m
[31m-LUA_API int   (lua_checkstack) (lua_State *L, int sz);[m
[31m-[m
[31m-LUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** access functions (stack -> C)[m
[31m-*/[m
[31m-[m
[31m-LUA_API int             (lua_isnumber) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isstring) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_iscfunction) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isuserdata) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_type) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_typename) (lua_State *L, int tp);[m
[31m-[m
[31m-LUA_API int            (lua_equal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_rawequal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_lessthan) (lua_State *L, int idx1, int idx2);[m
[31m-[m
[31m-LUA_API lua_Number      (lua_tonumber) (lua_State *L, int idx);[m
[31m-LUA_API lua_Integer     (lua_tointeger) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_toboolean) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);[m
[31m-LUA_API size_t          (lua_objlen) (lua_State *L, int idx);[m
[31m-LUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);[m
[31m-LUA_API void	       *(lua_touserdata) (lua_State *L, int idx);[m
[31m-LUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);[m
[31m-LUA_API const void     *(lua_topointer) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** push functions (C -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_pushnil) (lua_State *L);[m
[31m-LUA_API void  (lua_pushnumber) (lua_State *L, lua_Number n);[m
[31m-LUA_API void  (lua_pushinteger) (lua_State *L, lua_Integer n);[m
[31m-LUA_API void  (lua_pushlstring) (lua_State *L, const char *s, size_t l);[m
[31m-LUA_API void  (lua_pushstring) (lua_State *L, const char *s);[m
[31m-LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,[m
[31m-                                                      va_list argp);[m
[31m-LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);[m
[31m-LUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);[m
[31m-LUA_API void  (lua_pushboolean) (lua_State *L, int b);[m
[31m-LUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);[m
[31m-LUA_API int   (lua_pushthread) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** get functions (Lua -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_gettable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_getfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawget) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawgeti) (lua_State *L, int idx, int n);[m
[31m-LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);[m
[31m-LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);[m
[31m-LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API void  (lua_getfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** set functions (stack -> Lua)[m
[31m-*/[m
[31m-LUA_API void  (lua_settable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawset) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);[m
[31m-LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API int   (lua_setfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `load' and `call' functions (load and run Lua code)[m
[31m-*/[m
[31m-LUA_API void  (lua_call) (lua_State *L, int nargs, int nresults);[m
[31m-LUA_API int   (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);[m
[31m-LUA_API int   (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);[m
[31m-LUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt,[m
[31m-                                        const char *chunkname);[m
[31m-[m
[31m-LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** coroutine functions[m
[31m-*/[m
[31m-LUA_API int  (lua_yield) (lua_State *L, int nresults);[m
[31m-LUA_API int  (lua_resume) (lua_State *L, int narg);[m
[31m-LUA_API int  (lua_status) (lua_State *L);[m
[31m-[m
[31m-/*[m
[31m-** garbage-collection function and options[m
[31m-*/[m
[31m-[m
[31m-#define LUA_GCSTOP		0[m
[31m-#define LUA_GCRESTART		1[m
[31m-#define LUA_GCCOLLECT		2[m
[31m-#define LUA_GCCOUNT		3[m
[31m-#define LUA_GCCOUNTB		4[m
[31m-#define LUA_GCSTEP		5[m
[31m-#define LUA_GCSETPAUSE		6[m
[31m-#define LUA_GCSETSTEPMUL	7[m
[31m-#define LUA_GCISRUNNING		9[m
[31m-[m
[31m-LUA_API int (lua_gc) (lua_State *L, int what, int data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** miscellaneous functions[m
[31m-*/[m
[31m-[m
[31m-LUA_API int   (lua_error) (lua_State *L);[m
[31m-[m
[31m-LUA_API int   (lua_next) (lua_State *L, int idx);[m
[31m-[m
[31m-LUA_API void  (lua_concat) (lua_State *L, int n);[m
[31m-[m
[31m-LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);[m
[31m-LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define lua_pop(L,n)		lua_settop(L, -(n)-1)[m
[31m-[m
[31m-#define lua_newtable(L)		lua_createtable(L, 0, 0)[m
[31m-[m
[31m-#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))[m
[31m-[m
[31m-#define lua_pushcfunction(L,f)	lua_pushcclosure(L, (f), 0)[m
[31m-[m
[31m-#define lua_strlen(L,i)		lua_objlen(L, (i))[m
[31m-[m
[31m-#define lua_isfunction(L,n)	(lua_type(L, (n)) == LUA_TFUNCTION)[m
[31m-#define lua_istable(L,n)	(lua_type(L, (n)) == LUA_TTABLE)[m
[31m-#define lua_islightuserdata(L,n)	(lua_type(L, (n)) == LUA_TLIGHTUSERDATA)[m
[31m-#define lua_isnil(L,n)		(lua_type(L, (n)) == LUA_TNIL)[m
[31m-#define lua_isboolean(L,n)	(lua_type(L, (n)) == LUA_TBOOLEAN)[m
[31m-#define lua_isthread(L,n)	(lua_type(L, (n)) == LUA_TTHREAD)[m
[31m-#define lua_isnone(L,n)		(lua_type(L, (n)) == LUA_TNONE)[m
[31m-#define lua_isnoneornil(L, n)	(lua_type(L, (n)) <= 0)[m
[31m-[m
[31m-#define lua_pushliteral(L, s)	\[m
[31m-	lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)[m
[31m-[m
[31m-#define lua_setglobal(L,s)	lua_setfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-#define lua_getglobal(L,s)	lua_getfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-[m
[31m-#define lua_tostring(L,i)	lua_tolstring(L, (i), NULL)[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** compatibility macros and functions[m
[31m-*/[m
[31m-[m
[31m-#define lua_open()	luaL_newstate()[m
[31m-[m
[31m-#define lua_getregistry(L)	lua_pushvalue(L, LUA_REGISTRYINDEX)[m
[31m-[m
[31m-#define lua_getgccount(L)	lua_gc(L, LUA_GCCOUNT, 0)[m
[31m-[m
[31m-#define lua_Chunkreader		lua_Reader[m
[31m-#define lua_Chunkwriter		lua_Writer[m
[31m-[m
[31m-[m
[31m-/* hack */[m
[31m-LUA_API void lua_setlevel	(lua_State *from, lua_State *to);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Debug API[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event codes[m
[31m-*/[m
[31m-#define LUA_HOOKCALL	0[m
[31m-#define LUA_HOOKRET	1[m
[31m-#define LUA_HOOKLINE	2[m
[31m-#define LUA_HOOKCOUNT	3[m
[31m-#define LUA_HOOKTAILRET 4[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event masks[m
[31m-*/[m
[31m-#define LUA_MASKCALL	(1 << LUA_HOOKCALL)[m
[31m-#define LUA_MASKRET	(1 << LUA_HOOKRET)[m
[31m-#define LUA_MASKLINE	(1 << LUA_HOOKLINE)[m
[31m-#define LUA_MASKCOUNT	(1 << LUA_HOOKCOUNT)[m
[31m-[m
[31m-typedef struct lua_Debug lua_Debug;  /* activation record */[m
[31m-[m
[31m-[m
[31m-/* Functions to be called by the debuger in specific events */[m
[31m-typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar);[m
[31m-LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);[m
[31m-LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n);[m
[31m-LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n);[m
[31m-LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);[m
[31m-LUA_API lua_Hook lua_gethook (lua_State *L);[m
[31m-LUA_API int lua_gethookmask (lua_State *L);[m
[31m-LUA_API int lua_gethookcount (lua_State *L);[m
[31m-[m
[31m-/* From Lua 5.2. */[m
[31m-LUA_API void *lua_upvalueid (lua_State *L, int idx, int n);[m
[31m-LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2);[m
[31m-LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt,[m
[31m-		       const char *chunkname, const char *mode);[m
[31m-[m
[31m-[m
[31m-struct lua_Debug {[m
[31m-  int event;[m
[31m-  const char *name;	/* (n) */[m
[31m-  const char *namewhat;	/* (n) `global', `local', `field', `method' */[m
[31m-  const char *what;	/* (S) `Lua', `C', `main', `tail' */[m
[31m-  const char *source;	/* (S) */[m
[31m-  int currentline;	/* (l) */[m
[31m-  int nups;		/* (u) number of upvalues */[m
[31m-  int linedefined;	/* (S) */[m
[31m-  int lastlinedefined;	/* (S) */[m
[31m-  char short_src[LUA_IDSIZE]; /* (S) */[m
[31m-  /* private part */[m
[31m-  int i_ci;  /* active function */[m
[31m-};[m
[31m-[m
[31m-/* }====================================================================== */[m
[31m-[m
[31m-[m
[31m-/******************************************************************************[m
[31m-* Copyright (C) 1994-2008 Lua.org, PUC-Rio.  All rights reserved.[m
[31m-*[m
[31m-* Permission is hereby granted, free of charge, to any person obtaining[m
[31m-* a copy of this software and associated documentation files (the[m
[31m-* "Software"), to deal in the Software without restriction, including[m
[31m-* without limitation the rights to use, copy, modify, merge, publish,[m
[31m-* distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-* permit persons to whom the Software is furnished to do so, subject to[m
[31m-* the following conditions:[m
[31m-*[m
[31m-* The above copyright notice and this permission notice shall be[m
[31m-* included in all copies or substantial portions of the Software.[m
[31m-*[m
[31m-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-******************************************************************************/[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lua.hpp b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lua.hpp[m
[1mdeleted file mode 100644[m
[1mindex 07e9002..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lua.hpp[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-// C++ wrapper for LuaJIT header files.[m
[31m-[m
[31m-extern "C" {[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-#include "luajit.h"[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luaconf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luaconf.h[m
[1mdeleted file mode 100644[m
[1mindex 4f7d4d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luaconf.h[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-/*[m
[31m-** Configuration header.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef luaconf_h[m
[31m-#define luaconf_h[m
[31m-[m
[31m-#ifndef WINVER[m
[31m-#define WINVER 0x0501[m
[31m-#endif[m
[31m-#include <limits.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-/* Default path for loading Lua and C modules with require(). */[m
[31m-#if defined(_WIN32)[m
[31m-/*[m
[31m-** In Windows, any exclamation mark ('!') in the path is replaced by the[m
[31m-** path of the directory of the executable file of the current process.[m
[31m-*/[m
[31m-#define LUA_LDIR	"!\\lua\\"[m
[31m-#define LUA_CDIR	"!\\"[m
[31m-#define LUA_PATH_DEFAULT \[m
[31m-  ".\\?.lua;" "!\\lualib\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;"[m
[31m-#define LUA_CPATH_DEFAULT \[m
[31m-  ".\\?.dll;" "!\\lualib\\?.so;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"[m
[31m-#else[m
[31m-/*[m
[31m-** Note to distribution maintainers: do NOT patch the following lines![m
[31m-** Please read ../doc/install.html#distro and pass PREFIX=/usr instead.[m
[31m-*/[m
[31m-#ifndef LUA_MULTILIB[m
[31m-#define LUA_MULTILIB	"lib"[m
[31m-#endif[m
[31m-#ifndef LUA_LMULTILIB[m
[31m-#define LUA_LMULTILIB	"lib"[m
[31m-#endif[m
[31m-#define LUA_LROOT	"/usr/local"[m
[31m-#define LUA_LUADIR	"/lua/5.1/"[m
[31m-#define LUA_LJDIR	"/luajit-2.1.0-beta2/"[m
[31m-[m
[31m-#ifdef LUA_ROOT[m
[31m-#define LUA_JROOT	LUA_ROOT[m
[31m-#define LUA_RLDIR	LUA_ROOT "/share" LUA_LUADIR[m
[31m-#define LUA_RCDIR	LUA_ROOT "/" LUA_MULTILIB LUA_LUADIR[m
[31m-#define LUA_RLPATH	";" LUA_RLDIR "?.lua;" LUA_RLDIR "?/init.lua"[m
[31m-#define LUA_RCPATH	";" LUA_RCDIR "?.so"[m
[31m-#else[m
[31m-#define LUA_JROOT	LUA_LROOT[m
[31m-#define LUA_RLPATH[m
[31m-#define LUA_RCPATH[m
[31m-#endif[m
[31m-[m
[31m-#define LUA_JPATH	";" LUA_JROOT "/share" LUA_LJDIR "?.lua"[m
[31m-#define LUA_LLDIR	LUA_LROOT "/share" LUA_LUADIR[m
[31m-#define LUA_LCDIR	LUA_LROOT "/" LUA_LMULTILIB LUA_LUADIR[m
[31m-#define LUA_LLPATH	";" LUA_LLDIR "?.lua;" LUA_LLDIR "?/init.lua"[m
[31m-#define LUA_LCPATH1	";" LUA_LCDIR "?.so"[m
[31m-#define LUA_LCPATH2	";" LUA_LCDIR "loadall.so"[m
[31m-[m
[31m-#define LUA_PATH_DEFAULT	"./?.lua" LUA_JPATH LUA_LLPATH LUA_RLPATH[m
[31m-#define LUA_CPATH_DEFAULT	"./?.so" LUA_LCPATH1 LUA_RCPATH LUA_LCPATH2[m
[31m-#endif[m
[31m-[m
[31m-/* Environment variable names for path overrides and initialization code. */[m
[31m-#define LUA_PATH	"LUA_PATH"[m
[31m-#define LUA_CPATH	"LUA_CPATH"[m
[31m-#define LUA_INIT	"LUA_INIT"[m
[31m-[m
[31m-/* Special file system characters. */[m
[31m-#if defined(_WIN32)[m
[31m-#define LUA_DIRSEP	"\\"[m
[31m-#else[m
[31m-#define LUA_DIRSEP	"/"[m
[31m-#endif[m
[31m-#define LUA_PATHSEP	";"[m
[31m-#define LUA_PATH_MARK	"?"[m
[31m-#define LUA_EXECDIR	"!"[m
[31m-#define LUA_IGMARK	"-"[m
[31m-#define LUA_PATH_CONFIG \[m
[31m-  LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" \[m
[31m-  LUA_EXECDIR "\n" LUA_IGMARK[m
[31m-[m
[31m-/* Quoting in error messages. */[m
[31m-#define LUA_QL(x)	"'" x "'"[m
[31m-#define LUA_QS		LUA_QL("%s")[m
[31m-[m
[31m-/* Various tunables. */[m
[31m-#define LUAI_MAXSTACK	65500	/* Max. # of stack slots for a thread (<64K). */[m
[31m-#define LUAI_MAXCSTACK	8000	/* Max. # of stack slots for a C func (<10K). */[m
[31m-#define LUAI_GCPAUSE	200	/* Pause GC until memory is at 200%. */[m
[31m-#define LUAI_GCMUL	200	/* Run GC at 200% of allocation speed. */[m
[31m-#define LUA_MAXCAPTURES	32	/* Max. pattern captures. */[m
[31m-[m
[31m-/* Compatibility with older library function names. */[m
[31m-#define LUA_COMPAT_MOD		/* OLD: math.mod, NEW: math.fmod */[m
[31m-#define LUA_COMPAT_GFIND	/* OLD: string.gfind, NEW: string.gmatch */[m
[31m-[m
[31m-/* Configuration for the frontend (the luajit executable). */[m
[31m-#if defined(luajit_c)[m
[31m-#define LUA_PROGNAME	"luajit"  /* Fallback frontend name. */[m
[31m-#define LUA_PROMPT	"> "	/* Interactive prompt. */[m
[31m-#define LUA_PROMPT2	">> "	/* Continuation prompt. */[m
[31m-#define LUA_MAXINPUT	512	/* Max. input line length. */[m
[31m-#endif[m
[31m-[m
[31m-/* Note: changing the following defines breaks the Lua 5.1 ABI. */[m
[31m-#define LUA_INTEGER	ptrdiff_t[m
[31m-#define LUA_IDSIZE	60	/* Size of lua_Debug.short_src. */[m
[31m-/*[m
[31m-** Size of lauxlib and io.* on-stack buffers. Weird workaround to avoid using[m
[31m-** unreasonable amounts of stack space, but still retain ABI compatibility.[m
[31m-** Blame Lua for depending on BUFSIZ in the ABI, blame **** for wrecking it.[m
[31m-*/[m
[31m-#define LUAL_BUFFERSIZE	(BUFSIZ > 16384 ? 8192 : BUFSIZ)[m
[31m-[m
[31m-/* The following defines are here only for compatibility with luaconf.h[m
[31m-** from the standard Lua distribution. They must not be changed for LuaJIT.[m
[31m-*/[m
[31m-#define LUA_NUMBER_DOUBLE[m
[31m-#define LUA_NUMBER		double[m
[31m-#define LUAI_UACNUMBER		double[m
[31m-#define LUA_NUMBER_SCAN		"%lf"[m
[31m-#define LUA_NUMBER_FMT		"%.14g"[m
[31m-#define lua_number2str(s, n)	sprintf((s), LUA_NUMBER_FMT, (n))[m
[31m-#define LUAI_MAXNUMBER2STR	32[m
[31m-#define LUA_INTFRMLEN		"l"[m
[31m-#define LUA_INTFRM_T		long[m
[31m-[m
[31m-/* Linkage of public API functions. */[m
[31m-#if defined(LUA_BUILD_AS_DLL)[m
[31m-#if defined(LUA_CORE) || defined(LUA_LIB)[m
[31m-#define LUA_API		__declspec(dllexport)[m
[31m-#else[m
[31m-#define LUA_API		__declspec(dllimport)[m
[31m-#endif[m
[31m-#else[m
[31m-#define LUA_API		extern[m
[31m-#endif[m
[31m-[m
[31m-#define LUALIB_API	LUA_API[m
[31m-[m
[31m-/* Support for internal assertions. */[m
[31m-#if defined(LUA_USE_ASSERT) || defined(LUA_USE_APICHECK)[m
[31m-#include <assert.h>[m
[31m-#endif[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-#define lua_assert(x)		assert(x)[m
[31m-#endif[m
[31m-#ifdef LUA_USE_APICHECK[m
[31m-#define luai_apicheck(L, o)	{ (void)L; assert(o); }[m
[31m-#else[m
[31m-#define luai_apicheck(L, o)	{ (void)L; }[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.c[m
[1mdeleted file mode 100644[m
[1mindex 00e12bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.c[m
[1m+++ /dev/null[m
[36m@@ -1,570 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT frontend. Runs commands, scripts, read-eval-print (REPL) etc.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define luajit_c[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-#if LJ_TARGET_POSIX[m
[31m-#include <unistd.h>[m
[31m-#define lua_stdin_is_tty()	isatty(0)[m
[31m-#elif LJ_TARGET_WINDOWS[m
[31m-#include <io.h>[m
[31m-#ifdef __BORLANDC__[m
[31m-#define lua_stdin_is_tty()	isatty(_fileno(stdin))[m
[31m-#else[m
[31m-#define lua_stdin_is_tty()	_isatty(_fileno(stdin))[m
[31m-#endif[m
[31m-#else[m
[31m-#define lua_stdin_is_tty()	1[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_TARGET_CONSOLE[m
[31m-#include <signal.h>[m
[31m-#endif[m
[31m-[m
[31m-static lua_State *globalL = NULL;[m
[31m-static const char *progname = LUA_PROGNAME;[m
[31m-[m
[31m-#if !LJ_TARGET_CONSOLE[m
[31m-static void lstop(lua_State *L, lua_Debug *ar)[m
[31m-{[m
[31m-  (void)ar;  /* unused arg. */[m
[31m-  lua_sethook(L, NULL, 0, 0);[m
[31m-  /* Avoid luaL_error -- a C hook doesn't add an extra frame. */[m
[31m-  luaL_where(L, 0);[m
[31m-  lua_pushfstring(L, "%sinterrupted!", lua_tostring(L, -1));[m
[31m-  lua_error(L);[m
[31m-}[m
[31m-[m
[31m-static void laction(int i)[m
[31m-{[m
[31m-  signal(i, SIG_DFL); /* if another SIGINT happens before lstop,[m
[31m-			 terminate process (default action) */[m
[31m-  lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void print_usage(void)[m
[31m-{[m
[31m-  fputs("usage: ", stderr);[m
[31m-  fputs(progname, stderr);[m
[31m-  fputs(" [options]... [script [args]...].\n"[m
[31m-  "Available options are:\n"[m
[31m-  "  -e chunk  Execute string " LUA_QL("chunk") ".\n"[m
[31m-  "  -l name   Require library " LUA_QL("name") ".\n"[m
[31m-  "  -b ...    Save or list bytecode.\n"[m
[31m-  "  -j cmd    Perform LuaJIT control command.\n"[m
[31m-  "  -O[opt]   Control LuaJIT optimizations.\n"[m
[31m-  "  -i        Enter interactive mode after executing " LUA_QL("script") ".\n"[m
[31m-  "  -v        Show version information.\n"[m
[31m-  "  -E        Ignore environment variables.\n"[m
[31m-  "  --        Stop handling options.\n"[m
[31m-  "  -         Execute stdin and stop handling options.\n", stderr);[m
[31m-  fflush(stderr);[m
[31m-}[m
[31m-[m
[31m-static void l_message(const char *pname, const char *msg)[m
[31m-{[m
[31m-  if (pname) { fputs(pname, stderr); fputc(':', stderr); fputc(' ', stderr); }[m
[31m-  fputs(msg, stderr); fputc('\n', stderr);[m
[31m-  fflush(stderr);[m
[31m-}[m
[31m-[m
[31m-static int report(lua_State *L, int status)[m
[31m-{[m
[31m-  if (status && !lua_isnil(L, -1)) {[m
[31m-    const char *msg = lua_tostring(L, -1);[m
[31m-    if (msg == NULL) msg = "(error object is not a string)";[m
[31m-    l_message(progname, msg);[m
[31m-    lua_pop(L, 1);[m
[31m-  }[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-static int traceback(lua_State *L)[m
[31m-{[m
[31m-  if (!lua_isstring(L, 1)) { /* Non-string error object? Try metamethod. */[m
[31m-    if (lua_isnoneornil(L, 1) ||[m
[31m-	!luaL_callmeta(L, 1, "__tostring") ||[m
[31m-	!lua_isstring(L, -1))[m
[31m-      return 1;  /* Return non-string error object. */[m
[31m-    lua_remove(L, 1);  /* Replace object by result of __tostring metamethod. */[m
[31m-  }[m
[31m-  luaL_traceback(L, L, lua_tostring(L, 1), 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int docall(lua_State *L, int narg, int clear)[m
[31m-{[m
[31m-  int status;[m
[31m-  int base = lua_gettop(L) - narg;  /* function index */[m
[31m-  lua_pushcfunction(L, traceback);  /* push traceback function */[m
[31m-  lua_insert(L, base);  /* put it under chunk and args */[m
[31m-#if !LJ_TARGET_CONSOLE[m
[31m-  signal(SIGINT, laction);[m
[31m-#endif[m
[31m-  status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base);[m
[31m-#if !LJ_TARGET_CONSOLE[m
[31m-  signal(SIGINT, SIG_DFL);[m
[31m-#endif[m
[31m-  lua_remove(L, base);  /* remove traceback function */[m
[31m-  /* force a complete garbage collection in case of errors */[m
[31m-  if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-static void print_version(void)[m
[31m-{[m
[31m-  fputs(LUAJIT_VERSION " -- " LUAJIT_COPYRIGHT ". " LUAJIT_URL "\n", stdout);[m
[31m-}[m
[31m-[m
[31m-static void print_jit_status(lua_State *L)[m
[31m-{[m
[31m-  int n;[m
[31m-  const char *s;[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, -1, "jit");  /* Get jit.* module table. */[m
[31m-  lua_remove(L, -2);[m
[31m-  lua_getfield(L, -1, "status");[m
[31m-  lua_remove(L, -2);[m
[31m-  n = lua_gettop(L);[m
[31m-  lua_call(L, 0, LUA_MULTRET);[m
[31m-  fputs(lua_toboolean(L, n) ? "JIT: ON" : "JIT: OFF", stdout);[m
[31m-  for (n++; (s = lua_tostring(L, n)); n++) {[m
[31m-    putc(' ', stdout);[m
[31m-    fputs(s, stdout);[m
[31m-  }[m
[31m-  putc('\n', stdout);[m
[31m-}[m
[31m-[m
[31m-static int getargs(lua_State *L, char **argv, int n)[m
[31m-{[m
[31m-  int narg;[m
[31m-  int i;[m
[31m-  int argc = 0;[m
[31m-  while (argv[argc]) argc++;  /* count total number of arguments */[m
[31m-  narg = argc - (n + 1);  /* number of arguments to the script */[m
[31m-  luaL_checkstack(L, narg + 3, "too many arguments to script");[m
[31m-  for (i = n+1; i < argc; i++)[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-  lua_createtable(L, narg, n + 1);[m
[31m-  for (i = 0; i < argc; i++) {[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-    lua_rawseti(L, -2, i - n);[m
[31m-  }[m
[31m-  return narg;[m
[31m-}[m
[31m-[m
[31m-static int dofile(lua_State *L, const char *name)[m
[31m-{[m
[31m-  int status = luaL_loadfile(L, name) || docall(L, 0, 1);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-static int dostring(lua_State *L, const char *s, const char *name)[m
[31m-{[m
[31m-  int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-static int dolibrary(lua_State *L, const char *name)[m
[31m-{[m
[31m-  lua_getglobal(L, "require");[m
[31m-  lua_pushstring(L, name);[m
[31m-  return report(L, docall(L, 1, 1));[m
[31m-}[m
[31m-[m
[31m-static void write_prompt(lua_State *L, int firstline)[m
[31m-{[m
[31m-  const char *p;[m
[31m-  lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2");[m
[31m-  p = lua_tostring(L, -1);[m
[31m-  if (p == NULL) p = firstline ? LUA_PROMPT : LUA_PROMPT2;[m
[31m-  fputs(p, stdout);[m
[31m-  fflush(stdout);[m
[31m-  lua_pop(L, 1);  /* remove global */[m
[31m-}[m
[31m-[m
[31m-static int incomplete(lua_State *L, int status)[m
[31m-{[m
[31m-  if (status == LUA_ERRSYNTAX) {[m
[31m-    size_t lmsg;[m
[31m-    const char *msg = lua_tolstring(L, -1, &lmsg);[m
[31m-    const char *tp = msg + lmsg - (sizeof(LUA_QL("<eof>")) - 1);[m
[31m-    if (strstr(msg, LUA_QL("<eof>")) == tp) {[m
[31m-      lua_pop(L, 1);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* else... */[m
[31m-}[m
[31m-[m
[31m-static int pushline(lua_State *L, int firstline)[m
[31m-{[m
[31m-  char buf[LUA_MAXINPUT];[m
[31m-  write_prompt(L, firstline);[m
[31m-  if (fgets(buf, LUA_MAXINPUT, stdin)) {[m
[31m-    size_t len = strlen(buf);[m
[31m-    if (len > 0 && buf[len-1] == '\n')[m
[31m-      buf[len-1] = '\0';[m
[31m-    if (firstline && buf[0] == '=')[m
[31m-      lua_pushfstring(L, "return %s", buf+1);[m
[31m-    else[m
[31m-      lua_pushstring(L, buf);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int loadline(lua_State *L)[m
[31m-{[m
[31m-  int status;[m
[31m-  lua_settop(L, 0);[m
[31m-  if (!pushline(L, 1))[m
[31m-    return -1;  /* no input */[m
[31m-  for (;;) {  /* repeat until gets a complete line */[m
[31m-    status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin");[m
[31m-    if (!incomplete(L, status)) break;  /* cannot try to add lines? */[m
[31m-    if (!pushline(L, 0))  /* no more input? */[m
[31m-      return -1;[m
[31m-    lua_pushliteral(L, "\n");  /* add a new line... */[m
[31m-    lua_insert(L, -2);  /* ...between the two lines */[m
[31m-    lua_concat(L, 3);  /* join them */[m
[31m-  }[m
[31m-  lua_remove(L, 1);  /* remove line */[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-static void dotty(lua_State *L)[m
[31m-{[m
[31m-  int status;[m
[31m-  const char *oldprogname = progname;[m
[31m-  progname = NULL;[m
[31m-  while ((status = loadline(L)) != -1) {[m
[31m-    if (status == 0) status = docall(L, 0, 0);[m
[31m-    report(L, status);[m
[31m-    if (status == 0 && lua_gettop(L) > 0) {  /* any result to print? */[m
[31m-      lua_getglobal(L, "print");[m
[31m-      lua_insert(L, 1);[m
[31m-      if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0)[m
[31m-	l_message(progname,[m
[31m-	  lua_pushfstring(L, "error calling " LUA_QL("print") " (%s)",[m
[31m-			      lua_tostring(L, -1)));[m
[31m-    }[m
[31m-  }[m
[31m-  lua_settop(L, 0);  /* clear stack */[m
[31m-  fputs("\n", stdout);[m
[31m-  fflush(stdout);[m
[31m-  progname = oldprogname;[m
[31m-}[m
[31m-[m
[31m-static int handle_script(lua_State *L, char **argv, int n)[m
[31m-{[m
[31m-  int status;[m
[31m-  const char *fname;[m
[31m-  int narg = getargs(L, argv, n);  /* collect arguments */[m
[31m-  lua_setglobal(L, "arg");[m
[31m-  fname = argv[n];[m
[31m-  if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0)[m
[31m-    fname = NULL;  /* stdin */[m
[31m-  status = luaL_loadfile(L, fname);[m
[31m-  lua_insert(L, -(narg+1));[m
[31m-  if (status == 0)[m
[31m-    status = docall(L, narg, 0);[m
[31m-  else[m
[31m-    lua_pop(L, narg);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-/* Load add-on module. */[m
[31m-static int loadjitmodule(lua_State *L)[m
[31m-{[m
[31m-  lua_getglobal(L, "require");[m
[31m-  lua_pushliteral(L, "jit.");[m
[31m-  lua_pushvalue(L, -3);[m
[31m-  lua_concat(L, 2);[m
[31m-  if (lua_pcall(L, 1, 1, 0)) {[m
[31m-    const char *msg = lua_tostring(L, -1);[m
[31m-    if (msg && !strncmp(msg, "module ", 7))[m
[31m-      goto nomodule;[m
[31m-    return report(L, 1);[m
[31m-  }[m
[31m-  lua_getfield(L, -1, "start");[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-  nomodule:[m
[31m-    l_message(progname,[m
[31m-	      "unknown luaJIT command or jit.* modules not installed");[m
[31m-    return 1;[m
[31m-  }[m
[31m-  lua_remove(L, -2);  /* Drop module table. */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Run command with options. */[m
[31m-static int runcmdopt(lua_State *L, const char *opt)[m
[31m-{[m
[31m-  int narg = 0;[m
[31m-  if (opt && *opt) {[m
[31m-    for (;;) {  /* Split arguments. */[m
[31m-      const char *p = strchr(opt, ',');[m
[31m-      narg++;[m
[31m-      if (!p) break;[m
[31m-      if (p == opt)[m
[31m-	lua_pushnil(L);[m
[31m-      else[m
[31m-	lua_pushlstring(L, opt, (size_t)(p - opt));[m
[31m-      opt = p + 1;[m
[31m-    }[m
[31m-    if (*opt)[m
[31m-      lua_pushstring(L, opt);[m
[31m-    else[m
[31m-      lua_pushnil(L);[m
[31m-  }[m
[31m-  return report(L, lua_pcall(L, narg, 0, 0));[m
[31m-}[m
[31m-[m
[31m-/* JIT engine control command: try jit library first or load add-on module. */[m
[31m-static int dojitcmd(lua_State *L, const char *cmd)[m
[31m-{[m
[31m-  const char *opt = strchr(cmd, '=');[m
[31m-  lua_pushlstring(L, cmd, opt ? (size_t)(opt - cmd) : strlen(cmd));[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, -1, "jit");  /* Get jit.* module table. */[m
[31m-  lua_remove(L, -2);[m
[31m-  lua_pushvalue(L, -2);[m
[31m-  lua_gettable(L, -2);  /* Lookup library function. */[m
[31m-  if (!lua_isfunction(L, -1)) {[m
[31m-    lua_pop(L, 2);  /* Drop non-function and jit.* table, keep module name. */[m
[31m-    if (loadjitmodule(L))[m
[31m-      return 1;[m
[31m-  } else {[m
[31m-    lua_remove(L, -2);  /* Drop jit.* table. */[m
[31m-  }[m
[31m-  lua_remove(L, -2);  /* Drop module name. */[m
[31m-  return runcmdopt(L, opt ? opt+1 : opt);[m
[31m-}[m
[31m-[m
[31m-/* Optimization flags. */[m
[31m-static int dojitopt(lua_State *L, const char *opt)[m
[31m-{[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, -1, "jit.opt");  /* Get jit.opt.* module table. */[m
[31m-  lua_remove(L, -2);[m
[31m-  lua_getfield(L, -1, "start");[m
[31m-  lua_remove(L, -2);[m
[31m-  return runcmdopt(L, opt);[m
[31m-}[m
[31m-[m
[31m-/* Save or list bytecode. */[m
[31m-static int dobytecode(lua_State *L, char **argv)[m
[31m-{[m
[31m-  int narg = 0;[m
[31m-  lua_pushliteral(L, "bcsave");[m
[31m-  if (loadjitmodule(L))[m
[31m-    return 1;[m
[31m-  if (argv[0][2]) {[m
[31m-    narg++;[m
[31m-    argv[0][1] = '-';[m
[31m-    lua_pushstring(L, argv[0]+1);[m
[31m-  }[m
[31m-  for (argv++; *argv != NULL; narg++, argv++)[m
[31m-    lua_pushstring(L, *argv);[m
[31m-  return report(L, lua_pcall(L, narg, 0, 0));[m
[31m-}[m
[31m-[m
[31m-/* check that argument has no extra characters at the end */[m
[31m-#define notail(x)	{if ((x)[2] != '\0') return -1;}[m
[31m-[m
[31m-#define FLAGS_INTERACTIVE	1[m
[31m-#define FLAGS_VERSION		2[m
[31m-#define FLAGS_EXEC		4[m
[31m-#define FLAGS_OPTION		8[m
[31m-#define FLAGS_NOENV		16[m
[31m-[m
[31m-static int collectargs(char **argv, int *flags)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 1; argv[i] != NULL; i++) {[m
[31m-    if (argv[i][0] != '-')  /* Not an option? */[m
[31m-      return i;[m
[31m-    switch (argv[i][1]) {  /* Check option. */[m
[31m-    case '-':[m
[31m-      notail(argv[i]);[m
[31m-      return (argv[i+1] != NULL ? i+1 : 0);[m
[31m-    case '\0':[m
[31m-      return i;[m
[31m-    case 'i':[m
[31m-      notail(argv[i]);[m
[31m-      *flags |= FLAGS_INTERACTIVE;[m
[31m-      /* fallthrough */[m
[31m-    case 'v':[m
[31m-      notail(argv[i]);[m
[31m-      *flags |= FLAGS_VERSION;[m
[31m-      break;[m
[31m-    case 'e':[m
[31m-      *flags |= FLAGS_EXEC;[m
[31m-    case 'j':  /* LuaJIT extension */[m
[31m-    case 'l':[m
[31m-      *flags |= FLAGS_OPTION;[m
[31m-      if (argv[i][2] == '\0') {[m
[31m-	i++;[m
[31m-	if (argv[i] == NULL) return -1;[m
[31m-      }[m
[31m-      break;[m
[31m-    case 'O': break;  /* LuaJIT extension */[m
[31m-    case 'b':  /* LuaJIT extension */[m
[31m-      if (*flags) return -1;[m
[31m-      *flags |= FLAGS_EXEC;[m
[31m-      return 0;[m
[31m-    case 'E':[m
[31m-      *flags |= FLAGS_NOENV;[m
[31m-      break;[m
[31m-    default: return -1;  /* invalid option */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int runargs(lua_State *L, char **argv, int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 1; i < n; i++) {[m
[31m-    if (argv[i] == NULL) continue;[m
[31m-    lua_assert(argv[i][0] == '-');[m
[31m-    switch (argv[i][1]) {  /* option */[m
[31m-    case 'e': {[m
[31m-      const char *chunk = argv[i] + 2;[m
[31m-      if (*chunk == '\0') chunk = argv[++i];[m
[31m-      lua_assert(chunk != NULL);[m
[31m-      if (dostring(L, chunk, "=(command line)") != 0)[m
[31m-	return 1;[m
[31m-      break;[m
[31m-      }[m
[31m-    case 'l': {[m
[31m-      const char *filename = argv[i] + 2;[m
[31m-      if (*filename == '\0') filename = argv[++i];[m
[31m-      lua_assert(filename != NULL);[m
[31m-      if (dolibrary(L, filename))[m
[31m-	return 1;  /* stop if file fails */[m
[31m-      break;[m
[31m-      }[m
[31m-    case 'j': {  /* LuaJIT extension */[m
[31m-      const char *cmd = argv[i] + 2;[m
[31m-      if (*cmd == '\0') cmd = argv[++i];[m
[31m-      lua_assert(cmd != NULL);[m
[31m-      if (dojitcmd(L, cmd))[m
[31m-	return 1;[m
[31m-      break;[m
[31m-      }[m
[31m-    case 'O':  /* LuaJIT extension */[m
[31m-      if (dojitopt(L, argv[i] + 2))[m
[31m-	return 1;[m
[31m-      break;[m
[31m-    case 'b':  /* LuaJIT extension */[m
[31m-      return dobytecode(L, argv+i);[m
[31m-    default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int handle_luainit(lua_State *L)[m
[31m-{[m
[31m-#if LJ_TARGET_CONSOLE[m
[31m-  const char *init = NULL;[m
[31m-#else[m
[31m-  const char *init = getenv(LUA_INIT);[m
[31m-#endif[m
[31m-  if (init == NULL)[m
[31m-    return 0;  /* status OK */[m
[31m-  else if (init[0] == '@')[m
[31m-    return dofile(L, init+1);[m
[31m-  else[m
[31m-    return dostring(L, init, "=" LUA_INIT);[m
[31m-}[m
[31m-[m
[31m-static struct Smain {[m
[31m-  char **argv;[m
[31m-  int argc;[m
[31m-  int status;[m
[31m-} smain;[m
[31m-[m
[31m-static int pmain(lua_State *L)[m
[31m-{[m
[31m-  struct Smain *s = &smain;[m
[31m-  char **argv = s->argv;[m
[31m-  int script;[m
[31m-  int flags = 0;[m
[31m-  globalL = L;[m
[31m-  if (argv[0] && argv[0][0]) progname = argv[0];[m
[31m-  LUAJIT_VERSION_SYM();  /* linker-enforced version check */[m
[31m-  script = collectargs(argv, &flags);[m
[31m-  if (script < 0) {  /* invalid args? */[m
[31m-    print_usage();[m
[31m-    s->status = 1;[m
[31m-    return 0;[m
[31m-  }[m
[31m-  if ((flags & FLAGS_NOENV)) {[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");[m
[31m-  }[m
[31m-  lua_gc(L, LUA_GCSTOP, 0);  /* stop collector during initialization */[m
[31m-  luaL_openlibs(L);  /* open libraries */[m
[31m-  lua_gc(L, LUA_GCRESTART, -1);[m
[31m-  if (!(flags & FLAGS_NOENV)) {[m
[31m-    s->status = handle_luainit(L);[m
[31m-    if (s->status != 0) return 0;[m
[31m-  }[m
[31m-  if ((flags & FLAGS_VERSION)) print_version();[m
[31m-  s->status = runargs(L, argv, (script > 0) ? script : s->argc);[m
[31m-  if (s->status != 0) return 0;[m
[31m-  if (script) {[m
[31m-    s->status = handle_script(L, argv, script);[m
[31m-    if (s->status != 0) return 0;[m
[31m-  }[m
[31m-  if ((flags & FLAGS_INTERACTIVE)) {[m
[31m-    print_jit_status(L);[m
[31m-    dotty(L);[m
[31m-  } else if (script == 0 && !(flags & (FLAGS_EXEC|FLAGS_VERSION))) {[m
[31m-    if (lua_stdin_is_tty()) {[m
[31m-      print_version();[m
[31m-      print_jit_status(L);[m
[31m-      dotty(L);[m
[31m-    } else {[m
[31m-      dofile(L, NULL);  /* executes stdin as a file */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-int main(int argc, char **argv)[m
[31m-{[m
[31m-  int status;[m
[31m-  lua_State *L = lua_open();  /* create state */[m
[31m-  if (L == NULL) {[m
[31m-    l_message(argv[0], "cannot create state: not enough memory");[m
[31m-    return EXIT_FAILURE;[m
[31m-  }[m
[31m-  smain.argc = argc;[m
[31m-  smain.argv = argv;[m
[31m-  status = lua_cpcall(L, pmain, NULL);[m
[31m-  report(L, status);[m
[31m-  lua_close(L);[m
[31m-  return (status || smain.status) ? EXIT_FAILURE : EXIT_SUCCESS;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.h[m
[1mdeleted file mode 100644[m
[1mindex 1d0a558..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/luajit.h[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/[m
[31m-**[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-**[m
[31m-** Permission is hereby granted, free of charge, to any person obtaining[m
[31m-** a copy of this software and associated documentation files (the[m
[31m-** "Software"), to deal in the Software without restriction, including[m
[31m-** without limitation the rights to use, copy, modify, merge, publish,[m
[31m-** distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-** permit persons to whom the Software is furnished to do so, subject to[m
[31m-** the following conditions:[m
[31m-**[m
[31m-** The above copyright notice and this permission notice shall be[m
[31m-** included in all copies or substantial portions of the Software.[m
[31m-**[m
[31m-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-**[m
[31m-** [ MIT license: http://www.opensource.org/licenses/mit-license.php ][m
[31m-*/[m
[31m-[m
[31m-#ifndef _LUAJIT_H[m
[31m-#define _LUAJIT_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#define LUAJIT_VERSION		"LuaJIT 2.1.0-beta2"[m
[31m-#define LUAJIT_VERSION_NUM	20100  /* Version 2.1.0 = 02.01.00. */[m
[31m-#define LUAJIT_VERSION_SYM	luaJIT_version_2_1_0_beta2[m
[31m-#define LUAJIT_COPYRIGHT	"Copyright (C) 2005-2016 Mike Pall"[m
[31m-#define LUAJIT_URL		"http://luajit.org/"[m
[31m-[m
[31m-/* Modes for luaJIT_setmode. */[m
[31m-#define LUAJIT_MODE_MASK	0x00ff[m
[31m-[m
[31m-enum {[m
[31m-  LUAJIT_MODE_ENGINE,		/* Set mode for whole JIT engine. */[m
[31m-  LUAJIT_MODE_DEBUG,		/* Set debug mode (idx = level). */[m
[31m-[m
[31m-  LUAJIT_MODE_FUNC,		/* Change mode for a function. */[m
[31m-  LUAJIT_MODE_ALLFUNC,		/* Recurse into subroutine protos. */[m
[31m-  LUAJIT_MODE_ALLSUBFUNC,	/* Change only the subroutines. */[m
[31m-[m
[31m-  LUAJIT_MODE_TRACE,		/* Flush a compiled trace. */[m
[31m-[m
[31m-  LUAJIT_MODE_WRAPCFUNC = 0x10,	/* Set wrapper mode for C function calls. */[m
[31m-[m
[31m-  LUAJIT_MODE_MAX[m
[31m-};[m
[31m-[m
[31m-/* Flags or'ed in to the mode. */[m
[31m-#define LUAJIT_MODE_OFF		0x0000	/* Turn feature off. */[m
[31m-#define LUAJIT_MODE_ON		0x0100	/* Turn feature on. */[m
[31m-#define LUAJIT_MODE_FLUSH	0x0200	/* Flush JIT-compiled code. */[m
[31m-[m
[31m-/* LuaJIT public C API. */[m
[31m-[m
[31m-/* Control the JIT engine. */[m
[31m-LUA_API int luaJIT_setmode(lua_State *L, int idx, int mode);[m
[31m-[m
[31m-/* Low-overhead profiling API. */[m
[31m-typedef void (*luaJIT_profile_callback)(void *data, lua_State *L,[m
[31m-					int samples, int vmstate);[m
[31m-LUA_API void luaJIT_profile_start(lua_State *L, const char *mode,[m
[31m-				  luaJIT_profile_callback cb, void *data);[m
[31m-LUA_API void luaJIT_profile_stop(lua_State *L);[m
[31m-LUA_API const char *luaJIT_profile_dumpstack(lua_State *L, const char *fmt,[m
[31m-					     int depth, size_t *len);[m
[31m-[m
[31m-/* Enforce (dynamic) linker error for version mismatches. Call from main. */[m
[31m-LUA_API void LUAJIT_VERSION_SYM(void);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lualib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lualib.h[m
[1mdeleted file mode 100644[m
[1mindex 3a54955..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/lualib.h[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/*[m
[31m-** Standard library header.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LUALIB_H[m
[31m-#define _LUALIB_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#define LUA_FILEHANDLE	"FILE*"[m
[31m-[m
[31m-#define LUA_COLIBNAME	"coroutine"[m
[31m-#define LUA_MATHLIBNAME	"math"[m
[31m-#define LUA_STRLIBNAME	"string"[m
[31m-#define LUA_TABLIBNAME	"table"[m
[31m-#define LUA_IOLIBNAME	"io"[m
[31m-#define LUA_OSLIBNAME	"os"[m
[31m-#define LUA_LOADLIBNAME	"package"[m
[31m-#define LUA_DBLIBNAME	"debug"[m
[31m-#define LUA_BITLIBNAME	"bit"[m
[31m-#define LUA_JITLIBNAME	"jit"[m
[31m-#define LUA_FFILIBNAME	"ffi"[m
[31m-[m
[31m-LUALIB_API int luaopen_base(lua_State *L);[m
[31m-LUALIB_API int luaopen_math(lua_State *L);[m
[31m-LUALIB_API int luaopen_string(lua_State *L);[m
[31m-LUALIB_API int luaopen_table(lua_State *L);[m
[31m-LUALIB_API int luaopen_io(lua_State *L);[m
[31m-LUALIB_API int luaopen_os(lua_State *L);[m
[31m-LUALIB_API int luaopen_package(lua_State *L);[m
[31m-LUALIB_API int luaopen_debug(lua_State *L);[m
[31m-LUALIB_API int luaopen_bit(lua_State *L);[m
[31m-LUALIB_API int luaopen_jit(lua_State *L);[m
[31m-LUALIB_API int luaopen_ffi(lua_State *L);[m
[31m-[m
[31m-LUALIB_API void luaL_openlibs(lua_State *L);[m
[31m-[m
[31m-#ifndef lua_assert[m
[31m-#define lua_assert(x)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/msvcbuild.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/msvcbuild.bat[m
[1mdeleted file mode 100644[m
[1mindex f977a24..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/msvcbuild.bat[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-@rem Script to build LuaJIT with MSVC.[m
[31m-@rem Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-@rem[m
[31m-@rem Either open a "Visual Studio .NET Command Prompt"[m
[31m-@rem (Note that the Express Edition does not contain an x64 compiler)[m
[31m-@rem -or-[m
[31m-@rem Open a "Windows SDK Command Shell" and set the compiler environment:[m
[31m-@rem     setenv /release /x86[m
[31m-@rem   -or-[m
[31m-@rem     setenv /release /x64[m
[31m-@rem[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@set LJCOMPILE=cl /nologo /c /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set LJLIB=lib /nologo /nodefaultlib[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set LJDLLNAME=lua51.dll[m
[31m-@set LJLIBNAME=lua51.lib[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@set DASMFLAGS=-D WIN -D JIT -D FFI -D P64[m
[31m-@set LJARCH=x64[m
[31m-@minilua[m
[31m-@if errorlevel 8 goto :X64[m
[31m-@set DASMFLAGS=-D WIN -D JIT -D FFI[m
[31m-@set LJARCH=x86[m
[31m-@set LJCOMPILE=%LJCOMPILE% /arch:SSE2[m
[31m-:X64[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m peobj -o lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@if "%1" neq "debug" goto :NODEBUG[m
[31m-@shift[m
[31m-@set LJCOMPILE=%LJCOMPILE% /Zi[m
[31m-@set LJLINK=%LJLINK% /debug[m
[31m-:NODEBUG[m
[31m-@if "%1"=="amalg" goto :AMALGDLL[m
[31m-@if "%1"=="static" goto :STATIC[m
[31m-%LJCOMPILE% /MD /DLUA_BUILD_AS_DLL lj_*.c lib_*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /DLL /out:%LJDLLNAME% lj_*.obj lib_*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :MTDLL[m
[31m-:STATIC[m
[31m-%LJCOMPILE% lj_*.c lib_*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:%LJLIBNAME% lj_*.obj lib_*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :MTDLL[m
[31m-:AMALGDLL[m
[31m-%LJCOMPILE% /MD /DLUA_BUILD_AS_DLL ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /DLL /out:%LJDLLNAME% ljamalg.obj lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-:MTDLL[m
[31m-if exist %LJDLLNAME%.manifest^[m
[31m-  %LJMT% -manifest %LJDLLNAME%.manifest -outputresource:%LJDLLNAME%;2[m
[31m-[m
[31m-%LJCOMPILE% luajit.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:luajit.exe luajit.obj %LJLIBNAME%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist luajit.exe.manifest^[m
[31m-  %LJMT% -manifest luajit.exe.manifest -outputresource:luajit.exe[m
[31m-[m
[31m-@del *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@del host\buildvm_arch.h[m
[31m-@del lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for Windows/%LJARCH% ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo You must open a "Visual Studio .NET Command Prompt" to run this script[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/ps4build.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/ps4build.bat[m
[1mdeleted file mode 100644[m
[1mindex e4a7def..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/ps4build.bat[m
[1m+++ /dev/null[m
[36m@@ -1,123 +0,0 @@[m
[31m-@rem Script to build LuaJIT with the PS4 SDK.[m
[31m-@rem Donated to the public domain.[m
[31m-@rem[m
[31m-@rem Open a "Visual Studio .NET Command Prompt" (64 bit host compiler)[m
[31m-@rem or "VS2015 x64 Native Tools Command Prompt".[m
[31m-@rem[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-@rem[m
[31m-@rem Recommended invocation:[m
[31m-@rem[m
[31m-@rem ps4build        release build, amalgamated, 64-bit GC[m
[31m-@rem ps4build debug    debug build, amalgamated, 64-bit GC[m
[31m-@rem[m
[31m-@rem Additional command-line options (not generally recommended):[m
[31m-@rem[m
[31m-@rem gc32 (before debug)    32-bit GC[m
[31m-@rem noamalg (after debug)  non-amalgamated build[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-@if not defined SCE_ORBIS_SDK_DIR goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@rem ---- Host compiler ----[m
[31m-@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-@set GC64=-DLUAJIT_ENABLE_GC64[m
[31m-@set DASC=vm_x64.dasc[m
[31m-[m
[31m-@if "%1" neq "gc32" goto :NOGC32[m
[31m-@shift[m
[31m-@set GC64=[m
[31m-@set DASC=vm_x86.dasc[m
[31m-:NOGC32[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@rem Check for 64 bit host compiler.[m
[31m-@minilua[m
[31m-@if not errorlevel 8 goto :FAIL[m
[31m-[m
[31m-@set DASMFLAGS=-D P64 -D NO_UNWIND[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h %DASC%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% %GC64% -DLUAJIT_TARGET=LUAJIT_ARCH_X64 -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLUAJIT_NO_UNWIND host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m elfasm -o lj_vm.s[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@rem ---- Cross compiler ----[m
[31m-@set LJCOMPILE="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-clang" -c -Wall -DLUAJIT_DISABLE_FFI %GC64%[m
[31m-@set LJLIB="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-ar" rcus[m
[31m-@set INCLUDE=""[m
[31m-[m
[31m-orbis-as -o lj_vm.o lj_vm.s[m
[31m-[m
[31m-@if "%1" neq "debug" goto :NODEBUG[m
[31m-@shift[m
[31m-@set LJCOMPILE=%LJCOMPILE% -g -O0[m
[31m-@set TARGETLIB=libluajitD_ps4.a[m
[31m-goto :BUILD[m
[31m-:NODEBUG[m
[31m-@set LJCOMPILE=%LJCOMPILE% -O2[m
[31m-@set TARGETLIB=libluajit_ps4.a[m
[31m-:BUILD[m
[31m-del %TARGETLIB%[m
[31m-@if "%1" neq "noamalg" goto :AMALG[m
[31m-for %%f in (lj_*.c lib_*.c) do ([m
[31m-  %LJCOMPILE% %%f[m
[31m-  @if errorlevel 1 goto :BAD[m
[31m-)[m
[31m-[m
[31m-%LJLIB% %TARGETLIB% lj_*.o lib_*.o[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :NOAMALG[m
[31m-:AMALG[m
[31m-%LJCOMPILE% ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% %TARGETLIB% ljamalg.o lj_vm.o[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-:NOAMALG[m
[31m-[m
[31m-@del *.o *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for PS4 ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo To run this script you must open a "Visual Studio .NET Command Prompt"[m
[31m-@echo (64 bit host compiler). The PS4 Orbis SDK must be installed, too.[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/psvitabuild.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/psvitabuild.bat[m
[1mdeleted file mode 100644[m
[1mindex 3991dc6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/psvitabuild.bat[m
[1m+++ /dev/null[m
[36m@@ -1,93 +0,0 @@[m
[31m-@rem Script to build LuaJIT with the PS Vita SDK.[m
[31m-@rem Donated to the public domain.[m
[31m-@rem[m
[31m-@rem Open a "Visual Studio .NET Command Prompt" (32 bit host compiler)[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-@if not defined SCE_PSP2_SDK_DIR goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@rem ---- Host compiler ----[m
[31m-@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@rem Check for 32 bit host compiler.[m
[31m-@minilua[m
[31m-@if errorlevel 8 goto :FAIL[m
[31m-[m
[31m-@set DASMFLAGS=-D FPU -D HFABI[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_arm.dasc[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_ARM -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLJ_TARGET_PSVITA=1 host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m elfasm -o lj_vm.s[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@rem ---- Cross compiler ----[m
[31m-@set LJCOMPILE="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2snc" -c -w -DLUAJIT_DISABLE_FFI -DLUAJIT_USE_SYSMALLOC[m
[31m-@set LJLIB="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2ld32" -r --output=[m
[31m-@set INCLUDE=""[m
[31m-[m
[31m-"%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2as" -o lj_vm.o lj_vm.s[m
[31m-[m
[31m-@if "%1" neq "debug" goto :NODEBUG[m
[31m-@shift[m
[31m-@set LJCOMPILE=%LJCOMPILE% -g -O0[m
[31m-@set TARGETLIB=libluajitD.a[m
[31m-goto :BUILD[m
[31m-:NODEBUG[m
[31m-@set LJCOMPILE=%LJCOMPILE% -O2[m
[31m-@set TARGETLIB=libluajit.a[m
[31m-:BUILD[m
[31m-del %TARGETLIB%[m
[31m-[m
[31m-%LJCOMPILE% ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB%%TARGETLIB% ljamalg.o lj_vm.o[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@del *.o *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for PS Vita ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo To run this script you must open a "Visual Studio .NET Command Prompt"[m
[31m-@echo (32 bit host compiler). The PS Vita SDK must be installed, too.[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_arm.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_arm.dasc[m
[1mdeleted file mode 100644[m
[1mindex 882884c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_arm.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,4593 +0,0 @@[m
[31m-|// Low-level VM code for ARM CPUs.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.arch arm[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|// Note: The ragged indentation of the instructions is intentional.[m
[31m-|//       The starting columns indicate data dependencies.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|[m
[31m-|// The following must be C callee-save.[m
[31m-|.define MASKR8,	r4	// 255*8 constant for fast bytecode decoding.[m
[31m-|.define KBASE,		r5	// Constants of current Lua function.[m
[31m-|.define PC,		r6	// Next PC.[m
[31m-|.define DISPATCH,	r7	// Opcode dispatch table.[m
[31m-|.define LREG,		r8	// Register holding lua_State (also in SAVE_L).[m
[31m-|[m
[31m-|// C callee-save in EABI, but often refetched. Temporary in iOS 3.0+.[m
[31m-|.define BASE,		r9	// Base of current Lua stack frame.[m
[31m-|[m
[31m-|// The following temporaries are not saved across C calls, except for RA/RC.[m
[31m-|.define RA,		r10	// Callee-save.[m
[31m-|.define RC,		r11	// Callee-save.[m
[31m-|.define RB,		r12[m
[31m-|.define OP,		r12	// Overlaps RB, must not be lr.[m
[31m-|.define INS,		lr[m
[31m-|[m
[31m-|// Calling conventions. Also used as temporaries.[m
[31m-|.define CARG1,		r0[m
[31m-|.define CARG2,		r1[m
[31m-|.define CARG3,		r2[m
[31m-|.define CARG4,		r3[m
[31m-|.define CARG12,	r0	// For 1st soft-fp double.[m
[31m-|.define CARG34,	r2	// For 2nd soft-fp double.[m
[31m-|[m
[31m-|.define CRET1,		r0[m
[31m-|.define CRET2,		r1[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|.define SAVE_R4,	[sp, #28][m
[31m-|.define CFRAME_SPACE,	#28[m
[31m-|.define SAVE_ERRF,	[sp, #24][m
[31m-|.define SAVE_NRES,	[sp, #20][m
[31m-|.define SAVE_CFRAME,	[sp, #16][m
[31m-|.define SAVE_L,	[sp, #12][m
[31m-|.define SAVE_PC,	[sp, #8][m
[31m-|.define SAVE_MULTRES,	[sp, #4][m
[31m-|.define ARG5,		[sp][m
[31m-|[m
[31m-|.define TMPDhi,	[sp, #4][m
[31m-|.define TMPDlo,	[sp][m
[31m-|.define TMPD,		[sp][m
[31m-|.define TMPDp,		sp[m
[31m-|[m
[31m-|.if FPU[m
[31m-|.macro saveregs[m
[31m-|  push {r5, r6, r7, r8, r9, r10, r11, lr}[m
[31m-|  vpush {d8-d15}[m
[31m-|  sub sp, sp, CFRAME_SPACE+4[m
[31m-|  str r4, SAVE_R4[m
[31m-|.endmacro[m
[31m-|.macro restoreregs_ret[m
[31m-|  ldr r4, SAVE_R4[m
[31m-|  add sp, sp, CFRAME_SPACE+4[m
[31m-|  vpop {d8-d15}[m
[31m-|  pop {r5, r6, r7, r8, r9, r10, r11, pc}[m
[31m-|.endmacro[m
[31m-|.else[m
[31m-|.macro saveregs[m
[31m-|  push {r4, r5, r6, r7, r8, r9, r10, r11, lr}[m
[31m-|  sub sp, sp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro restoreregs_ret[m
[31m-|  add sp, sp, CFRAME_SPACE[m
[31m-|  pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}[m
[31m-|.endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State,	LREG[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS8,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Trap for not-yet-implemented parts.[m
[31m-|.macro NYI; ud; .endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Access to frame relative to BASE.[m
[31m-|.define FRAME_FUNC,	#-8[m
[31m-|.define FRAME_PC,	#-4[m
[31m-|[m
[31m-|.macro decode_RA8, dst, ins; and dst, MASKR8, ins, lsr #5; .endmacro[m
[31m-|.macro decode_RB8, dst, ins; and dst, MASKR8, ins, lsr #21; .endmacro[m
[31m-|.macro decode_RC8, dst, ins; and dst, MASKR8, ins, lsr #13; .endmacro[m
[31m-|.macro decode_RD, dst, ins; lsr dst, ins, #16; .endmacro[m
[31m-|.macro decode_OP, dst, ins; and dst, ins, #255; .endmacro[m
[31m-|[m
[31m-|// Instruction fetch.[m
[31m-|.macro ins_NEXT1[m
[31m-|  ldrb OP, [PC][m
[31m-|.endmacro[m
[31m-|.macro ins_NEXT2[m
[31m-|   ldr INS, [PC], #4[m
[31m-|.endmacro[m
[31m-|// Instruction decode+dispatch.[m
[31m-|.macro ins_NEXT3[m
[31m-|  ldr OP, [DISPATCH, OP, lsl #2][m
[31m-|   decode_RA8 RA, INS[m
[31m-|   decode_RD RC, INS[m
[31m-|  bx OP[m
[31m-|.endmacro[m
[31m-|.macro ins_NEXT[m
[31m-|  ins_NEXT1[m
[31m-|  ins_NEXT2[m
[31m-|  ins_NEXT3[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|  .define ins_next1, ins_NEXT1[m
[31m-|  .define ins_next2, ins_NEXT2[m
[31m-|  .define ins_next3, ins_NEXT3[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  .macro ins_next[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next1[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next2[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next3[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Avoid register name substitution for field name.[m
[31m-#define field_pc	pc[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-|  ldr PC, LFUNC:CARG3->field_pc[m
[31m-|  ldrb OP, [PC]  // STALL: load PC. early PC.[m
[31m-|   ldr INS, [PC], #4[m
[31m-|  ldr OP, [DISPATCH, OP, lsl #2]  // STALL: load OP. early OP.[m
[31m-|   decode_RA8 RA, INS[m
[31m-|   add RA, RA, BASE[m
[31m-|  bx OP[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, PC = caller PC[m
[31m-|  str PC, [BASE, FRAME_PC][m
[31m-|  ins_callt  // STALL: locked PC.[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to test operand types.[m
[31m-|.macro checktp, reg, tp; cmn reg, #-tp; .endmacro[m
[31m-|.macro checktpeq, reg, tp; cmneq reg, #-tp; .endmacro[m
[31m-|.macro checktpne, reg, tp; cmnne reg, #-tp; .endmacro[m
[31m-|.macro checkstr, reg, target; checktp reg, LJ_TSTR; bne target; .endmacro[m
[31m-|.macro checktab, reg, target; checktp reg, LJ_TTAB; bne target; .endmacro[m
[31m-|.macro checkfunc, reg, target; checktp reg, LJ_TFUNC; bne target; .endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|.macro hotcheck, delta[m
[31m-|  lsr CARG1, PC, #1[m
[31m-|  and CARG1, CARG1, #126[m
[31m-|  sub CARG1, CARG1, #-GG_DISP2HOT[m
[31m-|  ldrh CARG2, [DISPATCH, CARG1][m
[31m-|  subs CARG2, CARG2, #delta[m
[31m-|  strh CARG2, [DISPATCH, CARG1][m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotloop[m
[31m-|  hotcheck HOTCOUNT_LOOP[m
[31m-|  blo ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall[m
[31m-|  hotcheck HOTCOUNT_CALL[m
[31m-|  blo ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state.[m
[31m-|.macro mv_vmstate, reg, st; mvn reg, #LJ_VMST_..st; .endmacro[m
[31m-|.macro st_vmstate, reg; str reg, [DISPATCH, #DISPATCH_GL(vmstate)]; .endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites mark and tmp.[m
[31m-|.macro barrierback, tab, mark, tmp[m
[31m-|  ldr tmp, [DISPATCH, #DISPATCH_GL(gc.grayagain)][m
[31m-|   bic mark, mark, #LJ_GC_BLACK		// black2gray(tab)[m
[31m-|  str tab, [DISPATCH, #DISPATCH_GL(gc.grayagain)][m
[31m-|   strb mark, tab->marked[m
[31m-|  str tmp, tab->gclist[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro .IOS, a, b[m
[31m-|.if IOS[m
[31m-|  a, b[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-#if !LJ_DUALNUM[m
[31m-#error "Only dual-number mode supported for ARM target"[m
[31m-#endif[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  // See vm_return. Also: RB = previous base.[m
[31m-  |  tst PC, #FRAME_P[m
[31m-  |  beq ->cont_dispatch[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  ldr PC, [RB, FRAME_PC]		// Fetch PC of previous frame.[m
[31m-  |   mvn CARG2, #~LJ_TTRUE[m
[31m-  |  mov BASE, RB[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |   str CARG2, [RA, FRAME_PC]		// Prepend true to results.[m
[31m-  |  sub RA, RA, #8[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  adds RC, RC, #8			// RC = (nresults+1)*8.[m
[31m-  |  mov CRET1, #LUA_YIELD[m
[31m-  |  beq ->vm_unwind_c_eh[m
[31m-  |  str RC, SAVE_MULTRES[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |  beq ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultptr, RC/MULTRES = (nresults+1)*8, PC = return[m
[31m-  |  // CARG1 = PC & FRAME_TYPE[m
[31m-  |  bic RB, PC, #FRAME_TYPEP[m
[31m-  |   cmp CARG1, #FRAME_C[m
[31m-  |  sub RB, BASE, RB			// RB = previous base.[m
[31m-  |   bne ->vm_returnp[m
[31m-  |[m
[31m-  |  str RB, L->base[m
[31m-  |   ldr KBASE, SAVE_NRES[m
[31m-  |    mv_vmstate CARG4, C[m
[31m-  |   sub BASE, BASE, #8[m
[31m-  |  subs CARG3, RC, #8[m
[31m-  |   lsl KBASE, KBASE, #3		// KBASE = (nresults_wanted+1)*8[m
[31m-  |    st_vmstate CARG4[m
[31m-  |  beq >2[m
[31m-  |1:[m
[31m-  |  subs CARG3, CARG3, #8[m
[31m-  |   ldrd CARG12, [RA], #8[m
[31m-  |   strd CARG12, [BASE], #8[m
[31m-  |  bne <1[m
[31m-  |2:[m
[31m-  |  cmp KBASE, RC			// More/less results wanted?[m
[31m-  |  bne >6[m
[31m-  |3:[m
[31m-  |  str BASE, L->top			// Store new top.[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  ldr RC, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |   mov CRET1, #0			// Ok return status for vm_pcall.[m
[31m-  |  str RC, L->cframe[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs_ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  blt >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  ldr CARG3, L->maxstack[m
[31m-  |   mvn CARG2, #~LJ_TNIL[m
[31m-  |  cmp BASE, CARG3[m
[31m-  |  bhs >8[m
[31m-  |   str CARG2, [BASE, #4][m
[31m-  |  add RC, RC, #8[m
[31m-  |  add BASE, BASE, #8[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  sub CARG1, RC, KBASE[m
[31m-  |  cmp KBASE, #0			// LUA_MULTRET+1 case?[m
[31m-  |  subne BASE, BASE, CARG1		// Either keep top or shrink it.[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  str BASE, L->top			// Save current top held in BASE (yes).[m
[31m-  |  lsr CARG2, KBASE, #3[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->top			// Need the (realloced) L->top in BASE.[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  mov sp, CARG1[m
[31m-  |  mov CRET1, CARG2[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |   mv_vmstate CARG4, C[m
[31m-  |  ldr GL:CARG3, L->glref[m
[31m-  |   str CARG4, GL:CARG3->vmstate[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |  bic CARG1, CARG1, #~CFRAME_RAWMASK	// Use two steps: bic sp is deprecated.[m
[31m-  |  mov sp, CARG1[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |   mov MASKR8, #255[m
[31m-  |    mov RC, #16			// 2 results: false + error message.[m
[31m-  |   lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   ldr DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |    mvn CARG1, #~LJ_TFALSE[m
[31m-  |  sub RA, BASE, #8			// Results start at BASE-8.[m
[31m-  |  ldr PC, [BASE, FRAME_PC]		// Fetch PC of previous frame.[m
[31m-  |   add DISPATCH, DISPATCH, #GG_G2DISP[m
[31m-  |   mv_vmstate CARG2, INTERP[m
[31m-  |    str CARG1, [BASE, #-4]		// Prepend false to error message.[m
[31m-  |   st_vmstate CARG2[m
[31m-  |  b ->vm_returnc[m
[31m-  |[m
[31m-  |->vm_unwind_ext:			// Complete external unwind.[m
[31m-#if !LJ_NO_UNWIND[m
[31m-  |  push {r0, r1, r2, lr}[m
[31m-  |  bl extern _Unwind_Complete[m
[31m-  |  ldr r0, [sp][m
[31m-  |  bl extern _Unwind_DeleteException[m
[31m-  |  pop {r0, r1, r2, lr}[m
[31m-  |  mov r0, r1[m
[31m-  |  bx r2[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  // CARG1 = L[m
[31m-  |  mov CARG2, #LUA_MINSTACK[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vm_growstack_l:			// Grow stack for Lua function.[m
[31m-  |  // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC[m
[31m-  |  add RC, BASE, RC[m
[31m-  |   sub RA, RA, BASE[m
[31m-  |    mov CARG1, L[m
[31m-  |  str BASE, L->base[m
[31m-  |   add PC, PC, #4			// Must point after first instruction.[m
[31m-  |  str RC, L->top[m
[31m-  |   lsr CARG2, RA, #3[m
[31m-  |2:[m
[31m-  |  // L->base = new base, L->top = top[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   ldr RC, L->top[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   sub NARGS8:RC, RC, BASE[m
[31m-  |  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  mov L, CARG1[m
[31m-  |    ldr DISPATCH, L:CARG1->glref	// Setup pointer to dispatch table.[m
[31m-  |  mov BASE, CARG2[m
[31m-  |    add DISPATCH, DISPATCH, #GG_G2DISP[m
[31m-  |   str L, SAVE_L[m
[31m-  |  mov PC, #FRAME_CP[m
[31m-  |   str CARG3, SAVE_NRES[m
[31m-  |    add CARG2, sp, #CFRAME_RESUME[m
[31m-  |  ldrb CARG1, L->status[m
[31m-  |   str CARG3, SAVE_ERRF[m
[31m-  |   str L, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   str CARG3, SAVE_CFRAME[m
[31m-  |  cmp CARG1, #0[m
[31m-  |    str CARG2, L->cframe[m
[31m-  |  beq >3[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |  mov RA, BASE[m
[31m-  |   ldr BASE, L->base[m
[31m-  |   ldr CARG1, L->top[m
[31m-  |    mov MASKR8, #255[m
[31m-  |     strb CARG3, L->status[m
[31m-  |   sub RC, CARG1, BASE[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |    lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |     mv_vmstate CARG2, INTERP[m
[31m-  |   add RC, RC, #8[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |     st_vmstate CARG2[m
[31m-  |   str RC, SAVE_MULTRES[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, #FRAME_CP[m
[31m-  |  str CARG4, SAVE_ERRF[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, #FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  ldr RC, L:CARG1->cframe[m
[31m-  |   str CARG3, SAVE_NRES[m
[31m-  |    mov L, CARG1[m
[31m-  |   str CARG1, SAVE_L[m
[31m-  |    ldr DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |     mov BASE, CARG2[m
[31m-  |   str CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  str RC, SAVE_CFRAME[m
[31m-  |    add DISPATCH, DISPATCH, #GG_G2DISP[m
[31m-  |  str sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |[m
[31m-  |3:  // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).[m
[31m-  |  str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |  ldr RB, L->base			// RB = old base (for vmeta_call).[m
[31m-  |   ldr CARG1, L->top[m
[31m-  |    mov MASKR8, #255[m
[31m-  |  add PC, PC, BASE[m
[31m-  |    lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |  sub PC, PC, RB			// PC = frame delta + frame type[m
[31m-  |    mv_vmstate CARG2, INTERP[m
[31m-  |   sub NARGS8:RC, CARG1, BASE[m
[31m-  |    st_vmstate CARG2[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  // RB = old base, BASE = new base, RC = nargs*8, PC = caller PC[m
[31m-  |  ldrd CARG34, [BASE, FRAME_FUNC][m
[31m-  |  checkfunc CARG4, ->vmeta_call[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, CARG3 = func, RC = nargs*8, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  mov L, CARG1[m
[31m-  |   ldr RA, L:CARG1->stack[m
[31m-  |  str CARG1, SAVE_L[m
[31m-  |    ldr DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |   ldr RB, L->top[m
[31m-  |  str CARG1, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |  ldr RC, L->cframe[m
[31m-  |    add DISPATCH, DISPATCH, #GG_G2DISP[m
[31m-  |   sub RA, RA, RB			// Compute -savestack(L, L->top).[m
[31m-  |  mov RB, #0[m
[31m-  |   str RA, SAVE_NRES			// Neg. delta means cframe w/o frame.[m
[31m-  |  str RB, SAVE_ERRF			// No error function.[m
[31m-  |  str RC, SAVE_CFRAME[m
[31m-  |  str sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |    str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |  blx CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |  movs BASE, CRET1[m
[31m-  |   mov PC, #FRAME_CP[m
[31m-  |  bne <3				// Else continue with the call.[m
[31m-  |  b ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultptr, RC = (nresults+1)*8[m
[31m-  |  ldr LFUNC:CARG3, [RB, FRAME_FUNC][m
[31m-  |    ldr CARG1, [BASE, #-16]		// Get continuation.[m
[31m-  |   mov CARG4, BASE[m
[31m-  |   mov BASE, RB			// Restore caller BASE.[m
[31m-  |.if FFI[m
[31m-  |    cmp CARG1, #1[m
[31m-  |.endif[m
[31m-  |   ldr PC, [CARG4, #-12]		// Restore PC from [cont|PC].[m
[31m-  |  ldr CARG3, LFUNC:CARG3->field_pc[m
[31m-  |    mvn INS, #~LJ_TNIL[m
[31m-  |    add CARG2, RA, RC[m
[31m-  |    str INS, [CARG2, #-4]		// Ensure one valid arg.[m
[31m-  |.if FFI[m
[31m-  |    bls >1[m
[31m-  |.endif[m
[31m-  |  ldr KBASE, [CARG3, #PC2PROTO(k)][m
[31m-  |  // BASE = base, RA = resultptr, CARG4 = meta base[m
[31m-  |    bx CARG1[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  beq ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: tailcall from C function.[m
[31m-  |  sub CARG4, CARG4, #16[m
[31m-  |  sub RC, CARG4, BASE[m
[31m-  |  b ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// RA = resultptr, CARG4 = meta base[m
[31m-  |  ldr INS, [PC, #-4][m
[31m-  |   sub CARG2, CARG4, #16[m
[31m-  |   ldrd CARG34, [RA][m
[31m-  |     str BASE, L->base[m
[31m-  |  decode_RB8 RC, INS[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |  add CARG1, BASE, RC[m
[31m-  |  subs CARG1, CARG2, CARG1[m
[31m-  |   strdne CARG34, [CARG2][m
[31m-  |   movne CARG3, CARG1[m
[31m-  |  bne ->BC_CAT_Z[m
[31m-  |   strd CARG34, [BASE, RA][m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets1:[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  sub CARG2, DISPATCH, #-DISPATCH_GL(tmptv)[m
[31m-  |   mvn CARG4, #~LJ_TTAB[m
[31m-  |  str TAB:RB, [CARG2][m
[31m-  |   str CARG4, [CARG2, #4][m
[31m-  |2:[m
[31m-  |   mvn CARG4, #~LJ_TSTR[m
[31m-  |  str STR:RC, TMPDlo[m
[31m-  |   str CARG4, TMPDhi[m
[31m-  |  mov CARG3, TMPDp[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetb:			// RC = index[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   str RC, TMPDlo[m
[31m-  |   mvn CARG4, #~LJ_TISNUM[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   str CARG4, TMPDhi[m
[31m-  |  mov CARG3, TMPDp[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   add CARG3, BASE, RC[m
[31m-  |1:[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  beq >3[m
[31m-  |  ldrd CARG34, [CRET1][m
[31m-  |   ins_next1[m
[31m-  |   ins_next2[m
[31m-  |  strd CARG34, [BASE, RA][m
[31m-  |   ins_next3[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |   rsb CARG1, BASE, #FRAME_CONT[m
[31m-  |  ldr BASE, L->top[m
[31m-  |    mov NARGS8:RC, #16		// 2 args for func(t, k).[m
[31m-  |    str PC, [BASE, #-12]		// [cont|PC][m
[31m-  |   add PC, CARG1, BASE[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  .IOS mov RC, BASE[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  .IOS mov BASE, RC[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  ldrdne CARG12, [CRET1][m
[31m-  |  mvneq CARG2, #~LJ_TNIL[m
[31m-  |  b ->BC_TGETR_Z[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets1:[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  sub CARG2, DISPATCH, #-DISPATCH_GL(tmptv)[m
[31m-  |   mvn CARG4, #~LJ_TTAB[m
[31m-  |  str TAB:RB, [CARG2][m
[31m-  |   str CARG4, [CARG2, #4][m
[31m-  |2:[m
[31m-  |   mvn CARG4, #~LJ_TSTR[m
[31m-  |  str STR:RC, TMPDlo[m
[31m-  |   str CARG4, TMPDhi[m
[31m-  |  mov CARG3, TMPDp[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetb:			// RC = index[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   str RC, TMPDlo[m
[31m-  |   mvn CARG4, #~LJ_TISNUM[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   str CARG4, TMPDhi[m
[31m-  |  mov CARG3, TMPDp[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   add CARG3, BASE, RC[m
[31m-  |1:[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |   ldrd CARG34, [BASE, RA][m
[31m-  |  beq >3[m
[31m-  |   ins_next1[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  strd CARG34, [CRET1][m
[31m-  |   ins_next2[m
[31m-  |   ins_next3[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |   rsb CARG1, BASE, #FRAME_CONT[m
[31m-  |  ldr BASE, L->top[m
[31m-  |    mov NARGS8:RC, #24		// 3 args for func(t, k, v).[m
[31m-  |   strd CARG34, [BASE, #16]		// Copy value to third argument.[m
[31m-  |    str PC, [BASE, #-12]		// [cont|PC][m
[31m-  |   add PC, CARG1, BASE[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |  str BASE, L->base[m
[31m-  |  .IOS mov RC, BASE[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // Returns TValue *.[m
[31m-  |  .IOS mov BASE, RC[m
[31m-  |  b ->BC_TSETR_Z[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  mov CARG1, L[m
[31m-  |   sub PC, PC, #4[m
[31m-  |  mov CARG2, RA[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG3, RC[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  decode_OP CARG4, INS[m
[31m-  |  bl extern lj_meta_comp  // (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |3:[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #1[m
[31m-  |  bhi ->vmeta_binop[m
[31m-  |4:[m
[31m-  |  ldrh RB, [PC, #2][m
[31m-  |   add PC, PC, #4[m
[31m-  |  add RB, PC, RB, lsl #2[m
[31m-  |  subhs PC, RB, #0x20000[m
[31m-  |->cont_nop:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_ra:				// RA = resultptr[m
[31m-  |  ldr INS, [PC, #-4][m
[31m-  |   ldrd CARG12, [RA][m
[31m-  |  decode_RA8 CARG3, INS[m
[31m-  |   strd CARG12, [BASE, CARG3][m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |->cont_condt:			// RA = resultptr[m
[31m-  |  ldr CARG2, [RA, #4][m
[31m-  |   mvn CARG1, #~LJ_TTRUE[m
[31m-  |  cmp CARG1, CARG2			// Branch if result is true.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->cont_condf:			// RA = resultptr[m
[31m-  |  ldr CARG2, [RA, #4][m
[31m-  |  checktp CARG2, LJ_TFALSE		// Branch if result is false.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV.[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal  // (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |   mov CARG2, INS[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal_cd		// (lua_State *L, BCIns op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |   lsr CARG2, RA, #3[m
[31m-  |   mov CARG3, RC[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG3, BASE, RB[m
[31m-  |   add CARG4, KBASE, RC[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG4, BASE, RB[m
[31m-  |   add CARG3, KBASE, RC[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  ldr INS, [PC, #-8][m
[31m-  |   sub PC, PC, #4[m
[31m-  |  add CARG3, BASE, RC[m
[31m-  |  add CARG4, BASE, RC[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG3, BASE, RB[m
[31m-  |   add CARG4, BASE, RC[m
[31m-  |1:[m
[31m-  |  decode_OP OP, INS[m
[31m-  |   add CARG2, BASE, RA[m
[31m-  |    str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |    str PC, SAVE_PC[m
[31m-  |  str OP, ARG5[m
[31m-  |  bl extern lj_meta_arith  // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  beq ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2[m
[31m-  |  sub CARG2, CRET1, BASE[m
[31m-  |   str PC, [CRET1, #-12]		// [cont|PC][m
[31m-  |  add PC, CARG2, #FRAME_CONT[m
[31m-  |   mov BASE, CRET1[m
[31m-  |    mov NARGS8:RC, #16		// 2 args for func(o1, o2).[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  add CARG2, BASE, RC[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |  // Returns NULL (retry) or TValue * (metamethod base).[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-#if LJ_52[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  bne ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |  ldr TAB:CARG1, [BASE, RC][m
[31m-  |  b ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  b ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // RB = old base, BASE = new base, RC = nargs*8[m
[31m-  |  mov CARG1, L[m
[31m-  |   str RB, L->base			// This is the callers base![m
[31m-  |  sub CARG2, BASE, #8[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  add CARG3, BASE, NARGS8:RC[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |   add NARGS8:RC, NARGS8:RC, #8	// Got one more argument now.[m
[31m-  |  ins_call[m
[31m-  |[m
[31m-  |->vmeta_callt:			// Resolve __call for BC_CALLT.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs*8[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  sub CARG2, RA, #8[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  add CARG3, RA, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  ldr LFUNC:CARG3, [RA, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |    add NARGS8:RC, NARGS8:RC, #8	// Got one more argument now.[m
[31m-  |  b ->BC_CALLT2_Z[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, RA[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |.if JIT[m
[31m-  |   ldrb OP, [PC, #-4][m
[31m-  |.endif[m
[31m-  |  ldr INS, [PC, #-4][m
[31m-  |.if JIT[m
[31m-  |   cmp OP, #BC_JFORI[m
[31m-  |.endif[m
[31m-  |  decode_RA8 RA, INS[m
[31m-  |  decode_RD RC, INS[m
[31m-  |.if JIT[m
[31m-  |   beq =>BC_JFORI[m
[31m-  |.endif[m
[31m-  |  b =>BC_FORI[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   ldrd CARG34, [BASE, #8][m
[31m-  |    cmp NARGS8:RC, #16[m
[31m-  |    blo ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name[m
[31m-  |  .ffunc_1 name[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name[m
[31m-  |  .ffunc_2 name[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  cmnlo CARG4, #-LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_d, name[m
[31m-  |  .ffunc name[m
[31m-  |  ldr CARG2, [BASE, #4][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  vldr d0, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_dd, name[m
[31m-  |  .ffunc name[m
[31m-  |  ldr CARG2, [BASE, #4][m
[31m-  |  ldr CARG4, [BASE, #12][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |  vldr d0, [BASE][m
[31m-  |  vldr d1, [BASE, #8][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  cmnlo CARG4, #-LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses CARG1 and CARG2.[m
[31m-  |.macro ffgccheck[m
[31m-  |  ldr CARG1, [DISPATCH, #DISPATCH_GL(gc.total)][m
[31m-  |  ldr CARG2, [DISPATCH, #DISPATCH_GL(gc.threshold)][m
[31m-  |  cmp CARG1, CARG2[m
[31m-  |  blge ->fff_gcstep[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  checktp CARG2, LJ_TTRUE[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  strd CARG12, [BASE, #-8][m
[31m-  |  mov RB, BASE[m
[31m-  |  subs RA, NARGS8:RC, #8[m
[31m-  |   add RC, NARGS8:RC, #8		// Compute (nresults+1)*8.[m
[31m-  |  beq ->fff_res			// Done if exactly 1 argument.[m
[31m-  |1:[m
[31m-  |   ldrd CARG12, [RB, #8][m
[31m-  |  subs RA, RA, #8[m
[31m-  |   strd CARG12, [RB], #8[m
[31m-  |  bne <1[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc type[m
[31m-  |  ldr CARG2, [BASE, #4][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  mvnlo CARG2, #~LJ_TISNUM[m
[31m-  |  rsb CARG4, CARG2, #(int)(offsetof(GCfuncC, upvalue)>>3)-1[m
[31m-  |  lsl CARG4, CARG4, #3[m
[31m-  |  ldrd CARG12, [CFUNC:CARG3, CARG4][m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  checktp CARG2, LJ_TTAB[m
[31m-  |  cmnne CARG2, #-LJ_TUDATA[m
[31m-  |  bne >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  ldr TAB:RB, TAB:CARG1->metatable[m
[31m-  |2:[m
[31m-  |   mvn CARG2, #~LJ_TNIL[m
[31m-  |   ldr STR:RC, [DISPATCH, #DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])][m
[31m-  |  cmp TAB:RB, #0[m
[31m-  |  beq ->fff_restv[m
[31m-  |  ldr CARG3, TAB:RB->hmask[m
[31m-  |   ldr CARG4, STR:RC->hash[m
[31m-  |    ldr NODE:INS, TAB:RB->node[m
[31m-  |  and CARG3, CARG3, CARG4		// idx = str->hash & tab->hmask[m
[31m-  |  add CARG3, CARG3, CARG3, lsl #1[m
[31m-  |    add NODE:INS, NODE:INS, CARG3, lsl #3	// node = tab->node + idx*3*8[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  ldrd CARG34, NODE:INS->key  // STALL: early NODE:INS.[m
[31m-  |   ldrd CARG12, NODE:INS->val[m
[31m-  |    ldr NODE:INS, NODE:INS->next[m
[31m-  |  checktp CARG4, LJ_TSTR[m
[31m-  |  cmpeq CARG3, STR:RC[m
[31m-  |  beq >5[m
[31m-  |  cmp NODE:INS, #0[m
[31m-  |  bne <3[m
[31m-  |4:[m
[31m-  |  mov CARG1, RB			// Use metatable as default result.[m
[31m-  |  mvn CARG2, #~LJ_TTAB[m
[31m-  |  b ->fff_restv[m
[31m-  |5:[m
[31m-  |  checktp CARG2, LJ_TNIL[m
[31m-  |  bne ->fff_restv[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  mvnhs CARG2, CARG2[m
[31m-  |  movlo CARG2, #~LJ_TISNUM[m
[31m-  |  add CARG4, DISPATCH, CARG2, lsl #2[m
[31m-  |  ldr TAB:RB, [CARG4, #DISPATCH_GL(gcroot[GCROOT_BASEMT])][m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  checktp CARG2, LJ_TTAB[m
[31m-  |   ldreq TAB:RB, TAB:CARG1->metatable[m
[31m-  |  checktpeq CARG4, LJ_TTAB[m
[31m-  |    ldrbeq CARG4, TAB:CARG1->marked[m
[31m-  |   cmpeq TAB:RB, #0[m
[31m-  |  bne ->fff_fallback[m
[31m-  |    tst CARG4, #LJ_GC_BLACK		// isblack(table)[m
[31m-  |     str TAB:CARG3, TAB:CARG1->metatable[m
[31m-  |    beq ->fff_restv[m
[31m-  |  barrierback TAB:CARG1, CARG4, CARG3[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc rawget[m
[31m-  |  ldrd CARG34, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |   mov CARG2, CARG3[m
[31m-  |  checktab CARG4, ->fff_fallback[m
[31m-  |   mov CARG1, L[m
[31m-  |   add CARG3, BASE, #8[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern lj_tab_get  // (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // Returns cTValue *.[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  ldrd CARG12, [CRET1][m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bls ->fff_restv[m
[31m-  |  b ->fff_fallback[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  checktp CARG2, LJ_TSTR[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  beq ->fff_restv[m
[31m-  |  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  ldr CARG4, [DISPATCH, #DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])][m
[31m-  |   str BASE, L->base[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  cmpls CARG4, #0[m
[31m-  |   str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  ffgccheck[m
[31m-  |  mov CARG1, L[m
[31m-  |  mov CARG2, BASE[m
[31m-  |  bl extern lj_strfmt_number		// (lua_State *L, cTValue *o)[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  mvn CARG2, #~LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 next[m
[31m-  |   mvn CARG4, #~LJ_TNIL[m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-  |   strd CARG34, [BASE, NARGS8:RC]	// Set missing 2nd arg to nil.[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  mov CARG2, CARG1[m
[31m-  |    str BASE, L->base		// Add frame since C call can throw.[m
[31m-  |  mov CARG1, L[m
[31m-  |    str BASE, L->top			// Dummy frame length is ok.[m
[31m-  |  add CARG3, BASE, #8[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Returns 0 at end of traversal.[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  mvneq CRET2, #~LJ_TNIL[m
[31m-  |  beq ->fff_restv			// End of traversal: return nil.[m
[31m-  |  ldrd CARG12, [BASE, #8]		// Copy key and value to results.[m
[31m-  |   ldrd CARG34, [BASE, #16][m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |  strd CARG12, [BASE, #-8][m
[31m-  |   strd CARG34, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  ldr TAB:RB, TAB:CARG1->metatable[m
[31m-#endif[m
[31m-  |   ldrd CFUNC:CARG34, CFUNC:CARG3->upvalue[0][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-#if LJ_52[m
[31m-  |  cmp TAB:RB, #0[m
[31m-  |  bne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mvn CARG2, #~LJ_TNIL[m
[31m-  |    mov RC, #(3+1)*8[m
[31m-  |   strd CFUNC:CARG34, [BASE, #-8][m
[31m-  |  str CARG2, [BASE, #12][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_2 ipairs_aux[m
[31m-  |  checktp CARG2, LJ_TTAB[m
[31m-  |  checktpeq CARG4, LJ_TISNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  ldr RB, TAB:CARG1->asize[m
[31m-  |   ldr RC, TAB:CARG1->array[m
[31m-  |  add CARG3, CARG3, #1[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |  cmp CARG3, RB[m
[31m-  |   add RC, RC, CARG3, lsl #3[m
[31m-  |  strd CARG34, [BASE, #-8][m
[31m-  |   ldrdlo CARG12, [RC][m
[31m-  |   mov RC, #(0+1)*8[m
[31m-  |  bhs >2				// Not in array part?[m
[31m-  |1:[m
[31m-  |   checktp CARG2, LJ_TNIL[m
[31m-  |   movne RC, #(2+1)*8[m
[31m-  |   strdne CARG12, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  ldr RB, TAB:CARG1->hmask[m
[31m-  |   mov CARG2, CARG3[m
[31m-  |  cmp RB, #0[m
[31m-  |  beq ->fff_res[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  beq ->fff_res[m
[31m-  |  ldrd CARG12, [CRET1][m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  ldr TAB:RB, TAB:CARG1->metatable[m
[31m-#endif[m
[31m-  |   ldrd CFUNC:CARG34, CFUNC:CARG3->upvalue[0][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-#if LJ_52[m
[31m-  |  cmp TAB:RB, #0[m
[31m-  |  bne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CARG1, #0[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |    mov RC, #(3+1)*8[m
[31m-  |   strd CFUNC:CARG34, [BASE, #-8][m
[31m-  |  strd CARG12, [BASE, #8][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc pcall[m
[31m-  |  ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  tst RA, #HOOK_ACTIVE		// Remember active hook before pcall.[m
[31m-  |   mov RB, BASE[m
[31m-  |   add BASE, BASE, #8[m
[31m-  |  moveq PC, #8+FRAME_PCALL[m
[31m-  |  movne PC, #8+FRAME_PCALLH[m
[31m-  |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc_2 xpcall[m
[31m-  |  ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |  checkfunc CARG4, ->fff_fallback	// Traceback must be a function.[m
[31m-  |   mov RB, BASE[m
[31m-  |  strd CARG12, [BASE, #8]		// Swap function and traceback.[m
[31m-  |   strd CARG34, [BASE][m
[31m-  |  tst RA, #HOOK_ACTIVE		// Remember active hook before pcall.[m
[31m-  |   add BASE, BASE, #16[m
[31m-  |  moveq PC, #16+FRAME_PCALL[m
[31m-  |  movne PC, #16+FRAME_PCALLH[m
[31m-  |   sub NARGS8:RC, NARGS8:RC, #16[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  checktp CARG2, LJ_TTHREAD[m
[31m-  |  bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  ldr L:CARG1, CFUNC:CARG3->upvalue[0].gcr[m
[31m-  |.endif[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |     str BASE, L->base[m
[31m-  |  ldr CARG2, L:CARG1->top[m
[31m-  |   ldrb RA, L:CARG1->status[m
[31m-  |    ldr RB, L:CARG1->base[m
[31m-  |  add CARG3, CARG2, NARGS8:RC[m
[31m-  |  add CARG4, CARG2, RA[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  cmp CARG4, RB[m
[31m-  |  beq ->fff_fallback[m
[31m-  |   ldr CARG4, L:CARG1->maxstack[m
[31m-  |    ldr RB, L:CARG1->cframe[m
[31m-  |   cmp RA, #LUA_YIELD[m
[31m-  |   cmpls CARG3, CARG4[m
[31m-  |    cmpls RB, #0[m
[31m-  |    bhi ->fff_fallback[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  sub CARG3, CARG3, #8		// Keep resumed thread in stack for GC.[m
[31m-  |  add BASE, BASE, #8[m
[31m-  |  sub NARGS8:RC, NARGS8:RC, #8[m
[31m-  |.endif[m
[31m-  |  str CARG3, L:CARG1->top[m
[31m-  |  str BASE, L->top[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |   ldrd CARG34, [BASE, RB][m
[31m-  |  cmp RB, NARGS8:RC[m
[31m-  |   strdne CARG34, [CARG2, RB][m
[31m-  |  add RB, RB, #8[m
[31m-  |  bne <2[m
[31m-  |[m
[31m-  |  mov CARG3, #0[m
[31m-  |   mov L:RA, L:CARG1[m
[31m-  |  mov CARG4, #0[m
[31m-  |  bl ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |  // Returns thread status.[m
[31m-  |4:[m
[31m-  |  ldr CARG3, L:RA->base[m
[31m-  |    mv_vmstate CARG2, INTERP[m
[31m-  |  ldr CARG4, L:RA->top[m
[31m-  |   cmp CRET1, #LUA_YIELD[m
[31m-  |  ldr BASE, L->base[m
[31m-  |    str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |    st_vmstate CARG2[m
[31m-  |   bhi >8[m
[31m-  |  subs RC, CARG4, CARG3[m
[31m-  |   ldr CARG1, L->maxstack[m
[31m-  |   add CARG2, BASE, RC[m
[31m-  |  beq >6				// No results?[m
[31m-  |  cmp CARG2, CARG1[m
[31m-  |   mov RB, #0[m
[31m-  |  bhi >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  sub CARG4, RC, #8[m
[31m-  |   str CARG3, L:RA->top		// Clear coroutine stack.[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |   ldrd CARG12, [CARG3, RB][m
[31m-  |  cmp RB, CARG4[m
[31m-  |   strd CARG12, [BASE, RB][m
[31m-  |  add RB, RB, #8[m
[31m-  |  bne <5[m
[31m-  |6:[m
[31m-  |.if resume[m
[31m-  |  mvn CARG3, #~LJ_TTRUE[m
[31m-  |   add RC, RC, #16[m
[31m-  |7:[m
[31m-  |  str CARG3, [BASE, #-4]		// Prepend true/false to results.[m
[31m-  |   sub RA, BASE, #8[m
[31m-  |.else[m
[31m-  |   mov RA, BASE[m
[31m-  |   add RC, RC, #8[m
[31m-  |.endif[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   str RC, SAVE_MULTRES[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  ldrd CARG12, [CARG4, #-8]![m
[31m-  |   mvn CARG3, #~LJ_TFALSE[m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |  str CARG4, L:RA->top		// Remove error from coroutine stack.[m
[31m-  |  strd CARG12, [BASE]		// Copy error message.[m
[31m-  |  b <7[m
[31m-  |.else[m
[31m-  |  mov CARG1, L[m
[31m-  |  mov CARG2, L:RA[m
[31m-  |  bl extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |  // Never returns.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  mov CARG1, L[m
[31m-  |  lsr CARG2, RC, #3[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov CRET1, #0[m
[31m-  |  b <4[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  ldr CARG1, L->cframe[m
[31m-  |   add CARG2, BASE, NARGS8:RC[m
[31m-  |   str BASE, L->base[m
[31m-  |  tst CARG1, #CFRAME_RESUME[m
[31m-  |   str CARG2, L->top[m
[31m-  |    mov CRET1, #LUA_YIELD[m
[31m-  |   mov CARG3, #0[m
[31m-  |  beq ->fff_fallback[m
[31m-  |   str CARG3, L->cframe[m
[31m-  |    strb CRET1, L->status[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro math_round, func[m
[31m-  |  .ffunc_1 math_ .. func[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  beq ->fff_restv[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  // Round FP value and normalize result.[m
[31m-  |  lsl CARG3, CARG2, #1[m
[31m-  |  adds RB, CARG3, #0x00200000[m
[31m-  |  bpl >2				// |x| < 1?[m
[31m-  |  mvn CARG4, #0x3e0[m
[31m-  |    subs RB, CARG4, RB, asr #21[m
[31m-  |  lsl CARG4, CARG2, #11[m
[31m-  |   lsl CARG3, CARG1, #11[m
[31m-  |  orr CARG4, CARG4, #0x80000000[m
[31m-  |   rsb INS, RB, #32[m
[31m-  |  orr CARG4, CARG4, CARG1, lsr #21[m
[31m-  |    bls >3				// |x| >= 2^31?[m
[31m-  |   orr CARG3, CARG3, CARG4, lsl INS[m
[31m-  |  lsr CARG1, CARG4, RB[m
[31m-  |.if "func" == "floor"[m
[31m-  |   tst CARG3, CARG2, asr #31[m
[31m-  |   addne CARG1, CARG1, #1[m
[31m-  |.else[m
[31m-  |   bics CARG3, CARG3, CARG2, asr #31[m
[31m-  |   addsne CARG1, CARG1, #1[m
[31m-  |   ldrdvs CARG12, >9[m
[31m-  |   bvs ->fff_restv[m
[31m-  |.endif[m
[31m-  |    cmp CARG2, #0[m
[31m-  |    rsblt CARG1, CARG1, #0[m
[31m-  |1:[m
[31m-  |   mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |2:  // |x| < 1[m
[31m-  |  bcs ->fff_restv			// |x| is not finite.[m
[31m-  |  orr CARG3, CARG3, CARG1		// ztest = abs(hi) | lo[m
[31m-  |.if "func" == "floor"[m
[31m-  |  tst CARG3, CARG2, asr #31		// return (ztest & sign) == 0 ? 0 : -1[m
[31m-  |  moveq CARG1, #0[m
[31m-  |  mvnne CARG1, #0[m
[31m-  |.else[m
[31m-  |  bics CARG3, CARG3, CARG2, asr #31	// return (ztest & ~sign) == 0 ? 0 : 1[m
[31m-  |  moveq CARG1, #0[m
[31m-  |  movne CARG1, #1[m
[31m-  |.endif[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |3:  // |x| >= 2^31. Check for x == -(2^31).[m
[31m-  |  cmpeq CARG4, #0x80000000[m
[31m-  |.if "func" == "floor"[m
[31m-  |  cmpeq CARG3, #0[m
[31m-  |.endif[m
[31m-  |  bne >4[m
[31m-  |  cmp CARG2, #0[m
[31m-  |  movmi CARG1, #0x80000000[m
[31m-  |  bmi <1[m
[31m-  |4:[m
[31m-  |  bl ->vm_..func.._sf[m
[31m-  |  b ->fff_restv[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |[m
[31m-  |.align 8[m
[31m-  |9:[m
[31m-  |  .long 0x00000000, 0x41e00000	// 2^31.[m
[31m-  |[m
[31m-  |.ffunc_1 math_abs[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  bicne CARG2, CARG2, #0x80000000[m
[31m-  |  bne ->fff_restv[m
[31m-  |  cmp CARG1, #0[m
[31m-  |  rsbslt CARG1, CARG1, #0[m
[31m-  |  ldrdvs CARG12, <9[m
[31m-  |  // Fallthrough.[m
[31m-  |[m
[31m-  |->fff_restv:[m
[31m-  |  // CARG12 = TValue result.[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |  strd CARG12, [BASE, #-8][m
[31m-  |->fff_res1:[m
[31m-  |  // PC = return.[m
[31m-  |  mov RC, #(1+1)*8[m
[31m-  |->fff_res:[m
[31m-  |  // RC = (nresults+1)*8, PC = return.[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |  ldreq INS, [PC, #-4][m
[31m-  |   str RC, SAVE_MULTRES[m
[31m-  |  sub RA, BASE, #8[m
[31m-  |  bne ->vm_return[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |5:[m
[31m-  |  cmp RB, RC				// More results expected?[m
[31m-  |  bhi >6[m
[31m-  |  decode_RA8 CARG1, INS[m
[31m-  |   ins_next1[m
[31m-  |   ins_next2[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |  sub BASE, RA, CARG1[m
[31m-  |   ins_next3[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  add CARG2, RA, RC[m
[31m-  |  mvn CARG1, #~LJ_TNIL[m
[31m-  |   add RC, RC, #8[m
[31m-  |  str CARG1, [CARG2, #-4][m
[31m-  |  b <5[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |.if HFABI[m
[31m-  |  .ffunc_d math_ .. func[m
[31m-  |.else[m
[31m-  |  .ffunc_n math_ .. func[m
[31m-  |.endif[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern func[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |.if HFABI[m
[31m-  |  b ->fff_resd[m
[31m-  |.else[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |.if HFABI[m
[31m-  |  .ffunc_dd math_ .. func[m
[31m-  |.else[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |.endif[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern func[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |.if HFABI[m
[31m-  |  b ->fff_resd[m
[31m-  |.else[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.if FPU[m
[31m-  |  .ffunc_d math_sqrt[m
[31m-  |  vsqrt.f64 d0, d0[m
[31m-  |->fff_resd:[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |  vstr d0, [BASE, #-8][m
[31m-  |  b ->fff_res1[m
[31m-  |.else[m
[31m-  |  math_extern sqrt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |.if HFABI[m
[31m-  |  ldr CARG2, [BASE, #4][m
[31m-  |   cmp NARGS8:RC, #8			// Need exactly 1 argument.[m
[31m-  |  vldr d0, [BASE][m
[31m-  |   bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   cmp NARGS8:RC, #8			// Need exactly 1 argument.[m
[31m-  |   bne ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern log[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |.if HFABI[m
[31m-  |  b ->fff_resd[m
[31m-  |.else[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.if HFABI[m
[31m-  |  .ffunc math_ldexp[m
[31m-  |  ldr CARG4, [BASE, #4][m
[31m-  |  ldrd CARG12, [BASE, #8][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  vldr d0, [BASE][m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern ldexp			// (double x, int exp)[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  b ->fff_resd[m
[31m-  |.else[m
[31m-  |.ffunc_2 math_ldexp[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern ldexp			// (double x, int exp)[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.if HFABI[m
[31m-  |.ffunc_d math_frexp[m
[31m-  |  mov CARG1, sp[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern frexp[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |   ldr CARG3, [sp][m
[31m-  |   mvn CARG4, #~LJ_TISNUM[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |  vstr d0, [BASE, #-8][m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |   strd CARG34, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |.else[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |  mov CARG3, sp[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern frexp[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |   ldr CARG3, [sp][m
[31m-  |   mvn CARG4, #~LJ_TISNUM[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |  strd CARG12, [BASE, #-8][m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |   strd CARG34, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.if HFABI[m
[31m-  |.ffunc_d math_modf[m
[31m-  |  sub CARG1, BASE, #8[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern modf[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |   mov RC, #(2+1)*8[m
[31m-  |  vstr d0, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |.else[m
[31m-  |.ffunc_n math_modf[m
[31m-  |  sub CARG3, BASE, #8[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern modf[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |   mov RC, #(2+1)*8[m
[31m-  |  strd CARG12, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.macro math_minmax, name, cond, fcond[m
[31m-  |.if FPU[m
[31m-  |  .ffunc_1 name[m
[31m-  |   add RB, BASE, RC[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |   add RA, BASE, #8[m
[31m-  |  bne >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  ldrd CARG34, [RA][m
[31m-  |   cmp RA, RB[m
[31m-  |   bhs ->fff_restv[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bne >3[m
[31m-  |  cmp CARG1, CARG3[m
[31m-  |   add RA, RA, #8[m
[31m-  |  mov..cond CARG1, CARG3[m
[31m-  |  b <1[m
[31m-  |3:  // Convert intermediate result to number and continue below.[m
[31m-  |  vmov s4, CARG1[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  vldr d1, [RA][m
[31m-  |  vcvt.f64.s32 d0, s4[m
[31m-  |  b >6[m
[31m-  |[m
[31m-  |4:[m
[31m-  |  vldr d0, [BASE][m
[31m-  |  bhi ->fff_fallback[m
[31m-  |5:  // Handle numbers.[m
[31m-  |  ldrd CARG34, [RA][m
[31m-  |  vldr d1, [RA][m
[31m-  |   cmp RA, RB[m
[31m-  |   bhs ->fff_resd[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bhs >7[m
[31m-  |6:[m
[31m-  |  vcmp.f64 d0, d1[m
[31m-  |  vmrs[m
[31m-  |   add RA, RA, #8[m
[31m-  |  vmov..fcond.f64 d0, d1[m
[31m-  |  b <5[m
[31m-  |7:  // Convert integer to number and continue above.[m
[31m-  |  vmov s4, CARG3[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  vcvt.f64.s32 d1, s4[m
[31m-  |  b <6[m
[31m-  |[m
[31m-  |.else[m
[31m-  |[m
[31m-  |  .ffunc_1 name[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |   mov RA, #8[m
[31m-  |  bne >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  ldrd CARG34, [BASE, RA][m
[31m-  |   cmp RA, RC[m
[31m-  |   bhs ->fff_restv[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bne >3[m
[31m-  |  cmp CARG1, CARG3[m
[31m-  |   add RA, RA, #8[m
[31m-  |  mov..cond CARG1, CARG3[m
[31m-  |  b <1[m
[31m-  |3:  // Convert intermediate result to number and continue below.[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  bl extern __aeabi_i2d[m
[31m-  |  ldrd CARG34, [BASE, RA][m
[31m-  |  b >6[m
[31m-  |[m
[31m-  |4:[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |5:  // Handle numbers.[m
[31m-  |  ldrd CARG34, [BASE, RA][m
[31m-  |   cmp RA, RC[m
[31m-  |   bhs ->fff_restv[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bhs >7[m
[31m-  |6:[m
[31m-  |  bl extern __aeabi_cdcmple[m
[31m-  |   add RA, RA, #8[m
[31m-  |  mov..fcond CARG1, CARG3[m
[31m-  |  mov..fcond CARG2, CARG4[m
[31m-  |  b <5[m
[31m-  |7:  // Convert integer to number and continue above.[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  strd CARG12, TMPD[m
[31m-  |  mov CARG1, CARG3[m
[31m-  |  bl extern __aeabi_i2d[m
[31m-  |  ldrd CARG34, TMPD[m
[31m-  |  b <6[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, gt, hi[m
[31m-  |  math_minmax math_max, lt, lo[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   checktpeq CARG2, LJ_TSTR		// Need exactly 1 argument.[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  ldr CARG3, STR:CARG1->len[m
[31m-  |   ldrb CARG1, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |   mvn CARG2, #~LJ_TISNUM[m
[31m-  |  cmp CARG3, #0[m
[31m-  |  moveq RC, #(0+1)*8[m
[31m-  |  movne RC, #(1+1)*8[m
[31m-  |   strd CARG12, [BASE, #-8][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |   cmp NARGS8:RC, #8			// Need exactly 1 argument.[m
[31m-  |   checktpeq CARG2, LJ_TISNUM[m
[31m-  |   bicseq CARG4, CARG1, #255[m
[31m-  |  mov CARG3, #1[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  str CARG1, TMPD[m
[31m-  |  mov CARG2, TMPDp			// Points to stack. Little-endian.[m
[31m-  |->fff_newstr:[m
[31m-  |  // CARG2 = str, CARG3 = len.[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   mvn CARG2, #~LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   ldrd CARG34, [BASE, #16][m
[31m-  |    cmp NARGS8:RC, #16[m
[31m-  |     mvn RB, #0[m
[31m-  |    beq >1[m
[31m-  |    blo ->fff_fallback[m
[31m-  |   checktp CARG4, LJ_TISNUM[m
[31m-  |    mov RB, CARG3[m
[31m-  |   bne ->fff_fallback[m
[31m-  |1:[m
[31m-  |  ldrd CARG34, [BASE, #8][m
[31m-  |  checktp CARG2, LJ_TSTR[m
[31m-  |   ldreq CARG2, STR:CARG1->len[m
[31m-  |  checktpeq CARG4, LJ_TISNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  // CARG1 = str, CARG2 = str->len, CARG3 = start, RB = end[m
[31m-  |  add CARG4, CARG2, #1[m
[31m-  |  cmp CARG3, #0			// if (start < 0) start += len+1[m
[31m-  |  addlt CARG3, CARG3, CARG4[m
[31m-  |  cmp CARG3, #1			// if (start < 1) start = 1[m
[31m-  |  movlt CARG3, #1[m
[31m-  |  cmp RB, #0				// if (end < 0) end += len+1[m
[31m-  |  addlt RB, RB, CARG4[m
[31m-  |  bic RB, RB, RB, asr #31		// if (end < 0) end = 0[m
[31m-  |  cmp RB, CARG2			// if (end > len) end = len[m
[31m-  |   add CARG1, STR:CARG1, #sizeof(GCstr)-1[m
[31m-  |  movgt RB, CARG2[m
[31m-  |   add CARG2, CARG1, CARG3[m
[31m-  |  subs CARG3, RB, CARG3		// len = end - start[m
[31m-  |   add CARG3, CARG3, #1		// len += 1[m
[31m-  |  bge ->fff_newstr[m
[31m-  |->fff_emptystr:[m
[31m-  |  sub STR:CARG1, DISPATCH, #-DISPATCH_GL(strempty)[m
[31m-  |  mvn CARG2, #~LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |  ldr CARG3, [BASE, #4][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  ldr STR:CARG2, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  sub SBUF:CARG1, DISPATCH, #-DISPATCH_GL(tmpbuf)[m
[31m-  |  checkstr CARG3, ->fff_fallback[m
[31m-  |  ldr CARG4, SBUF:CARG1->b[m
[31m-  |   str BASE, L->base[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   str L, SBUF:CARG1->L[m
[31m-  |  str CARG4, SBUF:CARG1->p[m
[31m-  |  bl extern lj_buf_putstr_ .. name[m
[31m-  |  bl extern lj_buf_tostr[m
[31m-  |  b ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP number to bit conversion for soft-float. Clobbers r0-r3.[m
[31m-  |->vm_tobit_fb:[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |->vm_tobit:[m
[31m-  |  lsl RB, CARG2, #1[m
[31m-  |  adds RB, RB, #0x00200000[m
[31m-  |  movpl CARG1, #0			// |x| < 1?[m
[31m-  |  bxpl lr[m
[31m-  |  mvn CARG4, #0x3e0[m
[31m-  |  subs RB, CARG4, RB, asr #21[m
[31m-  |  bmi >1				// |x| >= 2^32?[m
[31m-  |  lsl CARG4, CARG2, #11[m
[31m-  |  orr CARG4, CARG4, #0x80000000[m
[31m-  |  orr CARG4, CARG4, CARG1, lsr #21[m
[31m-  |   cmp CARG2, #0[m
[31m-  |  lsr CARG1, CARG4, RB[m
[31m-  |   rsblt CARG1, CARG1, #0[m
[31m-  |  bx lr[m
[31m-  |1:[m
[31m-  |  add RB, RB, #21[m
[31m-  |  lsr CARG4, CARG1, RB[m
[31m-  |  rsb RB, RB, #20[m
[31m-  |  lsl CARG1, CARG2, #12[m
[31m-  |   cmp CARG2, #0[m
[31m-  |  orr CARG1, CARG4, CARG1, lsl RB[m
[31m-  |   rsblt CARG1, CARG1, #0[m
[31m-  |  bx lr[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name[m
[31m-  |  .ffunc_1 bit_..name[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  blne ->vm_tobit_fb[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit tobit[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name[m
[31m-  |  mov CARG3, CARG1[m
[31m-  |  mov RA, #8[m
[31m-  |1:[m
[31m-  |  ldrd CARG12, [BASE, RA][m
[31m-  |   cmp RA, NARGS8:RC[m
[31m-  |    add RA, RA, #8[m
[31m-  |   bge >2[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  blne ->vm_tobit_fb[m
[31m-  |  ins CARG3, CARG3, CARG1[m
[31m-  |  b <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op band, and[m
[31m-  |.ffunc_bit_op bor, orr[m
[31m-  |.ffunc_bit_op bxor, eor[m
[31m-  |[m
[31m-  |2:[m
[31m-  |  mvn CARG4, #~LJ_TISNUM[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  strd CARG34, [BASE, #-8][m
[31m-  |  b ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_bit bswap[m
[31m-  |  eor CARG3, CARG1, CARG1, ror #16[m
[31m-  |  bic CARG3, CARG3, #0x00ff0000[m
[31m-  |  ror CARG1, CARG1, #8[m
[31m-  |   mvn CARG2, #~LJ_TISNUM[m
[31m-  |  eor CARG1, CARG1, CARG3, lsr #8[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc_bit bnot[m
[31m-  |  mvn CARG1, CARG1[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins, shmod[m
[31m-  |  .ffunc bit_..name[m
[31m-  |  ldrd CARG12, [BASE, #8][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  blne ->vm_tobit_fb[m
[31m-  |.if shmod == 0[m
[31m-  |  and RA, CARG1, #31[m
[31m-  |.else[m
[31m-  |  rsb RA, CARG1, #0[m
[31m-  |.endif[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  blne ->vm_tobit_fb[m
[31m-  |  ins CARG1, CARG1, RA[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh lshift, lsl, 0[m
[31m-  |.ffunc_bit_sh rshift, lsr, 0[m
[31m-  |.ffunc_bit_sh arshift, asr, 0[m
[31m-  |.ffunc_bit_sh rol, ror, 1[m
[31m-  |.ffunc_bit_sh ror, ror, 0[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |   ldr CARG3, [BASE, FRAME_FUNC][m
[31m-  |  ldr CARG2, L->maxstack[m
[31m-  |  add CARG1, BASE, NARGS8:RC[m
[31m-  |    ldr PC, [BASE, FRAME_PC]		// Fallback may overwrite PC.[m
[31m-  |  str CARG1, L->top[m
[31m-  |   ldr CARG3, CFUNC:CARG3->f[m
[31m-  |    str BASE, L->base[m
[31m-  |  add CARG1, CARG1, #8*LUA_MINSTACK[m
[31m-  |    str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  cmp CARG1, CARG2[m
[31m-  |   mov CARG1, L[m
[31m-  |  bhi >5				// Need to grow stack.[m
[31m-  |   blx CARG3				// (lua_State *L)[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |   ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |   lsl RC, CRET1, #3[m
[31m-  |   sub RA, BASE, #8[m
[31m-  |  bgt ->fff_res			// Returned nresults+1?[m
[31m-  |1:  // Returned 0 or -1: retry fast path.[m
[31m-  |   ldr CARG1, L->top[m
[31m-  |    ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   sub NARGS8:RC, CARG1, BASE[m
[31m-  |  bne ->vm_call_tail			// Returned -1?[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   bic CARG2, PC, #FRAME_TYPEP[m
[31m-  |  ldreq INS, [PC, #-4][m
[31m-  |  andeq CARG2, MASKR8, INS, lsr #5	// Conditional decode_RA8.[m
[31m-  |  addeq CARG2, CARG2, #8[m
[31m-  |  sub RB, BASE, CARG2[m
[31m-  |  b ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  mov CARG2, #LUA_MINSTACK[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  cmp CARG1, CARG1			// Set zero-flag to force retry.[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |  mov RA, lr[m
[31m-  |   str BASE, L->base[m
[31m-  |  add CARG2, BASE, NARGS8:RC[m
[31m-  |   str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  str CARG2, L->top[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_gc_step		// (lua_State *L)[m
[31m-  |   ldr BASE, L->base[m
[31m-  |  mov lr, RA				// Help return address predictor.[m
[31m-  |   ldr CFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |  bx lr[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |  tst CARG1, #HOOK_VMEVENT		// No recording while in vmevent.[m
[31m-  |  bne >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |   ldr CARG2, [DISPATCH, #DISPATCH_GL(hookcount)][m
[31m-  |  tst CARG1, #HOOK_ACTIVE[m
[31m-  |  bne >1[m
[31m-  |   sub CARG2, CARG2, #1[m
[31m-  |  tst CARG1, #LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |   strne CARG2, [DISPATCH, #DISPATCH_GL(hookcount)][m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |  tst CARG1, #HOOK_ACTIVE		// Hook already active?[m
[31m-  |  beq >1[m
[31m-  |5:  // Re-dispatch to static ins.[m
[31m-  |  decode_OP OP, INS[m
[31m-  |  add OP, DISPATCH, OP, lsl #2[m
[31m-  |  ldr pc, [OP, #GG_DISP2STATIC][m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |   ldr CARG2, [DISPATCH, #DISPATCH_GL(hookcount)][m
[31m-  |  tst CARG1, #HOOK_ACTIVE		// Hook already active?[m
[31m-  |  bne <5[m
[31m-  |  tst CARG1, #LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beq <5[m
[31m-  |   subs CARG2, CARG2, #1[m
[31m-  |   str CARG2, [DISPATCH, #DISPATCH_GL(hookcount)][m
[31m-  |   beq >1[m
[31m-  |  tst CARG1, #LUA_MASKLINE[m
[31m-  |  beq <5[m
[31m-  |1:[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, PC[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  bl extern lj_dispatch_ins		// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  ldr BASE, L->base[m
[31m-  |4:  // Re-dispatch to static ins.[m
[31m-  |  ldrb OP, [PC, #-4][m
[31m-  |   ldr INS, [PC, #-4][m
[31m-  |  add OP, DISPATCH, OP, lsl #2[m
[31m-  |  ldr OP, [OP, #GG_DISP2STATIC][m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   decode_RD RC, INS[m
[31m-  |  bx OP[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  ldr CARG1, [CARG4, #-24][m
[31m-  |   add PC, PC, #4[m
[31m-  |  str CARG1, SAVE_MULTRES		// Restore MULTRES for *M ins.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Same as curr_topL(L).[m
[31m-  |   sub CARG1, DISPATCH, #-GG_DISP2J[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  ldr CARG3, LFUNC:CARG3->field_pc[m
[31m-  |   mov CARG2, PC[m
[31m-  |   str L, [DISPATCH, #DISPATCH_J(L)][m
[31m-  |  ldrb CARG3, [CARG3, #PC2PROTO(framesize)][m
[31m-  |   str BASE, L->base[m
[31m-  |  add CARG3, BASE, CARG3, lsl #3[m
[31m-  |  str CARG3, L->top[m
[31m-  |  bl extern lj_trace_hot		// (jit_State *J, const BCIns *pc)[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mov CARG2, PC[m
[31m-  |.if JIT[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  orr CARG2, PC, #1[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  add CARG4, BASE, RC[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |    mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |    sub RA, RA, BASE[m
[31m-  |  str CARG4, L->top[m
[31m-  |  bl extern lj_dispatch_call		// (lua_State *L, const BCIns *pc)[m
[31m-  |  // Returns ASMFunction.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   ldr CARG4, L->top[m
[31m-  |    mov CARG2, #0[m
[31m-  |  add RA, BASE, RA[m
[31m-  |   sub NARGS8:RC, CARG4, BASE[m
[31m-  |    str CARG2, SAVE_PC		// Invalidate for subsequent line hook.[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   ldr INS, [PC, #-4][m
[31m-  |  bx CRET1[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // RA = resultptr, CARG4 = meta base[m
[31m-  |   ldr RB, SAVE_MULTRES[m
[31m-  |  ldr INS, [PC, #-4][m
[31m-  |    ldr TRACE:CARG3, [CARG4, #-24]	// Save previous trace.[m
[31m-  |   subs RB, RB, #8[m
[31m-  |  decode_RA8 RC, INS			// Call base.[m
[31m-  |   beq >2[m
[31m-  |1:  // Move results down.[m
[31m-  |  ldrd CARG12, [RA][m
[31m-  |    add RA, RA, #8[m
[31m-  |   subs RB, RB, #8[m
[31m-  |  strd CARG12, [BASE, RC][m
[31m-  |    add RC, RC, #8[m
[31m-  |   bne <1[m
[31m-  |2:[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |   add RA, RA, RB[m
[31m-  |3:[m
[31m-  |   cmp RA, RC[m
[31m-  |  mvn CARG2, #~LJ_TNIL[m
[31m-  |   bhi >9				// More results wanted?[m
[31m-  |[m
[31m-  |  ldrh RA, TRACE:CARG3->traceno[m
[31m-  |  ldrh RC, TRACE:CARG3->link[m
[31m-  |  cmp RC, RA[m
[31m-  |  beq ->cont_nop			// Blacklisted.[m
[31m-  |  cmp RC, #0[m
[31m-  |  bne =>BC_JLOOP			// Jump to stitched trace.[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  str RA, [DISPATCH, #DISPATCH_J(exitno)][m
[31m-  |  str L, [DISPATCH, #DISPATCH_J(L)][m
[31m-  |  str BASE, L->base[m
[31m-  |  sub CARG1, DISPATCH, #-GG_DISP2J[m
[31m-  |  mov CARG2, PC[m
[31m-  |  bl extern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |9:  // Fill up results with nil.[m
[31m-  |  strd CARG12, [BASE, RC][m
[31m-  |  add RC, RC, #8[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, PC[m
[31m-  |  bl extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  sub PC, PC, #4[m
[31m-  |  b ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |  sub sp, sp, #12[m
[31m-  |  push {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12}[m
[31m-  |  ldr CARG1, [sp, #64]	// Load original value of lr.[m
[31m-  |   ldr DISPATCH, [lr]	// Load DISPATCH.[m
[31m-  |    add CARG3, sp, #64	// Recompute original value of sp.[m
[31m-  |   mv_vmstate CARG4, EXIT[m
[31m-  |    str CARG3, [sp, #52]	// Store sp in RID_SP[m
[31m-  |   st_vmstate CARG4[m
[31m-  |  ldr CARG2, [CARG1, #-4]!	// Get exit instruction.[m
[31m-  |   str CARG1, [sp, #56]	// Store exit pc in RID_LR and RID_PC.[m
[31m-  |   str CARG1, [sp, #60][m
[31m-  |.if FPU[m
[31m-  |  vpush {d0-d15}[m
[31m-  |.endif[m
[31m-  |  lsl CARG2, CARG2, #8[m
[31m-  |  add CARG1, CARG1, CARG2, asr #6[m
[31m-  |   ldr CARG2, [lr, #4]	// Load exit stub group offset.[m
[31m-  |   sub CARG1, CARG1, lr[m
[31m-  |  ldr L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |   add CARG1, CARG2, CARG1, lsr #2	// Compute exit number.[m
[31m-  |    ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)][m
[31m-  |   str CARG1, [DISPATCH, #DISPATCH_J(exitno)][m
[31m-  |   mov CARG4, #0[m
[31m-  |    str BASE, L->base[m
[31m-  |  str L, [DISPATCH, #DISPATCH_J(L)][m
[31m-  |   str CARG4, [DISPATCH, #DISPATCH_GL(jit_base)][m
[31m-  |  sub CARG1, DISPATCH, #-GG_DISP2J[m
[31m-  |  mov CARG2, sp[m
[31m-  |  bl extern lj_trace_exit		// (jit_State *J, ExitState *ex)[m
[31m-  |  // Returns MULTRES (unscaled) or negated error code.[m
[31m-  |  ldr CARG2, L->cframe[m
[31m-  |   ldr BASE, L->base[m
[31m-  |  bic CARG2, CARG2, #~CFRAME_RAWMASK	// Use two steps: bic sp is deprecated.[m
[31m-  |  mov sp, CARG2[m
[31m-  |   ldr PC, SAVE_PC			// Get SAVE_PC.[m
[31m-  |  str L, SAVE_L			// Set SAVE_L (on-trace resume/yield).[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |  // CARG1 = MULTRES or negated error code, BASE, PC and DISPATCH set.[m
[31m-  |.if JIT[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |1:[m
[31m-  |  cmp CARG1, #0[m
[31m-  |  blt >9				// Check for error from exit.[m
[31m-  |   lsl RC, CARG1, #3[m
[31m-  |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-  |   str RC, SAVE_MULTRES[m
[31m-  |   mov CARG3, #0[m
[31m-  |   str BASE, L->base[m
[31m-  |  ldr CARG2, LFUNC:CARG2->field_pc[m
[31m-  |   str CARG3, [DISPATCH, #DISPATCH_GL(jit_base)][m
[31m-  |    mv_vmstate CARG4, INTERP[m
[31m-  |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  ldrb OP, [PC][m
[31m-  |     mov MASKR8, #255[m
[31m-  |   ldr INS, [PC], #4[m
[31m-  |     lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |    st_vmstate CARG4[m
[31m-  |  cmp OP, #BC_FUNCC+2		// Fast function?[m
[31m-  |  bhs >4[m
[31m-  |2:[m
[31m-  |  cmp OP, #BC_FUNCF			// Function header?[m
[31m-  |  ldr OP, [DISPATCH, OP, lsl #2][m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   lsrlo RC, INS, #16	// No: Decode operands A*8 and D.[m
[31m-  |   subhs RC, RC, #8[m
[31m-  |   addhs RA, RA, BASE	// Yes: RA = BASE+framesize*8, RC = nargs*8[m
[31m-  |   ldrhs CARG3, [BASE, FRAME_FUNC][m
[31m-  |  bx OP[m
[31m-  |[m
[31m-  |4:  // Check frame below fast function.[m
[31m-  |  ldr CARG1, [BASE, FRAME_PC][m
[31m-  |  ands CARG2, CARG1, #FRAME_TYPE[m
[31m-  |  bne <2			// Trace stitching continuation?[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  ldr CARG3, [CARG1, #-4][m
[31m-  |  decode_RA8 CARG1, CARG3[m
[31m-  |  sub CARG2, BASE, CARG1[m
[31m-  |  ldr LFUNC:CARG3, [CARG2, #-16][m
[31m-  |  ldr CARG3, LFUNC:CARG3->field_pc[m
[31m-  |  ldr KBASE, [CARG3, #PC2PROTO(k)][m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  rsb CARG2, CARG1, #0[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP value rounding. Called from JIT code.[m
[31m-  |//[m
[31m-  |// double lj_vm_floor/ceil/trunc(double x);[m
[31m-  |.macro vm_round, func, hf[m
[31m-  |.if hf == 1[m
[31m-  |  vmov CARG1, CARG2, d0[m
[31m-  |.endif[m
[31m-  |  lsl CARG3, CARG2, #1[m
[31m-  |  adds RB, CARG3, #0x00200000[m
[31m-  |  bpl >2				// |x| < 1?[m
[31m-  |  mvn CARG4, #0x3cc[m
[31m-  |  subs RB, CARG4, RB, asr #21	// 2^0: RB = 51, 2^51: RB = 0.[m
[31m-  |  bxlo lr				// |x| >= 2^52: done.[m
[31m-  |  mvn CARG4, #1[m
[31m-  |   bic CARG3, CARG1, CARG4, lsl RB	// ztest = lo & ~lomask[m
[31m-  |  and CARG1, CARG1, CARG4, lsl RB	// lo &= lomask[m
[31m-  |  subs RB, RB, #32[m
[31m-  |   bicpl CARG4, CARG2, CARG4, lsl RB	// |x| <= 2^20: ztest |= hi & ~himask[m
[31m-  |   orrpl CARG3, CARG3, CARG4[m
[31m-  |   mvnpl CARG4, #1[m
[31m-  |  andpl CARG2, CARG2, CARG4, lsl RB	// |x| <= 2^20: hi &= himask[m
[31m-  |.if "func" == "floor"[m
[31m-  |   tst CARG3, CARG2, asr #31		// iszero = ((ztest & signmask) == 0)[m
[31m-  |.else[m
[31m-  |   bics CARG3, CARG3, CARG2, asr #31	// iszero = ((ztest & ~signmask) == 0)[m
[31m-  |.endif[m
[31m-  |.if hf == 1[m
[31m-  |  vmoveq d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bxeq lr				// iszero: done.[m
[31m-  |  mvn CARG4, #1[m
[31m-  |  cmp RB, #0[m
[31m-  |  lslpl CARG3, CARG4, RB[m
[31m-  |  mvnmi CARG3, #0[m
[31m-  |  add RB, RB, #32[m
[31m-  |  subs CARG1, CARG1, CARG4, lsl RB	// lo = lo-lomask[m
[31m-  |  sbc CARG2, CARG2, CARG3		// hi = hi-himask+carry[m
[31m-  |.if hf == 1[m
[31m-  |  vmov d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bx lr[m
[31m-  |[m
[31m-  |2:  // |x| < 1:[m
[31m-  |  bxcs lr				// |x| is not finite.[m
[31m-  |  orr CARG3, CARG3, CARG1		// ztest = (2*hi) | lo[m
[31m-  |.if "func" == "floor"[m
[31m-  |  tst CARG3, CARG2, asr #31		// iszero = ((ztest & signmask) == 0)[m
[31m-  |.else[m
[31m-  |  bics CARG3, CARG3, CARG2, asr #31	// iszero = ((ztest & ~signmask) == 0)[m
[31m-  |.endif[m
[31m-  |  mov CARG1, #0			// lo = 0[m
[31m-  |  and CARG2, CARG2, #0x80000000[m
[31m-  |  ldrne CARG4, <9			// hi = sign(x) | (iszero ? 0.0 : 1.0)[m
[31m-  |  orrne CARG2, CARG2, CARG4[m
[31m-  |.if hf == 1[m
[31m-  |  vmov d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bx lr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |9:[m
[31m-  |  .long 0x3ff00000			// hiword(+1.0)[m
[31m-  |[m
[31m-  |->vm_floor:[m
[31m-  |.if HFABI[m
[31m-  |  vm_round floor, 1[m
[31m-  |.endif[m
[31m-  |->vm_floor_sf:[m
[31m-  |  vm_round floor, 0[m
[31m-  |[m
[31m-  |->vm_ceil:[m
[31m-  |.if HFABI[m
[31m-  |  vm_round ceil, 1[m
[31m-  |.endif[m
[31m-  |->vm_ceil_sf:[m
[31m-  |  vm_round ceil, 0[m
[31m-  |[m
[31m-  |.macro vm_trunc, hf[m
[31m-  |.if JIT[m
[31m-  |.if hf == 1[m
[31m-  |  vmov CARG1, CARG2, d0[m
[31m-  |.endif[m
[31m-  |  lsl CARG3, CARG2, #1[m
[31m-  |  adds RB, CARG3, #0x00200000[m
[31m-  |  andpl CARG2, CARG2, #0x80000000	// |x| < 1? hi = sign(x), lo = 0.[m
[31m-  |  movpl CARG1, #0[m
[31m-  |.if hf == 1[m
[31m-  |  vmovpl d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bxpl lr[m
[31m-  |  mvn CARG4, #0x3cc[m
[31m-  |  subs RB, CARG4, RB, asr #21	// 2^0: RB = 51, 2^51: RB = 0.[m
[31m-  |  bxlo lr				// |x| >= 2^52: already done.[m
[31m-  |  mvn CARG4, #1[m
[31m-  |  and CARG1, CARG1, CARG4, lsl RB	// lo &= lomask[m
[31m-  |  subs RB, RB, #32[m
[31m-  |  andpl CARG2, CARG2, CARG4, lsl RB	// |x| <= 2^20: hi &= himask[m
[31m-  |.if hf == 1[m
[31m-  |  vmov d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bx lr[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |->vm_trunc:[m
[31m-  |.if HFABI[m
[31m-  |  vm_trunc 1[m
[31m-  |.endif[m
[31m-  |->vm_trunc_sf:[m
[31m-  |  vm_trunc 0[m
[31m-  |[m
[31m-  |  // double lj_vm_mod(double dividend, double divisor);[m
[31m-  |->vm_mod:[m
[31m-  |.if FPU[m
[31m-  |  // Special calling convention. Also, RC (r11) is not preserved.[m
[31m-  |  vdiv.f64 d0, d6, d7[m
[31m-  |   mov RC, lr[m
[31m-  |  vmov CARG1, CARG2, d0[m
[31m-  |  bl ->vm_floor_sf[m
[31m-  |  vmov d0, CARG1, CARG2[m
[31m-  |  vmul.f64 d0, d0, d7[m
[31m-  |   mov lr, RC[m
[31m-  |  vsub.f64 d6, d6, d0[m
[31m-  |  bx lr[m
[31m-  |.else[m
[31m-  |  push {r0, r1, r2, r3, r4, lr}[m
[31m-  |  bl extern __aeabi_ddiv[m
[31m-  |  bl ->vm_floor_sf[m
[31m-  |  ldrd CARG34, [sp, #8][m
[31m-  |  bl extern __aeabi_dmul[m
[31m-  |  ldrd CARG34, [sp][m
[31m-  |  eor CARG2, CARG2, #0x80000000[m
[31m-  |  bl extern __aeabi_dadd[m
[31m-  |  add sp, sp, #20[m
[31m-  |  pop {pc}[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  // int lj_vm_modi(int dividend, int divisor);[m
[31m-  |->vm_modi:[m
[31m-  |  ands RB, CARG1, #0x80000000[m
[31m-  |  rsbmi CARG1, CARG1, #0		// a = |dividend|[m
[31m-  |  eor RB, RB, CARG2, asr #1		// Keep signdiff and sign(divisor).[m
[31m-  |  cmp CARG2, #0[m
[31m-  |  rsbmi CARG2, CARG2, #0		// b = |divisor|[m
[31m-  |  subs CARG4, CARG2, #1[m
[31m-  |  cmpne CARG1, CARG2[m
[31m-  |  moveq CARG1, #0			// if (b == 1 || a == b) a = 0[m
[31m-  |  tsthi CARG2, CARG4[m
[31m-  |  andeq CARG1, CARG1, CARG4		// else if ((b & (b-1)) == 0) a &= b-1[m
[31m-  |  bls >1[m
[31m-  |  // Use repeated subtraction to get the remainder.[m
[31m-  |  clz CARG3, CARG1[m
[31m-  |  clz CARG4, CARG2[m
[31m-  |  sub CARG4, CARG4, CARG3[m
[31m-  |  rsbs CARG3, CARG4, #31		// entry = (31-(clz(b)-clz(a)))*8[m
[31m-  |  addne pc, pc, CARG3, lsl #3	// Duff's device.[m
[31m-  |  nop[m
[31m-  {[m
[31m-    int i;[m
[31m-    for (i = 31; i >= 0; i--) {[m
[31m-      |  cmp CARG1, CARG2, lsl #i[m
[31m-      |  subhs CARG1, CARG1, CARG2, lsl #i[m
[31m-    }[m
[31m-  }[m
[31m-  |1:[m
[31m-  |  cmp CARG1, #0[m
[31m-  |  cmpne RB, #0[m
[31m-  |  submi CARG1, CARG1, CARG2		// if (y != 0 && signdiff) y = y - b[m
[31m-  |  eors CARG2, CARG1, RB, lsl #1[m
[31m-  |  rsbmi CARG1, CARG1, #0		// if (sign(divisor) != sign(y)) y = -y[m
[31m-  |  bx lr[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions.[m
[31m-  |// Saveregs already performed. Callback slot number in [sp], g in r12.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  ldr CTSTATE, GL:r12->ctype_state[m
[31m-  |   add DISPATCH, r12, #GG_G2DISP[m
[31m-  |.if FPU[m
[31m-  |  str r4, SAVE_R4[m
[31m-  |  add r4, sp, CFRAME_SPACE+4+8*8[m
[31m-  |  vstmdb r4!, {d8-d15}[m
[31m-  |.endif[m
[31m-  |.if HFABI[m
[31m-  |  add r12, CTSTATE, #offsetof(CTState, cb.fpr[8])[m
[31m-  |.endif[m
[31m-  |  strd CARG34, CTSTATE->cb.gpr[2][m
[31m-  |  strd CARG12, CTSTATE->cb.gpr[0][m
[31m-  |.if HFABI[m
[31m-  |  vstmdb r12!, {d0-d7}[m
[31m-  |.endif[m
[31m-  |  ldr CARG4, [sp][m
[31m-  |   add CARG3, sp, #CFRAME_SIZE[m
[31m-  |    mov CARG1, CTSTATE[m
[31m-  |  lsr CARG4, CARG4, #3[m
[31m-  |   str CARG3, CTSTATE->cb.stack[m
[31m-  |    mov CARG2, sp[m
[31m-  |  str CARG4, CTSTATE->cb.slot[m
[31m-  |  str CTSTATE, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  bl extern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |  // Returns lua_State *.[m
[31m-  |  ldr BASE, L:CRET1->base[m
[31m-  |    mv_vmstate CARG2, INTERP[m
[31m-  |  ldr RC, L:CRET1->top[m
[31m-  |    mov MASKR8, #255[m
[31m-  |   ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |    mov L, CRET1[m
[31m-  |  sub RC, RC, BASE[m
[31m-  |    lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |    st_vmstate CARG2[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  ldr CTSTATE, [DISPATCH, #DISPATCH_GL(ctype_state)][m
[31m-  |   str BASE, L->base[m
[31m-  |   str CARG4, L->top[m
[31m-  |  str L, CTSTATE->L[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |  mov CARG2, RA[m
[31m-  |  bl extern lj_ccallback_leave	// (CTState *cts, TValue *o)[m
[31m-  |  ldrd CARG12, CTSTATE->cb.gpr[0][m
[31m-  |.if HFABI[m
[31m-  |  vldr d0, CTSTATE->cb.fpr[0][m
[31m-  |.endif[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, r4[m
[31m-  |  push {CCSTATE, r5, r11, lr}[m
[31m-  |  mov CCSTATE, CARG1[m
[31m-  |  ldr CARG1, CCSTATE:CARG1->spadj[m
[31m-  |   ldrb CARG2, CCSTATE->nsp[m
[31m-  |    add CARG3, CCSTATE, #offsetof(CCallState, stack)[m
[31m-  |.if HFABI[m
[31m-  |  add RB, CCSTATE, #offsetof(CCallState, fpr[0])[m
[31m-  |.endif[m
[31m-  |  mov r11, sp[m
[31m-  |  sub sp, sp, CARG1			// Readjust stack.[m
[31m-  |   subs CARG2, CARG2, #1[m
[31m-  |.if HFABI[m
[31m-  |  vldm RB, {d0-d7}[m
[31m-  |.endif[m
[31m-  |    ldr RB, CCSTATE->func[m
[31m-  |   bmi >2[m
[31m-  |1:  // Copy stack slots.[m
[31m-  |  ldr CARG4, [CARG3, CARG2, lsl #2][m
[31m-  |  str CARG4, [sp, CARG2, lsl #2][m
[31m-  |  subs CARG2, CARG2, #1[m
[31m-  |  bpl <1[m
[31m-  |2:[m
[31m-  |  ldrd CARG12, CCSTATE->gpr[0][m
[31m-  |  ldrd CARG34, CCSTATE->gpr[2][m
[31m-  |  blx RB[m
[31m-  |  mov sp, r11[m
[31m-  |.if HFABI[m
[31m-  |  add r12, CCSTATE, #offsetof(CCallState, fpr[4])[m
[31m-  |.endif[m
[31m-  |  strd CRET1, CCSTATE->gpr[0][m
[31m-  |.if HFABI[m
[31m-  |  vstmdb r12!, {d0-d3}[m
[31m-  |.endif[m
[31m-  |  pop {CCSTATE, r5, r11, pc}[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1*8, RC = src2, JMP with RC = target[m
[31m-    |   lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    |    ldrh RB, [PC, #2][m
[31m-    |   ldrd CARG34, [RC, BASE]![m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |  bne >3[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  bne >4[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  sublt PC, RB, #0x20000[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  subge PC, RB, #0x20000[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  suble PC, RB, #0x20000[m
[31m-    } else {[m
[31m-      |  subgt PC, RB, #0x20000[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3: // CARG12 is not an integer.[m
[31m-    |.if FPU[m
[31m-    |   vldr d0, [RA][m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // d0 is a number.[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |   vldr d1, [RC][m
[31m-    |  blo >5[m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // d0 is a number, CARG3 is an integer.[m
[31m-    |  vmov s4, CARG3[m
[31m-    |  vcvt.f64.s32 d1, s4[m
[31m-    |  b >5[m
[31m-    |4:  // CARG1 is an integer, CARG34 is not an integer.[m
[31m-    |   vldr d1, [RC][m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // CARG1 is an integer, d1 is a number.[m
[31m-    |  vmov s4, CARG1[m
[31m-    |  vcvt.f64.s32 d0, s4[m
[31m-    |5:  // d0 and d1 are numbers.[m
[31m-    |  vcmp.f64 d0, d1[m
[31m-    |  vmrs[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  sublo PC, RB, #0x20000[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  subhs PC, RB, #0x20000[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  subls PC, RB, #0x20000[m
[31m-    } else {[m
[31m-      |  subhi PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    |.else[m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // CARG12 is a number.[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  movlo RA, RB			// Save RB.[m
[31m-    |  blo >5[m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // CARG12 is a number, CARG3 is an integer.[m
[31m-    |  mov CARG1, CARG3[m
[31m-    |  mov RC, RA[m
[31m-    |  mov RA, RB			// Save RB.[m
[31m-    |  bl extern __aeabi_i2d[m
[31m-    |  mov CARG3, CARG1[m
[31m-    |  mov CARG4, CARG2[m
[31m-    |  ldrd CARG12, [RC]		// Restore first operand.[m
[31m-    |  b >5[m
[31m-    |4:  // CARG1 is an integer, CARG34 is not an integer.[m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // CARG1 is an integer, CARG34 is a number.[m
[31m-    |  mov RA, RB			// Save RB.[m
[31m-    |  bl extern __aeabi_i2d[m
[31m-    |  ldrd CARG34, [RC]		// Restore second operand.[m
[31m-    |5:  // CARG12 and CARG34 are numbers.[m
[31m-    |  bl extern __aeabi_cdcmple[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  sublo PC, RA, #0x20000[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  subhs PC, RA, #0x20000[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  subls PC, RA, #0x20000[m
[31m-    } else {[m
[31m-      |  subhi PC, RA, #0x20000[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  // RA = src1*8, RC = src2, JMP with RC = target[m
[31m-    |   lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    |    ldrh RB, [PC, #2][m
[31m-    |   ldrd CARG34, [RC, BASE]![m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |  cmnls CARG4, #-LJ_TISNUM[m
[31m-    if (vk) {[m
[31m-      |  bls ->BC_ISEQN_Z[m
[31m-    } else {[m
[31m-      |  bls ->BC_ISNEN_Z[m
[31m-    }[m
[31m-    |  // Either or both types are not numbers.[m
[31m-    |.if FFI[m
[31m-    |  checktp CARG2, LJ_TCDATA[m
[31m-    |  checktpne CARG4, LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  cmp CARG2, CARG4			// Compare types.[m
[31m-    |  bne >2				// Not the same type?[m
[31m-    |  checktp CARG2, LJ_TISPRI[m
[31m-    |  bhs >1				// Same type and primitive type?[m
[31m-    |[m
[31m-    |  // Same types and not a primitive type. Compare GCobj or pvalue.[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    if (vk) {[m
[31m-      |  bne >3				// Different GCobjs or pvalues?[m
[31m-      |1:  // Branch if same.[m
[31m-      |  sub PC, RB, #0x20000[m
[31m-      |2:  // Different.[m
[31m-      |  ins_next[m
[31m-      |3:[m
[31m-      |  checktp CARG2, LJ_TISTABUD[m
[31m-      |  bhi <2				// Different objects and not table/ud?[m
[31m-    } else {[m
[31m-      |  beq >1				// Same GCobjs or pvalues?[m
[31m-      |  checktp CARG2, LJ_TISTABUD[m
[31m-      |  bhi >2				// Different objects and not table/ud?[m
[31m-    }[m
[31m-    |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-    |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-    |  ldr TAB:RA, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:RA, #0[m
[31m-    if (vk) {[m
[31m-      |  beq <2			// No metatable?[m
[31m-    } else {[m
[31m-      |  beq >2			// No metatable?[m
[31m-    }[m
[31m-    |  ldrb RA, TAB:RA->nomm[m
[31m-    |   mov CARG4, #1-vk		// ne = 0 or 1.[m
[31m-    |   mov CARG2, CARG1[m
[31m-    |  tst RA, #1<<MM_eq[m
[31m-    |  beq ->vmeta_equal		// 'no __eq' flag not set?[m
[31m-    if (vk) {[m
[31m-      |  b <2[m
[31m-    } else {[m
[31m-      |2:  // Branch if different.[m
[31m-      |  sub PC, RB, #0x20000[m
[31m-      |1:  // Same.[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  // RA = src*8, RC = str_const (~), JMP with RC = target[m
[31m-    |   mvn RC, RC[m
[31m-    |  ldrd CARG12, [BASE, RA][m
[31m-    |    ldrh RB, [PC, #2][m
[31m-    |   ldr STR:CARG3, [KBASE, RC, lsl #2][m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |  checktp CARG2, LJ_TSTR[m
[31m-    |.if FFI[m
[31m-    |  bne >7[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    |.else[m
[31m-    |  cmpeq CARG1, CARG3[m
[31m-    |.endif[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RB, #0x20000[m
[31m-      |1:[m
[31m-    } else {[m
[31m-      |1:[m
[31m-      |  subne PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |.if FFI[m
[31m-    |7:[m
[31m-    |  checktp CARG2, LJ_TCDATA[m
[31m-    |  bne <1[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  // RA = src*8, RC = num_const (~), JMP with RC = target[m
[31m-    |   lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    |    ldrh RB, [PC, #2][m
[31m-    |   ldrd CARG34, [RC, KBASE]![m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:[m
[31m-    }[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |  bne >3[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  bne >4[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RB, #0x20000[m
[31m-      |1:[m
[31m-    } else {[m
[31m-      |1:[m
[31m-      |  subne PC, RB, #0x20000[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // CARG12 is not an integer.[m
[31m-    |.if FFI[m
[31m-    |  bhi >7[m
[31m-    |.else[m
[31m-    if (!vk) {[m
[31m-      |  subhi PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  bhi <2[m
[31m-    |.endif[m
[31m-    |.if FPU[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  vmov s4, CARG3[m
[31m-    |   vldr d0, [RA][m
[31m-    |  vldrlo d1, [RC][m
[31m-    |  vcvths.f64.s32 d1, s4[m
[31m-    |  b >5[m
[31m-    |4:  // CARG1 is an integer, d1 is a number.[m
[31m-    |  vmov s4, CARG1[m
[31m-    |   vldr d1, [RC][m
[31m-    |  vcvt.f64.s32 d0, s4[m
[31m-    |5:  // d0 and d1 are numbers.[m
[31m-    |  vcmp.f64 d0, d1[m
[31m-    |  vmrs[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RB, #0x20000[m
[31m-    } else {[m
[31m-      |  subne PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  b <2[m
[31m-    |.else[m
[31m-    |  // CARG12 is a number.[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  movlo RA, RB			// Save RB.[m
[31m-    |  blo >5[m
[31m-    |  // CARG12 is a number, CARG3 is an integer.[m
[31m-    |  mov CARG1, CARG3[m
[31m-    |  mov RC, RA[m
[31m-    |4:  // CARG1 is an integer, CARG34 is a number.[m
[31m-    |  mov RA, RB			// Save RB.[m
[31m-    |  bl extern __aeabi_i2d[m
[31m-    |  ldrd CARG34, [RC]		// Restore other operand.[m
[31m-    |5:  // CARG12 and CARG34 are numbers.[m
[31m-    |  bl extern __aeabi_cdcmpeq[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RA, #0x20000[m
[31m-    } else {[m
[31m-      |  subne PC, RA, #0x20000[m
[31m-    }[m
[31m-    |  b <2[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |.if FFI[m
[31m-    |7:[m
[31m-    |  checktp CARG2, LJ_TCDATA[m
[31m-    |  bne <1[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  // RA = src*8, RC = primitive_type (~), JMP with RC = target[m
[31m-    |  ldrd CARG12, [BASE, RA][m
[31m-    |   ldrh RB, [PC, #2][m
[31m-    |   add PC, PC, #4[m
[31m-    |  mvn RC, RC[m
[31m-    |   add RB, PC, RB, lsl #2[m
[31m-    |.if FFI[m
[31m-    |  checktp CARG2, LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  cmp CARG2, RC[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RB, #0x20000[m
[31m-    } else {[m
[31m-      |  subne PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  // RA = dst*8 or unused, RC = src, JMP with RC = target[m
[31m-    |  add RC, BASE, RC, lsl #3[m
[31m-    |   ldrh RB, [PC, #2][m
[31m-    |  ldrd CARG12, [RC][m
[31m-    |   add PC, PC, #4[m
[31m-    |   add RB, PC, RB, lsl #2[m
[31m-    |  checktp CARG2, LJ_TTRUE[m
[31m-    if (op == BC_ISTC || op == BC_IST) {[m
[31m-      |  subls PC, RB, #0x20000[m
[31m-      if (op == BC_ISTC) {[m
[31m-	|  strdls CARG12, [BASE, RA][m
[31m-      }[m
[31m-    } else {[m
[31m-      |  subhi PC, RB, #0x20000[m
[31m-      if (op == BC_ISFC) {[m
[31m-	|  strdhi CARG12, [BASE, RA][m
[31m-      }[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  // RA = src*8, RC = -type[m
[31m-    |  ldrd CARG12, [BASE, RA][m
[31m-    |   ins_next1[m
[31m-    |  cmn CARG2, RC[m
[31m-    |   ins_next2[m
[31m-    |  bne ->vmeta_istype[m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  // RA = src*8, RC = -(TISNUM-1)[m
[31m-    |  ldrd CARG12, [BASE, RA][m
[31m-    |   ins_next1[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |   ins_next2[m
[31m-    |  bhs ->vmeta_istype[m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  // RA = dst*8, RC = src[m
[31m-    |  lsl RC, RC, #3[m
[31m-    |   ins_next1[m
[31m-    |  ldrd CARG12, [BASE, RC][m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  // RA = dst*8, RC = src[m
[31m-    |  add RC, BASE, RC, lsl #3[m
[31m-    |   ins_next1[m
[31m-    |  ldr CARG1, [RC, #4][m
[31m-    |   add RA, BASE, RA[m
[31m-    |   ins_next2[m
[31m-    |  checktp CARG1, LJ_TTRUE[m
[31m-    |  mvnls CARG2, #~LJ_TFALSE[m
[31m-    |  mvnhi CARG2, #~LJ_TTRUE[m
[31m-    |  str CARG2, [RA, #4][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  // RA = dst*8, RC = src[m
[31m-    |  lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [BASE, RC][m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |  bhi ->vmeta_unm[m
[31m-    |  eorne CARG2, CARG2, #0x80000000[m
[31m-    |  bne >5[m
[31m-    |  rsbseq CARG1, CARG1, #0[m
[31m-    |  ldrdvs CARG12, >9[m
[31m-    |5:[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |.align 8[m
[31m-    |9:[m
[31m-    |  .long 0x00000000, 0x41e00000	// 2^31.[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  // RA = dst*8, RC = src[m
[31m-    |  lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [BASE, RC][m
[31m-    |  checkstr CARG2, >2[m
[31m-    |  ldr CARG1, STR:CARG1->len[m
[31m-    |1:[m
[31m-    |  mvn CARG2, #~LJ_TISNUM[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |2:[m
[31m-    |  checktab CARG2, ->vmeta_len[m
[31m-#if LJ_52[m
[31m-    |  ldr TAB:CARG3, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:CARG3, #0[m
[31m-    |  bne >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  .IOS mov RC, BASE[m
[31m-    |  bl extern lj_tab_len		// (GCtab *t)[m
[31m-    |  // Returns uint32_t (but less than 2^31).[m
[31m-    |  .IOS mov BASE, RC[m
[31m-    |  b <1[m
[31m-#if LJ_52[m
[31m-    |9:[m
[31m-    |  ldrb CARG4, TAB:CARG3->nomm[m
[31m-    |  tst CARG4, #1<<MM_len[m
[31m-    |  bne <3				// 'no __len' flag set: done.[m
[31m-    |  b ->vmeta_len[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithcheck, cond, ncond, target[m
[31m-    ||if (vk == 1) {[m
[31m-    |   cmn CARG4, #-LJ_TISNUM[m
[31m-    |    cmn..cond CARG2, #-LJ_TISNUM[m
[31m-    ||} else {[m
[31m-    |   cmn CARG2, #-LJ_TISNUM[m
[31m-    |    cmn..cond CARG4, #-LJ_TISNUM[m
[31m-    ||}[m
[31m-    |  b..ncond target[m
[31m-    |.endmacro[m
[31m-    |.macro ins_arithcheck_int, target[m
[31m-    |  ins_arithcheck eq, ne, target[m
[31m-    |.endmacro[m
[31m-    |.macro ins_arithcheck_num, target[m
[31m-    |  ins_arithcheck lo, hs, target[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpre[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   .if FPU[m
[31m-    |   ldrd CARG12, [RB, BASE]![m
[31m-    |    ldrd CARG34, [RC, KBASE]![m
[31m-    |   .else[m
[31m-    |   ldrd CARG12, [BASE, RB][m
[31m-    |    ldrd CARG34, [KBASE, RC][m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   .if FPU[m
[31m-    |   ldrd CARG34, [RB, BASE]![m
[31m-    |    ldrd CARG12, [RC, KBASE]![m
[31m-    |   .else[m
[31m-    |   ldrd CARG34, [BASE, RB][m
[31m-    |    ldrd CARG12, [KBASE, RC][m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   .if FPU[m
[31m-    |   ldrd CARG12, [RB, BASE]![m
[31m-    |    ldrd CARG34, [RC, BASE]![m
[31m-    |   .else[m
[31m-    |   ldrd CARG12, [BASE, RB][m
[31m-    |    ldrd CARG34, [BASE, RC][m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpre_fpu, reg1, reg2[m
[31m-    |.if FPU[m
[31m-    ||if (vk == 1) {[m
[31m-    |  vldr reg2, [RB][m
[31m-    |  vldr reg1, [RC][m
[31m-    ||} else {[m
[31m-    |  vldr reg1, [RB][m
[31m-    |  vldr reg2, [RC][m
[31m-    ||}[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpost_fpu, reg[m
[31m-    |   ins_next1[m
[31m-    |  add RA, BASE, RA[m
[31m-    |   ins_next2[m
[31m-    |  vstr reg, [RA][m
[31m-    |   ins_next3[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfallback, ins[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   ins ->vmeta_arith_vn[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   ins ->vmeta_arith_nv[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   ins ->vmeta_arith_vv[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins, fpins, fpcall[m
[31m-    |  ins_arithpre[m
[31m-    |.if "intins" ~= "vm_modi" and not FPU[m
[31m-    |   ins_next1[m
[31m-    |.endif[m
[31m-    |  ins_arithcheck_int >5[m
[31m-    |.if "intins" == "smull"[m
[31m-    |  smull CARG1, RC, CARG3, CARG1[m
[31m-    |  cmp RC, CARG1, asr #31[m
[31m-    |  ins_arithfallback bne[m
[31m-    |.elif "intins" == "vm_modi"[m
[31m-    |  movs CARG2, CARG3[m
[31m-    |  ins_arithfallback beq[m
[31m-    |  bl ->vm_modi[m
[31m-    |  mvn CARG2, #~LJ_TISNUM[m
[31m-    |.else[m
[31m-    |  intins CARG1, CARG1, CARG3[m
[31m-    |  ins_arithfallback bvs[m
[31m-    |.endif[m
[31m-    |4:[m
[31m-    |.if "intins" == "vm_modi" or FPU[m
[31m-    |   ins_next1[m
[31m-    |.endif[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |5:  // FP variant.[m
[31m-    |  ins_arithpre_fpu d6, d7[m
[31m-    |  ins_arithfallback ins_arithcheck_num[m
[31m-    |.if FPU[m
[31m-    |.if "intins" == "vm_modi"[m
[31m-    |  bl fpcall[m
[31m-    |.else[m
[31m-    |  fpins d6, d6, d7[m
[31m-    |.endif[m
[31m-    |  ins_arithpost_fpu d6[m
[31m-    |.else[m
[31m-    |  bl fpcall[m
[31m-    |.if "intins" ~= "vm_modi"[m
[31m-    |  ins_next1[m
[31m-    |.endif[m
[31m-    |  b <4[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfp, fpins, fpcall[m
[31m-    |  ins_arithpre[m
[31m-    |.if "fpins" ~= "extern" or HFABI[m
[31m-    |  ins_arithpre_fpu d0, d1[m
[31m-    |.endif[m
[31m-    |  ins_arithfallback ins_arithcheck_num[m
[31m-    |.if "fpins" == "extern"[m
[31m-    |  .IOS mov RC, BASE[m
[31m-    |  bl fpcall[m
[31m-    |  .IOS mov BASE, RC[m
[31m-    |.elif FPU[m
[31m-    |  fpins d0, d0, d1[m
[31m-    |.else[m
[31m-    |  bl fpcall[m
[31m-    |.endif[m
[31m-    |.if ("fpins" ~= "extern" or HFABI) and FPU[m
[31m-    |  ins_arithpost_fpu d0[m
[31m-    |.else[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arithdn adds, vadd.f64, extern __aeabi_dadd[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arithdn subs, vsub.f64, extern __aeabi_dsub[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arithdn smull, vmul.f64, extern __aeabi_dmul[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arithfp vdiv.f64, extern __aeabi_ddiv[m
[31m-    break;[m
[31m-  case BC_MODVN: case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithdn vm_modi, vm_mod, ->vm_mod[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  // NYI: (partial) integer arithmetic.[m
[31m-    |  ins_arithfp extern, extern pow[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  decode_RB8 RC, INS[m
[31m-    |   decode_RC8 RB, INS[m
[31m-    |  // RA = dst*8, RC = src_start*8, RB = src_end*8  (note: RB/RC swapped!)[m
[31m-    |  sub CARG3, RB, RC[m
[31m-    |   str BASE, L->base[m
[31m-    |  add CARG2, BASE, RB[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  // RA = dst*8, RC = src_start*8, CARG2 = top-1[m
[31m-    |  mov CARG1, L[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  lsr CARG3, CARG3, #3[m
[31m-    |  bl extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  cmp CRET1, #0[m
[31m-    |  bne ->vmeta_binop[m
[31m-    |  ldrd CARG34, [BASE, RC][m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA]		// Copy result to RA.[m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  // RA = dst*8, RC = str_const (~)[m
[31m-    |  mvn RC, RC[m
[31m-    |   ins_next1[m
[31m-    |  ldr CARG1, [KBASE, RC, lsl #2][m
[31m-    |  mvn CARG2, #~LJ_TSTR[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  // RA = dst*8, RC = cdata_const (~)[m
[31m-    |  mvn RC, RC[m
[31m-    |   ins_next1[m
[31m-    |  ldr CARG1, [KBASE, RC, lsl #2][m
[31m-    |  mvn CARG2, #~LJ_TCDATA[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  // RA = dst*8, (RC = int16_literal)[m
[31m-    |  mov CARG1, INS, asr #16			// Refetch sign-extended reg.[m
[31m-    |  mvn CARG2, #~LJ_TISNUM[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  // RA = dst*8, RC = num_const[m
[31m-    |  lsl RC, RC, #3[m
[31m-    |   ins_next1[m
[31m-    |  ldrd CARG12, [KBASE, RC][m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  // RA = dst*8, RC = primitive_type (~)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  mvn RC, RC[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  str RC, [RA, #4][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  // RA = base*8, RC = end[m
[31m-    |  add RA, BASE, RA[m
[31m-    |   add RC, BASE, RC, lsl #3[m
[31m-    |  mvn CARG1, #~LJ_TNIL[m
[31m-    |  str CARG1, [RA, #4][m
[31m-    |   add RA, RA, #8[m
[31m-    |1:[m
[31m-    |  str CARG1, [RA, #4][m
[31m-    |  cmp RA, RC[m
[31m-    |   add RA, RA, #8[m
[31m-    |  blt <1[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  // RA = dst*8, RC = uvnum[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsl RC, RC, #2[m
[31m-    |   add RC, RC, #offsetof(GCfuncL, uvptr)[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RC][m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |  ldrd CARG34, [CARG2][m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-    |  // RA = uvnum*8, RC = src[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsr RA, RA, #1[m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)[m
[31m-    |    lsl RC, RC, #3[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA][m
[31m-    |    ldrd CARG34, [BASE, RC][m
[31m-    |  ldrb RB, UPVAL:CARG2->marked[m
[31m-    |  ldrb RC, UPVAL:CARG2->closed[m
[31m-    |    ldr CARG2, UPVAL:CARG2->v[m
[31m-    |  tst RB, #LJ_GC_BLACK		// isblack(uv)[m
[31m-    |   add RB, CARG4, #-LJ_TISGCV[m
[31m-    |  cmpne RC, #0[m
[31m-    |   strd CARG34, [CARG2][m
[31m-    |  bne >2				// Upvalue is closed and black?[m
[31m-    |1:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |2:  // Check if new value is collectable.[m
[31m-    |  cmn RB, #-(LJ_TNUMX - LJ_TISGCV)[m
[31m-    |   ldrbhi RC, GCOBJ:CARG3->gch.marked[m
[31m-    |  bls <1				// tvisgcv(v)[m
[31m-    |    sub CARG1, DISPATCH, #-GG_DISP2G[m
[31m-    |   tst RC, #LJ_GC_WHITES[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |.if IOS[m
[31m-    |  beq <1[m
[31m-    |  mov RC, BASE[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RC[m
[31m-    |.else[m
[31m-    |  blne extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |.endif[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETS:[m
[31m-    |  // RA = uvnum*8, RC = str_const (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsr RA, RA, #1[m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)[m
[31m-    |    mvn RC, RC[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA][m
[31m-    |    ldr STR:CARG3, [KBASE, RC, lsl #2][m
[31m-    |  ldrb RB, UPVAL:CARG2->marked[m
[31m-    |     ldrb RC, UPVAL:CARG2->closed[m
[31m-    |   ldr CARG2, UPVAL:CARG2->v[m
[31m-    |    mvn CARG4, #~LJ_TSTR[m
[31m-    |  tst RB, #LJ_GC_BLACK		// isblack(uv)[m
[31m-    |    ldrb RB, STR:CARG3->marked[m
[31m-    |   strd CARG34, [CARG2][m
[31m-    |  bne >2[m
[31m-    |1:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  tst RB, #LJ_GC_WHITES		// iswhite(str)[m
[31m-    |  cmpne RC, #0[m
[31m-    |   sub CARG1, DISPATCH, #-GG_DISP2G[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |.if IOS[m
[31m-    |  beq <1[m
[31m-    |  mov RC, BASE[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RC[m
[31m-    |.else[m
[31m-    |  blne extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |.endif[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  // RA = uvnum*8, RC = num_const[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsr RA, RA, #1[m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)[m
[31m-    |    lsl RC, RC, #3[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA][m
[31m-    |    ldrd CARG34, [KBASE, RC][m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [CARG2][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  // RA = uvnum*8, RC = primitive_type (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsr RA, RA, #1[m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA][m
[31m-    |   mvn RC, RC[m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  str RC, [CARG2, #4][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_UCLO:[m
[31m-    |  // RA = level*8, RC = target[m
[31m-    |  ldr CARG3, L->openupval[m
[31m-    |   add RC, PC, RC, lsl #2[m
[31m-    |   str BASE, L->base[m
[31m-    |  cmp CARG3, #0[m
[31m-    |   sub PC, RC, #0x20000[m
[31m-    |  beq >1[m
[31m-    |   mov CARG1, L[m
[31m-    |   add CARG2, BASE, RA[m
[31m-    |  bl extern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |  ldr BASE, L->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  // RA = dst*8, RC = proto_const (~) (holding function prototype)[m
[31m-    |  mvn RC, RC[m
[31m-    |   str BASE, L->base[m
[31m-    |  ldr CARG2, [KBASE, RC, lsl #2][m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  ldr CARG3, [BASE, FRAME_FUNC][m
[31m-    |   mov CARG1, L[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  bl extern lj_func_newL_gc[m
[31m-    |  // Returns GCfuncL *.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  mvn CARG2, #~LJ_TFUNC[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-  case BC_TDUP:[m
[31m-    |  // RA = dst*8, RC = (hbits|asize) | tab_const (~)[m
[31m-    if (op == BC_TDUP) {[m
[31m-      |  mvn RC, RC[m
[31m-    }[m
[31m-    |  ldr CARG3, [DISPATCH, #DISPATCH_GL(gc.total)][m
[31m-    |   ldr CARG4, [DISPATCH, #DISPATCH_GL(gc.threshold)][m
[31m-    |    str BASE, L->base[m
[31m-    |    str PC, SAVE_PC[m
[31m-    |  cmp CARG3, CARG4[m
[31m-    |   mov CARG1, L[m
[31m-    |  bhs >5[m
[31m-    |1:[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |  lsl CARG2, RC, #21[m
[31m-      |   lsr CARG3, RC, #11[m
[31m-      |  asr RC, CARG2, #21[m
[31m-      |  lsr CARG2, CARG2, #21[m
[31m-      |  cmn RC, #1[m
[31m-      |  addeq CARG2, CARG2, #2[m
[31m-      |  bl extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-      |  // Returns GCtab *.[m
[31m-    } else {[m
[31m-      |  ldr CARG2, [KBASE, RC, lsl #2][m
[31m-      |  bl extern lj_tab_dup  // (lua_State *L, Table *kt)[m
[31m-      |  // Returns GCtab *.[m
[31m-    }[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  mvn CARG2, #~LJ_TTAB[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |5:[m
[31m-    |  bl extern lj_gc_step_fixtop  // (lua_State *L)[m
[31m-    |  mov CARG1, L[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  // RA = dst*8, RC = str_const (~)[m
[31m-  case BC_GSET:[m
[31m-    |  // RA = dst*8, RC = str_const (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   mvn RC, RC[m
[31m-    |  ldr TAB:CARG1, LFUNC:CARG2->env[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #2][m
[31m-    if (op == BC_GGET) {[m
[31m-      |  b ->BC_TGETS_Z[m
[31m-    } else {[m
[31m-      |  b ->BC_TSETS_Z[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  ldrd TAB:CARG12, [BASE, RB][m
[31m-    |   ldrd CARG34, [BASE, RC][m
[31m-    |  checktab CARG2, ->vmeta_tgetv  // STALL: load CARG12.[m
[31m-    |   checktp CARG4, LJ_TISNUM	// Integer key?[m
[31m-    |  ldreq CARG4, TAB:CARG1->array[m
[31m-    |    ldreq CARG2, TAB:CARG1->asize[m
[31m-    |   bne >9[m
[31m-    |[m
[31m-    |  add CARG4, CARG4, CARG3, lsl #3[m
[31m-    |    cmp CARG3, CARG2		// In array part?[m
[31m-    |  ldrdlo CARG34, [CARG4][m
[31m-    |    bhs ->vmeta_tgetv[m
[31m-    |   ins_next1  // Overwrites RB![m
[31m-    |  checktp CARG4, LJ_TNIL[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG2, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:CARG2, #0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  ldrb CARG2, TAB:CARG2->nomm[m
[31m-    |  tst CARG2, #1<<MM_index[m
[31m-    |  bne <1				// 'no __index' flag set: done.[m
[31m-    |  decode_RB8 RB, INS		// Restore RB.[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    |[m
[31m-    |9:[m
[31m-    |  checktp CARG4, LJ_TSTR		// String key?[m
[31m-    |   moveq STR:RC, CARG3[m
[31m-    |  beq ->BC_TGETS_Z[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst*8, RB = table*8, RC = str_const (~)[m
[31m-    |  ldrd CARG12, [BASE, RB][m
[31m-    |   mvn RC, RC[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #2]  // STALL: early RC.[m
[31m-    |  checktab CARG2, ->vmeta_tgets1[m
[31m-    |->BC_TGETS_Z:[m
[31m-    |  // (TAB:RB =) TAB:CARG1 = GCtab *, STR:RC = GCstr *, RA = dst*8[m
[31m-    |  ldr CARG3, TAB:CARG1->hmask[m
[31m-    |   ldr CARG4, STR:RC->hash[m
[31m-    |    ldr NODE:INS, TAB:CARG1->node[m
[31m-    |     mov TAB:RB, TAB:CARG1[m
[31m-    |  and CARG3, CARG3, CARG4			// idx = str->hash & tab->hmask[m
[31m-    |  add CARG3, CARG3, CARG3, lsl #1[m
[31m-    |    add NODE:INS, NODE:INS, CARG3, lsl #3	// node = tab->node + idx*3*8[m
[31m-    |1:[m
[31m-    |  ldrd CARG12, NODE:INS->key  // STALL: early NODE:INS.[m
[31m-    |   ldrd CARG34, NODE:INS->val[m
[31m-    |    ldr NODE:INS, NODE:INS->next[m
[31m-    |  checktp CARG2, LJ_TSTR[m
[31m-    |  cmpeq CARG1, STR:RC[m
[31m-    |  bne >4[m
[31m-    |   checktp CARG4, LJ_TNIL[m
[31m-    |   beq >5[m
[31m-    |3:[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  cmp NODE:INS, #0[m
[31m-    |  bne <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:RB->metatable[m
[31m-    |   mov CARG3, #0  // Optional clear of undef. value (during load stall).[m
[31m-    |   mvn CARG4, #~LJ_TNIL[m
[31m-    |  cmp TAB:CARG1, #0[m
[31m-    |  beq <3				// No metatable: done.[m
[31m-    |  ldrb CARG2, TAB:CARG1->nomm[m
[31m-    |  tst CARG2, #1<<MM_index[m
[31m-    |  bne <3				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgets[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst*8, RB = table*8, RC = index[m
[31m-    |  ldrd CARG12, [BASE, RB][m
[31m-    |  checktab CARG2, ->vmeta_tgetb  // STALL: load CARG12.[m
[31m-    |   ldr CARG3, TAB:CARG1->asize[m
[31m-    |  ldr CARG4, TAB:CARG1->array[m
[31m-    |  lsl CARG2, RC, #3[m
[31m-    |   cmp RC, CARG3[m
[31m-    |  ldrdlo CARG34, [CARG4, CARG2][m
[31m-    |   bhs ->vmeta_tgetb[m
[31m-    |   ins_next1  // Overwrites RB![m
[31m-    |  checktp CARG4, LJ_TNIL[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG2, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:CARG2, #0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  ldrb CARG2, TAB:CARG2->nomm[m
[31m-    |  tst CARG2, #1<<MM_index[m
[31m-    |  bne <1				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetb[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  ldr TAB:CARG1, [BASE, RB][m
[31m-    |   ldr CARG2, [BASE, RC][m
[31m-    |  ldr CARG4, TAB:CARG1->array[m
[31m-    |    ldr CARG3, TAB:CARG1->asize[m
[31m-    |  add CARG4, CARG4, CARG2, lsl #3[m
[31m-    |    cmp CARG2, CARG3		// In array part?[m
[31m-    |    bhs ->vmeta_tgetr[m
[31m-    |  ldrd CARG12, [CARG4][m
[31m-    |->BC_TGETR_Z:[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = src*8, RB = table*8, RC = key*8[m
[31m-    |  ldrd TAB:CARG12, [BASE, RB][m
[31m-    |   ldrd CARG34, [BASE, RC][m
[31m-    |  checktab CARG2, ->vmeta_tsetv  // STALL: load CARG12.[m
[31m-    |   checktp CARG4, LJ_TISNUM	// Integer key?[m
[31m-    |  ldreq CARG2, TAB:CARG1->array[m
[31m-    |    ldreq CARG4, TAB:CARG1->asize[m
[31m-    |   bne >9[m
[31m-    |[m
[31m-    |  add CARG2, CARG2, CARG3, lsl #3[m
[31m-    |    cmp CARG3, CARG4		// In array part?[m
[31m-    |  ldrlo INS, [CARG2, #4][m
[31m-    |    bhs ->vmeta_tsetv[m
[31m-    |   ins_next1  // Overwrites RB![m
[31m-    |  checktp INS, LJ_TNIL[m
[31m-    |  ldrb INS, TAB:CARG1->marked[m
[31m-    |   ldrd CARG34, [BASE, RA][m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |  tst INS, #LJ_GC_BLACK		// isblack(table)[m
[31m-    |   strd CARG34, [CARG2][m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |   ins_next2[m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:RA, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:RA, #0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  ldrb RA, TAB:RA->nomm[m
[31m-    |  tst RA, #1<<MM_newindex[m
[31m-    |  bne <1				// 'no __newindex' flag set: done.[m
[31m-    |  ldr INS, [PC, #-4]		// Restore RA and RB.[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG1, INS, CARG3[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |9:[m
[31m-    |  checktp CARG4, LJ_TSTR		// String key?[m
[31m-    |   moveq STR:RC, CARG3[m
[31m-    |  beq ->BC_TSETS_Z[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src*8, RB = table*8, RC = str_const (~)[m
[31m-    |  ldrd CARG12, [BASE, RB][m
[31m-    |   mvn RC, RC[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #2]  // STALL: early RC.[m
[31m-    |  checktab CARG2, ->vmeta_tsets1[m
[31m-    |->BC_TSETS_Z:[m
[31m-    |  // (TAB:RB =) TAB:CARG1 = GCtab *, STR:RC = GCstr *, RA = dst*8[m
[31m-    |  ldr CARG3, TAB:CARG1->hmask[m
[31m-    |   ldr CARG4, STR:RC->hash[m
[31m-    |    ldr NODE:INS, TAB:CARG1->node[m
[31m-    |     mov TAB:RB, TAB:CARG1[m
[31m-    |  and CARG3, CARG3, CARG4			// idx = str->hash & tab->hmask[m
[31m-    |  add CARG3, CARG3, CARG3, lsl #1[m
[31m-    |   mov CARG4, #0[m
[31m-    |    add NODE:INS, NODE:INS, CARG3, lsl #3	// node = tab->node + idx*3*8[m
[31m-    |   strb CARG4, TAB:RB->nomm		// Clear metamethod cache.[m
[31m-    |1:[m
[31m-    |  ldrd CARG12, NODE:INS->key[m
[31m-    |   ldr CARG4, NODE:INS->val.it[m
[31m-    |    ldr NODE:CARG3, NODE:INS->next[m
[31m-    |  checktp CARG2, LJ_TSTR[m
[31m-    |  cmpeq CARG1, STR:RC[m
[31m-    |  bne >5[m
[31m-    |  ldrb CARG2, TAB:RB->marked[m
[31m-    |   checktp CARG4, LJ_TNIL		// Key found, but nil value?[m
[31m-    |    ldrd CARG34, [BASE, RA][m
[31m-    |   beq >4[m
[31m-    |2:[m
[31m-    |  tst CARG2, #LJ_GC_BLACK		// isblack(table)[m
[31m-    |    strd CARG34, NODE:INS->val[m
[31m-    |  bne >7[m
[31m-    |3:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:RB->metatable[m
[31m-    |  cmp TAB:CARG1, #0[m
[31m-    |  beq <2				// No metatable: done.[m
[31m-    |  ldrb CARG1, TAB:CARG1->nomm[m
[31m-    |  tst CARG1, #1<<MM_newindex[m
[31m-    |  bne <2				// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsets[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  movs NODE:INS, NODE:CARG3[m
[31m-    |  bne <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  ldr TAB:CARG1, TAB:RB->metatable[m
[31m-    |   mov CARG3, TMPDp[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  cmp TAB:CARG1, #0		// No metatable: continue.[m
[31m-    |   str BASE, L->base[m
[31m-    |  ldrbne CARG2, TAB:CARG1->nomm[m
[31m-    |   mov CARG1, L[m
[31m-    |  beq >6[m
[31m-    |  tst CARG2, #1<<MM_newindex[m
[31m-    |  beq ->vmeta_tsets		// 'no __newindex' flag NOT set: check.[m
[31m-    |6:[m
[31m-    |  mvn CARG4, #~LJ_TSTR[m
[31m-    |   str STR:RC, TMPDlo[m
[31m-    |   mov CARG2, TAB:RB[m
[31m-    |  str CARG4, TMPDhi[m
[31m-    |  bl extern lj_tab_newkey		// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Returns TValue *.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  ldrd CARG34, [BASE, RA][m
[31m-    |  strd CARG34, [CRET1][m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, CARG2, CARG3[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src*8, RB = table*8, RC = index[m
[31m-    |  ldrd CARG12, [BASE, RB][m
[31m-    |  checktab CARG2, ->vmeta_tsetb  // STALL: load CARG12.[m
[31m-    |   ldr CARG3, TAB:CARG1->asize[m
[31m-    |  ldr RB, TAB:CARG1->array[m
[31m-    |  lsl CARG2, RC, #3[m
[31m-    |   cmp RC, CARG3[m
[31m-    |  ldrdlo CARG34, [CARG2, RB]![m
[31m-    |   bhs ->vmeta_tsetb[m
[31m-    |   ins_next1  // Overwrites RB![m
[31m-    |  checktp CARG4, LJ_TNIL[m
[31m-    |  ldrb INS, TAB:CARG1->marked[m
[31m-    |   ldrd CARG34, [BASE, RA][m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |  tst INS, #LJ_GC_BLACK		// isblack(table)[m
[31m-    |    strd CARG34, [CARG2][m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |   ins_next2[m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:RA, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:RA, #0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  ldrb RA, TAB:RA->nomm[m
[31m-    |  tst RA, #1<<MM_newindex[m
[31m-    |  bne <1				// 'no __newindex' flag set: done.[m
[31m-    |  ldr INS, [PC, #-4]		// Restore INS.[m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  b ->vmeta_tsetb[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG1, INS, CARG3[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = src*8, RB = table*8, RC = key*8[m
[31m-    |  ldr TAB:CARG2, [BASE, RB][m
[31m-    |   ldr CARG3, [BASE, RC][m
[31m-    |     ldrb INS, TAB:CARG2->marked[m
[31m-    |  ldr CARG1, TAB:CARG2->array[m
[31m-    |    ldr CARG4, TAB:CARG2->asize[m
[31m-    |     tst INS, #LJ_GC_BLACK		// isblack(table)[m
[31m-    |  add CARG1, CARG1, CARG3, lsl #3[m
[31m-    |     bne >7[m
[31m-    |2:[m
[31m-    |    cmp CARG3, CARG4		// In array part?[m
[31m-    |    bhs ->vmeta_tsetr[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |  ldrd CARG34, [BASE, RA][m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [CARG1][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, INS, RB[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  // RA = base*8 (table at base-1), RC = num_const (start index)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |1:[m
[31m-    |   ldr RB, SAVE_MULTRES[m
[31m-    |  ldr TAB:CARG2, [RA, #-8]		// Guaranteed to be a table.[m
[31m-    |  ldr CARG1, [KBASE, RC, lsl #3]	// Integer constant is in lo-word.[m
[31m-    |   subs RB, RB, #8[m
[31m-    |  ldr CARG4, TAB:CARG2->asize[m
[31m-    |   beq >4				// Nothing to copy?[m
[31m-    |  add CARG3, CARG1, RB, lsr #3[m
[31m-    |  cmp CARG3, CARG4[m
[31m-    |   ldr CARG4, TAB:CARG2->array[m
[31m-    |    add RB, RA, RB[m
[31m-    |  bhi >5[m
[31m-    |   add INS, CARG4, CARG1, lsl #3[m
[31m-    |    ldrb CARG1, TAB:CARG2->marked[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |   ldrd CARG34, [RA], #8[m
[31m-    |   strd CARG34, [INS], #8[m
[31m-    |  cmp RA, RB[m
[31m-    |  blo <3[m
[31m-    |    tst CARG1, #LJ_GC_BLACK	// isblack(table)[m
[31m-    |    bne >7[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |   str BASE, L->base[m
[31m-    |  mov CARG1, L[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  bl extern lj_tab_reasize		// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  // Must not reallocate the stack.[m
[31m-    |  .IOS ldr BASE, L->base[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, CARG1, CARG3[m
[31m-    |  b <4[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALLM:[m
[31m-    |  // RA = base*8, (RB = nresults+1,) RC = extra_nargs[m
[31m-    |  ldr CARG1, SAVE_MULTRES[m
[31m-    |  decode_RC8 NARGS8:RC, INS[m
[31m-    |  add NARGS8:RC, NARGS8:RC, CARG1[m
[31m-    |  b ->BC_CALL_Z[m
[31m-    break;[m
[31m-  case BC_CALL:[m
[31m-    |  decode_RC8 NARGS8:RC, INS[m
[31m-    |  // RA = base*8, (RB = nresults+1,) RC = (nargs+1)*8[m
[31m-    |->BC_CALL_Z:[m
[31m-    |  mov RB, BASE			// Save old BASE for vmeta_call.[m
[31m-    |  ldrd CARG34, [BASE, RA]![m
[31m-    |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-    |   add BASE, BASE, #8[m
[31m-    |  checkfunc CARG4, ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = extra_nargs[m
[31m-    |  ldr CARG1, SAVE_MULTRES[m
[31m-    |  add NARGS8:RC, CARG1, RC, lsl #3[m
[31m-    |  b ->BC_CALLT1_Z[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  lsl NARGS8:RC, RC, #3[m
[31m-    |  // RA = base*8, (RB = 0,) RC = (nargs+1)*8[m
[31m-    |->BC_CALLT1_Z:[m
[31m-    |  ldrd LFUNC:CARG34, [RA, BASE]![m
[31m-    |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-    |   add RA, RA, #8[m
[31m-    |  checkfunc CARG4, ->vmeta_callt[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |->BC_CALLT2_Z:[m
[31m-    |   mov RB, #0[m
[31m-    |   ldrb CARG4, LFUNC:CARG3->ffid[m
[31m-    |  tst PC, #FRAME_TYPE[m
[31m-    |  bne >7[m
[31m-    |1:[m
[31m-    |  str LFUNC:CARG3, [BASE, FRAME_FUNC]  // Copy function down, but keep PC.[m
[31m-    |  cmp NARGS8:RC, #0[m
[31m-    |  beq >3[m
[31m-    |2:[m
[31m-    |  ldrd CARG12, [RA, RB][m
[31m-    |   add INS, RB, #8[m
[31m-    |   cmp INS, NARGS8:RC[m
[31m-    |  strd CARG12, [BASE, RB][m
[31m-    |    mov RB, INS[m
[31m-    |   bne <2[m
[31m-    |3:[m
[31m-    |  cmp CARG4, #1			// (> FF_C) Calling a fast function?[m
[31m-    |  bhi >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function with a Lua frame below.[m
[31m-    |  ldr INS, [PC, #-4][m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  sub CARG1, BASE, RA[m
[31m-    |  ldr LFUNC:CARG1, [CARG1, #-16][m
[31m-    |  ldr CARG1, LFUNC:CARG1->field_pc[m
[31m-    |  ldr KBASE, [CARG1, #PC2PROTO(k)][m
[31m-    |  b <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  eor PC, PC, #FRAME_VARG[m
[31m-    |  tst PC, #FRAME_TYPEP		// Vararg frame below?[m
[31m-    |  movne CARG4, #0			// Clear ffid if no Lua function below.[m
[31m-    |  bne <1[m
[31m-    |  sub BASE, BASE, PC[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |  tst PC, #FRAME_TYPE[m
[31m-    |  movne CARG4, #0			// Clear ffid if no Lua function below.[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |  add RA, BASE, RA[m
[31m-    |   mov RB, BASE			// Save old BASE for vmeta_call.[m
[31m-    |  ldrd CARG34, [RA, #-16][m
[31m-    |   ldrd CARG12, [RA, #-8][m
[31m-    |    add BASE, RA, #8[m
[31m-    |  strd CARG34, [RA, #8]		// Copy state.[m
[31m-    |   strd CARG12, [RA, #16]		// Copy control var.[m
[31m-    |  // STALL: locked CARG34.[m
[31m-    |  ldrd LFUNC:CARG34, [RA, #-24][m
[31m-    |    mov NARGS8:RC, #16		// Iterators get 2 arguments.[m
[31m-    |  // STALL: load CARG34.[m
[31m-    |  strd LFUNC:CARG34, [RA]		// Copy callable.[m
[31m-    |  checkfunc CARG4, ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  ldr TAB:RB, [RA, #-16][m
[31m-    |  ldr CARG1, [RA, #-8]		// Get index from control var.[m
[31m-    |  ldr INS, TAB:RB->asize[m
[31m-    |   ldr CARG2, TAB:RB->array[m
[31m-    |    add PC, PC, #4[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  subs RC, CARG1, INS[m
[31m-    |   add CARG3, CARG2, CARG1, lsl #3[m
[31m-    |  bhs >5				// Index points after array part?[m
[31m-    |   ldrd CARG34, [CARG3][m
[31m-    |   checktp CARG4, LJ_TNIL[m
[31m-    |   addeq CARG1, CARG1, #1		// Skip holes in array part.[m
[31m-    |   beq <1[m
[31m-    |  ldrh RC, [PC, #-2][m
[31m-    |   mvn CARG2, #~LJ_TISNUM[m
[31m-    |    strd CARG34, [RA, #8][m
[31m-    |  add RC, PC, RC, lsl #2[m
[31m-    |    add RB, CARG1, #1[m
[31m-    |   strd CARG12, [RA][m
[31m-    |  sub PC, RC, #0x20000[m
[31m-    |    str RB, [RA, #-8]		// Update control var.[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  ldr CARG4, TAB:RB->hmask[m
[31m-    |   ldr NODE:RB, TAB:RB->node[m
[31m-    |6:[m
[31m-    |   add CARG1, RC, RC, lsl #1[m
[31m-    |  cmp RC, CARG4			// End of iteration? Branch to ITERL+1.[m
[31m-    |   add NODE:CARG3, NODE:RB, CARG1, lsl #3  // node = tab->node + idx*3*8[m
[31m-    |  bhi <3[m
[31m-    |   ldrd CARG12, NODE:CARG3->val[m
[31m-    |   checktp CARG2, LJ_TNIL[m
[31m-    |   add RC, RC, #1[m
[31m-    |   beq <6				// Skip holes in hash part.[m
[31m-    |  ldrh RB, [PC, #-2][m
[31m-    |   add RC, RC, INS[m
[31m-    |    ldrd CARG34, NODE:CARG3->key[m
[31m-    |   str RC, [RA, #-8]		// Update control var.[m
[31m-    |   strd CARG12, [RA, #8][m
[31m-    |  add RC, PC, RB, lsl #2[m
[31m-    |  sub PC, RC, #0x20000[m
[31m-    |    strd CARG34, [RA][m
[31m-    |  b <3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  // RA = base*8, RC = target (points to ITERN)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |     add RC, PC, RC, lsl #2[m
[31m-    |  ldrd CFUNC:CARG12, [RA, #-24][m
[31m-    |   ldr CARG3, [RA, #-12][m
[31m-    |    ldr CARG4, [RA, #-4][m
[31m-    |  checktp CARG2, LJ_TFUNC[m
[31m-    |  ldrbeq CARG1, CFUNC:CARG1->ffid[m
[31m-    |   checktpeq CARG3, LJ_TTAB[m
[31m-    |    checktpeq CARG4, LJ_TNIL[m
[31m-    |  cmpeq CARG1, #FF_next_N[m
[31m-    |     subeq PC, RC, #0x20000[m
[31m-    |  bne >5[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  mov CARG1, #0[m
[31m-    |  mvn CARG2, #0x00018000[m
[31m-    |  strd CARG1, [RA, #-8]		// Initialize control var.[m
[31m-    |1:[m
[31m-    |   ins_next3[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  mov CARG1, #BC_JMP[m
[31m-    |   mov OP, #BC_ITERC[m
[31m-    |  strb CARG1, [PC, #-4][m
[31m-    |   sub PC, RC, #0x20000[m
[31m-    |   strb OP, [PC]			// Subsumes ins_next1.[m
[31m-    |   ins_next2[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = base*8, RB = (nresults+1)*8, RC = numparams*8[m
[31m-    |  ldr CARG1, [BASE, FRAME_PC][m
[31m-    |  add RC, BASE, RC[m
[31m-    |   add RA, BASE, RA[m
[31m-    |  add RC, RC, #FRAME_VARG[m
[31m-    |   add CARG4, RA, RB[m
[31m-    |  sub CARG3, BASE, #8		// CARG3 = vtop[m
[31m-    |  sub RC, RC, CARG1		// RC = vbase[m
[31m-    |  // Note: RC may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  cmp RB, #0[m
[31m-    |   sub CARG1, CARG3, RC[m
[31m-    |  beq >5				// Copy all varargs?[m
[31m-    |   sub CARG4, CARG4, #16[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  cmp RC, CARG3[m
[31m-    |  ldrdlo CARG12, [RC], #8[m
[31m-    |  mvnhs CARG2, #~LJ_TNIL[m
[31m-    |   cmp RA, CARG4[m
[31m-    |  strd CARG12, [RA], #8[m
[31m-    |   blo <1[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  ldr CARG4, L->maxstack[m
[31m-    |   cmp CARG1, #0[m
[31m-    |   movle RB, #8			// MULTRES = (0+1)*8[m
[31m-    |   addgt RB, CARG1, #8[m
[31m-    |  add CARG2, RA, CARG1[m
[31m-    |   str RB, SAVE_MULTRES[m
[31m-    |   ble <2[m
[31m-    |  cmp CARG2, CARG4[m
[31m-    |  bhi >7[m
[31m-    |6:[m
[31m-    |   ldrd CARG12, [RC], #8[m
[31m-    |   strd CARG12, [RA], #8[m
[31m-    |  cmp RC, CARG3[m
[31m-    |  blo <6[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  lsr CARG2, CARG1, #3[m
[31m-    |   str RA, L->top[m
[31m-    |  mov CARG1, L[m
[31m-    |   str BASE, L->base[m
[31m-    |  sub RC, RC, BASE			// Need delta, because BASE may change.[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  sub RA, RA, BASE[m
[31m-    |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  add RC, BASE, RC[m
[31m-    |  sub CARG3, BASE, #8[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  // RA = results*8, RC = extra results[m
[31m-    |  ldr CARG1, SAVE_MULTRES[m
[31m-    |   ldr PC, [BASE, FRAME_PC][m
[31m-    |    add RA, BASE, RA[m
[31m-    |  add RC, CARG1, RC, lsl #3[m
[31m-    |  b ->BC_RETM_Z[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET:[m
[31m-    |  // RA = results*8, RC = nresults+1[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   lsl RC, RC, #3[m
[31m-    |    add RA, BASE, RA[m
[31m-    |->BC_RETM_Z:[m
[31m-    |   str RC, SAVE_MULTRES[m
[31m-    |1:[m
[31m-    |  ands CARG1, PC, #FRAME_TYPE[m
[31m-    |   eor CARG2, PC, #FRAME_VARG[m
[31m-    |  bne ->BC_RETV2_Z[m
[31m-    |[m
[31m-    |->BC_RET_Z:[m
[31m-    |  // BASE = base, RA = resultptr, RC = (nresults+1)*8, PC = return[m
[31m-    |  ldr INS, [PC, #-4][m
[31m-    |  subs CARG4, RC, #8[m
[31m-    |   sub CARG3, BASE, #8[m
[31m-    |  beq >3[m
[31m-    |2:[m
[31m-    |  ldrd CARG12, [RA], #8[m
[31m-    |   add BASE, BASE, #8[m
[31m-    |   subs CARG4, CARG4, #8[m
[31m-    |  strd CARG12, [BASE, #-16][m
[31m-    |   bne <2[m
[31m-    |3:[m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  sub CARG4, CARG3, RA[m
[31m-    |   decode_RB8 RB, INS[m
[31m-    |  ldr LFUNC:CARG1, [CARG4, FRAME_FUNC][m
[31m-    |5:[m
[31m-    |  cmp RB, RC			// More results expected?[m
[31m-    |  bhi >6[m
[31m-    |  mov BASE, CARG4[m
[31m-    |  ldr CARG2, LFUNC:CARG1->field_pc[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  mvn CARG2, #~LJ_TNIL[m
[31m-    |  add BASE, BASE, #8[m
[31m-    |   add RC, RC, #8[m
[31m-    |  str CARG2, [BASE, #-12][m
[31m-    |  b <5[m
[31m-    |[m
[31m-    |->BC_RETV1_Z:  // Non-standard return case.[m
[31m-    |  add RA, BASE, RA[m
[31m-    |->BC_RETV2_Z:[m
[31m-    |  tst CARG2, #FRAME_TYPEP[m
[31m-    |  bne ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down.[m
[31m-    |  sub BASE, BASE, CARG2[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET0: case BC_RET1:[m
[31m-    |  // RA = results*8, RC = nresults+1[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   lsl RC, RC, #3[m
[31m-    |   str RC, SAVE_MULTRES[m
[31m-    |  ands CARG1, PC, #FRAME_TYPE[m
[31m-    |   eor CARG2, PC, #FRAME_VARG[m
[31m-    |   ldreq INS, [PC, #-4][m
[31m-    |  bne ->BC_RETV1_Z[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  ldrd CARG12, [BASE, RA][m
[31m-    }[m
[31m-    |  sub CARG4, BASE, #8[m
[31m-    |   decode_RA8 RA, INS[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  strd CARG12, [CARG4][m
[31m-    }[m
[31m-    |  sub BASE, CARG4, RA[m
[31m-    |   decode_RB8 RB, INS[m
[31m-    |  ldr LFUNC:CARG1, [BASE, FRAME_FUNC][m
[31m-    |5:[m
[31m-    |  cmp RB, RC[m
[31m-    |  bhi >6[m
[31m-    |  ldr CARG2, LFUNC:CARG1->field_pc[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  sub CARG2, CARG4, #4[m
[31m-    |  mvn CARG3, #~LJ_TNIL[m
[31m-    |  str CARG3, [CARG2, RC][m
[31m-    |  add RC, RC, #8[m
[31m-    |  b <5[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  |.define FOR_IDX,  [RA];      .define FOR_TIDX,  [RA, #4][m
[31m-  |.define FOR_STOP, [RA, #8];  .define FOR_TSTOP, [RA, #12][m
[31m-  |.define FOR_STEP, [RA, #16]; .define FOR_TSTEP, [RA, #20][m
[31m-  |.define FOR_EXT,  [RA, #24]; .define FOR_TEXT,  [RA, #28][m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IFORL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    |  // RA = base*8, RC = target (after end of loop or start of loop)[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    if (op != BC_JFORL) {[m
[31m-      |   add RC, PC, RC, lsl #2[m
[31m-    }[m
[31m-    if (!vk) {[m
[31m-      |  ldrd CARG34, FOR_STOP[m
[31m-      |   checktp CARG2, LJ_TISNUM[m
[31m-      |  ldr RB, FOR_TSTEP[m
[31m-      |   bne >5[m
[31m-      |  checktp CARG4, LJ_TISNUM[m
[31m-      |   ldr CARG4, FOR_STEP[m
[31m-      |  checktpeq RB, LJ_TISNUM[m
[31m-      |  bne ->vmeta_for[m
[31m-      |  cmp CARG4, #0[m
[31m-      |  blt >4[m
[31m-      |  cmp CARG1, CARG3[m
[31m-    } else {[m
[31m-      |  ldrd CARG34, FOR_STEP[m
[31m-      |   checktp CARG2, LJ_TISNUM[m
[31m-      |   bne >5[m
[31m-      |  adds CARG1, CARG1, CARG3[m
[31m-      |   ldr CARG4, FOR_STOP[m
[31m-      if (op == BC_IFORL) {[m
[31m-	|  addvs RC, PC, #0x20000		// Overflow: prevent branch.[m
[31m-      } else {[m
[31m-	|  bvs >2				// Overflow: do not enter mcode.[m
[31m-      }[m
[31m-      |  cmp CARG3, #0[m
[31m-      |  blt >4[m
[31m-      |  cmp CARG1, CARG4[m
[31m-    }[m
[31m-    |1:[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  subgt PC, RC, #0x20000[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  sub PC, RC, #0x20000[m
[31m-      |  ldrhle RC, [PC, #-2][m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  suble PC, RC, #0x20000[m
[31m-    }[m
[31m-    if (vk) {[m
[31m-      |  strd CARG12, FOR_IDX[m
[31m-    }[m
[31m-    |2:[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, FOR_EXT[m
[31m-    if (op == BC_JFORI || op == BC_JFORL) {[m
[31m-      |  ble =>BC_JLOOP[m
[31m-    }[m
[31m-    |3:[m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |4:  // Invert check for negative step.[m
[31m-    if (!vk) {[m
[31m-      |  cmp CARG3, CARG1[m
[31m-    } else {[m
[31m-      |  cmp CARG4, CARG1[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |5:  // FP loop.[m
[31m-    if (!vk) {[m
[31m-      |  cmnlo CARG4, #-LJ_TISNUM[m
[31m-      |  cmnlo RB, #-LJ_TISNUM[m
[31m-      |  bhs ->vmeta_for[m
[31m-      |.if FPU[m
[31m-      |  vldr d0, FOR_IDX[m
[31m-      |  vldr d1, FOR_STOP[m
[31m-      |  cmp RB, #0[m
[31m-      |  vstr d0, FOR_EXT[m
[31m-      |.else[m
[31m-      |  cmp RB, #0[m
[31m-      |   strd CARG12, FOR_EXT[m
[31m-      |  blt >8[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |.if FPU[m
[31m-      |  vldr d0, FOR_IDX[m
[31m-      |  vldr d2, FOR_STEP[m
[31m-      |  vldr d1, FOR_STOP[m
[31m-      |  cmp CARG4, #0[m
[31m-      |  vadd.f64 d0, d0, d2[m
[31m-      |.else[m
[31m-      |  cmp CARG4, #0[m
[31m-      |  blt >8[m
[31m-      |  bl extern __aeabi_dadd[m
[31m-      |   strd CARG12, FOR_IDX[m
[31m-      |  ldrd CARG34, FOR_STOP[m
[31m-      |   strd CARG12, FOR_EXT[m
[31m-      |.endif[m
[31m-    }[m
[31m-    |6:[m
[31m-    |.if FPU[m
[31m-    |  vcmpge.f64 d0, d1[m
[31m-    |  vcmplt.f64 d1, d0[m
[31m-    |  vmrs[m
[31m-    |.else[m
[31m-    |  bl extern __aeabi_cdcmple[m
[31m-    |.endif[m
[31m-    if (vk) {[m
[31m-      |.if FPU[m
[31m-      |  vstr d0, FOR_IDX[m
[31m-      |  vstr d0, FOR_EXT[m
[31m-      |.endif[m
[31m-    }[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  subhi PC, RC, #0x20000[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  sub PC, RC, #0x20000[m
[31m-      |  ldrhls RC, [PC, #-2][m
[31m-      |  bls =>BC_JLOOP[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  subls PC, RC, #0x20000[m
[31m-    } else {[m
[31m-      |  bls =>BC_JLOOP[m
[31m-    }[m
[31m-    |  ins_next1[m
[31m-    |  ins_next2[m
[31m-    |  b <3[m
[31m-    |[m
[31m-    |.if not FPU[m
[31m-    |8:  // Invert check for negative step.[m
[31m-    if (vk) {[m
[31m-      |  bl extern __aeabi_dadd[m
[31m-      |  strd CARG12, FOR_IDX[m
[31m-      |  strd CARG12, FOR_EXT[m
[31m-    }[m
[31m-    |  mov CARG3, CARG1[m
[31m-    |  mov CARG4, CARG2[m
[31m-    |  ldrd CARG12, FOR_STOP[m
[31m-    |  b <6[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IITERL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  // RA = base*8, RC = target[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  cmn CARG2, #-LJ_TNIL		// Stop if iterator returned nil.[m
[31m-      |  strdne CARG12, [RA, #-8][m
[31m-      |  bne =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |   add RC, PC, RC, lsl #2[m
[31m-      |  // STALL: load CARG12.[m
[31m-      |  cmn CARG2, #-LJ_TNIL		// Stop if iterator returned nil.[m
[31m-      |  subne PC, RC, #0x20000		// Otherwise save control var + branch.[m
[31m-      |  strdne CARG12, [RA, #-8][m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  // RA = base*8, RC = target (loop extent)[m
[31m-    |  // Note: RA/RC is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_ILOOP follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  // RA = base*8, RC = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  // RA = base (ignored), RC = traceno[m
[31m-    |  ldr CARG1, [DISPATCH, #DISPATCH_J(trace)][m
[31m-    |   mov CARG2, #0  // Traces on ARM don't store the trace number, so use 0.[m
[31m-    |  ldr TRACE:RC, [CARG1, RC, lsl #2][m
[31m-    |   st_vmstate CARG2[m
[31m-    |  ldr RA, TRACE:RC->mcode[m
[31m-    |   str BASE, [DISPATCH, #DISPATCH_GL(jit_base)][m
[31m-    |   str L, [DISPATCH, #DISPATCH_GL(tmpbuf.L)][m
[31m-    |  bx RA[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  // RA = base*8 (only used by trace recorder), RC = target[m
[31m-    |  add RC, PC, RC, lsl #2[m
[31m-    |  sub PC, RC, #0x20000[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    |  // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8[m
[31m-    |  ldr CARG1, L->maxstack[m
[31m-    |   ldrb CARG2, [PC, #-4+PC2PROTO(numparams)][m
[31m-    |    ldr KBASE, [PC, #-4+PC2PROTO(k)][m
[31m-    |  cmp RA, CARG1[m
[31m-    |  bhi ->vm_growstack_l[m
[31m-    if (op != BC_JFUNCF) {[m
[31m-      |  ins_next1[m
[31m-      |  ins_next2[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  cmp NARGS8:RC, CARG2, lsl #3	// Check for missing parameters.[m
[31m-    |   mvn CARG4, #~LJ_TNIL[m
[31m-    |  blo >3[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  decode_RD RC, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next3[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  strd CARG34, [BASE, NARGS8:RC][m
[31m-    |  add NARGS8:RC, NARGS8:RC, #8[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    |  NYI  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8[m
[31m-    |  ldr CARG1, L->maxstack[m
[31m-    |   add CARG4, BASE, RC[m
[31m-    |  add RA, RA, RC[m
[31m-    |   str LFUNC:CARG3, [CARG4]	// Store copy of LFUNC.[m
[31m-    |   add CARG2, RC, #8+FRAME_VARG[m
[31m-    |    ldr KBASE, [PC, #-4+PC2PROTO(k)][m
[31m-    |  cmp RA, CARG1[m
[31m-    |   str CARG2, [CARG4, #4]		// Store delta + FRAME_VARG.[m
[31m-    |  bhs ->vm_growstack_l[m
[31m-    |  ldrb RB, [PC, #-4+PC2PROTO(numparams)][m
[31m-    |   mov RA, BASE[m
[31m-    |   mov RC, CARG4[m
[31m-    |  cmp RB, #0[m
[31m-    |   add BASE, CARG4, #8[m
[31m-    |  beq >3[m
[31m-    |  mvn CARG3, #~LJ_TNIL[m
[31m-    |1:[m
[31m-    |  cmp RA, RC			// Less args than parameters?[m
[31m-    |   ldrdlo CARG12, [RA], #8[m
[31m-    |   movhs CARG2, CARG3[m
[31m-    |    strlo CARG3, [RA, #-4]		// Clear old fixarg slot (help the GC).[m
[31m-    |2:[m
[31m-    |  subs RB, RB, #1[m
[31m-    |   strd CARG12, [CARG4, #8]![m
[31m-    |  bne <1[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = CFUNC, RC = nargs*8[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  ldr CARG4, CFUNC:CARG3->f[m
[31m-    } else {[m
[31m-      |  ldr CARG4, [DISPATCH, #DISPATCH_GL(wrapf)][m
[31m-    }[m
[31m-    |   add CARG2, RA, NARGS8:RC[m
[31m-    |   ldr CARG1, L->maxstack[m
[31m-    |  add RC, BASE, NARGS8:RC[m
[31m-    |    str BASE, L->base[m
[31m-    |   cmp CARG2, CARG1[m
[31m-    |  str RC, L->top[m
[31m-    if (op == BC_FUNCCW) {[m
[31m-      |  ldr CARG2, CFUNC:CARG3->f[m
[31m-    }[m
[31m-    |    mv_vmstate CARG3, C[m
[31m-    |  mov CARG1, L[m
[31m-    |   bhi ->vm_growstack_c		// Need to grow stack.[m
[31m-    |    st_vmstate CARG3[m
[31m-    |  blx CARG4			// (lua_State *L [, lua_CFunction f])[m
[31m-    |  // Returns nresults.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |    mv_vmstate CARG3, INTERP[m
[31m-    |   ldr CRET2, L->top[m
[31m-    |    str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-    |   lsl RC, CRET1, #3[m
[31m-    |    st_vmstate CARG3[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   sub RA, CRET2, RC		// RA = L->top - nresults*8[m
[31m-    |  b ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-[m
[31m-  build_subroutines(ctx);[m
[31m-[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  int i;[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",%%progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 0xe\n"				/* Return address is in lr. */[m
[31m-	"\t.byte 0xc\n\t.uleb128 0xd\n\t.uleb128 0\n"	/* def_cfa sp */[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.long .Lbegin\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 1\n",		/* offset lr */[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 11; i >= (LJ_ARCH_HASFPU ? 5 : 4); i--)  /* offset r4-r11 */[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 2+(11-i));[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-    for (i = 15; i >= 8; i--)  /* offset d8-d15 */[m
[31m-      fprintf(ctx->fp, "\t.byte 5\n\t.uleb128 %d, %d\n",[m
[31m-	64+2*i, 10+2*(15-i));[m
[31m-    fprintf(ctx->fp, "\t.byte 0x84\n\t.uleb128 %d\n", 25);  /* offset r4 */[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE0:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.long lj_vm_ffi_call\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 1\n"		/* offset lr */[m
[31m-	"\t.byte 0x8b\n\t.uleb128 2\n"		/* offset r11 */[m
[31m-	"\t.byte 0x85\n\t.uleb128 3\n"		/* offset r5 */[m
[31m-	"\t.byte 0x84\n\t.uleb128 4\n"		/* offset r4 */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0xb\n"		/* def_cfa_register r11 */[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_arm64.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_arm64.dasc[m
[1mdeleted file mode 100644[m
[1mindex 7a881bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_arm64.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,3764 +0,0 @@[m
[31m-|// Low-level VM code for ARM64 CPUs.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.arch arm64[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|// Note: The ragged indentation of the instructions is intentional.[m
[31m-|//       The starting columns indicate data dependencies.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// ARM64 registers and the AAPCS64 ABI 1.0 at a glance:[m
[31m-|//[m
[31m-|// x0-x17 temp, x19-x28 callee-saved, x29 fp, x30 lr[m
[31m-|// x18 is reserved on most platforms. Don't use it, save it or restore it.[m
[31m-|// x31 doesn't exist. Register number 31 either means xzr/wzr (zero) or sp,[m
[31m-|// depending on the instruction.[m
[31m-|// v0-v7 temp, v8-v15 callee-saved (only d8-d15 preserved), v16-v31 temp[m
[31m-|//[m
[31m-|// x0-x7/v0-v7 hold parameters and results.[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|[m
[31m-|// The following must be C callee-save.[m
[31m-|.define BASE,		x19	// Base of current Lua stack frame.[m
[31m-|.define KBASE,		x20	// Constants of current Lua function.[m
[31m-|.define PC,		x21	// Next PC.[m
[31m-|.define GLREG,		x22	// Global state.[m
[31m-|.define LREG,		x23	// Register holding lua_State (also in SAVE_L).[m
[31m-|.define TISNUM,	x24	// Constant LJ_TISNUM << 47.[m
[31m-|.define TISNUMhi,	x25	// Constant LJ_TISNUM << 15.[m
[31m-|.define TISNIL,	x26	// Constant -1LL.[m
[31m-|.define fp,		x29	// Yes, we have to maintain a frame pointer.[m
[31m-|[m
[31m-|.define ST_INTERP,	w26	// Constant -1.[m
[31m-|[m
[31m-|// The following temporaries are not saved across C calls, except for RA/RC.[m
[31m-|.define RA,		x27[m
[31m-|.define RC,		x28[m
[31m-|.define RB,		x17[m
[31m-|.define RAw,		w27[m
[31m-|.define RCw,		w28[m
[31m-|.define RBw,		w17[m
[31m-|.define INS,		x16[m
[31m-|.define INSw,		w16[m
[31m-|.define ITYPE,		x15[m
[31m-|.define TMP0,		x8[m
[31m-|.define TMP1,		x9[m
[31m-|.define TMP2,		x10[m
[31m-|.define TMP3,		x11[m
[31m-|.define TMP0w,		w8[m
[31m-|.define TMP1w,		w9[m
[31m-|.define TMP2w,		w10[m
[31m-|.define TMP3w,		w11[m
[31m-|[m
[31m-|// Calling conventions. Also used as temporaries.[m
[31m-|.define CARG1,		x0[m
[31m-|.define CARG2,		x1[m
[31m-|.define CARG3,		x2[m
[31m-|.define CARG4,		x3[m
[31m-|.define CARG5,		x4[m
[31m-|.define CARG1w,	w0[m
[31m-|.define CARG2w,	w1[m
[31m-|.define CARG3w,	w2[m
[31m-|.define CARG4w,	w3[m
[31m-|.define CARG5w,	w4[m
[31m-|[m
[31m-|.define FARG1,		d0[m
[31m-|.define FARG2,		d1[m
[31m-|[m
[31m-|.define CRET1,		x0[m
[31m-|.define CRET1w,	w0[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	208[m
[31m-|//----- 16 byte aligned, <-- sp entering interpreter[m
[31m-|// Unused		[sp, #204]	// 32 bit values[m
[31m-|.define SAVE_NRES,	[sp, #200][m
[31m-|.define SAVE_ERRF,	[sp, #196][m
[31m-|.define SAVE_MULTRES,	[sp, #192][m
[31m-|.define TMPD,		[sp, #184]	// 64 bit values[m
[31m-|.define SAVE_L,	[sp, #176][m
[31m-|.define SAVE_PC,	[sp, #168][m
[31m-|.define SAVE_CFRAME,	[sp, #160][m
[31m-|.define SAVE_FPR_,	96		// 96+8*8: 64 bit FPR saves[m
[31m-|.define SAVE_GPR_,	16		// 16+10*8: 64 bit GPR saves[m
[31m-|.define SAVE_LR,	[sp, #8][m
[31m-|.define SAVE_FP,	[sp][m
[31m-|//----- 16 byte aligned, <-- sp while in interpreter.[m
[31m-|[m
[31m-|.define TMPDofs,	#184[m
[31m-|[m
[31m-|.macro save_, gpr1, gpr2, fpr1, fpr2[m
[31m-|  stp d..fpr1, d..fpr2, [sp, # SAVE_FPR_+(fpr1-8)*8][m
[31m-|  stp x..gpr1, x..gpr2, [sp, # SAVE_GPR_+(gpr1-19)*8][m
[31m-|.endmacro[m
[31m-|.macro rest_, gpr1, gpr2, fpr1, fpr2[m
[31m-|  ldp d..fpr1, d..fpr2, [sp, # SAVE_FPR_+(fpr1-8)*8][m
[31m-|  ldp x..gpr1, x..gpr2, [sp, # SAVE_GPR_+(gpr1-19)*8][m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro saveregs[m
[31m-|  stp fp, lr, [sp, #-CFRAME_SPACE]![m
[31m-|  add fp, sp, #0[m
[31m-|  stp x19, x20, [sp, # SAVE_GPR_][m
[31m-|  save_ 21, 22, 8, 9[m
[31m-|  save_ 23, 24, 10, 11[m
[31m-|  save_ 25, 26, 12, 13[m
[31m-|  save_ 27, 28, 14, 15[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  ldp x19, x20, [sp, # SAVE_GPR_][m
[31m-|  rest_ 21, 22, 8, 9[m
[31m-|  rest_ 23, 24, 10, 11[m
[31m-|  rest_ 25, 26, 12, 13[m
[31m-|  rest_ 27, 28, 14, 15[m
[31m-|  ldp fp, lr, [sp], # CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State,	LREG[m
[31m-|.type GL,		global_State,	GLREG[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS8,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Trap for not-yet-implemented parts.[m
[31m-|.macro NYI; brk; .endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Access to frame relative to BASE.[m
[31m-|.define FRAME_FUNC,	#-16[m
[31m-|.define FRAME_PC,	#-8[m
[31m-|[m
[31m-|.macro decode_RA, dst, ins; ubfx dst, ins, #8, #8; .endmacro[m
[31m-|.macro decode_RB, dst, ins; ubfx dst, ins, #24, #8; .endmacro[m
[31m-|.macro decode_RC, dst, ins; ubfx dst, ins, #16, #8; .endmacro[m
[31m-|.macro decode_RD, dst, ins; ubfx dst, ins, #16, #16; .endmacro[m
[31m-|.macro decode_RC8RD, dst, src; ubfiz dst, src, #3, #8; .endmacro[m
[31m-|[m
[31m-|// Instruction decode+dispatch.[m
[31m-|.macro ins_NEXT[m
[31m-|  ldr INSw, [PC], #4[m
[31m-|  add TMP1, GL, INS, uxtb #3[m
[31m-|   decode_RA RA, INS[m
[31m-|  ldr TMP0, [TMP1, #GG_G2DISP][m
[31m-|   decode_RD RC, INS[m
[31m-|  br TMP0[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  .macro ins_next[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-|  ldr PC, LFUNC:CARG3->pc[m
[31m-|  ldr INSw, [PC], #4[m
[31m-|  add TMP1, GL, INS, uxtb #3[m
[31m-|   decode_RA RA, INS[m
[31m-|  ldr TMP0, [TMP1, #GG_G2DISP][m
[31m-|   add RA, BASE, RA, lsl #3[m
[31m-|  br TMP0[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, PC = caller PC[m
[31m-|  str PC, [BASE, FRAME_PC][m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to check the TValue type and extract the GCobj. Branch on failure.[m
[31m-|.macro checktp, reg, tp, target[m
[31m-|  asr ITYPE, reg, #47[m
[31m-|  cmn ITYPE, #-tp[m
[31m-|   and reg, reg, #LJ_GCVMASK[m
[31m-|  bne target[m
[31m-|.endmacro[m
[31m-|.macro checktp, dst, reg, tp, target[m
[31m-|  asr ITYPE, reg, #47[m
[31m-|  cmn ITYPE, #-tp[m
[31m-|   and dst, reg, #LJ_GCVMASK[m
[31m-|  bne target[m
[31m-|.endmacro[m
[31m-|.macro checkstr, reg, target; checktp reg, LJ_TSTR, target; .endmacro[m
[31m-|.macro checktab, reg, target; checktp reg, LJ_TTAB, target; .endmacro[m
[31m-|.macro checkfunc, reg, target; checktp reg, LJ_TFUNC, target; .endmacro[m
[31m-|.macro checkint, reg, target[m
[31m-|  cmp TISNUMhi, reg, lsr #32[m
[31m-|  bne target[m
[31m-|.endmacro[m
[31m-|.macro checknum, reg, target[m
[31m-|  cmp TISNUMhi, reg, lsr #32[m
[31m-|  bls target[m
[31m-|.endmacro[m
[31m-|.macro checknumber, reg, target[m
[31m-|  cmp TISNUMhi, reg, lsr #32[m
[31m-|  blo target[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro mov_false, reg; movn reg, #0x8000, lsl #32; .endmacro[m
[31m-|.macro mov_true, reg; movn reg, #0x0001, lsl #48; .endmacro[m
[31m-|[m
[31m-#define GL_J(field)	(GG_OFS(J) + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|.macro hotcheck, delta[m
[31m-|  NYI[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotloop[m
[31m-|  hotcheck HOTCOUNT_LOOP[m
[31m-|  blo ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall[m
[31m-|  hotcheck HOTCOUNT_CALL[m
[31m-|  blo ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state.[m
[31m-|.macro mv_vmstate, reg, st; movn reg, #LJ_VMST_..st; .endmacro[m
[31m-|.macro st_vmstate, reg; str reg, GL->vmstate; .endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites mark and tmp.[m
[31m-|.macro barrierback, tab, mark, tmp[m
[31m-|  ldr tmp, GL->gc.grayagain[m
[31m-|   and mark, mark, #~LJ_GC_BLACK	// black2gray(tab)[m
[31m-|  str tab, GL->gc.grayagain[m
[31m-|   strb mark, tab->marked[m
[31m-|  str tmp, tab->gclist[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-#if !LJ_DUALNUM[m
[31m-#error "Only dual-number mode supported for ARM64 target"[m
[31m-#endif[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  // See vm_return. Also: RB = previous base.[m
[31m-  |  tbz PC, #2, ->cont_dispatch	// (PC & FRAME_P) == 0?[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  ldr PC, [RB, FRAME_PC]		// Fetch PC of previous frame.[m
[31m-  |   mov_true TMP0[m
[31m-  |  mov BASE, RB[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |   str TMP0, [RA, #-8]!		// Prepend true to results.[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  adds RC, RC, #8			// RC = (nresults+1)*8.[m
[31m-  |  mov CRET1, #LUA_YIELD[m
[31m-  |  beq ->vm_unwind_c_eh[m
[31m-  |  str RCw, SAVE_MULTRES[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |  beq ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultptr, RC/MULTRES = (nresults+1)*8, PC = return[m
[31m-  |  // CARG1 = PC & FRAME_TYPE[m
[31m-  |  and RB, PC, #~FRAME_TYPEP[m
[31m-  |   cmp CARG1, #FRAME_C[m
[31m-  |  sub RB, BASE, RB			// RB = previous base.[m
[31m-  |   bne ->vm_returnp[m
[31m-  |[m
[31m-  |  str RB, L->base[m
[31m-  |   ldrsw CARG2, SAVE_NRES		// CARG2 = nresults+1.[m
[31m-  |    mv_vmstate TMP0w, C[m
[31m-  |   sub BASE, BASE, #16[m
[31m-  |  subs TMP2, RC, #8[m
[31m-  |    st_vmstate TMP0w[m
[31m-  |  beq >2[m
[31m-  |1:[m
[31m-  |  subs TMP2, TMP2, #8[m
[31m-  |   ldr TMP0, [RA], #8[m
[31m-  |   str TMP0, [BASE], #8[m
[31m-  |  bne <1[m
[31m-  |2:[m
[31m-  |  cmp RC, CARG2, lsl #3		// More/less results wanted?[m
[31m-  |  bne >6[m
[31m-  |3:[m
[31m-  |  str BASE, L->top			// Store new top.[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  ldr RC, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |   mov CRET1, #0			// Ok return status for vm_pcall.[m
[31m-  |  str RC, L->cframe[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  bgt >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  ldr CARG3, L->maxstack[m
[31m-  |  cmp BASE, CARG3[m
[31m-  |  bhs >8[m
[31m-  |   str TISNIL, [BASE], #8[m
[31m-  |  add RC, RC, #8[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  cbz CARG2, <3			// LUA_MULTRET+1 case?[m
[31m-  |  sub CARG1, RC, CARG2, lsl #3[m
[31m-  |  sub BASE, BASE, CARG1		// Shrink top.[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  str BASE, L->top			// Save current top held in BASE (yes).[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->top			// Need the (realloced) L->top in BASE.[m
[31m-  |  ldrsw CARG2, SAVE_NRES[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  mov sp, CARG1[m
[31m-  |  mov CRET1, CARG2[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |   mv_vmstate TMP0w, C[m
[31m-  |  ldr GL, L->glref[m
[31m-  |   st_vmstate TMP0w[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |  and sp, CARG1, #CFRAME_RAWMASK[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |    movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48[m
[31m-  |    movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16[m
[31m-  |    movn TISNIL, #0[m
[31m-  |    mov RC, #16			// 2 results: false + error message.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   ldr GL, L->glref			// Setup pointer to global state.[m
[31m-  |    mov_false TMP0[m
[31m-  |  sub RA, BASE, #8			// Results start at BASE-8.[m
[31m-  |  ldr PC, [BASE, FRAME_PC]		// Fetch PC of previous frame.[m
[31m-  |    str TMP0, [BASE, #-8]		// Prepend false to error message.[m
[31m-  |   st_vmstate ST_INTERP[m
[31m-  |  b ->vm_returnc[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  // CARG1 = L[m
[31m-  |  mov CARG2, #LUA_MINSTACK[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vm_growstack_l:			// Grow stack for Lua function.[m
[31m-  |  // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC[m
[31m-  |  add RC, BASE, RC[m
[31m-  |   sub RA, RA, BASE[m
[31m-  |    mov CARG1, L[m
[31m-  |  stp BASE, RC, L->base[m
[31m-  |   add PC, PC, #4			// Must point after first instruction.[m
[31m-  |   lsr CARG2, RA, #3[m
[31m-  |2:[m
[31m-  |  // L->base = new base, L->top = top[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldp BASE, RC, L->base[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   sub NARGS8:RC, RC, BASE[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  mov L, CARG1[m
[31m-  |    ldr GL, L->glref			// Setup pointer to global state.[m
[31m-  |  mov BASE, CARG2[m
[31m-  |   str L, SAVE_L[m
[31m-  |  mov PC, #FRAME_CP[m
[31m-  |   str wzr, SAVE_NRES[m
[31m-  |    add TMP0, sp, #CFRAME_RESUME[m
[31m-  |  ldrb TMP1w, L->status[m
[31m-  |   str wzr, SAVE_ERRF[m
[31m-  |   str L, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   str xzr, SAVE_CFRAME[m
[31m-  |    str TMP0, L->cframe[m
[31m-  |  cbz TMP1w, >3[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  str L, GL->cur_L[m
[31m-  |  mov RA, BASE[m
[31m-  |   ldp BASE, CARG1, L->base[m
[31m-  |    movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48[m
[31m-  |    movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |     strb wzr, L->status[m
[31m-  |    movn TISNIL, #0[m
[31m-  |   sub RC, CARG1, BASE[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   add RC, RC, #8[m
[31m-  |     st_vmstate ST_INTERP[m
[31m-  |   str RCw, SAVE_MULTRES[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, #FRAME_CP[m
[31m-  |  str CARG4w, SAVE_ERRF[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, #FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  ldr RC, L:CARG1->cframe[m
[31m-  |   str CARG3w, SAVE_NRES[m
[31m-  |    mov L, CARG1[m
[31m-  |   str CARG1, SAVE_L[m
[31m-  |    ldr GL, L->glref			// Setup pointer to global state.[m
[31m-  |     mov BASE, CARG2[m
[31m-  |   str CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  str RC, SAVE_CFRAME[m
[31m-  |  str fp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |[m
[31m-  |3:  // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).[m
[31m-  |  str L, GL->cur_L[m
[31m-  |  ldp RB, CARG1, L->base		// RB = old base (for vmeta_call).[m
[31m-  |    movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48[m
[31m-  |    movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16[m
[31m-  |  add PC, PC, BASE[m
[31m-  |    movn TISNIL, #0[m
[31m-  |  sub PC, PC, RB			// PC = frame delta + frame type[m
[31m-  |   sub NARGS8:RC, CARG1, BASE[m
[31m-  |    st_vmstate ST_INTERP[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  // RB = old base, BASE = new base, RC = nargs*8, PC = caller PC[m
[31m-  |  ldr CARG3, [BASE, FRAME_FUNC][m
[31m-  |  checkfunc CARG3, ->vmeta_call[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, CARG3 = func, RC = nargs*8, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  mov L, CARG1[m
[31m-  |   ldr RA, L:CARG1->stack[m
[31m-  |  str CARG1, SAVE_L[m
[31m-  |    ldr GL, L->glref			// Setup pointer to global state.[m
[31m-  |   ldr RB, L->top[m
[31m-  |  str CARG1, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |  ldr RC, L->cframe[m
[31m-  |   sub RA, RA, RB			// Compute -savestack(L, L->top).[m
[31m-  |   str RAw, SAVE_NRES		// Neg. delta means cframe w/o frame.[m
[31m-  |  str wzr, SAVE_ERRF			// No error function.[m
[31m-  |  str RC, SAVE_CFRAME[m
[31m-  |  str fp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |    str L, GL->cur_L[m
[31m-  |  blr CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |  mov BASE, CRET1[m
[31m-  |   mov PC, #FRAME_CP[m
[31m-  |  cbnz BASE, <3			// Else continue with the call.[m
[31m-  |  b ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultptr, RC = (nresults+1)*8[m
[31m-  |  ldr LFUNC:CARG3, [RB, FRAME_FUNC][m
[31m-  |    ldr CARG1, [BASE, #-32]		// Get continuation.[m
[31m-  |   mov CARG4, BASE[m
[31m-  |   mov BASE, RB			// Restore caller BASE.[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |.if FFI[m
[31m-  |    cmp CARG1, #1[m
[31m-  |.endif[m
[31m-  |   ldr PC, [CARG4, #-24]		// Restore PC from [cont|PC].[m
[31m-  |  ldr CARG3, LFUNC:CARG3->pc[m
[31m-  |    add TMP0, RA, RC[m
[31m-  |    str TISNIL, [TMP0, #-8]		// Ensure one valid arg.[m
[31m-  |.if FFI[m
[31m-  |    bls >1[m
[31m-  |.endif[m
[31m-  |  ldr KBASE, [CARG3, #PC2PROTO(k)][m
[31m-  |  // BASE = base, RA = resultptr, CARG4 = meta base[m
[31m-  |    br CARG1[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  beq ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: tailcall from C function.[m
[31m-  |   sub CARG4, CARG4, #32[m
[31m-  |   sub RC, CARG4, BASE[m
[31m-  |  b ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// RA = resultptr, CARG4 = meta base[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |   sub CARG2, CARG4, #32[m
[31m-  |   ldr TMP0, [RA][m
[31m-  |     str BASE, L->base[m
[31m-  |  decode_RB RB, INS[m
[31m-  |   decode_RA RA, INS[m
[31m-  |  add TMP1, BASE, RB, lsl #3[m
[31m-  |  subs TMP1, CARG2, TMP1[m
[31m-  |  beq >1[m
[31m-  |   str TMP0, [CARG2][m
[31m-  |  lsr CARG3, TMP1, #3[m
[31m-  |  b ->BC_CAT_Z[m
[31m-  |[m
[31m-  |1:[m
[31m-  |   str TMP0, [BASE, RA, lsl #3][m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets1:[m
[31m-  |  movn CARG4, #~LJ_TSTR[m
[31m-  |   add CARG2, BASE, RB, lsl #3[m
[31m-  |  add CARG4, STR:RC, CARG4, lsl #47[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  movk CARG2, #(LJ_TTAB>>1)&0xffff, lsl #48[m
[31m-  |  str CARG2, GL->tmptv[m
[31m-  |  add CARG2, GL, #offsetof(global_State, tmptv)[m
[31m-  |2:[m
[31m-  |   add CARG3, sp, TMPDofs[m
[31m-  |  str CARG4, TMPD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetb:			// RB = table, RC = index[m
[31m-  |  add RC, RC, TISNUM[m
[31m-  |   add CARG2, BASE, RB, lsl #3[m
[31m-  |   add CARG3, sp, TMPDofs[m
[31m-  |  str RC, TMPD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:			// RB = table, RC = key[m
[31m-  |  add CARG2, BASE, RB, lsl #3[m
[31m-  |   add CARG3, BASE, RC, lsl #3[m
[31m-  |1:[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  cbz CRET1, >3[m
[31m-  |  ldr TMP0, [CRET1][m
[31m-  |  str TMP0, [BASE, RA, lsl #3][m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |   sub TMP1, BASE, #FRAME_CONT[m
[31m-  |  ldr BASE, L->top[m
[31m-  |    mov NARGS8:RC, #16		// 2 args for func(t, k).[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |    str PC, [BASE, #-24]		// [cont|PC][m
[31m-  |   sub PC, BASE, TMP1[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  sxtw CARG2, TMP1w[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  mov TMP0, TISNIL[m
[31m-  |  cbz CRET1, ->BC_TGETR_Z[m
[31m-  |  ldr TMP0, [CRET1][m
[31m-  |  b ->BC_TGETR_Z[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets1:[m
[31m-  |  movn CARG4, #~LJ_TSTR[m
[31m-  |   add CARG2, BASE, RB, lsl #3[m
[31m-  |  add CARG4, STR:RC, CARG4, lsl #47[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  movk CARG2, #(LJ_TTAB>>1)&0xffff, lsl #48[m
[31m-  |  str CARG2, GL->tmptv[m
[31m-  |  add CARG2, GL, #offsetof(global_State, tmptv)[m
[31m-  |2:[m
[31m-  |   add CARG3, sp, TMPDofs[m
[31m-  |  str CARG4, TMPD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetb:			// RB = table, RC = index[m
[31m-  |  add RC, RC, TISNUM[m
[31m-  |   add CARG2, BASE, RB, lsl #3[m
[31m-  |   add CARG3, sp, TMPDofs[m
[31m-  |  str RC, TMPD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  add CARG2, BASE, RB, lsl #3[m
[31m-  |   add CARG3, BASE, RC, lsl #3[m
[31m-  |1:[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-  |  cbz CRET1, >3[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |   str TMP0, [CRET1][m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |   sub TMP1, BASE, #FRAME_CONT[m
[31m-  |  ldr BASE, L->top[m
[31m-  |    mov NARGS8:RC, #24		// 3 args for func(t, k, v).[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |   str TMP0, [BASE, #16]		// Copy value to third argument.[m
[31m-  |    str PC, [BASE, #-24]		// [cont|PC][m
[31m-  |   sub PC, BASE, TMP1[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |  sxtw CARG3, TMP1w[m
[31m-  |  str BASE, L->base[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // Returns TValue *.[m
[31m-  |  b ->BC_TSETR_Z[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  add CARG2, BASE, RA, lsl #3[m
[31m-  |   sub PC, PC, #4[m
[31m-  |  add CARG3, BASE, RC, lsl #3[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  uxtb CARG4w, INSw[m
[31m-  |  bl extern lj_meta_comp  // (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |3:[m
[31m-  |  cmp CRET1, #1[m
[31m-  |  bhi ->vmeta_binop[m
[31m-  |4:[m
[31m-  |   ldrh RBw, [PC, #2][m
[31m-  |    add PC, PC, #4[m
[31m-  |   add RB, PC, RB, lsl #2[m
[31m-  |   sub RB, RB, #0x20000[m
[31m-  |  csel PC, PC, RB, lo[m
[31m-  |->cont_nop:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_ra:				// RA = resultptr[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |   ldr TMP0, [RA][m
[31m-  |  decode_RA TMP1, INS[m
[31m-  |   str TMP0, [BASE, TMP1, lsl #3][m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |->cont_condt:			// RA = resultptr[m
[31m-  |  ldr TMP0, [RA][m
[31m-  |   mov_true TMP1[m
[31m-  |  cmp TMP1, TMP0			// Branch if result is true.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->cont_condf:			// RA = resultptr[m
[31m-  |  ldr TMP0, [RA][m
[31m-  |   mov_false TMP1[m
[31m-  |  cmp TMP0, TMP1			// Branch if result is false.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV.[m
[31m-  |  and TAB:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal  // (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |   mov CARG2, INS[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal_cd		// (lua_State *L, BCIns op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |   mov CARG2, RA[m
[31m-  |   mov CARG3, RC[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  add CARG3, BASE, RB, lsl #3[m
[31m-  |   add CARG4, KBASE, RC, lsl #3[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  add CARG4, BASE, RB, lsl #3[m
[31m-  |   add CARG3, KBASE, RC, lsl #3[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  add CARG3, BASE, RC, lsl #3[m
[31m-  |  mov CARG4, CARG3[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  add CARG3, BASE, RB, lsl #3[m
[31m-  |   add CARG4, BASE, RC, lsl #3[m
[31m-  |1:[m
[31m-  |  uxtb CARG5w, INSw[m
[31m-  |   add CARG2, BASE, RA, lsl #3[m
[31m-  |    str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |    str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_arith  // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-  |  cbz CRET1, ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2[m
[31m-  |  sub TMP1, CRET1, BASE[m
[31m-  |   str PC, [CRET1, #-24]		// [cont|PC][m
[31m-  |  add PC, TMP1, #FRAME_CONT[m
[31m-  |  mov BASE, CRET1[m
[31m-  |   mov NARGS8:RC, #16		// 2 args for func(o1, o2).[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  add CARG2, BASE, RC, lsl #3[m
[31m-#if LJ_52[m
[31m-  |  mov TAB:RC, TAB:CARG1		// Save table (ignored for other types).[m
[31m-#endif[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |  // Returns NULL (retry) or TValue * (metamethod base).[m
[31m-#if LJ_52[m
[31m-  |  cbnz CRET1, ->vmeta_binop		// Binop call for compatibility.[m
[31m-  |  mov TAB:CARG1, TAB:RC[m
[31m-  |  b ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  b ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // RB = old base, BASE = new base, RC = nargs*8[m
[31m-  |  mov CARG1, L[m
[31m-  |   str RB, L->base			// This is the callers base![m
[31m-  |  sub CARG2, BASE, #16[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  add CARG3, BASE, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |   add NARGS8:RC, NARGS8:RC, #8	// Got one more argument now.[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  ins_call[m
[31m-  |[m
[31m-  |->vmeta_callt:			// Resolve __call for BC_CALLT.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs*8[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  sub CARG2, RA, #16[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  add CARG3, RA, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  ldr TMP1, [RA, FRAME_FUNC]		// Guaranteed to be a function here.[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |   add NARGS8:RC, NARGS8:RC, #8	// Got one more argument now.[m
[31m-  |  and LFUNC:CARG3, TMP1, #LJ_GCVMASK[m
[31m-  |  b ->BC_CALLT2_Z[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, RA[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |.if JIT[m
[31m-  |   uxtb TMP0, INS[m
[31m-  |.endif[m
[31m-  |  decode_RA RA, INS[m
[31m-  |  decode_RD RC, INS[m
[31m-  |.if JIT[m
[31m-  |   cmp TMP0, #BC_JFORI[m
[31m-  |   beq =>BC_JFORI[m
[31m-  |.endif[m
[31m-  |  b =>BC_FORI[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  ldp CARG1, CARG2, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name[m
[31m-  |  .ffunc name[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  ldr FARG1, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checknum CARG1, ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name[m
[31m-  |  .ffunc name[m
[31m-  |  ldp CARG1, CARG2, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |  ldp FARG1, FARG2, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checknum CARG1, ->fff_fallback[m
[31m-  |  checknum CARG2, ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses CARG1 and CARG2.[m
[31m-  |.macro ffgccheck[m
[31m-  |  ldp CARG1, CARG2, GL->gc.total	// Assumes threshold follows total.[m
[31m-  |  cmp CARG1, CARG2[m
[31m-  |  blt >1[m
[31m-  |  bl ->fff_gcstep[m
[31m-  |1:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  mov_false TMP1[m
[31m-  |  cmp CARG1, TMP1[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |  str CARG1, [BASE, #-16][m
[31m-  |  sub RB, BASE, #8[m
[31m-  |  subs RA, NARGS8:RC, #8[m
[31m-  |   add RC, NARGS8:RC, #8		// Compute (nresults+1)*8.[m
[31m-  |  cbz RA, ->fff_res			// Done if exactly 1 argument.[m
[31m-  |1:[m
[31m-  |   ldr CARG1, [RB, #16][m
[31m-  |  sub RA, RA, #8[m
[31m-  |   str CARG1, [RB], #8[m
[31m-  |  cbnz RA, <1[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 type[m
[31m-  |  mov TMP0, #~LJ_TISNUM[m
[31m-  |  asr ITYPE, CARG1, #47[m
[31m-  |  cmn ITYPE, #~LJ_TISNUM[m
[31m-  |  csinv TMP1, TMP0, ITYPE, lo[m
[31m-  |  add TMP1, TMP1, #offsetof(GCfuncC, upvalue)/8[m
[31m-  |  ldr CARG1, [CFUNC:CARG3, TMP1, lsl #3][m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  asr ITYPE, CARG1, #47[m
[31m-  |  cmn ITYPE, #-LJ_TTAB[m
[31m-  |  ccmn ITYPE, #-LJ_TUDATA, #4, ne[m
[31m-  |   and TAB:CARG1, CARG1, #LJ_GCVMASK[m
[31m-  |  bne >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  ldr TAB:RB, TAB:CARG1->metatable[m
[31m-  |2:[m
[31m-  |   mov CARG1, TISNIL[m
[31m-  |   ldr STR:RC, GL->gcroot[GCROOT_MMNAME+MM_metatable][m
[31m-  |  cbz TAB:RB, ->fff_restv[m
[31m-  |  ldr TMP1w, TAB:RB->hmask[m
[31m-  |   ldr TMP2w, STR:RC->hash[m
[31m-  |    ldr NODE:CARG3, TAB:RB->node[m
[31m-  |  and TMP1w, TMP1w, TMP2w		// idx = str->hash & tab->hmask[m
[31m-  |  add TMP1, TMP1, TMP1, lsl #1[m
[31m-  |  movn CARG4, #~LJ_TSTR[m
[31m-  |    add NODE:CARG3, NODE:CARG3, TMP1, lsl #3  // node = tab->node + idx*3*8[m
[31m-  |  add CARG4, STR:RC, CARG4, lsl #47	// Tagged key to look for.[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  ldp CARG1, TMP0, NODE:CARG3->val[m
[31m-  |   ldr NODE:CARG3, NODE:CARG3->next[m
[31m-  |  cmp TMP0, CARG4[m
[31m-  |  beq >5[m
[31m-  |  cbnz NODE:CARG3, <3[m
[31m-  |4:[m
[31m-  |  mov CARG1, RB			// Use metatable as default result.[m
[31m-  |  movk CARG1, #(LJ_TTAB>>1)&0xffff, lsl #48[m
[31m-  |  b ->fff_restv[m
[31m-  |5:[m
[31m-  |  cmp TMP0, TISNIL[m
[31m-  |  bne ->fff_restv[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  movn TMP0, #~LJ_TISNUM[m
[31m-  |  cmp ITYPE, TMP0[m
[31m-  |  csel ITYPE, ITYPE, TMP0, hs[m
[31m-  |  sub TMP1, GL, ITYPE, lsl #3[m
[31m-  |  ldr TAB:RB, [TMP1, #offsetof(global_State, gcroot[GCROOT_BASEMT])-8][m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  checktp TMP1, CARG1, LJ_TTAB, ->fff_fallback[m
[31m-  |   ldr TAB:TMP0, TAB:TMP1->metatable[m
[31m-  |  asr ITYPE, CARG2, #47[m
[31m-  |   ldrb TMP2w, TAB:TMP1->marked[m
[31m-  |  cmn ITYPE, #-LJ_TTAB[m
[31m-  |    and TAB:CARG2, CARG2, #LJ_GCVMASK[m
[31m-  |  ccmp TAB:TMP0, #0, #0, eq[m
[31m-  |  bne ->fff_fallback[m
[31m-  |    str TAB:CARG2, TAB:TMP1->metatable[m
[31m-  |   tbz TMP2w, #2, ->fff_restv	// isblack(table)[m
[31m-  |  barrierback TAB:TMP1, TMP2w, TMP0[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc rawget[m
[31m-  |  ldr CARG2, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-  |   mov CARG1, L[m
[31m-  |   add CARG3, BASE, #8[m
[31m-  |  bl extern lj_tab_get  // (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // Returns cTValue *.[m
[31m-  |  ldr CARG1, [CRET1][m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  checknumber CARG1, ->fff_fallback[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  asr ITYPE, CARG1, #47[m
[31m-  |  cmn ITYPE, #-LJ_TSTR[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  beq ->fff_restv[m
[31m-  |  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  ldr TMP1, GL->gcroot[GCROOT_BASEMT_NUM][m
[31m-  |   str BASE, L->base[m
[31m-  |  cmn ITYPE, #-LJ_TISNUM[m
[31m-  |  ccmp TMP1, #0, #0, ls[m
[31m-  |   str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  ffgccheck[m
[31m-  |  mov CARG1, L[m
[31m-  |  mov CARG2, BASE[m
[31m-  |  bl extern lj_strfmt_number		// (lua_State *L, cTValue *o)[m
[31m-  |  // Returns GCstr *.[m
[31m-  |   movn TMP1, #~LJ_TSTR[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   add CARG1, CARG1, TMP1, lsl #47[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 next[m
[31m-  |  checktp CARG2, CARG1, LJ_TTAB, ->fff_fallback[m
[31m-  |  str TISNIL, [BASE, NARGS8:RC]	// Set missing 2nd arg to nil.[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |   stp BASE, BASE, L->base		// Add frame since C call can throw.[m
[31m-  |  mov CARG1, L[m
[31m-  |  add CARG3, BASE, #8[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Returns 0 at end of traversal.[m
[31m-  |  str TISNIL, [BASE, #-16][m
[31m-  |  cbz CRET1, ->fff_res1		// End of traversal: return nil.[m
[31m-  |  ldp CARG1, CARG2, [BASE, #8]	// Copy key and value to results.[m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |  stp CARG1, CARG2, [BASE, #-16][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  checktp TMP1, CARG1, LJ_TTAB, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  ldr TAB:CARG2, TAB:TMP1->metatable[m
[31m-#endif[m
[31m-  |   ldr CFUNC:CARG4, CFUNC:CARG3->upvalue[0][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-#if LJ_52[m
[31m-  |  cbnz TAB:CARG2, ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov RC, #(3+1)*8[m
[31m-  |  stp CARG1, TISNIL, [BASE, #-8][m
[31m-  |   str CFUNC:CARG4, [BASE, #-16][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_2 ipairs_aux[m
[31m-  |  checktab CARG1, ->fff_fallback[m
[31m-  |   checkint CARG2, ->fff_fallback[m
[31m-  |  ldr TMP1w, TAB:CARG1->asize[m
[31m-  |   ldr CARG3, TAB:CARG1->array[m
[31m-  |    ldr TMP0w, TAB:CARG1->hmask[m
[31m-  |  add CARG2w, CARG2w, #1[m
[31m-  |  cmp CARG2w, TMP1w[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |     add TMP2, CARG2, TISNUM[m
[31m-  |   mov RC, #(0+1)*8[m
[31m-  |     str TMP2, [BASE, #-16][m
[31m-  |  bhs >2				// Not in array part?[m
[31m-  |  ldr TMP0, [CARG3, CARG2, lsl #3][m
[31m-  |1:[m
[31m-  |   mov TMP1, #(2+1)*8[m
[31m-  |   cmp TMP0, TISNIL[m
[31m-  |  str TMP0, [BASE, #-8][m
[31m-  |   csel RC, RC, TMP1, eq[m
[31m-  |  b ->fff_res[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  cbz TMP0w, ->fff_res[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  cbz CRET1, ->fff_res[m
[31m-  |  ldr TMP0, [CRET1][m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  checktp TMP1, CARG1, LJ_TTAB, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  ldr TAB:CARG2, TAB:TMP1->metatable[m
[31m-#endif[m
[31m-  |   ldr CFUNC:CARG4, CFUNC:CARG3->upvalue[0][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-#if LJ_52[m
[31m-  |  cbnz TAB:CARG2, ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov RC, #(3+1)*8[m
[31m-  |  stp CARG1, TISNUM, [BASE, #-8][m
[31m-  |   str CFUNC:CARG4, [BASE, #-16][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc pcall[m
[31m-  |  ldrb TMP0w, GL->hookmask[m
[31m-  |   subs NARGS8:RC, NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |    mov RB, BASE[m
[31m-  |    add BASE, BASE, #16[m
[31m-  |  ubfx TMP0w, TMP0w, #HOOK_ACTIVE_SHIFT, #1[m
[31m-  |  add PC, TMP0, #16+FRAME_PCALL[m
[31m-  |   beq ->vm_call_dispatch[m
[31m-  |1:[m
[31m-  |   add TMP2, BASE, NARGS8:RC[m
[31m-  |2:[m
[31m-  |   ldr TMP0, [TMP2, #-16][m
[31m-  |   str TMP0, [TMP2, #-8]![m
[31m-  |  cmp TMP2, BASE[m
[31m-  |  bne <2[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc xpcall[m
[31m-  |     ldp CARG1, CARG2, [BASE][m
[31m-  |  ldrb TMP0w, GL->hookmask[m
[31m-  |   subs NARGS8:RC, NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |    mov RB, BASE[m
[31m-  |    add BASE, BASE, #24[m
[31m-  |     asr ITYPE, CARG2, #47[m
[31m-  |  ubfx TMP0w, TMP0w, #HOOK_ACTIVE_SHIFT, #1[m
[31m-  |     cmn ITYPE, #-LJ_TFUNC[m
[31m-  |  add PC, TMP0, #24+FRAME_PCALL[m
[31m-  |     bne ->fff_fallback		// Traceback must be a function.[m
[31m-  |     stp CARG2, CARG1, [RB]		// Swap function and traceback.[m
[31m-  |   cbz NARGS8:RC, ->vm_call_dispatch[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  checktp CARG1, LJ_TTHREAD, ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  ldr L:CARG1, CFUNC:CARG3->upvalue[0].gcr[m
[31m-  |  and L:CARG1, CARG1, #LJ_GCVMASK[m
[31m-  |.endif[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |     str BASE, L->base[m
[31m-  |  ldp RB, CARG2, L:CARG1->base[m
[31m-  |   ldrb TMP1w, L:CARG1->status[m
[31m-  |  add TMP0, CARG2, TMP1[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  cmp TMP0, RB[m
[31m-  |  beq ->fff_fallback[m
[31m-  |   cmp TMP1, #LUA_YIELD[m
[31m-  |    add TMP0, CARG2, #8[m
[31m-  |   csel CARG2, CARG2, TMP0, hs[m
[31m-  |   ldr CARG4, L:CARG1->maxstack[m
[31m-  |   add CARG3, CARG2, NARGS8:RC[m
[31m-  |    ldr RB, L:CARG1->cframe[m
[31m-  |   ccmp CARG3, CARG4, #2, ls[m
[31m-  |    ccmp RB, #0, #2, ls[m
[31m-  |    bhi ->fff_fallback[m
[31m-  |.if resume[m
[31m-  |  sub CARG3, CARG3, #8		// Keep resumed thread in stack for GC.[m
[31m-  |  add BASE, BASE, #8[m
[31m-  |  sub NARGS8:RC, NARGS8:RC, #8[m
[31m-  |.endif[m
[31m-  |  str CARG3, L:CARG1->top[m
[31m-  |  str BASE, L->top[m
[31m-  |  cbz NARGS8:RC, >3[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |   ldr TMP0, [BASE, RB][m
[31m-  |  cmp RB, NARGS8:RC[m
[31m-  |   str TMP0, [CARG2, RB][m
[31m-  |   add RB, RB, #8[m
[31m-  |  bne <2[m
[31m-  |3:[m
[31m-  |  mov CARG3, #0[m
[31m-  |   mov L:RA, L:CARG1[m
[31m-  |  mov CARG4, #0[m
[31m-  |  bl ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |  // Returns thread status.[m
[31m-  |4:[m
[31m-  |  ldp CARG3, CARG4, L:RA->base[m
[31m-  |   cmp CRET1, #LUA_YIELD[m
[31m-  |  ldr BASE, L->base[m
[31m-  |    str L, GL->cur_L[m
[31m-  |    st_vmstate ST_INTERP[m
[31m-  |   bhi >8[m
[31m-  |  sub RC, CARG4, CARG3[m
[31m-  |   ldr CARG1, L->maxstack[m
[31m-  |   add CARG2, BASE, RC[m
[31m-  |  cbz RC, >6				// No results?[m
[31m-  |  cmp CARG2, CARG1[m
[31m-  |   mov RB, #0[m
[31m-  |  bhi >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  sub CARG4, RC, #8[m
[31m-  |   str CARG3, L:RA->top		// Clear coroutine stack.[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |   ldr TMP0, [CARG3, RB][m
[31m-  |  cmp RB, CARG4[m
[31m-  |   str TMP0, [BASE, RB][m
[31m-  |   add RB, RB, #8[m
[31m-  |  bne <5[m
[31m-  |6:[m
[31m-  |.if resume[m
[31m-  |  mov_true TMP1[m
[31m-  |   add RC, RC, #16[m
[31m-  |7:[m
[31m-  |  str TMP1, [BASE, #-8]		// Prepend true/false to results.[m
[31m-  |   sub RA, BASE, #8[m
[31m-  |.else[m
[31m-  |   mov RA, BASE[m
[31m-  |   add RC, RC, #8[m
[31m-  |.endif[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   str RCw, SAVE_MULTRES[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  ldr TMP0, [CARG4, #-8]![m
[31m-  |   mov_false TMP1[m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |  str CARG4, L:RA->top		// Remove error from coroutine stack.[m
[31m-  |  str TMP0, [BASE]			// Copy error message.[m
[31m-  |  b <7[m
[31m-  |.else[m
[31m-  |  mov CARG1, L[m
[31m-  |  mov CARG2, L:RA[m
[31m-  |  bl extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |  // Never returns.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  mov CARG1, L[m
[31m-  |  lsr CARG2, RC, #3[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov CRET1, #0[m
[31m-  |  b <4[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  ldr TMP0, L->cframe[m
[31m-  |   add TMP1, BASE, NARGS8:RC[m
[31m-  |    mov CRET1, #LUA_YIELD[m
[31m-  |   stp BASE, TMP1, L->base[m
[31m-  |  tbz TMP0, #0, ->fff_fallback[m
[31m-  |   str xzr, L->cframe[m
[31m-  |    strb CRET1w, L->status[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro math_round, func, round[m
[31m-  |  .ffunc math_ .. func[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  ldr d0, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  cmp TISNUMhi, CARG1, lsr #32[m
[31m-  |  beq ->fff_restv[m
[31m-  |  blo ->fff_fallback[m
[31m-  |  round d0, d0[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor, frintm[m
[31m-  |  math_round ceil, frintp[m
[31m-  |[m
[31m-  |.ffunc_1 math_abs[m
[31m-  |  checknumber CARG1, ->fff_fallback[m
[31m-  |  and CARG1, CARG1, #U64x(7fffffff,ffffffff)[m
[31m-  |  bne ->fff_restv[m
[31m-  |  eor CARG2w, CARG1w, CARG1w, asr #31[m
[31m-  |   movz CARG3, #0x41e0, lsl #48	// 2^31.[m
[31m-  |  subs CARG1w, CARG2w, CARG1w, asr #31[m
[31m-  |   add CARG1, CARG1, TISNUM[m
[31m-  |  csel CARG1, CARG1, CARG3, pl[m
[31m-  |  // Fallthrough.[m
[31m-  |[m
[31m-  |->fff_restv:[m
[31m-  |  // CARG1 = TValue result.[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |  str CARG1, [BASE, #-16][m
[31m-  |->fff_res1:[m
[31m-  |  // PC = return.[m
[31m-  |  mov RC, #(1+1)*8[m
[31m-  |->fff_res:[m
[31m-  |  // RC = (nresults+1)*8, PC = return.[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   str RCw, SAVE_MULTRES[m
[31m-  |   sub RA, BASE, #16[m
[31m-  |  bne ->vm_return[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |  decode_RB RB, INS[m
[31m-  |5:[m
[31m-  |  cmp RC, RB, lsl #3			// More results expected?[m
[31m-  |  blo >6[m
[31m-  |  decode_RA TMP1, INS[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |  sub BASE, RA, TMP1, lsl #3[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  add TMP1, RA, RC[m
[31m-  |   add RC, RC, #8[m
[31m-  |  str TISNIL, [TMP1, #-8][m
[31m-  |  b <5[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc_n math_ .. func[m
[31m-  |  bl extern func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |  bl extern func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_n math_sqrt[m
[31m-  |  fsqrt d0, d0[m
[31m-  |->fff_resn:[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |  str d0, [BASE, #-16][m
[31m-  |  b ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  ldr FARG1, [BASE][m
[31m-  |   bne ->fff_fallback			// Need exactly 1 argument.[m
[31m-  |  checknum CARG1, ->fff_fallback[m
[31m-  |  bl extern log[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.ffunc_2 math_ldexp[m
[31m-  |  ldr FARG1, [BASE][m
[31m-  |  checknum CARG1, ->fff_fallback[m
[31m-  |  checkint CARG2, ->fff_fallback[m
[31m-  |  sxtw CARG1, CARG2w[m
[31m-  |  bl extern ldexp			// (double x, int exp)[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |  add CARG1, sp, TMPDofs[m
[31m-  |  bl extern frexp[m
[31m-  |   ldr CARG2w, TMPD[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |  str d0, [BASE, #-16][m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |   add CARG2, CARG2, TISNUM[m
[31m-  |   str CARG2, [BASE, #-8][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_n math_modf[m
[31m-  |  sub CARG1, BASE, #16[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  bl extern modf[m
[31m-  |   mov RC, #(2+1)*8[m
[31m-  |  str d0, [BASE, #-8][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.macro math_minmax, name, cond, fcond[m
[31m-  |  .ffunc_1 name[m
[31m-  |   add RB, BASE, RC[m
[31m-  |   add RA, BASE, #8[m
[31m-  |  checkint CARG1, >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  ldr CARG2, [RA][m
[31m-  |   cmp RA, RB[m
[31m-  |   bhs ->fff_restv[m
[31m-  |  checkint CARG2, >3[m
[31m-  |  cmp CARG1w, CARG2w[m
[31m-  |   add RA, RA, #8[m
[31m-  |  csel CARG1, CARG2, CARG1, cond[m
[31m-  |  b <1[m
[31m-  |3:  // Convert intermediate result to number and continue below.[m
[31m-  |  scvtf d0, CARG1w[m
[31m-  |  blo ->fff_fallback[m
[31m-  |  ldr d1, [RA][m
[31m-  |  b >6[m
[31m-  |[m
[31m-  |4:[m
[31m-  |  ldr d0, [BASE][m
[31m-  |  blo ->fff_fallback[m
[31m-  |5:  // Handle numbers.[m
[31m-  |  ldr CARG2, [RA][m
[31m-  |  ldr d1, [RA][m
[31m-  |   cmp RA, RB[m
[31m-  |   bhs ->fff_resn[m
[31m-  |  checknum CARG2, >7[m
[31m-  |6:[m
[31m-  |  fcmp d0, d1[m
[31m-  |   add RA, RA, #8[m
[31m-  |  fcsel d0, d1, d0, fcond[m
[31m-  |  b <5[m
[31m-  |7:  // Convert integer to number and continue above.[m
[31m-  |  scvtf d1, CARG2w[m
[31m-  |  blo ->fff_fallback[m
[31m-  |  b <6[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, gt, hi[m
[31m-  |  math_minmax math_max, lt, lo[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  ldp PC, CARG1, [BASE, FRAME_PC][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  asr ITYPE, CARG1, #47[m
[31m-  |  ccmn ITYPE, #-LJ_TSTR, #0, eq[m
[31m-  |   and STR:CARG1, CARG1, #LJ_GCVMASK[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  ldrb TMP0w, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |   ldr CARG3w, STR:CARG1->len[m
[31m-  |  add TMP0, TMP0, TISNUM[m
[31m-  |  str TMP0, [BASE, #-16][m
[31m-  |  mov RC, #(0+1)*8[m
[31m-  |   cbz CARG3, ->fff_res[m
[31m-  |  b ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  ldp PC, CARG1, [BASE, FRAME_PC][m
[31m-  |  cmp CARG1w, #255[m
[31m-  |   ccmp NARGS8:RC, #8, #0, ls		// Need exactly 1 argument.[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  checkint CARG1, ->fff_fallback[m
[31m-  |  mov CARG3, #1[m
[31m-  |  mov CARG2, BASE			// Points to stack. Little-endian.[m
[31m-  |->fff_newstr:[m
[31m-  |  // CARG2 = str, CARG3 = len.[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   movn TMP1, #~LJ_TSTR[m
[31m-  |  add CARG1, CARG1, TMP1, lsl #47[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |    ldr CARG3, [BASE, #16][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |    movn RB, #0[m
[31m-  |   beq >1[m
[31m-  |   blo ->fff_fallback[m
[31m-  |    checkint CARG3, ->fff_fallback[m
[31m-  |    sxtw RB, CARG3w[m
[31m-  |1:[m
[31m-  |  ldr CARG2, [BASE, #8][m
[31m-  |  checkstr CARG1, ->fff_fallback[m
[31m-  |   ldr TMP1w, STR:CARG1->len[m
[31m-  |  checkint CARG2, ->fff_fallback[m
[31m-  |  sxtw CARG2, CARG2w[m
[31m-  |  // CARG1 = str, TMP1 = str->len, CARG2 = start, RB = end[m
[31m-  |   add TMP2, RB, TMP1[m
[31m-  |   cmp RB, #0[m
[31m-  |  add TMP0, CARG2, TMP1[m
[31m-  |   csinc RB, RB, TMP2, ge		// if (end < 0) end += len+1[m
[31m-  |  cmp CARG2, #0[m
[31m-  |  csinc CARG2, CARG2, TMP0, ge	// if (start < 0) start += len+1[m
[31m-  |   cmp RB, #0[m
[31m-  |   csel RB, RB, xzr, ge		// if (end < 0) end = 0[m
[31m-  |  cmp CARG2, #1[m
[31m-  |  csinc CARG2, CARG2, xzr, ge	// if (start < 1) start = 1[m
[31m-  |   cmp RB, TMP1[m
[31m-  |   csel RB, RB, TMP1, le		// if (end > len) end = len[m
[31m-  |  add CARG1, STR:CARG1, #sizeof(GCstr)-1[m
[31m-  |   subs CARG3, RB, CARG2		// len = end - start[m
[31m-  |  add CARG2, CARG1, CARG2[m
[31m-  |   add CARG3, CARG3, #1		// len += 1[m
[31m-  |   bge ->fff_newstr[m
[31m-  |  add STR:CARG1, GL, #offsetof(global_State, strempty)[m
[31m-  |   movn TMP1, #~LJ_TSTR[m
[31m-  |  add CARG1, CARG1, TMP1, lsl #47[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |  ldr CARG2, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  asr ITYPE, CARG2, #47[m
[31m-  |  ccmn ITYPE, #-LJ_TSTR, #0, hs[m
[31m-  |   and STR:CARG2, CARG2, #LJ_GCVMASK[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  ldr TMP0, GL->tmpbuf.b[m
[31m-  |   add SBUF:CARG1, GL, #offsetof(global_State, tmpbuf)[m
[31m-  |   str BASE, L->base[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   str L, GL->tmpbuf.L[m
[31m-  |  str TMP0, GL->tmpbuf.p[m
[31m-  |  bl extern lj_buf_putstr_ .. name[m
[31m-  |  bl extern lj_buf_tostr[m
[31m-  |  b ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP number to bit conversion for soft-float. Clobbers CARG1-CARG3[m
[31m-  |->vm_tobit_fb:[m
[31m-  |  bls ->fff_fallback[m
[31m-  |  add CARG2, CARG1, CARG1[m
[31m-  |  mov CARG3, #1076[m
[31m-  |  sub CARG3, CARG3, CARG2, lsr #53[m
[31m-  |  cmp CARG3, #53[m
[31m-  |  bhi >1[m
[31m-  |  and CARG2, CARG2, #U64x(001fffff,ffffffff)[m
[31m-  |  orr CARG2, CARG2, #U64x(00200000,00000000)[m
[31m-  |   cmp CARG1, #0[m
[31m-  |  lsr CARG2, CARG2, CARG3[m
[31m-  |   cneg CARG1w, CARG2w, mi[m
[31m-  |  br lr[m
[31m-  |1:[m
[31m-  |  mov CARG1w, #0[m
[31m-  |  br lr[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name[m
[31m-  |  .ffunc_1 bit_..name[m
[31m-  |  adr lr, >1[m
[31m-  |  checkint CARG1, ->vm_tobit_fb[m
[31m-  |1:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name[m
[31m-  |  mov RA, #8[m
[31m-  |  mov TMP0w, CARG1w[m
[31m-  |  adr lr, >2[m
[31m-  |1:[m
[31m-  |  ldr CARG1, [BASE, RA][m
[31m-  |   cmp RA, NARGS8:RC[m
[31m-  |    add RA, RA, #8[m
[31m-  |   bge >9[m
[31m-  |  checkint CARG1, ->vm_tobit_fb[m
[31m-  |2:[m
[31m-  |  ins TMP0w, TMP0w, CARG1w[m
[31m-  |  b <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op band, and[m
[31m-  |.ffunc_bit_op bor, orr[m
[31m-  |.ffunc_bit_op bxor, eor[m
[31m-  |[m
[31m-  |.ffunc_bit tobit[m
[31m-  |  mov TMP0w, CARG1w[m
[31m-  |9:  // Label reused by .ffunc_bit_op users.[m
[31m-  |  add CARG1, TMP0, TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc_bit bswap[m
[31m-  |  rev TMP0w, CARG1w[m
[31m-  |  add CARG1, TMP0, TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc_bit bnot[m
[31m-  |  mvn TMP0w, CARG1w[m
[31m-  |  add CARG1, TMP0, TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins, shmod[m
[31m-  |  .ffunc bit_..name[m
[31m-  |  ldp TMP0, CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  adr lr, >1[m
[31m-  |  checkint CARG1, ->vm_tobit_fb[m
[31m-  |1:[m
[31m-  |.if shmod == 0[m
[31m-  |  mov TMP1, CARG1[m
[31m-  |.else[m
[31m-  |  neg TMP1, CARG1[m
[31m-  |.endif[m
[31m-  |  mov CARG1, TMP0[m
[31m-  |  adr lr, >2[m
[31m-  |  checkint CARG1, ->vm_tobit_fb[m
[31m-  |2:[m
[31m-  |  ins TMP0w, CARG1w, TMP1w[m
[31m-  |  add CARG1, TMP0, TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh lshift, lsl, 0[m
[31m-  |.ffunc_bit_sh rshift, lsr, 0[m
[31m-  |.ffunc_bit_sh arshift, asr, 0[m
[31m-  |.ffunc_bit_sh rol, ror, 1[m
[31m-  |.ffunc_bit_sh ror, ror, 0[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |   ldp CFUNC:CARG3, PC, [BASE, FRAME_FUNC]	// Fallback may overwrite PC.[m
[31m-  |  ldr TMP2, L->maxstack[m
[31m-  |  add TMP1, BASE, NARGS8:RC[m
[31m-  |  stp BASE, TMP1, L->base[m
[31m-  |   and CFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  add TMP1, TMP1, #8*LUA_MINSTACK[m
[31m-  |   ldr CARG3, CFUNC:CARG3->f[m
[31m-  |    str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  cmp TMP1, TMP2[m
[31m-  |   mov CARG1, L[m
[31m-  |  bhi >5				// Need to grow stack.[m
[31m-  |   blr CARG3				// (lua_State *L)[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |   ldr BASE, L->base[m
[31m-  |  cmp CRET1w, #0[m
[31m-  |   lsl RC, CRET1, #3[m
[31m-  |   sub RA, BASE, #16[m
[31m-  |  bgt ->fff_res			// Returned nresults+1?[m
[31m-  |1:  // Returned 0 or -1: retry fast path.[m
[31m-  |   ldr CARG1, L->top[m
[31m-  |    ldr CFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   sub NARGS8:RC, CARG1, BASE[m
[31m-  |  bne ->vm_call_tail			// Returned -1?[m
[31m-  |    and CFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  ands TMP0, PC, #FRAME_TYPE[m
[31m-  |   and TMP1, PC, #~FRAME_TYPEP[m
[31m-  |  bne >3[m
[31m-  |  ldrb RAw, [PC, #-3][m
[31m-  |  lsl RA, RA, #3[m
[31m-  |  add TMP1, RA, #16[m
[31m-  |3:[m
[31m-  |  sub RB, BASE, TMP1[m
[31m-  |  b ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  mov CARG2, #LUA_MINSTACK[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  cmp CARG1, CARG1			// Set zero-flag to force retry.[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |   add CARG2, BASE, NARGS8:RC	// Calculate L->top.[m
[31m-  |  mov RA, lr[m
[31m-  |   stp BASE, CARG2, L->base[m
[31m-  |   str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_gc_step		// (lua_State *L)[m
[31m-  |  ldp BASE, CARG2, L->base[m
[31m-  |   ldr CFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |  mov lr, RA				// Help return address predictor.[m
[31m-  |  sub NARGS8:RC, CARG2, BASE		// Calculate nargs*8.[m
[31m-  |   and CFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |  NYI[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  ldrb TMP2w, GL->hookmask[m
[31m-  |  tbz TMP2w, #HOOK_ACTIVE_SHIFT, >1	// Hook already active?[m
[31m-  |5:  // Re-dispatch to static ins.[m
[31m-  |  ldr TMP0, [TMP1, #GG_G2DISP+GG_DISP2STATIC][m
[31m-  |  br TMP0[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  ldrb TMP2w, GL->hookmask[m
[31m-  |   ldr TMP3w, GL->hookcount[m
[31m-  |  tbnz TMP2w, #HOOK_ACTIVE_SHIFT, <5	// Hook already active?[m
[31m-  |  tst TMP2w, #LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beq <5[m
[31m-  |   sub TMP3w, TMP3w, #1[m
[31m-  |   str TMP3w, GL->hookcount[m
[31m-  |   cbz TMP3w, >1[m
[31m-  |  tbz TMP2w, #LUA_HOOKLINE, <5[m
[31m-  |1:[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, PC[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  bl extern lj_dispatch_ins		// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  ldr BASE, L->base[m
[31m-  |4:  // Re-dispatch to static ins.[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |  add TMP1, GL, INS, uxtb #3[m
[31m-  |   decode_RA RA, INS[m
[31m-  |  ldr TMP0, [TMP1, #GG_G2DISP+GG_DISP2STATIC][m
[31m-  |   decode_RD RC, INS[m
[31m-  |  br TMP0[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  ldr CARG1, [CARG4, #-40][m
[31m-  |   add PC, PC, #4[m
[31m-  |  str CARG1w, SAVE_MULTRES		// Restore MULTRES for *M ins.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |  NYI[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mov CARG2, PC[m
[31m-  |.if JIT[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  orr CARG2, PC, #1[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  add TMP1, BASE, NARGS8:RC[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   mov CARG1, L[m
[31m-  |   sub RA, RA, BASE[m
[31m-  |  stp BASE, TMP1, L->base[m
[31m-  |  bl extern lj_dispatch_call		// (lua_State *L, const BCIns *pc)[m
[31m-  |  // Returns ASMFunction.[m
[31m-  |  ldp BASE, TMP1, L->base[m
[31m-  |   str xzr, SAVE_PC			// Invalidate for subsequent line hook.[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |  add RA, BASE, RA[m
[31m-  |  sub NARGS8:RC, TMP1, BASE[m
[31m-  |   ldr INSw, [PC, #-4][m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  br CRET1[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |  NYI[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, PC[m
[31m-  |  bl extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  sub PC, PC, #4[m
[31m-  |  b ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_exit_handler:[m
[31m-  |  NYI[m
[31m-  |->vm_exit_interp:[m
[31m-  |  NYI[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |  // int lj_vm_modi(int dividend, int divisor);[m
[31m-  |->vm_modi:[m
[31m-  |    eor CARG4w, CARG1w, CARG2w[m
[31m-  |    cmp CARG4w, #0[m
[31m-  |  eor CARG3w, CARG1w, CARG1w, asr #31[m
[31m-  |   eor CARG4w, CARG2w, CARG2w, asr #31[m
[31m-  |  sub CARG3w, CARG3w, CARG1w, asr #31[m
[31m-  |   sub CARG4w, CARG4w, CARG2w, asr #31[m
[31m-  |  udiv CARG1w, CARG3w, CARG4w[m
[31m-  |  msub CARG1w, CARG1w, CARG4w, CARG3w[m
[31m-  |    ccmp CARG1w, #0, #4, mi[m
[31m-  |    sub CARG3w, CARG1w, CARG4w[m
[31m-  |    csel CARG1w, CARG1w, CARG3w, eq[m
[31m-  |  eor CARG3w, CARG1w, CARG2w[m
[31m-  |  cmp CARG3w, #0[m
[31m-  |  cneg CARG1w, CARG1w, mi[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions.[m
[31m-  |// Saveregs already performed. Callback slot number in [sp], g in r12.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  saveregs[m
[31m-  |  ldr CTSTATE, GL:x10->ctype_state[m
[31m-  |  mov GL, x10[m
[31m-  |    add x10, sp, # CFRAME_SPACE[m
[31m-  |  str w9, CTSTATE->cb.slot[m
[31m-  |  stp x0, x1, CTSTATE->cb.gpr[0][m
[31m-  |   stp d0, d1, CTSTATE->cb.fpr[0][m
[31m-  |  stp x2, x3, CTSTATE->cb.gpr[2][m
[31m-  |   stp d2, d3, CTSTATE->cb.fpr[2][m
[31m-  |  stp x4, x5, CTSTATE->cb.gpr[4][m
[31m-  |   stp d4, d5, CTSTATE->cb.fpr[4][m
[31m-  |  stp x6, x7, CTSTATE->cb.gpr[6][m
[31m-  |   stp d6, d7, CTSTATE->cb.fpr[6][m
[31m-  |    str x10, CTSTATE->cb.stack[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |   str CTSTATE, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  mov CARG2, sp[m
[31m-  |  bl extern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |  // Returns lua_State *.[m
[31m-  |  ldp BASE, RC, L:CRET1->base[m
[31m-  |   movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48[m
[31m-  |   movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16[m
[31m-  |   movn TISNIL, #0[m
[31m-  |   mov L, CRET1[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |  sub RC, RC, BASE[m
[31m-  |   st_vmstate ST_INTERP[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  ldr CTSTATE, GL->ctype_state[m
[31m-  |   stp BASE, CARG4, L->base[m
[31m-  |  str L, CTSTATE->L[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |  mov CARG2, RA[m
[31m-  |  bl extern lj_ccallback_leave       // (CTState *cts, TValue *o)[m
[31m-  |  ldp x0, x1, CTSTATE->cb.gpr[0][m
[31m-  |   ldp d0, d1, CTSTATE->cb.fpr[0][m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, x19[m
[31m-  |  stp fp, lr, [sp, #-32]![m
[31m-  |  add fp, sp, #0[m
[31m-  |  str CCSTATE, [sp, #16][m
[31m-  |  mov CCSTATE, x0[m
[31m-  |  ldr TMP0w, CCSTATE:x0->spadj[m
[31m-  |   ldrb TMP1w, CCSTATE->nsp[m
[31m-  |    add TMP2, CCSTATE, #offsetof(CCallState, stack)[m
[31m-  |   subs TMP1, TMP1, #1[m
[31m-  |    ldr TMP3, CCSTATE->func[m
[31m-  |  sub sp, fp, TMP0[m
[31m-  |   bmi >2[m
[31m-  |1:  // Copy stack slots[m
[31m-  |  ldr TMP0, [TMP2, TMP1, lsl #3][m
[31m-  |  str TMP0, [sp, TMP1, lsl #3][m
[31m-  |  subs TMP1, TMP1, #1[m
[31m-  |  bpl <1[m
[31m-  |2:[m
[31m-  |  ldp x0, x1, CCSTATE->gpr[0][m
[31m-  |   ldp d0, d1, CCSTATE->fpr[0][m
[31m-  |  ldp x2, x3, CCSTATE->gpr[2][m
[31m-  |   ldp d2, d3, CCSTATE->fpr[2][m
[31m-  |  ldp x4, x5, CCSTATE->gpr[4][m
[31m-  |   ldp d4, d5, CCSTATE->fpr[4][m
[31m-  |  ldp x6, x7, CCSTATE->gpr[6][m
[31m-  |   ldp d6, d7, CCSTATE->fpr[6][m
[31m-  |  ldr x8, CCSTATE->retp[m
[31m-  |  blr TMP3[m
[31m-  |  mov sp, fp[m
[31m-  |  stp x0, x1, CCSTATE->gpr[0][m
[31m-  |   stp d0, d1, CCSTATE->fpr[0][m
[31m-  |   stp d2, d3, CCSTATE->fpr[2][m
[31m-  |  ldr CCSTATE, [sp, #16][m
[31m-  |  ldp fp, lr, [sp], #32[m
[31m-  |  ret[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1, RC = src2, JMP with RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |    ldrh RBw, [PC, #2][m
[31m-    |   ldr CARG2, [BASE, RC, lsl #3][m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |    sub RB, RB, #0x20000[m
[31m-    |  checkint CARG1, >3[m
[31m-    |   checkint CARG2, >4[m
[31m-    |  cmp CARG1w, CARG2w[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  csel PC, RB, PC, lt[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  csel PC, RB, PC, ge[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  csel PC, RB, PC, le[m
[31m-    } else {[m
[31m-      |  csel PC, RB, PC, gt[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // RA not int.[m
[31m-    |    ldr FARG1, [BASE, RA, lsl #3][m
[31m-    |  blo ->vmeta_comp[m
[31m-    |    ldr FARG2, [BASE, RC, lsl #3][m
[31m-    |   cmp TISNUMhi, CARG2, lsr #32[m
[31m-    |   bhi >5[m
[31m-    |   bne ->vmeta_comp[m
[31m-    |  // RA number, RC int.[m
[31m-    |  scvtf FARG2, CARG2w[m
[31m-    |  b >5[m
[31m-    |[m
[31m-    |4:  // RA int, RC not int[m
[31m-    |    ldr FARG2, [BASE, RC, lsl #3][m
[31m-    |   blo ->vmeta_comp[m
[31m-    |  // RA int, RC number.[m
[31m-    |  scvtf FARG1, CARG1w[m
[31m-    |[m
[31m-    |5:  // RA number, RC number[m
[31m-    |  fcmp FARG1, FARG2[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  csel PC, RB, PC, lo[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  csel PC, RB, PC, hs[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  csel PC, RB, PC, ls[m
[31m-    } else {[m
[31m-      |  csel PC, RB, PC, hi[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  // RA = src1, RC = src2, JMP with RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |   add RC, BASE, RC, lsl #3[m
[31m-    |    ldrh RBw, [PC, #2][m
[31m-    |   ldr CARG3, [RC][m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |    sub RB, RB, #0x20000[m
[31m-    |  asr ITYPE, CARG3, #47[m
[31m-    |  cmn ITYPE, #-LJ_TISNUM[m
[31m-    if (vk) {[m
[31m-      |  bls ->BC_ISEQN_Z[m
[31m-    } else {[m
[31m-      |  bls ->BC_ISNEN_Z[m
[31m-    }[m
[31m-    |  // RC is not a number.[m
[31m-    |   asr TMP0, CARG1, #47[m
[31m-    |.if FFI[m
[31m-    |  // Check if RC or RA is a cdata.[m
[31m-    |  cmn ITYPE, #-LJ_TCDATA[m
[31m-    |   ccmn TMP0, #-LJ_TCDATA, #4, ne[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    |  bne >2[m
[31m-    |  // Tag and value are equal.[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQV_Z:[m
[31m-      |  mov PC, RB			// Perform branch.[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if the tags are the same and it's a table or userdata.[m
[31m-    |  cmp ITYPE, TMP0[m
[31m-    |  ccmn ITYPE, #-LJ_TISTABUD, #2, eq[m
[31m-    if (vk) {[m
[31m-      |  bhi <1[m
[31m-    } else {[m
[31m-      |  bhi ->BC_ISEQV_Z		// Reuse code from opposite instruction.[m
[31m-    }[m
[31m-    |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-    |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-    |  and TAB:CARG2, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr TAB:TMP2, TAB:CARG2->metatable[m
[31m-    if (vk) {[m
[31m-      |  cbz TAB:TMP2, <1		// No metatable?[m
[31m-      |  ldrb TMP1w, TAB:TMP2->nomm[m
[31m-      |   mov CARG4, #0			// ne = 0[m
[31m-      |  tbnz TMP1w, #MM_eq, <1		// 'no __eq' flag set: done.[m
[31m-    } else {[m
[31m-      |  cbz TAB:TMP2, ->BC_ISEQV_Z	// No metatable?[m
[31m-      |  ldrb TMP1w, TAB:TMP2->nomm[m
[31m-      |   mov CARG4, #1			// ne = 1.[m
[31m-      |  tbnz TMP1w, #MM_eq, ->BC_ISEQV_Z	// 'no __eq' flag set: done.[m
[31m-    }[m
[31m-    |  b ->vmeta_equal[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  // RA = src, RC = str_const (~), JMP with RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |   mvn RC, RC[m
[31m-    |    ldrh RBw, [PC, #2][m
[31m-    |   ldr CARG2, [KBASE, RC, lsl #3][m
[31m-    |    add PC, PC, #4[m
[31m-    |   movn TMP0, #~LJ_TSTR[m
[31m-    |.if FFI[m
[31m-    |  asr ITYPE, CARG1, #47[m
[31m-    |.endif[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |   add CARG2, CARG2, TMP0, lsl #47[m
[31m-    |    sub RB, RB, #0x20000[m
[31m-    |.if FFI[m
[31m-    |  cmn ITYPE, #-LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  cmp CARG1, CARG2[m
[31m-    if (vk) {[m
[31m-      |  csel PC, RB, PC, eq[m
[31m-    } else {[m
[31m-      |  csel PC, RB, PC, ne[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  // RA = src, RC = num_const (~), JMP with RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |   add RC, KBASE, RC, lsl #3[m
[31m-    |    ldrh RBw, [PC, #2][m
[31m-    |   ldr CARG3, [RC][m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |    sub RB, RB, #0x20000[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:[m
[31m-    }[m
[31m-    |  checkint CARG1, >4[m
[31m-    |   checkint CARG3, >6[m
[31m-    |  cmp CARG1w, CARG3w[m
[31m-    |1:[m
[31m-    if (vk) {[m
[31m-      |  csel PC, RB, PC, eq[m
[31m-      |2:[m
[31m-    } else {[m
[31m-      |2:[m
[31m-      |  csel PC, RB, PC, ne[m
[31m-    }[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // RA not int.[m
[31m-    |.if FFI[m
[31m-    |  blo >7[m
[31m-    |.else[m
[31m-    |  blo <2[m
[31m-    |.endif[m
[31m-    |    ldr FARG1, [BASE, RA, lsl #3][m
[31m-    |    ldr FARG2, [RC][m
[31m-    |   cmp TISNUMhi, CARG3, lsr #32[m
[31m-    |   bne >5[m
[31m-    |  // RA number, RC int.[m
[31m-    |  scvtf FARG2, CARG3w[m
[31m-    |5:[m
[31m-    |  // RA number, RC number.[m
[31m-    |  fcmp FARG1, FARG2[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |6:  // RA int, RC number[m
[31m-    |  ldr FARG2, [RC][m
[31m-    |  scvtf FARG1, CARG1w[m
[31m-    |  fcmp FARG1, FARG2[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |.if FFI[m
[31m-    |7:[m
[31m-    |  asr ITYPE, CARG1, #47[m
[31m-    |  cmn ITYPE, #-LJ_TCDATA[m
[31m-    |  bne <2[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  // RA = src, RC = primitive_type (~), JMP with RC = target[m
[31m-    |  ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |   ldrh RBw, [PC, #2][m
[31m-    |   add PC, PC, #4[m
[31m-    |  add RC, RC, #1[m
[31m-    |   add RB, PC, RB, lsl #2[m
[31m-    |.if FFI[m
[31m-    |  asr ITYPE, TMP0, #47[m
[31m-    |  cmn ITYPE, #-LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |  cmn RC, ITYPE[m
[31m-    |.else[m
[31m-    |  cmn RC, TMP0, asr #47[m
[31m-    |.endif[m
[31m-    |   sub RB, RB, #0x20000[m
[31m-    if (vk) {[m
[31m-      |  csel PC, RB, PC, eq[m
[31m-    } else {[m
[31m-      |  csel PC, RB, PC, ne[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  // RA = dst or unused, RC = src, JMP with RC = target[m
[31m-    |   ldrh RBw, [PC, #2][m
[31m-    |  ldr TMP0, [BASE, RC, lsl #3][m
[31m-    |   add PC, PC, #4[m
[31m-    |  mov_false TMP1[m
[31m-    |   add RB, PC, RB, lsl #2[m
[31m-    |  cmp TMP0, TMP1[m
[31m-    |   sub RB, RB, #0x20000[m
[31m-    if (op == BC_ISTC || op == BC_IST) {[m
[31m-      if (op == BC_ISTC) {[m
[31m-	|  csel RA, RA, RC, lo[m
[31m-      }[m
[31m-      |  csel PC, RB, PC, lo[m
[31m-    } else {[m
[31m-      if (op == BC_ISFC) {[m
[31m-	|  csel RA, RA, RC, hs[m
[31m-      }[m
[31m-      |  csel PC, RB, PC, hs[m
[31m-    }[m
[31m-    if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-      |  str TMP0, [BASE, RA, lsl #3][m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  // RA = src, RC = -type[m
[31m-    |  ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |  cmn RC, TMP0, asr #47[m
[31m-    |  bne ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  // RA = src, RC = -(TISNUM-1)[m
[31m-    |  ldr TMP0, [BASE, RA][m
[31m-    |  checknum TMP0, ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  // RA = dst, RC = src[m
[31m-    |  ldr TMP0, [BASE, RC, lsl #3][m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  // RA = dst, RC = src[m
[31m-    |  ldr TMP0, [BASE, RC, lsl #3][m
[31m-    |   mov_false TMP1[m
[31m-    |   mov_true TMP2[m
[31m-    |  cmp TMP0, TMP1[m
[31m-    |  csel TMP0, TMP1, TMP2, lo[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  // RA = dst, RC = src[m
[31m-    |  ldr TMP0, [BASE, RC, lsl #3][m
[31m-    |  asr ITYPE, TMP0, #47[m
[31m-    |  cmn ITYPE, #-LJ_TISNUM[m
[31m-    |  bhi ->vmeta_unm[m
[31m-    |  eor TMP0, TMP0, #U64x(80000000,00000000)[m
[31m-    |  bne >5[m
[31m-    |  negs TMP0w, TMP0w[m
[31m-    |   movz CARG3, #0x41e0, lsl #48	// 2^31.[m
[31m-    |   add TMP0, TMP0, TISNUM[m
[31m-    |  csel TMP0, TMP0, CARG3, vc[m
[31m-    |5:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  // RA = dst, RC = src[m
[31m-    |  ldr CARG1, [BASE, RC, lsl #3][m
[31m-    |  asr ITYPE, CARG1, #47[m
[31m-    |  cmn ITYPE, #-LJ_TSTR[m
[31m-    |   and CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  bne >2[m
[31m-    |  ldr CARG1w, STR:CARG1->len[m
[31m-    |1:[m
[31m-    |  add CARG1, CARG1, TISNUM[m
[31m-    |  str CARG1, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:[m
[31m-    |  cmn ITYPE, #-LJ_TTAB[m
[31m-    |  bne ->vmeta_len[m
[31m-#if LJ_52[m
[31m-    |  ldr TAB:CARG2, TAB:CARG1->metatable[m
[31m-    |  cbnz TAB:CARG2, >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  bl extern lj_tab_len		// (GCtab *t)[m
[31m-    |  // Returns uint32_t (but less than 2^31).[m
[31m-    |  b <1[m
[31m-    |[m
[31m-#if LJ_52[m
[31m-    |9:[m
[31m-    |  ldrb TMP1w, TAB:CARG2->nomm[m
[31m-    |  tbnz TMP1w, #MM_len, <3		// 'no __len' flag set: done.[m
[31m-    |  b ->vmeta_len[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithcheck_int, target[m
[31m-    |  checkint CARG1, target[m
[31m-    |  checkint CARG2, target[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithcheck_num, target[m
[31m-    |  checknum CARG1, target[m
[31m-    |  checknum CARG2, target[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithcheck_nzdiv, target[m
[31m-    |  cbz CARG2w, target[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithhead[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||if (vk == 1) {[m
[31m-    |   and RC, RC, #255[m
[31m-    |    decode_RB RB, INS[m
[31m-    ||} else {[m
[31m-    |   decode_RB RB, INS[m
[31m-    |    and RC, RC, #255[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithload, reg1, reg2[m
[31m-    |  // RA = dst, RB = src1, RC = src2 | num_const[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   ldr reg1, [BASE, RB, lsl #3][m
[31m-    |    ldr reg2, [KBASE, RC, lsl #3][m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   ldr reg1, [KBASE, RC, lsl #3][m
[31m-    |    ldr reg2, [BASE, RB, lsl #3][m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   ldr reg1, [BASE, RB, lsl #3][m
[31m-    |    ldr reg2, [BASE, RC, lsl #3][m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfallback, ins[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   ins ->vmeta_arith_vn[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   ins ->vmeta_arith_nv[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   ins ->vmeta_arith_vv[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithmod, res, reg1, reg2[m
[31m-    |  fdiv d2, reg1, reg2[m
[31m-    |  frintm d2, d2[m
[31m-    |  fmsub res, d2, reg2, reg1[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins, fpins[m
[31m-    |  ins_arithhead[m
[31m-    |  ins_arithload CARG1, CARG2[m
[31m-    |  ins_arithcheck_int >5[m
[31m-    |.if "intins" == "smull"[m
[31m-    |  smull CARG1, CARG1w, CARG2w[m
[31m-    |  cmp CARG1, CARG1, sxtw[m
[31m-    |   mov CARG1w, CARG1w[m
[31m-    |  ins_arithfallback bne[m
[31m-    |.elif "intins" == "ins_arithmodi"[m
[31m-    |  ins_arithfallback ins_arithcheck_nzdiv[m
[31m-    |  bl ->vm_modi[m
[31m-    |.else[m
[31m-    |  intins CARG1w, CARG1w, CARG2w[m
[31m-    |  ins_arithfallback bvs[m
[31m-    |.endif[m
[31m-    |  add CARG1, CARG1, TISNUM[m
[31m-    |  str CARG1, [BASE, RA, lsl #3][m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // FP variant.[m
[31m-    |  ins_arithload FARG1, FARG2[m
[31m-    |  ins_arithfallback ins_arithcheck_num[m
[31m-    |  fpins FARG1, FARG1, FARG2[m
[31m-    |  str FARG1, [BASE, RA, lsl #3][m
[31m-    |  b <4[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfp, fpins[m
[31m-    |  ins_arithhead[m
[31m-    |  ins_arithload CARG1, CARG2[m
[31m-    |  ins_arithload FARG1, FARG2[m
[31m-    |  ins_arithfallback ins_arithcheck_num[m
[31m-    |.if "fpins" == "fpow"[m
[31m-    |  bl extern pow[m
[31m-    |.else[m
[31m-    |  fpins FARG1, FARG1, FARG2[m
[31m-    |.endif[m
[31m-    |  str FARG1, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arithdn adds, fadd[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arithdn subs, fsub[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arithdn smull, fmul[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arithfp fdiv[m
[31m-    break;[m
[31m-  case BC_MODVN: case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithdn ins_arithmodi, ins_arithmod[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  // NYI: (partial) integer arithmetic.[m
[31m-    |  ins_arithfp fpow[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = src_start, RC = src_end[m
[31m-    |   str BASE, L->base[m
[31m-    |  sub CARG3, RC, RB[m
[31m-    |  add CARG2, BASE, RC, lsl #3[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  // RA = dst, CARG2 = top-1, CARG3 = left[m
[31m-    |  mov CARG1, L[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  bl extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-    |  ldrb RBw, [PC, #-1][m
[31m-    |   ldr BASE, L->base[m
[31m-    |   cbnz CRET1, ->vmeta_binop[m
[31m-    |  ldr TMP0, [BASE, RB, lsl #3][m
[31m-    |  str TMP0, [BASE, RA, lsl #3]	// Copy result to RA.[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  // RA = dst, RC = str_const (~)[m
[31m-    |  mvn RC, RC[m
[31m-    |  ldr TMP0, [KBASE, RC, lsl #3][m
[31m-    |   movn TMP1, #~LJ_TSTR[m
[31m-    |  add TMP0, TMP0, TMP1, lsl #47[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  // RA = dst, RC = cdata_const (~)[m
[31m-    |  mvn RC, RC[m
[31m-    |  ldr TMP0, [KBASE, RC, lsl #3][m
[31m-    |   movn TMP1, #~LJ_TCDATA[m
[31m-    |  add TMP0, TMP0, TMP1, lsl #47[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  // RA = dst, RC = int16_literal[m
[31m-    |  sxth RCw, RCw[m
[31m-    |  add TMP0, RC, TISNUM[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  // RA = dst, RC = num_const[m
[31m-    |  ldr TMP0, [KBASE, RC, lsl #3][m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  // RA = dst, RC = primitive_type (~)[m
[31m-    |  mvn TMP0, RC, lsl #47[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  // RA = base, RC = end[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |   add RC, BASE, RC, lsl #3[m
[31m-    |  str TISNIL, [RA], #8[m
[31m-    |1:[m
[31m-    |   cmp RA, RC[m
[31m-    |  str TISNIL, [RA], #8[m
[31m-    |   blt <1[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  // RA = dst, RC = uvnum[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RC, RC, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RC, lsl #3][m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |  ldr TMP0, [CARG2][m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-    |  // RA = uvnum, RC = src[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG1, [LFUNC:CARG2, RA, lsl #3][m
[31m-    |   ldr CARG3, [BASE, RC, lsl #3][m
[31m-    |    ldr CARG2, UPVAL:CARG1->v[m
[31m-    |  ldrb TMP2w, UPVAL:CARG1->marked[m
[31m-    |  ldrb TMP0w, UPVAL:CARG1->closed[m
[31m-    |    asr ITYPE, CARG3, #47[m
[31m-    |   str CARG3, [CARG2][m
[31m-    |    add ITYPE, ITYPE, #-LJ_TISGCV[m
[31m-    |  tst TMP2w, #LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  ccmp TMP0w, #0, #4, ne		// && uv->closed[m
[31m-    |    ccmn ITYPE, #-(LJ_TNUMX - LJ_TISGCV), #0, ne	// && tvisgcv(v)[m
[31m-    |  bhi >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if new value is white.[m
[31m-    |  and GCOBJ:CARG3, CARG3, #LJ_GCVMASK[m
[31m-    |  ldrb TMP1w, GCOBJ:CARG3->gch.marked[m
[31m-    |  tst TMP1w, #LJ_GC_WHITES		// iswhite(str)[m
[31m-    |  beq <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  mov CARG1, GL[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETS:[m
[31m-    |  // RA = uvnum, RC = str_const (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |    mvn RC, RC[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG1, [LFUNC:CARG2, RA, lsl #3][m
[31m-    |   ldr STR:CARG3, [KBASE, RC, lsl #3][m
[31m-    |   movn TMP0, #~LJ_TSTR[m
[31m-    |    ldr CARG2, UPVAL:CARG1->v[m
[31m-    |  ldrb TMP2w, UPVAL:CARG1->marked[m
[31m-    |   add TMP0, STR:CARG3, TMP0, lsl #47[m
[31m-    |    ldrb TMP1w, STR:CARG3->marked[m
[31m-    |   str TMP0, [CARG2][m
[31m-    |  tbnz TMP2w, #2, >2		// isblack(uv)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  ldrb TMP0w, UPVAL:CARG1->closed[m
[31m-    |    tst TMP1w, #LJ_GC_WHITES	// iswhite(str)[m
[31m-    |  ccmp TMP0w, #0, #0, ne[m
[31m-    |  beq <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  mov CARG1, GL[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  // RA = uvnum, RC = num_const[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA, lsl #3][m
[31m-    |   ldr TMP0, [KBASE, RC, lsl #3][m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |   str TMP0, [CARG2][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  // RA = uvnum, RC = primitive_type (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA, lsl #3][m
[31m-    |   mvn TMP0, RC, lsl #47[m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |   str TMP0, [CARG2][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_UCLO:[m
[31m-    |  // RA = level, RC = target[m
[31m-    |  ldr CARG3, L->openupval[m
[31m-    |   add RC, PC, RC, lsl #2[m
[31m-    |    str BASE, L->base[m
[31m-    |   sub PC, RC, #0x20000[m
[31m-    |  cbz CARG3, >1[m
[31m-    |  mov CARG1, L[m
[31m-    |  add CARG2, BASE, RA, lsl #3[m
[31m-    |  bl extern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |  ldr BASE, L->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  // RA = dst, RC = proto_const (~) (holding function prototype)[m
[31m-    |  mvn RC, RC[m
[31m-    |   str BASE, L->base[m
[31m-    |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-    |    str PC, SAVE_PC[m
[31m-    |   ldr CARG2, [KBASE, RC, lsl #3][m
[31m-    |    mov CARG1, L[m
[31m-    |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  bl extern lj_func_newL_gc[m
[31m-    |  // Returns GCfuncL *.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |   movn TMP0, #~LJ_TFUNC[m
[31m-    |   add CRET1, CRET1, TMP0, lsl #47[m
[31m-    |  str CRET1, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-  case BC_TDUP:[m
[31m-    |  // RA = dst, RC = (hbits|asize) | tab_const (~)[m
[31m-    |  ldp CARG3, CARG4, GL->gc.total	// Assumes threshold follows total.[m
[31m-    |   str BASE, L->base[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |   mov CARG1, L[m
[31m-    |  cmp CARG3, CARG4[m
[31m-    |  bhs >5[m
[31m-    |1:[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |  and CARG2, RC, #0x7ff[m
[31m-      |   lsr CARG3, RC, #11[m
[31m-      |  cmp CARG2, #0x7ff[m
[31m-      |  mov TMP0, #0x801[m
[31m-      |  csel CARG2, CARG2, TMP0, ne[m
[31m-      |  bl extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-      |  // Returns GCtab *.[m
[31m-    } else {[m
[31m-      |  mvn RC, RC[m
[31m-      |  ldr CARG2, [KBASE, RC, lsl #3][m
[31m-      |  bl extern lj_tab_dup  // (lua_State *L, Table *kt)[m
[31m-      |  // Returns GCtab *.[m
[31m-    }[m
[31m-    |  ldr BASE, L->base[m
[31m-    |   movk CRET1, #(LJ_TTAB>>1)&0xffff, lsl #48[m
[31m-    |  str CRET1, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  bl extern lj_gc_step_fixtop  // (lua_State *L)[m
[31m-    |  mov CARG1, L[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  // RA = dst, RC = str_const (~)[m
[31m-  case BC_GSET:[m
[31m-    |  // RA = dst, RC = str_const (~)[m
[31m-    |  ldr LFUNC:CARG1, [BASE, FRAME_FUNC][m
[31m-    |   mvn RC, RC[m
[31m-    |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr TAB:CARG2, LFUNC:CARG1->env[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #3][m
[31m-    if (op == BC_GGET) {[m
[31m-      |  b ->BC_TGETS_Z[m
[31m-    } else {[m
[31m-      |  b ->BC_TSETS_Z[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = key[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   ldr TMP1, [BASE, RC, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tgetv[m
[31m-    |  checkint TMP1, >9		// Integer key?[m
[31m-    |  ldr CARG3, TAB:CARG2->array[m
[31m-    |   ldr CARG1w, TAB:CARG2->asize[m
[31m-    |  add CARG3, CARG3, TMP1, uxtw #3[m
[31m-    |   cmp TMP1w, CARG1w		// In array part?[m
[31m-    |   bhs ->vmeta_tgetv[m
[31m-    |  ldr TMP0, [CARG3][m
[31m-    |  cmp TMP0, TISNIL[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <1		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_index, <1	// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    |[m
[31m-    |9:[m
[31m-    |  asr ITYPE, TMP1, #47[m
[31m-    |  cmn ITYPE, #-LJ_TSTR		// String key?[m
[31m-    |  bne ->vmeta_tgetv[m
[31m-    |   and STR:RC, TMP1, #LJ_GCVMASK[m
[31m-    |  b ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = str_const (~)[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   mvn RC, RC[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tgets1[m
[31m-    |->BC_TGETS_Z:[m
[31m-    |  // TAB:CARG2 = GCtab *, STR:RC = GCstr *, RA = dst[m
[31m-    |  ldr TMP1w, TAB:CARG2->hmask[m
[31m-    |   ldr TMP2w, STR:RC->hash[m
[31m-    |    ldr NODE:CARG3, TAB:CARG2->node[m
[31m-    |  and TMP1w, TMP1w, TMP2w		// idx = str->hash & tab->hmask[m
[31m-    |  add TMP1, TMP1, TMP1, lsl #1[m
[31m-    |  movn CARG4, #~LJ_TSTR[m
[31m-    |    add NODE:CARG3, NODE:CARG3, TMP1, lsl #3  // node = tab->node + idx*3*8[m
[31m-    |  add CARG4, STR:RC, CARG4, lsl #47	// Tagged key to look for.[m
[31m-    |1:[m
[31m-    |  ldp TMP0, CARG1, NODE:CARG3->val[m
[31m-    |   ldr NODE:CARG3, NODE:CARG3->next[m
[31m-    |  cmp CARG1, CARG4[m
[31m-    |  bne >4[m
[31m-    |  cmp TMP0, TISNIL[m
[31m-    |  beq >5[m
[31m-    |3:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  cbnz NODE:CARG3, <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |   mov TMP0, TISNIL[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <3		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_index, <3	// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgets[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = index[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tgetb[m
[31m-    |  ldr CARG3, TAB:CARG2->array[m
[31m-    |   ldr CARG1w, TAB:CARG2->asize[m
[31m-    |  add CARG3, CARG3, RC, lsl #3[m
[31m-    |   cmp RCw, CARG1w			// In array part?[m
[31m-    |   bhs ->vmeta_tgetb[m
[31m-    |  ldr TMP0, [CARG3][m
[31m-    |  cmp TMP0, TISNIL[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <1		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_index, <1	// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetb[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = key[m
[31m-    |  ldr CARG1, [BASE, RB, lsl #3][m
[31m-    |   ldr TMP1, [BASE, RC, lsl #3][m
[31m-    |  and TAB:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr CARG3, TAB:CARG1->array[m
[31m-    |   ldr TMP2w, TAB:CARG1->asize[m
[31m-    |  add CARG3, CARG3, TMP1w, uxtw #3[m
[31m-    |   cmp TMP1w, TMP2w		// In array part?[m
[31m-    |   bhs ->vmeta_tgetr[m
[31m-    |  ldr TMP0, [CARG3][m
[31m-    |->BC_TGETR_Z:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src, RB = table, RC = key[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   ldr TMP1, [BASE, RC, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tsetv[m
[31m-    |  checkint TMP1, >9		// Integer key?[m
[31m-    |  ldr CARG3, TAB:CARG2->array[m
[31m-    |   ldr CARG1w, TAB:CARG2->asize[m
[31m-    |  add CARG3, CARG3, TMP1, uxtw #3[m
[31m-    |   cmp TMP1w, CARG1w		// In array part?[m
[31m-    |   bhs ->vmeta_tsetv[m
[31m-    |  ldr TMP1, [CARG3][m
[31m-    |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |  cmp TMP1, TISNIL			// Previous value is nil?[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |   str TMP0, [CARG3][m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |2:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <1		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_newindex, <1	// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP1[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |9:[m
[31m-    |  asr ITYPE, TMP1, #47[m
[31m-    |  cmn ITYPE, #-LJ_TSTR		// String key?[m
[31m-    |  bne ->vmeta_tsetv[m
[31m-    |   and STR:RC, TMP1, #LJ_GCVMASK[m
[31m-    |  b ->BC_TSETS_Z[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = str_const (~)[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   mvn RC, RC[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tsets1[m
[31m-    |->BC_TSETS_Z:[m
[31m-    |  // TAB:CARG2 = GCtab *, STR:RC = GCstr *, RA = src[m
[31m-    |  ldr TMP1w, TAB:CARG2->hmask[m
[31m-    |   ldr TMP2w, STR:RC->hash[m
[31m-    |    ldr NODE:CARG3, TAB:CARG2->node[m
[31m-    |  and TMP1w, TMP1w, TMP2w		// idx = str->hash & tab->hmask[m
[31m-    |  add TMP1, TMP1, TMP1, lsl #1[m
[31m-    |  movn CARG4, #~LJ_TSTR[m
[31m-    |    add NODE:CARG3, NODE:CARG3, TMP1, lsl #3  // node = tab->node + idx*3*8[m
[31m-    |  add CARG4, STR:RC, CARG4, lsl #47	// Tagged key to look for.[m
[31m-    |   strb wzr, TAB:CARG2->nomm	// Clear metamethod cache.[m
[31m-    |1:[m
[31m-    |  ldp TMP1, CARG1, NODE:CARG3->val[m
[31m-    |   ldr NODE:TMP3, NODE:CARG3->next[m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |  cmp CARG1, CARG4[m
[31m-    |  bne >5[m
[31m-    |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |  cmp TMP1, TISNIL			// Previous value is nil?[m
[31m-    |  beq >4[m
[31m-    |2:[m
[31m-    |   str TMP0, NODE:CARG3->val[m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <2		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_newindex, <2	// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsets[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  mov NODE:CARG3, NODE:TMP3[m
[31m-    |  cbnz NODE:TMP3, <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, >6		// No metatable: continue.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  // 'no __newindex' flag NOT set: check.[m
[31m-    |  tbz TMP1w, #MM_newindex, ->vmeta_tsets[m
[31m-    |6:[m
[31m-    |  movn TMP1, #~LJ_TSTR[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  add TMP0, STR:RC, TMP1, lsl #47[m
[31m-    |   str BASE, L->base[m
[31m-    |   mov CARG1, L[m
[31m-    |  str TMP0, TMPD[m
[31m-    |   add CARG3, sp, TMPDofs[m
[31m-    |  bl extern lj_tab_newkey		// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Returns TValue *.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |  str TMP0, [CRET1][m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP1[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src, RB = table, RC = index[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tsetb[m
[31m-    |  ldr CARG3, TAB:CARG2->array[m
[31m-    |   ldr CARG1w, TAB:CARG2->asize[m
[31m-    |  add CARG3, CARG3, RC, lsl #3[m
[31m-    |   cmp RCw, CARG1w			// In array part?[m
[31m-    |   bhs ->vmeta_tsetb[m
[31m-    |  ldr TMP1, [CARG3][m
[31m-    |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |  cmp TMP1, TISNIL			// Previous value is nil?[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |   str TMP0, [CARG3][m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |2:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <1		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_newindex, <1	// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsetb[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP1[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src, RB = table, RC = key[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   ldr TMP1, [BASE, RC, lsl #3][m
[31m-    |  and TAB:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr CARG1, TAB:CARG2->array[m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |   ldr CARG4w, TAB:CARG2->asize[m
[31m-    |  add CARG1, CARG1, TMP1, uxtw #3[m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |2:[m
[31m-    |   cmp TMP1w, CARG4w		// In array part?[m
[31m-    |   bhs ->vmeta_tsetr[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |   str TMP0, [CARG1][m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP0[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  // RA = base (table at base-1), RC = num_const (start index)[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |1:[m
[31m-    |   ldr RBw, SAVE_MULTRES[m
[31m-    |  ldr TAB:CARG2, [RA, #-8]		// Guaranteed to be a table.[m
[31m-    |   ldr TMP1, [KBASE, RC, lsl #3]	// Integer constant is in lo-word.[m
[31m-    |    sub RB, RB, #8[m
[31m-    |    cbz RB, >4			// Nothing to copy?[m
[31m-    |  and TAB:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr CARG1w, TAB:CARG2->asize[m
[31m-    |   add CARG3w, TMP1w, RBw, lsr #3[m
[31m-    |   ldr CARG4, TAB:CARG2->array[m
[31m-    |  cmp CARG3, CARG1[m
[31m-    |    add RB, RA, RB[m
[31m-    |  bhi >5[m
[31m-    |   add TMP1, CARG4, TMP1w, uxtw #3[m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |   ldr TMP0, [RA], #8[m
[31m-    |   str TMP0, [TMP1], #8[m
[31m-    |  cmp RA, RB[m
[31m-    |  blo <3[m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |   str BASE, L->base[m
[31m-    |  mov CARG1, L[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  bl extern lj_tab_reasize		// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  // Must not reallocate the stack.[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP1[m
[31m-    |  b <4[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALLM:[m
[31m-    |  // RA = base, (RB = nresults+1,) RC = extra_nargs[m
[31m-    |  ldr TMP0w, SAVE_MULTRES[m
[31m-    |  decode_RC8RD NARGS8:RC, RC[m
[31m-    |  add NARGS8:RC, NARGS8:RC, TMP0[m
[31m-    |  b ->BC_CALL_Z[m
[31m-    break;[m
[31m-  case BC_CALL:[m
[31m-    |  decode_RC8RD NARGS8:RC, RC[m
[31m-    |  // RA = base, (RB = nresults+1,) RC = (nargs+1)*8[m
[31m-    |->BC_CALL_Z:[m
[31m-    |  mov RB, BASE			// Save old BASE for vmeta_call.[m
[31m-    |  add BASE, BASE, RA, lsl #3[m
[31m-    |  ldr CARG3, [BASE][m
[31m-    |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-    |   add BASE, BASE, #16[m
[31m-    |  checkfunc CARG3, ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  // RA = base, (RB = 0,) RC = extra_nargs[m
[31m-    |  ldr TMP0w, SAVE_MULTRES[m
[31m-    |  add NARGS8:RC, TMP0, RC, lsl #3[m
[31m-    |  b ->BC_CALLT1_Z[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  lsl NARGS8:RC, RC, #3[m
[31m-    |  // RA = base, (RB = 0,) RC = (nargs+1)*8[m
[31m-    |->BC_CALLT1_Z:[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldr TMP1, [RA][m
[31m-    |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-    |   add RA, RA, #16[m
[31m-    |  checktp CARG3, TMP1, LJ_TFUNC, ->vmeta_callt[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |->BC_CALLT2_Z:[m
[31m-    |   mov RB, #0[m
[31m-    |   ldrb TMP2w, LFUNC:CARG3->ffid[m
[31m-    |  tst PC, #FRAME_TYPE[m
[31m-    |  bne >7[m
[31m-    |1:[m
[31m-    |  str TMP1, [BASE, FRAME_FUNC]	// Copy function down, but keep PC.[m
[31m-    |  cbz NARGS8:RC, >3[m
[31m-    |2:[m
[31m-    |  ldr TMP0, [RA, RB][m
[31m-    |   add TMP1, RB, #8[m
[31m-    |   cmp TMP1, NARGS8:RC[m
[31m-    |  str TMP0, [BASE, RB][m
[31m-    |    mov RB, TMP1[m
[31m-    |   bne <2[m
[31m-    |3:[m
[31m-    |  cmp TMP2, #1			// (> FF_C) Calling a fast function?[m
[31m-    |  bhi >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function with a Lua frame below.[m
[31m-    |  ldrb RAw, [PC, #-3][m
[31m-    |  sub CARG1, BASE, RA, lsl #3[m
[31m-    |  ldr LFUNC:CARG1, [CARG1, #-32][m
[31m-    |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr CARG1, LFUNC:CARG1->pc[m
[31m-    |  ldr KBASE, [CARG1, #PC2PROTO(k)][m
[31m-    |  b <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  eor PC, PC, #FRAME_VARG[m
[31m-    |  tst PC, #FRAME_TYPEP		// Vararg frame below?[m
[31m-    |  csel TMP2, RB, TMP2, ne		// Clear ffid if no Lua function below.[m
[31m-    |  bne <1[m
[31m-    |  sub BASE, BASE, PC[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |  tst PC, #FRAME_TYPE[m
[31m-    |  csel TMP2, RB, TMP2, ne		// Clear ffid if no Lua function below.[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  // RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldr CARG3, [RA, #-24][m
[31m-    |    mov RB, BASE			// Save old BASE for vmeta_call.[m
[31m-    |   ldp CARG1, CARG2, [RA, #-16][m
[31m-    |    add BASE, RA, #16[m
[31m-    |    mov NARGS8:RC, #16		// Iterators get 2 arguments.[m
[31m-    |  str CARG3, [RA]			// Copy callable.[m
[31m-    |   stp CARG1, CARG2, [RA, #16]	// Copy state and control var.[m
[31m-    |  checkfunc CARG3, ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  // RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldr TAB:RB, [RA, #-16][m
[31m-    |    ldrh TMP3w, [PC, #2][m
[31m-    |  ldr CARG1w, [RA, #-8]		// Get index from control var.[m
[31m-    |    add PC, PC, #4[m
[31m-    |    add TMP3, PC, TMP3, lsl #2[m
[31m-    |  and TAB:RB, RB, #LJ_GCVMASK[m
[31m-    |    sub TMP3, TMP3, #0x20000[m
[31m-    |  ldr TMP1w, TAB:RB->asize[m
[31m-    |   ldr CARG2, TAB:RB->array[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  subs RC, CARG1, TMP1[m
[31m-    |   add CARG3, CARG2, CARG1, lsl #3[m
[31m-    |  bhs >5				// Index points after array part?[m
[31m-    |   ldr TMP0, [CARG3][m
[31m-    |   cmp TMP0, TISNIL[m
[31m-    |   cinc CARG1, CARG1, eq		// Skip holes in array part.[m
[31m-    |   beq <1[m
[31m-    |   add CARG1, CARG1, TISNUM[m
[31m-    |   stp CARG1, TMP0, [RA][m
[31m-    |    add CARG1, CARG1, #1[m
[31m-    |3:[m
[31m-    |    str CARG1w, [RA, #-8]		// Update control var.[m
[31m-    |  mov PC, TMP3[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  ldr TMP2w, TAB:RB->hmask[m
[31m-    |   ldr NODE:RB, TAB:RB->node[m
[31m-    |6:[m
[31m-    |   add CARG1, RC, RC, lsl #1[m
[31m-    |  cmp RC, TMP2			// End of iteration? Branch to ITERN+1.[m
[31m-    |   add NODE:CARG3, NODE:RB, CARG1, lsl #3  // node = tab->node + idx*3*8[m
[31m-    |  bhi <4[m
[31m-    |  ldp TMP0, CARG1, NODE:CARG3->val[m
[31m-    |  cmp TMP0, TISNIL[m
[31m-    |   add RC, RC, #1[m
[31m-    |  beq <6				// Skip holes in hash part.[m
[31m-    |  stp CARG1, TMP0, [RA][m
[31m-    |  add CARG1, RC, TMP1[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  // RA = base, RC = target (points to ITERN)[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldr CFUNC:CARG1, [RA, #-24][m
[31m-    |     add RC, PC, RC, lsl #2[m
[31m-    |   ldp TAB:CARG3, CARG4, [RA, #-16][m
[31m-    |     sub RC, RC, #0x20000[m
[31m-    |  checkfunc CFUNC:CARG1, >5[m
[31m-    |   asr TMP0, TAB:CARG3, #47[m
[31m-    |  ldrb TMP1w, CFUNC:CARG1->ffid[m
[31m-    |   cmn TMP0, #-LJ_TTAB[m
[31m-    |   ccmp CARG4, TISNIL, #0, eq[m
[31m-    |  ccmp TMP1w, #FF_next_N, #0, eq[m
[31m-    |  bne >5[m
[31m-    |  mov TMP0w, #0xfffe7fff[m
[31m-    |  lsl TMP0, TMP0, #32[m
[31m-    |  str TMP0, [RA, #-8]		// Initialize control var.[m
[31m-    |1:[m
[31m-    |     mov PC, RC[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  mov TMP0, #BC_JMP[m
[31m-    |   mov TMP1, #BC_ITERC[m
[31m-    |  strb TMP0w, [PC, #-4][m
[31m-    |   strb TMP1w, [RC][m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = base, RB = (nresults+1), RC = numparams[m
[31m-    |  ldr TMP1, [BASE, FRAME_PC][m
[31m-    |  add RC, BASE, RC, lsl #3[m
[31m-    |   add RA, BASE, RA, lsl #3[m
[31m-    |  add RC, RC, #FRAME_VARG[m
[31m-    |   add TMP2, RA, RB, lsl #3[m
[31m-    |  sub RC, RC, TMP1			// RC = vbase[m
[31m-    |  // Note: RC may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |   sub TMP3, BASE, #16		// TMP3 = vtop[m
[31m-    |  cbz RB, >5[m
[31m-    |   sub TMP2, TMP2, #16[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  cmp RC, TMP3[m
[31m-    |  ldr TMP0, [RC], #8[m
[31m-    |  csel TMP0, TMP0, TISNIL, lo[m
[31m-    |   cmp RA, TMP2[m
[31m-    |  str TMP0, [RA], #8[m
[31m-    |   blo <1[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  ldr TMP0, L->maxstack[m
[31m-    |   subs TMP2, TMP3, RC[m
[31m-    |   csel RB, xzr, TMP2, le		// MULTRES = (max(vtop-vbase,0)+1)*8[m
[31m-    |   add RB, RB, #8[m
[31m-    |  add TMP1, RA, TMP2[m
[31m-    |   str RBw, SAVE_MULTRES[m
[31m-    |   ble <2				// Nothing to copy.[m
[31m-    |  cmp TMP1, TMP0[m
[31m-    |  bhi >7[m
[31m-    |6:[m
[31m-    |  ldr TMP0, [RC], #8[m
[31m-    |  str TMP0, [RA], #8[m
[31m-    |  cmp RC, TMP3[m
[31m-    |  blo <6[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  lsr CARG2, TMP2, #3[m
[31m-    |   stp BASE, RA, L->base[m
[31m-    |  mov CARG1, L[m
[31m-    |  sub RC, RC, BASE			// Need delta, because BASE may change.[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |  ldp BASE, RA, L->base[m
[31m-    |  add RC, BASE, RC[m
[31m-    |  sub TMP3, BASE, #16[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  // RA = results, RC = extra results[m
[31m-    |  ldr TMP0w, SAVE_MULTRES[m
[31m-    |   ldr PC, [BASE, FRAME_PC][m
[31m-    |    add RA, BASE, RA, lsl #3[m
[31m-    |  add RC, TMP0, RC, lsl #3[m
[31m-    |  b ->BC_RETM_Z[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET:[m
[31m-    |  // RA = results, RC = nresults+1[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   lsl RC, RC, #3[m
[31m-    |    add RA, BASE, RA, lsl #3[m
[31m-    |->BC_RETM_Z:[m
[31m-    |   str RCw, SAVE_MULTRES[m
[31m-    |1:[m
[31m-    |  ands CARG1, PC, #FRAME_TYPE[m
[31m-    |   eor CARG2, PC, #FRAME_VARG[m
[31m-    |  bne ->BC_RETV2_Z[m
[31m-    |[m
[31m-    |->BC_RET_Z:[m
[31m-    |  // BASE = base, RA = resultptr, RC = (nresults+1)*8, PC = return[m
[31m-    |  ldr INSw, [PC, #-4][m
[31m-    |  subs TMP1, RC, #8[m
[31m-    |   sub CARG3, BASE, #16[m
[31m-    |  beq >3[m
[31m-    |2:[m
[31m-    |  ldr TMP0, [RA], #8[m
[31m-    |   add BASE, BASE, #8[m
[31m-    |   sub TMP1, TMP1, #8[m
[31m-    |  str TMP0, [BASE, #-24][m
[31m-    |   cbnz TMP1, <2[m
[31m-    |3:[m
[31m-    |  decode_RA RA, INS[m
[31m-    |  sub CARG4, CARG3, RA, lsl #3[m
[31m-    |   decode_RB RB, INS[m
[31m-    |  ldr LFUNC:CARG1, [CARG4, FRAME_FUNC][m
[31m-    |5:[m
[31m-    |  cmp RC, RB, lsl #3		// More results expected?[m
[31m-    |  blo >6[m
[31m-    |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  mov BASE, CARG4[m
[31m-    |  ldr CARG2, LFUNC:CARG1->pc[m
[31m-    |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  add BASE, BASE, #8[m
[31m-    |   add RC, RC, #8[m
[31m-    |  str TISNIL, [BASE, #-24][m
[31m-    |  b <5[m
[31m-    |[m
[31m-    |->BC_RETV1_Z:  // Non-standard return case.[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |->BC_RETV2_Z:[m
[31m-    |  tst CARG2, #FRAME_TYPEP[m
[31m-    |  bne ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down.[m
[31m-    |  sub BASE, BASE, CARG2[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET0: case BC_RET1:[m
[31m-    |  // RA = results, RC = nresults+1[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   lsl RC, RC, #3[m
[31m-    |   str RCw, SAVE_MULTRES[m
[31m-    |  ands CARG1, PC, #FRAME_TYPE[m
[31m-    |   eor CARG2, PC, #FRAME_VARG[m
[31m-    |  bne ->BC_RETV1_Z[m
[31m-    |   ldr INSw, [PC, #-4][m
[31m-    if (op == BC_RET1) {[m
[31m-      |  ldr TMP0, [BASE, RA, lsl #3][m
[31m-    }[m
[31m-    |  sub CARG4, BASE, #16[m
[31m-    |   decode_RA RA, INS[m
[31m-    |  sub BASE, CARG4, RA, lsl #3[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  str TMP0, [CARG4], #8[m
[31m-    }[m
[31m-    |   decode_RB RB, INS[m
[31m-    |  ldr LFUNC:CARG1, [BASE, FRAME_FUNC][m
[31m-    |5:[m
[31m-    |  cmp RC, RB, lsl #3[m
[31m-    |  blo >6[m
[31m-    |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr CARG2, LFUNC:CARG1->pc[m
[31m-    |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  add RC, RC, #8[m
[31m-    |  str TISNIL, [CARG4], #8[m
[31m-    |  b <5[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  |.define FOR_IDX,  [RA];      .define FOR_TIDX,  [RA, #4][m
[31m-  |.define FOR_STOP, [RA, #8];  .define FOR_TSTOP, [RA, #12][m
[31m-  |.define FOR_STEP, [RA, #16]; .define FOR_TSTEP, [RA, #20][m
[31m-  |.define FOR_EXT,  [RA, #24]; .define FOR_TEXT,  [RA, #28][m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IFORL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    |  // RA = base, RC = target (after end of loop or start of loop)[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldp CARG1, CARG2, FOR_IDX		// CARG1 = IDX, CARG2 = STOP[m
[31m-    |   ldr CARG3, FOR_STEP			// CARG3 = STEP[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |   add RC, PC, RC, lsl #2[m
[31m-      |   sub RC, RC, #0x20000[m
[31m-    }[m
[31m-    |  checkint CARG1, >5[m
[31m-    if (!vk) {[m
[31m-      |  checkint CARG2, ->vmeta_for[m
[31m-      |   checkint CARG3, ->vmeta_for[m
[31m-      |  tbnz CARG3w, #31, >4[m
[31m-      |  cmp CARG1w, CARG2w[m
[31m-    } else {[m
[31m-      |  adds CARG1w, CARG1w, CARG3w[m
[31m-      |  bvs >2[m
[31m-      |   add TMP0, CARG1, TISNUM[m
[31m-      |  tbnz CARG3w, #31, >4[m
[31m-      |  cmp CARG1w, CARG2w[m
[31m-    }[m
[31m-    |1:[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  csel PC, RC, PC, gt[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  ldrh RCw, [RC, #-2][m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  csel PC, RC, PC, le[m
[31m-    }[m
[31m-    if (vk) {[m
[31m-      |   str TMP0, FOR_IDX[m
[31m-      |   str TMP0, FOR_EXT[m
[31m-    } else {[m
[31m-      |  str CARG1, FOR_EXT[m
[31m-    }[m
[31m-    if (op == BC_JFORI || op == BC_JFORL) {[m
[31m-      |  ble =>BC_JLOOP[m
[31m-    }[m
[31m-    |2:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |4:  // Invert check for negative step.[m
[31m-    |  cmp CARG2w, CARG1w[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |5:  // FP loop.[m
[31m-    |  ldp d0, d1, FOR_IDX[m
[31m-    |  blo ->vmeta_for[m
[31m-    if (!vk) {[m
[31m-      |  checknum CARG2, ->vmeta_for[m
[31m-      |   checknum CARG3, ->vmeta_for[m
[31m-      |  str d0, FOR_EXT[m
[31m-    } else {[m
[31m-      |  ldr d2, FOR_STEP[m
[31m-      |  fadd d0, d0, d2[m
[31m-    }[m
[31m-    |  tbnz CARG3, #63, >7[m
[31m-    |  fcmp d0, d1[m
[31m-    |6:[m
[31m-    if (vk) {[m
[31m-      |  str d0, FOR_IDX[m
[31m-      |  str d0, FOR_EXT[m
[31m-    }[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  csel PC, RC, PC, hi[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  ldrh RCw, [RC, #-2][m
[31m-      |  bls =>BC_JLOOP[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  csel PC, RC, PC, ls[m
[31m-    } else {[m
[31m-      |  bls =>BC_JLOOP[m
[31m-    }[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |7:  // Invert check for negative step.[m
[31m-    |  fcmp d1, d0[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IITERL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  // RA = base, RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |   add TMP1, BASE, RA, lsl #3[m
[31m-    |  cmp CARG1, TISNIL[m
[31m-    |  beq >1				// Stop if iterator returned nil.[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  str CARG1, [TMP1, #-8][m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  add TMP0, PC, RC, lsl #2	// Otherwise save control var + branch.[m
[31m-      |  sub PC, TMP0, #0x20000[m
[31m-      |  str CARG1, [TMP1, #-8][m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  // RA = base, RC = target (loop extent)[m
[31m-    |  // Note: RA/RC is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_ILOOP follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  // RA = base, RC = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  NYI[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  // RA = base (only used by trace recorder), RC = target[m
[31m-    |  add RC, PC, RC, lsl #2[m
[31m-    |  sub PC, RC, #0x20000[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    |  // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8[m
[31m-    |  ldr CARG1, L->maxstack[m
[31m-    |   ldrb TMP1w, [PC, #-4+PC2PROTO(numparams)][m
[31m-    |    ldr KBASE, [PC, #-4+PC2PROTO(k)][m
[31m-    |  cmp RA, CARG1[m
[31m-    |  bhi ->vm_growstack_l[m
[31m-    |2:[m
[31m-    |  cmp NARGS8:RC, TMP1, lsl #3	// Check for missing parameters.[m
[31m-    |  blo >3[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  decode_RD RC, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  str TISNIL, [BASE, NARGS8:RC][m
[31m-    |  add NARGS8:RC, NARGS8:RC, #8[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    |  NYI  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8[m
[31m-    |  ldr CARG1, L->maxstack[m
[31m-    |   add TMP2, BASE, RC[m
[31m-    |  add RA, RA, RC[m
[31m-    |   add TMP0, RC, #16+FRAME_VARG[m
[31m-    |   str LFUNC:CARG3, [TMP2], #8	// Store (untagged) copy of LFUNC.[m
[31m-    |    ldr KBASE, [PC, #-4+PC2PROTO(k)][m
[31m-    |  cmp RA, CARG1[m
[31m-    |   str TMP0, [TMP2], #8		// Store delta + FRAME_VARG.[m
[31m-    |  bhs ->vm_growstack_l[m
[31m-    |   sub RC, TMP2, #16[m
[31m-    |  ldrb TMP1w, [PC, #-4+PC2PROTO(numparams)][m
[31m-    |   mov RA, BASE[m
[31m-    |   mov BASE, TMP2[m
[31m-    |  cbz TMP1, >2[m
[31m-    |1:[m
[31m-    |  cmp RA, RC			// Less args than parameters?[m
[31m-    |  bhs >3[m
[31m-    |   ldr TMP0, [RA][m
[31m-    |  sub TMP1, TMP1, #1[m
[31m-    |    str TISNIL, [RA], #8		// Clear old fixarg slot (help the GC).[m
[31m-    |   str TMP0, [TMP2], #8[m
[31m-    |  cbnz TMP1, <1[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:[m
[31m-    |  sub TMP1, TMP1, #1[m
[31m-    |   str TISNIL, [TMP2], #8[m
[31m-    |  cbz TMP1, <2[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = CFUNC, RC = nargs*8[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  ldr CARG4, CFUNC:CARG3->f[m
[31m-    } else {[m
[31m-      |  ldr CARG4, GL->wrapf[m
[31m-    }[m
[31m-    |   add CARG2, RA, NARGS8:RC[m
[31m-    |   ldr CARG1, L->maxstack[m
[31m-    |  add RC, BASE, NARGS8:RC[m
[31m-    |   cmp CARG2, CARG1[m
[31m-    |  stp BASE, RC, L->base[m
[31m-    if (op == BC_FUNCCW) {[m
[31m-      |  ldr CARG2, CFUNC:CARG3->f[m
[31m-    }[m
[31m-    |    mv_vmstate TMP0w, C[m
[31m-    |  mov CARG1, L[m
[31m-    |   bhi ->vm_growstack_c		// Need to grow stack.[m
[31m-    |    st_vmstate TMP0w[m
[31m-    |  blr CARG4			// (lua_State *L [, lua_CFunction f])[m
[31m-    |  // Returns nresults.[m
[31m-    |  ldp BASE, TMP1, L->base[m
[31m-    |    str L, GL->cur_L[m
[31m-    |   sbfiz RC, CRET1, #3, #32[m
[31m-    |    st_vmstate ST_INTERP[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   sub RA, TMP1, RC		// RA = L->top - nresults*8[m
[31m-    |  b ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-[m
[31m-  build_subroutines(ctx);[m
[31m-[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  int i, cf = CFRAME_SIZE >> 3;[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",%%progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 30\n"				/* Return address is in lr. */[m
[31m-	"\t.byte 0xc\n\t.uleb128 31\n\t.uleb128 0\n"	/* def_cfa sp */[m
[31m-	"\t.align 3\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.quad .Lbegin\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x9d\n\t.uleb128 %d\n"		/* offset fp */[m
[31m-	"\t.byte 0x9e\n\t.uleb128 %d\n",	/* offset lr */[m
[31m-	fcofs, CFRAME_SIZE, cf, cf-1);[m
[31m-    for (i = 19; i <= 28; i++)  /* offset x19-x28 */[m
[31m-      fprintf(ctx->fp, "\t.byte 0x%x\n\t.uleb128 %d\n", 0x80+i, cf-i+17);[m
[31m-    for (i = 8; i <= 15; i++)  /* offset d8-d15 */[m
[31m-      fprintf(ctx->fp, "\t.byte 5\n\t.uleb128 0x%x\n\t.uleb128 %d\n",[m
[31m-	      64+i, cf-i-4);[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 3\n"[m
[31m-	".LEFDE0:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.quad lj_vm_ffi_call\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 32\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x9d\n\t.uleb128 4\n"		/* offset fp */[m
[31m-	"\t.byte 0x9e\n\t.uleb128 3\n"		/* offset lr */[m
[31m-	"\t.byte 0x93\n\t.uleb128 2\n"		/* offset x19 */[m
[31m-	"\t.align 3\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",%%progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.long .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 30\n"				/* Return address is in lr. */[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.long lj_err_unwind_dwarf-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 31\n\t.uleb128 0\n"	/* def_cfa sp */[m
[31m-	"\t.align 3\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.long .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.long .LASFDE2-.Lframe1\n"[m
[31m-	"\t.long .Lbegin-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x9d\n\t.uleb128 %d\n"		/* offset fp */[m
[31m-	"\t.byte 0x9e\n\t.uleb128 %d\n",	/* offset lr */[m
[31m-	fcofs, CFRAME_SIZE, cf, cf-1);[m
[31m-    for (i = 19; i <= 28; i++)  /* offset x19-x28 */[m
[31m-      fprintf(ctx->fp, "\t.byte 0x%x\n\t.uleb128 %d\n", 0x80+i, cf-i+17);[m
[31m-    for (i = 8; i <= 15; i++)  /* offset d8-d15 */[m
[31m-      fprintf(ctx->fp, "\t.byte 5\n\t.uleb128 0x%x\n\t.uleb128 %d\n",[m
[31m-	      64+i, cf-i-4);[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 3\n"[m
[31m-	".LEFDE2:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.long .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 30\n"				/* Return address is in lr. */[m
[31m-	"\t.uleb128 1\n"                        /* augmentation length */[m
[31m-	"\t.byte 0x1b\n"                        /* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 31\n\t.uleb128 0\n"	/* def_cfa sp */[m
[31m-	"\t.align 3\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.long .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.long .LASFDE3-.Lframe2\n"[m
[31m-	"\t.long lj_vm_ffi_call-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"                        /* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 32\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x9d\n\t.uleb128 4\n"		/* offset fp */[m
[31m-	"\t.byte 0x9e\n\t.uleb128 3\n"		/* offset lr */[m
[31m-	"\t.byte 0x93\n\t.uleb128 2\n"		/* offset x19 */[m
[31m-	"\t.align 3\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_mips.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_mips.dasc[m
[1mdeleted file mode 100644[m
[1mindex 0543c7e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_mips.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,5264 +0,0 @@[m
[31m-|// Low-level VM code for MIPS CPUs.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|//[m
[31m-|// MIPS soft-float support contributed by Djordje Kovacevic and[m
[31m-|// Stefan Pejic from RT-RK.com, sponsored by Cisco Systems, Inc.[m
[31m-|[m
[31m-|.arch mips[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|// Note: The ragged indentation of the instructions is intentional.[m
[31m-|//       The starting columns indicate data dependencies.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|// Don't use: r0 = 0, r26/r27 = reserved, r28 = gp, r29 = sp, r31 = ra[m
[31m-|[m
[31m-|.macro .FPU, a, b[m
[31m-|.if FPU[m
[31m-|  a, b[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// The following must be C callee-save (but BASE is often refetched).[m
[31m-|.define BASE,		r16	// Base of current Lua stack frame.[m
[31m-|.define KBASE,		r17	// Constants of current Lua function.[m
[31m-|.define PC,		r18	// Next PC.[m
[31m-|.define DISPATCH,	r19	// Opcode dispatch table.[m
[31m-|.define LREG,		r20	// Register holding lua_State (also in SAVE_L).[m
[31m-|.define MULTRES,	r21	// Size of multi-result: (nresults+1)*8.[m
[31m-|[m
[31m-|.define JGL,		r30	// On-trace: global_State + 32768.[m
[31m-|[m
[31m-|// Constants for type-comparisons, stores and conversions. C callee-save.[m
[31m-|.define TISNUM,	r22[m
[31m-|.define TISNIL,	r30[m
[31m-|.if FPU[m
[31m-|.define TOBIT,		f30	// 2^52 + 2^51.[m
[31m-|.endif[m
[31m-|[m
[31m-|// The following temporaries are not saved across C calls, except for RA.[m
[31m-|.define RA,		r23	// Callee-save.[m
[31m-|.define RB,		r8[m
[31m-|.define RC,		r9[m
[31m-|.define RD,		r10[m
[31m-|.define INS,		r11[m
[31m-|[m
[31m-|.define AT,		r1	// Assembler temporary.[m
[31m-|.define TMP0,		r12[m
[31m-|.define TMP1,		r13[m
[31m-|.define TMP2,		r14[m
[31m-|.define TMP3,		r15[m
[31m-|[m
[31m-|// Calling conventions.[m
[31m-|.define CFUNCADDR,	r25[m
[31m-|.define CARG1,		r4[m
[31m-|.define CARG2,		r5[m
[31m-|.define CARG3,		r6[m
[31m-|.define CARG4,		r7[m
[31m-|[m
[31m-|.define CRET1,		r2[m
[31m-|.define CRET2,		r3[m
[31m-|[m
[31m-|.if ENDIAN_LE[m
[31m-|.define SFRETLO,	CRET1[m
[31m-|.define SFRETHI,	CRET2[m
[31m-|.define SFARG1LO,	CARG1[m
[31m-|.define SFARG1HI,	CARG2[m
[31m-|.define SFARG2LO,	CARG3[m
[31m-|.define SFARG2HI,	CARG4[m
[31m-|.else[m
[31m-|.define SFRETLO,	CRET2[m
[31m-|.define SFRETHI,	CRET1[m
[31m-|.define SFARG1LO,	CARG2[m
[31m-|.define SFARG1HI,	CARG1[m
[31m-|.define SFARG2LO,	CARG4[m
[31m-|.define SFARG2HI,	CARG3[m
[31m-|.endif[m
[31m-|[m
[31m-|.if FPU[m
[31m-|.define FARG1,		f12[m
[31m-|.define FARG2,		f14[m
[31m-|[m
[31m-|.define FRET1,		f0[m
[31m-|.define FRET2,		f2[m
[31m-|.endif[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|.if FPU		// MIPS32 hard-float.[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	112	// Delta for sp.[m
[31m-|[m
[31m-|.define SAVE_ERRF,	124(sp)	// 32 bit C frame info.[m
[31m-|.define SAVE_NRES,	120(sp)[m
[31m-|.define SAVE_CFRAME,	116(sp)[m
[31m-|.define SAVE_L,	112(sp)[m
[31m-|//----- 8 byte aligned, ^^^^ 16 byte register save area, owned by interpreter.[m
[31m-|.define SAVE_GPR_,	72	// .. 72+10*4: 32 bit GPR saves.[m
[31m-|.define SAVE_FPR_,	24	// .. 24+6*8: 64 bit FPR saves.[m
[31m-|[m
[31m-|.else			// MIPS32 soft-float[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	64	// Delta for sp.[m
[31m-|[m
[31m-|.define SAVE_ERRF,	76(sp)	// 32 bit C frame info.[m
[31m-|.define SAVE_NRES,	72(sp)[m
[31m-|.define SAVE_CFRAME,	68(sp)[m
[31m-|.define SAVE_L,	64(sp)[m
[31m-|//----- 8 byte aligned, ^^^^ 16 byte register save area, owned by interpreter.[m
[31m-|.define SAVE_GPR_,	24	// .. 24+10*4: 32 bit GPR saves.[m
[31m-|[m
[31m-|.endif[m
[31m-|[m
[31m-|.define SAVE_PC,	20(sp)[m
[31m-|.define ARG5,		16(sp)[m
[31m-|.define CSAVE_4,	12(sp)[m
[31m-|.define CSAVE_3,	8(sp)[m
[31m-|.define CSAVE_2,	4(sp)[m
[31m-|.define CSAVE_1,	0(sp)[m
[31m-|//----- 8 byte aligned, ^^^^ 16 byte register save area, owned by callee.[m
[31m-|[m
[31m-|.define ARG5_OFS,	16[m
[31m-|.define SAVE_MULTRES,	ARG5[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|.macro saveregs[m
[31m-|  addiu sp, sp, -CFRAME_SPACE[m
[31m-|  sw ra, SAVE_GPR_+9*4(sp)[m
[31m-|  sw r30, SAVE_GPR_+8*4(sp)[m
[31m-|   .FPU sdc1 f30, SAVE_FPR_+5*8(sp)[m
[31m-|  sw r23, SAVE_GPR_+7*4(sp)[m
[31m-|  sw r22, SAVE_GPR_+6*4(sp)[m
[31m-|   .FPU sdc1 f28, SAVE_FPR_+4*8(sp)[m
[31m-|  sw r21, SAVE_GPR_+5*4(sp)[m
[31m-|  sw r20, SAVE_GPR_+4*4(sp)[m
[31m-|   .FPU sdc1 f26, SAVE_FPR_+3*8(sp)[m
[31m-|  sw r19, SAVE_GPR_+3*4(sp)[m
[31m-|  sw r18, SAVE_GPR_+2*4(sp)[m
[31m-|   .FPU sdc1 f24, SAVE_FPR_+2*8(sp)[m
[31m-|  sw r17, SAVE_GPR_+1*4(sp)[m
[31m-|  sw r16, SAVE_GPR_+0*4(sp)[m
[31m-|   .FPU sdc1 f22, SAVE_FPR_+1*8(sp)[m
[31m-|   .FPU sdc1 f20, SAVE_FPR_+0*8(sp)[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro restoreregs_ret[m
[31m-|  lw ra, SAVE_GPR_+9*4(sp)[m
[31m-|  lw r30, SAVE_GPR_+8*4(sp)[m
[31m-|   .FPU ldc1 f30, SAVE_FPR_+5*8(sp)[m
[31m-|  lw r23, SAVE_GPR_+7*4(sp)[m
[31m-|  lw r22, SAVE_GPR_+6*4(sp)[m
[31m-|   .FPU ldc1 f28, SAVE_FPR_+4*8(sp)[m
[31m-|  lw r21, SAVE_GPR_+5*4(sp)[m
[31m-|  lw r20, SAVE_GPR_+4*4(sp)[m
[31m-|   .FPU ldc1 f26, SAVE_FPR_+3*8(sp)[m
[31m-|  lw r19, SAVE_GPR_+3*4(sp)[m
[31m-|  lw r18, SAVE_GPR_+2*4(sp)[m
[31m-|   .FPU ldc1 f24, SAVE_FPR_+2*8(sp)[m
[31m-|  lw r17, SAVE_GPR_+1*4(sp)[m
[31m-|  lw r16, SAVE_GPR_+0*4(sp)[m
[31m-|   .FPU ldc1 f22, SAVE_FPR_+1*8(sp)[m
[31m-|   .FPU ldc1 f20, SAVE_FPR_+0*8(sp)[m
[31m-|  jr ra[m
[31m-|  addiu sp, sp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State,	LREG[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS8,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Trap for not-yet-implemented parts.[m
[31m-|.macro NYI; .long 0xf0f0f0f0; .endmacro[m
[31m-|[m
[31m-|// Macros to mark delay slots.[m
[31m-|.macro ., a; a; .endmacro[m
[31m-|.macro ., a,b; a,b; .endmacro[m
[31m-|.macro ., a,b,c; a,b,c; .endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Endian-specific defines.[m
[31m-|.if ENDIAN_LE[m
[31m-|.define FRAME_PC,	-4[m
[31m-|.define FRAME_FUNC,	-8[m
[31m-|.define HI,		4[m
[31m-|.define LO,		0[m
[31m-|.define OFS_RD,	2[m
[31m-|.define OFS_RA,	1[m
[31m-|.define OFS_OP,	0[m
[31m-|.else[m
[31m-|.define FRAME_PC,	-8[m
[31m-|.define FRAME_FUNC,	-4[m
[31m-|.define HI,		0[m
[31m-|.define LO,		4[m
[31m-|.define OFS_RD,	0[m
[31m-|.define OFS_RA,	2[m
[31m-|.define OFS_OP,	3[m
[31m-|.endif[m
[31m-|[m
[31m-|// Instruction decode.[m
[31m-|.macro decode_OP1, dst, ins; andi dst, ins, 0xff; .endmacro[m
[31m-|.macro decode_OP4a, dst, ins; andi dst, ins, 0xff; .endmacro[m
[31m-|.macro decode_OP4b, dst; sll dst, dst, 2; .endmacro[m
[31m-|.macro decode_RC4a, dst, ins; srl dst, ins, 14; .endmacro[m
[31m-|.macro decode_RC4b, dst; andi dst, dst, 0x3fc; .endmacro[m
[31m-|.macro decode_RD4b, dst; sll dst, dst, 2; .endmacro[m
[31m-|.macro decode_RA8a, dst, ins; srl dst, ins, 5; .endmacro[m
[31m-|.macro decode_RA8b, dst; andi dst, dst, 0x7f8; .endmacro[m
[31m-|.macro decode_RB8a, dst, ins; srl dst, ins, 21; .endmacro[m
[31m-|.macro decode_RB8b, dst; andi dst, dst, 0x7f8; .endmacro[m
[31m-|.macro decode_RD8a, dst, ins; srl dst, ins, 16; .endmacro[m
[31m-|.macro decode_RD8b, dst; sll dst, dst, 3; .endmacro[m
[31m-|.macro decode_RDtoRC8, dst, src; andi dst, src, 0x7f8; .endmacro[m
[31m-|[m
[31m-|// Instruction fetch.[m
[31m-|.macro ins_NEXT1[m
[31m-|  lw INS, 0(PC)[m
[31m-|   addiu PC, PC, 4[m
[31m-|.endmacro[m
[31m-|// Instruction decode+dispatch.[m
[31m-|.macro ins_NEXT2[m
[31m-|  decode_OP4a TMP1, INS[m
[31m-|  decode_OP4b TMP1[m
[31m-|  addu TMP0, DISPATCH, TMP1[m
[31m-|   decode_RD8a RD, INS[m
[31m-|  lw AT, 0(TMP0)[m
[31m-|   decode_RA8a RA, INS[m
[31m-|   decode_RD8b RD[m
[31m-|  jr AT[m
[31m-|   decode_RA8b RA[m
[31m-|.endmacro[m
[31m-|.macro ins_NEXT[m
[31m-|  ins_NEXT1[m
[31m-|  ins_NEXT2[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|  .define ins_next1, ins_NEXT1[m
[31m-|  .define ins_next2, ins_NEXT2[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  .macro ins_next[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next1[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next2[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-|  lw PC, LFUNC:RB->pc[m
[31m-|  lw INS, 0(PC)[m
[31m-|   addiu PC, PC, 4[m
[31m-|  decode_OP4a TMP1, INS[m
[31m-|   decode_RA8a RA, INS[m
[31m-|  decode_OP4b TMP1[m
[31m-|   decode_RA8b RA[m
[31m-|  addu TMP0, DISPATCH, TMP1[m
[31m-|  lw TMP0, 0(TMP0)[m
[31m-|  jr TMP0[m
[31m-|   addu RA, RA, BASE[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, PC = caller PC[m
[31m-|  sw PC, FRAME_PC(BASE)[m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|.macro branch_RD[m
[31m-|  srl TMP0, RD, 1[m
[31m-|  lui AT, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-|  addu TMP0, TMP0, AT[m
[31m-|  addu PC, PC, TMP0[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-#define GG_DISP2GOT		(GG_OFS(got) - GG_OFS(dispatch))[m
[31m-#define DISPATCH_GOT(name)	(GG_DISP2GOT + 4*LJ_GOT_##name)[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|.macro load_got, func[m
[31m-|  lw CFUNCADDR, DISPATCH_GOT(func)(DISPATCH)[m
[31m-|.endmacro[m
[31m-|// Much faster. Sadly, there's no easy way to force the required code layout.[m
[31m-|// .macro call_intern, func; bal extern func; .endmacro[m
[31m-|.macro call_intern, func; jalr CFUNCADDR; .endmacro[m
[31m-|.macro call_extern; jalr CFUNCADDR; .endmacro[m
[31m-|.macro jmp_extern; jr CFUNCADDR; .endmacro[m
[31m-|[m
[31m-|.macro hotcheck, delta, target[m
[31m-|  srl TMP1, PC, 1[m
[31m-|  andi TMP1, TMP1, 126[m
[31m-|  addu TMP1, TMP1, DISPATCH[m
[31m-|  lhu TMP2, GG_DISP2HOT(TMP1)[m
[31m-|  addiu TMP2, TMP2, -delta[m
[31m-|  bltz TMP2, target[m
[31m-|.  sh TMP2, GG_DISP2HOT(TMP1)[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotloop[m
[31m-|  hotcheck HOTCOUNT_LOOP, ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall[m
[31m-|  hotcheck HOTCOUNT_CALL, ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state. Uses TMP0.[m
[31m-|.macro li_vmstate, st; li TMP0, ~LJ_VMST_..st; .endmacro[m
[31m-|.macro st_vmstate; sw TMP0, DISPATCH_GL(vmstate)(DISPATCH); .endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites mark and tmp.[m
[31m-|.macro barrierback, tab, mark, tmp, target[m
[31m-|  lw tmp, DISPATCH_GL(gc.grayagain)(DISPATCH)[m
[31m-|   andi mark, mark, ~LJ_GC_BLACK & 255		// black2gray(tab)[m
[31m-|  sw tab, DISPATCH_GL(gc.grayagain)(DISPATCH)[m
[31m-|   sb mark, tab->marked[m
[31m-|  b target[m
[31m-|.  sw tmp, tab->gclist[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  // See vm_return. Also: TMP2 = previous base.[m
[31m-  |  andi AT, PC, FRAME_P[m
[31m-  |  beqz AT, ->cont_dispatch[m
[31m-  |.  li TMP1, LJ_TTRUE[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  lw PC, FRAME_PC(TMP2)		// Fetch PC of previous frame.[m
[31m-  |  move BASE, TMP2			// Restore caller base.[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |   sw TMP1, FRAME_PC(RA)		// Prepend true to results.[m
[31m-  |   addiu RA, RA, -8[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |   addiu RD, RD, 8			// RD = (nresults+1)*8.[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |   beqz RD, ->vm_unwind_c_eh[m
[31m-  |.   li CRET1, LUA_YIELD[m
[31m-  |  beqz TMP0, ->BC_RET_Z		// Handle regular return to Lua.[m
[31m-  |.  move MULTRES, RD[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return[m
[31m-  |  // TMP0 = PC & FRAME_TYPE[m
[31m-  |   li TMP2, -8[m
[31m-  |  xori AT, TMP0, FRAME_C[m
[31m-  |   and TMP2, PC, TMP2[m
[31m-  |  bnez AT, ->vm_returnp[m
[31m-  |   subu TMP2, BASE, TMP2		// TMP2 = previous base.[m
[31m-  |[m
[31m-  |  addiu TMP1, RD, -8[m
[31m-  |   sw TMP2, L->base[m
[31m-  |    li_vmstate C[m
[31m-  |   lw TMP2, SAVE_NRES[m
[31m-  |   addiu BASE, BASE, -8[m
[31m-  |    st_vmstate[m
[31m-  |  beqz TMP1, >2[m
[31m-  |.   sll TMP2, TMP2, 3[m
[31m-  |1:[m
[31m-  |  addiu TMP1, TMP1, -8[m
[31m-  |   lw SFRETHI, HI(RA)[m
[31m-  |    lw SFRETLO, LO(RA)[m
[31m-  |    addiu RA, RA, 8[m
[31m-  |   sw SFRETHI, HI(BASE)[m
[31m-  |    sw SFRETLO, LO(BASE)[m
[31m-  |  bnez TMP1, <1[m
[31m-  |.  addiu BASE, BASE, 8[m
[31m-  |[m
[31m-  |2:[m
[31m-  |  bne TMP2, RD, >6[m
[31m-  |3:[m
[31m-  |.  sw BASE, L->top			// Store new top.[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  lw TMP0, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |   move CRET1, r0			// Ok return status for vm_pcall.[m
[31m-  |  sw TMP0, L->cframe[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs_ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  lw TMP1, L->maxstack[m
[31m-  |  slt AT, TMP2, RD[m
[31m-  |  bnez AT, >7			// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |.  slt AT, BASE, TMP1[m
[31m-  |  beqz AT, >8[m
[31m-  |.  nop[m
[31m-  |  sw TISNIL, HI(BASE)[m
[31m-  |  addiu RD, RD, 8[m
[31m-  |  b <2[m
[31m-  |.  addiu BASE, BASE, 8[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  subu TMP0, RD, TMP2[m
[31m-  |  subu TMP0, BASE, TMP0		// Either keep top or shrink it.[m
[31m-  |  b <3[m
[31m-  |.  movn BASE, TMP0, TMP2		// LUA_MULTRET+1 case?[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  load_got lj_state_growstack[m
[31m-  |   move MULTRES, RD[m
[31m-  |  srl CARG2, TMP2, 3[m
[31m-  |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |.  move CARG1, L[m
[31m-  |    lw TMP2, SAVE_NRES[m
[31m-  |  lw BASE, L->top			// Need the (realloced) L->top in BASE.[m
[31m-  |   move RD, MULTRES[m
[31m-  |  b <2[m
[31m-  |.   sll TMP2, TMP2, 3[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  move sp, CARG1[m
[31m-  |  move CRET1, CARG2[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  lw L, SAVE_L[m
[31m-  |   li TMP0, ~LJ_VMST_C[m
[31m-  |  lw GL:TMP1, L->glref[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.  sw TMP0, GL:TMP1->vmstate[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |  li AT, -4[m
[31m-  |  and sp, CARG1, AT[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  lw L, SAVE_L[m
[31m-  |     .FPU lui TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |  lw BASE, L->base[m
[31m-  |   lw DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |     .FPU mtc1 TMP3, TOBIT[m
[31m-  |  li TMP1, LJ_TFALSE[m
[31m-  |    li_vmstate INTERP[m
[31m-  |  lw PC, FRAME_PC(BASE)		// Fetch PC of previous frame.[m
[31m-  |     .FPU cvt.d.s TOBIT, TOBIT[m
[31m-  |  addiu RA, BASE, -8			// Results start at BASE-8.[m
[31m-  |   addiu DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |  sw TMP1, HI(RA)			// Prepend false to error message.[m
[31m-  |    st_vmstate[m
[31m-  |  b ->vm_returnc[m
[31m-  |.  li RD, 16				// 2 results: false + error message.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  b >2[m
[31m-  |.  li CARG2, LUA_MINSTACK[m
[31m-  |[m
[31m-  |->vm_growstack_l:			// Grow stack for Lua function.[m
[31m-  |  // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC[m
[31m-  |  addu RC, BASE, RC[m
[31m-  |   subu RA, RA, BASE[m
[31m-  |  sw BASE, L->base[m
[31m-  |   addiu PC, PC, 4			// Must point after first instruction.[m
[31m-  |  sw RC, L->top[m
[31m-  |   srl CARG2, RA, 3[m
[31m-  |2:[m
[31m-  |  // L->base = new base, L->top = top[m
[31m-  |  load_got lj_state_growstack[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |.  move CARG1, L[m
[31m-  |  lw BASE, L->base[m
[31m-  |  lw RC, L->top[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  subu RC, RC, BASE[m
[31m-  |  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  move L, CARG1[m
[31m-  |    lw DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |  move BASE, CARG2[m
[31m-  |    lbu TMP1, L->status[m
[31m-  |   sw L, SAVE_L[m
[31m-  |  li PC, FRAME_CP[m
[31m-  |  addiu TMP0, sp, CFRAME_RESUME[m
[31m-  |    addiu DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   sw r0, SAVE_NRES[m
[31m-  |   sw r0, SAVE_ERRF[m
[31m-  |   sw CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |   sw r0, SAVE_CFRAME[m
[31m-  |    beqz TMP1, >3[m
[31m-  |. sw TMP0, L->cframe[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  move RA, BASE[m
[31m-  |   lw BASE, L->base[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |   lw TMP1, L->top[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |     .FPU  lui TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |   subu RD, TMP1, BASE[m
[31m-  |     .FPU  mtc1 TMP3, TOBIT[m
[31m-  |    sb r0, L->status[m
[31m-  |     .FPU  cvt.d.s TOBIT, TOBIT[m
[31m-  |    li_vmstate INTERP[m
[31m-  |   addiu RD, RD, 8[m
[31m-  |    st_vmstate[m
[31m-  |   move MULTRES, RD[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |  beqz TMP0, ->BC_RET_Z[m
[31m-  |.    li TISNIL, LJ_TNIL[m
[31m-  |  b ->vm_return[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  sw CARG4, SAVE_ERRF[m
[31m-  |  b >1[m
[31m-  |.  li PC, FRAME_CP[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  li PC, FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  lw TMP1, L:CARG1->cframe[m
[31m-  |    move L, CARG1[m
[31m-  |   sw CARG3, SAVE_NRES[m
[31m-  |    lw DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |   sw CARG1, SAVE_L[m
[31m-  |     move BASE, CARG2[m
[31m-  |    addiu DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   sw CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  sw TMP1, SAVE_CFRAME[m
[31m-  |  sw sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |[m
[31m-  |3:  // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).[m
[31m-  |  sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  lw TMP2, L->base			// TMP2 = old base (used in vmeta_call).[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |     .FPU lui TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |   lw TMP1, L->top[m
[31m-  |     .FPU mtc1 TMP3, TOBIT[m
[31m-  |  addu PC, PC, BASE[m
[31m-  |   subu NARGS8:RC, TMP1, BASE[m
[31m-  |  subu PC, PC, TMP2			// PC = frame delta + frame type[m
[31m-  |     .FPU cvt.d.s TOBIT, TOBIT[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |    st_vmstate[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC[m
[31m-  |  lw TMP0, FRAME_PC(BASE)[m
[31m-  |  li AT, LJ_TFUNC[m
[31m-  |  bne TMP0, AT, ->vmeta_call[m
[31m-  |.  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, RB = func, RC = nargs*8, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  move L, CARG1[m
[31m-  |   lw TMP0, L:CARG1->stack[m
[31m-  |  sw CARG1, SAVE_L[m
[31m-  |   lw TMP1, L->top[m
[31m-  |     lw DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |  sw CARG1, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   subu TMP0, TMP0, TMP1		// Compute -savestack(L, L->top).[m
[31m-  |    lw TMP1, L->cframe[m
[31m-  |     addiu DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   sw TMP0, SAVE_NRES		// Neg. delta means cframe w/o frame.[m
[31m-  |  sw r0, SAVE_ERRF			// No error function.[m
[31m-  |    sw TMP1, SAVE_CFRAME[m
[31m-  |    sw sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |     sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  jalr CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |.  move CFUNCADDR, CARG4[m
[31m-  |  move BASE, CRET1[m
[31m-  |  bnez CRET1, <3			// Else continue with the call.[m
[31m-  |.  li PC, FRAME_CP[m
[31m-  |  b ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// The lj_meta_* functions (except for lj_meta_cat) don't reallocate the[m
[31m-  |// stack, so BASE doesn't need to be reloaded across these calls.[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultptr, RD = (nresults+1)*8[m
[31m-  |  lw TMP0, -16+LO(BASE)		// Continuation.[m
[31m-  |   move RB, BASE[m
[31m-  |   move BASE, TMP2			// Restore caller BASE.[m
[31m-  |    lw LFUNC:TMP1, FRAME_FUNC(TMP2)[m
[31m-  |.if FFI[m
[31m-  |  sltiu AT, TMP0, 2[m
[31m-  |.endif[m
[31m-  |     lw PC, -16+HI(RB)		// Restore PC from [cont|PC].[m
[31m-  |   addu TMP2, RA, RD[m
[31m-  |    lw TMP1, LFUNC:TMP1->pc[m
[31m-  |.if FFI[m
[31m-  |  bnez AT, >1[m
[31m-  |.endif[m
[31m-  |.  sw TISNIL, -8+HI(TMP2)		// Ensure one valid arg.[m
[31m-  |  // BASE = base, RA = resultptr, RB = meta base[m
[31m-  |  jr TMP0				// Jump to continuation.[m
[31m-  |.  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  bnez TMP0, ->cont_ffi_callback	// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: tailcall from C function.[m
[31m-  |.  addiu TMP1, RB, -16[m
[31m-  |  b ->vm_call_tail[m
[31m-  |.  subu RC, TMP1, BASE[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// RA = resultptr, RB = meta base[m
[31m-  |  lw INS, -4(PC)[m
[31m-  |   addiu CARG2, RB, -16[m
[31m-  |  lw SFRETHI, HI(RA)[m
[31m-  |    lw SFRETLO, LO(RA)[m
[31m-  |  decode_RB8a MULTRES, INS[m
[31m-  |   decode_RA8a RA, INS[m
[31m-  |  decode_RB8b MULTRES[m
[31m-  |   decode_RA8b RA[m
[31m-  |  addu TMP1, BASE, MULTRES[m
[31m-  |   sw BASE, L->base[m
[31m-  |   subu CARG3, CARG2, TMP1[m
[31m-  |  sw SFRETHI, HI(CARG2)[m
[31m-  |  bne TMP1, CARG2, ->BC_CAT_Z[m
[31m-  |.  sw SFRETLO, LO(CARG2)[m
[31m-  |  addu RA, BASE, RA[m
[31m-  |  sw SFRETHI, HI(RA)[m
[31m-  |  b ->cont_nop[m
[31m-  |.  sw SFRETLO, LO(RA)[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets1:[m
[31m-  |  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  li TMP0, LJ_TSTR[m
[31m-  |  sw STR:RC, LO(CARG3)[m
[31m-  |  b >1[m
[31m-  |.  sw TMP0, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  addiu CARG2, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  li TMP0, LJ_TTAB[m
[31m-  |  sw TAB:RB, LO(CARG2)[m
[31m-  |   addiu CARG3, DISPATCH, DISPATCH_GL(tmptv2)[m
[31m-  |  sw TMP0, HI(CARG2)[m
[31m-  |   li TMP1, LJ_TSTR[m
[31m-  |   sw STR:RC, LO(CARG3)[m
[31m-  |  b >1[m
[31m-  |.  sw TMP1, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tgetb:			// TMP0 = index[m
[31m-  |  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  sw TMP0, LO(CARG3)[m
[31m-  |  sw TISNUM, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |1:[m
[31m-  |  load_got lj_meta_tget[m
[31m-  |  sw BASE, L->base[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  beqz CRET1, >3[m
[31m-  |.  addiu TMP1, BASE, -FRAME_CONT[m
[31m-  |  lw SFARG1HI, HI(CRET1)[m
[31m-  |   lw SFARG2HI, LO(CRET1)[m
[31m-  |  ins_next1[m
[31m-  |  sw SFARG1HI, HI(RA)[m
[31m-  |   sw SFARG2HI, LO(RA)[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |  lw BASE, L->top[m
[31m-  |  sw PC, -16+HI(BASE)		// [cont|PC][m
[31m-  |   subu PC, BASE, TMP1[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |.  li NARGS8:RC, 16			// 2 args for func(t, k).[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  load_got lj_tab_getinth[m
[31m-  |  call_intern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |.  nop[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  beqz CRET1, ->BC_TGETR_Z[m
[31m-  |.  move SFARG2HI, TISNIL[m
[31m-  |  lw SFARG2HI, HI(CRET1)[m
[31m-  |  b ->BC_TGETR_Z[m
[31m-  |.  lw SFARG2LO, LO(CRET1)[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets1:[m
[31m-  |  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  li TMP0, LJ_TSTR[m
[31m-  |  sw STR:RC, LO(CARG3)[m
[31m-  |  b >1[m
[31m-  |.  sw TMP0, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  addiu CARG2, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  li TMP0, LJ_TTAB[m
[31m-  |  sw TAB:RB, LO(CARG2)[m
[31m-  |   addiu CARG3, DISPATCH, DISPATCH_GL(tmptv2)[m
[31m-  |  sw TMP0, HI(CARG2)[m
[31m-  |   li TMP1, LJ_TSTR[m
[31m-  |   sw STR:RC, LO(CARG3)[m
[31m-  |  b >1[m
[31m-  |.  sw TMP1, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tsetb:			// TMP0 = index[m
[31m-  |  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  sw TMP0, LO(CARG3)[m
[31m-  |  sw TISNUM, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |1:[m
[31m-  |  load_got lj_meta_tset[m
[31m-  |  sw BASE, L->base[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  lw SFARG1HI, HI(RA)[m
[31m-  |  beqz CRET1, >3[m
[31m-  |.  lw SFARG1LO, LO(RA)[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  ins_next1[m
[31m-  |  sw SFARG1HI, HI(CRET1)[m
[31m-  |   sw SFARG1LO, LO(CRET1)[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |  addiu TMP1, BASE, -FRAME_CONT[m
[31m-  |  lw BASE, L->top[m
[31m-  |  sw PC, -16+HI(BASE)		// [cont|PC][m
[31m-  |   subu PC, BASE, TMP1[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |  sw SFARG1HI, 16+HI(BASE)		// Copy value to third argument.[m
[31m-  |   sw SFARG1LO, 16+LO(BASE)[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |.  li NARGS8:RC, 24			// 3 args for func(t, k, v)[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |  load_got lj_tab_setinth[m
[31m-  |  sw BASE, L->base[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  call_intern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns TValue *.[m
[31m-  |  b ->BC_TSETR_Z[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  // RA/RD point to o1/o2.[m
[31m-  |  move CARG2, RA[m
[31m-  |  move CARG3, RD[m
[31m-  |  load_got lj_meta_comp[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |  sw BASE, L->base[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  decode_OP1 CARG4, INS[m
[31m-  |  call_intern lj_meta_comp	// (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |3:[m
[31m-  |  sltiu AT, CRET1, 2[m
[31m-  |  beqz AT, ->vmeta_binop[m
[31m-  |   negu TMP2, CRET1[m
[31m-  |4:[m
[31m-  |  lhu RD, OFS_RD(PC)[m
[31m-  |   addiu PC, PC, 4[m
[31m-  |   lui TMP1, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-  |  sll RD, RD, 2[m
[31m-  |  addu RD, RD, TMP1[m
[31m-  |  and RD, RD, TMP2[m
[31m-  |  addu PC, PC, RD[m
[31m-  |->cont_nop:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_ra:				// RA = resultptr[m
[31m-  |  lbu TMP1, -4+OFS_RA(PC)[m
[31m-  |   lw SFRETHI, HI(RA)[m
[31m-  |    lw SFRETLO, LO(RA)[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  addu TMP1, BASE, TMP1[m
[31m-  |   sw SFRETHI, HI(TMP1)[m
[31m-  |  b ->cont_nop[m
[31m-  |.   sw SFRETLO, LO(TMP1)[m
[31m-  |[m
[31m-  |->cont_condt:			// RA = resultptr[m
[31m-  |  lw TMP0, HI(RA)[m
[31m-  |  sltiu AT, TMP0, LJ_TISTRUECOND[m
[31m-  |  b <4[m
[31m-  |.  negu TMP2, AT			// Branch if result is true.[m
[31m-  |[m
[31m-  |->cont_condf:			// RA = resultptr[m
[31m-  |  lw TMP0, HI(RA)[m
[31m-  |  sltiu AT, TMP0, LJ_TISTRUECOND[m
[31m-  |  b <4[m
[31m-  |.  addiu TMP2, AT, -1		// Branch if result is false.[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  // SFARG1LO/SFARG2LO point to o1/o2. TMP0 is set to 0/1.[m
[31m-  |  load_got lj_meta_equal[m
[31m-  |   move CARG2, SFARG1LO[m
[31m-  |   move CARG3, SFARG2LO[m
[31m-  |   move CARG4, TMP0[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_equal  // (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  load_got lj_meta_equal_cd[m
[31m-  |  move CARG2, INS[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_equal_cd	// (lua_State *L, BCIns op)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.  nop[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  load_got lj_meta_istype[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |   sw BASE, L->base[m
[31m-  |   srl CARG2, RA, 3[m
[31m-  |   srl CARG3, RD, 3[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |.  move CARG1, L[m
[31m-  |  b ->cont_nop[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  move RC, RB[m
[31m-  |[m
[31m-  |->vmeta_arith:[m
[31m-  |  load_got lj_meta_arith[m
[31m-  |  decode_OP1 TMP0, INS[m
[31m-  |   sw BASE, L->base[m
[31m-  |  move CARG2, RA[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  move CARG3, RB[m
[31m-  |  move CARG4, RC[m
[31m-  |  sw TMP0, ARG5[m
[31m-  |  call_intern lj_meta_arith  // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-  |  beqz CRET1, ->cont_nop[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2[m
[31m-  |  subu TMP1, CRET1, BASE[m
[31m-  |   sw PC, -16+HI(CRET1)		// [cont|PC][m
[31m-  |   move TMP2, BASE[m
[31m-  |  addiu PC, TMP1, FRAME_CONT[m
[31m-  |   move BASE, CRET1[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |.  li NARGS8:RC, 16			// 2 args for func(o1, o2).[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  // CARG2 already set by BC_LEN.[m
[31m-#if LJ_52[m
[31m-  |  move MULTRES, CARG1[m
[31m-#endif[m
[31m-  |  load_got lj_meta_len[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns NULL (retry) or TValue * (metamethod base).[m
[31m-#if LJ_52[m
[31m-  |  bnez CRET1, ->vmeta_binop		// Binop call for compatibility.[m
[31m-  |.  nop[m
[31m-  |  b ->BC_LEN_Z[m
[31m-  |.  move CARG1, MULTRES[m
[31m-#else[m
[31m-  |  b ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |.  nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // TMP2 = old base, BASE = new base, RC = nargs*8[m
[31m-  |  load_got lj_meta_call[m
[31m-  |   sw TMP2, L->base			// This is the callers base![m
[31m-  |  addiu CARG2, BASE, -8[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  addu CARG3, BASE, RC[m
[31m-  |   move MULTRES, NARGS8:RC[m
[31m-  |  call_intern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |.  move CARG1, L[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |   addiu NARGS8:RC, MULTRES, 8	// Got one more argument now.[m
[31m-  |  ins_call[m
[31m-  |[m
[31m-  |->vmeta_callt:			// Resolve __call for BC_CALLT.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs*8[m
[31m-  |  load_got lj_meta_call[m
[31m-  |   sw BASE, L->base[m
[31m-  |  addiu CARG2, RA, -8[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  addu CARG3, RA, RC[m
[31m-  |   move MULTRES, NARGS8:RC[m
[31m-  |  call_intern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |.  move CARG1, L[m
[31m-  |  lw TMP1, FRAME_PC(BASE)[m
[31m-  |   lw LFUNC:RB, FRAME_FUNC(RA)	// Guaranteed to be a function here.[m
[31m-  |  b ->BC_CALLT_Z[m
[31m-  |.  addiu NARGS8:RC, MULTRES, 8	// Got one more argument now.[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  load_got lj_meta_for[m
[31m-  |   sw BASE, L->base[m
[31m-  |  move CARG2, RA[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  move MULTRES, INS[m
[31m-  |  call_intern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |.  move CARG1, L[m
[31m-  |.if JIT[m
[31m-  |  decode_OP1 TMP0, MULTRES[m
[31m-  |  li AT, BC_JFORI[m
[31m-  |.endif[m
[31m-  |  decode_RA8a RA, MULTRES[m
[31m-  |   decode_RD8a RD, MULTRES[m
[31m-  |  decode_RA8b RA[m
[31m-  |.if JIT[m
[31m-  |  beq TMP0, AT, =>BC_JFORI[m
[31m-  |.  decode_RD8b RD[m
[31m-  |  b =>BC_FORI[m
[31m-  |.  nop[m
[31m-  |.else[m
[31m-  |  b =>BC_FORI[m
[31m-  |.  decode_RD8b RD[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  sltiu AT, NARGS8:RC, 16[m
[31m-  |   lw SFARG1HI, HI(BASE)[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.   lw SFARG2HI, 8+HI(BASE)[m
[31m-  |   lw SFARG1LO, LO(BASE)[m
[31m-  |    lw SFARG2LO, 8+LO(BASE)[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name	// Caveat: has delay slot![m
[31m-  |->ff_ .. name:[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |.if FPU[m
[31m-  |   ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |   lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name	// Caveat: has delay slot![m
[31m-  |->ff_ .. name:[m
[31m-  |  sltiu AT, NARGS8:RC, 16[m
[31m-  |   lw SFARG1HI, HI(BASE)[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  lw SFARG2HI, 8+HI(BASE)[m
[31m-  |  sltiu TMP0, SFARG1HI, LJ_TISNUM[m
[31m-  |.if FPU[m
[31m-  |   ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |   lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  sltiu TMP1, SFARG2HI, LJ_TISNUM[m
[31m-  |.if FPU[m
[31m-  |   ldc1 FARG2, 8(BASE)[m
[31m-  |.else[m
[31m-  |   lw SFARG2LO, 8+LO(BASE)[m
[31m-  |.endif[m
[31m-  |  and TMP0, TMP0, TMP1[m
[31m-  |  beqz TMP0, ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1 and has delay slot![m
[31m-  |.macro ffgccheck[m
[31m-  |  lw TMP0, DISPATCH_GL(gc.total)(DISPATCH)[m
[31m-  |  lw TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)[m
[31m-  |  subu AT, TMP0, TMP1[m
[31m-  |  bgezal AT, ->fff_gcstep[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  sltiu AT, SFARG1HI, LJ_TISTRUECOND[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |  addiu RD, NARGS8:RC, 8		// Compute (nresults+1)*8.[m
[31m-  |  addu TMP2, RA, NARGS8:RC[m
[31m-  |   sw SFARG1HI, HI(RA)[m
[31m-  |  addiu TMP1, BASE, 8[m
[31m-  |  beq BASE, TMP2, ->fff_res		// Done if exactly 1 argument.[m
[31m-  |.  sw SFARG1LO, LO(RA)[m
[31m-  |1:[m
[31m-  |  lw SFRETHI, HI(TMP1)[m
[31m-  |   lw SFRETLO, LO(TMP1)[m
[31m-  |  sw SFRETHI, -8+HI(TMP1)[m
[31m-  |   sw SFRETLO, -8+LO(TMP1)[m
[31m-  |  bne TMP1, TMP2, <1[m
[31m-  |.  addiu TMP1, TMP1, 8[m
[31m-  |  b ->fff_res[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |.ffunc type[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  sltiu TMP0, SFARG1HI, LJ_TISNUM[m
[31m-  |  movn SFARG1HI, TISNUM, TMP0[m
[31m-  |  not TMP1, SFARG1HI[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  addu TMP1, CFUNC:RB, TMP1[m
[31m-  |  lw SFARG1HI, CFUNC:TMP1->upvalue[0].u32.hi[m
[31m-  |  b ->fff_restv[m
[31m-  |.  lw SFARG1LO, CFUNC:TMP1->upvalue[0].u32.lo[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |  bne SFARG1HI, AT, >6[m
[31m-  |.  li AT, LJ_TUDATA[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  lw TAB:SFARG1LO, TAB:SFARG1LO->metatable[m
[31m-  |2:[m
[31m-  |  lw STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH)[m
[31m-  |  beqz TAB:SFARG1LO, ->fff_restv[m
[31m-  |.  li SFARG1HI, LJ_TNIL[m
[31m-  |  lw TMP0, TAB:SFARG1LO->hmask[m
[31m-  |   li SFARG1HI, LJ_TTAB		// Use metatable as default result.[m
[31m-  |  lw TMP1, STR:RC->hash[m
[31m-  |  lw NODE:TMP2, TAB:SFARG1LO->node[m
[31m-  |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-  |  sll TMP0, TMP1, 5[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  subu TMP1, TMP0, TMP1[m
[31m-  |  addu NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-  |  li AT, LJ_TSTR[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  lw CARG4, offsetof(Node, key)+HI(NODE:TMP2)[m
[31m-  |   lw TMP0, offsetof(Node, key)+LO(NODE:TMP2)[m
[31m-  |    lw NODE:TMP3, NODE:TMP2->next[m
[31m-  |  bne CARG4, AT, >4[m
[31m-  |.    lw CARG3, offsetof(Node, val)+HI(NODE:TMP2)[m
[31m-  |  beq TMP0, STR:RC, >5[m
[31m-  |.    lw TMP1, offsetof(Node, val)+LO(NODE:TMP2)[m
[31m-  |4:[m
[31m-  |  beqz NODE:TMP3, ->fff_restv	// Not found, keep default result.[m
[31m-  |.  move NODE:TMP2, NODE:TMP3[m
[31m-  |  b <3[m
[31m-  |.  nop[m
[31m-  |5:[m
[31m-  |  beq CARG3, TISNIL, ->fff_restv	// Ditto for nil value.[m
[31m-  |.  nop[m
[31m-  |  move SFARG1HI, CARG3		// Return value of mt.__metatable.[m
[31m-  |  b ->fff_restv[m
[31m-  |.  move SFARG1LO, TMP1[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  beq SFARG1HI, AT, <1[m
[31m-  |.  sltu AT, TISNUM, SFARG1HI[m
[31m-  |  movz SFARG1HI, TISNUM, AT[m
[31m-  |  not TMP1, SFARG1HI[m
[31m-  |  sll TMP1, TMP1, 2[m
[31m-  |  addu TMP1, DISPATCH, TMP1[m
[31m-  |  b <2[m
[31m-  |.  lw TAB:SFARG1LO, DISPATCH_GL(gcroot[GCROOT_BASEMT])(TMP1)[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |  bne SFARG1HI, AT, ->fff_fallback[m
[31m-  |.  addiu SFARG2HI, SFARG2HI, -LJ_TTAB[m
[31m-  |  lw TAB:TMP1, TAB:SFARG1LO->metatable[m
[31m-  |   lbu TMP3, TAB:SFARG1LO->marked[m
[31m-  |  or AT, SFARG2HI, TAB:TMP1[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  andi AT, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-  |  beqz AT, ->fff_restv[m
[31m-  |.  sw TAB:SFARG2LO, TAB:SFARG1LO->metatable[m
[31m-  |  barrierback TAB:SFARG1LO, TMP3, TMP0, ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc rawget[m
[31m-  |  lw CARG4, HI(BASE)[m
[31m-  |   sltiu AT, NARGS8:RC, 16[m
[31m-  |    lw TAB:CARG2, LO(BASE)[m
[31m-  |  load_got lj_tab_get[m
[31m-  |  addiu CARG4, CARG4, -LJ_TTAB[m
[31m-  |  or AT, AT, CARG4[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |   addiu CARG3, BASE, 8[m
[31m-  |  call_intern lj_tab_get	// (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns cTValue *.[m
[31m-  |  lw SFARG1HI, HI(CRET1)[m
[31m-  |  b ->fff_restv[m
[31m-  |.  lw SFARG1LO, LO(CRET1)[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  lw CARG1, HI(BASE)[m
[31m-  |  xori AT, NARGS8:RC, 8		// Exactly one number argument.[m
[31m-  |  sltu TMP0, TISNUM, CARG1[m
[31m-  |  or AT, AT, TMP0[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  lw SFARG1HI, HI(BASE)[m
[31m-  |  b ->fff_restv[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  li AT, LJ_TSTR[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  beq SFARG1HI, AT, ->fff_restv	// String key?[m
[31m-  |  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |.  lw TMP1, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH)[m
[31m-  |  sltu TMP0, TISNUM, SFARG1HI[m
[31m-  |  or TMP0, TMP0, TMP1[m
[31m-  |  bnez TMP0, ->fff_fallback[m
[31m-  |.  sw BASE, L->base			// Add frame since C call can throw.[m
[31m-  |  ffgccheck[m
[31m-  |.  sw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  load_got lj_strfmt_number[m
[31m-  |  move CARG1, L[m
[31m-  |  call_intern lj_strfmt_number	// (lua_State *L, cTValue *o)[m
[31m-  |.  move CARG2, BASE[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  li SFARG1HI, LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |.  move SFARG1LO, CRET1[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc next[m
[31m-  |  lw CARG1, HI(BASE)[m
[31m-  |   lw TAB:CARG2, LO(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  addu TMP2, BASE, NARGS8:RC[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |   sw TISNIL, HI(TMP2)		// Set missing 2nd arg to nil.[m
[31m-  |  bne CARG1, AT, ->fff_fallback[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-  |  load_got lj_tab_next[m
[31m-  |   sw BASE, L->base			// Add frame since C call can throw.[m
[31m-  |   sw BASE, L->top			// Dummy frame length is ok.[m
[31m-  |  addiu CARG3, BASE, 8[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_tab_next		// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns 0 at end of traversal.[m
[31m-  |  beqz CRET1, ->fff_restv		// End of traversal: return nil.[m
[31m-  |.  li SFARG1HI, LJ_TNIL[m
[31m-  |  lw TMP0, 8+HI(BASE)[m
[31m-  |   lw TMP1, 8+LO(BASE)[m
[31m-  |    addiu RA, BASE, -8[m
[31m-  |  lw TMP2, 16+HI(BASE)[m
[31m-  |   lw TMP3, 16+LO(BASE)[m
[31m-  |  sw TMP0, HI(RA)[m
[31m-  |   sw TMP1, LO(RA)[m
[31m-  |  sw TMP2, 8+HI(RA)[m
[31m-  |   sw TMP3, 8+LO(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (2+1)*8[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |  bne SFARG1HI, AT, ->fff_fallback[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-#if LJ_52[m
[31m-  |  lw TAB:TMP2, TAB:SFARG1LO->metatable[m
[31m-  |  lw TMP0, CFUNC:RB->upvalue[0].u32.hi[m
[31m-  |   lw TMP1, CFUNC:RB->upvalue[0].u32.lo[m
[31m-  |  bnez TAB:TMP2, ->fff_fallback[m
[31m-#else[m
[31m-  |  lw TMP0, CFUNC:RB->upvalue[0].u32.hi[m
[31m-  |   lw TMP1, CFUNC:RB->upvalue[0].u32.lo[m
[31m-#endif[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |   sw TISNIL, 8+HI(BASE)[m
[31m-  |  sw TMP0, HI(RA)[m
[31m-  |   sw TMP1, LO(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (3+1)*8[m
[31m-  |[m
[31m-  |.ffunc ipairs_aux[m
[31m-  |  sltiu AT, NARGS8:RC, 16[m
[31m-  |   lw CARG3, HI(BASE)[m
[31m-  |    lw TAB:CARG1, LO(BASE)[m
[31m-  |   lw CARG4, 8+HI(BASE)[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  addiu CARG3, CARG3, -LJ_TTAB[m
[31m-  |  xor CARG4, CARG4, TISNUM[m
[31m-  |  and AT, CARG3, CARG4[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-  |  lw TMP2, 8+LO(BASE)[m
[31m-  |   lw TMP0, TAB:CARG1->asize[m
[31m-  |   lw TMP1, TAB:CARG1->array[m
[31m-  |  addiu TMP2, TMP2, 1[m
[31m-  |  sw TISNUM, -8+HI(BASE)[m
[31m-  |  sltu AT, TMP2, TMP0[m
[31m-  |   sw TMP2, -8+LO(BASE)[m
[31m-  |  beqz AT, >2			// Not in array part?[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |   sll TMP3, TMP2, 3[m
[31m-  |   addu TMP3, TMP1, TMP3[m
[31m-  |  lw TMP1, HI(TMP3)[m
[31m-  |   lw TMP2, LO(TMP3)[m
[31m-  |1:[m
[31m-  |  beq TMP1, TISNIL, ->fff_res	// End of iteration, return 0 results.[m
[31m-  |.  li RD, (0+1)*8[m
[31m-  |  sw TMP1, 8+HI(RA)[m
[31m-  |   sw TMP2, 8+LO(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (2+1)*8[m
[31m-  |[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  lw TMP0, TAB:CARG1->hmask[m
[31m-  |  load_got lj_tab_getinth[m
[31m-  |  beqz TMP0, ->fff_res[m
[31m-  |.  li RD, (0+1)*8[m
[31m-  |  call_intern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |.  move CARG2, TMP2[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  beqz CRET1, ->fff_res[m
[31m-  |.  li RD, (0+1)*8[m
[31m-  |  lw TMP1, HI(CRET1)[m
[31m-  |  b <1[m
[31m-  |.  lw TMP2, LO(CRET1)[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |  bne SFARG1HI, AT, ->fff_fallback[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-#if LJ_52[m
[31m-  |  lw TAB:TMP2, TAB:SFARG1LO->metatable[m
[31m-  |  lw TMP0, CFUNC:RB->upvalue[0].u32.hi[m
[31m-  |   lw TMP1, CFUNC:RB->upvalue[0].u32.lo[m
[31m-  |  bnez TAB:TMP2, ->fff_fallback[m
[31m-#else[m
[31m-  |  lw TMP0, CFUNC:RB->upvalue[0].u32.hi[m
[31m-  |   lw TMP1, CFUNC:RB->upvalue[0].u32.lo[m
[31m-#endif[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |   sw TISNUM, 8+HI(BASE)[m
[31m-  |   sw r0, 8+LO(BASE)[m
[31m-  |  sw TMP0, HI(RA)[m
[31m-  |   sw TMP1, LO(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (3+1)*8[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc pcall[m
[31m-  |  lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |   move TMP2, BASE[m
[31m-  |   addiu BASE, BASE, 8[m
[31m-  |  // Remember active hook before pcall.[m
[31m-  |  srl TMP3, TMP3, HOOK_ACTIVE_SHIFT[m
[31m-  |  andi TMP3, TMP3, 1[m
[31m-  |  addiu PC, TMP3, 8+FRAME_PCALL[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |.  addiu NARGS8:RC, NARGS8:RC, -8[m
[31m-  |[m
[31m-  |.ffunc xpcall[m
[31m-  |    sltiu AT, NARGS8:RC, 16[m
[31m-  |  lw CARG4, 8+HI(BASE)[m
[31m-  |    bnez AT, ->fff_fallback[m
[31m-  |.  lw CARG3, 8+LO(BASE)[m
[31m-  |   lw CARG1, LO(BASE)[m
[31m-  |    lw CARG2, HI(BASE)[m
[31m-  |    lbu TMP1, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  li AT, LJ_TFUNC[m
[31m-  |   move TMP2, BASE[m
[31m-  |  bne CARG4, AT, ->fff_fallback  // Traceback must be a function.[m
[31m-  |   addiu BASE, BASE, 16[m
[31m-  |  // Remember active hook before pcall.[m
[31m-  |  srl TMP3, TMP3, HOOK_ACTIVE_SHIFT[m
[31m-  |   sw CARG3, LO(TMP2)	// Swap function and traceback.[m
[31m-  |   sw CARG4, HI(TMP2)[m
[31m-  |  andi TMP3, TMP3, 1[m
[31m-  |   sw CARG1, 8+LO(TMP2)[m
[31m-  |    sw CARG2, 8+HI(TMP2)[m
[31m-  |  addiu PC, TMP3, 16+FRAME_PCALL[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |.  addiu NARGS8:RC, NARGS8:RC, -16[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc coroutine_resume[m
[31m-  |  lw CARG3, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  lw CARG1, LO(BASE)[m
[31m-  |  li AT, LJ_TTHREAD[m
[31m-  |  bne CARG3, AT, ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  lw L:CARG1, CFUNC:RB->upvalue[0].gcr[m
[31m-  |.endif[m
[31m-  |  lbu TMP0, L:CARG1->status[m
[31m-  |   lw TMP1, L:CARG1->cframe[m
[31m-  |    lw CARG2, L:CARG1->top[m
[31m-  |    lw TMP2, L:CARG1->base[m
[31m-  |  addiu TMP3, TMP0, -LUA_YIELD[m
[31m-  |  bgtz TMP3, ->fff_fallback		// st > LUA_YIELD?[m
[31m-  |.   xor TMP2, TMP2, CARG2[m
[31m-  |  bnez TMP1, ->fff_fallback		// cframe != 0?[m
[31m-  |.  or AT, TMP2, TMP0[m
[31m-  |  lw TMP0, L:CARG1->maxstack[m
[31m-  |  beqz AT, ->fff_fallback		// base == top && st == 0?[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-  |  addu TMP2, CARG2, NARGS8:RC[m
[31m-  |  sltu AT, TMP0, TMP2[m
[31m-  |  bnez AT, ->fff_fallback		// Stack overflow?[m
[31m-  |.  sw PC, SAVE_PC[m
[31m-  |   sw BASE, L->base[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  addiu BASE, BASE, 8		// Keep resumed thread in stack for GC.[m
[31m-  |  addiu NARGS8:RC, NARGS8:RC, -8[m
[31m-  |  addiu TMP2, TMP2, -8[m
[31m-  |.endif[m
[31m-  |  sw TMP2, L:CARG1->top[m
[31m-  |  addu TMP1, BASE, NARGS8:RC[m
[31m-  |  move CARG3, CARG2[m
[31m-  |  sw BASE, L->top[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |   lw SFRETHI, HI(BASE)[m
[31m-  |    lw SFRETLO, LO(BASE)[m
[31m-  |  sltu AT, BASE, TMP1[m
[31m-  |  beqz AT, >3[m
[31m-  |.  addiu BASE, BASE, 8[m
[31m-  |   sw SFRETHI, HI(CARG3)[m
[31m-  |    sw SFRETLO, LO(CARG3)[m
[31m-  |  b <2[m
[31m-  |.  addiu CARG3, CARG3, 8[m
[31m-  |3:[m
[31m-  |  bal ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |.  move L:RA, L:CARG1[m
[31m-  |  // Returns thread status.[m
[31m-  |4:[m
[31m-  |  lw TMP2, L:RA->base[m
[31m-  |   sltiu AT, CRET1, LUA_YIELD+1[m
[31m-  |  lw TMP3, L:RA->top[m
[31m-  |    li_vmstate INTERP[m
[31m-  |  lw BASE, L->base[m
[31m-  |    sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |    st_vmstate[m
[31m-  |   beqz AT, >8[m
[31m-  |. subu RD, TMP3, TMP2[m
[31m-  |   lw TMP0, L->maxstack[m
[31m-  |  beqz RD, >6			// No results?[m
[31m-  |.  addu TMP1, BASE, RD[m
[31m-  |  sltu AT, TMP0, TMP1[m
[31m-  |  bnez AT, >9			// Need to grow stack?[m
[31m-  |.  addu TMP3, TMP2, RD[m
[31m-  |  sw TMP2, L:RA->top			// Clear coroutine stack.[m
[31m-  |  move TMP1, BASE[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |   lw SFRETHI, HI(TMP2)[m
[31m-  |    lw SFRETLO, LO(TMP2)[m
[31m-  |  addiu TMP2, TMP2, 8[m
[31m-  |  sltu AT, TMP2, TMP3[m
[31m-  |   sw SFRETHI, HI(TMP1)[m
[31m-  |    sw SFRETLO, LO(TMP1)[m
[31m-  |  bnez AT, <5[m
[31m-  |.  addiu TMP1, TMP1, 8[m
[31m-  |6:[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |.if resume[m
[31m-  |  li TMP1, LJ_TTRUE[m
[31m-  |   addiu RA, BASE, -8[m
[31m-  |  sw TMP1, -8+HI(BASE)		// Prepend true to results.[m
[31m-  |  addiu RD, RD, 16[m
[31m-  |.else[m
[31m-  |  move RA, BASE[m
[31m-  |  addiu RD, RD, 8[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  beqz TMP0, ->BC_RET_Z[m
[31m-  |.  move MULTRES, RD[m
[31m-  |  b ->vm_return[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  addiu TMP3, TMP3, -8[m
[31m-  |   li TMP1, LJ_TFALSE[m
[31m-  |  lw SFRETHI, HI(TMP3)[m
[31m-  |   lw SFRETLO, LO(TMP3)[m
[31m-  |   sw TMP3, L:RA->top		// Remove error from coroutine stack.[m
[31m-  |    li RD, (2+1)*8[m
[31m-  |   sw TMP1, -8+HI(BASE)		// Prepend false to results.[m
[31m-  |    addiu RA, BASE, -8[m
[31m-  |  sw SFRETHI, HI(BASE)		// Copy error message.[m
[31m-  |   sw SFRETLO, LO(BASE)[m
[31m-  |  b <7[m
[31m-  |.  andi TMP0, PC, FRAME_TYPE[m
[31m-  |.else[m
[31m-  |  load_got lj_ffh_coroutine_wrap_err[m
[31m-  |  move CARG2, L:RA[m
[31m-  |  call_intern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |.  move CARG1, L[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  load_got lj_state_growstack[m
[31m-  |  srl CARG2, RD, 3[m
[31m-  |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |.  move CARG1, L[m
[31m-  |  b <4[m
[31m-  |.  li CRET1, 0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  lw TMP0, L->cframe[m
[31m-  |   addu TMP1, BASE, NARGS8:RC[m
[31m-  |   sw BASE, L->base[m
[31m-  |  andi TMP0, TMP0, CFRAME_RESUME[m
[31m-  |   sw TMP1, L->top[m
[31m-  |  beqz TMP0, ->fff_fallback[m
[31m-  |.   li CRET1, LUA_YIELD[m
[31m-  |  sw r0, L->cframe[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.   sb CRET1, L->status[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 math_abs[m
[31m-  |  bne SFARG1HI, TISNUM, >1[m
[31m-  |.  sra TMP0, SFARG1LO, 31[m
[31m-  |  xor TMP1, SFARG1LO, TMP0[m
[31m-  |  subu SFARG1LO, TMP1, TMP0[m
[31m-  |  bgez SFARG1LO, ->fff_restv[m
[31m-  |.  nop[m
[31m-  |  lui SFARG1HI, 0x41e0		// 2^31 as a double.[m
[31m-  |  b ->fff_restv[m
[31m-  |.  li SFARG1LO, 0[m
[31m-  |1:[m
[31m-  |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.  sll SFARG1HI, SFARG1HI, 1[m
[31m-  |  srl SFARG1HI, SFARG1HI, 1[m
[31m-  |// fallthrough[m
[31m-  |[m
[31m-  |->fff_restv:[m
[31m-  |  // SFARG1LO/SFARG1HI = TValue result.[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |   sw SFARG1HI, -8+HI(BASE)[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |   sw SFARG1LO, -8+LO(BASE)[m
[31m-  |->fff_res1:[m
[31m-  |  // RA = results, PC = return.[m
[31m-  |  li RD, (1+1)*8[m
[31m-  |->fff_res:[m
[31m-  |  // RA = results, RD = (nresults+1)*8, PC = return.[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |  bnez TMP0, ->vm_return[m
[31m-  |.  move MULTRES, RD[m
[31m-  |  lw INS, -4(PC)[m
[31m-  |  decode_RB8a RB, INS[m
[31m-  |  decode_RB8b RB[m
[31m-  |5:[m
[31m-  |  sltu AT, RD, RB[m
[31m-  |  bnez AT, >6			// More results expected?[m
[31m-  |.  decode_RA8a TMP0, INS[m
[31m-  |  decode_RA8b TMP0[m
[31m-  |  ins_next1[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |   subu BASE, RA, TMP0[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  addu TMP1, RA, RD[m
[31m-  |   addiu RD, RD, 8[m
[31m-  |  b <5[m
[31m-  |.  sw TISNIL, -8+HI(TMP1)[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc math_ .. func[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  load_got func[m
[31m-  |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  call_extern[m
[31m-  |.  nop[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |.  load_got func[m
[31m-  |  call_extern[m
[31m-  |.  nop[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// TODO: Return integer type if result is integer (own sf implementation).[m
[31m-  |.macro math_round, func[m
[31m-  |->ff_math_ .. func:[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |  beq SFARG1HI, TISNUM, ->fff_restv[m
[31m-  |.  sltu AT, SFARG1HI, TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |  bal ->vm_ .. func[m
[31m-  |.else[m
[31m-  |.  load_got func[m
[31m-  |  call_extern[m
[31m-  |.endif[m
[31m-  |.  nop[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  li AT, 8[m
[31m-  |  bne NARGS8:RC, AT, ->fff_fallback	// Exactly 1 argument.[m
[31m-  |.  lw SFARG1HI, HI(BASE)[m
[31m-  |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.  load_got log[m
[31m-  |.if FPU[m
[31m-  |  call_extern[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |  call_extern[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.if FPU[m
[31m-  |.ffunc_n math_sqrt[m
[31m-  |.  sqrt.d FRET1, FARG1[m
[31m-  |// fallthrough to ->fff_resn[m
[31m-  |.else[m
[31m-  |  math_extern sqrt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->fff_resn:[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |.if FPU[m
[31m-  |  b ->fff_res1[m
[31m-  |.  sdc1 FRET1, -8(BASE)[m
[31m-  |.else[m
[31m-  |  sw SFRETHI, -8+HI(BASE)[m
[31m-  |  b ->fff_res1[m
[31m-  |.  sw SFRETLO, -8+LO(BASE)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |[m
[31m-  |.ffunc math_ldexp[m
[31m-  |  sltiu AT, NARGS8:RC, 16[m
[31m-  |   lw SFARG1HI, HI(BASE)[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.   lw CARG4, 8+HI(BASE)[m
[31m-  |  bne CARG4, TISNUM, ->fff_fallback[m
[31m-  |  load_got ldexp[m
[31m-  |.  sltu AT, SFARG1HI, TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  call_extern[m
[31m-  |.  lw CARG3, 8+LO(BASE)[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |  load_got frexp[m
[31m-  |   lw PC, FRAME_PC(BASE)[m
[31m-  |  call_extern[m
[31m-  |.  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |   lw TMP1, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |.if FPU[m
[31m-  |   mtc1 TMP1, FARG2[m
[31m-  |  sdc1 FRET1, 0(RA)[m
[31m-  |   cvt.d.w FARG2, FARG2[m
[31m-  |   sdc1 FARG2, 8(RA)[m
[31m-  |.else[m
[31m-  |  sw SFRETLO, LO(RA)[m
[31m-  |  sw SFRETHI, HI(RA)[m
[31m-  |  sw TMP1, 8+LO(RA)[m
[31m-  |  sw TISNUM, 8+HI(RA)[m
[31m-  |.endif[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (2+1)*8[m
[31m-  |[m
[31m-  |.ffunc_n math_modf[m
[31m-  |  load_got modf[m
[31m-  |   lw PC, FRAME_PC(BASE)[m
[31m-  |  call_extern[m
[31m-  |.  addiu CARG3, BASE, -8[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |.if FPU[m
[31m-  |  sdc1 FRET1, 0(BASE)[m
[31m-  |.else[m
[31m-  |  sw SFRETLO, LO(BASE)[m
[31m-  |  sw SFRETHI, HI(BASE)[m
[31m-  |.endif[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (2+1)*8[m
[31m-  |[m
[31m-  |.macro math_minmax, name, intins, fpins[m
[31m-  |  .ffunc_1 name[m
[31m-  |  addu TMP3, BASE, NARGS8:RC[m
[31m-  |  bne SFARG1HI, TISNUM, >5[m
[31m-  |.  addiu TMP2, BASE, 8[m
[31m-  |1:  // Handle integers.[m
[31m-  |.  lw SFARG2HI, HI(TMP2)[m
[31m-  |  beq TMP2, TMP3, ->fff_restv[m
[31m-  |.  lw SFARG2LO, LO(TMP2)[m
[31m-  |  bne SFARG2HI, TISNUM, >3[m
[31m-  |.  slt AT, SFARG1LO, SFARG2LO[m
[31m-  |  intins SFARG1LO, SFARG2LO, AT[m
[31m-  |  b <1[m
[31m-  |.  addiu TMP2, TMP2, 8[m
[31m-  |[m
[31m-  |3:  // Convert intermediate result to number and continue with number loop.[m
[31m-  |  sltiu AT, SFARG2HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  mtc1 SFARG1LO, FRET1[m
[31m-  |  cvt.d.w FRET1, FRET1[m
[31m-  |  b >7[m
[31m-  |.  ldc1 FARG1, 0(TMP2)[m
[31m-  |.else[m
[31m-  |.  nop[m
[31m-  |  bal ->vm_sfi2d_1[m
[31m-  |.  nop[m
[31m-  |  b >7[m
[31m-  |.  nop[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |5:[m
[31m-  |.  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FRET1, 0(BASE)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |6:  // Handle numbers.[m
[31m-  |.  lw SFARG2HI, HI(TMP2)[m
[31m-  |.if FPU[m
[31m-  |  beq TMP2, TMP3, ->fff_resn[m
[31m-  |.else[m
[31m-  |  beq TMP2, TMP3, ->fff_restv[m
[31m-  |.endif[m
[31m-  |.  sltiu AT, SFARG2HI, LJ_TISNUM[m
[31m-  |  beqz AT, >8[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(TMP2)[m
[31m-  |.else[m
[31m-  |.  lw SFARG2LO, LO(TMP2)[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |.if FPU[m
[31m-  |  c.olt.d FRET1, FARG1[m
[31m-  |  fpins FRET1, FARG1[m
[31m-  |.else[m
[31m-  |  bal ->vm_sfcmpolt[m
[31m-  |.  nop[m
[31m-  |  intins SFARG1LO, SFARG2LO, CRET1[m
[31m-  |  intins SFARG1HI, SFARG2HI, CRET1[m
[31m-  |.endif[m
[31m-  |  b <6[m
[31m-  |.  addiu TMP2, TMP2, 8[m
[31m-  |[m
[31m-  |8:  // Convert integer to number and continue with number loop.[m
[31m-  |  bne SFARG2HI, TISNUM, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  lwc1 FARG1, LO(TMP2)[m
[31m-  |  b <7[m
[31m-  |.  cvt.d.w FARG1, FARG1[m
[31m-  |.else[m
[31m-  |.  nop[m
[31m-  |  bal ->vm_sfi2d_2[m
[31m-  |.  nop[m
[31m-  |  b <7[m
[31m-  |.  nop[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, movz, movf.d[m
[31m-  |  math_minmax math_max, movn, movt.d[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  lw CARG3, HI(BASE)[m
[31m-  |   lw STR:CARG1, LO(BASE)[m
[31m-  |  xori AT, NARGS8:RC, 8[m
[31m-  |  addiu CARG3, CARG3, -LJ_TSTR[m
[31m-  |  or AT, AT, CARG3[m
[31m-  |  bnez AT, ->fff_fallback		// Need exactly 1 string argument.[m
[31m-  |.  nop[m
[31m-  |  lw TMP0, STR:CARG1->len[m
[31m-  |    addiu RA, BASE, -8[m
[31m-  |    lw PC, FRAME_PC(BASE)[m
[31m-  |  sltu RD, r0, TMP0[m
[31m-  |   lbu TMP1, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |  addiu RD, RD, 1[m
[31m-  |  sll RD, RD, 3			// RD = ((str->len != 0)+1)*8[m
[31m-  |  sw TISNUM, HI(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  sw TMP1, LO(RA)[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |.  nop[m
[31m-  |  lw CARG3, HI(BASE)[m
[31m-  |   lw CARG1, LO(BASE)[m
[31m-  |  li TMP1, 255[m
[31m-  |  xori AT, NARGS8:RC, 8		// Exactly 1 argument.[m
[31m-  |  xor TMP0, CARG3, TISNUM		// Integer.[m
[31m-  |   sltu TMP1, TMP1, CARG1		// !(255 < n).[m
[31m-  |  or AT, AT, TMP0[m
[31m-  |   or AT, AT, TMP1[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  li CARG3, 1[m
[31m-  |  addiu CARG2, sp, ARG5_OFS[m
[31m-  |  sb CARG1, ARG5[m
[31m-  |->fff_newstr:[m
[31m-  |  load_got lj_str_new[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  lw BASE, L->base[m
[31m-  |->fff_resstr:[m
[31m-  |  move SFARG1LO, CRET1[m
[31m-  |  b ->fff_restv[m
[31m-  |.  li SFARG1HI, LJ_TSTR[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |.  nop[m
[31m-  |  addiu AT, NARGS8:RC, -16[m
[31m-  |   lw CARG3, 16+HI(BASE)[m
[31m-  |   lw TMP0, HI(BASE)[m
[31m-  |    lw STR:CARG1, LO(BASE)[m
[31m-  |  bltz AT, ->fff_fallback[m
[31m-  |.  lw CARG2, 8+HI(BASE)[m
[31m-  |  beqz AT, >1[m
[31m-  |.  li CARG4, -1[m
[31m-  |  bne CARG3, TISNUM, ->fff_fallback[m
[31m-  |.  lw CARG4, 16+LO(BASE)[m
[31m-  |1:[m
[31m-  |  bne CARG2, TISNUM, ->fff_fallback[m
[31m-  |.  li AT, LJ_TSTR[m
[31m-  |  bne TMP0, AT, ->fff_fallback[m
[31m-  |.  lw CARG3, 8+LO(BASE)[m
[31m-  |  lw CARG2, STR:CARG1->len[m
[31m-  |  // STR:CARG1 = str, CARG2 = str->len, CARG3 = start, CARG4 = end[m
[31m-  |  slt AT, CARG4, r0[m
[31m-  |  addiu TMP0, CARG2, 1[m
[31m-  |  addu TMP1, CARG4, TMP0[m
[31m-  |   slt TMP3, CARG3, r0[m
[31m-  |  movn CARG4, TMP1, AT		// if (end < 0) end += len+1[m
[31m-  |   addu TMP1, CARG3, TMP0[m
[31m-  |   movn CARG3, TMP1, TMP3		// if (start < 0) start += len+1[m
[31m-  |   li TMP2, 1[m
[31m-  |  slt AT, CARG4, r0[m
[31m-  |   slt TMP3, r0, CARG3[m
[31m-  |  movn CARG4, r0, AT			// if (end < 0) end = 0[m
[31m-  |   movz CARG3, TMP2, TMP3		// if (start < 1) start = 1[m
[31m-  |  slt AT, CARG2, CARG4[m
[31m-  |  movn CARG4, CARG2, AT		// if (end > len) end = len[m
[31m-  |   addu CARG2, STR:CARG1, CARG3[m
[31m-  |  subu CARG3, CARG4, CARG3		// len = end - start[m
[31m-  |   addiu CARG2, CARG2, sizeof(GCstr)-1[m
[31m-  |  bgez CARG3, ->fff_newstr[m
[31m-  |.  addiu CARG3, CARG3, 1		// len++[m
[31m-  |->fff_emptystr:  // Return empty string.[m
[31m-  |  addiu STR:SFARG1LO, DISPATCH, DISPATCH_GL(strempty)[m
[31m-  |  b ->fff_restv[m
[31m-  |.  li SFARG1HI, LJ_TSTR[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |.  nop[m
[31m-  |  lw CARG3, HI(BASE)[m
[31m-  |   lw STR:CARG2, LO(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  li AT, LJ_TSTR[m
[31m-  |  bne CARG3, AT, ->fff_fallback[m
[31m-  |.  addiu SBUF:CARG1, DISPATCH, DISPATCH_GL(tmpbuf)[m
[31m-  |  load_got lj_buf_putstr_ .. name[m
[31m-  |  lw TMP0, SBUF:CARG1->b[m
[31m-  |   sw L, SBUF:CARG1->L[m
[31m-  |   sw BASE, L->base[m
[31m-  |  sw TMP0, SBUF:CARG1->p[m
[31m-  |  call_intern extern lj_buf_putstr_ .. name[m
[31m-  |.  sw PC, SAVE_PC[m
[31m-  |  load_got lj_buf_tostr[m
[31m-  |  call_intern lj_buf_tostr[m
[31m-  |.  move SBUF:CARG1, SBUF:CRET1[m
[31m-  |  b ->fff_resstr[m
[31m-  |.  lw BASE, L->base[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_tobit_fb:[m
[31m-  |  beqz TMP1, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |  add.d FARG1, FARG1, TOBIT[m
[31m-  |  jr ra[m
[31m-  |.  mfc1 CRET1, FARG1[m
[31m-  |.else[m
[31m-  |// FP number to bit conversion for soft-float.[m
[31m-  |->vm_tobit:[m
[31m-  |  sll TMP0, SFARG1HI, 1[m
[31m-  |  lui AT, 0x0020[m
[31m-  |  addu TMP0, TMP0, AT[m
[31m-  |  slt AT, TMP0, r0[m
[31m-  |  movz SFARG1LO, r0, AT[m
[31m-  |  beqz AT, >2[m
[31m-  |.  li TMP1, 0x3e0[m
[31m-  |  not TMP1, TMP1[m
[31m-  |  sra TMP0, TMP0, 21[m
[31m-  |  subu TMP0, TMP1, TMP0[m
[31m-  |  slt AT, TMP0, r0[m
[31m-  |  bnez AT, >1[m
[31m-  |.  sll TMP1, SFARG1HI, 11[m
[31m-  |  lui AT, 0x8000[m
[31m-  |  or TMP1, TMP1, AT[m
[31m-  |  srl AT, SFARG1LO, 21[m
[31m-  |  or TMP1, TMP1, AT[m
[31m-  |  slt AT, SFARG1HI, r0[m
[31m-  |  beqz AT, >2[m
[31m-  |.  srlv SFARG1LO, TMP1, TMP0[m
[31m-  |  subu SFARG1LO, r0, SFARG1LO[m
[31m-  |2:[m
[31m-  |  jr ra[m
[31m-  |.  move CRET1, SFARG1LO[m
[31m-  |1:[m
[31m-  |  addiu TMP0, TMP0, 21[m
[31m-  |  srlv TMP1, SFARG1LO, TMP0[m
[31m-  |  li AT, 20[m
[31m-  |  subu TMP0, AT, TMP0[m
[31m-  |  sll SFARG1LO, SFARG1HI, 12[m
[31m-  |  sllv AT, SFARG1LO, TMP0[m
[31m-  |  or SFARG1LO, TMP1, AT[m
[31m-  |  slt AT, SFARG1HI, r0[m
[31m-  |  beqz AT, <2[m
[31m-  |.  nop[m
[31m-  |  jr ra[m
[31m-  |.  subu CRET1, r0, SFARG1LO[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name[m
[31m-  |  .ffunc_1 bit_..name[m
[31m-  |  beq SFARG1HI, TISNUM, >6[m
[31m-  |.  move CRET1, SFARG1LO[m
[31m-  |  bal ->vm_tobit_fb[m
[31m-  |.  sltu TMP1, SFARG1HI, TISNUM[m
[31m-  |6:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name[m
[31m-  |  addiu TMP2, BASE, 8[m
[31m-  |  addu TMP3, BASE, NARGS8:RC[m
[31m-  |1:[m
[31m-  |  lw SFARG1HI, HI(TMP2)[m
[31m-  |  beq TMP2, TMP3, ->fff_resi[m
[31m-  |.  lw SFARG1LO, LO(TMP2)[m
[31m-  |.if FPU[m
[31m-  |  bne SFARG1HI, TISNUM, >2[m
[31m-  |.  addiu TMP2, TMP2, 8[m
[31m-  |  b <1[m
[31m-  |.  ins CRET1, CRET1, SFARG1LO[m
[31m-  |2:[m
[31m-  |   ldc1 FARG1, -8(TMP2)[m
[31m-  |  sltu TMP1, SFARG1HI, TISNUM[m
[31m-  |  beqz TMP1, ->fff_fallback[m
[31m-  |.  add.d FARG1, FARG1, TOBIT[m
[31m-  |  mfc1 SFARG1LO, FARG1[m
[31m-  |  b <1[m
[31m-  |.  ins CRET1, CRET1, SFARG1LO[m
[31m-  |.else[m
[31m-  |  beq SFARG1HI, TISNUM, >2[m
[31m-  |.  move CRET2, CRET1[m
[31m-  |  bal ->vm_tobit_fb[m
[31m-  |.  sltu TMP1, SFARG1HI, TISNUM[m
[31m-  |  move SFARG1LO, CRET2[m
[31m-  |2:[m
[31m-  |  ins CRET1, CRET1, SFARG1LO[m
[31m-  |  b <1[m
[31m-  |.  addiu TMP2, TMP2, 8[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op band, and[m
[31m-  |.ffunc_bit_op bor, or[m
[31m-  |.ffunc_bit_op bxor, xor[m
[31m-  |[m
[31m-  |.ffunc_bit bswap[m
[31m-  |  srl TMP0, CRET1, 24[m
[31m-  |   srl TMP2, CRET1, 8[m
[31m-  |  sll TMP1, CRET1, 24[m
[31m-  |   andi TMP2, TMP2, 0xff00[m
[31m-  |  or TMP0, TMP0, TMP1[m
[31m-  |   andi CRET1, CRET1, 0xff00[m
[31m-  |  or TMP0, TMP0, TMP2[m
[31m-  |   sll CRET1, CRET1, 8[m
[31m-  |  b ->fff_resi[m
[31m-  |.  or CRET1, TMP0, CRET1[m
[31m-  |[m
[31m-  |.ffunc_bit bnot[m
[31m-  |  b ->fff_resi[m
[31m-  |.  not CRET1, CRET1[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins, shmod[m
[31m-  |  .ffunc_2 bit_..name[m
[31m-  |  beq SFARG1HI, TISNUM, >1[m
[31m-  |.  nop[m
[31m-  |  bal ->vm_tobit_fb[m
[31m-  |.  sltu TMP1, SFARG1HI, TISNUM[m
[31m-  |  move SFARG1LO, CRET1[m
[31m-  |1:[m
[31m-  |  bne SFARG2HI, TISNUM, ->fff_fallback[m
[31m-  |.  nop[m
[31m-  |.if shmod == 1[m
[31m-  |  li AT, 32[m
[31m-  |  subu TMP0, AT, SFARG2LO[m
[31m-  |  sllv SFARG2LO, SFARG1LO, SFARG2LO[m
[31m-  |  srlv SFARG1LO, SFARG1LO, TMP0[m
[31m-  |.elif shmod == 2[m
[31m-  |  li AT, 32[m
[31m-  |  subu TMP0, AT, SFARG2LO[m
[31m-  |  srlv SFARG2LO, SFARG1LO, SFARG2LO[m
[31m-  |  sllv SFARG1LO, SFARG1LO, TMP0[m
[31m-  |.endif[m
[31m-  |  b ->fff_resi[m
[31m-  |.  ins CRET1, SFARG1LO, SFARG2LO[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh lshift, sllv, 0[m
[31m-  |.ffunc_bit_sh rshift, srlv, 0[m
[31m-  |.ffunc_bit_sh arshift, srav, 0[m
[31m-  |// Can't use rotrv, since it's only in MIPS32R2.[m
[31m-  |.ffunc_bit_sh rol, or, 1[m
[31m-  |.ffunc_bit_sh ror, or, 2[m
[31m-  |[m
[31m-  |.ffunc_bit tobit[m
[31m-  |->fff_resi:[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |  sw TISNUM, -8+HI(BASE)[m
[31m-  |  b ->fff_res1[m
[31m-  |.  sw CRET1, -8+LO(BASE)[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RB = CFUNC, RC = nargs*8[m
[31m-  |  lw TMP3, CFUNC:RB->f[m
[31m-  |    addu TMP1, BASE, NARGS8:RC[m
[31m-  |   lw PC, FRAME_PC(BASE)		// Fallback may overwrite PC.[m
[31m-  |    addiu TMP0, TMP1, 8*LUA_MINSTACK[m
[31m-  |     lw TMP2, L->maxstack[m
[31m-  |   sw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  sltu AT, TMP2, TMP0[m
[31m-  |     sw BASE, L->base[m
[31m-  |    sw TMP1, L->top[m
[31m-  |  bnez AT, >5			// Need to grow stack.[m
[31m-  |.  move CFUNCADDR, TMP3[m
[31m-  |  jalr TMP3				// (lua_State *L)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |  lw BASE, L->base[m
[31m-  |   sll RD, CRET1, 3[m
[31m-  |  bgtz CRET1, ->fff_res		// Returned nresults+1?[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |1:  // Returned 0 or -1: retry fast path.[m
[31m-  |  lw TMP0, L->top[m
[31m-  |   lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  bnez CRET1, ->vm_call_tail		// Returned -1?[m
[31m-  |.  subu NARGS8:RC, TMP0, BASE[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |   li AT, -4[m
[31m-  |  bnez TMP0, >3[m
[31m-  |.  and TMP1, PC, AT[m
[31m-  |  lbu TMP1, OFS_RA(PC)[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  addiu TMP1, TMP1, 8[m
[31m-  |3:[m
[31m-  |  b ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |.  subu TMP2, BASE, TMP1[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  load_got lj_state_growstack[m
[31m-  |  li CARG2, LUA_MINSTACK[m
[31m-  |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |.  move CARG1, L[m
[31m-  |  lw BASE, L->base[m
[31m-  |  b <1[m
[31m-  |.  li CRET1, 0			// Force retry.[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |  move MULTRES, ra[m
[31m-  |  load_got lj_gc_step[m
[31m-  |   sw BASE, L->base[m
[31m-  |  addu TMP0, BASE, NARGS8:RC[m
[31m-  |   sw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  sw TMP0, L->top[m
[31m-  |  call_intern lj_gc_step		// (lua_State *L)[m
[31m-  |.  move CARG1, L[m
[31m-  |   lw BASE, L->base[m
[31m-  |  move ra, MULTRES[m
[31m-  |    lw TMP0, L->top[m
[31m-  |  lw CFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  jr ra[m
[31m-  |.  subu NARGS8:RC, TMP0, BASE[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  andi AT, TMP3, HOOK_VMEVENT	// No recording while in vmevent.[m
[31m-  |  bnez AT, >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |.  lw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andi AT, TMP3, HOOK_ACTIVE[m
[31m-  |  bnez AT, >1[m
[31m-  |.  addiu TMP2, TMP2, -1[m
[31m-  |  andi AT, TMP3, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beqz AT, >1[m
[31m-  |.  nop[m
[31m-  |  b >1[m
[31m-  |.  sw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  andi AT, TMP3, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  beqz AT, >1[m
[31m-  |5:  // Re-dispatch to static ins.[m
[31m-  |.  lw AT, GG_DISP2STATIC(TMP0)	// Assumes TMP0 holds DISPATCH+OP*4.[m
[31m-  |  jr AT[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  lw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andi AT, TMP3, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  bnez AT, <5[m
[31m-  |.  andi AT, TMP3, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beqz AT, <5[m
[31m-  |.  addiu TMP2, TMP2, -1[m
[31m-  |  beqz TMP2, >1[m
[31m-  |.  sw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andi AT, TMP3, LUA_MASKLINE[m
[31m-  |  beqz AT, <5[m
[31m-  |1:[m
[31m-  |.  load_got lj_dispatch_ins[m
[31m-  |   sw MULTRES, SAVE_MULTRES[m
[31m-  |  move CARG2, PC[m
[31m-  |   sw BASE, L->base[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  call_intern lj_dispatch_ins	// (lua_State *L, const BCIns *pc)[m
[31m-  |.  move CARG1, L[m
[31m-  |3:[m
[31m-  |  lw BASE, L->base[m
[31m-  |4:  // Re-dispatch to static ins.[m
[31m-  |  lw INS, -4(PC)[m
[31m-  |  decode_OP4a TMP1, INS[m
[31m-  |  decode_OP4b TMP1[m
[31m-  |  addu TMP0, DISPATCH, TMP1[m
[31m-  |   decode_RD8a RD, INS[m
[31m-  |  lw AT, GG_DISP2STATIC(TMP0)[m
[31m-  |   decode_RA8a RA, INS[m
[31m-  |   decode_RD8b RD[m
[31m-  |  jr AT[m
[31m-  |   decode_RA8b RA[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  addiu PC, PC, 4[m
[31m-  |  b <4[m
[31m-  |.  lw MULTRES, -24+LO(RB)		// Restore MULTRES for *M ins.[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  lw LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-  |   addiu CARG1, DISPATCH, GG_DISP2J[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  lw TMP1, LFUNC:TMP1->pc[m
[31m-  |   move CARG2, PC[m
[31m-  |   sw L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  lbu TMP1, PC2PROTO(framesize)(TMP1)[m
[31m-  |  load_got lj_trace_hot[m
[31m-  |   sw BASE, L->base[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  addu TMP1, BASE, TMP1[m
[31m-  |  call_intern lj_trace_hot		// (jit_State *J, const BCIns *pc)[m
[31m-  |.  sw TMP1, L->top[m
[31m-  |  b <3[m
[31m-  |.  nop[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |.if JIT[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |.  move CARG2, PC[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  ori CARG2, PC, 1[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  load_got lj_dispatch_call[m
[31m-  |  addu TMP0, BASE, RC[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |   sw BASE, L->base[m
[31m-  |  subu RA, RA, BASE[m
[31m-  |   sw TMP0, L->top[m
[31m-  |  call_intern lj_dispatch_call	// (lua_State *L, const BCIns *pc)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns ASMFunction.[m
[31m-  |  lw BASE, L->base[m
[31m-  |   lw TMP0, L->top[m
[31m-  |   sw r0, SAVE_PC			// Invalidate for subsequent line hook.[m
[31m-  |  subu NARGS8:RC, TMP0, BASE[m
[31m-  |  addu RA, BASE, RA[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  jr CRET1[m
[31m-  |.  lw INS, -4(PC)[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // RA = resultptr, RB = meta base[m
[31m-  |  lw INS, -4(PC)[m
[31m-  |    lw TMP2, -24+LO(RB)		// Save previous trace.[m
[31m-  |  decode_RA8a RC, INS[m
[31m-  |   addiu AT, MULTRES, -8[m
[31m-  |  decode_RA8b RC[m
[31m-  |   beqz AT, >2[m
[31m-  |. addu RC, BASE, RC			// Call base.[m
[31m-  |1:  // Move results down.[m
[31m-  |  lw SFRETHI, HI(RA)[m
[31m-  |   lw SFRETLO, LO(RA)[m
[31m-  |   addiu AT, AT, -8[m
[31m-  |    addiu RA, RA, 8[m
[31m-  |  sw SFRETHI, HI(RC)[m
[31m-  |   sw SFRETLO, LO(RC)[m
[31m-  |   bnez AT, <1[m
[31m-  |.   addiu RC, RC, 8[m
[31m-  |2:[m
[31m-  |   decode_RA8a RA, INS[m
[31m-  |    decode_RB8a RB, INS[m
[31m-  |   decode_RA8b RA[m
[31m-  |    decode_RB8b RB[m
[31m-  |   addu RA, RA, RB[m
[31m-  |   addu RA, BASE, RA[m
[31m-  |3:[m
[31m-  |   sltu AT, RC, RA[m
[31m-  |   bnez AT, >9			// More results wanted?[m
[31m-  |.   nop[m
[31m-  |[m
[31m-  |  lhu TMP3, TRACE:TMP2->traceno[m
[31m-  |  lhu RD, TRACE:TMP2->link[m
[31m-  |  beq RD, TMP3, ->cont_nop		// Blacklisted.[m
[31m-  |.  load_got lj_dispatch_stitch[m
[31m-  |  bnez RD, =>BC_JLOOP		// Jump to stitched trace.[m
[31m-  |.  sll RD, RD, 3[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  sw TMP3, DISPATCH_J(exitno)(DISPATCH)[m
[31m-  |  sw L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  sw BASE, L->base[m
[31m-  |  addiu CARG1, DISPATCH, GG_DISP2J[m
[31m-  |  call_intern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)[m
[31m-  |.  move CARG2, PC[m
[31m-  |  b ->cont_nop[m
[31m-  |.  lw BASE, L->base[m
[31m-  |[m
[31m-  |9:[m
[31m-  |  sw TISNIL, HI(RC)[m
[31m-  |  b <3[m
[31m-  |.  addiu RC, RC, 8[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  load_got lj_dispatch_profile[m
[31m-  |   sw MULTRES, SAVE_MULTRES[m
[31m-  |  move CARG2, PC[m
[31m-  |   sw BASE, L->base[m
[31m-  |  call_intern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |  b ->cont_nop[m
[31m-  |.  lw BASE, L->base[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro savex_, a, b[m
[31m-  |.if FPU[m
[31m-  |  sdc1 f..a, 16+a*8(sp)[m
[31m-  |  sw r..a, 16+32*8+a*4(sp)[m
[31m-  |  sw r..b, 16+32*8+b*4(sp)[m
[31m-  |.else[m
[31m-  |  sw r..a, 16+a*4(sp)[m
[31m-  |  sw r..b, 16+b*4(sp)[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |.if FPU[m
[31m-  |  addiu sp, sp, -(16+32*8+32*4)[m
[31m-  |.else[m
[31m-  |  addiu sp, sp, -(16+32*4)[m
[31m-  |.endif[m
[31m-  |  savex_ 0, 1[m
[31m-  |  savex_ 2, 3[m
[31m-  |  savex_ 4, 5[m
[31m-  |  savex_ 6, 7[m
[31m-  |  savex_ 8, 9[m
[31m-  |  savex_ 10, 11[m
[31m-  |  savex_ 12, 13[m
[31m-  |  savex_ 14, 15[m
[31m-  |  savex_ 16, 17[m
[31m-  |  savex_ 18, 19[m
[31m-  |  savex_ 20, 21[m
[31m-  |  savex_ 22, 23[m
[31m-  |  savex_ 24, 25[m
[31m-  |  savex_ 26, 27[m
[31m-  |.if FPU[m
[31m-  |  sdc1 f28, 16+28*8(sp)[m
[31m-  |  sdc1 f30, 16+30*8(sp)[m
[31m-  |  sw r28, 16+32*8+28*4(sp)[m
[31m-  |  sw r30, 16+32*8+30*4(sp)[m
[31m-  |  sw r0, 16+32*8+31*4(sp)		// Clear RID_TMP.[m
[31m-  |  addiu TMP2, sp, 16+32*8+32*4	// Recompute original value of sp.[m
[31m-  |  sw TMP2, 16+32*8+29*4(sp)		// Store sp in RID_SP[m
[31m-  |.else[m
[31m-  |  sw r28, 16+28*4(sp)[m
[31m-  |  sw r30, 16+30*4(sp)[m
[31m-  |  sw r0, 16+31*4(sp)			// Clear RID_TMP.[m
[31m-  |  addiu TMP2, sp, 16+32*4		// Recompute original value of sp.[m
[31m-  |  sw TMP2, 16+29*4(sp)		// Store sp in RID_SP[m
[31m-  |.endif[m
[31m-  |  li_vmstate EXIT[m
[31m-  |  addiu DISPATCH, JGL, -GG_DISP2G-32768[m
[31m-  |  lw TMP1, 0(TMP2)			// Load exit number.[m
[31m-  |  st_vmstate[m
[31m-  |  lw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |   lw BASE, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  load_got lj_trace_exit[m
[31m-  |  sw L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  sw ra, DISPATCH_J(parent)(DISPATCH)  // Store trace number.[m
[31m-  |   sw BASE, L->base[m
[31m-  |  sw TMP1, DISPATCH_J(exitno)(DISPATCH)  // Store exit number.[m
[31m-  |  addiu CARG1, DISPATCH, GG_DISP2J[m
[31m-  |   sw r0, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  call_intern lj_trace_exit		// (jit_State *J, ExitState *ex)[m
[31m-  |.  addiu CARG2, sp, 16[m
[31m-  |  // Returns MULTRES (unscaled) or negated error code.[m
[31m-  |  lw TMP1, L->cframe[m
[31m-  |  li AT, -4[m
[31m-  |   lw BASE, L->base[m
[31m-  |  and sp, TMP1, AT[m
[31m-  |   lw PC, SAVE_PC			// Get SAVE_PC.[m
[31m-  |  b >1[m
[31m-  |.  sw L, SAVE_L			// Set SAVE_L (on-trace resume/yield).[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |.if JIT[m
[31m-  |  // CRET1 = MULTRES or negated error code, BASE, PC and JGL set.[m
[31m-  |  lw L, SAVE_L[m
[31m-  |   addiu DISPATCH, JGL, -GG_DISP2G-32768[m
[31m-  |  sw BASE, L->base[m
[31m-  |1:[m
[31m-  |  bltz CRET1, >9			// Check for error from exit.[m
[31m-  |.  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |    .FPU lui TMP3, 0x59c0			// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |  sll MULTRES, CRET1, 3[m
[31m-  |    li TISNIL, LJ_TNIL[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |  sw MULTRES, SAVE_MULTRES[m
[31m-  |    .FPU mtc1 TMP3, TOBIT[m
[31m-  |  lw TMP1, LFUNC:RB->pc[m
[31m-  |   sw r0, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |    .FPU cvt.d.s TOBIT, TOBIT[m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  lw INS, 0(PC)[m
[31m-  |   addiu PC, PC, 4[m
[31m-  |    // Assumes TISNIL == ~LJ_VMST_INTERP == -1[m
[31m-  |    sw TISNIL, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-  |  decode_OP4a TMP1, INS[m
[31m-  |  decode_OP4b TMP1[m
[31m-  |    sltiu TMP2, TMP1, BC_FUNCF*4[m
[31m-  |  addu TMP0, DISPATCH, TMP1[m
[31m-  |   decode_RD8a RD, INS[m
[31m-  |  lw AT, 0(TMP0)[m
[31m-  |   decode_RA8a RA, INS[m
[31m-  |    beqz TMP2, >2[m
[31m-  |.  decode_RA8b RA[m
[31m-  |  jr AT[m
[31m-  |.  decode_RD8b RD[m
[31m-  |2:[m
[31m-  |  sltiu TMP2, TMP1, (BC_FUNCC+2)*4	// Fast function?[m
[31m-  |  bnez TMP2, >3[m
[31m-  |.  lw TMP1, FRAME_PC(BASE)[m
[31m-  |  // Check frame below fast function.[m
[31m-  |  andi TMP0, TMP1, FRAME_TYPE[m
[31m-  |  bnez TMP0, >3			// Trace stitching continuation?[m
[31m-  |.  nop[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  lw TMP2, -4(TMP1)[m
[31m-  |  decode_RA8a TMP0, TMP2[m
[31m-  |  decode_RA8b TMP0[m
[31m-  |  subu TMP1, BASE, TMP0[m
[31m-  |  lw LFUNC:TMP2, -8+FRAME_FUNC(TMP1)[m
[31m-  |  lw TMP1, LFUNC:TMP2->pc[m
[31m-  |  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |3:[m
[31m-  |  addiu RC, MULTRES, -8[m
[31m-  |  jr AT[m
[31m-  |.  addu RA, RA, BASE[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  load_got lj_err_throw[m
[31m-  |  negu CARG2, CRET1[m
[31m-  |  call_intern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.  move CARG1, L[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Hard-float round to integer.[m
[31m-  |// Modifies AT, TMP0, FRET1, FRET2, f4. Keeps all others incl. FARG1.[m
[31m-  |.macro vm_round_hf, func[m
[31m-  |  lui TMP0, 0x4330			// Hiword of 2^52 (double).[m
[31m-  |  mtc1 r0, f4[m
[31m-  |  mtc1 TMP0, f5[m
[31m-  |  abs.d FRET2, FARG1			// |x|[m
[31m-  |    mfc1 AT, f13[m
[31m-  |  c.olt.d 0, FRET2, f4[m
[31m-  |   add.d FRET1, FRET2, f4		// (|x| + 2^52) - 2^52[m
[31m-  |  bc1f 0, >1				// Truncate only if |x| < 2^52.[m
[31m-  |.  sub.d FRET1, FRET1, f4[m
[31m-  |    slt AT, AT, r0[m
[31m-  |.if "func" == "ceil"[m
[31m-  |   lui TMP0, 0xbff0			// Hiword of -1 (double). Preserves -0.[m
[31m-  |.else[m
[31m-  |   lui TMP0, 0x3ff0			// Hiword of +1 (double).[m
[31m-  |.endif[m
[31m-  |.if "func" == "trunc"[m
[31m-  |   mtc1 TMP0, f5[m
[31m-  |  c.olt.d 0, FRET2, FRET1		// |x| < result?[m
[31m-  |   sub.d FRET2, FRET1, f4[m
[31m-  |  movt.d FRET1, FRET2, 0		// If yes, subtract +1.[m
[31m-  |  neg.d FRET2, FRET1[m
[31m-  |  jr ra[m
[31m-  |.  movn.d FRET1, FRET2, AT		// Merge sign bit back in.[m
[31m-  |.else[m
[31m-  |  neg.d FRET2, FRET1[m
[31m-  |   mtc1 TMP0, f5[m
[31m-  |  movn.d FRET1, FRET2, AT		// Merge sign bit back in.[m
[31m-  |.if "func" == "ceil"[m
[31m-  |  c.olt.d 0, FRET1, FARG1		// x > result?[m
[31m-  |.else[m
[31m-  |  c.olt.d 0, FARG1, FRET1		// x < result?[m
[31m-  |.endif[m
[31m-  |   sub.d FRET2, FRET1, f4		// If yes, subtract +-1.[m
[31m-  |  jr ra[m
[31m-  |.  movt.d FRET1, FRET2, 0[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  jr ra[m
[31m-  |.  mov.d FRET1, FARG1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro vm_round, func[m
[31m-  |.if FPU[m
[31m-  |  vm_round_hf, func[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |->vm_floor:[m
[31m-  |  vm_round floor[m
[31m-  |->vm_ceil:[m
[31m-  |  vm_round ceil[m
[31m-  |->vm_trunc:[m
[31m-  |.if JIT[m
[31m-  |  vm_round trunc[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |// Soft-float integer to number conversion.[m
[31m-  |.macro sfi2d, AHI, ALO[m
[31m-  |.if not FPU[m
[31m-  |  beqz ALO, >9			// Handle zero first.[m
[31m-  |.  sra TMP0, ALO, 31[m
[31m-  |  xor TMP1, ALO, TMP0[m
[31m-  |  subu TMP1, TMP1, TMP0		// Absolute value in TMP1.[m
[31m-  |  clz AHI, TMP1[m
[31m-  |    andi TMP0, TMP0, 0x800		// Mask sign bit.[m
[31m-  |  li AT, 0x3ff+31-1[m
[31m-  |   sllv TMP1, TMP1, AHI		// Align mantissa left with leading 1.[m
[31m-  |  subu AHI, AT, AHI			// Exponent - 1 in AHI.[m
[31m-  |   sll ALO, TMP1, 21[m
[31m-  |  or AHI, AHI, TMP0			// Sign | Exponent.[m
[31m-  |   srl TMP1, TMP1, 11[m
[31m-  |  sll AHI, AHI, 20			// Align left.[m
[31m-  |  jr ra[m
[31m-  |.  addu AHI, AHI, TMP1		// Add mantissa, increment exponent.[m
[31m-  |9:[m
[31m-  |  jr ra[m
[31m-  |.  li AHI, 0[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Input SFARG1LO. Output: SFARG1*. Temporaries: AT, TMP0, TMP1.[m
[31m-  |->vm_sfi2d_1:[m
[31m-  |  sfi2d SFARG1HI, SFARG1LO[m
[31m-  |[m
[31m-  |// Input SFARG2LO. Output: SFARG2*. Temporaries: AT, TMP0, TMP1.[m
[31m-  |->vm_sfi2d_2:[m
[31m-  |  sfi2d SFARG2HI, SFARG2LO[m
[31m-  |[m
[31m-  |// Soft-float comparison. Equivalent to c.eq.d.[m
[31m-  |// Input: SFARG*. Output: CRET1. Temporaries: AT, TMP0, TMP1.[m
[31m-  |->vm_sfcmpeq:[m
[31m-  |.if not FPU[m
[31m-  |  sll AT, SFARG1HI, 1[m
[31m-  |  sll TMP0, SFARG2HI, 1[m
[31m-  |  or CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  or TMP1, TMP1, CRET1[m
[31m-  |  beqz TMP1, >8			// Both args +-0: return 1.[m
[31m-  |.  sltu CRET1, r0, SFARG1LO[m
[31m-  |  lui TMP1, 0xffe0[m
[31m-  |  addu AT, AT, CRET1[m
[31m-  |   sltu CRET1, r0, SFARG2LO[m
[31m-  |  sltu AT, TMP1, AT[m
[31m-  |   addu TMP0, TMP0, CRET1[m
[31m-  |   sltu TMP0, TMP1, TMP0[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  bnez TMP1, >9			// Either arg is NaN: return 0;[m
[31m-  |.  xor TMP0, SFARG1HI, SFARG2HI[m
[31m-  |  xor TMP1, SFARG1LO, SFARG2LO[m
[31m-  |  or AT, TMP0, TMP1[m
[31m-  |  jr ra[m
[31m-  |.  sltiu CRET1, AT, 1		// Same values: return 1.[m
[31m-  |8:[m
[31m-  |  jr ra[m
[31m-  |.  li CRET1, 1[m
[31m-  |9:[m
[31m-  |  jr ra[m
[31m-  |.  li CRET1, 0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |// Soft-float comparison. Equivalent to c.ult.d and c.olt.d.[m
[31m-  |// Input: SFARG*. Output: CRET1. Temporaries: AT, TMP0, TMP1, CRET2.[m
[31m-  |->vm_sfcmpult:[m
[31m-  |.if not FPU[m
[31m-  |  b >1[m
[31m-  |.  li CRET2, 1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_sfcmpolt:[m
[31m-  |.if not FPU[m
[31m-  |  li CRET2, 0[m
[31m-  |1:[m
[31m-  |  sll AT, SFARG1HI, 1[m
[31m-  |  sll TMP0, SFARG2HI, 1[m
[31m-  |  or CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  or TMP1, TMP1, CRET1[m
[31m-  |  beqz TMP1, >8			// Both args +-0: return 0.[m
[31m-  |.  sltu CRET1, r0, SFARG1LO[m
[31m-  |  lui TMP1, 0xffe0[m
[31m-  |  addu AT, AT, CRET1[m
[31m-  |   sltu CRET1, r0, SFARG2LO[m
[31m-  |  sltu AT, TMP1, AT[m
[31m-  |   addu TMP0, TMP0, CRET1[m
[31m-  |   sltu TMP0, TMP1, TMP0[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  bnez TMP1, >9			// Either arg is NaN: return 0 or 1;[m
[31m-  |.  and AT, SFARG1HI, SFARG2HI[m
[31m-  |  bltz AT, >5			// Both args negative?[m
[31m-  |.  nop[m
[31m-  |  beq SFARG1HI, SFARG2HI, >8[m
[31m-  |.  sltu CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  jr ra[m
[31m-  |.  slt CRET1, SFARG1HI, SFARG2HI[m
[31m-  |5:  // Swap conditions if both operands are negative.[m
[31m-  |  beq SFARG1HI, SFARG2HI, >8[m
[31m-  |.  sltu CRET1, SFARG2LO, SFARG1LO[m
[31m-  |  jr ra[m
[31m-  |.  slt CRET1, SFARG2HI, SFARG1HI[m
[31m-  |8:[m
[31m-  |  jr ra[m
[31m-  |.  nop[m
[31m-  |9:[m
[31m-  |  jr ra[m
[31m-  |.  move CRET1, CRET2[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |// Soft-float comparison. Equivalent to c.ole.d a, b or c.ole.d b, a.[m
[31m-  |// Input: SFARG*, TMP3. Output: CRET1. Temporaries: AT, TMP0, TMP1.[m
[31m-  |->vm_sfcmpolex:[m
[31m-  |.if not FPU[m
[31m-  |  sll AT, SFARG1HI, 1[m
[31m-  |  sll TMP0, SFARG2HI, 1[m
[31m-  |  or CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  or TMP1, TMP1, CRET1[m
[31m-  |  beqz TMP1, >8			// Both args +-0: return 1.[m
[31m-  |.  sltu CRET1, r0, SFARG1LO[m
[31m-  |  lui TMP1, 0xffe0[m
[31m-  |  addu AT, AT, CRET1[m
[31m-  |   sltu CRET1, r0, SFARG2LO[m
[31m-  |  sltu AT, TMP1, AT[m
[31m-  |   addu TMP0, TMP0, CRET1[m
[31m-  |   sltu TMP0, TMP1, TMP0[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  bnez TMP1, >9			// Either arg is NaN: return 0;[m
[31m-  |.  and AT, SFARG1HI, SFARG2HI[m
[31m-  |  xor AT, AT, TMP3[m
[31m-  |  bltz AT, >5			// Both args negative?[m
[31m-  |.  nop[m
[31m-  |  beq SFARG1HI, SFARG2HI, >6[m
[31m-  |.  sltu CRET1, SFARG2LO, SFARG1LO[m
[31m-  |  jr ra[m
[31m-  |.  slt CRET1, SFARG2HI, SFARG1HI[m
[31m-  |5:  // Swap conditions if both operands are negative.[m
[31m-  |  beq SFARG1HI, SFARG2HI, >6[m
[31m-  |.  sltu CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  slt CRET1, SFARG1HI, SFARG2HI[m
[31m-  |6:[m
[31m-  |  jr ra[m
[31m-  |.  nop[m
[31m-  |8:[m
[31m-  |  jr ra[m
[31m-  |.  li CRET1, 1[m
[31m-  |9:[m
[31m-  |  jr ra[m
[31m-  |.  li CRET1, 0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.macro sfmin_max, name, intins[m
[31m-  |->vm_sf .. name:[m
[31m-  |.if JIT and not FPU[m
[31m-  |  move TMP2, ra[m
[31m-  |  bal ->vm_sfcmpolt[m
[31m-  |.  nop[m
[31m-  |  move TMP0, CRET1[m
[31m-  |  move SFRETHI, SFARG1HI[m
[31m-  |   move SFRETLO, SFARG1LO[m
[31m-  |  move ra, TMP2[m
[31m-  |  intins SFRETHI, SFARG2HI, TMP0[m
[31m-  |  jr ra[m
[31m-  |.  intins SFRETLO, SFARG2LO, TMP0[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  sfmin_max min, movz[m
[31m-  |  sfmin_max max, movn[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions. Callback slot number in r1, g in r2.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  saveregs[m
[31m-  |  lw CTSTATE, GL:r2->ctype_state[m
[31m-  |   addiu DISPATCH, r2, GG_G2DISP[m
[31m-  |  load_got lj_ccallback_enter[m
[31m-  |  sw r1, CTSTATE->cb.slot[m
[31m-  |  sw CARG1, CTSTATE->cb.gpr[0][m
[31m-  |  sw CARG2, CTSTATE->cb.gpr[1][m
[31m-  |   .FPU sdc1 FARG1, CTSTATE->cb.fpr[0][m
[31m-  |  sw CARG3, CTSTATE->cb.gpr[2][m
[31m-  |  sw CARG4, CTSTATE->cb.gpr[3][m
[31m-  |   .FPU sdc1 FARG2, CTSTATE->cb.fpr[1][m
[31m-  |  addiu TMP0, sp, CFRAME_SPACE+16[m
[31m-  |  sw TMP0, CTSTATE->cb.stack[m
[31m-  |  sw r0, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   move CARG2, sp[m
[31m-  |  call_intern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |.  move CARG1, CTSTATE[m
[31m-  |  // Returns lua_State *.[m
[31m-  |  lw BASE, L:CRET1->base[m
[31m-  |  lw RC, L:CRET1->top[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |   move L, CRET1[m
[31m-  |     .FPU lui TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |     .FPU mtc1 TMP3, TOBIT[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |  subu RC, RC, BASE[m
[31m-  |    st_vmstate[m
[31m-  |     .FPU cvt.d.s TOBIT, TOBIT[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  load_got lj_ccallback_leave[m
[31m-  |  lw CTSTATE, DISPATCH_GL(ctype_state)(DISPATCH)[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw RB, L->top[m
[31m-  |  sw L, CTSTATE->L[m
[31m-  |  move CARG2, RA[m
[31m-  |  call_intern lj_ccallback_leave	// (CTState *cts, TValue *o)[m
[31m-  |.  move CARG1, CTSTATE[m
[31m-  |   .FPU ldc1 FRET1, CTSTATE->cb.fpr[0][m
[31m-  |  lw CRET1, CTSTATE->cb.gpr[0][m
[31m-  |   .FPU ldc1 FRET2, CTSTATE->cb.fpr[1][m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.  lw CRET2, CTSTATE->cb.gpr[1][m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, CARG1[m
[31m-  |  lw TMP1, CCSTATE->spadj[m
[31m-  |   lbu CARG2, CCSTATE->nsp[m
[31m-  |  move TMP2, sp[m
[31m-  |  subu sp, sp, TMP1[m
[31m-  |  sw ra, -4(TMP2)[m
[31m-  |   sll CARG2, CARG2, 2[m
[31m-  |  sw r16, -8(TMP2)[m
[31m-  |  sw CCSTATE, -12(TMP2)[m
[31m-  |  move r16, TMP2[m
[31m-  |  addiu TMP1, CCSTATE, offsetof(CCallState, stack)[m
[31m-  |  addiu TMP2, sp, 16[m
[31m-  |  beqz CARG2, >2[m
[31m-  |.  addu TMP3, TMP1, CARG2[m
[31m-  |1:[m
[31m-  |   lw TMP0, 0(TMP1)[m
[31m-  |  addiu TMP1, TMP1, 4[m
[31m-  |  sltu AT, TMP1, TMP3[m
[31m-  |   sw TMP0, 0(TMP2)[m
[31m-  |  bnez AT, <1[m
[31m-  |.  addiu TMP2, TMP2, 4[m
[31m-  |2:[m
[31m-  |  lw CFUNCADDR, CCSTATE->func[m
[31m-  |  lw CARG2, CCSTATE->gpr[1][m
[31m-  |  lw CARG3, CCSTATE->gpr[2][m
[31m-  |  lw CARG4, CCSTATE->gpr[3][m
[31m-  |  .FPU ldc1 FARG1, CCSTATE->fpr[0][m
[31m-  |  .FPU ldc1 FARG2, CCSTATE->fpr[1][m
[31m-  |  jalr CFUNCADDR[m
[31m-  |.  lw CARG1, CCSTATE->gpr[0]		// Do this last, since CCSTATE is CARG1.[m
[31m-  |  lw CCSTATE:TMP1, -12(r16)[m
[31m-  |  lw TMP2, -8(r16)[m
[31m-  |  lw ra, -4(r16)[m
[31m-  |  sw CRET1, CCSTATE:TMP1->gpr[0][m
[31m-  |  sw CRET2, CCSTATE:TMP1->gpr[1][m
[31m-  |.if FPU[m
[31m-  |  sdc1 FRET1, CCSTATE:TMP1->fpr[0][m
[31m-  |  sdc1 FRET2, CCSTATE:TMP1->fpr[1][m
[31m-  |.else[m
[31m-  |  sw CARG1, CCSTATE:TMP1->gpr[2]	// Soft-float: complex double .im part.[m
[31m-  |  sw CARG2, CCSTATE:TMP1->gpr[3][m
[31m-  |.endif[m
[31m-  |  move sp, r16[m
[31m-  |  jr ra[m
[31m-  |.  move r16, TMP2[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1*8, RD = src2*8, JMP with RD = target[m
[31m-    |.macro bc_comp, FRA, FRD, RAHI, RALO, RDHI, RDLO, movop, fmovop, fcomp, sfcomp[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   addu RD, BASE, RD[m
[31m-    |  lw RAHI, HI(RA)[m
[31m-    |   lw RDHI, HI(RD)[m
[31m-    |    lhu TMP2, OFS_RD(PC)[m
[31m-    |    addiu PC, PC, 4[m
[31m-    |  bne RAHI, TISNUM, >2[m
[31m-    |.  lw RALO, LO(RA)[m
[31m-    |    lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  lw RDLO, LO(RD)[m
[31m-    |  bne RDHI, TISNUM, >5[m
[31m-    |.   decode_RD4b TMP2[m
[31m-    |  slt AT, SFARG1LO, SFARG2LO[m
[31m-    |    addu TMP2, TMP2, TMP3[m
[31m-    |  movop TMP2, r0, AT[m
[31m-    |1:[m
[31m-    |  addu PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // RA is not an integer.[m
[31m-    |  sltiu AT, RAHI, LJ_TISNUM[m
[31m-    |  beqz AT, ->vmeta_comp[m
[31m-    |.   lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  sltiu AT, RDHI, LJ_TISNUM[m
[31m-    |.if FPU[m
[31m-    |  ldc1 FRA, 0(RA)[m
[31m-    |   ldc1 FRD, 0(RD)[m
[31m-    |.else[m
[31m-    |   lw RDLO, LO(RD)[m
[31m-    |.endif[m
[31m-    |  beqz AT, >4[m
[31m-    |.   decode_RD4b TMP2[m
[31m-    |3:  // RA and RD are both numbers.[m
[31m-    |.if FPU[m
[31m-    |  fcomp f20, f22[m
[31m-    |   addu TMP2, TMP2, TMP3[m
[31m-    |  b <1[m
[31m-    |.  fmovop TMP2, r0[m
[31m-    |.else[m
[31m-    |  bal sfcomp[m
[31m-    |.   addu TMP2, TMP2, TMP3[m
[31m-    |  b <1[m
[31m-    |.  movop TMP2, r0, CRET1[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |4:  // RA is a number, RD is not a number.[m
[31m-    |  bne RDHI, TISNUM, ->vmeta_comp[m
[31m-    |  // RA is a number, RD is an integer. Convert RD to a number.[m
[31m-    |.if FPU[m
[31m-    |.  lwc1 FRD, LO(RD)[m
[31m-    |  b <3[m
[31m-    |.  cvt.d.w FRD, FRD[m
[31m-    |.else[m
[31m-    |.  nop[m
[31m-    |.if "RDHI" == "SFARG1HI"[m
[31m-    |  bal ->vm_sfi2d_1[m
[31m-    |.else[m
[31m-    |  bal ->vm_sfi2d_2[m
[31m-    |.endif[m
[31m-    |.  nop[m
[31m-    |  b <3[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |5:  // RA is an integer, RD is not an integer[m
[31m-    |  sltiu AT, RDHI, LJ_TISNUM[m
[31m-    |  beqz AT, ->vmeta_comp[m
[31m-    |  // RA is an integer, RD is a number. Convert RA to a number.[m
[31m-    |.if FPU[m
[31m-    |.  mtc1 RALO, FRA[m
[31m-    |   ldc1 FRD, 0(RD)[m
[31m-    |  b <3[m
[31m-    |   cvt.d.w FRA, FRA[m
[31m-    |.else[m
[31m-    |.  nop[m
[31m-    |.if "RAHI" == "SFARG1HI"[m
[31m-    |  bal ->vm_sfi2d_1[m
[31m-    |.else[m
[31m-    |  bal ->vm_sfi2d_2[m
[31m-    |.endif[m
[31m-    |.  nop[m
[31m-    |  b <3[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  bc_comp f20, f22, SFARG1HI, SFARG1LO, SFARG2HI, SFARG2LO, movz, movf, c.olt.d, ->vm_sfcmpolt[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  bc_comp f20, f22, SFARG1HI, SFARG1LO, SFARG2HI, SFARG2LO, movn, movt, c.olt.d, ->vm_sfcmpolt[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  bc_comp f22, f20, SFARG2HI, SFARG2LO, SFARG1HI, SFARG1LO, movn, movt, c.ult.d, ->vm_sfcmpult[m
[31m-    } else {[m
[31m-      |  bc_comp f22, f20, SFARG2HI, SFARG2LO, SFARG1HI, SFARG1LO, movz, movf, c.ult.d, ->vm_sfcmpult[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  // RA = src1*8, RD = src2*8, JMP with RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |    addiu PC, PC, 4[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |  lw SFARG1HI, HI(RA)[m
[31m-    |    lhu TMP2, -4+OFS_RD(PC)[m
[31m-    |  lw SFARG2HI, HI(RD)[m
[31m-    |    lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  sltu AT, TISNUM, SFARG1HI[m
[31m-    |  sltu TMP0, TISNUM, SFARG2HI[m
[31m-    |  or AT, AT, TMP0[m
[31m-    if (vk) {[m
[31m-      |  beqz AT, ->BC_ISEQN_Z[m
[31m-    } else {[m
[31m-      |  beqz AT, ->BC_ISNEN_Z[m
[31m-    }[m
[31m-    |.   decode_RD4b TMP2[m
[31m-    |  // Either or both types are not numbers.[m
[31m-    |  lw SFARG1LO, LO(RA)[m
[31m-    |  lw SFARG2LO, LO(RD)[m
[31m-    |  addu TMP2, TMP2, TMP3[m
[31m-    |.if FFI[m
[31m-    |  li TMP3, LJ_TCDATA[m
[31m-    |  beq SFARG1HI, TMP3, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |.  sltiu AT, SFARG1HI, LJ_TISPRI		// Not a primitive?[m
[31m-    |.if FFI[m
[31m-    |  beq SFARG2HI, TMP3, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |.  xor TMP3, SFARG1LO, SFARG2LO		// Same tv?[m
[31m-    |  xor SFARG2HI, SFARG2HI, SFARG1HI		// Same type?[m
[31m-    |  sltiu TMP0, SFARG1HI, LJ_TISTABUD+1	// Table or userdata?[m
[31m-    |  movz TMP3, r0, AT			// Ignore tv if primitive.[m
[31m-    |  movn TMP0, r0, SFARG2HI			// Tab/ud and same type?[m
[31m-    |  or AT, SFARG2HI, TMP3			// Same type && (pri||same tv).[m
[31m-    |  movz TMP0, r0, AT[m
[31m-    |  beqz TMP0, >1	// Done if not tab/ud or not same type or same tv.[m
[31m-    if (vk) {[m
[31m-      |.  movn TMP2, r0, AT[m
[31m-    } else {[m
[31m-      |.  movz TMP2, r0, AT[m
[31m-    }[m
[31m-    |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-    |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-    |  lw TAB:TMP1, TAB:SFARG1LO->metatable[m
[31m-    |  beqz TAB:TMP1, >1		// No metatable?[m
[31m-    |.  nop[m
[31m-    |  lbu TMP1, TAB:TMP1->nomm[m
[31m-    |  andi TMP1, TMP1, 1<<MM_eq[m
[31m-    |  bnez TMP1, >1			// Or 'no __eq' flag set?[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_equal			// Handle __eq metamethod.[m
[31m-    |.  li TMP0, 1-vk			// ne = 0 or 1.[m
[31m-    |1:[m
[31m-    |  addu PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  // RA = src*8, RD = str_const*8 (~), JMP with RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   addiu PC, PC, 4[m
[31m-    |  lw TMP0, HI(RA)[m
[31m-    |   srl RD, RD, 1[m
[31m-    |  lw STR:TMP3, LO(RA)[m
[31m-    |   subu RD, KBASE, RD[m
[31m-    |    lhu TMP2, -4+OFS_RD(PC)[m
[31m-    |.if FFI[m
[31m-    |  li AT, LJ_TCDATA[m
[31m-    |  beq TMP0, AT, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |.  lw STR:TMP1, -4(RD)		// KBASE-4-str_const*4[m
[31m-    |  addiu TMP0, TMP0, -LJ_TSTR[m
[31m-    |   decode_RD4b TMP2[m
[31m-    |  xor TMP1, STR:TMP1, STR:TMP3[m
[31m-    |  or TMP0, TMP0, TMP1[m
[31m-    |   lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |   addu TMP2, TMP2, TMP3[m
[31m-    if (vk) {[m
[31m-      |  movn TMP2, r0, TMP0[m
[31m-    } else {[m
[31m-      |  movz TMP2, r0, TMP0[m
[31m-    }[m
[31m-    |  addu PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  // RA = src*8, RD = num_const*8, JMP with RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   addu RD, KBASE, RD[m
[31m-    |  lw SFARG1HI, HI(RA)[m
[31m-    |   lw SFARG2HI, HI(RD)[m
[31m-    |    lhu TMP2, OFS_RD(PC)[m
[31m-    |    addiu PC, PC, 4[m
[31m-    |    lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |    decode_RD4b TMP2[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:[m
[31m-    }[m
[31m-    |  bne SFARG1HI, TISNUM, >3[m
[31m-    |.  lw SFARG1LO, LO(RA)[m
[31m-    |  lw SFARG2LO, LO(RD)[m
[31m-    |    addu TMP2, TMP2, TMP3[m
[31m-    |  bne SFARG2HI, TISNUM, >6[m
[31m-    |.  xor AT, SFARG1LO, SFARG2LO[m
[31m-    if (vk) {[m
[31m-      |  movn TMP2, r0, AT[m
[31m-      |1:[m
[31m-      |  addu PC, PC, TMP2[m
[31m-      |2:[m
[31m-    } else {[m
[31m-      |  movz TMP2, r0, AT[m
[31m-      |1:[m
[31m-      |2:[m
[31m-      |  addu PC, PC, TMP2[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // RA is not an integer.[m
[31m-    |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-    |.if FFI[m
[31m-    |  beqz AT, >8[m
[31m-    |.else[m
[31m-    |  beqz AT, <2[m
[31m-    |.endif[m
[31m-    |.   addu TMP2, TMP2, TMP3[m
[31m-    |  sltiu AT, SFARG2HI, LJ_TISNUM[m
[31m-    |.if FPU[m
[31m-    |  ldc1 f20, 0(RA)[m
[31m-    |   ldc1 f22, 0(RD)[m
[31m-    |.endif[m
[31m-    |  beqz AT, >5[m
[31m-    |.  lw SFARG2LO, LO(RD)[m
[31m-    |4:  // RA and RD are both numbers.[m
[31m-    |.if FPU[m
[31m-    |  c.eq.d f20, f22[m
[31m-    |  b <1[m
[31m-    if (vk) {[m
[31m-      |.  movf TMP2, r0[m
[31m-    } else {[m
[31m-      |.  movt TMP2, r0[m
[31m-    }[m
[31m-    |.else[m
[31m-    |  bal ->vm_sfcmpeq[m
[31m-    |.  nop[m
[31m-    |  b <1[m
[31m-    if (vk) {[m
[31m-      |.  movz TMP2, r0, CRET1[m
[31m-    } else {[m
[31m-      |.  movn TMP2, r0, CRET1[m
[31m-    }[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |5:  // RA is a number, RD is not a number.[m
[31m-    |.if FFI[m
[31m-    |  bne SFARG2HI, TISNUM, >9[m
[31m-    |.else[m
[31m-    |  bne SFARG2HI, TISNUM, <2[m
[31m-    |.endif[m
[31m-    |  // RA is a number, RD is an integer. Convert RD to a number.[m
[31m-    |.if FPU[m
[31m-    |.  lwc1 f22, LO(RD)[m
[31m-    |  b <4[m
[31m-    |.  cvt.d.w f22, f22[m
[31m-    |.else[m
[31m-    |.  nop[m
[31m-    |  bal ->vm_sfi2d_2[m
[31m-    |.  nop[m
[31m-    |  b <4[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |6:  // RA is an integer, RD is not an integer[m
[31m-    |  sltiu AT, SFARG2HI, LJ_TISNUM[m
[31m-    |.if FFI[m
[31m-    |  beqz AT, >9[m
[31m-    |.else[m
[31m-    |  beqz AT, <2[m
[31m-    |.endif[m
[31m-    |  // RA is an integer, RD is a number. Convert RA to a number.[m
[31m-    |.if FPU[m
[31m-    |.  mtc1 SFARG1LO, f20[m
[31m-    |   ldc1 f22, 0(RD)[m
[31m-    |  b <4[m
[31m-    |   cvt.d.w f20, f20[m
[31m-    |.else[m
[31m-    |.  nop[m
[31m-    |  bal ->vm_sfi2d_1[m
[31m-    |.  nop[m
[31m-    |  b <4[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |.if FFI[m
[31m-    |8:[m
[31m-    |  li AT, LJ_TCDATA[m
[31m-    |  bne SFARG1HI, AT, <2[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.  nop[m
[31m-    |9:[m
[31m-    |  li AT, LJ_TCDATA[m
[31m-    |  bne SFARG2HI, AT, <2[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   srl TMP1, RD, 3[m
[31m-    |  lw TMP0, HI(RA)[m
[31m-    |    lhu TMP2, OFS_RD(PC)[m
[31m-    |   not TMP1, TMP1[m
[31m-    |    addiu PC, PC, 4[m
[31m-    |.if FFI[m
[31m-    |  li AT, LJ_TCDATA[m
[31m-    |  beq TMP0, AT, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |.  xor TMP0, TMP0, TMP1[m
[31m-    |  decode_RD4b TMP2[m
[31m-    |  lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  addu TMP2, TMP2, TMP3[m
[31m-    if (vk) {[m
[31m-      |  movn TMP2, r0, TMP0[m
[31m-    } else {[m
[31m-      |  movz TMP2, r0, TMP0[m
[31m-    }[m
[31m-    |  addu PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  // RA = dst*8 or unused, RD = src*8, JMP with RD = target[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |   lhu TMP2, OFS_RD(PC)[m
[31m-    |  lw TMP0, HI(RD)[m
[31m-    |   addiu PC, PC, 4[m
[31m-    if (op == BC_IST || op == BC_ISF) {[m
[31m-      |  sltiu TMP0, TMP0, LJ_TISTRUECOND[m
[31m-      |   decode_RD4b TMP2[m
[31m-      |   lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-      |   addu TMP2, TMP2, TMP3[m
[31m-      if (op == BC_IST) {[m
[31m-	|  movz TMP2, r0, TMP0[m
[31m-      } else {[m
[31m-	|  movn TMP2, r0, TMP0[m
[31m-      }[m
[31m-      |  addu PC, PC, TMP2[m
[31m-    } else {[m
[31m-      |  sltiu TMP0, TMP0, LJ_TISTRUECOND[m
[31m-      |  lw SFRETHI, HI(RD)[m
[31m-      |   lw SFRETLO, LO(RD)[m
[31m-      if (op == BC_ISTC) {[m
[31m-	|  beqz TMP0, >1[m
[31m-      } else {[m
[31m-	|  bnez TMP0, >1[m
[31m-      }[m
[31m-      |.  addu RA, BASE, RA[m
[31m-      |   decode_RD4b TMP2[m
[31m-      |   lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-      |   addu TMP2, TMP2, TMP3[m
[31m-      |  sw SFRETHI, HI(RA)[m
[31m-      |   sw SFRETLO, LO(RA)[m
[31m-      |   addu PC, PC, TMP2[m
[31m-      |1:[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  // RA = src*8, RD = -type*8[m
[31m-    |  addu TMP2, BASE, RA[m
[31m-    |  srl TMP1, RD, 3[m
[31m-    |  lw TMP0, HI(TMP2)[m
[31m-    |  ins_next1[m
[31m-    |  addu AT, TMP0, TMP1[m
[31m-    |  bnez AT, ->vmeta_istype[m
[31m-    |.  ins_next2[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  // RA = src*8, RD = -(TISNUM-1)*8[m
[31m-    |  addu TMP2, BASE, RA[m
[31m-    |  lw TMP0, HI(TMP2)[m
[31m-    |  ins_next1[m
[31m-    |  sltiu AT, TMP0, LJ_TISNUM[m
[31m-    |  beqz AT, ->vmeta_istype[m
[31m-    |.  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  lw SFRETHI, HI(RD)[m
[31m-    |   lw SFRETLO, LO(RD)[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  lw TMP0, HI(RD)[m
[31m-    |   li TMP1, LJ_TFALSE[m
[31m-    |  sltiu TMP0, TMP0, LJ_TISTRUECOND[m
[31m-    |  addiu TMP1, TMP0, LJ_TTRUE[m
[31m-    |  ins_next1[m
[31m-    |  sw TMP1, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  addu RB, BASE, RD[m
[31m-    |  lw SFARG1HI, HI(RB)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  bne SFARG1HI, TISNUM, >2[m
[31m-    |.  lw SFARG1LO, LO(RB)[m
[31m-    |  lui TMP1, 0x8000[m
[31m-    |  beq SFARG1LO, TMP1, ->vmeta_unm	// Meta handler deals with -2^31.[m
[31m-    |.  negu SFARG1LO, SFARG1LO[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  sw SFARG1HI, HI(RA)[m
[31m-    |   sw SFARG1LO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |2:[m
[31m-    |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-    |  beqz AT, ->vmeta_unm[m
[31m-    |.  lui TMP1, 0x8000[m
[31m-    |  b <1[m
[31m-    |.  xor SFARG1HI, SFARG1HI, TMP1[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  addu CARG2, BASE, RD[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  lw TMP0, HI(CARG2)[m
[31m-    |   lw CARG1, LO(CARG2)[m
[31m-    |  li AT, LJ_TSTR[m
[31m-    |  bne TMP0, AT, >2[m
[31m-    |.  li AT, LJ_TTAB[m
[31m-    |   lw CRET1, STR:CARG1->len[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  sw TISNUM, HI(RA)[m
[31m-    |   sw CRET1, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |2:[m
[31m-    |  bne TMP0, AT, ->vmeta_len[m
[31m-    |.  nop[m
[31m-#if LJ_52[m
[31m-    |  lw TAB:TMP2, TAB:CARG1->metatable[m
[31m-    |  bnez TAB:TMP2, >9[m
[31m-    |.  nop[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  load_got lj_tab_len[m
[31m-    |  call_intern lj_tab_len		// (GCtab *t)[m
[31m-    |.  nop[m
[31m-    |  // Returns uint32_t (but less than 2^31).[m
[31m-    |  b <1[m
[31m-    |.  nop[m
[31m-#if LJ_52[m
[31m-    |9:[m
[31m-    |  lbu TMP0, TAB:TMP2->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_len[m
[31m-    |  bnez TMP0, <3			// 'no __len' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_len[m
[31m-    |.  nop[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro fpmod, a, b, c[m
[31m-    |  bal ->vm_floor     // floor(b/c)[m
[31m-    |.  div.d FARG1, b, c[m
[31m-    |  mul.d a, FRET1, c[m
[31m-    |  sub.d a, b, a      // b - floor(b/c)*c[m
[31m-    |.endmacro[m
[31m-[m
[31m-    |.macro sfpmod[m
[31m-    |  addiu sp, sp, -16[m
[31m-    |[m
[31m-    |  load_got __divdf3[m
[31m-    |  sw SFARG1HI, HI(sp)[m
[31m-    |   sw SFARG1LO, LO(sp)[m
[31m-    |  sw SFARG2HI, 8+HI(sp)[m
[31m-    |  call_extern[m
[31m-    |.  sw SFARG2LO, 8+LO(sp)[m
[31m-    |[m
[31m-    |  load_got floor[m
[31m-    |  move SFARG1HI, SFRETHI[m
[31m-    |  call_extern[m
[31m-    |.  move SFARG1LO, SFRETLO[m
[31m-    |[m
[31m-    |  load_got __muldf3[m
[31m-    |  move SFARG1HI, SFRETHI[m
[31m-    |   move SFARG1LO, SFRETLO[m
[31m-    |  lw SFARG2HI, 8+HI(sp)[m
[31m-    |  call_extern[m
[31m-    |.  lw SFARG2LO, 8+LO(sp)[m
[31m-    |[m
[31m-    |  load_got __subdf3[m
[31m-    |  lw SFARG1HI, HI(sp)[m
[31m-    |   lw SFARG1LO, LO(sp)[m
[31m-    |  move SFARG2HI, SFRETHI[m
[31m-    |  call_extern[m
[31m-    |.  move SFARG2LO, SFRETLO[m
[31m-    |[m
[31m-    |  addiu sp, sp, 16[m
[31m-    |.endmacro[m
[31m-[m
[31m-    |.macro ins_arithpre, label[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    |  // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   decode_RB8a RB, INS[m
[31m-    |   decode_RB8b RB[m
[31m-    |    decode_RDtoRC8 RC, RD[m
[31m-    |   // RA = dst*8, RB = src1*8, RC = num_const*8[m
[31m-    |   addu RB, BASE, RB[m
[31m-    |.if "label" ~= "none"[m
[31m-    |   b label[m
[31m-    |.endif[m
[31m-    |.   addu RC, KBASE, RC[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   decode_RB8a RC, INS[m
[31m-    |   decode_RB8b RC[m
[31m-    |    decode_RDtoRC8 RB, RD[m
[31m-    |   // RA = dst*8, RB = num_const*8, RC = src1*8[m
[31m-    |   addu RC, BASE, RC[m
[31m-    |.if "label" ~= "none"[m
[31m-    |   b label[m
[31m-    |.endif[m
[31m-    |.   addu RB, KBASE, RB[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   decode_RB8a RB, INS[m
[31m-    |   decode_RB8b RB[m
[31m-    |    decode_RDtoRC8 RC, RD[m
[31m-    |   // RA = dst*8, RB = src1*8, RC = src2*8[m
[31m-    |   addu RB, BASE, RB[m
[31m-    |.if "label" ~= "none"[m
[31m-    |   b label[m
[31m-    |.endif[m
[31m-    |.   addu RC, BASE, RC[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, intins, fpins, fpcall, label[m
[31m-    |  ins_arithpre none[m
[31m-    |[m
[31m-    |.if "label" ~= "none"[m
[31m-    |label:[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |  lw SFARG1HI, HI(RB)[m
[31m-    |   lw SFARG2HI, HI(RC)[m
[31m-    |[m
[31m-    |.if "intins" ~= "div"[m
[31m-    |[m
[31m-    |  // Check for two integers.[m
[31m-    |  lw SFARG1LO, LO(RB)[m
[31m-    |  bne SFARG1HI, TISNUM, >5[m
[31m-    |.  lw SFARG2LO, LO(RC)[m
[31m-    |  bne SFARG2HI, TISNUM, >5[m
[31m-    |[m
[31m-    |.if "intins" == "addu"[m
[31m-    |.  intins CRET1, SFARG1LO, SFARG2LO[m
[31m-    |  xor TMP1, CRET1, SFARG1LO	// ((y^a) & (y^b)) < 0: overflow.[m
[31m-    |  xor TMP2, CRET1, SFARG2LO[m
[31m-    |  and TMP1, TMP1, TMP2[m
[31m-    |  bltz TMP1, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.elif "intins" == "subu"[m
[31m-    |.  intins CRET1, SFARG1LO, SFARG2LO[m
[31m-    |  xor TMP1, CRET1, SFARG1LO	// ((y^a) & (a^b)) < 0: overflow.[m
[31m-    |  xor TMP2, SFARG1LO, SFARG2LO[m
[31m-    |  and TMP1, TMP1, TMP2[m
[31m-    |  bltz TMP1, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.elif "intins" == "mult"[m
[31m-    |.  intins SFARG1LO, SFARG2LO[m
[31m-    |  mflo CRET1[m
[31m-    |  mfhi TMP2[m
[31m-    |  sra TMP1, CRET1, 31[m
[31m-    |  bne TMP1, TMP2, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.else[m
[31m-    |.  load_got lj_vm_modi[m
[31m-    |  beqz SFARG2LO, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.if ENDIAN_BE[m
[31m-    |  move CARG1, SFARG1LO[m
[31m-    |.endif[m
[31m-    |  call_extern[m
[31m-    |.  move CARG2, SFARG2LO[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |  ins_next1[m
[31m-    |  sw TISNUM, HI(RA)[m
[31m-    |   sw CRET1, LO(RA)[m
[31m-    |3:[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |.elif not FPU[m
[31m-    |[m
[31m-    |  lw SFARG1LO, LO(RB)[m
[31m-    |   lw SFARG2LO, LO(RC)[m
[31m-    |[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |5:  // Check for two numbers.[m
[31m-    |  .FPU ldc1 f20, 0(RB)[m
[31m-    |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-    |   sltiu TMP0, SFARG2HI, LJ_TISNUM[m
[31m-    |  .FPU ldc1 f22, 0(RC)[m
[31m-    |   and AT, AT, TMP0[m
[31m-    |   beqz AT, ->vmeta_arith[m
[31m-    |.   addu RA, BASE, RA[m
[31m-    |[m
[31m-    |.if FPU[m
[31m-    |  fpins FRET1, f20, f22[m
[31m-    |.elif "fpcall" == "sfpmod"[m
[31m-    |  sfpmod[m
[31m-    |.else[m
[31m-    |  load_got fpcall[m
[31m-    |  call_extern[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |  ins_next1[m
[31m-    |.if not FPU[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |.endif[m
[31m-    |.if "intins" ~= "div"[m
[31m-    |  b <3[m
[31m-    |.endif[m
[31m-    |.if FPU[m
[31m-    |.  sdc1 FRET1, 0(RA)[m
[31m-    |.else[m
[31m-    |.  sw SFRETLO, LO(RA)[m
[31m-    |.endif[m
[31m-    |.if "intins" == "div"[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |.endmacro[m
[31m-[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arith addu, add.d, __adddf3, none[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arith subu, sub.d, __subdf3, none[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arith mult, mul.d, __muldf3, none[m
[31m-    break;[m
[31m-  case BC_DIVVN:[m
[31m-    |  ins_arith div, div.d, __divdf3, ->BC_DIVVN_Z[m
[31m-    break;[m
[31m-  case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arithpre ->BC_DIVVN_Z[m
[31m-    break;[m
[31m-  case BC_MODVN:[m
[31m-    |  ins_arith modi, fpmod, sfpmod, ->BC_MODVN_Z[m
[31m-    break;[m
[31m-  case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithpre ->BC_MODVN_Z[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  ins_arithpre none[m
[31m-    |  lw SFARG1HI, HI(RB)[m
[31m-    |   lw SFARG2HI, HI(RC)[m
[31m-    |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-    |  sltiu TMP0, SFARG2HI, LJ_TISNUM[m
[31m-    |  and AT, AT, TMP0[m
[31m-    |  load_got pow[m
[31m-    |  beqz AT, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.if FPU[m
[31m-    |  ldc1 FARG1, 0(RB)[m
[31m-    |  ldc1 FARG2, 0(RC)[m
[31m-    |.else[m
[31m-    |  lw SFARG1LO, LO(RB)[m
[31m-    |   lw SFARG2LO, LO(RC)[m
[31m-    |.endif[m
[31m-    |  call_extern[m
[31m-    |.  nop[m
[31m-    |  ins_next1[m
[31m-    |.if FPU[m
[31m-    |  sdc1 FRET1, 0(RA)[m
[31m-    |.else[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |.endif[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  // RA = dst*8, RB = src_start*8, RC = src_end*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  subu CARG3, RC, RB[m
[31m-    |   sw BASE, L->base[m
[31m-    |  addu CARG2, BASE, RC[m
[31m-    |  move MULTRES, RB[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  load_got lj_meta_cat[m
[31m-    |  srl CARG3, CARG3, 3[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  call_intern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |.  move CARG1, L[m
[31m-    |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-    |  bnez CRET1, ->vmeta_binop[m
[31m-    |.  lw BASE, L->base[m
[31m-    |  addu RB, BASE, MULTRES[m
[31m-    |  lw SFRETHI, HI(RB)[m
[31m-    |   lw SFRETLO, LO(RB)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  // RA = dst*8, RD = str_const*8 (~)[m
[31m-    |  srl TMP1, RD, 1[m
[31m-    |  subu TMP1, KBASE, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP0, -4(TMP1)		// KBASE-4-str_const*4[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   li TMP2, LJ_TSTR[m
[31m-    |  sw TMP0, LO(RA)[m
[31m-    |   sw TMP2, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  // RA = dst*8, RD = cdata_const*8 (~)[m
[31m-    |  srl TMP1, RD, 1[m
[31m-    |  subu TMP1, KBASE, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP0, -4(TMP1)		// KBASE-4-cdata_const*4[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   li TMP2, LJ_TCDATA[m
[31m-    |  sw TMP0, LO(RA)[m
[31m-    |   sw TMP2, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  // RA = dst*8, RD = int16_literal*8[m
[31m-    |  sra RD, INS, 16[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  ins_next1[m
[31m-    |  sw TISNUM, HI(RA)[m
[31m-    |   sw RD, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  // RA = dst*8, RD = num_const*8[m
[31m-    |  addu RD, KBASE, RD[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  lw SFRETHI, HI(RD)[m
[31m-    |   lw SFRETLO, LO(RD)[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  // RA = dst*8, RD = primitive_type*8 (~)[m
[31m-    |  srl TMP1, RD, 3[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  not TMP0, TMP1[m
[31m-    |  ins_next1[m
[31m-    |   sw TMP0, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  // RA = base*8, RD = end*8[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  sw TISNIL, HI(RA)[m
[31m-    |   addiu RA, RA, 8[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |1:[m
[31m-    |  sw TISNIL, HI(RA)[m
[31m-    |  slt AT, RA, RD[m
[31m-    |  bnez AT, <1[m
[31m-    |.  addiu RA, RA, 8[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  // RA = dst*8, RD = uvnum*8[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srl RD, RD, 1[m
[31m-    |   addu RD, RD, LFUNC:RB[m
[31m-    |  lw UPVAL:RB, LFUNC:RD->uvptr[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP1, UPVAL:RB->v[m
[31m-    |  lw SFRETHI, HI(TMP1)[m
[31m-    |   lw SFRETLO, LO(TMP1)[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-    |  // RA = uvnum*8, RD = src*8[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |    srl RA, RA, 1[m
[31m-    |   addu RD, BASE, RD[m
[31m-    |    addu RA, RA, LFUNC:RB[m
[31m-    |  lw UPVAL:RB, LFUNC:RA->uvptr[m
[31m-    |   lw SFRETHI, HI(RD)[m
[31m-    |    lw SFRETLO, LO(RD)[m
[31m-    |  lbu TMP3, UPVAL:RB->marked[m
[31m-    |   lw CARG2, UPVAL:RB->v[m
[31m-    |  andi TMP3, TMP3, LJ_GC_BLACK	// isblack(uv)[m
[31m-    |  lbu TMP0, UPVAL:RB->closed[m
[31m-    |   sw SFRETHI, HI(CARG2)[m
[31m-    |    sw SFRETLO, LO(CARG2)[m
[31m-    |  li AT, LJ_GC_BLACK|1[m
[31m-    |  or TMP3, TMP3, TMP0[m
[31m-    |  beq TMP3, AT, >2			// Upvalue is closed and black?[m
[31m-    |.  addiu TMP2, SFRETHI, -(LJ_TNUMX+1)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if new value is collectable.[m
[31m-    |  sltiu AT, TMP2, LJ_TISGCV - (LJ_TNUMX+1)[m
[31m-    |  beqz AT, <1			// tvisgcv(v)[m
[31m-    |.  nop[m
[31m-    |  lbu TMP3, GCOBJ:SFRETLO->gch.marked[m
[31m-    |  andi TMP3, TMP3, LJ_GC_WHITES	// iswhite(v)[m
[31m-    |  beqz TMP3, <1[m
[31m-    |.  load_got lj_gc_barrieruv[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  call_intern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |.  addiu CARG1, DISPATCH, GG_DISP2G[m
[31m-    |  b <1[m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_USETS:[m
[31m-    |  // RA = uvnum*8, RD = str_const*8 (~)[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |    srl RA, RA, 1[m
[31m-    |   srl TMP1, RD, 1[m
[31m-    |    addu RA, RA, LFUNC:RB[m
[31m-    |   subu TMP1, KBASE, TMP1[m
[31m-    |  lw UPVAL:RB, LFUNC:RA->uvptr[m
[31m-    |   lw STR:TMP1, -4(TMP1)		// KBASE-4-str_const*4[m
[31m-    |  lbu TMP2, UPVAL:RB->marked[m
[31m-    |   lw CARG2, UPVAL:RB->v[m
[31m-    |   lbu TMP3, STR:TMP1->marked[m
[31m-    |  andi AT, TMP2, LJ_GC_BLACK	// isblack(uv)[m
[31m-    |   lbu TMP2, UPVAL:RB->closed[m
[31m-    |   li TMP0, LJ_TSTR[m
[31m-    |   sw STR:TMP1, LO(CARG2)[m
[31m-    |  bnez AT, >2[m
[31m-    |.  sw TMP0, HI(CARG2)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  beqz TMP2, <1[m
[31m-    |.  andi AT, TMP3, LJ_GC_WHITES	// iswhite(str)[m
[31m-    |  beqz AT, <1[m
[31m-    |.  load_got lj_gc_barrieruv[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  call_intern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |.  addiu CARG1, DISPATCH, GG_DISP2G[m
[31m-    |  b <1[m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  // RA = uvnum*8, RD = num_const*8[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srl RA, RA, 1[m
[31m-    |    addu RD, KBASE, RD[m
[31m-    |   addu RA, RA, LFUNC:RB[m
[31m-    |   lw UPVAL:RB, LFUNC:RA->uvptr[m
[31m-    |    lw SFRETHI, HI(RD)[m
[31m-    |     lw SFRETLO, LO(RD)[m
[31m-    |   lw TMP1, UPVAL:RB->v[m
[31m-    |  ins_next1[m
[31m-    |    sw SFRETHI, HI(TMP1)[m
[31m-    |     sw SFRETLO, LO(TMP1)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  // RA = uvnum*8, RD = primitive_type*8 (~)[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srl RA, RA, 1[m
[31m-    |    srl TMP0, RD, 3[m
[31m-    |   addu RA, RA, LFUNC:RB[m
[31m-    |    not TMP0, TMP0[m
[31m-    |   lw UPVAL:RB, LFUNC:RA->uvptr[m
[31m-    |  ins_next1[m
[31m-    |   lw TMP1, UPVAL:RB->v[m
[31m-    |   sw TMP0, HI(TMP1)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_UCLO:[m
[31m-    |  // RA = level*8, RD = target[m
[31m-    |  lw TMP2, L->openupval[m
[31m-    |  branch_RD			// Do this first since RD is not saved.[m
[31m-    |  load_got lj_func_closeuv[m
[31m-    |   sw BASE, L->base[m
[31m-    |  beqz TMP2, >1[m
[31m-    |.  move CARG1, L[m
[31m-    |  call_intern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |.  addu CARG2, BASE, RA[m
[31m-    |  lw BASE, L->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  // RA = dst*8, RD = proto_const*8 (~) (holding function prototype)[m
[31m-    |  srl TMP1, RD, 1[m
[31m-    |  load_got lj_func_newL_gc[m
[31m-    |  subu TMP1, KBASE, TMP1[m
[31m-    |  lw CARG3, FRAME_FUNC(BASE)[m
[31m-    |  lw CARG2, -4(TMP1)		// KBASE-4-tab_const*4[m
[31m-    |   sw BASE, L->base[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  call_intern lj_func_newL_gc[m
[31m-    |.  move CARG1, L[m
[31m-    |  // Returns GCfuncL *.[m
[31m-    |  lw BASE, L->base[m
[31m-    |   li TMP0, LJ_TFUNC[m
[31m-    |  ins_next1[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  sw LFUNC:CRET1, LO(RA)[m
[31m-    |   sw TMP0, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-  case BC_TDUP:[m
[31m-    |  // RA = dst*8, RD = (hbits|asize)*8 | tab_const*8 (~)[m
[31m-    |  lw TMP0, DISPATCH_GL(gc.total)(DISPATCH)[m
[31m-    |  lw TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)[m
[31m-    |   sw BASE, L->base[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  sltu AT, TMP0, TMP1[m
[31m-    |  beqz AT, >5[m
[31m-    |1:[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |  load_got lj_tab_new[m
[31m-      |  srl CARG2, RD, 3[m
[31m-      |  andi CARG2, CARG2, 0x7ff[m
[31m-      |  li TMP0, 0x801[m
[31m-      |  addiu AT, CARG2, -0x7ff[m
[31m-      |   srl CARG3, RD, 14[m
[31m-      |  movz CARG2, TMP0, AT[m
[31m-      |  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-      |  call_intern lj_tab_new[m
[31m-      |.  move CARG1, L[m
[31m-      |  // Returns Table *.[m
[31m-    } else {[m
[31m-      |  load_got lj_tab_dup[m
[31m-      |  srl TMP1, RD, 1[m
[31m-      |  subu TMP1, KBASE, TMP1[m
[31m-      |  move CARG1, L[m
[31m-      |  call_intern lj_tab_dup		// (lua_State *L, Table *kt)[m
[31m-      |.  lw CARG2, -4(TMP1)		// KBASE-4-str_const*4[m
[31m-      |  // Returns Table *.[m
[31m-    }[m
[31m-    |  lw BASE, L->base[m
[31m-    |  ins_next1[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   li TMP0, LJ_TTAB[m
[31m-    |  sw TAB:CRET1, LO(RA)[m
[31m-    |   sw TMP0, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    |5:[m
[31m-    |  load_got lj_gc_step_fixtop[m
[31m-    |  move MULTRES, RD[m
[31m-    |  call_intern lj_gc_step_fixtop	// (lua_State *L)[m
[31m-    |.  move CARG1, L[m
[31m-    |  b <1[m
[31m-    |.  move RD, MULTRES[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  // RA = dst*8, RD = str_const*8 (~)[m
[31m-  case BC_GSET:[m
[31m-    |  // RA = src*8, RD = str_const*8 (~)[m
[31m-    |  lw LFUNC:TMP2, FRAME_FUNC(BASE)[m
[31m-    |   srl TMP1, RD, 1[m
[31m-    |   subu TMP1, KBASE, TMP1[m
[31m-    |  lw TAB:RB, LFUNC:TMP2->env[m
[31m-    |  lw STR:RC, -4(TMP1)		// KBASE-4-str_const*4[m
[31m-    if (op == BC_GGET) {[m
[31m-      |  b ->BC_TGETS_Z[m
[31m-    } else {[m
[31m-      |  b ->BC_TSETS_Z[m
[31m-    }[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   addu CARG3, BASE, RC[m
[31m-    |  lw TMP1, HI(CARG2)[m
[31m-    |   lw TMP2, HI(CARG3)[m
[31m-    |    lw TAB:RB, LO(CARG2)[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |  bne TMP1, AT, ->vmeta_tgetv[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |  bne TMP2, TISNUM, >5[m
[31m-    |.  lw RC, LO(CARG3)[m
[31m-    |  lw TMP0, TAB:RB->asize[m
[31m-    |   lw TMP1, TAB:RB->array[m
[31m-    |  sltu AT, RC, TMP0[m
[31m-    |   sll TMP2, RC, 3[m
[31m-    |  beqz AT, ->vmeta_tgetv		// Integer key and in array part?[m
[31m-    |.  addu TMP2, TMP1, TMP2[m
[31m-    |  lw SFRETHI, HI(TMP2)[m
[31m-    |  beq SFRETHI, TISNIL, >2[m
[31m-    |.  lw SFRETLO, LO(TMP2)[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, <1		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP0, TAB:TMP2->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_index[m
[31m-    |  bnez TMP0, <1			// 'no __index' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  li AT, LJ_TSTR[m
[31m-    |  bne TMP2, AT, ->vmeta_tgetv[m
[31m-    |.  nop[m
[31m-    |  b ->BC_TGETS_Z			// String key?[m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = str_const*4 (~)[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   decode_RC4a RC, INS[m
[31m-    |  lw TMP0, HI(CARG2)[m
[31m-    |   decode_RC4b RC[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |   lw TAB:RB, LO(CARG2)[m
[31m-    |   subu CARG3, KBASE, RC[m
[31m-    |   lw STR:RC, -4(CARG3)		// KBASE-4-str_const*4[m
[31m-    |  bne TMP0, AT, ->vmeta_tgets1[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |->BC_TGETS_Z:[m
[31m-    |  // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8[m
[31m-    |  lw TMP0, TAB:RB->hmask[m
[31m-    |  lw TMP1, STR:RC->hash[m
[31m-    |  lw NODE:TMP2, TAB:RB->node[m
[31m-    |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-    |  sll TMP0, TMP1, 5[m
[31m-    |  sll TMP1, TMP1, 3[m
[31m-    |  subu TMP1, TMP0, TMP1[m
[31m-    |  addu NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-    |1:[m
[31m-    |  lw CARG1, offsetof(Node, key)+HI(NODE:TMP2)[m
[31m-    |   lw TMP0, offsetof(Node, key)+LO(NODE:TMP2)[m
[31m-    |    lw NODE:TMP1, NODE:TMP2->next[m
[31m-    |    lw SFRETHI, offsetof(Node, val)+HI(NODE:TMP2)[m
[31m-    |  addiu CARG1, CARG1, -LJ_TSTR[m
[31m-    |   xor TMP0, TMP0, STR:RC[m
[31m-    |  or AT, CARG1, TMP0[m
[31m-    |  bnez AT, >4[m
[31m-    |.  lw TAB:TMP3, TAB:RB->metatable[m
[31m-    |    beq SFRETHI, TISNIL, >5	// Key found, but nil value?[m
[31m-    |.    lw SFRETLO, offsetof(Node, val)+LO(NODE:TMP2)[m
[31m-    |3:[m
[31m-    |  ins_next1[m
[31m-    |    sw SFRETHI, HI(RA)[m
[31m-    |     sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  bnez NODE:TMP1, <1[m
[31m-    |.  move NODE:TMP2, NODE:TMP1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  beqz TAB:TMP3, <3		// No metatable: done.[m
[31m-    |.  li SFRETHI, LJ_TNIL[m
[31m-    |  lbu TMP0, TAB:TMP3->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_index[m
[31m-    |  bnez TMP0, <3			// 'no __index' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tgets[m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = index*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  lw CARG1, HI(CARG2)[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |   lw TAB:RB, LO(CARG2)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  bne CARG1, AT, ->vmeta_tgetb[m
[31m-    |.  srl TMP0, RC, 3[m
[31m-    |  lw TMP1, TAB:RB->asize[m
[31m-    |   lw TMP2, TAB:RB->array[m
[31m-    |  sltu AT, TMP0, TMP1[m
[31m-    |  beqz AT, ->vmeta_tgetb[m
[31m-    |.  addu RC, TMP2, RC[m
[31m-    |  lw SFRETHI, HI(RC)[m
[31m-    |  beq SFRETHI, TISNIL, >5[m
[31m-    |.  lw SFRETLO, LO(RC)[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, <1		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP1, TAB:TMP2->nomm[m
[31m-    |  andi TMP1, TMP1, 1<<MM_index[m
[31m-    |  bnez TMP1, <1			// 'no __index' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tgetb			// Caveat: preserve TMP0 and CARG2![m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  addu RB, BASE, RB[m
[31m-    |   addu RC, BASE, RC[m
[31m-    |  lw TAB:CARG1, LO(RB)[m
[31m-    |   lw CARG2, LO(RC)[m
[31m-    |    addu RA, BASE, RA[m
[31m-    |  lw TMP0, TAB:CARG1->asize[m
[31m-    |   lw TMP1, TAB:CARG1->array[m
[31m-    |  sltu AT, CARG2, TMP0[m
[31m-    |   sll TMP2, CARG2, 3[m
[31m-    |  beqz AT, ->vmeta_tgetr		// In array part?[m
[31m-    |.  addu CRET1, TMP1, TMP2[m
[31m-    |  lw SFARG2HI, HI(CRET1)[m
[31m-    |   lw SFARG2LO, LO(CRET1)[m
[31m-    |->BC_TGETR_Z:[m
[31m-    |  ins_next1[m
[31m-    |  sw SFARG2HI, HI(RA)[m
[31m-    |   sw SFARG2LO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  // RA = src*8, RB = table*8, RC = key*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   addu CARG3, BASE, RC[m
[31m-    |  lw TMP1, HI(CARG2)[m
[31m-    |   lw TMP2, HI(CARG3)[m
[31m-    |    lw TAB:RB, LO(CARG2)[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |  bne TMP1, AT, ->vmeta_tsetv[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |  bne TMP2, TISNUM, >5[m
[31m-    |.  lw RC, LO(CARG3)[m
[31m-    |  lw TMP0, TAB:RB->asize[m
[31m-    |   lw TMP1, TAB:RB->array[m
[31m-    |  sltu AT, RC, TMP0[m
[31m-    |   sll TMP2, RC, 3[m
[31m-    |  beqz AT, ->vmeta_tsetv		// Integer key and in array part?[m
[31m-    |.  addu TMP1, TMP1, TMP2[m
[31m-    |  lw TMP0, HI(TMP1)[m
[31m-    |   lbu TMP3, TAB:RB->marked[m
[31m-    |  lw SFRETHI, HI(RA)[m
[31m-    |  beq TMP0, TISNIL, >3[m
[31m-    |.  lw SFRETLO, LO(RA)[m
[31m-    |1:[m
[31m-    |   andi AT, TMP3, LJ_GC_BLACK  // isblack(table)[m
[31m-    |  sw SFRETHI, HI(TMP1)[m
[31m-    |  bnez AT, >7[m
[31m-    |.  sw SFRETLO, LO(TMP1)[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, <1		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP2, TAB:TMP2->nomm[m
[31m-    |  andi TMP2, TMP2, 1<<MM_newindex[m
[31m-    |  bnez TMP2, <1			// 'no __newindex' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  li AT, LJ_TSTR[m
[31m-    |  bne TMP2, AT, ->vmeta_tsetv[m
[31m-    |.  nop[m
[31m-    |  b ->BC_TSETS_Z			// String key?[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0, <2[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  // RA = src*8, RB = table*8, RC = str_const*8 (~)[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   decode_RC4a RC, INS[m
[31m-    |  lw TMP0, HI(CARG2)[m
[31m-    |   decode_RC4b RC[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |   subu CARG3, KBASE, RC[m
[31m-    |    lw TAB:RB, LO(CARG2)[m
[31m-    |   lw STR:RC, -4(CARG3)		// KBASE-4-str_const*4[m
[31m-    |  bne TMP0, AT, ->vmeta_tsets1[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |->BC_TSETS_Z:[m
[31m-    |  // TAB:RB = GCtab *, STR:RC = GCstr *, RA = BASE+src*8[m
[31m-    |  lw TMP0, TAB:RB->hmask[m
[31m-    |  lw TMP1, STR:RC->hash[m
[31m-    |  lw NODE:TMP2, TAB:RB->node[m
[31m-    |   sb r0, TAB:RB->nomm		// Clear metamethod cache.[m
[31m-    |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-    |  sll TMP0, TMP1, 5[m
[31m-    |  sll TMP1, TMP1, 3[m
[31m-    |  subu TMP1, TMP0, TMP1[m
[31m-    |  addu NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-    |.if FPU[m
[31m-    |   ldc1 f20, 0(RA)[m
[31m-    |.else[m
[31m-    |   lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  lw CARG1, offsetof(Node, key)+HI(NODE:TMP2)[m
[31m-    |   lw TMP0, offsetof(Node, key)+LO(NODE:TMP2)[m
[31m-    |  li AT, LJ_TSTR[m
[31m-    |    lw NODE:TMP1, NODE:TMP2->next[m
[31m-    |  bne CARG1, AT, >5[m
[31m-    |.   lw CARG2, offsetof(Node, val)+HI(NODE:TMP2)[m
[31m-    |   bne TMP0, STR:RC, >5[m
[31m-    |.    lbu TMP3, TAB:RB->marked[m
[31m-    |    beq CARG2, TISNIL, >4		// Key found, but nil value?[m
[31m-    |.    lw TAB:TMP0, TAB:RB->metatable[m
[31m-    |2:[m
[31m-    |  andi AT, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |.if FPU[m
[31m-    |  bnez AT, >7[m
[31m-    |.  sdc1 f20, NODE:TMP2->val[m
[31m-    |.else[m
[31m-    |   sw SFRETHI, NODE:TMP2->val.u32.hi[m
[31m-    |  bnez AT, >7[m
[31m-    |.   sw SFRETLO, NODE:TMP2->val.u32.lo[m
[31m-    |.endif[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  beqz TAB:TMP0, <2		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP0, TAB:TMP0->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_newindex[m
[31m-    |  bnez TMP0, <2			// 'no __newindex' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tsets[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  bnez NODE:TMP1, <1[m
[31m-    |.  move NODE:TMP2, NODE:TMP1[m
[31m-    |  // End of hash chain: key not found, add a new one[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, >6		// No metatable: continue.[m
[31m-    |.  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-    |  lbu TMP0, TAB:TMP2->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_newindex[m
[31m-    |  beqz TMP0, ->vmeta_tsets		// 'no __newindex' flag NOT set: check.[m
[31m-    |.  li AT, LJ_TSTR[m
[31m-    |6:[m
[31m-    |  load_got lj_tab_newkey[m
[31m-    |  sw STR:RC, LO(CARG3)[m
[31m-    |  sw AT, HI(CARG3)[m
[31m-    |   sw BASE, L->base[m
[31m-    |  move CARG2, TAB:RB[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  call_intern lj_tab_newkey	// (lua_State *L, GCtab *t, TValue *k[m
[31m-    |.  move CARG1, L[m
[31m-    |  // Returns TValue *.[m
[31m-    |  lw BASE, L->base[m
[31m-    |.if FPU[m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |.  sdc1 f20, 0(CRET1)[m
[31m-    |.else[m
[31m-    |  lw SFARG1HI, HI(RA)[m
[31m-    |   lw SFARG1LO, LO(RA)[m
[31m-    |  sw SFARG1HI, HI(CRET1)[m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |.  sw SFARG1LO, LO(CRET1)[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0, <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  // RA = src*8, RB = table*8, RC = index*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  lw CARG1, HI(CARG2)[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |   lw TAB:RB, LO(CARG2)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  bne CARG1, AT, ->vmeta_tsetb[m
[31m-    |.  srl TMP0, RC, 3[m
[31m-    |  lw TMP1, TAB:RB->asize[m
[31m-    |   lw TMP2, TAB:RB->array[m
[31m-    |  sltu AT, TMP0, TMP1[m
[31m-    |  beqz AT, ->vmeta_tsetb[m
[31m-    |.  addu RC, TMP2, RC[m
[31m-    |  lw TMP1, HI(RC)[m
[31m-    |   lbu TMP3, TAB:RB->marked[m
[31m-    |  beq TMP1, TISNIL, >5[m
[31m-    |1:[m
[31m-    |.  lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |  andi AT, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |   sw SFRETHI, HI(RC)[m
[31m-    |  bnez AT, >7[m
[31m-    |.   sw SFRETLO, LO(RC)[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, <1		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP1, TAB:TMP2->nomm[m
[31m-    |  andi TMP1, TMP1, 1<<MM_newindex[m
[31m-    |  bnez TMP1, <1			// 'no __newindex' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tsetb			// Caveat: preserve TMP0 and CARG2![m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0, <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  addu CARG1, BASE, RB[m
[31m-    |   addu CARG3, BASE, RC[m
[31m-    |  lw TAB:CARG2, LO(CARG1)[m
[31m-    |   lw CARG3, LO(CARG3)[m
[31m-    |  lbu TMP3, TAB:CARG2->marked[m
[31m-    |   lw TMP0, TAB:CARG2->asize[m
[31m-    |    lw TMP1, TAB:CARG2->array[m
[31m-    |  andi AT, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  bnez AT, >7[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |2:[m
[31m-    |  sltu AT, CARG3, TMP0[m
[31m-    |   sll TMP2, CARG3, 3[m
[31m-    |  beqz AT, ->vmeta_tsetr		// In array part?[m
[31m-    |.  addu CRET1, TMP1, TMP2[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |  lw SFARG1HI, HI(RA)[m
[31m-    |   lw SFARG1LO, LO(RA)[m
[31m-    |  ins_next1[m
[31m-    |  sw SFARG1HI, HI(CRET1)[m
[31m-    |   sw SFARG1LO, LO(CRET1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0, <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  // RA = base*8 (table at base-1), RD = num_const*8 (start index)[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |1:[m
[31m-    |   addu TMP3, KBASE, RD[m
[31m-    |  lw TAB:CARG2, -8+LO(RA)		// Guaranteed to be a table.[m
[31m-    |    addiu TMP0, MULTRES, -8[m
[31m-    |   lw TMP3, LO(TMP3)		// Integer constant is in lo-word.[m
[31m-    |    beqz TMP0, >4			// Nothing to copy?[m
[31m-    |.    srl CARG3, TMP0, 3[m
[31m-    |  addu CARG3, CARG3, TMP3[m
[31m-    |  lw TMP2, TAB:CARG2->asize[m
[31m-    |   sll TMP1, TMP3, 3[m
[31m-    |    lbu TMP3, TAB:CARG2->marked[m
[31m-    |   lw CARG1, TAB:CARG2->array[m
[31m-    |  sltu AT, TMP2, CARG3[m
[31m-    |  bnez AT, >5[m
[31m-    |.  addu TMP2, RA, TMP0[m
[31m-    |   addu TMP1, TMP1, CARG1[m
[31m-    |  andi TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |   lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |    addiu RA, RA, 8[m
[31m-    |  sltu AT, RA, TMP2[m
[31m-    |   sw SFRETHI, HI(TMP1)[m
[31m-    |    sw SFRETLO, LO(TMP1)[m
[31m-    |  bnez AT, <3[m
[31m-    |.   addiu TMP1, TMP1, 8[m
[31m-    |  bnez TMP0, >7[m
[31m-    |. nop[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |  load_got lj_tab_reasize[m
[31m-    |   sw BASE, L->base[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  move BASE, RD[m
[31m-    |  call_intern lj_tab_reasize	// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |.  move CARG1, L[m
[31m-    |  // Must not reallocate the stack.[m
[31m-    |  move RD, BASE[m
[31m-    |  b <1[m
[31m-    |.  lw BASE, L->base	// Reload BASE for lack of a saved register.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP3, TMP0, <4[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALLM:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8,) RC = extra_nargs*8[m
[31m-    |  decode_RDtoRC8 NARGS8:RC, RD[m
[31m-    |  b ->BC_CALL_Z[m
[31m-    |.  addu NARGS8:RC, NARGS8:RC, MULTRES[m
[31m-    break;[m
[31m-  case BC_CALL:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8[m
[31m-    |  decode_RDtoRC8 NARGS8:RC, RD[m
[31m-    |->BC_CALL_Z:[m
[31m-    |  move TMP2, BASE[m
[31m-    |  addu BASE, BASE, RA[m
[31m-    |   li AT, LJ_TFUNC[m
[31m-    |  lw TMP0, HI(BASE)[m
[31m-    |   lw LFUNC:RB, LO(BASE)[m
[31m-    |   addiu BASE, BASE, 8[m
[31m-    |  bne TMP0, AT, ->vmeta_call[m
[31m-    |.  addiu NARGS8:RC, NARGS8:RC, -8[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = extra_nargs*8[m
[31m-    |  addu NARGS8:RD, NARGS8:RD, MULTRES	// BC_CALLT gets RC from RD.[m
[31m-    |  // Fall through. Assumes BC_CALLT follows.[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = (nargs+1)*8[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   li AT, LJ_TFUNC[m
[31m-    |  lw TMP0, HI(RA)[m
[31m-    |   lw LFUNC:RB, LO(RA)[m
[31m-    |   move NARGS8:RC, RD[m
[31m-    |    lw TMP1, FRAME_PC(BASE)[m
[31m-    |   addiu RA, RA, 8[m
[31m-    |  bne TMP0, AT, ->vmeta_callt[m
[31m-    |.  addiu NARGS8:RC, NARGS8:RC, -8[m
[31m-    |->BC_CALLT_Z:[m
[31m-    |  andi TMP0, TMP1, FRAME_TYPE	// Caveat: preserve TMP0 until the 'or'.[m
[31m-    |   lbu TMP3, LFUNC:RB->ffid[m
[31m-    |  bnez TMP0, >7[m
[31m-    |.  xori TMP2, TMP1, FRAME_VARG[m
[31m-    |1:[m
[31m-    |  sw LFUNC:RB, FRAME_FUNC(BASE)	// Copy function down, but keep PC.[m
[31m-    |  sltiu AT, TMP3, 2		// (> FF_C) Calling a fast function?[m
[31m-    |  move TMP2, BASE[m
[31m-    |  beqz NARGS8:RC, >3[m
[31m-    |.  move TMP3, NARGS8:RC[m
[31m-    |2:[m
[31m-    |   lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |    addiu RA, RA, 8[m
[31m-    |  addiu TMP3, TMP3, -8[m
[31m-    |   sw SFRETHI, HI(TMP2)[m
[31m-    |    sw SFRETLO, LO(TMP2)[m
[31m-    |  bnez TMP3, <2[m
[31m-    |.   addiu TMP2, TMP2, 8[m
[31m-    |3:[m
[31m-    |  or TMP0, TMP0, AT[m
[31m-    |  beqz TMP0, >5[m
[31m-    |.  nop[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function with a Lua frame below.[m
[31m-    |  lw INS, -4(TMP1)[m
[31m-    |  decode_RA8a RA, INS[m
[31m-    |  decode_RA8b RA[m
[31m-    |  subu TMP1, BASE, RA[m
[31m-    |  lw LFUNC:TMP1, -8+FRAME_FUNC(TMP1)[m
[31m-    |  lw TMP1, LFUNC:TMP1->pc[m
[31m-    |  b <4[m
[31m-    |.  lw KBASE, PC2PROTO(k)(TMP1)	// Need to prepare KBASE.[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  andi AT, TMP2, FRAME_TYPEP[m
[31m-    |  bnez AT, <1			// Vararg frame below?[m
[31m-    |.  subu TMP2, BASE, TMP2		// Relocate BASE down.[m
[31m-    |  move BASE, TMP2[m
[31m-    |  lw TMP1, FRAME_PC(TMP2)[m
[31m-    |  b <1[m
[31m-    |.  andi TMP0, TMP1, FRAME_TYPE[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8))[m
[31m-    |  move TMP2, BASE[m
[31m-    |  addu BASE, BASE, RA[m
[31m-    |   li AT, LJ_TFUNC[m
[31m-    |  lw TMP1, -24+HI(BASE)[m
[31m-    |   lw LFUNC:RB, -24+LO(BASE)[m
[31m-    |    lw SFARG1HI, -16+HI(BASE)[m
[31m-    |     lw SFARG1LO, -16+LO(BASE)[m
[31m-    |    lw SFARG2HI, -8+HI(BASE)[m
[31m-    |     lw SFARG2LO, -8+LO(BASE)[m
[31m-    |  sw TMP1, HI(BASE)		// Copy callable.[m
[31m-    |   sw LFUNC:RB, LO(BASE)[m
[31m-    |    sw SFARG1HI, 8+HI(BASE)	// Copy state.[m
[31m-    |     sw SFARG1LO, 8+LO(BASE)[m
[31m-    |    sw SFARG2HI, 16+HI(BASE)	// Copy control var.[m
[31m-    |     sw SFARG2LO, 16+LO(BASE)[m
[31m-    |   addiu BASE, BASE, 8[m
[31m-    |  bne TMP1, AT, ->vmeta_call[m
[31m-    |.  li NARGS8:RC, 16		// Iterators get 2 arguments.[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8)[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  lw TAB:RB, -16+LO(RA)[m
[31m-    |  lw RC, -8+LO(RA)			// Get index from control var.[m
[31m-    |  lw TMP0, TAB:RB->asize[m
[31m-    |  lw TMP1, TAB:RB->array[m
[31m-    |   addiu PC, PC, 4[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  sltu AT, RC, TMP0[m
[31m-    |  beqz AT, >5			// Index points after array part?[m
[31m-    |.  sll TMP3, RC, 3[m
[31m-    |  addu TMP3, TMP1, TMP3[m
[31m-    |  lw SFARG1HI, HI(TMP3)[m
[31m-    |   lw SFARG1LO, LO(TMP3)[m
[31m-    |     lhu RD, -4+OFS_RD(PC)[m
[31m-    |  sw TISNUM, HI(RA)[m
[31m-    |   sw RC, LO(RA)[m
[31m-    |  beq SFARG1HI, TISNIL, <1		// Skip holes in array part.[m
[31m-    |.  addiu RC, RC, 1[m
[31m-    |  sw SFARG1HI, 8+HI(RA)[m
[31m-    |   sw SFARG1LO, 8+LO(RA)[m
[31m-    |     lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |     decode_RD4b RD[m
[31m-    |     addu RD, RD, TMP3[m
[31m-    |   sw RC, -8+LO(RA)		// Update control var.[m
[31m-    |     addu PC, PC, RD[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  lw TMP1, TAB:RB->hmask[m
[31m-    |  subu RC, RC, TMP0[m
[31m-    |   lw TMP2, TAB:RB->node[m
[31m-    |6:[m
[31m-    |  sltu AT, TMP1, RC		// End of iteration? Branch to ITERL+1.[m
[31m-    |  bnez AT, <3[m
[31m-    |.  sll TMP3, RC, 5[m
[31m-    |   sll RB, RC, 3[m
[31m-    |   subu TMP3, TMP3, RB[m
[31m-    |  addu NODE:TMP3, TMP3, TMP2[m
[31m-    |  lw SFARG1HI, NODE:TMP3->val.u32.hi[m
[31m-    |   lw SFARG1LO, NODE:TMP3->val.u32.lo[m
[31m-    |     lhu RD, -4+OFS_RD(PC)[m
[31m-    |  beq SFARG1HI, TISNIL, <6		// Skip holes in hash part.[m
[31m-    |.  addiu RC, RC, 1[m
[31m-    |  lw SFARG2HI, NODE:TMP3->key.u32.hi[m
[31m-    |   lw SFARG2LO, NODE:TMP3->key.u32.lo[m
[31m-    |     lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  sw SFARG1HI, 8+HI(RA)[m
[31m-    |   sw SFARG1LO, 8+LO(RA)[m
[31m-    |    addu RC, RC, TMP0[m
[31m-    |     decode_RD4b RD[m
[31m-    |     addu RD, RD, TMP3[m
[31m-    |  sw SFARG2HI, HI(RA)[m
[31m-    |   sw SFARG2LO, LO(RA)[m
[31m-    |     addu PC, PC, RD[m
[31m-    |  b <3[m
[31m-    |.  sw RC, -8+LO(RA)		// Update control var.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  // RA = base*8, RD = target (points to ITERN)[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |    srl TMP0, RD, 1[m
[31m-    |  lw CARG1, -24+HI(RA)[m
[31m-    |  lw CFUNC:CARG2, -24+LO(RA)[m
[31m-    |    addu TMP0, PC, TMP0[m
[31m-    |   lw CARG3, -16+HI(RA)[m
[31m-    |   lw CARG4, -8+HI(RA)[m
[31m-    |  li AT, LJ_TFUNC[m
[31m-    |  bne CARG1, AT, >5[m
[31m-    |.   lui TMP2, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  lbu CARG2, CFUNC:CARG2->ffid[m
[31m-    |   addiu CARG3, CARG3, -LJ_TTAB[m
[31m-    |   addiu CARG4, CARG4, -LJ_TNIL[m
[31m-    |   or CARG3, CARG3, CARG4[m
[31m-    |  addiu CARG2, CARG2, -FF_next_N[m
[31m-    |  or CARG2, CARG2, CARG3[m
[31m-    |  bnez CARG2, >5[m
[31m-    |.  lui TMP1, 0xfffe[m
[31m-    |  addu PC, TMP0, TMP2[m
[31m-    |  ori TMP1, TMP1, 0x7fff[m
[31m-    |  sw r0, -8+LO(RA)			// Initialize control var.[m
[31m-    |  sw TMP1, -8+HI(RA)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  li TMP3, BC_JMP[m
[31m-    |   li TMP1, BC_ITERC[m
[31m-    |  sb TMP3, -4+OFS_OP(PC)[m
[31m-    |    addu PC, TMP0, TMP2[m
[31m-    |  b <1[m
[31m-    |.  sb TMP1, OFS_OP(PC)[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  // RA = base*8, RB = (nresults+1)*8, RC = numparams*8[m
[31m-    |  lw TMP0, FRAME_PC(BASE)[m
[31m-    |  decode_RDtoRC8 RC, RD[m
[31m-    |   decode_RB8a RB, INS[m
[31m-    |  addu RC, BASE, RC[m
[31m-    |   decode_RB8b RB[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  addiu RC, RC, FRAME_VARG[m
[31m-    |   addu TMP2, RA, RB[m
[31m-    |  addiu TMP3, BASE, -8		// TMP3 = vtop[m
[31m-    |  subu RC, RC, TMP0		// RC = vbase[m
[31m-    |  // Note: RC may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  beqz RB, >5			// Copy all varargs?[m
[31m-    |.  subu TMP1, TMP3, RC[m
[31m-    |  addiu TMP2, TMP2, -16[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  lw CARG1, HI(RC)[m
[31m-    |  sltu AT, RC, TMP3[m
[31m-    |   lw CARG2, LO(RC)[m
[31m-    |    addiu RC, RC, 8[m
[31m-    |  movz CARG1, TISNIL, AT[m
[31m-    |  sw CARG1, HI(RA)[m
[31m-    |   sw CARG2, LO(RA)[m
[31m-    |  sltu AT, RA, TMP2[m
[31m-    |  bnez AT, <1[m
[31m-    |.   addiu RA, RA, 8[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  lw TMP0, L->maxstack[m
[31m-    |  blez TMP1, <3			// No vararg slots?[m
[31m-    |.  li MULTRES, 8			// MULTRES = (0+1)*8[m
[31m-    |  addu TMP2, RA, TMP1[m
[31m-    |  sltu AT, TMP0, TMP2[m
[31m-    |  bnez AT, >7[m
[31m-    |.  addiu MULTRES, TMP1, 8[m
[31m-    |6:[m
[31m-    |  lw SFRETHI, HI(RC)[m
[31m-    |   lw SFRETLO, LO(RC)[m
[31m-    |   addiu RC, RC, 8[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  sltu AT, RC, TMP3[m
[31m-    |  bnez AT, <6			// More vararg slots?[m
[31m-    |.  addiu RA, RA, 8[m
[31m-    |  b <3[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  load_got lj_state_growstack[m
[31m-    |   sw RA, L->top[m
[31m-    |  subu RA, RA, BASE[m
[31m-    |   sw BASE, L->base[m
[31m-    |  subu BASE, RC, BASE		// Need delta, because BASE may change.[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  srl CARG2, TMP1, 3[m
[31m-    |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |.  move CARG1, L[m
[31m-    |  move RC, BASE[m
[31m-    |  lw BASE, L->base[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  addu RC, BASE, RC[m
[31m-    |  b <6[m
[31m-    |.  addiu TMP3, BASE, -8[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  // RA = results*8, RD = extra_nresults*8[m
[31m-    |  addu RD, RD, MULTRES		// MULTRES >= 8, so RD >= 8.[m
[31m-    |  // Fall through. Assumes BC_RET follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET:[m
[31m-    |  // RA = results*8, RD = (nresults+1)*8[m
[31m-    |  lw PC, FRAME_PC(BASE)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |    move MULTRES, RD[m
[31m-    |1:[m
[31m-    |  andi TMP0, PC, FRAME_TYPE[m
[31m-    |  bnez TMP0, ->BC_RETV_Z[m
[31m-    |.  xori TMP1, PC, FRAME_VARG[m
[31m-    |[m
[31m-    |->BC_RET_Z:[m
[31m-    |  // BASE = base, RA = resultptr, RD = (nresults+1)*8, PC = return[m
[31m-    |   lw INS, -4(PC)[m
[31m-    |    addiu TMP2, BASE, -8[m
[31m-    |    addiu RC, RD, -8[m
[31m-    |  decode_RA8a TMP0, INS[m
[31m-    |   decode_RB8a RB, INS[m
[31m-    |  decode_RA8b TMP0[m
[31m-    |   decode_RB8b RB[m
[31m-    |   addu TMP3, TMP2, RB[m
[31m-    |  beqz RC, >3[m
[31m-    |.  subu BASE, TMP2, TMP0[m
[31m-    |2:[m
[31m-    |   lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |    addiu RA, RA, 8[m
[31m-    |  addiu RC, RC, -8[m
[31m-    |   sw SFRETHI, HI(TMP2)[m
[31m-    |    sw SFRETLO, LO(TMP2)[m
[31m-    |  bnez RC, <2[m
[31m-    |.   addiu TMP2, TMP2, 8[m
[31m-    |3:[m
[31m-    |  addiu TMP3, TMP3, -8[m
[31m-    |5:[m
[31m-    |  sltu AT, TMP2, TMP3[m
[31m-    |  bnez AT, >6[m
[31m-    |.  lw LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP1, LFUNC:TMP1->pc[m
[31m-    |  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  sw TISNIL, HI(TMP2)[m
[31m-    |  b <5[m
[31m-    |.  addiu TMP2, TMP2, 8[m
[31m-    |[m
[31m-    |->BC_RETV_Z:  // Non-standard return case.[m
[31m-    |  andi TMP2, TMP1, FRAME_TYPEP[m
[31m-    |  bnez TMP2, ->vm_return[m
[31m-    |.  nop[m
[31m-    |  // Return from vararg function: relocate BASE down.[m
[31m-    |  subu BASE, BASE, TMP1[m
[31m-    |  b <1[m
[31m-    |.  lw PC, FRAME_PC(BASE)[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET0: case BC_RET1:[m
[31m-    |  // RA = results*8, RD = (nresults+1)*8[m
[31m-    |  lw PC, FRAME_PC(BASE)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |    move MULTRES, RD[m
[31m-    |  andi TMP0, PC, FRAME_TYPE[m
[31m-    |  bnez TMP0, ->BC_RETV_Z[m
[31m-    |.  xori TMP1, PC, FRAME_VARG[m
[31m-    |[m
[31m-    |  lw INS, -4(PC)[m
[31m-    |   addiu TMP2, BASE, -8[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  lw SFRETHI, HI(RA)[m
[31m-      |   lw SFRETLO, LO(RA)[m
[31m-    }[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |   decode_RA8a RA, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RA8b RA[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  sw SFRETHI, HI(TMP2)[m
[31m-      |   sw SFRETLO, LO(TMP2)[m
[31m-    }[m
[31m-    |   subu BASE, TMP2, RA[m
[31m-    |5:[m
[31m-    |  sltu AT, RD, RB[m
[31m-    |  bnez AT, >6[m
[31m-    |.  lw LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP1, LFUNC:TMP1->pc[m
[31m-    |  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  addiu TMP2, TMP2, 8[m
[31m-    |  addiu RD, RD, 8[m
[31m-    |  b <5[m
[31m-    if (op == BC_RET1) {[m
[31m-      |.  sw TISNIL, HI(TMP2)[m
[31m-    } else {[m
[31m-      |.  sw TISNIL, -8+HI(TMP2)[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IFORL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    |  // RA = base*8, RD = target (after end of loop or start of loop)[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  lw SFARG1HI, FORL_IDX*8+HI(RA)[m
[31m-    |   lw SFARG1LO, FORL_IDX*8+LO(RA)[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  srl RD, RD, 1[m
[31m-      |  lui TMP2, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-      |  addu TMP2, RD, TMP2[m
[31m-    }[m
[31m-    if (!vk) {[m
[31m-      |  lw SFARG2HI, FORL_STOP*8+HI(RA)[m
[31m-      |   lw SFARG2LO, FORL_STOP*8+LO(RA)[m
[31m-      |  bne SFARG1HI, TISNUM, >5[m
[31m-      |.  lw SFRETHI, FORL_STEP*8+HI(RA)[m
[31m-      |  xor AT, SFARG2HI, TISNUM[m
[31m-      |   lw SFRETLO, FORL_STEP*8+LO(RA)[m
[31m-      |  xor TMP0, SFRETHI, TISNUM[m
[31m-      |  or AT, AT, TMP0[m
[31m-      |  bnez AT, ->vmeta_for[m
[31m-      |.  slt AT, SFRETLO, r0[m
[31m-      |  slt CRET1, SFARG2LO, SFARG1LO[m
[31m-      |  slt TMP1, SFARG1LO, SFARG2LO[m
[31m-      |  movn CRET1, TMP1, AT[m
[31m-    } else {[m
[31m-      |  bne SFARG1HI, TISNUM, >5[m
[31m-      |.  lw SFARG2LO, FORL_STEP*8+LO(RA)[m
[31m-      |  lw SFRETLO, FORL_STOP*8+LO(RA)[m
[31m-      |  move TMP3, SFARG1LO[m
[31m-      |  addu SFARG1LO, SFARG1LO, SFARG2LO[m
[31m-      |  xor TMP0, SFARG1LO, TMP3[m
[31m-      |  xor TMP1, SFARG1LO, SFARG2LO[m
[31m-      |  and TMP0, TMP0, TMP1[m
[31m-      |  slt TMP1, SFARG1LO, SFRETLO[m
[31m-      |  slt CRET1, SFRETLO, SFARG1LO[m
[31m-      |  slt AT, SFARG2LO, r0[m
[31m-      |   slt TMP0, TMP0, r0		// ((y^a) & (y^b)) < 0: overflow.[m
[31m-      |  movn CRET1, TMP1, AT[m
[31m-      |   or CRET1, CRET1, TMP0[m
[31m-    }[m
[31m-    |1:[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  movz TMP2, r0, CRET1[m
[31m-      |  addu PC, PC, TMP2[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  addu PC, PC, TMP2[m
[31m-      |  lhu RD, -4+OFS_RD(PC)[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  movn TMP2, r0, CRET1[m
[31m-      |  addu PC, PC, TMP2[m
[31m-    }[m
[31m-    if (vk) {[m
[31m-      |  sw SFARG1HI, FORL_IDX*8+HI(RA)[m
[31m-      |   sw SFARG1LO, FORL_IDX*8+LO(RA)[m
[31m-    }[m
[31m-    |  ins_next1[m
[31m-    |  sw SFARG1HI, FORL_EXT*8+HI(RA)[m
[31m-    |   sw SFARG1LO, FORL_EXT*8+LO(RA)[m
[31m-    |2:[m
[31m-    if (op == BC_JFORI) {[m
[31m-      |  beqz CRET1, =>BC_JLOOP[m
[31m-      |.  decode_RD8b RD[m
[31m-    } else if (op == BC_JFORL) {[m
[31m-      |  beqz CRET1, =>BC_JLOOP[m
[31m-    }[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |5:  // FP loop.[m
[31m-    |.if FPU[m
[31m-    if (!vk) {[m
[31m-      |  ldc1 f0, FORL_IDX*8(RA)[m
[31m-      |   ldc1 f2, FORL_STOP*8(RA)[m
[31m-      |  sltiu TMP0, SFARG1HI, LJ_TISNUM[m
[31m-      |  sltiu TMP1, SFARG2HI, LJ_TISNUM[m
[31m-      |  sltiu AT, SFRETHI, LJ_TISNUM[m
[31m-      |  and TMP0, TMP0, TMP1[m
[31m-      |  and AT, AT, TMP0[m
[31m-      |  beqz AT, ->vmeta_for[m
[31m-      |.  slt TMP3, SFRETHI, r0[m
[31m-      |  c.ole.d 0, f0, f2[m
[31m-      |  c.ole.d 1, f2, f0[m
[31m-      |  li CRET1, 1[m
[31m-      |  movt CRET1, r0, 0[m
[31m-      |  movt AT, r0, 1[m
[31m-      |  b <1[m
[31m-      |.  movn CRET1, AT, TMP3[m
[31m-    } else {[m
[31m-      |  ldc1 f0, FORL_IDX*8(RA)[m
[31m-      |   ldc1 f4, FORL_STEP*8(RA)[m
[31m-      |    ldc1 f2, FORL_STOP*8(RA)[m
[31m-      |   lw SFARG2HI, FORL_STEP*8+HI(RA)[m
[31m-      |  add.d f0, f0, f4[m
[31m-      |  c.ole.d 0, f0, f2[m
[31m-      |  c.ole.d 1, f2, f0[m
[31m-      |   slt TMP3, SFARG2HI, r0[m
[31m-      |  li CRET1, 1[m
[31m-      |  li AT, 1[m
[31m-      |  movt CRET1, r0, 0[m
[31m-      |  movt AT, r0, 1[m
[31m-      |  movn CRET1, AT, TMP3[m
[31m-      if (op == BC_IFORL) {[m
[31m-	|  movn TMP2, r0, CRET1[m
[31m-	|  addu PC, PC, TMP2[m
[31m-      }[m
[31m-      |  sdc1 f0, FORL_IDX*8(RA)[m
[31m-      |  ins_next1[m
[31m-      |  b <2[m
[31m-      |.  sdc1 f0, FORL_EXT*8(RA)[m
[31m-    }[m
[31m-    |.else[m
[31m-    if (!vk) {[m
[31m-      |  sltiu TMP0, SFARG1HI, LJ_TISNUM[m
[31m-      |  sltiu TMP1, SFARG2HI, LJ_TISNUM[m
[31m-      |  sltiu AT, SFRETHI, LJ_TISNUM[m
[31m-      |  and TMP0, TMP0, TMP1[m
[31m-      |  and AT, AT, TMP0[m
[31m-      |  beqz AT, ->vmeta_for[m
[31m-      |.  nop[m
[31m-      |  bal ->vm_sfcmpolex[m
[31m-      |.  move TMP3, SFRETHI[m
[31m-      |  b <1[m
[31m-      |.  nop[m
[31m-    } else {[m
[31m-      |   lw SFARG2HI, FORL_STEP*8+HI(RA)[m
[31m-      |  load_got __adddf3[m
[31m-      |  call_extern[m
[31m-      |.  sw TMP2, ARG5[m
[31m-      |  lw SFARG2HI, FORL_STOP*8+HI(RA)[m
[31m-      |   lw SFARG2LO, FORL_STOP*8+LO(RA)[m
[31m-      |  move SFARG1HI, SFRETHI[m
[31m-      |   move SFARG1LO, SFRETLO[m
[31m-      |  bal ->vm_sfcmpolex[m
[31m-      |.  lw TMP3, FORL_STEP*8+HI(RA)[m
[31m-      if ( op == BC_JFORL ) {[m
[31m-	|   lhu RD, -4+OFS_RD(PC)[m
[31m-	|  lw TMP2, ARG5[m
[31m-	|  b <1[m
[31m-	|.  decode_RD8b RD[m
[31m-      } else {[m
[31m-	|  b <1[m
[31m-	|.  lw TMP2, ARG5[m
[31m-      }[m
[31m-    }[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IITERL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  // RA = base*8, RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  lw TMP1, HI(RA)[m
[31m-    |  beq TMP1, TISNIL, >1		// Stop if iterator returned nil.[m
[31m-    |.  lw TMP2, LO(RA)[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  sw TMP1, -8+HI(RA)[m
[31m-      |  b =>BC_JLOOP[m
[31m-      |.  sw TMP2, -8+LO(RA)[m
[31m-    } else {[m
[31m-      |  branch_RD			// Otherwise save control var + branch.[m
[31m-      |  sw TMP1, -8+HI(RA)[m
[31m-      |   sw TMP2, -8+LO(RA)[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  // RA = base*8, RD = target (loop extent)[m
[31m-    |  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_ILOOP follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  // RA = base*8, RD = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  // RA = base*8 (ignored), RD = traceno*8[m
[31m-    |  lw TMP1, DISPATCH_J(trace)(DISPATCH)[m
[31m-    |  srl RD, RD, 1[m
[31m-    |   li AT, 0[m
[31m-    |  addu TMP1, TMP1, RD[m
[31m-    |  // Traces on MIPS don't store the trace number, so use 0.[m
[31m-    |   sw AT, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-    |  lw TRACE:TMP2, 0(TMP1)[m
[31m-    |   sw BASE, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-    |  lw TMP2, TRACE:TMP2->mcode[m
[31m-    |   sw L, DISPATCH_GL(tmpbuf.L)(DISPATCH)[m
[31m-    |  jr TMP2[m
[31m-    |.  addiu JGL, DISPATCH, GG_DISP2G+32768[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  // RA = base*8 (only used by trace recorder), RD = target[m
[31m-    |  branch_RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    |  // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8[m
[31m-    |  lw TMP2, L->maxstack[m
[31m-    |   lbu TMP1, -4+PC2PROTO(numparams)(PC)[m
[31m-    |    lw KBASE, -4+PC2PROTO(k)(PC)[m
[31m-    |  sltu AT, TMP2, RA[m
[31m-    |  bnez AT, ->vm_growstack_l[m
[31m-    |.  sll TMP1, TMP1, 3[m
[31m-    if (op != BC_JFUNCF) {[m
[31m-      |  ins_next1[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  sltu AT, NARGS8:RC, TMP1		// Check for missing parameters.[m
[31m-    |  bnez AT, >3[m
[31m-    |.  addu AT, BASE, NARGS8:RC[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  decode_RD8a RD, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-      |.  decode_RD8b RD[m
[31m-    } else {[m
[31m-      |  ins_next2[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  sw TISNIL, HI(AT)[m
[31m-    |  b <2[m
[31m-    |.  addiu NARGS8:RC, NARGS8:RC, 8[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    |  NYI  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8[m
[31m-    |   addu TMP1, BASE, RC[m
[31m-    |  lw TMP2, L->maxstack[m
[31m-    |  addu TMP0, RA, RC[m
[31m-    |   sw LFUNC:RB, LO(TMP1)		// Store copy of LFUNC.[m
[31m-    |   addiu TMP3, RC, 8+FRAME_VARG[m
[31m-    |  sltu AT, TMP0, TMP2[m
[31m-    |    lw KBASE, -4+PC2PROTO(k)(PC)[m
[31m-    |  beqz AT, ->vm_growstack_l[m
[31m-    |.  sw TMP3, HI(TMP1)		// Store delta + FRAME_VARG.[m
[31m-    |  lbu TMP2, -4+PC2PROTO(numparams)(PC)[m
[31m-    |   move RA, BASE[m
[31m-    |   move RC, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  beqz TMP2, >3[m
[31m-    |.  addiu BASE, TMP1, 8[m
[31m-    |1:[m
[31m-    |  lw TMP0, HI(RA)[m
[31m-    |   lw TMP3, LO(RA)[m
[31m-    |  sltu AT, RA, RC			// Less args than parameters?[m
[31m-    |  move CARG1, TMP0[m
[31m-    |  movz TMP0, TISNIL, AT		// Clear missing parameters.[m
[31m-    |  movn CARG1, TISNIL, AT		// Clear old fixarg slot (help the GC).[m
[31m-    |   sw TMP3, 8+LO(TMP1)[m
[31m-    |    addiu TMP2, TMP2, -1[m
[31m-    |  sw TMP0, 8+HI(TMP1)[m
[31m-    |    addiu TMP1, TMP1, 8[m
[31m-    |  sw CARG1, HI(RA)[m
[31m-    |  bnez TMP2, <1[m
[31m-    |.   addiu RA, RA, 8[m
[31m-    |3:[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  lw CFUNCADDR, CFUNC:RB->f[m
[31m-    } else {[m
[31m-      |  lw CFUNCADDR, DISPATCH_GL(wrapf)(DISPATCH)[m
[31m-    }[m
[31m-    |  addu TMP1, RA, NARGS8:RC[m
[31m-    |  lw TMP2, L->maxstack[m
[31m-    |   addu RC, BASE, NARGS8:RC[m
[31m-    |  sw BASE, L->base[m
[31m-    |  sltu AT, TMP2, TMP1[m
[31m-    |   sw RC, L->top[m
[31m-    |    li_vmstate C[m
[31m-    if (op == BC_FUNCCW) {[m
[31m-      |  lw CARG2, CFUNC:RB->f[m
[31m-    }[m
[31m-    |  bnez AT, ->vm_growstack_c	// Need to grow stack.[m
[31m-    |.  move CARG1, L[m
[31m-    |  jalr CFUNCADDR			// (lua_State *L [, lua_CFunction f])[m
[31m-    |.   st_vmstate[m
[31m-    |  // Returns nresults.[m
[31m-    |  lw BASE, L->base[m
[31m-    |   sll RD, CRET1, 3[m
[31m-    |  lw TMP1, L->top[m
[31m-    |    li_vmstate INTERP[m
[31m-    |  lw PC, FRAME_PC(BASE)		// Fetch PC of caller.[m
[31m-    |   subu RA, TMP1, RD		// RA = L->top - nresults*8[m
[31m-    |    sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-    |  b ->vm_returnc[m
[31m-    |.   st_vmstate[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-[m
[31m-  build_subroutines(ctx);[m
[31m-[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  int i;[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.4byte .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.4byte 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 31\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.4byte .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.4byte .Lframe0\n"[m
[31m-	"\t.4byte .Lbegin\n"[m
[31m-	"\t.4byte %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"[m
[31m-	"\t.byte 0x9f\n\t.sleb128 1\n"[m
[31m-	"\t.byte 0x9e\n\t.sleb128 2\n",[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 23; i >= 16; i--)[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 26-i);[m
[31m-#if !LJ_SOFTFP[m
[31m-    for (i = 30; i >= 20; i -= 2)[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+32+i, 42-i);[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE0:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.4byte .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.4byte .Lframe0\n"[m
[31m-	"\t.4byte lj_vm_ffi_call\n"[m
[31m-	"\t.4byte %d\n"[m
[31m-	"\t.byte 0x9f\n\t.uleb128 1\n"[m
[31m-	"\t.byte 0x90\n\t.uleb128 2\n"[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x10\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#if !LJ_NO_UNWIND[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.globl lj_err_unwind_dwarf\n"[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.4byte .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.4byte 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 31\n"[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0\n"[m
[31m-	"\t.4byte lj_err_unwind_dwarf\n"[m
[31m-	"\t.byte 0\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.4byte .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.4byte .LASFDE2-.Lframe1\n"[m
[31m-	"\t.4byte .Lbegin\n"[m
[31m-	"\t.4byte %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"[m
[31m-	"\t.byte 0x9f\n\t.sleb128 1\n"[m
[31m-	"\t.byte 0x9e\n\t.sleb128 2\n",[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 23; i >= 16; i--)[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 26-i);[m
[31m-#if !LJ_SOFTFP[m
[31m-    for (i = 30; i >= 20; i -= 2)[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+32+i, 42-i);[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE2:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.4byte .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.4byte 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 31\n"[m
[31m-	"\t.uleb128 1\n"			/* augmentation length */[m
[31m-	"\t.byte 0\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.4byte .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.4byte .LASFDE3-.Lframe2\n"[m
[31m-	"\t.4byte lj_vm_ffi_call\n"[m
[31m-	"\t.4byte %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0x9f\n\t.uleb128 1\n"[m
[31m-	"\t.byte 0x90\n\t.uleb128 2\n"[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x10\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#endif[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_ppc.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_ppc.dasc[m
[1mdeleted file mode 100644[m
[1mindex be4356e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_ppc.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,5248 +0,0 @@[m
[31m-|// Low-level VM code for PowerPC 32 bit or 32on64 bit mode.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.arch ppc[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|// Note: The ragged indentation of the instructions is intentional.[m
[31m-|//       The starting columns indicate data dependencies.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// DynASM defines used by the PPC port:[m
[31m-|//[m
[31m-|// P64     64 bit pointers (only for GPR64 testing).[m
[31m-|//         Note: see vm_ppc64.dasc for a full PPC64 _LP64 port.[m
[31m-|// GPR64   64 bit registers (but possibly 32 bit pointers, e.g. PS3).[m
[31m-|//         Affects reg saves, stack layout, carry/overflow/dot flags etc.[m
[31m-|// FRAME32 Use 32 bit frame layout, even with GPR64 (Xbox 360).[m
[31m-|// TOC     Need table of contents (64 bit or 32 bit variant, e.g. PS3).[m
[31m-|//         Function pointers are really a struct: code, TOC, env (optional).[m
[31m-|// TOCENV  Function pointers have an environment pointer, too (not on PS3).[m
[31m-|// PPE     Power Processor Element of Cell (PS3) or Xenon (Xbox 360).[m
[31m-|//         Must avoid (slow) micro-coded instructions.[m
[31m-|[m
[31m-|.if P64[m
[31m-|.define TOC, 1[m
[31m-|.define TOCENV, 1[m
[31m-|.macro lpx, a, b, c; ldx a, b, c; .endmacro[m
[31m-|.macro lp, a, b; ld a, b; .endmacro[m
[31m-|.macro stp, a, b; std a, b; .endmacro[m
[31m-|.define decode_OPP, decode_OP8[m
[31m-|.if FFI[m
[31m-|// Missing: Calling conventions, 64 bit regs, TOC.[m
[31m-|.error lib_ffi not yet implemented for PPC64[m
[31m-|.endif[m
[31m-|.else[m
[31m-|.macro lpx, a, b, c; lwzx a, b, c; .endmacro[m
[31m-|.macro lp, a, b; lwz a, b; .endmacro[m
[31m-|.macro stp, a, b; stw a, b; .endmacro[m
[31m-|.define decode_OPP, decode_OP4[m
[31m-|.endif[m
[31m-|[m
[31m-|// Convenience macros for TOC handling.[m
[31m-|.if TOC[m
[31m-|// Linker needs a TOC patch area for every external call relocation.[m
[31m-|.macro blex, target; bl extern target@plt; nop; .endmacro[m
[31m-|.macro .toc, a, b; a, b; .endmacro[m
[31m-|.if P64[m
[31m-|.define TOC_OFS,	 8[m
[31m-|.define ENV_OFS,	16[m
[31m-|.else[m
[31m-|.define TOC_OFS,	4[m
[31m-|.define ENV_OFS,	8[m
[31m-|.endif[m
[31m-|.else  // No TOC.[m
[31m-|.macro blex, target; bl extern target@plt; .endmacro[m
[31m-|.macro .toc, a, b; .endmacro[m
[31m-|.endif[m
[31m-|.macro .tocenv, a, b; .if TOCENV; a, b; .endif; .endmacro[m
[31m-|[m
[31m-|.macro .gpr64, a, b; .if GPR64; a, b; .endif; .endmacro[m
[31m-|[m
[31m-|.macro andix., y, a, i[m
[31m-|.if PPE[m
[31m-|  rlwinm y, a, 0, 31-lj_fls(i), 31-lj_ffs(i)[m
[31m-|  cmpwi y, 0[m
[31m-|.else[m
[31m-|  andi. y, a, i[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro clrso, reg[m
[31m-|.if PPE[m
[31m-|  li reg, 0[m
[31m-|  mtxer reg[m
[31m-|.else[m
[31m-|  mcrxr cr0[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro checkov, reg, noov[m
[31m-|.if PPE[m
[31m-|  mfxer reg[m
[31m-|  add reg, reg, reg[m
[31m-|  cmpwi reg, 0[m
[31m-|   li reg, 0[m
[31m-|   mtxer reg[m
[31m-|  bgey noov[m
[31m-|.else[m
[31m-|  mcrxr cr0[m
[31m-|  bley noov[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|// Don't use: r1 = sp, r2 and r13 = reserved (TOC, TLS or SDATA)[m
[31m-|[m
[31m-|// The following must be C callee-save (but BASE is often refetched).[m
[31m-|.define BASE,		r14	// Base of current Lua stack frame.[m
[31m-|.define KBASE,		r15	// Constants of current Lua function.[m
[31m-|.define PC,		r16	// Next PC.[m
[31m-|.define DISPATCH,	r17	// Opcode dispatch table.[m
[31m-|.define LREG,		r18	// Register holding lua_State (also in SAVE_L).[m
[31m-|.define MULTRES,	r19	// Size of multi-result: (nresults+1)*8.[m
[31m-|.define JGL,		r31	// On-trace: global_State + 32768.[m
[31m-|[m
[31m-|// Constants for type-comparisons, stores and conversions. C callee-save.[m
[31m-|.define TISNUM,	r22[m
[31m-|.define TISNIL,	r23[m
[31m-|.define ZERO,		r24[m
[31m-|.define TOBIT,		f30	// 2^52 + 2^51.[m
[31m-|.define TONUM,		f31	// 2^52 + 2^51 + 2^31.[m
[31m-|[m
[31m-|// The following temporaries are not saved across C calls, except for RA.[m
[31m-|.define RA,		r20	// Callee-save.[m
[31m-|.define RB,		r10[m
[31m-|.define RC,		r11[m
[31m-|.define RD,		r12[m
[31m-|.define INS,		r7	// Overlaps CARG5.[m
[31m-|[m
[31m-|.define TMP0,		r0[m
[31m-|.define TMP1,		r8[m
[31m-|.define TMP2,		r9[m
[31m-|.define TMP3,		r6	// Overlaps CARG4.[m
[31m-|[m
[31m-|// Saved temporaries.[m
[31m-|.define SAVE0,		r21[m
[31m-|[m
[31m-|// Calling conventions.[m
[31m-|.define CARG1,		r3[m
[31m-|.define CARG2,		r4[m
[31m-|.define CARG3,		r5[m
[31m-|.define CARG4,		r6	// Overlaps TMP3.[m
[31m-|.define CARG5,		r7	// Overlaps INS.[m
[31m-|[m
[31m-|.define FARG1,		f1[m
[31m-|.define FARG2,		f2[m
[31m-|[m
[31m-|.define CRET1,		r3[m
[31m-|.define CRET2,		r4[m
[31m-|[m
[31m-|.define TOCREG,	r2	// TOC register (only used by C code).[m
[31m-|.define ENVREG,	r11	// Environment pointer (nested C functions).[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|.if GPR64[m
[31m-|.if FRAME32[m
[31m-|[m
[31m-|//			456(sp) // \ 32/64 bit C frame info[m
[31m-|.define TONUM_LO,	452(sp) // |[m
[31m-|.define TONUM_HI,	448(sp) // |[m
[31m-|.define TMPD_LO,	444(sp) // |[m
[31m-|.define TMPD_HI,	440(sp) // |[m
[31m-|.define SAVE_CR,	432(sp) // | 64 bit CR save.[m
[31m-|.define SAVE_ERRF,	424(sp) //  > Parameter save area.[m
[31m-|.define SAVE_NRES,	420(sp) // |[m
[31m-|.define SAVE_L,	416(sp) // |[m
[31m-|.define SAVE_PC,	412(sp) // |[m
[31m-|.define SAVE_MULTRES,	408(sp) // |[m
[31m-|.define SAVE_CFRAME,	400(sp) // / 64 bit C frame chain.[m
[31m-|//			392(sp) // Reserved.[m
[31m-|.define CFRAME_SPACE,	384     // Delta for sp.[m
[31m-|// Back chain for sp:	384(sp) <-- sp entering interpreter[m
[31m-|.define SAVE_LR,	376(sp) // 32 bit LR stored in hi-part.[m
[31m-|.define SAVE_GPR_,	232     // .. 232+18*8: 64 bit GPR saves.[m
[31m-|.define SAVE_FPR_,	88      // .. 88+18*8: 64 bit FPR saves.[m
[31m-|//			80(sp) // Needed for 16 byte stack frame alignment.[m
[31m-|//			16(sp)  // Callee parameter save area (ABI mandated).[m
[31m-|//			8(sp)   // Reserved[m
[31m-|// Back chain for sp:	0(sp)   <-- sp while in interpreter[m
[31m-|// 32 bit sp stored in hi-part of 0(sp).[m
[31m-|[m
[31m-|.define TMPD_BLO,	447(sp)[m
[31m-|.define TMPD,		TMPD_HI[m
[31m-|.define TONUM_D,	TONUM_HI[m
[31m-|[m
[31m-|.else[m
[31m-|[m
[31m-|//			508(sp) // \ 32 bit C frame info.[m
[31m-|.define SAVE_ERRF,	472(sp) // |[m
[31m-|.define SAVE_NRES,	468(sp) // |[m
[31m-|.define SAVE_L,	464(sp) //  > Parameter save area.[m
[31m-|.define SAVE_PC,	460(sp) // |[m
[31m-|.define SAVE_MULTRES,	456(sp) // |[m
[31m-|.define SAVE_CFRAME,	448(sp) // / 64 bit C frame chain.[m
[31m-|.define SAVE_LR,	416(sp)[m
[31m-|.define CFRAME_SPACE,	400     // Delta for sp.[m
[31m-|// Back chain for sp:	400(sp) <-- sp entering interpreter[m
[31m-|.define SAVE_FPR_,	256     // .. 256+18*8: 64 bit FPR saves.[m
[31m-|.define SAVE_GPR_,	112     // .. 112+18*8: 64 bit GPR saves.[m
[31m-|//			48(sp)  // Callee parameter save area (ABI mandated).[m
[31m-|.define SAVE_TOC,	40(sp)  // TOC save area.[m
[31m-|.define TMPD_LO,	36(sp)  // \ Link editor temp (ABI mandated).[m
[31m-|.define TMPD_HI,	32(sp)  // /[m
[31m-|.define TONUM_LO,	28(sp)  // \ Compiler temp (ABI mandated).[m
[31m-|.define TONUM_HI,	24(sp)  // /[m
[31m-|// Next frame lr:	16(sp)[m
[31m-|.define SAVE_CR,	8(sp)  // 64 bit CR save.[m
[31m-|// Back chain for sp:	0(sp)	<-- sp while in interpreter[m
[31m-|[m
[31m-|.define TMPD_BLO,	39(sp)[m
[31m-|.define TMPD,		TMPD_HI[m
[31m-|.define TONUM_D,	TONUM_HI[m
[31m-|[m
[31m-|.endif[m
[31m-|.else[m
[31m-|[m
[31m-|.define SAVE_LR,	276(sp)[m
[31m-|.define CFRAME_SPACE,	272     // Delta for sp.[m
[31m-|// Back chain for sp:	272(sp) <-- sp entering interpreter[m
[31m-|.define SAVE_FPR_,	128     // .. 128+18*8: 64 bit FPR saves.[m
[31m-|.define SAVE_GPR_,	56      // .. 56+18*4: 32 bit GPR saves.[m
[31m-|.define SAVE_CR,	52(sp)  // 32 bit CR save.[m
[31m-|.define SAVE_ERRF,	48(sp)  // 32 bit C frame info.[m
[31m-|.define SAVE_NRES,	44(sp)[m
[31m-|.define SAVE_CFRAME,	40(sp)[m
[31m-|.define SAVE_L,	36(sp)[m
[31m-|.define SAVE_PC,	32(sp)[m
[31m-|.define SAVE_MULTRES,	28(sp)[m
[31m-|.define UNUSED1,	24(sp)[m
[31m-|.define TMPD_LO,	20(sp)[m
[31m-|.define TMPD_HI,	16(sp)[m
[31m-|.define TONUM_LO,	12(sp)[m
[31m-|.define TONUM_HI,	8(sp)[m
[31m-|// Next frame lr:	4(sp)[m
[31m-|// Back chain for sp:	0(sp)	<-- sp while in interpreter[m
[31m-|[m
[31m-|.define TMPD_BLO,	23(sp)[m
[31m-|.define TMPD,		TMPD_HI[m
[31m-|.define TONUM_D,	TONUM_HI[m
[31m-|[m
[31m-|.endif[m
[31m-|[m
[31m-|.macro save_, reg[m
[31m-|.if GPR64[m
[31m-|  std r..reg, SAVE_GPR_+(reg-14)*8(sp)[m
[31m-|.else[m
[31m-|  stw r..reg, SAVE_GPR_+(reg-14)*4(sp)[m
[31m-|.endif[m
[31m-|  stfd f..reg, SAVE_FPR_+(reg-14)*8(sp)[m
[31m-|.endmacro[m
[31m-|.macro rest_, reg[m
[31m-|.if GPR64[m
[31m-|  ld r..reg, SAVE_GPR_+(reg-14)*8(sp)[m
[31m-|.else[m
[31m-|  lwz r..reg, SAVE_GPR_+(reg-14)*4(sp)[m
[31m-|.endif[m
[31m-|  lfd f..reg, SAVE_FPR_+(reg-14)*8(sp)[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro saveregs[m
[31m-|.if GPR64 and not FRAME32[m
[31m-|  stdu sp, -CFRAME_SPACE(sp)[m
[31m-|.else[m
[31m-|  stwu sp, -CFRAME_SPACE(sp)[m
[31m-|.endif[m
[31m-|  save_ 14; save_ 15; save_ 16[m
[31m-|  mflr r0[m
[31m-|  save_ 17; save_ 18; save_ 19; save_ 20; save_ 21; save_ 22[m
[31m-|.if GPR64 and not FRAME32[m
[31m-|  std r0, SAVE_LR[m
[31m-|.else[m
[31m-|  stw r0, SAVE_LR[m
[31m-|.endif[m
[31m-|  save_ 23; save_ 24; save_ 25[m
[31m-|  mfcr r0[m
[31m-|  save_ 26; save_ 27; save_ 28; save_ 29; save_ 30; save_ 31[m
[31m-|.if GPR64[m
[31m-|  std r0, SAVE_CR[m
[31m-|.else[m
[31m-|  stw r0, SAVE_CR[m
[31m-|.endif[m
[31m-|  .toc std TOCREG, SAVE_TOC[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro restoreregs[m
[31m-|.if GPR64 and not FRAME32[m
[31m-|  ld r0, SAVE_LR[m
[31m-|.else[m
[31m-|  lwz r0, SAVE_LR[m
[31m-|.endif[m
[31m-|.if GPR64[m
[31m-|  ld r12, SAVE_CR[m
[31m-|.else[m
[31m-|  lwz r12, SAVE_CR[m
[31m-|.endif[m
[31m-|  rest_ 14; rest_ 15; rest_ 16; rest_ 17; rest_ 18; rest_ 19[m
[31m-|  mtlr r0;[m
[31m-|.if PPE; mtocrf 0x20, r12; .else; mtcrf 0x38, r12; .endif[m
[31m-|  rest_ 20; rest_ 21; rest_ 22; rest_ 23; rest_ 24; rest_ 25[m
[31m-|.if PPE; mtocrf 0x10, r12; .endif[m
[31m-|  rest_ 26; rest_ 27; rest_ 28; rest_ 29; rest_ 30; rest_ 31[m
[31m-|.if PPE; mtocrf 0x08, r12; .endif[m
[31m-|  addi sp, sp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State,	LREG[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS8,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Trap for not-yet-implemented parts.[m
[31m-|.macro NYI; tw 4, sp, sp; .endmacro[m
[31m-|[m
[31m-|// int/FP conversions.[m
[31m-|.macro tonum_i, freg, reg[m
[31m-|  xoris reg, reg, 0x8000[m
[31m-|  stw reg, TONUM_LO[m
[31m-|  lfd freg, TONUM_D[m
[31m-|  fsub freg, freg, TONUM[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro tonum_u, freg, reg[m
[31m-|  stw reg, TONUM_LO[m
[31m-|  lfd freg, TONUM_D[m
[31m-|  fsub freg, freg, TOBIT[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro toint, reg, freg, tmpfreg[m
[31m-|  fctiwz tmpfreg, freg[m
[31m-|  stfd tmpfreg, TMPD[m
[31m-|  lwz reg, TMPD_LO[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro toint, reg, freg[m
[31m-|  toint reg, freg, freg[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Access to frame relative to BASE.[m
[31m-|.define FRAME_PC,	-8[m
[31m-|.define FRAME_FUNC,	-4[m
[31m-|[m
[31m-|// Instruction decode.[m
[31m-|.macro decode_OP4, dst, ins; rlwinm dst, ins, 2, 22, 29; .endmacro[m
[31m-|.macro decode_OP8, dst, ins; rlwinm dst, ins, 3, 21, 28; .endmacro[m
[31m-|.macro decode_RA8, dst, ins; rlwinm dst, ins, 27, 21, 28; .endmacro[m
[31m-|.macro decode_RB8, dst, ins; rlwinm dst, ins, 11, 21, 28; .endmacro[m
[31m-|.macro decode_RC8, dst, ins; rlwinm dst, ins, 19, 21, 28; .endmacro[m
[31m-|.macro decode_RD8, dst, ins; rlwinm dst, ins, 19, 13, 28; .endmacro[m
[31m-|[m
[31m-|.macro decode_OP1, dst, ins; rlwinm dst, ins, 0, 24, 31; .endmacro[m
[31m-|.macro decode_RD4, dst, ins; rlwinm dst, ins, 18, 14, 29; .endmacro[m
[31m-|[m
[31m-|// Instruction fetch.[m
[31m-|.macro ins_NEXT1[m
[31m-|  lwz INS, 0(PC)[m
[31m-|   addi PC, PC, 4[m
[31m-|.endmacro[m
[31m-|// Instruction decode+dispatch. Note: optimized for e300![m
[31m-|.macro ins_NEXT2[m
[31m-|  decode_OPP TMP1, INS[m
[31m-|  lpx TMP0, DISPATCH, TMP1[m
[31m-|  mtctr TMP0[m
[31m-|   decode_RB8 RB, INS[m
[31m-|   decode_RD8 RD, INS[m
[31m-|   decode_RA8 RA, INS[m
[31m-|   decode_RC8 RC, INS[m
[31m-|  bctr[m
[31m-|.endmacro[m
[31m-|.macro ins_NEXT[m
[31m-|  ins_NEXT1[m
[31m-|  ins_NEXT2[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|  .define ins_next1, ins_NEXT1[m
[31m-|  .define ins_next2, ins_NEXT2[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  .macro ins_next[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next1[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next2[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-|  lwz PC, LFUNC:RB->pc[m
[31m-|  lwz INS, 0(PC)[m
[31m-|   addi PC, PC, 4[m
[31m-|  decode_OPP TMP1, INS[m
[31m-|   decode_RA8 RA, INS[m
[31m-|  lpx TMP0, DISPATCH, TMP1[m
[31m-|   add RA, RA, BASE[m
[31m-|  mtctr TMP0[m
[31m-|  bctr[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, PC = caller PC[m
[31m-|  stw PC, FRAME_PC(BASE)[m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to test operand types.[m
[31m-|.macro checknum, reg; cmplw reg, TISNUM; .endmacro[m
[31m-|.macro checknum, cr, reg; cmplw cr, reg, TISNUM; .endmacro[m
[31m-|.macro checkstr, reg; cmpwi reg, LJ_TSTR; .endmacro[m
[31m-|.macro checktab, reg; cmpwi reg, LJ_TTAB; .endmacro[m
[31m-|.macro checkfunc, reg; cmpwi reg, LJ_TFUNC; .endmacro[m
[31m-|.macro checknil, reg; cmpwi reg, LJ_TNIL; .endmacro[m
[31m-|[m
[31m-|.macro branch_RD[m
[31m-|  srwi TMP0, RD, 1[m
[31m-|  addis PC, PC, -(BCBIAS_J*4 >> 16)[m
[31m-|  add PC, PC, TMP0[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|.macro hotcheck, delta, target[m
[31m-|  rlwinm TMP1, PC, 31, 25, 30[m
[31m-|  addi TMP1, TMP1, GG_DISP2HOT[m
[31m-|  lhzx TMP2, DISPATCH, TMP1[m
[31m-|  addic. TMP2, TMP2, -delta[m
[31m-|  sthx TMP2, DISPATCH, TMP1[m
[31m-|  blt target[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotloop[m
[31m-|  hotcheck HOTCOUNT_LOOP, ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall[m
[31m-|  hotcheck HOTCOUNT_CALL, ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state. Uses TMP0.[m
[31m-|.macro li_vmstate, st; li TMP0, ~LJ_VMST_..st; .endmacro[m
[31m-|.macro st_vmstate; stw TMP0, DISPATCH_GL(vmstate)(DISPATCH); .endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites mark and tmp.[m
[31m-|.macro barrierback, tab, mark, tmp[m
[31m-|  lwz tmp, DISPATCH_GL(gc.grayagain)(DISPATCH)[m
[31m-|  // Assumes LJ_GC_BLACK is 0x04.[m
[31m-|   rlwinm mark, mark, 0, 30, 28		// black2gray(tab)[m
[31m-|  stw tab, DISPATCH_GL(gc.grayagain)(DISPATCH)[m
[31m-|   stb mark, tab->marked[m
[31m-|  stw tmp, tab->gclist[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  // See vm_return. Also: TMP2 = previous base.[m
[31m-  |  andix. TMP0, PC, FRAME_P[m
[31m-  |   li TMP1, LJ_TTRUE[m
[31m-  |  beq ->cont_dispatch[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  lwz PC, FRAME_PC(TMP2)		// Fetch PC of previous frame.[m
[31m-  |  mr BASE, TMP2			// Restore caller base.[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |   stwu TMP1, FRAME_PC(RA)		// Prepend true to results.[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  addi RD, RD, 8			// RD = (nresults+1)*8.[m
[31m-  |   andix. TMP0, PC, FRAME_TYPE[m
[31m-  |  cmpwi cr1, RD, 0[m
[31m-  |  li CRET1, LUA_YIELD[m
[31m-  |  beq cr1, ->vm_unwind_c_eh[m
[31m-  |  mr MULTRES, RD[m
[31m-  |   beq ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return[m
[31m-  |  // TMP0 = PC & FRAME_TYPE[m
[31m-  |  cmpwi TMP0, FRAME_C[m
[31m-  |   rlwinm TMP2, PC, 0, 0, 28[m
[31m-  |    li_vmstate C[m
[31m-  |   sub TMP2, BASE, TMP2		// TMP2 = previous base.[m
[31m-  |  bney ->vm_returnp[m
[31m-  |[m
[31m-  |  addic. TMP1, RD, -8[m
[31m-  |   stp TMP2, L->base[m
[31m-  |   lwz TMP2, SAVE_NRES[m
[31m-  |    subi BASE, BASE, 8[m
[31m-  |    st_vmstate[m
[31m-  |   slwi TMP2, TMP2, 3[m
[31m-  |  beq >2[m
[31m-  |1:[m
[31m-  |  addic. TMP1, TMP1, -8[m
[31m-  |   lfd f0, 0(RA)[m
[31m-  |    addi RA, RA, 8[m
[31m-  |   stfd f0, 0(BASE)[m
[31m-  |    addi BASE, BASE, 8[m
[31m-  |  bney <1[m
[31m-  |[m
[31m-  |2:[m
[31m-  |  cmpw TMP2, RD			// More/less results wanted?[m
[31m-  |  bne >6[m
[31m-  |3:[m
[31m-  |  stp BASE, L->top			// Store new top.[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  lp TMP0, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |   li CRET1, 0			// Ok return status for vm_pcall.[m
[31m-  |  stp TMP0, L->cframe[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs[m
[31m-  |  blr[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  ble >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  lwz TMP1, L->maxstack[m
[31m-  |  cmplw BASE, TMP1[m
[31m-  |  bge >8[m
[31m-  |  stw TISNIL, 0(BASE)[m
[31m-  |  addi RD, RD, 8[m
[31m-  |  addi BASE, BASE, 8[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  subfic TMP3, TMP2, 0		// LUA_MULTRET+1 case?[m
[31m-  |   sub TMP0, RD, TMP2[m
[31m-  |  subfe TMP1, TMP1, TMP1		// TMP1 = TMP2 == 0 ? 0 : -1[m
[31m-  |   and TMP0, TMP0, TMP1[m
[31m-  |  sub BASE, BASE, TMP0		// Either keep top or shrink it.[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  stp BASE, L->top			// Save current top held in BASE (yes).[m
[31m-  |   mr SAVE0, RD[m
[31m-  |  srwi CARG2, TMP2, 3[m
[31m-  |  mr CARG1, L[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |    lwz TMP2, SAVE_NRES[m
[31m-  |   mr RD, SAVE0[m
[31m-  |    slwi TMP2, TMP2, 3[m
[31m-  |  lp BASE, L->top			// Need the (realloced) L->top in BASE.[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  mr sp, CARG1[m
[31m-  |  mr CRET1, CARG2[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  lwz L, SAVE_L[m
[31m-  |  .toc ld TOCREG, SAVE_TOC[m
[31m-  |   li TMP0, ~LJ_VMST_C[m
[31m-  |  lwz GL:TMP1, L->glref[m
[31m-  |   stw TMP0, GL:TMP1->vmstate[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |.if GPR64[m
[31m-  |  rldicr sp, CARG1, 0, 61[m
[31m-  |.else[m
[31m-  |  rlwinm sp, CARG1, 0, 0, 29[m
[31m-  |.endif[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  lwz L, SAVE_L[m
[31m-  |  .toc ld TOCREG, SAVE_TOC[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |  lp BASE, L->base[m
[31m-  |     lus TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |   lwz DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |     li ZERO, 0[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |  li TMP1, LJ_TFALSE[m
[31m-  |     ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     lfs TOBIT, TMPD[m
[31m-  |  lwz PC, FRAME_PC(BASE)		// Fetch PC of previous frame.[m
[31m-  |  la RA, -8(BASE)			// Results start at BASE-8.[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |   addi DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |  stw TMP1, 0(RA)			// Prepend false to error message.[m
[31m-  |  li RD, 16				// 2 results: false + error message.[m
[31m-  |    st_vmstate[m
[31m-  |     lfs TONUM, TMPD[m
[31m-  |  b ->vm_returnc[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  li CARG2, LUA_MINSTACK[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vm_growstack_l:			// Grow stack for Lua function.[m
[31m-  |  // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC[m
[31m-  |  add RC, BASE, RC[m
[31m-  |   sub RA, RA, BASE[m
[31m-  |  stp BASE, L->base[m
[31m-  |   addi PC, PC, 4			// Must point after first instruction.[m
[31m-  |  stp RC, L->top[m
[31m-  |   srwi CARG2, RA, 3[m
[31m-  |2:[m
[31m-  |  // L->base = new base, L->top = top[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  mr CARG1, L[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  lp BASE, L->base[m
[31m-  |  lp RC, L->top[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  sub RC, RC, BASE[m
[31m-  |  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  mr L, CARG1[m
[31m-  |    lwz DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |  mr BASE, CARG2[m
[31m-  |    lbz TMP1, L->status[m
[31m-  |   stw L, SAVE_L[m
[31m-  |  li PC, FRAME_CP[m
[31m-  |  addi TMP0, sp, CFRAME_RESUME[m
[31m-  |    addi DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   stw CARG3, SAVE_NRES[m
[31m-  |    cmplwi TMP1, 0[m
[31m-  |   stw CARG3, SAVE_ERRF[m
[31m-  |   stp CARG3, SAVE_CFRAME[m
[31m-  |   stw CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  stp TMP0, L->cframe[m
[31m-  |    beq >3[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  mr RA, BASE[m
[31m-  |   lp BASE, L->base[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |   lp TMP1, L->top[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |     lus TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |    stb CARG3, L->status[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |     lfs TOBIT, TMPD[m
[31m-  |   sub RD, TMP1, BASE[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     lus TMP0, 0x4338		// Hiword of 2^52 + 2^51 (double)[m
[31m-  |   addi RD, RD, 8[m
[31m-  |     stw TMP0, TONUM_HI[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     li ZERO, 0[m
[31m-  |    st_vmstate[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |   mr MULTRES, RD[m
[31m-  |     lfs TONUM, TMPD[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  li PC, FRAME_CP[m
[31m-  |  stw CARG4, SAVE_ERRF[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  li PC, FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  lp TMP1, L:CARG1->cframe[m
[31m-  |    mr L, CARG1[m
[31m-  |   stw CARG3, SAVE_NRES[m
[31m-  |    lwz DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |   stw CARG1, SAVE_L[m
[31m-  |     mr BASE, CARG2[m
[31m-  |    addi DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   stw CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  stp TMP1, SAVE_CFRAME[m
[31m-  |  stp sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |[m
[31m-  |3:  // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).[m
[31m-  |  stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  lp TMP2, L->base			// TMP2 = old base (used in vmeta_call).[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |   lp TMP1, L->top[m
[31m-  |     lus TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |  add PC, PC, BASE[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     li ZERO, 0[m
[31m-  |     ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |     lfs TOBIT, TMPD[m
[31m-  |  sub PC, PC, TMP2			// PC = frame delta + frame type[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     lus TMP0, 0x4338		// Hiword of 2^52 + 2^51 (double)[m
[31m-  |   sub NARGS8:RC, TMP1, BASE[m
[31m-  |     stw TMP0, TONUM_HI[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     lfs TONUM, TMPD[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |    st_vmstate[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC[m
[31m-  |  lwz TMP0, FRAME_PC(BASE)[m
[31m-  |   lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  checkfunc TMP0; bne ->vmeta_call[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, RB = func, RC = nargs*8, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  mr L, CARG1[m
[31m-  |   lwz TMP0, L:CARG1->stack[m
[31m-  |  stw CARG1, SAVE_L[m
[31m-  |   lp TMP1, L->top[m
[31m-  |     lwz DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |  stw CARG1, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   sub TMP0, TMP0, TMP1		// Compute -savestack(L, L->top).[m
[31m-  |    lp TMP1, L->cframe[m
[31m-  |     addi DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |  .toc lp CARG4, 0(CARG4)[m
[31m-  |  li TMP2, 0[m
[31m-  |   stw TMP0, SAVE_NRES		// Neg. delta means cframe w/o frame.[m
[31m-  |  stw TMP2, SAVE_ERRF		// No error function.[m
[31m-  |    stp TMP1, SAVE_CFRAME[m
[31m-  |    stp sp, L->cframe		// Add our C frame to cframe chain.[m
[31m-  |     stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  mtctr CARG4[m
[31m-  |  bctrl			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |.if PPE[m
[31m-  |  mr BASE, CRET1[m
[31m-  |  cmpwi CRET1, 0[m
[31m-  |.else[m
[31m-  |  mr. BASE, CRET1[m
[31m-  |.endif[m
[31m-  |   li PC, FRAME_CP[m
[31m-  |  bne <3				// Else continue with the call.[m
[31m-  |  b ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// The lj_meta_* functions (except for lj_meta_cat) don't reallocate the[m
[31m-  |// stack, so BASE doesn't need to be reloaded across these calls.[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultptr, RD = (nresults+1)*8[m
[31m-  |  lwz TMP0, -12(BASE)		// Continuation.[m
[31m-  |   mr RB, BASE[m
[31m-  |   mr BASE, TMP2			// Restore caller BASE.[m
[31m-  |    lwz LFUNC:TMP1, FRAME_FUNC(TMP2)[m
[31m-  |.if FFI[m
[31m-  |  cmplwi TMP0, 1[m
[31m-  |.endif[m
[31m-  |     lwz PC, -16(RB)			// Restore PC from [cont|PC].[m
[31m-  |   subi TMP2, RD, 8[m
[31m-  |    lwz TMP1, LFUNC:TMP1->pc[m
[31m-  |   stwx TISNIL, RA, TMP2		// Ensure one valid arg.[m
[31m-  |.if FFI[m
[31m-  |  ble >1[m
[31m-  |.endif[m
[31m-  |    lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |  // BASE = base, RA = resultptr, RB = meta base[m
[31m-  |  mtctr TMP0[m
[31m-  |  bctr				// Jump to continuation.[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  beq ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: tailcall from C function.[m
[31m-  |  subi TMP1, RB, 16[m
[31m-  |  sub RC, TMP1, BASE[m
[31m-  |  b ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// RA = resultptr, RB = meta base[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |   subi CARG2, RB, 16[m
[31m-  |  decode_RB8 SAVE0, INS[m
[31m-  |   lfd f0, 0(RA)[m
[31m-  |  add TMP1, BASE, SAVE0[m
[31m-  |   stp BASE, L->base[m
[31m-  |  cmplw TMP1, CARG2[m
[31m-  |   sub CARG3, CARG2, TMP1[m
[31m-  |  decode_RA8 RA, INS[m
[31m-  |   stfd f0, 0(CARG2)[m
[31m-  |  bney ->BC_CAT_Z[m
[31m-  |   stfdx f0, BASE, RA[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets1:[m
[31m-  |  la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  li TMP0, LJ_TSTR[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  stw STR:RC, 4(CARG3)[m
[31m-  |   add CARG2, BASE, RB[m
[31m-  |  stw TMP0, 0(CARG3)[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  la CARG2, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  li TMP0, LJ_TTAB[m
[31m-  |  stw TAB:RB, 4(CARG2)[m
[31m-  |   la CARG3, DISPATCH_GL(tmptv2)(DISPATCH)[m
[31m-  |  stw TMP0, 0(CARG2)[m
[31m-  |   li TMP1, LJ_TSTR[m
[31m-  |   stw STR:RC, 4(CARG3)[m
[31m-  |   stw TMP1, 0(CARG3)[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetb:			// TMP0 = index[m
[31m-  |.if not DUALNUM[m
[31m-  |  tonum_u f0, TMP0[m
[31m-  |.endif[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |   add CARG2, BASE, RB[m
[31m-  |.if DUALNUM[m
[31m-  |  stw TISNUM, 0(CARG3)[m
[31m-  |  stw TMP0, 4(CARG3)[m
[31m-  |.else[m
[31m-  |  stfd f0, 0(CARG3)[m
[31m-  |.endif[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   add CARG3, BASE, RC[m
[31m-  |1:[m
[31m-  |  stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |  beq >3[m
[31m-  |   lfd f0, 0(CRET1)[m
[31m-  |  ins_next1[m
[31m-  |   stfdx f0, BASE, RA[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |  subfic TMP1, BASE, FRAME_CONT[m
[31m-  |  lp BASE, L->top[m
[31m-  |  stw PC, -16(BASE)			// [cont|PC][m
[31m-  |   add PC, TMP1, BASE[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |   li NARGS8:RC, 16			// 2 args for func(t, k).[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |  beq >1[m
[31m-  |  lfd f14, 0(CRET1)[m
[31m-  |  b ->BC_TGETR_Z[m
[31m-  |1:[m
[31m-  |  stwx TISNIL, BASE, RA[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets1:[m
[31m-  |  la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  li TMP0, LJ_TSTR[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  stw STR:RC, 4(CARG3)[m
[31m-  |   add CARG2, BASE, RB[m
[31m-  |  stw TMP0, 0(CARG3)[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  la CARG2, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  li TMP0, LJ_TTAB[m
[31m-  |  stw TAB:RB, 4(CARG2)[m
[31m-  |   la CARG3, DISPATCH_GL(tmptv2)(DISPATCH)[m
[31m-  |  stw TMP0, 0(CARG2)[m
[31m-  |   li TMP1, LJ_TSTR[m
[31m-  |   stw STR:RC, 4(CARG3)[m
[31m-  |   stw TMP1, 0(CARG3)[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetb:			// TMP0 = index[m
[31m-  |.if not DUALNUM[m
[31m-  |  tonum_u f0, TMP0[m
[31m-  |.endif[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |   add CARG2, BASE, RB[m
[31m-  |.if DUALNUM[m
[31m-  |  stw TISNUM, 0(CARG3)[m
[31m-  |  stw TMP0, 4(CARG3)[m
[31m-  |.else[m
[31m-  |  stfd f0, 0(CARG3)[m
[31m-  |.endif[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   add CARG3, BASE, RC[m
[31m-  |1:[m
[31m-  |  stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |   lfdx f0, BASE, RA[m
[31m-  |  beq >3[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  ins_next1[m
[31m-  |   stfd f0, 0(CRET1)[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |  subfic TMP1, BASE, FRAME_CONT[m
[31m-  |  lp BASE, L->top[m
[31m-  |  stw PC, -16(BASE)			// [cont|PC][m
[31m-  |   add PC, TMP1, BASE[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |   li NARGS8:RC, 24			// 3 args for func(t, k, v)[m
[31m-  |  stfd f0, 16(BASE)			// Copy value to third argument.[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |  stp BASE, L->base[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // Returns TValue *.[m
[31m-  |  stfd f14, 0(CRET1)[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  mr CARG1, L[m
[31m-  |   subi PC, PC, 4[m
[31m-  |.if DUALNUM[m
[31m-  |  mr CARG2, RA[m
[31m-  |.else[m
[31m-  |  add CARG2, BASE, RA[m
[31m-  |.endif[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |.if DUALNUM[m
[31m-  |  mr CARG3, RD[m
[31m-  |.else[m
[31m-  |  add CARG3, BASE, RD[m
[31m-  |.endif[m
[31m-  |   stp BASE, L->base[m
[31m-  |  decode_OP1 CARG4, INS[m
[31m-  |  bl extern lj_meta_comp  // (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |3:[m
[31m-  |  cmplwi CRET1, 1[m
[31m-  |  bgt ->vmeta_binop[m
[31m-  |  subfic CRET1, CRET1, 0[m
[31m-  |4:[m
[31m-  |  lwz INS, 0(PC)[m
[31m-  |   addi PC, PC, 4[m
[31m-  |  decode_RD4 TMP2, INS[m
[31m-  |  addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-  |  and TMP2, TMP2, CRET1[m
[31m-  |  add PC, PC, TMP2[m
[31m-  |->cont_nop:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_ra:				// RA = resultptr[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |   lfd f0, 0(RA)[m
[31m-  |  decode_RA8 TMP1, INS[m
[31m-  |   stfdx f0, BASE, TMP1[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |->cont_condt:			// RA = resultptr[m
[31m-  |  lwz TMP0, 0(RA)[m
[31m-  |  .gpr64 extsw TMP0, TMP0[m
[31m-  |  subfic TMP0, TMP0, LJ_TTRUE	// Branch if result is true.[m
[31m-  |  subfe CRET1, CRET1, CRET1[m
[31m-  |  not CRET1, CRET1[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->cont_condf:			// RA = resultptr[m
[31m-  |  lwz TMP0, 0(RA)[m
[31m-  |  .gpr64 extsw TMP0, TMP0[m
[31m-  |  subfic TMP0, TMP0, LJ_TTRUE	// Branch if result is false.[m
[31m-  |  subfe CRET1, CRET1, CRET1[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV.[m
[31m-  |  subi PC, PC, 4[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal  // (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  mr CARG2, INS[m
[31m-  |  subi PC, PC, 4[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal_cd		// (lua_State *L, BCIns op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  subi PC, PC, 4[m
[31m-  |   stp BASE, L->base[m
[31m-  |   srwi CARG2, RA, 3[m
[31m-  |   mr CARG1, L[m
[31m-  |   srwi CARG3, RD, 3[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  add CARG3, KBASE, RC[m
[31m-  |  add CARG4, BASE, RB[m
[31m-  |  b >1[m
[31m-  |->vmeta_arith_nv2:[m
[31m-  |.if DUALNUM[m
[31m-  |  mr CARG3, RC[m
[31m-  |  mr CARG4, RB[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  mr CARG3, RD[m
[31m-  |  mr CARG4, RD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  add CARG3, BASE, RB[m
[31m-  |  add CARG4, KBASE, RC[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  add CARG3, BASE, RB[m
[31m-  |  add CARG4, BASE, RC[m
[31m-  |.if DUALNUM[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vn2:[m
[31m-  |->vmeta_arith_vv2:[m
[31m-  |.if DUALNUM[m
[31m-  |  mr CARG3, RB[m
[31m-  |  mr CARG4, RC[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  add CARG2, BASE, RA[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  decode_OP1 CARG5, INS		// Caveat: CARG5 overlaps INS.[m
[31m-  |  bl extern lj_meta_arith  // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |  beq ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2[m
[31m-  |  sub TMP1, CRET1, BASE[m
[31m-  |   stw PC, -16(CRET1)		// [cont|PC][m
[31m-  |   mr TMP2, BASE[m
[31m-  |  addi PC, TMP1, FRAME_CONT[m
[31m-  |   mr BASE, CRET1[m
[31m-  |  li NARGS8:RC, 16			// 2 args for func(o1, o2).[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-#if LJ_52[m
[31m-  |  mr SAVE0, CARG1[m
[31m-#endif[m
[31m-  |  mr CARG2, RD[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |  // Returns NULL (retry) or TValue * (metamethod base).[m
[31m-#if LJ_52[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |  bne ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |  mr CARG1, SAVE0[m
[31m-  |  b ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  b ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // TMP2 = old base, BASE = new base, RC = nargs*8[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp TMP2, L->base			// This is the callers base![m
[31m-  |  subi CARG2, BASE, 8[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  add CARG3, BASE, RC[m
[31m-  |   mr SAVE0, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |   addi NARGS8:RC, SAVE0, 8		// Got one more argument now.[m
[31m-  |  ins_call[m
[31m-  |[m
[31m-  |->vmeta_callt:			// Resolve __call for BC_CALLT.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs*8[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp BASE, L->base[m
[31m-  |  subi CARG2, RA, 8[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  add CARG3, RA, RC[m
[31m-  |   mr SAVE0, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  lwz TMP1, FRAME_PC(BASE)[m
[31m-  |   addi NARGS8:RC, SAVE0, 8		// Got one more argument now.[m
[31m-  |   lwz LFUNC:RB, FRAME_FUNC(RA)	// Guaranteed to be a function here.[m
[31m-  |  b ->BC_CALLT_Z[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG2, RA[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  mr SAVE0, INS[m
[31m-  |  bl extern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |.if JIT[m
[31m-  |   decode_OP1 TMP0, SAVE0[m
[31m-  |.endif[m
[31m-  |  decode_RA8 RA, SAVE0[m
[31m-  |.if JIT[m
[31m-  |   cmpwi TMP0, BC_JFORI[m
[31m-  |.endif[m
[31m-  |  decode_RD8 RD, SAVE0[m
[31m-  |.if JIT[m
[31m-  |   beqy =>BC_JFORI[m
[31m-  |.endif[m
[31m-  |  b =>BC_FORI[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz CARG1, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz CARG4, 8(BASE)[m
[31m-  |   lwz CARG1, 4(BASE)[m
[31m-  |    lwz CARG2, 12(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |   lwz CARG4, 8(BASE)[m
[31m-  |    lfd FARG2, 8(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  checknum CARG4; bge ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1.[m
[31m-  |.macro ffgccheck[m
[31m-  |  lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH)[m
[31m-  |  lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)[m
[31m-  |  cmplw TMP0, TMP1[m
[31m-  |  bgel ->fff_gcstep[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  li TMP1, LJ_TFALSE[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  cmplw cr1, CARG3, TMP1[m
[31m-  |    lwz PC, FRAME_PC(BASE)[m
[31m-  |  bge cr1, ->fff_fallback[m
[31m-  |   stw CARG3, 0(RA)[m
[31m-  |  addi RD, NARGS8:RC, 8		// Compute (nresults+1)*8.[m
[31m-  |   stw CARG1, 4(RA)[m
[31m-  |  beq ->fff_res			// Done if exactly 1 argument.[m
[31m-  |  li TMP1, 8[m
[31m-  |  subi RC, RC, 8[m
[31m-  |1:[m
[31m-  |  cmplw TMP1, RC[m
[31m-  |   lfdx f0, BASE, TMP1[m
[31m-  |   stfdx f0, RA, TMP1[m
[31m-  |    addi TMP1, TMP1, 8[m
[31m-  |  bney <1[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc type[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG1, 0(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  .gpr64 extsw CARG1, CARG1[m
[31m-  |  subfc TMP0, TISNUM, CARG1[m
[31m-  |  subfe TMP2, CARG1, CARG1[m
[31m-  |  orc TMP1, TMP2, TMP0[m
[31m-  |  addi TMP1, TMP1, ~LJ_TISNUM+1[m
[31m-  |  slwi TMP1, TMP1, 3[m
[31m-  |   la TMP2, CFUNC:RB->upvalue[m
[31m-  |  lfdx FARG1, TMP2, TMP1[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  checktab CARG3; bne >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  lwz TAB:CARG1, TAB:CARG1->metatable[m
[31m-  |2:[m
[31m-  |  li CARG3, LJ_TNIL[m
[31m-  |   cmplwi TAB:CARG1, 0[m
[31m-  |  lwz STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH)[m
[31m-  |   beq ->fff_restv[m
[31m-  |  lwz TMP0, TAB:CARG1->hmask[m
[31m-  |   li CARG3, LJ_TTAB			// Use metatable as default result.[m
[31m-  |  lwz TMP1, STR:RC->hash[m
[31m-  |  lwz NODE:TMP2, TAB:CARG1->node[m
[31m-  |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-  |  slwi TMP0, TMP1, 5[m
[31m-  |  slwi TMP1, TMP1, 3[m
[31m-  |  sub TMP1, TMP0, TMP1[m
[31m-  |  add NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  lwz CARG4, NODE:TMP2->key[m
[31m-  |   lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)[m
[31m-  |    lwz CARG2, NODE:TMP2->val[m
[31m-  |     lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2)[m
[31m-  |  checkstr CARG4; bne >4[m
[31m-  |   cmpw TMP0, STR:RC; beq >5[m
[31m-  |4:[m
[31m-  |  lwz NODE:TMP2, NODE:TMP2->next[m
[31m-  |  cmplwi NODE:TMP2, 0[m
[31m-  |  beq ->fff_restv			// Not found, keep default result.[m
[31m-  |  b <3[m
[31m-  |5:[m
[31m-  |  checknil CARG2[m
[31m-  |  beq ->fff_restv			// Ditto for nil value.[m
[31m-  |  mr CARG3, CARG2			// Return value of mt.__metatable.[m
[31m-  |  mr CARG1, TMP1[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  cmpwi CARG3, LJ_TUDATA; beq <1[m
[31m-  |  .gpr64 extsw CARG3, CARG3[m
[31m-  |  subfc TMP0, TISNUM, CARG3[m
[31m-  |  subfe TMP2, CARG3, CARG3[m
[31m-  |  orc TMP1, TMP2, TMP0[m
[31m-  |  addi TMP1, TMP1, ~LJ_TISNUM+1[m
[31m-  |  slwi TMP1, TMP1, 2[m
[31m-  |   la TMP2, DISPATCH_GL(gcroot[GCROOT_BASEMT])(DISPATCH)[m
[31m-  |  lwzx TAB:CARG1, TMP2, TMP1[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |   checktab CARG3; bne ->fff_fallback[m
[31m-  |  lwz TAB:TMP1, TAB:CARG1->metatable[m
[31m-  |   checktab CARG4; bne ->fff_fallback[m
[31m-  |  cmplwi TAB:TMP1, 0[m
[31m-  |   lbz TMP3, TAB:CARG1->marked[m
[31m-  |  bne ->fff_fallback[m
[31m-  |   andix. TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-  |    stw TAB:CARG2, TAB:CARG1->metatable[m
[31m-  |   beq ->fff_restv[m
[31m-  |  barrierback TAB:CARG1, TMP3, TMP0[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc rawget[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG4, 0(BASE)[m
[31m-  |    lwz TAB:CARG2, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checktab CARG4; bne ->fff_fallback[m
[31m-  |   la CARG3, 8(BASE)[m
[31m-  |   mr CARG1, L[m
[31m-  |  bl extern lj_tab_get  // (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // Returns cTValue *.[m
[31m-  |  lfd FARG1, 0(CRET1)[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG1, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  bne ->fff_fallback			// Exactly one argument.[m
[31m-  |   checknum CARG1; bgt ->fff_fallback[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  checkstr CARG3[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  beq ->fff_restv			// String key?[m
[31m-  |  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  lwz TMP0, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH)[m
[31m-  |  checknum CARG3[m
[31m-  |  cmplwi cr1, TMP0, 0[m
[31m-  |   stp BASE, L->base			// Add frame since C call can throw.[m
[31m-  |  crorc 4*cr0+eq, 4*cr0+gt, 4*cr1+eq[m
[31m-  |   stw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  beq ->fff_fallback[m
[31m-  |  ffgccheck[m
[31m-  |  mr CARG1, L[m
[31m-  |  mr CARG2, BASE[m
[31m-  |.if DUALNUM[m
[31m-  |  bl extern lj_strfmt_number		// (lua_State *L, cTValue *o)[m
[31m-  |.else[m
[31m-  |  bl extern lj_strfmt_num		// (lua_State *L, lua_Number *np)[m
[31m-  |.endif[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  li CARG3, LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc next[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG1, 0(BASE)[m
[31m-  |    lwz TAB:CARG2, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |   stwx TISNIL, BASE, NARGS8:RC	// Set missing 2nd arg to nil.[m
[31m-  |  checktab CARG1[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  bne ->fff_fallback[m
[31m-  |   stp BASE, L->base			// Add frame since C call can throw.[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp BASE, L->top			// Dummy frame length is ok.[m
[31m-  |  la CARG3, 8(BASE)[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Returns 0 at end of traversal.[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |   li CARG3, LJ_TNIL[m
[31m-  |  beq ->fff_restv			// End of traversal: return nil.[m
[31m-  |  lfd f0, 8(BASE)			// Copy key and value to results.[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  lfd f1, 16(BASE)[m
[31m-  |  stfd f0, 0(RA)[m
[31m-  |   li RD, (2+1)*8[m
[31m-  |  stfd f1, 8(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  checktab CARG3[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  bne ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |   lwz TAB:TMP2, TAB:CARG1->metatable[m
[31m-  |  lfd f0, CFUNC:RB->upvalue[0][m
[31m-  |   cmplwi TAB:TMP2, 0[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |   bne ->fff_fallback[m
[31m-#else[m
[31m-  |  lfd f0, CFUNC:RB->upvalue[0][m
[31m-  |  la RA, -8(BASE)[m
[31m-#endif[m
[31m-  |   stw TISNIL, 8(BASE)[m
[31m-  |  li RD, (3+1)*8[m
[31m-  |  stfd f0, 0(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc ipairs_aux[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz TAB:CARG1, 4(BASE)[m
[31m-  |   lwz CARG4, 8(BASE)[m
[31m-  |.if DUALNUM[m
[31m-  |    lwz TMP2, 12(BASE)[m
[31m-  |.else[m
[31m-  |    lfd FARG2, 8(BASE)[m
[31m-  |.endif[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checktab CARG3[m
[31m-  |  checknum cr1, CARG4[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |.if DUALNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  bne cr1, ->fff_fallback[m
[31m-  |.else[m
[31m-  |    lus TMP0, 0x3ff0[m
[31m-  |    stw ZERO, TMPD_LO[m
[31m-  |  bne ->fff_fallback[m
[31m-  |    stw TMP0, TMPD_HI[m
[31m-  |  bge cr1, ->fff_fallback[m
[31m-  |    lfd FARG1, TMPD[m
[31m-  |  toint TMP2, FARG2, f0[m
[31m-  |.endif[m
[31m-  |   lwz TMP0, TAB:CARG1->asize[m
[31m-  |   lwz TMP1, TAB:CARG1->array[m
[31m-  |.if not DUALNUM[m
[31m-  |  fadd FARG2, FARG2, FARG1[m
[31m-  |.endif[m
[31m-  |  addi TMP2, TMP2, 1[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  cmplw TMP0, TMP2[m
[31m-  |.if DUALNUM[m
[31m-  |  stw TISNUM, 0(RA)[m
[31m-  |   slwi TMP3, TMP2, 3[m
[31m-  |  stw TMP2, 4(RA)[m
[31m-  |.else[m
[31m-  |   slwi TMP3, TMP2, 3[m
[31m-  |  stfd FARG2, 0(RA)[m
[31m-  |.endif[m
[31m-  |  ble >2				// Not in array part?[m
[31m-  |  lwzx TMP2, TMP1, TMP3[m
[31m-  |  lfdx f0, TMP1, TMP3[m
[31m-  |1:[m
[31m-  |  checknil TMP2[m
[31m-  |   li RD, (0+1)*8[m
[31m-  |  beq ->fff_res			// End of iteration, return 0 results.[m
[31m-  |   li RD, (2+1)*8[m
[31m-  |  stfd f0, 8(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  lwz TMP0, TAB:CARG1->hmask[m
[31m-  |  cmplwi TMP0, 0[m
[31m-  |   li RD, (0+1)*8[m
[31m-  |  beq ->fff_res[m
[31m-  |   mr CARG2, TMP2[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |   li RD, (0+1)*8[m
[31m-  |  beq ->fff_res[m
[31m-  |  lwz TMP2, 0(CRET1)[m
[31m-  |  lfd f0, 0(CRET1)[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  checktab CARG3[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  bne ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |   lwz TAB:TMP2, TAB:CARG1->metatable[m
[31m-  |  lfd f0, CFUNC:RB->upvalue[0][m
[31m-  |   cmplwi TAB:TMP2, 0[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |   bne ->fff_fallback[m
[31m-#else[m
[31m-  |  lfd f0, CFUNC:RB->upvalue[0][m
[31m-  |  la RA, -8(BASE)[m
[31m-#endif[m
[31m-  |.if DUALNUM[m
[31m-  |  stw TISNUM, 8(BASE)[m
[31m-  |.else[m
[31m-  |  stw ZERO, 8(BASE)[m
[31m-  |.endif[m
[31m-  |   stw ZERO, 12(BASE)[m
[31m-  |  li RD, (3+1)*8[m
[31m-  |  stfd f0, 0(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc pcall[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |   mr TMP2, BASE[m
[31m-  |   la BASE, 8(BASE)[m
[31m-  |  // Remember active hook before pcall.[m
[31m-  |  rlwinm TMP3, TMP3, 32-HOOK_ACTIVE_SHIFT, 31, 31[m
[31m-  |   subi NARGS8:RC, NARGS8:RC, 8[m
[31m-  |  addi PC, TMP3, 8+FRAME_PCALL[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc xpcall[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG4, 8(BASE)[m
[31m-  |    lfd FARG2, 8(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  lbz TMP1, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |   mr TMP2, BASE[m
[31m-  |  checkfunc CARG4; bne ->fff_fallback  // Traceback must be a function.[m
[31m-  |   la BASE, 16(BASE)[m
[31m-  |  // Remember active hook before pcall.[m
[31m-  |  rlwinm TMP1, TMP1, 32-HOOK_ACTIVE_SHIFT, 31, 31[m
[31m-  |    stfd FARG2, 0(TMP2)		// Swap function and traceback.[m
[31m-  |  subi NARGS8:RC, NARGS8:RC, 16[m
[31m-  |    stfd FARG1, 8(TMP2)[m
[31m-  |  addi PC, TMP1, 16+FRAME_PCALL[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  cmpwi CARG3, LJ_TTHREAD; bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  lwz L:CARG1, CFUNC:RB->upvalue[0].gcr[m
[31m-  |.endif[m
[31m-  |  lbz TMP0, L:CARG1->status[m
[31m-  |   lp TMP1, L:CARG1->cframe[m
[31m-  |    lp CARG2, L:CARG1->top[m
[31m-  |  cmplwi cr0, TMP0, LUA_YIELD[m
[31m-  |    lp TMP2, L:CARG1->base[m
[31m-  |   cmplwi cr1, TMP1, 0[m
[31m-  |   lwz TMP0, L:CARG1->maxstack[m
[31m-  |    cmplw cr7, CARG2, TMP2[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  crorc 4*cr6+lt, 4*cr0+gt, 4*cr1+eq		// st>LUA_YIELD || cframe!=0[m
[31m-  |   add TMP2, CARG2, NARGS8:RC[m
[31m-  |  crandc 4*cr6+gt, 4*cr7+eq, 4*cr0+eq	// base==top && st!=LUA_YIELD[m
[31m-  |   cmplw cr1, TMP2, TMP0[m
[31m-  |  cror 4*cr6+lt, 4*cr6+lt, 4*cr6+gt[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  cror 4*cr6+lt, 4*cr6+lt, 4*cr1+gt		// cond1 || cond2 || stackov[m
[31m-  |   stp BASE, L->base[m
[31m-  |  blt cr6, ->fff_fallback[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  addi BASE, BASE, 8			// Keep resumed thread in stack for GC.[m
[31m-  |  subi NARGS8:RC, NARGS8:RC, 8[m
[31m-  |  subi TMP2, TMP2, 8[m
[31m-  |.endif[m
[31m-  |  stp TMP2, L:CARG1->top[m
[31m-  |  li TMP1, 0[m
[31m-  |  stp BASE, L->top[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |  cmpw TMP1, NARGS8:RC[m
[31m-  |   lfdx f0, BASE, TMP1[m
[31m-  |  beq >3[m
[31m-  |   stfdx f0, CARG2, TMP1[m
[31m-  |  addi TMP1, TMP1, 8[m
[31m-  |  b <2[m
[31m-  |3:[m
[31m-  |  li CARG3, 0[m
[31m-  |   mr L:SAVE0, L:CARG1[m
[31m-  |  li CARG4, 0[m
[31m-  |  bl ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |  // Returns thread status.[m
[31m-  |4:[m
[31m-  |  lp TMP2, L:SAVE0->base[m
[31m-  |   cmplwi CRET1, LUA_YIELD[m
[31m-  |  lp TMP3, L:SAVE0->top[m
[31m-  |    li_vmstate INTERP[m
[31m-  |  lp BASE, L->base[m
[31m-  |    stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |    st_vmstate[m
[31m-  |   bgt >8[m
[31m-  |  sub RD, TMP3, TMP2[m
[31m-  |   lwz TMP0, L->maxstack[m
[31m-  |  cmplwi RD, 0[m
[31m-  |   add TMP1, BASE, RD[m
[31m-  |  beq >6				// No results?[m
[31m-  |  cmplw TMP1, TMP0[m
[31m-  |   li TMP1, 0[m
[31m-  |  bgt >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  subi TMP3, RD, 8[m
[31m-  |   stp TMP2, L:SAVE0->top		// Clear coroutine stack.[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |  cmplw TMP1, TMP3[m
[31m-  |   lfdx f0, TMP2, TMP1[m
[31m-  |   stfdx f0, BASE, TMP1[m
[31m-  |    addi TMP1, TMP1, 8[m
[31m-  |  bne <5[m
[31m-  |6:[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |.if resume[m
[31m-  |  li TMP1, LJ_TTRUE[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  stw TMP1, -8(BASE)			// Prepend true to results.[m
[31m-  |  addi RD, RD, 16[m
[31m-  |.else[m
[31m-  |  mr RA, BASE[m
[31m-  |  addi RD, RD, 8[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |    stw PC, SAVE_PC[m
[31m-  |   mr MULTRES, RD[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |  la TMP3, -8(TMP3)[m
[31m-  |   li TMP1, LJ_TFALSE[m
[31m-  |  lfd f0, 0(TMP3)[m
[31m-  |   stp TMP3, L:SAVE0->top		// Remove error from coroutine stack.[m
[31m-  |    li RD, (2+1)*8[m
[31m-  |   stw TMP1, -8(BASE)		// Prepend false to results.[m
[31m-  |    la RA, -8(BASE)[m
[31m-  |  stfd f0, 0(BASE)			// Copy error message.[m
[31m-  |  b <7[m
[31m-  |.else[m
[31m-  |  mr CARG1, L[m
[31m-  |  mr CARG2, L:SAVE0[m
[31m-  |  bl extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  mr CARG1, L[m
[31m-  |  srwi CARG2, RD, 3[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  li CRET1, 0[m
[31m-  |  b <4[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  lp TMP0, L->cframe[m
[31m-  |   add TMP1, BASE, NARGS8:RC[m
[31m-  |   stp BASE, L->base[m
[31m-  |  andix. TMP0, TMP0, CFRAME_RESUME[m
[31m-  |   stp TMP1, L->top[m
[31m-  |    li CRET1, LUA_YIELD[m
[31m-  |  beq ->fff_fallback[m
[31m-  |   stp ZERO, L->cframe[m
[31m-  |    stb CRET1, L->status[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 math_abs[m
[31m-  |  checknum CARG3[m
[31m-  |.if DUALNUM[m
[31m-  |  bne >2[m
[31m-  |  srawi TMP1, CARG1, 31[m
[31m-  |  xor TMP2, TMP1, CARG1[m
[31m-  |.if GPR64[m
[31m-  |  lus TMP0, 0x8000[m
[31m-  |  sub CARG1, TMP2, TMP1[m
[31m-  |  cmplw CARG1, TMP0[m
[31m-  |  beq >1[m
[31m-  |.else[m
[31m-  |  sub. CARG1, TMP2, TMP1[m
[31m-  |  blt >1[m
[31m-  |.endif[m
[31m-  |->fff_resi:[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |  stw TISNUM, -8(BASE)[m
[31m-  |  stw CRET1, -4(BASE)[m
[31m-  |  b ->fff_res1[m
[31m-  |1:[m
[31m-  |  lus CARG3, 0x41e0	// 2^31.[m
[31m-  |  li CARG1, 0[m
[31m-  |  b ->fff_restv[m
[31m-  |2:[m
[31m-  |.endif[m
[31m-  |  bge ->fff_fallback[m
[31m-  |  rlwinm CARG3, CARG3, 0, 1, 31[m
[31m-  |  // Fallthrough.[m
[31m-  |[m
[31m-  |->fff_restv:[m
[31m-  |  // CARG3/CARG1 = TValue result.[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |   stw CARG3, -8(BASE)[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |   stw CARG1, -4(BASE)[m
[31m-  |->fff_res1:[m
[31m-  |  // RA = results, PC = return.[m
[31m-  |  li RD, (1+1)*8[m
[31m-  |->fff_res:[m
[31m-  |  // RA = results, RD = (nresults+1)*8, PC = return.[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |   mr MULTRES, RD[m
[31m-  |  bney ->vm_return[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |5:[m
[31m-  |  cmplw RB, RD			// More results expected?[m
[31m-  |   decode_RA8 TMP0, INS[m
[31m-  |  bgt >6[m
[31m-  |  ins_next1[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |   sub BASE, RA, TMP0[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  subi TMP1, RD, 8[m
[31m-  |   addi RD, RD, 8[m
[31m-  |  stwx TISNIL, RA, TMP1[m
[31m-  |  b <5[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc_n math_ .. func[m
[31m-  |  blex func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |  blex func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_round, func[m
[31m-  |  .ffunc_1 math_ .. func[m
[31m-  |   checknum CARG3; beqy ->fff_restv[m
[31m-  |  rlwinm TMP2, CARG3, 12, 21, 31[m
[31m-  |   bge ->fff_fallback[m
[31m-  |  addic. TMP2, TMP2, -1023		// exp = exponent(x) - 1023[m
[31m-  |  cmplwi cr1, TMP2, 31		// 0 <= exp < 31?[m
[31m-  |   subfic TMP0, TMP2, 31[m
[31m-  |  blt >3[m
[31m-  |  slwi TMP1, CARG3, 11[m
[31m-  |   srwi TMP3, CARG1, 21[m
[31m-  |  oris TMP1, TMP1, 0x8000[m
[31m-  |   addi TMP2, TMP2, 1[m
[31m-  |  or TMP1, TMP1, TMP3[m
[31m-  |   slwi CARG2, CARG1, 11[m
[31m-  |  bge cr1, >4[m
[31m-  |   slw TMP3, TMP1, TMP2[m
[31m-  |  srw RD, TMP1, TMP0[m
[31m-  |   or TMP3, TMP3, CARG2[m
[31m-  |  srawi TMP2, CARG3, 31[m
[31m-  |.if "func" == "floor"[m
[31m-  |  and TMP1, TMP3, TMP2[m
[31m-  |  addic TMP0, TMP1, -1[m
[31m-  |  subfe TMP1, TMP0, TMP1[m
[31m-  |  add CARG1, RD, TMP1[m
[31m-  |  xor CARG1, CARG1, TMP2[m
[31m-  |  sub CARG1, CARG1, TMP2[m
[31m-  |  b ->fff_resi[m
[31m-  |.else[m
[31m-  |  andc TMP1, TMP3, TMP2[m
[31m-  |  addic TMP0, TMP1, -1[m
[31m-  |  subfe TMP1, TMP0, TMP1[m
[31m-  |  add CARG1, RD, TMP1[m
[31m-  |  cmpw CARG1, RD[m
[31m-  |  xor CARG1, CARG1, TMP2[m
[31m-  |  sub CARG1, CARG1, TMP2[m
[31m-  |  bge ->fff_resi[m
[31m-  |  // Overflow to 2^31.[m
[31m-  |  lus CARG3, 0x41e0			// 2^31.[m
[31m-  |  li CARG1, 0[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |3:  // |x| < 1[m
[31m-  |  slwi TMP2, CARG3, 1[m
[31m-  |   srawi TMP1, CARG3, 31[m
[31m-  |  or TMP2, CARG1, TMP2		// ztest = (hi+hi) | lo[m
[31m-  |.if "func" == "floor"[m
[31m-  |  and TMP1, TMP2, TMP1		// (ztest & sign) == 0 ? 0 : -1[m
[31m-  |  subfic TMP2, TMP1, 0[m
[31m-  |  subfe CARG1, CARG1, CARG1[m
[31m-  |.else[m
[31m-  |  andc TMP1, TMP2, TMP1		// (ztest & ~sign) == 0 ? 0 : 1[m
[31m-  |  addic TMP2, TMP1, -1[m
[31m-  |  subfe CARG1, TMP2, TMP1[m
[31m-  |.endif[m
[31m-  |  b ->fff_resi[m
[31m-  |4:  // exp >= 31. Check for -(2^31).[m
[31m-  |  xoris TMP1, TMP1, 0x8000[m
[31m-  |  srawi TMP2, CARG3, 31[m
[31m-  |.if "func" == "floor"[m
[31m-  |  or TMP1, TMP1, CARG2[m
[31m-  |.endif[m
[31m-  |.if PPE[m
[31m-  |  orc TMP1, TMP1, TMP2[m
[31m-  |  cmpwi TMP1, 0[m
[31m-  |.else[m
[31m-  |  orc. TMP1, TMP1, TMP2[m
[31m-  |.endif[m
[31m-  |  crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq[m
[31m-  |  lus CARG1, 0x8000			// -(2^31).[m
[31m-  |  beqy ->fff_resi[m
[31m-  |5:[m
[31m-  |  lfd FARG1, 0(BASE)[m
[31m-  |  blex func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.if DUALNUM[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |.else[m
[31m-  |  // NYI: use internal implementation.[m
[31m-  |  math_extern floor[m
[31m-  |  math_extern ceil[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.if SQRT[m
[31m-  |.ffunc_n math_sqrt[m
[31m-  |  fsqrt FARG1, FARG1[m
[31m-  |  b ->fff_resn[m
[31m-  |.else[m
[31m-  |  math_extern sqrt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  bne ->fff_fallback			// Need exactly 1 argument.[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  blex log[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.if DUALNUM[m
[31m-  |.ffunc math_ldexp[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |   lwz CARG4, 8(BASE)[m
[31m-  |.if GPR64[m
[31m-  |    lwz CARG2, 12(BASE)[m
[31m-  |.else[m
[31m-  |    lwz CARG1, 12(BASE)[m
[31m-  |.endif[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  checknum CARG4; bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc_nn math_ldexp[m
[31m-  |.if GPR64[m
[31m-  |  toint CARG2, FARG2[m
[31m-  |.else[m
[31m-  |  toint CARG1, FARG2[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |  blex ldexp[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |.if GPR64[m
[31m-  |  la CARG2, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |.else[m
[31m-  |  la CARG1, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |.endif[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  blex frexp[m
[31m-  |   lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |.if not DUALNUM[m
[31m-  |   tonum_i FARG2, TMP1[m
[31m-  |.endif[m
[31m-  |  stfd FARG1, 0(RA)[m
[31m-  |  li RD, (2+1)*8[m
[31m-  |.if DUALNUM[m
[31m-  |   stw TISNUM, 8(RA)[m
[31m-  |   stw TMP1, 12(RA)[m
[31m-  |.else[m
[31m-  |   stfd FARG2, 8(RA)[m
[31m-  |.endif[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_n math_modf[m
[31m-  |.if GPR64[m
[31m-  |  la CARG2, -8(BASE)[m
[31m-  |.else[m
[31m-  |  la CARG1, -8(BASE)[m
[31m-  |.endif[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  blex modf[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  stfd FARG1, 0(BASE)[m
[31m-  |  li RD, (2+1)*8[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.macro math_minmax, name, ismax[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_1 name[m
[31m-  |  checknum CARG3[m
[31m-  |   addi TMP1, BASE, 8[m
[31m-  |   add TMP2, BASE, NARGS8:RC[m
[31m-  |  bne >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  lwz CARG4, 0(TMP1)[m
[31m-  |   cmplw cr1, TMP1, TMP2[m
[31m-  |  lwz CARG2, 4(TMP1)[m
[31m-  |   bge cr1, ->fff_resi[m
[31m-  |  checknum CARG4[m
[31m-  |   xoris TMP0, CARG1, 0x8000[m
[31m-  |   xoris TMP3, CARG2, 0x8000[m
[31m-  |  bne >3[m
[31m-  |  subfc TMP3, TMP3, TMP0[m
[31m-  |  subfe TMP0, TMP0, TMP0[m
[31m-  |.if ismax[m
[31m-  |  andc TMP3, TMP3, TMP0[m
[31m-  |.else[m
[31m-  |  and TMP3, TMP3, TMP0[m
[31m-  |.endif[m
[31m-  |  add CARG1, TMP3, CARG2[m
[31m-  |.if GPR64[m
[31m-  |  rldicl CARG1, CARG1, 0, 32[m
[31m-  |.endif[m
[31m-  |   addi TMP1, TMP1, 8[m
[31m-  |  b <1[m
[31m-  |3:[m
[31m-  |  bge ->fff_fallback[m
[31m-  |  // Convert intermediate result to number and continue below.[m
[31m-  |  tonum_i FARG1, CARG1[m
[31m-  |  lfd FARG2, 0(TMP1)[m
[31m-  |  b >6[m
[31m-  |4:[m
[31m-  |   lfd FARG1, 0(BASE)[m
[31m-  |  bge ->fff_fallback[m
[31m-  |5:  // Handle numbers.[m
[31m-  |  lwz CARG4, 0(TMP1)[m
[31m-  |   cmplw cr1, TMP1, TMP2[m
[31m-  |  lfd FARG2, 0(TMP1)[m
[31m-  |   bge cr1, ->fff_resn[m
[31m-  |  checknum CARG4; bge >7[m
[31m-  |6:[m
[31m-  |  fsub f0, FARG1, FARG2[m
[31m-  |   addi TMP1, TMP1, 8[m
[31m-  |.if ismax[m
[31m-  |  fsel FARG1, f0, FARG1, FARG2[m
[31m-  |.else[m
[31m-  |  fsel FARG1, f0, FARG2, FARG1[m
[31m-  |.endif[m
[31m-  |  b <5[m
[31m-  |7:  // Convert integer to number and continue above.[m
[31m-  |   lwz CARG2, 4(TMP1)[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  tonum_i FARG2, CARG2[m
[31m-  |  b <6[m
[31m-  |.else[m
[31m-  |  .ffunc_n name[m
[31m-  |  li TMP1, 8[m
[31m-  |1:[m
[31m-  |   lwzx CARG2, BASE, TMP1[m
[31m-  |   lfdx FARG2, BASE, TMP1[m
[31m-  |  cmplw cr1, TMP1, NARGS8:RC[m
[31m-  |   checknum CARG2[m
[31m-  |  bge cr1, ->fff_resn[m
[31m-  |   bge ->fff_fallback[m
[31m-  |  fsub f0, FARG1, FARG2[m
[31m-  |   addi TMP1, TMP1, 8[m
[31m-  |.if ismax[m
[31m-  |  fsel FARG1, f0, FARG1, FARG2[m
[31m-  |.else[m
[31m-  |  fsel FARG1, f0, FARG2, FARG1[m
[31m-  |.endif[m
[31m-  |  b <1[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, 0[m
[31m-  |  math_minmax math_max, 1[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz STR:CARG1, 4(BASE)[m
[31m-  |  bne ->fff_fallback			// Need exactly 1 argument.[m
[31m-  |   checkstr CARG3[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  lwz TMP0, STR:CARG1->len[m
[31m-  |.if DUALNUM[m
[31m-  |   lbz CARG1, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |   li RD, (0+1)*8[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  cmplwi TMP0, 0[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  beqy ->fff_res[m
[31m-  |  b ->fff_resi[m
[31m-  |.else[m
[31m-  |   lbz TMP1, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |  addic TMP3, TMP0, -1		// RD = ((str->len != 0)+1)*8[m
[31m-  |  subfe RD, TMP3, TMP0[m
[31m-  |   stw TMP1, TONUM_LO		// Inlined tonum_u f0, TMP1.[m
[31m-  |  addi RD, RD, 1[m
[31m-  |   lfd f0, TONUM_D[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |   fsub f0, f0, TOBIT[m
[31m-  |  slwi RD, RD, 3[m
[31m-  |   stfd f0, 0(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |.if DUALNUM[m
[31m-  |    lwz TMP0, 4(BASE)[m
[31m-  |  bne ->fff_fallback			// Exactly 1 argument.[m
[31m-  |  checknum CARG3; bne ->fff_fallback[m
[31m-  |   la CARG2, 7(BASE)[m
[31m-  |.else[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  bne ->fff_fallback			// Exactly 1 argument.[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  toint TMP0, FARG1[m
[31m-  |   la CARG2, TMPD_BLO[m
[31m-  |.endif[m
[31m-  |   li CARG3, 1[m
[31m-  |  cmplwi TMP0, 255; bgt ->fff_fallback[m
[31m-  |->fff_newstr:[m
[31m-  |  mr CARG1, L[m
[31m-  |  stp BASE, L->base[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  lp BASE, L->base[m
[31m-  |  li CARG3, LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 16(BASE)[m
[31m-  |.if not DUALNUM[m
[31m-  |    lfd f0, 16(BASE)[m
[31m-  |.endif[m
[31m-  |   lwz TMP0, 0(BASE)[m
[31m-  |    lwz STR:CARG1, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |   lwz CARG2, 8(BASE)[m
[31m-  |.if DUALNUM[m
[31m-  |    lwz TMP1, 12(BASE)[m
[31m-  |.else[m
[31m-  |    lfd f1, 8(BASE)[m
[31m-  |.endif[m
[31m-  |   li TMP2, -1[m
[31m-  |  beq >1[m
[31m-  |.if DUALNUM[m
[31m-  |  checknum CARG3[m
[31m-  |   lwz TMP2, 20(BASE)[m
[31m-  |  bne ->fff_fallback[m
[31m-  |1:[m
[31m-  |  checknum CARG2; bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  toint TMP2, f0[m
[31m-  |1:[m
[31m-  |  checknum CARG2; bge ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  checkstr TMP0; bne ->fff_fallback[m
[31m-  |.if not DUALNUM[m
[31m-  |   toint TMP1, f1[m
[31m-  |.endif[m
[31m-  |   lwz TMP0, STR:CARG1->len[m
[31m-  |  cmplw TMP0, TMP2			// len < end? (unsigned compare)[m
[31m-  |   addi TMP3, TMP2, 1[m
[31m-  |  blt >5[m
[31m-  |2:[m
[31m-  |  cmpwi TMP1, 0			// start <= 0?[m
[31m-  |   add TMP3, TMP1, TMP0[m
[31m-  |  ble >7[m
[31m-  |3:[m
[31m-  |  sub CARG3, TMP2, TMP1[m
[31m-  |    addi CARG2, STR:CARG1, #STR-1[m
[31m-  |  srawi TMP0, CARG3, 31[m
[31m-  |   addi CARG3, CARG3, 1[m
[31m-  |    add CARG2, CARG2, TMP1[m
[31m-  |  andc CARG3, CARG3, TMP0[m
[31m-  |.if GPR64[m
[31m-  |  rldicl CARG2, CARG2, 0, 32[m
[31m-  |  rldicl CARG3, CARG3, 0, 32[m
[31m-  |.endif[m
[31m-  |  b ->fff_newstr[m
[31m-  |[m
[31m-  |5:  // Negative end or overflow.[m
[31m-  |  cmpw TMP0, TMP2			// len >= end? (signed compare)[m
[31m-  |   add TMP2, TMP0, TMP3		// Negative end: end = end+len+1.[m
[31m-  |  bge <2[m
[31m-  |   mr TMP2, TMP0			// Overflow: end = len.[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |7:  // Negative start or underflow.[m
[31m-  |  .gpr64 extsw TMP1, TMP1[m
[31m-  |  addic CARG3, TMP1, -1[m
[31m-  |  subfe CARG3, CARG3, CARG3[m
[31m-  |   srawi CARG2, TMP3, 31		// Note: modifies carry.[m
[31m-  |  andc TMP3, TMP3, CARG3[m
[31m-  |   andc TMP1, TMP3, CARG2[m
[31m-  |  addi TMP1, TMP1, 1			// start = 1 + (start ? start+len : 0)[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz STR:CARG2, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checkstr CARG3[m
[31m-  |   la SBUF:CARG1, DISPATCH_GL(tmpbuf)(DISPATCH)[m
[31m-  |  bne ->fff_fallback[m
[31m-  |   lwz TMP0, SBUF:CARG1->b[m
[31m-  |  stw L, SBUF:CARG1->L[m
[31m-  |  stp BASE, L->base[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |   stw TMP0, SBUF:CARG1->p[m
[31m-  |  bl extern lj_buf_putstr_ .. name[m
[31m-  |  bl extern lj_buf_tostr[m
[31m-  |  b ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_1 bit_..name[m
[31m-  |  checknum CARG3; bnel ->fff_tobit_fb[m
[31m-  |.else[m
[31m-  |  .ffunc_n bit_..name[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG1, TMPD_LO[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name[m
[31m-  |  addi TMP1, BASE, 8[m
[31m-  |  add TMP2, BASE, NARGS8:RC[m
[31m-  |1:[m
[31m-  |  lwz CARG4, 0(TMP1)[m
[31m-  |   cmplw cr1, TMP1, TMP2[m
[31m-  |.if DUALNUM[m
[31m-  |  lwz CARG2, 4(TMP1)[m
[31m-  |.else[m
[31m-  |  lfd FARG1, 0(TMP1)[m
[31m-  |.endif[m
[31m-  |   bgey cr1, ->fff_resi[m
[31m-  |  checknum CARG4[m
[31m-  |.if DUALNUM[m
[31m-  |  bnel ->fff_bitop_fb[m
[31m-  |.else[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  bge ->fff_fallback[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG2, TMPD_LO[m
[31m-  |.endif[m
[31m-  |  ins CARG1, CARG1, CARG2[m
[31m-  |   addi TMP1, TMP1, 8[m
[31m-  |  b <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op band, and[m
[31m-  |.ffunc_bit_op bor, or[m
[31m-  |.ffunc_bit_op bxor, xor[m
[31m-  |[m
[31m-  |.ffunc_bit bswap[m
[31m-  |  rotlwi TMP0, CARG1, 8[m
[31m-  |  rlwimi TMP0, CARG1, 24, 0, 7[m
[31m-  |  rlwimi TMP0, CARG1, 24, 16, 23[m
[31m-  |  mr CRET1, TMP0[m
[31m-  |  b ->fff_resi[m
[31m-  |[m
[31m-  |.ffunc_bit bnot[m
[31m-  |  not CRET1, CARG1[m
[31m-  |  b ->fff_resi[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins, shmod[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_2 bit_..name[m
[31m-  |  checknum CARG3; bnel ->fff_tobit_fb[m
[31m-  |  // Note: no inline conversion from number for 2nd argument![m
[31m-  |  checknum CARG4; bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  .ffunc_nn bit_..name[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  fadd FARG2, FARG2, TOBIT[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG1, TMPD_LO[m
[31m-  |  stfd FARG2, TMPD[m
[31m-  |  lwz CARG2, TMPD_LO[m
[31m-  |.endif[m
[31m-  |.if shmod == 1[m
[31m-  |  rlwinm CARG2, CARG2, 0, 27, 31[m
[31m-  |.elif shmod == 2[m
[31m-  |  neg CARG2, CARG2[m
[31m-  |.endif[m
[31m-  |  ins CRET1, CARG1, CARG2[m
[31m-  |  b ->fff_resi[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh lshift, slw, 1[m
[31m-  |.ffunc_bit_sh rshift, srw, 1[m
[31m-  |.ffunc_bit_sh arshift, sraw, 1[m
[31m-  |.ffunc_bit_sh rol, rotlw, 0[m
[31m-  |.ffunc_bit_sh ror, rotlw, 2[m
[31m-  |[m
[31m-  |.ffunc_bit tobit[m
[31m-  |.if DUALNUM[m
[31m-  |  b ->fff_resi[m
[31m-  |.else[m
[31m-  |->fff_resi:[m
[31m-  |  tonum_i FARG1, CRET1[m
[31m-  |.endif[m
[31m-  |->fff_resn:[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |  stfd FARG1, -8(BASE)[m
[31m-  |  b ->fff_res1[m
[31m-  |[m
[31m-  |// Fallback FP number to bit conversion.[m
[31m-  |->fff_tobit_fb:[m
[31m-  |.if DUALNUM[m
[31m-  |  lfd FARG1, 0(BASE)[m
[31m-  |  bgt ->fff_fallback[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG1, TMPD_LO[m
[31m-  |  blr[m
[31m-  |.endif[m
[31m-  |->fff_bitop_fb:[m
[31m-  |.if DUALNUM[m
[31m-  |  lfd FARG1, 0(TMP1)[m
[31m-  |  bgt ->fff_fallback[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG2, TMPD_LO[m
[31m-  |  blr[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RB = CFUNC, RC = nargs*8[m
[31m-  |  lp TMP3, CFUNC:RB->f[m
[31m-  |    add TMP1, BASE, NARGS8:RC[m
[31m-  |   lwz PC, FRAME_PC(BASE)		// Fallback may overwrite PC.[m
[31m-  |    addi TMP0, TMP1, 8*LUA_MINSTACK[m
[31m-  |     lwz TMP2, L->maxstack[m
[31m-  |   stw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  .toc lp TMP3, 0(TMP3)[m
[31m-  |  cmplw TMP0, TMP2[m
[31m-  |     stp BASE, L->base[m
[31m-  |    stp TMP1, L->top[m
[31m-  |   mr CARG1, L[m
[31m-  |  bgt >5				// Need to grow stack.[m
[31m-  |  mtctr TMP3[m
[31m-  |  bctrl				// (lua_State *L)[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |  lp BASE, L->base[m
[31m-  |  cmpwi CRET1, 0[m
[31m-  |   slwi RD, CRET1, 3[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  bgt ->fff_res			// Returned nresults+1?[m
[31m-  |1:  // Returned 0 or -1: retry fast path.[m
[31m-  |  lp TMP0, L->top[m
[31m-  |   lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  sub NARGS8:RC, TMP0, BASE[m
[31m-  |  bne ->vm_call_tail			// Returned -1?[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |   rlwinm TMP1, PC, 0, 0, 28[m
[31m-  |  bne >3[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |  decode_RA8 TMP1, INS[m
[31m-  |  addi TMP1, TMP1, 8[m
[31m-  |3:[m
[31m-  |  sub TMP2, BASE, TMP1[m
[31m-  |  b ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  li CARG2, LUA_MINSTACK[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  lp BASE, L->base[m
[31m-  |  cmpw TMP0, TMP0			// Set 4*cr0+eq to force retry.[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |  mflr SAVE0[m
[31m-  |   stp BASE, L->base[m
[31m-  |  add TMP0, BASE, NARGS8:RC[m
[31m-  |   stw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  stp TMP0, L->top[m
[31m-  |  mr CARG1, L[m
[31m-  |  bl extern lj_gc_step		// (lua_State *L)[m
[31m-  |   lp BASE, L->base[m
[31m-  |  mtlr SAVE0[m
[31m-  |    lp TMP0, L->top[m
[31m-  |   sub NARGS8:RC, TMP0, BASE[m
[31m-  |   lwz CFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  blr[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  andix. TMP0, TMP3, HOOK_VMEVENT	// No recording while in vmevent.[m
[31m-  |  bne >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |   lwz TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andix. TMP0, TMP3, HOOK_ACTIVE[m
[31m-  |  bne >1[m
[31m-  |   subi TMP2, TMP2, 1[m
[31m-  |  andi. TMP0, TMP3, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beqy >1[m
[31m-  |   stw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  andix. TMP0, TMP3, HOOK_ACTIVE	// Hook already active?[m
[31m-  |  beq >1[m
[31m-  |5:  // Re-dispatch to static ins.[m
[31m-  |  addi TMP1, TMP1, GG_DISP2STATIC	// Assumes decode_OPP TMP1, INS.[m
[31m-  |  lpx TMP0, DISPATCH, TMP1[m
[31m-  |  mtctr TMP0[m
[31m-  |  bctr[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  lwz TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andix. TMP0, TMP3, HOOK_ACTIVE	// Hook already active?[m
[31m-  |   rlwinm TMP0, TMP3, 31-LUA_HOOKLINE, 31, 0[m
[31m-  |  bne <5[m
[31m-  |[m
[31m-  |   cmpwi cr1, TMP0, 0[m
[31m-  |  addic. TMP2, TMP2, -1[m
[31m-  |   beq cr1, <5[m
[31m-  |  stw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  beq >1[m
[31m-  |   bge cr1, <5[m
[31m-  |1:[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw MULTRES, SAVE_MULTRES[m
[31m-  |  mr CARG2, PC[m
[31m-  |   stp BASE, L->base[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  bl extern lj_dispatch_ins		// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  lp BASE, L->base[m
[31m-  |4:  // Re-dispatch to static ins.[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |  decode_OPP TMP1, INS[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  addi TMP1, TMP1, GG_DISP2STATIC[m
[31m-  |   decode_RD8 RD, INS[m
[31m-  |  lpx TMP0, DISPATCH, TMP1[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  mtctr TMP0[m
[31m-  |  bctr[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  addi PC, PC, 4[m
[31m-  |  lwz MULTRES, -20(RB)		// Restore MULTRES for *M ins.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  lwz LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-  |   addi CARG1, DISPATCH, GG_DISP2J[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  lwz TMP1, LFUNC:TMP1->pc[m
[31m-  |   mr CARG2, PC[m
[31m-  |   stw L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  lbz TMP1, PC2PROTO(framesize)(TMP1)[m
[31m-  |   stp BASE, L->base[m
[31m-  |  slwi TMP1, TMP1, 3[m
[31m-  |  add TMP1, BASE, TMP1[m
[31m-  |  stp TMP1, L->top[m
[31m-  |  bl extern lj_trace_hot		// (jit_State *J, const BCIns *pc)[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mr CARG2, PC[m
[31m-  |.if JIT[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  ori CARG2, PC, 1[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  add TMP0, BASE, RC[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp BASE, L->base[m
[31m-  |  sub RA, RA, BASE[m
[31m-  |   stp TMP0, L->top[m
[31m-  |  bl extern lj_dispatch_call		// (lua_State *L, const BCIns *pc)[m
[31m-  |  // Returns ASMFunction.[m
[31m-  |  lp BASE, L->base[m
[31m-  |   lp TMP0, L->top[m
[31m-  |   stw ZERO, SAVE_PC			// Invalidate for subsequent line hook.[m
[31m-  |  sub NARGS8:RC, TMP0, BASE[m
[31m-  |  add RA, BASE, RA[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |  mtctr CRET1[m
[31m-  |  bctr[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // RA = resultptr, RB = meta base[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |    lwz TRACE:TMP2, -20(RB)		// Save previous trace.[m
[31m-  |   addic. TMP1, MULTRES, -8[m
[31m-  |  decode_RA8 RC, INS			// Call base.[m
[31m-  |   beq >2[m
[31m-  |1:  // Move results down.[m
[31m-  |  lfd f0, 0(RA)[m
[31m-  |   addic. TMP1, TMP1, -8[m
[31m-  |    addi RA, RA, 8[m
[31m-  |  stfdx f0, BASE, RC[m
[31m-  |    addi RC, RC, 8[m
[31m-  |   bne <1[m
[31m-  |2:[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |   add RA, RA, RB[m
[31m-  |3:[m
[31m-  |   cmplw RA, RC[m
[31m-  |   bgt >9				// More results wanted?[m
[31m-  |[m
[31m-  |  lhz TMP3, TRACE:TMP2->traceno[m
[31m-  |  lhz RD, TRACE:TMP2->link[m
[31m-  |  cmpw RD, TMP3[m
[31m-  |   cmpwi cr1, RD, 0[m
[31m-  |  beq ->cont_nop			// Blacklisted.[m
[31m-  |    slwi RD, RD, 3[m
[31m-  |   bne cr1, =>BC_JLOOP		// Jump to stitched trace.[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  stw TMP3, DISPATCH_J(exitno)(DISPATCH)[m
[31m-  |  stp L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  stp BASE, L->base[m
[31m-  |  addi CARG1, DISPATCH, GG_DISP2J[m
[31m-  |  mr CARG2, PC[m
[31m-  |  bl extern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)[m
[31m-  |  lp BASE, L->base[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |9:[m
[31m-  |  stwx TISNIL, BASE, RC[m
[31m-  |  addi RC, RC, 8[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw MULTRES, SAVE_MULTRES[m
[31m-  |  mr CARG2, PC[m
[31m-  |   stp BASE, L->base[m
[31m-  |  bl extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  lp BASE, L->base[m
[31m-  |  subi PC, PC, 4[m
[31m-  |  b ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro savex_, a, b, c, d[m
[31m-  |  stfd f..a, 16+a*8(sp)[m
[31m-  |  stfd f..b, 16+b*8(sp)[m
[31m-  |  stfd f..c, 16+c*8(sp)[m
[31m-  |  stfd f..d, 16+d*8(sp)[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |  addi sp, sp, -(16+32*8+32*4)[m
[31m-  |  stmw r2, 16+32*8+2*4(sp)[m
[31m-  |    addi DISPATCH, JGL, -GG_DISP2G-32768[m
[31m-  |    li CARG2, ~LJ_VMST_EXIT[m
[31m-  |   lwz CARG1, 16+32*8+32*4(sp)	// Get stack chain.[m
[31m-  |    stw CARG2, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-  |  savex_ 0,1,2,3[m
[31m-  |   stw CARG1, 0(sp)			// Store extended stack chain.[m
[31m-  |   clrso TMP1[m
[31m-  |  savex_ 4,5,6,7[m
[31m-  |   addi CARG2, sp, 16+32*8+32*4	// Recompute original value of sp.[m
[31m-  |  savex_ 8,9,10,11[m
[31m-  |   stw CARG2, 16+32*8+1*4(sp)	// Store sp in RID_SP.[m
[31m-  |  savex_ 12,13,14,15[m
[31m-  |   mflr CARG3[m
[31m-  |   li TMP1, 0[m
[31m-  |  savex_ 16,17,18,19[m
[31m-  |   stw TMP1, 16+32*8+0*4(sp)		// Clear RID_TMP.[m
[31m-  |  savex_ 20,21,22,23[m
[31m-  |   lhz CARG4, 2(CARG3)		// Load trace number.[m
[31m-  |  savex_ 24,25,26,27[m
[31m-  |  lwz L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  savex_ 28,29,30,31[m
[31m-  |   sub CARG3, TMP0, CARG3		// Compute exit number.[m
[31m-  |  lp BASE, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |   srwi CARG3, CARG3, 2[m
[31m-  |  stp L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |   subi CARG3, CARG3, 2[m
[31m-  |  stp BASE, L->base[m
[31m-  |   stw CARG4, DISPATCH_J(parent)(DISPATCH)[m
[31m-  |  stw TMP1, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  addi CARG1, DISPATCH, GG_DISP2J[m
[31m-  |   stw CARG3, DISPATCH_J(exitno)(DISPATCH)[m
[31m-  |  addi CARG2, sp, 16[m
[31m-  |  bl extern lj_trace_exit		// (jit_State *J, ExitState *ex)[m
[31m-  |  // Returns MULTRES (unscaled) or negated error code.[m
[31m-  |  lp TMP1, L->cframe[m
[31m-  |  lwz TMP2, 0(sp)[m
[31m-  |   lp BASE, L->base[m
[31m-  |.if GPR64[m
[31m-  |  rldicr sp, TMP1, 0, 61[m
[31m-  |.else[m
[31m-  |  rlwinm sp, TMP1, 0, 0, 29[m
[31m-  |.endif[m
[31m-  |   lwz PC, SAVE_PC			// Get SAVE_PC.[m
[31m-  |  stw TMP2, 0(sp)[m
[31m-  |  stw L, SAVE_L			// Set SAVE_L (on-trace resume/yield).[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |.if JIT[m
[31m-  |  // CARG1 = MULTRES or negated error code, BASE, PC and JGL set.[m
[31m-  |  lwz L, SAVE_L[m
[31m-  |  addi DISPATCH, JGL, -GG_DISP2G-32768[m
[31m-  |  stp BASE, L->base[m
[31m-  |1:[m
[31m-  |  cmpwi CARG1, 0[m
[31m-  |  blt >9				// Check for error from exit.[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |   slwi MULTRES, CARG1, 3[m
[31m-  |    li TMP2, 0[m
[31m-  |   stw MULTRES, SAVE_MULTRES[m
[31m-  |  lwz TMP1, LFUNC:RB->pc[m
[31m-  |    stw TMP2, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |  // Setup type comparison constants.[m
[31m-  |  li TISNUM, LJ_TISNUM[m
[31m-  |  lus TMP3, 0x59c0			// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |  stw TMP3, TMPD[m
[31m-  |  li ZERO, 0[m
[31m-  |  ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |  lfs TOBIT, TMPD[m
[31m-  |  stw TMP3, TMPD[m
[31m-  |  lus TMP0, 0x4338			// Hiword of 2^52 + 2^51 (double)[m
[31m-  |    li TISNIL, LJ_TNIL[m
[31m-  |  stw TMP0, TONUM_HI[m
[31m-  |  lfs TONUM, TMPD[m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  lwz INS, 0(PC)[m
[31m-  |   addi PC, PC, 4[m
[31m-  |    // Assumes TISNIL == ~LJ_VMST_INTERP == -1.[m
[31m-  |    stw TISNIL, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-  |  decode_OPP TMP1, INS[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |  lpx TMP0, DISPATCH, TMP1[m
[31m-  |  mtctr TMP0[m
[31m-  |  cmplwi TMP1, BC_FUNCF*4		// Function header?[m
[31m-  |  bge >2[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |   decode_RD8 RD, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  bctr[m
[31m-  |2:[m
[31m-  |  cmplwi TMP1, (BC_FUNCC+2)*4	// Fast function?[m
[31m-  |  blt >3[m
[31m-  |  // Check frame below fast function.[m
[31m-  |  lwz TMP1, FRAME_PC(BASE)[m
[31m-  |  andix. TMP0, TMP1, FRAME_TYPE[m
[31m-  |  bney >3				// Trace stitching continuation?[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  lwz TMP2, -4(TMP1)[m
[31m-  |  decode_RA8 TMP0, TMP2[m
[31m-  |  sub TMP1, BASE, TMP0[m
[31m-  |  lwz LFUNC:TMP2, -12(TMP1)[m
[31m-  |  lwz TMP1, LFUNC:TMP2->pc[m
[31m-  |  lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |3:[m
[31m-  |   subi RC, MULTRES, 8[m
[31m-  |   add RA, RA, BASE[m
[31m-  |  bctr[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  neg CARG2, CARG1[m
[31m-  |  mr CARG1, L[m
[31m-  |  bl extern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// NYI: Use internal implementations of floor, ceil, trunc.[m
[31m-  |[m
[31m-  |->vm_modi:[m
[31m-  |  divwo. TMP0, CARG1, CARG2[m
[31m-  |  bso >1[m
[31m-  |.if GPR64[m
[31m-  |   xor CARG3, CARG1, CARG2[m
[31m-  |   cmpwi CARG3, 0[m
[31m-  |.else[m
[31m-  |   xor. CARG3, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  mullw TMP0, TMP0, CARG2[m
[31m-  |  sub CARG1, CARG1, TMP0[m
[31m-  |   bgelr[m
[31m-  |  cmpwi CARG1, 0; beqlr[m
[31m-  |  add CARG1, CARG1, CARG2[m
[31m-  |  blr[m
[31m-  |1:[m
[31m-  |  cmpwi CARG2, 0[m
[31m-  |   li CARG1, 0[m
[31m-  |  beqlr[m
[31m-  |  clrso TMP0			// Clear SO for -2147483648 % -1 and return 0.[m
[31m-  |  blr[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// void lj_vm_cachesync(void *start, void *end)[m
[31m-  |// Flush D-Cache and invalidate I-Cache. Assumes 32 byte cache line size.[m
[31m-  |// This is a good lower bound, except for very ancient PPC models.[m
[31m-  |->vm_cachesync:[m
[31m-  |.if JIT or FFI[m
[31m-  |  // Compute start of first cache line and number of cache lines.[m
[31m-  |  rlwinm CARG1, CARG1, 0, 0, 26[m
[31m-  |  sub CARG2, CARG2, CARG1[m
[31m-  |  addi CARG2, CARG2, 31[m
[31m-  |  rlwinm. CARG2, CARG2, 27, 5, 31[m
[31m-  |  beqlr[m
[31m-  |  mtctr CARG2[m
[31m-  |  mr CARG3, CARG1[m
[31m-  |1:  // Flush D-Cache.[m
[31m-  |  dcbst r0, CARG1[m
[31m-  |  addi CARG1, CARG1, 32[m
[31m-  |  bdnz <1[m
[31m-  |  sync[m
[31m-  |  mtctr CARG2[m
[31m-  |1:  // Invalidate I-Cache.[m
[31m-  |  icbi r0, CARG3[m
[31m-  |  addi CARG3, CARG3, 32[m
[31m-  |  bdnz <1[m
[31m-  |  isync[m
[31m-  |  blr[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions. Callback slot number in r11, g in r12.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  saveregs[m
[31m-  |  lwz CTSTATE, GL:r12->ctype_state[m
[31m-  |   addi DISPATCH, r12, GG_G2DISP[m
[31m-  |  stw r11, CTSTATE->cb.slot[m
[31m-  |  stw r3, CTSTATE->cb.gpr[0][m
[31m-  |   stfd f1, CTSTATE->cb.fpr[0][m
[31m-  |  stw r4, CTSTATE->cb.gpr[1][m
[31m-  |   stfd f2, CTSTATE->cb.fpr[1][m
[31m-  |  stw r5, CTSTATE->cb.gpr[2][m
[31m-  |   stfd f3, CTSTATE->cb.fpr[2][m
[31m-  |  stw r6, CTSTATE->cb.gpr[3][m
[31m-  |   stfd f4, CTSTATE->cb.fpr[3][m
[31m-  |  stw r7, CTSTATE->cb.gpr[4][m
[31m-  |   stfd f5, CTSTATE->cb.fpr[4][m
[31m-  |  stw r8, CTSTATE->cb.gpr[5][m
[31m-  |   stfd f6, CTSTATE->cb.fpr[5][m
[31m-  |  stw r9, CTSTATE->cb.gpr[6][m
[31m-  |   stfd f7, CTSTATE->cb.fpr[6][m
[31m-  |  stw r10, CTSTATE->cb.gpr[7][m
[31m-  |   stfd f8, CTSTATE->cb.fpr[7][m
[31m-  |  addi TMP0, sp, CFRAME_SPACE+8[m
[31m-  |  stw TMP0, CTSTATE->cb.stack[m
[31m-  |   mr CARG1, CTSTATE[m
[31m-  |  stw CTSTATE, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |   mr CARG2, sp[m
[31m-  |  bl extern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |  // Returns lua_State *.[m
[31m-  |  lp BASE, L:CRET1->base[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |  lp RC, L:CRET1->top[m
[31m-  |     lus TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |     li ZERO, 0[m
[31m-  |   mr L, CRET1[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     lus TMP0, 0x4338		// Hiword of 2^52 + 2^51 (double)[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |     ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |     stw TMP0, TONUM_HI[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     lfs TOBIT, TMPD[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |  sub RC, RC, BASE[m
[31m-  |    st_vmstate[m
[31m-  |     lfs TONUM, TMPD[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  lwz CTSTATE, DISPATCH_GL(ctype_state)(DISPATCH)[m
[31m-  |   stp BASE, L->base[m
[31m-  |   stp RB, L->top[m
[31m-  |  stp L, CTSTATE->L[m
[31m-  |  mr CARG1, CTSTATE[m
[31m-  |  mr CARG2, RA[m
[31m-  |  bl extern lj_ccallback_leave	// (CTState *cts, TValue *o)[m
[31m-  |  lwz CRET1, CTSTATE->cb.gpr[0][m
[31m-  |  lfd FARG1, CTSTATE->cb.fpr[0][m
[31m-  |  lwz CRET2, CTSTATE->cb.gpr[1][m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, CARG1[m
[31m-  |  lwz TMP1, CCSTATE->spadj[m
[31m-  |    mflr TMP0[m
[31m-  |   lbz CARG2, CCSTATE->nsp[m
[31m-  |   lbz CARG3, CCSTATE->nfpr[m
[31m-  |  neg TMP1, TMP1[m
[31m-  |    stw TMP0, 4(sp)[m
[31m-  |   cmpwi cr1, CARG3, 0[m
[31m-  |  mr TMP2, sp[m
[31m-  |   addic. CARG2, CARG2, -1[m
[31m-  |  stwux sp, sp, TMP1[m
[31m-  |   crnot 4*cr1+eq, 4*cr1+eq		// For vararg calls.[m
[31m-  |  stw r14, -4(TMP2)[m
[31m-  |  stw CCSTATE, -8(TMP2)[m
[31m-  |  mr r14, TMP2[m
[31m-  |  la TMP1, CCSTATE->stack[m
[31m-  |   slwi CARG2, CARG2, 2[m
[31m-  |   blty >2[m
[31m-  |  la TMP2, 8(sp)[m
[31m-  |1:[m
[31m-  |  lwzx TMP0, TMP1, CARG2[m
[31m-  |  stwx TMP0, TMP2, CARG2[m
[31m-  |   addic. CARG2, CARG2, -4[m
[31m-  |  bge <1[m
[31m-  |2:[m
[31m-  |  bney cr1, >3[m
[31m-  |  lfd f1, CCSTATE->fpr[0][m
[31m-  |  lfd f2, CCSTATE->fpr[1][m
[31m-  |  lfd f3, CCSTATE->fpr[2][m
[31m-  |  lfd f4, CCSTATE->fpr[3][m
[31m-  |  lfd f5, CCSTATE->fpr[4][m
[31m-  |  lfd f6, CCSTATE->fpr[5][m
[31m-  |  lfd f7, CCSTATE->fpr[6][m
[31m-  |  lfd f8, CCSTATE->fpr[7][m
[31m-  |3:[m
[31m-  |   lp TMP0, CCSTATE->func[m
[31m-  |  lwz CARG2, CCSTATE->gpr[1][m
[31m-  |  lwz CARG3, CCSTATE->gpr[2][m
[31m-  |  lwz CARG4, CCSTATE->gpr[3][m
[31m-  |  lwz CARG5, CCSTATE->gpr[4][m
[31m-  |   mtctr TMP0[m
[31m-  |  lwz r8, CCSTATE->gpr[5][m
[31m-  |  lwz r9, CCSTATE->gpr[6][m
[31m-  |  lwz r10, CCSTATE->gpr[7][m
[31m-  |  lwz CARG1, CCSTATE->gpr[0]		// Do this last, since CCSTATE is CARG1.[m
[31m-  |   bctrl[m
[31m-  |  lwz CCSTATE:TMP1, -8(r14)[m
[31m-  |  lwz TMP2, -4(r14)[m
[31m-  |   lwz TMP0, 4(r14)[m
[31m-  |  stw CARG1, CCSTATE:TMP1->gpr[0][m
[31m-  |  stfd FARG1, CCSTATE:TMP1->fpr[0][m
[31m-  |  stw CARG2, CCSTATE:TMP1->gpr[1][m
[31m-  |   mtlr TMP0[m
[31m-  |  stw CARG3, CCSTATE:TMP1->gpr[2][m
[31m-  |   mr sp, r14[m
[31m-  |  stw CARG4, CCSTATE:TMP1->gpr[3][m
[31m-  |   mr r14, TMP2[m
[31m-  |  blr[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1*8, RD = src2*8, JMP with RD = target[m
[31m-    |.if DUALNUM[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lwz CARG2, 4(RA)[m
[31m-    |  lwzux TMP1, RD, BASE[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |   lwz CARG3, 4(RD)[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  bne cr0, >7[m
[31m-    |  bne cr1, >8[m
[31m-    |   cmpw CARG2, CARG3[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  bge >2[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  blt >2[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  bgt >2[m
[31m-    } else {[m
[31m-      |  ble >2[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  add PC, PC, TMP2[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  bgt cr0, ->vmeta_comp[m
[31m-    |  // RA is a number.[m
[31m-    |   lfd f0, 0(RA)[m
[31m-    |  bgt cr1, ->vmeta_comp[m
[31m-    |  blt cr1, >4[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  tonum_i f1, CARG3[m
[31m-    |  b >5[m
[31m-    |[m
[31m-    |8: // RA is an integer, RD is not an integer.[m
[31m-    |  bgt cr1, ->vmeta_comp[m
[31m-    |  // RA is an integer, RD is a number.[m
[31m-    |  tonum_i f0, CARG2[m
[31m-    |4:[m
[31m-    |  lfd f1, 0(RD)[m
[31m-    |5:[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  bge <2[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  blt <2[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq[m
[31m-      |  bge <2[m
[31m-    } else {[m
[31m-      |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq[m
[31m-      |  blt <2[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    |.else[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lfdx f0, BASE, RA[m
[31m-    |  lwzx TMP1, BASE, RD[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |   lfdx f1, BASE, RD[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  bge cr0, ->vmeta_comp[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  bge cr1, ->vmeta_comp[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  bge >1[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  blt >1[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq[m
[31m-      |  bge >1[m
[31m-    } else {[m
[31m-      |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq[m
[31m-      |  blt >1[m
[31m-    }[m
[31m-    |  add PC, PC, TMP2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  // RA = src1*8, RD = src2*8, JMP with RD = target[m
[31m-    |.if DUALNUM[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lwz CARG2, 4(RA)[m
[31m-    |  lwzux TMP1, RD, BASE[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |   lwz CARG3, 4(RD)[m
[31m-    |  cror 4*cr7+gt, 4*cr0+gt, 4*cr1+gt[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    if (vk) {[m
[31m-      |  ble cr7, ->BC_ISEQN_Z[m
[31m-    } else {[m
[31m-      |  ble cr7, ->BC_ISNEN_Z[m
[31m-    }[m
[31m-    |.else[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |   lwz TMP2, 0(PC)[m
[31m-    |    lfd f0, 0(RA)[m
[31m-    |   addi PC, PC, 4[m
[31m-    |  lwzux TMP1, RD, BASE[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |   decode_RD4 TMP2, TMP2[m
[31m-    |    lfd f1, 0(RD)[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |   addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  bge cr0, >5[m
[31m-    |  bge cr1, >5[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    if (vk) {[m
[31m-      |  bne >1[m
[31m-      |  add PC, PC, TMP2[m
[31m-    } else {[m
[31m-      |  beq >1[m
[31m-      |  add PC, PC, TMP2[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    |5:  // Either or both types are not numbers.[m
[31m-    |.if not DUALNUM[m
[31m-    |    lwz CARG2, 4(RA)[m
[31m-    |    lwz CARG3, 4(RD)[m
[31m-    |.endif[m
[31m-    |.if FFI[m
[31m-    |  cmpwi cr7, TMP0, LJ_TCDATA[m
[31m-    |  cmpwi cr5, TMP1, LJ_TCDATA[m
[31m-    |.endif[m
[31m-    |   not TMP3, TMP0[m
[31m-    |  cmplw TMP0, TMP1[m
[31m-    |   cmplwi cr1, TMP3, ~LJ_TISPRI		// Primitive?[m
[31m-    |.if FFI[m
[31m-    |  cror 4*cr7+eq, 4*cr7+eq, 4*cr5+eq[m
[31m-    |.endif[m
[31m-    |   cmplwi cr6, TMP3, ~LJ_TISTABUD		// Table or userdata?[m
[31m-    |.if FFI[m
[31m-    |  beq cr7, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |    cmplw cr5, CARG2, CARG3[m
[31m-    |  crandc 4*cr0+gt, 4*cr0+eq, 4*cr1+gt	// 2: Same type and primitive.[m
[31m-    |  crorc 4*cr0+lt, 4*cr5+eq, 4*cr0+eq	// 1: Same tv or different type.[m
[31m-    |  crand 4*cr0+eq, 4*cr0+eq, 4*cr5+eq	// 0: Same type and same tv.[m
[31m-    |   mr SAVE0, PC[m
[31m-    |  cror 4*cr0+eq, 4*cr0+eq, 4*cr0+gt	// 0 or 2.[m
[31m-    |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+gt	// 1 or 2.[m
[31m-    if (vk) {[m
[31m-      |  bne cr0, >6[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |6:[m
[31m-    } else {[m
[31m-      |  beq cr0, >6[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |6:[m
[31m-    }[m
[31m-    |.if DUALNUM[m
[31m-    |  bge cr0, >2			// Done if 1 or 2.[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |2:[m
[31m-    |.else[m
[31m-    |  blt cr0, <1			// Done if 1 or 2.[m
[31m-    |.endif[m
[31m-    |  blt cr6, <1			// Done if not tab/ud.[m
[31m-    |[m
[31m-    |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-    |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-    |  lwz TAB:TMP2, TAB:CARG2->metatable[m
[31m-    |   li CARG4, 1-vk			// ne = 0 or 1.[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <1				// No metatable?[m
[31m-    |  lbz TMP2, TAB:TMP2->nomm[m
[31m-    |  andix. TMP2, TMP2, 1<<MM_eq[m
[31m-    |  bne <1				// Or 'no __eq' flag set?[m
[31m-    |  mr PC, SAVE0			// Restore old PC.[m
[31m-    |  b ->vmeta_equal			// Handle __eq metamethod.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  // RA = src*8, RD = str_const*8 (~), JMP with RD = target[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |   srwi RD, RD, 1[m
[31m-    |  lwz STR:TMP3, 4(RA)[m
[31m-    |    lwz TMP2, 0(PC)[m
[31m-    |   subfic RD, RD, -4[m
[31m-    |    addi PC, PC, 4[m
[31m-    |.if FFI[m
[31m-    |  cmpwi TMP0, LJ_TCDATA[m
[31m-    |.endif[m
[31m-    |   lwzx STR:TMP1, KBASE, RD	// KBASE-4-str_const*4[m
[31m-    |  .gpr64 extsw TMP0, TMP0[m
[31m-    |  subfic TMP0, TMP0, LJ_TSTR[m
[31m-    |.if FFI[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  sub TMP1, STR:TMP1, STR:TMP3[m
[31m-    |  or TMP0, TMP0, TMP1[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  subfic TMP0, TMP0, 0[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  subfe TMP1, TMP1, TMP1[m
[31m-    if (vk) {[m
[31m-      |  andc TMP2, TMP2, TMP1[m
[31m-    } else {[m
[31m-      |  and TMP2, TMP2, TMP1[m
[31m-    }[m
[31m-    |  add PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  // RA = src*8, RD = num_const*8, JMP with RD = target[m
[31m-    |.if DUALNUM[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lwz CARG2, 4(RA)[m
[31m-    |  lwzux TMP1, RD, KBASE[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |   lwz CARG3, 4(RD)[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:[m
[31m-    }[m
[31m-    |  bne cr0, >7[m
[31m-    |  bne cr1, >8[m
[31m-    |   cmpw CARG2, CARG3[m
[31m-    |4:[m
[31m-    |.else[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:  // Dummy label.[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:  // Dummy label.[m
[31m-    }[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lfdx f0, BASE, RA[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |  lfdx f1, KBASE, RD[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  checknum TMP0[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  bge >3[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    |.endif[m
[31m-    if (vk) {[m
[31m-      |  bne >1[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |1:[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |  beq >2[m
[31m-      |1:[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |2:[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    |.if FFI[m
[31m-    |3:[m
[31m-    |  cmpwi TMP0, LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |  b <1[m
[31m-    |.endif[m
[31m-    |.if DUALNUM[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  bge cr0, <3[m
[31m-    |  // RA is a number.[m
[31m-    |   lfd f0, 0(RA)[m
[31m-    |  blt cr1, >1[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  tonum_i f1, CARG3[m
[31m-    |  b >2[m
[31m-    |[m
[31m-    |8: // RA is an integer, RD is a number.[m
[31m-    |  tonum_i f0, CARG2[m
[31m-    |1:[m
[31m-    |  lfd f1, 0(RD)[m
[31m-    |2:[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    |  b <4[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |   srwi TMP1, RD, 3[m
[31m-    |    lwz TMP2, 0(PC)[m
[31m-    |   not TMP1, TMP1[m
[31m-    |    addi PC, PC, 4[m
[31m-    |.if FFI[m
[31m-    |  cmpwi TMP0, LJ_TCDATA[m
[31m-    |.endif[m
[31m-    |  sub TMP0, TMP0, TMP1[m
[31m-    |.if FFI[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  .gpr64 extsw TMP0, TMP0[m
[31m-    |  addic TMP0, TMP0, -1[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  subfe TMP1, TMP1, TMP1[m
[31m-    if (vk) {[m
[31m-      |  and TMP2, TMP2, TMP1[m
[31m-    } else {[m
[31m-      |  andc TMP2, TMP2, TMP1[m
[31m-    }[m
[31m-    |  add PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  // RA = dst*8 or unused, RD = src*8, JMP with RD = target[m
[31m-    |  lwzx TMP0, BASE, RD[m
[31m-    |   lwz INS, 0(PC)[m
[31m-    |   addi PC, PC, 4[m
[31m-    if (op == BC_IST || op == BC_ISF) {[m
[31m-      |  .gpr64 extsw TMP0, TMP0[m
[31m-      |  subfic TMP0, TMP0, LJ_TTRUE[m
[31m-      |   decode_RD4 TMP2, INS[m
[31m-      |  subfe TMP1, TMP1, TMP1[m
[31m-      |   addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-      if (op == BC_IST) {[m
[31m-	|  andc TMP2, TMP2, TMP1[m
[31m-      } else {[m
[31m-	|  and TMP2, TMP2, TMP1[m
[31m-      }[m
[31m-      |  add PC, PC, TMP2[m
[31m-    } else {[m
[31m-      |  li TMP1, LJ_TFALSE[m
[31m-      |   lfdx f0, BASE, RD[m
[31m-      |  cmplw TMP0, TMP1[m
[31m-      if (op == BC_ISTC) {[m
[31m-	|  bge >1[m
[31m-      } else {[m
[31m-	|  blt >1[m
[31m-      }[m
[31m-      |  addis PC, PC, -(BCBIAS_J*4 >> 16)[m
[31m-      |  decode_RD4 TMP2, INS[m
[31m-      |   stfdx f0, BASE, RA[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |1:[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  // RA = src*8, RD = -type*8[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |  srwi TMP1, RD, 3[m
[31m-    |  ins_next1[m
[31m-    |.if not PPE and not GPR64[m
[31m-    |  add. TMP0, TMP0, TMP1[m
[31m-    |.else[m
[31m-    |  neg TMP1, TMP1[m
[31m-    |  cmpw TMP0, TMP1[m
[31m-    |.endif[m
[31m-    |  bne ->vmeta_istype[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  // RA = src*8, RD = -(TISNUM-1)*8[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |  ins_next1[m
[31m-    |  checknum TMP0[m
[31m-    |  bge ->vmeta_istype[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  ins_next1[m
[31m-    |  lfdx f0, BASE, RD[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  ins_next1[m
[31m-    |  lwzx TMP0, BASE, RD[m
[31m-    |  .gpr64 extsw TMP0, TMP0[m
[31m-    |  subfic TMP1, TMP0, LJ_TTRUE[m
[31m-    |  adde TMP0, TMP0, TMP1[m
[31m-    |  stwx TMP0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  lwzux TMP1, RD, BASE[m
[31m-    |   lwz TMP0, 4(RD)[m
[31m-    |  checknum TMP1[m
[31m-    |.if DUALNUM[m
[31m-    |  bne >5[m
[31m-    |.if GPR64[m
[31m-    |  lus TMP2, 0x8000[m
[31m-    |  neg TMP0, TMP0[m
[31m-    |  cmplw TMP0, TMP2[m
[31m-    |  beq >4[m
[31m-    |.else[m
[31m-    |  nego. TMP0, TMP0[m
[31m-    |  bso >4[m
[31m-    |1:[m
[31m-    |.endif[m
[31m-    |  ins_next1[m
[31m-    |  stwux TISNUM, RA, BASE[m
[31m-    |   stw TMP0, 4(RA)[m
[31m-    |3:[m
[31m-    |  ins_next2[m
[31m-    |4:[m
[31m-    |.if not GPR64[m
[31m-    |  // Potential overflow.[m
[31m-    |  checkov TMP1, <1			// Ignore unrelated overflow.[m
[31m-    |.endif[m
[31m-    |  lus TMP1, 0x41e0			// 2^31.[m
[31m-    |  li TMP0, 0[m
[31m-    |  b >7[m
[31m-    |.endif[m
[31m-    |5:[m
[31m-    |  bge ->vmeta_unm[m
[31m-    |  xoris TMP1, TMP1, 0x8000[m
[31m-    |7:[m
[31m-    |  ins_next1[m
[31m-    |  stwux TMP1, RA, BASE[m
[31m-    |   stw TMP0, 4(RA)[m
[31m-    |.if DUALNUM[m
[31m-    |  b <3[m
[31m-    |.else[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  lwzux TMP0, RD, BASE[m
[31m-    |   lwz CARG1, 4(RD)[m
[31m-    |  checkstr TMP0; bne >2[m
[31m-    |  lwz CRET1, STR:CARG1->len[m
[31m-    |1:[m
[31m-    |.if DUALNUM[m
[31m-    |  ins_next1[m
[31m-    |  stwux TISNUM, RA, BASE[m
[31m-    |   stw CRET1, 4(RA)[m
[31m-    |.else[m
[31m-    |  tonum_u f0, CRET1		// Result is a non-negative integer.[m
[31m-    |  ins_next1[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |.endif[m
[31m-    |  ins_next2[m
[31m-    |2:[m
[31m-    |  checktab TMP0; bne ->vmeta_len[m
[31m-#if LJ_52[m
[31m-    |  lwz TAB:TMP2, TAB:CARG1->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  bne >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  bl extern lj_tab_len		// (GCtab *t)[m
[31m-    |  // Returns uint32_t (but less than 2^31).[m
[31m-    |  b <1[m
[31m-#if LJ_52[m
[31m-    |9:[m
[31m-    |  lbz TMP0, TAB:TMP2->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_len[m
[31m-    |  bne <3				// 'no __len' flag set: done.[m
[31m-    |  b ->vmeta_len[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithpre[m
[31m-    |  // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   lwzx TMP1, BASE, RB[m
[31m-    |   .if DUALNUM[m
[31m-    |     lwzx TMP2, KBASE, RC[m
[31m-    |   .endif[m
[31m-    |    lfdx f14, BASE, RB[m
[31m-    |    lfdx f15, KBASE, RC[m
[31m-    |   .if DUALNUM[m
[31m-    |     checknum cr0, TMP1[m
[31m-    |     checknum cr1, TMP2[m
[31m-    |     crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |     bge ->vmeta_arith_vn[m
[31m-    |   .else[m
[31m-    |     checknum TMP1; bge ->vmeta_arith_vn[m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   lwzx TMP1, BASE, RB[m
[31m-    |   .if DUALNUM[m
[31m-    |     lwzx TMP2, KBASE, RC[m
[31m-    |   .endif[m
[31m-    |    lfdx f15, BASE, RB[m
[31m-    |    lfdx f14, KBASE, RC[m
[31m-    |   .if DUALNUM[m
[31m-    |     checknum cr0, TMP1[m
[31m-    |     checknum cr1, TMP2[m
[31m-    |     crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |     bge ->vmeta_arith_nv[m
[31m-    |   .else[m
[31m-    |     checknum TMP1; bge ->vmeta_arith_nv[m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   lwzx TMP1, BASE, RB[m
[31m-    |   lwzx TMP2, BASE, RC[m
[31m-    |    lfdx f14, BASE, RB[m
[31m-    |    lfdx f15, BASE, RC[m
[31m-    |   checknum cr0, TMP1[m
[31m-    |   checknum cr1, TMP2[m
[31m-    |   crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |   bge ->vmeta_arith_vv[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfallback, ins[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   ins ->vmeta_arith_vn2[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   ins ->vmeta_arith_nv2[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   ins ->vmeta_arith_vv2[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro intmod, a, b, c[m
[31m-    |  bl ->vm_modi[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro fpmod, a, b, c[m
[31m-    |->BC_MODVN_Z:[m
[31m-    |  fdiv FARG1, b, c[m
[31m-    |  // NYI: Use internal implementation of floor.[m
[31m-    |  blex floor			// floor(b/c)[m
[31m-    |  fmul a, FARG1, c[m
[31m-    |  fsub a, b, a			// b - floor(b/c)*c[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfp, fpins[m
[31m-    |  ins_arithpre[m
[31m-    |.if "fpins" == "fpmod_"[m
[31m-    |  b ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[31m-    |.else[m
[31m-    |  fpins f0, f14, f15[m
[31m-    |  ins_next1[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins, fpins[m
[31m-    |  // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   lwzux TMP1, RB, BASE[m
[31m-    |   lwzux TMP2, RC, KBASE[m
[31m-    |    lwz CARG1, 4(RB)[m
[31m-    |   checknum cr0, TMP1[m
[31m-    |    lwz CARG2, 4(RC)[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   lwzux TMP1, RB, BASE[m
[31m-    |   lwzux TMP2, RC, KBASE[m
[31m-    |    lwz CARG2, 4(RB)[m
[31m-    |   checknum cr0, TMP1[m
[31m-    |    lwz CARG1, 4(RC)[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   lwzux TMP1, RB, BASE[m
[31m-    |   lwzux TMP2, RC, BASE[m
[31m-    |    lwz CARG1, 4(RB)[m
[31m-    |   checknum cr0, TMP1[m
[31m-    |    lwz CARG2, 4(RC)[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |  checknum cr1, TMP2[m
[31m-    |  bne >5[m
[31m-    |  bne cr1, >5[m
[31m-    |  intins CARG1, CARG1, CARG2[m
[31m-    |  bso >4[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  stwux TISNUM, RA, BASE[m
[31m-    |  stw CARG1, 4(RA)[m
[31m-    |2:[m
[31m-    |  ins_next2[m
[31m-    |4:  // Overflow.[m
[31m-    |  checkov TMP0, <1			// Ignore unrelated overflow.[m
[31m-    |  ins_arithfallback b[m
[31m-    |5:  // FP variant.[m
[31m-    ||if (vk == 1) {[m
[31m-    |  lfd f15, 0(RB)[m
[31m-    |   crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |  lfd f14, 0(RC)[m
[31m-    ||} else {[m
[31m-    |  lfd f14, 0(RB)[m
[31m-    |   crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |  lfd f15, 0(RC)[m
[31m-    ||}[m
[31m-    |   ins_arithfallback bge[m
[31m-    |.if "fpins" == "fpmod_"[m
[31m-    |  b ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[31m-    |.else[m
[31m-    |  fpins f0, f14, f15[m
[31m-    |  ins_next1[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  b <2[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, intins, fpins[m
[31m-    |.if DUALNUM[m
[31m-    |  ins_arithdn intins, fpins[m
[31m-    |.else[m
[31m-    |  ins_arithfp fpins[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |.if GPR64[m
[31m-    |.macro addo32., y, a, b[m
[31m-    |  // Need to check overflow for (a<<32) + (b<<32).[m
[31m-    |  rldicr TMP0, a, 32, 31[m
[31m-    |  rldicr TMP3, b, 32, 31[m
[31m-    |  addo. TMP0, TMP0, TMP3[m
[31m-    |  add y, a, b[m
[31m-    |.endmacro[m
[31m-    |  ins_arith addo32., fadd[m
[31m-    |.else[m
[31m-    |  ins_arith addo., fadd[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |.if GPR64[m
[31m-    |.macro subo32., y, a, b[m
[31m-    |  // Need to check overflow for (a<<32) - (b<<32).[m
[31m-    |  rldicr TMP0, a, 32, 31[m
[31m-    |  rldicr TMP3, b, 32, 31[m
[31m-    |  subo. TMP0, TMP0, TMP3[m
[31m-    |  sub y, a, b[m
[31m-    |.endmacro[m
[31m-    |  ins_arith subo32., fsub[m
[31m-    |.else[m
[31m-    |  ins_arith subo., fsub[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arith mullwo., fmul[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arithfp fdiv[m
[31m-    break;[m
[31m-  case BC_MODVN:[m
[31m-    |  ins_arith intmod, fpmod[m
[31m-    break;[m
[31m-  case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arith intmod, fpmod_[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  // NYI: (partial) integer arithmetic.[m
[31m-    |  lwzx TMP1, BASE, RB[m
[31m-    |   lfdx FARG1, BASE, RB[m
[31m-    |  lwzx TMP2, BASE, RC[m
[31m-    |   lfdx FARG2, BASE, RC[m
[31m-    |  checknum cr0, TMP1[m
[31m-    |  checknum cr1, TMP2[m
[31m-    |  crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |  bge ->vmeta_arith_vv[m
[31m-    |  blex pow[m
[31m-    |  ins_next1[m
[31m-    |  stfdx FARG1, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  // RA = dst*8, RB = src_start*8, RC = src_end*8[m
[31m-    |  sub CARG3, RC, RB[m
[31m-    |   stp BASE, L->base[m
[31m-    |  add CARG2, BASE, RC[m
[31m-    |  mr SAVE0, RB[m
[31m-    |->BC_CAT_Z:[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  mr CARG1, L[m
[31m-    |  srwi CARG3, CARG3, 3[m
[31m-    |  bl extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-    |  cmplwi CRET1, 0[m
[31m-    |   lp BASE, L->base[m
[31m-    |  bne ->vmeta_binop[m
[31m-    |  ins_next1[m
[31m-    |  lfdx f0, BASE, SAVE0		// Copy result from RB to RA.[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  // RA = dst*8, RD = str_const*8 (~)[m
[31m-    |  srwi TMP1, RD, 1[m
[31m-    |  subfic TMP1, TMP1, -4[m
[31m-    |  ins_next1[m
[31m-    |  lwzx TMP0, KBASE, TMP1		// KBASE-4-str_const*4[m
[31m-    |  li TMP2, LJ_TSTR[m
[31m-    |  stwux TMP2, RA, BASE[m
[31m-    |  stw TMP0, 4(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  // RA = dst*8, RD = cdata_const*8 (~)[m
[31m-    |  srwi TMP1, RD, 1[m
[31m-    |  subfic TMP1, TMP1, -4[m
[31m-    |  ins_next1[m
[31m-    |  lwzx TMP0, KBASE, TMP1		// KBASE-4-cdata_const*4[m
[31m-    |  li TMP2, LJ_TCDATA[m
[31m-    |  stwux TMP2, RA, BASE[m
[31m-    |  stw TMP0, 4(RA)[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  // RA = dst*8, RD = int16_literal*8[m
[31m-    |.if DUALNUM[m
[31m-    |  slwi RD, RD, 13[m
[31m-    |  srawi RD, RD, 16[m
[31m-    |  ins_next1[m
[31m-    |   stwux TISNUM, RA, BASE[m
[31m-    |   stw RD, 4(RA)[m
[31m-    |  ins_next2[m
[31m-    |.else[m
[31m-    |  // The soft-float approach is faster.[m
[31m-    |  slwi RD, RD, 13[m
[31m-    |  srawi TMP1, RD, 31[m
[31m-    |  xor TMP2, TMP1, RD[m
[31m-    |  sub TMP2, TMP2, TMP1		// TMP2 = abs(x)[m
[31m-    |  cntlzw TMP3, TMP2[m
[31m-    |  subfic TMP1, TMP3, 0x40d		// TMP1 = exponent-1[m
[31m-    |   slw TMP2, TMP2, TMP3		// TMP2 = left aligned mantissa[m
[31m-    |    subfic TMP3, RD, 0[m
[31m-    |  slwi TMP1, TMP1, 20[m
[31m-    |   rlwimi RD, TMP2, 21, 1, 31	// hi = sign(x) | (mantissa>>11)[m
[31m-    |    subfe TMP0, TMP0, TMP0[m
[31m-    |   add RD, RD, TMP1		// hi = hi + exponent-1[m
[31m-    |    and RD, RD, TMP0		// hi = x == 0 ? 0 : hi[m
[31m-    |  ins_next1[m
[31m-    |    stwux RD, RA, BASE[m
[31m-    |    stw ZERO, 4(RA)[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  // RA = dst*8, RD = num_const*8[m
[31m-    |  ins_next1[m
[31m-    |  lfdx f0, KBASE, RD[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  // RA = dst*8, RD = primitive_type*8 (~)[m
[31m-    |  srwi TMP1, RD, 3[m
[31m-    |  not TMP0, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  stwx TMP0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  // RA = base*8, RD = end*8[m
[31m-    |  stwx TISNIL, BASE, RA[m
[31m-    |   addi RA, RA, 8[m
[31m-    |1:[m
[31m-    |  stwx TISNIL, BASE, RA[m
[31m-    |  cmpw RA, RD[m
[31m-    |   addi RA, RA, 8[m
[31m-    |  blt <1[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  // RA = dst*8, RD = uvnum*8[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srwi RD, RD, 1[m
[31m-    |   addi RD, RD, offsetof(GCfuncL, uvptr)[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RD[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, UPVAL:RB->v[m
[31m-    |  lfd f0, 0(TMP1)[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-    |  // RA = uvnum*8, RD = src*8[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |    srwi RA, RA, 1[m
[31m-    |    addi RA, RA, offsetof(GCfuncL, uvptr)[m
[31m-    |   lfdux f0, RD, BASE[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RA[m
[31m-    |  lbz TMP3, UPVAL:RB->marked[m
[31m-    |   lwz CARG2, UPVAL:RB->v[m
[31m-    |  andix. TMP3, TMP3, LJ_GC_BLACK	// isblack(uv)[m
[31m-    |    lbz TMP0, UPVAL:RB->closed[m
[31m-    |   lwz TMP2, 0(RD)[m
[31m-    |   stfd f0, 0(CARG2)[m
[31m-    |    cmplwi cr1, TMP0, 0[m
[31m-    |   lwz TMP1, 4(RD)[m
[31m-    |  cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq[m
[31m-    |   subi TMP2, TMP2, (LJ_TNUMX+1)[m
[31m-    |  bne >2				// Upvalue is closed and black?[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if new value is collectable.[m
[31m-    |  cmplwi TMP2, LJ_TISGCV - (LJ_TNUMX+1)[m
[31m-    |  bge <1				// tvisgcv(v)[m
[31m-    |  lbz TMP3, GCOBJ:TMP1->gch.marked[m
[31m-    |  andix. TMP3, TMP3, LJ_GC_WHITES	// iswhite(v)[m
[31m-    |   la CARG1, GG_DISP2G(DISPATCH)[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  beq <1[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETS:[m
[31m-    |  // RA = uvnum*8, RD = str_const*8 (~)[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srwi TMP1, RD, 1[m
[31m-    |    srwi RA, RA, 1[m
[31m-    |   subfic TMP1, TMP1, -4[m
[31m-    |    addi RA, RA, offsetof(GCfuncL, uvptr)[m
[31m-    |   lwzx STR:TMP1, KBASE, TMP1	// KBASE-4-str_const*4[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RA[m
[31m-    |  lbz TMP3, UPVAL:RB->marked[m
[31m-    |   lwz CARG2, UPVAL:RB->v[m
[31m-    |  andix. TMP3, TMP3, LJ_GC_BLACK	// isblack(uv)[m
[31m-    |   lbz TMP3, STR:TMP1->marked[m
[31m-    |   lbz TMP2, UPVAL:RB->closed[m
[31m-    |   li TMP0, LJ_TSTR[m
[31m-    |   stw STR:TMP1, 4(CARG2)[m
[31m-    |   stw TMP0, 0(CARG2)[m
[31m-    |  bne >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  andix. TMP3, TMP3, LJ_GC_WHITES	// iswhite(str)[m
[31m-    |   cmplwi cr1, TMP2, 0[m
[31m-    |  cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq[m
[31m-    |   la CARG1, GG_DISP2G(DISPATCH)[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  beq <1[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  // RA = uvnum*8, RD = num_const*8[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srwi RA, RA, 1[m
[31m-    |   addi RA, RA, offsetof(GCfuncL, uvptr)[m
[31m-    |    lfdx f0, KBASE, RD[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RA[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, UPVAL:RB->v[m
[31m-    |  stfd f0, 0(TMP1)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  // RA = uvnum*8, RD = primitive_type*8 (~)[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srwi RA, RA, 1[m
[31m-    |    srwi TMP0, RD, 3[m
[31m-    |   addi RA, RA, offsetof(GCfuncL, uvptr)[m
[31m-    |    not TMP0, TMP0[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RA[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, UPVAL:RB->v[m
[31m-    |  stw TMP0, 0(TMP1)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_UCLO:[m
[31m-    |  // RA = level*8, RD = target[m
[31m-    |  lwz TMP1, L->openupval[m
[31m-    |  branch_RD			// Do this first since RD is not saved.[m
[31m-    |   stp BASE, L->base[m
[31m-    |  cmplwi TMP1, 0[m
[31m-    |   mr CARG1, L[m
[31m-    |  beq >1[m
[31m-    |   add CARG2, BASE, RA[m
[31m-    |  bl extern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |  lp BASE, L->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  // RA = dst*8, RD = proto_const*8 (~) (holding function prototype)[m
[31m-    |  srwi TMP1, RD, 1[m
[31m-    |   stp BASE, L->base[m
[31m-    |  subfic TMP1, TMP1, -4[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  lwzx CARG2, KBASE, TMP1		// KBASE-4-tab_const*4[m
[31m-    |   mr CARG1, L[m
[31m-    |  lwz CARG3, FRAME_FUNC(BASE)[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  bl extern lj_func_newL_gc[m
[31m-    |  // Returns GCfuncL *.[m
[31m-    |  lp BASE, L->base[m
[31m-    |   li TMP0, LJ_TFUNC[m
[31m-    |  stwux TMP0, RA, BASE[m
[31m-    |  stw LFUNC:CRET1, 4(RA)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-  case BC_TDUP:[m
[31m-    |  // RA = dst*8, RD = (hbits|asize)*8 | tab_const*8 (~)[m
[31m-    |  lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH)[m
[31m-    |   mr CARG1, L[m
[31m-    |  lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)[m
[31m-    |   stp BASE, L->base[m
[31m-    |  cmplw TMP0, TMP1[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  bge >5[m
[31m-    |1:[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |  rlwinm CARG2, RD, 29, 21, 31[m
[31m-      |  rlwinm CARG3, RD, 18, 27, 31[m
[31m-      |  cmpwi CARG2, 0x7ff; beq >3[m
[31m-      |2:[m
[31m-      |  bl extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-      |  // Returns Table *.[m
[31m-    } else {[m
[31m-      |  srwi TMP1, RD, 1[m
[31m-      |  subfic TMP1, TMP1, -4[m
[31m-      |  lwzx CARG2, KBASE, TMP1		// KBASE-4-tab_const*4[m
[31m-      |  bl extern lj_tab_dup  // (lua_State *L, Table *kt)[m
[31m-      |  // Returns Table *.[m
[31m-    }[m
[31m-    |  lp BASE, L->base[m
[31m-    |   li TMP0, LJ_TTAB[m
[31m-    |  stwux TMP0, RA, BASE[m
[31m-    |  stw TAB:CRET1, 4(RA)[m
[31m-    |  ins_next[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |3:[m
[31m-      |  li CARG2, 0x801[m
[31m-      |  b <2[m
[31m-    }[m
[31m-    |5:[m
[31m-    |  mr SAVE0, RD[m
[31m-    |  bl extern lj_gc_step_fixtop  // (lua_State *L)[m
[31m-    |  mr RD, SAVE0[m
[31m-    |  mr CARG1, L[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  // RA = dst*8, RD = str_const*8 (~)[m
[31m-  case BC_GSET:[m
[31m-    |  // RA = src*8, RD = str_const*8 (~)[m
[31m-    |  lwz LFUNC:TMP2, FRAME_FUNC(BASE)[m
[31m-    |   srwi TMP1, RD, 1[m
[31m-    |  lwz TAB:RB, LFUNC:TMP2->env[m
[31m-    |   subfic TMP1, TMP1, -4[m
[31m-    |   lwzx STR:RC, KBASE, TMP1	// KBASE-4-str_const*4[m
[31m-    if (op == BC_GGET) {[m
[31m-      |  b ->BC_TGETS_Z[m
[31m-    } else {[m
[31m-      |  b ->BC_TSETS_Z[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |  lwzux CARG2, RC, BASE[m
[31m-    |   lwz TAB:RB, 4(RB)[m
[31m-    |.if DUALNUM[m
[31m-    |   lwz RC, 4(RC)[m
[31m-    |.else[m
[31m-    |   lfd f0, 0(RC)[m
[31m-    |.endif[m
[31m-    |  checktab CARG1[m
[31m-    |   checknum cr1, CARG2[m
[31m-    |  bne ->vmeta_tgetv[m
[31m-    |.if DUALNUM[m
[31m-    |  lwz TMP0, TAB:RB->asize[m
[31m-    |   bne cr1, >5[m
[31m-    |   lwz TMP1, TAB:RB->array[m
[31m-    |  cmplw TMP0, RC[m
[31m-    |   slwi TMP2, RC, 3[m
[31m-    |.else[m
[31m-    |   bge cr1, >5[m
[31m-    |  // Convert number key to integer, check for integerness and range.[m
[31m-    |  fctiwz f1, f0[m
[31m-    |    fadd f2, f0, TOBIT[m
[31m-    |  stfd f1, TMPD[m
[31m-    |   lwz TMP0, TAB:RB->asize[m
[31m-    |    fsub f2, f2, TOBIT[m
[31m-    |  lwz TMP2, TMPD_LO[m
[31m-    |   lwz TMP1, TAB:RB->array[m
[31m-    |    fcmpu cr1, f0, f2[m
[31m-    |  cmplw cr0, TMP0, TMP2[m
[31m-    |  crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq[m
[31m-    |   slwi TMP2, TMP2, 3[m
[31m-    |.endif[m
[31m-    |  ble ->vmeta_tgetv		// Integer key and in array part?[m
[31m-    |  lwzx TMP0, TMP1, TMP2[m
[31m-    |   lfdx f14, TMP1, TMP2[m
[31m-    |  checknil TMP0; beq >2[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |   stfdx f14, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  lwz TAB:TMP2, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  lbz TMP0, TAB:TMP2->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_index[m
[31m-    |  bne <1				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  checkstr CARG2; bne ->vmeta_tgetv[m
[31m-    |.if not DUALNUM[m
[31m-    |  lwz STR:RC, 4(RC)[m
[31m-    |.endif[m
[31m-    |  b ->BC_TGETS_Z			// String key?[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = str_const*8 (~)[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |   srwi TMP1, RC, 1[m
[31m-    |    lwz TAB:RB, 4(RB)[m
[31m-    |   subfic TMP1, TMP1, -4[m
[31m-    |  checktab CARG1[m
[31m-    |   lwzx STR:RC, KBASE, TMP1	// KBASE-4-str_const*4[m
[31m-    |  bne ->vmeta_tgets1[m
[31m-    |->BC_TGETS_Z:[m
[31m-    |  // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8[m
[31m-    |  lwz TMP0, TAB:RB->hmask[m
[31m-    |  lwz TMP1, STR:RC->hash[m
[31m-    |  lwz NODE:TMP2, TAB:RB->node[m
[31m-    |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-    |  slwi TMP0, TMP1, 5[m
[31m-    |  slwi TMP1, TMP1, 3[m
[31m-    |  sub TMP1, TMP0, TMP1[m
[31m-    |  add NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-    |1:[m
[31m-    |  lwz CARG1, NODE:TMP2->key[m
[31m-    |   lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)[m
[31m-    |    lwz CARG2, NODE:TMP2->val[m
[31m-    |     lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2)[m
[31m-    |  checkstr CARG1; bne >4[m
[31m-    |   cmpw TMP0, STR:RC; bne >4[m
[31m-    |    checknil CARG2; beq >5		// Key found, but nil value?[m
[31m-    |3:[m
[31m-    |    stwux CARG2, RA, BASE[m
[31m-    |     stw TMP1, 4(RA)[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  lwz NODE:TMP2, NODE:TMP2->next[m
[31m-    |  cmplwi NODE:TMP2, 0[m
[31m-    |  bne <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |   li CARG2, LJ_TNIL[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  lwz TAB:TMP2, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <3				// No metatable: done.[m
[31m-    |  lbz TMP0, TAB:TMP2->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_index[m
[31m-    |  bne <3				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgets[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = index*8[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |   srwi TMP0, RC, 3[m
[31m-    |   lwz TAB:RB, 4(RB)[m
[31m-    |  checktab CARG1; bne ->vmeta_tgetb[m
[31m-    |  lwz TMP1, TAB:RB->asize[m
[31m-    |   lwz TMP2, TAB:RB->array[m
[31m-    |  cmplw TMP0, TMP1; bge ->vmeta_tgetb[m
[31m-    |  lwzx TMP1, TMP2, RC[m
[31m-    |   lfdx f0, TMP2, RC[m
[31m-    |  checknil TMP1; beq >5[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |   stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  lwz TAB:TMP2, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  lbz TMP2, TAB:TMP2->nomm[m
[31m-    |  andix. TMP2, TMP2, 1<<MM_index[m
[31m-    |  bne <1				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetb			// Caveat: preserve TMP0![m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  add RB, BASE, RB[m
[31m-    |  lwz TAB:CARG1, 4(RB)[m
[31m-    |.if DUALNUM[m
[31m-    |  add RC, BASE, RC[m
[31m-    |  lwz TMP0, TAB:CARG1->asize[m
[31m-    |  lwz CARG2, 4(RC)[m
[31m-    |   lwz TMP1, TAB:CARG1->array[m
[31m-    |.else[m
[31m-    |  lfdx f0, BASE, RC[m
[31m-    |  lwz TMP0, TAB:CARG1->asize[m
[31m-    |  toint CARG2, f0[m
[31m-    |   lwz TMP1, TAB:CARG1->array[m
[31m-    |.endif[m
[31m-    |  cmplw TMP0, CARG2[m
[31m-    |   slwi TMP2, CARG2, 3[m
[31m-    |  ble ->vmeta_tgetr		// In array part?[m
[31m-    |   lfdx f14, TMP1, TMP2[m
[31m-    |->BC_TGETR_Z:[m
[31m-    |  ins_next1[m
[31m-    |   stfdx f14, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  // RA = src*8, RB = table*8, RC = key*8[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |  lwzux CARG2, RC, BASE[m
[31m-    |   lwz TAB:RB, 4(RB)[m
[31m-    |.if DUALNUM[m
[31m-    |   lwz RC, 4(RC)[m
[31m-    |.else[m
[31m-    |   lfd f0, 0(RC)[m
[31m-    |.endif[m
[31m-    |  checktab CARG1[m
[31m-    |   checknum cr1, CARG2[m
[31m-    |  bne ->vmeta_tsetv[m
[31m-    |.if DUALNUM[m
[31m-    |  lwz TMP0, TAB:RB->asize[m
[31m-    |   bne cr1, >5[m
[31m-    |   lwz TMP1, TAB:RB->array[m
[31m-    |  cmplw TMP0, RC[m
[31m-    |   slwi TMP0, RC, 3[m
[31m-    |.else[m
[31m-    |   bge cr1, >5[m
[31m-    |  // Convert number key to integer, check for integerness and range.[m
[31m-    |  fctiwz f1, f0[m
[31m-    |    fadd f2, f0, TOBIT[m
[31m-    |  stfd f1, TMPD[m
[31m-    |   lwz TMP0, TAB:RB->asize[m
[31m-    |    fsub f2, f2, TOBIT[m
[31m-    |  lwz TMP2, TMPD_LO[m
[31m-    |   lwz TMP1, TAB:RB->array[m
[31m-    |    fcmpu cr1, f0, f2[m
[31m-    |  cmplw cr0, TMP0, TMP2[m
[31m-    |  crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq[m
[31m-    |   slwi TMP0, TMP2, 3[m
[31m-    |.endif[m
[31m-    |  ble ->vmeta_tsetv		// Integer key and in array part?[m
[31m-    |   lwzx TMP2, TMP1, TMP0[m
[31m-    |  lbz TMP3, TAB:RB->marked[m
[31m-    |    lfdx f14, BASE, RA[m
[31m-    |   checknil TMP2; beq >3[m
[31m-    |1:[m
[31m-    |  andix. TMP2, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |    stfdx f14, TMP1, TMP0[m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  lwz TAB:TMP2, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  lbz TMP2, TAB:TMP2->nomm[m
[31m-    |  andix. TMP2, TMP2, 1<<MM_newindex[m
[31m-    |  bne <1				// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  checkstr CARG2; bne ->vmeta_tsetv[m
[31m-    |.if not DUALNUM[m
[31m-    |  lwz STR:RC, 4(RC)[m
[31m-    |.endif[m
[31m-    |  b ->BC_TSETS_Z			// String key?[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  // RA = src*8, RB = table*8, RC = str_const*8 (~)[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |   srwi TMP1, RC, 1[m
[31m-    |    lwz TAB:RB, 4(RB)[m
[31m-    |   subfic TMP1, TMP1, -4[m
[31m-    |  checktab CARG1[m
[31m-    |   lwzx STR:RC, KBASE, TMP1	// KBASE-4-str_const*4[m
[31m-    |  bne ->vmeta_tsets1[m
[31m-    |->BC_TSETS_Z:[m
[31m-    |  // TAB:RB = GCtab *, STR:RC = GCstr *, RA = src*8[m
[31m-    |  lwz TMP0, TAB:RB->hmask[m
[31m-    |  lwz TMP1, STR:RC->hash[m
[31m-    |  lwz NODE:TMP2, TAB:RB->node[m
[31m-    |    stb ZERO, TAB:RB->nomm		// Clear metamethod cache.[m
[31m-    |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-    |    lfdx f14, BASE, RA[m
[31m-    |  slwi TMP0, TMP1, 5[m
[31m-    |  slwi TMP1, TMP1, 3[m
[31m-    |  sub TMP1, TMP0, TMP1[m
[31m-    |    lbz TMP3, TAB:RB->marked[m
[31m-    |  add NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-    |1:[m
[31m-    |  lwz CARG1, NODE:TMP2->key[m
[31m-    |   lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)[m
[31m-    |    lwz CARG2, NODE:TMP2->val[m
[31m-    |     lwz NODE:TMP1, NODE:TMP2->next[m
[31m-    |  checkstr CARG1; bne >5[m
[31m-    |   cmpw TMP0, STR:RC; bne >5[m
[31m-    |    checknil CARG2; beq >4		// Key found, but nil value?[m
[31m-    |2:[m
[31m-    |  andix. TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |    stfd f14, NODE:TMP2->val[m
[31m-    |  bne >7[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  lwz TAB:TMP1, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP1, 0[m
[31m-    |  beq <2				// No metatable: done.[m
[31m-    |  lbz TMP0, TAB:TMP1->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_newindex[m
[31m-    |  bne <2				// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsets[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  cmplwi NODE:TMP1, 0[m
[31m-    |   mr NODE:TMP2, NODE:TMP1[m
[31m-    |  bne <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  lwz TAB:TMP1, TAB:RB->metatable[m
[31m-    |   la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |   mr CARG1, L[m
[31m-    |  cmplwi TAB:TMP1, 0[m
[31m-    |   stp BASE, L->base[m
[31m-    |  beq >6				// No metatable: continue.[m
[31m-    |  lbz TMP0, TAB:TMP1->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_newindex[m
[31m-    |  beq ->vmeta_tsets		// 'no __newindex' flag NOT set: check.[m
[31m-    |6:[m
[31m-    |  li TMP0, LJ_TSTR[m
[31m-    |   stw STR:RC, 4(CARG3)[m
[31m-    |   mr CARG2, TAB:RB[m
[31m-    |  stw TMP0, 0(CARG3)[m
[31m-    |  bl extern lj_tab_newkey		// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Returns TValue *.[m
[31m-    |  lp BASE, L->base[m
[31m-    |  stfd f14, 0(CRET1)[m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  // RA = src*8, RB = table*8, RC = index*8[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |   srwi TMP0, RC, 3[m
[31m-    |   lwz TAB:RB, 4(RB)[m
[31m-    |  checktab CARG1; bne ->vmeta_tsetb[m
[31m-    |  lwz TMP1, TAB:RB->asize[m
[31m-    |   lwz TMP2, TAB:RB->array[m
[31m-    |    lbz TMP3, TAB:RB->marked[m
[31m-    |  cmplw TMP0, TMP1[m
[31m-    |   lfdx f14, BASE, RA[m
[31m-    |  bge ->vmeta_tsetb[m
[31m-    |  lwzx TMP1, TMP2, RC[m
[31m-    |  checknil TMP1; beq >5[m
[31m-    |1:[m
[31m-    |  andix. TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |   stfdx f14, TMP2, RC[m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  lwz TAB:TMP1, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP1, 0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  lbz TMP1, TAB:TMP1->nomm[m
[31m-    |  andix. TMP1, TMP1, 1<<MM_newindex[m
[31m-    |  bne <1				// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsetb			// Caveat: preserve TMP0![m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  add RB, BASE, RB[m
[31m-    |  lwz TAB:CARG2, 4(RB)[m
[31m-    |.if DUALNUM[m
[31m-    |  add RC, BASE, RC[m
[31m-    |    lbz TMP3, TAB:CARG2->marked[m
[31m-    |  lwz TMP0, TAB:CARG2->asize[m
[31m-    |  lwz CARG3, 4(RC)[m
[31m-    |   lwz TMP1, TAB:CARG2->array[m
[31m-    |.else[m
[31m-    |  lfdx f0, BASE, RC[m
[31m-    |    lbz TMP3, TAB:CARG2->marked[m
[31m-    |  lwz TMP0, TAB:CARG2->asize[m
[31m-    |  toint CARG3, f0[m
[31m-    |   lwz TMP1, TAB:CARG2->array[m
[31m-    |.endif[m
[31m-    |  andix. TMP2, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |  cmplw TMP0, CARG3[m
[31m-    |   slwi TMP2, CARG3, 3[m
[31m-    |   lfdx f14, BASE, RA[m
[31m-    |  ble ->vmeta_tsetr		// In array part?[m
[31m-    |  ins_next1[m
[31m-    |   stfdx f14, TMP1, TMP2[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP3, TMP2[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  // RA = base*8 (table at base-1), RD = num_const*8 (start index)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |1:[m
[31m-    |   add TMP3, KBASE, RD[m
[31m-    |  lwz TAB:CARG2, -4(RA)		// Guaranteed to be a table.[m
[31m-    |    addic. TMP0, MULTRES, -8[m
[31m-    |   lwz TMP3, 4(TMP3)		// Integer constant is in lo-word.[m
[31m-    |    srwi CARG3, TMP0, 3[m
[31m-    |    beq >4				// Nothing to copy?[m
[31m-    |  add CARG3, CARG3, TMP3[m
[31m-    |  lwz TMP2, TAB:CARG2->asize[m
[31m-    |   slwi TMP1, TMP3, 3[m
[31m-    |    lbz TMP3, TAB:CARG2->marked[m
[31m-    |  cmplw CARG3, TMP2[m
[31m-    |   add TMP2, RA, TMP0[m
[31m-    |   lwz TMP0, TAB:CARG2->array[m
[31m-    |  bgt >5[m
[31m-    |   add TMP1, TMP1, TMP0[m
[31m-    |    andix. TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |   lfd f0, 0(RA)[m
[31m-    |  addi RA, RA, 8[m
[31m-    |  cmpw cr1, RA, TMP2[m
[31m-    |   stfd f0, 0(TMP1)[m
[31m-    |    addi TMP1, TMP1, 8[m
[31m-    |  blt cr1, <3[m
[31m-    |  bne >7[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |   stp BASE, L->base[m
[31m-    |  mr CARG1, L[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  mr SAVE0, RD[m
[31m-    |  bl extern lj_tab_reasize		// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  // Must not reallocate the stack.[m
[31m-    |  mr RD, SAVE0[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP3, TMP0[m
[31m-    |  b <4[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALLM:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8,) RC = extra_nargs*8[m
[31m-    |  add NARGS8:RC, NARGS8:RC, MULTRES[m
[31m-    |  // Fall through. Assumes BC_CALL follows.[m
[31m-    break;[m
[31m-  case BC_CALL:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8[m
[31m-    |  mr TMP2, BASE[m
[31m-    |  lwzux TMP0, BASE, RA[m
[31m-    |   lwz LFUNC:RB, 4(BASE)[m
[31m-    |    subi NARGS8:RC, NARGS8:RC, 8[m
[31m-    |   addi BASE, BASE, 8[m
[31m-    |  checkfunc TMP0; bne ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = extra_nargs*8[m
[31m-    |  add NARGS8:RC, NARGS8:RC, MULTRES[m
[31m-    |  // Fall through. Assumes BC_CALLT follows.[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = (nargs+1)*8[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |   lwz LFUNC:RB, 4(RA)[m
[31m-    |    subi NARGS8:RC, NARGS8:RC, 8[m
[31m-    |    lwz TMP1, FRAME_PC(BASE)[m
[31m-    |  checkfunc TMP0[m
[31m-    |   addi RA, RA, 8[m
[31m-    |  bne ->vmeta_callt[m
[31m-    |->BC_CALLT_Z:[m
[31m-    |  andix. TMP0, TMP1, FRAME_TYPE	// Caveat: preserve cr0 until the crand.[m
[31m-    |   lbz TMP3, LFUNC:RB->ffid[m
[31m-    |    xori TMP2, TMP1, FRAME_VARG[m
[31m-    |    cmplwi cr1, NARGS8:RC, 0[m
[31m-    |  bne >7[m
[31m-    |1:[m
[31m-    |  stw LFUNC:RB, FRAME_FUNC(BASE)	// Copy function down, but keep PC.[m
[31m-    |  li TMP2, 0[m
[31m-    |   cmplwi cr7, TMP3, 1		// (> FF_C) Calling a fast function?[m
[31m-    |    beq cr1, >3[m
[31m-    |2:[m
[31m-    |  addi TMP3, TMP2, 8[m
[31m-    |   lfdx f0, RA, TMP2[m
[31m-    |  cmplw cr1, TMP3, NARGS8:RC[m
[31m-    |   stfdx f0, BASE, TMP2[m
[31m-    |  mr TMP2, TMP3[m
[31m-    |  bne cr1, <2[m
[31m-    |3:[m
[31m-    |  crand 4*cr0+eq, 4*cr0+eq, 4*cr7+gt[m
[31m-    |  beq >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function with a Lua frame below.[m
[31m-    |  lwz INS, -4(TMP1)[m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  sub TMP1, BASE, RA[m
[31m-    |  lwz LFUNC:TMP1, FRAME_FUNC-8(TMP1)[m
[31m-    |  lwz TMP1, LFUNC:TMP1->pc[m
[31m-    |  lwz KBASE, PC2PROTO(k)(TMP1)	// Need to prepare KBASE.[m
[31m-    |  b <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  andix. TMP0, TMP2, FRAME_TYPEP[m
[31m-    |  bne <1				// Vararg frame below?[m
[31m-    |  sub BASE, BASE, TMP2		// Relocate BASE down.[m
[31m-    |  lwz TMP1, FRAME_PC(BASE)[m
[31m-    |  andix. TMP0, TMP1, FRAME_TYPE[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8))[m
[31m-    |  mr TMP2, BASE[m
[31m-    |  add BASE, BASE, RA[m
[31m-    |  lwz TMP1, -24(BASE)[m
[31m-    |   lwz LFUNC:RB, -20(BASE)[m
[31m-    |    lfd f1, -8(BASE)[m
[31m-    |    lfd f0, -16(BASE)[m
[31m-    |  stw TMP1, 0(BASE)		// Copy callable.[m
[31m-    |   stw LFUNC:RB, 4(BASE)[m
[31m-    |  checkfunc TMP1[m
[31m-    |    stfd f1, 16(BASE)		// Copy control var.[m
[31m-    |     li NARGS8:RC, 16		// Iterators get 2 arguments.[m
[31m-    |    stfdu f0, 8(BASE)		// Copy state.[m
[31m-    |  bne ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8)[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  lwz TAB:RB, -12(RA)[m
[31m-    |  lwz RC, -4(RA)			// Get index from control var.[m
[31m-    |  lwz TMP0, TAB:RB->asize[m
[31m-    |  lwz TMP1, TAB:RB->array[m
[31m-    |   addi PC, PC, 4[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  cmplw RC, TMP0[m
[31m-    |   slwi TMP3, RC, 3[m
[31m-    |  bge >5				// Index points after array part?[m
[31m-    |  lwzx TMP2, TMP1, TMP3[m
[31m-    |   lfdx f0, TMP1, TMP3[m
[31m-    |  checknil TMP2[m
[31m-    |     lwz INS, -4(PC)[m
[31m-    |  beq >4[m
[31m-    |.if DUALNUM[m
[31m-    |   stw RC, 4(RA)[m
[31m-    |   stw TISNUM, 0(RA)[m
[31m-    |.else[m
[31m-    |   tonum_u f1, RC[m
[31m-    |.endif[m
[31m-    |    addi RC, RC, 1[m
[31m-    |     addis TMP3, PC, -(BCBIAS_J*4 >> 16)[m
[31m-    |  stfd f0, 8(RA)[m
[31m-    |     decode_RD4 TMP1, INS[m
[31m-    |    stw RC, -4(RA)			// Update control var.[m
[31m-    |     add PC, TMP1, TMP3[m
[31m-    |.if not DUALNUM[m
[31m-    |   stfd f1, 0(RA)[m
[31m-    |.endif[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Skip holes in array part.[m
[31m-    |  addi RC, RC, 1[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  lwz TMP1, TAB:RB->hmask[m
[31m-    |  sub RC, RC, TMP0[m
[31m-    |   lwz TMP2, TAB:RB->node[m
[31m-    |6:[m
[31m-    |  cmplw RC, TMP1			// End of iteration? Branch to ITERL+1.[m
[31m-    |   slwi TMP3, RC, 5[m
[31m-    |  bgty <3[m
[31m-    |   slwi RB, RC, 3[m
[31m-    |   sub TMP3, TMP3, RB[m
[31m-    |  lwzx RB, TMP2, TMP3[m
[31m-    |  lfdx f0, TMP2, TMP3[m
[31m-    |   add NODE:TMP3, TMP2, TMP3[m
[31m-    |  checknil RB[m
[31m-    |     lwz INS, -4(PC)[m
[31m-    |  beq >7[m
[31m-    |   lfd f1, NODE:TMP3->key[m
[31m-    |     addis TMP2, PC, -(BCBIAS_J*4 >> 16)[m
[31m-    |  stfd f0, 8(RA)[m
[31m-    |    add RC, RC, TMP0[m
[31m-    |     decode_RD4 TMP1, INS[m
[31m-    |   stfd f1, 0(RA)[m
[31m-    |    addi RC, RC, 1[m
[31m-    |     add PC, TMP1, TMP2[m
[31m-    |    stw RC, -4(RA)			// Update control var.[m
[31m-    |  b <3[m
[31m-    |[m
[31m-    |7:  // Skip holes in hash part.[m
[31m-    |  addi RC, RC, 1[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  // RA = base*8, RD = target (points to ITERN)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  lwz TMP0, -24(RA)[m
[31m-    |  lwz CFUNC:TMP1, -20(RA)[m
[31m-    |   lwz TMP2, -16(RA)[m
[31m-    |    lwz TMP3, -8(RA)[m
[31m-    |   cmpwi cr0, TMP2, LJ_TTAB[m
[31m-    |  cmpwi cr1, TMP0, LJ_TFUNC[m
[31m-    |    cmpwi cr6, TMP3, LJ_TNIL[m
[31m-    |  bne cr1, >5[m
[31m-    |  lbz TMP1, CFUNC:TMP1->ffid[m
[31m-    |   crand 4*cr0+eq, 4*cr0+eq, 4*cr6+eq[m
[31m-    |  cmpwi cr7, TMP1, FF_next_N[m
[31m-    |    srwi TMP0, RD, 1[m
[31m-    |  crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq[m
[31m-    |    add TMP3, PC, TMP0[m
[31m-    |  bne cr0, >5[m
[31m-    |  lus TMP1, 0xfffe[m
[31m-    |  ori TMP1, TMP1, 0x7fff[m
[31m-    |  stw ZERO, -4(RA)			// Initialize control var.[m
[31m-    |  stw TMP1, -8(RA)[m
[31m-    |    addis PC, TMP3, -(BCBIAS_J*4 >> 16)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  li TMP0, BC_JMP[m
[31m-    |   li TMP1, BC_ITERC[m
[31m-    |  stb TMP0, -1(PC)[m
[31m-    |    addis PC, TMP3, -(BCBIAS_J*4 >> 16)[m
[31m-    |   stb TMP1, 3(PC)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  // RA = base*8, RB = (nresults+1)*8, RC = numparams*8[m
[31m-    |  lwz TMP0, FRAME_PC(BASE)[m
[31m-    |  add RC, BASE, RC[m
[31m-    |   add RA, BASE, RA[m
[31m-    |  addi RC, RC, FRAME_VARG[m
[31m-    |   add TMP2, RA, RB[m
[31m-    |  subi TMP3, BASE, 8		// TMP3 = vtop[m
[31m-    |  sub RC, RC, TMP0			// RC = vbase[m
[31m-    |  // Note: RC may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  cmplwi cr1, RB, 0[m
[31m-    |.if PPE[m
[31m-    |   sub TMP1, TMP3, RC[m
[31m-    |   cmpwi TMP1, 0[m
[31m-    |.else[m
[31m-    |   sub. TMP1, TMP3, RC[m
[31m-    |.endif[m
[31m-    |  beq cr1, >5			// Copy all varargs?[m
[31m-    |   subi TMP2, TMP2, 16[m
[31m-    |   ble >2				// No vararg slots?[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  lfd f0, 0(RC)[m
[31m-    |   addi RC, RC, 8[m
[31m-    |  stfd f0, 0(RA)[m
[31m-    |  cmplw RA, TMP2[m
[31m-    |   cmplw cr1, RC, TMP3[m
[31m-    |  bge >3				// All destination slots filled?[m
[31m-    |    addi RA, RA, 8[m
[31m-    |   blt cr1, <1			// More vararg slots?[m
[31m-    |2:  // Fill up remainder with nil.[m
[31m-    |  stw TISNIL, 0(RA)[m
[31m-    |  cmplw RA, TMP2[m
[31m-    |   addi RA, RA, 8[m
[31m-    |  blt <2[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  lwz TMP0, L->maxstack[m
[31m-    |   li MULTRES, 8			// MULTRES = (0+1)*8[m
[31m-    |  bley <3				// No vararg slots?[m
[31m-    |  add TMP2, RA, TMP1[m
[31m-    |  cmplw TMP2, TMP0[m
[31m-    |   addi MULTRES, TMP1, 8[m
[31m-    |  bgt >7[m
[31m-    |6:[m
[31m-    |  lfd f0, 0(RC)[m
[31m-    |   addi RC, RC, 8[m
[31m-    |  stfd f0, 0(RA)[m
[31m-    |  cmplw RC, TMP3[m
[31m-    |   addi RA, RA, 8[m
[31m-    |  blt <6				// More vararg slots?[m
[31m-    |  b <3[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  mr CARG1, L[m
[31m-    |   stp RA, L->top[m
[31m-    |  sub SAVE0, RC, BASE		// Need delta, because BASE may change.[m
[31m-    |   stp BASE, L->base[m
[31m-    |  sub RA, RA, BASE[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  srwi CARG2, TMP1, 3[m
[31m-    |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |  lp BASE, L->base[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  add RC, BASE, SAVE0[m
[31m-    |  subi TMP3, BASE, 8[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  // RA = results*8, RD = extra_nresults*8[m
[31m-    |  add RD, RD, MULTRES		// MULTRES >= 8, so RD >= 8.[m
[31m-    |  // Fall through. Assumes BC_RET follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET:[m
[31m-    |  // RA = results*8, RD = (nresults+1)*8[m
[31m-    |  lwz PC, FRAME_PC(BASE)[m
[31m-    |   add RA, BASE, RA[m
[31m-    |    mr MULTRES, RD[m
[31m-    |1:[m
[31m-    |  andix. TMP0, PC, FRAME_TYPE[m
[31m-    |   xori TMP1, PC, FRAME_VARG[m
[31m-    |  bne ->BC_RETV_Z[m
[31m-    |[m
[31m-    |->BC_RET_Z:[m
[31m-    |  // BASE = base, RA = resultptr, RD = (nresults+1)*8, PC = return[m
[31m-    |   lwz INS, -4(PC)[m
[31m-    |  cmpwi RD, 8[m
[31m-    |   subi TMP2, BASE, 8[m
[31m-    |   subi RC, RD, 8[m
[31m-    |   decode_RB8 RB, INS[m
[31m-    |  beq >3[m
[31m-    |   li TMP1, 0[m
[31m-    |2:[m
[31m-    |  addi TMP3, TMP1, 8[m
[31m-    |   lfdx f0, RA, TMP1[m
[31m-    |  cmpw TMP3, RC[m
[31m-    |   stfdx f0, TMP2, TMP1[m
[31m-    |  beq >3[m
[31m-    |  addi TMP1, TMP3, 8[m
[31m-    |   lfdx f1, RA, TMP3[m
[31m-    |  cmpw TMP1, RC[m
[31m-    |   stfdx f1, TMP2, TMP3[m
[31m-    |  bne <2[m
[31m-    |3:[m
[31m-    |5:[m
[31m-    |  cmplw RB, RD[m
[31m-    |   decode_RA8 RA, INS[m
[31m-    |  bgt >6[m
[31m-    |   sub BASE, TMP2, RA[m
[31m-    |  lwz LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, LFUNC:TMP1->pc[m
[31m-    |  lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  subi TMP1, RD, 8[m
[31m-    |   addi RD, RD, 8[m
[31m-    |  stwx TISNIL, TMP2, TMP1[m
[31m-    |  b <5[m
[31m-    |[m
[31m-    |->BC_RETV_Z:  // Non-standard return case.[m
[31m-    |  andix. TMP2, TMP1, FRAME_TYPEP[m
[31m-    |  bne ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down.[m
[31m-    |  sub BASE, BASE, TMP1[m
[31m-    |  lwz PC, FRAME_PC(BASE)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET0: case BC_RET1:[m
[31m-    |  // RA = results*8, RD = (nresults+1)*8[m
[31m-    |  lwz PC, FRAME_PC(BASE)[m
[31m-    |   add RA, BASE, RA[m
[31m-    |    mr MULTRES, RD[m
[31m-    |  andix. TMP0, PC, FRAME_TYPE[m
[31m-    |   xori TMP1, PC, FRAME_VARG[m
[31m-    |  bney ->BC_RETV_Z[m
[31m-    |[m
[31m-    |  lwz INS, -4(PC)[m
[31m-    |   subi TMP2, BASE, 8[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  lfd f0, 0(RA)[m
[31m-      |  stfd f0, 0(TMP2)[m
[31m-    }[m
[31m-    |5:[m
[31m-    |  cmplw RB, RD[m
[31m-    |   decode_RA8 RA, INS[m
[31m-    |  bgt >6[m
[31m-    |   sub BASE, TMP2, RA[m
[31m-    |  lwz LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, LFUNC:TMP1->pc[m
[31m-    |  lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  subi TMP1, RD, 8[m
[31m-    |   addi RD, RD, 8[m
[31m-    |  stwx TISNIL, TMP2, TMP1[m
[31m-    |  b <5[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IFORL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    |  // RA = base*8, RD = target (after end of loop or start of loop)[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |.if DUALNUM[m
[31m-    |  // Integer loop.[m
[31m-    |  lwzux TMP1, RA, BASE[m
[31m-    |   lwz CARG1, FORL_IDX*8+4(RA)[m
[31m-    |  cmplw cr0, TMP1, TISNUM[m
[31m-    if (vk) {[m
[31m-      |   lwz CARG3, FORL_STEP*8+4(RA)[m
[31m-      |  bne >9[m
[31m-      |.if GPR64[m
[31m-      |  // Need to check overflow for (a<<32) + (b<<32).[m
[31m-      |  rldicr TMP0, CARG1, 32, 31[m
[31m-      |  rldicr TMP2, CARG3, 32, 31[m
[31m-      |  add CARG1, CARG1, CARG3[m
[31m-      |  addo. TMP0, TMP0, TMP2[m
[31m-      |.else[m
[31m-      |  addo. CARG1, CARG1, CARG3[m
[31m-      |.endif[m
[31m-      |    cmpwi cr6, CARG3, 0[m
[31m-      |   lwz CARG2, FORL_STOP*8+4(RA)[m
[31m-      |  bso >6[m
[31m-      |4:[m
[31m-      |  stw CARG1, FORL_IDX*8+4(RA)[m
[31m-    } else {[m
[31m-      |  lwz TMP3, FORL_STEP*8(RA)[m
[31m-      |   lwz CARG3, FORL_STEP*8+4(RA)[m
[31m-      |  lwz TMP2, FORL_STOP*8(RA)[m
[31m-      |   lwz CARG2, FORL_STOP*8+4(RA)[m
[31m-      |  cmplw cr7, TMP3, TISNUM[m
[31m-      |  cmplw cr1, TMP2, TISNUM[m
[31m-      |  crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq[m
[31m-      |  crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq[m
[31m-      |    cmpwi cr6, CARG3, 0[m
[31m-      |  bne >9[m
[31m-    }[m
[31m-    |    blt cr6, >5[m
[31m-    |  cmpw CARG1, CARG2[m
[31m-    |1:[m
[31m-    |   stw TISNUM, FORL_EXT*8(RA)[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  srwi RD, RD, 1[m
[31m-    }[m
[31m-    |   stw CARG1, FORL_EXT*8+4(RA)[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  add RD, PC, RD[m
[31m-    }[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  bgt >3  // See FP loop below.[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-      |  bley >7[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  bgt >2[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-    } else {[m
[31m-      |  bley =>BC_JLOOP[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |5:  // Invert check for negative step.[m
[31m-    |  cmpw CARG2, CARG1[m
[31m-    |  b <1[m
[31m-    if (vk) {[m
[31m-      |6:  // Potential overflow.[m
[31m-      |  checkov TMP0, <4		// Ignore unrelated overflow.[m
[31m-      |  b <2[m
[31m-    }[m
[31m-    |.endif[m
[31m-    if (vk) {[m
[31m-      |.if DUALNUM[m
[31m-      |9:  // FP loop.[m
[31m-      |  lfd f1, FORL_IDX*8(RA)[m
[31m-      |.else[m
[31m-      |  lfdux f1, RA, BASE[m
[31m-      |.endif[m
[31m-      |  lfd f3, FORL_STEP*8(RA)[m
[31m-      |  lfd f2, FORL_STOP*8(RA)[m
[31m-      |   lwz TMP3, FORL_STEP*8(RA)[m
[31m-      |  fadd f1, f1, f3[m
[31m-      |  stfd f1, FORL_IDX*8(RA)[m
[31m-    } else {[m
[31m-      |.if DUALNUM[m
[31m-      |9:  // FP loop.[m
[31m-      |.else[m
[31m-      |  lwzux TMP1, RA, BASE[m
[31m-      |  lwz TMP3, FORL_STEP*8(RA)[m
[31m-      |  lwz TMP2, FORL_STOP*8(RA)[m
[31m-      |  cmplw cr0, TMP1, TISNUM[m
[31m-      |  cmplw cr7, TMP3, TISNUM[m
[31m-      |  cmplw cr1, TMP2, TISNUM[m
[31m-      |.endif[m
[31m-      |   lfd f1, FORL_IDX*8(RA)[m
[31m-      |  crand 4*cr0+lt, 4*cr0+lt, 4*cr7+lt[m
[31m-      |  crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-      |   lfd f2, FORL_STOP*8(RA)[m
[31m-      |  bge ->vmeta_for[m
[31m-    }[m
[31m-    |  cmpwi cr6, TMP3, 0[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  srwi RD, RD, 1[m
[31m-    }[m
[31m-    |   stfd f1, FORL_EXT*8(RA)[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  add RD, PC, RD[m
[31m-    }[m
[31m-    |  fcmpu cr0, f1, f2[m
[31m-    if (op == BC_JFORI) {[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-    }[m
[31m-    |  blt cr6, >5[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  bgt >3[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |.if DUALNUM[m
[31m-      |  bgty <2[m
[31m-      |.else[m
[31m-      |  bgt >2[m
[31m-      |.endif[m
[31m-      |1:[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  bley >7[m
[31m-    } else {[m
[31m-      |  bley =>BC_JLOOP[m
[31m-    }[m
[31m-    |.if DUALNUM[m
[31m-    |  b <2[m
[31m-    |.else[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    |5:  // Negative step.[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  bge <2[m
[31m-      |3:  // Used by integer loop, too.[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  bgey <1[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  bgey >7[m
[31m-    } else {[m
[31m-      |  bgey =>BC_JLOOP[m
[31m-    }[m
[31m-    |  b <2[m
[31m-    if (op == BC_JFORI) {[m
[31m-      |7:[m
[31m-      |  lwz INS, -4(PC)[m
[31m-      |  decode_RD8 RD, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IITERL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  // RA = base*8, RD = target[m
[31m-    |  lwzux TMP1, RA, BASE[m
[31m-    |   lwz TMP2, 4(RA)[m
[31m-    |  checknil TMP1; beq >1		// Stop if iterator returned nil.[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  stw TMP1, -8(RA)[m
[31m-      |   stw TMP2, -4(RA)[m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  branch_RD			// Otherwise save control var + branch.[m
[31m-      |  stw TMP1, -8(RA)[m
[31m-      |   stw TMP2, -4(RA)[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  // RA = base*8, RD = target (loop extent)[m
[31m-    |  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_ILOOP follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  // RA = base*8, RD = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  // RA = base*8 (ignored), RD = traceno*8[m
[31m-    |  lwz TMP1, DISPATCH_J(trace)(DISPATCH)[m
[31m-    |  srwi RD, RD, 1[m
[31m-    |  // Traces on PPC don't store the trace number, so use 0.[m
[31m-    |   stw ZERO, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-    |  lwzx TRACE:TMP2, TMP1, RD[m
[31m-    |  clrso TMP1[m
[31m-    |  lp TMP2, TRACE:TMP2->mcode[m
[31m-    |   stw BASE, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-    |  mtctr TMP2[m
[31m-    |   addi JGL, DISPATCH, GG_DISP2G+32768[m
[31m-    |   stw L, DISPATCH_GL(tmpbuf.L)(DISPATCH)[m
[31m-    |  bctr[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  // RA = base*8 (only used by trace recorder), RD = target[m
[31m-    |  branch_RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    |  // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8[m
[31m-    |  lwz TMP2, L->maxstack[m
[31m-    |   lbz TMP1, -4+PC2PROTO(numparams)(PC)[m
[31m-    |    lwz KBASE, -4+PC2PROTO(k)(PC)[m
[31m-    |  cmplw RA, TMP2[m
[31m-    |   slwi TMP1, TMP1, 3[m
[31m-    |  bgt ->vm_growstack_l[m
[31m-    if (op != BC_JFUNCF) {[m
[31m-      |  ins_next1[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  cmplw NARGS8:RC, TMP1		// Check for missing parameters.[m
[31m-    |  blt >3[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  decode_RD8 RD, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next2[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  stwx TISNIL, BASE, NARGS8:RC[m
[31m-    |  addi NARGS8:RC, NARGS8:RC, 8[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    |  NYI  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8[m
[31m-    |  lwz TMP2, L->maxstack[m
[31m-    |   add TMP1, BASE, RC[m
[31m-    |  add TMP0, RA, RC[m
[31m-    |   stw LFUNC:RB, 4(TMP1)		// Store copy of LFUNC.[m
[31m-    |   addi TMP3, RC, 8+FRAME_VARG[m
[31m-    |    lwz KBASE, -4+PC2PROTO(k)(PC)[m
[31m-    |  cmplw TMP0, TMP2[m
[31m-    |   stw TMP3, 0(TMP1)		// Store delta + FRAME_VARG.[m
[31m-    |  bge ->vm_growstack_l[m
[31m-    |  lbz TMP2, -4+PC2PROTO(numparams)(PC)[m
[31m-    |   mr RA, BASE[m
[31m-    |   mr RC, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  cmpwi TMP2, 0[m
[31m-    |   addi BASE, TMP1, 8[m
[31m-    |  beq >3[m
[31m-    |1:[m
[31m-    |  cmplw RA, RC			// Less args than parameters?[m
[31m-    |   lwz TMP0, 0(RA)[m
[31m-    |   lwz TMP3, 4(RA)[m
[31m-    |  bge >4[m
[31m-    |    stw TISNIL, 0(RA)		// Clear old fixarg slot (help the GC).[m
[31m-    |    addi RA, RA, 8[m
[31m-    |2:[m
[31m-    |  addic. TMP2, TMP2, -1[m
[31m-    |   stw TMP0, 8(TMP1)[m
[31m-    |   stw TMP3, 12(TMP1)[m
[31m-    |    addi TMP1, TMP1, 8[m
[31m-    |  bne <1[m
[31m-    |3:[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |4:  // Clear missing parameters.[m
[31m-    |  li TMP0, LJ_TNIL[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  lp RD, CFUNC:RB->f[m
[31m-    } else {[m
[31m-      |  lp RD, DISPATCH_GL(wrapf)(DISPATCH)[m
[31m-    }[m
[31m-    |   add TMP1, RA, NARGS8:RC[m
[31m-    |   lwz TMP2, L->maxstack[m
[31m-    |  .toc lp TMP3, 0(RD)[m
[31m-    |    add RC, BASE, NARGS8:RC[m
[31m-    |   stp BASE, L->base[m
[31m-    |   cmplw TMP1, TMP2[m
[31m-    |    stp RC, L->top[m
[31m-    |     li_vmstate C[m
[31m-    |.if TOC[m
[31m-    |  mtctr TMP3[m
[31m-    |.else[m
[31m-    |  mtctr RD[m
[31m-    |.endif[m
[31m-    if (op == BC_FUNCCW) {[m
[31m-      |  lp CARG2, CFUNC:RB->f[m
[31m-    }[m
[31m-    |  mr CARG1, L[m
[31m-    |   bgt ->vm_growstack_c		// Need to grow stack.[m
[31m-    |  .toc lp TOCREG, TOC_OFS(RD)[m
[31m-    |  .tocenv lp ENVREG, ENV_OFS(RD)[m
[31m-    |     st_vmstate[m
[31m-    |  bctrl				// (lua_State *L [, lua_CFunction f])[m
[31m-    |  // Returns nresults.[m
[31m-    |  lp BASE, L->base[m
[31m-    |  .toc ld TOCREG, SAVE_TOC[m
[31m-    |   slwi RD, CRET1, 3[m
[31m-    |  lp TMP1, L->top[m
[31m-    |    li_vmstate INTERP[m
[31m-    |  lwz PC, FRAME_PC(BASE)		// Fetch PC of caller.[m
[31m-    |    stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-    |   sub RA, TMP1, RD		// RA = L->top - nresults*8[m
[31m-    |    st_vmstate[m
[31m-    |  b ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-[m
[31m-  build_subroutines(ctx);[m
[31m-[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  int i;[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 65\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.long .Lbegin\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"[m
[31m-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"[m
[31m-	"\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 14; i <= 31; i++)[m
[31m-      fprintf(ctx->fp,[m
[31m-	"\t.byte %d\n\t.uleb128 %d\n"[m
[31m-	"\t.byte %d\n\t.uleb128 %d\n",[m
[31m-	0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE0:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-#if LJ_TARGET_PS3[m
[31m-	"\t.long .lj_vm_ffi_call\n"[m
[31m-#else[m
[31m-	"\t.long lj_vm_ffi_call\n"[m
[31m-#endif[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"[m
[31m-	"\t.byte 0x8e\n\t.uleb128 2\n"[m
[31m-	"\t.byte 0xd\n\t.uleb128 0xe\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#if !LJ_NO_UNWIND[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.long .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 65\n"[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.long lj_err_unwind_dwarf-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.long .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.long .LASFDE2-.Lframe1\n"[m
[31m-	"\t.long .Lbegin-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"[m
[31m-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"[m
[31m-	"\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 14; i <= 31; i++)[m
[31m-      fprintf(ctx->fp,[m
[31m-	"\t.byte %d\n\t.uleb128 %d\n"[m
[31m-	"\t.byte %d\n\t.uleb128 %d\n",[m
[31m-	0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE2:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.long .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 65\n"[m
[31m-	"\t.uleb128 1\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.long .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.long .LASFDE3-.Lframe2\n"[m
[31m-	"\t.long lj_vm_ffi_call-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"[m
[31m-	"\t.byte 0x8e\n\t.uleb128 2\n"[m
[31m-	"\t.byte 0xd\n\t.uleb128 0xe\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#endif[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_x64.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_x64.dasc[m
[1mdeleted file mode 100644[m
[1mindex 759e30e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_x64.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,4910 +0,0 @@[m
[31m-|// Low-level VM code for x64 CPUs in LJ_GC64 mode.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.arch x64[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|.if WIN[m
[31m-|.define X64WIN, 1			// Windows/x64 calling conventions.[m
[31m-|.endif[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|// This is very fragile and has many dependencies. Caveat emptor.[m
[31m-|.define BASE,		rdx		// Not C callee-save, refetched anyway.[m
[31m-|.if X64WIN[m
[31m-|.define KBASE,		rdi		// Must be C callee-save.[m
[31m-|.define PC,		rsi		// Must be C callee-save.[m
[31m-|.define DISPATCH,	rbx		// Must be C callee-save.[m
[31m-|.define KBASEd,	edi[m
[31m-|.define PCd,		esi[m
[31m-|.define DISPATCHd,	ebx[m
[31m-|.else[m
[31m-|.define KBASE,		r15		// Must be C callee-save.[m
[31m-|.define PC,		rbx		// Must be C callee-save.[m
[31m-|.define DISPATCH,	r14		// Must be C callee-save.[m
[31m-|.define KBASEd,	r15d[m
[31m-|.define PCd,		ebx[m
[31m-|.define DISPATCHd,	r14d[m
[31m-|.endif[m
[31m-|[m
[31m-|.define RA,		rcx[m
[31m-|.define RAd,		ecx[m
[31m-|.define RAH,		ch[m
[31m-|.define RAL,		cl[m
[31m-|.define RB,		rbp		// Must be rbp (C callee-save).[m
[31m-|.define RBd,		ebp[m
[31m-|.define RC,		rax		// Must be rax.[m
[31m-|.define RCd,		eax[m
[31m-|.define RCW,		ax[m
[31m-|.define RCH,		ah[m
[31m-|.define RCL,		al[m
[31m-|.define OP,		RBd[m
[31m-|.define RD,		RC[m
[31m-|.define RDd,		RCd[m
[31m-|.define RDW,		RCW[m
[31m-|.define RDL,		RCL[m
[31m-|.define TMPR,		r10[m
[31m-|.define TMPRd,		r10d[m
[31m-|.define ITYPE,		r11[m
[31m-|.define ITYPEd,	r11d[m
[31m-|[m
[31m-|.if X64WIN[m
[31m-|.define CARG1,		rcx		// x64/WIN64 C call arguments.[m
[31m-|.define CARG2,		rdx[m
[31m-|.define CARG3,		r8[m
[31m-|.define CARG4,		r9[m
[31m-|.define CARG1d,	ecx[m
[31m-|.define CARG2d,	edx[m
[31m-|.define CARG3d,	r8d[m
[31m-|.define CARG4d,	r9d[m
[31m-|.else[m
[31m-|.define CARG1,		rdi		// x64/POSIX C call arguments.[m
[31m-|.define CARG2,		rsi[m
[31m-|.define CARG3,		rdx[m
[31m-|.define CARG4,		rcx[m
[31m-|.define CARG5,		r8[m
[31m-|.define CARG6,		r9[m
[31m-|.define CARG1d,	edi[m
[31m-|.define CARG2d,	esi[m
[31m-|.define CARG3d,	edx[m
[31m-|.define CARG4d,	ecx[m
[31m-|.define CARG5d,	r8d[m
[31m-|.define CARG6d,	r9d[m
[31m-|.endif[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.if X64WIN		// x64/Windows stack layout[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push rdi; push rsi; push rbx[m
[31m-|  sub rsp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push rbp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add rsp, CFRAME_SPACE[m
[31m-|  pop rbx; pop rsi; pop rdi; pop rbp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.define SAVE_CFRAME,	aword [rsp+aword*13][m
[31m-|.define SAVE_PC,	aword [rsp+aword*12][m
[31m-|.define SAVE_L,	aword [rsp+aword*11][m
[31m-|.define SAVE_ERRF,	dword [rsp+dword*21][m
[31m-|.define SAVE_NRES,	dword [rsp+dword*20][m
[31m-|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter[m
[31m-|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*8][m
[31m-|.define SAVE_R3,	aword [rsp+aword*7][m
[31m-|.define SAVE_R2,	aword [rsp+aword*6][m
[31m-|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.define ARG5,		aword [rsp+aword*4][m
[31m-|.define CSAVE_4,	aword [rsp+aword*3][m
[31m-|.define CSAVE_3,	aword [rsp+aword*2][m
[31m-|.define CSAVE_2,	aword [rsp+aword*1][m
[31m-|.define CSAVE_1,	aword [rsp]		//<-- rsp while in interpreter.[m
[31m-|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee[m
[31m-|[m
[31m-|.define ARG5d,		dword [rsp+dword*8][m
[31m-|.define TMP1,		ARG5			// TMP1 overlaps ARG5[m
[31m-|.define TMP1d,		ARG5d[m
[31m-|.define TMP1hi,	dword [rsp+dword*9][m
[31m-|.define MULTRES,	TMP1d			// MULTRES overlaps TMP1d.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.else			// x64/POSIX stack layout[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push rbx; push r15; push r14[m
[31m-|.if NO_UNWIND[m
[31m-|  push r13; push r12[m
[31m-|.endif[m
[31m-|  sub rsp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push rbp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add rsp, CFRAME_SPACE[m
[31m-|.if NO_UNWIND[m
[31m-|  pop r12; pop r13[m
[31m-|.endif[m
[31m-|  pop r14; pop r15; pop rbx; pop rbp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//----- 16 byte aligned,[m
[31m-|.if NO_UNWIND[m
[31m-|.define SAVE_RET,	aword [rsp+aword*11]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*10][m
[31m-|.define SAVE_R3,	aword [rsp+aword*9][m
[31m-|.define SAVE_R2,	aword [rsp+aword*8][m
[31m-|.define SAVE_R1,	aword [rsp+aword*7][m
[31m-|.define SAVE_RU2,	aword [rsp+aword*6][m
[31m-|.define SAVE_RU1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.else[m
[31m-|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*8][m
[31m-|.define SAVE_R3,	aword [rsp+aword*7][m
[31m-|.define SAVE_R2,	aword [rsp+aword*6][m
[31m-|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.endif[m
[31m-|.define SAVE_CFRAME,	aword [rsp+aword*4][m
[31m-|.define SAVE_PC,	aword [rsp+aword*3][m
[31m-|.define SAVE_L,	aword [rsp+aword*2][m
[31m-|.define SAVE_ERRF,	dword [rsp+dword*3][m
[31m-|.define SAVE_NRES,	dword [rsp+dword*2][m
[31m-|.define TMP1,		aword [rsp]		//<-- rsp while in interpreter.[m
[31m-|//----- 16 byte aligned[m
[31m-|[m
[31m-|.define TMP1d,		dword [rsp][m
[31m-|.define TMP1hi,	dword [rsp+dword*1][m
[31m-|.define MULTRES,	TMP1d			// MULTRES overlaps TMP1d.[m
[31m-|[m
[31m-|.endif[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Instruction headers.[m
[31m-|.macro ins_A; .endmacro[m
[31m-|.macro ins_AD; .endmacro[m
[31m-|.macro ins_AJ; .endmacro[m
[31m-|.macro ins_ABC; movzx RBd, RCH; movzx RCd, RCL; .endmacro[m
[31m-|.macro ins_AB_; movzx RBd, RCH; .endmacro[m
[31m-|.macro ins_A_C; movzx RCd, RCL; .endmacro[m
[31m-|.macro ins_AND; not RD; .endmacro[m
[31m-|[m
[31m-|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster).[m
[31m-|.macro ins_NEXT[m
[31m-|  mov RCd, [PC][m
[31m-|  movzx RAd, RCH[m
[31m-|  movzx OP, RCL[m
[31m-|  add PC, 4[m
[31m-|  shr RCd, 16[m
[31m-|  jmp aword [DISPATCH+OP*8][m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  // Around 10%-30% slower on Core2, a lot more slower on P4.[m
[31m-|  .macro ins_next[m
[31m-|    jmp ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, RB = LFUNC, RD = nargs+1, [BASE-8] = PC[m
[31m-|  mov PC, LFUNC:RB->pc[m
[31m-|  mov RAd, [PC][m
[31m-|  movzx OP, RAL[m
[31m-|  movzx RAd, RAH[m
[31m-|  add PC, 4[m
[31m-|  jmp aword [DISPATCH+OP*8][m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[31m-|  mov [BASE-8], PC[m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to clear or set tags.[m
[31m-|.macro cleartp, reg; shl reg, 17; shr reg, 17; .endmacro[m
[31m-|.macro settp, reg, tp[m
[31m-|  mov64 ITYPE, ((uint64_t)tp<<47)[m
[31m-|  or reg, ITYPE[m
[31m-|.endmacro[m
[31m-|.macro settp, dst, reg, tp[m
[31m-|  mov64 dst, ((uint64_t)tp<<47)[m
[31m-|  or dst, reg[m
[31m-|.endmacro[m
[31m-|.macro setint, reg[m
[31m-|  settp reg, LJ_TISNUM[m
[31m-|.endmacro[m
[31m-|.macro setint, dst, reg[m
[31m-|  settp dst, reg, LJ_TISNUM[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Macros to test operand types.[m
[31m-|.macro checktp_nc, reg, tp, target[m
[31m-|  mov ITYPE, reg[m
[31m-|  sar ITYPE, 47[m
[31m-|  cmp ITYPEd, tp[m
[31m-|  jne target[m
[31m-|.endmacro[m
[31m-|.macro checktp, reg, tp, target[m
[31m-|  mov ITYPE, reg[m
[31m-|  cleartp reg[m
[31m-|  sar ITYPE, 47[m
[31m-|  cmp ITYPEd, tp[m
[31m-|  jne target[m
[31m-|.endmacro[m
[31m-|.macro checktptp, src, tp, target[m
[31m-|  mov ITYPE, src[m
[31m-|  sar ITYPE, 47[m
[31m-|  cmp ITYPEd, tp[m
[31m-|  jne target[m
[31m-|.endmacro[m
[31m-|.macro checkstr, reg, target; checktp reg, LJ_TSTR, target; .endmacro[m
[31m-|.macro checktab, reg, target; checktp reg, LJ_TTAB, target; .endmacro[m
[31m-|.macro checkfunc, reg, target; checktp reg, LJ_TFUNC, target; .endmacro[m
[31m-|[m
[31m-|.macro checknumx, reg, target, jump[m
[31m-|  mov ITYPE, reg[m
[31m-|  sar ITYPE, 47[m
[31m-|  cmp ITYPEd, LJ_TISNUM[m
[31m-|  jump target[m
[31m-|.endmacro[m
[31m-|.macro checkint, reg, target; checknumx reg, target, jne; .endmacro[m
[31m-|.macro checkinttp, src, target; checknumx src, target, jne; .endmacro[m
[31m-|.macro checknum, reg, target; checknumx reg, target, jae; .endmacro[m
[31m-|.macro checknumtp, src, target; checknumx src, target, jae; .endmacro[m
[31m-|.macro checknumber, src, target; checknumx src, target, ja; .endmacro[m
[31m-|[m
[31m-|.macro mov_false, reg; mov64 reg, (int64_t)~((uint64_t)1<<47); .endmacro[m
[31m-|.macro mov_true, reg; mov64 reg, (int64_t)~((uint64_t)2<<47); .endmacro[m
[31m-|[m
[31m-|// These operands must be used with movzx.[m
[31m-|.define PC_OP, byte [PC-4][m
[31m-|.define PC_RA, byte [PC-3][m
[31m-|.define PC_RB, byte [PC-1][m
[31m-|.define PC_RC, byte [PC-2][m
[31m-|.define PC_RD, word [PC-2][m
[31m-|[m
[31m-|.macro branchPC, reg[m
[31m-|  lea PC, [PC+reg*4-BCBIAS_J*4][m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|// Decrement hashed hotcount and trigger trace recorder if zero.[m
[31m-|.macro hotloop, reg[m
[31m-|  mov reg, PCd[m
[31m-|  shr reg, 1[m
[31m-|  and reg, HOTCOUNT_PCMASK[m
[31m-|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP[m
[31m-|  jb ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall, reg[m
[31m-|  mov reg, PCd[m
[31m-|  shr reg, 1[m
[31m-|  and reg, HOTCOUNT_PCMASK[m
[31m-|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL[m
[31m-|  jb ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state.[m
[31m-|.macro set_vmstate, st[m
[31m-|  mov dword [DISPATCH+DISPATCH_GL(vmstate)], ~LJ_VMST_..st[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro fpop1; fstp st1; .endmacro[m
[31m-|[m
[31m-|// Synthesize SSE FP constants.[m
[31m-|.macro sseconst_abs, reg, tmp		// Synthesize abs mask.[m
[31m-|  mov64 tmp, U64x(7fffffff,ffffffff); movd reg, tmp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro sseconst_hi, reg, tmp, val	// Synthesize hi-32 bit const.[m
[31m-|  mov64 tmp, U64x(val,00000000); movd reg, tmp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro sseconst_sign, reg, tmp		// Synthesize sign mask.[m
[31m-|  sseconst_hi reg, tmp, 80000000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_1, reg, tmp		// Synthesize 1.0.[m
[31m-|  sseconst_hi reg, tmp, 3ff00000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_m1, reg, tmp		// Synthesize -1.0.[m
[31m-|  sseconst_hi reg, tmp, bff00000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_2p52, reg, tmp		// Synthesize 2^52.[m
[31m-|  sseconst_hi reg, tmp, 43300000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_tobit, reg, tmp	// Synthesize 2^52 + 2^51.[m
[31m-|  sseconst_hi reg, tmp, 43380000[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites reg.[m
[31m-|.macro barrierback, tab, reg[m
[31m-|  and byte tab->marked, (uint8_t)~LJ_GC_BLACK	// black2gray(tab)[m
[31m-|  mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)][m
[31m-|  mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab[m
[31m-|  mov tab->gclist, reg[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  test PCd, FRAME_P[m
[31m-  |  jz ->cont_dispatch[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  and PC, -8[m
[31m-  |  sub BASE, PC			// Restore caller base.[m
[31m-  |  lea RA, [RA+PC-8]			// Rebase RA and prepend one result.[m
[31m-  |  mov PC, [BASE-8]			// Fetch PC of previous frame.[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |  mov_true ITYPE[m
[31m-  |  mov aword [BASE+RA], ITYPE		// Prepend true to results.[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  add RDd, 1				// RD = nresults+1[m
[31m-  |  jz ->vm_unwind_yield[m
[31m-  |  mov MULTRES, RDd[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return[m
[31m-  |  xor PC, FRAME_C[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jnz ->vm_returnp[m
[31m-  |[m
[31m-  |  // Return to C.[m
[31m-  |  set_vmstate C[m
[31m-  |  and PC, -8[m
[31m-  |  sub PC, BASE[m
[31m-  |  neg PC				// Previous base = BASE - delta.[m
[31m-  |[m
[31m-  |  sub RDd, 1[m
[31m-  |  jz >2[m
[31m-  |1:  // Move results down.[m
[31m-  |  mov RB, [BASE+RA][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  add BASE, 8[m
[31m-  |  sub RDd, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, PC[m
[31m-  |3:[m
[31m-  |  mov RDd, MULTRES[m
[31m-  |  mov RAd, SAVE_NRES			// RA = wanted nresults+1[m
[31m-  |4:[m
[31m-  |  cmp RAd, RDd[m
[31m-  |  jne >6				// More/less results wanted?[m
[31m-  |5:[m
[31m-  |  sub BASE, 16[m
[31m-  |  mov L:RB->top, BASE[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  mov RA, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |  mov L:RB->cframe, RA[m
[31m-  |  xor eax, eax			// Ok return status for vm_pcall.[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  jb >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  cmp BASE, L:RB->maxstack[m
[31m-  |  ja >8[m
[31m-  |  mov aword [BASE-16], LJ_TNIL[m
[31m-  |  add BASE, 8[m
[31m-  |  add RDd, 1[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  test RAd, RAd[m
[31m-  |  jz <5				// But check for LUA_MULTRET+1.[m
[31m-  |  sub RA, RD				// Negative result![m
[31m-  |  lea BASE, [BASE+RA*8]		// Correct top.[m
[31m-  |  jmp <5[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  mov L:RB->top, BASE		// Save current top held in BASE (yes).[m
[31m-  |  mov MULTRES, RDd			// Need to fill only remainder with nil.[m
[31m-  |  mov CARG2d, RAd[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->top		// Need the (realloced) L->top in BASE.[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->vm_unwind_yield:[m
[31m-  |  mov al, LUA_YIELD[m
[31m-  |  jmp ->vm_unwind_c_eh[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  mov eax, CARG2d			// Error return status for vm_pcall.[m
[31m-  |  mov rsp, CARG1[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov GL:RB, L:RB->glref[m
[31m-  |  mov dword GL:RB->vmstate, ~LJ_VMST_C[m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_rethrow:[m
[31m-  |.if not X64WIN[m
[31m-  |  mov CARG1, SAVE_L[m
[31m-  |  mov CARG2d, eax[m
[31m-  |  restoreregs[m
[31m-  |  jmp extern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |  and CARG1, CFRAME_RAWMASK[m
[31m-  |  mov rsp, CARG1[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov RDd, 1+1			// Really 1+2 results, incr. later.[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov PC, [BASE-8]			// Fetch PC of previous frame.[m
[31m-  |  mov_false RA[m
[31m-  |  mov RB, [BASE][m
[31m-  |  mov [BASE-16], RA			// Prepend false to error message.[m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  mov RA, -16			// Results start at BASE+RA = BASE-16.[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  jmp ->vm_returnc			// Increments RD/MULTRES and returns.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  mov CARG2d, LUA_MINSTACK[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vm_growstack_v:			// Grow stack for vararg Lua function.[m
[31m-  |  sub RD, 16				// LJ_FR2[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_growstack_f:			// Grow stack for fixarg Lua function.[m
[31m-  |  // BASE = new base, RD = nargs+1, RB = L, PC = first PC[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |1:[m
[31m-  |  movzx RAd, byte [PC-4+PC2PROTO(framesize)][m
[31m-  |  add PC, 4				// Must point after first instruction.[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  mov CARG2, RA[m
[31m-  |2:[m
[31m-  |  // RB = L, L->base = new base, L->top = top[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  mov LFUNC:RB, [BASE-16][m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  sub RD, BASE[m
[31m-  |  shr RDd, 3[m
[31m-  |  add NARGS:RDd, 1[m
[31m-  |  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.[m
[31m-  |  mov SAVE_L, CARG1[m
[31m-  |  mov RA, CARG2[m
[31m-  |  mov PCd, FRAME_CP[m
[31m-  |  xor RDd, RDd[m
[31m-  |  lea KBASE, [esp+CFRAME_RESUME][m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov SAVE_PC, RD			// Any value outside of bytecode is ok.[m
[31m-  |  mov SAVE_CFRAME, RD[m
[31m-  |  mov SAVE_NRES, RDd[m
[31m-  |  mov SAVE_ERRF, RDd[m
[31m-  |  mov L:RB->cframe, KBASE[m
[31m-  |  cmp byte L:RB->status, RDL[m
[31m-  |  je >2				// Initial resume (like a call).[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov byte L:RB->status, RDL[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, RA[m
[31m-  |  shr RDd, 3[m
[31m-  |  add RDd, 1				// RD = nresults+1[m
[31m-  |  sub RA, BASE			// RA = resultofs[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov MULTRES, RDd[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  mov PCd, FRAME_CP[m
[31m-  |  mov SAVE_ERRF, CARG4d[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  mov PCd, FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  mov SAVE_NRES, CARG3d[m
[31m-  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.[m
[31m-  |  mov SAVE_L, CARG1[m
[31m-  |  mov RA, CARG2[m
[31m-  |[m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASE[m
[31m-  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov L:RB->cframe, rsp[m
[31m-  |[m
[31m-  |2:  // Entry point for vm_resume/vm_cpcall (RA = base, RB = L, PC = ftype).[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov BASE, L:RB->base		// BASE = old base (used in vmeta_call).[m
[31m-  |  add PC, RA[m
[31m-  |  sub PC, BASE			// PC = frame delta + frame type[m
[31m-  |[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, RA[m
[31m-  |  shr NARGS:RDd, 3[m
[31m-  |  add NARGS:RDd, 1			// RD = nargs+1[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  mov LFUNC:RB, [RA-16][m
[31m-  |  checkfunc LFUNC:RB, ->vmeta_call	// Ensure KBASE defined and != BASE.[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  mov BASE, RA[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, RB = func, RD = nargs+1, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.[m
[31m-  |  mov SAVE_L, CARG1[m
[31m-  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[31m-  |[m
[31m-  |  mov KBASE, L:RB->stack		// Compute -savestack(L, L->top).[m
[31m-  |  sub KBASE, L:RB->top[m
[31m-  |   mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  mov SAVE_ERRF, 0			// No error function.[m
[31m-  |  mov SAVE_NRES, KBASEd		// Neg. delta means cframe w/o frame.[m
[31m-  |   add DISPATCH, GG_G2DISP[m
[31m-  |  // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe).[m
[31m-  |[m
[31m-  |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASE[m
[31m-  |  mov L:RB->cframe, rsp[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |[m
[31m-  |  call CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |  // TValue * (new base) or NULL returned in eax (RC).[m
[31m-  |  test RC, RC[m
[31m-  |  jz ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |  mov RA, RC[m
[31m-  |  mov PCd, FRAME_CP[m
[31m-  |  jmp <2				// Else continue with the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultofs, RD = nresults+1 (also in MULTRES)[m
[31m-  |  add RA, BASE[m
[31m-  |  and PC, -8[m
[31m-  |  mov RB, BASE[m
[31m-  |  sub BASE, PC			// Restore caller BASE.[m
[31m-  |  mov aword [RA+RD*8-8], LJ_TNIL	// Ensure one valid arg.[m
[31m-  |  mov RC, RA				// ... in [RC][m
[31m-  |  mov PC, [RB-24]			// Restore PC from [cont|PC].[m
[31m-  |  mov RA, qword [RB-32]		// May be negative on WIN64 with debug.[m
[31m-  |.if FFI[m
[31m-  |  cmp RA, 1[m
[31m-  |  jbe >1[m
[31m-  |.endif[m
[31m-  |  mov LFUNC:KBASE, [BASE-16][m
[31m-  |  cleartp LFUNC:KBASE[m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  // BASE = base, RC = result, RB = meta base[m
[31m-  |  jmp RA				// Jump to continuation.[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  je ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: Tail call from C function.[m
[31m-  |  sub RB, BASE[m
[31m-  |  shr RBd, 3[m
[31m-  |  lea RDd, [RBd-3][m
[31m-  |  jmp ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// BASE = base, RC = result, RB = mbase[m
[31m-  |  movzx RAd, PC_RB[m
[31m-  |  sub RB, 32[m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |  sub RA, RB[m
[31m-  |  je ->cont_ra[m
[31m-  |  neg RA[m
[31m-  |  shr RAd, 3[m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3d, RAd[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE[m
[31m-  |  mov RC, [RC][m
[31m-  |  mov [RB], RC[m
[31m-  |  mov CARG2, RB[m
[31m-  |.else[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE[m
[31m-  |  mov CARG3d, RAd[m
[31m-  |  mov RA, [RC][m
[31m-  |  mov [RB], RA[m
[31m-  |  mov CARG2, RB[m
[31m-  |.endif[m
[31m-  |  jmp ->BC_CAT_Z[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  settp STR:RC, LJ_TSTR		// STR:RC = GCstr *[m
[31m-  |  mov TMP1, STR:RC[m
[31m-  |  lea RC, TMP1[m
[31m-  |  cmp PC_OP, BC_GGET[m
[31m-  |  jne >1[m
[31m-  |  settp TAB:RA, TAB:RB, LJ_TTAB	// TAB:RB = GCtab *[m
[31m-  |  lea RB, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[31m-  |  mov [RB], TAB:RA[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_tgetb:[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.if DUALNUM[m
[31m-  |  setint RC[m
[31m-  |  mov TMP1, RC[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RCd[m
[31m-  |  movsd TMP1, xmm0[m
[31m-  |.endif[m
[31m-  |  lea RC, TMP1[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |  movzx RCd, PC_RC			// Reload TValue *k from RC.[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  movzx RBd, PC_RB			// Reload TValue *t from RB.[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-  |  mov CARG2, RB[m
[31m-  |  mov CARG3, RC[m
[31m-  |  mov L:RB, L:CARG1[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz >3[m
[31m-  |->cont_ra:				// BASE = base, RC = result[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov RB, [RC][m
[31m-  |  mov [BASE+RA*8], RB[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  mov [RA-24], PC			// [cont|PC][m
[31m-  |  lea PC, [RA+FRAME_CONT][m
[31m-  |  sub PC, BASE[m
[31m-  |  mov LFUNC:RB, [RA-16]		// Guaranteed to be a function here.[m
[31m-  |  mov NARGS:RDd, 2+1			// 2 args for func(t, k).[m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  jmp ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  mov CARG1, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG2d, RCd			// Caveat: CARG2 == BASE[m
[31m-  |  call extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // cTValue * or NULL returned in eax (RC).[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  test RC, RC[m
[31m-  |  jnz ->BC_TGETR_Z[m
[31m-  |  mov ITYPE, LJ_TNIL[m
[31m-  |  jmp ->BC_TGETR2_Z[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  settp STR:RC, LJ_TSTR		// STR:RC = GCstr *[m
[31m-  |  mov TMP1, STR:RC[m
[31m-  |  lea RC, TMP1[m
[31m-  |  cmp PC_OP, BC_GSET[m
[31m-  |  jne >1[m
[31m-  |  settp TAB:RA, TAB:RB, LJ_TTAB	// TAB:RB = GCtab *[m
[31m-  |  lea RB, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[31m-  |  mov [RB], TAB:RA[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_tsetb:[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.if DUALNUM[m
[31m-  |  setint RC[m
[31m-  |  mov TMP1, RC[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RCd[m
[31m-  |  movsd TMP1, xmm0[m
[31m-  |.endif[m
[31m-  |  lea RC, TMP1[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  movzx RCd, PC_RC			// Reload TValue *k from RC.[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  movzx RBd, PC_RB			// Reload TValue *t from RB.[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-  |  mov CARG2, RB[m
[31m-  |  mov CARG3, RC[m
[31m-  |  mov L:RB, L:CARG1[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz >3[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov RB, [BASE+RA*8][m
[31m-  |  mov [RC], RB[m
[31m-  |->cont_nop:				// BASE = base, (RC = result)[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  mov [RA-24], PC			// [cont|PC][m
[31m-  |  movzx RCd, PC_RA[m
[31m-  |  // Copy value to third argument.[m
[31m-  |  mov RB, [BASE+RC*8][m
[31m-  |  mov [RA+16], RB[m
[31m-  |  lea PC, [RA+FRAME_CONT][m
[31m-  |  sub PC, BASE[m
[31m-  |  mov LFUNC:RB, [RA-16]		// Guaranteed to be a function here.[m
[31m-  |  mov NARGS:RDd, 3+1			// 3 args for func(t, k, v).[m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  jmp ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |.if X64WIN[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov CARG3d, RCd[m
[31m-  |  mov L:CARG1->base, BASE[m
[31m-  |  xchg CARG2, TAB:RB			// Caveat: CARG2 == BASE.[m
[31m-  |.else[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov CARG2, TAB:RB[m
[31m-  |  mov L:CARG1->base, BASE[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG3d, RCd			// Caveat: CARG3 == BASE.[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // TValue * returned in eax (RC).[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  jmp ->BC_TSETR_Z[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 == BASE.[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG3, [BASE+RD*8][m
[31m-  |  lea CARG2, [BASE+RA*8][m
[31m-  |.else[m
[31m-  |  lea CARG2, [BASE+RA*8][m
[31m-  |  lea CARG3, [BASE+RD*8][m
[31m-  |.endif[m
[31m-  |  mov CARG1, L:RB			// Caveat: CARG1/CARG4 == RA.[m
[31m-  |  movzx CARG4d, PC_OP[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_comp	// (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |3:[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  cmp RC, 1[m
[31m-  |  ja ->vmeta_binop[m
[31m-  |4:[m
[31m-  |  lea PC, [PC+4][m
[31m-  |  jb >6[m
[31m-  |5:[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  branchPC RD[m
[31m-  |6:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_condt:			// BASE = base, RC = result[m
[31m-  |  add PC, 4[m
[31m-  |  mov ITYPE, [RC][m
[31m-  |  sar ITYPE, 47[m
[31m-  |  cmp ITYPEd, LJ_TISTRUECOND		// Branch if result is true.[m
[31m-  |  jb <5[m
[31m-  |  jmp <6[m
[31m-  |[m
[31m-  |->cont_condf:			// BASE = base, RC = result[m
[31m-  |  mov ITYPE, [RC][m
[31m-  |  sar ITYPE, 47[m
[31m-  |  cmp ITYPEd, LJ_TISTRUECOND		// Branch if result is false.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  cleartp TAB:RD[m
[31m-  |  sub PC, 4[m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3, RD[m
[31m-  |  mov CARG4d, RBd[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2 == BASE.[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG1, L:RB			// Caveat: CARG1 == RA.[m
[31m-  |.else[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG4d, RBd			// Caveat: CARG4 == RA.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG3 == BASE.[m
[31m-  |  mov CARG3, RD[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_equal	// (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  sub PC, 4[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  mov CARG2d, dword [PC-4][m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_equal_cd	// (lua_State *L, BCIns ins)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-  |  mov CARG2d, RAd[m
[31m-  |  mov CARG3d, RDd[m
[31m-  |  mov L:CARG1, L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <6[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_vno:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RBd, PC_RB[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  lea RC, [KBASE+RC*8][m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_arith_nvo:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RBd, PC_RB[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  lea TMPR, [KBASE+RC*8][m
[31m-  |  lea RC, [BASE+RB*8][m
[31m-  |  mov RB, TMPR[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  lea RC, [BASE+RD*8][m
[31m-  |  mov RB, RC[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_arith_vvo:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RBd, PC_RB[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3, RB[m
[31m-  |  mov CARG4, RC[m
[31m-  |  movzx RCd, PC_OP[m
[31m-  |  mov ARG5d, RCd[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2 == BASE.[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG1, L:RB			// Caveat: CARG1 == RA.[m
[31m-  |.else[m
[31m-  |  movzx CARG5d, PC_OP[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG4, RC			// Caveat: CARG4 == RA.[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE		// Caveat: CARG3 == BASE.[m
[31m-  |  mov CARG3, RB[m
[31m-  |  mov L:RB, L:CARG1[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_arith	// (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = base, RC = new base, stack = cont/func/o1/o2[m
[31m-  |  mov RA, RC[m
[31m-  |  sub RC, BASE[m
[31m-  |  mov [RA-24], PC			// [cont|PC][m
[31m-  |  lea PC, [RC+FRAME_CONT][m
[31m-  |  mov NARGS:RDd, 2+1			// 2 args for func(o1, o2).[m
[31m-  |  jmp ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea CARG2, [BASE+RD*8]		// Caveat: CARG2 == BASE[m
[31m-  |  mov L:CARG1, L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |  // NULL (retry) or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-#if LJ_52[m
[31m-  |  test RC, RC[m
[31m-  |  jne ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  mov TAB:CARG1, [BASE+RD*8][m
[31m-  |  cleartp TAB:CARG1[m
[31m-  |  jmp ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  jmp ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call_ra:[m
[31m-  |  lea RA, [BASE+RA*8+16][m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs+1, PC = return[m
[31m-  |  mov TMP1d, NARGS:RDd		// Save RA, RC for us.[m
[31m-  |  mov RB, RA[m
[31m-  |.if X64WIN[m
[31m-  |  mov L:TMPR, SAVE_L[m
[31m-  |  mov L:TMPR->base, BASE		// Caveat: CARG2 is BASE.[m
[31m-  |  lea CARG2, [RA-16][m
[31m-  |  lea CARG3, [RA+NARGS:RD*8-8][m
[31m-  |  mov CARG1, L:TMPR			// Caveat: CARG1 is RA.[m
[31m-  |.else[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE		// Caveat: CARG3 is BASE.[m
[31m-  |  lea CARG2, [RA-16][m
[31m-  |  lea CARG3, [RA+NARGS:RD*8-8][m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  mov RA, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov NARGS:RDd, TMP1d[m
[31m-  |  mov LFUNC:RB, [RA-16][m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  add NARGS:RDd, 1[m
[31m-  |  // This is fragile. L->base must not move, KBASE must always be defined.[m
[31m-  |  cmp KBASE, BASE			// Continue with CALLT if flag set.[m
[31m-  |  je ->BC_CALLT_Z[m
[31m-  |  mov BASE, RA[m
[31m-  |  ins_call				// Otherwise call resolved metamethod.[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG2, RA			// Caveat: CARG2 == BASE[m
[31m-  |  mov L:CARG1, L:RB			// Caveat: CARG1 == RA[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RCd, [PC-4][m
[31m-  |  movzx RAd, RCH[m
[31m-  |  movzx OP, RCL[m
[31m-  |  shr RCd, 16[m
[31m-  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Retry FORI or JFORI.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmp NARGS:RDd, 1+1;  jb ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmp NARGS:RDd, 2+1;  jb ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name, op[m
[31m-  |  .ffunc_1 name[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  op xmm0, qword [BASE][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name[m
[31m-  |  .ffunc_n name, movsd[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name[m
[31m-  |  .ffunc_2 name[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  checknumtp [BASE+8], ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  movsd xmm1, qword [BASE+8][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses label 1.[m
[31m-  |.macro ffgccheck[m
[31m-  |  mov RB, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-  |  cmp RB, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-  |  jb >1[m
[31m-  |  call ->fff_gcstep[m
[31m-  |1:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  mov ITYPE, [BASE][m
[31m-  |  mov RB, ITYPE[m
[31m-  |  sar ITYPE, 47[m
[31m-  |  cmp ITYPEd, LJ_TISTRUECOND; jae ->fff_fallback[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov MULTRES, RDd[m
[31m-  |  mov RB, [BASE][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  sub RDd, 2[m
[31m-  |  jz >2[m
[31m-  |  mov RA, BASE[m
[31m-  |1:[m
[31m-  |  add RA, 8[m
[31m-  |  mov RB, [RA][m
[31m-  |  mov [RA-16], RB[m
[31m-  |  sub RDd, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  mov RDd, MULTRES[m
[31m-  |  jmp ->fff_res_[m
[31m-  |[m
[31m-  |.ffunc_1 type[m
[31m-  |  mov RC, [BASE][m
[31m-  |  sar RC, 47[m
[31m-  |  mov RBd, LJ_TISNUM[m
[31m-  |  cmp RCd, RBd[m
[31m-  |  cmovb RCd, RBd[m
[31m-  |  not RCd[m
[31m-  |2:[m
[31m-  |  mov CFUNC:RB, [BASE-16][m
[31m-  |  cleartp CFUNC:RB[m
[31m-  |  mov STR:RC, [CFUNC:RB+RC*8+((char *)(&((GCfuncC *)0)->upvalue))][m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  settp STR:RC, LJ_TSTR[m
[31m-  |  mov [BASE-16], STR:RC[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  checktab TAB:RB, >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  mov TAB:RB, TAB:RB->metatable[m
[31m-  |2:[m
[31m-  |  test TAB:RB, TAB:RB[m
[31m-  |  mov aword [BASE-16], LJ_TNIL[m
[31m-  |  jz ->fff_res1[m
[31m-  |  settp TAB:RC, TAB:RB, LJ_TTAB[m
[31m-  |  mov [BASE-16], TAB:RC		// Store metatable as default result.[m
[31m-  |  mov STR:RC, [DISPATCH+DISPATCH_GL(gcroot)+8*(GCROOT_MMNAME+MM_metatable)][m
[31m-  |  mov RAd, TAB:RB->hmask[m
[31m-  |  and RAd, STR:RC->hash[m
[31m-  |  settp STR:RC, LJ_TSTR[m
[31m-  |  imul RAd, #NODE[m
[31m-  |  add NODE:RA, TAB:RB->node[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  cmp NODE:RA->key, STR:RC[m
[31m-  |  je >5[m
[31m-  |4:[m
[31m-  |  mov NODE:RA, NODE:RA->next[m
[31m-  |  test NODE:RA, NODE:RA[m
[31m-  |  jnz <3[m
[31m-  |  jmp ->fff_res1			// Not found, keep default result.[m
[31m-  |5:[m
[31m-  |  mov RB, NODE:RA->val[m
[31m-  |  cmp RB, LJ_TNIL; je ->fff_res1	// Ditto for nil value.[m
[31m-  |  mov [BASE-16], RB			// Return value of mt.__metatable.[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  cmp ITYPEd, LJ_TUDATA; je <1[m
[31m-  |  cmp ITYPEd, LJ_TISNUM; ja >7[m
[31m-  |  mov ITYPEd, LJ_TISNUM[m
[31m-  |7:[m
[31m-  |  not ITYPEd[m
[31m-  |  mov TAB:RB, [DISPATCH+ITYPE*8+DISPATCH_GL(gcroot[GCROOT_BASEMT])][m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov TAB:TMPR, TAB:RB[m
[31m-  |  checktab TAB:RB, ->fff_fallback[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-  |  mov TAB:RA, [BASE+8][m
[31m-  |  checktab TAB:RA, ->fff_fallback[m
[31m-  |  mov TAB:RB->metatable, TAB:RA[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], TAB:TMPR			// Return original table.[m
[31m-  |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-  |  jz >1[m
[31m-  |  // Possible write barrier. Table is black, but skip iswhite(mt) check.[m
[31m-  |  barrierback TAB:RB, RC[m
[31m-  |1:[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_2 rawget[m
[31m-  |.if X64WIN[m
[31m-  |  mov TAB:RA, [BASE][m
[31m-  |  checktab TAB:RA, ->fff_fallback[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  lea CARG3, [BASE+8][m
[31m-  |  mov CARG2, TAB:RA			// Caveat: CARG2 == BASE.[m
[31m-  |  mov CARG1, SAVE_L[m
[31m-  |.else[m
[31m-  |  mov TAB:CARG2, [BASE][m
[31m-  |  checktab TAB:CARG2, ->fff_fallback[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  lea CARG3, [BASE+8]		// Caveat: CARG3 == BASE.[m
[31m-  |  mov CARG1, SAVE_L[m
[31m-  |.endif[m
[31m-  |  call extern lj_tab_get	// (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // cTValue * returned in eax (RD).[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  // Copy table slot.[m
[31m-  |  mov RB, [RD][m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback	// Exactly one argument.[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checknumber RB, ->fff_fallback[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  checktp_nc STR:RB, LJ_TSTR, >3[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |2:[m
[31m-  |  mov [BASE-16], STR:RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |3:  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  cmp ITYPEd, LJ_TISNUM;  ja ->fff_fallback_1[m
[31m-  |  cmp aword [DISPATCH+DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])], 0[m
[31m-  |  jne ->fff_fallback[m
[31m-  |  ffgccheck				// Caveat: uses label 1.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |.if not X64WIN[m
[31m-  |  mov CARG2, BASE			// Otherwise: CARG2 == BASE[m
[31m-  |.endif[m
[31m-  |  mov L:CARG1, L:RB[m
[31m-  |.if DUALNUM[m
[31m-  |  call extern lj_strfmt_number	// (lua_State *L, cTValue *o)[m
[31m-  |.else[m
[31m-  |  call extern lj_strfmt_num		// (lua_State *L, lua_Number *np)[m
[31m-  |.endif[m
[31m-  |  // GCstr returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  settp STR:RB, RD, LJ_TSTR[m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 next[m
[31m-  |  je >2				// Missing 2nd arg?[m
[31m-  |1:[m
[31m-  |.if X64WIN[m
[31m-  |  mov RA, [BASE][m
[31m-  |  checktab RA, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  mov CARG2, [BASE][m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[31m-  |  mov L:RB->top, BASE		// Dummy frame length is ok.[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG3, [BASE+8][m
[31m-  |  mov CARG2, RA			// Caveat: CARG2 == BASE.[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |.else[m
[31m-  |  lea CARG3, [BASE+8]		// Caveat: CARG3 == BASE.[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC			// Needed for ITERN fallback.[m
[31m-  |  call extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Flag returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RDd, RDd;  jz >3		// End of traversal?[m
[31m-  |  // Copy key and value to results.[m
[31m-  |  mov RB, [BASE+8][m
[31m-  |  mov RD, [BASE+16][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  mov [BASE-8], RD[m
[31m-  |->fff_res2:[m
[31m-  |  mov RDd, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |2:  // Set missing 2nd arg to nil.[m
[31m-  |  mov aword [BASE+8], LJ_TNIL[m
[31m-  |  jmp <1[m
[31m-  |3:  // End of traversal: return nil.[m
[31m-  |  mov aword [BASE-16], LJ_TNIL[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov TMPR, TAB:RB[m
[31m-  |  checktab TAB:RB, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CFUNC:RD, [BASE-16][m
[31m-  |  cleartp CFUNC:RD[m
[31m-  |  mov CFUNC:RD, CFUNC:RD->upvalue[0][m
[31m-  |  settp CFUNC:RD, LJ_TFUNC[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], CFUNC:RD[m
[31m-  |  mov [BASE-8], TMPR[m
[31m-  |  mov aword [BASE], LJ_TNIL[m
[31m-  |  mov RDd, 1+3[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_2 ipairs_aux[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  checktab TAB:RB, ->fff_fallback[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RA, [BASE+8][m
[31m-  |  checkint RA, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE+8], ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE+8][m
[31m-  |.endif[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |.if DUALNUM[m
[31m-  |  add RAd, 1[m
[31m-  |  setint ITYPE, RA[m
[31m-  |  mov [BASE-16], ITYPE[m
[31m-  |.else[m
[31m-  |  sseconst_1 xmm1, TMPR[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  cvttsd2si RAd, xmm0[m
[31m-  |  movsd qword [BASE-16], xmm0[m
[31m-  |.endif[m
[31m-  |  cmp RAd, TAB:RB->asize;  jae >2	// Not in array part?[m
[31m-  |  mov RD, TAB:RB->array[m
[31m-  |  lea RD, [RD+RA*8][m
[31m-  |1:[m
[31m-  |  cmp aword [RD], LJ_TNIL;  je ->fff_res0[m
[31m-  |  // Copy array slot.[m
[31m-  |  mov RB, [RD][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  jmp ->fff_res2[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  cmp dword TAB:RB->hmask, 0; je ->fff_res0[m
[31m-  |.if X64WIN[m
[31m-  |  mov TMPR, BASE[m
[31m-  |  mov CARG2d, RAd[m
[31m-  |  mov CARG1, TAB:RB[m
[31m-  |  mov RB, TMPR[m
[31m-  |.else[m
[31m-  |  mov CARG1, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG2d, RAd			// Caveat: CARG2 == BASE[m
[31m-  |.endif[m
[31m-  |  call extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // cTValue * or NULL returned in eax (RD).[m
[31m-  |  mov BASE, RB[m
[31m-  |  test RD, RD[m
[31m-  |  jnz <1[m
[31m-  |->fff_res0:[m
[31m-  |  mov RDd, 1+0[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov TMPR, TAB:RB[m
[31m-  |  checktab TAB:RB, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CFUNC:RD, [BASE-16][m
[31m-  |  cleartp CFUNC:RD[m
[31m-  |  mov CFUNC:RD, CFUNC:RD->upvalue[0][m
[31m-  |  settp CFUNC:RD, LJ_TFUNC[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], CFUNC:RD[m
[31m-  |  mov [BASE-8], TMPR[m
[31m-  |.if DUALNUM[m
[31m-  |  mov64 RD, ((int64_t)LJ_TISNUM<<47)[m
[31m-  |  mov [BASE], RD[m
[31m-  |.else[m
[31m-  |  mov qword [BASE], 0[m
[31m-  |.endif[m
[31m-  |  mov RDd, 1+3[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 pcall[m
[31m-  |  lea RA, [BASE+16][m
[31m-  |  sub NARGS:RDd, 1[m
[31m-  |  mov PCd, 16+FRAME_PCALL[m
[31m-  |1:[m
[31m-  |  movzx RBd, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  shr RB, HOOK_ACTIVE_SHIFT[m
[31m-  |  and RB, 1[m
[31m-  |  add PC, RB				// Remember active hook before pcall.[m
[31m-  |  // Note: this does a (harmless) copy of the function to the PC slot, too.[m
[31m-  |  mov KBASE, RD[m
[31m-  |2:[m
[31m-  |  mov RB, [RA+KBASE*8-24][m
[31m-  |  mov [RA+KBASE*8-16], RB[m
[31m-  |  sub KBASE, 1[m
[31m-  |  ja <2[m
[31m-  |  jmp ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc_2 xpcall[m
[31m-  |  mov LFUNC:RA, [BASE+8][m
[31m-  |  checktp_nc LFUNC:RA, LJ_TFUNC, ->fff_fallback[m
[31m-  |  mov LFUNC:RB, [BASE]		// Swap function and traceback.[m
[31m-  |  mov [BASE], LFUNC:RA[m
[31m-  |  mov [BASE+8], LFUNC:RB[m
[31m-  |  lea RA, [BASE+24][m
[31m-  |  sub NARGS:RDd, 2[m
[31m-  |  mov PCd, 24+FRAME_PCALL[m
[31m-  |  jmp <1[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  mov L:RB, [BASE][m
[31m-  |  cleartp L:RB[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  mov CFUNC:RB, [BASE-16][m
[31m-  |  cleartp CFUNC:RB[m
[31m-  |  mov L:RB, CFUNC:RB->upvalue[0].gcr[m
[31m-  |  cleartp L:RB[m
[31m-  |.endif[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  mov TMP1, L:RB[m
[31m-  |.if resume[m
[31m-  |  checktptp [BASE], LJ_TTHREAD, ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  cmp aword L:RB->cframe, 0; jne ->fff_fallback[m
[31m-  |  cmp byte L:RB->status, LUA_YIELD;  ja ->fff_fallback[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  je >1				// Status != LUA_YIELD (i.e. 0)?[m
[31m-  |  cmp RA, L:RB->base			// Check for presence of initial func.[m
[31m-  |  je ->fff_fallback[m
[31m-  |  mov PC, [RA-8]			// Move initial function up.[m
[31m-  |  mov [RA], PC[m
[31m-  |  add RA, 8[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  lea PC, [RA+NARGS:RD*8-16]		// Check stack space (-1-thread).[m
[31m-  |.else[m
[31m-  |  lea PC, [RA+NARGS:RD*8-8]		// Check stack space (-1).[m
[31m-  |.endif[m
[31m-  |  cmp PC, L:RB->maxstack; ja ->fff_fallback[m
[31m-  |  mov L:RB->top, PC[m
[31m-  |[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if resume[m
[31m-  |  add BASE, 8			// Keep resumed thread in stack for GC.[m
[31m-  |.endif[m
[31m-  |  mov L:RB->top, BASE[m
[31m-  |.if resume[m
[31m-  |  lea RB, [BASE+NARGS:RD*8-24]	// RB = end of source for stack move.[m
[31m-  |.else[m
[31m-  |  lea RB, [BASE+NARGS:RD*8-16]	// RB = end of source for stack move.[m
[31m-  |.endif[m
[31m-  |  sub RB, PC			// Relative to PC.[m
[31m-  |[m
[31m-  |  cmp PC, RA[m
[31m-  |  je >3[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |  mov RC, [PC+RB][m
[31m-  |  mov [PC-8], RC[m
[31m-  |  sub PC, 8[m
[31m-  |  cmp PC, RA[m
[31m-  |  jne <2[m
[31m-  |3:[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG1, TMP1[m
[31m-  |  call ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:PC, TMP1[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |[m
[31m-  |  cmp eax, LUA_YIELD[m
[31m-  |  ja >8[m
[31m-  |4:[m
[31m-  |  mov RA, L:PC->base[m
[31m-  |  mov KBASE, L:PC->top[m
[31m-  |  mov L:PC->top, RA			// Clear coroutine stack.[m
[31m-  |  mov PC, KBASE[m
[31m-  |  sub PC, RA[m
[31m-  |  je >6				// No results?[m
[31m-  |  lea RD, [BASE+PC][m
[31m-  |  shr PCd, 3[m
[31m-  |  cmp RD, L:RB->maxstack[m
[31m-  |  ja >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  mov RB, BASE[m
[31m-  |  sub RB, RA[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |  mov RD, [RA][m
[31m-  |  mov [RA+RB], RD[m
[31m-  |  add RA, 8[m
[31m-  |  cmp RA, KBASE[m
[31m-  |  jne <5[m
[31m-  |6:[m
[31m-  |.if resume[m
[31m-  |  lea RDd, [PCd+2]			// nresults+1 = 1 + true + results.[m
[31m-  |  mov_true ITYPE			// Prepend true to results.[m
[31m-  |  mov [BASE-8], ITYPE[m
[31m-  |.else[m
[31m-  |  lea RDd, [PCd+1]			// nresults+1 = 1 + results.[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |  mov PC, SAVE_PC[m
[31m-  |  mov MULTRES, RDd[m
[31m-  |.if resume[m
[31m-  |  mov RA, -8[m
[31m-  |.else[m
[31m-  |  xor RAd, RAd[m
[31m-  |.endif[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  mov_false ITYPE			// Prepend false to results.[m
[31m-  |  mov [BASE-8], ITYPE[m
[31m-  |  mov RA, L:PC->top[m
[31m-  |  sub RA, 8[m
[31m-  |  mov L:PC->top, RA			// Clear error from coroutine stack.[m
[31m-  |  // Copy error message.[m
[31m-  |  mov RD, [RA][m
[31m-  |  mov [BASE], RD[m
[31m-  |  mov RDd, 1+2			// nresults+1 = 1 + false + error.[m
[31m-  |  jmp <7[m
[31m-  |.else[m
[31m-  |  mov CARG2, L:PC[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |  // Error function does not return.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  mov L:RA, TMP1[m
[31m-  |  mov L:RA->top, KBASE		// Undo coroutine stack clearing.[m
[31m-  |  mov CARG2, PC[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov L:PC, TMP1[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <4				// Retry the stack move.[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  test aword L:RB->cframe, CFRAME_RESUME[m
[31m-  |  jz ->fff_fallback[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  xor RDd, RDd[m
[31m-  |  mov aword L:RB->cframe, RD[m
[31m-  |  mov al, LUA_YIELD[m
[31m-  |  mov byte L:RB->status, al[m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |  .ffunc_1 math_abs[m
[31m-  |  mov RB, [BASE][m
[31m-  |.if DUALNUM[m
[31m-  |  checkint RB, >3[m
[31m-  |  cmp RBd, 0; jns ->fff_resi[m
[31m-  |  neg RBd; js >2[m
[31m-  |->fff_resbit:[m
[31m-  |->fff_resi:[m
[31m-  |  setint RB[m
[31m-  |->fff_resRB:[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |2:[m
[31m-  |  mov64 RB, U64x(41e00000,00000000)  // 2^31.[m
[31m-  |  jmp ->fff_resRB[m
[31m-  |3:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknum RB, ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  shl RB, 1[m
[31m-  |  shr RB, 1[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_n math_sqrt, sqrtsd[m
[31m-  |->fff_resxmm0:[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  movsd qword [BASE-16], xmm0[m
[31m-  |  // fallthrough[m
[31m-  |[m
[31m-  |->fff_res1:[m
[31m-  |  mov RDd, 1+1[m
[31m-  |->fff_res:[m
[31m-  |  mov MULTRES, RDd[m
[31m-  |->fff_res_:[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jnz >7[m
[31m-  |5:[m
[31m-  |  cmp PC_RB, RDL			// More results expected?[m
[31m-  |  ja >6[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  neg RA[m
[31m-  |  lea BASE, [BASE+RA*8-16]		// base = base - (RA+2)*8[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  mov aword [BASE+RD*8-24], LJ_TNIL[m
[31m-  |  add RD, 1[m
[31m-  |  jmp <5[m
[31m-  |[m
[31m-  |7:  // Non-standard return case.[m
[31m-  |  mov RA, -16			// Results start at BASE+RA = BASE-16.[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |.macro math_round, func[m
[31m-  |  .ffunc math_ .. func[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checknumx RB, ->fff_resRB, je[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  call ->vm_ .. func .. _sse[m
[31m-  |.if DUALNUM[m
[31m-  |  cvttsd2si RBd, xmm0[m
[31m-  |  cmp RBd, 0x80000000[m
[31m-  |  jne ->fff_resi[m
[31m-  |  cvtsi2sd xmm1, RBd[m
[31m-  |  ucomisd xmm0, xmm1[m
[31m-  |  jp ->fff_resxmm0[m
[31m-  |  je ->fff_resi[m
[31m-  |.endif[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  cmp NARGS:RDd, 1+1; jne ->fff_fallback	// Exactly one argument.[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern log[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc_n math_ .. func[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern func[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern func[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.ffunc_2 math_ldexp[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  checknumtp [BASE+8], ->fff_fallback[m
[31m-  |  fld qword [BASE+8][m
[31m-  |  fld qword [BASE][m
[31m-  |  fscale[m
[31m-  |  fpop1[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  fstp qword [BASE-16][m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |  mov RB, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG2, TMP1		// Caveat: CARG2 == BASE[m
[31m-  |.else[m
[31m-  |  lea CARG1, TMP1[m
[31m-  |.endif[m
[31m-  |  call extern frexp[m
[31m-  |  mov BASE, RB[m
[31m-  |  mov RBd, TMP1d[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  movsd qword [BASE-16], xmm0[m
[31m-  |.if DUALNUM[m
[31m-  |  setint RB[m
[31m-  |  mov [BASE-8], RB[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm1, RBd[m
[31m-  |  movsd qword [BASE-8], xmm1[m
[31m-  |.endif[m
[31m-  |  mov RDd, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_n math_modf[m
[31m-  |  mov RB, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG2, [BASE-16]	// Caveat: CARG2 == BASE[m
[31m-  |.else[m
[31m-  |  lea CARG1, [BASE-16][m
[31m-  |.endif[m
[31m-  |  call extern modf[m
[31m-  |  mov BASE, RB[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |  mov RDd, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.macro math_minmax, name, cmovop, sseop[m
[31m-  |  .ffunc name[m
[31m-  |  mov RAd, 2[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checkint RB, >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  cmp RAd, RDd; jae ->fff_resRB[m
[31m-  |  mov TMPR, [BASE+RA*8-8][m
[31m-  |  checkint TMPR, >3[m
[31m-  |  cmp RBd, TMPRd[m
[31m-  |  cmovop RB, TMPR[m
[31m-  |  add RAd, 1[m
[31m-  |  jmp <1[m
[31m-  |3:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  // Convert intermediate result to number and continue below.[m
[31m-  |  cvtsi2sd xmm0, RBd[m
[31m-  |  jmp >6[m
[31m-  |4:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |5:  // Handle numbers or integers.[m
[31m-  |  cmp RAd, RDd; jae ->fff_resxmm0[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE+RA*8-8][m
[31m-  |  checknumx RB, >6, jb[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  cvtsi2sd xmm1, RBd[m
[31m-  |  jmp >7[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE+RA*8-8], ->fff_fallback[m
[31m-  |.endif[m
[31m-  |6:[m
[31m-  |  movsd xmm1, qword [BASE+RA*8-8][m
[31m-  |7:[m
[31m-  |  sseop xmm0, xmm1[m
[31m-  |  add RAd, 1[m
[31m-  |  jmp <5[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, cmovg, minsd[m
[31m-  |  math_minmax math_max, cmovl, maxsd[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback[m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  checkstr STR:RB, ->fff_fallback[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  cmp dword STR:RB->len, 1[m
[31m-  |  jb ->fff_res0			// Return no results for empty string.[m
[31m-  |  movzx RBd, byte STR:RB[1][m
[31m-  |.if DUALNUM[m
[31m-  |  jmp ->fff_resi[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RBd; jmp ->fff_resxmm0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback	// *Exactly* 1 arg.[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checkint RB, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  cvttsd2si RBd, qword [BASE][m
[31m-  |.endif[m
[31m-  |  cmp RBd, 255;  ja ->fff_fallback[m
[31m-  |  mov TMP1d, RBd[m
[31m-  |  mov TMPRd, 1[m
[31m-  |  lea RD, TMP1			// Points to stack. Little-endian.[m
[31m-  |->fff_newstr:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG3d, TMPRd			// Zero-extended to size_t.[m
[31m-  |  mov CARG2, RD[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // GCstr * returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  settp STR:RD, LJ_TSTR[m
[31m-  |  mov [BASE-16], STR:RD[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  mov TMPRd, -1[m
[31m-  |  cmp NARGS:RDd, 1+2;  jb ->fff_fallback[m
[31m-  |  jna >1[m
[31m-  |.if DUALNUM[m
[31m-  |  mov TMPR, [BASE+16][m
[31m-  |  checkint TMPR, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE+16], ->fff_fallback[m
[31m-  |  cvttsd2si TMPRd, qword [BASE+16][m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  checkstr STR:RB, ->fff_fallback[m
[31m-  |.if DUALNUM[m
[31m-  |  mov ITYPE, [BASE+8][m
[31m-  |  mov RAd, ITYPEd			// Must clear hiword for lea below.[m
[31m-  |  sar ITYPE, 47[m
[31m-  |  cmp ITYPEd, LJ_TISNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE+8], ->fff_fallback[m
[31m-  |  cvttsd2si RAd, qword [BASE+8][m
[31m-  |.endif[m
[31m-  |  mov RCd, STR:RB->len[m
[31m-  |  cmp RCd, TMPRd			// len < end? (unsigned compare)[m
[31m-  |  jb >5[m
[31m-  |2:[m
[31m-  |  test RAd, RAd			// start <= 0?[m
[31m-  |  jle >7[m
[31m-  |3:[m
[31m-  |  sub TMPRd, RAd			// start > end?[m
[31m-  |  jl ->fff_emptystr[m
[31m-  |  lea RD, [STR:RB+RAd+#STR-1][m
[31m-  |  add TMPRd, 1[m
[31m-  |4:[m
[31m-  |  jmp ->fff_newstr[m
[31m-  |[m
[31m-  |5:  // Negative end or overflow.[m
[31m-  |  jl >6[m
[31m-  |  lea TMPRd, [TMPRd+RCd+1]		// end = end+(len+1)[m
[31m-  |  jmp <2[m
[31m-  |6:  // Overflow.[m
[31m-  |  mov TMPRd, RCd			// end = len[m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |7:  // Negative start or underflow.[m
[31m-  |  je >8[m
[31m-  |  add RAd, RCd			// start = start+(len+1)[m
[31m-  |  add RAd, 1[m
[31m-  |  jg <3				// start > 0?[m
[31m-  |8:  // Underflow.[m
[31m-  |  mov RAd, 1				// start = 1[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->fff_emptystr:  // Range underflow.[m
[31m-  |  xor TMPRd, TMPRd			// Zero length. Any ptr in RD is ok.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc_1 string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |.if X64WIN[m
[31m-  |  mov STR:TMPR, [BASE][m
[31m-  |  checkstr STR:TMPR, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  mov STR:CARG2, [BASE][m
[31m-  |  checkstr STR:CARG2, ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |   lea SBUF:CARG1, [DISPATCH+DISPATCH_GL(tmpbuf)][m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  mov STR:CARG2, STR:TMPR		// Caveat: CARG2 == BASE[m
[31m-  |.endif[m
[31m-  |   mov RC, SBUF:CARG1->b[m
[31m-  |   mov SBUF:CARG1->L, L:RB[m
[31m-  |   mov SBUF:CARG1->p, RC[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_buf_putstr_ .. name[m
[31m-  |  mov CARG1, rax[m
[31m-  |  call extern lj_buf_tostr[m
[31m-  |  jmp ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name, kind, fdef[m
[31m-  |  fdef name[m
[31m-  |.if kind == 2[m
[31m-  |  sseconst_tobit xmm1, RB[m
[31m-  |.endif[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checkint RB, >1[m
[31m-  |.if kind > 0[m
[31m-  |  jmp >2[m
[31m-  |.else[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  movd xmm0, RB[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |.endif[m
[31m-  |.if kind < 2[m
[31m-  |  sseconst_tobit xmm1, RB[m
[31m-  |.endif[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  movd RBd, xmm0[m
[31m-  |2:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name, kind[m
[31m-  |  .ffunc_bit name, kind, .ffunc_1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit bit_tobit, 0[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name, 2[m
[31m-  |  mov TMPRd, NARGS:RDd		// Save for fallback.[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-16][m
[31m-  |1:[m
[31m-  |  cmp RD, BASE[m
[31m-  |  jbe ->fff_resbit[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RA, [RD][m
[31m-  |  checkint RA, >2[m
[31m-  |  ins RBd, RAd[m
[31m-  |  sub RD, 8[m
[31m-  |  jmp <1[m
[31m-  |2:[m
[31m-  |  ja ->fff_fallback_bit_op[m
[31m-  |  movd xmm0, RA[m
[31m-  |.else[m
[31m-  |  checknumtp [RD], ->fff_fallback_bit_op[m
[31m-  |  movsd xmm0, qword [RD][m
[31m-  |.endif[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  movd RAd, xmm0[m
[31m-  |  ins RBd, RAd[m
[31m-  |  sub RD, 8[m
[31m-  |  jmp <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op bit_band, and[m
[31m-  |.ffunc_bit_op bit_bor, or[m
[31m-  |.ffunc_bit_op bit_bxor, xor[m
[31m-  |[m
[31m-  |.ffunc_bit bit_bswap, 1[m
[31m-  |  bswap RBd[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |[m
[31m-  |.ffunc_bit bit_bnot, 1[m
[31m-  |  not RBd[m
[31m-  |.if DUALNUM[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.else[m
[31m-  |->fff_resbit:[m
[31m-  |  cvtsi2sd xmm0, RBd[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->fff_fallback_bit_op:[m
[31m-  |  mov NARGS:RDd, TMPRd		// Restore for fallback[m
[31m-  |  jmp ->fff_fallback[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_bit name, 1, .ffunc_2[m
[31m-  |  // Note: no inline conversion from number for 2nd argument![m
[31m-  |  mov RA, [BASE+8][m
[31m-  |  checkint RA, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  .ffunc_nn name[m
[31m-  |  sseconst_tobit xmm2, RB[m
[31m-  |  addsd xmm0, xmm2[m
[31m-  |  addsd xmm1, xmm2[m
[31m-  |  movd RBd, xmm0[m
[31m-  |  movd RAd, xmm1[m
[31m-  |.endif[m
[31m-  |  ins RBd, cl			// Assumes RA is ecx.[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh bit_lshift, shl[m
[31m-  |.ffunc_bit_sh bit_rshift, shr[m
[31m-  |.ffunc_bit_sh bit_arshift, sar[m
[31m-  |.ffunc_bit_sh bit_rol, rol[m
[31m-  |.ffunc_bit_sh bit_ror, ror[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback_2:[m
[31m-  |  mov NARGS:RDd, 1+2			// Other args are ignored, anyway.[m
[31m-  |  jmp ->fff_fallback[m
[31m-  |->fff_fallback_1:[m
[31m-  |  mov NARGS:RDd, 1+1			// Other args are ignored, anyway.[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RD = nargs+1[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov PC, [BASE-8]			// Fallback may overwrite PC.[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  lea RA, [RD+8*LUA_MINSTACK]	// Ensure enough space for handler.[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov CFUNC:RD, [BASE-16][m
[31m-  |  cleartp CFUNC:RD[m
[31m-  |  cmp RA, L:RB->maxstack[m
[31m-  |  ja >5				// Need to grow stack.[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call aword CFUNC:RD->f		// (lua_State *L)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |  test RDd, RDd; jg ->fff_res	// Returned nresults+1?[m
[31m-  |1:[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  sub RA, BASE[m
[31m-  |  shr RAd, 3[m
[31m-  |  test RDd, RDd[m
[31m-  |  lea NARGS:RDd, [RAd+1][m
[31m-  |  mov LFUNC:RB, [BASE-16][m
[31m-  |  jne ->vm_call_tail			// Returned -1?[m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  mov RA, BASE[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jnz >3[m
[31m-  |  movzx RBd, PC_RA[m
[31m-  |  neg RB[m
[31m-  |  lea BASE, [BASE+RB*8-16]		// base = base - (RB+2)*8[m
[31m-  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |3:[m
[31m-  |  mov RB, PC[m
[31m-  |  and RB, -8[m
[31m-  |  sub BASE, RB[m
[31m-  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  mov CARG2d, LUA_MINSTACK[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  xor RDd, RDd			// Simulate a return 0.[m
[31m-  |  jmp <1				// Dumb retry (goes through ff first).[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RD = nargs+1[m
[31m-  |  pop RB				// Must keep stack at same level.[m
[31m-  |  mov TMP1, RB			// Save return address[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  call extern lj_gc_step		// (lua_State *L)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  shr RDd, 3[m
[31m-  |  add NARGS:RDd, 1[m
[31m-  |  mov RB, TMP1[m
[31m-  |  push RB				// Restore return address.[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_VMEVENT		// No recording while in vmevent.[m
[31m-  |  jnz >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |  test RDL, HOOK_ACTIVE[m
[31m-  |  jnz >1[m
[31m-  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  jz >1[m
[31m-  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  jnz >5[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  jnz >5[m
[31m-  |[m
[31m-  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  jz >5[m
[31m-  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[31m-  |  jz >1[m
[31m-  |  test RDL, LUA_MASKLINE[m
[31m-  |  jz >5[m
[31m-  |1:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG2, PC			// Caveat: CARG2 == BASE[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  call extern lj_dispatch_ins	// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |4:[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |5:[m
[31m-  |  movzx OP, PC_OP[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Re-dispatch to static ins.[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  add PC, 4[m
[31m-  |  mov RA, [RB-40][m
[31m-  |  mov MULTRES, RAd			// Restore MULTRES for *M ins.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  mov LFUNC:RB, [BASE-16]		// Same as curr_topL(L).[m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  mov RB, LFUNC:RB->pc[m
[31m-  |  movzx RDd, byte [RB+PC2PROTO(framesize)][m
[31m-  |  lea RD, [BASE+RD*8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov CARG2, PC[m
[31m-  |  lea CARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_trace_hot		// (jit_State *J, const BCIns *pc)[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |.if JIT[m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  or PC, 1				// Marker for hot call.[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov CARG2, PC[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_dispatch_call	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // ASMFunction returned in eax/rax (RD).[m
[31m-  |  mov SAVE_PC, 0			// Invalidate for subsequent line hook.[m
[31m-  |.if JIT[m
[31m-  |  and PC, -2[m
[31m-  |.endif[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RA, RD[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  mov RB, RA[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  shr RDd, 3[m
[31m-  |  add NARGS:RDd, 1[m
[31m-  |  jmp RB[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // BASE = base, RC = result, RB = mbase[m
[31m-  |  mov TRACE:ITYPE, [RB-40]		// Save previous trace.[m
[31m-  |  cleartp TRACE:ITYPE[m
[31m-  |  mov TMPRd, MULTRES[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  lea RA, [BASE+RA*8]		// Call base.[m
[31m-  |  sub TMPRd, 1[m
[31m-  |  jz >2[m
[31m-  |1:  // Move results down.[m
[31m-  |  mov RB, [RC][m
[31m-  |  mov [RA], RB[m
[31m-  |  add RC, 8[m
[31m-  |  add RA, 8[m
[31m-  |  sub TMPRd, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  movzx RCd, PC_RA[m
[31m-  |  movzx RBd, PC_RB[m
[31m-  |  add RC, RB[m
[31m-  |  lea RC, [BASE+RC*8-8][m
[31m-  |3:[m
[31m-  |  cmp RC, RA[m
[31m-  |  ja >9				// More results wanted?[m
[31m-  |[m
[31m-  |  test TRACE:ITYPE, TRACE:ITYPE[m
[31m-  |  jz ->cont_nop[m
[31m-  |  movzx RBd, word TRACE:ITYPE->traceno[m
[31m-  |  movzx RDd, word TRACE:ITYPE->link[m
[31m-  |  cmp RDd, RBd[m
[31m-  |  je ->cont_nop			// Blacklisted.[m
[31m-  |  test RDd, RDd[m
[31m-  |  jne =>BC_JLOOP			// Jump to stitched trace.[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  mov [DISPATCH+DISPATCH_J(exitno)], RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG2, PC[m
[31m-  |  lea CARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB[m
[31m-  |  call extern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp ->cont_nop[m
[31m-  |[m
[31m-  |9:  // Fill up results with nil.[m
[31m-  |  mov aword [RA], LJ_TNIL[m
[31m-  |  add RA, 8[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG2, PC			// Caveat: CARG2 == BASE[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  sub PC, 4[m
[31m-  |  jmp ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Called from an exit stub with the exit number on the stack.[m
[31m-  |// The 16 bit exit number is stored with two (sign-extended) push imm8.[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |  push r13; push r12[m
[31m-  |  push r11; push r10; push r9; push r8[m
[31m-  |  push rdi; push rsi; push rbp; lea rbp, [rsp+88]; push rbp[m
[31m-  |  push rbx; push rdx; push rcx; push rax[m
[31m-  |  movzx RCd, byte [rbp-8]		// Reconstruct exit number.[m
[31m-  |  mov RCH, byte [rbp-16][m
[31m-  |  mov [rbp-8], r15; mov [rbp-16], r14[m
[31m-  |  // Caveat: DISPATCH is rbx.[m
[31m-  |  mov DISPATCH, [ebp][m
[31m-  |  mov RAd, [DISPATCH+DISPATCH_GL(vmstate)]	// Get trace number.[m
[31m-  |  set_vmstate EXIT[m
[31m-  |  mov [DISPATCH+DISPATCH_J(exitno)], RCd[m
[31m-  |  mov [DISPATCH+DISPATCH_J(parent)], RAd[m
[31m-  |.if X64WIN[m
[31m-  |  sub rsp, 16*8+4*8			// Room for SSE regs + save area.[m
[31m-  |.else[m
[31m-  |  sub rsp, 16*8			// Room for SSE regs.[m
[31m-  |.endif[m
[31m-  |  add rbp, -128[m
[31m-  |  movsd qword [rbp-8],   xmm15; movsd qword [rbp-16],  xmm14[m
[31m-  |  movsd qword [rbp-24],  xmm13; movsd qword [rbp-32],  xmm12[m
[31m-  |  movsd qword [rbp-40],  xmm11; movsd qword [rbp-48],  xmm10[m
[31m-  |  movsd qword [rbp-56],  xmm9;  movsd qword [rbp-64],  xmm8[m
[31m-  |  movsd qword [rbp-72],  xmm7;  movsd qword [rbp-80],  xmm6[m
[31m-  |  movsd qword [rbp-88],  xmm5;  movsd qword [rbp-96],  xmm4[m
[31m-  |  movsd qword [rbp-104], xmm3;  movsd qword [rbp-112], xmm2[m
[31m-  |  movsd qword [rbp-120], xmm1;  movsd qword [rbp-128], xmm0[m
[31m-  |  // Caveat: RB is rbp.[m
[31m-  |  mov L:RB, [DISPATCH+DISPATCH_GL(cur_L)][m
[31m-  |  mov BASE, [DISPATCH+DISPATCH_GL(jit_base)][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG2, [rsp+4*8][m
[31m-  |.else[m
[31m-  |  mov CARG2, rsp[m
[31m-  |.endif[m
[31m-  |  lea CARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[31m-  |  call extern lj_trace_exit		// (jit_State *J, ExitState *ex)[m
[31m-  |  // MULTRES or negated error code returned in eax (RD).[m
[31m-  |  mov RA, L:RB->cframe[m
[31m-  |  and RA, CFRAME_RAWMASK[m
[31m-  |  mov [RA+CFRAME_OFS_L], L:RB	// Set SAVE_L (on-trace resume/yield).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov PC, [RA+CFRAME_OFS_PC]	// Get SAVE_PC.[m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |  // RD = MULTRES or negated error code, BASE, PC and DISPATCH set.[m
[31m-  |.if JIT[m
[31m-  |  // Restore additional callee-save registers only used in compiled code.[m
[31m-  |.if X64WIN[m
[31m-  |  lea RA, [rsp+10*16+4*8][m
[31m-  |1:[m
[31m-  |  movdqa xmm15, [RA-10*16][m
[31m-  |  movdqa xmm14, [RA-9*16][m
[31m-  |  movdqa xmm13, [RA-8*16][m
[31m-  |  movdqa xmm12, [RA-7*16][m
[31m-  |  movdqa xmm11, [RA-6*16][m
[31m-  |  movdqa xmm10, [RA-5*16][m
[31m-  |  movdqa xmm9, [RA-4*16][m
[31m-  |  movdqa xmm8, [RA-3*16][m
[31m-  |  movdqa xmm7, [RA-2*16][m
[31m-  |  mov rsp, RA			// Reposition stack to C frame.[m
[31m-  |  movdqa xmm6, [RA-1*16][m
[31m-  |  mov r15, CSAVE_1[m
[31m-  |  mov r14, CSAVE_2[m
[31m-  |  mov r13, CSAVE_3[m
[31m-  |  mov r12, CSAVE_4[m
[31m-  |.else[m
[31m-  |  lea RA, [rsp+16][m
[31m-  |1:[m
[31m-  |  mov r13, [RA-8][m
[31m-  |  mov r12, [RA][m
[31m-  |  mov rsp, RA			// Reposition stack to C frame.[m
[31m-  |.endif[m
[31m-  |  test RDd, RDd; js >9		// Check for error from exit.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov MULTRES, RDd[m
[31m-  |  mov LFUNC:KBASE, [BASE-16][m
[31m-  |  cleartp LFUNC:KBASE[m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  mov RCd, [PC][m
[31m-  |  movzx RAd, RCH[m
[31m-  |  movzx OP, RCL[m
[31m-  |  add PC, 4[m
[31m-  |  shr RCd, 16[m
[31m-  |  cmp OP, BC_FUNCF			// Function header?[m
[31m-  |  jb >3[m
[31m-  |  cmp OP, BC_FUNCC+2			// Fast function?[m
[31m-  |  jae >4[m
[31m-  |2:[m
[31m-  |  mov RCd, MULTRES			// RC/RD holds nres+1.[m
[31m-  |3:[m
[31m-  |  jmp aword [DISPATCH+OP*8][m
[31m-  |[m
[31m-  |4:  // Check frame below fast function.[m
[31m-  |  mov RC, [BASE-8][m
[31m-  |  test RCd, FRAME_TYPE[m
[31m-  |  jnz <2				// Trace stitching continuation?[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  movzx RCd, byte [RC-3][m
[31m-  |  neg RC[m
[31m-  |  mov LFUNC:KBASE, [BASE+RC*8-32][m
[31m-  |  cleartp LFUNC:KBASE[m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  neg RD[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  mov CARG2, RD[m
[31m-  |  call extern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP value rounding. Called by math.floor/math.ceil fast functions[m
[31m-  |// and from JIT code. arg/ret is xmm0. xmm0-xmm3 and RD (eax) modified.[m
[31m-  |.macro vm_round, name, mode, cond[m
[31m-  |->name:[m
[31m-  |->name .. _sse:[m
[31m-  |  sseconst_abs xmm2, RD[m
[31m-  |  sseconst_2p52 xmm3, RD[m
[31m-  |  movaps xmm1, xmm0[m
[31m-  |  andpd xmm1, xmm2			// |x|[m
[31m-  |  ucomisd xmm3, xmm1			// No truncation if 2^52 <= |x|.[m
[31m-  |  jbe >1[m
[31m-  |  andnpd xmm2, xmm0			// Isolate sign bit.[m
[31m-  |.if mode == 2		// trunc(x)?[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[31m-  |  subsd xmm1, xmm3[m
[31m-  |  sseconst_1 xmm3, RD[m
[31m-  |  cmpsd xmm0, xmm1, 1		// |x| < result?[m
[31m-  |  andpd xmm0, xmm3[m
[31m-  |  subsd xmm1, xmm0			// If yes, subtract -1.[m
[31m-  |  orpd xmm1, xmm2			// Merge sign bit back in.[m
[31m-  |.else[m
[31m-  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[31m-  |  subsd xmm1, xmm3[m
[31m-  |  orpd xmm1, xmm2			// Merge sign bit back in.[m
[31m-  |  .if mode == 1		// ceil(x)?[m
[31m-  |    sseconst_m1 xmm2, RD		// Must subtract -1 to preserve -0.[m
[31m-  |    cmpsd xmm0, xmm1, 6		// x > result?[m
[31m-  |  .else			// floor(x)?[m
[31m-  |    sseconst_1 xmm2, RD[m
[31m-  |    cmpsd xmm0, xmm1, 1		// x < result?[m
[31m-  |  .endif[m
[31m-  |  andpd xmm0, xmm2[m
[31m-  |  subsd xmm1, xmm0			// If yes, subtract +-1.[m
[31m-  |.endif[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |1:[m
[31m-  |  ret[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  vm_round vm_floor, 0, 1[m
[31m-  |  vm_round vm_ceil,  1, JIT[m
[31m-  |  vm_round vm_trunc, 2, JIT[m
[31m-  |[m
[31m-  |// FP modulo x%y. Called by BC_MOD* and vm_arith.[m
[31m-  |->vm_mod:[m
[31m-  |// Args in xmm0/xmm1, return value in xmm0.[m
[31m-  |// Caveat: xmm0-xmm5 and RC (eax) modified![m
[31m-  |  movaps xmm5, xmm0[m
[31m-  |  divsd xmm0, xmm1[m
[31m-  |  sseconst_abs xmm2, RD[m
[31m-  |  sseconst_2p52 xmm3, RD[m
[31m-  |  movaps xmm4, xmm0[m
[31m-  |  andpd xmm4, xmm2			// |x/y|[m
[31m-  |  ucomisd xmm3, xmm4			// No truncation if 2^52 <= |x/y|.[m
[31m-  |  jbe >1[m
[31m-  |  andnpd xmm2, xmm0			// Isolate sign bit.[m
[31m-  |  addsd xmm4, xmm3			// (|x/y| + 2^52) - 2^52[m
[31m-  |  subsd xmm4, xmm3[m
[31m-  |  orpd xmm4, xmm2			// Merge sign bit back in.[m
[31m-  |  sseconst_1 xmm2, RD[m
[31m-  |  cmpsd xmm0, xmm4, 1		// x/y < result?[m
[31m-  |  andpd xmm0, xmm2[m
[31m-  |  subsd xmm4, xmm0			// If yes, subtract 1.0.[m
[31m-  |  movaps xmm0, xmm5[m
[31m-  |  mulsd xmm1, xmm4[m
[31m-  |  subsd xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |1:[m
[31m-  |  mulsd xmm1, xmm0[m
[31m-  |  movaps xmm0, xmm5[m
[31m-  |  subsd xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |// Args in xmm0/eax. Ret in xmm0. xmm0-xmm1 and eax modified.[m
[31m-  |->vm_powi_sse:[m
[31m-  |  cmp eax, 1; jle >6			// i<=1?[m
[31m-  |  // Now 1 < (unsigned)i <= 0x80000000.[m
[31m-  |1:  // Handle leading zeros.[m
[31m-  |  test eax, 1; jnz >2[m
[31m-  |  mulsd xmm0, xmm0[m
[31m-  |  shr eax, 1[m
[31m-  |  jmp <1[m
[31m-  |2:[m
[31m-  |  shr eax, 1; jz >5[m
[31m-  |  movaps xmm1, xmm0[m
[31m-  |3:  // Handle trailing bits.[m
[31m-  |  mulsd xmm0, xmm0[m
[31m-  |  shr eax, 1; jz >4[m
[31m-  |  jnc <3[m
[31m-  |  mulsd xmm1, xmm0[m
[31m-  |  jmp <3[m
[31m-  |4:[m
[31m-  |  mulsd xmm0, xmm1[m
[31m-  |5:[m
[31m-  |  ret[m
[31m-  |6:[m
[31m-  |  je <5				// x^1 ==> x[m
[31m-  |  jb >7				// x^0 ==> 1[m
[31m-  |  neg eax[m
[31m-  |  call <1[m
[31m-  |  sseconst_1 xmm1, RD[m
[31m-  |  divsd xmm1, xmm0[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |7:[m
[31m-  |  sseconst_1 xmm0, RD[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// int lj_vm_cpuid(uint32_t f, uint32_t res[4])[m
[31m-  |->vm_cpuid:[m
[31m-  |  mov eax, CARG1d[m
[31m-  |  .if X64WIN; push rsi; mov rsi, CARG2; .endif[m
[31m-  |  push rbx[m
[31m-  |  xor ecx, ecx[m
[31m-  |  cpuid[m
[31m-  |  mov [rsi], eax[m
[31m-  |  mov [rsi+4], ebx[m
[31m-  |  mov [rsi+8], ecx[m
[31m-  |  mov [rsi+12], edx[m
[31m-  |  pop rbx[m
[31m-  |  .if X64WIN; pop rsi; .endif[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Assertions ---------------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->assert_bad_for_arg_type:[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  |  int3[m
[31m-#endif[m
[31m-  |  int3[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions. Callback slot number in ah/al.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  saveregs_	// ebp/rbp already saved. ebp now holds global_State *.[m
[31m-  |  lea DISPATCH, [ebp+GG_G2DISP][m
[31m-  |  mov CTSTATE, GL:ebp->ctype_state[m
[31m-  |  movzx eax, ax[m
[31m-  |  mov CTSTATE->cb.slot, eax[m
[31m-  |  mov CTSTATE->cb.gpr[0], CARG1[m
[31m-  |  mov CTSTATE->cb.gpr[1], CARG2[m
[31m-  |  mov CTSTATE->cb.gpr[2], CARG3[m
[31m-  |  mov CTSTATE->cb.gpr[3], CARG4[m
[31m-  |  movsd qword CTSTATE->cb.fpr[0], xmm0[m
[31m-  |  movsd qword CTSTATE->cb.fpr[1], xmm1[m
[31m-  |  movsd qword CTSTATE->cb.fpr[2], xmm2[m
[31m-  |  movsd qword CTSTATE->cb.fpr[3], xmm3[m
[31m-  |.if X64WIN[m
[31m-  |  lea rax, [rsp+CFRAME_SIZE+4*8][m
[31m-  |.else[m
[31m-  |  lea rax, [rsp+CFRAME_SIZE][m
[31m-  |  mov CTSTATE->cb.gpr[4], CARG5[m
[31m-  |  mov CTSTATE->cb.gpr[5], CARG6[m
[31m-  |  movsd qword CTSTATE->cb.fpr[4], xmm4[m
[31m-  |  movsd qword CTSTATE->cb.fpr[5], xmm5[m
[31m-  |  movsd qword CTSTATE->cb.fpr[6], xmm6[m
[31m-  |  movsd qword CTSTATE->cb.fpr[7], xmm7[m
[31m-  |.endif[m
[31m-  |  mov CTSTATE->cb.stack, rax[m
[31m-  |  mov CARG2, rsp[m
[31m-  |  mov SAVE_PC, CTSTATE		// Any value outside of bytecode is ok.[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |  call extern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |  // lua_State * returned in eax (RD).[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov BASE, L:RD->base[m
[31m-  |  mov RD, L:RD->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  mov LFUNC:RB, [BASE-16][m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  shr RD, 3[m
[31m-  |  add RD, 1[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  mov L:RA, SAVE_L[m
[31m-  |  mov CTSTATE, [DISPATCH+DISPATCH_GL(ctype_state)][m
[31m-  |  mov aword CTSTATE->L, L:RA[m
[31m-  |  mov L:RA->base, BASE[m
[31m-  |  mov L:RA->top, RB[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |  mov CARG2, RC[m
[31m-  |  call extern lj_ccallback_leave	// (CTState *cts, TValue *o)[m
[31m-  |  mov rax, CTSTATE->cb.gpr[0][m
[31m-  |  movsd xmm0, qword CTSTATE->cb.fpr[0][m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, rbx[m
[31m-  |  push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1[m
[31m-  |[m
[31m-  |  // Readjust stack.[m
[31m-  |  mov eax, CCSTATE->spadj[m
[31m-  |  sub rsp, rax[m
[31m-  |[m
[31m-  |  // Copy stack slots.[m
[31m-  |  movzx ecx, byte CCSTATE->nsp[m
[31m-  |  sub ecx, 1[m
[31m-  |  js >2[m
[31m-  |1:[m
[31m-  |  mov rax, [CCSTATE+rcx*8+offsetof(CCallState, stack)][m
[31m-  |  mov [rsp+rcx*8+CCALL_SPS_EXTRA*8], rax[m
[31m-  |  sub ecx, 1[m
[31m-  |  jns <1[m
[31m-  |2:[m
[31m-  |[m
[31m-  |  movzx eax, byte CCSTATE->nfpr[m
[31m-  |  mov CARG1, CCSTATE->gpr[0][m
[31m-  |  mov CARG2, CCSTATE->gpr[1][m
[31m-  |  mov CARG3, CCSTATE->gpr[2][m
[31m-  |  mov CARG4, CCSTATE->gpr[3][m
[31m-  |.if not X64WIN[m
[31m-  |  mov CARG5, CCSTATE->gpr[4][m
[31m-  |  mov CARG6, CCSTATE->gpr[5][m
[31m-  |.endif[m
[31m-  |  test eax, eax; jz >5[m
[31m-  |  movaps xmm0, CCSTATE->fpr[0][m
[31m-  |  movaps xmm1, CCSTATE->fpr[1][m
[31m-  |  movaps xmm2, CCSTATE->fpr[2][m
[31m-  |  movaps xmm3, CCSTATE->fpr[3][m
[31m-  |.if not X64WIN[m
[31m-  |  cmp eax, 4; jbe >5[m
[31m-  |  movaps xmm4, CCSTATE->fpr[4][m
[31m-  |  movaps xmm5, CCSTATE->fpr[5][m
[31m-  |  movaps xmm6, CCSTATE->fpr[6][m
[31m-  |  movaps xmm7, CCSTATE->fpr[7][m
[31m-  |.endif[m
[31m-  |5:[m
[31m-  |[m
[31m-  |  call aword CCSTATE->func[m
[31m-  |[m
[31m-  |  mov CCSTATE->gpr[0], rax[m
[31m-  |  movaps CCSTATE->fpr[0], xmm0[m
[31m-  |.if not X64WIN[m
[31m-  |  mov CCSTATE->gpr[1], rdx[m
[31m-  |  movaps CCSTATE->fpr[1], xmm1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  mov rbx, [rbp-8]; leave; ret[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |// Note: aligning all instructions does not pay off.[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  |.macro jmp_comp, lt, ge, le, gt, target[m
[31m-  ||switch (op) {[m
[31m-  ||case BC_ISLT:[m
[31m-  |   lt target[m
[31m-  ||break;[m
[31m-  ||case BC_ISGE:[m
[31m-  |   ge target[m
[31m-  ||break;[m
[31m-  ||case BC_ISLE:[m
[31m-  |   le target[m
[31m-  ||break;[m
[31m-  ||case BC_ISGT:[m
[31m-  |   gt target[m
[31m-  ||break;[m
[31m-  ||default: break;  /* Shut up GCC. */[m
[31m-  ||}[m
[31m-  |.endmacro[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1, RD = src2, JMP with RD = target[m
[31m-    |  ins_AD[m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  mov RA, ITYPE[m
[31m-    |  mov RD, RB[m
[31m-    |  sar ITYPE, 47[m
[31m-    |  sar RB, 47[m
[31m-    |.if DUALNUM[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jne >7[m
[31m-    |  cmp RBd, LJ_TISNUM; jne >8[m
[31m-    |  add PC, 4[m
[31m-    |  cmp RAd, RDd[m
[31m-    |  jmp_comp jge, jl, jg, jle, >9[m
[31m-    |6:[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  ja ->vmeta_comp[m
[31m-    |  // RA is a number.[m
[31m-    |  cmp RBd, LJ_TISNUM; jb >1; jne ->vmeta_comp[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  cvtsi2sd xmm0, RDd[m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RA is an integer, RD is not an integer.[m
[31m-    |  ja ->vmeta_comp[m
[31m-    |  // RA is an integer, RD is a number.[m
[31m-    |  cvtsi2sd xmm1, RAd[m
[31m-    |  movd xmm0, RD[m
[31m-    |  jmp >3[m
[31m-    |.else[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jae ->vmeta_comp[m
[31m-    |  cmp RBd, LJ_TISNUM; jae ->vmeta_comp[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movd xmm0, RD[m
[31m-    |2:[m
[31m-    |  movd xmm1, RA[m
[31m-    |3:[m
[31m-    |  add PC, 4[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  // Unordered: all of ZF CF PF set, ordered: PF clear.[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp_comp jbe, ja, jb, jae, <9[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |  jmp_comp jbe, ja, jb, jae, >1[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  ins_AD	// RA = src1, RD = src2, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  add PC, 4[m
[31m-    |  mov RD, RB[m
[31m-    |  mov RA, ITYPE[m
[31m-    |  sar RB, 47[m
[31m-    |  sar ITYPE, 47[m
[31m-    |.if DUALNUM[m
[31m-    |  cmp RBd, LJ_TISNUM; jne >7[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jne >8[m
[31m-    |  cmp RDd, RAd[m
[31m-    if (vk) {[m
[31m-      |  jne >9[m
[31m-    } else {[m
[31m-      |  je >9[m
[31m-    }[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RD is not an integer.[m
[31m-    |  ja >5[m
[31m-    |  // RD is a number.[m
[31m-    |  movd xmm1, RD[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jb >1; jne >5[m
[31m-    |  // RD is a number, RA is an integer.[m
[31m-    |  cvtsi2sd xmm0, RAd[m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RD is an integer, RA is not an integer.[m
[31m-    |  ja >5[m
[31m-    |  // RD is an integer, RA is a number.[m
[31m-    |  cvtsi2sd xmm1, RDd[m
[31m-    |  jmp >1[m
[31m-    |[m
[31m-    |.else[m
[31m-    |  cmp RBd, LJ_TISNUM; jae >5[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jae >5[m
[31m-    |  movd xmm1, RD[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movd xmm0, RA[m
[31m-    |2:[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |4:[m
[31m-  iseqne_fp:[m
[31m-    if (vk) {[m
[31m-      |  jp >2				// Unordered means not equal.[m
[31m-      |  jne >2[m
[31m-    } else {[m
[31m-      |  jp >2				// Unordered means not equal.[m
[31m-      |  je >1[m
[31m-    }[m
[31m-  iseqne_end:[m
[31m-    if (vk) {[m
[31m-      |1:				// EQ: Branch to the target.[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:				// NE: Fallthrough to next instruction.[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-      |2:				// NE: Branch to the target.[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |1:				// EQ: Fallthrough to next instruction.[m
[31m-    }[m
[31m-    if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||[m
[31m-		       op == BC_ISEQN || op == BC_ISNEN)) {[m
[31m-      |  jmp <9[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    if (op == BC_ISEQV || op == BC_ISNEV) {[m
[31m-      |5:  // Either or both types are not numbers.[m
[31m-      |.if FFI[m
[31m-      |  cmp RBd, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |  cmp ITYPEd, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |.endif[m
[31m-      |  cmp RA, RD[m
[31m-      |  je <1				// Same GCobjs or pvalues?[m
[31m-      |  cmp RBd, ITYPEd[m
[31m-      |  jne <2				// Not the same type?[m
[31m-      |  cmp RBd, LJ_TISTABUD[m
[31m-      |  ja <2				// Different objects and not table/ud?[m
[31m-      |[m
[31m-      |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-      |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-      |  cleartp TAB:RA[m
[31m-      |  mov TAB:RB, TAB:RA->metatable[m
[31m-      |  test TAB:RB, TAB:RB[m
[31m-      |  jz <2				// No metatable?[m
[31m-      |  test byte TAB:RB->nomm, 1<<MM_eq[m
[31m-      |  jnz <2				// Or 'no __eq' flag set?[m
[31m-      if (vk) {[m
[31m-	|  xor RBd, RBd			// ne = 0[m
[31m-      } else {[m
[31m-	|  mov RBd, 1			// ne = 1[m
[31m-      }[m
[31m-      |  jmp ->vmeta_equal		// Handle __eq metamethod.[m
[31m-    } else {[m
[31m-      |.if FFI[m
[31m-      |3:[m
[31m-      |  cmp ITYPEd, LJ_TCDATA[m
[31m-      if (LJ_DUALNUM && vk) {[m
[31m-	|  jne <9[m
[31m-      } else {[m
[31m-	|  jne <2[m
[31m-      }[m
[31m-      |  jmp ->vmeta_equal_cd[m
[31m-      |.endif[m
[31m-    }[m
[31m-    break;[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  ins_AND	// RA = src, RD = str const, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  add PC, 4[m
[31m-    |  checkstr RB, >3[m
[31m-    |  cmp RB, [KBASE+RD*8][m
[31m-  iseqne_test:[m
[31m-    if (vk) {[m
[31m-      |  jne >2[m
[31m-    } else {[m
[31m-      |  je >1[m
[31m-    }[m
[31m-    goto iseqne_end;[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  ins_AD	// RA = src, RD = num const, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  add PC, 4[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RB, >7[m
[31m-    |  mov RD, [KBASE+RD*8][m
[31m-    |  checkint RD, >8[m
[31m-    |  cmp RBd, RDd[m
[31m-    if (vk) {[m
[31m-      |  jne >9[m
[31m-    } else {[m
[31m-      |  je >9[m
[31m-    }[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  ja >3[m
[31m-    |  // RA is a number.[m
[31m-    |  mov RD, [KBASE+RD*8][m
[31m-    |  checkint RD, >1[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  cvtsi2sd xmm0, RDd[m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RA is an integer, RD is a number.[m
[31m-    |  cvtsi2sd xmm0, RBd[m
[31m-    |  movd xmm1, RD[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jmp >4[m
[31m-    |1:[m
[31m-    |  movd xmm0, RD[m
[31m-    |.else[m
[31m-    |  checknum RB, >3[m
[31m-    |1:[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |.endif[m
[31m-    |2:[m
[31m-    |  ucomisd xmm0, qword [BASE+RA*8][m
[31m-    |4:[m
[31m-    goto iseqne_fp;[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  ins_AND	// RA = src, RD = primitive type (~), JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  sar RB, 47[m
[31m-    |  add PC, 4[m
[31m-    |  cmp RBd, RDd[m
[31m-    if (!LJ_HASFFI) goto iseqne_test;[m
[31m-    if (vk) {[m
[31m-      |  jne >3[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:[m
[31m-      |  ins_next[m
[31m-      |3:[m
[31m-      |  cmp RBd, LJ_TCDATA; jne <2[m
[31m-      |  jmp ->vmeta_equal_cd[m
[31m-    } else {[m
[31m-      |  je >2[m
[31m-      |  cmp RBd, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  ins_AD	// RA = dst or unused, RD = src, JMP with RD = target[m
[31m-    |  mov ITYPE, [BASE+RD*8][m
[31m-    |  add PC, 4[m
[31m-    if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-      |  mov RB, ITYPE[m
[31m-    }[m
[31m-    |  sar ITYPE, 47[m
[31m-    |  cmp ITYPEd, LJ_TISTRUECOND[m
[31m-    if (op == BC_IST || op == BC_ISTC) {[m
[31m-      |  jae >1[m
[31m-    } else {[m
[31m-      |  jb >1[m
[31m-    }[m
[31m-    if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-      |  mov [BASE+RA*8], RB[m
[31m-    }[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |1:					// Fallthrough to the next instruction.[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  ins_AD	// RA = src, RD = -type[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  sar RB, 47[m
[31m-    |  add RBd, RDd[m
[31m-    |  jne ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  ins_AD	// RA = src, RD = -(TISNUM-1)[m
[31m-    |  checknumtp [BASE+RA*8], ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  sar RB, 47[m
[31m-    |  mov RCd, 2[m
[31m-    |  cmp RB, LJ_TISTRUECOND[m
[31m-    |  sbb RCd, 0[m
[31m-    |  shl RC, 47[m
[31m-    |  not RC[m
[31m-    |  mov [BASE+RA*8], RC[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RB, >5[m
[31m-    |  neg RBd[m
[31m-    |  jo >4[m
[31m-    |  setint RB[m
[31m-    |9:[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  ins_next[m
[31m-    |4:[m
[31m-    |  mov64 RB, U64x(41e00000,00000000)  // 2^31.[m
[31m-    |  jmp <9[m
[31m-    |5:[m
[31m-    |  ja ->vmeta_unm[m
[31m-    |.else[m
[31m-    |  checknum RB, ->vmeta_unm[m
[31m-    |.endif[m
[31m-    |  mov64 RD, U64x(80000000,00000000)[m
[31m-    |  xor RB, RD[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp <9[m
[31m-    |.else[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  mov RD, [BASE+RD*8][m
[31m-    |  checkstr RD, >2[m
[31m-    |.if DUALNUM[m
[31m-    |  mov RDd, dword STR:RD->len[m
[31m-    |1:[m
[31m-    |  setint RD[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |.else[m
[31m-    |  xorps xmm0, xmm0[m
[31m-    |  cvtsi2sd xmm0, dword STR:RD->len[m
[31m-    |1:[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |2:[m
[31m-    |  cmp ITYPEd, LJ_TTAB; jne ->vmeta_len[m
[31m-    |  mov TAB:CARG1, TAB:RD[m
[31m-#if LJ_52[m
[31m-    |  mov TAB:RB, TAB:RD->metatable[m
[31m-    |  cmp TAB:RB, 0[m
[31m-    |  jnz >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  mov RB, BASE			// Save BASE.[m
[31m-    |  call extern lj_tab_len		// (GCtab *t)[m
[31m-    |  // Length of table returned in eax (RD).[m
[31m-    |.if DUALNUM[m
[31m-    |  // Nothing to do.[m
[31m-    |.else[m
[31m-    |  cvtsi2sd xmm0, RDd[m
[31m-    |.endif[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  jmp <1[m
[31m-#if LJ_52[m
[31m-    |9:  // Check for __len.[m
[31m-    |  test byte TAB:RB->nomm, 1<<MM_len[m
[31m-    |  jnz <3[m
[31m-    |  jmp ->vmeta_len			// 'no __len' flag NOT set: check.[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithpre, sseins, ssereg[m
[31m-    |  ins_ABC[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   checknumtp [BASE+RB*8], ->vmeta_arith_vn[m
[31m-    |   .if DUALNUM[m
[31m-    |     checknumtp [KBASE+RC*8], ->vmeta_arith_vn[m
[31m-    |   .endif[m
[31m-    |   movsd xmm0, qword [BASE+RB*8][m
[31m-    |   sseins ssereg, qword [KBASE+RC*8][m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   checknumtp [BASE+RB*8], ->vmeta_arith_nv[m
[31m-    |   .if DUALNUM[m
[31m-    |     checknumtp [KBASE+RC*8], ->vmeta_arith_nv[m
[31m-    |   .endif[m
[31m-    |   movsd xmm0, qword [KBASE+RC*8][m
[31m-    |   sseins ssereg, qword [BASE+RB*8][m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   checknumtp [BASE+RB*8], ->vmeta_arith_vv[m
[31m-    |   checknumtp [BASE+RC*8], ->vmeta_arith_vv[m
[31m-    |   movsd xmm0, qword [BASE+RB*8][m
[31m-    |   sseins ssereg, qword [BASE+RC*8][m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins[m
[31m-    |  ins_ABC[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   mov RC, [KBASE+RC*8][m
[31m-    |   checkint RB, ->vmeta_arith_vno[m
[31m-    |   checkint RC, ->vmeta_arith_vno[m
[31m-    |   intins RBd, RCd; jo ->vmeta_arith_vno[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   mov RC, [KBASE+RC*8][m
[31m-    |   checkint RB, ->vmeta_arith_nvo[m
[31m-    |   checkint RC, ->vmeta_arith_nvo[m
[31m-    |   intins RCd, RBd; jo ->vmeta_arith_nvo[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   mov RC, [BASE+RC*8][m
[31m-    |   checkint RB, ->vmeta_arith_vvo[m
[31m-    |   checkint RC, ->vmeta_arith_vvo[m
[31m-    |   intins RBd, RCd; jo ->vmeta_arith_vvo[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    ||if (vk == 1) {[m
[31m-    |   setint RC[m
[31m-    |   mov [BASE+RA*8], RC[m
[31m-    ||} else {[m
[31m-    |   setint RB[m
[31m-    |   mov [BASE+RA*8], RB[m
[31m-    ||}[m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpost[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, sseins[m
[31m-    |  ins_arithpre sseins, xmm0[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, intins, sseins[m
[31m-    |.if DUALNUM[m
[31m-    |  ins_arithdn intins[m
[31m-    |.else[m
[31m-    |  ins_arith, sseins[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-[m
[31m-    |  // RA = dst, RB = src1 or num const, RC = src2 or num const[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arith add, addsd[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arith sub, subsd[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arith imul, mulsd[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arith divsd[m
[31m-    break;[m
[31m-  case BC_MODVN:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |->BC_MODVN_Z:[m
[31m-    |  call ->vm_mod[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |  jmp ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |  mov RB, BASE[m
[31m-    |  call extern pow[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  mov BASE, RB[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  ins_ABC	// RA = dst, RB = src_start, RC = src_end[m
[31m-    |  mov L:CARG1, SAVE_L[m
[31m-    |  mov L:CARG1->base, BASE[m
[31m-    |  lea CARG2, [BASE+RC*8][m
[31m-    |  mov CARG3d, RCd[m
[31m-    |  sub CARG3d, RBd[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  mov L:RB, L:CARG1[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  test RC, RC[m
[31m-    |  jnz ->vmeta_binop[m
[31m-    |  movzx RBd, PC_RB			// Copy result to Stk[RA] from Stk[RB].[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  mov RC, [BASE+RB*8][m
[31m-    |  mov [BASE+RA*8], RC[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  ins_AND	// RA = dst, RD = str const (~)[m
[31m-    |  mov RD, [KBASE+RD*8][m
[31m-    |  settp RD, LJ_TSTR[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  ins_AND	// RA = dst, RD = cdata const (~)[m
[31m-    |  mov RD, [KBASE+RD*8][m
[31m-    |  settp RD, LJ_TCDATA[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  ins_AD	// RA = dst, RD = signed int16 literal[m
[31m-    |.if DUALNUM[m
[31m-    |  movsx RDd, RDW[m
[31m-    |  setint RD[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |.else[m
[31m-    |  movsx RDd, RDW			// Sign-extend literal.[m
[31m-    |  cvtsi2sd xmm0, RDd[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  ins_AD	// RA = dst, RD = num const[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  ins_AD	// RA = dst, RD = primitive type (~)[m
[31m-    |  shl RD, 47[m
[31m-    |  not RD[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  ins_AD	// RA = dst_start, RD = dst_end[m
[31m-    |  lea RA, [BASE+RA*8+8][m
[31m-    |  lea RD, [BASE+RD*8][m
[31m-    |  mov RB, LJ_TNIL[m
[31m-    |  mov [RA-8], RB			// Sets minimum 2 slots.[m
[31m-    |1:[m
[31m-    |  mov [RA], RB[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RD[m
[31m-    |  jbe <1[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  ins_AD	// RA = dst, RD = upvalue #[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RD*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RB, UPVAL:RB->v[m
[31m-    |  mov RD, [RB][m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-#define TV2MARKOFS \[m
[31m- ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))[m
[31m-    |  ins_AD	// RA = upvalue #, RD = src[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  cmp byte UPVAL:RB->closed, 0[m
[31m-    |  mov RB, UPVAL:RB->v[m
[31m-    |  mov RA, [BASE+RD*8][m
[31m-    |  mov [RB], RA[m
[31m-    |  jz >1[m
[31m-    |  // Check barrier for closed upvalue.[m
[31m-    |  test byte [RB+TV2MARKOFS], LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  jnz >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Upvalue is black. Check if new value is collectable and white.[m
[31m-    |  mov RD, RA[m
[31m-    |  sar RD, 47[m
[31m-    |  sub RDd, LJ_TISGCV[m
[31m-    |  cmp RDd, LJ_TNUMX - LJ_TISGCV			// tvisgcv(v)[m
[31m-    |  jbe <1[m
[31m-    |  cleartp GCOBJ:RA[m
[31m-    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(v)[m
[31m-    |  jz <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |.if not X64WIN[m
[31m-    |  mov CARG2, RB[m
[31m-    |  mov RB, BASE			// Save BASE.[m
[31m-    |.else[m
[31m-    |  xchg CARG2, RB			// Save BASE (CARG2 == BASE).[m
[31m-    |.endif[m
[31m-    |  lea GL:CARG1, [DISPATCH+GG_DISP2G][m
[31m-    |  call extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-#undef TV2MARKOFS[m
[31m-  case BC_USETS:[m
[31m-    |  ins_AND	// RA = upvalue #, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov STR:RA, [KBASE+RD*8][m
[31m-    |  mov RD, UPVAL:RB->v[m
[31m-    |  settp STR:ITYPE, STR:RA, LJ_TSTR[m
[31m-    |  mov [RD], STR:ITYPE[m
[31m-    |  test byte UPVAL:RB->marked, LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  jnz >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(str)[m
[31m-    |  jz <1[m
[31m-    |  cmp byte UPVAL:RB->closed, 0[m
[31m-    |  jz <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  mov RB, BASE			// Save BASE (CARG2 == BASE).[m
[31m-    |  mov CARG2, RD[m
[31m-    |  lea GL:CARG1, [DISPATCH+GG_DISP2G][m
[31m-    |  call extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  ins_AD	// RA = upvalue #, RD = num const[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RA, UPVAL:RB->v[m
[31m-    |  movsd qword [RA], xmm0[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  ins_AD	// RA = upvalue #, RD = primitive type (~)[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  shl RD, 47[m
[31m-    |  not RD[m
[31m-    |  mov RA, UPVAL:RB->v[m
[31m-    |  mov [RA], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UCLO:[m
[31m-    |  ins_AD	// RA = level, RD = target[m
[31m-    |  branchPC RD			// Do this first to free RD.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  cmp aword L:RB->openupval, 0[m
[31m-    |  je >1[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  lea CARG2, [BASE+RA*8]		// Caveat: CARG2 == BASE[m
[31m-    |  mov L:CARG1, L:RB		// Caveat: CARG1 == RA[m
[31m-    |  call extern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  ins_AND	// RA = dst, RD = proto const (~) (holding function prototype)[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-    |  mov CARG3, [BASE-16][m
[31m-    |  cleartp CARG3[m
[31m-    |  mov CARG2, [KBASE+RD*8]		// Fetch GCproto *.[m
[31m-    |  mov CARG1, L:RB[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  call extern lj_func_newL_gc[m
[31m-    |  // GCfuncL * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  settp LFUNC:RC, LJ_TFUNC[m
[31m-    |  mov [BASE+RA*8], LFUNC:RC[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-    |  ins_AD	// RA = dst, RD = hbits|asize[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  jae >5[m
[31m-    |1:[m
[31m-    |  mov CARG3d, RDd[m
[31m-    |  and RDd, 0x7ff[m
[31m-    |  shr CARG3d, 11[m
[31m-    |  cmp RDd, 0x7ff[m
[31m-    |  je >3[m
[31m-    |2:[m
[31m-    |  mov L:CARG1, L:RB[m
[31m-    |  mov CARG2d, RDd[m
[31m-    |  call extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-    |  // Table * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  settp TAB:RC, LJ_TTAB[m
[31m-    |  mov [BASE+RA*8], TAB:RC[m
[31m-    |  ins_next[m
[31m-    |3:  // Turn 0x7ff into 0x801.[m
[31m-    |  mov RDd, 0x801[m
[31m-    |  jmp <2[m
[31m-    |5:[m
[31m-    |  mov L:CARG1, L:RB[m
[31m-    |  call extern lj_gc_step_fixtop	// (lua_State *L)[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_TDUP:[m
[31m-    |  ins_AND	// RA = dst, RD = table const (~) (holding template table)[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  jae >3[m
[31m-    |2:[m
[31m-    |  mov TAB:CARG2, [KBASE+RD*8]	// Caveat: CARG2 == BASE[m
[31m-    |  mov L:CARG1, L:RB		// Caveat: CARG1 == RA[m
[31m-    |  call extern lj_tab_dup		// (lua_State *L, Table *kt)[m
[31m-    |  // Table * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  settp TAB:RC, LJ_TTAB[m
[31m-    |  mov [BASE+RA*8], TAB:RC[m
[31m-    |  ins_next[m
[31m-    |3:[m
[31m-    |  mov L:CARG1, L:RB[m
[31m-    |  call extern lj_gc_step_fixtop	// (lua_State *L)[m
[31m-    |  movzx RDd, PC_RD			// Need to reload RD.[m
[31m-    |  not RD[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  ins_AND	// RA = dst, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov TAB:RB, LFUNC:RB->env[m
[31m-    |  mov STR:RC, [KBASE+RD*8][m
[31m-    |  jmp ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_GSET:[m
[31m-    |  ins_AND	// RA = src, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov TAB:RB, LFUNC:RB->env[m
[31m-    |  mov STR:RC, [KBASE+RD*8][m
[31m-    |  jmp ->BC_TSETS_Z[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  mov RC, [BASE+RC*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tgetv[m
[31m-    |[m
[31m-    |  // Integer key?[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RC, >5[m
[31m-    |.else[m
[31m-    |  // Convert number to int and back and compare.[m
[31m-    |  checknum RC, >5[m
[31m-    |  movd xmm0, RC[m
[31m-    |  cvttsd2si RCd, xmm0[m
[31m-    |  cvtsi2sd xmm1, RCd[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jne ->vmeta_tgetv		// Generic numeric key? Use fallback.[m
[31m-    |.endif[m
[31m-    |  cmp RCd, TAB:RB->asize		// Takes care of unordered, too.[m
[31m-    |  jae ->vmeta_tgetv		// Not in array part? Use fallback.[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Get array slot.[m
[31m-    |  mov ITYPE, [RC][m
[31m-    |  cmp ITYPE, LJ_TNIL		// Avoid overwriting RB in fastpath.[m
[31m-    |  je >2[m
[31m-    |1:[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <1[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_index[m
[31m-    |  jz ->vmeta_tgetv			// 'no __index' flag NOT set: check.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // String key?[m
[31m-    |  cmp ITYPEd, LJ_TSTR; jne ->vmeta_tgetv[m
[31m-    |  cleartp STR:RC[m
[31m-    |  jmp ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = str const (~)[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  not RC[m
[31m-    |  mov STR:RC, [KBASE+RC*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tgets[m
[31m-    |->BC_TGETS_Z:	// RB = GCtab *, RC = GCstr *[m
[31m-    |  mov TMPRd, TAB:RB->hmask[m
[31m-    |  and TMPRd, STR:RC->hash[m
[31m-    |  imul TMPRd, #NODE[m
[31m-    |  add NODE:TMPR, TAB:RB->node[m
[31m-    |  settp ITYPE, STR:RC, LJ_TSTR[m
[31m-    |1:[m
[31m-    |  cmp NODE:TMPR->key, ITYPE[m
[31m-    |  jne >4[m
[31m-    |  // Get node value.[m
[31m-    |  mov ITYPE, NODE:TMPR->val[m
[31m-    |  cmp ITYPE, LJ_TNIL[m
[31m-    |  je >5				// Key found, but nil value?[m
[31m-    |2:[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  mov NODE:TMPR, NODE:TMPR->next[m
[31m-    |  test NODE:TMPR, NODE:TMPR[m
[31m-    |  jnz <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |  mov ITYPE, LJ_TNIL[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <2				// No metatable: done.[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_index[m
[31m-    |  jnz <2				// 'no __index' flag set: done.[m
[31m-    |  jmp ->vmeta_tgets		// Caveat: preserve STR:RC.[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = byte literal[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tgetb[m
[31m-    |  cmp RCd, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tgetb[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Get array slot.[m
[31m-    |  mov ITYPE, [RC][m
[31m-    |  cmp ITYPE, LJ_TNIL[m
[31m-    |  je >2[m
[31m-    |1:[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <1[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_index[m
[31m-    |  jz ->vmeta_tgetb			// 'no __index' flag NOT set: check.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  cleartp TAB:RB[m
[31m-    |.if DUALNUM[m
[31m-    |  mov RCd, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  cvttsd2si RCd, qword [BASE+RC*8][m
[31m-    |.endif[m
[31m-    |  cmp RCd, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tgetr		// Not in array part? Use fallback.[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Get array slot.[m
[31m-    |->BC_TGETR_Z:[m
[31m-    |  mov ITYPE, [RC][m
[31m-    |->BC_TGETR2_Z:[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  mov RC, [BASE+RC*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tsetv[m
[31m-    |[m
[31m-    |  // Integer key?[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RC, >5[m
[31m-    |.else[m
[31m-    |  // Convert number to int and back and compare.[m
[31m-    |  checknum RC, >5[m
[31m-    |  movd xmm0, RC[m
[31m-    |  cvttsd2si RCd, xmm0[m
[31m-    |  cvtsi2sd xmm1, RCd[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jne ->vmeta_tsetv		// Generic numeric key? Use fallback.[m
[31m-    |.endif[m
[31m-    |  cmp RCd, TAB:RB->asize		// Takes care of unordered, too.[m
[31m-    |  jae ->vmeta_tsetv[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp aword [RC], LJ_TNIL[m
[31m-    |  je >3				// Previous value is nil?[m
[31m-    |1:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:  // Set array slot.[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  mov [RC], RB[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <1[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsetv			// 'no __newindex' flag NOT set: check.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // String key?[m
[31m-    |  cmp ITYPEd, LJ_TSTR; jne ->vmeta_tsetv[m
[31m-    |  cleartp STR:RC[m
[31m-    |  jmp ->BC_TSETS_Z[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMPR[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = str const (~)[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  not RC[m
[31m-    |  mov STR:RC, [KBASE+RC*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tsets[m
[31m-    |->BC_TSETS_Z:	// RB = GCtab *, RC = GCstr *[m
[31m-    |  mov TMPRd, TAB:RB->hmask[m
[31m-    |  and TMPRd, STR:RC->hash[m
[31m-    |  imul TMPRd, #NODE[m
[31m-    |  mov byte TAB:RB->nomm, 0		// Clear metamethod cache.[m
[31m-    |  add NODE:TMPR, TAB:RB->node[m
[31m-    |  settp ITYPE, STR:RC, LJ_TSTR[m
[31m-    |1:[m
[31m-    |  cmp NODE:TMPR->key, ITYPE[m
[31m-    |  jne >5[m
[31m-    |  // Ok, key found. Assumes: offsetof(Node, val) == 0[m
[31m-    |  cmp aword [TMPR], LJ_TNIL[m
[31m-    |  je >4				// Previous value is nil?[m
[31m-    |2:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |3:  // Set node value.[m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  mov [TMPR], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  mov TAB:ITYPE, TAB:RB->metatable[m
[31m-    |  test TAB:ITYPE, TAB:ITYPE[m
[31m-    |  jz <2[m
[31m-    |  test byte TAB:ITYPE->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  mov NODE:TMPR, NODE:TMPR->next[m
[31m-    |  test NODE:TMPR, NODE:TMPR[m
[31m-    |  jnz <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz >6				// No metatable: continue.[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[31m-    |6:[m
[31m-    |  mov TMP1, ITYPE[m
[31m-    |  mov L:CARG1, SAVE_L[m
[31m-    |  mov L:CARG1->base, BASE[m
[31m-    |  lea CARG3, TMP1[m
[31m-    |  mov CARG2, TAB:RB[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_tab_newkey	// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Handles write barrier for the new key. TValue * returned in eax (RC).[m
[31m-    |  mov L:CARG1, SAVE_L[m
[31m-    |  mov BASE, L:CARG1->base[m
[31m-    |  mov TMPR, rax[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  jmp <2				// Must check write barrier for value.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, ITYPE[m
[31m-    |  jmp <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = byte literal[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tsetb[m
[31m-    |  cmp RCd, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tsetb[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp aword [RC], LJ_TNIL[m
[31m-    |  je >3				// Previous value is nil?[m
[31m-    |1:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:	 // Set array slot.[m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  mov [RC], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <1[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsetb			// 'no __newindex' flag NOT set: check.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMPR[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  cleartp TAB:RB[m
[31m-    |.if DUALNUM[m
[31m-    |  mov RC, [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  cvttsd2si RCd, qword [BASE+RC*8][m
[31m-    |.endif[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:[m
[31m-    |  cmp RCd, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tsetr[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Set array slot.[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  mov [RC], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMPR[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  ins_AD	// RA = base (table at base-1), RD = num const (start index)[m
[31m-    |1:[m
[31m-    |  mov TMPRd, dword [KBASE+RD*8]	// Integer constant is in lo-word.[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  mov TAB:RB, [RA-8]		// Guaranteed to be a table.[m
[31m-    |  cleartp TAB:RB[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:[m
[31m-    |  mov RDd, MULTRES[m
[31m-    |  sub RDd, 1[m
[31m-    |  jz >4				// Nothing to copy?[m
[31m-    |  add RDd, TMPRd			// Compute needed size.[m
[31m-    |  cmp RDd, TAB:RB->asize[m
[31m-    |  ja >5				// Doesn't fit into array part?[m
[31m-    |  sub RDd, TMPRd[m
[31m-    |  shl TMPRd, 3[m
[31m-    |  add TMPR, TAB:RB->array[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |  mov RB, [RA][m
[31m-    |  add RA, 8[m
[31m-    |  mov [TMPR], RB[m
[31m-    |  add TMPR, 8[m
[31m-    |  sub RDd, 1[m
[31m-    |  jnz <3[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |  mov L:CARG1, SAVE_L[m
[31m-    |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-    |  mov CARG2, TAB:RB[m
[31m-    |  mov CARG3d, RDd[m
[31m-    |  mov L:RB, L:CARG1[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_tab_reasize	// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RAd, PC_RA			// Restore RA.[m
[31m-    |  movzx RDd, PC_RD			// Restore RD.[m
[31m-    |  jmp <1				// Retry.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RD[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALL: case BC_CALLM:[m
[31m-    |  ins_A_C	// RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs[m
[31m-    if (op == BC_CALLM) {[m
[31m-      |  add NARGS:RDd, MULTRES[m
[31m-    }[m
[31m-    |  mov LFUNC:RB, [BASE+RA*8][m
[31m-    |  checkfunc LFUNC:RB, ->vmeta_call_ra[m
[31m-    |  lea BASE, [BASE+RA*8+16][m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  ins_AD	// RA = base, RD = extra_nargs[m
[31m-    |  add NARGS:RDd, MULTRES[m
[31m-    |  // Fall through. Assumes BC_CALLT follows and ins_AD is a no-op.[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  ins_AD	// RA = base, RD = nargs+1[m
[31m-    |  lea RA, [BASE+RA*8+16][m
[31m-    |  mov KBASE, BASE			// Use KBASE for move + vmeta_call hint.[m
[31m-    |  mov LFUNC:RB, [RA-16][m
[31m-    |  checktp_nc LFUNC:RB, LJ_TFUNC, ->vmeta_call[m
[31m-    |->BC_CALLT_Z:[m
[31m-    |  mov PC, [BASE-8][m
[31m-    |  test PCd, FRAME_TYPE[m
[31m-    |  jnz >7[m
[31m-    |1:[m
[31m-    |  mov [BASE-16], LFUNC:RB		// Copy func+tag down, reloaded below.[m
[31m-    |  mov MULTRES, NARGS:RDd[m
[31m-    |  sub NARGS:RDd, 1[m
[31m-    |  jz >3[m
[31m-    |2:  // Move args down.[m
[31m-    |  mov RB, [RA][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE], RB[m
[31m-    |  add KBASE, 8[m
[31m-    |  sub NARGS:RDd, 1[m
[31m-    |  jnz <2[m
[31m-    |[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |3:[m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov NARGS:RDd, MULTRES[m
[31m-    |  cmp byte LFUNC:RB->ffid, 1	// (> FF_C) Calling a fast function?[m
[31m-    |  ja >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function.[m
[31m-    |  test PCd, FRAME_TYPE		// Lua frame below?[m
[31m-    |  jnz <4[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  neg RA[m
[31m-    |  mov LFUNC:KBASE, [BASE+RA*8-32]	// Need to prepare KBASE.[m
[31m-    |  cleartp LFUNC:KBASE[m
[31m-    |  mov KBASE, LFUNC:KBASE->pc[m
[31m-    |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-    |  jmp <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  sub PC, FRAME_VARG[m
[31m-    |  test PCd, FRAME_TYPEP[m
[31m-    |  jnz >8				// Vararg frame below?[m
[31m-    |  sub BASE, PC			// Need to relocate BASE/KBASE down.[m
[31m-    |  mov KBASE, BASE[m
[31m-    |  mov PC, [BASE-8][m
[31m-    |  jmp <1[m
[31m-    |8:[m
[31m-    |  add PCd, FRAME_VARG[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  ins_A	// RA = base, (RB = nresults+1,) RC = nargs+1 (2+1)[m
[31m-    |  lea RA, [BASE+RA*8+16]		// fb = base+2[m
[31m-    |  mov RB, [RA-32]			// Copy state. fb[0] = fb[-4].[m
[31m-    |  mov RC, [RA-24]			// Copy control var. fb[1] = fb[-3].[m
[31m-    |  mov [RA], RB[m
[31m-    |  mov [RA+8], RC[m
[31m-    |  mov LFUNC:RB, [RA-40]		// Copy callable. fb[-2] = fb[-5][m
[31m-    |  mov [RA-16], LFUNC:RB[m
[31m-    |  mov NARGS:RDd, 2+1		// Handle like a regular 2-arg call.[m
[31m-    |  checkfunc LFUNC:RB, ->vmeta_call[m
[31m-    |  mov BASE, RA[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  ins_A	// RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  mov TAB:RB, [BASE+RA*8-16][m
[31m-    |  cleartp TAB:RB[m
[31m-    |  mov RCd, [BASE+RA*8-8]		// Get index from control var.[m
[31m-    |  mov TMPRd, TAB:RB->asize[m
[31m-    |  add PC, 4[m
[31m-    |  mov ITYPE, TAB:RB->array[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  cmp RCd, TMPRd; jae >5		// Index points after array part?[m
[31m-    |  cmp aword [ITYPE+RC*8], LJ_TNIL; je >4[m
[31m-    |.if not DUALNUM[m
[31m-    |  cvtsi2sd xmm0, RCd[m
[31m-    |.endif[m
[31m-    |  // Copy array slot to returned value.[m
[31m-    |  mov RB, [ITYPE+RC*8][m
[31m-    |  mov [BASE+RA*8+8], RB[m
[31m-    |  // Return array index as a numeric key.[m
[31m-    |.if DUALNUM[m
[31m-    |  setint ITYPE, RC[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |.else[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  add RCd, 1[m
[31m-    |  mov [BASE+RA*8-8], RCd		// Update control var.[m
[31m-    |2:[m
[31m-    |  movzx RDd, PC_RD			// Get target from ITERL.[m
[31m-    |  branchPC RD[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Skip holes in array part.[m
[31m-    |  add RCd, 1[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  sub RCd, TMPRd[m
[31m-    |6:[m
[31m-    |  cmp RCd, TAB:RB->hmask; ja <3	// End of iteration? Branch to ITERL+1.[m
[31m-    |  imul ITYPEd, RCd, #NODE[m
[31m-    |  add NODE:ITYPE, TAB:RB->node[m
[31m-    |  cmp aword NODE:ITYPE->val, LJ_TNIL; je >7[m
[31m-    |  lea TMPRd, [RCd+TMPRd+1][m
[31m-    |  // Copy key and value from hash slot.[m
[31m-    |  mov RB, NODE:ITYPE->key[m
[31m-    |  mov RC, NODE:ITYPE->val[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+8], RC[m
[31m-    |  mov [BASE+RA*8-8], TMPRd[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |7:  // Skip holes in hash part.[m
[31m-    |  add RCd, 1[m
[31m-    |  jmp <6[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  ins_AD	// RA = base, RD = target (points to ITERN)[m
[31m-    |  mov CFUNC:RB, [BASE+RA*8-24][m
[31m-    |  checkfunc CFUNC:RB, >5[m
[31m-    |  checktptp [BASE+RA*8-16], LJ_TTAB, >5[m
[31m-    |  cmp aword [BASE+RA*8-8], LJ_TNIL; jne >5[m
[31m-    |  cmp byte CFUNC:RB->ffid, FF_next_N; jne >5[m
[31m-    |  branchPC RD[m
[31m-    |  mov64 TMPR, U64x(fffe7fff, 00000000)[m
[31m-    |  mov [BASE+RA*8-8], TMPR		// Initialize control var.[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  mov PC_OP, BC_JMP[m
[31m-    |  branchPC RD[m
[31m-    |  mov byte [PC], BC_ITERC[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  ins_ABC	// RA = base, RB = nresults+1, RC = numparams[m
[31m-    |  lea TMPR, [BASE+RC*8+(16+FRAME_VARG)][m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  sub TMPR, [BASE-8][m
[31m-    |  // Note: TMPR may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  test RB, RB[m
[31m-    |  jz >5				// Copy all varargs?[m
[31m-    |  lea RB, [RA+RB*8-8][m
[31m-    |  cmp TMPR, BASE			// No vararg slots?[m
[31m-    |  jnb >2[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  mov RC, [TMPR-16][m
[31m-    |  add TMPR, 8[m
[31m-    |  mov [RA], RC[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RB			// All destination slots filled?[m
[31m-    |  jnb >3[m
[31m-    |  cmp TMPR, BASE			// No more vararg slots?[m
[31m-    |  jb <1[m
[31m-    |2:  // Fill up remainder with nil.[m
[31m-    |  mov aword [RA], LJ_TNIL[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RB[m
[31m-    |  jb <2[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  mov MULTRES, 1			// MULTRES = 0+1[m
[31m-    |  mov RC, BASE[m
[31m-    |  sub RC, TMPR[m
[31m-    |  jbe <3				// No vararg slots?[m
[31m-    |  mov RBd, RCd[m
[31m-    |  shr RBd, 3[m
[31m-    |  add RBd, 1[m
[31m-    |  mov MULTRES, RBd			// MULTRES = #varargs+1[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  add RC, RA[m
[31m-    |  cmp RC, L:RB->maxstack[m
[31m-    |  ja >7				// Need to grow stack?[m
[31m-    |6:  // Copy all vararg slots.[m
[31m-    |  mov RC, [TMPR-16][m
[31m-    |  add TMPR, 8[m
[31m-    |  mov [RA], RC[m
[31m-    |  add RA, 8[m
[31m-    |  cmp TMPR, BASE			// No more vararg slots?[m
[31m-    |  jb <6[m
[31m-    |  jmp <3[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov L:RB->top, RA[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  sub TMPR, BASE			// Need delta, because BASE may change.[m
[31m-    |  mov TMP1hi, TMPRd[m
[31m-    |  mov CARG2d, MULTRES[m
[31m-    |  sub CARG2d, 1[m
[31m-    |  mov CARG1, L:RB[m
[31m-    |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movsxd TMPR, TMP1hi[m
[31m-    |  mov RA, L:RB->top[m
[31m-    |  add TMPR, BASE[m
[31m-    |  jmp <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  ins_AD	// RA = results, RD = extra_nresults[m
[31m-    |  add RDd, MULTRES			// MULTRES >=1, so RD >=1.[m
[31m-    |  // Fall through. Assumes BC_RET follows and ins_AD is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-    |  ins_AD	// RA = results, RD = nresults+1[m
[31m-    if (op != BC_RET0) {[m
[31m-      |  shl RAd, 3[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  mov PC, [BASE-8][m
[31m-    |  mov MULTRES, RDd			// Save nresults+1.[m
[31m-    |  test PCd, FRAME_TYPE		// Check frame type marker.[m
[31m-    |  jnz >7				// Not returning to a fixarg Lua func?[m
[31m-    switch (op) {[m
[31m-    case BC_RET:[m
[31m-      |->BC_RET_Z:[m
[31m-      |  mov KBASE, BASE		// Use KBASE for result move.[m
[31m-      |  sub RDd, 1[m
[31m-      |  jz >3[m
[31m-      |2:  // Move results down.[m
[31m-      |  mov RB, [KBASE+RA][m
[31m-      |  mov [KBASE-16], RB[m
[31m-      |  add KBASE, 8[m
[31m-      |  sub RDd, 1[m
[31m-      |  jnz <2[m
[31m-      |3:[m
[31m-      |  mov RDd, MULTRES		// Note: MULTRES may be >255.[m
[31m-      |  movzx RBd, PC_RB		// So cannot compare with RDL![m
[31m-      |5:[m
[31m-      |  cmp RBd, RDd			// More results expected?[m
[31m-      |  ja >6[m
[31m-      break;[m
[31m-    case BC_RET1:[m
[31m-      |  mov RB, [BASE+RA][m
[31m-      |  mov [BASE-16], RB[m
[31m-      /* fallthrough */[m
[31m-    case BC_RET0:[m
[31m-      |5:[m
[31m-      |  cmp PC_RB, RDL			// More results expected?[m
[31m-      |  ja >6[m
[31m-    default:[m
[31m-      break;[m
[31m-    }[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  neg RA[m
[31m-    |  lea BASE, [BASE+RA*8-16]		// base = base - (RA+2)*8[m
[31m-    |  mov LFUNC:KBASE, [BASE-16][m
[31m-    |  cleartp LFUNC:KBASE[m
[31m-    |  mov KBASE, LFUNC:KBASE->pc[m
[31m-    |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    if (op == BC_RET) {[m
[31m-      |  mov aword [KBASE-16], LJ_TNIL	// Note: relies on shifted base.[m
[31m-      |  add KBASE, 8[m
[31m-    } else {[m
[31m-      |  mov aword [BASE+RD*8-24], LJ_TNIL[m
[31m-    }[m
[31m-    |  add RD, 1[m
[31m-    |  jmp <5[m
[31m-    |[m
[31m-    |7:  // Non-standard return case.[m
[31m-    |  lea RB, [PC-FRAME_VARG][m
[31m-    |  test RBd, FRAME_TYPEP[m
[31m-    |  jnz ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down and RA up.[m
[31m-    |  sub BASE, RB[m
[31m-    if (op != BC_RET0) {[m
[31m-      |  add RA, RB[m
[31m-    }[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  |.define FOR_IDX,  [RA][m
[31m-  |.define FOR_STOP, [RA+8][m
[31m-  |.define FOR_STEP, [RA+16][m
[31m-  |.define FOR_EXT,  [RA+24][m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop RBd[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_IFORL follows and ins_AJ is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  ins_AJ	// RA = base, RD = target (after end of loop or start of loop)[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    if (LJ_DUALNUM) {[m
[31m-      |  mov RB, FOR_IDX[m
[31m-      |  checkint RB, >9[m
[31m-      |  mov TMPR, FOR_STOP[m
[31m-      if (!vk) {[m
[31m-	|  checkint TMPR, ->vmeta_for[m
[31m-	|  mov ITYPE, FOR_STEP[m
[31m-	|  test ITYPEd, ITYPEd; js >5[m
[31m-	|  sar ITYPE, 47;[m
[31m-	|  cmp ITYPEd, LJ_TISNUM; jne ->vmeta_for[m
[31m-      } else {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-	|  checkinttp FOR_STOP, ->assert_bad_for_arg_type[m
[31m-	|  checkinttp FOR_STEP, ->assert_bad_for_arg_type[m
[31m-#endif[m
[31m-	|  mov ITYPE, FOR_STEP[m
[31m-	|  test ITYPEd, ITYPEd; js >5[m
[31m-	|  add RBd, ITYPEd; jo >1[m
[31m-	|  setint RB[m
[31m-	|  mov FOR_IDX, RB[m
[31m-      }[m
[31m-      |  cmp RBd, TMPRd[m
[31m-      |  mov FOR_EXT, RB[m
[31m-      if (op == BC_FORI) {[m
[31m-	|  jle >7[m
[31m-	|1:[m
[31m-	|6:[m
[31m-	|  branchPC RD[m
[31m-      } else if (op == BC_JFORI) {[m
[31m-	|  branchPC RD[m
[31m-	|  movzx RDd, PC_RD[m
[31m-	|  jle =>BC_JLOOP[m
[31m-	|1:[m
[31m-	|6:[m
[31m-      } else if (op == BC_IFORL) {[m
[31m-	|  jg >7[m
[31m-	|6:[m
[31m-	|  branchPC RD[m
[31m-	|1:[m
[31m-      } else {[m
[31m-	|  jle =>BC_JLOOP[m
[31m-	|1:[m
[31m-	|6:[m
[31m-      }[m
[31m-      |7:[m
[31m-      |  ins_next[m
[31m-      |[m
[31m-      |5:  // Invert check for negative step.[m
[31m-      if (!vk) {[m
[31m-	|  sar ITYPE, 47;[m
[31m-	|  cmp ITYPEd, LJ_TISNUM; jne ->vmeta_for[m
[31m-      } else {[m
[31m-	|  add RBd, ITYPEd; jo <1[m
[31m-	|  setint RB[m
[31m-	|  mov FOR_IDX, RB[m
[31m-      }[m
[31m-      |  cmp RBd, TMPRd[m
[31m-      |  mov FOR_EXT, RB[m
[31m-      if (op == BC_FORI) {[m
[31m-	|  jge <7[m
[31m-      } else if (op == BC_JFORI) {[m
[31m-	|  branchPC RD[m
[31m-	|  movzx RDd, PC_RD[m
[31m-	|  jge =>BC_JLOOP[m
[31m-      } else if (op == BC_IFORL) {[m
[31m-	|  jl <7[m
[31m-      } else {[m
[31m-	|  jge =>BC_JLOOP[m
[31m-      }[m
[31m-      |  jmp <6[m
[31m-      |9:  // Fallback to FP variant.[m
[31m-      if (!vk) {[m
[31m-	|  jae ->vmeta_for[m
[31m-      }[m
[31m-    } else if (!vk) {[m
[31m-      |  checknumtp FOR_IDX, ->vmeta_for[m
[31m-    }[m
[31m-    if (!vk) {[m
[31m-      |  checknumtp FOR_STOP, ->vmeta_for[m
[31m-    } else {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-      |  checknumtp FOR_STOP, ->assert_bad_for_arg_type[m
[31m-      |  checknumtp FOR_STEP, ->assert_bad_for_arg_type[m
[31m-#endif[m
[31m-    }[m
[31m-    |  mov RB, FOR_STEP[m
[31m-    if (!vk) {[m
[31m-      |  checknum RB, ->vmeta_for[m
[31m-    }[m
[31m-    |  movsd xmm0, qword FOR_IDX[m
[31m-    |  movsd xmm1, qword FOR_STOP[m
[31m-    if (vk) {[m
[31m-      |  addsd xmm0, qword FOR_STEP[m
[31m-      |  movsd qword FOR_IDX, xmm0[m
[31m-      |  test RB, RB; js >3[m
[31m-    } else {[m
[31m-      |  jl >3[m
[31m-    }[m
[31m-    |  ucomisd xmm1, xmm0[m
[31m-    |1:[m
[31m-    |  movsd qword FOR_EXT, xmm0[m
[31m-    if (op == BC_FORI) {[m
[31m-      |.if DUALNUM[m
[31m-      |  jnb <7[m
[31m-      |.else[m
[31m-      |  jnb >2[m
[31m-      |  branchPC RD[m
[31m-      |.endif[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  branchPC RD[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  jnb =>BC_JLOOP[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |.if DUALNUM[m
[31m-      |  jb <7[m
[31m-      |.else[m
[31m-      |  jb >2[m
[31m-      |  branchPC RD[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |  jnb =>BC_JLOOP[m
[31m-    }[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |3:  // Invert comparison if step is negative.[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop RBd[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_IITERL follows and ins_AJ is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  ins_AJ	// RA = base, RD = target[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  mov RB, [RA][m
[31m-    |  cmp RB, LJ_TNIL; je >1		// Stop if iterator returned nil.[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  mov [RA-8], RB[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  branchPC RD			// Otherwise save control var + branch.[m
[31m-      |  mov [RA-8], RB[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  ins_A	// RA = base, RD = target (loop extent)[m
[31m-    |  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop RBd[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  ins_A	// RA = base, RD = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  ins_AD	// RA = base (ignored), RD = traceno[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_J(trace)][m
[31m-    |  mov TRACE:RD, [RA+RD*8][m
[31m-    |  mov RD, TRACE:RD->mcode[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(jit_base)], BASE[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(tmpbuf.L)], L:RB[m
[31m-    |  // Save additional callee-save registers only used in compiled code.[m
[31m-    |.if X64WIN[m
[31m-    |  mov CSAVE_4, r12[m
[31m-    |  mov CSAVE_3, r13[m
[31m-    |  mov CSAVE_2, r14[m
[31m-    |  mov CSAVE_1, r15[m
[31m-    |  mov RA, rsp[m
[31m-    |  sub rsp, 10*16+4*8[m
[31m-    |  movdqa [RA-1*16], xmm6[m
[31m-    |  movdqa [RA-2*16], xmm7[m
[31m-    |  movdqa [RA-3*16], xmm8[m
[31m-    |  movdqa [RA-4*16], xmm9[m
[31m-    |  movdqa [RA-5*16], xmm10[m
[31m-    |  movdqa [RA-6*16], xmm11[m
[31m-    |  movdqa [RA-7*16], xmm12[m
[31m-    |  movdqa [RA-8*16], xmm13[m
[31m-    |  movdqa [RA-9*16], xmm14[m
[31m-    |  movdqa [RA-10*16], xmm15[m
[31m-    |.else[m
[31m-    |  sub rsp, 16[m
[31m-    |  mov [rsp+16], r12[m
[31m-    |  mov [rsp+8], r13[m
[31m-    |.endif[m
[31m-    |  jmp RD[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  ins_AJ	// RA = unused, RD = target[m
[31m-    |  branchPC RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-   /*[m
[31m-   ** Reminder: A function may be called with func/args above L->maxstack,[m
[31m-   ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot,[m
[31m-   ** too. This means all FUNC* ops (including fast functions) must check[m
[31m-   ** for stack overflow _before_ adding more slots![m
[31m-   */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall RBd[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[31m-    |  mov KBASE, [PC-4+PC2PROTO(k)][m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RA, [BASE+RA*8]		// Top of frame.[m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  ja ->vm_growstack_f[m
[31m-    |  movzx RAd, byte [PC-4+PC2PROTO(numparams)][m
[31m-    |  cmp NARGS:RDd, RAd		// Check for missing parameters.[m
[31m-    |  jbe >3[m
[31m-    |2:[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  mov aword [BASE+NARGS:RD*8-8], LJ_TNIL[m
[31m-    |  add NARGS:RDd, 1[m
[31m-    |  cmp NARGS:RDd, RAd[m
[31m-    |  jbe <3[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    | int3  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[31m-    |  lea RBd, [NARGS:RD*8+FRAME_VARG+8][m
[31m-    |  lea RD, [BASE+NARGS:RD*8+8][m
[31m-    |  mov LFUNC:KBASE, [BASE-16][m
[31m-    |  mov [RD-8], RB			// Store delta + FRAME_VARG.[m
[31m-    |  mov [RD-16], LFUNC:KBASE		// Store copy of LFUNC.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RA, [RD+RA*8][m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  ja ->vm_growstack_v		// Need to grow stack.[m
[31m-    |  mov RA, BASE[m
[31m-    |  mov BASE, RD[m
[31m-    |  movzx RBd, byte [PC-4+PC2PROTO(numparams)][m
[31m-    |  test RBd, RBd[m
[31m-    |  jz >2[m
[31m-    |  add RA, 8[m
[31m-    |1:  // Copy fixarg slots up to new frame.[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, BASE[m
[31m-    |  jnb >3				// Less args than parameters?[m
[31m-    |  mov KBASE, [RA-16][m
[31m-    |  mov [RD], KBASE[m
[31m-    |  add RD, 8[m
[31m-    |  mov aword [RA-16], LJ_TNIL	// Clear old fixarg slot (help the GC).[m
[31m-    |  sub RBd, 1[m
[31m-    |  jnz <1[m
[31m-    |2:[m
[31m-    if (op == BC_JFUNCV) {[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  mov KBASE, [PC-4+PC2PROTO(k)][m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  mov aword [RD], LJ_TNIL[m
[31m-    |  add RD, 8[m
[31m-    |  sub RBd, 1[m
[31m-    |  jnz <3[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  ins_AD  // BASE = new base, RA = ins RA|RD (unused), RD = nargs+1[m
[31m-    |  mov CFUNC:RB, [BASE-16][m
[31m-    |  cleartp CFUNC:RB[m
[31m-    |  mov KBASE, CFUNC:RB->f[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  lea RA, [RD+8*LUA_MINSTACK][m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  mov L:RB->top, RD[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  mov CARG1, L:RB		// Caveat: CARG1 may be RA.[m
[31m-    } else {[m
[31m-      |  mov CARG2, KBASE[m
[31m-      |  mov CARG1, L:RB		// Caveat: CARG1 may be RA.[m
[31m-    }[m
[31m-    |  ja ->vm_growstack_c		// Need to grow stack.[m
[31m-    |  set_vmstate C[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  call KBASE			// (lua_State *L)[m
[31m-    } else {[m
[31m-      |  // (lua_State *L, lua_CFunction f)[m
[31m-      |  call aword [DISPATCH+DISPATCH_GL(wrapf)][m
[31m-    }[m
[31m-    |  // nresults returned in eax (RD).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-    |  set_vmstate INTERP[m
[31m-    |  lea RA, [BASE+RD*8][m
[31m-    |  neg RA[m
[31m-    |  add RA, L:RB->top		// RA = (L->top-(L->base+nresults))*8[m
[31m-    |  mov PC, [BASE-8]			// Fetch PC of caller.[m
[31m-    |  jmp ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-  build_subroutines(ctx);[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 0x10\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"[m
[31m-	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"[m
[31m-	"\t.align 8\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.quad .Lbegin\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[31m-#if LJ_NO_UNWIND[m
[31m-	"\t.byte 0x8d\n\t.uleb128 0x6\n"	/* offset r13 */[m
[31m-	"\t.byte 0x8c\n\t.uleb128 0x7\n"	/* offset r12 */[m
[31m-#endif[m
[31m-	"\t.align 8\n"[m
[31m-	".LEFDE0:\n\n", fcofs, CFRAME_SIZE);[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.quad lj_vm_ffi_call\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.align 8\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#if !LJ_NO_UNWIND[m
[31m-#if (defined(__sun__) && defined(__svr4__))[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n");[m
[31m-#else[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.long .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 0x10\n"[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.long lj_err_unwind_dwarf-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"[m
[31m-	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"[m
[31m-	"\t.align 8\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.long .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.long .LASFDE2-.Lframe1\n"[m
[31m-	"\t.long .Lbegin-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[31m-	"\t.align 8\n"[m
[31m-	".LEFDE2:\n\n", fcofs, CFRAME_SIZE);[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.long .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 0x10\n"[m
[31m-	"\t.uleb128 1\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"[m
[31m-	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"[m
[31m-	"\t.align 8\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.long .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.long .LASFDE3-.Lframe2\n"[m
[31m-	"\t.long lj_vm_ffi_call-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.align 8\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#endif[m
[31m-    break;[m
[31m-#if !LJ_NO_UNWIND[m
[31m-  /* Mental note: never let Apple design an assembler.[m
[31m-  ** Or a linker. Or a plastic case. But I digress.[m
[31m-  */[m
[31m-  case BUILD_machasm: {[m
[31m-#if LJ_HASFFI[m
[31m-    int fcsize = 0;[m
[31m-#endif[m
[31m-    int i;[m
[31m-    fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	"EH_frame1:\n"[m
[31m-	"\t.set L$set$x,LECIEX-LSCIEX\n"[m
[31m-	"\t.long L$set$x\n"[m
[31m-	"LSCIEX:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.ascii \"zPR\\0\"\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.byte 128-8\n"[m
[31m-	"\t.byte 0x10\n"[m
[31m-	"\t.byte 6\n"				/* augmentation length */[m
[31m-	"\t.byte 0x9b\n"			/* indirect|pcrel|sdata4 */[m
[31m-	"\t.long _lj_err_unwind_dwarf+4@GOTPCREL\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.byte 0x7\n\t.byte 8\n"[m
[31m-	"\t.byte 0x80+0x10\n\t.byte 0x1\n"[m
[31m-	"\t.align 3\n"[m
[31m-	"LECIEX:\n\n");[m
[31m-    for (i = 0; i < ctx->nsym; i++) {[m
[31m-      const char *name = ctx->sym[i].name;[m
[31m-      int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;[m
[31m-      if (size == 0) continue;[m
[31m-#if LJ_HASFFI[m
[31m-      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }[m
[31m-#endif[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "%s.eh:\n"[m
[31m-	  "LSFDE%d:\n"[m
[31m-	  "\t.set L$set$%d,LEFDE%d-LASFDE%d\n"[m
[31m-	  "\t.long L$set$%d\n"[m
[31m-	  "LASFDE%d:\n"[m
[31m-	  "\t.long LASFDE%d-EH_frame1\n"[m
[31m-	  "\t.long %s-.\n"[m
[31m-	  "\t.long %d\n"[m
[31m-	  "\t.byte 0\n"				/* augmentation length */[m
[31m-	  "\t.byte 0xe\n\t.byte %d\n"		/* def_cfa_offset */[m
[31m-	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[31m-	  "\t.byte 0x8f\n\t.byte 0x4\n"		/* offset r15 */[m
[31m-	  "\t.byte 0x8e\n\t.byte 0x5\n"		/* offset r14 */[m
[31m-	  "\t.align 3\n"[m
[31m-	  "LEFDE%d:\n\n",[m
[31m-	  name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (fcsize) {[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "EH_frame2:\n"[m
[31m-	  "\t.set L$set$y,LECIEY-LSCIEY\n"[m
[31m-	  "\t.long L$set$y\n"[m
[31m-	  "LSCIEY:\n"[m
[31m-	  "\t.long 0\n"[m
[31m-	  "\t.byte 0x1\n"[m
[31m-	  "\t.ascii \"zR\\0\"\n"[m
[31m-	  "\t.byte 0x1\n"[m
[31m-	  "\t.byte 128-8\n"[m
[31m-	  "\t.byte 0x10\n"[m
[31m-	  "\t.byte 1\n"				/* augmentation length */[m
[31m-	  "\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	  "\t.byte 0xc\n\t.byte 0x7\n\t.byte 8\n"[m
[31m-	  "\t.byte 0x80+0x10\n\t.byte 0x1\n"[m
[31m-	  "\t.align 3\n"[m
[31m-	  "LECIEY:\n\n");[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "_lj_vm_ffi_call.eh:\n"[m
[31m-	  "LSFDEY:\n"[m
[31m-	  "\t.set L$set$yy,LEFDEY-LASFDEY\n"[m
[31m-	  "\t.long L$set$yy\n"[m
[31m-	  "LASFDEY:\n"[m
[31m-	  "\t.long LASFDEY-EH_frame2\n"[m
[31m-	  "\t.long _lj_vm_ffi_call-.\n"[m
[31m-	  "\t.long %d\n"[m
[31m-	  "\t.byte 0\n"				/* augmentation length */[m
[31m-	  "\t.byte 0xe\n\t.byte 16\n"		/* def_cfa_offset */[m
[31m-	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[31m-	  "\t.byte 0xd\n\t.byte 0x6\n"		/* def_cfa_register rbp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[31m-	  "\t.align 3\n"[m
[31m-	  "LEFDEY:\n\n", fcsize);[m
[31m-    }[m
[31m-#endif[m
[31m-    fprintf(ctx->fp, ".subsections_via_symbols\n");[m
[31m-    }[m
[31m-    break;[m
[31m-#endif[m
[31m-  default:  /* Difficult for other modes. */[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_x86.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_x86.dasc[m
[1mdeleted file mode 100644[m
[1mindex f200539..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/vm_x86.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,5737 +0,0 @@[m
[31m-|// Low-level VM code for x86 CPUs.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.if P64[m
[31m-|.arch x64[m
[31m-|.else[m
[31m-|.arch x86[m
[31m-|.endif[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|.if P64[m
[31m-|.define X64, 1[m
[31m-|.if WIN[m
[31m-|.define X64WIN, 1[m
[31m-|.endif[m
[31m-|.endif[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|// This is very fragile and has many dependencies. Caveat emptor.[m
[31m-|.define BASE,		edx		// Not C callee-save, refetched anyway.[m
[31m-|.if not X64[m
[31m-|.define KBASE,		edi		// Must be C callee-save.[m
[31m-|.define KBASEa,	KBASE[m
[31m-|.define PC,		esi		// Must be C callee-save.[m
[31m-|.define PCa,		PC[m
[31m-|.define DISPATCH,	ebx		// Must be C callee-save.[m
[31m-|.elif X64WIN[m
[31m-|.define KBASE,		edi		// Must be C callee-save.[m
[31m-|.define KBASEa,	rdi[m
[31m-|.define PC,		esi		// Must be C callee-save.[m
[31m-|.define PCa,		rsi[m
[31m-|.define DISPATCH,	ebx		// Must be C callee-save.[m
[31m-|.else[m
[31m-|.define KBASE,		r15d		// Must be C callee-save.[m
[31m-|.define KBASEa,	r15[m
[31m-|.define PC,		ebx		// Must be C callee-save.[m
[31m-|.define PCa,		rbx[m
[31m-|.define DISPATCH,	r14d		// Must be C callee-save.[m
[31m-|.endif[m
[31m-|[m
[31m-|.define RA,		ecx[m
[31m-|.define RAH,		ch[m
[31m-|.define RAL,		cl[m
[31m-|.define RB,		ebp		// Must be ebp (C callee-save).[m
[31m-|.define RC,		eax		// Must be eax.[m
[31m-|.define RCW,		ax[m
[31m-|.define RCH,		ah[m
[31m-|.define RCL,		al[m
[31m-|.define OP,		RB[m
[31m-|.define RD,		RC[m
[31m-|.define RDW,		RCW[m
[31m-|.define RDL,		RCL[m
[31m-|.if X64[m
[31m-|.define RAa, rcx[m
[31m-|.define RBa, rbp[m
[31m-|.define RCa, rax[m
[31m-|.define RDa, rax[m
[31m-|.else[m
[31m-|.define RAa, RA[m
[31m-|.define RBa, RB[m
[31m-|.define RCa, RC[m
[31m-|.define RDa, RD[m
[31m-|.endif[m
[31m-|[m
[31m-|.if not X64[m
[31m-|.define FCARG1,	ecx		// x86 fastcall arguments.[m
[31m-|.define FCARG2,	edx[m
[31m-|.elif X64WIN[m
[31m-|.define CARG1,		rcx		// x64/WIN64 C call arguments.[m
[31m-|.define CARG2,		rdx[m
[31m-|.define CARG3,		r8[m
[31m-|.define CARG4,		r9[m
[31m-|.define CARG1d,	ecx[m
[31m-|.define CARG2d,	edx[m
[31m-|.define CARG3d,	r8d[m
[31m-|.define CARG4d,	r9d[m
[31m-|.define FCARG1,	CARG1d		// Upwards compatible to x86 fastcall.[m
[31m-|.define FCARG2,	CARG2d[m
[31m-|.else[m
[31m-|.define CARG1,		rdi		// x64/POSIX C call arguments.[m
[31m-|.define CARG2,		rsi[m
[31m-|.define CARG3,		rdx[m
[31m-|.define CARG4,		rcx[m
[31m-|.define CARG5,		r8[m
[31m-|.define CARG6,		r9[m
[31m-|.define CARG1d,	edi[m
[31m-|.define CARG2d,	esi[m
[31m-|.define CARG3d,	edx[m
[31m-|.define CARG4d,	ecx[m
[31m-|.define CARG5d,	r8d[m
[31m-|.define CARG6d,	r9d[m
[31m-|.define FCARG1,	CARG1d		// Simulate x86 fastcall.[m
[31m-|.define FCARG2,	CARG2d[m
[31m-|.endif[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.if not X64		// x86 stack layout.[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*7			// Delta for esp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push edi; push esi; push ebx[m
[31m-|  sub esp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push ebp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add esp, CFRAME_SPACE[m
[31m-|  pop ebx; pop esi; pop edi; pop ebp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.define SAVE_ERRF,	aword [esp+aword*15]	// vm_pcall/vm_cpcall only.[m
[31m-|.define SAVE_NRES,	aword [esp+aword*14][m
[31m-|.define SAVE_CFRAME,	aword [esp+aword*13][m
[31m-|.define SAVE_L,	aword [esp+aword*12][m
[31m-|//----- 16 byte aligned, ^^^ arguments from C caller[m
[31m-|.define SAVE_RET,	aword [esp+aword*11]	//<-- esp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [esp+aword*10][m
[31m-|.define SAVE_R3,	aword [esp+aword*9][m
[31m-|.define SAVE_R2,	aword [esp+aword*8][m
[31m-|//----- 16 byte aligned[m
[31m-|.define SAVE_R1,	aword [esp+aword*7]	//<-- esp after register saves.[m
[31m-|.define SAVE_PC,	aword [esp+aword*6][m
[31m-|.define TMP2,		aword [esp+aword*5][m
[31m-|.define TMP1,		aword [esp+aword*4][m
[31m-|//----- 16 byte aligned[m
[31m-|.define ARG4,		aword [esp+aword*3][m
[31m-|.define ARG3,		aword [esp+aword*2][m
[31m-|.define ARG2,		aword [esp+aword*1][m
[31m-|.define ARG1,		aword [esp]		//<-- esp while in interpreter.[m
[31m-|//----- 16 byte aligned, ^^^ arguments for C callee[m
[31m-|[m
[31m-|// FPARGx overlaps ARGx and ARG(x+1) on x86.[m
[31m-|.define FPARG3,	qword [esp+qword*1][m
[31m-|.define FPARG1,	qword [esp][m
[31m-|// TMPQ overlaps TMP1/TMP2. ARG5/MULTRES overlap TMP1/TMP2 (and TMPQ).[m
[31m-|.define TMPQ,		qword [esp+aword*4][m
[31m-|.define TMP3,		ARG4[m
[31m-|.define ARG5,		TMP1[m
[31m-|.define TMPa,		TMP1[m
[31m-|.define MULTRES,	TMP2[m
[31m-|[m
[31m-|// Arguments for vm_call and vm_pcall.[m
[31m-|.define INARG_BASE,	SAVE_CFRAME		// Overwritten by SAVE_CFRAME![m
[31m-|[m
[31m-|// Arguments for vm_cpcall.[m
[31m-|.define INARG_CP_CALL,	SAVE_ERRF[m
[31m-|.define INARG_CP_UD,	SAVE_NRES[m
[31m-|.define INARG_CP_FUNC,	SAVE_CFRAME[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.elif X64WIN		// x64/Windows stack layout[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push rdi; push rsi; push rbx[m
[31m-|  sub rsp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push rbp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add rsp, CFRAME_SPACE[m
[31m-|  pop rbx; pop rsi; pop rdi; pop rbp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.define SAVE_CFRAME,	aword [rsp+aword*13][m
[31m-|.define SAVE_PC,	dword [rsp+dword*25][m
[31m-|.define SAVE_L,	dword [rsp+dword*24][m
[31m-|.define SAVE_ERRF,	dword [rsp+dword*23][m
[31m-|.define SAVE_NRES,	dword [rsp+dword*22][m
[31m-|.define TMP2,		dword [rsp+dword*21][m
[31m-|.define TMP1,		dword [rsp+dword*20][m
[31m-|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter[m
[31m-|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*8][m
[31m-|.define SAVE_R3,	aword [rsp+aword*7][m
[31m-|.define SAVE_R2,	aword [rsp+aword*6][m
[31m-|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.define ARG5,		aword [rsp+aword*4][m
[31m-|.define CSAVE_4,	aword [rsp+aword*3][m
[31m-|.define CSAVE_3,	aword [rsp+aword*2][m
[31m-|.define CSAVE_2,	aword [rsp+aword*1][m
[31m-|.define CSAVE_1,	aword [rsp]		//<-- rsp while in interpreter.[m
[31m-|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee[m
[31m-|[m
[31m-|// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ).[m
[31m-|.define TMPQ,		qword [rsp+aword*10][m
[31m-|.define MULTRES,	TMP2[m
[31m-|.define TMPa,		ARG5[m
[31m-|.define ARG5d,		dword [rsp+aword*4][m
[31m-|.define TMP3,		ARG5d[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.else			// x64/POSIX stack layout[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push rbx; push r15; push r14[m
[31m-|.if NO_UNWIND[m
[31m-|  push r13; push r12[m
[31m-|.endif[m
[31m-|  sub rsp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push rbp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add rsp, CFRAME_SPACE[m
[31m-|.if NO_UNWIND[m
[31m-|  pop r12; pop r13[m
[31m-|.endif[m
[31m-|  pop r14; pop r15; pop rbx; pop rbp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//----- 16 byte aligned,[m
[31m-|.if NO_UNWIND[m
[31m-|.define SAVE_RET,	aword [rsp+aword*11]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*10][m
[31m-|.define SAVE_R3,	aword [rsp+aword*9][m
[31m-|.define SAVE_R2,	aword [rsp+aword*8][m
[31m-|.define SAVE_R1,	aword [rsp+aword*7][m
[31m-|.define SAVE_RU2,	aword [rsp+aword*6][m
[31m-|.define SAVE_RU1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.else[m
[31m-|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*8][m
[31m-|.define SAVE_R3,	aword [rsp+aword*7][m
[31m-|.define SAVE_R2,	aword [rsp+aword*6][m
[31m-|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.endif[m
[31m-|.define SAVE_CFRAME,	aword [rsp+aword*4][m
[31m-|.define SAVE_PC,	dword [rsp+dword*7][m
[31m-|.define SAVE_L,	dword [rsp+dword*6][m
[31m-|.define SAVE_ERRF,	dword [rsp+dword*5][m
[31m-|.define SAVE_NRES,	dword [rsp+dword*4][m
[31m-|.define TMPa,		aword [rsp+aword*1][m
[31m-|.define TMP2,		dword [rsp+dword*1][m
[31m-|.define TMP1,		dword [rsp]		//<-- rsp while in interpreter.[m
[31m-|//----- 16 byte aligned[m
[31m-|[m
[31m-|// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ).[m
[31m-|.define TMPQ,		qword [rsp][m
[31m-|.define TMP3,		dword [rsp+aword*1][m
[31m-|.define MULTRES,	TMP2[m
[31m-|[m
[31m-|.endif[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Instruction headers.[m
[31m-|.macro ins_A; .endmacro[m
[31m-|.macro ins_AD; .endmacro[m
[31m-|.macro ins_AJ; .endmacro[m
[31m-|.macro ins_ABC; movzx RB, RCH; movzx RC, RCL; .endmacro[m
[31m-|.macro ins_AB_; movzx RB, RCH; .endmacro[m
[31m-|.macro ins_A_C; movzx RC, RCL; .endmacro[m
[31m-|.macro ins_AND; not RDa; .endmacro[m
[31m-|[m
[31m-|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster).[m
[31m-|.macro ins_NEXT[m
[31m-|  mov RC, [PC][m
[31m-|  movzx RA, RCH[m
[31m-|  movzx OP, RCL[m
[31m-|  add PC, 4[m
[31m-|  shr RC, 16[m
[31m-|.if X64[m
[31m-|  jmp aword [DISPATCH+OP*8][m
[31m-|.else[m
[31m-|  jmp aword [DISPATCH+OP*4][m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  // Around 10%-30% slower on Core2, a lot more slower on P4.[m
[31m-|  .macro ins_next[m
[31m-|    jmp ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, RB = LFUNC, RD = nargs+1, [BASE-4] = PC[m
[31m-|  mov PC, LFUNC:RB->pc[m
[31m-|  mov RA, [PC][m
[31m-|  movzx OP, RAL[m
[31m-|  movzx RA, RAH[m
[31m-|  add PC, 4[m
[31m-|.if X64[m
[31m-|  jmp aword [DISPATCH+OP*8][m
[31m-|.else[m
[31m-|  jmp aword [DISPATCH+OP*4][m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[31m-|  mov [BASE-4], PC[m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to test operand types.[m
[31m-|.macro checktp, reg, tp;  cmp dword [BASE+reg*8+4], tp; .endmacro[m
[31m-|.macro checknum, reg, target; checktp reg, LJ_TISNUM; jae target; .endmacro[m
[31m-|.macro checkint, reg, target; checktp reg, LJ_TISNUM; jne target; .endmacro[m
[31m-|.macro checkstr, reg, target; checktp reg, LJ_TSTR; jne target; .endmacro[m
[31m-|.macro checktab, reg, target; checktp reg, LJ_TTAB; jne target; .endmacro[m
[31m-|[m
[31m-|// These operands must be used with movzx.[m
[31m-|.define PC_OP, byte [PC-4][m
[31m-|.define PC_RA, byte [PC-3][m
[31m-|.define PC_RB, byte [PC-1][m
[31m-|.define PC_RC, byte [PC-2][m
[31m-|.define PC_RD, word [PC-2][m
[31m-|[m
[31m-|.macro branchPC, reg[m
[31m-|  lea PC, [PC+reg*4-BCBIAS_J*4][m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|// Decrement hashed hotcount and trigger trace recorder if zero.[m
[31m-|.macro hotloop, reg[m
[31m-|  mov reg, PC[m
[31m-|  shr reg, 1[m
[31m-|  and reg, HOTCOUNT_PCMASK[m
[31m-|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP[m
[31m-|  jb ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall, reg[m
[31m-|  mov reg, PC[m
[31m-|  shr reg, 1[m
[31m-|  and reg, HOTCOUNT_PCMASK[m
[31m-|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL[m
[31m-|  jb ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state.[m
[31m-|.macro set_vmstate, st[m
[31m-|  mov dword [DISPATCH+DISPATCH_GL(vmstate)], ~LJ_VMST_..st[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// x87 compares.[m
[31m-|.macro fcomparepp			// Compare and pop st0 >< st1.[m
[31m-|  fucomip st1[m
[31m-|  fpop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro fpop1; fstp st1; .endmacro[m
[31m-|[m
[31m-|// Synthesize SSE FP constants.[m
[31m-|.macro sseconst_abs, reg, tmp		// Synthesize abs mask.[m
[31m-|.if X64[m
[31m-|  mov64 tmp, U64x(7fffffff,ffffffff); movd reg, tmp[m
[31m-|.else[m
[31m-|  pxor reg, reg; pcmpeqd reg, reg; psrlq reg, 1[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro sseconst_hi, reg, tmp, val	// Synthesize hi-32 bit const.[m
[31m-|.if X64[m
[31m-|  mov64 tmp, U64x(val,00000000); movd reg, tmp[m
[31m-|.else[m
[31m-|  mov tmp, 0x .. val; movd reg, tmp; pshufd reg, reg, 0x51[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro sseconst_sign, reg, tmp		// Synthesize sign mask.[m
[31m-|  sseconst_hi reg, tmp, 80000000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_1, reg, tmp		// Synthesize 1.0.[m
[31m-|  sseconst_hi reg, tmp, 3ff00000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_m1, reg, tmp		// Synthesize -1.0.[m
[31m-|  sseconst_hi reg, tmp, bff00000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_2p52, reg, tmp		// Synthesize 2^52.[m
[31m-|  sseconst_hi reg, tmp, 43300000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_tobit, reg, tmp	// Synthesize 2^52 + 2^51.[m
[31m-|  sseconst_hi reg, tmp, 43380000[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites reg.[m
[31m-|.macro barrierback, tab, reg[m
[31m-|  and byte tab->marked, (uint8_t)~LJ_GC_BLACK	// black2gray(tab)[m
[31m-|  mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)][m
[31m-|  mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab[m
[31m-|  mov tab->gclist, reg[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  test PC, FRAME_P[m
[31m-  |  jz ->cont_dispatch[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  and PC, -8[m
[31m-  |  sub BASE, PC			// Restore caller base.[m
[31m-  |  lea RAa, [RA+PC-8]			// Rebase RA and prepend one result.[m
[31m-  |  mov PC, [BASE-4]			// Fetch PC of previous frame.[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |  mov dword [BASE+RA+4], LJ_TTRUE	// Prepend true to results.[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  add RD, 1				// RD = nresults+1[m
[31m-  |  jz ->vm_unwind_yield[m
[31m-  |  mov MULTRES, RD[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return[m
[31m-  |  xor PC, FRAME_C[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jnz ->vm_returnp[m
[31m-  |[m
[31m-  |  // Return to C.[m
[31m-  |  set_vmstate C[m
[31m-  |  and PC, -8[m
[31m-  |  sub PC, BASE[m
[31m-  |  neg PC				// Previous base = BASE - delta.[m
[31m-  |[m
[31m-  |  sub RD, 1[m
[31m-  |  jz >2[m
[31m-  |1:  // Move results down.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [BASE+RA][m
[31m-  |  mov [BASE-8], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [BASE+RA][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  mov RB, [BASE+RA+4][m
[31m-  |  mov [BASE-4], RB[m
[31m-  |.endif[m
[31m-  |  add BASE, 8[m
[31m-  |  sub RD, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, PC[m
[31m-  |3:[m
[31m-  |  mov RD, MULTRES[m
[31m-  |  mov RA, SAVE_NRES			// RA = wanted nresults+1[m
[31m-  |4:[m
[31m-  |  cmp RA, RD[m
[31m-  |  jne >6				// More/less results wanted?[m
[31m-  |5:[m
[31m-  |  sub BASE, 8[m
[31m-  |  mov L:RB->top, BASE[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  mov RAa, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |  mov L:RB->cframe, RAa[m
[31m-  |  xor eax, eax			// Ok return status for vm_pcall.[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  jb >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  cmp BASE, L:RB->maxstack[m
[31m-  |  ja >8[m
[31m-  |  mov dword [BASE-4], LJ_TNIL[m
[31m-  |  add BASE, 8[m
[31m-  |  add RD, 1[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  test RA, RA[m
[31m-  |  jz <5				// But check for LUA_MULTRET+1.[m
[31m-  |  sub RA, RD				// Negative result![m
[31m-  |  lea BASE, [BASE+RA*8]		// Correct top.[m
[31m-  |  jmp <5[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  mov L:RB->top, BASE		// Save current top held in BASE (yes).[m
[31m-  |  mov MULTRES, RD			// Need to fill only remainder with nil.[m
[31m-  |  mov FCARG2, RA[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->top		// Need the (realloced) L->top in BASE.[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->vm_unwind_yield:[m
[31m-  |  mov al, LUA_YIELD[m
[31m-  |  jmp ->vm_unwind_c_eh[m
[31m-  |[m
[31m-  |->vm_unwind_c@8:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |.if X64[m
[31m-  |  mov eax, CARG2d			// Error return status for vm_pcall.[m
[31m-  |  mov rsp, CARG1[m
[31m-  |.else[m
[31m-  |  mov eax, FCARG2			// Error return status for vm_pcall.[m
[31m-  |  mov esp, FCARG1[m
[31m-  |.endif[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov GL:RB, L:RB->glref[m
[31m-  |  mov dword GL:RB->vmstate, ~LJ_VMST_C[m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_rethrow:[m
[31m-  |.if X64 and not X64WIN[m
[31m-  |  mov FCARG1, SAVE_L[m
[31m-  |  mov FCARG2, eax[m
[31m-  |  restoreregs[m
[31m-  |  jmp extern lj_err_throw@8		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_unwind_ff@4:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |.if X64[m
[31m-  |  and CARG1, CFRAME_RAWMASK[m
[31m-  |  mov rsp, CARG1[m
[31m-  |.else[m
[31m-  |  and FCARG1, CFRAME_RAWMASK[m
[31m-  |  mov esp, FCARG1[m
[31m-  |.endif[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov RAa, -8			// Results start at BASE+RA = BASE-8.[m
[31m-  |  mov RD, 1+1			// Really 1+2 results, incr. later.[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov PC, [BASE-4]			// Fetch PC of previous frame.[m
[31m-  |  mov dword [BASE-4], LJ_TFALSE	// Prepend false to error message.[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  jmp ->vm_returnc			// Increments RD/MULTRES and returns.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  mov FCARG2, LUA_MINSTACK[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vm_growstack_v:			// Grow stack for vararg Lua function.[m
[31m-  |  sub RD, 8[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_growstack_f:			// Grow stack for fixarg Lua function.[m
[31m-  |  // BASE = new base, RD = nargs+1, RB = L, PC = first PC[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |1:[m
[31m-  |  movzx RA, byte [PC-4+PC2PROTO(framesize)][m
[31m-  |  add PC, 4				// Must point after first instruction.[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  mov FCARG2, RA[m
[31m-  |2:[m
[31m-  |  // RB = L, L->base = new base, L->top = top[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  mov LFUNC:RB, [BASE-8][m
[31m-  |  sub RD, BASE[m
[31m-  |  shr RD, 3[m
[31m-  |  add NARGS:RD, 1[m
[31m-  |  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[31m-  |  mov SAVE_L, CARG1d[m
[31m-  |  mov RA, CARG2d[m
[31m-  |.else[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov RA, INARG_BASE			// Caveat: overlaps SAVE_CFRAME![m
[31m-  |.endif[m
[31m-  |  mov PC, FRAME_CP[m
[31m-  |  xor RD, RD[m
[31m-  |  lea KBASEa, [esp+CFRAME_RESUME][m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov SAVE_PC, RD			// Any value outside of bytecode is ok.[m
[31m-  |  mov SAVE_CFRAME, RDa[m
[31m-  |.if X64[m
[31m-  |  mov SAVE_NRES, RD[m
[31m-  |  mov SAVE_ERRF, RD[m
[31m-  |.endif[m
[31m-  |  mov L:RB->cframe, KBASEa[m
[31m-  |  cmp byte L:RB->status, RDL[m
[31m-  |  je >2				// Initial resume (like a call).[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov byte L:RB->status, RDL[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, RA[m
[31m-  |  shr RD, 3[m
[31m-  |  add RD, 1				// RD = nresults+1[m
[31m-  |  sub RA, BASE			// RA = resultofs[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov MULTRES, RD[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, FRAME_CP[m
[31m-  |.if X64[m
[31m-  |  mov SAVE_ERRF, CARG4d[m
[31m-  |.endif[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |.if X64[m
[31m-  |  mov SAVE_NRES, CARG3d[m
[31m-  |  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[31m-  |  mov SAVE_L, CARG1d[m
[31m-  |  mov RA, CARG2d[m
[31m-  |.else[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov RA, INARG_BASE			// Caveat: overlaps SAVE_CFRAME![m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  mov KBASEa, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASEa[m
[31m-  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |.if X64[m
[31m-  |  mov L:RB->cframe, rsp[m
[31m-  |.else[m
[31m-  |  mov L:RB->cframe, esp[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |2:  // Entry point for vm_resume/vm_cpcall (RA = base, RB = L, PC = ftype).[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov BASE, L:RB->base		// BASE = old base (used in vmeta_call).[m
[31m-  |  add PC, RA[m
[31m-  |  sub PC, BASE			// PC = frame delta + frame type[m
[31m-  |[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, RA[m
[31m-  |  shr NARGS:RD, 3[m
[31m-  |  add NARGS:RD, 1			// RD = nargs+1[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  mov LFUNC:RB, [RA-8][m
[31m-  |  cmp dword [RA-4], LJ_TFUNC[m
[31m-  |  jne ->vmeta_call			// Ensure KBASE defined and != BASE.[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  mov BASE, RA[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, RB = func, RD = nargs+1, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[31m-  |  mov SAVE_L, CARG1d[m
[31m-  |.else[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  // Caveat: INARG_CP_* and SAVE_CFRAME/SAVE_NRES/SAVE_ERRF overlap![m
[31m-  |  mov RC, INARG_CP_UD		// Get args before they are overwritten.[m
[31m-  |  mov RA, INARG_CP_FUNC[m
[31m-  |  mov BASE, INARG_CP_CALL[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[31m-  |[m
[31m-  |  mov KBASE, L:RB->stack		// Compute -savestack(L, L->top).[m
[31m-  |  sub KBASE, L:RB->top[m
[31m-  |   mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  mov SAVE_ERRF, 0			// No error function.[m
[31m-  |  mov SAVE_NRES, KBASE		// Neg. delta means cframe w/o frame.[m
[31m-  |   add DISPATCH, GG_G2DISP[m
[31m-  |  // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe).[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |  mov KBASEa, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASEa[m
[31m-  |  mov L:RB->cframe, rsp[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |[m
[31m-  |  call CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |.else[m
[31m-  |  mov ARG3, RC			// Have to copy args downwards.[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |[m
[31m-  |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASE[m
[31m-  |  mov L:RB->cframe, esp[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |[m
[31m-  |  call BASE			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |.endif[m
[31m-  |  // TValue * (new base) or NULL returned in eax (RC).[m
[31m-  |  test RC, RC[m
[31m-  |  jz ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |  mov RA, RC[m
[31m-  |  mov PC, FRAME_CP[m
[31m-  |  jmp <2				// Else continue with the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultofs, RD = nresults+1 (also in MULTRES)[m
[31m-  |  add RA, BASE[m
[31m-  |  and PC, -8[m
[31m-  |  mov RB, BASE[m
[31m-  |  sub BASE, PC			// Restore caller BASE.[m
[31m-  |  mov dword [RA+RD*8-4], LJ_TNIL	// Ensure one valid arg.[m
[31m-  |  mov RC, RA				// ... in [RC][m
[31m-  |  mov PC, [RB-12]			// Restore PC from [cont|PC].[m
[31m-  |.if X64[m
[31m-  |  movsxd RAa, dword [RB-16]		// May be negative on WIN64 with debug.[m
[31m-  |.if FFI[m
[31m-  |  cmp RA, 1[m
[31m-  |  jbe >1[m
[31m-  |.endif[m
[31m-  |  lea KBASEa, qword [=>0][m
[31m-  |  add RAa, KBASEa[m
[31m-  |.else[m
[31m-  |  mov RA, dword [RB-16][m
[31m-  |.if FFI[m
[31m-  |  cmp RA, 1[m
[31m-  |  jbe >1[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |  mov LFUNC:KBASE, [BASE-8][m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  // BASE = base, RC = result, RB = meta base[m
[31m-  |  jmp RAa				// Jump to continuation.[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  je ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: Tail call from C function.[m
[31m-  |  sub RB, BASE[m
[31m-  |  shr RB, 3[m
[31m-  |  lea RD, [RB-1][m
[31m-  |  jmp ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// BASE = base, RC = result, RB = mbase[m
[31m-  |  movzx RA, PC_RB[m
[31m-  |  sub RB, 16[m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |  sub RA, RB[m
[31m-  |  je ->cont_ra[m
[31m-  |  neg RA[m
[31m-  |  shr RA, 3[m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3d, RA[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE[m
[31m-  |  mov RCa, [RC][m
[31m-  |  mov [RB], RCa[m
[31m-  |  mov CARG2d, RB[m
[31m-  |.elif X64[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE[m
[31m-  |  mov CARG3d, RA[m
[31m-  |  mov RAa, [RC][m
[31m-  |  mov [RB], RAa[m
[31m-  |  mov CARG2d, RB[m
[31m-  |.else[m
[31m-  |  mov ARG3, RA[m
[31m-  |  mov RA, [RC+4][m
[31m-  |  mov RC, [RC][m
[31m-  |  mov [RB+4], RA[m
[31m-  |  mov [RB], RC[m
[31m-  |  mov ARG2, RB[m
[31m-  |.endif[m
[31m-  |  jmp ->BC_CAT_Z[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  mov TMP1, RC			// RC = GCstr *[m
[31m-  |  mov TMP2, LJ_TSTR[m
[31m-  |  lea RCa, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[31m-  |  cmp PC_OP, BC_GGET[m
[31m-  |  jne >1[m
[31m-  |  lea RA, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[31m-  |  mov [RA], TAB:RB			// RB = GCtab *[m
[31m-  |  mov dword [RA+4], LJ_TTAB[m
[31m-  |  mov RB, RA[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_tgetb:[m
[31m-  |  movzx RC, PC_RC[m
[31m-  |.if DUALNUM[m
[31m-  |  mov TMP2, LJ_TISNUM[m
[31m-  |  mov TMP1, RC[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RC[m
[31m-  |  movsd TMPQ, xmm0[m
[31m-  |.endif[m
[31m-  |  lea RCa, TMPQ			// Store temp. TValue in TMPQ.[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |  movzx RC, PC_RC			// Reload TValue *k from RC.[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  movzx RB, PC_RB			// Reload TValue *t from RB.[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |.if X64[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-  |  mov CARG2d, RB[m
[31m-  |  mov CARG3, RCa			// May be 64 bit ptr to stack.[m
[31m-  |  mov L:RB, L:CARG1d[m
[31m-  |.else[m
[31m-  |  mov ARG2, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RC[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz >3[m
[31m-  |->cont_ra:				// BASE = base, RC = result[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RC][m
[31m-  |  mov [BASE+RA*8], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RC+4][m
[31m-  |  mov RC, [RC][m
[31m-  |  mov [BASE+RA*8+4], RB[m
[31m-  |  mov [BASE+RA*8], RC[m
[31m-  |.endif[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  mov [RA-12], PC			// [cont|PC][m
[31m-  |  lea PC, [RA+FRAME_CONT][m
[31m-  |  sub PC, BASE[m
[31m-  |  mov LFUNC:RB, [RA-8]		// Guaranteed to be a function here.[m
[31m-  |  mov NARGS:RD, 2+1			// 2 args for func(t, k).[m
[31m-  |  jmp ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  mov FCARG1, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov FCARG2, RC			// Caveat: FCARG2 == BASE[m
[31m-  |  call extern lj_tab_getinth@8	// (GCtab *t, int32_t key)[m
[31m-  |  // cTValue * or NULL returned in eax (RC).[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  test RC, RC[m
[31m-  |  jnz ->BC_TGETR_Z[m
[31m-  |  mov dword [BASE+RA*8+4], LJ_TNIL[m
[31m-  |  jmp ->BC_TGETR2_Z[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  mov TMP1, RC			// RC = GCstr *[m
[31m-  |  mov TMP2, LJ_TSTR[m
[31m-  |  lea RCa, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[31m-  |  cmp PC_OP, BC_GSET[m
[31m-  |  jne >1[m
[31m-  |  lea RA, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[31m-  |  mov [RA], TAB:RB			// RB = GCtab *[m
[31m-  |  mov dword [RA+4], LJ_TTAB[m
[31m-  |  mov RB, RA[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_tsetb:[m
[31m-  |  movzx RC, PC_RC[m
[31m-  |.if DUALNUM[m
[31m-  |  mov TMP2, LJ_TISNUM[m
[31m-  |  mov TMP1, RC[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RC[m
[31m-  |  movsd TMPQ, xmm0[m
[31m-  |.endif[m
[31m-  |  lea RCa, TMPQ			// Store temp. TValue in TMPQ.[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  movzx RC, PC_RC			// Reload TValue *k from RC.[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  movzx RB, PC_RB			// Reload TValue *t from RB.[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |.if X64[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-  |  mov CARG2d, RB[m
[31m-  |  mov CARG3, RCa			// May be 64 bit ptr to stack.[m
[31m-  |  mov L:RB, L:CARG1d[m
[31m-  |.else[m
[31m-  |  mov ARG2, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RC[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz >3[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [BASE+RA*8][m
[31m-  |  mov [RC], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [BASE+RA*8+4][m
[31m-  |  mov RA, [BASE+RA*8][m
[31m-  |  mov [RC+4], RB[m
[31m-  |  mov [RC], RA[m
[31m-  |.endif[m
[31m-  |->cont_nop:				// BASE = base, (RC = result)[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  mov [RA-12], PC			// [cont|PC][m
[31m-  |  movzx RC, PC_RA[m
[31m-  |  // Copy value to third argument.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [BASE+RC*8][m
[31m-  |  mov [RA+16], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [BASE+RC*8+4][m
[31m-  |  mov RC, [BASE+RC*8][m
[31m-  |  mov [RA+20], RB[m
[31m-  |  mov [RA+16], RC[m
[31m-  |.endif[m
[31m-  |  lea PC, [RA+FRAME_CONT][m
[31m-  |  sub PC, BASE[m
[31m-  |  mov LFUNC:RB, [RA-8]		// Guaranteed to be a function here.[m
[31m-  |  mov NARGS:RD, 3+1			// 3 args for func(t, k, v).[m
[31m-  |  jmp ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |.if X64WIN[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov CARG3d, RC[m
[31m-  |  mov L:CARG1d->base, BASE[m
[31m-  |  xchg CARG2d, TAB:RB		// Caveat: CARG2d == BASE.[m
[31m-  |.elif X64[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov CARG2d, TAB:RB[m
[31m-  |  mov L:CARG1d->base, BASE[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG3d, RC			// Caveat: CARG3d == BASE.[m
[31m-  |.else[m
[31m-  |  mov L:RA, SAVE_L[m
[31m-  |  mov ARG2, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov ARG3, RC[m
[31m-  |  mov ARG1, L:RA[m
[31m-  |  mov L:RA->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // TValue * returned in eax (RC).[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  jmp ->BC_TSETR_Z[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d == BASE.[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG3d, [BASE+RD*8][m
[31m-  |  lea CARG2d, [BASE+RA*8][m
[31m-  |.else[m
[31m-  |  lea CARG2d, [BASE+RA*8][m
[31m-  |  lea CARG3d, [BASE+RD*8][m
[31m-  |.endif[m
[31m-  |  mov CARG1d, L:RB			// Caveat: CARG1d/CARG4d == RA.[m
[31m-  |  movzx CARG4d, PC_OP[m
[31m-  |.else[m
[31m-  |  movzx RB, PC_OP[m
[31m-  |  lea RD, [BASE+RD*8][m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |  mov ARG4, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RD[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_comp	// (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |3:[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  cmp RC, 1[m
[31m-  |  ja ->vmeta_binop[m
[31m-  |4:[m
[31m-  |  lea PC, [PC+4][m
[31m-  |  jb >6[m
[31m-  |5:[m
[31m-  |  movzx RD, PC_RD[m
[31m-  |  branchPC RD[m
[31m-  |6:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_condt:			// BASE = base, RC = result[m
[31m-  |  add PC, 4[m
[31m-  |  cmp dword [RC+4], LJ_TISTRUECOND	// Branch if result is true.[m
[31m-  |  jb <5[m
[31m-  |  jmp <6[m
[31m-  |[m
[31m-  |->cont_condf:			// BASE = base, RC = result[m
[31m-  |  cmp dword [RC+4], LJ_TISTRUECOND	// Branch if result is false.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  sub PC, 4[m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3d, RD[m
[31m-  |  mov CARG4d, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d == BASE.[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG1d, L:RB			// Caveat: CARG1d == RA.[m
[31m-  |.elif X64[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG4d, RB			// Caveat: CARG4d == RA.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG3d == BASE.[m
[31m-  |  mov CARG3d, RD[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  mov ARG4, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RD[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_equal	// (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  sub PC, 4[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  mov FCARG2, dword [PC-4][m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_equal_cd@8	// (lua_State *L, BCIns ins)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  movzx CARG3d, PC_RD[m
[31m-  |  mov L:CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  movzx RD, PC_RD[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RD[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <6[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_vno:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RB, PC_RB[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  lea RC, [KBASE+RC*8][m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_arith_nvo:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RC, PC_RC[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  lea RC, [KBASE+RC*8][m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |  xchg RB, RC[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  lea RC, [BASE+RD*8][m
[31m-  |  mov RB, RC[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_arith_vvo:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RB, PC_RB[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3d, RB[m
[31m-  |  mov CARG4d, RC[m
[31m-  |  movzx RC, PC_OP[m
[31m-  |  mov ARG5d, RC[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d == BASE.[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG1d, L:RB			// Caveat: CARG1d == RA.[m
[31m-  |.elif X64[m
[31m-  |  movzx CARG5d, PC_OP[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG4d, RC			// Caveat: CARG4d == RA.[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE		// Caveat: CARG3d == BASE.[m
[31m-  |  mov CARG3d, RB[m
[31m-  |  mov L:RB, L:CARG1d[m
[31m-  |.else[m
[31m-  |  mov ARG3, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG4, RC[m
[31m-  |  movzx RC, PC_OP[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG5, RC[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_arith	// (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = base, RC = new base, stack = cont/func/o1/o2[m
[31m-  |  mov RA, RC[m
[31m-  |  sub RC, BASE[m
[31m-  |  mov [RA-12], PC			// [cont|PC][m
[31m-  |  lea PC, [RC+FRAME_CONT][m
[31m-  |  mov NARGS:RD, 2+1			// 2 args for func(o1, o2).[m
[31m-  |  jmp ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea FCARG2, [BASE+RD*8]		// Caveat: FCARG2 == BASE[m
[31m-  |  mov L:FCARG1, L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_len@8		// (lua_State *L, TValue *o)[m
[31m-  |  // NULL (retry) or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-#if LJ_52[m
[31m-  |  test RC, RC[m
[31m-  |  jne ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |  movzx RD, PC_RD[m
[31m-  |  mov TAB:FCARG1, [BASE+RD*8][m
[31m-  |  jmp ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  jmp ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call_ra:[m
[31m-  |  lea RA, [BASE+RA*8+8][m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs+1, PC = return[m
[31m-  |  mov TMP2, RA			// Save RA, RC for us.[m
[31m-  |  mov TMP1, NARGS:RD[m
[31m-  |  sub RA, 8[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  lea CARG3d, [RA+NARGS:RD*8][m
[31m-  |  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[31m-  |.else[m
[31m-  |  lea RC, [RA+NARGS:RD*8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG3, RC[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE		// This is the callers base![m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RA, TMP2[m
[31m-  |  mov NARGS:RD, TMP1[m
[31m-  |  mov LFUNC:RB, [RA-8][m
[31m-  |  add NARGS:RD, 1[m
[31m-  |  // This is fragile. L->base must not move, KBASE must always be defined.[m
[31m-  |  cmp KBASE, BASE			// Continue with CALLT if flag set.[m
[31m-  |  je ->BC_CALLT_Z[m
[31m-  |  mov BASE, RA[m
[31m-  |  ins_call				// Otherwise call resolved metamethod.[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG2, RA			// Caveat: FCARG2 == BASE[m
[31m-  |  mov L:FCARG1, L:RB			// Caveat: FCARG1 == RA[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_for@8	// (lua_State *L, TValue *base)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RC, [PC-4][m
[31m-  |  movzx RA, RCH[m
[31m-  |  movzx OP, RCL[m
[31m-  |  shr RC, 16[m
[31m-  |.if X64[m
[31m-  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Retry FORI or JFORI.[m
[31m-  |.else[m
[31m-  |  jmp aword [DISPATCH+OP*4+GG_DISP2STATIC]	// Retry FORI or JFORI.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmp NARGS:RD, 1+1;  jb ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmp NARGS:RD, 2+1;  jb ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nsse, name, op[m
[31m-  |  .ffunc_1 name[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  op xmm0, qword [BASE][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nsse, name[m
[31m-  |  .ffunc_nsse name, movsd[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nnsse, name[m
[31m-  |  .ffunc_2 name[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  movsd xmm1, qword [BASE+8][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nnr, name[m
[31m-  |  .ffunc_2 name[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  fld qword [BASE+8][m
[31m-  |  fld qword [BASE][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses label 1.[m
[31m-  |.macro ffgccheck[m
[31m-  |  mov RB, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-  |  cmp RB, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-  |  jb >1[m
[31m-  |  call ->fff_gcstep[m
[31m-  |1:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |  cmp RB, LJ_TISTRUECOND;  jae ->fff_fallback[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov MULTRES, RD[m
[31m-  |  mov [BASE-4], RB[m
[31m-  |  mov RB, [BASE][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  sub RD, 2[m
[31m-  |  jz >2[m
[31m-  |  mov RA, BASE[m
[31m-  |1:[m
[31m-  |  add RA, 8[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RA][m
[31m-  |  mov [RA-8], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RA+4][m
[31m-  |  mov [RA-4], RB[m
[31m-  |  mov RB, [RA][m
[31m-  |  mov [RA-8], RB[m
[31m-  |.endif[m
[31m-  |  sub RD, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  mov RD, MULTRES[m
[31m-  |  jmp ->fff_res_[m
[31m-  |[m
[31m-  |.ffunc_1 type[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |.if X64[m
[31m-  |  mov RA, RB[m
[31m-  |  sar RA, 15[m
[31m-  |  cmp RA, -2[m
[31m-  |  je >3[m
[31m-  |.endif[m
[31m-  |  mov RC, ~LJ_TNUMX[m
[31m-  |  not RB[m
[31m-  |  cmp RC, RB[m
[31m-  |  cmova RC, RB[m
[31m-  |2:[m
[31m-  |  mov CFUNC:RB, [BASE-8][m
[31m-  |  mov STR:RC, [CFUNC:RB+RC*8+((char *)(&((GCfuncC *)0)->upvalue))][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TSTR[m
[31m-  |  mov [BASE-8], STR:RC[m
[31m-  |  jmp ->fff_res1[m
[31m-  |.if X64[m
[31m-  |3:[m
[31m-  |  mov RC, ~LJ_TLIGHTUD[m
[31m-  |  jmp <2[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  cmp RB, LJ_TTAB;  jne >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov TAB:RB, TAB:RB->metatable[m
[31m-  |2:[m
[31m-  |  test TAB:RB, TAB:RB[m
[31m-  |  mov dword [BASE-4], LJ_TNIL[m
[31m-  |  jz ->fff_res1[m
[31m-  |  mov STR:RC, [DISPATCH+DISPATCH_GL(gcroot)+4*(GCROOT_MMNAME+MM_metatable)][m
[31m-  |  mov dword [BASE-4], LJ_TTAB	// Store metatable as default result.[m
[31m-  |  mov [BASE-8], TAB:RB[m
[31m-  |  mov RA, TAB:RB->hmask[m
[31m-  |  and RA, STR:RC->hash[m
[31m-  |  imul RA, #NODE[m
[31m-  |  add NODE:RA, TAB:RB->node[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  cmp dword NODE:RA->key.it, LJ_TSTR[m
[31m-  |  jne >4[m
[31m-  |  cmp dword NODE:RA->key.gcr, STR:RC[m
[31m-  |  je >5[m
[31m-  |4:[m
[31m-  |  mov NODE:RA, NODE:RA->next[m
[31m-  |  test NODE:RA, NODE:RA[m
[31m-  |  jnz <3[m
[31m-  |  jmp ->fff_res1			// Not found, keep default result.[m
[31m-  |5:[m
[31m-  |  mov RB, [RA+4][m
[31m-  |  cmp RB, LJ_TNIL;  je ->fff_res1	// Ditto for nil value.[m
[31m-  |  mov RC, [RA][m
[31m-  |  mov [BASE-4], RB			// Return value of mt.__metatable.[m
[31m-  |  mov [BASE-8], RC[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  cmp RB, LJ_TUDATA;  je <1[m
[31m-  |.if X64[m
[31m-  |  cmp RB, LJ_TNUMX;  ja >8[m
[31m-  |  cmp RB, LJ_TISNUM;  jbe >7[m
[31m-  |  mov RB, LJ_TLIGHTUD[m
[31m-  |  jmp >8[m
[31m-  |7:[m
[31m-  |.else[m
[31m-  |  cmp RB, LJ_TISNUM;  ja >8[m
[31m-  |.endif[m
[31m-  |  mov RB, LJ_TNUMX[m
[31m-  |8:[m
[31m-  |  not RB[m
[31m-  |  mov TAB:RB, [DISPATCH+RB*4+DISPATCH_GL(gcroot[GCROOT_BASEMT])][m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  cmp dword TAB:RB->metatable, 0;  jne ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |  mov TAB:RC, [BASE+8][m
[31m-  |  mov TAB:RB->metatable, TAB:RC[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TTAB		// Return original table.[m
[31m-  |  mov [BASE-8], TAB:RB[m
[31m-  |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-  |  jz >1[m
[31m-  |  // Possible write barrier. Table is black, but skip iswhite(mt) check.[m
[31m-  |  barrierback TAB:RB, RC[m
[31m-  |1:[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_2 rawget[m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |.if X64WIN[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  lea CARG3d, [BASE+8][m
[31m-  |  mov CARG2d, [BASE]			// Caveat: CARG2d == BASE.[m
[31m-  |  mov CARG1d, SAVE_L[m
[31m-  |.elif X64[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG2d, [BASE][m
[31m-  |  lea CARG3d, [BASE+8]		// Caveat: CARG3d == BASE.[m
[31m-  |  mov CARG1d, SAVE_L[m
[31m-  |.else[m
[31m-  |  mov TAB:RD, [BASE][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG2, TAB:RD[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  add BASE, 8[m
[31m-  |  mov ARG3, BASE[m
[31m-  |.endif[m
[31m-  |  call extern lj_tab_get	// (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // cTValue * returned in eax (RD).[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  // Copy table slot.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RD][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov [BASE-8], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RD][m
[31m-  |  mov RD, [RD+4][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  mov [BASE-4], RD[m
[31m-  |.endif[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  cmp NARGS:RD, 1+1;  jne ->fff_fallback	// Exactly one argument.[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne >1[m
[31m-  |  mov RB, dword [BASE]; jmp ->fff_resi[m
[31m-  |1:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE]; jmp ->fff_resxmm0[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  cmp dword [BASE+4], LJ_TSTR;  jne >3[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  mov STR:RD, [BASE][m
[31m-  |2:[m
[31m-  |  mov dword [BASE-4], LJ_TSTR[m
[31m-  |  mov [BASE-8], STR:RD[m
[31m-  |  jmp ->fff_res1[m
[31m-  |3:  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM;  ja ->fff_fallback[m
[31m-  |  cmp dword [DISPATCH+DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])], 0[m
[31m-  |  jne ->fff_fallback[m
[31m-  |  ffgccheck				// Caveat: uses label 1.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |.if X64 and not X64WIN[m
[31m-  |  mov FCARG2, BASE			// Otherwise: FCARG2 == BASE[m
[31m-  |.endif[m
[31m-  |  mov L:FCARG1, L:RB[m
[31m-  |.if DUALNUM[m
[31m-  |  call extern lj_strfmt_number@8	// (lua_State *L, cTValue *o)[m
[31m-  |.else[m
[31m-  |  call extern lj_strfmt_num@8	// (lua_State *L, lua_Number *np)[m
[31m-  |.endif[m
[31m-  |  // GCstr returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 next[m
[31m-  |  je >2				// Missing 2nd arg?[m
[31m-  |1:[m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[31m-  |  mov L:RB->top, BASE		// Dummy frame length is ok.[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG3d, [BASE+8][m
[31m-  |  mov CARG2d, [BASE]			// Caveat: CARG2d == BASE.[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.elif X64[m
[31m-  |  mov CARG2d, [BASE][m
[31m-  |  lea CARG3d, [BASE+8]		// Caveat: CARG3d == BASE.[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  mov TAB:RD, [BASE][m
[31m-  |  mov ARG2, TAB:RD[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  add BASE, 8[m
[31m-  |  mov ARG3, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC			// Needed for ITERN fallback.[m
[31m-  |  call extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Flag returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RD, RD;  jz >3		// End of traversal?[m
[31m-  |  // Copy key and value to results.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [BASE+8][m
[31m-  |  mov RDa, [BASE+16][m
[31m-  |  mov [BASE-8], RBa[m
[31m-  |  mov [BASE], RDa[m
[31m-  |.else[m
[31m-  |  mov RB, [BASE+8][m
[31m-  |  mov RD, [BASE+12][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  mov [BASE-4], RD[m
[31m-  |  mov RB, [BASE+16][m
[31m-  |  mov RD, [BASE+20][m
[31m-  |  mov [BASE], RB[m
[31m-  |  mov [BASE+4], RD[m
[31m-  |.endif[m
[31m-  |->fff_res2:[m
[31m-  |  mov RD, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |2:  // Set missing 2nd arg to nil.[m
[31m-  |  mov dword [BASE+12], LJ_TNIL[m
[31m-  |  jmp <1[m
[31m-  |3:  // End of traversal: return nil.[m
[31m-  |  mov dword [BASE-4], LJ_TNIL[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  cmp dword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CFUNC:RB, [BASE-8][m
[31m-  |  mov CFUNC:RD, CFUNC:RB->upvalue[0][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TFUNC[m
[31m-  |  mov [BASE-8], CFUNC:RD[m
[31m-  |  mov dword [BASE+12], LJ_TNIL[m
[31m-  |  mov RD, 1+3[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_2 ipairs_aux[m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |.if DUALNUM[m
[31m-  |  mov RD, dword [BASE+8][m
[31m-  |  add RD, 1[m
[31m-  |  mov dword [BASE-4], LJ_TISNUM[m
[31m-  |  mov dword [BASE-8], RD[m
[31m-  |.else[m
[31m-  |  movsd xmm0, qword [BASE+8][m
[31m-  |  sseconst_1 xmm1, RBa[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  cvttsd2si RD, xmm0[m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |.endif[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  cmp RD, TAB:RB->asize;  jae >2	// Not in array part?[m
[31m-  |  shl RD, 3[m
[31m-  |  add RD, TAB:RB->array[m
[31m-  |1:[m
[31m-  |  cmp dword [RD+4], LJ_TNIL;  je ->fff_res0[m
[31m-  |  // Copy array slot.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RD][m
[31m-  |  mov [BASE], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RD][m
[31m-  |  mov RD, [RD+4][m
[31m-  |  mov [BASE], RB[m
[31m-  |  mov [BASE+4], RD[m
[31m-  |.endif[m
[31m-  |  jmp ->fff_res2[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  cmp dword TAB:RB->hmask, 0; je ->fff_res0[m
[31m-  |  mov FCARG1, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov FCARG2, RD			// Caveat: FCARG2 == BASE[m
[31m-  |  call extern lj_tab_getinth@8	// (GCtab *t, int32_t key)[m
[31m-  |  // cTValue * or NULL returned in eax (RD).[m
[31m-  |  mov BASE, RB[m
[31m-  |  test RD, RD[m
[31m-  |  jnz <1[m
[31m-  |->fff_res0:[m
[31m-  |  mov RD, 1+0[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  cmp dword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CFUNC:RB, [BASE-8][m
[31m-  |  mov CFUNC:RD, CFUNC:RB->upvalue[0][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TFUNC[m
[31m-  |  mov [BASE-8], CFUNC:RD[m
[31m-  |.if DUALNUM[m
[31m-  |  mov dword [BASE+12], LJ_TISNUM[m
[31m-  |  mov dword [BASE+8], 0[m
[31m-  |.else[m
[31m-  |  xorps xmm0, xmm0[m
[31m-  |  movsd qword [BASE+8], xmm0[m
[31m-  |.endif[m
[31m-  |  mov RD, 1+3[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 pcall[m
[31m-  |  lea RA, [BASE+8][m
[31m-  |  sub NARGS:RD, 1[m
[31m-  |  mov PC, 8+FRAME_PCALL[m
[31m-  |1:[m
[31m-  |  movzx RB, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  shr RB, HOOK_ACTIVE_SHIFT[m
[31m-  |  and RB, 1[m
[31m-  |  add PC, RB				// Remember active hook before pcall.[m
[31m-  |  jmp ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc_2 xpcall[m
[31m-  |  cmp dword [BASE+12], LJ_TFUNC;  jne ->fff_fallback[m
[31m-  |  mov RB, [BASE+4]			// Swap function and traceback.[m
[31m-  |  mov [BASE+12], RB[m
[31m-  |  mov dword [BASE+4], LJ_TFUNC[m
[31m-  |  mov LFUNC:RB, [BASE][m
[31m-  |  mov PC, [BASE+8][m
[31m-  |  mov [BASE+8], LFUNC:RB[m
[31m-  |  mov [BASE], PC[m
[31m-  |  lea RA, [BASE+16][m
[31m-  |  sub NARGS:RD, 2[m
[31m-  |  mov PC, 16+FRAME_PCALL[m
[31m-  |  jmp <1[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  mov L:RB, [BASE][m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  mov CFUNC:RB, [BASE-8][m
[31m-  |  mov L:RB, CFUNC:RB->upvalue[0].gcr[m
[31m-  |.endif[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |.if X64[m
[31m-  |  mov TMP1, L:RB[m
[31m-  |.else[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |.endif[m
[31m-  |.if resume[m
[31m-  |  cmp dword [BASE+4], LJ_TTHREAD;  jne ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  cmp aword L:RB->cframe, 0; jne ->fff_fallback[m
[31m-  |  cmp byte L:RB->status, LUA_YIELD;  ja ->fff_fallback[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  je >1				// Status != LUA_YIELD (i.e. 0)?[m
[31m-  |  cmp RA, L:RB->base			// Check for presence of initial func.[m
[31m-  |  je ->fff_fallback[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  lea PC, [RA+NARGS:RD*8-16]		// Check stack space (-1-thread).[m
[31m-  |.else[m
[31m-  |  lea PC, [RA+NARGS:RD*8-8]		// Check stack space (-1).[m
[31m-  |.endif[m
[31m-  |  cmp PC, L:RB->maxstack; ja ->fff_fallback[m
[31m-  |  mov L:RB->top, PC[m
[31m-  |[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if resume[m
[31m-  |  add BASE, 8			// Keep resumed thread in stack for GC.[m
[31m-  |.endif[m
[31m-  |  mov L:RB->top, BASE[m
[31m-  |.if resume[m
[31m-  |  lea RB, [BASE+NARGS:RD*8-24]	// RB = end of source for stack move.[m
[31m-  |.else[m
[31m-  |  lea RB, [BASE+NARGS:RD*8-16]	// RB = end of source for stack move.[m
[31m-  |.endif[m
[31m-  |  sub RBa, PCa			// Relative to PC.[m
[31m-  |[m
[31m-  |  cmp PC, RA[m
[31m-  |  je >3[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |.if X64[m
[31m-  |  mov RCa, [PC+RB][m
[31m-  |  mov [PC-8], RCa[m
[31m-  |.else[m
[31m-  |  mov RC, [PC+RB+4][m
[31m-  |  mov [PC-4], RC[m
[31m-  |  mov RC, [PC+RB][m
[31m-  |  mov [PC-8], RC[m
[31m-  |.endif[m
[31m-  |  sub PC, 8[m
[31m-  |  cmp PC, RA[m
[31m-  |  jne <2[m
[31m-  |3:[m
[31m-  |.if X64[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG1d, TMP1[m
[31m-  |.else[m
[31m-  |  mov ARG2, RA[m
[31m-  |  xor RA, RA[m
[31m-  |  mov ARG4, RA[m
[31m-  |  mov ARG3, RA[m
[31m-  |.endif[m
[31m-  |  call ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |.if X64[m
[31m-  |  mov L:PC, TMP1[m
[31m-  |.else[m
[31m-  |  mov L:PC, ARG1			// The callee doesn't modify SAVE_L.[m
[31m-  |.endif[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |[m
[31m-  |  cmp eax, LUA_YIELD[m
[31m-  |  ja >8[m
[31m-  |4:[m
[31m-  |  mov RA, L:PC->base[m
[31m-  |  mov KBASE, L:PC->top[m
[31m-  |  mov L:PC->top, RA			// Clear coroutine stack.[m
[31m-  |  mov PC, KBASE[m
[31m-  |  sub PC, RA[m
[31m-  |  je >6				// No results?[m
[31m-  |  lea RD, [BASE+PC][m
[31m-  |  shr PC, 3[m
[31m-  |  cmp RD, L:RB->maxstack[m
[31m-  |  ja >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  mov RB, BASE[m
[31m-  |  sub RBa, RAa[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |.if X64[m
[31m-  |  mov RDa, [RA][m
[31m-  |  mov [RA+RB], RDa[m
[31m-  |.else[m
[31m-  |  mov RD, [RA][m
[31m-  |  mov [RA+RB], RD[m
[31m-  |  mov RD, [RA+4][m
[31m-  |  mov [RA+RB+4], RD[m
[31m-  |.endif[m
[31m-  |  add RA, 8[m
[31m-  |  cmp RA, KBASE[m
[31m-  |  jne <5[m
[31m-  |6:[m
[31m-  |.if resume[m
[31m-  |  lea RD, [PC+2]			// nresults+1 = 1 + true + results.[m
[31m-  |  mov dword [BASE-4], LJ_TTRUE	// Prepend true to results.[m
[31m-  |.else[m
[31m-  |  lea RD, [PC+1]			// nresults+1 = 1 + results.[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |  mov PC, SAVE_PC[m
[31m-  |  mov MULTRES, RD[m
[31m-  |.if resume[m
[31m-  |  mov RAa, -8[m
[31m-  |.else[m
[31m-  |  xor RA, RA[m
[31m-  |.endif[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  mov dword [BASE-4], LJ_TFALSE	// Prepend false to results.[m
[31m-  |  mov RA, L:PC->top[m
[31m-  |  sub RA, 8[m
[31m-  |  mov L:PC->top, RA			// Clear error from coroutine stack.[m
[31m-  |  // Copy error message.[m
[31m-  |.if X64[m
[31m-  |  mov RDa, [RA][m
[31m-  |  mov [BASE], RDa[m
[31m-  |.else[m
[31m-  |  mov RD, [RA][m
[31m-  |  mov [BASE], RD[m
[31m-  |  mov RD, [RA+4][m
[31m-  |  mov [BASE+4], RD[m
[31m-  |.endif[m
[31m-  |  mov RD, 1+2			// nresults+1 = 1 + false + error.[m
[31m-  |  jmp <7[m
[31m-  |.else[m
[31m-  |  mov FCARG2, L:PC[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_ffh_coroutine_wrap_err@8  // (lua_State *L, lua_State *co)[m
[31m-  |  // Error function does not return.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |.if X64[m
[31m-  |  mov L:RA, TMP1[m
[31m-  |.else[m
[31m-  |  mov L:RA, ARG1			// The callee doesn't modify SAVE_L.[m
[31m-  |.endif[m
[31m-  |  mov L:RA->top, KBASE		// Undo coroutine stack clearing.[m
[31m-  |  mov FCARG2, PC[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-  |.if X64[m
[31m-  |  mov L:PC, TMP1[m
[31m-  |.else[m
[31m-  |  mov L:PC, ARG1[m
[31m-  |.endif[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <4				// Retry the stack move.[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  test aword L:RB->cframe, CFRAME_RESUME[m
[31m-  |  jz ->fff_fallback[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  xor RD, RD[m
[31m-  |  mov aword L:RB->cframe, RDa[m
[31m-  |  mov al, LUA_YIELD[m
[31m-  |  mov byte L:RB->status, al[m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.if not DUALNUM[m
[31m-  |->fff_resi:  // Dummy.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->fff_resn:[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  fstp qword [BASE-8][m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |  .ffunc_1 math_abs[m
[31m-  |.if DUALNUM[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jne >2[m
[31m-  |  mov RB, dword [BASE][m
[31m-  |  cmp RB, 0; jns ->fff_resi[m
[31m-  |  neg RB; js >1[m
[31m-  |->fff_resbit:[m
[31m-  |->fff_resi:[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TISNUM[m
[31m-  |  mov dword [BASE-8], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |1:[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], 0x41e00000  // 2^31.[m
[31m-  |  mov dword [BASE-8], 0[m
[31m-  |  jmp ->fff_res1[m
[31m-  |2:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  sseconst_abs xmm1, RDa[m
[31m-  |  andps xmm0, xmm1[m
[31m-  |->fff_resxmm0:[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |  // fallthrough[m
[31m-  |[m
[31m-  |->fff_res1:[m
[31m-  |  mov RD, 1+1[m
[31m-  |->fff_res:[m
[31m-  |  mov MULTRES, RD[m
[31m-  |->fff_res_:[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jnz >7[m
[31m-  |5:[m
[31m-  |  cmp PC_RB, RDL			// More results expected?[m
[31m-  |  ja >6[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  not RAa				// Note: ~RA = -(RA+1)[m
[31m-  |  lea BASE, [BASE+RA*8]		// base = base - (RA+1)*8[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  mov dword [BASE+RD*8-12], LJ_TNIL[m
[31m-  |  add RD, 1[m
[31m-  |  jmp <5[m
[31m-  |[m
[31m-  |7:  // Non-standard return case.[m
[31m-  |  mov RAa, -8			// Results start at BASE+RA = BASE-8.[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |.define fff_resfp, fff_resxmm0[m
[31m-  |.else[m
[31m-  |.define fff_resfp, fff_resn[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.macro math_round, func[m
[31m-  |  .ffunc math_ .. func[m
[31m-  |.if DUALNUM[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jne >1[m
[31m-  |  mov RB, dword [BASE]; jmp ->fff_resi[m
[31m-  |1:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  call ->vm_ .. func .. _sse[m
[31m-  |.if DUALNUM[m
[31m-  |  cvttsd2si RB, xmm0[m
[31m-  |  cmp RB, 0x80000000[m
[31m-  |  jne ->fff_resi[m
[31m-  |  cvtsi2sd xmm1, RB[m
[31m-  |  ucomisd xmm0, xmm1[m
[31m-  |  jp ->fff_resxmm0[m
[31m-  |  je ->fff_resi[m
[31m-  |.endif[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |[m
[31m-  |.ffunc_nsse math_sqrt, sqrtsd; jmp ->fff_resxmm0[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  cmp NARGS:RD, 1+1; jne ->fff_fallback	// Exactly one argument.[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |.if not X64[m
[31m-  |  movsd FPARG1, xmm0[m
[31m-  |.endif[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern log[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resfp[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc_nsse math_ .. func[m
[31m-  |.if not X64[m
[31m-  |  movsd FPARG1, xmm0[m
[31m-  |.endif[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern func[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resfp[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nnsse math_ .. func[m
[31m-  |.if not X64[m
[31m-  |  movsd FPARG1, xmm0[m
[31m-  |  movsd FPARG3, xmm1[m
[31m-  |.endif[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern func[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resfp[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.ffunc_nnr math_ldexp;	fscale; fpop1;	jmp ->fff_resn[m
[31m-  |[m
[31m-  |.ffunc_1 math_frexp[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |  cmp RB, LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov RC, [BASE][m
[31m-  |  mov [BASE-4], RB; mov [BASE-8], RC[m
[31m-  |  shl RB, 1; cmp RB, 0xffe00000; jae >3[m
[31m-  |  or RC, RB; jz >3[m
[31m-  |  mov RC, 1022[m
[31m-  |  cmp RB, 0x00200000; jb >4[m
[31m-  |1:[m
[31m-  |  shr RB, 21; sub RB, RC		// Extract and unbias exponent.[m
[31m-  |  cvtsi2sd xmm0, RB[m
[31m-  |  mov RB, [BASE-4][m
[31m-  |  and RB, 0x800fffff			// Mask off exponent.[m
[31m-  |  or RB, 0x3fe00000			// Put mantissa in range [0.5,1) or 0.[m
[31m-  |  mov [BASE-4], RB[m
[31m-  |2:[m
[31m-  |  movsd qword [BASE], xmm0[m
[31m-  |  mov RD, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |3:  // Return +-0, +-Inf, NaN unmodified and an exponent of 0.[m
[31m-  |  xorps xmm0, xmm0; jmp <2[m
[31m-  |4:  // Handle denormals by multiplying with 2^54 and adjusting the bias.[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  sseconst_hi xmm1, RBa, 43500000  // 2^54.[m
[31m-  |  mulsd xmm0, xmm1[m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |  mov RB, [BASE-4]; mov RC, 1076; shl RB, 1; jmp <1[m
[31m-  |[m
[31m-  |.ffunc_nsse math_modf[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  shl RB, 1; cmp RB, 0xffe00000; je >4	// +-Inf?[m
[31m-  |  movaps xmm4, xmm0[m
[31m-  |  call ->vm_trunc_sse[m
[31m-  |  subsd xmm4, xmm0[m
[31m-  |1:[m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |  movsd qword [BASE], xmm4[m
[31m-  |  mov RC, [BASE-4]; mov RB, [BASE+4][m
[31m-  |  xor RC, RB; js >3				// Need to adjust sign?[m
[31m-  |2:[m
[31m-  |  mov RD, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |3:[m
[31m-  |  xor RB, 0x80000000; mov [BASE+4], RB	// Flip sign of fraction.[m
[31m-  |  jmp <2[m
[31m-  |4:[m
[31m-  |  xorps xmm4, xmm4; jmp <1			// Return +-Inf and +-0.[m
[31m-  |[m
[31m-  |.macro math_minmax, name, cmovop, sseop[m
[31m-  |  .ffunc name[m
[31m-  |  mov RA, 2[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne >4[m
[31m-  |  mov RB, dword [BASE][m
[31m-  |1:  // Handle integers.[m
[31m-  |  cmp RA, RD; jae ->fff_resi[m
[31m-  |  cmp dword [BASE+RA*8-4], LJ_TISNUM; jne >3[m
[31m-  |  cmp RB, dword [BASE+RA*8-8][m
[31m-  |  cmovop RB, dword [BASE+RA*8-8][m
[31m-  |  add RA, 1[m
[31m-  |  jmp <1[m
[31m-  |3:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  // Convert intermediate result to number and continue below.[m
[31m-  |  cvtsi2sd xmm0, RB[m
[31m-  |  jmp >6[m
[31m-  |4:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |5:  // Handle numbers or integers.[m
[31m-  |  cmp RA, RD; jae ->fff_resxmm0[m
[31m-  |  cmp dword [BASE+RA*8-4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jb >6[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  cvtsi2sd xmm1, dword [BASE+RA*8-8][m
[31m-  |  jmp >7[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |6:[m
[31m-  |  movsd xmm1, qword [BASE+RA*8-8][m
[31m-  |7:[m
[31m-  |  sseop xmm0, xmm1[m
[31m-  |  add RA, 1[m
[31m-  |  jmp <5[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, cmovg, minsd[m
[31m-  |  math_minmax math_max, cmovl, maxsd[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  cmp NARGS:RD, 1+1;  jne ->fff_fallback[m
[31m-  |  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  cmp dword STR:RB->len, 1[m
[31m-  |  jb ->fff_res0			// Return no results for empty string.[m
[31m-  |  movzx RB, byte STR:RB[1][m
[31m-  |.if DUALNUM[m
[31m-  |  jmp ->fff_resi[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RB; jmp ->fff_resxmm0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  cmp NARGS:RD, 1+1;  jne ->fff_fallback	// *Exactly* 1 arg.[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |  mov RB, dword [BASE][m
[31m-  |  cmp RB, 255;  ja ->fff_fallback[m
[31m-  |  mov TMP2, RB[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |  cvttsd2si RB, qword [BASE][m
[31m-  |  cmp RB, 255;  ja ->fff_fallback[m
[31m-  |  mov TMP2, RB[m
[31m-  |.endif[m
[31m-  |.if X64[m
[31m-  |  mov TMP3, 1[m
[31m-  |.else[m
[31m-  |  mov ARG3, 1[m
[31m-  |.endif[m
[31m-  |  lea RDa, TMP2			// Points to stack. Little-endian.[m
[31m-  |->fff_newstr:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if X64[m
[31m-  |  mov CARG3d, TMP3			// Zero-extended to size_t.[m
[31m-  |  mov CARG2, RDa			// May be 64 bit ptr to stack.[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  mov ARG2, RD[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // GCstr * returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TSTR[m
[31m-  |  mov [BASE-8], STR:RD[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  mov TMP2, -1[m
[31m-  |  cmp NARGS:RD, 1+2;  jb ->fff_fallback[m
[31m-  |  jna >1[m
[31m-  |  cmp dword [BASE+20], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |  mov RB, dword [BASE+16][m
[31m-  |  mov TMP2, RB[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |  cvttsd2si RB, qword [BASE+16][m
[31m-  |  mov TMP2, RB[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  mov TMP3, STR:RB[m
[31m-  |  mov RB, STR:RB->len[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RA, dword [BASE+8][m
[31m-  |.else[m
[31m-  |  cvttsd2si RA, qword [BASE+8][m
[31m-  |.endif[m
[31m-  |  mov RC, TMP2[m
[31m-  |  cmp RB, RC				// len < end? (unsigned compare)[m
[31m-  |  jb >5[m
[31m-  |2:[m
[31m-  |  test RA, RA			// start <= 0?[m
[31m-  |  jle >7[m
[31m-  |3:[m
[31m-  |  mov STR:RB, TMP3[m
[31m-  |  sub RC, RA				// start > end?[m
[31m-  |  jl ->fff_emptystr[m
[31m-  |  lea RB, [STR:RB+RA+#STR-1][m
[31m-  |  add RC, 1[m
[31m-  |4:[m
[31m-  |.if X64[m
[31m-  |  mov TMP3, RC[m
[31m-  |.else[m
[31m-  |  mov ARG3, RC[m
[31m-  |.endif[m
[31m-  |  mov RD, RB[m
[31m-  |  jmp ->fff_newstr[m
[31m-  |[m
[31m-  |5:  // Negative end or overflow.[m
[31m-  |  jl >6[m
[31m-  |  lea RC, [RC+RB+1]			// end = end+(len+1)[m
[31m-  |  jmp <2[m
[31m-  |6:  // Overflow.[m
[31m-  |  mov RC, RB				// end = len[m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |7:  // Negative start or underflow.[m
[31m-  |  je >8[m
[31m-  |  add RA, RB				// start = start+(len+1)[m
[31m-  |  add RA, 1[m
[31m-  |  jg <3				// start > 0?[m
[31m-  |8:  // Underflow.[m
[31m-  |  mov RA, 1				// start = 1[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->fff_emptystr:  // Range underflow.[m
[31m-  |  xor RC, RC				// Zero length. Any ptr in RB is ok.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc_1 string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |   lea SBUF:FCARG1, [DISPATCH+DISPATCH_GL(tmpbuf)][m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov STR:FCARG2, [BASE]		// Caveat: FCARG2 == BASE[m
[31m-  |   mov RC, SBUF:FCARG1->b[m
[31m-  |   mov SBUF:FCARG1->L, L:RB[m
[31m-  |   mov SBUF:FCARG1->p, RC[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_buf_putstr_ .. name .. @8[m
[31m-  |  mov FCARG1, eax[m
[31m-  |  call extern lj_buf_tostr@4[m
[31m-  |  jmp ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name, kind, fdef[m
[31m-  |  fdef name[m
[31m-  |.if kind == 2[m
[31m-  |  sseconst_tobit xmm1, RBa[m
[31m-  |.endif[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne >1[m
[31m-  |  mov RB, dword [BASE][m
[31m-  |.if kind > 0[m
[31m-  |  jmp >2[m
[31m-  |.else[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |.if kind < 2[m
[31m-  |  sseconst_tobit xmm1, RBa[m
[31m-  |.endif[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  movd RB, xmm0[m
[31m-  |2:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name, kind[m
[31m-  |  .ffunc_bit name, kind, .ffunc_1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit bit_tobit, 0[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name, 2[m
[31m-  |  mov TMP2, NARGS:RD			// Save for fallback.[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-16][m
[31m-  |1:[m
[31m-  |  cmp RD, BASE[m
[31m-  |  jbe ->fff_resbit[m
[31m-  |  cmp dword [RD+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne >2[m
[31m-  |  ins RB, dword [RD][m
[31m-  |  sub RD, 8[m
[31m-  |  jmp <1[m
[31m-  |2:[m
[31m-  |  ja ->fff_fallback_bit_op[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback_bit_op[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [RD][m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  movd RA, xmm0[m
[31m-  |  ins RB, RA[m
[31m-  |  sub RD, 8[m
[31m-  |  jmp <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op bit_band, and[m
[31m-  |.ffunc_bit_op bit_bor, or[m
[31m-  |.ffunc_bit_op bit_bxor, xor[m
[31m-  |[m
[31m-  |.ffunc_bit bit_bswap, 1[m
[31m-  |  bswap RB[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |[m
[31m-  |.ffunc_bit bit_bnot, 1[m
[31m-  |  not RB[m
[31m-  |.if DUALNUM[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.else[m
[31m-  |->fff_resbit:[m
[31m-  |  cvtsi2sd xmm0, RB[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->fff_fallback_bit_op:[m
[31m-  |  mov NARGS:RD, TMP2			// Restore for fallback[m
[31m-  |  jmp ->fff_fallback[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_bit name, 1, .ffunc_2[m
[31m-  |  // Note: no inline conversion from number for 2nd argument![m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM; jne ->fff_fallback[m
[31m-  |  mov RA, dword [BASE+8][m
[31m-  |.else[m
[31m-  |  .ffunc_nnsse name[m
[31m-  |  sseconst_tobit xmm2, RBa[m
[31m-  |  addsd xmm0, xmm2[m
[31m-  |  addsd xmm1, xmm2[m
[31m-  |  movd RB, xmm0[m
[31m-  |  movd RA, xmm1[m
[31m-  |.endif[m
[31m-  |  ins RB, cl				// Assumes RA is ecx.[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh bit_lshift, shl[m
[31m-  |.ffunc_bit_sh bit_rshift, shr[m
[31m-  |.ffunc_bit_sh bit_arshift, sar[m
[31m-  |.ffunc_bit_sh bit_rol, rol[m
[31m-  |.ffunc_bit_sh bit_ror, ror[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback_2:[m
[31m-  |  mov NARGS:RD, 1+2			// Other args are ignored, anyway.[m
[31m-  |  jmp ->fff_fallback[m
[31m-  |->fff_fallback_1:[m
[31m-  |  mov NARGS:RD, 1+1			// Other args are ignored, anyway.[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RD = nargs+1[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov PC, [BASE-4]			// Fallback may overwrite PC.[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  lea RA, [RD+8*LUA_MINSTACK]	// Ensure enough space for handler.[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov CFUNC:RD, [BASE-8][m
[31m-  |  cmp RA, L:RB->maxstack[m
[31m-  |  ja >5				// Need to grow stack.[m
[31m-  |.if X64[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |.endif[m
[31m-  |  call aword CFUNC:RD->f		// (lua_State *L)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |  test RD, RD;  jg ->fff_res		// Returned nresults+1?[m
[31m-  |1:[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  sub RA, BASE[m
[31m-  |  shr RA, 3[m
[31m-  |  test RD, RD[m
[31m-  |  lea NARGS:RD, [RA+1][m
[31m-  |  mov LFUNC:RB, [BASE-8][m
[31m-  |  jne ->vm_call_tail			// Returned -1?[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  mov RA, BASE[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jnz >3[m
[31m-  |  movzx RB, PC_RA[m
[31m-  |  not RBa				// Note: ~RB = -(RB+1)[m
[31m-  |  lea BASE, [BASE+RB*8]		// base = base - (RB+1)*8[m
[31m-  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |3:[m
[31m-  |  mov RB, PC[m
[31m-  |  and RB, -8[m
[31m-  |  sub BASE, RB[m
[31m-  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  mov FCARG2, LUA_MINSTACK[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  xor RD, RD				// Simulate a return 0.[m
[31m-  |  jmp <1				// Dumb retry (goes through ff first).[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RD = nargs+1[m
[31m-  |  pop RBa				// Must keep stack at same level.[m
[31m-  |  mov TMPa, RBa			// Save return address[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  call extern lj_gc_step@4		// (lua_State *L)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  shr RD, 3[m
[31m-  |  add NARGS:RD, 1[m
[31m-  |  mov RBa, TMPa[m
[31m-  |  push RBa				// Restore return address.[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_VMEVENT		// No recording while in vmevent.[m
[31m-  |  jnz >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |  test RDL, HOOK_ACTIVE[m
[31m-  |  jnz >1[m
[31m-  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  jz >1[m
[31m-  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  jnz >5[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  jnz >5[m
[31m-  |[m
[31m-  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  jz >5[m
[31m-  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[31m-  |  jz >1[m
[31m-  |  test RDL, LUA_MASKLINE[m
[31m-  |  jz >5[m
[31m-  |1:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG2, PC			// Caveat: FCARG2 == BASE[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  call extern lj_dispatch_ins@8	// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |4:[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |5:[m
[31m-  |  movzx OP, PC_OP[m
[31m-  |  movzx RD, PC_RD[m
[31m-  |.if X64[m
[31m-  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Re-dispatch to static ins.[m
[31m-  |.else[m
[31m-  |  jmp aword [DISPATCH+OP*4+GG_DISP2STATIC]	// Re-dispatch to static ins.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  add PC, 4[m
[31m-  |  mov RA, [RB-24][m
[31m-  |  mov MULTRES, RA			// Restore MULTRES for *M ins.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  mov LFUNC:RB, [BASE-8]		// Same as curr_topL(L).[m
[31m-  |  mov RB, LFUNC:RB->pc[m
[31m-  |  movzx RD, byte [RB+PC2PROTO(framesize)][m
[31m-  |  lea RD, [BASE+RD*8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov FCARG2, PC[m
[31m-  |  lea FCARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_trace_hot@8		// (jit_State *J, const BCIns *pc)[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |.if JIT[m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  or PC, 1				// Marker for hot call.[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov FCARG2, PC[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_dispatch_call@8	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // ASMFunction returned in eax/rax (RDa).[m
[31m-  |  mov SAVE_PC, 0			// Invalidate for subsequent line hook.[m
[31m-  |.if JIT[m
[31m-  |  and PC, -2[m
[31m-  |.endif[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RAa, RDa[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  mov RBa, RAa[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  shr RD, 3[m
[31m-  |  add NARGS:RD, 1[m
[31m-  |  jmp RBa[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // BASE = base, RC = result, RB = mbase[m
[31m-  |  mov TRACE:RA, [RB-24]		// Save previous trace.[m
[31m-  |  mov TMP1, TRACE:RA[m
[31m-  |  mov TMP3, DISPATCH			// Need one more register.[m
[31m-  |  mov DISPATCH, MULTRES[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  lea RA, [BASE+RA*8]		// Call base.[m
[31m-  |  sub DISPATCH, 1[m
[31m-  |  jz >2[m
[31m-  |1:  // Move results down.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RC][m
[31m-  |  mov [RA], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RC][m
[31m-  |  mov [RA], RB[m
[31m-  |  mov RB, [RC+4][m
[31m-  |  mov [RA+4], RB[m
[31m-  |.endif[m
[31m-  |  add RC, 8[m
[31m-  |  add RA, 8[m
[31m-  |  sub DISPATCH, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  movzx RC, PC_RA[m
[31m-  |  movzx RB, PC_RB[m
[31m-  |  add RC, RB[m
[31m-  |  lea RC, [BASE+RC*8-8][m
[31m-  |3:[m
[31m-  |  cmp RC, RA[m
[31m-  |  ja >9				// More results wanted?[m
[31m-  |[m
[31m-  |  mov DISPATCH, TMP3[m
[31m-  |  mov TRACE:RD, TMP1			// Get previous trace.[m
[31m-  |  movzx RB, word TRACE:RD->traceno[m
[31m-  |  movzx RD, word TRACE:RD->link[m
[31m-  |  cmp RD, RB[m
[31m-  |  je ->cont_nop			// Blacklisted.[m
[31m-  |  test RD, RD[m
[31m-  |  jne =>BC_JLOOP			// Jump to stitched trace.[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  mov [DISPATCH+DISPATCH_J(exitno)], RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG2, PC[m
[31m-  |  lea FCARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[31m-  |  call extern lj_dispatch_stitch@8	// (jit_State *J, const BCIns *pc)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp ->cont_nop[m
[31m-  |[m
[31m-  |9:  // Fill up results with nil.[m
[31m-  |  mov dword [RA+4], LJ_TNIL[m
[31m-  |  add RA, 8[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG2, PC			// Caveat: FCARG2 == BASE[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_dispatch_profile@8	// (lua_State *L, const BCIns *pc)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  sub PC, 4[m
[31m-  |  jmp ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Called from an exit stub with the exit number on the stack.[m
[31m-  |// The 16 bit exit number is stored with two (sign-extended) push imm8.[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |.if X64[m
[31m-  |  push r13; push r12[m
[31m-  |  push r11; push r10; push r9; push r8[m
[31m-  |  push rdi; push rsi; push rbp; lea rbp, [rsp+88]; push rbp[m
[31m-  |  push rbx; push rdx; push rcx; push rax[m
[31m-  |  movzx RC, byte [rbp-8]		// Reconstruct exit number.[m
[31m-  |  mov RCH, byte [rbp-16][m
[31m-  |  mov [rbp-8], r15; mov [rbp-16], r14[m
[31m-  |.else[m
[31m-  |  push ebp; lea ebp, [esp+12]; push ebp[m
[31m-  |  push ebx; push edx; push ecx; push eax[m
[31m-  |  movzx RC, byte [ebp-4]		// Reconstruct exit number.[m
[31m-  |  mov RCH, byte [ebp-8][m
[31m-  |  mov [ebp-4], edi; mov [ebp-8], esi[m
[31m-  |.endif[m
[31m-  |  // Caveat: DISPATCH is ebx.[m
[31m-  |  mov DISPATCH, [ebp][m
[31m-  |  mov RA, [DISPATCH+DISPATCH_GL(vmstate)]	// Get trace number.[m
[31m-  |  set_vmstate EXIT[m
[31m-  |  mov [DISPATCH+DISPATCH_J(exitno)], RC[m
[31m-  |  mov [DISPATCH+DISPATCH_J(parent)], RA[m
[31m-  |.if X64[m
[31m-  |.if X64WIN[m
[31m-  |  sub rsp, 16*8+4*8			// Room for SSE regs + save area.[m
[31m-  |.else[m
[31m-  |  sub rsp, 16*8			// Room for SSE regs.[m
[31m-  |.endif[m
[31m-  |  add rbp, -128[m
[31m-  |  movsd qword [rbp-8],   xmm15; movsd qword [rbp-16],  xmm14[m
[31m-  |  movsd qword [rbp-24],  xmm13; movsd qword [rbp-32],  xmm12[m
[31m-  |  movsd qword [rbp-40],  xmm11; movsd qword [rbp-48],  xmm10[m
[31m-  |  movsd qword [rbp-56],  xmm9;  movsd qword [rbp-64],  xmm8[m
[31m-  |  movsd qword [rbp-72],  xmm7;  movsd qword [rbp-80],  xmm6[m
[31m-  |  movsd qword [rbp-88],  xmm5;  movsd qword [rbp-96],  xmm4[m
[31m-  |  movsd qword [rbp-104], xmm3;  movsd qword [rbp-112], xmm2[m
[31m-  |  movsd qword [rbp-120], xmm1;  movsd qword [rbp-128], xmm0[m
[31m-  |.else[m
[31m-  |  sub esp, 8*8+16			// Room for SSE regs + args.[m
[31m-  |  movsd qword [ebp-40], xmm7; movsd qword [ebp-48], xmm6[m
[31m-  |  movsd qword [ebp-56], xmm5; movsd qword [ebp-64], xmm4[m
[31m-  |  movsd qword [ebp-72], xmm3; movsd qword [ebp-80], xmm2[m
[31m-  |  movsd qword [ebp-88], xmm1; movsd qword [ebp-96], xmm0[m
[31m-  |.endif[m
[31m-  |  // Caveat: RB is ebp.[m
[31m-  |  mov L:RB, [DISPATCH+DISPATCH_GL(cur_L)][m
[31m-  |  mov BASE, [DISPATCH+DISPATCH_GL(jit_base)][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG2, [rsp+4*8][m
[31m-  |.elif X64[m
[31m-  |  mov CARG2, rsp[m
[31m-  |.else[m
[31m-  |  lea FCARG2, [esp+16][m
[31m-  |.endif[m
[31m-  |  lea FCARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[31m-  |  call extern lj_trace_exit@8	// (jit_State *J, ExitState *ex)[m
[31m-  |  // MULTRES or negated error code returned in eax (RD).[m
[31m-  |  mov RAa, L:RB->cframe[m
[31m-  |  and RAa, CFRAME_RAWMASK[m
[31m-  |.if X64WIN[m
[31m-  |  // Reposition stack later.[m
[31m-  |.elif X64[m
[31m-  |  mov rsp, RAa			// Reposition stack to C frame.[m
[31m-  |.else[m
[31m-  |  mov esp, RAa			// Reposition stack to C frame.[m
[31m-  |.endif[m
[31m-  |  mov [RAa+CFRAME_OFS_L], L:RB	// Set SAVE_L (on-trace resume/yield).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov PC, [RAa+CFRAME_OFS_PC]	// Get SAVE_PC.[m
[31m-  |.if X64[m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |  // RD = MULTRES or negated error code, BASE, PC and DISPATCH set.[m
[31m-  |.if JIT[m
[31m-  |.if X64[m
[31m-  |  // Restore additional callee-save registers only used in compiled code.[m
[31m-  |.if X64WIN[m
[31m-  |  lea RAa, [rsp+9*16+4*8][m
[31m-  |1:[m
[31m-  |  movdqa xmm15, [RAa-9*16][m
[31m-  |  movdqa xmm14, [RAa-8*16][m
[31m-  |  movdqa xmm13, [RAa-7*16][m
[31m-  |  movdqa xmm12, [RAa-6*16][m
[31m-  |  movdqa xmm11, [RAa-5*16][m
[31m-  |  movdqa xmm10, [RAa-4*16][m
[31m-  |  movdqa xmm9, [RAa-3*16][m
[31m-  |  movdqa xmm8, [RAa-2*16][m
[31m-  |  movdqa xmm7, [RAa-1*16][m
[31m-  |  mov rsp, RAa			// Reposition stack to C frame.[m
[31m-  |  movdqa xmm6, [RAa][m
[31m-  |  mov r15, CSAVE_3[m
[31m-  |  mov r14, CSAVE_4[m
[31m-  |.else[m
[31m-  |  add rsp, 16			// Reposition stack to C frame.[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  mov r13, TMPa[m
[31m-  |  mov r12, TMPQ[m
[31m-  |.endif[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-  |.if X64[m
[31m-  |  mov FCARG1, SAVE_L[m
[31m-  |  mov L:FCARG1->base, BASE[m
[31m-  |  mov RB, RD     // Save RD[m
[31m-  |  mov TMP1, PC  // Save PC[m
[31m-  |  mov CARG3d, PC   // CARG3d == BASE[m
[31m-  |  mov FCARG2, dword [DISPATCH+DISPATCH_GL(vmstate)][m
[31m-  |  call extern lj_log_trace_direct_exit@8[m
[31m-  |  mov PC, TMP1[m
[31m-  |  mov RD, RB[m
[31m-  |  mov RB, SAVE_L[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |.endif[m
[31m-#endif[m
[31m-  |  test RD, RD; js >9			// Check for error from exit.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov MULTRES, RD[m
[31m-  |  mov LFUNC:KBASE, [BASE-8][m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  mov RC, [PC][m
[31m-  |  movzx RA, RCH[m
[31m-  |  movzx OP, RCL[m
[31m-  |  add PC, 4[m
[31m-  |  shr RC, 16[m
[31m-  |  cmp OP, BC_FUNCF			// Function header?[m
[31m-  |  jb >3[m
[31m-  |  cmp OP, BC_FUNCC+2			// Fast function?[m
[31m-  |  jae >4[m
[31m-  |2:[m
[31m-  |  mov RC, MULTRES			// RC/RD holds nres+1.[m
[31m-  |3:[m
[31m-  |.if X64[m
[31m-  |  jmp aword [DISPATCH+OP*8][m
[31m-  |.else[m
[31m-  |  jmp aword [DISPATCH+OP*4][m
[31m-  |.endif[m
[31m-  |[m
[31m-  |4:  // Check frame below fast function.[m
[31m-  |  mov RC, [BASE-4][m
[31m-  |  test RC, FRAME_TYPE[m
[31m-  |  jnz <2				// Trace stitching continuation?[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  movzx RC, byte [RC-3][m
[31m-  |  not RCa[m
[31m-  |  mov LFUNC:KBASE, [BASE+RC*8-8][m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  neg RD[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  mov FCARG2, RD[m
[31m-  |  call extern lj_err_throw@8		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP value rounding. Called by math.floor/math.ceil fast functions[m
[31m-  |// and from JIT code. arg/ret is xmm0. xmm0-xmm3 and RD (eax) modified.[m
[31m-  |.macro vm_round, name, mode, cond[m
[31m-  |->name:[m
[31m-  |.if not X64 and cond[m
[31m-  |  movsd xmm0, qword [esp+4][m
[31m-  |  call ->name .. _sse[m
[31m-  |  movsd qword [esp+4], xmm0  // Overwrite callee-owned arg.[m
[31m-  |  fld qword [esp+4][m
[31m-  |  ret[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->name .. _sse:[m
[31m-  |  sseconst_abs xmm2, RDa[m
[31m-  |  sseconst_2p52 xmm3, RDa[m
[31m-  |  movaps xmm1, xmm0[m
[31m-  |  andpd xmm1, xmm2			// |x|[m
[31m-  |  ucomisd xmm3, xmm1			// No truncation if 2^52 <= |x|.[m
[31m-  |  jbe >1[m
[31m-  |  andnpd xmm2, xmm0			// Isolate sign bit.[m
[31m-  |.if mode == 2		// trunc(x)?[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[31m-  |  subsd xmm1, xmm3[m
[31m-  |  sseconst_1 xmm3, RDa[m
[31m-  |  cmpsd xmm0, xmm1, 1		// |x| < result?[m
[31m-  |  andpd xmm0, xmm3[m
[31m-  |  subsd xmm1, xmm0			// If yes, subtract -1.[m
[31m-  |  orpd xmm1, xmm2			// Merge sign bit back in.[m
[31m-  |.else[m
[31m-  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[31m-  |  subsd xmm1, xmm3[m
[31m-  |  orpd xmm1, xmm2			// Merge sign bit back in.[m
[31m-  |  .if mode == 1		// ceil(x)?[m
[31m-  |    sseconst_m1 xmm2, RDa		// Must subtract -1 to preserve -0.[m
[31m-  |    cmpsd xmm0, xmm1, 6		// x > result?[m
[31m-  |  .else			// floor(x)?[m
[31m-  |    sseconst_1 xmm2, RDa[m
[31m-  |    cmpsd xmm0, xmm1, 1		// x < result?[m
[31m-  |  .endif[m
[31m-  |  andpd xmm0, xmm2[m
[31m-  |  subsd xmm1, xmm0			// If yes, subtract +-1.[m
[31m-  |.endif[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |1:[m
[31m-  |  ret[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  vm_round vm_floor, 0, 1[m
[31m-  |  vm_round vm_ceil,  1, JIT[m
[31m-  |  vm_round vm_trunc, 2, JIT[m
[31m-  |[m
[31m-  |// FP modulo x%y. Called by BC_MOD* and vm_arith.[m
[31m-  |->vm_mod:[m
[31m-  |// Args in xmm0/xmm1, return value in xmm0.[m
[31m-  |// Caveat: xmm0-xmm5 and RC (eax) modified![m
[31m-  |  movaps xmm5, xmm0[m
[31m-  |  divsd xmm0, xmm1[m
[31m-  |  sseconst_abs xmm2, RDa[m
[31m-  |  sseconst_2p52 xmm3, RDa[m
[31m-  |  movaps xmm4, xmm0[m
[31m-  |  andpd xmm4, xmm2			// |x/y|[m
[31m-  |  ucomisd xmm3, xmm4			// No truncation if 2^52 <= |x/y|.[m
[31m-  |  jbe >1[m
[31m-  |  andnpd xmm2, xmm0			// Isolate sign bit.[m
[31m-  |  addsd xmm4, xmm3			// (|x/y| + 2^52) - 2^52[m
[31m-  |  subsd xmm4, xmm3[m
[31m-  |  orpd xmm4, xmm2			// Merge sign bit back in.[m
[31m-  |  sseconst_1 xmm2, RDa[m
[31m-  |  cmpsd xmm0, xmm4, 1		// x/y < result?[m
[31m-  |  andpd xmm0, xmm2[m
[31m-  |  subsd xmm4, xmm0			// If yes, subtract 1.0.[m
[31m-  |  movaps xmm0, xmm5[m
[31m-  |  mulsd xmm1, xmm4[m
[31m-  |  subsd xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |1:[m
[31m-  |  mulsd xmm1, xmm0[m
[31m-  |  movaps xmm0, xmm5[m
[31m-  |  subsd xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |// Args in xmm0/eax. Ret in xmm0. xmm0-xmm1 and eax modified.[m
[31m-  |->vm_powi_sse:[m
[31m-  |  cmp eax, 1; jle >6			// i<=1?[m
[31m-  |  // Now 1 < (unsigned)i <= 0x80000000.[m
[31m-  |1:  // Handle leading zeros.[m
[31m-  |  test eax, 1; jnz >2[m
[31m-  |  mulsd xmm0, xmm0[m
[31m-  |  shr eax, 1[m
[31m-  |  jmp <1[m
[31m-  |2:[m
[31m-  |  shr eax, 1; jz >5[m
[31m-  |  movaps xmm1, xmm0[m
[31m-  |3:  // Handle trailing bits.[m
[31m-  |  mulsd xmm0, xmm0[m
[31m-  |  shr eax, 1; jz >4[m
[31m-  |  jnc <3[m
[31m-  |  mulsd xmm1, xmm0[m
[31m-  |  jmp <3[m
[31m-  |4:[m
[31m-  |  mulsd xmm0, xmm1[m
[31m-  |5:[m
[31m-  |  ret[m
[31m-  |6:[m
[31m-  |  je <5				// x^1 ==> x[m
[31m-  |  jb >7				// x^0 ==> 1[m
[31m-  |  neg eax[m
[31m-  |  call <1[m
[31m-  |  sseconst_1 xmm1, RDa[m
[31m-  |  divsd xmm1, xmm0[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |7:[m
[31m-  |  sseconst_1 xmm0, RDa[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// int lj_vm_cpuid(uint32_t f, uint32_t res[4])[m
[31m-  |->vm_cpuid:[m
[31m-  |.if X64[m
[31m-  |  mov eax, CARG1d[m
[31m-  |  .if X64WIN; push rsi; mov rsi, CARG2; .endif[m
[31m-  |  push rbx[m
[31m-  |  xor ecx, ecx[m
[31m-  |  cpuid[m
[31m-  |  mov [rsi], eax[m
[31m-  |  mov [rsi+4], ebx[m
[31m-  |  mov [rsi+8], ecx[m
[31m-  |  mov [rsi+12], edx[m
[31m-  |  pop rbx[m
[31m-  |  .if X64WIN; pop rsi; .endif[m
[31m-  |  ret[m
[31m-  |.else[m
[31m-  |  pushfd[m
[31m-  |  pop edx[m
[31m-  |  mov ecx, edx[m
[31m-  |  xor edx, 0x00200000		// Toggle ID bit in flags.[m
[31m-  |  push edx[m
[31m-  |  popfd[m
[31m-  |  pushfd[m
[31m-  |  pop edx[m
[31m-  |  xor eax, eax			// Zero means no features supported.[m
[31m-  |  cmp ecx, edx[m
[31m-  |  jz >1				// No ID toggle means no CPUID support.[m
[31m-  |  mov eax, [esp+4]			// Argument 1 is function number.[m
[31m-  |  push edi[m
[31m-  |  push ebx[m
[31m-  |  xor ecx, ecx[m
[31m-  |  cpuid[m
[31m-  |  mov edi, [esp+16]			// Argument 2 is result area.[m
[31m-  |  mov [edi], eax[m
[31m-  |  mov [edi+4], ebx[m
[31m-  |  mov [edi+8], ecx[m
[31m-  |  mov [edi+12], edx[m
[31m-  |  pop ebx[m
[31m-  |  pop edi[m
[31m-  |1:[m
[31m-  |  ret[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Assertions ---------------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->assert_bad_for_arg_type:[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  |  int3[m
[31m-#endif[m
[31m-  |  int3[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions. Callback slot number in ah/al.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |.if not X64[m
[31m-  |  sub esp, 16			// Leave room for SAVE_ERRF etc.[m
[31m-  |.endif[m
[31m-  |  saveregs_	// ebp/rbp already saved. ebp now holds global_State *.[m
[31m-  |  lea DISPATCH, [ebp+GG_G2DISP][m
[31m-  |  mov CTSTATE, GL:ebp->ctype_state[m
[31m-  |  movzx eax, ax[m
[31m-  |  mov CTSTATE->cb.slot, eax[m
[31m-  |.if X64[m
[31m-  |  mov CTSTATE->cb.gpr[0], CARG1[m
[31m-  |  mov CTSTATE->cb.gpr[1], CARG2[m
[31m-  |  mov CTSTATE->cb.gpr[2], CARG3[m
[31m-  |  mov CTSTATE->cb.gpr[3], CARG4[m
[31m-  |  movsd qword CTSTATE->cb.fpr[0], xmm0[m
[31m-  |  movsd qword CTSTATE->cb.fpr[1], xmm1[m
[31m-  |  movsd qword CTSTATE->cb.fpr[2], xmm2[m
[31m-  |  movsd qword CTSTATE->cb.fpr[3], xmm3[m
[31m-  |.if X64WIN[m
[31m-  |  lea rax, [rsp+CFRAME_SIZE+4*8][m
[31m-  |.else[m
[31m-  |  lea rax, [rsp+CFRAME_SIZE][m
[31m-  |  mov CTSTATE->cb.gpr[4], CARG5[m
[31m-  |  mov CTSTATE->cb.gpr[5], CARG6[m
[31m-  |  movsd qword CTSTATE->cb.fpr[4], xmm4[m
[31m-  |  movsd qword CTSTATE->cb.fpr[5], xmm5[m
[31m-  |  movsd qword CTSTATE->cb.fpr[6], xmm6[m
[31m-  |  movsd qword CTSTATE->cb.fpr[7], xmm7[m
[31m-  |.endif[m
[31m-  |  mov CTSTATE->cb.stack, rax[m
[31m-  |  mov CARG2, rsp[m
[31m-  |.else[m
[31m-  |  lea eax, [esp+CFRAME_SIZE+16][m
[31m-  |  mov CTSTATE->cb.gpr[0], FCARG1[m
[31m-  |  mov CTSTATE->cb.gpr[1], FCARG2[m
[31m-  |  mov CTSTATE->cb.stack, eax[m
[31m-  |  mov FCARG1, [esp+CFRAME_SIZE+12]	// Move around misplaced retaddr/ebp.[m
[31m-  |  mov FCARG2, [esp+CFRAME_SIZE+8][m
[31m-  |  mov SAVE_RET, FCARG1[m
[31m-  |  mov SAVE_R4, FCARG2[m
[31m-  |  mov FCARG2, esp[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, CTSTATE		// Any value outside of bytecode is ok.[m
[31m-  |  mov FCARG1, CTSTATE[m
[31m-  |  call extern lj_ccallback_enter@8	// (CTState *cts, void *cf)[m
[31m-  |  // lua_State * returned in eax (RD).[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov BASE, L:RD->base[m
[31m-  |  mov RD, L:RD->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  mov LFUNC:RB, [BASE-8][m
[31m-  |  shr RD, 3[m
[31m-  |  add RD, 1[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  mov L:RA, SAVE_L[m
[31m-  |  mov CTSTATE, [DISPATCH+DISPATCH_GL(ctype_state)][m
[31m-  |  mov aword CTSTATE->L, L:RAa[m
[31m-  |  mov L:RA->base, BASE[m
[31m-  |  mov L:RA->top, RB[m
[31m-  |  mov FCARG1, CTSTATE[m
[31m-  |  mov FCARG2, RC[m
[31m-  |  call extern lj_ccallback_leave@8	// (CTState *cts, TValue *o)[m
[31m-  |.if X64[m
[31m-  |  mov rax, CTSTATE->cb.gpr[0][m
[31m-  |  movsd xmm0, qword CTSTATE->cb.fpr[0][m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |.else[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov eax, CTSTATE->cb.gpr[0][m
[31m-  |  mov edx, CTSTATE->cb.gpr[1][m
[31m-  |  cmp dword CTSTATE->cb.gpr[2], 1[m
[31m-  |  jb >7[m
[31m-  |  je >6[m
[31m-  |  fld qword CTSTATE->cb.fpr[0].d[m
[31m-  |  jmp >7[m
[31m-  |6:[m
[31m-  |  fld dword CTSTATE->cb.fpr[0].f[m
[31m-  |7:[m
[31m-  |  mov ecx, L:RB->top[m
[31m-  |  movzx ecx, word [ecx+6]		// Get stack adjustment and copy up.[m
[31m-  |  mov SAVE_L, ecx			// Must be one slot above SAVE_RET[m
[31m-  |  restoreregs[m
[31m-  |  pop ecx				// Move return addr from SAVE_RET.[m
[31m-  |  add esp, [esp]			// Adjust stack.[m
[31m-  |  add esp, 16[m
[31m-  |  push ecx[m
[31m-  |  ret[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call@4:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |.if X64[m
[31m-  |  .type CCSTATE, CCallState, rbx[m
[31m-  |  push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1[m
[31m-  |.else[m
[31m-  |  .type CCSTATE, CCallState, ebx[m
[31m-  |  push ebp; mov ebp, esp; push ebx; mov CCSTATE, FCARG1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  // Readjust stack.[m
[31m-  |.if X64[m
[31m-  |  mov eax, CCSTATE->spadj[m
[31m-  |  sub rsp, rax[m
[31m-  |.else[m
[31m-  |  sub esp, CCSTATE->spadj[m
[31m-  |.if WIN[m
[31m-  |  mov CCSTATE->spadj, esp[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  // Copy stack slots.[m
[31m-  |  movzx ecx, byte CCSTATE->nsp[m
[31m-  |  sub ecx, 1[m
[31m-  |  js >2[m
[31m-  |1:[m
[31m-  |.if X64[m
[31m-  |  mov rax, [CCSTATE+rcx*8+offsetof(CCallState, stack)][m
[31m-  |  mov [rsp+rcx*8+CCALL_SPS_EXTRA*8], rax[m
[31m-  |.else[m
[31m-  |  mov eax, [CCSTATE+ecx*4+offsetof(CCallState, stack)][m
[31m-  |  mov [esp+ecx*4], eax[m
[31m-  |.endif[m
[31m-  |  sub ecx, 1[m
[31m-  |  jns <1[m
[31m-  |2:[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |  movzx eax, byte CCSTATE->nfpr[m
[31m-  |  mov CARG1, CCSTATE->gpr[0][m
[31m-  |  mov CARG2, CCSTATE->gpr[1][m
[31m-  |  mov CARG3, CCSTATE->gpr[2][m
[31m-  |  mov CARG4, CCSTATE->gpr[3][m
[31m-  |.if not X64WIN[m
[31m-  |  mov CARG5, CCSTATE->gpr[4][m
[31m-  |  mov CARG6, CCSTATE->gpr[5][m
[31m-  |.endif[m
[31m-  |  test eax, eax; jz >5[m
[31m-  |  movaps xmm0, CCSTATE->fpr[0][m
[31m-  |  movaps xmm1, CCSTATE->fpr[1][m
[31m-  |  movaps xmm2, CCSTATE->fpr[2][m
[31m-  |  movaps xmm3, CCSTATE->fpr[3][m
[31m-  |.if not X64WIN[m
[31m-  |  cmp eax, 4; jbe >5[m
[31m-  |  movaps xmm4, CCSTATE->fpr[4][m
[31m-  |  movaps xmm5, CCSTATE->fpr[5][m
[31m-  |  movaps xmm6, CCSTATE->fpr[6][m
[31m-  |  movaps xmm7, CCSTATE->fpr[7][m
[31m-  |.endif[m
[31m-  |5:[m
[31m-  |.else[m
[31m-  |  mov FCARG1, CCSTATE->gpr[0][m
[31m-  |  mov FCARG2, CCSTATE->gpr[1][m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  call aword CCSTATE->func[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |  mov CCSTATE->gpr[0], rax[m
[31m-  |  movaps CCSTATE->fpr[0], xmm0[m
[31m-  |.if not X64WIN[m
[31m-  |  mov CCSTATE->gpr[1], rdx[m
[31m-  |  movaps CCSTATE->fpr[1], xmm1[m
[31m-  |.endif[m
[31m-  |.else[m
[31m-  |  mov CCSTATE->gpr[0], eax[m
[31m-  |  mov CCSTATE->gpr[1], edx[m
[31m-  |  cmp byte CCSTATE->resx87, 1[m
[31m-  |  jb >7[m
[31m-  |  je >6[m
[31m-  |  fstp qword CCSTATE->fpr[0].d[0][m
[31m-  |  jmp >7[m
[31m-  |6:[m
[31m-  |  fstp dword CCSTATE->fpr[0].f[0][m
[31m-  |7:[m
[31m-  |.if WIN[m
[31m-  |  sub CCSTATE->spadj, esp[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |  mov rbx, [rbp-8]; leave; ret[m
[31m-  |.else[m
[31m-  |  mov ebx, [ebp-4]; leave; ret[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |// Note: aligning all instructions does not pay off.[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  |.macro jmp_comp, lt, ge, le, gt, target[m
[31m-  ||switch (op) {[m
[31m-  ||case BC_ISLT:[m
[31m-  |   lt target[m
[31m-  ||break;[m
[31m-  ||case BC_ISGE:[m
[31m-  |   ge target[m
[31m-  ||break;[m
[31m-  ||case BC_ISLE:[m
[31m-  |   le target[m
[31m-  ||break;[m
[31m-  ||case BC_ISGT:[m
[31m-  |   gt target[m
[31m-  ||break;[m
[31m-  ||default: break;  /* Shut up GCC. */[m
[31m-  ||}[m
[31m-  |.endmacro[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1, RD = src2, JMP with RD = target[m
[31m-    |  ins_AD[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RA, >7[m
[31m-    |  checkint RD, >8[m
[31m-    |  mov RB, dword [BASE+RA*8][m
[31m-    |  add PC, 4[m
[31m-    |  cmp RB, dword [BASE+RD*8][m
[31m-    |  jmp_comp jge, jl, jg, jle, >9[m
[31m-    |6:[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  ja ->vmeta_comp[m
[31m-    |  // RA is a number.[m
[31m-    |  cmp dword [BASE+RD*8+4], LJ_TISNUM; jb >1; jne ->vmeta_comp[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  cvtsi2sd xmm0, dword [BASE+RD*8][m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RA is an integer, RD is not an integer.[m
[31m-    |  ja ->vmeta_comp[m
[31m-    |  // RA is an integer, RD is a number.[m
[31m-    |  cvtsi2sd xmm1, dword [BASE+RA*8][m
[31m-    |  movsd xmm0, qword [BASE+RD*8][m
[31m-    |  add PC, 4[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jmp_comp jbe, ja, jb, jae, <9[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |  checknum RA, ->vmeta_comp[m
[31m-    |  checknum RD, ->vmeta_comp[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movsd xmm0, qword [BASE+RD*8][m
[31m-    |2:[m
[31m-    |  add PC, 4[m
[31m-    |  ucomisd xmm0, qword [BASE+RA*8][m
[31m-    |3:[m
[31m-    |  // Unordered: all of ZF CF PF set, ordered: PF clear.[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp_comp jbe, ja, jb, jae, <9[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |  jmp_comp jbe, ja, jb, jae, >1[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  ins_AD	// RA = src1, RD = src2, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RD*8+4][m
[31m-    |  add PC, 4[m
[31m-    |.if DUALNUM[m
[31m-    |  cmp RB, LJ_TISNUM; jne >7[m
[31m-    |  checkint RA, >8[m
[31m-    |  mov RB, dword [BASE+RD*8][m
[31m-    |  cmp RB, dword [BASE+RA*8][m
[31m-    if (vk) {[m
[31m-      |  jne >9[m
[31m-    } else {[m
[31m-      |  je >9[m
[31m-    }[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RD is not an integer.[m
[31m-    |  ja >5[m
[31m-    |  // RD is a number.[m
[31m-    |  cmp dword [BASE+RA*8+4], LJ_TISNUM; jb >1; jne >5[m
[31m-    |  // RD is a number, RA is an integer.[m
[31m-    |  cvtsi2sd xmm0, dword [BASE+RA*8][m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RD is an integer, RA is not an integer.[m
[31m-    |  ja >5[m
[31m-    |  // RD is an integer, RA is a number.[m
[31m-    |  cvtsi2sd xmm0, dword [BASE+RD*8][m
[31m-    |  ucomisd xmm0, qword [BASE+RA*8][m
[31m-    |  jmp >4[m
[31m-    |[m
[31m-    |.else[m
[31m-    |  cmp RB, LJ_TISNUM; jae >5[m
[31m-    |  checknum RA, >5[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movsd xmm0, qword [BASE+RA*8][m
[31m-    |2:[m
[31m-    |  ucomisd xmm0, qword [BASE+RD*8][m
[31m-    |4:[m
[31m-  iseqne_fp:[m
[31m-    if (vk) {[m
[31m-      |  jp >2				// Unordered means not equal.[m
[31m-      |  jne >2[m
[31m-    } else {[m
[31m-      |  jp >2				// Unordered means not equal.[m
[31m-      |  je >1[m
[31m-    }[m
[31m-  iseqne_end:[m
[31m-    if (vk) {[m
[31m-      |1:				// EQ: Branch to the target.[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:				// NE: Fallthrough to next instruction.[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-      |2:				// NE: Branch to the target.[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |1:				// EQ: Fallthrough to next instruction.[m
[31m-    }[m
[31m-    if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||[m
[31m-		       op == BC_ISEQN || op == BC_ISNEN)) {[m
[31m-      |  jmp <9[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    if (op == BC_ISEQV || op == BC_ISNEV) {[m
[31m-      |5:  // Either or both types are not numbers.[m
[31m-      |.if FFI[m
[31m-      |  cmp RB, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |  checktp RA, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |.endif[m
[31m-      |  checktp RA, RB			// Compare types.[m
[31m-      |  jne <2				// Not the same type?[m
[31m-      |  cmp RB, LJ_TISPRI[m
[31m-      |  jae <1				// Same type and primitive type?[m
[31m-      |[m
[31m-      |  // Same types and not a primitive type. Compare GCobj or pvalue.[m
[31m-      |  mov RA, [BASE+RA*8][m
[31m-      |  mov RD, [BASE+RD*8][m
[31m-      |  cmp RA, RD[m
[31m-      |  je <1				// Same GCobjs or pvalues?[m
[31m-      |  cmp RB, LJ_TISTABUD[m
[31m-      |  ja <2				// Different objects and not table/ud?[m
[31m-      |.if X64[m
[31m-      |  cmp RB, LJ_TUDATA		// And not 64 bit lightuserdata.[m
[31m-      |  jb <2[m
[31m-      |.endif[m
[31m-      |[m
[31m-      |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-      |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-      |  mov TAB:RB, TAB:RA->metatable[m
[31m-      |  test TAB:RB, TAB:RB[m
[31m-      |  jz <2				// No metatable?[m
[31m-      |  test byte TAB:RB->nomm, 1<<MM_eq[m
[31m-      |  jnz <2				// Or 'no __eq' flag set?[m
[31m-      if (vk) {[m
[31m-	|  xor RB, RB			// ne = 0[m
[31m-      } else {[m
[31m-	|  mov RB, 1			// ne = 1[m
[31m-      }[m
[31m-      |  jmp ->vmeta_equal		// Handle __eq metamethod.[m
[31m-    } else {[m
[31m-      |.if FFI[m
[31m-      |3:[m
[31m-      |  cmp RB, LJ_TCDATA[m
[31m-      if (LJ_DUALNUM && vk) {[m
[31m-	|  jne <9[m
[31m-      } else {[m
[31m-	|  jne <2[m
[31m-      }[m
[31m-      |  jmp ->vmeta_equal_cd[m
[31m-      |.endif[m
[31m-    }[m
[31m-    break;[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  ins_AND	// RA = src, RD = str const, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  add PC, 4[m
[31m-    |  cmp RB, LJ_TSTR; jne >3[m
[31m-    |  mov RA, [BASE+RA*8][m
[31m-    |  cmp RA, [KBASE+RD*4][m
[31m-  iseqne_test:[m
[31m-    if (vk) {[m
[31m-      |  jne >2[m
[31m-    } else {[m
[31m-      |  je >1[m
[31m-    }[m
[31m-    goto iseqne_end;[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  ins_AD	// RA = src, RD = num const, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  add PC, 4[m
[31m-    |.if DUALNUM[m
[31m-    |  cmp RB, LJ_TISNUM; jne >7[m
[31m-    |  cmp dword [KBASE+RD*8+4], LJ_TISNUM; jne >8[m
[31m-    |  mov RB, dword [KBASE+RD*8][m
[31m-    |  cmp RB, dword [BASE+RA*8][m
[31m-    if (vk) {[m
[31m-      |  jne >9[m
[31m-    } else {[m
[31m-      |  je >9[m
[31m-    }[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  ja >3[m
[31m-    |  // RA is a number.[m
[31m-    |  cmp dword [KBASE+RD*8+4], LJ_TISNUM; jb >1[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  cvtsi2sd xmm0, dword [KBASE+RD*8][m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RA is an integer, RD is a number.[m
[31m-    |  cvtsi2sd xmm0, dword [BASE+RA*8][m
[31m-    |  ucomisd xmm0, qword [KBASE+RD*8][m
[31m-    |  jmp >4[m
[31m-    |.else[m
[31m-    |  cmp RB, LJ_TISNUM; jae >3[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |2:[m
[31m-    |  ucomisd xmm0, qword [BASE+RA*8][m
[31m-    |4:[m
[31m-    goto iseqne_fp;[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  ins_AND	// RA = src, RD = primitive type (~), JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  add PC, 4[m
[31m-    |  cmp RB, RD[m
[31m-    if (!LJ_HASFFI) goto iseqne_test;[m
[31m-    if (vk) {[m
[31m-      |  jne >3[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:[m
[31m-      |  ins_next[m
[31m-      |3:[m
[31m-      |  cmp RB, LJ_TCDATA; jne <2[m
[31m-      |  jmp ->vmeta_equal_cd[m
[31m-    } else {[m
[31m-      |  je >2[m
[31m-      |  cmp RB, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  ins_AD	// RA = dst or unused, RD = src, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RD*8+4][m
[31m-    |  add PC, 4[m
[31m-    |  cmp RB, LJ_TISTRUECOND[m
[31m-    if (op == BC_IST || op == BC_ISTC) {[m
[31m-      |  jae >1[m
[31m-    } else {[m
[31m-      |  jb >1[m
[31m-    }[m
[31m-    if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-      |  mov [BASE+RA*8+4], RB[m
[31m-      |  mov RB, [BASE+RD*8][m
[31m-      |  mov [BASE+RA*8], RB[m
[31m-    }[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |1:					// Fallthrough to the next instruction.[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  ins_AD	// RA = src, RD = -type[m
[31m-    |  add RD, [BASE+RA*8+4][m
[31m-    |  jne ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  ins_AD	// RA = src, RD = -(TISNUM-1)[m
[31m-    |  checknum RA, ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [BASE+RD*8][m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RD*8+4][m
[31m-    |  mov RD, [BASE+RD*8][m
[31m-    |  mov [BASE+RA*8+4], RB[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |.endif[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  xor RB, RB[m
[31m-    |  checktp RD, LJ_TISTRUECOND[m
[31m-    |  adc RB, LJ_TTRUE[m
[31m-    |  mov [BASE+RA*8+4], RB[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RD, >5[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  neg RB[m
[31m-    |  jo >4[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    |  mov dword [BASE+RA*8], RB[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |4:[m
[31m-    |  mov dword [BASE+RA*8+4], 0x41e00000  // 2^31.[m
[31m-    |  mov dword [BASE+RA*8], 0[m
[31m-    |  jmp <9[m
[31m-    |5:[m
[31m-    |  ja ->vmeta_unm[m
[31m-    |.else[m
[31m-    |  checknum RD, ->vmeta_unm[m
[31m-    |.endif[m
[31m-    |  movsd xmm0, qword [BASE+RD*8][m
[31m-    |  sseconst_sign xmm1, RDa[m
[31m-    |  xorps xmm0, xmm1[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp <9[m
[31m-    |.else[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  checkstr RD, >2[m
[31m-    |  mov STR:RD, [BASE+RD*8][m
[31m-    |.if DUALNUM[m
[31m-    |  mov RD, dword STR:RD->len[m
[31m-    |1:[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    |  mov dword [BASE+RA*8], RD[m
[31m-    |.else[m
[31m-    |  xorps xmm0, xmm0[m
[31m-    |  cvtsi2sd xmm0, dword STR:RD->len[m
[31m-    |1:[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |2:[m
[31m-    |  checktab RD, ->vmeta_len[m
[31m-    |  mov TAB:FCARG1, [BASE+RD*8][m
[31m-#if LJ_52[m
[31m-    |  mov TAB:RB, TAB:FCARG1->metatable[m
[31m-    |  cmp TAB:RB, 0[m
[31m-    |  jnz >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  mov RB, BASE			// Save BASE.[m
[31m-    |  call extern lj_tab_len@4		// (GCtab *t)[m
[31m-    |  // Length of table returned in eax (RD).[m
[31m-    |.if DUALNUM[m
[31m-    |  // Nothing to do.[m
[31m-    |.else[m
[31m-    |  cvtsi2sd xmm0, RD[m
[31m-    |.endif[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  jmp <1[m
[31m-#if LJ_52[m
[31m-    |9:  // Check for __len.[m
[31m-    |  test byte TAB:RB->nomm, 1<<MM_len[m
[31m-    |  jnz <3[m
[31m-    |  jmp ->vmeta_len			// 'no __len' flag NOT set: check.[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithpre, sseins, ssereg[m
[31m-    |  ins_ABC[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   checknum RB, ->vmeta_arith_vn[m
[31m-    |   .if DUALNUM[m
[31m-    |     cmp dword [KBASE+RC*8+4], LJ_TISNUM; jae ->vmeta_arith_vn[m
[31m-    |   .endif[m
[31m-    |   movsd xmm0, qword [BASE+RB*8][m
[31m-    |   sseins ssereg, qword [KBASE+RC*8][m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   checknum RB, ->vmeta_arith_nv[m
[31m-    |   .if DUALNUM[m
[31m-    |     cmp dword [KBASE+RC*8+4], LJ_TISNUM; jae ->vmeta_arith_nv[m
[31m-    |   .endif[m
[31m-    |   movsd xmm0, qword [KBASE+RC*8][m
[31m-    |   sseins ssereg, qword [BASE+RB*8][m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   checknum RB, ->vmeta_arith_vv[m
[31m-    |   checknum RC, ->vmeta_arith_vv[m
[31m-    |   movsd xmm0, qword [BASE+RB*8][m
[31m-    |   sseins ssereg, qword [BASE+RC*8][m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins[m
[31m-    |  ins_ABC[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   checkint RB, ->vmeta_arith_vn[m
[31m-    |   cmp dword [KBASE+RC*8+4], LJ_TISNUM; jne ->vmeta_arith_vn[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   intins RB, [KBASE+RC*8]; jo ->vmeta_arith_vno[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   checkint RB, ->vmeta_arith_nv[m
[31m-    |   cmp dword [KBASE+RC*8+4], LJ_TISNUM; jne ->vmeta_arith_nv[m
[31m-    |   mov RC, [KBASE+RC*8][m
[31m-    |   intins RC, [BASE+RB*8]; jo ->vmeta_arith_nvo[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   checkint RB, ->vmeta_arith_vv[m
[31m-    |   checkint RC, ->vmeta_arith_vv[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   intins RB, [BASE+RC*8]; jo ->vmeta_arith_vvo[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    ||if (vk == 1) {[m
[31m-    |   mov dword [BASE+RA*8], RC[m
[31m-    ||} else {[m
[31m-    |   mov dword [BASE+RA*8], RB[m
[31m-    ||}[m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpost[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, sseins[m
[31m-    |  ins_arithpre sseins, xmm0[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, intins, sseins[m
[31m-    |.if DUALNUM[m
[31m-    |  ins_arithdn intins[m
[31m-    |.else[m
[31m-    |  ins_arith, sseins[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-[m
[31m-    |  // RA = dst, RB = src1 or num const, RC = src2 or num const[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arith add, addsd[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arith sub, subsd[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arith imul, mulsd[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arith divsd[m
[31m-    break;[m
[31m-  case BC_MODVN:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |->BC_MODVN_Z:[m
[31m-    |  call ->vm_mod[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |  jmp ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |  mov RB, BASE[m
[31m-    |.if not X64[m
[31m-    |  movsd FPARG1, xmm0[m
[31m-    |  movsd FPARG3, xmm1[m
[31m-    |.endif[m
[31m-    |  call extern pow[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  mov BASE, RB[m
[31m-    |.if X64[m
[31m-    |  ins_arithpost[m
[31m-    |.else[m
[31m-    |  fstp qword [BASE+RA*8][m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  ins_ABC	// RA = dst, RB = src_start, RC = src_end[m
[31m-    |.if X64[m
[31m-    |  mov L:CARG1d, SAVE_L[m
[31m-    |  mov L:CARG1d->base, BASE[m
[31m-    |  lea CARG2d, [BASE+RC*8][m
[31m-    |  mov CARG3d, RC[m
[31m-    |  sub CARG3d, RB[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  mov L:RB, L:CARG1d[m
[31m-    |.else[m
[31m-    |  lea RA, [BASE+RC*8][m
[31m-    |  sub RC, RB[m
[31m-    |  mov ARG2, RA[m
[31m-    |  mov ARG3, RC[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |.endif[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  test RC, RC[m
[31m-    |  jnz ->vmeta_binop[m
[31m-    |  movzx RB, PC_RB			// Copy result to Stk[RA] from Stk[RB].[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |.if X64[m
[31m-    |  mov RCa, [BASE+RB*8][m
[31m-    |  mov [BASE+RA*8], RCa[m
[31m-    |.else[m
[31m-    |  mov RC, [BASE+RB*8+4][m
[31m-    |  mov RB, [BASE+RB*8][m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  ins_AND	// RA = dst, RD = str const (~)[m
[31m-    |  mov RD, [KBASE+RD*4][m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TSTR[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  ins_AND	// RA = dst, RD = cdata const (~)[m
[31m-    |  mov RD, [KBASE+RD*4][m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TCDATA[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  ins_AD	// RA = dst, RD = signed int16 literal[m
[31m-    |.if DUALNUM[m
[31m-    |  movsx RD, RDW[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    |  mov dword [BASE+RA*8], RD[m
[31m-    |.else[m
[31m-    |  movsx RD, RDW			// Sign-extend literal.[m
[31m-    |  cvtsi2sd xmm0, RD[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  ins_AD	// RA = dst, RD = num const[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  ins_AND	// RA = dst, RD = primitive type (~)[m
[31m-    |  mov [BASE+RA*8+4], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  ins_AD	// RA = dst_start, RD = dst_end[m
[31m-    |  lea RA, [BASE+RA*8+12][m
[31m-    |  lea RD, [BASE+RD*8+4][m
[31m-    |  mov RB, LJ_TNIL[m
[31m-    |  mov [RA-8], RB			// Sets minimum 2 slots.[m
[31m-    |1:[m
[31m-    |  mov [RA], RB[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RD[m
[31m-    |  jbe <1[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  ins_AD	// RA = dst, RD = upvalue #[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RD*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RB, UPVAL:RB->v[m
[31m-    |.if X64[m
[31m-    |  mov RDa, [RB][m
[31m-    |  mov [BASE+RA*8], RDa[m
[31m-    |.else[m
[31m-    |  mov RD, [RB+4][m
[31m-    |  mov RB, [RB][m
[31m-    |  mov [BASE+RA*8+4], RD[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-#define TV2MARKOFS \[m
[31m- ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))[m
[31m-    |  ins_AD	// RA = upvalue #, RD = src[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  cmp byte UPVAL:RB->closed, 0[m
[31m-    |  mov RB, UPVAL:RB->v[m
[31m-    |  mov RA, [BASE+RD*8][m
[31m-    |  mov RD, [BASE+RD*8+4][m
[31m-    |  mov [RB], RA[m
[31m-    |  mov [RB+4], RD[m
[31m-    |  jz >1[m
[31m-    |  // Check barrier for closed upvalue.[m
[31m-    |  test byte [RB+TV2MARKOFS], LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  jnz >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Upvalue is black. Check if new value is collectable and white.[m
[31m-    |  sub RD, LJ_TISGCV[m
[31m-    |  cmp RD, LJ_TNUMX - LJ_TISGCV			// tvisgcv(v)[m
[31m-    |  jbe <1[m
[31m-    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(v)[m
[31m-    |  jz <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |.if X64 and not X64WIN[m
[31m-    |  mov FCARG2, RB[m
[31m-    |  mov RB, BASE			// Save BASE.[m
[31m-    |.else[m
[31m-    |  xchg FCARG2, RB			// Save BASE (FCARG2 == BASE).[m
[31m-    |.endif[m
[31m-    |  lea GL:FCARG1, [DISPATCH+GG_DISP2G][m
[31m-    |  call extern lj_gc_barrieruv@8	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-#undef TV2MARKOFS[m
[31m-  case BC_USETS:[m
[31m-    |  ins_AND	// RA = upvalue #, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov GCOBJ:RA, [KBASE+RD*4][m
[31m-    |  mov RD, UPVAL:RB->v[m
[31m-    |  mov [RD], GCOBJ:RA[m
[31m-    |  mov dword [RD+4], LJ_TSTR[m
[31m-    |  test byte UPVAL:RB->marked, LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  jnz >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(str)[m
[31m-    |  jz <1[m
[31m-    |  cmp byte UPVAL:RB->closed, 0[m
[31m-    |  jz <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  mov RB, BASE			// Save BASE (FCARG2 == BASE).[m
[31m-    |  mov FCARG2, RD[m
[31m-    |  lea GL:FCARG1, [DISPATCH+GG_DISP2G][m
[31m-    |  call extern lj_gc_barrieruv@8	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  ins_AD	// RA = upvalue #, RD = num const[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RA, UPVAL:RB->v[m
[31m-    |  movsd qword [RA], xmm0[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  ins_AND	// RA = upvalue #, RD = primitive type (~)[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RA, UPVAL:RB->v[m
[31m-    |  mov [RA+4], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UCLO:[m
[31m-    |  ins_AD	// RA = level, RD = target[m
[31m-    |  branchPC RD			// Do this first to free RD.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  cmp dword L:RB->openupval, 0[m
[31m-    |  je >1[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  lea FCARG2, [BASE+RA*8]		// Caveat: FCARG2 == BASE[m
[31m-    |  mov L:FCARG1, L:RB		// Caveat: FCARG1 == RA[m
[31m-    |  call extern lj_func_closeuv@8	// (lua_State *L, TValue *level)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  ins_AND	// RA = dst, RD = proto const (~) (holding function prototype)[m
[31m-    |.if X64[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-    |  mov CARG3d, [BASE-8][m
[31m-    |  mov CARG2d, [KBASE+RD*4]		// Fetch GCproto *.[m
[31m-    |  mov CARG1d, L:RB[m
[31m-    |.else[m
[31m-    |  mov LFUNC:RA, [BASE-8][m
[31m-    |  mov PROTO:RD, [KBASE+RD*4]	// Fetch GCproto *.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov ARG3, LFUNC:RA[m
[31m-    |  mov ARG2, PROTO:RD[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |.endif[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  call extern lj_func_newL_gc[m
[31m-    |  // GCfuncL * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  mov [BASE+RA*8], LFUNC:RC[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TFUNC[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-    |  ins_AD	// RA = dst, RD = hbits|asize[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  jae >5[m
[31m-    |1:[m
[31m-    |.if X64[m
[31m-    |  mov CARG3d, RD[m
[31m-    |  and RD, 0x7ff[m
[31m-    |  shr CARG3d, 11[m
[31m-    |.else[m
[31m-    |  mov RA, RD[m
[31m-    |  and RD, 0x7ff[m
[31m-    |  shr RA, 11[m
[31m-    |  mov ARG3, RA[m
[31m-    |.endif[m
[31m-    |  cmp RD, 0x7ff[m
[31m-    |  je >3[m
[31m-    |2:[m
[31m-    |.if X64[m
[31m-    |  mov L:CARG1d, L:RB[m
[31m-    |  mov CARG2d, RD[m
[31m-    |.else[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |  mov ARG2, RD[m
[31m-    |.endif[m
[31m-    |  call extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-    |  // Table * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  mov [BASE+RA*8], TAB:RC[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TTAB[m
[31m-    |  ins_next[m
[31m-    |3:  // Turn 0x7ff into 0x801.[m
[31m-    |  mov RD, 0x801[m
[31m-    |  jmp <2[m
[31m-    |5:[m
[31m-    |  mov L:FCARG1, L:RB[m
[31m-    |  call extern lj_gc_step_fixtop@4	// (lua_State *L)[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_TDUP:[m
[31m-    |  ins_AND	// RA = dst, RD = table const (~) (holding template table)[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  jae >3[m
[31m-    |2:[m
[31m-    |  mov TAB:FCARG2, [KBASE+RD*4]	// Caveat: FCARG2 == BASE[m
[31m-    |  mov L:FCARG1, L:RB		// Caveat: FCARG1 == RA[m
[31m-    |  call extern lj_tab_dup@8		// (lua_State *L, Table *kt)[m
[31m-    |  // Table * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  mov [BASE+RA*8], TAB:RC[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TTAB[m
[31m-    |  ins_next[m
[31m-    |3:[m
[31m-    |  mov L:FCARG1, L:RB[m
[31m-    |  call extern lj_gc_step_fixtop@4	// (lua_State *L)[m
[31m-    |  movzx RD, PC_RD			// Need to reload RD.[m
[31m-    |  not RDa[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  ins_AND	// RA = dst, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov TAB:RB, LFUNC:RB->env[m
[31m-    |  mov STR:RC, [KBASE+RD*4][m
[31m-    |  jmp ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_GSET:[m
[31m-    |  ins_AND	// RA = src, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov TAB:RB, LFUNC:RB->env[m
[31m-    |  mov STR:RC, [KBASE+RD*4][m
[31m-    |  jmp ->BC_TSETS_Z[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = key[m
[31m-    |  checktab RB, ->vmeta_tgetv[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |[m
[31m-    |  // Integer key?[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RC, >5[m
[31m-    |  mov RC, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  // Convert number to int and back and compare.[m
[31m-    |  checknum RC, >5[m
[31m-    |  movsd xmm0, qword [BASE+RC*8][m
[31m-    |  cvttsd2si RC, xmm0[m
[31m-    |  cvtsi2sd xmm1, RC[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jne ->vmeta_tgetv		// Generic numeric key? Use fallback.[m
[31m-    |.endif[m
[31m-    |  cmp RC, TAB:RB->asize	// Takes care of unordered, too.[m
[31m-    |  jae ->vmeta_tgetv		// Not in array part? Use fallback.[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp dword [RC+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[31m-    |  je >2[m
[31m-    |  // Get array slot.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RC][m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RC][m
[31m-    |  mov RC, [RC+4][m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz >3[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_index[m
[31m-    |  jz ->vmeta_tgetv			// 'no __index' flag NOT set: check.[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |3:[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TNIL[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // String key?[m
[31m-    |  checkstr RC, ->vmeta_tgetv[m
[31m-    |  mov STR:RC, [BASE+RC*8][m
[31m-    |  jmp ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = str const (~)[m
[31m-    |  not RCa[m
[31m-    |  mov STR:RC, [KBASE+RC*4][m
[31m-    |  checktab RB, ->vmeta_tgets[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |->BC_TGETS_Z:	// RB = GCtab *, RC = GCstr *, refetches PC_RA.[m
[31m-    |  mov RA, TAB:RB->hmask[m
[31m-    |  and RA, STR:RC->hash[m
[31m-    |  imul RA, #NODE[m
[31m-    |  add NODE:RA, TAB:RB->node[m
[31m-    |1:[m
[31m-    |  cmp dword NODE:RA->key.it, LJ_TSTR[m
[31m-    |  jne >4[m
[31m-    |  cmp dword NODE:RA->key.gcr, STR:RC[m
[31m-    |  jne >4[m
[31m-    |  // Ok, key found. Assumes: offsetof(Node, val) == 0[m
[31m-    |  cmp dword [RA+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[31m-    |  je >5				// Key found, but nil value?[m
[31m-    |  movzx RC, PC_RA[m
[31m-    |  // Get node value.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RA][m
[31m-    |  mov [BASE+RC*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RA][m
[31m-    |  mov RA, [RA+4][m
[31m-    |  mov [BASE+RC*8], RB[m
[31m-    |  mov [BASE+RC*8+4], RA[m
[31m-    |.endif[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:[m
[31m-    |  movzx RC, PC_RA[m
[31m-    |  mov dword [BASE+RC*8+4], LJ_TNIL[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  mov NODE:RA, NODE:RA->next[m
[31m-    |  test NODE:RA, NODE:RA[m
[31m-    |  jnz <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test TAB:RA, TAB:RA[m
[31m-    |  jz <3				// No metatable: done.[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_index[m
[31m-    |  jnz <3				// 'no __index' flag set: done.[m
[31m-    |  jmp ->vmeta_tgets		// Caveat: preserve STR:RC.[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = byte literal[m
[31m-    |  checktab RB, ->vmeta_tgetb[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  cmp RC, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tgetb[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp dword [RC+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[31m-    |  je >2[m
[31m-    |  // Get array slot.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RC][m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RC][m
[31m-    |  mov RC, [RC+4][m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz >3[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_index[m
[31m-    |  jz ->vmeta_tgetb			// 'no __index' flag NOT set: check.[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |3:[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TNIL[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |.if DUALNUM[m
[31m-    |  mov RC, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  cvttsd2si RC, qword [BASE+RC*8][m
[31m-    |.endif[m
[31m-    |  cmp RC, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tgetr		// Not in array part? Use fallback.[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Get array slot.[m
[31m-    |->BC_TGETR_Z:[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RC][m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RC][m
[31m-    |  mov RC, [RC+4][m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |.endif[m
[31m-    |->BC_TGETR2_Z:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = key[m
[31m-    |  checktab RB, ->vmeta_tsetv[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |[m
[31m-    |  // Integer key?[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RC, >5[m
[31m-    |  mov RC, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  // Convert number to int and back and compare.[m
[31m-    |  checknum RC, >5[m
[31m-    |  movsd xmm0, qword [BASE+RC*8][m
[31m-    |  cvttsd2si RC, xmm0[m
[31m-    |  cvtsi2sd xmm1, RC[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jne ->vmeta_tsetv		// Generic numeric key? Use fallback.[m
[31m-    |.endif[m
[31m-    |  cmp RC, TAB:RB->asize		// Takes care of unordered, too.[m
[31m-    |  jae ->vmeta_tsetv[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp dword [RC+4], LJ_TNIL[m
[31m-    |  je >3				// Previous value is nil?[m
[31m-    |1:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:  // Set array slot.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [BASE+RA*8][m
[31m-    |  mov [RC], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  mov RA, [BASE+RA*8][m
[31m-    |  mov [RC+4], RB[m
[31m-    |  mov [RC], RA[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz <1[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsetv			// 'no __newindex' flag NOT set: check.[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // String key?[m
[31m-    |  checkstr RC, ->vmeta_tsetv[m
[31m-    |  mov STR:RC, [BASE+RC*8][m
[31m-    |  jmp ->BC_TSETS_Z[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RA[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = str const (~)[m
[31m-    |  not RCa[m
[31m-    |  mov STR:RC, [KBASE+RC*4][m
[31m-    |  checktab RB, ->vmeta_tsets[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |->BC_TSETS_Z:	// RB = GCtab *, RC = GCstr *, refetches PC_RA.[m
[31m-    |  mov RA, TAB:RB->hmask[m
[31m-    |  and RA, STR:RC->hash[m
[31m-    |  imul RA, #NODE[m
[31m-    |  mov byte TAB:RB->nomm, 0		// Clear metamethod cache.[m
[31m-    |  add NODE:RA, TAB:RB->node[m
[31m-    |1:[m
[31m-    |  cmp dword NODE:RA->key.it, LJ_TSTR[m
[31m-    |  jne >5[m
[31m-    |  cmp dword NODE:RA->key.gcr, STR:RC[m
[31m-    |  jne >5[m
[31m-    |  // Ok, key found. Assumes: offsetof(Node, val) == 0[m
[31m-    |  cmp dword [RA+4], LJ_TNIL[m
[31m-    |  je >4				// Previous value is nil?[m
[31m-    |2:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |3:  // Set node value.[m
[31m-    |  movzx RC, PC_RA[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [BASE+RC*8][m
[31m-    |  mov [RA], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RC*8+4][m
[31m-    |  mov RC, [BASE+RC*8][m
[31m-    |  mov [RA+4], RB[m
[31m-    |  mov [RA], RC[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz <2[m
[31m-    |  mov TMP1, RA			// Save RA.[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[31m-    |  mov RA, TMP1			// Restore RA.[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  mov NODE:RA, NODE:RA->next[m
[31m-    |  test NODE:RA, NODE:RA[m
[31m-    |  jnz <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test TAB:RA, TAB:RA[m
[31m-    |  jz >6				// No metatable: continue.[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[31m-    |6:[m
[31m-    |  mov TMP1, STR:RC[m
[31m-    |  mov TMP2, LJ_TSTR[m
[31m-    |  mov TMP3, TAB:RB			// Save TAB:RB for us.[m
[31m-    |.if X64[m
[31m-    |  mov L:CARG1d, SAVE_L[m
[31m-    |  mov L:CARG1d->base, BASE[m
[31m-    |  lea CARG3, TMP1[m
[31m-    |  mov CARG2d, TAB:RB[m
[31m-    |  mov L:RB, L:CARG1d[m
[31m-    |.else[m
[31m-    |  lea RC, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[31m-    |  mov ARG2, TAB:RB[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov ARG3, RC[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |.endif[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_tab_newkey	// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Handles write barrier for the new key. TValue * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  mov TAB:RB, TMP3			// Need TAB:RB for barrier.[m
[31m-    |  mov RA, eax[m
[31m-    |  jmp <2				// Must check write barrier for value.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RC		// Destroys STR:RC.[m
[31m-    |  jmp <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = byte literal[m
[31m-    |  checktab RB, ->vmeta_tsetb[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  cmp RC, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tsetb[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp dword [RC+4], LJ_TNIL[m
[31m-    |  je >3				// Previous value is nil?[m
[31m-    |1:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:	 // Set array slot.[m
[31m-    |.if X64[m
[31m-    |  mov RAa, [BASE+RA*8][m
[31m-    |  mov [RC], RAa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  mov RA, [BASE+RA*8][m
[31m-    |  mov [RC+4], RB[m
[31m-    |  mov [RC], RA[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz <1[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsetb			// 'no __newindex' flag NOT set: check.[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RA[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |.if DUALNUM[m
[31m-    |  mov RC, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  cvttsd2si RC, qword [BASE+RC*8][m
[31m-    |.endif[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:[m
[31m-    |  cmp RC, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tsetr[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Set array slot.[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [BASE+RA*8][m
[31m-    |  mov [RC], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  mov RA, [BASE+RA*8][m
[31m-    |  mov [RC+4], RB[m
[31m-    |  mov [RC], RA[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RA[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  ins_AD	// RA = base (table at base-1), RD = num const (start index)[m
[31m-    |  mov TMP1, KBASE			// Need one more free register.[m
[31m-    |  mov KBASE, dword [KBASE+RD*8]	// Integer constant is in lo-word.[m
[31m-    |1:[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  mov TAB:RB, [RA-8]		// Guaranteed to be a table.[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:[m
[31m-    |  mov RD, MULTRES[m
[31m-    |  sub RD, 1[m
[31m-    |  jz >4				// Nothing to copy?[m
[31m-    |  add RD, KBASE			// Compute needed size.[m
[31m-    |  cmp RD, TAB:RB->asize[m
[31m-    |  ja >5				// Doesn't fit into array part?[m
[31m-    |  sub RD, KBASE[m
[31m-    |  shl KBASE, 3[m
[31m-    |  add KBASE, TAB:RB->array[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RA][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RA][m
[31m-    |  mov [KBASE], RB[m
[31m-    |  mov RB, [RA+4][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE+4], RB[m
[31m-    |.endif[m
[31m-    |  add KBASE, 8[m
[31m-    |  sub RD, 1[m
[31m-    |  jnz <3[m
[31m-    |4:[m
[31m-    |  mov KBASE, TMP1[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |.if X64[m
[31m-    |  mov L:CARG1d, SAVE_L[m
[31m-    |  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-    |  mov CARG2d, TAB:RB[m
[31m-    |  mov CARG3d, RD[m
[31m-    |  mov L:RB, L:CARG1d[m
[31m-    |.else[m
[31m-    |  mov ARG2, TAB:RB[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov ARG3, RD[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |.endif[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_tab_reasize	// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <1				// Retry.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RD[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALL: case BC_CALLM:[m
[31m-    |  ins_A_C	// RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs[m
[31m-    if (op == BC_CALLM) {[m
[31m-      |  add NARGS:RD, MULTRES[m
[31m-    }[m
[31m-    |  cmp dword [BASE+RA*8+4], LJ_TFUNC[m
[31m-    |  mov LFUNC:RB, [BASE+RA*8][m
[31m-    |  jne ->vmeta_call_ra[m
[31m-    |  lea BASE, [BASE+RA*8+8][m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  ins_AD	// RA = base, RD = extra_nargs[m
[31m-    |  add NARGS:RD, MULTRES[m
[31m-    |  // Fall through. Assumes BC_CALLT follows and ins_AD is a no-op.[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  ins_AD	// RA = base, RD = nargs+1[m
[31m-    |  lea RA, [BASE+RA*8+8][m
[31m-    |  mov KBASE, BASE			// Use KBASE for move + vmeta_call hint.[m
[31m-    |  mov LFUNC:RB, [RA-8][m
[31m-    |  cmp dword [RA-4], LJ_TFUNC[m
[31m-    |  jne ->vmeta_call[m
[31m-    |->BC_CALLT_Z:[m
[31m-    |  mov PC, [BASE-4][m
[31m-    |  test PC, FRAME_TYPE[m
[31m-    |  jnz >7[m
[31m-    |1:[m
[31m-    |  mov [BASE-8], LFUNC:RB		// Copy function down, reloaded below.[m
[31m-    |  mov MULTRES, NARGS:RD[m
[31m-    |  sub NARGS:RD, 1[m
[31m-    |  jz >3[m
[31m-    |2:  // Move args down.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RA][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RA][m
[31m-    |  mov [KBASE], RB[m
[31m-    |  mov RB, [RA+4][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE+4], RB[m
[31m-    |.endif[m
[31m-    |  add KBASE, 8[m
[31m-    |  sub NARGS:RD, 1[m
[31m-    |  jnz <2[m
[31m-    |[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |3:[m
[31m-    |  mov NARGS:RD, MULTRES[m
[31m-    |  cmp byte LFUNC:RB->ffid, 1	// (> FF_C) Calling a fast function?[m
[31m-    |  ja >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function.[m
[31m-    |  test PC, FRAME_TYPE		// Lua frame below?[m
[31m-    |  jnz <4[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  not RAa[m
[31m-    |  mov LFUNC:KBASE, [BASE+RA*8-8]	// Need to prepare KBASE.[m
[31m-    |  mov KBASE, LFUNC:KBASE->pc[m
[31m-    |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-    |  jmp <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  sub PC, FRAME_VARG[m
[31m-    |  test PC, FRAME_TYPEP[m
[31m-    |  jnz >8				// Vararg frame below?[m
[31m-    |  sub BASE, PC			// Need to relocate BASE/KBASE down.[m
[31m-    |  mov KBASE, BASE[m
[31m-    |  mov PC, [BASE-4][m
[31m-    |  jmp <1[m
[31m-    |8:[m
[31m-    |  add PC, FRAME_VARG[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  ins_A	// RA = base, (RB = nresults+1,) RC = nargs+1 (2+1)[m
[31m-    |  lea RA, [BASE+RA*8+8]		// fb = base+1[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RA-24]			// Copy state. fb[0] = fb[-3].[m
[31m-    |  mov RCa, [RA-16]			// Copy control var. fb[1] = fb[-2].[m
[31m-    |  mov [RA], RBa[m
[31m-    |  mov [RA+8], RCa[m
[31m-    |.else[m
[31m-    |  mov RB, [RA-24]			// Copy state. fb[0] = fb[-3].[m
[31m-    |  mov RC, [RA-20][m
[31m-    |  mov [RA], RB[m
[31m-    |  mov [RA+4], RC[m
[31m-    |  mov RB, [RA-16]			// Copy control var. fb[1] = fb[-2].[m
[31m-    |  mov RC, [RA-12][m
[31m-    |  mov [RA+8], RB[m
[31m-    |  mov [RA+12], RC[m
[31m-    |.endif[m
[31m-    |  mov LFUNC:RB, [RA-32]		// Copy callable. fb[-1] = fb[-4][m
[31m-    |  mov RC, [RA-28][m
[31m-    |  mov [RA-8], LFUNC:RB[m
[31m-    |  mov [RA-4], RC[m
[31m-    |  cmp RC, LJ_TFUNC			// Handle like a regular 2-arg call.[m
[31m-    |  mov NARGS:RD, 2+1[m
[31m-    |  jne ->vmeta_call[m
[31m-    |  mov BASE, RA[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  ins_A	// RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  mov TMP1, KBASE			// Need two more free registers.[m
[31m-    |  mov TMP2, DISPATCH[m
[31m-    |  mov TAB:RB, [BASE+RA*8-16][m
[31m-    |  mov RC, [BASE+RA*8-8]		// Get index from control var.[m
[31m-    |  mov DISPATCH, TAB:RB->asize[m
[31m-    |  add PC, 4[m
[31m-    |  mov KBASE, TAB:RB->array[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  cmp RC, DISPATCH; jae >5		// Index points after array part?[m
[31m-    |  cmp dword [KBASE+RC*8+4], LJ_TNIL; je >4[m
[31m-    |.if DUALNUM[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    |  mov dword [BASE+RA*8], RC[m
[31m-    |.else[m
[31m-    |  cvtsi2sd xmm0, RC[m
[31m-    |.endif[m
[31m-    |  // Copy array slot to returned value.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [KBASE+RC*8][m
[31m-    |  mov [BASE+RA*8+8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [KBASE+RC*8+4][m
[31m-    |  mov [BASE+RA*8+12], RB[m
[31m-    |  mov RB, [KBASE+RC*8][m
[31m-    |  mov [BASE+RA*8+8], RB[m
[31m-    |.endif[m
[31m-    |  add RC, 1[m
[31m-    |  // Return array index as a numeric key.[m
[31m-    |.if DUALNUM[m
[31m-    |  // See above.[m
[31m-    |.else[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  mov [BASE+RA*8-8], RC		// Update control var.[m
[31m-    |2:[m
[31m-    |  movzx RD, PC_RD			// Get target from ITERL.[m
[31m-    |  branchPC RD[m
[31m-    |3:[m
[31m-    |  mov DISPATCH, TMP2[m
[31m-    |  mov KBASE, TMP1[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Skip holes in array part.[m
[31m-    |  add RC, 1[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  sub RC, DISPATCH[m
[31m-    |6:[m
[31m-    |  cmp RC, TAB:RB->hmask; ja <3	// End of iteration? Branch to ITERL+1.[m
[31m-    |  imul KBASE, RC, #NODE[m
[31m-    |  add NODE:KBASE, TAB:RB->node[m
[31m-    |  cmp dword NODE:KBASE->val.it, LJ_TNIL; je >7[m
[31m-    |  lea DISPATCH, [RC+DISPATCH+1][m
[31m-    |  // Copy key and value from hash slot.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, NODE:KBASE->key[m
[31m-    |  mov RCa, NODE:KBASE->val[m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |  mov [BASE+RA*8+8], RCa[m
[31m-    |.else[m
[31m-    |  mov RB, NODE:KBASE->key.gcr[m
[31m-    |  mov RC, NODE:KBASE->key.it[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |  mov RB, NODE:KBASE->val.gcr[m
[31m-    |  mov RC, NODE:KBASE->val.it[m
[31m-    |  mov [BASE+RA*8+8], RB[m
[31m-    |  mov [BASE+RA*8+12], RC[m
[31m-    |.endif[m
[31m-    |  mov [BASE+RA*8-8], DISPATCH[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |7:  // Skip holes in hash part.[m
[31m-    |  add RC, 1[m
[31m-    |  jmp <6[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  ins_AD	// RA = base, RD = target (points to ITERN)[m
[31m-    |  cmp dword [BASE+RA*8-20], LJ_TFUNC; jne >5[m
[31m-    |  mov CFUNC:RB, [BASE+RA*8-24][m
[31m-    |  cmp dword [BASE+RA*8-12], LJ_TTAB; jne >5[m
[31m-    |  cmp dword [BASE+RA*8-4], LJ_TNIL; jne >5[m
[31m-    |  cmp byte CFUNC:RB->ffid, FF_next_N; jne >5[m
[31m-    |  branchPC RD[m
[31m-    |  mov dword [BASE+RA*8-8], 0	// Initialize control var.[m
[31m-    |  mov dword [BASE+RA*8-4], 0xfffe7fff[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  mov PC_OP, BC_JMP[m
[31m-    |  branchPC RD[m
[31m-    |  mov byte [PC], BC_ITERC[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  ins_ABC	// RA = base, RB = nresults+1, RC = numparams[m
[31m-    |  mov TMP1, KBASE			// Need one more free register.[m
[31m-    |  lea KBASE, [BASE+RC*8+(8+FRAME_VARG)][m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  sub KBASE, [BASE-4][m
[31m-    |  // Note: KBASE may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  test RB, RB[m
[31m-    |  jz >5				// Copy all varargs?[m
[31m-    |  lea RB, [RA+RB*8-8][m
[31m-    |  cmp KBASE, BASE			// No vararg slots?[m
[31m-    |  jnb >2[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |.if X64[m
[31m-    |  mov RCa, [KBASE-8][m
[31m-    |  add KBASE, 8[m
[31m-    |  mov [RA], RCa[m
[31m-    |.else[m
[31m-    |  mov RC, [KBASE-8][m
[31m-    |  mov [RA], RC[m
[31m-    |  mov RC, [KBASE-4][m
[31m-    |  add KBASE, 8[m
[31m-    |  mov [RA+4], RC[m
[31m-    |.endif[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RB			// All destination slots filled?[m
[31m-    |  jnb >3[m
[31m-    |  cmp KBASE, BASE			// No more vararg slots?[m
[31m-    |  jb <1[m
[31m-    |2:  // Fill up remainder with nil.[m
[31m-    |  mov dword [RA+4], LJ_TNIL[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RB[m
[31m-    |  jb <2[m
[31m-    |3:[m
[31m-    |  mov KBASE, TMP1[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  mov MULTRES, 1			// MULTRES = 0+1[m
[31m-    |  mov RC, BASE[m
[31m-    |  sub RC, KBASE[m
[31m-    |  jbe <3				// No vararg slots?[m
[31m-    |  mov RB, RC[m
[31m-    |  shr RB, 3[m
[31m-    |  add RB, 1[m
[31m-    |  mov MULTRES, RB			// MULTRES = #varargs+1[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  add RC, RA[m
[31m-    |  cmp RC, L:RB->maxstack[m
[31m-    |  ja >7				// Need to grow stack?[m
[31m-    |6:  // Copy all vararg slots.[m
[31m-    |.if X64[m
[31m-    |  mov RCa, [KBASE-8][m
[31m-    |  add KBASE, 8[m
[31m-    |  mov [RA], RCa[m
[31m-    |.else[m
[31m-    |  mov RC, [KBASE-8][m
[31m-    |  mov [RA], RC[m
[31m-    |  mov RC, [KBASE-4][m
[31m-    |  add KBASE, 8[m
[31m-    |  mov [RA+4], RC[m
[31m-    |.endif[m
[31m-    |  add RA, 8[m
[31m-    |  cmp KBASE, BASE			// No more vararg slots?[m
[31m-    |  jb <6[m
[31m-    |  jmp <3[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov L:RB->top, RA[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  sub KBASE, BASE			// Need delta, because BASE may change.[m
[31m-    |  mov FCARG2, MULTRES[m
[31m-    |  sub FCARG2, 1[m
[31m-    |  mov FCARG1, L:RB[m
[31m-    |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  mov RA, L:RB->top[m
[31m-    |  add KBASE, BASE[m
[31m-    |  jmp <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  ins_AD	// RA = results, RD = extra_nresults[m
[31m-    |  add RD, MULTRES			// MULTRES >=1, so RD >=1.[m
[31m-    |  // Fall through. Assumes BC_RET follows and ins_AD is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-    |  ins_AD	// RA = results, RD = nresults+1[m
[31m-    if (op != BC_RET0) {[m
[31m-      |  shl RA, 3[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  mov PC, [BASE-4][m
[31m-    |  mov MULTRES, RD			// Save nresults+1.[m
[31m-    |  test PC, FRAME_TYPE		// Check frame type marker.[m
[31m-    |  jnz >7				// Not returning to a fixarg Lua func?[m
[31m-    switch (op) {[m
[31m-    case BC_RET:[m
[31m-      |->BC_RET_Z:[m
[31m-      |  mov KBASE, BASE		// Use KBASE for result move.[m
[31m-      |  sub RD, 1[m
[31m-      |  jz >3[m
[31m-      |2:  // Move results down.[m
[31m-      |.if X64[m
[31m-      |  mov RBa, [KBASE+RA][m
[31m-      |  mov [KBASE-8], RBa[m
[31m-      |.else[m
[31m-      |  mov RB, [KBASE+RA][m
[31m-      |  mov [KBASE-8], RB[m
[31m-      |  mov RB, [KBASE+RA+4][m
[31m-      |  mov [KBASE-4], RB[m
[31m-      |.endif[m
[31m-      |  add KBASE, 8[m
[31m-      |  sub RD, 1[m
[31m-      |  jnz <2[m
[31m-      |3:[m
[31m-      |  mov RD, MULTRES		// Note: MULTRES may be >255.[m
[31m-      |  movzx RB, PC_RB		// So cannot compare with RDL![m
[31m-      |5:[m
[31m-      |  cmp RB, RD			// More results expected?[m
[31m-      |  ja >6[m
[31m-      break;[m
[31m-    case BC_RET1:[m
[31m-      |.if X64[m
[31m-      |  mov RBa, [BASE+RA][m
[31m-      |  mov [BASE-8], RBa[m
[31m-      |.else[m
[31m-      |  mov RB, [BASE+RA+4][m
[31m-      |  mov [BASE-4], RB[m
[31m-      |  mov RB, [BASE+RA][m
[31m-      |  mov [BASE-8], RB[m
[31m-      |.endif[m
[31m-      /* fallthrough */[m
[31m-    case BC_RET0:[m
[31m-      |5:[m
[31m-      |  cmp PC_RB, RDL			// More results expected?[m
[31m-      |  ja >6[m
[31m-    default:[m
[31m-      break;[m
[31m-    }[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  not RAa				// Note: ~RA = -(RA+1)[m
[31m-    |  lea BASE, [BASE+RA*8]		// base = base - (RA+1)*8[m
[31m-    |  mov LFUNC:KBASE, [BASE-8][m
[31m-    |  mov KBASE, LFUNC:KBASE->pc[m
[31m-    |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    if (op == BC_RET) {[m
[31m-      |  mov dword [KBASE-4], LJ_TNIL	// Note: relies on shifted base.[m
[31m-      |  add KBASE, 8[m
[31m-    } else {[m
[31m-      |  mov dword [BASE+RD*8-12], LJ_TNIL[m
[31m-    }[m
[31m-    |  add RD, 1[m
[31m-    |  jmp <5[m
[31m-    |[m
[31m-    |7:  // Non-standard return case.[m
[31m-    |  lea RB, [PC-FRAME_VARG][m
[31m-    |  test RB, FRAME_TYPEP[m
[31m-    |  jnz ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down and RA up.[m
[31m-    |  sub BASE, RB[m
[31m-    if (op != BC_RET0) {[m
[31m-      |  add RA, RB[m
[31m-    }[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  |.define FOR_IDX,  [RA];    .define FOR_TIDX,  dword [RA+4][m
[31m-  |.define FOR_STOP, [RA+8];  .define FOR_TSTOP, dword [RA+12][m
[31m-  |.define FOR_STEP, [RA+16]; .define FOR_TSTEP, dword [RA+20][m
[31m-  |.define FOR_EXT,  [RA+24]; .define FOR_TEXT,  dword [RA+28][m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop RB[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_IFORL follows and ins_AJ is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  ins_AJ	// RA = base, RD = target (after end of loop or start of loop)[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    if (LJ_DUALNUM) {[m
[31m-      |  cmp FOR_TIDX, LJ_TISNUM; jne >9[m
[31m-      if (!vk) {[m
[31m-	|  cmp FOR_TSTOP, LJ_TISNUM; jne ->vmeta_for[m
[31m-	|  cmp FOR_TSTEP, LJ_TISNUM; jne ->vmeta_for[m
[31m-	|  mov RB, dword FOR_IDX[m
[31m-	|  cmp dword FOR_STEP, 0; jl >5[m
[31m-      } else {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-	|  cmp FOR_TSTOP, LJ_TISNUM; jne ->assert_bad_for_arg_type[m
[31m-	|  cmp FOR_TSTEP, LJ_TISNUM; jne ->assert_bad_for_arg_type[m
[31m-#endif[m
[31m-	|  mov RB, dword FOR_STEP[m
[31m-	|  test RB, RB; js >5[m
[31m-	|  add RB, dword FOR_IDX; jo >1[m
[31m-	|  mov dword FOR_IDX, RB[m
[31m-      }[m
[31m-      |  cmp RB, dword FOR_STOP[m
[31m-      |  mov FOR_TEXT, LJ_TISNUM[m
[31m-      |  mov dword FOR_EXT, RB[m
[31m-      if (op == BC_FORI) {[m
[31m-	|  jle >7[m
[31m-	|1:[m
[31m-	|6:[m
[31m-	|  branchPC RD[m
[31m-      } else if (op == BC_JFORI) {[m
[31m-	|  branchPC RD[m
[31m-	|  movzx RD, PC_RD[m
[31m-	|  jle =>BC_JLOOP[m
[31m-	|1:[m
[31m-	|6:[m
[31m-      } else if (op == BC_IFORL) {[m
[31m-	|  jg >7[m
[31m-	|6:[m
[31m-	|  branchPC RD[m
[31m-	|1:[m
[31m-      } else {[m
[31m-	|  jle =>BC_JLOOP[m
[31m-	|1:[m
[31m-	|6:[m
[31m-      }[m
[31m-      |7:[m
[31m-      |  ins_next[m
[31m-      |[m
[31m-      |5:  // Invert check for negative step.[m
[31m-      if (vk) {[m
[31m-	|  add RB, dword FOR_IDX; jo <1[m
[31m-	|  mov dword FOR_IDX, RB[m
[31m-      }[m
[31m-      |  cmp RB, dword FOR_STOP[m
[31m-      |  mov FOR_TEXT, LJ_TISNUM[m
[31m-      |  mov dword FOR_EXT, RB[m
[31m-      if (op == BC_FORI) {[m
[31m-	|  jge <7[m
[31m-      } else if (op == BC_JFORI) {[m
[31m-	|  branchPC RD[m
[31m-	|  movzx RD, PC_RD[m
[31m-	|  jge =>BC_JLOOP[m
[31m-      } else if (op == BC_IFORL) {[m
[31m-	|  jl <7[m
[31m-      } else {[m
[31m-	|  jge =>BC_JLOOP[m
[31m-      }[m
[31m-      |  jmp <6[m
[31m-      |9:  // Fallback to FP variant.[m
[31m-    } else if (!vk) {[m
[31m-      |  cmp FOR_TIDX, LJ_TISNUM[m
[31m-    }[m
[31m-    if (!vk) {[m
[31m-      |  jae ->vmeta_for[m
[31m-      |  cmp FOR_TSTOP, LJ_TISNUM; jae ->vmeta_for[m
[31m-    } else {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-      |  cmp FOR_TSTOP, LJ_TISNUM; jae ->assert_bad_for_arg_type[m
[31m-      |  cmp FOR_TSTEP, LJ_TISNUM; jae ->assert_bad_for_arg_type[m
[31m-#endif[m
[31m-    }[m
[31m-    |  mov RB, FOR_TSTEP		// Load type/hiword of for step.[m
[31m-    if (!vk) {[m
[31m-      |  cmp RB, LJ_TISNUM; jae ->vmeta_for[m
[31m-    }[m
[31m-    |  movsd xmm0, qword FOR_IDX[m
[31m-    |  movsd xmm1, qword FOR_STOP[m
[31m-    if (vk) {[m
[31m-      |  addsd xmm0, qword FOR_STEP[m
[31m-      |  movsd qword FOR_IDX, xmm0[m
[31m-      |  test RB, RB; js >3[m
[31m-    } else {[m
[31m-      |  jl >3[m
[31m-    }[m
[31m-    |  ucomisd xmm1, xmm0[m
[31m-    |1:[m
[31m-    |  movsd qword FOR_EXT, xmm0[m
[31m-    if (op == BC_FORI) {[m
[31m-      |.if DUALNUM[m
[31m-      |  jnb <7[m
[31m-      |.else[m
[31m-      |  jnb >2[m
[31m-      |  branchPC RD[m
[31m-      |.endif[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  branchPC RD[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  jnb =>BC_JLOOP[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |.if DUALNUM[m
[31m-      |  jb <7[m
[31m-      |.else[m
[31m-      |  jb >2[m
[31m-      |  branchPC RD[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |  jnb =>BC_JLOOP[m
[31m-    }[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |3:  // Invert comparison if step is negative.[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop RB[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_IITERL follows and ins_AJ is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  ins_AJ	// RA = base, RD = target[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  mov RB, [RA+4][m
[31m-    |  cmp RB, LJ_TNIL; je >1		// Stop if iterator returned nil.[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  mov [RA-4], RB[m
[31m-      |  mov RB, [RA][m
[31m-      |  mov [RA-8], RB[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  branchPC RD			// Otherwise save control var + branch.[m
[31m-      |  mov RD, [RA][m
[31m-      |  mov [RA-4], RB[m
[31m-      |  mov [RA-8], RD[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  ins_A	// RA = base, RD = target (loop extent)[m
[31m-    |  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop RB[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  ins_A	// RA = base, RD = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  ins_AD	// RA = base (ignored), RD = traceno[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-    |.if X64[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE  // Save BASE[m
[31m-    |  mov TMP1, RD     // Save RD[m
[31m-    |  mov CARG3d, PC  // CARG3d == BASE[m
[31m-    |  mov FCARG2, RD[m
[31m-    |  mov FCARG1, RB[m
[31m-    |  call extern lj_log_trace_entry@8[m
[31m-    |  mov RD, TMP1[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |.endif[m
[31m-#endif[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_J(trace)][m
[31m-    |  mov TRACE:RD, [RA+RD*4][m
[31m-    |  mov RDa, TRACE:RD->mcode[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(jit_base)], BASE[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(tmpbuf.L)], L:RB[m
[31m-    |  // Save additional callee-save registers only used in compiled code.[m
[31m-    |.if X64WIN[m
[31m-    |  mov TMPQ, r12[m
[31m-    |  mov TMPa, r13[m
[31m-    |  mov CSAVE_4, r14[m
[31m-    |  mov CSAVE_3, r15[m
[31m-    |  mov RAa, rsp[m
[31m-    |  sub rsp, 9*16+4*8[m
[31m-    |  movdqa [RAa], xmm6[m
[31m-    |  movdqa [RAa-1*16], xmm7[m
[31m-    |  movdqa [RAa-2*16], xmm8[m
[31m-    |  movdqa [RAa-3*16], xmm9[m
[31m-    |  movdqa [RAa-4*16], xmm10[m
[31m-    |  movdqa [RAa-5*16], xmm11[m
[31m-    |  movdqa [RAa-6*16], xmm12[m
[31m-    |  movdqa [RAa-7*16], xmm13[m
[31m-    |  movdqa [RAa-8*16], xmm14[m
[31m-    |  movdqa [RAa-9*16], xmm15[m
[31m-    |.elif X64[m
[31m-    |  mov TMPQ, r12[m
[31m-    |  mov TMPa, r13[m
[31m-    |  sub rsp, 16[m
[31m-    |.endif[m
[31m-    |  jmp RDa[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  ins_AJ	// RA = unused, RD = target[m
[31m-    |  branchPC RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-   /*[m
[31m-   ** Reminder: A function may be called with func/args above L->maxstack,[m
[31m-   ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot,[m
[31m-   ** too. This means all FUNC* ops (including fast functions) must check[m
[31m-   ** for stack overflow _before_ adding more slots![m
[31m-   */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall RB[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[31m-    |  mov KBASE, [PC-4+PC2PROTO(k)][m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RA, [BASE+RA*8]		// Top of frame.[m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  ja ->vm_growstack_f[m
[31m-    |  movzx RA, byte [PC-4+PC2PROTO(numparams)][m
[31m-    |  cmp NARGS:RD, RA			// Check for missing parameters.[m
[31m-    |  jbe >3[m
[31m-    |2:[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  mov dword [BASE+NARGS:RD*8-4], LJ_TNIL[m
[31m-    |  add NARGS:RD, 1[m
[31m-    |  cmp NARGS:RD, RA[m
[31m-    |  jbe <3[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    | int3  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[31m-    |  lea RB, [NARGS:RD*8+FRAME_VARG][m
[31m-    |  lea RD, [BASE+NARGS:RD*8][m
[31m-    |  mov LFUNC:KBASE, [BASE-8][m
[31m-    |  mov [RD-4], RB			// Store delta + FRAME_VARG.[m
[31m-    |  mov [RD-8], LFUNC:KBASE		// Store copy of LFUNC.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RA, [RD+RA*8][m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  ja ->vm_growstack_v		// Need to grow stack.[m
[31m-    |  mov RA, BASE[m
[31m-    |  mov BASE, RD[m
[31m-    |  movzx RB, byte [PC-4+PC2PROTO(numparams)][m
[31m-    |  test RB, RB[m
[31m-    |  jz >2[m
[31m-    |1:  // Copy fixarg slots up to new frame.[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, BASE[m
[31m-    |  jnb >3				// Less args than parameters?[m
[31m-    |  mov KBASE, [RA-8][m
[31m-    |  mov [RD], KBASE[m
[31m-    |  mov KBASE, [RA-4][m
[31m-    |  mov [RD+4], KBASE[m
[31m-    |  add RD, 8[m
[31m-    |  mov dword [RA-4], LJ_TNIL	// Clear old fixarg slot (help the GC).[m
[31m-    |  sub RB, 1[m
[31m-    |  jnz <1[m
[31m-    |2:[m
[31m-    if (op == BC_JFUNCV) {[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  mov KBASE, [PC-4+PC2PROTO(k)][m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  mov dword [RD+4], LJ_TNIL[m
[31m-    |  add RD, 8[m
[31m-    |  sub RB, 1[m
[31m-    |  jnz <3[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  ins_AD  // BASE = new base, RA = ins RA|RD (unused), RD = nargs+1[m
[31m-    |  mov CFUNC:RB, [BASE-8][m
[31m-    |  mov KBASEa, CFUNC:RB->f[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  lea RA, [RD+8*LUA_MINSTACK][m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  mov L:RB->top, RD[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |.if X64[m
[31m-      |  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[31m-      |.else[m
[31m-      |  mov ARG1, L:RB[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |.if X64[m
[31m-      |  mov CARG2, KBASEa[m
[31m-      |  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[31m-      |.else[m
[31m-      |  mov ARG2, KBASEa[m
[31m-      |  mov ARG1, L:RB[m
[31m-      |.endif[m
[31m-    }[m
[31m-    |  ja ->vm_growstack_c		// Need to grow stack.[m
[31m-    |  set_vmstate C[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  call KBASEa			// (lua_State *L)[m
[31m-    } else {[m
[31m-      |  // (lua_State *L, lua_CFunction f)[m
[31m-      |  call aword [DISPATCH+DISPATCH_GL(wrapf)][m
[31m-    }[m
[31m-    |  // nresults returned in eax (RD).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-    |  set_vmstate INTERP[m
[31m-    |  lea RA, [BASE+RD*8][m
[31m-    |  neg RA[m
[31m-    |  add RA, L:RB->top		// RA = (L->top-(L->base+nresults))*8[m
[31m-    |  mov PC, [BASE-4]			// Fetch PC of caller.[m
[31m-    |  jmp ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-  build_subroutines(ctx);[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-#if LJ_64[m
[31m-#define SZPTR	"8"[m
[31m-#define BSZPTR	"3"[m
[31m-#define REG_SP	"0x7"[m
[31m-#define REG_RA	"0x10"[m
[31m-#else[m
[31m-#define SZPTR	"4"[m
[31m-#define BSZPTR	"2"[m
[31m-#define REG_SP	"0x4"[m
[31m-#define REG_RA	"0x8"[m
[31m-#endif[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -" SZPTR "\n"[m
[31m-	"\t.byte " REG_RA "\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[31m-	"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-#if LJ_64[m
[31m-	"\t.quad .Lbegin\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[31m-#if LJ_NO_UNWIND[m
[31m-	"\t.byte 0x8d\n\t.uleb128 0x6\n"	/* offset r13 */[m
[31m-	"\t.byte 0x8c\n\t.uleb128 0x7\n"	/* offset r12 */[m
[31m-#endif[m
[31m-#else[m
[31m-	"\t.long .Lbegin\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[31m-	"\t.byte 0x87\n\t.uleb128 0x3\n"	/* offset edi */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x4\n"	/* offset esi */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x5\n"	/* offset ebx */[m
[31m-#endif[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LEFDE0:\n\n", fcofs, CFRAME_SIZE);[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-#if LJ_64[m
[31m-	"\t.quad lj_vm_ffi_call\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-#else[m
[31m-	"\t.long lj_vm_ffi_call\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 8\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x5\n"		/* def_cfa_register ebp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset ebx */[m
[31m-#endif[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#if !LJ_NO_UNWIND[m
[31m-#if (defined(__sun__) && defined(__svr4__))[m
[31m-#if LJ_64[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n");[m
[31m-#else[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");[m
[31m-#endif[m
[31m-#else[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.long .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -" SZPTR "\n"[m
[31m-	"\t.byte " REG_RA "\n"[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.long lj_err_unwind_dwarf-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[31m-	"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.long .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.long .LASFDE2-.Lframe1\n"[m
[31m-	"\t.long .Lbegin-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-#if LJ_64[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[31m-#else[m
[31m-	"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[31m-	"\t.byte 0x87\n\t.uleb128 0x3\n"	/* offset edi */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x4\n"	/* offset esi */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x5\n"	/* offset ebx */[m
[31m-#endif[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LEFDE2:\n\n", fcofs, CFRAME_SIZE);[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.long .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -" SZPTR "\n"[m
[31m-	"\t.byte " REG_RA "\n"[m
[31m-	"\t.uleb128 1\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[31m-	"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.long .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.long .LASFDE3-.Lframe2\n"[m
[31m-	"\t.long lj_vm_ffi_call-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-#if LJ_64[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-#else[m
[31m-	"\t.byte 0xe\n\t.uleb128 8\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x5\n"		/* def_cfa_register ebp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset ebx */[m
[31m-#endif[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#endif[m
[31m-    break;[m
[31m-#if !LJ_NO_UNWIND[m
[31m-  /* Mental note: never let Apple design an assembler.[m
[31m-  ** Or a linker. Or a plastic case. But I digress.[m
[31m-  */[m
[31m-  case BUILD_machasm: {[m
[31m-#if LJ_HASFFI[m
[31m-    int fcsize = 0;[m
[31m-#endif[m
[31m-    int i;[m
[31m-    fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	"EH_frame1:\n"[m
[31m-	"\t.set L$set$x,LECIEX-LSCIEX\n"[m
[31m-	"\t.long L$set$x\n"[m
[31m-	"LSCIEX:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.ascii \"zPR\\0\"\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.byte 128-" SZPTR "\n"[m
[31m-	"\t.byte " REG_RA "\n"[m
[31m-	"\t.byte 6\n"				/* augmentation length */[m
[31m-	"\t.byte 0x9b\n"			/* indirect|pcrel|sdata4 */[m
[31m-#if LJ_64[m
[31m-	"\t.long _lj_err_unwind_dwarf+4@GOTPCREL\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"[m
[31m-#else[m
[31m-	"\t.long L_lj_err_unwind_dwarf$non_lazy_ptr-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH-O. */[m
[31m-#endif[m
[31m-	"\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"[m
[31m-	"\t.align " BSZPTR "\n"[m
[31m-	"LECIEX:\n\n");[m
[31m-    for (i = 0; i < ctx->nsym; i++) {[m
[31m-      const char *name = ctx->sym[i].name;[m
[31m-      int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;[m
[31m-      if (size == 0) continue;[m
[31m-#if LJ_HASFFI[m
[31m-      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }[m
[31m-#endif[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "%s.eh:\n"[m
[31m-	  "LSFDE%d:\n"[m
[31m-	  "\t.set L$set$%d,LEFDE%d-LASFDE%d\n"[m
[31m-	  "\t.long L$set$%d\n"[m
[31m-	  "LASFDE%d:\n"[m
[31m-	  "\t.long LASFDE%d-EH_frame1\n"[m
[31m-	  "\t.long %s-.\n"[m
[31m-	  "\t.long %d\n"[m
[31m-	  "\t.byte 0\n"				/* augmentation length */[m
[31m-	  "\t.byte 0xe\n\t.byte %d\n"		/* def_cfa_offset */[m
[31m-#if LJ_64[m
[31m-	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[31m-	  "\t.byte 0x8f\n\t.byte 0x4\n"		/* offset r15 */[m
[31m-	  "\t.byte 0x8e\n\t.byte 0x5\n"		/* offset r14 */[m
[31m-#else[m
[31m-	  "\t.byte 0x84\n\t.byte 0x2\n"		/* offset ebp (4 for MACH-O)*/[m
[31m-	  "\t.byte 0x87\n\t.byte 0x3\n"		/* offset edi */[m
[31m-	  "\t.byte 0x86\n\t.byte 0x4\n"		/* offset esi */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x5\n"		/* offset ebx */[m
[31m-#endif[m
[31m-	  "\t.align " BSZPTR "\n"[m
[31m-	  "LEFDE%d:\n\n",[m
[31m-	  name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (fcsize) {[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "EH_frame2:\n"[m
[31m-	  "\t.set L$set$y,LECIEY-LSCIEY\n"[m
[31m-	  "\t.long L$set$y\n"[m
[31m-	  "LSCIEY:\n"[m
[31m-	  "\t.long 0\n"[m
[31m-	  "\t.byte 0x1\n"[m
[31m-	  "\t.ascii \"zR\\0\"\n"[m
[31m-	  "\t.byte 0x1\n"[m
[31m-	  "\t.byte 128-" SZPTR "\n"[m
[31m-	  "\t.byte " REG_RA "\n"[m
[31m-	  "\t.byte 1\n"				/* augmentation length */[m
[31m-#if LJ_64[m
[31m-	  "\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	  "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"[m
[31m-#else[m
[31m-	  "\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	  "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH. */[m
[31m-#endif[m
[31m-	  "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"[m
[31m-	  "\t.align " BSZPTR "\n"[m
[31m-	  "LECIEY:\n\n");[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "_lj_vm_ffi_call.eh:\n"[m
[31m-	  "LSFDEY:\n"[m
[31m-	  "\t.set L$set$yy,LEFDEY-LASFDEY\n"[m
[31m-	  "\t.long L$set$yy\n"[m
[31m-	  "LASFDEY:\n"[m
[31m-	  "\t.long LASFDEY-EH_frame2\n"[m
[31m-	  "\t.long _lj_vm_ffi_call-.\n"[m
[31m-	  "\t.long %d\n"[m
[31m-	  "\t.byte 0\n"				/* augmentation length */[m
[31m-#if LJ_64[m
[31m-	  "\t.byte 0xe\n\t.byte 16\n"		/* def_cfa_offset */[m
[31m-	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[31m-	  "\t.byte 0xd\n\t.byte 0x6\n"		/* def_cfa_register rbp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[31m-#else[m
[31m-	  "\t.byte 0xe\n\t.byte 8\n"		/* def_cfa_offset */[m
[31m-	  "\t.byte 0x84\n\t.byte 0x2\n"		/* offset ebp (4 for MACH-O)*/[m
[31m-	  "\t.byte 0xd\n\t.byte 0x4\n"		/* def_cfa_register ebp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset ebx */[m
[31m-#endif[m
[31m-	  "\t.align " BSZPTR "\n"[m
[31m-	  "LEFDEY:\n\n", fcsize);[m
[31m-    }[m
[31m-#endif[m
[31m-#if !LJ_64[m
[31m-    fprintf(ctx->fp,[m
[31m-      "\t.non_lazy_symbol_pointer\n"[m
[31m-      "L_lj_err_unwind_dwarf$non_lazy_ptr:\n"[m
[31m-      ".indirect_symbol _lj_err_unwind_dwarf\n"[m
[31m-      ".long 0\n\n");[m
[31m-    fprintf(ctx->fp, "\t.section __IMPORT,__jump_table,symbol_stubs,pure_instructions+self_modifying_code,5\n");[m
[31m-    {[m
[31m-      const char *const *xn;[m
[31m-      for (xn = ctx->extnames; *xn; xn++)[m
[31m-	if (strncmp(*xn, LABEL_PREFIX, sizeof(LABEL_PREFIX)-1))[m
[31m-	  fprintf(ctx->fp, "L_%s$stub:\n\t.indirect_symbol _%s\n\t.ascii \"\\364\\364\\364\\364\\364\"\n", *xn, *xn);[m
[31m-    }[m
[31m-#endif[m
[31m-    fprintf(ctx->fp, ".subsections_via_symbols\n");[m
[31m-    }[m
[31m-    break;[m
[31m-#endif[m
[31m-  default:  /* Difficult for other modes. */[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/xb1build.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/xb1build.bat[m
[1mdeleted file mode 100644[m
[1mindex 847e84a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/xb1build.bat[m
[1m+++ /dev/null[m
[36m@@ -1,101 +0,0 @@[m
[31m-@rem Script to build LuaJIT with the Xbox One SDK.[m
[31m-@rem Donated to the public domain.[m
[31m-@rem[m
[31m-@rem Open a "Visual Studio .NET Command Prompt" (64 bit host compiler)[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-@if not defined DurangoXDK goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@echo ---- Host compiler ----[m
[31m-@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE /DLUAJIT_ENABLE_GC64[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@rem Error out for 64 bit host compiler[m
[31m-@minilua[m
[31m-@if not errorlevel 8 goto :FAIL[m
[31m-[m
[31m-@set DASMFLAGS=-D WIN -D FFI -D P64[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x64.dasc[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% /D_DURANGO host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m peobj -o lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@echo ---- Cross compiler ----[m
[31m-[m
[31m-@set CWD=%cd%[m
[31m-@call "%DurangoXDK%\xdk\DurangoVars.cmd" XDK[m
[31m-@cd /D "%CWD%"[m
[31m-@shift[m
[31m-[m
[31m-@set LJCOMPILE="cl" /nologo /c /W3 /GF /Gm- /GR- /GS- /Gy /openmp- /D_CRT_SECURE_NO_DEPRECATE /D_LIB /D_UNICODE /D_DURANGO[m
[31m-@set LJLIB="lib" /nologo[m
[31m-[m
[31m-@if "%1"=="debug" ([m
[31m-  @shift[m
[31m-  @set LJCOMPILE=%LJCOMPILE% /Zi /MDd /Od[m
[31m-  @set LJLINK=%LJLINK% /debug [m
[31m-) else ([m
[31m-  @set LJCOMPILE=%LJCOMPILE% /MD /O2 /DNDEBUG[m
[31m-)[m
[31m-[m
[31m-@if "%1"=="amalg" goto :AMALG[m
[31m-%LJCOMPILE% /DLUA_BUILD_AS_DLL lj_*.c lib_*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:luajit.lib lj_*.obj lib_*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :NOAMALG[m
[31m-:AMALG[m
[31m-%LJCOMPILE% /DLUA_BUILD_AS_DLL ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:luajit.lib ljamalg.obj lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-:NOAMALG[m
[31m-[m
[31m-@del *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for Xbox One ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo To run this script you must open a "Visual Studio .NET Command Prompt"[m
[31m-@echo (64 bit host compiler). The Xbox One SDK must be installed, too.[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/xedkbuild.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/xedkbuild.bat[m
[1mdeleted file mode 100644[m
[1mindex 240ec87..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/LuaJIT-2.1-20160517/src/xedkbuild.bat[m
[1m+++ /dev/null[m
[36m@@ -1,92 +0,0 @@[m
[31m-@rem Script to build LuaJIT with the Xbox 360 SDK.[m
[31m-@rem Donated to the public domain.[m
[31m-@rem[m
[31m-@rem Open a "Visual Studio .NET Command Prompt" (32 bit host compiler)[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-@if not defined XEDK goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@rem ---- Host compiler ----[m
[31m-@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@rem Error out for 64 bit host compiler[m
[31m-@minilua[m
[31m-@if errorlevel 8 goto :FAIL[m
[31m-[m
[31m-@set DASMFLAGS=-D GPR64 -D FRAME32 -D PPE -D SQRT -D DUALNUM[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_ppc.dasc[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% /D_XBOX_VER=200 /DLUAJIT_TARGET=LUAJIT_ARCH_PPC  host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m peobj -o lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@rem ---- Cross compiler ----[m
[31m-@set LJCOMPILE="%XEDK%\bin\win32\cl" /nologo /c /MT /O2 /W3 /GF /Gm- /GR- /GS- /Gy /openmp- /D_CRT_SECURE_NO_DEPRECATE /DNDEBUG /D_XBOX /D_LIB /DLUAJIT_USE_SYSMALLOC[m
[31m-@set LJLIB="%XEDK%\bin\win32\lib" /nologo[m
[31m-@set "INCLUDE=%XEDK%\include\xbox"[m
[31m-[m
[31m-@if "%1" neq "debug" goto :NODEBUG[m
[31m-@shift[m
[31m-@set "LJCOMPILE=%LJCOMPILE% /Zi"[m
[31m-:NODEBUG[m
[31m-@if "%1"=="amalg" goto :AMALG[m
[31m-%LJCOMPILE% /DLUA_BUILD_AS_DLL lj_*.c lib_*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:luajit20.lib lj_*.obj lib_*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :NOAMALG[m
[31m-:AMALG[m
[31m-%LJCOMPILE% /DLUA_BUILD_AS_DLL ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:luajit20.lib ljamalg.obj lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-:NOAMALG[m
[31m-[m
[31m-@del *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for Xbox 360 ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo To run this script you must open a "Visual Studio .NET Command Prompt"[m
[31m-@echo (32 bit host compiler). The Xbox 360 SDK must be installed, too.[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex a88c6c8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-reindex[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-genmobi.sh[m
[31m-*.mobi[m
[31m-misc/chunked[m
[31m-ctags[m
[31m-src/module.c[m
[31m-src/util.c[m
[31m-src/util.h[m
[31m-all[m
[31m-go[m
[31m-build1[0-9][m
[31m-buildroot/[m
[31m-work/[m
[31m-Makefile[m
[31m-nginx[m
[31m-*.plist[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/config[m
[1mdeleted file mode 100644[m
[1mindex 7f5ec72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/config[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_array_var; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_array_var; please put it before ngx_array_var." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_array_var; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_array_var; please put it before ngx_array_var." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_array_var_module[m
[31m-[m
[31m-HTTP_ARRAY_VAR_SRCS="                                                       \[m
[31m-                    $ngx_addon_dir/src/ngx_http_array_var_module.c          \[m
[31m-                    $ngx_addon_dir/src/ngx_http_array_var_util.c            \[m
[31m-                    "[m
[31m-[m
[31m-HTTP_ARRAY_VAR_DEPS="                                                       \[m
[31m-                    $ngx_addon_dir/src/ddebug.h                             \[m
[31m-                    $ngx_addon_dir/src/ngx_http_array_var_util.h            \[m
[31m-                    "[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HTTP_ARRAY_VAR_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_ARRAY_VAR_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_ARRAY_VAR_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_ARRAY_VAR_DEPS"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 6f1f8be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,73 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "array_var *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_module.c[m
[1mdeleted file mode 100644[m
[1mindex 0b715b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,753 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_array_var_util.h"[m
[31m-#include <ndk.h>[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_array_it_key = ngx_string("array_it");[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t          nargs;[m
[31m-} ngx_http_array_split_data_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned                         in_place;[m
[31m-    ngx_http_complex_value_t        *template;[m
[31m-    ngx_int_t                        array_it_index;[m
[31m-} ngx_http_array_map_data_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned                         in_place;[m
[31m-} ngx_http_array_map_op_data_t;[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_array_split(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_array_map(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_array_map_op(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_array_join(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_array_var_split(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data);[m
[31m-static ngx_int_t ngx_http_array_var_map(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data);[m
[31m-static ngx_int_t ngx_http_array_var_map_op(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data);[m
[31m-static ngx_int_t ngx_http_array_var_join(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_array_var_commands[] = {[m
[31m-    {[m
[31m-        ngx_string ("array_split"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-        ngx_http_array_split,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("array_map"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                          |NGX_CONF_TAKE23,[m
[31m-        ngx_http_array_map,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("array_map_op"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                          |NGX_CONF_TAKE23,[m
[31m-        ngx_http_array_map_op,[m
[31m-        0,[m
[31m-        0,[m
[31m-        (void *) ngx_http_array_var_map_op[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("array_join"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                          |NGX_CONF_TAKE23,[m
[31m-        ngx_http_array_join,[m
[31m-        0,[m
[31m-        0,[m
[31m-        (void *) ngx_http_array_var_join[m
[31m-    },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_array_var_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_array_var_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_array_var_module_ctx,          /* module context */[m
[31m-    ngx_http_array_var_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                         /* module type */[m
[31m-    NULL,                                    /* init master */[m
[31m-    NULL,                                    /* init module */[m
[31m-    NULL,                                    /* init process */[m
[31m-    NULL,                                    /* init thread */[m
[31m-    NULL,                                    /* exit thread */[m
[31m-    NULL,                                    /* exit process */[m
[31m-    NULL,                                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_array_split(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                    filter;[m
[31m-    ngx_str_t                        target;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_str_t                       *bad_arg;[m
[31m-    ngx_http_array_split_data_t     *data = NULL;[m
[31m-[m
[31m-    data = ngx_palloc(cf->pool, sizeof(ngx_http_array_split_data_t));[m
[31m-    if (data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-    filter.func = (void *) ngx_http_array_var_split;[m
[31m-    filter.data = data;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        dd("array_split $sep $var");[m
[31m-        data->nargs = filter.size = 2;[m
[31m-        target = value[2];[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* cf->args->nelts >= 3 + 1 */[m
[31m-[m
[31m-    if (value[3].len >= sizeof("to=") - 1[m
[31m-        && ngx_str3cmp(value[3].data, 't', 'o', '='))[m
[31m-    {[m
[31m-        dd("array_split $sep $str to=$array");[m
[31m-        data->nargs = filter.size = 2;[m
[31m-[m
[31m-        target.data = value[3].data + sizeof("to=") - 1;[m
[31m-        target.len = value[3].len - (sizeof("to=") - 1);[m
[31m-        dd("split target: %.*s", (int) target.len, target.data);[m
[31m-[m
[31m-        if (cf->args->nelts > 3 + 1) {[m
[31m-            bad_arg = &value[4];[m
[31m-            goto unexpected_arg;[m
[31m-        }[m
[31m-[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* the 3rd argument is max_items */[m
[31m-[m
[31m-    if (cf->args->nelts > 4 + 1) {[m
[31m-        bad_arg = &value[5];[m
[31m-        goto unexpected_arg;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 4 + 1) {[m
[31m-        /* array_split $sep $str $max to=$array */[m
[31m-[m
[31m-        if (value[4].len < sizeof("to=") - 1[m
[31m-            || ! (ngx_str3cmp(value[4].data, 't', 'o', '=')))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                               "%V: expecting the \"to\" option at the "[m
[31m-                    "4th argument: \"%V\"",[m
[31m-                    &cmd->name, &value[4]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        data->nargs = filter.size = 3;[m
[31m-[m
[31m-        target.data = value[4].data + sizeof("to=") - 1;[m
[31m-        target.len = value[4].len - (sizeof("to=") - 1);[m
[31m-[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* cf->args->nelts == 3 + 1 */[m
[31m-[m
[31m-    /* array_split $sep $var $max */[m
[31m-[m
[31m-    target = value[2];[m
[31m-    data->nargs = filter.size = 3;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-[m
[31m-unexpected_arg:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V: unexpected argument \"%V\"",[m
[31m-                       &cmd->name, bad_arg);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_array_map(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                        filter;[m
[31m-    ngx_str_t                            target;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_http_array_map_data_t           *data;[m
[31m-    ngx_http_compile_complex_value_t     ccv;[m
[31m-[m
[31m-    data = ngx_palloc(cf->pool, sizeof(ngx_http_array_map_data_t));[m
[31m-    if (data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    data->template = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-    if (data->template == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_memzero(data->template, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = data->template;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_VALUE_DATA;[m
[31m-    filter.func = (void *) ngx_http_array_var_map;[m
[31m-    filter.data = data;[m
[31m-    filter.size = 1;[m
[31m-[m
[31m-    data->array_it_index = ngx_http_array_var_add_variable(cf,[m
[31m-            &ngx_http_array_it_key);[m
[31m-[m
[31m-    if (data->array_it_index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        /* array_map $template $array */[m
[31m-        data->in_place = 1;[m
[31m-        target = value[2];[m
[31m-[m
[31m-    } else {[m
[31m-        /* cf->args->nelts == 3 + 1 */[m
[31m-[m
[31m-        if (value[3].len < sizeof("to=") - 1[m
[31m-            || ! (ngx_str3cmp(value[3].data, 't', 'o', '=')))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%V: expecting the \"to\" option at "[m
[31m-                               "the 3rd argument: \"%V\"",[m
[31m-                               &cmd->name, &value[3]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        target.data = value[3].data + sizeof("to=") - 1;[m
[31m-        target.len = value[3].len - (sizeof("to=") - 1);[m
[31m-        data->in_place = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_value_core(cf, &target, &value[2], &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_array_map_op(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_array_map_op_data_t    *data;[m
[31m-    ndk_set_var_t                    filter;[m
[31m-    ngx_str_t                        target;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_str_t                       *bad_arg;[m
[31m-[m
[31m-    data = ngx_palloc(cf->pool, sizeof(ngx_http_array_map_op_data_t));[m
[31m-    if (data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-    filter.func = cmd->post;[m
[31m-    filter.data = data;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        dd("array_join $sep $var");[m
[31m-[m
[31m-        filter.size = 2;[m
[31m-        data->in_place = 1;[m
[31m-[m
[31m-        target = value[2];[m
[31m-[m
[31m-        dd("array join target: %.*s", (int) target.len, target.data);[m
[31m-[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* cf->args->nelts == 3 + 1 */[m
[31m-[m
[31m-    if (value[3].len >= sizeof("to=") - 1[m
[31m-        && ngx_str3cmp(value[3].data, 't', 'o', '='))[m
[31m-    {[m
[31m-        /* array_join $sep $str to=$array */[m
[31m-        filter.size = 2;[m
[31m-        data->in_place = 0;[m
[31m-[m
[31m-        target.data = value[3].data + sizeof("to=") - 1;[m
[31m-        target.len = value[3].len - (sizeof("to=") - 1);[m
[31m-[m
[31m-        if (cf->args->nelts > 3 + 1) {[m
[31m-            bad_arg = &value[4];[m
[31m-[m
[31m-        } else {[m
[31m-            return ndk_set_var_multi_value_core(cf, &target, &value[1],[m
[31m-                                                &filter);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        bad_arg = &value[3];[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "%V: unexpected argument \"%V\"",[m
[31m-                       &cmd->name, bad_arg);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_array_join(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                    filter;[m
[31m-    ngx_str_t                        target;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_str_t                       *bad_arg;[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.func = cmd->post;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        dd("array_join $sep $var");[m
[31m-[m
[31m-        filter.size = 2;[m
[31m-        target = value[2];[m
[31m-[m
[31m-        dd("array join target: %.*s", (int) target.len, target.data);[m
[31m-[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* cf->args->nelts == 3 + 1 */[m
[31m-[m
[31m-    if (value[3].len >= sizeof("to=") - 1[m
[31m-        && ngx_str3cmp(value[3].data, 't', 'o', '='))[m
[31m-    {[m
[31m-        /* array_join $sep $str to=$array */[m
[31m-        filter.size = 2;[m
[31m-[m
[31m-        target.data = value[3].data + sizeof("to=") - 1;[m
[31m-        target.len = value[3].len - (sizeof("to=") - 1);[m
[31m-[m
[31m-        if (cf->args->nelts > 3 + 1) {[m
[31m-            bad_arg = &value[4];[m
[31m-        } else {[m
[31m-            return ndk_set_var_multi_value_core(cf, &target, &value[1],[m
[31m-                                                &filter);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        bad_arg = &value[3];[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "%V: unexpected argument \"%V\"",[m
[31m-                       &cmd->name, bad_arg);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_split(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    ngx_http_array_split_data_t             *conf = data;[m
[31m-    ngx_http_variable_value_t               *sep, *str;[m
[31m-    ngx_str_t                               *s;[m
[31m-    u_char                                  *pos, *end, *last = NULL;[m
[31m-    ssize_t                                  max, i, len = 4;[m
[31m-    ngx_array_t                             *array;[m
[31m-[m
[31m-    if (conf->nargs == 3) {[m
[31m-        max = ngx_atosz(v[2].data, v[2].len);[m
[31m-        if (max == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "array_split: invalid max items: \"%V\"",[m
[31m-                          &v[2]);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    } else {[m
[31m-        max = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (max) {[m
[31m-        len = max;[m
[31m-    }[m
[31m-[m
[31m-    array = ngx_array_create(r->pool, len, sizeof(ngx_str_t));[m
[31m-    if (array == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sep = &v[0];[m
[31m-    str = &v[1];[m
[31m-[m
[31m-    pos = str->data;[m
[31m-    end = str->data + str->len;[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    if (sep->len == 0) {[m
[31m-        /* split each char into an array elem */[m
[31m-[m
[31m-        while (i != max - 1 && pos < end - 1) {[m
[31m-            s = ngx_array_push(array);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            s->data = pos;[m
[31m-            s->len = 1;[m
[31m-[m
[31m-            pos++;[m
[31m-            i++;[m
[31m-        }[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    while (i != max - 1) {[m
[31m-        last = ngx_http_array_var_strlstrn(pos, end, sep->data,[m
[31m-                                           sep->len - 1);[m
[31m-        if (last == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        s = ngx_array_push(array);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        s->data = pos;[m
[31m-        s->len = last - pos;[m
[31m-[m
[31m-        dd("split item %.*s", (int) s->len, s->data);[m
[31m-[m
[31m-        pos = last + sep->len;[m
[31m-        i++;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    dd("pos %p, last %p, end %p", pos, last, end);[m
[31m-[m
[31m-    s = ngx_array_push(array);[m
[31m-    if (s == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->data = pos;[m
[31m-    s->len = end - pos;[m
[31m-[m
[31m-    dd("split item %.*s", (int) s->len, s->data);[m
[31m-[m
[31m-    dd("split: array size: %d", (int) array->nelts);[m
[31m-    dd("split array ptr: %p", array);[m
[31m-[m
[31m-    res->data = (u_char *) array;[m
[31m-    res->len = sizeof(ngx_array_t);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_map(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    ngx_http_array_map_data_t       *conf = data;[m
[31m-    ngx_http_variable_value_t       *array_it;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_str_t                       *value, *new_value;[m
[31m-    ngx_array_t                     *array, *new_array;[m
[31m-[m
[31m-    dd("entered array var map");[m
[31m-[m
[31m-    if (conf->template == NULL) {[m
[31m-        dd("template empty");[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (v[0].len != sizeof(ngx_array_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_join: invalid array variable value in the 2nd "[m
[31m-                      "argument: \"%.*s\"", &v[0]);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    array = (ngx_array_t *) v[0].data;[m
[31m-[m
[31m-    value = array->elts;[m
[31m-[m
[31m-    array_it = ngx_http_get_indexed_variable(r, conf->array_it_index);[m
[31m-[m
[31m-    if (conf->in_place) {[m
[31m-        new_array = array;[m
[31m-[m
[31m-    } else {[m
[31m-        new_array = ngx_array_create(r->pool, array->nelts,[m
[31m-                                     sizeof(ngx_str_t));[m
[31m-        if (new_array == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("array var map: array size: %d", (int) array->nelts);[m
[31m-[m
[31m-    array_it->not_found = 0;[m
[31m-    array_it->valid = 1;[m
[31m-[m
[31m-    for (i = 0; i < array->nelts; i++) {[m
[31m-        array_it->data = value[i].data;[m
[31m-        array_it->len = value[i].len;[m
[31m-[m
[31m-        dd("array it: %.*s", array_it->len, array_it->data);[m
[31m-[m
[31m-        if (conf->in_place) {[m
[31m-            new_value = &value[i];[m
[31m-[m
[31m-        } else {[m
[31m-            new_value = ngx_array_push(new_array);[m
[31m-            if (new_value == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, conf->template, new_value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("array var map: new item: %.*s", (int) new_value->len,[m
[31m-           new_value->data);[m
[31m-    }[m
[31m-[m
[31m-    array_it->not_found = 1;[m
[31m-    array_it->valid = 0;[m
[31m-[m
[31m-    res->data = (u_char *) new_array;[m
[31m-    res->len = sizeof(ngx_array_t);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_map_op(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    ngx_http_variable_value_t            arg;[m
[31m-    ngx_http_array_map_op_data_t        *conf = data;[m
[31m-    ndk_set_var_value_pt                 func;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_str_t                           *new_value;[m
[31m-    ngx_array_t                         *array;[m
[31m-    ngx_array_t                         *new_array;[m
[31m-[m
[31m-    func = ngx_http_array_var_get_func_from_cmd(v[0].data, v[0].len);[m
[31m-[m
[31m-    if (func == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_map_op: directive \"%v\" not found "[m
[31m-                      "or does not use ndk_set_var_value",[m
[31m-                      &v[0]);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v[1].len != sizeof(ngx_array_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_map_op: invalid array variable value in the 2nd "[m
[31m-                      "argument: \"%.*s\"", &v[0]);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    array = (ngx_array_t *) v[1].data;[m
[31m-[m
[31m-    value = array->elts;[m
[31m-[m
[31m-    if (conf->in_place) {[m
[31m-        new_array = array;[m
[31m-[m
[31m-    } else {[m
[31m-        new_array = ngx_array_create(r->pool, array->nelts,[m
[31m-                                     sizeof(ngx_str_t));[m
[31m-        if (new_array == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < array->nelts; i++) {[m
[31m-        arg.data = value[i].data;[m
[31m-        arg.len = value[i].len;[m
[31m-        arg.valid = 1;[m
[31m-        arg.not_found = 0;[m
[31m-[m
[31m-        if (conf->in_place) {[m
[31m-            new_value = &value[i];[m
[31m-[m
[31m-        } else {[m
[31m-            new_value = ngx_array_push(new_array);[m
[31m-            if (new_value == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = func(r, new_value, &arg);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    res->data = (u_char *) new_array;[m
[31m-    res->len = sizeof(ngx_array_t);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_join(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_variable_value_t           *sep;[m
[31m-    ngx_array_t                         *array;[m
[31m-    size_t                               len;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_uint_t                           i;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    sep = &v[0];[m
[31m-[m
[31m-    dd("sep %.*s", sep->len, sep->data);[m
[31m-[m
[31m-    if (v[1].len != sizeof(ngx_array_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_join: invalid array variable value in the "[m
[31m-                      "2nd argument: \"%V\"", &v[1]);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    array = (ngx_array_t *) v[1].data;[m
[31m-[m
[31m-    dd("join array ptr %p", array);[m
[31m-    dd("array->nelts: %d", (int) array->nelts);[m
[31m-[m
[31m-    if (array->nelts == 0) {[m
[31m-        res->data = NULL;[m
[31m-        res->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = array->elts;[m
[31m-[m
[31m-    len = sep->len * (array->nelts - 1);[m
[31m-[m
[31m-    for (i = 0; i < array->nelts; i++) {[m
[31m-        len += value[i].len;[m
[31m-    }[m
[31m-[m
[31m-    dd("buf len %d", (int) len);[m
[31m-[m
[31m-    res->data = ngx_palloc(r->pool, len);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->len = len;[m
[31m-[m
[31m-    p = res->data;[m
[31m-[m
[31m-    for (i = 0; i < array->nelts; i++) {[m
[31m-        dd("copying elem of size %d", (int) value[i].len);[m
[31m-        p = ngx_copy(p, value[i].data, value[i].len);[m
[31m-        if (i < array->nelts - 1) {[m
[31m-            p = ngx_copy(p, sep->data, sep->len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p != res->data + res->len) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_join: buffer error");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_util.c[m
[1mdeleted file mode 100644[m
[1mindex 28195e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_array_var_util.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_array_var_variable_not_found(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-/* Modified from the ngx_strlcasestrn function in ngx_string.h[m
[31m- * Copyright (C) by Igor Sysoev */[m
[31m-u_char *[m
[31m-ngx_http_array_var_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    last -= n;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (s1 >= last) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ndk_set_var_value_pt[m
[31m-ngx_http_array_var_get_func_from_cmd(u_char *name, size_t name_len)[m
[31m-{[m
[31m-    ndk_set_var_t           *filter;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_module_t           **modules;[m
[31m-    ngx_module_t            *module;[m
[31m-    ngx_command_t           *cmd;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009011[m
[31m-    modules = ngx_cycle->modules;[m
[31m-#else[m
[31m-    modules = ngx_modules;[m
[31m-#endif[m
[31m-[m
[31m-    for (i = 0; modules[i]; i++) {[m
[31m-        module = modules[i];[m
[31m-        if (module->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cmd = modules[i]->commands;[m
[31m-        if (cmd == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; cmd->name.len; cmd++) {[m
[31m-            if (cmd->set != ndk_set_var_value) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            filter = cmd->post;[m
[31m-            if (filter == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (cmd->name.len != name_len[m
[31m-                || ngx_strncmp(cmd->name.data, name, name_len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return (ndk_set_var_value_pt) filter->func;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_array_var_add_variable(ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_variable_t         *v;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->get_handler = ngx_http_array_var_variable_not_found;[m
[31m-[m
[31m-    return ngx_http_get_variable_index(cf, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_variable_not_found(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->not_found = 1;[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_util.h[m
[1mdeleted file mode 100644[m
[1mindex b69a4e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/src/ngx_http_array_var_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-#ifndef NGX_HTTP_ARRAY_VAR_UTIL_H[m
[31m-#define NGX_HTTP_ARRAY_VAR_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_array_var_add_variable(ngx_conf_t *cf, ngx_str_t *name);[m
[31m-[m
[31m-u_char *ngx_http_array_var_strlstrn(u_char *s1, u_char *last, u_char *s2,[m
[31m-    size_t n);[m
[31m-[m
[31m-ndk_set_var_value_pt ngx_http_array_var_get_func_from_cmd(u_char *name,[m
[31m-    size_t name_len);[m
[31m-[m
[31m-[m
[31m-#ifndef ngx_str3cmp[m
[31m-[m
[31m-#  define ngx_str3cmp(m, c0, c1, c2)                                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2[m
[31m-[m
[31m-#endif /* ngx_str3cmp */[m
[31m-[m
[31m-#endif /* NGX_HTTP_ARRAY_VAR_UTIL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 0db489a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,371 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: array split/join[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob,Marry,John[m
[31m---- response_body[m
[31m-Bob+Marry+John[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: array split/join (non-empty sep with a limit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names 2 to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob,Marry,John[m
[31m---- response_body[m
[31m-Bob+Marry,John[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: array split/join (non-empty sep with a ZERO limit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names 0 to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob,Marry,John[m
[31m---- response_body[m
[31m-Bob+Marry+John[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: array split/join (emtpy sep with a limit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names 2 to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob[m
[31m---- response_body[m
[31m-B+ob[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: array split/join (emtpy sep with a ZERO limit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names 0 to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob[m
[31m---- response_body[m
[31m-B+o+b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: array split (empty split sep)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob[m
[31m---- response_body[m
[31m-B+o+b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: array split (empty split/join sep)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names to=$names;[m
[31m-        array_join '' $names;[m
[31m-        echo [$names];[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob[m
[31m---- response_body[m
[31m-[Bob][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: array split (empty split + empty input)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo [$names];[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: array split/join (single item)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=nomas[m
[31m---- response_body[m
[31m-nomas[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: array split/join (empty array)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "[$names]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: array split/join (multi-char sep)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '->' $arg_names to=$names;[m
[31m-        array_join '(+)' $names;[m
[31m-        echo "$names";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=a->b->c[m
[31m---- response_body[m
[31m-a(+)b(+)c[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: array split/join (list of empty values)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "[$names]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=,,,[m
[31m---- response_body[m
[31m-[+++][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: array map[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map 'hi' $names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "[$names]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=,,,[m
[31m---- response_body[m
[31m-[hi+hi+hi+hi][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: array map (in-place)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "$names";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-[bob]+[marry]+[nomas][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: array map (copy)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names to=$names2;[m
[31m-        array_join '+' $names;[m
[31m-        array_join '+' $names2;[m
[31m-        echo "$names";[m
[31m-        echo "$names2";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-bob+marry+nomas[m
[31m-[bob]+[marry]+[nomas][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: array map (empty values)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "$names";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=,marry,nomas[m
[31m---- response_body[m
[31m-[]+[marry]+[nomas][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: non-in-place join[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        array_join '-' $names to=$res2;[m
[31m-        echo $res;[m
[31m-        echo $res2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-bob+marry+nomas[m
[31m-bob-marry-nomas[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: non-in-place join[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        array_join '-' $names to=$res2;[m
[31m-        echo $res;[m
[31m-        echo $res2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-bob+marry+nomas[m
[31m-bob-marry-nomas[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: map op (in-place)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_sql_str $names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-'bob'+'marry'+'nomas'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: map op (copy)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_sql_str $names to=$list;[m
[31m-        array_join '+' $list to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-'bob'+'marry'+'nomas'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: map op (quote special chars)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_sql_str $names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=',\[m
[31m---- response_body[m
[31m-'\''+'\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: $array_it gets cleared after array map[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names;[m
[31m-        echo "[$array_it]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: map op (copy) on set_quote_pgsql_str[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_pgsql_str $names to=$list;[m
[31m-        array_join '+' $list to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-E'bob'+E'marry'+E'nomas'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: map op (copy) on set_quote_json_str[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_json_str $names to=$list;[m
[31m-        array_join '+' $list to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-"bob"+"marry"+"nomas"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex c9b2873..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-version=$1[m
[31m-force=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --with-debug || exit 1[m
[31m-          #--add-module=$home/work/ndk \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ab1e4bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/array-var-nginx-module-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,159 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:sendmsg[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_pass_open_channel[m
[31m-fun:ngx_start_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-epoll_ctl(event)[m
[31m-fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex a65d396..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/upstream.[ch][m
[31m-all[m
[31m-go[m
[31m-buildroot/[m
[31m-pack[m
[31m-t/servroot/[m
[31m-build1[0-9][m
[31m-*.plist[m
[31m-Makefile[m
[31m-*.patch[m
[31m-analyze[m
[31m-*.html[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/Changes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/Changes[m
[1mdeleted file mode 100644[m
[1mindex 5d73650..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/Changes[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-v0.1.0 - 5 July 2011[m
[31m-* now we require at least libdrizzle 1.0, which supports official mysql 5.5+ and is much more stable under load. thanks Taylor Weibley for pushing this. We no longer require patching libdrizzle any more.[m
[31m-[m
[31m-* fixed a compilation issue on Mac OS X: we should include drizzle.h prior to nginx headers, or we will not get the "bool" type properly installed on Mac OS X.[m
[31m-[m
[31m-* fixed the spots that trigger -Wunused-but-set-variable by gcc 4.6.[m
[31m-[m
[31m-* fixed the duplicate last chunk issue: we should not set the last_buf flag ourselves in drizzle_output.c because ngx_http_upstream already sends a last buf for us.[m
[31m-[m
[31m-* ported over Maxim Dounin's patch for ngx_http_upstream_keepalive connection pool fixes: we should have discarded stale read events for cached tcp connections in the pool.[m
[31m-[m
[31m-* implemented the new drizzle_status directive to provide connection pool status monitoring capability.[m
[31m-[m
[31m-* fixed a minor bug in the connection pool: we should resume the "name", "sockaddr", and "socklen" fields for the connection from the pool such that we can get more detailed error log messages with the "upstream: drizzle://ip.add.re.ss:port" bit.[m
[31m-[m
[31m-* implemented the $drizzle_thread_id variable which is automatically set when mysql/drizzle times out.[m
[31m-[m
[31m-* now we use the 2-clause bsd license.[m
[31m-[m
[31m-* report an error message when upstream name not found for drizzle_pass.[m
[31m-[m
[31m-* now we implemented the charset option for the "drizzle_server" diredctive which causes ngx_drizzle send "set names xxx" automatcially for every connection to that drizzle server.[m
[31m-[m
[31m-* added a lot of more documentation.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/config[m
[1mdeleted file mode 100644[m
[1mindex ae901c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/config[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <libdrizzle/drizzle_client.h>"[m
[31m-ngx_feature_test="drizzle_version();"[m
[31m-[m
[31m-if [ -n "$LIBDRIZZLE_INC" -o -n "$LIBDRIZZLE_LIB" ]; then[m
[31m-    # explicit set libdrizzle lib path[m
[31m-    ngx_feature="libdrizzle library in directories specified by LIBDRIZZLE_INC ($LIBDRIZZLE_INC) and LIBDRIZZLE_LIB ($LIBDRIZZLE_LIB)"[m
[31m-    ngx_feature_path="$LIBDRIZZLE_INC"[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R$LIBDRIZZLE_LIB -L$LIBDRIZZLE_LIB -ldrizzle"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L$LIBDRIZZLE_LIB -ldrizzle"[m
[31m-    fi[m
[31m-    . auto/feature[m
[31m-else[m
[31m-    # auto-discovery[m
[31m-    ngx_feature="libdrizzle library"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-ldrizzle"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # Ubuntu 12.04[m
[31m-        ngx_feature="libdrizzle library in /usr/local/"[m
[31m-        ngx_feature_path="/usr/include/libdrizzle-1.0"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/lib -L/usr/lib -ldrizzle"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/lib -ldrizzle"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # FreeBSD, OpenBSD[m
[31m-        ngx_feature="libdrizzle library in /usr/local/"[m
[31m-        ngx_feature_path="/usr/local/include/libdrizzle-1.0"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -ldrizzle"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/local/lib -ldrizzle"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # NetBSD[m
[31m-        ngx_feature="libdrizzle library in /usr/pkg/"[m
[31m-        ngx_feature_path="/usr/pkg/include/libdrizzle-1.0"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -ldrizzle"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/pkg/lib -ldrizzle"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # MacPorts[m
[31m-        ngx_feature="libdrizzle library in /opt/local/"[m
[31m-        ngx_feature_path="/opt/local/include/libdrizzle-1.0"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -ldrizzle"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/opt/local/lib -ldrizzle"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-else[m
[31m- cat << END[m
[31m- $0: error: the ngx_drizzle addon requires the libdrizzle library.[m
[31m-END[m
[31m- exit 1[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_drizzle_module[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_http_drizzle_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_http_drizzle_module.c $ngx_addon_dir/src/ngx_http_drizzle_handler.c $ngx_addon_dir/src/ngx_http_drizzle_processor.c $ngx_addon_dir/src/ngx_http_drizzle_upstream.c $ngx_addon_dir/src/ngx_http_drizzle_util.c $ngx_addon_dir/src/ngx_http_drizzle_output.c $ngx_addon_dir/src/ngx_http_drizzle_keepalive.c $ngx_addon_dir/src/ngx_http_drizzle_quoting.c $ngx_addon_dir/src/ngx_http_drizzle_checker.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ddebug.h $ngx_addon_dir/src/ngx_http_drizzle_module.h $ngx_addon_dir/src/ngx_http_drizzle_handler.h $ngx_addon_dir/src/ngx_http_drizzle_processor.h $ngx_addon_dir/src/ngx_http_drizzle_upstream.h $ngx_addon_dir/src/ngx_http_drizzle_util.h $ngx_addon_dir/src/ngx_http_drizzle_output.h $ngx_addon_dir/src/resty_dbd_stream.h $ngx_addon_dir/src/ngx_http_drizzle_keepalive.h $ngx_addon_dir/src/ngx_http_drizzle_quoting.h $ngx_addon_dir/src/ngx_http_drizzle_checker.h"[m
[31m-[m
[31m-have=NGX_DRIZZLE_MODULE . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/doc/design b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/doc/design[m
[1mdeleted file mode 100644[m
[1mindex 3d66c16..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/doc/design[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-main request to location "/drizzle" (handled by mod_drizzle)[m
[31m-	-> mod_drizzle content handler (is main request)[m
[31m-		-> emit subrequest to location "/drizzle"[m
[31m-		-> return NGX_DONE[m
[31m-	-> mod_drizzle content handler (is subrequest)[m
[31m-		-> connect db (through libdrizzle), get db connection fd[m
[31m-		-> wrap db connection fd into a ngx_event, reg rd/wr event handler[m
[31m-		-> return NGX_DONE[m
[31m-	-> i/o event occured on db connection[m
[31m-		-> rd/wr event handler called, call mod_drizzle content handler using subrequest struct[m
[31m-			-> mod_drizzle content handler called (is subrequest)[m
[31m-				-> continue libdrizzle state machine[m
[31m-				-> generate response header and body if done,[m
[31m-					then unreg db connection events,[m
[31m-					and call ngx_http_finalize_request to release self[m
[31m-				-> return NGX_OK[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex aa2339d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,113 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   define dd_dump_chain_size() { \[m
[31m-        int              n; \[m
[31m-        ngx_chain_t     *cl; \[m
[31m-            \[m
[31m-        for (n = 0, cl = u->out_bufs; cl; cl = cl->next, n++) { \[m
[31m-        } \[m
[31m-            \[m
[31m-        dd("chain size: %d", n); \[m
[31m-    }[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "drizzle *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   define dd_dump_chain_size()[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define dd_drizzle_result(result) \[m
[31m-    dd("drizzle result:     row_count=%" PRId64 "\n" \[m
[31m-         "            insert_id=%" PRId64 "\n" \[m
[31m-         "        warning_count=%u\n" \[m
[31m-         "         column_count=%u\n\n", \[m
[31m-         drizzle_result_row_count(result), \[m
[31m-         drizzle_result_insert_id(result), \[m
[31m-         drizzle_result_warning_count(result), \[m
[31m-         drizzle_result_column_count(result))[m
[31m-[m
[31m-#define dd_drizzle_column(column) \[m
[31m-    dd("drizzle column:   catalog=%s\n" \[m
[31m-         "              db=%s\n" \[m
[31m-         "           table=%s\n" \[m
[31m-         "       org_table=%s\n" \[m
[31m-         "            name=%s\n" \[m
[31m-         "        org_name=%s\n" \[m
[31m-         "         charset=%u\n" \[m
[31m-         "            size=%u\n" \[m
[31m-         "        max_size=%zu\n" \[m
[31m-         "            type=%u\n" \[m
[31m-         "           flags=%u\n\n", \[m
[31m-         drizzle_column_catalog(column), drizzle_column_db(column), \[m
[31m-         drizzle_column_table(column), drizzle_column_orig_table(column), \[m
[31m-         drizzle_column_name(column), drizzle_column_orig_name(column), \[m
[31m-         drizzle_column_charset(column), drizzle_column_size(column), \[m
[31m-         drizzle_column_max_size(column), drizzle_column_type(column), \[m
[31m-         drizzle_column_flags(column));[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.c[m
[1mdeleted file mode 100644[m
[1mindex fca9b99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.c[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include "ngx_http_drizzle_quoting.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_int(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_float(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_bool(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_col(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_table(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_keyword(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.h[m
[1mdeleted file mode 100644[m
[1mindex b996df3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_CHECKER_H[m
[31m-#define NGX_HTTP_DRIZZLE_CHECKER_H[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_int(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_float(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_bool(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_col(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_table(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_keyword(ngx_str_t *value, void *data);[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_CHECKER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 5c989e5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,671 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_handler.h"[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include "ngx_http_drizzle_keepalive.h"[m
[31m-[m
[31m-[m
[31m-#ifdef _WIN32[m
[31m-/* import the POLLIN and POLLOUT flags */[m
[31m-#   ifndef WIN32_LEAN_AND_MEAN[m
[31m-#       define WIN32_LEAN_AND_MEAN[m
[31m-#   endif[m
[31m-#   include <winsock2.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* for read/write event handlers */[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_drizzle_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_drizzle_reinit_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_drizzle_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_drizzle_finalize_request(ngx_http_request_t *r,[m
[31m-        ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_drizzle_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_drizzle_input_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_drizzle_input_filter(void *data, ssize_t bytes);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_drizzle_loc_conf_t    *dlcf;[m
[31m-#if defined(nginx_version) && nginx_version < 8017[m
[31m-    ngx_http_drizzle_ctx_t         *dctx;[m
[31m-#endif[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_str_t                       target;[m
[31m-    ngx_url_t                       url;[m
[31m-    ngx_connection_t               *c;[m
[31m-[m
[31m-    dd("request: %p", r);[m
[31m-    dd("subrequest in memory: %d", (int) r->subrequest_in_memory);[m
[31m-    dd("connection: %p", r->connection);[m
[31m-    dd("connection log: %p", r->connection->log);[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-        /* TODO: add support for subrequest in memory by[m
[31m-         * emitting output into u->buffer instead */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "ngx_http_drizzle_module does not support "[m
[31m-                      "subrequest in memory");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_drizzle_module);[m
[31m-[m
[31m-    if ((dlcf->default_query == NULL) && !(dlcf->methods_set & r->method)) {[m
[31m-        if (dlcf->methods_set != 0) {[m
[31m-            return NGX_HTTP_NOT_ALLOWED;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "drizzle: missing \"drizzle_query\" in location \"%V\"",[m
[31m-                      &clcf->name);[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX upstream already exists? %p", r->upstream);[m
[31m-[m
[31m-#if defined(nginx_version) && \[m
[31m-    ((nginx_version >= 7063 && nginx_version < 8000) \[m
[31m-     || nginx_version >= 8007)[m
[31m-[m
[31m-    dd("creating upstream.......");[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#else /* 0.7.x < 0.7.63, 0.8.x < 0.8.7 */[m
[31m-[m
[31m-    dd("XXX create upstream");[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-#  if (NGX_THREADS)[m
[31m-    u->peer.lock = &r->connection->lock;[m
[31m-#  endif[m
[31m-[m
[31m-    r->upstream = u;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (dlcf->complex_target) {[m
[31m-        /* variables used in the drizzle_pass directive */[m
[31m-        if (ngx_http_complex_value(r, dlcf->complex_target, &target)[m
[31m-                != NGX_OK)[m
[31m-        {[m
[31m-            dd("failed to compile");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (target.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                    "drizzle: handler: empty \"drizzle_pass\" target");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        url.host = target;[m
[31m-        url.port = 0;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        dlcf->upstream.upstream = ngx_http_upstream_drizzle_add(r, &url);[m
[31m-[m
[31m-        if (dlcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                   "drizzle: upstream \"%V\" not found", &target);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version < 8017[m
[31m-    dctx = ngx_pcalloc(r->pool, sizeof(ngx_http_drizzle_ctx_t));[m
[31m-    if (dctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, dctx, ngx_http_drizzle_module);[m
[31m-#endif[m
[31m-[m
[31m-    u->schema.len = sizeof("drizzle://") - 1;[m
[31m-    u->schema.data = (u_char *) "drizzle://";[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_drizzle_module;[m
[31m-[m
[31m-    dd("drizzle tag: %p", (void *) u->output.tag);[m
[31m-[m
[31m-    u->conf = &dlcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_http_drizzle_create_request;[m
[31m-    u->reinit_request = ngx_http_drizzle_reinit_request;[m
[31m-    u->process_header = ngx_http_drizzle_process_header;[m
[31m-    u->abort_request = ngx_http_drizzle_abort_request;[m
[31m-    u->finalize_request = ngx_http_drizzle_finalize_request;[m
[31m-[m
[31m-    /* we bypass the upstream input filter mechanism in[m
[31m-     * ngx_http_upstream_process_headers */[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_drizzle_input_filter_init;[m
[31m-    u->input_filter = ngx_http_drizzle_input_filter;[m
[31m-    u->input_filter_ctx = NULL;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    r->main->count++;[m
[31m-#endif[m
[31m-[m
[31m-    dd("XXX connect timeout: %d", (int) dlcf->upstream.connect_timeout);[m
[31m-[m
[31m-    ngx_http_upstream_dbd_init(r);[m
[31m-[m
[31m-    /* override the read/write event handler to our own */[m
[31m-    u->write_event_handler = ngx_http_drizzle_wev_handler;[m
[31m-    u->read_event_handler  = ngx_http_drizzle_rev_handler;[m
[31m-[m
[31m-    /* a bit hack-ish way to return error response (clean-up part) */[m
[31m-    if ((u->peer.connection) && (u->peer.connection->fd == 0)) {[m
[31m-        c = u->peer.connection;[m
[31m-        u->peer.connection = NULL;[m
[31m-[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-            NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-#else[m
[31m-            dctx->status ? dctx->status : NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_drizzle_wev_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-[m
[31m-    dd("drizzle wev handler");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    u->request_sent = 1;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-        dd("drizzle connection write timeout");[m
[31m-[m
[31m-        ngx_http_drizzle_set_thread_id_variable(r, u);[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_next(r, u,[m
[31m-                NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_drizzle_test_connect(c) != NGX_OK) {[m
[31m-        dd("drizzle connection is broken");[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_drizzle_set_libdrizzle_ready(r);[m
[31m-[m
[31m-    (void) ngx_http_drizzle_process_events(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_drizzle_rev_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-[m
[31m-    dd("drizzle rev handler");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    u->request_sent = 1;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        dd("drizzle connection read timeout");[m
[31m-        ngx_http_drizzle_set_thread_id_variable(r, u);[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_next(r, u,[m
[31m-                NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_drizzle_test_connect(c) != NGX_OK) {[m
[31m-        dd("drizzle connection is broken");[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_drizzle_set_libdrizzle_ready(r);[m
[31m-[m
[31m-    (void) ngx_http_drizzle_process_events(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    r->upstream->request_bufs = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    /* override the read/write event handler to our own */[m
[31m-    u->write_event_handler = ngx_http_drizzle_wev_handler;[m
[31m-    u->read_event_handler  = ngx_http_drizzle_rev_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_drizzle_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_drizzle_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-           "ngx_http_drizzle_process_header should not be called"[m
[31m-           " by the upstream");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t          *r = data;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-           "ngx_http_drizzle_input_filter_init should not be called"[m
[31m-           " by the upstream");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_input_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t          *r = data;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-           "ngx_http_drizzle_input_filter should not be called"[m
[31m-           " by the upstream");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_drizzle_set_libdrizzle_ready(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_peer_data_t       *dp;[m
[31m-    drizzle_con_st                              *dc;[m
[31m-#if 1[m
[31m-    short                                        revents = 0;[m
[31m-#endif[m
[31m-[m
[31m-    dp = r->upstream->peer.data;[m
[31m-[m
[31m-    dc = dp->drizzle_con;[m
[31m-[m
[31m-#if 0[m
[31m-    /* libdrizzle uses standard poll() event constants[m
[31m-     * and depends on drizzle_con_wait() to set them.[m
[31m-     * we can directly call drizzle_con_wait() here to[m
[31m-     * set those drizzle internal event states, because[m
[31m-     * epoll() and other underlying event mechamism used[m
[31m-     * by the nginx core can play well enough with poll().[m
[31m-     * */[m
[31m-[m
[31m-    (void) drizzle_con_wait(dc->drizzle);[m
[31m-#endif[m
[31m-[m
[31m-#if 1[m
[31m-    revents |= POLLOUT;[m
[31m-    revents |= POLLIN;[m
[31m-[m
[31m-    /* drizzle_con_set_revents() isn't declared external in libdrizzle-0.4.0, */[m
[31m-    /* so we have to do its job all by ourselves... */[m
[31m-[m
[31m-    dc->options |= DRIZZLE_CON_IO_READY;[m
[31m-    dc->revents = revents;[m
[31m-    dc->events &= (short) ~revents;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_status_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf;[m
[31m-    ngx_uint_t                      i, n;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    size_t                          len;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_queue_t                    *q;[m
[31m-[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    /* calculate the output buffer length */[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_WORKER) {[m
[31m-        len += sizeof("worker process: \n\n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(ngx_pid);[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->srv_conf == NULL) {[m
[31m-            /* skip implicit upstream specified directly by the fastcgi_pass,[m
[31m-             * proxy_pass, and similar directives */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_http_drizzle_module);[m
[31m-[m
[31m-        if (dscf == NULL || dscf->servers == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n != 0) {[m
[31m-            len += sizeof("\n") - 1;[m
[31m-        }[m
[31m-[m
[31m-        n++;[m
[31m-[m
[31m-        len += sizeof("upstream \n") - 1[m
[31m-             + uscf->host.len[m
[31m-             + sizeof("  active connections: \n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(dscf->active_conns)[m
[31m-             + sizeof("  connection pool capacity: \n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(dscf->max_cached);[m
[31m-[m
[31m-        if (dscf->max_cached) {[m
[31m-            /* dump overflow flag for the connection pool */[m
[31m-[m
[31m-            switch (dscf->overflow) {[m
[31m-                case drizzle_keepalive_overflow_ignore:[m
[31m-                    len += sizeof("  overflow: ignore\n") - 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case drizzle_keepalive_overflow_reject:[m
[31m-                    len += sizeof("  overflow: reject\n") - 1;[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    len += sizeof("  overflow: N/A\n") - 1;[m
[31m-                    break;[m
[31m-            }[m
[31m-[m
[31m-            /* dump the lengths of the "cache" and "free" queues in the pool */[m
[31m-[m
[31m-            len += sizeof("  cached connection queue: \n") - 1[m
[31m-                 + ngx_http_drizzle_get_num_size([m
[31m-                         ngx_http_drizzle_queue_size(&dscf->cache)[m
[31m-                   )[m
[31m-                 + sizeof("  free'd connection queue: \n") - 1[m
[31m-                 + ngx_http_drizzle_get_num_size([m
[31m-                         ngx_http_drizzle_queue_size(&dscf->free)[m
[31m-                   )[m
[31m-[m
[31m-            /* dump how many times that each individual connection in the[m
[31m-             * pool has been successfully used in the "cache" queue */[m
[31m-[m
[31m-                 + sizeof("  cached connection successfully used count:\n") - 1;[m
[31m-[m
[31m-            for (q = ngx_queue_head(&dscf->cache);[m
[31m-                 q != ngx_queue_sentinel(&dscf->cache);[m
[31m-                 q = ngx_queue_next(q))[m
[31m-            {[m
[31m-                item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                        queue);[m
[31m-[m
[31m-                len += sizeof(" ") - 1[m
[31m-                     + ngx_http_drizzle_get_num_size(item->used);[m
[31m-            }[m
[31m-[m
[31m-            /* dump how many times that each individual connection in the[m
[31m-             * pool has been successfully used in the "free" queue */[m
[31m-[m
[31m-            len += sizeof("  free'd connection successfully used count:\n") - 1;[m
[31m-[m
[31m-            for (q = ngx_queue_head(&dscf->free);[m
[31m-                 q != ngx_queue_sentinel(&dscf->free);[m
[31m-                 q = ngx_queue_next(q))[m
[31m-            {[m
[31m-                item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                        queue);[m
[31m-[m
[31m-                len += sizeof(" ") - 1[m
[31m-                     + ngx_http_drizzle_get_num_size(item->used);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        len += sizeof("  servers: \n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(dscf->servers->nelts)[m
[31m-             + sizeof("  peers: \n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(dscf->peers->number);[m
[31m-    }[m
[31m-[m
[31m-    /* allocate the output buffer */[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* fill in the output buffer with the actual data */[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_WORKER) {[m
[31m-        b->last = ngx_sprintf(b->last, "worker process: %P\n\n", ngx_pid);[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->srv_conf == NULL) {[m
[31m-            /* skip implicit upstream specified directly by the fastcgi_pass,[m
[31m-             * proxy_pass, and similar directives */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_http_drizzle_module);[m
[31m-[m
[31m-        if (dscf == NULL || dscf->servers == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n != 0) {[m
[31m-            *b->last++ = '\n';[m
[31m-        }[m
[31m-[m
[31m-        n++;[m
[31m-[m
[31m-        b->last = ngx_copy_const_str(b->last, "upstream ");[m
[31m-        b->last = ngx_copy(b->last, uscf->host.data, uscf->host.len);[m
[31m-[m
[31m-        *b->last++ = '\n';[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "  active connections: %uD\n",[m
[31m-                dscf->active_conns);[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "  connection pool capacity: %uD\n",[m
[31m-                dscf->max_cached);[m
[31m-[m
[31m-        if (dscf->max_cached) {[m
[31m-            /* dump overflow flag for the connection pool */[m
[31m-[m
[31m-            switch (dscf->overflow) {[m
[31m-                case drizzle_keepalive_overflow_ignore:[m
[31m-                    b->last = ngx_copy_const_str(b->last,[m
[31m-                            "  overflow: ignore\n");[m
[31m-                    break;[m
[31m-[m
[31m-                case drizzle_keepalive_overflow_reject:[m
[31m-                    b->last = ngx_copy_const_str(b->last,[m
[31m-                            "  overflow: reject\n");[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    b->last = ngx_copy_const_str(b->last, "  overflow: N/A\n");[m
[31m-                    break;[m
[31m-            }[m
[31m-[m
[31m-            /* dump the lengths of the "cache" and "free" queues in the pool */[m
[31m-[m
[31m-            b->last = ngx_sprintf(b->last, "  cached connection queue: %uD\n",[m
[31m-                    ngx_http_drizzle_queue_size(&dscf->cache));[m
[31m-[m
[31m-            b->last = ngx_sprintf(b->last, "  free'd connection queue: %uD\n",[m
[31m-                    ngx_http_drizzle_queue_size(&dscf->free));[m
[31m-[m
[31m-            /* dump how many times that each individual connection in the[m
[31m-             * pool has been successfully used in the "cache" queue */[m
[31m-[m
[31m-            b->last = ngx_copy_const_str(b->last,[m
[31m-                    "  cached connection successfully used count:");[m
[31m-[m
[31m-            for (q = ngx_queue_head(&dscf->cache);[m
[31m-                 q != ngx_queue_sentinel(&dscf->cache);[m
[31m-                 q = ngx_queue_next(q))[m
[31m-            {[m
[31m-                item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                        queue);[m
[31m-                b->last = ngx_sprintf(b->last, " %uD", item->used);[m
[31m-            }[m
[31m-[m
[31m-            *b->last++ = '\n';[m
[31m-[m
[31m-            /* dump how many times that each individual connection in the[m
[31m-             * pool has been successfully used in the "free" queue */[m
[31m-[m
[31m-            b->last = ngx_copy_const_str(b->last,[m
[31m-                    "  free'd connection successfully used count:");[m
[31m-[m
[31m-            for (q = ngx_queue_head(&dscf->free);[m
[31m-                 q != ngx_queue_sentinel(&dscf->free);[m
[31m-                 q = ngx_queue_next(q))[m
[31m-            {[m
[31m-                item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                        queue);[m
[31m-                b->last = ngx_sprintf(b->last, " %uD", item->used);[m
[31m-            }[m
[31m-[m
[31m-            *b->last++ = '\n';[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "  servers: %uD\n",[m
[31m-                dscf->servers->nelts);[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "  peers: %uD\n", dscf->peers->number);[m
[31m-    }[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "drizzle_status output buffer error: %O != %O",[m
[31m-                      (off_t) (b->last - b->pos),[m
[31m-                      (off_t) (b->end - b->pos));[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, cl);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.h[m
[1mdeleted file mode 100644[m
[1mindex 72b47ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_HANDLER_H[m
[31m-#define NGX_HTTP_DRIZZLE_HANDLER_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-void ngx_http_drizzle_set_libdrizzle_ready(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_drizzle_rev_handler(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u);[m
[31m-[m
[31m-void ngx_http_drizzle_wev_handler(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_status_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_HANDLER_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.c[m
[1mdeleted file mode 100644[m
[1mindex 6b4466a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.c[m
[1m+++ /dev/null[m
[36m@@ -1,409 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_keepalive.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_drizzle_keepalive_dummy_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_drizzle_keepalive_close_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_drizzle_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t        *dscf = conf;[m
[31m-    ngx_str_t                                   *value;[m
[31m-    ngx_uint_t                                   i;[m
[31m-    ngx_int_t                                    n;[m
[31m-    u_char                                      *data;[m
[31m-    ngx_uint_t                                   len;[m
[31m-[m
[31m-    if (dscf->max_cached) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_drizzle_strcmp_const(value[i].data, "max=")[m
[31m-            == 0)[m
[31m-        {[m
[31m-            len = value[i].len - (sizeof("max=") - 1);[m
[31m-            data = &value[i].data[sizeof("max=") - 1];[m
[31m-[m
[31m-            n = ngx_atoi(data, len);[m
[31m-[m
[31m-            if (n == NGX_ERROR || n < 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid \"max\" value \"%V\" "[m
[31m-                                   "in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            dscf->max_cached = n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_drizzle_strcmp_const(value[i].data, "mode=") == 0) {[m
[31m-            len = value[i].len - (sizeof("mode=") - 1);[m
[31m-            data = &value[i].data[sizeof("mode=") - 1];[m
[31m-[m
[31m-            switch (len) {[m
[31m-            case 6:[m
[31m-                if (ngx_http_drizzle_strcmp_const(data, "single") == 0) {[m
[31m-                    dscf->single = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 5:[m
[31m-                if (ngx_http_drizzle_strcmp_const(data, "multi") == 0) {[m
[31m-                    dscf->single = 0;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "drizzle: invalid \"mode\" value \"%V\" "[m
[31m-                                   "in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_drizzle_strcmp_const(value[i].data, "overflow=") == 0) {[m
[31m-            len = value[i].len - (sizeof("overflow=") - 1);[m
[31m-            data = &value[i].data[sizeof("overflow=") - 1];[m
[31m-[m
[31m-            switch (len) {[m
[31m-            case 6:[m
[31m-                if (ngx_http_drizzle_strcmp_const(data, "reject") == 0) {[m
[31m-                    dscf->overflow = drizzle_keepalive_overflow_reject;[m
[31m-                } else if (ngx_http_drizzle_strcmp_const(data, "ignore") == 0) {[m
[31m-                    dscf->overflow = drizzle_keepalive_overflow_ignore;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "drizzle: invalid \"overflow\" value \"%V\" "[m
[31m-                                   "in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "drizzle: invalid parameter \"%V\" in"[m
[31m-                           " \"%V\" directive",[m
[31m-                           &value[i], &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_keepalive_init(ngx_pool_t *pool,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf)[m
[31m-{[m
[31m-    ngx_uint_t                              i;[m
[31m-    ngx_http_drizzle_keepalive_cache_t     *cached;[m
[31m-[m
[31m-    /* allocate cache items and add to free queue */[m
[31m-[m
[31m-    cached = ngx_pcalloc(pool,[m
[31m-                         sizeof(ngx_http_drizzle_keepalive_cache_t)[m
[31m-                         * dscf->max_cached);[m
[31m-    if (cached == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_init(&dscf->cache);[m
[31m-    ngx_queue_init(&dscf->free);[m
[31m-[m
[31m-    for (i = 0; i < dscf->max_cached; i++) {[m
[31m-        ngx_queue_insert_head(&dscf->free, &cached[i].queue);[m
[31m-        cached[i].srv_conf = dscf;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_keepalive_get_peer_single(ngx_peer_connection_t *pc,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf)[m
[31m-{[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-    ngx_queue_t                             *q;[m
[31m-    ngx_connection_t                        *c;[m
[31m-[m
[31m-    if (!ngx_queue_empty(&dscf->cache)) {[m
[31m-        dd("getting cached mysql connection...");[m
[31m-[m
[31m-        q = ngx_queue_head(&dscf->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        ngx_queue_insert_head(&dscf->free, q);[m
[31m-[m
[31m-        c->idle = 0;[m
[31m-        c->log = pc->log;[m
[31m-        c->read->log = pc->log;[m
[31m-        c->write->log = pc->log;[m
[31m-[m
[31m-        dp->name.data = item->name.data;[m
[31m-        dp->name.len = item->name.len;[m
[31m-[m
[31m-        dp->sockaddr = item->sockaddr;[m
[31m-        dp->drizzle_con = item->drizzle_con;[m
[31m-        dp->has_set_names = item->has_set_names;[m
[31m-        dp->used = item->used;[m
[31m-[m
[31m-        pc->connection = c;[m
[31m-        pc->cached = 1;[m
[31m-        pc->name = &dp->name;[m
[31m-        pc->sockaddr = &dp->sockaddr;[m
[31m-        pc->socklen = item->socklen;[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_keepalive_get_peer_multi(ngx_peer_connection_t *pc,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf)[m
[31m-{[m
[31m-    ngx_queue_t                             *q, *cache;[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-    ngx_connection_t                        *c;[m
[31m-[m
[31m-    /* search cache for suitable connection */[m
[31m-[m
[31m-    cache = &dscf->cache;[m
[31m-[m
[31m-    for (q = ngx_queue_head(cache);[m
[31m-         q != ngx_queue_sentinel(cache);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        /* XXX maybe we should take dbname and user into account[m
[31m-         * as well? */[m
[31m-        if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,[m
[31m-                         item->socklen, pc->socklen)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_queue_remove(q);[m
[31m-            ngx_queue_insert_head(&dscf->free, q);[m
[31m-[m
[31m-            c->idle = 0;[m
[31m-            c->log = pc->log;[m
[31m-            c->read->log = pc->log;[m
[31m-            c->write->log = pc->log;[m
[31m-[m
[31m-            pc->connection = c;[m
[31m-            pc->cached = 1;[m
[31m-[m
[31m-            /* we do not need to resume dp->name here because[m
[31m-             * it already takes the right value in the[m
[31m-             * ngx_http_upstream_drizzle_get_peer function */[m
[31m-[m
[31m-            dp->drizzle_con = item->drizzle_con;[m
[31m-            dp->has_set_names = item->has_set_names;[m
[31m-            dp->used = item->used;[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_drizzle_keepalive_free_peer(ngx_peer_connection_t *pc,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf, ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_uint_t                               status;[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-    ngx_queue_t                             *q;[m
[31m-    ngx_connection_t                        *c;[m
[31m-    ngx_http_upstream_t                     *u;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "drizzle: free keepalive peer");[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED) {[m
[31m-        dp->failed = 1;[m
[31m-    }[m
[31m-[m
[31m-    u = dp->upstream;[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    dd("dp failed: %d", (int) dp->failed);[m
[31m-    dd("pc->connection: %p", pc->connection);[m
[31m-    dd("status = %d", (int) status);[m
[31m-[m
[31m-    if (!dp->failed[m
[31m-        && pc->connection != NULL[m
[31m-        && (status == NGX_HTTP_NOT_FOUND[m
[31m-            || status == NGX_HTTP_GONE[m
[31m-            || (status == NGX_HTTP_OK && u->header_sent && u->length == 0)))[m
[31m-    {[m
[31m-        c = pc->connection;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "drizzle: free keepalive peer: saving connection %p",[m
[31m-                       c);[m
[31m-[m
[31m-        if (ngx_queue_empty(&dscf->free)) {[m
[31m-            /* connection pool is already full */[m
[31m-[m
[31m-            dd("caching connection forcibly and the pool is already full");[m
[31m-[m
[31m-            q = ngx_queue_last(&dscf->cache);[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                                  queue);[m
[31m-[m
[31m-            ngx_http_upstream_drizzle_free_connection(pc->log, item->connection,[m
[31m-                    item->drizzle_con, dscf);[m
[31m-[m
[31m-        } else {[m
[31m-            dd("caching idle connection to the pool");[m
[31m-[m
[31m-            q = ngx_queue_head(&dscf->free);[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                                  queue);[m
[31m-        }[m
[31m-[m
[31m-        item->connection = c;[m
[31m-        ngx_queue_insert_head(&dscf->cache, q);[m
[31m-[m
[31m-        pc->connection = NULL;[m
[31m-[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        c->write->handler = ngx_http_drizzle_keepalive_dummy_handler;[m
[31m-        c->read->handler = ngx_http_drizzle_keepalive_close_handler;[m
[31m-[m
[31m-        c->data = item;[m
[31m-        c->idle = 1;[m
[31m-        c->log = ngx_cycle->log;[m
[31m-        c->read->log = ngx_cycle->log;[m
[31m-        c->write->log = ngx_cycle->log;[m
[31m-[m
[31m-        item->socklen = pc->socklen;[m
[31m-        ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);[m
[31m-[m
[31m-        item->drizzle_con = dp->drizzle_con;[m
[31m-        item->has_set_names = dp->has_set_names;[m
[31m-[m
[31m-        item->name.data = dp->name.data;[m
[31m-        item->name.len = dp->name.len;[m
[31m-[m
[31m-        item->used = ++dp->used;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_drizzle_keepalive_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "drizzle: keepalive dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_drizzle_keepalive_close_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "drizzle: keepalive close handler");[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {[m
[31m-        /* stale event */[m
[31m-[m
[31m-#if 0[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            goto close;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-close:[m
[31m-[m
[31m-    item = c->data;[m
[31m-    dscf = item->srv_conf;[m
[31m-[m
[31m-    dd("closing fd %d", c->fd);[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_free_connection(ev->log, c, item->drizzle_con,[m
[31m-                                              dscf);[m
[31m-[m
[31m-    ngx_queue_remove(&item->queue);[m
[31m-    ngx_queue_insert_head(&dscf->free, &item->queue);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.h[m
[1mdeleted file mode 100644[m
[1mindex 4891c7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.h[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_KEEPALIVE_H[m
[31m-#define NGX_HTTP_DRIZZLE_KEEPALIVE_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t  *srv_conf;[m
[31m-[m
[31m-    ngx_queue_t                          queue;[m
[31m-[m
[31m-    ngx_connection_t                    *connection;[m
[31m-[m
[31m-    socklen_t                            socklen;[m
[31m-    struct sockaddr                      sockaddr;[m
[31m-    drizzle_con_st                      *drizzle_con;[m
[31m-    ngx_str_t                            name;[m
[31m-[m
[31m-    /* how many times this connection has been successfully used */[m
[31m-    ngx_uint_t                           used;[m
[31m-[m
[31m-    unsigned                             has_set_names:1;[m
[31m-[m
[31m-} ngx_http_drizzle_keepalive_cache_t;[m
[31m-[m
[31m-[m
[31m-char *ngx_http_upstream_drizzle_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-        void *conf);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_keepalive_init(ngx_pool_t *pool,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_keepalive_get_peer_single(ngx_peer_connection_t *pc,[m
[31m-        ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_keepalive_get_peer_multi(ngx_peer_connection_t *pc,[m
[31m-        ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf);[m
[31m-[m
[31m-void ngx_http_drizzle_keepalive_free_peer(ngx_peer_connection_t *pc,[m
[31m-        ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf,[m
[31m-        ngx_uint_t  state);[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_KEEPALIVE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.c[m
[1mdeleted file mode 100644[m
[1mindex 382303a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,569 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_handler.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include "ngx_http_drizzle_keepalive.h"[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_drizzle_tid_var_name =[m
[31m-        ngx_string("drizzle_thread_id");[m
[31m-[m
[31m-[m
[31m-/* Forward declaration */[m
[31m-[m
[31m-static char *ngx_http_drizzle_set_complex_value_slot(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_drizzle_query(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_drizzle_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_http_drizzle_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_drizzle_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_drizzle_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_drizzle_tid_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static char *ngx_http_drizzle_enable_status(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t ngx_http_drizzle_variables[] = {[m
[31m-[m
[31m-    { ngx_string("drizzle_thread_id"), NULL,[m
[31m-      ngx_http_drizzle_tid_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* config directives for module drizzle */[m
[31m-static ngx_command_t ngx_http_drizzle_cmds[] = {[m
[31m-    { ngx_string("drizzle_server"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_upstream_drizzle_server,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_keepalive"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_upstream_drizzle_keepalive,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_query"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_drizzle_query,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_dbname"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_drizzle_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, dbname),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_drizzle_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_send_query_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_recv_cols_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, recv_cols_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_recv_rows_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, recv_rows_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_module_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, enable_module_header),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, buf_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_status"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_drizzle_enable_status,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* Nginx HTTP subsystem module hooks */[m
[31m-static ngx_http_module_t ngx_http_drizzle_module_ctx = {[m
[31m-    NULL,    /* preconfiguration */[m
[31m-    NULL,    /* postconfiguration */[m
[31m-[m
[31m-    NULL,    /* create_main_conf */[m
[31m-    NULL,    /* merge_main_conf */[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_create_srv_conf,[m
[31m-             /* create_srv_conf */[m
[31m-    NULL,    /* merge_srv_conf */[m
[31m-[m
[31m-    ngx_http_drizzle_create_loc_conf,    /* create_loc_conf */[m
[31m-    ngx_http_drizzle_merge_loc_conf      /* merge_loc_conf */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_drizzle_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_drizzle_module_ctx,       /* module context */[m
[31m-    ngx_http_drizzle_cmds,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                    /* module type */[m
[31m-    NULL,    /* init master */[m
[31m-    NULL,    /* init module */[m
[31m-    NULL,    /* init process */[m
[31m-    NULL,    /* init thread */[m
[31m-    NULL,    /* exit thread */[m
[31m-    NULL,    /* exit process */[m
[31m-    NULL,    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_drizzle_http_method_t ngx_drizzle_http_methods[] = {[m
[31m-   { (u_char *) "GET",       (uint32_t) NGX_HTTP_GET },[m
[31m-   { (u_char *) "HEAD",      (uint32_t) NGX_HTTP_HEAD },[m
[31m-   { (u_char *) "POST",      (uint32_t) NGX_HTTP_POST },[m
[31m-   { (u_char *) "PUT",       (uint32_t) NGX_HTTP_PUT },[m
[31m-   { (u_char *) "DELETE",    (uint32_t) NGX_HTTP_DELETE },[m
[31m-   { (u_char *) "MKCOL",     (uint32_t) NGX_HTTP_MKCOL },[m
[31m-   { (u_char *) "COPY",      (uint32_t) NGX_HTTP_COPY },[m
[31m-   { (u_char *) "MOVE",      (uint32_t) NGX_HTTP_MOVE },[m
[31m-   { (u_char *) "OPTIONS",   (uint32_t) NGX_HTTP_OPTIONS },[m
[31m-   { (u_char *) "PROPFIND" , (uint32_t) NGX_HTTP_PROPFIND },[m
[31m-   { (u_char *) "PROPPATCH", (uint32_t) NGX_HTTP_PROPPATCH },[m
[31m-   { (u_char *) "LOCK",      (uint32_t) NGX_HTTP_LOCK },[m
[31m-   { (u_char *) "UNLOCK",    (uint32_t) NGX_HTTP_UNLOCK },[m
[31m-#if defined(nginx_version) && (nginx_version >= 8041)[m
[31m-   { (u_char *) "PATCH",     (uint32_t) NGX_HTTP_PATCH },[m
[31m-#endif[m
[31m-   { NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_drizzle_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t             *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_drizzle_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->recv_cols_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->recv_rows_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->enable_module_header = NGX_CONF_UNSET;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.ignore_client_abort = 0;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      conf->dbname = NULL[m
[31m-     *      conf->query  = NULL[m
[31m-     */[m
[31m-[m
[31m-    conf->complex_target = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->buf_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->tid_var_index = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_drizzle_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t *prev = parent;[m
[31m-    ngx_http_drizzle_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable_module_header,[m
[31m-                         prev->enable_module_header, 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->recv_cols_timeout,[m
[31m-                              prev->recv_cols_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->recv_rows_timeout,[m
[31m-                              prev->recv_rows_timeout, 60000);[m
[31m-[m
[31m-    if (conf->dbname == NULL) {[m
[31m-        conf->dbname = prev->dbname;[m
[31m-    }[m
[31m-[m
[31m-    if ((conf->default_query == NULL) && (conf->queries == NULL)) {[m
[31m-        conf->default_query = prev->default_query;[m
[31m-        conf->methods_set = prev->methods_set;[m
[31m-        conf->queries = prev->queries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buf_size, prev->buf_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    if (conf->tid_var_index == NGX_CONF_UNSET) {[m
[31m-        conf->tid_var_index = prev->tid_var_index;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_drizzle_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char                             *p = conf;[m
[31m-    ngx_http_complex_value_t        **field;[m
[31m-    ngx_str_t                        *value;[m
[31m-    ngx_http_compile_complex_value_t  ccv;[m
[31m-[m
[31m-    field = (ngx_http_complex_value_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*field) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *field = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-    if (*field == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_memzero(*field, sizeof(ngx_http_complex_value_t));[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = *field;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_drizzle_query(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_str_t                          sql = value[cf->args->nelts - 1];[m
[31m-    ngx_http_drizzle_loc_conf_t       *dlcf = conf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_drizzle_mixed_t               *query;[m
[31m-    ngx_drizzle_http_method_t         *method;[m
[31m-    ngx_uint_t                         methods, i;[m
[31m-[m
[31m-    if (sql.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "drizzle: empty value in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        /* default query */[m
[31m-        dd("default query");[m
[31m-[m
[31m-        if (dlcf->default_query != NULL) {[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-[m
[31m-        dlcf->default_query = ngx_pcalloc(cf->pool,[m
[31m-                                          sizeof(ngx_drizzle_mixed_t));[m
[31m-        if (dlcf->default_query == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        methods = 0xFFFF;[m
[31m-        query = dlcf->default_query;[m
[31m-[m
[31m-    } else {[m
[31m-        /* method-specific query */[m
[31m-        dd("method-specific query");[m
[31m-[m
[31m-        methods = 0;[m
[31m-[m
[31m-        for (i = 1; i < cf->args->nelts - 1; i++) {[m
[31m-            for (method = ngx_drizzle_http_methods; method->name; method++) {[m
[31m-                if (ngx_strcasecmp(value[i].data, method->name) == 0) {[m
[31m-                    /* correct method name */[m
[31m-                    if (dlcf->methods_set & method->key) {[m
[31m-                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                           "drizzle: \"%V\" directive"[m
[31m-                                           " for method \"%V\" is duplicate",[m
[31m-                                           &cmd->name, &value[i]);[m
[31m-[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    methods |= method->key;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "drizzle: invalid method \"%V\"", &value[i]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-[m
[31m-next:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (dlcf->queries == NULL) {[m
[31m-            dlcf->queries = ngx_array_create(cf->pool, 4,[m
[31m-                                             sizeof(ngx_drizzle_mixed_t));[m
[31m-            if (dlcf->queries == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        query = ngx_array_push(dlcf->queries);[m
[31m-        if (query == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(query, sizeof(ngx_drizzle_mixed_t));[m
[31m-[m
[31m-        dlcf->methods_set |= methods;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_variables_count(&sql)) {[m
[31m-        /* complex value */[m
[31m-        dd("complex value");[m
[31m-[m
[31m-        query->key = methods;[m
[31m-[m
[31m-        query->cv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (query->cv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &sql;[m
[31m-        ccv.complex_value = query->cv;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* simple value */[m
[31m-        dd("simple value");[m
[31m-[m
[31m-        query->key = methods;[m
[31m-        query->sv = sql;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_drizzle_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t             *dlcf = conf;[m
[31m-[m
[31m-    ngx_http_core_loc_conf_t                *clcf;[m
[31m-    ngx_str_t                               *value;[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-    ngx_url_t                                url;[m
[31m-    ngx_uint_t                               n;[m
[31m-[m
[31m-    if (dlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_drizzle_add_variables(cf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dlcf->tid_var_index = ngx_http_get_variable_index(cf,[m
[31m-                                              &ngx_http_drizzle_tid_var_name);[m
[31m-[m
[31m-    if (dlcf->tid_var_index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_drizzle_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-    if (n) {[m
[31m-        dlcf->complex_target = ngx_palloc(cf->pool,[m
[31m-                                          sizeof(ngx_http_complex_value_t));[m
[31m-        if (dlcf->complex_target == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = dlcf->complex_target;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    dlcf->complex_target = NULL;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url = value[1];[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    dlcf->upstream.upstream = ngx_http_upstream_add(cf, &url, 0);[m
[31m-[m
[31m-    if (dlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_drizzle_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_tid_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->data = (u_char *) "";[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_drizzle_enable_status(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t                *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_drizzle_status_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.h[m
[1mdeleted file mode 100644[m
[1mindex 4c15427..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_DRIZZLE_MODULE_H[m
[31m-#define NGX_HTTP_DRIZZLE_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-/* XXX nginx undefines "bool", which breaks the libdrizzle 1.0 API[m
[31m- * which makes use of "bool" */[m
[31m-#if defined(__GNUC__)[m
[31m-#   ifndef bool[m
[31m-#       define bool _Bool[m
[31m-#   endif[m
[31m-#endif[m
[31m-[m
[31m-#include <libdrizzle/drizzle_client.h>[m
[31m-[m
[31m-[m
[31m-#ifdef _WIN32[m
[31m-/* remove the bad macros defined in libdrizzle/drizzle.h */[m
[31m-#   undef close[m
[31m-#   undef snprintf[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_GONE[m
[31m-#define NGX_HTTP_GONE 410[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_http_drizzle_module_version 1009[m
[31m-#define ngx_http_drizzle_module_version_string \[m
[31m-    "0.1.7"[m
[31m-[m
[31m-extern ngx_module_t ngx_http_drizzle_module;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_str_t                           sv;[m
[31m-    ngx_http_complex_value_t           *cv;[m
[31m-} ngx_drizzle_mixed_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                             *name;[m
[31m-    uint32_t                            key;[m
[31m-} ngx_drizzle_http_method_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t             upstream;[m
[31m-[m
[31m-    /* drizzle database name */[m
[31m-    ngx_http_complex_value_t            *dbname;[m
[31m-[m
[31m-    /* SQL query to be executed */[m
[31m-    ngx_drizzle_mixed_t                 *default_query;[m
[31m-    ngx_uint_t                           methods_set;[m
[31m-    ngx_array_t                         *queries;[m
[31m-[m
[31m-    ngx_msec_t                           recv_cols_timeout;[m
[31m-    ngx_msec_t                           recv_rows_timeout;[m
[31m-[m
[31m-    ngx_flag_t                           enable_module_header;[m
[31m-[m
[31m-    /* for quoting */[m
[31m-    ngx_array_t                         *vars_to_quote;[m
[31m-                /* of ngx_http_drizzle_var_to_quote_t */[m
[31m-[m
[31m-    ngx_array_t                         *user_types;[m
[31m-                /* of ngx_http_drizzle_var_type_t */[m
[31m-[m
[31m-    ngx_http_complex_value_t            *complex_target;[m
[31m-[m
[31m-    size_t                               buf_size;[m
[31m-[m
[31m-    ngx_int_t                            tid_var_index; /* thread id variable[m
[31m-                                                           index */[m
[31m-} ngx_http_drizzle_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-typedef struct {[m
[31m-    ngx_int_t                           status;[m
[31m-} ngx_http_drizzle_ctx_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* states for the drizzle client state machine */[m
[31m-typedef enum {[m
[31m-    state_db_connect,[m
[31m-    state_db_send_query,[m
[31m-    state_db_recv_cols,[m
[31m-    state_db_recv_rows,[m
[31m-    state_db_idle[m
[31m-[m
[31m-} ngx_http_drizzle_state_t;[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.c[m
[1mdeleted file mode 100644[m
[1mindex 34e43ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.c[m
[1m+++ /dev/null[m
[36m@@ -1,787 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_output.h"[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_key "X-Resty-DBD-Module"[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_key_len  \[m
[31m-    (sizeof(ngx_http_drizzle_module_header_key) - 1)[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_val \[m
[31m-    "ngx_drizzle " \[m
[31m-      ngx_http_drizzle_module_version_string[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_val_len \[m
[31m-    (sizeof(ngx_http_drizzle_module_header_val) - 1)[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_key_len  \[m
[31m-    (sizeof(ngx_http_drizzle_module_header_key) - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_drizzle_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp);[m
[31m-static u_char *ngx_http_drizzle_get_postponed(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len);[m
[31m-static rds_col_type_t ngx_http_drizzle_std_col_type([m
[31m-    drizzle_column_type_t col_type);[m
[31m-static u_char *ngx_http_drizzle_request_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len);[m
[31m-static ngx_int_t ngx_http_drizzle_submit_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_result_header(ngx_http_request_t *r,[m
[31m-    drizzle_result_st *res)[m
[31m-{[m
[31m-    u_char                          *pos, *last;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_upstream_t             *u = r->upstream;[m
[31m-    const char                      *errstr;[m
[31m-    size_t                           size;[m
[31m-    uint16_t                         errstr_len;[m
[31m-    uint16_t                         col_count;[m
[31m-    uint16_t                         errcode;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = u->peer.data;[m
[31m-[m
[31m-    errcode = drizzle_result_error_code(res);[m
[31m-[m
[31m-    if (dp->enable_charset && ! dp->has_set_names) {[m
[31m-        if (errcode != 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "drizzle: FATAL: failed to set names 'utf8' "[m
[31m-                          "(error %d)", (int) errcode);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (dp->drizzle_con && dp->drizzle_res.con) {[m
[31m-            dd("before drizzle result free");[m
[31m-            dd("%p vs. %p", dp->drizzle_res.con, dp->drizzle_con);[m
[31m-[m
[31m-            drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-            dd("after drizzle result free");[m
[31m-        }[m
[31m-[m
[31m-        /* ngx_http_upstream_drizzle_done(r, u, dp, NGX_OK); */[m
[31m-        dd("returning DONE when set names");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    errstr = drizzle_result_error(res);[m
[31m-[m
[31m-    errstr_len = (uint16_t) ngx_strlen(errstr);[m
[31m-[m
[31m-    col_count = drizzle_result_column_count(res);[m
[31m-[m
[31m-    size = sizeof(uint8_t)        /* endian type */[m
[31m-           + sizeof(uint32_t)     /* format version */[m
[31m-           + sizeof(uint8_t)      /* result type */[m
[31m-[m
[31m-           + sizeof(uint16_t)     /* standard error code */[m
[31m-           + sizeof(uint16_t)     /* driver-specific error code */[m
[31m-[m
[31m-           + sizeof(uint16_t)     /* driver-specific errstr len */[m
[31m-           + errstr_len           /* driver-specific errstr data */[m
[31m-           + sizeof(uint64_t)     /* rows affected */[m
[31m-           + sizeof(uint64_t)     /* insert id */[m
[31m-           + sizeof(uint16_t);    /* column count */[m
[31m-[m
[31m-    pos = ngx_http_drizzle_request_mem(r, dp, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-#if NGX_HAVE_LITTLE_ENDIAN[m
[31m-    *last++ = 0;[m
[31m-#else /* big endian */[m
[31m-    *last++ = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /* RDS format version */[m
[31m-[m
[31m-    *(uint32_t *) last = (uint32_t) resty_dbd_stream_version;[m
[31m-    last += sizeof(uint32_t);[m
[31m-[m
[31m-    /* result type fixed to 0 */[m
[31m-    *last++ = 0;[m
[31m-[m
[31m-    /* standard error code[m
[31m-     * FIXME: define the standard error code set and map[m
[31m-     * libdrizzle's to it. */[m
[31m-    *(uint16_t *) last = errcode;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-     /* driver-specific error code */[m
[31m-    *(uint16_t *) last = drizzle_result_error_code(res);[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* driver-specific errstr len */[m
[31m-    *(uint16_t *) last = errstr_len;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* driver-specific errstr data */[m
[31m-    if (errstr_len) {[m
[31m-        last = ngx_copy(last, (u_char *) errstr, errstr_len);[m
[31m-    }[m
[31m-[m
[31m-    /* affected rows */[m
[31m-    *(uint64_t *) last = drizzle_result_affected_rows(res);[m
[31m-    last += sizeof(uint64_t);[m
[31m-[m
[31m-    /* insert id */[m
[31m-    *(uint64_t *) last = drizzle_result_insert_id(res);[m
[31m-    last += sizeof(uint64_t);[m
[31m-[m
[31m-    /* column count */[m
[31m-    *(uint16_t *) last = col_count;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "drizzle: FATAL: output result header buffer error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (col_count == 0) {[m
[31m-        dd("Col count is ZERO");[m
[31m-[m
[31m-        /* we suppress row terminator here when there's no columns */[m
[31m-        dp->seen_stream_end = 1;[m
[31m-[m
[31m-        rc = ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("about to be done...");[m
[31m-        ngx_http_upstream_drizzle_done(r, u, dp, NGX_DONE);[m
[31m-        dd("i am returning DONE");[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_bufs(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp)[m
[31m-{[m
[31m-    ngx_http_upstream_t                    *u = r->upstream;[m
[31m-    ngx_int_t                               rc;[m
[31m-    ngx_str_t                               key, value;[m
[31m-    ngx_http_drizzle_loc_conf_t            *dlcf;[m
[31m-    ngx_chain_t                            *cl;[m
[31m-[m
[31m-    dd("enter");[m
[31m-    dd_dump_chain_size();[m
[31m-[m
[31m-    if (dp->seen_stream_end) {[m
[31m-        dp->seen_stream_end = 0;[m
[31m-[m
[31m-        if (dp->avail_out) {[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = dp->out_buf;[m
[31m-            cl->next = NULL;[m
[31m-            *dp->last_out = cl;[m
[31m-            dp->last_out = &cl->next;[m
[31m-[m
[31m-            dp->avail_out = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!u->header_sent && u->out_bufs) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-[m
[31m-        r->headers_out.status = NGX_HTTP_OK;[m
[31m-[m
[31m-        /* set the Content-Type header */[m
[31m-        r->headers_out.content_type.data = (u_char *) rds_content_type;[m
[31m-        r->headers_out.content_type.len = rds_content_type_len;[m
[31m-        r->headers_out.content_type_len = rds_content_type_len;[m
[31m-        r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-        dlcf = ngx_http_get_module_loc_conf(r, ngx_http_drizzle_module);[m
[31m-[m
[31m-        if (dlcf->enable_module_header) {[m
[31m-            /* set the X-Resty-DBD-Module header */[m
[31m-[m
[31m-            key.data = (u_char *) ngx_http_drizzle_module_header_key;[m
[31m-            key.len  = ngx_http_drizzle_module_header_key_len;[m
[31m-[m
[31m-            value.data = (u_char *) ngx_http_drizzle_module_header_val;[m
[31m-            value.len = ngx_http_drizzle_module_header_val_len;[m
[31m-[m
[31m-            rc = ngx_http_drizzle_set_header(r, &key, &value);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_send_header(r);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        u->header_sent = 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (u->out_bufs == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        {[m
[31m-            int              n;[m
[31m-            ngx_chain_t     *cl;[m
[31m-[m
[31m-            for (n = 0, cl = u->out_bufs; cl; cl = cl->next, n++) {[m
[31m-            }[m
[31m-[m
[31m-            fprintf(stderr, "XXX chain size: %d\n", n);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        rc = ngx_http_output_filter(r, u->out_bufs);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs,[m
[31m-                                &u->out_bufs, u->output.tag);[m
[31m-#else[m
[31m-        ngx_chain_update_chains(&u->free_bufs, &u->busy_bufs, &u->out_bufs,[m
[31m-                                u->output.tag);[m
[31m-#endif[m
[31m-[m
[31m-        dp->last_out = &u->out_bufs;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_col(ngx_http_request_t *r, drizzle_column_st *col)[m
[31m-{[m
[31m-    u_char                              *pos, *last;[m
[31m-    ngx_http_upstream_t                 *u = r->upstream;[m
[31m-    drizzle_column_type_t                col_type = 0;[m
[31m-    uint16_t                             std_col_type = 0;[m
[31m-    const char                          *col_name = NULL;[m
[31m-    uint16_t                             col_name_len = 0;[m
[31m-    size_t                               size;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = u->peer.data;[m
[31m-[m
[31m-    if (col == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    col_type = drizzle_column_type(col);[m
[31m-    col_name = drizzle_column_name(col);[m
[31m-    col_name_len = (uint16_t) strlen(col_name);[m
[31m-[m
[31m-    size = sizeof(uint16_t)     /* std col type */[m
[31m-           + sizeof(uint16_t)     /* driver-specific col type */[m
[31m-           + sizeof(uint16_t)     /* col name str len */[m
[31m-           + col_name_len;        /* col name str len */[m
[31m-[m
[31m-    pos = ngx_http_drizzle_request_mem(r, dp, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* std column type */[m
[31m-[m
[31m-    std_col_type = (uint16_t) ngx_http_drizzle_std_col_type(col_type);[m
[31m-[m
[31m-#if 0[m
[31m-    dd("std col type for %s: %d, %d (%d, %d, %d)",[m
[31m-            col_name, std_col_type, rds_col_type_blob,[m
[31m-            rds_rough_col_type_str,[m
[31m-            rds_rough_col_type_str << 14,[m
[31m-            (uint16_t) (19 | (rds_rough_col_type_str << 14))[m
[31m-            );[m
[31m-#endif[m
[31m-[m
[31m-    *(uint16_t *) last = std_col_type;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* drizzle column type */[m
[31m-    *(uint16_t *) last = col_type;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* column name string length */[m
[31m-    *(uint16_t *) last = col_name_len;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* column name string data */[m
[31m-    last = ngx_copy(last, col_name, col_name_len);[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "drizzle: FATAL: output column buffer error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_row(ngx_http_request_t *r, uint64_t row)[m
[31m-{[m
[31m-    u_char                              *pos, *last;[m
[31m-    ngx_http_upstream_t                 *u = r->upstream;[m
[31m-    size_t                               size;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = u->peer.data;[m
[31m-[m
[31m-    size = sizeof(uint8_t);[m
[31m-[m
[31m-    pos = ngx_http_drizzle_request_mem(r, dp, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-    *last++ = (row != 0);[m
[31m-[m
[31m-    if (row == 0) {[m
[31m-        dp->seen_stream_end = 1;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_field(ngx_http_request_t *r, size_t offset,[m
[31m-    size_t len, size_t total, drizzle_field_t field)[m
[31m-{[m
[31m-    u_char                              *pos, *last;[m
[31m-    ngx_http_upstream_t                 *u = r->upstream;[m
[31m-    size_t                               size = 0;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = u->peer.data;[m
[31m-[m
[31m-    if (offset == 0) {[m
[31m-[m
[31m-        if (len == 0 && total != 0) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        size = sizeof(uint32_t);     /* field total length */[m
[31m-    }[m
[31m-[m
[31m-    /* (more) field data */[m
[31m-    size += (uint32_t) len;[m
[31m-[m
[31m-    /* request memory */[m
[31m-[m
[31m-    pos = ngx_http_drizzle_request_mem(r, dp, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* fill in the buffer */[m
[31m-[m
[31m-    if (offset == 0) {[m
[31m-        /* field total length */[m
[31m-        if (field == NULL) {[m
[31m-            *(uint32_t *) last = (uint32_t) -1;[m
[31m-[m
[31m-        } else {[m
[31m-            *(uint32_t *) last = (uint32_t) total;[m
[31m-        }[m
[31m-[m
[31m-        last += sizeof(uint32_t);[m
[31m-    }[m
[31m-[m
[31m-    /* field data */[m
[31m-    if (len && field) {[m
[31m-        last = ngx_copy(last, field, (uint32_t) len);[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        dd("offset %d, len %d, size %d", (int) offset,[m
[31m-           (int) len, (int) size);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "drizzle: FATAL: output field buffer error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static rds_col_type_t[m
[31m-ngx_http_drizzle_std_col_type(drizzle_column_type_t col_type)[m
[31m-{[m
[31m-    dd("drizzle col type: %d", col_type);[m
[31m-[m
[31m-    switch (col_type) {[m
[31m-    case DRIZZLE_COLUMN_TYPE_DECIMAL:[m
[31m-        return rds_col_type_decimal;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_TINY:[m
[31m-        return rds_col_type_smallint;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_SHORT:[m
[31m-        return rds_col_type_smallint;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_LONG:[m
[31m-        return rds_col_type_integer;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_FLOAT:[m
[31m-        return rds_col_type_real;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_DOUBLE:[m
[31m-        return rds_col_type_double;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_NULL:[m
[31m-        return rds_col_type_unknown;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_TIMESTAMP:[m
[31m-        return rds_col_type_timestamp;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_LONGLONG:[m
[31m-        return rds_col_type_bigint;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_INT24:[m
[31m-        return rds_col_type_integer;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_DATE:[m
[31m-        return rds_col_type_timestamp;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_TIME:[m
[31m-        return rds_col_type_time;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_DATETIME:[m
[31m-        return rds_col_type_timestamp;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_YEAR:[m
[31m-        return rds_col_type_smallint;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_NEWDATE:[m
[31m-        return rds_col_type_timestamp;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_VARCHAR:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_BIT:[m
[31m-        return rds_col_type_bit;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_NEWDECIMAL:[m
[31m-        return rds_col_type_decimal;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_ENUM:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_SET:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_TINY_BLOB:[m
[31m-        return rds_col_type_blob;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_MEDIUM_BLOB:[m
[31m-        return rds_col_type_blob;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_LONG_BLOB:[m
[31m-        return rds_col_type_blob;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_BLOB:[m
[31m-        return rds_col_type_blob;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_VAR_STRING:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_STRING:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_GEOMETRY:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    default:[m
[31m-        return rds_col_type_unknown;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_drizzle_request_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    u_char                  *p;[m
[31m-[m
[31m-    rc = ngx_http_drizzle_get_buf(r, dp);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (dp->avail_out < len) {[m
[31m-        p = ngx_http_drizzle_get_postponed(r, dp, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        dp->postponed.pos = p;[m
[31m-        dp->postponed.last = p + len;[m
[31m-[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return dp->out_buf->last;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t         *conf = dp->loc_conf;[m
[31m-    ngx_http_upstream_t                 *u = dp->upstream;[m
[31m-[m
[31m-    dd("MEM enter");[m
[31m-[m
[31m-    if (dp->avail_out) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->free_bufs) {[m
[31m-        dd("MEM reusing temp buf from free_bufs");[m
[31m-[m
[31m-        dp->out_buf = u->free_bufs->buf;[m
[31m-        u->free_bufs = u->free_bufs->next;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("MEM creating temp buf with size: %d", (int) conf->buf_size);[m
[31m-        dp->out_buf = ngx_create_temp_buf(r->pool,[m
[31m-                conf->buf_size);[m
[31m-[m
[31m-        if (dp->out_buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dp->out_buf->tag = (ngx_buf_tag_t) &ngx_http_drizzle_module;[m
[31m-        dp->out_buf->recycled = 1;[m
[31m-    }[m
[31m-[m
[31m-    dp->avail_out = conf->buf_size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_drizzle_get_postponed(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len)[m
[31m-{[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    dd("MEM enter");[m
[31m-[m
[31m-    if (dp->cached.start == NULL) {[m
[31m-        goto alloc;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (dp->cached.end - dp->cached.start) < len) {[m
[31m-        ngx_pfree(r->pool, dp->cached.start);[m
[31m-        goto alloc;[m
[31m-    }[m
[31m-[m
[31m-    return dp->cached.start;[m
[31m-[m
[31m-alloc:[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dp->cached.start = p;[m
[31m-    dp->cached.end = p + len;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_submit_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_int_t                rc;[m
[31m-    size_t                   postponed_len;[m
[31m-[m
[31m-    ngx_http_drizzle_loc_conf_t         *conf = dp->loc_conf;[m
[31m-[m
[31m-    if (dp->postponed.pos != NULL) {[m
[31m-        dd("MEM copy postponed data over to u->out_bufs for len %d", (int) len);[m
[31m-[m
[31m-        postponed_len = dp->postponed.last - dp->postponed.pos;[m
[31m-[m
[31m-        if (postponed_len > dp->avail_out) {[m
[31m-            /* we should ensure that rds atoms do not get[m
[31m-             * splitted into multiple bufs. */[m
[31m-[m
[31m-            if (dp->out_buf && dp->out_buf->pos != dp->out_buf->last) {[m
[31m-                /* save the current dp->out_buf */[m
[31m-                cl = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf = dp->out_buf;[m
[31m-                cl->next = NULL;[m
[31m-                *dp->last_out = cl;[m
[31m-                dp->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            /* create a buf for the postponed buf */[m
[31m-[m
[31m-            len = postponed_len > conf->buf_size ?[m
[31m-                postponed_len : conf->buf_size;[m
[31m-[m
[31m-            dp->out_buf = ngx_create_temp_buf(r->pool, len);[m
[31m-[m
[31m-            if (dp->out_buf == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            dp->out_buf->tag = (ngx_buf_tag_t) &ngx_http_drizzle_module;[m
[31m-            dp->out_buf->recycled = 1;[m
[31m-[m
[31m-            dp->out_buf->last = ngx_copy(dp->out_buf->last, dp->postponed.pos,[m
[31m-                                         postponed_len);[m
[31m-[m
[31m-            dp->avail_out = len - postponed_len;[m
[31m-[m
[31m-            dp->postponed.pos = NULL;[m
[31m-[m
[31m-            if (dp->avail_out == 0) {[m
[31m-                /* save the new big buf */[m
[31m-[m
[31m-                cl = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf = dp->out_buf;[m
[31m-                cl->next = NULL;[m
[31m-                *dp->last_out = cl;[m
[31m-                dp->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            len = dp->postponed.last - dp->postponed.pos;[m
[31m-            if (len > dp->avail_out) {[m
[31m-                len = dp->avail_out;[m
[31m-            }[m
[31m-[m
[31m-            dp->out_buf->last = ngx_copy(dp->out_buf->last,[m
[31m-                    dp->postponed.pos, len);[m
[31m-[m
[31m-            dp->avail_out -= len;[m
[31m-[m
[31m-            dp->postponed.pos += len;[m
[31m-[m
[31m-            if (dp->postponed.pos == dp->postponed.last) {[m
[31m-                dp->postponed.pos = NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (dp->avail_out > 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            dd("MEM save dp->out_buf");[m
[31m-[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = dp->out_buf;[m
[31m-            cl->next = NULL;[m
[31m-            *dp->last_out = cl;[m
[31m-            dp->last_out = &cl->next;[m
[31m-[m
[31m-            if (dp->postponed.pos == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_drizzle_get_buf(r, dp);[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("MEM consuming out_buf for %d", (int) len);[m
[31m-[m
[31m-    dp->out_buf->last += len;[m
[31m-    dp->avail_out -= len;[m
[31m-[m
[31m-    if (dp->avail_out == 0) {[m
[31m-        dd("MEM save dp->out_buf");[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = dp->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *dp->last_out = cl;[m
[31m-        dp->last_out = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.h[m
[1mdeleted file mode 100644[m
[1mindex 5952bdc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_OUTPUT_H[m
[31m-#define NGX_HTTP_DRIZZLE_OUTPUT_H[m
[31m-[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_result_header(ngx_http_request_t *r,[m
[31m-        drizzle_result_st *res);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_col(ngx_http_request_t *r,[m
[31m-        drizzle_column_st *res);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_row(ngx_http_request_t *r, uint64_t row);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_field(ngx_http_request_t *r, size_t offset,[m
[31m-        size_t len, size_t total, drizzle_field_t field);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_bufs(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_drizzle_peer_data_t *dp);[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_OUTPUT_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.c[m
[1mdeleted file mode 100644[m
[1mindex 6adc74b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.c[m
[1m+++ /dev/null[m
[36m@@ -1,552 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include "ngx_http_drizzle_output.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-[m
[31m-[m
[31m-#define MYSQL_ER_NO_SUCH_TABLE 1146[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_connect(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc);[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_send_query(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc);[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_recv_cols(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc);[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_recv_rows(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_process_events(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t                         *u;[m
[31m-    ngx_connection_t                            *c;[m
[31m-    ngx_http_upstream_drizzle_peer_data_t       *dp;[m
[31m-    drizzle_con_st                              *dc;[m
[31m-    ngx_int_t                                    rc;[m
[31m-#if 0[m
[31m-    drizzle_return_t                             ret;[m
[31m-#endif[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    dp = u->peer.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "drizzle process events, state: %d", dp->state);[m
[31m-[m
[31m-    if (!ngx_http_upstream_drizzle_is_my_peer(&u->peer)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "process events: it seems you "[m
[31m-                      "are using a non-drizzle upstream backend"[m
[31m-        );[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dc = dp->drizzle_con;[m
[31m-[m
[31m-    switch (dp->state) {[m
[31m-    case state_db_connect:[m
[31m-        rc = ngx_http_upstream_drizzle_connect(r, c, dp, dc);[m
[31m-        break;[m
[31m-[m
[31m-    case state_db_idle: /* from connection pool */[m
[31m-        c->log->action = "sending query to drizzle upstream";[m
[31m-[m
[31m-    case state_db_send_query:[m
[31m-        rc = ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-        break;[m
[31m-[m
[31m-    case state_db_recv_cols:[m
[31m-        rc = ngx_http_upstream_drizzle_recv_cols(r, c, dp, dc);[m
[31m-        break;[m
[31m-[m
[31m-    case state_db_recv_rows:[m
[31m-        rc = ngx_http_upstream_drizzle_recv_rows(r, c, dp, dc);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "unknown state: %d", (int) dp->state);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("rc == %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u, rc);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-#if 0[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        rc = ngx_http_drizzle_output_bufs(r, dp);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_connect(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc)[m
[31m-{[m
[31m-    drizzle_return_t             ret;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "drizzle connect: user %s, password %s", dc->user,[m
[31m-                   dc->password);[m
[31m-[m
[31m-    ret = drizzle_con_connect(dc);[m
[31m-[m
[31m-    if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "drizzle libdrizzle returned IO_WAIT while "[m
[31m-                       "connecting");[m
[31m-[m
[31m-#if 0[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ret != DRIZZLE_RETURN_OK) {[m
[31m-       ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to connect: %d: %s",[m
[31m-                     (int) ret, drizzle_error(dc->drizzle));[m
[31m-[m
[31m-       return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-    c->log->action = "sending query to drizzle upstream";[m
[31m-[m
[31m-    return ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_send_query(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc)[m
[31m-{[m
[31m-    ngx_http_upstream_t         *u = r->upstream;[m
[31m-    drizzle_return_t             ret;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    query;[m
[31m-    ngx_flag_t                   has_set_names = 0;[m
[31m-    ngx_flag_t                   enable_charset = 0;[m
[31m-[m
[31m-    dd("enable charset: %d", (int) dp->enable_charset);[m
[31m-[m
[31m-    if (dp->enable_charset && ! dp->has_set_names) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "drizzle enables connection charset setting");[m
[31m-[m
[31m-        query.len = dp->set_names_query->len;[m
[31m-        query.data = dp->set_names_query->data;[m
[31m-[m
[31m-    } else {[m
[31m-        query.data = dp->query.data;[m
[31m-        query.len = dp->query.len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "drizzle sending query \"%V\"", &query);[m
[31m-[m
[31m-    (void) drizzle_query(dc, &dp->drizzle_res, (const char *) query.data,[m
[31m-                         query.len, &ret);[m
[31m-[m
[31m-    if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "drizzle libdrizzle returned IO_WAIT while sending "[m
[31m-                       "query");[m
[31m-[m
[31m-        if (dp->state != state_db_send_query) {[m
[31m-            dp->state = state_db_send_query;[m
[31m-[m
[31m-            if (c->write->timer_set) {[m
[31m-                ngx_del_timer(c->write);[m
[31m-            }[m
[31m-[m
[31m-            ngx_add_timer(c->write, u->conf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ret != DRIZZLE_RETURN_OK) {[m
[31m-#if 1[m
[31m-        if (ret == DRIZZLE_RETURN_ERROR_CODE) {[m
[31m-            if (drizzle_error_code(dc->drizzle) == MYSQL_ER_NO_SUCH_TABLE) {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, c->log, 0,[m
[31m-                              "failed to send query: %i (%d): %s",[m
[31m-                              ret, drizzle_error_code(dc->drizzle),[m
[31m-                              drizzle_error(dc->drizzle));[m
[31m-[m
[31m-                if (dp->enable_charset && ! dp->has_set_names) {[m
[31m-                    c->log->action = "sending query to drizzle upstream";[m
[31m-                    dp->has_set_names = 1;[m
[31m-[m
[31m-                    return ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_upstream_drizzle_done(r, u, dp, NGX_HTTP_GONE);[m
[31m-[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "failed to send query: %d (%d): %s",[m
[31m-                      (int) ret, drizzle_error_code(dc->drizzle),[m
[31m-                      drizzle_error(dc->drizzle));[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-    dd_drizzle_result(&dp->drizzle_res);[m
[31m-[m
[31m-    dd("after drizzle restult");[m
[31m-[m
[31m-    if (dp->enable_charset) {[m
[31m-        enable_charset = 1;[m
[31m-    }[m
[31m-[m
[31m-    has_set_names = dp->has_set_names;[m
[31m-[m
[31m-    rc = ngx_http_drizzle_output_result_header(r, &dp->drizzle_res);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        if (enable_charset && ! has_set_names) {[m
[31m-            c->log->action = "sending query to drizzle upstream";[m
[31m-            dp->has_set_names = 1;[m
[31m-[m
[31m-            dp->state = state_db_idle;[m
[31m-[m
[31m-            return ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-        }[m
[31m-[m
[31m-        /* no data set following the header */[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "receiving result set columns from drizzle upstream";[m
[31m-[m
[31m-    return ngx_http_upstream_drizzle_recv_cols(r, c, dp, dc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_recv_cols(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc)[m
[31m-{[m
[31m-    drizzle_column_st               *col;[m
[31m-    ngx_int_t                        rc;[m
[31m-    drizzle_return_t                 ret;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "drizzle receive resultset columns");[m
[31m-[m
[31m-    for (;;) {[m
[31m-        col = drizzle_column_read(&dp->drizzle_res, &dp->drizzle_col, &ret);[m
[31m-[m
[31m-        if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-[m
[31m-            if (dp->state != state_db_recv_cols) {[m
[31m-                dp->state = state_db_recv_cols;[m
[31m-[m
[31m-                if (c->read->timer_set) {[m
[31m-                    ngx_del_timer(c->read);[m
[31m-                }[m
[31m-[m
[31m-                ngx_add_timer(c->read, dp->loc_conf->recv_cols_timeout);[m
[31m-[m
[31m-            }[m
[31m-[m
[31m-#if 0[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (ret != DRIZZLE_RETURN_OK) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "failed to recv cols: %d: %s",[m
[31m-                          (int) ret,[m
[31m-                          drizzle_error(dc->drizzle));[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-        if (col) {[m
[31m-            rc = ngx_http_drizzle_output_col(r, col);[m
[31m-[m
[31m-            drizzle_column_free(col);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-        } else { /* after the last column */[m
[31m-            if (c->read->timer_set) {[m
[31m-                ngx_del_timer(c->read);[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "receiving result set rows from drizzle "[m
[31m-                             "upstream";[m
[31m-[m
[31m-            return ngx_http_upstream_drizzle_recv_rows(r, c, dp, dc);[m
[31m-        }[m
[31m-[m
[31m-        dd_drizzle_column(col);[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_recv_rows(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc)[m
[31m-{[m
[31m-    ngx_http_upstream_t             *u = r->upstream;[m
[31m-    ngx_int_t                        rc;[m
[31m-    drizzle_return_t                 ret;[m
[31m-    size_t                           offset;[m
[31m-    size_t                           len;[m
[31m-    size_t                           total;[m
[31m-    drizzle_field_t                  field;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "drizzle receive resultset rows");[m
[31m-[m
[31m-    for (;;) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "drizzle receive resultset row %uL", dp->drizzle_row);[m
[31m-[m
[31m-        if (dp->drizzle_row == 0) {[m
[31m-            dp->drizzle_row = drizzle_row_read(&dp->drizzle_res, &ret);[m
[31m-[m
[31m-            if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-                dp->drizzle_row = 0;[m
[31m-[m
[31m-                goto io_wait;[m
[31m-            }[m
[31m-[m
[31m-            if (ret != DRIZZLE_RETURN_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "failed to read row: %d: %s",[m
[31m-                              (int) ret,[m
[31m-                              drizzle_error(dc->drizzle));[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-            rc = ngx_http_drizzle_output_row(r, dp->drizzle_row);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (dp->drizzle_row == 0) {[m
[31m-                /* after last row */[m
[31m-[m
[31m-                drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-                if (c->read->timer_set) {[m
[31m-                    ngx_del_timer(c->read);[m
[31m-                }[m
[31m-[m
[31m-                if (dp->enable_charset && ! dp->has_set_names) {[m
[31m-                    c->log->action = "sending query to drizzle upstream";[m
[31m-                    dp->has_set_names = 1;[m
[31m-[m
[31m-                    return ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_upstream_drizzle_done(r, u, dp, NGX_DONE);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* dp->drizzle_row != 0 */[m
[31m-[m
[31m-        for (;;) {[m
[31m-            field = drizzle_field_read(&dp->drizzle_res, &offset, &len,[m
[31m-                                       &total, &ret);[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "drizzle field read: %p (offset %z, len %z)",[m
[31m-                           field, offset, len);[m
[31m-[m
[31m-            if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-                goto io_wait;[m
[31m-            }[m
[31m-[m
[31m-            if (ret == DRIZZLE_RETURN_ROW_END) {[m
[31m-                /* reached the end of the current row */[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ret != DRIZZLE_RETURN_OK) {[m
[31m-                drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "failed to read row field: %d: %s",[m
[31m-                              (int) ret,[m
[31m-                              drizzle_error(dc->drizzle));[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-            rc = ngx_http_drizzle_output_field(r, offset, len, total, field);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (field) {[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                               "drizzle field value read: %*s", len, field);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dp->drizzle_row = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-[m
[31m-io_wait:[m
[31m-[m
[31m-    if (dp->state != state_db_recv_rows) {[m
[31m-        dp->state = state_db_recv_rows;[m
[31m-[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(c->read, dp->loc_conf->recv_rows_timeout);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_drizzle_done(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "drizzle upstream done");[m
[31m-[m
[31m-    (void) ngx_http_drizzle_output_bufs(r, dp);[m
[31m-[m
[31m-    /* to persuade Maxim Dounin's ngx_http_upstream_keepalive[m
[31m-     * module to cache the current connection */[m
[31m-[m
[31m-    u->length = 0;[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        u->header_sent = 1;[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-        rc = NGX_OK;[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_out.status = rc;[m
[31m-        u->headers_in.status_n = rc;[m
[31m-    }[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    c->log->action = "being idle";[m
[31m-[m
[31m-    /* reset the state machine */[m
[31m-    dp->state = state_db_idle;[m
[31m-[m
[31m-    dd("about to finalize request...");[m
[31m-    ngx_http_upstream_drizzle_finalize_request(r, u, rc);[m
[31m-    dd("after finalize request...");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.h[m
[1mdeleted file mode 100644[m
[1mindex cb9ff09..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_PROCESSOR_H[m
[31m-#define NGX_HTTP_DRIZZLE_PROCESSOR_H[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_process_events(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_upstream_drizzle_done(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-        ngx_int_t rc);[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_PROCESSOR_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.c[m
[1mdeleted file mode 100644[m
[1mindex 33eb625..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.c[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_quoting.h"[m
[31m-#include "ngx_http_drizzle_checker.h"[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-/* static */ ngx_http_drizzle_var_type_t  ngx_http_drizzle_builtin_types[] = {[m
[31m-    { ngx_string("string"),[m
[31m-      NULL,[m
[31m-      NULL,[m
[31m-      quotes_type_single[m
[31m-    },[m
[31m-    { ngx_string("int"),[m
[31m-      ngx_http_drizzle_check_int,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("bool"),[m
[31m-      ngx_http_drizzle_check_bool,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("float"),[m
[31m-      ngx_http_drizzle_check_float,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("column"),[m
[31m-      ngx_http_drizzle_check_col,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("table"),[m
[31m-      ngx_http_drizzle_check_table,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("keyword"),[m
[31m-      ngx_http_drizzle_check_keyword,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    }[m
[31m-};[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.h[m
[1mdeleted file mode 100644[m
[1mindex 6ffe821..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_QUOTING_H[m
[31m-#define NGX_HTTP_DRIZZLE_QUOTING_H[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-[m
[31m-typedef ngx_int_t (* ngx_http_drizzle_type_checker_pt) (ngx_str_t *value,[m
[31m-        void *data);[m
[31m-[m
[31m-typedef enum {[m
[31m-    quotes_type_none,[m
[31m-    quotes_type_single,[m
[31m-    quotes_type_double,[m
[31m-    quotes_type_back[m
[31m-[m
[31m-} ngx_http_drizzle_quotes_type_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                               name;[m
[31m-    ngx_http_drizzle_type_checker_pt        checker;[m
[31m-    void                                   *checker_data;[m
[31m-    ngx_http_drizzle_quotes_type_t          quotes;[m
[31m-[m
[31m-} ngx_http_drizzle_var_type_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                            src_var;[m
[31m-    ngx_int_t                            dest_var;[m
[31m-    ngx_http_drizzle_var_type_t         *type;[m
[31m-    ngx_str_t                            errstr;[m
[31m-[m
[31m-} ngx_http_drizzle_var_to_quote_t;[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_QUOTING_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex 66b7e8f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,1053 +0,0 @@[m
[31m-/* Copyright (C) agentzh */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include "ngx_http_drizzle_keepalive.h"[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-[m
[31m-enum {[m
[31m-    ngx_http_drizzle_default_port = 3306[m
[31m-};[m
[31m-[m
[31m-static void ngx_http_upstream_drizzle_cleanup(void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_init(ngx_conf_t *cf,[m
[31m-        ngx_http_upstream_srv_conf_t *uscf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_get_peer(ngx_peer_connection_t *pc,[m
[31m-        void *data);[m
[31m-[m
[31m-static void ngx_http_upstream_drizzle_free_peer(ngx_peer_connection_t *pc,[m
[31m-        void *data, ngx_uint_t state);[m
[31m-[m
[31m-/* just a work-around to override the default u->output_filter */[m
[31m-static ngx_int_t ngx_http_drizzle_output_filter(void *data, ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_upstream_drizzle_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t  *conf;[m
[31m-[m
[31m-    dd("drizzle create srv conf");[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool,[m
[31m-                       sizeof(ngx_http_upstream_drizzle_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      conf->peers   = NULL[m
[31m-     *      conf->current = 0[m
[31m-     *      conf->servers = NULL[m
[31m-     *      conf->single = 0[m
[31m-     *      conf->max_cached = 0[m
[31m-     *      conf->overflow = 0 (drizzle_keepalive_overflow_ignore)[m
[31m-     */[m
[31m-[m
[31m-    conf->pool = cf->pool;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-[m
[31m-    (void) drizzle_create(&conf->drizzle);[m
[31m-[m
[31m-    cln->handler = ngx_http_upstream_drizzle_cleanup;[m
[31m-    cln->data = &conf->drizzle;[m
[31m-[m
[31m-    drizzle_add_options(&conf->drizzle, DRIZZLE_NON_BLOCKING);[m
[31m-[m
[31m-    /* we use 0 timeout for the underlying poll event model[m
[31m-     * used by libdrizzle itself. */[m
[31m-    drizzle_set_timeout(&conf->drizzle, 0);[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* mostly based on ngx_http_upstream_server in[m
[31m- * ngx_http_upstream.c of nginx 0.8.30.[m
[31m- * Copyright (C) Igor Sysoev */[m
[31m-char *[m
[31m-ngx_http_upstream_drizzle_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t        *dscf = conf;[m
[31m-    ngx_http_upstream_drizzle_server_t          *ds;[m
[31m-    ngx_str_t                                   *value;[m
[31m-    ngx_url_t                                    u;[m
[31m-    ngx_uint_t                                   i, j;[m
[31m-    ngx_http_upstream_srv_conf_t                *uscf;[m
[31m-    ngx_str_t                                    protocol;[m
[31m-    ngx_str_t                                    charset;[m
[31m-    u_char                                      *p;[m
[31m-    size_t                                       len;[m
[31m-[m
[31m-    dd("entered drizzle_server directive handler...");[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (dscf->servers == NULL) {[m
[31m-        dscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                                 sizeof(ngx_http_upstream_drizzle_server_t));[m
[31m-[m
[31m-        if (dscf->servers == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        uscf->servers = dscf->servers;[m
[31m-    }[m
[31m-[m
[31m-    ds = ngx_array_push(dscf->servers);[m
[31m-    if (ds == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(ds, sizeof(ngx_http_upstream_drizzle_server_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    /* parse the first name:port argument */[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = ngx_http_drizzle_default_port;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "drizzle: %s in upstream \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ds->addrs  = u.addrs;[m
[31m-    ds->naddrs = u.naddrs;[m
[31m-    ds->port   = u.port;[m
[31m-    ds->protocol = ngx_http_drizzle_protocol;[m
[31m-[m
[31m-    /* parse various options */[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "dbname=", sizeof("dbname=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            ds->dbname.len = value[i].len - (sizeof("dbname=") - 1);[m
[31m-[m
[31m-            if (ds->dbname.len >= DRIZZLE_MAX_DB_SIZE) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                       "drizzle: \"dbname\" value too large in upstream \"%V\""[m
[31m-                       " (at most %d bytes)",[m
[31m-                       dscf->peers->name,[m
[31m-                       (int) DRIZZLE_MAX_DB_SIZE);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ds->dbname.data = &value[i].data[sizeof("dbname=") - 1];[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "user=", sizeof("user=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            ds->user.len = value[i].len - (sizeof("user=") - 1);[m
[31m-[m
[31m-            if (ds->user.len >= DRIZZLE_MAX_USER_SIZE) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                       "drizzle: \"user\" value too large in upstream \"%V\""[m
[31m-                       " (at most %d bytes)",[m
[31m-                       dscf->peers->name,[m
[31m-                       (int) DRIZZLE_MAX_USER_SIZE);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ds->user.data = &value[i].data[sizeof("user=") - 1];[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "password=", sizeof("password=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            ds->password.len = value[i].len - (sizeof("password=") - 1);[m
[31m-[m
[31m-            if (ds->password.len >= DRIZZLE_MAX_PASSWORD_SIZE) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                       "drizzle: \"password\" value too large in upstream "[m
[31m-                       "\"%V\" (at most %d bytes)",[m
[31m-                       dscf->peers->name,[m
[31m-                       (int) DRIZZLE_MAX_PASSWORD_SIZE);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ds->password.data = &value[i].data[sizeof("password=") - 1];[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "protocol=", sizeof("protocol=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            protocol.len = value[i].len - (sizeof("protocol=") - 1);[m
[31m-            protocol.data = &value[i].data[sizeof("protocol=") - 1];[m
[31m-[m
[31m-            switch (protocol.len) {[m
[31m-            case 5:[m
[31m-                if (ngx_http_drizzle_strcmp_const(protocol.data, "mysql") == 0)[m
[31m-                {[m
[31m-                    ds->protocol = ngx_http_mysql_protocol;[m
[31m-                } else {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case 7:[m
[31m-                if (ngx_http_drizzle_strcmp_const(protocol.data,[m
[31m-                            "drizzle") != 0)[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            default:[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "drizzle: invalid protocol \"%V\""[m
[31m-                               " in drizzle_server", &protocol);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "charset=", sizeof("charset=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            charset.len = value[i].len - (sizeof("charset=") - 1);[m
[31m-            charset.data = &value[i].data[sizeof("charset=") - 1];[m
[31m-[m
[31m-            dd("charset: %.*s", (int) charset.len, charset.data);[m
[31m-[m
[31m-            if (charset.len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < charset.len; j++) {[m
[31m-                if (charset.data[j] == '\'') {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "bad charste value \"%V\" in"[m
[31m-                                       " drizzle_server", &charset);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            len = sizeof("set names ''") - 1 + charset.len;[m
[31m-[m
[31m-            p = ngx_palloc(cf->pool, len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ds->set_names_query.data = p;[m
[31m-            ds->set_names_query.len = len;[m
[31m-[m
[31m-            dd("charset query len: %d", (int) len);[m
[31m-[m
[31m-            p = ngx_copy(p, "set names '", sizeof("set names '") - 1);[m
[31m-            p = ngx_copy(p, charset.data, charset.len);[m
[31m-            *p = '\'';[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\" in"[m
[31m-                           " drizzle_server", &value[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("reset init_upstream...");[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_upstream_drizzle_init;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_init(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_uint_t                               i, j, n;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-    ngx_http_upstream_drizzle_server_t      *server;[m
[31m-    ngx_http_upstream_drizzle_peers_t       *peers;[m
[31m-    size_t                                   len;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,[m
[31m-            "drizzle upstream init");[m
[31m-[m
[31m-    uscf->peer.init = ngx_http_upstream_drizzle_init_peer;[m
[31m-[m
[31m-    dscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_http_drizzle_module);[m
[31m-[m
[31m-    if (dscf->servers == NULL || dscf->servers->nelts == 0) {[m
[31m-        /* XXX an upstream implicitly defined by drizzle_pass, etc.,[m
[31m-         * is not allowed for now */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "drizzle: no drizzle_server defined in upstream \"%V\""[m
[31m-                      " in %s:%ui",[m
[31m-                      &uscf->host, uscf->file_name, uscf->line);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* dscf->servers != NULL */[m
[31m-[m
[31m-    server = uscf->servers->elts;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < uscf->servers->nelts; i++) {[m
[31m-        n += server[i].naddrs;[m
[31m-    }[m
[31m-[m
[31m-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_drizzle_peers_t)[m
[31m-            + sizeof(ngx_http_upstream_drizzle_peer_t) * (n - 1));[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (n == 1);[m
[31m-    peers->number = n;[m
[31m-    peers->name = &uscf->host;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < uscf->servers->nelts; i++) {[m
[31m-        for (j = 0; j < server[i].naddrs; j++) {[m
[31m-            peers->peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-            peers->peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-            peers->peer[n].name = server[i].addrs[j].name;[m
[31m-            peers->peer[n].port = server[i].port;[m
[31m-            peers->peer[n].user = server[i].user;[m
[31m-            peers->peer[n].password = server[i].password;[m
[31m-            peers->peer[n].dbname = server[i].dbname;[m
[31m-            peers->peer[n].protocol = server[i].protocol;[m
[31m-            peers->peer[n].set_names_query = &server[i].set_names_query;[m
[31m-[m
[31m-            len = NGX_SOCKADDR_STRLEN + 1 /* for '\0' */;[m
[31m-[m
[31m-            peers->peer[n].host = ngx_palloc(cf->pool, len);[m
[31m-[m
[31m-            if (peers->peer[n].host == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = ngx_sock_ntop(peers->peer[n].sockaddr,[m
[31m-#if defined(nginx_version) && (nginx_version >= 1005003)[m
[31m-                                peers->peer[n].socklen,[m
[31m-#endif[m
[31m-                                peers->peer[n].host, len - 1, 0 /* no port */);[m
[31m-[m
[31m-            peers->peer[n].host[len] = '\0';[m
[31m-[m
[31m-            n++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dscf->peers = peers;[m
[31m-[m
[31m-    dscf->active_conns = 0;[m
[31m-[m
[31m-    if (dscf->max_cached) {[m
[31m-        return ngx_http_drizzle_keepalive_init(cf->pool, dscf);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-    ngx_http_upstream_t                     *u;[m
[31m-    ngx_http_core_loc_conf_t                *clcf;[m
[31m-    ngx_http_drizzle_loc_conf_t             *dlcf;[m
[31m-    ngx_drizzle_mixed_t                     *query;[m
[31m-    ngx_str_t                                dbname, sql;[m
[31m-    ngx_uint_t                               i;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-            "drizzle init peer");[m
[31m-[m
[31m-    dp = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_drizzle_peer_data_t));[m
[31m-    if (dp == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    dp->upstream = u;[m
[31m-    dp->request  = r;[m
[31m-[m
[31m-    dp->last_out = &u->out_bufs;[m
[31m-[m
[31m-    dscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_http_drizzle_module);[m
[31m-[m
[31m-    dp->srv_conf = dscf;[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_drizzle_module);[m
[31m-[m
[31m-    dp->loc_conf = dlcf;[m
[31m-[m
[31m-    dp->query.len  = 0;[m
[31m-    dp->dbname.len = 0;[m
[31m-[m
[31m-    /* to force ngx_output_chain not to use ngx_chain_writer */[m
[31m-[m
[31m-    u->output.output_filter = ngx_http_drizzle_output_filter;[m
[31m-    u->output.filter_ctx = r;[m
[31m-    u->output.in   = NULL;[m
[31m-    u->output.busy = NULL;[m
[31m-[m
[31m-    u->peer.data = dp;[m
[31m-    u->peer.get = ngx_http_upstream_drizzle_get_peer;[m
[31m-    u->peer.free = ngx_http_upstream_drizzle_free_peer;[m
[31m-[m
[31m-    /* prepare dbname */[m
[31m-[m
[31m-    dp->dbname.len = 0;[m
[31m-[m
[31m-    if (dlcf->dbname) {[m
[31m-        /* check if dbname requires overriding at request time */[m
[31m-        if (ngx_http_complex_value(r, dlcf->dbname, &dbname) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (dbname.len) {[m
[31m-            if (dbname.len >= DRIZZLE_MAX_DB_SIZE) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, r->connection->log, 0,[m
[31m-                       "drizzle: \"dbname\" value too large in upstream \"%V\"",[m
[31m-                       dscf->peers->name);[m
[31m-[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            dp->dbname = dbname;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* prepare SQL query */[m
[31m-[m
[31m-    if (dlcf->methods_set & r->method) {[m
[31m-        /* method-specific query */[m
[31m-        dd("using method-specific query");[m
[31m-[m
[31m-        query = dlcf->queries->elts;[m
[31m-        for (i = 0; i < dlcf->queries->nelts; i++) {[m
[31m-            if (query[i].key & r->method) {[m
[31m-                query = &query[i];[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (i == dlcf->queries->nelts) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* default query */[m
[31m-        dd("using default query");[m
[31m-[m
[31m-        query = dlcf->default_query;[m
[31m-    }[m
[31m-[m
[31m-    if (query->cv) {[m
[31m-        /* complex value */[m
[31m-        dd("using complex value");[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, query->cv, &sql) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (sql.len == 0) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "drizzle: empty \"drizzle_query\" (was: \"%V\")"[m
[31m-                          " in location \"%V\"", &query->cv->value,[m
[31m-                          &clcf->name);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        dp->query = sql;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* simple value */[m
[31m-    dd("using simple value");[m
[31m-[m
[31m-    dp->query = query->sv;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-    return NGX_ERROR;[m
[31m-#else[m
[31m-    r->upstream->peer.data = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = data;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-    ngx_http_upstream_drizzle_peers_t       *peers;[m
[31m-    ngx_http_upstream_drizzle_peer_t        *peer;[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    ngx_http_drizzle_ctx_t                  *dctx;[m
[31m-#endif[m
[31m-    ngx_connection_t                        *c = NULL;[m
[31m-    drizzle_con_st                          *dc = NULL;[m
[31m-    ngx_str_t                                dbname;[m
[31m-    drizzle_return_t                         ret;[m
[31m-    ngx_socket_t                             fd;[m
[31m-    ngx_event_t                             *rev, *wev;[m
[31m-    ngx_int_t                                rc;[m
[31m-    ngx_int_t                                event;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, dp->request->connection->log, 0,[m
[31m-            "drizzle get peer");[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    if (data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    dctx = ngx_http_get_module_ctx(dp->request, ngx_http_drizzle_module);[m
[31m-#endif[m
[31m-[m
[31m-    dscf = dp->srv_conf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, dp->request->connection->log, 0,[m
[31m-            "active drizzle connections %ui", dscf->active_conns);[m
[31m-[m
[31m-    dp->failed = 0;[m
[31m-[m
[31m-    /* try to get an idle connection from our single-mode[m
[31m-     * keep-alive pool */[m
[31m-[m
[31m-    if (dscf->max_cached && dscf->single) {[m
[31m-        rc = ngx_http_drizzle_keepalive_get_peer_single(pc, dp, dscf);[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, dp->request->connection->log, 0,[m
[31m-        "drizzle get peer using simple round robin");[m
[31m-[m
[31m-    peers = dscf->peers;[m
[31m-[m
[31m-    if (dscf->current > peers->number - 1) {[m
[31m-        dscf->current = 0;[m
[31m-    }[m
[31m-[m
[31m-    peer = &peers->peer[dscf->current++];[m
[31m-[m
[31m-    dp->name.data = peer->name.data;[m
[31m-    dp->name.len = peer->name.len;[m
[31m-[m
[31m-    dp->sockaddr = *peer->sockaddr;[m
[31m-[m
[31m-    dp->enable_charset = (peer->set_names_query->len > 0);[m
[31m-    dp->set_names_query = peer->set_names_query;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-            "drizzle set connection charset query \"%V\"", dp->set_names_query);[m
[31m-[m
[31m-    pc->name = &dp->name;[m
[31m-    pc->sockaddr = &dp->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->cached = 0;[m
[31m-[m
[31m-    if (dscf->max_cached && ! dscf->single) {[m
[31m-        rc = ngx_http_drizzle_keepalive_get_peer_multi(pc, dp, dscf);[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dscf->overflow == drizzle_keepalive_overflow_reject &&[m
[31m-            dscf->active_conns >= dscf->max_cached)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_INFO, pc->log, 0,[m
[31m-                       "drizzle: connection pool full, rejecting request "[m
[31m-                       "to upstream \"%V\"",[m
[31m-                       &peer->name);[m
[31m-[m
[31m-        /* a bit hack-ish way to return error response (setup part) */[m
[31m-        pc->connection = ngx_get_connection(0, pc->log);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-        dctx->status = NGX_HTTP_SERVICE_UNAVAILABLE;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* set up the peer's drizzle connection */[m
[31m-[m
[31m-    dc = ngx_pcalloc(dscf->pool, sizeof(drizzle_con_st));[m
[31m-[m
[31m-    if (dc == NULL) {[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-        return NGX_ERROR;[m
[31m-#else[m
[31m-        goto failed;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dp->drizzle_con = dc;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-        "drizzle creating connection");[m
[31m-[m
[31m-    (void) drizzle_con_create(&dscf->drizzle, dc);[m
[31m-[m
[31m-    /* set protocol for the drizzle connection */[m
[31m-[m
[31m-    if (peer->protocol == ngx_http_mysql_protocol) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-            "drizzle using mysql protocol");[m
[31m-[m
[31m-        drizzle_con_add_options(dc, DRIZZLE_CON_MYSQL);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    /* set dbname for the drizzle connection */[m
[31m-[m
[31m-    if (dp->dbname.len) {[m
[31m-        dbname = dp->dbname;[m
[31m-[m
[31m-    } else {[m
[31m-        dbname = peer->dbname;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(dc->db, dbname.data, dbname.len);[m
[31m-    dc->db[dbname.len] = '\0';[m
[31m-[m
[31m-    /* set user for the drizzle connection */[m
[31m-[m
[31m-    ngx_memcpy(dc->user, peer->user.data, peer->user.len);[m
[31m-    dc->user[peer->user.len] = '\0';[m
[31m-[m
[31m-    /* set password for the drizzle connection */[m
[31m-[m
[31m-    ngx_memcpy(dc->password, peer->password.data, peer->password.len);[m
[31m-    dc->password[peer->password.len] = '\0';[m
[31m-[m
[31m-    dd("user %s, password %s", dc->user, dc->password);[m
[31m-[m
[31m-    /* TODO add support for uds (unix domain socket) */[m
[31m-[m
[31m-    /* set host and port for the drizzle connection */[m
[31m-[m
[31m-    drizzle_con_set_tcp(dc, (char *) peer->host, peer->port);[m
[31m-[m
[31m-    /* ask drizzle to connect to the remote */[m
[31m-[m
[31m-    ngx_log_debug7(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-            "drizzle connecting: host %s, port %d, dbname \"%V\", "[m
[31m-            "user \"%V\", pass \"%V\", dc pass \"%s\", "[m
[31m-            "protocol %d", peer->host, (int) peer->port, &dbname,[m
[31m-            &peer->user, &peer->password, dc->password, (int) peer->protocol);[m
[31m-[m
[31m-    ret = drizzle_con_connect(dc);[m
[31m-[m
[31m-    if (ret != DRIZZLE_RETURN_OK && ret != DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, pc->log, 0,[m
[31m-                       "drizzle: failed to connect: %d: %s in upstream \"%V\"",[m
[31m-                       (int) ret,[m
[31m-                       drizzle_error(&dscf->drizzle),[m
[31m-                       &peer->name);[m
[31m-[m
[31m-        drizzle_con_free(dc);[m
[31m-        ngx_pfree(dscf->pool, dc);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-        return NGX_DECLINED;[m
[31m-#else[m
[31m-        dctx->status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        goto failed;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dscf->active_conns++;[m
[31m-[m
[31m-    /* add the file descriptor (fd) into an nginx connection structure */[m
[31m-[m
[31m-    fd = drizzle_con_fd(dc);[m
[31m-[m
[31m-    if (fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                "drizzle: failed to get the drizzle connection fd");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(fd, pc->log);[m
[31m-    if (c == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                "drizzle: failed to get a free nginx connection");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    c->log = pc->log;[m
[31m-    c->log_error = pc->log_error;[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = pc->log;[m
[31m-    wev->log = pc->log;[m
[31m-[m
[31m-    pc->connection = c;[m
[31m-[m
[31m-    /* register the connection with the drizzle fd into the[m
[31m-     * nginx event model */[m
[31m-[m
[31m-#if 0[m
[31m-    if (ngx_nonblocking(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                "drizzle get peer: still connecting to remote");[m
[31m-[m
[31m-        dp->state = state_db_connect;[m
[31m-[m
[31m-        c->log->action = "connecting to drizzle upstream";[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                "drizzle get peer: already connected to remote");[m
[31m-[m
[31m-        /* to ensure send_query sets corresponding timers */[m
[31m-        dp->state = state_db_idle;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        dd("Found ngx_add_conn");[m
[31m-[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-            dd("returned NGX_AGAIN!!!");[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue */[m
[31m-[m
[31m-        event = NGX_CLEAR_EVENT;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        event = NGX_LEVEL_EVENT;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                "drizzle: failed to add connection into nginx event model");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "drizzle connected");[m
[31m-[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_free_connection(pc->log, pc->connection,[m
[31m-            dc, dscf);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-    return NGX_ERROR;[m
[31m-#else[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    /* a bit hack-ish way to return error response (setup part) */[m
[31m-    pc->connection = ngx_get_connection(0, pc->log);[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_drizzle_free_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = data;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    if (data == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (pc && pc->log) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-            "drizzle free peer");[m
[31m-    }[m
[31m-[m
[31m-    dscf = dp->srv_conf;[m
[31m-[m
[31m-    if (dp->drizzle_con && dp->drizzle_res.con) {[m
[31m-        dd("before drizzle result free");[m
[31m-[m
[31m-        dd("%p vs. %p", dp->drizzle_res.con, dp->drizzle_con);[m
[31m-[m
[31m-        drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-        dd("after drizzle result free");[m
[31m-    }[m
[31m-[m
[31m-    if (dscf->max_cached) {[m
[31m-        ngx_http_drizzle_keepalive_free_peer(pc, dp, dscf, state);[m
[31m-    }[m
[31m-[m
[31m-    if (pc && pc->connection) {[m
[31m-        dd("actually free the drizzle connection");[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_free_connection(pc->log, pc->connection,[m
[31m-                dp->drizzle_con, dscf);[m
[31m-[m
[31m-        dp->drizzle_con = NULL;[m
[31m-        pc->connection = NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_output_filter(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_request_t              *r = data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-        "drizzle output filter");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    r->upstream->request_sent = 1;[m
[31m-[m
[31m-    (void) ngx_http_drizzle_process_events(r);[m
[31m-[m
[31m-    /* discard the ret val from process events because[m
[31m-     * we can only return NGX_AGAIN here to prevent[m
[31m-     * ngx_http_upstream_process_header from being called[m
[31m-     * and avoid u->write_event_handler to be set to[m
[31m-     * ngx_http_upstream_dummy. */[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_flag_t[m
[31m-ngx_http_upstream_drizzle_is_my_peer(const ngx_peer_connection_t    *peer)[m
[31m-{[m
[31m-    return (peer->get == ngx_http_upstream_drizzle_get_peer);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_drizzle_free_connection(ngx_log_t *log,[m
[31m-    ngx_connection_t *c, drizzle_con_st *dc,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf)[m
[31m-{[m
[31m-    ngx_event_t  *rev, *wev;[m
[31m-[m
[31m-    dd("drizzle free peer connection");[m
[31m-[m
[31m-    dscf->active_conns--;[m
[31m-[m
[31m-    if (dc) {[m
[31m-        dd("before con free");[m
[31m-        drizzle_con_free(dc);[m
[31m-        dd("after con free");[m
[31m-        ngx_pfree(dscf->pool, dc);[m
[31m-    }[m
[31m-[m
[31m-    if (c) {[m
[31m-        /* dd("c pool: %p", c->pool); */[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        if (wev->timer_set) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_del_conn) {[m
[31m-           ngx_del_conn(c, NGX_CLOSE_EVENT);[m
[31m-[m
[31m-        } else {[m
[31m-            if (rev->active || rev->disabled) {[m
[31m-                ngx_del_event(rev, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-[m
[31m-            if (wev->active || wev->disabled) {[m
[31m-                ngx_del_event(wev, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (rev->posted) {[m
[31m-#else[m
[31m-        if (rev->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(rev);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (wev->posted) {[m
[31m-#else[m
[31m-        if (wev->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(wev);[m
[31m-        }[m
[31m-[m
[31m-        rev->closed = 1;[m
[31m-        wev->closed = 1;[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        c->fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_upstream_drizzle_add(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_uint_t                      i;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != url->host.len[m
[31m-                || ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-                    url->host.len) != 0)[m
[31m-        {[m
[31m-            dd("upstream_add: host not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            dd("upstream_add: port not match: %d != %d",[m
[31m-                    (int) uscfp[i]->port, (int) url->port);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && url->default_port[m
[31m-            && uscfp[i]->default_port != url->default_port)[m
[31m-        {[m
[31m-            dd("upstream_add: default_port not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    dd("No upstream found: %.*s", (int) url->host.len, url->host.data);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_drizzle_cleanup(void *data)[m
[31m-{[m
[31m-    drizzle_st  *drizzle = data;[m
[31m-[m
[31m-    drizzle_free(drizzle);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex b71b961..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,148 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_UPSTREAM_H[m
[31m-#define NGX_HTTP_DRIZZLE_UPSTREAM_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    drizzle_keepalive_overflow_ignore = 0,[m
[31m-    drizzle_keepalive_overflow_reject[m
[31m-[m
[31m-} ngx_http_drizzle_keepalive_overflow_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_drizzle_protocol = 0,[m
[31m-    ngx_http_mysql_protocol[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_protocol_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8022[m
[31m-    ngx_addr_t                      *addrs;[m
[31m-#else[m
[31m-    ngx_peer_addr_t                 *addrs;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t                       naddrs;[m
[31m-    in_port_t                        port;[m
[31m-    ngx_str_t                        user;[m
[31m-    ngx_str_t                        password;[m
[31m-    ngx_str_t                        dbname;[m
[31m-    ngx_str_t                        set_names_query;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_protocol_t      protocol;[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_server_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct sockaddr                *sockaddr;[m
[31m-    socklen_t                       socklen;[m
[31m-    ngx_str_t                       name;[m
[31m-    in_port_t                       port;[m
[31m-    ngx_str_t                       user;[m
[31m-    ngx_str_t                       password;[m
[31m-    ngx_str_t                       dbname;[m
[31m-    ngx_str_t                      *set_names_query;[m
[31m-    u_char                         *host;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_protocol_t      protocol;[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_peer_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned                            single;[m
[31m-    ngx_uint_t                          number;[m
[31m-    ngx_str_t                          *name;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_t    peer[1];[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_peers_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_drizzle_peers_t   *peers;[m
[31m-[m
[31m-    /* TODO: we might need "tried" from round robin peer data */[m
[31m-    ngx_uint_t                           current;[m
[31m-[m
[31m-    /* of ngx_http_upstream_drizzle_server_t */[m
[31m-    ngx_array_t                         *servers;[m
[31m-[m
[31m-    drizzle_st                           drizzle;[m
[31m-    ngx_pool_t                          *pool;[m
[31m-[m
[31m-    /* keepalive related fields */[m
[31m-    unsigned                             single;[m
[31m-    ngx_queue_t                          free;[m
[31m-    ngx_queue_t                          cache;[m
[31m-[m
[31m-    ngx_uint_t                           active_conns;[m
[31m-[m
[31m-    ngx_uint_t                           max_cached;[m
[31m-    ngx_http_drizzle_keepalive_overflow_t    overflow;[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_drizzle_loc_conf_t            *loc_conf;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t   *srv_conf;[m
[31m-[m
[31m-    ngx_http_upstream_t                    *upstream;[m
[31m-    ngx_http_request_t                     *request;[m
[31m-[m
[31m-    ngx_str_t                               dbname;[m
[31m-    ngx_str_t                               query;[m
[31m-[m
[31m-    ngx_http_drizzle_state_t                state;[m
[31m-[m
[31m-    drizzle_con_st                         *drizzle_con;[m
[31m-    drizzle_result_st                       drizzle_res;[m
[31m-    drizzle_column_st                       drizzle_col;[m
[31m-    uint64_t                                drizzle_row;[m
[31m-[m
[31m-    ngx_str_t                               name;[m
[31m-[m
[31m-    ngx_chain_t                           **last_out;[m
[31m-[m
[31m-    ngx_buf_t                              *out_buf;[m
[31m-    ngx_buf_t                               cached;[m
[31m-    ngx_buf_t                               postponed;[m
[31m-    size_t                                  avail_out;[m
[31m-    ngx_str_t                               charset;[m
[31m-    ngx_str_t                              *set_names_query;[m
[31m-[m
[31m-    struct sockaddr                         sockaddr;[m
[31m-[m
[31m-    /* how many times this connection has been successfully used */[m
[31m-    ngx_uint_t                              used;[m
[31m-[m
[31m-    unsigned                                failed:1;[m
[31m-    unsigned                                seen_stream_end:1;[m
[31m-    unsigned                                has_set_names:1;[m
[31m-    unsigned                                enable_charset:1;[m
[31m-} ngx_http_upstream_drizzle_peer_data_t;[m
[31m-[m
[31m-[m
[31m-char *ngx_http_upstream_drizzle_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-        void *conf);[m
[31m-void *ngx_http_upstream_drizzle_create_srv_conf(ngx_conf_t *cf);[m
[31m-ngx_flag_t ngx_http_upstream_drizzle_is_my_peer([m
[31m-        const ngx_peer_connection_t *peer);[m
[31m-void ngx_http_upstream_drizzle_free_connection(ngx_log_t *log,[m
[31m-        ngx_connection_t *c, drizzle_con_st *dc,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf);[m
[31m-ngx_http_upstream_srv_conf_t *ngx_http_upstream_drizzle_add([m
[31m-        ngx_http_request_t *r, ngx_url_t *url);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_UPSTREAM_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.c[m
[1mdeleted file mode 100644[m
[1mindex e2df951..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,1112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include "ngx_http_drizzle_handler.h"[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_dbd_reinit(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_dbd_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_dbd_connect(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_dbd_cleanup(void *data);[m
[31m-static void ngx_http_upstream_dbd_wr_check_broken_connection([m
[31m-    ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_dbd_rd_check_broken_connection([m
[31m-    ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_dbd_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_set_header(ngx_http_request_t *r, ngx_str_t *key,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                  i;[m
[31m-[m
[31m-    dd("entered set_header");[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].key.len == key->len[m
[31m-            && ngx_strncasecmp(h[i].key.data, key->data, h[i].key.len) == 0)[m
[31m-        {[m
[31m-            if (value->len == 0) {[m
[31m-                h[i].hash = 0;[m
[31m-            }[m
[31m-[m
[31m-            h[i].value = *value;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = 1;[m
[31m-    h->key = *key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* the following functions are copied directly from[m
[31m-   ngx_http_upstream.c in nginx 0.8.30, just because[m
[31m-   they're static. sigh. */[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_drizzle_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc)[m
[31m-{[m
[31m-#if !defined(nginx_version) || nginx_version < 1009001[m
[31m-    ngx_time_t  *tp;[m
[31m-#endif[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http upstream request: %i", rc);[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009001[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (u->state && u->state->response_sec) {[m
[31m-        tp = ngx_timeofday();[m
[31m-        u->state->response_sec = tp->sec - u->state->response_sec;[m
[31m-        u->state->response_msec = tp->msec - u->state->response_msec;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (u->pipe) {[m
[31m-            u->state->response_length = u->pipe->read_length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->finalize_request) {[m
[31m-        u->finalize_request(r, rc);[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.free) {[m
[31m-        dd("before free peer");[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-        dd("after free peer");[m
[31m-    }[m
[31m-[m
[31m-    dd("about to free peer 2, c: %p, r pool: %p", u->peer.connection, r->pool);[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-#if 0 /* libdrizzle doesn't support SSL, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-        /* TODO: do not shutdown persistent connection */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-[m
[31m-            /*[m
[31m-             * We send the "close notify" shutdown alert to the upstream only[m
[31m-             * and do not wait its "close notify" shutdown alert.[m
[31m-             * It is acceptable according to the TLS standard.[m
[31m-             */[m
[31m-[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "drizzle close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-        dd("r pool: %p, c pool: %p", r->pool, u->peer.connection->pool);[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    u->peer.connection = NULL;[m
[31m-[m
[31m-    if (u->pipe && u->pipe->temp_file) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream temp fd: %d",[m
[31m-                       u->pipe->temp_file->file.fd);[m
[31m-    }[m
[31m-[m
[31m-    if (u->header_sent[m
[31m-        && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))[m
[31m-    {[m
[31m-        rc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "sending to client";[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_drizzle_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t ft_type)[m
[31m-{[m
[31m-    ngx_uint_t  status, state;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http next upstream, %xi", ft_type);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);[m
[31m-#endif[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {[m
[31m-        state = NGX_PEER_NEXT;[m
[31m-    } else {[m
[31m-        state = NGX_PEER_FAILED;[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type != NGX_HTTP_UPSTREAM_FT_NOLIVE) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, state);[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        status = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        switch (ft_type) {[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_TIMEOUT:[m
[31m-            status = NGX_HTTP_GATEWAY_TIME_OUT;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_HTTP_500:[m
[31m-            status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_HTTP_404:[m
[31m-            status = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        /*[m
[31m-         * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING[m
[31m-         * never reach here[m
[31m-         */[m
[31m-[m
[31m-        default:[m
[31m-            status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->error) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (status) {[m
[31m-        u->state->status = status;[m
[31m-[m
[31m-        if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type)) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u, status);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-#if 0 /* libdrizzle doesn't support SSL, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-            u->peer.connection->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        dd("r pool: %p, c pool: %p", r->pool, u->peer.connection->pool);[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (u->conf->busy_lock && !u->busy_locked) {[m
[31m-        ngx_http_upstream_busy_lock(p);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: ngx_http_upstream_connect(r, u); */[m
[31m-    if (status == 0) {[m
[31m-        status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_finalize_request(r, u, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_drizzle_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        if (c->write->pending_eof) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, c->write->kq_errno,[m
[31m-                                        "kevent() reported that connect() "[m
[31m-                                        "failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_dbd_init(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http init upstream, client timer: %d", c->read->timer_set);[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        if (!c->write->active) {[m
[31m-            if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_dbd_init_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_dbd_init_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *host;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_resolver_ctx_t             *ctx, temp;[m
[31m-    ngx_http_cleanup_t             *cln;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    if (r->aio) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#if 0 && (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->cache) {[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache(r, u);[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            r->write_event_handler = ngx_http_upstream_init_request;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            ngx_http_finalize_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->store = (u->conf->store || u->conf->store_lengths);[m
[31m-[m
[31m-    if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-        r->read_event_handler =[m
[31m-                             ngx_http_upstream_dbd_rd_check_broken_connection;[m
[31m-        r->write_event_handler =[m
[31m-                             ngx_http_upstream_dbd_wr_check_broken_connection;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body) {[m
[31m-        u->request_bufs = r->request_body->bufs;[m
[31m-    }[m
[31m-[m
[31m-    if (u->create_request(r) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-#if defined(nginx_version) && nginx_version >= 8022[m
[31m-    u->peer.local = u->conf->local;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    u->output.alignment = clcf->directio_alignment;[m
[31m-#endif[m
[31m-[m
[31m-    u->output.pool = r->pool;[m
[31m-    u->output.bufs.num = 1;[m
[31m-    u->output.bufs.size = clcf->client_body_buffer_size;[m
[31m-    u->output.output_filter = ngx_chain_writer;[m
[31m-    u->output.filter_ctx = &u->writer;[m
[31m-[m
[31m-    u->writer.pool = r->pool;[m
[31m-[m
[31m-    if (r->upstream_states == NULL) {[m
[31m-[m
[31m-        r->upstream_states = ngx_array_create(r->pool, 1,[m
[31m-                                           sizeof(ngx_http_upstream_state_t));[m
[31m-        if (r->upstream_states == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        u->state = ngx_array_push(r->upstream_states);[m
[31m-        if (u->state == NULL) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_upstream_dbd_cleanup;[m
[31m-    cln->data = r;[m
[31m-    u->cleanup = &cln->handler;[m
[31m-[m
[31m-    if (u->resolved == NULL) {[m
[31m-[m
[31m-        uscf = u->conf->upstream;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (u->resolved->sockaddr) {[m
[31m-[m
[31m-            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_dbd_connect(r, u);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        host = &u->resolved->host;[m
[31m-[m
[31m-        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-        uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->host.len == host->len[m
[31m-                && ((uscf->port == 0 && u->resolved->no_port)[m
[31m-                     || uscf->port == u->resolved->port)[m
[31m-                && ngx_memcmp(uscf->host.data, host->data, host->len) == 0)[m
[31m-            {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        temp.name = *host;[m
[31m-[m
[31m-        ctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-        if (ctx == NULL) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx == NGX_NO_RESOLVER) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no resolver defined to resolve %V", host);[m
[31m-[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                    NGX_HTTP_BAD_GATEWAY);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        ctx->name = *host;[m
[31m-        ctx->type = NGX_RESOLVE_A;[m
[31m-        ctx->handler = ngx_http_upstream_resolve_handler;[m
[31m-        ctx->data = r;[m
[31m-        ctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-        u->resolved->ctx = ctx;[m
[31m-[m
[31m-        if (ngx_resolve_name(ctx) != NGX_OK) {[m
[31m-            u->resolved->ctx = NULL;[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-#endif[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (uscf->peer.init(r, uscf) != NGX_OK) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_dbd_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-#if !defined(nginx_version) || nginx_version < 1009001[m
[31m-    ngx_time_t        *tp;[m
[31m-#endif[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r->connection->log->action = "connecting to upstream";[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009001[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (u->state && u->state->response_sec) {[m
[31m-        tp = ngx_timeofday();[m
[31m-[m
[31m-        u->state->response_sec = tp->sec - u->state->response_sec;[m
[31m-        u->state->response_msec = tp->msec - u->state->response_msec;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->state = ngx_array_push(r->upstream_states);[m
[31m-    if (u->state == NULL) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009001[m
[31m-[m
[31m-    u->state->response_time = ngx_current_msec;[m
[31m-    u->state->connect_time = (ngx_msec_t) -1;[m
[31m-    u->state->header_time = (ngx_msec_t) -1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    u->state->response_sec = tp->sec;[m
[31m-    u->state->response_msec = tp->msec;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&u->peer);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->peer = u->peer.name;[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN */[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    c->data = r;[m
[31m-[m
[31m-    c->write->handler = ngx_http_upstream_dbd_handler;[m
[31m-    c->read->handler = ngx_http_upstream_dbd_handler;[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_drizzle_wev_handler;[m
[31m-    u->read_event_handler = ngx_http_drizzle_rev_handler;[m
[31m-[m
[31m-    c->sendfile &= r->connection->sendfile;[m
[31m-    u->output.sendfile = c->sendfile;[m
[31m-[m
[31m-    c->pool = r->pool;[m
[31m-    c->log = r->connection->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */[m
[31m-[m
[31m-    u->writer.out = NULL;[m
[31m-    u->writer.last = &u->writer.out;[m
[31m-    u->writer.connection = c;[m
[31m-    u->writer.limit = 0;[m
[31m-[m
[31m-    if (u->request_sent) {[m
[31m-        if (ngx_http_upstream_dbd_reinit(r, u) != NGX_OK) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body[m
[31m-        && r->request_body->buf[m
[31m-        && r->request_body->temp_file[m
[31m-        && r == r->main)[m
[31m-    {[m
[31m-        /*[m
[31m-         * the r->request_body->buf can be reused for one request only,[m
[31m-         * the subrequests should allocate their own temporay bufs[m
[31m-         */[m
[31m-[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = r->request_body->buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-        u->output.allocated = 1;[m
[31m-[m
[31m-        r->request_body->buf->pos = r->request_body->buf->start;[m
[31m-        r->request_body->buf->last = r->request_body->buf->start;[m
[31m-        r->request_body->buf->tag = u->output.tag;[m
[31m-    }[m
[31m-[m
[31m-    u->request_sent = 0;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if 0 /* libdrizzle doesn't support SSL, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_upstream_send_request(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    dd("connection error: %d", c->error);[m
[31m-[m
[31m-    ngx_http_drizzle_set_libdrizzle_ready(r);[m
[31m-[m
[31m-    (void) ngx_http_drizzle_process_events(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_rd_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_dbd_check_broken_connection(r, r->connection->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_wr_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_dbd_check_broken_connection(r, r->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    char                 buf[1];[m
[31m-    ngx_err_t            err;[m
[31m-    ngx_int_t            event;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "http upstream check client, write event:%d, \"%V\"",[m
[31m-                   ev->write, &r->uri);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-            event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-            if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!ev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        if (ev->kq_errno) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                          "kevent() reported that client closed prematurely "[m
[31m-                          "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                      "kevent() reported that client closed "[m
[31m-                      "prematurely connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,[m
[31m-                   "http upstream recv(): %d", n);[m
[31m-[m
[31m-    if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-        event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-        if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->error = 1;[m
[31m-[m
[31m-    } else { /* n == 0 */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev->eof = 1;[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (!u->cacheable && u->peer.connection) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "client closed prematurely connection, "[m
[31m-                      "so upstream connection is closed too");[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                  "client closed prematurely connection");[m
[31m-[m
[31m-    if (u->peer.connection == NULL) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t *r = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup http upstream request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_finalize_request(r, u, NGX_DONE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_log_ctx_t   *ctx;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ctx = c->log->data;[m
[31m-    ctx->current_request = r;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    dd("upstream ev write:%d, ready:%d", (int) ev->write, (int) ev->ready);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        u->write_event_handler(r, u);[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_dbd_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (u->reinit_request(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the request chain */[m
[31m-[m
[31m-    for (cl = u->request_bufs; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->start;[m
[31m-        cl->buf->file_pos = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the subrequest's ngx_output_chain() context */[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file[m
[31m-        && r != r->main && u->output.buf)[m
[31m-    {[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = u->output.buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-[m
[31m-        u->output.buf->pos = u->output.buf->start;[m
[31m-        u->output.buf->last = u->output.buf->start;[m
[31m-    }[m
[31m-[m
[31m-    u->output.buf = NULL;[m
[31m-    u->output.in = NULL;[m
[31m-    u->output.busy = NULL;[m
[31m-[m
[31m-    /* reinit u->buffer */[m
[31m-[m
[31m-    u->buffer.pos = u->buffer.start;[m
[31m-[m
[31m-#if 0 && (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-        u->buffer.pos += r->cache->header_start;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_set_thread_id_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t    *dlcf;[m
[31m-    size_t                          size;[m
[31m-    ngx_http_variable_value_t      *vv;[m
[31m-    uint32_t                        tid;[m
[31m-    drizzle_con_st                 *dc;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t       *dp;[m
[31m-[m
[31m-    dp = r->upstream->peer.data;[m
[31m-    if (dp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dc = dp->drizzle_con;[m
[31m-    if (dc == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tid = drizzle_con_thread_id(dc);[m
[31m-[m
[31m-    dd("tid = %d", (int) tid);[m
[31m-[m
[31m-    if (tid == 0) {[m
[31m-        /* invalid thread id */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    size = ngx_http_drizzle_get_num_size(tid);[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_drizzle_module);[m
[31m-[m
[31m-    vv = ngx_http_get_indexed_variable(r, dlcf->tid_var_index);[m
[31m-[m
[31m-    if (vv == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vv->not_found = 0;[m
[31m-    vv->valid = 1;[m
[31m-    vv->no_cacheable = 0;[m
[31m-[m
[31m-    vv->data = ngx_palloc(r->pool, size);[m
[31m-    if (vv->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vv->len = size;[m
[31m-[m
[31m-    ngx_sprintf(vv->data, "%uD", tid);[m
[31m-[m
[31m-    dd("$drizzle_thread_id set");[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_drizzle_get_num_size(uint64_t i)[m
[31m-{[m
[31m-    size_t          n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        i = i / 10;[m
[31m-        n++;[m
[31m-    } while (i > 0);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_http_drizzle_queue_size(ngx_queue_t *queue)[m
[31m-{[m
[31m-    ngx_queue_t     *q;[m
[31m-    ngx_uint_t       n = 0;[m
[31m-[m
[31m-   for (q = ngx_queue_head(queue);[m
[31m-         q != ngx_queue_sentinel(queue);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        n++;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.h[m
[1mdeleted file mode 100644[m
[1mindex db1f413..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_UTIL_H[m
[31m-#define NGX_HTTP_DRIZZLE_UTIL_H[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#define ngx_http_drizzle_strcmp_const(a, b) \[m
[31m-        ngx_strncmp(a, b, sizeof(b) - 1)[m
[31m-[m
[31m-#ifndef ngx_copy_const_str[m
[31m-#define ngx_copy_const_str(p, s)  ngx_copy(p, s, sizeof(s) - 1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_http_upstream_dbd_init(ngx_http_request_t *r);[m
[31m-void ngx_http_upstream_dbd_init_request(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_drizzle_set_header(ngx_http_request_t *r, ngx_str_t *key,[m
[31m-        ngx_str_t *value);[m
[31m-void ngx_http_upstream_drizzle_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc);[m
[31m-void ngx_http_upstream_drizzle_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc);[m
[31m-ngx_int_t ngx_http_upstream_drizzle_test_connect(ngx_connection_t *c);[m
[31m-ngx_int_t ngx_http_drizzle_set_thread_id_variable(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u);[m
[31m-ngx_uint_t ngx_http_drizzle_queue_size(ngx_queue_t *queue);[m
[31m-size_t ngx_http_drizzle_get_num_size(uint64_t i);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_drizzle_nelems(x) (sizeof(x) / sizeof(x[0]))[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_UTIL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/resty_dbd_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/resty_dbd_stream.h[m
[1mdeleted file mode 100644[m
[1mindex 84d7157..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/src/resty_dbd_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-#ifndef RESTY_DBD_STREAME_H[m
[31m-#define RESTY_DBD_STREAME_H[m
[31m-[m
[31m-#define resty_dbd_stream_version 3[m
[31m-#define resty_dbd_stream_version_string \[m
[31m-    "0.0.3"[m
[31m-[m
[31m-#define rds_content_type \[m
[31m-    "application/x-resty-dbd-stream"[m
[31m-[m
[31m-#define rds_content_type_len \[m
[31m-    (sizeof(rds_content_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_rough_col_type_int = 0 << 14,[m
[31m-    rds_rough_col_type_float = 1 << 14,[m
[31m-    rds_rough_col_type_str = 2 << 14,[m
[31m-    rds_rough_col_type_bool = 3 << 14[m
[31m-[m
[31m-} rds_rough_col_type_t;[m
[31m-[m
[31m-[m
[31m-/* The following types (or spellings thereof) are specified[m
[31m- * by SQL:[m
[31m- * bigint, bit, bit varying, boolean, char, character varying,[m
[31m- * character, varchar, date, double precision, integer,[m
[31m- * interval, numeric, decimal, real, smallint,[m
[31m- * time (with or without time zone),[m
[31m- * timestamp (with or without time zone), xml */[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_col_type_unknown = 0 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bigint = 1 | rds_rough_col_type_int,[m
[31m-    rds_col_type_bit = 2 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bit_varying = 3 | rds_rough_col_type_str,[m
[31m-[m
[31m-    rds_col_type_bool = 4 | rds_rough_col_type_bool,[m
[31m-    rds_col_type_char = 5 | rds_rough_col_type_str,[m
[31m-    rds_col_type_varchar = 6 | rds_rough_col_type_str,[m
[31m-    rds_col_type_date = 7 | rds_rough_col_type_str,[m
[31m-    rds_col_type_double = 8 | rds_rough_col_type_float,[m
[31m-    rds_col_type_integer = 9 | rds_rough_col_type_int,[m
[31m-    rds_col_type_interval = 10 | rds_rough_col_type_float,[m
[31m-    rds_col_type_decimal = 11 | rds_rough_col_type_float,[m
[31m-    rds_col_type_real = 12 | rds_rough_col_type_float,[m
[31m-    rds_col_type_smallint = 13 | rds_rough_col_type_int,[m
[31m-    rds_col_type_time_with_time_zone = 14 | rds_rough_col_type_str,[m
[31m-    rds_col_type_time = 15 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp_with_time_zone = 16 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp = 17 | rds_rough_col_type_str,[m
[31m-    rds_col_type_xml = 18 | rds_rough_col_type_str,[m
[31m-[m
[31m-    /* our additions */[m
[31m-    rds_col_type_blob = 19 | rds_rough_col_type_str[m
[31m-[m
[31m-} rds_col_type_t;[m
[31m-[m
[31m-#endif /* RESTY_DBD_STREAME_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex c4a2328..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-no_shuffle();[m
[31m-#log_level 'warn';[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex bb6ebb9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: two locations[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m-    location /mysql2 {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 410[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 5[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex c4ddff7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,81 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/errors.t[m
[1mdeleted file mode 100644[m
[1mindex 478c0d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 410[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: wrong credentials[m
[31m-little-endian systems only[m
[31m-[m
[31m---- timeout: 5[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT dbname=test[m
[31m-             password=wrong_pass user=monty protocol=mysql[m
[31m-             charset=utf8;[m
[31m-        drizzle_keepalive mode=single max=2 overflow=reject;[m
[31m-    }[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 502[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no database[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server 127.0.0.1:1 dbname=test[m
[31m-             password=some_pass user=monty protocol=mysql[m
[31m-             charset=utf8;[m
[31m-        drizzle_keepalive mode=single max=2 overflow=reject;[m
[31m-    }[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 502[m
[31m---- timeout: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple queries[m
[31m-little-endian systems only[m
[31m-[m
[31m---- timeout: 5[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select * from cats; select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: missing query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: empty query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        set $query "";[m
[31m-        drizzle_query $query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend "";[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=blah-blah;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex c1d3fe9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,417 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 6;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-        drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: variables in drizzle_pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $foo backend;[m
[31m-        drizzle_pass $foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (using little bufs, size 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sanity (using little bufs, size 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sanity (using little bufs, size 3)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 3;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/methods.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/methods.t[m
[1mdeleted file mode 100644[m
[1mindex bfee44b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/methods.t[m
[1m+++ /dev/null[m
[36m@@ -1,359 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 2 * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: method-specific query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select 'GET' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: method-specific complex query (check 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: method-specific complex query (check 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-LOCK /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{04}\x{00}\x{00}\x{00}".  # field len[m
[31m-"LOCK".          # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: method-specific complex query (using not allowed method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /mysql[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: method-specific query and default query (using defined method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: method-specific query and default query (using other method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: inheritance[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_query      "select 'default' as echo";[m
[31m-    drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inheritance (mixed, not inherited)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_query      "select 'default' as echo";[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /mysql[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: default query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-PATCH /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{05}\x{00}\x{00}\x{00}".  # field len[m
[31m-"PATCH".         # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.41[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 64040b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,418 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 6;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-        #drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: variables in drizzle_pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $foo backend;[m
[31m-        drizzle_pass $foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (using little bufs, size 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sanity (using little bufs, size 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sanity (using little bufs, size 3)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 3;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/timeout.t[m
[1mdeleted file mode 100644[m
[1mindex d458de5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/charset/timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks() * 2;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server www.taobao.com:1234;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-#log_level('error');[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: loc_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_connect_timeout 3;[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: serv_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_connect_timeout 10ms;[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: serv_config connect timeout[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    #drizzle_connect_timeout 1;[m
[31m-    drizzle_send_query_timeout 10ms;[m
[31m-    #drizzle_recv_cols_timeout 10ms;[m
[31m-    #drizzle_recv_rows_timeout 10ms;[m
[31m-[m
[31m-    location /upstream {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select sql_no_cache * from cats as a, cats as b, cats as c, cats as d, cats as e, cats as f, cats as g, cats as h, cats as i, cats as j order by a.id, b.id, c.id, d.id';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 1[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/errors.t[m
[1mdeleted file mode 100644[m
[1mindex e102d50..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,176 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 410[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: wrong credentials[m
[31m-little-endian systems only[m
[31m-[m
[31m---- timeout: 5[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT dbname=test[m
[31m-             password=wrong_pass user=monty protocol=mysql;[m
[31m-        drizzle_keepalive mode=single max=2 overflow=reject;[m
[31m-    }[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 502[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no database[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server 127.0.0.1:1 dbname=test[m
[31m-             password=some_pass user=monty protocol=mysql;[m
[31m-        drizzle_keepalive mode=single max=2 overflow=reject;[m
[31m-    }[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 502[m
[31m---- timeout: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple queries[m
[31m-little-endian systems only[m
[31m-[m
[31m---- timeout: 5[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select * from cats; select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: missing query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: empty query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        set $query "";[m
[31m-        drizzle_query $query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend "";[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend "not-exist";[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex b377536..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,452 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks() + 12);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-#master_on();[m
[31m-#log_level('warn');[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: variables in drizzle_pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $foo backend;[m
[31m-        drizzle_pass $foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (using little bufs, size 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sanity (using little bufs, size 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sanity (using little bufs, size 3)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 3;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/methods.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/methods.t[m
[1mdeleted file mode 100644[m
[1mindex 76cd593..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/methods.t[m
[1m+++ /dev/null[m
[36m@@ -1,358 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 26;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: method-specific query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select 'GET' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: method-specific complex query (check 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: method-specific complex query (check 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-LOCK /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{04}\x{00}\x{00}\x{00}".  # field len[m
[31m-"LOCK".          # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: method-specific complex query (using not allowed method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /mysql[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: method-specific query and default query (using defined method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: method-specific query and default query (using other method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: inheritance[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_query      "select 'default' as echo";[m
[31m-    drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inheritance (mixed, not inherited)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_query      "select 'default' as echo";[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /mysql[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: default query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-PATCH /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{05}\x{00}\x{00}\x{00}".  # field len[m
[31m-"PATCH".         # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.41[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex a1d6ba8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,419 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 6;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        #drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-#master_on();[m
[31m-#log_level('warn');[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: variables in drizzle_pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $foo backend;[m
[31m-        drizzle_pass $foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (using little bufs, size 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sanity (using little bufs, size 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sanity (using little bufs, size 3)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 3;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/status.t[m
[1mdeleted file mode 100644[m
[1mindex 9572f56..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/status.t[m
[1m+++ /dev/null[m
[36m@@ -1,297 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-#master_on();[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=10 overflow=reject mode=single;[m
[31m-    }[m
[31m-    upstream backend2 {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        #drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:80;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $http_config2 = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=10 overflow=reject mode=single;[m
[31m-    }[m
[31m-    upstream backend2 {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=5 overflow=ignore mode=multi;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /status[m
[31m---- response_body[m
[31m-upstream backend[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 0[m
[31m-  free'd connection queue: 10[m
[31m-  cached connection successfully used count:[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: single mode and no pools[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location @my_err {[m
[31m-        echo "500 Internal Server Error";[m
[31m-    }[m
[31m-    location ~ ^/mysql(2?)$ {[m
[31m-        drizzle_query "select sum(1) from $args";[m
[31m-        drizzle_pass backend$1;[m
[31m-        error_page 500 = @my_err;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-[m
[31m-        echo_location /mysql2 cats;[m
[31m-        echo_location /mysql2 cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 3[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 3[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: single & multi mode pools[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location @my_err {[m
[31m-        echo "500 Internal Server Error";[m
[31m-    }[m
[31m-    location ~ ^/mysql(2?)$ {[m
[31m-        drizzle_query "select sum(1) from $args";[m
[31m-        drizzle_pass backend$1;[m
[31m-        error_page 500 = @my_err;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-[m
[31m-        echo_location /mysql2 cats;[m
[31m-        echo_location /mysql2 cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 3[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 5[m
[31m-  overflow: ignore[m
[31m-  cached connection queue: 0[m
[31m-  free'd connection queue: 5[m
[31m-  cached connection successfully used count:[m
[31m-  free'd connection successfully used count: 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 3[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 5[m
[31m-  overflow: ignore[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 4[m
[31m-  cached connection successfully used count: 2[m
[31m-  free'd connection successfully used count: 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: single mode and bad request[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location @my_err {[m
[31m-        echo "500 Internal Server Error";[m
[31m-    }[m
[31m-    location ~ ^/mysql(2?)$ {[m
[31m-        drizzle_query "select sum(1) from $args";[m
[31m-        drizzle_pass backend$1;[m
[31m-        error_page 500 = @my_err;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql select;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][{"sum(1)":2}]500 Internal Server Error[m
[31m-[m
[31m-upstream backend[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 0[m
[31m-  free'd connection queue: 10[m
[31m-  cached connection successfully used count:[m
[31m-  free'd connection successfully used count: 3 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 2[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/timeout.t[m
[1mdeleted file mode 100644[m
[1mindex e6aae6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/t/timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,158 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server www.taobao.com:1234;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-#log_level('error');[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: loc_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_connect_timeout 3;[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: serv_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_connect_timeout 10ms;[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: serv_config send query timeout (busy select)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    #drizzle_connect_timeout 1;[m
[31m-    drizzle_send_query_timeout 10ms;[m
[31m-    #drizzle_recv_cols_timeout 10ms;[m
[31m-    #drizzle_recv_rows_timeout 10ms;[m
[31m-[m
[31m-    location /upstream {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select sql_no_cache * from cats as a, cats as b, cats as c, cats as d, cats as e, cats as f, cats as g, cats as h, cats as i, cats as j order by a.id, b.id, c.id, d.id';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 1[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: loc_config connect timeout (empty $drizzle_thread_id)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-        more_set_headers -s 504 'X-Mysql-Tid: $drizzle_thread_id';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- response_headers[m
[31m-X-Mysql-Tid:[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: serv_config send query timeout (sleep select)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    #drizzle_connect_timeout 1;[m
[31m-    drizzle_send_query_timeout 80ms;[m
[31m-    #drizzle_recv_cols_timeout 10ms;[m
[31m-    #drizzle_recv_rows_timeout 10ms;[m
[31m-[m
[31m-    location /upstream {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select sql_no_cache sleep(1);';[m
[31m-        more_set_headers -s 504 "X-Mysql-Tid: $drizzle_thread_id";[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 1[m
[31m---- response_headers_like[m
[31m-X-Mysql-Tid: \d+[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex aa79e7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --with-ld-opt="-Wl,-rpath,$LIBDRIZZLE_LIB:$LUAJIT_LIB" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root/../rds-json-nginx-module \[m
[31m-          --add-module=$root/../headers-more-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-          --with-debug[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$home/work/nginx_eval_module-1.0.1 \[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/ngx-links b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/ngx-links[m
[1mdeleted file mode 100755[m
[1mindex bf54f46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/ngx-links[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use Cwd qw( cwd );[m
[31m-use Getopt::Std;[m
[31m-[m
[31m-my %opts;[m
[31m-getopts('f', \%opts) or[m
[31m-    die "Usage: $0 [-f][m
[31m-Options:[m
[31m-    -f          Override exising symbolic links with force[m
[31m-";[m
[31m-[m
[31m-my $root = shift || 'src';[m
[31m-[m
[31m-my $force = $opts{f};[m
[31m-[m
[31m-opendir my $dir, $root[m
[31m-    or die "Can't open directory src/ for reading: $!\n";[m
[31m-[m
[31m-my @links;[m
[31m-[m
[31m-while (my $entry = readdir $dir) {[m
[31m-    my ($base, $ext);[m
[31m-[m
[31m-    my $source = "$root/$entry";[m
[31m-[m
[31m-    if (-l $source || -d $source) {[m
[31m-        warn "skipping $source\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if ($entry =~ m{ ^ ngx_ (?: \w+ _ )+ (\w+) \. ([ch]|rl) $}x) {[m
[31m-        ($base, $ext) = ($1, $2);[m
[31m-    } else {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    my $target = "$root/$base.$ext";[m
[31m-    if (-e $target && ! -l $target) {[m
[31m-        die "target $target already exists, and not a symlink, not overriding...Abort.\n";[m
[31m-    } elsif (-l $target) {[m
[31m-        #warn "it's a link";[m
[31m-        if ( ! $force ) {[m
[31m-            die "target $target already exists, not overriding...Abort.\n";[m
[31m-        }[m
[31m-        warn "overriding existing symlink $target\n";[m
[31m-    }[m
[31m-    #warn "creating $target --> $root/$entry\n";[m
[31m-    system("ln -svf `pwd`/$source $target") == 0 or[m
[31m-        die "Failed to create the symlink\n";;[m
[31m-[m
[31m-    push @links, $target;[m
[31m-}[m
[31m-[m
[31m-print join("\n", @links), "\n";[m
[31m-[m
[31m-close $dir;[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 2785d57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/drizzle-nginx-module-0.1.9/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,264 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   create_pool_posix_memalign[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_ssi_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex a9948e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-reindex[m
[31m-src/location.h[m
[31m-src/filter.c[m
[31m-src/subrequest.h[m
[31m-src/sleep.h[m
[31m-src/util.c[m
[31m-src/echo.c[m
[31m-src/info.c[m
[31m-src/util.h[m
[31m-src/var.h[m
[31m-src/filter.h[m
[31m-src/sleep.c[m
[31m-src/var.c[m
[31m-src/timer.c[m
[31m-src/module.h[m
[31m-src/echo.h[m
[31m-src/info.h[m
[31m-src/foreach.c[m
[31m-src/location.c[m
[31m-src/timer.h[m
[31m-src/module.c[m
[31m-src/subrequest.c[m
[31m-src/handler.h[m
[31m-src/foreach.h[m
[31m-src/handler.c[m
[31m-nginx[m
[31m-*.html[m
[31m-ctags[m
[31m-t/servroot[m
[31m-all[m
[31m-buildroot/[m
[31m-go[m
[31m-Changes[m
[31m-build1[0-9][m
[31m-analyze[m
[31m-Makefile[m
[31m-*.plist[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex ec95f91..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - LUAJIT_LIB=/usr/lib64/libluajit-5.1.so[m
[31m-    - LUAJIT_INC=/usr/include/luajit-2.0[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-    - NGINX_VERSION=1.10.0[m
[31m-[m
[31m-before_install:[m
[31m-  - sudo apt-get install -qq -y cpanminus libluajit-5.1-dev libgd-dev[m
[31m-  - sudo cpanm -v --notest Test::Nginx > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-[m
[31m-install:[m
[31m-  - wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && tar -xzf nginx-${NGINX_VERSION}.tar.gz[m
[31m-  - git clone https://github.com/simpl/ngx_devel_kit.git[m
[31m-  - git clone https://github.com/openresty/set-misc-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/xss-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/rds-json-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/headers-more-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/lua-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/nginx-eval-module.git[m
[31m-[m
[31m-script:[m
[31m-  - cd nginx-${NGINX_VERSION}/[m
[31m-  -  ./configure --without-http_ssi_module --with-debug --with-select_module --with-poll_module --with-http_stub_status_module --with-http_image_filter_module --add-module=../ngx_devel_kit --add-module=../set-misc-nginx-module --add-module=../nginx-eval-module --add-module=../xss-nginx-module --add-module=../rds-json-nginx-module --add-module=../headers-more-nginx-module --add-module=../lua-nginx-module  --add-module=.. > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j2 > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - export PATH=$PATH:`pwd`/objs[m
[31m-  - cd ..[m
[31m-  - prove -r t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 6feffbf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-Copyright (C) 2009-2014, Yichun "agentzh" Zhang <agentzh@gmail.com>.[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-    * Redistributions of source code must retain the above copyright[m
[31m-    notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-    * Redistributions in binary form must reproduce the above copyright[m
[31m-    notice, this list of conditions and the following disclaimer in the[m
[31m-    documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/config[m
[1mdeleted file mode 100644[m
[1mindex 32b54bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/config[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_echo_module[m
[31m-[m
[31m-ECHO_SRCS="                                                                 \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_module.c                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_util.c                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_timer.c                            \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_var.c                              \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_handler.c                          \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_filter.c                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_sleep.c                            \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_location.c                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_echo.c                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_request_info.c                     \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_subrequest.c                       \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_foreach.c                          \[m
[31m-        "[m
[31m-[m
[31m-ECHO_DEPS="                                                                 \[m
[31m-        $ngx_addon_dir/src/ddebug.h                                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_module.h                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_handler.h                          \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_util.h                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_sleep.h                            \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_filter.h                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_var.h                              \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_location.h                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_echo.h                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_request_info.h                     \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_subrequest.h                       \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_foreach.h                          \[m
[31m-        "[m
[31m-[m
[31m-# nginx won't have HTTP_POSTPONE_FILTER_MODULE & HTTP_POSTPONE_FILTER_SRCS[m
[31m-# defined since 1.9.11[m
[31m-if test -z "$HTTP_POSTPONE_FILTER_MODULE"; then[m
[31m-    HTTP_POSTPONE_FILTER_MODULE=ngx_http_postpone_filter_module[m
[31m-    HTTP_POSTPONE_FILTER_SRCS=src/http/ngx_http_postpone_filter_module.c[m
[31m-fi[m
[31m-[m
[31m-# This module depends upon the postpone filter being activated[m
[31m-if [ $HTTP_POSTPONE != YES ]; then[m
[31m-    HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_POSTPONE_FILTER_MODULE"[m
[31m-    HTTP_SRCS="$HTTP_SRCS $HTTP_POSTPONE_FILTER_SRCS"[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$ECHO_DEPS"[m
[31m-    ngx_module_srcs="$ECHO_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ECHO_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ECHO_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 73400dd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "echo *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-static void ngx_inline[m
[31m-dd_enter_helper(ngx_http_request_t *r, const char *func) {[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, ">enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            0/*(int) r->main->count*/, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_echo.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_echo.c[m
[1mdeleted file mode 100644[m
[1mindex f5789f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_echo.c[m
[1m+++ /dev/null[m
[36m@@ -1,342 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_echo.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_filter.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-static ngx_buf_t ngx_http_echo_space_buf;[m
[31m-[m
[31m-static ngx_buf_t ngx_http_echo_newline_buf;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_echo_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    static u_char space_str[]   = " ";[m
[31m-    static u_char newline_str[] = "\n";[m
[31m-[m
[31m-    dd("global init...");[m
[31m-[m
[31m-    ngx_memzero(&ngx_http_echo_space_buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    ngx_http_echo_space_buf.memory = 1;[m
[31m-[m
[31m-    ngx_http_echo_space_buf.start =[m
[31m-        ngx_http_echo_space_buf.pos =[m
[31m-            space_str;[m
[31m-[m
[31m-    ngx_http_echo_space_buf.end =[m
[31m-        ngx_http_echo_space_buf.last =[m
[31m-            space_str + sizeof(space_str) - 1;[m
[31m-[m
[31m-    ngx_memzero(&ngx_http_echo_newline_buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    ngx_http_echo_newline_buf.memory = 1;[m
[31m-[m
[31m-    ngx_http_echo_newline_buf.start =[m
[31m-        ngx_http_echo_newline_buf.pos =[m
[31m-            newline_str;[m
[31m-[m
[31m-    ngx_http_echo_newline_buf.end =[m
[31m-        ngx_http_echo_newline_buf.last =[m
[31m-            newline_str + sizeof(newline_str) - 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_sync(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t                   *buf;[m
[31m-    ngx_chain_t                 *cl = NULL; /* the head of the chain link */[m
[31m-[m
[31m-    buf = ngx_calloc_buf(r->pool);[m
[31m-    if (buf == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf->sync = 1;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf  = buf;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, cl);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args,[m
[31m-    ngx_flag_t in_filter, ngx_array_t *opts)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-[m
[31m-    ngx_buf_t                   *space_buf;[m
[31m-    ngx_buf_t                   *newline_buf;[m
[31m-    ngx_buf_t                   *buf;[m
[31m-[m
[31m-    ngx_str_t                   *computed_arg;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_str_t                   *opt;[m
[31m-[m
[31m-    ngx_chain_t *cl  = NULL; /* the head of the chain link */[m
[31m-    ngx_chain_t **ll = &cl;  /* always point to the address of the last link */[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (computed_args == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-    for (i = 0; i < computed_args->nelts; i++) {[m
[31m-        computed_arg = &computed_arg_elts[i];[m
[31m-[m
[31m-        if (computed_arg->len == 0) {[m
[31m-            buf = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            buf = ngx_calloc_buf(r->pool);[m
[31m-            if (buf == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            buf->start = buf->pos = computed_arg->data;[m
[31m-            buf->last = buf->end = computed_arg->data +[m
[31m-                computed_arg->len;[m
[31m-[m
[31m-            buf->memory = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl == NULL) {[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-            cl->buf  = buf;[m
[31m-            cl->next = NULL;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-        } else {[m
[31m-            /* append a space first */[m
[31m-            *ll = ngx_alloc_chain_link(r->pool);[m
[31m-[m
[31m-            if (*ll == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            space_buf = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-            if (space_buf == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* nginx clears buf flags at the end of each request handling,[m
[31m-             * so we have to make a clone here. */[m
[31m-            *space_buf = ngx_http_echo_space_buf;[m
[31m-[m
[31m-            (*ll)->buf = space_buf;[m
[31m-            (*ll)->next = NULL;[m
[31m-[m
[31m-            ll = &(*ll)->next;[m
[31m-[m
[31m-            /* then append the buf only if it's non-empty */[m
[31m-            if (buf) {[m
[31m-                *ll = ngx_alloc_chain_link(r->pool);[m
[31m-                if (*ll == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-                (*ll)->buf  = buf;[m
[31m-                (*ll)->next = NULL;[m
[31m-[m
[31m-                ll = &(*ll)->next;[m
[31m-            }[m
[31m-        }[m
[31m-    } /* end for */[m
[31m-[m
[31m-    if (cl && cl->buf == NULL) {[m
[31m-        cl = cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (opts && opts->nelts > 0) {[m
[31m-        opt = opts->elts;[m
[31m-        /* FIXME handle other unrecognized options here */[m
[31m-        if (opt[0].len == 1 && opt[0].data[0] == 'n') {[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* append the newline character */[m
[31m-[m
[31m-    newline_buf = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-    if (newline_buf == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *newline_buf = ngx_http_echo_newline_buf;[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = newline_buf;[m
[31m-        cl->next = NULL;[m
[31m-        /* ll = &cl->next; */[m
[31m-[m
[31m-    } else {[m
[31m-        *ll = ngx_alloc_chain_link(r->pool);[m
[31m-[m
[31m-        if (*ll == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (*ll)->buf  = newline_buf;[m
[31m-        (*ll)->next = NULL;[m
[31m-        /* ll = &(*ll)->next; */[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (cl == NULL || cl->buf == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (in_filter) {[m
[31m-        return ngx_http_echo_next_body_filter(r, cl);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, cl);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_flush(ngx_http_request_t *r, ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    return ngx_http_send_special(r, NGX_HTTP_FLUSH);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t       *b;[m
[31m-    ngx_chain_t     *out, *cl, **ll;[m
[31m-[m
[31m-    if (r->request_body == NULL || r->request_body->bufs == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-        if (ngx_buf_special(cl->buf)) {[m
[31m-            /* we do not want to create zero-size bufs */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *ll = ngx_alloc_chain_link(r->pool);[m
[31m-        if (*ll == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_alloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (*ll)->buf = b;[m
[31m-        (*ll)->next = NULL;[m
[31m-[m
[31m-        ngx_memcpy(b, cl->buf, sizeof(ngx_buf_t));[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_echo_exec_echo_request_body;[m
[31m-        b->last_buf = 0;[m
[31m-        b->last_in_chain = 0;[m
[31m-[m
[31m-        ll = &(*ll)->next;[m
[31m-    }[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_duplicate(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_str_t                   *computed_arg;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ssize_t                      i, count;[m
[31m-    ngx_str_t                   *str;[m
[31m-    u_char                      *p;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_buf_t                   *buf;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-[m
[31m-    computed_arg = &computed_arg_elts[0];[m
[31m-[m
[31m-    count = ngx_http_echo_atosz(computed_arg->data, computed_arg->len);[m
[31m-[m
[31m-    if (count == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid size specified: \"%V\"", computed_arg);[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    str = &computed_arg_elts[1];[m
[31m-[m
[31m-    if (count == 0 || str->len == 0) {[m
[31m-        rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_create_temp_buf(r->pool, count * str->len);[m
[31m-    if (buf == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = buf->pos;[m
[31m-    for (i = 0; i < count; i++) {[m
[31m-        p = ngx_copy(p, str->data, str->len);[m
[31m-    }[m
[31m-    buf->last = p;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-    cl->next = NULL;[m
[31m-    cl->buf = buf;[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, cl);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_echo.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_echo.h[m
[1mdeleted file mode 100644[m
[1mindex 896f1ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_echo.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-#ifndef ECHO_ECHO_H[m
[31m-#define ECHO_ECHO_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_echo_init(ngx_conf_t *cf);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_sync(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args,[m
[31m-        ngx_flag_t in_filter, ngx_array_t *opts);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_request_body(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_flush(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_duplicate(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-#endif /* ECHO_ECHO_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_filter.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_filter.c[m
[1mdeleted file mode 100644[m
[1mindex 689b52e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_filter.c[m
[1m+++ /dev/null[m
[36m@@ -1,282 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_filter.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_echo.h"[m
[31m-[m
[31m-#include <ngx_log.h>[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt ngx_http_echo_next_header_filter;[m
[31m-[m
[31m-ngx_http_output_body_filter_pt ngx_http_echo_next_body_filter;[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_header_filter(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_body_filter(ngx_http_request_t *r,[m
[31m-        ngx_chain_t *in);[m
[31m-[m
[31m-/* filter handlers */[m
[31m-static ngx_int_t ngx_http_echo_exec_filter_cmds(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *cmds, ngx_uint_t *iterator);[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_echo_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                              multi_http_blocks;[m
[31m-    ngx_http_echo_main_conf_t       *emcf;[m
[31m-[m
[31m-    emcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ngx_http_echo_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_echo_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || emcf->requires_filter) {[m
[31m-        dd("top header filter: %ld",[m
[31m-           (unsigned long) ngx_http_top_header_filter);[m
[31m-[m
[31m-        ngx_http_echo_next_header_filter = ngx_http_top_header_filter;[m
[31m-        ngx_http_top_header_filter = ngx_http_echo_header_filter;[m
[31m-[m
[31m-        dd("top body filter: %ld", (unsigned long) ngx_http_top_body_filter);[m
[31m-[m
[31m-        ngx_http_echo_next_body_filter = ngx_http_top_body_filter;[m
[31m-        ngx_http_top_body_filter  = ngx_http_echo_body_filter;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t    *conf;[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "echo header filter, uri \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    /* XXX we should add option to insert contents for responses[m
[31m-     * of non-200 status code here... */[m
[31m-    /*[m
[31m-    if (r->headers_out.status != NGX_HTTP_OK) {[m
[31m-        if (ctx != NULL) {[m
[31m-            ctx->skip_filter = 1;[m
[31m-        }[m
[31m-        return ngx_http_echo_next_header_filter(r);[m
[31m-    }[m
[31m-    */[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-    if (conf->before_body_cmds == NULL && conf->after_body_cmds == NULL) {[m
[31m-        if (ctx != NULL) {[m
[31m-            ctx->skip_filter = 1;[m
[31m-        }[m
[31m-        return ngx_http_echo_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_echo_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_echo_module);[m
[31m-    }[m
[31m-[m
[31m-    /* enable streaming here (use chunked encoding) */[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-    return ngx_http_echo_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_echo_loc_conf_t    *conf;[m
[31m-    unsigned                     last;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_buf_t                   *b;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "echo body filter, uri \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (in == NULL || r->header_only) {[m
[31m-        return ngx_http_echo_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->skip_filter) {[m
[31m-        return ngx_http_echo_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (!ctx->before_body_sent) {[m
[31m-        ctx->before_body_sent = 1;[m
[31m-[m
[31m-        if (conf->before_body_cmds != NULL) {[m
[31m-            rc = ngx_http_echo_exec_filter_cmds(r, ctx, conf->before_body_cmds,[m
[31m-                                                &ctx->next_before_body_cmd);[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->after_body_cmds == NULL) {[m
[31m-        ctx->skip_filter = 1;[m
[31m-        return ngx_http_echo_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        dd("cl %p, special %d", cl, ngx_buf_special(cl->buf));[m
[31m-[m
[31m-        if (cl->buf->last_buf || cl->buf->last_in_chain) {[m
[31m-            cl->buf->last_buf = 0;[m
[31m-            cl->buf->last_in_chain = 0;[m
[31m-            cl->buf->sync = 1;[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("in %p, last %d", in, (int) last);[m
[31m-[m
[31m-    if (in) {[m
[31m-        rc = ngx_http_echo_next_body_filter(r, in);[m
[31m-[m
[31m-#if 0[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        dd("next filter returns %d, last %d", (int) rc, (int) last);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK || !last) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("exec filter cmds for after body cmds");[m
[31m-[m
[31m-    rc = ngx_http_echo_exec_filter_cmds(r, ctx, conf->after_body_cmds,[m
[31m-                                        &ctx->next_after_body_cmd);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        dd("FAILED: exec filter cmds for after body cmds");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->skip_filter = 1;[m
[31m-[m
[31m-    dd("after body cmds executed...terminating...");[m
[31m-[m
[31m-    /* XXX we can NOT use[m
[31m-     * ngx_http_send_special(r, NGX_HTTP_LAST) here[m
[31m-     * because we should bypass the upstream filters. */[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main && !r->post_action) {[m
[31m-        b->last_buf = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        b->sync = 1;[m
[31m-        b->last_in_chain = 1;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    return ngx_http_echo_next_body_filter(r, cl);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_exec_filter_cmds(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *cmds, ngx_uint_t *iterator)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_array_t                 *opts = NULL;[m
[31m-    ngx_array_t                 *computed_args = NULL;[m
[31m-    ngx_http_echo_cmd_t         *cmd;[m
[31m-    ngx_http_echo_cmd_t         *cmd_elts;[m
[31m-[m
[31m-    for (cmd_elts = cmds->elts; *iterator < cmds->nelts; (*iterator)++) {[m
[31m-        cmd = &cmd_elts[*iterator];[m
[31m-[m
[31m-        /* evaluate arguments for the current cmd (if any) */[m
[31m-        if (cmd->args) {[m
[31m-            computed_args = ngx_array_create(r->pool, cmd->args->nelts,[m
[31m-                                             sizeof(ngx_str_t));[m
[31m-            if (computed_args == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            opts = ngx_array_create(r->pool, 1, sizeof(ngx_str_t));[m
[31m-            if (opts == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_echo_eval_cmd_args(r, cmd, computed_args, opts);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "Failed to evaluate arguments for "[m
[31m-                              "the directive.");[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* do command dispatch based on the opcode */[m
[31m-        switch (cmd->opcode) {[m
[31m-        case echo_opcode_echo_before_body:[m
[31m-        case echo_opcode_echo_after_body:[m
[31m-            dd("exec echo_before_body or echo_after_body...");[m
[31m-[m
[31m-            rc = ngx_http_echo_exec_echo(r, ctx, computed_args,[m
[31m-                                         1 /* in filter */, opts);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        default:[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_filter.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_filter.h[m
[1mdeleted file mode 100644[m
[1mindex ea5115d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_filter.h[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-#ifndef ECHO_FILTER_H[m
[31m-#define ECHO_FILTER_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt ngx_http_echo_next_header_filter;[m
[31m-[m
[31m-extern ngx_http_output_body_filter_pt ngx_http_echo_next_body_filter;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_filter_init (ngx_conf_t *cf);[m
[31m-[m
[31m-#endif /* ECHO_FILTER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_foreach.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_foreach.c[m
[1mdeleted file mode 100644[m
[1mindex a4a2b54..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_foreach.c[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_foreach.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_it_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_array_t                 *choices;[m
[31m-    ngx_str_t                   *choice_elts, *choice;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx && ctx->foreach != NULL) {[m
[31m-[m
[31m-        choices = ctx->foreach->choices;[m
[31m-        i = ctx->foreach->next_choice;[m
[31m-[m
[31m-        if (i < choices->nelts) {[m
[31m-            choice_elts = choices->elts;[m
[31m-            choice = &choice_elts[i];[m
[31m-[m
[31m-            v->len = choice->len;[m
[31m-            v->data = choice->data;[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 1;[m
[31m-            v->not_found = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_foreach_split(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t    *elcf;[m
[31m-    ngx_str_t                   *delimiter, *compound;[m
[31m-    u_char                      *pos, *last, *end;[m
[31m-    ngx_str_t                   *choice;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_array_t                 *cmds;[m
[31m-    ngx_http_echo_cmd_t         *cmd;[m
[31m-    ngx_http_echo_cmd_t         *cmd_elts;[m
[31m-[m
[31m-    if (ctx->foreach != NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "Nested echo_foreach not supported yet.");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (computed_args->nelts < 2) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "echo_foreach should take at least two arguments. "[m
[31m-                      "(if your delimiter starts with \"-\", preceding it "[m
[31m-                      "with a \"--\".)");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-[m
[31m-    compound  = &computed_arg_elts[1];[m
[31m-[m
[31m-    dd("HEY coumpound len: %u", (int) compound->len);[m
[31m-[m
[31m-    ctx->foreach = ngx_palloc(r->pool, sizeof(ngx_http_echo_foreach_ctx_t));[m
[31m-[m
[31m-    if (ctx->foreach == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->foreach->cmd_index = ctx->next_handler_cmd;[m
[31m-[m
[31m-    ctx->foreach->next_choice = 0;[m
[31m-[m
[31m-    ctx->foreach->choices = ngx_array_create(r->pool, 10, sizeof(ngx_str_t));[m
[31m-    if (ctx->foreach->choices == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    delimiter = &computed_arg_elts[0];[m
[31m-[m
[31m-    pos = compound->data;[m
[31m-    end = compound->data + compound->len;[m
[31m-[m
[31m-    while ((last = ngx_http_echo_strlstrn(pos, end, delimiter->data,[m
[31m-                                          delimiter->len - 1)) != NULL)[m
[31m-    {[m
[31m-        dd("entered the loop");[m
[31m-[m
[31m-        if (last == pos) {[m
[31m-            dd("!!! len == 0");[m
[31m-            pos = last + delimiter->len;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        choice = ngx_array_push(ctx->foreach->choices);[m
[31m-        if (choice == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        choice->data = pos;[m
[31m-        choice->len  = last - pos;[m
[31m-        pos = last + delimiter->len;[m
[31m-    }[m
[31m-[m
[31m-    if (pos < end) {[m
[31m-        choice = ngx_array_push(ctx->foreach->choices);[m
[31m-        if (choice == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        choice->data = pos;[m
[31m-        choice->len  = end - pos;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->foreach->choices->nelts == 0) {[m
[31m-        /* skip the foreach body entirely */[m
[31m-        elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-        cmds = elcf->handler_cmds;[m
[31m-        cmd_elts = cmds->elts;[m
[31m-        for (/* void */; ctx->next_handler_cmd < cmds->nelts;[m
[31m-             ctx->next_handler_cmd++)[m
[31m-        {[m
[31m-            cmd = &cmd_elts[ctx->next_handler_cmd + 1];[m
[31m-            if (cmd->opcode == echo_opcode_echo_end) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_end(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    if (ctx->foreach == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "Found a echo_end that has no corresponding echo_foreach "[m
[31m-                      "before it.");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->foreach->next_choice++;[m
[31m-[m
[31m-    if (ctx->foreach->next_choice >= ctx->foreach->choices->nelts) {[m
[31m-        /* TODO We need to explicitly free the foreach ctx from[m
[31m-         * the pool */[m
[31m-        ctx->foreach = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("echo_end: ++ next_choice (total: %u): %u",[m
[31m-       (unsigned) ctx->foreach->choices->nelts,[m
[31m-       (unsigned) ctx->foreach->next_choice);[m
[31m-[m
[31m-    /* the main handler dispatcher loop will increment[m
[31m-     *   ctx->next_handler_cmd for us anyway. */[m
[31m-    ctx->next_handler_cmd = ctx->foreach->cmd_index;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_foreach.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_foreach.h[m
[1mdeleted file mode 100644[m
[1mindex 49592f4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_foreach.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-#ifndef ECHO_FOREACH_H[m
[31m-#define ECHO_FOREACH_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_foreach_split(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_end(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_it_variable(ngx_http_request_t *r,[m
[31m-        ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-#endif /* ECHO_FOREACH_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 00933a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,429 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_filter.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-#include "ngx_http_echo_echo.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_sleep.h"[m
[31m-#include "ngx_http_echo_var.h"[m
[31m-#include "ngx_http_echo_timer.h"[m
[31m-#include "ngx_http_echo_location.h"[m
[31m-#include "ngx_http_echo_subrequest.h"[m
[31m-#include "ngx_http_echo_request_info.h"[m
[31m-#include "ngx_http_echo_foreach.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_log.h>[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_echo_wev_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    dd("wev handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    dd("waiting: %d, done: %d", (int) ctx->waiting, (int) ctx->done);[m
[31m-[m
[31m-    if (ctx->waiting && ! ctx->done) {[m
[31m-[m
[31m-        if (r == r->connection->data && r->postponed) {[m
[31m-[m
[31m-            if (r->postponed->request) {[m
[31m-                r->connection->data = r->postponed->request;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8012[m
[31m-                ngx_http_post_request(r->postponed->request, NULL);[m
[31m-#else[m
[31m-                ngx_http_post_request(r->postponed->request);[m
[31m-#endif[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_http_echo_flush_postponed_outputs(r);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->done = 0;[m
[31m-[m
[31m-    ctx->next_handler_cmd++;[m
[31m-[m
[31m-    rc = ngx_http_echo_run_cmds(r);[m
[31m-[m
[31m-    dd("rc: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc == NGX_DONE) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        dd("mark busy %d for %.*s", (int) ctx->next_handler_cmd,[m
[31m-           (int) r->uri.len,[m
[31m-           r->uri.data);[m
[31m-[m
[31m-        ctx->waiting = 1;[m
[31m-        ctx->done = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("mark ready %d", (int) ctx->next_handler_cmd);[m
[31m-        ctx->waiting = 0;[m
[31m-        ctx->done = 1;[m
[31m-[m
[31m-        dd("finalizing with rc %d", (int) rc);[m
[31m-[m
[31m-        dd("finalize request %.*s with %d", (int) r->uri.len, r->uri.data,[m
[31m-           (int) rc);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    dd("subrequest in memory: %d", (int) r->subrequest_in_memory);[m
[31m-[m
[31m-    rc = ngx_http_echo_run_cmds(r);[m
[31m-[m
[31m-    dd("run cmds returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc == NGX_OK[m
[31m-        || rc == NGX_DONE[m
[31m-        || rc == NGX_DECLINED)[m
[31m-    {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        if (ctx && r->header_sent) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    r->main->count++;[m
[31m-#endif[m
[31m-[m
[31m-    dd("%d", r->connection->destroyed);[m
[31m-    dd("%d", r->done);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        dd("mark busy %d for %.*s", (int) ctx->next_handler_cmd,[m
[31m-           (int) r->uri.len,[m
[31m-           r->uri.data);[m
[31m-[m
[31m-        ctx->waiting = 1;[m
[31m-        ctx->done = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_run_cmds(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t    *elcf;[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_array_t                 *cmds;[m
[31m-    ngx_array_t                 *computed_args = NULL;[m
[31m-    ngx_http_echo_cmd_t         *cmd;[m
[31m-    ngx_http_echo_cmd_t         *cmd_elts;[m
[31m-    ngx_array_t                 *opts = NULL;[m
[31m-[m
[31m-    elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-    cmds = elcf->handler_cmds;[m
[31m-    if (cmds == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_echo_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_echo_module);[m
[31m-    }[m
[31m-[m
[31m-    dd("exec handler: %.*s: %i", (int) r->uri.len, r->uri.data,[m
[31m-       (int) ctx->next_handler_cmd);[m
[31m-[m
[31m-    cmd_elts = cmds->elts;[m
[31m-[m
[31m-    for (; ctx->next_handler_cmd < cmds->nelts; ctx->next_handler_cmd++) {[m
[31m-[m
[31m-        cmd = &cmd_elts[ctx->next_handler_cmd];[m
[31m-[m
[31m-        /* evaluate arguments for the current cmd (if any) */[m
[31m-        if (cmd->args) {[m
[31m-            computed_args = ngx_array_create(r->pool, cmd->args->nelts,[m
[31m-                                             sizeof(ngx_str_t));[m
[31m-[m
[31m-            if (computed_args == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            opts = ngx_array_create(r->pool, 1, sizeof(ngx_str_t));[m
[31m-[m
[31m-            if (opts == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_echo_eval_cmd_args(r, cmd, computed_args, opts);[m
[31m-            if (rc != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "Failed to evaluate arguments for "[m
[31m-                              "the directive.");[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* do command dispatch based on the opcode */[m
[31m-[m
[31m-        switch (cmd->opcode) {[m
[31m-[m
[31m-        case echo_opcode_echo_sync:[m
[31m-            rc = ngx_http_echo_exec_echo_sync(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo:[m
[31m-            /* XXX moved the following code to a separate[m
[31m-             * function */[m
[31m-            dd("found echo opcode");[m
[31m-            rc = ngx_http_echo_exec_echo(r, ctx, computed_args,[m
[31m-                                         0 /* in filter */, opts);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_request_body:[m
[31m-            rc = ngx_http_echo_exec_echo_request_body(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_location_async:[m
[31m-            if (!r->request_body) {[m
[31m-                /* we require reading the request body before doing[m
[31m-                 * subrequests */[m
[31m-[m
[31m-                ctx->next_handler_cmd--; /* re-run the current cmd */[m
[31m-                goto read_request_body;[m
[31m-            }[m
[31m-[m
[31m-            dd("found opcode echo location async...");[m
[31m-            rc = ngx_http_echo_exec_echo_location_async(r, ctx,[m
[31m-                                                        computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_location:[m
[31m-            if (!r->request_body) {[m
[31m-                /* we require reading the request body before doing[m
[31m-                 * subrequests */[m
[31m-[m
[31m-                ctx->next_handler_cmd--; /* re-run the current cmd */[m
[31m-                goto read_request_body;[m
[31m-            }[m
[31m-[m
[31m-            return ngx_http_echo_exec_echo_location(r, ctx, computed_args);[m
[31m-[m
[31m-        case echo_opcode_echo_subrequest_async:[m
[31m-            if (!r->request_body) {[m
[31m-                /* we require reading the request body before doing[m
[31m-                 * subrequests */[m
[31m-[m
[31m-                ctx->next_handler_cmd--; /* re-run the current cmd */[m
[31m-                goto read_request_body;[m
[31m-            }[m
[31m-[m
[31m-            dd("found opcode echo subrequest async...");[m
[31m-            rc = ngx_http_echo_exec_echo_subrequest_async(r, ctx,[m
[31m-                                                          computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_subrequest:[m
[31m-            if (!r->request_body) {[m
[31m-                /* we require reading the request body before doing[m
[31m-                 * subrequests */[m
[31m-[m
[31m-                ctx->next_handler_cmd--; /* re-run the current cmd */[m
[31m-                goto read_request_body;[m
[31m-            }[m
[31m-[m
[31m-            return ngx_http_echo_exec_echo_subrequest(r, ctx, computed_args);[m
[31m-[m
[31m-        case echo_opcode_echo_sleep:[m
[31m-            return ngx_http_echo_exec_echo_sleep(r, ctx, computed_args);[m
[31m-[m
[31m-        case echo_opcode_echo_flush:[m
[31m-            rc = ngx_http_echo_exec_echo_flush(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_blocking_sleep:[m
[31m-            rc = ngx_http_echo_exec_echo_blocking_sleep(r, ctx,[m
[31m-                                                        computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_reset_timer:[m
[31m-            rc = ngx_http_echo_exec_echo_reset_timer(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_duplicate:[m
[31m-            rc = ngx_http_echo_exec_echo_duplicate(r, ctx, computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_read_request_body:[m
[31m-[m
[31m-read_request_body:[m
[31m-[m
[31m-            ctx->wait_read_request_body = 0;[m
[31m-[m
[31m-            rc = ngx_http_echo_exec_echo_read_request_body(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version >= 8011 && nginx_version < 1002006)                       \[m
[31m-    || (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-                r->main->count--;[m
[31m-#endif[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-#if nginx_version >= 8011[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-            dd("read request body: %d", (int) rc);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-            ctx->wait_read_request_body = 1;[m
[31m-            return NGX_AGAIN;[m
[31m-[m
[31m-        case echo_opcode_echo_foreach_split:[m
[31m-            rc = ngx_http_echo_exec_echo_foreach_split(r, ctx, computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_end:[m
[31m-            rc = ngx_http_echo_exec_echo_end(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_exec:[m
[31m-            dd("echo_exec");[m
[31m-            return ngx_http_echo_exec_exec(r, ctx, computed_args);[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "unknown opcode: %d", cmd->opcode);[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_chain_link(r, ctx, NULL /* indicate LAST */);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body) {[m
[31m-        if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_post_subrequest(ngx_http_request_t *r,[m
[31m-    void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx = data;[m
[31m-    ngx_http_request_t          *pr;[m
[31m-    ngx_http_echo_ctx_t         *pr_ctx;[m
[31m-[m
[31m-    dd("echo post_subrequest: %.*s", (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    if (ctx->run_post_subrequest) {[m
[31m-        dd("already run post_subrequest: %p: %.*s", ctx,[m
[31m-           (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("setting run_post_subrequest to 1 for %p for %.*s", ctx,[m
[31m-       (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    ctx->run_post_subrequest = 1;[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    pr_ctx = ngx_http_get_module_ctx(pr, ngx_http_echo_module);[m
[31m-    if (pr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("mark ready %d", (int) pr_ctx->next_handler_cmd);[m
[31m-[m
[31m-    pr_ctx->waiting = 0;[m
[31m-    pr_ctx->done = 1;[m
[31m-[m
[31m-    pr->write_event_handler = ngx_http_echo_wev_handler;[m
[31m-[m
[31m-    /* work-around issues in nginx's event module */[m
[31m-[m
[31m-    if (r != r->connection->data[m
[31m-        && r->postponed[m
[31m-        && (r->main->posted_requests == NULL[m
[31m-            || r->main->posted_requests->request != pr))[m
[31m-    {[m
[31m-#if defined(nginx_version) && nginx_version >= 8012[m
[31m-        ngx_http_post_request(pr, NULL);[m
[31m-#else[m
[31m-        ngx_http_post_request(pr);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_handler.h[m
[1mdeleted file mode 100644[m
[1mindex afc0666..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-#ifndef ECHO_HANDLER_H[m
[31m-#define ECHO_HANDLER_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_echo_wev_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_run_cmds(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_post_subrequest(ngx_http_request_t *r,[m
[31m-        void *data, ngx_int_t rc);[m
[31m-[m
[31m-[m
[31m-#endif /* ECHO_HANDLER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_location.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_location.c[m
[1mdeleted file mode 100644[m
[1mindex bfabb5e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_location.c[m
[1m+++ /dev/null[m
[36m@@ -1,178 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_location.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_adjust_subrequest(ngx_http_request_t *sr);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_location_async(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_request_t          *sr; /* subrequest object */[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_str_t                    location;[m
[31m-    ngx_str_t                   *url_args;[m
[31m-    ngx_str_t                    args;[m
[31m-    ngx_uint_t                   flags = 0;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-[m
[31m-    location = computed_arg_elts[0];[m
[31m-[m
[31m-    if (location.len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (computed_args->nelts > 1) {[m
[31m-        url_args = &computed_arg_elts[1];[m
[31m-    } else {[m
[31m-        url_args = NULL;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &location, &args, &flags) != NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_location_async sees unsafe uri: \"%V\"",[m
[31m-                       &location);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && url_args == NULL) {[m
[31m-        url_args = &args;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, &location, url_args, &sr, NULL, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_adjust_subrequest(sr);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_location(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_request_t                  *sr; /* subrequest object */[m
[31m-    ngx_str_t                           *computed_arg_elts;[m
[31m-    ngx_str_t                            location;[m
[31m-    ngx_str_t                           *url_args;[m
[31m-    ngx_http_post_subrequest_t          *psr;[m
[31m-    ngx_str_t                            args;[m
[31m-    ngx_uint_t                           flags = 0;[m
[31m-    ngx_http_echo_ctx_t                 *sr_ctx;[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-[m
[31m-    location = computed_arg_elts[0];[m
[31m-[m
[31m-    if (location.len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (computed_args->nelts > 1) {[m
[31m-        url_args = &computed_arg_elts[1];[m
[31m-[m
[31m-    } else {[m
[31m-        url_args = NULL;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &location, &args, &flags) != NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_location sees unsafe uri: \"%V\"",[m
[31m-                       &location);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && url_args == NULL) {[m
[31m-        url_args = &args;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx = ngx_http_echo_create_ctx(r);[m
[31m-[m
[31m-    psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-    if (psr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    psr->handler = ngx_http_echo_post_subrequest;[m
[31m-    psr->data = sr_ctx;[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, &location, url_args, &sr, psr, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_adjust_subrequest(sr);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_adjust_subrequest(ngx_http_request_t *sr)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    /* we do not inherit the parent request's variables */[m
[31m-    cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-[m
[31m-    r = sr->parent;[m
[31m-[m
[31m-    sr->header_in = r->header_in;[m
[31m-[m
[31m-    /* XXX work-around a bug in ngx_http_subrequest */[m
[31m-    if (r->headers_in.headers.last == &r->headers_in.headers.part) {[m
[31m-        sr->headers_in.headers.last = &sr->headers_in.headers.part;[m
[31m-    }[m
[31m-[m
[31m-    sr->variables = ngx_pcalloc(sr->pool, cmcf->variables.nelts[m
[31m-                                * sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-    if (sr->variables == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_location.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_location.h[m
[1mdeleted file mode 100644[m
[1mindex 6bc0e03..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_location.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef ECHO_LOCATION_H[m
[31m-#define ECHO_LOCATION_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_location_async(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_location(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-#endif /* ECHO_LOCATION_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_module.c[m
[1mdeleted file mode 100644[m
[1mindex ae70479..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,669 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-#include "ngx_http_echo_filter.h"[m
[31m-#include "ngx_http_echo_echo.h"[m
[31m-#include "ngx_http_echo_request_info.h"[m
[31m-#include "ngx_http_echo_var.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_log.h>[m
[31m-[m
[31m-[m
[31m-/* config init handler */[m
[31m-static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static void *ngx_http_echo_create_main_conf(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_echo_post_config(ngx_conf_t *cf);[m
[31m-[m
[31m-/* config directive handlers */[m
[31m-static char *ngx_http_echo_echo(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_echo_echo_request_body(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_sleep(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_echo_echo_flush(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_echo_echo_blocking_sleep(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_reset_timer(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_before_body(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_after_body(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_location_async(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_location(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_subrequest_async(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_subrequest(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_duplicate(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_read_request_body(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_foreach_split(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_end(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_abort_parent(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_exec(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_helper(ngx_http_echo_opcode_t opcode,[m
[31m-    ngx_http_echo_cmd_category_t cat,[m
[31m-    ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_echo_module_ctx = {[m
[31m-    NULL,                           /* preconfiguration */[m
[31m-    ngx_http_echo_post_config,      /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_echo_create_main_conf, /* create main configuration */[m
[31m-    NULL,                           /* init main configuration */[m
[31m-[m
[31m-    NULL,                           /* create server configuration */[m
[31m-    NULL,                           /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_echo_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_http_echo_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_echo_commands[] = {[m
[31m-[m
[31m-    { ngx_string("echo"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_ANY,[m
[31m-      ngx_http_echo_echo,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_request_body"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_request_body,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_sleep"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_echo_echo_sleep,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_flush"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_flush,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_blocking_sleep"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_echo_echo_blocking_sleep,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_reset_timer"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_reset_timer,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_before_body"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_ANY,[m
[31m-      ngx_http_echo_echo_before_body,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, before_body_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_after_body"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_ANY,[m
[31m-      ngx_http_echo_echo_after_body,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, after_body_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_location_async"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_echo_echo_location_async,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_location"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_echo_echo_location,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_subrequest_async"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_echo_echo_subrequest_async,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_subrequest"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_echo_echo_subrequest,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_duplicate"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_echo_echo_duplicate,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_read_request_body"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_read_request_body,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_foreach_split"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_echo_echo_foreach_split,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_end"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_end,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_abort_parent"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_abort_parent,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_exec"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_echo_echo_exec,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_status"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, status),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_echo_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_echo_module_ctx,     /* module context */[m
[31m-    ngx_http_echo_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_echo_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc[m
[31m-     *  conf->handler_cmds = NULL[m
[31m-     *  conf->before_body_cmds = NULL[m
[31m-     *  conf->after_body_cmds = NULL[m
[31m-     *  conf->seen_leading_output = 0[m
[31m-     *  conf->seen_trailing_output = 0[m
[31m-     */[m
[31m-[m
[31m-    conf->status = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t    *prev = parent;[m
[31m-    ngx_http_echo_loc_conf_t    *conf = child;[m
[31m-[m
[31m-    if (conf->handler_cmds == NULL) {[m
[31m-        conf->handler_cmds = prev->handler_cmds;[m
[31m-        conf->seen_leading_output = prev->seen_leading_output;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->before_body_cmds == NULL) {[m
[31m-        conf->before_body_cmds = prev->before_body_cmds;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->after_body_cmds == NULL) {[m
[31m-        conf->after_body_cmds = prev->after_body_cmds;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->status, prev->status, 200);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_helper(ngx_http_echo_opcode_t opcode,[m
[31m-    ngx_http_echo_cmd_category_t cat,[m
[31m-    ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                       *raw_args;[m
[31m-    ngx_uint_t                       i, n;[m
[31m-    ngx_array_t                    **args_ptr;[m
[31m-    ngx_array_t                    **cmds_ptr;[m
[31m-    ngx_http_echo_cmd_t             *echo_cmd;[m
[31m-    ngx_http_core_loc_conf_t        *clcf;[m
[31m-    ngx_http_script_compile_t        sc;[m
[31m-    ngx_http_echo_main_conf_t       *emcf;[m
[31m-    ngx_http_echo_arg_template_t    *arg;[m
[31m-[m
[31m-    emcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_echo_module);[m
[31m-[m
[31m-    /* cmds_ptr points to ngx_http_echo_loc_conf_t's[m
[31m-     * handler_cmds, before_body_cmds, or after_body_cmds[m
[31m-     * array, depending on the actual offset */[m
[31m-    cmds_ptr = (ngx_array_t **) (((u_char *) conf) + cmd->offset);[m
[31m-[m
[31m-    if (*cmds_ptr == NULL) {[m
[31m-        *cmds_ptr = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_echo_cmd_t));[m
[31m-[m
[31m-        if (*cmds_ptr == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cat == echo_handler_cmd) {[m
[31m-            dd("registering the content handler");[m
[31m-            /* register the content handler */[m
[31m-            clcf = ngx_http_conf_get_module_loc_conf(cf,[m
[31m-                                                     ngx_http_core_module);[m
[31m-[m
[31m-            dd("registering the content handler (2)");[m
[31m-            clcf->handler = ngx_http_echo_handler;[m
[31m-[m
[31m-        } else {[m
[31m-            dd("filter used = 1");[m
[31m-            emcf->requires_filter = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    echo_cmd = ngx_array_push(*cmds_ptr);[m
[31m-[m
[31m-    if (echo_cmd == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    echo_cmd->opcode = opcode;[m
[31m-[m
[31m-    args_ptr = &echo_cmd->args;[m
[31m-    *args_ptr = ngx_array_create(cf->pool, 1,[m
[31m-                                 sizeof(ngx_http_echo_arg_template_t));[m
[31m-[m
[31m-    if (*args_ptr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    raw_args = cf->args->elts;[m
[31m-[m
[31m-    /* we skip the first arg and start from the second */[m
[31m-[m
[31m-    for (i = 1 ; i < cf->args->nelts; i++) {[m
[31m-        arg = ngx_array_push(*args_ptr);[m
[31m-[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        arg->raw_value = raw_args[i];[m
[31m-[m
[31m-        dd("found raw arg %s", raw_args[i].data);[m
[31m-[m
[31m-        arg->lengths = NULL;[m
[31m-        arg->values  = NULL;[m
[31m-[m
[31m-        n = ngx_http_script_variables_count(&arg->raw_value);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &arg->raw_value;[m
[31m-            sc.lengths = &arg->lengths;[m
[31m-            sc.values = &arg->values;[m
[31m-            sc.variables = n;[m
[31m-            sc.complete_lengths = 1;[m
[31m-            sc.complete_values = 1;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    } /* end for */[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("in echo_echo...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_request_body(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("in echo_echo_request_body...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_request_body, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_sleep(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    dd("in echo_sleep...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_sleep, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_flush(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("in echo_flush...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_flush, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_blocking_sleep(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    dd("in echo_blocking_sleep...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_blocking_sleep,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_reset_timer(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_reset_timer, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_before_body(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    dd("processing echo_before_body directive...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_before_body, echo_filter_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_after_body(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_after_body, echo_filter_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_location_async(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-    char                            *ret;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-[m
[31m-        ret = ngx_http_echo_helper(echo_opcode_echo_sync, echo_handler_cmd,[m
[31m-                                   cf, cmd, conf);[m
[31m-[m
[31m-        if (ret != NGX_CONF_OK) {[m
[31m-            return ret;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_location_async,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_location(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-    char                            *ret;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-[m
[31m-        ret = ngx_http_echo_helper(echo_opcode_echo_sync, echo_handler_cmd,[m
[31m-                                   cf, cmd, conf);[m
[31m-[m
[31m-        if (ret != NGX_CONF_OK) {[m
[31m-            return ret;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_location, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_subrequest_async(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char                            *ret;[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-[m
[31m-        ret = ngx_http_echo_helper(echo_opcode_echo_sync, echo_handler_cmd,[m
[31m-                                   cf, cmd, conf);[m
[31m-[m
[31m-        if (ret != NGX_CONF_OK) {[m
[31m-            return ret;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_subrequest_async,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_subrequest(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-    char                            *ret;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-[m
[31m-        ret = ngx_http_echo_helper(echo_opcode_echo_sync, echo_handler_cmd,[m
[31m-                                   cf, cmd, conf);[m
[31m-[m
[31m-        if (ret != NGX_CONF_OK) {[m
[31m-            return ret;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_subrequest, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_duplicate(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_duplicate, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_read_request_body(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_read_request_body,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_foreach_split(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_foreach_split,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_end(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_end, echo_handler_cmd, cf,[m
[31m-                                cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_abort_parent(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_abort_parent, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_exec(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_exec, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_echo_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_echo_main_conf_t    *emcf;[m
[31m-[m
[31m-    emcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_main_conf_t));[m
[31m-    if (emcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      hmcf->requires_filter = 0;[m
[31m-     */[m
[31m-[m
[31m-    return emcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_post_config(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-[m
[31m-    rc = ngx_http_echo_filter_init(cf);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_echo_init(cf);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_echo_content_length_hash =[m
[31m-                                  ngx_http_echo_hash_literal("content-length");[m
[31m-[m
[31m-    return ngx_http_echo_add_variables(cf);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_module.h[m
[1mdeleted file mode 100644[m
[1mindex 2d212c3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,147 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_ECHO_MODULE_H[m
[31m-#define NGX_HTTP_ECHO_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_echo_module;[m
[31m-[m
[31m-[m
[31m-/* config directive's opcode */[m
[31m-typedef enum {[m
[31m-    echo_opcode_echo_sync,[m
[31m-    echo_opcode_echo,[m
[31m-    echo_opcode_echo_request_body,[m
[31m-    echo_opcode_echo_sleep,[m
[31m-    echo_opcode_echo_flush,[m
[31m-    echo_opcode_echo_blocking_sleep,[m
[31m-    echo_opcode_echo_reset_timer,[m
[31m-    echo_opcode_echo_before_body,[m
[31m-    echo_opcode_echo_after_body,[m
[31m-    echo_opcode_echo_location_async,[m
[31m-    echo_opcode_echo_location,[m
[31m-    echo_opcode_echo_subrequest_async,[m
[31m-    echo_opcode_echo_subrequest,[m
[31m-    echo_opcode_echo_duplicate,[m
[31m-    echo_opcode_echo_read_request_body,[m
[31m-    echo_opcode_echo_foreach_split,[m
[31m-    echo_opcode_echo_end,[m
[31m-    echo_opcode_echo_abort_parent,[m
[31m-    echo_opcode_echo_exec[m
[31m-} ngx_http_echo_opcode_t;[m
[31m-[m
[31m-[m
[31m-/* all the various config directives (or commands) are[m
[31m- * divided into two categories: "handler commands",[m
[31m- * and "filter commands". For instance, the "echo"[m
[31m- * directive is a handler command while[m
[31m- * "echo_before_body" is a filter one. */[m
[31m-typedef enum {[m
[31m-    echo_handler_cmd,[m
[31m-    echo_filter_cmd[m
[31m-[m
[31m-} ngx_http_echo_cmd_category_t;[m
[31m-[m
[31m-[m
[31m-/* compiled form of a config directive argument's value */[m
[31m-typedef struct {[m
[31m-    /* holds the raw string of the argument value */[m
[31m-    ngx_str_t       raw_value;[m
[31m-[m
[31m-    /* fields "lengths" and "values" are set by[m
[31m-     * the function ngx_http_script_compile,[m
[31m-     * iff the argument value indeed contains[m
[31m-     * nginx variables like "$foo" */[m
[31m-    ngx_array_t     *lengths;[m
[31m-    ngx_array_t     *values;[m
[31m-[m
[31m-} ngx_http_echo_arg_template_t;[m
[31m-[m
[31m-[m
[31m-/* represent a config directive (or command) like "echo". */[m
[31m-typedef struct {[m
[31m-    ngx_http_echo_opcode_t      opcode;[m
[31m-[m
[31m-    /* each argument is of type echo_arg_template_t: */[m
[31m-    ngx_array_t                 *args;[m
[31m-} ngx_http_echo_cmd_t;[m
[31m-[m
[31m-[m
[31m-/* location config struct */[m
[31m-typedef struct {[m
[31m-    /* elements of the following arrays are of type[m
[31m-     * ngx_http_echo_cmd_t */[m
[31m-    ngx_array_t     *handler_cmds;[m
[31m-    ngx_array_t     *before_body_cmds;[m
[31m-    ngx_array_t     *after_body_cmds;[m
[31m-[m
[31m-    unsigned         seen_leading_output;[m
[31m-[m
[31m-    ngx_int_t        status;[m
[31m-} ngx_http_echo_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t       requires_filter;[m
[31m-} ngx_http_echo_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t     *choices; /* items after splitting */[m
[31m-    ngx_uint_t      next_choice;  /* current item index */[m
[31m-    ngx_uint_t      cmd_index; /* cmd index for the echo_foreach direcitve */[m
[31m-} ngx_http_echo_foreach_ctx_t;[m
[31m-[m
[31m-[m
[31m-/* context struct in the request handling cycle, holding[m
[31m- * the current states of the command evaluator */[m
[31m-typedef struct {[m
[31m-    /* index of the next handler command in[m
[31m-     * ngx_http_echo_loc_conf_t's "handler_cmds" array. */[m
[31m-    ngx_uint_t       next_handler_cmd;[m
[31m-[m
[31m-    /* index of the next before-body filter command in[m
[31m-     * ngx_http_echo_loc_conf_t's "before_body_cmds" array. */[m
[31m-    ngx_uint_t       next_before_body_cmd;[m
[31m-[m
[31m-    /* index of the next after-body filter command in[m
[31m-     * ngx_http_echo_loc_conf_t's "after_body_cmds" array. */[m
[31m-    ngx_uint_t       next_after_body_cmd;[m
[31m-[m
[31m-    ngx_http_echo_foreach_ctx_t   *foreach;[m
[31m-[m
[31m-    ngx_time_t       timer_begin;[m
[31m-[m
[31m-    ngx_event_t      sleep;[m
[31m-[m
[31m-    ngx_uint_t       counter;[m
[31m-[m
[31m-    unsigned         before_body_sent:1;[m
[31m-    unsigned         skip_filter:1;[m
[31m-[m
[31m-    unsigned         wait_read_request_body:1;[m
[31m-[m
[31m-    unsigned         waiting:1;[m
[31m-    unsigned         done:1;[m
[31m-[m
[31m-    unsigned         run_post_subrequest:1;[m
[31m-    unsigned         header_sent:1; /* r->header_sent is not sufficient[m
[31m-                                     * because special header filters like[m
[31m-                                     * ngx_http_image_filter_module's may[m
[31m-                                     * intercept the whole header filter chain[m
[31m-                                     * leaving r->header_sent unset. So we[m
[31m-                                     * should always test both flags. */[m
[31m-[m
[31m-} ngx_http_echo_ctx_t;[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_ECHO_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_request_info.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_request_info.c[m
[1mdeleted file mode 100644[m
[1mindex db6eba7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_request_info.c[m
[1m+++ /dev/null[m
[36m@@ -1,452 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_request_info.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_echo_post_read_request_body(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_read_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    return ngx_http_read_client_request_body(r,[m
[31m-                                        ngx_http_echo_post_read_request_body);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_echo_post_read_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    dd("wait read request body %d", (int) ctx->wait_read_request_body);[m
[31m-[m
[31m-    if (ctx->wait_read_request_body) {[m
[31m-        ctx->waiting = 0;[m
[31m-        ctx->done = 1;[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_echo_wev_handler;[m
[31m-[m
[31m-        ngx_http_echo_wev_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this function's implementation is borrowed from nginx 0.8.20[m
[31m- * and modified a bit to work with subrequests.[m
[31m- * Copyrighted (C) by Igor Sysoev */[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_request_method_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->method_name.data) {[m
[31m-        v->len = r->method_name.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->method_name.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this function's implementation is borrowed from nginx 0.8.20[m
[31m- * and modified a bit to work with subrequests.[m
[31m- * Copyrighted (C) by Igor Sysoev */[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_client_request_method_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->main->method_name.data) {[m
[31m-        v->len = r->main->method_name.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->main->method_name.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this function's implementation is borrowed from nginx 0.8.20[m
[31m- * and modified a bit to work with subrequests.[m
[31m- * Copyrighted (C) by Igor Sysoev */[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_request_body_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char       *p;[m
[31m-    size_t        len;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_chain_t  *in;[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->bufs == NULL[m
[31m-        || r->request_body->temp_file)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    in = r->request_body->bufs;[m
[31m-[m
[31m-    len = 0;[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(b)) {[m
[31m-            if (b->in_file) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "variable echo_request_body sees in-file only "[m
[31m-                               "buffers and discard the whole body data");[m
[31m-[m
[31m-                v->not_found = 1;[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            len += b->last - b->pos;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (ngx_buf_in_memory(b)) {[m
[31m-            p = ngx_copy(p, b->pos, b->last - b->pos);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p - v->data != (ssize_t) len) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "variable echo_request_body: buffer error");[m
[31m-[m
[31m-        v->not_found = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_client_request_headers_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    int                          line_break_len;[m
[31m-    size_t                       size;[m
[31m-    u_char                      *p, *last, *pos;[m
[31m-    ngx_int_t                    i, j;[m
[31m-    ngx_buf_t                   *b, *first = NULL;[m
[31m-    unsigned                     found;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_request_t          *mr;[m
[31m-    ngx_http_connection_t       *hc;[m
[31m-[m
[31m-    mr = r->main;[m
[31m-    hc = r->main->http_connection;[m
[31m-    c = mr->connection;[m
[31m-[m
[31m-    size = 0;[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (mr->request_line.data[mr->request_line.len] == CR) {[m
[31m-        line_break_len = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        line_break_len = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (mr->request_line.data >= b->start[m
[31m-        && mr->request_line.data + mr->request_line.len + line_break_len[m
[31m-           <= b->pos)[m
[31m-    {[m
[31m-        first = b;[m
[31m-        size += b->pos - mr->request_line.data;[m
[31m-    }[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        b = NULL;[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            b = hc->busy[i];[m
[31m-[m
[31m-            if (first == NULL) {[m
[31m-                if (mr->request_line.data >= b->pos[m
[31m-                    || mr->request_line.data + mr->request_line.len[m
[31m-                       + line_break_len <= b->start)[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                dd("found first at %d", (int) i);[m
[31m-                first = b;[m
[31m-            }[m
[31m-[m
[31m-            size += b->pos - b->start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size++;  /* plus the null terminator, as required by the later[m
[31m-                ngx_strstr() call */[m
[31m-[m
[31m-    v->data = ngx_palloc(r->pool, size);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = v->data;[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-    found = 0;[m
[31m-[m
[31m-    if (first == b) {[m
[31m-        found = 1;[m
[31m-        pos = b->pos;[m
[31m-[m
[31m-        last = ngx_copy(v->data, mr->request_line.data,[m
[31m-                        pos - mr->request_line.data);[m
[31m-[m
[31m-        if (b != mr->header_in) {[m
[31m-            /* skip truncated header entries (if any) */[m
[31m-            while (last > v->data && last[-1] != LF) {[m
[31m-                last--;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-        for (p = v->data; p != last; p++) {[m
[31m-            if (*p == '\0') {[m
[31m-                i++;[m
[31m-                if (p + 1 != last && *(p + 1) == LF) {[m
[31m-                    *p = CR;[m
[31m-[m
[31m-                } else if (i % 2 == 1) {[m
[31m-                    *p = ':';[m
[31m-[m
[31m-                } else {[m
[31m-                    *p = LF;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            b = hc->busy[i];[m
[31m-[m
[31m-            if (!found) {[m
[31m-                if (b != first) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                dd("found first");[m
[31m-                found = 1;[m
[31m-            }[m
[31m-[m
[31m-            p = last;[m
[31m-[m
[31m-            pos = b->pos;[m
[31m-[m
[31m-            if (b == first) {[m
[31m-                dd("request line: %.*s", (int) mr->request_line.len,[m
[31m-                   mr->request_line.data);[m
[31m-[m
[31m-                last = ngx_copy(last,[m
[31m-                                mr->request_line.data,[m
[31m-                                pos - mr->request_line.data);[m
[31m-[m
[31m-            } else {[m
[31m-                last = ngx_copy(last, b->start, pos - b->start);[m
[31m-            }[m
[31m-[m
[31m-#if 1[m
[31m-            /* skip truncated header entries (if any) */[m
[31m-            while (last > p && last[-1] != LF) {[m
[31m-                last--;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            j = 0;[m
[31m-            for (; p != last; p++) {[m
[31m-                if (*p == '\0') {[m
[31m-                    j++;[m
[31m-                    if (p + 1 == last) {[m
[31m-                        /* XXX this should not happen */[m
[31m-                        dd("found string end!!");[m
[31m-[m
[31m-                    } else if (*(p + 1) == LF) {[m
[31m-                        *p = CR;[m
[31m-[m
[31m-                    } else if (j % 2 == 1) {[m
[31m-                        *p = ':';[m
[31m-[m
[31m-                    } else {[m
[31m-                        *p = LF;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b == mr->header_in) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *last++ = '\0';[m
[31m-[m
[31m-    if (last - v->data > (ssize_t) size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "buffer error when evaluating "[m
[31m-                      "$echo_client__request_headers: \"%V\"",[m
[31m-                      (ngx_int_t) (last - v->data - size));[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* strip the leading part (if any) of the request body in our header.[m
[31m-     * the first part of the request body could slip in because nginx core's[m
[31m-     * ngx_http_request_body_length_filter and etc can move r->header_in->pos[m
[31m-     * in case that some of the body data has been preread into r->header_in.[m
[31m-     */[m
[31m-[m
[31m-    if ((p = (u_char *) ngx_strstr(v->data, CRLF CRLF)) != NULL) {[m
[31m-        last = p + sizeof(CRLF CRLF) - 1;[m
[31m-[m
[31m-    } else if ((p = (u_char *) ngx_strstr(v->data, CRLF "\n")) != NULL) {[m
[31m-        last = p + sizeof(CRLF "\n") - 1;[m
[31m-[m
[31m-    } else if ((p = (u_char *) ngx_strstr(v->data, "\n" CRLF)) != NULL) {[m
[31m-        last = p + sizeof("\n" CRLF) - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        for (p = last - 1; p - v->data >= 2; p--) {[m
[31m-            if (p[0] == LF && p[-1] == CR) {[m
[31m-                p[-1] = LF;[m
[31m-                last = p + 1;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (p[0] == LF && p[-1] == LF) {[m
[31m-                last = p + 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = last - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_cacheable_request_uri_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->uri.len) {[m
[31m-        v->len = r->uri.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->uri.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_request_uri_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->uri.len) {[m
[31m-        v->len = r->uri.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 1;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->uri.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_response_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    if (r->headers_out.status) {[m
[31m-        dd("headers out status: %d", (int) r->headers_out.status);[m
[31m-[m
[31m-        p = ngx_palloc(r->pool, NGX_INT_T_LEN);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_sprintf(p, "%ui", r->headers_out.status) - p;[m
[31m-        v->data = p;[m
[31m-[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 1;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_request_info.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_request_info.h[m
[1mdeleted file mode 100644[m
[1mindex 3b3713b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_request_info.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-#ifndef ECHO_REQUEST_INFO_H[m
[31m-#define ECHO_REQUEST_INFO_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_read_request_body([m
[31m-    ngx_http_request_t *r, ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_request_method_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_client_request_method_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_request_body_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_client_request_headers_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_cacheable_request_uri_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_request_uri_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_response_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-#endif /* ECHO_REQUEST_INFO_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_sleep.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_sleep.c[m
[1mdeleted file mode 100644[m
[1mindex c96fa5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_sleep.c[m
[1m+++ /dev/null[m
[36m@@ -1,208 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_sleep.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_log.h>[m
[31m-[m
[31m-[m
[31m-/* event handler for echo_sleep */[m
[31m-[m
[31m-static void ngx_http_echo_post_sleep(ngx_http_request_t *r);[m
[31m-static void ngx_http_echo_sleep_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_sleep(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_str_t                   *computed_arg;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_int_t                    delay; /* in msec */[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-    computed_arg = &computed_arg_elts[0];[m
[31m-[m
[31m-    delay = ngx_atofp(computed_arg->data, computed_arg->len, 3);[m
[31m-[m
[31m-    if (delay == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid sleep duration \"%V\"", &computed_arg_elts[0]);[m
[31m-[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    dd("adding timer with delay %lu ms, r:%.*s", (unsigned long) delay,[m
[31m-       (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    ngx_add_timer(&ctx->sleep, (ngx_msec_t) delay);[m
[31m-[m
[31m-    /* we don't check broken downstream connections[m
[31m-     * ourselves so even if the client shuts down[m
[31m-     * the connection prematurely, nginx will still[m
[31m-     * go on waiting for our timers to get properly[m
[31m-     * expired. However, we'd still register a[m
[31m-     * cleanup handler for completeness. */[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_echo_sleep_cleanup;[m
[31m-    cln->data = r;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_echo_post_sleep(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    /* ngx_int_t                    rc; */[m
[31m-[m
[31m-    dd("post sleep, r:%.*s", (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->waiting = 0;[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    dd("sleep: after get module ctx");[m
[31m-[m
[31m-    dd("timed out? %d", ctx->sleep.timedout);[m
[31m-    dd("timer set? %d", ctx->sleep.timer_set);[m
[31m-[m
[31m-    if (!ctx->sleep.timedout) {[m
[31m-        dd("HERE reached!");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->sleep.timedout = 0;[m
[31m-[m
[31m-    if (ctx->sleep.timer_set) {[m
[31m-        dd("deleting timer for echo_sleep");[m
[31m-[m
[31m-        ngx_del_timer(&ctx->sleep);[m
[31m-    }[m
[31m-[m
[31m-    /* r->write_event_handler = ngx_http_request_empty_handler; */[m
[31m-[m
[31m-    ngx_http_echo_wev_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_echo_sleep_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_log_ctx_t      *ctx;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->destroyed) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx = c->log->data;[m
[31m-    ctx->current_request = r;[m
[31m-[m
[31m-    /* XXX when r->done == 1 we should do cleaning immediately[m
[31m-     * and delete our timer and then quit. */[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "echo sleep event handler: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    /*[m
[31m-    if (r->done) {[m
[31m-        return;[m
[31m-    }[m
[31m-    */[m
[31m-[m
[31m-    ngx_http_echo_post_sleep(r);[m
[31m-[m
[31m-#if defined(nginx_version)[m
[31m-[m
[31m-    dd("before run posted requests");[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    dd("after run posted requests");[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_blocking_sleep(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_str_t                   *computed_arg;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_int_t                    delay; /* in msec */[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-    computed_arg = &computed_arg_elts[0];[m
[31m-[m
[31m-    delay = ngx_atofp(computed_arg->data, computed_arg->len, 3);[m
[31m-[m
[31m-    if (delay == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid sleep duration \"%V\"", &computed_arg_elts[0]);[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    dd("blocking delay: %lu ms", (unsigned long) delay);[m
[31m-[m
[31m-    ngx_msleep((ngx_msec_t) delay);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_echo_sleep_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t      *r = data;[m
[31m-    ngx_http_echo_ctx_t     *ctx;[m
[31m-[m
[31m-    dd("echo sleep cleanup");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->sleep.timer_set) {[m
[31m-        dd("cleanup: deleting timer for echo_sleep");[m
[31m-[m
[31m-        ngx_del_timer(&ctx->sleep);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    dd("cleanup: timer not set");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_sleep.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_sleep.h[m
[1mdeleted file mode 100644[m
[1mindex 8bb70c3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_sleep.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-#ifndef ECHO_SLEEP_H[m
[31m-#define ECHO_SLEEP_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_sleep([m
[31m-        ngx_http_request_t *r, ngx_http_echo_ctx_t *ctx,[m
[31m-        ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_blocking_sleep(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-void ngx_http_echo_sleep_event_handler(ngx_event_t *ev);[m
[31m-[m
[31m-#endif /* ECHO_SLEEP_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.c[m
[1mdeleted file mode 100644[m
[1mindex 8644d7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.c[m
[1m+++ /dev/null[m
[36m@@ -1,791 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_subrequest.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_echo_method_name(m) { sizeof(m) - 1, (u_char *) m " " }[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_echo_content_length_header_key =[m
[31m-        ngx_string("Content-Length");[m
[31m-[m
[31m-ngx_str_t  ngx_http_echo_get_method = ngx_http_echo_method_name("GET");[m
[31m-ngx_str_t  ngx_http_echo_put_method = ngx_http_echo_method_name("PUT");[m
[31m-ngx_str_t  ngx_http_echo_post_method = ngx_http_echo_method_name("POST");[m
[31m-ngx_str_t  ngx_http_echo_head_method = ngx_http_echo_method_name("HEAD");[m
[31m-ngx_str_t  ngx_http_echo_copy_method = ngx_http_echo_method_name("COPY");[m
[31m-ngx_str_t  ngx_http_echo_move_method = ngx_http_echo_method_name("MOVE");[m
[31m-ngx_str_t  ngx_http_echo_lock_method = ngx_http_echo_method_name("LOCK");[m
[31m-ngx_str_t  ngx_http_echo_mkcol_method = ngx_http_echo_method_name("MKCOL");[m
[31m-ngx_str_t  ngx_http_echo_trace_method = ngx_http_echo_method_name("TRACE");[m
[31m-ngx_str_t  ngx_http_echo_delete_method = ngx_http_echo_method_name("DELETE");[m
[31m-ngx_str_t  ngx_http_echo_unlock_method = ngx_http_echo_method_name("UNLOCK");[m
[31m-ngx_str_t  ngx_http_echo_options_method = ngx_http_echo_method_name("OPTIONS");[m
[31m-ngx_str_t  ngx_http_echo_propfind_method =[m
[31m-        ngx_http_echo_method_name("PROPFIND");[m
[31m-ngx_str_t  ngx_http_echo_proppatch_method =[m
[31m-        ngx_http_echo_method_name("PROPPATCH");[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_echo_subrequest_s {[m
[31m-    ngx_uint_t                   method;[m
[31m-    ngx_str_t                   *method_name;[m
[31m-    ngx_str_t                   *location;[m
[31m-    ngx_str_t                   *query_string;[m
[31m-    ssize_t                      content_length_n;[m
[31m-    ngx_http_request_body_t     *request_body;[m
[31m-} ngx_http_echo_subrequest_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_parse_method_name(ngx_str_t **method_name_ptr);[m
[31m-static ngx_int_t ngx_http_echo_adjust_subrequest(ngx_http_request_t *sr,[m
[31m-    ngx_http_echo_subrequest_t *parsed_sr);[m
[31m-static ngx_int_t ngx_http_echo_parse_subrequest_spec(ngx_http_request_t *r,[m
[31m-    ngx_array_t *computed_args, ngx_http_echo_subrequest_t **parsed_sr_ptr);[m
[31m-static ngx_int_t ngx_http_echo_set_content_length_header(ngx_http_request_t *r,[m
[31m-    off_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_subrequest_async(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_echo_subrequest_t      *parsed_sr;[m
[31m-    ngx_http_request_t              *sr; /* subrequest object */[m
[31m-    ngx_str_t                        args;[m
[31m-    ngx_uint_t                       flags = 0;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    rc = ngx_http_echo_parse_subrequest_spec(r, computed_args, &parsed_sr);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("location: %.*s",[m
[31m-        (int) parsed_sr->location->len,[m
[31m-        parsed_sr->location->data);[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, parsed_sr->location, &args, &flags)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_subrequest_async sees unsafe uri: \"%V\"",[m
[31m-                       parsed_sr->location);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && parsed_sr->query_string == NULL) {[m
[31m-        parsed_sr->query_string = &args;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, parsed_sr->location, parsed_sr->query_string,[m
[31m-                             &sr, NULL, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_adjust_subrequest(sr, parsed_sr);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_request_t                  *sr; /* subrequest object */[m
[31m-    ngx_http_post_subrequest_t          *psr;[m
[31m-    ngx_http_echo_subrequest_t          *parsed_sr;[m
[31m-    ngx_str_t                            args;[m
[31m-    ngx_uint_t                           flags = 0;[m
[31m-    ngx_http_echo_ctx_t                 *sr_ctx;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    rc = ngx_http_echo_parse_subrequest_spec(r, computed_args, &parsed_sr);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, parsed_sr->location, &args, &flags)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_subrequest sees unsafe uri: \"%V\"",[m
[31m-                       parsed_sr->location);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && parsed_sr->query_string == NULL) {[m
[31m-        parsed_sr->query_string = &args;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx = ngx_http_echo_create_ctx(r);[m
[31m-[m
[31m-    /* set by ngx_http_echo_create_ctx[m
[31m-     *  sr_ctx->run_post_subrequest = 0[m
[31m-     */[m
[31m-[m
[31m-    dd("creating sr ctx for %.*s: %p", (int) parsed_sr->location->len,[m
[31m-       parsed_sr->location->data, sr_ctx);[m
[31m-[m
[31m-    psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-[m
[31m-    if (psr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    psr->handler = ngx_http_echo_post_subrequest;[m
[31m-    psr->data = sr_ctx;[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, parsed_sr->location, parsed_sr->query_string,[m
[31m-                             &sr, psr, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx->sleep.data = sr;[m
[31m-[m
[31m-    ngx_http_set_ctx(sr, sr_ctx, ngx_http_echo_module);[m
[31m-[m
[31m-    rc = ngx_http_echo_adjust_subrequest(sr, parsed_sr);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_parse_subrequest_spec(ngx_http_request_t *r,[m
[31m-    ngx_array_t *computed_args, ngx_http_echo_subrequest_t **parsed_sr_ptr)[m
[31m-{[m
[31m-    ngx_str_t                   *computed_arg_elts, *arg;[m
[31m-    ngx_str_t                  **to_write = NULL;[m
[31m-    ngx_str_t                   *method_name;[m
[31m-    ngx_str_t                   *body_str = NULL;[m
[31m-    ngx_str_t                   *body_file = NULL;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_flag_t                   expecting_opt;[m
[31m-    ngx_http_request_body_t     *rb = NULL;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_http_echo_subrequest_t  *parsed_sr;[m
[31m-    ngx_open_file_info_t         of;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    size_t                       len;[m
[31m-[m
[31m-    *parsed_sr_ptr = ngx_pcalloc(r->pool, sizeof(ngx_http_echo_subrequest_t));[m
[31m-    if (*parsed_sr_ptr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    parsed_sr = *parsed_sr_ptr;[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-    method_name = &computed_arg_elts[0];[m
[31m-    parsed_sr->location = &computed_arg_elts[1];[m
[31m-[m
[31m-    if (parsed_sr->location->len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    expecting_opt = 1;[m
[31m-[m
[31m-    for (i = 2; i < computed_args->nelts; i++) {[m
[31m-        arg = &computed_arg_elts[i];[m
[31m-[m
[31m-        if (!expecting_opt) {[m
[31m-            if (to_write == NULL) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                        "echo_subrequest_async: to_write should NOT be NULL");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *to_write = arg;[m
[31m-            to_write = NULL;[m
[31m-[m
[31m-            expecting_opt = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg->len == 2) {[m
[31m-            if (ngx_strncmp("-q", arg->data, arg->len) == 0) {[m
[31m-                to_write = &parsed_sr->query_string;[m
[31m-                expecting_opt = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp("-b", arg->data, arg->len) == 0) {[m
[31m-                to_write = &body_str;[m
[31m-                expecting_opt = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp("-f", arg->data, arg->len) == 0) {[m
[31m-                dd("found option -f");[m
[31m-                to_write = &body_file;[m
[31m-                expecting_opt = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unknown option for echo_subrequest*: %V", arg);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (body_str != NULL && body_str->len) {[m
[31m-        rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-[m
[31m-        if (rb == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        parsed_sr->content_length_n = body_str->len;[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        /* b->memory = 1; */[m
[31m-        b->start = b->pos = body_str->data;[m
[31m-        b->end = b->last = body_str->data + body_str->len;[m
[31m-[m
[31m-        rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs->buf = b;[m
[31m-        rb->bufs->next = NULL;[m
[31m-[m
[31m-        rb->buf = b;[m
[31m-[m
[31m-    } else if (body_file != NULL && body_file->len) {[m
[31m-[m
[31m-        dd("body_file defined %.*s", (int) body_file->len, body_file->data);[m
[31m-[m
[31m-        body_file->data = ngx_http_echo_rebase_path(r->pool, body_file->data,[m
[31m-                                                    body_file->len, &len);[m
[31m-[m
[31m-        if (body_file->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        body_file->len = len;[m
[31m-[m
[31m-        dd("after rebase, the path becomes %.*s", (int) body_file->len,[m
[31m-           body_file->data);[m
[31m-[m
[31m-        rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-        if (rb == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8018[m
[31m-        of.read_ahead = clcf->read_ahead;[m
[31m-#endif[m
[31m-[m
[31m-        of.directio = clcf->directio;[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, body_file, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, of.err,[m
[31m-                          "%s \"%V\" failed",[m
[31m-                          of.failed, body_file);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("file content size: %d", (int) of.size);[m
[31m-[m
[31m-        parsed_sr->content_length_n = (ssize_t) of.size;[m
[31m-[m
[31m-        b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-        if (b->file == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->file_pos = 0;[m
[31m-        b->file_last = of.size;[m
[31m-[m
[31m-        b->in_file = b->file_last ? 1: 0;[m
[31m-[m
[31m-#if 0[m
[31m-        b->last_buf = (r == r->main) ? 1: 0;[m
[31m-        b->last_in_chain = 1;[m
[31m-#endif[m
[31m-[m
[31m-        b->file->fd = of.fd;[m
[31m-        b->file->name = *body_file;[m
[31m-        b->file->log = r->connection->log;[m
[31m-        b->file->directio = of.is_directio;[m
[31m-[m
[31m-        rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs->buf = b;[m
[31m-        rb->bufs->next = NULL;[m
[31m-        rb->buf = b;[m
[31m-    }[m
[31m-[m
[31m-    parsed_sr->request_body = rb;[m
[31m-[m
[31m-    parsed_sr->method = ngx_http_echo_parse_method_name(&method_name);[m
[31m-    parsed_sr->method_name  = method_name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_adjust_subrequest(ngx_http_request_t *sr,[m
[31m-    ngx_http_echo_subrequest_t *parsed_sr)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_request_body_t    *body;[m
[31m-    ngx_int_t                   rc;[m
[31m-[m
[31m-    sr->method = parsed_sr->method;[m
[31m-    sr->method_name = *(parsed_sr->method_name);[m
[31m-[m
[31m-    if (sr->method == NGX_HTTP_HEAD) {[m
[31m-        sr->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    r = sr->parent;[m
[31m-[m
[31m-    sr->header_in = r->header_in;[m
[31m-[m
[31m-    /* XXX work-around a bug in ngx_http_subrequest */[m
[31m-    if (r->headers_in.headers.last == &r->headers_in.headers.part) {[m
[31m-        sr->headers_in.headers.last = &sr->headers_in.headers.part;[m
[31m-    }[m
[31m-[m
[31m-    /* we do not inherit the parent request's variables */[m
[31m-    cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-    sr->variables = ngx_pcalloc(sr->pool, cmcf->variables.nelts[m
[31m-                                * sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-    if (sr->variables == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    body = parsed_sr->request_body;[m
[31m-    if (body) {[m
[31m-        sr->request_body = body;[m
[31m-[m
[31m-        rc = ngx_http_echo_set_content_length_header(sr, body->buf ?[m
[31m-                                                     ngx_buf_size(body->buf)[m
[31m-                                                     : 0);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("subrequest body: %p", sr->request_body);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_parse_method_name(ngx_str_t **method_name_ptr)[m
[31m-{[m
[31m-    const ngx_str_t     *method_name = *method_name_ptr;[m
[31m-[m
[31m-    switch (method_name->len) {[m
[31m-    case 3:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "GET") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_get_method;[m
[31m-            return NGX_HTTP_GET;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "PUT") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_put_method;[m
[31m-            return NGX_HTTP_PUT;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 4:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "POST") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_post_method;[m
[31m-            return NGX_HTTP_POST;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "HEAD") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_head_method;[m
[31m-            return NGX_HTTP_HEAD;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "COPY") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_copy_method;[m
[31m-            return NGX_HTTP_COPY;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "MOVE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_move_method;[m
[31m-            return NGX_HTTP_MOVE;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "LOCK") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_lock_method;[m
[31m-            return NGX_HTTP_LOCK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 5:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "MKCOL") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_mkcol_method;[m
[31m-            return NGX_HTTP_MKCOL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "TRACE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_trace_method;[m
[31m-            return NGX_HTTP_TRACE;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 6:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "DELETE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_delete_method;[m
[31m-            return NGX_HTTP_DELETE;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "UNLOCK") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_unlock_method;[m
[31m-            return NGX_HTTP_UNLOCK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 7:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "OPTIONS") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_options_method;[m
[31m-            return NGX_HTTP_OPTIONS;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 8:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "PROPFIND") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_propfind_method;[m
[31m-            return NGX_HTTP_PROPFIND;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 9:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "PROPPATCH") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_proppatch_method;[m
[31m-            return NGX_HTTP_PROPPATCH;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* XXX extermely evil and not working yet */[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_abort_parent(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_http_postponed_request_t    *pr, *ppr;[m
[31m-    ngx_http_request_t              *saved_data = NULL;[m
[31m-    ngx_chain_t                     *out = NULL;[m
[31m-    /* ngx_int_t                       rc; */[m
[31m-[m
[31m-    dd("aborting parent...");[m
[31m-[m
[31m-    if (r == r->main || r->parent == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->parent->postponed) {[m
[31m-        dd("Found parent->postponed...");[m
[31m-[m
[31m-        saved_data = r->connection->data;[m
[31m-        ppr = NULL;[m
[31m-        for (pr = r->parent->postponed; pr->next; pr = pr->next) {[m
[31m-            if (pr->request == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (pr->request == r) {[m
[31m-                /* r->parent->postponed->next = pr; */[m
[31m-                dd("found the current subrequest");[m
[31m-                out = pr->out;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* r->connection->data = pr->request; */[m
[31m-            dd("finalizing the subrequest...");[m
[31m-            ngx_http_upstream_create(pr->request);[m
[31m-            pr->request->upstream = NULL;[m
[31m-[m
[31m-            if (ppr == NULL) {[m
[31m-                r->parent->postponed = pr->next;[m
[31m-                ppr = pr->next;[m
[31m-            } else {[m
[31m-                ppr->next = pr->next;[m
[31m-                ppr = pr->next;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->parent->postponed->next = NULL;[m
[31m-[m
[31m-    /*[m
[31m-    r->connection->data = r->parent;[m
[31m-    r->connection->buffered = 0;[m
[31m-[m
[31m-    if (out != NULL) {[m
[31m-        dd("trying to send more stuffs for the parent");[m
[31m-        ngx_http_output_filter(r->parent, out);[m
[31m-    }[m
[31m-    */[m
[31m-[m
[31m-    /* ngx_http_send_special(r->parent, NGX_HTTP_LAST); */[m
[31m-[m
[31m-    if (saved_data) {[m
[31m-        r->connection->data = saved_data;[m
[31m-    }[m
[31m-[m
[31m-    dd("terminating the parent request");[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, NULL /* indicate LAST */);[m
[31m-[m
[31m-    /* ngx_http_upstream_create(r); */[m
[31m-[m
[31m-    /* ngx_http_finalize_request(r->parent, NGX_ERROR); */[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_exec(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_str_t                       *uri;[m
[31m-    ngx_str_t                       *user_args;[m
[31m-    ngx_str_t                        args;[m
[31m-    ngx_uint_t                       flags;[m
[31m-    ngx_str_t                       *computed_arg;[m
[31m-[m
[31m-    computed_arg = computed_args->elts;[m
[31m-[m
[31m-    uri = &computed_arg[0];[m
[31m-[m
[31m-    if (uri->len == 0) {[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    if (computed_args->nelts > 1) {[m
[31m-        user_args = &computed_arg[1];[m
[31m-[m
[31m-    } else {[m
[31m-        user_args = NULL;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_exec sees unsafe uri: \"%V\"",[m
[31m-                       uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && user_args == NULL) {[m
[31m-        user_args = &args;[m
[31m-    }[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    if (uri->data[0] == '@') {[m
[31m-[m
[31m-        if (user_args && user_args->len > 0) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                          "querystring %V ignored when exec'ing named "[m
[31m-                          "location %V", user_args, uri);[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        /* clear the modules contexts */[m
[31m-        ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-#endif[m
[31m-[m
[31m-        dd("named location: %.*s, c:%d", (int) uri->len, uri->data,[m
[31m-           (int) r->main->count);[m
[31m-[m
[31m-        return ngx_http_named_location(r, uri);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_internal_redirect(r, uri, user_args);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_set_content_length_header(ngx_http_request_t *r, off_t len)[m
[31m-{[m
[31m-    ngx_table_elt_t                 *h, *header;[m
[31m-    u_char                          *p;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_http_request_t              *pr;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->key = ngx_http_echo_content_length_header_key;[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    r->headers_in.content_length = h;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->value.data = p;[m
[31m-[m
[31m-    h->value.len = ngx_sprintf(h->value.data, "%O", len) - h->value.data;[m
[31m-[m
[31m-    h->hash = ngx_http_echo_content_length_hash;[m
[31m-[m
[31m-    dd("r content length: %.*s",[m
[31m-       (int) r->headers_in.content_length->value.len,[m
[31m-            r->headers_in.content_length->value.data);[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* forward the parent request's all other request headers */[m
[31m-[m
[31m-    part = &pr->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len == sizeof("Content-Length") - 1[m
[31m-            && ngx_strncasecmp(header[i].key.data, (u_char *) "Content-Length",[m
[31m-                               sizeof("Content-Length") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        h = ngx_list_push(&r->headers_in.headers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *h = header[i];[m
[31m-    }[m
[31m-[m
[31m-    /* XXX maybe we should set those built-in header slot in[m
[31m-     * ngx_http_headers_in_t too? */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.h[m
[1mdeleted file mode 100644[m
[1mindex 61c0a04..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-#ifndef ECHO_SUBREQUEST_H[m
[31m-#define ECHO_SUBREQUEST_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_subrequest(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_subrequest_async(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_abort_parent(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_exec(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-#endif /* ECHO_SUBREQUEST_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_timer.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_timer.c[m
[1mdeleted file mode 100644[m
[1mindex e2777ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_timer.c[m
[1m+++ /dev/null[m
[36m@@ -1,95 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_timer.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-#include <ngx_log.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_timer_elapsed_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t     *ctx;[m
[31m-    ngx_msec_int_t           ms;[m
[31m-    u_char                  *p;[m
[31m-    ngx_time_t              *tp;[m
[31m-    size_t                   size;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_echo_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_echo_module);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->timer_begin.sec == 0) {[m
[31m-        ctx->timer_begin.sec  = r->start_sec;[m
[31m-        ctx->timer_begin.msec = (ngx_msec_t) r->start_msec;[m
[31m-    }[m
[31m-[m
[31m-    /* force the ngx timer to update */[m
[31m-[m
[31m-#if (nginx_version >= 8035) || (nginx_version < 8000 && nginx_version >= 7066)[m
[31m-    ngx_time_update();[m
[31m-#else[m
[31m-    ngx_time_update(0, 0);[m
[31m-#endif[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    dd("old sec msec: %ld %d\n", (long) ctx->timer_begin.sec,[m
[31m-       (int) ctx->timer_begin.msec);[m
[31m-[m
[31m-    dd("new sec msec: %ld %d\n", (long) tp->sec, (int) tp->msec);[m
[31m-[m
[31m-    ms = (ngx_msec_int_t)[m
[31m-             ((tp->sec - ctx->timer_begin.sec) * 1000 +[m
[31m-              (tp->msec - ctx->timer_begin.msec));[m
[31m-    ms = (ms >= 0) ? ms : 0;[m
[31m-[m
[31m-    size = sizeof("-9223372036854775808.000") - 1;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_snprintf(p, size, "%T.%03M", ms / 1000, ms % 1000) - p;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 1;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_reset_timer(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    dd("Exec timer...");[m
[31m-[m
[31m-    /* force the ngx timer to update */[m
[31m-[m
[31m-#if (nginx_version >= 8035) || (nginx_version < 8000 && nginx_version >= 7066)[m
[31m-    ngx_time_update();[m
[31m-#else[m
[31m-    ngx_time_update(0, 0);[m
[31m-#endif[m
[31m-[m
[31m-    ctx->timer_begin = *ngx_timeofday();[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_timer.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_timer.h[m
[1mdeleted file mode 100644[m
[1mindex b6e7ff3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_timer.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef ECHO_TIMER_H[m
[31m-#define ECHO_TIMER_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_timer_elapsed_variable(ngx_http_request_t *r,[m
[31m-        ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_reset_timer(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-#endif /* ECHO_TIMER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_util.c[m
[1mdeleted file mode 100644[m
[1mindex fed0587..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,302 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_sleep.h"[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_http_echo_content_length_hash = 0;[m
[31m-[m
[31m-[m
[31m-ngx_http_echo_ctx_t *[m
[31m-ngx_http_echo_create_ctx(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_echo_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->sleep.handler   = ngx_http_echo_sleep_event_handler;[m
[31m-    ctx->sleep.data      = r;[m
[31m-    ctx->sleep.log       = r->connection->log;[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_eval_cmd_args(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_cmd_t *cmd, ngx_array_t *computed_args,[m
[31m-    ngx_array_t *opts)[m
[31m-{[m
[31m-    unsigned                         expecting_opts = 1;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_array_t                     *args = cmd->args;[m
[31m-    ngx_str_t                       *arg, *raw, *opt;[m
[31m-    ngx_http_echo_arg_template_t    *value;[m
[31m-[m
[31m-    value = args->elts;[m
[31m-[m
[31m-    for (i = 0; i < args->nelts; i++) {[m
[31m-        raw = &value[i].raw_value;[m
[31m-[m
[31m-        if (value[i].lengths == NULL && raw->len > 0) {[m
[31m-            if (expecting_opts) {[m
[31m-                if (raw->len == 1 || raw->data[0] != '-') {[m
[31m-                    expecting_opts = 0;[m
[31m-[m
[31m-                } else if (raw->data[1] == '-') {[m
[31m-                    expecting_opts = 0;[m
[31m-                    continue;[m
[31m-[m
[31m-                } else {[m
[31m-                    opt = ngx_array_push(opts);[m
[31m-                    if (opt == NULL) {[m
[31m-                        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    opt->len = raw->len - 1;[m
[31m-                    opt->data = raw->data + 1;[m
[31m-[m
[31m-                    dd("pushing opt: %.*s", (int) opt->len, opt->data);[m
[31m-[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            expecting_opts = 0;[m
[31m-        }[m
[31m-[m
[31m-        arg = ngx_array_push(computed_args);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].lengths == NULL) { /* does not contain vars */[m
[31m-            dd("Using raw value \"%.*s\"", (int) raw->len, raw->data);[m
[31m-            *arg = *raw;[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_script_run(r, arg, value[i].lengths->elts,[m
[31m-                                    0, value[i].values->elts)[m
[31m-                == NULL)[m
[31m-            {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("pushed arg: %.*s", (int) arg->len, arg->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_send_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t        rc;[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version <= 8004[m
[31m-[m
[31m-        /* earlier versions of nginx does not allow subrequests[m
[31m-            to send last_buf themselves */[m
[31m-        if (r != r->main) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-        if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* FIXME we should udpate chains to recycle chain links and bufs */[m
[31m-    return ngx_http_output_filter(r, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_send_header_if_needed(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_echo_loc_conf_t    *elcf;[m
[31m-[m
[31m-    if (!r->header_sent && !ctx->header_sent) {[m
[31m-        elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-[m
[31m-        r->headers_out.status = (ngx_uint_t) elcf->status;[m
[31m-[m
[31m-        if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-        ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-        rc = ngx_http_send_header(r);[m
[31m-        ctx->header_sent = 1;[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_http_echo_atosz(u_char *line, size_t n)[m
[31m-{[m
[31m-    ssize_t  value;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line == '_') { /* we ignore undercores */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    if (value < 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Modified from the ngx_strlcasestrn function in ngx_string.h[m
[31m- * Copyright (C) by Igor Sysoev */[m
[31m-u_char *[m
[31m-ngx_http_echo_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    last -= n;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (s1 >= last) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_post_request_at_head(ngx_http_request_t *r,[m
[31m-    ngx_http_posted_request_t *pr)[m
[31m-{[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-        if (pr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = r->main->posted_requests;[m
[31m-    r->main->posted_requests = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_echo_rebase_path(ngx_pool_t *pool, u_char *src, size_t osize,[m
[31m-    size_t *nsize)[m
[31m-{[m
[31m-    u_char            *p, *dst;[m
[31m-[m
[31m-    if (osize == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (src[0] == '/') {[m
[31m-        /* being an absolute path already, just add a trailing '\0' */[m
[31m-        *nsize = osize;[m
[31m-[m
[31m-        dst = ngx_palloc(pool, *nsize + 1);[m
[31m-        if (dst == NULL) {[m
[31m-            *nsize = 0;[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(dst, src, osize);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    *nsize = ngx_cycle->prefix.len + osize;[m
[31m-[m
[31m-    dst = ngx_palloc(pool, *nsize + 1);[m
[31m-    if (dst == NULL) {[m
[31m-        *nsize = 0;[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(dst, ngx_cycle->prefix.data, ngx_cycle->prefix.len);[m
[31m-    p = ngx_copy(p, src, osize);[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_flush_postponed_outputs(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r == r->connection->data && r->postponed) {[m
[31m-        /* notify the downstream postpone filter to flush the postponed[m
[31m-         * outputs of the current request */[m
[31m-        return ngx_http_output_filter(r, NULL);[m
[31m-    }[m
[31m-[m
[31m-    /* do nothing */[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_util.h[m
[1mdeleted file mode 100644[m
[1mindex 24b3e15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_ECHO_UTIL_H[m
[31m-#define NGX_HTTP_ECHO_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_echo_strcmp_const(a, b) \[m
[31m-    ngx_strncmp(a, b, sizeof(b) - 1)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_echo_hash_literal(s)                                        \[m
[31m-    ngx_http_echo_hash_str((u_char *) s, sizeof(s) - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_uint_t[m
[31m-ngx_http_echo_hash_str(u_char *src, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    while (n--) {[m
[31m-        key = ngx_hash(key, *src);[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t  ngx_http_echo_content_length_hash;[m
[31m-[m
[31m-[m
[31m-ngx_http_echo_ctx_t *ngx_http_echo_create_ctx(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_echo_eval_cmd_args(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_cmd_t *cmd, ngx_array_t *computed_args,[m
[31m-    ngx_array_t *opts);[m
[31m-ngx_int_t ngx_http_echo_send_header_if_needed(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx);[m
[31m-ngx_int_t ngx_http_echo_send_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_chain_t *cl);[m
[31m-ssize_t ngx_http_echo_atosz(u_char *line, size_t n);[m
[31m-u_char *ngx_http_echo_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n);[m
[31m-ngx_int_t ngx_http_echo_post_request_at_head(ngx_http_request_t *r,[m
[31m-    ngx_http_posted_request_t *pr);[m
[31m-u_char *ngx_http_echo_rebase_path(ngx_pool_t *pool, u_char *src, size_t osize,[m
[31m-    size_t *nsize);[m
[31m-ngx_int_t ngx_http_echo_flush_postponed_outputs(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_ECHO_UTIL_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_var.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_var.c[m
[1mdeleted file mode 100644[m
[1mindex 138a510..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_var.c[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_var.h"[m
[31m-#include "ngx_http_echo_timer.h"[m
[31m-#include "ngx_http_echo_request_info.h"[m
[31m-#include "ngx_http_echo_foreach.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_incr_variable(ngx_http_request_t *r,[m
[31m-        ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t ngx_http_echo_variables[] = {[m
[31m-[m
[31m-    { ngx_string("echo_timer_elapsed"), NULL,[m
[31m-      ngx_http_echo_timer_elapsed_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_request_method"), NULL,[m
[31m-      ngx_http_echo_request_method_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_cacheable_request_uri"), NULL,[m
[31m-      ngx_http_echo_cacheable_request_uri_variable, 0,[m
[31m-      0, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_request_uri"), NULL,[m
[31m-      ngx_http_echo_request_uri_variable, 0,[m
[31m-      0, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_client_request_method"), NULL,[m
[31m-      ngx_http_echo_client_request_method_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_request_body"), NULL,[m
[31m-      ngx_http_echo_request_body_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_client_request_headers"), NULL,[m
[31m-      ngx_http_echo_client_request_headers_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_it"), NULL,[m
[31m-      ngx_http_echo_it_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_incr"), NULL,[m
[31m-      ngx_http_echo_incr_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_response_status"), NULL,[m
[31m-      ngx_http_echo_response_status_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_echo_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_incr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r->main, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->counter++;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_INT_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%ui", ctx->counter) - p;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->not_found = 0;[m
[31m-    v->no_cacheable = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_var.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_var.h[m
[1mdeleted file mode 100644[m
[1mindex 8b24e02b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/src/ngx_http_echo_var.h[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-#ifndef ECHO_VAR_H[m
[31m-#define ECHO_VAR_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_add_variables(ngx_conf_t *cf);[m
[31m-[m
[31m-#endif /* ECHO_VAR_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/abort-parent.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/abort-parent.t[m
[1mdeleted file mode 100644[m
[1mindex 6137607..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/abort-parent.t[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::LWP skip_all =>[m
[31m-    'not working at all';[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /abort {[m
[31m-        echo hello;[m
[31m-        echo_flush;[m
[31m-        echo_location_async '/foo';[m
[31m-        echo_location_async '/bar';[m
[31m-        echo_location_async '/baz';[m
[31m-        echo world;[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass "http://127.0.0.1:$server_port/sleep?$query_string";[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep $arg_sleep;[m
[31m-        echo $arg_echo;[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_location '/proxy?sleep=1&echo=foo';[m
[31m-        #echo_flush;[m
[31m-        echo_abort_parent;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        proxy_pass 'http://127.0.0.1:$server_port/sleep_bar';[m
[31m-    }[m
[31m-[m
[31m-    location /baz {[m
[31m-        proxy_pass 'http://127.0.0.1:$server_port/sleep_baz';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep_bar {[m
[31m-        echo_sleep 2;[m
[31m-        echo bar;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep_baz {[m
[31m-        echo_sleep 3;[m
[31m-        echo baz;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /abort[m
[31m---- response_body[m
[31m-hello[m
[31m-bar[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/blocking-sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/blocking-sleep.t[m
[1mdeleted file mode 100644[m
[1mindex 0bdc6cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/blocking-sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_blocking_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: fractional delay[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: leading echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-before...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: trailing echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-after...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: two echos around sleep[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-before...[m
[31m-after...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: interleaving sleep and echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 1;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo 2;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: interleaving sleep and echo with echo at the end...[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 1;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo 2;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo 3;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: flush before sleep[m
[31m-we didn't really test the actual effect of "echo_flush" here...[m
[31m-merely checks if it croaks if appears.[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        echo hi;[m
[31m-        echo_flush;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo trees;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body[m
[31m-hi[m
[31m-trees[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: flush does not increment opcode pointer itself[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        echo hi;[m
[31m-        echo_flush;[m
[31m-        echo trees;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body[m
[31m-hi[m
[31m-trees[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: blocking sleep by variable[m
[31m---- config[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo before...;[m
[31m-        echo_blocking_sleep $1;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /sleep/0.01[m
[31m---- response_body[m
[31m-before...[m
[31m-after...[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-after-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-after-body.t[m
[1mdeleted file mode 100644[m
[1mindex 44c4c72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-after-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-no_long_string();[m
[31m-log_level('warn');[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: echo after proxy[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        proxy_pass http://127.0.0.1:$server_port$request_uri/more;[m
[31m-    }[m
[31m-    location /echo/more {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: with variables[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body $request_method;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-world[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: w/o args[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"world\n\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: order is not important[m
[31m---- config[m
[31m-    location /reversed {[m
[31m-        echo world;[m
[31m-        echo_after_body hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /reversed[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple echo_after_body instances[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        echo_after_body world;[m
[31m-        echo !;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-![m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple echo_after_body instances with multiple echo cmds[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        echo_after_body world;[m
[31m-        echo i;[m
[31m-        echo say;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-i[m
[31m-say[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: echo-after-body & echo-before-body[m
[31m---- config[m
[31m-    location /mixed {[m
[31m-        echo_before_body hello;[m
[31m-        echo_after_body world;[m
[31m-        echo_before_body hiya;[m
[31m-        echo_after_body igor;[m
[31m-        echo ////////;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /mixed[m
[31m---- response_body[m
[31m-hello[m
[31m-hiya[m
[31m-////////[m
[31m-world[m
[31m-igor[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: echo around proxy[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        echo_before_body world;[m
[31m-        #echo $scheme://$host:$server_port$request_uri/more;[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;[m
[31m-        echo_after_body hiya;[m
[31m-        echo_after_body igor;[m
[31m-    }[m
[31m-    location /echo/more {[m
[31m-        echo blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-blah[m
[31m-hiya[m
[31m-igor[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: with $echo_response_status[m
[31m---- config[m
[31m-    location /status {[m
[31m-        echo_after_body "status: $echo_response_status";[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /status[m
[31m---- response_body_like[m
[31m-.*404 Not Found.*[m
[31m-status: 404$[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: in subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /hello;[m
[31m-    }[m
[31m-    location /hello {[m
[31m-        echo_after_body 'world!';[m
[31m-        echo 'hello';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: echo_after_body + gzip[m
[31m---- config[m
[31m-    gzip             on;[m
[31m-    gzip_min_length  1;[m
[31m-    location /main {[m
[31m-        echo_after_body 'world!';[m
[31m-        echo_duplicate 1024 'hello';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-hello[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: echo_after_body + proxy output[m
[31m---- config[m
[31m-    #gzip             on;[m
[31m-    #gzip_min_length  1;[m
[31m-    location /main {[m
[31m-        echo_after_body 'world';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo_duplicate 10 hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^(?:hello){10}world$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: in subrequests (we get last_in_chain set properly)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /hello;[m
[31m-    }[m
[31m-    location /hello {[m
[31m-        echo 'hello';[m
[31m-        echo_after_body 'world!';[m
[31m-        body_filter_by_lua '[m
[31m-            local eof = ngx.arg[2][m
[31m-            if eof then[m
[31m-                print("lua: eof found in body")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world![m
[31m---- log_level: notice[m
[31m---- error_log[m
[31m-lua: eof found in body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-before-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-before-body.t[m
[1mdeleted file mode 100644[m
[1mindex 1513184..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-before-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,278 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: echo before proxy[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;[m
[31m-    }[m
[31m-    location /echo/more {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: with variables[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body $request_method;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-GET[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: w/o args[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"\nworld\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: order is not important[m
[31m---- config[m
[31m-    location /reversed {[m
[31m-        echo world;[m
[31m-        echo_before_body hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /reversed[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple echo_before_body instances[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        echo_before_body world;[m
[31m-        echo !;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple echo_before_body instances with multiple echo cmds[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        echo_before_body world;[m
[31m-        echo i;[m
[31m-        echo say;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-i[m
[31m-say[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: with $echo_response_status[m
[31m---- config[m
[31m-    location /status {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /status[m
[31m---- response_body_like[m
[31m-status: 404[m
[31m-<html>.*404 Not Found.*$[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: $echo_response_status in echo_before_body in subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location '/status?val=403';[m
[31m-        echo_location '/status?val=500';[m
[31m-    }[m
[31m-    location /status {[m
[31m-        if ($arg_val = 500) {[m
[31m-            echo_before_body "status: $echo_response_status";[m
[31m-            return 500;[m
[31m-            break;[m
[31m-        }[m
[31m-        if ($arg_val = 403) {[m
[31m-            echo_before_body "status: $echo_response_status";[m
[31m-            return 403;[m
[31m-            break;[m
[31m-        }[m
[31m-        return 200;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^status: 403.*?status: 500.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: echo -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n hello;[m
[31m-        echo_before_body -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-helloworld==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: echo a -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body a -n hello;[m
[31m-        echo_before_body b -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-a -n hello[m
[31m-b -n world[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: -n in a var[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $opt -n;[m
[31m-        echo_before_body $opt hello;[m
[31m-        echo_before_body $opt world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello[m
[31m--n world[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: -n only[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n;[m
[31m-        echo_before_body -n;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: -n with an empty string[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n "";[m
[31m-        set $empty "";[m
[31m-        echo_before_body -n $empty;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: -- -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -- -n hello;[m
[31m-        echo_before_body -- -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello[m
[31m--n world[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: -n -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n -n hello;[m
[31m-        echo_before_body -n -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-helloworld==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: -n -- -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n -- -n hello;[m
[31m-        echo_before_body -n -- -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello-n world==[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-duplicate.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-duplicate.t[m
[1mdeleted file mode 100644[m
[1mindex 82b6725..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-duplicate.t[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 3 a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body: aaa[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: abc abc[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 2 abc;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body: abcabc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: big size with underscores[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 10_000 A;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body eval[m
[31m-'A' x 10_000[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: 0 duplicate 0 empty strings[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 0 "";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: 0 duplicate non-empty strings[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 0 "abc";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: duplication of empty strings[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 2 "";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (HEAD)[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 3 a;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /dup[m
[31m---- response_body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-timer.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-timer.t[m
[1mdeleted file mode 100644[m
[1mindex 712524d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo-timer.t[m
[1m+++ /dev/null[m
[36m@@ -1,107 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: timer without explicit reset[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_sleep 0.03;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.0(2[6-9]|3[0-6]) sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: timer without explicit reset and sleep[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.00[0-5] sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: timing accumulated sleeps[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_sleep 0.03;[m
[31m-        echo_sleep 0.02;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.0(4[6-9]|5[0-6]) sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: timer with explicit reset but without sleep[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_reset_timer;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.00[0-5] sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: reset timer between sleeps[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-        echo_reset_timer;[m
[31m-        echo_sleep 0.03;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.0(1[6-9]|2[0-6]) sec\.[m
[31m-elapsed 0\.0(2[6-9]|3[0-6]) sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: reset timer between blocking sleeps[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-        echo_reset_timer;[m
[31m-        echo_blocking_sleep 0.03;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.0(1[6-9]|2[0-9]) sec\.[m
[31m-elapsed 0\.0(2[6-9]|3[0-6]) sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timer without explicit reset[m
[31m---- config[m
[31m-    location = /timer {[m
[31m-        return 200 "$echo_timer_elapsed";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like chop[m
[31m-^0(\.0\d*)$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo.t[m
[1mdeleted file mode 100644[m
[1mindex b181259..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/echo.t[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 6);[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multiple args[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo say hello world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-say hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multiple directive instances[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo say that;[m
[31m-        echo hello;[m
[31m-        echo world !;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-say that[m
[31m-hello[m
[31m-world ![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: echo without arguments[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo;[m
[31m-        echo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"\n\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: escaped newline[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo "hello\nworld";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: escaped tabs and \r and " wihtin "..."[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo "i say \"hello\tworld\"\r";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval: "i say \"hello\tworld\"\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: escaped tabs and \r and " in single quotes[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 'i say \"hello\tworld\"\r';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval: "i say \"hello\tworld\"\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: escaped tabs and \r and " w/o any quotes[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo i say \"hello\tworld\"\r;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval: "i say \"hello\tworld\"\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: escaping $[m
[31m-As of Nginx 0.8.20, there's still no way to escape the '$' character.[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo \$;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-$[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: XSS[m
[31m---- config[m
[31m-    location /blah {[m
[31m-        echo_duplicate 1 "$arg_callback(";[m
[31m-        echo_location_async "/data?$uri";[m
[31m-        echo_duplicate 1 ")";[m
[31m-    }[m
[31m-    location /data {[m
[31m-        echo_duplicate 1 '{"dog":"$query_string"}';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /blah/9999999.json?callback=ding1111111[m
[31m---- response_body chomp[m
[31m-ding1111111({"dog":"/blah/9999999.json"})[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: XSS - filter version[m
[31m---- config[m
[31m-    location /blah {[m
[31m-        echo_before_body "$arg_callback(";[m
[31m-[m
[31m-        echo_duplicate 1 '{"dog":"$uri"}';[m
[31m-[m
[31m-        echo_after_body ")";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /blah/9999999.json?callback=ding1111111[m
[31m---- response_body[m
[31m-ding1111111([m
[31m-{"dog":"/blah/9999999.json"})[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: if[m
[31m---- config[m
[31m-location /first {[m
[31m- echo "before";[m
[31m- echo_location_async /second $request_uri;[m
[31m- echo "after";[m
[31m-}[m
[31m-[m
[31m-location = /second {[m
[31m- if ($query_string ~ '([^?]+)') {[m
[31m-     set $memcached_key $1;  # needing this to be keyed on the request_path, not the entire uri[m
[31m-     echo $memcached_key;[m
[31m- }[m
[31m-}[m
[31m---- request[m
[31m-    GET /first/9999999.json?callback=ding1111111[m
[31m---- response_body[m
[31m-before[m
[31m-/first/9999999.json[m
[31m-after[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: echo -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n hello;[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m-helloworld[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: echo a -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo a -n hello;[m
[31m-        echo b -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-a -n hello[m
[31m-b -n world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: -n in a var[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $opt -n;[m
[31m-        echo $opt hello;[m
[31m-        echo $opt world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello[m
[31m--n world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: -n only[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n;[m
[31m-        echo -n;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: -n with an empty string[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n "";[m
[31m-        set $empty "";[m
[31m-        echo -n $empty;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: -- -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -- -n hello;[m
[31m-        echo -- -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello[m
[31m--n world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: -n -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n -n hello;[m
[31m-        echo -n -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m-helloworld[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: -n -- -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n -- -n hello;[m
[31m-        echo -n -- -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m--n hello-n world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: proxy[m
[31m---- config[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: if is evil[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set $a 3;[m
[31m-        set_by_lua $a '[m
[31m-            if ngx.var.a == "3" then[m
[31m-                return 4[m
[31m-            end[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-4[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: HEAD[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: POST[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /echo[m
[31m-blah blah", "POST /echo[m
[31m-foo bar baz"][m
[31m---- response_body eval[m
[31m-["hello\nworld\n","hello\nworld\n"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: POST[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /echo[m
[31m-blah blah", "POST /echo[m
[31m-foo bar baz"][m
[31m---- response_body eval[m
[31m-["hello\nworld\n","hello\nworld\n"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: empty arg after -n (github issue #33)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $empty "";[m
[31m-        echo -n $empty hello world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body chop[m
[31m- hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: image filter[m
[31m---- config[m
[31m-    location = /gif {[m
[31m-        empty_gif;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        default_type image/gif;[m
[31m-        image_filter resize 10 10;[m
[31m-        set $gif1 '';[m
[31m-        set $gif2 '';[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/gif")[m
[31m-            local data = res.body[m
[31m-            ngx.var.gif1 = string.sub(data, 1, #data - 1)[m
[31m-            ngx.var.gif2 = string.sub(data, #data)[m
[31m-        ';[m
[31m-        echo -n $gif1;[m
[31m-        echo -n $gif2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap[m
[31m-F(ngx_http_image_header_filter) {[m
[31m-    println("image header filter")[m
[31m-}[m
[31m---- stap_out[m
[31m-image header filter[m
[31m---- response_body_like: .[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/exec.t[m
[1mdeleted file mode 100644[m
[1mindex b7c1308..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,228 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exec normal location[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec /bar;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        echo "$echo_request_uri:";[m
[31m-        echo bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/bar:[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: location with args (inlined in uri)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec /bar?a=32;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo "a: [$arg_a]";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a: [32][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: location with args (in separate arg)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec /bar a=56;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo "a: [$arg_a]";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a: [56][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exec named location[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec @bar;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location @bar {[m
[31m-        echo bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: query string ignored for named locations[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec @bar?a=32;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location @bar {[m
[31m-        echo "a: [$arg_a]";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a: [][m
[31m---- error_log[m
[31m-querystring a=32 ignored when exec'ing named location @bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: query string ignored for named locations[m
[31m---- config[m
[31m-  location /foo {[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m-  location @bar {[m
[31m-      echo "uri: [$echo_request_uri]";[m
[31m-  }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-uri: [/foo][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: exec(named location) in subrequests[m
[31m---- config[m
[31m-    location /entry {[m
[31m-        echo_location /foo;[m
[31m-        echo_sleep 0.001;[m
[31m-        echo_location /foo2;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m-  location /foo2 {[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m-[m
[31m-  location @bar {[m
[31m-    proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-  }[m
[31m-  location /bar {[m
[31m-    echo_sleep 0.01;[m
[31m-    echo hello;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /entry[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: exec(normal loctions) in subrequests[m
[31m---- config[m
[31m-    location /entry {[m
[31m-        echo_location /foo;[m
[31m-        echo_sleep 0.001;[m
[31m-        echo_location /foo2;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      echo_exec /baz;[m
[31m-  }[m
[31m-  location /foo2 {[m
[31m-      echo_exec /baz;[m
[31m-  }[m
[31m-[m
[31m-  location /baz {[m
[31m-    proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-  }[m
[31m-  location /bar {[m
[31m-    echo_sleep 0.01;[m
[31m-    echo hello;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /entry[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: exec should clear ctx[m
[31m---- config[m
[31m-    location @bar {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-        echo heh;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      #echo_sleep 0.001;[m
[31m-      echo_reset_timer;[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-heh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: reset ctx[m
[31m---- config[m
[31m-    location @proxy {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo_exec @proxy;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: yield before exec[m
[31m---- config[m
[31m-    location @bar {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-        echo heh;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      echo_sleep 0.001;[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-heh[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/filter-used.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/filter-used.t[m
[1mdeleted file mode 100644[m
[1mindex 2835270..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/filter-used.t[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-no_long_string();[m
[31m-log_level('warn');[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: filter indeed used[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- stap[m
[31m-F(ngx_http_echo_header_filter) {[m
[31m-    println("echo header filter called")[m
[31m-}[m
[31m---- stap_out[m
[31m-echo header filter called[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: filter not used[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        #echo_after_body hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- stap[m
[31m-F(ngx_http_echo_header_filter) {[m
[31m-    println("echo header filter called")[m
[31m-}[m
[31m---- stap_out[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/foreach-split.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/foreach-split.t[m
[1mdeleted file mode 100644[m
[1mindex 266a701..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/foreach-split.t[m
[1m+++ /dev/null[m
[36m@@ -1,283 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_foreach_split '&' $query_string;[m
[31m-            echo_location_async $echo_it;[m
[31m-            echo '/* end */';[m
[31m-        echo_end;[m
[31m-    }[m
[31m-    location /sub/1.css {[m
[31m-        echo "body { font-size: 12pt; }";[m
[31m-    }[m
[31m-    location /sub/2.css {[m
[31m-        echo "table { color: 'red'; }";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?/sub/1.css&/sub/2.css[m
[31m---- response_body[m
[31m-body { font-size: 12pt; }[m
[31m-/* end */[m
[31m-table { color: 'red'; }[m
[31m-/* end */[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: split in a url argument (echo_location_async)[m
[31m---- config[m
[31m-    location /main_async {[m
[31m-        echo_foreach_split ',' $arg_cssfiles;[m
[31m-            echo_location_async $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m-    location /foo.css {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-    location /bar.css {[m
[31m-        echo bar;[m
[31m-    }[m
[31m-    location /baz.css {[m
[31m-        echo baz;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_async?cssfiles=/foo.css,/bar.css,/baz.css[m
[31m---- response_body[m
[31m-foo[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: split in a url argument (echo_location)[m
[31m---- config[m
[31m-    location /main_sync {[m
[31m-        echo_foreach_split ',' $arg_cssfiles;[m
[31m-            echo_location $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m-    location /foo.css {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-    location /bar.css {[m
[31m-        echo bar;[m
[31m-    }[m
[31m-    location /baz.css {[m
[31m-        echo baz;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_sync?cssfiles=/foo.css,/bar.css,/baz.css[m
[31m---- response_body[m
[31m-foo[m
[31m-bar[m
[31m-baz[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: empty loop[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo "start";[m
[31m-        echo_foreach_split ',' $arg_cssfiles;[m
[31m-        echo_end;[m
[31m-        echo "end";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?cssfiles=/foo.css,/bar.css,/baz.css[m
[31m---- response_body[m
[31m-start[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: trailing delimiter[m
[31m---- config[m
[31m-    location /main_t {[m
[31m-        echo_foreach_split ',' $arg_cssfiles;[m
[31m-            echo_location_async $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m-    location /foo.css {[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_t?cssfiles=/foo.css,[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multi-char delimiter[m
[31m---- config[m
[31m-    location /main_sleep {[m
[31m-        echo_foreach_split '-a-' $arg_list;[m
[31m-            echo $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_sleep?list=foo-a-bar-a-baz[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multi-char delimiter (the right way)[m
[31m---- config[m
[31m-    location /main_sleep {[m
[31m-        echo_foreach_split -- '-a-' $arg_list;[m
[31m-            echo $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_sleep?list=foo-a-bar-a-baz[m
[31m---- response_body[m
[31m-foo[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: loop with sleep[m
[31m---- config[m
[31m-    location /main_sleep {[m
[31m-        echo_foreach_split '-' $arg_list;[m
[31m-            echo_sleep 0.001;[m
[31m-            echo $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_sleep?list=foo-a-bar-A-baz[m
[31m---- response_body[m
[31m-foo[m
[31m-a[m
[31m-bar[m
[31m-A[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: empty[m
[31m---- config[m
[31m-  location /merge {[m
[31m-      default_type 'text/javascript';[m
[31m-      echo_foreach_split '&' $query_string;[m
[31m-          echo "/* JS File $echo_it */";[m
[31m-          echo_location_async $echo_it;[m
[31m-          echo;[m
[31m-      echo_end;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /merge[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: single &[m
[31m---- config[m
[31m-  location /merge {[m
[31m-      default_type 'text/javascript';[m
[31m-      echo_foreach_split '&' $query_string;[m
[31m-          echo "/* JS File $echo_it */";[m
[31m-          echo_location_async $echo_it;[m
[31m-          echo;[m
[31m-      echo_end;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /merge?&[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: pure &'s[m
[31m---- config[m
[31m-  location /merge {[m
[31m-      default_type 'text/javascript';[m
[31m-      echo_foreach_split '&' $query_string;[m
[31m-          echo "/* JS File $echo_it */";[m
[31m-          echo_location_async $echo_it;[m
[31m-          echo;[m
[31m-      echo_end;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /merge?&&&[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: pure & and spaces[m
[31m-TODO: needs to uri_decode $echo_it...[m
[31m---- config[m
[31m-  location /merge {[m
[31m-      default_type 'text/javascript';[m
[31m-      echo_foreach_split '&' $query_string;[m
[31m-          echo "/* JS File $echo_it */";[m
[31m-          echo_location_async $echo_it;[m
[31m-          echo;[m
[31m-      echo_end;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /merge?&%20&%20&[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: multiple foreach_split[m
[31m---- config[m
[31m-    location /multi {[m
[31m-        echo_foreach_split '&' $query_string;[m
[31m-            echo [$echo_it];[m
[31m-        echo_end;[m
[31m-[m
[31m-        echo '...';[m
[31m-[m
[31m-        echo_foreach_split '-' $query_string;[m
[31m-            echo [$echo_it];[m
[31m-        echo_end;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /multi?a-b&c-d[m
[31m---- response_body[m
[31m-[a-b][m
[31m-[c-d][m
[31m-...[m
[31m-[a][m
[31m-[b&c][m
[31m-[d][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: github issue #2: setting a variable from $echo_it results to crashing[m
[31m---- config[m
[31m-location = /getFile {[m
[31m-    set $filelist "a,b,c";[m
[31m-    echo_foreach_split ',' $filelist;[m
[31m-    set $file $echo_it;[m
[31m-    echo_subrequest GET '/getFile2' -q 'sha256=$file';[m
[31m-    echo_end;[m
[31m-}[m
[31m-[m
[31m-location = /getFile2 {[m
[31m-    echo "sha256: $arg_sha256";[m
[31m-}[m
[31m---- request[m
[31m-    GET /getFile[m
[31m---- response_body[m
[31m-sha256: [m
[31m-sha256: [m
[31m-sha256: [m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/gzip.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/gzip.t[m
[1mdeleted file mode 100644[m
[1mindex 61eb4f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/gzip.t[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /gzip {[m
[31m-      gzip             on;[m
[31m-      gzip_min_length  10;[m
[31m-      gzip_types       text/plain;[m
[31m-[m
[31m-      echo_duplicate   1000 hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /gzip[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- timeout: 20[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/if.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/if.t[m
[1mdeleted file mode 100644[m
[1mindex 054ec43..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/if.t[m
[1m+++ /dev/null[m
[36m@@ -1,150 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity (hit)[m
[31m---- config[m
[31m-    location ^~ /if {[m
[31m-        set $res miss;[m
[31m-        if ($arg_val ~* '^a') {[m
[31m-            set $res hit;[m
[31m-            echo $res;[m
[31m-        }[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /if?val=abc[m
[31m---- response_body[m
[31m-hit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (miss)[m
[31m---- config[m
[31m-    location ^~ /if {[m
[31m-        set $res miss;[m
[31m-        if ($arg_val ~* '^a') {[m
[31m-            set $res hit;[m
[31m-            echo $res;[m
[31m-        }[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /if?val=bcd[m
[31m---- response_body[m
[31m-miss[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: proxy in if (hit)[m
[31m---- config[m
[31m-    location ^~ /if {[m
[31m-        set $res miss;[m
[31m-        if ($arg_val ~* '^a') {[m
[31m-            set $res hit;[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/foo?res=$res;[m
[31m-        }[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/foo?res=$res;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo "res = $arg_res";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /if?val=abc[m
[31m---- response_body[m
[31m-res = hit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: proxy in if (miss)[m
[31m---- config[m
[31m-    location ^~ /if {[m
[31m-        set $res miss;[m
[31m-        if ($arg_val ~* '^a') {[m
[31m-            set $res hit;[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/foo?res=$res;[m
[31m-        }[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/foo?res=$res;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo "res = $arg_res";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /if?val=bcd[m
[31m---- response_body[m
[31m-res = miss[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: if too long url (hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($request_uri ~ '.{20,}') {[m
[31m-            echo too long;[m
[31m-        }[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?a=12345678901234567890[m
[31m---- response_body[m
[31m-too long[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: if too long url (miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($request_uri ~ '.{20,}') {[m
[31m-            echo too long;[m
[31m-        }[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?a=1234567890[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: echo should be inherited by if blocks[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($uri ~ 'foo') {[m
[31m-        }[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: echo_after_body and echo_before_body should be inherited by if blocks[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($uri ~ 'foo') {[m
[31m-        }[m
[31m-        echo_before_body -n 'hello';[m
[31m-        echo_location /comma;[m
[31m-        echo_after_body 'world';[m
[31m-    }[m
[31m-[m
[31m-    location = /comma {[m
[31m-        internal;[m
[31m-        echo -n ', ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/incr.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/incr.t[m
[1mdeleted file mode 100644[m
[1mindex 8ad6d98..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/incr.t[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo "main pre: $echo_incr";[m
[31m-        echo_location_async /sub;[m
[31m-        echo_location_async /sub;[m
[31m-        echo "main post: $echo_incr";[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub: $echo_incr";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-main pre: 1[m
[31m-sub: 3[m
[31m-sub: 4[m
[31m-main post: 2[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/location-async.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/location-async.t[m
[1mdeleted file mode 100644[m
[1mindex 3494516..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/location-async.t[m
[1m+++ /dev/null[m
[36m@@ -1,439 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: leading echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_location_async /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: leading & trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_location_async /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: multiple subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before sr 1;[m
[31m-        echo_location_async /sub;[m
[31m-        echo after sr 1;[m
[31m-        echo before sr 2;[m
[31m-        echo_location_async /sub;[m
[31m-        echo after sr 2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before sr 1[m
[31m-hello[m
[31m-after sr 1[m
[31m-before sr 2[m
[31m-hello[m
[31m-after sr 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: timed multiple subrequests (blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_location_async /sub1;[m
[31m-        echo_location_async /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.00[0-5] sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timed multiple subrequests (non-blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_location_async /sub1;[m
[31m-        echo_location_async /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.00[0-5] sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: location with args[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: encoded chars in query strings[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub 'foo=a%20b&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a%20b Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: UTF-8 chars in query strings[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub 'foo=你好';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: encoded chars in location url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub%31 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub%31 {[m
[31m-        echo 'sub%31';[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo 'sub1';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: querystring in url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub?foo=Foo&bar=Bar;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: querystring in url *AND* an explicit querystring[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub?foo=Foo&bar=Bar blah=Blah;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar $arg_blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-  Blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: explicit flush in main request[m
[31m-flush won't really flush the buffer...[m
[31m---- config[m
[31m-    location /main_flush {[m
[31m-        echo 'pre main';[m
[31m-        echo_location_async /sub;[m
[31m-        echo 'post main';[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo 'sub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_flush[m
[31m---- response_body[m
[31m-pre main[m
[31m-sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: no varaiable inheritance[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-        echo_location_async /sub;[m
[31m-        echo_location_async /sub2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/main[m
[31m-/sub[m
[31m-/sub2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: unsafe uri[m
[31m---- config[m
[31m-    location /unsafe {[m
[31m-        echo_location_async '/../foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /unsafe[m
[31m---- stap2[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("send header on req %p (header sent: %d)\n", $r, $r->header_sent)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-echo_location_async sees unsafe uri: "/../foo"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: access/deny (access phase handlers skipped in subrequests)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /denied;[m
[31m-    }[m
[31m-    location /denied {[m
[31m-        deny all;[m
[31m-        echo No no no;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-No no no[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: rewrite is honored.[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /rewrite;[m
[31m-    }[m
[31m-    location /rewrite {[m
[31m-        rewrite ^ /foo break;[m
[31m-        echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: let subrequest to read the main request's request body[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, body![m
[31m---- response_body chomp[m
[31m-hello, body![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: leading subrequest & echo_before_body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_before_body hello;[m
[31m-        echo_location_async /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_location_async /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: multiple leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_location_async /foo;[m
[31m-        echo_location_async /bar;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n ' people';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world people);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: sanity (HEAD)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub;[m
[31m-        echo_location_async /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /main[m
[31m---- response_body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/location.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/location.t[m
[1mdeleted file mode 100644[m
[1mindex 48c851e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/location.t[m
[1m+++ /dev/null[m
[36m@@ -1,567 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 2);[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity with proxy in the middle[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: leading echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: leading & trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_location /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before sr 1;[m
[31m-        echo_location /sub;[m
[31m-        echo after sr 1;[m
[31m-        echo before sr 2;[m
[31m-        echo_location /sub;[m
[31m-        echo after sr 2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before sr 1[m
[31m-hello[m
[31m-after sr 1[m
[31m-before sr 2[m
[31m-hello[m
[31m-after sr 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timed multiple subrequests (blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_location /sub1;[m
[31m-        echo_location /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: timed multiple subrequests (non-blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_location /sub1;[m
[31m-        echo_location /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: location with args[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: chained subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_location /sub;[m
[31m-        echo 'post main';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo 'pre sub';[m
[31m-        echo_location /subsub;[m
[31m-        echo 'post sub';[m
[31m-    }[m
[31m-[m
[31m-    location /subsub {[m
[31m-        echo 'subsub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-pre sub[m
[31m-subsub[m
[31m-post sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: chained subrequests using named locations[m
[31m-as of 0.8.20, ngx_http_subrequest still does not support[m
[31m-named location. sigh. this case is a TODO.[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_location @sub;[m
[31m-        echo 'post main';[m
[31m-    }[m
[31m-[m
[31m-    location @sub {[m
[31m-        echo 'pre sub';[m
[31m-        echo_location @subsub;[m
[31m-        echo 'post sub';[m
[31m-    }[m
[31m-[m
[31m-    location @subsub {[m
[31m-        echo 'subsub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-pre sub[m
[31m-subsub[m
[31m-post sub[m
[31m-post main[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: explicit flush in main request[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_location /sub;[m
[31m-        echo 'post main';[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo 'sub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no varaiable inheritance[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-        echo_location /sub;[m
[31m-        echo_location /sub2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/main[m
[31m-/sub[m
[31m-/sub2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: unsafe uri[m
[31m---- config[m
[31m-    location /unsafe {[m
[31m-        echo_location '/../foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /unsafe[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-echo_location sees unsafe uri: "/../foo"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: querystring in url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub?foo=Foo&bar=Bar;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: querystring in url *AND* an explicit querystring[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub?foo=Foo&bar=Bar blah=Blah;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar $arg_blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-  Blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: let subrequest to read the main request's request body[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, body![m
[31m---- response_body chomp[m
[31m-hello, body![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: sleep after location[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-        echo_sleep 0.001;[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub[m
[31m-sub[m
[31m---- skip_nginx: 2: < 0.8.11[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: deep nested echo_location/echo_location_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location /group;[m
[31m-        echo_location_async /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        #echo_sleep 0.001;[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-5[m
[31m-6[m
[31m-7[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: deep nested echo_location/echo_location_async (with sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location /group;[m
[31m-        echo_location_async /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /baz;[m
[31m-        echo_location_async /bah;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/ba[rzh]' {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-5[m
[31m-6[m
[31m-7[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: deep nested echo_location (with sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /group;[m
[31m-        echo_location /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /incr {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/incr;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: leading subrequest & echo_before_body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_before_body hello;[m
[31m-        echo_location /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_location /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: multiple leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_location /foo;[m
[31m-        echo_location /bar;[m
[31m-    }[m
[31m-    location /main2 {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            local res2 = ngx.location.capture("/bar")[m
[31m-            ngx.say(res.body)[m
[31m-            ngx.say(res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n ' people';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world people);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: sanity (HEAD)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /main[m
[31m---- response_body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/mixed.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/mixed.t[m
[1mdeleted file mode 100644[m
[1mindex abf2599..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/mixed.t[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: echo before echo_client_request_headers[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo "headers:";[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"headers:[m
[31m-GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: echo_client_request_headers before echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-        echo "...these are the headers";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-...these are the headers[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: echo & headers & echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo "headers are";[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-        echo "...these are the headers";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"headers are[m
[31m-GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-...these are the headers[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: mixed with echo_duplicate[m
[31m---- config[m
[31m-    location /mixed {[m
[31m-        echo hello;[m
[31m-        echo_duplicate 2 ---;[m
[31m-        echo_duplicate 1 ' END ';[m
[31m-        echo_duplicate 2 ---;[m
[31m-        echo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /mixed[m
[31m---- response_body[m
[31m-hello[m
[31m------- END ------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/request-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/request-body.t[m
[1mdeleted file mode 100644[m
[1mindex d467b2e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/request-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: big client body buffered into temp files[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo[m
[31m-" . 'a' x 4096 . 'end';[m
[31m---- response_body eval[m
[31m-'a' x 4096 . 'end'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: in memory request body (trailing echo)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-        echo done;[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo[m
[31m-hello world[m
[31m---- response_body[m
[31m-hello worlddone[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: big client body buffered into temp files (trailing echo)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-        echo done;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo[m
[31m-" . 'a' x 4096 . "end\n";[m
[31m---- response_body eval[m
[31m-'a' x 4096 . "enddone\n"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/request-info.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/request-info.t[m
[1mdeleted file mode 100644[m
[1mindex 8fd015e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/request-info.t[m
[1m+++ /dev/null[m
[36m@@ -1,841 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 15);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: standalone directive[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multiple instances[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: does not explicitly request_body[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo [$echo_request_body];[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo[m
[31m-body here[m
[31m-heh[m
[31m---- response_body[m
[31m-[][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: let proxy read request_body[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body [$echo_request_body];[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/blah;[m
[31m-    }[m
[31m-    location /blah { echo_duplicate 0 ''; }[m
[31m---- request[m
[31m-POST /echo[m
[31m-body here[m
[31m-heh[m
[31m---- response_body[m
[31m-[body here[m
[31m-heh][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: use echo_read_request_body to read it![m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo [$echo_request_body];[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo[m
[31m-body here[m
[31m-heh[m
[31m---- response_body[m
[31m-[body here[m
[31m-heh][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: how about sleep after that?[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_sleep 0.002;[m
[31m-        echo [$echo_request_body];[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo[m
[31m-body here[m
[31m-heh[m
[31m---- response_body[m
[31m-[body here[m
[31m-heh][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: echo back the whole client request[m
[31m---- config[m
[31m-  # echo back the client request[m
[31m-  location /echoback {[m
[31m-    echo -n $echo_client_request_headers;[m
[31m-    echo_read_request_body;[m
[31m-    echo $echo_request_body;[m
[31m-  }[m
[31m---- request[m
[31m-POST /echoback[m
[31m-body here[m
[31m-haha[m
[31m---- response_body eval[m
[31m-"POST /echoback HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 14\r[m
[31m-\r[m
[31m-body here[m
[31m-haha[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: echo_request_body[m
[31m---- config[m
[31m-    location /body {[m
[31m-      client_body_buffer_size    5;[m
[31m-      echo_read_request_body;[m
[31m-      echo "[$echo_request_body]";[m
[31m-      echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /body[m
[31m-" . ('a' x 2048) . "b"[m
[31m---- response_body eval[m
[31m-"[]\n" .[m
[31m-('a' x 2048) . "b"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: $echo_response_status in content handler[m
[31m---- config[m
[31m-    location /status {[m
[31m-        echo "status: $echo_response_status";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /status[m
[31m---- response_body[m
[31m-status: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: echo_request_body (empty body)[m
[31m---- config[m
[31m-    location /body {[m
[31m-      echo_read_request_body;[m
[31m-      echo_request_body;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /main"[m
[31m---- response_body eval[m
[31m-""[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: small header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: large header[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: small header, with leading CRLF[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: large header, with leading CRLF[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-".[m
[31m-(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: small header, pipelined[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /th"][m
[31m-[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-}, qq{GET /th HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: large header, pipelined[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m-[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-my $headers = (CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n";[m
[31m-[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-$headers},[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-$headers}][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: small header, multi-line header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar baz\r[m
[31m-  blah\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar baz\r[m
[31m-  blah\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: large header, multi-line header[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 50 567;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-my $headers = (CORE::join "\r\n", map { "Header$_: value-$_\r\n hello $_ world blah blah" } 1..512) . "\r\n\r\n";[m
[31m-[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-$headers}[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_\r\n hello $_ world blah blah" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: small header (POST body)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_read_request_body;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: small header (POST body) - in subrequests (location)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: large header (POST body)[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo_read_request_body;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- more_headers eval[m
[31m-CORE::join"\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: large header (POST body) - in subrequests[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo_read_request_body;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join"\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: raw headers - the default header buffer can hold the request line, but not the header entries[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_read_request_body;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-$s .= "Accept: */*\n";[m
[31m-$s .= "Cookie: " . "C" x 1200 . "\n";[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-Accept: */*\r[m
[31m-Cookie: " . ("C" x 1200) . "\r\n\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: small header (POST body) - in subrequests (location_async)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location_async /t;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: small header (POST body) - in subrequests (subrequest)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /t;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: small header (POST body) - in subrequests (subrequest_async)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /t;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (exclusive LF in the request data)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (mixed LF and CRLF in the request data)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (another way of mixing LF and CRLF in the request data)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5[m
[31m-\r[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: two pipelined requests with large headers[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 3 5610;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..585[m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..585) . "\r\n\r\n",[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..585) . "\r\n\r\n",[m
[31m-,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: a request with large header and a smaller pipelined request following[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 2 1921;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m---- more_headers eval[m
[31m-[CORE::join("\n", map { "Header$_: value-$_" } 1..170), "Foo: bar\n"][m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..170) . "\r\n\r\n",[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-},[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: a request with large header and a smaller pipelined request following[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 2 1921;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t" . ("a" x 512)][m
[31m---- more_headers eval[m
[31m-[CORE::join("\n", map { "Header$_: value-$_" } 1..170), "Foo: bar\n"][m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..170) . "\r\n\r\n",[m
[31m-qq{GET /t} . ("a" x 512) . qq{ HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-},[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/sleep.t[m
[1mdeleted file mode 100644[m
[1mindex f8e741e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,200 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: fractional delay[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: leading echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-before...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: trailing echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-after...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: two echos around sleep[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-before...[m
[31m-after...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: interleaving sleep and echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 1;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo 2;[m
[31m-        echo_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: interleaving sleep and echo with echo at the end...[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 1;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo 2;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo 3;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: flush before sleep[m
[31m-we didn't really test the actual effect of "echo_flush" here...[m
[31m-merely checks if it croaks if appears.[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        echo hi;[m
[31m-        echo_flush;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo trees;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body[m
[31m-hi[m
[31m-trees[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: flush does not increment opcode pointer itself[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        echo hi;[m
[31m-        echo_flush;[m
[31m-        echo trees;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body[m
[31m-hi[m
[31m-trees[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sleep through a proxy[m
[31m-this reveals a bug in v0.19 and the bug is fixed in v0.20.[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/entry';[m
[31m-    }[m
[31m-    location /entry {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo done;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /proxy[m
[31m---- response_body_like[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abnormally quit[m
[31m---- config[m
[31m-    location /quit {[m
[31m-        echo before;[m
[31m-        echo_flush;[m
[31m-        echo_sleep 1;[m
[31m-        echo after;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /quit[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: two echos around sleep (HEAD)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: sleep by variable[m
[31m---- config[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo before...;[m
[31m-        echo_sleep $1;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /sleep/0.01[m
[31m---- response_body[m
[31m-before...[m
[31m-after...[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/status.t[m
[1mdeleted file mode 100644[m
[1mindex d97b084..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/status.t[m
[1m+++ /dev/null[m
[36m@@ -1,142 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks());[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: 200[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_status 200;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: if location (200)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-        }[m
[31m-        echo_status 200;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: 404[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_status 404;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: if location (404)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-        }[m
[31m-        echo_status 404;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: 500[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_status 500;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: if location (500)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-        }[m
[31m-        echo_status 500;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: if location (500) no inherit[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            echo_status 503;[m
[31m-        }[m
[31m-        echo_status 500;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 503[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: subrequest[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_location /sub;[m
[31m-        echo_status 503;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo blah blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-blah blah[m
[31m---- error_code: 503[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/subrequest-async.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/subrequest-async.t[m
[1mdeleted file mode 100644[m
[1mindex 882b368..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/subrequest-async.t[m
[1m+++ /dev/null[m
[36m@@ -1,604 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = html_dir;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity - GET[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        echo "main method: $echo_client_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: GET[m
[31m-main method: GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity - DELETE[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async DELETE /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        echo "main method: $echo_client_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: DELETE[m
[31m-main method: GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: leading echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: leading & trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before sr 1;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo after sr 1;[m
[31m-        echo before sr 2;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo after sr 2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before sr 1[m
[31m-hello[m
[31m-after sr 1[m
[31m-before sr 2[m
[31m-hello[m
[31m-after sr 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timed multiple subrequests (blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_subrequest_async GET /sub1;[m
[31m-        echo_subrequest_async GET /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.00[0-5] sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: timed multiple subrequests (non-blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_subrequest_async GET /sub1;[m
[31m-        echo_subrequest_async GET /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.00[0-5] sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: location with args[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub -q 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: encoded chars in query strings[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub -q 'foo=a%20b&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a%20b Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: UTF-8 chars in query strings[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub -q 'foo=你好';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: encoded chars in location url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub%31 -q 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub%31 {[m
[31m-        echo 'sub%31';[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo 'sub1';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: querystring in url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub?foo=Foo&bar=Bar;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: querystring in url *AND* an explicit querystring[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub?foo=Foo&bar=Bar -q blah=Blah;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar $arg_blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-  Blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: explicit flush in main request[m
[31m-flush won't really flush the buffer...[m
[31m---- config[m
[31m-    location /main_flush {[m
[31m-        echo 'pre main';[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo 'post main';[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo 'sub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_flush[m
[31m---- response_body[m
[31m-pre main[m
[31m-sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: POST subrequest with body (with proxy in the middle) and without read body explicitly[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /proxy -b 'hello, world';[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method.";[m
[31m-        # we need to read body explicitly here...or $echo_request_body[m
[31m-        #   will evaluate to empty ("")[m
[31m-        echo "sub body: $echo_request_body.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST.[m
[31m-sub body: .[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: POST subrequest with body (with proxy in the middle) and read body explicitly[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /proxy -b 'hello, world';[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method.";[m
[31m-        # we need to read body explicitly here...or $echo_request_body[m
[31m-        #   will evaluate to empty ("")[m
[31m-        echo_read_request_body;[m
[31m-        echo "sub body: $echo_request_body.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST.[m
[31m-sub body: hello, world.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: multiple subrequests[m
[31m---- config[m
[31m-    location /multi {[m
[31m-        echo_subrequest_async POST '/sub' -q 'foo=Foo' -b 'hi';[m
[31m-        echo_subrequest_async PUT '/sub' -q 'bar=Bar' -b 'hello';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "querystring: $query_string";[m
[31m-        echo "method: $echo_request_method";[m
[31m-        echo "body: $echo_request_body";[m
[31m-        echo "content length: $http_content_length";[m
[31m-        echo '///';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /multi[m
[31m---- response_body[m
[31m-querystring: foo=Foo[m
[31m-method: POST[m
[31m-body: hi[m
[31m-content length: 2[m
[31m-///[m
[31m-querystring: bar=Bar[m
[31m-method: PUT[m
[31m-body: hello[m
[31m-content length: 5[m
[31m-///[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: no varaiable inheritance[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo_subrequest_async GET /sub2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/main[m
[31m-/sub[m
[31m-/sub2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: unsafe uri[m
[31m---- config[m
[31m-    location /unsafe {[m
[31m-        echo_subrequest_async GET '/../foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /unsafe[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-echo_subrequest_async sees unsafe uri: "/../foo"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: let subrequest to read the main request's request body[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, body![m
[31m---- response_body chomp[m
[31m-hello, body![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: POST subrequest with file body (relative paths)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /sub -f html/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: POST subrequest with file body (absolute paths)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /sub -f $TEST_NGINX_HTML_DIR/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world![m
[31m-Haha[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world![m
[31m-Haha[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: POST subrequest with file body (file not found)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /sub -f html/blah/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world[m
[31m---- request[m
[31m-    GET /main[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/open\(\) ".*?" failed/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: POST subrequest with file body (absolute paths in vars)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $path $TEST_NGINX_HTML_DIR/blah.txt;[m
[31m-        echo_subrequest_async POST /sub -f $path;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world![m
[31m-Haha[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world![m
[31m-Haha[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: leading subrequest & echo_before_body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_before_body hello;[m
[31m-        echo_subrequest_async GET /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_subrequest_async GET /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multiple leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_subrequest_async GET /foo;[m
[31m-        echo_subrequest_async GET /bar;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n ' people';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world people);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: sanity (HEAD)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /main[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: HEAD subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async HEAD /sub;[m
[31m-        echo_subrequest_async HEAD /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 6d965d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,725 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = html_dir;[m
[31m-$ENV{TEST_NGINX_CLIENT_PORT} ||= server_port();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: leading echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_subrequest GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: leading & trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: multiple subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before sr 1;[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo after sr 1;[m
[31m-        echo before sr 2;[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo after sr 2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before sr 1[m
[31m-hello[m
[31m-after sr 1[m
[31m-before sr 2[m
[31m-hello[m
[31m-after sr 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: timed multiple subrequests (blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_subrequest GET /sub1;[m
[31m-        echo_subrequest GET /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timed multiple subrequests (non-blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_subrequest GET /sub1;[m
[31m-        echo_subrequest GET /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: location with args[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub -q 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: chained subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo 'post main';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo 'pre sub';[m
[31m-        echo_subrequest GET /subsub;[m
[31m-        echo 'post sub';[m
[31m-    }[m
[31m-[m
[31m-    location /subsub {[m
[31m-        echo 'subsub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-pre sub[m
[31m-subsub[m
[31m-post sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: chained subrequests using named locations[m
[31m-as of 0.8.20, ngx_http_subrequest still does not support[m
[31m-named location. sigh. this case is a TODO.[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_subrequest GET @sub;[m
[31m-        echo 'post main';[m
[31m-    }[m
[31m-[m
[31m-    location @sub {[m
[31m-        echo 'pre sub';[m
[31m-        echo_subrequest GET @subsub;[m
[31m-        echo 'post sub';[m
[31m-    }[m
[31m-[m
[31m-    location @subsub {[m
[31m-        echo 'subsub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-pre sub[m
[31m-subsub[m
[31m-post sub[m
[31m-post main[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: explicit flush in main request[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo 'post main';[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo 'sub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: DELETE subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest DELETE /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        echo "main method: $echo_client_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: DELETE[m
[31m-main method: GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: DELETE subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo "main method: $echo_client_request_method";[m
[31m-        echo_subrequest GET /proxy;[m
[31m-        echo_subrequest DELETE /proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-main method: GET[m
[31m-sub method: GET[m
[31m-sub method: DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: POST subrequest with body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -b 'hello, world';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo "sub body: $echo_request_body";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-sub body: hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: POST subrequest with body (explicitly read the body)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -b 'hello, world';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we call echo_read_client_body explicitly here even[m
[31m-        #   though it's not necessary.[m
[31m-        echo_read_request_body;[m
[31m-        echo "sub body: $echo_request_body";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-sub body: hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: POST subrequest with body (with proxy in the middle) and without read body explicitly[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /proxy -b 'hello, world';[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method.";[m
[31m-        # we need to read body explicitly here...or $echo_request_body[m
[31m-        #   will evaluate to empty ("")[m
[31m-        echo "sub body: $echo_request_body.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST.[m
[31m-sub body: .[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: POST subrequest with body (with proxy in the middle) and read body explicitly[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /proxy -b 'hello, world';[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method.";[m
[31m-        # we need to read body explicitly here...or $echo_request_body[m
[31m-        #   will evaluate to empty ("")[m
[31m-        echo_read_request_body;[m
[31m-        echo "sub body: $echo_request_body.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST.[m
[31m-sub body: hello, world.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: multiple subrequests[m
[31m---- config[m
[31m-    location /multi {[m
[31m-        echo_subrequest POST '/sub' -q 'foo=Foo' -b 'hi';[m
[31m-        echo_subrequest PUT '/sub' -q 'bar=Bar' -b 'hello';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "querystring: $query_string";[m
[31m-        echo "method: $echo_request_method";[m
[31m-        echo "body: $echo_request_body";[m
[31m-        echo "content length: $http_content_length";[m
[31m-        echo '///';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /multi[m
[31m---- response_body[m
[31m-querystring: foo=Foo[m
[31m-method: POST[m
[31m-body: hi[m
[31m-content length: 2[m
[31m-///[m
[31m-querystring: bar=Bar[m
[31m-method: PUT[m
[31m-body: hello[m
[31m-content length: 5[m
[31m-///[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: unsafe uri[m
[31m---- config[m
[31m-    location /unsafe {[m
[31m-        echo_subrequest GET '/../foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /unsafe[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-echo_subrequest sees unsafe uri: "/../foo"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: querystring in url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub?foo=Foo&bar=Bar;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: querystring in url *AND* an explicit querystring[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub?foo=Foo&bar=Bar -q blah=Blah;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar $arg_blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-  Blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: let subrequest to read the main request's request body[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, body![m
[31m---- response_body chomp[m
[31m-hello, body![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: deep nested echo_subrequest/echo_subrequest_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /bar;[m
[31m-        echo_subrequest_async GET /bar;[m
[31m-        echo_subrequest_async GET /bar;[m
[31m-        echo_subrequest GET /group;[m
[31m-        echo_subrequest_async GET /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_subrequest GET /bar;[m
[31m-        echo_subrequest_async GET /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-5[m
[31m-6[m
[31m-7[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: deep nested echo_subrequest/echo_subrequest_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /bar?a;[m
[31m-        echo_subrequest_async GET /bar?b;[m
[31m-        echo_subrequest_async GET /bar?c;[m
[31m-        echo_subrequest GET /group?a=d&b=e;[m
[31m-        echo_subrequest_async GET /group?a=f&b=g;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_subrequest GET /bar?$arg_a;[m
[31m-        echo_subrequest_async GET /bar?$arg_b;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo -n $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body: abcdefg[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: POST subrequest with file body (relative paths)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -f html/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: POST subrequest with file body (absolute paths)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -f $TEST_NGINX_HTML_DIR/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world![m
[31m-Haha[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world![m
[31m-Haha[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: POST subrequest with file body (file not found)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -f html/blah/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world[m
[31m---- request[m
[31m-    GET /main[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/open\(\) ".*?" failed/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: leading subrequest & echo_before_body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_before_body hello;[m
[31m-        echo_subrequest GET /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_subrequest GET /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: multiple leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_subrequest GET /foo;[m
[31m-        echo_subrequest GET /bar;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n ' people';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world people);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: sanity (HEAD)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo_subrequest GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /main[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: POST subrequest to ngx_proxy[m
[31m---- config[m
[31m-    location /hello {[m
[31m-       default_type text/plain;[m
[31m-       echo_subrequest POST '/proxy' -q 'foo=Foo&bar=baz' -b 'request_body=test&test=3';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_CLIENT_PORT/sub;[m
[31m-        #proxy_pass http://127.0.0.1:1113/sub;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo "sub body: $echo_request_body";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /hello[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-sub body: request_body=test&test=3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: HEAD subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest HEAD /sub;[m
[31m-        echo_subrequest HEAD /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: method name as an nginx variable (github issue #34)[m
[31m---- config[m
[31m-  location ~ ^/delay/(?<delay>[0-9.]+)/(?<originalURL>.*)$ {[m
[31m-      # echo_blocking_sleep $delay;[m
[31m-      echo_subrequest '$echo_request_method' '/$originalURL' -q '$args';[m
[31m-  }[m
[31m-[m
[31m-  location /api {[m
[31m-      echo "args: $args";[m
[31m-  }[m
[31m---- request[m
[31m-    GET /delay/0.343/api/?a=b[m
[31m---- response_body[m
[31m-args: a=b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/unused.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/unused.t[m
[1mdeleted file mode 100644[m
[1mindex f3c6e9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/t/unused.t[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (5 * blocks());[m
[31m-[m
[31m-no_long_string();[m
[31m-log_level('warn');[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: filters used[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo world;[m
[31m-        echo_after_body hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo?blah[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m---- error_log[m
[31m-echo header filter, uri "/echo?blah"[m
[31m-echo body filter, uri "/echo?blah"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: filters not used[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo world;[m
[31m-        #echo_after_body hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo?blah[m
[31m---- response_body[m
[31m-world[m
[31m---- no_error_log[m
[31m-echo header filter, uri "/echo?blah"[m
[31m-echo body filter, uri "/echo?blah"[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: (after) filters used (multiple http {} blocks)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo world;[m
[31m-        echo_after_body hello;[m
[31m-    }[m
[31m-[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /echo?blah[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m---- error_log[m
[31m-echo header filter, uri "/echo?blah"[m
[31m-echo body filter, uri "/echo?blah"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: (before) filters used (multiple http {} blocks)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo world;[m
[31m-        echo_before_body hello;[m
[31m-    }[m
[31m-[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /echo?blah[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- error_log[m
[31m-echo header filter, uri "/echo?blah"[m
[31m-echo body filter, uri "/echo?blah"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex d8a2c64..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-#!/usr/bin/env bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-force=$2[m
[31m-home=~[m
[31m-[m
[31m-            #--with-cc=gcc46 \[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:/usr/local/lib" \[m
[31m-            --with-cc-opt="-DDEBUG_MALLOC" \[m
[31m-            --with-http_stub_status_module \[m
[31m-            --with-http_image_filter_module \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root/../eval-nginx-module \[m
[31m-          --add-module=$root/../xss-nginx-module \[m
[31m-          --add-module=$root/../rds-json-nginx-module \[m
[31m-          --add-module=$root/../headers-more-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-          --without-http_ssi_module \[m
[31m-          --with-debug || exit 1[m
[31m-          #--add-module=$root/../lz-session-nginx-module \[m
[31m-          #--add-module=$home/work/ndk \[m
[31m-          #--add-module=$home/work/ndk/examples/http/set_var \[m
[31m-          #--add-module=$root/../eval-nginx-module \[m
[31m-          #--add-module=/home/agentz/work/nginx_eval_module-1.0.1 \[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 0f8e871..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/echo-nginx-module-0.59/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 0975ebd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-util/bench[m
[31m-src/cipher.c[m
[31m-src/cipher.h[m
[31m-pack.sh[m
[31m-t/servroot/[m
[31m-all[m
[31m-build1[0-9][m
[31m-buildroot/[m
[31m-util/wiki2pod.pl[m
[31m-go[m
[31m-build12[m
[31m-Makefile[m
[31m-*.plist[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/config[m
[1mdeleted file mode 100644[m
[1mindex f997d3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/config[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_encrypted_session; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_encrypted_session; please put it before ngx_encrypted_session." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_encrypted_session; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_encrypted_session; please put it before ngx_encrypted_session." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_encrypted_session_module[m
[31m-[m
[31m-HTTP_ENCRYPTED_SESSION_SRCS="                                               \[m
[31m-                    $ngx_addon_dir/src/ngx_http_encrypted_session_module.c  \[m
[31m-                    $ngx_addon_dir/src/ngx_http_encrypted_session_cipher.c  \[m
[31m-                    "[m
[31m-[m
[31m-HTTP_ENCRYPTED_SESSION_DEPS="                                               \[m
[31m-                    $ngx_addon_dir/src/ddebug.h                             \[m
[31m-                    $ngx_addon_dir/src/ngx_http_encrypted_session_cipher.h  \[m
[31m-                    "[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HTTP_ENCRYPTED_SESSION_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_ENCRYPTED_SESSION_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_ENCRYPTED_SESSION_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_ENCRYPTED_SESSION_DEPS"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[31m-#CORE_LIBS="$CORE_LIBS -lssl"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex f156616..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "encrypted-session *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.c[m
[1mdeleted file mode 100644[m
[1mindex e4b09d2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.c[m
[1m+++ /dev/null[m
[36m@@ -1,279 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_encrypted_session_cipher.h"[m
[31m-#include <openssl/evp.h>[m
[31m-#include <openssl/md5.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-static uint64_t ngx_http_encrypted_session_ntohll(uint64_t n);[m
[31m-static uint64_t ngx_http_encrypted_session_htonll(uint64_t n);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_encrypted_session_aes_mac_encrypt(ngx_pool_t *pool, ngx_log_t *log,[m
[31m-    const u_char *iv, size_t iv_len, const u_char *key, size_t key_len,[m
[31m-    const u_char *in, size_t in_len, ngx_uint_t expires, u_char **dst,[m
[31m-    size_t *dst_len)[m
[31m-{[m
[31m-    EVP_CIPHER_CTX           ctx;[m
[31m-    const EVP_CIPHER        *cipher;[m
[31m-    u_char                  *p, *data;[m
[31m-    int                      ret;[m
[31m-    size_t                   block_size, buf_size, data_size;[m
[31m-    int                      len;[m
[31m-    uint64_t                 expires_time;[m
[31m-    time_t                   now;[m
[31m-[m
[31m-    if (key_len != ngx_http_encrypted_session_key_length) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    EVP_CIPHER_CTX_init(&ctx);[m
[31m-[m
[31m-    cipher = EVP_aes_256_cbc();[m
[31m-[m
[31m-    block_size = EVP_CIPHER_block_size(cipher);[m
[31m-[m
[31m-    data_size = in_len + sizeof(expires_time);[m
[31m-[m
[31m-    buf_size = MD5_DIGEST_LENGTH /* for the digest */[m
[31m-               + (data_size + block_size - 1) /* for EVP_EncryptUpdate */[m
[31m-               + block_size; /* for EVP_EncryptFinal */[m
[31m-[m
[31m-    p = ngx_palloc(pool, buf_size + data_size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *dst = p;[m
[31m-[m
[31m-    data = p + buf_size;[m
[31m-[m
[31m-    ngx_memcpy(data, in, in_len);[m
[31m-[m
[31m-    if (expires == 0) {[m
[31m-        expires_time = 0;[m
[31m-    } else {[m
[31m-        now = time(NULL);[m
[31m-        if (now == -1) {[m
[31m-            goto evp_error;[m
[31m-        }[m
[31m-[m
[31m-        expires_time = (uint64_t) now + (uint64_t) expires;[m
[31m-    }[m
[31m-[m
[31m-    dd("expires before encryption: %lld", (long long) expires_time);[m
[31m-[m
[31m-    expires_time = ngx_http_encrypted_session_htonll(expires_time);[m
[31m-[m
[31m-    ngx_memcpy(data + in_len, (u_char *) &expires_time, sizeof(expires_time));[m
[31m-[m
[31m-    MD5(data, data_size, p);[m
[31m-[m
[31m-    p += MD5_DIGEST_LENGTH;[m
[31m-[m
[31m-    ret = EVP_EncryptInit(&ctx, cipher, key, iv);[m
[31m-    if (!ret) {[m
[31m-        goto evp_error;[m
[31m-    }[m
[31m-[m
[31m-    /* encrypt the raw input data */[m
[31m-[m
[31m-    ret = EVP_EncryptUpdate(&ctx, p, &len, data, data_size);[m
[31m-    if (!ret) {[m
[31m-        goto evp_error;[m
[31m-    }[m
[31m-[m
[31m-    p += len;[m
[31m-[m
[31m-    ret = EVP_EncryptFinal(&ctx, p, &len);[m
[31m-    if (!ret) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* XXX we should still explicitly release the ctx[m
[31m-     * or we'll leak memory here */[m
[31m-    EVP_CIPHER_CTX_cleanup(&ctx);[m
[31m-[m
[31m-    p += len;[m
[31m-[m
[31m-    *dst_len = p - *dst;[m
[31m-[m
[31m-    if (*dst_len > buf_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "encrypted_session: aes_mac_encrypt: buffer error");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-evp_error:[m
[31m-[m
[31m-    EVP_CIPHER_CTX_cleanup(&ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_encrypted_session_aes_mac_decrypt(ngx_pool_t *pool, ngx_log_t *log,[m
[31m-    const u_char *iv, size_t iv_len, const u_char *key, size_t key_len,[m
[31m-    const u_char *in, size_t in_len, u_char **dst, size_t *dst_len)[m
[31m-{[m
[31m-    EVP_CIPHER_CTX           ctx;[m
[31m-    const EVP_CIPHER        *cipher;[m
[31m-    int                      ret;[m
[31m-    size_t                   block_size, buf_size;[m
[31m-    int                      len;[m
[31m-    u_char                  *p;[m
[31m-    const u_char            *digest;[m
[31m-    uint64_t                 expires_time;[m
[31m-    time_t                   now;[m
[31m-[m
[31m-    u_char new_digest[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    if (key_len != ngx_http_encrypted_session_key_length[m
[31m-        || in_len < MD5_DIGEST_LENGTH)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    digest = in;[m
[31m-[m
[31m-    EVP_CIPHER_CTX_init(&ctx);[m
[31m-[m
[31m-    cipher = EVP_aes_256_cbc();[m
[31m-[m
[31m-    ret = EVP_DecryptInit(&ctx, cipher, key, iv);[m
[31m-    if (!ret) {[m
[31m-        goto evp_error;[m
[31m-    }[m
[31m-[m
[31m-    block_size = EVP_CIPHER_block_size(cipher);[m
[31m-[m
[31m-    buf_size = in_len + block_size /* for EVP_DecryptUpdate */[m
[31m-               + block_size; /* for EVP_DecryptFinal */[m
[31m-[m
[31m-    p = ngx_palloc(pool, buf_size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *dst = p;[m
[31m-[m
[31m-    ret = EVP_DecryptUpdate(&ctx, p, &len, in + MD5_DIGEST_LENGTH,[m
[31m-                            in_len - MD5_DIGEST_LENGTH);[m
[31m-[m
[31m-    if (!ret) {[m
[31m-        dd("decrypt update failed");[m
[31m-        goto evp_error;[m
[31m-    }[m
[31m-[m
[31m-    p += len;[m
[31m-[m
[31m-    ret = EVP_DecryptFinal(&ctx, p, &len);[m
[31m-[m
[31m-    /* XXX we should still explicitly release the ctx[m
[31m-     * or we'll leak memory here */[m
[31m-    EVP_CIPHER_CTX_cleanup(&ctx);[m
[31m-[m
[31m-    if (!ret) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "failed to decrypt session: bad AES-256 digest");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p += len;[m
[31m-[m
[31m-    *dst_len = p - *dst;[m
[31m-[m
[31m-    if (*dst_len > buf_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "encrypted_session: aes_mac_decrypt: buffer error");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*dst_len < sizeof(expires_time)) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    MD5(*dst, *dst_len, new_digest);[m
[31m-[m
[31m-    if (ngx_strncmp(digest, new_digest, MD5_DIGEST_LENGTH) != 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "failed to decrypt session: MD5 checksum mismatch");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *dst_len -= sizeof(expires_time);[m
[31m-[m
[31m-    dd("dst len: %d", (int) *dst_len);[m
[31m-    dd("dst: %.*s", (int) *dst_len, *dst);[m
[31m-[m
[31m-    p -= sizeof(expires_time);[m
[31m-[m
[31m-    expires_time = ngx_http_encrypted_session_ntohll(*((uint64_t *) p));[m
[31m-[m
[31m-    now = time(NULL);[m
[31m-    if (now == -1) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("expires after decryption: %lld", (long long) expires_time);[m
[31m-[m
[31m-    if (expires_time && expires_time <= (uint64_t) now) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "encrypted_session: session expired: %uL <= %T",[m
[31m-                       expires_time, now);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("decrypted successfully");[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-evp_error:[m
[31m-[m
[31m-    EVP_CIPHER_CTX_cleanup(&ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uint64_t[m
[31m-ngx_http_encrypted_session_ntohll(uint64_t n)[m
[31m-{[m
[31m-#ifdef ntohll[m
[31m-    return ntohll(n);[m
[31m-#else[m
[31m-    return ((uint64_t) ntohl((unsigned long) n) << 32)[m
[31m-           + ntohl((unsigned long) (n >> 32));[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uint64_t[m
[31m-ngx_http_encrypted_session_htonll(uint64_t n)[m
[31m-{[m
[31m-#ifdef htonll[m
[31m-    return htonll(n);[m
[31m-#else[m
[31m-    return ((uint64_t) htonl((unsigned long) n) << 32)[m
[31m-           + htonl((unsigned long) (n >> 32));[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.h[m
[1mdeleted file mode 100644[m
[1mindex 93cc884..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.h[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-#ifndef NGX_HTTP_ENCRYPTED_SESSION_CIPHER_H[m
[31m-#define NGX_HTTP_ENCRYPTED_SESSION_CIPHER_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <openssl/evp.h>[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    ngx_http_encrypted_session_key_length = 256 / 8,[m
[31m-    ngx_http_encrypted_session_iv_length = EVP_MAX_IV_LENGTH[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_encrypted_session_aes_mac_encrypt(ngx_pool_t *pool,[m
[31m-        ngx_log_t *log, const u_char *iv, size_t iv_len, const u_char *key,[m
[31m-        size_t key_len, const u_char *in, size_t in_len,[m
[31m-        ngx_uint_t expires, u_char **dst, size_t *dst_len);[m
[31m-[m
[31m-ngx_int_t ngx_http_encrypted_session_aes_mac_decrypt(ngx_pool_t *pool,[m
[31m-        ngx_log_t *log, const u_char *iv, size_t iv_len, const u_char *key,[m
[31m-        size_t key_len, const u_char *in, size_t in_len, u_char **dst,[m
[31m-        size_t *dst_len);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_ENCRYPTED_SESSION_CIPHER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_module.c[m
[1mdeleted file mode 100644[m
[1mindex 18603d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,352 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_encrypted_session_cipher.h"[m
[31m-[m
[31m-#define ngx_http_encrypted_session_default_iv (u_char *) "deadbeefdeadbeef"[m
[31m-[m
[31m-#define ngx_http_encrypted_session_default_expires 86400[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char              *key;[m
[31m-    u_char              *iv;[m
[31m-    time_t               expires;[m
[31m-[m
[31m-} ngx_http_encrypted_session_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_encode_encrypted_session(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_decode_encrypted_session(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_encrypted_session_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_encrypted_session_iv(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_encrypted_session_expires(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_encrypted_session_create_conf(ngx_conf_t *cf);[m
[31m-[m
[31m-static char *ngx_http_encrypted_session_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static  ndk_set_var_t  ngx_http_set_encode_encrypted_session_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_encode_encrypted_session,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-static  ndk_set_var_t  ngx_http_set_decode_encrypted_session_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_decode_encrypted_session,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_encrypted_session_commands[] = {[m
[31m-    {[m
[31m-        ngx_string("encrypted_session_key"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_encrypted_session_key,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("encrypted_session_iv"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_encrypted_session_iv,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("encrypted_session_expires"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_encrypted_session_expires,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_encrypt_session"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        &ngx_http_set_encode_encrypted_session_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_decrypt_session"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        &ngx_http_set_decode_encrypted_session_filter[m
[31m-    },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_encrypted_session_module_ctx = {[m
[31m-    NULL,                                    /* preconfiguration */[m
[31m-    NULL,                                    /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                    /* create main configuration */[m
[31m-    NULL,                                    /* init main configuration */[m
[31m-[m
[31m-    NULL,                                    /* create server configuration */[m
[31m-    NULL,                                    /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_encrypted_session_create_conf,  /* create location configuration */[m
[31m-    ngx_http_encrypted_session_merge_conf,   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_encrypted_session_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_encrypted_session_module_ctx,  /* module context */[m
[31m-    ngx_http_encrypted_session_commands,     /* module directives */[m
[31m-    NGX_HTTP_MODULE,                         /* module type */[m
[31m-    NULL,                                    /* init master */[m
[31m-    NULL,                                    /* init module */[m
[31m-    NULL,                                    /* init process */[m
[31m-    NULL,                                    /* init thread */[m
[31m-    NULL,                                    /* exit thread */[m
[31m-    NULL,                                    /* exit process */[m
[31m-    NULL,                                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_encode_encrypted_session(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *dst;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    ngx_http_encrypted_session_conf_t      *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_encrypted_session_module);[m
[31m-[m
[31m-    if (conf->key == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                "encrypted_session: a key is required to be "[m
[31m-                "defined by the encrypted_session_key directive");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "encrypted_session: expires=%T", conf->expires);[m
[31m-[m
[31m-    rc = ngx_http_encrypted_session_aes_mac_encrypt(r->pool,[m
[31m-            r->connection->log, conf->iv, ngx_http_encrypted_session_iv_length,[m
[31m-            conf->key, ngx_http_encrypted_session_key_length,[m
[31m-            v->data, v->len, (ngx_uint_t) conf->expires, &dst, &len);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dst = NULL;[m
[31m-        len = 0;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "encrypted_session: failed to encrypt");[m
[31m-    }[m
[31m-[m
[31m-    res->data = dst;[m
[31m-    res->len = len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_decode_encrypted_session(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *dst;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    ngx_http_encrypted_session_conf_t      *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_encrypted_session_module);[m
[31m-[m
[31m-    if (conf->key == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "encrypted_session: a key is required to be "[m
[31m-                      "defined by the encrypted_session_key directive");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_encrypted_session_aes_mac_decrypt(r->pool,[m
[31m-            r->connection->log, conf->iv, ngx_http_encrypted_session_iv_length,[m
[31m-            conf->key, ngx_http_encrypted_session_key_length,[m
[31m-            v->data, v->len, &dst, &len);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dst = NULL;[m
[31m-        len = 0;[m
[31m-    }[m
[31m-[m
[31m-    res->data = dst;[m
[31m-    res->len = len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_encrypted_session_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_http_encrypted_session_conf_t      *llcf = conf;[m
[31m-[m
[31m-    if (llcf->key != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len != ngx_http_encrypted_session_key_length) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "encrypted_session_key: the key must be of %d "[m
[31m-                           "bytes long",[m
[31m-                           ngx_http_encrypted_session_key_length);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->key = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_encrypted_session_iv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_encrypted_session_conf_t  *llcf = conf;[m
[31m-[m
[31m-    if (llcf->iv != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len > ngx_http_encrypted_session_iv_length) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "encrypted_session_iv: the init vector must NOT "[m
[31m-                           "be longer than %d bytes",[m
[31m-                ngx_http_encrypted_session_iv_length);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->iv = ngx_pcalloc(cf->pool,[m
[31m-            ngx_http_encrypted_session_iv_length);[m
[31m-[m
[31m-    if (llcf->iv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX iv max len: %d", (int) ngx_http_encrypted_session_iv_length);[m
[31m-    dd("XXX iv actual len: %d", (int) value[1].len);[m
[31m-[m
[31m-    if (value[1].len) {[m
[31m-        ngx_memcpy(llcf->iv, value[1].data, value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_encrypted_session_expires(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_http_encrypted_session_conf_t  *llcf = conf;[m
[31m-[m
[31m-    if (llcf->expires != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    llcf->expires = ngx_parse_time(&value[1], 1);[m
[31m-[m
[31m-    if (llcf->expires == NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    dd("expires: %d", (int)llcf->expires);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_encrypted_session_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_encrypted_session_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_encrypted_session_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->key     = NGX_CONF_UNSET_PTR;[m
[31m-    conf->iv      = NGX_CONF_UNSET_PTR;[m
[31m-    conf->expires = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_encrypted_session_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_encrypted_session_conf_t *prev = parent;[m
[31m-    ngx_http_encrypted_session_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->key, prev->key, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->iv, prev->iv,[m
[31m-                             ngx_http_encrypted_session_default_iv);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->expires, prev->expires,[m
[31m-                         ngx_http_encrypted_session_default_expires);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 18a7f48..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,318 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 7);[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: key with default iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set $a 'abc';[m
[31m-[m
[31m-        set_encrypt_session $res $a;[m
[31m-[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-[m
[31m-        echo "res = $ppres";[m
[31m-[m
[31m-        set_decrypt_session $b $res;[m
[31m-        echo "b = $b";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /encode[m
[31m---- response_body[m
[31m-res = ktrp3n437q42laejppc9d4bg0jpv0ejie106ooo65od9lf5huhs0====[m
[31m-b = abc[m
[31m---- error_log[m
[31m-encrypted_session: expires=0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: key with custom iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set $a 'abc';[m
[31m-[m
[31m-        set_encrypt_session $res $a;[m
[31m-[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-[m
[31m-        echo "res = $ppres";[m
[31m-[m
[31m-        set_decrypt_session $b $res;[m
[31m-        echo "b = $b";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /encode[m
[31m---- response_body[m
[31m-res = ktrp3n437q42laejppc9d4bg0hul4pmqhc8tn2laae40aakqfoh0====[m
[31m-b = abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: key with custom iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    #encrypted_session_key "abcdefghijklmnopqrstuvwx";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 3;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set $a 'abc';[m
[31m-[m
[31m-        set_encrypt_session $res $a;[m
[31m-[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-[m
[31m-        echo "res = $ppres";[m
[31m-[m
[31m-        set_decrypt_session $b $res;[m
[31m-        echo "b = $b";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /encode[m
[31m---- response_body_like[m
[31m-^res = [0-9a-v=]{30,}[m
[31m-b = abc$[m
[31m---- error_log[m
[31m-encrypted_session: expires=3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: key with custom iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 1d;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set_encrypt_session $res '1234';[m
[31m-        set_encode_base32 $res;[m
[31m-[m
[31m-        echo "res = $res";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /encode[m
[31m---- response_body_like[m
[31m-^res = [0-9a-v=]{30,}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: key with custom iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 1d;[m
[31m-[m
[31m-    location /foo {[m
[31m-        set $uid 1315;[m
[31m-        set_encrypt_session $session $uid;[m
[31m-        set_encode_base32 $session;[m
[31m-[m
[31m-        #echo $session;[m
[31m-        echo_exec /bar _s=$session;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        encrypted_session_expires 30d;[m
[31m-        set_unescape_uri $session $arg__s;[m
[31m-        set_decode_base32 $session;[m
[31m-        set_decrypt_session $uid $session;[m
[31m-        echo $uid;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-1315[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: decoder (bad md5 checksum)[m
[31m-valid: ktrp3n437q42laejppc9d4bg0j0i6np4tdpovhgdum09l7a0rg10====[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 1d;[m
[31m-[m
[31m-    location /decode {[m
[31m-        set_unescape_uri $session $arg__s;[m
[31m-        set_decode_base32 $session;[m
[31m-        set_decrypt_session $uid $session;[m
[31m-        echo '[$uid]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode?_s=3trp3n437q42laejppc9d4bg0j0i6np4tdpovhgdum09l7a0rg10====[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: decoder (bad md5 checksum)[m
[31m-valid: ktrp3n437q42laejppc9d4bg0j0i6np4tdpovhgdum09l7a0rg10====[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 1d;[m
[31m-[m
[31m-    location /decode {[m
[31m-        set_unescape_uri $session $arg__s;[m
[31m-        set_decode_base32 $session;[m
[31m-        set_decrypt_session $uid $session;[m
[31m-        echo '[$uid]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode?_s=ktrp3n437q42laejppc9d4bg0j0i6np4tdpovhgdum09laa0rg10====[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: expired[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 1;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set $a 'abc';[m
[31m-        set_encrypt_session $res $a;[m
[31m-        echo -n $res;[m
[31m-    }[m
[31m-[m
[31m-    location /decode {[m
[31m-        set_decrypt_session $b $args;[m
[31m-        echo "decrypted: $b";[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/encode")[m
[31m-            ngx.sleep(1.1)[m
[31m-            res = ngx.location.capture("/decode?" .. res.body)[m
[31m-            ngx.say(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like[m
[31m-decrypted: [m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/encrypted_session: session expired: \d+ <= \d+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: variable expires with if's (8d)[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location ~* '^/t/(\S+)' {[m
[31m-        set $duration $1;[m
[31m-        set $a 'abc';[m
[31m-        if ($duration = '16d') {[m
[31m-            encrypted_session_expires 16d;[m
[31m-        }[m
[31m-        if ($duration = '8d') {[m
[31m-            encrypted_session_expires 8d;[m
[31m-        }[m
[31m-        if ($duration = '1d') {[m
[31m-            encrypted_session_expires 1d;[m
[31m-        }[m
[31m-        set_encrypt_session $res $a;[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-        add_header "X-Foo" $ppres;[m
[31m-        return 204;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t/8d[m
[31m---- error_code: 204[m
[31m---- response_headers_like chop[m
[31m-X-Foo: [a-z0-9=]+$[m
[31m---- error_log[m
[31m-encrypted_session: expires=691200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: variable expires with if's (1d)[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location ~* '^/t/(\S+)' {[m
[31m-        set $duration $1;[m
[31m-        set $a 'abc';[m
[31m-        if ($duration = '16d') {[m
[31m-            encrypted_session_expires 16d;[m
[31m-        }[m
[31m-        if ($duration = '8d') {[m
[31m-            encrypted_session_expires 8d;[m
[31m-        }[m
[31m-        if ($duration = '1d') {[m
[31m-            encrypted_session_expires 1d;[m
[31m-        }[m
[31m-        set_encrypt_session $res $a;[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-        add_header "X-Foo" $ppres;[m
[31m-        return 204;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t/1d[m
[31m---- error_code: 204[m
[31m---- response_headers_like chop[m
[31m-X-Foo: [a-z0-9=]+$[m
[31m---- error_log[m
[31m-encrypted_session: expires=86400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: variable expires with if's (16d)[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location ~* '^/t/(\S+)' {[m
[31m-        set $duration $1;[m
[31m-        set $a 'abc';[m
[31m-        if ($duration = '16d') {[m
[31m-            encrypted_session_expires 16d;[m
[31m-        }[m
[31m-        if ($duration = '8d') {[m
[31m-            encrypted_session_expires 8d;[m
[31m-        }[m
[31m-        if ($duration = '1d') {[m
[31m-            encrypted_session_expires 1d;[m
[31m-        }[m
[31m-        set_encrypt_session $res $a;[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-        add_header "X-Foo" $ppres;[m
[31m-        return 204;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t/16d[m
[31m---- error_code: 204[m
[31m---- response_headers_like chop[m
[31m-X-Foo: [a-z0-9=]+$[m
[31m---- error_log[m
[31m-encrypted_session: expires=1382400[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 634b6a6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-version=$1[m
[31m-force=$2[m
[31m-[m
[31m-            #--with-cc=gcc46 \[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:/usr/local/lib" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root \[m
[31m-          --with-debug[m
[31m-          #--add-module=$home/work/ndk \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ed9132a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/encrypted-session-nginx-module-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_http_init_request[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:sendmsg[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_pass_open_channel[m
[31m-fun:ngx_start_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-epoll_ctl(event)[m
[31m-fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 59bdf6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-buildroot/[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-go[m
[31m-t/t.sh[m
[31m-t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/util.h[m
[31m-src/util.c[m
[31m-src/processor.h[m
[31m-src/processor.c[m
[31m-src/rds.h[m
[31m-src/utils.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-util/bench[m
[31m-pack[m
[31m-all[m
[31m-build1[0123][m
[31m-Makefile[m
[31m-*.plist[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/config[m
[1mdeleted file mode 100644[m
[1mindex 2c72815..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/config[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_form_input; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_form_input; please put it before ngx_form_input." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_form_input; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_form_input; please put it before ngx_form_input." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-HTTP_FORM_INPUT_SRCS="$ngx_addon_dir/src/ngx_http_form_input_module.c"[m
[31m-HTTP_FORM_INPUT_DEPS="$ngx_addon_dir/src/ddebug.h"[m
[31m-[m
[31m-ngx_addon_name=ngx_http_form_input_module[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HTTP_FORM_INPUT_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_FORM_INPUT_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_FORM_INPUT_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_FORM_INPUT_DEPS"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/src/ddebug.h[m
[1mdeleted file mode 100755[m
[1mindex 3b14190..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "form-input *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-[m
[31m-#       if defined(nginx_version) && nginx_version >= 8011[m
[31m-#           define dd_main_req_count r->main->count[m
[31m-#       else[m
[31m-#           define dd_main_req_count 0[m
[31m-#       endif[m
[31m-[m
[31m-static void dd_enter_helper(ngx_http_request_t *r, const char *func) {[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, ">enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            (int) dd_main_req_count, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static void dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/src/ngx_http_form_input_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/src/ngx_http_form_input_module.c[m
[1mdeleted file mode 100644[m
[1mindex 9aff693..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/src/ngx_http_form_input_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,523 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define form_urlencoded_type "application/x-www-form-urlencoded"[m
[31m-#define form_urlencoded_type_len (sizeof(form_urlencoded_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned        used;  /* :1 */[m
[31m-} ngx_http_form_input_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned          done:1;[m
[31m-    unsigned          waiting_more_body:1;[m
[31m-} ngx_http_form_input_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_form_input(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v);[m
[31m-static char *ngx_http_set_form_input_conf_handler(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_form_input_create_main_conf(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_form_input_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_form_input_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_form_input_post_read(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_form_input_arg(ngx_http_request_t *r, u_char *name,[m
[31m-    size_t len, ngx_str_t *value, ngx_flag_t multi);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_form_input_commands[] = {[m
[31m-[m
[31m-    { ngx_string("set_form_input"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_set_form_input_conf_handler,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("set_form_input_multi"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_set_form_input_conf_handler,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_form_input_module_ctx = {[m
[31m-    NULL,                                   /* preconfiguration */[m
[31m-    ngx_http_form_input_init,               /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_form_input_create_main_conf,   /* create main configuration */[m
[31m-    NULL,                                   /* init main configuration */[m
[31m-[m
[31m-    NULL,                                   /* create server configuration */[m
[31m-    NULL,                                   /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                   /* create location configuration */[m
[31m-    NULL                                    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_form_input_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_form_input_module_ctx,        /* module context */[m
[31m-    ngx_http_form_input_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                        /* module type */[m
[31m-    NULL,                                   /* init master */[m
[31m-    NULL,                                   /* init module */[m
[31m-    NULL,                                   /* init process */[m
[31m-    NULL,                                   /* init thread */[m
[31m-    NULL,                                   /* exit thread */[m
[31m-    NULL,                                   /* exit precess */[m
[31m-    NULL,                                   /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_form_input(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_form_input_ctx_t           *ctx;[m
[31m-    ngx_int_t                            rc;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    dd("set default return value");[m
[31m-    ngx_str_set(res, "");[m
[31m-[m
[31m-    if (r->done) {[m
[31m-        dd("request done");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_form_input_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        dd("ndk handler:null ctx");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->done) {[m
[31m-        dd("ctx not done");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_form_input_arg(r, v->data, v->len, res, 0);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_form_input_multi(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_form_input_ctx_t           *ctx;[m
[31m-    ngx_int_t                            rc;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    dd("set default return value");[m
[31m-    ngx_str_set(res, "");[m
[31m-[m
[31m-    /* dd("set default return value"); */[m
[31m-[m
[31m-    if (r->done) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_form_input_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        dd("ndk handler:null ctx");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->done) {[m
[31m-        dd("ctx not done");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_form_input_arg(r, v->data, v->len, res, 1);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* fork from ngx_http_arg.[m
[31m- * read argument(s) with name arg_name and length arg_len into value variable,[m
[31m- * if multi flag is set, multi arguments with name arg_name will be read and[m
[31m- * stored in an ngx_array_t struct, this can be operated by directives in[m
[31m- * array-var-nginx-module */[m
[31m-static ngx_int_t[m
[31m-ngx_http_form_input_arg(ngx_http_request_t *r, u_char *arg_name, size_t arg_len,[m
[31m-    ngx_str_t *value, ngx_flag_t multi)[m
[31m-{[m
[31m-    u_char              *p, *v, *last, *buf;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    size_t               len = 0;[m
[31m-    ngx_array_t         *array = NULL;[m
[31m-    ngx_str_t           *s;[m
[31m-    ngx_buf_t           *b;[m
[31m-[m
[31m-    if (multi) {[m
[31m-        array = ngx_array_create(r->pool, 1, sizeof(ngx_str_t));[m
[31m-        if (array == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        value->data = (u_char *)array;[m
[31m-        value->len = sizeof(ngx_array_t);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(value, "");[m
[31m-    }[m
[31m-[m
[31m-    /* we read data from r->request_body->bufs */[m
[31m-    if (r->request_body == NULL || r->request_body->bufs == NULL) {[m
[31m-        dd("empty rb or empty rb bufs");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body->bufs->next != NULL) {[m
[31m-        /* more than one buffer...we should copy the data out... */[m
[31m-        len = 0;[m
[31m-        for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (b->in_file) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "form-input: in-file buffer found. aborted. "[m
[31m-                              "consider increasing your "[m
[31m-                              "client_body_buffer_size setting");[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            len += b->last - b->pos;[m
[31m-        }[m
[31m-[m
[31m-        dd("len=%d", (int) len);[m
[31m-[m
[31m-        if (len == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        buf = ngx_palloc(r->pool, len);[m
[31m-        if (buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-        last = p + len;[m
[31m-[m
[31m-        for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-            p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);[m
[31m-        }[m
[31m-[m
[31m-        dd("p - buf = %d, last - buf = %d", (int) (p - buf),[m
[31m-           (int) (last - buf));[m
[31m-[m
[31m-        dd("copied buf (len %d): %.*s", (int) len, (int) len,[m
[31m-           buf);[m
[31m-[m
[31m-    } else {[m
[31m-        dd("XXX one buffer only");[m
[31m-[m
[31m-        b = r->request_body->bufs->buf;[m
[31m-        if (ngx_buf_size(b) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        buf = b->pos;[m
[31m-        last = b->last;[m
[31m-    }[m
[31m-[m
[31m-    for (p = buf; p < last; p++) {[m
[31m-        /* we need '=' after name, so drop one char from last */[m
[31m-[m
[31m-        p = ngx_strlcasestrn(p, last - 1, arg_name, arg_len - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        dd("found argument name, offset: %d", (int) (p - buf));[m
[31m-[m
[31m-        if ((p == buf || *(p - 1) == '&') && *(p + arg_len) == '=') {[m
[31m-            v = p + arg_len + 1;[m
[31m-            dd("v = %d...", (int) (v - buf));[m
[31m-[m
[31m-            dd("buf now (len %d): %.*s",[m
[31m-               (int) (last - v), (int) (last - v), v);[m
[31m-[m
[31m-            p = ngx_strlchr(v, last, '&');[m
[31m-            if (p == NULL) {[m
[31m-                dd("& not found, pointing it to last...");[m
[31m-                p = last;[m
[31m-[m
[31m-            } else {[m
[31m-                dd("found &, pointing it to %d...", (int) (p - buf));[m
[31m-            }[m
[31m-[m
[31m-            if (multi) {[m
[31m-                s = ngx_array_push(array);[m
[31m-                if (s == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                s->data = v;[m
[31m-                s->len = p - v;[m
[31m-                dd("array var:%.*s", (int) s->len, s->data);[m
[31m-[m
[31m-            } else {[m
[31m-                value->data = v;[m
[31m-                value->len = p - v;[m
[31m-                dd("value: [%.*s]", (int) value->len, value->data);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (multi) {[m
[31m-        value->data = (u_char *) array;[m
[31m-        value->len = sizeof(ngx_array_t);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_form_input_conf_handler(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                            filter;[m
[31m-    ngx_str_t                               *value, s;[m
[31m-    u_char                                  *p;[m
[31m-    ngx_http_form_input_main_conf_t         *fmcf;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8042 && nginx_version <= 8053[m
[31m-    return "does not work with " NGINX_VER;[m
[31m-#endif[m
[31m-[m
[31m-    fmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_form_input_module);[m
[31m-[m
[31m-    fmcf->used = 1;[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.size = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if ((value->len == sizeof("set_form_input_multi") - 1) &&[m
[31m-        ngx_strncmp(value->data, "set_form_input_multi", value->len) == 0)[m
[31m-    {[m
[31m-        dd("use ngx_http_form_input_multi");[m
[31m-        filter.func = (void *) ngx_http_set_form_input_multi;[m
[31m-[m
[31m-    } else {[m
[31m-        filter.func = (void *) ngx_http_set_form_input;[m
[31m-    }[m
[31m-[m
[31m-    value++;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        p = value->data;[m
[31m-        p++;[m
[31m-        s.len = value->len - 1;[m
[31m-        s.data = p;[m
[31m-[m
[31m-    } else if (cf->args->nelts == 3) {[m
[31m-        s.len = (value + 1)->len;[m
[31m-        s.data = (value + 1)->data;[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core (cf, value,  &s, &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* register a new rewrite phase handler */[m
[31m-static ngx_int_t[m
[31m-ngx_http_form_input_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-[m
[31m-    ngx_http_handler_pt             *h;[m
[31m-    ngx_http_core_main_conf_t       *cmcf;[m
[31m-    ngx_http_form_input_main_conf_t *fmcf;[m
[31m-[m
[31m-    fmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_form_input_module);[m
[31m-[m
[31m-    if (!fmcf->used) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_form_input_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* an rewrite phase handler */[m
[31m-static ngx_int_t[m
[31m-ngx_http_form_input_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_form_input_ctx_t       *ctx;[m
[31m-    ngx_str_t                        value;[m
[31m-    ngx_int_t                        rc;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http form_input rewrite phase handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_form_input_module);[m
[31m-[m
[31m-    if (ctx != NULL) {[m
[31m-        if (ctx->done) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http form_input rewrite phase handler done");[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (r->method != NGX_HTTP_POST && r->method != NGX_HTTP_PUT) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_type == NULL[m
[31m-        || r->headers_in.content_type->value.data == NULL)[m
[31m-    {[m
[31m-        dd("content_type is %p", r->headers_in.content_type);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    value = r->headers_in.content_type->value;[m
[31m-[m
[31m-    dd("r->headers_in.content_length_n:%d",[m
[31m-       (int) r->headers_in.content_length_n);[m
[31m-[m
[31m-    /* just focus on x-www-form-urlencoded */[m
[31m-[m
[31m-    if (value.len < form_urlencoded_type_len[m
[31m-        || ngx_strncasecmp(value.data, (u_char *) form_urlencoded_type,[m
[31m-                           form_urlencoded_type_len) != 0)[m
[31m-    {[m
[31m-        dd("not application/x-www-form-urlencoded");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    dd("content type is application/x-www-form-urlencoded");[m
[31m-[m
[31m-    dd("create new ctx");[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_form_input_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      ctx->done = 0;[m
[31m-     *      ctx->waiting_more_body = 0;[m
[31m-     */[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_form_input_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http form_input start to read client request body");[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_form_input_post_read);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-        r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ctx->waiting_more_body = 1;[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http form_input has read the request body in one run");[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_form_input_post_read(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_form_input_ctx_t     *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http form_input post read request body");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_form_input_module);[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    dd("count--");[m
[31m-    r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-    dd("waiting more body: %d", (int) ctx->waiting_more_body);[m
[31m-[m
[31m-    /* waiting_more_body my rewrite phase handler */[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        ctx->waiting_more_body = 0;[m
[31m-[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_form_input_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_form_input_main_conf_t    *fmcf;[m
[31m-[m
[31m-    fmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_form_input_main_conf_t));[m
[31m-    if (fmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      fmcf->used = 0;[m
[31m-     */[m
[31m-[m
[31m-    return fmcf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/base.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/base.t[m
[1mdeleted file mode 100755[m
[1mindex 38c0713..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/base.t[m
[1m+++ /dev/null[m
[36m@@ -1,260 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: blank body[m
[31m---- config[m
[31m-    location /bar1 {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar1[m
[31m-[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: key not found[m
[31m---- config[m
[31m-    location /bar2 {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar2[m
[31m-foo[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: key not found[m
[31m---- config[m
[31m-    location /bar3 {[m
[31m-        set_form_input $foo bar3;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar3[m
[31m-foo=[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: basic key=value[m
[31m---- config[m
[31m-    location /bar4 {[m
[31m-        set_form_input $foo foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar4[m
[31m-foo=bar[m
[31m---- response_body[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar5 {[m
[31m-        set_form_input $foo foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar5[m
[31m-&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar6 {[m
[31m-        set_form_input $foo foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar6[m
[31m-foo&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $foo foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-foo=&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&bar[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&bar&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: test for spliter '&' and '='[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&bar=[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: test for spliter '&' and '='[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&bar=foo[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: two keys[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar1 foo1;[m
[31m-        set_form_input $bar2 foo2;[m
[31m-        echo $bar1;[m
[31m-        echo $bar2;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-foo1=bar1&foo2=bar2[m
[31m---- response_body[m
[31m-bar1[m
[31m-bar2[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: GET request[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-GET /bar[m
[31m-bar=foo[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: no content type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m-bar=I have no content type[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 0c3bfce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,177 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 3);[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: charset postfix[m
[31m---- config[m
[31m-    location /bar2 {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded; charset=UTF-8[m
[31m---- request[m
[31m-POST /bar2[m
[31m-bar=32[m
[31m---- response_body[m
[31m-32[m
[31m---- timeout: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test case sensitivity[m
[31m---- config[m
[31m-    location /bar2 {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-Form-UrlencodeD[m
[31m---- request[m
[31m-POST /bar2[m
[31m-bar=32[m
[31m---- response_body[m
[31m-32[m
[31m---- timeout: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: Internal server error when using array_map_op [calio/form-input-nginx-module GH-1][m
[31m-http://github.com/calio/form-input-nginx-module/issues#issue/1[m
[31m---- config[m
[31m-   location ~ ^/(\w+)/(\d+)/?$ {[m
[31m-       set_form_input    $columns;[m
[31m-       set_form_input    $values;[m
[31m-       array_split       ',' $values to=$array;[m
[31m-       array_map_op      set_quote_sql_str $array;[m
[31m-       array_join        ',' $array to=$sql_args;[m
[31m-[m
[31m-       echo $sql_args;[m
[31m-   }[m
[31m---- request[m
[31m-POST /users/1[m
[31m-columns=username,password&values=joe,secret[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- response_body[m
[31m-'joe','secret'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: 100-Continue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded; charset=UTF-8[m
[31m-Expect: 100-Continue[m
[31m---- request[m
[31m-POST /t[m
[31m-bar=32[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set_form_input_multi + missing Content-Type[m
[31m---- config[m
[31m-location /modtest {[m
[31m-        set_form_input_multi $val;[m
[31m-        echo $val;[m
[31m-}[m
[31m---- request[m
[31m-POST /modtest[m
[31m-val=foo&val=bar&val=baz[m
[31m---- response_body eval: "\n"[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad set_form_input + missing Content-Type[m
[31m---- config[m
[31m-location /modtest {[m
[31m-        set_form_input $val foo;[m
[31m-        echo $val;[m
[31m-}[m
[31m---- request[m
[31m-POST /modtest[m
[31m-val=foo&val=bar&val=baz[m
[31m---- response_body eval: "\n"[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: working with if and regex[m
[31m---- config[m
[31m-location /modtest {[m
[31m-        set_form_input $foo foo;[m
[31m-        if ($foo ~* ^ab+c$) {[m
[31m-            echo $foo;[m
[31m-        }[m
[31m-        echo $foo;[m
[31m-        echo done;[m
[31m-}[m
[31m---- request[m
[31m-POST /modtest[m
[31m-val=foo&val=bar&val=baz[m
[31m---- stap2[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("subj: %p\n", $subject);[m
[31m-    printf("len: %d\n", $length);[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- response_body eval: "\ndone\n"[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: content type is not application/x-www-form-urlencoded[m
[31m---- config[m
[31m-location /modtest {[m
[31m-        set_form_input $foo foo;[m
[31m-        if ($foo ~* ^ab+c$) {[m
[31m-            echo $foo;[m
[31m-        }[m
[31m-        echo $foo;[m
[31m-        echo done;[m
[31m-}[m
[31m---- request[m
[31m-POST /modtest[m
[31m-val=foo&val=bar&val=baz[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data[m
[31m---- response_body eval: "\ndone\n"[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex 52d68b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket skip_all => 'not working at all';[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: blank body[m
[31m---- config[m
[31m-    location /bar1 {[m
[31m-        eval_subrequest_in_memory off;[m
[31m-        eval_override_content_type text/plain;[m
[31m-        eval $res {[m
[31m-            default_type text/plain;[m
[31m-            set_form_input $foo bar;[m
[31m-            echo $foo;[m
[31m-        }[m
[31m-        echo [$res];[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar1[m
[31m-bar=3[m
[31m---- response_body[m
[31m-[3][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/multi.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/multi.t[m
[1mdeleted file mode 100644[m
[1mindex 8e0b22a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/multi.t[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-name=calio&somethins&name=agentzh[m
[31m---- response_body[m
[31m-calio agentzh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: combined[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input $foo name;[m
[31m-        set_form_input_multi $bar name;[m
[31m-        array_join ' ' $bar;[m
[31m-        echo $foo;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-name=calio&something&name=agentzh&name=guoying&name=nobody&name=somebody[m
[31m---- response_body[m
[31m-calio[m
[31m-calio agentzh guoying nobody somebody[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: blank body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not fit[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-a=b&c=d&e=f&g=h&i=j&k=l[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: not fit 2[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-somename&name1=calio&sirname=calio[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: single value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-some=some&name=calio&any=any[m
[31m---- response_body[m
[31m-calio[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: inplace[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $name;[m
[31m-        array_join ' ' $name;[m
[31m-        echo $name;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-name=calio&name=agentzh[m
[31m---- response_body[m
[31m-calio agentzh[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/put.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/put.t[m
[1mdeleted file mode 100644[m
[1mindex e294aa4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/put.t[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;# skip_all => 'not working now';[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input $foo name;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-name=calio[m
[31m---- response_body[m
[31m-calio[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input $foo name;[m
[31m-        set_form_input_multi $bar name;[m
[31m-        array_join ' ' $bar;[m
[31m-        echo $foo;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-PUT /foo[m
[31m-name=calio&name=agentzh[m
[31m---- response_body[m
[31m-calio[m
[31m-calio agentzh[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/upload.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/upload.t[m
[1mdeleted file mode 100644[m
[1mindex e14ccf7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/t/upload.t[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: big upload[m
[31m---- config[m
[31m-    location /bar1 {[m
[31m-        client_max_body_size 1m;[m
[31m-        client_body_buffer_size  1m;[m
[31m-        set_form_input $data;[m
[31m-        set_unescape_uri $data;[m
[31m-        echo $data;[m
[31m-        #echo_read_request_body;[m
[31m-        #echo_request_body;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar1[m
[31m-file=abc.csv&data=asdfaaa你sfsd在你脞办夺要你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好[m
[31m---- response_body[m
[31m-asdfaaa你sfsd在你脞办夺要你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 0dd9623..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-[m
[31m-version=$1[m
[31m-force=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-  --with-cc-opt="-O0" \[m
[31m-    --without-mail_pop3_module \[m
[31m-    --without-mail_imap_module \[m
[31m-    --without-mail_smtp_module \[m
[31m-    --without-http_upstream_ip_hash_module \[m
[31m-    --without-http_empty_gif_module \[m
[31m-    --without-http_memcached_module \[m
[31m-    --without-http_referer_module \[m
[31m-    --without-http_autoindex_module \[m
[31m-    --without-http_auth_basic_module \[m
[31m-    --without-http_userid_module \[m
[31m-  --add-module=$root/../echo-nginx-module \[m
[31m-  --add-module=$root/../ndk-nginx-module \[m
[31m-  --add-module=$root $opts \[m
[31m-  --add-module=$root/../set-misc-nginx-module \[m
[31m-  --add-module=$root/../array-var-nginx-module \[m
[31m-  --with-debug[m
[31m-  #--add-module=$home/work/ndk \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 724034e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/form-input-nginx-module-0.12/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-{[m
[31m-   epoll_ctl[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 39c82fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-reindex[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[78][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-genmobi.sh[m
[31m-*.mobi[m
[31m-misc/chunked[m
[31m-src/headers.c[m
[31m-src/headers.h[m
[31m-src/module.c[m
[31m-src/module.h[m
[31m-src/util.c[m
[31m-src/util.h[m
[31m-go[m
[31m-ctags[m
[31m-src/in.c[m
[31m-src/in.h[m
[31m-src/out.c[m
[31m-src/out.h[m
[31m-build[89][m
[31m-build1[0-9][m
[31m-buildroot/[m
[31m-work/[m
[31m-all[m
[31m-t/servroot[m
[31m-analyze[m
[31m-cov[m
[31m-nginx[m
[31m-*.plist[m
[31m-a.patch[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 700a50f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - LUAJIT_LIB=/usr/lib64/libluajit-5.1.so[m
[31m-    - LUAJIT_INC=/usr/include/luajit-2.0[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-    - NGINX_VERSION=1.8.1[m
[31m-[m
[31m-before_install:[m
[31m-  - sudo apt-get install -qq -y cpanminus libluajit-5.1-dev[m
[31m-  - sudo cpanm -v --notest Test::Nginx > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-[m
[31m-install:[m
[31m-  - wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && tar -xzf nginx-${NGINX_VERSION}.tar.gz[m
[31m-  - git clone https://github.com/openresty/echo-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/lua-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/nginx-eval-module.git[m
[31m-[m
[31m-script:[m
[31m-  - cd nginx-${NGINX_VERSION}/[m
[31m-  -  ./configure --with-debug --with-pcre --with-pcre-jit --with-http_dav_module --add-module=../nginx-eval-module --add-module=../lua-nginx-module --add-module=../echo-nginx-module --add-module=.. > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j2 > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - export PATH=$PATH:`pwd`/objs[m
[31m-  - cd ..[m
[31m-  - prove -lv t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/config[m
[1mdeleted file mode 100644[m
[1mindex 5707cc4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/config[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_headers_more_filter_module[m
[31m-[m
[31m-HEADERS_MORE_SRCS="                                                         \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_filter_module.c    \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_out.c      \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_in.c       \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_util.c             \[m
[31m-                "[m
[31m-[m
[31m-HEADERS_MORE_DEPS="                                                         \[m
[31m-                $ngx_addon_dir/src/ddebug.h                                 \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_filter_module.h    \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_in.h       \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_out.h      \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_in.h       \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_util.h             \[m
[31m-                "[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HEADERS_MORE_DEPS"[m
[31m-    ngx_module_srcs="$HEADERS_MORE_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HEADERS_MORE_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HEADERS_MORE_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 13879af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,124 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "headers-more *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-#       if defined(nginx_version) && nginx_version >= 8011[m
[31m-#           define dd_main_req_count r->main->count[m
[31m-#       else[m
[31m-#           define dd_main_req_count 0[m
[31m-#       endif[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd_enter_helper(ngx_http_request_t *r, const char *func)[m
[31m-{[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, "headers-more *** enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            (int) dd_main_req_count, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 0bb6fec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,348 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_filter_module.h"[m
[31m-#include "ngx_http_headers_more_headers_out.h"[m
[31m-#include "ngx_http_headers_more_headers_in.h"[m
[31m-#include "ngx_http_headers_more_util.h"[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-/* config handlers */[m
[31m-[m
[31m-static void *ngx_http_headers_more_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_headers_more_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static void *ngx_http_headers_more_create_main_conf(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_headers_more_post_config(ngx_conf_t *cf);[m
[31m-[m
[31m-/* post-read-phase handler */[m
[31m-[m
[31m-static ngx_int_t ngx_http_headers_more_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-/* filter handlers */[m
[31m-[m
[31m-static ngx_int_t ngx_http_headers_more_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-ngx_uint_t  ngx_http_headers_more_location_hash = 0;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_headers_more_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("more_set_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_1MORE,[m
[31m-      ngx_http_headers_more_set_headers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-    { ngx_string("more_clear_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_1MORE,[m
[31m-      ngx_http_headers_more_clear_headers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-    { ngx_string("more_set_input_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_1MORE,[m
[31m-      ngx_http_headers_more_set_input_headers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-    { ngx_string("more_clear_input_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_1MORE,[m
[31m-      ngx_http_headers_more_clear_input_headers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_headers_more_filter_module_ctx = {[m
[31m-    NULL,                                   /* preconfiguration */[m
[31m-    ngx_http_headers_more_post_config,      /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_headers_more_create_main_conf, /* create main configuration */[m
[31m-    NULL,                                   /* init main configuration */[m
[31m-[m
[31m-    NULL,                                   /* create server configuration */[m
[31m-    NULL,                                   /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_headers_more_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_http_headers_more_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_headers_more_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_headers_more_filter_module_ctx,   /* module context */[m
[31m-    ngx_http_headers_more_filter_commands,      /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_headers_more_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_http_headers_more_loc_conf_t    *conf;[m
[31m-    ngx_http_headers_more_cmd_t         *cmd;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "headers more header filter, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    if (conf->cmds) {[m
[31m-        cmd = conf->cmds->elts;[m
[31m-        for (i = 0; i < conf->cmds->nelts; i++) {[m
[31m-            if (cmd[i].is_input) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_headers_more_exec_cmd(r, &cmd[i]);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_headers_more_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_headers_more_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_headers_more_loc_conf_t    *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_headers_more_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->cmds = NULL;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_more_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_uint_t                           orig_len;[m
[31m-    ngx_http_headers_more_cmd_t         *prev_cmd, *cmd;[m
[31m-    ngx_http_headers_more_loc_conf_t    *prev = parent;[m
[31m-    ngx_http_headers_more_loc_conf_t    *conf = child;[m
[31m-[m
[31m-    if (conf->cmds == NULL || conf->cmds->nelts == 0) {[m
[31m-        conf->cmds = prev->cmds;[m
[31m-[m
[31m-    } else if (prev->cmds && prev->cmds->nelts) {[m
[31m-        orig_len = conf->cmds->nelts;[m
[31m-[m
[31m-        (void) ngx_array_push_n(conf->cmds, prev->cmds->nelts);[m
[31m-[m
[31m-        cmd = conf->cmds->elts;[m
[31m-[m
[31m-        for (i = 0; i < orig_len; i++) {[m
[31m-            cmd[conf->cmds->nelts - 1 - i] = cmd[orig_len - 1 - i];[m
[31m-        }[m
[31m-[m
[31m-        prev_cmd = prev->cmds->elts;[m
[31m-[m
[31m-        for (i = 0; i < prev->cmds->nelts; i++) {[m
[31m-            cmd[i] = prev_cmd[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_post_config(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                              multi_http_blocks;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_handler_pt             *h;[m
[31m-    ngx_http_core_main_conf_t       *cmcf;[m
[31m-[m
[31m-    ngx_http_headers_more_main_conf_t       *hmcf;[m
[31m-[m
[31m-    ngx_http_headers_more_location_hash =[m
[31m-                               ngx_http_headers_more_hash_literal("location");[m
[31m-[m
[31m-    hmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                         ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    if (ngx_http_headers_more_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_headers_more_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || hmcf->requires_filter) {[m
[31m-        rc = ngx_http_headers_more_filter_init(cf);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!hmcf->requires_handler) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_headers_more_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_http_headers_more_loc_conf_t    *conf;[m
[31m-    ngx_http_headers_more_main_conf_t   *hmcf;[m
[31m-    ngx_http_headers_more_cmd_t         *cmd;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "headers more rewrite handler, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    hmcf = ngx_http_get_module_main_conf(r,[m
[31m-                                         ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    if (!hmcf->postponed_to_phase_end) {[m
[31m-        ngx_http_core_main_conf_t       *cmcf;[m
[31m-        ngx_http_phase_handler_t         tmp;[m
[31m-        ngx_http_phase_handler_t        *ph;[m
[31m-        ngx_http_phase_handler_t        *cur_ph;[m
[31m-        ngx_http_phase_handler_t        *last_ph;[m
[31m-[m
[31m-        hmcf->postponed_to_phase_end = 1;[m
[31m-[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ph = cmcf->phase_engine.handlers;[m
[31m-        cur_ph = &ph[r->phase_handler];[m
[31m-        last_ph = &ph[cur_ph->next - 1];[m
[31m-[m
[31m-        if (cur_ph < last_ph) {[m
[31m-            dd("swaping the contents of cur_ph and last_ph...");[m
[31m-[m
[31m-            tmp = *cur_ph;[m
[31m-[m
[31m-            memmove(cur_ph, cur_ph + 1,[m
[31m-                    (last_ph - cur_ph) * sizeof (ngx_http_phase_handler_t));[m
[31m-[m
[31m-            *last_ph = tmp;[m
[31m-[m
[31m-            r->phase_handler--; /* redo the current ph */[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("running phase handler...");[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    if (conf->cmds) {[m
[31m-        if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        cmd = conf->cmds->elts;[m
[31m-        for (i = 0; i < conf->cmds->nelts; i++) {[m
[31m-            if (!cmd[i].is_input) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_headers_more_exec_input_cmd(r, &cmd[i]);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_headers_more_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_headers_more_main_conf_t    *hmcf;[m
[31m-[m
[31m-    hmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_headers_more_main_conf_t));[m
[31m-    if (hmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      hmcf->postponed_to_phase_end = 0;[m
[31m-     *      hmcf->requires_filter        = 0;[m
[31m-     *      hmcf->requires_handler       = 0;[m
[31m-     */[m
[31m-[m
[31m-    return hmcf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.h[m
[1mdeleted file mode 100644[m
[1mindex 72a5317..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,80 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_HEADERS_MORE_FILTER_MODULE_H[m
[31m-#define NGX_HTTP_HEADERS_MORE_FILTER_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <assert.h>[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_headers_more_opcode_set,[m
[31m-    ngx_http_headers_more_opcode_clear[m
[31m-} ngx_http_headers_more_opcode_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                       *types; /* of ngx_str_t */[m
[31m-    ngx_array_t                       *statuses; /* of ngx_uint_t */[m
[31m-    ngx_array_t                       *headers; /* of ngx_http_header_val_t */[m
[31m-    ngx_flag_t                         is_input;[m
[31m-} ngx_http_headers_more_cmd_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t             *cmds; /* of ngx_http_headers_more_cmd_t */[m
[31m-} ngx_http_headers_more_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t              postponed_to_phase_end;[m
[31m-    ngx_int_t              requires_filter;[m
[31m-    ngx_int_t              requires_handler;[m
[31m-} ngx_http_headers_more_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_headers_more_header_val_s[m
[31m-    ngx_http_headers_more_header_val_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_headers_more_set_header_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                               name;[m
[31m-    ngx_uint_t                              offset;[m
[31m-    ngx_http_headers_more_set_header_pt     handler;[m
[31m-} ngx_http_headers_more_set_header_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_headers_more_header_val_s {[m
[31m-    ngx_http_complex_value_t                value;[m
[31m-    ngx_uint_t                              hash;[m
[31m-    ngx_str_t                               key;[m
[31m-    ngx_http_headers_more_set_header_pt     handler;[m
[31m-    ngx_uint_t                              offset;[m
[31m-    ngx_flag_t                              replace;[m
[31m-    ngx_flag_t                              wildcard;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_headers_more_filter_module;[m
[31m-[m
[31m-[m
[31m-#ifndef ngx_str_set[m
[31m-#define ngx_str_set(str, text)                                               \[m
[31m-        (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_http_headers_more_assert(a)  assert(a)[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_HEADERS_MORE_FILTER_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.c[m
[1mdeleted file mode 100644[m
[1mindex 2d5c873..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.c[m
[1m+++ /dev/null[m
[36m@@ -1,872 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_headers_in.h"[m
[31m-#include "ngx_http_headers_more_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_headers_more_parse_directive(ngx_conf_t *cf,[m
[31m-    ngx_command_t *ngx_cmd, void *conf,[m
[31m-    ngx_http_headers_more_opcode_t opcode);[m
[31m-static int ngx_http_headers_more_check_type(ngx_http_request_t *r,[m
[31m-    ngx_array_t *types);[m
[31m-static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header);[m
[31m-static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_user_agent_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_host_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_connection_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_headers_more_validate_host(ngx_str_t *host,[m
[31m-    ngx_pool_t *pool, ngx_uint_t alloc);[m
[31m-[m
[31m-[m
[31m-static ngx_http_headers_more_set_header_t ngx_http_headers_more_set_handlers[][m
[31m-        = {[m
[31m-[m
[31m-    { ngx_string("Host"),[m
[31m-                 offsetof(ngx_http_headers_in_t, host),[m
[31m-                 ngx_http_set_host_header },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 offsetof(ngx_http_headers_in_t, connection),[m
[31m-                 ngx_http_set_connection_header },[m
[31m-[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_modified_since),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 9002[m
[31m-    { ngx_string("If-Unmodified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_unmodified_since),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003003[m
[31m-    { ngx_string("If-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_match),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("If-None-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_none_match),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("User-Agent"),[m
[31m-                 offsetof(ngx_http_headers_in_t, user_agent),[m
[31m-                 ngx_http_set_user_agent_header },[m
[31m-[m
[31m-    { ngx_string("Referer"),[m
[31m-                 offsetof(ngx_http_headers_in_t, referer),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_length),[m
[31m-                 ngx_http_set_content_length_header },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_type),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("If-Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, transfer_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Expect"),[m
[31m-                 offsetof(ngx_http_headers_in_t, expect),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003013[m
[31m-    { ngx_string("Upgrade"),[m
[31m-                 offsetof(ngx_http_headers_in_t, upgrade),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Accept-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Via"), offsetof(ngx_http_headers_in_t, via),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Authorization"),[m
[31m-                 offsetof(ngx_http_headers_in_t, authorization),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 offsetof(ngx_http_headers_in_t, keep_alive),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("X-Forwarded-For"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_forwarded_for),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    { ngx_string("X-Real-IP"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_real_ip),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    { ngx_string("Depth"), offsetof(ngx_http_headers_in_t, depth),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Overwrite"), offsetof(ngx_http_headers_in_t, overwrite),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Cookie"),[m
[31m-                 offsetof(ngx_http_headers_in_t, cookies),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, ngx_http_set_header }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_exec_input_cmd(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_cmd_t *cmd)[m
[31m-{[m
[31m-    ngx_str_t                                    value;[m
[31m-    ngx_http_headers_more_header_val_t          *h;[m
[31m-    ngx_uint_t                                   i;[m
[31m-[m
[31m-    if (!cmd->headers) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->types && !ngx_http_headers_more_check_type(r, cmd->types)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h = cmd->headers->elts;[m
[31m-    for (i = 0; i < cmd->headers->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value.len) {[m
[31m-            value.len--;  /* remove the trailing '\0' added by[m
[31m-                             ngx_http_headers_more_parse_header */[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].handler(r, &h[i], &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h, *matched;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_uint_t                   rc;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    matched = NULL;[m
[31m-[m
[31m-retry:[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-        dd("i: %d, part: %p", (int) i, part);[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].key.len == hv->key.len[m
[31m-            && ngx_strncasecmp(h[i].key.data, hv->key.data,[m
[31m-                               h[i].key.len) == 0)[m
[31m-        {[m
[31m-            if (value->len == 0 || (matched && matched != &h[i])) {[m
[31m-                h[i].hash = 0;[m
[31m-[m
[31m-                rc = ngx_http_headers_more_rm_header_helper([m
[31m-                                            &r->headers_in.headers, part, i);[m
[31m-[m
[31m-                ngx_http_headers_more_assert([m
[31m-                    !(r->headers_in.headers.part.next == NULL[m
[31m-                      && r->headers_in.headers.last[m
[31m-                         != &r->headers_in.headers.part));[m
[31m-[m
[31m-                if (rc == NGX_OK) {[m
[31m-                    if (output_header) {[m
[31m-                        *output_header = NULL;[m
[31m-                    }[m
[31m-[m
[31m-                    goto retry;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h[i].value = *value;[m
[31m-[m
[31m-            if (output_header) {[m
[31m-                *output_header = &h[i];[m
[31m-                dd("setting existing builtin input header");[m
[31m-            }[m
[31m-[m
[31m-            if (matched == NULL) {[m
[31m-                matched = &h[i];[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (matched) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0 || hv->replace) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("created new header for %.*s", (int) hv->key.len, hv->key.data);[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        h->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    if (output_header) {[m
[31m-        *output_header = h;[m
[31m-[m
[31m-        while (r != r->main) {[m
[31m-            r->parent->headers_in = r->headers_in;[m
[31m-            r = r->parent;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h, **old;[m
[31m-[m
[31m-    dd("entered set_builtin_header (input)");[m
[31m-[m
[31m-    if (hv->offset) {[m
[31m-        old = (ngx_table_elt_t **) ((char *) &r->headers_in + hv->offset);[m
[31m-[m
[31m-    } else {[m
[31m-        old = NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("old builtin ptr ptr: %p", old);[m
[31m-    if (old) {[m
[31m-        dd("old builtin ptr: %p", *old);[m
[31m-    }[m
[31m-[m
[31m-    if (old == NULL || *old == NULL) {[m
[31m-        dd("set normal header");[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old);[m
[31m-    }[m
[31m-[m
[31m-    h = *old;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-        h->value = *value;[m
[31m-[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old);[m
[31m-    }[m
[31m-[m
[31m-    h->hash = hv->hash;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_host_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_str_t host;[m
[31m-[m
[31m-    if (value->len) {[m
[31m-        host= *value;[m
[31m-[m
[31m-        if (ngx_http_headers_more_validate_host(&host, r->pool, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.server = host;[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_in.server = *value;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    off_t           len;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_content_length_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_atosz(value->data, value->len);[m
[31m-    if (len == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("reset headers_in.content_length_n to %d", (int) len);[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_in.content_length_n = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    value->len = 0;[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_headers_more_set_input_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_headers_more_parse_directive(cf, cmd, conf,[m
[31m-                                         ngx_http_headers_more_opcode_set);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_headers_more_clear_input_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_headers_more_parse_directive(cf, cmd, conf,[m
[31m-                                        ngx_http_headers_more_opcode_clear);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_headers_more_check_type(ngx_http_request_t *r, ngx_array_t *types)[m
[31m-{[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_str_t           *t;[m
[31m-    ngx_str_t            actual_type;[m
[31m-[m
[31m-    if (r->headers_in.content_type == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    actual_type = r->headers_in.content_type->value;[m
[31m-    if (actual_type.len == 0) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("headers_in->content_type: %.*s",[m
[31m-       (int) actual_type.len,[m
[31m-       actual_type.data);[m
[31m-[m
[31m-    t = types->elts;[m
[31m-    for (i = 0; i < types->nelts; i++) {[m
[31m-        dd("...comparing with type [%.*s]", (int) t[i].len, t[i].data);[m
[31m-[m
[31m-        if (actual_type.len == t[i].len[m
[31m-            && ngx_strncmp(actual_type.data, t[i].data, t[i].len) == 0)[m
[31m-        {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_more_parse_directive(ngx_conf_t *cf, ngx_command_t *ngx_cmd,[m
[31m-    void *conf, ngx_http_headers_more_opcode_t opcode)[m
[31m-{[m
[31m-    ngx_http_headers_more_loc_conf_t   *hlcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                          i;[m
[31m-    ngx_http_headers_more_cmd_t        *cmd;[m
[31m-    ngx_str_t                          *arg;[m
[31m-    ngx_flag_t                          ignore_next_arg;[m
[31m-    ngx_str_t                          *cmd_name;[m
[31m-    ngx_int_t                           rc;[m
[31m-    ngx_flag_t                          replace = 0;[m
[31m-    ngx_http_headers_more_header_val_t *h;[m
[31m-[m
[31m-    ngx_http_headers_more_main_conf_t  *hmcf;[m
[31m-[m
[31m-    if (hlcf->cmds == NULL) {[m
[31m-        hlcf->cmds = ngx_array_create(cf->pool, 1,[m
[31m-                                      sizeof(ngx_http_headers_more_cmd_t));[m
[31m-[m
[31m-        if (hlcf->cmds == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cmd = ngx_array_push(hlcf->cmds);[m
[31m-[m
[31m-    if (cmd == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->headers = ngx_array_create(cf->pool, 1,[m
[31m-                                    sizeof(ngx_http_headers_more_header_val_t));[m
[31m-[m
[31m-    if (cmd->headers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->types = ngx_array_create(cf->pool, 1, sizeof(ngx_str_t));[m
[31m-    if (cmd->types == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->statuses = NULL;[m
[31m-[m
[31m-    arg = cf->args->elts;[m
[31m-[m
[31m-    cmd_name = &arg[0];[m
[31m-[m
[31m-    ignore_next_arg = 0;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (ignore_next_arg) {[m
[31m-            ignore_next_arg = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].data[0] != '-') {[m
[31m-            rc = ngx_http_headers_more_parse_header(cf, cmd_name,[m
[31m-                                                    &arg[i], cmd->headers,[m
[31m-                                                    opcode,[m
[31m-                                        ngx_http_headers_more_set_handlers);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].len == 2) {[m
[31m-            if (arg[i].data[1] == 't') {[m
[31m-                if (i == cf->args->nelts - 1) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                                  "%V: option -t takes an argument.",[m
[31m-                                  cmd_name);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rc = ngx_http_headers_more_parse_types(cf->log, cmd_name,[m
[31m-                                                       &arg[i + 1],[m
[31m-                                                       cmd->types);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ignore_next_arg = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (arg[i].data[1] == 'r') {[m
[31m-                dd("Found replace flag");[m
[31m-                replace = 1;[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "%V: invalid option name: \"%V\"", cmd_name, &arg[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("Found %d types, and %d headers",[m
[31m-       (int) cmd->types->nelts,[m
[31m-       (int) cmd->headers->nelts);[m
[31m-[m
[31m-    if (cmd->headers->nelts == 0) {[m
[31m-        ngx_pfree(cf->pool, cmd->headers);[m
[31m-        cmd->headers = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        h = cmd->headers->elts;[m
[31m-        for (i = 0; i < cmd->headers->nelts; i++) {[m
[31m-            h[i].replace = replace;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->types->nelts == 0) {[m
[31m-        ngx_pfree(cf->pool, cmd->types);[m
[31m-        cmd->types = NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmd->is_input = 1;[m
[31m-[m
[31m-    hmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                         ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    hmcf->requires_handler = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* borrowed the code from ngx_http_request.c:ngx_http_process_user_agent */[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_user_agent_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    u_char  *user_agent, *msie;[m
[31m-[m
[31m-    /* clear existing settings */[m
[31m-[m
[31m-    r->headers_in.msie = 0;[m
[31m-    r->headers_in.msie6 = 0;[m
[31m-    r->headers_in.opera = 0;[m
[31m-    r->headers_in.gecko = 0;[m
[31m-    r->headers_in.chrome = 0;[m
[31m-    r->headers_in.safari = 0;[m
[31m-    r->headers_in.konqueror = 0;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_set_builtin_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    /* check some widespread browsers */[m
[31m-[m
[31m-    user_agent = value->data;[m
[31m-[m
[31m-    msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1);[m
[31m-[m
[31m-    if (msie && msie + 7 < user_agent + value->len) {[m
[31m-[m
[31m-        r->headers_in.msie = 1;[m
[31m-[m
[31m-        if (msie[6] == '.') {[m
[31m-[m
[31m-            switch (msie[5]) {[m
[31m-            case '4':[m
[31m-            case '5':[m
[31m-                r->headers_in.msie6 = 1;[m
[31m-                break;[m
[31m-            case '6':[m
[31m-                if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) {[m
[31m-                    r->headers_in.msie6 = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstrn(user_agent, "Opera", 5 - 1)) {[m
[31m-        r->headers_in.opera = 1;[m
[31m-        r->headers_in.msie = 0;[m
[31m-        r->headers_in.msie6 = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->headers_in.msie && !r->headers_in.opera) {[m
[31m-[m
[31m-        if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {[m
[31m-            r->headers_in.gecko = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {[m
[31m-            r->headers_in.chrome = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)[m
[31m-                   && ngx_strstrn(user_agent, "Mac OS X", 8 - 1))[m
[31m-        {[m
[31m-            r->headers_in.safari = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {[m
[31m-            r->headers_in.konqueror = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_connection_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_in.connection_type = 0;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_set_builtin_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcasestrn(value->data, "close", 5 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-        r->headers_in.keep_alive_n = -1;[m
[31m-[m
[31m-    } else if (ngx_strcasestrn(value->data, "keep-alive", 10 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_array_t       *headers;[m
[31m-    ngx_table_elt_t  **v, *h;[m
[31m-[m
[31m-    headers = (ngx_array_t *) ((char *) &r->headers_in + hv->offset);[m
[31m-[m
[31m-    if (headers->nelts > 0) {[m
[31m-        ngx_array_destroy(headers);[m
[31m-[m
[31m-        if (ngx_array_init(headers, r->pool, 2,[m
[31m-                           sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("clear multi-value headers: %d", (int) headers->nelts);[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (headers->nalloc == 0) {[m
[31m-        if (ngx_array_init(headers, r->pool, 2,[m
[31m-                           sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    h = NULL;[m
[31m-    if (ngx_http_set_header_helper(r, hv, value, &h) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("new cookie header: %p", h);[m
[31m-[m
[31m-    v = ngx_array_push(headers);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *v = h;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_validate_host(ngx_str_t *host, ngx_pool_t *pool,[m
[31m-    ngx_uint_t alloc)[m
[31m-{[m
[31m-    u_char  *h, ch;[m
[31m-    size_t   i, dot_pos, host_len;[m
[31m-[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_literal,[m
[31m-        sw_rest[m
[31m-    } state;[m
[31m-[m
[31m-    dot_pos = host->len;[m
[31m-    host_len = host->len;[m
[31m-[m
[31m-    h = host->data;[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-[m
[31m-    for (i = 0; i < host->len; i++) {[m
[31m-        ch = h[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '.':[m
[31m-            if (dot_pos == i - 1) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-            dot_pos = i;[m
[31m-            break;[m
[31m-[m
[31m-        case ':':[m
[31m-            if (state == sw_usual) {[m
[31m-                host_len = i;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '[':[m
[31m-            if (i == 0) {[m
[31m-                state = sw_literal;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ']':[m
[31m-            if (state == sw_literal) {[m
[31m-                host_len = i + 1;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '\0':[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            if (ngx_path_separator(ch)) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                alloc = 1;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dot_pos == host_len - 1) {[m
[31m-        host_len--;[m
[31m-    }[m
[31m-[m
[31m-    if (host_len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc) {[m
[31m-        host->data = ngx_pnalloc(pool, host_len);[m
[31m-        if (host->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_strlow(host->data, h, host_len);[m
[31m-    }[m
[31m-[m
[31m-    host->len = host_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.h[m
[1mdeleted file mode 100644[m
[1mindex d2251da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_HEADERS_MORE_INPUT_HEADERS_H[m
[31m-#define NGX_HTTP_HEADERS_MORE_INPUT_HEADERS_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_filter_module.h"[m
[31m-[m
[31m-[m
[31m-/* output header setters and clearers */[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_exec_input_cmd(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_cmd_t *cmd);[m
[31m-[m
[31m-char *ngx_http_headers_more_set_input_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-char *ngx_http_headers_more_clear_input_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_HEADERS_MORE_INPUT_HEADERS_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.c[m
[1mdeleted file mode 100644[m
[1mindex 0f9bc87..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.c[m
[1m+++ /dev/null[m
[36m@@ -1,716 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_headers_out.h"[m
[31m-#include "ngx_http_headers_more_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_more_parse_directive(ngx_conf_t *cf, ngx_command_t *ngx_cmd,[m
[31m-        void *conf, ngx_http_headers_more_opcode_t opcode);[m
[31m-static ngx_flag_t ngx_http_headers_more_check_type(ngx_http_request_t *r,[m
[31m-        ngx_array_t *types);[m
[31m-static ngx_flag_t ngx_http_headers_more_check_status(ngx_http_request_t *r,[m
[31m-        ngx_array_t *statuses);[m
[31m-static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header, ngx_flag_t no_create);[m
[31m-static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_accept_ranges_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_type_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-static ngx_http_headers_more_set_header_t ngx_http_headers_more_set_handlers[][m
[31m-    = {[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 offsetof(ngx_http_headers_out_t, server),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 offsetof(ngx_http_headers_out_t, date),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 offsetof(ngx_http_headers_out_t, location),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 offsetof(ngx_http_headers_out_t, refresh),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Range"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges),[m
[31m-                 ngx_http_set_accept_ranges_header },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 offsetof(ngx_http_headers_out_t, www_authenticate),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 offsetof(ngx_http_headers_out_t, expires),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("E-Tag"),[m
[31m-                 offsetof(ngx_http_headers_out_t, etag),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_length),[m
[31m-                 ngx_http_set_content_length_header },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 0,[m
[31m-                 ngx_http_set_content_type_header },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, ngx_http_set_header }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_exec_cmd(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_cmd_t *cmd)[m
[31m-{[m
[31m-    ngx_str_t                                   value;[m
[31m-    ngx_http_headers_more_header_val_t         *h;[m
[31m-    ngx_uint_t                                  i;[m
[31m-[m
[31m-    if (!cmd->headers) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->types && !ngx_http_headers_more_check_type(r, cmd->types)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->statuses[m
[31m-        && !ngx_http_headers_more_check_status(r, cmd->statuses))[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h = cmd->headers->elts;[m
[31m-    for (i = 0; i < cmd->headers->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value.len) {[m
[31m-            value.len--;  /* remove the trailing '\0' added by[m
[31m-                             ngx_http_headers_more_parse_header */[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].handler(r, &h[i], &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header, ngx_flag_t no_create)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_flag_t                   matched = 0;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        /* XXX ngx_http_core_find_config_phase, for example,[m
[31m-         * may not initialize the "key" and "hash" fields[m
[31m-         * for a nasty optimization purpose, and[m
[31m-         * we have to work-around it here */[m
[31m-[m
[31m-        r->headers_out.location->hash = ngx_http_headers_more_location_hash;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (!hv->wildcard[m
[31m-            && h[i].key.len == hv->key.len[m
[31m-            && ngx_strncasecmp(h[i].key.data, hv->key.data,[m
[31m-                               h[i].key.len) == 0)[m
[31m-        {[m
[31m-            goto matched;[m
[31m-        }[m
[31m-[m
[31m-        if (hv->wildcard[m
[31m-            && h[i].key.len >= hv->key.len - 1[m
[31m-            && ngx_strncasecmp(h[i].key.data, hv->key.data,[m
[31m-                               hv->key.len - 1) == 0)[m
[31m-        {[m
[31m-            goto matched;[m
[31m-        }[m
[31m-[m
[31m-        /* not matched */[m
[31m-        continue;[m
[31m-[m
[31m-matched:[m
[31m-[m
[31m-        if (value->len == 0 || matched) {[m
[31m-            dd("clearing normal header for %.*s", (int) hv->key.len,[m
[31m-               hv->key.data);[m
[31m-[m
[31m-            h[i].value.len = 0;[m
[31m-            h[i].hash = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            h[i].value = *value;[m
[31m-            h[i].hash = hv->hash;[m
[31m-        }[m
[31m-[m
[31m-        if (output_header) {[m
[31m-            *output_header = &h[i];[m
[31m-        }[m
[31m-[m
[31m-        matched = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (matched){[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if ((hv->wildcard || no_create) && value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* XXX we still need to create header slot even if the value[m
[31m-     * is empty because some builtin headers like Last-Modified[m
[31m-     * relies on this to get cleared */[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        h->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    if (output_header) {[m
[31m-        *output_header = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h, **old;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (hv->offset) {[m
[31m-        old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    } else {[m
[31m-        old = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (old == NULL || *old == NULL) {[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old, 0);[m
[31m-    }[m
[31m-[m
[31m-    h = *old;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        dd("clearing the builtin header");[m
[31m-[m
[31m-        h->hash = 0;[m
[31m-        h->value = *value;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = hv->hash;[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-    ngx_uint_t        i;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* override old values (if any) */[m
[31m-[m
[31m-    if (pa->nelts > 0) {[m
[31m-        ph = pa->elts;[m
[31m-        for (i = 1; i < pa->nelts; i++) {[m
[31m-            ph[i]->hash = 0;[m
[31m-            ph[i]->value.len = 0;[m
[31m-        }[m
[31m-[m
[31m-        ph[0]->value = *value;[m
[31m-[m
[31m-        if (value->len == 0) {[m
[31m-            ph[0]->hash = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            ph[0]->hash = hv->hash;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho->value = *value;[m
[31m-    ho->hash = hv->hash;[m
[31m-    ngx_str_set(&ho->key, "Cache-Control");[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_type_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    u_char          *p, *last, *end;[m
[31m-[m
[31m-    r->headers_out.content_type_len = value->len;[m
[31m-    r->headers_out.content_type = *value;[m
[31m-    r->headers_out.content_type_hash = hv->hash;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    p = value->data;[m
[31m-    end = p + value->len;[m
[31m-[m
[31m-    for (; p != end; p++) {[m
[31m-[m
[31m-        if (*p != ';') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        last = p;[m
[31m-[m
[31m-        while (*++p == ' ') { /* void */ }[m
[31m-[m
[31m-        if (p == end) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p += 8;[m
[31m-[m
[31m-        r->headers_out.content_type_len = last - value->data;[m
[31m-[m
[31m-        if (*p == '"') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        last = end;[m
[31m-[m
[31m-        if (*(last - 1) == '"') {[m
[31m-            last--;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.charset.len = last - p;[m
[31m-        r->headers_out.charset.data = p;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    value->len = 0;[m
[31m-[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    off_t           len;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_content_length_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_atosz(value->data, value->len);[m
[31m-    if (len == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = len;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_accept_ranges_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    if (value->len == 0) {[m
[31m-        r->allow_ranges = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    dd_enter();[m
[31m-[m
[31m-    value->len = 0;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_headers_more_set_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_headers_more_parse_directive(cf, cmd, conf,[m
[31m-                                         ngx_http_headers_more_opcode_set);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_headers_more_clear_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_headers_more_parse_directive(cf, cmd, conf,[m
[31m-                                        ngx_http_headers_more_opcode_clear);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_headers_more_check_type(ngx_http_request_t *r, ngx_array_t *types)[m
[31m-{[m
[31m-    ngx_uint_t          i;[m
[31m-    ngx_str_t          *t;[m
[31m-[m
[31m-    dd("headers_out->content_type: %.*s (len %d)",[m
[31m-       (int) r->headers_out.content_type.len,[m
[31m-       r->headers_out.content_type.data,[m
[31m-       (int) r->headers_out.content_type.len);[m
[31m-[m
[31m-    t = types->elts;[m
[31m-[m
[31m-    for (i = 0; i < types->nelts; i++) {[m
[31m-        dd("...comparing with type [%.*s]", (int) t[i].len, t[i].data);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == t[i].len[m
[31m-            && ngx_strncmp(r->headers_out.content_type.data,[m
[31m-                           t[i].data, t[i].len) == 0)[m
[31m-        {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_headers_more_check_status(ngx_http_request_t *r, ngx_array_t *statuses)[m
[31m-{[m
[31m-    ngx_uint_t          i;[m
[31m-    ngx_uint_t         *status;[m
[31m-[m
[31m-    dd("headers_out.status = %d", (int) r->headers_out.status);[m
[31m-[m
[31m-    status = statuses->elts;[m
[31m-    for (i = 0; i < statuses->nelts; i++) {[m
[31m-        dd("...comparing with specified status %d", (int) status[i]);[m
[31m-[m
[31m-        if (r->headers_out.status == status[i]) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_more_parse_directive(ngx_conf_t *cf, ngx_command_t *ngx_cmd,[m
[31m-    void *conf, ngx_http_headers_more_opcode_t opcode)[m
[31m-{[m
[31m-    ngx_http_headers_more_loc_conf_t  *hlcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_headers_more_cmd_t       *cmd;[m
[31m-    ngx_str_t                         *arg;[m
[31m-    ngx_flag_t                         ignore_next_arg;[m
[31m-    ngx_str_t                         *cmd_name;[m
[31m-    ngx_int_t                          rc;[m
[31m-[m
[31m-    ngx_http_headers_more_main_conf_t  *hmcf;[m
[31m-[m
[31m-    if (hlcf->cmds == NULL) {[m
[31m-        hlcf->cmds = ngx_array_create(cf->pool, 1,[m
[31m-                                      sizeof(ngx_http_headers_more_cmd_t));[m
[31m-[m
[31m-        if (hlcf->cmds == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cmd = ngx_array_push(hlcf->cmds);[m
[31m-    if (cmd == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->headers =[m
[31m-        ngx_array_create(cf->pool, 1,[m
[31m-                         sizeof(ngx_http_headers_more_header_val_t));[m
[31m-    if (cmd->headers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->types = ngx_array_create(cf->pool, 1, sizeof(ngx_str_t));[m
[31m-    if (cmd->types == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->statuses = ngx_array_create(cf->pool, 1, sizeof(ngx_uint_t));[m
[31m-    if (cmd->statuses == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    arg = cf->args->elts;[m
[31m-[m
[31m-    cmd_name = &arg[0];[m
[31m-[m
[31m-    ignore_next_arg = 0;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ignore_next_arg) {[m
[31m-            ignore_next_arg = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].data[0] != '-') {[m
[31m-            rc = ngx_http_headers_more_parse_header(cf, cmd_name,[m
[31m-                                                    &arg[i], cmd->headers,[m
[31m-                                                    opcode,[m
[31m-                                        ngx_http_headers_more_set_handlers);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].len == 2) {[m
[31m-            if (arg[i].data[1] == 't') {[m
[31m-                if (i == cf->args->nelts - 1) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                                  "%V: option -t takes an argument.",[m
[31m-                                  cmd_name);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rc = ngx_http_headers_more_parse_types(cf->log, cmd_name,[m
[31m-                                                       &arg[i + 1],[m
[31m-                                                       cmd->types);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ignore_next_arg = 1;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            } else if (arg[i].data[1] == 's') {[m
[31m-[m
[31m-                if (i == cf->args->nelts - 1) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                                  "%V: option -s takes an argument.",[m
[31m-                                  cmd_name);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rc = ngx_http_headers_more_parse_statuses(cf->log, cmd_name,[m
[31m-                                                          &arg[i + 1],[m
[31m-                                                          cmd->statuses);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ignore_next_arg = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "%V: invalid option name: \"%V\"", cmd_name, &arg[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("Found %d statuses, %d types, and %d headers",[m
[31m-       (int) cmd->statuses->nelts, (int) cmd->types->nelts,[m
[31m-       (int) cmd->headers->nelts);[m
[31m-[m
[31m-    if (cmd->headers->nelts == 0) {[m
[31m-        cmd->headers = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->types->nelts == 0) {[m
[31m-        cmd->types = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->statuses->nelts == 0) {[m
[31m-        cmd->statuses = NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmd->is_input = 0;[m
[31m-[m
[31m-    hmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                         ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    hmcf->requires_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.h[m
[1mdeleted file mode 100644[m
[1mindex c939507..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_HEADERS_MORE_OUTPUT_HEADERS_H[m
[31m-#define NGX_HTTP_HEADERS_MORE_OUTPUT_HEADERS_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_filter_module.h"[m
[31m-[m
[31m-[m
[31m-/* output header setters and clearers */[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_exec_cmd(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_cmd_t *cmd);[m
[31m-[m
[31m-char *ngx_http_headers_more_set_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-char *ngx_http_headers_more_clear_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_HEADERS_MORE_OUTPUT_HEADERS_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.c[m
[1mdeleted file mode 100644[m
[1mindex 042dc3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,380 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_parse_header(ngx_conf_t *cf, ngx_str_t *cmd_name,[m
[31m-    ngx_str_t *raw_header, ngx_array_t *headers,[m
[31m-    ngx_http_headers_more_opcode_t opcode,[m
[31m-    ngx_http_headers_more_set_header_t *handlers)[m
[31m-{[m
[31m-    ngx_http_headers_more_header_val_t             *hv;[m
[31m-[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_str_t                            key = ngx_null_string;[m
[31m-    ngx_str_t                            value = ngx_null_string;[m
[31m-    ngx_flag_t                           seen_end_of_key;[m
[31m-    ngx_http_compile_complex_value_t     ccv;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    hv = ngx_array_push(headers);[m
[31m-    if (hv == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    seen_end_of_key = 0;[m
[31m-    for (i = 0; i < raw_header->len; i++) {[m
[31m-        if (key.len == 0) {[m
[31m-            if (isspace(raw_header->data[i])) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            key.data = raw_header->data;[m
[31m-            key.len  = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (!seen_end_of_key) {[m
[31m-            if (raw_header->data[i] == ':'[m
[31m-                || isspace(raw_header->data[i]))[m
[31m-            {[m
[31m-                seen_end_of_key = 1;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            key.len++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value.len == 0) {[m
[31m-            if (raw_header->data[i] == ':'[m
[31m-                || isspace(raw_header->data[i]))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            value.data = &raw_header->data[i];[m
[31m-            value.len  = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        value.len++;[m
[31m-    }[m
[31m-[m
[31m-    if (key.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "%V: no key found in the header argument: %V",[m
[31m-                      cmd_name, raw_header);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hv->wildcard = (key.data[key.len - 1] == '*');[m
[31m-    if (hv->wildcard && key.len<2){[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "%V: wildcard key to short: %V",[m
[31m-                      cmd_name, raw_header);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hv->hash = ngx_hash_key_lc(key.data, key.len);[m
[31m-    hv->key = key;[m
[31m-[m
[31m-    hv->offset = 0;[m
[31m-[m
[31m-    for (i = 0; handlers[i].name.len; i++) {[m
[31m-        if (hv->key.len != handlers[i].name.len[m
[31m-            || ngx_strncasecmp(hv->key.data, handlers[i].name.data,[m
[31m-                               handlers[i].name.len) != 0)[m
[31m-        {[m
[31m-            dd("hv key comparison: %s <> %s", handlers[i].name.data,[m
[31m-               hv->key.data);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hv->offset = handlers[i].offset;[m
[31m-        hv->handler = handlers[i].handler;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (handlers[i].name.len == 0 && handlers[i].handler) {[m
[31m-        hv->offset = handlers[i].offset;[m
[31m-        hv->handler = handlers[i].handler;[m
[31m-    }[m
[31m-[m
[31m-    if (opcode == ngx_http_headers_more_opcode_clear) {[m
[31m-        value.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (value.len == 0) {[m
[31m-        ngx_memzero(&hv->value, sizeof(ngx_http_complex_value_t));[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    /* Nginx request header value requires to be a null-terminated[m
[31m-     * C string */[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, value.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, value.data, value.len);[m
[31m-    p[value.len] = '\0';[m
[31m-    value.data = p;[m
[31m-    value.len++; /* we should also compile the trailing '\0' */[m
[31m-[m
[31m-    /* compile the header value as a complex value */[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value;[m
[31m-    ccv.complex_value = &hv->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_parse_statuses(ngx_log_t *log, ngx_str_t *cmd_name,[m
[31m-    ngx_str_t *value, ngx_array_t *statuses)[m
[31m-{[m
[31m-    u_char          *p, *last;[m
[31m-    ngx_uint_t      *s = NULL;[m
[31m-[m
[31m-    p = value->data;[m
[31m-    last = p + value->len;[m
[31m-[m
[31m-    for (; p != last; p++) {[m
[31m-        if (s == NULL) {[m
[31m-            if (isspace(*p)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(statuses);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (*p >= '0' && *p <= '9') {[m
[31m-                *s = *p - '0';[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                              "%V: invalid digit \"%c\" found in "[m
[31m-                              "the status code list \"%V\"",[m
[31m-                              cmd_name, *p, value);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (isspace(*p)) {[m
[31m-            dd("Parsed status %d", (int) *s);[m
[31m-[m
[31m-            s = NULL;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*p >= '0' && *p <= '9') {[m
[31m-            *s *= 10;[m
[31m-            *s += *p - '0';[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                          "%V: invalid digit \"%c\" found in "[m
[31m-                          "the status code list \"%V\"",[m
[31m-                          cmd_name, *p, value);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (s) {[m
[31m-        dd("Parsed status %d", (int) *s);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_parse_types(ngx_log_t *log, ngx_str_t *cmd_name,[m
[31m-    ngx_str_t *value, ngx_array_t *types)[m
[31m-{[m
[31m-    u_char          *p, *last;[m
[31m-    ngx_str_t       *t = NULL;[m
[31m-[m
[31m-    p = value->data;[m
[31m-    last = p + value->len;[m
[31m-[m
[31m-    for (; p != last; p++) {[m
[31m-        if (t == NULL) {[m
[31m-            if (isspace(*p) || *p == ';') {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            t = ngx_array_push(types);[m
[31m-            if (t == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            t->len = 1;[m
[31m-            t->data = p;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (isspace(*p) || *p == ';') {[m
[31m-            t = NULL;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        t->len++;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_rm_header_helper(ngx_list_t *l, ngx_list_part_t *cur,[m
[31m-    ngx_uint_t i)[m
[31m-{[m
[31m-    ngx_table_elt_t             *data;[m
[31m-    ngx_list_part_t             *new, *part;[m
[31m-[m
[31m-    dd("list rm item: part %p, i %d, nalloc %d", cur, (int) i,[m
[31m-       (int) l->nalloc);[m
[31m-[m
[31m-    data = cur->elts;[m
[31m-[m
[31m-    dd("cur: nelts %d, nalloc %d", (int) cur->nelts,[m
[31m-       (int) l->nalloc);[m
[31m-[m
[31m-    if (i == 0) {[m
[31m-        cur->elts = (char *) cur->elts + l->size;[m
[31m-        cur->nelts--;[m
[31m-[m
[31m-        if (cur == l->last) {[m
[31m-            if (cur->nelts == 0) {[m
[31m-#if 1[m
[31m-                part = &l->part;[m
[31m-[m
[31m-                if (part == cur) {[m
[31m-                    cur->elts = (char *) cur->elts - l->size;[m
[31m-                    /* do nothing */[m
[31m-[m
[31m-                } else {[m
[31m-                    while (part->next != cur) {[m
[31m-                        if (part->next == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-                        part = part->next;[m
[31m-                    }[m
[31m-[m
[31m-                    l->last = part;[m
[31m-                    part->next = NULL;[m
[31m-                    dd("part nelts: %d", (int) part->nelts);[m
[31m-                    l->nalloc = part->nelts;[m
[31m-                }[m
[31m-#endif[m
[31m-[m
[31m-            } else {[m
[31m-                l->nalloc--;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (cur->nelts == 0) {[m
[31m-            part = &l->part;[m
[31m-[m
[31m-            if (part == cur) {[m
[31m-                ngx_http_headers_more_assert(cur->next != NULL);[m
[31m-[m
[31m-                dd("remove 'cur' from the list by rewriting 'cur': "[m
[31m-                   "l->last: %p, cur: %p, cur->next: %p, part: %p",[m
[31m-                   l->last, cur, cur->next, part);[m
[31m-[m
[31m-                if (l->last == cur->next) {[m
[31m-                    dd("last is cur->next");[m
[31m-                    l->part = *(cur->next);[m
[31m-                    l->last = part;[m
[31m-                    l->nalloc = part->nelts;[m
[31m-[m
[31m-                } else {[m
[31m-                    l->part = *(cur->next);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                dd("remove 'cur' from the list");[m
[31m-                while (part->next != cur) {[m
[31m-                    if (part->next == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                    part = part->next;[m
[31m-                }[m
[31m-[m
[31m-                part->next = cur->next;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (i == cur->nelts - 1) {[m
[31m-        cur->nelts--;[m
[31m-[m
[31m-        if (cur == l->last) {[m
[31m-            l->nalloc = cur->nelts;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    new = ngx_palloc(l->pool, sizeof(ngx_list_part_t));[m
[31m-    if (new == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    new->elts = &data[i + 1];[m
[31m-    new->nelts = cur->nelts - i - 1;[m
[31m-    new->next = cur->next;[m
[31m-[m
[31m-    cur->nelts = i;[m
[31m-    cur->next = new;[m
[31m-    if (cur == l->last) {[m
[31m-        l->last = new;[m
[31m-        l->nalloc = new->nelts;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.h[m
[1mdeleted file mode 100644[m
[1mindex 6c4614b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_HEADERS_MORE_UTIL_H[m
[31m-#define NGX_HTTP_HEADERS_MORE_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_filter_module.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_headers_more_hash_literal(s)                                \[m
[31m-    ngx_http_headers_more_hash_str((u_char *) s, sizeof(s) - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_uint_t[m
[31m-ngx_http_headers_more_hash_str(u_char *src, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    while (n--) {[m
[31m-        key = ngx_hash(key, *src);[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t  ngx_http_headers_more_location_hash;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_parse_header(ngx_conf_t *cf,[m
[31m-    ngx_str_t *cmd_name, ngx_str_t *raw_header, ngx_array_t *headers,[m
[31m-    ngx_http_headers_more_opcode_t opcode,[m
[31m-    ngx_http_headers_more_set_header_t *handlers);[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_parse_statuses(ngx_log_t *log,[m
[31m-    ngx_str_t *cmd_name, ngx_str_t *value, ngx_array_t *statuses);[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_parse_types(ngx_log_t *log,[m
[31m-    ngx_str_t *cmd_name, ngx_str_t *value, ngx_array_t *types);[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_rm_header_helper(ngx_list_t *l,[m
[31m-    ngx_list_part_t *cur, ngx_uint_t i);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_HEADERS_MORE_UTIL_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/bug.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/bug.t[m
[1mdeleted file mode 100644[m
[1mindex d843479..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/bug.t[m
[1m+++ /dev/null[m
[36m@@ -1,362 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => 49 * repeat_each();[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set Server[m
[31m---- config[m
[31m-    #more_set_headers 'Last-Modified: x';[m
[31m-    more_clear_headers 'Last-Modified';[m
[31m---- request[m
[31m-    GET /index.html[m
[31m---- response_headers[m
[31m-! Last-Modified[m
[31m---- response_body_like: It works![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: variables in the Ranges header[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        set $rfrom 1;[m
[31m-        set $rto 3;[m
[31m-        more_set_input_headers 'Range: bytes=$rfrom - $rto';[m
[31m-        #more_set_input_headers 'Range: bytes=1 - 3';[m
[31m-        #echo $http_range;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- error_code: 206[m
[31m---- response_body chomp[m
[31m-htm[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: mime type overriding (inlined types)[m
[31m---- config[m
[31m-    more_clear_headers 'X-Powered-By' 'X-Runtime' 'ETag';[m
[31m-[m
[31m-    types {[m
[31m-        text/html                             html htm shtml;[m
[31m-        text/css                              css;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.css[m
[31m-hello[m
[31m---- request[m
[31m-GET /a.css[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: mime type overriding (included types file)[m
[31m---- config[m
[31m-    more_clear_headers 'X-Powered-By' 'X-Runtime' 'ETag';[m
[31m-    include mime.types;[m
[31m---- user_files[m
[31m->>> a.css[m
[31m-hello[m
[31m->>> ../conf/mime.types[m
[31m-types {[m
[31m-    text/html                             html htm shtml;[m
[31m-    text/css                              css;[m
[31m-}[m
[31m---- request[m
[31m-GET /a.css[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: empty variable as the header value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_headers 'X-Foo: $arg_foo';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: range bug[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        more_clear_input_headers "Range*" ;[m
[31m-        more_clear_input_headers "Content-Range*" ;[m
[31m-[m
[31m-        more_set_input_headers 'Range: bytes=1-5';[m
[31m-        more_set_headers  'Content-Range: bytes 1-5/1000';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=1-3[m
[31m---- raw_response_headers_like: Content-Range: bytes 1-5/1000$[m
[31m---- response_body chop[m
[31m-html>[m
[31m---- error_code: 206[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: Allow-Ranges[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        more_clear_headers 'Accept-Ranges';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /index.html[m
[31m---- response_headers[m
[31m-! Accept-Ranges[m
[31m---- response_body_like: It works[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear hand-written Allow-Ranges headers[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        more_set_headers 'Accept-Ranges: bytes';[m
[31m-        more_clear_headers 'Accept-Ranges';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /index.html[m
[31m---- response_headers[m
[31m-! Accept-Ranges[m
[31m---- response_body_like: It works[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: clear first, then add[m
[31m---- config[m
[31m-    location /bug {[m
[31m-        more_clear_headers 'Foo';[m
[31m-        more_set_headers 'Foo: a';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bug[m
[31m---- raw_response_headers_like eval[m
[31m-".*Foo: a.*"[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: first add, then clear, then add again[m
[31m---- config[m
[31m-    location /bug {[m
[31m-        more_set_headers 'Foo: a';[m
[31m-        more_clear_headers 'Foo';[m
[31m-        more_set_headers 'Foo: b';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bug[m
[31m---- raw_response_headers_like eval[m
[31m-".*Foo: b.*"[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: override charset[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        charset iso-8859-1;[m
[31m-        default_type "text/html";[m
[31m-        echo hiya;[m
[31m-    }[m
[31m-[m
[31m-    location /bug {[m
[31m-        more_set_headers "Content-Type: text/html; charset=UTF-8";[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bug[m
[31m---- response_body[m
[31m-hiya[m
[31m---- response_headers[m
[31m-Content-Type: text/html; charset=UTF-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set multi-value header to a single value[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-        more_set_headers 'Foo: b';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = ngx.header.Foo[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        add_header Foo a;[m
[31m-        add_header Foo c;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-Foo: b[m
[31m---- response_body[m
[31m-foo[m
[31m-b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: set multi values to cache-control and override it with multiple values (to reproduce a bug)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store", "foo", "bar", "baz" }[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-        more_clear_headers Cache-Control;[m
[31m-        add_header Cache-Control "blah";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: blah[m
[31m---- response_body[m
[31m-Cache-Control: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set 20+ headers[m
[31m---- config[m
[31m-    location /test {[m
[31m-        more_clear_input_headers "Authorization";[m
[31m-        echo $http_a1;[m
[31m-        echo $http_authorization;[m
[31m-        echo $http_a2;[m
[31m-        echo $http_a3;[m
[31m-        echo $http_a23;[m
[31m-        echo $http_a24;[m
[31m-        echo $http_a25;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers eval[m
[31m-my $i = 1;[m
[31m-my $s;[m
[31m-while ($i <= 25) {[m
[31m-    $s .= "A$i: $i\n";[m
[31m-    if ($i == 22) {[m
[31m-        $s .= "Authorization: blah\n";[m
[31m-    }[m
[31m-    $i++;[m
[31m-}[m
[31m-#warn $s;[m
[31m-$s[m
[31m---- response_body[m
[31m-1[m
[31m-[m
[31m-2[m
[31m-3[m
[31m-23[m
[31m-24[m
[31m-25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: github #20: segfault caused by the nasty optimization in the nginx core (set)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        more_set_headers "Foo: 1";[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: github #20: segfault caused by the nasty optimization in the nginx core (clear)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        more_clear_headers Foo;[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: Content-Type response headers with a charset param (correct -t values)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_set_headers -t 'text/html' 'X-Foo: Bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/fake;[m
[31m-    }[m
[31m-[m
[31m-    location = /fake {[m
[31m-        default_type text/html;[m
[31m-        charset utf-8;[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-X-Foo: Bar[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: Content-Type response headers with a charset param (WRONG -t values)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_set_headers -t 'text/html; charset=utf-8' 'X-Foo: Bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/fake;[m
[31m-    }[m
[31m-[m
[31m-    location = /fake {[m
[31m-        default_type text/html;[m
[31m-        charset utf-8;[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-X-Foo: Bar[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/builtin.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/builtin.t[m
[1mdeleted file mode 100644[m
[1mindex f2b5c34..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/builtin.t[m
[1m+++ /dev/null[m
[36m@@ -1,339 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-plan tests => 60;[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set Server[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'Server: Foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Server: Foo[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear Server[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_clear_headers 'Server: ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Server[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set Content-Type[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plan';[m
[31m-        more_set_headers 'Content-Type: text/css';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set Content-Type[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plan';[m
[31m-        more_set_headers 'Content-Type: text/css';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: clear Content-Type[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_clear_headers 'Content-Type: ';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: clear Content-Type (colon not required)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_clear_headers 'Content-Type';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: clear Content-Type (value ignored)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_clear_headers 'Content-Type: blah';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear Content-Type (case insensitive)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_clear_headers 'content-type: blah';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: clear Content-Type using set empty[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_set_headers 'content-type:';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: clear Content-Type using setting key only[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_set_headers 'content-type';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set content-length[m
[31m---- config[m
[31m-    location /len {[m
[31m-        more_set_headers 'Content-Length: 2';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-Content-Length: 2[m
[31m---- response_body chop[m
[31m-he[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set content-length multiple times[m
[31m---- config[m
[31m-    location /len {[m
[31m-        more_set_headers 'Content-Length: 2';[m
[31m-        more_set_headers 'Content-Length: 4';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-Content-Length: 4[m
[31m---- response_body chop[m
[31m-hell[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: clear content-length[m
[31m---- config[m
[31m-    location /len {[m
[31m-        more_set_headers 'Content-Length: 4';[m
[31m-        more_set_headers 'Content-Length:';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: clear content-length (another way)[m
[31m---- config[m
[31m-    location /len {[m
[31m-        more_set_headers 'Content-Length: 4';[m
[31m-        more_clear_headers 'Content-Length';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: clear content-type[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type:';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: clear content-type (the other way)[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_clear_headers 'Content-Type:';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set Charset[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Charset: gbk';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-Charset: gbk[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: clear Charset[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Charset: gbk';[m
[31m-        more_clear_headers 'Charset';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Charset[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: clear Charset (the other way: using set)[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Charset: gbk';[m
[31m-        more_set_headers 'Charset: ';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Charset[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: set Vary[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_headers 'Vary: gbk';[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Vary: hello';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-Vary: hello[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex febd306..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set request header at client side[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        eval_subrequest_in_memory off;[m
[31m-        eval_override_content_type text/plain;[m
[31m-        eval $res {[m
[31m-            echo -n 1;[m
[31m-        }[m
[31m-        #echo "[$res]";[m
[31m-        if ($res = '1') {[m
[31m-            more_set_input_headers 'Foo: Bar';[m
[31m-            echo "OK";[m
[31m-            break;[m
[31m-        }[m
[31m-        echo "NOT OK";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-OK[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-conn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-conn.t[m
[1mdeleted file mode 100644[m
[1mindex a32d4e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-conn.t[m
[1m+++ /dev/null[m
[36m@@ -1,138 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear the Connection req header[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        more_clear_input_headers Connection;[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 0[m
[31m-[m
[31m---- response_body[m
[31m-connection: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set custom Connection req header (close)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        more_set_input_headers "Connection: CLOSE";[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 1[m
[31m-[m
[31m---- response_body[m
[31m-connection: CLOSE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set custom Connection req header (keep-alive)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        more_set_input_headers "Connection: keep-alive";[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 2[m
[31m-[m
[31m---- response_body[m
[31m-connection: keep-alive[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set custom Connection req header (bad)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        more_set_input_headers "Connection: bad";[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 0[m
[31m-[m
[31m---- response_body[m
[31m-connection: bad[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-cookie.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-cookie.t[m
[1mdeleted file mode 100644[m
[1mindex 8929be7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-cookie.t[m
[1m+++ /dev/null[m
[36m@@ -1,164 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear cookie (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers Cookie;[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 0[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear cookie (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers Cookie;[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 0[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set one custom cookie (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "Cookie: boo=123";[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 1[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set one custom cookie (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "Cookie: boo=123";[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 1[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-ua.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-ua.t[m
[1mdeleted file mode 100644[m
[1mindex 56d2222..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input-ua.t[m
[1m+++ /dev/null[m
[36m@@ -1,629 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear Opera user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.62[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: opera: %d\n", $r->headers_in->opera)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: opera: %d\n", $r->headers_in->opera)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: opera: 1[m
[31m-content: opera: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear MSIE 4 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set custom MSIE 4 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: clear MSIE 5 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set custom MSIE 5 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: clear MSIE 6 (without SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set custom MSIE 6 (without SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear MSIE 6 (with SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=0[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set custom MSIE 6 (with SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set custom MSIE 7 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; winfx; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Zune 2.0)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; winfx; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Zune 2.0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: clear Gecko user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: gecko: 1[m
[31m-content: gecko: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set custom Gecko user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: gecko: 0[m
[31m-content: gecko: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: clear Chrome user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: chrome: 1[m
[31m-content: chrome: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set custom Chrome user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: chrome: 0[m
[31m-content: chrome: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: clear Safari (Mac OS X) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: safari: 1[m
[31m-content: safari: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set custom Safari user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: safari: 0[m
[31m-content: safari: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: clear Konqueror user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: konqueror: 1[m
[31m-content: konqueror: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set custom Konqueror user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: konqueror: 0[m
[31m-content: konqueror: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input.t[m
[1mdeleted file mode 100644[m
[1mindex 0b8989f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/input.t[m
[1m+++ /dev/null[m
[36m@@ -1,1291 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 124;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set request header at client side[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #more_set_input_headers 'X-Foo: howdy';[m
[31m-        echo $http_x_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers[m
[31m-X-Foo: blah[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set request header at client side and rewrite it[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers 'X-Foo: howdy';[m
[31m-        echo $http_x_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers[m
[31m-X-Foo: blah[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-howdy[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rewrite content length[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Content-Length: 2048';[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /bar\n" .[m
[31m-"a" x 4096[m
[31m---- response_body eval[m
[31m-"a" x 2048[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: try to rewrite content length using the rewrite module[m
[31m-Thisshould not take effect ;)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $http_content_length 2048;[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /bar\n" .[m
[31m-"a" x 4096[m
[31m---- response_body eval[m
[31m-"a" x 4096[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: rewrite host and user-agent[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Host: foo' 'User-Agent: blah';[m
[31m-        echo "Host: $host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Host: foo[m
[31m-User-Agent: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: clear host and user-agent[m
[31m-$host always has a default value and cannot be really cleared.[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_clear_input_headers 'Host: foo' 'User-Agent: blah';[m
[31m-        echo "Host: $host";[m
[31m-        echo "Host (2): $http_host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Host: localhost[m
[31m-Host (2): [m
[31m-User-Agent: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: clear host and user-agent (the other way)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Host:' 'User-Agent:' 'X-Foo:';[m
[31m-        echo "Host: $host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-        echo "X-Foo: $http_x_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- more_headers[m
[31m-X-Foo: bar[m
[31m---- response_body[m
[31m-Host: localhost[m
[31m-User-Agent: [m
[31m-X-Foo: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear content-length[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Content-Length: ';[m
[31m-        echo "Content-Length: $http_content_length";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-Content-Length: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: clear content-length (the other way)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_clear_input_headers 'Content-Length: ';[m
[31m-        echo "Content-Length: $http_content_length";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-Content-Length: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: rewrite type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Content-Type: text/css';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: text/css[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: clear type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Content-Type:';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: clear type (the other way)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_clear_input_headers 'Content-Type:foo';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: add type constraints[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-yay[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: add type constraints (not matched)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: add type constraints (OR'd)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-yay[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: add type constraints (OR'd)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-yay[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: add type constraints (OR'd) (not matched)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: mix input and output cmds[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'X-Blah:yay';[m
[31m-        more_set_headers 'X-Blah:hiya';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_headers[m
[31m-X-Blah: hiya[m
[31m---- response[m
[31m-yay[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: set request header at client side and replace[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers -r 'X-Foo: howdy';[m
[31m-        echo $http_x_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers[m
[31m-X-Foo: blah[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-howdy[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: do no set request header at client, so no replace with -r option[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers -r 'X-Foo: howdy';[m
[31m-        echo "empty_header:" $http_x_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-empty_header: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: clear input headers[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $val 'dog';[m
[31m-[m
[31m-        more_clear_input_headers 'User-Agent';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers[m
[31m-User-Agent: my-sock[m
[31m---- response_body eval[m
[31m-"GET /proxy HTTP/1.0\r[m
[31m-Host: 127.0.0.1:\$ServerPort\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: clear input headers[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_clear_input_headers 'User-Agent';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"GET /proxy HTTP/1.0\r[m
[31m-Host: 127.0.0.1:\$ServerPort\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: clear input headers[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_clear_input_headers 'X-Foo19';[m
[31m-        more_clear_input_headers 'X-Foo20';[m
[31m-        more_clear_input_headers 'X-Foo21';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers eval[m
[31m-my $s;[m
[31m-for my $i (3..21) {[m
[31m-    $s .= "X-Foo$i: $i\n";[m
[31m-}[m
[31m-$s;[m
[31m---- response_body eval[m
[31m-"GET /proxy HTTP/1.0\r[m
[31m-Host: 127.0.0.1:\$ServerPort\r[m
[31m-Connection: close\r[m
[31m-X-Foo3: 3\r[m
[31m-X-Foo4: 4\r[m
[31m-X-Foo5: 5\r[m
[31m-X-Foo6: 6\r[m
[31m-X-Foo7: 7\r[m
[31m-X-Foo8: 8\r[m
[31m-X-Foo9: 9\r[m
[31m-X-Foo10: 10\r[m
[31m-X-Foo11: 11\r[m
[31m-X-Foo12: 12\r[m
[31m-X-Foo13: 13\r[m
[31m-X-Foo14: 14\r[m
[31m-X-Foo15: 15\r[m
[31m-X-Foo16: 16\r[m
[31m-X-Foo17: 17\r[m
[31m-X-Foo18: 18\r[m
[31m-\r[m
[31m-"[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: Accept-Encoding[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_input_headers 'Accept-Encoding: gzip';[m
[31m-        gzip on;[m
[31m-        gzip_min_length  1;[m
[31m-        gzip_buffers     4 8k;[m
[31m-        gzip_types       text/plain;[m
[31m-    }[m
[31m---- user_files[m
[31m-">>> bar[m
[31m-" . ("hello" x 512)[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- response_body_like: .[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: rewrite + set request header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite ^ /foo last;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        more_set_input_headers 'X-Foo: howdy';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo "X-Foo: $http_x_foo";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-X-Foo: howdy[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: clear_header should clear all the instances of the user custom header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers Foo;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo "Foo: [$http_foo]";[m
[31m-        echo "Test-Header: [$http_test_header]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Foo: bah[m
[31m-Test-Header: 1[m
[31m---- response_body[m
[31m-Foo: [][m
[31m-Test-Header: [1][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: clear_header should clear all the instances of the builtin header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers Content-Type;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo "Content-Type: [$http_content_type]";[m
[31m-        echo "Test-Header: [$http_test_header]";[m
[31m-        #echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Content-Type: foo[m
[31m-Content-Type: bah[m
[31m-Test-Header: 1[m
[31m---- response_body[m
[31m-Content-Type: [][m
[31m-Test-Header: [1][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: Converting POST to GET - clearing headers (bug found by Matthieu Tourne, 411 error page)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers Content-Type;[m
[31m-        more_clear_input_headers Content-Length;[m
[31m-[m
[31m-        #proxy_pass http://127.0.0.1:8888;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Content-Type: application/ocsp-request[m
[31m-Test-Header: 1[m
[31m---- response_body_like eval[m
[31m-qr/Connection: close\r[m
[31m-Test-Header: 1\r[m
[31m-\r[m
[31m-$/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: clear_header() does not duplicate subsequent headers (old bug)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers Foo;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Bah: bah[m
[31m-Foo: foo[m
[31m-Test-Header: 1[m
[31m-Foo1: foo1[m
[31m-Foo2: foo2[m
[31m-Foo3: foo3[m
[31m-Foo4: foo4[m
[31m-Foo5: foo5[m
[31m-Foo6: foo6[m
[31m-Foo7: foo7[m
[31m-Foo8: foo8[m
[31m-Foo9: foo9[m
[31m-Foo10: foo10[m
[31m-Foo11: foo11[m
[31m-Foo12: foo12[m
[31m-Foo13: foo13[m
[31m-Foo14: foo14[m
[31m-Foo15: foo15[m
[31m-Foo16: foo16[m
[31m-Foo17: foo17[m
[31m-Foo18: foo18[m
[31m-Foo19: foo19[m
[31m-Foo20: foo20[m
[31m-Foo21: foo21[m
[31m-Foo22: foo22[m
[31m---- response_body_like eval[m
[31m-qr/Bah: bah\r[m
[31m-Test-Header: 1\r[m
[31m-Foo1: foo1\r[m
[31m-Foo2: foo2\r[m
[31m-Foo3: foo3\r[m
[31m-Foo4: foo4\r[m
[31m-Foo5: foo5\r[m
[31m-Foo6: foo6\r[m
[31m-Foo7: foo7\r[m
[31m-Foo8: foo8\r[m
[31m-Foo9: foo9\r[m
[31m-Foo10: foo10\r[m
[31m-Foo11: foo11\r[m
[31m-Foo12: foo12\r[m
[31m-Foo13: foo13\r[m
[31m-Foo14: foo14\r[m
[31m-Foo15: foo15\r[m
[31m-Foo16: foo16\r[m
[31m-Foo17: foo17\r[m
[31m-Foo18: foo18\r[m
[31m-Foo19: foo19\r[m
[31m-Foo20: foo20\r[m
[31m-Foo21: foo21\r[m
[31m-Foo22: foo22\r[m
[31m-/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: clear input header (just more than 20 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers "R";[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-Q: q\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: clear input header (just more than 20 headers, and add more)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers R;[m
[31m-        more_set_input_headers "foo-1: 1" "foo-2: 2" "foo-3: 3" "foo-4: 4"[m
[31m-            "foo-5: 5" "foo-6: 6" "foo-7: 7" "foo-8: 8" "foo-9: 9"[m
[31m-            "foo-10: 10" "foo-11: 11" "foo-12: 12" "foo-13: 13"[m
[31m-            "foo-14: 14" "foo-15: 15" "foo-16: 16" "foo-17: 17" "foo-18: 18"[m
[31m-            "foo-19: 19" "foo-20: 20" "foo-21: 21";[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-Q: q\r[m
[31m-foo-1: 1\r[m
[31m-foo-2: 2\r[m
[31m-foo-3: 3\r[m
[31m-foo-4: 4\r[m
[31m-foo-5: 5\r[m
[31m-foo-6: 6\r[m
[31m-foo-7: 7\r[m
[31m-foo-8: 8\r[m
[31m-foo-9: 9\r[m
[31m-foo-10: 10\r[m
[31m-foo-11: 11\r[m
[31m-foo-12: 12\r[m
[31m-foo-13: 13\r[m
[31m-foo-14: 14\r[m
[31m-foo-15: 15\r[m
[31m-foo-16: 16\r[m
[31m-foo-17: 17\r[m
[31m-foo-18: 18\r[m
[31m-foo-19: 19\r[m
[31m-foo-20: 20\r[m
[31m-foo-21: 21\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: clear input header (just more than 21 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers R Q;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: clear input header (just more than 21 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers R Q;[m
[31m-        more_set_input_headers "foo-1: 1" "foo-2: 2" "foo-3: 3" "foo-4: 4"[m
[31m-            "foo-5: 5" "foo-6: 6" "foo-7: 7" "foo-8: 8" "foo-9: 9"[m
[31m-            "foo-10: 10" "foo-11: 11" "foo-12: 12" "foo-13: 13"[m
[31m-            "foo-14: 14" "foo-15: 15" "foo-16: 16" "foo-17: 17" "foo-18: 18"[m
[31m-            "foo-19: 19" "foo-20: 20" "foo-21: 21";[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-foo-1: 1\r[m
[31m-foo-2: 2\r[m
[31m-foo-3: 3\r[m
[31m-foo-4: 4\r[m
[31m-foo-5: 5\r[m
[31m-foo-6: 6\r[m
[31m-foo-7: 7\r[m
[31m-foo-8: 8\r[m
[31m-foo-9: 9\r[m
[31m-foo-10: 10\r[m
[31m-foo-11: 11\r[m
[31m-foo-12: 12\r[m
[31m-foo-13: 13\r[m
[31m-foo-14: 14\r[m
[31m-foo-15: 15\r[m
[31m-foo-16: 16\r[m
[31m-foo-17: 17\r[m
[31m-foo-18: 18\r[m
[31m-foo-19: 19\r[m
[31m-foo-20: 20\r[m
[31m-foo-21: 21\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: clear X-Real-IP[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers X-Real-IP;[m
[31m-        echo "X-Real-IP: $http_x_real_ip";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-X-Real-IP: 8.8.8.8[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("rewrite: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("content: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("content: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: x-real-ip: 8.8.8.8[m
[31m-content: no x-real-ip[m
[31m-[m
[31m---- response_body[m
[31m-X-Real-IP: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: set custom X-Real-IP[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "X-Real-IP: 8.8.4.4";[m
[31m-        echo "X-Real-IP: $http_x_real_ip";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("rewrite: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no x-real-ip")[m
[31m-    }[m
[31m-[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("content: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("content: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: no x-real-ip[m
[31m-content: x-real-ip: 8.8.4.4[m
[31m-[m
[31m---- response_body[m
[31m-X-Real-IP: 8.8.4.4[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: clear Via[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers Via;[m
[31m-        echo "Via: $http_via";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("rewrite: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("content: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("content: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-content: no via[m
[31m-[m
[31m---- response_body[m
[31m-Via: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: set custom Via[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)";[m
[31m-        echo "Via: $http_via";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("rewrite: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no via")[m
[31m-    }[m
[31m-[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("content: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("content: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: no via[m
[31m-content: via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- response_body[m
[31m-Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: HTTP 0.9 (set)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers 'X-Foo: howdy';[m
[31m-        echo "x-foo: $http_x_foo";[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-x-foo: [m
[31m---- http09[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: HTTP 0.9 (clear)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_clear_input_headers 'X-Foo';[m
[31m-        echo "x-foo: $http_x_foo";[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-x-foo: [m
[31m---- http09[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: Host header with port and $host[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Host: agentzh.org:1984';[m
[31m-        echo "host var: $host";[m
[31m-        echo "http_host var: $http_host";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-host var: agentzh.org[m
[31m-http_host var: agentzh.org:1984[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: Host header with upper case letters and $host[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Host: agentZH.org:1984';[m
[31m-        echo "host var: $host";[m
[31m-        echo "http_host var: $http_host";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-host var: agentzh.org[m
[31m-http_host var: agentZH.org:1984[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: clear all and re-insert[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers Host Connection Cache-Control Accept[m
[31m-                                 User-Agent Accept-Encoding Accept-Language[m
[31m-                                 Cookie;[m
[31m-[m
[31m-        more_set_input_headers "Host: a" "Connection: b" "Cache-Control: c"[m
[31m-                               "Accept: d" "User-Agent: e" "Accept-Encoding: f"[m
[31m-                               "Accept-Language: g" "Cookie: h";[m
[31m-[m
[31m-        more_clear_input_headers Host Connection Cache-Control Accept[m
[31m-                                 User-Agent Accept-Encoding Accept-Language[m
[31m-                                 Cookie;[m
[31m-[m
[31m-        more_set_input_headers "Host: a" "Connection: b" "Cache-Control: c"[m
[31m-                               "Accept: d" "User-Agent: e" "Accept-Encoding: f"[m
[31m-                               "Accept-Language: g" "Cookie: h";[m
[31m-[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Cache-Control: max-age=0\r[m
[31m-Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36\r[m
[31m-Accept-Encoding: gzip,deflate,sdch\r[m
[31m-Accept-Language: en-US,en;q=0.8\r[m
[31m-Cookie: test=cookie;\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: more_set_input_header does not override request headers with multiple values[m
[31m---- config[m
[31m-    #lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        more_set_input_headers "AAA: 111";[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers()[m
[31m-            ngx.say(headers["AAA"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-AAA: 123[m
[31m-AAA: 456[m
[31m-AAA: 678[m
[31m-[m
[31m---- response_body[m
[31m-111[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: clear If-Unmodified-Since req header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers 'If-Unmodified-Since';[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Last-Modified"] = "Tue, 30 Jun 2011 12:16:36 GMT"[m
[31m-            ngx.say("If-Unmodified-Since: ", ngx.var.http_if_unmodified_since)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Tue, 28 Jun 2011 12:16:36 GMT[m
[31m---- response_body[m
[31m-If-Unmodified-Since: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: clear If-Match req header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers 'If-Match';[m
[31m-        echo "If-Match: $http_if_match";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-Match: abc[m
[31m---- response_body[m
[31m-If-Match: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: clear If-None-Match req header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers 'If-None-Match';[m
[31m-        echo "If-None-Match: $http_if_none_match";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: *[m
[31m---- response_body[m
[31m-If-None-Match: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: set the Destination request header for WebDav[m
[31m---- config[m
[31m-    location = /a.txt {[m
[31m-        more_set_input_headers "Destination: /b.txt";[m
[31m-        dav_methods MOVE;[m
[31m-        dav_access            all:rw;[m
[31m-        root                  html;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-hello, world![m
[31m-[m
[31m---- request[m
[31m-MOVE /a.txt[m
[31m-[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-client sent no "Destination" header[m
[31m-[error][m
[31m---- error_code: 204[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: more_set_input_headers + X-Forwarded-For[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_set_input_headers "X-Forwarded-For: 8.8.8.8";[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Foo $proxy_add_x_forwarded_for;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Foo: 8.8.8.8, 127.0.0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: more_clear_input_headers + X-Forwarded-For[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers "X-Forwarded-For";[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Foo $proxy_add_x_forwarded_for;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-X-Forwarded-For: 8.8.8.8[m
[31m---- response_body[m
[31m-Foo: 127.0.0.1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/phase.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/phase.t[m
[1mdeleted file mode 100644[m
[1mindex 343d2e5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/phase.t[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 3;[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple set (1 arg)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        deny all;[m
[31m-        more_set_headers 'X-Foo: Blah';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex e316cac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,568 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 113;[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level("warn");[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple set (1 arg)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'X-Foo: Blah';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple set (2 args)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'X-Foo: Blah' 'X-Bar: hi';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m-X-Bar: hi[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: two sets in a single location[m
[31m---- config[m
[31m-    location /two {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'X-Foo: Blah'[m
[31m-        more_set_headers 'X-Bar: hi';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /two[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m-X-Bar: hi[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: two sets in a single location (for 404 too)[m
[31m---- config[m
[31m-    location /two {[m
[31m-        more_set_headers 'X-Foo: Blah'[m
[31m-        more_set_headers 'X-Bar: hi';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /two[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m-X-Bar: hi[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set a header then clears it (500)[m
[31m---- config[m
[31m-    location /two {[m
[31m-        more_set_headers 'X-Foo: Blah';[m
[31m-        more_set_headers 'X-Foo:';[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /two[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m-! X-Bar[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set a header only when 500 (matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 500 'X-Mine: Hiya';[m
[31m-        more_set_headers -s 404 'X-Yours: Blah';[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-Mine: Hiya[m
[31m-! X-Yours[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set a header only when 500 (not matched with 200)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 500 'X-Mine: Hiya';[m
[31m-        more_set_headers -s 404 'X-Yours: Blah';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-Mine[m
[31m-! X-Yours[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set a header only when 500 (not matched with 404)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 500 'X-Mine: Hiya';[m
[31m-        more_set_headers -s 404 'X-Yours: Blah';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-Mine[m
[31m-X-Yours: Blah[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: more conditions[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s '503 404' 'X-Mine: Hiya';[m
[31m-        more_set_headers -s ' 404  413 ' 'X-Yours: Blah';[m
[31m-        return 503;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-Mine: Hiya[m
[31m-! X-Yours[m
[31m---- response_body_like: 503 Service[m
[31m---- error_code: 503[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: more conditions[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s '503 404' 'X-Mine: Hiya';[m
[31m-        more_set_headers -s ' 404   413 ' 'X-Yours: Blah';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-Mine: Hiya[m
[31m-X-Yours: Blah[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: more conditions[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s '503 404' 'X-Mine: Hiya';[m
[31m-        more_set_headers -s ' 404   413  ' 'X-Yours: Blah';[m
[31m-        return 413;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-Mine[m
[31m-X-Yours: Blah[m
[31m---- response_body_like: 413 Request Entity Too Large[m
[31m---- error_code: 413[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: simple -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/css';[m
[31m-        more_set_headers -t 'text/css' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: simple -t (not matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers -t 'text/css' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-CSS[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: multiple -t (not matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers -t 'text/javascript' -t 'text/css' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-CSS[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: multiple -t (matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers -t 'text/javascript' -t 'text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: multiple -t (matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/javascript';[m
[31m-        more_set_headers -t 'text/javascript' -t 'text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: multiple -t (matched) with extra spaces[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/javascript';[m
[31m-        more_set_headers -t ' text/javascript  ' -t 'text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: multiple -t merged[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/javascript';[m
[31m-        more_set_headers -t ' text/javascript  text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: multiple -t merged (2)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers -t ' text/javascript  text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: multiple -s option in a directive (not matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 404 -s 500 'X-status: howdy';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-status[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: multiple -s option in a directive (matched 404)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 404 -s 500 'X-status: howdy';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: howdy[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: multiple -s option in a directive (matched 500)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 404 -s 500 'X-status: howdy';[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: howdy[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: -s mixed with -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: howdy2[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: -s mixed with -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -s 200 -t 'text/plain' 'X-status: howdy2';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-status[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: -s mixed with -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: howdy2[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: -s mixed with -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 500 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-status[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: merge from the upper level[m
[31m---- config[m
[31m-    more_set_headers -s 404 -t 'text/html' 'X-status2: howdy3';[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 500 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status2: howdy3[m
[31m-! X-status[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: merge from the upper level[m
[31m---- config[m
[31m-    more_set_headers -s 404 -t 'text/html' 'X-status2: howdy3';[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 500 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        echo yeah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-status2[m
[31m-X-status: howdy2[m
[31m---- response_body[m
[31m-yeah[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: override settings by inheritance[m
[31m---- config[m
[31m-    more_set_headers -s 404 -t 'text/html' 'X-status: yeah';[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -t 'text/html' 'X-status: nope';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: nope[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: append settings by inheritance[m
[31m---- config[m
[31m-    more_set_headers -s 404 -t 'text/html' 'X-status: yeah';[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -t 'text/html' 'X-status2: nope';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: yeah[m
[31m-X-status2: nope[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: clear headers with wildcard[m
[31m---- config[m
[31m-    location = /backend {[m
[31m-        add_header X-Hidden-One "i am hidden";[m
[31m-        add_header X-Hidden-Two "me 2";[m
[31m-        echo hi;[m
[31m-    }[m
[31m-    location /hello {[m
[31m-        more_clear_headers 'X-Hidden-*';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /hello[m
[31m---- response_headers[m
[31m-! X-Hidden-One[m
[31m-! X-Hidden-Two[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: clear duplicate headers[m
[31m---- config[m
[31m-    location = /backend {[m
[31m-        add_header pragma no-cache;[m
[31m-        add_header pragma no-cache;[m
[31m-        echo hi;[m
[31m-    }[m
[31m-    location /hello {[m
[31m-        more_clear_headers 'pragma';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /hello[m
[31m---- response_headers[m
[31m-!pragma[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: HTTP 0.9 (set)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_headers 'X-Foo: howdy';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-ok[m
[31m---- http09[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 34e84c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-plan tests => blocks() * 3;[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: vars in input header directives[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /foo;[m
[31m-        echo "main: $http_user_agent";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        set $val 'dog';[m
[31m-[m
[31m-        more_set_input_headers 'User-Agent: $val';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo "sub: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- more_headers[m
[31m-User-Agent: my-sock[m
[31m---- response_body[m
[31m-sub: dog[m
[31m-main: dog[m
[31m---- response_headers[m
[31m-! Host[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: vars in input header directives[m
[31m---- config[m
[31m-    location /main {[m
[31m-        #more_set_input_headers 'User-Agent: cat';[m
[31m-        echo_location /foo;[m
[31m-        echo "main: $http_user_agent";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        set $val 'dog';[m
[31m-[m
[31m-        more_set_input_headers 'User-Agent: $val';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-        #echo $http_user_agent;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo "sub: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub: dog[m
[31m-main: dog[m
[31m---- response_headers[m
[31m-! Host[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/unused.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/unused.t[m
[1mdeleted file mode 100644[m
[1mindex 1f35adc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/unused.t[m
[1m+++ /dev/null[m
[36m@@ -1,175 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 2);[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level("warn");[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: used output filter[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers "Foo: bar";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_log[m
[31m-headers more header filter[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unused output filter (none)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-headers more header filter[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unused output filter (with more_set_input_headers only)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers "Foo: bar";[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-headers more header filter[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: used rewrite handler[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers "Foo: bar";[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_log[m
[31m-headers more rewrite handler[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: unused rewrite handler (none)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #more_set_input_headers "Foo: bar";[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-headers more rewrite handler[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: unused rewrite handler (with output header filters)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #more_set_input_headers "Foo: bar";[m
[31m-        echo hi;[m
[31m-        more_set_headers "Foo: bar";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-headers more rewrite handler[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple http {} blocks (filter)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'Foo: bar';[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-headers more header filter[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: multiple http {} blocks (handler)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers 'Foo: bar';[m
[31m-        echo $http_foo;[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-bar[m
[31m---- no_error_log[m
[31m-headers more header handler[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/vars.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/vars.t[m
[1mdeleted file mode 100644[m
[1mindex 426c68c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/t/vars.t[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-plan tests => 9;[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: vars[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        set $val 'hello, world';[m
[31m-        more_set_headers 'X-Foo: $val';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-X-Foo: hello, world[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: vars in both key and val[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        set $val 'hello, world';[m
[31m-        more_set_headers '$val: $val';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-$val: hello, world[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: vars in input header directives[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $val 'dog';[m
[31m-        more_set_input_headers 'Host: $val';[m
[31m-        echo $host;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-dog[m
[31m---- response_headers[m
[31m-Host:[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 007194d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-        #--with-cc=gcc46 \[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-        --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB" \[m
[31m-        --without-mail_pop3_module \[m
[31m-        --without-mail_imap_module \[m
[31m-        --without-mail_smtp_module \[m
[31m-        --without-http_upstream_ip_hash_module \[m
[31m-        --without-http_empty_gif_module \[m
[31m-        --without-http_memcached_module \[m
[31m-        --without-http_referer_module \[m
[31m-        --without-http_autoindex_module \[m
[31m-        --without-http_auth_basic_module \[m
[31m-        --without-http_userid_module \[m
[31m-        --with-http_realip_module \[m
[31m-        --with-http_dav_module \[m
[31m-      --add-module=$root/../eval-nginx-module \[m
[31m-      --add-module=$root/../lua-nginx-module \[m
[31m-      --add-module=$root/../echo-nginx-module \[m
[31m-      --add-module=$root $opts \[m
[31m-      --with-debug[m
[31m-      #--add-module=$root/../ndk-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex bba7217..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/headers-more-nginx-module-0.30/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,215 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Cond[m
[31m-fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-obj:*[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_palloc_large[m
[31m-fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:lj_str_new[m
[31m-fun:lua_pushlstring[m
[31m-fun:ngx_http_lua_get_output_header[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr8[m
[31m-   fun:getenv[m
[31m-   fun:gcov_exit[m
[31m-   fun:exit[m
[31m-   fun:ngx_master_process_exit[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 8f16a99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-*.html[m
[31m-src/module.c[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-reindex[m
[31m-src/location.h[m
[31m-src/filter.c[m
[31m-src/subrequest.h[m
[31m-src/sleep.h[m
[31m-src/util.c[m
[31m-src/echo.c[m
[31m-src/info.c[m
[31m-src/util.h[m
[31m-src/var.h[m
[31m-src/filter.h[m
[31m-src/sleep.c[m
[31m-src/var.c[m
[31m-src/timer.c[m
[31m-src/module.h[m
[31m-src/echo.h[m
[31m-src/info.h[m
[31m-src/foreach.c[m
[31m-src/location.c[m
[31m-src/timer.h[m
[31m-src/module.c[m
[31m-src/subrequest.c[m
[31m-src/handler.h[m
[31m-src/foreach.h[m
[31m-src/handler.c[m
[31m-nginx[m
[31m-pack[m
[31m-all[m
[31m-t/servroot/[m
[31m-buildroot/[m
[31m-go[m
[31m-build1[01][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/config[m
[1mdeleted file mode 100644[m
[1mindex 2eed0ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/config[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_iconv; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_iconv; please put it before ngx_iconv." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_iconv; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_iconv; please put it before ngx_iconv." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <iconv.h>"[m
[31m-ngx_feature_test='iconv_t cd =  iconv_open("utf-8","gbk");[m
[31m-iconv_close(cd);'[m
[31m-[m
[31m-if [ -n "$LIBICONV_INC" -o -n "$LIBICONV_LIB" ]; then[m
[31m-    ngx_feature="libiconv in directories specified by LIBICONV_INC ($LIBICONV_INC) and LIBICONV_LIB ($LIBICONV_LIB)"[m
[31m-    ngx_feature_path="$LIBICONV_INC"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # test also with -liconv[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R$LIBICONV_LIB -L$LIBICONV_LIB -liconv"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L$LIBICONV_LIB -liconv"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-else[m
[31m-    # auto-discovery[m
[31m-    ngx_feature="libiconv"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # test also with -liconv[m
[31m-        ngx_feature_libs="-liconv"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        ngx_feature="libiconv in /usr/local/"[m
[31m-        ngx_feature_path="/usr/local/include"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -liconv"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/local/lib -liconv"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # NetBSD[m
[31m-        ngx_feature="libiconv in /usr/pkg/"[m
[31m-        ngx_feature_path="/usr/pkg/include/"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -liconv"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/pkg/lib -liconv"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # MacPorts[m
[31m-        ngx_feature="libiconv in /opt/local/"[m
[31m-        ngx_feature_path="/opt/local/include/"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -liconv"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/opt/local/lib -liconv"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-else[m
[31m- cat << END[m
[31m- $0: error: the ngx_iconv addon requires the iconv library.[m
[31m-END[m
[31m- exit 1[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_iconv_module[m
[31m-[m
[31m-HTTP_ICONV_DEPS="$ngx_addon_dir/src/ddebug.h"[m
[31m-HTTP_ICONV_SRCS="$ngx_addon_dir/src/ngx_http_iconv_module.c"[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HTTP_ICONV_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_ICONV_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_ICONV_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_ICONV_DEPS"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex d4233e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "iconv *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-[m
[31m-#       if defined(nginx_version) && nginx_version >= 8011[m
[31m-#           define dd_main_req_count r->main->count[m
[31m-#       else[m
[31m-#           define dd_main_req_count 0[m
[31m-#       endif[m
[31m-[m
[31m-static void dd_enter_helper(ngx_http_request_t *r, const char *func) {[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, ">enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            (int) dd_main_req_count, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static void dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/src/ngx_http_iconv_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/src/ngx_http_iconv_module.c[m
[1mdeleted file mode 100644[m
[1mindex 689475c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/src/ngx_http_iconv_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,743 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include <iconv.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t        iconv_buf_size;[m
[31m-static ngx_int_t        max_iconv_bufs;[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t       ngx_http_iconv_filter_used = 0;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t               buf_size;[m
[31m-    ngx_flag_t           enabled;[m
[31m-    u_char              *from;[m
[31m-    u_char              *to;[m
[31m-} ngx_http_iconv_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                uc; /* unfinished character */[m
[31m-} ngx_http_iconv_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_iconv_filter_pre(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_iconv_filter_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_iconv_header_filter(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_iconv_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_iconv_filter_convert(ngx_http_request_t *r,[m
[31m-    ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out);[m
[31m-static ngx_int_t ngx_http_do_iconv(ngx_http_request_t *r, ngx_chain_t **c,[m
[31m-    void *data, size_t len, u_char *from, u_char *to, size_t *conv_bytes,[m
[31m-    size_t *rest_bytes);[m
[31m-static ngx_int_t ngx_http_iconv_merge_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out);[m
[31m-static char *ngx_http_iconv_conf_handler(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_set_iconv_conf_handler(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_http_set_iconv_handler(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-static void *ngx_http_iconv_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_iconv_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static void ngx_http_iconv_discard_body(ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_iconv_commands[] = {[m
[31m-[m
[31m-    { ngx_string("set_iconv"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE4,[m
[31m-      ngx_http_set_iconv_conf_handler,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL[m
[31m-    },[m
[31m-[m
[31m-    { ngx_string("iconv_buffer_size"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_iconv_loc_conf_t, buf_size),[m
[31m-      NULL[m
[31m-    },[m
[31m-[m
[31m-    { ngx_string("iconv_filter"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_iconv_conf_handler,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_iconv_module_ctx = {[m
[31m-    ngx_http_iconv_filter_pre,          /* preconfiguration */[m
[31m-    ngx_http_iconv_filter_init,         /* postconfiguration */[m
[31m-    NULL,                               /* create main configuration */[m
[31m-    NULL,                               /* init main configuration */[m
[31m-    NULL,                               /* create server configuration */[m
[31m-    NULL,                               /* merge server configuration */[m
[31m-    ngx_http_iconv_create_loc_conf,     /* create location configuration */[m
[31m-    ngx_http_iconv_merge_loc_conf       /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_iconv_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_iconv_module_ctx,     /* module context */[m
[31m-    ngx_http_iconv_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                /* module type */[m
[31m-    NULL,                           /* init maseter */[m
[31m-    NULL,                           /* init module */[m
[31m-    NULL,                           /* init process */[m
[31m-    NULL,                           /* init thread */[m
[31m-    NULL,                           /* exit thread */[m
[31m-    NULL,                           /* exit process */[m
[31m-    NULL,                           /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt   ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_filter_pre(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_iconv_filter_used  = 0;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    if (ngx_http_iconv_filter_used) {[m
[31m-        ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-        ngx_http_top_header_filter = ngx_http_iconv_header_filter;[m
[31m-        ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-        ngx_http_top_body_filter = ngx_http_iconv_body_filter;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t       *ilcf;[m
[31m-    ngx_http_iconv_ctx_t            *ctx;[m
[31m-[m
[31m-    ilcf = ngx_http_get_module_loc_conf(r, ngx_http_iconv_module);[m
[31m-    if (!ilcf->enabled) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                      "iconv does not support HTTP < 1.0 yet");[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version == NGX_HTTP_VERSION_10) {[m
[31m-        r->keepalive = 0;[m
[31m-    }[m
[31m-[m
[31m-    iconv_buf_size = ilcf->buf_size;[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_iconv_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        dd("create new context");[m
[31m-        /*[m
[31m-         * set by ngx_pcalloc()[m
[31m-         *   ctx->uc->len = 0[m
[31m-         *   ctx->uc->data = NULL[m
[31m-         */[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_iconv_module));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_iconv_module);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t                         *ncl, *nncl;[m
[31m-    ngx_http_iconv_ctx_t                *ctx;[m
[31m-    ngx_int_t                            rc;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_iconv_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        dd("XXX in is NULL");[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (in->buf->last == in->buf->pos) {[m
[31m-        dd("pass 0 size buf to next body filter");[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    dd("create new chain link");[m
[31m-[m
[31m-    if (ngx_http_iconv_merge_chain_link(r, ctx, in, &ncl) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("discard previous chain link");[m
[31m-[m
[31m-    ngx_http_iconv_discard_body(in);[m
[31m-[m
[31m-    dd("start to convert");[m
[31m-[m
[31m-    rc = ngx_http_iconv_filter_convert(r, ctx, ncl, &nncl);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("iconv convertion error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (nncl == NULL) {[m
[31m-        dd ("nncl is NULL");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("pass to next body filter->\n%.*s",[m
[31m-       (int) (ncl->buf->last - ncl->buf->pos), ncl->buf->pos);[m
[31m-[m
[31m-    dd("nncl: len: %d, sync: %d, last_buf: %d, flush: %d, next: %p",[m
[31m-       (int) (nncl->buf->last - nncl->buf->pos),[m
[31m-       nncl->buf->sync, nncl->buf->last_buf,[m
[31m-       nncl->buf->flush, nncl->next);[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, nncl);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_merge_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out)[m
[31m-{[m
[31m-    ngx_chain_t             *cl, *ncl;[m
[31m-    ngx_buf_t               *buf;[m
[31m-    size_t                   len = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        len += buf->last - buf->pos;[m
[31m-[m
[31m-        dd("len: %d", (int) len);[m
[31m-        dd("sync: %d, last_buf: %d, flush: %d, memory: %d, in-file: %d, "[m
[31m-           "temp: %d", (int) buf->sync, (int) buf->last_buf,[m
[31m-           (int) buf->flush, (int) buf->memory, (int) buf->in_file,[m
[31m-           (int) buf->temporary);[m
[31m-    }[m
[31m-[m
[31m-    len += ctx->uc.len;[m
[31m-    /* requires C99 */[m
[31m-[m
[31m-    dd("XXX count buffer length: %zu", len);[m
[31m-[m
[31m-    ncl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (ncl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ncl->buf = buf;[m
[31m-    if (ctx->uc.len) {[m
[31m-        dd("copy unfinished character");[m
[31m-        buf->last = ngx_copy(buf->start, ctx->uc.data, ctx->uc.len);[m
[31m-    }[m
[31m-[m
[31m-    dd("copy old chain link");[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        if (cl->buf->last > cl->buf->pos) {[m
[31m-            buf->last = ngx_copy(buf->last, cl->buf->pos,[m
[31m-                                 cl->buf->last - cl->buf->pos);[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->sync) {[m
[31m-            buf->sync = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->flush) {[m
[31m-            buf->flush = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(cl->buf) && !ngx_buf_special(cl->buf)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "ngx_iconv only supports in-memory bufs");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            dd("find last buf");[m
[31m-            buf->last_buf = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ncl->next = NULL;[m
[31m-    *out = ncl;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_filter_convert(ngx_http_request_t *r,[m
[31m-    ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t   *ilcf;[m
[31m-    size_t                       rest;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    rest = 0;[m
[31m-    ilcf = ngx_http_get_module_loc_conf(r, ngx_http_iconv_module);[m
[31m-[m
[31m-    dd("XXX in->buf: %.*s",[m
[31m-       (int) (in->buf->last - in->buf->pos),[m
[31m-       in->buf->pos);[m
[31m-[m
[31m-    dd("XXX last buf: %d",[m
[31m-       (int) in->buf->last_buf);[m
[31m-[m
[31m-    if (in->buf->last - in->buf->pos) {[m
[31m-        rc = ngx_http_do_iconv(r, out, in->buf->pos,[m
[31m-                               in->buf->last - in->buf->pos, ilcf->from,[m
[31m-                               ilcf->to, NULL, &rest);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "convert error from ngx_http_do_iconv");[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->last_buf) {[m
[31m-            for (cl = *out; cl->next; cl = cl->next) {[m
[31m-                /* do nothing */[m
[31m-            }[m
[31m-            cl->buf->last_buf = 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        *out = in;[m
[31m-    }[m
[31m-[m
[31m-    dd("ilcf->to:%s", ilcf->to);[m
[31m-[m
[31m-    if (rest) {[m
[31m-        ctx->uc.data = ngx_palloc(r->pool, rest);[m
[31m-        if (ctx->uc.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("%p, %p, %zu", ctx->uc.data, in->buf->last, rest);[m
[31m-[m
[31m-        ngx_memcpy(ctx->uc.data, in->buf->last - rest, rest);[m
[31m-[m
[31m-        ctx->uc.len = rest;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->uc.data = NULL;[m
[31m-        ctx->uc.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_do_iconv(ngx_http_request_t *r, ngx_chain_t **c, void *data,[m
[31m-    size_t len, u_char *from, u_char *to, size_t *conved_bytes,[m
[31m-    size_t *rest_bytes)[m
[31m-{[m
[31m-    iconv_t           cd;[m
[31m-    ngx_chain_t      *cl, *chain, **ll;[m
[31m-    ngx_buf_t        *b;[m
[31m-    size_t            cv, rest, rv;[m
[31m-[m
[31m-    cv = 0;[m
[31m-    dd("iconv from=%s, to=%s", from, to);[m
[31m-    cd = iconv_open((const char *) to, (const char *) from);[m
[31m-[m
[31m-    if (cd == (iconv_t) -1) {[m
[31m-        dd("iconv open error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("len=%zu, iconv_buf_size=%zu", len, iconv_buf_size);[m
[31m-    ll = &chain;[m
[31m-[m
[31m-conv_begin:[m
[31m-[m
[31m-    while (len) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            iconv_close(cd);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        /* --- b->temporary--- */[m
[31m-        b = ngx_create_temp_buf(r->pool, iconv_buf_size);[m
[31m-        if (b == NULL) {[m
[31m-            iconv_close(cd);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        rest = iconv_buf_size;[m
[31m-[m
[31m-        do {[m
[31m-            rv = iconv(cd, (void *) &data, &len, (void *) &b->last, &rest);[m
[31m-[m
[31m-            if (rv == (size_t) -1) {[m
[31m-                if (errno == EINVAL) {[m
[31m-                    cv += iconv_buf_size - rest;[m
[31m-                    dd("iconv error:EINVAL,len=%d cv=%d rest=%d", (int) len,[m
[31m-                       (int) cv, (int) rest);[m
[31m-                    goto conv_done;[m
[31m-                }[m
[31m-[m
[31m-                if (errno == E2BIG) {[m
[31m-                    dd("E2BIG");[m
[31m-                    /* E2BIG error is not considered*/[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (errno == EILSEQ) {[m
[31m-                    ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                                  "iconv sees invalid character sequence "[m
[31m-                                  "(EILSEQ)");[m
[31m-[m
[31m-                    if (len >= 1) {[m
[31m-                        if (rest == 0) {[m
[31m-                            dd("EILSEQ:rest=0");[m
[31m-                            cv += iconv_buf_size - rest;[m
[31m-                            *ll = cl;[m
[31m-                            ll = &cl->next;[m
[31m-                            goto conv_begin;[m
[31m-[m
[31m-                        } else {[m
[31m-                            dd("EILSEQ:rest=%d", (int) rest);[m
[31m-                            len--;[m
[31m-                            data = (u_char *)data + 1;[m
[31m-                            /* replace illegal character to '?' */[m
[31m-                            *b->last = '?';[m
[31m-                            b->last = (u_char *)b->last + 1;[m
[31m-                            rest--;[m
[31m-                        }[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto conv_done;[m
[31m-                    }[m
[31m-[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } while (rv == (size_t) -1 && errno == EILSEQ);[m
[31m-[m
[31m-        /* E2BIG error is not considered*/[m
[31m-        /* this code can work but stops when meet illegal encoding */[m
[31m-        /*[m
[31m-        if (rv == (size_t) -1) {[m
[31m-            if (errno == EILSEQ) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                        "iconv error:EILSEQ");[m
[31m-                iconv_close(cd);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (errno == EINVAL) {[m
[31m-                cv += iconv_buf_size - rest;[m
[31m-                dd("iconv error:EINVAL,len=%d cv=%d rest=%d", (int) len,[m
[31m-                        (int) cv, (int) rest);[m
[31m-                break;[m
[31m-            } else if (errno == E2BIG) {[m
[31m-                dd("iconv error:E2BIG");[m
[31m-            }[m
[31m-        }[m
[31m-        */[m
[31m-        cv += iconv_buf_size - rest;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-conv_done:[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-    if (conved_bytes) {[m
[31m-        *conved_bytes = cv;[m
[31m-    }[m
[31m-[m
[31m-    if (rest_bytes) {[m
[31m-        dd("rest bytes:%zu", len);[m
[31m-        *rest_bytes = len;[m
[31m-    }[m
[31m-[m
[31m-    if (c) {[m
[31m-        dd("chain: %p", chain);[m
[31m-[m
[31m-        /* chain may be null */[m
[31m-        /*[m
[31m-        dd("conv done: chain buf: %.*s",[m
[31m-                (int) (chain->buf->last - chain->buf->pos),[m
[31m-                chain->buf->last);[m
[31m-        */[m
[31m-        *c = chain;[m
[31m-    }[m
[31m-[m
[31m-    dd("out");[m
[31m-    iconv_close(cd);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_iconv_discard_body(ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_iconv_conf_handler(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t   *ilcf;[m
[31m-    ngx_str_t                   *value;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       tl;[m
[31m-    ilcf = conf;[m
[31m-[m
[31m-    ngx_http_iconv_filter_used = 1;[m
[31m-[m
[31m-    ilcf->enabled = 1;[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    tl = sizeof("from=") - 1;[m
[31m-    if (ngx_strncasecmp((u_char *) "from=", value[1].data, tl)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        dd("invalid 'from='");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ilcf->from = ngx_palloc(cf->pool, value[1].len - tl + 1);[m
[31m-    if (ilcf->from == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(ilcf->from, value[1].data + tl, value[1].len - tl);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    tl = sizeof("to=") - 1;[m
[31m-    if (ngx_strncasecmp((u_char *) "to=", value[2].data, tl)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        dd("invalid 'to='");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ilcf->to = ngx_palloc(cf->pool, value[2].len - tl + 1);[m
[31m-    if (ilcf->to == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(ilcf->to, value[2].data + tl, value[2].len - tl);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    dd("iconv_filter:from=%s to=%s", ilcf->from, ilcf->to);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_iconv_conf_handler(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                filter;[m
[31m-    ngx_str_t                   *value, s[3];[m
[31m-[m
[31m-    max_iconv_bufs = 256;[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.func = ngx_http_set_iconv_handler;[m
[31m-    filter.size = 3;[m
[31m-[m
[31m-    /* set_iconv $dst $src from= to= */[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-    s[0] = value[1];[m
[31m-[m
[31m-    s[1] = value[2];[m
[31m-    if (ngx_strncasecmp((u_char *) "from=", s[1].data, sizeof("from=") - 1)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s[1].data += sizeof("from=") - 1;[m
[31m-    s[1].len -= (sizeof("from=") - 1);[m
[31m-[m
[31m-    s[2] = value[3];[m
[31m-    if (ngx_strncasecmp((u_char *) "to=", s[2].data, sizeof("to=") - 1) != 0) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s[2].data += sizeof("to=") - 1;[m
[31m-    s[2].len -= (sizeof("to=") - 1);[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, value, s, &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_iconv_handler(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_chain_t                 *cl, *chain;[m
[31m-    ngx_buf_t                   *buf;[m
[31m-    u_char                      *src, *dst, *p;[m
[31m-    size_t                       converted;[m
[31m-    u_char *                     end;[m
[31m-    ngx_http_iconv_loc_conf_t   *ilcf;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    if (v->len == 0) {[m
[31m-        res->data = NULL;[m
[31m-        res->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ilcf = ngx_http_get_module_loc_conf(r, ngx_http_iconv_module);[m
[31m-    iconv_buf_size = ilcf->buf_size;[m
[31m-    dd("iconv_buf_size=%d", (int) iconv_buf_size);[m
[31m-[m
[31m-    src = ngx_palloc(r->pool, v[1].len + 1);[m
[31m-    if (src == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dst = ngx_palloc(r->pool, v[2].len + 1);[m
[31m-    if (dst == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    end = ngx_copy(src, v[1].data, v[1].len);[m
[31m-    *end = '\0';[m
[31m-    end = ngx_copy(dst, v[2].data, v[2].len);[m
[31m-    *end = '\0';[m
[31m-[m
[31m-    dd("dst:%s\n, src:%s\n", dst, src);[m
[31m-    rc = ngx_http_do_iconv(r, &chain, v[0].data, v[0].len, src, dst,[m
[31m-                           &converted, NULL);[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("convert error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->data = ngx_palloc(r->pool, converted);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = res->data;[m
[31m-    res->len = converted;[m
[31m-[m
[31m-    for (cl = chain; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        dd("after convert, buf:%.*s", (int) (buf->last - buf->pos), buf->pos);[m
[31m-        p = ngx_copy(p, buf->pos, buf->last - buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    dd("%.*s\n%.*s\n%.*s\n", v[0].len, v[0].data, v[1].len, v[1].data, v[2].len,[m
[31m-       v[2].data);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_iconv_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t       *ilcf;[m
[31m-[m
[31m-    ilcf = ngx_palloc(cf->pool, sizeof(ngx_http_iconv_loc_conf_t));[m
[31m-    if (ilcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ilcf->buf_size = NGX_CONF_UNSET_SIZE;[m
[31m-    ilcf->enabled = NGX_CONF_UNSET;[m
[31m-    ilcf->from = NGX_CONF_UNSET_PTR;[m
[31m-    ilcf->to = NGX_CONF_UNSET_PTR;[m
[31m-    return ilcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_iconv_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t       *conf, *prev;[m
[31m-[m
[31m-    conf = child;[m
[31m-    prev = parent;[m
[31m-[m
[31m-    dd("before merge:conf->size=%d,prev->size=%d", (int) conf->buf_size,[m
[31m-       (int) prev->buf_size);[m
[31m-[m
[31m-    if (conf->buf_size <= 1 || prev->buf_size <= 1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "iconv_buffer_size must not less than 2 bytes");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buf_size, prev->buf_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    dd("after merge:conf->size=%d,prev->size=%d", (int) conf->buf_size,[m
[31m-       (int) prev->buf_size);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enabled, prev->enabled, 0);[m
[31m-    ngx_conf_merge_ptr_value(conf->from, (void *)prev->from, (char *) "utf-8");[m
[31m-    ngx_conf_merge_ptr_value(conf->to, (void *)prev->to, (char *) "gbk");[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 8d05e43..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 3);[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: used with rds_json[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rds_json_ret 100 '你好';[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body eval[m
[31m-"{\"errcode\":100,\"errstr\":\"你好\"}"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: content in buf than set flush flag[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n '你';[m
[31m-        echo_flush;[m
[31m-        echo '好';[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: iconv used with local file[m
[31m---- config[m
[31m-    location /data.txt {[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> data.txt[m
[31m-你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好[m
[31m---- request[m
[31m-GET /data.txt[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: content in buf than set flush flag[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-        default_type text/plain;[m
[31m-        more_clear_headers Date;[m
[31m-        echo $arg_v;[m
[31m-    }[m
[31m-[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location = /main {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            assert(sock:connect("127.0.0.1", $TEST_NGINX_SERVER_PORT))[m
[31m-            assert(sock:send("GET /t?v=你好\\r\\n"))[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.say("error: ", err)[m
[31m-            else[m
[31m-                ngx.print(res)[m
[31m-            end[m
[31m-            assert(sock:connect("127.0.0.1", $TEST_NGINX_SERVER_PORT))[m
[31m-            assert(sock:send("GET /t?v=你好 HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"))[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.say("error: ", err)[m
[31m-            else[m
[31m-                ngx.print(res)[m
[31m-            end[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"你好[m
[31m-HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-\x{c4}\x{e3}\x{ba}\x{c3}[m
[31m-"[m
[31m---- grep_error_log eval: qr/iconv does not support HTTP < 1.0 yet/[m
[31m---- grep_error_log_out[m
[31m-iconv does not support HTTP < 1.0 yet[m
[31m---- error_log[m
[31m-[warn][m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 9b66795..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic convertion[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $src '你好';[m
[31m-        set_iconv $dst $src from=utf-8 to=gbk;[m
[31m-        echo $dst;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: more complex convertion[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $src '淘宝网 - 亚洲最大、最安全的网上交易平台，提供各类服饰、美容、家居、数码、话费/点卡充值… 2亿优质特价商品，同时提供担保交易(先收货后付款)、先行赔付、假一赔三、七天无理由退换货、数码免费维修等安全交易保障服务，让你全面安心享受网上购物乐趣！';[m
[31m-        set_iconv $dst $src from=UTF-8 to=gbk;[m
[31m-        echo $dst;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-淘宝网 - 亚洲最大、最安全的网上交易平台，提供各类服饰、美容、家居、数码、话费/点卡充值… 2亿优质特价商品，同时提供担保交易(先收货后付款)、先行赔付、假一赔三、七天无理由退换货、数码免费维修等安全交易保障服务，让你全面安心享受网上购物乐趣！[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: large iconv_buffer_size[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $src '你好';[m
[31m-        iconv_buffer_size 1M;[m
[31m-        set_iconv $dst $src from=utf-8 to=GBK;[m
[31m-        echo $dst;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: iconv content filter[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        echo '你好';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: content in multi buf[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        #set_unescape_uri $a $arg_a;[m
[31m-        #set_unescape_uri $b $arg_b;[m
[31m-        #set_unescape_uri $c $arg_c;[m
[31m-        #set_unescape_uri $d $arg_d;[m
[31m-        echo -n $arg_a;[m
[31m-        echo -n $arg_b;[m
[31m-        echo -n $arg_c;[m
[31m-        echo  $arg_d;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=你&b=好&c=世&d=界[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好世界[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: content in multi buf[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        set_unescape_uri $a $arg_a;[m
[31m-        set_unescape_uri $b $arg_b;[m
[31m-        set_unescape_uri $c $arg_c;[m
[31m-        set_unescape_uri $d $arg_d;[m
[31m-        set_unescape_uri $e $arg_e;[m
[31m-        set_unescape_uri $f $arg_f;[m
[31m-        echo -n $a;[m
[31m-        echo -n $b;[m
[31m-        echo -n $c;[m
[31m-        echo -n $d;[m
[31m-        echo -n $e;[m
[31m-        echo  $f;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=%e4&b=%bd&c=%a0&d=%e5&e=%a5&f=%bd[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: content in multi buf[m
[31m---- config[m
[31m-location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        iconv_buffer_size 1k;[m
[31m-        set_unescape_uri $a $arg_a;[m
[31m-        set_unescape_uri $b $arg_b;[m
[31m-        set_unescape_uri $c $arg_c;[m
[31m-        set_unescape_uri $d $arg_d;[m
[31m-        set_unescape_uri $e $arg_e;[m
[31m-        set_unescape_uri $f $arg_f;[m
[31m-        echo -n $a;[m
[31m-        echo -n $b;[m
[31m-        echo -n $c;[m
[31m-        echo -n $d;[m
[31m-        echo -n $e;[m
[31m-        echo  $f;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=%e4&b=%bd&c=%a0&d=%e5&e=%a5&f=%bd[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: some complex text[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 2;[m
[31m-        echo '106,纪梵希 蜜粉,8,4.5,62.5%[m
[31m-107,时空胶囊,8,3.2857142857143,42.86%[m
[31m-108,雅顿 vc 美白 胶囊,8,7,14.29%[m
[31m-109,水磁场,8,5,14.29%[m
[31m-110,GEL,8,1,100%[m
[31m-111,雅顿 润唇膏 正品,8,8,20%[m
[31m-112,玫瑰面膜,8,1.5,87.5%[m
[31m-113,露得清 祛痘,8,5.1428571428571,42.86%[m
[31m-114,美白水,8,4.75,50%[m
[31m-115,ë,8,1.875,87.5%[m
[31m-116,大米粉,8,1.25,75%[m
[31m-350,薇姿油脂调护洁面啫喱,2,1,100%[m
[31m-475,啫喱 屈臣氏,1,1,100%[m
[31m-569,洗面奶啫喱,1,1,100%';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-106,纪梵希 蜜粉,8,4.5,62.5%[m
[31m-107,时空胶囊,8,3.2857142857143,42.86%[m
[31m-108,雅顿 vc 美白 胶囊,8,7,14.29%[m
[31m-109,水磁场,8,5,14.29%[m
[31m-110,GEL,8,1,100%[m
[31m-111,雅顿 润唇膏 正品,8,8,20%[m
[31m-112,玫瑰面膜,8,1.5,87.5%[m
[31m-113,露得清 祛痘,8,5.1428571428571,42.86%[m
[31m-114,美白水,8,4.75,50%[m
[31m-115,??,8,1.875,87.5%[m
[31m-116,大米粉,8,1.25,75%[m
[31m-350,薇姿油脂调护洁面啫喱,2,1,100%[m
[31m-475,啫喱 屈臣氏,1,1,100%[m
[31m-569,洗面奶啫喱,1,1,100%[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9:[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 10;[m
[31m-        echo '106,纪梵希 蜜粉,8,4.5,62.5%[m
[31m-107,时空胶囊,8,3.2857142857143,42.86%[m
[31m-108,雅顿 vc 美白 胶囊,8,7,14.29%[m
[31m-109,水磁场,8,5,14.29%[m
[31m-110,GEL,8,1,100%[m
[31m-111,雅顿 润唇膏 正品,8,8,20%[m
[31m-112,玫瑰面膜,8,1.5,87.5%[m
[31m-113,露得清 祛痘,8,5.1428571428571,42.86%[m
[31m-114,美白水,8,4.75,50%[m
[31m-115,ë,8,1.875,87.5%[m
[31m-116,大米粉,8,1.25,75%[m
[31m-350,薇姿油脂调护洁面啫喱,2,1,100%[m
[31m-475,啫喱 屈臣氏,1,1,100%[m
[31m-569,洗面奶啫喱,1,1,100%';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-106,纪梵希 蜜粉,8,4.5,62.5%[m
[31m-107,时空胶囊,8,3.2857142857143,42.86%[m
[31m-108,雅顿 vc 美白 胶囊,8,7,14.29%[m
[31m-109,水磁场,8,5,14.29%[m
[31m-110,GEL,8,1,100%[m
[31m-111,雅顿 润唇膏 正品,8,8,20%[m
[31m-112,玫瑰面膜,8,1.5,87.5%[m
[31m-113,露得清 祛痘,8,5.1428571428571,42.86%[m
[31m-114,美白水,8,4.75,50%[m
[31m-115,??,8,1.875,87.5%[m
[31m-116,大米粉,8,1.25,75%[m
[31m-350,薇姿油脂调护洁面啫喱,2,1,100%[m
[31m-475,啫喱 屈臣氏,1,1,100%[m
[31m-569,洗面奶啫喱,1,1,100%[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: text that can't be converted, buffer size smaller than content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 2;[m
[31m-        echo 'ë?';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: text that can't be converted, buffer size smaller than content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 2;[m
[31m-        echo '?ë';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: text that can't be converted, buffer size smaller than content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 3;[m
[31m-        echo '?ë';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: text that can't be converted, buffer size equals content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 4;[m
[31m-        echo '?ë';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: text that can't be converted, buffer size larger than content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 5;[m
[31m-        echo '?ë';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: iconv_filter used with proxy_pass[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/bar;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        content_by_lua 'ngx.print("这是一段文本")';[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body chop[m
[31m-这是一段文本[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: iconv content filter / HTTP 1.0[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        echo '你好';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: iconv used together with proxy[m
[31m---- config[m
[31m-    location /data.txt {[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/data.txt;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> data.txt[m
[31m-你好[m
[31m---- request[m
[31m-GET /proxy[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: iconv_filter used with proxy_pass[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/bar;[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        content_by_lua 'ngx.print("这是一段文本")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body chop[m
[31m-这是一段文本[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: iconv_filter used with proxy_pass[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        content_by_lua 'ngx.print("这是一段文本")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- charset: gbk[m
[31m---- response_body chop[m
[31m-这是一段文本[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: iconv_filter used with proxy_pass[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #set_form_input $data;[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/bar;[m
[31m-        proxy_http_version 1.0;[m
[31m-        #echo $data;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n "你好";[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body chop[m
[31m-你好[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 9f61937..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-         #--with-cc="gcc46" \[m
[31m-ngx-build $force $version \[m
[31m-          --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:/usr/local/lib" \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root/../form-input-nginx-module \[m
[31m-          --add-module=$root/../rds-json-nginx-module \[m
[31m-          --add-module=$root/../headers-more-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-            --with-debug \[m
[31m-          || exit 1[m
[31m-          #--with-debug || exit 1[m
[31m-          #--add-module=$home/work/ngx_http_auth_request-0.1 #\[m
[31m-          #--with-rtsig_module[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 3ac1380..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/iconv-nginx-module-0.14/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,166 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-obj:*[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:lj_str_new[m
[31m-fun:lua_getfield[m
[31m-fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   a1 [m
[31m-   Memcheck:Leak[m
[31m-   fun:_vgrZU_libcZdsoZa_malloc[m
[31m-   fun:ngx_strerror_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <a2>[m
[31m-   Memcheck:Leak[m
[31m-   fun:_vgrZU_libcZdsoZa_malloc[m
[31m-   fun:ngx_strerror_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <a3>[m
[31m-   Memcheck:Leak[m
[31m-   fun:_vgrZU_libcZdsoZa_malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <a4>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   /lib/libc-2.12.so[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/install b/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[1mdeleted file mode 100755[m
[1mindex 34ae937..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/install[m
[1m+++ /dev/null[m
[36m@@ -1,98 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use Getopt::Std qw(getopts);[m
[31m-[m
[31m-my %opts;[m
[31m-getopts("dm:", \%opts) or usage();[m
[31m-[m
[31m-my $mode = $opts{m};[m
[31m-[m
[31m-if ($opts{d}) {[m
[31m-    shell("mkdir -p @ARGV");[m
[31m-    exit;[m
[31m-}[m
[31m-[m
[31m-if (@ARGV < 2) {[m
[31m-    usage();[m
[31m-}[m
[31m-[m
[31m-my $dst = pop;[m
[31m-[m
[31m-my @src = @ARGV;[m
[31m-[m
[31m-my $target_dir;[m
[31m-[m
[31m-if (@src > 1 || $dst =~ m{/$}) {[m
[31m-    $target_dir = $dst;[m
[31m-[m
[31m-} elsif (-d $dst) {[m
[31m-    $target_dir = $dst;[m
[31m-[m
[31m-} elsif ($dst =~ m{(.+)/}) {[m
[31m-    $target_dir = $1;[m
[31m-[m
[31m-} else {[m
[31m-    $target_dir = '.';[m
[31m-}[m
[31m-[m
[31m-if (!-d $target_dir) {[m
[31m-    shell("mkdir -p $target_dir");[m
[31m-}[m
[31m-[m
[31m-if (-f $dst) {[m
[31m-    shell("rm $dst");[m
[31m-[m
[31m-} else {[m
[31m-    for my $f (@src) {[m
[31m-        if (-f $f) {[m
[31m-            (my $name = $f) =~ s{.*/}{}g;[m
[31m-            my $target = "$target_dir/$name";[m
[31m-            if (-f $target) {[m
[31m-                shell("rm $target");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-shell("cp @src $dst");[m
[31m-[m
[31m-if (-f $dst) {[m
[31m-    if (defined $mode) {[m
[31m-        chmod oct($mode), $dst or[m
[31m-            die "failed to change mode of $dst to $mode.\n";[m
[31m-    }[m
[31m-[m
[31m-    exit;[m
[31m-}[m
[31m-[m
[31m-for my $src (@src) {[m
[31m-    my $name;[m
[31m-[m
[31m-    if ($src =~ m{/([^/]+)$}) {[m
[31m-        $name = $1;[m
[31m-[m
[31m-    } else {[m
[31m-        $name = $src;[m
[31m-    }[m
[31m-[m
[31m-    if (defined $mode) {[m
[31m-        my $target = "$target_dir/$name";[m
[31m-        chmod oct($mode), $target or[m
[31m-            die "failed to change mode of $target to $mode.\n";[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-sub usage {[m
[31m-    die "Usage: install [-d] [-m <attrs>] <src>... <dst>\n";[m
[31m-}[m
[31m-[m
[31m-sub shell {[m
[31m-    my $cmd = shift;[m
[31m-    #warn $cmd;[m
[31m-    system($cmd) == 0 or[m
[31m-        die "failed to run command $cmd\n";[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/COPYRIGHT b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/COPYRIGHT[m
[1mdeleted file mode 100644[m
[1mindex a860268..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/COPYRIGHT[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-Lua License[m
[31m------------[m
[31m-[m
[31m-Lua is licensed under the terms of the MIT license reproduced below.[m
[31m-This means that Lua is free software and can be used for both academic[m
[31m-and commercial purposes at absolutely no cost.[m
[31m-[m
[31m-For details and rationale, see http://www.lua.org/license.html .[m
[31m-[m
[31m-===============================================================================[m
[31m-[m
[31m-Copyright (C) 1994-2012 Lua.org, PUC-Rio.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining a copy[m
[31m-of this software and associated documentation files (the "Software"), to deal[m
[31m-in the Software without restriction, including without limitation the rights[m
[31m-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell[m
[31m-copies of the Software, and to permit persons to whom the Software is[m
[31m-furnished to do so, subject to the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be included in[m
[31m-all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR[m
[31m-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,[m
[31m-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE[m
[31m-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER[m
[31m-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,[m
[31m-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN[m
[31m-THE SOFTWARE.[m
[31m-[m
[31m-===============================================================================[m
[31m-[m
[31m-(end of COPYRIGHT)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/HISTORY b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/HISTORY[m
[1mdeleted file mode 100644[m
[1mindex ce0c95b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/HISTORY[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-HISTORY for Lua 5.1[m
[31m-[m
[31m-* Changes from version 5.0 to 5.1[m
[31m-  -------------------------------[m
[31m-  Language:[m
[31m-  + new module system.[m
[31m-  + new semantics for control variables of fors.[m
[31m-  + new semantics for setn/getn.[m
[31m-  + new syntax/semantics for varargs.[m
[31m-  + new long strings and comments.[m
[31m-  + new `mod' operator (`%')[m
[31m-  + new length operator #t[m
[31m-  + metatables for all types[m
[31m-  API:[m
[31m-  + new functions: lua_createtable, lua_get(set)field, lua_push(to)integer.[m
[31m-  + user supplies memory allocator (lua_open becomes lua_newstate).[m
[31m-  + luaopen_* functions must be called through Lua.[m
[31m-  Implementation:[m
[31m-  + new configuration scheme via luaconf.h.[m
[31m-  + incremental garbage collection.[m
[31m-  + better handling of end-of-line in the lexer.[m
[31m-  + fully reentrant parser (new Lua function `load')[m
[31m-  + better support for 64-bit machines.[m
[31m-  + native loadlib support for Mac OS X.[m
[31m-  + standard distribution in only one library (lualib.a merged into lua.a)[m
[31m-[m
[31m-* Changes from version 4.0 to 5.0[m
[31m-  -------------------------------[m
[31m-  Language:[m
[31m-  + lexical scoping.[m
[31m-  + Lua coroutines.[m
[31m-  + standard libraries now packaged in tables.[m
[31m-  + tags replaced by metatables and tag methods replaced by metamethods,[m
[31m-    stored in metatables.[m
[31m-  + proper tail calls.[m
[31m-  + each function can have its own global table, which can be shared.[m
[31m-  + new __newindex metamethod, called when we insert a new key into a table.[m
[31m-  + new block comments: --[[ ... ]].[m
[31m-  + new generic for.[m
[31m-  + new weak tables.[m
[31m-  + new boolean type.[m
[31m-  + new syntax "local function".[m
[31m-  + (f()) returns the first value returned by f.[m
[31m-  + {f()} fills a table with all values returned by f.[m
[31m-  + \n ignored in [[\n .[m
[31m-  + fixed and-or priorities.[m
[31m-  + more general syntax for function definition (e.g. function a.x.y:f()...end).[m
[31m-  + more general syntax for function calls (e.g. (print or write)(9)).[m
[31m-  + new functions (time/date, tmpfile, unpack, require, load*, etc.).[m
[31m-  API:[m
[31m-  + chunks are loaded by using lua_load; new luaL_loadfile and luaL_loadbuffer.[m
[31m-  + introduced lightweight userdata, a simple "void*" without a metatable.[m
[31m-  + new error handling protocol: the core no longer prints error messages;[m
[31m-    all errors are reported to the caller on the stack.[m
[31m-  + new lua_atpanic for host cleanup.[m
[31m-  + new, signal-safe, hook scheme.[m
[31m-  Implementation:[m
[31m-  + new license: MIT.[m
[31m-  + new, faster, register-based virtual machine.[m
[31m-  + support for external multithreading and coroutines.[m
[31m-  + new and consistent error message format.[m
[31m-  + the core no longer needs "stdio.h" for anything (except for a single[m
[31m-    use of sprintf to convert numbers to strings).[m
[31m-  + lua.c now runs the environment variable LUA_INIT, if present. It can[m
[31m-    be "@filename", to run a file, or the chunk itself.[m
[31m-  + support for user extensions in lua.c.[m
[31m-    sample implementation given for command line editing.[m
[31m-  + new dynamic loading library, active by default on several platforms.[m
[31m-  + safe garbage-collector metamethods.[m
[31m-  + precompiled bytecodes checked for integrity (secure binary dostring).[m
[31m-  + strings are fully aligned.[m
[31m-  + position capture in string.find.[m
[31m-  + read('*l') can read lines with embedded zeros.[m
[31m-[m
[31m-* Changes from version 3.2 to 4.0[m
[31m-  -------------------------------[m
[31m-  Language:[m
[31m-  + new "break" and "for" statements (both numerical and for tables).[m
[31m-  + uniform treatment of globals: globals are now stored in a Lua table.[m
[31m-  + improved error messages.[m
[31m-  + no more '$debug': full speed *and* full debug information.[m
[31m-  + new read form: read(N) for next N bytes.[m
[31m-  + general read patterns now deprecated.[m
[31m-    (still available with -DCOMPAT_READPATTERNS.)[m
[31m-  + all return values are passed as arguments for the last function[m
[31m-    (old semantics still available with -DLUA_COMPAT_ARGRET)[m
[31m-  + garbage collection tag methods for tables now deprecated.[m
[31m-  + there is now only one tag method for order.[m
[31m-  API:[m
[31m-  + New API: fully re-entrant, simpler, and more efficient.[m
[31m-  + New debug API.[m
[31m-  Implementation:[m
[31m-  + faster than ever: cleaner virtual machine and new hashing algorithm.[m
[31m-  + non-recursive garbage-collector algorithm.[m
[31m-  + reduced memory usage for programs with many strings.[m
[31m-  + improved treatment for memory allocation errors.[m
[31m-  + improved support for 16-bit machines (we hope).[m
[31m-  + code now compiles unmodified as both ANSI C and C++.[m
[31m-  + numbers in bases other than 10 are converted using strtoul.[m
[31m-  + new -f option in Lua to support #! scripts.[m
[31m-  + luac can now combine text and binaries.[m
[31m-[m
[31m-* Changes from version 3.1 to 3.2[m
[31m-  -------------------------------[m
[31m-  + redirected all output in Lua's core to _ERRORMESSAGE and _ALERT.[m
[31m-  + increased limit on the number of constants and globals per function[m
[31m-    (from 2^16 to 2^24).[m
[31m-  + debugging info (lua_debug and hooks) moved into lua_state and new API[m
[31m-    functions provided to get and set this info.[m
[31m-  + new debug lib gives full debugging access within Lua.[m
[31m-  + new table functions "foreachi", "sort", "tinsert", "tremove", "getn".[m
[31m-  + new io functions "flush", "seek".[m
[31m-[m
[31m-* Changes from version 3.0 to 3.1[m
[31m-  -------------------------------[m
[31m-  + NEW FEATURE: anonymous functions with closures (via "upvalues").[m
[31m-  + new syntax:[m
[31m-    - local variables in chunks.[m
[31m-    - better scope control with DO block END.[m
[31m-    - constructors can now be also written: { record-part; list-part }.[m
[31m-    - more general syntax for function calls and lvalues, e.g.:[m
[31m-      f(x).y=1[m
[31m-      o:f(x,y):g(z)[m
[31m-      f"string" is sugar for f("string")[m
[31m-  + strings may now contain arbitrary binary data (e.g., embedded zeros).[m
[31m-  + major code re-organization and clean-up; reduced module interdependecies.[m
[31m-  + no arbitrary limits on the total number of constants and globals.[m
[31m-  + support for multiple global contexts.[m
[31m-  + better syntax error messages.[m
[31m-  + new traversal functions "foreach" and "foreachvar".[m
[31m-  + the default for numbers is now double.[m
[31m-    changing it to use floats or longs is easy.[m
[31m-  + complete debug information stored in pre-compiled chunks.[m
[31m-  + sample interpreter now prompts user when run interactively, and also[m
[31m-    handles control-C interruptions gracefully.[m
[31m-[m
[31m-* Changes from version 2.5 to 3.0[m
[31m-  -------------------------------[m
[31m-  + NEW CONCEPT: "tag methods".[m
[31m-    Tag methods replace fallbacks as the meta-mechanism for extending the[m
[31m-    semantics of Lua. Whereas fallbacks had a global nature, tag methods[m
[31m-    work on objects having the same tag (e.g., groups of tables).[m
[31m-    Existing code that uses fallbacks should work without change.[m
[31m-  + new, general syntax for constructors {[exp] = exp, ... }.[m
[31m-  + support for handling variable number of arguments in functions (varargs).[m
[31m-  + support for conditional compilation ($if ... $else ... $end).[m
[31m-  + cleaner semantics in API simplifies host code.[m
[31m-  + better support for writing libraries (auxlib.h).[m
[31m-  + better type checking and error messages in the standard library.[m
[31m-  + luac can now also undump.[m
[31m-[m
[31m-* Changes from version 2.4 to 2.5[m
[31m-  -------------------------------[m
[31m-  + io and string libraries are now based on pattern matching;[m
[31m-    the old libraries are still available for compatibility[m
[31m-  + dofile and dostring can now return values (via return statement)[m
[31m-  + better support for 16- and 64-bit machines[m
[31m-  + expanded documentation, with more examples[m
[31m-[m
[31m-* Changes from version 2.2 to 2.4[m
[31m-  -------------------------------[m
[31m-  + external compiler creates portable binary files that can be loaded faster[m
[31m-  + interface for debugging and profiling[m
[31m-  + new "getglobal" fallback[m
[31m-  + new functions for handling references to Lua objects[m
[31m-  + new functions in standard lib[m
[31m-  + only one copy of each string is stored[m
[31m-  + expanded documentation, with more examples[m
[31m-[m
[31m-* Changes from version 2.1 to 2.2[m
[31m-  -------------------------------[m
[31m-  + functions now may be declared with any "lvalue" as a name[m
[31m-  + garbage collection of functions[m
[31m-  + support for pipes[m
[31m-[m
[31m-* Changes from version 1.1 to 2.1[m
[31m-  -------------------------------[m
[31m-  + object-oriented support[m
[31m-  + fallbacks[m
[31m-  + simplified syntax for tables[m
[31m-  + many internal improvements[m
[31m-[m
[31m-(end of HISTORY)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/INSTALL b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/INSTALL[m
[1mdeleted file mode 100644[m
[1mindex 17eb8ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/INSTALL[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-INSTALL for Lua 5.1[m
[31m-[m
[31m-* Building Lua[m
[31m-  ------------[m
[31m-  Lua is built in the src directory, but the build process can be[m
[31m-  controlled from the top-level Makefile.[m
[31m-[m
[31m-  Building Lua on Unix systems should be very easy. First do "make" and[m
[31m-  see if your platform is listed. If so, just do "make xxx", where xxx[m
[31m-  is your platform name. The platforms currently supported are:[m
[31m-    aix ansi bsd freebsd generic linux macosx mingw posix solaris[m
[31m-[m
[31m-  If your platform is not listed, try the closest one or posix, generic,[m
[31m-  ansi, in this order.[m
[31m-[m
[31m-  See below for customization instructions and for instructions on how[m
[31m-  to build with other Windows compilers.[m
[31m-[m
[31m-  If you want to check that Lua has been built correctly, do "make test"[m
[31m-  after building Lua. Also, have a look at the example programs in test.[m
[31m-[m
[31m-* Installing Lua[m
[31m-  --------------[m
[31m-  Once you have built Lua, you may want to install it in an official[m
[31m-  place in your system. In this case, do "make install". The official[m
[31m-  place and the way to install files are defined in Makefile. You must[m
[31m-  have the right permissions to install files.[m
[31m-[m
[31m-  If you want to build and install Lua in one step, do "make xxx install",[m
[31m-  where xxx is your platform name.[m
[31m-[m
[31m-  If you want to install Lua locally, then do "make local". This will[m
[31m-  create directories bin, include, lib, man, and install Lua there as[m
[31m-  follows:[m
[31m-[m
[31m-    bin:	lua luac[m
[31m-    include:	lua.h luaconf.h lualib.h lauxlib.h lua.hpp[m
[31m-    lib:	liblua.a[m
[31m-    man/man1:	lua.1 luac.1[m
[31m-[m
[31m-  These are the only directories you need for development.[m
[31m-[m
[31m-  There are man pages for lua and luac, in both nroff and html, and a[m
[31m-  reference manual in html in doc, some sample code in test, and some[m
[31m-  useful stuff in etc. You don't need these directories for development.[m
[31m-[m
[31m-  If you want to install Lua locally, but in some other directory, do[m
[31m-  "make install INSTALL_TOP=xxx", where xxx is your chosen directory.[m
[31m-[m
[31m-  See below for instructions for Windows and other systems.[m
[31m-[m
[31m-* Customization[m
[31m-  -------------[m
[31m-  Three things can be customized by editing a file:[m
[31m-    - Where and how to install Lua -- edit Makefile.[m
[31m-    - How to build Lua -- edit src/Makefile.[m
[31m-    - Lua features -- edit src/luaconf.h.[m
[31m-[m
[31m-  You don't actually need to edit the Makefiles because you may set the[m
[31m-  relevant variables when invoking make.[m
[31m-[m
[31m-  On the other hand, if you need to select some Lua features, you'll need[m
[31m-  to edit src/luaconf.h. The edited file will be the one installed, and[m
[31m-  it will be used by any Lua clients that you build, to ensure consistency.[m
[31m-[m
[31m-  We strongly recommend that you enable dynamic loading. This is done[m
[31m-  automatically for all platforms listed above that have this feature[m
[31m-  (and also Windows). See src/luaconf.h and also src/Makefile.[m
[31m-[m
[31m-* Building Lua on Windows and other systems[m
[31m-  -----------------------------------------[m
[31m-  If you're not using the usual Unix tools, then the instructions for[m
[31m-  building Lua depend on the compiler you use. You'll need to create[m
[31m-  projects (or whatever your compiler uses) for building the library,[m
[31m-  the interpreter, and the compiler, as follows:[m
[31m-[m
[31m-  library:	lapi.c lcode.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c[m
[31m-		lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c[m
[31m-		ltable.c ltm.c lundump.c lvm.c lzio.c[m
[31m-		lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c loslib.c[m
[31m-		ltablib.c lstrlib.c loadlib.c linit.c[m
[31m-[m
[31m-  interpreter:	library, lua.c[m
[31m-[m
[31m-  compiler:	library, luac.c print.c[m
[31m-[m
[31m-  If you use Visual Studio .NET, you can use etc/luavs.bat in its[m
[31m-  "Command Prompt".[m
[31m-[m
[31m-  If all you want is to build the Lua interpreter, you may put all .c files[m
[31m-  in a single project, except for luac.c and print.c. Or just use etc/all.c.[m
[31m-[m
[31m-  To use Lua as a library in your own programs, you'll need to know how to[m
[31m-  create and use libraries with your compiler.[m
[31m-[m
[31m-  As mentioned above, you may edit luaconf.h to select some features before[m
[31m-  building Lua.[m
[31m-[m
[31m-(end of INSTALL)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 7be61c8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,128 +0,0 @@[m
[31m-# makefile for installing Lua[m
[31m-# see INSTALL for installation instructions[m
[31m-# see src/Makefile and src/luaconf.h for further customization[m
[31m-[m
[31m-# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================[m
[31m-[m
[31m-# Your platform. See PLATS for possible values.[m
[31m-PLAT= none[m
[31m-[m
[31m-# Where to install. The installation starts in the src and doc directories,[m
[31m-# so take care if INSTALL_TOP is not an absolute path.[m
[31m-INSTALL_TOP= /usr/local[m
[31m-INSTALL_BIN= $(INSTALL_TOP)/bin[m
[31m-INSTALL_INC= $(INSTALL_TOP)/include[m
[31m-INSTALL_LIB= $(INSTALL_TOP)/lib[m
[31m-INSTALL_MAN= $(INSTALL_TOP)/man/man1[m
[31m-#[m
[31m-# You probably want to make INSTALL_LMOD and INSTALL_CMOD consistent with[m
[31m-# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h (and also with etc/lua.pc).[m
[31m-INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V[m
[31m-INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V[m
[31m-[m
[31m-# How to install. If your install program does not support "-p", then you[m
[31m-# may have to run ranlib on the installed liblua.a (do "make ranlib").[m
[31m-#INSTALL= install -p[m
[31m-#INSTALL_EXEC= $(INSTALL) -m 0755[m
[31m-#INSTALL_DATA= $(INSTALL) -m 0644[m
[31m-#[m
[31m-# If you don't have install you can use cp instead.[m
[31m-INSTALL= cp -p[m
[31m-INSTALL_EXEC= $(INSTALL)[m
[31m-INSTALL_DATA= $(INSTALL)[m
[31m-[m
[31m-# Utilities.[m
[31m-MKDIR= mkdir -p[m
[31m-RANLIB= ranlib[m
[31m-[m
[31m-# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE =========[m
[31m-[m
[31m-# Convenience platforms targets.[m
[31m-PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris[m
[31m-[m
[31m-# What to install.[m
[31m-TO_BIN= lua luac[m
[31m-TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp[m
[31m-TO_LIB= liblua.a[m
[31m-TO_MAN= lua.1 luac.1[m
[31m-[m
[31m-# Lua version and release.[m
[31m-V= 5.1[m
[31m-R= 5.1.5[m
[31m-[m
[31m-all:	$(PLAT)[m
[31m-[m
[31m-$(PLATS) clean:[m
[31m-	cd src && $(MAKE) $@[m
[31m-[m
[31m-test:	dummy[m
[31m-	src/lua test/hello.lua[m
[31m-[m
[31m-install: dummy[m
[31m-	cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD)[m
[31m-	cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN)[m
[31m-	cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC)[m
[31m-	cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB)[m
[31m-	cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN)[m
[31m-[m
[31m-ranlib:[m
[31m-	cd src && cd $(INSTALL_LIB) && $(RANLIB) $(TO_LIB)[m
[31m-[m
[31m-local:[m
[31m-	$(MAKE) install INSTALL_TOP=..[m
[31m-[m
[31m-none:[m
[31m-	@echo "Please do"[m
[31m-	@echo "   make PLATFORM"[m
[31m-	@echo "where PLATFORM is one of these:"[m
[31m-	@echo "   $(PLATS)"[m
[31m-	@echo "See INSTALL for complete instructions."[m
[31m-[m
[31m-# make may get confused with test/ and INSTALL in a case-insensitive OS[m
[31m-dummy:[m
[31m-[m
[31m-# echo config parameters[m
[31m-echo:[m
[31m-	@echo ""[m
[31m-	@echo "These are the parameters currently set in src/Makefile to build Lua $R:"[m
[31m-	@echo ""[m
[31m-	@cd src && $(MAKE) -s echo[m
[31m-	@echo ""[m
[31m-	@echo "These are the parameters currently set in Makefile to install Lua $R:"[m
[31m-	@echo ""[m
[31m-	@echo "PLAT = $(PLAT)"[m
[31m-	@echo "INSTALL_TOP = $(INSTALL_TOP)"[m
[31m-	@echo "INSTALL_BIN = $(INSTALL_BIN)"[m
[31m-	@echo "INSTALL_INC = $(INSTALL_INC)"[m
[31m-	@echo "INSTALL_LIB = $(INSTALL_LIB)"[m
[31m-	@echo "INSTALL_MAN = $(INSTALL_MAN)"[m
[31m-	@echo "INSTALL_LMOD = $(INSTALL_LMOD)"[m
[31m-	@echo "INSTALL_CMOD = $(INSTALL_CMOD)"[m
[31m-	@echo "INSTALL_EXEC = $(INSTALL_EXEC)"[m
[31m-	@echo "INSTALL_DATA = $(INSTALL_DATA)"[m
[31m-	@echo ""[m
[31m-	@echo "See also src/luaconf.h ."[m
[31m-	@echo ""[m
[31m-[m
[31m-# echo private config parameters[m
[31m-pecho:[m
[31m-	@echo "V = $(V)"[m
[31m-	@echo "R = $(R)"[m
[31m-	@echo "TO_BIN = $(TO_BIN)"[m
[31m-	@echo "TO_INC = $(TO_INC)"[m
[31m-	@echo "TO_LIB = $(TO_LIB)"[m
[31m-	@echo "TO_MAN = $(TO_MAN)"[m
[31m-[m
[31m-# echo config parameters as Lua code[m
[31m-# uncomment the last sed expression if you want nil instead of empty strings[m
[31m-lecho:[m
[31m-	@echo "-- installation parameters for Lua $R"[m
[31m-	@echo "VERSION = '$V'"[m
[31m-	@echo "RELEASE = '$R'"[m
[31m-	@$(MAKE) echo | grep = | sed -e 's/= /= "/' -e 's/$$/"/' #-e 's/""/nil/'[m
[31m-	@echo "-- EOF"[m
[31m-[m
[31m-# list targets that do not create files (but not all makes understand .PHONY)[m
[31m-.PHONY: all $(PLATS) clean test install local none dummy echo pecho lecho[m
[31m-[m
[31m-# (end of Makefile)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/README[m
[1mdeleted file mode 100644[m
[1mindex 11b4dff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/README[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-README for Lua 5.1[m
[31m-[m
[31m-See INSTALL for installation instructions.[m
[31m-See HISTORY for a summary of changes since the last released version.[m
[31m-[m
[31m-* What is Lua?[m
[31m-  ------------[m
[31m-  Lua is a powerful, light-weight programming language designed for extending[m
[31m-  applications. Lua is also frequently used as a general-purpose, stand-alone[m
[31m-  language. Lua is free software.[m
[31m-[m
[31m-  For complete information, visit Lua's web site at http://www.lua.org/ .[m
[31m-  For an executive summary, see http://www.lua.org/about.html .[m
[31m-[m
[31m-  Lua has been used in many different projects around the world.[m
[31m-  For a short list, see http://www.lua.org/uses.html .[m
[31m-[m
[31m-* Availability[m
[31m-  ------------[m
[31m-  Lua is freely available for both academic and commercial purposes.[m
[31m-  See COPYRIGHT and http://www.lua.org/license.html for details.[m
[31m-  Lua can be downloaded at http://www.lua.org/download.html .[m
[31m-[m
[31m-* Installation[m
[31m-  ------------[m
[31m-  Lua is implemented in pure ANSI C, and compiles unmodified in all known[m
[31m-  platforms that have an ANSI C compiler. In most Unix-like platforms, simply[m
[31m-  do "make" with a suitable target. See INSTALL for detailed instructions.[m
[31m-[m
[31m-* Origin[m
[31m-  ------[m
[31m-  Lua is developed at Lua.org, a laboratory of the Department of Computer[m
[31m-  Science of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro[m
[31m-  in Brazil).[m
[31m-  For more information about the authors, see http://www.lua.org/authors.html .[m
[31m-[m
[31m-(end of README)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/contents.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/contents.html[m
[1mdeleted file mode 100644[m
[1mindex 3d83da9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/contents.html[m
[1m+++ /dev/null[m
[36m@@ -1,497 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">[m
[31m-<HTML>[m
[31m-<HEAD>[m
[31m-<TITLE>Lua 5.1 Reference Manual - contents</TITLE>[m
[31m-<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">[m
[31m-<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8">[m
[31m-<STYLE TYPE="text/css">[m
[31m-ul {[m
[31m-	list-style-type: none ;[m
[31m-}[m
[31m-</STYLE>[m
[31m-</HEAD>[m
[31m-[m
[31m-<BODY>[m
[31m-[m
[31m-<HR>[m
[31m-<H1>[m
[31m-<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="" BORDER=0></A>[m
[31m-Lua 5.1 Reference Manual[m
[31m-</H1>[m
[31m-[m
[31m-<P>[m
[31m-The reference manual is the official definition of the Lua language.[m
[31m-For a complete introduction to Lua programming, see the book[m
[31m-<A HREF="http://www.lua.org/docs.html#pil">Programming in Lua</A>.[m
[31m-[m
[31m-<P>[m
[31m-This manual is also available as a book:[m
[31m-<BLOCKQUOTE>[m
[31m-<A HREF="http://www.amazon.com/exec/obidos/ASIN/8590379833/lua-indexmanual-20">[m
[31m-<IMG SRC="cover.png" ALT="" TITLE="buy from Amazon" BORDER=1 ALIGN="left" HSPACE=12>[m
[31m-</A>[m
[31m-<B>Lua 5.1 Reference Manual</B>[m
[31m-<BR>by R. Ierusalimschy, L. H. de Figueiredo, W. Celes[m
[31m-<BR>Lua.org, August 2006[m
[31m-<BR>ISBN 85-903798-3-3[m
[31m-<BR CLEAR="all">[m
[31m-</BLOCKQUOTE>[m
[31m-[m
[31m-<P>[m
[31m-<A HREF="http://www.amazon.com/exec/obidos/ASIN/8590379833/lua-indexmanual-20">Buy a copy</A>[m
[31m-of this book and[m
[31m-<A HREF="http://www.lua.org/donations.html">help to support</A>[m
[31m-the Lua project.[m
[31m-[m
[31m-<P>[m
[31m-<A HREF="manual.html">start</A>[m
[31m-&middot;[m
[31m-<A HREF="#contents">contents</A>[m
[31m-&middot;[m
[31m-<A HREF="#index">index</A>[m
[31m-&middot;[m
[31m-<A HREF="http://www.lua.org/manual/">other versions</A>[m
[31m-<HR>[m
[31m-<SMALL>[m
[31m-Copyright &copy; 2006&ndash;2012 Lua.org, PUC-Rio.[m
[31m-Freely available under the terms of the[m
[31m-<A HREF="http://www.lua.org/license.html">Lua license</A>.[m
[31m-</SMALL>[m
[31m-[m
[31m-<H2><A NAME="contents">Contents</A></H2>[m
[31m-<UL style="padding: 0">[m
[31m-<LI><A HREF="manual.html">1 &ndash; Introduction</A>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#2">2 &ndash; The Language</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.1">2.1 &ndash; Lexical Conventions</A>[m
[31m-<LI><A HREF="manual.html#2.2">2.2 &ndash; Values and Types</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.2.1">2.2.1 &ndash; Coercion</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#2.3">2.3 &ndash; Variables</A>[m
[31m-<LI><A HREF="manual.html#2.4">2.4 &ndash; Statements</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.4.1">2.4.1 &ndash; Chunks</A>[m
[31m-<LI><A HREF="manual.html#2.4.2">2.4.2 &ndash; Blocks</A>[m
[31m-<LI><A HREF="manual.html#2.4.3">2.4.3 &ndash; Assignment</A>[m
[31m-<LI><A HREF="manual.html#2.4.4">2.4.4 &ndash; Control Structures</A>[m
[31m-<LI><A HREF="manual.html#2.4.5">2.4.5 &ndash; For Statement</A>[m
[31m-<LI><A HREF="manual.html#2.4.6">2.4.6 &ndash; Function Calls as Statements</A>[m
[31m-<LI><A HREF="manual.html#2.4.7">2.4.7 &ndash; Local Declarations</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#2.5">2.5 &ndash; Expressions</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.5.1">2.5.1 &ndash; Arithmetic Operators</A>[m
[31m-<LI><A HREF="manual.html#2.5.2">2.5.2 &ndash; Relational Operators</A>[m
[31m-<LI><A HREF="manual.html#2.5.3">2.5.3 &ndash; Logical Operators</A>[m
[31m-<LI><A HREF="manual.html#2.5.4">2.5.4 &ndash; Concatenation</A>[m
[31m-<LI><A HREF="manual.html#2.5.5">2.5.5 &ndash; The Length Operator</A>[m
[31m-<LI><A HREF="manual.html#2.5.6">2.5.6 &ndash; Precedence</A>[m
[31m-<LI><A HREF="manual.html#2.5.7">2.5.7 &ndash; Table Constructors</A>[m
[31m-<LI><A HREF="manual.html#2.5.8">2.5.8 &ndash; Function Calls</A>[m
[31m-<LI><A HREF="manual.html#2.5.9">2.5.9 &ndash; Function Definitions</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#2.6">2.6 &ndash; Visibility Rules</A>[m
[31m-<LI><A HREF="manual.html#2.7">2.7 &ndash; Error Handling</A>[m
[31m-<LI><A HREF="manual.html#2.8">2.8 &ndash; Metatables</A>[m
[31m-<LI><A HREF="manual.html#2.9">2.9 &ndash; Environments</A>[m
[31m-<LI><A HREF="manual.html#2.10">2.10 &ndash; Garbage Collection</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.10.1">2.10.1 &ndash; Garbage-Collection Metamethods</A>[m
[31m-<LI><A HREF="manual.html#2.10.2">2.10.2 &ndash; Weak Tables</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#2.11">2.11 &ndash; Coroutines</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#3">3 &ndash; The Application Program Interface</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#3.1">3.1 &ndash; The Stack</A>[m
[31m-<LI><A HREF="manual.html#3.2">3.2 &ndash; Stack Size</A>[m
[31m-<LI><A HREF="manual.html#3.3">3.3 &ndash; Pseudo-Indices</A>[m
[31m-<LI><A HREF="manual.html#3.4">3.4 &ndash; C Closures</A>[m
[31m-<LI><A HREF="manual.html#3.5">3.5 &ndash; Registry</A>[m
[31m-<LI><A HREF="manual.html#3.6">3.6 &ndash; Error Handling in C</A>[m
[31m-<LI><A HREF="manual.html#3.7">3.7 &ndash; Functions and Types</A>[m
[31m-<LI><A HREF="manual.html#3.8">3.8 &ndash; The Debug Interface</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#4">4 &ndash; The Auxiliary Library</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#4.1">4.1 &ndash; Functions and Types</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#5">5 &ndash; Standard Libraries</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#5.1">5.1 &ndash; Basic Functions</A>[m
[31m-<LI><A HREF="manual.html#5.2">5.2 &ndash; Coroutine Manipulation</A>[m
[31m-<LI><A HREF="manual.html#5.3">5.3 &ndash; Modules</A>[m
[31m-<LI><A HREF="manual.html#5.4">5.4 &ndash; String Manipulation</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#5.4.1">5.4.1 &ndash; Patterns</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#5.5">5.5 &ndash; Table Manipulation</A>[m
[31m-<LI><A HREF="manual.html#5.6">5.6 &ndash; Mathematical Functions</A>[m
[31m-<LI><A HREF="manual.html#5.7">5.7 &ndash; Input and Output Facilities</A>[m
[31m-<LI><A HREF="manual.html#5.8">5.8 &ndash; Operating System Facilities</A>[m
[31m-<LI><A HREF="manual.html#5.9">5.9 &ndash; The Debug Library</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#6">6 &ndash; Lua Stand-alone</A>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#7">7 &ndash; Incompatibilities with the Previous Version</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#7.1">7.1 &ndash; Changes in the Language</A>[m
[31m-<LI><A HREF="manual.html#7.2">7.2 &ndash; Changes in the Libraries</A>[m
[31m-<LI><A HREF="manual.html#7.3">7.3 &ndash; Changes in the API</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#8">8 &ndash; The Complete Syntax of Lua</A>[m
[31m-</UL>[m
[31m-[m
[31m-<H2><A NAME="index">Index</A></H2>[m
[31m-<TABLE WIDTH="100%">[m
[31m-<TR VALIGN="top">[m
[31m-<TD>[m
[31m-<H3><A NAME="functions">Lua functions</A></H3>[m
[31m-<A HREF="manual.html#pdf-_G">_G</A><BR>[m
[31m-<A HREF="manual.html#pdf-_VERSION">_VERSION</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-assert">assert</A><BR>[m
[31m-<A HREF="manual.html#pdf-collectgarbage">collectgarbage</A><BR>[m
[31m-<A HREF="manual.html#pdf-dofile">dofile</A><BR>[m
[31m-<A HREF="manual.html#pdf-error">error</A><BR>[m
[31m-<A HREF="manual.html#pdf-getfenv">getfenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-getmetatable">getmetatable</A><BR>[m
[31m-<A HREF="manual.html#pdf-ipairs">ipairs</A><BR>[m
[31m-<A HREF="manual.html#pdf-load">load</A><BR>[m
[31m-<A HREF="manual.html#pdf-loadfile">loadfile</A><BR>[m
[31m-<A HREF="manual.html#pdf-loadstring">loadstring</A><BR>[m
[31m-<A HREF="manual.html#pdf-module">module</A><BR>[m
[31m-<A HREF="manual.html#pdf-next">next</A><BR>[m
[31m-<A HREF="manual.html#pdf-pairs">pairs</A><BR>[m
[31m-<A HREF="manual.html#pdf-pcall">pcall</A><BR>[m
[31m-<A HREF="manual.html#pdf-print">print</A><BR>[m
[31m-<A HREF="manual.html#pdf-rawequal">rawequal</A><BR>[m
[31m-<A HREF="manual.html#pdf-rawget">rawget</A><BR>[m
[31m-<A HREF="manual.html#pdf-rawset">rawset</A><BR>[m
[31m-<A HREF="manual.html#pdf-require">require</A><BR>[m
[31m-<A HREF="manual.html#pdf-select">select</A><BR>[m
[31m-<A HREF="manual.html#pdf-setfenv">setfenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-setmetatable">setmetatable</A><BR>[m
[31m-<A HREF="manual.html#pdf-tonumber">tonumber</A><BR>[m
[31m-<A HREF="manual.html#pdf-tostring">tostring</A><BR>[m
[31m-<A HREF="manual.html#pdf-type">type</A><BR>[m
[31m-<A HREF="manual.html#pdf-unpack">unpack</A><BR>[m
[31m-<A HREF="manual.html#pdf-xpcall">xpcall</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-coroutine.create">coroutine.create</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.resume">coroutine.resume</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.running">coroutine.running</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.status">coroutine.status</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.wrap">coroutine.wrap</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.yield">coroutine.yield</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-debug.debug">debug.debug</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getfenv">debug.getfenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.gethook">debug.gethook</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getinfo">debug.getinfo</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getlocal">debug.getlocal</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getmetatable">debug.getmetatable</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getregistry">debug.getregistry</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getupvalue">debug.getupvalue</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.setfenv">debug.setfenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.sethook">debug.sethook</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.setlocal">debug.setlocal</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.setmetatable">debug.setmetatable</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.setupvalue">debug.setupvalue</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.traceback">debug.traceback</A><BR>[m
[31m-[m
[31m-</TD>[m
[31m-<TD>[m
[31m-<H3>&nbsp;</H3>[m
[31m-<A HREF="manual.html#pdf-file:close">file:close</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:flush">file:flush</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:lines">file:lines</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:read">file:read</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:seek">file:seek</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:setvbuf">file:setvbuf</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:write">file:write</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-io.close">io.close</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.flush">io.flush</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.input">io.input</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.lines">io.lines</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.open">io.open</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.output">io.output</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.popen">io.popen</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.read">io.read</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.stderr">io.stderr</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.stdin">io.stdin</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.stdout">io.stdout</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.tmpfile">io.tmpfile</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.type">io.type</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.write">io.write</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-math.abs">math.abs</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.acos">math.acos</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.asin">math.asin</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.atan">math.atan</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.atan2">math.atan2</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.ceil">math.ceil</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.cos">math.cos</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.cosh">math.cosh</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.deg">math.deg</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.exp">math.exp</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.floor">math.floor</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.fmod">math.fmod</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.frexp">math.frexp</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.huge">math.huge</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.ldexp">math.ldexp</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.log">math.log</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.log10">math.log10</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.max">math.max</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.min">math.min</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.modf">math.modf</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.pi">math.pi</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.pow">math.pow</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.rad">math.rad</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.random">math.random</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.randomseed">math.randomseed</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.sin">math.sin</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.sinh">math.sinh</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.sqrt">math.sqrt</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.tan">math.tan</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.tanh">math.tanh</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-os.clock">os.clock</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.date">os.date</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.difftime">os.difftime</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.execute">os.execute</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.exit">os.exit</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.getenv">os.getenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.remove">os.remove</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.rename">os.rename</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.setlocale">os.setlocale</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.time">os.time</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.tmpname">os.tmpname</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-package.cpath">package.cpath</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.loaded">package.loaded</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.loaders">package.loaders</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.loadlib">package.loadlib</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.path">package.path</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.preload">package.preload</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.seeall">package.seeall</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-string.byte">string.byte</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.char">string.char</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.dump">string.dump</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.find">string.find</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.format">string.format</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.gmatch">string.gmatch</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.gsub">string.gsub</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.len">string.len</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.lower">string.lower</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.match">string.match</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.rep">string.rep</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.reverse">string.reverse</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.sub">string.sub</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.upper">string.upper</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-table.concat">table.concat</A><BR>[m
[31m-<A HREF="manual.html#pdf-table.insert">table.insert</A><BR>[m
[31m-<A HREF="manual.html#pdf-table.maxn">table.maxn</A><BR>[m
[31m-<A HREF="manual.html#pdf-table.remove">table.remove</A><BR>[m
[31m-<A HREF="manual.html#pdf-table.sort">table.sort</A><BR>[m
[31m-[m
[31m-</TD>[m
[31m-<TD>[m
[31m-<H3>C API</H3>[m
[31m-<A HREF="manual.html#lua_Alloc">lua_Alloc</A><BR>[m
[31m-<A HREF="manual.html#lua_CFunction">lua_CFunction</A><BR>[m
[31m-<A HREF="manual.html#lua_Debug">lua_Debug</A><BR>[m
[31m-<A HREF="manual.html#lua_Hook">lua_Hook</A><BR>[m
[31m-<A HREF="manual.html#lua_Integer">lua_Integer</A><BR>[m
[31m-<A HREF="manual.html#lua_Number">lua_Number</A><BR>[m
[31m-<A HREF="manual.html#lua_Reader">lua_Reader</A><BR>[m
[31m-<A HREF="manual.html#lua_State">lua_State</A><BR>[m
[31m-<A HREF="manual.html#lua_Writer">lua_Writer</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#lua_atpanic">lua_atpanic</A><BR>[m
[31m-<A HREF="manual.html#lua_call">lua_call</A><BR>[m
[31m-<A HREF="manual.html#lua_checkstack">lua_checkstack</A><BR>[m
[31m-<A HREF="manual.html#lua_close">lua_close</A><BR>[m
[31m-<A HREF="manual.html#lua_concat">lua_concat</A><BR>[m
[31m-<A HREF="manual.html#lua_cpcall">lua_cpcall</A><BR>[m
[31m-<A HREF="manual.html#lua_createtable">lua_createtable</A><BR>[m
[31m-<A HREF="manual.html#lua_dump">lua_dump</A><BR>[m
[31m-<A HREF="manual.html#lua_equal">lua_equal</A><BR>[m
[31m-<A HREF="manual.html#lua_error">lua_error</A><BR>[m
[31m-<A HREF="manual.html#lua_gc">lua_gc</A><BR>[m
[31m-<A HREF="manual.html#lua_getallocf">lua_getallocf</A><BR>[m
[31m-<A HREF="manual.html#lua_getfenv">lua_getfenv</A><BR>[m
[31m-<A HREF="manual.html#lua_getfield">lua_getfield</A><BR>[m
[31m-<A HREF="manual.html#lua_getglobal">lua_getglobal</A><BR>[m
[31m-<A HREF="manual.html#lua_gethook">lua_gethook</A><BR>[m
[31m-<A HREF="manual.html#lua_gethookcount">lua_gethookcount</A><BR>[m
[31m-<A HREF="manual.html#lua_gethookmask">lua_gethookmask</A><BR>[m
[31m-<A HREF="manual.html#lua_getinfo">lua_getinfo</A><BR>[m
[31m-<A HREF="manual.html#lua_getlocal">lua_getlocal</A><BR>[m
[31m-<A HREF="manual.html#lua_getmetatable">lua_getmetatable</A><BR>[m
[31m-<A HREF="manual.html#lua_getstack">lua_getstack</A><BR>[m
[31m-<A HREF="manual.html#lua_gettable">lua_gettable</A><BR>[m
[31m-<A HREF="manual.html#lua_gettop">lua_gettop</A><BR>[m
[31m-<A HREF="manual.html#lua_getupvalue">lua_getupvalue</A><BR>[m
[31m-<A HREF="manual.html#lua_insert">lua_insert</A><BR>[m
[31m-<A HREF="manual.html#lua_isboolean">lua_isboolean</A><BR>[m
[31m-<A HREF="manual.html#lua_iscfunction">lua_iscfunction</A><BR>[m
[31m-<A HREF="manual.html#lua_isfunction">lua_isfunction</A><BR>[m
[31m-<A HREF="manual.html#lua_islightuserdata">lua_islightuserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_isnil">lua_isnil</A><BR>[m
[31m-<A HREF="manual.html#lua_isnone">lua_isnone</A><BR>[m
[31m-<A HREF="manual.html#lua_isnoneornil">lua_isnoneornil</A><BR>[m
[31m-<A HREF="manual.html#lua_isnumber">lua_isnumber</A><BR>[m
[31m-<A HREF="manual.html#lua_isstring">lua_isstring</A><BR>[m
[31m-<A HREF="manual.html#lua_istable">lua_istable</A><BR>[m
[31m-<A HREF="manual.html#lua_isthread">lua_isthread</A><BR>[m
[31m-<A HREF="manual.html#lua_isuserdata">lua_isuserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_lessthan">lua_lessthan</A><BR>[m
[31m-<A HREF="manual.html#lua_load">lua_load</A><BR>[m
[31m-<A HREF="manual.html#lua_newstate">lua_newstate</A><BR>[m
[31m-<A HREF="manual.html#lua_newtable">lua_newtable</A><BR>[m
[31m-<A HREF="manual.html#lua_newthread">lua_newthread</A><BR>[m
[31m-<A HREF="manual.html#lua_newuserdata">lua_newuserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_next">lua_next</A><BR>[m
[31m-<A HREF="manual.html#lua_objlen">lua_objlen</A><BR>[m
[31m-<A HREF="manual.html#lua_pcall">lua_pcall</A><BR>[m
[31m-<A HREF="manual.html#lua_pop">lua_pop</A><BR>[m
[31m-<A HREF="manual.html#lua_pushboolean">lua_pushboolean</A><BR>[m
[31m-<A HREF="manual.html#lua_pushcclosure">lua_pushcclosure</A><BR>[m
[31m-<A HREF="manual.html#lua_pushcfunction">lua_pushcfunction</A><BR>[m
[31m-<A HREF="manual.html#lua_pushfstring">lua_pushfstring</A><BR>[m
[31m-<A HREF="manual.html#lua_pushinteger">lua_pushinteger</A><BR>[m
[31m-<A HREF="manual.html#lua_pushlightuserdata">lua_pushlightuserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_pushliteral">lua_pushliteral</A><BR>[m
[31m-<A HREF="manual.html#lua_pushlstring">lua_pushlstring</A><BR>[m
[31m-<A HREF="manual.html#lua_pushnil">lua_pushnil</A><BR>[m
[31m-<A HREF="manual.html#lua_pushnumber">lua_pushnumber</A><BR>[m
[31m-<A HREF="manual.html#lua_pushstring">lua_pushstring</A><BR>[m
[31m-<A HREF="manual.html#lua_pushthread">lua_pushthread</A><BR>[m
[31m-<A HREF="manual.html#lua_pushvalue">lua_pushvalue</A><BR>[m
[31m-<A HREF="manual.html#lua_pushvfstring">lua_pushvfstring</A><BR>[m
[31m-<A HREF="manual.html#lua_rawequal">lua_rawequal</A><BR>[m
[31m-<A HREF="manual.html#lua_rawget">lua_rawget</A><BR>[m
[31m-<A HREF="manual.html#lua_rawgeti">lua_rawgeti</A><BR>[m
[31m-<A HREF="manual.html#lua_rawset">lua_rawset</A><BR>[m
[31m-<A HREF="manual.html#lua_rawseti">lua_rawseti</A><BR>[m
[31m-<A HREF="manual.html#lua_register">lua_register</A><BR>[m
[31m-<A HREF="manual.html#lua_remove">lua_remove</A><BR>[m
[31m-<A HREF="manual.html#lua_replace">lua_replace</A><BR>[m
[31m-<A HREF="manual.html#lua_resume">lua_resume</A><BR>[m
[31m-<A HREF="manual.html#lua_setallocf">lua_setallocf</A><BR>[m
[31m-<A HREF="manual.html#lua_setfenv">lua_setfenv</A><BR>[m
[31m-<A HREF="manual.html#lua_setfield">lua_setfield</A><BR>[m
[31m-<A HREF="manual.html#lua_setglobal">lua_setglobal</A><BR>[m
[31m-<A HREF="manual.html#lua_sethook">lua_sethook</A><BR>[m
[31m-<A HREF="manual.html#lua_setlocal">lua_setlocal</A><BR>[m
[31m-<A HREF="manual.html#lua_setmetatable">lua_setmetatable</A><BR>[m
[31m-<A HREF="manual.html#lua_settable">lua_settable</A><BR>[m
[31m-<A HREF="manual.html#lua_settop">lua_settop</A><BR>[m
[31m-<A HREF="manual.html#lua_setupvalue">lua_setupvalue</A><BR>[m
[31m-<A HREF="manual.html#lua_status">lua_status</A><BR>[m
[31m-<A HREF="manual.html#lua_toboolean">lua_toboolean</A><BR>[m
[31m-<A HREF="manual.html#lua_tocfunction">lua_tocfunction</A><BR>[m
[31m-<A HREF="manual.html#lua_tointeger">lua_tointeger</A><BR>[m
[31m-<A HREF="manual.html#lua_tolstring">lua_tolstring</A><BR>[m
[31m-<A HREF="manual.html#lua_tonumber">lua_tonumber</A><BR>[m
[31m-<A HREF="manual.html#lua_topointer">lua_topointer</A><BR>[m
[31m-<A HREF="manual.html#lua_tostring">lua_tostring</A><BR>[m
[31m-<A HREF="manual.html#lua_tothread">lua_tothread</A><BR>[m
[31m-<A HREF="manual.html#lua_touserdata">lua_touserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_type">lua_type</A><BR>[m
[31m-<A HREF="manual.html#lua_typename">lua_typename</A><BR>[m
[31m-<A HREF="manual.html#lua_upvalueindex">lua_upvalueindex</A><BR>[m
[31m-<A HREF="manual.html#lua_xmove">lua_xmove</A><BR>[m
[31m-<A HREF="manual.html#lua_yield">lua_yield</A><BR>[m
[31m-[m
[31m-</TD>[m
[31m-<TD>[m
[31m-<H3>auxiliary library</H3>[m
[31m-<A HREF="manual.html#luaL_Buffer">luaL_Buffer</A><BR>[m
[31m-<A HREF="manual.html#luaL_Reg">luaL_Reg</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#luaL_addchar">luaL_addchar</A><BR>[m
[31m-<A HREF="manual.html#luaL_addlstring">luaL_addlstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_addsize">luaL_addsize</A><BR>[m
[31m-<A HREF="manual.html#luaL_addstring">luaL_addstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_addvalue">luaL_addvalue</A><BR>[m
[31m-<A HREF="manual.html#luaL_argcheck">luaL_argcheck</A><BR>[m
[31m-<A HREF="manual.html#luaL_argerror">luaL_argerror</A><BR>[m
[31m-<A HREF="manual.html#luaL_buffinit">luaL_buffinit</A><BR>[m
[31m-<A HREF="manual.html#luaL_callmeta">luaL_callmeta</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkany">luaL_checkany</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkint">luaL_checkint</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkinteger">luaL_checkinteger</A><BR>[m
[31m-<A HREF="manual.html#luaL_checklong">luaL_checklong</A><BR>[m
[31m-<A HREF="manual.html#luaL_checklstring">luaL_checklstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_checknumber">luaL_checknumber</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkoption">luaL_checkoption</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkstack">luaL_checkstack</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkstring">luaL_checkstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_checktype">luaL_checktype</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkudata">luaL_checkudata</A><BR>[m
[31m-<A HREF="manual.html#luaL_dofile">luaL_dofile</A><BR>[m
[31m-<A HREF="manual.html#luaL_dostring">luaL_dostring</A><BR>[m
[31m-<A HREF="manual.html#luaL_error">luaL_error</A><BR>[m
[31m-<A HREF="manual.html#luaL_getmetafield">luaL_getmetafield</A><BR>[m
[31m-<A HREF="manual.html#luaL_getmetatable">luaL_getmetatable</A><BR>[m
[31m-<A HREF="manual.html#luaL_gsub">luaL_gsub</A><BR>[m
[31m-<A HREF="manual.html#luaL_loadbuffer">luaL_loadbuffer</A><BR>[m
[31m-<A HREF="manual.html#luaL_loadfile">luaL_loadfile</A><BR>[m
[31m-<A HREF="manual.html#luaL_loadstring">luaL_loadstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_newmetatable">luaL_newmetatable</A><BR>[m
[31m-<A HREF="manual.html#luaL_newstate">luaL_newstate</A><BR>[m
[31m-<A HREF="manual.html#luaL_openlibs">luaL_openlibs</A><BR>[m
[31m-<A HREF="manual.html#luaL_optint">luaL_optint</A><BR>[m
[31m-<A HREF="manual.html#luaL_optinteger">luaL_optinteger</A><BR>[m
[31m-<A HREF="manual.html#luaL_optlong">luaL_optlong</A><BR>[m
[31m-<A HREF="manual.html#luaL_optlstring">luaL_optlstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_optnumber">luaL_optnumber</A><BR>[m
[31m-<A HREF="manual.html#luaL_optstring">luaL_optstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_prepbuffer">luaL_prepbuffer</A><BR>[m
[31m-<A HREF="manual.html#luaL_pushresult">luaL_pushresult</A><BR>[m
[31m-<A HREF="manual.html#luaL_ref">luaL_ref</A><BR>[m
[31m-<A HREF="manual.html#luaL_register">luaL_register</A><BR>[m
[31m-<A HREF="manual.html#luaL_typename">luaL_typename</A><BR>[m
[31m-<A HREF="manual.html#luaL_typerror">luaL_typerror</A><BR>[m
[31m-<A HREF="manual.html#luaL_unref">luaL_unref</A><BR>[m
[31m-<A HREF="manual.html#luaL_where">luaL_where</A><BR>[m
[31m-[m
[31m-</TD>[m
[31m-</TR>[m
[31m-</TABLE>[m
[31m-<P>[m
[31m-[m
[31m-<HR>[m
[31m-<SMALL CLASS="footer">[m
[31m-Last update:[m
[31m-Mon Feb 13 18:53:32 BRST 2012[m
[31m-</SMALL>[m
[31m-<!--[m
[31m-Last change: revised for Lua 5.1.5[m
[31m--->[m
[31m-[m
[31m-</BODY>[m
[31m-</HTML>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/cover.png b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/cover.png[m
[1mdeleted file mode 100644[m
[1mindex 2dbb198..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/cover.png and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/logo.gif b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/logo.gif[m
[1mdeleted file mode 100644[m
[1mindex 2f5e4ac..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/logo.gif and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.1 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.1[m
[1mdeleted file mode 100644[m
[1mindex 24809cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.1[m
[1m+++ /dev/null[m
[36m@@ -1,163 +0,0 @@[m
[31m-.\" $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $[m
[31m-.TH LUA 1 "$Date: 2006/01/06 16:03:34 $"[m
[31m-.SH NAME[m
[31m-lua \- Lua interpreter[m
[31m-.SH SYNOPSIS[m
[31m-.B lua[m
[31m-[[m
[31m-.I options[m
[31m-][m
[31m-[[m
[31m-.I script[m
[31m-[[m
[31m-.I args[m
[31m-][m
[31m-][m
[31m-.SH DESCRIPTION[m
[31m-.B lua[m
[31m-is the stand-alone Lua interpreter.[m
[31m-It loads and executes Lua programs,[m
[31m-either in textual source form or[m
[31m-in precompiled binary form.[m
[31m-(Precompiled binaries are output by[m
[31m-.BR luac ,[m
[31m-the Lua compiler.)[m
[31m-.B lua[m
[31m-can be used as a batch interpreter and also interactively.[m
[31m-.LP[m
[31m-The given[m
[31m-.I options[m
[31m-(see below)[m
[31m-are executed and then[m
[31m-the Lua program in file[m
[31m-.I script[m
[31m-is loaded and executed.[m
[31m-The given[m
[31m-.I args[m
[31m-are available to[m
[31m-.I script[m
[31m-as strings in a global table named[m
[31m-.BR arg .[m
[31m-If these arguments contain spaces or other characters special to the shell,[m
[31m-then they should be quoted[m
[31m-(but note that the quotes will be removed by the shell).[m
[31m-The arguments in[m
[31m-.B arg[m
[31m-start at 0,[m
[31m-which contains the string[m
[31m-.RI ' script '.[m
[31m-The index of the last argument is stored in[m
[31m-.BR arg.n .[m
[31m-The arguments given in the command line before[m
[31m-.IR script ,[m
[31m-including the name of the interpreter,[m
[31m-are available in negative indices in[m
[31m-.BR arg .[m
[31m-.LP[m
[31m-At the very start,[m
[31m-before even handling the command line,[m
[31m-.B lua[m
[31m-executes the contents of the environment variable[m
[31m-.BR LUA_INIT ,[m
[31m-if it is defined.[m
[31m-If the value of[m
[31m-.B LUA_INIT[m
[31m-is of the form[m
[31m-.RI '@ filename ',[m
[31m-then[m
[31m-.I filename[m
[31m-is executed.[m
[31m-Otherwise, the string is assumed to be a Lua statement and is executed.[m
[31m-.LP[m
[31m-Options start with[m
[31m-.B '\-'[m
[31m-and are described below.[m
[31m-You can use[m
[31m-.B "'\--'"[m
[31m-to signal the end of options.[m
[31m-.LP[m
[31m-If no arguments are given,[m
[31m-then[m
[31m-.B "\-v \-i"[m
[31m-is assumed when the standard input is a terminal;[m
[31m-otherwise,[m
[31m-.B "\-"[m
[31m-is assumed.[m
[31m-.LP[m
[31m-In interactive mode,[m
[31m-.B lua[m
[31m-prompts the user,[m
[31m-reads lines from the standard input,[m
[31m-and executes them as they are read.[m
[31m-If a line does not contain a complete statement,[m
[31m-then a secondary prompt is displayed and[m
[31m-lines are read until a complete statement is formed or[m
[31m-a syntax error is found.[m
[31m-So, one way to interrupt the reading of an incomplete statement is[m
[31m-to force a syntax error:[m
[31m-adding a[m
[31m-.B ';' [m
[31m-in the middle of a statement is a sure way of forcing a syntax error[m
[31m-(except inside multiline strings and comments; these must be closed explicitly).[m
[31m-If a line starts with[m
[31m-.BR '=' ,[m
[31m-then[m
[31m-.B lua[m
[31m-displays the values of all the expressions in the remainder of the[m
[31m-line. The expressions must be separated by commas.[m
[31m-The primary prompt is the value of the global variable[m
[31m-.BR _PROMPT ,[m
[31m-if this value is a string;[m
[31m-otherwise, the default prompt is used.[m
[31m-Similarly, the secondary prompt is the value of the global variable[m
[31m-.BR _PROMPT2 .[m
[31m-So,[m
[31m-to change the prompts,[m
[31m-set the corresponding variable to a string of your choice.[m
[31m-You can do that after calling the interpreter[m
[31m-or on the command line[m
[31m-(but in this case you have to be careful with quotes[m
[31m-if the prompt string contains a space; otherwise you may confuse the shell.)[m
[31m-The default prompts are "> " and ">> ".[m
[31m-.SH OPTIONS[m
[31m-.TP[m
[31m-.B \-[m
[31m-load and execute the standard input as a file,[m
[31m-that is,[m
[31m-not interactively,[m
[31m-even when the standard input is a terminal.[m
[31m-.TP[m
[31m-.BI \-e " stat"[m
[31m-execute statement[m
[31m-.IR stat .[m
[31m-You need to quote[m
[31m-.I stat [m
[31m-if it contains spaces, quotes,[m
[31m-or other characters special to the shell.[m
[31m-.TP[m
[31m-.B \-i[m
[31m-enter interactive mode after[m
[31m-.I script[m
[31m-is executed.[m
[31m-.TP[m
[31m-.BI \-l " name"[m
[31m-call[m
[31m-.BI require(' name ')[m
[31m-before executing[m
[31m-.IR script .[m
[31m-Typically used to load libraries.[m
[31m-.TP[m
[31m-.B \-v[m
[31m-show version information.[m
[31m-.SH "SEE ALSO"[m
[31m-.BR luac (1)[m
[31m-.br[m
[31m-http://www.lua.org/[m
[31m-.SH DIAGNOSTICS[m
[31m-Error messages should be self explanatory.[m
[31m-.SH AUTHORS[m
[31m-R. Ierusalimschy,[m
[31m-L. H. de Figueiredo,[m
[31m-and[m
[31m-W. Celes[m
[31m-.\" EOF[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.css b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.css[m
[1mdeleted file mode 100644[m
[1mindex 7fafbb1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.css[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-body {[m
[31m-	color: #000000 ;[m
[31m-	background-color: #FFFFFF ;[m
[31m-	font-family: Helvetica, Arial, sans-serif ;[m
[31m-	text-align: justify ;[m
[31m-	margin-right: 30px ;[m
[31m-	margin-left: 30px ;[m
[31m-}[m
[31m-[m
[31m-h1, h2, h3, h4 {[m
[31m-	font-family: Verdana, Geneva, sans-serif ;[m
[31m-	font-weight: normal ;[m
[31m-	font-style: italic ;[m
[31m-}[m
[31m-[m
[31m-h2 {[m
[31m-	padding-top: 0.4em ;[m
[31m-	padding-bottom: 0.4em ;[m
[31m-	padding-left: 30px ;[m
[31m-	padding-right: 30px ;[m
[31m-	margin-left: -30px ;[m
[31m-	background-color: #E0E0FF ;[m
[31m-}[m
[31m-[m
[31m-h3 {[m
[31m-	padding-left: 0.5em ;[m
[31m-	border-left: solid #E0E0FF 1em ;[m
[31m-}[m
[31m-[m
[31m-table h3 {[m
[31m-	padding-left: 0px ;[m
[31m-	border-left: none ;[m
[31m-}[m
[31m-[m
[31m-a:link {[m
[31m-	color: #000080 ;[m
[31m-	background-color: inherit ;[m
[31m-	text-decoration: none ;[m
[31m-}[m
[31m-[m
[31m-a:visited {[m
[31m-	background-color: inherit ;[m
[31m-	text-decoration: none ;[m
[31m-}[m
[31m-[m
[31m-a:link:hover, a:visited:hover {[m
[31m-	color: #000080 ;[m
[31m-	background-color: #E0E0FF ;[m
[31m-}[m
[31m-[m
[31m-a:link:active, a:visited:active {[m
[31m-	color: #FF0000 ;[m
[31m-}[m
[31m-[m
[31m-hr {[m
[31m-	border: 0 ;[m
[31m-	height: 1px ;[m
[31m-	color: #a0a0a0 ;[m
[31m-	background-color: #a0a0a0 ;[m
[31m-}[m
[31m-[m
[31m-:target {[m
[31m-	background-color: #F8F8F8 ;[m
[31m-	padding: 8px ;[m
[31m-	border: solid #a0a0a0 2px ;[m
[31m-}[m
[31m-[m
[31m-.footer {[m
[31m-	color: gray ;[m
[31m-	font-size: small ;[m
[31m-}[m
[31m-[m
[31m-input[type=text] {[m
[31m-	border: solid #a0a0a0 2px ;[m
[31m-	border-radius: 2em ;[m
[31m-	-moz-border-radius: 2em ;[m
[31m-	background-image: url('images/search.png') ;[m
[31m-	background-repeat: no-repeat;[m
[31m-	background-position: 4px center ;[m
[31m-	padding-left: 20px ;[m
[31m-	height: 2em ;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.html[m
[1mdeleted file mode 100644[m
[1mindex 1d435ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/lua.html[m
[1m+++ /dev/null[m
[36m@@ -1,172 +0,0 @@[m
[31m-<!-- $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $ -->[m
[31m-<HTML>[m
[31m-<HEAD>[m
[31m-<TITLE>LUA man page</TITLE>[m
[31m-<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">[m
[31m-</HEAD>[m
[31m-[m
[31m-<BODY BGCOLOR="#FFFFFF">[m
[31m-[m
[31m-<H2>NAME</H2>[m
[31m-lua - Lua interpreter[m
[31m-<H2>SYNOPSIS</H2>[m
[31m-<B>lua</B>[m
[31m-[[m
[31m-<I>options</I>[m
[31m-][m
[31m-[[m
[31m-<I>script</I>[m
[31m-[[m
[31m-<I>args</I>[m
[31m-][m
[31m-][m
[31m-<H2>DESCRIPTION</H2>[m
[31m-<B>lua</B>[m
[31m-is the stand-alone Lua interpreter.[m
[31m-It loads and executes Lua programs,[m
[31m-either in textual source form or[m
[31m-in precompiled binary form.[m
[31m-(Precompiled binaries are output by[m
[31m-<B>luac</B>,[m
[31m-the Lua compiler.)[m
[31m-<B>lua</B>[m
[31m-can be used as a batch interpreter and also interactively.[m
[31m-<P>[m
[31m-The given[m
[31m-<I>options</I>[m
[31m-(see below)[m
[31m-are executed and then[m
[31m-the Lua program in file[m
[31m-<I>script</I>[m
[31m-is loaded and executed.[m
[31m-The given[m
[31m-<I>args</I>[m
[31m-are available to[m
[31m-<I>script</I>[m
[31m-as strings in a global table named[m
[31m-<B>arg</B>.[m
[31m-If these arguments contain spaces or other characters special to the shell,[m
[31m-then they should be quoted[m
[31m-(but note that the quotes will be removed by the shell).[m
[31m-The arguments in[m
[31m-<B>arg</B>[m
[31m-start at 0,[m
[31m-which contains the string[m
[31m-'<I>script</I>'.[m
[31m-The index of the last argument is stored in[m
[31m-<B>arg.n</B>.[m
[31m-The arguments given in the command line before[m
[31m-<I>script</I>,[m
[31m-including the name of the interpreter,[m
[31m-are available in negative indices in[m
[31m-<B>arg</B>.[m
[31m-<P>[m
[31m-At the very start,[m
[31m-before even handling the command line,[m
[31m-<B>lua</B>[m
[31m-executes the contents of the environment variable[m
[31m-<B>LUA_INIT</B>,[m
[31m-if it is defined.[m
[31m-If the value of[m
[31m-<B>LUA_INIT</B>[m
[31m-is of the form[m
[31m-'@<I>filename</I>',[m
[31m-then[m
[31m-<I>filename</I>[m
[31m-is executed.[m
[31m-Otherwise, the string is assumed to be a Lua statement and is executed.[m
[31m-<P>[m
[31m-Options start with[m
[31m-<B>'-'</B>[m
[31m-and are described below.[m
[31m-You can use[m
[31m-<B>'--'</B>[m
[31m-to signal the end of options.[m
[31m-<P>[m
[31m-If no arguments are given,[m
[31m-then[m
[31m-<B>"-v -i"</B>[m
[31m-is assumed when the standard input is a terminal;[m
[31m-otherwise,[m
[31m-<B>"-"</B>[m
[31m-is assumed.[m
[31m-<P>[m
[31m-In interactive mode,[m
[31m-<B>lua</B>[m
[31m-prompts the user,[m
[31m-reads lines from the standard input,[m
[31m-and executes them as they are read.[m
[31m-If a line does not contain a complete statement,[m
[31m-then a secondary prompt is displayed and[m
[31m-lines are read until a complete statement is formed or[m
[31m-a syntax error is found.[m
[31m-So, one way to interrupt the reading of an incomplete statement is[m
[31m-to force a syntax error:[m
[31m-adding a[m
[31m-<B>';'</B>[m
[31m-in the middle of a statement is a sure way of forcing a syntax error[m
[31m-(except inside multiline strings and comments; these must be closed explicitly).[m
[31m-If a line starts with[m
[31m-<B>'='</B>,[m
[31m-then[m
[31m-<B>lua</B>[m
[31m-displays the values of all the expressions in the remainder of the[m
[31m-line. The expressions must be separated by commas.[m
[31m-The primary prompt is the value of the global variable[m
[31m-<B>_PROMPT</B>,[m
[31m-if this value is a string;[m
[31m-otherwise, the default prompt is used.[m
[31m-Similarly, the secondary prompt is the value of the global variable[m
[31m-<B>_PROMPT2</B>.[m
[31m-So,[m
[31m-to change the prompts,[m
[31m-set the corresponding variable to a string of your choice.[m
[31m-You can do that after calling the interpreter[m
[31m-or on the command line[m
[31m-(but in this case you have to be careful with quotes[m
[31m-if the prompt string contains a space; otherwise you may confuse the shell.)[m
[31m-The default prompts are "&gt; " and "&gt;&gt; ".[m
[31m-<H2>OPTIONS</H2>[m
[31m-<P>[m
[31m-<B>-</B>[m
[31m-load and execute the standard input as a file,[m
[31m-that is,[m
[31m-not interactively,[m
[31m-even when the standard input is a terminal.[m
[31m-<P>[m
[31m-<B>-e </B><I>stat</I>[m
[31m-execute statement[m
[31m-<I>stat</I>.[m
[31m-You need to quote[m
[31m-<I>stat </I>[m
[31m-if it contains spaces, quotes,[m
[31m-or other characters special to the shell.[m
[31m-<P>[m
[31m-<B>-i</B>[m
[31m-enter interactive mode after[m
[31m-<I>script</I>[m
[31m-is executed.[m
[31m-<P>[m
[31m-<B>-l </B><I>name</I>[m
[31m-call[m
[31m-<B>require</B>('<I>name</I>')[m
[31m-before executing[m
[31m-<I>script</I>.[m
[31m-Typically used to load libraries.[m
[31m-<P>[m
[31m-<B>-v</B>[m
[31m-show version information.[m
[31m-<H2>SEE ALSO</H2>[m
[31m-<B>luac</B>(1)[m
[31m-<BR>[m
[31m-<A HREF="http://www.lua.org/">http://www.lua.org/</A>[m
[31m-<H2>DIAGNOSTICS</H2>[m
[31m-Error messages should be self explanatory.[m
[31m-<H2>AUTHORS</H2>[m
[31m-R. Ierusalimschy,[m
[31m-L. H. de Figueiredo,[m
[31m-and[m
[31m-W. Celes[m
[31m-<!-- EOF -->[m
[31m-</BODY>[m
[31m-</HTML>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/luac.1 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/luac.1[m
[1mdeleted file mode 100644[m
[1mindex d814678..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/luac.1[m
[1m+++ /dev/null[m
[36m@@ -1,136 +0,0 @@[m
[31m-.\" $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $[m
[31m-.TH LUAC 1 "$Date: 2006/01/06 16:03:34 $"[m
[31m-.SH NAME[m
[31m-luac \- Lua compiler[m
[31m-.SH SYNOPSIS[m
[31m-.B luac[m
[31m-[[m
[31m-.I options[m
[31m-] [[m
[31m-.I filenames[m
[31m-][m
[31m-.SH DESCRIPTION[m
[31m-.B luac[m
[31m-is the Lua compiler.[m
[31m-It translates programs written in the Lua programming language[m
[31m-into binary files that can be later loaded and executed.[m
[31m-.LP[m
[31m-The main advantages of precompiling chunks are:[m
[31m-faster loading,[m
[31m-protecting source code from accidental user changes,[m
[31m-and[m
[31m-off-line syntax checking.[m
[31m-.LP[m
[31m-Pre-compiling does not imply faster execution[m
[31m-because in Lua chunks are always compiled into bytecodes before being executed.[m
[31m-.B luac[m
[31m-simply allows those bytecodes to be saved in a file for later execution.[m
[31m-.LP[m
[31m-Pre-compiled chunks are not necessarily smaller than the corresponding source.[m
[31m-The main goal in pre-compiling is faster loading.[m
[31m-.LP[m
[31m-The binary files created by[m
[31m-.B luac[m
[31m-are portable only among architectures with the same word size and byte order.[m
[31m-.LP[m
[31m-.B luac[m
[31m-produces a single output file containing the bytecodes[m
[31m-for all source files given.[m
[31m-By default,[m
[31m-the output file is named[m
[31m-.BR luac.out ,[m
[31m-but you can change this with the[m
[31m-.B \-o[m
[31m-option.[m
[31m-.LP[m
[31m-In the command line,[m
[31m-you can mix[m
[31m-text files containing Lua source and[m
[31m-binary files containing precompiled chunks.[m
[31m-This is useful to combine several precompiled chunks,[m
[31m-even from different (but compatible) platforms,[m
[31m-into a single precompiled chunk.[m
[31m-.LP[m
[31m-You can use[m
[31m-.B "'\-'"[m
[31m-to indicate the standard input as a source file[m
[31m-and[m
[31m-.B "'\--'"[m
[31m-to signal the end of options[m
[31m-(that is,[m
[31m-all remaining arguments will be treated as files even if they start with[m
[31m-.BR "'\-'" ).[m
[31m-.LP[m
[31m-The internal format of the binary files produced by[m
[31m-.B luac[m
[31m-is likely to change when a new version of Lua is released.[m
[31m-So,[m
[31m-save the source files of all Lua programs that you precompile.[m
[31m-.LP[m
[31m-.SH OPTIONS[m
[31m-Options must be separate.[m
[31m-.TP[m
[31m-.B \-l[m
[31m-produce a listing of the compiled bytecode for Lua's virtual machine.[m
[31m-Listing bytecodes is useful to learn about Lua's virtual machine.[m
[31m-If no files are given, then[m
[31m-.B luac[m
[31m-loads[m
[31m-.B luac.out[m
[31m-and lists its contents.[m
[31m-.TP[m
[31m-.BI \-o " file"[m
[31m-output to[m
[31m-.IR file ,[m
[31m-instead of the default[m
[31m-.BR luac.out .[m
[31m-(You can use[m
[31m-.B "'\-'"[m
[31m-for standard output,[m
[31m-but not on platforms that open standard output in text mode.)[m
[31m-The output file may be a source file because[m
[31m-all files are loaded before the output file is written.[m
[31m-Be careful not to overwrite precious files.[m
[31m-.TP[m
[31m-.B \-p[m
[31m-load files but do not generate any output file.[m
[31m-Used mainly for syntax checking and for testing precompiled chunks:[m
[31m-corrupted files will probably generate errors when loaded.[m
[31m-Lua always performs a thorough integrity test on precompiled chunks.[m
[31m-Bytecode that passes this test is completely safe,[m
[31m-in the sense that it will not break the interpreter.[m
[31m-However,[m
[31m-there is no guarantee that such code does anything sensible.[m
[31m-(None can be given, because the halting problem is unsolvable.)[m
[31m-If no files are given, then[m
[31m-.B luac[m
[31m-loads[m
[31m-.B luac.out[m
[31m-and tests its contents.[m
[31m-No messages are displayed if the file passes the integrity test.[m
[31m-.TP[m
[31m-.B \-s[m
[31m-strip debug information before writing the output file.[m
[31m-This saves some space in very large chunks,[m
[31m-but if errors occur when running a stripped chunk,[m
[31m-then the error messages may not contain the full information they usually do.[m
[31m-For instance,[m
[31m-line numbers and names of local variables are lost.[m
[31m-.TP[m
[31m-.B \-v[m
[31m-show version information.[m
[31m-.SH FILES[m
[31m-.TP 15[m
[31m-.B luac.out[m
[31m-default output file[m
[31m-.SH "SEE ALSO"[m
[31m-.BR lua (1)[m
[31m-.br[m
[31m-http://www.lua.org/[m
[31m-.SH DIAGNOSTICS[m
[31m-Error messages should be self explanatory.[m
[31m-.SH AUTHORS[m
[31m-L. H. de Figueiredo,[m
[31m-R. Ierusalimschy and[m
[31m-W. Celes[m
[31m-.\" EOF[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/luac.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/luac.html[m
[1mdeleted file mode 100644[m
[1mindex 179ffe8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/luac.html[m
[1m+++ /dev/null[m
[36m@@ -1,145 +0,0 @@[m
[31m-<!-- $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $ -->[m
[31m-<HTML>[m
[31m-<HEAD>[m
[31m-<TITLE>LUAC man page</TITLE>[m
[31m-<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">[m
[31m-</HEAD>[m
[31m-[m
[31m-<BODY BGCOLOR="#FFFFFF">[m
[31m-[m
[31m-<H2>NAME</H2>[m
[31m-luac - Lua compiler[m
[31m-<H2>SYNOPSIS</H2>[m
[31m-<B>luac</B>[m
[31m-[[m
[31m-<I>options</I>[m
[31m-] [[m
[31m-<I>filenames</I>[m
[31m-][m
[31m-<H2>DESCRIPTION</H2>[m
[31m-<B>luac</B>[m
[31m-is the Lua compiler.[m
[31m-It translates programs written in the Lua programming language[m
[31m-into binary files that can be later loaded and executed.[m
[31m-<P>[m
[31m-The main advantages of precompiling chunks are:[m
[31m-faster loading,[m
[31m-protecting source code from accidental user changes,[m
[31m-and[m
[31m-off-line syntax checking.[m
[31m-<P>[m
[31m-Precompiling does not imply faster execution[m
[31m-because in Lua chunks are always compiled into bytecodes before being executed.[m
[31m-<B>luac</B>[m
[31m-simply allows those bytecodes to be saved in a file for later execution.[m
[31m-<P>[m
[31m-Precompiled chunks are not necessarily smaller than the corresponding source.[m
[31m-The main goal in precompiling is faster loading.[m
[31m-<P>[m
[31m-The binary files created by[m
[31m-<B>luac</B>[m
[31m-are portable only among architectures with the same word size and byte order.[m
[31m-<P>[m
[31m-<B>luac</B>[m
[31m-produces a single output file containing the bytecodes[m
[31m-for all source files given.[m
[31m-By default,[m
[31m-the output file is named[m
[31m-<B>luac.out</B>,[m
[31m-but you can change this with the[m
[31m-<B>-o</B>[m
[31m-option.[m
[31m-<P>[m
[31m-In the command line,[m
[31m-you can mix[m
[31m-text files containing Lua source and[m
[31m-binary files containing precompiled chunks.[m
[31m-This is useful because several precompiled chunks,[m
[31m-even from different (but compatible) platforms,[m
[31m-can be combined into a single precompiled chunk.[m
[31m-<P>[m
[31m-You can use[m
[31m-<B>'-'</B>[m
[31m-to indicate the standard input as a source file[m
[31m-and[m
[31m-<B>'--'</B>[m
[31m-to signal the end of options[m
[31m-(that is,[m
[31m-all remaining arguments will be treated as files even if they start with[m
[31m-<B>'-'</B>).[m
[31m-<P>[m
[31m-The internal format of the binary files produced by[m
[31m-<B>luac</B>[m
[31m-is likely to change when a new version of Lua is released.[m
[31m-So,[m
[31m-save the source files of all Lua programs that you precompile.[m
[31m-<P>[m
[31m-<H2>OPTIONS</H2>[m
[31m-Options must be separate.[m
[31m-<P>[m
[31m-<B>-l</B>[m
[31m-produce a listing of the compiled bytecode for Lua's virtual machine.[m
[31m-Listing bytecodes is useful to learn about Lua's virtual machine.[m
[31m-If no files are given, then[m
[31m-<B>luac</B>[m
[31m-loads[m
[31m-<B>luac.out</B>[m
[31m-and lists its contents.[m
[31m-<P>[m
[31m-<B>-o </B><I>file</I>[m
[31m-output to[m
[31m-<I>file</I>,[m
[31m-instead of the default[m
[31m-<B>luac.out</B>.[m
[31m-(You can use[m
[31m-<B>'-'</B>[m
[31m-for standard output,[m
[31m-but not on platforms that open standard output in text mode.)[m
[31m-The output file may be a source file because[m
[31m-all files are loaded before the output file is written.[m
[31m-Be careful not to overwrite precious files.[m
[31m-<P>[m
[31m-<B>-p</B>[m
[31m-load files but do not generate any output file.[m
[31m-Used mainly for syntax checking and for testing precompiled chunks:[m
[31m-corrupted files will probably generate errors when loaded.[m
[31m-Lua always performs a thorough integrity test on precompiled chunks.[m
[31m-Bytecode that passes this test is completely safe,[m
[31m-in the sense that it will not break the interpreter.[m
[31m-However,[m
[31m-there is no guarantee that such code does anything sensible.[m
[31m-(None can be given, because the halting problem is unsolvable.)[m
[31m-If no files are given, then[m
[31m-<B>luac</B>[m
[31m-loads[m
[31m-<B>luac.out</B>[m
[31m-and tests its contents.[m
[31m-No messages are displayed if the file passes the integrity test.[m
[31m-<P>[m
[31m-<B>-s</B>[m
[31m-strip debug information before writing the output file.[m
[31m-This saves some space in very large chunks,[m
[31m-but if errors occur when running a stripped chunk,[m
[31m-then the error messages may not contain the full information they usually do.[m
[31m-For instance,[m
[31m-line numbers and names of local variables are lost.[m
[31m-<P>[m
[31m-<B>-v</B>[m
[31m-show version information.[m
[31m-<H2>FILES</H2>[m
[31m-<P>[m
[31m-<B>luac.out</B>[m
[31m-default output file[m
[31m-<H2>SEE ALSO</H2>[m
[31m-<B>lua</B>(1)[m
[31m-<BR>[m
[31m-<A HREF="http://www.lua.org/">http://www.lua.org/</A>[m
[31m-<H2>DIAGNOSTICS</H2>[m
[31m-Error messages should be self explanatory.[m
[31m-<H2>AUTHORS</H2>[m
[31m-L. H. de Figueiredo,[m
[31m-R. Ierusalimschy and[m
[31m-W. Celes[m
[31m-<!-- EOF -->[m
[31m-</BODY>[m
[31m-</HTML>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/manual.css b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/manual.css[m
[1mdeleted file mode 100644[m
[1mindex b49b362..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/manual.css[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-h3 code {[m
[31m-	font-family: inherit ;[m
[31m-	font-size: inherit ;[m
[31m-}[m
[31m-[m
[31m-pre, code {[m
[31m-	font-size: 12pt ;[m
[31m-}[m
[31m-[m
[31m-span.apii {[m
[31m-	float: right ;[m
[31m-	font-family: inherit ;[m
[31m-	font-style: normal ;[m
[31m-	font-size: small ;[m
[31m-	color: gray ;[m
[31m-}[m
[31m-[m
[31m-p+h1, ul+h1 {[m
[31m-	padding-top: 0.4em ;[m
[31m-	padding-bottom: 0.4em ;[m
[31m-	padding-left: 30px ;[m
[31m-	margin-left: -30px ;[m
[31m-	background-color: #E0E0FF ;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/manual.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/manual.html[m
[1mdeleted file mode 100644[m
[1mindex 4e41683..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/manual.html[m
[1m+++ /dev/null[m
[36m@@ -1,8804 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">[m
[31m-<html>[m
[31m-[m
[31m-<head>[m
[31m-<title>Lua 5.1 Reference Manual</title>[m
[31m-<link rel="stylesheet" type="text/css" href="lua.css">[m
[31m-<link rel="stylesheet" type="text/css" href="manual.css">[m
[31m-<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-1">[m
[31m-</head>[m
[31m-[m
[31m-<body>[m
[31m-[m
[31m-<hr>[m
[31m-<h1>[m
[31m-<a href="http://www.lua.org/"><img src="logo.gif" alt="" border="0"></a>[m
[31m-Lua 5.1 Reference Manual[m
[31m-</h1>[m
[31m-[m
[31m-by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes[m
[31m-<p>[m
[31m-<small>[m
[31m-Copyright &copy; 2006&ndash;2012 Lua.org, PUC-Rio.[m
[31m-Freely available under the terms of the[m
[31m-<a href="http://www.lua.org/license.html">Lua license</a>.[m
[31m-</small>[m
[31m-<hr>[m
[31m-<p>[m
[31m-[m
[31m-<a href="contents.html#contents">contents</A>[m
[31m-&middot;[m
[31m-<a href="contents.html#index">index</A>[m
[31m-&middot;[m
[31m-<A HREF="http://www.lua.org/manual/">other versions</A>[m
[31m-[m
[31m-<!-- ====================================================================== -->[m
[31m-<p>[m
[31m-[m
[31m-<!-- $Id: manual.of,v 1.49.1.2 2012/01/13 20:23:26 roberto Exp $ -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>1 - <a name="1">Introduction</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-Lua is an extension programming language designed to support[m
[31m-general procedural programming with data description[m
[31m-facilities.[m
[31m-It also offers good support for object-oriented programming,[m
[31m-functional programming, and data-driven programming.[m
[31m-Lua is intended to be used as a powerful, light-weight[m
[31m-scripting language for any program that needs one.[m
[31m-Lua is implemented as a library, written in <em>clean</em> C[m
[31m-(that is, in the common subset of ANSI&nbsp;C and C++).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Being an extension language, Lua has no notion of a "main" program:[m
[31m-it only works <em>embedded</em> in a host client,[m
[31m-called the <em>embedding program</em> or simply the <em>host</em>.[m
[31m-This host program can invoke functions to execute a piece of Lua code,[m
[31m-can write and read Lua variables,[m
[31m-and can register C&nbsp;functions to be called by Lua code.[m
[31m-Through the use of C&nbsp;functions, Lua can be augmented to cope with[m
[31m-a wide range of different domains,[m
[31m-thus creating customized programming languages sharing a syntactical framework.[m
[31m-The Lua distribution includes a sample host program called <code>lua</code>,[m
[31m-which uses the Lua library to offer a complete, stand-alone Lua interpreter.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua is free software,[m
[31m-and is provided as usual with no guarantees,[m
[31m-as stated in its license.[m
[31m-The implementation described in this manual is available[m
[31m-at Lua's official web site, <code>www.lua.org</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Like any other reference manual,[m
[31m-this document is dry in places.[m
[31m-For a discussion of the decisions behind the design of Lua,[m
[31m-see the technical papers available at Lua's web site.[m
[31m-For a detailed introduction to programming in Lua,[m
[31m-see Roberto's book, <em>Programming in Lua (Second Edition)</em>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>2 - <a name="2">The Language</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-This section describes the lexis, the syntax, and the semantics of Lua.[m
[31m-In other words,[m
[31m-this section describes[m
[31m-which tokens are valid,[m
[31m-how they can be combined,[m
[31m-and what their combinations mean.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The language constructs will be explained using the usual extended BNF notation,[m
[31m-in which[m
[31m-{<em>a</em>}&nbsp;means&nbsp;0 or more <em>a</em>'s, and[m
[31m-[<em>a</em>]&nbsp;means an optional <em>a</em>.[m
[31m-Non-terminals are shown like non-terminal,[m
[31m-keywords are shown like <b>kword</b>,[m
[31m-and other terminal symbols are shown like `<b>=</b>&acute;.[m
[31m-The complete syntax of Lua can be found in <a href="#8">&sect;8</a>[m
[31m-at the end of this manual.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.1 - <a name="2.1">Lexical Conventions</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-<em>Names</em>[m
[31m-(also called <em>identifiers</em>)[m
[31m-in Lua can be any string of letters,[m
[31m-digits, and underscores,[m
[31m-not beginning with a digit.[m
[31m-This coincides with the definition of names in most languages.[m
[31m-(The definition of letter depends on the current locale:[m
[31m-any character considered alphabetic by the current locale[m
[31m-can be used in an identifier.)[m
[31m-Identifiers are used to name variables and table fields.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The following <em>keywords</em> are reserved[m
[31m-and cannot be used as names:[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     and       break     do        else      elseif[m
[31m-     end       false     for       function  if[m
[31m-     in        local     nil       not       or[m
[31m-     repeat    return    then      true      until     while[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Lua is a case-sensitive language:[m
[31m-<code>and</code> is a reserved word, but <code>And</code> and <code>AND</code>[m
[31m-are two different, valid names.[m
[31m-As a convention, names starting with an underscore followed by[m
[31m-uppercase letters (such as <a href="#pdf-_VERSION"><code>_VERSION</code></a>)[m
[31m-are reserved for internal global variables used by Lua.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The following strings denote other tokens:[m
[31m-[m
[31m-<pre>[m
[31m-     +     -     *     /     %     ^     #[m
[31m-     ==    ~=    &lt;=    &gt;=    &lt;     &gt;     =[m
[31m-     (     )     {     }     [     ][m
[31m-     ;     :     ,     .     ..    ...[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-<em>Literal strings</em>[m
[31m-can be delimited by matching single or double quotes,[m
[31m-and can contain the following C-like escape sequences:[m
[31m-'<code>\a</code>' (bell),[m
[31m-'<code>\b</code>' (backspace),[m
[31m-'<code>\f</code>' (form feed),[m
[31m-'<code>\n</code>' (newline),[m
[31m-'<code>\r</code>' (carriage return),[m
[31m-'<code>\t</code>' (horizontal tab),[m
[31m-'<code>\v</code>' (vertical tab),[m
[31m-'<code>\\</code>' (backslash),[m
[31m-'<code>\"</code>' (quotation mark [double quote]),[m
[31m-and '<code>\'</code>' (apostrophe [single quote]).[m
[31m-Moreover, a backslash followed by a real newline[m
[31m-results in a newline in the string.[m
[31m-A character in a string can also be specified by its numerical value[m
[31m-using the escape sequence <code>\<em>ddd</em></code>,[m
[31m-where <em>ddd</em> is a sequence of up to three decimal digits.[m
[31m-(Note that if a numerical escape is to be followed by a digit,[m
[31m-it must be expressed using exactly three digits.)[m
[31m-Strings in Lua can contain any 8-bit value, including embedded zeros,[m
[31m-which can be specified as '<code>\0</code>'.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Literal strings can also be defined using a long format[m
[31m-enclosed by <em>long brackets</em>.[m
[31m-We define an <em>opening long bracket of level <em>n</em></em> as an opening[m
[31m-square bracket followed by <em>n</em> equal signs followed by another[m
[31m-opening square bracket.[m
[31m-So, an opening long bracket of level&nbsp;0 is written as <code>[[</code>,[m
[31m-an opening long bracket of level&nbsp;1 is written as <code>[=[</code>,[m
[31m-and so on.[m
[31m-A <em>closing long bracket</em> is defined similarly;[m
[31m-for instance, a closing long bracket of level&nbsp;4 is written as <code>]====]</code>.[m
[31m-A long string starts with an opening long bracket of any level and[m
[31m-ends at the first closing long bracket of the same level.[m
[31m-Literals in this bracketed form can run for several lines,[m
[31m-do not interpret any escape sequences,[m
[31m-and ignore long brackets of any other level.[m
[31m-They can contain anything except a closing bracket of the proper level.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-For convenience,[m
[31m-when the opening long bracket is immediately followed by a newline,[m
[31m-the newline is not included in the string.[m
[31m-As an example, in a system using ASCII[m
[31m-(in which '<code>a</code>' is coded as&nbsp;97,[m
[31m-newline is coded as&nbsp;10, and '<code>1</code>' is coded as&nbsp;49),[m
[31m-the five literal strings below denote the same string:[m
[31m-[m
[31m-<pre>[m
[31m-     a = 'alo\n123"'[m
[31m-     a = "alo\n123\""[m
[31m-     a = '\97lo\10\04923"'[m
[31m-     a = [[alo[m
[31m-     123"]][m
[31m-     a = [==[[m
[31m-     alo[m
[31m-     123"]==][m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-A <em>numerical constant</em> can be written with an optional decimal part[m
[31m-and an optional decimal exponent.[m
[31m-Lua also accepts integer hexadecimal constants,[m
[31m-by prefixing them with <code>0x</code>.[m
[31m-Examples of valid numerical constants are[m
[31m-[m
[31m-<pre>[m
[31m-     3   3.0   3.1416   314.16e-2   0.31416E1   0xff   0x56[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-A <em>comment</em> starts with a double hyphen (<code>--</code>)[m
[31m-anywhere outside a string.[m
[31m-If the text immediately after <code>--</code> is not an opening long bracket,[m
[31m-the comment is a <em>short comment</em>,[m
[31m-which runs until the end of the line.[m
[31m-Otherwise, it is a <em>long comment</em>,[m
[31m-which runs until the corresponding closing long bracket.[m
[31m-Long comments are frequently used to disable code temporarily.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.2 - <a name="2.2">Values and Types</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua is a <em>dynamically typed language</em>.[m
[31m-This means that[m
[31m-variables do not have types; only values do.[m
[31m-There are no type definitions in the language.[m
[31m-All values carry their own type.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All values in Lua are <em>first-class values</em>.[m
[31m-This means that all values can be stored in variables,[m
[31m-passed as arguments to other functions, and returned as results.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-There are eight basic types in Lua:[m
[31m-<em>nil</em>, <em>boolean</em>, <em>number</em>,[m
[31m-<em>string</em>, <em>function</em>, <em>userdata</em>,[m
[31m-<em>thread</em>, and <em>table</em>.[m
[31m-<em>Nil</em> is the type of the value <b>nil</b>,[m
[31m-whose main property is to be different from any other value;[m
[31m-it usually represents the absence of a useful value.[m
[31m-<em>Boolean</em> is the type of the values <b>false</b> and <b>true</b>.[m
[31m-Both <b>nil</b> and <b>false</b> make a condition false;[m
[31m-any other value makes it true.[m
[31m-<em>Number</em> represents real (double-precision floating-point) numbers.[m
[31m-(It is easy to build Lua interpreters that use other[m
[31m-internal representations for numbers,[m
[31m-such as single-precision float or long integers;[m
[31m-see file <code>luaconf.h</code>.)[m
[31m-<em>String</em> represents arrays of characters.[m
[31m-[m
[31m-Lua is 8-bit clean:[m
[31m-strings can contain any 8-bit character,[m
[31m-including embedded zeros ('<code>\0</code>') (see <a href="#2.1">&sect;2.1</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua can call (and manipulate) functions written in Lua and[m
[31m-functions written in C[m
[31m-(see <a href="#2.5.8">&sect;2.5.8</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The type <em>userdata</em> is provided to allow arbitrary C&nbsp;data to[m
[31m-be stored in Lua variables.[m
[31m-This type corresponds to a block of raw memory[m
[31m-and has no pre-defined operations in Lua,[m
[31m-except assignment and identity test.[m
[31m-However, by using <em>metatables</em>,[m
[31m-the programmer can define operations for userdata values[m
[31m-(see <a href="#2.8">&sect;2.8</a>).[m
[31m-Userdata values cannot be created or modified in Lua,[m
[31m-only through the C&nbsp;API.[m
[31m-This guarantees the integrity of data owned by the host program.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The type <em>thread</em> represents independent threads of execution[m
[31m-and it is used to implement coroutines (see <a href="#2.11">&sect;2.11</a>).[m
[31m-Do not confuse Lua threads with operating-system threads.[m
[31m-Lua supports coroutines on all systems,[m
[31m-even those that do not support threads.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The type <em>table</em> implements associative arrays,[m
[31m-that is, arrays that can be indexed not only with numbers,[m
[31m-but with any value (except <b>nil</b>).[m
[31m-Tables can be <em>heterogeneous</em>;[m
[31m-that is, they can contain values of all types (except <b>nil</b>).[m
[31m-Tables are the sole data structuring mechanism in Lua;[m
[31m-they can be used to represent ordinary arrays,[m
[31m-symbol tables, sets, records, graphs, trees, etc.[m
[31m-To represent records, Lua uses the field name as an index.[m
[31m-The language supports this representation by[m
[31m-providing <code>a.name</code> as syntactic sugar for <code>a["name"]</code>.[m
[31m-There are several convenient ways to create tables in Lua[m
[31m-(see <a href="#2.5.7">&sect;2.5.7</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Like indices,[m
[31m-the value of a table field can be of any type (except <b>nil</b>).[m
[31m-In particular,[m
[31m-because functions are first-class values,[m
[31m-table fields can contain functions.[m
[31m-Thus tables can also carry <em>methods</em> (see <a href="#2.5.9">&sect;2.5.9</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Tables, functions, threads, and (full) userdata values are <em>objects</em>:[m
[31m-variables do not actually <em>contain</em> these values,[m
[31m-only <em>references</em> to them.[m
[31m-Assignment, parameter passing, and function returns[m
[31m-always manipulate references to such values;[m
[31m-these operations do not imply any kind of copy.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The library function <a href="#pdf-type"><code>type</code></a> returns a string describing the type[m
[31m-of a given value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.2.1 - <a name="2.2.1">Coercion</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-Lua provides automatic conversion between[m
[31m-string and number values at run time.[m
[31m-Any arithmetic operation applied to a string tries to convert[m
[31m-this string to a number, following the usual conversion rules.[m
[31m-Conversely, whenever a number is used where a string is expected,[m
[31m-the number is converted to a string, in a reasonable format.[m
[31m-For complete control over how numbers are converted to strings,[m
[31m-use the <code>format</code> function from the string library[m
[31m-(see <a href="#pdf-string.format"><code>string.format</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.3 - <a name="2.3">Variables</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Variables are places that store values.[m
[31m-[m
[31m-There are three kinds of variables in Lua:[m
[31m-global variables, local variables, and table fields.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A single name can denote a global variable or a local variable[m
[31m-(or a function's formal parameter,[m
[31m-which is a particular kind of local variable):[m
[31m-[m
[31m-<pre>[m
[31m-	var ::= Name[m
[31m-</pre><p>[m
[31m-Name denotes identifiers, as defined in <a href="#2.1">&sect;2.1</a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Any variable is assumed to be global unless explicitly declared[m
[31m-as a local (see <a href="#2.4.7">&sect;2.4.7</a>).[m
[31m-Local variables are <em>lexically scoped</em>:[m
[31m-local variables can be freely accessed by functions[m
[31m-defined inside their scope (see <a href="#2.6">&sect;2.6</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Before the first assignment to a variable, its value is <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Square brackets are used to index a table:[m
[31m-[m
[31m-<pre>[m
[31m-	var ::= prefixexp `<b>[</b>&acute; exp `<b>]</b>&acute;[m
[31m-</pre><p>[m
[31m-The meaning of accesses to global variables [m
[31m-and table fields can be changed via metatables.[m
[31m-An access to an indexed variable <code>t[i]</code> is equivalent to[m
[31m-a call <code>gettable_event(t,i)</code>.[m
[31m-(See <a href="#2.8">&sect;2.8</a> for a complete description of the[m
[31m-<code>gettable_event</code> function.[m
[31m-This function is not defined or callable in Lua.[m
[31m-We use it here only for explanatory purposes.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The syntax <code>var.Name</code> is just syntactic sugar for[m
[31m-<code>var["Name"]</code>:[m
[31m-[m
[31m-<pre>[m
[31m-	var ::= prefixexp `<b>.</b>&acute; Name[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-All global variables live as fields in ordinary Lua tables,[m
[31m-called <em>environment tables</em> or simply[m
[31m-<em>environments</em> (see <a href="#2.9">&sect;2.9</a>).[m
[31m-Each function has its own reference to an environment,[m
[31m-so that all global variables in this function[m
[31m-will refer to this environment table.[m
[31m-When a function is created,[m
[31m-it inherits the environment from the function that created it.[m
[31m-To get the environment table of a Lua function,[m
[31m-you call <a href="#pdf-getfenv"><code>getfenv</code></a>.[m
[31m-To replace it,[m
[31m-you call <a href="#pdf-setfenv"><code>setfenv</code></a>.[m
[31m-(You can only manipulate the environment of C&nbsp;functions[m
[31m-through the debug library; (see <a href="#5.9">&sect;5.9</a>).)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-An access to a global variable <code>x</code>[m
[31m-is equivalent to <code>_env.x</code>,[m
[31m-which in turn is equivalent to[m
[31m-[m
[31m-<pre>[m
[31m-     gettable_event(_env, "x")[m
[31m-</pre><p>[m
[31m-where <code>_env</code> is the environment of the running function.[m
[31m-(See <a href="#2.8">&sect;2.8</a> for a complete description of the[m
[31m-<code>gettable_event</code> function.[m
[31m-This function is not defined or callable in Lua.[m
[31m-Similarly, the <code>_env</code> variable is not defined in Lua.[m
[31m-We use them here only for explanatory purposes.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.4 - <a name="2.4">Statements</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua supports an almost conventional set of statements,[m
[31m-similar to those in Pascal or C.[m
[31m-This set includes[m
[31m-assignments, control structures, function calls,[m
[31m-and variable declarations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.1 - <a name="2.4.1">Chunks</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-The unit of execution of Lua is called a <em>chunk</em>.[m
[31m-A chunk is simply a sequence of statements,[m
[31m-which are executed sequentially.[m
[31m-Each statement can be optionally followed by a semicolon:[m
[31m-[m
[31m-<pre>[m
[31m-	chunk ::= {stat [`<b>;</b>&acute;]}[m
[31m-</pre><p>[m
[31m-There are no empty statements and thus '<code>;;</code>' is not legal.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua handles a chunk as the body of an anonymous function [m
[31m-with a variable number of arguments[m
[31m-(see <a href="#2.5.9">&sect;2.5.9</a>).[m
[31m-As such, chunks can define local variables,[m
[31m-receive arguments, and return values.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A chunk can be stored in a file or in a string inside the host program.[m
[31m-To execute a chunk,[m
[31m-Lua first pre-compiles the chunk into instructions for a virtual machine,[m
[31m-and then it executes the compiled code[m
[31m-with an interpreter for the virtual machine.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Chunks can also be pre-compiled into binary form;[m
[31m-see program <code>luac</code> for details.[m
[31m-Programs in source and compiled forms are interchangeable;[m
[31m-Lua automatically detects the file type and acts accordingly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.2 - <a name="2.4.2">Blocks</a></h3><p>[m
[31m-A block is a list of statements;[m
[31m-syntactically, a block is the same as a chunk:[m
[31m-[m
[31m-<pre>[m
[31m-	block ::= chunk[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-A block can be explicitly delimited to produce a single statement:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>do</b> block <b>end</b>[m
[31m-</pre><p>[m
[31m-Explicit blocks are useful[m
[31m-to control the scope of variable declarations.[m
[31m-Explicit blocks are also sometimes used to[m
[31m-add a <b>return</b> or <b>break</b> statement in the middle[m
[31m-of another block (see <a href="#2.4.4">&sect;2.4.4</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.3 - <a name="2.4.3">Assignment</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-Lua allows multiple assignments.[m
[31m-Therefore, the syntax for assignment[m
[31m-defines a list of variables on the left side[m
[31m-and a list of expressions on the right side.[m
[31m-The elements in both lists are separated by commas:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= varlist `<b>=</b>&acute; explist[m
[31m-	varlist ::= var {`<b>,</b>&acute; var}[m
[31m-	explist ::= exp {`<b>,</b>&acute; exp}[m
[31m-</pre><p>[m
[31m-Expressions are discussed in <a href="#2.5">&sect;2.5</a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Before the assignment,[m
[31m-the list of values is <em>adjusted</em> to the length of[m
[31m-the list of variables.[m
[31m-If there are more values than needed,[m
[31m-the excess values are thrown away.[m
[31m-If there are fewer values than needed,[m
[31m-the list is extended with as many  <b>nil</b>'s as needed.[m
[31m-If the list of expressions ends with a function call,[m
[31m-then all values returned by that call enter the list of values,[m
[31m-before the adjustment[m
[31m-(except when the call is enclosed in parentheses; see <a href="#2.5">&sect;2.5</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The assignment statement first evaluates all its expressions[m
[31m-and only then are the assignments performed.[m
[31m-Thus the code[m
[31m-[m
[31m-<pre>[m
[31m-     i = 3[m
[31m-     i, a[i] = i+1, 20[m
[31m-</pre><p>[m
[31m-sets <code>a[3]</code> to 20, without affecting <code>a[4]</code>[m
[31m-because the <code>i</code> in <code>a[i]</code> is evaluated (to 3)[m
[31m-before it is assigned&nbsp;4.[m
[31m-Similarly, the line[m
[31m-[m
[31m-<pre>[m
[31m-     x, y = y, x[m
[31m-</pre><p>[m
[31m-exchanges the values of <code>x</code> and <code>y</code>,[m
[31m-and[m
[31m-[m
[31m-<pre>[m
[31m-     x, y, z = y, z, x[m
[31m-</pre><p>[m
[31m-cyclically permutes the values of <code>x</code>, <code>y</code>, and <code>z</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The meaning of assignments to global variables[m
[31m-and table fields can be changed via metatables.[m
[31m-An assignment to an indexed variable <code>t[i] = val</code> is equivalent to[m
[31m-<code>settable_event(t,i,val)</code>.[m
[31m-(See <a href="#2.8">&sect;2.8</a> for a complete description of the[m
[31m-<code>settable_event</code> function.[m
[31m-This function is not defined or callable in Lua.[m
[31m-We use it here only for explanatory purposes.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-An assignment to a global variable <code>x = val</code>[m
[31m-is equivalent to the assignment[m
[31m-<code>_env.x = val</code>,[m
[31m-which in turn is equivalent to[m
[31m-[m
[31m-<pre>[m
[31m-     settable_event(_env, "x", val)[m
[31m-</pre><p>[m
[31m-where <code>_env</code> is the environment of the running function.[m
[31m-(The <code>_env</code> variable is not defined in Lua.[m
[31m-We use it here only for explanatory purposes.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.4 - <a name="2.4.4">Control Structures</a></h3><p>[m
[31m-The control structures[m
[31m-<b>if</b>, <b>while</b>, and <b>repeat</b> have the usual meaning and[m
[31m-familiar syntax:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>while</b> exp <b>do</b> block <b>end</b>[m
[31m-	stat ::= <b>repeat</b> block <b>until</b> exp[m
[31m-	stat ::= <b>if</b> exp <b>then</b> block {<b>elseif</b> exp <b>then</b> block} [<b>else</b> block] <b>end</b>[m
[31m-</pre><p>[m
[31m-Lua also has a <b>for</b> statement, in two flavors (see <a href="#2.4.5">&sect;2.4.5</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The condition expression of a[m
[31m-control structure can return any value.[m
[31m-Both <b>false</b> and <b>nil</b> are considered false.[m
[31m-All values different from <b>nil</b> and <b>false</b> are considered true[m
[31m-(in particular, the number 0 and the empty string are also true).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In the <b>repeat</b>&ndash;<b>until</b> loop,[m
[31m-the inner block does not end at the <b>until</b> keyword,[m
[31m-but only after the condition.[m
[31m-So, the condition can refer to local variables[m
[31m-declared inside the loop block.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <b>return</b> statement is used to return values[m
[31m-from a function or a chunk (which is just a function).[m
[31m-[m
[31m-Functions and chunks can return more than one value,[m
[31m-and so the syntax for the <b>return</b> statement is[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>return</b> [explist][m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-The <b>break</b> statement is used to terminate the execution of a[m
[31m-<b>while</b>, <b>repeat</b>, or <b>for</b> loop,[m
[31m-skipping to the next statement after the loop:[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>break</b>[m
[31m-</pre><p>[m
[31m-A <b>break</b> ends the innermost enclosing loop.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <b>return</b> and <b>break</b>[m
[31m-statements can only be written as the <em>last</em> statement of a block.[m
[31m-If it is really necessary to <b>return</b> or <b>break</b> in the[m
[31m-middle of a block,[m
[31m-then an explicit inner block can be used,[m
[31m-as in the idioms[m
[31m-<code>do return end</code> and <code>do break end</code>,[m
[31m-because now <b>return</b> and <b>break</b> are the last statements in[m
[31m-their (inner) blocks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.5 - <a name="2.4.5">For Statement</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-The <b>for</b> statement has two forms:[m
[31m-one numeric and one generic.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The numeric <b>for</b> loop repeats a block of code while a[m
[31m-control variable runs through an arithmetic progression.[m
[31m-It has the following syntax:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>for</b> Name `<b>=</b>&acute; exp `<b>,</b>&acute; exp [`<b>,</b>&acute; exp] <b>do</b> block <b>end</b>[m
[31m-</pre><p>[m
[31m-The <em>block</em> is repeated for <em>name</em> starting at the value of[m
[31m-the first <em>exp</em>, until it passes the second <em>exp</em> by steps of the[m
[31m-third <em>exp</em>.[m
[31m-More precisely, a <b>for</b> statement like[m
[31m-[m
[31m-<pre>[m
[31m-     for v = <em>e1</em>, <em>e2</em>, <em>e3</em> do <em>block</em> end[m
[31m-</pre><p>[m
[31m-is equivalent to the code:[m
[31m-[m
[31m-<pre>[m
[31m-     do[m
[31m-       local <em>var</em>, <em>limit</em>, <em>step</em> = tonumber(<em>e1</em>), tonumber(<em>e2</em>), tonumber(<em>e3</em>)[m
[31m-       if not (<em>var</em> and <em>limit</em> and <em>step</em>) then error() end[m
[31m-       while (<em>step</em> &gt; 0 and <em>var</em> &lt;= <em>limit</em>) or (<em>step</em> &lt;= 0 and <em>var</em> &gt;= <em>limit</em>) do[m
[31m-         local v = <em>var</em>[m
[31m-         <em>block</em>[m
[31m-         <em>var</em> = <em>var</em> + <em>step</em>[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-Note the following:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-All three control expressions are evaluated only once,[m
[31m-before the loop starts.[m
[31m-They must all result in numbers.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-<code><em>var</em></code>, <code><em>limit</em></code>, and <code><em>step</em></code> are invisible variables.[m
[31m-The names shown here are for explanatory purposes only.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-If the third expression (the step) is absent,[m
[31m-then a step of&nbsp;1 is used.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-You can use <b>break</b> to exit a <b>for</b> loop.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-The loop variable <code>v</code> is local to the loop;[m
[31m-you cannot use its value after the <b>for</b> ends or is broken.[m
[31m-If you need this value,[m
[31m-assign it to another variable before breaking or exiting the loop.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-The generic <b>for</b> statement works over functions,[m
[31m-called <em>iterators</em>.[m
[31m-On each iteration, the iterator function is called to produce a new value,[m
[31m-stopping when this new value is <b>nil</b>.[m
[31m-The generic <b>for</b> loop has the following syntax:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>for</b> namelist <b>in</b> explist <b>do</b> block <b>end</b>[m
[31m-	namelist ::= Name {`<b>,</b>&acute; Name}[m
[31m-</pre><p>[m
[31m-A <b>for</b> statement like[m
[31m-[m
[31m-<pre>[m
[31m-     for <em>var_1</em>, &middot;&middot;&middot;, <em>var_n</em> in <em>explist</em> do <em>block</em> end[m
[31m-</pre><p>[m
[31m-is equivalent to the code:[m
[31m-[m
[31m-<pre>[m
[31m-     do[m
[31m-       local <em>f</em>, <em>s</em>, <em>var</em> = <em>explist</em>[m
[31m-       while true do[m
[31m-         local <em>var_1</em>, &middot;&middot;&middot;, <em>var_n</em> = <em>f</em>(<em>s</em>, <em>var</em>)[m
[31m-         <em>var</em> = <em>var_1</em>[m
[31m-         if <em>var</em> == nil then break end[m
[31m-         <em>block</em>[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-Note the following:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-<code><em>explist</em></code> is evaluated only once.[m
[31m-Its results are an <em>iterator</em> function,[m
[31m-a <em>state</em>,[m
[31m-and an initial value for the first <em>iterator variable</em>.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-<code><em>f</em></code>, <code><em>s</em></code>, and <code><em>var</em></code> are invisible variables.[m
[31m-The names are here for explanatory purposes only.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-You can use <b>break</b> to exit a <b>for</b> loop.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-The loop variables <code><em>var_i</em></code> are local to the loop;[m
[31m-you cannot use their values after the <b>for</b> ends.[m
[31m-If you need these values,[m
[31m-then assign them to other variables before breaking or exiting the loop.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.6 - <a name="2.4.6">Function Calls as Statements</a></h3><p>[m
[31m-To allow possible side-effects,[m
[31m-function calls can be executed as statements:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= functioncall[m
[31m-</pre><p>[m
[31m-In this case, all returned values are thrown away.[m
[31m-Function calls are explained in <a href="#2.5.8">&sect;2.5.8</a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.7 - <a name="2.4.7">Local Declarations</a></h3><p>[m
[31m-Local variables can be declared anywhere inside a block.[m
[31m-The declaration can include an initial assignment:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>local</b> namelist [`<b>=</b>&acute; explist][m
[31m-</pre><p>[m
[31m-If present, an initial assignment has the same semantics[m
[31m-of a multiple assignment (see <a href="#2.4.3">&sect;2.4.3</a>).[m
[31m-Otherwise, all variables are initialized with <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A chunk is also a block (see <a href="#2.4.1">&sect;2.4.1</a>),[m
[31m-and so local variables can be declared in a chunk outside any explicit block.[m
[31m-The scope of such local variables extends until the end of the chunk.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The visibility rules for local variables are explained in <a href="#2.6">&sect;2.6</a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.5 - <a name="2.5">Expressions</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The basic expressions in Lua are the following:[m
[31m-[m
[31m-<pre>[m
[31m-	exp ::= prefixexp[m
[31m-	exp ::= <b>nil</b> | <b>false</b> | <b>true</b>[m
[31m-	exp ::= Number[m
[31m-	exp ::= String[m
[31m-	exp ::= function[m
[31m-	exp ::= tableconstructor[m
[31m-	exp ::= `<b>...</b>&acute;[m
[31m-	exp ::= exp binop exp[m
[31m-	exp ::= unop exp[m
[31m-	prefixexp ::= var | functioncall | `<b>(</b>&acute; exp `<b>)</b>&acute;[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Numbers and literal strings are explained in <a href="#2.1">&sect;2.1</a>;[m
[31m-variables are explained in <a href="#2.3">&sect;2.3</a>;[m
[31m-function definitions are explained in <a href="#2.5.9">&sect;2.5.9</a>;[m
[31m-function calls are explained in <a href="#2.5.8">&sect;2.5.8</a>;[m
[31m-table constructors are explained in <a href="#2.5.7">&sect;2.5.7</a>.[m
[31m-Vararg expressions,[m
[31m-denoted by three dots ('<code>...</code>'), can only be used when[m
[31m-directly inside a vararg function;[m
[31m-they are explained in <a href="#2.5.9">&sect;2.5.9</a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Binary operators comprise arithmetic operators (see <a href="#2.5.1">&sect;2.5.1</a>),[m
[31m-relational operators (see <a href="#2.5.2">&sect;2.5.2</a>), logical operators (see <a href="#2.5.3">&sect;2.5.3</a>),[m
[31m-and the concatenation operator (see <a href="#2.5.4">&sect;2.5.4</a>).[m
[31m-Unary operators comprise the unary minus (see <a href="#2.5.1">&sect;2.5.1</a>),[m
[31m-the unary <b>not</b> (see <a href="#2.5.3">&sect;2.5.3</a>),[m
[31m-and the unary <em>length operator</em> (see <a href="#2.5.5">&sect;2.5.5</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Both function calls and vararg expressions can result in multiple values.[m
[31m-If an expression is used as a statement[m
[31m-(only possible for function calls (see <a href="#2.4.6">&sect;2.4.6</a>)),[m
[31m-then its return list is adjusted to zero elements,[m
[31m-thus discarding all returned values.[m
[31m-If an expression is used as the last (or the only) element[m
[31m-of a list of expressions,[m
[31m-then no adjustment is made[m
[31m-(unless the call is enclosed in parentheses).[m
[31m-In all other contexts,[m
[31m-Lua adjusts the result list to one element,[m
[31m-discarding all values except the first one.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Here are some examples:[m
[31m-[m
[31m-<pre>[m
[31m-     f()                -- adjusted to 0 results[m
[31m-     g(f(), x)          -- f() is adjusted to 1 result[m
[31m-     g(x, f())          -- g gets x plus all results from f()[m
[31m-     a,b,c = f(), x     -- f() is adjusted to 1 result (c gets nil)[m
[31m-     a,b = ...          -- a gets the first vararg parameter, b gets[m
[31m-                        -- the second (both a and b can get nil if there[m
[31m-                        -- is no corresponding vararg parameter)[m
[31m-     [m
[31m-     a,b,c = x, f()     -- f() is adjusted to 2 results[m
[31m-     a,b,c = f()        -- f() is adjusted to 3 results[m
[31m-     return f()         -- returns all results from f()[m
[31m-     return ...         -- returns all received vararg parameters[m
[31m-     return x,y,f()     -- returns x, y, and all results from f()[m
[31m-     {f()}              -- creates a list with all results from f()[m
[31m-     {...}              -- creates a list with all vararg parameters[m
[31m-     {f(), nil}         -- f() is adjusted to 1 result[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Any expression enclosed in parentheses always results in only one value.[m
[31m-Thus,[m
[31m-<code>(f(x,y,z))</code> is always a single value,[m
[31m-even if <code>f</code> returns several values.[m
[31m-(The value of <code>(f(x,y,z))</code> is the first value returned by <code>f</code>[m
[31m-or <b>nil</b> if <code>f</code> does not return any values.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.1 - <a name="2.5.1">Arithmetic Operators</a></h3><p>[m
[31m-Lua supports the usual arithmetic operators:[m
[31m-the binary <code>+</code> (addition),[m
[31m-<code>-</code> (subtraction), <code>*</code> (multiplication),[m
[31m-<code>/</code> (division), <code>%</code> (modulo), and <code>^</code> (exponentiation);[m
[31m-and unary <code>-</code> (negation).[m
[31m-If the operands are numbers, or strings that can be converted to[m
[31m-numbers (see <a href="#2.2.1">&sect;2.2.1</a>),[m
[31m-then all operations have the usual meaning.[m
[31m-Exponentiation works for any exponent.[m
[31m-For instance, <code>x^(-0.5)</code> computes the inverse of the square root of <code>x</code>.[m
[31m-Modulo is defined as[m
[31m-[m
[31m-<pre>[m
[31m-     a % b == a - math.floor(a/b)*b[m
[31m-</pre><p>[m
[31m-That is, it is the remainder of a division that rounds[m
[31m-the quotient towards minus infinity.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.2 - <a name="2.5.2">Relational Operators</a></h3><p>[m
[31m-The relational operators in Lua are[m
[31m-[m
[31m-<pre>[m
[31m-     ==    ~=    &lt;     &gt;     &lt;=    &gt;=[m
[31m-</pre><p>[m
[31m-These operators always result in <b>false</b> or <b>true</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equality (<code>==</code>) first compares the type of its operands.[m
[31m-If the types are different, then the result is <b>false</b>.[m
[31m-Otherwise, the values of the operands are compared.[m
[31m-Numbers and strings are compared in the usual way.[m
[31m-Objects (tables, userdata, threads, and functions)[m
[31m-are compared by <em>reference</em>:[m
[31m-two objects are considered equal only if they are the <em>same</em> object.[m
[31m-Every time you create a new object[m
[31m-(a table, userdata, thread, or function),[m
[31m-this new object is different from any previously existing object.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can change the way that Lua compares tables and userdata [m
[31m-by using the "eq" metamethod (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The conversion rules of <a href="#2.2.1">&sect;2.2.1</a>[m
[31m-<em>do not</em> apply to equality comparisons.[m
[31m-Thus, <code>"0"==0</code> evaluates to <b>false</b>,[m
[31m-and <code>t[0]</code> and <code>t["0"]</code> denote different[m
[31m-entries in a table.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The operator <code>~=</code> is exactly the negation of equality (<code>==</code>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The order operators work as follows.[m
[31m-If both arguments are numbers, then they are compared as such.[m
[31m-Otherwise, if both arguments are strings,[m
[31m-then their values are compared according to the current locale.[m
[31m-Otherwise, Lua tries to call the "lt" or the "le"[m
[31m-metamethod (see <a href="#2.8">&sect;2.8</a>).[m
[31m-A comparison <code>a &gt; b</code> is translated to <code>b &lt; a</code>[m
[31m-and <code>a &gt;= b</code> is translated to <code>b &lt;= a</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.3 - <a name="2.5.3">Logical Operators</a></h3><p>[m
[31m-The logical operators in Lua are[m
[31m-<b>and</b>, <b>or</b>, and <b>not</b>.[m
[31m-Like the control structures (see <a href="#2.4.4">&sect;2.4.4</a>),[m
[31m-all logical operators consider both <b>false</b> and <b>nil</b> as false[m
[31m-and anything else as true.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The negation operator <b>not</b> always returns <b>false</b> or <b>true</b>.[m
[31m-The conjunction operator <b>and</b> returns its first argument[m
[31m-if this value is <b>false</b> or <b>nil</b>;[m
[31m-otherwise, <b>and</b> returns its second argument.[m
[31m-The disjunction operator <b>or</b> returns its first argument[m
[31m-if this value is different from <b>nil</b> and <b>false</b>;[m
[31m-otherwise, <b>or</b> returns its second argument.[m
[31m-Both <b>and</b> and <b>or</b> use short-cut evaluation;[m
[31m-that is,[m
[31m-the second operand is evaluated only if necessary.[m
[31m-Here are some examples:[m
[31m-[m
[31m-<pre>[m
[31m-     10 or 20            --&gt; 10[m
[31m-     10 or error()       --&gt; 10[m
[31m-     nil or "a"          --&gt; "a"[m
[31m-     nil and 10          --&gt; nil[m
[31m-     false and error()   --&gt; false[m
[31m-     false and nil       --&gt; false[m
[31m-     false or nil        --&gt; nil[m
[31m-     10 and 20           --&gt; 20[m
[31m-</pre><p>[m
[31m-(In this manual,[m
[31m-<code>--&gt;</code> indicates the result of the preceding expression.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.4 - <a name="2.5.4">Concatenation</a></h3><p>[m
[31m-The string concatenation operator in Lua is[m
[31m-denoted by two dots ('<code>..</code>').[m
[31m-If both operands are strings or numbers, then they are converted to[m
[31m-strings according to the rules mentioned in <a href="#2.2.1">&sect;2.2.1</a>.[m
[31m-Otherwise, the "concat" metamethod is called (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.5 - <a name="2.5.5">The Length Operator</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-The length operator is denoted by the unary operator <code>#</code>.[m
[31m-The length of a string is its number of bytes[m
[31m-(that is, the usual meaning of string length when each[m
[31m-character is one byte).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The length of a table <code>t</code> is defined to be any[m
[31m-integer index <code>n</code>[m
[31m-such that <code>t[n]</code> is not <b>nil</b> and <code>t[n+1]</code> is <b>nil</b>;[m
[31m-moreover, if <code>t[1]</code> is <b>nil</b>, <code>n</code> can be zero.[m
[31m-For a regular array, with non-nil values from 1 to a given <code>n</code>,[m
[31m-its length is exactly that <code>n</code>,[m
[31m-the index of its last value.[m
[31m-If the array has "holes"[m
[31m-(that is, <b>nil</b> values between other non-nil values),[m
[31m-then <code>#t</code> can be any of the indices that[m
[31m-directly precedes a <b>nil</b> value[m
[31m-(that is, it may consider any such <b>nil</b> value as the end of[m
[31m-the array). [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.6 - <a name="2.5.6">Precedence</a></h3><p>[m
[31m-Operator precedence in Lua follows the table below,[m
[31m-from lower to higher priority:[m
[31m-[m
[31m-<pre>[m
[31m-     or[m
[31m-     and[m
[31m-     &lt;     &gt;     &lt;=    &gt;=    ~=    ==[m
[31m-     ..[m
[31m-     +     -[m
[31m-     *     /     %[m
[31m-     not   #     - (unary)[m
[31m-     ^[m
[31m-</pre><p>[m
[31m-As usual,[m
[31m-you can use parentheses to change the precedences of an expression.[m
[31m-The concatenation ('<code>..</code>') and exponentiation ('<code>^</code>')[m
[31m-operators are right associative.[m
[31m-All other binary operators are left associative.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.7 - <a name="2.5.7">Table Constructors</a></h3><p>[m
[31m-Table constructors are expressions that create tables.[m
[31m-Every time a constructor is evaluated, a new table is created.[m
[31m-A constructor can be used to create an empty table[m
[31m-or to create a table and initialize some of its fields.[m
[31m-The general syntax for constructors is[m
[31m-[m
[31m-<pre>[m
[31m-	tableconstructor ::= `<b>{</b>&acute; [fieldlist] `<b>}</b>&acute;[m
[31m-	fieldlist ::= field {fieldsep field} [fieldsep][m
[31m-	field ::= `<b>[</b>&acute; exp `<b>]</b>&acute; `<b>=</b>&acute; exp | Name `<b>=</b>&acute; exp | exp[m
[31m-	fieldsep ::= `<b>,</b>&acute; | `<b>;</b>&acute;[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Each field of the form <code>[exp1] = exp2</code> adds to the new table an entry[m
[31m-with key <code>exp1</code> and value <code>exp2</code>.[m
[31m-A field of the form <code>name = exp</code> is equivalent to[m
[31m-<code>["name"] = exp</code>.[m
[31m-Finally, fields of the form <code>exp</code> are equivalent to[m
[31m-<code>[i] = exp</code>, where <code>i</code> are consecutive numerical integers,[m
[31m-starting with 1.[m
[31m-Fields in the other formats do not affect this counting.[m
[31m-For example,[m
[31m-[m
[31m-<pre>[m
[31m-     a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }[m
[31m-</pre><p>[m
[31m-is equivalent to[m
[31m-[m
[31m-<pre>[m
[31m-     do[m
[31m-       local t = {}[m
[31m-       t[f(1)] = g[m
[31m-       t[1] = "x"         -- 1st exp[m
[31m-       t[2] = "y"         -- 2nd exp[m
[31m-       t.x = 1            -- t["x"] = 1[m
[31m-       t[3] = f(x)        -- 3rd exp[m
[31m-       t[30] = 23[m
[31m-       t[4] = 45          -- 4th exp[m
[31m-       a = t[m
[31m-     end[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the last field in the list has the form <code>exp</code>[m
[31m-and the expression is a function call or a vararg expression,[m
[31m-then all values returned by this expression enter the list consecutively[m
[31m-(see <a href="#2.5.8">&sect;2.5.8</a>).[m
[31m-To avoid this,[m
[31m-enclose the function call or the vararg expression[m
[31m-in parentheses (see <a href="#2.5">&sect;2.5</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The field list can have an optional trailing separator,[m
[31m-as a convenience for machine-generated code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.8 - <a name="2.5.8">Function Calls</a></h3><p>[m
[31m-A function call in Lua has the following syntax:[m
[31m-[m
[31m-<pre>[m
[31m-	functioncall ::= prefixexp args[m
[31m-</pre><p>[m
[31m-In a function call,[m
[31m-first prefixexp and args are evaluated.[m
[31m-If the value of prefixexp has type <em>function</em>,[m
[31m-then this function is called[m
[31m-with the given arguments.[m
[31m-Otherwise, the prefixexp "call" metamethod is called,[m
[31m-having as first parameter the value of prefixexp,[m
[31m-followed by the original call arguments[m
[31m-(see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The form[m
[31m-[m
[31m-<pre>[m
[31m-	functioncall ::= prefixexp `<b>:</b>&acute; Name args[m
[31m-</pre><p>[m
[31m-can be used to call "methods".[m
[31m-A call <code>v:name(<em>args</em>)</code>[m
[31m-is syntactic sugar for <code>v.name(v,<em>args</em>)</code>,[m
[31m-except that <code>v</code> is evaluated only once.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Arguments have the following syntax:[m
[31m-[m
[31m-<pre>[m
[31m-	args ::= `<b>(</b>&acute; [explist] `<b>)</b>&acute;[m
[31m-	args ::= tableconstructor[m
[31m-	args ::= String[m
[31m-</pre><p>[m
[31m-All argument expressions are evaluated before the call.[m
[31m-A call of the form <code>f{<em>fields</em>}</code> is[m
[31m-syntactic sugar for <code>f({<em>fields</em>})</code>;[m
[31m-that is, the argument list is a single new table.[m
[31m-A call of the form <code>f'<em>string</em>'</code>[m
[31m-(or <code>f"<em>string</em>"</code> or <code>f[[<em>string</em>]]</code>)[m
[31m-is syntactic sugar for <code>f('<em>string</em>')</code>;[m
[31m-that is, the argument list is a single literal string.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an exception to the free-format syntax of Lua,[m
[31m-you cannot put a line break before the '<code>(</code>' in a function call.[m
[31m-This restriction avoids some ambiguities in the language.[m
[31m-If you write[m
[31m-[m
[31m-<pre>[m
[31m-     a = f[m
[31m-     (g).x(a)[m
[31m-</pre><p>[m
[31m-Lua would see that as a single statement, <code>a = f(g).x(a)</code>.[m
[31m-So, if you want two statements, you must add a semi-colon between them.[m
[31m-If you actually want to call <code>f</code>,[m
[31m-you must remove the line break before <code>(g)</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A call of the form <code>return</code> <em>functioncall</em> is called[m
[31m-a <em>tail call</em>.[m
[31m-Lua implements <em>proper tail calls</em>[m
[31m-(or <em>proper tail recursion</em>):[m
[31m-in a tail call,[m
[31m-the called function reuses the stack entry of the calling function.[m
[31m-Therefore, there is no limit on the number of nested tail calls that[m
[31m-a program can execute.[m
[31m-However, a tail call erases any debug information about the[m
[31m-calling function.[m
[31m-Note that a tail call only happens with a particular syntax,[m
[31m-where the <b>return</b> has one single function call as argument;[m
[31m-this syntax makes the calling function return exactly[m
[31m-the returns of the called function.[m
[31m-So, none of the following examples are tail calls:[m
[31m-[m
[31m-<pre>[m
[31m-     return (f(x))        -- results adjusted to 1[m
[31m-     return 2 * f(x)[m
[31m-     return x, f(x)       -- additional results[m
[31m-     f(x); return         -- results discarded[m
[31m-     return x or f(x)     -- results adjusted to 1[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.9 - <a name="2.5.9">Function Definitions</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-The syntax for function definition is[m
[31m-[m
[31m-<pre>[m
[31m-	function ::= <b>function</b> funcbody[m
[31m-	funcbody ::= `<b>(</b>&acute; [parlist] `<b>)</b>&acute; block <b>end</b>[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-The following syntactic sugar simplifies function definitions:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>function</b> funcname funcbody[m
[31m-	stat ::= <b>local</b> <b>function</b> Name funcbody[m
[31m-	funcname ::= Name {`<b>.</b>&acute; Name} [`<b>:</b>&acute; Name][m
[31m-</pre><p>[m
[31m-The statement[m
[31m-[m
[31m-<pre>[m
[31m-     function f () <em>body</em> end[m
[31m-</pre><p>[m
[31m-translates to[m
[31m-[m
[31m-<pre>[m
[31m-     f = function () <em>body</em> end[m
[31m-</pre><p>[m
[31m-The statement[m
[31m-[m
[31m-<pre>[m
[31m-     function t.a.b.c.f () <em>body</em> end[m
[31m-</pre><p>[m
[31m-translates to[m
[31m-[m
[31m-<pre>[m
[31m-     t.a.b.c.f = function () <em>body</em> end[m
[31m-</pre><p>[m
[31m-The statement[m
[31m-[m
[31m-<pre>[m
[31m-     local function f () <em>body</em> end[m
[31m-</pre><p>[m
[31m-translates to[m
[31m-[m
[31m-<pre>[m
[31m-     local f; f = function () <em>body</em> end[m
[31m-</pre><p>[m
[31m-<em>not</em> to[m
[31m-[m
[31m-<pre>[m
[31m-     local f = function () <em>body</em> end[m
[31m-</pre><p>[m
[31m-(This only makes a difference when the body of the function[m
[31m-contains references to <code>f</code>.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A function definition is an executable expression,[m
[31m-whose value has type <em>function</em>.[m
[31m-When Lua pre-compiles a chunk,[m
[31m-all its function bodies are pre-compiled too.[m
[31m-Then, whenever Lua executes the function definition,[m
[31m-the function is <em>instantiated</em> (or <em>closed</em>).[m
[31m-This function instance (or <em>closure</em>)[m
[31m-is the final value of the expression.[m
[31m-Different instances of the same function[m
[31m-can refer to different  external local variables[m
[31m-and can have different environment tables.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Parameters act as local variables that are[m
[31m-initialized with the argument values:[m
[31m-[m
[31m-<pre>[m
[31m-	parlist ::= namelist [`<b>,</b>&acute; `<b>...</b>&acute;] | `<b>...</b>&acute;[m
[31m-</pre><p>[m
[31m-When a function is called,[m
[31m-the list of arguments is adjusted to[m
[31m-the length of the list of parameters,[m
[31m-unless the function is a variadic or <em>vararg function</em>,[m
[31m-which is[m
[31m-indicated by three dots ('<code>...</code>') at the end of its parameter list.[m
[31m-A vararg function does not adjust its argument list;[m
[31m-instead, it collects all extra arguments and supplies them[m
[31m-to the function through a <em>vararg expression</em>,[m
[31m-which is also written as three dots.[m
[31m-The value of this expression is a list of all actual extra arguments,[m
[31m-similar to a function with multiple results.[m
[31m-If a vararg expression is used inside another expression[m
[31m-or in the middle of a list of expressions,[m
[31m-then its return list is adjusted to one element.[m
[31m-If the expression is used as the last element of a list of expressions,[m
[31m-then no adjustment is made[m
[31m-(unless that last expression is enclosed in parentheses).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an example, consider the following definitions:[m
[31m-[m
[31m-<pre>[m
[31m-     function f(a, b) end[m
[31m-     function g(a, b, ...) end[m
[31m-     function r() return 1,2,3 end[m
[31m-</pre><p>[m
[31m-Then, we have the following mapping from arguments to parameters and[m
[31m-to the vararg expression:[m
[31m-[m
[31m-<pre>[m
[31m-     CALL            PARAMETERS[m
[31m-     [m
[31m-     f(3)             a=3, b=nil[m
[31m-     f(3, 4)          a=3, b=4[m
[31m-     f(3, 4, 5)       a=3, b=4[m
[31m-     f(r(), 10)       a=1, b=10[m
[31m-     f(r())           a=1, b=2[m
[31m-     [m
[31m-     g(3)             a=3, b=nil, ... --&gt;  (nothing)[m
[31m-     g(3, 4)          a=3, b=4,   ... --&gt;  (nothing)[m
[31m-     g(3, 4, 5, 8)    a=3, b=4,   ... --&gt;  5  8[m
[31m-     g(5, r())        a=5, b=1,   ... --&gt;  2  3[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Results are returned using the <b>return</b> statement (see <a href="#2.4.4">&sect;2.4.4</a>).[m
[31m-If control reaches the end of a function[m
[31m-without encountering a <b>return</b> statement,[m
[31m-then the function returns with no results.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <em>colon</em> syntax[m
[31m-is used for defining <em>methods</em>,[m
[31m-that is, functions that have an implicit extra parameter <code>self</code>.[m
[31m-Thus, the statement[m
[31m-[m
[31m-<pre>[m
[31m-     function t.a.b.c:f (<em>params</em>) <em>body</em> end[m
[31m-</pre><p>[m
[31m-is syntactic sugar for[m
[31m-[m
[31m-<pre>[m
[31m-     t.a.b.c.f = function (self, <em>params</em>) <em>body</em> end[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.6 - <a name="2.6">Visibility Rules</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-Lua is a lexically scoped language.[m
[31m-The scope of variables begins at the first statement <em>after</em>[m
[31m-their declaration and lasts until the end of the innermost block that[m
[31m-includes the declaration.[m
[31m-Consider the following example:[m
[31m-[m
[31m-<pre>[m
[31m-     x = 10                -- global variable[m
[31m-     do                    -- new block[m
[31m-       local x = x         -- new 'x', with value 10[m
[31m-       print(x)            --&gt; 10[m
[31m-       x = x+1[m
[31m-       do                  -- another block[m
[31m-         local x = x+1     -- another 'x'[m
[31m-         print(x)          --&gt; 12[m
[31m-       end[m
[31m-       print(x)            --&gt; 11[m
[31m-     end[m
[31m-     print(x)              --&gt; 10  (the global one)[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Notice that, in a declaration like <code>local x = x</code>,[m
[31m-the new <code>x</code> being declared is not in scope yet,[m
[31m-and so the second <code>x</code> refers to the outside variable.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Because of the lexical scoping rules,[m
[31m-local variables can be freely accessed by functions[m
[31m-defined inside their scope.[m
[31m-A local variable used by an inner function is called[m
[31m-an <em>upvalue</em>, or <em>external local variable</em>,[m
[31m-inside the inner function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Notice that each execution of a <b>local</b> statement[m
[31m-defines new local variables.[m
[31m-Consider the following example:[m
[31m-[m
[31m-<pre>[m
[31m-     a = {}[m
[31m-     local x = 20[m
[31m-     for i=1,10 do[m
[31m-       local y = 0[m
[31m-       a[i] = function () y=y+1; return x+y end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-The loop creates ten closures[m
[31m-(that is, ten instances of the anonymous function).[m
[31m-Each of these closures uses a different <code>y</code> variable,[m
[31m-while all of them share the same <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.7 - <a name="2.7">Error Handling</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Because Lua is an embedded extension language,[m
[31m-all Lua actions start from C&nbsp;code in the host program[m
[31m-calling a function from the Lua library (see <a href="#lua_pcall"><code>lua_pcall</code></a>).[m
[31m-Whenever an error occurs during Lua compilation or execution,[m
[31m-control returns to C,[m
[31m-which can take appropriate measures[m
[31m-(such as printing an error message).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua code can explicitly generate an error by calling the[m
[31m-<a href="#pdf-error"><code>error</code></a> function.[m
[31m-If you need to catch errors in Lua,[m
[31m-you can use the <a href="#pdf-pcall"><code>pcall</code></a> function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.8 - <a name="2.8">Metatables</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Every value in Lua can have a <em>metatable</em>.[m
[31m-This <em>metatable</em> is an ordinary Lua table[m
[31m-that defines the behavior of the original value[m
[31m-under certain special operations.[m
[31m-You can change several aspects of the behavior[m
[31m-of operations over a value by setting specific fields in its metatable.[m
[31m-For instance, when a non-numeric value is the operand of an addition,[m
[31m-Lua checks for a function in the field <code>"__add"</code> in its metatable.[m
[31m-If it finds one,[m
[31m-Lua calls this function to perform the addition.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-We call the keys in a metatable <em>events</em>[m
[31m-and the values <em>metamethods</em>.[m
[31m-In the previous example, the event is <code>"add"</code> [m
[31m-and the metamethod is the function that performs the addition.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can query the metatable of any value[m
[31m-through the <a href="#pdf-getmetatable"><code>getmetatable</code></a> function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can replace the metatable of tables[m
[31m-through the <a href="#pdf-setmetatable"><code>setmetatable</code></a>[m
[31m-function.[m
[31m-You cannot change the metatable of other types from Lua[m
[31m-(except by using the debug library);[m
[31m-you must use the C&nbsp;API for that.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Tables and full userdata have individual metatables[m
[31m-(although multiple tables and userdata can share their metatables).[m
[31m-Values of all other types share one single metatable per type;[m
[31m-that is, there is one single metatable for all numbers,[m
[31m-one for all strings, etc.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A metatable controls how an object behaves in arithmetic operations,[m
[31m-order comparisons, concatenation, length operation, and indexing.[m
[31m-A metatable also can define a function to be called when a userdata[m
[31m-is garbage collected.[m
[31m-For each of these operations Lua associates a specific key[m
[31m-called an <em>event</em>.[m
[31m-When Lua performs one of these operations over a value,[m
[31m-it checks whether this value has a metatable with the corresponding event.[m
[31m-If so, the value associated with that key (the metamethod)[m
[31m-controls how Lua will perform the operation.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Metatables control the operations listed next.[m
[31m-Each operation is identified by its corresponding name.[m
[31m-The key for each operation is a string with its name prefixed by[m
[31m-two underscores, '<code>__</code>';[m
[31m-for instance, the key for operation "add" is the[m
[31m-string <code>"__add"</code>.[m
[31m-The semantics of these operations is better explained by a Lua function[m
[31m-describing how the interpreter executes the operation.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The code shown here in Lua is only illustrative;[m
[31m-the real behavior is hard coded in the interpreter[m
[31m-and it is much more efficient than this simulation.[m
[31m-All functions used in these descriptions[m
[31m-(<a href="#pdf-rawget"><code>rawget</code></a>, <a href="#pdf-tonumber"><code>tonumber</code></a>, etc.)[m
[31m-are described in <a href="#5.1">&sect;5.1</a>.[m
[31m-In particular, to retrieve the metamethod of a given object,[m
[31m-we use the expression[m
[31m-[m
[31m-<pre>[m
[31m-     metatable(obj)[event][m
[31m-</pre><p>[m
[31m-This should be read as[m
[31m-[m
[31m-<pre>[m
[31m-     rawget(getmetatable(obj) or {}, event)[m
[31m-</pre><p>[m
[31m-[m
[31m-That is, the access to a metamethod does not invoke other metamethods,[m
[31m-and the access to objects with no metatables does not fail[m
[31m-(it simply results in <b>nil</b>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>"add":</b>[m
[31m-the <code>+</code> operation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The function <code>getbinhandler</code> below defines how Lua chooses a handler[m
[31m-for a binary operation.[m
[31m-First, Lua tries the first operand.[m
[31m-If its type does not define a handler for the operation,[m
[31m-then Lua tries the second operand.[m
[31m-[m
[31m-<pre>[m
[31m-     function getbinhandler (op1, op2, event)[m
[31m-       return metatable(op1)[event] or metatable(op2)[event][m
[31m-     end[m
[31m-</pre><p>[m
[31m-By using this function,[m
[31m-the behavior of the <code>op1 + op2</code> is[m
[31m-[m
[31m-<pre>[m
[31m-     function add_event (op1, op2)[m
[31m-       local o1, o2 = tonumber(op1), tonumber(op2)[m
[31m-       if o1 and o2 then  -- both operands are numeric?[m
[31m-         return o1 + o2   -- '+' here is the primitive 'add'[m
[31m-       else  -- at least one of the operands is not numeric[m
[31m-         local h = getbinhandler(op1, op2, "__add")[m
[31m-         if h then[m
[31m-           -- call the handler with both operands[m
[31m-           return (h(op1, op2))[m
[31m-         else  -- no handler available: default behavior[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"sub":</b>[m
[31m-the <code>-</code> operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"mul":</b>[m
[31m-the <code>*</code> operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"div":</b>[m
[31m-the <code>/</code> operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"mod":</b>[m
[31m-the <code>%</code> operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation,[m
[31m-with the operation[m
[31m-<code>o1 - floor(o1/o2)*o2</code> as the primitive operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"pow":</b>[m
[31m-the <code>^</code> (exponentiation) operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation,[m
[31m-with the function <code>pow</code> (from the C&nbsp;math library)[m
[31m-as the primitive operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"unm":</b>[m
[31m-the unary <code>-</code> operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function unm_event (op)[m
[31m-       local o = tonumber(op)[m
[31m-       if o then  -- operand is numeric?[m
[31m-         return -o  -- '-' here is the primitive 'unm'[m
[31m-       else  -- the operand is not numeric.[m
[31m-         -- Try to get a handler from the operand[m
[31m-         local h = metatable(op).__unm[m
[31m-         if h then[m
[31m-           -- call the handler with the operand[m
[31m-           return (h(op))[m
[31m-         else  -- no handler available: default behavior[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"concat":</b>[m
[31m-the <code>..</code> (concatenation) operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function concat_event (op1, op2)[m
[31m-       if (type(op1) == "string" or type(op1) == "number") and[m
[31m-          (type(op2) == "string" or type(op2) == "number") then[m
[31m-         return op1 .. op2  -- primitive string concatenation[m
[31m-       else[m
[31m-         local h = getbinhandler(op1, op2, "__concat")[m
[31m-         if h then[m
[31m-           return (h(op1, op2))[m
[31m-         else[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"len":</b>[m
[31m-the <code>#</code> operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function len_event (op)[m
[31m-       if type(op) == "string" then[m
[31m-         return strlen(op)         -- primitive string length[m
[31m-       elseif type(op) == "table" then[m
[31m-         return #op                -- primitive table length[m
[31m-       else[m
[31m-         local h = metatable(op).__len[m
[31m-         if h then[m
[31m-           -- call the handler with the operand[m
[31m-           return (h(op))[m
[31m-         else  -- no handler available: default behavior[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-See <a href="#2.5.5">&sect;2.5.5</a> for a description of the length of a table.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"eq":</b>[m
[31m-the <code>==</code> operation.[m
[31m-[m
[31m-The function <code>getcomphandler</code> defines how Lua chooses a metamethod[m
[31m-for comparison operators.[m
[31m-A metamethod only is selected when both objects[m
[31m-being compared have the same type[m
[31m-and the same metamethod for the selected operation.[m
[31m-[m
[31m-<pre>[m
[31m-     function getcomphandler (op1, op2, event)[m
[31m-       if type(op1) ~= type(op2) then return nil end[m
[31m-       local mm1 = metatable(op1)[event][m
[31m-       local mm2 = metatable(op2)[event][m
[31m-       if mm1 == mm2 then return mm1 else return nil end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-The "eq" event is defined as follows:[m
[31m-[m
[31m-<pre>[m
[31m-     function eq_event (op1, op2)[m
[31m-       if type(op1) ~= type(op2) then  -- different types?[m
[31m-         return false   -- different objects[m
[31m-       end[m
[31m-       if op1 == op2 then   -- primitive equal?[m
[31m-         return true   -- objects are equal[m
[31m-       end[m
[31m-       -- try metamethod[m
[31m-       local h = getcomphandler(op1, op2, "__eq")[m
[31m-       if h then[m
[31m-         return (h(op1, op2))[m
[31m-       else[m
[31m-         return false[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-<code>a ~= b</code> is equivalent to <code>not (a == b)</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"lt":</b>[m
[31m-the <code>&lt;</code> operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function lt_event (op1, op2)[m
[31m-       if type(op1) == "number" and type(op2) == "number" then[m
[31m-         return op1 &lt; op2   -- numeric comparison[m
[31m-       elseif type(op1) == "string" and type(op2) == "string" then[m
[31m-         return op1 &lt; op2   -- lexicographic comparison[m
[31m-       else[m
[31m-         local h = getcomphandler(op1, op2, "__lt")[m
[31m-         if h then[m
[31m-           return (h(op1, op2))[m
[31m-         else[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-<code>a &gt; b</code> is equivalent to <code>b &lt; a</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"le":</b>[m
[31m-the <code>&lt;=</code> operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function le_event (op1, op2)[m
[31m-       if type(op1) == "number" and type(op2) == "number" then[m
[31m-         return op1 &lt;= op2   -- numeric comparison[m
[31m-       elseif type(op1) == "string" and type(op2) == "string" then[m
[31m-         return op1 &lt;= op2   -- lexicographic comparison[m
[31m-       else[m
[31m-         local h = getcomphandler(op1, op2, "__le")[m
[31m-         if h then[m
[31m-           return (h(op1, op2))[m
[31m-         else[m
[31m-           h = getcomphandler(op1, op2, "__lt")[m
[31m-           if h then[m
[31m-             return not h(op2, op1)[m
[31m-           else[m
[31m-             error(&middot;&middot;&middot;)[m
[31m-           end[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-<code>a &gt;= b</code> is equivalent to <code>b &lt;= a</code>.[m
[31m-Note that, in the absence of a "le" metamethod,[m
[31m-Lua tries the "lt", assuming that <code>a &lt;= b</code> is[m
[31m-equivalent to <code>not (b &lt; a)</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"index":</b>[m
[31m-The indexing access <code>table[key]</code>.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function gettable_event (table, key)[m
[31m-       local h[m
[31m-       if type(table) == "table" then[m
[31m-         local v = rawget(table, key)[m
[31m-         if v ~= nil then return v end[m
[31m-         h = metatable(table).__index[m
[31m-         if h == nil then return nil end[m
[31m-       else[m
[31m-         h = metatable(table).__index[m
[31m-         if h == nil then[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-       if type(h) == "function" then[m
[31m-         return (h(table, key))     -- call the handler[m
[31m-       else return h[key]           -- or repeat operation on it[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"newindex":</b>[m
[31m-The indexing assignment <code>table[key] = value</code>.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function settable_event (table, key, value)[m
[31m-       local h[m
[31m-       if type(table) == "table" then[m
[31m-         local v = rawget(table, key)[m
[31m-         if v ~= nil then rawset(table, key, value); return end[m
[31m-         h = metatable(table).__newindex[m
[31m-         if h == nil then rawset(table, key, value); return end[m
[31m-       else[m
[31m-         h = metatable(table).__newindex[m
[31m-         if h == nil then[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-       if type(h) == "function" then[m
[31m-         h(table, key,value)           -- call the handler[m
[31m-       else h[key] = value             -- or repeat operation on it[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"call":</b>[m
[31m-called when Lua calls a value.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function function_event (func, ...)[m
[31m-       if type(func) == "function" then[m
[31m-         return func(...)   -- primitive call[m
[31m-       else[m
[31m-         local h = metatable(func).__call[m
[31m-         if h then[m
[31m-           return h(func, ...)[m
[31m-         else[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.9 - <a name="2.9">Environments</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Besides metatables,[m
[31m-objects of types thread, function, and userdata[m
[31m-have another table associated with them,[m
[31m-called their <em>environment</em>.[m
[31m-Like metatables, environments are regular tables and[m
[31m-multiple objects can share the same environment.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Threads are created sharing the environment of the creating thread.[m
[31m-Userdata and C&nbsp;functions are created sharing the environment[m
[31m-of the creating C&nbsp;function.[m
[31m-Non-nested Lua functions[m
[31m-(created by <a href="#pdf-loadfile"><code>loadfile</code></a>, <a href="#pdf-loadstring"><code>loadstring</code></a> or <a href="#pdf-load"><code>load</code></a>)[m
[31m-are created sharing the environment of the creating thread.[m
[31m-Nested Lua functions are created sharing the environment of[m
[31m-the creating Lua function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Environments associated with userdata have no meaning for Lua.[m
[31m-It is only a convenience feature for programmers to associate a table to[m
[31m-a userdata.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Environments associated with threads are called[m
[31m-<em>global environments</em>.[m
[31m-They are used as the default environment for threads and[m
[31m-non-nested Lua functions created by the thread[m
[31m-and can be directly accessed by C&nbsp;code (see <a href="#3.3">&sect;3.3</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The environment associated with a C&nbsp;function can be directly[m
[31m-accessed by C&nbsp;code (see <a href="#3.3">&sect;3.3</a>).[m
[31m-It is used as the default environment for other C&nbsp;functions[m
[31m-and userdata created by the function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Environments associated with Lua functions are used to resolve[m
[31m-all accesses to global variables within the function (see <a href="#2.3">&sect;2.3</a>).[m
[31m-They are used as the default environment for nested Lua functions[m
[31m-created by the function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can change the environment of a Lua function or the[m
[31m-running thread by calling <a href="#pdf-setfenv"><code>setfenv</code></a>.[m
[31m-You can get the environment of a Lua function or the running thread[m
[31m-by calling <a href="#pdf-getfenv"><code>getfenv</code></a>.[m
[31m-To manipulate the environment of other objects[m
[31m-(userdata, C&nbsp;functions, other threads) you must[m
[31m-use the C&nbsp;API.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.10 - <a name="2.10">Garbage Collection</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua performs automatic memory management.[m
[31m-This means that[m
[31m-you have to worry neither about allocating memory for new objects[m
[31m-nor about freeing it when the objects are no longer needed.[m
[31m-Lua manages memory automatically by running[m
[31m-a <em>garbage collector</em> from time to time[m
[31m-to collect all <em>dead objects</em>[m
[31m-(that is, objects that are no longer accessible from Lua).[m
[31m-All memory used by Lua is subject to automatic management:[m
[31m-tables, userdata, functions, threads, strings, etc.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua implements an incremental mark-and-sweep collector.[m
[31m-It uses two numbers to control its garbage-collection cycles:[m
[31m-the <em>garbage-collector pause</em> and[m
[31m-the <em>garbage-collector step multiplier</em>.[m
[31m-Both use percentage points as units[m
[31m-(so that a value of 100 means an internal value of 1).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The garbage-collector pause[m
[31m-controls how long the collector waits before starting a new cycle.[m
[31m-Larger values make the collector less aggressive.[m
[31m-Values smaller than 100 mean the collector will not wait to[m
[31m-start a new cycle.[m
[31m-A value of 200 means that the collector waits for the total memory in use[m
[31m-to double before starting a new cycle.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The step multiplier[m
[31m-controls the relative speed of the collector relative to[m
[31m-memory allocation.[m
[31m-Larger values make the collector more aggressive but also increase[m
[31m-the size of each incremental step.[m
[31m-Values smaller than 100 make the collector too slow and[m
[31m-can result in the collector never finishing a cycle.[m
[31m-The default, 200, means that the collector runs at "twice"[m
[31m-the speed of memory allocation.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can change these numbers by calling <a href="#lua_gc"><code>lua_gc</code></a> in C[m
[31m-or <a href="#pdf-collectgarbage"><code>collectgarbage</code></a> in Lua.[m
[31m-With these functions you can also control [m
[31m-the collector directly (e.g., stop and restart it).[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.10.1 - <a name="2.10.1">Garbage-Collection Metamethods</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-Using the C&nbsp;API,[m
[31m-you can set garbage-collector metamethods for userdata (see <a href="#2.8">&sect;2.8</a>).[m
[31m-These metamethods are also called <em>finalizers</em>.[m
[31m-Finalizers allow you to coordinate Lua's garbage collection[m
[31m-with external resource management[m
[31m-(such as closing files, network or database connections,[m
[31m-or freeing your own memory).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Garbage userdata with a field <code>__gc</code> in their metatables are not[m
[31m-collected immediately by the garbage collector.[m
[31m-Instead, Lua puts them in a list.[m
[31m-After the collection,[m
[31m-Lua does the equivalent of the following function[m
[31m-for each userdata in that list:[m
[31m-[m
[31m-<pre>[m
[31m-     function gc_event (udata)[m
[31m-       local h = metatable(udata).__gc[m
[31m-       if h then[m
[31m-         h(udata)[m
[31m-       end[m
[31m-     end[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-At the end of each garbage-collection cycle,[m
[31m-the finalizers for userdata are called in <em>reverse</em>[m
[31m-order of their creation,[m
[31m-among those collected in that cycle.[m
[31m-That is, the first finalizer to be called is the one associated[m
[31m-with the userdata created last in the program.[m
[31m-The userdata itself is freed only in the next garbage-collection cycle.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.10.2 - <a name="2.10.2">Weak Tables</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-A <em>weak table</em> is a table whose elements are[m
[31m-<em>weak references</em>.[m
[31m-A weak reference is ignored by the garbage collector.[m
[31m-In other words,[m
[31m-if the only references to an object are weak references,[m
[31m-then the garbage collector will collect this object.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A weak table can have weak keys, weak values, or both.[m
[31m-A table with weak keys allows the collection of its keys,[m
[31m-but prevents the collection of its values.[m
[31m-A table with both weak keys and weak values allows the collection of[m
[31m-both keys and values.[m
[31m-In any case, if either the key or the value is collected,[m
[31m-the whole pair is removed from the table.[m
[31m-The weakness of a table is controlled by the[m
[31m-<code>__mode</code> field of its metatable.[m
[31m-If the <code>__mode</code> field is a string containing the character&nbsp;'<code>k</code>',[m
[31m-the keys in the table are weak.[m
[31m-If <code>__mode</code> contains '<code>v</code>',[m
[31m-the values in the table are weak.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-After you use a table as a metatable,[m
[31m-you should not change the value of its <code>__mode</code> field.[m
[31m-Otherwise, the weak behavior of the tables controlled by this[m
[31m-metatable is undefined.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.11 - <a name="2.11">Coroutines</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua supports coroutines,[m
[31m-also called <em>collaborative multithreading</em>.[m
[31m-A coroutine in Lua represents an independent thread of execution.[m
[31m-Unlike threads in multithread systems, however,[m
[31m-a coroutine only suspends its execution by explicitly calling[m
[31m-a yield function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You create a coroutine with a call to <a href="#pdf-coroutine.create"><code>coroutine.create</code></a>.[m
[31m-Its sole argument is a function[m
[31m-that is the main function of the coroutine.[m
[31m-The <code>create</code> function only creates a new coroutine and[m
[31m-returns a handle to it (an object of type <em>thread</em>);[m
[31m-it does not start the coroutine execution.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When you first call <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>,[m
[31m-passing as its first argument[m
[31m-a thread returned by <a href="#pdf-coroutine.create"><code>coroutine.create</code></a>,[m
[31m-the coroutine starts its execution,[m
[31m-at the first line of its main function.[m
[31m-Extra arguments passed to <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> are passed on[m
[31m-to the coroutine main function.[m
[31m-After the coroutine starts running,[m
[31m-it runs until it terminates or <em>yields</em>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A coroutine can terminate its execution in two ways:[m
[31m-normally, when its main function returns[m
[31m-(explicitly or implicitly, after the last instruction);[m
[31m-and abnormally, if there is an unprotected error.[m
[31m-In the first case, <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> returns <b>true</b>,[m
[31m-plus any values returned by the coroutine main function.[m
[31m-In case of errors, <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> returns <b>false</b>[m
[31m-plus an error message.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A coroutine yields by calling <a href="#pdf-coroutine.yield"><code>coroutine.yield</code></a>.[m
[31m-When a coroutine yields,[m
[31m-the corresponding <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> returns immediately,[m
[31m-even if the yield happens inside nested function calls[m
[31m-(that is, not in the main function,[m
[31m-but in a function directly or indirectly called by the main function).[m
[31m-In the case of a yield, <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> also returns <b>true</b>,[m
[31m-plus any values passed to <a href="#pdf-coroutine.yield"><code>coroutine.yield</code></a>.[m
[31m-The next time you resume the same coroutine,[m
[31m-it continues its execution from the point where it yielded,[m
[31m-with the call to <a href="#pdf-coroutine.yield"><code>coroutine.yield</code></a> returning any extra[m
[31m-arguments passed to <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Like <a href="#pdf-coroutine.create"><code>coroutine.create</code></a>,[m
[31m-the <a href="#pdf-coroutine.wrap"><code>coroutine.wrap</code></a> function also creates a coroutine,[m
[31m-but instead of returning the coroutine itself,[m
[31m-it returns a function that, when called, resumes the coroutine.[m
[31m-Any arguments passed to this function[m
[31m-go as extra arguments to <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>.[m
[31m-<a href="#pdf-coroutine.wrap"><code>coroutine.wrap</code></a> returns all the values returned by <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>,[m
[31m-except the first one (the boolean error code).[m
[31m-Unlike <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>,[m
[31m-<a href="#pdf-coroutine.wrap"><code>coroutine.wrap</code></a> does not catch errors;[m
[31m-any error is propagated to the caller.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an example,[m
[31m-consider the following code:[m
[31m-[m
[31m-<pre>[m
[31m-     function foo (a)[m
[31m-       print("foo", a)[m
[31m-       return coroutine.yield(2*a)[m
[31m-     end[m
[31m-     [m
[31m-     co = coroutine.create(function (a,b)[m
[31m-           print("co-body", a, b)[m
[31m-           local r = foo(a+1)[m
[31m-           print("co-body", r)[m
[31m-           local r, s = coroutine.yield(a+b, a-b)[m
[31m-           print("co-body", r, s)[m
[31m-           return b, "end"[m
[31m-     end)[m
[31m-            [m
[31m-     print("main", coroutine.resume(co, 1, 10))[m
[31m-     print("main", coroutine.resume(co, "r"))[m
[31m-     print("main", coroutine.resume(co, "x", "y"))[m
[31m-     print("main", coroutine.resume(co, "x", "y"))[m
[31m-</pre><p>[m
[31m-When you run it, it produces the following output:[m
[31m-[m
[31m-<pre>[m
[31m-     co-body 1       10[m
[31m-     foo     2[m
[31m-     [m
[31m-     main    true    4[m
[31m-     co-body r[m
[31m-     main    true    11      -9[m
[31m-     co-body x       y[m
[31m-     main    true    10      end[m
[31m-     main    false   cannot resume dead coroutine[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>3 - <a name="3">The Application Program Interface</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-This section describes the C&nbsp;API for Lua, that is,[m
[31m-the set of C&nbsp;functions available to the host program to communicate[m
[31m-with Lua.[m
[31m-All API functions and related types and constants[m
[31m-are declared in the header file <a name="pdf-lua.h"><code>lua.h</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Even when we use the term "function",[m
[31m-any facility in the API may be provided as a macro instead.[m
[31m-All such macros use each of their arguments exactly once[m
[31m-(except for the first argument, which is always a Lua state),[m
[31m-and so do not generate any hidden side-effects.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As in most C&nbsp;libraries,[m
[31m-the Lua API functions do not check their arguments for validity or consistency.[m
[31m-However, you can change this behavior by compiling Lua[m
[31m-with a proper definition for the macro <a name="pdf-luai_apicheck"><code>luai_apicheck</code></a>,[m
[31m-in file <code>luaconf.h</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.1 - <a name="3.1">The Stack</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua uses a <em>virtual stack</em> to pass values to and from C.[m
[31m-Each element in this stack represents a Lua value[m
[31m-(<b>nil</b>, number, string, etc.).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Whenever Lua calls C, the called function gets a new stack,[m
[31m-which is independent of previous stacks and of stacks of[m
[31m-C&nbsp;functions that are still active.[m
[31m-This stack initially contains any arguments to the C&nbsp;function[m
[31m-and it is where the C&nbsp;function pushes its results[m
[31m-to be returned to the caller (see <a href="#lua_CFunction"><code>lua_CFunction</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-For convenience,[m
[31m-most query operations in the API do not follow a strict stack discipline.[m
[31m-Instead, they can refer to any element in the stack[m
[31m-by using an <em>index</em>:[m
[31m-A positive index represents an <em>absolute</em> stack position[m
[31m-(starting at&nbsp;1);[m
[31m-a negative index represents an <em>offset</em> relative to the top of the stack.[m
[31m-More specifically, if the stack has <em>n</em> elements,[m
[31m-then index&nbsp;1 represents the first element[m
[31m-(that is, the element that was pushed onto the stack first)[m
[31m-and[m
[31m-index&nbsp;<em>n</em> represents the last element;[m
[31m-index&nbsp;-1 also represents the last element[m
[31m-(that is, the element at the&nbsp;top)[m
[31m-and index <em>-n</em> represents the first element.[m
[31m-We say that an index is <em>valid</em>[m
[31m-if it lies between&nbsp;1 and the stack top[m
[31m-(that is, if <code>1 &le; abs(index) &le; top</code>).[m
[31m- [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.2 - <a name="3.2">Stack Size</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-When you interact with Lua API,[m
[31m-you are responsible for ensuring consistency.[m
[31m-In particular,[m
[31m-<em>you are responsible for controlling stack overflow</em>.[m
[31m-You can use the function <a href="#lua_checkstack"><code>lua_checkstack</code></a>[m
[31m-to grow the stack size.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Whenever Lua calls C,[m
[31m-it ensures that at least <a name="pdf-LUA_MINSTACK"><code>LUA_MINSTACK</code></a> stack positions are available.[m
[31m-<code>LUA_MINSTACK</code> is defined as 20,[m
[31m-so that usually you do not have to worry about stack space[m
[31m-unless your code has loops pushing elements onto the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Most query functions accept as indices any value inside the[m
[31m-available stack space, that is, indices up to the maximum stack size[m
[31m-you have set through <a href="#lua_checkstack"><code>lua_checkstack</code></a>.[m
[31m-Such indices are called <em>acceptable indices</em>.[m
[31m-More formally, we define an <em>acceptable index</em>[m
[31m-as follows:[m
[31m-[m
[31m-<pre>[m
[31m-     (index &lt; 0 &amp;&amp; abs(index) &lt;= top) ||[m
[31m-     (index &gt; 0 &amp;&amp; index &lt;= stackspace)[m
[31m-</pre><p>[m
[31m-Note that 0 is never an acceptable index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.3 - <a name="3.3">Pseudo-Indices</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Unless otherwise noted,[m
[31m-any function that accepts valid indices can also be called with[m
[31m-<em>pseudo-indices</em>,[m
[31m-which represent some Lua values that are accessible to C&nbsp;code[m
[31m-but which are not in the stack.[m
[31m-Pseudo-indices are used to access the thread environment,[m
[31m-the function environment,[m
[31m-the registry,[m
[31m-and the upvalues of a C&nbsp;function (see <a href="#3.4">&sect;3.4</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The thread environment (where global variables live) is[m
[31m-always at pseudo-index <a name="pdf-LUA_GLOBALSINDEX"><code>LUA_GLOBALSINDEX</code></a>.[m
[31m-The environment of the running C&nbsp;function is always[m
[31m-at pseudo-index <a name="pdf-LUA_ENVIRONINDEX"><code>LUA_ENVIRONINDEX</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To access and change the value of global variables,[m
[31m-you can use regular table operations over an environment table.[m
[31m-For instance, to access the value of a global variable, do[m
[31m-[m
[31m-<pre>[m
[31m-     lua_getfield(L, LUA_GLOBALSINDEX, varname);[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.4 - <a name="3.4">C Closures</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-When a C&nbsp;function is created,[m
[31m-it is possible to associate some values with it,[m
[31m-thus creating a <em>C&nbsp;closure</em>;[m
[31m-these values are called <em>upvalues</em> and are[m
[31m-accessible to the function whenever it is called[m
[31m-(see <a href="#lua_pushcclosure"><code>lua_pushcclosure</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Whenever a C&nbsp;function is called,[m
[31m-its upvalues are located at specific pseudo-indices.[m
[31m-These pseudo-indices are produced by the macro[m
[31m-<a name="lua_upvalueindex"><code>lua_upvalueindex</code></a>.[m
[31m-The first value associated with a function is at position[m
[31m-<code>lua_upvalueindex(1)</code>, and so on.[m
[31m-Any access to <code>lua_upvalueindex(<em>n</em>)</code>,[m
[31m-where <em>n</em> is greater than the number of upvalues of the[m
[31m-current function (but not greater than 256),[m
[31m-produces an acceptable (but invalid) index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.5 - <a name="3.5">Registry</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua provides a <em>registry</em>,[m
[31m-a pre-defined table that can be used by any C&nbsp;code to[m
[31m-store whatever Lua value it needs to store.[m
[31m-This table is always located at pseudo-index[m
[31m-<a name="pdf-LUA_REGISTRYINDEX"><code>LUA_REGISTRYINDEX</code></a>.[m
[31m-Any C&nbsp;library can store data into this table,[m
[31m-but it should take care to choose keys different from those used[m
[31m-by other libraries, to avoid collisions.[m
[31m-Typically, you should use as key a string containing your library name[m
[31m-or a light userdata with the address of a C&nbsp;object in your code.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The integer keys in the registry are used by the reference mechanism,[m
[31m-implemented by the auxiliary library,[m
[31m-and therefore should not be used for other purposes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.6 - <a name="3.6">Error Handling in C</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Internally, Lua uses the C <code>longjmp</code> facility to handle errors.[m
[31m-(You can also choose to use exceptions if you use C++;[m
[31m-see file <code>luaconf.h</code>.)[m
[31m-When Lua faces any error[m
[31m-(such as memory allocation errors, type errors, syntax errors,[m
[31m-and runtime errors)[m
[31m-it <em>raises</em> an error;[m
[31m-that is, it does a long jump.[m
[31m-A <em>protected environment</em> uses <code>setjmp</code>[m
[31m-to set a recover point;[m
[31m-any error jumps to the most recent active recover point.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Most functions in the API can throw an error,[m
[31m-for instance due to a memory allocation error.[m
[31m-The documentation for each function indicates whether[m
[31m-it can throw errors.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Inside a C&nbsp;function you can throw an error by calling <a href="#lua_error"><code>lua_error</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.7 - <a name="3.7">Functions and Types</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Here we list all functions and types from the C&nbsp;API in[m
[31m-alphabetical order.[m
[31m-Each function has an indicator like this:[m
[31m-<span class="apii">[-o, +p, <em>x</em>]</span>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The first field, <code>o</code>,[m
[31m-is how many elements the function pops from the stack.[m
[31m-The second field, <code>p</code>,[m
[31m-is how many elements the function pushes onto the stack.[m
[31m-(Any function always pushes its results after popping its arguments.)[m
[31m-A field in the form <code>x|y</code> means the function can push (or pop)[m
[31m-<code>x</code> or <code>y</code> elements,[m
[31m-depending on the situation;[m
[31m-an interrogation mark '<code>?</code>' means that[m
[31m-we cannot know how many elements the function pops/pushes[m
[31m-by looking only at its arguments[m
[31m-(e.g., they may depend on what is on the stack).[m
[31m-The third field, <code>x</code>,[m
[31m-tells whether the function may throw errors:[m
[31m-'<code>-</code>' means the function never throws any error;[m
[31m-'<code>m</code>' means the function may throw an error[m
[31m-only due to not enough memory;[m
[31m-'<code>e</code>' means the function may throw other kinds of errors;[m
[31m-'<code>v</code>' means the function may throw an error on purpose.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Alloc"><code>lua_Alloc</code></a></h3>[m
[31m-<pre>typedef void * (*lua_Alloc) (void *ud,[m
[31m-                             void *ptr,[m
[31m-                             size_t osize,[m
[31m-                             size_t nsize);</pre>[m
[31m-[m
[31m-<p>[m
[31m-The type of the memory-allocation function used by Lua states.[m
[31m-The allocator function must provide a[m
[31m-functionality similar to <code>realloc</code>,[m
[31m-but not exactly the same.[m
[31m-Its arguments are[m
[31m-<code>ud</code>, an opaque pointer passed to <a href="#lua_newstate"><code>lua_newstate</code></a>;[m
[31m-<code>ptr</code>, a pointer to the block being allocated/reallocated/freed;[m
[31m-<code>osize</code>, the original size of the block;[m
[31m-<code>nsize</code>, the new size of the block.[m
[31m-<code>ptr</code> is <code>NULL</code> if and only if <code>osize</code> is zero.[m
[31m-When <code>nsize</code> is zero, the allocator must return <code>NULL</code>;[m
[31m-if <code>osize</code> is not zero,[m
[31m-it should free the block pointed to by <code>ptr</code>.[m
[31m-When <code>nsize</code> is not zero, the allocator returns <code>NULL</code>[m
[31m-if and only if it cannot fill the request.[m
[31m-When <code>nsize</code> is not zero and <code>osize</code> is zero,[m
[31m-the allocator should behave like <code>malloc</code>.[m
[31m-When <code>nsize</code> and <code>osize</code> are not zero,[m
[31m-the allocator behaves like <code>realloc</code>.[m
[31m-Lua assumes that the allocator never fails when[m
[31m-<code>osize &gt;= nsize</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Here is a simple implementation for the allocator function.[m
[31m-It is used in the auxiliary library by <a href="#luaL_newstate"><code>luaL_newstate</code></a>.[m
[31m-[m
[31m-<pre>[m
[31m-     static void *l_alloc (void *ud, void *ptr, size_t osize,[m
[31m-                                                size_t nsize) {[m
[31m-       (void)ud;  (void)osize;  /* not used */[m
[31m-       if (nsize == 0) {[m
[31m-         free(ptr);[m
[31m-         return NULL;[m
[31m-       }[m
[31m-       else[m
[31m-         return realloc(ptr, nsize);[m
[31m-     }[m
[31m-</pre><p>[m
[31m-This code assumes[m
[31m-that <code>free(NULL)</code> has no effect and that[m
[31m-<code>realloc(NULL, size)</code> is equivalent to <code>malloc(size)</code>.[m
[31m-ANSI&nbsp;C ensures both behaviors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_atpanic"><code>lua_atpanic</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets a new panic function and returns the old one.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If an error happens outside any protected environment,[m
[31m-Lua calls a <em>panic function</em>[m
[31m-and then calls <code>exit(EXIT_FAILURE)</code>,[m
[31m-thus exiting the host application.[m
[31m-Your panic function can avoid this exit by[m
[31m-never returning (e.g., doing a long jump).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The panic function can access the error message at the top of the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_call"><code>lua_call</code></a></h3><p>[m
[31m-<span class="apii">[-(nargs + 1), +nresults, <em>e</em>]</span>[m
[31m-<pre>void lua_call (lua_State *L, int nargs, int nresults);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Calls a function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To call a function you must use the following protocol:[m
[31m-first, the function to be called is pushed onto the stack;[m
[31m-then, the arguments to the function are pushed[m
[31m-in direct order;[m
[31m-that is, the first argument is pushed first.[m
[31m-Finally you call <a href="#lua_call"><code>lua_call</code></a>;[m
[31m-<code>nargs</code> is the number of arguments that you pushed onto the stack.[m
[31m-All arguments and the function value are popped from the stack[m
[31m-when the function is called.[m
[31m-The function results are pushed onto the stack when the function returns.[m
[31m-The number of results is adjusted to <code>nresults</code>,[m
[31m-unless <code>nresults</code> is <a name="pdf-LUA_MULTRET"><code>LUA_MULTRET</code></a>.[m
[31m-In this case, <em>all</em> results from the function are pushed.[m
[31m-Lua takes care that the returned values fit into the stack space.[m
[31m-The function results are pushed onto the stack in direct order[m
[31m-(the first result is pushed first),[m
[31m-so that after the call the last result is on the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Any error inside the called function is propagated upwards[m
[31m-(with a <code>longjmp</code>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The following example shows how the host program can do the[m
[31m-equivalent to this Lua code:[m
[31m-[m
[31m-<pre>[m
[31m-     a = f("how", t.x, 14)[m
[31m-</pre><p>[m
[31m-Here it is in&nbsp;C:[m
[31m-[m
[31m-<pre>[m
[31m-     lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */[m
[31m-     lua_pushstring(L, "how");                        /* 1st argument */[m
[31m-     lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* table to be indexed */[m
[31m-     lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */[m
[31m-     lua_remove(L, -2);                  /* remove 't' from the stack */[m
[31m-     lua_pushinteger(L, 14);                          /* 3rd argument */[m
[31m-     lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */[m
[31m-     lua_setfield(L, LUA_GLOBALSINDEX, "a");        /* set global 'a' */[m
[31m-</pre><p>[m
[31m-Note that the code above is "balanced":[m
[31m-at its end, the stack is back to its original configuration.[m
[31m-This is considered good programming practice.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_CFunction"><code>lua_CFunction</code></a></h3>[m
[31m-<pre>typedef int (*lua_CFunction) (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Type for C&nbsp;functions.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In order to communicate properly with Lua,[m
[31m-a C&nbsp;function must use the following protocol,[m
[31m-which defines the way parameters and results are passed:[m
[31m-a C&nbsp;function receives its arguments from Lua in its stack[m
[31m-in direct order (the first argument is pushed first).[m
[31m-So, when the function starts,[m
[31m-<code>lua_gettop(L)</code> returns the number of arguments received by the function.[m
[31m-The first argument (if any) is at index 1[m
[31m-and its last argument is at index <code>lua_gettop(L)</code>.[m
[31m-To return values to Lua, a C&nbsp;function just pushes them onto the stack,[m
[31m-in direct order (the first result is pushed first),[m
[31m-and returns the number of results.[m
[31m-Any other value in the stack below the results will be properly[m
[31m-discarded by Lua.[m
[31m-Like a Lua function, a C&nbsp;function called by Lua can also return[m
[31m-many results.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an example, the following function receives a variable number[m
[31m-of numerical arguments and returns their average and sum:[m
[31m-[m
[31m-<pre>[m
[31m-     static int foo (lua_State *L) {[m
[31m-       int n = lua_gettop(L);    /* number of arguments */[m
[31m-       lua_Number sum = 0;[m
[31m-       int i;[m
[31m-       for (i = 1; i &lt;= n; i++) {[m
[31m-         if (!lua_isnumber(L, i)) {[m
[31m-           lua_pushstring(L, "incorrect argument");[m
[31m-           lua_error(L);[m
[31m-         }[m
[31m-         sum += lua_tonumber(L, i);[m
[31m-       }[m
[31m-       lua_pushnumber(L, sum/n);        /* first result */[m
[31m-       lua_pushnumber(L, sum);         /* second result */[m
[31m-       return 2;                   /* number of results */[m
[31m-     }[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_checkstack"><code>lua_checkstack</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>int lua_checkstack (lua_State *L, int extra);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Ensures that there are at least <code>extra</code> free stack slots in the stack.[m
[31m-It returns false if it cannot grow the stack to that size.[m
[31m-This function never shrinks the stack;[m
[31m-if the stack is already larger than the new size,[m
[31m-it is left unchanged.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_close"><code>lua_close</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_close (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Destroys all objects in the given Lua state[m
[31m-(calling the corresponding garbage-collection metamethods, if any)[m
[31m-and frees all dynamic memory used by this state.[m
[31m-On several platforms, you may not need to call this function,[m
[31m-because all resources are naturally released when the host program ends.[m
[31m-On the other hand, long-running programs,[m
[31m-such as a daemon or a web server,[m
[31m-might need to release states as soon as they are not needed,[m
[31m-to avoid growing too large.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_concat"><code>lua_concat</code></a></h3><p>[m
[31m-<span class="apii">[-n, +1, <em>e</em>]</span>[m
[31m-<pre>void lua_concat (lua_State *L, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Concatenates the <code>n</code> values at the top of the stack,[m
[31m-pops them, and leaves the result at the top.[m
[31m-If <code>n</code>&nbsp;is&nbsp;1, the result is the single value on the stack[m
[31m-(that is, the function does nothing);[m
[31m-if <code>n</code> is 0, the result is the empty string.[m
[31m-Concatenation is performed following the usual semantics of Lua[m
[31m-(see <a href="#2.5.4">&sect;2.5.4</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_cpcall"><code>lua_cpcall</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>-</em>]</span>[m
[31m-<pre>int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Calls the C&nbsp;function <code>func</code> in protected mode.[m
[31m-<code>func</code> starts with only one element in its stack,[m
[31m-a light userdata containing <code>ud</code>.[m
[31m-In case of errors,[m
[31m-<a href="#lua_cpcall"><code>lua_cpcall</code></a> returns the same error codes as <a href="#lua_pcall"><code>lua_pcall</code></a>,[m
[31m-plus the error object on the top of the stack;[m
[31m-otherwise, it returns zero, and does not change the stack.[m
[31m-All values returned by <code>func</code> are discarded.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_createtable"><code>lua_createtable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_createtable (lua_State *L, int narr, int nrec);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new empty table and pushes it onto the stack.[m
[31m-The new table has space pre-allocated[m
[31m-for <code>narr</code> array elements and <code>nrec</code> non-array elements.[m
[31m-This pre-allocation is useful when you know exactly how many elements[m
[31m-the table will have.[m
[31m-Otherwise you can use the function <a href="#lua_newtable"><code>lua_newtable</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_dump"><code>lua_dump</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>int lua_dump (lua_State *L, lua_Writer writer, void *data);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Dumps a function as a binary chunk.[m
[31m-Receives a Lua function on the top of the stack[m
[31m-and produces a binary chunk that,[m
[31m-if loaded again,[m
[31m-results in a function equivalent to the one dumped.[m
[31m-As it produces parts of the chunk,[m
[31m-<a href="#lua_dump"><code>lua_dump</code></a> calls function <code>writer</code> (see <a href="#lua_Writer"><code>lua_Writer</code></a>)[m
[31m-with the given <code>data</code>[m
[31m-to write them.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The value returned is the error code returned by the last[m
[31m-call to the writer;[m
[31m-0&nbsp;means no errors.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function does not pop the Lua function from the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_equal"><code>lua_equal</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>e</em>]</span>[m
[31m-<pre>int lua_equal (lua_State *L, int index1, int index2);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the two values in acceptable indices <code>index1</code> and[m
[31m-<code>index2</code> are equal,[m
[31m-following the semantics of the Lua <code>==</code> operator[m
[31m-(that is, may call metamethods).[m
[31m-Otherwise returns&nbsp;0.[m
[31m-Also returns&nbsp;0 if any of the indices is non valid.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_error"><code>lua_error</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>v</em>]</span>[m
[31m-<pre>int lua_error (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Generates a Lua error.[m
[31m-The error message (which can actually be a Lua value of any type)[m
[31m-must be on the stack top.[m
[31m-This function does a long jump,[m
[31m-and therefore never returns.[m
[31m-(see <a href="#luaL_error"><code>luaL_error</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gc"><code>lua_gc</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>e</em>]</span>[m
[31m-<pre>int lua_gc (lua_State *L, int what, int data);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Controls the garbage collector.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function performs several tasks,[m
[31m-according to the value of the parameter <code>what</code>:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b><code>LUA_GCSTOP</code>:</b>[m
[31m-stops the garbage collector.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCRESTART</code>:</b>[m
[31m-restarts the garbage collector.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCCOLLECT</code>:</b>[m
[31m-performs a full garbage-collection cycle.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCCOUNT</code>:</b>[m
[31m-returns the current amount of memory (in Kbytes) in use by Lua.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCCOUNTB</code>:</b>[m
[31m-returns the remainder of dividing the current amount of bytes of[m
[31m-memory in use by Lua by 1024.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCSTEP</code>:</b>[m
[31m-performs an incremental step of garbage collection.[m
[31m-The step "size" is controlled by <code>data</code>[m
[31m-(larger values mean more steps) in a non-specified way.[m
[31m-If you want to control the step size[m
[31m-you must experimentally tune the value of <code>data</code>.[m
[31m-The function returns 1 if the step finished a[m
[31m-garbage-collection cycle.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCSETPAUSE</code>:</b>[m
[31m-sets <code>data</code> as the new value[m
[31m-for the <em>pause</em> of the collector (see <a href="#2.10">&sect;2.10</a>).[m
[31m-The function returns the previous value of the pause.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCSETSTEPMUL</code>:</b>[m
[31m-sets <code>data</code> as the new value for the <em>step multiplier</em> of[m
[31m-the collector (see <a href="#2.10">&sect;2.10</a>).[m
[31m-The function returns the previous value of the step multiplier.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getallocf"><code>lua_getallocf</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_Alloc lua_getallocf (lua_State *L, void **ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the memory-allocation function of a given state.[m
[31m-If <code>ud</code> is not <code>NULL</code>, Lua stores in <code>*ud</code> the[m
[31m-opaque pointer passed to <a href="#lua_newstate"><code>lua_newstate</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getfenv"><code>lua_getfenv</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_getfenv (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the environment table of[m
[31m-the value at the given index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getfield"><code>lua_getfield</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>e</em>]</span>[m
[31m-<pre>void lua_getfield (lua_State *L, int index, const char *k);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the value <code>t[k]</code>,[m
[31m-where <code>t</code> is the value at the given valid index.[m
[31m-As in Lua, this function may trigger a metamethod[m
[31m-for the "index" event (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getglobal"><code>lua_getglobal</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>e</em>]</span>[m
[31m-<pre>void lua_getglobal (lua_State *L, const char *name);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the value of the global <code>name</code>.[m
[31m-It is defined as a macro:[m
[31m-[m
[31m-<pre>[m
[31m-     #define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, s)[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getmetatable"><code>lua_getmetatable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>-</em>]</span>[m
[31m-<pre>int lua_getmetatable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the metatable of the value at the given[m
[31m-acceptable index.[m
[31m-If the index is not valid,[m
[31m-or if the value does not have a metatable,[m
[31m-the function returns&nbsp;0 and pushes nothing on the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gettable"><code>lua_gettable</code></a></h3><p>[m
[31m-<span class="apii">[-1, +1, <em>e</em>]</span>[m
[31m-<pre>void lua_gettable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the value <code>t[k]</code>,[m
[31m-where <code>t</code> is the value at the given valid index[m
[31m-and <code>k</code> is the value at the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops the key from the stack[m
[31m-(putting the resulting value in its place).[m
[31m-As in Lua, this function may trigger a metamethod[m
[31m-for the "index" event (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gettop"><code>lua_gettop</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_gettop (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the index of the top element in the stack.[m
[31m-Because indices start at&nbsp;1,[m
[31m-this result is equal to the number of elements in the stack[m
[31m-(and so 0&nbsp;means an empty stack).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_insert"><code>lua_insert</code></a></h3><p>[m
[31m-<span class="apii">[-1, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_insert (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Moves the top element into the given valid index,[m
[31m-shifting up the elements above this index to open space.[m
[31m-Cannot be called with a pseudo-index,[m
[31m-because a pseudo-index is not an actual stack position.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Integer"><code>lua_Integer</code></a></h3>[m
[31m-<pre>typedef ptrdiff_t lua_Integer;</pre>[m
[31m-[m
[31m-<p>[m
[31m-The type used by the Lua API to represent integral values.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-By default it is a <code>ptrdiff_t</code>,[m
[31m-which is usually the largest signed integral type the machine handles[m
[31m-"comfortably".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isboolean"><code>lua_isboolean</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isboolean (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index has type boolean,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_iscfunction"><code>lua_iscfunction</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_iscfunction (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a C&nbsp;function,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isfunction"><code>lua_isfunction</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isfunction (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a function[m
[31m-(either C or Lua), and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_islightuserdata"><code>lua_islightuserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_islightuserdata (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a light userdata,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isnil"><code>lua_isnil</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isnil (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is <b>nil</b>,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isnone"><code>lua_isnone</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isnone (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the given acceptable index is not valid[m
[31m-(that is, it refers to an element outside the current stack),[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isnoneornil"><code>lua_isnoneornil</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isnoneornil (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the given acceptable index is not valid[m
[31m-(that is, it refers to an element outside the current stack)[m
[31m-or if the value at this index is <b>nil</b>,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isnumber"><code>lua_isnumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isnumber (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a number[m
[31m-or a string convertible to a number,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isstring"><code>lua_isstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isstring (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a string[m
[31m-or a number (which is always convertible to a string),[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_istable"><code>lua_istable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_istable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a table,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isthread"><code>lua_isthread</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isthread (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a thread,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isuserdata"><code>lua_isuserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isuserdata (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a userdata[m
[31m-(either full or light), and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_lessthan"><code>lua_lessthan</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>e</em>]</span>[m
[31m-<pre>int lua_lessthan (lua_State *L, int index1, int index2);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at acceptable index <code>index1</code> is smaller[m
[31m-than the value at acceptable index <code>index2</code>,[m
[31m-following the semantics of the Lua <code>&lt;</code> operator[m
[31m-(that is, may call metamethods).[m
[31m-Otherwise returns&nbsp;0.[m
[31m-Also returns&nbsp;0 if any of the indices is non valid.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_load"><code>lua_load</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>int lua_load (lua_State *L,[m
[31m-              lua_Reader reader,[m
[31m-              void *data,[m
[31m-              const char *chunkname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads a Lua chunk.[m
[31m-If there are no errors,[m
[31m-<a href="#lua_load"><code>lua_load</code></a> pushes the compiled chunk as a Lua[m
[31m-function on top of the stack.[m
[31m-Otherwise, it pushes an error message.[m
[31m-The return values of <a href="#lua_load"><code>lua_load</code></a> are:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>0:</b> no errors;</li>[m
[31m-[m
[31m-<li><b><a name="pdf-LUA_ERRSYNTAX"><code>LUA_ERRSYNTAX</code></a>:</b>[m
[31m-syntax error during pre-compilation;</li>[m
[31m-[m
[31m-<li><b><a href="#pdf-LUA_ERRMEM"><code>LUA_ERRMEM</code></a>:</b>[m
[31m-memory allocation error.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-This function only loads a chunk;[m
[31m-it does not run it.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<a href="#lua_load"><code>lua_load</code></a> automatically detects whether the chunk is text or binary,[m
[31m-and loads it accordingly (see program <code>luac</code>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <a href="#lua_load"><code>lua_load</code></a> function uses a user-supplied <code>reader</code> function[m
[31m-to read the chunk (see <a href="#lua_Reader"><code>lua_Reader</code></a>).[m
[31m-The <code>data</code> argument is an opaque value passed to the reader function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <code>chunkname</code> argument gives a name to the chunk,[m
[31m-which is used for error messages and in debug information (see <a href="#3.8">&sect;3.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_newstate"><code>lua_newstate</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_State *lua_newstate (lua_Alloc f, void *ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new, independent state.[m
[31m-Returns <code>NULL</code> if cannot create the state[m
[31m-(due to lack of memory).[m
[31m-The argument <code>f</code> is the allocator function;[m
[31m-Lua does all memory allocation for this state through this function.[m
[31m-The second argument, <code>ud</code>, is an opaque pointer that Lua[m
[31m-simply passes to the allocator in every call.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_newtable"><code>lua_newtable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_newtable (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new empty table and pushes it onto the stack.[m
[31m-It is equivalent to <code>lua_createtable(L, 0, 0)</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_newthread"><code>lua_newthread</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>lua_State *lua_newthread (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new thread, pushes it on the stack,[m
[31m-and returns a pointer to a <a href="#lua_State"><code>lua_State</code></a> that represents this new thread.[m
[31m-The new state returned by this function shares with the original state[m
[31m-all global objects (such as tables),[m
[31m-but has an independent execution stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-There is no explicit function to close or to destroy a thread.[m
[31m-Threads are subject to garbage collection,[m
[31m-like any Lua object.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_newuserdata"><code>lua_newuserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void *lua_newuserdata (lua_State *L, size_t size);</pre>[m
[31m-[m
[31m-<p>[m
[31m-This function allocates a new block of memory with the given size,[m
[31m-pushes onto the stack a new full userdata with the block address,[m
[31m-and returns this address.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Userdata represent C&nbsp;values in Lua.[m
[31m-A <em>full userdata</em> represents a block of memory.[m
[31m-It is an object (like a table):[m
[31m-you must create it, it can have its own metatable,[m
[31m-and you can detect when it is being collected.[m
[31m-A full userdata is only equal to itself (under raw equality).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When Lua collects a full userdata with a <code>gc</code> metamethod,[m
[31m-Lua calls the metamethod and marks the userdata as finalized.[m
[31m-When this userdata is collected again then[m
[31m-Lua frees its corresponding memory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_next"><code>lua_next</code></a></h3><p>[m
[31m-<span class="apii">[-1, +(2|0), <em>e</em>]</span>[m
[31m-<pre>int lua_next (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops a key from the stack,[m
[31m-and pushes a key-value pair from the table at the given index[m
[31m-(the "next" pair after the given key).[m
[31m-If there are no more elements in the table,[m
[31m-then <a href="#lua_next"><code>lua_next</code></a> returns 0 (and pushes nothing).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A typical traversal looks like this:[m
[31m-[m
[31m-<pre>[m
[31m-     /* table is in the stack at index 't' */[m
[31m-     lua_pushnil(L);  /* first key */[m
[31m-     while (lua_next(L, t) != 0) {[m
[31m-       /* uses 'key' (at index -2) and 'value' (at index -1) */[m
[31m-       printf("%s - %s\n",[m
[31m-              lua_typename(L, lua_type(L, -2)),[m
[31m-              lua_typename(L, lua_type(L, -1)));[m
[31m-       /* removes 'value'; keeps 'key' for next iteration */[m
[31m-       lua_pop(L, 1);[m
[31m-     }[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-While traversing a table,[m
[31m-do not call <a href="#lua_tolstring"><code>lua_tolstring</code></a> directly on a key,[m
[31m-unless you know that the key is actually a string.[m
[31m-Recall that <a href="#lua_tolstring"><code>lua_tolstring</code></a> <em>changes</em>[m
[31m-the value at the given index;[m
[31m-this confuses the next call to <a href="#lua_next"><code>lua_next</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Number"><code>lua_Number</code></a></h3>[m
[31m-<pre>typedef double lua_Number;</pre>[m
[31m-[m
[31m-<p>[m
[31m-The type of numbers in Lua.[m
[31m-By default, it is double, but that can be changed in <code>luaconf.h</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Through the configuration file you can change[m
[31m-Lua to operate with another type for numbers (e.g., float or long).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_objlen"><code>lua_objlen</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>size_t lua_objlen (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the "length" of the value at the given acceptable index:[m
[31m-for strings, this is the string length;[m
[31m-for tables, this is the result of the length operator ('<code>#</code>');[m
[31m-for userdata, this is the size of the block of memory allocated[m
[31m-for the userdata;[m
[31m-for other values, it is&nbsp;0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pcall"><code>lua_pcall</code></a></h3><p>[m
[31m-<span class="apii">[-(nargs + 1), +(nresults|1), <em>-</em>]</span>[m
[31m-<pre>int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Calls a function in protected mode.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Both <code>nargs</code> and <code>nresults</code> have the same meaning as[m
[31m-in <a href="#lua_call"><code>lua_call</code></a>.[m
[31m-If there are no errors during the call,[m
[31m-<a href="#lua_pcall"><code>lua_pcall</code></a> behaves exactly like <a href="#lua_call"><code>lua_call</code></a>.[m
[31m-However, if there is any error,[m
[31m-<a href="#lua_pcall"><code>lua_pcall</code></a> catches it,[m
[31m-pushes a single value on the stack (the error message),[m
[31m-and returns an error code.[m
[31m-Like <a href="#lua_call"><code>lua_call</code></a>,[m
[31m-<a href="#lua_pcall"><code>lua_pcall</code></a> always removes the function[m
[31m-and its arguments from the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>errfunc</code> is 0,[m
[31m-then the error message returned on the stack[m
[31m-is exactly the original error message.[m
[31m-Otherwise, <code>errfunc</code> is the stack index of an[m
[31m-<em>error handler function</em>.[m
[31m-(In the current implementation, this index cannot be a pseudo-index.)[m
[31m-In case of runtime errors,[m
[31m-this function will be called with the error message[m
[31m-and its return value will be the message returned on the stack by <a href="#lua_pcall"><code>lua_pcall</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Typically, the error handler function is used to add more debug[m
[31m-information to the error message, such as a stack traceback.[m
[31m-Such information cannot be gathered after the return of <a href="#lua_pcall"><code>lua_pcall</code></a>,[m
[31m-since by then the stack has unwound.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <a href="#lua_pcall"><code>lua_pcall</code></a> function returns 0 in case of success[m
[31m-or one of the following error codes[m
[31m-(defined in <code>lua.h</code>):[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b><a name="pdf-LUA_ERRRUN"><code>LUA_ERRRUN</code></a>:</b>[m
[31m-a runtime error.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><a name="pdf-LUA_ERRMEM"><code>LUA_ERRMEM</code></a>:</b>[m
[31m-memory allocation error.[m
[31m-For such errors, Lua does not call the error handler function.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><a name="pdf-LUA_ERRERR"><code>LUA_ERRERR</code></a>:</b>[m
[31m-error while running the error handler function.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pop"><code>lua_pop</code></a></h3><p>[m
[31m-<span class="apii">[-n, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_pop (lua_State *L, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops <code>n</code> elements from the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushboolean"><code>lua_pushboolean</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushboolean (lua_State *L, int b);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a boolean value with value <code>b</code> onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushcclosure"><code>lua_pushcclosure</code></a></h3><p>[m
[31m-<span class="apii">[-n, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a new C&nbsp;closure onto the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When a C&nbsp;function is created,[m
[31m-it is possible to associate some values with it,[m
[31m-thus creating a C&nbsp;closure (see <a href="#3.4">&sect;3.4</a>);[m
[31m-these values are then accessible to the function whenever it is called.[m
[31m-To associate values with a C&nbsp;function,[m
[31m-first these values should be pushed onto the stack[m
[31m-(when there are multiple values, the first value is pushed first).[m
[31m-Then <a href="#lua_pushcclosure"><code>lua_pushcclosure</code></a>[m
[31m-is called to create and push the C&nbsp;function onto the stack,[m
[31m-with the argument <code>n</code> telling how many values should be[m
[31m-associated with the function.[m
[31m-<a href="#lua_pushcclosure"><code>lua_pushcclosure</code></a> also pops these values from the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The maximum value for <code>n</code> is 255.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushcfunction"><code>lua_pushcfunction</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushcfunction (lua_State *L, lua_CFunction f);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a C&nbsp;function onto the stack.[m
[31m-This function receives a pointer to a C function[m
[31m-and pushes onto the stack a Lua value of type <code>function</code> that,[m
[31m-when called, invokes the corresponding C&nbsp;function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Any function to be registered in Lua must[m
[31m-follow the correct protocol to receive its parameters[m
[31m-and return its results (see <a href="#lua_CFunction"><code>lua_CFunction</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<code>lua_pushcfunction</code> is defined as a macro:[m
[31m-[m
[31m-<pre>[m
[31m-     #define lua_pushcfunction(L,f)  lua_pushcclosure(L,f,0)[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushfstring"><code>lua_pushfstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>const char *lua_pushfstring (lua_State *L, const char *fmt, ...);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack a formatted string[m
[31m-and returns a pointer to this string.[m
[31m-It is similar to the C&nbsp;function <code>sprintf</code>,[m
[31m-but has some important differences:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-You do not have to allocate space for the result:[m
[31m-the result is a Lua string and Lua takes care of memory allocation[m
[31m-(and deallocation, through garbage collection).[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-The conversion specifiers are quite restricted.[m
[31m-There are no flags, widths, or precisions.[m
[31m-The conversion specifiers can only be[m
[31m-'<code>%%</code>' (inserts a '<code>%</code>' in the string),[m
[31m-'<code>%s</code>' (inserts a zero-terminated string, with no size restrictions),[m
[31m-'<code>%f</code>' (inserts a <a href="#lua_Number"><code>lua_Number</code></a>),[m
[31m-'<code>%p</code>' (inserts a pointer as a hexadecimal numeral),[m
[31m-'<code>%d</code>' (inserts an <code>int</code>), and[m
[31m-'<code>%c</code>' (inserts an <code>int</code> as a character).[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushinteger"><code>lua_pushinteger</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushinteger (lua_State *L, lua_Integer n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a number with value <code>n</code> onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushlightuserdata"><code>lua_pushlightuserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushlightuserdata (lua_State *L, void *p);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a light userdata onto the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Userdata represent C&nbsp;values in Lua.[m
[31m-A <em>light userdata</em> represents a pointer.[m
[31m-It is a value (like a number):[m
[31m-you do not create it, it has no individual metatable,[m
[31m-and it is not collected (as it was never created).[m
[31m-A light userdata is equal to "any"[m
[31m-light userdata with the same C&nbsp;address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushliteral"><code>lua_pushliteral</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushliteral (lua_State *L, const char *s);</pre>[m
[31m-[m
[31m-<p>[m
[31m-This macro is equivalent to <a href="#lua_pushlstring"><code>lua_pushlstring</code></a>,[m
[31m-but can be used only when <code>s</code> is a literal string.[m
[31m-In these cases, it automatically provides the string length.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushlstring"><code>lua_pushlstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushlstring (lua_State *L, const char *s, size_t len);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes the string pointed to by <code>s</code> with size <code>len</code>[m
[31m-onto the stack.[m
[31m-Lua makes (or reuses) an internal copy of the given string,[m
[31m-so the memory at <code>s</code> can be freed or reused immediately after[m
[31m-the function returns.[m
[31m-The string can contain embedded zeros.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushnil"><code>lua_pushnil</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushnil (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a nil value onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushnumber"><code>lua_pushnumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushnumber (lua_State *L, lua_Number n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a number with value <code>n</code> onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushstring"><code>lua_pushstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushstring (lua_State *L, const char *s);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes the zero-terminated string pointed to by <code>s</code>[m
[31m-onto the stack.[m
[31m-Lua makes (or reuses) an internal copy of the given string,[m
[31m-so the memory at <code>s</code> can be freed or reused immediately after[m
[31m-the function returns.[m
[31m-The string cannot contain embedded zeros;[m
[31m-it is assumed to end at the first zero.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushthread"><code>lua_pushthread</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>int lua_pushthread (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes the thread represented by <code>L</code> onto the stack.[m
[31m-Returns 1 if this thread is the main thread of its state.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushvalue"><code>lua_pushvalue</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushvalue (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a copy of the element at the given valid index[m
[31m-onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushvfstring"><code>lua_pushvfstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>const char *lua_pushvfstring (lua_State *L,[m
[31m-                              const char *fmt,[m
[31m-                              va_list argp);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <a href="#lua_pushfstring"><code>lua_pushfstring</code></a>, except that it receives a <code>va_list</code>[m
[31m-instead of a variable number of arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawequal"><code>lua_rawequal</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_rawequal (lua_State *L, int index1, int index2);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the two values in acceptable indices <code>index1</code> and[m
[31m-<code>index2</code> are primitively equal[m
[31m-(that is, without calling metamethods).[m
[31m-Otherwise returns&nbsp;0.[m
[31m-Also returns&nbsp;0 if any of the indices are non valid.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawget"><code>lua_rawget</code></a></h3><p>[m
[31m-<span class="apii">[-1, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_rawget (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#lua_gettable"><code>lua_gettable</code></a>, but does a raw access[m
[31m-(i.e., without metamethods).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawgeti"><code>lua_rawgeti</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_rawgeti (lua_State *L, int index, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the value <code>t[n]</code>,[m
[31m-where <code>t</code> is the value at the given valid index.[m
[31m-The access is raw;[m
[31m-that is, it does not invoke metamethods.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawset"><code>lua_rawset</code></a></h3><p>[m
[31m-<span class="apii">[-2, +0, <em>m</em>]</span>[m
[31m-<pre>void lua_rawset (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#lua_settable"><code>lua_settable</code></a>, but does a raw assignment[m
[31m-(i.e., without metamethods).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawseti"><code>lua_rawseti</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>m</em>]</span>[m
[31m-<pre>void lua_rawseti (lua_State *L, int index, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Does the equivalent of <code>t[n] = v</code>,[m
[31m-where <code>t</code> is the value at the given valid index[m
[31m-and <code>v</code> is the value at the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops the value from the stack.[m
[31m-The assignment is raw;[m
[31m-that is, it does not invoke metamethods.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Reader"><code>lua_Reader</code></a></h3>[m
[31m-<pre>typedef const char * (*lua_Reader) (lua_State *L,[m
[31m-                                    void *data,[m
[31m-                                    size_t *size);</pre>[m
[31m-[m
[31m-<p>[m
[31m-The reader function used by <a href="#lua_load"><code>lua_load</code></a>.[m
[31m-Every time it needs another piece of the chunk,[m
[31m-<a href="#lua_load"><code>lua_load</code></a> calls the reader,[m
[31m-passing along its <code>data</code> parameter.[m
[31m-The reader must return a pointer to a block of memory[m
[31m-with a new piece of the chunk[m
[31m-and set <code>size</code> to the block size.[m
[31m-The block must exist until the reader function is called again.[m
[31m-To signal the end of the chunk,[m
[31m-the reader must return <code>NULL</code> or set <code>size</code> to zero.[m
[31m-The reader function may return pieces of any size greater than zero.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_register"><code>lua_register</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>e</em>]</span>[m
[31m-<pre>void lua_register (lua_State *L,[m
[31m-                   const char *name,[m
[31m-                   lua_CFunction f);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets the C function <code>f</code> as the new value of global <code>name</code>.[m
[31m-It is defined as a macro:[m
[31m-[m
[31m-<pre>[m
[31m-     #define lua_register(L,n,f) \[m
[31m-            (lua_pushcfunction(L, f), lua_setglobal(L, n))[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_remove"><code>lua_remove</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_remove (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Removes the element at the given valid index,[m
[31m-shifting down the elements above this index to fill the gap.[m
[31m-Cannot be called with a pseudo-index,[m
[31m-because a pseudo-index is not an actual stack position.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_replace"><code>lua_replace</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_replace (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Moves the top element into the given position (and pops it),[m
[31m-without shifting any element[m
[31m-(therefore replacing the value at the given position).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_resume"><code>lua_resume</code></a></h3><p>[m
[31m-<span class="apii">[-?, +?, <em>-</em>]</span>[m
[31m-<pre>int lua_resume (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Starts and resumes a coroutine in a given thread.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To start a coroutine, you first create a new thread[m
[31m-(see <a href="#lua_newthread"><code>lua_newthread</code></a>);[m
[31m-then you push onto its stack the main function plus any arguments;[m
[31m-then you call <a href="#lua_resume"><code>lua_resume</code></a>,[m
[31m-with <code>narg</code> being the number of arguments.[m
[31m-This call returns when the coroutine suspends or finishes its execution.[m
[31m-When it returns, the stack contains all values passed to <a href="#lua_yield"><code>lua_yield</code></a>,[m
[31m-or all values returned by the body function.[m
[31m-<a href="#lua_resume"><code>lua_resume</code></a> returns[m
[31m-<a href="#pdf-LUA_YIELD"><code>LUA_YIELD</code></a> if the coroutine yields,[m
[31m-0 if the coroutine finishes its execution[m
[31m-without errors,[m
[31m-or an error code in case of errors (see <a href="#lua_pcall"><code>lua_pcall</code></a>).[m
[31m-In case of errors,[m
[31m-the stack is not unwound,[m
[31m-so you can use the debug API over it.[m
[31m-The error message is on the top of the stack.[m
[31m-To restart a coroutine, you put on its stack only the values to[m
[31m-be passed as results from <code>yield</code>,[m
[31m-and then call <a href="#lua_resume"><code>lua_resume</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setallocf"><code>lua_setallocf</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Changes the allocator function of a given state to <code>f</code>[m
[31m-with user data <code>ud</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setfenv"><code>lua_setfenv</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_setfenv (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops a table from the stack and sets it as[m
[31m-the new environment for the value at the given index.[m
[31m-If the value at the given index is[m
[31m-neither a function nor a thread nor a userdata,[m
[31m-<a href="#lua_setfenv"><code>lua_setfenv</code></a> returns 0.[m
[31m-Otherwise it returns 1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setfield"><code>lua_setfield</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>e</em>]</span>[m
[31m-<pre>void lua_setfield (lua_State *L, int index, const char *k);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Does the equivalent to <code>t[k] = v</code>,[m
[31m-where <code>t</code> is the value at the given valid index[m
[31m-and <code>v</code> is the value at the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops the value from the stack.[m
[31m-As in Lua, this function may trigger a metamethod[m
[31m-for the "newindex" event (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setglobal"><code>lua_setglobal</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>e</em>]</span>[m
[31m-<pre>void lua_setglobal (lua_State *L, const char *name);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops a value from the stack and[m
[31m-sets it as the new value of global <code>name</code>.[m
[31m-It is defined as a macro:[m
[31m-[m
[31m-<pre>[m
[31m-     #define lua_setglobal(L,s)   lua_setfield(L, LUA_GLOBALSINDEX, s)[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setmetatable"><code>lua_setmetatable</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_setmetatable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops a table from the stack and[m
[31m-sets it as the new metatable for the value at the given[m
[31m-acceptable index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_settable"><code>lua_settable</code></a></h3><p>[m
[31m-<span class="apii">[-2, +0, <em>e</em>]</span>[m
[31m-<pre>void lua_settable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Does the equivalent to <code>t[k] = v</code>,[m
[31m-where <code>t</code> is the value at the given valid index,[m
[31m-<code>v</code> is the value at the top of the stack,[m
[31m-and <code>k</code> is the value just below the top.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops both the key and the value from the stack.[m
[31m-As in Lua, this function may trigger a metamethod[m
[31m-for the "newindex" event (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_settop"><code>lua_settop</code></a></h3><p>[m
[31m-<span class="apii">[-?, +?, <em>-</em>]</span>[m
[31m-<pre>void lua_settop (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Accepts any acceptable index, or&nbsp;0,[m
[31m-and sets the stack top to this index.[m
[31m-If the new top is larger than the old one,[m
[31m-then the new elements are filled with <b>nil</b>.[m
[31m-If <code>index</code> is&nbsp;0, then all stack elements are removed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_State"><code>lua_State</code></a></h3>[m
[31m-<pre>typedef struct lua_State lua_State;</pre>[m
[31m-[m
[31m-<p>[m
[31m-Opaque structure that keeps the whole state of a Lua interpreter.[m
[31m-The Lua library is fully reentrant:[m
[31m-it has no global variables.[m
[31m-All information about a state is kept in this structure.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A pointer to this state must be passed as the first argument to[m
[31m-every function in the library, except to <a href="#lua_newstate"><code>lua_newstate</code></a>,[m
[31m-which creates a Lua state from scratch.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_status"><code>lua_status</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_status (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the status of the thread <code>L</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The status can be 0 for a normal thread,[m
[31m-an error code if the thread finished its execution with an error,[m
[31m-or <a name="pdf-LUA_YIELD"><code>LUA_YIELD</code></a> if the thread is suspended.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_toboolean"><code>lua_toboolean</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_toboolean (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the Lua value at the given acceptable index to a C&nbsp;boolean[m
[31m-value (0&nbsp;or&nbsp;1).[m
[31m-Like all tests in Lua,[m
[31m-<a href="#lua_toboolean"><code>lua_toboolean</code></a> returns 1 for any Lua value[m
[31m-different from <b>false</b> and <b>nil</b>;[m
[31m-otherwise it returns 0.[m
[31m-It also returns 0 when called with a non-valid index.[m
[31m-(If you want to accept only actual boolean values,[m
[31m-use <a href="#lua_isboolean"><code>lua_isboolean</code></a> to test the value's type.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tocfunction"><code>lua_tocfunction</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_CFunction lua_tocfunction (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts a value at the given acceptable index to a C&nbsp;function.[m
[31m-That value must be a C&nbsp;function;[m
[31m-otherwise, returns <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tointeger"><code>lua_tointeger</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_Integer lua_tointeger (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the Lua value at the given acceptable index[m
[31m-to the signed integral type <a href="#lua_Integer"><code>lua_Integer</code></a>.[m
[31m-The Lua value must be a number or a string convertible to a number[m
[31m-(see <a href="#2.2.1">&sect;2.2.1</a>);[m
[31m-otherwise, <a href="#lua_tointeger"><code>lua_tointeger</code></a> returns&nbsp;0.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the number is not an integer,[m
[31m-it is truncated in some non-specified way.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tolstring"><code>lua_tolstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>const char *lua_tolstring (lua_State *L, int index, size_t *len);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the Lua value at the given acceptable index to a C&nbsp;string.[m
[31m-If <code>len</code> is not <code>NULL</code>,[m
[31m-it also sets <code>*len</code> with the string length.[m
[31m-The Lua value must be a string or a number;[m
[31m-otherwise, the function returns <code>NULL</code>.[m
[31m-If the value is a number,[m
[31m-then <a href="#lua_tolstring"><code>lua_tolstring</code></a> also[m
[31m-<em>changes the actual value in the stack to a string</em>.[m
[31m-(This change confuses <a href="#lua_next"><code>lua_next</code></a>[m
[31m-when <a href="#lua_tolstring"><code>lua_tolstring</code></a> is applied to keys during a table traversal.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<a href="#lua_tolstring"><code>lua_tolstring</code></a> returns a fully aligned pointer[m
[31m-to a string inside the Lua state.[m
[31m-This string always has a zero ('<code>\0</code>')[m
[31m-after its last character (as in&nbsp;C),[m
[31m-but can contain other zeros in its body.[m
[31m-Because Lua has garbage collection,[m
[31m-there is no guarantee that the pointer returned by <a href="#lua_tolstring"><code>lua_tolstring</code></a>[m
[31m-will be valid after the corresponding value is removed from the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tonumber"><code>lua_tonumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_Number lua_tonumber (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the Lua value at the given acceptable index[m
[31m-to the C&nbsp;type <a href="#lua_Number"><code>lua_Number</code></a> (see <a href="#lua_Number"><code>lua_Number</code></a>).[m
[31m-The Lua value must be a number or a string convertible to a number[m
[31m-(see <a href="#2.2.1">&sect;2.2.1</a>);[m
[31m-otherwise, <a href="#lua_tonumber"><code>lua_tonumber</code></a> returns&nbsp;0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_topointer"><code>lua_topointer</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>const void *lua_topointer (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the value at the given acceptable index to a generic[m
[31m-C&nbsp;pointer (<code>void*</code>).[m
[31m-The value can be a userdata, a table, a thread, or a function;[m
[31m-otherwise, <a href="#lua_topointer"><code>lua_topointer</code></a> returns <code>NULL</code>.[m
[31m-Different objects will give different pointers.[m
[31m-There is no way to convert the pointer back to its original value.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Typically this function is used only for debug information.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tostring"><code>lua_tostring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>const char *lua_tostring (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <a href="#lua_tolstring"><code>lua_tolstring</code></a> with <code>len</code> equal to <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tothread"><code>lua_tothread</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_State *lua_tothread (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the value at the given acceptable index to a Lua thread[m
[31m-(represented as <code>lua_State*</code>).[m
[31m-This value must be a thread;[m
[31m-otherwise, the function returns <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_touserdata"><code>lua_touserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void *lua_touserdata (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the value at the given acceptable index is a full userdata,[m
[31m-returns its block address.[m
[31m-If the value is a light userdata,[m
[31m-returns its pointer.[m
[31m-Otherwise, returns <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_type"><code>lua_type</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_type (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the type of the value in the given acceptable index,[m
[31m-or <code>LUA_TNONE</code> for a non-valid index[m
[31m-(that is, an index to an "empty" stack position).[m
[31m-The types returned by <a href="#lua_type"><code>lua_type</code></a> are coded by the following constants[m
[31m-defined in <code>lua.h</code>:[m
[31m-<code>LUA_TNIL</code>,[m
[31m-<code>LUA_TNUMBER</code>,[m
[31m-<code>LUA_TBOOLEAN</code>,[m
[31m-<code>LUA_TSTRING</code>,[m
[31m-<code>LUA_TTABLE</code>,[m
[31m-<code>LUA_TFUNCTION</code>,[m
[31m-<code>LUA_TUSERDATA</code>,[m
[31m-<code>LUA_TTHREAD</code>,[m
[31m-and[m
[31m-<code>LUA_TLIGHTUSERDATA</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_typename"><code>lua_typename</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>const char *lua_typename  (lua_State *L, int tp);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the name of the type encoded by the value <code>tp</code>,[m
[31m-which must be one the values returned by <a href="#lua_type"><code>lua_type</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Writer"><code>lua_Writer</code></a></h3>[m
[31m-<pre>typedef int (*lua_Writer) (lua_State *L,[m
[31m-                           const void* p,[m
[31m-                           size_t sz,[m
[31m-                           void* ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-The type of the writer function used by <a href="#lua_dump"><code>lua_dump</code></a>.[m
[31m-Every time it produces another piece of chunk,[m
[31m-<a href="#lua_dump"><code>lua_dump</code></a> calls the writer,[m
[31m-passing along the buffer to be written (<code>p</code>),[m
[31m-its size (<code>sz</code>),[m
[31m-and the <code>data</code> parameter supplied to <a href="#lua_dump"><code>lua_dump</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The writer returns an error code:[m
[31m-0&nbsp;means no errors;[m
[31m-any other value means an error and stops <a href="#lua_dump"><code>lua_dump</code></a> from[m
[31m-calling the writer again.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_xmove"><code>lua_xmove</code></a></h3><p>[m
[31m-<span class="apii">[-?, +?, <em>-</em>]</span>[m
[31m-<pre>void lua_xmove (lua_State *from, lua_State *to, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Exchange values between different threads of the <em>same</em> global state.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops <code>n</code> values from the stack <code>from</code>,[m
[31m-and pushes them onto the stack <code>to</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_yield"><code>lua_yield</code></a></h3><p>[m
[31m-<span class="apii">[-?, +?, <em>-</em>]</span>[m
[31m-<pre>int lua_yield  (lua_State *L, int nresults);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Yields a coroutine.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function should only be called as the[m
[31m-return expression of a C&nbsp;function, as follows:[m
[31m-[m
[31m-<pre>[m
[31m-     return lua_yield (L, nresults);[m
[31m-</pre><p>[m
[31m-When a C&nbsp;function calls <a href="#lua_yield"><code>lua_yield</code></a> in that way,[m
[31m-the running coroutine suspends its execution,[m
[31m-and the call to <a href="#lua_resume"><code>lua_resume</code></a> that started this coroutine returns.[m
[31m-The parameter <code>nresults</code> is the number of values from the stack[m
[31m-that are passed as results to <a href="#lua_resume"><code>lua_resume</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.8 - <a name="3.8">The Debug Interface</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua has no built-in debugging facilities.[m
[31m-Instead, it offers a special interface[m
[31m-by means of functions and <em>hooks</em>.[m
[31m-This interface allows the construction of different[m
[31m-kinds of debuggers, profilers, and other tools[m
[31m-that need "inside information" from the interpreter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Debug"><code>lua_Debug</code></a></h3>[m
[31m-<pre>typedef struct lua_Debug {[m
[31m-  int event;[m
[31m-  const char *name;           /* (n) */[m
[31m-  const char *namewhat;       /* (n) */[m
[31m-  const char *what;           /* (S) */[m
[31m-  const char *source;         /* (S) */[m
[31m-  int currentline;            /* (l) */[m
[31m-  int nups;                   /* (u) number of upvalues */[m
[31m-  int linedefined;            /* (S) */[m
[31m-  int lastlinedefined;        /* (S) */[m
[31m-  char short_src[LUA_IDSIZE]; /* (S) */[m
[31m-  /* private part */[m
[31m-  <em>other fields</em>[m
[31m-} lua_Debug;</pre>[m
[31m-[m
[31m-<p>[m
[31m-A structure used to carry different pieces of[m
[31m-information about an active function.[m
[31m-<a href="#lua_getstack"><code>lua_getstack</code></a> fills only the private part[m
[31m-of this structure, for later use.[m
[31m-To fill the other fields of <a href="#lua_Debug"><code>lua_Debug</code></a> with useful information,[m
[31m-call <a href="#lua_getinfo"><code>lua_getinfo</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The fields of <a href="#lua_Debug"><code>lua_Debug</code></a> have the following meaning:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b><code>source</code>:</b>[m
[31m-If the function was defined in a string,[m
[31m-then <code>source</code> is that string.[m
[31m-If the function was defined in a file,[m
[31m-then <code>source</code> starts with a '<code>@</code>' followed by the file name.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>short_src</code>:</b>[m
[31m-a "printable" version of <code>source</code>, to be used in error messages.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>linedefined</code>:</b>[m
[31m-the line number where the definition of the function starts.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>lastlinedefined</code>:</b>[m
[31m-the line number where the definition of the function ends.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>what</code>:</b>[m
[31m-the string <code>"Lua"</code> if the function is a Lua function,[m
[31m-<code>"C"</code> if it is a C&nbsp;function,[m
[31m-<code>"main"</code> if it is the main part of a chunk,[m
[31m-and <code>"tail"</code> if it was a function that did a tail call.[m
[31m-In the latter case,[m
[31m-Lua has no other information about the function.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>currentline</code>:</b>[m
[31m-the current line where the given function is executing.[m
[31m-When no line information is available,[m
[31m-<code>currentline</code> is set to -1.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>name</code>:</b>[m
[31m-a reasonable name for the given function.[m
[31m-Because functions in Lua are first-class values,[m
[31m-they do not have a fixed name:[m
[31m-some functions can be the value of multiple global variables,[m
[31m-while others can be stored only in a table field.[m
[31m-The <code>lua_getinfo</code> function checks how the function was[m
[31m-called to find a suitable name.[m
[31m-If it cannot find a name,[m
[31m-then <code>name</code> is set to <code>NULL</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>namewhat</code>:</b>[m
[31m-explains the <code>name</code> field.[m
[31m-The value of <code>namewhat</code> can be[m
[31m-<code>"global"</code>, <code>"local"</code>, <code>"method"</code>,[m
[31m-<code>"field"</code>, <code>"upvalue"</code>, or <code>""</code> (the empty string),[m
[31m-according to how the function was called.[m
[31m-(Lua uses the empty string when no other option seems to apply.)[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>nups</code>:</b>[m
[31m-the number of upvalues of the function.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gethook"><code>lua_gethook</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_Hook lua_gethook (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the current hook function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gethookcount"><code>lua_gethookcount</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_gethookcount (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the current hook count.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gethookmask"><code>lua_gethookmask</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_gethookmask (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the current hook mask.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getinfo"><code>lua_getinfo</code></a></h3><p>[m
[31m-<span class="apii">[-(0|1), +(0|1|2), <em>m</em>]</span>[m
[31m-<pre>int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns information about a specific function or function invocation.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To get information about a function invocation,[m
[31m-the parameter <code>ar</code> must be a valid activation record that was[m
[31m-filled by a previous call to <a href="#lua_getstack"><code>lua_getstack</code></a> or[m
[31m-given as argument to a hook (see <a href="#lua_Hook"><code>lua_Hook</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To get information about a function you push it onto the stack[m
[31m-and start the <code>what</code> string with the character '<code>&gt;</code>'.[m
[31m-(In that case,[m
[31m-<code>lua_getinfo</code> pops the function in the top of the stack.)[m
[31m-For instance, to know in which line a function <code>f</code> was defined,[m
[31m-you can write the following code:[m
[31m-[m
[31m-<pre>[m
[31m-     lua_Debug ar;[m
[31m-     lua_getfield(L, LUA_GLOBALSINDEX, "f");  /* get global 'f' */[m
[31m-     lua_getinfo(L, "&gt;S", &amp;ar);[m
[31m-     printf("%d\n", ar.linedefined);[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Each character in the string <code>what</code>[m
[31m-selects some fields of the structure <code>ar</code> to be filled or[m
[31m-a value to be pushed on the stack:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>'<code>n</code>':</b> fills in the field <code>name</code> and <code>namewhat</code>;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>S</code>':</b>[m
[31m-fills in the fields <code>source</code>, <code>short_src</code>,[m
[31m-<code>linedefined</code>, <code>lastlinedefined</code>, and <code>what</code>;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>l</code>':</b> fills in the field <code>currentline</code>;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>u</code>':</b> fills in the field <code>nups</code>;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>f</code>':</b>[m
[31m-pushes onto the stack the function that is[m
[31m-running at the given level;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>L</code>':</b>[m
[31m-pushes onto the stack a table whose indices are the[m
[31m-numbers of the lines that are valid on the function.[m
[31m-(A <em>valid line</em> is a line with some associated code,[m
[31m-that is, a line where you can put a break point.[m
[31m-Non-valid lines include empty lines and comments.)[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-This function returns 0 on error[m
[31m-(for instance, an invalid option in <code>what</code>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getlocal"><code>lua_getlocal</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>-</em>]</span>[m
[31m-<pre>const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Gets information about a local variable of a given activation record.[m
[31m-The parameter <code>ar</code> must be a valid activation record that was[m
[31m-filled by a previous call to <a href="#lua_getstack"><code>lua_getstack</code></a> or[m
[31m-given as argument to a hook (see <a href="#lua_Hook"><code>lua_Hook</code></a>).[m
[31m-The index <code>n</code> selects which local variable to inspect[m
[31m-(1 is the first parameter or active local variable, and so on,[m
[31m-until the last active local variable).[m
[31m-<a href="#lua_getlocal"><code>lua_getlocal</code></a> pushes the variable's value onto the stack[m
[31m-and returns its name.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Variable names starting with '<code>(</code>' (open parentheses)[m
[31m-represent internal variables[m
[31m-(loop control variables, temporaries, and C&nbsp;function locals).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>NULL</code> (and pushes nothing)[m
[31m-when the index is greater than[m
[31m-the number of active local variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getstack"><code>lua_getstack</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_getstack (lua_State *L, int level, lua_Debug *ar);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Get information about the interpreter runtime stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function fills parts of a <a href="#lua_Debug"><code>lua_Debug</code></a> structure with[m
[31m-an identification of the <em>activation record</em>[m
[31m-of the function executing at a given level.[m
[31m-Level&nbsp;0 is the current running function,[m
[31m-whereas level <em>n+1</em> is the function that has called level <em>n</em>.[m
[31m-When there are no errors, <a href="#lua_getstack"><code>lua_getstack</code></a> returns 1;[m
[31m-when called with a level greater than the stack depth,[m
[31m-it returns 0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getupvalue"><code>lua_getupvalue</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>-</em>]</span>[m
[31m-<pre>const char *lua_getupvalue (lua_State *L, int funcindex, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Gets information about a closure's upvalue.[m
[31m-(For Lua functions,[m
[31m-upvalues are the external local variables that the function uses,[m
[31m-and that are consequently included in its closure.)[m
[31m-<a href="#lua_getupvalue"><code>lua_getupvalue</code></a> gets the index <code>n</code> of an upvalue,[m
[31m-pushes the upvalue's value onto the stack,[m
[31m-and returns its name.[m
[31m-<code>funcindex</code> points to the closure in the stack.[m
[31m-(Upvalues have no particular order,[m
[31m-as they are active through the whole function.[m
[31m-So, they are numbered in an arbitrary order.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>NULL</code> (and pushes nothing)[m
[31m-when the index is greater than the number of upvalues.[m
[31m-For C&nbsp;functions, this function uses the empty string <code>""</code>[m
[31m-as a name for all upvalues.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Hook"><code>lua_Hook</code></a></h3>[m
[31m-<pre>typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Type for debugging hook functions.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Whenever a hook is called, its <code>ar</code> argument has its field[m
[31m-<code>event</code> set to the specific event that triggered the hook.[m
[31m-Lua identifies these events with the following constants:[m
[31m-<a name="pdf-LUA_HOOKCALL"><code>LUA_HOOKCALL</code></a>, <a name="pdf-LUA_HOOKRET"><code>LUA_HOOKRET</code></a>,[m
[31m-<a name="pdf-LUA_HOOKTAILRET"><code>LUA_HOOKTAILRET</code></a>, <a name="pdf-LUA_HOOKLINE"><code>LUA_HOOKLINE</code></a>,[m
[31m-and <a name="pdf-LUA_HOOKCOUNT"><code>LUA_HOOKCOUNT</code></a>.[m
[31m-Moreover, for line events, the field <code>currentline</code> is also set.[m
[31m-To get the value of any other field in <code>ar</code>,[m
[31m-the hook must call <a href="#lua_getinfo"><code>lua_getinfo</code></a>.[m
[31m-For return events, <code>event</code> can be <code>LUA_HOOKRET</code>,[m
[31m-the normal value, or <code>LUA_HOOKTAILRET</code>.[m
[31m-In the latter case, Lua is simulating a return from[m
[31m-a function that did a tail call;[m
[31m-in this case, it is useless to call <a href="#lua_getinfo"><code>lua_getinfo</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-While Lua is running a hook, it disables other calls to hooks.[m
[31m-Therefore, if a hook calls back Lua to execute a function or a chunk,[m
[31m-this execution occurs without any calls to hooks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_sethook"><code>lua_sethook</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets the debugging hook function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Argument <code>f</code> is the hook function.[m
[31m-<code>mask</code> specifies on which events the hook will be called:[m
[31m-it is formed by a bitwise or of the constants[m
[31m-<a name="pdf-LUA_MASKCALL"><code>LUA_MASKCALL</code></a>,[m
[31m-<a name="pdf-LUA_MASKRET"><code>LUA_MASKRET</code></a>,[m
[31m-<a name="pdf-LUA_MASKLINE"><code>LUA_MASKLINE</code></a>,[m
[31m-and <a name="pdf-LUA_MASKCOUNT"><code>LUA_MASKCOUNT</code></a>.[m
[31m-The <code>count</code> argument is only meaningful when the mask[m
[31m-includes <code>LUA_MASKCOUNT</code>.[m
[31m-For each event, the hook is called as explained below:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>The call hook:</b> is called when the interpreter calls a function.[m
[31m-The hook is called just after Lua enters the new function,[m
[31m-before the function gets its arguments.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>The return hook:</b> is called when the interpreter returns from a function.[m
[31m-The hook is called just before Lua leaves the function.[m
[31m-You have no access to the values to be returned by the function.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>The line hook:</b> is called when the interpreter is about to[m
[31m-start the execution of a new line of code,[m
[31m-or when it jumps back in the code (even to the same line).[m
[31m-(This event only happens while Lua is executing a Lua function.)[m
[31m-</li>[m
[31m-[m
[31m-<li><b>The count hook:</b> is called after the interpreter executes every[m
[31m-<code>count</code> instructions.[m
[31m-(This event only happens while Lua is executing a Lua function.)[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-A hook is disabled by setting <code>mask</code> to zero.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setlocal"><code>lua_setlocal</code></a></h3><p>[m
[31m-<span class="apii">[-(0|1), +0, <em>-</em>]</span>[m
[31m-<pre>const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets the value of a local variable of a given activation record.[m
[31m-Parameters <code>ar</code> and <code>n</code> are as in <a href="#lua_getlocal"><code>lua_getlocal</code></a>[m
[31m-(see <a href="#lua_getlocal"><code>lua_getlocal</code></a>).[m
[31m-<a href="#lua_setlocal"><code>lua_setlocal</code></a> assigns the value at the top of the stack[m
[31m-to the variable and returns its name.[m
[31m-It also pops the value from the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>NULL</code> (and pops nothing)[m
[31m-when the index is greater than[m
[31m-the number of active local variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setupvalue"><code>lua_setupvalue</code></a></h3><p>[m
[31m-<span class="apii">[-(0|1), +0, <em>-</em>]</span>[m
[31m-<pre>const char *lua_setupvalue (lua_State *L, int funcindex, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets the value of a closure's upvalue.[m
[31m-It assigns the value at the top of the stack[m
[31m-to the upvalue and returns its name.[m
[31m-It also pops the value from the stack.[m
[31m-Parameters <code>funcindex</code> and <code>n</code> are as in the <a href="#lua_getupvalue"><code>lua_getupvalue</code></a>[m
[31m-(see <a href="#lua_getupvalue"><code>lua_getupvalue</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>NULL</code> (and pops nothing)[m
[31m-when the index is greater than the number of upvalues.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>4 - <a name="4">The Auxiliary Library</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-The <em>auxiliary library</em> provides several convenient functions[m
[31m-to interface C with Lua.[m
[31m-While the basic API provides the primitive functions for all [m
[31m-interactions between C and Lua,[m
[31m-the auxiliary library provides higher-level functions for some[m
[31m-common tasks.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All functions from the auxiliary library[m
[31m-are defined in header file <code>lauxlib.h</code> and[m
[31m-have a prefix <code>luaL_</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All functions in the auxiliary library are built on[m
[31m-top of the basic API,[m
[31m-and so they provide nothing that cannot be done with this API.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Several functions in the auxiliary library are used to[m
[31m-check C&nbsp;function arguments.[m
[31m-Their names are always <code>luaL_check*</code> or <code>luaL_opt*</code>.[m
[31m-All of these functions throw an error if the check is not satisfied.[m
[31m-Because the error message is formatted for arguments[m
[31m-(e.g., "<code>bad argument #1</code>"),[m
[31m-you should not use these functions for other stack values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>4.1 - <a name="4.1">Functions and Types</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Here we list all functions and types from the auxiliary library[m
[31m-in alphabetical order.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addchar"><code>luaL_addchar</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addchar (luaL_Buffer *B, char c);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds the character <code>c</code> to the buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addlstring"><code>luaL_addlstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds the string pointed to by <code>s</code> with length <code>l</code> to[m
[31m-the buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-The string may contain embedded zeros.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addsize"><code>luaL_addsize</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addsize (luaL_Buffer *B, size_t n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds to the buffer <code>B</code> (see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>)[m
[31m-a string of length <code>n</code> previously copied to the[m
[31m-buffer area (see <a href="#luaL_prepbuffer"><code>luaL_prepbuffer</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addstring"><code>luaL_addstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addstring (luaL_Buffer *B, const char *s);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds the zero-terminated string pointed to by <code>s</code>[m
[31m-to the buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-The string may not contain embedded zeros.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addvalue"><code>luaL_addvalue</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addvalue (luaL_Buffer *B);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds the value at the top of the stack[m
[31m-to the buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-Pops the value.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This is the only function on string buffers that can (and must)[m
[31m-be called with an extra element on the stack,[m
[31m-which is the value to be added to the buffer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_argcheck"><code>luaL_argcheck</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void luaL_argcheck (lua_State *L,[m
[31m-                    int cond,[m
[31m-                    int narg,[m
[31m-                    const char *extramsg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether <code>cond</code> is true.[m
[31m-If not, raises an error with the following message,[m
[31m-where <code>func</code> is retrieved from the call stack:[m
[31m-[m
[31m-<pre>[m
[31m-     bad argument #&lt;narg&gt; to &lt;func&gt; (&lt;extramsg&gt;)[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_argerror"><code>luaL_argerror</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_argerror (lua_State *L, int narg, const char *extramsg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Raises an error with the following message,[m
[31m-where <code>func</code> is retrieved from the call stack:[m
[31m-[m
[31m-<pre>[m
[31m-     bad argument #&lt;narg&gt; to &lt;func&gt; (&lt;extramsg&gt;)[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-This function never returns,[m
[31m-but it is an idiom to use it in C&nbsp;functions[m
[31m-as <code>return luaL_argerror(<em>args</em>)</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_Buffer"><code>luaL_Buffer</code></a></h3>[m
[31m-<pre>typedef struct luaL_Buffer luaL_Buffer;</pre>[m
[31m-[m
[31m-<p>[m
[31m-Type for a <em>string buffer</em>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A string buffer allows C&nbsp;code to build Lua strings piecemeal.[m
[31m-Its pattern of use is as follows:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>First you declare a variable <code>b</code> of type <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>.</li>[m
[31m-[m
[31m-<li>Then you initialize it with a call <code>luaL_buffinit(L, &amp;b)</code>.</li>[m
[31m-[m
[31m-<li>[m
[31m-Then you add string pieces to the buffer calling any of[m
[31m-the <code>luaL_add*</code> functions.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-You finish by calling <code>luaL_pushresult(&amp;b)</code>.[m
[31m-This call leaves the final string on the top of the stack.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-During its normal operation,[m
[31m-a string buffer uses a variable number of stack slots.[m
[31m-So, while using a buffer, you cannot assume that you know where[m
[31m-the top of the stack is.[m
[31m-You can use the stack between successive calls to buffer operations[m
[31m-as long as that use is balanced;[m
[31m-that is,[m
[31m-when you call a buffer operation,[m
[31m-the stack is at the same level[m
[31m-it was immediately after the previous buffer operation.[m
[31m-(The only exception to this rule is <a href="#luaL_addvalue"><code>luaL_addvalue</code></a>.)[m
[31m-After calling <a href="#luaL_pushresult"><code>luaL_pushresult</code></a> the stack is back to its[m
[31m-level when the buffer was initialized,[m
[31m-plus the final string on its top.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_buffinit"><code>luaL_buffinit</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void luaL_buffinit (lua_State *L, luaL_Buffer *B);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Initializes a buffer <code>B</code>.[m
[31m-This function does not allocate any space;[m
[31m-the buffer must be declared as a variable[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_callmeta"><code>luaL_callmeta</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>e</em>]</span>[m
[31m-<pre>int luaL_callmeta (lua_State *L, int obj, const char *e);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Calls a metamethod.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the object at index <code>obj</code> has a metatable and this[m
[31m-metatable has a field <code>e</code>,[m
[31m-this function calls this field and passes the object as its only argument.[m
[31m-In this case this function returns 1 and pushes onto the[m
[31m-stack the value returned by the call.[m
[31m-If there is no metatable or no metamethod,[m
[31m-this function returns 0 (without pushing any value on the stack).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkany"><code>luaL_checkany</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void luaL_checkany (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function has an argument[m
[31m-of any type (including <b>nil</b>) at position <code>narg</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkint"><code>luaL_checkint</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_checkint (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a number[m
[31m-and returns this number cast to an <code>int</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkinteger"><code>luaL_checkinteger</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>lua_Integer luaL_checkinteger (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a number[m
[31m-and returns this number cast to a <a href="#lua_Integer"><code>lua_Integer</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checklong"><code>luaL_checklong</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>long luaL_checklong (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a number[m
[31m-and returns this number cast to a <code>long</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checklstring"><code>luaL_checklstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>const char *luaL_checklstring (lua_State *L, int narg, size_t *l);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a string[m
[31m-and returns this string;[m
[31m-if <code>l</code> is not <code>NULL</code> fills <code>*l</code>[m
[31m-with the string's length.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function uses <a href="#lua_tolstring"><code>lua_tolstring</code></a> to get its result,[m
[31m-so all conversions and caveats of that function apply here.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checknumber"><code>luaL_checknumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>lua_Number luaL_checknumber (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a number[m
[31m-and returns this number.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkoption"><code>luaL_checkoption</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_checkoption (lua_State *L,[m
[31m-                      int narg,[m
[31m-                      const char *def,[m
[31m-                      const char *const lst[]);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a string and[m
[31m-searches for this string in the array <code>lst</code>[m
[31m-(which must be NULL-terminated).[m
[31m-Returns the index in the array where the string was found.[m
[31m-Raises an error if the argument is not a string or[m
[31m-if the string cannot be found.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>def</code> is not <code>NULL</code>,[m
[31m-the function uses <code>def</code> as a default value when[m
[31m-there is no argument <code>narg</code> or if this argument is <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This is a useful function for mapping strings to C&nbsp;enums.[m
[31m-(The usual convention in Lua libraries is[m
[31m-to use strings instead of numbers to select options.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkstack"><code>luaL_checkstack</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void luaL_checkstack (lua_State *L, int sz, const char *msg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Grows the stack size to <code>top + sz</code> elements,[m
[31m-raising an error if the stack cannot grow to that size.[m
[31m-<code>msg</code> is an additional text to go into the error message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkstring"><code>luaL_checkstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>const char *luaL_checkstring (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a string[m
[31m-and returns this string.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function uses <a href="#lua_tolstring"><code>lua_tolstring</code></a> to get its result,[m
[31m-so all conversions and caveats of that function apply here.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checktype"><code>luaL_checktype</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void luaL_checktype (lua_State *L, int narg, int t);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> has type <code>t</code>.[m
[31m-See <a href="#lua_type"><code>lua_type</code></a> for the encoding of types for <code>t</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkudata"><code>luaL_checkudata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void *luaL_checkudata (lua_State *L, int narg, const char *tname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a userdata[m
[31m-of the type <code>tname</code> (see <a href="#luaL_newmetatable"><code>luaL_newmetatable</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_dofile"><code>luaL_dofile</code></a></h3><p>[m
[31m-<span class="apii">[-0, +?, <em>m</em>]</span>[m
[31m-<pre>int luaL_dofile (lua_State *L, const char *filename);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads and runs the given file.[m
[31m-It is defined as the following macro:[m
[31m-[m
[31m-<pre>[m
[31m-     (luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-</pre><p>[m
[31m-It returns 0 if there are no errors[m
[31m-or 1 in case of errors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_dostring"><code>luaL_dostring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +?, <em>m</em>]</span>[m
[31m-<pre>int luaL_dostring (lua_State *L, const char *str);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads and runs the given string.[m
[31m-It is defined as the following macro:[m
[31m-[m
[31m-<pre>[m
[31m-     (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-</pre><p>[m
[31m-It returns 0 if there are no errors[m
[31m-or 1 in case of errors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_error"><code>luaL_error</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_error (lua_State *L, const char *fmt, ...);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Raises an error.[m
[31m-The error message format is given by <code>fmt</code>[m
[31m-plus any extra arguments,[m
[31m-following the same rules of <a href="#lua_pushfstring"><code>lua_pushfstring</code></a>.[m
[31m-It also adds at the beginning of the message the file name and[m
[31m-the line number where the error occurred,[m
[31m-if this information is available.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function never returns,[m
[31m-but it is an idiom to use it in C&nbsp;functions[m
[31m-as <code>return luaL_error(<em>args</em>)</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_getmetafield"><code>luaL_getmetafield</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>m</em>]</span>[m
[31m-<pre>int luaL_getmetafield (lua_State *L, int obj, const char *e);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the field <code>e</code> from the metatable[m
[31m-of the object at index <code>obj</code>.[m
[31m-If the object does not have a metatable,[m
[31m-or if the metatable does not have this field,[m
[31m-returns 0 and pushes nothing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_getmetatable"><code>luaL_getmetatable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void luaL_getmetatable (lua_State *L, const char *tname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the metatable associated with name <code>tname</code>[m
[31m-in the registry (see <a href="#luaL_newmetatable"><code>luaL_newmetatable</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_gsub"><code>luaL_gsub</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>const char *luaL_gsub (lua_State *L,[m
[31m-                       const char *s,[m
[31m-                       const char *p,[m
[31m-                       const char *r);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a copy of string <code>s</code> by replacing[m
[31m-any occurrence of the string <code>p</code>[m
[31m-with the string <code>r</code>.[m
[31m-Pushes the resulting string on the stack and returns it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_loadbuffer"><code>luaL_loadbuffer</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>int luaL_loadbuffer (lua_State *L,[m
[31m-                     const char *buff,[m
[31m-                     size_t sz,[m
[31m-                     const char *name);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads a buffer as a Lua chunk.[m
[31m-This function uses <a href="#lua_load"><code>lua_load</code></a> to load the chunk in the[m
[31m-buffer pointed to by <code>buff</code> with size <code>sz</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the same results as <a href="#lua_load"><code>lua_load</code></a>.[m
[31m-<code>name</code> is the chunk name,[m
[31m-used for debug information and error messages.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_loadfile"><code>luaL_loadfile</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>int luaL_loadfile (lua_State *L, const char *filename);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads a file as a Lua chunk.[m
[31m-This function uses <a href="#lua_load"><code>lua_load</code></a> to load the chunk in the file[m
[31m-named <code>filename</code>.[m
[31m-If <code>filename</code> is <code>NULL</code>,[m
[31m-then it loads from the standard input.[m
[31m-The first line in the file is ignored if it starts with a <code>#</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the same results as <a href="#lua_load"><code>lua_load</code></a>,[m
[31m-but it has an extra error code <a name="pdf-LUA_ERRFILE"><code>LUA_ERRFILE</code></a>[m
[31m-if it cannot open/read the file.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As <a href="#lua_load"><code>lua_load</code></a>, this function only loads the chunk;[m
[31m-it does not run it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_loadstring"><code>luaL_loadstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>int luaL_loadstring (lua_State *L, const char *s);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads a string as a Lua chunk.[m
[31m-This function uses <a href="#lua_load"><code>lua_load</code></a> to load the chunk in[m
[31m-the zero-terminated string <code>s</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the same results as <a href="#lua_load"><code>lua_load</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Also as <a href="#lua_load"><code>lua_load</code></a>, this function only loads the chunk;[m
[31m-it does not run it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_newmetatable"><code>luaL_newmetatable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>int luaL_newmetatable (lua_State *L, const char *tname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the registry already has the key <code>tname</code>,[m
[31m-returns 0.[m
[31m-Otherwise,[m
[31m-creates a new table to be used as a metatable for userdata,[m
[31m-adds it to the registry with key <code>tname</code>,[m
[31m-and returns 1.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In both cases pushes onto the stack the final value associated[m
[31m-with <code>tname</code> in the registry.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_newstate"><code>luaL_newstate</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_State *luaL_newstate (void);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new Lua state.[m
[31m-It calls <a href="#lua_newstate"><code>lua_newstate</code></a> with an[m
[31m-allocator based on the standard&nbsp;C <code>realloc</code> function[m
[31m-and then sets a panic function (see <a href="#lua_atpanic"><code>lua_atpanic</code></a>) that prints[m
[31m-an error message to the standard error output in case of fatal[m
[31m-errors.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the new state,[m
[31m-or <code>NULL</code> if there is a memory allocation error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_openlibs"><code>luaL_openlibs</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_openlibs (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Opens all standard Lua libraries into the given state.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optint"><code>luaL_optint</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_optint (lua_State *L, int narg, int d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a number,[m
[31m-returns this number cast to an <code>int</code>.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optinteger"><code>luaL_optinteger</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>lua_Integer luaL_optinteger (lua_State *L,[m
[31m-                             int narg,[m
[31m-                             lua_Integer d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a number,[m
[31m-returns this number cast to a <a href="#lua_Integer"><code>lua_Integer</code></a>.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optlong"><code>luaL_optlong</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>long luaL_optlong (lua_State *L, int narg, long d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a number,[m
[31m-returns this number cast to a <code>long</code>.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optlstring"><code>luaL_optlstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>const char *luaL_optlstring (lua_State *L,[m
[31m-                             int narg,[m
[31m-                             const char *d,[m
[31m-                             size_t *l);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a string,[m
[31m-returns this string.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>l</code> is not <code>NULL</code>,[m
[31m-fills the position <code>*l</code> with the results's length.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optnumber"><code>luaL_optnumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a number,[m
[31m-returns this number.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optstring"><code>luaL_optstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>const char *luaL_optstring (lua_State *L,[m
[31m-                            int narg,[m
[31m-                            const char *d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a string,[m
[31m-returns this string.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_prepbuffer"><code>luaL_prepbuffer</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>char *luaL_prepbuffer (luaL_Buffer *B);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns an address to a space of size <a name="pdf-LUAL_BUFFERSIZE"><code>LUAL_BUFFERSIZE</code></a>[m
[31m-where you can copy a string to be added to buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-After copying the string into this space you must call[m
[31m-<a href="#luaL_addsize"><code>luaL_addsize</code></a> with the size of the string to actually add [m
[31m-it to the buffer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_pushresult"><code>luaL_pushresult</code></a></h3><p>[m
[31m-<span class="apii">[-?, +1, <em>m</em>]</span>[m
[31m-<pre>void luaL_pushresult (luaL_Buffer *B);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Finishes the use of buffer <code>B</code> leaving the final string on[m
[31m-the top of the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_ref"><code>luaL_ref</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>m</em>]</span>[m
[31m-<pre>int luaL_ref (lua_State *L, int t);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates and returns a <em>reference</em>,[m
[31m-in the table at index <code>t</code>,[m
[31m-for the object at the top of the stack (and pops the object).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A reference is a unique integer key.[m
[31m-As long as you do not manually add integer keys into table <code>t</code>,[m
[31m-<a href="#luaL_ref"><code>luaL_ref</code></a> ensures the uniqueness of the key it returns.[m
[31m-You can retrieve an object referred by reference <code>r</code>[m
[31m-by calling <code>lua_rawgeti(L, t, r)</code>.[m
[31m-Function <a href="#luaL_unref"><code>luaL_unref</code></a> frees a reference and its associated object.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the object at the top of the stack is <b>nil</b>,[m
[31m-<a href="#luaL_ref"><code>luaL_ref</code></a> returns the constant <a name="pdf-LUA_REFNIL"><code>LUA_REFNIL</code></a>.[m
[31m-The constant <a name="pdf-LUA_NOREF"><code>LUA_NOREF</code></a> is guaranteed to be different[m
[31m-from any reference returned by <a href="#luaL_ref"><code>luaL_ref</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_Reg"><code>luaL_Reg</code></a></h3>[m
[31m-<pre>typedef struct luaL_Reg {[m
[31m-  const char *name;[m
[31m-  lua_CFunction func;[m
[31m-} luaL_Reg;</pre>[m
[31m-[m
[31m-<p>[m
[31m-Type for arrays of functions to be registered by[m
[31m-<a href="#luaL_register"><code>luaL_register</code></a>.[m
[31m-<code>name</code> is the function name and <code>func</code> is a pointer to[m
[31m-the function.[m
[31m-Any array of <a href="#luaL_Reg"><code>luaL_Reg</code></a> must end with an sentinel entry[m
[31m-in which both <code>name</code> and <code>func</code> are <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_register"><code>luaL_register</code></a></h3><p>[m
[31m-<span class="apii">[-(0|1), +1, <em>m</em>]</span>[m
[31m-<pre>void luaL_register (lua_State *L,[m
[31m-                    const char *libname,[m
[31m-                    const luaL_Reg *l);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Opens a library.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called with <code>libname</code> equal to <code>NULL</code>,[m
[31m-it simply registers all functions in the list <code>l</code>[m
[31m-(see <a href="#luaL_Reg"><code>luaL_Reg</code></a>) into the table on the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called with a non-null <code>libname</code>,[m
[31m-<code>luaL_register</code> creates a new table <code>t</code>,[m
[31m-sets it as the value of the global variable <code>libname</code>,[m
[31m-sets it as the value of <code>package.loaded[libname]</code>,[m
[31m-and registers on it all functions in the list <code>l</code>.[m
[31m-If there is a table in <code>package.loaded[libname]</code> or in[m
[31m-variable <code>libname</code>,[m
[31m-reuses this table instead of creating a new one.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In any case the function leaves the table[m
[31m-on the top of the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_typename"><code>luaL_typename</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>const char *luaL_typename (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the name of the type of the value at the given index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_typerror"><code>luaL_typerror</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_typerror (lua_State *L, int narg, const char *tname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Generates an error with a message like the following:[m
[31m-[m
[31m-<pre>[m
[31m-     <em>location</em>: bad argument <em>narg</em> to '<em>func</em>' (<em>tname</em> expected, got <em>rt</em>)[m
[31m-</pre><p>[m
[31m-where <code><em>location</em></code> is produced by <a href="#luaL_where"><code>luaL_where</code></a>,[m
[31m-<code><em>func</em></code> is the name of the current function,[m
[31m-and <code><em>rt</em></code> is the type name of the actual argument.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_unref"><code>luaL_unref</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void luaL_unref (lua_State *L, int t, int ref);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Releases reference <code>ref</code> from the table at index <code>t</code>[m
[31m-(see <a href="#luaL_ref"><code>luaL_ref</code></a>).[m
[31m-The entry is removed from the table,[m
[31m-so that the referred object can be collected.[m
[31m-The reference <code>ref</code> is also freed to be used again.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>ref</code> is <a href="#pdf-LUA_NOREF"><code>LUA_NOREF</code></a> or <a href="#pdf-LUA_REFNIL"><code>LUA_REFNIL</code></a>,[m
[31m-<a href="#luaL_unref"><code>luaL_unref</code></a> does nothing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_where"><code>luaL_where</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void luaL_where (lua_State *L, int lvl);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack a string identifying the current position[m
[31m-of the control at level <code>lvl</code> in the call stack.[m
[31m-Typically this string has the following format:[m
[31m-[m
[31m-<pre>[m
[31m-     <em>chunkname</em>:<em>currentline</em>:[m
[31m-</pre><p>[m
[31m-Level&nbsp;0 is the running function,[m
[31m-level&nbsp;1 is the function that called the running function,[m
[31m-etc.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is used to build a prefix for error messages.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>5 - <a name="5">Standard Libraries</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-The standard Lua libraries provide useful functions[m
[31m-that are implemented directly through the C&nbsp;API.[m
[31m-Some of these functions provide essential services to the language[m
[31m-(e.g., <a href="#pdf-type"><code>type</code></a> and <a href="#pdf-getmetatable"><code>getmetatable</code></a>);[m
[31m-others provide access to "outside" services (e.g., I/O);[m
[31m-and others could be implemented in Lua itself,[m
[31m-but are quite useful or have critical performance requirements that[m
[31m-deserve an implementation in C (e.g., <a href="#pdf-table.sort"><code>table.sort</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All libraries are implemented through the official C&nbsp;API[m
[31m-and are provided as separate C&nbsp;modules.[m
[31m-Currently, Lua has the following standard libraries:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>basic library, which includes the coroutine sub-library;</li>[m
[31m-[m
[31m-<li>package library;</li>[m
[31m-[m
[31m-<li>string manipulation;</li>[m
[31m-[m
[31m-<li>table manipulation;</li>[m
[31m-[m
[31m-<li>mathematical functions (sin, log, etc.);</li>[m
[31m-[m
[31m-<li>input and output;</li>[m
[31m-[m
[31m-<li>operating system facilities;</li>[m
[31m-[m
[31m-<li>debug facilities.</li>[m
[31m-[m
[31m-</ul><p>[m
[31m-Except for the basic and package libraries,[m
[31m-each library provides all its functions as fields of a global table[m
[31m-or as methods of its objects.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To have access to these libraries,[m
[31m-the C&nbsp;host program should call the <a href="#luaL_openlibs"><code>luaL_openlibs</code></a> function,[m
[31m-which opens all standard libraries.[m
[31m-Alternatively,[m
[31m-it can open them individually by calling[m
[31m-<a name="pdf-luaopen_base"><code>luaopen_base</code></a> (for the basic library),[m
[31m-<a name="pdf-luaopen_package"><code>luaopen_package</code></a> (for the package library),[m
[31m-<a name="pdf-luaopen_string"><code>luaopen_string</code></a> (for the string library),[m
[31m-<a name="pdf-luaopen_table"><code>luaopen_table</code></a> (for the table library),[m
[31m-<a name="pdf-luaopen_math"><code>luaopen_math</code></a> (for the mathematical library),[m
[31m-<a name="pdf-luaopen_io"><code>luaopen_io</code></a> (for the I/O library),[m
[31m-<a name="pdf-luaopen_os"><code>luaopen_os</code></a> (for the Operating System library),[m
[31m-and <a name="pdf-luaopen_debug"><code>luaopen_debug</code></a> (for the debug library).[m
[31m-These functions are declared in <a name="pdf-lualib.h"><code>lualib.h</code></a>[m
[31m-and should not be called directly:[m
[31m-you must call them like any other Lua C&nbsp;function,[m
[31m-e.g., by using <a href="#lua_call"><code>lua_call</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.1 - <a name="5.1">Basic Functions</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The basic library provides some core functions to Lua.[m
[31m-If you do not include this library in your application,[m
[31m-you should check carefully whether you need to provide [m
[31m-implementations for some of its facilities.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-assert"><code>assert (v [, message])</code></a></h3>[m
[31m-Issues an  error when[m
[31m-the value of its argument <code>v</code> is false (i.e., <b>nil</b> or <b>false</b>);[m
[31m-otherwise, returns all its arguments.[m
[31m-<code>message</code> is an error message;[m
[31m-when absent, it defaults to "assertion failed!"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-collectgarbage"><code>collectgarbage ([opt [, arg]])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is a generic interface to the garbage collector.[m
[31m-It performs different functions according to its first argument, <code>opt</code>:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>"collect":</b>[m
[31m-performs a full garbage-collection cycle.[m
[31m-This is the default option.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"stop":</b>[m
[31m-stops the garbage collector.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"restart":</b>[m
[31m-restarts the garbage collector.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"count":</b>[m
[31m-returns the total memory in use by Lua (in Kbytes).[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"step":</b>[m
[31m-performs a garbage-collection step.[m
[31m-The step "size" is controlled by <code>arg</code>[m
[31m-(larger values mean more steps) in a non-specified way.[m
[31m-If you want to control the step size[m
[31m-you must experimentally tune the value of <code>arg</code>.[m
[31m-Returns <b>true</b> if the step finished a collection cycle.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"setpause":</b>[m
[31m-sets <code>arg</code> as the new value for the <em>pause</em> of[m
[31m-the collector (see <a href="#2.10">&sect;2.10</a>).[m
[31m-Returns the previous value for <em>pause</em>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"setstepmul":</b>[m
[31m-sets <code>arg</code> as the new value for the <em>step multiplier</em> of[m
[31m-the collector (see <a href="#2.10">&sect;2.10</a>).[m
[31m-Returns the previous value for <em>step</em>.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-dofile"><code>dofile ([filename])</code></a></h3>[m
[31m-Opens the named file and executes its contents as a Lua chunk.[m
[31m-When called without arguments,[m
[31m-<code>dofile</code> executes the contents of the standard input (<code>stdin</code>).[m
[31m-Returns all values returned by the chunk.[m
[31m-In case of errors, <code>dofile</code> propagates the error[m
[31m-to its caller (that is, <code>dofile</code> does not run in protected mode).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-error"><code>error (message [, level])</code></a></h3>[m
[31m-Terminates the last protected function called[m
[31m-and returns <code>message</code> as the error message.[m
[31m-Function <code>error</code> never returns.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Usually, <code>error</code> adds some information about the error position[m
[31m-at the beginning of the message.[m
[31m-The <code>level</code> argument specifies how to get the error position.[m
[31m-With level&nbsp;1 (the default), the error position is where the[m
[31m-<code>error</code> function was called.[m
[31m-Level&nbsp;2 points the error to where the function[m
[31m-that called <code>error</code> was called; and so on.[m
[31m-Passing a level&nbsp;0 avoids the addition of error position information[m
[31m-to the message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-_G"><code>_G</code></a></h3>[m
[31m-A global variable (not a function) that[m
[31m-holds the global environment (that is, <code>_G._G = _G</code>).[m
[31m-Lua itself does not use this variable;[m
[31m-changing its value does not affect any environment,[m
[31m-nor vice-versa.[m
[31m-(Use <a href="#pdf-setfenv"><code>setfenv</code></a> to change environments.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-getfenv"><code>getfenv ([f])</code></a></h3>[m
[31m-Returns the current environment in use by the function.[m
[31m-<code>f</code> can be a Lua function or a number[m
[31m-that specifies the function at that stack level:[m
[31m-Level&nbsp;1 is the function calling <code>getfenv</code>.[m
[31m-If the given function is not a Lua function,[m
[31m-or if <code>f</code> is 0,[m
[31m-<code>getfenv</code> returns the global environment.[m
[31m-The default for <code>f</code> is 1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-getmetatable"><code>getmetatable (object)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>object</code> does not have a metatable, returns <b>nil</b>.[m
[31m-Otherwise,[m
[31m-if the object's metatable has a <code>"__metatable"</code> field,[m
[31m-returns the associated value.[m
[31m-Otherwise, returns the metatable of the given object.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-ipairs"><code>ipairs (t)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns three values: an iterator function, the table <code>t</code>, and 0,[m
[31m-so that the construction[m
[31m-[m
[31m-<pre>[m
[31m-     for i,v in ipairs(t) do <em>body</em> end[m
[31m-</pre><p>[m
[31m-will iterate over the pairs (<code>1,t[1]</code>), (<code>2,t[2]</code>), &middot;&middot;&middot;,[m
[31m-up to the first integer key absent from the table.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-load"><code>load (func [, chunkname])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Loads a chunk using function <code>func</code> to get its pieces.[m
[31m-Each call to <code>func</code> must return a string that concatenates[m
[31m-with previous results.[m
[31m-A return of an empty string, <b>nil</b>, or no value signals the end of the chunk.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If there are no errors, [m
[31m-returns the compiled chunk as a function;[m
[31m-otherwise, returns <b>nil</b> plus the error message.[m
[31m-The environment of the returned function is the global environment.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<code>chunkname</code> is used as the chunk name for error messages[m
[31m-and debug information.[m
[31m-When absent,[m
[31m-it defaults to "<code>=(load)</code>".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-loadfile"><code>loadfile ([filename])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#pdf-load"><code>load</code></a>,[m
[31m-but gets the chunk from file <code>filename</code>[m
[31m-or from the standard input,[m
[31m-if no file name is given.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-loadstring"><code>loadstring (string [, chunkname])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#pdf-load"><code>load</code></a>,[m
[31m-but gets the chunk from the given string.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To load and run a given string, use the idiom[m
[31m-[m
[31m-<pre>[m
[31m-     assert(loadstring(s))()[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-When absent,[m
[31m-<code>chunkname</code> defaults to the given string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-next"><code>next (table [, index])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Allows a program to traverse all fields of a table.[m
[31m-Its first argument is a table and its second argument[m
[31m-is an index in this table.[m
[31m-<code>next</code> returns the next index of the table[m
[31m-and its associated value.[m
[31m-When called with <b>nil</b> as its second argument,[m
[31m-<code>next</code> returns an initial index[m
[31m-and its associated value.[m
[31m-When called with the last index,[m
[31m-or with <b>nil</b> in an empty table,[m
[31m-<code>next</code> returns <b>nil</b>.[m
[31m-If the second argument is absent, then it is interpreted as <b>nil</b>.[m
[31m-In particular,[m
[31m-you can use <code>next(t)</code> to check whether a table is empty.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The order in which the indices are enumerated is not specified,[m
[31m-<em>even for numeric indices</em>.[m
[31m-(To traverse a table in numeric order,[m
[31m-use a numerical <b>for</b> or the <a href="#pdf-ipairs"><code>ipairs</code></a> function.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The behavior of <code>next</code> is <em>undefined</em> if,[m
[31m-during the traversal,[m
[31m-you assign any value to a non-existent field in the table.[m
[31m-You may however modify existing fields.[m
[31m-In particular, you may clear existing fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-pairs"><code>pairs (t)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns three values: the <a href="#pdf-next"><code>next</code></a> function, the table <code>t</code>, and <b>nil</b>,[m
[31m-so that the construction[m
[31m-[m
[31m-<pre>[m
[31m-     for k,v in pairs(t) do <em>body</em> end[m
[31m-</pre><p>[m
[31m-will iterate over all key&ndash;value pairs of table <code>t</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-See function <a href="#pdf-next"><code>next</code></a> for the caveats of modifying[m
[31m-the table during its traversal.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-pcall"><code>pcall (f, arg1, &middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Calls function <code>f</code> with[m
[31m-the given arguments in <em>protected mode</em>.[m
[31m-This means that any error inside&nbsp;<code>f</code> is not propagated;[m
[31m-instead, <code>pcall</code> catches the error[m
[31m-and returns a status code.[m
[31m-Its first result is the status code (a boolean),[m
[31m-which is true if the call succeeds without errors.[m
[31m-In such case, <code>pcall</code> also returns all results from the call,[m
[31m-after this first result.[m
[31m-In case of any error, <code>pcall</code> returns <b>false</b> plus the error message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-print"><code>print (&middot;&middot;&middot;)</code></a></h3>[m
[31m-Receives any number of arguments,[m
[31m-and prints their values to <code>stdout</code>,[m
[31m-using the <a href="#pdf-tostring"><code>tostring</code></a> function to convert them to strings.[m
[31m-<code>print</code> is not intended for formatted output,[m
[31m-but only as a quick way to show a value,[m
[31m-typically for debugging.[m
[31m-For formatted output, use <a href="#pdf-string.format"><code>string.format</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-rawequal"><code>rawequal (v1, v2)</code></a></h3>[m
[31m-Checks whether <code>v1</code> is equal to <code>v2</code>,[m
[31m-without invoking any metamethod.[m
[31m-Returns a boolean.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-rawget"><code>rawget (table, index)</code></a></h3>[m
[31m-Gets the real value of <code>table[index]</code>,[m
[31m-without invoking any metamethod.[m
[31m-<code>table</code> must be a table;[m
[31m-<code>index</code> may be any value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-rawset"><code>rawset (table, index, value)</code></a></h3>[m
[31m-Sets the real value of <code>table[index]</code> to <code>value</code>,[m
[31m-without invoking any metamethod.[m
[31m-<code>table</code> must be a table,[m
[31m-<code>index</code> any value different from <b>nil</b>,[m
[31m-and <code>value</code> any Lua value.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns <code>table</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-select"><code>select (index, &middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>index</code> is a number,[m
[31m-returns all arguments after argument number <code>index</code>.[m
[31m-Otherwise, <code>index</code> must be the string <code>"#"</code>,[m
[31m-and <code>select</code> returns the total number of extra arguments it received.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-setfenv"><code>setfenv (f, table)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the environment to be used by the given function.[m
[31m-<code>f</code> can be a Lua function or a number[m
[31m-that specifies the function at that stack level:[m
[31m-Level&nbsp;1 is the function calling <code>setfenv</code>.[m
[31m-<code>setfenv</code> returns the given function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As a special case, when <code>f</code> is 0 <code>setfenv</code> changes[m
[31m-the environment of the running thread.[m
[31m-In this case, <code>setfenv</code> returns no values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-setmetatable"><code>setmetatable (table, metatable)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the metatable for the given table.[m
[31m-(You cannot change the metatable of other types from Lua, only from&nbsp;C.)[m
[31m-If <code>metatable</code> is <b>nil</b>,[m
[31m-removes the metatable of the given table.[m
[31m-If the original metatable has a <code>"__metatable"</code> field,[m
[31m-raises an error.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns <code>table</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-tonumber"><code>tonumber (e [, base])</code></a></h3>[m
[31m-Tries to convert its argument to a number.[m
[31m-If the argument is already a number or a string convertible[m
[31m-to a number, then <code>tonumber</code> returns this number;[m
[31m-otherwise, it returns <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-An optional argument specifies the base to interpret the numeral.[m
[31m-The base may be any integer between 2 and 36, inclusive.[m
[31m-In bases above&nbsp;10, the letter '<code>A</code>' (in either upper or lower case)[m
[31m-represents&nbsp;10, '<code>B</code>' represents&nbsp;11, and so forth,[m
[31m-with '<code>Z</code>' representing 35.[m
[31m-In base 10 (the default), the number can have a decimal part,[m
[31m-as well as an optional exponent part (see <a href="#2.1">&sect;2.1</a>).[m
[31m-In other bases, only unsigned integers are accepted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-tostring"><code>tostring (e)</code></a></h3>[m
[31m-Receives an argument of any type and[m
[31m-converts it to a string in a reasonable format.[m
[31m-For complete control of how numbers are converted,[m
[31m-use <a href="#pdf-string.format"><code>string.format</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the metatable of <code>e</code> has a <code>"__tostring"</code> field,[m
[31m-then <code>tostring</code> calls the corresponding value[m
[31m-with <code>e</code> as argument,[m
[31m-and uses the result of the call as its result.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-type"><code>type (v)</code></a></h3>[m
[31m-Returns the type of its only argument, coded as a string.[m
[31m-The possible results of this function are[m
[31m-"<code>nil</code>" (a string, not the value <b>nil</b>),[m
[31m-"<code>number</code>",[m
[31m-"<code>string</code>",[m
[31m-"<code>boolean</code>",[m
[31m-"<code>table</code>",[m
[31m-"<code>function</code>",[m
[31m-"<code>thread</code>",[m
[31m-and "<code>userdata</code>".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-unpack"><code>unpack (list [, i [, j]])</code></a></h3>[m
[31m-Returns the elements from the given table.[m
[31m-This function is equivalent to[m
[31m-[m
[31m-<pre>[m
[31m-     return list[i], list[i+1], &middot;&middot;&middot;, list[j][m
[31m-</pre><p>[m
[31m-except that the above code can be written only for a fixed number[m
[31m-of elements.[m
[31m-By default, <code>i</code> is&nbsp;1 and <code>j</code> is the length of the list,[m
[31m-as defined by the length operator (see <a href="#2.5.5">&sect;2.5.5</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-_VERSION"><code>_VERSION</code></a></h3>[m
[31m-A global variable (not a function) that[m
[31m-holds a string containing the current interpreter version.[m
[31m-The current contents of this variable is "<code>Lua 5.1</code>".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-xpcall"><code>xpcall (f, err)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is similar to <a href="#pdf-pcall"><code>pcall</code></a>,[m
[31m-except that you can set a new error handler.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<code>xpcall</code> calls function <code>f</code> in protected mode,[m
[31m-using <code>err</code> as the error handler.[m
[31m-Any error inside <code>f</code> is not propagated;[m
[31m-instead, <code>xpcall</code> catches the error,[m
[31m-calls the <code>err</code> function with the original error object,[m
[31m-and returns a status code.[m
[31m-Its first result is the status code (a boolean),[m
[31m-which is true if the call succeeds without errors.[m
[31m-In this case, <code>xpcall</code> also returns all results from the call,[m
[31m-after this first result.[m
[31m-In case of any error,[m
[31m-<code>xpcall</code> returns <b>false</b> plus the result from <code>err</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.2 - <a name="5.2">Coroutine Manipulation</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The operations related to coroutines comprise a sub-library of[m
[31m-the basic library and come inside the table <a name="pdf-coroutine"><code>coroutine</code></a>.[m
[31m-See <a href="#2.11">&sect;2.11</a> for a general description of coroutines.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.create"><code>coroutine.create (f)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Creates a new coroutine, with body <code>f</code>.[m
[31m-<code>f</code> must be a Lua function.[m
[31m-Returns this new coroutine,[m
[31m-an object with type <code>"thread"</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.resume"><code>coroutine.resume (co [, val1, &middot;&middot;&middot;])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Starts or continues the execution of coroutine <code>co</code>.[m
[31m-The first time you resume a coroutine,[m
[31m-it starts running its body.[m
[31m-The values <code>val1</code>, &middot;&middot;&middot; are passed[m
[31m-as the arguments to the body function.[m
[31m-If the coroutine has yielded,[m
[31m-<code>resume</code> restarts it;[m
[31m-the values <code>val1</code>, &middot;&middot;&middot; are passed[m
[31m-as the results from the yield.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the coroutine runs without any errors,[m
[31m-<code>resume</code> returns <b>true</b> plus any values passed to <code>yield</code>[m
[31m-(if the coroutine yields) or any values returned by the body function[m
[31m-(if the coroutine terminates).[m
[31m-If there is any error,[m
[31m-<code>resume</code> returns <b>false</b> plus the error message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.running"><code>coroutine.running ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the running coroutine,[m
[31m-or <b>nil</b> when called by the main thread.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.status"><code>coroutine.status (co)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the status of coroutine <code>co</code>, as a string:[m
[31m-<code>"running"</code>,[m
[31m-if the coroutine is running (that is, it called <code>status</code>);[m
[31m-<code>"suspended"</code>, if the coroutine is suspended in a call to <code>yield</code>,[m
[31m-or if it has not started running yet;[m
[31m-<code>"normal"</code> if the coroutine is active but not running[m
[31m-(that is, it has resumed another coroutine);[m
[31m-and <code>"dead"</code> if the coroutine has finished its body function,[m
[31m-or if it has stopped with an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.wrap"><code>coroutine.wrap (f)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Creates a new coroutine, with body <code>f</code>.[m
[31m-<code>f</code> must be a Lua function.[m
[31m-Returns a function that resumes the coroutine each time it is called.[m
[31m-Any arguments passed to the function behave as the[m
[31m-extra arguments to <code>resume</code>.[m
[31m-Returns the same values returned by <code>resume</code>,[m
[31m-except the first boolean.[m
[31m-In case of error, propagates the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.yield"><code>coroutine.yield (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Suspends the execution of the calling coroutine.[m
[31m-The coroutine cannot be running a C&nbsp;function,[m
[31m-a metamethod, or an iterator.[m
[31m-Any arguments to <code>yield</code> are passed as extra results to <code>resume</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.3 - <a name="5.3">Modules</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The package library provides basic[m
[31m-facilities for loading and building modules in Lua.[m
[31m-It exports two of its functions directly in the global environment:[m
[31m-<a href="#pdf-require"><code>require</code></a> and <a href="#pdf-module"><code>module</code></a>.[m
[31m-Everything else is exported in a table <a name="pdf-package"><code>package</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-module"><code>module (name [, &middot;&middot;&middot;])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Creates a module.[m
[31m-If there is a table in <code>package.loaded[name]</code>,[m
[31m-this table is the module.[m
[31m-Otherwise, if there is a global table <code>t</code> with the given name,[m
[31m-this table is the module.[m
[31m-Otherwise creates a new table <code>t</code> and[m
[31m-sets it as the value of the global <code>name</code> and[m
[31m-the value of <code>package.loaded[name]</code>.[m
[31m-This function also initializes <code>t._NAME</code> with the given name,[m
[31m-<code>t._M</code> with the module (<code>t</code> itself),[m
[31m-and <code>t._PACKAGE</code> with the package name[m
[31m-(the full module name minus last component; see below).[m
[31m-Finally, <code>module</code> sets <code>t</code> as the new environment[m
[31m-of the current function and the new value of <code>package.loaded[name]</code>,[m
[31m-so that <a href="#pdf-require"><code>require</code></a> returns <code>t</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>name</code> is a compound name[m
[31m-(that is, one with components separated by dots),[m
[31m-<code>module</code> creates (or reuses, if they already exist)[m
[31m-tables for each component.[m
[31m-For instance, if <code>name</code> is <code>a.b.c</code>,[m
[31m-then <code>module</code> stores the module table in field <code>c</code> of[m
[31m-field <code>b</code> of global <code>a</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function can receive optional <em>options</em> after[m
[31m-the module name,[m
[31m-where each option is a function to be applied over the module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-require"><code>require (modname)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Loads the given module.[m
[31m-The function starts by looking into the <a href="#pdf-package.loaded"><code>package.loaded</code></a> table[m
[31m-to determine whether <code>modname</code> is already loaded.[m
[31m-If it is, then <code>require</code> returns the value stored[m
[31m-at <code>package.loaded[modname]</code>.[m
[31m-Otherwise, it tries to find a <em>loader</em> for the module.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To find a loader,[m
[31m-<code>require</code> is guided by the <a href="#pdf-package.loaders"><code>package.loaders</code></a> array.[m
[31m-By changing this array,[m
[31m-we can change how <code>require</code> looks for a module.[m
[31m-The following explanation is based on the default configuration[m
[31m-for <a href="#pdf-package.loaders"><code>package.loaders</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-First <code>require</code> queries <code>package.preload[modname]</code>.[m
[31m-If it has a value,[m
[31m-this value (which should be a function) is the loader.[m
[31m-Otherwise <code>require</code> searches for a Lua loader using the[m
[31m-path stored in <a href="#pdf-package.path"><code>package.path</code></a>.[m
[31m-If that also fails, it searches for a C&nbsp;loader using the[m
[31m-path stored in <a href="#pdf-package.cpath"><code>package.cpath</code></a>.[m
[31m-If that also fails,[m
[31m-it tries an <em>all-in-one</em> loader (see <a href="#pdf-package.loaders"><code>package.loaders</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Once a loader is found,[m
[31m-<code>require</code> calls the loader with a single argument, <code>modname</code>.[m
[31m-If the loader returns any value,[m
[31m-<code>require</code> assigns the returned value to <code>package.loaded[modname]</code>.[m
[31m-If the loader returns no value and[m
[31m-has not assigned any value to <code>package.loaded[modname]</code>,[m
[31m-then <code>require</code> assigns <b>true</b> to this entry.[m
[31m-In any case, <code>require</code> returns the[m
[31m-final value of <code>package.loaded[modname]</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If there is any error loading or running the module,[m
[31m-or if it cannot find any loader for the module,[m
[31m-then <code>require</code> signals an error. [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.cpath"><code>package.cpath</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The path used by <a href="#pdf-require"><code>require</code></a> to search for a C&nbsp;loader.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua initializes the C&nbsp;path <a href="#pdf-package.cpath"><code>package.cpath</code></a> in the same way[m
[31m-it initializes the Lua path <a href="#pdf-package.path"><code>package.path</code></a>,[m
[31m-using the environment variable <a name="pdf-LUA_CPATH"><code>LUA_CPATH</code></a>[m
[31m-or a default path defined in <code>luaconf.h</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-<hr><h3><a name="pdf-package.loaded"><code>package.loaded</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A table used by <a href="#pdf-require"><code>require</code></a> to control which[m
[31m-modules are already loaded.[m
[31m-When you require a module <code>modname</code> and[m
[31m-<code>package.loaded[modname]</code> is not false,[m
[31m-<a href="#pdf-require"><code>require</code></a> simply returns the value stored there.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.loaders"><code>package.loaders</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A table used by <a href="#pdf-require"><code>require</code></a> to control how to load modules.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Each entry in this table is a <em>searcher function</em>.[m
[31m-When looking for a module,[m
[31m-<a href="#pdf-require"><code>require</code></a> calls each of these searchers in ascending order,[m
[31m-with the module name (the argument given to <a href="#pdf-require"><code>require</code></a>) as its[m
[31m-sole parameter.[m
[31m-The function can return another function (the module <em>loader</em>)[m
[31m-or a string explaining why it did not find that module[m
[31m-(or <b>nil</b> if it has nothing to say).[m
[31m-Lua initializes this table with four functions.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The first searcher simply looks for a loader in the[m
[31m-<a href="#pdf-package.preload"><code>package.preload</code></a> table.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The second searcher looks for a loader as a Lua library,[m
[31m-using the path stored at <a href="#pdf-package.path"><code>package.path</code></a>.[m
[31m-A path is a sequence of <em>templates</em> separated by semicolons.[m
[31m-For each template,[m
[31m-the searcher will change each interrogation[m
[31m-mark in the template by <code>filename</code>,[m
[31m-which is the module name with each dot replaced by a[m
[31m-"directory separator" (such as "<code>/</code>" in Unix);[m
[31m-then it will try to open the resulting file name.[m
[31m-So, for instance, if the Lua path is the string[m
[31m-[m
[31m-<pre>[m
[31m-     "./?.lua;./?.lc;/usr/local/?/init.lua"[m
[31m-</pre><p>[m
[31m-the search for a Lua file for module <code>foo</code>[m
[31m-will try to open the files[m
[31m-<code>./foo.lua</code>, <code>./foo.lc</code>, and[m
[31m-<code>/usr/local/foo/init.lua</code>, in that order.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The third searcher looks for a loader as a C&nbsp;library,[m
[31m-using the path given by the variable <a href="#pdf-package.cpath"><code>package.cpath</code></a>.[m
[31m-For instance,[m
[31m-if the C&nbsp;path is the string[m
[31m-[m
[31m-<pre>[m
[31m-     "./?.so;./?.dll;/usr/local/?/init.so"[m
[31m-</pre><p>[m
[31m-the searcher for module <code>foo</code>[m
[31m-will try to open the files <code>./foo.so</code>, <code>./foo.dll</code>,[m
[31m-and <code>/usr/local/foo/init.so</code>, in that order.[m
[31m-Once it finds a C&nbsp;library,[m
[31m-this searcher first uses a dynamic link facility to link the[m
[31m-application with the library.[m
[31m-Then it tries to find a C&nbsp;function inside the library to[m
[31m-be used as the loader.[m
[31m-The name of this C&nbsp;function is the string "<code>luaopen_</code>"[m
[31m-concatenated with a copy of the module name where each dot[m
[31m-is replaced by an underscore.[m
[31m-Moreover, if the module name has a hyphen,[m
[31m-its prefix up to (and including) the first hyphen is removed.[m
[31m-For instance, if the module name is <code>a.v1-b.c</code>,[m
[31m-the function name will be <code>luaopen_b_c</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The fourth searcher tries an <em>all-in-one loader</em>.[m
[31m-It searches the C&nbsp;path for a library for[m
[31m-the root name of the given module.[m
[31m-For instance, when requiring <code>a.b.c</code>,[m
[31m-it will search for a C&nbsp;library for <code>a</code>.[m
[31m-If found, it looks into it for an open function for[m
[31m-the submodule;[m
[31m-in our example, that would be <code>luaopen_a_b_c</code>.[m
[31m-With this facility, a package can pack several C&nbsp;submodules[m
[31m-into one single library,[m
[31m-with each submodule keeping its original open function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.loadlib"><code>package.loadlib (libname, funcname)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Dynamically links the host program with the C&nbsp;library <code>libname</code>.[m
[31m-Inside this library, looks for a function <code>funcname</code>[m
[31m-and returns this function as a C&nbsp;function.[m
[31m-(So, <code>funcname</code> must follow the protocol (see <a href="#lua_CFunction"><code>lua_CFunction</code></a>)).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This is a low-level function.[m
[31m-It completely bypasses the package and module system.[m
[31m-Unlike <a href="#pdf-require"><code>require</code></a>,[m
[31m-it does not perform any path searching and[m
[31m-does not automatically adds extensions.[m
[31m-<code>libname</code> must be the complete file name of the C&nbsp;library,[m
[31m-including if necessary a path and extension.[m
[31m-<code>funcname</code> must be the exact name exported by the C&nbsp;library[m
[31m-(which may depend on the C&nbsp;compiler and linker used).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is not supported by ANSI C.[m
[31m-As such, it is only available on some platforms[m
[31m-(Windows, Linux, Mac OS X, Solaris, BSD,[m
[31m-plus other Unix systems that support the <code>dlfcn</code> standard).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.path"><code>package.path</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The path used by <a href="#pdf-require"><code>require</code></a> to search for a Lua loader.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-At start-up, Lua initializes this variable with[m
[31m-the value of the environment variable <a name="pdf-LUA_PATH"><code>LUA_PATH</code></a> or[m
[31m-with a default path defined in <code>luaconf.h</code>,[m
[31m-if the environment variable is not defined.[m
[31m-Any "<code>;;</code>" in the value of the environment variable[m
[31m-is replaced by the default path.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.preload"><code>package.preload</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A table to store loaders for specific modules[m
[31m-(see <a href="#pdf-require"><code>require</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.seeall"><code>package.seeall (module)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets a metatable for <code>module</code> with[m
[31m-its <code>__index</code> field referring to the global environment,[m
[31m-so that this module inherits values[m
[31m-from the global environment.[m
[31m-To be used as an option to function <a href="#pdf-module"><code>module</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.4 - <a name="5.4">String Manipulation</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-This library provides generic functions for string manipulation,[m
[31m-such as finding and extracting substrings, and pattern matching.[m
[31m-When indexing a string in Lua, the first character is at position&nbsp;1[m
[31m-(not at&nbsp;0, as in C).[m
[31m-Indices are allowed to be negative and are interpreted as indexing backwards,[m
[31m-from the end of the string.[m
[31m-Thus, the last character is at position -1, and so on.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The string library provides all its functions inside the table[m
[31m-<a name="pdf-string"><code>string</code></a>.[m
[31m-It also sets a metatable for strings[m
[31m-where the <code>__index</code> field points to the <code>string</code> table.[m
[31m-Therefore, you can use the string functions in object-oriented style.[m
[31m-For instance, <code>string.byte(s, i)</code>[m
[31m-can be written as <code>s:byte(i)</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The string library assumes one-byte character encodings.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.byte"><code>string.byte (s [, i [, j]])</code></a></h3>[m
[31m-Returns the internal numerical codes of the characters <code>s[i]</code>,[m
[31m-<code>s[i+1]</code>, &middot;&middot;&middot;, <code>s[j]</code>.[m
[31m-The default value for <code>i</code> is&nbsp;1;[m
[31m-the default value for <code>j</code> is&nbsp;<code>i</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Note that numerical codes are not necessarily portable across platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.char"><code>string.char (&middot;&middot;&middot;)</code></a></h3>[m
[31m-Receives zero or more integers.[m
[31m-Returns a string with length equal to the number of arguments,[m
[31m-in which each character has the internal numerical code equal[m
[31m-to its corresponding argument.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Note that numerical codes are not necessarily portable across platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.dump"><code>string.dump (function)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a string containing a binary representation of the given function,[m
[31m-so that a later <a href="#pdf-loadstring"><code>loadstring</code></a> on this string returns[m
[31m-a copy of the function.[m
[31m-<code>function</code> must be a Lua function without upvalues.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.find"><code>string.find (s, pattern [, init [, plain]])</code></a></h3>[m
[31m-Looks for the first match of[m
[31m-<code>pattern</code> in the string <code>s</code>.[m
[31m-If it finds a match, then <code>find</code> returns the indices of&nbsp;<code>s</code>[m
[31m-where this occurrence starts and ends;[m
[31m-otherwise, it returns <b>nil</b>.[m
[31m-A third, optional numerical argument <code>init</code> specifies[m
[31m-where to start the search;[m
[31m-its default value is&nbsp;1 and can be negative.[m
[31m-A value of <b>true</b> as a fourth, optional argument <code>plain</code>[m
[31m-turns off the pattern matching facilities,[m
[31m-so the function does a plain "find substring" operation,[m
[31m-with no characters in <code>pattern</code> being considered "magic".[m
[31m-Note that if <code>plain</code> is given, then <code>init</code> must be given as well.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the pattern has captures,[m
[31m-then in a successful match[m
[31m-the captured values are also returned,[m
[31m-after the two indices.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.format"><code>string.format (formatstring, &middot;&middot;&middot;)</code></a></h3>[m
[31m-Returns a formatted version of its variable number of arguments[m
[31m-following the description given in its first argument (which must be a string).[m
[31m-The format string follows the same rules as the <code>printf</code> family of[m
[31m-standard C&nbsp;functions.[m
[31m-The only differences are that the options/modifiers[m
[31m-<code>*</code>, <code>l</code>, <code>L</code>, <code>n</code>, <code>p</code>,[m
[31m-and <code>h</code> are not supported[m
[31m-and that there is an extra option, <code>q</code>.[m
[31m-The <code>q</code> option formats a string in a form suitable to be safely read[m
[31m-back by the Lua interpreter:[m
[31m-the string is written between double quotes,[m
[31m-and all double quotes, newlines, embedded zeros,[m
[31m-and backslashes in the string[m
[31m-are correctly escaped when written.[m
[31m-For instance, the call[m
[31m-[m
[31m-<pre>[m
[31m-     string.format('%q', 'a string with "quotes" and \n new line')[m
[31m-</pre><p>[m
[31m-will produce the string:[m
[31m-[m
[31m-<pre>[m
[31m-     "a string with \"quotes\" and \[m
[31m-      new line"[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-The options <code>c</code>, <code>d</code>, <code>E</code>, <code>e</code>, <code>f</code>,[m
[31m-<code>g</code>, <code>G</code>, <code>i</code>, <code>o</code>, <code>u</code>, <code>X</code>, and <code>x</code> all[m
[31m-expect a number as argument,[m
[31m-whereas <code>q</code> and <code>s</code> expect a string.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function does not accept string values[m
[31m-containing embedded zeros,[m
[31m-except as arguments to the <code>q</code> option.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.gmatch"><code>string.gmatch (s, pattern)</code></a></h3>[m
[31m-Returns an iterator function that,[m
[31m-each time it is called,[m
[31m-returns the next captures from <code>pattern</code> over string <code>s</code>.[m
[31m-If <code>pattern</code> specifies no captures,[m
[31m-then the whole match is produced in each call.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an example, the following loop[m
[31m-[m
[31m-<pre>[m
[31m-     s = "hello world from Lua"[m
[31m-     for w in string.gmatch(s, "%a+") do[m
[31m-       print(w)[m
[31m-     end[m
[31m-</pre><p>[m
[31m-will iterate over all the words from string <code>s</code>,[m
[31m-printing one per line.[m
[31m-The next example collects all pairs <code>key=value</code> from the[m
[31m-given string into a table:[m
[31m-[m
[31m-<pre>[m
[31m-     t = {}[m
[31m-     s = "from=world, to=Lua"[m
[31m-     for k, v in string.gmatch(s, "(%w+)=(%w+)") do[m
[31m-       t[k] = v[m
[31m-     end[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-For this function, a '<code>^</code>' at the start of a pattern does not[m
[31m-work as an anchor, as this would prevent the iteration.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.gsub"><code>string.gsub (s, pattern, repl [, n])</code></a></h3>[m
[31m-Returns a copy of <code>s</code>[m
[31m-in which all (or the first <code>n</code>, if given)[m
[31m-occurrences of the <code>pattern</code> have been[m
[31m-replaced by a replacement string specified by <code>repl</code>,[m
[31m-which can be a string, a table, or a function.[m
[31m-<code>gsub</code> also returns, as its second value,[m
[31m-the total number of matches that occurred.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>repl</code> is a string, then its value is used for replacement.[m
[31m-The character&nbsp;<code>%</code> works as an escape character:[m
[31m-any sequence in <code>repl</code> of the form <code>%<em>n</em></code>,[m
[31m-with <em>n</em> between 1 and 9,[m
[31m-stands for the value of the <em>n</em>-th captured substring (see below).[m
[31m-The sequence <code>%0</code> stands for the whole match.[m
[31m-The sequence <code>%%</code> stands for a single&nbsp;<code>%</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>repl</code> is a table, then the table is queried for every match,[m
[31m-using the first capture as the key;[m
[31m-if the pattern specifies no captures,[m
[31m-then the whole match is used as the key.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>repl</code> is a function, then this function is called every time a[m
[31m-match occurs, with all captured substrings passed as arguments,[m
[31m-in order;[m
[31m-if the pattern specifies no captures,[m
[31m-then the whole match is passed as a sole argument.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the value returned by the table query or by the function call[m
[31m-is a string or a number,[m
[31m-then it is used as the replacement string;[m
[31m-otherwise, if it is <b>false</b> or <b>nil</b>,[m
[31m-then there is no replacement[m
[31m-(that is, the original match is kept in the string).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Here are some examples:[m
[31m-[m
[31m-<pre>[m
[31m-     x = string.gsub("hello world", "(%w+)", "%1 %1")[m
[31m-     --&gt; x="hello hello world world"[m
[31m-     [m
[31m-     x = string.gsub("hello world", "%w+", "%0 %0", 1)[m
[31m-     --&gt; x="hello hello world"[m
[31m-     [m
[31m-     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")[m
[31m-     --&gt; x="world hello Lua from"[m
[31m-     [m
[31m-     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)[m
[31m-     --&gt; x="home = /home/roberto, user = roberto"[m
[31m-     [m
[31m-     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)[m
[31m-           return loadstring(s)()[m
[31m-         end)[m
[31m-     --&gt; x="4+5 = 9"[m
[31m-     [m
[31m-     local t = {name="lua", version="5.1"}[m
[31m-     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)[m
[31m-     --&gt; x="lua-5.1.tar.gz"[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.len"><code>string.len (s)</code></a></h3>[m
[31m-Receives a string and returns its length.[m
[31m-The empty string <code>""</code> has length 0.[m
[31m-Embedded zeros are counted,[m
[31m-so <code>"a\000bc\000"</code> has length 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.lower"><code>string.lower (s)</code></a></h3>[m
[31m-Receives a string and returns a copy of this string with all[m
[31m-uppercase letters changed to lowercase.[m
[31m-All other characters are left unchanged.[m
[31m-The definition of what an uppercase letter is depends on the current locale.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.match"><code>string.match (s, pattern [, init])</code></a></h3>[m
[31m-Looks for the first <em>match</em> of[m
[31m-<code>pattern</code> in the string <code>s</code>.[m
[31m-If it finds one, then <code>match</code> returns[m
[31m-the captures from the pattern;[m
[31m-otherwise it returns <b>nil</b>.[m
[31m-If <code>pattern</code> specifies no captures,[m
[31m-then the whole match is returned.[m
[31m-A third, optional numerical argument <code>init</code> specifies[m
[31m-where to start the search;[m
[31m-its default value is&nbsp;1 and can be negative.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.rep"><code>string.rep (s, n)</code></a></h3>[m
[31m-Returns a string that is the concatenation of <code>n</code> copies of[m
[31m-the string <code>s</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.reverse"><code>string.reverse (s)</code></a></h3>[m
[31m-Returns a string that is the string <code>s</code> reversed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.sub"><code>string.sub (s, i [, j])</code></a></h3>[m
[31m-Returns the substring of <code>s</code> that[m
[31m-starts at <code>i</code>  and continues until <code>j</code>;[m
[31m-<code>i</code> and <code>j</code> can be negative.[m
[31m-If <code>j</code> is absent, then it is assumed to be equal to -1[m
[31m-(which is the same as the string length).[m
[31m-In particular,[m
[31m-the call <code>string.sub(s,1,j)</code> returns a prefix of <code>s</code>[m
[31m-with length <code>j</code>,[m
[31m-and <code>string.sub(s, -i)</code> returns a suffix of <code>s</code>[m
[31m-with length <code>i</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.upper"><code>string.upper (s)</code></a></h3>[m
[31m-Receives a string and returns a copy of this string with all[m
[31m-lowercase letters changed to uppercase.[m
[31m-All other characters are left unchanged.[m
[31m-The definition of what a lowercase letter is depends on the current locale.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>5.4.1 - <a name="5.4.1">Patterns</a></h3>[m
[31m-[m
[31m-[m
[31m-<h4>Character Class:</h4><p>[m
[31m-A <em>character class</em> is used to represent a set of characters.[m
[31m-The following combinations are allowed in describing a character class:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b><em>x</em>:</b>[m
[31m-(where <em>x</em> is not one of the <em>magic characters</em>[m
[31m-<code>^$()%.[]*+-?</code>)[m
[31m-represents the character <em>x</em> itself.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>.</code>:</b> (a dot) represents all characters.</li>[m
[31m-[m
[31m-<li><b><code>%a</code>:</b> represents all letters.</li>[m
[31m-[m
[31m-<li><b><code>%c</code>:</b> represents all control characters.</li>[m
[31m-[m
[31m-<li><b><code>%d</code>:</b> represents all digits.</li>[m
[31m-[m
[31m-<li><b><code>%l</code>:</b> represents all lowercase letters.</li>[m
[31m-[m
[31m-<li><b><code>%p</code>:</b> represents all punctuation characters.</li>[m
[31m-[m
[31m-<li><b><code>%s</code>:</b> represents all space characters.</li>[m
[31m-[m
[31m-<li><b><code>%u</code>:</b> represents all uppercase letters.</li>[m
[31m-[m
[31m-<li><b><code>%w</code>:</b> represents all alphanumeric characters.</li>[m
[31m-[m
[31m-<li><b><code>%x</code>:</b> represents all hexadecimal digits.</li>[m
[31m-[m
[31m-<li><b><code>%z</code>:</b> represents the character with representation 0.</li>[m
[31m-[m
[31m-<li><b><code>%<em>x</em></code>:</b> (where <em>x</em> is any non-alphanumeric character)[m
[31m-represents the character <em>x</em>.[m
[31m-This is the standard way to escape the magic characters.[m
[31m-Any punctuation character (even the non magic)[m
[31m-can be preceded by a '<code>%</code>'[m
[31m-when used to represent itself in a pattern.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>[<em>set</em>]</code>:</b>[m
[31m-represents the class which is the union of all[m
[31m-characters in <em>set</em>.[m
[31m-A range of characters can be specified by[m
[31m-separating the end characters of the range with a '<code>-</code>'.[m
[31m-All classes <code>%</code><em>x</em> described above can also be used as[m
[31m-components in <em>set</em>.[m
[31m-All other characters in <em>set</em> represent themselves.[m
[31m-For example, <code>[%w_]</code> (or <code>[_%w]</code>)[m
[31m-represents all alphanumeric characters plus the underscore,[m
[31m-<code>[0-7]</code> represents the octal digits,[m
[31m-and <code>[0-7%l%-]</code> represents the octal digits plus[m
[31m-the lowercase letters plus the '<code>-</code>' character.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The interaction between ranges and classes is not defined.[m
[31m-Therefore, patterns like <code>[%a-z]</code> or <code>[a-%%]</code>[m
[31m-have no meaning.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>[^<em>set</em>]</code>:</b>[m
[31m-represents the complement of <em>set</em>,[m
[31m-where <em>set</em> is interpreted as above.[m
[31m-</li>[m
[31m-[m
[31m-</ul><p>[m
[31m-For all classes represented by single letters (<code>%a</code>, <code>%c</code>, etc.),[m
[31m-the corresponding uppercase letter represents the complement of the class.[m
[31m-For instance, <code>%S</code> represents all non-space characters.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The definitions of letter, space, and other character groups[m
[31m-depend on the current locale.[m
[31m-In particular, the class <code>[a-z]</code> may not be equivalent to <code>%l</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h4>Pattern Item:</h4><p>[m
[31m-A <em>pattern item</em> can be[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-a single character class,[m
[31m-which matches any single character in the class;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-a single character class followed by '<code>*</code>',[m
[31m-which matches 0 or more repetitions of characters in the class.[m
[31m-These repetition items will always match the longest possible sequence;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-a single character class followed by '<code>+</code>',[m
[31m-which matches 1 or more repetitions of characters in the class.[m
[31m-These repetition items will always match the longest possible sequence;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-a single character class followed by '<code>-</code>',[m
[31m-which also matches 0 or more repetitions of characters in the class.[m
[31m-Unlike '<code>*</code>',[m
[31m-these repetition items will always match the <em>shortest</em> possible sequence;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-a single character class followed by '<code>?</code>',[m
[31m-which matches 0 or 1 occurrence of a character in the class;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-<code>%<em>n</em></code>, for <em>n</em> between 1 and 9;[m
[31m-such item matches a substring equal to the <em>n</em>-th captured string[m
[31m-(see below);[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-<code>%b<em>xy</em></code>, where <em>x</em> and <em>y</em> are two distinct characters;[m
[31m-such item matches strings that start with&nbsp;<em>x</em>, end with&nbsp;<em>y</em>,[m
[31m-and where the <em>x</em> and <em>y</em> are <em>balanced</em>.[m
[31m-This means that, if one reads the string from left to right,[m
[31m-counting <em>+1</em> for an <em>x</em> and <em>-1</em> for a <em>y</em>,[m
[31m-the ending <em>y</em> is the first <em>y</em> where the count reaches 0.[m
[31m-For instance, the item <code>%b()</code> matches expressions with[m
[31m-balanced parentheses.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h4>Pattern:</h4><p>[m
[31m-A <em>pattern</em> is a sequence of pattern items.[m
[31m-A '<code>^</code>' at the beginning of a pattern anchors the match at the[m
[31m-beginning of the subject string.[m
[31m-A '<code>$</code>' at the end of a pattern anchors the match at the[m
[31m-end of the subject string.[m
[31m-At other positions,[m
[31m-'<code>^</code>' and '<code>$</code>' have no special meaning and represent themselves.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h4>Captures:</h4><p>[m
[31m-A pattern can contain sub-patterns enclosed in parentheses;[m
[31m-they describe <em>captures</em>.[m
[31m-When a match succeeds, the substrings of the subject string[m
[31m-that match captures are stored (<em>captured</em>) for future use.[m
[31m-Captures are numbered according to their left parentheses.[m
[31m-For instance, in the pattern <code>"(a*(.)%w(%s*))"</code>,[m
[31m-the part of the string matching <code>"a*(.)%w(%s*)"</code> is[m
[31m-stored as the first capture (and therefore has number&nbsp;1);[m
[31m-the character matching "<code>.</code>" is captured with number&nbsp;2,[m
[31m-and the part matching "<code>%s*</code>" has number&nbsp;3.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As a special case, the empty capture <code>()</code> captures[m
[31m-the current string position (a number).[m
[31m-For instance, if we apply the pattern <code>"()aa()"</code> on the[m
[31m-string <code>"flaaap"</code>, there will be two captures: 3&nbsp;and&nbsp;5.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A pattern cannot contain embedded zeros.  Use <code>%z</code> instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.5 - <a name="5.5">Table Manipulation</a></h2><p>[m
[31m-This library provides generic functions for table manipulation.[m
[31m-It provides all its functions inside the table <a name="pdf-table"><code>table</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Most functions in the table library assume that the table[m
[31m-represents an array or a list.[m
[31m-For these functions, when we talk about the "length" of a table[m
[31m-we mean the result of the length operator.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.concat"><code>table.concat (table [, sep [, i [, j]]])</code></a></h3>[m
[31m-Given an array where all elements are strings or numbers,[m
[31m-returns <code>table[i]..sep..table[i+1] &middot;&middot;&middot; sep..table[j]</code>.[m
[31m-The default value for <code>sep</code> is the empty string,[m
[31m-the default for <code>i</code> is 1,[m
[31m-and the default for <code>j</code> is the length of the table.[m
[31m-If <code>i</code> is greater than <code>j</code>, returns the empty string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.insert"><code>table.insert (table, [pos,] value)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Inserts element <code>value</code> at position <code>pos</code> in <code>table</code>,[m
[31m-shifting up other elements to open space, if necessary.[m
[31m-The default value for <code>pos</code> is <code>n+1</code>,[m
[31m-where <code>n</code> is the length of the table (see <a href="#2.5.5">&sect;2.5.5</a>),[m
[31m-so that a call <code>table.insert(t,x)</code> inserts <code>x</code> at the end[m
[31m-of table <code>t</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.maxn"><code>table.maxn (table)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the largest positive numerical index of the given table,[m
[31m-or zero if the table has no positive numerical indices.[m
[31m-(To do its job this function does a linear traversal of[m
[31m-the whole table.) [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.remove"><code>table.remove (table [, pos])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Removes from <code>table</code> the element at position <code>pos</code>,[m
[31m-shifting down other elements to close the space, if necessary.[m
[31m-Returns the value of the removed element.[m
[31m-The default value for <code>pos</code> is <code>n</code>,[m
[31m-where <code>n</code> is the length of the table,[m
[31m-so that a call <code>table.remove(t)</code> removes the last element[m
[31m-of table <code>t</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.sort"><code>table.sort (table [, comp])</code></a></h3>[m
[31m-Sorts table elements in a given order, <em>in-place</em>,[m
[31m-from <code>table[1]</code> to <code>table[n]</code>,[m
[31m-where <code>n</code> is the length of the table.[m
[31m-If <code>comp</code> is given,[m
[31m-then it must be a function that receives two table elements,[m
[31m-and returns true[m
[31m-when the first is less than the second[m
[31m-(so that <code>not comp(a[i+1],a[i])</code> will be true after the sort).[m
[31m-If <code>comp</code> is not given,[m
[31m-then the standard Lua operator <code>&lt;</code> is used instead.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The sort algorithm is not stable;[m
[31m-that is, elements considered equal by the given order[m
[31m-may have their relative positions changed by the sort.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.6 - <a name="5.6">Mathematical Functions</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-This library is an interface to the standard C&nbsp;math library.[m
[31m-It provides all its functions inside the table <a name="pdf-math"><code>math</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.abs"><code>math.abs (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the absolute value of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.acos"><code>math.acos (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the arc cosine of <code>x</code> (in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.asin"><code>math.asin (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the arc sine of <code>x</code> (in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.atan"><code>math.atan (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the arc tangent of <code>x</code> (in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.atan2"><code>math.atan2 (y, x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the arc tangent of <code>y/x</code> (in radians),[m
[31m-but uses the signs of both parameters to find the[m
[31m-quadrant of the result.[m
[31m-(It also handles correctly the case of <code>x</code> being zero.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.ceil"><code>math.ceil (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the smallest integer larger than or equal to <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.cos"><code>math.cos (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the cosine of <code>x</code> (assumed to be in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.cosh"><code>math.cosh (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the hyperbolic cosine of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.deg"><code>math.deg (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the angle <code>x</code> (given in radians) in degrees.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.exp"><code>math.exp (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the value <em>e<sup>x</sup></em>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.floor"><code>math.floor (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the largest integer smaller than or equal to <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.fmod"><code>math.fmod (x, y)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the remainder of the division of <code>x</code> by <code>y</code>[m
[31m-that rounds the quotient towards zero.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.frexp"><code>math.frexp (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>m</code> and <code>e</code> such that <em>x = m2<sup>e</sup></em>,[m
[31m-<code>e</code> is an integer and the absolute value of <code>m</code> is[m
[31m-in the range <em>[0.5, 1)</em>[m
[31m-(or zero when <code>x</code> is zero).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.huge"><code>math.huge</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The value <code>HUGE_VAL</code>,[m
[31m-a value larger than or equal to any other numerical value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.ldexp"><code>math.ldexp (m, e)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <em>m2<sup>e</sup></em> (<code>e</code> should be an integer).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.log"><code>math.log (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the natural logarithm of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.log10"><code>math.log10 (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the base-10 logarithm of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.max"><code>math.max (x, &middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the maximum value among its arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.min"><code>math.min (x, &middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the minimum value among its arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.modf"><code>math.modf (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns two numbers,[m
[31m-the integral part of <code>x</code> and the fractional part of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.pi"><code>math.pi</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The value of <em>pi</em>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.pow"><code>math.pow (x, y)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <em>x<sup>y</sup></em>.[m
[31m-(You can also use the expression <code>x^y</code> to compute this value.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.rad"><code>math.rad (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the angle <code>x</code> (given in degrees) in radians.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.random"><code>math.random ([m [, n]])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is an interface to the simple[m
[31m-pseudo-random generator function <code>rand</code> provided by ANSI&nbsp;C.[m
[31m-(No guarantees can be given for its statistical properties.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called without arguments,[m
[31m-returns a uniform pseudo-random real number[m
[31m-in the range <em>[0,1)</em>.  [m
[31m-When called with an integer number <code>m</code>,[m
[31m-<code>math.random</code> returns[m
[31m-a uniform pseudo-random integer in the range <em>[1, m]</em>.[m
[31m-When called with two integer numbers <code>m</code> and <code>n</code>,[m
[31m-<code>math.random</code> returns a uniform pseudo-random[m
[31m-integer in the range <em>[m, n]</em>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.randomseed"><code>math.randomseed (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets <code>x</code> as the "seed"[m
[31m-for the pseudo-random generator:[m
[31m-equal seeds produce equal sequences of numbers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.sin"><code>math.sin (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the sine of <code>x</code> (assumed to be in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.sinh"><code>math.sinh (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the hyperbolic sine of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.sqrt"><code>math.sqrt (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the square root of <code>x</code>.[m
[31m-(You can also use the expression <code>x^0.5</code> to compute this value.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.tan"><code>math.tan (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the tangent of <code>x</code> (assumed to be in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.tanh"><code>math.tanh (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the hyperbolic tangent of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.7 - <a name="5.7">Input and Output Facilities</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The I/O library provides two different styles for file manipulation.[m
[31m-The first one uses implicit file descriptors;[m
[31m-that is, there are operations to set a default input file and a[m
[31m-default output file,[m
[31m-and all input/output operations are over these default files.[m
[31m-The second style uses explicit file descriptors.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When using implicit file descriptors,[m
[31m-all operations are supplied by table <a name="pdf-io"><code>io</code></a>.[m
[31m-When using explicit file descriptors,[m
[31m-the operation <a href="#pdf-io.open"><code>io.open</code></a> returns a file descriptor[m
[31m-and then all operations are supplied as methods of the file descriptor.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The table <code>io</code> also provides[m
[31m-three predefined file descriptors with their usual meanings from C:[m
[31m-<a name="pdf-io.stdin"><code>io.stdin</code></a>, <a name="pdf-io.stdout"><code>io.stdout</code></a>, and <a name="pdf-io.stderr"><code>io.stderr</code></a>.[m
[31m-The I/O library never closes these files.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Unless otherwise stated,[m
[31m-all I/O functions return <b>nil</b> on failure[m
[31m-(plus an error message as a second result and[m
[31m-a system-dependent error code as a third result)[m
[31m-and some value different from <b>nil</b> on success.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.close"><code>io.close ([file])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <code>file:close()</code>.[m
[31m-Without a <code>file</code>, closes the default output file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.flush"><code>io.flush ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <code>file:flush</code> over the default output file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.input"><code>io.input ([file])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called with a file name, it opens the named file (in text mode),[m
[31m-and sets its handle as the default input file.[m
[31m-When called with a file handle,[m
[31m-it simply sets this file handle as the default input file.[m
[31m-When called without parameters,[m
[31m-it returns the current default input file.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In case of errors this function raises the error,[m
[31m-instead of returning an error code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.lines"><code>io.lines ([filename])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Opens the given file name in read mode[m
[31m-and returns an iterator function that,[m
[31m-each time it is called,[m
[31m-returns a new line from the file.[m
[31m-Therefore, the construction[m
[31m-[m
[31m-<pre>[m
[31m-     for line in io.lines(filename) do <em>body</em> end[m
[31m-</pre><p>[m
[31m-will iterate over all lines of the file.[m
[31m-When the iterator function detects the end of file,[m
[31m-it returns <b>nil</b> (to finish the loop) and automatically closes the file.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The call <code>io.lines()</code> (with no file name) is equivalent[m
[31m-to <code>io.input():lines()</code>;[m
[31m-that is, it iterates over the lines of the default input file.[m
[31m-In this case it does not close the file when the loop ends.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.open"><code>io.open (filename [, mode])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function opens a file,[m
[31m-in the mode specified in the string <code>mode</code>.[m
[31m-It returns a new file handle,[m
[31m-or, in case of errors, <b>nil</b> plus an error message.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <code>mode</code> string can be any of the following:[m
[31m-[m
[31m-<ul>[m
[31m-<li><b>"r":</b> read mode (the default);</li>[m
[31m-<li><b>"w":</b> write mode;</li>[m
[31m-<li><b>"a":</b> append mode;</li>[m
[31m-<li><b>"r+":</b> update mode, all previous data is preserved;</li>[m
[31m-<li><b>"w+":</b> update mode, all previous data is erased;</li>[m
[31m-<li><b>"a+":</b> append update mode, previous data is preserved,[m
[31m-  writing is only allowed at the end of file.</li>[m
[31m-</ul><p>[m
[31m-The <code>mode</code> string can also have a '<code>b</code>' at the end,[m
[31m-which is needed in some systems to open the file in binary mode.[m
[31m-This string is exactly what is used in the[m
[31m-standard&nbsp;C function <code>fopen</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.output"><code>io.output ([file])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#pdf-io.input"><code>io.input</code></a>, but operates over the default output file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.popen"><code>io.popen (prog [, mode])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Starts program <code>prog</code> in a separated process and returns[m
[31m-a file handle that you can use to read data from this program[m
[31m-(if <code>mode</code> is <code>"r"</code>, the default)[m
[31m-or to write data to this program[m
[31m-(if <code>mode</code> is <code>"w"</code>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is system dependent and is not available[m
[31m-on all platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.read"><code>io.read (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <code>io.input():read</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.tmpfile"><code>io.tmpfile ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a handle for a temporary file.[m
[31m-This file is opened in update mode[m
[31m-and it is automatically removed when the program ends.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.type"><code>io.type (obj)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Checks whether <code>obj</code> is a valid file handle.[m
[31m-Returns the string <code>"file"</code> if <code>obj</code> is an open file handle,[m
[31m-<code>"closed file"</code> if <code>obj</code> is a closed file handle,[m
[31m-or <b>nil</b> if <code>obj</code> is not a file handle.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.write"><code>io.write (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <code>io.output():write</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:close"><code>file:close ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Closes <code>file</code>.[m
[31m-Note that files are automatically closed when[m
[31m-their handles are garbage collected,[m
[31m-but that takes an unpredictable amount of time to happen.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:flush"><code>file:flush ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Saves any written data to <code>file</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:lines"><code>file:lines ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns an iterator function that,[m
[31m-each time it is called,[m
[31m-returns a new line from the file.[m
[31m-Therefore, the construction[m
[31m-[m
[31m-<pre>[m
[31m-     for line in file:lines() do <em>body</em> end[m
[31m-</pre><p>[m
[31m-will iterate over all lines of the file.[m
[31m-(Unlike <a href="#pdf-io.lines"><code>io.lines</code></a>, this function does not close the file[m
[31m-when the loop ends.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:read"><code>file:read (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Reads the file <code>file</code>,[m
[31m-according to the given formats, which specify what to read.[m
[31m-For each format,[m
[31m-the function returns a string (or a number) with the characters read,[m
[31m-or <b>nil</b> if it cannot read data with the specified format.[m
[31m-When called without formats,[m
[31m-it uses a default format that reads the entire next line[m
[31m-(see below).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The available formats are[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>"*n":</b>[m
[31m-reads a number;[m
[31m-this is the only format that returns a number instead of a string.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"*a":</b>[m
[31m-reads the whole file, starting at the current position.[m
[31m-On end of file, it returns the empty string.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"*l":</b>[m
[31m-reads the next line (skipping the end of line),[m
[31m-returning <b>nil</b> on end of file.[m
[31m-This is the default format.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><em>number</em>:</b>[m
[31m-reads a string with up to this number of characters,[m
[31m-returning <b>nil</b> on end of file.[m
[31m-If number is zero,[m
[31m-it reads nothing and returns an empty string,[m
[31m-or <b>nil</b> on end of file.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:seek"><code>file:seek ([whence] [, offset])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets and gets the file position,[m
[31m-measured from the beginning of the file,[m
[31m-to the position given by <code>offset</code> plus a base[m
[31m-specified by the string <code>whence</code>, as follows:[m
[31m-[m
[31m-<ul>[m
[31m-<li><b>"set":</b> base is position 0 (beginning of the file);</li>[m
[31m-<li><b>"cur":</b> base is current position;</li>[m
[31m-<li><b>"end":</b> base is end of file;</li>[m
[31m-</ul><p>[m
[31m-In case of success, function <code>seek</code> returns the final file position,[m
[31m-measured in bytes from the beginning of the file.[m
[31m-If this function fails, it returns <b>nil</b>,[m
[31m-plus a string describing the error.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The default value for <code>whence</code> is <code>"cur"</code>,[m
[31m-and for <code>offset</code> is 0.[m
[31m-Therefore, the call <code>file:seek()</code> returns the current[m
[31m-file position, without changing it;[m
[31m-the call <code>file:seek("set")</code> sets the position to the[m
[31m-beginning of the file (and returns 0);[m
[31m-and the call <code>file:seek("end")</code> sets the position to the[m
[31m-end of the file, and returns its size.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:setvbuf"><code>file:setvbuf (mode [, size])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the buffering mode for an output file.[m
[31m-There are three available modes:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>"no":</b>[m
[31m-no buffering; the result of any output operation appears immediately.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"full":</b>[m
[31m-full buffering; output operation is performed only[m
[31m-when the buffer is full (or when you explicitly <code>flush</code> the file[m
[31m-(see <a href="#pdf-io.flush"><code>io.flush</code></a>)).[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"line":</b>[m
[31m-line buffering; output is buffered until a newline is output[m
[31m-or there is any input from some special files[m
[31m-(such as a terminal device).[m
[31m-</li>[m
[31m-[m
[31m-</ul><p>[m
[31m-For the last two cases, <code>size</code>[m
[31m-specifies the size of the buffer, in bytes.[m
[31m-The default is an appropriate size.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:write"><code>file:write (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Writes the value of each of its arguments to[m
[31m-the <code>file</code>.[m
[31m-The arguments must be strings or numbers.[m
[31m-To write other values,[m
[31m-use <a href="#pdf-tostring"><code>tostring</code></a> or <a href="#pdf-string.format"><code>string.format</code></a> before <code>write</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.8 - <a name="5.8">Operating System Facilities</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-This library is implemented through table <a name="pdf-os"><code>os</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.clock"><code>os.clock ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns an approximation of the amount in seconds of CPU time[m
[31m-used by the program.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.date"><code>os.date ([format [, time]])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a string or a table containing date and time,[m
[31m-formatted according to the given string <code>format</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the <code>time</code> argument is present,[m
[31m-this is the time to be formatted[m
[31m-(see the <a href="#pdf-os.time"><code>os.time</code></a> function for a description of this value).[m
[31m-Otherwise, <code>date</code> formats the current time.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>format</code> starts with '<code>!</code>',[m
[31m-then the date is formatted in Coordinated Universal Time.[m
[31m-After this optional character,[m
[31m-if <code>format</code> is the string "<code>*t</code>",[m
[31m-then <code>date</code> returns a table with the following fields:[m
[31m-<code>year</code> (four digits), <code>month</code> (1--12), <code>day</code> (1--31),[m
[31m-<code>hour</code> (0--23), <code>min</code> (0--59), <code>sec</code> (0--61),[m
[31m-<code>wday</code> (weekday, Sunday is&nbsp;1),[m
[31m-<code>yday</code> (day of the year),[m
[31m-and <code>isdst</code> (daylight saving flag, a boolean).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>format</code> is not "<code>*t</code>",[m
[31m-then <code>date</code> returns the date as a string,[m
[31m-formatted according to the same rules as the C&nbsp;function <code>strftime</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called without arguments,[m
[31m-<code>date</code> returns a reasonable date and time representation that depends on[m
[31m-the host system and on the current locale[m
[31m-(that is, <code>os.date()</code> is equivalent to <code>os.date("%c")</code>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.difftime"><code>os.difftime (t2, t1)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the number of seconds from time <code>t1</code> to time <code>t2</code>.[m
[31m-In POSIX, Windows, and some other systems,[m
[31m-this value is exactly <code>t2</code><em>-</em><code>t1</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.execute"><code>os.execute ([command])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is equivalent to the C&nbsp;function <code>system</code>.[m
[31m-It passes <code>command</code> to be executed by an operating system shell.[m
[31m-It returns a status code, which is system-dependent.[m
[31m-If <code>command</code> is absent, then it returns nonzero if a shell is available[m
[31m-and zero otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.exit"><code>os.exit ([code])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Calls the C&nbsp;function <code>exit</code>,[m
[31m-with an optional <code>code</code>,[m
[31m-to terminate the host program.[m
[31m-The default value for <code>code</code> is the success code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.getenv"><code>os.getenv (varname)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the value of the process environment variable <code>varname</code>,[m
[31m-or <b>nil</b> if the variable is not defined.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.remove"><code>os.remove (filename)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Deletes the file or directory with the given name.[m
[31m-Directories must be empty to be removed.[m
[31m-If this function fails, it returns <b>nil</b>,[m
[31m-plus a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.rename"><code>os.rename (oldname, newname)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Renames file or directory named <code>oldname</code> to <code>newname</code>.[m
[31m-If this function fails, it returns <b>nil</b>,[m
[31m-plus a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.setlocale"><code>os.setlocale (locale [, category])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the current locale of the program.[m
[31m-<code>locale</code> is a string specifying a locale;[m
[31m-<code>category</code> is an optional string describing which category to change:[m
[31m-<code>"all"</code>, <code>"collate"</code>, <code>"ctype"</code>,[m
[31m-<code>"monetary"</code>, <code>"numeric"</code>, or <code>"time"</code>;[m
[31m-the default category is <code>"all"</code>.[m
[31m-The function returns the name of the new locale,[m
[31m-or <b>nil</b> if the request cannot be honored.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>locale</code> is the empty string,[m
[31m-the current locale is set to an implementation-defined native locale.[m
[31m-If <code>locale</code> is the string "<code>C</code>",[m
[31m-the current locale is set to the standard C locale.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called with <b>nil</b> as the first argument,[m
[31m-this function only returns the name of the current locale[m
[31m-for the given category.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.time"><code>os.time ([table])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the current time when called without arguments,[m
[31m-or a time representing the date and time specified by the given table.[m
[31m-This table must have fields <code>year</code>, <code>month</code>, and <code>day</code>,[m
[31m-and may have fields <code>hour</code>, <code>min</code>, <code>sec</code>, and <code>isdst</code>[m
[31m-(for a description of these fields, see the <a href="#pdf-os.date"><code>os.date</code></a> function).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The returned value is a number, whose meaning depends on your system.[m
[31m-In POSIX, Windows, and some other systems, this number counts the number[m
[31m-of seconds since some given start time (the "epoch").[m
[31m-In other systems, the meaning is not specified,[m
[31m-and the number returned by <code>time</code> can be used only as an argument to[m
[31m-<code>date</code> and <code>difftime</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.tmpname"><code>os.tmpname ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a string with a file name that can[m
[31m-be used for a temporary file.[m
[31m-The file must be explicitly opened before its use[m
[31m-and explicitly removed when no longer needed.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-On some systems (POSIX),[m
[31m-this function also creates a file with that name,[m
[31m-to avoid security risks.[m
[31m-(Someone else might create the file with wrong permissions[m
[31m-in the time between getting the name and creating the file.)[m
[31m-You still have to open the file to use it[m
[31m-and to remove it (even if you do not use it).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When possible,[m
[31m-you may prefer to use <a href="#pdf-io.tmpfile"><code>io.tmpfile</code></a>,[m
[31m-which automatically removes the file when the program ends.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.9 - <a name="5.9">The Debug Library</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-This library provides[m
[31m-the functionality of the debug interface to Lua programs.[m
[31m-You should exert care when using this library.[m
[31m-The functions provided here should be used exclusively for debugging[m
[31m-and similar tasks, such as profiling.[m
[31m-Please resist the temptation to use them as a[m
[31m-usual programming tool:[m
[31m-they can be very slow.[m
[31m-Moreover, several of these functions[m
[31m-violate some assumptions about Lua code[m
[31m-(e.g., that variables local to a function[m
[31m-cannot be accessed from outside or[m
[31m-that userdata metatables cannot be changed by Lua code)[m
[31m-and therefore can compromise otherwise secure code.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All functions in this library are provided[m
[31m-inside the <a name="pdf-debug"><code>debug</code></a> table.[m
[31m-All functions that operate over a thread[m
[31m-have an optional first argument which is the[m
[31m-thread to operate over.[m
[31m-The default is always the current thread.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.debug"><code>debug.debug ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Enters an interactive mode with the user,[m
[31m-running each string that the user enters.[m
[31m-Using simple commands and other debug facilities,[m
[31m-the user can inspect global and local variables,[m
[31m-change their values, evaluate expressions, and so on.[m
[31m-A line containing only the word <code>cont</code> finishes this function,[m
[31m-so that the caller continues its execution.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Note that commands for <code>debug.debug</code> are not lexically nested[m
[31m-within any function, and so have no direct access to local variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getfenv"><code>debug.getfenv (o)</code></a></h3>[m
[31m-Returns the environment of object <code>o</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.gethook"><code>debug.gethook ([thread])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the current hook settings of the thread, as three values:[m
[31m-the current hook function, the current hook mask,[m
[31m-and the current hook count[m
[31m-(as set by the <a href="#pdf-debug.sethook"><code>debug.sethook</code></a> function).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getinfo"><code>debug.getinfo ([thread,] function [, what])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a table with information about a function.[m
[31m-You can give the function directly,[m
[31m-or you can give a number as the value of <code>function</code>,[m
[31m-which means the function running at level <code>function</code> of the call stack[m
[31m-of the given thread:[m
[31m-level&nbsp;0 is the current function (<code>getinfo</code> itself);[m
[31m-level&nbsp;1 is the function that called <code>getinfo</code>;[m
[31m-and so on.[m
[31m-If <code>function</code> is a number larger than the number of active functions,[m
[31m-then <code>getinfo</code> returns <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The returned table can contain all the fields returned by <a href="#lua_getinfo"><code>lua_getinfo</code></a>,[m
[31m-with the string <code>what</code> describing which fields to fill in.[m
[31m-The default for <code>what</code> is to get all information available,[m
[31m-except the table of valid lines.[m
[31m-If present,[m
[31m-the option '<code>f</code>'[m
[31m-adds a field named <code>func</code> with the function itself.[m
[31m-If present,[m
[31m-the option '<code>L</code>'[m
[31m-adds a field named <code>activelines</code> with the table of[m
[31m-valid lines.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-For instance, the expression <code>debug.getinfo(1,"n").name</code> returns[m
[31m-a table with a name for the current function,[m
[31m-if a reasonable name can be found,[m
[31m-and the expression <code>debug.getinfo(print)</code>[m
[31m-returns a table with all available information[m
[31m-about the <a href="#pdf-print"><code>print</code></a> function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getlocal"><code>debug.getlocal ([thread,] level, local)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the name and the value of the local variable[m
[31m-with index <code>local</code> of the function at level <code>level</code> of the stack.[m
[31m-(The first parameter or local variable has index&nbsp;1, and so on,[m
[31m-until the last active local variable.)[m
[31m-The function returns <b>nil</b> if there is no local[m
[31m-variable with the given index,[m
[31m-and raises an error when called with a <code>level</code> out of range.[m
[31m-(You can call <a href="#pdf-debug.getinfo"><code>debug.getinfo</code></a> to check whether the level is valid.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Variable names starting with '<code>(</code>' (open parentheses)[m
[31m-represent internal variables[m
[31m-(loop control variables, temporaries, and C&nbsp;function locals).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getmetatable"><code>debug.getmetatable (object)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the metatable of the given <code>object</code>[m
[31m-or <b>nil</b> if it does not have a metatable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getregistry"><code>debug.getregistry ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the registry table (see <a href="#3.5">&sect;3.5</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getupvalue"><code>debug.getupvalue (func, up)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the name and the value of the upvalue[m
[31m-with index <code>up</code> of the function <code>func</code>.[m
[31m-The function returns <b>nil</b> if there is no upvalue with the given index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.setfenv"><code>debug.setfenv (object, table)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the environment of the given <code>object</code> to the given <code>table</code>.[m
[31m-Returns <code>object</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.sethook"><code>debug.sethook ([thread,] hook, mask [, count])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the given function as a hook.[m
[31m-The string <code>mask</code> and the number <code>count</code> describe[m
[31m-when the hook will be called.[m
[31m-The string mask may have the following characters,[m
[31m-with the given meaning:[m
[31m-[m
[31m-<ul>[m
[31m-<li><b><code>"c"</code>:</b> the hook is called every time Lua calls a function;</li>[m
[31m-<li><b><code>"r"</code>:</b> the hook is called every time Lua returns from a function;</li>[m
[31m-<li><b><code>"l"</code>:</b> the hook is called every time Lua enters a new line of code.</li>[m
[31m-</ul><p>[m
[31m-With a <code>count</code> different from zero,[m
[31m-the hook is called after every <code>count</code> instructions.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called without arguments,[m
[31m-<a href="#pdf-debug.sethook"><code>debug.sethook</code></a> turns off the hook.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When the hook is called, its first parameter is a string[m
[31m-describing the event that has triggered its call:[m
[31m-<code>"call"</code>, <code>"return"</code> (or <code>"tail return"</code>,[m
[31m-when simulating a return from a tail call),[m
[31m-<code>"line"</code>, and <code>"count"</code>.[m
[31m-For line events,[m
[31m-the hook also gets the new line number as its second parameter.[m
[31m-Inside a hook,[m
[31m-you can call <code>getinfo</code> with level&nbsp;2 to get more information about[m
[31m-the running function[m
[31m-(level&nbsp;0 is the <code>getinfo</code> function,[m
[31m-and level&nbsp;1 is the hook function),[m
[31m-unless the event is <code>"tail return"</code>.[m
[31m-In this case, Lua is only simulating the return,[m
[31m-and a call to <code>getinfo</code> will return invalid data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.setlocal"><code>debug.setlocal ([thread,] level, local, value)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function assigns the value <code>value</code> to the local variable[m
[31m-with index <code>local</code> of the function at level <code>level</code> of the stack.[m
[31m-The function returns <b>nil</b> if there is no local[m
[31m-variable with the given index,[m
[31m-and raises an error when called with a <code>level</code> out of range.[m
[31m-(You can call <code>getinfo</code> to check whether the level is valid.)[m
[31m-Otherwise, it returns the name of the local variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.setmetatable"><code>debug.setmetatable (object, table)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the metatable for the given <code>object</code> to the given <code>table</code>[m
[31m-(which can be <b>nil</b>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.setupvalue"><code>debug.setupvalue (func, up, value)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function assigns the value <code>value</code> to the upvalue[m
[31m-with index <code>up</code> of the function <code>func</code>.[m
[31m-The function returns <b>nil</b> if there is no upvalue[m
[31m-with the given index.[m
[31m-Otherwise, it returns the name of the upvalue.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.traceback"><code>debug.traceback ([thread,] [message [, level]])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a string with a traceback of the call stack.[m
[31m-An optional <code>message</code> string is appended[m
[31m-at the beginning of the traceback.[m
[31m-An optional <code>level</code> number tells at which level[m
[31m-to start the traceback[m
[31m-(default is 1, the function calling <code>traceback</code>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>6 - <a name="6">Lua Stand-alone</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-Although Lua has been designed as an extension language,[m
[31m-to be embedded in a host C&nbsp;program,[m
[31m-it is also frequently used as a stand-alone language.[m
[31m-An interpreter for Lua as a stand-alone language,[m
[31m-called simply <code>lua</code>,[m
[31m-is provided with the standard distribution.[m
[31m-The stand-alone interpreter includes[m
[31m-all standard libraries, including the debug library.[m
[31m-Its usage is:[m
[31m-[m
[31m-<pre>[m
[31m-     lua [options] [script [args]][m
[31m-</pre><p>[m
[31m-The options are:[m
[31m-[m
[31m-<ul>[m
[31m-<li><b><code>-e <em>stat</em></code>:</b> executes string <em>stat</em>;</li>[m
[31m-<li><b><code>-l <em>mod</em></code>:</b> "requires" <em>mod</em>;</li>[m
[31m-<li><b><code>-i</code>:</b> enters interactive mode after running <em>script</em>;</li>[m
[31m-<li><b><code>-v</code>:</b> prints version information;</li>[m
[31m-<li><b><code>--</code>:</b> stops handling options;</li>[m
[31m-<li><b><code>-</code>:</b> executes <code>stdin</code> as a file and stops handling options.</li>[m
[31m-</ul><p>[m
[31m-After handling its options, <code>lua</code> runs the given <em>script</em>,[m
[31m-passing to it the given <em>args</em> as string arguments.[m
[31m-When called without arguments,[m
[31m-<code>lua</code> behaves as <code>lua -v -i</code>[m
[31m-when the standard input (<code>stdin</code>) is a terminal,[m
[31m-and as <code>lua -</code> otherwise.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Before running any argument,[m
[31m-the interpreter checks for an environment variable <a name="pdf-LUA_INIT"><code>LUA_INIT</code></a>.[m
[31m-If its format is <code>@<em>filename</em></code>,[m
[31m-then <code>lua</code> executes the file.[m
[31m-Otherwise, <code>lua</code> executes the string itself.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All options are handled in order, except <code>-i</code>.[m
[31m-For instance, an invocation like[m
[31m-[m
[31m-<pre>[m
[31m-     $ lua -e'a=1' -e 'print(a)' script.lua[m
[31m-</pre><p>[m
[31m-will first set <code>a</code> to 1, then print the value of <code>a</code> (which is '<code>1</code>'),[m
[31m-and finally run the file <code>script.lua</code> with no arguments.[m
[31m-(Here <code>$</code> is the shell prompt. Your prompt may be different.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Before starting to run the script,[m
[31m-<code>lua</code> collects all arguments in the command line[m
[31m-in a global table called <code>arg</code>.[m
[31m-The script name is stored at index 0,[m
[31m-the first argument after the script name goes to index 1,[m
[31m-and so on.[m
[31m-Any arguments before the script name[m
[31m-(that is, the interpreter name plus the options)[m
[31m-go to negative indices.[m
[31m-For instance, in the call[m
[31m-[m
[31m-<pre>[m
[31m-     $ lua -la b.lua t1 t2[m
[31m-</pre><p>[m
[31m-the interpreter first runs the file <code>a.lua</code>,[m
[31m-then creates a table[m
[31m-[m
[31m-<pre>[m
[31m-     arg = { [-2] = "lua", [-1] = "-la",[m
[31m-             [0] = "b.lua",[m
[31m-             [1] = "t1", [2] = "t2" }[m
[31m-</pre><p>[m
[31m-and finally runs the file <code>b.lua</code>.[m
[31m-The script is called with <code>arg[1]</code>, <code>arg[2]</code>, &middot;&middot;&middot;[m
[31m-as arguments;[m
[31m-it can also access these arguments with the vararg expression '<code>...</code>'.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In interactive mode,[m
[31m-if you write an incomplete statement,[m
[31m-the interpreter waits for its completion[m
[31m-by issuing a different prompt.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the global variable <a name="pdf-_PROMPT"><code>_PROMPT</code></a> contains a string,[m
[31m-then its value is used as the prompt.[m
[31m-Similarly, if the global variable <a name="pdf-_PROMPT2"><code>_PROMPT2</code></a> contains a string,[m
[31m-its value is used as the secondary prompt[m
[31m-(issued during incomplete statements).[m
[31m-Therefore, both prompts can be changed directly on the command line[m
[31m-or in any Lua programs by assigning to <code>_PROMPT</code>.[m
[31m-See the next example:[m
[31m-[m
[31m-<pre>[m
[31m-     $ lua -e"_PROMPT='myprompt&gt; '" -i[m
[31m-</pre><p>[m
[31m-(The outer pair of quotes is for the shell,[m
[31m-the inner pair is for Lua.)[m
[31m-Note the use of <code>-i</code> to enter interactive mode;[m
[31m-otherwise,[m
[31m-the program would just end silently[m
[31m-right after the assignment to <code>_PROMPT</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To allow the use of Lua as a[m
[31m-script interpreter in Unix systems,[m
[31m-the stand-alone interpreter skips[m
[31m-the first line of a chunk if it starts with <code>#</code>.[m
[31m-Therefore, Lua scripts can be made into executable programs[m
[31m-by using <code>chmod +x</code> and the&nbsp;<code>#!</code> form,[m
[31m-as in[m
[31m-[m
[31m-<pre>[m
[31m-     #!/usr/local/bin/lua[m
[31m-</pre><p>[m
[31m-(Of course,[m
[31m-the location of the Lua interpreter may be different in your machine.[m
[31m-If <code>lua</code> is in your <code>PATH</code>,[m
[31m-then [m
[31m-[m
[31m-<pre>[m
[31m-     #!/usr/bin/env lua[m
[31m-</pre><p>[m
[31m-is a more portable solution.) [m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>7 - <a name="7">Incompatibilities with the Previous Version</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-Here we list the incompatibilities that you may find when moving a program[m
[31m-from Lua&nbsp;5.0 to Lua&nbsp;5.1.[m
[31m-You can avoid most of the incompatibilities compiling Lua with[m
[31m-appropriate options (see file <code>luaconf.h</code>).[m
[31m-However,[m
[31m-all these compatibility options will be removed in the next version of Lua.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>7.1 - <a name="7.1">Changes in the Language</a></h2>[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-The vararg system changed from the pseudo-argument <code>arg</code> with a[m
[31m-table with the extra arguments to the vararg expression.[m
[31m-(See compile-time option <code>LUA_COMPAT_VARARG</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-There was a subtle change in the scope of the implicit[m
[31m-variables of the <b>for</b> statement and for the <b>repeat</b> statement.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-The long string/long comment syntax (<code>[[<em>string</em>]]</code>)[m
[31m-does not allow nesting.[m
[31m-You can use the new syntax (<code>[=[<em>string</em>]=]</code>) in these cases.[m
[31m-(See compile-time option <code>LUA_COMPAT_LSTR</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>7.2 - <a name="7.2">Changes in the Libraries</a></h2>[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>string.gfind</code> was renamed <a href="#pdf-string.gmatch"><code>string.gmatch</code></a>.[m
[31m-(See compile-time option <code>LUA_COMPAT_GFIND</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-When <a href="#pdf-string.gsub"><code>string.gsub</code></a> is called with a function as its[m
[31m-third argument,[m
[31m-whenever this function returns <b>nil</b> or <b>false</b> the[m
[31m-replacement string is the whole match,[m
[31m-instead of the empty string.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>table.setn</code> was deprecated.[m
[31m-Function <code>table.getn</code> corresponds[m
[31m-to the new length operator (<code>#</code>);[m
[31m-use the operator instead of the function.[m
[31m-(See compile-time option <code>LUA_COMPAT_GETN</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>loadlib</code> was renamed <a href="#pdf-package.loadlib"><code>package.loadlib</code></a>.[m
[31m-(See compile-time option <code>LUA_COMPAT_LOADLIB</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>math.mod</code> was renamed <a href="#pdf-math.fmod"><code>math.fmod</code></a>.[m
[31m-(See compile-time option <code>LUA_COMPAT_MOD</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Functions <code>table.foreach</code> and <code>table.foreachi</code> are deprecated.[m
[31m-You can use a for loop with <code>pairs</code> or <code>ipairs</code> instead.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-There were substantial changes in function <a href="#pdf-require"><code>require</code></a> due to[m
[31m-the new module system.[m
[31m-However, the new behavior is mostly compatible with the old,[m
[31m-but <code>require</code> gets the path from <a href="#pdf-package.path"><code>package.path</code></a> instead[m
[31m-of from <code>LUA_PATH</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <a href="#pdf-collectgarbage"><code>collectgarbage</code></a> has different arguments.[m
[31m-Function <code>gcinfo</code> is deprecated;[m
[31m-use <code>collectgarbage("count")</code> instead.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>7.3 - <a name="7.3">Changes in the API</a></h2>[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-The <code>luaopen_*</code> functions (to open libraries)[m
[31m-cannot be called directly,[m
[31m-like a regular C function.[m
[31m-They must be called through Lua,[m
[31m-like a Lua function.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>lua_open</code> was replaced by <a href="#lua_newstate"><code>lua_newstate</code></a> to[m
[31m-allow the user to set a memory-allocation function.[m
[31m-You can use <a href="#luaL_newstate"><code>luaL_newstate</code></a> from the standard library to[m
[31m-create a state with a standard allocation function[m
[31m-(based on <code>realloc</code>).[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Functions <code>luaL_getn</code> and <code>luaL_setn</code>[m
[31m-(from the auxiliary library) are deprecated.[m
[31m-Use <a href="#lua_objlen"><code>lua_objlen</code></a> instead of <code>luaL_getn</code>[m
[31m-and nothing instead of <code>luaL_setn</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>luaL_openlib</code> was replaced by <a href="#luaL_register"><code>luaL_register</code></a>.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>luaL_checkudata</code> now throws an error when the given value[m
[31m-is not a userdata of the expected type.[m
[31m-(In Lua&nbsp;5.0 it returned <code>NULL</code>.)[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>8 - <a name="8">The Complete Syntax of Lua</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-Here is the complete syntax of Lua in extended BNF.[m
[31m-(It does not describe operator precedences.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-[m
[31m-	chunk ::= {stat [`<b>;</b>&acute;]} [laststat [`<b>;</b>&acute;]][m
[31m-[m
[31m-	block ::= chunk[m
[31m-[m
[31m-	stat ::=  varlist `<b>=</b>&acute; explist | [m
[31m-		 functioncall | [m
[31m-		 <b>do</b> block <b>end</b> | [m
[31m-		 <b>while</b> exp <b>do</b> block <b>end</b> | [m
[31m-		 <b>repeat</b> block <b>until</b> exp | [m
[31m-		 <b>if</b> exp <b>then</b> block {<b>elseif</b> exp <b>then</b> block} [<b>else</b> block] <b>end</b> | [m
[31m-		 <b>for</b> Name `<b>=</b>&acute; exp `<b>,</b>&acute; exp [`<b>,</b>&acute; exp] <b>do</b> block <b>end</b> | [m
[31m-		 <b>for</b> namelist <b>in</b> explist <b>do</b> block <b>end</b> | [m
[31m-		 <b>function</b> funcname funcbody | [m
[31m-		 <b>local</b> <b>function</b> Name funcbody | [m
[31m-		 <b>local</b> namelist [`<b>=</b>&acute; explist] [m
[31m-[m
[31m-	laststat ::= <b>return</b> [explist] | <b>break</b>[m
[31m-[m
[31m-	funcname ::= Name {`<b>.</b>&acute; Name} [`<b>:</b>&acute; Name][m
[31m-[m
[31m-	varlist ::= var {`<b>,</b>&acute; var}[m
[31m-[m
[31m-	var ::=  Name | prefixexp `<b>[</b>&acute; exp `<b>]</b>&acute; | prefixexp `<b>.</b>&acute; Name [m
[31m-[m
[31m-	namelist ::= Name {`<b>,</b>&acute; Name}[m
[31m-[m
[31m-	explist ::= {exp `<b>,</b>&acute;} exp[m
[31m-[m
[31m-	exp ::=  <b>nil</b> | <b>false</b> | <b>true</b> | Number | String | `<b>...</b>&acute; | function | [m
[31m-		 prefixexp | tableconstructor | exp binop exp | unop exp [m
[31m-[m
[31m-	prefixexp ::= var | functioncall | `<b>(</b>&acute; exp `<b>)</b>&acute;[m
[31m-[m
[31m-	functioncall ::=  prefixexp args | prefixexp `<b>:</b>&acute; Name args [m
[31m-[m
[31m-	args ::=  `<b>(</b>&acute; [explist] `<b>)</b>&acute; | tableconstructor | String [m
[31m-[m
[31m-	function ::= <b>function</b> funcbody[m
[31m-[m
[31m-	funcbody ::= `<b>(</b>&acute; [parlist] `<b>)</b>&acute; block <b>end</b>[m
[31m-[m
[31m-	parlist ::= namelist [`<b>,</b>&acute; `<b>...</b>&acute;] | `<b>...</b>&acute;[m
[31m-[m
[31m-	tableconstructor ::= `<b>{</b>&acute; [fieldlist] `<b>}</b>&acute;[m
[31m-[m
[31m-	fieldlist ::= field {fieldsep field} [fieldsep][m
[31m-[m
[31m-	field ::= `<b>[</b>&acute; exp `<b>]</b>&acute; `<b>=</b>&acute; exp | Name `<b>=</b>&acute; exp | exp[m
[31m-[m
[31m-	fieldsep ::= `<b>,</b>&acute; | `<b>;</b>&acute;[m
[31m-[m
[31m-	binop ::= `<b>+</b>&acute; | `<b>-</b>&acute; | `<b>*</b>&acute; | `<b>/</b>&acute; | `<b>^</b>&acute; | `<b>%</b>&acute; | `<b>..</b>&acute; | [m
[31m-		 `<b>&lt;</b>&acute; | `<b>&lt;=</b>&acute; | `<b>&gt;</b>&acute; | `<b>&gt;=</b>&acute; | `<b>==</b>&acute; | `<b>~=</b>&acute; | [m
[31m-		 <b>and</b> | <b>or</b>[m
[31m-[m
[31m-	unop ::= `<b>-</b>&acute; | <b>not</b> | `<b>#</b>&acute;[m
[31m-[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<HR>[m
[31m-<SMALL CLASS="footer">[m
[31m-Last update:[m
[31m-Mon Feb 13 18:54:19 BRST 2012[m
[31m-</SMALL>[m
[31m-<!--[m
[31m-Last change: revised for Lua 5.1.5[m
[31m--->[m
[31m-[m
[31m-</body></html>[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/readme.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/readme.html[m
[1mdeleted file mode 100644[m
[1mindex 3ed6a81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/doc/readme.html[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-<HTML>[m
[31m-<HEAD>[m
[31m-<TITLE>Lua documentation</TITLE>[m
[31m-<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">[m
[31m-</HEAD>[m
[31m-[m
[31m-<BODY>[m
[31m-[m
[31m-<HR>[m
[31m-<H1>[m
[31m-<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua" BORDER=0></A>[m
[31m-Documentation[m
[31m-</H1>[m
[31m-[m
[31m-This is the documentation included in the source distribution of Lua 5.1.5.[m
[31m-[m
[31m-<UL>[m
[31m-<LI><A HREF="contents.html">Reference manual</A>[m
[31m-<LI><A HREF="lua.html">lua man page</A>[m
[31m-<LI><A HREF="luac.html">luac man page</A>[m
[31m-<LI><A HREF="../README">lua/README</A>[m
[31m-<LI><A HREF="../etc/README">lua/etc/README</A>[m
[31m-<LI><A HREF="../test/README">lua/test/README</A>[m
[31m-</UL>[m
[31m-[m
[31m-Lua's[m
[31m-<A HREF="http://www.lua.org/">official web site</A>[m
[31m-contains updated documentation,[m
[31m-especially the[m
[31m-<A HREF="http://www.lua.org/manual/5.1/">reference manual</A>.[m
[31m-<P>[m
[31m-[m
[31m-<HR>[m
[31m-<SMALL>[m
[31m-Last update:[m
[31m-Fri Feb  3 09:44:42 BRST 2012[m
[31m-</SMALL>[m
[31m-[m
[31m-</BODY>[m
[31m-</HTML>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 6d00008..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-# makefile for Lua etc[m
[31m-[m
[31m-TOP= ..[m
[31m-LIB= $(TOP)/src[m
[31m-INC= $(TOP)/src[m
[31m-BIN= $(TOP)/src[m
[31m-SRC= $(TOP)/src[m
[31m-TST= $(TOP)/test[m
[31m-[m
[31m-CC= gcc[m
[31m-CFLAGS= -O2 -Wall -I$(INC) $(MYCFLAGS)[m
[31m-MYCFLAGS= [m
[31m-MYLDFLAGS= -Wl,-E[m
[31m-MYLIBS= -lm[m
[31m-#MYLIBS= -lm -Wl,-E -ldl -lreadline -lhistory -lncurses[m
[31m-RM= rm -f[m
[31m-[m
[31m-default:[m
[31m-	@echo 'Please choose a target: min noparser one strict clean'[m
[31m-[m
[31m-min:	min.c[m
[31m-	$(CC) $(CFLAGS) $@.c -L$(LIB) -llua $(MYLIBS)[m
[31m-	echo 'print"Hello there!"' | ./a.out[m
[31m-[m
[31m-noparser: noparser.o[m
[31m-	$(CC) noparser.o $(SRC)/lua.o -L$(LIB) -llua $(MYLIBS)[m
[31m-	$(BIN)/luac $(TST)/hello.lua[m
[31m-	-./a.out luac.out[m
[31m-	-./a.out -e'a=1'[m
[31m-[m
[31m-one:[m
[31m-	$(CC) $(CFLAGS) all.c $(MYLIBS)[m
[31m-	./a.out $(TST)/hello.lua[m
[31m-[m
[31m-strict:[m
[31m-	-$(BIN)/lua -e 'print(a);b=2'[m
[31m-	-$(BIN)/lua -lstrict -e 'print(a)'[m
[31m-	-$(BIN)/lua -e 'function f() b=2 end f()'[m
[31m-	-$(BIN)/lua -lstrict -e 'function f() b=2 end f()'[m
[31m-[m
[31m-clean:[m
[31m-	$(RM) a.out core core.* *.o luac.out[m
[31m-[m
[31m-.PHONY:	default min noparser one strict clean[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/README[m
[1mdeleted file mode 100644[m
[1mindex 5149fc9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/README[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-This directory contains some useful files and code.[m
[31m-Unlike the code in ../src, everything here is in the public domain.[m
[31m-[m
[31m-If any of the makes fail, you're probably not using the same libraries[m
[31m-used to build Lua. Set MYLIBS in Makefile accordingly.[m
[31m-[m
[31m-all.c[m
[31m-	Full Lua interpreter in a single file.[m
[31m-	Do "make one" for a demo.[m
[31m-[m
[31m-lua.hpp[m
[31m-	Lua header files for C++ using 'extern "C"'.[m
[31m-[m
[31m-lua.ico[m
[31m-	A Lua icon for Windows (and web sites: save as favicon.ico).[m
[31m-	Drawn by hand by Markus Gritsch <gritsch@iue.tuwien.ac.at>.[m
[31m-[m
[31m-lua.pc[m
[31m-	pkg-config data for Lua[m
[31m-[m
[31m-luavs.bat[m
[31m-	Script to build Lua under "Visual Studio .NET Command Prompt".[m
[31m-	Run it from the toplevel as etc\luavs.bat.[m
[31m-[m
[31m-min.c[m
[31m-	A minimal Lua interpreter.[m
[31m-	Good for learning and for starting your own.[m
[31m-	Do "make min" for a demo.[m
[31m-[m
[31m-noparser.c[m
[31m-	Linking with noparser.o avoids loading the parsing modules in lualib.a.[m
[31m-	Do "make noparser" for a demo.[m
[31m-[m
[31m-strict.lua[m
[31m-	Traps uses of undeclared global variables.[m
[31m-	Do "make strict" for a demo.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/all.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/all.c[m
[1mdeleted file mode 100644[m
[1mindex dab68fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/all.c[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-/*[m
[31m-* all.c -- Lua core, libraries and interpreter in a single file[m
[31m-*/[m
[31m-[m
[31m-#define luaall_c[m
[31m-[m
[31m-#include "lapi.c"[m
[31m-#include "lcode.c"[m
[31m-#include "ldebug.c"[m
[31m-#include "ldo.c"[m
[31m-#include "ldump.c"[m
[31m-#include "lfunc.c"[m
[31m-#include "lgc.c"[m
[31m-#include "llex.c"[m
[31m-#include "lmem.c"[m
[31m-#include "lobject.c"[m
[31m-#include "lopcodes.c"[m
[31m-#include "lparser.c"[m
[31m-#include "lstate.c"[m
[31m-#include "lstring.c"[m
[31m-#include "ltable.c"[m
[31m-#include "ltm.c"[m
[31m-#include "lundump.c"[m
[31m-#include "lvm.c"[m
[31m-#include "lzio.c"[m
[31m-[m
[31m-#include "lauxlib.c"[m
[31m-#include "lbaselib.c"[m
[31m-#include "ldblib.c"[m
[31m-#include "liolib.c"[m
[31m-#include "linit.c"[m
[31m-#include "lmathlib.c"[m
[31m-#include "loadlib.c"[m
[31m-#include "loslib.c"[m
[31m-#include "lstrlib.c"[m
[31m-#include "ltablib.c"[m
[31m-[m
[31m-#include "lua.c"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.hpp b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.hpp[m
[1mdeleted file mode 100644[m
[1mindex ec417f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.hpp[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-// lua.hpp[m
[31m-// Lua header files for C++[m
[31m-// <<extern "C">> not supplied automatically because Lua also compiles as C++[m
[31m-[m
[31m-extern "C" {[m
[31m-#include "lua.h"[m
[31m-#include "lualib.h"[m
[31m-#include "lauxlib.h"[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.ico b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.ico[m
[1mdeleted file mode 100644[m
[1mindex ccbabc4..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.ico and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.pc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.pc[m
[1mdeleted file mode 100644[m
[1mindex 07e2852..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/lua.pc[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-# lua.pc -- pkg-config data for Lua[m
[31m-[m
[31m-# vars from install Makefile[m
[31m-[m
[31m-# grep '^V=' ../Makefile[m
[31m-V= 5.1[m
[31m-# grep '^R=' ../Makefile[m
[31m-R= 5.1.5[m
[31m-[m
[31m-# grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/'[m
[31m-prefix= /usr/local[m
[31m-INSTALL_BIN= ${prefix}/bin[m
[31m-INSTALL_INC= ${prefix}/include[m
[31m-INSTALL_LIB= ${prefix}/lib[m
[31m-INSTALL_MAN= ${prefix}/man/man1[m
[31m-INSTALL_LMOD= ${prefix}/share/lua/${V}[m
[31m-INSTALL_CMOD= ${prefix}/lib/lua/${V}[m
[31m-[m
[31m-# canonical vars[m
[31m-exec_prefix=${prefix}[m
[31m-libdir=${exec_prefix}/lib[m
[31m-includedir=${prefix}/include[m
[31m-[m
[31m-Name: Lua[m
[31m-Description: An Extensible Extension Language[m
[31m-Version: ${R}[m
[31m-Requires: [m
[31m-Libs: -L${libdir} -llua -lm[m
[31m-Cflags: -I${includedir}[m
[31m-[m
[31m-# (end of lua.pc)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/luavs.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/luavs.bat[m
[1mdeleted file mode 100644[m
[1mindex 08c2bed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/luavs.bat[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-@rem Script to build Lua under "Visual Studio .NET Command Prompt".[m
[31m-@rem Do not run from this directory; run it from the toplevel: etc\luavs.bat .[m
[31m-@rem It creates lua51.dll, lua51.lib, lua.exe, and luac.exe in src.[m
[31m-@rem (contributed by David Manura and Mike Pall)[m
[31m-[m
[31m-@setlocal[m
[31m-@set MYCOMPILE=cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set MYLINK=link /nologo[m
[31m-@set MYMT=mt /nologo[m
[31m-[m
[31m-cd src[m
[31m-%MYCOMPILE% /DLUA_BUILD_AS_DLL l*.c[m
[31m-del lua.obj luac.obj[m
[31m-%MYLINK% /DLL /out:lua51.dll l*.obj[m
[31m-if exist lua51.dll.manifest^[m
[31m-  %MYMT% -manifest lua51.dll.manifest -outputresource:lua51.dll;2[m
[31m-%MYCOMPILE% /DLUA_BUILD_AS_DLL lua.c[m
[31m-%MYLINK% /out:lua.exe lua.obj lua51.lib[m
[31m-if exist lua.exe.manifest^[m
[31m-  %MYMT% -manifest lua.exe.manifest -outputresource:lua.exe[m
[31m-%MYCOMPILE% l*.c print.c[m
[31m-del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathlib.obj^[m
[31m-    loslib.obj ltablib.obj lstrlib.obj loadlib.obj[m
[31m-%MYLINK% /out:luac.exe *.obj[m
[31m-if exist luac.exe.manifest^[m
[31m-  %MYMT% -manifest luac.exe.manifest -outputresource:luac.exe[m
[31m-del *.obj *.manifest[m
[31m-cd ..[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/min.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/min.c[m
[1mdeleted file mode 100644[m
[1mindex 6a85a4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/min.c[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-/*[m
[31m-* min.c -- a minimal Lua interpreter[m
[31m-* loads stdin only with minimal error handling.[m
[31m-* no interaction, and no standard library, only a "print" function.[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-static int print(lua_State *L)[m
[31m-{[m
[31m- int n=lua_gettop(L);[m
[31m- int i;[m
[31m- for (i=1; i<=n; i++)[m
[31m- {[m
[31m-  if (i>1) printf("\t");[m
[31m-  if (lua_isstring(L,i))[m
[31m-   printf("%s",lua_tostring(L,i));[m
[31m-  else if (lua_isnil(L,i))[m
[31m-   printf("%s","nil");[m
[31m-  else if (lua_isboolean(L,i))[m
[31m-   printf("%s",lua_toboolean(L,i) ? "true" : "false");[m
[31m-  else[m
[31m-   printf("%s:%p",luaL_typename(L,i),lua_topointer(L,i));[m
[31m- }[m
[31m- printf("\n");[m
[31m- return 0;[m
[31m-}[m
[31m-[m
[31m-int main(void)[m
[31m-{[m
[31m- lua_State *L=lua_open();[m
[31m- lua_register(L,"print",print);[m
[31m- if (luaL_dofile(L,NULL)!=0) fprintf(stderr,"%s\n",lua_tostring(L,-1));[m
[31m- lua_close(L);[m
[31m- return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/noparser.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/noparser.c[m
[1mdeleted file mode 100644[m
[1mindex 13ba546..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/noparser.c[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-/*[m
[31m-* The code below can be used to make a Lua core that does not contain the[m
[31m-* parsing modules (lcode, llex, lparser), which represent 35% of the total core.[m
[31m-* You'll only be able to load binary files and strings, precompiled with luac.[m
[31m-* (Of course, you'll have to build luac with the original parsing modules!)[m
[31m-*[m
[31m-* To use this module, simply compile it ("make noparser" does that) and list[m
[31m-* its object file before the Lua libraries. The linker should then not load[m
[31m-* the parsing modules. To try it, do "make luab".[m
[31m-*[m
[31m-* If you also want to avoid the dump module (ldump.o), define NODUMP.[m
[31m-* #define NODUMP[m
[31m-*/[m
[31m-[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "llex.h"[m
[31m-#include "lparser.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-LUAI_FUNC void luaX_init (lua_State *L) {[m
[31m-  UNUSED(L);[m
[31m-}[m
[31m-[m
[31m-LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {[m
[31m-  UNUSED(z);[m
[31m-  UNUSED(buff);[m
[31m-  UNUSED(name);[m
[31m-  lua_pushliteral(L,"parser not loaded");[m
[31m-  lua_error(L);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#ifdef NODUMP[m
[31m-#include "lundump.h"[m
[31m-[m
[31m-LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) {[m
[31m-  UNUSED(f);[m
[31m-  UNUSED(w);[m
[31m-  UNUSED(data);[m
[31m-  UNUSED(strip);[m
[31m-#if 1[m
[31m-  UNUSED(L);[m
[31m-  return 0;[m
[31m-#else[m
[31m-  lua_pushliteral(L,"dumper not loaded");[m
[31m-  lua_error(L);[m
[31m-#endif[m
[31m-}[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/strict.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/strict.lua[m
[1mdeleted file mode 100644[m
[1mindex 604619d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/etc/strict.lua[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m---[m
[31m--- strict.lua[m
[31m--- checks uses of undeclared global variables[m
[31m--- All global variables must be 'declared' through a regular assignment[m
[31m--- (even assigning nil will do) in a main chunk before being used[m
[31m--- anywhere or assigned to inside a function.[m
[31m---[m
[31m-[m
[31m-local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget[m
[31m-[m
[31m-local mt = getmetatable(_G)[m
[31m-if mt == nil then[m
[31m-  mt = {}[m
[31m-  setmetatable(_G, mt)[m
[31m-end[m
[31m-[m
[31m-mt.__declared = {}[m
[31m-[m
[31m-local function what ()[m
[31m-  local d = getinfo(3, "S")[m
[31m-  return d and d.what or "C"[m
[31m-end[m
[31m-[m
[31m-mt.__newindex = function (t, n, v)[m
[31m-  if not mt.__declared[n] then[m
[31m-    local w = what()[m
[31m-    if w ~= "main" and w ~= "C" then[m
[31m-      error("assign to undeclared variable '"..n.."'", 2)[m
[31m-    end[m
[31m-    mt.__declared[n] = true[m
[31m-  end[m
[31m-  rawset(t, n, v)[m
[31m-end[m
[31m-  [m
[31m-mt.__index = function (t, n)[m
[31m-  if not mt.__declared[n] and what() ~= "C" then[m
[31m-    error("variable '"..n.."' is not declared", 2)[m
[31m-  end[m
[31m-  return rawget(t, n)[m
[31m-end[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 60fec1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,182 +0,0 @@[m
[31m-# makefile for building Lua[m
[31m-# see ../INSTALL for installation instructions[m
[31m-# see ../Makefile and luaconf.h for further customization[m
[31m-[m
[31m-# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================[m
[31m-[m
[31m-# Your platform. See PLATS for possible values.[m
[31m-PLAT= none[m
[31m-[m
[31m-CC= gcc[m
[31m-CFLAGS= -g -O2 -Wall $(MYCFLAGS)[m
[31m-AR= ar rcu[m
[31m-RANLIB= ranlib[m
[31m-RM= rm -f[m
[31m-LIBS= -lm $(MYLIBS)[m
[31m-[m
[31m-MYCFLAGS=[m
[31m-MYLDFLAGS=[m
[31m-MYLIBS=[m
[31m-[m
[31m-# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE =========[m
[31m-[m
[31m-PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris[m
[31m-[m
[31m-LUA_A=	liblua.a[m
[31m-CORE_O=	lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \[m
[31m-	lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o  \[m
[31m-	lundump.o lvm.o lzio.o[m
[31m-LIB_O=	lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \[m
[31m-	lstrlib.o loadlib.o linit.o[m
[31m-[m
[31m-LUA_T=	lua[m
[31m-LUA_O=	lua.o[m
[31m-[m
[31m-LUAC_T=	luac[m
[31m-LUAC_O=	luac.o print.o[m
[31m-[m
[31m-ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)[m
[31m-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)[m
[31m-ALL_A= $(LUA_A)[m
[31m-[m
[31m-default: $(PLAT)[m
[31m-[m
[31m-all:	$(ALL_T)[m
[31m-[m
[31m-o:	$(ALL_O)[m
[31m-[m
[31m-a:	$(ALL_A)[m
[31m-[m
[31m-$(LUA_A): $(CORE_O) $(LIB_O)[m
[31m-	$(AR) $@ $(CORE_O) $(LIB_O)	# DLL needs all object files[m
[31m-	$(RANLIB) $@[m
[31m-[m
[31m-$(LUA_T): $(LUA_O) $(LUA_A)[m
[31m-	$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)[m
[31m-[m
[31m-$(LUAC_T): $(LUAC_O) $(LUA_A)[m
[31m-	$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)[m
[31m-[m
[31m-clean:[m
[31m-	$(RM) $(ALL_T) $(ALL_O)[m
[31m-[m
[31m-depend:[m
[31m-	@$(CC) $(CFLAGS) -MM l*.c print.c[m
[31m-[m
[31m-echo:[m
[31m-	@echo "PLAT = $(PLAT)"[m
[31m-	@echo "CC = $(CC)"[m
[31m-	@echo "CFLAGS = $(CFLAGS)"[m
[31m-	@echo "AR = $(AR)"[m
[31m-	@echo "RANLIB = $(RANLIB)"[m
[31m-	@echo "RM = $(RM)"[m
[31m-	@echo "MYCFLAGS = $(MYCFLAGS)"[m
[31m-	@echo "MYLDFLAGS = $(MYLDFLAGS)"[m
[31m-	@echo "MYLIBS = $(MYLIBS)"[m
[31m-[m
[31m-# convenience targets for popular platforms[m
[31m-[m
[31m-none:[m
[31m-	@echo "Please choose a platform:"[m
[31m-	@echo "   $(PLATS)"[m
[31m-[m
[31m-aix:[m
[31m-	$(MAKE) all CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall"[m
[31m-[m
[31m-ansi:[m
[31m-	$(MAKE) all MYCFLAGS=-DLUA_ANSI[m
[31m-[m
[31m-bsd:[m
[31m-	$(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-Wl,-E"[m
[31m-[m
[31m-freebsd:[m
[31m-	$(MAKE) all MYCFLAGS="-DLUA_USE_LINUX" MYLIBS="-Wl,-E -lreadline"[m
[31m-[m
[31m-generic:[m
[31m-	$(MAKE) all MYCFLAGS=[m
[31m-[m
[31m-linux:[m
[31m-	$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"[m
[31m-[m
[31m-macosx:[m
[31m-	$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline"[m
[31m-# use this on Mac OS X 10.3-[m
[31m-#	$(MAKE) all MYCFLAGS=-DLUA_USE_MACOSX[m
[31m-[m
[31m-mingw:[m
[31m-	$(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \[m
[31m-	"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \[m
[31m-	"MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe[m
[31m-	$(MAKE) "LUAC_T=luac.exe" luac.exe[m
[31m-[m
[31m-posix:[m
[31m-	$(MAKE) all MYCFLAGS=-DLUA_USE_POSIX[m
[31m-[m
[31m-solaris:[m
[31m-	$(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl"[m
[31m-[m
[31m-# list targets that do not create files (but not all makes understand .PHONY)[m
[31m-.PHONY: all $(PLATS) default o a clean depend echo none[m
[31m-[m
[31m-# DO NOT DELETE[m
[31m-[m
[31m-lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \[m
[31m-  lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \[m
[31m-  lundump.h lvm.h[m
[31m-lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h[m
[31m-lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \[m
[31m-  lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h \[m
[31m-  ltable.h[m
[31m-ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \[m
[31m-  llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \[m
[31m-  lfunc.h lstring.h lgc.h ltable.h lvm.h[m
[31m-ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \[m
[31m-  lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h \[m
[31m-  ltable.h lundump.h lvm.h[m
[31m-ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \[m
[31m-  lzio.h lmem.h lundump.h[m
[31m-lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \[m
[31m-  lstate.h ltm.h lzio.h[m
[31m-lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \[m
[31m-  lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h[m
[31m-linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h[m
[31m-liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \[m
[31m-  lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h[m
[31m-lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \[m
[31m-  ltm.h lzio.h lmem.h ldo.h[m
[31m-loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \[m
[31m-  ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h[m
[31m-lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h[m
[31m-loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \[m
[31m-  lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \[m
[31m-  lfunc.h lstring.h lgc.h ltable.h[m
[31m-lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \[m
[31m-  ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h[m
[31m-lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \[m
[31m-  ltm.h lzio.h lstring.h lgc.h[m
[31m-lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \[m
[31m-  ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h[m
[31m-ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \[m
[31m-  lmem.h lstring.h lgc.h ltable.h[m
[31m-lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \[m
[31m-  lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h \[m
[31m-  lundump.h[m
[31m-lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \[m
[31m-  llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h[m
[31m-lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \[m
[31m-  lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h[m
[31m-lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \[m
[31m-  lzio.h[m
[31m-print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \[m
[31m-  ltm.h lzio.h lmem.h lopcodes.h lundump.h[m
[31m-[m
[31m-# (end of Makefile)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lapi.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lapi.c[m
[1mdeleted file mode 100644[m
[1mindex 5d5145d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lapi.c[m
[1m+++ /dev/null[m
[36m@@ -1,1087 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $[m
[31m-** Lua API[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <assert.h>[m
[31m-#include <math.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lapi_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lapi.h"[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lundump.h"[m
[31m-#include "lvm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-const char lua_ident[] =[m
[31m-  "$Lua: " LUA_RELEASE " " LUA_COPYRIGHT " $\n"[m
[31m-  "$Authors: " LUA_AUTHORS " $\n"[m
[31m-  "$URL: www.lua.org $\n";[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define api_checknelems(L, n)	api_check(L, (n) <= (L->top - L->base))[m
[31m-[m
[31m-#define api_checkvalidindex(L, i)	api_check(L, (i) != luaO_nilobject)[m
[31m-[m
[31m-#define api_incr_top(L)   {api_check(L, L->top < L->ci->top); L->top++;}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static TValue *index2adr (lua_State *L, int idx) {[m
[31m-  if (idx > 0) {[m
[31m-    TValue *o = L->base + (idx - 1);[m
[31m-    api_check(L, idx <= L->ci->top - L->base);[m
[31m-    if (o >= L->top) return cast(TValue *, luaO_nilobject);[m
[31m-    else return o;[m
[31m-  }[m
[31m-  else if (idx > LUA_REGISTRYINDEX) {[m
[31m-    api_check(L, idx != 0 && -idx <= L->top - L->base);[m
[31m-    return L->top + idx;[m
[31m-  }[m
[31m-  else switch (idx) {  /* pseudo-indices */[m
[31m-    case LUA_REGISTRYINDEX: return registry(L);[m
[31m-    case LUA_ENVIRONINDEX: {[m
[31m-      Closure *func = curr_func(L);[m
[31m-      sethvalue(L, &L->env, func->c.env);[m
[31m-      return &L->env;[m
[31m-    }[m
[31m-    case LUA_GLOBALSINDEX: return gt(L);[m
[31m-    default: {[m
[31m-      Closure *func = curr_func(L);[m
[31m-      idx = LUA_GLOBALSINDEX - idx;[m
[31m-      return (idx <= func->c.nupvalues)[m
[31m-                ? &func->c.upvalue[idx-1][m
[31m-                : cast(TValue *, luaO_nilobject);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Table *getcurrenv (lua_State *L) {[m
[31m-  if (L->ci == L->base_ci)  /* no enclosing function? */[m
[31m-    return hvalue(gt(L));  /* use global table as environment */[m
[31m-  else {[m
[31m-    Closure *func = curr_func(L);[m
[31m-    return func->c.env;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaA_pushobject (lua_State *L, const TValue *o) {[m
[31m-  setobj2s(L, L->top, o);[m
[31m-  api_incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_checkstack (lua_State *L, int size) {[m
[31m-  int res = 1;[m
[31m-  lua_lock(L);[m
[31m-  if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK)[m
[31m-    res = 0;  /* stack overflow */[m
[31m-  else if (size > 0) {[m
[31m-    luaD_checkstack(L, size);[m
[31m-    if (L->ci->top < L->top + size)[m
[31m-      L->ci->top = L->top + size;[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {[m
[31m-  int i;[m
[31m-  if (from == to) return;[m
[31m-  lua_lock(to);[m
[31m-  api_checknelems(from, n);[m
[31m-  api_check(from, G(from) == G(to));[m
[31m-  api_check(from, to->ci->top - to->top >= n);[m
[31m-  from->top -= n;[m
[31m-  for (i = 0; i < n; i++) {[m
[31m-    setobj2s(to, to->top++, from->top + i);[m
[31m-  }[m
[31m-  lua_unlock(to);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_setlevel (lua_State *from, lua_State *to) {[m
[31m-  to->nCcalls = from->nCcalls;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {[m
[31m-  lua_CFunction old;[m
[31m-  lua_lock(L);[m
[31m-  old = G(L)->panic;[m
[31m-  G(L)->panic = panicf;[m
[31m-  lua_unlock(L);[m
[31m-  return old;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_State *lua_newthread (lua_State *L) {[m
[31m-  lua_State *L1;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  L1 = luaE_newthread(L);[m
[31m-  setthvalue(L, L->top, L1);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-  luai_userstatethread(L, L1);[m
[31m-  return L1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic stack manipulation[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_gettop (lua_State *L) {[m
[31m-  return cast_int(L->top - L->base);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_settop (lua_State *L, int idx) {[m
[31m-  lua_lock(L);[m
[31m-  if (idx >= 0) {[m
[31m-    api_check(L, idx <= L->stack_last - L->base);[m
[31m-    while (L->top < L->base + idx)[m
[31m-      setnilvalue(L->top++);[m
[31m-    L->top = L->base + idx;[m
[31m-  }[m
[31m-  else {[m
[31m-    api_check(L, -(idx+1) <= (L->top - L->base));[m
[31m-    L->top += idx+1;  /* `subtract' index (index is negative) */[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_remove (lua_State *L, int idx) {[m
[31m-  StkId p;[m
[31m-  lua_lock(L);[m
[31m-  p = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, p);[m
[31m-  while (++p < L->top) setobjs2s(L, p-1, p);[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_insert (lua_State *L, int idx) {[m
[31m-  StkId p;[m
[31m-  StkId q;[m
[31m-  lua_lock(L);[m
[31m-  p = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, p);[m
[31m-  for (q = L->top; q>p; q--) setobjs2s(L, q, q-1);[m
[31m-  setobjs2s(L, p, L->top);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_replace (lua_State *L, int idx) {[m
[31m-  StkId o;[m
[31m-  lua_lock(L);[m
[31m-  /* explicit test for incompatible code */[m
[31m-  if (idx == LUA_ENVIRONINDEX && L->ci == L->base_ci)[m
[31m-    luaG_runerror(L, "no calling environment");[m
[31m-  api_checknelems(L, 1);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  if (idx == LUA_ENVIRONINDEX) {[m
[31m-    Closure *func = curr_func(L);[m
[31m-    api_check(L, ttistable(L->top - 1)); [m
[31m-    func->c.env = hvalue(L->top - 1);[m
[31m-    luaC_barrier(L, func, L->top - 1);[m
[31m-  }[m
[31m-  else {[m
[31m-    setobj(L, o, L->top - 1);[m
[31m-    if (idx < LUA_GLOBALSINDEX)  /* function upvalue? */[m
[31m-      luaC_barrier(L, curr_func(L), L->top - 1);[m
[31m-  }[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushvalue (lua_State *L, int idx) {[m
[31m-  lua_lock(L);[m
[31m-  setobj2s(L, L->top, index2adr(L, idx));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** access functions (stack -> C)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_type (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  return (o == luaO_nilobject) ? LUA_TNONE : ttype(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_typename (lua_State *L, int t) {[m
[31m-  UNUSED(L);[m
[31m-  return (t == LUA_TNONE) ? "no value" : luaT_typenames[t];[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_iscfunction (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  return iscfunction(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_isnumber (lua_State *L, int idx) {[m
[31m-  TValue n;[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  return tonumber(o, &n);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_isstring (lua_State *L, int idx) {[m
[31m-  int t = lua_type(L, idx);[m
[31m-  return (t == LUA_TSTRING || t == LUA_TNUMBER);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_isuserdata (lua_State *L, int idx) {[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  return (ttisuserdata(o) || ttislightuserdata(o));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {[m
[31m-  StkId o1 = index2adr(L, index1);[m
[31m-  StkId o2 = index2adr(L, index2);[m
[31m-  return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0[m
[31m-         : luaO_rawequalObj(o1, o2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_equal (lua_State *L, int index1, int index2) {[m
[31m-  StkId o1, o2;[m
[31m-  int i;[m
[31m-  lua_lock(L);  /* may call tag method */[m
[31m-  o1 = index2adr(L, index1);[m
[31m-  o2 = index2adr(L, index2);[m
[31m-  i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : equalobj(L, o1, o2);[m
[31m-  lua_unlock(L);[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_lessthan (lua_State *L, int index1, int index2) {[m
[31m-  StkId o1, o2;[m
[31m-  int i;[m
[31m-  lua_lock(L);  /* may call tag method */[m
[31m-  o1 = index2adr(L, index1);[m
[31m-  o2 = index2adr(L, index2);[m
[31m-  i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0[m
[31m-       : luaV_lessthan(L, o1, o2);[m
[31m-  lua_unlock(L);[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUA_API lua_Number lua_tonumber (lua_State *L, int idx) {[m
[31m-  TValue n;[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  if (tonumber(o, &n))[m
[31m-    return nvalue(o);[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) {[m
[31m-  TValue n;[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  if (tonumber(o, &n)) {[m
[31m-    lua_Integer res;[m
[31m-    lua_Number num = nvalue(o);[m
[31m-    lua_number2integer(res, num);[m
[31m-    return res;[m
[31m-  }[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_toboolean (lua_State *L, int idx) {[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  return !l_isfalse(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  if (!ttisstring(o)) {[m
[31m-    lua_lock(L);  /* `luaV_tostring' may create a new string */[m
[31m-    if (!luaV_tostring(L, o)) {  /* conversion failed? */[m
[31m-      if (len != NULL) *len = 0;[m
[31m-      lua_unlock(L);[m
[31m-      return NULL;[m
[31m-    }[m
[31m-    luaC_checkGC(L);[m
[31m-    o = index2adr(L, idx);  /* previous call may reallocate the stack */[m
[31m-    lua_unlock(L);[m
[31m-  }[m
[31m-  if (len != NULL) *len = tsvalue(o)->len;[m
[31m-  return svalue(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API size_t lua_objlen (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TSTRING: return tsvalue(o)->len;[m
[31m-    case LUA_TUSERDATA: return uvalue(o)->len;[m
[31m-    case LUA_TTABLE: return luaH_getn(hvalue(o));[m
[31m-    case LUA_TNUMBER: {[m
[31m-      size_t l;[m
[31m-      lua_lock(L);  /* `luaV_tostring' may create a new string */[m
[31m-      l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0);[m
[31m-      lua_unlock(L);[m
[31m-      return l;[m
[31m-    }[m
[31m-    default: return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  return (!iscfunction(o)) ? NULL : clvalue(o)->c.f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void *lua_touserdata (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TUSERDATA: return (rawuvalue(o) + 1);[m
[31m-    case LUA_TLIGHTUSERDATA: return pvalue(o);[m
[31m-    default: return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_State *lua_tothread (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  return (!ttisthread(o)) ? NULL : thvalue(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const void *lua_topointer (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TTABLE: return hvalue(o);[m
[31m-    case LUA_TFUNCTION: return clvalue(o);[m
[31m-    case LUA_TTHREAD: return thvalue(o);[m
[31m-    case LUA_TUSERDATA:[m
[31m-    case LUA_TLIGHTUSERDATA:[m
[31m-      return lua_touserdata(L, idx);[m
[31m-    default: return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** push functions (C -> stack)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushnil (lua_State *L) {[m
[31m-  lua_lock(L);[m
[31m-  setnilvalue(L->top);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {[m
[31m-  lua_lock(L);[m
[31m-  setnvalue(L->top, n);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {[m
[31m-  lua_lock(L);[m
[31m-  setnvalue(L->top, cast_num(n));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  setsvalue2s(L, L->top, luaS_newlstr(L, s, len));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushstring (lua_State *L, const char *s) {[m
[31m-  if (s == NULL)[m
[31m-    lua_pushnil(L);[m
[31m-  else[m
[31m-    lua_pushlstring(L, s, strlen(s));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,[m
[31m-                                      va_list argp) {[m
[31m-  const char *ret;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  ret = luaO_pushvfstring(L, fmt, argp);[m
[31m-  lua_unlock(L);[m
[31m-  return ret;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {[m
[31m-  const char *ret;[m
[31m-  va_list argp;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  va_start(argp, fmt);[m
[31m-  ret = luaO_pushvfstring(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  lua_unlock(L);[m
[31m-  return ret;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {[m
[31m-  Closure *cl;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  api_checknelems(L, n);[m
[31m-  cl = luaF_newCclosure(L, n, getcurrenv(L));[m
[31m-  cl->c.f = fn;[m
[31m-  L->top -= n;[m
[31m-  while (n--)[m
[31m-    setobj2n(L, &cl->c.upvalue[n], L->top+n);[m
[31m-  setclvalue(L, L->top, cl);[m
[31m-  lua_assert(iswhite(obj2gco(cl)));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushboolean (lua_State *L, int b) {[m
[31m-  lua_lock(L);[m
[31m-  setbvalue(L->top, (b != 0));  /* ensure that true is 1 */[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {[m
[31m-  lua_lock(L);[m
[31m-  setpvalue(L->top, p);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_pushthread (lua_State *L) {[m
[31m-  lua_lock(L);[m
[31m-  setthvalue(L, L->top, L);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-  return (G(L)->mainthread == L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** get functions (Lua -> stack)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_gettable (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  lua_lock(L);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  luaV_gettable(L, t, L->top - 1, L->top - 1);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {[m
[31m-  StkId t;[m
[31m-  TValue key;[m
[31m-  lua_lock(L);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  setsvalue(L, &key, luaS_new(L, k));[m
[31m-  luaV_gettable(L, t, &key, L->top);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_rawget (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  lua_lock(L);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(t));[m
[31m-  setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {[m
[31m-  StkId o;[m
[31m-  lua_lock(L);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(o));[m
[31m-  setobj2s(L, L->top, luaH_getnum(hvalue(o), n));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  sethvalue(L, L->top, luaH_new(L, narray, nrec));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getmetatable (lua_State *L, int objindex) {[m
[31m-  const TValue *obj;[m
[31m-  Table *mt = NULL;[m
[31m-  int res;[m
[31m-  lua_lock(L);[m
[31m-  obj = index2adr(L, objindex);[m
[31m-  switch (ttype(obj)) {[m
[31m-    case LUA_TTABLE:[m
[31m-      mt = hvalue(obj)->metatable;[m
[31m-      break;[m
[31m-    case LUA_TUSERDATA:[m
[31m-      mt = uvalue(obj)->metatable;[m
[31m-      break;[m
[31m-    default:[m
[31m-      mt = G(L)->mt[ttype(obj)];[m
[31m-      break;[m
[31m-  }[m
[31m-  if (mt == NULL)[m
[31m-    res = 0;[m
[31m-  else {[m
[31m-    sethvalue(L, L->top, mt);[m
[31m-    api_incr_top(L);[m
[31m-    res = 1;[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_getfenv (lua_State *L, int idx) {[m
[31m-  StkId o;[m
[31m-  lua_lock(L);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TFUNCTION:[m
[31m-      sethvalue(L, L->top, clvalue(o)->c.env);[m
[31m-      break;[m
[31m-    case LUA_TUSERDATA:[m
[31m-      sethvalue(L, L->top, uvalue(o)->env);[m
[31m-      break;[m
[31m-    case LUA_TTHREAD:[m
[31m-      setobj2s(L, L->top,  gt(thvalue(o)));[m
[31m-      break;[m
[31m-    default:[m
[31m-      setnilvalue(L->top);[m
[31m-      break;[m
[31m-  }[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** set functions (stack -> Lua)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_settable (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 2);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  luaV_settable(L, t, L->top - 2, L->top - 1);[m
[31m-  L->top -= 2;  /* pop index and value */[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {[m
[31m-  StkId t;[m
[31m-  TValue key;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  setsvalue(L, &key, luaS_new(L, k));[m
[31m-  luaV_settable(L, t, &key, L->top - 1);[m
[31m-  L->top--;  /* pop value */[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_rawset (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 2);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(t));[m
[31m-  setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);[m
[31m-  luaC_barriert(L, hvalue(t), L->top-1);[m
[31m-  L->top -= 2;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_rawseti (lua_State *L, int idx, int n) {[m
[31m-  StkId o;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(o));[m
[31m-  setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1);[m
[31m-  luaC_barriert(L, hvalue(o), L->top-1);[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_setmetatable (lua_State *L, int objindex) {[m
[31m-  TValue *obj;[m
[31m-  Table *mt;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  obj = index2adr(L, objindex);[m
[31m-  api_checkvalidindex(L, obj);[m
[31m-  if (ttisnil(L->top - 1))[m
[31m-    mt = NULL;[m
[31m-  else {[m
[31m-    api_check(L, ttistable(L->top - 1));[m
[31m-    mt = hvalue(L->top - 1);[m
[31m-  }[m
[31m-  switch (ttype(obj)) {[m
[31m-    case LUA_TTABLE: {[m
[31m-      hvalue(obj)->metatable = mt;[m
[31m-      if (mt)[m
[31m-        luaC_objbarriert(L, hvalue(obj), mt);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TUSERDATA: {[m
[31m-      uvalue(obj)->metatable = mt;[m
[31m-      if (mt)[m
[31m-        luaC_objbarrier(L, rawuvalue(obj), mt);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      G(L)->mt[ttype(obj)] = mt;[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_setfenv (lua_State *L, int idx) {[m
[31m-  StkId o;[m
[31m-  int res = 1;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  api_check(L, ttistable(L->top - 1));[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TFUNCTION:[m
[31m-      clvalue(o)->c.env = hvalue(L->top - 1);[m
[31m-      break;[m
[31m-    case LUA_TUSERDATA:[m
[31m-      uvalue(o)->env = hvalue(L->top - 1);[m
[31m-      break;[m
[31m-    case LUA_TTHREAD:[m
[31m-      sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1));[m
[31m-      break;[m
[31m-    default:[m
[31m-      res = 0;[m
[31m-      break;[m
[31m-  }[m
[31m-  if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `load' and `call' functions (run Lua code)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define adjustresults(L,nres) \[m
[31m-    { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; }[m
[31m-[m
[31m-[m
[31m-#define checkresults(L,na,nr) \[m
[31m-     api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)))[m
[31m-	[m
[31m-[m
[31m-LUA_API void lua_call (lua_State *L, int nargs, int nresults) {[m
[31m-  StkId func;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, nargs+1);[m
[31m-  checkresults(L, nargs, nresults);[m
[31m-  func = L->top - (nargs+1);[m
[31m-  luaD_call(L, func, nresults);[m
[31m-  adjustresults(L, nresults);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Execute a protected call.[m
[31m-*/[m
[31m-struct CallS {  /* data to `f_call' */[m
[31m-  StkId func;[m
[31m-  int nresults;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void f_call (lua_State *L, void *ud) {[m
[31m-  struct CallS *c = cast(struct CallS *, ud);[m
[31m-  luaD_call(L, c->func, c->nresults);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) {[m
[31m-  struct CallS c;[m
[31m-  int status;[m
[31m-  ptrdiff_t func;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, nargs+1);[m
[31m-  checkresults(L, nargs, nresults);[m
[31m-  if (errfunc == 0)[m
[31m-    func = 0;[m
[31m-  else {[m
[31m-    StkId o = index2adr(L, errfunc);[m
[31m-    api_checkvalidindex(L, o);[m
[31m-    func = savestack(L, o);[m
[31m-  }[m
[31m-  c.func = L->top - (nargs+1);  /* function to be called */[m
[31m-  c.nresults = nresults;[m
[31m-  status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);[m
[31m-  adjustresults(L, nresults);[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Execute a protected C call.[m
[31m-*/[m
[31m-struct CCallS {  /* data to `f_Ccall' */[m
[31m-  lua_CFunction func;[m
[31m-  void *ud;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void f_Ccall (lua_State *L, void *ud) {[m
[31m-  struct CCallS *c = cast(struct CCallS *, ud);[m
[31m-  Closure *cl;[m
[31m-  cl = luaF_newCclosure(L, 0, getcurrenv(L));[m
[31m-  cl->c.f = c->func;[m
[31m-  setclvalue(L, L->top, cl);  /* push function */[m
[31m-  api_incr_top(L);[m
[31m-  setpvalue(L->top, c->ud);  /* push only argument */[m
[31m-  api_incr_top(L);[m
[31m-  luaD_call(L, L->top - 2, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) {[m
[31m-  struct CCallS c;[m
[31m-  int status;[m
[31m-  lua_lock(L);[m
[31m-  c.func = func;[m
[31m-  c.ud = ud;[m
[31m-  status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0);[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,[m
[31m-                      const char *chunkname) {[m
[31m-  ZIO z;[m
[31m-  int status;[m
[31m-  lua_lock(L);[m
[31m-  if (!chunkname) chunkname = "?";[m
[31m-  luaZ_init(L, &z, reader, data);[m
[31m-  status = luaD_protectedparser(L, &z, chunkname);[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {[m
[31m-  int status;[m
[31m-  TValue *o;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  o = L->top - 1;[m
[31m-  if (isLfunction(o))[m
[31m-    status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0);[m
[31m-  else[m
[31m-    status = 1;[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int  lua_status (lua_State *L) {[m
[31m-  return L->status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Garbage-collection function[m
[31m-*/[m
[31m-[m
[31m-LUA_API int lua_gc (lua_State *L, int what, int data) {[m
[31m-  int res = 0;[m
[31m-  global_State *g;[m
[31m-  lua_lock(L);[m
[31m-  g = G(L);[m
[31m-  switch (what) {[m
[31m-    case LUA_GCSTOP: {[m
[31m-      g->GCthreshold = MAX_LUMEM;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCRESTART: {[m
[31m-      g->GCthreshold = g->totalbytes;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCCOLLECT: {[m
[31m-      luaC_fullgc(L);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCCOUNT: {[m
[31m-      /* GC values are expressed in Kbytes: #bytes/2^10 */[m
[31m-      res = cast_int(g->totalbytes >> 10);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCCOUNTB: {[m
[31m-      res = cast_int(g->totalbytes & 0x3ff);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCSTEP: {[m
[31m-      lu_mem a = (cast(lu_mem, data) << 10);[m
[31m-      if (a <= g->totalbytes)[m
[31m-        g->GCthreshold = g->totalbytes - a;[m
[31m-      else[m
[31m-        g->GCthreshold = 0;[m
[31m-      while (g->GCthreshold <= g->totalbytes) {[m
[31m-        luaC_step(L);[m
[31m-        if (g->gcstate == GCSpause) {  /* end of cycle? */[m
[31m-          res = 1;  /* signal it */[m
[31m-          break;[m
[31m-        }[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCSETPAUSE: {[m
[31m-      res = g->gcpause;[m
[31m-      g->gcpause = data;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCSETSTEPMUL: {[m
[31m-      res = g->gcstepmul;[m
[31m-      g->gcstepmul = data;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: res = -1;  /* invalid option */[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** miscellaneous functions[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_error (lua_State *L) {[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  luaG_errormsg(L);[m
[31m-  lua_unlock(L);[m
[31m-  return 0;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_next (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  int more;[m
[31m-  lua_lock(L);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(t));[m
[31m-  more = luaH_next(L, hvalue(t), L->top - 1);[m
[31m-  if (more) {[m
[31m-    api_incr_top(L);[m
[31m-  }[m
[31m-  else  /* no more elements */[m
[31m-    L->top -= 1;  /* remove key */[m
[31m-  lua_unlock(L);[m
[31m-  return more;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_concat (lua_State *L, int n) {[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, n);[m
[31m-  if (n >= 2) {[m
[31m-    luaC_checkGC(L);[m
[31m-    luaV_concat(L, n, cast_int(L->top - L->base) - 1);[m
[31m-    L->top -= (n-1);[m
[31m-  }[m
[31m-  else if (n == 0) {  /* push empty string */[m
[31m-    setsvalue2s(L, L->top, luaS_newlstr(L, "", 0));[m
[31m-    api_incr_top(L);[m
[31m-  }[m
[31m-  /* else n == 1; nothing to do */[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {[m
[31m-  lua_Alloc f;[m
[31m-  lua_lock(L);[m
[31m-  if (ud) *ud = G(L)->ud;[m
[31m-  f = G(L)->frealloc;[m
[31m-  lua_unlock(L);[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {[m
[31m-  lua_lock(L);[m
[31m-  G(L)->ud = ud;[m
[31m-  G(L)->frealloc = f;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void *lua_newuserdata (lua_State *L, size_t size) {[m
[31m-  Udata *u;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  u = luaS_newudata(L, size, getcurrenv(L));[m
[31m-  setuvalue(L, L->top, u);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-  return u + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-static const char *aux_upvalue (StkId fi, int n, TValue **val) {[m
[31m-  Closure *f;[m
[31m-  if (!ttisfunction(fi)) return NULL;[m
[31m-  f = clvalue(fi);[m
[31m-  if (f->c.isC) {[m
[31m-    if (!(1 <= n && n <= f->c.nupvalues)) return NULL;[m
[31m-    *val = &f->c.upvalue[n-1];[m
[31m-    return "";[m
[31m-  }[m
[31m-  else {[m
[31m-    Proto *p = f->l.p;[m
[31m-    if (!(1 <= n && n <= p->sizeupvalues)) return NULL;[m
[31m-    *val = f->l.upvals[n-1]->v;[m
[31m-    return getstr(p->upvalues[n-1]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {[m
[31m-  const char *name;[m
[31m-  TValue *val;[m
[31m-  lua_lock(L);[m
[31m-  name = aux_upvalue(index2adr(L, funcindex), n, &val);[m
[31m-  if (name) {[m
[31m-    setobj2s(L, L->top, val);[m
[31m-    api_incr_top(L);[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {[m
[31m-  const char *name;[m
[31m-  TValue *val;[m
[31m-  StkId fi;[m
[31m-  lua_lock(L);[m
[31m-  fi = index2adr(L, funcindex);[m
[31m-  api_checknelems(L, 1);[m
[31m-  name = aux_upvalue(fi, n, &val);[m
[31m-  if (name) {[m
[31m-    L->top--;[m
[31m-    setobj(L, val, L->top);[m
[31m-    luaC_barrier(L, clvalue(fi), L->top);[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lapi.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lapi.h[m
[1mdeleted file mode 100644[m
[1mindex 2c3fab2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lapi.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions from Lua API[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lapi_h[m
[31m-#define lapi_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lauxlib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lauxlib.c[m
[1mdeleted file mode 100644[m
[1mindex 10f14e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lauxlib.c[m
[1m+++ /dev/null[m
[36m@@ -1,652 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $[m
[31m-** Auxiliary functions for building Lua libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-/* This file uses only the official API of Lua.[m
[31m-** Any function declared here could be written as an application function.[m
[31m-*/[m
[31m-[m
[31m-#define lauxlib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-[m
[31m-#define FREELIST_REF	0	/* free list of references */[m
[31m-[m
[31m-[m
[31m-/* convert a stack index to positive */[m
[31m-#define abs_index(L, i)		((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \[m
[31m-					lua_gettop(L) + (i) + 1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Error-report functions[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) {[m
[31m-  lua_Debug ar;[m
[31m-  if (!lua_getstack(L, 0, &ar))  /* no stack frame? */[m
[31m-    return luaL_error(L, "bad argument #%d (%s)", narg, extramsg);[m
[31m-  lua_getinfo(L, "n", &ar);[m
[31m-  if (strcmp(ar.namewhat, "method") == 0) {[m
[31m-    narg--;  /* do not count `self' */[m
[31m-    if (narg == 0)  /* error is in the self argument itself? */[m
[31m-      return luaL_error(L, "calling " LUA_QS " on bad self (%s)",[m
[31m-                           ar.name, extramsg);[m
[31m-  }[m
[31m-  if (ar.name == NULL)[m
[31m-    ar.name = "?";[m
[31m-  return luaL_error(L, "bad argument #%d to " LUA_QS " (%s)",[m
[31m-                        narg, ar.name, extramsg);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) {[m
[31m-  const char *msg = lua_pushfstring(L, "%s expected, got %s",[m
[31m-                                    tname, luaL_typename(L, narg));[m
[31m-  return luaL_argerror(L, narg, msg);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void tag_error (lua_State *L, int narg, int tag) {[m
[31m-  luaL_typerror(L, narg, lua_typename(L, tag));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_where (lua_State *L, int level) {[m
[31m-  lua_Debug ar;[m
[31m-  if (lua_getstack(L, level, &ar)) {  /* check function at level */[m
[31m-    lua_getinfo(L, "Sl", &ar);  /* get info about it */[m
[31m-    if (ar.currentline > 0) {  /* is there info? */[m
[31m-      lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  lua_pushliteral(L, "");  /* else, no information available... */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  luaL_where(L, 1);[m
[31m-  lua_pushvfstring(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  lua_concat(L, 2);[m
[31m-  return lua_error(L);[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,[m
[31m-                                 const char *const lst[]) {[m
[31m-  const char *name = (def) ? luaL_optstring(L, narg, def) :[m
[31m-                             luaL_checkstring(L, narg);[m
[31m-  int i;[m
[31m-  for (i=0; lst[i]; i++)[m
[31m-    if (strcmp(lst[i], name) == 0)[m
[31m-      return i;[m
[31m-  return luaL_argerror(L, narg,[m
[31m-                       lua_pushfstring(L, "invalid option " LUA_QS, name));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, tname);  /* get registry.name */[m
[31m-  if (!lua_isnil(L, -1))  /* name already in use? */[m
[31m-    return 0;  /* leave previous value on top, but return 0 */[m
[31m-  lua_pop(L, 1);[m
[31m-  lua_newtable(L);  /* create metatable */[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_setfield(L, LUA_REGISTRYINDEX, tname);  /* registry.name = metatable */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) {[m
[31m-  void *p = lua_touserdata(L, ud);[m
[31m-  if (p != NULL) {  /* value is a userdata? */[m
[31m-    if (lua_getmetatable(L, ud)) {  /* does it have a metatable? */[m
[31m-      lua_getfield(L, LUA_REGISTRYINDEX, tname);  /* get correct metatable */[m
[31m-      if (lua_rawequal(L, -1, -2)) {  /* does it have the correct mt? */[m
[31m-        lua_pop(L, 2);  /* remove both metatables */[m
[31m-        return p;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  luaL_typerror(L, ud, tname);  /* else error */[m
[31m-  return NULL;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) {[m
[31m-  if (!lua_checkstack(L, space))[m
[31m-    luaL_error(L, "stack overflow (%s)", mes);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {[m
[31m-  if (lua_type(L, narg) != t)[m
[31m-    tag_error(L, narg, t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_checkany (lua_State *L, int narg) {[m
[31m-  if (lua_type(L, narg) == LUA_TNONE)[m
[31m-    luaL_argerror(L, narg, "value expected");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) {[m
[31m-  const char *s = lua_tolstring(L, narg, len);[m
[31m-  if (!s) tag_error(L, narg, LUA_TSTRING);[m
[31m-  return s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *luaL_optlstring (lua_State *L, int narg,[m
[31m-                                        const char *def, size_t *len) {[m
[31m-  if (lua_isnoneornil(L, narg)) {[m
[31m-    if (len)[m
[31m-      *len = (def ? strlen(def) : 0);[m
[31m-    return def;[m
[31m-  }[m
[31m-  else return luaL_checklstring(L, narg, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) {[m
[31m-  lua_Number d = lua_tonumber(L, narg);[m
[31m-  if (d == 0 && !lua_isnumber(L, narg))  /* avoid extra test when d is not 0 */[m
[31m-    tag_error(L, narg, LUA_TNUMBER);[m
[31m-  return d;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) {[m
[31m-  return luaL_opt(L, luaL_checknumber, narg, def);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {[m
[31m-  lua_Integer d = lua_tointeger(L, narg);[m
[31m-  if (d == 0 && !lua_isnumber(L, narg))  /* avoid extra test when d is not 0 */[m
[31m-    tag_error(L, narg, LUA_TNUMBER);[m
[31m-  return d;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,[m
[31m-                                                      lua_Integer def) {[m
[31m-  return luaL_opt(L, luaL_checkinteger, narg, def);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) {[m
[31m-  if (!lua_getmetatable(L, obj))  /* no metatable? */[m
[31m-    return 0;[m
[31m-  lua_pushstring(L, event);[m
[31m-  lua_rawget(L, -2);[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-    lua_pop(L, 2);  /* remove metatable and metafield */[m
[31m-    return 0;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_remove(L, -2);  /* remove only metatable */[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {[m
[31m-  obj = abs_index(L, obj);[m
[31m-  if (!luaL_getmetafield(L, obj, event))  /* no metafield? */[m
[31m-    return 0;[m
[31m-  lua_pushvalue(L, obj);[m
[31m-  lua_call(L, 1, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void (luaL_register) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l) {[m
[31m-  luaI_openlib(L, libname, l, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int libsize (const luaL_Reg *l) {[m
[31m-  int size = 0;[m
[31m-  for (; l->name; l++) size++;[m
[31m-  return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaI_openlib (lua_State *L, const char *libname,[m
[31m-                              const luaL_Reg *l, int nup) {[m
[31m-  if (libname) {[m
[31m-    int size = libsize(l);[m
[31m-    /* check whether lib already exists */[m
[31m-    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);[m
[31m-    lua_getfield(L, -1, libname);  /* get _LOADED[libname] */[m
[31m-    if (!lua_istable(L, -1)) {  /* not found? */[m
[31m-      lua_pop(L, 1);  /* remove previous result */[m
[31m-      /* try global variable (and create one if it does not exist) */[m
[31m-      if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL)[m
[31m-        luaL_error(L, "name conflict for module " LUA_QS, libname);[m
[31m-      lua_pushvalue(L, -1);[m
[31m-      lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */[m
[31m-    }[m
[31m-    lua_remove(L, -2);  /* remove _LOADED table */[m
[31m-    lua_insert(L, -(nup+1));  /* move library table to below upvalues */[m
[31m-  }[m
[31m-  for (; l->name; l++) {[m
[31m-    int i;[m
[31m-    for (i=0; i<nup; i++)  /* copy upvalues to the top */[m
[31m-      lua_pushvalue(L, -nup);[m
[31m-    lua_pushcclosure(L, l->func, nup);[m
[31m-    lua_setfield(L, -(nup+2), l->name);[m
[31m-  }[m
[31m-  lua_pop(L, nup);  /* remove upvalues */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** getn-setn: size for arrays[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-#if defined(LUA_COMPAT_GETN)[m
[31m-[m
[31m-static int checkint (lua_State *L, int topop) {[m
[31m-  int n = (lua_type(L, -1) == LUA_TNUMBER) ? lua_tointeger(L, -1) : -1;[m
[31m-  lua_pop(L, topop);[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void getsizes (lua_State *L) {[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "LUA_SIZES");[m
[31m-  if (lua_isnil(L, -1)) {  /* no `size' table? */[m
[31m-    lua_pop(L, 1);  /* remove nil */[m
[31m-    lua_newtable(L);  /* create it */[m
[31m-    lua_pushvalue(L, -1);  /* `size' will be its own metatable */[m
[31m-    lua_setmetatable(L, -2);[m
[31m-    lua_pushliteral(L, "kv");[m
[31m-    lua_setfield(L, -2, "__mode");  /* metatable(N).__mode = "kv" */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, LUA_REGISTRYINDEX, "LUA_SIZES");  /* store in register */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_setn (lua_State *L, int t, int n) {[m
[31m-  t = abs_index(L, t);[m
[31m-  lua_pushliteral(L, "n");[m
[31m-  lua_rawget(L, t);[m
[31m-  if (checkint(L, 1) >= 0) {  /* is there a numeric field `n'? */[m
[31m-    lua_pushliteral(L, "n");  /* use it */[m
[31m-    lua_pushinteger(L, n);[m
[31m-    lua_rawset(L, t);[m
[31m-  }[m
[31m-  else {  /* use `sizes' */[m
[31m-    getsizes(L);[m
[31m-    lua_pushvalue(L, t);[m
[31m-    lua_pushinteger(L, n);[m
[31m-    lua_rawset(L, -3);  /* sizes[t] = n */[m
[31m-    lua_pop(L, 1);  /* remove `sizes' */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_getn (lua_State *L, int t) {[m
[31m-  int n;[m
[31m-  t = abs_index(L, t);[m
[31m-  lua_pushliteral(L, "n");  /* try t.n */[m
[31m-  lua_rawget(L, t);[m
[31m-  if ((n = checkint(L, 1)) >= 0) return n;[m
[31m-  getsizes(L);  /* else try sizes[t] */[m
[31m-  lua_pushvalue(L, t);[m
[31m-  lua_rawget(L, -2);[m
[31m-  if ((n = checkint(L, 2)) >= 0) return n;[m
[31m-  return (int)lua_objlen(L, t);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,[m
[31m-                                                               const char *r) {[m
[31m-  const char *wild;[m
[31m-  size_t l = strlen(p);[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while ((wild = strstr(s, p)) != NULL) {[m
[31m-    luaL_addlstring(&b, s, wild - s);  /* push prefix */[m
[31m-    luaL_addstring(&b, r);  /* push replacement in place of pattern */[m
[31m-    s = wild + l;  /* continue after `p' */[m
[31m-  }[m
[31m-  luaL_addstring(&b, s);  /* push last suffix */[m
[31m-  luaL_pushresult(&b);[m
[31m-  return lua_tostring(L, -1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *luaL_findtable (lua_State *L, int idx,[m
[31m-                                       const char *fname, int szhint) {[m
[31m-  const char *e;[m
[31m-  lua_pushvalue(L, idx);[m
[31m-  do {[m
[31m-    e = strchr(fname, '.');[m
[31m-    if (e == NULL) e = fname + strlen(fname);[m
[31m-    lua_pushlstring(L, fname, e - fname);[m
[31m-    lua_rawget(L, -2);[m
[31m-    if (lua_isnil(L, -1)) {  /* no such field? */[m
[31m-      lua_pop(L, 1);  /* remove this nil */[m
[31m-      lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */[m
[31m-      lua_pushlstring(L, fname, e - fname);[m
[31m-      lua_pushvalue(L, -2);[m
[31m-      lua_settable(L, -4);  /* set new table into field */[m
[31m-    }[m
[31m-    else if (!lua_istable(L, -1)) {  /* field has a non-table value? */[m
[31m-      lua_pop(L, 2);  /* remove table and value */[m
[31m-      return fname;  /* return problematic part of the name */[m
[31m-    }[m
[31m-    lua_remove(L, -2);  /* remove previous table */[m
[31m-    fname = e + 1;[m
[31m-  } while (*e == '.');[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Generic Buffer manipulation[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define bufflen(B)	((B)->p - (B)->buffer)[m
[31m-#define bufffree(B)	((size_t)(LUAL_BUFFERSIZE - bufflen(B)))[m
[31m-[m
[31m-#define LIMIT	(LUA_MINSTACK/2)[m
[31m-[m
[31m-[m
[31m-static int emptybuffer (luaL_Buffer *B) {[m
[31m-  size_t l = bufflen(B);[m
[31m-  if (l == 0) return 0;  /* put nothing on stack */[m
[31m-  else {[m
[31m-    lua_pushlstring(B->L, B->buffer, l);[m
[31m-    B->p = B->buffer;[m
[31m-    B->lvl++;[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void adjuststack (luaL_Buffer *B) {[m
[31m-  if (B->lvl > 1) {[m
[31m-    lua_State *L = B->L;[m
[31m-    int toget = 1;  /* number of levels to concat */[m
[31m-    size_t toplen = lua_strlen(L, -1);[m
[31m-    do {[m
[31m-      size_t l = lua_strlen(L, -(toget+1));[m
[31m-      if (B->lvl - toget + 1 >= LIMIT || toplen > l) {[m
[31m-        toplen += l;[m
[31m-        toget++;[m
[31m-      }[m
[31m-      else break;[m
[31m-    } while (toget < B->lvl);[m
[31m-    lua_concat(L, toget);[m
[31m-    B->lvl = B->lvl - toget + 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {[m
[31m-  if (emptybuffer(B))[m
[31m-    adjuststack(B);[m
[31m-  return B->buffer;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {[m
[31m-  while (l--)[m
[31m-    luaL_addchar(B, *s++);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {[m
[31m-  luaL_addlstring(B, s, strlen(s));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_pushresult (luaL_Buffer *B) {[m
[31m-  emptybuffer(B);[m
[31m-  lua_concat(B->L, B->lvl);[m
[31m-  B->lvl = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_addvalue (luaL_Buffer *B) {[m
[31m-  lua_State *L = B->L;[m
[31m-  size_t vl;[m
[31m-  const char *s = lua_tolstring(L, -1, &vl);[m
[31m-  if (vl <= bufffree(B)) {  /* fit into buffer? */[m
[31m-    memcpy(B->p, s, vl);  /* put it there */[m
[31m-    B->p += vl;[m
[31m-    lua_pop(L, 1);  /* remove from stack */[m
[31m-  }[m
[31m-  else {[m
[31m-    if (emptybuffer(B))[m
[31m-      lua_insert(L, -2);  /* put buffer before new value */[m
[31m-    B->lvl++;  /* add new value into B stack */[m
[31m-    adjuststack(B);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {[m
[31m-  B->L = L;[m
[31m-  B->p = B->buffer;[m
[31m-  B->lvl = 0;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_ref (lua_State *L, int t) {[m
[31m-  int ref;[m
[31m-  t = abs_index(L, t);[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-    lua_pop(L, 1);  /* remove from stack */[m
[31m-    return LUA_REFNIL;  /* `nil' has a unique fixed reference */[m
[31m-  }[m
[31m-  lua_rawgeti(L, t, FREELIST_REF);  /* get first free element */[m
[31m-  ref = (int)lua_tointeger(L, -1);  /* ref = t[FREELIST_REF] */[m
[31m-  lua_pop(L, 1);  /* remove it from stack */[m
[31m-  if (ref != 0) {  /* any free element? */[m
[31m-    lua_rawgeti(L, t, ref);  /* remove it from list */[m
[31m-    lua_rawseti(L, t, FREELIST_REF);  /* (t[FREELIST_REF] = t[ref]) */[m
[31m-  }[m
[31m-  else {  /* no free elements */[m
[31m-    ref = (int)lua_objlen(L, t);[m
[31m-    ref++;  /* create new reference */[m
[31m-  }[m
[31m-  lua_rawseti(L, t, ref);[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {[m
[31m-  if (ref >= 0) {[m
[31m-    t = abs_index(L, t);[m
[31m-    lua_rawgeti(L, t, FREELIST_REF);[m
[31m-    lua_rawseti(L, t, ref);  /* t[ref] = t[FREELIST_REF] */[m
[31m-    lua_pushinteger(L, ref);[m
[31m-    lua_rawseti(L, t, FREELIST_REF);  /* t[FREELIST_REF] = ref */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Load functions[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-typedef struct LoadF {[m
[31m-  int extraline;[m
[31m-  FILE *f;[m
[31m-  char buff[LUAL_BUFFERSIZE];[m
[31m-} LoadF;[m
[31m-[m
[31m-[m
[31m-static const char *getF (lua_State *L, void *ud, size_t *size) {[m
[31m-  LoadF *lf = (LoadF *)ud;[m
[31m-  (void)L;[m
[31m-  if (lf->extraline) {[m
[31m-    lf->extraline = 0;[m
[31m-    *size = 1;[m
[31m-    return "\n";[m
[31m-  }[m
[31m-  if (feof(lf->f)) return NULL;[m
[31m-  *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);[m
[31m-  return (*size > 0) ? lf->buff : NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int errfile (lua_State *L, const char *what, int fnameindex) {[m
[31m-  const char *serr = strerror(errno);[m
[31m-  const char *filename = lua_tostring(L, fnameindex) + 1;[m
[31m-  lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);[m
[31m-  lua_remove(L, fnameindex);[m
[31m-  return LUA_ERRFILE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {[m
[31m-  LoadF lf;[m
[31m-  int status, readstatus;[m
[31m-  int c;[m
[31m-  int fnameindex = lua_gettop(L) + 1;  /* index of filename on the stack */[m
[31m-  lf.extraline = 0;[m
[31m-  if (filename == NULL) {[m
[31m-    lua_pushliteral(L, "=stdin");[m
[31m-    lf.f = stdin;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushfstring(L, "@%s", filename);[m
[31m-    lf.f = fopen(filename, "r");[m
[31m-    if (lf.f == NULL) return errfile(L, "open", fnameindex);[m
[31m-  }[m
[31m-  c = getc(lf.f);[m
[31m-  if (c == '#') {  /* Unix exec. file? */[m
[31m-    lf.extraline = 1;[m
[31m-    while ((c = getc(lf.f)) != EOF && c != '\n') ;  /* skip first line */[m
[31m-    if (c == '\n') c = getc(lf.f);[m
[31m-  }[m
[31m-  if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */[m
[31m-    lf.f = freopen(filename, "rb", lf.f);  /* reopen in binary mode */[m
[31m-    if (lf.f == NULL) return errfile(L, "reopen", fnameindex);[m
[31m-    /* skip eventual `#!...' */[m
[31m-   while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;[m
[31m-    lf.extraline = 0;[m
[31m-  }[m
[31m-  ungetc(c, lf.f);[m
[31m-  status = lua_load(L, getF, &lf, lua_tostring(L, -1));[m
[31m-  readstatus = ferror(lf.f);[m
[31m-  if (filename) fclose(lf.f);  /* close file (even in case of errors) */[m
[31m-  if (readstatus) {[m
[31m-    lua_settop(L, fnameindex);  /* ignore results from `lua_load' */[m
[31m-    return errfile(L, "read", fnameindex);[m
[31m-  }[m
[31m-  lua_remove(L, fnameindex);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct LoadS {[m
[31m-  const char *s;[m
[31m-  size_t size;[m
[31m-} LoadS;[m
[31m-[m
[31m-[m
[31m-static const char *getS (lua_State *L, void *ud, size_t *size) {[m
[31m-  LoadS *ls = (LoadS *)ud;[m
[31m-  (void)L;[m
[31m-  if (ls->size == 0) return NULL;[m
[31m-  *size = ls->size;[m
[31m-  ls->size = 0;[m
[31m-  return ls->s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,[m
[31m-                                const char *name) {[m
[31m-  LoadS ls;[m
[31m-  ls.s = buff;[m
[31m-  ls.size = size;[m
[31m-  return lua_load(L, getS, &ls, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) {[m
[31m-  return luaL_loadbuffer(L, s, strlen(s), s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {[m
[31m-  (void)ud;[m
[31m-  (void)osize;[m
[31m-  if (nsize == 0) {[m
[31m-    free(ptr);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  else[m
[31m-    return realloc(ptr, nsize);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int panic (lua_State *L) {[m
[31m-  (void)L;  /* to avoid warnings */[m
[31m-  fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n",[m
[31m-                   lua_tostring(L, -1));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_State *luaL_newstate (void) {[m
[31m-  lua_State *L = lua_newstate(l_alloc, NULL);[m
[31m-  if (L) lua_atpanic(L, &panic);[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lauxlib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lauxlib.h[m
[1mdeleted file mode 100644[m
[1mindex 3425823..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lauxlib.h[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions for building Lua libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lauxlib_h[m
[31m-#define lauxlib_h[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-#if defined(LUA_COMPAT_GETN)[m
[31m-LUALIB_API int (luaL_getn) (lua_State *L, int t);[m
[31m-LUALIB_API void (luaL_setn) (lua_State *L, int t, int n);[m
[31m-#else[m
[31m-#define luaL_getn(L,i)          ((int)lua_objlen(L, i))[m
[31m-#define luaL_setn(L,i,j)        ((void)0)  /* no op! */[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUA_COMPAT_OPENLIB)[m
[31m-#define luaI_openlib	luaL_openlib[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* extra error code for `luaL_load' */[m
[31m-#define LUA_ERRFILE     (LUA_ERRERR+1)[m
[31m-[m
[31m-[m
[31m-typedef struct luaL_Reg {[m
[31m-  const char *name;[m
[31m-  lua_CFunction func;[m
[31m-} luaL_Reg;[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l, int nup);[m
[31m-LUALIB_API void (luaL_register) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l);[m
[31m-LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);[m
[31m-LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);[m
[31m-LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,[m
[31m-                                                          size_t *l);[m
[31m-LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,[m
[31m-                                          const char *def, size_t *l);[m
[31m-LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);[m
[31m-[m
[31m-LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,[m
[31m-                                          lua_Integer def);[m
[31m-[m
[31m-LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);[m
[31m-LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);[m
[31m-LUALIB_API void (luaL_checkany) (lua_State *L, int narg);[m
[31m-[m
[31m-LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);[m
[31m-LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);[m
[31m-[m
[31m-LUALIB_API void (luaL_where) (lua_State *L, int lvl);[m
[31m-LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);[m
[31m-[m
[31m-LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,[m
[31m-                                   const char *const lst[]);[m
[31m-[m
[31m-LUALIB_API int (luaL_ref) (lua_State *L, int t);[m
[31m-LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);[m
[31m-[m
[31m-LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);[m
[31m-LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,[m
[31m-                                  const char *name);[m
[31m-LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);[m
[31m-[m
[31m-LUALIB_API lua_State *(luaL_newstate) (void);[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,[m
[31m-                                                  const char *r);[m
[31m-[m
[31m-LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,[m
[31m-                                         const char *fname, int szhint);[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define luaL_argcheck(L, cond,numarg,extramsg)	\[m
[31m-		((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))[m
[31m-#define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))[m
[31m-#define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))[m
[31m-#define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))[m
[31m-#define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))[m
[31m-[m
[31m-#define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))[m
[31m-[m
[31m-#define luaL_dofile(L, fn) \[m
[31m-	(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_dostring(L, s) \[m
[31m-	(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))[m
[31m-[m
[31m-#define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Generic Buffer manipulation[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct luaL_Buffer {[m
[31m-  char *p;			/* current position in buffer */[m
[31m-  int lvl;  /* number of strings in the stack (level) */[m
[31m-  lua_State *L;[m
[31m-  char buffer[LUAL_BUFFERSIZE];[m
[31m-} luaL_Buffer;[m
[31m-[m
[31m-#define luaL_addchar(B,c) \[m
[31m-  ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \[m
[31m-   (*(B)->p++ = (char)(c)))[m
[31m-[m
[31m-/* compatibility only */[m
[31m-#define luaL_putchar(B,c)	luaL_addchar(B,c)[m
[31m-[m
[31m-#define luaL_addsize(B,n)	((B)->p += (n))[m
[31m-[m
[31m-LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);[m
[31m-LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);[m
[31m-LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);[m
[31m-LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-/* compatibility with ref system */[m
[31m-[m
[31m-/* pre-defined references */[m
[31m-#define LUA_NOREF       (-2)[m
[31m-#define LUA_REFNIL      (-1)[m
[31m-[m
[31m-#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \[m
[31m-      (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))[m
[31m-[m
[31m-#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-[m
[31m-#define luaL_reg	luaL_Reg[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lbaselib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lbaselib.c[m
[1mdeleted file mode 100644[m
[1mindex 2ab550b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lbaselib.c[m
[1m+++ /dev/null[m
[36m@@ -1,653 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $[m
[31m-** Basic library[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lbaselib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** If your system does not support `stdout', you can just remove this function.[m
[31m-** If you need, you can define your own `print' function, following this[m
[31m-** model but changing `fputs' to put the strings at a proper place[m
[31m-** (a console window or a log file, for instance).[m
[31m-*/[m
[31m-static int luaB_print (lua_State *L) {[m
[31m-  int n = lua_gettop(L);  /* number of arguments */[m
[31m-  int i;[m
[31m-  lua_getglobal(L, "tostring");[m
[31m-  for (i=1; i<=n; i++) {[m
[31m-    const char *s;[m
[31m-    lua_pushvalue(L, -1);  /* function to be called */[m
[31m-    lua_pushvalue(L, i);   /* value to print */[m
[31m-    lua_call(L, 1, 1);[m
[31m-    s = lua_tostring(L, -1);  /* get result */[m
[31m-    if (s == NULL)[m
[31m-      return luaL_error(L, LUA_QL("tostring") " must return a string to "[m
[31m-                           LUA_QL("print"));[m
[31m-    if (i>1) fputs("\t", stdout);[m
[31m-    fputs(s, stdout);[m
[31m-    lua_pop(L, 1);  /* pop result */[m
[31m-  }[m
[31m-  fputs("\n", stdout);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_tonumber (lua_State *L) {[m
[31m-  int base = luaL_optint(L, 2, 10);[m
[31m-  if (base == 10) {  /* standard conversion */[m
[31m-    luaL_checkany(L, 1);[m
[31m-    if (lua_isnumber(L, 1)) {[m
[31m-      lua_pushnumber(L, lua_tonumber(L, 1));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  else {[m
[31m-    const char *s1 = luaL_checkstring(L, 1);[m
[31m-    char *s2;[m
[31m-    unsigned long n;[m
[31m-    luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");[m
[31m-    n = strtoul(s1, &s2, base);[m
[31m-    if (s1 != s2) {  /* at least one valid digit? */[m
[31m-      while (isspace((unsigned char)(*s2))) s2++;  /* skip trailing spaces */[m
[31m-      if (*s2 == '\0') {  /* no invalid trailing characters? */[m
[31m-        lua_pushnumber(L, (lua_Number)n);[m
[31m-        return 1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lua_pushnil(L);  /* else not a number */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_error (lua_State *L) {[m
[31m-  int level = luaL_optint(L, 2, 1);[m
[31m-  lua_settop(L, 1);[m
[31m-  if (lua_isstring(L, 1) && level > 0) {  /* add extra information? */[m
[31m-    luaL_where(L, level);[m
[31m-    lua_pushvalue(L, 1);[m
[31m-    lua_concat(L, 2);[m
[31m-  }[m
[31m-  return lua_error(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_getmetatable (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;  /* no metatable */[m
[31m-  }[m
[31m-  luaL_getmetafield(L, 1, "__metatable");[m
[31m-  return 1;  /* returns either __metatable field (if present) or metatable */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_setmetatable (lua_State *L) {[m
[31m-  int t = lua_type(L, 2);[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,[m
[31m-                    "nil or table expected");[m
[31m-  if (luaL_getmetafield(L, 1, "__metatable"))[m
[31m-    luaL_error(L, "cannot change a protected metatable");[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_setmetatable(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void getfunc (lua_State *L, int opt) {[m
[31m-  if (lua_isfunction(L, 1)) lua_pushvalue(L, 1);[m
[31m-  else {[m
[31m-    lua_Debug ar;[m
[31m-    int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1);[m
[31m-    luaL_argcheck(L, level >= 0, 1, "level must be non-negative");[m
[31m-    if (lua_getstack(L, level, &ar) == 0)[m
[31m-      luaL_argerror(L, 1, "invalid level");[m
[31m-    lua_getinfo(L, "f", &ar);[m
[31m-    if (lua_isnil(L, -1))[m
[31m-      luaL_error(L, "no function environment for tail call at level %d",[m
[31m-                    level);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_getfenv (lua_State *L) {[m
[31m-  getfunc(L, 1);[m
[31m-  if (lua_iscfunction(L, -1))  /* is a C function? */[m
[31m-    lua_pushvalue(L, LUA_GLOBALSINDEX);  /* return the thread's global env. */[m
[31m-  else[m
[31m-    lua_getfenv(L, -1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_setfenv (lua_State *L) {[m
[31m-  luaL_checktype(L, 2, LUA_TTABLE);[m
[31m-  getfunc(L, 0);[m
[31m-  lua_pushvalue(L, 2);[m
[31m-  if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) {[m
[31m-    /* change environment of current thread */[m
[31m-    lua_pushthread(L);[m
[31m-    lua_insert(L, -2);[m
[31m-    lua_setfenv(L, -2);[m
[31m-    return 0;[m
[31m-  }[m
[31m-  else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0)[m
[31m-    luaL_error(L,[m
[31m-          LUA_QL("setfenv") " cannot change environment of given object");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_rawequal (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  luaL_checkany(L, 2);[m
[31m-  lua_pushboolean(L, lua_rawequal(L, 1, 2));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_rawget (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  luaL_checkany(L, 2);[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_rawget(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int luaB_rawset (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  luaL_checkany(L, 2);[m
[31m-  luaL_checkany(L, 3);[m
[31m-  lua_settop(L, 3);[m
[31m-  lua_rawset(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_gcinfo (lua_State *L) {[m
[31m-  lua_pushinteger(L, lua_getgccount(L));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_collectgarbage (lua_State *L) {[m
[31m-  static const char *const opts[] = {"stop", "restart", "collect",[m
[31m-    "count", "step", "setpause", "setstepmul", NULL};[m
[31m-  static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,[m
[31m-    LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL};[m
[31m-  int o = luaL_checkoption(L, 1, "collect", opts);[m
[31m-  int ex = luaL_optint(L, 2, 0);[m
[31m-  int res = lua_gc(L, optsnum[o], ex);[m
[31m-  switch (optsnum[o]) {[m
[31m-    case LUA_GCCOUNT: {[m
[31m-      int b = lua_gc(L, LUA_GCCOUNTB, 0);[m
[31m-      lua_pushnumber(L, res + ((lua_Number)b/1024));[m
[31m-      return 1;[m
[31m-    }[m
[31m-    case LUA_GCSTEP: {[m
[31m-      lua_pushboolean(L, res);[m
[31m-      return 1;[m
[31m-    }[m
[31m-    default: {[m
[31m-      lua_pushnumber(L, res);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_type (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  lua_pushstring(L, luaL_typename(L, 1));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_next (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  lua_settop(L, 2);  /* create a 2nd argument if there isn't one */[m
[31m-  if (lua_next(L, 1))[m
[31m-    return 2;[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_pairs (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  lua_pushvalue(L, lua_upvalueindex(1));  /* return generator, */[m
[31m-  lua_pushvalue(L, 1);  /* state, */[m
[31m-  lua_pushnil(L);  /* and initial value */[m
[31m-  return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ipairsaux (lua_State *L) {[m
[31m-  int i = luaL_checkint(L, 2);[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  i++;  /* next value */[m
[31m-  lua_pushinteger(L, i);[m
[31m-  lua_rawgeti(L, 1, i);[m
[31m-  return (lua_isnil(L, -1)) ? 0 : 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_ipairs (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  lua_pushvalue(L, lua_upvalueindex(1));  /* return generator, */[m
[31m-  lua_pushvalue(L, 1);  /* state, */[m
[31m-  lua_pushinteger(L, 0);  /* and initial value */[m
[31m-  return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int load_aux (lua_State *L, int status) {[m
[31m-  if (status == 0)  /* OK? */[m
[31m-    return 1;[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    lua_insert(L, -2);  /* put before error message */[m
[31m-    return 2;  /* return nil plus error message */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_loadstring (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  const char *chunkname = luaL_optstring(L, 2, s);[m
[31m-  return load_aux(L, luaL_loadbuffer(L, s, l, chunkname));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_loadfile (lua_State *L) {[m
[31m-  const char *fname = luaL_optstring(L, 1, NULL);[m
[31m-  return load_aux(L, luaL_loadfile(L, fname));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Reader for generic `load' function: `lua_load' uses the[m
[31m-** stack for internal stuff, so the reader cannot change the[m
[31m-** stack top. Instead, it keeps its resulting string in a[m
[31m-** reserved slot inside the stack.[m
[31m-*/[m
[31m-static const char *generic_reader (lua_State *L, void *ud, size_t *size) {[m
[31m-  (void)ud;  /* to avoid warnings */[m
[31m-  luaL_checkstack(L, 2, "too many nested functions");[m
[31m-  lua_pushvalue(L, 1);  /* get function */[m
[31m-  lua_call(L, 0, 1);  /* call it */[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-    *size = 0;[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  else if (lua_isstring(L, -1)) {[m
[31m-    lua_replace(L, 3);  /* save string in a reserved stack slot */[m
[31m-    return lua_tolstring(L, 3, size);[m
[31m-  }[m
[31m-  else luaL_error(L, "reader function must return a string");[m
[31m-  return NULL;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_load (lua_State *L) {[m
[31m-  int status;[m
[31m-  const char *cname = luaL_optstring(L, 2, "=(load)");[m
[31m-  luaL_checktype(L, 1, LUA_TFUNCTION);[m
[31m-  lua_settop(L, 3);  /* function, eventual name, plus one reserved slot */[m
[31m-  status = lua_load(L, generic_reader, NULL, cname);[m
[31m-  return load_aux(L, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_dofile (lua_State *L) {[m
[31m-  const char *fname = luaL_optstring(L, 1, NULL);[m
[31m-  int n = lua_gettop(L);[m
[31m-  if (luaL_loadfile(L, fname) != 0) lua_error(L);[m
[31m-  lua_call(L, 0, LUA_MULTRET);[m
[31m-  return lua_gettop(L) - n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_assert (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  if (!lua_toboolean(L, 1))[m
[31m-    return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!"));[m
[31m-  return lua_gettop(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_unpack (lua_State *L) {[m
[31m-  int i, e, n;[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  i = luaL_optint(L, 2, 1);[m
[31m-  e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));[m
[31m-  if (i > e) return 0;  /* empty range */[m
[31m-  n = e - i + 1;  /* number of elements */[m
[31m-  if (n <= 0 || !lua_checkstack(L, n))  /* n <= 0 means arith. overflow */[m
[31m-    return luaL_error(L, "too many results to unpack");[m
[31m-  lua_rawgeti(L, 1, i);  /* push arg[i] (avoiding overflow problems) */[m
[31m-  while (i++ < e)  /* push arg[i + 1...e] */[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_select (lua_State *L) {[m
[31m-  int n = lua_gettop(L);[m
[31m-  if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') {[m
[31m-    lua_pushinteger(L, n-1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else {[m
[31m-    int i = luaL_checkint(L, 1);[m
[31m-    if (i < 0) i = n + i;[m
[31m-    else if (i > n) i = n;[m
[31m-    luaL_argcheck(L, 1 <= i, 1, "index out of range");[m
[31m-    return n - i;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_pcall (lua_State *L) {[m
[31m-  int status;[m
[31m-  luaL_checkany(L, 1);[m
[31m-  status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0);[m
[31m-  lua_pushboolean(L, (status == 0));[m
[31m-  lua_insert(L, 1);[m
[31m-  return lua_gettop(L);  /* return status + all results */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_xpcall (lua_State *L) {[m
[31m-  int status;[m
[31m-  luaL_checkany(L, 2);[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_insert(L, 1);  /* put error function under function to be called */[m
[31m-  status = lua_pcall(L, 0, LUA_MULTRET, 1);[m
[31m-  lua_pushboolean(L, (status == 0));[m
[31m-  lua_replace(L, 1);[m
[31m-  return lua_gettop(L);  /* return status + all results */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_tostring (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  if (luaL_callmeta(L, 1, "__tostring"))  /* is there a metafield? */[m
[31m-    return 1;  /* use its value */[m
[31m-  switch (lua_type(L, 1)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-      lua_pushstring(L, lua_tostring(L, 1));[m
[31m-      break;[m
[31m-    case LUA_TSTRING:[m
[31m-      lua_pushvalue(L, 1);[m
[31m-      break;[m
[31m-    case LUA_TBOOLEAN:[m
[31m-      lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false"));[m
[31m-      break;[m
[31m-    case LUA_TNIL:[m
[31m-      lua_pushliteral(L, "nil");[m
[31m-      break;[m
[31m-    default:[m
[31m-      lua_pushfstring(L, "%s: %p", luaL_typename(L, 1), lua_topointer(L, 1));[m
[31m-      break;[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_newproxy (lua_State *L) {[m
[31m-  lua_settop(L, 1);[m
[31m-  lua_newuserdata(L, 0);  /* create proxy */[m
[31m-  if (lua_toboolean(L, 1) == 0)[m
[31m-    return 1;  /* no metatable */[m
[31m-  else if (lua_isboolean(L, 1)) {[m
[31m-    lua_newtable(L);  /* create a new metatable `m' ... */[m
[31m-    lua_pushvalue(L, -1);  /* ... and mark `m' as a valid metatable */[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_rawset(L, lua_upvalueindex(1));  /* weaktable[m] = true */[m
[31m-  }[m
[31m-  else {[m
[31m-    int validproxy = 0;  /* to check if weaktable[metatable(u)] == true */[m
[31m-    if (lua_getmetatable(L, 1)) {[m
[31m-      lua_rawget(L, lua_upvalueindex(1));[m
[31m-      validproxy = lua_toboolean(L, -1);[m
[31m-      lua_pop(L, 1);  /* remove value */[m
[31m-    }[m
[31m-    luaL_argcheck(L, validproxy, 1, "boolean or proxy expected");[m
[31m-    lua_getmetatable(L, 1);  /* metatable is valid; get it */[m
[31m-  }[m
[31m-  lua_setmetatable(L, 2);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg base_funcs[] = {[m
[31m-  {"assert", luaB_assert},[m
[31m-  {"collectgarbage", luaB_collectgarbage},[m
[31m-  {"dofile", luaB_dofile},[m
[31m-  {"error", luaB_error},[m
[31m-  {"gcinfo", luaB_gcinfo},[m
[31m-  {"getfenv", luaB_getfenv},[m
[31m-  {"getmetatable", luaB_getmetatable},[m
[31m-  {"loadfile", luaB_loadfile},[m
[31m-  {"load", luaB_load},[m
[31m-  {"loadstring", luaB_loadstring},[m
[31m-  {"next", luaB_next},[m
[31m-  {"pcall", luaB_pcall},[m
[31m-  {"print", luaB_print},[m
[31m-  {"rawequal", luaB_rawequal},[m
[31m-  {"rawget", luaB_rawget},[m
[31m-  {"rawset", luaB_rawset},[m
[31m-  {"select", luaB_select},[m
[31m-  {"setfenv", luaB_setfenv},[m
[31m-  {"setmetatable", luaB_setmetatable},[m
[31m-  {"tonumber", luaB_tonumber},[m
[31m-  {"tostring", luaB_tostring},[m
[31m-  {"type", luaB_type},[m
[31m-  {"unpack", luaB_unpack},[m
[31m-  {"xpcall", luaB_xpcall},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Coroutine library[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-#define CO_RUN	0	/* running */[m
[31m-#define CO_SUS	1	/* suspended */[m
[31m-#define CO_NOR	2	/* 'normal' (it resumed another coroutine) */[m
[31m-#define CO_DEAD	3[m
[31m-[m
[31m-static const char *const statnames[] =[m
[31m-    {"running", "suspended", "normal", "dead"};[m
[31m-[m
[31m-static int costatus (lua_State *L, lua_State *co) {[m
[31m-  if (L == co) return CO_RUN;[m
[31m-  switch (lua_status(co)) {[m
[31m-    case LUA_YIELD:[m
[31m-      return CO_SUS;[m
[31m-    case 0: {[m
[31m-      lua_Debug ar;[m
[31m-      if (lua_getstack(co, 0, &ar) > 0)  /* does it have frames? */[m
[31m-        return CO_NOR;  /* it is running */[m
[31m-      else if (lua_gettop(co) == 0)[m
[31m-          return CO_DEAD;[m
[31m-      else[m
[31m-        return CO_SUS;  /* initial state */[m
[31m-    }[m
[31m-    default:  /* some error occured */[m
[31m-      return CO_DEAD;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_costatus (lua_State *L) {[m
[31m-  lua_State *co = lua_tothread(L, 1);[m
[31m-  luaL_argcheck(L, co, 1, "coroutine expected");[m
[31m-  lua_pushstring(L, statnames[costatus(L, co)]);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int auxresume (lua_State *L, lua_State *co, int narg) {[m
[31m-  int status = costatus(L, co);[m
[31m-  if (!lua_checkstack(co, narg))[m
[31m-    luaL_error(L, "too many arguments to resume");[m
[31m-  if (status != CO_SUS) {[m
[31m-    lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]);[m
[31m-    return -1;  /* error flag */[m
[31m-  }[m
[31m-  lua_xmove(L, co, narg);[m
[31m-  lua_setlevel(L, co);[m
[31m-  status = lua_resume(co, narg);[m
[31m-  if (status == 0 || status == LUA_YIELD) {[m
[31m-    int nres = lua_gettop(co);[m
[31m-    if (!lua_checkstack(L, nres + 1))[m
[31m-      luaL_error(L, "too many results to resume");[m
[31m-    lua_xmove(co, L, nres);  /* move yielded values */[m
[31m-    return nres;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_xmove(co, L, 1);  /* move error message */[m
[31m-    return -1;  /* error flag */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_coresume (lua_State *L) {[m
[31m-  lua_State *co = lua_tothread(L, 1);[m
[31m-  int r;[m
[31m-  luaL_argcheck(L, co, 1, "coroutine expected");[m
[31m-  r = auxresume(L, co, lua_gettop(L) - 1);[m
[31m-  if (r < 0) {[m
[31m-    lua_pushboolean(L, 0);[m
[31m-    lua_insert(L, -2);[m
[31m-    return 2;  /* return false + error message */[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_insert(L, -(r + 1));[m
[31m-    return r + 1;  /* return true + `resume' returns */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_auxwrap (lua_State *L) {[m
[31m-  lua_State *co = lua_tothread(L, lua_upvalueindex(1));[m
[31m-  int r = auxresume(L, co, lua_gettop(L));[m
[31m-  if (r < 0) {[m
[31m-    if (lua_isstring(L, -1)) {  /* error object is a string? */[m
[31m-      luaL_where(L, 1);  /* add extra info */[m
[31m-      lua_insert(L, -2);[m
[31m-      lua_concat(L, 2);[m
[31m-    }[m
[31m-    lua_error(L);  /* propagate error */[m
[31m-  }[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_cocreate (lua_State *L) {[m
[31m-  lua_State *NL = lua_newthread(L);[m
[31m-  luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,[m
[31m-    "Lua function expected");[m
[31m-  lua_pushvalue(L, 1);  /* move function to top */[m
[31m-  lua_xmove(L, NL, 1);  /* move function from L to NL */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_cowrap (lua_State *L) {[m
[31m-  luaB_cocreate(L);[m
[31m-  lua_pushcclosure(L, luaB_auxwrap, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_yield (lua_State *L) {[m
[31m-  return lua_yield(L, lua_gettop(L));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_corunning (lua_State *L) {[m
[31m-  if (lua_pushthread(L))[m
[31m-    lua_pushnil(L);  /* main thread is not a coroutine */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg co_funcs[] = {[m
[31m-  {"create", luaB_cocreate},[m
[31m-  {"resume", luaB_coresume},[m
[31m-  {"running", luaB_corunning},[m
[31m-  {"status", luaB_costatus},[m
[31m-  {"wrap", luaB_cowrap},[m
[31m-  {"yield", luaB_yield},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static void auxopen (lua_State *L, const char *name,[m
[31m-                     lua_CFunction f, lua_CFunction u) {[m
[31m-  lua_pushcfunction(L, u);[m
[31m-  lua_pushcclosure(L, f, 1);[m
[31m-  lua_setfield(L, -2, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void base_open (lua_State *L) {[m
[31m-  /* set global _G */[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  lua_setglobal(L, "_G");[m
[31m-  /* open lib into global table */[m
[31m-  luaL_register(L, "_G", base_funcs);[m
[31m-  lua_pushliteral(L, LUA_VERSION);[m
[31m-  lua_setglobal(L, "_VERSION");  /* set global _VERSION */[m
[31m-  /* `ipairs' and `pairs' need auxiliary functions as upvalues */[m
[31m-  auxopen(L, "ipairs", luaB_ipairs, ipairsaux);[m
[31m-  auxopen(L, "pairs", luaB_pairs, luaB_next);[m
[31m-  /* `newproxy' needs a weaktable as upvalue */[m
[31m-  lua_createtable(L, 0, 1);  /* new table `w' */[m
[31m-  lua_pushvalue(L, -1);  /* `w' will be its own metatable */[m
[31m-  lua_setmetatable(L, -2);[m
[31m-  lua_pushliteral(L, "kv");[m
[31m-  lua_setfield(L, -2, "__mode");  /* metatable(w).__mode = "kv" */[m
[31m-  lua_pushcclosure(L, luaB_newproxy, 1);[m
[31m-  lua_setglobal(L, "newproxy");  /* set global `newproxy' */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_base (lua_State *L) {[m
[31m-  base_open(L);[m
[31m-  luaL_register(L, LUA_COLIBNAME, co_funcs);[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lcode.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lcode.c[m
[1mdeleted file mode 100644[m
[1mindex 679cb9c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lcode.c[m
[1m+++ /dev/null[m
[36m@@ -1,831 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lcode.c,v 2.25.1.5 2011/01/31 14:53:16 roberto Exp $[m
[31m-** Code generator for Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define lcode_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lcode.h"[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lgc.h"[m
[31m-#include "llex.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lparser.h"[m
[31m-#include "ltable.h"[m
[31m-[m
[31m-[m
[31m-#define hasjumps(e)	((e)->t != (e)->f)[m
[31m-[m
[31m-[m
[31m-static int isnumeral(expdesc *e) {[m
[31m-  return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_nil (FuncState *fs, int from, int n) {[m
[31m-  Instruction *previous;[m
[31m-  if (fs->pc > fs->lasttarget) {  /* no jumps to current position? */[m
[31m-    if (fs->pc == 0) {  /* function start? */[m
[31m-      if (from >= fs->nactvar)[m
[31m-        return;  /* positions are already clean */[m
[31m-    }[m
[31m-    else {[m
[31m-      previous = &fs->f->code[fs->pc-1];[m
[31m-      if (GET_OPCODE(*previous) == OP_LOADNIL) {[m
[31m-        int pfrom = GETARG_A(*previous);[m
[31m-        int pto = GETARG_B(*previous);[m
[31m-        if (pfrom <= from && from <= pto+1) {  /* can connect both? */[m
[31m-          if (from+n-1 > pto)[m
[31m-            SETARG_B(*previous, from+n-1);[m
[31m-          return;[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0);  /* else no optimization */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_jump (FuncState *fs) {[m
[31m-  int jpc = fs->jpc;  /* save list of jumps to here */[m
[31m-  int j;[m
[31m-  fs->jpc = NO_JUMP;[m
[31m-  j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP);[m
[31m-  luaK_concat(fs, &j, jpc);  /* keep them on hold */[m
[31m-  return j;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_ret (FuncState *fs, int first, int nret) {[m
[31m-  luaK_codeABC(fs, OP_RETURN, first, nret+1, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {[m
[31m-  luaK_codeABC(fs, op, A, B, C);[m
[31m-  return luaK_jump(fs);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void fixjump (FuncState *fs, int pc, int dest) {[m
[31m-  Instruction *jmp = &fs->f->code[pc];[m
[31m-  int offset = dest-(pc+1);[m
[31m-  lua_assert(dest != NO_JUMP);[m
[31m-  if (abs(offset) > MAXARG_sBx)[m
[31m-    luaX_syntaxerror(fs->ls, "control structure too long");[m
[31m-  SETARG_sBx(*jmp, offset);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** returns current `pc' and marks it as a jump target (to avoid wrong[m
[31m-** optimizations with consecutive instructions not in the same basic block).[m
[31m-*/[m
[31m-int luaK_getlabel (FuncState *fs) {[m
[31m-  fs->lasttarget = fs->pc;[m
[31m-  return fs->pc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int getjump (FuncState *fs, int pc) {[m
[31m-  int offset = GETARG_sBx(fs->f->code[pc]);[m
[31m-  if (offset == NO_JUMP)  /* point to itself represents end of list */[m
[31m-    return NO_JUMP;  /* end of list */[m
[31m-  else[m
[31m-    return (pc+1)+offset;  /* turn offset into absolute position */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Instruction *getjumpcontrol (FuncState *fs, int pc) {[m
[31m-  Instruction *pi = &fs->f->code[pc];[m
[31m-  if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1))))[m
[31m-    return pi-1;[m
[31m-  else[m
[31m-    return pi;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** check whether list has any jump that do not produce a value[m
[31m-** (or produce an inverted value)[m
[31m-*/[m
[31m-static int need_value (FuncState *fs, int list) {[m
[31m-  for (; list != NO_JUMP; list = getjump(fs, list)) {[m
[31m-    Instruction i = *getjumpcontrol(fs, list);[m
[31m-    if (GET_OPCODE(i) != OP_TESTSET) return 1;[m
[31m-  }[m
[31m-  return 0;  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int patchtestreg (FuncState *fs, int node, int reg) {[m
[31m-  Instruction *i = getjumpcontrol(fs, node);[m
[31m-  if (GET_OPCODE(*i) != OP_TESTSET)[m
[31m-    return 0;  /* cannot patch other instructions */[m
[31m-  if (reg != NO_REG && reg != GETARG_B(*i))[m
[31m-    SETARG_A(*i, reg);[m
[31m-  else  /* no register to put value or register already has the value */[m
[31m-    *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i));[m
[31m-[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void removevalues (FuncState *fs, int list) {[m
[31m-  for (; list != NO_JUMP; list = getjump(fs, list))[m
[31m-      patchtestreg(fs, list, NO_REG);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,[m
[31m-                          int dtarget) {[m
[31m-  while (list != NO_JUMP) {[m
[31m-    int next = getjump(fs, list);[m
[31m-    if (patchtestreg(fs, list, reg))[m
[31m-      fixjump(fs, list, vtarget);[m
[31m-    else[m
[31m-      fixjump(fs, list, dtarget);  /* jump to default target */[m
[31m-    list = next;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void dischargejpc (FuncState *fs) {[m
[31m-  patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc);[m
[31m-  fs->jpc = NO_JUMP;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_patchlist (FuncState *fs, int list, int target) {[m
[31m-  if (target == fs->pc)[m
[31m-    luaK_patchtohere(fs, list);[m
[31m-  else {[m
[31m-    lua_assert(target < fs->pc);[m
[31m-    patchlistaux(fs, list, target, NO_REG, target);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_patchtohere (FuncState *fs, int list) {[m
[31m-  luaK_getlabel(fs);[m
[31m-  luaK_concat(fs, &fs->jpc, list);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_concat (FuncState *fs, int *l1, int l2) {[m
[31m-  if (l2 == NO_JUMP) return;[m
[31m-  else if (*l1 == NO_JUMP)[m
[31m-    *l1 = l2;[m
[31m-  else {[m
[31m-    int list = *l1;[m
[31m-    int next;[m
[31m-    while ((next = getjump(fs, list)) != NO_JUMP)  /* find last element */[m
[31m-      list = next;[m
[31m-    fixjump(fs, list, l2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_checkstack (FuncState *fs, int n) {[m
[31m-  int newstack = fs->freereg + n;[m
[31m-  if (newstack > fs->f->maxstacksize) {[m
[31m-    if (newstack >= MAXSTACK)[m
[31m-      luaX_syntaxerror(fs->ls, "function or expression too complex");[m
[31m-    fs->f->maxstacksize = cast_byte(newstack);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_reserveregs (FuncState *fs, int n) {[m
[31m-  luaK_checkstack(fs, n);[m
[31m-  fs->freereg += n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void freereg (FuncState *fs, int reg) {[m
[31m-  if (!ISK(reg) && reg >= fs->nactvar) {[m
[31m-    fs->freereg--;[m
[31m-    lua_assert(reg == fs->freereg);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void freeexp (FuncState *fs, expdesc *e) {[m
[31m-  if (e->k == VNONRELOC)[m
[31m-    freereg(fs, e->u.s.info);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int addk (FuncState *fs, TValue *k, TValue *v) {[m
[31m-  lua_State *L = fs->L;[m
[31m-  TValue *idx = luaH_set(L, fs->h, k);[m
[31m-  Proto *f = fs->f;[m
[31m-  int oldsize = f->sizek;[m
[31m-  if (ttisnumber(idx)) {[m
[31m-    lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v));[m
[31m-    return cast_int(nvalue(idx));[m
[31m-  }[m
[31m-  else {  /* constant not found; create a new entry */[m
[31m-    setnvalue(idx, cast_num(fs->nk));[m
[31m-    luaM_growvector(L, f->k, fs->nk, f->sizek, TValue,[m
[31m-                    MAXARG_Bx, "constant table overflow");[m
[31m-    while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);[m
[31m-    setobj(L, &f->k[fs->nk], v);[m
[31m-    luaC_barrier(L, f, v);[m
[31m-    return fs->nk++;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_stringK (FuncState *fs, TString *s) {[m
[31m-  TValue o;[m
[31m-  setsvalue(fs->L, &o, s);[m
[31m-  return addk(fs, &o, &o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_numberK (FuncState *fs, lua_Number r) {[m
[31m-  TValue o;[m
[31m-  setnvalue(&o, r);[m
[31m-  return addk(fs, &o, &o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int boolK (FuncState *fs, int b) {[m
[31m-  TValue o;[m
[31m-  setbvalue(&o, b);[m
[31m-  return addk(fs, &o, &o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int nilK (FuncState *fs) {[m
[31m-  TValue k, v;[m
[31m-  setnilvalue(&v);[m
[31m-  /* cannot use nil as key; instead use table itself to represent nil */[m
[31m-  sethvalue(fs->L, &k, fs->h);[m
[31m-  return addk(fs, &k, &v);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {[m
[31m-  if (e->k == VCALL) {  /* expression is an open function call? */[m
[31m-    SETARG_C(getcode(fs, e), nresults+1);[m
[31m-  }[m
[31m-  else if (e->k == VVARARG) {[m
[31m-    SETARG_B(getcode(fs, e), nresults+1);[m
[31m-    SETARG_A(getcode(fs, e), fs->freereg);[m
[31m-    luaK_reserveregs(fs, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_setoneret (FuncState *fs, expdesc *e) {[m
[31m-  if (e->k == VCALL) {  /* expression is an open function call? */[m
[31m-    e->k = VNONRELOC;[m
[31m-    e->u.s.info = GETARG_A(getcode(fs, e));[m
[31m-  }[m
[31m-  else if (e->k == VVARARG) {[m
[31m-    SETARG_B(getcode(fs, e), 2);[m
[31m-    e->k = VRELOCABLE;  /* can relocate its simple result */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_dischargevars (FuncState *fs, expdesc *e) {[m
[31m-  switch (e->k) {[m
[31m-    case VLOCAL: {[m
[31m-      e->k = VNONRELOC;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VUPVAL: {[m
[31m-      e->u.s.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.s.info, 0);[m
[31m-      e->k = VRELOCABLE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VGLOBAL: {[m
[31m-      e->u.s.info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->u.s.info);[m
[31m-      e->k = VRELOCABLE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VINDEXED: {[m
[31m-      freereg(fs, e->u.s.aux);[m
[31m-      freereg(fs, e->u.s.info);[m
[31m-      e->u.s.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.s.info, e->u.s.aux);[m
[31m-      e->k = VRELOCABLE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VVARARG:[m
[31m-    case VCALL: {[m
[31m-      luaK_setoneret(fs, e);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: break;  /* there is one value available (somewhere) */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int code_label (FuncState *fs, int A, int b, int jump) {[m
[31m-  luaK_getlabel(fs);  /* those instructions may be jump targets */[m
[31m-  return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void discharge2reg (FuncState *fs, expdesc *e, int reg) {[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VNIL: {[m
[31m-      luaK_nil(fs, reg, 1);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VFALSE:  case VTRUE: {[m
[31m-      luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VK: {[m
[31m-      luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VKNUM: {[m
[31m-      luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval));[m
[31m-      break;[m
[31m-    }[m
[31m-    case VRELOCABLE: {[m
[31m-      Instruction *pc = &getcode(fs, e);[m
[31m-      SETARG_A(*pc, reg);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VNONRELOC: {[m
[31m-      if (reg != e->u.s.info)[m
[31m-        luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      lua_assert(e->k == VVOID || e->k == VJMP);[m
[31m-      return;  /* nothing to do... */[m
[31m-    }[m
[31m-  }[m
[31m-  e->u.s.info = reg;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void discharge2anyreg (FuncState *fs, expdesc *e) {[m
[31m-  if (e->k != VNONRELOC) {[m
[31m-    luaK_reserveregs(fs, 1);[m
[31m-    discharge2reg(fs, e, fs->freereg-1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void exp2reg (FuncState *fs, expdesc *e, int reg) {[m
[31m-  discharge2reg(fs, e, reg);[m
[31m-  if (e->k == VJMP)[m
[31m-    luaK_concat(fs, &e->t, e->u.s.info);  /* put this jump in `t' list */[m
[31m-  if (hasjumps(e)) {[m
[31m-    int final;  /* position after whole expression */[m
[31m-    int p_f = NO_JUMP;  /* position of an eventual LOAD false */[m
[31m-    int p_t = NO_JUMP;  /* position of an eventual LOAD true */[m
[31m-    if (need_value(fs, e->t) || need_value(fs, e->f)) {[m
[31m-      int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);[m
[31m-      p_f = code_label(fs, reg, 0, 1);[m
[31m-      p_t = code_label(fs, reg, 1, 0);[m
[31m-      luaK_patchtohere(fs, fj);[m
[31m-    }[m
[31m-    final = luaK_getlabel(fs);[m
[31m-    patchlistaux(fs, e->f, final, reg, p_f);[m
[31m-    patchlistaux(fs, e->t, final, reg, p_t);[m
[31m-  }[m
[31m-  e->f = e->t = NO_JUMP;[m
[31m-  e->u.s.info = reg;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_exp2nextreg (FuncState *fs, expdesc *e) {[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  freeexp(fs, e);[m
[31m-  luaK_reserveregs(fs, 1);[m
[31m-  exp2reg(fs, e, fs->freereg - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_exp2anyreg (FuncState *fs, expdesc *e) {[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  if (e->k == VNONRELOC) {[m
[31m-    if (!hasjumps(e)) return e->u.s.info;  /* exp is already in a register */[m
[31m-    if (e->u.s.info >= fs->nactvar) {  /* reg. is not a local? */[m
[31m-      exp2reg(fs, e, e->u.s.info);  /* put value on it */[m
[31m-      return e->u.s.info;[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_exp2nextreg(fs, e);  /* default */[m
[31m-  return e->u.s.info;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_exp2val (FuncState *fs, expdesc *e) {[m
[31m-  if (hasjumps(e))[m
[31m-    luaK_exp2anyreg(fs, e);[m
[31m-  else[m
[31m-    luaK_dischargevars(fs, e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_exp2RK (FuncState *fs, expdesc *e) {[m
[31m-  luaK_exp2val(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VKNUM:[m
[31m-    case VTRUE:[m
[31m-    case VFALSE:[m
[31m-    case VNIL: {[m
[31m-      if (fs->nk <= MAXINDEXRK) {  /* constant fit in RK operand? */[m
[31m-        e->u.s.info = (e->k == VNIL)  ? nilK(fs) :[m
[31m-                      (e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) :[m
[31m-                                        boolK(fs, (e->k == VTRUE));[m
[31m-        e->k = VK;[m
[31m-        return RKASK(e->u.s.info);[m
[31m-      }[m
[31m-      else break;[m
[31m-    }[m
[31m-    case VK: {[m
[31m-      if (e->u.s.info <= MAXINDEXRK)  /* constant fit in argC? */[m
[31m-        return RKASK(e->u.s.info);[m
[31m-      else break;[m
[31m-    }[m
[31m-    default: break;[m
[31m-  }[m
[31m-  /* not a constant in the right range: put it in a register */[m
[31m-  return luaK_exp2anyreg(fs, e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {[m
[31m-  switch (var->k) {[m
[31m-    case VLOCAL: {[m
[31m-      freeexp(fs, ex);[m
[31m-      exp2reg(fs, ex, var->u.s.info);[m
[31m-      return;[m
[31m-    }[m
[31m-    case VUPVAL: {[m
[31m-      int e = luaK_exp2anyreg(fs, ex);[m
[31m-      luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VGLOBAL: {[m
[31m-      int e = luaK_exp2anyreg(fs, ex);[m
[31m-      luaK_codeABx(fs, OP_SETGLOBAL, e, var->u.s.info);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VINDEXED: {[m
[31m-      int e = luaK_exp2RK(fs, ex);[m
[31m-      luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      lua_assert(0);  /* invalid var kind to store */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  freeexp(fs, ex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {[m
[31m-  int func;[m
[31m-  luaK_exp2anyreg(fs, e);[m
[31m-  freeexp(fs, e);[m
[31m-  func = fs->freereg;[m
[31m-  luaK_reserveregs(fs, 2);[m
[31m-  luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key));[m
[31m-  freeexp(fs, key);[m
[31m-  e->u.s.info = func;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void invertjump (FuncState *fs, expdesc *e) {[m
[31m-  Instruction *pc = getjumpcontrol(fs, e->u.s.info);[m
[31m-  lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET &&[m
[31m-                                           GET_OPCODE(*pc) != OP_TEST);[m
[31m-  SETARG_A(*pc, !(GETARG_A(*pc)));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int jumponcond (FuncState *fs, expdesc *e, int cond) {[m
[31m-  if (e->k == VRELOCABLE) {[m
[31m-    Instruction ie = getcode(fs, e);[m
[31m-    if (GET_OPCODE(ie) == OP_NOT) {[m
[31m-      fs->pc--;  /* remove previous OP_NOT */[m
[31m-      return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond);[m
[31m-    }[m
[31m-    /* else go through */[m
[31m-  }[m
[31m-  discharge2anyreg(fs, e);[m
[31m-  freeexp(fs, e);[m
[31m-  return condjump(fs, OP_TESTSET, NO_REG, e->u.s.info, cond);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_goiftrue (FuncState *fs, expdesc *e) {[m
[31m-  int pc;  /* pc of last jump */[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VK: case VKNUM: case VTRUE: {[m
[31m-      pc = NO_JUMP;  /* always true; do nothing */[m
[31m-      break;[m
[31m-    }[m
[31m-    case VJMP: {[m
[31m-      invertjump(fs, e);[m
[31m-      pc = e->u.s.info;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      pc = jumponcond(fs, e, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_concat(fs, &e->f, pc);  /* insert last jump in `f' list */[m
[31m-  luaK_patchtohere(fs, e->t);[m
[31m-  e->t = NO_JUMP;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void luaK_goiffalse (FuncState *fs, expdesc *e) {[m
[31m-  int pc;  /* pc of last jump */[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VNIL: case VFALSE: {[m
[31m-      pc = NO_JUMP;  /* always false; do nothing */[m
[31m-      break;[m
[31m-    }[m
[31m-    case VJMP: {[m
[31m-      pc = e->u.s.info;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      pc = jumponcond(fs, e, 1);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_concat(fs, &e->t, pc);  /* insert last jump in `t' list */[m
[31m-  luaK_patchtohere(fs, e->f);[m
[31m-  e->f = NO_JUMP;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void codenot (FuncState *fs, expdesc *e) {[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VNIL: case VFALSE: {[m
[31m-      e->k = VTRUE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VK: case VKNUM: case VTRUE: {[m
[31m-      e->k = VFALSE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VJMP: {[m
[31m-      invertjump(fs, e);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VRELOCABLE:[m
[31m-    case VNONRELOC: {[m
[31m-      discharge2anyreg(fs, e);[m
[31m-      freeexp(fs, e);[m
[31m-      e->u.s.info = luaK_codeABC(fs, OP_NOT, 0, e->u.s.info, 0);[m
[31m-      e->k = VRELOCABLE;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      lua_assert(0);  /* cannot happen */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* interchange true and false lists */[m
[31m-  { int temp = e->f; e->f = e->t; e->t = temp; }[m
[31m-  removevalues(fs, e->f);[m
[31m-  removevalues(fs, e->t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {[m
[31m-  t->u.s.aux = luaK_exp2RK(fs, k);[m
[31m-  t->k = VINDEXED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {[m
[31m-  lua_Number v1, v2, r;[m
[31m-  if (!isnumeral(e1) || !isnumeral(e2)) return 0;[m
[31m-  v1 = e1->u.nval;[m
[31m-  v2 = e2->u.nval;[m
[31m-  switch (op) {[m
[31m-    case OP_ADD: r = luai_numadd(v1, v2); break;[m
[31m-    case OP_SUB: r = luai_numsub(v1, v2); break;[m
[31m-    case OP_MUL: r = luai_nummul(v1, v2); break;[m
[31m-    case OP_DIV:[m
[31m-      if (v2 == 0) return 0;  /* do not attempt to divide by 0 */[m
[31m-      r = luai_numdiv(v1, v2); break;[m
[31m-    case OP_MOD:[m
[31m-      if (v2 == 0) return 0;  /* do not attempt to divide by 0 */[m
[31m-      r = luai_nummod(v1, v2); break;[m
[31m-    case OP_POW: r = luai_numpow(v1, v2); break;[m
[31m-    case OP_UNM: r = luai_numunm(v1); break;[m
[31m-    case OP_LEN: return 0;  /* no constant folding for 'len' */[m
[31m-    default: lua_assert(0); r = 0; break;[m
[31m-  }[m
[31m-  if (luai_numisnan(r)) return 0;  /* do not attempt to produce NaN */[m
[31m-  e1->u.nval = r;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {[m
[31m-  if (constfolding(op, e1, e2))[m
[31m-    return;[m
[31m-  else {[m
[31m-    int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0;[m
[31m-    int o1 = luaK_exp2RK(fs, e1);[m
[31m-    if (o1 > o2) {[m
[31m-      freeexp(fs, e1);[m
[31m-      freeexp(fs, e2);[m
[31m-    }[m
[31m-    else {[m
[31m-      freeexp(fs, e2);[m
[31m-      freeexp(fs, e1);[m
[31m-    }[m
[31m-    e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2);[m
[31m-    e1->k = VRELOCABLE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,[m
[31m-                                                          expdesc *e2) {[m
[31m-  int o1 = luaK_exp2RK(fs, e1);[m
[31m-  int o2 = luaK_exp2RK(fs, e2);[m
[31m-  freeexp(fs, e2);[m
[31m-  freeexp(fs, e1);[m
[31m-  if (cond == 0 && op != OP_EQ) {[m
[31m-    int temp;  /* exchange args to replace by `<' or `<=' */[m
[31m-    temp = o1; o1 = o2; o2 = temp;  /* o1 <==> o2 */[m
[31m-    cond = 1;[m
[31m-  }[m
[31m-  e1->u.s.info = condjump(fs, op, cond, o1, o2);[m
[31m-  e1->k = VJMP;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {[m
[31m-  expdesc e2;[m
[31m-  e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;[m
[31m-  switch (op) {[m
[31m-    case OPR_MINUS: {[m
[31m-      if (!isnumeral(e))[m
[31m-        luaK_exp2anyreg(fs, e);  /* cannot operate on non-numeric constants */[m
[31m-      codearith(fs, OP_UNM, e, &e2);[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_NOT: codenot(fs, e); break;[m
[31m-    case OPR_LEN: {[m
[31m-      luaK_exp2anyreg(fs, e);  /* cannot operate on constants */[m
[31m-      codearith(fs, OP_LEN, e, &e2);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: lua_assert(0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {[m
[31m-  switch (op) {[m
[31m-    case OPR_AND: {[m
[31m-      luaK_goiftrue(fs, v);[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_OR: {[m
[31m-      luaK_goiffalse(fs, v);[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_CONCAT: {[m
[31m-      luaK_exp2nextreg(fs, v);  /* operand must be on the `stack' */[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:[m
[31m-    case OPR_MOD: case OPR_POW: {[m
[31m-      if (!isnumeral(v)) luaK_exp2RK(fs, v);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      luaK_exp2RK(fs, v);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {[m
[31m-  switch (op) {[m
[31m-    case OPR_AND: {[m
[31m-      lua_assert(e1->t == NO_JUMP);  /* list must be closed */[m
[31m-      luaK_dischargevars(fs, e2);[m
[31m-      luaK_concat(fs, &e2->f, e1->f);[m
[31m-      *e1 = *e2;[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_OR: {[m
[31m-      lua_assert(e1->f == NO_JUMP);  /* list must be closed */[m
[31m-      luaK_dischargevars(fs, e2);[m
[31m-      luaK_concat(fs, &e2->t, e1->t);[m
[31m-      *e1 = *e2;[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_CONCAT: {[m
[31m-      luaK_exp2val(fs, e2);[m
[31m-      if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) {[m
[31m-        lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1);[m
[31m-        freeexp(fs, e1);[m
[31m-        SETARG_B(getcode(fs, e2), e1->u.s.info);[m
[31m-        e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info;[m
[31m-      }[m
[31m-      else {[m
[31m-        luaK_exp2nextreg(fs, e2);  /* operand must be on the 'stack' */[m
[31m-        codearith(fs, OP_CONCAT, e1, e2);[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break;[m
[31m-    case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break;[m
[31m-    case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break;[m
[31m-    case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break;[m
[31m-    case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break;[m
[31m-    case OPR_POW: codearith(fs, OP_POW, e1, e2); break;[m
[31m-    case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break;[m
[31m-    case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break;[m
[31m-    case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break;[m
[31m-    case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break;[m
[31m-    case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break;[m
[31m-    case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break;[m
[31m-    default: lua_assert(0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_fixline (FuncState *fs, int line) {[m
[31m-  fs->f->lineinfo[fs->pc - 1] = line;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaK_code (FuncState *fs, Instruction i, int line) {[m
[31m-  Proto *f = fs->f;[m
[31m-  dischargejpc(fs);  /* `pc' will change */[m
[31m-  /* put new instruction in code array */[m
[31m-  luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,[m
[31m-                  MAX_INT, "code size overflow");[m
[31m-  f->code[fs->pc] = i;[m
[31m-  /* save corresponding line information */[m
[31m-  luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int,[m
[31m-                  MAX_INT, "code size overflow");[m
[31m-  f->lineinfo[fs->pc] = line;[m
[31m-  return fs->pc++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {[m
[31m-  lua_assert(getOpMode(o) == iABC);[m
[31m-  lua_assert(getBMode(o) != OpArgN || b == 0);[m
[31m-  lua_assert(getCMode(o) != OpArgN || c == 0);[m
[31m-  return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {[m
[31m-  lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx);[m
[31m-  lua_assert(getCMode(o) == OpArgN);[m
[31m-  return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {[m
[31m-  int c =  (nelems - 1)/LFIELDS_PER_FLUSH + 1;[m
[31m-  int b = (tostore == LUA_MULTRET) ? 0 : tostore;[m
[31m-  lua_assert(tostore != 0);[m
[31m-  if (c <= MAXARG_C)[m
[31m-    luaK_codeABC(fs, OP_SETLIST, base, b, c);[m
[31m-  else {[m
[31m-    luaK_codeABC(fs, OP_SETLIST, base, b, 0);[m
[31m-    luaK_code(fs, cast(Instruction, c), fs->ls->lastline);[m
[31m-  }[m
[31m-  fs->freereg = base + 1;  /* free registers with list values */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lcode.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lcode.h[m
[1mdeleted file mode 100644[m
[1mindex b941c60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lcode.h[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Code generator for Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lcode_h[m
[31m-#define lcode_h[m
[31m-[m
[31m-#include "llex.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lparser.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Marks the end of a patch list. It is an invalid value both as an absolute[m
[31m-** address, and as a list link (would link an element to itself).[m
[31m-*/[m
[31m-#define NO_JUMP (-1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** grep "ORDER OPR" if you change these enums[m
[31m-*/[m
[31m-typedef enum BinOpr {[m
[31m-  OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,[m
[31m-  OPR_CONCAT,[m
[31m-  OPR_NE, OPR_EQ,[m
[31m-  OPR_LT, OPR_LE, OPR_GT, OPR_GE,[m
[31m-  OPR_AND, OPR_OR,[m
[31m-  OPR_NOBINOPR[m
[31m-} BinOpr;[m
[31m-[m
[31m-[m
[31m-typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;[m
[31m-[m
[31m-[m
[31m-#define getcode(fs,e)	((fs)->f->code[(e)->u.s.info])[m
[31m-[m
[31m-#define luaK_codeAsBx(fs,o,A,sBx)	luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)[m
[31m-[m
[31m-#define luaK_setmultret(fs,e)	luaK_setreturns(fs, e, LUA_MULTRET)[m
[31m-[m
[31m-LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);[m
[31m-LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);[m
[31m-LUAI_FUNC void luaK_fixline (FuncState *fs, int line);[m
[31m-LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);[m
[31m-LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);[m
[31m-LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);[m
[31m-LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s);[m
[31m-LUAI_FUNC int luaK_numberK (FuncState *fs, lua_Number r);[m
[31m-LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);[m
[31m-LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);[m
[31m-LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);[m
[31m-LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);[m
[31m-LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC int luaK_jump (FuncState *fs);[m
[31m-LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);[m
[31m-LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);[m
[31m-LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);[m
[31m-LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);[m
[31m-LUAI_FUNC int luaK_getlabel (FuncState *fs);[m
[31m-LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v);[m
[31m-LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);[m
[31m-LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2);[m
[31m-LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldblib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldblib.c[m
[1mdeleted file mode 100644[m
[1mindex 2027eda..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldblib.c[m
[1m+++ /dev/null[m
[36m@@ -1,398 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldblib.c,v 1.104.1.4 2009/08/04 18:50:18 roberto Exp $[m
[31m-** Interface from Lua to its debug API[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define ldblib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int db_getregistry (lua_State *L) {[m
[31m-  lua_pushvalue(L, LUA_REGISTRYINDEX);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_getmetatable (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    lua_pushnil(L);  /* no metatable */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_setmetatable (lua_State *L) {[m
[31m-  int t = lua_type(L, 2);[m
[31m-  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,[m
[31m-                    "nil or table expected");[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_pushboolean(L, lua_setmetatable(L, 1));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_getfenv (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  lua_getfenv(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_setfenv (lua_State *L) {[m
[31m-  luaL_checktype(L, 2, LUA_TTABLE);[m
[31m-  lua_settop(L, 2);[m
[31m-  if (lua_setfenv(L, 1) == 0)[m
[31m-    luaL_error(L, LUA_QL("setfenv")[m
[31m-                  " cannot change environment of given object");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void settabss (lua_State *L, const char *i, const char *v) {[m
[31m-  lua_pushstring(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void settabsi (lua_State *L, const char *i, int v) {[m
[31m-  lua_pushinteger(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_State *getthread (lua_State *L, int *arg) {[m
[31m-  if (lua_isthread(L, 1)) {[m
[31m-    *arg = 1;[m
[31m-    return lua_tothread(L, 1);[m
[31m-  }[m
[31m-  else {[m
[31m-    *arg = 0;[m
[31m-    return L;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) {[m
[31m-  if (L == L1) {[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_remove(L, -3);[m
[31m-  }[m
[31m-  else[m
[31m-    lua_xmove(L1, L, 1);[m
[31m-  lua_setfield(L, -2, fname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_getinfo (lua_State *L) {[m
[31m-  lua_Debug ar;[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  const char *options = luaL_optstring(L, arg+2, "flnSu");[m
[31m-  if (lua_isnumber(L, arg+1)) {[m
[31m-    if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), &ar)) {[m
[31m-      lua_pushnil(L);  /* level out of range */[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  else if (lua_isfunction(L, arg+1)) {[m
[31m-    lua_pushfstring(L, ">%s", options);[m
[31m-    options = lua_tostring(L, -1);[m
[31m-    lua_pushvalue(L, arg+1);[m
[31m-    lua_xmove(L, L1, 1);[m
[31m-  }[m
[31m-  else[m
[31m-    return luaL_argerror(L, arg+1, "function or level expected");[m
[31m-  if (!lua_getinfo(L1, options, &ar))[m
[31m-    return luaL_argerror(L, arg+2, "invalid option");[m
[31m-  lua_createtable(L, 0, 2);[m
[31m-  if (strchr(options, 'S')) {[m
[31m-    settabss(L, "source", ar.source);[m
[31m-    settabss(L, "short_src", ar.short_src);[m
[31m-    settabsi(L, "linedefined", ar.linedefined);[m
[31m-    settabsi(L, "lastlinedefined", ar.lastlinedefined);[m
[31m-    settabss(L, "what", ar.what);[m
[31m-  }[m
[31m-  if (strchr(options, 'l'))[m
[31m-    settabsi(L, "currentline", ar.currentline);[m
[31m-  if (strchr(options, 'u'))[m
[31m-    settabsi(L, "nups", ar.nups);[m
[31m-  if (strchr(options, 'n')) {[m
[31m-    settabss(L, "name", ar.name);[m
[31m-    settabss(L, "namewhat", ar.namewhat);[m
[31m-  }[m
[31m-  if (strchr(options, 'L'))[m
[31m-    treatstackoption(L, L1, "activelines");[m
[31m-  if (strchr(options, 'f'))[m
[31m-    treatstackoption(L, L1, "func");[m
[31m-  return 1;  /* return table */[m
[31m-}[m
[31m-    [m
[31m-[m
[31m-static int db_getlocal (lua_State *L) {[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  const char *name;[m
[31m-  if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar))  /* out of range? */[m
[31m-    return luaL_argerror(L, arg+1, "level out of range");[m
[31m-  name = lua_getlocal(L1, &ar, luaL_checkint(L, arg+2));[m
[31m-  if (name) {[m
[31m-    lua_xmove(L1, L, 1);[m
[31m-    lua_pushstring(L, name);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    return 2;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_setlocal (lua_State *L) {[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar))  /* out of range? */[m
[31m-    return luaL_argerror(L, arg+1, "level out of range");[m
[31m-  luaL_checkany(L, arg+3);[m
[31m-  lua_settop(L, arg+3);[m
[31m-  lua_xmove(L, L1, 1);[m
[31m-  lua_pushstring(L, lua_setlocal(L1, &ar, luaL_checkint(L, arg+2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int auxupvalue (lua_State *L, int get) {[m
[31m-  const char *name;[m
[31m-  int n = luaL_checkint(L, 2);[m
[31m-  luaL_checktype(L, 1, LUA_TFUNCTION);[m
[31m-  if (lua_iscfunction(L, 1)) return 0;  /* cannot touch C upvalues from Lua */[m
[31m-  name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n);[m
[31m-  if (name == NULL) return 0;[m
[31m-  lua_pushstring(L, name);[m
[31m-  lua_insert(L, -(get+1));[m
[31m-  return get + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_getupvalue (lua_State *L) {[m
[31m-  return auxupvalue(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_setupvalue (lua_State *L) {[m
[31m-  luaL_checkany(L, 3);[m
[31m-  return auxupvalue(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static const char KEY_HOOK = 'h';[m
[31m-[m
[31m-[m
[31m-static void hookf (lua_State *L, lua_Debug *ar) {[m
[31m-  static const char *const hooknames[] =[m
[31m-    {"call", "return", "line", "count", "tail return"};[m
[31m-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-  lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-  lua_pushlightuserdata(L, L);[m
[31m-  lua_rawget(L, -2);[m
[31m-  if (lua_isfunction(L, -1)) {[m
[31m-    lua_pushstring(L, hooknames[(int)ar->event]);[m
[31m-    if (ar->currentline >= 0)[m
[31m-      lua_pushinteger(L, ar->currentline);[m
[31m-    else lua_pushnil(L);[m
[31m-    lua_assert(lua_getinfo(L, "lS", ar));[m
[31m-    lua_call(L, 2, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int makemask (const char *smask, int count) {[m
[31m-  int mask = 0;[m
[31m-  if (strchr(smask, 'c')) mask |= LUA_MASKCALL;[m
[31m-  if (strchr(smask, 'r')) mask |= LUA_MASKRET;[m
[31m-  if (strchr(smask, 'l')) mask |= LUA_MASKLINE;[m
[31m-  if (count > 0) mask |= LUA_MASKCOUNT;[m
[31m-  return mask;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *unmakemask (int mask, char *smask) {[m
[31m-  int i = 0;[m
[31m-  if (mask & LUA_MASKCALL) smask[i++] = 'c';[m
[31m-  if (mask & LUA_MASKRET) smask[i++] = 'r';[m
[31m-  if (mask & LUA_MASKLINE) smask[i++] = 'l';[m
[31m-  smask[i] = '\0';[m
[31m-  return smask;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void gethooktable (lua_State *L) {[m
[31m-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-  lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-  if (!lua_istable(L, -1)) {[m
[31m-    lua_pop(L, 1);[m
[31m-    lua_createtable(L, 0, 1);[m
[31m-    lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_sethook (lua_State *L) {[m
[31m-  int arg, mask, count;[m
[31m-  lua_Hook func;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  if (lua_isnoneornil(L, arg+1)) {[m
[31m-    lua_settop(L, arg+1);[m
[31m-    func = NULL; mask = 0; count = 0;  /* turn off hooks */[m
[31m-  }[m
[31m-  else {[m
[31m-    const char *smask = luaL_checkstring(L, arg+2);[m
[31m-    luaL_checktype(L, arg+1, LUA_TFUNCTION);[m
[31m-    count = luaL_optint(L, arg+3, 0);[m
[31m-    func = hookf; mask = makemask(smask, count);[m
[31m-  }[m
[31m-  gethooktable(L);[m
[31m-  lua_pushlightuserdata(L, L1);[m
[31m-  lua_pushvalue(L, arg+1);[m
[31m-  lua_rawset(L, -3);  /* set new hook */[m
[31m-  lua_pop(L, 1);  /* remove hook table */[m
[31m-  lua_sethook(L1, func, mask, count);  /* set hooks */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_gethook (lua_State *L) {[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  char buff[5];[m
[31m-  int mask = lua_gethookmask(L1);[m
[31m-  lua_Hook hook = lua_gethook(L1);[m
[31m-  if (hook != NULL && hook != hookf)  /* external hook? */[m
[31m-    lua_pushliteral(L, "external hook");[m
[31m-  else {[m
[31m-    gethooktable(L);[m
[31m-    lua_pushlightuserdata(L, L1);[m
[31m-    lua_rawget(L, -2);   /* get hook */[m
[31m-    lua_remove(L, -2);  /* remove hook table */[m
[31m-  }[m
[31m-  lua_pushstring(L, unmakemask(mask, buff));[m
[31m-  lua_pushinteger(L, lua_gethookcount(L1));[m
[31m-  return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_debug (lua_State *L) {[m
[31m-  for (;;) {[m
[31m-    char buffer[250];[m
[31m-    fputs("lua_debug> ", stderr);[m
[31m-    if (fgets(buffer, sizeof(buffer), stdin) == 0 ||[m
[31m-        strcmp(buffer, "cont\n") == 0)[m
[31m-      return 0;[m
[31m-    if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||[m
[31m-        lua_pcall(L, 0, 0, 0)) {[m
[31m-      fputs(lua_tostring(L, -1), stderr);[m
[31m-      fputs("\n", stderr);[m
[31m-    }[m
[31m-    lua_settop(L, 0);  /* remove eventual returns */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define LEVELS1	12	/* size of the first part of the stack */[m
[31m-#define LEVELS2	10	/* size of the second part of the stack */[m
[31m-[m
[31m-static int db_errorfb (lua_State *L) {[m
[31m-  int level;[m
[31m-  int firstpart = 1;  /* still before eventual `...' */[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  if (lua_isnumber(L, arg+2)) {[m
[31m-    level = (int)lua_tointeger(L, arg+2);[m
[31m-    lua_pop(L, 1);[m
[31m-  }[m
[31m-  else[m
[31m-    level = (L == L1) ? 1 : 0;  /* level 0 may be this own function */[m
[31m-  if (lua_gettop(L) == arg)[m
[31m-    lua_pushliteral(L, "");[m
[31m-  else if (!lua_isstring(L, arg+1)) return 1;  /* message is not a string */[m
[31m-  else lua_pushliteral(L, "\n");[m
[31m-  lua_pushliteral(L, "stack traceback:");[m
[31m-  while (lua_getstack(L1, level++, &ar)) {[m
[31m-    if (level > LEVELS1 && firstpart) {[m
[31m-      /* no more than `LEVELS2' more levels? */[m
[31m-      if (!lua_getstack(L1, level+LEVELS2, &ar))[m
[31m-        level--;  /* keep going */[m
[31m-      else {[m
[31m-        lua_pushliteral(L, "\n\t...");  /* too many levels */[m
[31m-        while (lua_getstack(L1, level+LEVELS2, &ar))  /* find last levels */[m
[31m-          level++;[m
[31m-      }[m
[31m-      firstpart = 0;[m
[31m-      continue;[m
[31m-    }[m
[31m-    lua_pushliteral(L, "\n\t");[m
[31m-    lua_getinfo(L1, "Snl", &ar);[m
[31m-    lua_pushfstring(L, "%s:", ar.short_src);[m
[31m-    if (ar.currentline > 0)[m
[31m-      lua_pushfstring(L, "%d:", ar.currentline);[m
[31m-    if (*ar.namewhat != '\0')  /* is there a name? */[m
[31m-        lua_pushfstring(L, " in function " LUA_QS, ar.name);[m
[31m-    else {[m
[31m-      if (*ar.what == 'm')  /* main? */[m
[31m-        lua_pushfstring(L, " in main chunk");[m
[31m-      else if (*ar.what == 'C' || *ar.what == 't')[m
[31m-        lua_pushliteral(L, " ?");  /* C function or tail call */[m
[31m-      else[m
[31m-        lua_pushfstring(L, " in function <%s:%d>",[m
[31m-                           ar.short_src, ar.linedefined);[m
[31m-    }[m
[31m-    lua_concat(L, lua_gettop(L) - arg);[m
[31m-  }[m
[31m-  lua_concat(L, lua_gettop(L) - arg);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg dblib[] = {[m
[31m-  {"debug", db_debug},[m
[31m-  {"getfenv", db_getfenv},[m
[31m-  {"gethook", db_gethook},[m
[31m-  {"getinfo", db_getinfo},[m
[31m-  {"getlocal", db_getlocal},[m
[31m-  {"getregistry", db_getregistry},[m
[31m-  {"getmetatable", db_getmetatable},[m
[31m-  {"getupvalue", db_getupvalue},[m
[31m-  {"setfenv", db_setfenv},[m
[31m-  {"sethook", db_sethook},[m
[31m-  {"setlocal", db_setlocal},[m
[31m-  {"setmetatable", db_setmetatable},[m
[31m-  {"setupvalue", db_setupvalue},[m
[31m-  {"traceback", db_errorfb},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_debug (lua_State *L) {[m
[31m-  luaL_register(L, LUA_DBLIBNAME, dblib);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldebug.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldebug.c[m
[1mdeleted file mode 100644[m
[1mindex 50ad3d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldebug.c[m
[1m+++ /dev/null[m
[36m@@ -1,638 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $[m
[31m-** Debug Interface[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#define ldebug_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lapi.h"[m
[31m-#include "lcode.h"[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lvm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name);[m
[31m-[m
[31m-[m
[31m-static int currentpc (lua_State *L, CallInfo *ci) {[m
[31m-  if (!isLua(ci)) return -1;  /* function is not a Lua function? */[m
[31m-  if (ci == L->ci)[m
[31m-    ci->savedpc = L->savedpc;[m
[31m-  return pcRel(ci->savedpc, ci_func(ci)->l.p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int currentline (lua_State *L, CallInfo *ci) {[m
[31m-  int pc = currentpc(L, ci);[m
[31m-  if (pc < 0)[m
[31m-    return -1;  /* only active lua functions have current-line information */[m
[31m-  else[m
[31m-    return getline(ci_func(ci)->l.p, pc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** this function can be called asynchronous (e.g. during a signal)[m
[31m-*/[m
[31m-LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) {[m
[31m-  if (func == NULL || mask == 0) {  /* turn off hooks? */[m
[31m-    mask = 0;[m
[31m-    func = NULL;[m
[31m-  }[m
[31m-  L->hook = func;[m
[31m-  L->basehookcount = count;[m
[31m-  resethookcount(L);[m
[31m-  L->hookmask = cast_byte(mask);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_Hook lua_gethook (lua_State *L) {[m
[31m-  return L->hook;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_gethookmask (lua_State *L) {[m
[31m-  return L->hookmask;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_gethookcount (lua_State *L) {[m
[31m-  return L->basehookcount;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {[m
[31m-  int status;[m
[31m-  CallInfo *ci;[m
[31m-  lua_lock(L);[m
[31m-  for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) {[m
[31m-    level--;[m
[31m-    if (f_isLua(ci))  /* Lua function? */[m
[31m-      level -= ci->tailcalls;  /* skip lost tail calls */[m
[31m-  }[m
[31m-  if (level == 0 && ci > L->base_ci) {  /* level found? */[m
[31m-    status = 1;[m
[31m-    ar->i_ci = cast_int(ci - L->base_ci);[m
[31m-  }[m
[31m-  else if (level < 0) {  /* level is of a lost tail call? */[m
[31m-    status = 1;[m
[31m-    ar->i_ci = 0;[m
[31m-  }[m
[31m-  else status = 0;  /* no such level */[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Proto *getluaproto (CallInfo *ci) {[m
[31m-  return (isLua(ci) ? ci_func(ci)->l.p : NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *findlocal (lua_State *L, CallInfo *ci, int n) {[m
[31m-  const char *name;[m
[31m-  Proto *fp = getluaproto(ci);[m
[31m-  if (fp && (name = luaF_getlocalname(fp, n, currentpc(L, ci))) != NULL)[m
[31m-    return name;  /* is a local variable in a Lua function */[m
[31m-  else {[m
[31m-    StkId limit = (ci == L->ci) ? L->top : (ci+1)->func;[m
[31m-    if (limit - ci->base >= n && n > 0)  /* is 'n' inside 'ci' stack? */[m
[31m-      return "(*temporary)";[m
[31m-    else[m
[31m-      return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {[m
[31m-  CallInfo *ci = L->base_ci + ar->i_ci;[m
[31m-  const char *name = findlocal(L, ci, n);[m
[31m-  lua_lock(L);[m
[31m-  if (name)[m
[31m-      luaA_pushobject(L, ci->base + (n - 1));[m
[31m-  lua_unlock(L);[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {[m
[31m-  CallInfo *ci = L->base_ci + ar->i_ci;[m
[31m-  const char *name = findlocal(L, ci, n);[m
[31m-  lua_lock(L);[m
[31m-  if (name)[m
[31m-      setobjs2s(L, ci->base + (n - 1), L->top - 1);[m
[31m-  L->top--;  /* pop value */[m
[31m-  lua_unlock(L);[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void funcinfo (lua_Debug *ar, Closure *cl) {[m
[31m-  if (cl->c.isC) {[m
[31m-    ar->source = "=[C]";[m
[31m-    ar->linedefined = -1;[m
[31m-    ar->lastlinedefined = -1;[m
[31m-    ar->what = "C";[m
[31m-  }[m
[31m-  else {[m
[31m-    ar->source = getstr(cl->l.p->source);[m
[31m-    ar->linedefined = cl->l.p->linedefined;[m
[31m-    ar->lastlinedefined = cl->l.p->lastlinedefined;[m
[31m-    ar->what = (ar->linedefined == 0) ? "main" : "Lua";[m
[31m-  }[m
[31m-  luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void info_tailcall (lua_Debug *ar) {[m
[31m-  ar->name = ar->namewhat = "";[m
[31m-  ar->what = "tail";[m
[31m-  ar->lastlinedefined = ar->linedefined = ar->currentline = -1;[m
[31m-  ar->source = "=(tail call)";[m
[31m-  luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);[m
[31m-  ar->nups = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void collectvalidlines (lua_State *L, Closure *f) {[m
[31m-  if (f == NULL || f->c.isC) {[m
[31m-    setnilvalue(L->top);[m
[31m-  }[m
[31m-  else {[m
[31m-    Table *t = luaH_new(L, 0, 0);[m
[31m-    int *lineinfo = f->l.p->lineinfo;[m
[31m-    int i;[m
[31m-    for (i=0; i<f->l.p->sizelineinfo; i++)[m
[31m-      setbvalue(luaH_setnum(L, t, lineinfo[i]), 1);[m
[31m-    sethvalue(L, L->top, t); [m
[31m-  }[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,[m
[31m-                    Closure *f, CallInfo *ci) {[m
[31m-  int status = 1;[m
[31m-  if (f == NULL) {[m
[31m-    info_tailcall(ar);[m
[31m-    return status;[m
[31m-  }[m
[31m-  for (; *what; what++) {[m
[31m-    switch (*what) {[m
[31m-      case 'S': {[m
[31m-        funcinfo(ar, f);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'l': {[m
[31m-        ar->currentline = (ci) ? currentline(L, ci) : -1;[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'u': {[m
[31m-        ar->nups = f->c.nupvalues;[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'n': {[m
[31m-        ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL;[m
[31m-        if (ar->namewhat == NULL) {[m
[31m-          ar->namewhat = "";  /* not found */[m
[31m-          ar->name = NULL;[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'L':[m
[31m-      case 'f':  /* handled by lua_getinfo */[m
[31m-        break;[m
[31m-      default: status = 0;  /* invalid option */[m
[31m-    }[m
[31m-  }[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {[m
[31m-  int status;[m
[31m-  Closure *f = NULL;[m
[31m-  CallInfo *ci = NULL;[m
[31m-  lua_lock(L);[m
[31m-  if (*what == '>') {[m
[31m-    StkId func = L->top - 1;[m
[31m-    luai_apicheck(L, ttisfunction(func));[m
[31m-    what++;  /* skip the '>' */[m
[31m-    f = clvalue(func);[m
[31m-    L->top--;  /* pop function */[m
[31m-  }[m
[31m-  else if (ar->i_ci != 0) {  /* no tail call? */[m
[31m-    ci = L->base_ci + ar->i_ci;[m
[31m-    lua_assert(ttisfunction(ci->func));[m
[31m-    f = clvalue(ci->func);[m
[31m-  }[m
[31m-  status = auxgetinfo(L, what, ar, f, ci);[m
[31m-  if (strchr(what, 'f')) {[m
[31m-    if (f == NULL) setnilvalue(L->top);[m
[31m-    else setclvalue(L, L->top, f);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  if (strchr(what, 'L'))[m
[31m-    collectvalidlines(L, f);[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Symbolic Execution and code checker[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-#define check(x)		if (!(x)) return 0;[m
[31m-[m
[31m-#define checkjump(pt,pc)	check(0 <= pc && pc < pt->sizecode)[m
[31m-[m
[31m-#define checkreg(pt,reg)	check((reg) < (pt)->maxstacksize)[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int precheck (const Proto *pt) {[m
[31m-  check(pt->maxstacksize <= MAXSTACK);[m
[31m-  check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);[m
[31m-  check(!(pt->is_vararg & VARARG_NEEDSARG) ||[m
[31m-              (pt->is_vararg & VARARG_HASARG));[m
[31m-  check(pt->sizeupvalues <= pt->nups);[m
[31m-  check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0);[m
[31m-  check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define checkopenop(pt,pc)	luaG_checkopenop((pt)->code[(pc)+1])[m
[31m-[m
[31m-int luaG_checkopenop (Instruction i) {[m
[31m-  switch (GET_OPCODE(i)) {[m
[31m-    case OP_CALL:[m
[31m-    case OP_TAILCALL:[m
[31m-    case OP_RETURN:[m
[31m-    case OP_SETLIST: {[m
[31m-      check(GETARG_B(i) == 0);[m
[31m-      return 1;[m
[31m-    }[m
[31m-    default: return 0;  /* invalid instruction after an open call */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) {[m
[31m-  switch (mode) {[m
[31m-    case OpArgN: check(r == 0); break;[m
[31m-    case OpArgU: break;[m
[31m-    case OpArgR: checkreg(pt, r); break;[m
[31m-    case OpArgK:[m
[31m-      check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize);[m
[31m-      break;[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Instruction symbexec (const Proto *pt, int lastpc, int reg) {[m
[31m-  int pc;[m
[31m-  int last;  /* stores position of last instruction that changed `reg' */[m
[31m-  last = pt->sizecode-1;  /* points to final return (a `neutral' instruction) */[m
[31m-  check(precheck(pt));[m
[31m-  for (pc = 0; pc < lastpc; pc++) {[m
[31m-    Instruction i = pt->code[pc];[m
[31m-    OpCode op = GET_OPCODE(i);[m
[31m-    int a = GETARG_A(i);[m
[31m-    int b = 0;[m
[31m-    int c = 0;[m
[31m-    check(op < NUM_OPCODES);[m
[31m-    checkreg(pt, a);[m
[31m-    switch (getOpMode(op)) {[m
[31m-      case iABC: {[m
[31m-        b = GETARG_B(i);[m
[31m-        c = GETARG_C(i);[m
[31m-        check(checkArgMode(pt, b, getBMode(op)));[m
[31m-        check(checkArgMode(pt, c, getCMode(op)));[m
[31m-        break;[m
[31m-      }[m
[31m-      case iABx: {[m
[31m-        b = GETARG_Bx(i);[m
[31m-        if (getBMode(op) == OpArgK) check(b < pt->sizek);[m
[31m-        break;[m
[31m-      }[m
[31m-      case iAsBx: {[m
[31m-        b = GETARG_sBx(i);[m
[31m-        if (getBMode(op) == OpArgR) {[m
[31m-          int dest = pc+1+b;[m
[31m-          check(0 <= dest && dest < pt->sizecode);[m
[31m-          if (dest > 0) {[m
[31m-            int j;[m
[31m-            /* check that it does not jump to a setlist count; this[m
[31m-               is tricky, because the count from a previous setlist may[m
[31m-               have the same value of an invalid setlist; so, we must[m
[31m-               go all the way back to the first of them (if any) */[m
[31m-            for (j = 0; j < dest; j++) {[m
[31m-              Instruction d = pt->code[dest-1-j];[m
[31m-              if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break;[m
[31m-            }[m
[31m-            /* if 'j' is even, previous value is not a setlist (even if[m
[31m-               it looks like one) */[m
[31m-            check((j&1) == 0);[m
[31m-          }[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-    }[m
[31m-    if (testAMode(op)) {[m
[31m-      if (a == reg) last = pc;  /* change register `a' */[m
[31m-    }[m
[31m-    if (testTMode(op)) {[m
[31m-      check(pc+2 < pt->sizecode);  /* check skip */[m
[31m-      check(GET_OPCODE(pt->code[pc+1]) == OP_JMP);[m
[31m-    }[m
[31m-    switch (op) {[m
[31m-      case OP_LOADBOOL: {[m
[31m-        if (c == 1) {  /* does it jump? */[m
[31m-          check(pc+2 < pt->sizecode);  /* check its jump */[m
[31m-          check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST ||[m
[31m-                GETARG_C(pt->code[pc+1]) != 0);[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_LOADNIL: {[m
[31m-        if (a <= reg && reg <= b)[m
[31m-          last = pc;  /* set registers from `a' to `b' */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_GETUPVAL:[m
[31m-      case OP_SETUPVAL: {[m
[31m-        check(b < pt->nups);[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_GETGLOBAL:[m
[31m-      case OP_SETGLOBAL: {[m
[31m-        check(ttisstring(&pt->k[b]));[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_SELF: {[m
[31m-        checkreg(pt, a+1);[m
[31m-        if (reg == a+1) last = pc;[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_CONCAT: {[m
[31m-        check(b < c);  /* at least two operands */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_TFORLOOP: {[m
[31m-        check(c >= 1);  /* at least one result (control variable) */[m
[31m-        checkreg(pt, a+2+c);  /* space for results */[m
[31m-        if (reg >= a+2) last = pc;  /* affect all regs above its base */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_FORLOOP:[m
[31m-      case OP_FORPREP:[m
[31m-        checkreg(pt, a+3);[m
[31m-        /* go through */[m
[31m-      case OP_JMP: {[m
[31m-        int dest = pc+1+b;[m
[31m-        /* not full check and jump is forward and do not skip `lastpc'? */[m
[31m-        if (reg != NO_REG && pc < dest && dest <= lastpc)[m
[31m-          pc += b;  /* do the jump */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_CALL:[m
[31m-      case OP_TAILCALL: {[m
[31m-        if (b != 0) {[m
[31m-          checkreg(pt, a+b-1);[m
[31m-        }[m
[31m-        c--;  /* c = num. returns */[m
[31m-        if (c == LUA_MULTRET) {[m
[31m-          check(checkopenop(pt, pc));[m
[31m-        }[m
[31m-        else if (c != 0)[m
[31m-          checkreg(pt, a+c-1);[m
[31m-        if (reg >= a) last = pc;  /* affect all registers above base */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_RETURN: {[m
[31m-        b--;  /* b = num. returns */[m
[31m-        if (b > 0) checkreg(pt, a+b-1);[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_SETLIST: {[m
[31m-        if (b > 0) checkreg(pt, a + b);[m
[31m-        if (c == 0) {[m
[31m-          pc++;[m
[31m-          check(pc < pt->sizecode - 1);[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_CLOSURE: {[m
[31m-        int nup, j;[m
[31m-        check(b < pt->sizep);[m
[31m-        nup = pt->p[b]->nups;[m
[31m-        check(pc + nup < pt->sizecode);[m
[31m-        for (j = 1; j <= nup; j++) {[m
[31m-          OpCode op1 = GET_OPCODE(pt->code[pc + j]);[m
[31m-          check(op1 == OP_GETUPVAL || op1 == OP_MOVE);[m
[31m-        }[m
[31m-        if (reg != NO_REG)  /* tracing? */[m
[31m-          pc += nup;  /* do not 'execute' these pseudo-instructions */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_VARARG: {[m
[31m-        check((pt->is_vararg & VARARG_ISVARARG) &&[m
[31m-             !(pt->is_vararg & VARARG_NEEDSARG));[m
[31m-        b--;[m
[31m-        if (b == LUA_MULTRET) check(checkopenop(pt, pc));[m
[31m-        checkreg(pt, a+b-1);[m
[31m-        break;[m
[31m-      }[m
[31m-      default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  return pt->code[last];[m
[31m-}[m
[31m-[m
[31m-#undef check[m
[31m-#undef checkjump[m
[31m-#undef checkreg[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-int luaG_checkcode (const Proto *pt) {[m
[31m-  return (symbexec(pt, pt->sizecode, NO_REG) != 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *kname (Proto *p, int c) {[m
[31m-  if (ISK(c) && ttisstring(&p->k[INDEXK(c)]))[m
[31m-    return svalue(&p->k[INDEXK(c)]);[m
[31m-  else[m
[31m-    return "?";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos,[m
[31m-                               const char **name) {[m
[31m-  if (isLua(ci)) {  /* a Lua function? */[m
[31m-    Proto *p = ci_func(ci)->l.p;[m
[31m-    int pc = currentpc(L, ci);[m
[31m-    Instruction i;[m
[31m-    *name = luaF_getlocalname(p, stackpos+1, pc);[m
[31m-    if (*name)  /* is a local? */[m
[31m-      return "local";[m
[31m-    i = symbexec(p, pc, stackpos);  /* try symbolic execution */[m
[31m-    lua_assert(pc != -1);[m
[31m-    switch (GET_OPCODE(i)) {[m
[31m-      case OP_GETGLOBAL: {[m
[31m-        int g = GETARG_Bx(i);  /* global index */[m
[31m-        lua_assert(ttisstring(&p->k[g]));[m
[31m-        *name = svalue(&p->k[g]);[m
[31m-        return "global";[m
[31m-      }[m
[31m-      case OP_MOVE: {[m
[31m-        int a = GETARG_A(i);[m
[31m-        int b = GETARG_B(i);  /* move from `b' to `a' */[m
[31m-        if (b < a)[m
[31m-          return getobjname(L, ci, b, name);  /* get name for `b' */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_GETTABLE: {[m
[31m-        int k = GETARG_C(i);  /* key index */[m
[31m-        *name = kname(p, k);[m
[31m-        return "field";[m
[31m-      }[m
[31m-      case OP_GETUPVAL: {[m
[31m-        int u = GETARG_B(i);  /* upvalue index */[m
[31m-        *name = p->upvalues ? getstr(p->upvalues[u]) : "?";[m
[31m-        return "upvalue";[m
[31m-      }[m
[31m-      case OP_SELF: {[m
[31m-        int k = GETARG_C(i);  /* key index */[m
[31m-        *name = kname(p, k);[m
[31m-        return "method";[m
[31m-      }[m
[31m-      default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* no useful name found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {[m
[31m-  Instruction i;[m
[31m-  if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1))[m
[31m-    return NULL;  /* calling function is not Lua (or is unknown) */[m
[31m-  ci--;  /* calling function */[m
[31m-  i = ci_func(ci)->l.p->code[currentpc(L, ci)];[m
[31m-  if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||[m
[31m-      GET_OPCODE(i) == OP_TFORLOOP)[m
[31m-    return getobjname(L, ci, GETARG_A(i), name);[m
[31m-  else[m
[31m-    return NULL;  /* no useful name can be found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* only ANSI way to check whether a pointer points to an array */[m
[31m-static int isinstack (CallInfo *ci, const TValue *o) {[m
[31m-  StkId p;[m
[31m-  for (p = ci->base; p < ci->top; p++)[m
[31m-    if (o == p) return 1;[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {[m
[31m-  const char *name = NULL;[m
[31m-  const char *t = luaT_typenames[ttype(o)];[m
[31m-  const char *kind = (isinstack(L->ci, o)) ?[m
[31m-                         getobjname(L, L->ci, cast_int(o - L->base), &name) :[m
[31m-                         NULL;[m
[31m-  if (kind)[m
[31m-    luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)",[m
[31m-                op, kind, name, t);[m
[31m-  else[m
[31m-    luaG_runerror(L, "attempt to %s a %s value", op, t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {[m
[31m-  if (ttisstring(p1) || ttisnumber(p1)) p1 = p2;[m
[31m-  lua_assert(!ttisstring(p1) && !ttisnumber(p1));[m
[31m-  luaG_typeerror(L, p1, "concatenate");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {[m
[31m-  TValue temp;[m
[31m-  if (luaV_tonumber(p1, &temp) == NULL)[m
[31m-    p2 = p1;  /* first operand is wrong */[m
[31m-  luaG_typeerror(L, p2, "perform arithmetic on");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {[m
[31m-  const char *t1 = luaT_typenames[ttype(p1)];[m
[31m-  const char *t2 = luaT_typenames[ttype(p2)];[m
[31m-  if (t1[2] == t2[2])[m
[31m-    luaG_runerror(L, "attempt to compare two %s values", t1);[m
[31m-  else[m
[31m-    luaG_runerror(L, "attempt to compare %s with %s", t1, t2);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void addinfo (lua_State *L, const char *msg) {[m
[31m-  CallInfo *ci = L->ci;[m
[31m-  if (isLua(ci)) {  /* is Lua code? */[m
[31m-    char buff[LUA_IDSIZE];  /* add file:line information */[m
[31m-    int line = currentline(L, ci);[m
[31m-    luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE);[m
[31m-    luaO_pushfstring(L, "%s:%d: %s", buff, line, msg);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_errormsg (lua_State *L) {[m
[31m-  if (L->errfunc != 0) {  /* is there an error handling function? */[m
[31m-    StkId errfunc = restorestack(L, L->errfunc);[m
[31m-    if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR);[m
[31m-    setobjs2s(L, L->top, L->top - 1);  /* move argument */[m
[31m-    setobjs2s(L, L->top - 1, errfunc);  /* push function */[m
[31m-    incr_top(L);[m
[31m-    luaD_call(L, L->top - 2, 1);  /* call it */[m
[31m-  }[m
[31m-  luaD_throw(L, LUA_ERRRUN);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_runerror (lua_State *L, const char *fmt, ...) {[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  addinfo(L, luaO_pushvfstring(L, fmt, argp));[m
[31m-  va_end(argp);[m
[31m-  luaG_errormsg(L);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldebug.h[m
[1mdeleted file mode 100644[m
[1mindex ba28a97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions from Debug Interface module[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef ldebug_h[m
[31m-#define ldebug_h[m
[31m-[m
[31m-[m
[31m-#include "lstate.h"[m
[31m-[m
[31m-[m
[31m-#define pcRel(pc, p)	(cast(int, (pc) - (p)->code) - 1)[m
[31m-[m
[31m-#define getline(f,pc)	(((f)->lineinfo) ? (f)->lineinfo[pc] : 0)[m
[31m-[m
[31m-#define resethookcount(L)	(L->hookcount = L->basehookcount)[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o,[m
[31m-                                             const char *opname);[m
[31m-LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2);[m
[31m-LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1,[m
[31m-                                              const TValue *p2);[m
[31m-LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1,[m
[31m-                                             const TValue *p2);[m
[31m-LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...);[m
[31m-LUAI_FUNC void luaG_errormsg (lua_State *L);[m
[31m-LUAI_FUNC int luaG_checkcode (const Proto *pt);[m
[31m-LUAI_FUNC int luaG_checkopenop (Instruction i);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldo.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldo.c[m
[1mdeleted file mode 100644[m
[1mindex d1bf786..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldo.c[m
[1m+++ /dev/null[m
[36m@@ -1,519 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldo.c,v 2.38.1.4 2012/01/18 02:27:10 roberto Exp $[m
[31m-** Stack and Call structure of Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <setjmp.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define ldo_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lparser.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lundump.h"[m
[31m-#include "lvm.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Error-recovery functions[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* chain list of long jump buffers */[m
[31m-struct lua_longjmp {[m
[31m-  struct lua_longjmp *previous;[m
[31m-  luai_jmpbuf b;[m
[31m-  volatile int status;  /* error code */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {[m
[31m-  switch (errcode) {[m
[31m-    case LUA_ERRMEM: {[m
[31m-      setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_ERRERR: {[m
[31m-      setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_ERRSYNTAX:[m
[31m-    case LUA_ERRRUN: {[m
[31m-      setobjs2s(L, oldtop, L->top - 1);  /* error message on current top */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  L->top = oldtop + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void restore_stack_limit (lua_State *L) {[m
[31m-  lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);[m
[31m-  if (L->size_ci > LUAI_MAXCALLS) {  /* there was an overflow? */[m
[31m-    int inuse = cast_int(L->ci - L->base_ci);[m
[31m-    if (inuse + 1 < LUAI_MAXCALLS)  /* can `undo' overflow? */[m
[31m-      luaD_reallocCI(L, LUAI_MAXCALLS);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void resetstack (lua_State *L, int status) {[m
[31m-  L->ci = L->base_ci;[m
[31m-  L->base = L->ci->base;[m
[31m-  luaF_close(L, L->base);  /* close eventual pending closures */[m
[31m-  luaD_seterrorobj(L, status, L->base);[m
[31m-  L->nCcalls = L->baseCcalls;[m
[31m-  L->allowhook = 1;[m
[31m-  restore_stack_limit(L);[m
[31m-  L->errfunc = 0;[m
[31m-  L->errorJmp = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_throw (lua_State *L, int errcode) {[m
[31m-  if (L->errorJmp) {[m
[31m-    L->errorJmp->status = errcode;[m
[31m-    LUAI_THROW(L, L->errorJmp);[m
[31m-  }[m
[31m-  else {[m
[31m-    L->status = cast_byte(errcode);[m
[31m-    if (G(L)->panic) {[m
[31m-      resetstack(L, errcode);[m
[31m-      lua_unlock(L);[m
[31m-      G(L)->panic(L);[m
[31m-    }[m
[31m-    exit(EXIT_FAILURE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {[m
[31m-  struct lua_longjmp lj;[m
[31m-  lj.status = 0;[m
[31m-  lj.previous = L->errorJmp;  /* chain new error handler */[m
[31m-  L->errorJmp = &lj;[m
[31m-  LUAI_TRY(L, &lj,[m
[31m-    (*f)(L, ud);[m
[31m-  );[m
[31m-  L->errorJmp = lj.previous;  /* restore old error handler */[m
[31m-  return lj.status;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static void correctstack (lua_State *L, TValue *oldstack) {[m
[31m-  CallInfo *ci;[m
[31m-  GCObject *up;[m
[31m-  L->top = (L->top - oldstack) + L->stack;[m
[31m-  for (up = L->openupval; up != NULL; up = up->gch.next)[m
[31m-    gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack;[m
[31m-  for (ci = L->base_ci; ci <= L->ci; ci++) {[m
[31m-    ci->top = (ci->top - oldstack) + L->stack;[m
[31m-    ci->base = (ci->base - oldstack) + L->stack;[m
[31m-    ci->func = (ci->func - oldstack) + L->stack;[m
[31m-  }[m
[31m-  L->base = (L->base - oldstack) + L->stack;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_reallocstack (lua_State *L, int newsize) {[m
[31m-  TValue *oldstack = L->stack;[m
[31m-  int realsize = newsize + 1 + EXTRA_STACK;[m
[31m-  lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);[m
[31m-  luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue);[m
[31m-  L->stacksize = realsize;[m
[31m-  L->stack_last = L->stack+newsize;[m
[31m-  correctstack(L, oldstack);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_reallocCI (lua_State *L, int newsize) {[m
[31m-  CallInfo *oldci = L->base_ci;[m
[31m-  luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo);[m
[31m-  L->size_ci = newsize;[m
[31m-  L->ci = (L->ci - oldci) + L->base_ci;[m
[31m-  L->end_ci = L->base_ci + L->size_ci - 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_growstack (lua_State *L, int n) {[m
[31m-  if (n <= L->stacksize)  /* double size is enough? */[m
[31m-    luaD_reallocstack(L, 2*L->stacksize);[m
[31m-  else[m
[31m-    luaD_reallocstack(L, L->stacksize + n);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static CallInfo *growCI (lua_State *L) {[m
[31m-  if (L->size_ci > LUAI_MAXCALLS)  /* overflow while handling overflow? */[m
[31m-    luaD_throw(L, LUA_ERRERR);[m
[31m-  else {[m
[31m-    luaD_reallocCI(L, 2*L->size_ci);[m
[31m-    if (L->size_ci > LUAI_MAXCALLS)[m
[31m-      luaG_runerror(L, "stack overflow");[m
[31m-  }[m
[31m-  return ++L->ci;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_callhook (lua_State *L, int event, int line) {[m
[31m-  lua_Hook hook = L->hook;[m
[31m-  if (hook && L->allowhook) {[m
[31m-    ptrdiff_t top = savestack(L, L->top);[m
[31m-    ptrdiff_t ci_top = savestack(L, L->ci->top);[m
[31m-    lua_Debug ar;[m
[31m-    ar.event = event;[m
[31m-    ar.currentline = line;[m
[31m-    if (event == LUA_HOOKTAILRET)[m
[31m-      ar.i_ci = 0;  /* tail call; no debug information about it */[m
[31m-    else[m
[31m-      ar.i_ci = cast_int(L->ci - L->base_ci);[m
[31m-    luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */[m
[31m-    L->ci->top = L->top + LUA_MINSTACK;[m
[31m-    lua_assert(L->ci->top <= L->stack_last);[m
[31m-    L->allowhook = 0;  /* cannot call hooks inside a hook */[m
[31m-    lua_unlock(L);[m
[31m-    (*hook)(L, &ar);[m
[31m-    lua_lock(L);[m
[31m-    lua_assert(!L->allowhook);[m
[31m-    L->allowhook = 1;[m
[31m-    L->ci->top = restorestack(L, ci_top);[m
[31m-    L->top = restorestack(L, top);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {[m
[31m-  int i;[m
[31m-  int nfixargs = p->numparams;[m
[31m-  Table *htab = NULL;[m
[31m-  StkId base, fixed;[m
[31m-  for (; actual < nfixargs; ++actual)[m
[31m-    setnilvalue(L->top++);[m
[31m-#if defined(LUA_COMPAT_VARARG)[m
[31m-  if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */[m
[31m-    int nvar = actual - nfixargs;  /* number of extra arguments */[m
[31m-    lua_assert(p->is_vararg & VARARG_HASARG);[m
[31m-    luaC_checkGC(L);[m
[31m-    luaD_checkstack(L, p->maxstacksize);[m
[31m-    htab = luaH_new(L, nvar, 1);  /* create `arg' table */[m
[31m-    for (i=0; i<nvar; i++)  /* put extra arguments into `arg' table */[m
[31m-      setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i);[m
[31m-    /* store counter in field `n' */[m
[31m-    setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar));[m
[31m-  }[m
[31m-#endif[m
[31m-  /* move fixed parameters to final position */[m
[31m-  fixed = L->top - actual;  /* first fixed argument */[m
[31m-  base = L->top;  /* final position of first argument */[m
[31m-  for (i=0; i<nfixargs; i++) {[m
[31m-    setobjs2s(L, L->top++, fixed+i);[m
[31m-    setnilvalue(fixed+i);[m
[31m-  }[m
[31m-  /* add `arg' parameter */[m
[31m-  if (htab) {[m
[31m-    sethvalue(L, L->top++, htab);[m
[31m-    lua_assert(iswhite(obj2gco(htab)));[m
[31m-  }[m
[31m-  return base;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static StkId tryfuncTM (lua_State *L, StkId func) {[m
[31m-  const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);[m
[31m-  StkId p;[m
[31m-  ptrdiff_t funcr = savestack(L, func);[m
[31m-  if (!ttisfunction(tm))[m
[31m-    luaG_typeerror(L, func, "call");[m
[31m-  /* Open a hole inside the stack at `func' */[m
[31m-  for (p = L->top; p > func; p--) setobjs2s(L, p, p-1);[m
[31m-  incr_top(L);[m
[31m-  func = restorestack(L, funcr);  /* previous call may change stack */[m
[31m-  setobj2s(L, func, tm);  /* tag method is the new function to be called */[m
[31m-  return func;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define inc_ci(L) \[m
[31m-  ((L->ci == L->end_ci) ? growCI(L) : \[m
[31m-   (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci))[m
[31m-[m
[31m-[m
[31m-int luaD_precall (lua_State *L, StkId func, int nresults) {[m
[31m-  LClosure *cl;[m
[31m-  ptrdiff_t funcr;[m
[31m-  if (!ttisfunction(func)) /* `func' is not a function? */[m
[31m-    func = tryfuncTM(L, func);  /* check the `function' tag method */[m
[31m-  funcr = savestack(L, func);[m
[31m-  cl = &clvalue(func)->l;[m
[31m-  L->ci->savedpc = L->savedpc;[m
[31m-  if (!cl->isC) {  /* Lua function? prepare its call */[m
[31m-    CallInfo *ci;[m
[31m-    StkId st, base;[m
[31m-    Proto *p = cl->p;[m
[31m-    luaD_checkstack(L, p->maxstacksize);[m
[31m-    func = restorestack(L, funcr);[m
[31m-    if (!p->is_vararg) {  /* no varargs? */[m
[31m-      base = func + 1;[m
[31m-      if (L->top > base + p->numparams)[m
[31m-        L->top = base + p->numparams;[m
[31m-    }[m
[31m-    else {  /* vararg function */[m
[31m-      int nargs = cast_int(L->top - func) - 1;[m
[31m-      base = adjust_varargs(L, p, nargs);[m
[31m-      func = restorestack(L, funcr);  /* previous call may change the stack */[m
[31m-    }[m
[31m-    ci = inc_ci(L);  /* now `enter' new function */[m
[31m-    ci->func = func;[m
[31m-    L->base = ci->base = base;[m
[31m-    ci->top = L->base + p->maxstacksize;[m
[31m-    lua_assert(ci->top <= L->stack_last);[m
[31m-    L->savedpc = p->code;  /* starting point */[m
[31m-    ci->tailcalls = 0;[m
[31m-    ci->nresults = nresults;[m
[31m-    for (st = L->top; st < ci->top; st++)[m
[31m-      setnilvalue(st);[m
[31m-    L->top = ci->top;[m
[31m-    if (L->hookmask & LUA_MASKCALL) {[m
[31m-      L->savedpc++;  /* hooks assume 'pc' is already incremented */[m
[31m-      luaD_callhook(L, LUA_HOOKCALL, -1);[m
[31m-      L->savedpc--;  /* correct 'pc' */[m
[31m-    }[m
[31m-    return PCRLUA;[m
[31m-  }[m
[31m-  else {  /* if is a C function, call it */[m
[31m-    CallInfo *ci;[m
[31m-    int n;[m
[31m-    luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */[m
[31m-    ci = inc_ci(L);  /* now `enter' new function */[m
[31m-    ci->func = restorestack(L, funcr);[m
[31m-    L->base = ci->base = ci->func + 1;[m
[31m-    ci->top = L->top + LUA_MINSTACK;[m
[31m-    lua_assert(ci->top <= L->stack_last);[m
[31m-    ci->nresults = nresults;[m
[31m-    if (L->hookmask & LUA_MASKCALL)[m
[31m-      luaD_callhook(L, LUA_HOOKCALL, -1);[m
[31m-    lua_unlock(L);[m
[31m-    n = (*curr_func(L)->c.f)(L);  /* do the actual call */[m
[31m-    lua_lock(L);[m
[31m-    if (n < 0)  /* yielding? */[m
[31m-      return PCRYIELD;[m
[31m-    else {[m
[31m-      luaD_poscall(L, L->top - n);[m
[31m-      return PCRC;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static StkId callrethooks (lua_State *L, StkId firstResult) {[m
[31m-  ptrdiff_t fr = savestack(L, firstResult);  /* next call may change stack */[m
[31m-  luaD_callhook(L, LUA_HOOKRET, -1);[m
[31m-  if (f_isLua(L->ci)) {  /* Lua function? */[m
[31m-    while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */[m
[31m-      luaD_callhook(L, LUA_HOOKTAILRET, -1);[m
[31m-  }[m
[31m-  return restorestack(L, fr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaD_poscall (lua_State *L, StkId firstResult) {[m
[31m-  StkId res;[m
[31m-  int wanted, i;[m
[31m-  CallInfo *ci;[m
[31m-  if (L->hookmask & LUA_MASKRET)[m
[31m-    firstResult = callrethooks(L, firstResult);[m
[31m-  ci = L->ci--;[m
[31m-  res = ci->func;  /* res == final position of 1st result */[m
[31m-  wanted = ci->nresults;[m
[31m-  L->base = (ci - 1)->base;  /* restore base */[m
[31m-  L->savedpc = (ci - 1)->savedpc;  /* restore savedpc */[m
[31m-  /* move results to correct place */[m
[31m-  for (i = wanted; i != 0 && firstResult < L->top; i--)[m
[31m-    setobjs2s(L, res++, firstResult++);[m
[31m-  while (i-- > 0)[m
[31m-    setnilvalue(res++);[m
[31m-  L->top = res;[m
[31m-  return (wanted - LUA_MULTRET);  /* 0 iff wanted == LUA_MULTRET */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Call a function (C or Lua). The function to be called is at *func.[m
[31m-** The arguments are on the stack, right after the function.[m
[31m-** When returns, all the results are on the stack, starting at the original[m
[31m-** function position.[m
[31m-*/ [m
[31m-void luaD_call (lua_State *L, StkId func, int nResults) {[m
[31m-  if (++L->nCcalls >= LUAI_MAXCCALLS) {[m
[31m-    if (L->nCcalls == LUAI_MAXCCALLS)[m
[31m-      luaG_runerror(L, "C stack overflow");[m
[31m-    else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))[m
[31m-      luaD_throw(L, LUA_ERRERR);  /* error while handing stack error */[m
[31m-  }[m
[31m-  if (luaD_precall(L, func, nResults) == PCRLUA)  /* is a Lua function? */[m
[31m-    luaV_execute(L, 1);  /* call it */[m
[31m-  L->nCcalls--;[m
[31m-  luaC_checkGC(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void resume (lua_State *L, void *ud) {[m
[31m-  StkId firstArg = cast(StkId, ud);[m
[31m-  CallInfo *ci = L->ci;[m
[31m-  if (L->status == 0) {  /* start coroutine? */[m
[31m-    lua_assert(ci == L->base_ci && firstArg > L->base);[m
[31m-    if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA)[m
[31m-      return;[m
[31m-  }[m
[31m-  else {  /* resuming from previous yield */[m
[31m-    lua_assert(L->status == LUA_YIELD);[m
[31m-    L->status = 0;[m
[31m-    if (!f_isLua(ci)) {  /* `common' yield? */[m
[31m-      /* finish interrupted execution of `OP_CALL' */[m
[31m-      lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL ||[m
[31m-                 GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL);[m
[31m-      if (luaD_poscall(L, firstArg))  /* complete it... */[m
[31m-        L->top = L->ci->top;  /* and correct top if not multiple results */[m
[31m-    }[m
[31m-    else  /* yielded inside a hook: just continue its execution */[m
[31m-      L->base = L->ci->base;[m
[31m-  }[m
[31m-  luaV_execute(L, cast_int(L->ci - L->base_ci));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int resume_error (lua_State *L, const char *msg) {[m
[31m-  L->top = L->ci->base;[m
[31m-  setsvalue2s(L, L->top, luaS_new(L, msg));[m
[31m-  incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-  return LUA_ERRRUN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_resume (lua_State *L, int nargs) {[m
[31m-  int status;[m
[31m-  lua_lock(L);[m
[31m-  if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci))[m
[31m-      return resume_error(L, "cannot resume non-suspended coroutine");[m
[31m-  if (L->nCcalls >= LUAI_MAXCCALLS)[m
[31m-    return resume_error(L, "C stack overflow");[m
[31m-  luai_userstateresume(L, nargs);[m
[31m-  lua_assert(L->errfunc == 0);[m
[31m-  L->baseCcalls = ++L->nCcalls;[m
[31m-  status = luaD_rawrunprotected(L, resume, L->top - nargs);[m
[31m-  if (status != 0) {  /* error? */[m
[31m-    L->status = cast_byte(status);  /* mark thread as `dead' */[m
[31m-    luaD_seterrorobj(L, status, L->top);[m
[31m-    L->ci->top = L->top;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_assert(L->nCcalls == L->baseCcalls);[m
[31m-    status = L->status;[m
[31m-  }[m
[31m-  --L->nCcalls;[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_yield (lua_State *L, int nresults) {[m
[31m-  luai_userstateyield(L, nresults);[m
[31m-  lua_lock(L);[m
[31m-  if (L->nCcalls > L->baseCcalls)[m
[31m-    luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");[m
[31m-  L->base = L->top - nresults;  /* protect stack slots below */[m
[31m-  L->status = LUA_YIELD;[m
[31m-  lua_unlock(L);[m
[31m-  return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaD_pcall (lua_State *L, Pfunc func, void *u,[m
[31m-                ptrdiff_t old_top, ptrdiff_t ef) {[m
[31m-  int status;[m
[31m-  unsigned short oldnCcalls = L->nCcalls;[m
[31m-  ptrdiff_t old_ci = saveci(L, L->ci);[m
[31m-  lu_byte old_allowhooks = L->allowhook;[m
[31m-  ptrdiff_t old_errfunc = L->errfunc;[m
[31m-  L->errfunc = ef;[m
[31m-  status = luaD_rawrunprotected(L, func, u);[m
[31m-  if (status != 0) {  /* an error occurred? */[m
[31m-    StkId oldtop = restorestack(L, old_top);[m
[31m-    luaF_close(L, oldtop);  /* close eventual pending closures */[m
[31m-    luaD_seterrorobj(L, status, oldtop);[m
[31m-    L->nCcalls = oldnCcalls;[m
[31m-    L->ci = restoreci(L, old_ci);[m
[31m-    L->base = L->ci->base;[m
[31m-    L->savedpc = L->ci->savedpc;[m
[31m-    L->allowhook = old_allowhooks;[m
[31m-    restore_stack_limit(L);[m
[31m-  }[m
[31m-  L->errfunc = old_errfunc;[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Execute a protected parser.[m
[31m-*/[m
[31m-struct SParser {  /* data to `f_parser' */[m
[31m-  ZIO *z;[m
[31m-  Mbuffer buff;  /* buffer to be used by the scanner */[m
[31m-  const char *name;[m
[31m-};[m
[31m-[m
[31m-static void f_parser (lua_State *L, void *ud) {[m
[31m-  int i;[m
[31m-  Proto *tf;[m
[31m-  Closure *cl;[m
[31m-  struct SParser *p = cast(struct SParser *, ud);[m
[31m-  int c = luaZ_lookahead(p->z);[m
[31m-  luaC_checkGC(L);[m
[31m-  tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z,[m
[31m-                                                             &p->buff, p->name);[m
[31m-  cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L)));[m
[31m-  cl->l.p = tf;[m
[31m-  for (i = 0; i < tf->nups; i++)  /* initialize eventual upvalues */[m
[31m-    cl->l.upvals[i] = luaF_newupval(L);[m
[31m-  setclvalue(L, L->top, cl);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {[m
[31m-  struct SParser p;[m
[31m-  int status;[m
[31m-  p.z = z; p.name = name;[m
[31m-  luaZ_initbuffer(L, &p.buff);[m
[31m-  status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);[m
[31m-  luaZ_freebuffer(L, &p.buff);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldo.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldo.h[m
[1mdeleted file mode 100644[m
[1mindex 98fddac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldo.h[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Stack and Call structure of Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef ldo_h[m
[31m-#define ldo_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-#define luaD_checkstack(L,n)	\[m
[31m-  if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \[m
[31m-    luaD_growstack(L, n); \[m
[31m-  else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1));[m
[31m-[m
[31m-[m
[31m-#define incr_top(L) {luaD_checkstack(L,1); L->top++;}[m
[31m-[m
[31m-#define savestack(L,p)		((char *)(p) - (char *)L->stack)[m
[31m-#define restorestack(L,n)	((TValue *)((char *)L->stack + (n)))[m
[31m-[m
[31m-#define saveci(L,p)		((char *)(p) - (char *)L->base_ci)[m
[31m-#define restoreci(L,n)		((CallInfo *)((char *)L->base_ci + (n)))[m
[31m-[m
[31m-[m
[31m-/* results from luaD_precall */[m
[31m-#define PCRLUA		0	/* initiated a call to a Lua function */[m
[31m-#define PCRC		1	/* did a call to a C function */[m
[31m-#define PCRYIELD	2	/* C funtion yielded */[m
[31m-[m
[31m-[m
[31m-/* type of protected functions, to be ran by `runprotected' */[m
[31m-typedef void (*Pfunc) (lua_State *L, void *ud);[m
[31m-[m
[31m-LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name);[m
[31m-LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line);[m
[31m-LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults);[m
[31m-LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);[m
[31m-LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,[m
[31m-                                        ptrdiff_t oldtop, ptrdiff_t ef);[m
[31m-LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult);[m
[31m-LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize);[m
[31m-LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);[m
[31m-LUAI_FUNC void luaD_growstack (lua_State *L, int n);[m
[31m-[m
[31m-LUAI_FUNC void luaD_throw (lua_State *L, int errcode);[m
[31m-LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);[m
[31m-[m
[31m-LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop);[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldump.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldump.c[m
[1mdeleted file mode 100644[m
[1mindex c9d3d48..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ldump.c[m
[1m+++ /dev/null[m
[36m@@ -1,164 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** save precompiled Lua chunks[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define ldump_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lundump.h"[m
[31m-[m
[31m-typedef struct {[m
[31m- lua_State* L;[m
[31m- lua_Writer writer;[m
[31m- void* data;[m
[31m- int strip;[m
[31m- int status;[m
[31m-} DumpState;[m
[31m-[m
[31m-#define DumpMem(b,n,size,D)	DumpBlock(b,(n)*(size),D)[m
[31m-#define DumpVar(x,D)	 	DumpMem(&x,1,sizeof(x),D)[m
[31m-[m
[31m-static void DumpBlock(const void* b, size_t size, DumpState* D)[m
[31m-{[m
[31m- if (D->status==0)[m
[31m- {[m
[31m-  lua_unlock(D->L);[m
[31m-  D->status=(*D->writer)(D->L,b,size,D->data);[m
[31m-  lua_lock(D->L);[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void DumpChar(int y, DumpState* D)[m
[31m-{[m
[31m- char x=(char)y;[m
[31m- DumpVar(x,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpInt(int x, DumpState* D)[m
[31m-{[m
[31m- DumpVar(x,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpNumber(lua_Number x, DumpState* D)[m
[31m-{[m
[31m- DumpVar(x,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpVector(const void* b, int n, size_t size, DumpState* D)[m
[31m-{[m
[31m- DumpInt(n,D);[m
[31m- DumpMem(b,n,size,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpString(const TString* s, DumpState* D)[m
[31m-{[m
[31m- if (s==NULL || getstr(s)==NULL)[m
[31m- {[m
[31m-  size_t size=0;[m
[31m-  DumpVar(size,D);[m
[31m- }[m
[31m- else[m
[31m- {[m
[31m-  size_t size=s->tsv.len+1;		/* include trailing '\0' */[m
[31m-  DumpVar(size,D);[m
[31m-  DumpBlock(getstr(s),size,D);[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-#define DumpCode(f,D)	 DumpVector(f->code,f->sizecode,sizeof(Instruction),D)[m
[31m-[m
[31m-static void DumpFunction(const Proto* f, const TString* p, DumpState* D);[m
[31m-[m
[31m-static void DumpConstants(const Proto* f, DumpState* D)[m
[31m-{[m
[31m- int i,n=f->sizek;[m
[31m- DumpInt(n,D);[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  const TValue* o=&f->k[i];[m
[31m-  DumpChar(ttype(o),D);[m
[31m-  switch (ttype(o))[m
[31m-  {[m
[31m-   case LUA_TNIL:[m
[31m-	break;[m
[31m-   case LUA_TBOOLEAN:[m
[31m-	DumpChar(bvalue(o),D);[m
[31m-	break;[m
[31m-   case LUA_TNUMBER:[m
[31m-	DumpNumber(nvalue(o),D);[m
[31m-	break;[m
[31m-   case LUA_TSTRING:[m
[31m-	DumpString(rawtsvalue(o),D);[m
[31m-	break;[m
[31m-   default:[m
[31m-	lua_assert(0);			/* cannot happen */[m
[31m-	break;[m
[31m-  }[m
[31m- }[m
[31m- n=f->sizep;[m
[31m- DumpInt(n,D);[m
[31m- for (i=0; i<n; i++) DumpFunction(f->p[i],f->source,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpDebug(const Proto* f, DumpState* D)[m
[31m-{[m
[31m- int i,n;[m
[31m- n= (D->strip) ? 0 : f->sizelineinfo;[m
[31m- DumpVector(f->lineinfo,n,sizeof(int),D);[m
[31m- n= (D->strip) ? 0 : f->sizelocvars;[m
[31m- DumpInt(n,D);[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  DumpString(f->locvars[i].varname,D);[m
[31m-  DumpInt(f->locvars[i].startpc,D);[m
[31m-  DumpInt(f->locvars[i].endpc,D);[m
[31m- }[m
[31m- n= (D->strip) ? 0 : f->sizeupvalues;[m
[31m- DumpInt(n,D);[m
[31m- for (i=0; i<n; i++) DumpString(f->upvalues[i],D);[m
[31m-}[m
[31m-[m
[31m-static void DumpFunction(const Proto* f, const TString* p, DumpState* D)[m
[31m-{[m
[31m- DumpString((f->source==p || D->strip) ? NULL : f->source,D);[m
[31m- DumpInt(f->linedefined,D);[m
[31m- DumpInt(f->lastlinedefined,D);[m
[31m- DumpChar(f->nups,D);[m
[31m- DumpChar(f->numparams,D);[m
[31m- DumpChar(f->is_vararg,D);[m
[31m- DumpChar(f->maxstacksize,D);[m
[31m- DumpCode(f,D);[m
[31m- DumpConstants(f,D);[m
[31m- DumpDebug(f,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpHeader(DumpState* D)[m
[31m-{[m
[31m- char h[LUAC_HEADERSIZE];[m
[31m- luaU_header(h);[m
[31m- DumpBlock(h,LUAC_HEADERSIZE,D);[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** dump Lua function as precompiled chunk[m
[31m-*/[m
[31m-int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip)[m
[31m-{[m
[31m- DumpState D;[m
[31m- D.L=L;[m
[31m- D.writer=w;[m
[31m- D.data=data;[m
[31m- D.strip=strip;[m
[31m- D.status=0;[m
[31m- DumpHeader(&D);[m
[31m- DumpFunction(f,NULL,&D);[m
[31m- return D.status;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lfunc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lfunc.c[m
[1mdeleted file mode 100644[m
[1mindex 813e88f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lfunc.c[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $[m
[31m-** Auxiliary functions to manipulate prototypes and closures[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define lfunc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) {[m
[31m-  Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems)));[m
[31m-  luaC_link(L, obj2gco(c), LUA_TFUNCTION);[m
[31m-  c->c.isC = 1;[m
[31m-  c->c.env = e;[m
[31m-  c->c.nupvalues = cast_byte(nelems);[m
[31m-  return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) {[m
[31m-  Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems)));[m
[31m-  luaC_link(L, obj2gco(c), LUA_TFUNCTION);[m
[31m-  c->l.isC = 0;[m
[31m-  c->l.env = e;[m
[31m-  c->l.nupvalues = cast_byte(nelems);[m
[31m-  while (nelems--) c->l.upvals[nelems] = NULL;[m
[31m-  return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-UpVal *luaF_newupval (lua_State *L) {[m
[31m-  UpVal *uv = luaM_new(L, UpVal);[m
[31m-  luaC_link(L, obj2gco(uv), LUA_TUPVAL);[m
[31m-  uv->v = &uv->u.value;[m
[31m-  setnilvalue(uv->v);[m
[31m-  return uv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-UpVal *luaF_findupval (lua_State *L, StkId level) {[m
[31m-  global_State *g = G(L);[m
[31m-  GCObject **pp = &L->openupval;[m
[31m-  UpVal *p;[m
[31m-  UpVal *uv;[m
[31m-  while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) {[m
[31m-    lua_assert(p->v != &p->u.value);[m
[31m-    if (p->v == level) {  /* found a corresponding upvalue? */[m
[31m-      if (isdead(g, obj2gco(p)))  /* is it dead? */[m
[31m-        changewhite(obj2gco(p));  /* ressurect it */[m
[31m-      return p;[m
[31m-    }[m
[31m-    pp = &p->next;[m
[31m-  }[m
[31m-  uv = luaM_new(L, UpVal);  /* not found: create a new one */[m
[31m-  uv->tt = LUA_TUPVAL;[m
[31m-  uv->marked = luaC_white(g);[m
[31m-  uv->v = level;  /* current value lives in the stack */[m
[31m-  uv->next = *pp;  /* chain it in the proper position */[m
[31m-  *pp = obj2gco(uv);[m
[31m-  uv->u.l.prev = &g->uvhead;  /* double link it in `uvhead' list */[m
[31m-  uv->u.l.next = g->uvhead.u.l.next;[m
[31m-  uv->u.l.next->u.l.prev = uv;[m
[31m-  g->uvhead.u.l.next = uv;[m
[31m-  lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);[m
[31m-  return uv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void unlinkupval (UpVal *uv) {[m
[31m-  lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);[m
[31m-  uv->u.l.next->u.l.prev = uv->u.l.prev;  /* remove from `uvhead' list */[m
[31m-  uv->u.l.prev->u.l.next = uv->u.l.next;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaF_freeupval (lua_State *L, UpVal *uv) {[m
[31m-  if (uv->v != &uv->u.value)  /* is it open? */[m
[31m-    unlinkupval(uv);  /* remove from open list */[m
[31m-  luaM_free(L, uv);  /* free upvalue */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaF_close (lua_State *L, StkId level) {[m
[31m-  UpVal *uv;[m
[31m-  global_State *g = G(L);[m
[31m-  while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) {[m
[31m-    GCObject *o = obj2gco(uv);[m
[31m-    lua_assert(!isblack(o) && uv->v != &uv->u.value);[m
[31m-    L->openupval = uv->next;  /* remove from `open' list */[m
[31m-    if (isdead(g, o))[m
[31m-      luaF_freeupval(L, uv);  /* free upvalue */[m
[31m-    else {[m
[31m-      unlinkupval(uv);[m
[31m-      setobj(L, &uv->u.value, uv->v);[m
[31m-      uv->v = &uv->u.value;  /* now current value lives here */[m
[31m-      luaC_linkupval(L, uv);  /* link upvalue into `gcroot' list */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Proto *luaF_newproto (lua_State *L) {[m
[31m-  Proto *f = luaM_new(L, Proto);[m
[31m-  luaC_link(L, obj2gco(f), LUA_TPROTO);[m
[31m-  f->k = NULL;[m
[31m-  f->sizek = 0;[m
[31m-  f->p = NULL;[m
[31m-  f->sizep = 0;[m
[31m-  f->code = NULL;[m
[31m-  f->sizecode = 0;[m
[31m-  f->sizelineinfo = 0;[m
[31m-  f->sizeupvalues = 0;[m
[31m-  f->nups = 0;[m
[31m-  f->upvalues = NULL;[m
[31m-  f->numparams = 0;[m
[31m-  f->is_vararg = 0;[m
[31m-  f->maxstacksize = 0;[m
[31m-  f->lineinfo = NULL;[m
[31m-  f->sizelocvars = 0;[m
[31m-  f->locvars = NULL;[m
[31m-  f->linedefined = 0;[m
[31m-  f->lastlinedefined = 0;[m
[31m-  f->source = NULL;[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaF_freeproto (lua_State *L, Proto *f) {[m
[31m-  luaM_freearray(L, f->code, f->sizecode, Instruction);[m
[31m-  luaM_freearray(L, f->p, f->sizep, Proto *);[m
[31m-  luaM_freearray(L, f->k, f->sizek, TValue);[m
[31m-  luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);[m
[31m-  luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);[m
[31m-  luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *);[m
[31m-  luaM_free(L, f);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaF_freeclosure (lua_State *L, Closure *c) {[m
[31m-  int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) :[m
[31m-                          sizeLclosure(c->l.nupvalues);[m
[31m-  luaM_freemem(L, c, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Look for n-th local variable at line `line' in function `func'.[m
[31m-** Returns NULL if not found.[m
[31m-*/[m
[31m-const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {[m
[31m-  int i;[m
[31m-  for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {[m
[31m-    if (pc < f->locvars[i].endpc) {  /* is variable active? */[m
[31m-      local_number--;[m
[31m-      if (local_number == 0)[m
[31m-        return getstr(f->locvars[i].varname);[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* not found */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lfunc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lfunc.h[m
[1mdeleted file mode 100644[m
[1mindex a68cf51..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lfunc.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions to manipulate prototypes and closures[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lfunc_h[m
[31m-#define lfunc_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-#define sizeCclosure(n)	(cast(int, sizeof(CClosure)) + \[m
[31m-                         cast(int, sizeof(TValue)*((n)-1)))[m
[31m-[m
[31m-#define sizeLclosure(n)	(cast(int, sizeof(LClosure)) + \[m
[31m-                         cast(int, sizeof(TValue *)*((n)-1)))[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC Proto *luaF_newproto (lua_State *L);[m
[31m-LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e);[m
[31m-LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e);[m
[31m-LUAI_FUNC UpVal *luaF_newupval (lua_State *L);[m
[31m-LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);[m
[31m-LUAI_FUNC void luaF_close (lua_State *L, StkId level);[m
[31m-LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);[m
[31m-LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c);[m
[31m-LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv);[m
[31m-LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,[m
[31m-                                         int pc);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lgc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lgc.c[m
[1mdeleted file mode 100644[m
[1mindex e909c79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lgc.c[m
[1m+++ /dev/null[m
[36m@@ -1,710 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lgc.c,v 2.38.1.2 2011/03/18 18:05:38 roberto Exp $[m
[31m-** Garbage Collector[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lgc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-[m
[31m-[m
[31m-#define GCSTEPSIZE	1024u[m
[31m-#define GCSWEEPMAX	40[m
[31m-#define GCSWEEPCOST	10[m
[31m-#define GCFINALIZECOST	100[m
[31m-[m
[31m-[m
[31m-#define maskmarks	cast_byte(~(bitmask(BLACKBIT)|WHITEBITS))[m
[31m-[m
[31m-#define makewhite(g,x)	\[m
[31m-   ((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g)))[m
[31m-[m
[31m-#define white2gray(x)	reset2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)[m
[31m-#define black2gray(x)	resetbit((x)->gch.marked, BLACKBIT)[m
[31m-[m
[31m-#define stringmark(s)	reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT)[m
[31m-[m
[31m-[m
[31m-#define isfinalized(u)		testbit((u)->marked, FINALIZEDBIT)[m
[31m-#define markfinalized(u)	l_setbit((u)->marked, FINALIZEDBIT)[m
[31m-[m
[31m-[m
[31m-#define KEYWEAK         bitmask(KEYWEAKBIT)[m
[31m-#define VALUEWEAK       bitmask(VALUEWEAKBIT)[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define markvalue(g,o) { checkconsistency(o); \[m
[31m-  if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); }[m
[31m-[m
[31m-#define markobject(g,t) { if (iswhite(obj2gco(t))) \[m
[31m-		reallymarkobject(g, obj2gco(t)); }[m
[31m-[m
[31m-[m
[31m-#define setthreshold(g)  (g->GCthreshold = (g->estimate/100) * g->gcpause)[m
[31m-[m
[31m-[m
[31m-static void removeentry (Node *n) {[m
[31m-  lua_assert(ttisnil(gval(n)));[m
[31m-  if (iscollectable(gkey(n)))[m
[31m-    setttype(gkey(n), LUA_TDEADKEY);  /* dead key; remove it */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void reallymarkobject (global_State *g, GCObject *o) {[m
[31m-  lua_assert(iswhite(o) && !isdead(g, o));[m
[31m-  white2gray(o);[m
[31m-  switch (o->gch.tt) {[m
[31m-    case LUA_TSTRING: {[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TUSERDATA: {[m
[31m-      Table *mt = gco2u(o)->metatable;[m
[31m-      gray2black(o);  /* udata are never gray */[m
[31m-      if (mt) markobject(g, mt);[m
[31m-      markobject(g, gco2u(o)->env);[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TUPVAL: {[m
[31m-      UpVal *uv = gco2uv(o);[m
[31m-      markvalue(g, uv->v);[m
[31m-      if (uv->v == &uv->u.value)  /* closed? */[m
[31m-        gray2black(o);  /* open upvalues are never black */[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TFUNCTION: {[m
[31m-      gco2cl(o)->c.gclist = g->gray;[m
[31m-      g->gray = o;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TTABLE: {[m
[31m-      gco2h(o)->gclist = g->gray;[m
[31m-      g->gray = o;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TTHREAD: {[m
[31m-      gco2th(o)->gclist = g->gray;[m
[31m-      g->gray = o;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TPROTO: {[m
[31m-      gco2p(o)->gclist = g->gray;[m
[31m-      g->gray = o;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: lua_assert(0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void marktmu (global_State *g) {[m
[31m-  GCObject *u = g->tmudata;[m
[31m-  if (u) {[m
[31m-    do {[m
[31m-      u = u->gch.next;[m
[31m-      makewhite(g, u);  /* may be marked, if left from previous GC */[m
[31m-      reallymarkobject(g, u);[m
[31m-    } while (u != g->tmudata);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* move `dead' udata that need finalization to list `tmudata' */[m
[31m-size_t luaC_separateudata (lua_State *L, int all) {[m
[31m-  global_State *g = G(L);[m
[31m-  size_t deadmem = 0;[m
[31m-  GCObject **p = &g->mainthread->next;[m
[31m-  GCObject *curr;[m
[31m-  while ((curr = *p) != NULL) {[m
[31m-    if (!(iswhite(curr) || all) || isfinalized(gco2u(curr)))[m
[31m-      p = &curr->gch.next;  /* don't bother with them */[m
[31m-    else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) {[m
[31m-      markfinalized(gco2u(curr));  /* don't need finalization */[m
[31m-      p = &curr->gch.next;[m
[31m-    }[m
[31m-    else {  /* must call its gc method */[m
[31m-      deadmem += sizeudata(gco2u(curr));[m
[31m-      markfinalized(gco2u(curr));[m
[31m-      *p = curr->gch.next;[m
[31m-      /* link `curr' at the end of `tmudata' list */[m
[31m-      if (g->tmudata == NULL)  /* list is empty? */[m
[31m-        g->tmudata = curr->gch.next = curr;  /* creates a circular list */[m
[31m-      else {[m
[31m-        curr->gch.next = g->tmudata->gch.next;[m
[31m-        g->tmudata->gch.next = curr;[m
[31m-        g->tmudata = curr;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return deadmem;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int traversetable (global_State *g, Table *h) {[m
[31m-  int i;[m
[31m-  int weakkey = 0;[m
[31m-  int weakvalue = 0;[m
[31m-  const TValue *mode;[m
[31m-  if (h->metatable)[m
[31m-    markobject(g, h->metatable);[m
[31m-  mode = gfasttm(g, h->metatable, TM_MODE);[m
[31m-  if (mode && ttisstring(mode)) {  /* is there a weak mode? */[m
[31m-    weakkey = (strchr(svalue(mode), 'k') != NULL);[m
[31m-    weakvalue = (strchr(svalue(mode), 'v') != NULL);[m
[31m-    if (weakkey || weakvalue) {  /* is really weak? */[m
[31m-      h->marked &= ~(KEYWEAK | VALUEWEAK);  /* clear bits */[m
[31m-      h->marked |= cast_byte((weakkey << KEYWEAKBIT) |[m
[31m-                             (weakvalue << VALUEWEAKBIT));[m
[31m-      h->gclist = g->weak;  /* must be cleared after GC, ... */[m
[31m-      g->weak = obj2gco(h);  /* ... so put in the appropriate list */[m
[31m-    }[m
[31m-  }[m
[31m-  if (weakkey && weakvalue) return 1;[m
[31m-  if (!weakvalue) {[m
[31m-    i = h->sizearray;[m
[31m-    while (i--)[m
[31m-      markvalue(g, &h->array[i]);[m
[31m-  }[m
[31m-  i = sizenode(h);[m
[31m-  while (i--) {[m
[31m-    Node *n = gnode(h, i);[m
[31m-    lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n)));[m
[31m-    if (ttisnil(gval(n)))[m
[31m-      removeentry(n);  /* remove empty entries */[m
[31m-    else {[m
[31m-      lua_assert(!ttisnil(gkey(n)));[m
[31m-      if (!weakkey) markvalue(g, gkey(n));[m
[31m-      if (!weakvalue) markvalue(g, gval(n));[m
[31m-    }[m
[31m-  }[m
[31m-  return weakkey || weakvalue;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** All marks are conditional because a GC may happen while the[m
[31m-** prototype is still being created[m
[31m-*/[m
[31m-static void traverseproto (global_State *g, Proto *f) {[m
[31m-  int i;[m
[31m-  if (f->source) stringmark(f->source);[m
[31m-  for (i=0; i<f->sizek; i++)  /* mark literals */[m
[31m-    markvalue(g, &f->k[i]);[m
[31m-  for (i=0; i<f->sizeupvalues; i++) {  /* mark upvalue names */[m
[31m-    if (f->upvalues[i])[m
[31m-      stringmark(f->upvalues[i]);[m
[31m-  }[m
[31m-  for (i=0; i<f->sizep; i++) {  /* mark nested protos */[m
[31m-    if (f->p[i])[m
[31m-      markobject(g, f->p[i]);[m
[31m-  }[m
[31m-  for (i=0; i<f->sizelocvars; i++) {  /* mark local-variable names */[m
[31m-    if (f->locvars[i].varname)[m
[31m-      stringmark(f->locvars[i].varname);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void traverseclosure (global_State *g, Closure *cl) {[m
[31m-  markobject(g, cl->c.env);[m
[31m-  if (cl->c.isC) {[m
[31m-    int i;[m
[31m-    for (i=0; i<cl->c.nupvalues; i++)  /* mark its upvalues */[m
[31m-      markvalue(g, &cl->c.upvalue[i]);[m
[31m-  }[m
[31m-  else {[m
[31m-    int i;[m
[31m-    lua_assert(cl->l.nupvalues == cl->l.p->nups);[m
[31m-    markobject(g, cl->l.p);[m
[31m-    for (i=0; i<cl->l.nupvalues; i++)  /* mark its upvalues */[m
[31m-      markobject(g, cl->l.upvals[i]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void checkstacksizes (lua_State *L, StkId max) {[m
[31m-  int ci_used = cast_int(L->ci - L->base_ci);  /* number of `ci' in use */[m
[31m-  int s_used = cast_int(max - L->stack);  /* part of stack in use */[m
[31m-  if (L->size_ci > LUAI_MAXCALLS)  /* handling overflow? */[m
[31m-    return;  /* do not touch the stacks */[m
[31m-  if (4*ci_used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci)[m
[31m-    luaD_reallocCI(L, L->size_ci/2);  /* still big enough... */[m
[31m-  condhardstacktests(luaD_reallocCI(L, ci_used + 1));[m
[31m-  if (4*s_used < L->stacksize &&[m
[31m-      2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize)[m
[31m-    luaD_reallocstack(L, L->stacksize/2);  /* still big enough... */[m
[31m-  condhardstacktests(luaD_reallocstack(L, s_used));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void traversestack (global_State *g, lua_State *l) {[m
[31m-  StkId o, lim;[m
[31m-  CallInfo *ci;[m
[31m-  markvalue(g, gt(l));[m
[31m-  lim = l->top;[m
[31m-  for (ci = l->base_ci; ci <= l->ci; ci++) {[m
[31m-    lua_assert(ci->top <= l->stack_last);[m
[31m-    if (lim < ci->top) lim = ci->top;[m
[31m-  }[m
[31m-  for (o = l->stack; o < l->top; o++)[m
[31m-    markvalue(g, o);[m
[31m-  for (; o <= lim; o++)[m
[31m-    setnilvalue(o);[m
[31m-  checkstacksizes(l, lim);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** traverse one gray object, turning it to black.[m
[31m-** Returns `quantity' traversed.[m
[31m-*/[m
[31m-static l_mem propagatemark (global_State *g) {[m
[31m-  GCObject *o = g->gray;[m
[31m-  lua_assert(isgray(o));[m
[31m-  gray2black(o);[m
[31m-  switch (o->gch.tt) {[m
[31m-    case LUA_TTABLE: {[m
[31m-      Table *h = gco2h(o);[m
[31m-      g->gray = h->gclist;[m
[31m-      if (traversetable(g, h))  /* table is weak? */[m
[31m-        black2gray(o);  /* keep it gray */[m
[31m-      return sizeof(Table) + sizeof(TValue) * h->sizearray +[m
[31m-                             sizeof(Node) * sizenode(h);[m
[31m-    }[m
[31m-    case LUA_TFUNCTION: {[m
[31m-      Closure *cl = gco2cl(o);[m
[31m-      g->gray = cl->c.gclist;[m
[31m-      traverseclosure(g, cl);[m
[31m-      return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) :[m
[31m-                           sizeLclosure(cl->l.nupvalues);[m
[31m-    }[m
[31m-    case LUA_TTHREAD: {[m
[31m-      lua_State *th = gco2th(o);[m
[31m-      g->gray = th->gclist;[m
[31m-      th->gclist = g->grayagain;[m
[31m-      g->grayagain = o;[m
[31m-      black2gray(o);[m
[31m-      traversestack(g, th);[m
[31m-      return sizeof(lua_State) + sizeof(TValue) * th->stacksize +[m
[31m-                                 sizeof(CallInfo) * th->size_ci;[m
[31m-    }[m
[31m-    case LUA_TPROTO: {[m
[31m-      Proto *p = gco2p(o);[m
[31m-      g->gray = p->gclist;[m
[31m-      traverseproto(g, p);[m
[31m-      return sizeof(Proto) + sizeof(Instruction) * p->sizecode +[m
[31m-                             sizeof(Proto *) * p->sizep +[m
[31m-                             sizeof(TValue) * p->sizek + [m
[31m-                             sizeof(int) * p->sizelineinfo +[m
[31m-                             sizeof(LocVar) * p->sizelocvars +[m
[31m-                             sizeof(TString *) * p->sizeupvalues;[m
[31m-    }[m
[31m-    default: lua_assert(0); return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t propagateall (global_State *g) {[m
[31m-  size_t m = 0;[m
[31m-  while (g->gray) m += propagatemark(g);[m
[31m-  return m;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** The next function tells whether a key or value can be cleared from[m
[31m-** a weak table. Non-collectable objects are never removed from weak[m
[31m-** tables. Strings behave as `values', so are never removed too. for[m
[31m-** other objects: if really collected, cannot keep them; for userdata[m
[31m-** being finalized, keep them in keys, but not in values[m
[31m-*/[m
[31m-static int iscleared (const TValue *o, int iskey) {[m
[31m-  if (!iscollectable(o)) return 0;[m
[31m-  if (ttisstring(o)) {[m
[31m-    stringmark(rawtsvalue(o));  /* strings are `values', so are never weak */[m
[31m-    return 0;[m
[31m-  }[m
[31m-  return iswhite(gcvalue(o)) ||[m
[31m-    (ttisuserdata(o) && (!iskey && isfinalized(uvalue(o))));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** clear collected entries from weaktables[m
[31m-*/[m
[31m-static void cleartable (GCObject *l) {[m
[31m-  while (l) {[m
[31m-    Table *h = gco2h(l);[m
[31m-    int i = h->sizearray;[m
[31m-    lua_assert(testbit(h->marked, VALUEWEAKBIT) ||[m
[31m-               testbit(h->marked, KEYWEAKBIT));[m
[31m-    if (testbit(h->marked, VALUEWEAKBIT)) {[m
[31m-      while (i--) {[m
[31m-        TValue *o = &h->array[i];[m
[31m-        if (iscleared(o, 0))  /* value was collected? */[m
[31m-          setnilvalue(o);  /* remove value */[m
[31m-      }[m
[31m-    }[m
[31m-    i = sizenode(h);[m
[31m-    while (i--) {[m
[31m-      Node *n = gnode(h, i);[m
[31m-      if (!ttisnil(gval(n)) &&  /* non-empty entry? */[m
[31m-          (iscleared(key2tval(n), 1) || iscleared(gval(n), 0))) {[m
[31m-        setnilvalue(gval(n));  /* remove value ... */[m
[31m-        removeentry(n);  /* remove entry from table */[m
[31m-      }[m
[31m-    }[m
[31m-    l = h->gclist;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void freeobj (lua_State *L, GCObject *o) {[m
[31m-  switch (o->gch.tt) {[m
[31m-    case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;[m
[31m-    case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break;[m
[31m-    case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break;[m
[31m-    case LUA_TTABLE: luaH_free(L, gco2h(o)); break;[m
[31m-    case LUA_TTHREAD: {[m
[31m-      lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread);[m
[31m-      luaE_freethread(L, gco2th(o));[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TSTRING: {[m
[31m-      G(L)->strt.nuse--;[m
[31m-      luaM_freemem(L, o, sizestring(gco2ts(o)));[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TUSERDATA: {[m
[31m-      luaM_freemem(L, o, sizeudata(gco2u(o)));[m
[31m-      break;[m
[31m-    }[m
[31m-    default: lua_assert(0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define sweepwholelist(L,p)	sweeplist(L,p,MAX_LUMEM)[m
[31m-[m
[31m-[m
[31m-static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {[m
[31m-  GCObject *curr;[m
[31m-  global_State *g = G(L);[m
[31m-  int deadmask = otherwhite(g);[m
[31m-  while ((curr = *p) != NULL && count-- > 0) {[m
[31m-    if (curr->gch.tt == LUA_TTHREAD)  /* sweep open upvalues of each thread */[m
[31m-      sweepwholelist(L, &gco2th(curr)->openupval);[m
[31m-    if ((curr->gch.marked ^ WHITEBITS) & deadmask) {  /* not dead? */[m
[31m-      lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT));[m
[31m-      makewhite(g, curr);  /* make it white (for next cycle) */[m
[31m-      p = &curr->gch.next;[m
[31m-    }[m
[31m-    else {  /* must erase `curr' */[m
[31m-      lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT));[m
[31m-      *p = curr->gch.next;[m
[31m-      if (curr == g->rootgc)  /* is the first element of the list? */[m
[31m-        g->rootgc = curr->gch.next;  /* adjust first */[m
[31m-      freeobj(L, curr);[m
[31m-    }[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void checkSizes (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  /* check size of string hash */[m
[31m-  if (g->strt.nuse < cast(lu_int32, g->strt.size/4) &&[m
[31m-      g->strt.size > MINSTRTABSIZE*2)[m
[31m-    luaS_resize(L, g->strt.size/2);  /* table is too big */[m
[31m-  /* check size of buffer */[m
[31m-  if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) {  /* buffer too big? */[m
[31m-    size_t newsize = luaZ_sizebuffer(&g->buff) / 2;[m
[31m-    luaZ_resizebuffer(L, &g->buff, newsize);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void GCTM (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  GCObject *o = g->tmudata->gch.next;  /* get first element */[m
[31m-  Udata *udata = rawgco2u(o);[m
[31m-  const TValue *tm;[m
[31m-  /* remove udata from `tmudata' */[m
[31m-  if (o == g->tmudata)  /* last element? */[m
[31m-    g->tmudata = NULL;[m
[31m-  else[m
[31m-    g->tmudata->gch.next = udata->uv.next;[m
[31m-  udata->uv.next = g->mainthread->next;  /* return it to `root' list */[m
[31m-  g->mainthread->next = o;[m
[31m-  makewhite(g, o);[m
[31m-  tm = fasttm(L, udata->uv.metatable, TM_GC);[m
[31m-  if (tm != NULL) {[m
[31m-    lu_byte oldah = L->allowhook;[m
[31m-    lu_mem oldt = g->GCthreshold;[m
[31m-    L->allowhook = 0;  /* stop debug hooks during GC tag method */[m
[31m-    g->GCthreshold = 2*g->totalbytes;  /* avoid GC steps */[m
[31m-    setobj2s(L, L->top, tm);[m
[31m-    setuvalue(L, L->top+1, udata);[m
[31m-    L->top += 2;[m
[31m-    luaD_call(L, L->top - 2, 0);[m
[31m-    L->allowhook = oldah;  /* restore hooks */[m
[31m-    g->GCthreshold = oldt;  /* restore threshold */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Call all GC tag methods[m
[31m-*/[m
[31m-void luaC_callGCTM (lua_State *L) {[m
[31m-  while (G(L)->tmudata)[m
[31m-    GCTM(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_freeall (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  int i;[m
[31m-  g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT);  /* mask to collect all elements */[m
[31m-  sweepwholelist(L, &g->rootgc);[m
[31m-  for (i = 0; i < g->strt.size; i++)  /* free all string lists */[m
[31m-    sweepwholelist(L, &g->strt.hash[i]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void markmt (global_State *g) {[m
[31m-  int i;[m
[31m-  for (i=0; i<NUM_TAGS; i++)[m
[31m-    if (g->mt[i]) markobject(g, g->mt[i]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* mark root set */[m
[31m-static void markroot (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  g->gray = NULL;[m
[31m-  g->grayagain = NULL;[m
[31m-  g->weak = NULL;[m
[31m-  markobject(g, g->mainthread);[m
[31m-  /* make global table be traversed before main stack */[m
[31m-  markvalue(g, gt(g->mainthread));[m
[31m-  markvalue(g, registry(L));[m
[31m-  markmt(g);[m
[31m-  g->gcstate = GCSpropagate;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void remarkupvals (global_State *g) {[m
[31m-  UpVal *uv;[m
[31m-  for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) {[m
[31m-    lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);[m
[31m-    if (isgray(obj2gco(uv)))[m
[31m-      markvalue(g, uv->v);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void atomic (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  size_t udsize;  /* total size of userdata to be finalized */[m
[31m-  /* remark occasional upvalues of (maybe) dead threads */[m
[31m-  remarkupvals(g);[m
[31m-  /* traverse objects cautch by write barrier and by 'remarkupvals' */[m
[31m-  propagateall(g);[m
[31m-  /* remark weak tables */[m
[31m-  g->gray = g->weak;[m
[31m-  g->weak = NULL;[m
[31m-  lua_assert(!iswhite(obj2gco(g->mainthread)));[m
[31m-  markobject(g, L);  /* mark running thread */[m
[31m-  markmt(g);  /* mark basic metatables (again) */[m
[31m-  propagateall(g);[m
[31m-  /* remark gray again */[m
[31m-  g->gray = g->grayagain;[m
[31m-  g->grayagain = NULL;[m
[31m-  propagateall(g);[m
[31m-  udsize = luaC_separateudata(L, 0);  /* separate userdata to be finalized */[m
[31m-  marktmu(g);  /* mark `preserved' userdata */[m
[31m-  udsize += propagateall(g);  /* remark, to propagate `preserveness' */[m
[31m-  cleartable(g->weak);  /* remove collected objects from weak tables */[m
[31m-  /* flip current white */[m
[31m-  g->currentwhite = cast_byte(otherwhite(g));[m
[31m-  g->sweepstrgc = 0;[m
[31m-  g->sweepgc = &g->rootgc;[m
[31m-  g->gcstate = GCSsweepstring;[m
[31m-  g->estimate = g->totalbytes - udsize;  /* first estimate */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static l_mem singlestep (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  /*lua_checkmemory(L);*/[m
[31m-  switch (g->gcstate) {[m
[31m-    case GCSpause: {[m
[31m-      markroot(L);  /* start a new collection */[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case GCSpropagate: {[m
[31m-      if (g->gray)[m
[31m-        return propagatemark(g);[m
[31m-      else {  /* no more `gray' objects */[m
[31m-        atomic(L);  /* finish mark phase */[m
[31m-        return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    case GCSsweepstring: {[m
[31m-      lu_mem old = g->totalbytes;[m
[31m-      sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]);[m
[31m-      if (g->sweepstrgc >= g->strt.size)  /* nothing more to sweep? */[m
[31m-        g->gcstate = GCSsweep;  /* end sweep-string phase */[m
[31m-      lua_assert(old >= g->totalbytes);[m
[31m-      g->estimate -= old - g->totalbytes;[m
[31m-      return GCSWEEPCOST;[m
[31m-    }[m
[31m-    case GCSsweep: {[m
[31m-      lu_mem old = g->totalbytes;[m
[31m-      g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);[m
[31m-      if (*g->sweepgc == NULL) {  /* nothing more to sweep? */[m
[31m-        checkSizes(L);[m
[31m-        g->gcstate = GCSfinalize;  /* end sweep phase */[m
[31m-      }[m
[31m-      lua_assert(old >= g->totalbytes);[m
[31m-      g->estimate -= old - g->totalbytes;[m
[31m-      return GCSWEEPMAX*GCSWEEPCOST;[m
[31m-    }[m
[31m-    case GCSfinalize: {[m
[31m-      if (g->tmudata) {[m
[31m-        GCTM(L);[m
[31m-        if (g->estimate > GCFINALIZECOST)[m
[31m-          g->estimate -= GCFINALIZECOST;[m
[31m-        return GCFINALIZECOST;[m
[31m-      }[m
[31m-      else {[m
[31m-        g->gcstate = GCSpause;  /* end collection */[m
[31m-        g->gcdept = 0;[m
[31m-        return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    default: lua_assert(0); return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_step (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul;[m
[31m-  if (lim == 0)[m
[31m-    lim = (MAX_LUMEM-1)/2;  /* no limit */[m
[31m-  g->gcdept += g->totalbytes - g->GCthreshold;[m
[31m-  do {[m
[31m-    lim -= singlestep(L);[m
[31m-    if (g->gcstate == GCSpause)[m
[31m-      break;[m
[31m-  } while (lim > 0);[m
[31m-  if (g->gcstate != GCSpause) {[m
[31m-    if (g->gcdept < GCSTEPSIZE)[m
[31m-      g->GCthreshold = g->totalbytes + GCSTEPSIZE;  /* - lim/g->gcstepmul;*/[m
[31m-    else {[m
[31m-      g->gcdept -= GCSTEPSIZE;[m
[31m-      g->GCthreshold = g->totalbytes;[m
[31m-    }[m
[31m-  }[m
[31m-  else {[m
[31m-    setthreshold(g);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_fullgc (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  if (g->gcstate <= GCSpropagate) {[m
[31m-    /* reset sweep marks to sweep all elements (returning them to white) */[m
[31m-    g->sweepstrgc = 0;[m
[31m-    g->sweepgc = &g->rootgc;[m
[31m-    /* reset other collector lists */[m
[31m-    g->gray = NULL;[m
[31m-    g->grayagain = NULL;[m
[31m-    g->weak = NULL;[m
[31m-    g->gcstate = GCSsweepstring;[m
[31m-  }[m
[31m-  lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate);[m
[31m-  /* finish any pending sweep phase */[m
[31m-  while (g->gcstate != GCSfinalize) {[m
[31m-    lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep);[m
[31m-    singlestep(L);[m
[31m-  }[m
[31m-  markroot(L);[m
[31m-  while (g->gcstate != GCSpause) {[m
[31m-    singlestep(L);[m
[31m-  }[m
[31m-  setthreshold(g);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {[m
[31m-  global_State *g = G(L);[m
[31m-  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));[m
[31m-  lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);[m
[31m-  lua_assert(ttype(&o->gch) != LUA_TTABLE);[m
[31m-  /* must keep invariant? */[m
[31m-  if (g->gcstate == GCSpropagate)[m
[31m-    reallymarkobject(g, v);  /* restore invariant */[m
[31m-  else  /* don't mind */[m
[31m-    makewhite(g, o);  /* mark as white just to avoid other barriers */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_barrierback (lua_State *L, Table *t) {[m
[31m-  global_State *g = G(L);[m
[31m-  GCObject *o = obj2gco(t);[m
[31m-  lua_assert(isblack(o) && !isdead(g, o));[m
[31m-  lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);[m
[31m-  black2gray(o);  /* make table gray (again) */[m
[31m-  t->gclist = g->grayagain;[m
[31m-  g->grayagain = o;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_link (lua_State *L, GCObject *o, lu_byte tt) {[m
[31m-  global_State *g = G(L);[m
[31m-  o->gch.next = g->rootgc;[m
[31m-  g->rootgc = o;[m
[31m-  o->gch.marked = luaC_white(g);[m
[31m-  o->gch.tt = tt;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_linkupval (lua_State *L, UpVal *uv) {[m
[31m-  global_State *g = G(L);[m
[31m-  GCObject *o = obj2gco(uv);[m
[31m-  o->gch.next = g->rootgc;  /* link upvalue into `rootgc' list */[m
[31m-  g->rootgc = o;[m
[31m-  if (isgray(o)) { [m
[31m-    if (g->gcstate == GCSpropagate) {[m
[31m-      gray2black(o);  /* closed upvalues need barrier */[m
[31m-      luaC_barrier(L, uv, uv->v);[m
[31m-    }[m
[31m-    else {  /* sweep phase: sweep it (turning it into white) */[m
[31m-      makewhite(g, o);[m
[31m-      lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lgc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lgc.h[m
[1mdeleted file mode 100644[m
[1mindex 5a8dc60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lgc.h[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Garbage Collector[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lgc_h[m
[31m-#define lgc_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Possible states of the Garbage Collector[m
[31m-*/[m
[31m-#define GCSpause	0[m
[31m-#define GCSpropagate	1[m
[31m-#define GCSsweepstring	2[m
[31m-#define GCSsweep	3[m
[31m-#define GCSfinalize	4[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** some userful bit tricks[m
[31m-*/[m
[31m-#define resetbits(x,m)	((x) &= cast(lu_byte, ~(m)))[m
[31m-#define setbits(x,m)	((x) |= (m))[m
[31m-#define testbits(x,m)	((x) & (m))[m
[31m-#define bitmask(b)	(1<<(b))[m
[31m-#define bit2mask(b1,b2)	(bitmask(b1) | bitmask(b2))[m
[31m-#define l_setbit(x,b)	setbits(x, bitmask(b))[m
[31m-#define resetbit(x,b)	resetbits(x, bitmask(b))[m
[31m-#define testbit(x,b)	testbits(x, bitmask(b))[m
[31m-#define set2bits(x,b1,b2)	setbits(x, (bit2mask(b1, b2)))[m
[31m-#define reset2bits(x,b1,b2)	resetbits(x, (bit2mask(b1, b2)))[m
[31m-#define test2bits(x,b1,b2)	testbits(x, (bit2mask(b1, b2)))[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Layout for bit use in `marked' field:[m
[31m-** bit 0 - object is white (type 0)[m
[31m-** bit 1 - object is white (type 1)[m
[31m-** bit 2 - object is black[m
[31m-** bit 3 - for userdata: has been finalized[m
[31m-** bit 3 - for tables: has weak keys[m
[31m-** bit 4 - for tables: has weak values[m
[31m-** bit 5 - object is fixed (should not be collected)[m
[31m-** bit 6 - object is "super" fixed (only the main thread)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define WHITE0BIT	0[m
[31m-#define WHITE1BIT	1[m
[31m-#define BLACKBIT	2[m
[31m-#define FINALIZEDBIT	3[m
[31m-#define KEYWEAKBIT	3[m
[31m-#define VALUEWEAKBIT	4[m
[31m-#define FIXEDBIT	5[m
[31m-#define SFIXEDBIT	6[m
[31m-#define WHITEBITS	bit2mask(WHITE0BIT, WHITE1BIT)[m
[31m-[m
[31m-[m
[31m-#define iswhite(x)      test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)[m
[31m-#define isblack(x)      testbit((x)->gch.marked, BLACKBIT)[m
[31m-#define isgray(x)	(!isblack(x) && !iswhite(x))[m
[31m-[m
[31m-#define otherwhite(g)	(g->currentwhite ^ WHITEBITS)[m
[31m-#define isdead(g,v)	((v)->gch.marked & otherwhite(g) & WHITEBITS)[m
[31m-[m
[31m-#define changewhite(x)	((x)->gch.marked ^= WHITEBITS)[m
[31m-#define gray2black(x)	l_setbit((x)->gch.marked, BLACKBIT)[m
[31m-[m
[31m-#define valiswhite(x)	(iscollectable(x) && iswhite(gcvalue(x)))[m
[31m-[m
[31m-#define luaC_white(g)	cast(lu_byte, (g)->currentwhite & WHITEBITS)[m
[31m-[m
[31m-[m
[31m-#define luaC_checkGC(L) { \[m
[31m-  condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \[m
[31m-  if (G(L)->totalbytes >= G(L)->GCthreshold) \[m
[31m-	luaC_step(L); }[m
[31m-[m
[31m-[m
[31m-#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p)))  \[m
[31m-	luaC_barrierf(L,obj2gco(p),gcvalue(v)); }[m
[31m-[m
[31m-#define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t)))  \[m
[31m-	luaC_barrierback(L,t); }[m
[31m-[m
[31m-#define luaC_objbarrier(L,p,o)  \[m
[31m-	{ if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \[m
[31m-		luaC_barrierf(L,obj2gco(p),obj2gco(o)); }[m
[31m-[m
[31m-#define luaC_objbarriert(L,t,o)  \[m
[31m-   { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); }[m
[31m-[m
[31m-LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all);[m
[31m-LUAI_FUNC void luaC_callGCTM (lua_State *L);[m
[31m-LUAI_FUNC void luaC_freeall (lua_State *L);[m
[31m-LUAI_FUNC void luaC_step (lua_State *L);[m
[31m-LUAI_FUNC void luaC_fullgc (lua_State *L);[m
[31m-LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt);[m
[31m-LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv);[m
[31m-LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v);[m
[31m-LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/linit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/linit.c[m
[1mdeleted file mode 100644[m
[1mindex c1f90df..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/linit.c[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-/*[m
[31m-** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Initialization of libraries for lua.c[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define linit_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lualib.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg lualibs[] = {[m
[31m-  {"", luaopen_base},[m
[31m-  {LUA_LOADLIBNAME, luaopen_package},[m
[31m-  {LUA_TABLIBNAME, luaopen_table},[m
[31m-  {LUA_IOLIBNAME, luaopen_io},[m
[31m-  {LUA_OSLIBNAME, luaopen_os},[m
[31m-  {LUA_STRLIBNAME, luaopen_string},[m
[31m-  {LUA_MATHLIBNAME, luaopen_math},[m
[31m-  {LUA_DBLIBNAME, luaopen_debug},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_openlibs (lua_State *L) {[m
[31m-  const luaL_Reg *lib = lualibs;[m
[31m-  for (; lib->func; lib++) {[m
[31m-    lua_pushcfunction(L, lib->func);[m
[31m-    lua_pushstring(L, lib->name);[m
[31m-    lua_call(L, 1, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/liolib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/liolib.c[m
[1mdeleted file mode 100644[m
[1mindex 649f9a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/liolib.c[m
[1m+++ /dev/null[m
[36m@@ -1,556 +0,0 @@[m
[31m-/*[m
[31m-** $Id: liolib.c,v 2.73.1.4 2010/05/14 15:33:51 roberto Exp $[m
[31m-** Standard I/O (and system) library[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define liolib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define IO_INPUT	1[m
[31m-#define IO_OUTPUT	2[m
[31m-[m
[31m-[m
[31m-static const char *const fnames[] = {"input", "output"};[m
[31m-[m
[31m-[m
[31m-static int pushresult (lua_State *L, int i, const char *filename) {[m
[31m-  int en = errno;  /* calls to Lua API may change this value */[m
[31m-  if (i) {[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    if (filename)[m
[31m-      lua_pushfstring(L, "%s: %s", filename, strerror(en));[m
[31m-    else[m
[31m-      lua_pushfstring(L, "%s", strerror(en));[m
[31m-    lua_pushinteger(L, en);[m
[31m-    return 3;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void fileerror (lua_State *L, int arg, const char *filename) {[m
[31m-  lua_pushfstring(L, "%s: %s", filename, strerror(errno));[m
[31m-  luaL_argerror(L, arg, lua_tostring(L, -1));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define tofilep(L)	((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))[m
[31m-[m
[31m-[m
[31m-static int io_type (lua_State *L) {[m
[31m-  void *ud;[m
[31m-  luaL_checkany(L, 1);[m
[31m-  ud = lua_touserdata(L, 1);[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE);[m
[31m-  if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1))[m
[31m-    lua_pushnil(L);  /* not a file */[m
[31m-  else if (*((FILE **)ud) == NULL)[m
[31m-    lua_pushliteral(L, "closed file");[m
[31m-  else[m
[31m-    lua_pushliteral(L, "file");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static FILE *tofile (lua_State *L) {[m
[31m-  FILE **f = tofilep(L);[m
[31m-  if (*f == NULL)[m
[31m-    luaL_error(L, "attempt to use a closed file");[m
[31m-  return *f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** When creating file handles, always creates a `closed' file handle[m
[31m-** before opening the actual file; so, if there is a memory error, the[m
[31m-** file is not left opened.[m
[31m-*/[m
[31m-static FILE **newfile (lua_State *L) {[m
[31m-  FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *));[m
[31m-  *pf = NULL;  /* file handle is currently `closed' */[m
[31m-  luaL_getmetatable(L, LUA_FILEHANDLE);[m
[31m-  lua_setmetatable(L, -2);[m
[31m-  return pf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** function to (not) close the standard files stdin, stdout, and stderr[m
[31m-*/[m
[31m-static int io_noclose (lua_State *L) {[m
[31m-  lua_pushnil(L);[m
[31m-  lua_pushliteral(L, "cannot close standard file");[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** function to close 'popen' files[m
[31m-*/[m
[31m-static int io_pclose (lua_State *L) {[m
[31m-  FILE **p = tofilep(L);[m
[31m-  int ok = lua_pclose(L, *p);[m
[31m-  *p = NULL;[m
[31m-  return pushresult(L, ok, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** function to close regular files[m
[31m-*/[m
[31m-static int io_fclose (lua_State *L) {[m
[31m-  FILE **p = tofilep(L);[m
[31m-  int ok = (fclose(*p) == 0);[m
[31m-  *p = NULL;[m
[31m-  return pushresult(L, ok, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int aux_close (lua_State *L) {[m
[31m-  lua_getfenv(L, 1);[m
[31m-  lua_getfield(L, -1, "__close");[m
[31m-  return (lua_tocfunction(L, -1))(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_close (lua_State *L) {[m
[31m-  if (lua_isnone(L, 1))[m
[31m-    lua_rawgeti(L, LUA_ENVIRONINDEX, IO_OUTPUT);[m
[31m-  tofile(L);  /* make sure argument is a file */[m
[31m-  return aux_close(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_gc (lua_State *L) {[m
[31m-  FILE *f = *tofilep(L);[m
[31m-  /* ignore closed files */[m
[31m-  if (f != NULL)[m
[31m-    aux_close(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_tostring (lua_State *L) {[m
[31m-  FILE *f = *tofilep(L);[m
[31m-  if (f == NULL)[m
[31m-    lua_pushliteral(L, "file (closed)");[m
[31m-  else[m
[31m-    lua_pushfstring(L, "file (%p)", f);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_open (lua_State *L) {[m
[31m-  const char *filename = luaL_checkstring(L, 1);[m
[31m-  const char *mode = luaL_optstring(L, 2, "r");[m
[31m-  FILE **pf = newfile(L);[m
[31m-  *pf = fopen(filename, mode);[m
[31m-  return (*pf == NULL) ? pushresult(L, 0, filename) : 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** this function has a separated environment, which defines the[m
[31m-** correct __close for 'popen' files[m
[31m-*/[m
[31m-static int io_popen (lua_State *L) {[m
[31m-  const char *filename = luaL_checkstring(L, 1);[m
[31m-  const char *mode = luaL_optstring(L, 2, "r");[m
[31m-  FILE **pf = newfile(L);[m
[31m-  *pf = lua_popen(L, filename, mode);[m
[31m-  return (*pf == NULL) ? pushresult(L, 0, filename) : 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_tmpfile (lua_State *L) {[m
[31m-  FILE **pf = newfile(L);[m
[31m-  *pf = tmpfile();[m
[31m-  return (*pf == NULL) ? pushresult(L, 0, NULL) : 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static FILE *getiofile (lua_State *L, int findex) {[m
[31m-  FILE *f;[m
[31m-  lua_rawgeti(L, LUA_ENVIRONINDEX, findex);[m
[31m-  f = *(FILE **)lua_touserdata(L, -1);[m
[31m-  if (f == NULL)[m
[31m-    luaL_error(L, "standard %s file is closed", fnames[findex - 1]);[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int g_iofile (lua_State *L, int f, const char *mode) {[m
[31m-  if (!lua_isnoneornil(L, 1)) {[m
[31m-    const char *filename = lua_tostring(L, 1);[m
[31m-    if (filename) {[m
[31m-      FILE **pf = newfile(L);[m
[31m-      *pf = fopen(filename, mode);[m
[31m-      if (*pf == NULL)[m
[31m-        fileerror(L, 1, filename);[m
[31m-    }[m
[31m-    else {[m
[31m-      tofile(L);  /* check that it's a valid file handle */[m
[31m-      lua_pushvalue(L, 1);[m
[31m-    }[m
[31m-    lua_rawseti(L, LUA_ENVIRONINDEX, f);[m
[31m-  }[m
[31m-  /* return current value */[m
[31m-  lua_rawgeti(L, LUA_ENVIRONINDEX, f);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_input (lua_State *L) {[m
[31m-  return g_iofile(L, IO_INPUT, "r");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_output (lua_State *L) {[m
[31m-  return g_iofile(L, IO_OUTPUT, "w");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_readline (lua_State *L);[m
[31m-[m
[31m-[m
[31m-static void aux_lines (lua_State *L, int idx, int toclose) {[m
[31m-  lua_pushvalue(L, idx);[m
[31m-  lua_pushboolean(L, toclose);  /* close/not close file when finished */[m
[31m-  lua_pushcclosure(L, io_readline, 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_lines (lua_State *L) {[m
[31m-  tofile(L);  /* check that it's a valid file handle */[m
[31m-  aux_lines(L, 1, 0);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_lines (lua_State *L) {[m
[31m-  if (lua_isnoneornil(L, 1)) {  /* no arguments? */[m
[31m-    /* will iterate over default input */[m
[31m-    lua_rawgeti(L, LUA_ENVIRONINDEX, IO_INPUT);[m
[31m-    return f_lines(L);[m
[31m-  }[m
[31m-  else {[m
[31m-    const char *filename = luaL_checkstring(L, 1);[m
[31m-    FILE **pf = newfile(L);[m
[31m-    *pf = fopen(filename, "r");[m
[31m-    if (*pf == NULL)[m
[31m-      fileerror(L, 1, filename);[m
[31m-    aux_lines(L, lua_gettop(L), 1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** READ[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static int read_number (lua_State *L, FILE *f) {[m
[31m-  lua_Number d;[m
[31m-  if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) {[m
[31m-    lua_pushnumber(L, d);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushnil(L);  /* "result" to be removed */[m
[31m-    return 0;  /* read fails */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int test_eof (lua_State *L, FILE *f) {[m
[31m-  int c = getc(f);[m
[31m-  ungetc(c, f);[m
[31m-  lua_pushlstring(L, NULL, 0);[m
[31m-  return (c != EOF);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int read_line (lua_State *L, FILE *f) {[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (;;) {[m
[31m-    size_t l;[m
[31m-    char *p = luaL_prepbuffer(&b);[m
[31m-    if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) {  /* eof? */[m
[31m-      luaL_pushresult(&b);  /* close buffer */[m
[31m-      return (lua_objlen(L, -1) > 0);  /* check whether read something */[m
[31m-    }[m
[31m-    l = strlen(p);[m
[31m-    if (l == 0 || p[l-1] != '\n')[m
[31m-      luaL_addsize(&b, l);[m
[31m-    else {[m
[31m-      luaL_addsize(&b, l - 1);  /* do not include `eol' */[m
[31m-      luaL_pushresult(&b);  /* close buffer */[m
[31m-      return 1;  /* read at least an `eol' */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int read_chars (lua_State *L, FILE *f, size_t n) {[m
[31m-  size_t rlen;  /* how much to read */[m
[31m-  size_t nr;  /* number of chars actually read */[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  rlen = LUAL_BUFFERSIZE;  /* try to read that much each time */[m
[31m-  do {[m
[31m-    char *p = luaL_prepbuffer(&b);[m
[31m-    if (rlen > n) rlen = n;  /* cannot read more than asked */[m
[31m-    nr = fread(p, sizeof(char), rlen, f);[m
[31m-    luaL_addsize(&b, nr);[m
[31m-    n -= nr;  /* still have to read `n' chars */[m
[31m-  } while (n > 0 && nr == rlen);  /* until end of count or eof */[m
[31m-  luaL_pushresult(&b);  /* close buffer */[m
[31m-  return (n == 0 || lua_objlen(L, -1) > 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int g_read (lua_State *L, FILE *f, int first) {[m
[31m-  int nargs = lua_gettop(L) - 1;[m
[31m-  int success;[m
[31m-  int n;[m
[31m-  clearerr(f);[m
[31m-  if (nargs == 0) {  /* no arguments? */[m
[31m-    success = read_line(L, f);[m
[31m-    n = first+1;  /* to return 1 result */[m
[31m-  }[m
[31m-  else {  /* ensure stack space for all results and for auxlib's buffer */[m
[31m-    luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments");[m
[31m-    success = 1;[m
[31m-    for (n = first; nargs-- && success; n++) {[m
[31m-      if (lua_type(L, n) == LUA_TNUMBER) {[m
[31m-        size_t l = (size_t)lua_tointeger(L, n);[m
[31m-        success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l);[m
[31m-      }[m
[31m-      else {[m
[31m-        const char *p = lua_tostring(L, n);[m
[31m-        luaL_argcheck(L, p && p[0] == '*', n, "invalid option");[m
[31m-        switch (p[1]) {[m
[31m-          case 'n':  /* number */[m
[31m-            success = read_number(L, f);[m
[31m-            break;[m
[31m-          case 'l':  /* line */[m
[31m-            success = read_line(L, f);[m
[31m-            break;[m
[31m-          case 'a':  /* file */[m
[31m-            read_chars(L, f, ~((size_t)0));  /* read MAX_SIZE_T chars */[m
[31m-            success = 1; /* always success */[m
[31m-            break;[m
[31m-          default:[m
[31m-            return luaL_argerror(L, n, "invalid format");[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (ferror(f))[m
[31m-    return pushresult(L, 0, NULL);[m
[31m-  if (!success) {[m
[31m-    lua_pop(L, 1);  /* remove last result */[m
[31m-    lua_pushnil(L);  /* push nil instead */[m
[31m-  }[m
[31m-  return n - first;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_read (lua_State *L) {[m
[31m-  return g_read(L, getiofile(L, IO_INPUT), 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_read (lua_State *L) {[m
[31m-  return g_read(L, tofile(L), 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_readline (lua_State *L) {[m
[31m-  FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1));[m
[31m-  int sucess;[m
[31m-  if (f == NULL)  /* file is already closed? */[m
[31m-    luaL_error(L, "file is already closed");[m
[31m-  sucess = read_line(L, f);[m
[31m-  if (ferror(f))[m
[31m-    return luaL_error(L, "%s", strerror(errno));[m
[31m-  if (sucess) return 1;[m
[31m-  else {  /* EOF */[m
[31m-    if (lua_toboolean(L, lua_upvalueindex(2))) {  /* generator created file? */[m
[31m-      lua_settop(L, 0);[m
[31m-      lua_pushvalue(L, lua_upvalueindex(1));[m
[31m-      aux_close(L);  /* close it */[m
[31m-    }[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static int g_write (lua_State *L, FILE *f, int arg) {[m
[31m-  int nargs = lua_gettop(L) - 1;[m
[31m-  int status = 1;[m
[31m-  for (; nargs--; arg++) {[m
[31m-    if (lua_type(L, arg) == LUA_TNUMBER) {[m
[31m-      /* optimization: could be done exactly as for strings */[m
[31m-      status = status &&[m
[31m-          fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0;[m
[31m-    }[m
[31m-    else {[m
[31m-      size_t l;[m
[31m-      const char *s = luaL_checklstring(L, arg, &l);[m
[31m-      status = status && (fwrite(s, sizeof(char), l, f) == l);[m
[31m-    }[m
[31m-  }[m
[31m-  return pushresult(L, status, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_write (lua_State *L) {[m
[31m-  return g_write(L, getiofile(L, IO_OUTPUT), 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_write (lua_State *L) {[m
[31m-  return g_write(L, tofile(L), 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_seek (lua_State *L) {[m
[31m-  static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END};[m
[31m-  static const char *const modenames[] = {"set", "cur", "end", NULL};[m
[31m-  FILE *f = tofile(L);[m
[31m-  int op = luaL_checkoption(L, 2, "cur", modenames);[m
[31m-  long offset = luaL_optlong(L, 3, 0);[m
[31m-  op = fseek(f, offset, mode[op]);[m
[31m-  if (op)[m
[31m-    return pushresult(L, 0, NULL);  /* error */[m
[31m-  else {[m
[31m-    lua_pushinteger(L, ftell(f));[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_setvbuf (lua_State *L) {[m
[31m-  static const int mode[] = {_IONBF, _IOFBF, _IOLBF};[m
[31m-  static const char *const modenames[] = {"no", "full", "line", NULL};[m
[31m-  FILE *f = tofile(L);[m
[31m-  int op = luaL_checkoption(L, 2, NULL, modenames);[m
[31m-  lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE);[m
[31m-  int res = setvbuf(f, NULL, mode[op], sz);[m
[31m-  return pushresult(L, res == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int io_flush (lua_State *L) {[m
[31m-  return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_flush (lua_State *L) {[m
[31m-  return pushresult(L, fflush(tofile(L)) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg iolib[] = {[m
[31m-  {"close", io_close},[m
[31m-  {"flush", io_flush},[m
[31m-  {"input", io_input},[m
[31m-  {"lines", io_lines},[m
[31m-  {"open", io_open},[m
[31m-  {"output", io_output},[m
[31m-  {"popen", io_popen},[m
[31m-  {"read", io_read},[m
[31m-  {"tmpfile", io_tmpfile},[m
[31m-  {"type", io_type},[m
[31m-  {"write", io_write},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg flib[] = {[m
[31m-  {"close", io_close},[m
[31m-  {"flush", f_flush},[m
[31m-  {"lines", f_lines},[m
[31m-  {"read", f_read},[m
[31m-  {"seek", f_seek},[m
[31m-  {"setvbuf", f_setvbuf},[m
[31m-  {"write", f_write},[m
[31m-  {"__gc", io_gc},[m
[31m-  {"__tostring", io_tostring},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void createmeta (lua_State *L) {[m
[31m-  luaL_newmetatable(L, LUA_FILEHANDLE);  /* create metatable for file handles */[m
[31m-  lua_pushvalue(L, -1);  /* push metatable */[m
[31m-  lua_setfield(L, -2, "__index");  /* metatable.__index = metatable */[m
[31m-  luaL_register(L, NULL, flib);  /* file methods */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) {[m
[31m-  *newfile(L) = f;[m
[31m-  if (k > 0) {[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_rawseti(L, LUA_ENVIRONINDEX, k);[m
[31m-  }[m
[31m-  lua_pushvalue(L, -2);  /* copy environment */[m
[31m-  lua_setfenv(L, -2);  /* set it */[m
[31m-  lua_setfield(L, -3, fname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void newfenv (lua_State *L, lua_CFunction cls) {[m
[31m-  lua_createtable(L, 0, 1);[m
[31m-  lua_pushcfunction(L, cls);[m
[31m-  lua_setfield(L, -2, "__close");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_io (lua_State *L) {[m
[31m-  createmeta(L);[m
[31m-  /* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */[m
[31m-  newfenv(L, io_fclose);[m
[31m-  lua_replace(L, LUA_ENVIRONINDEX);[m
[31m-  /* open library */[m
[31m-  luaL_register(L, LUA_IOLIBNAME, iolib);[m
[31m-  /* create (and set) default files */[m
[31m-  newfenv(L, io_noclose);  /* close function for default files */[m
[31m-  createstdfile(L, stdin, IO_INPUT, "stdin");[m
[31m-  createstdfile(L, stdout, IO_OUTPUT, "stdout");[m
[31m-  createstdfile(L, stderr, 0, "stderr");[m
[31m-  lua_pop(L, 1);  /* pop environment for default files */[m
[31m-  lua_getfield(L, -1, "popen");[m
[31m-  newfenv(L, io_pclose);  /* create environment for 'popen' */[m
[31m-  lua_setfenv(L, -2);  /* set fenv for 'popen' */[m
[31m-  lua_pop(L, 1);  /* pop 'popen' */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llex.c[m
[1mdeleted file mode 100644[m
[1mindex 88c6790..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llex.c[m
[1m+++ /dev/null[m
[36m@@ -1,463 +0,0 @@[m
[31m-/*[m
[31m-** $Id: llex.c,v 2.20.1.2 2009/11/23 14:58:22 roberto Exp $[m
[31m-** Lexical Analyzer[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <locale.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define llex_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldo.h"[m
[31m-#include "llex.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lparser.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define next(ls) (ls->current = zgetc(ls->z))[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define currIsNewline(ls)	(ls->current == '\n' || ls->current == '\r')[m
[31m-[m
[31m-[m
[31m-/* ORDER RESERVED */[m
[31m-const char *const luaX_tokens [] = {[m
[31m-    "and", "break", "do", "else", "elseif",[m
[31m-    "end", "false", "for", "function", "if",[m
[31m-    "in", "local", "nil", "not", "or", "repeat",[m
[31m-    "return", "then", "true", "until", "while",[m
[31m-    "..", "...", "==", ">=", "<=", "~=",[m
[31m-    "<number>", "<name>", "<string>", "<eof>",[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define save_and_next(ls) (save(ls, ls->current), next(ls))[m
[31m-[m
[31m-[m
[31m-static void save (LexState *ls, int c) {[m
[31m-  Mbuffer *b = ls->buff;[m
[31m-  if (b->n + 1 > b->buffsize) {[m
[31m-    size_t newsize;[m
[31m-    if (b->buffsize >= MAX_SIZET/2)[m
[31m-      luaX_lexerror(ls, "lexical element too long", 0);[m
[31m-    newsize = b->buffsize * 2;[m
[31m-    luaZ_resizebuffer(ls->L, b, newsize);[m
[31m-  }[m
[31m-  b->buffer[b->n++] = cast(char, c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_init (lua_State *L) {[m
[31m-  int i;[m
[31m-  for (i=0; i<NUM_RESERVED; i++) {[m
[31m-    TString *ts = luaS_new(L, luaX_tokens[i]);[m
[31m-    luaS_fix(ts);  /* reserved words are never collected */[m
[31m-    lua_assert(strlen(luaX_tokens[i])+1 <= TOKEN_LEN);[m
[31m-    ts->tsv.reserved = cast_byte(i+1);  /* reserved word */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define MAXSRC          80[m
[31m-[m
[31m-[m
[31m-const char *luaX_token2str (LexState *ls, int token) {[m
[31m-  if (token < FIRST_RESERVED) {[m
[31m-    lua_assert(token == cast(unsigned char, token));[m
[31m-    return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) :[m
[31m-                              luaO_pushfstring(ls->L, "%c", token);[m
[31m-  }[m
[31m-  else[m
[31m-    return luaX_tokens[token-FIRST_RESERVED];[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *txtToken (LexState *ls, int token) {[m
[31m-  switch (token) {[m
[31m-    case TK_NAME:[m
[31m-    case TK_STRING:[m
[31m-    case TK_NUMBER:[m
[31m-      save(ls, '\0');[m
[31m-      return luaZ_buffer(ls->buff);[m
[31m-    default:[m
[31m-      return luaX_token2str(ls, token);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_lexerror (LexState *ls, const char *msg, int token) {[m
[31m-  char buff[MAXSRC];[m
[31m-  luaO_chunkid(buff, getstr(ls->source), MAXSRC);[m
[31m-  msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg);[m
[31m-  if (token)[m
[31m-    luaO_pushfstring(ls->L, "%s near " LUA_QS, msg, txtToken(ls, token));[m
[31m-  luaD_throw(ls->L, LUA_ERRSYNTAX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_syntaxerror (LexState *ls, const char *msg) {[m
[31m-  luaX_lexerror(ls, msg, ls->t.token);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TString *luaX_newstring (LexState *ls, const char *str, size_t l) {[m
[31m-  lua_State *L = ls->L;[m
[31m-  TString *ts = luaS_newlstr(L, str, l);[m
[31m-  TValue *o = luaH_setstr(L, ls->fs->h, ts);  /* entry for `str' */[m
[31m-  if (ttisnil(o)) {[m
[31m-    setbvalue(o, 1);  /* make sure `str' will not be collected */[m
[31m-    luaC_checkGC(L);[m
[31m-  }[m
[31m-  return ts;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void inclinenumber (LexState *ls) {[m
[31m-  int old = ls->current;[m
[31m-  lua_assert(currIsNewline(ls));[m
[31m-  next(ls);  /* skip `\n' or `\r' */[m
[31m-  if (currIsNewline(ls) && ls->current != old)[m
[31m-    next(ls);  /* skip `\n\r' or `\r\n' */[m
[31m-  if (++ls->linenumber >= MAX_INT)[m
[31m-    luaX_syntaxerror(ls, "chunk has too many lines");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) {[m
[31m-  ls->decpoint = '.';[m
[31m-  ls->L = L;[m
[31m-  ls->lookahead.token = TK_EOS;  /* no look-ahead token */[m
[31m-  ls->z = z;[m
[31m-  ls->fs = NULL;[m
[31m-  ls->linenumber = 1;[m
[31m-  ls->lastline = 1;[m
[31m-  ls->source = source;[m
[31m-  luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER);  /* initialize buffer */[m
[31m-  next(ls);  /* read first char */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** =======================================================[m
[31m-** LEXICAL ANALYZER[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int check_next (LexState *ls, const char *set) {[m
[31m-  if (!strchr(set, ls->current))[m
[31m-    return 0;[m
[31m-  save_and_next(ls);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void buffreplace (LexState *ls, char from, char to) {[m
[31m-  size_t n = luaZ_bufflen(ls->buff);[m
[31m-  char *p = luaZ_buffer(ls->buff);[m
[31m-  while (n--)[m
[31m-    if (p[n] == from) p[n] = to;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void trydecpoint (LexState *ls, SemInfo *seminfo) {[m
[31m-  /* format error: try to update decimal point separator */[m
[31m-  struct lconv *cv = localeconv();[m
[31m-  char old = ls->decpoint;[m
[31m-  ls->decpoint = (cv ? cv->decimal_point[0] : '.');[m
[31m-  buffreplace(ls, old, ls->decpoint);  /* try updated decimal separator */[m
[31m-  if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) {[m
[31m-    /* format error with correct decimal point: no more options */[m
[31m-    buffreplace(ls, ls->decpoint, '.');  /* undo change (for error message) */[m
[31m-    luaX_lexerror(ls, "malformed number", TK_NUMBER);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* LUA_NUMBER */[m
[31m-static void read_numeral (LexState *ls, SemInfo *seminfo) {[m
[31m-  lua_assert(isdigit(ls->current));[m
[31m-  do {[m
[31m-    save_and_next(ls);[m
[31m-  } while (isdigit(ls->current) || ls->current == '.');[m
[31m-  if (check_next(ls, "Ee"))  /* `E'? */[m
[31m-    check_next(ls, "+-");  /* optional exponent sign */[m
[31m-  while (isalnum(ls->current) || ls->current == '_')[m
[31m-    save_and_next(ls);[m
[31m-  save(ls, '\0');[m
[31m-  buffreplace(ls, '.', ls->decpoint);  /* follow locale for decimal point */[m
[31m-  if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r))  /* format error? */[m
[31m-    trydecpoint(ls, seminfo); /* try to update decimal point separator */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int skip_sep (LexState *ls) {[m
[31m-  int count = 0;[m
[31m-  int s = ls->current;[m
[31m-  lua_assert(s == '[' || s == ']');[m
[31m-  save_and_next(ls);[m
[31m-  while (ls->current == '=') {[m
[31m-    save_and_next(ls);[m
[31m-    count++;[m
[31m-  }[m
[31m-  return (ls->current == s) ? count : (-count) - 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {[m
[31m-  int cont = 0;[m
[31m-  (void)(cont);  /* avoid warnings when `cont' is not used */[m
[31m-  save_and_next(ls);  /* skip 2nd `[' */[m
[31m-  if (currIsNewline(ls))  /* string starts with a newline? */[m
[31m-    inclinenumber(ls);  /* skip it */[m
[31m-  for (;;) {[m
[31m-    switch (ls->current) {[m
[31m-      case EOZ:[m
[31m-        luaX_lexerror(ls, (seminfo) ? "unfinished long string" :[m
[31m-                                   "unfinished long comment", TK_EOS);[m
[31m-        break;  /* to avoid warnings */[m
[31m-#if defined(LUA_COMPAT_LSTR)[m
[31m-      case '[': {[m
[31m-        if (skip_sep(ls) == sep) {[m
[31m-          save_and_next(ls);  /* skip 2nd `[' */[m
[31m-          cont++;[m
[31m-#if LUA_COMPAT_LSTR == 1[m
[31m-          if (sep == 0)[m
[31m-            luaX_lexerror(ls, "nesting of [[...]] is deprecated", '[');[m
[31m-#endif[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-#endif[m
[31m-      case ']': {[m
[31m-        if (skip_sep(ls) == sep) {[m
[31m-          save_and_next(ls);  /* skip 2nd `]' */[m
[31m-#if defined(LUA_COMPAT_LSTR) && LUA_COMPAT_LSTR == 2[m
[31m-          cont--;[m
[31m-          if (sep == 0 && cont >= 0) break;[m
[31m-#endif[m
[31m-          goto endloop;[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-      case '\n':[m
[31m-      case '\r': {[m
[31m-        save(ls, '\n');[m
[31m-        inclinenumber(ls);[m
[31m-        if (!seminfo) luaZ_resetbuffer(ls->buff);  /* avoid wasting space */[m
[31m-        break;[m
[31m-      }[m
[31m-      default: {[m
[31m-        if (seminfo) save_and_next(ls);[m
[31m-        else next(ls);[m
[31m-      }[m
[31m-    }[m
[31m-  } endloop:[m
[31m-  if (seminfo)[m
[31m-    seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),[m
[31m-                                     luaZ_bufflen(ls->buff) - 2*(2 + sep));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void read_string (LexState *ls, int del, SemInfo *seminfo) {[m
[31m-  save_and_next(ls);[m
[31m-  while (ls->current != del) {[m
[31m-    switch (ls->current) {[m
[31m-      case EOZ:[m
[31m-        luaX_lexerror(ls, "unfinished string", TK_EOS);[m
[31m-        continue;  /* to avoid warnings */[m
[31m-      case '\n':[m
[31m-      case '\r':[m
[31m-        luaX_lexerror(ls, "unfinished string", TK_STRING);[m
[31m-        continue;  /* to avoid warnings */[m
[31m-      case '\\': {[m
[31m-        int c;[m
[31m-        next(ls);  /* do not save the `\' */[m
[31m-        switch (ls->current) {[m
[31m-          case 'a': c = '\a'; break;[m
[31m-          case 'b': c = '\b'; break;[m
[31m-          case 'f': c = '\f'; break;[m
[31m-          case 'n': c = '\n'; break;[m
[31m-          case 'r': c = '\r'; break;[m
[31m-          case 't': c = '\t'; break;[m
[31m-          case 'v': c = '\v'; break;[m
[31m-          case '\n':  /* go through */[m
[31m-          case '\r': save(ls, '\n'); inclinenumber(ls); continue;[m
[31m-          case EOZ: continue;  /* will raise an error next loop */[m
[31m-          default: {[m
[31m-            if (!isdigit(ls->current))[m
[31m-              save_and_next(ls);  /* handles \\, \", \', and \? */[m
[31m-            else {  /* \xxx */[m
[31m-              int i = 0;[m
[31m-              c = 0;[m
[31m-              do {[m
[31m-                c = 10*c + (ls->current-'0');[m
[31m-                next(ls);[m
[31m-              } while (++i<3 && isdigit(ls->current));[m
[31m-              if (c > UCHAR_MAX)[m
[31m-                luaX_lexerror(ls, "escape sequence too large", TK_STRING);[m
[31m-              save(ls, c);[m
[31m-            }[m
[31m-            continue;[m
[31m-          }[m
[31m-        }[m
[31m-        save(ls, c);[m
[31m-        next(ls);[m
[31m-        continue;[m
[31m-      }[m
[31m-      default:[m
[31m-        save_and_next(ls);[m
[31m-    }[m
[31m-  }[m
[31m-  save_and_next(ls);  /* skip delimiter */[m
[31m-  seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,[m
[31m-                                   luaZ_bufflen(ls->buff) - 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int llex (LexState *ls, SemInfo *seminfo) {[m
[31m-  luaZ_resetbuffer(ls->buff);[m
[31m-  for (;;) {[m
[31m-    switch (ls->current) {[m
[31m-      case '\n':[m
[31m-      case '\r': {[m
[31m-        inclinenumber(ls);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case '-': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '-') return '-';[m
[31m-        /* else is a comment */[m
[31m-        next(ls);[m
[31m-        if (ls->current == '[') {[m
[31m-          int sep = skip_sep(ls);[m
[31m-          luaZ_resetbuffer(ls->buff);  /* `skip_sep' may dirty the buffer */[m
[31m-          if (sep >= 0) {[m
[31m-            read_long_string(ls, NULL, sep);  /* long comment */[m
[31m-            luaZ_resetbuffer(ls->buff);[m
[31m-            continue;[m
[31m-          }[m
[31m-        }[m
[31m-        /* else short comment */[m
[31m-        while (!currIsNewline(ls) && ls->current != EOZ)[m
[31m-          next(ls);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case '[': {[m
[31m-        int sep = skip_sep(ls);[m
[31m-        if (sep >= 0) {[m
[31m-          read_long_string(ls, seminfo, sep);[m
[31m-          return TK_STRING;[m
[31m-        }[m
[31m-        else if (sep == -1) return '[';[m
[31m-        else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING);[m
[31m-      }[m
[31m-      case '=': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '=') return '=';[m
[31m-        else { next(ls); return TK_EQ; }[m
[31m-      }[m
[31m-      case '<': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '=') return '<';[m
[31m-        else { next(ls); return TK_LE; }[m
[31m-      }[m
[31m-      case '>': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '=') return '>';[m
[31m-        else { next(ls); return TK_GE; }[m
[31m-      }[m
[31m-      case '~': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '=') return '~';[m
[31m-        else { next(ls); return TK_NE; }[m
[31m-      }[m
[31m-      case '"':[m
[31m-      case '\'': {[m
[31m-        read_string(ls, ls->current, seminfo);[m
[31m-        return TK_STRING;[m
[31m-      }[m
[31m-      case '.': {[m
[31m-        save_and_next(ls);[m
[31m-        if (check_next(ls, ".")) {[m
[31m-          if (check_next(ls, "."))[m
[31m-            return TK_DOTS;   /* ... */[m
[31m-          else return TK_CONCAT;   /* .. */[m
[31m-        }[m
[31m-        else if (!isdigit(ls->current)) return '.';[m
[31m-        else {[m
[31m-          read_numeral(ls, seminfo);[m
[31m-          return TK_NUMBER;[m
[31m-        }[m
[31m-      }[m
[31m-      case EOZ: {[m
[31m-        return TK_EOS;[m
[31m-      }[m
[31m-      default: {[m
[31m-        if (isspace(ls->current)) {[m
[31m-          lua_assert(!currIsNewline(ls));[m
[31m-          next(ls);[m
[31m-          continue;[m
[31m-        }[m
[31m-        else if (isdigit(ls->current)) {[m
[31m-          read_numeral(ls, seminfo);[m
[31m-          return TK_NUMBER;[m
[31m-        }[m
[31m-        else if (isalpha(ls->current) || ls->current == '_') {[m
[31m-          /* identifier or reserved word */[m
[31m-          TString *ts;[m
[31m-          do {[m
[31m-            save_and_next(ls);[m
[31m-          } while (isalnum(ls->current) || ls->current == '_');[m
[31m-          ts = luaX_newstring(ls, luaZ_buffer(ls->buff),[m
[31m-                                  luaZ_bufflen(ls->buff));[m
[31m-          if (ts->tsv.reserved > 0)  /* reserved word? */[m
[31m-            return ts->tsv.reserved - 1 + FIRST_RESERVED;[m
[31m-          else {[m
[31m-            seminfo->ts = ts;[m
[31m-            return TK_NAME;[m
[31m-          }[m
[31m-        }[m
[31m-        else {[m
[31m-          int c = ls->current;[m
[31m-          next(ls);[m
[31m-          return c;  /* single-char tokens (+ - / ...) */[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_next (LexState *ls) {[m
[31m-  ls->lastline = ls->linenumber;[m
[31m-  if (ls->lookahead.token != TK_EOS) {  /* is there a look-ahead token? */[m
[31m-    ls->t = ls->lookahead;  /* use this one */[m
[31m-    ls->lookahead.token = TK_EOS;  /* and discharge it */[m
[31m-  }[m
[31m-  else[m
[31m-    ls->t.token = llex(ls, &ls->t.seminfo);  /* read next token */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_lookahead (LexState *ls) {[m
[31m-  lua_assert(ls->lookahead.token == TK_EOS);[m
[31m-  ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llex.h[m
[1mdeleted file mode 100644[m
[1mindex a9201ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llex.h[m
[1m+++ /dev/null[m
[36m@@ -1,81 +0,0 @@[m
[31m-/*[m
[31m-** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lexical Analyzer[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef llex_h[m
[31m-#define llex_h[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-#define FIRST_RESERVED	257[m
[31m-[m
[31m-/* maximum length of a reserved word */[m
[31m-#define TOKEN_LEN	(sizeof("function")/sizeof(char))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-* WARNING: if you change the order of this enumeration,[m
[31m-* grep "ORDER RESERVED"[m
[31m-*/[m
[31m-enum RESERVED {[m
[31m-  /* terminal symbols denoted by reserved words */[m
[31m-  TK_AND = FIRST_RESERVED, TK_BREAK,[m
[31m-  TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,[m
[31m-  TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,[m
[31m-  TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,[m
[31m-  /* other terminal symbols */[m
[31m-  TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER,[m
[31m-  TK_NAME, TK_STRING, TK_EOS[m
[31m-};[m
[31m-[m
[31m-/* number of reserved words */[m
[31m-#define NUM_RESERVED	(cast(int, TK_WHILE-FIRST_RESERVED+1))[m
[31m-[m
[31m-[m
[31m-/* array with token `names' */[m
[31m-LUAI_DATA const char *const luaX_tokens [];[m
[31m-[m
[31m-[m
[31m-typedef union {[m
[31m-  lua_Number r;[m
[31m-  TString *ts;[m
[31m-} SemInfo;  /* semantics information */[m
[31m-[m
[31m-[m
[31m-typedef struct Token {[m
[31m-  int token;[m
[31m-  SemInfo seminfo;[m
[31m-} Token;[m
[31m-[m
[31m-[m
[31m-typedef struct LexState {[m
[31m-  int current;  /* current character (charint) */[m
[31m-  int linenumber;  /* input line counter */[m
[31m-  int lastline;  /* line of last token `consumed' */[m
[31m-  Token t;  /* current token */[m
[31m-  Token lookahead;  /* look ahead token */[m
[31m-  struct FuncState *fs;  /* `FuncState' is private to the parser */[m
[31m-  struct lua_State *L;[m
[31m-  ZIO *z;  /* input stream */[m
[31m-  Mbuffer *buff;  /* buffer for tokens */[m
[31m-  TString *source;  /* current source name */[m
[31m-  char decpoint;  /* locale decimal point */[m
[31m-} LexState;[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC void luaX_init (lua_State *L);[m
[31m-LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z,[m
[31m-                              TString *source);[m
[31m-LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);[m
[31m-LUAI_FUNC void luaX_next (LexState *ls);[m
[31m-LUAI_FUNC void luaX_lookahead (LexState *ls);[m
[31m-LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token);[m
[31m-LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s);[m
[31m-LUAI_FUNC const char *luaX_token2str (LexState *ls, int token);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llimits.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llimits.h[m
[1mdeleted file mode 100644[m
[1mindex ca8dcb7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/llimits.h[m
[1m+++ /dev/null[m
[36m@@ -1,128 +0,0 @@[m
[31m-/*[m
[31m-** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Limits, basic types, and some other `installation-dependent' definitions[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef llimits_h[m
[31m-#define llimits_h[m
[31m-[m
[31m-[m
[31m-#include <limits.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-typedef LUAI_UINT32 lu_int32;[m
[31m-[m
[31m-typedef LUAI_UMEM lu_mem;[m
[31m-[m
[31m-typedef LUAI_MEM l_mem;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* chars used as small naturals (so that `char' is reserved for characters) */[m
[31m-typedef unsigned char lu_byte;[m
[31m-[m
[31m-[m
[31m-#define MAX_SIZET	((size_t)(~(size_t)0)-2)[m
[31m-[m
[31m-#define MAX_LUMEM	((lu_mem)(~(lu_mem)0)-2)[m
[31m-[m
[31m-[m
[31m-#define MAX_INT (INT_MAX-2)  /* maximum value of an int (-2 for safety) */[m
[31m-[m
[31m-/*[m
[31m-** conversion of pointer to integer[m
[31m-** this is for hashing only; there is no problem if the integer[m
[31m-** cannot hold the whole pointer value[m
[31m-*/[m
[31m-#define IntPoint(p)  ((unsigned int)(lu_mem)(p))[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* type to ensure maximum alignment */[m
[31m-typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;[m
[31m-[m
[31m-[m
[31m-/* result of a `usual argument conversion' over lua_Number */[m
[31m-typedef LUAI_UACNUMBER l_uacNumber;[m
[31m-[m
[31m-[m
[31m-/* internal assertions for in-house debugging */[m
[31m-#ifdef lua_assert[m
[31m-[m
[31m-#define check_exp(c,e)		(lua_assert(c), (e))[m
[31m-#define api_check(l,e)		lua_assert(e)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define lua_assert(c)		((void)0)[m
[31m-#define check_exp(c,e)		(e)[m
[31m-#define api_check		luai_apicheck[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef UNUSED[m
[31m-#define UNUSED(x)	((void)(x))	/* to avoid warnings */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef cast[m
[31m-#define cast(t, exp)	((t)(exp))[m
[31m-#endif[m
[31m-[m
[31m-#define cast_byte(i)	cast(lu_byte, (i))[m
[31m-#define cast_num(i)	cast(lua_Number, (i))[m
[31m-#define cast_int(i)	cast(int, (i))[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** type for virtual-machine instructions[m
[31m-** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)[m
[31m-*/[m
[31m-typedef lu_int32 Instruction;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* maximum stack for a Lua function */[m
[31m-#define MAXSTACK	250[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* minimum size for the string table (must be power of 2) */[m
[31m-#ifndef MINSTRTABSIZE[m
[31m-#define MINSTRTABSIZE	32[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* minimum size for string buffer */[m
[31m-#ifndef LUA_MINBUFFER[m
[31m-#define LUA_MINBUFFER	32[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef lua_lock[m
[31m-#define lua_lock(L)     ((void) 0) [m
[31m-#define lua_unlock(L)   ((void) 0)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef luai_threadyield[m
[31m-#define luai_threadyield(L)     {lua_unlock(L); lua_lock(L);}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** macro to control inclusion of some hard tests on stack reallocation[m
[31m-*/ [m
[31m-#ifndef HARDSTACKTESTS[m
[31m-#define condhardstacktests(x)	((void)0)[m
[31m-#else[m
[31m-#define condhardstacktests(x)	x[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmathlib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmathlib.c[m
[1mdeleted file mode 100644[m
[1mindex 441fbf7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmathlib.c[m
[1m+++ /dev/null[m
[36m@@ -1,263 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Standard mathematical library[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-#include <math.h>[m
[31m-[m
[31m-#define lmathlib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-#undef PI[m
[31m-#define PI (3.14159265358979323846)[m
[31m-#define RADIANS_PER_DEGREE (PI/180.0)[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int math_abs (lua_State *L) {[m
[31m-  lua_pushnumber(L, fabs(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_sin (lua_State *L) {[m
[31m-  lua_pushnumber(L, sin(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_sinh (lua_State *L) {[m
[31m-  lua_pushnumber(L, sinh(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_cos (lua_State *L) {[m
[31m-  lua_pushnumber(L, cos(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_cosh (lua_State *L) {[m
[31m-  lua_pushnumber(L, cosh(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_tan (lua_State *L) {[m
[31m-  lua_pushnumber(L, tan(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_tanh (lua_State *L) {[m
[31m-  lua_pushnumber(L, tanh(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_asin (lua_State *L) {[m
[31m-  lua_pushnumber(L, asin(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_acos (lua_State *L) {[m
[31m-  lua_pushnumber(L, acos(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_atan (lua_State *L) {[m
[31m-  lua_pushnumber(L, atan(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_atan2 (lua_State *L) {[m
[31m-  lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_ceil (lua_State *L) {[m
[31m-  lua_pushnumber(L, ceil(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_floor (lua_State *L) {[m
[31m-  lua_pushnumber(L, floor(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_fmod (lua_State *L) {[m
[31m-  lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_modf (lua_State *L) {[m
[31m-  double ip;[m
[31m-  double fp = modf(luaL_checknumber(L, 1), &ip);[m
[31m-  lua_pushnumber(L, ip);[m
[31m-  lua_pushnumber(L, fp);[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-static int math_sqrt (lua_State *L) {[m
[31m-  lua_pushnumber(L, sqrt(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_pow (lua_State *L) {[m
[31m-  lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_log (lua_State *L) {[m
[31m-  lua_pushnumber(L, log(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_log10 (lua_State *L) {[m
[31m-  lua_pushnumber(L, log10(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_exp (lua_State *L) {[m
[31m-  lua_pushnumber(L, exp(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_deg (lua_State *L) {[m
[31m-  lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_rad (lua_State *L) {[m
[31m-  lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_frexp (lua_State *L) {[m
[31m-  int e;[m
[31m-  lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e));[m
[31m-  lua_pushinteger(L, e);[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-static int math_ldexp (lua_State *L) {[m
[31m-  lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int math_min (lua_State *L) {[m
[31m-  int n = lua_gettop(L);  /* number of arguments */[m
[31m-  lua_Number dmin = luaL_checknumber(L, 1);[m
[31m-  int i;[m
[31m-  for (i=2; i<=n; i++) {[m
[31m-    lua_Number d = luaL_checknumber(L, i);[m
[31m-    if (d < dmin)[m
[31m-      dmin = d;[m
[31m-  }[m
[31m-  lua_pushnumber(L, dmin);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int math_max (lua_State *L) {[m
[31m-  int n = lua_gettop(L);  /* number of arguments */[m
[31m-  lua_Number dmax = luaL_checknumber(L, 1);[m
[31m-  int i;[m
[31m-  for (i=2; i<=n; i++) {[m
[31m-    lua_Number d = luaL_checknumber(L, i);[m
[31m-    if (d > dmax)[m
[31m-      dmax = d;[m
[31m-  }[m
[31m-  lua_pushnumber(L, dmax);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int math_random (lua_State *L) {[m
[31m-  /* the `%' avoids the (rare) case of r==1, and is needed also because on[m
[31m-     some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */[m
[31m-  lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX;[m
[31m-  switch (lua_gettop(L)) {  /* check number of arguments */[m
[31m-    case 0: {  /* no arguments */[m
[31m-      lua_pushnumber(L, r);  /* Number between 0 and 1 */[m
[31m-      break;[m
[31m-    }[m
[31m-    case 1: {  /* only upper limit */[m
[31m-      int u = luaL_checkint(L, 1);[m
[31m-      luaL_argcheck(L, 1<=u, 1, "interval is empty");[m
[31m-      lua_pushnumber(L, floor(r*u)+1);  /* int between 1 and `u' */[m
[31m-      break;[m
[31m-    }[m
[31m-    case 2: {  /* lower and upper limits */[m
[31m-      int l = luaL_checkint(L, 1);[m
[31m-      int u = luaL_checkint(L, 2);[m
[31m-      luaL_argcheck(L, l<=u, 2, "interval is empty");[m
[31m-      lua_pushnumber(L, floor(r*(u-l+1))+l);  /* int between `l' and `u' */[m
[31m-      break;[m
[31m-    }[m
[31m-    default: return luaL_error(L, "wrong number of arguments");[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int math_randomseed (lua_State *L) {[m
[31m-  srand(luaL_checkint(L, 1));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg mathlib[] = {[m
[31m-  {"abs",   math_abs},[m
[31m-  {"acos",  math_acos},[m
[31m-  {"asin",  math_asin},[m
[31m-  {"atan2", math_atan2},[m
[31m-  {"atan",  math_atan},[m
[31m-  {"ceil",  math_ceil},[m
[31m-  {"cosh",   math_cosh},[m
[31m-  {"cos",   math_cos},[m
[31m-  {"deg",   math_deg},[m
[31m-  {"exp",   math_exp},[m
[31m-  {"floor", math_floor},[m
[31m-  {"fmod",   math_fmod},[m
[31m-  {"frexp", math_frexp},[m
[31m-  {"ldexp", math_ldexp},[m
[31m-  {"log10", math_log10},[m
[31m-  {"log",   math_log},[m
[31m-  {"max",   math_max},[m
[31m-  {"min",   math_min},[m
[31m-  {"modf",   math_modf},[m
[31m-  {"pow",   math_pow},[m
[31m-  {"rad",   math_rad},[m
[31m-  {"random",     math_random},[m
[31m-  {"randomseed", math_randomseed},[m
[31m-  {"sinh",   math_sinh},[m
[31m-  {"sin",   math_sin},[m
[31m-  {"sqrt",  math_sqrt},[m
[31m-  {"tanh",   math_tanh},[m
[31m-  {"tan",   math_tan},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Open math library[m
[31m-*/[m
[31m-LUALIB_API int luaopen_math (lua_State *L) {[m
[31m-  luaL_register(L, LUA_MATHLIBNAME, mathlib);[m
[31m-  lua_pushnumber(L, PI);[m
[31m-  lua_setfield(L, -2, "pi");[m
[31m-  lua_pushnumber(L, HUGE_VAL);[m
[31m-  lua_setfield(L, -2, "huge");[m
[31m-#if defined(LUA_COMPAT_MOD)[m
[31m-  lua_getfield(L, -1, "fmod");[m
[31m-  lua_setfield(L, -2, "mod");[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmem.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmem.c[m
[1mdeleted file mode 100644[m
[1mindex ae7d8c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmem.c[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Interface to Memory Manager[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define lmem_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** About the realloc function:[m
[31m-** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);[m
[31m-** (`osize' is the old size, `nsize' is the new size)[m
[31m-**[m
[31m-** Lua ensures that (ptr == NULL) iff (osize == 0).[m
[31m-**[m
[31m-** * frealloc(ud, NULL, 0, x) creates a new block of size `x'[m
[31m-**[m
[31m-** * frealloc(ud, p, x, 0) frees the block `p'[m
[31m-** (in this specific case, frealloc must return NULL).[m
[31m-** particularly, frealloc(ud, NULL, 0, 0) does nothing[m
[31m-** (which is equivalent to free(NULL) in ANSI C)[m
[31m-**[m
[31m-** frealloc returns NULL if it cannot create or reallocate the area[m
[31m-** (any reallocation to an equal or smaller size cannot fail!)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define MINSIZEARRAY	4[m
[31m-[m
[31m-[m
[31m-void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,[m
[31m-                     int limit, const char *errormsg) {[m
[31m-  void *newblock;[m
[31m-  int newsize;[m
[31m-  if (*size >= limit/2) {  /* cannot double it? */[m
[31m-    if (*size >= limit)  /* cannot grow even a little? */[m
[31m-      luaG_runerror(L, errormsg);[m
[31m-    newsize = limit;  /* still have at least one free place */[m
[31m-  }[m
[31m-  else {[m
[31m-    newsize = (*size)*2;[m
[31m-    if (newsize < MINSIZEARRAY)[m
[31m-      newsize = MINSIZEARRAY;  /* minimum size */[m
[31m-  }[m
[31m-  newblock = luaM_reallocv(L, block, *size, newsize, size_elems);[m
[31m-  *size = newsize;  /* update only when everything else is OK */[m
[31m-  return newblock;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *luaM_toobig (lua_State *L) {[m
[31m-  luaG_runerror(L, "memory allocation error: block too big");[m
[31m-  return NULL;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** generic allocation routine.[m
[31m-*/[m
[31m-void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {[m
[31m-  global_State *g = G(L);[m
[31m-  lua_assert((osize == 0) == (block == NULL));[m
[31m-  block = (*g->frealloc)(g->ud, block, osize, nsize);[m
[31m-  if (block == NULL && nsize > 0)[m
[31m-    luaD_throw(L, LUA_ERRMEM);[m
[31m-  lua_assert((nsize == 0) == (block == NULL));[m
[31m-  g->totalbytes = (g->totalbytes - osize) + nsize;[m
[31m-  return block;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmem.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmem.h[m
[1mdeleted file mode 100644[m
[1mindex 7c2dcb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lmem.h[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Interface to Memory Manager[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lmem_h[m
[31m-#define lmem_h[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#define MEMERRMSG	"not enough memory"[m
[31m-[m
[31m-[m
[31m-#define luaM_reallocv(L,b,on,n,e) \[m
[31m-	((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ?  /* +1 to avoid warnings */ \[m
[31m-		luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \[m
[31m-		luaM_toobig(L))[m
[31m-[m
[31m-#define luaM_freemem(L, b, s)	luaM_realloc_(L, (b), (s), 0)[m
[31m-#define luaM_free(L, b)		luaM_realloc_(L, (b), sizeof(*(b)), 0)[m
[31m-#define luaM_freearray(L, b, n, t)   luaM_reallocv(L, (b), n, 0, sizeof(t))[m
[31m-[m
[31m-#define luaM_malloc(L,t)	luaM_realloc_(L, NULL, 0, (t))[m
[31m-#define luaM_new(L,t)		cast(t *, luaM_malloc(L, sizeof(t)))[m
[31m-#define luaM_newvector(L,n,t) \[m
[31m-		cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))[m
[31m-[m
[31m-#define luaM_growvector(L,v,nelems,size,t,limit,e) \[m
[31m-          if ((nelems)+1 > (size)) \[m
[31m-            ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))[m
[31m-[m
[31m-#define luaM_reallocvector(L, v,oldn,n,t) \[m
[31m-   ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,[m
[31m-                                                          size_t size);[m
[31m-LUAI_FUNC void *luaM_toobig (lua_State *L);[m
[31m-LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,[m
[31m-                               size_t size_elem, int limit,[m
[31m-                               const char *errormsg);[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/loadlib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/loadlib.c[m
[1mdeleted file mode 100644[m
[1mindex 6158c53..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/loadlib.c[m
[1m+++ /dev/null[m
[36m@@ -1,666 +0,0 @@[m
[31m-/*[m
[31m-** $Id: loadlib.c,v 1.52.1.4 2009/09/09 13:17:16 roberto Exp $[m
[31m-** Dynamic library loader for Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-**[m
[31m-** This module contains an implementation of loadlib for Unix systems[m
[31m-** that have dlfcn, an implementation for Darwin (Mac OS X), an[m
[31m-** implementation for Windows, and a stub for other systems.[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#define loadlib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-/* prefix for open functions in C libraries */[m
[31m-#define LUA_POF		"luaopen_"[m
[31m-[m
[31m-/* separator for open functions in C libraries */[m
[31m-#define LUA_OFSEP	"_"[m
[31m-[m
[31m-[m
[31m-#define LIBPREFIX	"LOADLIB: "[m
[31m-[m
[31m-#define POF		LUA_POF[m
[31m-#define LIB_FAIL	"open"[m
[31m-[m
[31m-[m
[31m-/* error codes for ll_loadfunc */[m
[31m-#define ERRLIB		1[m
[31m-#define ERRFUNC		2[m
[31m-[m
[31m-#define setprogdir(L)		((void)0)[m
[31m-[m
[31m-[m
[31m-static void ll_unloadlib (void *lib);[m
[31m-static void *ll_load (lua_State *L, const char *path);[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym);[m
[31m-[m
[31m-[m
[31m-[m
[31m-#if defined(LUA_DL_DLOPEN)[m
[31m-/*[m
[31m-** {========================================================================[m
[31m-** This is an implementation of loadlib based on the dlfcn interface.[m
[31m-** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,[m
[31m-** NetBSD, AIX 4.2, HPUX 11, and  probably most other Unix flavors, at least[m
[31m-** as an emulation layer on top of native functions.[m
[31m-** =========================================================================[m
[31m-*/[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-static void ll_unloadlib (void *lib) {[m
[31m-  dlclose(lib);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *ll_load (lua_State *L, const char *path) {[m
[31m-  void *lib = dlopen(path, RTLD_NOW);[m
[31m-  if (lib == NULL) lua_pushstring(L, dlerror());[m
[31m-  return lib;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {[m
[31m-  lua_CFunction f = (lua_CFunction)dlsym(lib, sym);[m
[31m-  if (f == NULL) lua_pushstring(L, dlerror());[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-#elif defined(LUA_DL_DLL)[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** This is an implementation of loadlib for Windows using native functions.[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-#include <windows.h>[m
[31m-[m
[31m-[m
[31m-#undef setprogdir[m
[31m-[m
[31m-static void setprogdir (lua_State *L) {[m
[31m-  char buff[MAX_PATH + 1];[m
[31m-  char *lb;[m
[31m-  DWORD nsize = sizeof(buff)/sizeof(char);[m
[31m-  DWORD n = GetModuleFileNameA(NULL, buff, nsize);[m
[31m-  if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)[m
[31m-    luaL_error(L, "unable to get ModuleFileName");[m
[31m-  else {[m
[31m-    *lb = '\0';[m
[31m-    luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff);[m
[31m-    lua_remove(L, -2);  /* remove original string */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void pusherror (lua_State *L) {[m
[31m-  int error = GetLastError();[m
[31m-  char buffer[128];[m
[31m-  if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-      NULL, error, 0, buffer, sizeof(buffer), NULL))[m
[31m-    lua_pushstring(L, buffer);[m
[31m-  else[m
[31m-    lua_pushfstring(L, "system error %d\n", error);[m
[31m-}[m
[31m-[m
[31m-static void ll_unloadlib (void *lib) {[m
[31m-  FreeLibrary((HINSTANCE)lib);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *ll_load (lua_State *L, const char *path) {[m
[31m-  HINSTANCE lib = LoadLibraryA(path);[m
[31m-  if (lib == NULL) pusherror(L);[m
[31m-  return lib;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {[m
[31m-  lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym);[m
[31m-  if (f == NULL) pusherror(L);[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-#elif defined(LUA_DL_DYLD)[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Native Mac OS X / Darwin Implementation[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-#include <mach-o/dyld.h>[m
[31m-[m
[31m-[m
[31m-/* Mac appends a `_' before C function names */[m
[31m-#undef POF[m
[31m-#define POF	"_" LUA_POF[m
[31m-[m
[31m-[m
[31m-static void pusherror (lua_State *L) {[m
[31m-  const char *err_str;[m
[31m-  const char *err_file;[m
[31m-  NSLinkEditErrors err;[m
[31m-  int err_num;[m
[31m-  NSLinkEditError(&err, &err_num, &err_file, &err_str);[m
[31m-  lua_pushstring(L, err_str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *errorfromcode (NSObjectFileImageReturnCode ret) {[m
[31m-  switch (ret) {[m
[31m-    case NSObjectFileImageInappropriateFile:[m
[31m-      return "file is not a bundle";[m
[31m-    case NSObjectFileImageArch:[m
[31m-      return "library is for wrong CPU type";[m
[31m-    case NSObjectFileImageFormat:[m
[31m-      return "bad format";[m
[31m-    case NSObjectFileImageAccess:[m
[31m-      return "cannot access file";[m
[31m-    case NSObjectFileImageFailure:[m
[31m-    default:[m
[31m-      return "unable to load library";[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void ll_unloadlib (void *lib) {[m
[31m-  NSUnLinkModule((NSModule)lib, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *ll_load (lua_State *L, const char *path) {[m
[31m-  NSObjectFileImage img;[m
[31m-  NSObjectFileImageReturnCode ret;[m
[31m-  /* this would be a rare case, but prevents crashing if it happens */[m
[31m-  if(!_dyld_present()) {[m
[31m-    lua_pushliteral(L, "dyld not present");[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  ret = NSCreateObjectFileImageFromFile(path, &img);[m
[31m-  if (ret == NSObjectFileImageSuccess) {[m
[31m-    NSModule mod = NSLinkModule(img, path, NSLINKMODULE_OPTION_PRIVATE |[m
[31m-                       NSLINKMODULE_OPTION_RETURN_ON_ERROR);[m
[31m-    NSDestroyObjectFileImage(img);[m
[31m-    if (mod == NULL) pusherror(L);[m
[31m-    return mod;[m
[31m-  }[m
[31m-  lua_pushstring(L, errorfromcode(ret));[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {[m
[31m-  NSSymbol nss = NSLookupSymbolInModule((NSModule)lib, sym);[m
[31m-  if (nss == NULL) {[m
[31m-    lua_pushfstring(L, "symbol " LUA_QS " not found", sym);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  return (lua_CFunction)NSAddressOfSymbol(nss);[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Fallback for other systems[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-#undef LIB_FAIL[m
[31m-#define LIB_FAIL	"absent"[m
[31m-[m
[31m-[m
[31m-#define DLMSG	"dynamic libraries not enabled; check your Lua installation"[m
[31m-[m
[31m-[m
[31m-static void ll_unloadlib (void *lib) {[m
[31m-  (void)lib;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *ll_load (lua_State *L, const char *path) {[m
[31m-  (void)path;  /* to avoid warnings */[m
[31m-  lua_pushliteral(L, DLMSG);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {[m
[31m-  (void)lib; (void)sym;  /* to avoid warnings */[m
[31m-  lua_pushliteral(L, DLMSG);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void **ll_register (lua_State *L, const char *path) {[m
[31m-  void **plib;[m
[31m-  lua_pushfstring(L, "%s%s", LIBPREFIX, path);[m
[31m-  lua_gettable(L, LUA_REGISTRYINDEX);  /* check library in registry? */[m
[31m-  if (!lua_isnil(L, -1))  /* is there an entry? */[m
[31m-    plib = (void **)lua_touserdata(L, -1);[m
[31m-  else {  /* no entry yet; create one */[m
[31m-    lua_pop(L, 1);[m
[31m-    plib = (void **)lua_newuserdata(L, sizeof(const void *));[m
[31m-    *plib = NULL;[m
[31m-    luaL_getmetatable(L, "_LOADLIB");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-    lua_pushfstring(L, "%s%s", LIBPREFIX, path);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_settable(L, LUA_REGISTRYINDEX);[m
[31m-  }[m
[31m-  return plib;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** __gc tag method: calls library's `ll_unloadlib' function with the lib[m
[31m-** handle[m
[31m-*/[m
[31m-static int gctm (lua_State *L) {[m
[31m-  void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB");[m
[31m-  if (*lib) ll_unloadlib(*lib);[m
[31m-  *lib = NULL;  /* mark library as closed */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ll_loadfunc (lua_State *L, const char *path, const char *sym) {[m
[31m-  void **reg = ll_register(L, path);[m
[31m-  if (*reg == NULL) *reg = ll_load(L, path);[m
[31m-  if (*reg == NULL)[m
[31m-    return ERRLIB;  /* unable to load library */[m
[31m-  else {[m
[31m-    lua_CFunction f = ll_sym(L, *reg, sym);[m
[31m-    if (f == NULL)[m
[31m-      return ERRFUNC;  /* unable to find function */[m
[31m-    lua_pushcfunction(L, f);[m
[31m-    return 0;  /* return function */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ll_loadlib (lua_State *L) {[m
[31m-  const char *path = luaL_checkstring(L, 1);[m
[31m-  const char *init = luaL_checkstring(L, 2);[m
[31m-  int stat = ll_loadfunc(L, path, init);[m
[31m-  if (stat == 0)  /* no errors? */[m
[31m-    return 1;  /* return the loaded function */[m
[31m-  else {  /* error; error message is on stack top */[m
[31m-    lua_pushnil(L);[m
[31m-    lua_insert(L, -2);[m
[31m-    lua_pushstring(L, (stat == ERRLIB) ?  LIB_FAIL : "init");[m
[31m-    return 3;  /* return nil, error message, and where */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** 'require' function[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static int readable (const char *filename) {[m
[31m-  FILE *f = fopen(filename, "r");  /* try to open file */[m
[31m-  if (f == NULL) return 0;  /* open failed */[m
[31m-  fclose(f);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *pushnexttemplate (lua_State *L, const char *path) {[m
[31m-  const char *l;[m
[31m-  while (*path == *LUA_PATHSEP) path++;  /* skip separators */[m
[31m-  if (*path == '\0') return NULL;  /* no more templates */[m
[31m-  l = strchr(path, *LUA_PATHSEP);  /* find next separator */[m
[31m-  if (l == NULL) l = path + strlen(path);[m
[31m-  lua_pushlstring(L, path, l - path);  /* template */[m
[31m-  return l;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *findfile (lua_State *L, const char *name,[m
[31m-                                           const char *pname) {[m
[31m-  const char *path;[m
[31m-  name = luaL_gsub(L, name, ".", LUA_DIRSEP);[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, pname);[m
[31m-  path = lua_tostring(L, -1);[m
[31m-  if (path == NULL)[m
[31m-    luaL_error(L, LUA_QL("package.%s") " must be a string", pname);[m
[31m-  lua_pushliteral(L, "");  /* error accumulator */[m
[31m-  while ((path = pushnexttemplate(L, path)) != NULL) {[m
[31m-    const char *filename;[m
[31m-    filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name);[m
[31m-    lua_remove(L, -2);  /* remove path template */[m
[31m-    if (readable(filename))  /* does file exist and is readable? */[m
[31m-      return filename;  /* return that file name */[m
[31m-    lua_pushfstring(L, "\n\tno file " LUA_QS, filename);[m
[31m-    lua_remove(L, -2);  /* remove file name */[m
[31m-    lua_concat(L, 2);  /* add entry to possible error message */[m
[31m-  }[m
[31m-  return NULL;  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void loaderror (lua_State *L, const char *filename) {[m
[31m-  luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s",[m
[31m-                lua_tostring(L, 1), filename, lua_tostring(L, -1));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loader_Lua (lua_State *L) {[m
[31m-  const char *filename;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  filename = findfile(L, name, "path");[m
[31m-  if (filename == NULL) return 1;  /* library not found in this path */[m
[31m-  if (luaL_loadfile(L, filename) != 0)[m
[31m-    loaderror(L, filename);[m
[31m-  return 1;  /* library loaded successfully */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *mkfuncname (lua_State *L, const char *modname) {[m
[31m-  const char *funcname;[m
[31m-  const char *mark = strchr(modname, *LUA_IGMARK);[m
[31m-  if (mark) modname = mark + 1;[m
[31m-  funcname = luaL_gsub(L, modname, ".", LUA_OFSEP);[m
[31m-  funcname = lua_pushfstring(L, POF"%s", funcname);[m
[31m-  lua_remove(L, -2);  /* remove 'gsub' result */[m
[31m-  return funcname;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loader_C (lua_State *L) {[m
[31m-  const char *funcname;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  const char *filename = findfile(L, name, "cpath");[m
[31m-  if (filename == NULL) return 1;  /* library not found in this path */[m
[31m-  funcname = mkfuncname(L, name);[m
[31m-  if (ll_loadfunc(L, filename, funcname) != 0)[m
[31m-    loaderror(L, filename);[m
[31m-  return 1;  /* library loaded successfully */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loader_Croot (lua_State *L) {[m
[31m-  const char *funcname;[m
[31m-  const char *filename;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  const char *p = strchr(name, '.');[m
[31m-  int stat;[m
[31m-  if (p == NULL) return 0;  /* is root */[m
[31m-  lua_pushlstring(L, name, p - name);[m
[31m-  filename = findfile(L, lua_tostring(L, -1), "cpath");[m
[31m-  if (filename == NULL) return 1;  /* root not found */[m
[31m-  funcname = mkfuncname(L, name);[m
[31m-  if ((stat = ll_loadfunc(L, filename, funcname)) != 0) {[m
[31m-    if (stat != ERRFUNC) loaderror(L, filename);  /* real error */[m
[31m-    lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS,[m
[31m-                       name, filename);[m
[31m-    return 1;  /* function not found */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loader_preload (lua_State *L) {[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, "preload");[m
[31m-  if (!lua_istable(L, -1))[m
[31m-    luaL_error(L, LUA_QL("package.preload") " must be a table");[m
[31m-  lua_getfield(L, -1, name);[m
[31m-  if (lua_isnil(L, -1))  /* not found? */[m
[31m-    lua_pushfstring(L, "\n\tno field package.preload['%s']", name);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const int sentinel_ = 0;[m
[31m-#define sentinel	((void *)&sentinel_)[m
[31m-[m
[31m-[m
[31m-static int ll_require (lua_State *L) {[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  int i;[m
[31m-  lua_settop(L, 1);  /* _LOADED table will be at index 2 */[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, 2, name);[m
[31m-  if (lua_toboolean(L, -1)) {  /* is it there? */[m
[31m-    if (lua_touserdata(L, -1) == sentinel)  /* check loops */[m
[31m-      luaL_error(L, "loop or previous error loading module " LUA_QS, name);[m
[31m-    return 1;  /* package is already loaded */[m
[31m-  }[m
[31m-  /* else must load it; iterate over available loaders */[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, "loaders");[m
[31m-  if (!lua_istable(L, -1))[m
[31m-    luaL_error(L, LUA_QL("package.loaders") " must be a table");[m
[31m-  lua_pushliteral(L, "");  /* error message accumulator */[m
[31m-  for (i=1; ; i++) {[m
[31m-    lua_rawgeti(L, -2, i);  /* get a loader */[m
[31m-    if (lua_isnil(L, -1))[m
[31m-      luaL_error(L, "module " LUA_QS " not found:%s",[m
[31m-                    name, lua_tostring(L, -2));[m
[31m-    lua_pushstring(L, name);[m
[31m-    lua_call(L, 1, 1);  /* call it */[m
[31m-    if (lua_isfunction(L, -1))  /* did it find module? */[m
[31m-      break;  /* module loaded successfully */[m
[31m-    else if (lua_isstring(L, -1))  /* loader returned error message? */[m
[31m-      lua_concat(L, 2);  /* accumulate it */[m
[31m-    else[m
[31m-      lua_pop(L, 1);[m
[31m-  }[m
[31m-  lua_pushlightuserdata(L, sentinel);[m
[31m-  lua_setfield(L, 2, name);  /* _LOADED[name] = sentinel */[m
[31m-  lua_pushstring(L, name);  /* pass name as argument to module */[m
[31m-  lua_call(L, 1, 1);  /* run loaded module */[m
[31m-  if (!lua_isnil(L, -1))  /* non-nil return? */[m
[31m-    lua_setfield(L, 2, name);  /* _LOADED[name] = returned value */[m
[31m-  lua_getfield(L, 2, name);[m
[31m-  if (lua_touserdata(L, -1) == sentinel) {   /* module did not set a value? */[m
[31m-    lua_pushboolean(L, 1);  /* use true as result */[m
[31m-    lua_pushvalue(L, -1);  /* extra copy to be returned */[m
[31m-    lua_setfield(L, 2, name);  /* _LOADED[name] = true */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** 'module' function[m
[31m-** =======================================================[m
[31m-*/[m
[31m-  [m
[31m-[m
[31m-static void setfenv (lua_State *L) {[m
[31m-  lua_Debug ar;[m
[31m-  if (lua_getstack(L, 1, &ar) == 0 ||[m
[31m-      lua_getinfo(L, "f", &ar) == 0 ||  /* get calling function */[m
[31m-      lua_iscfunction(L, -1))[m
[31m-    luaL_error(L, LUA_QL("module") " not called from a Lua function");[m
[31m-  lua_pushvalue(L, -2);[m
[31m-  lua_setfenv(L, -2);[m
[31m-  lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void dooptions (lua_State *L, int n) {[m
[31m-  int i;[m
[31m-  for (i = 2; i <= n; i++) {[m
[31m-    lua_pushvalue(L, i);  /* get option (a function) */[m
[31m-    lua_pushvalue(L, -2);  /* module */[m
[31m-    lua_call(L, 1, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void modinit (lua_State *L, const char *modname) {[m
[31m-  const char *dot;[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_setfield(L, -2, "_M");  /* module._M = module */[m
[31m-  lua_pushstring(L, modname);[m
[31m-  lua_setfield(L, -2, "_NAME");[m
[31m-  dot = strrchr(modname, '.');  /* look for last dot in module name */[m
[31m-  if (dot == NULL) dot = modname;[m
[31m-  else dot++;[m
[31m-  /* set _PACKAGE as package name (full module name minus last part) */[m
[31m-  lua_pushlstring(L, modname, dot - modname);[m
[31m-  lua_setfield(L, -2, "_PACKAGE");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ll_module (lua_State *L) {[m
[31m-  const char *modname = luaL_checkstring(L, 1);[m
[31m-  int loaded = lua_gettop(L) + 1;  /* index of _LOADED table */[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, loaded, modname);  /* get _LOADED[modname] */[m
[31m-  if (!lua_istable(L, -1)) {  /* not found? */[m
[31m-    lua_pop(L, 1);  /* remove previous result */[m
[31m-    /* try global variable (and create one if it does not exist) */[m
[31m-    if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL)[m
[31m-      return luaL_error(L, "name conflict for module " LUA_QS, modname);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, loaded, modname);  /* _LOADED[modname] = new table */[m
[31m-  }[m
[31m-  /* check whether table already has a _NAME field */[m
[31m-  lua_getfield(L, -1, "_NAME");[m
[31m-  if (!lua_isnil(L, -1))  /* is table an initialized module? */[m
[31m-    lua_pop(L, 1);[m
[31m-  else {  /* no; initialize it */[m
[31m-    lua_pop(L, 1);[m
[31m-    modinit(L, modname);[m
[31m-  }[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  setfenv(L);[m
[31m-  dooptions(L, loaded - 1);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ll_seeall (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    lua_createtable(L, 0, 1); /* create new metatable */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setmetatable(L, 1);[m
[31m-  }[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  lua_setfield(L, -2, "__index");  /* mt.__index = _G */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* auxiliary mark (for internal use) */[m
[31m-#define AUXMARK		"\1"[m
[31m-[m
[31m-static void setpath (lua_State *L, const char *fieldname, const char *envname,[m
[31m-                                   const char *def) {[m
[31m-  const char *path = getenv(envname);[m
[31m-  if (path == NULL)  /* no environment variable? */[m
[31m-    lua_pushstring(L, def);  /* use default */[m
[31m-  else {[m
[31m-    /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */[m
[31m-    path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP,[m
[31m-                              LUA_PATHSEP AUXMARK LUA_PATHSEP);[m
[31m-    luaL_gsub(L, path, AUXMARK, def);[m
[31m-    lua_remove(L, -2);[m
[31m-  }[m
[31m-  setprogdir(L);[m
[31m-  lua_setfield(L, -2, fieldname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg pk_funcs[] = {[m
[31m-  {"loadlib", ll_loadlib},[m
[31m-  {"seeall", ll_seeall},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg ll_funcs[] = {[m
[31m-  {"module", ll_module},[m
[31m-  {"require", ll_require},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static const lua_CFunction loaders[] =[m
[31m-  {loader_preload, loader_Lua, loader_C, loader_Croot, NULL};[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_package (lua_State *L) {[m
[31m-  int i;[m
[31m-  /* create new type _LOADLIB */[m
[31m-  luaL_newmetatable(L, "_LOADLIB");[m
[31m-  lua_pushcfunction(L, gctm);[m
[31m-  lua_setfield(L, -2, "__gc");[m
[31m-  /* create `package' table */[m
[31m-  luaL_register(L, LUA_LOADLIBNAME, pk_funcs);[m
[31m-#if defined(LUA_COMPAT_LOADLIB) [m
[31m-  lua_getfield(L, -1, "loadlib");[m
[31m-  lua_setfield(L, LUA_GLOBALSINDEX, "loadlib");[m
[31m-#endif[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_replace(L, LUA_ENVIRONINDEX);[m
[31m-  /* create `loaders' table */[m
[31m-  lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0);[m
[31m-  /* fill it with pre-defined loaders */[m
[31m-  for (i=0; loaders[i] != NULL; i++) {[m
[31m-    lua_pushcfunction(L, loaders[i]);[m
[31m-    lua_rawseti(L, -2, i+1);[m
[31m-  }[m
[31m-  lua_setfield(L, -2, "loaders");  /* put it in field `loaders' */[m
[31m-  setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT);  /* set field `path' */[m
[31m-  setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */[m
[31m-  /* store config information */[m
[31m-  lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n"[m
[31m-                     LUA_EXECDIR "\n" LUA_IGMARK);[m
[31m-  lua_setfield(L, -2, "config");[m
[31m-  /* set field `loaded' */[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2);[m
[31m-  lua_setfield(L, -2, "loaded");[m
[31m-  /* set field `preload' */[m
[31m-  lua_newtable(L);[m
[31m-  lua_setfield(L, -2, "preload");[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  luaL_register(L, NULL, ll_funcs);  /* open lib into global table */[m
[31m-  lua_pop(L, 1);[m
[31m-  return 1;  /* return 'package' table */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lobject.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lobject.c[m
[1mdeleted file mode 100644[m
[1mindex 4ff5073..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lobject.c[m
[1m+++ /dev/null[m
[36m@@ -1,214 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Some generic functions over Lua objects[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lobject_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldo.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "lvm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** converts an integer to a "floating point byte", represented as[m
[31m-** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if[m
[31m-** eeeee != 0 and (xxx) otherwise.[m
[31m-*/[m
[31m-int luaO_int2fb (unsigned int x) {[m
[31m-  int e = 0;  /* expoent */[m
[31m-  while (x >= 16) {[m
[31m-    x = (x+1) >> 1;[m
[31m-    e++;[m
[31m-  }[m
[31m-  if (x < 8) return x;[m
[31m-  else return ((e+1) << 3) | (cast_int(x) - 8);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* converts back */[m
[31m-int luaO_fb2int (int x) {[m
[31m-  int e = (x >> 3) & 31;[m
[31m-  if (e == 0) return x;[m
[31m-  else return ((x & 7)+8) << (e - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaO_log2 (unsigned int x) {[m
[31m-  static const lu_byte log_2[256] = {[m
[31m-    0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,[m
[31m-    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,[m
[31m-    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,[m
[31m-    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,[m
[31m-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8[m
[31m-  };[m
[31m-  int l = -1;[m
[31m-  while (x >= 256) { l += 8; x >>= 8; }[m
[31m-  return l + log_2[x];[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaO_rawequalObj (const TValue *t1, const TValue *t2) {[m
[31m-  if (ttype(t1) != ttype(t2)) return 0;[m
[31m-  else switch (ttype(t1)) {[m
[31m-    case LUA_TNIL:[m
[31m-      return 1;[m
[31m-    case LUA_TNUMBER:[m
[31m-      return luai_numeq(nvalue(t1), nvalue(t2));[m
[31m-    case LUA_TBOOLEAN:[m
[31m-      return bvalue(t1) == bvalue(t2);  /* boolean true must be 1 !! */[m
[31m-    case LUA_TLIGHTUSERDATA:[m
[31m-      return pvalue(t1) == pvalue(t2);[m
[31m-    default:[m
[31m-      lua_assert(iscollectable(t1));[m
[31m-      return gcvalue(t1) == gcvalue(t2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaO_str2d (const char *s, lua_Number *result) {[m
[31m-  char *endptr;[m
[31m-  *result = lua_str2number(s, &endptr);[m
[31m-  if (endptr == s) return 0;  /* conversion failed */[m
[31m-  if (*endptr == 'x' || *endptr == 'X')  /* maybe an hexadecimal constant? */[m
[31m-    *result = cast_num(strtoul(s, &endptr, 16));[m
[31m-  if (*endptr == '\0') return 1;  /* most common case */[m
[31m-  while (isspace(cast(unsigned char, *endptr))) endptr++;[m
[31m-  if (*endptr != '\0') return 0;  /* invalid trailing characters? */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void pushstr (lua_State *L, const char *str) {[m
[31m-  setsvalue2s(L, L->top, luaS_new(L, str));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this function handles only `%d', `%c', %f, %p, and `%s' formats */[m
[31m-const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {[m
[31m-  int n = 1;[m
[31m-  pushstr(L, "");[m
[31m-  for (;;) {[m
[31m-    const char *e = strchr(fmt, '%');[m
[31m-    if (e == NULL) break;[m
[31m-    setsvalue2s(L, L->top, luaS_newlstr(L, fmt, e-fmt));[m
[31m-    incr_top(L);[m
[31m-    switch (*(e+1)) {[m
[31m-      case 's': {[m
[31m-        const char *s = va_arg(argp, char *);[m
[31m-        if (s == NULL) s = "(null)";[m
[31m-        pushstr(L, s);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'c': {[m
[31m-        char buff[2];[m
[31m-        buff[0] = cast(char, va_arg(argp, int));[m
[31m-        buff[1] = '\0';[m
[31m-        pushstr(L, buff);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'd': {[m
[31m-        setnvalue(L->top, cast_num(va_arg(argp, int)));[m
[31m-        incr_top(L);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'f': {[m
[31m-        setnvalue(L->top, cast_num(va_arg(argp, l_uacNumber)));[m
[31m-        incr_top(L);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'p': {[m
[31m-        char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */[m
[31m-        sprintf(buff, "%p", va_arg(argp, void *));[m
[31m-        pushstr(L, buff);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '%': {[m
[31m-        pushstr(L, "%");[m
[31m-        break;[m
[31m-      }[m
[31m-      default: {[m
[31m-        char buff[3];[m
[31m-        buff[0] = '%';[m
[31m-        buff[1] = *(e+1);[m
[31m-        buff[2] = '\0';[m
[31m-        pushstr(L, buff);[m
[31m-        break;[m
[31m-      }[m
[31m-    }[m
[31m-    n += 2;[m
[31m-    fmt = e+2;[m
[31m-  }[m
[31m-  pushstr(L, fmt);[m
[31m-  luaV_concat(L, n+1, cast_int(L->top - L->base) - 1);[m
[31m-  L->top -= n;[m
[31m-  return svalue(L->top - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  msg = luaO_pushvfstring(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  return msg;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaO_chunkid (char *out, const char *source, size_t bufflen) {[m
[31m-  if (*source == '=') {[m
[31m-    strncpy(out, source+1, bufflen);  /* remove first char */[m
[31m-    out[bufflen-1] = '\0';  /* ensures null termination */[m
[31m-  }[m
[31m-  else {  /* out = "source", or "...source" */[m
[31m-    if (*source == '@') {[m
[31m-      size_t l;[m
[31m-      source++;  /* skip the `@' */[m
[31m-      bufflen -= sizeof(" '...' ");[m
[31m-      l = strlen(source);[m
[31m-      strcpy(out, "");[m
[31m-      if (l > bufflen) {[m
[31m-        source += (l-bufflen);  /* get last part of file name */[m
[31m-        strcat(out, "...");[m
[31m-      }[m
[31m-      strcat(out, source);[m
[31m-    }[m
[31m-    else {  /* out = [string "string"] */[m
[31m-      size_t len = strcspn(source, "\n\r");  /* stop at first newline */[m
[31m-      bufflen -= sizeof(" [string \"...\"] ");[m
[31m-      if (len > bufflen) len = bufflen;[m
[31m-      strcpy(out, "[string \"");[m
[31m-      if (source[len] != '\0') {  /* must truncate? */[m
[31m-        strncat(out, source, len);[m
[31m-        strcat(out, "...");[m
[31m-      }[m
[31m-      else[m
[31m-        strcat(out, source);[m
[31m-      strcat(out, "\"]");[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lobject.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lobject.h[m
[1mdeleted file mode 100644[m
[1mindex f1e447e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lobject.h[m
[1m+++ /dev/null[m
[36m@@ -1,381 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $[m
[31m-** Type definitions for Lua objects[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lobject_h[m
[31m-#define lobject_h[m
[31m-[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-/* tags for values visible from Lua */[m
[31m-#define LAST_TAG	LUA_TTHREAD[m
[31m-[m
[31m-#define NUM_TAGS	(LAST_TAG+1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Extra tags for non-values[m
[31m-*/[m
[31m-#define LUA_TPROTO	(LAST_TAG+1)[m
[31m-#define LUA_TUPVAL	(LAST_TAG+2)[m
[31m-#define LUA_TDEADKEY	(LAST_TAG+3)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Union of all collectable objects[m
[31m-*/[m
[31m-typedef union GCObject GCObject;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Common Header for all collectable objects (in macro form, to be[m
[31m-** included in other objects)[m
[31m-*/[m
[31m-#define CommonHeader	GCObject *next; lu_byte tt; lu_byte marked[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Common header in struct form[m
[31m-*/[m
[31m-typedef struct GCheader {[m
[31m-  CommonHeader;[m
[31m-} GCheader;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Union of all Lua values[m
[31m-*/[m
[31m-typedef union {[m
[31m-  GCObject *gc;[m
[31m-  void *p;[m
[31m-  lua_Number n;[m
[31m-  int b;[m
[31m-} Value;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Tagged Values[m
[31m-*/[m
[31m-[m
[31m-#define TValuefields	Value value; int tt[m
[31m-[m
[31m-typedef struct lua_TValue {[m
[31m-  TValuefields;[m
[31m-} TValue;[m
[31m-[m
[31m-[m
[31m-/* Macros to test type */[m
[31m-#define ttisnil(o)	(ttype(o) == LUA_TNIL)[m
[31m-#define ttisnumber(o)	(ttype(o) == LUA_TNUMBER)[m
[31m-#define ttisstring(o)	(ttype(o) == LUA_TSTRING)[m
[31m-#define ttistable(o)	(ttype(o) == LUA_TTABLE)[m
[31m-#define ttisfunction(o)	(ttype(o) == LUA_TFUNCTION)[m
[31m-#define ttisboolean(o)	(ttype(o) == LUA_TBOOLEAN)[m
[31m-#define ttisuserdata(o)	(ttype(o) == LUA_TUSERDATA)[m
[31m-#define ttisthread(o)	(ttype(o) == LUA_TTHREAD)[m
[31m-#define ttislightuserdata(o)	(ttype(o) == LUA_TLIGHTUSERDATA)[m
[31m-[m
[31m-/* Macros to access values */[m
[31m-#define ttype(o)	((o)->tt)[m
[31m-#define gcvalue(o)	check_exp(iscollectable(o), (o)->value.gc)[m
[31m-#define pvalue(o)	check_exp(ttislightuserdata(o), (o)->value.p)[m
[31m-#define nvalue(o)	check_exp(ttisnumber(o), (o)->value.n)[m
[31m-#define rawtsvalue(o)	check_exp(ttisstring(o), &(o)->value.gc->ts)[m
[31m-#define tsvalue(o)	(&rawtsvalue(o)->tsv)[m
[31m-#define rawuvalue(o)	check_exp(ttisuserdata(o), &(o)->value.gc->u)[m
[31m-#define uvalue(o)	(&rawuvalue(o)->uv)[m
[31m-#define clvalue(o)	check_exp(ttisfunction(o), &(o)->value.gc->cl)[m
[31m-#define hvalue(o)	check_exp(ttistable(o), &(o)->value.gc->h)[m
[31m-#define bvalue(o)	check_exp(ttisboolean(o), (o)->value.b)[m
[31m-#define thvalue(o)	check_exp(ttisthread(o), &(o)->value.gc->th)[m
[31m-[m
[31m-#define l_isfalse(o)	(ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))[m
[31m-[m
[31m-/*[m
[31m-** for internal debug only[m
[31m-*/[m
[31m-#define checkconsistency(obj) \[m
[31m-  lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt))[m
[31m-[m
[31m-#define checkliveness(g,obj) \[m
[31m-  lua_assert(!iscollectable(obj) || \[m
[31m-  ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc)))[m
[31m-[m
[31m-[m
[31m-/* Macros to set values */[m
[31m-#define setnilvalue(obj) ((obj)->tt=LUA_TNIL)[m
[31m-[m
[31m-#define setnvalue(obj,x) \[m
[31m-  { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; }[m
[31m-[m
[31m-#define setpvalue(obj,x) \[m
[31m-  { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; }[m
[31m-[m
[31m-#define setbvalue(obj,x) \[m
[31m-  { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; }[m
[31m-[m
[31m-#define setsvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define setuvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define setthvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define setclvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define sethvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define setptvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define setobj(L,obj1,obj2) \[m
[31m-  { const TValue *o2=(obj2); TValue *o1=(obj1); \[m
[31m-    o1->value = o2->value; o1->tt=o2->tt; \[m
[31m-    checkliveness(G(L),o1); }[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** different types of sets, according to destination[m
[31m-*/[m
[31m-[m
[31m-/* from stack to (same) stack */[m
[31m-#define setobjs2s	setobj[m
[31m-/* to stack (not from same stack) */[m
[31m-#define setobj2s	setobj[m
[31m-#define setsvalue2s	setsvalue[m
[31m-#define sethvalue2s	sethvalue[m
[31m-#define setptvalue2s	setptvalue[m
[31m-/* from table to same table */[m
[31m-#define setobjt2t	setobj[m
[31m-/* to table */[m
[31m-#define setobj2t	setobj[m
[31m-/* to new object */[m
[31m-#define setobj2n	setobj[m
[31m-#define setsvalue2n	setsvalue[m
[31m-[m
[31m-#define setttype(obj, tt) (ttype(obj) = (tt))[m
[31m-[m
[31m-[m
[31m-#define iscollectable(o)	(ttype(o) >= LUA_TSTRING)[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef TValue *StkId;  /* index to stack elements */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** String headers for string table[m
[31m-*/[m
[31m-typedef union TString {[m
[31m-  L_Umaxalign dummy;  /* ensures maximum alignment for strings */[m
[31m-  struct {[m
[31m-    CommonHeader;[m
[31m-    lu_byte reserved;[m
[31m-    unsigned int hash;[m
[31m-    size_t len;[m
[31m-  } tsv;[m
[31m-} TString;[m
[31m-[m
[31m-[m
[31m-#define getstr(ts)	cast(const char *, (ts) + 1)[m
[31m-#define svalue(o)       getstr(rawtsvalue(o))[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef union Udata {[m
[31m-  L_Umaxalign dummy;  /* ensures maximum alignment for `local' udata */[m
[31m-  struct {[m
[31m-    CommonHeader;[m
[31m-    struct Table *metatable;[m
[31m-    struct Table *env;[m
[31m-    size_t len;[m
[31m-  } uv;[m
[31m-} Udata;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Function Prototypes[m
[31m-*/[m
[31m-typedef struct Proto {[m
[31m-  CommonHeader;[m
[31m-  TValue *k;  /* constants used by the function */[m
[31m-  Instruction *code;[m
[31m-  struct Proto **p;  /* functions defined inside the function */[m
[31m-  int *lineinfo;  /* map from opcodes to source lines */[m
[31m-  struct LocVar *locvars;  /* information about local variables */[m
[31m-  TString **upvalues;  /* upvalue names */[m
[31m-  TString  *source;[m
[31m-  int sizeupvalues;[m
[31m-  int sizek;  /* size of `k' */[m
[31m-  int sizecode;[m
[31m-  int sizelineinfo;[m
[31m-  int sizep;  /* size of `p' */[m
[31m-  int sizelocvars;[m
[31m-  int linedefined;[m
[31m-  int lastlinedefined;[m
[31m-  GCObject *gclist;[m
[31m-  lu_byte nups;  /* number of upvalues */[m
[31m-  lu_byte numparams;[m
[31m-  lu_byte is_vararg;[m
[31m-  lu_byte maxstacksize;[m
[31m-} Proto;[m
[31m-[m
[31m-[m
[31m-/* masks for new-style vararg */[m
[31m-#define VARARG_HASARG		1[m
[31m-#define VARARG_ISVARARG		2[m
[31m-#define VARARG_NEEDSARG		4[m
[31m-[m
[31m-[m
[31m-typedef struct LocVar {[m
[31m-  TString *varname;[m
[31m-  int startpc;  /* first point where variable is active */[m
[31m-  int endpc;    /* first point where variable is dead */[m
[31m-} LocVar;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Upvalues[m
[31m-*/[m
[31m-[m
[31m-typedef struct UpVal {[m
[31m-  CommonHeader;[m
[31m-  TValue *v;  /* points to stack or to its own value */[m
[31m-  union {[m
[31m-    TValue value;  /* the value (when closed) */[m
[31m-    struct {  /* double linked list (when open) */[m
[31m-      struct UpVal *prev;[m
[31m-      struct UpVal *next;[m
[31m-    } l;[m
[31m-  } u;[m
[31m-} UpVal;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Closures[m
[31m-*/[m
[31m-[m
[31m-#define ClosureHeader \[m
[31m-	CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \[m
[31m-	struct Table *env[m
[31m-[m
[31m-typedef struct CClosure {[m
[31m-  ClosureHeader;[m
[31m-  lua_CFunction f;[m
[31m-  TValue upvalue[1];[m
[31m-} CClosure;[m
[31m-[m
[31m-[m
[31m-typedef struct LClosure {[m
[31m-  ClosureHeader;[m
[31m-  struct Proto *p;[m
[31m-  UpVal *upvals[1];[m
[31m-} LClosure;[m
[31m-[m
[31m-[m
[31m-typedef union Closure {[m
[31m-  CClosure c;[m
[31m-  LClosure l;[m
[31m-} Closure;[m
[31m-[m
[31m-[m
[31m-#define iscfunction(o)	(ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC)[m
[31m-#define isLfunction(o)	(ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Tables[m
[31m-*/[m
[31m-[m
[31m-typedef union TKey {[m
[31m-  struct {[m
[31m-    TValuefields;[m
[31m-    struct Node *next;  /* for chaining */[m
[31m-  } nk;[m
[31m-  TValue tvk;[m
[31m-} TKey;[m
[31m-[m
[31m-[m
[31m-typedef struct Node {[m
[31m-  TValue i_val;[m
[31m-  TKey i_key;[m
[31m-} Node;[m
[31m-[m
[31m-[m
[31m-typedef struct Table {[m
[31m-  CommonHeader;[m
[31m-  lu_byte flags;  /* 1<<p means tagmethod(p) is not present */ [m
[31m-  lu_byte lsizenode;  /* log2 of size of `node' array */[m
[31m-  struct Table *metatable;[m
[31m-  TValue *array;  /* array part */[m
[31m-  Node *node;[m
[31m-  Node *lastfree;  /* any free position is before this position */[m
[31m-  GCObject *gclist;[m
[31m-  int sizearray;  /* size of `array' array */[m
[31m-} Table;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `module' operation for hashing (size is always a power of 2)[m
[31m-*/[m
[31m-#define lmod(s,size) \[m
[31m-	(check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1)))))[m
[31m-[m
[31m-[m
[31m-#define twoto(x)	(1<<(x))[m
[31m-#define sizenode(t)	(twoto((t)->lsizenode))[m
[31m-[m
[31m-[m
[31m-#define luaO_nilobject		(&luaO_nilobject_)[m
[31m-[m
[31m-LUAI_DATA const TValue luaO_nilobject_;[m
[31m-[m
[31m-#define ceillog2(x)	(luaO_log2((x)-1) + 1)[m
[31m-[m
[31m-LUAI_FUNC int luaO_log2 (unsigned int x);[m
[31m-LUAI_FUNC int luaO_int2fb (unsigned int x);[m
[31m-LUAI_FUNC int luaO_fb2int (int x);[m
[31m-LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2);[m
[31m-LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result);[m
[31m-LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,[m
[31m-                                                       va_list argp);[m
[31m-LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);[m
[31m-LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len);[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lopcodes.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lopcodes.c[m
[1mdeleted file mode 100644[m
[1mindex 4cc7452..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lopcodes.c[m
[1m+++ /dev/null[m
[36m@@ -1,102 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lopcodes.c,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define lopcodes_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-[m
[31m-#include "lopcodes.h"[m
[31m-[m
[31m-[m
[31m-/* ORDER OP */[m
[31m-[m
[31m-const char *const luaP_opnames[NUM_OPCODES+1] = {[m
[31m-  "MOVE",[m
[31m-  "LOADK",[m
[31m-  "LOADBOOL",[m
[31m-  "LOADNIL",[m
[31m-  "GETUPVAL",[m
[31m-  "GETGLOBAL",[m
[31m-  "GETTABLE",[m
[31m-  "SETGLOBAL",[m
[31m-  "SETUPVAL",[m
[31m-  "SETTABLE",[m
[31m-  "NEWTABLE",[m
[31m-  "SELF",[m
[31m-  "ADD",[m
[31m-  "SUB",[m
[31m-  "MUL",[m
[31m-  "DIV",[m
[31m-  "MOD",[m
[31m-  "POW",[m
[31m-  "UNM",[m
[31m-  "NOT",[m
[31m-  "LEN",[m
[31m-  "CONCAT",[m
[31m-  "JMP",[m
[31m-  "EQ",[m
[31m-  "LT",[m
[31m-  "LE",[m
[31m-  "TEST",[m
[31m-  "TESTSET",[m
[31m-  "CALL",[m
[31m-  "TAILCALL",[m
[31m-  "RETURN",[m
[31m-  "FORLOOP",[m
[31m-  "FORPREP",[m
[31m-  "TFORLOOP",[m
[31m-  "SETLIST",[m
[31m-  "CLOSE",[m
[31m-  "CLOSURE",[m
[31m-  "VARARG",[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))[m
[31m-[m
[31m-const lu_byte luaP_opmodes[NUM_OPCODES] = {[m
[31m-/*       T  A    B       C     mode		   opcode	*/[m
[31m-  opmode(0, 1, OpArgR, OpArgN, iABC) 		/* OP_MOVE */[m
[31m- ,opmode(0, 1, OpArgK, OpArgN, iABx)		/* OP_LOADK */[m
[31m- ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_LOADBOOL */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_LOADNIL */[m
[31m- ,opmode(0, 1, OpArgU, OpArgN, iABC)		/* OP_GETUPVAL */[m
[31m- ,opmode(0, 1, OpArgK, OpArgN, iABx)		/* OP_GETGLOBAL */[m
[31m- ,opmode(0, 1, OpArgR, OpArgK, iABC)		/* OP_GETTABLE */[m
[31m- ,opmode(0, 0, OpArgK, OpArgN, iABx)		/* OP_SETGLOBAL */[m
[31m- ,opmode(0, 0, OpArgU, OpArgN, iABC)		/* OP_SETUPVAL */[m
[31m- ,opmode(0, 0, OpArgK, OpArgK, iABC)		/* OP_SETTABLE */[m
[31m- ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_NEWTABLE */[m
[31m- ,opmode(0, 1, OpArgR, OpArgK, iABC)		/* OP_SELF */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_ADD */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_SUB */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_MUL */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_DIV */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_MOD */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_POW */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_UNM */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_NOT */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_LEN */[m
[31m- ,opmode(0, 1, OpArgR, OpArgR, iABC)		/* OP_CONCAT */[m
[31m- ,opmode(0, 0, OpArgR, OpArgN, iAsBx)		/* OP_JMP */[m
[31m- ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_EQ */[m
[31m- ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_LT */[m
[31m- ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_LE */[m
[31m- ,opmode(1, 1, OpArgR, OpArgU, iABC)		/* OP_TEST */[m
[31m- ,opmode(1, 1, OpArgR, OpArgU, iABC)		/* OP_TESTSET */[m
[31m- ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_CALL */[m
[31m- ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_TAILCALL */[m
[31m- ,opmode(0, 0, OpArgU, OpArgN, iABC)		/* OP_RETURN */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iAsBx)		/* OP_FORLOOP */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iAsBx)		/* OP_FORPREP */[m
[31m- ,opmode(1, 0, OpArgN, OpArgU, iABC)		/* OP_TFORLOOP */[m
[31m- ,opmode(0, 0, OpArgU, OpArgU, iABC)		/* OP_SETLIST */[m
[31m- ,opmode(0, 0, OpArgN, OpArgN, iABC)		/* OP_CLOSE */[m
[31m- ,opmode(0, 1, OpArgU, OpArgN, iABx)		/* OP_CLOSURE */[m
[31m- ,opmode(0, 1, OpArgU, OpArgN, iABC)		/* OP_VARARG */[m
[31m-};[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lopcodes.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lopcodes.h[m
[1mdeleted file mode 100644[m
[1mindex 41224d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lopcodes.h[m
[1m+++ /dev/null[m
[36m@@ -1,268 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lopcodes.h,v 1.125.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Opcodes for Lua virtual machine[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lopcodes_h[m
[31m-#define lopcodes_h[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-[m
[31m-[m
[31m-/*===========================================================================[m
[31m-  We assume that instructions are unsigned numbers.[m
[31m-  All instructions have an opcode in the first 6 bits.[m
[31m-  Instructions can have the following fields:[m
[31m-	`A' : 8 bits[m
[31m-	`B' : 9 bits[m
[31m-	`C' : 9 bits[m
[31m-	`Bx' : 18 bits (`B' and `C' together)[m
[31m-	`sBx' : signed Bx[m
[31m-[m
[31m-  A signed argument is represented in excess K; that is, the number[m
[31m-  value is the unsigned value minus K. K is exactly the maximum value[m
[31m-  for that argument (so that -max is represented by 0, and +max is[m
[31m-  represented by 2*max), which is half the maximum for the corresponding[m
[31m-  unsigned argument.[m
[31m-===========================================================================*/[m
[31m-[m
[31m-[m
[31m-enum OpMode {iABC, iABx, iAsBx};  /* basic instruction format */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** size and position of opcode arguments.[m
[31m-*/[m
[31m-#define SIZE_C		9[m
[31m-#define SIZE_B		9[m
[31m-#define SIZE_Bx		(SIZE_C + SIZE_B)[m
[31m-#define SIZE_A		8[m
[31m-[m
[31m-#define SIZE_OP		6[m
[31m-[m
[31m-#define POS_OP		0[m
[31m-#define POS_A		(POS_OP + SIZE_OP)[m
[31m-#define POS_C		(POS_A + SIZE_A)[m
[31m-#define POS_B		(POS_C + SIZE_C)[m
[31m-#define POS_Bx		POS_C[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** limits for opcode arguments.[m
[31m-** we use (signed) int to manipulate most arguments,[m
[31m-** so they must fit in LUAI_BITSINT-1 bits (-1 for sign)[m
[31m-*/[m
[31m-#if SIZE_Bx < LUAI_BITSINT-1[m
[31m-#define MAXARG_Bx        ((1<<SIZE_Bx)-1)[m
[31m-#define MAXARG_sBx        (MAXARG_Bx>>1)         /* `sBx' is signed */[m
[31m-#else[m
[31m-#define MAXARG_Bx        MAX_INT[m
[31m-#define MAXARG_sBx        MAX_INT[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define MAXARG_A        ((1<<SIZE_A)-1)[m
[31m-#define MAXARG_B        ((1<<SIZE_B)-1)[m
[31m-#define MAXARG_C        ((1<<SIZE_C)-1)[m
[31m-[m
[31m-[m
[31m-/* creates a mask with `n' 1 bits at position `p' */[m
[31m-#define MASK1(n,p)	((~((~(Instruction)0)<<n))<<p)[m
[31m-[m
[31m-/* creates a mask with `n' 0 bits at position `p' */[m
[31m-#define MASK0(n,p)	(~MASK1(n,p))[m
[31m-[m
[31m-/*[m
[31m-** the following macros help to manipulate instructions[m
[31m-*/[m
[31m-[m
[31m-#define GET_OPCODE(i)	(cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0)))[m
[31m-#define SET_OPCODE(i,o)	((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \[m
[31m-		((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP))))[m
[31m-[m
[31m-#define GETARG_A(i)	(cast(int, ((i)>>POS_A) & MASK1(SIZE_A,0)))[m
[31m-#define SETARG_A(i,u)	((i) = (((i)&MASK0(SIZE_A,POS_A)) | \[m
[31m-		((cast(Instruction, u)<<POS_A)&MASK1(SIZE_A,POS_A))))[m
[31m-[m
[31m-#define GETARG_B(i)	(cast(int, ((i)>>POS_B) & MASK1(SIZE_B,0)))[m
[31m-#define SETARG_B(i,b)	((i) = (((i)&MASK0(SIZE_B,POS_B)) | \[m
[31m-		((cast(Instruction, b)<<POS_B)&MASK1(SIZE_B,POS_B))))[m
[31m-[m
[31m-#define GETARG_C(i)	(cast(int, ((i)>>POS_C) & MASK1(SIZE_C,0)))[m
[31m-#define SETARG_C(i,b)	((i) = (((i)&MASK0(SIZE_C,POS_C)) | \[m
[31m-		((cast(Instruction, b)<<POS_C)&MASK1(SIZE_C,POS_C))))[m
[31m-[m
[31m-#define GETARG_Bx(i)	(cast(int, ((i)>>POS_Bx) & MASK1(SIZE_Bx,0)))[m
[31m-#define SETARG_Bx(i,b)	((i) = (((i)&MASK0(SIZE_Bx,POS_Bx)) | \[m
[31m-		((cast(Instruction, b)<<POS_Bx)&MASK1(SIZE_Bx,POS_Bx))))[m
[31m-[m
[31m-#define GETARG_sBx(i)	(GETARG_Bx(i)-MAXARG_sBx)[m
[31m-#define SETARG_sBx(i,b)	SETARG_Bx((i),cast(unsigned int, (b)+MAXARG_sBx))[m
[31m-[m
[31m-[m
[31m-#define CREATE_ABC(o,a,b,c)	((cast(Instruction, o)<<POS_OP) \[m
[31m-			| (cast(Instruction, a)<<POS_A) \[m
[31m-			| (cast(Instruction, b)<<POS_B) \[m
[31m-			| (cast(Instruction, c)<<POS_C))[m
[31m-[m
[31m-#define CREATE_ABx(o,a,bc)	((cast(Instruction, o)<<POS_OP) \[m
[31m-			| (cast(Instruction, a)<<POS_A) \[m
[31m-			| (cast(Instruction, bc)<<POS_Bx))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Macros to operate RK indices[m
[31m-*/[m
[31m-[m
[31m-/* this bit 1 means constant (0 means register) */[m
[31m-#define BITRK		(1 << (SIZE_B - 1))[m
[31m-[m
[31m-/* test whether value is a constant */[m
[31m-#define ISK(x)		((x) & BITRK)[m
[31m-[m
[31m-/* gets the index of the constant */[m
[31m-#define INDEXK(r)	((int)(r) & ~BITRK)[m
[31m-[m
[31m-#define MAXINDEXRK	(BITRK - 1)[m
[31m-[m
[31m-/* code a constant index as a RK value */[m
[31m-#define RKASK(x)	((x) | BITRK)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** invalid register that fits in 8 bits[m
[31m-*/[m
[31m-#define NO_REG		MAXARG_A[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** R(x) - register[m
[31m-** Kst(x) - constant (in constant table)[m
[31m-** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** grep "ORDER OP" if you change these enums[m
[31m-*/[m
[31m-[m
[31m-typedef enum {[m
[31m-/*----------------------------------------------------------------------[m
[31m-name		args	description[m
[31m-------------------------------------------------------------------------*/[m
[31m-OP_MOVE,/*	A B	R(A) := R(B)					*/[m
[31m-OP_LOADK,/*	A Bx	R(A) := Kst(Bx)					*/[m
[31m-OP_LOADBOOL,/*	A B C	R(A) := (Bool)B; if (C) pc++			*/[m
[31m-OP_LOADNIL,/*	A B	R(A) := ... := R(B) := nil			*/[m
[31m-OP_GETUPVAL,/*	A B	R(A) := UpValue[B]				*/[m
[31m-[m
[31m-OP_GETGLOBAL,/*	A Bx	R(A) := Gbl[Kst(Bx)]				*/[m
[31m-OP_GETTABLE,/*	A B C	R(A) := R(B)[RK(C)]				*/[m
[31m-[m
[31m-OP_SETGLOBAL,/*	A Bx	Gbl[Kst(Bx)] := R(A)				*/[m
[31m-OP_SETUPVAL,/*	A B	UpValue[B] := R(A)				*/[m
[31m-OP_SETTABLE,/*	A B C	R(A)[RK(B)] := RK(C)				*/[m
[31m-[m
[31m-OP_NEWTABLE,/*	A B C	R(A) := {} (size = B,C)				*/[m
[31m-[m
[31m-OP_SELF,/*	A B C	R(A+1) := R(B); R(A) := R(B)[RK(C)]		*/[m
[31m-[m
[31m-OP_ADD,/*	A B C	R(A) := RK(B) + RK(C)				*/[m
[31m-OP_SUB,/*	A B C	R(A) := RK(B) - RK(C)				*/[m
[31m-OP_MUL,/*	A B C	R(A) := RK(B) * RK(C)				*/[m
[31m-OP_DIV,/*	A B C	R(A) := RK(B) / RK(C)				*/[m
[31m-OP_MOD,/*	A B C	R(A) := RK(B) % RK(C)				*/[m
[31m-OP_POW,/*	A B C	R(A) := RK(B) ^ RK(C)				*/[m
[31m-OP_UNM,/*	A B	R(A) := -R(B)					*/[m
[31m-OP_NOT,/*	A B	R(A) := not R(B)				*/[m
[31m-OP_LEN,/*	A B	R(A) := length of R(B)				*/[m
[31m-[m
[31m-OP_CONCAT,/*	A B C	R(A) := R(B).. ... ..R(C)			*/[m
[31m-[m
[31m-OP_JMP,/*	sBx	pc+=sBx					*/[m
[31m-[m
[31m-OP_EQ,/*	A B C	if ((RK(B) == RK(C)) ~= A) then pc++		*/[m
[31m-OP_LT,/*	A B C	if ((RK(B) <  RK(C)) ~= A) then pc++  		*/[m
[31m-OP_LE,/*	A B C	if ((RK(B) <= RK(C)) ~= A) then pc++  		*/[m
[31m-[m
[31m-OP_TEST,/*	A C	if not (R(A) <=> C) then pc++			*/ [m
[31m-OP_TESTSET,/*	A B C	if (R(B) <=> C) then R(A) := R(B) else pc++	*/ [m
[31m-[m
[31m-OP_CALL,/*	A B C	R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */[m
[31m-OP_TAILCALL,/*	A B C	return R(A)(R(A+1), ... ,R(A+B-1))		*/[m
[31m-OP_RETURN,/*	A B	return R(A), ... ,R(A+B-2)	(see note)	*/[m
[31m-[m
[31m-OP_FORLOOP,/*	A sBx	R(A)+=R(A+2);[m
[31m-			if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/[m
[31m-OP_FORPREP,/*	A sBx	R(A)-=R(A+2); pc+=sBx				*/[m
[31m-[m
[31m-OP_TFORLOOP,/*	A C	R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); [m
[31m-                        if R(A+3) ~= nil then R(A+2)=R(A+3) else pc++	*/ [m
[31m-OP_SETLIST,/*	A B C	R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B	*/[m
[31m-[m
[31m-OP_CLOSE,/*	A 	close all variables in the stack up to (>=) R(A)*/[m
[31m-OP_CLOSURE,/*	A Bx	R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n))	*/[m
[31m-[m
[31m-OP_VARARG/*	A B	R(A), R(A+1), ..., R(A+B-1) = vararg		*/[m
[31m-} OpCode;[m
[31m-[m
[31m-[m
[31m-#define NUM_OPCODES	(cast(int, OP_VARARG) + 1)[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*===========================================================================[m
[31m-  Notes:[m
[31m-  (*) In OP_CALL, if (B == 0) then B = top. C is the number of returns - 1,[m
[31m-      and can be 0: OP_CALL then sets `top' to last_result+1, so[m
[31m-      next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'.[m
[31m-[m
[31m-  (*) In OP_VARARG, if (B == 0) then use actual number of varargs and[m
[31m-      set top (like in OP_CALL with C == 0).[m
[31m-[m
[31m-  (*) In OP_RETURN, if (B == 0) then return up to `top'[m
[31m-[m
[31m-  (*) In OP_SETLIST, if (B == 0) then B = `top';[m
[31m-      if (C == 0) then next `instruction' is real C[m
[31m-[m
[31m-  (*) For comparisons, A specifies what condition the test should accept[m
[31m-      (true or false).[m
[31m-[m
[31m-  (*) All `skips' (pc++) assume that next instruction is a jump[m
[31m-===========================================================================*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** masks for instruction properties. The format is:[m
[31m-** bits 0-1: op mode[m
[31m-** bits 2-3: C arg mode[m
[31m-** bits 4-5: B arg mode[m
[31m-** bit 6: instruction set register A[m
[31m-** bit 7: operator is a test[m
[31m-*/  [m
[31m-[m
[31m-enum OpArgMask {[m
[31m-  OpArgN,  /* argument is not used */[m
[31m-  OpArgU,  /* argument is used */[m
[31m-  OpArgR,  /* argument is a register or a jump offset */[m
[31m-  OpArgK   /* argument is a constant or register/constant */[m
[31m-};[m
[31m-[m
[31m-LUAI_DATA const lu_byte luaP_opmodes[NUM_OPCODES];[m
[31m-[m
[31m-#define getOpMode(m)	(cast(enum OpMode, luaP_opmodes[m] & 3))[m
[31m-#define getBMode(m)	(cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3))[m
[31m-#define getCMode(m)	(cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3))[m
[31m-#define testAMode(m)	(luaP_opmodes[m] & (1 << 6))[m
[31m-#define testTMode(m)	(luaP_opmodes[m] & (1 << 7))[m
[31m-[m
[31m-[m
[31m-LUAI_DATA const char *const luaP_opnames[NUM_OPCODES+1];  /* opcode names */[m
[31m-[m
[31m-[m
[31m-/* number of list items to accumulate before a SETLIST instruction */[m
[31m-#define LFIELDS_PER_FLUSH	50[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/loslib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/loslib.c[m
[1mdeleted file mode 100644[m
[1mindex da06a57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/loslib.c[m
[1m+++ /dev/null[m
[36m@@ -1,243 +0,0 @@[m
[31m-/*[m
[31m-** $Id: loslib.c,v 1.19.1.3 2008/01/18 16:38:18 roberto Exp $[m
[31m-** Standard Operating System library[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <locale.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-#include <time.h>[m
[31m-[m
[31m-#define loslib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-static int os_pushresult (lua_State *L, int i, const char *filename) {[m
[31m-  int en = errno;  /* calls to Lua API may change this value */[m
[31m-  if (i) {[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushfstring(L, "%s: %s", filename, strerror(en));[m
[31m-    lua_pushinteger(L, en);[m
[31m-    return 3;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_execute (lua_State *L) {[m
[31m-  lua_pushinteger(L, system(luaL_optstring(L, 1, NULL)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_remove (lua_State *L) {[m
[31m-  const char *filename = luaL_checkstring(L, 1);[m
[31m-  return os_pushresult(L, remove(filename) == 0, filename);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_rename (lua_State *L) {[m
[31m-  const char *fromname = luaL_checkstring(L, 1);[m
[31m-  const char *toname = luaL_checkstring(L, 2);[m
[31m-  return os_pushresult(L, rename(fromname, toname) == 0, fromname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_tmpname (lua_State *L) {[m
[31m-  char buff[LUA_TMPNAMBUFSIZE];[m
[31m-  int err;[m
[31m-  lua_tmpnam(buff, err);[m
[31m-  if (err)[m
[31m-    return luaL_error(L, "unable to generate a unique filename");[m
[31m-  lua_pushstring(L, buff);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_getenv (lua_State *L) {[m
[31m-  lua_pushstring(L, getenv(luaL_checkstring(L, 1)));  /* if NULL push nil */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_clock (lua_State *L) {[m
[31m-  lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Time/Date operations[m
[31m-** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S,[m
[31m-**   wday=%w+1, yday=%j, isdst=? }[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-static void setfield (lua_State *L, const char *key, int value) {[m
[31m-  lua_pushinteger(L, value);[m
[31m-  lua_setfield(L, -2, key);[m
[31m-}[m
[31m-[m
[31m-static void setboolfield (lua_State *L, const char *key, int value) {[m
[31m-  if (value < 0)  /* undefined? */[m
[31m-    return;  /* does not set field */[m
[31m-  lua_pushboolean(L, value);[m
[31m-  lua_setfield(L, -2, key);[m
[31m-}[m
[31m-[m
[31m-static int getboolfield (lua_State *L, const char *key) {[m
[31m-  int res;[m
[31m-  lua_getfield(L, -1, key);[m
[31m-  res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1);[m
[31m-  lua_pop(L, 1);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int getfield (lua_State *L, const char *key, int d) {[m
[31m-  int res;[m
[31m-  lua_getfield(L, -1, key);[m
[31m-  if (lua_isnumber(L, -1))[m
[31m-    res = (int)lua_tointeger(L, -1);[m
[31m-  else {[m
[31m-    if (d < 0)[m
[31m-      return luaL_error(L, "field " LUA_QS " missing in date table", key);[m
[31m-    res = d;[m
[31m-  }[m
[31m-  lua_pop(L, 1);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_date (lua_State *L) {[m
[31m-  const char *s = luaL_optstring(L, 1, "%c");[m
[31m-  time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL));[m
[31m-  struct tm *stm;[m
[31m-  if (*s == '!') {  /* UTC? */[m
[31m-    stm = gmtime(&t);[m
[31m-    s++;  /* skip `!' */[m
[31m-  }[m
[31m-  else[m
[31m-    stm = localtime(&t);[m
[31m-  if (stm == NULL)  /* invalid date? */[m
[31m-    lua_pushnil(L);[m
[31m-  else if (strcmp(s, "*t") == 0) {[m
[31m-    lua_createtable(L, 0, 9);  /* 9 = number of fields */[m
[31m-    setfield(L, "sec", stm->tm_sec);[m
[31m-    setfield(L, "min", stm->tm_min);[m
[31m-    setfield(L, "hour", stm->tm_hour);[m
[31m-    setfield(L, "day", stm->tm_mday);[m
[31m-    setfield(L, "month", stm->tm_mon+1);[m
[31m-    setfield(L, "year", stm->tm_year+1900);[m
[31m-    setfield(L, "wday", stm->tm_wday+1);[m
[31m-    setfield(L, "yday", stm->tm_yday+1);[m
[31m-    setboolfield(L, "isdst", stm->tm_isdst);[m
[31m-  }[m
[31m-  else {[m
[31m-    char cc[3];[m
[31m-    luaL_Buffer b;[m
[31m-    cc[0] = '%'; cc[2] = '\0';[m
[31m-    luaL_buffinit(L, &b);[m
[31m-    for (; *s; s++) {[m
[31m-      if (*s != '%' || *(s + 1) == '\0')  /* no conversion specifier? */[m
[31m-        luaL_addchar(&b, *s);[m
[31m-      else {[m
[31m-        size_t reslen;[m
[31m-        char buff[200];  /* should be big enough for any conversion result */[m
[31m-        cc[1] = *(++s);[m
[31m-        reslen = strftime(buff, sizeof(buff), cc, stm);[m
[31m-        luaL_addlstring(&b, buff, reslen);[m
[31m-      }[m
[31m-    }[m
[31m-    luaL_pushresult(&b);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_time (lua_State *L) {[m
[31m-  time_t t;[m
[31m-  if (lua_isnoneornil(L, 1))  /* called without args? */[m
[31m-    t = time(NULL);  /* get current time */[m
[31m-  else {[m
[31m-    struct tm ts;[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-    lua_settop(L, 1);  /* make sure table is at the top */[m
[31m-    ts.tm_sec = getfield(L, "sec", 0);[m
[31m-    ts.tm_min = getfield(L, "min", 0);[m
[31m-    ts.tm_hour = getfield(L, "hour", 12);[m
[31m-    ts.tm_mday = getfield(L, "day", -1);[m
[31m-    ts.tm_mon = getfield(L, "month", -1) - 1;[m
[31m-    ts.tm_year = getfield(L, "year", -1) - 1900;[m
[31m-    ts.tm_isdst = getboolfield(L, "isdst");[m
[31m-    t = mktime(&ts);[m
[31m-  }[m
[31m-  if (t == (time_t)(-1))[m
[31m-    lua_pushnil(L);[m
[31m-  else[m
[31m-    lua_pushnumber(L, (lua_Number)t);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_difftime (lua_State *L) {[m
[31m-  lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)),[m
[31m-                             (time_t)(luaL_optnumber(L, 2, 0))));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static int os_setlocale (lua_State *L) {[m
[31m-  static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY,[m
[31m-                      LC_NUMERIC, LC_TIME};[m
[31m-  static const char *const catnames[] = {"all", "collate", "ctype", "monetary",[m
[31m-     "numeric", "time", NULL};[m
[31m-  const char *l = luaL_optstring(L, 1, NULL);[m
[31m-  int op = luaL_checkoption(L, 2, "all", catnames);[m
[31m-  lua_pushstring(L, setlocale(cat[op], l));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_exit (lua_State *L) {[m
[31m-  exit(luaL_optint(L, 1, EXIT_SUCCESS));[m
[31m-}[m
[31m-[m
[31m-static const luaL_Reg syslib[] = {[m
[31m-  {"clock",     os_clock},[m
[31m-  {"date",      os_date},[m
[31m-  {"difftime",  os_difftime},[m
[31m-  {"execute",   os_execute},[m
[31m-  {"exit",      os_exit},[m
[31m-  {"getenv",    os_getenv},[m
[31m-  {"remove",    os_remove},[m
[31m-  {"rename",    os_rename},[m
[31m-  {"setlocale", os_setlocale},[m
[31m-  {"time",      os_time},[m
[31m-  {"tmpname",   os_tmpname},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_os (lua_State *L) {[m
[31m-  luaL_register(L, LUA_OSLIBNAME, syslib);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lparser.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lparser.c[m
[1mdeleted file mode 100644[m
[1mindex dda7488..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lparser.c[m
[1m+++ /dev/null[m
[36m@@ -1,1339 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lparser.c,v 2.42.1.4 2011/10/21 19:31:42 roberto Exp $[m
[31m-** Lua Parser[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lparser_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lcode.h"[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "llex.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lparser.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define hasmultret(k)		((k) == VCALL || (k) == VVARARG)[m
[31m-[m
[31m-#define getlocvar(fs, i)	((fs)->f->locvars[(fs)->actvar[i]])[m
[31m-[m
[31m-#define luaY_checklimit(fs,v,l,m)	if ((v)>(l)) errorlimit(fs,l,m)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** nodes for block list (list of active blocks)[m
[31m-*/[m
[31m-typedef struct BlockCnt {[m
[31m-  struct BlockCnt *previous;  /* chain */[m
[31m-  int breaklist;  /* list of jumps out of this loop */[m
[31m-  lu_byte nactvar;  /* # active locals outside the breakable structure */[m
[31m-  lu_byte upval;  /* true if some variable in the block is an upvalue */[m
[31m-  lu_byte isbreakable;  /* true if `block' is a loop */[m
[31m-} BlockCnt;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** prototypes for recursive non-terminal functions[m
[31m-*/[m
[31m-static void chunk (LexState *ls);[m
[31m-static void expr (LexState *ls, expdesc *v);[m
[31m-[m
[31m-[m
[31m-static void anchor_token (LexState *ls) {[m
[31m-  if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) {[m
[31m-    TString *ts = ls->t.seminfo.ts;[m
[31m-    luaX_newstring(ls, getstr(ts), ts->tsv.len);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void error_expected (LexState *ls, int token) {[m
[31m-  luaX_syntaxerror(ls,[m
[31m-      luaO_pushfstring(ls->L, LUA_QS " expected", luaX_token2str(ls, token)));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void errorlimit (FuncState *fs, int limit, const char *what) {[m
[31m-  const char *msg = (fs->f->linedefined == 0) ?[m
[31m-    luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) :[m
[31m-    luaO_pushfstring(fs->L, "function at line %d has more than %d %s",[m
[31m-                            fs->f->linedefined, limit, what);[m
[31m-  luaX_lexerror(fs->ls, msg, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int testnext (LexState *ls, int c) {[m
[31m-  if (ls->t.token == c) {[m
[31m-    luaX_next(ls);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void check (LexState *ls, int c) {[m
[31m-  if (ls->t.token != c)[m
[31m-    error_expected(ls, c);[m
[31m-}[m
[31m-[m
[31m-static void checknext (LexState *ls, int c) {[m
[31m-  check(ls, c);[m
[31m-  luaX_next(ls);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define check_condition(ls,c,msg)	{ if (!(c)) luaX_syntaxerror(ls, msg); }[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void check_match (LexState *ls, int what, int who, int where) {[m
[31m-  if (!testnext(ls, what)) {[m
[31m-    if (where == ls->linenumber)[m
[31m-      error_expected(ls, what);[m
[31m-    else {[m
[31m-      luaX_syntaxerror(ls, luaO_pushfstring(ls->L,[m
[31m-             LUA_QS " expected (to close " LUA_QS " at line %d)",[m
[31m-              luaX_token2str(ls, what), luaX_token2str(ls, who), where));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static TString *str_checkname (LexState *ls) {[m
[31m-  TString *ts;[m
[31m-  check(ls, TK_NAME);[m
[31m-  ts = ls->t.seminfo.ts;[m
[31m-  luaX_next(ls);[m
[31m-  return ts;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void init_exp (expdesc *e, expkind k, int i) {[m
[31m-  e->f = e->t = NO_JUMP;[m
[31m-  e->k = k;[m
[31m-  e->u.s.info = i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void codestring (LexState *ls, expdesc *e, TString *s) {[m
[31m-  init_exp(e, VK, luaK_stringK(ls->fs, s));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void checkname(LexState *ls, expdesc *e) {[m
[31m-  codestring(ls, e, str_checkname(ls));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int registerlocalvar (LexState *ls, TString *varname) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  Proto *f = fs->f;[m
[31m-  int oldsize = f->sizelocvars;[m
[31m-  luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,[m
[31m-                  LocVar, SHRT_MAX, "too many local variables");[m
[31m-  while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;[m
[31m-  f->locvars[fs->nlocvars].varname = varname;[m
[31m-  luaC_objbarrier(ls->L, f, varname);[m
[31m-  return fs->nlocvars++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define new_localvarliteral(ls,v,n) \[m
[31m-  new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n)[m
[31m-[m
[31m-[m
[31m-static void new_localvar (LexState *ls, TString *name, int n) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables");[m
[31m-  fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void adjustlocalvars (LexState *ls, int nvars) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  fs->nactvar = cast_byte(fs->nactvar + nvars);[m
[31m-  for (; nvars; nvars--) {[m
[31m-    getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void removevars (LexState *ls, int tolevel) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  while (fs->nactvar > tolevel)[m
[31m-    getlocvar(fs, --fs->nactvar).endpc = fs->pc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int indexupvalue (FuncState *fs, TString *name, expdesc *v) {[m
[31m-  int i;[m
[31m-  Proto *f = fs->f;[m
[31m-  int oldsize = f->sizeupvalues;[m
[31m-  for (i=0; i<f->nups; i++) {[m
[31m-    if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) {[m
[31m-      lua_assert(f->upvalues[i] == name);[m
[31m-      return i;[m
[31m-    }[m
[31m-  }[m
[31m-  /* new one */[m
[31m-  luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues");[m
[31m-  luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues,[m
[31m-                  TString *, MAX_INT, "");[m
[31m-  while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL;[m
[31m-  f->upvalues[f->nups] = name;[m
[31m-  luaC_objbarrier(fs->L, f, name);[m
[31m-  lua_assert(v->k == VLOCAL || v->k == VUPVAL);[m
[31m-  fs->upvalues[f->nups].k = cast_byte(v->k);[m
[31m-  fs->upvalues[f->nups].info = cast_byte(v->u.s.info);[m
[31m-  return f->nups++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int searchvar (FuncState *fs, TString *n) {[m
[31m-  int i;[m
[31m-  for (i=fs->nactvar-1; i >= 0; i--) {[m
[31m-    if (n == getlocvar(fs, i).varname)[m
[31m-      return i;[m
[31m-  }[m
[31m-  return -1;  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void markupval (FuncState *fs, int level) {[m
[31m-  BlockCnt *bl = fs->bl;[m
[31m-  while (bl && bl->nactvar > level) bl = bl->previous;[m
[31m-  if (bl) bl->upval = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {[m
[31m-  if (fs == NULL) {  /* no more levels? */[m
[31m-    init_exp(var, VGLOBAL, NO_REG);  /* default is global variable */[m
[31m-    return VGLOBAL;[m
[31m-  }[m
[31m-  else {[m
[31m-    int v = searchvar(fs, n);  /* look up at current level */[m
[31m-    if (v >= 0) {[m
[31m-      init_exp(var, VLOCAL, v);[m
[31m-      if (!base)[m
[31m-        markupval(fs, v);  /* local will be used as an upval */[m
[31m-      return VLOCAL;[m
[31m-    }[m
[31m-    else {  /* not found at current level; try upper one */[m
[31m-      if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL)[m
[31m-        return VGLOBAL;[m
[31m-      var->u.s.info = indexupvalue(fs, n, var);  /* else was LOCAL or UPVAL */[m
[31m-      var->k = VUPVAL;  /* upvalue in this level */[m
[31m-      return VUPVAL;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void singlevar (LexState *ls, expdesc *var) {[m
[31m-  TString *varname = str_checkname(ls);[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  if (singlevaraux(fs, varname, var, 1) == VGLOBAL)[m
[31m-    var->u.s.info = luaK_stringK(fs, varname);  /* info points to global name */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int extra = nvars - nexps;[m
[31m-  if (hasmultret(e->k)) {[m
[31m-    extra++;  /* includes call itself */[m
[31m-    if (extra < 0) extra = 0;[m
[31m-    luaK_setreturns(fs, e, extra);  /* last exp. provides the difference */[m
[31m-    if (extra > 1) luaK_reserveregs(fs, extra-1);[m
[31m-  }[m
[31m-  else {[m
[31m-    if (e->k != VVOID) luaK_exp2nextreg(fs, e);  /* close last expression */[m
[31m-    if (extra > 0) {[m
[31m-      int reg = fs->freereg;[m
[31m-      luaK_reserveregs(fs, extra);[m
[31m-      luaK_nil(fs, reg, extra);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void enterlevel (LexState *ls) {[m
[31m-  if (++ls->L->nCcalls > LUAI_MAXCCALLS)[m
[31m-	luaX_lexerror(ls, "chunk has too many syntax levels", 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define leavelevel(ls)	((ls)->L->nCcalls--)[m
[31m-[m
[31m-[m
[31m-static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) {[m
[31m-  bl->breaklist = NO_JUMP;[m
[31m-  bl->isbreakable = isbreakable;[m
[31m-  bl->nactvar = fs->nactvar;[m
[31m-  bl->upval = 0;[m
[31m-  bl->previous = fs->bl;[m
[31m-  fs->bl = bl;[m
[31m-  lua_assert(fs->freereg == fs->nactvar);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void leaveblock (FuncState *fs) {[m
[31m-  BlockCnt *bl = fs->bl;[m
[31m-  fs->bl = bl->previous;[m
[31m-  removevars(fs->ls, bl->nactvar);[m
[31m-  if (bl->upval)[m
[31m-    luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0);[m
[31m-  /* a block either controls scope or breaks (never both) */[m
[31m-  lua_assert(!bl->isbreakable || !bl->upval);[m
[31m-  lua_assert(bl->nactvar == fs->nactvar);[m
[31m-  fs->freereg = fs->nactvar;  /* free registers */[m
[31m-  luaK_patchtohere(fs, bl->breaklist);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  Proto *f = fs->f;[m
[31m-  int oldsize = f->sizep;[m
[31m-  int i;[m
[31m-  luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *,[m
[31m-                  MAXARG_Bx, "constant table overflow");[m
[31m-  while (oldsize < f->sizep) f->p[oldsize++] = NULL;[m
[31m-  f->p[fs->np++] = func->f;[m
[31m-  luaC_objbarrier(ls->L, f, func->f);[m
[31m-  init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1));[m
[31m-  for (i=0; i<func->f->nups; i++) {[m
[31m-    OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;[m
[31m-    luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void open_func (LexState *ls, FuncState *fs) {[m
[31m-  lua_State *L = ls->L;[m
[31m-  Proto *f = luaF_newproto(L);[m
[31m-  fs->f = f;[m
[31m-  fs->prev = ls->fs;  /* linked list of funcstates */[m
[31m-  fs->ls = ls;[m
[31m-  fs->L = L;[m
[31m-  ls->fs = fs;[m
[31m-  fs->pc = 0;[m
[31m-  fs->lasttarget = -1;[m
[31m-  fs->jpc = NO_JUMP;[m
[31m-  fs->freereg = 0;[m
[31m-  fs->nk = 0;[m
[31m-  fs->np = 0;[m
[31m-  fs->nlocvars = 0;[m
[31m-  fs->nactvar = 0;[m
[31m-  fs->bl = NULL;[m
[31m-  f->source = ls->source;[m
[31m-  f->maxstacksize = 2;  /* registers 0/1 are always valid */[m
[31m-  fs->h = luaH_new(L, 0, 0);[m
[31m-  /* anchor table of constants and prototype (to avoid being collected) */[m
[31m-  sethvalue2s(L, L->top, fs->h);[m
[31m-  incr_top(L);[m
[31m-  setptvalue2s(L, L->top, f);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void close_func (LexState *ls) {[m
[31m-  lua_State *L = ls->L;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  Proto *f = fs->f;[m
[31m-  removevars(ls, 0);[m
[31m-  luaK_ret(fs, 0, 0);  /* final return */[m
[31m-  luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);[m
[31m-  f->sizecode = fs->pc;[m
[31m-  luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int);[m
[31m-  f->sizelineinfo = fs->pc;[m
[31m-  luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue);[m
[31m-  f->sizek = fs->nk;[m
[31m-  luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *);[m
[31m-  f->sizep = fs->np;[m
[31m-  luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);[m
[31m-  f->sizelocvars = fs->nlocvars;[m
[31m-  luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *);[m
[31m-  f->sizeupvalues = f->nups;[m
[31m-  lua_assert(luaG_checkcode(f));[m
[31m-  lua_assert(fs->bl == NULL);[m
[31m-  ls->fs = fs->prev;[m
[31m-  /* last token read was anchored in defunct function; must reanchor it */[m
[31m-  if (fs) anchor_token(ls);[m
[31m-  L->top -= 2;  /* remove table and prototype from the stack */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {[m
[31m-  struct LexState lexstate;[m
[31m-  struct FuncState funcstate;[m
[31m-  lexstate.buff = buff;[m
[31m-  luaX_setinput(L, &lexstate, z, luaS_new(L, name));[m
[31m-  open_func(&lexstate, &funcstate);[m
[31m-  funcstate.f->is_vararg = VARARG_ISVARARG;  /* main func. is always vararg */[m
[31m-  luaX_next(&lexstate);  /* read first token */[m
[31m-  chunk(&lexstate);[m
[31m-  check(&lexstate, TK_EOS);[m
[31m-  close_func(&lexstate);[m
[31m-  lua_assert(funcstate.prev == NULL);[m
[31m-  lua_assert(funcstate.f->nups == 0);[m
[31m-  lua_assert(lexstate.fs == NULL);[m
[31m-  return funcstate.f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*============================================================*/[m
[31m-/* GRAMMAR RULES */[m
[31m-/*============================================================*/[m
[31m-[m
[31m-[m
[31m-static void field (LexState *ls, expdesc *v) {[m
[31m-  /* field -> ['.' | ':'] NAME */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  expdesc key;[m
[31m-  luaK_exp2anyreg(fs, v);[m
[31m-  luaX_next(ls);  /* skip the dot or colon */[m
[31m-  checkname(ls, &key);[m
[31m-  luaK_indexed(fs, v, &key);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void yindex (LexState *ls, expdesc *v) {[m
[31m-  /* index -> '[' expr ']' */[m
[31m-  luaX_next(ls);  /* skip the '[' */[m
[31m-  expr(ls, v);[m
[31m-  luaK_exp2val(ls->fs, v);[m
[31m-  checknext(ls, ']');[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Rules for Constructors[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-struct ConsControl {[m
[31m-  expdesc v;  /* last list item read */[m
[31m-  expdesc *t;  /* table descriptor */[m
[31m-  int nh;  /* total number of `record' elements */[m
[31m-  int na;  /* total number of array elements */[m
[31m-  int tostore;  /* number of array elements pending to be stored */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void recfield (LexState *ls, struct ConsControl *cc) {[m
[31m-  /* recfield -> (NAME | `['exp1`]') = exp1 */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int reg = ls->fs->freereg;[m
[31m-  expdesc key, val;[m
[31m-  int rkkey;[m
[31m-  if (ls->t.token == TK_NAME) {[m
[31m-    luaY_checklimit(fs, cc->nh, MAX_INT, "items in a constructor");[m
[31m-    checkname(ls, &key);[m
[31m-  }[m
[31m-  else  /* ls->t.token == '[' */[m
[31m-    yindex(ls, &key);[m
[31m-  cc->nh++;[m
[31m-  checknext(ls, '=');[m
[31m-  rkkey = luaK_exp2RK(fs, &key);[m
[31m-  expr(ls, &val);[m
[31m-  luaK_codeABC(fs, OP_SETTABLE, cc->t->u.s.info, rkkey, luaK_exp2RK(fs, &val));[m
[31m-  fs->freereg = reg;  /* free registers */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void closelistfield (FuncState *fs, struct ConsControl *cc) {[m
[31m-  if (cc->v.k == VVOID) return;  /* there is no list item */[m
[31m-  luaK_exp2nextreg(fs, &cc->v);[m
[31m-  cc->v.k = VVOID;[m
[31m-  if (cc->tostore == LFIELDS_PER_FLUSH) {[m
[31m-    luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore);  /* flush */[m
[31m-    cc->tostore = 0;  /* no more items pending */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void lastlistfield (FuncState *fs, struct ConsControl *cc) {[m
[31m-  if (cc->tostore == 0) return;[m
[31m-  if (hasmultret(cc->v.k)) {[m
[31m-    luaK_setmultret(fs, &cc->v);[m
[31m-    luaK_setlist(fs, cc->t->u.s.info, cc->na, LUA_MULTRET);[m
[31m-    cc->na--;  /* do not count last expression (unknown number of elements) */[m
[31m-  }[m
[31m-  else {[m
[31m-    if (cc->v.k != VVOID)[m
[31m-      luaK_exp2nextreg(fs, &cc->v);[m
[31m-    luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void listfield (LexState *ls, struct ConsControl *cc) {[m
[31m-  expr(ls, &cc->v);[m
[31m-  luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor");[m
[31m-  cc->na++;[m
[31m-  cc->tostore++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void constructor (LexState *ls, expdesc *t) {[m
[31m-  /* constructor -> ?? */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int line = ls->linenumber;[m
[31m-  int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);[m
[31m-  struct ConsControl cc;[m
[31m-  cc.na = cc.nh = cc.tostore = 0;[m
[31m-  cc.t = t;[m
[31m-  init_exp(t, VRELOCABLE, pc);[m
[31m-  init_exp(&cc.v, VVOID, 0);  /* no value (yet) */[m
[31m-  luaK_exp2nextreg(ls->fs, t);  /* fix it at stack top (for gc) */[m
[31m-  checknext(ls, '{');[m
[31m-  do {[m
[31m-    lua_assert(cc.v.k == VVOID || cc.tostore > 0);[m
[31m-    if (ls->t.token == '}') break;[m
[31m-    closelistfield(fs, &cc);[m
[31m-    switch(ls->t.token) {[m
[31m-      case TK_NAME: {  /* may be listfields or recfields */[m
[31m-        luaX_lookahead(ls);[m
[31m-        if (ls->lookahead.token != '=')  /* expression? */[m
[31m-          listfield(ls, &cc);[m
[31m-        else[m
[31m-          recfield(ls, &cc);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '[': {  /* constructor_item -> recfield */[m
[31m-        recfield(ls, &cc);[m
[31m-        break;[m
[31m-      }[m
[31m-      default: {  /* constructor_part -> listfield */[m
[31m-        listfield(ls, &cc);[m
[31m-        break;[m
[31m-      }[m
[31m-    }[m
[31m-  } while (testnext(ls, ',') || testnext(ls, ';'));[m
[31m-  check_match(ls, '}', '{', line);[m
[31m-  lastlistfield(fs, &cc);[m
[31m-  SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */[m
[31m-  SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh));  /* set initial table size */[m
[31m-}[m
[31m-[m
[31m-/* }====================================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void parlist (LexState *ls) {[m
[31m-  /* parlist -> [ param { `,' param } ] */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  Proto *f = fs->f;[m
[31m-  int nparams = 0;[m
[31m-  f->is_vararg = 0;[m
[31m-  if (ls->t.token != ')') {  /* is `parlist' not empty? */[m
[31m-    do {[m
[31m-      switch (ls->t.token) {[m
[31m-        case TK_NAME: {  /* param -> NAME */[m
[31m-          new_localvar(ls, str_checkname(ls), nparams++);[m
[31m-          break;[m
[31m-        }[m
[31m-        case TK_DOTS: {  /* param -> `...' */[m
[31m-          luaX_next(ls);[m
[31m-#if defined(LUA_COMPAT_VARARG)[m
[31m-          /* use `arg' as default name */[m
[31m-          new_localvarliteral(ls, "arg", nparams++);[m
[31m-          f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG;[m
[31m-#endif[m
[31m-          f->is_vararg |= VARARG_ISVARARG;[m
[31m-          break;[m
[31m-        }[m
[31m-        default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected");[m
[31m-      }[m
[31m-    } while (!f->is_vararg && testnext(ls, ','));[m
[31m-  }[m
[31m-  adjustlocalvars(ls, nparams);[m
[31m-  f->numparams = cast_byte(fs->nactvar - (f->is_vararg & VARARG_HASARG));[m
[31m-  luaK_reserveregs(fs, fs->nactvar);  /* reserve register for parameters */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void body (LexState *ls, expdesc *e, int needself, int line) {[m
[31m-  /* body ->  `(' parlist `)' chunk END */[m
[31m-  FuncState new_fs;[m
[31m-  open_func(ls, &new_fs);[m
[31m-  new_fs.f->linedefined = line;[m
[31m-  checknext(ls, '(');[m
[31m-  if (needself) {[m
[31m-    new_localvarliteral(ls, "self", 0);[m
[31m-    adjustlocalvars(ls, 1);[m
[31m-  }[m
[31m-  parlist(ls);[m
[31m-  checknext(ls, ')');[m
[31m-  chunk(ls);[m
[31m-  new_fs.f->lastlinedefined = ls->linenumber;[m
[31m-  check_match(ls, TK_END, TK_FUNCTION, line);[m
[31m-  close_func(ls);[m
[31m-  pushclosure(ls, &new_fs, e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int explist1 (LexState *ls, expdesc *v) {[m
[31m-  /* explist1 -> expr { `,' expr } */[m
[31m-  int n = 1;  /* at least one expression */[m
[31m-  expr(ls, v);[m
[31m-  while (testnext(ls, ',')) {[m
[31m-    luaK_exp2nextreg(ls->fs, v);[m
[31m-    expr(ls, v);[m
[31m-    n++;[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void funcargs (LexState *ls, expdesc *f) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  expdesc args;[m
[31m-  int base, nparams;[m
[31m-  int line = ls->linenumber;[m
[31m-  switch (ls->t.token) {[m
[31m-    case '(': {  /* funcargs -> `(' [ explist1 ] `)' */[m
[31m-      if (line != ls->lastline)[m
[31m-        luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)");[m
[31m-      luaX_next(ls);[m
[31m-      if (ls->t.token == ')')  /* arg list is empty? */[m
[31m-        args.k = VVOID;[m
[31m-      else {[m
[31m-        explist1(ls, &args);[m
[31m-        luaK_setmultret(fs, &args);[m
[31m-      }[m
[31m-      check_match(ls, ')', '(', line);[m
[31m-      break;[m
[31m-    }[m
[31m-    case '{': {  /* funcargs -> constructor */[m
[31m-      constructor(ls, &args);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_STRING: {  /* funcargs -> STRING */[m
[31m-      codestring(ls, &args, ls->t.seminfo.ts);[m
[31m-      luaX_next(ls);  /* must use `seminfo' before `next' */[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      luaX_syntaxerror(ls, "function arguments expected");[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(f->k == VNONRELOC);[m
[31m-  base = f->u.s.info;  /* base register for call */[m
[31m-  if (hasmultret(args.k))[m
[31m-    nparams = LUA_MULTRET;  /* open call */[m
[31m-  else {[m
[31m-    if (args.k != VVOID)[m
[31m-      luaK_exp2nextreg(fs, &args);  /* close last argument */[m
[31m-    nparams = fs->freereg - (base+1);[m
[31m-  }[m
[31m-  init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));[m
[31m-  luaK_fixline(fs, line);[m
[31m-  fs->freereg = base+1;  /* call remove function and arguments and leaves[m
[31m-                            (unless changed) one result */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Expression parsing[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static void prefixexp (LexState *ls, expdesc *v) {[m
[31m-  /* prefixexp -> NAME | '(' expr ')' */[m
[31m-  switch (ls->t.token) {[m
[31m-    case '(': {[m
[31m-      int line = ls->linenumber;[m
[31m-      luaX_next(ls);[m
[31m-      expr(ls, v);[m
[31m-      check_match(ls, ')', '(', line);[m
[31m-      luaK_dischargevars(ls->fs, v);[m
[31m-      return;[m
[31m-    }[m
[31m-    case TK_NAME: {[m
[31m-      singlevar(ls, v);[m
[31m-      return;[m
[31m-    }[m
[31m-    default: {[m
[31m-      luaX_syntaxerror(ls, "unexpected symbol");[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void primaryexp (LexState *ls, expdesc *v) {[m
[31m-  /* primaryexp ->[m
[31m-        prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  prefixexp(ls, v);[m
[31m-  for (;;) {[m
[31m-    switch (ls->t.token) {[m
[31m-      case '.': {  /* field */[m
[31m-        field(ls, v);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '[': {  /* `[' exp1 `]' */[m
[31m-        expdesc key;[m
[31m-        luaK_exp2anyreg(fs, v);[m
[31m-        yindex(ls, &key);[m
[31m-        luaK_indexed(fs, v, &key);[m
[31m-        break;[m
[31m-      }[m
[31m-      case ':': {  /* `:' NAME funcargs */[m
[31m-        expdesc key;[m
[31m-        luaX_next(ls);[m
[31m-        checkname(ls, &key);[m
[31m-        luaK_self(fs, v, &key);[m
[31m-        funcargs(ls, v);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '(': case TK_STRING: case '{': {  /* funcargs */[m
[31m-        luaK_exp2nextreg(fs, v);[m
[31m-        funcargs(ls, v);[m
[31m-        break;[m
[31m-      }[m
[31m-      default: return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void simpleexp (LexState *ls, expdesc *v) {[m
[31m-  /* simpleexp -> NUMBER | STRING | NIL | true | false | ... |[m
[31m-                  constructor | FUNCTION body | primaryexp */[m
[31m-  switch (ls->t.token) {[m
[31m-    case TK_NUMBER: {[m
[31m-      init_exp(v, VKNUM, 0);[m
[31m-      v->u.nval = ls->t.seminfo.r;[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_STRING: {[m
[31m-      codestring(ls, v, ls->t.seminfo.ts);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_NIL: {[m
[31m-      init_exp(v, VNIL, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_TRUE: {[m
[31m-      init_exp(v, VTRUE, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_FALSE: {[m
[31m-      init_exp(v, VFALSE, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_DOTS: {  /* vararg */[m
[31m-      FuncState *fs = ls->fs;[m
[31m-      check_condition(ls, fs->f->is_vararg,[m
[31m-                      "cannot use " LUA_QL("...") " outside a vararg function");[m
[31m-      fs->f->is_vararg &= ~VARARG_NEEDSARG;  /* don't need 'arg' */[m
[31m-      init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));[m
[31m-      break;[m
[31m-    }[m
[31m-    case '{': {  /* constructor */[m
[31m-      constructor(ls, v);[m
[31m-      return;[m
[31m-    }[m
[31m-    case TK_FUNCTION: {[m
[31m-      luaX_next(ls);[m
[31m-      body(ls, v, 0, ls->linenumber);[m
[31m-      return;[m
[31m-    }[m
[31m-    default: {[m
[31m-      primaryexp(ls, v);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  luaX_next(ls);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static UnOpr getunopr (int op) {[m
[31m-  switch (op) {[m
[31m-    case TK_NOT: return OPR_NOT;[m
[31m-    case '-': return OPR_MINUS;[m
[31m-    case '#': return OPR_LEN;[m
[31m-    default: return OPR_NOUNOPR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static BinOpr getbinopr (int op) {[m
[31m-  switch (op) {[m
[31m-    case '+': return OPR_ADD;[m
[31m-    case '-': return OPR_SUB;[m
[31m-    case '*': return OPR_MUL;[m
[31m-    case '/': return OPR_DIV;[m
[31m-    case '%': return OPR_MOD;[m
[31m-    case '^': return OPR_POW;[m
[31m-    case TK_CONCAT: return OPR_CONCAT;[m
[31m-    case TK_NE: return OPR_NE;[m
[31m-    case TK_EQ: return OPR_EQ;[m
[31m-    case '<': return OPR_LT;[m
[31m-    case TK_LE: return OPR_LE;[m
[31m-    case '>': return OPR_GT;[m
[31m-    case TK_GE: return OPR_GE;[m
[31m-    case TK_AND: return OPR_AND;[m
[31m-    case TK_OR: return OPR_OR;[m
[31m-    default: return OPR_NOBINOPR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const struct {[m
[31m-  lu_byte left;  /* left priority for each binary operator */[m
[31m-  lu_byte right; /* right priority */[m
[31m-} priority[] = {  /* ORDER OPR */[m
[31m-   {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7},  /* `+' `-' `/' `%' */[m
[31m-   {10, 9}, {5, 4},                 /* power and concat (right associative) */[m
[31m-   {3, 3}, {3, 3},                  /* equality and inequality */[m
[31m-   {3, 3}, {3, 3}, {3, 3}, {3, 3},  /* order */[m
[31m-   {2, 2}, {1, 1}                   /* logical (and/or) */[m
[31m-};[m
[31m-[m
[31m-#define UNARY_PRIORITY	8  /* priority for unary operators */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** subexpr -> (simpleexp | unop subexpr) { binop subexpr }[m
[31m-** where `binop' is any binary operator with a priority higher than `limit'[m
[31m-*/[m
[31m-static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) {[m
[31m-  BinOpr op;[m
[31m-  UnOpr uop;[m
[31m-  enterlevel(ls);[m
[31m-  uop = getunopr(ls->t.token);[m
[31m-  if (uop != OPR_NOUNOPR) {[m
[31m-    luaX_next(ls);[m
[31m-    subexpr(ls, v, UNARY_PRIORITY);[m
[31m-    luaK_prefix(ls->fs, uop, v);[m
[31m-  }[m
[31m-  else simpleexp(ls, v);[m
[31m-  /* expand while operators have priorities higher than `limit' */[m
[31m-  op = getbinopr(ls->t.token);[m
[31m-  while (op != OPR_NOBINOPR && priority[op].left > limit) {[m
[31m-    expdesc v2;[m
[31m-    BinOpr nextop;[m
[31m-    luaX_next(ls);[m
[31m-    luaK_infix(ls->fs, op, v);[m
[31m-    /* read sub-expression with higher priority */[m
[31m-    nextop = subexpr(ls, &v2, priority[op].right);[m
[31m-    luaK_posfix(ls->fs, op, v, &v2);[m
[31m-    op = nextop;[m
[31m-  }[m
[31m-  leavelevel(ls);[m
[31m-  return op;  /* return first untreated operator */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void expr (LexState *ls, expdesc *v) {[m
[31m-  subexpr(ls, v, 0);[m
[31m-}[m
[31m-[m
[31m-/* }==================================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Rules for Statements[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static int block_follow (int token) {[m
[31m-  switch (token) {[m
[31m-    case TK_ELSE: case TK_ELSEIF: case TK_END:[m
[31m-    case TK_UNTIL: case TK_EOS:[m
[31m-      return 1;[m
[31m-    default: return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void block (LexState *ls) {[m
[31m-  /* block -> chunk */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BlockCnt bl;[m
[31m-  enterblock(fs, &bl, 0);[m
[31m-  chunk(ls);[m
[31m-  lua_assert(bl.breaklist == NO_JUMP);[m
[31m-  leaveblock(fs);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** structure to chain all variables in the left-hand side of an[m
[31m-** assignment[m
[31m-*/[m
[31m-struct LHS_assign {[m
[31m-  struct LHS_assign *prev;[m
[31m-  expdesc v;  /* variable (global, local, upvalue, or indexed) */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** check whether, in an assignment to a local variable, the local variable[m
[31m-** is needed in a previous assignment (to a table). If so, save original[m
[31m-** local value in a safe place and use this safe copy in the previous[m
[31m-** assignment.[m
[31m-*/[m
[31m-static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int extra = fs->freereg;  /* eventual position to save local variable */[m
[31m-  int conflict = 0;[m
[31m-  for (; lh; lh = lh->prev) {[m
[31m-    if (lh->v.k == VINDEXED) {[m
[31m-      if (lh->v.u.s.info == v->u.s.info) {  /* conflict? */[m
[31m-        conflict = 1;[m
[31m-        lh->v.u.s.info = extra;  /* previous assignment will use safe copy */[m
[31m-      }[m
[31m-      if (lh->v.u.s.aux == v->u.s.info) {  /* conflict? */[m
[31m-        conflict = 1;[m
[31m-        lh->v.u.s.aux = extra;  /* previous assignment will use safe copy */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (conflict) {[m
[31m-    luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0);  /* make copy */[m
[31m-    luaK_reserveregs(fs, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {[m
[31m-  expdesc e;[m
[31m-  check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED,[m
[31m-                      "syntax error");[m
[31m-  if (testnext(ls, ',')) {  /* assignment -> `,' primaryexp assignment */[m
[31m-    struct LHS_assign nv;[m
[31m-    nv.prev = lh;[m
[31m-    primaryexp(ls, &nv.v);[m
[31m-    if (nv.v.k == VLOCAL)[m
[31m-      check_conflict(ls, lh, &nv.v);[m
[31m-    luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls,[m
[31m-                    "variables in assignment");[m
[31m-    assignment(ls, &nv, nvars+1);[m
[31m-  }[m
[31m-  else {  /* assignment -> `=' explist1 */[m
[31m-    int nexps;[m
[31m-    checknext(ls, '=');[m
[31m-    nexps = explist1(ls, &e);[m
[31m-    if (nexps != nvars) {[m
[31m-      adjust_assign(ls, nvars, nexps, &e);[m
[31m-      if (nexps > nvars)[m
[31m-        ls->fs->freereg -= nexps - nvars;  /* remove extra values */[m
[31m-    }[m
[31m-    else {[m
[31m-      luaK_setoneret(ls->fs, &e);  /* close last expression */[m
[31m-      luaK_storevar(ls->fs, &lh->v, &e);[m
[31m-      return;  /* avoid default */[m
[31m-    }[m
[31m-  }[m
[31m-  init_exp(&e, VNONRELOC, ls->fs->freereg-1);  /* default assignment */[m
[31m-  luaK_storevar(ls->fs, &lh->v, &e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int cond (LexState *ls) {[m
[31m-  /* cond -> exp */[m
[31m-  expdesc v;[m
[31m-  expr(ls, &v);  /* read condition */[m
[31m-  if (v.k == VNIL) v.k = VFALSE;  /* `falses' are all equal here */[m
[31m-  luaK_goiftrue(ls->fs, &v);[m
[31m-  return v.f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void breakstat (LexState *ls) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BlockCnt *bl = fs->bl;[m
[31m-  int upval = 0;[m
[31m-  while (bl && !bl->isbreakable) {[m
[31m-    upval |= bl->upval;[m
[31m-    bl = bl->previous;[m
[31m-  }[m
[31m-  if (!bl)[m
[31m-    luaX_syntaxerror(ls, "no loop to break");[m
[31m-  if (upval)[m
[31m-    luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0);[m
[31m-  luaK_concat(fs, &bl->breaklist, luaK_jump(fs));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void whilestat (LexState *ls, int line) {[m
[31m-  /* whilestat -> WHILE cond DO block END */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int whileinit;[m
[31m-  int condexit;[m
[31m-  BlockCnt bl;[m
[31m-  luaX_next(ls);  /* skip WHILE */[m
[31m-  whileinit = luaK_getlabel(fs);[m
[31m-  condexit = cond(ls);[m
[31m-  enterblock(fs, &bl, 1);[m
[31m-  checknext(ls, TK_DO);[m
[31m-  block(ls);[m
[31m-  luaK_patchlist(fs, luaK_jump(fs), whileinit);[m
[31m-  check_match(ls, TK_END, TK_WHILE, line);[m
[31m-  leaveblock(fs);[m
[31m-  luaK_patchtohere(fs, condexit);  /* false conditions finish the loop */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void repeatstat (LexState *ls, int line) {[m
[31m-  /* repeatstat -> REPEAT block UNTIL cond */[m
[31m-  int condexit;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int repeat_init = luaK_getlabel(fs);[m
[31m-  BlockCnt bl1, bl2;[m
[31m-  enterblock(fs, &bl1, 1);  /* loop block */[m
[31m-  enterblock(fs, &bl2, 0);  /* scope block */[m
[31m-  luaX_next(ls);  /* skip REPEAT */[m
[31m-  chunk(ls);[m
[31m-  check_match(ls, TK_UNTIL, TK_REPEAT, line);[m
[31m-  condexit = cond(ls);  /* read condition (inside scope block) */[m
[31m-  if (!bl2.upval) {  /* no upvalues? */[m
[31m-    leaveblock(fs);  /* finish scope */[m
[31m-    luaK_patchlist(ls->fs, condexit, repeat_init);  /* close the loop */[m
[31m-  }[m
[31m-  else {  /* complete semantics when there are upvalues */[m
[31m-    breakstat(ls);  /* if condition then break */[m
[31m-    luaK_patchtohere(ls->fs, condexit);  /* else... */[m
[31m-    leaveblock(fs);  /* finish scope... */[m
[31m-    luaK_patchlist(ls->fs, luaK_jump(fs), repeat_init);  /* and repeat */[m
[31m-  }[m
[31m-  leaveblock(fs);  /* finish loop */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int exp1 (LexState *ls) {[m
[31m-  expdesc e;[m
[31m-  int k;[m
[31m-  expr(ls, &e);[m
[31m-  k = e.k;[m
[31m-  luaK_exp2nextreg(ls->fs, &e);[m
[31m-  return k;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void forbody (LexState *ls, int base, int line, int nvars, int isnum) {[m
[31m-  /* forbody -> DO block */[m
[31m-  BlockCnt bl;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int prep, endfor;[m
[31m-  adjustlocalvars(ls, 3);  /* control variables */[m
[31m-  checknext(ls, TK_DO);[m
[31m-  prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs);[m
[31m-  enterblock(fs, &bl, 0);  /* scope for declared variables */[m
[31m-  adjustlocalvars(ls, nvars);[m
[31m-  luaK_reserveregs(fs, nvars);[m
[31m-  block(ls);[m
[31m-  leaveblock(fs);  /* end of scope for declared variables */[m
[31m-  luaK_patchtohere(fs, prep);[m
[31m-  endfor = (isnum) ? luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP) :[m
[31m-                     luaK_codeABC(fs, OP_TFORLOOP, base, 0, nvars);[m
[31m-  luaK_fixline(fs, line);  /* pretend that `OP_FOR' starts the loop */[m
[31m-  luaK_patchlist(fs, (isnum ? endfor : luaK_jump(fs)), prep + 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void fornum (LexState *ls, TString *varname, int line) {[m
[31m-  /* fornum -> NAME = exp1,exp1[,exp1] forbody */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int base = fs->freereg;[m
[31m-  new_localvarliteral(ls, "(for index)", 0);[m
[31m-  new_localvarliteral(ls, "(for limit)", 1);[m
[31m-  new_localvarliteral(ls, "(for step)", 2);[m
[31m-  new_localvar(ls, varname, 3);[m
[31m-  checknext(ls, '=');[m
[31m-  exp1(ls);  /* initial value */[m
[31m-  checknext(ls, ',');[m
[31m-  exp1(ls);  /* limit */[m
[31m-  if (testnext(ls, ','))[m
[31m-    exp1(ls);  /* optional step */[m
[31m-  else {  /* default step = 1 */[m
[31m-    luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1));[m
[31m-    luaK_reserveregs(fs, 1);[m
[31m-  }[m
[31m-  forbody(ls, base, line, 1, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void forlist (LexState *ls, TString *indexname) {[m
[31m-  /* forlist -> NAME {,NAME} IN explist1 forbody */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  expdesc e;[m
[31m-  int nvars = 0;[m
[31m-  int line;[m
[31m-  int base = fs->freereg;[m
[31m-  /* create control variables */[m
[31m-  new_localvarliteral(ls, "(for generator)", nvars++);[m
[31m-  new_localvarliteral(ls, "(for state)", nvars++);[m
[31m-  new_localvarliteral(ls, "(for control)", nvars++);[m
[31m-  /* create declared variables */[m
[31m-  new_localvar(ls, indexname, nvars++);[m
[31m-  while (testnext(ls, ','))[m
[31m-    new_localvar(ls, str_checkname(ls), nvars++);[m
[31m-  checknext(ls, TK_IN);[m
[31m-  line = ls->linenumber;[m
[31m-  adjust_assign(ls, 3, explist1(ls, &e), &e);[m
[31m-  luaK_checkstack(fs, 3);  /* extra space to call generator */[m
[31m-  forbody(ls, base, line, nvars - 3, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void forstat (LexState *ls, int line) {[m
[31m-  /* forstat -> FOR (fornum | forlist) END */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  TString *varname;[m
[31m-  BlockCnt bl;[m
[31m-  enterblock(fs, &bl, 1);  /* scope for loop and control variables */[m
[31m-  luaX_next(ls);  /* skip `for' */[m
[31m-  varname = str_checkname(ls);  /* first variable name */[m
[31m-  switch (ls->t.token) {[m
[31m-    case '=': fornum(ls, varname, line); break;[m
[31m-    case ',': case TK_IN: forlist(ls, varname); break;[m
[31m-    default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected");[m
[31m-  }[m
[31m-  check_match(ls, TK_END, TK_FOR, line);[m
[31m-  leaveblock(fs);  /* loop scope (`break' jumps to this point) */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int test_then_block (LexState *ls) {[m
[31m-  /* test_then_block -> [IF | ELSEIF] cond THEN block */[m
[31m-  int condexit;[m
[31m-  luaX_next(ls);  /* skip IF or ELSEIF */[m
[31m-  condexit = cond(ls);[m
[31m-  checknext(ls, TK_THEN);[m
[31m-  block(ls);  /* `then' part */[m
[31m-  return condexit;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void ifstat (LexState *ls, int line) {[m
[31m-  /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int flist;[m
[31m-  int escapelist = NO_JUMP;[m
[31m-  flist = test_then_block(ls);  /* IF cond THEN block */[m
[31m-  while (ls->t.token == TK_ELSEIF) {[m
[31m-    luaK_concat(fs, &escapelist, luaK_jump(fs));[m
[31m-    luaK_patchtohere(fs, flist);[m
[31m-    flist = test_then_block(ls);  /* ELSEIF cond THEN block */[m
[31m-  }[m
[31m-  if (ls->t.token == TK_ELSE) {[m
[31m-    luaK_concat(fs, &escapelist, luaK_jump(fs));[m
[31m-    luaK_patchtohere(fs, flist);[m
[31m-    luaX_next(ls);  /* skip ELSE (after patch, for correct line info) */[m
[31m-    block(ls);  /* `else' part */[m
[31m-  }[m
[31m-  else[m
[31m-    luaK_concat(fs, &escapelist, flist);[m
[31m-  luaK_patchtohere(fs, escapelist);[m
[31m-  check_match(ls, TK_END, TK_IF, line);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void localfunc (LexState *ls) {[m
[31m-  expdesc v, b;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  new_localvar(ls, str_checkname(ls), 0);[m
[31m-  init_exp(&v, VLOCAL, fs->freereg);[m
[31m-  luaK_reserveregs(fs, 1);[m
[31m-  adjustlocalvars(ls, 1);[m
[31m-  body(ls, &b, 0, ls->linenumber);[m
[31m-  luaK_storevar(fs, &v, &b);[m
[31m-  /* debug information will only see the variable after this point! */[m
[31m-  getlocvar(fs, fs->nactvar - 1).startpc = fs->pc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void localstat (LexState *ls) {[m
[31m-  /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */[m
[31m-  int nvars = 0;[m
[31m-  int nexps;[m
[31m-  expdesc e;[m
[31m-  do {[m
[31m-    new_localvar(ls, str_checkname(ls), nvars++);[m
[31m-  } while (testnext(ls, ','));[m
[31m-  if (testnext(ls, '='))[m
[31m-    nexps = explist1(ls, &e);[m
[31m-  else {[m
[31m-    e.k = VVOID;[m
[31m-    nexps = 0;[m
[31m-  }[m
[31m-  adjust_assign(ls, nvars, nexps, &e);[m
[31m-  adjustlocalvars(ls, nvars);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int funcname (LexState *ls, expdesc *v) {[m
[31m-  /* funcname -> NAME {field} [`:' NAME] */[m
[31m-  int needself = 0;[m
[31m-  singlevar(ls, v);[m
[31m-  while (ls->t.token == '.')[m
[31m-    field(ls, v);[m
[31m-  if (ls->t.token == ':') {[m
[31m-    needself = 1;[m
[31m-    field(ls, v);[m
[31m-  }[m
[31m-  return needself;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void funcstat (LexState *ls, int line) {[m
[31m-  /* funcstat -> FUNCTION funcname body */[m
[31m-  int needself;[m
[31m-  expdesc v, b;[m
[31m-  luaX_next(ls);  /* skip FUNCTION */[m
[31m-  needself = funcname(ls, &v);[m
[31m-  body(ls, &b, needself, line);[m
[31m-  luaK_storevar(ls->fs, &v, &b);[m
[31m-  luaK_fixline(ls->fs, line);  /* definition `happens' in the first line */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void exprstat (LexState *ls) {[m
[31m-  /* stat -> func | assignment */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  struct LHS_assign v;[m
[31m-  primaryexp(ls, &v.v);[m
[31m-  if (v.v.k == VCALL)  /* stat -> func */[m
[31m-    SETARG_C(getcode(fs, &v.v), 1);  /* call statement uses no results */[m
[31m-  else {  /* stat -> assignment */[m
[31m-    v.prev = NULL;[m
[31m-    assignment(ls, &v, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void retstat (LexState *ls) {[m
[31m-  /* stat -> RETURN explist */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  expdesc e;[m
[31m-  int first, nret;  /* registers with returned values */[m
[31m-  luaX_next(ls);  /* skip RETURN */[m
[31m-  if (block_follow(ls->t.token) || ls->t.token == ';')[m
[31m-    first = nret = 0;  /* return no values */[m
[31m-  else {[m
[31m-    nret = explist1(ls, &e);  /* optional return values */[m
[31m-    if (hasmultret(e.k)) {[m
[31m-      luaK_setmultret(fs, &e);[m
[31m-      if (e.k == VCALL && nret == 1) {  /* tail call? */[m
[31m-        SET_OPCODE(getcode(fs,&e), OP_TAILCALL);[m
[31m-        lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar);[m
[31m-      }[m
[31m-      first = fs->nactvar;[m
[31m-      nret = LUA_MULTRET;  /* return all values */[m
[31m-    }[m
[31m-    else {[m
[31m-      if (nret == 1)  /* only one single value? */[m
[31m-        first = luaK_exp2anyreg(fs, &e);[m
[31m-      else {[m
[31m-        luaK_exp2nextreg(fs, &e);  /* values must go to the `stack' */[m
[31m-        first = fs->nactvar;  /* return all `active' values */[m
[31m-        lua_assert(nret == fs->freereg - first);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_ret(fs, first, nret);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int statement (LexState *ls) {[m
[31m-  int line = ls->linenumber;  /* may be needed for error messages */[m
[31m-  switch (ls->t.token) {[m
[31m-    case TK_IF: {  /* stat -> ifstat */[m
[31m-      ifstat(ls, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_WHILE: {  /* stat -> whilestat */[m
[31m-      whilestat(ls, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_DO: {  /* stat -> DO block END */[m
[31m-      luaX_next(ls);  /* skip DO */[m
[31m-      block(ls);[m
[31m-      check_match(ls, TK_END, TK_DO, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_FOR: {  /* stat -> forstat */[m
[31m-      forstat(ls, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_REPEAT: {  /* stat -> repeatstat */[m
[31m-      repeatstat(ls, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_FUNCTION: {[m
[31m-      funcstat(ls, line);  /* stat -> funcstat */[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_LOCAL: {  /* stat -> localstat */[m
[31m-      luaX_next(ls);  /* skip LOCAL */[m
[31m-      if (testnext(ls, TK_FUNCTION))  /* local function? */[m
[31m-        localfunc(ls);[m
[31m-      else[m
[31m-        localstat(ls);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_RETURN: {  /* stat -> retstat */[m
[31m-      retstat(ls);[m
[31m-      return 1;  /* must be last statement */[m
[31m-    }[m
[31m-    case TK_BREAK: {  /* stat -> breakstat */[m
[31m-      luaX_next(ls);  /* skip BREAK */[m
[31m-      breakstat(ls);[m
[31m-      return 1;  /* must be last statement */[m
[31m-    }[m
[31m-    default: {[m
[31m-      exprstat(ls);[m
[31m-      return 0;  /* to avoid warnings */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void chunk (LexState *ls) {[m
[31m-  /* chunk -> { stat [`;'] } */[m
[31m-  int islast = 0;[m
[31m-  enterlevel(ls);[m
[31m-  while (!islast && !block_follow(ls->t.token)) {[m
[31m-    islast = statement(ls);[m
[31m-    testnext(ls, ';');[m
[31m-    lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&[m
[31m-               ls->fs->freereg >= ls->fs->nactvar);[m
[31m-    ls->fs->freereg = ls->fs->nactvar;  /* free registers */[m
[31m-  }[m
[31m-  leavelevel(ls);[m
[31m-}[m
[31m-[m
[31m-/* }====================================================================== */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lparser.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lparser.h[m
[1mdeleted file mode 100644[m
[1mindex 18836af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lparser.h[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lua Parser[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lparser_h[m
[31m-#define lparser_h[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Expression descriptor[m
[31m-*/[m
[31m-[m
[31m-typedef enum {[m
[31m-  VVOID,	/* no value */[m
[31m-  VNIL,[m
[31m-  VTRUE,[m
[31m-  VFALSE,[m
[31m-  VK,		/* info = index of constant in `k' */[m
[31m-  VKNUM,	/* nval = numerical value */[m
[31m-  VLOCAL,	/* info = local register */[m
[31m-  VUPVAL,       /* info = index of upvalue in `upvalues' */[m
[31m-  VGLOBAL,	/* info = index of table; aux = index of global name in `k' */[m
[31m-  VINDEXED,	/* info = table register; aux = index register (or `k') */[m
[31m-  VJMP,		/* info = instruction pc */[m
[31m-  VRELOCABLE,	/* info = instruction pc */[m
[31m-  VNONRELOC,	/* info = result register */[m
[31m-  VCALL,	/* info = instruction pc */[m
[31m-  VVARARG	/* info = instruction pc */[m
[31m-} expkind;[m
[31m-[m
[31m-typedef struct expdesc {[m
[31m-  expkind k;[m
[31m-  union {[m
[31m-    struct { int info, aux; } s;[m
[31m-    lua_Number nval;[m
[31m-  } u;[m
[31m-  int t;  /* patch list of `exit when true' */[m
[31m-  int f;  /* patch list of `exit when false' */[m
[31m-} expdesc;[m
[31m-[m
[31m-[m
[31m-typedef struct upvaldesc {[m
[31m-  lu_byte k;[m
[31m-  lu_byte info;[m
[31m-} upvaldesc;[m
[31m-[m
[31m-[m
[31m-struct BlockCnt;  /* defined in lparser.c */[m
[31m-[m
[31m-[m
[31m-/* state needed to generate code for a given function */[m
[31m-typedef struct FuncState {[m
[31m-  Proto *f;  /* current function header */[m
[31m-  Table *h;  /* table to find (and reuse) elements in `k' */[m
[31m-  struct FuncState *prev;  /* enclosing function */[m
[31m-  struct LexState *ls;  /* lexical state */[m
[31m-  struct lua_State *L;  /* copy of the Lua state */[m
[31m-  struct BlockCnt *bl;  /* chain of current blocks */[m
[31m-  int pc;  /* next position to code (equivalent to `ncode') */[m
[31m-  int lasttarget;   /* `pc' of last `jump target' */[m
[31m-  int jpc;  /* list of pending jumps to `pc' */[m
[31m-  int freereg;  /* first free register */[m
[31m-  int nk;  /* number of elements in `k' */[m
[31m-  int np;  /* number of elements in `p' */[m
[31m-  short nlocvars;  /* number of elements in `locvars' */[m
[31m-  lu_byte nactvar;  /* number of active local variables */[m
[31m-  upvaldesc upvalues[LUAI_MAXUPVALUES];  /* upvalues */[m
[31m-  unsigned short actvar[LUAI_MAXVARS];  /* declared-variable stack */[m
[31m-} FuncState;[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,[m
[31m-                                            const char *name);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstate.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstate.c[m
[1mdeleted file mode 100644[m
[1mindex 4313b83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstate.c[m
[1m+++ /dev/null[m
[36m@@ -1,214 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $[m
[31m-** Global State[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define lstate_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "llex.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-[m
[31m-[m
[31m-#define state_size(x)	(sizeof(x) + LUAI_EXTRASPACE)[m
[31m-#define fromstate(l)	(cast(lu_byte *, (l)) - LUAI_EXTRASPACE)[m
[31m-#define tostate(l)   (cast(lua_State *, cast(lu_byte *, l) + LUAI_EXTRASPACE))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Main thread combines a thread state and the global state[m
[31m-*/[m
[31m-typedef struct LG {[m
[31m-  lua_State l;[m
[31m-  global_State g;[m
[31m-} LG;[m
[31m-  [m
[31m-[m
[31m-[m
[31m-static void stack_init (lua_State *L1, lua_State *L) {[m
[31m-  /* initialize CallInfo array */[m
[31m-  L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo);[m
[31m-  L1->ci = L1->base_ci;[m
[31m-  L1->size_ci = BASIC_CI_SIZE;[m
[31m-  L1->end_ci = L1->base_ci + L1->size_ci - 1;[m
[31m-  /* initialize stack array */[m
[31m-  L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue);[m
[31m-  L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK;[m
[31m-  L1->top = L1->stack;[m
[31m-  L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1;[m
[31m-  /* initialize first ci */[m
[31m-  L1->ci->func = L1->top;[m
[31m-  setnilvalue(L1->top++);  /* `function' entry for this `ci' */[m
[31m-  L1->base = L1->ci->base = L1->top;[m
[31m-  L1->ci->top = L1->top + LUA_MINSTACK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void freestack (lua_State *L, lua_State *L1) {[m
[31m-  luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo);[m
[31m-  luaM_freearray(L, L1->stack, L1->stacksize, TValue);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** open parts that may cause memory-allocation errors[m
[31m-*/[m
[31m-static void f_luaopen (lua_State *L, void *ud) {[m
[31m-  global_State *g = G(L);[m
[31m-  UNUSED(ud);[m
[31m-  stack_init(L, L);  /* init stack */[m
[31m-  sethvalue(L, gt(L), luaH_new(L, 0, 2));  /* table of globals */[m
[31m-  sethvalue(L, registry(L), luaH_new(L, 0, 2));  /* registry */[m
[31m-  luaS_resize(L, MINSTRTABSIZE);  /* initial size of string table */[m
[31m-  luaT_init(L);[m
[31m-  luaX_init(L);[m
[31m-  luaS_fix(luaS_newliteral(L, MEMERRMSG));[m
[31m-  g->GCthreshold = 4*g->totalbytes;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void preinit_state (lua_State *L, global_State *g) {[m
[31m-  G(L) = g;[m
[31m-  L->stack = NULL;[m
[31m-  L->stacksize = 0;[m
[31m-  L->errorJmp = NULL;[m
[31m-  L->hook = NULL;[m
[31m-  L->hookmask = 0;[m
[31m-  L->basehookcount = 0;[m
[31m-  L->allowhook = 1;[m
[31m-  resethookcount(L);[m
[31m-  L->openupval = NULL;[m
[31m-  L->size_ci = 0;[m
[31m-  L->nCcalls = L->baseCcalls = 0;[m
[31m-  L->status = 0;[m
[31m-  L->base_ci = L->ci = NULL;[m
[31m-  L->savedpc = NULL;[m
[31m-  L->errfunc = 0;[m
[31m-  setnilvalue(gt(L));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void close_state (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  luaF_close(L, L->stack);  /* close all upvalues for this thread */[m
[31m-  luaC_freeall(L);  /* collect all objects */[m
[31m-  lua_assert(g->rootgc == obj2gco(L));[m
[31m-  lua_assert(g->strt.nuse == 0);[m
[31m-  luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *);[m
[31m-  luaZ_freebuffer(L, &g->buff);[m
[31m-  freestack(L, L);[m
[31m-  lua_assert(g->totalbytes == sizeof(LG));[m
[31m-  (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-lua_State *luaE_newthread (lua_State *L) {[m
[31m-  lua_State *L1 = tostate(luaM_malloc(L, state_size(lua_State)));[m
[31m-  luaC_link(L, obj2gco(L1), LUA_TTHREAD);[m
[31m-  preinit_state(L1, G(L));[m
[31m-  stack_init(L1, L);  /* init stack */[m
[31m-  setobj2n(L, gt(L1), gt(L));  /* share table of globals */[m
[31m-  L1->hookmask = L->hookmask;[m
[31m-  L1->basehookcount = L->basehookcount;[m
[31m-  L1->hook = L->hook;[m
[31m-  resethookcount(L1);[m
[31m-  lua_assert(iswhite(obj2gco(L1)));[m
[31m-  return L1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaE_freethread (lua_State *L, lua_State *L1) {[m
[31m-  luaF_close(L1, L1->stack);  /* close all upvalues for this thread */[m
[31m-  lua_assert(L1->openupval == NULL);[m
[31m-  luai_userstatefree(L1);[m
[31m-  freestack(L, L1);[m
[31m-  luaM_freemem(L, fromstate(L1), state_size(lua_State));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {[m
[31m-  int i;[m
[31m-  lua_State *L;[m
[31m-  global_State *g;[m
[31m-  void *l = (*f)(ud, NULL, 0, state_size(LG));[m
[31m-  if (l == NULL) return NULL;[m
[31m-  L = tostate(l);[m
[31m-  g = &((LG *)L)->g;[m
[31m-  L->next = NULL;[m
[31m-  L->tt = LUA_TTHREAD;[m
[31m-  g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT);[m
[31m-  L->marked = luaC_white(g);[m
[31m-  set2bits(L->marked, FIXEDBIT, SFIXEDBIT);[m
[31m-  preinit_state(L, g);[m
[31m-  g->frealloc = f;[m
[31m-  g->ud = ud;[m
[31m-  g->mainthread = L;[m
[31m-  g->uvhead.u.l.prev = &g->uvhead;[m
[31m-  g->uvhead.u.l.next = &g->uvhead;[m
[31m-  g->GCthreshold = 0;  /* mark it as unfinished state */[m
[31m-  g->strt.size = 0;[m
[31m-  g->strt.nuse = 0;[m
[31m-  g->strt.hash = NULL;[m
[31m-  setnilvalue(registry(L));[m
[31m-  luaZ_initbuffer(L, &g->buff);[m
[31m-  g->panic = NULL;[m
[31m-  g->gcstate = GCSpause;[m
[31m-  g->rootgc = obj2gco(L);[m
[31m-  g->sweepstrgc = 0;[m
[31m-  g->sweepgc = &g->rootgc;[m
[31m-  g->gray = NULL;[m
[31m-  g->grayagain = NULL;[m
[31m-  g->weak = NULL;[m
[31m-  g->tmudata = NULL;[m
[31m-  g->totalbytes = sizeof(LG);[m
[31m-  g->gcpause = LUAI_GCPAUSE;[m
[31m-  g->gcstepmul = LUAI_GCMUL;[m
[31m-  g->gcdept = 0;[m
[31m-  for (i=0; i<NUM_TAGS; i++) g->mt[i] = NULL;[m
[31m-  if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) {[m
[31m-    /* memory allocation error: free partial state */[m
[31m-    close_state(L);[m
[31m-    L = NULL;[m
[31m-  }[m
[31m-  else[m
[31m-    luai_userstateopen(L);[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void callallgcTM (lua_State *L, void *ud) {[m
[31m-  UNUSED(ud);[m
[31m-  luaC_callGCTM(L);  /* call GC metamethods for all udata */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_close (lua_State *L) {[m
[31m-  L = G(L)->mainthread;  /* only the main thread can be closed */[m
[31m-  lua_lock(L);[m
[31m-  luaF_close(L, L->stack);  /* close all upvalues for this thread */[m
[31m-  luaC_separateudata(L, 1);  /* separate udata that have GC metamethods */[m
[31m-  L->errfunc = 0;  /* no error function during GC metamethods */[m
[31m-  do {  /* repeat until no more errors */[m
[31m-    L->ci = L->base_ci;[m
[31m-    L->base = L->top = L->ci->base;[m
[31m-    L->nCcalls = L->baseCcalls = 0;[m
[31m-  } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0);[m
[31m-  lua_assert(G(L)->tmudata == NULL);[m
[31m-  luai_userstateclose(L);[m
[31m-  close_state(L);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstate.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstate.h[m
[1mdeleted file mode 100644[m
[1mindex 3bc575b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstate.h[m
[1m+++ /dev/null[m
[36m@@ -1,169 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $[m
[31m-** Global State[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lstate_h[m
[31m-#define lstate_h[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-struct lua_longjmp;  /* defined in ldo.c */[m
[31m-[m
[31m-[m
[31m-/* table of globals */[m
[31m-#define gt(L)	(&L->l_gt)[m
[31m-[m
[31m-/* registry */[m
[31m-#define registry(L)	(&G(L)->l_registry)[m
[31m-[m
[31m-[m
[31m-/* extra stack space to handle TM calls and some other extras */[m
[31m-#define EXTRA_STACK   5[m
[31m-[m
[31m-[m
[31m-#define BASIC_CI_SIZE           8[m
[31m-[m
[31m-#define BASIC_STACK_SIZE        (2*LUA_MINSTACK)[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct stringtable {[m
[31m-  GCObject **hash;[m
[31m-  lu_int32 nuse;  /* number of elements */[m
[31m-  int size;[m
[31m-} stringtable;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** informations about a call[m
[31m-*/[m
[31m-typedef struct CallInfo {[m
[31m-  StkId base;  /* base for this function */[m
[31m-  StkId func;  /* function index in the stack */[m
[31m-  StkId	top;  /* top for this function */[m
[31m-  const Instruction *savedpc;[m
[31m-  int nresults;  /* expected number of results from this function */[m
[31m-  int tailcalls;  /* number of tail calls lost under this entry */[m
[31m-} CallInfo;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define curr_func(L)	(clvalue(L->ci->func))[m
[31m-#define ci_func(ci)	(clvalue((ci)->func))[m
[31m-#define f_isLua(ci)	(!ci_func(ci)->c.isC)[m
[31m-#define isLua(ci)	(ttisfunction((ci)->func) && f_isLua(ci))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `global state', shared by all threads of this state[m
[31m-*/[m
[31m-typedef struct global_State {[m
[31m-  stringtable strt;  /* hash table for strings */[m
[31m-  lua_Alloc frealloc;  /* function to reallocate memory */[m
[31m-  void *ud;         /* auxiliary data to `frealloc' */[m
[31m-  lu_byte currentwhite;[m
[31m-  lu_byte gcstate;  /* state of garbage collector */[m
[31m-  int sweepstrgc;  /* position of sweep in `strt' */[m
[31m-  GCObject *rootgc;  /* list of all collectable objects */[m
[31m-  GCObject **sweepgc;  /* position of sweep in `rootgc' */[m
[31m-  GCObject *gray;  /* list of gray objects */[m
[31m-  GCObject *grayagain;  /* list of objects to be traversed atomically */[m
[31m-  GCObject *weak;  /* list of weak tables (to be cleared) */[m
[31m-  GCObject *tmudata;  /* last element of list of userdata to be GC */[m
[31m-  Mbuffer buff;  /* temporary buffer for string concatentation */[m
[31m-  lu_mem GCthreshold;[m
[31m-  lu_mem totalbytes;  /* number of bytes currently allocated */[m
[31m-  lu_mem estimate;  /* an estimate of number of bytes actually in use */[m
[31m-  lu_mem gcdept;  /* how much GC is `behind schedule' */[m
[31m-  int gcpause;  /* size of pause between successive GCs */[m
[31m-  int gcstepmul;  /* GC `granularity' */[m
[31m-  lua_CFunction panic;  /* to be called in unprotected errors */[m
[31m-  TValue l_registry;[m
[31m-  struct lua_State *mainthread;[m
[31m-  UpVal uvhead;  /* head of double-linked list of all open upvalues */[m
[31m-  struct Table *mt[NUM_TAGS];  /* metatables for basic types */[m
[31m-  TString *tmname[TM_N];  /* array with tag-method names */[m
[31m-} global_State;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `per thread' state[m
[31m-*/[m
[31m-struct lua_State {[m
[31m-  CommonHeader;[m
[31m-  lu_byte status;[m
[31m-  StkId top;  /* first free slot in the stack */[m
[31m-  StkId base;  /* base of current function */[m
[31m-  global_State *l_G;[m
[31m-  CallInfo *ci;  /* call info for current function */[m
[31m-  const Instruction *savedpc;  /* `savedpc' of current function */[m
[31m-  StkId stack_last;  /* last free slot in the stack */[m
[31m-  StkId stack;  /* stack base */[m
[31m-  CallInfo *end_ci;  /* points after end of ci array*/[m
[31m-  CallInfo *base_ci;  /* array of CallInfo's */[m
[31m-  int stacksize;[m
[31m-  int size_ci;  /* size of array `base_ci' */[m
[31m-  unsigned short nCcalls;  /* number of nested C calls */[m
[31m-  unsigned short baseCcalls;  /* nested C calls when resuming coroutine */[m
[31m-  lu_byte hookmask;[m
[31m-  lu_byte allowhook;[m
[31m-  int basehookcount;[m
[31m-  int hookcount;[m
[31m-  lua_Hook hook;[m
[31m-  TValue l_gt;  /* table of globals */[m
[31m-  TValue env;  /* temporary place for environments */[m
[31m-  GCObject *openupval;  /* list of open upvalues in this stack */[m
[31m-  GCObject *gclist;[m
[31m-  struct lua_longjmp *errorJmp;  /* current error recover point */[m
[31m-  ptrdiff_t errfunc;  /* current error handling function (stack index) */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define G(L)	(L->l_G)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Union of all collectable objects[m
[31m-*/[m
[31m-union GCObject {[m
[31m-  GCheader gch;[m
[31m-  union TString ts;[m
[31m-  union Udata u;[m
[31m-  union Closure cl;[m
[31m-  struct Table h;[m
[31m-  struct Proto p;[m
[31m-  struct UpVal uv;[m
[31m-  struct lua_State th;  /* thread */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* macros to convert a GCObject into a specific value */[m
[31m-#define rawgco2ts(o)	check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts))[m
[31m-#define gco2ts(o)	(&rawgco2ts(o)->tsv)[m
[31m-#define rawgco2u(o)	check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u))[m
[31m-#define gco2u(o)	(&rawgco2u(o)->uv)[m
[31m-#define gco2cl(o)	check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl))[m
[31m-#define gco2h(o)	check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h))[m
[31m-#define gco2p(o)	check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p))[m
[31m-#define gco2uv(o)	check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv))[m
[31m-#define ngcotouv(o) \[m
[31m-	check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv))[m
[31m-#define gco2th(o)	check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th))[m
[31m-[m
[31m-/* macro to convert any Lua object into a GCObject */[m
[31m-#define obj2gco(v)	(cast(GCObject *, (v)))[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC lua_State *luaE_newthread (lua_State *L);[m
[31m-LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstring.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstring.c[m
[1mdeleted file mode 100644[m
[1mindex 4911315..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstring.c[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** String table (keeps all strings handled by Lua)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lstring_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-void luaS_resize (lua_State *L, int newsize) {[m
[31m-  GCObject **newhash;[m
[31m-  stringtable *tb;[m
[31m-  int i;[m
[31m-  if (G(L)->gcstate == GCSsweepstring)[m
[31m-    return;  /* cannot resize during GC traverse */[m
[31m-  newhash = luaM_newvector(L, newsize, GCObject *);[m
[31m-  tb = &G(L)->strt;[m
[31m-  for (i=0; i<newsize; i++) newhash[i] = NULL;[m
[31m-  /* rehash */[m
[31m-  for (i=0; i<tb->size; i++) {[m
[31m-    GCObject *p = tb->hash[i];[m
[31m-    while (p) {  /* for each node in the list */[m
[31m-      GCObject *next = p->gch.next;  /* save next */[m
[31m-      unsigned int h = gco2ts(p)->hash;[m
[31m-      int h1 = lmod(h, newsize);  /* new position */[m
[31m-      lua_assert(cast_int(h%newsize) == lmod(h, newsize));[m
[31m-      p->gch.next = newhash[h1];  /* chain it */[m
[31m-      newhash[h1] = p;[m
[31m-      p = next;[m
[31m-    }[m
[31m-  }[m
[31m-  luaM_freearray(L, tb->hash, tb->size, TString *);[m
[31m-  tb->size = newsize;[m
[31m-  tb->hash = newhash;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static TString *newlstr (lua_State *L, const char *str, size_t l,[m
[31m-                                       unsigned int h) {[m
[31m-  TString *ts;[m
[31m-  stringtable *tb;[m
[31m-  if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))[m
[31m-    luaM_toobig(L);[m
[31m-  ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString)));[m
[31m-  ts->tsv.len = l;[m
[31m-  ts->tsv.hash = h;[m
[31m-  ts->tsv.marked = luaC_white(G(L));[m
[31m-  ts->tsv.tt = LUA_TSTRING;[m
[31m-  ts->tsv.reserved = 0;[m
[31m-  memcpy(ts+1, str, l*sizeof(char));[m
[31m-  ((char *)(ts+1))[l] = '\0';  /* ending 0 */[m
[31m-  tb = &G(L)->strt;[m
[31m-  h = lmod(h, tb->size);[m
[31m-  ts->tsv.next = tb->hash[h];  /* chain new entry */[m
[31m-  tb->hash[h] = obj2gco(ts);[m
[31m-  tb->nuse++;[m
[31m-  if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= MAX_INT/2)[m
[31m-    luaS_resize(L, tb->size*2);  /* too crowded */[m
[31m-  return ts;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {[m
[31m-  GCObject *o;[m
[31m-  unsigned int h = cast(unsigned int, l);  /* seed */[m
[31m-  size_t step = (l>>5)+1;  /* if string is too long, don't hash all its chars */[m
[31m-  size_t l1;[m
[31m-  for (l1=l; l1>=step; l1-=step)  /* compute hash */[m
[31m-    h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1]));[m
[31m-  for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)];[m
[31m-       o != NULL;[m
[31m-       o = o->gch.next) {[m
[31m-    TString *ts = rawgco2ts(o);[m
[31m-    if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) {[m
[31m-      /* string may be dead */[m
[31m-      if (isdead(G(L), o)) changewhite(o);[m
[31m-      return ts;[m
[31m-    }[m
[31m-  }[m
[31m-  return newlstr(L, str, l, h);  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {[m
[31m-  Udata *u;[m
[31m-  if (s > MAX_SIZET - sizeof(Udata))[m
[31m-    luaM_toobig(L);[m
[31m-  u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata)));[m
[31m-  u->uv.marked = luaC_white(G(L));  /* is not finalized */[m
[31m-  u->uv.tt = LUA_TUSERDATA;[m
[31m-  u->uv.len = s;[m
[31m-  u->uv.metatable = NULL;[m
[31m-  u->uv.env = e;[m
[31m-  /* chain it on udata list (after main thread) */[m
[31m-  u->uv.next = G(L)->mainthread->next;[m
[31m-  G(L)->mainthread->next = obj2gco(u);[m
[31m-  return u;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstring.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstring.h[m
[1mdeleted file mode 100644[m
[1mindex 73a2ff8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstring.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** String table (keep all strings handled by Lua)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lstring_h[m
[31m-#define lstring_h[m
[31m-[m
[31m-[m
[31m-#include "lgc.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-[m
[31m-[m
[31m-#define sizestring(s)	(sizeof(union TString)+((s)->len+1)*sizeof(char))[m
[31m-[m
[31m-#define sizeudata(u)	(sizeof(union Udata)+(u)->len)[m
[31m-[m
[31m-#define luaS_new(L, s)	(luaS_newlstr(L, s, strlen(s)))[m
[31m-#define luaS_newliteral(L, s)	(luaS_newlstr(L, "" s, \[m
[31m-                                 (sizeof(s)/sizeof(char))-1))[m
[31m-[m
[31m-#define luaS_fix(s)	l_setbit((s)->tsv.marked, FIXEDBIT)[m
[31m-[m
[31m-LUAI_FUNC void luaS_resize (lua_State *L, int newsize);[m
[31m-LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e);[m
[31m-LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstrlib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstrlib.c[m
[1mdeleted file mode 100644[m
[1mindex 7a03489..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lstrlib.c[m
[1m+++ /dev/null[m
[36m@@ -1,871 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstrlib.c,v 1.132.1.5 2010/05/14 15:34:19 roberto Exp $[m
[31m-** Standard library for string operations and pattern-matching[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <stddef.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lstrlib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-/* macro to `unsign' a character */[m
[31m-#define uchar(c)        ((unsigned char)(c))[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int str_len (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  luaL_checklstring(L, 1, &l);[m
[31m-  lua_pushinteger(L, l);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {[m
[31m-  /* relative string position: negative means back from end */[m
[31m-  if (pos < 0) pos += (ptrdiff_t)len + 1;[m
[31m-  return (pos >= 0) ? pos : 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_sub (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l);[m
[31m-  ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l);[m
[31m-  if (start < 1) start = 1;[m
[31m-  if (end > (ptrdiff_t)l) end = (ptrdiff_t)l;[m
[31m-  if (start <= end)[m
[31m-    lua_pushlstring(L, s+start-1, end-start+1);[m
[31m-  else lua_pushliteral(L, "");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_reverse (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  luaL_Buffer b;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while (l--) luaL_addchar(&b, s[l]);[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_lower (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  size_t i;[m
[31m-  luaL_Buffer b;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (i=0; i<l; i++)[m
[31m-    luaL_addchar(&b, tolower(uchar(s[i])));[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_upper (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  size_t i;[m
[31m-  luaL_Buffer b;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (i=0; i<l; i++)[m
[31m-    luaL_addchar(&b, toupper(uchar(s[i])));[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int str_rep (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  luaL_Buffer b;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  int n = luaL_checkint(L, 2);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while (n-- > 0)[m
[31m-    luaL_addlstring(&b, s, l);[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_byte (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l);[m
[31m-  ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l);[m
[31m-  int n, i;[m
[31m-  if (posi <= 0) posi = 1;[m
[31m-  if ((size_t)pose > l) pose = l;[m
[31m-  if (posi > pose) return 0;  /* empty interval; return no values */[m
[31m-  n = (int)(pose -  posi + 1);[m
[31m-  if (posi + n <= pose)  /* overflow? */[m
[31m-    luaL_error(L, "string slice too long");[m
[31m-  luaL_checkstack(L, n, "string slice too long");[m
[31m-  for (i=0; i<n; i++)[m
[31m-    lua_pushinteger(L, uchar(s[posi+i-1]));[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_char (lua_State *L) {[m
[31m-  int n = lua_gettop(L);  /* number of arguments */[m
[31m-  int i;[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (i=1; i<=n; i++) {[m
[31m-    int c = luaL_checkint(L, i);[m
[31m-    luaL_argcheck(L, uchar(c) == c, i, "invalid value");[m
[31m-    luaL_addchar(&b, uchar(c));[m
[31m-  }[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int writer (lua_State *L, const void* b, size_t size, void* B) {[m
[31m-  (void)L;[m
[31m-  luaL_addlstring((luaL_Buffer*) B, (const char *)b, size);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_dump (lua_State *L) {[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_checktype(L, 1, LUA_TFUNCTION);[m
[31m-  lua_settop(L, 1);[m
[31m-  luaL_buffinit(L,&b);[m
[31m-  if (lua_dump(L, writer, &b) != 0)[m
[31m-    luaL_error(L, "unable to dump given function");[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** PATTERN MATCHING[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define CAP_UNFINISHED	(-1)[m
[31m-#define CAP_POSITION	(-2)[m
[31m-[m
[31m-typedef struct MatchState {[m
[31m-  const char *src_init;  /* init of source string */[m
[31m-  const char *src_end;  /* end (`\0') of source string */[m
[31m-  lua_State *L;[m
[31m-  int level;  /* total number of captures (finished or unfinished) */[m
[31m-  struct {[m
[31m-    const char *init;[m
[31m-    ptrdiff_t len;[m
[31m-  } capture[LUA_MAXCAPTURES];[m
[31m-} MatchState;[m
[31m-[m
[31m-[m
[31m-#define L_ESC		'%'[m
[31m-#define SPECIALS	"^$*+?.([%-"[m
[31m-[m
[31m-[m
[31m-static int check_capture (MatchState *ms, int l) {[m
[31m-  l -= '1';[m
[31m-  if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)[m
[31m-    return luaL_error(ms->L, "invalid capture index");[m
[31m-  return l;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int capture_to_close (MatchState *ms) {[m
[31m-  int level = ms->level;[m
[31m-  for (level--; level>=0; level--)[m
[31m-    if (ms->capture[level].len == CAP_UNFINISHED) return level;[m
[31m-  return luaL_error(ms->L, "invalid pattern capture");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *classend (MatchState *ms, const char *p) {[m
[31m-  switch (*p++) {[m
[31m-    case L_ESC: {[m
[31m-      if (*p == '\0')[m
[31m-        luaL_error(ms->L, "malformed pattern (ends with " LUA_QL("%%") ")");[m
[31m-      return p+1;[m
[31m-    }[m
[31m-    case '[': {[m
[31m-      if (*p == '^') p++;[m
[31m-      do {  /* look for a `]' */[m
[31m-        if (*p == '\0')[m
[31m-          luaL_error(ms->L, "malformed pattern (missing " LUA_QL("]") ")");[m
[31m-        if (*(p++) == L_ESC && *p != '\0')[m
[31m-          p++;  /* skip escapes (e.g. `%]') */[m
[31m-      } while (*p != ']');[m
[31m-      return p+1;[m
[31m-    }[m
[31m-    default: {[m
[31m-      return p;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int match_class (int c, int cl) {[m
[31m-  int res;[m
[31m-  switch (tolower(cl)) {[m
[31m-    case 'a' : res = isalpha(c); break;[m
[31m-    case 'c' : res = iscntrl(c); break;[m
[31m-    case 'd' : res = isdigit(c); break;[m
[31m-    case 'l' : res = islower(c); break;[m
[31m-    case 'p' : res = ispunct(c); break;[m
[31m-    case 's' : res = isspace(c); break;[m
[31m-    case 'u' : res = isupper(c); break;[m
[31m-    case 'w' : res = isalnum(c); break;[m
[31m-    case 'x' : res = isxdigit(c); break;[m
[31m-    case 'z' : res = (c == 0); break;[m
[31m-    default: return (cl == c);[m
[31m-  }[m
[31m-  return (islower(cl) ? res : !res);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int matchbracketclass (int c, const char *p, const char *ec) {[m
[31m-  int sig = 1;[m
[31m-  if (*(p+1) == '^') {[m
[31m-    sig = 0;[m
[31m-    p++;  /* skip the `^' */[m
[31m-  }[m
[31m-  while (++p < ec) {[m
[31m-    if (*p == L_ESC) {[m
[31m-      p++;[m
[31m-      if (match_class(c, uchar(*p)))[m
[31m-        return sig;[m
[31m-    }[m
[31m-    else if ((*(p+1) == '-') && (p+2 < ec)) {[m
[31m-      p+=2;[m
[31m-      if (uchar(*(p-2)) <= c && c <= uchar(*p))[m
[31m-        return sig;[m
[31m-    }[m
[31m-    else if (uchar(*p) == c) return sig;[m
[31m-  }[m
[31m-  return !sig;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int singlematch (int c, const char *p, const char *ep) {[m
[31m-  switch (*p) {[m
[31m-    case '.': return 1;  /* matches any char */[m
[31m-    case L_ESC: return match_class(c, uchar(*(p+1)));[m
[31m-    case '[': return matchbracketclass(c, p, ep-1);[m
[31m-    default:  return (uchar(*p) == c);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *match (MatchState *ms, const char *s, const char *p);[m
[31m-[m
[31m-[m
[31m-static const char *matchbalance (MatchState *ms, const char *s,[m
[31m-                                   const char *p) {[m
[31m-  if (*p == 0 || *(p+1) == 0)[m
[31m-    luaL_error(ms->L, "unbalanced pattern");[m
[31m-  if (*s != *p) return NULL;[m
[31m-  else {[m
[31m-    int b = *p;[m
[31m-    int e = *(p+1);[m
[31m-    int cont = 1;[m
[31m-    while (++s < ms->src_end) {[m
[31m-      if (*s == e) {[m
[31m-        if (--cont == 0) return s+1;[m
[31m-      }[m
[31m-      else if (*s == b) cont++;[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* string ends out of balance */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *max_expand (MatchState *ms, const char *s,[m
[31m-                                 const char *p, const char *ep) {[m
[31m-  ptrdiff_t i = 0;  /* counts maximum expand for item */[m
[31m-  while ((s+i)<ms->src_end && singlematch(uchar(*(s+i)), p, ep))[m
[31m-    i++;[m
[31m-  /* keeps trying to match with the maximum repetitions */[m
[31m-  while (i>=0) {[m
[31m-    const char *res = match(ms, (s+i), ep+1);[m
[31m-    if (res) return res;[m
[31m-    i--;  /* else didn't match; reduce 1 repetition to try again */[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *min_expand (MatchState *ms, const char *s,[m
[31m-                                 const char *p, const char *ep) {[m
[31m-  for (;;) {[m
[31m-    const char *res = match(ms, s, ep+1);[m
[31m-    if (res != NULL)[m
[31m-      return res;[m
[31m-    else if (s<ms->src_end && singlematch(uchar(*s), p, ep))[m
[31m-      s++;  /* try with one more repetition */[m
[31m-    else return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *start_capture (MatchState *ms, const char *s,[m
[31m-                                    const char *p, int what) {[m
[31m-  const char *res;[m
[31m-  int level = ms->level;[m
[31m-  if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures");[m
[31m-  ms->capture[level].init = s;[m
[31m-  ms->capture[level].len = what;[m
[31m-  ms->level = level+1;[m
[31m-  if ((res=match(ms, s, p)) == NULL)  /* match failed? */[m
[31m-    ms->level--;  /* undo capture */[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *end_capture (MatchState *ms, const char *s,[m
[31m-                                  const char *p) {[m
[31m-  int l = capture_to_close(ms);[m
[31m-  const char *res;[m
[31m-  ms->capture[l].len = s - ms->capture[l].init;  /* close capture */[m
[31m-  if ((res = match(ms, s, p)) == NULL)  /* match failed? */[m
[31m-    ms->capture[l].len = CAP_UNFINISHED;  /* undo capture */[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *match_capture (MatchState *ms, const char *s, int l) {[m
[31m-  size_t len;[m
[31m-  l = check_capture(ms, l);[m
[31m-  len = ms->capture[l].len;[m
[31m-  if ((size_t)(ms->src_end-s) >= len &&[m
[31m-      memcmp(ms->capture[l].init, s, len) == 0)[m
[31m-    return s+len;[m
[31m-  else return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *match (MatchState *ms, const char *s, const char *p) {[m
[31m-  init: /* using goto's to optimize tail recursion */[m
[31m-  switch (*p) {[m
[31m-    case '(': {  /* start capture */[m
[31m-      if (*(p+1) == ')')  /* position capture? */[m
[31m-        return start_capture(ms, s, p+2, CAP_POSITION);[m
[31m-      else[m
[31m-        return start_capture(ms, s, p+1, CAP_UNFINISHED);[m
[31m-    }[m
[31m-    case ')': {  /* end capture */[m
[31m-      return end_capture(ms, s, p+1);[m
[31m-    }[m
[31m-    case L_ESC: {[m
[31m-      switch (*(p+1)) {[m
[31m-        case 'b': {  /* balanced string? */[m
[31m-          s = matchbalance(ms, s, p+2);[m
[31m-          if (s == NULL) return NULL;[m
[31m-          p+=4; goto init;  /* else return match(ms, s, p+4); */[m
[31m-        }[m
[31m-        case 'f': {  /* frontier? */[m
[31m-          const char *ep; char previous;[m
[31m-          p += 2;[m
[31m-          if (*p != '[')[m
[31m-            luaL_error(ms->L, "missing " LUA_QL("[") " after "[m
[31m-                               LUA_QL("%%f") " in pattern");[m
[31m-          ep = classend(ms, p);  /* points to what is next */[m
[31m-          previous = (s == ms->src_init) ? '\0' : *(s-1);[m
[31m-          if (matchbracketclass(uchar(previous), p, ep-1) ||[m
[31m-             !matchbracketclass(uchar(*s), p, ep-1)) return NULL;[m
[31m-          p=ep; goto init;  /* else return match(ms, s, ep); */[m
[31m-        }[m
[31m-        default: {[m
[31m-          if (isdigit(uchar(*(p+1)))) {  /* capture results (%0-%9)? */[m
[31m-            s = match_capture(ms, s, uchar(*(p+1)));[m
[31m-            if (s == NULL) return NULL;[m
[31m-            p+=2; goto init;  /* else return match(ms, s, p+2) */[m
[31m-          }[m
[31m-          goto dflt;  /* case default */[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-    case '\0': {  /* end of pattern */[m
[31m-      return s;  /* match succeeded */[m
[31m-    }[m
[31m-    case '$': {[m
[31m-      if (*(p+1) == '\0')  /* is the `$' the last char in pattern? */[m
[31m-        return (s == ms->src_end) ? s : NULL;  /* check end of string */[m
[31m-      else goto dflt;[m
[31m-    }[m
[31m-    default: dflt: {  /* it is a pattern item */[m
[31m-      const char *ep = classend(ms, p);  /* points to what is next */[m
[31m-      int m = s<ms->src_end && singlematch(uchar(*s), p, ep);[m
[31m-      switch (*ep) {[m
[31m-        case '?': {  /* optional */[m
[31m-          const char *res;[m
[31m-          if (m && ((res=match(ms, s+1, ep+1)) != NULL))[m
[31m-            return res;[m
[31m-          p=ep+1; goto init;  /* else return match(ms, s, ep+1); */[m
[31m-        }[m
[31m-        case '*': {  /* 0 or more repetitions */[m
[31m-          return max_expand(ms, s, p, ep);[m
[31m-        }[m
[31m-        case '+': {  /* 1 or more repetitions */[m
[31m-          return (m ? max_expand(ms, s+1, p, ep) : NULL);[m
[31m-        }[m
[31m-        case '-': {  /* 0 or more repetitions (minimum) */[m
[31m-          return min_expand(ms, s, p, ep);[m
[31m-        }[m
[31m-        default: {[m
[31m-          if (!m) return NULL;[m
[31m-          s++; p=ep; goto init;  /* else return match(ms, s+1, ep); */[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static const char *lmemfind (const char *s1, size_t l1,[m
[31m-                               const char *s2, size_t l2) {[m
[31m-  if (l2 == 0) return s1;  /* empty strings are everywhere */[m
[31m-  else if (l2 > l1) return NULL;  /* avoids a negative `l1' */[m
[31m-  else {[m
[31m-    const char *init;  /* to search for a `*s2' inside `s1' */[m
[31m-    l2--;  /* 1st char will be checked by `memchr' */[m
[31m-    l1 = l1-l2;  /* `s2' cannot be found after that */[m
[31m-    while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) {[m
[31m-      init++;   /* 1st char is already checked */[m
[31m-      if (memcmp(init, s2+1, l2) == 0)[m
[31m-        return init-1;[m
[31m-      else {  /* correct `l1' and `s1' to try again */[m
[31m-        l1 -= init-s1;[m
[31m-        s1 = init;[m
[31m-      }[m
[31m-    }[m
[31m-    return NULL;  /* not found */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void push_onecapture (MatchState *ms, int i, const char *s,[m
[31m-                                                    const char *e) {[m
[31m-  if (i >= ms->level) {[m
[31m-    if (i == 0)  /* ms->level == 0, too */[m
[31m-      lua_pushlstring(ms->L, s, e - s);  /* add whole match */[m
[31m-    else[m
[31m-      luaL_error(ms->L, "invalid capture index");[m
[31m-  }[m
[31m-  else {[m
[31m-    ptrdiff_t l = ms->capture[i].len;[m
[31m-    if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture");[m
[31m-    if (l == CAP_POSITION)[m
[31m-      lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1);[m
[31m-    else[m
[31m-      lua_pushlstring(ms->L, ms->capture[i].init, l);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int push_captures (MatchState *ms, const char *s, const char *e) {[m
[31m-  int i;[m
[31m-  int nlevels = (ms->level == 0 && s) ? 1 : ms->level;[m
[31m-  luaL_checkstack(ms->L, nlevels, "too many captures");[m
[31m-  for (i = 0; i < nlevels; i++)[m
[31m-    push_onecapture(ms, i, s, e);[m
[31m-  return nlevels;  /* number of strings pushed */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_find_aux (lua_State *L, int find) {[m
[31m-  size_t l1, l2;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l1);[m
[31m-  const char *p = luaL_checklstring(L, 2, &l2);[m
[31m-  ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1;[m
[31m-  if (init < 0) init = 0;[m
[31m-  else if ((size_t)(init) > l1) init = (ptrdiff_t)l1;[m
[31m-  if (find && (lua_toboolean(L, 4) ||  /* explicit request? */[m
[31m-      strpbrk(p, SPECIALS) == NULL)) {  /* or no special characters? */[m
[31m-    /* do a plain search */[m
[31m-    const char *s2 = lmemfind(s+init, l1-init, p, l2);[m
[31m-    if (s2) {[m
[31m-      lua_pushinteger(L, s2-s+1);[m
[31m-      lua_pushinteger(L, s2-s+l2);[m
[31m-      return 2;[m
[31m-    }[m
[31m-  }[m
[31m-  else {[m
[31m-    MatchState ms;[m
[31m-    int anchor = (*p == '^') ? (p++, 1) : 0;[m
[31m-    const char *s1=s+init;[m
[31m-    ms.L = L;[m
[31m-    ms.src_init = s;[m
[31m-    ms.src_end = s+l1;[m
[31m-    do {[m
[31m-      const char *res;[m
[31m-      ms.level = 0;[m
[31m-      if ((res=match(&ms, s1, p)) != NULL) {[m
[31m-        if (find) {[m
[31m-          lua_pushinteger(L, s1-s+1);  /* start */[m
[31m-          lua_pushinteger(L, res-s);   /* end */[m
[31m-          return push_captures(&ms, NULL, 0) + 2;[m
[31m-        }[m
[31m-        else[m
[31m-          return push_captures(&ms, s1, res);[m
[31m-      }[m
[31m-    } while (s1++ < ms.src_end && !anchor);[m
[31m-  }[m
[31m-  lua_pushnil(L);  /* not found */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_find (lua_State *L) {[m
[31m-  return str_find_aux(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_match (lua_State *L) {[m
[31m-  return str_find_aux(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int gmatch_aux (lua_State *L) {[m
[31m-  MatchState ms;[m
[31m-  size_t ls;[m
[31m-  const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls);[m
[31m-  const char *p = lua_tostring(L, lua_upvalueindex(2));[m
[31m-  const char *src;[m
[31m-  ms.L = L;[m
[31m-  ms.src_init = s;[m
[31m-  ms.src_end = s+ls;[m
[31m-  for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3));[m
[31m-       src <= ms.src_end;[m
[31m-       src++) {[m
[31m-    const char *e;[m
[31m-    ms.level = 0;[m
[31m-    if ((e = match(&ms, src, p)) != NULL) {[m
[31m-      lua_Integer newstart = e-s;[m
[31m-      if (e == src) newstart++;  /* empty match? go at least one position */[m
[31m-      lua_pushinteger(L, newstart);[m
[31m-      lua_replace(L, lua_upvalueindex(3));[m
[31m-      return push_captures(&ms, src, e);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int gmatch (lua_State *L) {[m
[31m-  luaL_checkstring(L, 1);[m
[31m-  luaL_checkstring(L, 2);[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_pushinteger(L, 0);[m
[31m-  lua_pushcclosure(L, gmatch_aux, 3);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int gfind_nodef (lua_State *L) {[m
[31m-  return luaL_error(L, LUA_QL("string.gfind") " was renamed to "[m
[31m-                       LUA_QL("string.gmatch"));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void add_s (MatchState *ms, luaL_Buffer *b, const char *s,[m
[31m-                                                   const char *e) {[m
[31m-  size_t l, i;[m
[31m-  const char *news = lua_tolstring(ms->L, 3, &l);[m
[31m-  for (i = 0; i < l; i++) {[m
[31m-    if (news[i] != L_ESC)[m
[31m-      luaL_addchar(b, news[i]);[m
[31m-    else {[m
[31m-      i++;  /* skip ESC */[m
[31m-      if (!isdigit(uchar(news[i])))[m
[31m-        luaL_addchar(b, news[i]);[m
[31m-      else if (news[i] == '0')[m
[31m-          luaL_addlstring(b, s, e - s);[m
[31m-      else {[m
[31m-        push_onecapture(ms, news[i] - '1', s, e);[m
[31m-        luaL_addvalue(b);  /* add capture to accumulated result */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,[m
[31m-                                                       const char *e) {[m
[31m-  lua_State *L = ms->L;[m
[31m-  switch (lua_type(L, 3)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-    case LUA_TSTRING: {[m
[31m-      add_s(ms, b, s, e);[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TFUNCTION: {[m
[31m-      int n;[m
[31m-      lua_pushvalue(L, 3);[m
[31m-      n = push_captures(ms, s, e);[m
[31m-      lua_call(L, n, 1);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TTABLE: {[m
[31m-      push_onecapture(ms, 0, s, e);[m
[31m-      lua_gettable(L, 3);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  if (!lua_toboolean(L, -1)) {  /* nil or false? */[m
[31m-    lua_pop(L, 1);[m
[31m-    lua_pushlstring(L, s, e - s);  /* keep original text */[m
[31m-  }[m
[31m-  else if (!lua_isstring(L, -1))[m
[31m-    luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); [m
[31m-  luaL_addvalue(b);  /* add result to accumulator */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_gsub (lua_State *L) {[m
[31m-  size_t srcl;[m
[31m-  const char *src = luaL_checklstring(L, 1, &srcl);[m
[31m-  const char *p = luaL_checkstring(L, 2);[m
[31m-  int  tr = lua_type(L, 3);[m
[31m-  int max_s = luaL_optint(L, 4, srcl+1);[m
[31m-  int anchor = (*p == '^') ? (p++, 1) : 0;[m
[31m-  int n = 0;[m
[31m-  MatchState ms;[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||[m
[31m-                   tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,[m
[31m-                      "string/function/table expected");[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  ms.L = L;[m
[31m-  ms.src_init = src;[m
[31m-  ms.src_end = src+srcl;[m
[31m-  while (n < max_s) {[m
[31m-    const char *e;[m
[31m-    ms.level = 0;[m
[31m-    e = match(&ms, src, p);[m
[31m-    if (e) {[m
[31m-      n++;[m
[31m-      add_value(&ms, &b, src, e);[m
[31m-    }[m
[31m-    if (e && e>src) /* non empty match? */[m
[31m-      src = e;  /* skip it */[m
[31m-    else if (src < ms.src_end)[m
[31m-      luaL_addchar(&b, *src++);[m
[31m-    else break;[m
[31m-    if (anchor) break;[m
[31m-  }[m
[31m-  luaL_addlstring(&b, src, ms.src_end-src);[m
[31m-  luaL_pushresult(&b);[m
[31m-  lua_pushinteger(L, n);  /* number of substitutions */[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */[m
[31m-#define MAX_ITEM	512[m
[31m-/* valid flags in a format specification */[m
[31m-#define FLAGS	"-+ #0"[m
[31m-/*[m
[31m-** maximum size of each format specification (such as '%-099.99d')[m
[31m-** (+10 accounts for %99.99x plus margin of error)[m
[31m-*/[m
[31m-#define MAX_FORMAT	(sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10)[m
[31m-[m
[31m-[m
[31m-static void addquoted (lua_State *L, luaL_Buffer *b, int arg) {[m
[31m-  size_t l;[m
[31m-  const char *s = luaL_checklstring(L, arg, &l);[m
[31m-  luaL_addchar(b, '"');[m
[31m-  while (l--) {[m
[31m-    switch (*s) {[m
[31m-      case '"': case '\\': case '\n': {[m
[31m-        luaL_addchar(b, '\\');[m
[31m-        luaL_addchar(b, *s);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '\r': {[m
[31m-        luaL_addlstring(b, "\\r", 2);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '\0': {[m
[31m-        luaL_addlstring(b, "\\000", 4);[m
[31m-        break;[m
[31m-      }[m
[31m-      default: {[m
[31m-        luaL_addchar(b, *s);[m
[31m-        break;[m
[31m-      }[m
[31m-    }[m
[31m-    s++;[m
[31m-  }[m
[31m-  luaL_addchar(b, '"');[m
[31m-}[m
[31m-[m
[31m-static const char *scanformat (lua_State *L, const char *strfrmt, char *form) {[m
[31m-  const char *p = strfrmt;[m
[31m-  while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++;  /* skip flags */[m
[31m-  if ((size_t)(p - strfrmt) >= sizeof(FLAGS))[m
[31m-    luaL_error(L, "invalid format (repeated flags)");[m
[31m-  if (isdigit(uchar(*p))) p++;  /* skip width */[m
[31m-  if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */[m
[31m-  if (*p == '.') {[m
[31m-    p++;[m
[31m-    if (isdigit(uchar(*p))) p++;  /* skip precision */[m
[31m-    if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */[m
[31m-  }[m
[31m-  if (isdigit(uchar(*p)))[m
[31m-    luaL_error(L, "invalid format (width or precision too long)");[m
[31m-  *(form++) = '%';[m
[31m-  strncpy(form, strfrmt, p - strfrmt + 1);[m
[31m-  form += p - strfrmt + 1;[m
[31m-  *form = '\0';[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void addintlen (char *form) {[m
[31m-  size_t l = strlen(form);[m
[31m-  char spec = form[l - 1];[m
[31m-  strcpy(form + l - 1, LUA_INTFRMLEN);[m
[31m-  form[l + sizeof(LUA_INTFRMLEN) - 2] = spec;[m
[31m-  form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0';[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_format (lua_State *L) {[m
[31m-  int top = lua_gettop(L);[m
[31m-  int arg = 1;[m
[31m-  size_t sfl;[m
[31m-  const char *strfrmt = luaL_checklstring(L, arg, &sfl);[m
[31m-  const char *strfrmt_end = strfrmt+sfl;[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while (strfrmt < strfrmt_end) {[m
[31m-    if (*strfrmt != L_ESC)[m
[31m-      luaL_addchar(&b, *strfrmt++);[m
[31m-    else if (*++strfrmt == L_ESC)[m
[31m-      luaL_addchar(&b, *strfrmt++);  /* %% */[m
[31m-    else { /* format item */[m
[31m-      char form[MAX_FORMAT];  /* to store the format (`%...') */[m
[31m-      char buff[MAX_ITEM];  /* to store the formatted item */[m
[31m-      if (++arg > top)[m
[31m-        luaL_argerror(L, arg, "no value");[m
[31m-      strfrmt = scanformat(L, strfrmt, form);[m
[31m-      switch (*strfrmt++) {[m
[31m-        case 'c': {[m
[31m-          sprintf(buff, form, (int)luaL_checknumber(L, arg));[m
[31m-          break;[m
[31m-        }[m
[31m-        case 'd':  case 'i': {[m
[31m-          addintlen(form);[m
[31m-          sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg));[m
[31m-          break;[m
[31m-        }[m
[31m-        case 'o':  case 'u':  case 'x':  case 'X': {[m
[31m-          addintlen(form);[m
[31m-          sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg));[m
[31m-          break;[m
[31m-        }[m
[31m-        case 'e':  case 'E': case 'f':[m
[31m-        case 'g': case 'G': {[m
[31m-          sprintf(buff, form, (double)luaL_checknumber(L, arg));[m
[31m-          break;[m
[31m-        }[m
[31m-        case 'q': {[m
[31m-          addquoted(L, &b, arg);[m
[31m-          continue;  /* skip the 'addsize' at the end */[m
[31m-        }[m
[31m-        case 's': {[m
[31m-          size_t l;[m
[31m-          const char *s = luaL_checklstring(L, arg, &l);[m
[31m-          if (!strchr(form, '.') && l >= 100) {[m
[31m-            /* no precision and string is too long to be formatted;[m
[31m-               keep original string */[m
[31m-            lua_pushvalue(L, arg);[m
[31m-            luaL_addvalue(&b);[m
[31m-            continue;  /* skip the `addsize' at the end */[m
[31m-          }[m
[31m-          else {[m
[31m-            sprintf(buff, form, s);[m
[31m-            break;[m
[31m-          }[m
[31m-        }[m
[31m-        default: {  /* also treat cases `pnLlh' */[m
[31m-          return luaL_error(L, "invalid option " LUA_QL("%%%c") " to "[m
[31m-                               LUA_QL("format"), *(strfrmt - 1));[m
[31m-        }[m
[31m-      }[m
[31m-      luaL_addlstring(&b, buff, strlen(buff));[m
[31m-    }[m
[31m-  }[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg strlib[] = {[m
[31m-  {"byte", str_byte},[m
[31m-  {"char", str_char},[m
[31m-  {"dump", str_dump},[m
[31m-  {"find", str_find},[m
[31m-  {"format", str_format},[m
[31m-  {"gfind", gfind_nodef},[m
[31m-  {"gmatch", gmatch},[m
[31m-  {"gsub", str_gsub},[m
[31m-  {"len", str_len},[m
[31m-  {"lower", str_lower},[m
[31m-  {"match", str_match},[m
[31m-  {"rep", str_rep},[m
[31m-  {"reverse", str_reverse},[m
[31m-  {"sub", str_sub},[m
[31m-  {"upper", str_upper},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void createmetatable (lua_State *L) {[m
[31m-  lua_createtable(L, 0, 1);  /* create metatable for strings */[m
[31m-  lua_pushliteral(L, "");  /* dummy string */[m
[31m-  lua_pushvalue(L, -2);[m
[31m-  lua_setmetatable(L, -2);  /* set string metatable */[m
[31m-  lua_pop(L, 1);  /* pop dummy string */[m
[31m-  lua_pushvalue(L, -2);  /* string library... */[m
[31m-  lua_setfield(L, -2, "__index");  /* ...is the __index metamethod */[m
[31m-  lua_pop(L, 1);  /* pop metatable */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Open string library[m
[31m-*/[m
[31m-LUALIB_API int luaopen_string (lua_State *L) {[m
[31m-  luaL_register(L, LUA_STRLIBNAME, strlib);[m
[31m-#if defined(LUA_COMPAT_GFIND)[m
[31m-  lua_getfield(L, -1, "gmatch");[m
[31m-  lua_setfield(L, -2, "gfind");[m
[31m-#endif[m
[31m-  createmetatable(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltable.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltable.c[m
[1mdeleted file mode 100644[m
[1mindex ec84f4f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltable.c[m
[1m+++ /dev/null[m
[36m@@ -1,588 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltable.c,v 2.32.1.2 2007/12/28 15:32:23 roberto Exp $[m
[31m-** Lua tables (hash)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Implementation of tables (aka arrays, objects, or hash tables).[m
[31m-** Tables keep its elements in two parts: an array part and a hash part.[m
[31m-** Non-negative integer keys are all candidates to be kept in the array[m
[31m-** part. The actual size of the array is the largest `n' such that at[m
[31m-** least half the slots between 0 and n are in use.[m
[31m-** Hash uses a mix of chained scatter table with Brent's variation.[m
[31m-** A main invariant of these tables is that, if an element is not[m
[31m-** in its main position (i.e. the `original' position that its hash gives[m
[31m-** to it), then the colliding element is in its own main position.[m
[31m-** Hence even when the load factor reaches 100%, performance remains good.[m
[31m-*/[m
[31m-[m
[31m-#include <math.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define ltable_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "ltable.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** max size of array part is 2^MAXBITS[m
[31m-*/[m
[31m-#if LUAI_BITSINT > 26[m
[31m-#define MAXBITS		26[m
[31m-#else[m
[31m-#define MAXBITS		(LUAI_BITSINT-2)[m
[31m-#endif[m
[31m-[m
[31m-#define MAXASIZE	(1 << MAXBITS)[m
[31m-[m
[31m-[m
[31m-#define hashpow2(t,n)      (gnode(t, lmod((n), sizenode(t))))[m
[31m-  [m
[31m-#define hashstr(t,str)  hashpow2(t, (str)->tsv.hash)[m
[31m-#define hashboolean(t,p)        hashpow2(t, p)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** for some types, it is better to avoid modulus by power of 2, as[m
[31m-** they tend to have many 2 factors.[m
[31m-*/[m
[31m-#define hashmod(t,n)	(gnode(t, ((n) % ((sizenode(t)-1)|1))))[m
[31m-[m
[31m-[m
[31m-#define hashpointer(t,p)	hashmod(t, IntPoint(p))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** number of ints inside a lua_Number[m
[31m-*/[m
[31m-#define numints		cast_int(sizeof(lua_Number)/sizeof(int))[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define dummynode		(&dummynode_)[m
[31m-[m
[31m-static const Node dummynode_ = {[m
[31m-  {{NULL}, LUA_TNIL},  /* value */[m
[31m-  {{{NULL}, LUA_TNIL, NULL}}  /* key */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** hash for lua_Numbers[m
[31m-*/[m
[31m-static Node *hashnum (const Table *t, lua_Number n) {[m
[31m-  unsigned int a[numints];[m
[31m-  int i;[m
[31m-  if (luai_numeq(n, 0))  /* avoid problems with -0 */[m
[31m-    return gnode(t, 0);[m
[31m-  memcpy(a, &n, sizeof(a));[m
[31m-  for (i = 1; i < numints; i++) a[0] += a[i];[m
[31m-  return hashmod(t, a[0]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** returns the `main' position of an element in a table (that is, the index[m
[31m-** of its hash value)[m
[31m-*/[m
[31m-static Node *mainposition (const Table *t, const TValue *key) {[m
[31m-  switch (ttype(key)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-      return hashnum(t, nvalue(key));[m
[31m-    case LUA_TSTRING:[m
[31m-      return hashstr(t, rawtsvalue(key));[m
[31m-    case LUA_TBOOLEAN:[m
[31m-      return hashboolean(t, bvalue(key));[m
[31m-    case LUA_TLIGHTUSERDATA:[m
[31m-      return hashpointer(t, pvalue(key));[m
[31m-    default:[m
[31m-      return hashpointer(t, gcvalue(key));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** returns the index for `key' if `key' is an appropriate key to live in[m
[31m-** the array part of the table, -1 otherwise.[m
[31m-*/[m
[31m-static int arrayindex (const TValue *key) {[m
[31m-  if (ttisnumber(key)) {[m
[31m-    lua_Number n = nvalue(key);[m
[31m-    int k;[m
[31m-    lua_number2int(k, n);[m
[31m-    if (luai_numeq(cast_num(k), n))[m
[31m-      return k;[m
[31m-  }[m
[31m-  return -1;  /* `key' did not match some condition */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** returns the index of a `key' for table traversals. First goes all[m
[31m-** elements in the array part, then elements in the hash part. The[m
[31m-** beginning of a traversal is signalled by -1.[m
[31m-*/[m
[31m-static int findindex (lua_State *L, Table *t, StkId key) {[m
[31m-  int i;[m
[31m-  if (ttisnil(key)) return -1;  /* first iteration */[m
[31m-  i = arrayindex(key);[m
[31m-  if (0 < i && i <= t->sizearray)  /* is `key' inside array part? */[m
[31m-    return i-1;  /* yes; that's the index (corrected to C) */[m
[31m-  else {[m
[31m-    Node *n = mainposition(t, key);[m
[31m-    do {  /* check whether `key' is somewhere in the chain */[m
[31m-      /* key may be dead already, but it is ok to use it in `next' */[m
[31m-      if (luaO_rawequalObj(key2tval(n), key) ||[m
[31m-            (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) &&[m
[31m-             gcvalue(gkey(n)) == gcvalue(key))) {[m
[31m-        i = cast_int(n - gnode(t, 0));  /* key index in hash table */[m
[31m-        /* hash elements are numbered after array ones */[m
[31m-        return i + t->sizearray;[m
[31m-      }[m
[31m-      else n = gnext(n);[m
[31m-    } while (n);[m
[31m-    luaG_runerror(L, "invalid key to " LUA_QL("next"));  /* key not found */[m
[31m-    return 0;  /* to avoid warnings */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaH_next (lua_State *L, Table *t, StkId key) {[m
[31m-  int i = findindex(L, t, key);  /* find original element */[m
[31m-  for (i++; i < t->sizearray; i++) {  /* try first array part */[m
[31m-    if (!ttisnil(&t->array[i])) {  /* a non-nil value? */[m
[31m-      setnvalue(key, cast_num(i+1));[m
[31m-      setobj2s(L, key+1, &t->array[i]);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  for (i -= t->sizearray; i < sizenode(t); i++) {  /* then hash part */[m
[31m-    if (!ttisnil(gval(gnode(t, i)))) {  /* a non-nil value? */[m
[31m-      setobj2s(L, key, key2tval(gnode(t, i)));[m
[31m-      setobj2s(L, key+1, gval(gnode(t, i)));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* no more elements */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {=============================================================[m
[31m-** Rehash[m
[31m-** ==============================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static int computesizes (int nums[], int *narray) {[m
[31m-  int i;[m
[31m-  int twotoi;  /* 2^i */[m
[31m-  int a = 0;  /* number of elements smaller than 2^i */[m
[31m-  int na = 0;  /* number of elements to go to array part */[m
[31m-  int n = 0;  /* optimal size for array part */[m
[31m-  for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) {[m
[31m-    if (nums[i] > 0) {[m
[31m-      a += nums[i];[m
[31m-      if (a > twotoi/2) {  /* more than half elements present? */[m
[31m-        n = twotoi;  /* optimal size (till now) */[m
[31m-        na = a;  /* all elements smaller than n will go to array part */[m
[31m-      }[m
[31m-    }[m
[31m-    if (a == *narray) break;  /* all elements already counted */[m
[31m-  }[m
[31m-  *narray = n;[m
[31m-  lua_assert(*narray/2 <= na && na <= *narray);[m
[31m-  return na;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int countint (const TValue *key, int *nums) {[m
[31m-  int k = arrayindex(key);[m
[31m-  if (0 < k && k <= MAXASIZE) {  /* is `key' an appropriate array index? */[m
[31m-    nums[ceillog2(k)]++;  /* count as such */[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int numusearray (const Table *t, int *nums) {[m
[31m-  int lg;[m
[31m-  int ttlg;  /* 2^lg */[m
[31m-  int ause = 0;  /* summation of `nums' */[m
[31m-  int i = 1;  /* count to traverse all array keys */[m
[31m-  for (lg=0, ttlg=1; lg<=MAXBITS; lg++, ttlg*=2) {  /* for each slice */[m
[31m-    int lc = 0;  /* counter */[m
[31m-    int lim = ttlg;[m
[31m-    if (lim > t->sizearray) {[m
[31m-      lim = t->sizearray;  /* adjust upper limit */[m
[31m-      if (i > lim)[m
[31m-        break;  /* no more elements to count */[m
[31m-    }[m
[31m-    /* count elements in range (2^(lg-1), 2^lg] */[m
[31m-    for (; i <= lim; i++) {[m
[31m-      if (!ttisnil(&t->array[i-1]))[m
[31m-        lc++;[m
[31m-    }[m
[31m-    nums[lg] += lc;[m
[31m-    ause += lc;[m
[31m-  }[m
[31m-  return ause;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int numusehash (const Table *t, int *nums, int *pnasize) {[m
[31m-  int totaluse = 0;  /* total number of elements */[m
[31m-  int ause = 0;  /* summation of `nums' */[m
[31m-  int i = sizenode(t);[m
[31m-  while (i--) {[m
[31m-    Node *n = &t->node[i];[m
[31m-    if (!ttisnil(gval(n))) {[m
[31m-      ause += countint(key2tval(n), nums);[m
[31m-      totaluse++;[m
[31m-    }[m
[31m-  }[m
[31m-  *pnasize += ause;[m
[31m-  return totaluse;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void setarrayvector (lua_State *L, Table *t, int size) {[m
[31m-  int i;[m
[31m-  luaM_reallocvector(L, t->array, t->sizearray, size, TValue);[m
[31m-  for (i=t->sizearray; i<size; i++)[m
[31m-     setnilvalue(&t->array[i]);[m
[31m-  t->sizearray = size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void setnodevector (lua_State *L, Table *t, int size) {[m
[31m-  int lsize;[m
[31m-  if (size == 0) {  /* no elements to hash part? */[m
[31m-    t->node = cast(Node *, dummynode);  /* use common `dummynode' */[m
[31m-    lsize = 0;[m
[31m-  }[m
[31m-  else {[m
[31m-    int i;[m
[31m-    lsize = ceillog2(size);[m
[31m-    if (lsize > MAXBITS)[m
[31m-      luaG_runerror(L, "table overflow");[m
[31m-    size = twoto(lsize);[m
[31m-    t->node = luaM_newvector(L, size, Node);[m
[31m-    for (i=0; i<size; i++) {[m
[31m-      Node *n = gnode(t, i);[m
[31m-      gnext(n) = NULL;[m
[31m-      setnilvalue(gkey(n));[m
[31m-      setnilvalue(gval(n));[m
[31m-    }[m
[31m-  }[m
[31m-  t->lsizenode = cast_byte(lsize);[m
[31m-  t->lastfree = gnode(t, size);  /* all positions are free */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void resize (lua_State *L, Table *t, int nasize, int nhsize) {[m
[31m-  int i;[m
[31m-  int oldasize = t->sizearray;[m
[31m-  int oldhsize = t->lsizenode;[m
[31m-  Node *nold = t->node;  /* save old hash ... */[m
[31m-  if (nasize > oldasize)  /* array part must grow? */[m
[31m-    setarrayvector(L, t, nasize);[m
[31m-  /* create new hash part with appropriate size */[m
[31m-  setnodevector(L, t, nhsize);  [m
[31m-  if (nasize < oldasize) {  /* array part must shrink? */[m
[31m-    t->sizearray = nasize;[m
[31m-    /* re-insert elements from vanishing slice */[m
[31m-    for (i=nasize; i<oldasize; i++) {[m
[31m-      if (!ttisnil(&t->array[i]))[m
[31m-        setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]);[m
[31m-    }[m
[31m-    /* shrink array */[m
[31m-    luaM_reallocvector(L, t->array, oldasize, nasize, TValue);[m
[31m-  }[m
[31m-  /* re-insert elements from hash part */[m
[31m-  for (i = twoto(oldhsize) - 1; i >= 0; i--) {[m
[31m-    Node *old = nold+i;[m
[31m-    if (!ttisnil(gval(old)))[m
[31m-      setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old));[m
[31m-  }[m
[31m-  if (nold != dummynode)[m
[31m-    luaM_freearray(L, nold, twoto(oldhsize), Node);  /* free old array */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaH_resizearray (lua_State *L, Table *t, int nasize) {[m
[31m-  int nsize = (t->node == dummynode) ? 0 : sizenode(t);[m
[31m-  resize(L, t, nasize, nsize);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void rehash (lua_State *L, Table *t, const TValue *ek) {[m
[31m-  int nasize, na;[m
[31m-  int nums[MAXBITS+1];  /* nums[i] = number of keys between 2^(i-1) and 2^i */[m
[31m-  int i;[m
[31m-  int totaluse;[m
[31m-  for (i=0; i<=MAXBITS; i++) nums[i] = 0;  /* reset counts */[m
[31m-  nasize = numusearray(t, nums);  /* count keys in array part */[m
[31m-  totaluse = nasize;  /* all those keys are integer keys */[m
[31m-  totaluse += numusehash(t, nums, &nasize);  /* count keys in hash part */[m
[31m-  /* count extra key */[m
[31m-  nasize += countint(ek, nums);[m
[31m-  totaluse++;[m
[31m-  /* compute new size for array part */[m
[31m-  na = computesizes(nums, &nasize);[m
[31m-  /* resize the table to new computed sizes */[m
[31m-  resize(L, t, nasize, totaluse - na);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** }=============================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-Table *luaH_new (lua_State *L, int narray, int nhash) {[m
[31m-  Table *t = luaM_new(L, Table);[m
[31m-  luaC_link(L, obj2gco(t), LUA_TTABLE);[m
[31m-  t->metatable = NULL;[m
[31m-  t->flags = cast_byte(~0);[m
[31m-  /* temporary values (kept only if some malloc fails) */[m
[31m-  t->array = NULL;[m
[31m-  t->sizearray = 0;[m
[31m-  t->lsizenode = 0;[m
[31m-  t->node = cast(Node *, dummynode);[m
[31m-  setarrayvector(L, t, narray);[m
[31m-  setnodevector(L, t, nhash);[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaH_free (lua_State *L, Table *t) {[m
[31m-  if (t->node != dummynode)[m
[31m-    luaM_freearray(L, t->node, sizenode(t), Node);[m
[31m-  luaM_freearray(L, t->array, t->sizearray, TValue);[m
[31m-  luaM_free(L, t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Node *getfreepos (Table *t) {[m
[31m-  while (t->lastfree-- > t->node) {[m
[31m-    if (ttisnil(gkey(t->lastfree)))[m
[31m-      return t->lastfree;[m
[31m-  }[m
[31m-  return NULL;  /* could not find a free place */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** inserts a new key into a hash table; first, check whether key's main [m
[31m-** position is free. If not, check whether colliding node is in its main [m
[31m-** position or not: if it is not, move colliding node to an empty place and [m
[31m-** put new key in its main position; otherwise (colliding node is in its main [m
[31m-** position), new key goes to an empty position. [m
[31m-*/[m
[31m-static TValue *newkey (lua_State *L, Table *t, const TValue *key) {[m
[31m-  Node *mp = mainposition(t, key);[m
[31m-  if (!ttisnil(gval(mp)) || mp == dummynode) {[m
[31m-    Node *othern;[m
[31m-    Node *n = getfreepos(t);  /* get a free place */[m
[31m-    if (n == NULL) {  /* cannot find a free place? */[m
[31m-      rehash(L, t, key);  /* grow table */[m
[31m-      return luaH_set(L, t, key);  /* re-insert key into grown table */[m
[31m-    }[m
[31m-    lua_assert(n != dummynode);[m
[31m-    othern = mainposition(t, key2tval(mp));[m
[31m-    if (othern != mp) {  /* is colliding node out of its main position? */[m
[31m-      /* yes; move colliding node into free position */[m
[31m-      while (gnext(othern) != mp) othern = gnext(othern);  /* find previous */[m
[31m-      gnext(othern) = n;  /* redo the chain with `n' in place of `mp' */[m
[31m-      *n = *mp;  /* copy colliding node into free pos. (mp->next also goes) */[m
[31m-      gnext(mp) = NULL;  /* now `mp' is free */[m
[31m-      setnilvalue(gval(mp));[m
[31m-    }[m
[31m-    else {  /* colliding node is in its own main position */[m
[31m-      /* new node will go into free position */[m
[31m-      gnext(n) = gnext(mp);  /* chain new position */[m
[31m-      gnext(mp) = n;[m
[31m-      mp = n;[m
[31m-    }[m
[31m-  }[m
[31m-  gkey(mp)->value = key->value; gkey(mp)->tt = key->tt;[m
[31m-  luaC_barriert(L, t, key);[m
[31m-  lua_assert(ttisnil(gval(mp)));[m
[31m-  return gval(mp);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** search function for integers[m
[31m-*/[m
[31m-const TValue *luaH_getnum (Table *t, int key) {[m
[31m-  /* (1 <= key && key <= t->sizearray) */[m
[31m-  if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray))[m
[31m-    return &t->array[key-1];[m
[31m-  else {[m
[31m-    lua_Number nk = cast_num(key);[m
[31m-    Node *n = hashnum(t, nk);[m
[31m-    do {  /* check whether `key' is somewhere in the chain */[m
[31m-      if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk))[m
[31m-        return gval(n);  /* that's it */[m
[31m-      else n = gnext(n);[m
[31m-    } while (n);[m
[31m-    return luaO_nilobject;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** search function for strings[m
[31m-*/[m
[31m-const TValue *luaH_getstr (Table *t, TString *key) {[m
[31m-  Node *n = hashstr(t, key);[m
[31m-  do {  /* check whether `key' is somewhere in the chain */[m
[31m-    if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key)[m
[31m-      return gval(n);  /* that's it */[m
[31m-    else n = gnext(n);[m
[31m-  } while (n);[m
[31m-  return luaO_nilobject;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** main search function[m
[31m-*/[m
[31m-const TValue *luaH_get (Table *t, const TValue *key) {[m
[31m-  switch (ttype(key)) {[m
[31m-    case LUA_TNIL: return luaO_nilobject;[m
[31m-    case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key));[m
[31m-    case LUA_TNUMBER: {[m
[31m-      int k;[m
[31m-      lua_Number n = nvalue(key);[m
[31m-      lua_number2int(k, n);[m
[31m-      if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */[m
[31m-        return luaH_getnum(t, k);  /* use specialized version */[m
[31m-      /* else go through */[m
[31m-    }[m
[31m-    default: {[m
[31m-      Node *n = mainposition(t, key);[m
[31m-      do {  /* check whether `key' is somewhere in the chain */[m
[31m-        if (luaO_rawequalObj(key2tval(n), key))[m
[31m-          return gval(n);  /* that's it */[m
[31m-        else n = gnext(n);[m
[31m-      } while (n);[m
[31m-      return luaO_nilobject;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {[m
[31m-  const TValue *p = luaH_get(t, key);[m
[31m-  t->flags = 0;[m
[31m-  if (p != luaO_nilobject)[m
[31m-    return cast(TValue *, p);[m
[31m-  else {[m
[31m-    if (ttisnil(key)) luaG_runerror(L, "table index is nil");[m
[31m-    else if (ttisnumber(key) && luai_numisnan(nvalue(key)))[m
[31m-      luaG_runerror(L, "table index is NaN");[m
[31m-    return newkey(L, t, key);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TValue *luaH_setnum (lua_State *L, Table *t, int key) {[m
[31m-  const TValue *p = luaH_getnum(t, key);[m
[31m-  if (p != luaO_nilobject)[m
[31m-    return cast(TValue *, p);[m
[31m-  else {[m
[31m-    TValue k;[m
[31m-    setnvalue(&k, cast_num(key));[m
[31m-    return newkey(L, t, &k);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TValue *luaH_setstr (lua_State *L, Table *t, TString *key) {[m
[31m-  const TValue *p = luaH_getstr(t, key);[m
[31m-  if (p != luaO_nilobject)[m
[31m-    return cast(TValue *, p);[m
[31m-  else {[m
[31m-    TValue k;[m
[31m-    setsvalue(L, &k, key);[m
[31m-    return newkey(L, t, &k);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int unbound_search (Table *t, unsigned int j) {[m
[31m-  unsigned int i = j;  /* i is zero or a present index */[m
[31m-  j++;[m
[31m-  /* find `i' and `j' such that i is present and j is not */[m
[31m-  while (!ttisnil(luaH_getnum(t, j))) {[m
[31m-    i = j;[m
[31m-    j *= 2;[m
[31m-    if (j > cast(unsigned int, MAX_INT)) {  /* overflow? */[m
[31m-      /* table was built with bad purposes: resort to linear search */[m
[31m-      i = 1;[m
[31m-      while (!ttisnil(luaH_getnum(t, i))) i++;[m
[31m-      return i - 1;[m
[31m-    }[m
[31m-  }[m
[31m-  /* now do a binary search between them */[m
[31m-  while (j - i > 1) {[m
[31m-    unsigned int m = (i+j)/2;[m
[31m-    if (ttisnil(luaH_getnum(t, m))) j = m;[m
[31m-    else i = m;[m
[31m-  }[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Try to find a boundary in table `t'. A `boundary' is an integer index[m
[31m-** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).[m
[31m-*/[m
[31m-int luaH_getn (Table *t) {[m
[31m-  unsigned int j = t->sizearray;[m
[31m-  if (j > 0 && ttisnil(&t->array[j - 1])) {[m
[31m-    /* there is a boundary in the array part: (binary) search for it */[m
[31m-    unsigned int i = 0;[m
[31m-    while (j - i > 1) {[m
[31m-      unsigned int m = (i+j)/2;[m
[31m-      if (ttisnil(&t->array[m - 1])) j = m;[m
[31m-      else i = m;[m
[31m-    }[m
[31m-    return i;[m
[31m-  }[m
[31m-  /* else must find a boundary in hash part */[m
[31m-  else if (t->node == dummynode)  /* hash part is empty? */[m
[31m-    return j;  /* that is easy... */[m
[31m-  else return unbound_search(t, j);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-#if defined(LUA_DEBUG)[m
[31m-[m
[31m-Node *luaH_mainposition (const Table *t, const TValue *key) {[m
[31m-  return mainposition(t, key);[m
[31m-}[m
[31m-[m
[31m-int luaH_isdummy (Node *n) { return n == dummynode; }[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltable.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltable.h[m
[1mdeleted file mode 100644[m
[1mindex f5b9d5e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltable.h[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lua tables (hash)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef ltable_h[m
[31m-#define ltable_h[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-#define gnode(t,i)	(&(t)->node[i])[m
[31m-#define gkey(n)		(&(n)->i_key.nk)[m
[31m-#define gval(n)		(&(n)->i_val)[m
[31m-#define gnext(n)	((n)->i_key.nk.next)[m
[31m-[m
[31m-#define key2tval(n)	(&(n)->i_key.tvk)[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC const TValue *luaH_getnum (Table *t, int key);[m
[31m-LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key);[m
[31m-LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);[m
[31m-LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key);[m
[31m-LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);[m
[31m-LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);[m
[31m-LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash);[m
[31m-LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize);[m
[31m-LUAI_FUNC void luaH_free (lua_State *L, Table *t);[m
[31m-LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);[m
[31m-LUAI_FUNC int luaH_getn (Table *t);[m
[31m-[m
[31m-[m
[31m-#if defined(LUA_DEBUG)[m
[31m-LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);[m
[31m-LUAI_FUNC int luaH_isdummy (Node *n);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltablib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltablib.c[m
[1mdeleted file mode 100644[m
[1mindex b6d9cb4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltablib.c[m
[1m+++ /dev/null[m
[36m@@ -1,287 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $[m
[31m-** Library for Table Manipulation[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define ltablib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-#define aux_getn(L,n)	(luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))[m
[31m-[m
[31m-[m
[31m-static int foreachi (lua_State *L) {[m
[31m-  int i;[m
[31m-  int n = aux_getn(L, 1);[m
[31m-  luaL_checktype(L, 2, LUA_TFUNCTION);[m
[31m-  for (i=1; i <= n; i++) {[m
[31m-    lua_pushvalue(L, 2);  /* function */[m
[31m-    lua_pushinteger(L, i);  /* 1st argument */[m
[31m-    lua_rawgeti(L, 1, i);  /* 2nd argument */[m
[31m-    lua_call(L, 2, 1);[m
[31m-    if (!lua_isnil(L, -1))[m
[31m-      return 1;[m
[31m-    lua_pop(L, 1);  /* remove nil result */[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int foreach (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  luaL_checktype(L, 2, LUA_TFUNCTION);[m
[31m-  lua_pushnil(L);  /* first key */[m
[31m-  while (lua_next(L, 1)) {[m
[31m-    lua_pushvalue(L, 2);  /* function */[m
[31m-    lua_pushvalue(L, -3);  /* key */[m
[31m-    lua_pushvalue(L, -3);  /* value */[m
[31m-    lua_call(L, 2, 1);[m
[31m-    if (!lua_isnil(L, -1))[m
[31m-      return 1;[m
[31m-    lua_pop(L, 2);  /* remove value and result */[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int maxn (lua_State *L) {[m
[31m-  lua_Number max = 0;[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  lua_pushnil(L);  /* first key */[m
[31m-  while (lua_next(L, 1)) {[m
[31m-    lua_pop(L, 1);  /* remove value */[m
[31m-    if (lua_type(L, -1) == LUA_TNUMBER) {[m
[31m-      lua_Number v = lua_tonumber(L, -1);[m
[31m-      if (v > max) max = v;[m
[31m-    }[m
[31m-  }[m
[31m-  lua_pushnumber(L, max);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int getn (lua_State *L) {[m
[31m-  lua_pushinteger(L, aux_getn(L, 1));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int setn (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-#ifndef luaL_setn[m
[31m-  luaL_setn(L, 1, luaL_checkint(L, 2));[m
[31m-#else[m
[31m-  luaL_error(L, LUA_QL("setn") " is obsolete");[m
[31m-#endif[m
[31m-  lua_pushvalue(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int tinsert (lua_State *L) {[m
[31m-  int e = aux_getn(L, 1) + 1;  /* first empty element */[m
[31m-  int pos;  /* where to insert new element */[m
[31m-  switch (lua_gettop(L)) {[m
[31m-    case 2: {  /* called with only 2 arguments */[m
[31m-      pos = e;  /* insert new element at the end */[m
[31m-      break;[m
[31m-    }[m
[31m-    case 3: {[m
[31m-      int i;[m
[31m-      pos = luaL_checkint(L, 2);  /* 2nd argument is the position */[m
[31m-      if (pos > e) e = pos;  /* `grow' array if necessary */[m
[31m-      for (i = e; i > pos; i--) {  /* move up elements */[m
[31m-        lua_rawgeti(L, 1, i-1);[m
[31m-        lua_rawseti(L, 1, i);  /* t[i] = t[i-1] */[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      return luaL_error(L, "wrong number of arguments to " LUA_QL("insert"));[m
[31m-    }[m
[31m-  }[m
[31m-  luaL_setn(L, 1, e);  /* new size */[m
[31m-  lua_rawseti(L, 1, pos);  /* t[pos] = v */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int tremove (lua_State *L) {[m
[31m-  int e = aux_getn(L, 1);[m
[31m-  int pos = luaL_optint(L, 2, e);[m
[31m-  if (!(1 <= pos && pos <= e))  /* position is outside bounds? */[m
[31m-   return 0;  /* nothing to remove */[m
[31m-  luaL_setn(L, 1, e - 1);  /* t.n = n-1 */[m
[31m-  lua_rawgeti(L, 1, pos);  /* result = t[pos] */[m
[31m-  for ( ;pos<e; pos++) {[m
[31m-    lua_rawgeti(L, 1, pos+1);[m
[31m-    lua_rawseti(L, 1, pos);  /* t[pos] = t[pos+1] */[m
[31m-  }[m
[31m-  lua_pushnil(L);[m
[31m-  lua_rawseti(L, 1, e);  /* t[e] = nil */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void addfield (lua_State *L, luaL_Buffer *b, int i) {[m
[31m-  lua_rawgeti(L, 1, i);[m
[31m-  if (!lua_isstring(L, -1))[m
[31m-    luaL_error(L, "invalid value (%s) at index %d in table for "[m
[31m-                  LUA_QL("concat"), luaL_typename(L, -1), i);[m
[31m-    luaL_addvalue(b);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int tconcat (lua_State *L) {[m
[31m-  luaL_Buffer b;[m
[31m-  size_t lsep;[m
[31m-  int i, last;[m
[31m-  const char *sep = luaL_optlstring(L, 2, "", &lsep);[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  i = luaL_optint(L, 3, 1);[m
[31m-  last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1));[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (; i < last; i++) {[m
[31m-    addfield(L, &b, i);[m
[31m-    luaL_addlstring(&b, sep, lsep);[m
[31m-  }[m
[31m-  if (i == last)  /* add last value (if interval was not empty) */[m
[31m-    addfield(L, &b, i);[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Quicksort[m
[31m-** (based on `Algorithms in MODULA-3', Robert Sedgewick;[m
[31m-**  Addison-Wesley, 1993.)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static void set2 (lua_State *L, int i, int j) {[m
[31m-  lua_rawseti(L, 1, i);[m
[31m-  lua_rawseti(L, 1, j);[m
[31m-}[m
[31m-[m
[31m-static int sort_comp (lua_State *L, int a, int b) {[m
[31m-  if (!lua_isnil(L, 2)) {  /* function? */[m
[31m-    int res;[m
[31m-    lua_pushvalue(L, 2);[m
[31m-    lua_pushvalue(L, a-1);  /* -1 to compensate function */[m
[31m-    lua_pushvalue(L, b-2);  /* -2 to compensate function and `a' */[m
[31m-    lua_call(L, 2, 1);[m
[31m-    res = lua_toboolean(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-    return res;[m
[31m-  }[m
[31m-  else  /* a < b? */[m
[31m-    return lua_lessthan(L, a, b);[m
[31m-}[m
[31m-[m
[31m-static void auxsort (lua_State *L, int l, int u) {[m
[31m-  while (l < u) {  /* for tail recursion */[m
[31m-    int i, j;[m
[31m-    /* sort elements a[l], a[(l+u)/2] and a[u] */[m
[31m-    lua_rawgeti(L, 1, l);[m
[31m-    lua_rawgeti(L, 1, u);[m
[31m-    if (sort_comp(L, -1, -2))  /* a[u] < a[l]? */[m
[31m-      set2(L, l, u);  /* swap a[l] - a[u] */[m
[31m-    else[m
[31m-      lua_pop(L, 2);[m
[31m-    if (u-l == 1) break;  /* only 2 elements */[m
[31m-    i = (l+u)/2;[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-    lua_rawgeti(L, 1, l);[m
[31m-    if (sort_comp(L, -2, -1))  /* a[i]<a[l]? */[m
[31m-      set2(L, i, l);[m
[31m-    else {[m
[31m-      lua_pop(L, 1);  /* remove a[l] */[m
[31m-      lua_rawgeti(L, 1, u);[m
[31m-      if (sort_comp(L, -1, -2))  /* a[u]<a[i]? */[m
[31m-        set2(L, i, u);[m
[31m-      else[m
[31m-        lua_pop(L, 2);[m
[31m-    }[m
[31m-    if (u-l == 2) break;  /* only 3 elements */[m
[31m-    lua_rawgeti(L, 1, i);  /* Pivot */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_rawgeti(L, 1, u-1);[m
[31m-    set2(L, i, u-1);[m
[31m-    /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */[m
[31m-    i = l; j = u-1;[m
[31m-    for (;;) {  /* invariant: a[l..i] <= P <= a[j..u] */[m
[31m-      /* repeat ++i until a[i] >= P */[m
[31m-      while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {[m
[31m-        if (i>u) luaL_error(L, "invalid order function for sorting");[m
[31m-        lua_pop(L, 1);  /* remove a[i] */[m
[31m-      }[m
[31m-      /* repeat --j until a[j] <= P */[m
[31m-      while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {[m
[31m-        if (j<l) luaL_error(L, "invalid order function for sorting");[m
[31m-        lua_pop(L, 1);  /* remove a[j] */[m
[31m-      }[m
[31m-      if (j<i) {[m
[31m-        lua_pop(L, 3);  /* pop pivot, a[i], a[j] */[m
[31m-        break;[m
[31m-      }[m
[31m-      set2(L, i, j);[m
[31m-    }[m
[31m-    lua_rawgeti(L, 1, u-1);[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-    set2(L, u-1, i);  /* swap pivot (a[u-1]) with a[i] */[m
[31m-    /* a[l..i-1] <= a[i] == P <= a[i+1..u] */[m
[31m-    /* adjust so that smaller half is in [j..i] and larger one in [l..u] */[m
[31m-    if (i-l < u-i) {[m
[31m-      j=l; i=i-1; l=i+2;[m
[31m-    }[m
[31m-    else {[m
[31m-      j=i+1; i=u; u=j-2;[m
[31m-    }[m
[31m-    auxsort(L, j, i);  /* call recursively the smaller one */[m
[31m-  }  /* repeat the routine for the larger one */[m
[31m-}[m
[31m-[m
[31m-static int sort (lua_State *L) {[m
[31m-  int n = aux_getn(L, 1);[m
[31m-  luaL_checkstack(L, 40, "");  /* assume array is smaller than 2^40 */[m
[31m-  if (!lua_isnoneornil(L, 2))  /* is there a 2nd argument? */[m
[31m-    luaL_checktype(L, 2, LUA_TFUNCTION);[m
[31m-  lua_settop(L, 2);  /* make sure there is two arguments */[m
[31m-  auxsort(L, 1, n);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg tab_funcs[] = {[m
[31m-  {"concat", tconcat},[m
[31m-  {"foreach", foreach},[m
[31m-  {"foreachi", foreachi},[m
[31m-  {"getn", getn},[m
[31m-  {"maxn", maxn},[m
[31m-  {"insert", tinsert},[m
[31m-  {"remove", tremove},[m
[31m-  {"setn", setn},[m
[31m-  {"sort", sort},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_table (lua_State *L) {[m
[31m-  luaL_register(L, LUA_TABLIBNAME, tab_funcs);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltm.c[m
[1mdeleted file mode 100644[m
[1mindex c27f0f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltm.c[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Tag methods[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define ltm_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-const char *const luaT_typenames[] = {[m
[31m-  "nil", "boolean", "userdata", "number",[m
[31m-  "string", "table", "function", "userdata", "thread",[m
[31m-  "proto", "upval"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void luaT_init (lua_State *L) {[m
[31m-  static const char *const luaT_eventname[] = {  /* ORDER TM */[m
[31m-    "__index", "__newindex",[m
[31m-    "__gc", "__mode", "__eq",[m
[31m-    "__add", "__sub", "__mul", "__div", "__mod",[m
[31m-    "__pow", "__unm", "__len", "__lt", "__le",[m
[31m-    "__concat", "__call"[m
[31m-  };[m
[31m-  int i;[m
[31m-  for (i=0; i<TM_N; i++) {[m
[31m-    G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);[m
[31m-    luaS_fix(G(L)->tmname[i]);  /* never collect these names */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** function to be used with macro "fasttm": optimized for absence of[m
[31m-** tag methods[m
[31m-*/[m
[31m-const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {[m
[31m-  const TValue *tm = luaH_getstr(events, ename);[m
[31m-  lua_assert(event <= TM_EQ);[m
[31m-  if (ttisnil(tm)) {  /* no tag method? */[m
[31m-    events->flags |= cast_byte(1u<<event);  /* cache this fact */[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  else return tm;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {[m
[31m-  Table *mt;[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TTABLE:[m
[31m-      mt = hvalue(o)->metatable;[m
[31m-      break;[m
[31m-    case LUA_TUSERDATA:[m
[31m-      mt = uvalue(o)->metatable;[m
[31m-      break;[m
[31m-    default:[m
[31m-      mt = G(L)->mt[ttype(o)];[m
[31m-  }[m
[31m-  return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltm.h[m
[1mdeleted file mode 100644[m
[1mindex 64343b7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/ltm.h[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Tag methods[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef ltm_h[m
[31m-#define ltm_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-* WARNING: if you change the order of this enumeration,[m
[31m-* grep "ORDER TM"[m
[31m-*/[m
[31m-typedef enum {[m
[31m-  TM_INDEX,[m
[31m-  TM_NEWINDEX,[m
[31m-  TM_GC,[m
[31m-  TM_MODE,[m
[31m-  TM_EQ,  /* last tag method with `fast' access */[m
[31m-  TM_ADD,[m
[31m-  TM_SUB,[m
[31m-  TM_MUL,[m
[31m-  TM_DIV,[m
[31m-  TM_MOD,[m
[31m-  TM_POW,[m
[31m-  TM_UNM,[m
[31m-  TM_LEN,[m
[31m-  TM_LT,[m
[31m-  TM_LE,[m
[31m-  TM_CONCAT,[m
[31m-  TM_CALL,[m
[31m-  TM_N		/* number of elements in the enum */[m
[31m-} TMS;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define gfasttm(g,et,e) ((et) == NULL ? NULL : \[m
[31m-  ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))[m
[31m-[m
[31m-#define fasttm(l,et,e)	gfasttm(G(l), et, e)[m
[31m-[m
[31m-LUAI_DATA const char *const luaT_typenames[];[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);[m
[31m-LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,[m
[31m-                                                       TMS event);[m
[31m-LUAI_FUNC void luaT_init (lua_State *L);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lua.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lua.c[m
[1mdeleted file mode 100644[m
[1mindex 3a46609..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lua.c[m
[1m+++ /dev/null[m
[36m@@ -1,392 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lua.c,v 1.160.1.2 2007/12/28 15:32:23 roberto Exp $[m
[31m-** Lua stand-alone interpreter[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <signal.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lua_c[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-static lua_State *globalL = NULL;[m
[31m-[m
[31m-static const char *progname = LUA_PROGNAME;[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void lstop (lua_State *L, lua_Debug *ar) {[m
[31m-  (void)ar;  /* unused arg. */[m
[31m-  lua_sethook(L, NULL, 0, 0);[m
[31m-  luaL_error(L, "interrupted!");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void laction (int i) {[m
[31m-  signal(i, SIG_DFL); /* if another SIGINT happens before lstop,[m
[31m-                              terminate process (default action) */[m
[31m-  lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void print_usage (void) {[m
[31m-  fprintf(stderr,[m
[31m-  "usage: %s [options] [script [args]].\n"[m
[31m-  "Available options are:\n"[m
[31m-  "  -e stat  execute string " LUA_QL("stat") "\n"[m
[31m-  "  -l name  require library " LUA_QL("name") "\n"[m
[31m-  "  -i       enter interactive mode after executing " LUA_QL("script") "\n"[m
[31m-  "  -v       show version information\n"[m
[31m-  "  --       stop handling options\n"[m
[31m-  "  -        execute stdin and stop handling options\n"[m
[31m-  ,[m
[31m-  progname);[m
[31m-  fflush(stderr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void l_message (const char *pname, const char *msg) {[m
[31m-  if (pname) fprintf(stderr, "%s: ", pname);[m
[31m-  fprintf(stderr, "%s\n", msg);[m
[31m-  fflush(stderr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int report (lua_State *L, int status) {[m
[31m-  if (status && !lua_isnil(L, -1)) {[m
[31m-    const char *msg = lua_tostring(L, -1);[m
[31m-    if (msg == NULL) msg = "(error object is not a string)";[m
[31m-    l_message(progname, msg);[m
[31m-    lua_pop(L, 1);[m
[31m-  }[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int traceback (lua_State *L) {[m
[31m-  if (!lua_isstring(L, 1))  /* 'message' not a string? */[m
[31m-    return 1;  /* keep it intact */[m
[31m-  lua_getfield(L, LUA_GLOBALSINDEX, "debug");[m
[31m-  if (!lua_istable(L, -1)) {[m
[31m-    lua_pop(L, 1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  lua_getfield(L, -1, "traceback");[m
[31m-  if (!lua_isfunction(L, -1)) {[m
[31m-    lua_pop(L, 2);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  lua_pushvalue(L, 1);  /* pass error message */[m
[31m-  lua_pushinteger(L, 2);  /* skip this function and traceback */[m
[31m-  lua_call(L, 2, 1);  /* call debug.traceback */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int docall (lua_State *L, int narg, int clear) {[m
[31m-  int status;[m
[31m-  int base = lua_gettop(L) - narg;  /* function index */[m
[31m-  lua_pushcfunction(L, traceback);  /* push traceback function */[m
[31m-  lua_insert(L, base);  /* put it under chunk and args */[m
[31m-  signal(SIGINT, laction);[m
[31m-  status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base);[m
[31m-  signal(SIGINT, SIG_DFL);[m
[31m-  lua_remove(L, base);  /* remove traceback function */[m
[31m-  /* force a complete garbage collection in case of errors */[m
[31m-  if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void print_version (void) {[m
[31m-  l_message(NULL, LUA_RELEASE "  " LUA_COPYRIGHT);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int getargs (lua_State *L, char **argv, int n) {[m
[31m-  int narg;[m
[31m-  int i;[m
[31m-  int argc = 0;[m
[31m-  while (argv[argc]) argc++;  /* count total number of arguments */[m
[31m-  narg = argc - (n + 1);  /* number of arguments to the script */[m
[31m-  luaL_checkstack(L, narg + 3, "too many arguments to script");[m
[31m-  for (i=n+1; i < argc; i++)[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-  lua_createtable(L, narg, n + 1);[m
[31m-  for (i=0; i < argc; i++) {[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-    lua_rawseti(L, -2, i - n);[m
[31m-  }[m
[31m-  return narg;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int dofile (lua_State *L, const char *name) {[m
[31m-  int status = luaL_loadfile(L, name) || docall(L, 0, 1);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int dostring (lua_State *L, const char *s, const char *name) {[m
[31m-  int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int dolibrary (lua_State *L, const char *name) {[m
[31m-  lua_getglobal(L, "require");[m
[31m-  lua_pushstring(L, name);[m
[31m-  return report(L, docall(L, 1, 1));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *get_prompt (lua_State *L, int firstline) {[m
[31m-  const char *p;[m
[31m-  lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2");[m
[31m-  p = lua_tostring(L, -1);[m
[31m-  if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);[m
[31m-  lua_pop(L, 1);  /* remove global */[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int incomplete (lua_State *L, int status) {[m
[31m-  if (status == LUA_ERRSYNTAX) {[m
[31m-    size_t lmsg;[m
[31m-    const char *msg = lua_tolstring(L, -1, &lmsg);[m
[31m-    const char *tp = msg + lmsg - (sizeof(LUA_QL("<eof>")) - 1);[m
[31m-    if (strstr(msg, LUA_QL("<eof>")) == tp) {[m
[31m-      lua_pop(L, 1);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* else... */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int pushline (lua_State *L, int firstline) {[m
[31m-  char buffer[LUA_MAXINPUT];[m
[31m-  char *b = buffer;[m
[31m-  size_t l;[m
[31m-  const char *prmt = get_prompt(L, firstline);[m
[31m-  if (lua_readline(L, b, prmt) == 0)[m
[31m-    return 0;  /* no input */[m
[31m-  l = strlen(b);[m
[31m-  if (l > 0 && b[l-1] == '\n')  /* line ends with newline? */[m
[31m-    b[l-1] = '\0';  /* remove it */[m
[31m-  if (firstline && b[0] == '=')  /* first line starts with `=' ? */[m
[31m-    lua_pushfstring(L, "return %s", b+1);  /* change it to `return' */[m
[31m-  else[m
[31m-    lua_pushstring(L, b);[m
[31m-  lua_freeline(L, b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loadline (lua_State *L) {[m
[31m-  int status;[m
[31m-  lua_settop(L, 0);[m
[31m-  if (!pushline(L, 1))[m
[31m-    return -1;  /* no input */[m
[31m-  for (;;) {  /* repeat until gets a complete line */[m
[31m-    status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin");[m
[31m-    if (!incomplete(L, status)) break;  /* cannot try to add lines? */[m
[31m-    if (!pushline(L, 0))  /* no more input? */[m
[31m-      return -1;[m
[31m-    lua_pushliteral(L, "\n");  /* add a new line... */[m
[31m-    lua_insert(L, -2);  /* ...between the two lines */[m
[31m-    lua_concat(L, 3);  /* join them */[m
[31m-  }[m
[31m-  lua_saveline(L, 1);[m
[31m-  lua_remove(L, 1);  /* remove line */[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void dotty (lua_State *L) {[m
[31m-  int status;[m
[31m-  const char *oldprogname = progname;[m
[31m-  progname = NULL;[m
[31m-  while ((status = loadline(L)) != -1) {[m
[31m-    if (status == 0) status = docall(L, 0, 0);[m
[31m-    report(L, status);[m
[31m-    if (status == 0 && lua_gettop(L) > 0) {  /* any result to print? */[m
[31m-      lua_getglobal(L, "print");[m
[31m-      lua_insert(L, 1);[m
[31m-      if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0)[m
[31m-        l_message(progname, lua_pushfstring(L,[m
[31m-                               "error calling " LUA_QL("print") " (%s)",[m
[31m-                               lua_tostring(L, -1)));[m
[31m-    }[m
[31m-  }[m
[31m-  lua_settop(L, 0);  /* clear stack */[m
[31m-  fputs("\n", stdout);[m
[31m-  fflush(stdout);[m
[31m-  progname = oldprogname;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int handle_script (lua_State *L, char **argv, int n) {[m
[31m-  int status;[m
[31m-  const char *fname;[m
[31m-  int narg = getargs(L, argv, n);  /* collect arguments */[m
[31m-  lua_setglobal(L, "arg");[m
[31m-  fname = argv[n];[m
[31m-  if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0) [m
[31m-    fname = NULL;  /* stdin */[m
[31m-  status = luaL_loadfile(L, fname);[m
[31m-  lua_insert(L, -(narg+1));[m
[31m-  if (status == 0)[m
[31m-    status = docall(L, narg, 0);[m
[31m-  else[m
[31m-    lua_pop(L, narg);      [m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* check that argument has no extra characters at the end */[m
[31m-#define notail(x)	{if ((x)[2] != '\0') return -1;}[m
[31m-[m
[31m-[m
[31m-static int collectargs (char **argv, int *pi, int *pv, int *pe) {[m
[31m-  int i;[m
[31m-  for (i = 1; argv[i] != NULL; i++) {[m
[31m-    if (argv[i][0] != '-')  /* not an option? */[m
[31m-        return i;[m
[31m-    switch (argv[i][1]) {  /* option */[m
[31m-      case '-':[m
[31m-        notail(argv[i]);[m
[31m-        return (argv[i+1] != NULL ? i+1 : 0);[m
[31m-      case '\0':[m
[31m-        return i;[m
[31m-      case 'i':[m
[31m-        notail(argv[i]);[m
[31m-        *pi = 1;  /* go through */[m
[31m-      case 'v':[m
[31m-        notail(argv[i]);[m
[31m-        *pv = 1;[m
[31m-        break;[m
[31m-      case 'e':[m
[31m-        *pe = 1;  /* go through */[m
[31m-      case 'l':[m
[31m-        if (argv[i][2] == '\0') {[m
[31m-          i++;[m
[31m-          if (argv[i] == NULL) return -1;[m
[31m-        }[m
[31m-        break;[m
[31m-      default: return -1;  /* invalid option */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int runargs (lua_State *L, char **argv, int n) {[m
[31m-  int i;[m
[31m-  for (i = 1; i < n; i++) {[m
[31m-    if (argv[i] == NULL) continue;[m
[31m-    lua_assert(argv[i][0] == '-');[m
[31m-    switch (argv[i][1]) {  /* option */[m
[31m-      case 'e': {[m
[31m-        const char *chunk = argv[i] + 2;[m
[31m-        if (*chunk == '\0') chunk = argv[++i];[m
[31m-        lua_assert(chunk != NULL);[m
[31m-        if (dostring(L, chunk, "=(command line)") != 0)[m
[31m-          return 1;[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'l': {[m
[31m-        const char *filename = argv[i] + 2;[m
[31m-        if (*filename == '\0') filename = argv[++i];[m
[31m-        lua_assert(filename != NULL);[m
[31m-        if (dolibrary(L, filename))[m
[31m-          return 1;  /* stop if file fails */[m
[31m-        break;[m
[31m-      }[m
[31m-      default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int handle_luainit (lua_State *L) {[m
[31m-  const char *init = getenv(LUA_INIT);[m
[31m-  if (init == NULL) return 0;  /* status OK */[m
[31m-  else if (init[0] == '@')[m
[31m-    return dofile(L, init+1);[m
[31m-  else[m
[31m-    return dostring(L, init, "=" LUA_INIT);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-struct Smain {[m
[31m-  int argc;[m
[31m-  char **argv;[m
[31m-  int status;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static int pmain (lua_State *L) {[m
[31m-  struct Smain *s = (struct Smain *)lua_touserdata(L, 1);[m
[31m-  char **argv = s->argv;[m
[31m-  int script;[m
[31m-  int has_i = 0, has_v = 0, has_e = 0;[m
[31m-  globalL = L;[m
[31m-  if (argv[0] && argv[0][0]) progname = argv[0];[m
[31m-  lua_gc(L, LUA_GCSTOP, 0);  /* stop collector during initialization */[m
[31m-  luaL_openlibs(L);  /* open libraries */[m
[31m-  lua_gc(L, LUA_GCRESTART, 0);[m
[31m-  s->status = handle_luainit(L);[m
[31m-  if (s->status != 0) return 0;[m
[31m-  script = collectargs(argv, &has_i, &has_v, &has_e);[m
[31m-  if (script < 0) {  /* invalid args? */[m
[31m-    print_usage();[m
[31m-    s->status = 1;[m
[31m-    return 0;[m
[31m-  }[m
[31m-  if (has_v) print_version();[m
[31m-  s->status = runargs(L, argv, (script > 0) ? script : s->argc);[m
[31m-  if (s->status != 0) return 0;[m
[31m-  if (script)[m
[31m-    s->status = handle_script(L, argv, script);[m
[31m-  if (s->status != 0) return 0;[m
[31m-  if (has_i)[m
[31m-    dotty(L);[m
[31m-  else if (script == 0 && !has_e && !has_v) {[m
[31m-    if (lua_stdin_is_tty()) {[m
[31m-      print_version();[m
[31m-      dotty(L);[m
[31m-    }[m
[31m-    else dofile(L, NULL);  /* executes stdin as a file */[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int main (int argc, char **argv) {[m
[31m-  int status;[m
[31m-  struct Smain s;[m
[31m-  lua_State *L = lua_open();  /* create state */[m
[31m-  if (L == NULL) {[m
[31m-    l_message(argv[0], "cannot create state: not enough memory");[m
[31m-    return EXIT_FAILURE;[m
[31m-  }[m
[31m-  s.argc = argc;[m
[31m-  s.argv = argv;[m
[31m-  status = lua_cpcall(L, &pmain, &s);[m
[31m-  report(L, status);[m
[31m-  lua_close(L);[m
[31m-  return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lua.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lua.h[m
[1mdeleted file mode 100644[m
[1mindex a4b73e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lua.h[m
[1m+++ /dev/null[m
[36m@@ -1,388 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lua.h,v 1.218.1.7 2012/01/13 20:36:20 roberto Exp $[m
[31m-** Lua - An Extensible Extension Language[m
[31m-** Lua.org, PUC-Rio, Brazil (http://www.lua.org)[m
[31m-** See Copyright Notice at the end of this file[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lua_h[m
[31m-#define lua_h[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-#include "luaconf.h"[m
[31m-[m
[31m-[m
[31m-#define LUA_VERSION	"Lua 5.1"[m
[31m-#define LUA_RELEASE	"Lua 5.1.5"[m
[31m-#define LUA_VERSION_NUM	501[m
[31m-#define LUA_COPYRIGHT	"Copyright (C) 1994-2012 Lua.org, PUC-Rio"[m
[31m-#define LUA_AUTHORS 	"R. Ierusalimschy, L. H. de Figueiredo & W. Celes"[m
[31m-[m
[31m-[m
[31m-/* mark for precompiled code (`<esc>Lua') */[m
[31m-#define	LUA_SIGNATURE	"\033Lua"[m
[31m-[m
[31m-/* option for multiple returns in `lua_pcall' and `lua_call' */[m
[31m-#define LUA_MULTRET	(-1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** pseudo-indices[m
[31m-*/[m
[31m-#define LUA_REGISTRYINDEX	(-10000)[m
[31m-#define LUA_ENVIRONINDEX	(-10001)[m
[31m-#define LUA_GLOBALSINDEX	(-10002)[m
[31m-#define lua_upvalueindex(i)	(LUA_GLOBALSINDEX-(i))[m
[31m-[m
[31m-[m
[31m-/* thread status; 0 is OK */[m
[31m-#define LUA_YIELD	1[m
[31m-#define LUA_ERRRUN	2[m
[31m-#define LUA_ERRSYNTAX	3[m
[31m-#define LUA_ERRMEM	4[m
[31m-#define LUA_ERRERR	5[m
[31m-[m
[31m-[m
[31m-typedef struct lua_State lua_State;[m
[31m-[m
[31m-typedef int (*lua_CFunction) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** functions that read/write blocks when loading/dumping Lua chunks[m
[31m-*/[m
[31m-typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);[m
[31m-[m
[31m-typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** prototype for memory-allocation functions[m
[31m-*/[m
[31m-typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic types[m
[31m-*/[m
[31m-#define LUA_TNONE		(-1)[m
[31m-[m
[31m-#define LUA_TNIL		0[m
[31m-#define LUA_TBOOLEAN		1[m
[31m-#define LUA_TLIGHTUSERDATA	2[m
[31m-#define LUA_TNUMBER		3[m
[31m-#define LUA_TSTRING		4[m
[31m-#define LUA_TTABLE		5[m
[31m-#define LUA_TFUNCTION		6[m
[31m-#define LUA_TUSERDATA		7[m
[31m-#define LUA_TTHREAD		8[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* minimum Lua stack available to a C function */[m
[31m-#define LUA_MINSTACK	20[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** generic extra include file[m
[31m-*/[m
[31m-#if defined(LUA_USER_H)[m
[31m-#include LUA_USER_H[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* type of numbers in Lua */[m
[31m-typedef LUA_NUMBER lua_Number;[m
[31m-[m
[31m-[m
[31m-/* type for integer functions */[m
[31m-typedef LUA_INTEGER lua_Integer;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** state manipulation[m
[31m-*/[m
[31m-LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);[m
[31m-LUA_API void       (lua_close) (lua_State *L);[m
[31m-LUA_API lua_State *(lua_newthread) (lua_State *L);[m
[31m-[m
[31m-LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic stack manipulation[m
[31m-*/[m
[31m-LUA_API int   (lua_gettop) (lua_State *L);[m
[31m-LUA_API void  (lua_settop) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_pushvalue) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_remove) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_insert) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_replace) (lua_State *L, int idx);[m
[31m-LUA_API int   (lua_checkstack) (lua_State *L, int sz);[m
[31m-[m
[31m-LUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** access functions (stack -> C)[m
[31m-*/[m
[31m-[m
[31m-LUA_API int             (lua_isnumber) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isstring) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_iscfunction) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isuserdata) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_type) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_typename) (lua_State *L, int tp);[m
[31m-[m
[31m-LUA_API int            (lua_equal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_rawequal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_lessthan) (lua_State *L, int idx1, int idx2);[m
[31m-[m
[31m-LUA_API lua_Number      (lua_tonumber) (lua_State *L, int idx);[m
[31m-LUA_API lua_Integer     (lua_tointeger) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_toboolean) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);[m
[31m-LUA_API size_t          (lua_objlen) (lua_State *L, int idx);[m
[31m-LUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);[m
[31m-LUA_API void	       *(lua_touserdata) (lua_State *L, int idx);[m
[31m-LUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);[m
[31m-LUA_API const void     *(lua_topointer) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** push functions (C -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_pushnil) (lua_State *L);[m
[31m-LUA_API void  (lua_pushnumber) (lua_State *L, lua_Number n);[m
[31m-LUA_API void  (lua_pushinteger) (lua_State *L, lua_Integer n);[m
[31m-LUA_API void  (lua_pushlstring) (lua_State *L, const char *s, size_t l);[m
[31m-LUA_API void  (lua_pushstring) (lua_State *L, const char *s);[m
[31m-LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,[m
[31m-                                                      va_list argp);[m
[31m-LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);[m
[31m-LUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);[m
[31m-LUA_API void  (lua_pushboolean) (lua_State *L, int b);[m
[31m-LUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);[m
[31m-LUA_API int   (lua_pushthread) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** get functions (Lua -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_gettable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_getfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawget) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawgeti) (lua_State *L, int idx, int n);[m
[31m-LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);[m
[31m-LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);[m
[31m-LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API void  (lua_getfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** set functions (stack -> Lua)[m
[31m-*/[m
[31m-LUA_API void  (lua_settable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawset) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);[m
[31m-LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API int   (lua_setfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `load' and `call' functions (load and run Lua code)[m
[31m-*/[m
[31m-LUA_API void  (lua_call) (lua_State *L, int nargs, int nresults);[m
[31m-LUA_API int   (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);[m
[31m-LUA_API int   (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);[m
[31m-LUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt,[m
[31m-                                        const char *chunkname);[m
[31m-[m
[31m-LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** coroutine functions[m
[31m-*/[m
[31m-LUA_API int  (lua_yield) (lua_State *L, int nresults);[m
[31m-LUA_API int  (lua_resume) (lua_State *L, int narg);[m
[31m-LUA_API int  (lua_status) (lua_State *L);[m
[31m-[m
[31m-/*[m
[31m-** garbage-collection function and options[m
[31m-*/[m
[31m-[m
[31m-#define LUA_GCSTOP		0[m
[31m-#define LUA_GCRESTART		1[m
[31m-#define LUA_GCCOLLECT		2[m
[31m-#define LUA_GCCOUNT		3[m
[31m-#define LUA_GCCOUNTB		4[m
[31m-#define LUA_GCSTEP		5[m
[31m-#define LUA_GCSETPAUSE		6[m
[31m-#define LUA_GCSETSTEPMUL	7[m
[31m-[m
[31m-LUA_API int (lua_gc) (lua_State *L, int what, int data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** miscellaneous functions[m
[31m-*/[m
[31m-[m
[31m-LUA_API int   (lua_error) (lua_State *L);[m
[31m-[m
[31m-LUA_API int   (lua_next) (lua_State *L, int idx);[m
[31m-[m
[31m-LUA_API void  (lua_concat) (lua_State *L, int n);[m
[31m-[m
[31m-LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);[m
[31m-LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* [m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define lua_pop(L,n)		lua_settop(L, -(n)-1)[m
[31m-[m
[31m-#define lua_newtable(L)		lua_createtable(L, 0, 0)[m
[31m-[m
[31m-#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))[m
[31m-[m
[31m-#define lua_pushcfunction(L,f)	lua_pushcclosure(L, (f), 0)[m
[31m-[m
[31m-#define lua_strlen(L,i)		lua_objlen(L, (i))[m
[31m-[m
[31m-#define lua_isfunction(L,n)	(lua_type(L, (n)) == LUA_TFUNCTION)[m
[31m-#define lua_istable(L,n)	(lua_type(L, (n)) == LUA_TTABLE)[m
[31m-#define lua_islightuserdata(L,n)	(lua_type(L, (n)) == LUA_TLIGHTUSERDATA)[m
[31m-#define lua_isnil(L,n)		(lua_type(L, (n)) == LUA_TNIL)[m
[31m-#define lua_isboolean(L,n)	(lua_type(L, (n)) == LUA_TBOOLEAN)[m
[31m-#define lua_isthread(L,n)	(lua_type(L, (n)) == LUA_TTHREAD)[m
[31m-#define lua_isnone(L,n)		(lua_type(L, (n)) == LUA_TNONE)[m
[31m-#define lua_isnoneornil(L, n)	(lua_type(L, (n)) <= 0)[m
[31m-[m
[31m-#define lua_pushliteral(L, s)	\[m
[31m-	lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)[m
[31m-[m
[31m-#define lua_setglobal(L,s)	lua_setfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-#define lua_getglobal(L,s)	lua_getfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-[m
[31m-#define lua_tostring(L,i)	lua_tolstring(L, (i), NULL)[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** compatibility macros and functions[m
[31m-*/[m
[31m-[m
[31m-#define lua_open()	luaL_newstate()[m
[31m-[m
[31m-#define lua_getregistry(L)	lua_pushvalue(L, LUA_REGISTRYINDEX)[m
[31m-[m
[31m-#define lua_getgccount(L)	lua_gc(L, LUA_GCCOUNT, 0)[m
[31m-[m
[31m-#define lua_Chunkreader		lua_Reader[m
[31m-#define lua_Chunkwriter		lua_Writer[m
[31m-[m
[31m-[m
[31m-/* hack */[m
[31m-LUA_API void lua_setlevel	(lua_State *from, lua_State *to);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Debug API[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event codes[m
[31m-*/[m
[31m-#define LUA_HOOKCALL	0[m
[31m-#define LUA_HOOKRET	1[m
[31m-#define LUA_HOOKLINE	2[m
[31m-#define LUA_HOOKCOUNT	3[m
[31m-#define LUA_HOOKTAILRET 4[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event masks[m
[31m-*/[m
[31m-#define LUA_MASKCALL	(1 << LUA_HOOKCALL)[m
[31m-#define LUA_MASKRET	(1 << LUA_HOOKRET)[m
[31m-#define LUA_MASKLINE	(1 << LUA_HOOKLINE)[m
[31m-#define LUA_MASKCOUNT	(1 << LUA_HOOKCOUNT)[m
[31m-[m
[31m-typedef struct lua_Debug lua_Debug;  /* activation record */[m
[31m-[m
[31m-[m
[31m-/* Functions to be called by the debuger in specific events */[m
[31m-typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar);[m
[31m-LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);[m
[31m-LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n);[m
[31m-LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n);[m
[31m-[m
[31m-LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);[m
[31m-LUA_API lua_Hook lua_gethook (lua_State *L);[m
[31m-LUA_API int lua_gethookmask (lua_State *L);[m
[31m-LUA_API int lua_gethookcount (lua_State *L);[m
[31m-[m
[31m-[m
[31m-struct lua_Debug {[m
[31m-  int event;[m
[31m-  const char *name;	/* (n) */[m
[31m-  const char *namewhat;	/* (n) `global', `local', `field', `method' */[m
[31m-  const char *what;	/* (S) `Lua', `C', `main', `tail' */[m
[31m-  const char *source;	/* (S) */[m
[31m-  int currentline;	/* (l) */[m
[31m-  int nups;		/* (u) number of upvalues */[m
[31m-  int linedefined;	/* (S) */[m
[31m-  int lastlinedefined;	/* (S) */[m
[31m-  char short_src[LUA_IDSIZE]; /* (S) */[m
[31m-  /* private part */[m
[31m-  int i_ci;  /* active function */[m
[31m-};[m
[31m-[m
[31m-/* }====================================================================== */[m
[31m-[m
[31m-[m
[31m-/******************************************************************************[m
[31m-* Copyright (C) 1994-2012 Lua.org, PUC-Rio.  All rights reserved.[m
[31m-*[m
[31m-* Permission is hereby granted, free of charge, to any person obtaining[m
[31m-* a copy of this software and associated documentation files (the[m
[31m-* "Software"), to deal in the Software without restriction, including[m
[31m-* without limitation the rights to use, copy, modify, merge, publish,[m
[31m-* distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-* permit persons to whom the Software is furnished to do so, subject to[m
[31m-* the following conditions:[m
[31m-*[m
[31m-* The above copyright notice and this permission notice shall be[m
[31m-* included in all copies or substantial portions of the Software.[m
[31m-*[m
[31m-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-******************************************************************************/[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/luac.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/luac.c[m
[1mdeleted file mode 100644[m
[1mindex d070173..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/luac.c[m
[1m+++ /dev/null[m
[36m@@ -1,200 +0,0 @@[m
[31m-/*[m
[31m-** $Id: luac.c,v 1.54 2006/06/02 17:37:11 lhf Exp $[m
[31m-** Lua compiler (saves bytecodes to files; also list bytecodes)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define luac_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lstring.h"[m
[31m-#include "lundump.h"[m
[31m-[m
[31m-#define PROGNAME	"luac"		/* default program name */[m
[31m-#define	OUTPUT		PROGNAME ".out"	/* default output file */[m
[31m-[m
[31m-static int listing=0;			/* list bytecodes? */[m
[31m-static int dumping=1;			/* dump bytecodes? */[m
[31m-static int stripping=0;			/* strip debug information? */[m
[31m-static char Output[]={ OUTPUT };	/* default output file name */[m
[31m-static const char* output=Output;	/* actual output file name */[m
[31m-static const char* progname=PROGNAME;	/* actual program name */[m
[31m-[m
[31m-static void fatal(const char* message)[m
[31m-{[m
[31m- fprintf(stderr,"%s: %s\n",progname,message);[m
[31m- exit(EXIT_FAILURE);[m
[31m-}[m
[31m-[m
[31m-static void cannot(const char* what)[m
[31m-{[m
[31m- fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno));[m
[31m- exit(EXIT_FAILURE);[m
[31m-}[m
[31m-[m
[31m-static void usage(const char* message)[m
[31m-{[m
[31m- if (*message=='-')[m
[31m-  fprintf(stderr,"%s: unrecognized option " LUA_QS "\n",progname,message);[m
[31m- else[m
[31m-  fprintf(stderr,"%s: %s\n",progname,message);[m
[31m- fprintf(stderr,[m
[31m- "usage: %s [options] [filenames].\n"[m
[31m- "Available options are:\n"[m
[31m- "  -        process stdin\n"[m
[31m- "  -l       list\n"[m
[31m- "  -o name  output to file " LUA_QL("name") " (default is \"%s\")\n"[m
[31m- "  -p       parse only\n"[m
[31m- "  -s       strip debug information\n"[m
[31m- "  -v       show version information\n"[m
[31m- "  --       stop handling options\n",[m
[31m- progname,Output);[m
[31m- exit(EXIT_FAILURE);[m
[31m-}[m
[31m-[m
[31m-#define	IS(s)	(strcmp(argv[i],s)==0)[m
[31m-[m
[31m-static int doargs(int argc, char* argv[])[m
[31m-{[m
[31m- int i;[m
[31m- int version=0;[m
[31m- if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0];[m
[31m- for (i=1; i<argc; i++)[m
[31m- {[m
[31m-  if (*argv[i]!='-')			/* end of options; keep it */[m
[31m-   break;[m
[31m-  else if (IS("--"))			/* end of options; skip it */[m
[31m-  {[m
[31m-   ++i;[m
[31m-   if (version) ++version;[m
[31m-   break;[m
[31m-  }[m
[31m-  else if (IS("-"))			/* end of options; use stdin */[m
[31m-   break;[m
[31m-  else if (IS("-l"))			/* list */[m
[31m-   ++listing;[m
[31m-  else if (IS("-o"))			/* output file */[m
[31m-  {[m
[31m-   output=argv[++i];[m
[31m-   if (output==NULL || *output==0) usage(LUA_QL("-o") " needs argument");[m
[31m-   if (IS("-")) output=NULL;[m
[31m-  }[m
[31m-  else if (IS("-p"))			/* parse only */[m
[31m-   dumping=0;[m
[31m-  else if (IS("-s"))			/* strip debug information */[m
[31m-   stripping=1;[m
[31m-  else if (IS("-v"))			/* show version */[m
[31m-   ++version;[m
[31m-  else					/* unknown option */[m
[31m-   usage(argv[i]);[m
[31m- }[m
[31m- if (i==argc && (listing || !dumping))[m
[31m- {[m
[31m-  dumping=0;[m
[31m-  argv[--i]=Output;[m
[31m- }[m
[31m- if (version)[m
[31m- {[m
[31m-  printf("%s  %s\n",LUA_RELEASE,LUA_COPYRIGHT);[m
[31m-  if (version==argc-1) exit(EXIT_SUCCESS);[m
[31m- }[m
[31m- return i;[m
[31m-}[m
[31m-[m
[31m-#define toproto(L,i) (clvalue(L->top+(i))->l.p)[m
[31m-[m
[31m-static const Proto* combine(lua_State* L, int n)[m
[31m-{[m
[31m- if (n==1)[m
[31m-  return toproto(L,-1);[m
[31m- else[m
[31m- {[m
[31m-  int i,pc;[m
[31m-  Proto* f=luaF_newproto(L);[m
[31m-  setptvalue2s(L,L->top,f); incr_top(L);[m
[31m-  f->source=luaS_newliteral(L,"=(" PROGNAME ")");[m
[31m-  f->maxstacksize=1;[m
[31m-  pc=2*n+1;[m
[31m-  f->code=luaM_newvector(L,pc,Instruction);[m
[31m-  f->sizecode=pc;[m
[31m-  f->p=luaM_newvector(L,n,Proto*);[m
[31m-  f->sizep=n;[m
[31m-  pc=0;[m
[31m-  for (i=0; i<n; i++)[m
[31m-  {[m
[31m-   f->p[i]=toproto(L,i-n-1);[m
[31m-   f->code[pc++]=CREATE_ABx(OP_CLOSURE,0,i);[m
[31m-   f->code[pc++]=CREATE_ABC(OP_CALL,0,1,1);[m
[31m-  }[m
[31m-  f->code[pc++]=CREATE_ABC(OP_RETURN,0,1,0);[m
[31m-  return f;[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static int writer(lua_State* L, const void* p, size_t size, void* u)[m
[31m-{[m
[31m- UNUSED(L);[m
[31m- return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0);[m
[31m-}[m
[31m-[m
[31m-struct Smain {[m
[31m- int argc;[m
[31m- char** argv;[m
[31m-};[m
[31m-[m
[31m-static int pmain(lua_State* L)[m
[31m-{[m
[31m- struct Smain* s = (struct Smain*)lua_touserdata(L, 1);[m
[31m- int argc=s->argc;[m
[31m- char** argv=s->argv;[m
[31m- const Proto* f;[m
[31m- int i;[m
[31m- if (!lua_checkstack(L,argc)) fatal("too many input files");[m
[31m- for (i=0; i<argc; i++)[m
[31m- {[m
[31m-  const char* filename=IS("-") ? NULL : argv[i];[m
[31m-  if (luaL_loadfile(L,filename)!=0) fatal(lua_tostring(L,-1));[m
[31m- }[m
[31m- f=combine(L,argc);[m
[31m- if (listing) luaU_print(f,listing>1);[m
[31m- if (dumping)[m
[31m- {[m
[31m-  FILE* D= (output==NULL) ? stdout : fopen(output,"wb");[m
[31m-  if (D==NULL) cannot("open");[m
[31m-  lua_lock(L);[m
[31m-  luaU_dump(L,f,writer,D,stripping);[m
[31m-  lua_unlock(L);[m
[31m-  if (ferror(D)) cannot("write");[m
[31m-  if (fclose(D)) cannot("close");[m
[31m- }[m
[31m- return 0;[m
[31m-}[m
[31m-[m
[31m-int main(int argc, char* argv[])[m
[31m-{[m
[31m- lua_State* L;[m
[31m- struct Smain s;[m
[31m- int i=doargs(argc,argv);[m
[31m- argc-=i; argv+=i;[m
[31m- if (argc<=0) usage("no input files given");[m
[31m- L=lua_open();[m
[31m- if (L==NULL) fatal("not enough memory for state");[m
[31m- s.argc=argc;[m
[31m- s.argv=argv;[m
[31m- if (lua_cpcall(L,pmain,&s)!=0) fatal(lua_tostring(L,-1));[m
[31m- lua_close(L);[m
[31m- return EXIT_SUCCESS;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/luaconf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/luaconf.h[m
[1mdeleted file mode 100644[m
[1mindex 0979942..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/luaconf.h[m
[1m+++ /dev/null[m
[36m@@ -1,768 +0,0 @@[m
[31m-/*[m
[31m-** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $[m
[31m-** Configuration file for Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lconfig_h[m
[31m-#define lconfig_h[m
[31m-[m
[31m-#include <limits.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ==================================================================[m
[31m-** Search for "@@" to find all configurable definitions.[m
[31m-** ===================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_ANSI controls the use of non-ansi features.[m
[31m-** CHANGE it (define it) if you want Lua to avoid the use of any[m
[31m-** non-ansi feature or library.[m
[31m-*/[m
[31m-#if defined(__STRICT_ANSI__)[m
[31m-#define LUA_ANSI[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if !defined(LUA_ANSI) && defined(_WIN32)[m
[31m-#define LUA_WIN[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUA_USE_LINUX)[m
[31m-#define LUA_USE_POSIX[m
[31m-#define LUA_USE_DLOPEN		/* needs an extra library: -ldl */[m
[31m-#define LUA_USE_READLINE	/* needs some extra libraries */[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUA_USE_MACOSX)[m
[31m-#define LUA_USE_POSIX[m
[31m-#define LUA_DL_DYLD		/* does not need extra library */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_USE_POSIX includes all functionallity listed as X/Open System[m
[31m-@* Interfaces Extension (XSI).[m
[31m-** CHANGE it (define it) if your system is XSI compatible.[m
[31m-*/[m
[31m-#if defined(LUA_USE_POSIX)[m
[31m-#define LUA_USE_MKSTEMP[m
[31m-#define LUA_USE_ISATTY[m
[31m-#define LUA_USE_POPEN[m
[31m-#define LUA_USE_ULONGJMP[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PATH and LUA_CPATH are the names of the environment variables that[m
[31m-@* Lua check to set its paths.[m
[31m-@@ LUA_INIT is the name of the environment variable that Lua[m
[31m-@* checks for initialization code.[m
[31m-** CHANGE them if you want different names.[m
[31m-*/[m
[31m-#define LUA_PATH        "LUA_PATH"[m
[31m-#define LUA_CPATH       "LUA_CPATH"[m
[31m-#define LUA_INIT	"LUA_INIT"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for[m
[31m-@* Lua libraries.[m
[31m-@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for[m
[31m-@* C libraries.[m
[31m-** CHANGE them if your machine has a non-conventional directory[m
[31m-** hierarchy or if you want to install your libraries in[m
[31m-** non-conventional directories.[m
[31m-*/[m
[31m-#if defined(_WIN32)[m
[31m-/*[m
[31m-** In Windows, any exclamation mark ('!') in the path is replaced by the[m
[31m-** path of the directory of the executable file of the current process.[m
[31m-*/[m
[31m-#define LUA_LDIR	"!\\lua\\"[m
[31m-#define LUA_CDIR	"!\\"[m
[31m-#define LUA_PATH_DEFAULT  \[m
[31m-		".\\?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?\\init.lua;" \[m
[31m-		             LUA_CDIR"?.lua;"  LUA_CDIR"?\\init.lua"[m
[31m-#define LUA_CPATH_DEFAULT \[m
[31m-	".\\?.dll;"  LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"[m
[31m-[m
[31m-#else[m
[31m-#define LUA_ROOT	"/usr/local/"[m
[31m-#define LUA_LDIR	LUA_ROOT "share/lua/5.1/"[m
[31m-#define LUA_CDIR	LUA_ROOT "lib/lua/5.1/"[m
[31m-#define LUA_PATH_DEFAULT  \[m
[31m-		"./?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?/init.lua;" \[m
[31m-		            LUA_CDIR"?.lua;"  LUA_CDIR"?/init.lua"[m
[31m-#define LUA_CPATH_DEFAULT \[m
[31m-	"./?.so;"  LUA_CDIR"?.so;" LUA_CDIR"loadall.so"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_DIRSEP is the directory separator (for submodules).[m
[31m-** CHANGE it if your machine does not use "/" as the directory separator[m
[31m-** and is not Windows. (On Windows Lua automatically uses "\".)[m
[31m-*/[m
[31m-#if defined(_WIN32)[m
[31m-#define LUA_DIRSEP	"\\"[m
[31m-#else[m
[31m-#define LUA_DIRSEP	"/"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PATHSEP is the character that separates templates in a path.[m
[31m-@@ LUA_PATH_MARK is the string that marks the substitution points in a[m
[31m-@* template.[m
[31m-@@ LUA_EXECDIR in a Windows path is replaced by the executable's[m
[31m-@* directory.[m
[31m-@@ LUA_IGMARK is a mark to ignore all before it when bulding the[m
[31m-@* luaopen_ function name.[m
[31m-** CHANGE them if for some reason your system cannot use those[m
[31m-** characters. (E.g., if one of those characters is a common character[m
[31m-** in file/directory names.) Probably you do not need to change them.[m
[31m-*/[m
[31m-#define LUA_PATHSEP	";"[m
[31m-#define LUA_PATH_MARK	"?"[m
[31m-#define LUA_EXECDIR	"!"[m
[31m-#define LUA_IGMARK	"-"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger.[m
[31m-** CHANGE that if ptrdiff_t is not adequate on your machine. (On most[m
[31m-** machines, ptrdiff_t gives a good choice between int or long.)[m
[31m-*/[m
[31m-#define LUA_INTEGER	ptrdiff_t[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_API is a mark for all core API functions.[m
[31m-@@ LUALIB_API is a mark for all standard library functions.[m
[31m-** CHANGE them if you need to define those functions in some special way.[m
[31m-** For instance, if you want to create one Windows DLL with the core and[m
[31m-** the libraries, you may want to use the following definition (define[m
[31m-** LUA_BUILD_AS_DLL to get it).[m
[31m-*/[m
[31m-#if defined(LUA_BUILD_AS_DLL)[m
[31m-[m
[31m-#if defined(LUA_CORE) || defined(LUA_LIB)[m
[31m-#define LUA_API __declspec(dllexport)[m
[31m-#else[m
[31m-#define LUA_API __declspec(dllimport)[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define LUA_API		extern[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* more often than not the libs go together with the core */[m
[31m-#define LUALIB_API	LUA_API[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_FUNC is a mark for all extern functions that are not to be[m
[31m-@* exported to outside modules.[m
[31m-@@ LUAI_DATA is a mark for all extern (const) variables that are not to[m
[31m-@* be exported to outside modules.[m
[31m-** CHANGE them if you need to mark them in some special way. Elf/gcc[m
[31m-** (versions 3.2 and later) mark them as "hidden" to optimize access[m
[31m-** when Lua is compiled as a shared library.[m
[31m-*/[m
[31m-#if defined(luaall_c)[m
[31m-#define LUAI_FUNC	static[m
[31m-#define LUAI_DATA	/* empty */[m
[31m-[m
[31m-#elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \[m
[31m-      defined(__ELF__)[m
[31m-#define LUAI_FUNC	__attribute__((visibility("hidden"))) extern[m
[31m-#define LUAI_DATA	LUAI_FUNC[m
[31m-[m
[31m-#else[m
[31m-#define LUAI_FUNC	extern[m
[31m-#define LUAI_DATA	extern[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_QL describes how error messages quote program elements.[m
[31m-** CHANGE it if you want a different appearance.[m
[31m-*/[m
[31m-#define LUA_QL(x)	"'" x "'"[m
[31m-#define LUA_QS		LUA_QL("%s")[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_IDSIZE gives the maximum size for the description of the source[m
[31m-@* of a function in debug information.[m
[31m-** CHANGE it if you want a different size.[m
[31m-*/[m
[31m-#define LUA_IDSIZE	60[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {==================================================================[m
[31m-** Stand-alone configuration[m
[31m-** ===================================================================[m
[31m-*/[m
[31m-[m
[31m-#if defined(lua_c) || defined(luaall_c)[m
[31m-[m
[31m-/*[m
[31m-@@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that[m
[31m-@* is, whether we're running lua interactively).[m
[31m-** CHANGE it if you have a better definition for non-POSIX/non-Windows[m
[31m-** systems.[m
[31m-*/[m
[31m-#if defined(LUA_USE_ISATTY)[m
[31m-#include <unistd.h>[m
[31m-#define lua_stdin_is_tty()	isatty(0)[m
[31m-#elif defined(LUA_WIN)[m
[31m-#include <io.h>[m
[31m-#include <stdio.h>[m
[31m-#define lua_stdin_is_tty()	_isatty(_fileno(stdin))[m
[31m-#else[m
[31m-#define lua_stdin_is_tty()	1  /* assume stdin is a tty */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PROMPT is the default prompt used by stand-alone Lua.[m
[31m-@@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua.[m
[31m-** CHANGE them if you want different prompts. (You can also change the[m
[31m-** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.)[m
[31m-*/[m
[31m-#define LUA_PROMPT		"> "[m
[31m-#define LUA_PROMPT2		">> "[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PROGNAME is the default name for the stand-alone Lua program.[m
[31m-** CHANGE it if your stand-alone interpreter has a different name and[m
[31m-** your system is not able to detect that name automatically.[m
[31m-*/[m
[31m-#define LUA_PROGNAME		"lua"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_MAXINPUT is the maximum length for an input line in the[m
[31m-@* stand-alone interpreter.[m
[31m-** CHANGE it if you need longer lines.[m
[31m-*/[m
[31m-#define LUA_MAXINPUT	512[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ lua_readline defines how to show a prompt and then read a line from[m
[31m-@* the standard input.[m
[31m-@@ lua_saveline defines how to "save" a read line in a "history".[m
[31m-@@ lua_freeline defines how to free a line read by lua_readline.[m
[31m-** CHANGE them if you want to improve this functionality (e.g., by using[m
[31m-** GNU readline and history facilities).[m
[31m-*/[m
[31m-#if defined(LUA_USE_READLINE)[m
[31m-#include <stdio.h>[m
[31m-#include <readline/readline.h>[m
[31m-#include <readline/history.h>[m
[31m-#define lua_readline(L,b,p)	((void)L, ((b)=readline(p)) != NULL)[m
[31m-#define lua_saveline(L,idx) \[m
[31m-	if (lua_strlen(L,idx) > 0)  /* non-empty line? */ \[m
[31m-	  add_history(lua_tostring(L, idx));  /* add it to history */[m
[31m-#define lua_freeline(L,b)	((void)L, free(b))[m
[31m-#else[m
[31m-#define lua_readline(L,b,p)	\[m
[31m-	((void)L, fputs(p, stdout), fflush(stdout),  /* show prompt */ \[m
[31m-	fgets(b, LUA_MAXINPUT, stdin) != NULL)  /* get line */[m
[31m-#define lua_saveline(L,idx)	{ (void)L; (void)idx; }[m
[31m-#define lua_freeline(L,b)	{ (void)L; (void)b; }[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* }================================================================== */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles[m
[31m-@* as a percentage.[m
[31m-** CHANGE it if you want the GC to run faster or slower (higher values[m
[31m-** mean larger pauses which mean slower collection.) You can also change[m
[31m-** this value dynamically.[m
[31m-*/[m
[31m-#define LUAI_GCPAUSE	200  /* 200% (wait memory to double before next GC) */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_GCMUL defines the default speed of garbage collection relative to[m
[31m-@* memory allocation as a percentage.[m
[31m-** CHANGE it if you want to change the granularity of the garbage[m
[31m-** collection. (Higher values mean coarser collections. 0 represents[m
[31m-** infinity, where each step performs a full collection.) You can also[m
[31m-** change this value dynamically.[m
[31m-*/[m
[31m-#define LUAI_GCMUL	200 /* GC runs 'twice the speed' of memory allocation */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_GETN controls compatibility with old getn behavior.[m
[31m-** CHANGE it (define it) if you want exact compatibility with the[m
[31m-** behavior of setn/getn in Lua 5.0.[m
[31m-*/[m
[31m-#undef LUA_COMPAT_GETN[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib.[m
[31m-** CHANGE it to undefined as soon as you do not need a global 'loadlib'[m
[31m-** function (the function is still available as 'package.loadlib').[m
[31m-*/[m
[31m-#undef LUA_COMPAT_LOADLIB[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_VARARG controls compatibility with old vararg feature.[m
[31m-** CHANGE it to undefined as soon as your programs use only '...' to[m
[31m-** access vararg parameters (instead of the old 'arg' table).[m
[31m-*/[m
[31m-#define LUA_COMPAT_VARARG[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_MOD controls compatibility with old math.mod function.[m
[31m-** CHANGE it to undefined as soon as your programs use 'math.fmod' or[m
[31m-** the new '%' operator instead of 'math.mod'.[m
[31m-*/[m
[31m-#define LUA_COMPAT_MOD[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting[m
[31m-@* facility.[m
[31m-** CHANGE it to 2 if you want the old behaviour, or undefine it to turn[m
[31m-** off the advisory error when nesting [[...]].[m
[31m-*/[m
[31m-#define LUA_COMPAT_LSTR		1[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name.[m
[31m-** CHANGE it to undefined as soon as you rename 'string.gfind' to[m
[31m-** 'string.gmatch'.[m
[31m-*/[m
[31m-#define LUA_COMPAT_GFIND[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib'[m
[31m-@* behavior.[m
[31m-** CHANGE it to undefined as soon as you replace to 'luaL_register'[m
[31m-** your uses of 'luaL_openlib'[m
[31m-*/[m
[31m-#define LUA_COMPAT_OPENLIB[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ luai_apicheck is the assert macro used by the Lua-C API.[m
[31m-** CHANGE luai_apicheck if you want Lua to perform some checks in the[m
[31m-** parameters it gets from API calls. This may slow down the interpreter[m
[31m-** a bit, but may be quite useful when debugging C code that interfaces[m
[31m-** with Lua. A useful redefinition is to use assert.h.[m
[31m-*/[m
[31m-#if defined(LUA_USE_APICHECK)[m
[31m-#include <assert.h>[m
[31m-#define luai_apicheck(L,o)	{ (void)L; assert(o); }[m
[31m-#else[m
[31m-#define luai_apicheck(L,o)	{ (void)L; }[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_BITSINT defines the number of bits in an int.[m
[31m-** CHANGE here if Lua cannot automatically detect the number of bits of[m
[31m-** your machine. Probably you do not need to change this.[m
[31m-*/[m
[31m-/* avoid overflows in comparison */[m
[31m-#if INT_MAX-20 < 32760[m
[31m-#define LUAI_BITSINT	16[m
[31m-#elif INT_MAX > 2147483640L[m
[31m-/* int has at least 32 bits */[m
[31m-#define LUAI_BITSINT	32[m
[31m-#else[m
[31m-#error "you must define LUA_BITSINT with number of bits in an integer"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_UINT32 is an unsigned integer with at least 32 bits.[m
[31m-@@ LUAI_INT32 is an signed integer with at least 32 bits.[m
[31m-@@ LUAI_UMEM is an unsigned integer big enough to count the total[m
[31m-@* memory used by Lua.[m
[31m-@@ LUAI_MEM is a signed integer big enough to count the total memory[m
[31m-@* used by Lua.[m
[31m-** CHANGE here if for some weird reason the default definitions are not[m
[31m-** good enough for your machine. (The definitions in the 'else'[m
[31m-** part always works, but may waste space on machines with 64-bit[m
[31m-** longs.) Probably you do not need to change this.[m
[31m-*/[m
[31m-#if LUAI_BITSINT >= 32[m
[31m-#define LUAI_UINT32	unsigned int[m
[31m-#define LUAI_INT32	int[m
[31m-#define LUAI_MAXINT32	INT_MAX[m
[31m-#define LUAI_UMEM	size_t[m
[31m-#define LUAI_MEM	ptrdiff_t[m
[31m-#else[m
[31m-/* 16-bit ints */[m
[31m-#define LUAI_UINT32	unsigned long[m
[31m-#define LUAI_INT32	long[m
[31m-#define LUAI_MAXINT32	LONG_MAX[m
[31m-#define LUAI_UMEM	unsigned long[m
[31m-#define LUAI_MEM	long[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXCALLS limits the number of nested calls.[m
[31m-** CHANGE it if you need really deep recursive calls. This limit is[m
[31m-** arbitrary; its only purpose is to stop infinite recursion before[m
[31m-** exhausting memory.[m
[31m-*/[m
[31m-#define LUAI_MAXCALLS	20000[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function[m
[31m-@* can use.[m
[31m-** CHANGE it if you need lots of (Lua) stack space for your C[m
[31m-** functions. This limit is arbitrary; its only purpose is to stop C[m
[31m-** functions to consume unlimited stack space. (must be smaller than[m
[31m-** -LUA_REGISTRYINDEX)[m
[31m-*/[m
[31m-#define LUAI_MAXCSTACK	8000[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {==================================================================[m
[31m-** CHANGE (to smaller values) the following definitions if your system[m
[31m-** has a small C stack. (Or you may want to change them to larger[m
[31m-** values if your system has a large C stack and these limits are[m
[31m-** too rigid for you.) Some of these constants control the size of[m
[31m-** stack-allocated arrays used by the compiler or the interpreter, while[m
[31m-** others limit the maximum number of recursive calls that the compiler[m
[31m-** or the interpreter can perform. Values too large may cause a C stack[m
[31m-** overflow for some forms of deep constructs.[m
[31m-** ===================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and[m
[31m-@* syntactical nested non-terminals in a program.[m
[31m-*/[m
[31m-#define LUAI_MAXCCALLS		200[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXVARS is the maximum number of local variables per function[m
[31m-@* (must be smaller than 250).[m
[31m-*/[m
[31m-#define LUAI_MAXVARS		200[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function[m
[31m-@* (must be smaller than 250).[m
[31m-*/[m
[31m-#define LUAI_MAXUPVALUES	60[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.[m
[31m-*/[m
[31m-#define LUAL_BUFFERSIZE		BUFSIZ[m
[31m-[m
[31m-/* }================================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {==================================================================[m
[31m-@@ LUA_NUMBER is the type of numbers in Lua.[m
[31m-** CHANGE the following definitions only if you want to build Lua[m
[31m-** with a number type different from double. You may also need to[m
[31m-** change lua_number2int & lua_number2integer.[m
[31m-** ===================================================================[m
[31m-*/[m
[31m-[m
[31m-#define LUA_NUMBER_DOUBLE[m
[31m-#define LUA_NUMBER	double[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'[m
[31m-@* over a number.[m
[31m-*/[m
[31m-#define LUAI_UACNUMBER	double[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_NUMBER_SCAN is the format for reading numbers.[m
[31m-@@ LUA_NUMBER_FMT is the format for writing numbers.[m
[31m-@@ lua_number2str converts a number to a string.[m
[31m-@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion.[m
[31m-@@ lua_str2number converts a string to a number.[m
[31m-*/[m
[31m-#define LUA_NUMBER_SCAN		"%lf"[m
[31m-#define LUA_NUMBER_FMT		"%.14g"[m
[31m-#define lua_number2str(s,n)	sprintf((s), LUA_NUMBER_FMT, (n))[m
[31m-#define LUAI_MAXNUMBER2STR	32 /* 16 digits, sign, point, and \0 */[m
[31m-#define lua_str2number(s,p)	strtod((s), (p))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ The luai_num* macros define the primitive operations over numbers.[m
[31m-*/[m
[31m-#if defined(LUA_CORE)[m
[31m-#include <math.h>[m
[31m-#define luai_numadd(a,b)	((a)+(b))[m
[31m-#define luai_numsub(a,b)	((a)-(b))[m
[31m-#define luai_nummul(a,b)	((a)*(b))[m
[31m-#define luai_numdiv(a,b)	((a)/(b))[m
[31m-#define luai_nummod(a,b)	((a) - floor((a)/(b))*(b))[m
[31m-#define luai_numpow(a,b)	(pow(a,b))[m
[31m-#define luai_numunm(a)		(-(a))[m
[31m-#define luai_numeq(a,b)		((a)==(b))[m
[31m-#define luai_numlt(a,b)		((a)<(b))[m
[31m-#define luai_numle(a,b)		((a)<=(b))[m
[31m-#define luai_numisnan(a)	(!luai_numeq((a), (a)))[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ lua_number2int is a macro to convert lua_Number to int.[m
[31m-@@ lua_number2integer is a macro to convert lua_Number to lua_Integer.[m
[31m-** CHANGE them if you know a faster way to convert a lua_Number to[m
[31m-** int (with any rounding method and without throwing errors) in your[m
[31m-** system. In Pentium machines, a naive typecast from double to int[m
[31m-** in C is extremely slow, so any alternative is worth trying.[m
[31m-*/[m
[31m-[m
[31m-/* On a Pentium, resort to a trick */[m
[31m-#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \[m
[31m-    (defined(__i386) || defined (_M_IX86) || defined(__i386__))[m
[31m-[m
[31m-/* On a Microsoft compiler, use assembler */[m
[31m-#if defined(_MSC_VER)[m
[31m-[m
[31m-#define lua_number2int(i,d)   __asm fld d   __asm fistp i[m
[31m-#define lua_number2integer(i,n)		lua_number2int(i, n)[m
[31m-[m
[31m-/* the next trick should work on any Pentium, but sometimes clashes[m
[31m-   with a DirectX idiosyncrasy */[m
[31m-#else[m
[31m-[m
[31m-union luai_Cast { double l_d; long l_l; };[m
[31m-#define lua_number2int(i,d) \[m
[31m-  { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }[m
[31m-#define lua_number2integer(i,n)		lua_number2int(i, n)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* this option always works, but may be slow */[m
[31m-#else[m
[31m-#define lua_number2int(i,d)	((i)=(int)(d))[m
[31m-#define lua_number2integer(i,d)	((i)=(lua_Integer)(d))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* }================================================================== */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment.[m
[31m-** CHANGE it if your system requires alignments larger than double. (For[m
[31m-** instance, if your system supports long doubles and they must be[m
[31m-** aligned in 16-byte boundaries, then you should add long double in the[m
[31m-** union.) Probably you do not need to change this.[m
[31m-*/[m
[31m-#define LUAI_USER_ALIGNMENT_T	union { double u; void *s; long l; }[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_THROW/LUAI_TRY define how Lua does exception handling.[m
[31m-** CHANGE them if you prefer to use longjmp/setjmp even with C++[m
[31m-** or if want/don't to use _longjmp/_setjmp instead of regular[m
[31m-** longjmp/setjmp. By default, Lua handles errors with exceptions when[m
[31m-** compiling as C++ code, with _longjmp/_setjmp when asked to use them,[m
[31m-** and with longjmp/setjmp otherwise.[m
[31m-*/[m
[31m-#if defined(__cplusplus)[m
[31m-/* C++ exceptions */[m
[31m-#define LUAI_THROW(L,c)	throw(c)[m
[31m-#define LUAI_TRY(L,c,a)	try { a } catch(...) \[m
[31m-	{ if ((c)->status == 0) (c)->status = -1; }[m
[31m-#define luai_jmpbuf	int  /* dummy variable */[m
[31m-[m
[31m-#elif defined(LUA_USE_ULONGJMP)[m
[31m-/* in Unix, try _longjmp/_setjmp (more efficient) */[m
[31m-#define LUAI_THROW(L,c)	_longjmp((c)->b, 1)[m
[31m-#define LUAI_TRY(L,c,a)	if (_setjmp((c)->b) == 0) { a }[m
[31m-#define luai_jmpbuf	jmp_buf[m
[31m-[m
[31m-#else[m
[31m-/* default handling with long jumps */[m
[31m-#define LUAI_THROW(L,c)	longjmp((c)->b, 1)[m
[31m-#define LUAI_TRY(L,c,a)	if (setjmp((c)->b) == 0) { a }[m
[31m-#define luai_jmpbuf	jmp_buf[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_MAXCAPTURES is the maximum number of captures that a pattern[m
[31m-@* can do during pattern-matching.[m
[31m-** CHANGE it if you need more captures. This limit is arbitrary.[m
[31m-*/[m
[31m-#define LUA_MAXCAPTURES		32[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ lua_tmpnam is the function that the OS library uses to create a[m
[31m-@* temporary name.[m
[31m-@@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam.[m
[31m-** CHANGE them if you have an alternative to tmpnam (which is considered[m
[31m-** insecure) or if you want the original tmpnam anyway.  By default, Lua[m
[31m-** uses tmpnam except when POSIX is available, where it uses mkstemp.[m
[31m-*/[m
[31m-#if defined(loslib_c) || defined(luaall_c)[m
[31m-[m
[31m-#if defined(LUA_USE_MKSTEMP)[m
[31m-#include <unistd.h>[m
[31m-#define LUA_TMPNAMBUFSIZE	32[m
[31m-#define lua_tmpnam(b,e)	{ \[m
[31m-	strcpy(b, "/tmp/lua_XXXXXX"); \[m
[31m-	e = mkstemp(b); \[m
[31m-	if (e != -1) close(e); \[m
[31m-	e = (e == -1); }[m
[31m-[m
[31m-#else[m
[31m-#define LUA_TMPNAMBUFSIZE	L_tmpnam[m
[31m-#define lua_tmpnam(b,e)		{ e = (tmpnam(b) == NULL); }[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ lua_popen spawns a new process connected to the current one through[m
[31m-@* the file streams.[m
[31m-** CHANGE it if you have a way to implement it in your system.[m
[31m-*/[m
[31m-#if defined(LUA_USE_POPEN)[m
[31m-[m
[31m-#define lua_popen(L,c,m)	((void)L, fflush(NULL), popen(c,m))[m
[31m-#define lua_pclose(L,file)	((void)L, (pclose(file) != -1))[m
[31m-[m
[31m-#elif defined(LUA_WIN)[m
[31m-[m
[31m-#define lua_popen(L,c,m)	((void)L, _popen(c,m))[m
[31m-#define lua_pclose(L,file)	((void)L, (_pclose(file) != -1))[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define lua_popen(L,c,m)	((void)((void)c, m),  \[m
[31m-		luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0)[m
[31m-#define lua_pclose(L,file)		((void)((void)L, file), 0)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_DL_* define which dynamic-library system Lua should use.[m
[31m-** CHANGE here if Lua has problems choosing the appropriate[m
[31m-** dynamic-library system for your platform (either Windows' DLL, Mac's[m
[31m-** dyld, or Unix's dlopen). If your system is some kind of Unix, there[m
[31m-** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for[m
[31m-** it.  To use dlopen you also need to adapt the src/Makefile (probably[m
[31m-** adding -ldl to the linker options), so Lua does not select it[m
[31m-** automatically.  (When you change the makefile to add -ldl, you must[m
[31m-** also add -DLUA_USE_DLOPEN.)[m
[31m-** If you do not want any kind of dynamic library, undefine all these[m
[31m-** options.[m
[31m-** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD.[m
[31m-*/[m
[31m-#if defined(LUA_USE_DLOPEN)[m
[31m-#define LUA_DL_DLOPEN[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUA_WIN)[m
[31m-#define LUA_DL_DLL[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State[m
[31m-@* (the data goes just *before* the lua_State pointer).[m
[31m-** CHANGE (define) this if you really need that. This value must be[m
[31m-** a multiple of the maximum alignment required for your machine.[m
[31m-*/[m
[31m-#define LUAI_EXTRASPACE		0[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ luai_userstate* allow user-specific actions on threads.[m
[31m-** CHANGE them if you defined LUAI_EXTRASPACE and need to do something[m
[31m-** extra when a thread is created/deleted/resumed/yielded.[m
[31m-*/[m
[31m-#define luai_userstateopen(L)		((void)L)[m
[31m-#define luai_userstateclose(L)		((void)L)[m
[31m-#define luai_userstatethread(L,L1)	((void)L)[m
[31m-#define luai_userstatefree(L)		((void)L)[m
[31m-#define luai_userstateresume(L,n)	((void)L)[m
[31m-#define luai_userstateyield(L,n)	((void)L)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_INTFRMLEN is the length modifier for integer conversions[m
[31m-@* in 'string.format'.[m
[31m-@@ LUA_INTFRM_T is the integer type correspoding to the previous length[m
[31m-@* modifier.[m
[31m-** CHANGE them if your system supports long long or does not support long.[m
[31m-*/[m
[31m-[m
[31m-#if defined(LUA_USELONGLONG)[m
[31m-[m
[31m-#define LUA_INTFRMLEN		"ll"[m
[31m-#define LUA_INTFRM_T		long long[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define LUA_INTFRMLEN		"l"[m
[31m-#define LUA_INTFRM_T		long[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* =================================================================== */[m
[31m-[m
[31m-/*[m
[31m-** Local configuration. You can use this space to add your redefinitions[m
[31m-** without modifying the main part of the file.[m
[31m-*/[m
[31m-[m
[31m-#undef LUA_COMPAT_VARARG[m
[31m-#undef LUA_COMPAT_MOD[m
[31m-#undef LUA_COMPAT_LSTR[m
[31m-#undef LUA_COMPAT_GFIND[m
[31m-#undef LUA_COMPAT_OPENLIB[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lualib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lualib.h[m
[1mdeleted file mode 100644[m
[1mindex 469417f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lualib.h[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lua standard libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lualib_h[m
[31m-#define lualib_h[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-/* Key to file-handle type */[m
[31m-#define LUA_FILEHANDLE		"FILE*"[m
[31m-[m
[31m-[m
[31m-#define LUA_COLIBNAME	"coroutine"[m
[31m-LUALIB_API int (luaopen_base) (lua_State *L);[m
[31m-[m
[31m-#define LUA_TABLIBNAME	"table"[m
[31m-LUALIB_API int (luaopen_table) (lua_State *L);[m
[31m-[m
[31m-#define LUA_IOLIBNAME	"io"[m
[31m-LUALIB_API int (luaopen_io) (lua_State *L);[m
[31m-[m
[31m-#define LUA_OSLIBNAME	"os"[m
[31m-LUALIB_API int (luaopen_os) (lua_State *L);[m
[31m-[m
[31m-#define LUA_STRLIBNAME	"string"[m
[31m-LUALIB_API int (luaopen_string) (lua_State *L);[m
[31m-[m
[31m-#define LUA_MATHLIBNAME	"math"[m
[31m-LUALIB_API int (luaopen_math) (lua_State *L);[m
[31m-[m
[31m-#define LUA_DBLIBNAME	"debug"[m
[31m-LUALIB_API int (luaopen_debug) (lua_State *L);[m
[31m-[m
[31m-#define LUA_LOADLIBNAME	"package"[m
[31m-LUALIB_API int (luaopen_package) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/* open all previous libraries */[m
[31m-LUALIB_API void (luaL_openlibs) (lua_State *L); [m
[31m-[m
[31m-[m
[31m-[m
[31m-#ifndef lua_assert[m
[31m-#define lua_assert(x)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lundump.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lundump.c[m
[1mdeleted file mode 100644[m
[1mindex 8010a45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lundump.c[m
[1m+++ /dev/null[m
[36m@@ -1,227 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $[m
[31m-** load precompiled Lua chunks[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lundump_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstring.h"[m
[31m-#include "lundump.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-typedef struct {[m
[31m- lua_State* L;[m
[31m- ZIO* Z;[m
[31m- Mbuffer* b;[m
[31m- const char* name;[m
[31m-} LoadState;[m
[31m-[m
[31m-#ifdef LUAC_TRUST_BINARIES[m
[31m-#define IF(c,s)[m
[31m-#define error(S,s)[m
[31m-#else[m
[31m-#define IF(c,s)		if (c) error(S,s)[m
[31m-[m
[31m-static void error(LoadState* S, const char* why)[m
[31m-{[m
[31m- luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why);[m
[31m- luaD_throw(S->L,LUA_ERRSYNTAX);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#define LoadMem(S,b,n,size)	LoadBlock(S,b,(n)*(size))[m
[31m-#define	LoadByte(S)		(lu_byte)LoadChar(S)[m
[31m-#define LoadVar(S,x)		LoadMem(S,&x,1,sizeof(x))[m
[31m-#define LoadVector(S,b,n,size)	LoadMem(S,b,n,size)[m
[31m-[m
[31m-static void LoadBlock(LoadState* S, void* b, size_t size)[m
[31m-{[m
[31m- size_t r=luaZ_read(S->Z,b,size);[m
[31m- IF (r!=0, "unexpected end");[m
[31m-}[m
[31m-[m
[31m-static int LoadChar(LoadState* S)[m
[31m-{[m
[31m- char x;[m
[31m- LoadVar(S,x);[m
[31m- return x;[m
[31m-}[m
[31m-[m
[31m-static int LoadInt(LoadState* S)[m
[31m-{[m
[31m- int x;[m
[31m- LoadVar(S,x);[m
[31m- IF (x<0, "bad integer");[m
[31m- return x;[m
[31m-}[m
[31m-[m
[31m-static lua_Number LoadNumber(LoadState* S)[m
[31m-{[m
[31m- lua_Number x;[m
[31m- LoadVar(S,x);[m
[31m- return x;[m
[31m-}[m
[31m-[m
[31m-static TString* LoadString(LoadState* S)[m
[31m-{[m
[31m- size_t size;[m
[31m- LoadVar(S,size);[m
[31m- if (size==0)[m
[31m-  return NULL;[m
[31m- else[m
[31m- {[m
[31m-  char* s=luaZ_openspace(S->L,S->b,size);[m
[31m-  LoadBlock(S,s,size);[m
[31m-  return luaS_newlstr(S->L,s,size-1);		/* remove trailing '\0' */[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void LoadCode(LoadState* S, Proto* f)[m
[31m-{[m
[31m- int n=LoadInt(S);[m
[31m- f->code=luaM_newvector(S->L,n,Instruction);[m
[31m- f->sizecode=n;[m
[31m- LoadVector(S,f->code,n,sizeof(Instruction));[m
[31m-}[m
[31m-[m
[31m-static Proto* LoadFunction(LoadState* S, TString* p);[m
[31m-[m
[31m-static void LoadConstants(LoadState* S, Proto* f)[m
[31m-{[m
[31m- int i,n;[m
[31m- n=LoadInt(S);[m
[31m- f->k=luaM_newvector(S->L,n,TValue);[m
[31m- f->sizek=n;[m
[31m- for (i=0; i<n; i++) setnilvalue(&f->k[i]);[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  TValue* o=&f->k[i];[m
[31m-  int t=LoadChar(S);[m
[31m-  switch (t)[m
[31m-  {[m
[31m-   case LUA_TNIL:[m
[31m-   	setnilvalue(o);[m
[31m-	break;[m
[31m-   case LUA_TBOOLEAN:[m
[31m-   	setbvalue(o,LoadChar(S)!=0);[m
[31m-	break;[m
[31m-   case LUA_TNUMBER:[m
[31m-	setnvalue(o,LoadNumber(S));[m
[31m-	break;[m
[31m-   case LUA_TSTRING:[m
[31m-	setsvalue2n(S->L,o,LoadString(S));[m
[31m-	break;[m
[31m-   default:[m
[31m-	error(S,"bad constant");[m
[31m-	break;[m
[31m-  }[m
[31m- }[m
[31m- n=LoadInt(S);[m
[31m- f->p=luaM_newvector(S->L,n,Proto*);[m
[31m- f->sizep=n;[m
[31m- for (i=0; i<n; i++) f->p[i]=NULL;[m
[31m- for (i=0; i<n; i++) f->p[i]=LoadFunction(S,f->source);[m
[31m-}[m
[31m-[m
[31m-static void LoadDebug(LoadState* S, Proto* f)[m
[31m-{[m
[31m- int i,n;[m
[31m- n=LoadInt(S);[m
[31m- f->lineinfo=luaM_newvector(S->L,n,int);[m
[31m- f->sizelineinfo=n;[m
[31m- LoadVector(S,f->lineinfo,n,sizeof(int));[m
[31m- n=LoadInt(S);[m
[31m- f->locvars=luaM_newvector(S->L,n,LocVar);[m
[31m- f->sizelocvars=n;[m
[31m- for (i=0; i<n; i++) f->locvars[i].varname=NULL;[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  f->locvars[i].varname=LoadString(S);[m
[31m-  f->locvars[i].startpc=LoadInt(S);[m
[31m-  f->locvars[i].endpc=LoadInt(S);[m
[31m- }[m
[31m- n=LoadInt(S);[m
[31m- f->upvalues=luaM_newvector(S->L,n,TString*);[m
[31m- f->sizeupvalues=n;[m
[31m- for (i=0; i<n; i++) f->upvalues[i]=NULL;[m
[31m- for (i=0; i<n; i++) f->upvalues[i]=LoadString(S);[m
[31m-}[m
[31m-[m
[31m-static Proto* LoadFunction(LoadState* S, TString* p)[m
[31m-{[m
[31m- Proto* f;[m
[31m- if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep");[m
[31m- f=luaF_newproto(S->L);[m
[31m- setptvalue2s(S->L,S->L->top,f); incr_top(S->L);[m
[31m- f->source=LoadString(S); if (f->source==NULL) f->source=p;[m
[31m- f->linedefined=LoadInt(S);[m
[31m- f->lastlinedefined=LoadInt(S);[m
[31m- f->nups=LoadByte(S);[m
[31m- f->numparams=LoadByte(S);[m
[31m- f->is_vararg=LoadByte(S);[m
[31m- f->maxstacksize=LoadByte(S);[m
[31m- LoadCode(S,f);[m
[31m- LoadConstants(S,f);[m
[31m- LoadDebug(S,f);[m
[31m- IF (!luaG_checkcode(f), "bad code");[m
[31m- S->L->top--;[m
[31m- S->L->nCcalls--;[m
[31m- return f;[m
[31m-}[m
[31m-[m
[31m-static void LoadHeader(LoadState* S)[m
[31m-{[m
[31m- char h[LUAC_HEADERSIZE];[m
[31m- char s[LUAC_HEADERSIZE];[m
[31m- luaU_header(h);[m
[31m- LoadBlock(S,s,LUAC_HEADERSIZE);[m
[31m- IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header");[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** load precompiled chunk[m
[31m-*/[m
[31m-Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name)[m
[31m-{[m
[31m- LoadState S;[m
[31m- if (*name=='@' || *name=='=')[m
[31m-  S.name=name+1;[m
[31m- else if (*name==LUA_SIGNATURE[0])[m
[31m-  S.name="binary string";[m
[31m- else[m
[31m-  S.name=name;[m
[31m- S.L=L;[m
[31m- S.Z=Z;[m
[31m- S.b=buff;[m
[31m- LoadHeader(&S);[m
[31m- return LoadFunction(&S,luaS_newliteral(L,"=?"));[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-* make header[m
[31m-*/[m
[31m-void luaU_header (char* h)[m
[31m-{[m
[31m- int x=1;[m
[31m- memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1);[m
[31m- h+=sizeof(LUA_SIGNATURE)-1;[m
[31m- *h++=(char)LUAC_VERSION;[m
[31m- *h++=(char)LUAC_FORMAT;[m
[31m- *h++=(char)*(char*)&x;				/* endianness */[m
[31m- *h++=(char)sizeof(int);[m
[31m- *h++=(char)sizeof(size_t);[m
[31m- *h++=(char)sizeof(Instruction);[m
[31m- *h++=(char)sizeof(lua_Number);[m
[31m- *h++=(char)(((lua_Number)0.5)==0);		/* is lua_Number integral? */[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lundump.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lundump.h[m
[1mdeleted file mode 100644[m
[1mindex c80189d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lundump.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** load precompiled Lua chunks[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lundump_h[m
[31m-#define lundump_h[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-/* load one chunk; from lundump.c */[m
[31m-LUAI_FUNC Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name);[m
[31m-[m
[31m-/* make header; from lundump.c */[m
[31m-LUAI_FUNC void luaU_header (char* h);[m
[31m-[m
[31m-/* dump one chunk; from ldump.c */[m
[31m-LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip);[m
[31m-[m
[31m-#ifdef luac_c[m
[31m-/* print one chunk; from print.c */[m
[31m-LUAI_FUNC void luaU_print (const Proto* f, int full);[m
[31m-#endif[m
[31m-[m
[31m-/* for header of binary files -- this is Lua 5.1 */[m
[31m-#define LUAC_VERSION		0x51[m
[31m-[m
[31m-/* for header of binary files -- this is the official format */[m
[31m-#define LUAC_FORMAT		0[m
[31m-[m
[31m-/* size of header of binary files */[m
[31m-#define LUAC_HEADERSIZE		12[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lvm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lvm.c[m
[1mdeleted file mode 100644[m
[1mindex e0a0cd8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lvm.c[m
[1m+++ /dev/null[m
[36m@@ -1,767 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lvm.c,v 2.63.1.5 2011/08/17 20:43:11 roberto Exp $[m
[31m-** Lua virtual machine[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lvm_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lvm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* limit for table tag-method chains (to avoid loops) */[m
[31m-#define MAXTAGLOOP	100[m
[31m-[m
[31m-[m
[31m-const TValue *luaV_tonumber (const TValue *obj, TValue *n) {[m
[31m-  lua_Number num;[m
[31m-  if (ttisnumber(obj)) return obj;[m
[31m-  if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) {[m
[31m-    setnvalue(n, num);[m
[31m-    return n;[m
[31m-  }[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaV_tostring (lua_State *L, StkId obj) {[m
[31m-  if (!ttisnumber(obj))[m
[31m-    return 0;[m
[31m-  else {[m
[31m-    char s[LUAI_MAXNUMBER2STR];[m
[31m-    lua_Number n = nvalue(obj);[m
[31m-    lua_number2str(s, n);[m
[31m-    setsvalue2s(L, obj, luaS_new(L, s));[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void traceexec (lua_State *L, const Instruction *pc) {[m
[31m-  lu_byte mask = L->hookmask;[m
[31m-  const Instruction *oldpc = L->savedpc;[m
[31m-  L->savedpc = pc;[m
[31m-  if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) {[m
[31m-    resethookcount(L);[m
[31m-    luaD_callhook(L, LUA_HOOKCOUNT, -1);[m
[31m-  }[m
[31m-  if (mask & LUA_MASKLINE) {[m
[31m-    Proto *p = ci_func(L->ci)->l.p;[m
[31m-    int npc = pcRel(pc, p);[m
[31m-    int newline = getline(p, npc);[m
[31m-    /* call linehook when enter a new function, when jump back (loop),[m
[31m-       or when enter a new line */[m
[31m-    if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p)))[m
[31m-      luaD_callhook(L, LUA_HOOKLINE, newline);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void callTMres (lua_State *L, StkId res, const TValue *f,[m
[31m-                        const TValue *p1, const TValue *p2) {[m
[31m-  ptrdiff_t result = savestack(L, res);[m
[31m-  setobj2s(L, L->top, f);  /* push function */[m
[31m-  setobj2s(L, L->top+1, p1);  /* 1st argument */[m
[31m-  setobj2s(L, L->top+2, p2);  /* 2nd argument */[m
[31m-  luaD_checkstack(L, 3);[m
[31m-  L->top += 3;[m
[31m-  luaD_call(L, L->top - 3, 1);[m
[31m-  res = restorestack(L, result);[m
[31m-  L->top--;[m
[31m-  setobjs2s(L, res, L->top);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void callTM (lua_State *L, const TValue *f, const TValue *p1,[m
[31m-                    const TValue *p2, const TValue *p3) {[m
[31m-  setobj2s(L, L->top, f);  /* push function */[m
[31m-  setobj2s(L, L->top+1, p1);  /* 1st argument */[m
[31m-  setobj2s(L, L->top+2, p2);  /* 2nd argument */[m
[31m-  setobj2s(L, L->top+3, p3);  /* 3th argument */[m
[31m-  luaD_checkstack(L, 4);[m
[31m-  L->top += 4;[m
[31m-  luaD_call(L, L->top - 4, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {[m
[31m-  int loop;[m
[31m-  for (loop = 0; loop < MAXTAGLOOP; loop++) {[m
[31m-    const TValue *tm;[m
[31m-    if (ttistable(t)) {  /* `t' is a table? */[m
[31m-      Table *h = hvalue(t);[m
[31m-      const TValue *res = luaH_get(h, key); /* do a primitive get */[m
[31m-      if (!ttisnil(res) ||  /* result is no nil? */[m
[31m-          (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */[m
[31m-        setobj2s(L, val, res);[m
[31m-        return;[m
[31m-      }[m
[31m-      /* else will try the tag method */[m
[31m-    }[m
[31m-    else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX)))[m
[31m-      luaG_typeerror(L, t, "index");[m
[31m-    if (ttisfunction(tm)) {[m
[31m-      callTMres(L, val, tm, t, key);[m
[31m-      return;[m
[31m-    }[m
[31m-    t = tm;  /* else repeat with `tm' */ [m
[31m-  }[m
[31m-  luaG_runerror(L, "loop in gettable");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {[m
[31m-  int loop;[m
[31m-  TValue temp;[m
[31m-  for (loop = 0; loop < MAXTAGLOOP; loop++) {[m
[31m-    const TValue *tm;[m
[31m-    if (ttistable(t)) {  /* `t' is a table? */[m
[31m-      Table *h = hvalue(t);[m
[31m-      TValue *oldval = luaH_set(L, h, key); /* do a primitive set */[m
[31m-      if (!ttisnil(oldval) ||  /* result is no nil? */[m
[31m-          (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */[m
[31m-        setobj2t(L, oldval, val);[m
[31m-        h->flags = 0;[m
[31m-        luaC_barriert(L, h, val);[m
[31m-        return;[m
[31m-      }[m
[31m-      /* else will try the tag method */[m
[31m-    }[m
[31m-    else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))[m
[31m-      luaG_typeerror(L, t, "index");[m
[31m-    if (ttisfunction(tm)) {[m
[31m-      callTM(L, tm, t, key, val);[m
[31m-      return;[m
[31m-    }[m
[31m-    /* else repeat with `tm' */[m
[31m-    setobj(L, &temp, tm);  /* avoid pointing inside table (may rehash) */[m
[31m-    t = &temp;[m
[31m-  }[m
[31m-  luaG_runerror(L, "loop in settable");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,[m
[31m-                       StkId res, TMS event) {[m
[31m-  const TValue *tm = luaT_gettmbyobj(L, p1, event);  /* try first operand */[m
[31m-  if (ttisnil(tm))[m
[31m-    tm = luaT_gettmbyobj(L, p2, event);  /* try second operand */[m
[31m-  if (ttisnil(tm)) return 0;[m
[31m-  callTMres(L, res, tm, p1, p2);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2,[m
[31m-                                  TMS event) {[m
[31m-  const TValue *tm1 = fasttm(L, mt1, event);[m
[31m-  const TValue *tm2;[m
[31m-  if (tm1 == NULL) return NULL;  /* no metamethod */[m
[31m-  if (mt1 == mt2) return tm1;  /* same metatables => same metamethods */[m
[31m-  tm2 = fasttm(L, mt2, event);[m
[31m-  if (tm2 == NULL) return NULL;  /* no metamethod */[m
[31m-  if (luaO_rawequalObj(tm1, tm2))  /* same metamethods? */[m
[31m-    return tm1;[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,[m
[31m-                         TMS event) {[m
[31m-  const TValue *tm1 = luaT_gettmbyobj(L, p1, event);[m
[31m-  const TValue *tm2;[m
[31m-  if (ttisnil(tm1)) return -1;  /* no metamethod? */[m
[31m-  tm2 = luaT_gettmbyobj(L, p2, event);[m
[31m-  if (!luaO_rawequalObj(tm1, tm2))  /* different metamethods? */[m
[31m-    return -1;[m
[31m-  callTMres(L, L->top, tm1, p1, p2);[m
[31m-  return !l_isfalse(L->top);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int l_strcmp (const TString *ls, const TString *rs) {[m
[31m-  const char *l = getstr(ls);[m
[31m-  size_t ll = ls->tsv.len;[m
[31m-  const char *r = getstr(rs);[m
[31m-  size_t lr = rs->tsv.len;[m
[31m-  for (;;) {[m
[31m-    int temp = strcoll(l, r);[m
[31m-    if (temp != 0) return temp;[m
[31m-    else {  /* strings are equal up to a `\0' */[m
[31m-      size_t len = strlen(l);  /* index of first `\0' in both strings */[m
[31m-      if (len == lr)  /* r is finished? */[m
[31m-        return (len == ll) ? 0 : 1;[m
[31m-      else if (len == ll)  /* l is finished? */[m
[31m-        return -1;  /* l is smaller than r (because r is not finished) */[m
[31m-      /* both strings longer than `len'; go on comparing (after the `\0') */[m
[31m-      len++;[m
[31m-      l += len; ll -= len; r += len; lr -= len;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {[m
[31m-  int res;[m
[31m-  if (ttype(l) != ttype(r))[m
[31m-    return luaG_ordererror(L, l, r);[m
[31m-  else if (ttisnumber(l))[m
[31m-    return luai_numlt(nvalue(l), nvalue(r));[m
[31m-  else if (ttisstring(l))[m
[31m-    return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0;[m
[31m-  else if ((res = call_orderTM(L, l, r, TM_LT)) != -1)[m
[31m-    return res;[m
[31m-  return luaG_ordererror(L, l, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int lessequal (lua_State *L, const TValue *l, const TValue *r) {[m
[31m-  int res;[m
[31m-  if (ttype(l) != ttype(r))[m
[31m-    return luaG_ordererror(L, l, r);[m
[31m-  else if (ttisnumber(l))[m
[31m-    return luai_numle(nvalue(l), nvalue(r));[m
[31m-  else if (ttisstring(l))[m
[31m-    return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0;[m
[31m-  else if ((res = call_orderTM(L, l, r, TM_LE)) != -1)  /* first try `le' */[m
[31m-    return res;[m
[31m-  else if ((res = call_orderTM(L, r, l, TM_LT)) != -1)  /* else try `lt' */[m
[31m-    return !res;[m
[31m-  return luaG_ordererror(L, l, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) {[m
[31m-  const TValue *tm;[m
[31m-  lua_assert(ttype(t1) == ttype(t2));[m
[31m-  switch (ttype(t1)) {[m
[31m-    case LUA_TNIL: return 1;[m
[31m-    case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2));[m
[31m-    case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2);  /* true must be 1 !! */[m
[31m-    case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2);[m
[31m-    case LUA_TUSERDATA: {[m
[31m-      if (uvalue(t1) == uvalue(t2)) return 1;[m
[31m-      tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable,[m
[31m-                         TM_EQ);[m
[31m-      break;  /* will try TM */[m
[31m-    }[m
[31m-    case LUA_TTABLE: {[m
[31m-      if (hvalue(t1) == hvalue(t2)) return 1;[m
[31m-      tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ);[m
[31m-      break;  /* will try TM */[m
[31m-    }[m
[31m-    default: return gcvalue(t1) == gcvalue(t2);[m
[31m-  }[m
[31m-  if (tm == NULL) return 0;  /* no TM? */[m
[31m-  callTMres(L, L->top, tm, t1, t2);  /* call TM */[m
[31m-  return !l_isfalse(L->top);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaV_concat (lua_State *L, int total, int last) {[m
[31m-  do {[m
[31m-    StkId top = L->base + last + 1;[m
[31m-    int n = 2;  /* number of elements handled in this pass (at least 2) */[m
[31m-    if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) {[m
[31m-      if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT))[m
[31m-        luaG_concaterror(L, top-2, top-1);[m
[31m-    } else if (tsvalue(top-1)->len == 0)  /* second op is empty? */[m
[31m-      (void)tostring(L, top - 2);  /* result is first op (as string) */[m
[31m-    else {[m
[31m-      /* at least two string values; get as many as possible */[m
[31m-      size_t tl = tsvalue(top-1)->len;[m
[31m-      char *buffer;[m
[31m-      int i;[m
[31m-      /* collect total length */[m
[31m-      for (n = 1; n < total && tostring(L, top-n-1); n++) {[m
[31m-        size_t l = tsvalue(top-n-1)->len;[m
[31m-        if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow");[m
[31m-        tl += l;[m
[31m-      }[m
[31m-      buffer = luaZ_openspace(L, &G(L)->buff, tl);[m
[31m-      tl = 0;[m
[31m-      for (i=n; i>0; i--) {  /* concat all strings */[m
[31m-        size_t l = tsvalue(top-i)->len;[m
[31m-        memcpy(buffer+tl, svalue(top-i), l);[m
[31m-        tl += l;[m
[31m-      }[m
[31m-      setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl));[m
[31m-    }[m
[31m-    total -= n-1;  /* got `n' strings to create 1 new */[m
[31m-    last -= n-1;[m
[31m-  } while (total > 1);  /* repeat until only 1 result left */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void Arith (lua_State *L, StkId ra, const TValue *rb,[m
[31m-                   const TValue *rc, TMS op) {[m
[31m-  TValue tempb, tempc;[m
[31m-  const TValue *b, *c;[m
[31m-  if ((b = luaV_tonumber(rb, &tempb)) != NULL &&[m
[31m-      (c = luaV_tonumber(rc, &tempc)) != NULL) {[m
[31m-    lua_Number nb = nvalue(b), nc = nvalue(c);[m
[31m-    switch (op) {[m
[31m-      case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break;[m
[31m-      case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break;[m
[31m-      case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break;[m
[31m-      case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break;[m
[31m-      case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break;[m
[31m-      case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break;[m
[31m-      case TM_UNM: setnvalue(ra, luai_numunm(nb)); break;[m
[31m-      default: lua_assert(0); break;[m
[31m-    }[m
[31m-  }[m
[31m-  else if (!call_binTM(L, rb, rc, ra, op))[m
[31m-    luaG_aritherror(L, rb, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** some macros for common tasks in `luaV_execute'[m
[31m-*/[m
[31m-[m
[31m-#define runtime_check(L, c)	{ if (!(c)) break; }[m
[31m-[m
[31m-#define RA(i)	(base+GETARG_A(i))[m
[31m-/* to be used after possible stack reallocation */[m
[31m-#define RB(i)	check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))[m
[31m-#define RC(i)	check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))[m
[31m-#define RKB(i)	check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \[m
[31m-	ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))[m
[31m-#define RKC(i)	check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \[m
[31m-	ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))[m
[31m-#define KBx(i)	check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i))[m
[31m-[m
[31m-[m
[31m-#define dojump(L,pc,i)	{(pc) += (i); luai_threadyield(L);}[m
[31m-[m
[31m-[m
[31m-#define Protect(x)	{ L->savedpc = pc; {x;}; base = L->base; }[m
[31m-[m
[31m-[m
[31m-#define arith_op(op,tm) { \[m
[31m-        TValue *rb = RKB(i); \[m
[31m-        TValue *rc = RKC(i); \[m
[31m-        if (ttisnumber(rb) && ttisnumber(rc)) { \[m
[31m-          lua_Number nb = nvalue(rb), nc = nvalue(rc); \[m
[31m-          setnvalue(ra, op(nb, nc)); \[m
[31m-        } \[m
[31m-        else \[m
[31m-          Protect(Arith(L, ra, rb, rc, tm)); \[m
[31m-      }[m
[31m-[m
[31m-[m
[31m-[m
[31m-void luaV_execute (lua_State *L, int nexeccalls) {[m
[31m-  LClosure *cl;[m
[31m-  StkId base;[m
[31m-  TValue *k;[m
[31m-  const Instruction *pc;[m
[31m- reentry:  /* entry point */[m
[31m-  lua_assert(isLua(L->ci));[m
[31m-  pc = L->savedpc;[m
[31m-  cl = &clvalue(L->ci->func)->l;[m
[31m-  base = L->base;[m
[31m-  k = cl->p->k;[m
[31m-  /* main loop of interpreter */[m
[31m-  for (;;) {[m
[31m-    const Instruction i = *pc++;[m
[31m-    StkId ra;[m
[31m-    if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&[m
[31m-        (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {[m
[31m-      traceexec(L, pc);[m
[31m-      if (L->status == LUA_YIELD) {  /* did hook yield? */[m
[31m-        L->savedpc = pc - 1;[m
[31m-        return;[m
[31m-      }[m
[31m-      base = L->base;[m
[31m-    }[m
[31m-    /* warning!! several calls may realloc the stack and invalidate `ra' */[m
[31m-    ra = RA(i);[m
[31m-    lua_assert(base == L->base && L->base == L->ci->base);[m
[31m-    lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);[m
[31m-    lua_assert(L->top == L->ci->top || luaG_checkopenop(i));[m
[31m-    switch (GET_OPCODE(i)) {[m
[31m-      case OP_MOVE: {[m
[31m-        setobjs2s(L, ra, RB(i));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LOADK: {[m
[31m-        setobj2s(L, ra, KBx(i));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LOADBOOL: {[m
[31m-        setbvalue(ra, GETARG_B(i));[m
[31m-        if (GETARG_C(i)) pc++;  /* skip next instruction (if C) */[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LOADNIL: {[m
[31m-        TValue *rb = RB(i);[m
[31m-        do {[m
[31m-          setnilvalue(rb--);[m
[31m-        } while (rb >= ra);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_GETUPVAL: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        setobj2s(L, ra, cl->upvals[b]->v);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_GETGLOBAL: {[m
[31m-        TValue g;[m
[31m-        TValue *rb = KBx(i);[m
[31m-        sethvalue(L, &g, cl->env);[m
[31m-        lua_assert(ttisstring(rb));[m
[31m-        Protect(luaV_gettable(L, &g, rb, ra));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_GETTABLE: {[m
[31m-        Protect(luaV_gettable(L, RB(i), RKC(i), ra));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SETGLOBAL: {[m
[31m-        TValue g;[m
[31m-        sethvalue(L, &g, cl->env);[m
[31m-        lua_assert(ttisstring(KBx(i)));[m
[31m-        Protect(luaV_settable(L, &g, KBx(i), ra));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SETUPVAL: {[m
[31m-        UpVal *uv = cl->upvals[GETARG_B(i)];[m
[31m-        setobj(L, uv->v, ra);[m
[31m-        luaC_barrier(L, uv, ra);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SETTABLE: {[m
[31m-        Protect(luaV_settable(L, ra, RKB(i), RKC(i)));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_NEWTABLE: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        int c = GETARG_C(i);[m
[31m-        sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c)));[m
[31m-        Protect(luaC_checkGC(L));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SELF: {[m
[31m-        StkId rb = RB(i);[m
[31m-        setobjs2s(L, ra+1, rb);[m
[31m-        Protect(luaV_gettable(L, rb, RKC(i), ra));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_ADD: {[m
[31m-        arith_op(luai_numadd, TM_ADD);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SUB: {[m
[31m-        arith_op(luai_numsub, TM_SUB);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_MUL: {[m
[31m-        arith_op(luai_nummul, TM_MUL);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_DIV: {[m
[31m-        arith_op(luai_numdiv, TM_DIV);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_MOD: {[m
[31m-        arith_op(luai_nummod, TM_MOD);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_POW: {[m
[31m-        arith_op(luai_numpow, TM_POW);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_UNM: {[m
[31m-        TValue *rb = RB(i);[m
[31m-        if (ttisnumber(rb)) {[m
[31m-          lua_Number nb = nvalue(rb);[m
[31m-          setnvalue(ra, luai_numunm(nb));[m
[31m-        }[m
[31m-        else {[m
[31m-          Protect(Arith(L, ra, rb, rb, TM_UNM));[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_NOT: {[m
[31m-        int res = l_isfalse(RB(i));  /* next assignment may change this value */[m
[31m-        setbvalue(ra, res);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LEN: {[m
[31m-        const TValue *rb = RB(i);[m
[31m-        switch (ttype(rb)) {[m
[31m-          case LUA_TTABLE: {[m
[31m-            setnvalue(ra, cast_num(luaH_getn(hvalue(rb))));[m
[31m-            break;[m
[31m-          }[m
[31m-          case LUA_TSTRING: {[m
[31m-            setnvalue(ra, cast_num(tsvalue(rb)->len));[m
[31m-            break;[m
[31m-          }[m
[31m-          default: {  /* try metamethod */[m
[31m-            Protect([m
[31m-              if (!call_binTM(L, rb, luaO_nilobject, ra, TM_LEN))[m
[31m-                luaG_typeerror(L, rb, "get length of");[m
[31m-            )[m
[31m-          }[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_CONCAT: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        int c = GETARG_C(i);[m
[31m-        Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L));[m
[31m-        setobjs2s(L, RA(i), base+b);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_JMP: {[m
[31m-        dojump(L, pc, GETARG_sBx(i));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_EQ: {[m
[31m-        TValue *rb = RKB(i);[m
[31m-        TValue *rc = RKC(i);[m
[31m-        Protect([m
[31m-          if (equalobj(L, rb, rc) == GETARG_A(i))[m
[31m-            dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        )[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LT: {[m
[31m-        Protect([m
[31m-          if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i))[m
[31m-            dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        )[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LE: {[m
[31m-        Protect([m
[31m-          if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i))[m
[31m-            dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        )[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_TEST: {[m
[31m-        if (l_isfalse(ra) != GETARG_C(i))[m
[31m-          dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_TESTSET: {[m
[31m-        TValue *rb = RB(i);[m
[31m-        if (l_isfalse(rb) != GETARG_C(i)) {[m
[31m-          setobjs2s(L, ra, rb);[m
[31m-          dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        }[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_CALL: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        int nresults = GETARG_C(i) - 1;[m
[31m-        if (b != 0) L->top = ra+b;  /* else previous instruction set top */[m
[31m-        L->savedpc = pc;[m
[31m-        switch (luaD_precall(L, ra, nresults)) {[m
[31m-          case PCRLUA: {[m
[31m-            nexeccalls++;[m
[31m-            goto reentry;  /* restart luaV_execute over new Lua function */[m
[31m-          }[m
[31m-          case PCRC: {[m
[31m-            /* it was a C function (`precall' called it); adjust results */[m
[31m-            if (nresults >= 0) L->top = L->ci->top;[m
[31m-            base = L->base;[m
[31m-            continue;[m
[31m-          }[m
[31m-          default: {[m
[31m-            return;  /* yield */[m
[31m-          }[m
[31m-        }[m
[31m-      }[m
[31m-      case OP_TAILCALL: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        if (b != 0) L->top = ra+b;  /* else previous instruction set top */[m
[31m-        L->savedpc = pc;[m
[31m-        lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);[m
[31m-        switch (luaD_precall(L, ra, LUA_MULTRET)) {[m
[31m-          case PCRLUA: {[m
[31m-            /* tail call: put new frame in place of previous one */[m
[31m-            CallInfo *ci = L->ci - 1;  /* previous frame */[m
[31m-            int aux;[m
[31m-            StkId func = ci->func;[m
[31m-            StkId pfunc = (ci+1)->func;  /* previous function index */[m
[31m-            if (L->openupval) luaF_close(L, ci->base);[m
[31m-            L->base = ci->base = ci->func + ((ci+1)->base - pfunc);[m
[31m-            for (aux = 0; pfunc+aux < L->top; aux++)  /* move frame down */[m
[31m-              setobjs2s(L, func+aux, pfunc+aux);[m
[31m-            ci->top = L->top = func+aux;  /* correct top */[m
[31m-            lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize);[m
[31m-            ci->savedpc = L->savedpc;[m
[31m-            ci->tailcalls++;  /* one more call lost */[m
[31m-            L->ci--;  /* remove new frame */[m
[31m-            goto reentry;[m
[31m-          }[m
[31m-          case PCRC: {  /* it was a C function (`precall' called it) */[m
[31m-            base = L->base;[m
[31m-            continue;[m
[31m-          }[m
[31m-          default: {[m
[31m-            return;  /* yield */[m
[31m-          }[m
[31m-        }[m
[31m-      }[m
[31m-      case OP_RETURN: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        if (b != 0) L->top = ra+b-1;[m
[31m-        if (L->openupval) luaF_close(L, base);[m
[31m-        L->savedpc = pc;[m
[31m-        b = luaD_poscall(L, ra);[m
[31m-        if (--nexeccalls == 0)  /* was previous function running `here'? */[m
[31m-          return;  /* no: return */[m
[31m-        else {  /* yes: continue its execution */[m
[31m-          if (b) L->top = L->ci->top;[m
[31m-          lua_assert(isLua(L->ci));[m
[31m-          lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL);[m
[31m-          goto reentry;[m
[31m-        }[m
[31m-      }[m
[31m-      case OP_FORLOOP: {[m
[31m-        lua_Number step = nvalue(ra+2);[m
[31m-        lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */[m
[31m-        lua_Number limit = nvalue(ra+1);[m
[31m-        if (luai_numlt(0, step) ? luai_numle(idx, limit)[m
[31m-                                : luai_numle(limit, idx)) {[m
[31m-          dojump(L, pc, GETARG_sBx(i));  /* jump back */[m
[31m-          setnvalue(ra, idx);  /* update internal index... */[m
[31m-          setnvalue(ra+3, idx);  /* ...and external index */[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_FORPREP: {[m
[31m-        const TValue *init = ra;[m
[31m-        const TValue *plimit = ra+1;[m
[31m-        const TValue *pstep = ra+2;[m
[31m-        L->savedpc = pc;  /* next steps may throw errors */[m
[31m-        if (!tonumber(init, ra))[m
[31m-          luaG_runerror(L, LUA_QL("for") " initial value must be a number");[m
[31m-        else if (!tonumber(plimit, ra+1))[m
[31m-          luaG_runerror(L, LUA_QL("for") " limit must be a number");[m
[31m-        else if (!tonumber(pstep, ra+2))[m
[31m-          luaG_runerror(L, LUA_QL("for") " step must be a number");[m
[31m-        setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep)));[m
[31m-        dojump(L, pc, GETARG_sBx(i));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_TFORLOOP: {[m
[31m-        StkId cb = ra + 3;  /* call base */[m
[31m-        setobjs2s(L, cb+2, ra+2);[m
[31m-        setobjs2s(L, cb+1, ra+1);[m
[31m-        setobjs2s(L, cb, ra);[m
[31m-        L->top = cb+3;  /* func. + 2 args (state and index) */[m
[31m-        Protect(luaD_call(L, cb, GETARG_C(i)));[m
[31m-        L->top = L->ci->top;[m
[31m-        cb = RA(i) + 3;  /* previous call may change the stack */[m
[31m-        if (!ttisnil(cb)) {  /* continue loop? */[m
[31m-          setobjs2s(L, cb-1, cb);  /* save control variable */[m
[31m-          dojump(L, pc, GETARG_sBx(*pc));  /* jump back */[m
[31m-        }[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SETLIST: {[m
[31m-        int n = GETARG_B(i);[m
[31m-        int c = GETARG_C(i);[m
[31m-        int last;[m
[31m-        Table *h;[m
[31m-        if (n == 0) {[m
[31m-          n = cast_int(L->top - ra) - 1;[m
[31m-          L->top = L->ci->top;[m
[31m-        }[m
[31m-        if (c == 0) c = cast_int(*pc++);[m
[31m-        runtime_check(L, ttistable(ra));[m
[31m-        h = hvalue(ra);[m
[31m-        last = ((c-1)*LFIELDS_PER_FLUSH) + n;[m
[31m-        if (last > h->sizearray)  /* needs more space? */[m
[31m-          luaH_resizearray(L, h, last);  /* pre-alloc it at once */[m
[31m-        for (; n > 0; n--) {[m
[31m-          TValue *val = ra+n;[m
[31m-          setobj2t(L, luaH_setnum(L, h, last--), val);[m
[31m-          luaC_barriert(L, h, val);[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_CLOSE: {[m
[31m-        luaF_close(L, ra);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_CLOSURE: {[m
[31m-        Proto *p;[m
[31m-        Closure *ncl;[m
[31m-        int nup, j;[m
[31m-        p = cl->p->p[GETARG_Bx(i)];[m
[31m-        nup = p->nups;[m
[31m-        ncl = luaF_newLclosure(L, nup, cl->env);[m
[31m-        ncl->l.p = p;[m
[31m-        for (j=0; j<nup; j++, pc++) {[m
[31m-          if (GET_OPCODE(*pc) == OP_GETUPVAL)[m
[31m-            ncl->l.upvals[j] = cl->upvals[GETARG_B(*pc)];[m
[31m-          else {[m
[31m-            lua_assert(GET_OPCODE(*pc) == OP_MOVE);[m
[31m-            ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc));[m
[31m-          }[m
[31m-        }[m
[31m-        setclvalue(L, ra, ncl);[m
[31m-        Protect(luaC_checkGC(L));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_VARARG: {[m
[31m-        int b = GETARG_B(i) - 1;[m
[31m-        int j;[m
[31m-        CallInfo *ci = L->ci;[m
[31m-        int n = cast_int(ci->base - ci->func) - cl->p->numparams - 1;[m
[31m-        if (b == LUA_MULTRET) {[m
[31m-          Protect(luaD_checkstack(L, n));[m
[31m-          ra = RA(i);  /* previous call may change the stack */[m
[31m-          b = n;[m
[31m-          L->top = ra + n;[m
[31m-        }[m
[31m-        for (j = 0; j < b; j++) {[m
[31m-          if (j < n) {[m
[31m-            setobjs2s(L, ra + j, ci->base - n + j);[m
[31m-          }[m
[31m-          else {[m
[31m-            setnilvalue(ra + j);[m
[31m-          }[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lvm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lvm.h[m
[1mdeleted file mode 100644[m
[1mindex bfe4f56..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lvm.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lua virtual machine[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lvm_h[m
[31m-#define lvm_h[m
[31m-[m
[31m-[m
[31m-#include "ldo.h"[m
[31m-#include "lobject.h"[m
[31m-#include "ltm.h"[m
[31m-[m
[31m-[m
[31m-#define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o)))[m
[31m-[m
[31m-#define tonumber(o,n)	(ttype(o) == LUA_TNUMBER || \[m
[31m-                         (((o) = luaV_tonumber(o,n)) != NULL))[m
[31m-[m
[31m-#define equalobj(L,o1,o2) \[m
[31m-	(ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2))[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);[m
[31m-LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2);[m
[31m-LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n);[m
[31m-LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);[m
[31m-LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key,[m
[31m-                                            StkId val);[m
[31m-LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key,[m
[31m-                                            StkId val);[m
[31m-LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);[m
[31m-LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lzio.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lzio.c[m
[1mdeleted file mode 100644[m
[1mindex 293edd5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lzio.c[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** a generic input stream interface[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lzio_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-int luaZ_fill (ZIO *z) {[m
[31m-  size_t size;[m
[31m-  lua_State *L = z->L;[m
[31m-  const char *buff;[m
[31m-  lua_unlock(L);[m
[31m-  buff = z->reader(L, z->data, &size);[m
[31m-  lua_lock(L);[m
[31m-  if (buff == NULL || size == 0) return EOZ;[m
[31m-  z->n = size - 1;[m
[31m-  z->p = buff;[m
[31m-  return char2int(*(z->p++));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaZ_lookahead (ZIO *z) {[m
[31m-  if (z->n == 0) {[m
[31m-    if (luaZ_fill(z) == EOZ)[m
[31m-      return EOZ;[m
[31m-    else {[m
[31m-      z->n++;  /* luaZ_fill removed first byte; put back it */[m
[31m-      z->p--;[m
[31m-    }[m
[31m-  }[m
[31m-  return char2int(*z->p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {[m
[31m-  z->L = L;[m
[31m-  z->reader = reader;[m
[31m-  z->data = data;[m
[31m-  z->n = 0;[m
[31m-  z->p = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* --------------------------------------------------------------- read --- */[m
[31m-size_t luaZ_read (ZIO *z, void *b, size_t n) {[m
[31m-  while (n) {[m
[31m-    size_t m;[m
[31m-    if (luaZ_lookahead(z) == EOZ)[m
[31m-      return n;  /* return number of missing bytes */[m
[31m-    m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */[m
[31m-    memcpy(b, z->p, m);[m
[31m-    z->n -= m;[m
[31m-    z->p += m;[m
[31m-    b = (char *)b + m;[m
[31m-    n -= m;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {[m
[31m-  if (n > buff->buffsize) {[m
[31m-    if (n < LUA_MINBUFFER) n = LUA_MINBUFFER;[m
[31m-    luaZ_resizebuffer(L, buff, n);[m
[31m-  }[m
[31m-  return buff->buffer;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lzio.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lzio.h[m
[1mdeleted file mode 100644[m
[1mindex 51d695d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/lzio.h[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Buffered streams[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lzio_h[m
[31m-#define lzio_h[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lmem.h"[m
[31m-[m
[31m-[m
[31m-#define EOZ	(-1)			/* end of stream */[m
[31m-[m
[31m-typedef struct Zio ZIO;[m
[31m-[m
[31m-#define char2int(c)	cast(int, cast(unsigned char, (c)))[m
[31m-[m
[31m-#define zgetc(z)  (((z)->n--)>0 ?  char2int(*(z)->p++) : luaZ_fill(z))[m
[31m-[m
[31m-typedef struct Mbuffer {[m
[31m-  char *buffer;[m
[31m-  size_t n;[m
[31m-  size_t buffsize;[m
[31m-} Mbuffer;[m
[31m-[m
[31m-#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0)[m
[31m-[m
[31m-#define luaZ_buffer(buff)	((buff)->buffer)[m
[31m-#define luaZ_sizebuffer(buff)	((buff)->buffsize)[m
[31m-#define luaZ_bufflen(buff)	((buff)->n)[m
[31m-[m
[31m-#define luaZ_resetbuffer(buff) ((buff)->n = 0)[m
[31m-[m
[31m-[m
[31m-#define luaZ_resizebuffer(L, buff, size) \[m
[31m-	(luaM_reallocvector(L, (buff)->buffer, (buff)->buffsize, size, char), \[m
[31m-	(buff)->buffsize = size)[m
[31m-[m
[31m-#define luaZ_freebuffer(L, buff)	luaZ_resizebuffer(L, buff, 0)[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n);[m
[31m-LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader,[m
[31m-                                        void *data);[m
[31m-LUAI_FUNC size_t luaZ_read (ZIO* z, void* b, size_t n);	/* read next n bytes */[m
[31m-LUAI_FUNC int luaZ_lookahead (ZIO *z);[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* --------- Private Part ------------------ */[m
[31m-[m
[31m-struct Zio {[m
[31m-  size_t n;			/* bytes still unread */[m
[31m-  const char *p;		/* current position in buffer */[m
[31m-  lua_Reader reader;[m
[31m-  void* data;			/* additional data */[m
[31m-  lua_State *L;			/* Lua state (for reader) */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC int luaZ_fill (ZIO *z);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/print.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/print.c[m
[1mdeleted file mode 100644[m
[1mindex e240cfc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/src/print.c[m
[1m+++ /dev/null[m
[36m@@ -1,227 +0,0 @@[m
[31m-/*[m
[31m-** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $[m
[31m-** print bytecodes[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define luac_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lundump.h"[m
[31m-[m
[31m-#define PrintFunction	luaU_print[m
[31m-[m
[31m-#define Sizeof(x)	((int)sizeof(x))[m
[31m-#define VOID(p)		((const void*)(p))[m
[31m-[m
[31m-static void PrintString(const TString* ts)[m
[31m-{[m
[31m- const char* s=getstr(ts);[m
[31m- size_t i,n=ts->tsv.len;[m
[31m- putchar('"');[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  int c=s[i];[m
[31m-  switch (c)[m
[31m-  {[m
[31m-   case '"': printf("\\\""); break;[m
[31m-   case '\\': printf("\\\\"); break;[m
[31m-   case '\a': printf("\\a"); break;[m
[31m-   case '\b': printf("\\b"); break;[m
[31m-   case '\f': printf("\\f"); break;[m
[31m-   case '\n': printf("\\n"); break;[m
[31m-   case '\r': printf("\\r"); break;[m
[31m-   case '\t': printf("\\t"); break;[m
[31m-   case '\v': printf("\\v"); break;[m
[31m-   default:	if (isprint((unsigned char)c))[m
[31m-   			putchar(c);[m
[31m-		else[m
[31m-			printf("\\%03u",(unsigned char)c);[m
[31m-  }[m
[31m- }[m
[31m- putchar('"');[m
[31m-}[m
[31m-[m
[31m-static void PrintConstant(const Proto* f, int i)[m
[31m-{[m
[31m- const TValue* o=&f->k[i];[m
[31m- switch (ttype(o))[m
[31m- {[m
[31m-  case LUA_TNIL:[m
[31m-	printf("nil");[m
[31m-	break;[m
[31m-  case LUA_TBOOLEAN:[m
[31m-	printf(bvalue(o) ? "true" : "false");[m
[31m-	break;[m
[31m-  case LUA_TNUMBER:[m
[31m-	printf(LUA_NUMBER_FMT,nvalue(o));[m
[31m-	break;[m
[31m-  case LUA_TSTRING:[m
[31m-	PrintString(rawtsvalue(o));[m
[31m-	break;[m
[31m-  default:				/* cannot happen */[m
[31m-	printf("? type=%d",ttype(o));[m
[31m-	break;[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void PrintCode(const Proto* f)[m
[31m-{[m
[31m- const Instruction* code=f->code;[m
[31m- int pc,n=f->sizecode;[m
[31m- for (pc=0; pc<n; pc++)[m
[31m- {[m
[31m-  Instruction i=code[pc];[m
[31m-  OpCode o=GET_OPCODE(i);[m
[31m-  int a=GETARG_A(i);[m
[31m-  int b=GETARG_B(i);[m
[31m-  int c=GETARG_C(i);[m
[31m-  int bx=GETARG_Bx(i);[m
[31m-  int sbx=GETARG_sBx(i);[m
[31m-  int line=getline(f,pc);[m
[31m-  printf("\t%d\t",pc+1);[m
[31m-  if (line>0) printf("[%d]\t",line); else printf("[-]\t");[m
[31m-  printf("%-9s\t",luaP_opnames[o]);[m
[31m-  switch (getOpMode(o))[m
[31m-  {[m
[31m-   case iABC:[m
[31m-    printf("%d",a);[m
[31m-    if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b);[m
[31m-    if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c);[m
[31m-    break;[m
[31m-   case iABx:[m
[31m-    if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx);[m
[31m-    break;[m
[31m-   case iAsBx:[m
[31m-    if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx);[m
[31m-    break;[m
[31m-  }[m
[31m-  switch (o)[m
[31m-  {[m
[31m-   case OP_LOADK:[m
[31m-    printf("\t; "); PrintConstant(f,bx);[m
[31m-    break;[m
[31m-   case OP_GETUPVAL:[m
[31m-   case OP_SETUPVAL:[m
[31m-    printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-");[m
[31m-    break;[m
[31m-   case OP_GETGLOBAL:[m
[31m-   case OP_SETGLOBAL:[m
[31m-    printf("\t; %s",svalue(&f->k[bx]));[m
[31m-    break;[m
[31m-   case OP_GETTABLE:[m
[31m-   case OP_SELF:[m
[31m-    if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); }[m
[31m-    break;[m
[31m-   case OP_SETTABLE:[m
[31m-   case OP_ADD:[m
[31m-   case OP_SUB:[m
[31m-   case OP_MUL:[m
[31m-   case OP_DIV:[m
[31m-   case OP_POW:[m
[31m-   case OP_EQ:[m
[31m-   case OP_LT:[m
[31m-   case OP_LE:[m
[31m-    if (ISK(b) || ISK(c))[m
[31m-    {[m
[31m-     printf("\t; ");[m
[31m-     if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-");[m
[31m-     printf(" ");[m
[31m-     if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-");[m
[31m-    }[m
[31m-    break;[m
[31m-   case OP_JMP:[m
[31m-   case OP_FORLOOP:[m
[31m-   case OP_FORPREP:[m
[31m-    printf("\t; to %d",sbx+pc+2);[m
[31m-    break;[m
[31m-   case OP_CLOSURE:[m
[31m-    printf("\t; %p",VOID(f->p[bx]));[m
[31m-    break;[m
[31m-   case OP_SETLIST:[m
[31m-    if (c==0) printf("\t; %d",(int)code[++pc]);[m
[31m-    else printf("\t; %d",c);[m
[31m-    break;[m
[31m-   default:[m
[31m-    break;[m
[31m-  }[m
[31m-  printf("\n");[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-#define SS(x)	(x==1)?"":"s"[m
[31m-#define S(x)	x,SS(x)[m
[31m-[m
[31m-static void PrintHeader(const Proto* f)[m
[31m-{[m
[31m- const char* s=getstr(f->source);[m
[31m- if (*s=='@' || *s=='=')[m
[31m-  s++;[m
[31m- else if (*s==LUA_SIGNATURE[0])[m
[31m-  s="(bstring)";[m
[31m- else[m
[31m-  s="(string)";[m
[31m- printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n",[m
[31m- 	(f->linedefined==0)?"main":"function",s,[m
[31m-	f->linedefined,f->lastlinedefined,[m
[31m-	S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f));[m
[31m- printf("%d%s param%s, %d slot%s, %d upvalue%s, ",[m
[31m-	f->numparams,f->is_vararg?"+":"",SS(f->numparams),[m
[31m-	S(f->maxstacksize),S(f->nups));[m
[31m- printf("%d local%s, %d constant%s, %d function%s\n",[m
[31m-	S(f->sizelocvars),S(f->sizek),S(f->sizep));[m
[31m-}[m
[31m-[m
[31m-static void PrintConstants(const Proto* f)[m
[31m-{[m
[31m- int i,n=f->sizek;[m
[31m- printf("constants (%d) for %p:\n",n,VOID(f));[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  printf("\t%d\t",i+1);[m
[31m-  PrintConstant(f,i);[m
[31m-  printf("\n");[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void PrintLocals(const Proto* f)[m
[31m-{[m
[31m- int i,n=f->sizelocvars;[m
[31m- printf("locals (%d) for %p:\n",n,VOID(f));[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  printf("\t%d\t%s\t%d\t%d\n",[m
[31m-  i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void PrintUpvalues(const Proto* f)[m
[31m-{[m
[31m- int i,n=f->sizeupvalues;[m
[31m- printf("upvalues (%d) for %p:\n",n,VOID(f));[m
[31m- if (f->upvalues==NULL) return;[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  printf("\t%d\t%s\n",i,getstr(f->upvalues[i]));[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-void PrintFunction(const Proto* f, int full)[m
[31m-{[m
[31m- int i,n=f->sizep;[m
[31m- PrintHeader(f);[m
[31m- PrintCode(f);[m
[31m- if (full)[m
[31m- {[m
[31m-  PrintConstants(f);[m
[31m-  PrintLocals(f);[m
[31m-  PrintUpvalues(f);[m
[31m- }[m
[31m- for (i=0; i<n; i++) PrintFunction(f->p[i],full);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/README[m
[1mdeleted file mode 100644[m
[1mindex 0c7f38b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/README[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-These are simple tests for Lua.  Some of them contain useful code.[m
[31m-They are meant to be run to make sure Lua is built correctly and also[m
[31m-to be read, to see how Lua programs look.[m
[31m-[m
[31m-Here is a one-line summary of each program:[m
[31m-[m
[31m-   bisect.lua		bisection method for solving non-linear equations[m
[31m-   cf.lua		temperature conversion table (celsius to farenheit)[m
[31m-   echo.lua             echo command line arguments[m
[31m-   env.lua              environment variables as automatic global variables[m
[31m-   factorial.lua	factorial without recursion[m
[31m-   fib.lua		fibonacci function with cache[m
[31m-   fibfor.lua		fibonacci numbers with coroutines and generators[m
[31m-   globals.lua		report global variable usage[m
[31m-   hello.lua		the first program in every language[m
[31m-   life.lua		Conway's Game of Life[m
[31m-   luac.lua	 	bare-bones luac[m
[31m-   printf.lua		an implementation of printf[m
[31m-   readonly.lua		make global variables readonly[m
[31m-   sieve.lua		the sieve of of Eratosthenes programmed with coroutines[m
[31m-   sort.lua		two implementations of a sort function[m
[31m-   table.lua		make table, grouping all data for the same item[m
[31m-   trace-calls.lua	trace calls[m
[31m-   trace-globals.lua	trace assigments to global variables[m
[31m-   xd.lua		hex dump[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/bisect.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/bisect.lua[m
[1mdeleted file mode 100644[m
[1mindex f91e69b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/bisect.lua[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m--- bisection method for solving non-linear equations[m
[31m-[m
[31m-delta=1e-6	-- tolerance[m
[31m-[m
[31m-function bisect(f,a,b,fa,fb)[m
[31m- local c=(a+b)/2[m
[31m- io.write(n," c=",c," a=",a," b=",b,"\n")[m
[31m- if c==a or c==b or math.abs(a-b)<delta then return c,b-a end[m
[31m- n=n+1[m
[31m- local fc=f(c)[m
[31m- if fa*fc<0 then return bisect(f,a,c,fa,fc) else return bisect(f,c,b,fc,fb) end[m
[31m-end[m
[31m-[m
[31m--- find root of f in the inverval [a,b]. needs f(a)*f(b)<0[m
[31m-function solve(f,a,b)[m
[31m- n=0[m
[31m- local z,e=bisect(f,a,b,f(a),f(b))[m
[31m- io.write(string.format("after %d steps, root is %.17g with error %.1e, f=%.1e\n",n,z,e,f(z)))[m
[31m-end[m
[31m-[m
[31m--- our function[m
[31m-function f(x)[m
[31m- return x*x*x-x-1[m
[31m-end[m
[31m-[m
[31m--- find zero in [1,2][m
[31m-solve(f,1,2)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/cf.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/cf.lua[m
[1mdeleted file mode 100644[m
[1mindex 8cda54b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/cf.lua[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m--- temperature conversion table (celsius to farenheit)[m
[31m-[m
[31m-for c0=-20,50-1,10 do[m
[31m-	io.write("C ")[m
[31m-	for c=c0,c0+10-1 do[m
[31m-		io.write(string.format("%3.0f ",c))[m
[31m-	end[m
[31m-	io.write("\n")[m
[31m-	[m
[31m-	io.write("F ")[m
[31m-	for c=c0,c0+10-1 do[m
[31m-		f=(9/5)*c+32[m
[31m-		io.write(string.format("%3.0f ",f))[m
[31m-	end[m
[31m-	io.write("\n\n")[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/echo.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/echo.lua[m
[1mdeleted file mode 100644[m
[1mindex 4313439..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/echo.lua[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m--- echo command line arguments[m
[31m-[m
[31m-for i=0,table.getn(arg) do[m
[31m- print(i,arg[i])[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/env.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/env.lua[m
[1mdeleted file mode 100644[m
[1mindex 9e62a57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/env.lua[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m--- read environment variables as if they were global variables[m
[31m-[m
[31m-local f=function (t,i) return os.getenv(i) end[m
[31m-setmetatable(getfenv(),{__index=f})[m
[31m-[m
[31m--- an example[m
[31m-print(a,USER,PATH)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/factorial.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/factorial.lua[m
[1mdeleted file mode 100644[m
[1mindex 7c4cf0f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/factorial.lua[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m--- function closures are powerful[m
[31m-[m
[31m--- traditional fixed-point operator from functional programming[m
[31m-Y = function (g)[m
[31m-      local a = function (f) return f(f) end[m
[31m-      return a(function (f)[m
[31m-                 return g(function (x)[m
[31m-                             local c=f(f)[m
[31m-                             return c(x)[m
[31m-                           end)[m
[31m-               end)[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- factorial without recursion[m
[31m-F = function (f)[m
[31m-      return function (n)[m
[31m-               if n == 0 then return 1[m
[31m-               else return n*f(n-1) end[m
[31m-             end[m
[31m-    end[m
[31m-[m
[31m-factorial = Y(F)   -- factorial is the fixed point of F[m
[31m-[m
[31m--- now test it[m
[31m-function test(x)[m
[31m-	io.write(x,"! = ",factorial(x),"\n")[m
[31m-end[m
[31m-[m
[31m-for n=0,16 do[m
[31m-	test(n)[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/fib.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/fib.lua[m
[1mdeleted file mode 100644[m
[1mindex 97a921b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/fib.lua[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m--- fibonacci function with cache[m
[31m-[m
[31m--- very inefficient fibonacci function[m
[31m-function fib(n)[m
[31m-	N=N+1[m
[31m-	if n<2 then[m
[31m-		return n[m
[31m-	else[m
[31m-		return fib(n-1)+fib(n-2)[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m--- a general-purpose value cache[m
[31m-function cache(f)[m
[31m-	local c={}[m
[31m-	return function (x)[m
[31m-		local y=c[x][m
[31m-		if not y then[m
[31m-			y=f(x)[m
[31m-			c[x]=y[m
[31m-		end[m
[31m-		return y[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m--- run and time it[m
[31m-function test(s,f)[m
[31m-	N=0[m
[31m-	local c=os.clock()[m
[31m-	local v=f(n)[m
[31m-	local t=os.clock()-c[m
[31m-	print(s,n,v,t,N)[m
[31m-end[m
[31m-[m
[31m-n=arg[1] or 24		-- for other values, do lua fib.lua XX[m
[31m-n=tonumber(n)[m
[31m-print("","n","value","time","evals")[m
[31m-test("plain",fib)[m
[31m-fib=cache(fib)[m
[31m-test("cached",fib)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/fibfor.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/fibfor.lua[m
[1mdeleted file mode 100644[m
[1mindex 8bbba39..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/fibfor.lua[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m--- example of for with generator functions[m
[31m-[m
[31m-function generatefib (n)[m
[31m-  return coroutine.wrap(function ()[m
[31m-    local a,b = 1, 1[m
[31m-    while a <= n do[m
[31m-      coroutine.yield(a)[m
[31m-      a, b = b, a+b[m
[31m-    end[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-for i in generatefib(1000) do print(i) end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/globals.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/globals.lua[m
[1mdeleted file mode 100644[m
[1mindex d4c20e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/globals.lua[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m--- reads luac listings and reports global variable usage[m
[31m--- lines where a global is written to are marked with "*"[m
[31m--- typical usage: luac -p -l file.lua | lua globals.lua | sort | lua table.lua[m
[31m-[m
[31m-while 1 do[m
[31m- local s=io.read()[m
[31m- if s==nil then break end[m
[31m- local ok,_,l,op,g=string.find(s,"%[%-?(%d*)%]%s*([GS])ETGLOBAL.-;%s+(.*)$")[m
[31m- if ok then[m
[31m-  if op=="S" then op="*" else op="" end[m
[31m-  io.write(g,"\t",l,op,"\n")[m
[31m- end[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/hello.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/hello.lua[m
[1mdeleted file mode 100644[m
[1mindex 0925498..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/hello.lua[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m--- the first program in every language[m
[31m-[m
[31m-io.write("Hello world, from ",_VERSION,"!\n")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/life.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/life.lua[m
[1mdeleted file mode 100644[m
[1mindex 911d9fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/life.lua[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m--- life.lua[m
[31m--- original by Dave Bollinger <DBollinger@compuserve.com> posted to lua-l[m
[31m--- modified to use ANSI terminal escape sequences[m
[31m--- modified to use for instead of while[m
[31m-[m
[31m-local write=io.write[m
[31m-[m
[31m-ALIVE=""	DEAD=""[m
[31m-ALIVE="O"	DEAD="-"[m
[31m-[m
[31m-function delay() -- NOTE: SYSTEM-DEPENDENT, adjust as necessary[m
[31m-  for i=1,10000 do end[m
[31m-  -- local i=os.clock()+1 while(os.clock()<i) do end[m
[31m-end[m
[31m-[m
[31m-function ARRAY2D(w,h)[m
[31m-  local t = {w=w,h=h}[m
[31m-  for y=1,h do[m
[31m-    t[y] = {}[m
[31m-    for x=1,w do[m
[31m-      t[y][x]=0[m
[31m-    end[m
[31m-  end[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m-_CELLS = {}[m
[31m-[m
[31m--- give birth to a "shape" within the cell array[m
[31m-function _CELLS:spawn(shape,left,top)[m
[31m-  for y=0,shape.h-1 do[m
[31m-    for x=0,shape.w-1 do[m
[31m-      self[top+y][left+x] = shape[y*shape.w+x+1][m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- run the CA and produce the next generation[m
[31m-function _CELLS:evolve(next)[m
[31m-  local ym1,y,yp1,yi=self.h-1,self.h,1,self.h[m
[31m-  while yi > 0 do[m
[31m-    local xm1,x,xp1,xi=self.w-1,self.w,1,self.w[m
[31m-    while xi > 0 do[m
[31m-      local sum = self[ym1][xm1] + self[ym1][x] + self[ym1][xp1] +[m
[31m-                  self[y][xm1] + self[y][xp1] +[m
[31m-                  self[yp1][xm1] + self[yp1][x] + self[yp1][xp1][m
[31m-      next[y][x] = ((sum==2) and self[y][x]) or ((sum==3) and 1) or 0[m
[31m-      xm1,x,xp1,xi = x,xp1,xp1+1,xi-1[m
[31m-    end[m
[31m-    ym1,y,yp1,yi = y,yp1,yp1+1,yi-1[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- output the array to screen[m
[31m-function _CELLS:draw()[m
[31m-  local out="" -- accumulate to reduce flicker[m
[31m-  for y=1,self.h do[m
[31m-   for x=1,self.w do[m
[31m-      out=out..(((self[y][x]>0) and ALIVE) or DEAD)[m
[31m-    end[m
[31m-    out=out.."\n"[m
[31m-  end[m
[31m-  write(out)[m
[31m-end[m
[31m-[m
[31m--- constructor[m
[31m-function CELLS(w,h)[m
[31m-  local c = ARRAY2D(w,h)[m
[31m-  c.spawn = _CELLS.spawn[m
[31m-  c.evolve = _CELLS.evolve[m
[31m-  c.draw = _CELLS.draw[m
[31m-  return c[m
[31m-end[m
[31m-[m
[31m---[m
[31m--- shapes suitable for use with spawn() above[m
[31m---[m
[31m-HEART = { 1,0,1,1,0,1,1,1,1; w=3,h=3 }[m
[31m-GLIDER = { 0,0,1,1,0,1,0,1,1; w=3,h=3 }[m
[31m-EXPLODE = { 0,1,0,1,1,1,1,0,1,0,1,0; w=3,h=4 }[m
[31m-FISH = { 0,1,1,1,1,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0; w=5,h=4 }[m
[31m-BUTTERFLY = { 1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,0,1,1,0,0,0,1; w=5,h=5 }[m
[31m-[m
[31m--- the main routine[m
[31m-function LIFE(w,h)[m
[31m-  -- create two arrays[m
[31m-  local thisgen = CELLS(w,h)[m
[31m-  local nextgen = CELLS(w,h)[m
[31m-[m
[31m-  -- create some life[m
[31m-  -- about 1000 generations of fun, then a glider steady-state[m
[31m-  thisgen:spawn(GLIDER,5,4)[m
[31m-  thisgen:spawn(EXPLODE,25,10)[m
[31m-  thisgen:spawn(FISH,4,12)[m
[31m-[m
[31m-  -- run until break[m
[31m-  local gen=1[m
[31m-  write("\027[2J")	-- ANSI clear screen[m
[31m-  while 1 do[m
[31m-    thisgen:evolve(nextgen)[m
[31m-    thisgen,nextgen = nextgen,thisgen[m
[31m-    write("\027[H")	-- ANSI home cursor[m
[31m-    thisgen:draw()[m
[31m-    write("Life - generation ",gen,"\n")[m
[31m-    gen=gen+1[m
[31m-    if gen>2000 then break end[m
[31m-    --delay()		-- no delay[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-LIFE(40,20)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/luac.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/luac.lua[m
[1mdeleted file mode 100644[m
[1mindex 96a0a97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/luac.lua[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m--- bare-bones luac in Lua[m
[31m--- usage: lua luac.lua file.lua[m
[31m-[m
[31m-assert(arg[1]~=nil and arg[2]==nil,"usage: lua luac.lua file.lua")[m
[31m-f=assert(io.open("luac.out","wb"))[m
[31m-assert(f:write(string.dump(assert(loadfile(arg[1])))))[m
[31m-assert(f:close())[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/printf.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/printf.lua[m
[1mdeleted file mode 100644[m
[1mindex 58c63ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/printf.lua[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m--- an implementation of printf[m
[31m-[m
[31m-function printf(...)[m
[31m- io.write(string.format(...))[m
[31m-end[m
[31m-[m
[31m-printf("Hello %s from %s on %s\n",os.getenv"USER" or "there",_VERSION,os.date())[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/readonly.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/readonly.lua[m
[1mdeleted file mode 100644[m
[1mindex 85c0b4e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/readonly.lua[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m--- make global variables readonly[m
[31m-[m
[31m-local f=function (t,i) error("cannot redefine global variable `"..i.."'",2) end[m
[31m-local g={}[m
[31m-local G=getfenv()[m
[31m-setmetatable(g,{__index=G,__newindex=f})[m
[31m-setfenv(1,g)[m
[31m-[m
[31m--- an example[m
[31m-rawset(g,"x",3)[m
[31m-x=2[m
[31m-y=1	-- cannot redefine `y'[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/sieve.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/sieve.lua[m
[1mdeleted file mode 100644[m
[1mindex 0871bb2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/sieve.lua[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m--- the sieve of of Eratosthenes programmed with coroutines[m
[31m--- typical usage: lua -e N=1000 sieve.lua | column[m
[31m-[m
[31m--- generate all the numbers from 2 to n[m
[31m-function gen (n)[m
[31m-  return coroutine.wrap(function ()[m
[31m-    for i=2,n do coroutine.yield(i) end[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m--- filter the numbers generated by `g', removing multiples of `p'[m
[31m-function filter (p, g)[m
[31m-  return coroutine.wrap(function ()[m
[31m-    while 1 do[m
[31m-      local n = g()[m
[31m-      if n == nil then return end[m
[31m-      if math.mod(n, p) ~= 0 then coroutine.yield(n) end[m
[31m-    end[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-N=N or 1000		-- from command line[m
[31m-x = gen(N)		-- generate primes up to N[m
[31m-while 1 do[m
[31m-  local n = x()		-- pick a number until done[m
[31m-  if n == nil then break end[m
[31m-  print(n)		-- must be a prime number[m
[31m-  x = filter(n, x)	-- now remove its multiples[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/sort.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/sort.lua[m
[1mdeleted file mode 100644[m
[1mindex 0bcb15f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/sort.lua[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m--- two implementations of a sort function[m
[31m--- this is an example only. Lua has now a built-in function "sort"[m
[31m-[m
[31m--- extracted from Programming Pearls, page 110[m
[31m-function qsort(x,l,u,f)[m
[31m- if l<u then[m
[31m-  local m=math.random(u-(l-1))+l-1	-- choose a random pivot in range l..u[m
[31m-  x[l],x[m]=x[m],x[l]			-- swap pivot to first position[m
[31m-  local t=x[l]				-- pivot value[m
[31m-  m=l[m
[31m-  local i=l+1[m
[31m-  while i<=u do[m
[31m-    -- invariant: x[l+1..m] < t <= x[m+1..i-1][m
[31m-    if f(x[i],t) then[m
[31m-      m=m+1[m
[31m-      x[m],x[i]=x[i],x[m]		-- swap x[i] and x[m][m
[31m-    end[m
[31m-    i=i+1[m
[31m-  end[m
[31m-  x[l],x[m]=x[m],x[l]			-- swap pivot to a valid place[m
[31m-  -- x[l+1..m-1] < x[m] <= x[m+1..u][m
[31m-  qsort(x,l,m-1,f)[m
[31m-  qsort(x,m+1,u,f)[m
[31m- end[m
[31m-end[m
[31m-[m
[31m-function selectionsort(x,n,f)[m
[31m- local i=1[m
[31m- while i<=n do[m
[31m-  local m,j=i,i+1[m
[31m-  while j<=n do[m
[31m-   if f(x[j],x[m]) then m=j end[m
[31m-   j=j+1[m
[31m-  end[m
[31m- x[i],x[m]=x[m],x[i]			-- swap x[i] and x[m][m
[31m- i=i+1[m
[31m- end[m
[31m-end[m
[31m-[m
[31m-function show(m,x)[m
[31m- io.write(m,"\n\t")[m
[31m- local i=1[m
[31m- while x[i] do[m
[31m-  io.write(x[i])[m
[31m-  i=i+1[m
[31m-  if x[i] then io.write(",") end[m
[31m- end[m
[31m- io.write("\n")[m
[31m-end[m
[31m-[m
[31m-function testsorts(x)[m
[31m- local n=1[m
[31m- while x[n] do n=n+1 end; n=n-1		-- count elements[m
[31m- show("original",x)[m
[31m- qsort(x,1,n,function (x,y) return x<y end)[m
[31m- show("after quicksort",x)[m
[31m- selectionsort(x,n,function (x,y) return x>y end)[m
[31m- show("after reverse selection sort",x)[m
[31m- qsort(x,1,n,function (x,y) return x<y end)[m
[31m- show("after quicksort again",x)[m
[31m-end[m
[31m-[m
[31m--- array to be sorted[m
[31m-x={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}[m
[31m-[m
[31m-testsorts(x)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/table.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/table.lua[m
[1mdeleted file mode 100644[m
[1mindex 235089c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/table.lua[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m--- make table, grouping all data for the same item[m
[31m--- input is 2 columns (item, data)[m
[31m-[m
[31m-local A[m
[31m-while 1 do[m
[31m- local l=io.read()[m
[31m- if l==nil then break end[m
[31m- local _,_,a,b=string.find(l,'"?([_%w]+)"?%s*(.*)$')[m
[31m- if a~=A then A=a io.write("\n",a,":") end[m
[31m- io.write(" ",b)[m
[31m-end[m
[31m-io.write("\n")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/trace-calls.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/trace-calls.lua[m
[1mdeleted file mode 100644[m
[1mindex 6d7a7b3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/trace-calls.lua[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m--- trace calls[m
[31m--- example: lua -ltrace-calls bisect.lua[m
[31m-[m
[31m-local level=0[m
[31m-[m
[31m-local function hook(event)[m
[31m- local t=debug.getinfo(3)[m
[31m- io.write(level," >>> ",string.rep(" ",level))[m
[31m- if t~=nil and t.currentline>=0 then io.write(t.short_src,":",t.currentline," ") end[m
[31m- t=debug.getinfo(2)[m
[31m- if event=="call" then[m
[31m-  level=level+1[m
[31m- else[m
[31m-  level=level-1 if level<0 then level=0 end[m
[31m- end[m
[31m- if t.what=="main" then[m
[31m-  if event=="call" then[m
[31m-   io.write("begin ",t.short_src)[m
[31m-  else[m
[31m-   io.write("end ",t.short_src)[m
[31m-  end[m
[31m- elseif t.what=="Lua" then[m
[31m--- table.foreach(t,print)[m
[31m-  io.write(event," ",t.name or "(Lua)"," <",t.linedefined,":",t.short_src,">")[m
[31m- else[m
[31m- io.write(event," ",t.name or "(C)"," [",t.what,"] ")[m
[31m- end[m
[31m- io.write("\n")[m
[31m-end[m
[31m-[m
[31m-debug.sethook(hook,"cr")[m
[31m-level=0[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/trace-globals.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/trace-globals.lua[m
[1mdeleted file mode 100644[m
[1mindex 295e670..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/trace-globals.lua[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m--- trace assigments to global variables[m
[31m-[m
[31m-do[m
[31m- -- a tostring that quotes strings. note the use of the original tostring.[m
[31m- local _tostring=tostring[m
[31m- local tostring=function(a)[m
[31m-  if type(a)=="string" then[m
[31m-   return string.format("%q",a)[m
[31m-  else[m
[31m-   return _tostring(a)[m
[31m-  end[m
[31m- end[m
[31m-[m
[31m- local log=function (name,old,new)[m
[31m-  local t=debug.getinfo(3,"Sl")[m
[31m-  local line=t.currentline[m
[31m-  io.write(t.short_src)[m
[31m-  if line>=0 then io.write(":",line) end[m
[31m-  io.write(": ",name," is now ",tostring(new)," (was ",tostring(old),")","\n")[m
[31m- end[m
[31m-[m
[31m- local g={}[m
[31m- local set=function (t,name,value)[m
[31m-  log(name,g[name],value)[m
[31m-  g[name]=value[m
[31m- end[m
[31m- setmetatable(getfenv(),{__index=g,__newindex=set})[m
[31m-end[m
[31m-[m
[31m--- an example[m
[31m-[m
[31m-a=1[m
[31m-b=2[m
[31m-a=10[m
[31m-b=20[m
[31m-b=nil[m
[31m-b=200[m
[31m-print(a,b,c)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/xd.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/xd.lua[m
[1mdeleted file mode 100644[m
[1mindex ebc3eff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-5.1.5/test/xd.lua[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m--- hex dump[m
[31m--- usage: lua xd.lua < file[m
[31m-[m
[31m-local offset=0[m
[31m-while true do[m
[31m- local s=io.read(16)[m
[31m- if s==nil then return end[m
[31m- io.write(string.format("%08X  ",offset))[m
[31m- string.gsub(s,"(.)",[m
[31m-	function (c) io.write(string.format("%02X ",string.byte(c))) end)[m
[31m- io.write(string.rep(" ",3*(16-string.len(s))))[m
[31m- io.write(" ",string.gsub(s,"%c","."),"\n") [m
[31m- offset=offset+16[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 35e3809..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-env:[m
[31m-  matrix:[m
[31m-    - LUA=lua5.1-dev LUA_DEV=liblua5.1-dev LUA_INCLUDE_DIR=/usr/include/lua5.1 LUA_CMODULE_DIR=/lib LUALIB=-llua5.1[m
[31m-    - LUA=libluajit-5.1-dev LUA_DEV=libluajit-5.1-dev LUA_INCLUDE_DIR=/usr/include/luajit-2.0 LUA_CMODULE_DIR=/lib LUALIB=-lluajit-5.1[m
[31m-[m
[31m-install:[m
[31m-    - sudo apt-get update[m
[31m-    - sudo apt-get install -qq -y $LUA luarocks cppcheck valgrind[m
[31m-    - sudo apt-get install -qq -y cpanminus libipc-run3-perl > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-    - sudo cpanm --notest Test::Base Test::LongString > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-[m
[31m-script:[m
[31m-  - cppcheck --force --error-exitcode=1 --enable=warning . > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sh runtests.sh[m
[31m-  - make[m
[31m-  - prove -Itests tests[m
[31m-  - TEST_LUA_USE_VALGRIND=1 prove -Itests tests > build.log 2>&1[m
[31m-  - cat build.log[m
[31m-  - grep -E '^==[0-9]+==' build.log; if [ "$?" == 0 ]; then exit 1; else exit 0; fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/CMakeLists.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/CMakeLists.txt[m
[1mdeleted file mode 100644[m
[1mindex c17239b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/CMakeLists.txt[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-# If Lua is installed in a non-standard location, please set the LUA_DIR[m
[31m-# environment variable to point to prefix for the install. Eg:[m
[31m-#       Unix: export LUA_DIR=/home/user/pkg[m
[31m-#       Windows: set LUA_DIR=c:\lua51[m
[31m-[m
[31m-project(lua-cjson C)[m
[31m-cmake_minimum_required(VERSION 2.6)[m
[31m-[m
[31m-option(USE_INTERNAL_FPCONV "Use internal strtod() / g_fmt() code for performance")[m
[31m-option(MULTIPLE_THREADS "Support multi-threaded apps with internal fpconv - recommended" ON)[m
[31m-[m
[31m-if(NOT CMAKE_BUILD_TYPE)[m
[31m-    set(CMAKE_BUILD_TYPE Release CACHE STRING[m
[31m-        "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."[m
[31m-        FORCE)[m
[31m-endif()[m
[31m-[m
[31m-find_package(Lua51 REQUIRED)[m
[31m-include_directories(${LUA_INCLUDE_DIR})[m
[31m-[m
[31m-if(NOT USE_INTERNAL_FPCONV)[m
[31m-    # Use libc number conversion routines (strtod(), sprintf())[m
[31m-    set(FPCONV_SOURCES fpconv.c)[m
[31m-else()[m
[31m-    # Use internal number conversion routines[m
[31m-    add_definitions(-DUSE_INTERNAL_FPCONV)[m
[31m-    set(FPCONV_SOURCES g_fmt.c dtoa.c)[m
[31m-[m
[31m-    include(TestBigEndian)[m
[31m-    TEST_BIG_ENDIAN(IEEE_BIG_ENDIAN)[m
[31m-    if(IEEE_BIG_ENDIAN)[m
[31m-        add_definitions(-DIEEE_BIG_ENDIAN)[m
[31m-    endif()[m
[31m-[m
[31m-    if(MULTIPLE_THREADS)[m
[31m-        set(CMAKE_THREAD_PREFER_PTHREAD TRUE)[m
[31m-        find_package(Threads REQUIRED)[m
[31m-        if(NOT CMAKE_USE_PTHREADS_INIT)[m
[31m-            message(FATAL_ERROR[m
[31m-                    "Pthreads not found - required by MULTIPLE_THREADS option")[m
[31m-        endif()[m
[31m-        add_definitions(-DMULTIPLE_THREADS)[m
[31m-    endif()[m
[31m-endif()[m
[31m-[m
[31m-# Handle platforms missing isinf() macro (Eg, some Solaris systems).[m
[31m-include(CheckSymbolExists)[m
[31m-CHECK_SYMBOL_EXISTS(isinf math.h HAVE_ISINF)[m
[31m-if(NOT HAVE_ISINF)[m
[31m-    add_definitions(-DUSE_INTERNAL_ISINF)[m
[31m-endif()[m
[31m-[m
[31m-set(_MODULE_LINK "${CMAKE_THREAD_LIBS_INIT}")[m
[31m-get_filename_component(_lua_lib_dir ${LUA_LIBRARY} PATH)[m
[31m-[m
[31m-if(APPLE)[m
[31m-    set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS[m
[31m-        "${CMAKE_SHARED_MODULE_CREATE_C_FLAGS} -undefined dynamic_lookup")[m
[31m-endif()[m
[31m-[m
[31m-if(WIN32)[m
[31m-    # Win32 modules need to be linked to the Lua library.[m
[31m-    set(_MODULE_LINK ${LUA_LIBRARY} ${_MODULE_LINK})[m
[31m-    set(_lua_module_dir "${_lua_lib_dir}")[m
[31m-    # Windows sprintf()/strtod() handle NaN/inf differently. Not supported.[m
[31m-    add_definitions(-DDISABLE_INVALID_NUMBERS)[m
[31m-else()[m
[31m-    set(_lua_module_dir "${_lua_lib_dir}/lua/5.1")[m
[31m-endif()[m
[31m-[m
[31m-add_library(cjson MODULE lua_cjson.c strbuf.c ${FPCONV_SOURCES})[m
[31m-set_target_properties(cjson PROPERTIES PREFIX "")[m
[31m-target_link_libraries(cjson ${_MODULE_LINK})[m
[31m-install(TARGETS cjson DESTINATION "${_lua_module_dir}")[m
[31m-[m
[31m-# vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 747a8bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining[m
[31m-a copy of this software and associated documentation files (the[m
[31m-"Software"), to deal in the Software without restriction, including[m
[31m-without limitation the rights to use, copy, modify, merge, publish,[m
[31m-distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-permit persons to whom the Software is furnished to do so, subject to[m
[31m-the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be[m
[31m-included in all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 2361028..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-##### Available defines for CJSON_CFLAGS #####[m
[31m-##[m
[31m-## USE_INTERNAL_ISINF:      Workaround for Solaris platforms missing isinf().[m
[31m-## DISABLE_INVALID_NUMBERS: Permanently disable invalid JSON numbers:[m
[31m-##                          NaN, Infinity, hex.[m
[31m-##[m
[31m-## Optional built-in number conversion uses the following defines:[m
[31m-## USE_INTERNAL_FPCONV:     Use builtin strtod/dtoa for numeric conversions.[m
[31m-## IEEE_BIG_ENDIAN:         Required on big endian architectures.[m
[31m-## MULTIPLE_THREADS:        Must be set when Lua CJSON may be used in a[m
[31m-##                          multi-threaded application. Requries _pthreads_.[m
[31m-[m
[31m-##### Build defaults #####[m
[31m-LUA_VERSION =       5.1[m
[31m-TARGET =            cjson.so[m
[31m-PREFIX =            /usr/local[m
[31m-#CFLAGS =            -g -Wall -pedantic -fno-inline[m
[31m-CFLAGS =            -O3 -Wall -pedantic -DNDEBUG[m
[31m-CJSON_CFLAGS =      -fpic[m
[31m-CJSON_LDFLAGS =     -shared[m
[31m-LUA_INCLUDE_DIR ?=   $(PREFIX)/include[m
[31m-LUA_CMODULE_DIR ?=   $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-LUA_MODULE_DIR ?=    $(PREFIX)/share/lua/$(LUA_VERSION)[m
[31m-LUA_BIN_DIR ?=       $(PREFIX)/bin[m
[31m-[m
[31m-##### Platform overrides #####[m
[31m-##[m
[31m-## Tweak one of the platform sections below to suit your situation.[m
[31m-##[m
[31m-## See http://lua-users.org/wiki/BuildingModules for further platform[m
[31m-## specific details.[m
[31m-[m
[31m-## Linux[m
[31m-[m
[31m-## FreeBSD[m
[31m-#LUA_INCLUDE_DIR =   $(PREFIX)/include/lua51[m
[31m-[m
[31m-## MacOSX (Macports)[m
[31m-#PREFIX =            /opt/local[m
[31m-#CJSON_LDFLAGS =     -bundle -undefined dynamic_lookup[m
[31m-[m
[31m-## Solaris[m
[31m-#PREFIX =            /home/user/opt[m
[31m-#CC =                gcc[m
[31m-#CJSON_CFLAGS =      -fpic -DUSE_INTERNAL_ISINF[m
[31m-[m
[31m-## Windows (MinGW)[m
[31m-#TARGET =            cjson.dll[m
[31m-#PREFIX =            /home/user/opt[m
[31m-#CJSON_CFLAGS =      -DDISABLE_INVALID_NUMBERS[m
[31m-#CJSON_LDFLAGS =     -shared -L$(PREFIX)/lib -llua51[m
[31m-#LUA_BIN_SUFFIX =    .lua[m
[31m-[m
[31m-##### Number conversion configuration #####[m
[31m-[m
[31m-## Use Libc support for number conversion (default)[m
[31m-FPCONV_OBJS =       fpconv.o[m
[31m-[m
[31m-## Use built in number conversion[m
[31m-#FPCONV_OBJS =       g_fmt.o dtoa.o[m
[31m-#CJSON_CFLAGS +=     -DUSE_INTERNAL_FPCONV[m
[31m-[m
[31m-## Compile built in number conversion for big endian architectures[m
[31m-#CJSON_CFLAGS +=     -DIEEE_BIG_ENDIAN[m
[31m-[m
[31m-## Compile built in number conversion to support multi-threaded[m
[31m-## applications (recommended)[m
[31m-#CJSON_CFLAGS +=     -pthread -DMULTIPLE_THREADS[m
[31m-#CJSON_LDFLAGS +=    -pthread[m
[31m-[m
[31m-##### End customisable sections #####[m
[31m-[m
[31m-TEST_FILES =        README bench.lua genutf8.pl test.lua octets-escaped.dat \[m
[31m-                    example1.json example2.json example3.json example4.json \[m
[31m-                    example5.json numbers.json rfc-example1.json \[m
[31m-                    rfc-example2.json types.json[m
[31m-DATAPERM =          644[m
[31m-EXECPERM =          755[m
[31m-[m
[31m-ASCIIDOC =          asciidoc[m
[31m-[m
[31m-BUILD_CFLAGS =      -I$(LUA_INCLUDE_DIR) $(CJSON_CFLAGS)[m
[31m-OBJS =              lua_cjson.o strbuf.o $(FPCONV_OBJS)[m
[31m-[m
[31m-.PHONY: all clean install install-extra doc[m
[31m-[m
[31m-.SUFFIXES: .html .txt[m
[31m-[m
[31m-.c.o:[m
[31m-	$(CC) -c $(CFLAGS) $(CPPFLAGS) $(BUILD_CFLAGS) -o $@ $<[m
[31m-[m
[31m-.txt.html:[m
[31m-	$(ASCIIDOC) -n -a toc $<[m
[31m-[m
[31m-all: $(TARGET)[m
[31m-[m
[31m-doc: manual.html performance.html[m
[31m-[m
[31m-$(TARGET): $(OBJS)[m
[31m-	$(CC) $(LDFLAGS) $(CJSON_LDFLAGS) -o $@ $(OBJS)[m
[31m-[m
[31m-install: $(TARGET)[m
[31m-	mkdir -p $(DESTDIR)$(LUA_CMODULE_DIR)[m
[31m-	rm -f $(DESTDIR)$(LUA_CMODULE_DIR)/$(TARGET)[m
[31m-	cp $(TARGET) $(DESTDIR)$(LUA_CMODULE_DIR)[m
[31m-	chmod $(EXECPERM) $(DESTDIR)$(LUA_CMODULE_DIR)/$(TARGET)[m
[31m-[m
[31m-install-extra:[m
[31m-	mkdir -p $(DESTDIR)$(LUA_MODULE_DIR)/cjson/tests \[m
[31m-		$(DESTDIR)$(LUA_BIN_DIR)[m
[31m-	cp lua/cjson/util.lua $(DESTDIR)$(LUA_MODULE_DIR)/cjson[m
[31m-	chmod $(DATAPERM) $(DESTDIR)$(LUA_MODULE_DIR)/cjson/util.lua[m
[31m-	cp lua/lua2json.lua $(DESTDIR)$(LUA_BIN_DIR)/lua2json$(LUA_BIN_SUFFIX)[m
[31m-	chmod $(EXECPERM) $(DESTDIR)$(LUA_BIN_DIR)/lua2json$(LUA_BIN_SUFFIX)[m
[31m-	cp lua/json2lua.lua $(DESTDIR)$(LUA_BIN_DIR)/json2lua$(LUA_BIN_SUFFIX)[m
[31m-	chmod $(EXECPERM) $(DESTDIR)$(LUA_BIN_DIR)/json2lua$(LUA_BIN_SUFFIX)[m
[31m-	cd tests; cp $(TEST_FILES) $(DESTDIR)$(LUA_MODULE_DIR)/cjson/tests[m
[31m-	cd tests; chmod $(DATAPERM) $(TEST_FILES); chmod $(EXECPERM) *.lua *.pl[m
[31m-[m
[31m-clean:[m
[31m-	rm -f *.o $(TARGET)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/NEWS b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/NEWS[m
[1mdeleted file mode 100644[m
[1mindex 8927d6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/NEWS[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-Version 2.1.0 (Mar 1 2012)[m
[31m-* Added cjson.safe module interface which returns nil after an error[m
[31m-* Improved Makefile compatibility with Solaris make[m
[31m-[m
[31m-Version 2.0.0 (Jan 22 2012)[m
[31m-* Improved platform compatibility for strtod/sprintf locale workaround[m
[31m-* Added option to build with David Gay's dtoa.c for improved performance[m
[31m-* Added support for Lua 5.2[m
[31m-* Added option to encode infinity/NaN as JSON null[m
[31m-* Fixed encode bug with a raised default limit and deeply nested tables[m
[31m-* Updated Makefile for compatibility with non-GNU make implementations[m
[31m-* Added CMake build support[m
[31m-* Added HTML manual[m
[31m-* Increased default nesting limit to 1000[m
[31m-* Added support for re-entrant use of encode and decode[m
[31m-* Added support for installing lua2json and json2lua utilities[m
[31m-* Added encode_invalid_numbers() and decode_invalid_numbers()[m
[31m-* Added decode_max_depth()[m
[31m-* Removed registration of global cjson module table[m
[31m-* Removed refuse_invalid_numbers()[m
[31m-[m
[31m-Version 1.0.4 (Nov 30 2011)[m
[31m-* Fixed numeric conversion under locales with a comma decimal separator[m
[31m-[m
[31m-Version 1.0.3 (Sep 15 2011)[m
[31m-* Fixed detection of objects with numeric string keys[m
[31m-* Provided work around for missing isinf() on Solaris[m
[31m-[m
[31m-Version 1.0.2 (May 30 2011)[m
[31m-* Portability improvements for Windows[m
[31m-  - No longer links with -lm[m
[31m-  - Use "socket" instead of "posix" for sub-second timing[m
[31m-* Removed UTF-8 test dependency on Perl Text::Iconv[m
[31m-* Added simple CLI commands for testing Lua <-> JSON conversions[m
[31m-* Added cjson.encode_number_precision()[m
[31m-[m
[31m-Version 1.0.1 (May 10 2011)[m
[31m-* Added build support for OSX[m
[31m-* Removed unnecessary whitespace from JSON output[m
[31m-* Added cjson.encode_keep_buffer()[m
[31m-* Fixed memory leak on Lua stack overflow exception[m
[31m-[m
[31m-Version 1.0 (May 9 2011)[m
[31m-* Initial release[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/THANKS b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/THANKS[m
[1mdeleted file mode 100644[m
[1mindex 4aade13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/THANKS[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-The following people have helped with bug reports, testing and/or[m
[31m-suggestions:[m
[31m-[m
[31m-- Louis-Philippe Perron (@loopole)[m
[31m-- Ondřej Jirman[m
[31m-- Steve Donovan <steve.j.donovan@gmail.com>[m
[31m-- Zhang "agentzh" Yichun <agentzh@gmail.com>[m
[31m-[m
[31m-Thanks![m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/cjson.so b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/cjson.so[m
[1mdeleted file mode 100755[m
[1mindex b86b5eb..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/cjson.so and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/dtoa.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/dtoa.c[m
[1mdeleted file mode 100644[m
[1mindex 56398ba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/dtoa.c[m
[1m+++ /dev/null[m
[36m@@ -1,4358 +0,0 @@[m
[31m-/****************************************************************[m
[31m- *[m
[31m- * The author of this software is David M. Gay.[m
[31m- *[m
[31m- * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.[m
[31m- *[m
[31m- * Permission to use, copy, modify, and distribute this software for any[m
[31m- * purpose without fee is hereby granted, provided that this entire notice[m
[31m- * is included in all copies of any software which is or includes a copy[m
[31m- * or modification of this software and in all copies of the supporting[m
[31m- * documentation for such software.[m
[31m- *[m
[31m- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED[m
[31m- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY[m
[31m- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY[m
[31m- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.[m
[31m- *[m
[31m- ***************************************************************/[m
[31m-[m
[31m-/* Please send bug reports to David M. Gay (dmg at acm dot org,[m
[31m- * with " at " changed at "@" and " dot " changed to ".").	*/[m
[31m-[m
[31m-/* On a machine with IEEE extended-precision registers, it is[m
[31m- * necessary to specify double-precision (53-bit) rounding precision[m
[31m- * before invoking strtod or dtoa.  If the machine uses (the equivalent[m
[31m- * of) Intel 80x87 arithmetic, the call[m
[31m- *	_control87(PC_53, MCW_PC);[m
[31m- * does this with many compilers.  Whether this or another call is[m
[31m- * appropriate depends on the compiler; for this to work, it may be[m
[31m- * necessary to #include "float.h" or another system-dependent header[m
[31m- * file.[m
[31m- */[m
[31m-[m
[31m-/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.[m
[31m- *[m
[31m- * This strtod returns a nearest machine number to the input decimal[m
[31m- * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are[m
[31m- * broken by the IEEE round-even rule.  Otherwise ties are broken by[m
[31m- * biased rounding (add half and chop).[m
[31m- *[m
[31m- * Inspired loosely by William D. Clinger's paper "How to Read Floating[m
[31m- * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].[m
[31m- *[m
[31m- * Modifications:[m
[31m- *[m
[31m- *	1. We only require IEEE, IBM, or VAX double-precision[m
[31m- *		arithmetic (not IEEE double-extended).[m
[31m- *	2. We get by with floating-point arithmetic in a case that[m
[31m- *		Clinger missed -- when we're computing d * 10^n[m
[31m- *		for a small integer d and the integer n is not too[m
[31m- *		much larger than 22 (the maximum integer k for which[m
[31m- *		we can represent 10^k exactly), we may be able to[m
[31m- *		compute (d*10^k) * 10^(e-k) with just one roundoff.[m
[31m- *	3. Rather than a bit-at-a-time adjustment of the binary[m
[31m- *		result in the hard case, we use floating-point[m
[31m- *		arithmetic to determine the adjustment to within[m
[31m- *		one bit; only in really hard cases do we need to[m
[31m- *		compute a second residual.[m
[31m- *	4. Because of 3., we don't need a large table of powers of 10[m
[31m- *		for ten-to-e (just some small tables, e.g. of 10^k[m
[31m- *		for 0 <= k <= 22).[m
[31m- */[m
[31m-[m
[31m-/*[m
[31m- * #define IEEE_8087 for IEEE-arithmetic machines where the least[m
[31m- *	significant byte has the lowest address.[m
[31m- * #define IEEE_MC68k for IEEE-arithmetic machines where the most[m
[31m- *	significant byte has the lowest address.[m
[31m- * #define Long int on machines with 32-bit ints and 64-bit longs.[m
[31m- * #define IBM for IBM mainframe-style floating-point arithmetic.[m
[31m- * #define VAX for VAX-style floating-point arithmetic (D_floating).[m
[31m- * #define No_leftright to omit left-right logic in fast floating-point[m
[31m- *	computation of dtoa.  This will cause dtoa modes 4 and 5 to be[m
[31m- *	treated the same as modes 2 and 3 for some inputs.[m
[31m- * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3[m
[31m- *	and strtod and dtoa should round accordingly.  Unless Trust_FLT_ROUNDS[m
[31m- *	is also #defined, fegetround() will be queried for the rounding mode.[m
[31m- *	Note that both FLT_ROUNDS and fegetround() are specified by the C99[m
[31m- *	standard (and are specified to be consistent, with fesetround()[m
[31m- *	affecting the value of FLT_ROUNDS), but that some (Linux) systems[m
[31m- *	do not work correctly in this regard, so using fegetround() is more[m
[31m- *	portable than using FLT_ROUNDS directly.[m
[31m- * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3[m
[31m- *	and Honor_FLT_ROUNDS is not #defined.[m
[31m- * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines[m
[31m- *	that use extended-precision instructions to compute rounded[m
[31m- *	products and quotients) with IBM.[m
[31m- * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic[m
[31m- *	that rounds toward +Infinity.[m
[31m- * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased[m
[31m- *	rounding when the underlying floating-point arithmetic uses[m
[31m- *	unbiased rounding.  This prevent using ordinary floating-point[m
[31m- *	arithmetic when the result could be computed with one rounding error.[m
[31m- * #define Inaccurate_Divide for IEEE-format with correctly rounded[m
[31m- *	products but inaccurate quotients, e.g., for Intel i860.[m
[31m- * #define NO_LONG_LONG on machines that do not have a "long long"[m
[31m- *	integer type (of >= 64 bits).  On such machines, you can[m
[31m- *	#define Just_16 to store 16 bits per 32-bit Long when doing[m
[31m- *	high-precision integer arithmetic.  Whether this speeds things[m
[31m- *	up or slows things down depends on the machine and the number[m
[31m- *	being converted.  If long long is available and the name is[m
[31m- *	something other than "long long", #define Llong to be the name,[m
[31m- *	and if "unsigned Llong" does not work as an unsigned version of[m
[31m- *	Llong, #define #ULLong to be the corresponding unsigned type.[m
[31m- * #define KR_headers for old-style C function headers.[m
[31m- * #define Bad_float_h if your system lacks a float.h or if it does not[m
[31m- *	define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,[m
[31m- *	FLT_RADIX, FLT_ROUNDS, and DBL_MAX.[m
[31m- * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)[m
[31m- *	if memory is available and otherwise does something you deem[m
[31m- *	appropriate.  If MALLOC is undefined, malloc will be invoked[m
[31m- *	directly -- and assumed always to succeed.  Similarly, if you[m
[31m- *	want something other than the system's free() to be called to[m
[31m- *	recycle memory acquired from MALLOC, #define FREE to be the[m
[31m- *	name of the alternate routine.  (FREE or free is only called in[m
[31m- *	pathological cases, e.g., in a dtoa call after a dtoa return in[m
[31m- *	mode 3 with thousands of digits requested.)[m
[31m- * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making[m
[31m- *	memory allocations from a private pool of memory when possible.[m
[31m- *	When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,[m
[31m- *	unless #defined to be a different length.  This default length[m
[31m- *	suffices to get rid of MALLOC calls except for unusual cases,[m
[31m- *	such as decimal-to-binary conversion of a very long string of[m
[31m- *	digits.  The longest string dtoa can return is about 751 bytes[m
[31m- *	long.  For conversions by strtod of strings of 800 digits and[m
[31m- *	all dtoa conversions in single-threaded executions with 8-byte[m
[31m- *	pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte[m
[31m- *	pointers, PRIVATE_MEM >= 7112 appears adequate.[m
[31m- * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK[m
[31m- *	#defined automatically on IEEE systems.  On such systems,[m
[31m- *	when INFNAN_CHECK is #defined, strtod checks[m
[31m- *	for Infinity and NaN (case insensitively).  On some systems[m
[31m- *	(e.g., some HP systems), it may be necessary to #define NAN_WORD0[m
[31m- *	appropriately -- to the most significant word of a quiet NaN.[m
[31m- *	(On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)[m
[31m- *	When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,[m
[31m- *	strtod also accepts (case insensitively) strings of the form[m
[31m- *	NaN(x), where x is a string of hexadecimal digits and spaces;[m
[31m- *	if there is only one string of hexadecimal digits, it is taken[m
[31m- *	for the 52 fraction bits of the resulting NaN; if there are two[m
[31m- *	or more strings of hex digits, the first is for the high 20 bits,[m
[31m- *	the second and subsequent for the low 32 bits, with intervening[m
[31m- *	white space ignored; but if this results in none of the 52[m
[31m- *	fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0[m
[31m- *	and NAN_WORD1 are used instead.[m
[31m- * #define MULTIPLE_THREADS if the system offers preemptively scheduled[m
[31m- *	multiple threads.  In this case, you must provide (or suitably[m
[31m- *	#define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed[m
[31m- *	by FREE_DTOA_LOCK(n) for n = 0 or 1.  (The second lock, accessed[m
[31m- *	in pow5mult, ensures lazy evaluation of only one copy of high[m
[31m- *	powers of 5; omitting this lock would introduce a small[m
[31m- *	probability of wasting memory, but would otherwise be harmless.)[m
[31m- *	You must also invoke freedtoa(s) to free the value s returned by[m
[31m- *	dtoa.  You may do so whether or not MULTIPLE_THREADS is #defined.[m
[31m- * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that[m
[31m- *	avoids underflows on inputs whose result does not underflow.[m
[31m- *	If you #define NO_IEEE_Scale on a machine that uses IEEE-format[m
[31m- *	floating-point numbers and flushes underflows to zero rather[m
[31m- *	than implementing gradual underflow, then you must also #define[m
[31m- *	Sudden_Underflow.[m
[31m- * #define USE_LOCALE to use the current locale's decimal_point value.[m
[31m- * #define SET_INEXACT if IEEE arithmetic is being used and extra[m
[31m- *	computation should be done to set the inexact flag when the[m
[31m- *	result is inexact and avoid setting inexact when the result[m
[31m- *	is exact.  In this case, dtoa.c must be compiled in[m
[31m- *	an environment, perhaps provided by #include "dtoa.c" in a[m
[31m- *	suitable wrapper, that defines two functions,[m
[31m- *		int get_inexact(void);[m
[31m- *		void clear_inexact(void);[m
[31m- *	such that get_inexact() returns a nonzero value if the[m
[31m- *	inexact bit is already set, and clear_inexact() sets the[m
[31m- *	inexact bit to 0.  When SET_INEXACT is #defined, strtod[m
[31m- *	also does extra computations to set the underflow and overflow[m
[31m- *	flags when appropriate (i.e., when the result is tiny and[m
[31m- *	inexact or when it is a numeric value rounded to +-infinity).[m
[31m- * #define NO_ERRNO if strtod should not assign errno = ERANGE when[m
[31m- *	the result overflows to +-Infinity or underflows to 0.[m
[31m- * #define NO_HEX_FP to omit recognition of hexadecimal floating-point[m
[31m- *	values by strtod.[m
[31m- * #define NO_STRTOD_BIGCOMP (on IEEE-arithmetic systems only for now)[m
[31m- *	to disable logic for "fast" testing of very long input strings[m
[31m- *	to strtod.  This testing proceeds by initially truncating the[m
[31m- *	input string, then if necessary comparing the whole string with[m
[31m- *	a decimal expansion to decide close cases. This logic is only[m
[31m- *	used for input more than STRTOD_DIGLIM digits long (default 40).[m
[31m- */[m
[31m-[m
[31m-#include "dtoa_config.h"[m
[31m-[m
[31m-#ifndef Long[m
[31m-#define Long long[m
[31m-#endif[m
[31m-#ifndef ULong[m
[31m-typedef unsigned Long ULong;[m
[31m-#endif[m
[31m-[m
[31m-#ifdef DEBUG[m
[31m-#include "stdio.h"[m
[31m-#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}[m
[31m-#endif[m
[31m-[m
[31m-#include "stdlib.h"[m
[31m-#include "string.h"[m
[31m-[m
[31m-#ifdef USE_LOCALE[m
[31m-#include "locale.h"[m
[31m-#endif[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-#ifndef Trust_FLT_ROUNDS[m
[31m-#include <fenv.h>[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifdef MALLOC[m
[31m-#ifdef KR_headers[m
[31m-extern char *MALLOC();[m
[31m-#else[m
[31m-extern void *MALLOC(size_t);[m
[31m-#endif[m
[31m-#else[m
[31m-#define MALLOC malloc[m
[31m-#endif[m
[31m-[m
[31m-#ifndef Omit_Private_Memory[m
[31m-#ifndef PRIVATE_MEM[m
[31m-#define PRIVATE_MEM 2304[m
[31m-#endif[m
[31m-#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))[m
[31m-static double private_mem[PRIVATE_mem], *pmem_next = private_mem;[m
[31m-#endif[m
[31m-[m
[31m-#undef IEEE_Arith[m
[31m-#undef Avoid_Underflow[m
[31m-#ifdef IEEE_MC68k[m
[31m-#define IEEE_Arith[m
[31m-#endif[m
[31m-#ifdef IEEE_8087[m
[31m-#define IEEE_Arith[m
[31m-#endif[m
[31m-[m
[31m-#ifdef IEEE_Arith[m
[31m-#ifndef NO_INFNAN_CHECK[m
[31m-#undef INFNAN_CHECK[m
[31m-#define INFNAN_CHECK[m
[31m-#endif[m
[31m-#else[m
[31m-#undef INFNAN_CHECK[m
[31m-#define NO_STRTOD_BIGCOMP[m
[31m-#endif[m
[31m-[m
[31m-#include "errno.h"[m
[31m-[m
[31m-#ifdef Bad_float_h[m
[31m-[m
[31m-#ifdef IEEE_Arith[m
[31m-#define DBL_DIG 15[m
[31m-#define DBL_MAX_10_EXP 308[m
[31m-#define DBL_MAX_EXP 1024[m
[31m-#define FLT_RADIX 2[m
[31m-#endif /*IEEE_Arith*/[m
[31m-[m
[31m-#ifdef IBM[m
[31m-#define DBL_DIG 16[m
[31m-#define DBL_MAX_10_EXP 75[m
[31m-#define DBL_MAX_EXP 63[m
[31m-#define FLT_RADIX 16[m
[31m-#define DBL_MAX 7.2370055773322621e+75[m
[31m-#endif[m
[31m-[m
[31m-#ifdef VAX[m
[31m-#define DBL_DIG 16[m
[31m-#define DBL_MAX_10_EXP 38[m
[31m-#define DBL_MAX_EXP 127[m
[31m-#define FLT_RADIX 2[m
[31m-#define DBL_MAX 1.7014118346046923e+38[m
[31m-#endif[m
[31m-[m
[31m-#ifndef LONG_MAX[m
[31m-#define LONG_MAX 2147483647[m
[31m-#endif[m
[31m-[m
[31m-#else /* ifndef Bad_float_h */[m
[31m-#include "float.h"[m
[31m-#endif /* Bad_float_h */[m
[31m-[m
[31m-#ifndef __MATH_H__[m
[31m-#include "math.h"[m
[31m-#endif[m
[31m-[m
[31m-#ifdef __cplusplus[m
[31m-extern "C" {[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CONST[m
[31m-#ifdef KR_headers[m
[31m-#define CONST /* blank */[m
[31m-#else[m
[31m-#define CONST const[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1[m
[31m-Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.[m
[31m-#endif[m
[31m-[m
[31m-typedef union { double d; ULong L[2]; } U;[m
[31m-[m
[31m-#ifdef IEEE_8087[m
[31m-#define word0(x) (x)->L[1][m
[31m-#define word1(x) (x)->L[0][m
[31m-#else[m
[31m-#define word0(x) (x)->L[0][m
[31m-#define word1(x) (x)->L[1][m
[31m-#endif[m
[31m-#define dval(x) (x)->d[m
[31m-[m
[31m-#ifndef STRTOD_DIGLIM[m
[31m-#define STRTOD_DIGLIM 40[m
[31m-#endif[m
[31m-[m
[31m-#ifdef DIGLIM_DEBUG[m
[31m-extern int strtod_diglim;[m
[31m-#else[m
[31m-#define strtod_diglim STRTOD_DIGLIM[m
[31m-#endif[m
[31m-[m
[31m-/* The following definition of Storeinc is appropriate for MIPS processors.[m
[31m- * An alternative that might be better on some machines is[m
[31m- * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)[m
[31m- */[m
[31m-#if defined(IEEE_8087) + defined(VAX)[m
[31m-#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \[m
[31m-((unsigned short *)a)[0] = (unsigned short)c, a++)[m
[31m-#else[m
[31m-#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \[m
[31m-((unsigned short *)a)[1] = (unsigned short)c, a++)[m
[31m-#endif[m
[31m-[m
[31m-/* #define P DBL_MANT_DIG */[m
[31m-/* Ten_pmax = floor(P*log(2)/log(5)) */[m
[31m-/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */[m
[31m-/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */[m
[31m-/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */[m
[31m-[m
[31m-#ifdef IEEE_Arith[m
[31m-#define Exp_shift  20[m
[31m-#define Exp_shift1 20[m
[31m-#define Exp_msk1    0x100000[m
[31m-#define Exp_msk11   0x100000[m
[31m-#define Exp_mask  0x7ff00000[m
[31m-#define P 53[m
[31m-#define Nbits 53[m
[31m-#define Bias 1023[m
[31m-#define Emax 1023[m
[31m-#define Emin (-1022)[m
[31m-#define Exp_1  0x3ff00000[m
[31m-#define Exp_11 0x3ff00000[m
[31m-#define Ebits 11[m
[31m-#define Frac_mask  0xfffff[m
[31m-#define Frac_mask1 0xfffff[m
[31m-#define Ten_pmax 22[m
[31m-#define Bletch 0x10[m
[31m-#define Bndry_mask  0xfffff[m
[31m-#define Bndry_mask1 0xfffff[m
[31m-#define LSB 1[m
[31m-#define Sign_bit 0x80000000[m
[31m-#define Log2P 1[m
[31m-#define Tiny0 0[m
[31m-#define Tiny1 1[m
[31m-#define Quick_max 14[m
[31m-#define Int_max 14[m
[31m-#ifndef NO_IEEE_Scale[m
[31m-#define Avoid_Underflow[m
[31m-#ifdef Flush_Denorm	/* debugging option */[m
[31m-#undef Sudden_Underflow[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifndef Flt_Rounds[m
[31m-#ifdef FLT_ROUNDS[m
[31m-#define Flt_Rounds FLT_ROUNDS[m
[31m-#else[m
[31m-#define Flt_Rounds 1[m
[31m-#endif[m
[31m-#endif /*Flt_Rounds*/[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-#undef Check_FLT_ROUNDS[m
[31m-#define Check_FLT_ROUNDS[m
[31m-#else[m
[31m-#define Rounding Flt_Rounds[m
[31m-#endif[m
[31m-[m
[31m-#else /* ifndef IEEE_Arith */[m
[31m-#undef Check_FLT_ROUNDS[m
[31m-#undef Honor_FLT_ROUNDS[m
[31m-#undef SET_INEXACT[m
[31m-#undef  Sudden_Underflow[m
[31m-#define Sudden_Underflow[m
[31m-#ifdef IBM[m
[31m-#undef Flt_Rounds[m
[31m-#define Flt_Rounds 0[m
[31m-#define Exp_shift  24[m
[31m-#define Exp_shift1 24[m
[31m-#define Exp_msk1   0x1000000[m
[31m-#define Exp_msk11  0x1000000[m
[31m-#define Exp_mask  0x7f000000[m
[31m-#define P 14[m
[31m-#define Nbits 56[m
[31m-#define Bias 65[m
[31m-#define Emax 248[m
[31m-#define Emin (-260)[m
[31m-#define Exp_1  0x41000000[m
[31m-#define Exp_11 0x41000000[m
[31m-#define Ebits 8	/* exponent has 7 bits, but 8 is the right value in b2d */[m
[31m-#define Frac_mask  0xffffff[m
[31m-#define Frac_mask1 0xffffff[m
[31m-#define Bletch 4[m
[31m-#define Ten_pmax 22[m
[31m-#define Bndry_mask  0xefffff[m
[31m-#define Bndry_mask1 0xffffff[m
[31m-#define LSB 1[m
[31m-#define Sign_bit 0x80000000[m
[31m-#define Log2P 4[m
[31m-#define Tiny0 0x100000[m
[31m-#define Tiny1 0[m
[31m-#define Quick_max 14[m
[31m-#define Int_max 15[m
[31m-#else /* VAX */[m
[31m-#undef Flt_Rounds[m
[31m-#define Flt_Rounds 1[m
[31m-#define Exp_shift  23[m
[31m-#define Exp_shift1 7[m
[31m-#define Exp_msk1    0x80[m
[31m-#define Exp_msk11   0x800000[m
[31m-#define Exp_mask  0x7f80[m
[31m-#define P 56[m
[31m-#define Nbits 56[m
[31m-#define Bias 129[m
[31m-#define Emax 126[m
[31m-#define Emin (-129)[m
[31m-#define Exp_1  0x40800000[m
[31m-#define Exp_11 0x4080[m
[31m-#define Ebits 8[m
[31m-#define Frac_mask  0x7fffff[m
[31m-#define Frac_mask1 0xffff007f[m
[31m-#define Ten_pmax 24[m
[31m-#define Bletch 2[m
[31m-#define Bndry_mask  0xffff007f[m
[31m-#define Bndry_mask1 0xffff007f[m
[31m-#define LSB 0x10000[m
[31m-#define Sign_bit 0x8000[m
[31m-#define Log2P 1[m
[31m-#define Tiny0 0x80[m
[31m-#define Tiny1 0[m
[31m-#define Quick_max 15[m
[31m-#define Int_max 15[m
[31m-#endif /* IBM, VAX */[m
[31m-#endif /* IEEE_Arith */[m
[31m-[m
[31m-#ifndef IEEE_Arith[m
[31m-#define ROUND_BIASED[m
[31m-#else[m
[31m-#ifdef ROUND_BIASED_without_Round_Up[m
[31m-#undef  ROUND_BIASED[m
[31m-#define ROUND_BIASED[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifdef RND_PRODQUOT[m
[31m-#define rounded_product(a,b) a = rnd_prod(a, b)[m
[31m-#define rounded_quotient(a,b) a = rnd_quot(a, b)[m
[31m-#ifdef KR_headers[m
[31m-extern double rnd_prod(), rnd_quot();[m
[31m-#else[m
[31m-extern double rnd_prod(double, double), rnd_quot(double, double);[m
[31m-#endif[m
[31m-#else[m
[31m-#define rounded_product(a,b) a *= b[m
[31m-#define rounded_quotient(a,b) a /= b[m
[31m-#endif[m
[31m-[m
[31m-#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))[m
[31m-#define Big1 0xffffffff[m
[31m-[m
[31m-#ifndef Pack_32[m
[31m-#define Pack_32[m
[31m-#endif[m
[31m-[m
[31m-typedef struct BCinfo BCinfo;[m
[31m- struct[m
[31m-BCinfo { int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflchk; };[m
[31m-[m
[31m-#ifdef KR_headers[m
[31m-#define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff)[m
[31m-#else[m
[31m-#define FFFFFFFF 0xffffffffUL[m
[31m-#endif[m
[31m-[m
[31m-#ifdef NO_LONG_LONG[m
[31m-#undef ULLong[m
[31m-#ifdef Just_16[m
[31m-#undef Pack_32[m
[31m-/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.[m
[31m- * This makes some inner loops simpler and sometimes saves work[m
[31m- * during multiplications, but it often seems to make things slightly[m
[31m- * slower.  Hence the default is now to store 32 bits per Long.[m
[31m- */[m
[31m-#endif[m
[31m-#else	/* long long available */[m
[31m-#ifndef Llong[m
[31m-#define Llong long long[m
[31m-#endif[m
[31m-#ifndef ULLong[m
[31m-#define ULLong unsigned Llong[m
[31m-#endif[m
[31m-#endif /* NO_LONG_LONG */[m
[31m-[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m-#define ACQUIRE_DTOA_LOCK(n)	/*nothing*/[m
[31m-#define FREE_DTOA_LOCK(n)	/*nothing*/[m
[31m-#endif[m
[31m-[m
[31m-#define Kmax 7[m
[31m-[m
[31m-#ifdef __cplusplus[m
[31m-extern "C" double fpconv_strtod(const char *s00, char **se);[m
[31m-extern "C" char *dtoa(double d, int mode, int ndigits,[m
[31m-			int *decpt, int *sign, char **rve);[m
[31m-#endif[m
[31m-[m
[31m- struct[m
[31m-Bigint {[m
[31m-	struct Bigint *next;[m
[31m-	int k, maxwds, sign, wds;[m
[31m-	ULong x[1];[m
[31m-	};[m
[31m-[m
[31m- typedef struct Bigint Bigint;[m
[31m-[m
[31m- static Bigint *freelist[Kmax+1];[m
[31m-[m
[31m- static Bigint *[m
[31m-Balloc[m
[31m-#ifdef KR_headers[m
[31m-	(k) int k;[m
[31m-#else[m
[31m-	(int k)[m
[31m-#endif[m
[31m-{[m
[31m-	int x;[m
[31m-	Bigint *rv;[m
[31m-#ifndef Omit_Private_Memory[m
[31m-	unsigned int len;[m
[31m-#endif[m
[31m-[m
[31m-	ACQUIRE_DTOA_LOCK(0);[m
[31m-	/* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */[m
[31m-	/* but this case seems very unlikely. */[m
[31m-	if (k <= Kmax && (rv = freelist[k]))[m
[31m-		freelist[k] = rv->next;[m
[31m-	else {[m
[31m-		x = 1 << k;[m
[31m-#ifdef Omit_Private_Memory[m
[31m-		rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));[m
[31m-#else[m
[31m-		len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)[m
[31m-			/sizeof(double);[m
[31m-		if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {[m
[31m-			rv = (Bigint*)pmem_next;[m
[31m-			pmem_next += len;[m
[31m-			}[m
[31m-		else[m
[31m-			rv = (Bigint*)MALLOC(len*sizeof(double));[m
[31m-#endif[m
[31m-		rv->k = k;[m
[31m-		rv->maxwds = x;[m
[31m-		}[m
[31m-	FREE_DTOA_LOCK(0);[m
[31m-	rv->sign = rv->wds = 0;[m
[31m-	return rv;[m
[31m-	}[m
[31m-[m
[31m- static void[m
[31m-Bfree[m
[31m-#ifdef KR_headers[m
[31m-	(v) Bigint *v;[m
[31m-#else[m
[31m-	(Bigint *v)[m
[31m-#endif[m
[31m-{[m
[31m-	if (v) {[m
[31m-		if (v->k > Kmax)[m
[31m-#ifdef FREE[m
[31m-			FREE((void*)v);[m
[31m-#else[m
[31m-			free((void*)v);[m
[31m-#endif[m
[31m-		else {[m
[31m-			ACQUIRE_DTOA_LOCK(0);[m
[31m-			v->next = freelist[v->k];[m
[31m-			freelist[v->k] = v;[m
[31m-			FREE_DTOA_LOCK(0);[m
[31m-			}[m
[31m-		}[m
[31m-	}[m
[31m-[m
[31m-#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \[m
[31m-y->wds*sizeof(Long) + 2*sizeof(int))[m
[31m-[m
[31m- static Bigint *[m
[31m-multadd[m
[31m-#ifdef KR_headers[m
[31m-	(b, m, a) Bigint *b; int m, a;[m
[31m-#else[m
[31m-	(Bigint *b, int m, int a)	/* multiply by m and add a */[m
[31m-#endif[m
[31m-{[m
[31m-	int i, wds;[m
[31m-#ifdef ULLong[m
[31m-	ULong *x;[m
[31m-	ULLong carry, y;[m
[31m-#else[m
[31m-	ULong carry, *x, y;[m
[31m-#ifdef Pack_32[m
[31m-	ULong xi, z;[m
[31m-#endif[m
[31m-#endif[m
[31m-	Bigint *b1;[m
[31m-[m
[31m-	wds = b->wds;[m
[31m-	x = b->x;[m
[31m-	i = 0;[m
[31m-	carry = a;[m
[31m-	do {[m
[31m-#ifdef ULLong[m
[31m-		y = *x * (ULLong)m + carry;[m
[31m-		carry = y >> 32;[m
[31m-		*x++ = y & FFFFFFFF;[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-		xi = *x;[m
[31m-		y = (xi & 0xffff) * m + carry;[m
[31m-		z = (xi >> 16) * m + (y >> 16);[m
[31m-		carry = z >> 16;[m
[31m-		*x++ = (z << 16) + (y & 0xffff);[m
[31m-#else[m
[31m-		y = *x * m + carry;[m
[31m-		carry = y >> 16;[m
[31m-		*x++ = y & 0xffff;[m
[31m-#endif[m
[31m-#endif[m
[31m-		}[m
[31m-		while(++i < wds);[m
[31m-	if (carry) {[m
[31m-		if (wds >= b->maxwds) {[m
[31m-			b1 = Balloc(b->k+1);[m
[31m-			Bcopy(b1, b);[m
[31m-			Bfree(b);[m
[31m-			b = b1;[m
[31m-			}[m
[31m-		b->x[wds++] = carry;[m
[31m-		b->wds = wds;[m
[31m-		}[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-s2b[m
[31m-#ifdef KR_headers[m
[31m-	(s, nd0, nd, y9, dplen) CONST char *s; int nd0, nd, dplen; ULong y9;[m
[31m-#else[m
[31m-	(const char *s, int nd0, int nd, ULong y9, int dplen)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b;[m
[31m-	int i, k;[m
[31m-	Long x, y;[m
[31m-[m
[31m-	x = (nd + 8) / 9;[m
[31m-	for(k = 0, y = 1; x > y; y <<= 1, k++) ;[m
[31m-#ifdef Pack_32[m
[31m-	b = Balloc(k);[m
[31m-	b->x[0] = y9;[m
[31m-	b->wds = 1;[m
[31m-#else[m
[31m-	b = Balloc(k+1);[m
[31m-	b->x[0] = y9 & 0xffff;[m
[31m-	b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;[m
[31m-#endif[m
[31m-[m
[31m-	i = 9;[m
[31m-	if (9 < nd0) {[m
[31m-		s += 9;[m
[31m-		do b = multadd(b, 10, *s++ - '0');[m
[31m-			while(++i < nd0);[m
[31m-		s += dplen;[m
[31m-		}[m
[31m-	else[m
[31m-		s += dplen + 9;[m
[31m-	for(; i < nd; i++)[m
[31m-		b = multadd(b, 10, *s++ - '0');[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m- static int[m
[31m-hi0bits[m
[31m-#ifdef KR_headers[m
[31m-	(x) ULong x;[m
[31m-#else[m
[31m-	(ULong x)[m
[31m-#endif[m
[31m-{[m
[31m-	int k = 0;[m
[31m-[m
[31m-	if (!(x & 0xffff0000)) {[m
[31m-		k = 16;[m
[31m-		x <<= 16;[m
[31m-		}[m
[31m-	if (!(x & 0xff000000)) {[m
[31m-		k += 8;[m
[31m-		x <<= 8;[m
[31m-		}[m
[31m-	if (!(x & 0xf0000000)) {[m
[31m-		k += 4;[m
[31m-		x <<= 4;[m
[31m-		}[m
[31m-	if (!(x & 0xc0000000)) {[m
[31m-		k += 2;[m
[31m-		x <<= 2;[m
[31m-		}[m
[31m-	if (!(x & 0x80000000)) {[m
[31m-		k++;[m
[31m-		if (!(x & 0x40000000))[m
[31m-			return 32;[m
[31m-		}[m
[31m-	return k;[m
[31m-	}[m
[31m-[m
[31m- static int[m
[31m-lo0bits[m
[31m-#ifdef KR_headers[m
[31m-	(y) ULong *y;[m
[31m-#else[m
[31m-	(ULong *y)[m
[31m-#endif[m
[31m-{[m
[31m-	int k;[m
[31m-	ULong x = *y;[m
[31m-[m
[31m-	if (x & 7) {[m
[31m-		if (x & 1)[m
[31m-			return 0;[m
[31m-		if (x & 2) {[m
[31m-			*y = x >> 1;[m
[31m-			return 1;[m
[31m-			}[m
[31m-		*y = x >> 2;[m
[31m-		return 2;[m
[31m-		}[m
[31m-	k = 0;[m
[31m-	if (!(x & 0xffff)) {[m
[31m-		k = 16;[m
[31m-		x >>= 16;[m
[31m-		}[m
[31m-	if (!(x & 0xff)) {[m
[31m-		k += 8;[m
[31m-		x >>= 8;[m
[31m-		}[m
[31m-	if (!(x & 0xf)) {[m
[31m-		k += 4;[m
[31m-		x >>= 4;[m
[31m-		}[m
[31m-	if (!(x & 0x3)) {[m
[31m-		k += 2;[m
[31m-		x >>= 2;[m
[31m-		}[m
[31m-	if (!(x & 1)) {[m
[31m-		k++;[m
[31m-		x >>= 1;[m
[31m-		if (!x)[m
[31m-			return 32;[m
[31m-		}[m
[31m-	*y = x;[m
[31m-	return k;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-i2b[m
[31m-#ifdef KR_headers[m
[31m-	(i) int i;[m
[31m-#else[m
[31m-	(int i)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b;[m
[31m-[m
[31m-	b = Balloc(1);[m
[31m-	b->x[0] = i;[m
[31m-	b->wds = 1;[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-mult[m
[31m-#ifdef KR_headers[m
[31m-	(a, b) Bigint *a, *b;[m
[31m-#else[m
[31m-	(Bigint *a, Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *c;[m
[31m-	int k, wa, wb, wc;[m
[31m-	ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;[m
[31m-	ULong y;[m
[31m-#ifdef ULLong[m
[31m-	ULLong carry, z;[m
[31m-#else[m
[31m-	ULong carry, z;[m
[31m-#ifdef Pack_32[m
[31m-	ULong z2;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-	if (a->wds < b->wds) {[m
[31m-		c = a;[m
[31m-		a = b;[m
[31m-		b = c;[m
[31m-		}[m
[31m-	k = a->k;[m
[31m-	wa = a->wds;[m
[31m-	wb = b->wds;[m
[31m-	wc = wa + wb;[m
[31m-	if (wc > a->maxwds)[m
[31m-		k++;[m
[31m-	c = Balloc(k);[m
[31m-	for(x = c->x, xa = x + wc; x < xa; x++)[m
[31m-		*x = 0;[m
[31m-	xa = a->x;[m
[31m-	xae = xa + wa;[m
[31m-	xb = b->x;[m
[31m-	xbe = xb + wb;[m
[31m-	xc0 = c->x;[m
[31m-#ifdef ULLong[m
[31m-	for(; xb < xbe; xc0++) {[m
[31m-		if ((y = *xb++)) {[m
[31m-			x = xa;[m
[31m-			xc = xc0;[m
[31m-			carry = 0;[m
[31m-			do {[m
[31m-				z = *x++ * (ULLong)y + *xc + carry;[m
[31m-				carry = z >> 32;[m
[31m-				*xc++ = z & FFFFFFFF;[m
[31m-				}[m
[31m-				while(x < xae);[m
[31m-			*xc = carry;[m
[31m-			}[m
[31m-		}[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-	for(; xb < xbe; xb++, xc0++) {[m
[31m-		if (y = *xb & 0xffff) {[m
[31m-			x = xa;[m
[31m-			xc = xc0;[m
[31m-			carry = 0;[m
[31m-			do {[m
[31m-				z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;[m
[31m-				carry = z >> 16;[m
[31m-				z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;[m
[31m-				carry = z2 >> 16;[m
[31m-				Storeinc(xc, z2, z);[m
[31m-				}[m
[31m-				while(x < xae);[m
[31m-			*xc = carry;[m
[31m-			}[m
[31m-		if (y = *xb >> 16) {[m
[31m-			x = xa;[m
[31m-			xc = xc0;[m
[31m-			carry = 0;[m
[31m-			z2 = *xc;[m
[31m-			do {[m
[31m-				z = (*x & 0xffff) * y + (*xc >> 16) + carry;[m
[31m-				carry = z >> 16;[m
[31m-				Storeinc(xc, z, z2);[m
[31m-				z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;[m
[31m-				carry = z2 >> 16;[m
[31m-				}[m
[31m-				while(x < xae);[m
[31m-			*xc = z2;[m
[31m-			}[m
[31m-		}[m
[31m-#else[m
[31m-	for(; xb < xbe; xc0++) {[m
[31m-		if (y = *xb++) {[m
[31m-			x = xa;[m
[31m-			xc = xc0;[m
[31m-			carry = 0;[m
[31m-			do {[m
[31m-				z = *x++ * y + *xc + carry;[m
[31m-				carry = z >> 16;[m
[31m-				*xc++ = z & 0xffff;[m
[31m-				}[m
[31m-				while(x < xae);[m
[31m-			*xc = carry;[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m-#endif[m
[31m-	for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;[m
[31m-	c->wds = wc;[m
[31m-	return c;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *p5s;[m
[31m-[m
[31m- static Bigint *[m
[31m-pow5mult[m
[31m-#ifdef KR_headers[m
[31m-	(b, k) Bigint *b; int k;[m
[31m-#else[m
[31m-	(Bigint *b, int k)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b1, *p5, *p51;[m
[31m-	int i;[m
[31m-	static int p05[3] = { 5, 25, 125 };[m
[31m-[m
[31m-	if ((i = k & 3))[m
[31m-		b = multadd(b, p05[i-1], 0);[m
[31m-[m
[31m-	if (!(k >>= 2))[m
[31m-		return b;[m
[31m-	if (!(p5 = p5s)) {[m
[31m-		/* first time */[m
[31m-#ifdef MULTIPLE_THREADS[m
[31m-		ACQUIRE_DTOA_LOCK(1);[m
[31m-		if (!(p5 = p5s)) {[m
[31m-			p5 = p5s = i2b(625);[m
[31m-			p5->next = 0;[m
[31m-			}[m
[31m-		FREE_DTOA_LOCK(1);[m
[31m-#else[m
[31m-		p5 = p5s = i2b(625);[m
[31m-		p5->next = 0;[m
[31m-#endif[m
[31m-		}[m
[31m-	for(;;) {[m
[31m-		if (k & 1) {[m
[31m-			b1 = mult(b, p5);[m
[31m-			Bfree(b);[m
[31m-			b = b1;[m
[31m-			}[m
[31m-		if (!(k >>= 1))[m
[31m-			break;[m
[31m-		if (!(p51 = p5->next)) {[m
[31m-#ifdef MULTIPLE_THREADS[m
[31m-			ACQUIRE_DTOA_LOCK(1);[m
[31m-			if (!(p51 = p5->next)) {[m
[31m-				p51 = p5->next = mult(p5,p5);[m
[31m-				p51->next = 0;[m
[31m-				}[m
[31m-			FREE_DTOA_LOCK(1);[m
[31m-#else[m
[31m-			p51 = p5->next = mult(p5,p5);[m
[31m-			p51->next = 0;[m
[31m-#endif[m
[31m-			}[m
[31m-		p5 = p51;[m
[31m-		}[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-lshift[m
[31m-#ifdef KR_headers[m
[31m-	(b, k) Bigint *b; int k;[m
[31m-#else[m
[31m-	(Bigint *b, int k)[m
[31m-#endif[m
[31m-{[m
[31m-	int i, k1, n, n1;[m
[31m-	Bigint *b1;[m
[31m-	ULong *x, *x1, *xe, z;[m
[31m-[m
[31m-#ifdef Pack_32[m
[31m-	n = k >> 5;[m
[31m-#else[m
[31m-	n = k >> 4;[m
[31m-#endif[m
[31m-	k1 = b->k;[m
[31m-	n1 = n + b->wds + 1;[m
[31m-	for(i = b->maxwds; n1 > i; i <<= 1)[m
[31m-		k1++;[m
[31m-	b1 = Balloc(k1);[m
[31m-	x1 = b1->x;[m
[31m-	for(i = 0; i < n; i++)[m
[31m-		*x1++ = 0;[m
[31m-	x = b->x;[m
[31m-	xe = x + b->wds;[m
[31m-#ifdef Pack_32[m
[31m-	if (k &= 0x1f) {[m
[31m-		k1 = 32 - k;[m
[31m-		z = 0;[m
[31m-		do {[m
[31m-			*x1++ = *x << k | z;[m
[31m-			z = *x++ >> k1;[m
[31m-			}[m
[31m-			while(x < xe);[m
[31m-		if ((*x1 = z))[m
[31m-			++n1;[m
[31m-		}[m
[31m-#else[m
[31m-	if (k &= 0xf) {[m
[31m-		k1 = 16 - k;[m
[31m-		z = 0;[m
[31m-		do {[m
[31m-			*x1++ = *x << k  & 0xffff | z;[m
[31m-			z = *x++ >> k1;[m
[31m-			}[m
[31m-			while(x < xe);[m
[31m-		if (*x1 = z)[m
[31m-			++n1;[m
[31m-		}[m
[31m-#endif[m
[31m-	else do[m
[31m-		*x1++ = *x++;[m
[31m-		while(x < xe);[m
[31m-	b1->wds = n1 - 1;[m
[31m-	Bfree(b);[m
[31m-	return b1;[m
[31m-	}[m
[31m-[m
[31m- static int[m
[31m-cmp[m
[31m-#ifdef KR_headers[m
[31m-	(a, b) Bigint *a, *b;[m
[31m-#else[m
[31m-	(Bigint *a, Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong *xa, *xa0, *xb, *xb0;[m
[31m-	int i, j;[m
[31m-[m
[31m-	i = a->wds;[m
[31m-	j = b->wds;[m
[31m-#ifdef DEBUG[m
[31m-	if (i > 1 && !a->x[i-1])[m
[31m-		Bug("cmp called with a->x[a->wds-1] == 0");[m
[31m-	if (j > 1 && !b->x[j-1])[m
[31m-		Bug("cmp called with b->x[b->wds-1] == 0");[m
[31m-#endif[m
[31m-	if (i -= j)[m
[31m-		return i;[m
[31m-	xa0 = a->x;[m
[31m-	xa = xa0 + j;[m
[31m-	xb0 = b->x;[m
[31m-	xb = xb0 + j;[m
[31m-	for(;;) {[m
[31m-		if (*--xa != *--xb)[m
[31m-			return *xa < *xb ? -1 : 1;[m
[31m-		if (xa <= xa0)[m
[31m-			break;[m
[31m-		}[m
[31m-	return 0;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-diff[m
[31m-#ifdef KR_headers[m
[31m-	(a, b) Bigint *a, *b;[m
[31m-#else[m
[31m-	(Bigint *a, Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *c;[m
[31m-	int i, wa, wb;[m
[31m-	ULong *xa, *xae, *xb, *xbe, *xc;[m
[31m-#ifdef ULLong[m
[31m-	ULLong borrow, y;[m
[31m-#else[m
[31m-	ULong borrow, y;[m
[31m-#ifdef Pack_32[m
[31m-	ULong z;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-	i = cmp(a,b);[m
[31m-	if (!i) {[m
[31m-		c = Balloc(0);[m
[31m-		c->wds = 1;[m
[31m-		c->x[0] = 0;[m
[31m-		return c;[m
[31m-		}[m
[31m-	if (i < 0) {[m
[31m-		c = a;[m
[31m-		a = b;[m
[31m-		b = c;[m
[31m-		i = 1;[m
[31m-		}[m
[31m-	else[m
[31m-		i = 0;[m
[31m-	c = Balloc(a->k);[m
[31m-	c->sign = i;[m
[31m-	wa = a->wds;[m
[31m-	xa = a->x;[m
[31m-	xae = xa + wa;[m
[31m-	wb = b->wds;[m
[31m-	xb = b->x;[m
[31m-	xbe = xb + wb;[m
[31m-	xc = c->x;[m
[31m-	borrow = 0;[m
[31m-#ifdef ULLong[m
[31m-	do {[m
[31m-		y = (ULLong)*xa++ - *xb++ - borrow;[m
[31m-		borrow = y >> 32 & (ULong)1;[m
[31m-		*xc++ = y & FFFFFFFF;[m
[31m-		}[m
[31m-		while(xb < xbe);[m
[31m-	while(xa < xae) {[m
[31m-		y = *xa++ - borrow;[m
[31m-		borrow = y >> 32 & (ULong)1;[m
[31m-		*xc++ = y & FFFFFFFF;[m
[31m-		}[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-	do {[m
[31m-		y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;[m
[31m-		borrow = (y & 0x10000) >> 16;[m
[31m-		z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;[m
[31m-		borrow = (z & 0x10000) >> 16;[m
[31m-		Storeinc(xc, z, y);[m
[31m-		}[m
[31m-		while(xb < xbe);[m
[31m-	while(xa < xae) {[m
[31m-		y = (*xa & 0xffff) - borrow;[m
[31m-		borrow = (y & 0x10000) >> 16;[m
[31m-		z = (*xa++ >> 16) - borrow;[m
[31m-		borrow = (z & 0x10000) >> 16;[m
[31m-		Storeinc(xc, z, y);[m
[31m-		}[m
[31m-#else[m
[31m-	do {[m
[31m-		y = *xa++ - *xb++ - borrow;[m
[31m-		borrow = (y & 0x10000) >> 16;[m
[31m-		*xc++ = y & 0xffff;[m
[31m-		}[m
[31m-		while(xb < xbe);[m
[31m-	while(xa < xae) {[m
[31m-		y = *xa++ - borrow;[m
[31m-		borrow = (y & 0x10000) >> 16;[m
[31m-		*xc++ = y & 0xffff;[m
[31m-		}[m
[31m-#endif[m
[31m-#endif[m
[31m-	while(!*--xc)[m
[31m-		wa--;[m
[31m-	c->wds = wa;[m
[31m-	return c;[m
[31m-	}[m
[31m-[m
[31m- static double[m
[31m-ulp[m
[31m-#ifdef KR_headers[m
[31m-	(x) U *x;[m
[31m-#else[m
[31m-	(U *x)[m
[31m-#endif[m
[31m-{[m
[31m-	Long L;[m
[31m-	U u;[m
[31m-[m
[31m-	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;[m
[31m-#ifndef Avoid_Underflow[m
[31m-#ifndef Sudden_Underflow[m
[31m-	if (L > 0) {[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-		L |= Exp_msk1 >> 4;[m
[31m-#endif[m
[31m-		word0(&u) = L;[m
[31m-		word1(&u) = 0;[m
[31m-#ifndef Avoid_Underflow[m
[31m-#ifndef Sudden_Underflow[m
[31m-		}[m
[31m-	else {[m
[31m-		L = -L >> Exp_shift;[m
[31m-		if (L < Exp_shift) {[m
[31m-			word0(&u) = 0x80000 >> L;[m
[31m-			word1(&u) = 0;[m
[31m-			}[m
[31m-		else {[m
[31m-			word0(&u) = 0;[m
[31m-			L -= Exp_shift;[m
[31m-			word1(&u) = L >= 31 ? 1 : 1 << 31 - L;[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m-#endif[m
[31m-	return dval(&u);[m
[31m-	}[m
[31m-[m
[31m- static double[m
[31m-b2d[m
[31m-#ifdef KR_headers[m
[31m-	(a, e) Bigint *a; int *e;[m
[31m-#else[m
[31m-	(Bigint *a, int *e)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong *xa, *xa0, w, y, z;[m
[31m-	int k;[m
[31m-	U d;[m
[31m-#ifdef VAX[m
[31m-	ULong d0, d1;[m
[31m-#else[m
[31m-#define d0 word0(&d)[m
[31m-#define d1 word1(&d)[m
[31m-#endif[m
[31m-[m
[31m-	xa0 = a->x;[m
[31m-	xa = xa0 + a->wds;[m
[31m-	y = *--xa;[m
[31m-#ifdef DEBUG[m
[31m-	if (!y) Bug("zero y in b2d");[m
[31m-#endif[m
[31m-	k = hi0bits(y);[m
[31m-	*e = 32 - k;[m
[31m-#ifdef Pack_32[m
[31m-	if (k < Ebits) {[m
[31m-		d0 = Exp_1 | y >> (Ebits - k);[m
[31m-		w = xa > xa0 ? *--xa : 0;[m
[31m-		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);[m
[31m-		goto ret_d;[m
[31m-		}[m
[31m-	z = xa > xa0 ? *--xa : 0;[m
[31m-	if (k -= Ebits) {[m
[31m-		d0 = Exp_1 | y << k | z >> (32 - k);[m
[31m-		y = xa > xa0 ? *--xa : 0;[m
[31m-		d1 = z << k | y >> (32 - k);[m
[31m-		}[m
[31m-	else {[m
[31m-		d0 = Exp_1 | y;[m
[31m-		d1 = z;[m
[31m-		}[m
[31m-#else[m
[31m-	if (k < Ebits + 16) {[m
[31m-		z = xa > xa0 ? *--xa : 0;[m
[31m-		d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;[m
[31m-		w = xa > xa0 ? *--xa : 0;[m
[31m-		y = xa > xa0 ? *--xa : 0;[m
[31m-		d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;[m
[31m-		goto ret_d;[m
[31m-		}[m
[31m-	z = xa > xa0 ? *--xa : 0;[m
[31m-	w = xa > xa0 ? *--xa : 0;[m
[31m-	k -= Ebits + 16;[m
[31m-	d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;[m
[31m-	y = xa > xa0 ? *--xa : 0;[m
[31m-	d1 = w << k + 16 | y << k;[m
[31m-#endif[m
[31m- ret_d:[m
[31m-#ifdef VAX[m
[31m-	word0(&d) = d0 >> 16 | d0 << 16;[m
[31m-	word1(&d) = d1 >> 16 | d1 << 16;[m
[31m-#else[m
[31m-#undef d0[m
[31m-#undef d1[m
[31m-#endif[m
[31m-	return dval(&d);[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-d2b[m
[31m-#ifdef KR_headers[m
[31m-	(d, e, bits) U *d; int *e, *bits;[m
[31m-#else[m
[31m-	(U *d, int *e, int *bits)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b;[m
[31m-	int de, k;[m
[31m-	ULong *x, y, z;[m
[31m-#ifndef Sudden_Underflow[m
[31m-	int i;[m
[31m-#endif[m
[31m-#ifdef VAX[m
[31m-	ULong d0, d1;[m
[31m-	d0 = word0(d) >> 16 | word0(d) << 16;[m
[31m-	d1 = word1(d) >> 16 | word1(d) << 16;[m
[31m-#else[m
[31m-#define d0 word0(d)[m
[31m-#define d1 word1(d)[m
[31m-#endif[m
[31m-[m
[31m-#ifdef Pack_32[m
[31m-	b = Balloc(1);[m
[31m-#else[m
[31m-	b = Balloc(2);[m
[31m-#endif[m
[31m-	x = b->x;[m
[31m-[m
[31m-	z = d0 & Frac_mask;[m
[31m-	d0 &= 0x7fffffff;	/* clear sign bit, which we ignore */[m
[31m-#ifdef Sudden_Underflow[m
[31m-	de = (int)(d0 >> Exp_shift);[m
[31m-#ifndef IBM[m
[31m-	z |= Exp_msk11;[m
[31m-#endif[m
[31m-#else[m
[31m-	if ((de = (int)(d0 >> Exp_shift)))[m
[31m-		z |= Exp_msk1;[m
[31m-#endif[m
[31m-#ifdef Pack_32[m
[31m-	if ((y = d1)) {[m
[31m-		if ((k = lo0bits(&y))) {[m
[31m-			x[0] = y | z << (32 - k);[m
[31m-			z >>= k;[m
[31m-			}[m
[31m-		else[m
[31m-			x[0] = y;[m
[31m-#ifndef Sudden_Underflow[m
[31m-		i =[m
[31m-#endif[m
[31m-		    b->wds = (x[1] = z) ? 2 : 1;[m
[31m-		}[m
[31m-	else {[m
[31m-		k = lo0bits(&z);[m
[31m-		x[0] = z;[m
[31m-#ifndef Sudden_Underflow[m
[31m-		i =[m
[31m-#endif[m
[31m-		    b->wds = 1;[m
[31m-		k += 32;[m
[31m-		}[m
[31m-#else[m
[31m-	if (y = d1) {[m
[31m-		if (k = lo0bits(&y))[m
[31m-			if (k >= 16) {[m
[31m-				x[0] = y | z << 32 - k & 0xffff;[m
[31m-				x[1] = z >> k - 16 & 0xffff;[m
[31m-				x[2] = z >> k;[m
[31m-				i = 2;[m
[31m-				}[m
[31m-			else {[m
[31m-				x[0] = y & 0xffff;[m
[31m-				x[1] = y >> 16 | z << 16 - k & 0xffff;[m
[31m-				x[2] = z >> k & 0xffff;[m
[31m-				x[3] = z >> k+16;[m
[31m-				i = 3;[m
[31m-				}[m
[31m-		else {[m
[31m-			x[0] = y & 0xffff;[m
[31m-			x[1] = y >> 16;[m
[31m-			x[2] = z & 0xffff;[m
[31m-			x[3] = z >> 16;[m
[31m-			i = 3;[m
[31m-			}[m
[31m-		}[m
[31m-	else {[m
[31m-#ifdef DEBUG[m
[31m-		if (!z)[m
[31m-			Bug("Zero passed to d2b");[m
[31m-#endif[m
[31m-		k = lo0bits(&z);[m
[31m-		if (k >= 16) {[m
[31m-			x[0] = z;[m
[31m-			i = 0;[m
[31m-			}[m
[31m-		else {[m
[31m-			x[0] = z & 0xffff;[m
[31m-			x[1] = z >> 16;[m
[31m-			i = 1;[m
[31m-			}[m
[31m-		k += 32;[m
[31m-		}[m
[31m-	while(!x[i])[m
[31m-		--i;[m
[31m-	b->wds = i + 1;[m
[31m-#endif[m
[31m-#ifndef Sudden_Underflow[m
[31m-	if (de) {[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-		*e = (de - Bias - (P-1) << 2) + k;[m
[31m-		*bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);[m
[31m-#else[m
[31m-		*e = de - Bias - (P-1) + k;[m
[31m-		*bits = P - k;[m
[31m-#endif[m
[31m-#ifndef Sudden_Underflow[m
[31m-		}[m
[31m-	else {[m
[31m-		*e = de - Bias - (P-1) + 1 + k;[m
[31m-#ifdef Pack_32[m
[31m-		*bits = 32*i - hi0bits(x[i-1]);[m
[31m-#else[m
[31m-		*bits = (i+2)*16 - hi0bits(x[i]);[m
[31m-#endif[m
[31m-		}[m
[31m-#endif[m
[31m-	return b;[m
[31m-	}[m
[31m-#undef d0[m
[31m-#undef d1[m
[31m-[m
[31m- static double[m
[31m-ratio[m
[31m-#ifdef KR_headers[m
[31m-	(a, b) Bigint *a, *b;[m
[31m-#else[m
[31m-	(Bigint *a, Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	U da, db;[m
[31m-	int k, ka, kb;[m
[31m-[m
[31m-	dval(&da) = b2d(a, &ka);[m
[31m-	dval(&db) = b2d(b, &kb);[m
[31m-#ifdef Pack_32[m
[31m-	k = ka - kb + 32*(a->wds - b->wds);[m
[31m-#else[m
[31m-	k = ka - kb + 16*(a->wds - b->wds);[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-	if (k > 0) {[m
[31m-		word0(&da) += (k >> 2)*Exp_msk1;[m
[31m-		if (k &= 3)[m
[31m-			dval(&da) *= 1 << k;[m
[31m-		}[m
[31m-	else {[m
[31m-		k = -k;[m
[31m-		word0(&db) += (k >> 2)*Exp_msk1;[m
[31m-		if (k &= 3)[m
[31m-			dval(&db) *= 1 << k;[m
[31m-		}[m
[31m-#else[m
[31m-	if (k > 0)[m
[31m-		word0(&da) += k*Exp_msk1;[m
[31m-	else {[m
[31m-		k = -k;[m
[31m-		word0(&db) += k*Exp_msk1;[m
[31m-		}[m
[31m-#endif[m
[31m-	return dval(&da) / dval(&db);[m
[31m-	}[m
[31m-[m
[31m- static CONST double[m
[31m-tens[] = {[m
[31m-		1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,[m
[31m-		1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,[m
[31m-		1e20, 1e21, 1e22[m
[31m-#ifdef VAX[m
[31m-		, 1e23, 1e24[m
[31m-#endif[m
[31m-		};[m
[31m-[m
[31m- static CONST double[m
[31m-#ifdef IEEE_Arith[m
[31m-bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };[m
[31m-static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,[m
[31m-#ifdef Avoid_Underflow[m
[31m-		9007199254740992.*9007199254740992.e-256[m
[31m-		/* = 2^106 * 1e-256 */[m
[31m-#else[m
[31m-		1e-256[m
[31m-#endif[m
[31m-		};[m
[31m-/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */[m
[31m-/* flag unnecessarily.  It leads to a song and dance at the end of strtod. */[m
[31m-#define Scale_Bit 0x10[m
[31m-#define n_bigtens 5[m
[31m-#else[m
[31m-#ifdef IBM[m
[31m-bigtens[] = { 1e16, 1e32, 1e64 };[m
[31m-static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };[m
[31m-#define n_bigtens 3[m
[31m-#else[m
[31m-bigtens[] = { 1e16, 1e32 };[m
[31m-static CONST double tinytens[] = { 1e-16, 1e-32 };[m
[31m-#define n_bigtens 2[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#undef Need_Hexdig[m
[31m-#ifdef INFNAN_CHECK[m
[31m-#ifndef No_Hex_NaN[m
[31m-#define Need_Hexdig[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifndef Need_Hexdig[m
[31m-#ifndef NO_HEX_FP[m
[31m-#define Need_Hexdig[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifdef Need_Hexdig /*{*/[m
[31m-static unsigned char hexdig[256];[m
[31m-[m
[31m- static void[m
[31m-#ifdef KR_headers[m
[31m-htinit(h, s, inc) unsigned char *h; unsigned char *s; int inc;[m
[31m-#else[m
[31m-htinit(unsigned char *h, unsigned char *s, int inc)[m
[31m-#endif[m
[31m-{[m
[31m-	int i, j;[m
[31m-	for(i = 0; (j = s[i]) !=0; i++)[m
[31m-		h[j] = i + inc;[m
[31m-	}[m
[31m-[m
[31m- static void[m
[31m-#ifdef KR_headers[m
[31m-hexdig_init()[m
[31m-#else[m
[31m-hexdig_init(void)[m
[31m-#endif[m
[31m-{[m
[31m-#define USC (unsigned char *)[m
[31m-	htinit(hexdig, USC "0123456789", 0x10);[m
[31m-	htinit(hexdig, USC "abcdef", 0x10 + 10);[m
[31m-	htinit(hexdig, USC "ABCDEF", 0x10 + 10);[m
[31m-	}[m
[31m-#endif /* } Need_Hexdig */[m
[31m-[m
[31m-#ifdef INFNAN_CHECK[m
[31m-[m
[31m-#ifndef NAN_WORD0[m
[31m-#define NAN_WORD0 0x7ff80000[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NAN_WORD1[m
[31m-#define NAN_WORD1 0[m
[31m-#endif[m
[31m-[m
[31m- static int[m
[31m-match[m
[31m-#ifdef KR_headers[m
[31m-	(sp, t) char **sp, *t;[m
[31m-#else[m
[31m-	(const char **sp, const char *t)[m
[31m-#endif[m
[31m-{[m
[31m-	int c, d;[m
[31m-	CONST char *s = *sp;[m
[31m-[m
[31m-	while((d = *t++)) {[m
[31m-		if ((c = *++s) >= 'A' && c <= 'Z')[m
[31m-			c += 'a' - 'A';[m
[31m-		if (c != d)[m
[31m-			return 0;[m
[31m-		}[m
[31m-	*sp = s + 1;[m
[31m-	return 1;[m
[31m-	}[m
[31m-[m
[31m-#ifndef No_Hex_NaN[m
[31m- static void[m
[31m-hexnan[m
[31m-#ifdef KR_headers[m
[31m-	(rvp, sp) U *rvp; CONST char **sp;[m
[31m-#else[m
[31m-	(U *rvp, const char **sp)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong c, x[2];[m
[31m-	CONST char *s;[m
[31m-	int c1, havedig, udx0, xshift;[m
[31m-[m
[31m-	if (!hexdig['0'])[m
[31m-		hexdig_init();[m
[31m-	x[0] = x[1] = 0;[m
[31m-	havedig = xshift = 0;[m
[31m-	udx0 = 1;[m
[31m-	s = *sp;[m
[31m-	/* allow optional initial 0x or 0X */[m
[31m-	while((c = *(CONST unsigned char*)(s+1)) && c <= ' ')[m
[31m-		++s;[m
[31m-	if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))[m
[31m-		s += 2;[m
[31m-	while((c = *(CONST unsigned char*)++s)) {[m
[31m-		if ((c1 = hexdig[c]))[m
[31m-			c  = c1 & 0xf;[m
[31m-		else if (c <= ' ') {[m
[31m-			if (udx0 && havedig) {[m
[31m-				udx0 = 0;[m
[31m-				xshift = 1;[m
[31m-				}[m
[31m-			continue;[m
[31m-			}[m
[31m-#ifdef GDTOA_NON_PEDANTIC_NANCHECK[m
[31m-		else if (/*(*/ c == ')' && havedig) {[m
[31m-			*sp = s + 1;[m
[31m-			break;[m
[31m-			}[m
[31m-		else[m
[31m-			return;	/* invalid form: don't change *sp */[m
[31m-#else[m
[31m-		else {[m
[31m-			do {[m
[31m-				if (/*(*/ c == ')') {[m
[31m-					*sp = s + 1;[m
[31m-					break;[m
[31m-					}[m
[31m-				} while((c = *++s));[m
[31m-			break;[m
[31m-			}[m
[31m-#endif[m
[31m-		havedig = 1;[m
[31m-		if (xshift) {[m
[31m-			xshift = 0;[m
[31m-			x[0] = x[1];[m
[31m-			x[1] = 0;[m
[31m-			}[m
[31m-		if (udx0)[m
[31m-			x[0] = (x[0] << 4) | (x[1] >> 28);[m
[31m-		x[1] = (x[1] << 4) | c;[m
[31m-		}[m
[31m-	if ((x[0] &= 0xfffff) || x[1]) {[m
[31m-		word0(rvp) = Exp_mask | x[0];[m
[31m-		word1(rvp) = x[1];[m
[31m-		}[m
[31m-	}[m
[31m-#endif /*No_Hex_NaN*/[m
[31m-#endif /* INFNAN_CHECK */[m
[31m-[m
[31m-#ifdef Pack_32[m
[31m-#define ULbits 32[m
[31m-#define kshift 5[m
[31m-#define kmask 31[m
[31m-#else[m
[31m-#define ULbits 16[m
[31m-#define kshift 4[m
[31m-#define kmask 15[m
[31m-#endif[m
[31m-[m
[31m-#if !defined(NO_HEX_FP) || defined(Honor_FLT_ROUNDS) /*{*/[m
[31m- static Bigint *[m
[31m-#ifdef KR_headers[m
[31m-increment(b) Bigint *b;[m
[31m-#else[m
[31m-increment(Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong *x, *xe;[m
[31m-	Bigint *b1;[m
[31m-[m
[31m-	x = b->x;[m
[31m-	xe = x + b->wds;[m
[31m-	do {[m
[31m-		if (*x < (ULong)0xffffffffL) {[m
[31m-			++*x;[m
[31m-			return b;[m
[31m-			}[m
[31m-		*x++ = 0;[m
[31m-		} while(x < xe);[m
[31m-	{[m
[31m-		if (b->wds >= b->maxwds) {[m
[31m-			b1 = Balloc(b->k+1);[m
[31m-			Bcopy(b1,b);[m
[31m-			Bfree(b);[m
[31m-			b = b1;[m
[31m-			}[m
[31m-		b->x[b->wds++] = 1;[m
[31m-		}[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m-#endif /*}*/[m
[31m-[m
[31m-#ifndef NO_HEX_FP /*{*/[m
[31m-[m
[31m- static void[m
[31m-#ifdef KR_headers[m
[31m-rshift(b, k) Bigint *b; int k;[m
[31m-#else[m
[31m-rshift(Bigint *b, int k)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong *x, *x1, *xe, y;[m
[31m-	int n;[m
[31m-[m
[31m-	x = x1 = b->x;[m
[31m-	n = k >> kshift;[m
[31m-	if (n < b->wds) {[m
[31m-		xe = x + b->wds;[m
[31m-		x += n;[m
[31m-		if (k &= kmask) {[m
[31m-			n = 32 - k;[m
[31m-			y = *x++ >> k;[m
[31m-			while(x < xe) {[m
[31m-				*x1++ = (y | (*x << n)) & 0xffffffff;[m
[31m-				y = *x++ >> k;[m
[31m-				}[m
[31m-			if ((*x1 = y) !=0)[m
[31m-				x1++;[m
[31m-			}[m
[31m-		else[m
[31m-			while(x < xe)[m
[31m-				*x1++ = *x++;[m
[31m-		}[m
[31m-	if ((b->wds = x1 - b->x) == 0)[m
[31m-		b->x[0] = 0;[m
[31m-	}[m
[31m-[m
[31m- static ULong[m
[31m-#ifdef KR_headers[m
[31m-any_on(b, k) Bigint *b; int k;[m
[31m-#else[m
[31m-any_on(Bigint *b, int k)[m
[31m-#endif[m
[31m-{[m
[31m-	int n, nwds;[m
[31m-	ULong *x, *x0, x1, x2;[m
[31m-[m
[31m-	x = b->x;[m
[31m-	nwds = b->wds;[m
[31m-	n = k >> kshift;[m
[31m-	if (n > nwds)[m
[31m-		n = nwds;[m
[31m-	else if (n < nwds && (k &= kmask)) {[m
[31m-		x1 = x2 = x[n];[m
[31m-		x1 >>= k;[m
[31m-		x1 <<= k;[m
[31m-		if (x1 != x2)[m
[31m-			return 1;[m
[31m-		}[m
[31m-	x0 = x;[m
[31m-	x += n;[m
[31m-	while(x > x0)[m
[31m-		if (*--x)[m
[31m-			return 1;[m
[31m-	return 0;[m
[31m-	}[m
[31m-[m
[31m-enum {	/* rounding values: same as FLT_ROUNDS */[m
[31m-	Round_zero = 0,[m
[31m-	Round_near = 1,[m
[31m-	Round_up = 2,[m
[31m-	Round_down = 3[m
[31m-	};[m
[31m-[m
[31m- void[m
[31m-#ifdef KR_headers[m
[31m-gethex(sp, rvp, rounding, sign)[m
[31m-	CONST char **sp; U *rvp; int rounding, sign;[m
[31m-#else[m
[31m-gethex( CONST char **sp, U *rvp, int rounding, int sign)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b;[m
[31m-	CONST unsigned char *decpt, *s0, *s, *s1;[m
[31m-	Long e, e1;[m
[31m-	ULong L, lostbits, *x;[m
[31m-	int big, denorm, esign, havedig, k, n, nbits, up, zret;[m
[31m-#ifdef IBM[m
[31m-	int j;[m
[31m-#endif[m
[31m-	enum {[m
[31m-#ifdef IEEE_Arith /*{{*/[m
[31m-		emax = 0x7fe - Bias - P + 1,[m
[31m-		emin = Emin - P + 1[m
[31m-#else /*}{*/[m
[31m-		emin = Emin - P,[m
[31m-#ifdef VAX[m
[31m-		emax = 0x7ff - Bias - P + 1[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-		emax = 0x7f - Bias - P[m
[31m-#endif[m
[31m-#endif /*}}*/[m
[31m-		};[m
[31m-#ifdef USE_LOCALE[m
[31m-	int i;[m
[31m-#ifdef NO_LOCALE_CACHE[m
[31m-	const unsigned char *decimalpoint = (unsigned char*)[m
[31m-		localeconv()->decimal_point;[m
[31m-#else[m
[31m-	const unsigned char *decimalpoint;[m
[31m-	static unsigned char *decimalpoint_cache;[m
[31m-	if (!(s0 = decimalpoint_cache)) {[m
[31m-		s0 = (unsigned char*)localeconv()->decimal_point;[m
[31m-		if ((decimalpoint_cache = (unsigned char*)[m
[31m-				MALLOC(strlen((CONST char*)s0) + 1))) {[m
[31m-			strcpy((char*)decimalpoint_cache, (CONST char*)s0);[m
[31m-			s0 = decimalpoint_cache;[m
[31m-			}[m
[31m-		}[m
[31m-	decimalpoint = s0;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-	if (!hexdig['0'])[m
[31m-		hexdig_init();[m
[31m-	havedig = 0;[m
[31m-	s0 = *(CONST unsigned char **)sp + 2;[m
[31m-	while(s0[havedig] == '0')[m
[31m-		havedig++;[m
[31m-	s0 += havedig;[m
[31m-	s = s0;[m
[31m-	decpt = 0;[m
[31m-	zret = 0;[m
[31m-	e = 0;[m
[31m-	if (hexdig[*s])[m
[31m-		havedig++;[m
[31m-	else {[m
[31m-		zret = 1;[m
[31m-#ifdef USE_LOCALE[m
[31m-		for(i = 0; decimalpoint[i]; ++i) {[m
[31m-			if (s[i] != decimalpoint[i])[m
[31m-				goto pcheck;[m
[31m-			}[m
[31m-		decpt = s += i;[m
[31m-#else[m
[31m-		if (*s != '.')[m
[31m-			goto pcheck;[m
[31m-		decpt = ++s;[m
[31m-#endif[m
[31m-		if (!hexdig[*s])[m
[31m-			goto pcheck;[m
[31m-		while(*s == '0')[m
[31m-			s++;[m
[31m-		if (hexdig[*s])[m
[31m-			zret = 0;[m
[31m-		havedig = 1;[m
[31m-		s0 = s;[m
[31m-		}[m
[31m-	while(hexdig[*s])[m
[31m-		s++;[m
[31m-#ifdef USE_LOCALE[m
[31m-	if (*s == *decimalpoint && !decpt) {[m
[31m-		for(i = 1; decimalpoint[i]; ++i) {[m
[31m-			if (s[i] != decimalpoint[i])[m
[31m-				goto pcheck;[m
[31m-			}[m
[31m-		decpt = s += i;[m
[31m-#else[m
[31m-	if (*s == '.' && !decpt) {[m
[31m-		decpt = ++s;[m
[31m-#endif[m
[31m-		while(hexdig[*s])[m
[31m-			s++;[m
[31m-		}/*}*/[m
[31m-	if (decpt)[m
[31m-		e = -(((Long)(s-decpt)) << 2);[m
[31m- pcheck:[m
[31m-	s1 = s;[m
[31m-	big = esign = 0;[m
[31m-	switch(*s) {[m
[31m-	  case 'p':[m
[31m-	  case 'P':[m
[31m-		switch(*++s) {[m
[31m-		  case '-':[m
[31m-			esign = 1;[m
[31m-			/* no break */[m
[31m-		  case '+':[m
[31m-			s++;[m
[31m-		  }[m
[31m-		if ((n = hexdig[*s]) == 0 || n > 0x19) {[m
[31m-			s = s1;[m
[31m-			break;[m
[31m-			}[m
[31m-		e1 = n - 0x10;[m
[31m-		while((n = hexdig[*++s]) !=0 && n <= 0x19) {[m
[31m-			if (e1 & 0xf8000000)[m
[31m-				big = 1;[m
[31m-			e1 = 10*e1 + n - 0x10;[m
[31m-			}[m
[31m-		if (esign)[m
[31m-			e1 = -e1;[m
[31m-		e += e1;[m
[31m-	  }[m
[31m-	*sp = (char*)s;[m
[31m-	if (!havedig)[m
[31m-		*sp = (char*)s0 - 1;[m
[31m-	if (zret)[m
[31m-		goto retz1;[m
[31m-	if (big) {[m
[31m-		if (esign) {[m
[31m-#ifdef IEEE_Arith[m
[31m-			switch(rounding) {[m
[31m-			  case Round_up:[m
[31m-				if (sign)[m
[31m-					break;[m
[31m-				goto ret_tiny;[m
[31m-			  case Round_down:[m
[31m-				if (!sign)[m
[31m-					break;[m
[31m-				goto ret_tiny;[m
[31m-			  }[m
[31m-#endif[m
[31m-			goto retz;[m
[31m-#ifdef IEEE_Arith[m
[31m- ret_tiny:[m
[31m-#ifndef NO_ERRNO[m
[31m-			errno = ERANGE;[m
[31m-#endif[m
[31m-			word0(rvp) = 0;[m
[31m-			word1(rvp) = 1;[m
[31m-			return;[m
[31m-#endif /* IEEE_Arith */[m
[31m-			}[m
[31m-		switch(rounding) {[m
[31m-		  case Round_near:[m
[31m-			goto ovfl1;[m
[31m-		  case Round_up:[m
[31m-			if (!sign)[m
[31m-				goto ovfl1;[m
[31m-			goto ret_big;[m
[31m-		  case Round_down:[m
[31m-			if (sign)[m
[31m-				goto ovfl1;[m
[31m-			goto ret_big;[m
[31m-		  }[m
[31m- ret_big:[m
[31m-		word0(rvp) = Big0;[m
[31m-		word1(rvp) = Big1;[m
[31m-		return;[m
[31m-		}[m
[31m-	n = s1 - s0 - 1;[m
[31m-	for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1)[m
[31m-		k++;[m
[31m-	b = Balloc(k);[m
[31m-	x = b->x;[m
[31m-	n = 0;[m
[31m-	L = 0;[m
[31m-#ifdef USE_LOCALE[m
[31m-	for(i = 0; decimalpoint[i+1]; ++i);[m
[31m-#endif[m
[31m-	while(s1 > s0) {[m
[31m-#ifdef USE_LOCALE[m
[31m-		if (*--s1 == decimalpoint[i]) {[m
[31m-			s1 -= i;[m
[31m-			continue;[m
[31m-			}[m
[31m-#else[m
[31m-		if (*--s1 == '.')[m
[31m-			continue;[m
[31m-#endif[m
[31m-		if (n == ULbits) {[m
[31m-			*x++ = L;[m
[31m-			L = 0;[m
[31m-			n = 0;[m
[31m-			}[m
[31m-		L |= (hexdig[*s1] & 0x0f) << n;[m
[31m-		n += 4;[m
[31m-		}[m
[31m-	*x++ = L;[m
[31m-	b->wds = n = x - b->x;[m
[31m-	n = ULbits*n - hi0bits(L);[m
[31m-	nbits = Nbits;[m
[31m-	lostbits = 0;[m
[31m-	x = b->x;[m
[31m-	if (n > nbits) {[m
[31m-		n -= nbits;[m
[31m-		if (any_on(b,n)) {[m
[31m-			lostbits = 1;[m
[31m-			k = n - 1;[m
[31m-			if (x[k>>kshift] & 1 << (k & kmask)) {[m
[31m-				lostbits = 2;[m
[31m-				if (k > 0 && any_on(b,k))[m
[31m-					lostbits = 3;[m
[31m-				}[m
[31m-			}[m
[31m-		rshift(b, n);[m
[31m-		e += n;[m
[31m-		}[m
[31m-	else if (n < nbits) {[m
[31m-		n = nbits - n;[m
[31m-		b = lshift(b, n);[m
[31m-		e -= n;[m
[31m-		x = b->x;[m
[31m-		}[m
[31m-	if (e > Emax) {[m
[31m- ovfl:[m
[31m-		Bfree(b);[m
[31m- ovfl1:[m
[31m-#ifndef NO_ERRNO[m
[31m-		errno = ERANGE;[m
[31m-#endif[m
[31m-		word0(rvp) = Exp_mask;[m
[31m-		word1(rvp) = 0;[m
[31m-		return;[m
[31m-		}[m
[31m-	denorm = 0;[m
[31m-	if (e < emin) {[m
[31m-		denorm = 1;[m
[31m-		n = emin - e;[m
[31m-		if (n >= nbits) {[m
[31m-#ifdef IEEE_Arith /*{*/[m
[31m-			switch (rounding) {[m
[31m-			  case Round_near:[m
[31m-				if (n == nbits && (n < 2 || any_on(b,n-1)))[m
[31m-					goto ret_tiny;[m
[31m-				break;[m
[31m-			  case Round_up:[m
[31m-				if (!sign)[m
[31m-					goto ret_tiny;[m
[31m-				break;[m
[31m-			  case Round_down:[m
[31m-				if (sign)[m
[31m-					goto ret_tiny;[m
[31m-			  }[m
[31m-#endif /* } IEEE_Arith */[m
[31m-			Bfree(b);[m
[31m- retz:[m
[31m-#ifndef NO_ERRNO[m
[31m-			errno = ERANGE;[m
[31m-#endif[m
[31m- retz1:[m
[31m-			rvp->d = 0.;[m
[31m-			return;[m
[31m-			}[m
[31m-		k = n - 1;[m
[31m-		if (lostbits)[m
[31m-			lostbits = 1;[m
[31m-		else if (k > 0)[m
[31m-			lostbits = any_on(b,k);[m
[31m-		if (x[k>>kshift] & 1 << (k & kmask))[m
[31m-			lostbits |= 2;[m
[31m-		nbits -= n;[m
[31m-		rshift(b,n);[m
[31m-		e = emin;[m
[31m-		}[m
[31m-	if (lostbits) {[m
[31m-		up = 0;[m
[31m-		switch(rounding) {[m
[31m-		  case Round_zero:[m
[31m-			break;[m
[31m-		  case Round_near:[m
[31m-			if (lostbits & 2[m
[31m-			 && (lostbits & 1) | (x[0] & 1))[m
[31m-				up = 1;[m
[31m-			break;[m
[31m-		  case Round_up:[m
[31m-			up = 1 - sign;[m
[31m-			break;[m
[31m-		  case Round_down:[m
[31m-			up = sign;[m
[31m-		  }[m
[31m-		if (up) {[m
[31m-			k = b->wds;[m
[31m-			b = increment(b);[m
[31m-			x = b->x;[m
[31m-			if (denorm) {[m
[31m-#if 0[m
[31m-				if (nbits == Nbits - 1[m
[31m-				 && x[nbits >> kshift] & 1 << (nbits & kmask))[m
[31m-					denorm = 0; /* not currently used */[m
[31m-#endif[m
[31m-				}[m
[31m-			else if (b->wds > k[m
[31m-			 || ((n = nbits & kmask) !=0[m
[31m-			     && hi0bits(x[k-1]) < 32-n)) {[m
[31m-				rshift(b,1);[m
[31m-				if (++e > Emax)[m
[31m-					goto ovfl;[m
[31m-				}[m
[31m-			}[m
[31m-		}[m
[31m-#ifdef IEEE_Arith[m
[31m-	if (denorm)[m
[31m-		word0(rvp) = b->wds > 1 ? b->x[1] & ~0x100000 : 0;[m
[31m-	else[m
[31m-		word0(rvp) = (b->x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20);[m
[31m-	word1(rvp) = b->x[0];[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-	if ((j = e & 3)) {[m
[31m-		k = b->x[0] & ((1 << j) - 1);[m
[31m-		rshift(b,j);[m
[31m-		if (k) {[m
[31m-			switch(rounding) {[m
[31m-			  case Round_up:[m
[31m-				if (!sign)[m
[31m-					increment(b);[m
[31m-				break;[m
[31m-			  case Round_down:[m
[31m-				if (sign)[m
[31m-					increment(b);[m
[31m-				break;[m
[31m-			  case Round_near:[m
[31m-				j = 1 << (j-1);[m
[31m-				if (k & j && ((k & (j-1)) | lostbits))[m
[31m-					increment(b);[m
[31m-			  }[m
[31m-			}[m
[31m-		}[m
[31m-	e >>= 2;[m
[31m-	word0(rvp) = b->x[1] | ((e + 65 + 13) << 24);[m
[31m-	word1(rvp) = b->x[0];[m
[31m-#endif[m
[31m-#ifdef VAX[m
[31m-	/* The next two lines ignore swap of low- and high-order 2 bytes. */[m
[31m-	/* word0(rvp) = (b->x[1] & ~0x800000) | ((e + 129 + 55) << 23); */[m
[31m-	/* word1(rvp) = b->x[0]; */[m
[31m-	word0(rvp) = ((b->x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->x[1] << 16);[m
[31m-	word1(rvp) = (b->x[0] >> 16) | (b->x[0] << 16);[m
[31m-#endif[m
[31m-	Bfree(b);[m
[31m-	}[m
[31m-#endif /*!NO_HEX_FP}*/[m
[31m-[m
[31m- static int[m
[31m-#ifdef KR_headers[m
[31m-dshift(b, p2) Bigint *b; int p2;[m
[31m-#else[m
[31m-dshift(Bigint *b, int p2)[m
[31m-#endif[m
[31m-{[m
[31m-	int rv = hi0bits(b->x[b->wds-1]) - 4;[m
[31m-	if (p2 > 0)[m
[31m-		rv -= p2;[m
[31m-	return rv & kmask;[m
[31m-	}[m
[31m-[m
[31m- static int[m
[31m-quorem[m
[31m-#ifdef KR_headers[m
[31m-	(b, S) Bigint *b, *S;[m
[31m-#else[m
[31m-	(Bigint *b, Bigint *S)[m
[31m-#endif[m
[31m-{[m
[31m-	int n;[m
[31m-	ULong *bx, *bxe, q, *sx, *sxe;[m
[31m-#ifdef ULLong[m
[31m-	ULLong borrow, carry, y, ys;[m
[31m-#else[m
[31m-	ULong borrow, carry, y, ys;[m
[31m-#ifdef Pack_32[m
[31m-	ULong si, z, zs;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-	n = S->wds;[m
[31m-#ifdef DEBUG[m
[31m-	/*debug*/ if (b->wds > n)[m
[31m-	/*debug*/	Bug("oversize b in quorem");[m
[31m-#endif[m
[31m-	if (b->wds < n)[m
[31m-		return 0;[m
[31m-	sx = S->x;[m
[31m-	sxe = sx + --n;[m
[31m-	bx = b->x;[m
[31m-	bxe = bx + n;[m
[31m-	q = *bxe / (*sxe + 1);	/* ensure q <= true quotient */[m
[31m-#ifdef DEBUG[m
[31m-#ifdef NO_STRTOD_BIGCOMP[m
[31m-	/*debug*/ if (q > 9)[m
[31m-#else[m
[31m-	/* An oversized q is possible when quorem is called from bigcomp and */[m
[31m-	/* the input is near, e.g., twice the smallest denormalized number. */[m
[31m-	/*debug*/ if (q > 15)[m
[31m-#endif[m
[31m-	/*debug*/	Bug("oversized quotient in quorem");[m
[31m-#endif[m
[31m-	if (q) {[m
[31m-		borrow = 0;[m
[31m-		carry = 0;[m
[31m-		do {[m
[31m-#ifdef ULLong[m
[31m-			ys = *sx++ * (ULLong)q + carry;[m
[31m-			carry = ys >> 32;[m
[31m-			y = *bx - (ys & FFFFFFFF) - borrow;[m
[31m-			borrow = y >> 32 & (ULong)1;[m
[31m-			*bx++ = y & FFFFFFFF;[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-			si = *sx++;[m
[31m-			ys = (si & 0xffff) * q + carry;[m
[31m-			zs = (si >> 16) * q + (ys >> 16);[m
[31m-			carry = zs >> 16;[m
[31m-			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;[m
[31m-			borrow = (y & 0x10000) >> 16;[m
[31m-			z = (*bx >> 16) - (zs & 0xffff) - borrow;[m
[31m-			borrow = (z & 0x10000) >> 16;[m
[31m-			Storeinc(bx, z, y);[m
[31m-#else[m
[31m-			ys = *sx++ * q + carry;[m
[31m-			carry = ys >> 16;[m
[31m-			y = *bx - (ys & 0xffff) - borrow;[m
[31m-			borrow = (y & 0x10000) >> 16;[m
[31m-			*bx++ = y & 0xffff;[m
[31m-#endif[m
[31m-#endif[m
[31m-			}[m
[31m-			while(sx <= sxe);[m
[31m-		if (!*bxe) {[m
[31m-			bx = b->x;[m
[31m-			while(--bxe > bx && !*bxe)[m
[31m-				--n;[m
[31m-			b->wds = n;[m
[31m-			}[m
[31m-		}[m
[31m-	if (cmp(b, S) >= 0) {[m
[31m-		q++;[m
[31m-		borrow = 0;[m
[31m-		carry = 0;[m
[31m-		bx = b->x;[m
[31m-		sx = S->x;[m
[31m-		do {[m
[31m-#ifdef ULLong[m
[31m-			ys = *sx++ + carry;[m
[31m-			carry = ys >> 32;[m
[31m-			y = *bx - (ys & FFFFFFFF) - borrow;[m
[31m-			borrow = y >> 32 & (ULong)1;[m
[31m-			*bx++ = y & FFFFFFFF;[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-			si = *sx++;[m
[31m-			ys = (si & 0xffff) + carry;[m
[31m-			zs = (si >> 16) + (ys >> 16);[m
[31m-			carry = zs >> 16;[m
[31m-			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;[m
[31m-			borrow = (y & 0x10000) >> 16;[m
[31m-			z = (*bx >> 16) - (zs & 0xffff) - borrow;[m
[31m-			borrow = (z & 0x10000) >> 16;[m
[31m-			Storeinc(bx, z, y);[m
[31m-#else[m
[31m-			ys = *sx++ + carry;[m
[31m-			carry = ys >> 16;[m
[31m-			y = *bx - (ys & 0xffff) - borrow;[m
[31m-			borrow = (y & 0x10000) >> 16;[m
[31m-			*bx++ = y & 0xffff;[m
[31m-#endif[m
[31m-#endif[m
[31m-			}[m
[31m-			while(sx <= sxe);[m
[31m-		bx = b->x;[m
[31m-		bxe = bx + n;[m
[31m-		if (!*bxe) {[m
[31m-			while(--bxe > bx && !*bxe)[m
[31m-				--n;[m
[31m-			b->wds = n;[m
[31m-			}[m
[31m-		}[m
[31m-	return q;[m
[31m-	}[m
[31m-[m
[31m-#if defined(Avoid_Underflow) || !defined(NO_STRTOD_BIGCOMP) /*{*/[m
[31m- static double[m
[31m-sulp[m
[31m-#ifdef KR_headers[m
[31m-	(x, bc) U *x; BCinfo *bc;[m
[31m-#else[m
[31m-	(U *x, BCinfo *bc)[m
[31m-#endif[m
[31m-{[m
[31m-	U u;[m
[31m-	double rv;[m
[31m-	int i;[m
[31m-[m
[31m-	rv = ulp(x);[m
[31m-	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)[m
[31m-		return rv; /* Is there an example where i <= 0 ? */[m
[31m-	word0(&u) = Exp_1 + (i << Exp_shift);[m
[31m-	word1(&u) = 0;[m
[31m-	return rv * u.d;[m
[31m-	}[m
[31m-#endif /*}*/[m
[31m-[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m- static void[m
[31m-bigcomp[m
[31m-#ifdef KR_headers[m
[31m-	(rv, s0, bc)[m
[31m-	U *rv; CONST char *s0; BCinfo *bc;[m
[31m-#else[m
[31m-	(U *rv, const char *s0, BCinfo *bc)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b, *d;[m
[31m-	int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase;[m
[31m-[m
[31m-	dsign = bc->dsign;[m
[31m-	nd = bc->nd;[m
[31m-	nd0 = bc->nd0;[m
[31m-	p5 = nd + bc->e0 - 1;[m
[31m-	speccase = 0;[m
[31m-#ifndef Sudden_Underflow[m
[31m-	if (rv->d == 0.) {	/* special case: value near underflow-to-zero */[m
[31m-				/* threshold was rounded to zero */[m
[31m-		b = i2b(1);[m
[31m-		p2 = Emin - P + 1;[m
[31m-		bbits = 1;[m
[31m-#ifdef Avoid_Underflow[m
[31m-		word0(rv) = (P+2) << Exp_shift;[m
[31m-#else[m
[31m-		word1(rv) = 1;[m
[31m-#endif[m
[31m-		i = 0;[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-		if (bc->rounding == 1)[m
[31m-#endif[m
[31m-			{[m
[31m-			speccase = 1;[m
[31m-			--p2;[m
[31m-			dsign = 0;[m
[31m-			goto have_i;[m
[31m-			}[m
[31m-		}[m
[31m-	else[m
[31m-#endif[m
[31m-		b = d2b(rv, &p2, &bbits);[m
[31m-#ifdef Avoid_Underflow[m
[31m-	p2 -= bc->scale;[m
[31m-#endif[m
[31m-	/* floor(log2(rv)) == bbits - 1 + p2 */[m
[31m-	/* Check for denormal case. */[m
[31m-	i = P - bbits;[m
[31m-	if (i > (j = P - Emin - 1 + p2)) {[m
[31m-#ifdef Sudden_Underflow[m
[31m-		Bfree(b);[m
[31m-		b = i2b(1);[m
[31m-		p2 = Emin;[m
[31m-		i = P - 1;[m
[31m-#ifdef Avoid_Underflow[m
[31m-		word0(rv) = (1 + bc->scale) << Exp_shift;[m
[31m-#else[m
[31m-		word0(rv) = Exp_msk1;[m
[31m-#endif[m
[31m-		word1(rv) = 0;[m
[31m-#else[m
[31m-		i = j;[m
[31m-#endif[m
[31m-		}[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (bc->rounding != 1) {[m
[31m-		if (i > 0)[m
[31m-			b = lshift(b, i);[m
[31m-		if (dsign)[m
[31m-			b = increment(b);[m
[31m-		}[m
[31m-	else[m
[31m-#endif[m
[31m-		{[m
[31m-		b = lshift(b, ++i);[m
[31m-		b->x[0] |= 1;[m
[31m-		}[m
[31m-#ifndef Sudden_Underflow[m
[31m- have_i:[m
[31m-#endif[m
[31m-	p2 -= p5 + i;[m
[31m-	d = i2b(1);[m
[31m-	/* Arrange for convenient computation of quotients:[m
[31m-	 * shift left if necessary so divisor has 4 leading 0 bits.[m
[31m-	 */[m
[31m-	if (p5 > 0)[m
[31m-		d = pow5mult(d, p5);[m
[31m-	else if (p5 < 0)[m
[31m-		b = pow5mult(b, -p5);[m
[31m-	if (p2 > 0) {[m
[31m-		b2 = p2;[m
[31m-		d2 = 0;[m
[31m-		}[m
[31m-	else {[m
[31m-		b2 = 0;[m
[31m-		d2 = -p2;[m
[31m-		}[m
[31m-	i = dshift(d, d2);[m
[31m-	if ((b2 += i) > 0)[m
[31m-		b = lshift(b, b2);[m
[31m-	if ((d2 += i) > 0)[m
[31m-		d = lshift(d, d2);[m
[31m-[m
[31m-	/* Now b/d = exactly half-way between the two floating-point values */[m
[31m-	/* on either side of the input string.  Compute first digit of b/d. */[m
[31m-[m
[31m-	if (!(dig = quorem(b,d))) {[m
[31m-		b = multadd(b, 10, 0);	/* very unlikely */[m
[31m-		dig = quorem(b,d);[m
[31m-		}[m
[31m-[m
[31m-	/* Compare b/d with s0 */[m
[31m-[m
[31m-	for(i = 0; i < nd0; ) {[m
[31m-		if ((dd = s0[i++] - '0' - dig))[m
[31m-			goto ret;[m
[31m-		if (!b->x[0] && b->wds == 1) {[m
[31m-			if (i < nd)[m
[31m-				dd = 1;[m
[31m-			goto ret;[m
[31m-			}[m
[31m-		b = multadd(b, 10, 0);[m
[31m-		dig = quorem(b,d);[m
[31m-		}[m
[31m-	for(j = bc->dp1; i++ < nd;) {[m
[31m-		if ((dd = s0[j++] - '0' - dig))[m
[31m-			goto ret;[m
[31m-		if (!b->x[0] && b->wds == 1) {[m
[31m-			if (i < nd)[m
[31m-				dd = 1;[m
[31m-			goto ret;[m
[31m-			}[m
[31m-		b = multadd(b, 10, 0);[m
[31m-		dig = quorem(b,d);[m
[31m-		}[m
[31m-	if (b->x[0] || b->wds > 1)[m
[31m-		dd = -1;[m
[31m- ret:[m
[31m-	Bfree(b);[m
[31m-	Bfree(d);[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (bc->rounding != 1) {[m
[31m-		if (dd < 0) {[m
[31m-			if (bc->rounding == 0) {[m
[31m-				if (!dsign)[m
[31m-					goto retlow1;[m
[31m-				}[m
[31m-			else if (dsign)[m
[31m-				goto rethi1;[m
[31m-			}[m
[31m-		else if (dd > 0) {[m
[31m-			if (bc->rounding == 0) {[m
[31m-				if (dsign)[m
[31m-					goto rethi1;[m
[31m-				goto ret1;[m
[31m-				}[m
[31m-			if (!dsign)[m
[31m-				goto rethi1;[m
[31m-			dval(rv) += 2.*sulp(rv,bc);[m
[31m-			}[m
[31m-		else {[m
[31m-			bc->inexact = 0;[m
[31m-			if (dsign)[m
[31m-				goto rethi1;[m
[31m-			}[m
[31m-		}[m
[31m-	else[m
[31m-#endif[m
[31m-	if (speccase) {[m
[31m-		if (dd <= 0)[m
[31m-			rv->d = 0.;[m
[31m-		}[m
[31m-	else if (dd < 0) {[m
[31m-		if (!dsign)	/* does not happen for round-near */[m
[31m-retlow1:[m
[31m-			dval(rv) -= sulp(rv,bc);[m
[31m-		}[m
[31m-	else if (dd > 0) {[m
[31m-		if (dsign) {[m
[31m- rethi1:[m
[31m-			dval(rv) += sulp(rv,bc);[m
[31m-			}[m
[31m-		}[m
[31m-	else {[m
[31m-		/* Exact half-way case:  apply round-even rule. */[m
[31m-		if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) {[m
[31m-			i = 1 - j;[m
[31m-			if (i <= 31) {[m
[31m-				if (word1(rv) & (0x1 << i))[m
[31m-					goto odd;[m
[31m-				}[m
[31m-			else if (word0(rv) & (0x1 << (i-32)))[m
[31m-				goto odd;[m
[31m-			}[m
[31m-		else if (word1(rv) & 1) {[m
[31m- odd:[m
[31m-			if (dsign)[m
[31m-				goto rethi1;[m
[31m-			goto retlow1;[m
[31m-			}[m
[31m-		}[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m- ret1:[m
[31m-#endif[m
[31m-	return;[m
[31m-	}[m
[31m-#endif /* NO_STRTOD_BIGCOMP */[m
[31m-[m
[31m- double[m
[31m-fpconv_strtod[m
[31m-#ifdef KR_headers[m
[31m-	(s00, se) CONST char *s00; char **se;[m
[31m-#else[m
[31m-	(const char *s00, char **se)[m
[31m-#endif[m
[31m-{[m
[31m-	int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;[m
[31m-	int esign, i, j, k, nd, nd0, nf, nz, nz0, nz1, sign;[m
[31m-	CONST char *s, *s0, *s1;[m
[31m-	double aadj, aadj1;[m
[31m-	Long L;[m
[31m-	U aadj2, adj, rv, rv0;[m
[31m-	ULong y, z;[m
[31m-	BCinfo bc;[m
[31m-	Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;[m
[31m-#ifdef Avoid_Underflow[m
[31m-	ULong Lsb, Lsb1;[m
[31m-#endif[m
[31m-#ifdef SET_INEXACT[m
[31m-	int oldinexact;[m
[31m-#endif[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m-	int req_bigcomp = 0;[m
[31m-#endif[m
[31m-#ifdef Honor_FLT_ROUNDS /*{*/[m
[31m-#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */[m
[31m-	bc.rounding = Flt_Rounds;[m
[31m-#else /*}{*/[m
[31m-	bc.rounding = 1;[m
[31m-	switch(fegetround()) {[m
[31m-	  case FE_TOWARDZERO:	bc.rounding = 0; break;[m
[31m-	  case FE_UPWARD:	bc.rounding = 2; break;[m
[31m-	  case FE_DOWNWARD:	bc.rounding = 3;[m
[31m-	  }[m
[31m-#endif /*}}*/[m
[31m-#endif /*}*/[m
[31m-#ifdef USE_LOCALE[m
[31m-	CONST char *s2;[m
[31m-#endif[m
[31m-[m
[31m-	sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0;[m
[31m-	dval(&rv) = 0.;[m
[31m-	for(s = s00;;s++) switch(*s) {[m
[31m-		case '-':[m
[31m-			sign = 1;[m
[31m-			/* no break */[m
[31m-		case '+':[m
[31m-			if (*++s)[m
[31m-				goto break2;[m
[31m-			/* no break */[m
[31m-		case 0:[m
[31m-			goto ret0;[m
[31m-		case '\t':[m
[31m-		case '\n':[m
[31m-		case '\v':[m
[31m-		case '\f':[m
[31m-		case '\r':[m
[31m-		case ' ':[m
[31m-			continue;[m
[31m-		default:[m
[31m-			goto break2;[m
[31m-		}[m
[31m- break2:[m
[31m-	if (*s == '0') {[m
[31m-#ifndef NO_HEX_FP /*{*/[m
[31m-		switch(s[1]) {[m
[31m-		  case 'x':[m
[31m-		  case 'X':[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-			gethex(&s, &rv, bc.rounding, sign);[m
[31m-#else[m
[31m-			gethex(&s, &rv, 1, sign);[m
[31m-#endif[m
[31m-			goto ret;[m
[31m-		  }[m
[31m-#endif /*}*/[m
[31m-		nz0 = 1;[m
[31m-		while(*++s == '0') ;[m
[31m-		if (!*s)[m
[31m-			goto ret;[m
[31m-		}[m
[31m-	s0 = s;[m
[31m-	y = z = 0;[m
[31m-	for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)[m
[31m-		if (nd < 9)[m
[31m-			y = 10*y + c - '0';[m
[31m-		else if (nd < 16)[m
[31m-			z = 10*z + c - '0';[m
[31m-	nd0 = nd;[m
[31m-	bc.dp0 = bc.dp1 = s - s0;[m
[31m-	for(s1 = s; s1 > s0 && *--s1 == '0'; )[m
[31m-		++nz1;[m
[31m-#ifdef USE_LOCALE[m
[31m-	s1 = localeconv()->decimal_point;[m
[31m-	if (c == *s1) {[m
[31m-		c = '.';[m
[31m-		if (*++s1) {[m
[31m-			s2 = s;[m
[31m-			for(;;) {[m
[31m-				if (*++s2 != *s1) {[m
[31m-					c = 0;[m
[31m-					break;[m
[31m-					}[m
[31m-				if (!*++s1) {[m
[31m-					s = s2;[m
[31m-					break;[m
[31m-					}[m
[31m-				}[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m-	if (c == '.') {[m
[31m-		c = *++s;[m
[31m-		bc.dp1 = s - s0;[m
[31m-		bc.dplen = bc.dp1 - bc.dp0;[m
[31m-		if (!nd) {[m
[31m-			for(; c == '0'; c = *++s)[m
[31m-				nz++;[m
[31m-			if (c > '0' && c <= '9') {[m
[31m-				bc.dp0 = s0 - s;[m
[31m-				bc.dp1 = bc.dp0 + bc.dplen;[m
[31m-				s0 = s;[m
[31m-				nf += nz;[m
[31m-				nz = 0;[m
[31m-				goto have_dig;[m
[31m-				}[m
[31m-			goto dig_done;[m
[31m-			}[m
[31m-		for(; c >= '0' && c <= '9'; c = *++s) {[m
[31m- have_dig:[m
[31m-			nz++;[m
[31m-			if (c -= '0') {[m
[31m-				nf += nz;[m
[31m-				for(i = 1; i < nz; i++)[m
[31m-					if (nd++ < 9)[m
[31m-						y *= 10;[m
[31m-					else if (nd <= DBL_DIG + 1)[m
[31m-						z *= 10;[m
[31m-				if (nd++ < 9)[m
[31m-					y = 10*y + c;[m
[31m-				else if (nd <= DBL_DIG + 1)[m
[31m-					z = 10*z + c;[m
[31m-				nz = nz1 = 0;[m
[31m-				}[m
[31m-			}[m
[31m-		}[m
[31m- dig_done:[m
[31m-	e = 0;[m
[31m-	if (c == 'e' || c == 'E') {[m
[31m-		if (!nd && !nz && !nz0) {[m
[31m-			goto ret0;[m
[31m-			}[m
[31m-		s00 = s;[m
[31m-		esign = 0;[m
[31m-		switch(c = *++s) {[m
[31m-			case '-':[m
[31m-				esign = 1;[m
[31m-			case '+':[m
[31m-				c = *++s;[m
[31m-			}[m
[31m-		if (c >= '0' && c <= '9') {[m
[31m-			while(c == '0')[m
[31m-				c = *++s;[m
[31m-			if (c > '0' && c <= '9') {[m
[31m-				L = c - '0';[m
[31m-				s1 = s;[m
[31m-				while((c = *++s) >= '0' && c <= '9')[m
[31m-					L = 10*L + c - '0';[m
[31m-				if (s - s1 > 8 || L > 19999)[m
[31m-					/* Avoid confusion from exponents[m
[31m-					 * so large that e might overflow.[m
[31m-					 */[m
[31m-					e = 19999; /* safe for 16 bit ints */[m
[31m-				else[m
[31m-					e = (int)L;[m
[31m-				if (esign)[m
[31m-					e = -e;[m
[31m-				}[m
[31m-			else[m
[31m-				e = 0;[m
[31m-			}[m
[31m-		else[m
[31m-			s = s00;[m
[31m-		}[m
[31m-	if (!nd) {[m
[31m-		if (!nz && !nz0) {[m
[31m-#ifdef INFNAN_CHECK[m
[31m-			/* Check for Nan and Infinity */[m
[31m-			if (!bc.dplen)[m
[31m-			 switch(c) {[m
[31m-			  case 'i':[m
[31m-			  case 'I':[m
[31m-				if (match(&s,"nf")) {[m
[31m-					--s;[m
[31m-					if (!match(&s,"inity"))[m
[31m-						++s;[m
[31m-					word0(&rv) = 0x7ff00000;[m
[31m-					word1(&rv) = 0;[m
[31m-					goto ret;[m
[31m-					}[m
[31m-				break;[m
[31m-			  case 'n':[m
[31m-			  case 'N':[m
[31m-				if (match(&s, "an")) {[m
[31m-					word0(&rv) = NAN_WORD0;[m
[31m-					word1(&rv) = NAN_WORD1;[m
[31m-#ifndef No_Hex_NaN[m
[31m-					if (*s == '(') /*)*/[m
[31m-						hexnan(&rv, &s);[m
[31m-#endif[m
[31m-					goto ret;[m
[31m-					}[m
[31m-			  }[m
[31m-#endif /* INFNAN_CHECK */[m
[31m- ret0:[m
[31m-			s = s00;[m
[31m-			sign = 0;[m
[31m-			}[m
[31m-		goto ret;[m
[31m-		}[m
[31m-	bc.e0 = e1 = e -= nf;[m
[31m-[m
[31m-	/* Now we have nd0 digits, starting at s0, followed by a[m
[31m-	 * decimal point, followed by nd-nd0 digits.  The number we're[m
[31m-	 * after is the integer represented by those digits times[m
[31m-	 * 10**e */[m
[31m-[m
[31m-	if (!nd0)[m
[31m-		nd0 = nd;[m
[31m-	k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;[m
[31m-	dval(&rv) = y;[m
[31m-	if (k > 9) {[m
[31m-#ifdef SET_INEXACT[m
[31m-		if (k > DBL_DIG)[m
[31m-			oldinexact = get_inexact();[m
[31m-#endif[m
[31m-		dval(&rv) = tens[k - 9] * dval(&rv) + z;[m
[31m-		}[m
[31m-	bd0 = 0;[m
[31m-	if (nd <= DBL_DIG[m
[31m-#ifndef RND_PRODQUOT[m
[31m-#ifndef Honor_FLT_ROUNDS[m
[31m-		&& Flt_Rounds == 1[m
[31m-#endif[m
[31m-#endif[m
[31m-			) {[m
[31m-		if (!e)[m
[31m-			goto ret;[m
[31m-#ifndef ROUND_BIASED_without_Round_Up[m
[31m-		if (e > 0) {[m
[31m-			if (e <= Ten_pmax) {[m
[31m-#ifdef VAX[m
[31m-				goto vax_ovfl_check;[m
[31m-#else[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				/* round correctly FLT_ROUNDS = 2 or 3 */[m
[31m-				if (sign) {[m
[31m-					rv.d = -rv.d;[m
[31m-					sign = 0;[m
[31m-					}[m
[31m-#endif[m
[31m-				/* rv = */ rounded_product(dval(&rv), tens[e]);[m
[31m-				goto ret;[m
[31m-#endif[m
[31m-				}[m
[31m-			i = DBL_DIG - nd;[m
[31m-			if (e <= Ten_pmax + i) {[m
[31m-				/* A fancier test would sometimes let us do[m
[31m-				 * this for larger i values.[m
[31m-				 */[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				/* round correctly FLT_ROUNDS = 2 or 3 */[m
[31m-				if (sign) {[m
[31m-					rv.d = -rv.d;[m
[31m-					sign = 0;[m
[31m-					}[m
[31m-#endif[m
[31m-				e -= i;[m
[31m-				dval(&rv) *= tens[i];[m
[31m-#ifdef VAX[m
[31m-				/* VAX exponent range is so narrow we must[m
[31m-				 * worry about overflow here...[m
[31m-				 */[m
[31m- vax_ovfl_check:[m
[31m-				word0(&rv) -= P*Exp_msk1;[m
[31m-				/* rv = */ rounded_product(dval(&rv), tens[e]);[m
[31m-				if ((word0(&rv) & Exp_mask)[m
[31m-				 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))[m
[31m-					goto ovfl;[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-#else[m
[31m-				/* rv = */ rounded_product(dval(&rv), tens[e]);[m
[31m-#endif[m
[31m-				goto ret;[m
[31m-				}[m
[31m-			}[m
[31m-#ifndef Inaccurate_Divide[m
[31m-		else if (e >= -Ten_pmax) {[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-			/* round correctly FLT_ROUNDS = 2 or 3 */[m
[31m-			if (sign) {[m
[31m-				rv.d = -rv.d;[m
[31m-				sign = 0;[m
[31m-				}[m
[31m-#endif[m
[31m-			/* rv = */ rounded_quotient(dval(&rv), tens[-e]);[m
[31m-			goto ret;[m
[31m-			}[m
[31m-#endif[m
[31m-#endif /* ROUND_BIASED_without_Round_Up */[m
[31m-		}[m
[31m-	e1 += nd - k;[m
[31m-[m
[31m-#ifdef IEEE_Arith[m
[31m-#ifdef SET_INEXACT[m
[31m-	bc.inexact = 1;[m
[31m-	if (k <= DBL_DIG)[m
[31m-		oldinexact = get_inexact();[m
[31m-#endif[m
[31m-#ifdef Avoid_Underflow[m
[31m-	bc.scale = 0;[m
[31m-#endif[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (bc.rounding >= 2) {[m
[31m-		if (sign)[m
[31m-			bc.rounding = bc.rounding == 2 ? 0 : 2;[m
[31m-		else[m
[31m-			if (bc.rounding != 2)[m
[31m-				bc.rounding = 0;[m
[31m-		}[m
[31m-#endif[m
[31m-#endif /*IEEE_Arith*/[m
[31m-[m
[31m-	/* Get starting approximation = rv * 10**e1 */[m
[31m-[m
[31m-	if (e1 > 0) {[m
[31m-		if ((i = e1 & 15))[m
[31m-			dval(&rv) *= tens[i];[m
[31m-		if (e1 &= ~15) {[m
[31m-			if (e1 > DBL_MAX_10_EXP) {[m
[31m- ovfl:[m
[31m-				/* Can't trust HUGE_VAL */[m
[31m-#ifdef IEEE_Arith[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				switch(bc.rounding) {[m
[31m-				  case 0: /* toward 0 */[m
[31m-				  case 3: /* toward -infinity */[m
[31m-					word0(&rv) = Big0;[m
[31m-					word1(&rv) = Big1;[m
[31m-					break;[m
[31m-				  default:[m
[31m-					word0(&rv) = Exp_mask;[m
[31m-					word1(&rv) = 0;[m
[31m-				  }[m
[31m-#else /*Honor_FLT_ROUNDS*/[m
[31m-				word0(&rv) = Exp_mask;[m
[31m-				word1(&rv) = 0;[m
[31m-#endif /*Honor_FLT_ROUNDS*/[m
[31m-#ifdef SET_INEXACT[m
[31m-				/* set overflow bit */[m
[31m-				dval(&rv0) = 1e300;[m
[31m-				dval(&rv0) *= dval(&rv0);[m
[31m-#endif[m
[31m-#else /*IEEE_Arith*/[m
[31m-				word0(&rv) = Big0;[m
[31m-				word1(&rv) = Big1;[m
[31m-#endif /*IEEE_Arith*/[m
[31m- range_err:[m
[31m-				if (bd0) {[m
[31m-					Bfree(bb);[m
[31m-					Bfree(bd);[m
[31m-					Bfree(bs);[m
[31m-					Bfree(bd0);[m
[31m-					Bfree(delta);[m
[31m-					}[m
[31m-#ifndef NO_ERRNO[m
[31m-				errno = ERANGE;[m
[31m-#endif[m
[31m-				goto ret;[m
[31m-				}[m
[31m-			e1 >>= 4;[m
[31m-			for(j = 0; e1 > 1; j++, e1 >>= 1)[m
[31m-				if (e1 & 1)[m
[31m-					dval(&rv) *= bigtens[j];[m
[31m-		/* The last multiplication could overflow. */[m
[31m-			word0(&rv) -= P*Exp_msk1;[m
[31m-			dval(&rv) *= bigtens[j];[m
[31m-			if ((z = word0(&rv) & Exp_mask)[m
[31m-			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))[m
[31m-				goto ovfl;[m
[31m-			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {[m
[31m-				/* set to largest number */[m
[31m-				/* (Can't trust DBL_MAX) */[m
[31m-				word0(&rv) = Big0;[m
[31m-				word1(&rv) = Big1;[m
[31m-				}[m
[31m-			else[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-			}[m
[31m-		}[m
[31m-	else if (e1 < 0) {[m
[31m-		e1 = -e1;[m
[31m-		if ((i = e1 & 15))[m
[31m-			dval(&rv) /= tens[i];[m
[31m-		if (e1 >>= 4) {[m
[31m-			if (e1 >= 1 << n_bigtens)[m
[31m-				goto undfl;[m
[31m-#ifdef Avoid_Underflow[m
[31m-			if (e1 & Scale_Bit)[m
[31m-				bc.scale = 2*P;[m
[31m-			for(j = 0; e1 > 0; j++, e1 >>= 1)[m
[31m-				if (e1 & 1)[m
[31m-					dval(&rv) *= tinytens[j];[m
[31m-			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)[m
[31m-						>> Exp_shift)) > 0) {[m
[31m-				/* scaled rv is denormal; clear j low bits */[m
[31m-				if (j >= 32) {[m
[31m-					if (j > 54)[m
[31m-						goto undfl;[m
[31m-					word1(&rv) = 0;[m
[31m-					if (j >= 53)[m
[31m-					 word0(&rv) = (P+2)*Exp_msk1;[m
[31m-					else[m
[31m-					 word0(&rv) &= 0xffffffff << (j-32);[m
[31m-					}[m
[31m-				else[m
[31m-					word1(&rv) &= 0xffffffff << j;[m
[31m-				}[m
[31m-#else[m
[31m-			for(j = 0; e1 > 1; j++, e1 >>= 1)[m
[31m-				if (e1 & 1)[m
[31m-					dval(&rv) *= tinytens[j];[m
[31m-			/* The last multiplication could underflow. */[m
[31m-			dval(&rv0) = dval(&rv);[m
[31m-			dval(&rv) *= tinytens[j];[m
[31m-			if (!dval(&rv)) {[m
[31m-				dval(&rv) = 2.*dval(&rv0);[m
[31m-				dval(&rv) *= tinytens[j];[m
[31m-#endif[m
[31m-				if (!dval(&rv)) {[m
[31m- undfl:[m
[31m-					dval(&rv) = 0.;[m
[31m-					goto range_err;[m
[31m-					}[m
[31m-#ifndef Avoid_Underflow[m
[31m-				word0(&rv) = Tiny0;[m
[31m-				word1(&rv) = Tiny1;[m
[31m-				/* The refinement below will clean[m
[31m-				 * this approximation up.[m
[31m-				 */[m
[31m-				}[m
[31m-#endif[m
[31m-			}[m
[31m-		}[m
[31m-[m
[31m-	/* Now the hard part -- adjusting rv to the correct value.*/[m
[31m-[m
[31m-	/* Put digits into bd: true value = bd * 10^e */[m
[31m-[m
[31m-	bc.nd = nd - nz1;[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m-	bc.nd0 = nd0;	/* Only needed if nd > strtod_diglim, but done here */[m
[31m-			/* to silence an erroneous warning about bc.nd0 */[m
[31m-			/* possibly not being initialized. */[m
[31m-	if (nd > strtod_diglim) {[m
[31m-		/* ASSERT(strtod_diglim >= 18); 18 == one more than the */[m
[31m-		/* minimum number of decimal digits to distinguish double values */[m
[31m-		/* in IEEE arithmetic. */[m
[31m-		i = j = 18;[m
[31m-		if (i > nd0)[m
[31m-			j += bc.dplen;[m
[31m-		for(;;) {[m
[31m-			if (--j < bc.dp1 && j >= bc.dp0)[m
[31m-				j = bc.dp0 - 1;[m
[31m-			if (s0[j] != '0')[m
[31m-				break;[m
[31m-			--i;[m
[31m-			}[m
[31m-		e += nd - i;[m
[31m-		nd = i;[m
[31m-		if (nd0 > nd)[m
[31m-			nd0 = nd;[m
[31m-		if (nd < 9) { /* must recompute y */[m
[31m-			y = 0;[m
[31m-			for(i = 0; i < nd0; ++i)[m
[31m-				y = 10*y + s0[i] - '0';[m
[31m-			for(j = bc.dp1; i < nd; ++i)[m
[31m-				y = 10*y + s0[j++] - '0';[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m-	bd0 = s2b(s0, nd0, nd, y, bc.dplen);[m
[31m-[m
[31m-	for(;;) {[m
[31m-		bd = Balloc(bd0->k);[m
[31m-		Bcopy(bd, bd0);[m
[31m-		bb = d2b(&rv, &bbe, &bbbits);	/* rv = bb * 2^bbe */[m
[31m-		bs = i2b(1);[m
[31m-[m
[31m-		if (e >= 0) {[m
[31m-			bb2 = bb5 = 0;[m
[31m-			bd2 = bd5 = e;[m
[31m-			}[m
[31m-		else {[m
[31m-			bb2 = bb5 = -e;[m
[31m-			bd2 = bd5 = 0;[m
[31m-			}[m
[31m-		if (bbe >= 0)[m
[31m-			bb2 += bbe;[m
[31m-		else[m
[31m-			bd2 -= bbe;[m
[31m-		bs2 = bb2;[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-		if (bc.rounding != 1)[m
[31m-			bs2++;[m
[31m-#endif[m
[31m-#ifdef Avoid_Underflow[m
[31m-		Lsb = LSB;[m
[31m-		Lsb1 = 0;[m
[31m-		j = bbe - bc.scale;[m
[31m-		i = j + bbbits - 1;	/* logb(rv) */[m
[31m-		j = P + 1 - bbbits;[m
[31m-		if (i < Emin) {	/* denormal */[m
[31m-			i = Emin - i;[m
[31m-			j -= i;[m
[31m-			if (i < 32)[m
[31m-				Lsb <<= i;[m
[31m-			else if (i < 52)[m
[31m-				Lsb1 = Lsb << (i-32);[m
[31m-			else[m
[31m-				Lsb1 = Exp_mask;[m
[31m-			}[m
[31m-#else /*Avoid_Underflow*/[m
[31m-#ifdef Sudden_Underflow[m
[31m-#ifdef IBM[m
[31m-		j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);[m
[31m-#else[m
[31m-		j = P + 1 - bbbits;[m
[31m-#endif[m
[31m-#else /*Sudden_Underflow*/[m
[31m-		j = bbe;[m
[31m-		i = j + bbbits - 1;	/* logb(rv) */[m
[31m-		if (i < Emin)	/* denormal */[m
[31m-			j += P - Emin;[m
[31m-		else[m
[31m-			j = P + 1 - bbbits;[m
[31m-#endif /*Sudden_Underflow*/[m
[31m-#endif /*Avoid_Underflow*/[m
[31m-		bb2 += j;[m
[31m-		bd2 += j;[m
[31m-#ifdef Avoid_Underflow[m
[31m-		bd2 += bc.scale;[m
[31m-#endif[m
[31m-		i = bb2 < bd2 ? bb2 : bd2;[m
[31m-		if (i > bs2)[m
[31m-			i = bs2;[m
[31m-		if (i > 0) {[m
[31m-			bb2 -= i;[m
[31m-			bd2 -= i;[m
[31m-			bs2 -= i;[m
[31m-			}[m
[31m-		if (bb5 > 0) {[m
[31m-			bs = pow5mult(bs, bb5);[m
[31m-			bb1 = mult(bs, bb);[m
[31m-			Bfree(bb);[m
[31m-			bb = bb1;[m
[31m-			}[m
[31m-		if (bb2 > 0)[m
[31m-			bb = lshift(bb, bb2);[m
[31m-		if (bd5 > 0)[m
[31m-			bd = pow5mult(bd, bd5);[m
[31m-		if (bd2 > 0)[m
[31m-			bd = lshift(bd, bd2);[m
[31m-		if (bs2 > 0)[m
[31m-			bs = lshift(bs, bs2);[m
[31m-		delta = diff(bb, bd);[m
[31m-		bc.dsign = delta->sign;[m
[31m-		delta->sign = 0;[m
[31m-		i = cmp(delta, bs);[m
[31m-#ifndef NO_STRTOD_BIGCOMP /*{*/[m
[31m-		if (bc.nd > nd && i <= 0) {[m
[31m-			if (bc.dsign) {[m
[31m-				/* Must use bigcomp(). */[m
[31m-				req_bigcomp = 1;[m
[31m-				break;[m
[31m-				}[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-			if (bc.rounding != 1) {[m
[31m-				if (i < 0) {[m
[31m-					req_bigcomp = 1;[m
[31m-					break;[m
[31m-					}[m
[31m-				}[m
[31m-			else[m
[31m-#endif[m
[31m-				i = -1;	/* Discarded digits make delta smaller. */[m
[31m-			}[m
[31m-#endif /*}*/[m
[31m-#ifdef Honor_FLT_ROUNDS /*{*/[m
[31m-		if (bc.rounding != 1) {[m
[31m-			if (i < 0) {[m
[31m-				/* Error is less than an ulp */[m
[31m-				if (!delta->x[0] && delta->wds <= 1) {[m
[31m-					/* exact */[m
[31m-#ifdef SET_INEXACT[m
[31m-					bc.inexact = 0;[m
[31m-#endif[m
[31m-					break;[m
[31m-					}[m
[31m-				if (bc.rounding) {[m
[31m-					if (bc.dsign) {[m
[31m-						adj.d = 1.;[m
[31m-						goto apply_adj;[m
[31m-						}[m
[31m-					}[m
[31m-				else if (!bc.dsign) {[m
[31m-					adj.d = -1.;[m
[31m-					if (!word1(&rv)[m
[31m-					 && !(word0(&rv) & Frac_mask)) {[m
[31m-						y = word0(&rv) & Exp_mask;[m
[31m-#ifdef Avoid_Underflow[m
[31m-						if (!bc.scale || y > 2*P*Exp_msk1)[m
[31m-#else[m
[31m-						if (y)[m
[31m-#endif[m
[31m-						  {[m
[31m-						  delta = lshift(delta,Log2P);[m
[31m-						  if (cmp(delta, bs) <= 0)[m
[31m-							adj.d = -0.5;[m
[31m-						  }[m
[31m-						}[m
[31m- apply_adj:[m
[31m-#ifdef Avoid_Underflow /*{*/[m
[31m-					if (bc.scale && (y = word0(&rv) & Exp_mask)[m
[31m-						<= 2*P*Exp_msk1)[m
[31m-					  word0(&adj) += (2*P+1)*Exp_msk1 - y;[m
[31m-#else[m
[31m-#ifdef Sudden_Underflow[m
[31m-					if ((word0(&rv) & Exp_mask) <=[m
[31m-							P*Exp_msk1) {[m
[31m-						word0(&rv) += P*Exp_msk1;[m
[31m-						dval(&rv) += adj.d*ulp(dval(&rv));[m
[31m-						word0(&rv) -= P*Exp_msk1;[m
[31m-						}[m
[31m-					else[m
[31m-#endif /*Sudden_Underflow*/[m
[31m-#endif /*Avoid_Underflow}*/[m
[31m-					dval(&rv) += adj.d*ulp(&rv);[m
[31m-					}[m
[31m-				break;[m
[31m-				}[m
[31m-			adj.d = ratio(delta, bs);[m
[31m-			if (adj.d < 1.)[m
[31m-				adj.d = 1.;[m
[31m-			if (adj.d <= 0x7ffffffe) {[m
[31m-				/* adj = rounding ? ceil(adj) : floor(adj); */[m
[31m-				y = adj.d;[m
[31m-				if (y != adj.d) {[m
[31m-					if (!((bc.rounding>>1) ^ bc.dsign))[m
[31m-						y++;[m
[31m-					adj.d = y;[m
[31m-					}[m
[31m-				}[m
[31m-#ifdef Avoid_Underflow /*{*/[m
[31m-			if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)[m
[31m-				word0(&adj) += (2*P+1)*Exp_msk1 - y;[m
[31m-#else[m
[31m-#ifdef Sudden_Underflow[m
[31m-			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-				adj.d *= ulp(dval(&rv));[m
[31m-				if (bc.dsign)[m
[31m-					dval(&rv) += adj.d;[m
[31m-				else[m
[31m-					dval(&rv) -= adj.d;[m
[31m-				word0(&rv) -= P*Exp_msk1;[m
[31m-				goto cont;[m
[31m-				}[m
[31m-#endif /*Sudden_Underflow*/[m
[31m-#endif /*Avoid_Underflow}*/[m
[31m-			adj.d *= ulp(&rv);[m
[31m-			if (bc.dsign) {[m
[31m-				if (word0(&rv) == Big0 && word1(&rv) == Big1)[m
[31m-					goto ovfl;[m
[31m-				dval(&rv) += adj.d;[m
[31m-				}[m
[31m-			else[m
[31m-				dval(&rv) -= adj.d;[m
[31m-			goto cont;[m
[31m-			}[m
[31m-#endif /*}Honor_FLT_ROUNDS*/[m
[31m-[m
[31m-		if (i < 0) {[m
[31m-			/* Error is less than half an ulp -- check for[m
[31m-			 * special case of mantissa a power of two.[m
[31m-			 */[m
[31m-			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask[m
[31m-#ifdef IEEE_Arith /*{*/[m
[31m-#ifdef Avoid_Underflow[m
[31m-			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1[m
[31m-#else[m
[31m-			 || (word0(&rv) & Exp_mask) <= Exp_msk1[m
[31m-#endif[m
[31m-#endif /*}*/[m
[31m-				) {[m
[31m-#ifdef SET_INEXACT[m
[31m-				if (!delta->x[0] && delta->wds <= 1)[m
[31m-					bc.inexact = 0;[m
[31m-#endif[m
[31m-				break;[m
[31m-				}[m
[31m-			if (!delta->x[0] && delta->wds <= 1) {[m
[31m-				/* exact result */[m
[31m-#ifdef SET_INEXACT[m
[31m-				bc.inexact = 0;[m
[31m-#endif[m
[31m-				break;[m
[31m-				}[m
[31m-			delta = lshift(delta,Log2P);[m
[31m-			if (cmp(delta, bs) > 0)[m
[31m-				goto drop_down;[m
[31m-			break;[m
[31m-			}[m
[31m-		if (i == 0) {[m
[31m-			/* exactly half-way between */[m
[31m-			if (bc.dsign) {[m
[31m-				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1[m
[31m-				 &&  word1(&rv) == ([m
[31m-#ifdef Avoid_Underflow[m
[31m-			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)[m
[31m-		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :[m
[31m-#endif[m
[31m-						   0xffffffff)) {[m
[31m-					/*boundary case -- increment exponent*/[m
[31m-					if (word0(&rv) == Big0 && word1(&rv) == Big1)[m
[31m-						goto ovfl;[m
[31m-					word0(&rv) = (word0(&rv) & Exp_mask)[m
[31m-						+ Exp_msk1[m
[31m-#ifdef IBM[m
[31m-						| Exp_msk1 >> 4[m
[31m-#endif[m
[31m-						;[m
[31m-					word1(&rv) = 0;[m
[31m-#ifdef Avoid_Underflow[m
[31m-					bc.dsign = 0;[m
[31m-#endif[m
[31m-					break;[m
[31m-					}[m
[31m-				}[m
[31m-			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {[m
[31m- drop_down:[m
[31m-				/* boundary case -- decrement exponent */[m
[31m-#ifdef Sudden_Underflow /*{{*/[m
[31m-				L = word0(&rv) & Exp_mask;[m
[31m-#ifdef IBM[m
[31m-				if (L <  Exp_msk1)[m
[31m-#else[m
[31m-#ifdef Avoid_Underflow[m
[31m-				if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1))[m
[31m-#else[m
[31m-				if (L <= Exp_msk1)[m
[31m-#endif /*Avoid_Underflow*/[m
[31m-#endif /*IBM*/[m
[31m-					{[m
[31m-					if (bc.nd >nd) {[m
[31m-						bc.uflchk = 1;[m
[31m-						break;[m
[31m-						}[m
[31m-					goto undfl;[m
[31m-					}[m
[31m-				L -= Exp_msk1;[m
[31m-#else /*Sudden_Underflow}{*/[m
[31m-#ifdef Avoid_Underflow[m
[31m-				if (bc.scale) {[m
[31m-					L = word0(&rv) & Exp_mask;[m
[31m-					if (L <= (2*P+1)*Exp_msk1) {[m
[31m-						if (L > (P+2)*Exp_msk1)[m
[31m-							/* round even ==> */[m
[31m-							/* accept rv */[m
[31m-							break;[m
[31m-						/* rv = smallest denormal */[m
[31m-						if (bc.nd >nd) {[m
[31m-							bc.uflchk = 1;[m
[31m-							break;[m
[31m-							}[m
[31m-						goto undfl;[m
[31m-						}[m
[31m-					}[m
[31m-#endif /*Avoid_Underflow*/[m
[31m-				L = (word0(&rv) & Exp_mask) - Exp_msk1;[m
[31m-#endif /*Sudden_Underflow}}*/[m
[31m-				word0(&rv) = L | Bndry_mask1;[m
[31m-				word1(&rv) = 0xffffffff;[m
[31m-#ifdef IBM[m
[31m-				goto cont;[m
[31m-#else[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m-				if (bc.nd > nd)[m
[31m-					goto cont;[m
[31m-#endif[m
[31m-				break;[m
[31m-#endif[m
[31m-				}[m
[31m-#ifndef ROUND_BIASED[m
[31m-#ifdef Avoid_Underflow[m
[31m-			if (Lsb1) {[m
[31m-				if (!(word0(&rv) & Lsb1))[m
[31m-					break;[m
[31m-				}[m
[31m-			else if (!(word1(&rv) & Lsb))[m
[31m-				break;[m
[31m-#else[m
[31m-			if (!(word1(&rv) & LSB))[m
[31m-				break;[m
[31m-#endif[m
[31m-#endif[m
[31m-			if (bc.dsign)[m
[31m-#ifdef Avoid_Underflow[m
[31m-				dval(&rv) += sulp(&rv, &bc);[m
[31m-#else[m
[31m-				dval(&rv) += ulp(&rv);[m
[31m-#endif[m
[31m-#ifndef ROUND_BIASED[m
[31m-			else {[m
[31m-#ifdef Avoid_Underflow[m
[31m-				dval(&rv) -= sulp(&rv, &bc);[m
[31m-#else[m
[31m-				dval(&rv) -= ulp(&rv);[m
[31m-#endif[m
[31m-#ifndef Sudden_Underflow[m
[31m-				if (!dval(&rv)) {[m
[31m-					if (bc.nd >nd) {[m
[31m-						bc.uflchk = 1;[m
[31m-						break;[m
[31m-						}[m
[31m-					goto undfl;[m
[31m-					}[m
[31m-#endif[m
[31m-				}[m
[31m-#ifdef Avoid_Underflow[m
[31m-			bc.dsign = 1 - bc.dsign;[m
[31m-#endif[m
[31m-#endif[m
[31m-			break;[m
[31m-			}[m
[31m-		if ((aadj = ratio(delta, bs)) <= 2.) {[m
[31m-			if (bc.dsign)[m
[31m-				aadj = aadj1 = 1.;[m
[31m-			else if (word1(&rv) || word0(&rv) & Bndry_mask) {[m
[31m-#ifndef Sudden_Underflow[m
[31m-				if (word1(&rv) == Tiny1 && !word0(&rv)) {[m
[31m-					if (bc.nd >nd) {[m
[31m-						bc.uflchk = 1;[m
[31m-						break;[m
[31m-						}[m
[31m-					goto undfl;[m
[31m-					}[m
[31m-#endif[m
[31m-				aadj = 1.;[m
[31m-				aadj1 = -1.;[m
[31m-				}[m
[31m-			else {[m
[31m-				/* special case -- power of FLT_RADIX to be */[m
[31m-				/* rounded down... */[m
[31m-[m
[31m-				if (aadj < 2./FLT_RADIX)[m
[31m-					aadj = 1./FLT_RADIX;[m
[31m-				else[m
[31m-					aadj *= 0.5;[m
[31m-				aadj1 = -aadj;[m
[31m-				}[m
[31m-			}[m
[31m-		else {[m
[31m-			aadj *= 0.5;[m
[31m-			aadj1 = bc.dsign ? aadj : -aadj;[m
[31m-#ifdef Check_FLT_ROUNDS[m
[31m-			switch(bc.rounding) {[m
[31m-				case 2: /* towards +infinity */[m
[31m-					aadj1 -= 0.5;[m
[31m-					break;[m
[31m-				case 0: /* towards 0 */[m
[31m-				case 3: /* towards -infinity */[m
[31m-					aadj1 += 0.5;[m
[31m-				}[m
[31m-#else[m
[31m-			if (Flt_Rounds == 0)[m
[31m-				aadj1 += 0.5;[m
[31m-#endif /*Check_FLT_ROUNDS*/[m
[31m-			}[m
[31m-		y = word0(&rv) & Exp_mask;[m
[31m-[m
[31m-		/* Check for overflow */[m
[31m-[m
[31m-		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {[m
[31m-			dval(&rv0) = dval(&rv);[m
[31m-			word0(&rv) -= P*Exp_msk1;[m
[31m-			adj.d = aadj1 * ulp(&rv);[m
[31m-			dval(&rv) += adj.d;[m
[31m-			if ((word0(&rv) & Exp_mask) >=[m
[31m-					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {[m
[31m-				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)[m
[31m-					goto ovfl;[m
[31m-				word0(&rv) = Big0;[m
[31m-				word1(&rv) = Big1;[m
[31m-				goto cont;[m
[31m-				}[m
[31m-			else[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-			}[m
[31m-		else {[m
[31m-#ifdef Avoid_Underflow[m
[31m-			if (bc.scale && y <= 2*P*Exp_msk1) {[m
[31m-				if (aadj <= 0x7fffffff) {[m
[31m-					if ((z = aadj) <= 0)[m
[31m-						z = 1;[m
[31m-					aadj = z;[m
[31m-					aadj1 = bc.dsign ? aadj : -aadj;[m
[31m-					}[m
[31m-				dval(&aadj2) = aadj1;[m
[31m-				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;[m
[31m-				aadj1 = dval(&aadj2);[m
[31m-				adj.d = aadj1 * ulp(&rv);[m
[31m-				dval(&rv) += adj.d;[m
[31m-				if (rv.d == 0.)[m
[31m-#ifdef NO_STRTOD_BIGCOMP[m
[31m-					goto undfl;[m
[31m-#else[m
[31m-					{[m
[31m-					if (bc.nd > nd)[m
[31m-						bc.dsign = 1;[m
[31m-					break;[m
[31m-					}[m
[31m-#endif[m
[31m-				}[m
[31m-			else {[m
[31m-				adj.d = aadj1 * ulp(&rv);[m
[31m-				dval(&rv) += adj.d;[m
[31m-				}[m
[31m-#else[m
[31m-#ifdef Sudden_Underflow[m
[31m-			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {[m
[31m-				dval(&rv0) = dval(&rv);[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-				adj.d = aadj1 * ulp(&rv);[m
[31m-				dval(&rv) += adj.d;[m
[31m-#ifdef IBM[m
[31m-				if ((word0(&rv) & Exp_mask) <  P*Exp_msk1)[m
[31m-#else[m
[31m-				if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)[m
[31m-#endif[m
[31m-					{[m
[31m-					if (word0(&rv0) == Tiny0[m
[31m-					 && word1(&rv0) == Tiny1) {[m
[31m-						if (bc.nd >nd) {[m
[31m-							bc.uflchk = 1;[m
[31m-							break;[m
[31m-							}[m
[31m-						goto undfl;[m
[31m-						}[m
[31m-					word0(&rv) = Tiny0;[m
[31m-					word1(&rv) = Tiny1;[m
[31m-					goto cont;[m
[31m-					}[m
[31m-				else[m
[31m-					word0(&rv) -= P*Exp_msk1;[m
[31m-				}[m
[31m-			else {[m
[31m-				adj.d = aadj1 * ulp(&rv);[m
[31m-				dval(&rv) += adj.d;[m
[31m-				}[m
[31m-#else /*Sudden_Underflow*/[m
[31m-			/* Compute adj so that the IEEE rounding rules will[m
[31m-			 * correctly round rv + adj in some half-way cases.[m
[31m-			 * If rv * ulp(rv) is denormalized (i.e.,[m
[31m-			 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid[m
[31m-			 * trouble from bits lost to denormalization;[m
[31m-			 * example: 1.2e-307 .[m
[31m-			 */[m
[31m-			if (y <= (P-1)*Exp_msk1 && aadj > 1.) {[m
[31m-				aadj1 = (double)(int)(aadj + 0.5);[m
[31m-				if (!bc.dsign)[m
[31m-					aadj1 = -aadj1;[m
[31m-				}[m
[31m-			adj.d = aadj1 * ulp(&rv);[m
[31m-			dval(&rv) += adj.d;[m
[31m-#endif /*Sudden_Underflow*/[m
[31m-#endif /*Avoid_Underflow*/[m
[31m-			}[m
[31m-		z = word0(&rv) & Exp_mask;[m
[31m-#ifndef SET_INEXACT[m
[31m-		if (bc.nd == nd) {[m
[31m-#ifdef Avoid_Underflow[m
[31m-		if (!bc.scale)[m
[31m-#endif[m
[31m-		if (y == z) {[m
[31m-			/* Can we stop now? */[m
[31m-			L = (Long)aadj;[m
[31m-			aadj -= L;[m
[31m-			/* The tolerances below are conservative. */[m
[31m-			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {[m
[31m-				if (aadj < .4999999 || aadj > .5000001)[m
[31m-					break;[m
[31m-				}[m
[31m-			else if (aadj < .4999999/FLT_RADIX)[m
[31m-				break;[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m- cont:[m
[31m-		Bfree(bb);[m
[31m-		Bfree(bd);[m
[31m-		Bfree(bs);[m
[31m-		Bfree(delta);[m
[31m-		}[m
[31m-	Bfree(bb);[m
[31m-	Bfree(bd);[m
[31m-	Bfree(bs);[m
[31m-	Bfree(bd0);[m
[31m-	Bfree(delta);[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m-	if (req_bigcomp) {[m
[31m-		bd0 = 0;[m
[31m-		bc.e0 += nz1;[m
[31m-		bigcomp(&rv, s0, &bc);[m
[31m-		y = word0(&rv) & Exp_mask;[m
[31m-		if (y == Exp_mask)[m
[31m-			goto ovfl;[m
[31m-		if (y == 0 && rv.d == 0.)[m
[31m-			goto undfl;[m
[31m-		}[m
[31m-#endif[m
[31m-#ifdef SET_INEXACT[m
[31m-	if (bc.inexact) {[m
[31m-		if (!oldinexact) {[m
[31m-			word0(&rv0) = Exp_1 + (70 << Exp_shift);[m
[31m-			word1(&rv0) = 0;[m
[31m-			dval(&rv0) += 1.;[m
[31m-			}[m
[31m-		}[m
[31m-	else if (!oldinexact)[m
[31m-		clear_inexact();[m
[31m-#endif[m
[31m-#ifdef Avoid_Underflow[m
[31m-	if (bc.scale) {[m
[31m-		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;[m
[31m-		word1(&rv0) = 0;[m
[31m-		dval(&rv) *= dval(&rv0);[m
[31m-#ifndef NO_ERRNO[m
[31m-		/* try to avoid the bug of testing an 8087 register value */[m
[31m-#ifdef IEEE_Arith[m
[31m-		if (!(word0(&rv) & Exp_mask))[m
[31m-#else[m
[31m-		if (word0(&rv) == 0 && word1(&rv) == 0)[m
[31m-#endif[m
[31m-			errno = ERANGE;[m
[31m-#endif[m
[31m-		}[m
[31m-#endif /* Avoid_Underflow */[m
[31m-#ifdef SET_INEXACT[m
[31m-	if (bc.inexact && !(word0(&rv) & Exp_mask)) {[m
[31m-		/* set underflow bit */[m
[31m-		dval(&rv0) = 1e-300;[m
[31m-		dval(&rv0) *= dval(&rv0);[m
[31m-		}[m
[31m-#endif[m
[31m- ret:[m
[31m-	if (se)[m
[31m-		*se = (char *)s;[m
[31m-	return sign ? -dval(&rv) : dval(&rv);[m
[31m-	}[m
[31m-[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m- static char *dtoa_result;[m
[31m-#endif[m
[31m-[m
[31m- static char *[m
[31m-#ifdef KR_headers[m
[31m-rv_alloc(i) int i;[m
[31m-#else[m
[31m-rv_alloc(int i)[m
[31m-#endif[m
[31m-{[m
[31m-	int j, k, *r;[m
[31m-[m
[31m-	j = sizeof(ULong);[m
[31m-	for(k = 0;[m
[31m-		sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i;[m
[31m-		j <<= 1)[m
[31m-			k++;[m
[31m-	r = (int*)Balloc(k);[m
[31m-	*r = k;[m
[31m-	return[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m-	dtoa_result =[m
[31m-#endif[m
[31m-		(char *)(r+1);[m
[31m-	}[m
[31m-[m
[31m- static char *[m
[31m-#ifdef KR_headers[m
[31m-nrv_alloc(s, rve, n) char *s, **rve; int n;[m
[31m-#else[m
[31m-nrv_alloc(const char *s, char **rve, int n)[m
[31m-#endif[m
[31m-{[m
[31m-	char *rv, *t;[m
[31m-[m
[31m-	t = rv = rv_alloc(n);[m
[31m-	while((*t = *s++)) t++;[m
[31m-	if (rve)[m
[31m-		*rve = t;[m
[31m-	return rv;[m
[31m-	}[m
[31m-[m
[31m-/* freedtoa(s) must be used to free values s returned by dtoa[m
[31m- * when MULTIPLE_THREADS is #defined.  It should be used in all cases,[m
[31m- * but for consistency with earlier versions of dtoa, it is optional[m
[31m- * when MULTIPLE_THREADS is not defined.[m
[31m- */[m
[31m-[m
[31m- void[m
[31m-#ifdef KR_headers[m
[31m-freedtoa(s) char *s;[m
[31m-#else[m
[31m-freedtoa(char *s)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b = (Bigint *)((int *)s - 1);[m
[31m-	b->maxwds = 1 << (b->k = *(int*)b);[m
[31m-	Bfree(b);[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m-	if (s == dtoa_result)[m
[31m-		dtoa_result = 0;[m
[31m-#endif[m
[31m-	}[m
[31m-[m
[31m-/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.[m
[31m- *[m
[31m- * Inspired by "How to Print Floating-Point Numbers Accurately" by[m
[31m- * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].[m
[31m- *[m
[31m- * Modifications:[m
[31m- *	1. Rather than iterating, we use a simple numeric overestimate[m
[31m- *	   to determine k = floor(log10(d)).  We scale relevant[m
[31m- *	   quantities using O(log2(k)) rather than O(k) multiplications.[m
[31m- *	2. For some modes > 2 (corresponding to ecvt and fcvt), we don't[m
[31m- *	   try to generate digits strictly left to right.  Instead, we[m
[31m- *	   compute with fewer bits and propagate the carry if necessary[m
[31m- *	   when rounding the final digit up.  This is often faster.[m
[31m- *	3. Under the assumption that input will be rounded nearest,[m
[31m- *	   mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.[m
[31m- *	   That is, we allow equality in stopping tests when the[m
[31m- *	   round-nearest rule will give the same floating-point value[m
[31m- *	   as would satisfaction of the stopping test with strict[m
[31m- *	   inequality.[m
[31m- *	4. We remove common factors of powers of 2 from relevant[m
[31m- *	   quantities.[m
[31m- *	5. When converting floating-point integers less than 1e16,[m
[31m- *	   we use floating-point arithmetic rather than resorting[m
[31m- *	   to multiple-precision integers.[m
[31m- *	6. When asked to produce fewer than 15 digits, we first try[m
[31m- *	   to get by with floating-point arithmetic; we resort to[m
[31m- *	   multiple-precision integer arithmetic only if we cannot[m
[31m- *	   guarantee that the floating-point calculation has given[m
[31m- *	   the correctly rounded result.  For k requested digits and[m
[31m- *	   "uniformly" distributed input, the probability is[m
[31m- *	   something like 10^(k-15) that we must resort to the Long[m
[31m- *	   calculation.[m
[31m- */[m
[31m-[m
[31m- char *[m
[31m-dtoa[m
[31m-#ifdef KR_headers[m
[31m-	(dd, mode, ndigits, decpt, sign, rve)[m
[31m-	double dd; int mode, ndigits, *decpt, *sign; char **rve;[m
[31m-#else[m
[31m-	(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)[m
[31m-#endif[m
[31m-{[m
[31m- /*	Arguments ndigits, decpt, sign are similar to those[m
[31m-	of ecvt and fcvt; trailing zeros are suppressed from[m
[31m-	the returned string.  If not null, *rve is set to point[m
[31m-	to the end of the return value.  If d is +-Infinity or NaN,[m
[31m-	then *decpt is set to 9999.[m
[31m-[m
[31m-	mode:[m
[31m-		0 ==> shortest string that yields d when read in[m
[31m-			and rounded to nearest.[m
[31m-		1 ==> like 0, but with Steele & White stopping rule;[m
[31m-			e.g. with IEEE P754 arithmetic , mode 0 gives[m
[31m-			1e23 whereas mode 1 gives 9.999999999999999e22.[m
[31m-		2 ==> max(1,ndigits) significant digits.  This gives a[m
[31m-			return value similar to that of ecvt, except[m
[31m-			that trailing zeros are suppressed.[m
[31m-		3 ==> through ndigits past the decimal point.  This[m
[31m-			gives a return value similar to that from fcvt,[m
[31m-			except that trailing zeros are suppressed, and[m
[31m-			ndigits can be negative.[m
[31m-		4,5 ==> similar to 2 and 3, respectively, but (in[m
[31m-			round-nearest mode) with the tests of mode 0 to[m
[31m-			possibly return a shorter string that rounds to d.[m
[31m-			With IEEE arithmetic and compilation with[m
[31m-			-DHonor_FLT_ROUNDS, modes 4 and 5 behave the same[m
[31m-			as modes 2 and 3 when FLT_ROUNDS != 1.[m
[31m-		6-9 ==> Debugging modes similar to mode - 4:  don't try[m
[31m-			fast floating-point estimate (if applicable).[m
[31m-[m
[31m-		Values of mode other than 0-9 are treated as mode 0.[m
[31m-[m
[31m-		Sufficient space is allocated to the return value[m
[31m-		to hold the suppressed trailing zeros.[m
[31m-	*/[m
[31m-[m
[31m-	int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,[m
[31m-		j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,[m
[31m-		spec_case, try_quick;[m
[31m-	Long L;[m
[31m-#ifndef Sudden_Underflow[m
[31m-	int denorm;[m
[31m-	ULong x;[m
[31m-#endif[m
[31m-	Bigint *b, *b1, *delta, *mlo, *mhi, *S;[m
[31m-	U d2, eps, u;[m
[31m-	double ds;[m
[31m-	char *s, *s0;[m
[31m-#ifndef No_leftright[m
[31m-#ifdef IEEE_Arith[m
[31m-	U eps1;[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef SET_INEXACT[m
[31m-	int inexact, oldinexact;[m
[31m-#endif[m
[31m-#ifdef Honor_FLT_ROUNDS /*{*/[m
[31m-	int Rounding;[m
[31m-#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */[m
[31m-	Rounding = Flt_Rounds;[m
[31m-#else /*}{*/[m
[31m-	Rounding = 1;[m
[31m-	switch(fegetround()) {[m
[31m-	  case FE_TOWARDZERO:	Rounding = 0; break;[m
[31m-	  case FE_UPWARD:	Rounding = 2; break;[m
[31m-	  case FE_DOWNWARD:	Rounding = 3;[m
[31m-	  }[m
[31m-#endif /*}}*/[m
[31m-#endif /*}*/[m
[31m-[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m-	if (dtoa_result) {[m
[31m-		freedtoa(dtoa_result);[m
[31m-		dtoa_result = 0;[m
[31m-		}[m
[31m-#endif[m
[31m-[m
[31m-	u.d = dd;[m
[31m-	if (word0(&u) & Sign_bit) {[m
[31m-		/* set sign for everything, including 0's and NaNs */[m
[31m-		*sign = 1;[m
[31m-		word0(&u) &= ~Sign_bit;	/* clear sign bit */[m
[31m-		}[m
[31m-	else[m
[31m-		*sign = 0;[m
[31m-[m
[31m-#if defined(IEEE_Arith) + defined(VAX)[m
[31m-#ifdef IEEE_Arith[m
[31m-	if ((word0(&u) & Exp_mask) == Exp_mask)[m
[31m-#else[m
[31m-	if (word0(&u)  == 0x8000)[m
[31m-#endif[m
[31m-		{[m
[31m-		/* Infinity or NaN */[m
[31m-		*decpt = 9999;[m
[31m-#ifdef IEEE_Arith[m
[31m-		if (!word1(&u) && !(word0(&u) & 0xfffff))[m
[31m-			return nrv_alloc("Infinity", rve, 8);[m
[31m-#endif[m
[31m-		return nrv_alloc("NaN", rve, 3);[m
[31m-		}[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-	dval(&u) += 0; /* normalize */[m
[31m-#endif[m
[31m-	if (!dval(&u)) {[m
[31m-		*decpt = 1;[m
[31m-		return nrv_alloc("0", rve, 1);[m
[31m-		}[m
[31m-[m
[31m-#ifdef SET_INEXACT[m
[31m-	try_quick = oldinexact = get_inexact();[m
[31m-	inexact = 1;[m
[31m-#endif[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (Rounding >= 2) {[m
[31m-		if (*sign)[m
[31m-			Rounding = Rounding == 2 ? 0 : 2;[m
[31m-		else[m
[31m-			if (Rounding != 2)[m
[31m-				Rounding = 0;[m
[31m-		}[m
[31m-#endif[m
[31m-[m
[31m-	b = d2b(&u, &be, &bbits);[m
[31m-#ifdef Sudden_Underflow[m
[31m-	i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));[m
[31m-#else[m
[31m-	if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {[m
[31m-#endif[m
[31m-		dval(&d2) = dval(&u);[m
[31m-		word0(&d2) &= Frac_mask1;[m
[31m-		word0(&d2) |= Exp_11;[m
[31m-#ifdef IBM[m
[31m-		if (j = 11 - hi0bits(word0(&d2) & Frac_mask))[m
[31m-			dval(&d2) /= 1 << j;[m
[31m-#endif[m
[31m-[m
[31m-		/* log(x)	~=~ log(1.5) + (x-1.5)/1.5[m
[31m-		 * log10(x)	 =  log(x) / log(10)[m
[31m-		 *		~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))[m
[31m-		 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)[m
[31m-		 *[m
[31m-		 * This suggests computing an approximation k to log10(d) by[m
[31m-		 *[m
[31m-		 * k = (i - Bias)*0.301029995663981[m
[31m-		 *	+ ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );[m
[31m-		 *[m
[31m-		 * We want k to be too large rather than too small.[m
[31m-		 * The error in the first-order Taylor series approximation[m
[31m-		 * is in our favor, so we just round up the constant enough[m
[31m-		 * to compensate for any error in the multiplication of[m
[31m-		 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,[m
[31m-		 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,[m
[31m-		 * adding 1e-13 to the constant term more than suffices.[m
[31m-		 * Hence we adjust the constant term to 0.1760912590558.[m
[31m-		 * (We could get a more accurate k by invoking log10,[m
[31m-		 *  but this is probably not worthwhile.)[m
[31m-		 */[m
[31m-[m
[31m-		i -= Bias;[m
[31m-#ifdef IBM[m
[31m-		i <<= 2;[m
[31m-		i += j;[m
[31m-#endif[m
[31m-#ifndef Sudden_Underflow[m
[31m-		denorm = 0;[m
[31m-		}[m
[31m-	else {[m
[31m-		/* d is denormalized */[m
[31m-[m
[31m-		i = bbits + be + (Bias + (P-1) - 1);[m
[31m-		x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)[m
[31m-			    : word1(&u) << (32 - i);[m
[31m-		dval(&d2) = x;[m
[31m-		word0(&d2) -= 31*Exp_msk1; /* adjust exponent */[m
[31m-		i -= (Bias + (P-1) - 1) + 1;[m
[31m-		denorm = 1;[m
[31m-		}[m
[31m-#endif[m
[31m-	ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;[m
[31m-	k = (int)ds;[m
[31m-	if (ds < 0. && ds != k)[m
[31m-		k--;	/* want k = floor(ds) */[m
[31m-	k_check = 1;[m
[31m-	if (k >= 0 && k <= Ten_pmax) {[m
[31m-		if (dval(&u) < tens[k])[m
[31m-			k--;[m
[31m-		k_check = 0;[m
[31m-		}[m
[31m-	j = bbits - i - 1;[m
[31m-	if (j >= 0) {[m
[31m-		b2 = 0;[m
[31m-		s2 = j;[m
[31m-		}[m
[31m-	else {[m
[31m-		b2 = -j;[m
[31m-		s2 = 0;[m
[31m-		}[m
[31m-	if (k >= 0) {[m
[31m-		b5 = 0;[m
[31m-		s5 = k;[m
[31m-		s2 += k;[m
[31m-		}[m
[31m-	else {[m
[31m-		b2 -= k;[m
[31m-		b5 = -k;[m
[31m-		s5 = 0;[m
[31m-		}[m
[31m-	if (mode < 0 || mode > 9)[m
[31m-		mode = 0;[m
[31m-[m
[31m-#ifndef SET_INEXACT[m
[31m-#ifdef Check_FLT_ROUNDS[m
[31m-	try_quick = Rounding == 1;[m
[31m-#else[m
[31m-	try_quick = 1;[m
[31m-#endif[m
[31m-#endif /*SET_INEXACT*/[m
[31m-[m
[31m-	if (mode > 5) {[m
[31m-		mode -= 4;[m
[31m-		try_quick = 0;[m
[31m-		}[m
[31m-	leftright = 1;[m
[31m-	ilim = ilim1 = -1;	/* Values for cases 0 and 1; done here to */[m
[31m-				/* silence erroneous "gcc -Wall" warning. */[m
[31m-	switch(mode) {[m
[31m-		case 0:[m
[31m-		case 1:[m
[31m-			i = 18;[m
[31m-			ndigits = 0;[m
[31m-			break;[m
[31m-		case 2:[m
[31m-			leftright = 0;[m
[31m-			/* no break */[m
[31m-		case 4:[m
[31m-			if (ndigits <= 0)[m
[31m-				ndigits = 1;[m
[31m-			ilim = ilim1 = i = ndigits;[m
[31m-			break;[m
[31m-		case 3:[m
[31m-			leftright = 0;[m
[31m-			/* no break */[m
[31m-		case 5:[m
[31m-			i = ndigits + k + 1;[m
[31m-			ilim = i;[m
[31m-			ilim1 = i - 1;[m
[31m-			if (i <= 0)[m
[31m-				i = 1;[m
[31m-		}[m
[31m-	s = s0 = rv_alloc(i);[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (mode > 1 && Rounding != 1)[m
[31m-		leftright = 0;[m
[31m-#endif[m
[31m-[m
[31m-	if (ilim >= 0 && ilim <= Quick_max && try_quick) {[m
[31m-[m
[31m-		/* Try to get by with floating-point arithmetic. */[m
[31m-[m
[31m-		i = 0;[m
[31m-		dval(&d2) = dval(&u);[m
[31m-		k0 = k;[m
[31m-		ilim0 = ilim;[m
[31m-		ieps = 2; /* conservative */[m
[31m-		if (k > 0) {[m
[31m-			ds = tens[k&0xf];[m
[31m-			j = k >> 4;[m
[31m-			if (j & Bletch) {[m
[31m-				/* prevent overflows */[m
[31m-				j &= Bletch - 1;[m
[31m-				dval(&u) /= bigtens[n_bigtens-1];[m
[31m-				ieps++;[m
[31m-				}[m
[31m-			for(; j; j >>= 1, i++)[m
[31m-				if (j & 1) {[m
[31m-					ieps++;[m
[31m-					ds *= bigtens[i];[m
[31m-					}[m
[31m-			dval(&u) /= ds;[m
[31m-			}[m
[31m-		else if ((j1 = -k)) {[m
[31m-			dval(&u) *= tens[j1 & 0xf];[m
[31m-			for(j = j1 >> 4; j; j >>= 1, i++)[m
[31m-				if (j & 1) {[m
[31m-					ieps++;[m
[31m-					dval(&u) *= bigtens[i];[m
[31m-					}[m
[31m-			}[m
[31m-		if (k_check && dval(&u) < 1. && ilim > 0) {[m
[31m-			if (ilim1 <= 0)[m
[31m-				goto fast_failed;[m
[31m-			ilim = ilim1;[m
[31m-			k--;[m
[31m-			dval(&u) *= 10.;[m
[31m-			ieps++;[m
[31m-			}[m
[31m-		dval(&eps) = ieps*dval(&u) + 7.;[m
[31m-		word0(&eps) -= (P-1)*Exp_msk1;[m
[31m-		if (ilim == 0) {[m
[31m-			S = mhi = 0;[m
[31m-			dval(&u) -= 5.;[m
[31m-			if (dval(&u) > dval(&eps))[m
[31m-				goto one_digit;[m
[31m-			if (dval(&u) < -dval(&eps))[m
[31m-				goto no_digits;[m
[31m-			goto fast_failed;[m
[31m-			}[m
[31m-#ifndef No_leftright[m
[31m-		if (leftright) {[m
[31m-			/* Use Steele & White method of only[m
[31m-			 * generating digits needed.[m
[31m-			 */[m
[31m-			dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);[m
[31m-#ifdef IEEE_Arith[m
[31m-			if (k0 < 0 && j1 >= 307) {[m
[31m-				eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */[m
[31m-				word0(&eps1) -= Exp_msk1 * (Bias+P-1);[m
[31m-				dval(&eps1) *= tens[j1 & 0xf];[m
[31m-				for(i = 0, j = (j1-256) >> 4; j; j >>= 1, i++)[m
[31m-					if (j & 1)[m
[31m-						dval(&eps1) *= bigtens[i];[m
[31m-				if (eps.d < eps1.d)[m
[31m-					eps.d = eps1.d;[m
[31m-				}[m
[31m-#endif[m
[31m-			for(i = 0;;) {[m
[31m-				L = dval(&u);[m
[31m-				dval(&u) -= L;[m
[31m-				*s++ = '0' + (int)L;[m
[31m-				if (1. - dval(&u) < dval(&eps))[m
[31m-					goto bump_up;[m
[31m-				if (dval(&u) < dval(&eps))[m
[31m-					goto ret1;[m
[31m-				if (++i >= ilim)[m
[31m-					break;[m
[31m-				dval(&eps) *= 10.;[m
[31m-				dval(&u) *= 10.;[m
[31m-				}[m
[31m-			}[m
[31m-		else {[m
[31m-#endif[m
[31m-			/* Generate ilim digits, then fix them up. */[m
[31m-			dval(&eps) *= tens[ilim-1];[m
[31m-			for(i = 1;; i++, dval(&u) *= 10.) {[m
[31m-				L = (Long)(dval(&u));[m
[31m-				if (!(dval(&u) -= L))[m
[31m-					ilim = i;[m
[31m-				*s++ = '0' + (int)L;[m
[31m-				if (i == ilim) {[m
[31m-					if (dval(&u) > 0.5 + dval(&eps))[m
[31m-						goto bump_up;[m
[31m-					else if (dval(&u) < 0.5 - dval(&eps)) {[m
[31m-						while(*--s == '0');[m
[31m-						s++;[m
[31m-						goto ret1;[m
[31m-						}[m
[31m-					break;[m
[31m-					}[m
[31m-				}[m
[31m-#ifndef No_leftright[m
[31m-			}[m
[31m-#endif[m
[31m- fast_failed:[m
[31m-		s = s0;[m
[31m-		dval(&u) = dval(&d2);[m
[31m-		k = k0;[m
[31m-		ilim = ilim0;[m
[31m-		}[m
[31m-[m
[31m-	/* Do we have a "small" integer? */[m
[31m-[m
[31m-	if (be >= 0 && k <= Int_max) {[m
[31m-		/* Yes. */[m
[31m-		ds = tens[k];[m
[31m-		if (ndigits < 0 && ilim <= 0) {[m
[31m-			S = mhi = 0;[m
[31m-			if (ilim < 0 || dval(&u) <= 5*ds)[m
[31m-				goto no_digits;[m
[31m-			goto one_digit;[m
[31m-			}[m
[31m-		for(i = 1;; i++, dval(&u) *= 10.) {[m
[31m-			L = (Long)(dval(&u) / ds);[m
[31m-			dval(&u) -= L*ds;[m
[31m-#ifdef Check_FLT_ROUNDS[m
[31m-			/* If FLT_ROUNDS == 2, L will usually be high by 1 */[m
[31m-			if (dval(&u) < 0) {[m
[31m-				L--;[m
[31m-				dval(&u) += ds;[m
[31m-				}[m
[31m-#endif[m
[31m-			*s++ = '0' + (int)L;[m
[31m-			if (!dval(&u)) {[m
[31m-#ifdef SET_INEXACT[m
[31m-				inexact = 0;[m
[31m-#endif[m
[31m-				break;[m
[31m-				}[m
[31m-			if (i == ilim) {[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				if (mode > 1)[m
[31m-				switch(Rounding) {[m
[31m-				  case 0: goto ret1;[m
[31m-				  case 2: goto bump_up;[m
[31m-				  }[m
[31m-#endif[m
[31m-				dval(&u) += dval(&u);[m
[31m-#ifdef ROUND_BIASED[m
[31m-				if (dval(&u) >= ds)[m
[31m-#else[m
[31m-				if (dval(&u) > ds || (dval(&u) == ds && L & 1))[m
[31m-#endif[m
[31m-					{[m
[31m- bump_up:[m
[31m-					while(*--s == '9')[m
[31m-						if (s == s0) {[m
[31m-							k++;[m
[31m-							*s = '0';[m
[31m-							break;[m
[31m-							}[m
[31m-					++*s++;[m
[31m-					}[m
[31m-				break;[m
[31m-				}[m
[31m-			}[m
[31m-		goto ret1;[m
[31m-		}[m
[31m-[m
[31m-	m2 = b2;[m
[31m-	m5 = b5;[m
[31m-	mhi = mlo = 0;[m
[31m-	if (leftright) {[m
[31m-		i =[m
[31m-#ifndef Sudden_Underflow[m
[31m-			denorm ? be + (Bias + (P-1) - 1 + 1) :[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-			1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);[m
[31m-#else[m
[31m-			1 + P - bbits;[m
[31m-#endif[m
[31m-		b2 += i;[m
[31m-		s2 += i;[m
[31m-		mhi = i2b(1);[m
[31m-		}[m
[31m-	if (m2 > 0 && s2 > 0) {[m
[31m-		i = m2 < s2 ? m2 : s2;[m
[31m-		b2 -= i;[m
[31m-		m2 -= i;[m
[31m-		s2 -= i;[m
[31m-		}[m
[31m-	if (b5 > 0) {[m
[31m-		if (leftright) {[m
[31m-			if (m5 > 0) {[m
[31m-				mhi = pow5mult(mhi, m5);[m
[31m-				b1 = mult(mhi, b);[m
[31m-				Bfree(b);[m
[31m-				b = b1;[m
[31m-				}[m
[31m-			if ((j = b5 - m5))[m
[31m-				b = pow5mult(b, j);[m
[31m-			}[m
[31m-		else[m
[31m-			b = pow5mult(b, b5);[m
[31m-		}[m
[31m-	S = i2b(1);[m
[31m-	if (s5 > 0)[m
[31m-		S = pow5mult(S, s5);[m
[31m-[m
[31m-	/* Check for special case that d is a normalized power of 2. */[m
[31m-[m
[31m-	spec_case = 0;[m
[31m-	if ((mode < 2 || leftright)[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-			&& Rounding == 1[m
[31m-#endif[m
[31m-				) {[m
[31m-		if (!word1(&u) && !(word0(&u) & Bndry_mask)[m
[31m-#ifndef Sudden_Underflow[m
[31m-		 && word0(&u) & (Exp_mask & ~Exp_msk1)[m
[31m-#endif[m
[31m-				) {[m
[31m-			/* The special case */[m
[31m-			b2 += Log2P;[m
[31m-			s2 += Log2P;[m
[31m-			spec_case = 1;[m
[31m-			}[m
[31m-		}[m
[31m-[m
[31m-	/* Arrange for convenient computation of quotients:[m
[31m-	 * shift left if necessary so divisor has 4 leading 0 bits.[m
[31m-	 *[m
[31m-	 * Perhaps we should just compute leading 28 bits of S once[m
[31m-	 * and for all and pass them and a shift to quorem, so it[m
[31m-	 * can do shifts and ors to compute the numerator for q.[m
[31m-	 */[m
[31m-	i = dshift(S, s2);[m
[31m-	b2 += i;[m
[31m-	m2 += i;[m
[31m-	s2 += i;[m
[31m-	if (b2 > 0)[m
[31m-		b = lshift(b, b2);[m
[31m-	if (s2 > 0)[m
[31m-		S = lshift(S, s2);[m
[31m-	if (k_check) {[m
[31m-		if (cmp(b,S) < 0) {[m
[31m-			k--;[m
[31m-			b = multadd(b, 10, 0);	/* we botched the k estimate */[m
[31m-			if (leftright)[m
[31m-				mhi = multadd(mhi, 10, 0);[m
[31m-			ilim = ilim1;[m
[31m-			}[m
[31m-		}[m
[31m-	if (ilim <= 0 && (mode == 3 || mode == 5)) {[m
[31m-		if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {[m
[31m-			/* no digits, fcvt style */[m
[31m- no_digits:[m
[31m-			k = -1 - ndigits;[m
[31m-			goto ret;[m
[31m-			}[m
[31m- one_digit:[m
[31m-		*s++ = '1';[m
[31m-		k++;[m
[31m-		goto ret;[m
[31m-		}[m
[31m-	if (leftright) {[m
[31m-		if (m2 > 0)[m
[31m-			mhi = lshift(mhi, m2);[m
[31m-[m
[31m-		/* Compute mlo -- check for special case[m
[31m-		 * that d is a normalized power of 2.[m
[31m-		 */[m
[31m-[m
[31m-		mlo = mhi;[m
[31m-		if (spec_case) {[m
[31m-			mhi = Balloc(mhi->k);[m
[31m-			Bcopy(mhi, mlo);[m
[31m-			mhi = lshift(mhi, Log2P);[m
[31m-			}[m
[31m-[m
[31m-		for(i = 1;;i++) {[m
[31m-			dig = quorem(b,S) + '0';[m
[31m-			/* Do we yet have the shortest decimal string[m
[31m-			 * that will round to d?[m
[31m-			 */[m
[31m-			j = cmp(b, mlo);[m
[31m-			delta = diff(S, mhi);[m
[31m-			j1 = delta->sign ? 1 : cmp(b, delta);[m
[31m-			Bfree(delta);[m
[31m-#ifndef ROUND_BIASED[m
[31m-			if (j1 == 0 && mode != 1 && !(word1(&u) & 1)[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				&& Rounding >= 1[m
[31m-#endif[m
[31m-								   ) {[m
[31m-				if (dig == '9')[m
[31m-					goto round_9_up;[m
[31m-				if (j > 0)[m
[31m-					dig++;[m
[31m-#ifdef SET_INEXACT[m
[31m-				else if (!b->x[0] && b->wds <= 1)[m
[31m-					inexact = 0;[m
[31m-#endif[m
[31m-				*s++ = dig;[m
[31m-				goto ret;[m
[31m-				}[m
[31m-#endif[m
[31m-			if (j < 0 || (j == 0 && mode != 1[m
[31m-#ifndef ROUND_BIASED[m
[31m-							&& !(word1(&u) & 1)[m
[31m-#endif[m
[31m-					)) {[m
[31m-				if (!b->x[0] && b->wds <= 1) {[m
[31m-#ifdef SET_INEXACT[m
[31m-					inexact = 0;[m
[31m-#endif[m
[31m-					goto accept_dig;[m
[31m-					}[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				if (mode > 1)[m
[31m-				 switch(Rounding) {[m
[31m-				  case 0: goto accept_dig;[m
[31m-				  case 2: goto keep_dig;[m
[31m-				  }[m
[31m-#endif /*Honor_FLT_ROUNDS*/[m
[31m-				if (j1 > 0) {[m
[31m-					b = lshift(b, 1);[m
[31m-					j1 = cmp(b, S);[m
[31m-#ifdef ROUND_BIASED[m
[31m-					if (j1 >= 0 /*)*/[m
[31m-#else[m
[31m-					if ((j1 > 0 || (j1 == 0 && dig & 1))[m
[31m-#endif[m
[31m-					&& dig++ == '9')[m
[31m-						goto round_9_up;[m
[31m-					}[m
[31m- accept_dig:[m
[31m-				*s++ = dig;[m
[31m-				goto ret;[m
[31m-				}[m
[31m-			if (j1 > 0) {[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				if (!Rounding)[m
[31m-					goto accept_dig;[m
[31m-#endif[m
[31m-				if (dig == '9') { /* possible if i == 1 */[m
[31m- round_9_up:[m
[31m-					*s++ = '9';[m
[31m-					goto roundoff;[m
[31m-					}[m
[31m-				*s++ = dig + 1;[m
[31m-				goto ret;[m
[31m-				}[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m- keep_dig:[m
[31m-#endif[m
[31m-			*s++ = dig;[m
[31m-			if (i == ilim)[m
[31m-				break;[m
[31m-			b = multadd(b, 10, 0);[m
[31m-			if (mlo == mhi)[m
[31m-				mlo = mhi = multadd(mhi, 10, 0);[m
[31m-			else {[m
[31m-				mlo = multadd(mlo, 10, 0);[m
[31m-				mhi = multadd(mhi, 10, 0);[m
[31m-				}[m
[31m-			}[m
[31m-		}[m
[31m-	else[m
[31m-		for(i = 1;; i++) {[m
[31m-			*s++ = dig = quorem(b,S) + '0';[m
[31m-			if (!b->x[0] && b->wds <= 1) {[m
[31m-#ifdef SET_INEXACT[m
[31m-				inexact = 0;[m
[31m-#endif[m
[31m-				goto ret;[m
[31m-				}[m
[31m-			if (i >= ilim)[m
[31m-				break;[m
[31m-			b = multadd(b, 10, 0);[m
[31m-			}[m
[31m-[m
[31m-	/* Round off last digit */[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	switch(Rounding) {[m
[31m-	  case 0: goto trimzeros;[m
[31m-	  case 2: goto roundoff;[m
[31m-	  }[m
[31m-#endif[m
[31m-	b = lshift(b, 1);[m
[31m-	j = cmp(b, S);[m
[31m-#ifdef ROUND_BIASED[m
[31m-	if (j >= 0)[m
[31m-#else[m
[31m-	if (j > 0 || (j == 0 && dig & 1))[m
[31m-#endif[m
[31m-		{[m
[31m- roundoff:[m
[31m-		while(*--s == '9')[m
[31m-			if (s == s0) {[m
[31m-				k++;[m
[31m-				*s++ = '1';[m
[31m-				goto ret;[m
[31m-				}[m
[31m-		++*s++;[m
[31m-		}[m
[31m-	else {[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m- trimzeros:[m
[31m-#endif[m
[31m-		while(*--s == '0');[m
[31m-		s++;[m
[31m-		}[m
[31m- ret:[m
[31m-	Bfree(S);[m
[31m-	if (mhi) {[m
[31m-		if (mlo && mlo != mhi)[m
[31m-			Bfree(mlo);[m
[31m-		Bfree(mhi);[m
[31m-		}[m
[31m- ret1:[m
[31m-#ifdef SET_INEXACT[m
[31m-	if (inexact) {[m
[31m-		if (!oldinexact) {[m
[31m-			word0(&u) = Exp_1 + (70 << Exp_shift);[m
[31m-			word1(&u) = 0;[m
[31m-			dval(&u) += 1.;[m
[31m-			}[m
[31m-		}[m
[31m-	else if (!oldinexact)[m
[31m-		clear_inexact();[m
[31m-#endif[m
[31m-	Bfree(b);[m
[31m-	*s = 0;[m
[31m-	*decpt = k + 1;[m
[31m-	if (rve)[m
[31m-		*rve = s;[m
[31m-	return s0;[m
[31m-	}[m
[31m-#ifdef __cplusplus[m
[31m-}[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/dtoa_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/dtoa_config.h[m
[1mdeleted file mode 100644[m
[1mindex 380e83b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/dtoa_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-#ifndef _DTOA_CONFIG_H[m
[31m-#define _DTOA_CONFIG_H[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-/* Ensure dtoa.c does not USE_LOCALE. Lua CJSON must not use locale[m
[31m- * aware conversion routines. */[m
[31m-#undef USE_LOCALE[m
[31m-[m
[31m-/* dtoa.c should not touch errno, Lua CJSON does not use it, and it[m
[31m- * may not be threadsafe */[m
[31m-#define NO_ERRNO[m
[31m-[m
[31m-#define Long    int32_t[m
[31m-#define ULong   uint32_t[m
[31m-#define Llong   int64_t[m
[31m-#define ULLong  uint64_t[m
[31m-[m
[31m-#ifdef IEEE_BIG_ENDIAN[m
[31m-#define IEEE_MC68k[m
[31m-#else[m
[31m-#define IEEE_8087[m
[31m-#endif[m
[31m-[m
[31m-#define MALLOC(n)   xmalloc(n)[m
[31m-[m
[31m-static void *xmalloc(size_t size)[m
[31m-{[m
[31m-    void *p;[m
[31m-[m
[31m-    p = malloc(size);[m
[31m-    if (!p) {[m
[31m-        fprintf(stderr, "Out of memory");[m
[31m-        abort();[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-#ifdef MULTIPLE_THREADS[m
[31m-[m
[31m-/* Enable locking to support multi-threaded applications */[m
[31m-[m
[31m-#include <pthread.h>[m
[31m-[m
[31m-static pthread_mutex_t private_dtoa_lock[2] = {[m
[31m-    PTHREAD_MUTEX_INITIALIZER,[m
[31m-    PTHREAD_MUTEX_INITIALIZER[m
[31m-};[m
[31m-[m
[31m-#define ACQUIRE_DTOA_LOCK(n)    do {                                \[m
[31m-    int r = pthread_mutex_lock(&private_dtoa_lock[n]);              \[m
[31m-    if (r) {                                                        \[m
[31m-        fprintf(stderr, "pthread_mutex_lock failed with %d\n", r);  \[m
[31m-        abort();                                                    \[m
[31m-    }                                                               \[m
[31m-} while (0)[m
[31m-[m
[31m-#define FREE_DTOA_LOCK(n)   do {                                    \[m
[31m-    int r = pthread_mutex_unlock(&private_dtoa_lock[n]);            \[m
[31m-    if (r) {                                                        \[m
[31m-        fprintf(stderr, "pthread_mutex_unlock failed with %d\n", r);\[m
[31m-        abort();                                                    \[m
[31m-    }                                                               \[m
[31m-} while (0)[m
[31m-[m
[31m-#endif  /* MULTIPLE_THREADS */[m
[31m-[m
[31m-#endif  /* _DTOA_CONFIG_H */[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.c[m
[1mdeleted file mode 100644[m
[1mindex 854662c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.c[m
[1m+++ /dev/null[m
[36m@@ -1,205 +0,0 @@[m
[31m-/* fpconv - Floating point conversion routines[m
[31m- *[m
[31m- * Copyright (c) 2011-2012  Mark Pulford <mark@kyne.com.au>[m
[31m- *[m
[31m- * Permission is hereby granted, free of charge, to any person obtaining[m
[31m- * a copy of this software and associated documentation files (the[m
[31m- * "Software"), to deal in the Software without restriction, including[m
[31m- * without limitation the rights to use, copy, modify, merge, publish,[m
[31m- * distribute, sublicense, and/or sell copies of the Software, and to[m
[31m- * permit persons to whom the Software is furnished to do so, subject to[m
[31m- * the following conditions:[m
[31m- *[m
[31m- * The above copyright notice and this permission notice shall be[m
[31m- * included in all copies or substantial portions of the Software.[m
[31m- *[m
[31m- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m- */[m
[31m-[m
[31m-/* JSON uses a '.' decimal separator. strtod() / sprintf() under C libraries[m
[31m- * with locale support will break when the decimal separator is a comma.[m
[31m- *[m
[31m- * fpconv_* will around these issues with a translation buffer if required.[m
[31m- */[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <assert.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#include "fpconv.h"[m
[31m-[m
[31m-/* Lua CJSON assumes the locale is the same for all threads within a[m
[31m- * process and doesn't change after initialisation.[m
[31m- *[m
[31m- * This avoids the need for per thread storage or expensive checks[m
[31m- * for call. */[m
[31m-static char locale_decimal_point = '.';[m
[31m-[m
[31m-/* In theory multibyte decimal_points are possible, but[m
[31m- * Lua CJSON only supports UTF-8 and known locales only have[m
[31m- * single byte decimal points ([.,]).[m
[31m- *[m
[31m- * localconv() may not be thread safe (=>crash), and nl_langinfo() is[m
[31m- * not supported on some platforms. Use sprintf() instead - if the[m
[31m- * locale does change, at least Lua CJSON won't crash. */[m
[31m-static void fpconv_update_locale()[m
[31m-{[m
[31m-    char buf[8];[m
[31m-[m
[31m-    snprintf(buf, sizeof(buf), "%g", 0.5);[m
[31m-[m
[31m-    /* Failing this test might imply the platform has a buggy dtoa[m
[31m-     * implementation or wide characters */[m
[31m-    if (buf[0] != '0' || buf[2] != '5' || buf[3] != 0) {[m
[31m-        fprintf(stderr, "Error: wide characters found or printf() bug.");[m
[31m-        abort();[m
[31m-    }[m
[31m-[m
[31m-    locale_decimal_point = buf[1];[m
[31m-}[m
[31m-[m
[31m-/* Check for a valid number character: [-+0-9a-yA-Y.][m
[31m- * Eg: -0.6e+5, infinity, 0xF0.F0pF0[m
[31m- *[m
[31m- * Used to find the probable end of a number. It doesn't matter if[m
[31m- * invalid characters are counted - strtod() will find the valid[m
[31m- * number if it exists.  The risk is that slightly more memory might[m
[31m- * be allocated before a parse error occurs. */[m
[31m-static inline int valid_number_character(char ch)[m
[31m-{[m
[31m-    char lower_ch;[m
[31m-[m
[31m-    if ('0' <= ch && ch <= '9')[m
[31m-        return 1;[m
[31m-    if (ch == '-' || ch == '+' || ch == '.')[m
[31m-        return 1;[m
[31m-[m
[31m-    /* Hex digits, exponent (e), base (p), "infinity",.. */[m
[31m-    lower_ch = ch | 0x20;[m
[31m-    if ('a' <= lower_ch && lower_ch <= 'y')[m
[31m-        return 1;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/* Calculate the size of the buffer required for a strtod locale[m
[31m- * conversion. */[m
[31m-static int strtod_buffer_size(const char *s)[m
[31m-{[m
[31m-    const char *p = s;[m
[31m-[m
[31m-    while (valid_number_character(*p))[m
[31m-        p++;[m
[31m-[m
[31m-    return p - s;[m
[31m-}[m
[31m-[m
[31m-/* Similar to strtod(), but must be passed the current locale's decimal point[m
[31m- * character. Guaranteed to be called at the start of any valid number in a string */[m
[31m-double fpconv_strtod(const char *nptr, char **endptr)[m
[31m-{[m
[31m-    char localbuf[FPCONV_G_FMT_BUFSIZE];[m
[31m-    char *buf, *endbuf, *dp;[m
[31m-    int buflen;[m
[31m-    double value;[m
[31m-[m
[31m-    /* System strtod() is fine when decimal point is '.' */[m
[31m-    if (locale_decimal_point == '.')[m
[31m-        return strtod(nptr, endptr);[m
[31m-[m
[31m-    buflen = strtod_buffer_size(nptr);[m
[31m-    if (!buflen) {[m
[31m-        /* No valid characters found, standard strtod() return */[m
[31m-        *endptr = (char *)nptr;[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    /* Duplicate number into buffer */[m
[31m-    if (buflen >= FPCONV_G_FMT_BUFSIZE) {[m
[31m-        /* Handle unusually large numbers */[m
[31m-        buf = malloc(buflen + 1);[m
[31m-        if (!buf) {[m
[31m-            fprintf(stderr, "Out of memory");[m
[31m-            abort();[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* This is the common case.. */[m
[31m-        buf = localbuf;[m
[31m-    }[m
[31m-    memcpy(buf, nptr, buflen);[m
[31m-    buf[buflen] = 0;[m
[31m-[m
[31m-    /* Update decimal point character if found */[m
[31m-    dp = strchr(buf, '.');[m
[31m-    if (dp)[m
[31m-        *dp = locale_decimal_point;[m
[31m-[m
[31m-    value = strtod(buf, &endbuf);[m
[31m-    *endptr = (char *)&nptr[endbuf - buf];[m
[31m-    if (buflen >= FPCONV_G_FMT_BUFSIZE)[m
[31m-        free(buf);[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-/* "fmt" must point to a buffer of at least 6 characters */[m
[31m-static void set_number_format(char *fmt, int precision)[m
[31m-{[m
[31m-    int d1, d2, i;[m
[31m-[m
[31m-    assert(1 <= precision && precision <= 16);[m
[31m-[m
[31m-    /* Create printf format (%.14g) from precision */[m
[31m-    d1 = precision / 10;[m
[31m-    d2 = precision % 10;[m
[31m-    fmt[0] = '%';[m
[31m-    fmt[1] = '.';[m
[31m-    i = 2;[m
[31m-    if (d1) {[m
[31m-        fmt[i++] = '0' + d1;[m
[31m-    }[m
[31m-    fmt[i++] = '0' + d2;[m
[31m-    fmt[i++] = 'g';[m
[31m-    fmt[i] = 0;[m
[31m-}[m
[31m-[m
[31m-/* Assumes there is always at least 32 characters available in the target buffer */[m
[31m-int fpconv_g_fmt(char *str, double num, int precision)[m
[31m-{[m
[31m-    char buf[FPCONV_G_FMT_BUFSIZE];[m
[31m-    char fmt[6];[m
[31m-    int len;[m
[31m-    char *b;[m
[31m-[m
[31m-    set_number_format(fmt, precision);[m
[31m-[m
[31m-    /* Pass through when decimal point character is dot. */[m
[31m-    if (locale_decimal_point == '.')[m
[31m-        return snprintf(str, FPCONV_G_FMT_BUFSIZE, fmt, num);[m
[31m-[m
[31m-    /* snprintf() to a buffer then translate for other decimal point characters */[m
[31m-    len = snprintf(buf, FPCONV_G_FMT_BUFSIZE, fmt, num);[m
[31m-[m
[31m-    /* Copy into target location. Translate decimal point if required */[m
[31m-    b = buf;[m
[31m-    do {[m
[31m-        *str++ = (*b == locale_decimal_point ? '.' : *b);[m
[31m-    } while(*b++);[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-void fpconv_init()[m
[31m-{[m
[31m-    fpconv_update_locale();[m
[31m-}[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.h[m
[1mdeleted file mode 100644[m
[1mindex 7b0d0ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-/* Lua CJSON floating point conversion routines */[m
[31m-[m
[31m-/* Buffer required to store the largest string representation of a double.[m
[31m- *[m
[31m- * Longest double printed with %.14g is 21 characters long:[m
[31m- * -1.7976931348623e+308 */[m
[31m-# define FPCONV_G_FMT_BUFSIZE   32[m
[31m-[m
[31m-#ifdef USE_INTERNAL_FPCONV[m
[31m-static inline void fpconv_init()[m
[31m-{[m
[31m-    /* Do nothing - not required */[m
[31m-}[m
[31m-#else[m
[31m-extern void fpconv_init();[m
[31m-#endif[m
[31m-[m
[31m-extern int fpconv_g_fmt(char*, double, int);[m
[31m-extern double fpconv_strtod(const char*, char**);[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.o[m
[1mdeleted file mode 100644[m
[1mindex 88541b5..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/fpconv.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/g_fmt.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/g_fmt.c[m
[1mdeleted file mode 100644[m
[1mindex 50d6a1d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/g_fmt.c[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m-/****************************************************************[m
[31m- *[m
[31m- * The author of this software is David M. Gay.[m
[31m- *[m
[31m- * Copyright (c) 1991, 1996 by Lucent Technologies.[m
[31m- *[m
[31m- * Permission to use, copy, modify, and distribute this software for any[m
[31m- * purpose without fee is hereby granted, provided that this entire notice[m
[31m- * is included in all copies of any software which is or includes a copy[m
[31m- * or modification of this software and in all copies of the supporting[m
[31m- * documentation for such software.[m
[31m- *[m
[31m- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED[m
[31m- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY[m
[31m- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY[m
[31m- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.[m
[31m- *[m
[31m- ***************************************************************/[m
[31m-[m
[31m-/* g_fmt(buf,x) stores the closest decimal approximation to x in buf;[m
[31m- * it suffices to declare buf[m
[31m- *	char buf[32];[m
[31m- */[m
[31m-[m
[31m-#ifdef __cplusplus[m
[31m-extern "C" {[m
[31m-#endif[m
[31m- extern char *dtoa(double, int, int, int *, int *, char **);[m
[31m- extern int g_fmt(char *, double, int);[m
[31m- extern void freedtoa(char*);[m
[31m-#ifdef __cplusplus[m
[31m-	}[m
[31m-#endif[m
[31m-[m
[31m-int[m
[31m-fpconv_g_fmt(char *b, double x, int precision)[m
[31m-{[m
[31m-	register int i, k;[m
[31m-	register char *s;[m
[31m-	int decpt, j, sign;[m
[31m-	char *b0, *s0, *se;[m
[31m-[m
[31m-	b0 = b;[m
[31m-#ifdef IGNORE_ZERO_SIGN[m
[31m-	if (!x) {[m
[31m-		*b++ = '0';[m
[31m-		*b = 0;[m
[31m-		goto done;[m
[31m-		}[m
[31m-#endif[m
[31m-	s = s0 = dtoa(x, 2, precision, &decpt, &sign, &se);[m
[31m-	if (sign)[m
[31m-		*b++ = '-';[m
[31m-	if (decpt == 9999) /* Infinity or Nan */ {[m
[31m-		while((*b++ = *s++));[m
[31m-		/* "b" is used to calculate the return length. Decrement to exclude the[m
[31m-		 * Null terminator from the length */[m
[31m-		b--;[m
[31m-		goto done0;[m
[31m-		}[m
[31m-	if (decpt <= -4 || decpt > precision) {[m
[31m-		*b++ = *s++;[m
[31m-		if (*s) {[m
[31m-			*b++ = '.';[m
[31m-			while((*b = *s++))[m
[31m-				b++;[m
[31m-			}[m
[31m-		*b++ = 'e';[m
[31m-		/* sprintf(b, "%+.2d", decpt - 1); */[m
[31m-		if (--decpt < 0) {[m
[31m-			*b++ = '-';[m
[31m-			decpt = -decpt;[m
[31m-			}[m
[31m-		else[m
[31m-			*b++ = '+';[m
[31m-		for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10);[m
[31m-		for(;;) {[m
[31m-			i = decpt / k;[m
[31m-			*b++ = i + '0';[m
[31m-			if (--j <= 0)[m
[31m-				break;[m
[31m-			decpt -= i*k;[m
[31m-			decpt *= 10;[m
[31m-			}[m
[31m-		*b = 0;[m
[31m-		}[m
[31m-	else if (decpt <= 0) {[m
[31m-		*b++ = '0';[m
[31m-		*b++ = '.';[m
[31m-		for(; decpt < 0; decpt++)[m
[31m-			*b++ = '0';[m
[31m-		while((*b++ = *s++));[m
[31m-		b--;[m
[31m-		}[m
[31m-	else {[m
[31m-		while((*b = *s++)) {[m
[31m-			b++;[m
[31m-			if (--decpt == 0 && *s)[m
[31m-				*b++ = '.';[m
[31m-			}[m
[31m-		for(; decpt > 0; decpt--)[m
[31m-			*b++ = '0';[m
[31m-		*b = 0;[m
[31m-		}[m
[31m- done0:[m
[31m-	freedtoa(s0);[m
[31m-#ifdef IGNORE_ZERO_SIGN[m
[31m- done:[m
[31m-#endif[m
[31m-	return b - b0;[m
[31m-	}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua-cjson-2.1devel-1.rockspec b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua-cjson-2.1devel-1.rockspec[m
[1mdeleted file mode 100644[m
[1mindex 154e333..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua-cjson-2.1devel-1.rockspec[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-package = "lua-cjson"[m
[31m-version = "2.1devel-1"[m
[31m-[m
[31m-source = {[m
[31m-    url = "http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1devel.zip",[m
[31m-}[m
[31m-[m
[31m-description = {[m
[31m-    summary = "A fast JSON encoding/parsing module",[m
[31m-    detailed = [[[m
[31m-        The Lua CJSON module provides JSON support for Lua. It features:[m
[31m-        - Fast, standards compliant encoding/parsing routines[m
[31m-        - Full support for JSON with UTF-8, including decoding surrogate pairs[m
[31m-        - Optional run-time support for common exceptions to the JSON specification[m
[31m-          (infinity, NaN,..)[m
[31m-        - No dependencies on other libraries[m
[31m-    ]],[m
[31m-    homepage = "http://www.kyne.com.au/~mark/software/lua-cjson.php",[m
[31m-    license = "MIT"[m
[31m-}[m
[31m-[m
[31m-dependencies = {[m
[31m-    "lua >= 5.1"[m
[31m-}[m
[31m-[m
[31m-build = {[m
[31m-    type = "builtin",[m
[31m-    modules = {[m
[31m-        cjson = {[m
[31m-            sources = { "lua_cjson.c", "strbuf.c", "fpconv.c" },[m
[31m-            defines = {[m
[31m--- LuaRocks does not support platform specific configuration for Solaris.[m
[31m--- Uncomment the line below on Solaris platforms if required.[m
[31m---                "USE_INTERNAL_ISINF"[m
[31m-            }[m
[31m-        }[m
[31m-    },[m
[31m-    install = {[m
[31m-        lua = {[m
[31m-            ["cjson.util"] = "lua/cjson/util.lua"[m
[31m-        },[m
[31m-        bin = {[m
[31m-            json2lua = "lua/json2lua.lua",[m
[31m-            lua2json = "lua/lua2json.lua"[m
[31m-        }[m
[31m-    },[m
[31m-    -- Override default build options (per platform)[m
[31m-    platforms = {[m
[31m-        win32 = { modules = { cjson = { defines = {[m
[31m-            "DISABLE_INVALID_NUMBERS"[m
[31m-        } } } }[m
[31m-    },[m
[31m-    copy_directories = { "tests" }[m
[31m-}[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua-cjson.spec b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua-cjson.spec[m
[1mdeleted file mode 100644[m
[1mindex 13fc56d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua-cjson.spec[m
[1m+++ /dev/null[m
[36m@@ -1,80 +0,0 @@[m
[31m-%define luaver 5.1[m
[31m-%define lualibdir %{_libdir}/lua/%{luaver}[m
[31m-%define luadatadir %{_datadir}/lua/%{luaver}[m
[31m-[m
[31m-Name:		lua-cjson[m
[31m-Version:	2.1devel[m
[31m-Release:	1%{?dist}[m
[31m-Summary:	A fast JSON encoding/parsing module for Lua[m
[31m-[m
[31m-Group:		Development/Libraries[m
[31m-License:	MIT[m
[31m-URL:		http://www.kyne.com.au/~mark/software/lua-cjson/[m
[31m-Source0:	http://www.kyne.com.au/~mark/software/lua-cjson/download/lua-cjson-%{version}.tar.gz[m
[31m-BuildRoot:	%(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)[m
[31m-[m
[31m-BuildRequires:	lua >= %{luaver}, lua-devel >= %{luaver}[m
[31m-Requires:	lua >= %{luaver}[m
[31m-[m
[31m-%description[m
[31m-The Lua CJSON module provides JSON support for Lua. It features:[m
[31m-- Fast, standards compliant encoding/parsing routines[m
[31m-- Full support for JSON with UTF-8, including decoding surrogate pairs[m
[31m-- Optional run-time support for common exceptions to the JSON specification[m
[31m-  (infinity, NaN,..)[m
[31m-- No dependencies on other libraries[m
[31m-[m
[31m-[m
[31m-%prep[m
[31m-%setup -q[m
[31m-[m
[31m-[m
[31m-%build[m
[31m-make %{?_smp_mflags} CFLAGS="%{optflags}" LUA_INCLUDE_DIR="%{_includedir}"[m
[31m-[m
[31m-[m
[31m-%install[m
[31m-rm -rf "$RPM_BUILD_ROOT"[m
[31m-make install DESTDIR="$RPM_BUILD_ROOT" LUA_CMODULE_DIR="%{lualibdir}"[m
[31m-make install-extra DESTDIR="$RPM_BUILD_ROOT" LUA_MODULE_DIR="%{luadatadir}" \[m
[31m-	LUA_BIN_DIR="%{_bindir}"[m
[31m-[m
[31m-[m
[31m-%clean[m
[31m-rm -rf "$RPM_BUILD_ROOT"[m
[31m-[m
[31m-[m
[31m-%preun[m
[31m-/bin/rm -f "%{luadatadir}/cjson/tests/utf8.dat"[m
[31m-[m
[31m-[m
[31m-%files[m
[31m-%defattr(-,root,root,-)[m
[31m-%doc LICENSE NEWS performance.html performance.txt manual.html manual.txt rfc4627.txt THANKS[m
[31m-%{lualibdir}/*[m
[31m-%{luadatadir}/*[m
[31m-%{_bindir}/*[m
[31m-[m
[31m-[m
[31m-%changelog[m
[31m-* Thu Mar 1 2012 Mark Pulford <mark@kyne.com.au> - 2.1.0-1[m
[31m-- Update for 2.1.0[m
[31m-[m
[31m-* Sun Jan 22 2012 Mark Pulford <mark@kyne.com.au> - 2.0.0-1[m
[31m-- Update for 2.0.0[m
[31m-- Install lua2json / json2lua utilities[m
[31m-[m
[31m-* Wed Nov 27 2011 Mark Pulford <mark@kyne.com.au> - 1.0.4-1[m
[31m-- Update for 1.0.4[m
[31m-[m
[31m-* Wed Sep 15 2011 Mark Pulford <mark@kyne.com.au> - 1.0.3-1[m
[31m-- Update for 1.0.3[m
[31m-[m
[31m-* Sun May 29 2011 Mark Pulford <mark@kyne.com.au> - 1.0.2-1[m
[31m-- Update for 1.0.2[m
[31m-[m
[31m-* Sun May 10 2011 Mark Pulford <mark@kyne.com.au> - 1.0.1-1[m
[31m-- Update for 1.0.1[m
[31m-[m
[31m-* Sun May 1 2011 Mark Pulford <mark@kyne.com.au> - 1.0-1[m
[31m-- Initial package[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/cjson/util.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/cjson/util.lua[m
[1mdeleted file mode 100644[m
[1mindex 6916dad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/cjson/util.lua[m
[1m+++ /dev/null[m
[36m@@ -1,271 +0,0 @@[m
[31m-local json = require "cjson"[m
[31m-[m
[31m--- Various common routines used by the Lua CJSON package[m
[31m---[m
[31m--- Mark Pulford <mark@kyne.com.au>[m
[31m-[m
[31m--- Determine with a Lua table can be treated as an array.[m
[31m--- Explicitly returns "not an array" for very sparse arrays.[m
[31m--- Returns:[m
[31m--- -1   Not an array[m
[31m--- 0    Empty table[m
[31m--- >0   Highest index in the array[m
[31m-local function is_array(table)[m
[31m-    local max = 0[m
[31m-    local count = 0[m
[31m-    for k, v in pairs(table) do[m
[31m-        if type(k) == "number" then[m
[31m-            if k > max then max = k end[m
[31m-            count = count + 1[m
[31m-        else[m
[31m-            return -1[m
[31m-        end[m
[31m-    end[m
[31m-    if max > count * 2 then[m
[31m-        return -1[m
[31m-    end[m
[31m-[m
[31m-    return max[m
[31m-end[m
[31m-[m
[31m-local serialise_value[m
[31m-[m
[31m-local function serialise_table(value, indent, depth)[m
[31m-    local spacing, spacing2, indent2[m
[31m-    if indent then[m
[31m-        spacing = "\n" .. indent[m
[31m-        spacing2 = spacing .. "  "[m
[31m-        indent2 = indent .. "  "[m
[31m-    else[m
[31m-        spacing, spacing2, indent2 = " ", " ", false[m
[31m-    end[m
[31m-    depth = depth + 1[m
[31m-    if depth > 50 then[m
[31m-        return "Cannot serialise any further: too many nested tables"[m
[31m-    end[m
[31m-[m
[31m-    local max = is_array(value)[m
[31m-[m
[31m-    local comma = false[m
[31m-    local fragment = { "{" .. spacing2 }[m
[31m-    if max > 0 then[m
[31m-        -- Serialise array[m
[31m-        for i = 1, max do[m
[31m-            if comma then[m
[31m-                table.insert(fragment, "," .. spacing2)[m
[31m-            end[m
[31m-            table.insert(fragment, serialise_value(value[i], indent2, depth))[m
[31m-            comma = true[m
[31m-        end[m
[31m-    elseif max < 0 then[m
[31m-        -- Serialise table[m
[31m-        for k, v in pairs(value) do[m
[31m-            if comma then[m
[31m-                table.insert(fragment, "," .. spacing2)[m
[31m-            end[m
[31m-            table.insert(fragment,[m
[31m-                ("[%s] = %s"):format(serialise_value(k, indent2, depth),[m
[31m-                                     serialise_value(v, indent2, depth)))[m
[31m-            comma = true[m
[31m-        end[m
[31m-    end[m
[31m-    table.insert(fragment, spacing .. "}")[m
[31m-[m
[31m-    return table.concat(fragment)[m
[31m-end[m
[31m-[m
[31m-function serialise_value(value, indent, depth)[m
[31m-    if indent == nil then indent = "" end[m
[31m-    if depth == nil then depth = 0 end[m
[31m-[m
[31m-    if value == json.null then[m
[31m-        return "json.null"[m
[31m-    elseif type(value) == "string" then[m
[31m-        return ("%q"):format(value)[m
[31m-    elseif type(value) == "nil" or type(value) == "number" or[m
[31m-           type(value) == "boolean" then[m
[31m-        return tostring(value)[m
[31m-    elseif type(value) == "table" then[m
[31m-        return serialise_table(value, indent, depth)[m
[31m-    else[m
[31m-        return "\"<" .. type(value) .. ">\""[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function file_load(filename)[m
[31m-    local file[m
[31m-    if filename == nil then[m
[31m-        file = io.stdin[m
[31m-    else[m
[31m-        local err[m
[31m-        file, err = io.open(filename, "rb")[m
[31m-        if file == nil then[m
[31m-            error(("Unable to read '%s': %s"):format(filename, err))[m
[31m-        end[m
[31m-    end[m
[31m-    local data = file:read("*a")[m
[31m-[m
[31m-    if filename ~= nil then[m
[31m-        file:close()[m
[31m-    end[m
[31m-[m
[31m-    if data == nil then[m
[31m-        error("Failed to read " .. filename)[m
[31m-    end[m
[31m-[m
[31m-    return data[m
[31m-end[m
[31m-[m
[31m-local function file_save(filename, data)[m
[31m-    local file[m
[31m-    if filename == nil then[m
[31m-        file = io.stdout[m
[31m-    else[m
[31m-        local err[m
[31m-        file, err = io.open(filename, "wb")[m
[31m-        if file == nil then[m
[31m-            error(("Unable to write '%s': %s"):format(filename, err))[m
[31m-        end[m
[31m-    end[m
[31m-    file:write(data)[m
[31m-    if filename ~= nil then[m
[31m-        file:close()[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function compare_values(val1, val2)[m
[31m-    local type1 = type(val1)[m
[31m-    local type2 = type(val2)[m
[31m-    if type1 ~= type2 then[m
[31m-        return false[m
[31m-    end[m
[31m-[m
[31m-    -- Check for NaN[m
[31m-    if type1 == "number" and val1 ~= val1 and val2 ~= val2 then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    if type1 ~= "table" then[m
[31m-        return val1 == val2[m
[31m-    end[m
[31m-[m
[31m-    -- check_keys stores all the keys that must be checked in val2[m
[31m-    local check_keys = {}[m
[31m-    for k, _ in pairs(val1) do[m
[31m-        check_keys[k] = true[m
[31m-    end[m
[31m-[m
[31m-    for k, v in pairs(val2) do[m
[31m-        if not check_keys[k] then[m
[31m-            return false[m
[31m-        end[m
[31m-[m
[31m-        if not compare_values(val1[k], val2[k]) then[m
[31m-            return false[m
[31m-        end[m
[31m-[m
[31m-        check_keys[k] = nil[m
[31m-    end[m
[31m-    for k, _ in pairs(check_keys) do[m
[31m-        -- Not the same if any keys from val1 were not found in val2[m
[31m-        return false[m
[31m-    end[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local test_count_pass = 0[m
[31m-local test_count_total = 0[m
[31m-[m
[31m-local function run_test_summary()[m
[31m-    return test_count_pass, test_count_total[m
[31m-end[m
[31m-[m
[31m-local function run_test(testname, func, input, should_work, output)[m
[31m-    local function status_line(name, status, value)[m
[31m-        local statusmap = { [true] = ":success", [false] = ":error" }[m
[31m-        if status ~= nil then[m
[31m-            name = name .. statusmap[status][m
[31m-        end[m
[31m-        print(("[%s] %s"):format(name, serialise_value(value, false)))[m
[31m-    end[m
[31m-[m
[31m-    local result = { pcall(func, unpack(input)) }[m
[31m-    local success = table.remove(result, 1)[m
[31m-[m
[31m-    local correct = false[m
[31m-    if success == should_work and compare_values(result, output) then[m
[31m-        correct = true[m
[31m-        test_count_pass = test_count_pass + 1[m
[31m-    end[m
[31m-    test_count_total = test_count_total + 1[m
[31m-[m
[31m-    local teststatus = { [true] = "PASS", [false] = "FAIL" }[m
[31m-    print(("==> Test [%d] %s: %s"):format(test_count_total, testname,[m
[31m-                                          teststatus[correct]))[m
[31m-[m
[31m-    status_line("Input", nil, input)[m
[31m-    if not correct then[m
[31m-        status_line("Expected", should_work, output)[m
[31m-    end[m
[31m-    status_line("Received", success, result)[m
[31m-    print()[m
[31m-[m
[31m-    return correct, result[m
[31m-end[m
[31m-[m
[31m-local function run_test_group(tests)[m
[31m-    local function run_helper(name, func, input)[m
[31m-        if type(name) == "string" and #name > 0 then[m
[31m-            print("==> " .. name)[m
[31m-        end[m
[31m-        -- Not a protected call, these functions should never generate errors.[m
[31m-        func(unpack(input or {}))[m
[31m-        print()[m
[31m-    end[m
[31m-[m
[31m-    for _, v in ipairs(tests) do[m
[31m-        -- Run the helper if "should_work" is missing[m
[31m-        if v[4] == nil then[m
[31m-            run_helper(unpack(v))[m
[31m-        else[m
[31m-            run_test(unpack(v))[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- Run a Lua script in a separate environment[m
[31m-local function run_script(script, env)[m
[31m-    local env = env or {}[m
[31m-    local func[m
[31m-[m
[31m-    -- Use setfenv() if it exists, otherwise assume Lua 5.2 load() exists[m
[31m-    if _G.setfenv then[m
[31m-        func = loadstring(script)[m
[31m-        if func then[m
[31m-            setfenv(func, env)[m
[31m-        end[m
[31m-    else[m
[31m-        func = load(script, nil, nil, env)[m
[31m-    end[m
[31m-[m
[31m-    if func == nil then[m
[31m-            error("Invalid syntax.")[m
[31m-    end[m
[31m-    func()[m
[31m-[m
[31m-    return env[m
[31m-end[m
[31m-[m
[31m--- Export functions[m
[31m-return {[m
[31m-    serialise_value = serialise_value,[m
[31m-    file_load = file_load,[m
[31m-    file_save = file_save,[m
[31m-    compare_values = compare_values,[m
[31m-    run_test_summary = run_test_summary,[m
[31m-    run_test = run_test,[m
[31m-    run_test_group = run_test_group,[m
[31m-    run_script = run_script[m
[31m-}[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/json2lua.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/json2lua.lua[m
[1mdeleted file mode 100755[m
[1mindex 014416d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/json2lua.lua[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-#!/usr/bin/env lua[m
[31m-[m
[31m--- usage: json2lua.lua [json_file][m
[31m---[m
[31m--- Eg:[m
[31m--- echo '[ "testing" ]' | ./json2lua.lua[m
[31m--- ./json2lua.lua test.json[m
[31m-[m
[31m-local json = require "cjson"[m
[31m-local util = require "cjson.util"[m
[31m-[m
[31m-local json_text = util.file_load(arg[1])[m
[31m-local t = json.decode(json_text)[m
[31m-print(util.serialise_value(t))[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/lua2json.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/lua2json.lua[m
[1mdeleted file mode 100755[m
[1mindex aee8869..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua/lua2json.lua[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-#!/usr/bin/env lua[m
[31m-[m
[31m--- usage: lua2json.lua [lua_file][m
[31m---[m
[31m--- Eg:[m
[31m--- echo '{ "testing" }' | ./lua2json.lua[m
[31m--- ./lua2json.lua test.lua[m
[31m-[m
[31m-local json = require "cjson"[m
[31m-local util = require "cjson.util"[m
[31m-[m
[31m-local env = {[m
[31m-    json = { null = json.null },[m
[31m-    null = json.null[m
[31m-}[m
[31m-[m
[31m-local t = util.run_script("data = " .. util.file_load(arg[1]), env)[m
[31m-print(json.encode(t.data))[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua_cjson.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua_cjson.c[m
[1mdeleted file mode 100644[m
[1mindex 5f4faf2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua_cjson.c[m
[1m+++ /dev/null[m
[36m@@ -1,1476 +0,0 @@[m
[31m-/* Lua CJSON - JSON support for Lua[m
[31m- *[m
[31m- * Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m- *[m
[31m- * Permission is hereby granted, free of charge, to any person obtaining[m
[31m- * a copy of this software and associated documentation files (the[m
[31m- * "Software"), to deal in the Software without restriction, including[m
[31m- * without limitation the rights to use, copy, modify, merge, publish,[m
[31m- * distribute, sublicense, and/or sell copies of the Software, and to[m
[31m- * permit persons to whom the Software is furnished to do so, subject to[m
[31m- * the following conditions:[m
[31m- *[m
[31m- * The above copyright notice and this permission notice shall be[m
[31m- * included in all copies or substantial portions of the Software.[m
[31m- *[m
[31m- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m- */[m
[31m-[m
[31m-/* Caveats:[m
[31m- * - JSON "null" values are represented as lightuserdata since Lua[m
[31m- *   tables cannot contain "nil". Compare with cjson.null.[m
[31m- * - Invalid UTF-8 characters are not detected and will be passed[m
[31m- *   untouched. If required, UTF-8 error checking should be done[m
[31m- *   outside this library.[m
[31m- * - Javascript comments are not part of the JSON spec, and are not[m
[31m- *   currently supported.[m
[31m- *[m
[31m- * Note: Decoding is slower than encoding. Lua spends significant[m
[31m- *       time (30%) managing tables when parsing JSON since it is[m
[31m- *       difficult to know object/array sizes ahead of time.[m
[31m- */[m
[31m-[m
[31m-#include <assert.h>[m
[31m-#include <string.h>[m
[31m-#include <math.h>[m
[31m-#include <limits.h>[m
[31m-#include <lua.h>[m
[31m-#include <lauxlib.h>[m
[31m-[m
[31m-#include "strbuf.h"[m
[31m-#include "fpconv.h"[m
[31m-[m
[31m-#ifndef CJSON_MODNAME[m
[31m-#define CJSON_MODNAME   "cjson"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CJSON_VERSION[m
[31m-#define CJSON_VERSION   "2.1devel"[m
[31m-#endif[m
[31m-[m
[31m-/* Workaround for Solaris platforms missing isinf() */[m
[31m-#if !defined(isinf) && (defined(USE_INTERNAL_ISINF) || defined(MISSING_ISINF))[m
[31m-#define isinf(x) (!isnan(x) && isnan((x) - (x)))[m
[31m-#endif[m
[31m-[m
[31m-#define DEFAULT_SPARSE_CONVERT 0[m
[31m-#define DEFAULT_SPARSE_RATIO 2[m
[31m-#define DEFAULT_SPARSE_SAFE 10[m
[31m-#define DEFAULT_ENCODE_MAX_DEPTH 1000[m
[31m-#define DEFAULT_DECODE_MAX_DEPTH 1000[m
[31m-#define DEFAULT_ENCODE_INVALID_NUMBERS 0[m
[31m-#define DEFAULT_DECODE_INVALID_NUMBERS 1[m
[31m-#define DEFAULT_ENCODE_KEEP_BUFFER 1[m
[31m-#define DEFAULT_ENCODE_NUMBER_PRECISION 14[m
[31m-#define DEFAULT_ENCODE_EMPTY_TABLE_AS_OBJECT 1[m
[31m-[m
[31m-#ifdef DISABLE_INVALID_NUMBERS[m
[31m-#undef DEFAULT_DECODE_INVALID_NUMBERS[m
[31m-#define DEFAULT_DECODE_INVALID_NUMBERS 0[m
[31m-#endif[m
[31m-[m
[31m-static const char * const *json_empty_array;[m
[31m-[m
[31m-typedef enum {[m
[31m-    T_OBJ_BEGIN,[m
[31m-    T_OBJ_END,[m
[31m-    T_ARR_BEGIN,[m
[31m-    T_ARR_END,[m
[31m-    T_STRING,[m
[31m-    T_NUMBER,[m
[31m-    T_BOOLEAN,[m
[31m-    T_NULL,[m
[31m-    T_COLON,[m
[31m-    T_COMMA,[m
[31m-    T_END,[m
[31m-    T_WHITESPACE,[m
[31m-    T_ERROR,[m
[31m-    T_UNKNOWN[m
[31m-} json_token_type_t;[m
[31m-[m
[31m-static const char *json_token_type_name[] = {[m
[31m-    "T_OBJ_BEGIN",[m
[31m-    "T_OBJ_END",[m
[31m-    "T_ARR_BEGIN",[m
[31m-    "T_ARR_END",[m
[31m-    "T_STRING",[m
[31m-    "T_NUMBER",[m
[31m-    "T_BOOLEAN",[m
[31m-    "T_NULL",[m
[31m-    "T_COLON",[m
[31m-    "T_COMMA",[m
[31m-    "T_END",[m
[31m-    "T_WHITESPACE",[m
[31m-    "T_ERROR",[m
[31m-    "T_UNKNOWN",[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-typedef struct {[m
[31m-    json_token_type_t ch2token[256];[m
[31m-    char escape2char[256];  /* Decoding */[m
[31m-[m
[31m-    /* encode_buf is only allocated and used when[m
[31m-     * encode_keep_buffer is set */[m
[31m-    strbuf_t encode_buf;[m
[31m-[m
[31m-    int encode_sparse_convert;[m
[31m-    int encode_sparse_ratio;[m
[31m-    int encode_sparse_safe;[m
[31m-    int encode_max_depth;[m
[31m-    int encode_invalid_numbers;     /* 2 => Encode as "null" */[m
[31m-    int encode_number_precision;[m
[31m-    int encode_keep_buffer;[m
[31m-    int encode_empty_table_as_object;[m
[31m-[m
[31m-    int decode_invalid_numbers;[m
[31m-    int decode_max_depth;[m
[31m-} json_config_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    const char *data;[m
[31m-    const char *ptr;[m
[31m-    strbuf_t *tmp;    /* Temporary storage for strings */[m
[31m-    json_config_t *cfg;[m
[31m-    int current_depth;[m
[31m-} json_parse_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    json_token_type_t type;[m
[31m-    int index;[m
[31m-    union {[m
[31m-        const char *string;[m
[31m-        double number;[m
[31m-        int boolean;[m
[31m-    } value;[m
[31m-    int string_len;[m
[31m-} json_token_t;[m
[31m-[m
[31m-static const char *char2escape[256] = {[m
[31m-    "\\u0000", "\\u0001", "\\u0002", "\\u0003",[m
[31m-    "\\u0004", "\\u0005", "\\u0006", "\\u0007",[m
[31m-    "\\b", "\\t", "\\n", "\\u000b",[m
[31m-    "\\f", "\\r", "\\u000e", "\\u000f",[m
[31m-    "\\u0010", "\\u0011", "\\u0012", "\\u0013",[m
[31m-    "\\u0014", "\\u0015", "\\u0016", "\\u0017",[m
[31m-    "\\u0018", "\\u0019", "\\u001a", "\\u001b",[m
[31m-    "\\u001c", "\\u001d", "\\u001e", "\\u001f",[m
[31m-    NULL, NULL, "\\\"", NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, "\\/",[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, "\\\\", NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, "\\u007f",[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-};[m
[31m-[m
[31m-/* ===== CONFIGURATION ===== */[m
[31m-[m
[31m-static json_config_t *json_fetch_config(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg;[m
[31m-[m
[31m-    cfg = lua_touserdata(l, lua_upvalueindex(1));[m
[31m-    if (!cfg)[m
[31m-        luaL_error(l, "BUG: Unable to fetch CJSON configuration");[m
[31m-[m
[31m-    return cfg;[m
[31m-}[m
[31m-[m
[31m-/* Ensure the correct number of arguments have been provided.[m
[31m- * Pad with nil to allow other functions to simply check arg[i][m
[31m- * to find whether an argument was provided */[m
[31m-static json_config_t *json_arg_init(lua_State *l, int args)[m
[31m-{[m
[31m-    luaL_argcheck(l, lua_gettop(l) <= args, args + 1,[m
[31m-                  "found too many arguments");[m
[31m-[m
[31m-    while (lua_gettop(l) < args)[m
[31m-        lua_pushnil(l);[m
[31m-[m
[31m-    return json_fetch_config(l);[m
[31m-}[m
[31m-[m
[31m-/* Process integer options for configuration functions */[m
[31m-static int json_integer_option(lua_State *l, int optindex, int *setting,[m
[31m-                               int min, int max)[m
[31m-{[m
[31m-    char errmsg[64];[m
[31m-    int value;[m
[31m-[m
[31m-    if (!lua_isnil(l, optindex)) {[m
[31m-        value = luaL_checkinteger(l, optindex);[m
[31m-        snprintf(errmsg, sizeof(errmsg), "expected integer between %d and %d", min, max);[m
[31m-        luaL_argcheck(l, min <= value && value <= max, 1, errmsg);[m
[31m-        *setting = value;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(l, *setting);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* Process enumerated arguments for a configuration function */[m
[31m-static int json_enum_option(lua_State *l, int optindex, int *setting,[m
[31m-                            const char **options, int bool_true)[m
[31m-{[m
[31m-    static const char *bool_options[] = { "off", "on", NULL };[m
[31m-[m
[31m-    if (!options) {[m
[31m-        options = bool_options;[m
[31m-        bool_true = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!lua_isnil(l, optindex)) {[m
[31m-        if (bool_true && lua_isboolean(l, optindex))[m
[31m-            *setting = lua_toboolean(l, optindex) * bool_true;[m
[31m-        else[m
[31m-            *setting = luaL_checkoption(l, optindex, NULL, options);[m
[31m-    }[m
[31m-[m
[31m-    if (bool_true && (*setting == 0 || *setting == bool_true))[m
[31m-        lua_pushboolean(l, *setting);[m
[31m-    else[m
[31m-        lua_pushstring(l, options[*setting]);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* Configures handling of extremely sparse arrays:[m
[31m- * convert: Convert extremely sparse arrays into objects? Otherwise error.[m
[31m- * ratio: 0: always allow sparse; 1: never allow sparse; >1: use ratio[m
[31m- * safe: Always use an array when the max index <= safe */[m
[31m-static int json_cfg_encode_sparse_array(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 3);[m
[31m-[m
[31m-    json_enum_option(l, 1, &cfg->encode_sparse_convert, NULL, 1);[m
[31m-    json_integer_option(l, 2, &cfg->encode_sparse_ratio, 0, INT_MAX);[m
[31m-    json_integer_option(l, 3, &cfg->encode_sparse_safe, 0, INT_MAX);[m
[31m-[m
[31m-    return 3;[m
[31m-}[m
[31m-[m
[31m-/* Configures the maximum number of nested arrays/objects allowed when[m
[31m- * encoding */[m
[31m-static int json_cfg_encode_max_depth(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    return json_integer_option(l, 1, &cfg->encode_max_depth, 1, INT_MAX);[m
[31m-}[m
[31m-[m
[31m-/* Configures the maximum number of nested arrays/objects allowed when[m
[31m- * encoding */[m
[31m-static int json_cfg_decode_max_depth(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    return json_integer_option(l, 1, &cfg->decode_max_depth, 1, INT_MAX);[m
[31m-}[m
[31m-[m
[31m-/* Configures number precision when converting doubles to text */[m
[31m-static int json_cfg_encode_number_precision(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    return json_integer_option(l, 1, &cfg->encode_number_precision, 1, 16);[m
[31m-}[m
[31m-[m
[31m-/* Configures how to treat empty table when encode lua table */[m
[31m-static int json_cfg_encode_empty_table_as_object(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    return json_enum_option(l, 1, &cfg->encode_empty_table_as_object, NULL, 1);[m
[31m-}[m
[31m-[m
[31m-/* Configures JSON encoding buffer persistence */[m
[31m-static int json_cfg_encode_keep_buffer(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-    int old_value;[m
[31m-[m
[31m-    old_value = cfg->encode_keep_buffer;[m
[31m-[m
[31m-    json_enum_option(l, 1, &cfg->encode_keep_buffer, NULL, 1);[m
[31m-[m
[31m-    /* Init / free the buffer if the setting has changed */[m
[31m-    if (old_value ^ cfg->encode_keep_buffer) {[m
[31m-        if (cfg->encode_keep_buffer)[m
[31m-            strbuf_init(&cfg->encode_buf, 0);[m
[31m-        else[m
[31m-            strbuf_free(&cfg->encode_buf);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-#if defined(DISABLE_INVALID_NUMBERS) && !defined(USE_INTERNAL_FPCONV)[m
[31m-void json_verify_invalid_number_setting(lua_State *l, int *setting)[m
[31m-{[m
[31m-    if (*setting == 1) {[m
[31m-        *setting = 0;[m
[31m-        luaL_error(l, "Infinity, NaN, and/or hexadecimal numbers are not supported.");[m
[31m-    }[m
[31m-}[m
[31m-#else[m
[31m-#define json_verify_invalid_number_setting(l, s)    do { } while(0)[m
[31m-#endif[m
[31m-[m
[31m-static int json_cfg_encode_invalid_numbers(lua_State *l)[m
[31m-{[m
[31m-    static const char *options[] = { "off", "on", "null", NULL };[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    json_enum_option(l, 1, &cfg->encode_invalid_numbers, options, 1);[m
[31m-[m
[31m-    json_verify_invalid_number_setting(l, &cfg->encode_invalid_numbers);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-static int json_cfg_decode_invalid_numbers(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    json_enum_option(l, 1, &cfg->decode_invalid_numbers, NULL, 1);[m
[31m-[m
[31m-    json_verify_invalid_number_setting(l, &cfg->encode_invalid_numbers);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-static int json_destroy_config(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg;[m
[31m-[m
[31m-    cfg = lua_touserdata(l, 1);[m
[31m-    if (cfg)[m
[31m-        strbuf_free(&cfg->encode_buf);[m
[31m-    cfg = NULL;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-static void json_create_config(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg;[m
[31m-    int i;[m
[31m-[m
[31m-    cfg = lua_newuserdata(l, sizeof(*cfg));[m
[31m-[m
[31m-    /* Create GC method to clean up strbuf */[m
[31m-    lua_newtable(l);[m
[31m-    lua_pushcfunction(l, json_destroy_config);[m
[31m-    lua_setfield(l, -2, "__gc");[m
[31m-    lua_setmetatable(l, -2);[m
[31m-[m
[31m-    cfg->encode_sparse_convert = DEFAULT_SPARSE_CONVERT;[m
[31m-    cfg->encode_sparse_ratio = DEFAULT_SPARSE_RATIO;[m
[31m-    cfg->encode_sparse_safe = DEFAULT_SPARSE_SAFE;[m
[31m-    cfg->encode_max_depth = DEFAULT_ENCODE_MAX_DEPTH;[m
[31m-    cfg->decode_max_depth = DEFAULT_DECODE_MAX_DEPTH;[m
[31m-    cfg->encode_invalid_numbers = DEFAULT_ENCODE_INVALID_NUMBERS;[m
[31m-    cfg->decode_invalid_numbers = DEFAULT_DECODE_INVALID_NUMBERS;[m
[31m-    cfg->encode_keep_buffer = DEFAULT_ENCODE_KEEP_BUFFER;[m
[31m-    cfg->encode_number_precision = DEFAULT_ENCODE_NUMBER_PRECISION;[m
[31m-    cfg->encode_empty_table_as_object = DEFAULT_ENCODE_EMPTY_TABLE_AS_OBJECT;[m
[31m-[m
[31m-#if DEFAULT_ENCODE_KEEP_BUFFER > 0[m
[31m-    strbuf_init(&cfg->encode_buf, 0);[m
[31m-#endif[m
[31m-[m
[31m-    /* Decoding init */[m
[31m-[m
[31m-    /* Tag all characters as an error */[m
[31m-    for (i = 0; i < 256; i++)[m
[31m-        cfg->ch2token[i] = T_ERROR;[m
[31m-[m
[31m-    /* Set tokens that require no further processing */[m
[31m-    cfg->ch2token['{'] = T_OBJ_BEGIN;[m
[31m-    cfg->ch2token['}'] = T_OBJ_END;[m
[31m-    cfg->ch2token['['] = T_ARR_BEGIN;[m
[31m-    cfg->ch2token[']'] = T_ARR_END;[m
[31m-    cfg->ch2token[','] = T_COMMA;[m
[31m-    cfg->ch2token[':'] = T_COLON;[m
[31m-    cfg->ch2token['\0'] = T_END;[m
[31m-    cfg->ch2token[' '] = T_WHITESPACE;[m
[31m-    cfg->ch2token['\t'] = T_WHITESPACE;[m
[31m-    cfg->ch2token['\n'] = T_WHITESPACE;[m
[31m-    cfg->ch2token['\r'] = T_WHITESPACE;[m
[31m-[m
[31m-    /* Update characters that require further processing */[m
[31m-    cfg->ch2token['f'] = T_UNKNOWN;     /* false? */[m
[31m-    cfg->ch2token['i'] = T_UNKNOWN;     /* inf, ininity? */[m
[31m-    cfg->ch2token['I'] = T_UNKNOWN;[m
[31m-    cfg->ch2token['n'] = T_UNKNOWN;     /* null, nan? */[m
[31m-    cfg->ch2token['N'] = T_UNKNOWN;[m
[31m-    cfg->ch2token['t'] = T_UNKNOWN;     /* true? */[m
[31m-    cfg->ch2token['"'] = T_UNKNOWN;     /* string? */[m
[31m-    cfg->ch2token['+'] = T_UNKNOWN;     /* number? */[m
[31m-    cfg->ch2token['-'] = T_UNKNOWN;[m
[31m-    for (i = 0; i < 10; i++)[m
[31m-        cfg->ch2token['0' + i] = T_UNKNOWN;[m
[31m-[m
[31m-    /* Lookup table for parsing escape characters */[m
[31m-    for (i = 0; i < 256; i++)[m
[31m-        cfg->escape2char[i] = 0;          /* String error */[m
[31m-    cfg->escape2char['"'] = '"';[m
[31m-    cfg->escape2char['\\'] = '\\';[m
[31m-    cfg->escape2char['/'] = '/';[m
[31m-    cfg->escape2char['b'] = '\b';[m
[31m-    cfg->escape2char['t'] = '\t';[m
[31m-    cfg->escape2char['n'] = '\n';[m
[31m-    cfg->escape2char['f'] = '\f';[m
[31m-    cfg->escape2char['r'] = '\r';[m
[31m-    cfg->escape2char['u'] = 'u';          /* Unicode parsing required */[m
[31m-}[m
[31m-[m
[31m-/* ===== ENCODING ===== */[m
[31m-[m
[31m-static void json_encode_exception(lua_State *l, json_config_t *cfg, strbuf_t *json, int lindex,[m
[31m-                                  const char *reason)[m
[31m-{[m
[31m-    if (!cfg->encode_keep_buffer)[m
[31m-        strbuf_free(json);[m
[31m-    luaL_error(l, "Cannot serialise %s: %s",[m
[31m-                  lua_typename(l, lua_type(l, lindex)), reason);[m
[31m-}[m
[31m-[m
[31m-/* json_append_string args:[m
[31m- * - lua_State[m
[31m- * - JSON strbuf[m
[31m- * - String (Lua stack index)[m
[31m- *[m
[31m- * Returns nothing. Doesn't remove string from Lua stack */[m
[31m-static void json_append_string(lua_State *l, strbuf_t *json, int lindex)[m
[31m-{[m
[31m-    const char *escstr;[m
[31m-    int i;[m
[31m-    const char *str;[m
[31m-    size_t len;[m
[31m-[m
[31m-    str = lua_tolstring(l, lindex, &len);[m
[31m-[m
[31m-    /* Worst case is len * 6 (all unicode escapes).[m
[31m-     * This buffer is reused constantly for small strings[m
[31m-     * If there are any excess pages, they won't be hit anyway.[m
[31m-     * This gains ~5% speedup. */[m
[31m-    strbuf_ensure_empty_length(json, len * 6 + 2);[m
[31m-[m
[31m-    strbuf_append_char_unsafe(json, '\"');[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        escstr = char2escape[(unsigned char)str[i]];[m
[31m-        if (escstr)[m
[31m-            strbuf_append_string(json, escstr);[m
[31m-        else[m
[31m-            strbuf_append_char_unsafe(json, str[i]);[m
[31m-    }[m
[31m-    strbuf_append_char_unsafe(json, '\"');[m
[31m-}[m
[31m-[m
[31m-/* Find the size of the array on the top of the Lua stack[m
[31m- * -1   object (not a pure array)[m
[31m- * >=0  elements in array[m
[31m- */[m
[31m-static int lua_array_length(lua_State *l, json_config_t *cfg, strbuf_t *json)[m
[31m-{[m
[31m-    double k;[m
[31m-    int max;[m
[31m-    int items;[m
[31m-[m
[31m-    max = 0;[m
[31m-    items = 0;[m
[31m-[m
[31m-    lua_pushnil(l);[m
[31m-    /* table, startkey */[m
[31m-    while (lua_next(l, -2) != 0) {[m
[31m-        /* table, key, value */[m
[31m-        if (lua_type(l, -2) == LUA_TNUMBER &&[m
[31m-            (k = lua_tonumber(l, -2))) {[m
[31m-            /* Integer >= 1 ? */[m
[31m-            if (floor(k) == k && k >= 1) {[m
[31m-                if (k > max)[m
[31m-                    max = k;[m
[31m-                items++;[m
[31m-                lua_pop(l, 1);[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* Must not be an array (non integer key) */[m
[31m-        lua_pop(l, 2);[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    /* Encode excessively sparse arrays as objects (if enabled) */[m
[31m-    if (cfg->encode_sparse_ratio > 0 &&[m
[31m-        max > items * cfg->encode_sparse_ratio &&[m
[31m-        max > cfg->encode_sparse_safe) {[m
[31m-        if (!cfg->encode_sparse_convert)[m
[31m-            json_encode_exception(l, cfg, json, -1, "excessively sparse array");[m
[31m-[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return max;[m
[31m-}[m
[31m-[m
[31m-static void json_check_encode_depth(lua_State *l, json_config_t *cfg,[m
[31m-                                    int current_depth, strbuf_t *json)[m
[31m-{[m
[31m-    /* Ensure there are enough slots free to traverse a table (key,[m
[31m-     * value) and push a string for a potential error message.[m
[31m-     *[m
[31m-     * Unlike "decode", the key and value are still on the stack when[m
[31m-     * lua_checkstack() is called.  Hence an extra slot for luaL_error()[m
[31m-     * below is required just in case the next check to lua_checkstack()[m
[31m-     * fails.[m
[31m-     *[m
[31m-     * While this won't cause a crash due to the EXTRA_STACK reserve[m
[31m-     * slots, it would still be an improper use of the API. */[m
[31m-    if (current_depth <= cfg->encode_max_depth && lua_checkstack(l, 3))[m
[31m-        return;[m
[31m-[m
[31m-    if (!cfg->encode_keep_buffer)[m
[31m-        strbuf_free(json);[m
[31m-[m
[31m-    luaL_error(l, "Cannot serialise, excessive nesting (%d)",[m
[31m-               current_depth);[m
[31m-}[m
[31m-[m
[31m-static void json_append_data(lua_State *l, json_config_t *cfg,[m
[31m-                             int current_depth, strbuf_t *json);[m
[31m-[m
[31m-/* json_append_array args:[m
[31m- * - lua_State[m
[31m- * - JSON strbuf[m
[31m- * - Size of passwd Lua array (top of stack) */[m
[31m-static void json_append_array(lua_State *l, json_config_t *cfg, int current_depth,[m
[31m-                              strbuf_t *json, int array_length)[m
[31m-{[m
[31m-    int comma, i;[m
[31m-[m
[31m-    strbuf_append_char(json, '[');[m
[31m-[m
[31m-    comma = 0;[m
[31m-    for (i = 1; i <= array_length; i++) {[m
[31m-        if (comma)[m
[31m-            strbuf_append_char(json, ',');[m
[31m-        else[m
[31m-            comma = 1;[m
[31m-[m
[31m-        lua_rawgeti(l, -1, i);[m
[31m-        json_append_data(l, cfg, current_depth, json);[m
[31m-        lua_pop(l, 1);[m
[31m-    }[m
[31m-[m
[31m-    strbuf_append_char(json, ']');[m
[31m-}[m
[31m-[m
[31m-static void json_append_number(lua_State *l, json_config_t *cfg,[m
[31m-                               strbuf_t *json, int lindex)[m
[31m-{[m
[31m-    double num = lua_tonumber(l, lindex);[m
[31m-    int len;[m
[31m-[m
[31m-    if (cfg->encode_invalid_numbers == 0) {[m
[31m-        /* Prevent encoding invalid numbers */[m
[31m-        if (isinf(num) || isnan(num))[m
[31m-            json_encode_exception(l, cfg, json, lindex,[m
[31m-                                  "must not be NaN or Infinity");[m
[31m-    } else if (cfg->encode_invalid_numbers == 1) {[m
[31m-        /* Encode NaN/Infinity separately to ensure Javascript compatible[m
[31m-         * values are used. */[m
[31m-        if (isnan(num)) {[m
[31m-            strbuf_append_mem(json, "NaN", 3);[m
[31m-            return;[m
[31m-        }[m
[31m-        if (isinf(num)) {[m
[31m-            if (num < 0)[m
[31m-                strbuf_append_mem(json, "-Infinity", 9);[m
[31m-            else[m
[31m-                strbuf_append_mem(json, "Infinity", 8);[m
[31m-            return;[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* Encode invalid numbers as "null" */[m
[31m-        if (isinf(num) || isnan(num)) {[m
[31m-            strbuf_append_mem(json, "null", 4);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    strbuf_ensure_empty_length(json, FPCONV_G_FMT_BUFSIZE);[m
[31m-    len = fpconv_g_fmt(strbuf_empty_ptr(json), num, cfg->encode_number_precision);[m
[31m-    strbuf_extend_length(json, len);[m
[31m-}[m
[31m-[m
[31m-static void json_append_object(lua_State *l, json_config_t *cfg,[m
[31m-                               int current_depth, strbuf_t *json)[m
[31m-{[m
[31m-    int comma, keytype;[m
[31m-[m
[31m-    /* Object */[m
[31m-    strbuf_append_char(json, '{');[m
[31m-[m
[31m-    lua_pushnil(l);[m
[31m-    /* table, startkey */[m
[31m-    comma = 0;[m
[31m-    while (lua_next(l, -2) != 0) {[m
[31m-        if (comma)[m
[31m-            strbuf_append_char(json, ',');[m
[31m-        else[m
[31m-            comma = 1;[m
[31m-[m
[31m-        /* table, key, value */[m
[31m-        keytype = lua_type(l, -2);[m
[31m-        if (keytype == LUA_TNUMBER) {[m
[31m-            strbuf_append_char(json, '"');[m
[31m-            json_append_number(l, cfg, json, -2);[m
[31m-            strbuf_append_mem(json, "\":", 2);[m
[31m-        } else if (keytype == LUA_TSTRING) {[m
[31m-            json_append_string(l, json, -2);[m
[31m-            strbuf_append_char(json, ':');[m
[31m-        } else {[m
[31m-            json_encode_exception(l, cfg, json, -2,[m
[31m-                                  "table key must be a number or string");[m
[31m-            /* never returns */[m
[31m-        }[m
[31m-[m
[31m-        /* table, key, value */[m
[31m-        json_append_data(l, cfg, current_depth, json);[m
[31m-        lua_pop(l, 1);[m
[31m-        /* table, key */[m
[31m-    }[m
[31m-[m
[31m-    strbuf_append_char(json, '}');[m
[31m-}[m
[31m-[m
[31m-/* Serialise Lua data into JSON string. */[m
[31m-static void json_append_data(lua_State *l, json_config_t *cfg,[m
[31m-                             int current_depth, strbuf_t *json)[m
[31m-{[m
[31m-    int len;[m
[31m-[m
[31m-    switch (lua_type(l, -1)) {[m
[31m-    case LUA_TSTRING:[m
[31m-        json_append_string(l, json, -1);[m
[31m-        break;[m
[31m-    case LUA_TNUMBER:[m
[31m-        json_append_number(l, cfg, json, -1);[m
[31m-        break;[m
[31m-    case LUA_TBOOLEAN:[m
[31m-        if (lua_toboolean(l, -1))[m
[31m-            strbuf_append_mem(json, "true", 4);[m
[31m-        else[m
[31m-            strbuf_append_mem(json, "false", 5);[m
[31m-        break;[m
[31m-    case LUA_TTABLE:[m
[31m-        current_depth++;[m
[31m-        json_check_encode_depth(l, cfg, current_depth, json);[m
[31m-        len = lua_array_length(l, cfg, json);[m
[31m-        if (len > 0 || (len == 0 && !cfg->encode_empty_table_as_object))[m
[31m-            json_append_array(l, cfg, current_depth, json, len);[m
[31m-        else {[m
[31m-            int as_array = 0;[m
[31m-            if (lua_getmetatable(l, -1)) {[m
[31m-                lua_pushlightuserdata(l, &json_empty_array);[m
[31m-                lua_rawget(l, LUA_REGISTRYINDEX);[m
[31m-                as_array = lua_rawequal(l, -1, -2);[m
[31m-                lua_pop(l, 2);[m
[31m-            }[m
[31m-[m
[31m-            if (as_array) {[m
[31m-                json_append_array(l, cfg, current_depth, json, 0);[m
[31m-            } else {[m
[31m-                json_append_object(l, cfg, current_depth, json);[m
[31m-            }[m
[31m-        }[m
[31m-        break;[m
[31m-    case LUA_TNIL:[m
[31m-        strbuf_append_mem(json, "null", 4);[m
[31m-        break;[m
[31m-    case LUA_TLIGHTUSERDATA:[m
[31m-        if (lua_touserdata(l, -1) == NULL) {[m
[31m-            strbuf_append_mem(json, "null", 4);[m
[31m-        } else if (lua_touserdata(l, -1) == &json_empty_array) {[m
[31m-            json_append_array(l, cfg, current_depth, json, 0);[m
[31m-        }[m
[31m-        break;[m
[31m-    default:[m
[31m-        /* Remaining types (LUA_TFUNCTION, LUA_TUSERDATA, LUA_TTHREAD,[m
[31m-         * and LUA_TLIGHTUSERDATA) cannot be serialised */[m
[31m-        json_encode_exception(l, cfg, json, -1, "type not supported");[m
[31m-        /* never returns */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-static int json_encode(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_fetch_config(l);[m
[31m-    strbuf_t local_encode_buf;[m
[31m-    strbuf_t *encode_buf;[m
[31m-    char *json;[m
[31m-    int len;[m
[31m-[m
[31m-    luaL_argcheck(l, lua_gettop(l) == 1, 1, "expected 1 argument");[m
[31m-[m
[31m-    if (!cfg->encode_keep_buffer) {[m
[31m-        /* Use private buffer */[m
[31m-        encode_buf = &local_encode_buf;[m
[31m-        strbuf_init(encode_buf, 0);[m
[31m-    } else {[m
[31m-        /* Reuse existing buffer */[m
[31m-        encode_buf = &cfg->encode_buf;[m
[31m-        strbuf_reset(encode_buf);[m
[31m-    }[m
[31m-[m
[31m-    json_append_data(l, cfg, 0, encode_buf);[m
[31m-    json = strbuf_string(encode_buf, &len);[m
[31m-[m
[31m-    lua_pushlstring(l, json, len);[m
[31m-[m
[31m-    if (!cfg->encode_keep_buffer)[m
[31m-        strbuf_free(encode_buf);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* ===== DECODING ===== */[m
[31m-[m
[31m-static void json_process_value(lua_State *l, json_parse_t *json,[m
[31m-                               json_token_t *token);[m
[31m-[m
[31m-static int hexdigit2int(char hex)[m
[31m-{[m
[31m-    if ('0' <= hex  && hex <= '9')[m
[31m-        return hex - '0';[m
[31m-[m
[31m-    /* Force lowercase */[m
[31m-    hex |= 0x20;[m
[31m-    if ('a' <= hex && hex <= 'f')[m
[31m-        return 10 + hex - 'a';[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-static int decode_hex4(const char *hex)[m
[31m-{[m
[31m-    int digit[4];[m
[31m-    int i;[m
[31m-[m
[31m-    /* Convert ASCII hex digit to numeric digit[m
[31m-     * Note: this returns an error for invalid hex digits, including[m
[31m-     *       NULL */[m
[31m-    for (i = 0; i < 4; i++) {[m
[31m-        digit[i] = hexdigit2int(hex[i]);[m
[31m-        if (digit[i] < 0) {[m
[31m-            return -1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return (digit[0] << 12) +[m
[31m-           (digit[1] << 8) +[m
[31m-           (digit[2] << 4) +[m
[31m-            digit[3];[m
[31m-}[m
[31m-[m
[31m-/* Converts a Unicode codepoint to UTF-8.[m
[31m- * Returns UTF-8 string length, and up to 4 bytes in *utf8 */[m
[31m-static int codepoint_to_utf8(char *utf8, int codepoint)[m
[31m-{[m
[31m-    /* 0xxxxxxx */[m
[31m-    if (codepoint <= 0x7F) {[m
[31m-        utf8[0] = codepoint;[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* 110xxxxx 10xxxxxx */[m
[31m-    if (codepoint <= 0x7FF) {[m
[31m-        utf8[0] = (codepoint >> 6) | 0xC0;[m
[31m-        utf8[1] = (codepoint & 0x3F) | 0x80;[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* 1110xxxx 10xxxxxx 10xxxxxx */[m
[31m-    if (codepoint <= 0xFFFF) {[m
[31m-        utf8[0] = (codepoint >> 12) | 0xE0;[m
[31m-        utf8[1] = ((codepoint >> 6) & 0x3F) | 0x80;[m
[31m-        utf8[2] = (codepoint & 0x3F) | 0x80;[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-    /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */[m
[31m-    if (codepoint <= 0x1FFFFF) {[m
[31m-        utf8[0] = (codepoint >> 18) | 0xF0;[m
[31m-        utf8[1] = ((codepoint >> 12) & 0x3F) | 0x80;[m
[31m-        utf8[2] = ((codepoint >> 6) & 0x3F) | 0x80;[m
[31m-        utf8[3] = (codepoint & 0x3F) | 0x80;[m
[31m-        return 4;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Called when index pointing to beginning of UTF-16 code escape: \uXXXX[m
[31m- * \u is guaranteed to exist, but the remaining hex characters may be[m
[31m- * missing.[m
[31m- * Translate to UTF-8 and append to temporary token string.[m
[31m- * Must advance index to the next character to be processed.[m
[31m- * Returns: 0   success[m
[31m- *          -1  error[m
[31m- */[m
[31m-static int json_append_unicode_escape(json_parse_t *json)[m
[31m-{[m
[31m-    char utf8[4];       /* Surrogate pairs require 4 UTF-8 bytes */[m
[31m-    int codepoint;[m
[31m-    int surrogate_low;[m
[31m-    int len;[m
[31m-    int escape_len = 6;[m
[31m-[m
[31m-    /* Fetch UTF-16 code unit */[m
[31m-    codepoint = decode_hex4(json->ptr + 2);[m
[31m-    if (codepoint < 0)[m
[31m-        return -1;[m
[31m-[m
[31m-    /* UTF-16 surrogate pairs take the following 2 byte form:[m
[31m-     *      11011 x yyyyyyyyyy[m
[31m-     * When x = 0: y is the high 10 bits of the codepoint[m
[31m-     *      x = 1: y is the low 10 bits of the codepoint[m
[31m-     *[m
[31m-     * Check for a surrogate pair (high or low) */[m
[31m-    if ((codepoint & 0xF800) == 0xD800) {[m
[31m-        /* Error if the 1st surrogate is not high */[m
[31m-        if (codepoint & 0x400)[m
[31m-            return -1;[m
[31m-[m
[31m-        /* Ensure the next code is a unicode escape */[m
[31m-        if (*(json->ptr + escape_len) != '\\' ||[m
[31m-            *(json->ptr + escape_len + 1) != 'u') {[m
[31m-            return -1;[m
[31m-        }[m
[31m-[m
[31m-        /* Fetch the next codepoint */[m
[31m-        surrogate_low = decode_hex4(json->ptr + 2 + escape_len);[m
[31m-        if (surrogate_low < 0)[m
[31m-            return -1;[m
[31m-[m
[31m-        /* Error if the 2nd code is not a low surrogate */[m
[31m-        if ((surrogate_low & 0xFC00) != 0xDC00)[m
[31m-            return -1;[m
[31m-[m
[31m-        /* Calculate Unicode codepoint */[m
[31m-        codepoint = (codepoint & 0x3FF) << 10;[m
[31m-        surrogate_low &= 0x3FF;[m
[31m-        codepoint = (codepoint | surrogate_low) + 0x10000;[m
[31m-        escape_len = 12;[m
[31m-    }[m
[31m-[m
[31m-    /* Convert codepoint to UTF-8 */[m
[31m-    len = codepoint_to_utf8(utf8, codepoint);[m
[31m-    if (!len)[m
[31m-        return -1;[m
[31m-[m
[31m-    /* Append bytes and advance parse index */[m
[31m-    strbuf_append_mem_unsafe(json->tmp, utf8, len);[m
[31m-    json->ptr += escape_len;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-static void json_set_token_error(json_token_t *token, json_parse_t *json,[m
[31m-                                 const char *errtype)[m
[31m-{[m
[31m-    token->type = T_ERROR;[m
[31m-    token->index = json->ptr - json->data;[m
[31m-    token->value.string = errtype;[m
[31m-}[m
[31m-[m
[31m-static void json_next_string_token(json_parse_t *json, json_token_t *token)[m
[31m-{[m
[31m-    char *escape2char = json->cfg->escape2char;[m
[31m-    char ch;[m
[31m-[m
[31m-    /* Caller must ensure a string is next */[m
[31m-    assert(*json->ptr == '"');[m
[31m-[m
[31m-    /* Skip " */[m
[31m-    json->ptr++;[m
[31m-[m
[31m-    /* json->tmp is the temporary strbuf used to accumulate the[m
[31m-     * decoded string value.[m
[31m-     * json->tmp is sized to handle JSON containing only a string value.[m
[31m-     */[m
[31m-    strbuf_reset(json->tmp);[m
[31m-[m
[31m-    while ((ch = *json->ptr) != '"') {[m
[31m-        if (!ch) {[m
[31m-            /* Premature end of the string */[m
[31m-            json_set_token_error(token, json, "unexpected end of string");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* Handle escapes */[m
[31m-        if (ch == '\\') {[m
[31m-            /* Fetch escape character */[m
[31m-            ch = *(json->ptr + 1);[m
[31m-[m
[31m-            /* Translate escape code and append to tmp string */[m
[31m-            ch = escape2char[(unsigned char)ch];[m
[31m-            if (ch == 'u') {[m
[31m-                if (json_append_unicode_escape(json) == 0)[m
[31m-                    continue;[m
[31m-[m
[31m-                json_set_token_error(token, json,[m
[31m-                                     "invalid unicode escape code");[m
[31m-                return;[m
[31m-            }[m
[31m-            if (!ch) {[m
[31m-                json_set_token_error(token, json, "invalid escape code");[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            /* Skip '\' */[m
[31m-            json->ptr++;[m
[31m-        }[m
[31m-        /* Append normal character or translated single character[m
[31m-         * Unicode escapes are handled above */[m
[31m-        strbuf_append_char_unsafe(json->tmp, ch);[m
[31m-        json->ptr++;[m
[31m-    }[m
[31m-    json->ptr++;    /* Eat final quote (") */[m
[31m-[m
[31m-    strbuf_ensure_null(json->tmp);[m
[31m-[m
[31m-    token->type = T_STRING;[m
[31m-    token->value.string = strbuf_string(json->tmp, &token->string_len);[m
[31m-}[m
[31m-[m
[31m-/* JSON numbers should take the following form:[m
[31m- *      -?(0|[1-9]|[1-9][0-9]+)(.[0-9]+)?([eE][-+]?[0-9]+)?[m
[31m- *[m
[31m- * json_next_number_token() uses strtod() which allows other forms:[m
[31m- * - numbers starting with '+'[m
[31m- * - NaN, -NaN, infinity, -infinity[m
[31m- * - hexadecimal numbers[m
[31m- * - numbers with leading zeros[m
[31m- *[m
[31m- * json_is_invalid_number() detects "numbers" which may pass strtod()'s[m
[31m- * error checking, but should not be allowed with strict JSON.[m
[31m- *[m
[31m- * json_is_invalid_number() may pass numbers which cause strtod()[m
[31m- * to generate an error.[m
[31m- */[m
[31m-static int json_is_invalid_number(json_parse_t *json)[m
[31m-{[m
[31m-    const char *p = json->ptr;[m
[31m-[m
[31m-    /* Reject numbers starting with + */[m
[31m-    if (*p == '+')[m
[31m-        return 1;[m
[31m-[m
[31m-    /* Skip minus sign if it exists */[m
[31m-    if (*p == '-')[m
[31m-        p++;[m
[31m-[m
[31m-    /* Reject numbers starting with 0x, or leading zeros */[m
[31m-    if (*p == '0') {[m
[31m-        int ch2 = *(p + 1);[m
[31m-[m
[31m-        if ((ch2 | 0x20) == 'x' ||          /* Hex */[m
[31m-            ('0' <= ch2 && ch2 <= '9'))     /* Leading zero */[m
[31m-            return 1;[m
[31m-[m
[31m-        return 0;[m
[31m-    } else if (*p <= '9') {[m
[31m-        return 0;                           /* Ordinary number */[m
[31m-    }[m
[31m-[m
[31m-    /* Reject inf/nan */[m
[31m-    if (!strncasecmp(p, "inf", 3))[m
[31m-        return 1;[m
[31m-    if (!strncasecmp(p, "nan", 3))[m
[31m-        return 1;[m
[31m-[m
[31m-    /* Pass all other numbers which may still be invalid, but[m
[31m-     * strtod() will catch them. */[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-static void json_next_number_token(json_parse_t *json, json_token_t *token)[m
[31m-{[m
[31m-    char *endptr;[m
[31m-[m
[31m-    token->type = T_NUMBER;[m
[31m-    token->value.number = fpconv_strtod(json->ptr, &endptr);[m
[31m-    if (json->ptr == endptr)[m
[31m-        json_set_token_error(token, json, "invalid number");[m
[31m-    else[m
[31m-        json->ptr = endptr;     /* Skip the processed number */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-/* Fills in the token struct.[m
[31m- * T_STRING will return a pointer to the json_parse_t temporary string[m
[31m- * T_ERROR will leave the json->ptr pointer at the error.[m
[31m- */[m
[31m-static void json_next_token(json_parse_t *json, json_token_t *token)[m
[31m-{[m
[31m-    const json_token_type_t *ch2token = json->cfg->ch2token;[m
[31m-    int ch;[m
[31m-[m
[31m-    /* Eat whitespace. */[m
[31m-    while (1) {[m
[31m-        ch = (unsigned char)*(json->ptr);[m
[31m-        token->type = ch2token[ch];[m
[31m-        if (token->type != T_WHITESPACE)[m
[31m-            break;[m
[31m-        json->ptr++;[m
[31m-    }[m
[31m-[m
[31m-    /* Store location of new token. Required when throwing errors[m
[31m-     * for unexpected tokens (syntax errors). */[m
[31m-    token->index = json->ptr - json->data;[m
[31m-[m
[31m-    /* Don't advance the pointer for an error or the end */[m
[31m-    if (token->type == T_ERROR) {[m
[31m-        json_set_token_error(token, json, "invalid token");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (token->type == T_END) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* Found a known single character token, advance index and return */[m
[31m-    if (token->type != T_UNKNOWN) {[m
[31m-        json->ptr++;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* Process characters which triggered T_UNKNOWN[m
[31m-     *[m
[31m-     * Must use strncmp() to match the front of the JSON string.[m
[31m-     * JSON identifier must be lowercase.[m
[31m-     * When strict_numbers if disabled, either case is allowed for[m
[31m-     * Infinity/NaN (since we are no longer following the spec..) */[m
[31m-    if (ch == '"') {[m
[31m-        json_next_string_token(json, token);[m
[31m-        return;[m
[31m-    } else if (ch == '-' || ('0' <= ch && ch <= '9')) {[m
[31m-        if (!json->cfg->decode_invalid_numbers && json_is_invalid_number(json)) {[m
[31m-            json_set_token_error(token, json, "invalid number");[m
[31m-            return;[m
[31m-        }[m
[31m-        json_next_number_token(json, token);[m
[31m-        return;[m
[31m-    } else if (!strncmp(json->ptr, "true", 4)) {[m
[31m-        token->type = T_BOOLEAN;[m
[31m-        token->value.boolean = 1;[m
[31m-        json->ptr += 4;[m
[31m-        return;[m
[31m-    } else if (!strncmp(json->ptr, "false", 5)) {[m
[31m-        token->type = T_BOOLEAN;[m
[31m-        token->value.boolean = 0;[m
[31m-        json->ptr += 5;[m
[31m-        return;[m
[31m-    } else if (!strncmp(json->ptr, "null", 4)) {[m
[31m-        token->type = T_NULL;[m
[31m-        json->ptr += 4;[m
[31m-        return;[m
[31m-    } else if (json->cfg->decode_invalid_numbers &&[m
[31m-               json_is_invalid_number(json)) {[m
[31m-        /* When decode_invalid_numbers is enabled, only attempt to process[m
[31m-         * numbers we know are invalid JSON (Inf, NaN, hex)[m
[31m-         * This is required to generate an appropriate token error,[m
[31m-         * otherwise all bad tokens will register as "invalid number"[m
[31m-         */[m
[31m-        json_next_number_token(json, token);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* Token starts with t/f/n but isn't recognised above. */[m
[31m-    json_set_token_error(token, json, "invalid token");[m
[31m-}[m
[31m-[m
[31m-/* This function does not return.[m
[31m- * DO NOT CALL WITH DYNAMIC MEMORY ALLOCATED.[m
[31m- * The only supported exception is the temporary parser string[m
[31m- * json->tmp struct.[m
[31m- * json and token should exist on the stack somewhere.[m
[31m- * luaL_error() will long_jmp and release the stack */[m
[31m-static void json_throw_parse_error(lua_State *l, json_parse_t *json,[m
[31m-                                   const char *exp, json_token_t *token)[m
[31m-{[m
[31m-    const char *found;[m
[31m-[m
[31m-    strbuf_free(json->tmp);[m
[31m-[m
[31m-    if (token->type == T_ERROR)[m
[31m-        found = token->value.string;[m
[31m-    else[m
[31m-        found = json_token_type_name[token->type];[m
[31m-[m
[31m-    /* Note: token->index is 0 based, display starting from 1 */[m
[31m-    luaL_error(l, "Expected %s but found %s at character %d",[m
[31m-               exp, found, token->index + 1);[m
[31m-}[m
[31m-[m
[31m-static inline void json_decode_ascend(json_parse_t *json)[m
[31m-{[m
[31m-    json->current_depth--;[m
[31m-}[m
[31m-[m
[31m-static void json_decode_descend(lua_State *l, json_parse_t *json, int slots)[m
[31m-{[m
[31m-    json->current_depth++;[m
[31m-[m
[31m-    if (json->current_depth <= json->cfg->decode_max_depth &&[m
[31m-        lua_checkstack(l, slots)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    strbuf_free(json->tmp);[m
[31m-    luaL_error(l, "Found too many nested data structures (%d) at character %d",[m
[31m-        json->current_depth, json->ptr - json->data);[m
[31m-}[m
[31m-[m
[31m-static void json_parse_object_context(lua_State *l, json_parse_t *json)[m
[31m-{[m
[31m-    json_token_t token;[m
[31m-[m
[31m-    /* 3 slots required:[m
[31m-     * .., table, key, value */[m
[31m-    json_decode_descend(l, json, 3);[m
[31m-[m
[31m-    lua_newtable(l);[m
[31m-[m
[31m-    json_next_token(json, &token);[m
[31m-[m
[31m-    /* Handle empty objects */[m
[31m-    if (token.type == T_OBJ_END) {[m
[31m-        json_decode_ascend(json);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    while (1) {[m
[31m-        if (token.type != T_STRING)[m
[31m-            json_throw_parse_error(l, json, "object key string", &token);[m
[31m-[m
[31m-        /* Push key */[m
[31m-        lua_pushlstring(l, token.value.string, token.string_len);[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-        if (token.type != T_COLON)[m
[31m-            json_throw_parse_error(l, json, "colon", &token);[m
[31m-[m
[31m-        /* Fetch value */[m
[31m-        json_next_token(json, &token);[m
[31m-        json_process_value(l, json, &token);[m
[31m-[m
[31m-        /* Set key = value */[m
[31m-        lua_rawset(l, -3);[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-[m
[31m-        if (token.type == T_OBJ_END) {[m
[31m-            json_decode_ascend(json);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (token.type != T_COMMA)[m
[31m-            json_throw_parse_error(l, json, "comma or object end", &token);[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* Handle the array context */[m
[31m-static void json_parse_array_context(lua_State *l, json_parse_t *json)[m
[31m-{[m
[31m-    json_token_t token;[m
[31m-    int i;[m
[31m-[m
[31m-    /* 2 slots required:[m
[31m-     * .., table, value */[m
[31m-    json_decode_descend(l, json, 2);[m
[31m-[m
[31m-    lua_newtable(l);[m
[31m-[m
[31m-    json_next_token(json, &token);[m
[31m-[m
[31m-    /* Handle empty arrays */[m
[31m-    if (token.type == T_ARR_END) {[m
[31m-        json_decode_ascend(json);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; ; i++) {[m
[31m-        json_process_value(l, json, &token);[m
[31m-        lua_rawseti(l, -2, i);            /* arr[i] = value */[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-[m
[31m-        if (token.type == T_ARR_END) {[m
[31m-            json_decode_ascend(json);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (token.type != T_COMMA)[m
[31m-            json_throw_parse_error(l, json, "comma or array end", &token);[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* Handle the "value" context */[m
[31m-static void json_process_value(lua_State *l, json_parse_t *json,[m
[31m-                               json_token_t *token)[m
[31m-{[m
[31m-    switch (token->type) {[m
[31m-    case T_STRING:[m
[31m-        lua_pushlstring(l, token->value.string, token->string_len);[m
[31m-        break;;[m
[31m-    case T_NUMBER:[m
[31m-        lua_pushnumber(l, token->value.number);[m
[31m-        break;;[m
[31m-    case T_BOOLEAN:[m
[31m-        lua_pushboolean(l, token->value.boolean);[m
[31m-        break;;[m
[31m-    case T_OBJ_BEGIN:[m
[31m-        json_parse_object_context(l, json);[m
[31m-        break;;[m
[31m-    case T_ARR_BEGIN:[m
[31m-        json_parse_array_context(l, json);[m
[31m-        break;;[m
[31m-    case T_NULL:[m
[31m-        /* In Lua, setting "t[k] = nil" will delete k from the table.[m
[31m-         * Hence a NULL pointer lightuserdata object is used instead */[m
[31m-        lua_pushlightuserdata(l, NULL);[m
[31m-        break;;[m
[31m-    default:[m
[31m-        json_throw_parse_error(l, json, "value", token);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-static int json_decode(lua_State *l)[m
[31m-{[m
[31m-    json_parse_t json;[m
[31m-    json_token_t token;[m
[31m-    size_t json_len;[m
[31m-[m
[31m-    luaL_argcheck(l, lua_gettop(l) == 1, 1, "expected 1 argument");[m
[31m-[m
[31m-    json.cfg = json_fetch_config(l);[m
[31m-    json.data = luaL_checklstring(l, 1, &json_len);[m
[31m-    json.current_depth = 0;[m
[31m-    json.ptr = json.data;[m
[31m-[m
[31m-    /* Detect Unicode other than UTF-8 (see RFC 4627, Sec 3)[m
[31m-     *[m
[31m-     * CJSON can support any simple data type, hence only the first[m
[31m-     * character is guaranteed to be ASCII (at worst: '"'). This is[m
[31m-     * still enough to detect whether the wrong encoding is in use. */[m
[31m-    if (json_len >= 2 && (!json.data[0] || !json.data[1]))[m
[31m-        luaL_error(l, "JSON parser does not support UTF-16 or UTF-32");[m
[31m-[m
[31m-    /* Ensure the temporary buffer can hold the entire string.[m
[31m-     * This means we no longer need to do length checks since the decoded[m
[31m-     * string must be smaller than the entire json string */[m
[31m-    json.tmp = strbuf_new(json_len);[m
[31m-[m
[31m-    json_next_token(&json, &token);[m
[31m-    json_process_value(l, &json, &token);[m
[31m-[m
[31m-    /* Ensure there is no more input left */[m
[31m-    json_next_token(&json, &token);[m
[31m-[m
[31m-    if (token.type != T_END)[m
[31m-        json_throw_parse_error(l, &json, "the end", &token);[m
[31m-[m
[31m-    strbuf_free(json.tmp);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* ===== INITIALISATION ===== */[m
[31m-[m
[31m-#if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502[m
[31m-/* Compatibility for Lua 5.1.[m
[31m- *[m
[31m- * luaL_setfuncs() is used to create a module table where the functions have[m
[31m- * json_config_t as their first upvalue. Code borrowed from Lua 5.2 source. */[m
[31m-static void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)[m
[31m-{[m
[31m-    int i;[m
[31m-[m
[31m-    luaL_checkstack(l, nup, "too many upvalues");[m
[31m-    for (; reg->name != NULL; reg++) {  /* fill the table with given functions */[m
[31m-        for (i = 0; i < nup; i++)  /* copy upvalues to the top */[m
[31m-            lua_pushvalue(l, -nup);[m
[31m-        lua_pushcclosure(l, reg->func, nup);  /* closure with those upvalues */[m
[31m-        lua_setfield(l, -(nup + 2), reg->name);[m
[31m-    }[m
[31m-    lua_pop(l, nup);  /* remove upvalues */[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Call target function in protected mode with all supplied args.[m
[31m- * Assumes target function only returns a single non-nil value.[m
[31m- * Convert and return thrown errors as: nil, "error message" */[m
[31m-static int json_protect_conversion(lua_State *l)[m
[31m-{[m
[31m-    int err;[m
[31m-[m
[31m-    /* Deliberately throw an error for invalid arguments */[m
[31m-    luaL_argcheck(l, lua_gettop(l) == 1, 1, "expected 1 argument");[m
[31m-[m
[31m-    /* pcall() the function stored as upvalue(1) */[m
[31m-    lua_pushvalue(l, lua_upvalueindex(1));[m
[31m-    lua_insert(l, 1);[m
[31m-    err = lua_pcall(l, 1, 1, 0);[m
[31m-    if (!err)[m
[31m-        return 1;[m
[31m-[m
[31m-    if (err == LUA_ERRRUN) {[m
[31m-        lua_pushnil(l);[m
[31m-        lua_insert(l, -2);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* Since we are not using a custom error handler, the only remaining[m
[31m-     * errors are memory related */[m
[31m-    return luaL_error(l, "Memory allocation error in CJSON protected call");[m
[31m-}[m
[31m-[m
[31m-/* Return cjson module table */[m
[31m-static int lua_cjson_new(lua_State *l)[m
[31m-{[m
[31m-    luaL_Reg reg[] = {[m
[31m-        { "encode", json_encode },[m
[31m-        { "decode", json_decode },[m
[31m-        { "encode_empty_table_as_object", json_cfg_encode_empty_table_as_object },[m
[31m-        { "encode_sparse_array", json_cfg_encode_sparse_array },[m
[31m-        { "encode_max_depth", json_cfg_encode_max_depth },[m
[31m-        { "decode_max_depth", json_cfg_decode_max_depth },[m
[31m-        { "encode_number_precision", json_cfg_encode_number_precision },[m
[31m-        { "encode_keep_buffer", json_cfg_encode_keep_buffer },[m
[31m-        { "encode_invalid_numbers", json_cfg_encode_invalid_numbers },[m
[31m-        { "decode_invalid_numbers", json_cfg_decode_invalid_numbers },[m
[31m-        { "new", lua_cjson_new },[m
[31m-        { NULL, NULL }[m
[31m-    };[m
[31m-[m
[31m-    /* Initialise number conversions */[m
[31m-    fpconv_init();[m
[31m-[m
[31m-    /* Create empty array metatable */[m
[31m-    lua_pushlightuserdata(l, &json_empty_array);[m
[31m-    lua_newtable(l);[m
[31m-    lua_rawset(l, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    /* cjson module table */[m
[31m-    lua_newtable(l);[m
[31m-[m
[31m-    /* Register functions with config data as upvalue */[m
[31m-    json_create_config(l);[m
[31m-    luaL_setfuncs(l, reg, 1);[m
[31m-[m
[31m-    /* Set cjson.null */[m
[31m-    lua_pushlightuserdata(l, NULL);[m
[31m-    lua_setfield(l, -2, "null");[m
[31m-[m
[31m-    /* Set cjson.empty_array_mt */[m
[31m-    lua_pushlightuserdata(l, &json_empty_array);[m
[31m-    lua_rawget(l, LUA_REGISTRYINDEX);[m
[31m-    lua_setfield(l, -2, "empty_array_mt");[m
[31m-[m
[31m-    /* Set cjson.empty_array */[m
[31m-    lua_pushlightuserdata(l, &json_empty_array);[m
[31m-    lua_setfield(l, -2, "empty_array");[m
[31m-[m
[31m-    /* Set module name / version fields */[m
[31m-    lua_pushliteral(l, CJSON_MODNAME);[m
[31m-    lua_setfield(l, -2, "_NAME");[m
[31m-    lua_pushliteral(l, CJSON_VERSION);[m
[31m-    lua_setfield(l, -2, "_VERSION");[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* Return cjson.safe module table */[m
[31m-static int lua_cjson_safe_new(lua_State *l)[m
[31m-{[m
[31m-    const char *func[] = { "decode", "encode", NULL };[m
[31m-    int i;[m
[31m-[m
[31m-    lua_cjson_new(l);[m
[31m-[m
[31m-    /* Fix new() method */[m
[31m-    lua_pushcfunction(l, lua_cjson_safe_new);[m
[31m-    lua_setfield(l, -2, "new");[m
[31m-[m
[31m-    for (i = 0; func[i]; i++) {[m
[31m-        lua_getfield(l, -1, func[i]);[m
[31m-        lua_pushcclosure(l, json_protect_conversion, 1);[m
[31m-        lua_setfield(l, -2, func[i]);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-int luaopen_cjson(lua_State *l)[m
[31m-{[m
[31m-    lua_cjson_new(l);[m
[31m-[m
[31m-#ifdef ENABLE_CJSON_GLOBAL[m
[31m-    /* Register a global "cjson" table. */[m
[31m-    lua_pushvalue(l, -1);[m
[31m-    lua_setglobal(l, CJSON_MODNAME);[m
[31m-#endif[m
[31m-[m
[31m-    /* Return cjson table */[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-int luaopen_cjson_safe(lua_State *l)[m
[31m-{[m
[31m-    lua_cjson_safe_new(l);[m
[31m-[m
[31m-    /* Return cjson.safe table */[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua_cjson.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua_cjson.o[m
[1mdeleted file mode 100644[m
[1mindex 6047eb4..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/lua_cjson.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/manual.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/manual.txt[m
[1mdeleted file mode 100644[m
[1mindex a12e378..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/manual.txt[m
[1m+++ /dev/null[m
[36m@@ -1,612 +0,0 @@[m
[31m-= Lua CJSON 2.1devel Manual =[m
[31m-Mark Pulford <mark@kyne.com.au>[m
[31m-:revdate: 1st March 2012[m
[31m-[m
[31m-Overview[m
[31m---------[m
[31m-[m
[31m-The Lua CJSON module provides JSON support for Lua.[m
[31m-[m
[31m-*Features*::[m
[31m-- Fast, standards compliant encoding/parsing routines[m
[31m-- Full support for JSON with UTF-8, including decoding surrogate pairs[m
[31m-- Optional run-time support for common exceptions to the JSON[m
[31m-  specification (infinity, NaN,..)[m
[31m-- No dependencies on other libraries[m
[31m-[m
[31m-*Caveats*::[m
[31m-- UTF-16 and UTF-32 are not supported[m
[31m-[m
[31m-Lua CJSON is covered by the MIT license. Review the file +LICENSE+ for[m
[31m-details.[m
[31m-[m
[31m-The latest version of this software is available from the[m
[31m-http://www.kyne.com.au/%7Emark/software/lua-cjson.php[Lua CJSON website].[m
[31m-[m
[31m-Feel free to email me if you have any patches, suggestions, or comments.[m
[31m-[m
[31m-[m
[31m-Installation[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON requires either http://www.lua.org[Lua] 5.1, Lua 5.2, or[m
[31m-http://www.luajit.org[LuaJIT] to build.[m
[31m-[m
[31m-The build method can be selected from 4 options:[m
[31m-[m
[31m-Make:: Unix (including Linux, BSD, Mac OSX & Solaris), Windows[m
[31m-CMake:: Unix, Windows[m
[31m-RPM:: Linux[m
[31m-LuaRocks:: Unix, Windows[m
[31m-[m
[31m-[m
[31m-Make[m
[31m-~~~~[m
[31m-[m
[31m-The included +Makefile+ has generic settings.[m
[31m-[m
[31m-First, review and update the included makefile to suit your platform (if[m
[31m-required).[m
[31m-[m
[31m-Next, build and install the module:[m
[31m-[m
[31m-[source,sh][m
[31m-make install[m
[31m-[m
[31m-Or install manually into your Lua module directory:[m
[31m-[m
[31m-[source,sh][m
[31m-make[m
[31m-cp cjson.so $LUA_MODULE_DIRECTORY[m
[31m-[m
[31m-[m
[31m-CMake[m
[31m-~~~~~[m
[31m-[m
[31m-http://www.cmake.org[CMake] can generate build configuration for many[m
[31m-different platforms (including Unix and Windows).[m
[31m-[m
[31m-First, generate the makefile for your platform using CMake. If CMake is[m
[31m-unable to find Lua, manually set the +LUA_DIR+ environment variable to[m
[31m-the base prefix of your Lua 5.1 installation.[m
[31m-[m
[31m-While +cmake+ is used in the example below, +ccmake+ or +cmake-gui+ may[m
[31m-be used to present an interface for changing the default build options.[m
[31m-[m
[31m-[source,sh][m
[31m-mkdir build[m
[31m-cd build[m
[31m-# Optional: export LUA_DIR=$LUA51_PREFIX[m
[31m-cmake ..[m
[31m-[m
[31m-Next, build and install the module:[m
[31m-[m
[31m-[source,sh][m
[31m-make install[m
[31m-# Or:[m
[31m-make[m
[31m-cp cjson.so $LUA_MODULE_DIRECTORY[m
[31m-[m
[31m-Review the[m
[31m-http://www.cmake.org/cmake/help/documentation.html[CMake documentation][m
[31m-for further details.[m
[31m-[m
[31m-[m
[31m-RPM[m
[31m-~~~[m
[31m-[m
[31m-Linux distributions using http://rpm.org[RPM] can create a package via[m
[31m-the included RPM spec file. Ensure the +rpm-build+ package (or similar)[m
[31m-has been installed.[m
[31m-[m
[31m-Build and install the module via RPM:[m
[31m-[m
[31m-[source,sh][m
[31m-rpmbuild -tb lua-cjson-2.1devel.tar.gz[m
[31m-rpm -Uvh $LUA_CJSON_RPM[m
[31m-[m
[31m-[m
[31m-LuaRocks[m
[31m-~~~~~~~~[m
[31m-[m
[31m-http://luarocks.org[LuaRocks] can be used to install and manage Lua[m
[31m-modules on a wide range of platforms (including Windows).[m
[31m-[m
[31m-First, extract the Lua CJSON source package.[m
[31m-[m
[31m-Next, install the module:[m
[31m-[m
[31m-[source,sh][m
[31m-cd lua-cjson-2.1devel[m
[31m-luarocks make[m
[31m-[m
[31m-[NOTE][m
[31m-LuaRocks does not support platform specific configuration for Solaris.[m
[31m-On Solaris, you may need to manually uncomment +USE_INTERNAL_ISINF+ in[m
[31m-the rockspec before building this module.[m
[31m-[m
[31m-Review the http://luarocks.org/en/Documentation[LuaRocks documentation][m
[31m-for further details.[m
[31m-[m
[31m-[m
[31m-[[build_options]][m
[31m-Build Options (#define)[m
[31m-~~~~~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-Lua CJSON offers several +#define+ build options to address portability[m
[31m-issues, and enable non-default features. Some build methods may[m
[31m-automatically set platform specific options if required. Other features[m
[31m-should be enabled manually.[m
[31m-[m
[31m-USE_INTERNAL_ISINF:: Workaround for Solaris platforms missing +isinf+.[m
[31m-DISABLE_INVALID_NUMBERS:: Recommended on platforms where +strtod+ /[m
[31m-  +sprintf+ are not POSIX compliant (eg, Windows MinGW). Prevents[m
[31m-  +cjson.encode_invalid_numbers+ and +cjson.decode_invalid_numbers+ from[m
[31m-  being enabled. However, +cjson.encode_invalid_numbers+ may still be[m
[31m-  set to +"null"+. When using the Lua CJSON built-in floating point[m
[31m-  conversion this option is unnecessary and is ignored.[m
[31m-[m
[31m-[m
[31m-Built-in floating point conversion[m
[31m-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[m
[31m-[m
[31m-Lua CJSON may be built with David Gay's[m
[31m-http://www.netlib.org/fp/[floating point conversion routines]. This can[m
[31m-increase overall performance by up to 50% on some platforms when[m
[31m-converting a large amount of numeric data. However, this option reduces[m
[31m-portability and is disabled by default.[m
[31m-[m
[31m-USE_INTERNAL_FPCONV:: Enable internal number conversion routines.[m
[31m-IEEE_BIG_ENDIAN:: Must be set on big endian architectures.[m
[31m-MULTIPLE_THREADS:: Must be set if Lua CJSON may be used in a[m
[31m-  multi-threaded application. Requires the _pthreads_ library.[m
[31m-[m
[31m-[m
[31m-API (Functions)[m
[31m----------------[m
[31m-[m
[31m-Synopsis[m
[31m-~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m--- Module instantiation[m
[31m-local cjson = require "cjson"[m
[31m-local cjson2 = cjson.new()[m
[31m-local cjson_safe = require "cjson.safe"[m
[31m-[m
[31m--- Translate Lua value to/from JSON[m
[31m-text = cjson.encode(value)[m
[31m-value = cjson.decode(text)[m
[31m-[m
[31m--- Get and/or set Lua CJSON configuration[m
[31m-setting = cjson.decode_invalid_numbers([setting])[m
[31m-setting = cjson.encode_invalid_numbers([setting])[m
[31m-keep = cjson.encode_keep_buffer([keep])[m
[31m-depth = cjson.encode_max_depth([depth])[m
[31m-depth = cjson.decode_max_depth([depth])[m
[31m-convert, ratio, safe = cjson.encode_sparse_array([convert[, ratio[, safe]]])[m
[31m-------------[m
[31m-[m
[31m-[m
[31m-Module Instantiation[m
[31m-~~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-local cjson = require "cjson"[m
[31m-local cjson2 = cjson.new()[m
[31m-local cjson_safe = require "cjson.safe"[m
[31m-------------[m
[31m-[m
[31m-Import Lua CJSON via the Lua +require+ function. Lua CJSON does not[m
[31m-register a global module table.[m
[31m-[m
[31m-The +cjson+ module will throw an error during JSON conversion if any[m
[31m-invalid data is encountered. Refer to <<cjson_encode,+cjson.encode+>>[m
[31m-and <<cjson_decode,+cjson.decode+>> for details.[m
[31m-[m
[31m-The +cjson.safe+ module behaves identically to the +cjson+ module,[m
[31m-except when errors are encountered during JSON conversion. On error, the[m
[31m-+cjson_safe.encode+ and +cjson_safe.decode+ functions will return[m
[31m-+nil+ followed by the error message.[m
[31m-[m
[31m-+cjson.new+ can be used to instantiate an independent copy of the Lua[m
[31m-CJSON module. The new module has a separate persistent encoding buffer,[m
[31m-and default settings.[m
[31m-[m
[31m-Lua CJSON can support Lua implementations using multiple preemptive[m
[31m-threads within a single Lua state provided the persistent encoding[m
[31m-buffer is not shared. This can be achieved by one of the following[m
[31m-methods:[m
[31m-[m
[31m-- Disabling the persistent encoding buffer with[m
[31m-  <<encode_keep_buffer,+cjson.encode_keep_buffer+>>[m
[31m-- Ensuring each thread calls <<encode,+cjson.encode+>> separately (ie,[m
[31m-  treat +cjson.encode+ as non-reentrant).[m
[31m-- Using a separate +cjson+ module table per preemptive thread[m
[31m-  (+cjson.new+)[m
[31m-[m
[31m-[NOTE][m
[31m-Lua CJSON uses +strtod+ and +snprintf+ to perform numeric conversion as[m
[31m-they are usually well supported, fast and bug free. However, these[m
[31m-functions require a workaround for JSON encoding/parsing under locales[m
[31m-using a comma decimal separator. Lua CJSON detects the current locale[m
[31m-during instantiation to determine and automatically implement the[m
[31m-workaround if required. Lua CJSON should be reinitialised via[m
[31m-+cjson.new+ if the locale of the current process changes. Using a[m
[31m-different locale per thread is not supported.[m
[31m-[m
[31m-[m
[31m-decode[m
[31m-~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-value = cjson.decode(json_text)[m
[31m-------------[m
[31m-[m
[31m-+cjson.decode+ will deserialise any UTF-8 JSON string into a Lua value[m
[31m-or table.[m
[31m-[m
[31m-UTF-16 and UTF-32 JSON strings are not supported.[m
[31m-[m
[31m-+cjson.decode+ requires that any NULL (ASCII 0) and double quote (ASCII[m
[31m-34) characters are escaped within strings. All escape codes will be[m
[31m-decoded and other bytes will be passed transparently. UTF-8 characters[m
[31m-are not validated during decoding and should be checked elsewhere if[m
[31m-required.[m
[31m-[m
[31m-JSON +null+ will be converted to a NULL +lightuserdata+ value. This can[m
[31m-be compared with +cjson.null+ for convenience.[m
[31m-[m
[31m-By default, numbers incompatible with the JSON specification (infinity,[m
[31m-NaN, hexadecimal) can be decoded. This default can be changed with[m
[31m-<<decode_invalid_numbers,+cjson.decode_invalid_numbers+>>.[m
[31m-[m
[31m-.Example: Decoding[m
[31m-[source,lua][m
[31m-json_text = '[ true, { "foo": "bar" } ]'[m
[31m-value = cjson.decode(json_text)[m
[31m--- Returns: { true, { foo = "bar" } }[m
[31m-[m
[31m-[CAUTION][m
[31m-Care must be taken after decoding JSON objects with numeric keys. Each[m
[31m-numeric key will be stored as a Lua +string+. Any subsequent code[m
[31m-assuming type +number+ may break.[m
[31m-[m
[31m-[m
[31m-[[decode_invalid_numbers]][m
[31m-decode_invalid_numbers[m
[31m-~~~~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-setting = cjson.decode_invalid_numbers([setting])[m
[31m--- "setting" must be a boolean. Default: true.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON may generate an error when trying to decode numbers not[m
[31m-supported by the JSON specification. _Invalid numbers_ are defined as:[m
[31m-[m
[31m-- infinity[m
[31m-- NaN[m
[31m-- hexadecimal[m
[31m-[m
[31m-Available settings:[m
[31m-[m
[31m-+true+:: Accept and decode _invalid numbers_. This is the default[m
[31m-  setting.[m
[31m-+false+:: Throw an error when _invalid numbers_ are encountered.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[decode_max_depth]][m
[31m-decode_max_depth[m
[31m-~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-depth = cjson.decode_max_depth([depth])[m
[31m--- "depth" must be a positive integer. Default: 1000.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON will generate an error when parsing deeply nested JSON once[m
[31m-the maximum array/object depth has been exceeded. This check prevents[m
[31m-unnecessarily complicated JSON from slowing down the application, or[m
[31m-crashing the application due to lack of process stack space.[m
[31m-[m
[31m-An error may be generated before the depth limit is hit if Lua is unable[m
[31m-to allocate more objects on the Lua stack.[m
[31m-[m
[31m-By default, Lua CJSON will reject JSON with arrays and/or objects nested[m
[31m-more than 1000 levels deep.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[encode]][m
[31m-encode[m
[31m-~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-json_text = cjson.encode(value)[m
[31m-------------[m
[31m-[m
[31m-+cjson.encode+ will serialise a Lua value into a string containing the[m
[31m-JSON representation.[m
[31m-[m
[31m-+cjson.encode+ supports the following types:[m
[31m-[m
[31m-- +boolean+[m
[31m-- +lightuserdata+ (NULL value only)[m
[31m-- +nil+[m
[31m-- +number+[m
[31m-- +string+[m
[31m-- +table+[m
[31m-[m
[31m-The remaining Lua types will generate an error:[m
[31m-[m
[31m-- +function+[m
[31m-- +lightuserdata+ (non-NULL values)[m
[31m-- +thread+[m
[31m-- +userdata+[m
[31m-[m
[31m-By default, numbers are encoded with 14 significant digits. Refer to[m
[31m-<<encode_number_precision,+cjson.encode_number_precision+>> for details.[m
[31m-[m
[31m-Lua CJSON will escape the following characters within each UTF-8 string:[m
[31m-[m
[31m-- Control characters (ASCII 0 - 31)[m
[31m-- Double quote (ASCII 34)[m
[31m-- Forward slash (ASCII 47)[m
[31m-- Blackslash (ASCII 92)[m
[31m-- Delete (ASCII 127)[m
[31m-[m
[31m-All other bytes are passed transparently.[m
[31m-[m
[31m-[CAUTION][m
[31m-=========[m
[31m-Lua CJSON will successfully encode/decode binary strings, but this is[m
[31m-technically not supported by JSON and may not be compatible with other[m
[31m-JSON libraries. To ensure the output is valid JSON, applications should[m
[31m-ensure all Lua strings passed to +cjson.encode+ are UTF-8.[m
[31m-[m
[31m-Base64 is commonly used to encode binary data as the most efficient[m
[31m-encoding under UTF-8 can only reduce the encoded size by a further[m
[31m-&#126;8%. Lua Base64 routines can be found in the[m
[31m-http://w3.impa.br/%7Ediego/software/luasocket/[LuaSocket] and[m
[31m-http://www.tecgraf.puc-rio.br/%7Elhf/ftp/lua/#lbase64[lbase64] packages.[m
[31m-=========[m
[31m-[m
[31m-Lua CJSON uses a heuristic to determine whether to encode a Lua table as[m
[31m-a JSON array or an object. A Lua table with only positive integer keys[m
[31m-of type +number+ will be encoded as a JSON array. All other tables will[m
[31m-be encoded as a JSON object.[m
[31m-[m
[31m-Lua CJSON does not use metamethods when serialising tables.[m
[31m-[m
[31m-- +rawget+ is used to iterate over Lua arrays[m
[31m-- +next+ is used to iterate over Lua objects[m
[31m-[m
[31m-Lua arrays with missing entries (_sparse arrays_) may optionally be[m
[31m-encoded in several different ways. Refer to[m
[31m-<<encode_sparse_array,+cjson.encode_sparse_array+>> for details.[m
[31m-[m
[31m-JSON object keys are always strings. Hence +cjson.encode+ only supports[m
[31m-table keys which are type +number+ or +string+. All other types will[m
[31m-generate an error.[m
[31m-[m
[31m-[NOTE][m
[31m-Standards compliant JSON must be encapsulated in either an object (+{}+)[m
[31m-or an array (+[]+). If strictly standards compliant JSON is desired, a[m
[31m-table must be passed to +cjson.encode+.[m
[31m-[m
[31m-By default, encoding the following Lua values will generate errors:[m
[31m-[m
[31m-- Numbers incompatible with the JSON specification (infinity, NaN)[m
[31m-- Tables nested more than 1000 levels deep[m
[31m-- Excessively sparse Lua arrays[m
[31m-[m
[31m-These defaults can be changed with:[m
[31m-[m
[31m-- <<encode_invalid_numbers,+cjson.encode_invalid_numbers+>>[m
[31m-- <<encode_max_depth,+cjson.encode_max_depth+>>[m
[31m-- <<encode_sparse_array,+cjson.encode_sparse_array+>>[m
[31m-[m
[31m-.Example: Encoding[m
[31m-[source,lua][m
[31m-value = { true, { foo = "bar" } }[m
[31m-json_text = cjson.encode(value)[m
[31m--- Returns: '[true,{"foo":"bar"}]'[m
[31m-[m
[31m-[m
[31m-[[encode_invalid_numbers]][m
[31m-encode_invalid_numbers[m
[31m-~~~~~~~~~~~~~~~~~~~~~~[m
[31m-[source,lua][m
[31m-------------[m
[31m-setting = cjson.encode_invalid_numbers([setting])[m
[31m--- "setting" must a boolean or "null". Default: false.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON may generate an error when encoding floating point numbers not[m
[31m-supported by the JSON specification (_invalid numbers_):[m
[31m-[m
[31m-- infinity[m
[31m-- NaN[m
[31m-[m
[31m-Available settings:[m
[31m-[m
[31m-+true+:: Allow _invalid numbers_ to be encoded using the Javascript[m
[31m-  compatible values +NaN+ and +Infinity+. This will generate[m
[31m-  non-standard JSON, but these values are supported by some libraries.[m
[31m-+"null"+:: Encode _invalid numbers_ as a JSON +null+ value. This allows[m
[31m-  infinity and NaN to be encoded into valid JSON.[m
[31m-+false+:: Throw an error when attempting to encode _invalid numbers_.[m
[31m-  This is the default setting.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[encode_keep_buffer]][m
[31m-encode_keep_buffer[m
[31m-~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-keep = cjson.encode_keep_buffer([keep])[m
[31m--- "keep" must be a boolean. Default: true.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON can reuse the JSON encoding buffer to improve performance.[m
[31m-[m
[31m-Available settings:[m
[31m-[m
[31m-+true+:: The buffer will grow to the largest size required and is not[m
[31m-  freed until the Lua CJSON module is garbage collected. This is the[m
[31m-  default setting.[m
[31m-+false+:: Free the encode buffer after each call to +cjson.encode+.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[encode_max_depth]][m
[31m-encode_max_depth[m
[31m-~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-depth = cjson.encode_max_depth([depth])[m
[31m--- "depth" must be a positive integer. Default: 1000.[m
[31m-------------[m
[31m-[m
[31m-Once the maximum table depth has been exceeded Lua CJSON will generate[m
[31m-an error. This prevents a deeply nested or recursive data structure from[m
[31m-crashing the application.[m
[31m-[m
[31m-By default, Lua CJSON will generate an error when trying to encode data[m
[31m-structures with more than 1000 nested tables.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-.Example: Recursive Lua table[m
[31m-[source,lua][m
[31m-a = {}; a[1] = a[m
[31m-[m
[31m-[m
[31m-[[encode_number_precision]][m
[31m-encode_number_precision[m
[31m-~~~~~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-precision = cjson.encode_number_precision([precision])[m
[31m--- "precision" must be an integer between 1 and 14. Default: 14.[m
[31m-------------[m
[31m-[m
[31m-The amount of significant digits returned by Lua CJSON when encoding[m
[31m-numbers can be changed to balance accuracy versus performance. For data[m
[31m-structures containing many numbers, setting[m
[31m-+cjson.encode_number_precision+ to a smaller integer, for example +3+,[m
[31m-can improve encoding performance by up to 50%.[m
[31m-[m
[31m-By default, Lua CJSON will output 14 significant digits when converting[m
[31m-a number to text.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[encode_sparse_array]][m
[31m-encode_sparse_array[m
[31m-~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-convert, ratio, safe = cjson.encode_sparse_array([convert[, ratio[, safe]]])[m
[31m--- "convert" must be a boolean. Default: false.[m
[31m--- "ratio" must be a positive integer. Default: 2.[m
[31m--- "safe" must be a positive integer. Default: 10.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON classifies a Lua table into one of three kinds when encoding a[m
[31m-JSON array. This is determined by the number of values missing from the[m
[31m-Lua array as follows:[m
[31m-[m
[31m-Normal:: All values are available.[m
[31m-Sparse:: At least 1 value is missing.[m
[31m-Excessively sparse:: The number of values missing exceeds the configured[m
[31m-  ratio.[m
[31m-[m
[31m-Lua CJSON encodes sparse Lua arrays as JSON arrays using JSON +null+ for[m
[31m-the missing entries.[m
[31m-[m
[31m-An array is excessively sparse when all the following conditions are[m
[31m-met:[m
[31m-[m
[31m-- +ratio+ > +0+[m
[31m-- _maximum_index_ > +safe+[m
[31m-- _maximum_index_ > _item_count_ * +ratio+[m
[31m-[m
[31m-Lua CJSON will never consider an array to be _excessively sparse_ when[m
[31m-+ratio+ = +0+. The +safe+ limit ensures that small Lua arrays are always[m
[31m-encoded as sparse arrays.[m
[31m-[m
[31m-By default, attempting to encode an _excessively sparse_ array will[m
[31m-generate an error. If +convert+ is set to +true+, _excessively sparse_[m
[31m-arrays will be converted to a JSON object.[m
[31m-[m
[31m-The current settings are always returned. A particular setting is only[m
[31m-changed when the argument is provided (non-++nil++).[m
[31m-[m
[31m-.Example: Encoding a sparse array[m
[31m-[source,lua][m
[31m-cjson.encode({ [3] = "data" })[m
[31m--- Returns: '[null,null,"data"]'[m
[31m-[m
[31m-.Example: Enabling conversion to a JSON object[m
[31m-[source,lua][m
[31m-cjson.encode_sparse_array(true)[m
[31m-cjson.encode({ [1000] = "excessively sparse" })[m
[31m--- Returns: '{"1000":"excessively sparse"}'[m
[31m-[m
[31m-[m
[31m-API (Variables)[m
[31m----------------[m
[31m-[m
[31m-_NAME[m
[31m-~~~~~[m
[31m-[m
[31m-The name of the Lua CJSON module (+"cjson"+).[m
[31m-[m
[31m-[m
[31m-_VERSION[m
[31m-~~~~~~~~[m
[31m-[m
[31m-The version number of the Lua CJSON module (+"2.1devel"+).[m
[31m-[m
[31m-[m
[31m-null[m
[31m-~~~~[m
[31m-[m
[31m-Lua CJSON decodes JSON +null+ as a Lua +lightuserdata+ NULL pointer.[m
[31m-+cjson.null+ is provided for comparison.[m
[31m-[m
[31m-[m
[31m-[sect1][m
[31m-References[m
[31m-----------[m
[31m-[m
[31m-- http://tools.ietf.org/html/rfc4627[RFC 4627][m
[31m-- http://www.json.org/[JSON website][m
[31m-[m
[31m-[m
[31m-// vi:ft=asciidoc tw=72:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/performance.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/performance.txt[m
[1mdeleted file mode 100644[m
[1mindex fc3a5bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/performance.txt[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-JSON module performance comparison under Lua[m
[31m-============================================[m
[31m-Mark Pulford <mark@kyne.com.au>[m
[31m-:revdate: January 22, 2012[m
[31m-[m
[31m-This performance comparison aims to provide a guide of relative[m
[31m-performance between several fast and popular JSON modules.[m
[31m-[m
[31m-The examples used in this comparison were mostly sourced from the[m
[31m-http://json.org[JSON website] and[m
[31m-http://tools.ietf.org/html/rfc4627[RFC 4627].[m
[31m-[m
[31m-Performance will vary widely between platforms and data sets. These[m
[31m-results should only be used as an approximation.[m
[31m-[m
[31m-[m
[31m-Modules[m
[31m--------[m
[31m-[m
[31m-The following JSON modules for Lua were tested:[m
[31m-[m
[31m-http://chiselapp.com/user/dhkolf/repository/dkjson/[DKJSON 2.1]::[m
[31m-  - Lua implementation with no dependencies on other libraries[m
[31m-  - Supports LPeg to improve decode performance[m
[31m-[m
[31m-https://github.com/brimworks/lua-yajl[Lua YAJL 2.0]::[m
[31m-  - C wrapper for the YAJL library[m
[31m-[m
[31m-http://www.kyne.com.au/%7Emark/software/lua-cjson.php[Lua CSJON 2.0.0]::[m
[31m-  - C implementation with no dependencies on other libraries[m
[31m-[m
[31m-[m
[31m-Summary[m
[31m--------[m
[31m-[m
[31m-All modules were built and tested as follows:[m
[31m-[m
[31m-DKJSON:: Tested with/without LPeg 10.2.[m
[31m-Lua YAJL:: Tested with YAJL 2.0.4.[m
[31m-Lua CJSON:: Tested with Libc and internal floating point conversion[m
[31m-  routines.[m
[31m-[m
[31m-The following Lua implementations were used for this comparison:[m
[31m-[m
[31m-- http://www.lua.org[Lua 5.1.4] (_Lua_)[m
[31m-- http://www.luajit.org[LuaJIT 2.0.0-beta9] (_JIT_)[m
[31m-[m
[31m-These results show the number of JSON operations per second sustained by[m
[31m-each module. All results have been normalised against the pure Lua[m
[31m-DKJSON implementation.[m
[31m-[m
[31m-.Decoding performance[m
[31m-............................................................................[m
[31m-             | DKJSON                  | Lua YAJL   | Lua CJSON[m
[31m-             | No LPeg     With LPeg   |            | Libc         Internal[m
[31m-             | Lua  JIT    Lua    JIT  | Lua   JIT  | Lua   JIT    Lua   JIT[m
[31m-example1     | 1x   2x     2.6x   3.4x | 7.1x  10x  | 14x   20x    14x   20x[m
[31m-example2     | 1x   2.2x   2.9x   4.4x | 6.7x  9.9x | 14x   22x    14x   22x[m
[31m-example3     | 1x   2.1x   3x     4.3x | 6.9x  9.3x | 14x   21x    15x   22x[m
[31m-example4     | 1x   2x     2.5x   3.7x | 7.3x  10x  | 12x   19x    12x   20x[m
[31m-example5     | 1x   2.2x   3x     4.5x | 7.8x  11x  | 16x   24x    16x   24x[m
[31m-numbers      | 1x   2.2x   2.3x   4x   | 4.6x  5.5x | 8.9x  10x    13x   17x[m
[31m-rfc-example1 | 1x   2.1x   2.8x   4.3x | 6.1x  8.1x | 13x   19x    14x   21x[m
[31m-rfc-example2 | 1x   2.1x   3.1x   4.2x | 7.1x  9.2x | 15x   21x    17x   24x[m
[31m-types        | 1x   2.2x   2.6x   4.3x | 5.3x  7.4x | 12x   20x    13x   21x[m
[31m--------------|-------------------------|------------|-----------------------[m
[31m-= Average => | 1x   2.1x   2.7x   4.1x | 6.5x  9x   | 13x   20x    14x   21x[m
[31m-............................................................................[m
[31m-[m
[31m-.Encoding performance[m
[31m-.............................................................................[m
[31m-             | DKJSON                  | Lua YAJL   | Lua CJSON[m
[31m-             | No LPeg     With LPeg   |            | Libc         Internal[m
[31m-             | Lua  JIT    Lua    JIT  | Lua   JIT  | Lua   JIT    Lua   JIT[m
[31m-example1     | 1x   1.8x   0.97x  1.6x | 3.1x  5.2x | 23x   29x    23x   29x[m
[31m-example2     | 1x   2x     0.97x  1.7x | 2.6x  4.3x | 22x   28x    22x   28x[m
[31m-example3     | 1x   1.9x   0.98x  1.6x | 2.8x  4.3x | 13x   15x    16x   18x[m
[31m-example4     | 1x   1.7x   0.96x  1.3x | 3.9x  6.1x | 15x   19x    17x   21x[m
[31m-example5     | 1x   2x     0.98x  1.7x | 2.7x  4.5x | 20x   23x    20x   23x[m
[31m-numbers      | 1x   2.3x   1x     2.2x | 1.3x  1.9x | 3.8x  4.1x   4.2x  4.6x[m
[31m-rfc-example1 | 1x   1.9x   0.97x  1.6x | 2.2x  3.2x | 8.5x  9.3x   11x   12x[m
[31m-rfc-example2 | 1x   1.9x   0.98x  1.6x | 2.6x  3.9x | 10x   11x    17x   19x[m
[31m-types        | 1x   2.2x   0.97x  2x   | 1.2x  1.9x | 11x   13x    12x   14x[m
[31m--------------|-------------------------|------------|-----------------------[m
[31m-= Average => | 1x   1.9x   0.98x  1.7x | 2.5x  3.9x | 14x   17x    16x   19x[m
[31m-.............................................................................[m
[31m-[m
[31m-[m
[31m-// vi:ft=asciidoc tw=72:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/rfc4627.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/rfc4627.txt[m
[1mdeleted file mode 100644[m
[1mindex 67b8909..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/rfc4627.txt[m
[1m+++ /dev/null[m
[36m@@ -1,563 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Network Working Group                                       D. Crockford[m
[31m-Request for Comments: 4627                                      JSON.org[m
[31m-Category: Informational                                        July 2006[m
[31m-[m
[31m-[m
[31m- The application/json Media Type for JavaScript Object Notation (JSON)[m
[31m-[m
[31m-Status of This Memo[m
[31m-[m
[31m-   This memo provides information for the Internet community.  It does[m
[31m-   not specify an Internet standard of any kind.  Distribution of this[m
[31m-   memo is unlimited.[m
[31m-[m
[31m-Copyright Notice[m
[31m-[m
[31m-   Copyright (C) The Internet Society (2006).[m
[31m-[m
[31m-Abstract[m
[31m-[m
[31m-   JavaScript Object Notation (JSON) is a lightweight, text-based,[m
[31m-   language-independent data interchange format.  It was derived from[m
[31m-   the ECMAScript Programming Language Standard.  JSON defines a small[m
[31m-   set of formatting rules for the portable representation of structured[m
[31m-   data.[m
[31m-[m
[31m-1.  Introduction[m
[31m-[m
[31m-   JavaScript Object Notation (JSON) is a text format for the[m
[31m-   serialization of structured data.  It is derived from the object[m
[31m-   literals of JavaScript, as defined in the ECMAScript Programming[m
[31m-   Language Standard, Third Edition [ECMA].[m
[31m-[m
[31m-   JSON can represent four primitive types (strings, numbers, booleans,[m
[31m-   and null) and two structured types (objects and arrays).[m
[31m-[m
[31m-   A string is a sequence of zero or more Unicode characters [UNICODE].[m
[31m-[m
[31m-   An object is an unordered collection of zero or more name/value[m
[31m-   pairs, where a name is a string and a value is a string, number,[m
[31m-   boolean, null, object, or array.[m
[31m-[m
[31m-   An array is an ordered sequence of zero or more values.[m
[31m-[m
[31m-   The terms "object" and "array" come from the conventions of[m
[31m-   JavaScript.[m
[31m-[m
[31m-   JSON's design goals were for it to be minimal, portable, textual, and[m
[31m-   a subset of JavaScript.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 1][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-1.1.  Conventions Used in This Document[m
[31m-[m
[31m-   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",[m
[31m-   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this[m
[31m-   document are to be interpreted as described in [RFC2119].[m
[31m-[m
[31m-   The grammatical rules in this document are to be interpreted as[m
[31m-   described in [RFC4234].[m
[31m-[m
[31m-2.  JSON Grammar[m
[31m-[m
[31m-   A JSON text is a sequence of tokens.  The set of tokens includes six[m
[31m-   structural characters, strings, numbers, and three literal names.[m
[31m-[m
[31m-   A JSON text is a serialized object or array.[m
[31m-[m
[31m-      JSON-text = object / array[m
[31m-[m
[31m-   These are the six structural characters:[m
[31m-[m
[31m-      begin-array     = ws %x5B ws  ; [ left square bracket[m
[31m-[m
[31m-      begin-object    = ws %x7B ws  ; { left curly bracket[m
[31m-[m
[31m-      end-array       = ws %x5D ws  ; ] right square bracket[m
[31m-[m
[31m-      end-object      = ws %x7D ws  ; } right curly bracket[m
[31m-[m
[31m-      name-separator  = ws %x3A ws  ; : colon[m
[31m-[m
[31m-      value-separator = ws %x2C ws  ; , comma[m
[31m-[m
[31m-   Insignificant whitespace is allowed before or after any of the six[m
[31m-   structural characters.[m
[31m-[m
[31m-      ws = *([m
[31m-                %x20 /              ; Space[m
[31m-                %x09 /              ; Horizontal tab[m
[31m-                %x0A /              ; Line feed or New line[m
[31m-                %x0D                ; Carriage return[m
[31m-            )[m
[31m-[m
[31m-2.1.  Values[m
[31m-[m
[31m-   A JSON value MUST be an object, array, number, or string, or one of[m
[31m-   the following three literal names:[m
[31m-[m
[31m-      false null true[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 2][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-   The literal names MUST be lowercase.  No other literal names are[m
[31m-   allowed.[m
[31m-[m
[31m-         value = false / null / true / object / array / number / string[m
[31m-[m
[31m-         false = %x66.61.6c.73.65   ; false[m
[31m-[m
[31m-         null  = %x6e.75.6c.6c      ; null[m
[31m-[m
[31m-         true  = %x74.72.75.65      ; true[m
[31m-[m
[31m-2.2.  Objects[m
[31m-[m
[31m-   An object structure is represented as a pair of curly brackets[m
[31m-   surrounding zero or more name/value pairs (or members).  A name is a[m
[31m-   string.  A single colon comes after each name, separating the name[m
[31m-   from the value.  A single comma separates a value from a following[m
[31m-   name.  The names within an object SHOULD be unique.[m
[31m-[m
[31m-      object = begin-object [ member *( value-separator member ) ][m
[31m-      end-object[m
[31m-[m
[31m-      member = string name-separator value[m
[31m-[m
[31m-2.3.  Arrays[m
[31m-[m
[31m-   An array structure is represented as square brackets surrounding zero[m
[31m-   or more values (or elements).  Elements are separated by commas.[m
[31m-[m
[31m-      array = begin-array [ value *( value-separator value ) ] end-array[m
[31m-[m
[31m-2.4.  Numbers[m
[31m-[m
[31m-   The representation of numbers is similar to that used in most[m
[31m-   programming languages.  A number contains an integer component that[m
[31m-   may be prefixed with an optional minus sign, which may be followed by[m
[31m-   a fraction part and/or an exponent part.[m
[31m-[m
[31m-   Octal and hex forms are not allowed.  Leading zeros are not allowed.[m
[31m-[m
[31m-   A fraction part is a decimal point followed by one or more digits.[m
[31m-[m
[31m-   An exponent part begins with the letter E in upper or lowercase,[m
[31m-   which may be followed by a plus or minus sign.  The E and optional[m
[31m-   sign are followed by one or more digits.[m
[31m-[m
[31m-   Numeric values that cannot be represented as sequences of digits[m
[31m-   (such as Infinity and NaN) are not permitted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 3][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-         number = [ minus ] int [ frac ] [ exp ][m
[31m-[m
[31m-         decimal-point = %x2E       ; .[m
[31m-[m
[31m-         digit1-9 = %x31-39         ; 1-9[m
[31m-[m
[31m-         e = %x65 / %x45            ; e E[m
[31m-[m
[31m-         exp = e [ minus / plus ] 1*DIGIT[m
[31m-[m
[31m-         frac = decimal-point 1*DIGIT[m
[31m-[m
[31m-         int = zero / ( digit1-9 *DIGIT )[m
[31m-[m
[31m-         minus = %x2D               ; -[m
[31m-[m
[31m-         plus = %x2B                ; +[m
[31m-[m
[31m-         zero = %x30                ; 0[m
[31m-[m
[31m-2.5.  Strings[m
[31m-[m
[31m-   The representation of strings is similar to conventions used in the C[m
[31m-   family of programming languages.  A string begins and ends with[m
[31m-   quotation marks.  All Unicode characters may be placed within the[m
[31m-   quotation marks except for the characters that must be escaped:[m
[31m-   quotation mark, reverse solidus, and the control characters (U+0000[m
[31m-   through U+001F).[m
[31m-[m
[31m-   Any character may be escaped.  If the character is in the Basic[m
[31m-   Multilingual Plane (U+0000 through U+FFFF), then it may be[m
[31m-   represented as a six-character sequence: a reverse solidus, followed[m
[31m-   by the lowercase letter u, followed by four hexadecimal digits that[m
[31m-   encode the character's code point.  The hexadecimal letters A though[m
[31m-   F can be upper or lowercase.  So, for example, a string containing[m
[31m-   only a single reverse solidus character may be represented as[m
[31m-   "\u005C".[m
[31m-[m
[31m-   Alternatively, there are two-character sequence escape[m
[31m-   representations of some popular characters.  So, for example, a[m
[31m-   string containing only a single reverse solidus character may be[m
[31m-   represented more compactly as "\\".[m
[31m-[m
[31m-   To escape an extended character that is not in the Basic Multilingual[m
[31m-   Plane, the character is represented as a twelve-character sequence,[m
[31m-   encoding the UTF-16 surrogate pair.  So, for example, a string[m
[31m-   containing only the G clef character (U+1D11E) may be represented as[m
[31m-   "\uD834\uDD1E".[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 4][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-         string = quotation-mark *char quotation-mark[m
[31m-[m
[31m-         char = unescaped /[m
[31m-                escape ([m
[31m-                    %x22 /          ; "    quotation mark  U+0022[m
[31m-                    %x5C /          ; \    reverse solidus U+005C[m
[31m-                    %x2F /          ; /    solidus         U+002F[m
[31m-                    %x62 /          ; b    backspace       U+0008[m
[31m-                    %x66 /          ; f    form feed       U+000C[m
[31m-                    %x6E /          ; n    line feed       U+000A[m
[31m-                    %x72 /          ; r    carriage return U+000D[m
[31m-                    %x74 /          ; t    tab             U+0009[m
[31m-                    %x75 4HEXDIG )  ; uXXXX                U+XXXX[m
[31m-[m
[31m-         escape = %x5C              ; \[m
[31m-[m
[31m-         quotation-mark = %x22      ; "[m
[31m-[m
[31m-         unescaped = %x20-21 / %x23-5B / %x5D-10FFFF[m
[31m-[m
[31m-3.  Encoding[m
[31m-[m
[31m-   JSON text SHALL be encoded in Unicode.  The default encoding is[m
[31m-   UTF-8.[m
[31m-[m
[31m-   Since the first two characters of a JSON text will always be ASCII[m
[31m-   characters [RFC0020], it is possible to determine whether an octet[m
[31m-   stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking[m
[31m-   at the pattern of nulls in the first four octets.[m
[31m-[m
[31m-           00 00 00 xx  UTF-32BE[m
[31m-           00 xx 00 xx  UTF-16BE[m
[31m-           xx 00 00 00  UTF-32LE[m
[31m-           xx 00 xx 00  UTF-16LE[m
[31m-           xx xx xx xx  UTF-8[m
[31m-[m
[31m-4.  Parsers[m
[31m-[m
[31m-   A JSON parser transforms a JSON text into another representation.  A[m
[31m-   JSON parser MUST accept all texts that conform to the JSON grammar.[m
[31m-   A JSON parser MAY accept non-JSON forms or extensions.[m
[31m-[m
[31m-   An implementation may set limits on the size of texts that it[m
[31m-   accepts.  An implementation may set limits on the maximum depth of[m
[31m-   nesting.  An implementation may set limits on the range of numbers.[m
[31m-   An implementation may set limits on the length and character contents[m
[31m-   of strings.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 5][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-5. Generators[m
[31m-[m
[31m-   A JSON generator produces JSON text.  The resulting text MUST[m
[31m-   strictly conform to the JSON grammar.[m
[31m-[m
[31m-6. IANA Considerations[m
[31m-[m
[31m-   The MIME media type for JSON text is application/json.[m
[31m-[m
[31m-   Type name: application[m
[31m-[m
[31m-   Subtype name: json[m
[31m-[m
[31m-   Required parameters: n/a[m
[31m-[m
[31m-   Optional parameters: n/a[m
[31m-[m
[31m-   Encoding considerations: 8bit if UTF-8; binary if UTF-16 or UTF-32[m
[31m-[m
[31m-      JSON may be represented using UTF-8, UTF-16, or UTF-32.  When JSON[m
[31m-      is written in UTF-8, JSON is 8bit compatible.  When JSON is[m
[31m-      written in UTF-16 or UTF-32, the binary content-transfer-encoding[m
[31m-      must be used.[m
[31m-[m
[31m-   Security considerations:[m
[31m-[m
[31m-   Generally there are security issues with scripting languages.  JSON[m
[31m-   is a subset of JavaScript, but it is a safe subset that excludes[m
[31m-   assignment and invocation.[m
[31m-[m
[31m-   A JSON text can be safely passed into JavaScript's eval() function[m
[31m-   (which compiles and executes a string) if all the characters not[m
[31m-   enclosed in strings are in the set of characters that form JSON[m
[31m-   tokens.  This can be quickly determined in JavaScript with two[m
[31m-   regular expressions and calls to the test and replace methods.[m
[31m-[m
[31m-      var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test([m
[31m-             text.replace(/"(\\.|[^"\\])*"/g, ''))) &&[m
[31m-         eval('(' + text + ')');[m
[31m-[m
[31m-   Interoperability considerations: n/a[m
[31m-[m
[31m-   Published specification: RFC 4627[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 6][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-   Applications that use this media type:[m
[31m-[m
[31m-      JSON has been used to exchange data between applications written[m
[31m-      in all of these programming languages: ActionScript, C, C#,[m
[31m-      ColdFusion, Common Lisp, E, Erlang, Java, JavaScript, Lua,[m
[31m-      Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Scheme.[m
[31m-[m
[31m-   Additional information:[m
[31m-[m
[31m-      Magic number(s): n/a[m
[31m-      File extension(s): .json[m
[31m-      Macintosh file type code(s): TEXT[m
[31m-[m
[31m-   Person & email address to contact for further information:[m
[31m-      Douglas Crockford[m
[31m-      douglas@crockford.com[m
[31m-[m
[31m-   Intended usage: COMMON[m
[31m-[m
[31m-   Restrictions on usage: none[m
[31m-[m
[31m-   Author:[m
[31m-      Douglas Crockford[m
[31m-      douglas@crockford.com[m
[31m-[m
[31m-   Change controller:[m
[31m-      Douglas Crockford[m
[31m-      douglas@crockford.com[m
[31m-[m
[31m-7. Security Considerations[m
[31m-[m
[31m-   See Security Considerations in Section 6.[m
[31m-[m
[31m-8. Examples[m
[31m-[m
[31m-   This is a JSON object:[m
[31m-[m
[31m-   {[m
[31m-      "Image": {[m
[31m-          "Width":  800,[m
[31m-          "Height": 600,[m
[31m-          "Title":  "View from 15th Floor",[m
[31m-          "Thumbnail": {[m
[31m-              "Url":    "http://www.example.com/image/481989943",[m
[31m-              "Height": 125,[m
[31m-              "Width":  "100"[m
[31m-          },[m
[31m-          "IDs": [116, 943, 234, 38793][m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 7][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-        }[m
[31m-   }[m
[31m-[m
[31m-   Its Image member is an object whose Thumbnail member is an object[m
[31m-   and whose IDs member is an array of numbers.[m
[31m-[m
[31m-   This is a JSON array containing two objects:[m
[31m-[m
[31m-   [[m
[31m-      {[m
[31m-         "precision": "zip",[m
[31m-         "Latitude":  37.7668,[m
[31m-         "Longitude": -122.3959,[m
[31m-         "Address":   "",[m
[31m-         "City":      "SAN FRANCISCO",[m
[31m-         "State":     "CA",[m
[31m-         "Zip":       "94107",[m
[31m-         "Country":   "US"[m
[31m-      },[m
[31m-      {[m
[31m-         "precision": "zip",[m
[31m-         "Latitude":  37.371991,[m
[31m-         "Longitude": -122.026020,[m
[31m-         "Address":   "",[m
[31m-         "City":      "SUNNYVALE",[m
[31m-         "State":     "CA",[m
[31m-         "Zip":       "94085",[m
[31m-         "Country":   "US"[m
[31m-      }[m
[31m-   ][m
[31m-[m
[31m-9. References[m
[31m-[m
[31m-9.1.  Normative References[m
[31m-[m
[31m-   [ECMA]    European Computer Manufacturers Association, "ECMAScript[m
[31m-             Language Specification 3rd Edition", December 1999,[m
[31m-             <http://www.ecma-international.org/publications/files/[m
[31m-             ecma-st/ECMA-262.pdf>.[m
[31m-[m
[31m-   [RFC0020] Cerf, V., "ASCII format for network interchange", RFC 20,[m
[31m-             October 1969.[m
[31m-[m
[31m-   [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate[m
[31m-             Requirement Levels", BCP 14, RFC 2119, March 1997.[m
[31m-[m
[31m-   [RFC4234] Crocker, D. and P.  Overell, "Augmented BNF for Syntax[m
[31m-             Specifications: ABNF", RFC 4234, October 2005.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 8][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-   [UNICODE] The Unicode Consortium, "The Unicode Standard Version 4.0",[m
[31m-             2003, <http://www.unicode.org/versions/Unicode4.1.0/>.[m
[31m-[m
[31m-Author's Address[m
[31m-[m
[31m-   Douglas Crockford[m
[31m-   JSON.org[m
[31m-   EMail: douglas@crockford.com[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 9][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-Full Copyright Statement[m
[31m-[m
[31m-   Copyright (C) The Internet Society (2006).[m
[31m-[m
[31m-   This document is subject to the rights, licenses and restrictions[m
[31m-   contained in BCP 78, and except as set forth therein, the authors[m
[31m-   retain all their rights.[m
[31m-[m
[31m-   This document and the information contained herein are provided on an[m
[31m-   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS[m
[31m-   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET[m
[31m-   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,[m
[31m-   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE[m
[31m-   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED[m
[31m-   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.[m
[31m-[m
[31m-Intellectual Property[m
[31m-[m
[31m-   The IETF takes no position regarding the validity or scope of any[m
[31m-   Intellectual Property Rights or other rights that might be claimed to[m
[31m-   pertain to the implementation or use of the technology described in[m
[31m-   this document or the extent to which any license under such rights[m
[31m-   might or might not be available; nor does it represent that it has[m
[31m-   made any independent effort to identify any such rights.  Information[m
[31m-   on the procedures with respect to rights in RFC documents can be[m
[31m-   found in BCP 78 and BCP 79.[m
[31m-[m
[31m-   Copies of IPR disclosures made to the IETF Secretariat and any[m
[31m-   assurances of licenses to be made available, or the result of an[m
[31m-   attempt made to obtain a general license or permission for the use of[m
[31m-   such proprietary rights by implementers or users of this[m
[31m-   specification can be obtained from the IETF on-line IPR repository at[m
[31m-   http://www.ietf.org/ipr.[m
[31m-[m
[31m-   The IETF invites any interested party to bring to its attention any[m
[31m-   copyrights, patents or patent applications, or other proprietary[m
[31m-   rights that may cover technology that may be required to implement[m
[31m-   this standard.  Please address the information to the IETF at[m
[31m-   ietf-ipr@ietf.org.[m
[31m-[m
[31m-Acknowledgement[m
[31m-[m
[31m-   Funding for the RFC Editor function is provided by the IETF[m
[31m-   Administrative Support Activity (IASA).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                     [Page 10][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/runtests.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/runtests.sh[m
[1mdeleted file mode 100755[m
[1mindex 82dc8c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/runtests.sh[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-#!/bin/sh[m
[31m-[m
[31m-PLATFORM="`uname -s`"[m
[31m-[ "$1" ] && VERSION="$1" || VERSION="2.1devel"[m
[31m-[m
[31m-set -e[m
[31m-[m
[31m-# Portable "ggrep -A" replacement.[m
[31m-# Work around Solaris awk record limit of 2559 bytes.[m
[31m-# contextgrep PATTERN POST_MATCH_LINES[m
[31m-contextgrep() {[m
[31m-    cut -c -2500 | awk "/$1/ { count = ($2 + 1) } count > 0 { count--; print }"[m
[31m-}[m
[31m-[m
[31m-do_tests() {[m
[31m-    echo[m
[31m-    cd tests[m
[31m-    lua -e 'print("Testing Lua CJSON version " .. require("cjson")._VERSION)'[m
[31m-    ./test.lua | contextgrep 'FAIL|Summary' 3 | grep -v PASS | cut -c -150[m
[31m-    cd ..[m
[31m-}[m
[31m-[m
[31m-echo "===== Setting LuaRocks PATH ====="[m
[31m-eval "`luarocks path`"[m
[31m-[m
[31m-echo "===== Building UTF-8 test data ====="[m
[31m-( cd tests && ./genutf8.pl; )[m
[31m-[m
[31m-echo "===== Cleaning old build data ====="[m
[31m-make clean[m
[31m-rm -f tests/cjson.so[m
[31m-[m
[31m-echo "===== Verifying cjson.so is not installed ====="[m
[31m-[m
[31m-cd tests[m
[31m-if lua -e 'require "cjson"' 2>/dev/null[m
[31m-then[m
[31m-    cat <<EOT[m
[31m-Please ensure you do not have the Lua CJSON module installed before[m
[31m-running these tests.[m
[31m-EOT[m
[31m-    exit[m
[31m-fi[m
[31m-cd ..[m
[31m-[m
[31m-echo "===== Testing LuaRocks build ====="[m
[31m-luarocks make --local[m
[31m-do_tests[m
[31m-luarocks remove --local lua-cjson[m
[31m-make clean[m
[31m-[m
[31m-echo "===== Testing Makefile build ====="[m
[31m-make[m
[31m-cp -r lua/cjson cjson.so tests[m
[31m-do_tests[m
[31m-make clean[m
[31m-rm -rf tests/cjson{,.so}[m
[31m-[m
[31m-echo "===== Testing Cmake build ====="[m
[31m-mkdir build[m
[31m-cd build[m
[31m-cmake ..[m
[31m-make[m
[31m-cd ..[m
[31m-cp -r lua/cjson build/cjson.so tests[m
[31m-do_tests[m
[31m-rm -rf build tests/cjson{,.so}[m
[31m-[m
[31m-# vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.c[m
[1mdeleted file mode 100644[m
[1mindex f0f7f4b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.c[m
[1m+++ /dev/null[m
[36m@@ -1,251 +0,0 @@[m
[31m-/* strbuf - String buffer routines[m
[31m- *[m
[31m- * Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m- *[m
[31m- * Permission is hereby granted, free of charge, to any person obtaining[m
[31m- * a copy of this software and associated documentation files (the[m
[31m- * "Software"), to deal in the Software without restriction, including[m
[31m- * without limitation the rights to use, copy, modify, merge, publish,[m
[31m- * distribute, sublicense, and/or sell copies of the Software, and to[m
[31m- * permit persons to whom the Software is furnished to do so, subject to[m
[31m- * the following conditions:[m
[31m- *[m
[31m- * The above copyright notice and this permission notice shall be[m
[31m- * included in all copies or substantial portions of the Software.[m
[31m- *[m
[31m- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m- */[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#include "strbuf.h"[m
[31m-[m
[31m-static void die(const char *fmt, ...)[m
[31m-{[m
[31m-    va_list arg;[m
[31m-[m
[31m-    va_start(arg, fmt);[m
[31m-    vfprintf(stderr, fmt, arg);[m
[31m-    va_end(arg);[m
[31m-    fprintf(stderr, "\n");[m
[31m-[m
[31m-    exit(-1);[m
[31m-}[m
[31m-[m
[31m-void strbuf_init(strbuf_t *s, int len)[m
[31m-{[m
[31m-    int size;[m
[31m-[m
[31m-    if (len <= 0)[m
[31m-        size = STRBUF_DEFAULT_SIZE;[m
[31m-    else[m
[31m-        size = len + 1;         /* \0 terminator */[m
[31m-[m
[31m-    s->buf = NULL;[m
[31m-    s->size = size;[m
[31m-    s->length = 0;[m
[31m-    s->increment = STRBUF_DEFAULT_INCREMENT;[m
[31m-    s->dynamic = 0;[m
[31m-    s->reallocs = 0;[m
[31m-    s->debug = 0;[m
[31m-[m
[31m-    s->buf = malloc(size);[m
[31m-    if (!s->buf)[m
[31m-        die("Out of memory");[m
[31m-[m
[31m-    strbuf_ensure_null(s);[m
[31m-}[m
[31m-[m
[31m-strbuf_t *strbuf_new(int len)[m
[31m-{[m
[31m-    strbuf_t *s;[m
[31m-[m
[31m-    s = malloc(sizeof(strbuf_t));[m
[31m-    if (!s)[m
[31m-        die("Out of memory");[m
[31m-[m
[31m-    strbuf_init(s, len);[m
[31m-[m
[31m-    /* Dynamic strbuf allocation / deallocation */[m
[31m-    s->dynamic = 1;[m
[31m-[m
[31m-    return s;[m
[31m-}[m
[31m-[m
[31m-void strbuf_set_increment(strbuf_t *s, int increment)[m
[31m-{[m
[31m-    /* Increment > 0:  Linear buffer growth rate[m
[31m-     * Increment < -1: Exponential buffer growth rate */[m
[31m-    if (increment == 0 || increment == -1)[m
[31m-        die("BUG: Invalid string increment");[m
[31m-[m
[31m-    s->increment = increment;[m
[31m-}[m
[31m-[m
[31m-static inline void debug_stats(strbuf_t *s)[m
[31m-{[m
[31m-    if (s->debug) {[m
[31m-        fprintf(stderr, "strbuf(%lx) reallocs: %d, length: %d, size: %d\n",[m
[31m-                (long)s, s->reallocs, s->length, s->size);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* If strbuf_t has not been dynamically allocated, strbuf_free() can[m
[31m- * be called any number of times strbuf_init() */[m
[31m-void strbuf_free(strbuf_t *s)[m
[31m-{[m
[31m-    debug_stats(s);[m
[31m-[m
[31m-    if (s->buf) {[m
[31m-        free(s->buf);[m
[31m-        s->buf = NULL;[m
[31m-    }[m
[31m-    if (s->dynamic)[m
[31m-        free(s);[m
[31m-}[m
[31m-[m
[31m-char *strbuf_free_to_string(strbuf_t *s, int *len)[m
[31m-{[m
[31m-    char *buf;[m
[31m-[m
[31m-    debug_stats(s);[m
[31m-[m
[31m-    strbuf_ensure_null(s);[m
[31m-[m
[31m-    buf = s->buf;[m
[31m-    if (len)[m
[31m-        *len = s->length;[m
[31m-[m
[31m-    if (s->dynamic)[m
[31m-        free(s);[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-static int calculate_new_size(strbuf_t *s, int len)[m
[31m-{[m
[31m-    int reqsize, newsize;[m
[31m-[m
[31m-    if (len <= 0)[m
[31m-        die("BUG: Invalid strbuf length requested");[m
[31m-[m
[31m-    /* Ensure there is room for optional NULL termination */[m
[31m-    reqsize = len + 1;[m
[31m-[m
[31m-    /* If the user has requested to shrink the buffer, do it exactly */[m
[31m-    if (s->size > reqsize)[m
[31m-        return reqsize;[m
[31m-[m
[31m-    newsize = s->size;[m
[31m-    if (s->increment < 0) {[m
[31m-        /* Exponential sizing */[m
[31m-        while (newsize < reqsize)[m
[31m-            newsize *= -s->increment;[m
[31m-    } else {[m
[31m-        /* Linear sizing */[m
[31m-        newsize = ((newsize + s->increment - 1) / s->increment) * s->increment;[m
[31m-    }[m
[31m-[m
[31m-    return newsize;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Ensure strbuf can handle a string length bytes long (ignoring NULL[m
[31m- * optional termination). */[m
[31m-void strbuf_resize(strbuf_t *s, int len)[m
[31m-{[m
[31m-    int newsize;[m
[31m-[m
[31m-    newsize = calculate_new_size(s, len);[m
[31m-[m
[31m-    if (s->debug > 1) {[m
[31m-        fprintf(stderr, "strbuf(%lx) resize: %d => %d\n",[m
[31m-                (long)s, s->size, newsize);[m
[31m-    }[m
[31m-[m
[31m-    s->size = newsize;[m
[31m-    s->buf = realloc(s->buf, s->size);[m
[31m-    if (!s->buf)[m
[31m-        die("Out of memory");[m
[31m-    s->reallocs++;[m
[31m-}[m
[31m-[m
[31m-void strbuf_append_string(strbuf_t *s, const char *str)[m
[31m-{[m
[31m-    int space, i;[m
[31m-[m
[31m-    space = strbuf_empty_length(s);[m
[31m-[m
[31m-    for (i = 0; str[i]; i++) {[m
[31m-        if (space < 1) {[m
[31m-            strbuf_resize(s, s->length + 1);[m
[31m-            space = strbuf_empty_length(s);[m
[31m-        }[m
[31m-[m
[31m-        s->buf[s->length] = str[i];[m
[31m-        s->length++;[m
[31m-        space--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* strbuf_append_fmt() should only be used when an upper bound[m
[31m- * is known for the output string. */[m
[31m-void strbuf_append_fmt(strbuf_t *s, int len, const char *fmt, ...)[m
[31m-{[m
[31m-    va_list arg;[m
[31m-    int fmt_len;[m
[31m-[m
[31m-    strbuf_ensure_empty_length(s, len);[m
[31m-[m
[31m-    va_start(arg, fmt);[m
[31m-    fmt_len = vsnprintf(s->buf + s->length, len, fmt, arg);[m
[31m-    va_end(arg);[m
[31m-[m
[31m-    if (fmt_len < 0)[m
[31m-        die("BUG: Unable to convert number");  /* This should never happen.. */[m
[31m-[m
[31m-    s->length += fmt_len;[m
[31m-}[m
[31m-[m
[31m-/* strbuf_append_fmt_retry() can be used when the there is no known[m
[31m- * upper bound for the output string. */[m
[31m-void strbuf_append_fmt_retry(strbuf_t *s, const char *fmt, ...)[m
[31m-{[m
[31m-    va_list arg;[m
[31m-    int fmt_len, try;[m
[31m-    int empty_len;[m
[31m-[m
[31m-    /* If the first attempt to append fails, resize the buffer appropriately[m
[31m-     * and try again */[m
[31m-    for (try = 0; ; try++) {[m
[31m-        va_start(arg, fmt);[m
[31m-        /* Append the new formatted string */[m
[31m-        /* fmt_len is the length of the string required, excluding the[m
[31m-         * trailing NULL */[m
[31m-        empty_len = strbuf_empty_length(s);[m
[31m-        /* Add 1 since there is also space to store the terminating NULL. */[m
[31m-        fmt_len = vsnprintf(s->buf + s->length, empty_len + 1, fmt, arg);[m
[31m-        va_end(arg);[m
[31m-[m
[31m-        if (fmt_len <= empty_len)[m
[31m-            break;  /* SUCCESS */[m
[31m-        if (try > 0)[m
[31m-            die("BUG: length of formatted string changed");[m
[31m-[m
[31m-        strbuf_resize(s, s->length + fmt_len);[m
[31m-    }[m
[31m-[m
[31m-    s->length += fmt_len;[m
[31m-}[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.h[m
[1mdeleted file mode 100644[m
[1mindex d861108..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.h[m
[1m+++ /dev/null[m
[36m@@ -1,154 +0,0 @@[m
[31m-/* strbuf - String buffer routines[m
[31m- *[m
[31m- * Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m- *[m
[31m- * Permission is hereby granted, free of charge, to any person obtaining[m
[31m- * a copy of this software and associated documentation files (the[m
[31m- * "Software"), to deal in the Software without restriction, including[m
[31m- * without limitation the rights to use, copy, modify, merge, publish,[m
[31m- * distribute, sublicense, and/or sell copies of the Software, and to[m
[31m- * permit persons to whom the Software is furnished to do so, subject to[m
[31m- * the following conditions:[m
[31m- *[m
[31m- * The above copyright notice and this permission notice shall be[m
[31m- * included in all copies or substantial portions of the Software.[m
[31m- *[m
[31m- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m- */[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-/* Size: Total bytes allocated to *buf[m
[31m- * Length: String length, excluding optional NULL terminator.[m
[31m- * Increment: Allocation increments when resizing the string buffer.[m
[31m- * Dynamic: True if created via strbuf_new()[m
[31m- */[m
[31m-[m
[31m-typedef struct {[m
[31m-    char *buf;[m
[31m-    int size;[m
[31m-    int length;[m
[31m-    int increment;[m
[31m-    int dynamic;[m
[31m-    int reallocs;[m
[31m-    int debug;[m
[31m-} strbuf_t;[m
[31m-[m
[31m-#ifndef STRBUF_DEFAULT_SIZE[m
[31m-#define STRBUF_DEFAULT_SIZE 1023[m
[31m-#endif[m
[31m-#ifndef STRBUF_DEFAULT_INCREMENT[m
[31m-#define STRBUF_DEFAULT_INCREMENT -2[m
[31m-#endif[m
[31m-[m
[31m-/* Initialise */[m
[31m-extern strbuf_t *strbuf_new(int len);[m
[31m-extern void strbuf_init(strbuf_t *s, int len);[m
[31m-extern void strbuf_set_increment(strbuf_t *s, int increment);[m
[31m-[m
[31m-/* Release */[m
[31m-extern void strbuf_free(strbuf_t *s);[m
[31m-extern char *strbuf_free_to_string(strbuf_t *s, int *len);[m
[31m-[m
[31m-/* Management */[m
[31m-extern void strbuf_resize(strbuf_t *s, int len);[m
[31m-static int strbuf_empty_length(strbuf_t *s);[m
[31m-static int strbuf_length(strbuf_t *s);[m
[31m-static char *strbuf_string(strbuf_t *s, int *len);[m
[31m-static void strbuf_ensure_empty_length(strbuf_t *s, int len);[m
[31m-static char *strbuf_empty_ptr(strbuf_t *s);[m
[31m-static void strbuf_extend_length(strbuf_t *s, int len);[m
[31m-[m
[31m-/* Update */[m
[31m-extern void strbuf_append_fmt(strbuf_t *s, int len, const char *fmt, ...);[m
[31m-extern void strbuf_append_fmt_retry(strbuf_t *s, const char *format, ...);[m
[31m-static void strbuf_append_mem(strbuf_t *s, const char *c, int len);[m
[31m-extern void strbuf_append_string(strbuf_t *s, const char *str);[m
[31m-static void strbuf_append_char(strbuf_t *s, const char c);[m
[31m-static void strbuf_ensure_null(strbuf_t *s);[m
[31m-[m
[31m-/* Reset string for before use */[m
[31m-static inline void strbuf_reset(strbuf_t *s)[m
[31m-{[m
[31m-    s->length = 0;[m
[31m-}[m
[31m-[m
[31m-static inline int strbuf_allocated(strbuf_t *s)[m
[31m-{[m
[31m-    return s->buf != NULL;[m
[31m-}[m
[31m-[m
[31m-/* Return bytes remaining in the string buffer[m
[31m- * Ensure there is space for a NULL terminator. */[m
[31m-static inline int strbuf_empty_length(strbuf_t *s)[m
[31m-{[m
[31m-    return s->size - s->length - 1;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_ensure_empty_length(strbuf_t *s, int len)[m
[31m-{[m
[31m-    if (len > strbuf_empty_length(s))[m
[31m-        strbuf_resize(s, s->length + len);[m
[31m-}[m
[31m-[m
[31m-static inline char *strbuf_empty_ptr(strbuf_t *s)[m
[31m-{[m
[31m-    return s->buf + s->length;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_extend_length(strbuf_t *s, int len)[m
[31m-{[m
[31m-    s->length += len;[m
[31m-}[m
[31m-[m
[31m-static inline int strbuf_length(strbuf_t *s)[m
[31m-{[m
[31m-    return s->length;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_append_char(strbuf_t *s, const char c)[m
[31m-{[m
[31m-    strbuf_ensure_empty_length(s, 1);[m
[31m-    s->buf[s->length++] = c;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_append_char_unsafe(strbuf_t *s, const char c)[m
[31m-{[m
[31m-    s->buf[s->length++] = c;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_append_mem(strbuf_t *s, const char *c, int len)[m
[31m-{[m
[31m-    strbuf_ensure_empty_length(s, len);[m
[31m-    memcpy(s->buf + s->length, c, len);[m
[31m-    s->length += len;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_append_mem_unsafe(strbuf_t *s, const char *c, int len)[m
[31m-{[m
[31m-    memcpy(s->buf + s->length, c, len);[m
[31m-    s->length += len;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_ensure_null(strbuf_t *s)[m
[31m-{[m
[31m-    s->buf[s->length] = 0;[m
[31m-}[m
[31m-[m
[31m-static inline char *strbuf_string(strbuf_t *s, int *len)[m
[31m-{[m
[31m-    if (len)[m
[31m-        *len = s->length;[m
[31m-[m
[31m-    return s->buf;[m
[31m-}[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.o[m
[1mdeleted file mode 100644[m
[1mindex 342d224..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/strbuf.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/README[m
[1mdeleted file mode 100644[m
[1mindex 39e8bd4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/README[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-These JSON examples were taken from the JSON website[m
[31m-(http://json.org/example.html) and RFC 4627.[m
[31m-[m
[31m-Used with permission.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/TestLua.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/TestLua.pm[m
[1mdeleted file mode 100644[m
[1mindex b029a72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/TestLua.pm[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-package TestLua;[m
[31m-[m
[31m-use Test::Base -Base;[m
[31m-use IPC::Run3;[m
[31m-use Cwd;[m
[31m-[m
[31m-use Test::LongString;[m
[31m-[m
[31m-our @EXPORT = qw( run_tests );[m
[31m-[m
[31m-$ENV{LUA_CPATH} = "../?.so;;";[m
[31m-$ENV{LUA_PATH} = "../lua/?.lua;;";[m
[31m-#$ENV{LUA_PATH} = ($ENV{LUA_PATH} || "" ) . ';' . getcwd . "/runtime/?.lua" . ';;';[m
[31m-[m
[31m-sub run_test ($) {[m
[31m-    my $block = shift;[m
[31m-    #print $json_xs->pretty->encode(\@new_rows);[m
[31m-    #my $res = #print $json_xs->pretty->encode($res);[m
[31m-    my $name = $block->name;[m
[31m-[m
[31m-    my $lua = $block->lua or[m
[31m-        die "No --- lua specified for test $name\n";[m
[31m-[m
[31m-    my $luafile = "test_case.lua";[m
[31m-[m
[31m-    open my $fh, ">$luafile" or[m
[31m-        die "Cannot open $luafile for writing: $!\n";[m
[31m-[m
[31m-    print $fh $lua;[m
[31m-    close $fh;[m
[31m-[m
[31m-    my ($res, $err);[m
[31m-[m
[31m-    my @cmd;[m
[31m-[m
[31m-    if ($ENV{TEST_LUA_USE_VALGRIND}) {[m
[31m-        warn "$name\n";[m
[31m-        @cmd =  ('valgrind', '-q', '--leak-check=full', 'lua', 'test_case.lua');[m
[31m-    } else {[m
[31m-        @cmd =  ('lua', 'test_case.lua');[m
[31m-    }[m
[31m-[m
[31m-    run3 \@cmd, undef, \$res, \$err;[m
[31m-    my $rc = $?;[m
[31m-[m
[31m-    #warn "res:$res\nerr:$err\n";[m
[31m-[m
[31m-    if (defined $block->err) {[m
[31m-        $err =~ /.*:.*:.*: (.*\s)?/;[m
[31m-        $err = $1;[m
[31m-        is $err, $block->err, "$name - err expected";[m
[31m-[m
[31m-    } elsif ($rc) {[m
[31m-        die "Failed to execute --- lua for test $name: $err\n";[m
[31m-[m
[31m-    } else {[m
[31m-        #is $res, $block->out, "$name - output ok";[m
[31m-        is $res, $block->out, "$name - output ok";[m
[31m-    }[m
[31m-[m
[31m-    is $rc, ($block->exit || 0), "$name - exit code ok";[m
[31m-    #unlink 'test_case.lua' or warn "could not delete \'test_case.lua\':$!";[m
[31m-}[m
[31m-[m
[31m-sub run_tests () {[m
[31m-    for my $block (blocks()) {[m
[31m-        run_test($block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/agentzh.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/agentzh.t[m
[1mdeleted file mode 100644[m
[1mindex e76f910..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/agentzh.t[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-use TestLua;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: empty tables as objects[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-print(cjson.encode({}))[m
[31m-print(cjson.encode({dogs = {}}))[m
[31m---- out[m
[31m-{}[m
[31m-{"dogs":{}}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty tables as arrays[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-cjson.encode_empty_table_as_object(false)[m
[31m-print(cjson.encode({}))[m
[31m-print(cjson.encode({dogs = {}}))[m
[31m---- out[m
[31m-[][m
[31m-{"dogs":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: empty tables as objects (explicit)[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-cjson.encode_empty_table_as_object(true)[m
[31m-print(cjson.encode({}))[m
[31m-print(cjson.encode({dogs = {}}))[m
[31m---- out[m
[31m-{}[m
[31m-{"dogs":{}}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: empty_array userdata[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-print(cjson.encode({arr = cjson.empty_array}))[m
[31m---- out[m
[31m-{"arr":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: empty_array_mt[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-local empty_arr = setmetatable({}, cjson.empty_array_mt)[m
[31m-print(cjson.encode({arr = empty_arr}))[m
[31m---- out[m
[31m-{"arr":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: empty_array_mt and empty tables as objects (explicit)[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-local empty_arr = setmetatable({}, cjson.empty_array_mt)[m
[31m-print(cjson.encode({obj = {}, arr = empty_arr}))[m
[31m---- out[m
[31m-{"arr":[],"obj":{}}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty_array_mt and empty tables as objects (explicit)[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-cjson.encode_empty_table_as_object(true)[m
[31m-local empty_arr = setmetatable({}, cjson.empty_array_mt)[m
[31m-local data = {[m
[31m-  arr = empty_arr,[m
[31m-  foo = {[m
[31m-    obj = {},[m
[31m-    foobar = {[m
[31m-      arr = cjson.empty_array,[m
[31m-      obj = {}[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-print(cjson.encode(data))[m
[31m---- out[m
[31m-{"foo":{"foobar":{"obj":{},"arr":[]},"obj":{}},"arr":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty_array_mt on non-empty tables[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-cjson.encode_empty_table_as_object(true)[m
[31m-local array = {"hello", "world", "lua"}[m
[31m-setmetatable(array, cjson.empty_array_mt)[m
[31m-local data = {[m
[31m-  arr = array,[m
[31m-  foo = {[m
[31m-    obj = {},[m
[31m-    foobar = {[m
[31m-      arr = cjson.empty_array,[m
[31m-      obj = {}[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-print(cjson.encode(data))[m
[31m---- out[m
[31m-{"foo":{"foobar":{"obj":{},"arr":[]},"obj":{}},"arr":["hello","world","lua"]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: & in JSON[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-local a="[\"a=1&b=2\"]"[m
[31m-local b=cjson.decode(a)[m
[31m-print(cjson.encode(b))[m
[31m---- out[m
[31m-["a=1&b=2"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: default and max precision[m
[31m---- lua[m
[31m-local math = require "math"[m
[31m-local cjson = require "cjson"[m
[31m-local double = math.pow(2, 53)[m
[31m-print(cjson.encode(double))[m
[31m-cjson.encode_number_precision(16)[m
[31m-print(cjson.encode(double))[m
[31m-print(string.format("%16.0f", cjson.decode("9007199254740992")))[m
[31m---- out[m
[31m-9.007199254741e+15[m
[31m-9007199254740992[m
[31m-9007199254740992[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/bench.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/bench.lua[m
[1mdeleted file mode 100755[m
[1mindex 648020b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/bench.lua[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env lua[m
[31m-[m
[31m--- This benchmark script measures wall clock time and should be[m
[31m--- run on an unloaded system.[m
[31m---[m
[31m--- Your Mileage May Vary.[m
[31m---[m
[31m--- Mark Pulford <mark@kyne.com.au>[m
[31m-[m
[31m-local json_module = os.getenv("JSON_MODULE") or "cjson"[m
[31m-[m
[31m-require "socket"[m
[31m-local json = require(json_module)[m
[31m-local util = require "cjson.util"[m
[31m-[m
[31m-local function find_func(mod, funcnames)[m
[31m-    for _, v in ipairs(funcnames) do[m
[31m-        if mod[v] then[m
[31m-            return mod[v][m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-local json_encode = find_func(json, { "encode", "Encode", "to_string", "stringify", "json" })[m
[31m-local json_decode = find_func(json, { "decode", "Decode", "to_value", "parse" })[m
[31m-[m
[31m-local function average(t)[m
[31m-    local total = 0[m
[31m-    for _, v in ipairs(t) do[m
[31m-        total = total + v[m
[31m-    end[m
[31m-    return total / #t[m
[31m-end[m
[31m-[m
[31m-function benchmark(tests, seconds, rep)[m
[31m-    local function bench(func, iter)[m
[31m-        -- Use socket.gettime() to measure microsecond resolution[m
[31m-        -- wall clock time.[m
[31m-        local t = socket.gettime()[m
[31m-        for i = 1, iter do[m
[31m-            func(i)[m
[31m-        end[m
[31m-        t = socket.gettime() - t[m
[31m-[m
[31m-        -- Don't trust any results when the run lasted for less than a[m
[31m-        -- millisecond - return nil.[m
[31m-        if t < 0.001 then[m
[31m-            return nil[m
[31m-        end[m
[31m-[m
[31m-        return (iter / t)[m
[31m-    end[m
[31m-[m
[31m-    -- Roughly calculate the number of interations required[m
[31m-    -- to obtain a particular time period.[m
[31m-    local function calc_iter(func, seconds)[m
[31m-        local iter = 1[m
[31m-        local rate[m
[31m-        -- Warm up the bench function first.[m
[31m-        func()[m
[31m-        while not rate do[m
[31m-            rate = bench(func, iter)[m
[31m-            iter = iter * 10[m
[31m-        end[m
[31m-        return math.ceil(seconds * rate)[m
[31m-    end[m
[31m-[m
[31m-    local test_results = {}[m
[31m-    for name, func in pairs(tests) do[m
[31m-        -- k(number), v(string)[m
[31m-        -- k(string), v(function)[m
[31m-        -- k(number), v(function)[m
[31m-        if type(func) == "string" then[m
[31m-            name = func[m
[31m-            func = _G[name][m
[31m-        end[m
[31m-[m
[31m-        local iter = calc_iter(func, seconds)[m
[31m-[m
[31m-        local result = {}[m
[31m-        for i = 1, rep do[m
[31m-            result[i] = bench(func, iter)[m
[31m-        end[m
[31m-[m
[31m-        -- Remove the slowest half (round down) of the result set[m
[31m-        table.sort(result)[m
[31m-        for i = 1, math.floor(#result / 2) do[m
[31m-            table.remove(result, 1)[m
[31m-        end[m
[31m-[m
[31m-        test_results[name] = average(result)[m
[31m-    end[m
[31m-[m
[31m-    return test_results[m
[31m-end[m
[31m-[m
[31m-function bench_file(filename)[m
[31m-    local data_json = util.file_load(filename)[m
[31m-    local data_obj = json_decode(data_json)[m
[31m-[m
[31m-    local function test_encode()[m
[31m-        json_encode(data_obj)[m
[31m-    end[m
[31m-    local function test_decode()[m
[31m-        json_decode(data_json)[m
[31m-    end[m
[31m-[m
[31m-    local tests = {}[m
[31m-    if json_encode then tests.encode = test_encode end[m
[31m-    if json_decode then tests.decode = test_decode end[m
[31m-[m
[31m-    return benchmark(tests, 0.1, 5)[m
[31m-end[m
[31m-[m
[31m--- Optionally load any custom configuration required for this module[m
[31m-local success, data = pcall(util.file_load, ("bench-%s.lua"):format(json_module))[m
[31m-if success then[m
[31m-    util.run_script(data, _G)[m
[31m-    configure(json)[m
[31m-end[m
[31m-[m
[31m-for i = 1, #arg do[m
[31m-    local results = bench_file(arg[i])[m
[31m-    for k, v in pairs(results) do[m
[31m-        print(("%s\t%s\t%d"):format(arg[i], k, v))[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example1.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example1.json[m
[1mdeleted file mode 100644[m
[1mindex 42486ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example1.json[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-{[m
[31m-    "glossary": {[m
[31m-        "title": "example glossary",[m
[31m-                "GlossDiv": {[m
[31m-            "title": "S",[m
[31m-                        "GlossList": {[m
[31m-                "GlossEntry": {[m
[31m-                    "ID": "SGML",[m
[31m-                                        "SortAs": "SGML",[m
[31m-                                        "GlossTerm": "Standard Generalized Mark up Language",[m
[31m-                                        "Acronym": "SGML",[m
[31m-                                        "Abbrev": "ISO 8879:1986",[m
[31m-                                        "GlossDef": {[m
[31m-                        "para": "A meta-markup language, used to create markup languages such as DocBook.",[m
[31m-                                                "GlossSeeAlso": ["GML", "XML"][m
[31m-                    },[m
[31m-                                        "GlossSee": "markup"[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example2.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example2.json[m
[1mdeleted file mode 100644[m
[1mindex 5600991..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example2.json[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-{"menu": {[m
[31m-  "id": "file",[m
[31m-  "value": "File",[m
[31m-  "popup": {[m
[31m-    "menuitem": [[m
[31m-      {"value": "New", "onclick": "CreateNewDoc()"},[m
[31m-      {"value": "Open", "onclick": "OpenDoc()"},[m
[31m-      {"value": "Close", "onclick": "CloseDoc()"}[m
[31m-    ][m
[31m-  }[m
[31m-}}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example3.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example3.json[m
[1mdeleted file mode 100644[m
[1mindex d7237a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example3.json[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-{"widget": {[m
[31m-    "debug": "on",[m
[31m-    "window": {[m
[31m-        "title": "Sample Konfabulator Widget",[m
[31m-        "name": "main_window",[m
[31m-        "width": 500,[m
[31m-        "height": 500[m
[31m-    },[m
[31m-    "image": {[m
[31m-        "src": "Images/Sun.png",[m
[31m-        "name": "sun1",[m
[31m-        "hOffset": 250,[m
[31m-        "vOffset": 250,[m
[31m-        "alignment": "center"[m
[31m-    },[m
[31m-    "text": {[m
[31m-        "data": "Click Here",[m
[31m-        "size": 36,[m
[31m-        "style": "bold",[m
[31m-        "name": "text1",[m
[31m-        "hOffset": 250,[m
[31m-        "vOffset": 100,[m
[31m-        "alignment": "center",[m
[31m-        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"[m
[31m-    }[m
[31m-}}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example4.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example4.json[m
[1mdeleted file mode 100644[m
[1mindex d31a395..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example4.json[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-{"web-app": {[m
[31m-  "servlet": [[m
[31m-    {[m
[31m-      "servlet-name": "cofaxCDS",[m
[31m-      "servlet-class": "org.cofax.cds.CDSServlet",[m
[31m-      "init-param": {[m
[31m-        "configGlossary:installationAt": "Philadelphia, PA",[m
[31m-        "configGlossary:adminEmail": "ksm@pobox.com",[m
[31m-        "configGlossary:poweredBy": "Cofax",[m
[31m-        "configGlossary:poweredByIcon": "/images/cofax.gif",[m
[31m-        "configGlossary:staticPath": "/content/static",[m
[31m-        "templateProcessorClass": "org.cofax.WysiwygTemplate",[m
[31m-        "templateLoaderClass": "org.cofax.FilesTemplateLoader",[m
[31m-        "templatePath": "templates",[m
[31m-        "templateOverridePath": "",[m
[31m-        "defaultListTemplate": "listTemplate.htm",[m
[31m-        "defaultFileTemplate": "articleTemplate.htm",[m
[31m-        "useJSP": false,[m
[31m-        "jspListTemplate": "listTemplate.jsp",[m
[31m-        "jspFileTemplate": "articleTemplate.jsp",[m
[31m-        "cachePackageTagsTrack": 200,[m
[31m-        "cachePackageTagsStore": 200,[m
[31m-        "cachePackageTagsRefresh": 60,[m
[31m-        "cacheTemplatesTrack": 100,[m
[31m-        "cacheTemplatesStore": 50,[m
[31m-        "cacheTemplatesRefresh": 15,[m
[31m-        "cachePagesTrack": 200,[m
[31m-        "cachePagesStore": 100,[m
[31m-        "cachePagesRefresh": 10,[m
[31m-        "cachePagesDirtyRead": 10,[m
[31m-        "searchEngineListTemplate": "forSearchEnginesList.htm",[m
[31m-        "searchEngineFileTemplate": "forSearchEngines.htm",[m
[31m-        "searchEngineRobotsDb": "WEB-INF/robots.db",[m
[31m-        "useDataStore": true,[m
[31m-        "dataStoreClass": "org.cofax.SqlDataStore",[m
[31m-        "redirectionClass": "org.cofax.SqlRedirection",[m
[31m-        "dataStoreName": "cofax",[m
[31m-        "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver",[m
[31m-        "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon",[m
[31m-        "dataStoreUser": "sa",[m
[31m-        "dataStorePassword": "dataStoreTestQuery",[m
[31m-        "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",[m
[31m-        "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",[m
[31m-        "dataStoreInitConns": 10,[m
[31m-        "dataStoreMaxConns": 100,[m
[31m-        "dataStoreConnUsageLimit": 100,[m
[31m-        "dataStoreLogLevel": "debug",[m
[31m-        "maxUrlLength": 500}},[m
[31m-    {[m
[31m-      "servlet-name": "cofaxEmail",[m
[31m-      "servlet-class": "org.cofax.cds.EmailServlet",[m
[31m-      "init-param": {[m
[31m-      "mailHost": "mail1",[m
[31m-      "mailHostOverride": "mail2"}},[m
[31m-    {[m
[31m-      "servlet-name": "cofaxAdmin",[m
[31m-      "servlet-class": "org.cofax.cds.AdminServlet"},[m
[31m-[m
[31m-    {[m
[31m-      "servlet-name": "fileServlet",[m
[31m-      "servlet-class": "org.cofax.cds.FileServlet"},[m
[31m-    {[m
[31m-      "servlet-name": "cofaxTools",[m
[31m-      "servlet-class": "org.cofax.cms.CofaxToolsServlet",[m
[31m-      "init-param": {[m
[31m-        "templatePath": "toolstemplates/",[m
[31m-        "log": 1,[m
[31m-        "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",[m
[31m-        "logMaxSize": "",[m
[31m-        "dataLog": 1,[m
[31m-        "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",[m
[31m-        "dataLogMaxSize": "",[m
[31m-        "removePageCache": "/content/admin/remove?cache=pages&id=",[m
[31m-        "removeTemplateCache": "/content/admin/remove?cache=templates&id=",[m
[31m-        "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",[m
[31m-        "lookInContext": 1,[m
[31m-        "adminGroupID": 4,[m
[31m-        "betaServer": true}}],[m
[31m-  "servlet-mapping": {[m
[31m-    "cofaxCDS": "/",[m
[31m-    "cofaxEmail": "/cofaxutil/aemail/*",[m
[31m-    "cofaxAdmin": "/admin/*",[m
[31m-    "fileServlet": "/static/*",[m
[31m-    "cofaxTools": "/tools/*"},[m
[31m-[m
[31m-  "taglib": {[m
[31m-    "taglib-uri": "cofax.tld",[m
[31m-    "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example5.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example5.json[m
[1mdeleted file mode 100644[m
[1mindex 49980ca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/example5.json[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-{"menu": {[m
[31m-    "header": "SVG Viewer",[m
[31m-    "items": [[m
[31m-        {"id": "Open"},[m
[31m-        {"id": "OpenNew", "label": "Open New"},[m
[31m-        null,[m
[31m-        {"id": "ZoomIn", "label": "Zoom In"},[m
[31m-        {"id": "ZoomOut", "label": "Zoom Out"},[m
[31m-        {"id": "OriginalView", "label": "Original View"},[m
[31m-        null,[m
[31m-        {"id": "Quality"},[m
[31m-        {"id": "Pause"},[m
[31m-        {"id": "Mute"},[m
[31m-        null,[m
[31m-        {"id": "Find", "label": "Find..."},[m
[31m-        {"id": "FindAgain", "label": "Find Again"},[m
[31m-        {"id": "Copy"},[m
[31m-        {"id": "CopyAgain", "label": "Copy Again"},[m
[31m-        {"id": "CopySVG", "label": "Copy SVG"},[m
[31m-        {"id": "ViewSVG", "label": "View SVG"},[m
[31m-        {"id": "ViewSource", "label": "View Source"},[m
[31m-        {"id": "SaveAs", "label": "Save As"},[m
[31m-        null,[m
[31m-        {"id": "Help"},[m
[31m-        {"id": "About", "label": "About Adobe CVG Viewer..."}[m
[31m-    ][m
[31m-}}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/genutf8.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/genutf8.pl[m
[1mdeleted file mode 100755[m
[1mindex db661a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/genutf8.pl[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-# Create test comparison data using a different UTF-8 implementation.[m
[31m-[m
[31m-# The generated utf8.dat file must have the following MD5 sum:[m
[31m-#       cff03b039d850f370a7362f3313e5268[m
[31m-[m
[31m-use strict;[m
[31m-[m
[31m-# 0xD800 - 0xDFFF are used to encode supplementary codepoints[m
[31m-# 0x10000 - 0x10FFFF are supplementary codepoints[m
[31m-my (@codepoints) = (0 .. 0xD7FF, 0xE000 .. 0x10FFFF);[m
[31m-[m
[31m-my $utf8 = pack("U*", @codepoints);[m
[31m-defined($utf8) or die "Unable create UTF-8 string\n";[m
[31m-[m
[31m-open(FH, ">:utf8", "utf8.dat")[m
[31m-    or die "Unable to open utf8.dat: $!\n";[m
[31m-print FH $utf8[m
[31m-    or die "Unable to write utf8.dat\n";[m
[31m-close(FH);[m
[31m-[m
[31m-# vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/numbers.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/numbers.json[m
[1mdeleted file mode 100644[m
[1mindex 4f981ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/numbers.json[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-[ 0.110001,[m
[31m-  0.12345678910111,[m
[31m-  0.412454033640,[m
[31m-  2.6651441426902,[m
[31m-  2.718281828459,[m
[31m-  3.1415926535898,[m
[31m-  2.1406926327793 ][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/octets-escaped.dat b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/octets-escaped.dat[m
[1mdeleted file mode 100644[m
[1mindex ee99a6b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/octets-escaped.dat[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-.\/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007f"[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/rfc-example1.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/rfc-example1.json[m
[1mdeleted file mode 100644[m
[1mindex 73532fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/rfc-example1.json[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-{[m
[31m-   "Image": {[m
[31m-       "Width":  800,[m
[31m-       "Height": 600,[m
[31m-       "Title":  "View from 15th Floor",[m
[31m-       "Thumbnail": {[m
[31m-           "Url":    "http://www.example.com/image/481989943",[m
[31m-           "Height": 125,[m
[31m-           "Width":  "100"[m
[31m-       },[m
[31m-       "IDs": [116, 943, 234, 38793][m
[31m-     }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/rfc-example2.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/rfc-example2.json[m
[1mdeleted file mode 100644[m
[1mindex 2a0cb68..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/rfc-example2.json[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[[m
[31m-   {[m
[31m-      "precision": "zip",[m
[31m-      "Latitude":  37.7668,[m
[31m-      "Longitude": -122.3959,[m
[31m-      "Address":   "",[m
[31m-      "City":      "SAN FRANCISCO",[m
[31m-      "State":     "CA",[m
[31m-      "Zip":       "94107",[m
[31m-      "Country":   "US"[m
[31m-   },[m
[31m-   {[m
[31m-      "precision": "zip",[m
[31m-      "Latitude":  37.371991,[m
[31m-      "Longitude": -122.026020,[m
[31m-      "Address":   "",[m
[31m-      "City":      "SUNNYVALE",[m
[31m-      "State":     "CA",[m
[31m-      "Zip":       "94085",[m
[31m-      "Country":   "US"[m
[31m-   }[m
[31m-][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/test.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/test.lua[m
[1mdeleted file mode 100755[m
[1mindex c96dd3d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/test.lua[m
[1m+++ /dev/null[m
[36m@@ -1,425 +0,0 @@[m
[31m-#!/usr/bin/env lua[m
[31m-[m
[31m--- Lua CJSON tests[m
[31m---[m
[31m--- Mark Pulford <mark@kyne.com.au>[m
[31m---[m
[31m--- Note: The output of this script is easier to read with "less -S"[m
[31m-[m
[31m-local json = require "cjson"[m
[31m-local json_safe = require "cjson.safe"[m
[31m-local util = require "cjson.util"[m
[31m-[m
[31m-local function gen_raw_octets()[m
[31m-    local chars = {}[m
[31m-    for i = 0, 255 do chars[i + 1] = string.char(i) end[m
[31m-    return table.concat(chars)[m
[31m-end[m
[31m-[m
[31m--- Generate every UTF-16 codepoint, including supplementary codes[m
[31m-local function gen_utf16_escaped()[m
[31m-    -- Create raw table escapes[m
[31m-    local utf16_escaped = {}[m
[31m-    local count = 0[m
[31m-[m
[31m-    local function append_escape(code)[m
[31m-        local esc = ('\\u%04X'):format(code)[m
[31m-        table.insert(utf16_escaped, esc)[m
[31m-    end[m
[31m-[m
[31m-    table.insert(utf16_escaped, '"')[m
[31m-    for i = 0, 0xD7FF do[m
[31m-        append_escape(i)[m
[31m-    end[m
[31m-    -- Skip 0xD800 - 0xDFFF since they are used to encode supplementary[m
[31m-    -- codepoints[m
[31m-    for i = 0xE000, 0xFFFF do[m
[31m-        append_escape(i)[m
[31m-    end[m
[31m-    -- Append surrogate pair for each supplementary codepoint[m
[31m-    for high = 0xD800, 0xDBFF do[m
[31m-        for low = 0xDC00, 0xDFFF do[m
[31m-            append_escape(high)[m
[31m-            append_escape(low)[m
[31m-        end[m
[31m-    end[m
[31m-    table.insert(utf16_escaped, '"')[m
[31m-[m
[31m-    return table.concat(utf16_escaped)[m
[31m-end[m
[31m-[m
[31m-function load_testdata()[m
[31m-    local data = {}[m
[31m-[m
[31m-    -- Data for 8bit raw <-> escaped octets tests[m
[31m-    data.octets_raw = gen_raw_octets()[m
[31m-    data.octets_escaped = util.file_load("octets-escaped.dat")[m
[31m-[m
[31m-    -- Data for \uXXXX -> UTF-8 test[m
[31m-    data.utf16_escaped = gen_utf16_escaped()[m
[31m-[m
[31m-    -- Load matching data for utf16_escaped[m
[31m-    local utf8_loaded[m
[31m-    utf8_loaded, data.utf8_raw = pcall(util.file_load, "utf8.dat")[m
[31m-    if not utf8_loaded then[m
[31m-        data.utf8_raw = "Failed to load utf8.dat - please run genutf8.pl"[m
[31m-    end[m
[31m-[m
[31m-    data.table_cycle = {}[m
[31m-    data.table_cycle[1] = data.table_cycle[m
[31m-[m
[31m-    local big = {}[m
[31m-    for i = 1, 1100 do[m
[31m-        big = { { 10, false, true, json.null }, "string", a = big }[m
[31m-    end[m
[31m-    data.deeply_nested_data = big[m
[31m-[m
[31m-    return data[m
[31m-end[m
[31m-[m
[31m-function test_decode_cycle(filename)[m
[31m-    local obj1 = json.decode(util.file_load(filename))[m
[31m-    local obj2 = json.decode(json.encode(obj1))[m
[31m-    return util.compare_values(obj1, obj2)[m
[31m-end[m
[31m-[m
[31m--- Set up data used in tests[m
[31m-local Inf = math.huge;[m
[31m-local NaN = math.huge * 0;[m
[31m-[m
[31m-local testdata = load_testdata()[m
[31m-[m
[31m-local cjson_tests = {[m
[31m-    -- Test API variables[m
[31m-    { "Check module name, version",[m
[31m-      function () return json._NAME, json._VERSION end, { },[m
[31m-      true, { "cjson", "2.1devel" } },[m
[31m-[m
[31m-    -- Test decoding simple types[m
[31m-    { "Decode string",[m
[31m-      json.decode, { '"test string"' }, true, { "test string" } },[m
[31m-    { "Decode numbers",[m
[31m-      json.decode, { '[ 0.0, -5e3, -1, 0.3e-3, 1023.2, 0e10 ]' },[m
[31m-      true, { { 0.0, -5000, -1, 0.0003, 1023.2, 0 } } },[m
[31m-    { "Decode null",[m
[31m-      json.decode, { 'null' }, true, { json.null } },[m
[31m-    { "Decode true",[m
[31m-      json.decode, { 'true' }, true, { true } },[m
[31m-    { "Decode false",[m
[31m-      json.decode, { 'false' }, true, { false } },[m
[31m-    { "Decode object with numeric keys",[m
[31m-      json.decode, { '{ "1": "one", "3": "three" }' },[m
[31m-      true, { { ["1"] = "one", ["3"] = "three" } } },[m
[31m-    { "Decode object with string keys",[m
[31m-      json.decode, { '{ "a": "a", "b": "b" }' },[m
[31m-      true, { { a = "a", b = "b" } } },[m
[31m-    { "Decode array",[m
[31m-      json.decode, { '[ "one", null, "three" ]' },[m
[31m-      true, { { "one", json.null, "three" } } },[m
[31m-[m
[31m-    -- Test decoding errors[m
[31m-    { "Decode UTF-16BE [throw error]",[m
[31m-      json.decode, { '\0"\0"' },[m
[31m-      false, { "JSON parser does not support UTF-16 or UTF-32" } },[m
[31m-    { "Decode UTF-16LE [throw error]",[m
[31m-      json.decode, { '"\0"\0' },[m
[31m-      false, { "JSON parser does not support UTF-16 or UTF-32" } },[m
[31m-    { "Decode UTF-32BE [throw error]",[m
[31m-      json.decode, { '\0\0\0"' },[m
[31m-      false, { "JSON parser does not support UTF-16 or UTF-32" } },[m
[31m-    { "Decode UTF-32LE [throw error]",[m
[31m-      json.decode, { '"\0\0\0' },[m
[31m-      false, { "JSON parser does not support UTF-16 or UTF-32" } },[m
[31m-    { "Decode partial JSON [throw error]",[m
[31m-      json.decode, { '{ "unexpected eof": ' },[m
[31m-      false, { "Expected value but found T_END at character 21" } },[m
[31m-    { "Decode with extra comma [throw error]",[m
[31m-      json.decode, { '{ "extra data": true }, false' },[m
[31m-      false, { "Expected the end but found T_COMMA at character 23" } },[m
[31m-    { "Decode invalid escape code [throw error]",[m
[31m-      json.decode, { [[ { "bad escape \q code" } ]] },[m
[31m-      false, { "Expected object key string but found invalid escape code at character 16" } },[m
[31m-    { "Decode invalid unicode escape [throw error]",[m
[31m-      json.decode, { [[ { "bad unicode \u0f6 escape" } ]] },[m
[31m-      false, { "Expected object key string but found invalid unicode escape code at character 17" } },[m
[31m-    { "Decode invalid keyword [throw error]",[m
[31m-      json.decode, { ' [ "bad barewood", test ] ' },[m
[31m-      false, { "Expected value but found invalid token at character 20" } },[m
[31m-    { "Decode invalid number #1 [throw error]",[m
[31m-      json.decode, { '[ -+12 ]' },[m
[31m-      false, { "Expected value but found invalid number at character 3" } },[m
[31m-    { "Decode invalid number #2 [throw error]",[m
[31m-      json.decode, { '-v' },[m
[31m-      false, { "Expected value but found invalid number at character 1" } },[m
[31m-    { "Decode invalid number exponent [throw error]",[m
[31m-      json.decode, { '[ 0.4eg10 ]' },[m
[31m-      false, { "Expected comma or array end but found invalid token at character 6" } },[m
[31m-[m
[31m-    -- Test decoding nested arrays / objects[m
[31m-    { "Set decode_max_depth(5)",[m
[31m-      json.decode_max_depth, { 5 }, true, { 5 } },[m
[31m-    { "Decode array at nested limit",[m
[31m-      json.decode, { '[[[[[ "nested" ]]]]]' },[m
[31m-      true, { {{{{{ "nested" }}}}} } },[m
[31m-    { "Decode array over nested limit [throw error]",[m
[31m-      json.decode, { '[[[[[[ "nested" ]]]]]]' },[m
[31m-      false, { "Found too many nested data structures (6) at character 6" } },[m
[31m-    { "Decode object at nested limit",[m
[31m-      json.decode, { '{"a":{"b":{"c":{"d":{"e":"nested"}}}}}' },[m
[31m-      true, { {a={b={c={d={e="nested"}}}}} } },[m
[31m-    { "Decode object over nested limit [throw error]",[m
[31m-      json.decode, { '{"a":{"b":{"c":{"d":{"e":{"f":"nested"}}}}}}' },[m
[31m-      false, { "Found too many nested data structures (6) at character 26" } },[m
[31m-    { "Set decode_max_depth(1000)",[m
[31m-      json.decode_max_depth, { 1000 }, true, { 1000 } },[m
[31m-    { "Decode deeply nested array [throw error]",[m
[31m-      json.decode, { string.rep("[", 1100) .. '1100' .. string.rep("]", 1100)},[m
[31m-      false, { "Found too many nested data structures (1001) at character 1001" } },[m
[31m-[m
[31m-    -- Test encoding nested tables[m
[31m-    { "Set encode_max_depth(5)",[m
[31m-      json.encode_max_depth, { 5 }, true, { 5 } },[m
[31m-    { "Encode nested table as array at nested limit",[m
[31m-      json.encode, { {{{{{"nested"}}}}} }, true, { '[[[[["nested"]]]]]' } },[m
[31m-    { "Encode nested table as array after nested limit [throw error]",[m
[31m-      json.encode, { { {{{{{"nested"}}}}} } },[m
[31m-      false, { "Cannot serialise, excessive nesting (6)" } },[m
[31m-    { "Encode nested table as object at nested limit",[m
[31m-      json.encode, { {a={b={c={d={e="nested"}}}}} },[m
[31m-      true, { '{"a":{"b":{"c":{"d":{"e":"nested"}}}}}' } },[m
[31m-    { "Encode nested table as object over nested limit [throw error]",[m
[31m-      json.encode, { {a={b={c={d={e={f="nested"}}}}}} },[m
[31m-      false, { "Cannot serialise, excessive nesting (6)" } },[m
[31m-    { "Encode table with cycle [throw error]",[m
[31m-      json.encode, { testdata.table_cycle },[m
[31m-      false, { "Cannot serialise, excessive nesting (6)" } },[m
[31m-    { "Set encode_max_depth(1000)",[m
[31m-      json.encode_max_depth, { 1000 }, true, { 1000 } },[m
[31m-    { "Encode deeply nested data [throw error]",[m
[31m-      json.encode, { testdata.deeply_nested_data },[m
[31m-      false, { "Cannot serialise, excessive nesting (1001)" } },[m
[31m-[m
[31m-    -- Test encoding simple types[m
[31m-    { "Encode null",[m
[31m-      json.encode, { json.null }, true, { 'null' } },[m
[31m-    { "Encode true",[m
[31m-      json.encode, { true }, true, { 'true' } },[m
[31m-    { "Encode false",[m
[31m-      json.encode, { false }, true, { 'false' } },[m
[31m-    { "Encode empty object",[m
[31m-      json.encode, { { } }, true, { '{}' } },[m
[31m-    { "Encode integer",[m
[31m-      json.encode, { 10 }, true, { '10' } },[m
[31m-    { "Encode string",[m
[31m-      json.encode, { "hello" }, true, { '"hello"' } },[m
[31m-    { "Encode Lua function [throw error]",[m
[31m-      json.encode, { function () end },[m
[31m-      false, { "Cannot serialise function: type not supported" } },[m
[31m-[m
[31m-    -- Test decoding invalid numbers[m
[31m-    { "Set decode_invalid_numbers(true)",[m
[31m-      json.decode_invalid_numbers, { true }, true, { true } },[m
[31m-    { "Decode hexadecimal",[m
[31m-      json.decode, { '0x6.ffp1' }, true, { 13.9921875 } },[m
[31m-    { "Decode numbers with leading zero",[m
[31m-      json.decode, { '[ 0123, 00.33 ]' }, true, { { 123, 0.33 } } },[m
[31m-    { "Decode +-Inf",[m
[31m-      json.decode, { '[ +Inf, Inf, -Inf ]' }, true, { { Inf, Inf, -Inf } } },[m
[31m-    { "Decode +-Infinity",[m
[31m-      json.decode, { '[ +Infinity, Infinity, -Infinity ]' },[m
[31m-      true, { { Inf, Inf, -Inf } } },[m
[31m-    { "Decode +-NaN",[m
[31m-      json.decode, { '[ +NaN, NaN, -NaN ]' }, true, { { NaN, NaN, NaN } } },[m
[31m-    { "Decode Infrared (not infinity) [throw error]",[m
[31m-      json.decode, { 'Infrared' },[m
[31m-      false, { "Expected the end but found invalid token at character 4" } },[m
[31m-    { "Decode Noodle (not NaN) [throw error]",[m
[31m-      json.decode, { 'Noodle' },[m
[31m-      false, { "Expected value but found invalid token at character 1" } },[m
[31m-    { "Set decode_invalid_numbers(false)",[m
[31m-      json.decode_invalid_numbers, { false }, true, { false } },[m
[31m-    { "Decode hexadecimal [throw error]",[m
[31m-      json.decode, { '0x6' },[m
[31m-      false, { "Expected value but found invalid number at character 1" } },[m
[31m-    { "Decode numbers with leading zero [throw error]",[m
[31m-      json.decode, { '[ 0123, 00.33 ]' },[m
[31m-      false, { "Expected value but found invalid number at character 3" } },[m
[31m-    { "Decode +-Inf [throw error]",[m
[31m-      json.decode, { '[ +Inf, Inf, -Inf ]' },[m
[31m-      false, { "Expected value but found invalid token at character 3" } },[m
[31m-    { "Decode +-Infinity [throw error]",[m
[31m-      json.decode, { '[ +Infinity, Infinity, -Infinity ]' },[m
[31m-      false, { "Expected value but found invalid token at character 3" } },[m
[31m-    { "Decode +-NaN [throw error]",[m
[31m-      json.decode, { '[ +NaN, NaN, -NaN ]' },[m
[31m-      false, { "Expected value but found invalid token at character 3" } },[m
[31m-    { 'Set decode_invalid_numbers("on")',[m
[31m-      json.decode_invalid_numbers, { "on" }, true, { true } },[m
[31m-[m
[31m-    -- Test encoding invalid numbers[m
[31m-    { "Set encode_invalid_numbers(false)",[m
[31m-      json.encode_invalid_numbers, { false }, true, { false } },[m
[31m-    { "Encode NaN [throw error]",[m
[31m-      json.encode, { NaN },[m
[31m-      false, { "Cannot serialise number: must not be NaN or Infinity" } },[m
[31m-    { "Encode Infinity [throw error]",[m
[31m-      json.encode, { Inf },[m
[31m-      false, { "Cannot serialise number: must not be NaN or Infinity" } },[m
[31m-    { "Set encode_invalid_numbers(\"null\")",[m
[31m-      json.encode_invalid_numbers, { "null" }, true, { "null" } },[m
[31m-    { "Encode NaN as null",[m
[31m-      json.encode, { NaN }, true, { "null" } },[m
[31m-    { "Encode Infinity as null",[m
[31m-      json.encode, { Inf }, true, { "null" } },[m
[31m-    { "Set encode_invalid_numbers(true)",[m
[31m-      json.encode_invalid_numbers, { true }, true, { true } },[m
[31m-    { "Encode NaN",[m
[31m-      json.encode, { NaN }, true, { "NaN" } },[m
[31m-    { "Encode +Infinity",[m
[31m-      json.encode, { Inf }, true, { "Infinity" } },[m
[31m-    { "Encode -Infinity",[m
[31m-      json.encode, { -Inf }, true, { "-Infinity" } },[m
[31m-    { 'Set encode_invalid_numbers("off")',[m
[31m-      json.encode_invalid_numbers, { "off" }, true, { false } },[m
[31m-[m
[31m-    -- Test encoding tables[m
[31m-    { "Set encode_sparse_array(true, 2, 3)",[m
[31m-      json.encode_sparse_array, { true, 2, 3 }, true, { true, 2, 3 } },[m
[31m-    { "Encode sparse table as array #1",[m
[31m-      json.encode, { { [3] = "sparse test" } },[m
[31m-      true, { '[null,null,"sparse test"]' } },[m
[31m-    { "Encode sparse table as array #2",[m
[31m-      json.encode, { { [1] = "one", [4] = "sparse test" } },[m
[31m-      true, { '["one",null,null,"sparse test"]' } },[m
[31m-    { "Encode sparse array as object",[m
[31m-      json.encode, { { [1] = "one", [5] = "sparse test" } },[m
[31m-      true, { '{"1":"one","5":"sparse test"}' } },[m
[31m-    { "Encode table with numeric string key as object",[m
[31m-      json.encode, { { ["2"] = "numeric string key test" } },[m
[31m-      true, { '{"2":"numeric string key test"}' } },[m
[31m-    { "Set encode_sparse_array(false)",[m
[31m-      json.encode_sparse_array, { false }, true, { false, 2, 3 } },[m
[31m-    { "Encode table with incompatible key [throw error]",[m
[31m-      json.encode, { { [false] = "wrong" } },[m
[31m-      false, { "Cannot serialise boolean: table key must be a number or string" } },[m
[31m-[m
[31m-    -- Test escaping[m
[31m-    { "Encode all octets (8-bit clean)",[m
[31m-      json.encode, { testdata.octets_raw }, true, { testdata.octets_escaped } },[m
[31m-    { "Decode all escaped octets",[m
[31m-      json.decode, { testdata.octets_escaped }, true, { testdata.octets_raw } },[m
[31m-    { "Decode single UTF-16 escape",[m
[31m-      json.decode, { [["\uF800"]] }, true, { "\239\160\128" } },[m
[31m-    { "Decode all UTF-16 escapes (including surrogate combinations)",[m
[31m-      json.decode, { testdata.utf16_escaped }, true, { testdata.utf8_raw } },[m
[31m-    { "Decode swapped surrogate pair [throw error]",[m
[31m-      json.decode, { [["\uDC00\uD800"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-    { "Decode duplicate high surrogate [throw error]",[m
[31m-      json.decode, { [["\uDB00\uDB00"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-    { "Decode duplicate low surrogate [throw error]",[m
[31m-      json.decode, { [["\uDB00\uDB00"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-    { "Decode missing low surrogate [throw error]",[m
[31m-      json.decode, { [["\uDB00"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-    { "Decode invalid low surrogate [throw error]",[m
[31m-      json.decode, { [["\uDB00\uD"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-[m
[31m-    -- Test locale support[m
[31m-    --[m
[31m-    -- The standard Lua interpreter is ANSI C online doesn't support locales[m
[31m-    -- by default. Force a known problematic locale to test strtod()/sprintf().[m
[31m-    { "Set locale to cs_CZ (comma separator)", function ()[m
[31m-        os.setlocale("cs_CZ")[m
[31m-        json.new()[m
[31m-    end },[m
[31m-    { "Encode number under comma locale",[m
[31m-      json.encode, { 1.5 }, true, { '1.5' } },[m
[31m-    { "Decode number in array under comma locale",[m
[31m-      json.decode, { '[ 10, "test" ]' }, true, { { 10, "test" } } },[m
[31m-    { "Revert locale to POSIX", function ()[m
[31m-        os.setlocale("C")[m
[31m-        json.new()[m
[31m-    end },[m
[31m-[m
[31m-    -- Test encode_keep_buffer() and enable_number_precision()[m
[31m-    { "Set encode_keep_buffer(false)",[m
[31m-      json.encode_keep_buffer, { false }, true, { false } },[m
[31m-    { "Set encode_number_precision(3)",[m
[31m-      json.encode_number_precision, { 3 }, true, { 3 } },[m
[31m-    { "Encode number with precision 3",[m
[31m-      json.encode, { 1/3 }, true, { "0.333" } },[m
[31m-    { "Set encode_number_precision(14)",[m
[31m-      json.encode_number_precision, { 14 }, true, { 14 } },[m
[31m-    { "Set encode_keep_buffer(true)",[m
[31m-      json.encode_keep_buffer, { true }, true, { true } },[m
[31m-[m
[31m-    -- Test config API errors[m
[31m-    -- Function is listed as '?' due to pcall[m
[31m-    { "Set encode_number_precision(0) [throw error]",[m
[31m-      json.encode_number_precision, { 0 },[m
[31m-      false, { "bad argument #1 to '?' (expected integer between 1 and 16)" } },[m
[31m-    { "Set encode_number_precision(\"five\") [throw error]",[m
[31m-      json.encode_number_precision, { "five" },[m
[31m-      false, { "bad argument #1 to '?' (number expected, got string)" } },[m
[31m-    { "Set encode_keep_buffer(nil, true) [throw error]",[m
[31m-      json.encode_keep_buffer, { nil, true },[m
[31m-      false, { "bad argument #2 to '?' (found too many arguments)" } },[m
[31m-    { "Set encode_max_depth(\"wrong\") [throw error]",[m
[31m-      json.encode_max_depth, { "wrong" },[m
[31m-      false, { "bad argument #1 to '?' (number expected, got string)" } },[m
[31m-    { "Set decode_max_depth(0) [throw error]",[m
[31m-      json.decode_max_depth, { "0" },[m
[31m-      false, { "bad argument #1 to '?' (expected integer between 1 and 2147483647)" } },[m
[31m-    { "Set encode_invalid_numbers(-2) [throw error]",[m
[31m-      json.encode_invalid_numbers, { -2 },[m
[31m-      false, { "bad argument #1 to '?' (invalid option '-2')" } },[m
[31m-    { "Set decode_invalid_numbers(true, false) [throw error]",[m
[31m-      json.decode_invalid_numbers, { true, false },[m
[31m-      false, { "bad argument #2 to '?' (found too many arguments)" } },[m
[31m-    { "Set encode_sparse_array(\"not quite on\") [throw error]",[m
[31m-      json.encode_sparse_array, { "not quite on" },[m
[31m-      false, { "bad argument #1 to '?' (invalid option 'not quite on')" } },[m
[31m-[m
[31m-    { "Reset Lua CJSON configuration", function () json = json.new() end },[m
[31m-    -- Wrap in a function to ensure the table returned by json.new() is used[m
[31m-    { "Check encode_sparse_array()",[m
[31m-      function (...) return json.encode_sparse_array(...) end, { },[m
[31m-      true, { false, 2, 10 } },[m
[31m-[m
[31m-    { "Encode (safe) simple value",[m
[31m-      json_safe.encode, { true },[m
[31m-      true, { "true" } },[m
[31m-    { "Encode (safe) argument validation [throw error]",[m
[31m-      json_safe.encode, { "arg1", "arg2" },[m
[31m-      false, { "bad argument #1 to '?' (expected 1 argument)" } },[m
[31m-    { "Decode (safe) error generation",[m
[31m-      json_safe.decode, { "Oops" },[m
[31m-      true, { nil, "Expected value but found invalid token at character 1" } },[m
[31m-    { "Decode (safe) error generation after new()",[m
[31m-      function(...) return json_safe.new().decode(...) end, { "Oops" },[m
[31m-      true, { nil, "Expected value but found invalid token at character 1" } },[m
[31m-}[m
[31m-[m
[31m-print(("==> Testing Lua CJSON version %s\n"):format(json._VERSION))[m
[31m-[m
[31m-util.run_test_group(cjson_tests)[m
[31m-[m
[31m-for _, filename in ipairs(arg) do[m
[31m-    util.run_test("Decode cycle " .. filename, test_decode_cycle, { filename },[m
[31m-                  true, { true })[m
[31m-end[m
[31m-[m
[31m-local pass, total = util.run_test_summary()[m
[31m-[m
[31m-if pass == total then[m
[31m-    print("==> Summary: all tests succeeded")[m
[31m-else[m
[31m-    print(("==> Summary: %d/%d tests failed"):format(total - pass, total))[m
[31m-    os.exit(1)[m
[31m-end[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/types.json b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/types.json[m
[1mdeleted file mode 100644[m
[1mindex c01e7d2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-cjson-2.1.0.4/tests/types.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{ "array": [ 10, true, null ] }[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex ebdac2e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-*~[m
[31m-*.swp[m
[31m-*.swo[m
[31m-test.rds[m
[31m-test_case.lua[m
[31m-*.o[m
[31m-*.so[m
[31m-reindex[m
[31m-tags[m
[31m-*.plist[m
[31m-analyze[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3b45039..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-version=0.09[m
[31m-[m
[31m-name=lua-rds-parser[m
[31m-dist=$(name)-$(version)[m
[31m-[m
[31m-LUA_VERSION =   5.1[m
[31m-[m
[31m-# See http://lua-users.org/wiki/BuildingModules for platform specific[m
[31m-# details.[m
[31m-[m
[31m-## Linux/BSD[m
[31m-PREFIX ?=          /usr/local[m
[31m-LDFLAGS +=         -shared[m
[31m-[m
[31m-## OSX (Macports)[m
[31m-#PREFIX ?=          /opt/local[m
[31m-#LDFLAGS +=         -bundle -undefined dynamic_lookup[m
[31m-[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-[m
[31m-#CFLAGS ?=          -g -Wall -pedantic -fno-inline[m
[31m-CFLAGS ?=          -g -O -Wall[m
[31m-override CFLAGS += -fpic -I$(LUA_INCLUDE_DIR)[m
[31m-[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all clean dist test t[m
[31m-[m
[31m-#CC = gcc[m
[31m-RM = rm -f[m
[31m-[m
[31m-all: parser.so[m
[31m-[m
[31m-src/rds_parser.o: src/ddebug.h src/rds_parser.h src/resty_dbd_stream.h[m
[31m-[m
[31m-.c.o:[m
[31m-	$(CC) -c $(CFLAGS) $(CPPFLAGS) $(BUILD_CFLAGS) -o $@ $<[m
[31m-[m
[31m-parser.so: src/rds_parser.o[m
[31m-	$(CC) $(LDFLAGS) -o $@ $^[m
[31m-[m
[31m-install:[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/rds[m
[31m-	$(INSTALL) parser.so $(DESTDIR)$(LUA_LIB_DIR)/rds[m
[31m-[m
[31m-clean:[m
[31m-	$(RM) *.so *.o rds/*.so[m
[31m-[m
[31m-test: all[m
[31m-	$(INSTALL) -d rds[m
[31m-	$(INSTALL) parser.so rds/[m
[31m-	prove -r t[m
[31m-[m
[31m-valtest: parser.so[m
[31m-	$(INSTALL) -d rds[m
[31m-	$(INSTALL) parser.so rds/[m
[31m-	TEST_LUA_USE_VALGRIND=1 prove -r t[m
[31m-[m
[31m-t: parser.so[m
[31m-	$(INSTALL) -d rds[m
[31m-	$(INSTALL) parser.so rds/[m
[31m-	TEST_LUA_USE_VALGRIND=1 prove t/sanity.t[m
[31m-[m
[31m-dist:[m
[31m-	git archive --prefix="$(dist)/" master | \[m
[31m-		gzip -9 > "$(dist).tar.gz"[m
[31m-	git archive --prefix="$(dist)/" \[m
[31m-		-o "$(dist).zip" master[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/README[m
[1mdeleted file mode 100644[m
[1mindex e8d40b3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/README[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-Name[m
[31m-    lua-rds-parser - Resty-DBD-Stream (RDS) parser for Lua written in C[m
[31m-[m
[31m-Status[m
[31m-    This module is production ready.[m
[31m-[m
[31m-Synopsis[m
[31m-    local parser = require "rds.parser"[m
[31m-[m
[31m-    local res, err = parser.parse(rds)[m
[31m-[m
[31m-    if res == nil then[m
[31m-        error("failed to parse: " .. err)[m
[31m-    end[m
[31m-[m
[31m-    print(res.errcode)[m
[31m-    print(res.errstr)[m
[31m-    print(res.insert_id)[m
[31m-    print(res.affected_rows)[m
[31m-[m
[31m-    local rows = res.resultset[m
[31m-    if rows then[m
[31m-        for i, row in ipairs(rows) do[m
[31m-            for col, val in pairs(row) do[m
[31m-                if val ~= parser.null then[m
[31m-                    print(col .. ": " .. val)[m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-Description[m
[31m-    This Lua library can be used to parse the Resty-DBD-Stream formatted data[m
[31m-    generated by ngx_drizzle (http://wiki.nginx.org/HttpDrizzleModule )[m
[31m-    and ngx_postgres (http://github.com/FRiCKLE/ngx_postgres/ ) into Lua[m
[31m-    data structures. In the past, we have to use JSON as the intermediate data[m
[31m-    format which is quite inefficient in terms of both memory and CPU time.[m
[31m-[m
[31m-    To maximize speed and minimize memory footprint, this library is implemented[m
[31m-    in pure C.[m
[31m-[m
[31m-    Null values in RDS are turned into the light user data "parser.null"[m
[31m-    where "parser" is the module object returned by Lua's "require".[m
[31m-[m
[31m-JSON Serialization[m
[31m-    If you want to serialize the parsed result into JSON, please[m
[31m-    use the lua-cjson library (http://www.kyne.com.au/~mark/software/lua-cjson.php )[m
[31m-    instead of lua-yajl, because lua-cjson is faster than lua-yajl[m
[31m-    in many common cases, and more importantly,[m
[31m-[m
[31m-        parser.null == cjson.null ~= yajl.null[m
[31m-[m
[31m-Using with HttpDrizzleModule[m
[31m-    To use with ngx_drizzle, here is a small example:[m
[31m-[m
[31m-        upstream backend {[m
[31m-            drizzle_server 127.0.0.1:3306 protocol=mysql[m
[31m-                           dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-            drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-        }[m
[31m-[m
[31m-        server {[m
[31m-            ...[m
[31m-[m
[31m-            location /mysql {[m
[31m-               drizzle_query $echo_request_body;[m
[31m-               drizzle_pass backend;[m
[31m-            }[m
[31m-[m
[31m-            location /api {[m
[31m-               content_by_lua '[m
[31m-                   local sql = "select * from cats"[m
[31m-                   local resp = ngx.location.capture("/mysql", {[m
[31m-                       method = ngx.HTTP_POST, body = sql[m
[31m-                   })[m
[31m-                   if resp.status ~= ngx.HTTP_OK or not resp.body then[m
[31m-                       error("failed to query mysql")[m
[31m-                   end[m
[31m-[m
[31m-                   local parser = require "rds.parser"[m
[31m-                   local res, err = parser.parse(resp.body)[m
[31m-                   if res == nil then[m
[31m-                       error("failed to parse RDS: " .. err)[m
[31m-                   end[m
[31m-[m
[31m-                   local rows = res.resultset[m
[31m-                   if not rows or #rows == 0 then[m
[31m-                       ngx.say("empty resultset")[m
[31m-                       ngx.exit(0)[m
[31m-                   end[m
[31m-[m
[31m-                   for i, row in ipairs(rows) do[m
[31m-                       ngx.print("row ", i, ": ")[m
[31m-                       for col, val in pairs(row) do[m
[31m-                           if val ~= parser.null then[m
[31m-                               ngx.print(col, "=", val, " ")[m
[31m-                           else[m
[31m-                               ngx.print(col, "=null ")[m
[31m-                           end[m
[31m-                       end[m
[31m-                       ngx.say()[m
[31m-                   end[m
[31m-               ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    On my machine, GET /api will yield[m
[31m-[m
[31m-        row 1: id=2 name=null[m
[31m-        row 2: id=3 name=bob[m
[31m-[m
[31m-    of course, the actual output depends on the structure and contents of the[m
[31m-    "cats" table in the mysql database.[m
[31m-[m
[31m-    You can use this Lua library with the ngx_postgres module in a similar way.[m
[31m-[m
[31m-Installation[m
[31m-  Build requirements[m
[31m-    *   Lua (http://www.lua.org/)[m
[31m-[m
[31m-    *   or LuaJIT (http://www.luajit.org/)[m
[31m-[m
[31m-    Gnu make and gcc is required to build this module.[m
[31m-[m
[31m-  Linux/BSD/Solaris[m
[31m-        gmake CC=gcc[m
[31m-        gmake install CC=gcc[m
[31m-[m
[31m-  Mac OS X[m
[31m-        make LDFLAGS='-bundle -undefined dynamic_lookup' CC=gcc[m
[31m-        make install[m
[31m-[m
[31m-    If your Lua or LuaJIT is not installed into the system, specify its[m
[31m-    include directory like this:[m
[31m-[m
[31m-        make LUA_INCLUDE_DIR=/opt/luajit/include/luajit-2.0[m
[31m-[m
[31m-    You can specify a custom path for the installation target:[m
[31m-[m
[31m-        make install LUA_LIB_DIR=/opt/lualib[m
[31m-[m
[31m-    The "DESTDIR" variable is also supported, to ease RPM packaging.[m
[31m-[m
[31m-TODO[m
[31m-    * add support for option "compact" to generate a compact[m
[31m-      Lua table for the "resultset" field.[m
[31m-[m
[31m-Known Issues[m
[31m-    * The endianness flag in RDS is not supported yet in this library,[m
[31m-      and it will assume it's of the host's endian. So do not[m
[31m-      try parsing the RDS stream that is generated by another[m
[31m-      machine of a different endian.[m
[31m-[m
[31m-Author[m
[31m-    Zhang "agentzh" Yichun <agentzh@gmail.com>[m
[31m-[m
[31m-Copyright & License[m
[31m-    This module is licenced under the BSD license.[m
[31m-[m
[31m-    Copyright (C) 2011, Zhang "agentzh" Yichun (章亦春) <agentzh@gmail.com>.[m
[31m-[m
[31m-    All rights reserved.[m
[31m-[m
[31m-    Redistribution and use in source and binary forms, with or without[m
[31m-    modification, are permitted provided that the following conditions[m
[31m-    are met:[m
[31m-[m
[31m-        * Redistributions of source code must retain the above copyright[m
[31m-        notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-        * Redistributions in binary form must reproduce the above copyright[m
[31m-        notice, this list of conditions and the following disclaimer in the[m
[31m-        documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 5b61a26..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   include <stdio.h>[m
[31m-[m
[31m-#   define dd(...) \[m
[31m-    fprintf(stderr, __VA_ARGS__); \[m
[31m-    fprintf(stderr, "\n")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   define dd(fmt, ...)[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.c[m
[1mdeleted file mode 100644[m
[1mindex 6264e0e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.c[m
[1m+++ /dev/null[m
[36m@@ -1,452 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "rds_parser.h"[m
[31m-[m
[31m-#include <lua.h>[m
[31m-#include <lauxlib.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#define LUA_RDS_PARSER_VERSION "0.05"[m
[31m-[m
[31m-[m
[31m-static int rds_parse(lua_State *L);[m
[31m-static int rds_parse_header(lua_State *L, rds_buf_t *b, rds_header_t *header);[m
[31m-static int rds_parse_col(lua_State *L, rds_buf_t *b, rds_column_t *col);[m
[31m-static int rds_parse_row(lua_State *L, rds_buf_t *b, rds_header_t *header,[m
[31m-        rds_column_t *cols, int row);[m
[31m-static int rds_parse_field(lua_State *L, rds_buf_t *b, rds_header_t *header,[m
[31m-        rds_column_t *cols, int col, int row);[m
[31m-[m
[31m-[m
[31m-static char *rds_null = NULL;[m
[31m-[m
[31m-[m
[31m-static const struct luaL_Reg rds_parser[] = {[m
[31m-    {"parse", rds_parse},[m
[31m-    {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int[m
[31m-luaopen_rds_parser(lua_State *L)[m
[31m-{[m
[31m-    luaL_register(L, "rds.parser", rds_parser);[m
[31m-[m
[31m-    lua_pushliteral(L, LUA_RDS_PARSER_VERSION);[m
[31m-    lua_setfield(L, -2, "_VERSION");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, rds_null);[m
[31m-    lua_setfield(L, -2, "null");[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse(lua_State *L)[m
[31m-{[m
[31m-    rds_buf_t           b;[m
[31m-    size_t              len;[m
[31m-    int                 rc;[m
[31m-    rds_header_t        h;[m
[31m-    rds_column_t       *cols;[m
[31m-    int                 i;[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TSTRING);[m
[31m-[m
[31m-    b.start = (u_char *) lua_tolstring(L, 1, &len);[m
[31m-    b.end = b.start + len;[m
[31m-[m
[31m-    b.pos = b.start;[m
[31m-    b.last = b.end;[m
[31m-[m
[31m-    rc = rds_parse_header(L, &b, &h);[m
[31m-    if (rc != 0) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    cols = lua_newuserdata(L, h.col_count * sizeof(rds_column_t));[m
[31m-[m
[31m-    for (i = 0; i < h.col_count; i++) {[m
[31m-        rc = rds_parse_col(L, &b, &cols[i]);[m
[31m-        if (rc != 0) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        dd("pushing col name onto the stack, top %d", lua_gettop(L));[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) cols[i].name.data, cols[i].name.len);[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0 /* narr */, 4 /* nrec */);[m
[31m-[m
[31m-    lua_pushinteger(L, h.std_errcode);[m
[31m-    lua_setfield(L, -2, "errcode");[m
[31m-[m
[31m-    if (h.errstr.len > 0) {[m
[31m-        lua_pushlstring(L, (char *) h.errstr.data, h.errstr.len);[m
[31m-        lua_setfield(L, -2, "errstr");[m
[31m-    }[m
[31m-[m
[31m-    if (h.insert_id) {[m
[31m-        lua_pushinteger(L, h.insert_id);[m
[31m-        lua_setfield(L, -2, "insert_id");[m
[31m-    }[m
[31m-[m
[31m-    if (h.affected_rows) {[m
[31m-        lua_pushinteger(L, h.affected_rows);[m
[31m-        lua_setfield(L, -2, "affected_rows");[m
[31m-    }[m
[31m-[m
[31m-    if (h.col_count == 0) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("creating resultset, top %d", lua_gettop(L));[m
[31m-[m
[31m-    lua_newtable(L);[m
[31m-[m
[31m-    for (i = 0; ; i++) {[m
[31m-        rc = rds_parse_row(L, &b, &h, cols, i);[m
[31m-        if (rc == -2) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("saving resultset, top %d", lua_gettop(L));[m
[31m-    dd("-1: %s", luaL_typename(L, -1));[m
[31m-    dd("-2: %s", luaL_typename(L, -2));[m
[31m-    dd("-3: %s", luaL_typename(L, -3));[m
[31m-[m
[31m-    lua_setfield(L, -2, "resultset");[m
[31m-[m
[31m-    dd("returning %s", luaL_typename(L, -1));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse_row(lua_State *L, rds_buf_t *b, rds_header_t *header,[m
[31m-        rds_column_t *cols, int row)[m
[31m-{[m
[31m-    int         col;[m
[31m-    int         rc;[m
[31m-[m
[31m-    dd("parsing row %d, top %d", row + 1, lua_gettop(L));[m
[31m-[m
[31m-    if (b->last - b->pos < (ssize_t) sizeof(uint8_t)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "row flag is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (*b->pos++ == 0) {[m
[31m-        if (b->pos != b->last) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "seen unexpected leve-over data bytes "[m
[31m-                    "at offset %d, row %d",[m
[31m-                    (int) (b->pos - b->start), row + 1);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("creating row table, top %d", lua_gettop(L));[m
[31m-[m
[31m-    lua_createtable(L, 0, header->col_count /* nrec */);[m
[31m-[m
[31m-    for (col = 0; col < header->col_count; col++) {[m
[31m-        rc = rds_parse_field(L, b, header, cols, col, row);[m
[31m-        if (rc == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("saving row table, top %d", lua_gettop(L));[m
[31m-[m
[31m-    lua_rawseti(L, -2, row + 1);[m
[31m-[m
[31m-    return -2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse_field(lua_State *L, rds_buf_t *b, rds_header_t *header,[m
[31m-        rds_column_t *cols, int col, int row)[m
[31m-{[m
[31m-    size_t          len;[m
[31m-    lua_Number      num;[m
[31m-    lua_Integer     integer;[m
[31m-[m
[31m-    dd("parsing field at row %d, col %d, top %d", row + 1, col + 1,[m
[31m-            lua_gettop(L));[m
[31m-[m
[31m-    if (b->last - b->pos < (ssize_t) sizeof(uint32_t)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "field size is incomplete at offset %d, row %d, "[m
[31m-                "col %d", (int) (b->pos - b->start), row + 1, col + 1);[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    len = *(uint32_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint32_t);[m
[31m-[m
[31m-    /* push the key */[m
[31m-    lua_pushvalue(L, col + 3);[m
[31m-[m
[31m-    if (len == (uint32_t) -1) {[m
[31m-        /* SQL NULL found */[m
[31m-        //lua_pushlightuserdata(L, rds_null);[m
[31m-        lua_pushlightuserdata(L, rds_null);[m
[31m-[m
[31m-    } else {[m
[31m-        if (b->last - b->pos < (ssize_t) len) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "field value is incomplete at offset %d, row %d,"[m
[31m-                    " col %d", (int) (b->pos - b->start), row + 1, col + 1);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        switch (cols[col].std_type & 0xc000) {[m
[31m-        case rds_rough_col_type_float:[m
[31m-            lua_pushlstring(L, (char *) b->pos, len);[m
[31m-            num = lua_tonumber(L, -1);[m
[31m-            lua_pop(L, 1);[m
[31m-            lua_pushnumber(L, num);[m
[31m-            break;[m
[31m-[m
[31m-        case rds_rough_col_type_int:[m
[31m-            lua_pushlstring(L, (char *) b->pos, len);[m
[31m-            integer = lua_tointeger(L, -1);[m
[31m-            lua_pop(L, 1);[m
[31m-            lua_pushinteger(L, integer);[m
[31m-            break;[m
[31m-[m
[31m-        case rds_rough_col_type_bool:[m
[31m-            if (*b->pos == '0' || *b->pos == 'f' || *b->pos == 'F')[m
[31m-            {[m
[31m-                lua_pushboolean(L, 0);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (*b->pos == '1' || *b->pos == 't' || *b->pos == 'T' )[m
[31m-            {[m
[31m-                lua_pushboolean(L, 1);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "unrecognized boolean value at offset %d, "[m
[31m-                    "row %d, col %d", (int) (b->pos - b->start), row + 1,[m
[31m-                    col + 1);[m
[31m-            return 2;[m
[31m-[m
[31m-        default:[m
[31m-            lua_pushlstring(L, (char *) b->pos, len);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        b->pos += len;[m
[31m-    }[m
[31m-[m
[31m-    dd("saving field, top %d", lua_gettop(L));[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse_header(lua_State *L, rds_buf_t *b, rds_header_t *header)[m
[31m-{[m
[31m-    ssize_t          rest;[m
[31m-[m
[31m-    rest = sizeof(uint8_t)      /* endian type */[m
[31m-         + sizeof(uint32_t)     /* format version */[m
[31m-         + sizeof(uint8_t)      /* result type */[m
[31m-[m
[31m-         + sizeof(uint16_t)     /* standard error code */[m
[31m-         + sizeof(uint16_t)     /* driver-specific error code */[m
[31m-[m
[31m-         + sizeof(uint16_t)     /* driver-specific errstr len */[m
[31m-         + 0                    /* driver-specific errstr data */[m
[31m-         + sizeof(uint64_t)     /* affected rows */[m
[31m-         + sizeof(uint64_t)     /* insert id */[m
[31m-         + sizeof(uint16_t)     /* column count */[m
[31m-         ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "header part is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO check endian type */[m
[31m-[m
[31m-    b->pos += sizeof(uint8_t);[m
[31m-[m
[31m-    /* check RDS format version number */[m
[31m-[m
[31m-    if ( *(uint32_t *) b->pos != (uint32_t) resty_dbd_stream_version) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "found RDS format version %d, "[m
[31m-                "but we can only handle version %d",[m
[31m-                (int) *(uint32_t *) b->pos, resty_dbd_stream_version);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    dd("RDS format version: %d", (int) *(uint32_t *) b->pos);[m
[31m-[m
[31m-    b->pos += sizeof(uint32_t);[m
[31m-[m
[31m-    /* check RDS result type */[m
[31m-[m
[31m-    if (*b->pos != 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "RDS result type must be 0 for now but got %d",[m
[31m-                (int) *b->pos);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    b->pos++;[m
[31m-[m
[31m-    /* save the standard error code */[m
[31m-[m
[31m-    header->std_errcode = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save the driver-specific error code */[m
[31m-[m
[31m-    header->drv_errcode = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save the error string length */[m
[31m-[m
[31m-    header->errstr.len = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    dd("errstr len: %d", (int) header->errstr.len);[m
[31m-[m
[31m-    /* check the rest data's size */[m
[31m-[m
[31m-    rest = header->errstr.len[m
[31m-         + sizeof(uint64_t)     /* affected rows */[m
[31m-         + sizeof(uint64_t)     /* insert id */[m
[31m-         + sizeof(uint16_t)     /* column count */[m
[31m-         ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "header part is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* save the error string data */[m
[31m-[m
[31m-    header->errstr.data = b->pos;[m
[31m-[m
[31m-    b->pos += header->errstr.len;[m
[31m-[m
[31m-    /* save affected rows */[m
[31m-[m
[31m-    header->affected_rows = *(uint64_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint64_t);[m
[31m-[m
[31m-    /* save insert id */[m
[31m-[m
[31m-    header->insert_id = *(uint64_t *)b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint64_t);[m
[31m-[m
[31m-    /* save column count */[m
[31m-[m
[31m-    header->col_count = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    dd("saved column count: %d", (int) header->col_count);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse_col(lua_State *L, rds_buf_t *b, rds_column_t *col)[m
[31m-{[m
[31m-    ssize_t         rest;[m
[31m-[m
[31m-    rest = sizeof(uint16_t)         /* std col type */[m
[31m-         + sizeof(uint16_t)         /* driver col type */[m
[31m-         + sizeof(uint16_t)         /* col name str len */[m
[31m-         ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "column spec is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* save standard column type */[m
[31m-    col->std_type = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save driver-specific column type */[m
[31m-    col->drv_type = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* read column name string length */[m
[31m-[m
[31m-    col->name.len = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    if (col->name.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "column name empty");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    rest = col->name.len;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "column name string is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    col->name.data = b->pos;[m
[31m-[m
[31m-    b->pos += col->name.len;[m
[31m-[m
[31m-    dd("saved column name \"%.*s\" (len %d, offset %d)",[m
[31m-            (int) col->name.len, col->name.data,[m
[31m-            (int) col->name.len, (int) (b->pos - b->start));[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.h[m
[1mdeleted file mode 100644[m
[1mindex 458d8c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/rds_parser.h[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef RDS_PARSER_H[m
[31m-#define RDS_PARSER_H[m
[31m-[m
[31m-[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include "sys/types.h"[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-#ifndef u_char[m
[31m-#define u_char  unsigned char[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char      *data;[m
[31m-    size_t       len;[m
[31m-} rds_str_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char      *start;[m
[31m-    u_char      *pos;[m
[31m-    u_char      *last;[m
[31m-    u_char      *end;[m
[31m-} rds_buf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint16_t        std_errcode;[m
[31m-    uint16_t        drv_errcode;[m
[31m-    rds_str_t       errstr;[m
[31m-[m
[31m-    uint64_t        affected_rows;[m
[31m-    uint64_t        insert_id;[m
[31m-    uint16_t        col_count;[m
[31m-[m
[31m-} rds_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct rds_column_s {[m
[31m-    rds_col_type_t      std_type;[m
[31m-    uint16_t            drv_type;[m
[31m-[m
[31m-    rds_str_t           name;[m
[31m-[m
[31m-} rds_column_t;[m
[31m-[m
[31m-[m
[31m-#endif /* RDS_PARSER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/resty_dbd_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/resty_dbd_stream.h[m
[1mdeleted file mode 100644[m
[1mindex ebb0cb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/src/resty_dbd_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-#ifndef RESTY_DBD_STREAME_H[m
[31m-#define RESTY_DBD_STREAME_H[m
[31m-[m
[31m-#define resty_dbd_stream_version 3[m
[31m-#define resty_dbd_stream_version_string "0.0.3"[m
[31m-[m
[31m-#define rds_content_type \[m
[31m-    "application/x-resty-dbd-stream"[m
[31m-[m
[31m-#define rds_content_type_len \[m
[31m-    (sizeof(rds_content_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_rough_col_type_int = 0 << 14,[m
[31m-    rds_rough_col_type_float = 1 << 14,[m
[31m-    rds_rough_col_type_str = 2 << 14,[m
[31m-    rds_rough_col_type_bool = 3 << 14[m
[31m-[m
[31m-} rds_rough_col_type_t;[m
[31m-[m
[31m-[m
[31m-/* The following types (or spellings thereof) are specified[m
[31m- * by SQL:[m
[31m- * bigint, bit, bit varying, boolean, char, character varying,[m
[31m- * character, varchar, date, double precision, integer,[m
[31m- * interval, numeric, decimal, real, smallint,[m
[31m- * time (with or without time zone),[m
[31m- * timestamp (with or without time zone), xml */[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_col_type_unknown = 0 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bigint = 1 | rds_rough_col_type_int,[m
[31m-    rds_col_type_bit = 2 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bit_varying = 3 | rds_rough_col_type_str,[m
[31m-[m
[31m-    rds_col_type_bool = 4 | rds_rough_col_type_bool,[m
[31m-    rds_col_type_char = 5 | rds_rough_col_type_str,[m
[31m-    rds_col_type_varchar = 6 | rds_rough_col_type_str,[m
[31m-    rds_col_type_date = 7 | rds_rough_col_type_str,[m
[31m-    rds_col_type_double = 8 | rds_rough_col_type_float,[m
[31m-    rds_col_type_integer = 9 | rds_rough_col_type_int,[m
[31m-    rds_col_type_interval = 10 | rds_rough_col_type_float,[m
[31m-    rds_col_type_decimal = 11 | rds_rough_col_type_float,[m
[31m-    rds_col_type_real = 12 | rds_rough_col_type_float,[m
[31m-    rds_col_type_smallint = 13 | rds_rough_col_type_int,[m
[31m-    rds_col_type_time_with_time_zone = 14 | rds_rough_col_type_str,[m
[31m-    rds_col_type_time = 15 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp_with_time_zone = 16 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp = 17 | rds_rough_col_type_str,[m
[31m-    rds_col_type_xml = 18 | rds_rough_col_type_str,[m
[31m-[m
[31m-    /* our additions */[m
[31m-    rds_col_type_blob = 19 | rds_rough_col_type_str[m
[31m-[m
[31m-} rds_col_type_t;[m
[31m-[m
[31m-#endif /* RESTY_DBD_STREAME_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/RdsParser.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/RdsParser.pm[m
[1mdeleted file mode 100644[m
[1mindex ecbfdc6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/RdsParser.pm[m
[1m+++ /dev/null[m
[36m@@ -1,90 +0,0 @@[m
[31m-package t::RdsParser;[m
[31m-[m
[31m-use Test::Base -Base;[m
[31m-use IPC::Run3;[m
[31m-use Cwd;[m
[31m-[m
[31m-use Test::LongString;[m
[31m-[m
[31m-our @EXPORT = qw( run_tests );[m
[31m-[m
[31m-$ENV{LUA_CPATH} = "?.so;" . ($ENV{LUA_CPATH} || "") . ';' . "/usr/local/openresty/lualib/?.so;;";[m
[31m-#$ENV{LUA_PATH} = ($ENV{LUA_PATH} || "" ) . ';' . getcwd . "/runtime/?.lua" . ';;';[m
[31m-[m
[31m-sub run_test ($) {[m
[31m-    my $block = shift;[m
[31m-    #print $json_xs->pretty->encode(\@new_rows);[m
[31m-    #my $res = #print $json_xs->pretty->encode($res);[m
[31m-    my $name = $block->name;[m
[31m-[m
[31m-    my $rds = $block->rds or[m
[31m-        die "No --- lua specified for test $name\n";[m
[31m-[m
[31m-    my $rdsfile = "test.rds";[m
[31m-    open my $fh, ">$rdsfile" or[m
[31m-        die "Cannot open $rdsfile for writing: $!\n";[m
[31m-    print $fh $rds;[m
[31m-    close $fh;[m
[31m-[m
[31m-    my $luafile = "test_case.lua";[m
[31m-[m
[31m-    open $fh, ">$luafile" or[m
[31m-        die "Cannot open $luafile for writing: $!\n";[m
[31m-[m
[31m-    print $fh <<'_EOC_';[m
[31m-local f, err = io.open("test.rds", "rb")[m
[31m-if f == nil then[m
[31m-    error("failed to open file test.rds: " .. err)[m
[31m-end[m
[31m-local rds = f:read("*a")[m
[31m-f:close()[m
[31m--- print("RDS:" .. rds)[m
[31m-local parser = require "rds.parser"[m
[31m-local res, err = parser.parse(rds)[m
[31m-if res == nil then[m
[31m-    print(res)[m
[31m-    print(err)[m
[31m-    return[m
[31m-end[m
[31m-local cjson = require "cjson"[m
[31m-print(cjson.encode(res))[m
[31m-_EOC_[m
[31m-[m
[31m-    close $fh;[m
[31m-[m
[31m-    my ($res, $err);[m
[31m-[m
[31m-    my @cmd;[m
[31m-[m
[31m-    if ($ENV{TEST_LUA_USE_VALGRIND}) {[m
[31m-        @cmd =  ('valgrind', '-q', '--leak-check=full', 'lua', 'test_case.lua');[m
[31m-    } else {[m
[31m-        @cmd =  ('lua', 'test_case.lua');[m
[31m-    }[m
[31m-[m
[31m-    run3 \@cmd, undef, \$res, \$err;[m
[31m-[m
[31m-    #warn "res:$res\nerr:$err\n";[m
[31m-[m
[31m-    if (defined $block->err) {[m
[31m-        $err =~ /.*:.*:.*: (.*\s)?/;[m
[31m-        $err = $1;[m
[31m-        is $err, $block->err, "$name - err expected";[m
[31m-    } elsif ($?) {[m
[31m-        die "Failed to execute --- lua for test $name: $err\n";[m
[31m-[m
[31m-    } else {[m
[31m-        #is $res, $block->out, "$name - output ok";[m
[31m-        is $res, $block->out, "$name - output ok";[m
[31m-    }[m
[31m-[m
[31m-    #unlink 'test_case.lua' or warn "could not delete \'test_case.lua\':$!";[m
[31m-}[m
[31m-[m
[31m-sub run_tests () {[m
[31m-    for my $block (blocks()) {[m
[31m-        run_test($block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/error.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/error.t[m
[1mdeleted file mode 100644[m
[1mindex 31e7631..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/error.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RdsParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: truncate at row terminator[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob"  # field data[m
[31m---- out[m
[31m-nil[m
[31m-row flag is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: truncate at field data[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bo"  # field data[m
[31m---- out[m
[31m-nil[m
[31m-field value is incomplete at offset 68, row 2, col 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: truncate at field len[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}"  # field len[m
[31m---- out[m
[31m-nil[m
[31m-field size is incomplete at offset 64, row 2, col 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: truncate at field len (a different cell)[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}"  # field len[m
[31m---- out[m
[31m-nil[m
[31m-field size is incomplete at offset 49, row 1, col 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: truncate at field len[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}"  # valid row flag[m
[31m---- out[m
[31m-nil[m
[31m-field size is incomplete at offset 59, row 2, col 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: truncate at col name data[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"nam"  # col name data[m
[31m---- out[m
[31m-nil[m
[31m-column name string is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: truncate at col name len[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}"  # col name len[m
[31m---- out[m
[31m-nil[m
[31m-column spec is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: truncate at col type[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}"  # drizzle col type[m
[31m---- out[m
[31m-nil[m
[31m-column spec is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: truncate at col count[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}"  # col count[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: truncate at insert id[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}"  # insert id[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: truncate at rows affected[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}"  # rows affected[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: truncate at errstr data[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{03}\x{00}".  # driver errstr len[m
[31m-"he"  # driver errstr data[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: truncate at errstr len[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{03}"  # driver errstr len[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: truncate at driver errcode[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}"  # driver errcode[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: truncate at std errcode[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}"  # std errcode[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad result type[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{03}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- out[m
[31m-nil[m
[31m-RDS result type must be 0 for now but got 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad format version[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{01}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{03}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- out[m
[31m-nil[m
[31m-found RDS format version 1, but we can only handle version 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 95ddab6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-rds-parser-0.06/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RdsParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple select[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- out[m
[31m-{"errcode":0,"resultset":[{"id":2,"name":null},{"id":3,"name":"bob"}]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: update[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- out[m
[31m-{"errstr":"Rows matched: 1  Changed: 0  Warnings: 0","errcode":0}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: select empty resultset[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- out[m
[31m-{"errcode":0,"resultset":{}}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: update, insert id, and affected rows[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{03}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{10}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- out[m
[31m-{"affected_rows":3,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0","errcode":0,"insert_id":272}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 66607d9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-*.swp[m
[31m-*.so[m
[31m-*.lo[m
[31m-*~[m
[31m-reindex[m
[31m-test_case.lua[m
[31m-tags[m
[31m-*.html[m
[31m-*.o[m
[31m-*.tar.gz[m
[31m-*.zip[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 4890d31..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-version=0.09[m
[31m-[m
[31m-name=lua-redis-parser[m
[31m-dist=$(name)-$(version)[m
[31m-[m
[31m-LUA_VERSION =   5.1[m
[31m-[m
[31m-# See http://lua-users.org/wiki/BuildingModules for platform specific[m
[31m-# details.[m
[31m-[m
[31m-## Linux/BSD[m
[31m-PREFIX ?=          /usr/local[m
[31m-LDFLAGS +=         -shared[m
[31m-[m
[31m-## OSX (Macports)[m
[31m-#PREFIX ?=          /opt/local[m
[31m-#LDFLAGS +=         -bundle -undefined dynamic_lookup[m
[31m-[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-[m
[31m-#CFLAGS ?=          -g -Wall -pedantic -fno-inline[m
[31m-CFLAGS ?=          -g -O -Wall[m
[31m-override CFLAGS += -fpic -I$(LUA_INCLUDE_DIR)[m
[31m-[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all clean dist test t[m
[31m-[m
[31m-#CC = gcc[m
[31m-RM = rm -f[m
[31m-[m
[31m-all: parser.so[m
[31m-[m
[31m-redis-parser.o: ddebug.h[m
[31m-[m
[31m-.c.o:[m
[31m-	$(CC) -c $(CFLAGS) $(CPPFLAGS) $(BUILD_CFLAGS) -o $@ $<[m
[31m-[m
[31m-parser.so: redis-parser.o[m
[31m-	$(CC) $(LDFLAGS) -o $@ $^[m
[31m-[m
[31m-install:[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/redis[m
[31m-	$(INSTALL) parser.so $(DESTDIR)$(LUA_LIB_DIR)/redis[m
[31m-[m
[31m-clean:[m
[31m-	$(RM) *.so *.o redis/*.so[m
[31m-[m
[31m-test: all[m
[31m-	$(INSTALL) -d redis[m
[31m-	$(INSTALL) parser.so redis/[m
[31m-	prove -r t[m
[31m-[m
[31m-valtest: parser.so[m
[31m-	$(INSTALL) -d redis[m
[31m-	$(INSTALL) parser.so redis/[m
[31m-	TEST_LUA_USE_VALGRIND=1 prove -r t[m
[31m-[m
[31m-t: parser.so[m
[31m-	$(INSTALL) -d redis[m
[31m-	$(INSTALL) parser.so redis/[m
[31m-	TEST_LUA_USE_VALGRIND=1 prove t/sanity.t[m
[31m-[m
[31m-dist:[m
[31m-	git archive --prefix="$(dist)/" master | \[m
[31m-		gzip -9 > "$(dist).tar.gz"[m
[31m-	git archive --prefix="$(dist)/" \[m
[31m-		-o "$(dist).zip" master[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 5b61a26..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   include <stdio.h>[m
[31m-[m
[31m-#   define dd(...) \[m
[31m-    fprintf(stderr, __VA_ARGS__); \[m
[31m-    fprintf(stderr, "\n")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   define dd(fmt, ...)[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/redis-parser.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/redis-parser.c[m
[1mdeleted file mode 100644[m
[1mindex 6900f79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/redis-parser.c[m
[1m+++ /dev/null[m
[36m@@ -1,716 +0,0 @@[m
[31m-#define DDEBUG 0[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <lua.h>[m
[31m-#include <lauxlib.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdint.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#define LUA_REDIS_PARSER_VERSION "0.10"[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    BAD_REPLY           = 0,[m
[31m-    STATUS_REPLY        = 1,[m
[31m-    ERROR_REPLY         = 2,[m
[31m-    INTEGER_REPLY       = 3,[m
[31m-    BULK_REPLY          = 4,[m
[31m-    MULTI_BULK_REPLY    = 5[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    PARSE_OK    = 0,[m
[31m-    PARSE_ERROR = 1[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static const char *redis_typenames[] = {[m
[31m-    "bad reply",[m
[31m-    "status reply",[m
[31m-    "error reply",[m
[31m-    "integer reply",[m
[31m-    "bulk reply",[m
[31m-    "multi-bulk reply"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define UINT64_LEN   (sizeof("18446744073709551615") - 1)[m
[31m-[m
[31m-static void *redis_null = NULL;[m
[31m-[m
[31m-static int parse_reply_helper(lua_State *L, char **src, size_t len);[m
[31m-static int redis_parse_reply(lua_State *L);[m
[31m-static int redis_parse_replies(lua_State *L);[m
[31m-static int redis_build_query(lua_State *L);[m
[31m-static const char * parse_single_line_reply(const char *src, const char *last,[m
[31m-        size_t *dst_len);[m
[31m-static const char * parse_bulk_reply(const char *src, const char *last,[m
[31m-        size_t *dst_len);[m
[31m-static int parse_multi_bulk_reply(lua_State *L, char **src,[m
[31m-        const char *last);[m
[31m-static size_t get_num_size(size_t i);[m
[31m-static char *sprintf_num(char *dst, int64_t ui64);[m
[31m-static int redis_typename(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#define redis_nelems(arr) \[m
[31m-            (sizeof(arr) / sizeof(arr[0]))[m
[31m-[m
[31m-[m
[31m-static const struct luaL_Reg redis_parser[] = {[m
[31m-    {"parse_reply", redis_parse_reply},[m
[31m-    {"parse_replies", redis_parse_replies},[m
[31m-    {"build_query", redis_build_query},[m
[31m-    {"typename", redis_typename},[m
[31m-    {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int[m
[31m-luaopen_redis_parser(lua_State *L)[m
[31m-{[m
[31m-    luaL_register(L, "redis.parser", redis_parser);[m
[31m-[m
[31m-    lua_pushliteral(L, LUA_REDIS_PARSER_VERSION);[m
[31m-    lua_setfield(L, -2, "_VERSION");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, redis_null);[m
[31m-    lua_setfield(L, -2, "null");[m
[31m-[m
[31m-    lua_pushnumber(L, BAD_REPLY);[m
[31m-    lua_setfield(L, -2, "BAD_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, STATUS_REPLY);[m
[31m-    lua_setfield(L, -2, "STATUS_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, ERROR_REPLY);[m
[31m-    lua_setfield(L, -2, "ERROR_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, INTEGER_REPLY);[m
[31m-    lua_setfield(L, -2, "INTEGER_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, BULK_REPLY);[m
[31m-    lua_setfield(L, -2, "BULK_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, MULTI_BULK_REPLY);[m
[31m-    lua_setfield(L, -2, "MULTI_BULK_REPLY");[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-redis_parse_reply(lua_State *L)[m
[31m-{[m
[31m-    char            *p;[m
[31m-    size_t           len;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expected one argument but got %d",[m
[31m-                lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    p = (char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    return parse_reply_helper(L, &p, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-redis_parse_replies(lua_State *L)[m
[31m-{[m
[31m-    char        *p;[m
[31m-    char        *q;[m
[31m-    int          i, n, nret;[m
[31m-    size_t       len;[m
[31m-[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expected two arguments but got %d",[m
[31m-                lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    p = (char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    n = luaL_checknumber(L, 2);[m
[31m-[m
[31m-    dd("n = %d", (int) n);[m
[31m-[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    lua_createtable(L, n, 0); /* table */[m
[31m-[m
[31m-    for (i = 1; i <= n; i++) {[m
[31m-        dd("parsing reply %d", i);[m
[31m-[m
[31m-        lua_createtable(L, n, 2); /* table table */[m
[31m-        q = p;[m
[31m-        nret = parse_reply_helper(L, &p, len); /* table table res typ */[m
[31m-        if (nret != 2) {[m
[31m-            return luaL_error(L, "internal error: redis_parse_reply "[m
[31m-                    "returns %d", nret);[m
[31m-        }[m
[31m-[m
[31m-        dd("p = %p, q = %p, len = %d", p, q, (int) len);[m
[31m-[m
[31m-        len -= p - q;[m
[31m-[m
[31m-        dd("len is now %d", (int) len);[m
[31m-[m
[31m-        lua_rawseti(L, -3, 2); /* table table res */[m
[31m-        lua_rawseti(L, -2, 1); /* table table */[m
[31m-        lua_rawseti(L, -2, i); /* table */[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-parse_reply_helper(lua_State *L, char **src, size_t len)[m
[31m-{[m
[31m-    char            *p;[m
[31m-    const char      *last;[m
[31m-    const char      *dst;[m
[31m-    size_t           dst_len;[m
[31m-    lua_Number       num;[m
[31m-    int              rc;[m
[31m-[m
[31m-    p = *src;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        lua_pushliteral(L, "empty reply");[m
[31m-        lua_pushnumber(L, BAD_REPLY);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    last = p + len;[m
[31m-[m
[31m-    switch (*p) {[m
[31m-    case '+':[m
[31m-        p++;[m
[31m-        dst = parse_single_line_reply(p, last, &dst_len);[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            lua_pushliteral(L, "bad status reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        *src += dst_len + 1 + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        lua_pushlstring(L, dst, dst_len);[m
[31m-        lua_pushnumber(L, STATUS_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    case '-':[m
[31m-        p++;[m
[31m-        dst = parse_single_line_reply(p, last, &dst_len);[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            lua_pushliteral(L, "bad error reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        *src += dst_len + 1 + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        lua_pushlstring(L, dst, dst_len);[m
[31m-        lua_pushnumber(L, ERROR_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    case ':':[m
[31m-        p++;[m
[31m-        dst = parse_single_line_reply(p, last, &dst_len);[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            lua_pushliteral(L, "bad integer reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        *src += dst_len + 1 + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        lua_pushlstring(L, dst, dst_len);[m
[31m-        num = lua_tonumber(L, -1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        lua_pushnumber(L, num);[m
[31m-        lua_pushnumber(L, INTEGER_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    case '$':[m
[31m-        p++;[m
[31m-        dst = parse_bulk_reply(p, last, &dst_len);[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            lua_pushliteral(L, "bad bulk reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (dst_len == -1) {[m
[31m-            *src = (char *) dst + sizeof("\r\n") - 1;[m
[31m-[m
[31m-            /* lua_pushlightuserdata(L, redis_null); */[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushnumber(L, BULK_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        *src = (char *) dst + dst_len + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        lua_pushlstring(L, dst, dst_len);[m
[31m-        lua_pushnumber(L, BULK_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    case '*':[m
[31m-        p++;[m
[31m-        rc = parse_multi_bulk_reply(L, &p, last);[m
[31m-[m
[31m-        if (rc != PARSE_OK) {[m
[31m-            lua_pushliteral(L, "bad multi bulk reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == PARSE_OK */[m
[31m-[m
[31m-        *src = (char *) p;[m
[31m-[m
[31m-        lua_pushnumber(L, MULTI_BULK_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        lua_pushliteral(L, "invalid reply");[m
[31m-        lua_pushnumber(L, BAD_REPLY);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *[m
[31m-parse_single_line_reply(const char *src, const char *last, size_t *dst_len)[m
[31m-{[m
[31m-    const char  *p = src;[m
[31m-    int          seen_cr = 0;[m
[31m-[m
[31m-    while (p != last) {[m
[31m-[m
[31m-        if (*p == '\r') {[m
[31m-            seen_cr = 1;[m
[31m-[m
[31m-        } else if (seen_cr) {[m
[31m-            if (*p == '\n') {[m
[31m-                *dst_len = p - src - 1;[m
[31m-                return src;[m
[31m-            }[m
[31m-[m
[31m-            seen_cr = 0;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    /* CRLF not found at all */[m
[31m-    *dst_len = -2;[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define CHECK_EOF if (p >= last) goto invalid;[m
[31m-[m
[31m-[m
[31m-static const char *[m
[31m-parse_bulk_reply(const char *src, const char *last, size_t *dst_len)[m
[31m-{[m
[31m-    const char *p = src;[m
[31m-    ssize_t     size = 0;[m
[31m-    const char *dst;[m
[31m-[m
[31m-    CHECK_EOF[m
[31m-[m
[31m-    /* read the bulk size */[m
[31m-[m
[31m-    if (*p == '-') {[m
[31m-        p++;[m
[31m-        CHECK_EOF[m
[31m-[m
[31m-        while (*p != '\r') {[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            p++;[m
[31m-            CHECK_EOF[m
[31m-        }[m
[31m-[m
[31m-        /* *p == '\r' */[m
[31m-[m
[31m-        if (last - p < size + sizeof("\r\n") - 1) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-[m
[31m-        if (*p++ != '\n') {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        *dst_len = -1;[m
[31m-        return p - (sizeof("\r\n") - 1);[m
[31m-    }[m
[31m-[m
[31m-    while (*p != '\r') {[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        size *= 10;[m
[31m-        size += *p - '0';[m
[31m-[m
[31m-        p++;[m
[31m-        CHECK_EOF[m
[31m-    }[m
[31m-[m
[31m-    /* *p == '\r' */[m
[31m-[m
[31m-    p++;[m
[31m-    CHECK_EOF[m
[31m-[m
[31m-    if (*p++ != '\n') {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    /* read the bulk data */[m
[31m-[m
[31m-    if (last - p < size + sizeof("\r\n") - 1) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    dst = p;[m
[31m-[m
[31m-    p += size;[m
[31m-[m
[31m-    if (*p++ != '\r') {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (*p++ != '\n') {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    *dst_len = size;[m
[31m-    return dst;[m
[31m-[m
[31m-invalid:[m
[31m-    *dst_len = -2;[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-parse_multi_bulk_reply(lua_State *L, char **src, const char *last)[m
[31m-{[m
[31m-    const char      *p = *src;[m
[31m-    int              count = 0;[m
[31m-    int              i;[m
[31m-    size_t           dst_len;[m
[31m-    const char      *dst;[m
[31m-[m
[31m-    dd("enter multi bulk parser");[m
[31m-[m
[31m-    CHECK_EOF[m
[31m-[m
[31m-    while (*p != '\r') {[m
[31m-        if (*p == '-') {[m
[31m-[m
[31m-            p++;[m
[31m-            CHECK_EOF[m
[31m-[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            while (*p != '\r') {[m
[31m-                p++;[m
[31m-                CHECK_EOF[m
[31m-            }[m
[31m-[m
[31m-            count = -1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            dd("expecting digit, but found %c", *p);[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        count *= 10;[m
[31m-        count += *p - '0';[m
[31m-[m
[31m-        p++;[m
[31m-        CHECK_EOF[m
[31m-    }[m
[31m-[m
[31m-    dd("count = %d", count);[m
[31m-[m
[31m-    /* *p == '\r' */[m
[31m-[m
[31m-    p++;[m
[31m-    CHECK_EOF[m
[31m-[m
[31m-    if (*p++ != '\n') {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    dd("reading the individual bulks");[m
[31m-[m
[31m-    if (count == -1) {[m
[31m-[m
[31m-        /* lua_pushlightuserdata(L, redis_null); */[m
[31m-        lua_pushnil(L);[m
[31m-[m
[31m-        *src = (char *) p;[m
[31m-        return PARSE_OK;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, count, 0);[m
[31m-[m
[31m-    for (i = 1; i <= count; i++) {[m
[31m-        CHECK_EOF[m
[31m-[m
[31m-        switch (*p) {[m
[31m-        case '+':[m
[31m-        case '-':[m
[31m-        case ':':[m
[31m-            p++;[m
[31m-            dst = parse_single_line_reply(p, last, &dst_len);[m
[31m-            break;[m
[31m-[m
[31m-        case '$':[m
[31m-            p++;[m
[31m-            dst = parse_bulk_reply(p, last, &dst_len);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            dd("bulk %d reply parse fail for multi bulks", i);[m
[31m-            return PARSE_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (dst_len == -1) {[m
[31m-            lua_pushnil(L);[m
[31m-            p = dst + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushlstring(L, dst, dst_len);[m
[31m-            p = dst + dst_len + sizeof("\r\n") - 1;[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, -2, i);[m
[31m-    }[m
[31m-[m
[31m-    *src = (char *) p;[m
[31m-[m
[31m-    return PARSE_OK;[m
[31m-[m
[31m-invalid:[m
[31m-    return PARSE_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-redis_build_query(lua_State *L)[m
[31m-{[m
[31m-    int          i, n;[m
[31m-    size_t       len, total;[m
[31m-    const char  *p;[m
[31m-    char        *last;[m
[31m-    char        *buf;[m
[31m-    int          flag;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expected one argument but got %d",[m
[31m-                lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    n = luaL_getn(L, 1);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return luaL_error(L, "empty input param table");[m
[31m-    }[m
[31m-[m
[31m-    total = sizeof("*") - 1[m
[31m-          + get_num_size(n)[m
[31m-          + sizeof("\r\n") - 1[m
[31m-          ;[m
[31m-[m
[31m-    for (i = 1; i <= n; i++) {[m
[31m-        lua_rawgeti(L, 1, i);[m
[31m-[m
[31m-        dd("param type: %d (%d)", lua_type(L, -1), LUA_TUSERDATA);[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-            case LUA_TSTRING:[m
[31m-            case LUA_TNUMBER:[m
[31m-                lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-                total += sizeof("$") - 1[m
[31m-                       + get_num_size(len)[m
[31m-                       + sizeof("\r\n") - 1[m
[31m-                       + len[m
[31m-                       + sizeof("\r\n") - 1[m
[31m-                       ;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                total += sizeof("$1\r\n1\r\n") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                p = lua_touserdata(L, -1);[m
[31m-                dd("user data: %p", p);[m
[31m-                if (p == redis_null) {[m
[31m-                    total += sizeof("$-1\r\n") - 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "parameter %d is not a string, number, "[m
[31m-                        "redis.parser.null, or boolean value", i);[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    buf = lua_newuserdata(L, total); /* lua_newuserdata never returns NULL */[m
[31m-[m
[31m-    last = buf;[m
[31m-[m
[31m-    *last++ = '*';[m
[31m-    last = sprintf_num(last, n);[m
[31m-    *last++ = '\r'; *last++ = '\n';[m
[31m-[m
[31m-    for (i = 1; i <= n; i++) {[m
[31m-        lua_rawgeti(L, 1, i);[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-            case LUA_TSTRING:[m
[31m-            case LUA_TNUMBER:[m
[31m-                p = luaL_checklstring(L, -1, &len);[m
[31m-[m
[31m-                *last++ = '$';[m
[31m-[m
[31m-                last = sprintf_num(last, len);[m
[31m-[m
[31m-                *last++ = '\r'; *last++ = '\n';[m
[31m-[m
[31m-                memcpy(last, p, len);[m
[31m-                last += len;[m
[31m-[m
[31m-                *last++ = '\r'; *last++ = '\n';[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                memcpy(last, "$1\r\n", sizeof("$1\r\n") - 1);[m
[31m-                last += sizeof("$1\r\n") - 1;[m
[31m-[m
[31m-                flag = lua_toboolean(L, -1);[m
[31m-                *last++ = flag ? '1' : '0';[m
[31m-[m
[31m-                *last++ = '\r'; *last++ = '\n';[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                /* must be null */[m
[31m-                memcpy(last, "$-1\r\n", sizeof("$-1\r\n") - 1);[m
[31m-                last += sizeof("$-1\r\n") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                /* cannot reach here */[m
[31m-                break;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    if (last - buf != (ssize_t) total) {[m
[31m-        return luaL_error(L, "buffer error");[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, buf, total);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-get_num_size(size_t i)[m
[31m-{[m
[31m-    size_t          n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        i = i / 10;[m
[31m-        n++;[m
[31m-    } while (i > 0);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-sprintf_num(char *dst, int64_t ui64)[m
[31m-{[m
[31m-    char             *p;[m
[31m-    char              temp[UINT64_LEN + 1];[m
[31m-    size_t            len;[m
[31m-[m
[31m-    p = temp + UINT64_LEN;[m
[31m-[m
[31m-    do {[m
[31m-        *--p = (char) (ui64 % 10 + '0');[m
[31m-    } while (ui64 /= 10);[m
[31m-[m
[31m-    len = (temp + UINT64_LEN) - p;[m
[31m-[m
[31m-    memcpy(dst, p, len);[m
[31m-[m
[31m-    return dst + len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-redis_typename(lua_State *L)[m
[31m-{[m
[31m-    int         typ;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument but got %d",[m
[31m-                lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    typ = (int) luaL_checkinteger(L, 1);[m
[31m-[m
[31m-    if (typ < 0 || typ >= redis_nelems(redis_typenames)) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushstring(L, redis_typenames[typ]);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/RedisParser.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/RedisParser.pm[m
[1mdeleted file mode 100644[m
[1mindex 99ab0b5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/RedisParser.pm[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-package t::RedisParser;[m
[31m-[m
[31m-use Test::Base -Base;[m
[31m-use IPC::Run3;[m
[31m-use Cwd;[m
[31m-[m
[31m-use Test::LongString;[m
[31m-[m
[31m-our @EXPORT = qw( run_tests );[m
[31m-[m
[31m-$ENV{LUA_CPATH} = "?.so;" . ($ENV{LUA_CPATH} || "") . ';' . "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-#$ENV{LUA_PATH} = ($ENV{LUA_PATH} || "" ) . ';' . getcwd . "/runtime/?.lua" . ';;';[m
[31m-[m
[31m-sub run_test ($) {[m
[31m-    my $block = shift;[m
[31m-    #print $json_xs->pretty->encode(\@new_rows);[m
[31m-    #my $res = #print $json_xs->pretty->encode($res);[m
[31m-    my $name = $block->name;[m
[31m-[m
[31m-    my $lua = $block->lua or[m
[31m-        die "No --- lua specified for test $name\n";[m
[31m-[m
[31m-    open my $fh, ">test_case.lua";[m
[31m-    print $fh $lua;[m
[31m-    close $fh;[m
[31m-[m
[31m-    my ($res, $err);[m
[31m-[m
[31m-    my @cmd;[m
[31m-[m
[31m-    if ($ENV{TEST_LUA_USE_VALGRIND}) {[m
[31m-        @cmd =  ('valgrind', '-q', '--leak-check=full', 'lua', 'test_case.lua');[m
[31m-    } else {[m
[31m-        @cmd =  ('lua', 'test_case.lua');[m
[31m-    }[m
[31m-[m
[31m-    run3 \@cmd, undef, \$res, \$err;[m
[31m-[m
[31m-    #warn "res:$res\nerr:$err\n";[m
[31m-[m
[31m-    if (defined $block->err) {[m
[31m-        $err =~ /.*:.*:.*: (.*\s)?/;[m
[31m-        $err = $1;[m
[31m-        is $err, $block->err, "$name - err expected";[m
[31m-    } elsif ($?) {[m
[31m-        die "Failed to execute --- lua for test $name: $err\n";[m
[31m-[m
[31m-    } else {[m
[31m-        #is $res, $block->out, "$name - output ok";[m
[31m-        is_string $res, $block->out, "$name - output ok";[m
[31m-    }[m
[31m-[m
[31m-    unlink 'test_case.lua' or warn "could not delete \'test_case.lua\':$!";[m
[31m-}[m
[31m-[m
[31m-sub run_tests () {[m
[31m-    for my $block (blocks()) {[m
[31m-        run_test($block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/pipeline.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/pipeline.t[m
[1mdeleted file mode 100644[m
[1mindex b5e6386..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/pipeline.t[m
[1m+++ /dev/null[m
[36m@@ -1,287 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RedisParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single reply parsed by parse_replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '+OK\r\n'[m
[31m-results = parser.parse_replies(replies, 1)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-local res = results[1][m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.STATUS_REPLY)[m
[31m---- out[m
[31m-res count == 1[m
[31m-res[1] count == 2[m
[31m-res[1][1] == OK[m
[31m-res[1][2] == 1 == 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: single bad reply parsed by parse_replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '+OK'[m
[31m-results = parser.parse_replies(replies, 1)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-local res = results[1][m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m---- out[m
[31m-res count == 1[m
[31m-res[1] count == 2[m
[31m-res[1][1] == bad status reply[m
[31m-res[1][2] == 0 == 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multiple status replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '+OK\r\n+DONE\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.STATUS_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.STATUS_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == OK[m
[31m-res[1][2] == 1 == 1[m
[31m-res[2][1] == DONE[m
[31m-res[2][2] == 1 == 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple integer replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = ':-32\r\n:532\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.INTEGER_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.INTEGER_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == -32[m
[31m-res[1][2] == 3 == 3[m
[31m-res[2][1] == 532[m
[31m-res[2][2] == 3 == 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: multiple error replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '-ERROR\r\n-BAD\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.ERROR_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.ERROR_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == ERROR[m
[31m-res[1][2] == 2 == 2[m
[31m-res[2][1] == BAD[m
[31m-res[2][2] == 2 == 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple bad replies (invalid reply)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '\r\n-BAD\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == invalid reply[m
[31m-res[1][2] == 0 == 0[m
[31m-res[2][1] == invalid reply[m
[31m-res[2][2] == 0 == 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple bad replies (empty reply)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = ''[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == empty reply[m
[31m-res[1][2] == 0 == 0[m
[31m-res[2][1] == empty reply[m
[31m-res[2][2] == 0 == 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: multiple bulk replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '$-1\r\n$5\r\nhello\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. (res[1] or "nil"))[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.BULK_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.BULK_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == nil[m
[31m-res[1][2] == 4 == 4[m
[31m-res[2][1] == hello[m
[31m-res[2][2] == 4 == 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multiple multi-bulk replies[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-replies = '*2\r\n$-1\r\n$5\r\nhello\r\n*1\r\n$1\r\na\r\n$2\r\nef\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. cjson.encode(res[1]))[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. cjson.encode(res[1]))[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == [null,"hello"][m
[31m-res[1][2] == 5 == 5[m
[31m-res[2][1] == ["a"][m
[31m-res[2][2] == 5 == 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nil multi bulk reply and status reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '*-1\r\n+DONE\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. (res[1] or "nil"))[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.STATUS_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == nil[m
[31m-res[1][2] == 5 == 5[m
[31m-res[2][1] == DONE[m
[31m-res[2][2] == 1 == 1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 80350ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,514 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RedisParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no crlf in status reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '+OK'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.BAD_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == bad reply == 0[m
[31m-res == bad status reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: good status reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '+OK\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.STATUS_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 1 == status reply == 1[m
[31m-res == OK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: good error reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '-Bad argument\rHey\r\nblah blah blah\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.ERROR_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out eval[m
[31m-"typ == 2 == error reply == 2[m
[31m-res == Bad argument\rHey\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: good integer reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = ':-32\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.INTEGER_REPLY)[m
[31m-print("res == " .. res)[m
[31m-print("res type == " .. type(res))[m
[31m---- out[m
[31m-typ == 3 == integer reply == 3[m
[31m-res == -32[m
[31m-res type == number[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: non-numeric integer reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = ':abc\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.INTEGER_REPLY)[m
[31m-print("res == " .. res)[m
[31m-print("res type == " .. type(res))[m
[31m---- out[m
[31m-typ == 3 == 3[m
[31m-res == 0[m
[31m-res type == number[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad integer reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = ':12\r'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BAD_REPLY)[m
[31m-print("res == " .. res)[m
[31m-print("res type == " .. type(res))[m
[31m---- out[m
[31m-typ == 0 == 0[m
[31m-res == bad integer reply[m
[31m-res type == string[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: good bulk reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 4 == bulk reply == 4[m
[31m-res == hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: good bulk reply (ignoring trailing stuffs)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$5\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 4 == 4[m
[31m-res == hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bad bulk reply (bad bulk size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$3b\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bad bulk reply (bulk size too small)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$3\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: bad bulk reply (bulk size too large)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$6\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: bad bulk reply (bulk size too large, 2)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$7\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: bad bulk reply (bulk size too large, 3)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$8\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: good bulk reply (nil value)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-1\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 4 == 4[m
[31m-res\tnil\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: good bulk reply (nil value, -25 size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-25\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 4 == 4[m
[31m-res\tnil\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad bulk reply (nil value, -1 size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-1\r'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 0 == 4[m
[31m-res\tbad bulk reply\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad bulk reply (nil value, -1 size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-1\ra'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 0 == 4[m
[31m-res\tbad bulk reply\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad bulk reply (nil value, -1 size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-1ab'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 0 == 4[m
[31m-res\tbad bulk reply\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: good multi bulk reply (1 bulk)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*1\r\n$1\r\na\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == multi-bulk reply == 5[m
[31m-res == ["a"]\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: good multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*4\r\n$1\r\na\r\n$-1\r\n$0\r\n\r\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m-print("res[2]:", res[2]);[m
[31m---- out eval[m
[31m-qq{typ == 5 == 5[m
[31m-res == ["a",null,"","hello"][m
[31m-res[2]:\tnil\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: bad multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*4\r\n$1\r\na\r\n$-1\r\n$0\r\n\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 0 == 5[m
[31m-res == "bad multi bulk reply"\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: bad multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*6\r\n$1\r\na\r\n$-1\r\n$0\r\n\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 0 == 5[m
[31m-res == "bad multi bulk reply"\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: bad multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*6\n$1\r\na\r\n$-1\r\n$0\r\n\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 0 == 5[m
[31m-res == "bad multi bulk reply"\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: bad multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*6$1\r\na\r\n$-1\r\n$0\r\n\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 0 == 5[m
[31m-res == "bad multi bulk reply"\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: build query (empty param table)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- err[m
[31m-empty input param table[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: build query (single param)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {'ping'}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*1\r\n$4\r\nping\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: build query (single param)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {'get', 'one', '\r\n'}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*3\r\n$3\r\nget\r\n$3\r\none\r\n$2\r\n\r\n\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: build query (empty param "")[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {''}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*1\r\n$0\r\n\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: build query (empty param "")[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {''}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*1\r\n$0\r\n\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: build query (nil param)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {parser.null}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*1\r\n$-1\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: build query (numeric param)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {'set', 'foo', 3.1415926}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*3\r\n$3\r\nset\r\n$3\r\nfoo\r\n$9\r\n3.1415926\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: multi bulk reply contains single line reply[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*5\r\n$1\r\na\r\n:1\r\n-Bad argument\r\n+32\r\n$3\r\nfoo\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == 5[m
[31m-res == ["a","1","Bad argument","32","foo"]\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: we allow left-over bytes[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*3\r\n$1\r\na\r\n:1\r\n-Bad argument\r\n+32\r\n$3\r\nfoo\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == 5[m
[31m-res == ["a","1","Bad argument"]\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: bug reported by James Hurst[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = "*3\r\n$9\r\nsubscribe\r\n$38\r\nledge:d1d0ed5f3251473795548ab392181d06\r\n:1\r\n*3\r\n$7\r\nmessage\r\n$38\r\nledge:d1d0ed5f3251473795548ab392181d06\r\n$8\r\nfinished\r\n"[m
[31m-resp = parser.parse_replies(reply, 2)[m
[31m-print("res == " .. cjson.encode(resp))[m
[31m---- out[m
[31m-res == [[["subscribe","ledge:d1d0ed5f3251473795548ab392181d06","1"],5],[["message","ledge:d1d0ed5f3251473795548ab392181d06","finished"],5]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: bad typ[m
[31m---- lua[m
[31m-local parser = require "redis.parser"[m
[31m-print(parser.typename(-1))[m
[31m-print(parser.typename(6))[m
[31m---- out[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: empty multi bulk reply (0 bulk)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*0\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == multi-bulk reply == 5[m
[31m-res == \{\}\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: nil multi bulk reply (-1 bulk)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*-1\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == multi-bulk reply == 5[m
[31m-res == null\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: many query arguments[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {}[m
[31m-for i = 1,2048 do[m
[31m-    table.insert(q, "a")[m
[31m-end[m
[31m-local query = parser.build_query(q)[m
[31m-print(string.len(query))[m
[31m---- out[m
[31m-14343[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex 235794f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-redis-parser-0.12/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RedisParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no crlf in status reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-print(parser._VERSION)[m
[31m---- out[m
[31m-0.10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 834b53e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/core/[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/ngx/[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/[m
[31m-	$(INSTALL) lib/resty/core/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/core/[m
[31m-	$(INSTALL) lib/ngx/*.lua $(DESTDIR)$(LUA_LIB_DIR)/ngx/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/balancer.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/balancer.lua[m
[1mdeleted file mode 100644[m
[1mindex 2d24c13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/balancer.lua[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-local ffi_str = ffi.string[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local FFI_ERROR = base.FFI_ERROR[m
[31m-local int_out = ffi.new("int[1]")[m
[31m-local getfenv = getfenv[m
[31m-local error = error[m
[31m-local type = type[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int ngx_http_lua_ffi_balancer_set_current_peer(ngx_http_request_t *r,[m
[31m-    const unsigned char *addr, size_t addr_len, int port, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_balancer_set_more_tries(ngx_http_request_t *r,[m
[31m-    int count, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_balancer_get_last_failure(ngx_http_request_t *r,[m
[31m-    int *status, char **err);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local peer_state_names = {[m
[31m-    [1] = "keepalive",[m
[31m-    [2] = "next",[m
[31m-    [4] = "failed",[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local _M = { version = base.version }[m
[31m-[m
[31m-[m
[31m-function _M.set_current_peer(addr, port)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if not port then[m
[31m-        port = 0[m
[31m-    elseif type(port) ~= "number" then[m
[31m-        port = tonumber(port)[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_balancer_set_current_peer(r, addr, #addr,[m
[31m-                                                            port, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_more_tries(count)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_balancer_set_more_tries(r, count, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        if errmsg[0] == nil then[m
[31m-            return true[m
[31m-        end[m
[31m-        return true, ffi_str(errmsg[0])  -- return the warning[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_last_failure()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local state = C.ngx_http_lua_ffi_balancer_get_last_failure(r,[m
[31m-                                                               int_out,[m
[31m-                                                               errmsg)[m
[31m-[m
[31m-    if state == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if state == FFI_ERROR then[m
[31m-        return nil, nil, ffi_str(errmsg[0])[m
[31m-    end[m
[31m-[m
[31m-    return peer_state_names[state] or "unknown", int_out[0][m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/ocsp.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/ocsp.lua[m
[1mdeleted file mode 100644[m
[1mindex 495a2c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/ocsp.lua[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-local ffi_str = ffi.string[m
[31m-local getfenv = getfenv[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_string_buf_size = base.get_string_buf_size[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local FFI_BUSY = base.FFI_BUSY[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int ngx_http_lua_ffi_ssl_get_ocsp_responder_from_der_chain([m
[31m-    const char *chain_data, size_t chain_len, char *out, size_t *out_size,[m
[31m-    char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_create_ocsp_request(const char *chain_data,[m
[31m-    size_t chain_len, unsigned char *out, size_t *out_size, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_validate_ocsp_response(const unsigned char *resp,[m
[31m-    size_t resp_len, const char *chain_data, size_t chain_len,[m
[31m-    unsigned char *errbuf, size_t *errbuf_size);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_set_ocsp_status_resp(ngx_http_request_t *r,[m
[31m-    const unsigned char *resp, size_t resp_len, char **err);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local _M = { version = base.version }[m
[31m-[m
[31m-[m
[31m-function _M.get_ocsp_responder_from_der_chain(certs, maxlen)[m
[31m-[m
[31m-    local buf_size = maxlen[m
[31m-    if not buf_size then[m
[31m-        buf_size = get_string_buf_size()[m
[31m-    end[m
[31m-    local buf = get_string_buf(buf_size)[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-    sizep[0] = buf_size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_get_ocsp_responder_from_der_chain(certs,[m
[31m-                                                   #certs, buf, sizep, errmsg)[m
[31m-[m
[31m-    if rc == FFI_DECLINED then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_OK then[m
[31m-        return ffi_str(buf, sizep[0])[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BUSY then[m
[31m-        return ffi_str(buf, sizep[0]), "truncated"[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.create_ocsp_request(certs, maxlen)[m
[31m-[m
[31m-    local buf_size = maxlen[m
[31m-    if not buf_size then[m
[31m-        buf_size = get_string_buf_size()[m
[31m-    end[m
[31m-    local buf = get_string_buf(buf_size)[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-    sizep[0] = buf_size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_create_ocsp_request(certs,[m
[31m-                                                          #certs, buf, sizep,[m
[31m-                                                          errmsg)[m
[31m-[m
[31m-    if rc == FFI_OK then[m
[31m-        return ffi_str(buf, sizep[0])[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BUSY then[m
[31m-        return nil, ffi_str(errmsg[0]) .. ": " .. tonumber(sizep[0])[m
[31m-               .. " > " .. buf_size[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.validate_ocsp_response(resp, chain, max_errmsg_len)[m
[31m-[m
[31m-    local errbuf_size = max_errmsg_len[m
[31m-    if not errbuf_size then[m
[31m-        errbuf_size = get_string_buf_size()[m
[31m-    end[m
[31m-    local errbuf = get_string_buf(errbuf_size)[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-    sizep[0] = errbuf_size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_validate_ocsp_response([m
[31m-                        resp, #resp, chain, #chain, errbuf, sizep)[m
[31m-[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    -- rc == FFI_ERROR[m
[31m-[m
[31m-    return nil, ffi_str(errbuf, sizep[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_ocsp_status_resp(ocsp_resp)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_set_ocsp_status_resp(r, ocsp_resp,[m
[31m-                                                           #ocsp_resp,[m
[31m-                                                           errmsg)[m
[31m-[m
[31m-    if rc == FFI_DECLINED then[m
[31m-        -- no client status req[m
[31m-        return true, "no status req"[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    -- rc == FFI_ERROR[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/semaphore.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/semaphore.lua[m
[1mdeleted file mode 100644[m
[1mindex dc28c30..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/semaphore.lua[m
[1m+++ /dev/null[m
[36m@@ -1,150 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m--- Copyright (C) cuiweixie[m
[31m--- I hereby assign copyright in this code to the lua-resty-core project,[m
[31m--- to be licensed under the same terms as the rest of the code.[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local FFI_ERROR = base.FFI_ERROR[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local ffi_gc = ffi.gc[m
[31m-local C = ffi.C[m
[31m-local type = type[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-local getfenv = getfenv[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local setmetatable = setmetatable[m
[31m-local co_yield = coroutine._yield[m
[31m-local ERR_BUF_SIZE = 128[m
[31m-[m
[31m-[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    struct ngx_http_lua_sema_s;[m
[31m-    typedef struct ngx_http_lua_sema_s ngx_http_lua_sema_t;[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sema_new(ngx_http_lua_sema_t **psem,[m
[31m-        int n, char **errmsg);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sema_post(ngx_http_lua_sema_t *sem, int n);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sema_count(ngx_http_lua_sema_t *sem);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sema_wait(ngx_http_request_t *r,[m
[31m-        ngx_http_lua_sema_t *sem, int wait_ms,[m
[31m-        unsigned char *errstr, size_t *errlen);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_sema_gc(ngx_http_lua_sema_t *sem);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local psem = ffi_new("ngx_http_lua_sema_t *[1]")[m
[31m-[m
[31m-[m
[31m-local _M = { version = base.version }[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(n)[m
[31m-    n = tonumber(n) or 0[m
[31m-    if n < 0 then[m
[31m-        return error("no negative number")[m
[31m-    end[m
[31m-[m
[31m-    local ret = C.ngx_http_lua_ffi_sema_new(psem, n, errmsg)[m
[31m-    if ret == FFI_ERROR then[m
[31m-        return nil, ffi_str(errmsg[0])[m
[31m-    end[m
[31m-[m
[31m-    local sem = psem[0][m
[31m-[m
[31m-    ffi_gc(sem, C.ngx_http_lua_ffi_sema_gc)[m
[31m-[m
[31m-    return setmetatable({ sem = sem }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.wait(self, seconds)[m
[31m-    if type(self) ~= "table" or type(self.sem) ~= "cdata" then[m
[31m-        return error("not a semaphore instance")[m
[31m-    end[m
[31m-[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local milliseconds = tonumber(seconds) * 1000[m
[31m-    if milliseconds < 0 then[m
[31m-        return error("no negative number")[m
[31m-    end[m
[31m-[m
[31m-    local cdata_sem = self.sem[m
[31m-[m
[31m-    local err = get_string_buf(ERR_BUF_SIZE)[m
[31m-    local errlen = get_size_ptr()[m
[31m-    errlen[0] = ERR_BUF_SIZE[m
[31m-[m
[31m-    local ret = C.ngx_http_lua_ffi_sema_wait(r, cdata_sem,[m
[31m-                                             milliseconds, err, errlen)[m
[31m-[m
[31m-    if ret == FFI_ERROR then[m
[31m-        return nil, ffi_str(err, errlen[0])[m
[31m-    end[m
[31m-[m
[31m-    if ret == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    if ret == FFI_DECLINED then[m
[31m-        return nil, "timeout"[m
[31m-    end[m
[31m-[m
[31m-    -- Note: we cannot use the tail-call form here since we[m
[31m-    -- might need the current function call's activation[m
[31m-    -- record to hold the reference to our semaphore object[m
[31m-    -- to prevent it from getting GC'd prematurely.[m
[31m-    local ok, err = co_yield()[m
[31m-    return ok, err[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.post(self, n)[m
[31m-    if type(self) ~= "table" or type(self.sem) ~= "cdata" then[m
[31m-        return error("not a semaphore instance")[m
[31m-    end[m
[31m-[m
[31m-    local cdata_sem = self.sem[m
[31m-[m
[31m-    local num = n and tonumber(n) or 1[m
[31m-    if num < 1 then[m
[31m-        return error("no negative number")[m
[31m-    end[m
[31m-[m
[31m-    -- always return NGX_OK[m
[31m-    C.ngx_http_lua_ffi_sema_post(cdata_sem, num)[m
[31m-[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.count(self)[m
[31m-    if type(self) ~= "table" or type(self.sem) ~= "cdata" then[m
[31m-        return error("not a semaphore instance")[m
[31m-    end[m
[31m-[m
[31m-    return C.ngx_http_lua_ffi_sema_count(self.sem)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/ssl.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/ssl.lua[m
[1mdeleted file mode 100644[m
[1mindex 7224d3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/ngx/ssl.lua[m
[1m+++ /dev/null[m
[36m@@ -1,222 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-local ffi_str = ffi.string[m
[31m-local getfenv = getfenv[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-[m
[31m-struct ngx_ssl_conn_s;[m
[31m-typedef struct ngx_ssl_conn_s  ngx_ssl_conn_t;[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_set_der_certificate(ngx_http_request_t *r,[m
[31m-    const char *data, size_t len, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_clear_certs(ngx_http_request_t *r, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_set_der_private_key(ngx_http_request_t *r,[m
[31m-    const char *data, size_t len, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_raw_server_addr(ngx_http_request_t *r, char **addr,[m
[31m-    size_t *addrlen, int *addrtype, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_server_name(ngx_http_request_t *r, char **name,[m
[31m-    size_t *namelen, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem, size_t pem_len,[m
[31m-    unsigned char *der, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,[m
[31m-    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_get_tls1_version(ngx_http_request_t *r, char **err);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local _M = { version = base.version }[m
[31m-[m
[31m-[m
[31m-local charpp = ffi.new("char*[1]")[m
[31m-local intp = ffi.new("int[1]")[m
[31m-[m
[31m-[m
[31m-function _M.clear_certs()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_clear_certs(r, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_der_cert(data)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_set_der_certificate(r, data, #data,[m
[31m-                                                          errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_der_priv_key(data)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_set_der_private_key(r, data, #data,[m
[31m-                                                          errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local addr_types = {[m
[31m-    [0] = "unix",[m
[31m-    [1] = "inet",[m
[31m-    [2] = "inet6",[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function _M.raw_server_addr()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_raw_server_addr(r, charpp, sizep,[m
[31m-                                                      intp, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        local typ = addr_types[intp[0]][m
[31m-        if not typ then[m
[31m-            return nil, nil, "unknown address type: " .. intp[0][m
[31m-        end[m
[31m-        return ffi_str(charpp[0], sizep[0]), typ[m
[31m-    end[m
[31m-[m
[31m-    return nil, nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.server_name()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_server_name(r, charpp, sizep, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return ffi_str(charpp[0], sizep[0])[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_DECLINED then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.cert_pem_to_der(pem)[m
[31m-    local outbuf = get_string_buf(#pem)[m
[31m-[m
[31m-    local sz = C.ngx_http_lua_ffi_cert_pem_to_der(pem, #pem, outbuf, errmsg)[m
[31m-    if sz > 0 then[m
[31m-        return ffi_str(outbuf, sz)[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.priv_key_pem_to_der(pem)[m
[31m-    local outbuf = get_string_buf(#pem)[m
[31m-[m
[31m-    local sz = C.ngx_http_lua_ffi_priv_key_pem_to_der(pem, #pem, outbuf, errmsg)[m
[31m-    if sz > 0 then[m
[31m-        return ffi_str(outbuf, sz)[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function get_tls1_version()[m
[31m-[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local ver = C.ngx_http_lua_ffi_ssl_get_tls1_version(r, errmsg)[m
[31m-[m
[31m-    ver = tonumber(ver)[m
[31m-[m
[31m-    if ver >= 0 then[m
[31m-        return ver[m
[31m-    end[m
[31m-[m
[31m-    -- rc == FFI_ERROR[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-_M.get_tls1_version = get_tls1_version[m
[31m-[m
[31m-[m
[31m-do[m
[31m-    _M.SSL3_VERSION = 0x0300[m
[31m-    _M.TLS1_VERSION = 0x0301[m
[31m-    _M.TLS1_1_VERSION = 0x0302[m
[31m-    _M.TLS1_2_VERSION = 0x0303[m
[31m-[m
[31m-    local map = {[m
[31m-        [_M.SSL3_VERSION] = "SSLv3",[m
[31m-        [_M.TLS1_VERSION] = "TLSv1",[m
[31m-        [_M.TLS1_1_VERSION] = "TLSv1.1",[m
[31m-        [_M.TLS1_2_VERSION] = "TLSv1.2",[m
[31m-    }[m
[31m-[m
[31m-    function _M.get_tls1_version_str()[m
[31m-        local ver, err = get_tls1_version()[m
[31m-        if not ver then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-        return map[ver][m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core.lua[m
[1mdeleted file mode 100644[m
[1mindex 71bb946..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core.lua[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-require "resty.core.uri"[m
[31m-require "resty.core.hash"[m
[31m-require "resty.core.base64"[m
[31m-require "resty.core.regex"[m
[31m-require "resty.core.exit"[m
[31m-require "resty.core.shdict"[m
[31m-require "resty.core.var"[m
[31m-require "resty.core.ctx"[m
[31m-require "resty.core.misc"[m
[31m-require "resty.core.request"[m
[31m-require "resty.core.response"[m
[31m-require "resty.core.time"[m
[31m-require "resty.core.worker"[m
[31m-[m
[31m-[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/base.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/base.lua[m
[1mdeleted file mode 100644[m
[1mindex ab97e73..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/base.lua[m
[1m+++ /dev/null[m
[36m@@ -1,187 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local ffi_new = ffi.new[m
[31m-local error = error[m
[31m-local setmetatable = setmetatable[m
[31m-local floor = math.floor[m
[31m-local ceil = math.ceil[m
[31m-[m
[31m-[m
[31m-local str_buf_size = 4096[m
[31m-local str_buf[m
[31m-local size_ptr[m
[31m-local FREE_LIST_REF = 0[m
[31m-[m
[31m-[m
[31m-if not ngx.config[m
[31m-   or not ngx.config.ngx_lua_version[m
[31m-   or ngx.config.ngx_lua_version < 10003[m
[31m-then[m
[31m-    error("ngx_lua 0.10.3+ required")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if string.find(jit.version, " 2.0") then[m
[31m-    ngx.log(ngx.WARN, "use of lua-resty-core with LuaJIT 2.0 is "[m
[31m-            .. "not recommended; use LuaJIT 2.1+ instead")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local ok, clear_tab = pcall(require, "table.clear")[m
[31m-if not ok then[m
[31m-    clear_tab = function (tab)[m
[31m-                    for k, _ in pairs(tab) do[m
[31m-                        tab[k] = nil[m
[31m-                    end[m
[31m-                end[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- XXX for now LuaJIT 2.1 cannot compile require()[m
[31m--- so we make the fast code path Lua only in our own[m
[31m--- wrapper so that most of the require() calls in hot[m
[31m--- Lua code paths can be JIT compiled.[m
[31m-do[m
[31m-    local orig_require = require[m
[31m-    local pkg_loaded = package.loaded[m
[31m-    local function my_require(name)[m
[31m-        local mod = pkg_loaded[name][m
[31m-        if mod then[m
[31m-            return mod[m
[31m-        end[m
[31m-        return orig_require(name)[m
[31m-    end[m
[31m-    getfenv(0).require = my_require[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if not pcall(ffi.typeof, "ngx_str_t") then[m
[31m-    ffi.cdef[[[m
[31m-        typedef struct {[m
[31m-            size_t                 len;[m
[31m-            const unsigned char   *data;[m
[31m-        } ngx_str_t;[m
[31m-    ]][m
[31m-end[m
[31m-[m
[31m-[m
[31m-if not pcall(ffi.typeof, "ngx_http_request_t") then[m
[31m-    ffi.cdef[[[m
[31m-        struct ngx_http_request_s;[m
[31m-        typedef struct ngx_http_request_s  ngx_http_request_t;[m
[31m-    ]][m
[31m-end[m
[31m-[m
[31m-[m
[31m-if not pcall(ffi.typeof, "ngx_http_lua_ffi_str_t") then[m
[31m-    ffi.cdef[[[m
[31m-        typedef struct {[m
[31m-            int                       len;[m
[31m-            const unsigned char      *data;[m
[31m-        } ngx_http_lua_ffi_str_t;[m
[31m-    ]][m
[31m-end[m
[31m-[m
[31m-[m
[31m-local c_buf_type = ffi.typeof("char[?]")[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 16)[m
[31m-[m
[31m-[m
[31m-_M.version = "0.1.6"[m
[31m-_M.new_tab = new_tab[m
[31m-_M.clear_tab = clear_tab[m
[31m-[m
[31m-[m
[31m-local errmsg[m
[31m-[m
[31m-[m
[31m-function _M.get_errmsg_ptr()[m
[31m-    if not errmsg then[m
[31m-        errmsg = ffi_new("char *[1]")[m
[31m-    end[m
[31m-    return errmsg[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if not ngx then[m
[31m-    return error("no existing ngx. table found")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_string_buf_size(size)[m
[31m-    if size <= 0 then[m
[31m-        return[m
[31m-    end[m
[31m-    if str_buf then[m
[31m-        str_buf = nil[m
[31m-    end[m
[31m-    str_buf_size = ceil(size)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_string_buf_size()[m
[31m-    return str_buf_size[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_size_ptr()[m
[31m-    if not size_ptr then[m
[31m-        size_ptr = ffi_new("size_t[1]")[m
[31m-    end[m
[31m-[m
[31m-    return size_ptr[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_string_buf(size, must_alloc)[m
[31m-    -- ngx.log(ngx.ERR, "str buf size: ", str_buf_size)[m
[31m-    if size > str_buf_size or must_alloc then[m
[31m-        return ffi_new(c_buf_type, size)[m
[31m-    end[m
[31m-[m
[31m-    if not str_buf then[m
[31m-        str_buf = ffi_new(c_buf_type, str_buf_size)[m
[31m-    end[m
[31m-[m
[31m-    return str_buf[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.ref_in_table(tb, key)[m
[31m-    if key == nil then[m
[31m-        return -1[m
[31m-    end[m
[31m-    local ref = tb[FREE_LIST_REF][m
[31m-    if ref and ref ~= 0 then[m
[31m-         tb[FREE_LIST_REF] = tb[ref][m
[31m-[m
[31m-    else[m
[31m-        ref = #tb + 1[m
[31m-    end[m
[31m-    tb[ref] = key[m
[31m-[m
[31m-    -- print("ref key_id returned ", ref)[m
[31m-    return ref[m
[31m-end[m
[31m-[m
[31m-[m
[31m-_M.FFI_OK = 0[m
[31m-_M.FFI_NO_REQ_CTX = -100[m
[31m-_M.FFI_BAD_CONTEXT = -101[m
[31m-_M.FFI_ERROR = -1[m
[31m-_M.FFI_BUSY = -3[m
[31m-_M.FFI_DONE = -4[m
[31m-_M.FFI_DECLINED = -5[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/base64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/base64.lua[m
[1mdeleted file mode 100644[m
[1mindex 83c0bf3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/base64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,90 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-local ffi_string = ffi.string[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local error = error[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local floor = math.floor[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    size_t ngx_http_lua_ffi_encode_base64(const unsigned char *src,[m
[31m-                                          size_t len, unsigned char *dst,[m
[31m-                                          int no_padding);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_decode_base64(const unsigned char *src,[m
[31m-                                       size_t len, unsigned char *dst,[m
[31m-                                       size_t *dlen);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local function base64_encoded_length(len, no_padding)[m
[31m-    return no_padding and floor((len * 8 + 5) / 6) or[m
[31m-           floor((len + 2) / 3) * 4[m
[31m-end[m
[31m-[m
[31m-[m
[31m-ngx.encode_base64 = function (s, no_padding)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local slen = #s[m
[31m-    local no_padding_bool = false;[m
[31m-    local no_padding_int = 0;[m
[31m-[m
[31m-    if no_padding then[m
[31m-        if no_padding ~= true then[m
[31m-            return error("boolean argument only")[m
[31m-        end[m
[31m-[m
[31m-        no_padding_bool = true[m
[31m-        no_padding_int  = 1;[m
[31m-    end[m
[31m-[m
[31m-    local dlen = base64_encoded_length(slen, no_padding_bool)[m
[31m-    local dst = get_string_buf(dlen)[m
[31m-    local r_dlen = C.ngx_http_lua_ffi_encode_base64(s, slen, dst,[m
[31m-                                                    no_padding_int)[m
[31m-    -- if dlen ~= r_dlen then error("discrepancy in len") end[m
[31m-    return ffi_string(dst, r_dlen)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function base64_decoded_length(len)[m
[31m-    return floor((len + 3) / 4) * 3[m
[31m-end[m
[31m-[m
[31m-[m
[31m-ngx.decode_base64 = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        return error("string argument only")[m
[31m-    end[m
[31m-    local slen = #s[m
[31m-    local dlen = base64_decoded_length(slen)[m
[31m-    -- print("dlen: ", tonumber(dlen))[m
[31m-    local dst = get_string_buf(dlen)[m
[31m-    local pdlen = get_size_ptr()[m
[31m-    local ok = C.ngx_http_lua_ffi_decode_base64(s, slen, dst, pdlen)[m
[31m-    if ok == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-    return ffi_string(dst, pdlen[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/ctx.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/ctx.lua[m
[1mdeleted file mode 100644[m
[1mindex c75261f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/ctx.lua[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local debug = require 'debug'[m
[31m-local base = require "resty.core.base"[m
[31m-local misc = require "resty.core.misc"[m
[31m-[m
[31m-[m
[31m-local register_getter = misc.register_ngx_magic_key_getter[m
[31m-local register_setter = misc.register_ngx_magic_key_setter[m
[31m-local registry = debug.getregistry()[m
[31m-local new_tab = base.new_tab[m
[31m-local ref_in_table = base.ref_in_table[m
[31m-local getfenv = getfenv[m
[31m-local C = ffi.C[m
[31m-local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int ngx_http_lua_ffi_get_ctx_ref(ngx_http_request_t *r);[m
[31m-int ngx_http_lua_ffi_set_ctx_ref(ngx_http_request_t *r, int ref);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = base.version[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local function get_ctx_table()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local ctx_ref = C.ngx_http_lua_ffi_get_ctx_ref(r)[m
[31m-    if ctx_ref == FFI_NO_REQ_CTX then[m
[31m-        return error("no request ctx found")[m
[31m-    end[m
[31m-[m
[31m-    local ctxs = registry.ngx_lua_ctx_tables[m
[31m-    if ctx_ref < 0 then[m
[31m-        local ctx = new_tab(0, 4)[m
[31m-        ctx_ref = ref_in_table(ctxs, ctx)[m
[31m-        if C.ngx_http_lua_ffi_set_ctx_ref(r, ctx_ref) ~= FFI_OK then[m
[31m-            return nil[m
[31m-        end[m
[31m-        return ctx[m
[31m-    end[m
[31m-    return ctxs[ctx_ref][m
[31m-end[m
[31m-register_getter("ctx", get_ctx_table)[m
[31m-[m
[31m-[m
[31m-local function set_ctx_table(ctx)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local ctx_ref = C.ngx_http_lua_ffi_get_ctx_ref(r)[m
[31m-    if ctx_ref == FFI_NO_REQ_CTX then[m
[31m-        return error("no request ctx found")[m
[31m-    end[m
[31m-[m
[31m-    local ctxs = registry.ngx_lua_ctx_tables[m
[31m-    if ctx_ref < 0 then[m
[31m-        ctx_ref = ref_in_table(ctxs, ctx)[m
[31m-        C.ngx_http_lua_ffi_set_ctx_ref(r, ctx_ref)[m
[31m-        return[m
[31m-    end[m
[31m-    ctxs[ctx_ref] = ctx[m
[31m-end[m
[31m-register_setter("ctx", set_ctx_table)[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/exit.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/exit.lua[m
[1mdeleted file mode 100644[m
[1mindex 10cbc07..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/exit.lua[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local ffi_string = ffi.string[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-local error = error[m
[31m-local base = require "resty.core.base"[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local base = require "resty.core.base"[m
[31m-local getfenv = getfenv[m
[31m-local co_yield = coroutine._yield[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_exit(ngx_http_request_t *r, int status,[m
[31m-                               unsigned char *err, size_t *errlen);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local ERR_BUF_SIZE = 128[m
[31m-local FFI_DONE = base.FFI_DONE[m
[31m-[m
[31m-[m
[31m-ngx.exit = function (rc)[m
[31m-    local err = get_string_buf(ERR_BUF_SIZE)[m
[31m-    local errlen = get_size_ptr()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if r == nil then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-    errlen[0] = ERR_BUF_SIZE[m
[31m-    local rc = C.ngx_http_lua_ffi_exit(r, rc, err, errlen)[m
[31m-    if rc == 0 then[m
[31m-        -- print("yielding...")[m
[31m-        return co_yield()[m
[31m-    end[m
[31m-    if rc == FFI_DONE then[m
[31m-        return[m
[31m-    end[m
[31m-    return error(ffi_string(err, errlen[0]))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/hash.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/hash.lua[m
[1mdeleted file mode 100644[m
[1mindex 79c934a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/hash.lua[m
[1m+++ /dev/null[m
[36m@@ -1,80 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local ffi_string = ffi.string[m
[31m-local ffi_new = ffi.new[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local error = error[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    void ngx_http_lua_ffi_md5_bin(const unsigned char *src, size_t len,[m
[31m-                                  unsigned char *dst);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_md5(const unsigned char *src, size_t len,[m
[31m-                              unsigned char *dst);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sha1_bin(const unsigned char *src, size_t len,[m
[31m-                                  unsigned char *dst);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local MD5_DIGEST_LEN = 16[m
[31m-local md5_buf = ffi_new("unsigned char[?]", MD5_DIGEST_LEN)[m
[31m-[m
[31m-ngx.md5_bin = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    C.ngx_http_lua_ffi_md5_bin(s, #s, md5_buf)[m
[31m-    return ffi_string(md5_buf, MD5_DIGEST_LEN)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local MD5_HEX_DIGEST_LEN = MD5_DIGEST_LEN * 2[m
[31m-local md5_hex_buf = ffi_new("unsigned char[?]", MD5_HEX_DIGEST_LEN)[m
[31m-[m
[31m-ngx.md5 = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    C.ngx_http_lua_ffi_md5(s, #s, md5_hex_buf)[m
[31m-    return ffi_string(md5_hex_buf, MD5_HEX_DIGEST_LEN)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local SHA_DIGEST_LEN = 20[m
[31m-local sha_buf = ffi_new("unsigned char[?]", SHA_DIGEST_LEN)[m
[31m-[m
[31m-ngx.sha1_bin = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    local ok = C.ngx_http_lua_ffi_sha1_bin(s, #s, sha_buf)[m
[31m-    if ok == 0 then[m
[31m-        return error("SHA-1 support missing in Nginx")[m
[31m-    end[m
[31m-    return ffi_string(sha_buf, SHA_DIGEST_LEN)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/misc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/misc.lua[m
[1mdeleted file mode 100644[m
[1mindex 5b7a690..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/misc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local base = require "resty.core.base"[m
[31m-local ffi = require "ffi"[m
[31m-[m
[31m-[m
[31m-local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX[m
[31m-local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT[m
[31m-local new_tab = base.new_tab[m
[31m-local C = ffi.C[m
[31m-local getmetatable = getmetatable[m
[31m-local ngx_magic_key_getters = new_tab(0, 4)[m
[31m-local ngx_magic_key_setters = new_tab(0, 2)[m
[31m-local ngx = ngx[m
[31m-local getfenv = getfenv[m
[31m-local type = type[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 3)[m
[31m-_M._VERSION = base.version[m
[31m-[m
[31m-[m
[31m-local function register_getter(key, func)[m
[31m-    ngx_magic_key_getters[key] = func[m
[31m-end[m
[31m-_M.register_ngx_magic_key_getter = register_getter[m
[31m-[m
[31m-[m
[31m-local function register_setter(key, func)[m
[31m-    ngx_magic_key_setters[key] = func[m
[31m-end[m
[31m-_M.register_ngx_magic_key_setter = register_setter[m
[31m-[m
[31m-[m
[31m-local mt = getmetatable(ngx)[m
[31m-[m
[31m-[m
[31m-local old_index = mt.__index[m
[31m-mt.__index = function (tb, key)[m
[31m-    local f = ngx_magic_key_getters[key][m
[31m-    if f then[m
[31m-        return f()[m
[31m-    end[m
[31m-    return old_index(tb, key)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local old_newindex = mt.__newindex[m
[31m-mt.__newindex = function (tb, key, ctx)[m
[31m-    local f = ngx_magic_key_setters[key][m
[31m-    if f then[m
[31m-        return f(ctx)[m
[31m-    end[m
[31m-    return old_newindex(tb, key, ctx)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_get_resp_status(ngx_http_request_t *r);[m
[31m-    int ngx_http_lua_ffi_set_resp_status(ngx_http_request_t *r, int r);[m
[31m-    int ngx_http_lua_ffi_is_subrequest(ngx_http_request_t *r);[m
[31m-    int ngx_http_lua_ffi_headers_sent(ngx_http_request_t *r);[m
[31m-]][m
[31m-[m
[31m-[m
[31m--- ngx.status[m
[31m-[m
[31m-local function get_status()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_get_resp_status(r)[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return rc[m
[31m-end[m
[31m-register_getter("status", get_status)[m
[31m-[m
[31m-[m
[31m-local function set_status(status)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(status) ~= 'number' then[m
[31m-        status = tonumber(status)[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_set_resp_status(r, status)[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return[m
[31m-end[m
[31m-register_setter("status", set_status)[m
[31m-[m
[31m-[m
[31m--- ngx.is_subrequest[m
[31m-[m
[31m-local function is_subreq()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_is_subrequest(r)[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return rc == 1 and true or false[m
[31m-end[m
[31m-register_getter("is_subrequest", is_subreq)[m
[31m-[m
[31m-[m
[31m--- ngx.headers_sent[m
[31m-[m
[31m-local function headers_sent()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_headers_sent(r)[m
[31m-[m
[31m-    if rc == FFI_NO_REQ_CTX then[m
[31m-        return error("no request ctx found")[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return rc == 1[m
[31m-end[m
[31m-register_getter("headers_sent", headers_sent)[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/regex.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/regex.lua[m
[1mdeleted file mode 100644[m
[1mindex b469159..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/regex.lua[m
[1m+++ /dev/null[m
[36m@@ -1,862 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-local bit = require "bit"[m
[31m-require "resty.core.time"  -- for ngx.now used by resty.lrucache[m
[31m-local lrucache = require "resty.lrucache"[m
[31m-[m
[31m-local lrucache_get = lrucache.get[m
[31m-local lrucache_set = lrucache.set[m
[31m-local ffi_string = ffi.string[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_gc = ffi.gc[m
[31m-local ffi_copy = ffi.copy[m
[31m-local ffi_cast = ffi.cast[m
[31m-local C = ffi.C[m
[31m-local bor = bit.bor[m
[31m-local band = bit.band[m
[31m-local lshift = bit.lshift[m
[31m-local sub = string.sub[m
[31m-local fmt = string.format[m
[31m-local byte = string.byte[m
[31m-local setmetatable = setmetatable[m
[31m-local concat = table.concat[m
[31m-local ngx = ngx[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local error = error[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_string_buf_size = base.get_string_buf_size[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local new_tab = base.new_tab[m
[31m-local floor = math.floor[m
[31m-local print = print[m
[31m-local tonumber = tonumber[m
[31m-local ngx_log = ngx.log[m
[31m-local ngx_ERR = ngx.ERR[m
[31m-[m
[31m-[m
[31m-if not ngx.re then[m
[31m-    ngx.re = {}[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local MAX_ERR_MSG_LEN = 128[m
[31m-[m
[31m-[m
[31m-local FLAG_COMPILE_ONCE  = 0x01[m
[31m-local FLAG_DFA           = 0x02[m
[31m-local FLAG_JIT           = 0x04[m
[31m-local FLAG_DUPNAMES      = 0x08[m
[31m-local FLAG_NO_UTF8_CHECK = 0x10[m
[31m-[m
[31m-[m
[31m-local PCRE_CASELESS          = 0x0000001[m
[31m-local PCRE_MULTILINE         = 0x0000002[m
[31m-local PCRE_DOTALL            = 0x0000004[m
[31m-local PCRE_EXTENDED          = 0x0000008[m
[31m-local PCRE_ANCHORED          = 0x0000010[m
[31m-local PCRE_UTF8              = 0x0000800[m
[31m-local PCRE_DUPNAMES          = 0x0080000[m
[31m-local PCRE_JAVASCRIPT_COMPAT = 0x2000000[m
[31m-[m
[31m-[m
[31m-local PCRE_ERROR_NOMATCH = -1[m
[31m-[m
[31m-[m
[31m-local regex_match_cache[m
[31m-local regex_sub_func_cache = new_tab(0, 4)[m
[31m-local regex_sub_str_cache = new_tab(0, 4)[m
[31m-local max_regex_cache_size[m
[31m-local regex_cache_size = 0[m
[31m-local script_engine[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    typedef struct {[m
[31m-        ngx_str_t                   value;[m
[31m-        void                       *lengths;[m
[31m-        void                       *values;[m
[31m-    } ngx_http_lua_complex_value_t;[m
[31m-[m
[31m-    typedef struct {[m
[31m-        void                         *pool;[m
[31m-        unsigned char                *name_table;[m
[31m-        int                           name_count;[m
[31m-        int                           name_entry_size;[m
[31m-[m
[31m-        int                           ncaptures;[m
[31m-        int                          *captures;[m
[31m-[m
[31m-        void                         *regex;[m
[31m-        void                         *regex_sd;[m
[31m-[m
[31m-        ngx_http_lua_complex_value_t *replace;[m
[31m-[m
[31m-        const char                   *pattern;[m
[31m-    } ngx_http_lua_regex_t;[m
[31m-[m
[31m-    ngx_http_lua_regex_t *[m
[31m-        ngx_http_lua_ffi_compile_regex(const unsigned char *pat,[m
[31m-            size_t pat_len, int flags,[m
[31m-            int pcre_opts, unsigned char *errstr,[m
[31m-            size_t errstr_size);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_exec_regex(ngx_http_lua_regex_t *re, int flags,[m
[31m-        const unsigned char *s, size_t len, int pos);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_destroy_regex(ngx_http_lua_regex_t *re);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_compile_replace_template(ngx_http_lua_regex_t *re,[m
[31m-                                                  const unsigned char[m
[31m-                                                  *replace_data,[m
[31m-                                                  size_t replace_len);[m
[31m-[m
[31m-    struct ngx_http_lua_script_engine_s;[m
[31m-    typedef struct ngx_http_lua_script_engine_s  *ngx_http_lua_script_engine_t;[m
[31m-[m
[31m-    ngx_http_lua_script_engine_t *ngx_http_lua_ffi_create_script_engine(void);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_init_script_engine(ngx_http_lua_script_engine_t *e,[m
[31m-                                             const unsigned char *subj,[m
[31m-                                             ngx_http_lua_regex_t *compiled,[m
[31m-                                             int count);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_destroy_script_engine([m
[31m-        ngx_http_lua_script_engine_t *e);[m
[31m-[m
[31m-    size_t ngx_http_lua_ffi_script_eval_len(ngx_http_lua_script_engine_t *e,[m
[31m-                                            ngx_http_lua_complex_value_t *cv);[m
[31m-[m
[31m-    size_t ngx_http_lua_ffi_script_eval_data(ngx_http_lua_script_engine_t *e,[m
[31m-                                             ngx_http_lua_complex_value_t *cv,[m
[31m-                                             unsigned char *dst);[m
[31m-[m
[31m-    uint32_t ngx_http_lua_ffi_max_regex_cache_size(void);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local c_str_type = ffi.typeof("const char *")[m
[31m-[m
[31m-local cached_re_opts = new_tab(0, 4)[m
[31m-[m
[31m-local _M = {[m
[31m-    version = base.version[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local buf_grow_ratio = 2[m
[31m-[m
[31m-function _M.set_buf_grow_ratio(ratio)[m
[31m-    buf_grow_ratio = ratio[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function get_max_regex_cache_size()[m
[31m-    if max_regex_cache_size then[m
[31m-        return max_regex_cache_size[m
[31m-    end[m
[31m-    max_regex_cache_size = C.ngx_http_lua_ffi_max_regex_cache_size()[m
[31m-    return max_regex_cache_size[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function parse_regex_opts(opts)[m
[31m-    local t = cached_re_opts[opts][m
[31m-    if t then[m
[31m-        return t[1], t[2][m
[31m-    end[m
[31m-[m
[31m-    local flags = 0[m
[31m-    local pcre_opts = 0[m
[31m-    local len = #opts[m
[31m-[m
[31m-    for i = 1, len do[m
[31m-        local opt = byte(opts, i)[m
[31m-        if opt == byte("o") then[m
[31m-            flags = bor(flags, FLAG_COMPILE_ONCE)[m
[31m-[m
[31m-        elseif opt == byte("j") then[m
[31m-            flags = bor(flags, FLAG_JIT)[m
[31m-[m
[31m-        elseif opt == byte("i") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_CASELESS)[m
[31m-[m
[31m-        elseif opt == byte("s") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_DOTALL)[m
[31m-[m
[31m-        elseif opt == byte("m") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_MULTILINE)[m
[31m-[m
[31m-        elseif opt == byte("u") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_UTF8)[m
[31m-[m
[31m-        elseif opt == byte("U") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_UTF8)[m
[31m-            flags = bor(flags, FLAG_NO_UTF8_CHECK)[m
[31m-[m
[31m-        elseif opt == byte("x") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_EXTENDED)[m
[31m-[m
[31m-        elseif opt == byte("d") then[m
[31m-            flags = bor(flags, FLAG_DFA)[m
[31m-[m
[31m-        elseif opt == byte("a") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_ANCHORED)[m
[31m-[m
[31m-        elseif opt == byte("D") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_DUPNAMES)[m
[31m-            flags = bor(flags, FLAG_DUPNAMES)[m
[31m-[m
[31m-        elseif opt == byte("J") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_JAVASCRIPT_COMPAT)[m
[31m-[m
[31m-        else[m
[31m-            return error(fmt('unknown flag "%s" (flags "%s")',[m
[31m-                             sub(opts, i, i), opts))[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    cached_re_opts[opts] = {flags, pcre_opts}[m
[31m-    return flags, pcre_opts[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function collect_named_captures(compiled, flags, res)[m
[31m-    local name_count = compiled.name_count[m
[31m-    local name_table = compiled.name_table[m
[31m-    local entry_size = compiled.name_entry_size[m
[31m-[m
[31m-    local ind = 0[m
[31m-    local dup_names = (band(flags, FLAG_DUPNAMES) ~= 0)[m
[31m-    for i = 1, name_count do[m
[31m-        local n = bor(lshift(name_table[ind], 8), name_table[ind + 1])[m
[31m-        -- ngx.say("n = ", n)[m
[31m-        local name = ffi_string(name_table + ind + 2)[m
[31m-        local cap = res[n][m
[31m-        if dup_names then[m
[31m-            -- unmatched captures (false) are not collected[m
[31m-            if cap then[m
[31m-                local old = res[name][m
[31m-                if old then[m
[31m-                    old[#old + 1] = cap[m
[31m-                else[m
[31m-                    res[name] = {cap}[m
[31m-                end[m
[31m-            end[m
[31m-        else[m
[31m-            res[name] = cap[m
[31m-        end[m
[31m-[m
[31m-        ind = ind + entry_size[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function collect_captures(compiled, rc, subj, flags, res)[m
[31m-    local cap = compiled.captures[m
[31m-    local ncap = compiled.ncaptures[m
[31m-    local name_count = compiled.name_count[m
[31m-[m
[31m-    if not res then[m
[31m-        res = new_tab(ncap, name_count)[m
[31m-    end[m
[31m-[m
[31m-    local i = 0[m
[31m-    local n = 0[m
[31m-    while i <= ncap do[m
[31m-        if i > rc then[m
[31m-            res[i] = false[m
[31m-        else[m
[31m-            local from = cap[n][m
[31m-            if from >= 0 then[m
[31m-                local to = cap[n + 1][m
[31m-                res[i] = sub(subj, from + 1, to)[m
[31m-            else[m
[31m-                res[i] = false[m
[31m-            end[m
[31m-        end[m
[31m-        i = i + 1[m
[31m-        n = n + 2[m
[31m-    end[m
[31m-[m
[31m-    if name_count > 0 then[m
[31m-        collect_named_captures(compiled, flags, res)[m
[31m-    end[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function destroy_compiled_regex(compiled)[m
[31m-    C.ngx_http_lua_ffi_destroy_regex(ffi_gc(compiled, nil))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_match_compile(regex, opts)[m
[31m-    local flags = 0[m
[31m-    local pcre_opts = 0[m
[31m-[m
[31m-    if opts then[m
[31m-        flags, pcre_opts = parse_regex_opts(opts)[m
[31m-    else[m
[31m-        opts = ""[m
[31m-    end[m
[31m-[m
[31m-    local compiled, key[m
[31m-    local compile_once = (band(flags, FLAG_COMPILE_ONCE) == 1)[m
[31m-[m
[31m-    -- FIXME: better put this in the outer scope when fixing the ngx.re API's[m
[31m-    -- compatibility in the init_by_lua* context.[m
[31m-    if not regex_match_cache then[m
[31m-        local sz = get_max_regex_cache_size()[m
[31m-        if sz <= 0 then[m
[31m-            compile_once = false[m
[31m-        else[m
[31m-            regex_match_cache = lrucache.new(sz)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if compile_once then[m
[31m-        key = regex .. '\0' .. opts[m
[31m-        compiled = lrucache_get(regex_match_cache, key)[m
[31m-    end[m
[31m-[m
[31m-    -- compile the regex[m
[31m-[m
[31m-    if compiled == nil then[m
[31m-        -- print("compiled regex not found, compiling regex...")[m
[31m-        local errbuf = get_string_buf(MAX_ERR_MSG_LEN)[m
[31m-[m
[31m-        compiled = C.ngx_http_lua_ffi_compile_regex(regex, #regex,[m
[31m-                                                    flags, pcre_opts,[m
[31m-                                                    errbuf, MAX_ERR_MSG_LEN)[m
[31m-[m
[31m-        if compiled == nil then[m
[31m-            return nil, ffi_string(errbuf)[m
[31m-        end[m
[31m-[m
[31m-        ffi_gc(compiled, C.ngx_http_lua_ffi_destroy_regex)[m
[31m-[m
[31m-        -- print("ncaptures: ", compiled.ncaptures)[m
[31m-[m
[31m-        if compile_once then[m
[31m-            -- print("inserting compiled regex into cache")[m
[31m-            lrucache_set(regex_match_cache, key, compiled)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return compiled, compile_once, flags[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_match_helper(subj, regex, opts, ctx, want_caps, res, nth)[m
[31m-    -- we need to cast this to strings to avoid exceptions when they are[m
[31m-    -- something else.[m
[31m-    subj  = tostring(subj)[m
[31m-[m
[31m-    local compiled, compile_once, flags = re_match_compile(regex, opts)[m
[31m-    if compiled == nil then[m
[31m-        -- compiled_once holds the error string[m
[31m-        if not want_caps then[m
[31m-            return nil, nil, compile_once[m
[31m-        end[m
[31m-        return nil, compile_once[m
[31m-    end[m
[31m-[m
[31m-    -- exec the compiled regex[m
[31m-[m
[31m-    local rc[m
[31m-    do[m
[31m-        local pos[m
[31m-        if ctx then[m
[31m-            pos = ctx.pos[m
[31m-            if not pos or pos <= 0 then[m
[31m-                pos = 0[m
[31m-            else[m
[31m-                pos = pos - 1[m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            pos = 0[m
[31m-        end[m
[31m-[m
[31m-        rc = C.ngx_http_lua_ffi_exec_regex(compiled, flags, subj, #subj, pos)[m
[31m-    end[m
[31m-[m
[31m-    if rc == PCRE_ERROR_NOMATCH then[m
[31m-        if not compile_once then[m
[31m-            destroy_compiled_regex(compiled)[m
[31m-        end[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if rc < 0 then[m
[31m-        if not compile_once then[m
[31m-            destroy_compiled_regex(compiled)[m
[31m-        end[m
[31m-        if not want_caps then[m
[31m-            return nil, nil, "pcre_exec() failed: " .. rc[m
[31m-        end[m
[31m-        return nil, "pcre_exec() failed: " .. rc[m
[31m-    end[m
[31m-[m
[31m-    if rc == 0 then[m
[31m-        if band(flags, FLAG_DFA) == 0 then[m
[31m-            if not want_caps then[m
[31m-                return nil, nil, "capture size too small"[m
[31m-            end[m
[31m-            return nil, "capture size too small"[m
[31m-        end[m
[31m-[m
[31m-        rc = 1[m
[31m-    end[m
[31m-[m
[31m-    -- print("cap 0: ", compiled.captures[0])[m
[31m-    -- print("cap 1: ", compiled.captures[1])[m
[31m-[m
[31m-    if ctx then[m
[31m-        ctx.pos = compiled.captures[1] + 1[m
[31m-    end[m
[31m-[m
[31m-    if not want_caps then[m
[31m-        if not nth or nth < 0 then[m
[31m-            nth = 0[m
[31m-        end[m
[31m-[m
[31m-        if nth > compiled.ncaptures then[m
[31m-            return nil, nil, "nth out of bound"[m
[31m-        end[m
[31m-[m
[31m-        if nth >= rc then[m
[31m-            return nil, nil[m
[31m-        end[m
[31m-[m
[31m-        local from = compiled.captures[nth * 2] + 1[m
[31m-        local to = compiled.captures[nth * 2 + 1][m
[31m-[m
[31m-        if from < 0 or to < 0 then[m
[31m-            return nil, nil[m
[31m-        end[m
[31m-[m
[31m-        return from, to[m
[31m-    end[m
[31m-[m
[31m-    res = collect_captures(compiled, rc, subj, flags, res)[m
[31m-[m
[31m-    if not compile_once then[m
[31m-        destroy_compiled_regex(compiled)[m
[31m-    end[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.re.match(subj, regex, opts, ctx, res)[m
[31m-    return re_match_helper(subj, regex, opts, ctx, true, res)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.re.find(subj, regex, opts, ctx, nth)[m
[31m-    return re_match_helper(subj, regex, opts, ctx, false, nil, nth)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function new_script_engine(subj, compiled, count)[m
[31m-    if not script_engine then[m
[31m-        script_engine = C.ngx_http_lua_ffi_create_script_engine()[m
[31m-        if script_engine == nil then[m
[31m-            return nil[m
[31m-        end[m
[31m-        ffi_gc(script_engine, C.ngx_http_lua_ffi_destroy_script_engine)[m
[31m-    end[m
[31m-[m
[31m-    C.ngx_http_lua_ffi_init_script_engine(script_engine, subj, compiled,[m
[31m-                                          count)[m
[31m-    return script_engine[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function check_buf_size(buf, buf_size, pos, len, new_len, must_alloc)[m
[31m-    if new_len > buf_size then[m
[31m-        buf_size = buf_size * buf_grow_ratio[m
[31m-        if buf_size < new_len then[m
[31m-            buf_size = new_len[m
[31m-        end[m
[31m-        local new_buf = get_string_buf(buf_size, must_alloc)[m
[31m-        ffi_copy(new_buf, buf, len)[m
[31m-        buf = new_buf[m
[31m-        pos = buf + len[m
[31m-    end[m
[31m-    return buf, buf_size, pos, new_len[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_sub_compile(regex, opts, replace, func)[m
[31m-    local flags = 0[m
[31m-    local pcre_opts = 0[m
[31m-[m
[31m-    if opts then[m
[31m-        flags, pcre_opts = parse_regex_opts(opts)[m
[31m-    else[m
[31m-        opts = ""[m
[31m-    end[m
[31m-[m
[31m-    local compiled[m
[31m-    local compile_once = (band(flags, FLAG_COMPILE_ONCE) == 1)[m
[31m-    if compile_once then[m
[31m-        if func then[m
[31m-            local subcache = regex_sub_func_cache[opts][m
[31m-            if subcache then[m
[31m-                -- print("cache hit!")[m
[31m-                compiled = subcache[regex][m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            local subcache = regex_sub_str_cache[opts][m
[31m-            if subcache then[m
[31m-                local subsubcache = subcache[regex][m
[31m-                if subsubcache then[m
[31m-                    -- print("cache hit!")[m
[31m-                    compiled = subsubcache[replace][m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- compile the regex[m
[31m-[m
[31m-    if compiled == nil then[m
[31m-        -- print("compiled regex not found, compiling regex...")[m
[31m-        local errbuf = get_string_buf(MAX_ERR_MSG_LEN)[m
[31m-[m
[31m-        compiled = C.ngx_http_lua_ffi_compile_regex(regex, #regex, flags,[m
[31m-                                                    pcre_opts, errbuf,[m
[31m-                                                    MAX_ERR_MSG_LEN)[m
[31m-[m
[31m-        if compiled == nil then[m
[31m-            return nil, ffi_string(errbuf)[m
[31m-        end[m
[31m-[m
[31m-        ffi_gc(compiled, C.ngx_http_lua_ffi_destroy_regex)[m
[31m-[m
[31m-        if func == nil then[m
[31m-            local rc =[m
[31m-                C.ngx_http_lua_ffi_compile_replace_template(compiled,[m
[31m-                                                            replace, #replace)[m
[31m-            if rc ~= 0 then[m
[31m-                if not compile_once then[m
[31m-                    destroy_compiled_regex(compiled)[m
[31m-                end[m
[31m-                return nil, "failed to compile the replacement template"[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        -- print("ncaptures: ", compiled.ncaptures)[m
[31m-[m
[31m-        if compile_once then[m
[31m-            if regex_cache_size < get_max_regex_cache_size() then[m
[31m-                -- print("inserting compiled regex into cache")[m
[31m-                if func then[m
[31m-                    local subcache = regex_sub_func_cache[opts][m
[31m-                    if not subcache then[m
[31m-                        regex_sub_func_cache[opts] = {[regex] = compiled}[m
[31m-[m
[31m-                    else[m
[31m-                        subcache[regex] = compiled[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    local subcache = regex_sub_str_cache[opts][m
[31m-                    if not subcache then[m
[31m-                        regex_sub_str_cache[opts] =[m
[31m-                            {[regex] = {[replace] = compiled}}[m
[31m-[m
[31m-                    else[m
[31m-                        local subsubcache = subcache[regex][m
[31m-                        if not subsubcache then[m
[31m-                            subcache[regex] = {[replace] = compiled}[m
[31m-[m
[31m-                        else[m
[31m-                            subsubcache[replace] = compiled[m
[31m-                        end[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                regex_cache_size = regex_cache_size + 1[m
[31m-            else[m
[31m-                compile_once = false[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return compiled, compile_once, flags[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_sub_func_helper(subj, regex, replace, opts, global)[m
[31m-    local compiled, compile_once, flags =[m
[31m-                                    re_sub_compile(regex, opts, nil, replace)[m
[31m-    if not compiled then[m
[31m-        -- error string is in compile_once[m
[31m-        return nil, nil, compile_once[m
[31m-    end[m
[31m-[m
[31m-    -- exec the compiled regex[m
[31m-[m
[31m-    subj = tostring(subj)[m
[31m-    local subj_len = #subj[m
[31m-    local count = 0[m
[31m-    local pos = 0[m
[31m-    local cp_pos = 0[m
[31m-[m
[31m-    local dst_buf_size = get_string_buf_size()[m
[31m-    -- Note: we have to always allocate the string buffer because[m
[31m-    -- the user might call whatever resty.core's API functions recursively[m
[31m-    -- in the user callback function.[m
[31m-    local dst_buf = get_string_buf(dst_buf_size, true)[m
[31m-    local dst_pos = dst_buf[m
[31m-    local dst_len = 0[m
[31m-[m
[31m-    while true do[m
[31m-        local rc = C.ngx_http_lua_ffi_exec_regex(compiled, flags, subj,[m
[31m-                                                 subj_len, pos)[m
[31m-        if rc == PCRE_ERROR_NOMATCH then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        if rc < 0 then[m
[31m-            if not compile_once then[m
[31m-                destroy_compiled_regex(compiled)[m
[31m-            end[m
[31m-            return nil, nil, "pcre_exec() failed: " .. rc[m
[31m-        end[m
[31m-[m
[31m-        if rc == 0 then[m
[31m-            if band(flags, FLAG_DFA) == 0 then[m
[31m-                if not compile_once then[m
[31m-                    destroy_compiled_regex(compiled)[m
[31m-                end[m
[31m-                return nil, nil, "capture size too small"[m
[31m-            end[m
[31m-[m
[31m-            rc = 1[m
[31m-        end[m
[31m-[m
[31m-        count = count + 1[m
[31m-        local prefix_len = compiled.captures[0] - cp_pos[m
[31m-[m
[31m-        local res = collect_captures(compiled, rc, subj, flags)[m
[31m-[m
[31m-        local bit = tostring(replace(res))[m
[31m-        local bit_len = #bit[m
[31m-[m
[31m-        local new_dst_len = dst_len + prefix_len + bit_len[m
[31m-        dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-            check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                           new_dst_len, true)[m
[31m-[m
[31m-        if prefix_len > 0 then[m
[31m-            ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                     prefix_len)[m
[31m-            dst_pos = dst_pos + prefix_len[m
[31m-        end[m
[31m-[m
[31m-        if bit_len > 0 then[m
[31m-            ffi_copy(dst_pos, bit, bit_len)[m
[31m-            dst_pos = dst_pos + bit_len[m
[31m-        end[m
[31m-[m
[31m-        cp_pos = compiled.captures[1][m
[31m-        pos = cp_pos[m
[31m-        if pos == compiled.captures[0] then[m
[31m-            pos = pos + 1[m
[31m-            if pos > subj_len then[m
[31m-                break[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if not global then[m
[31m-            break[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if not compile_once then[m
[31m-        destroy_compiled_regex(compiled)[m
[31m-    end[m
[31m-[m
[31m-    if count > 0 then[m
[31m-        if pos < subj_len then[m
[31m-            local suffix_len = subj_len - cp_pos[m
[31m-[m
[31m-            local new_dst_len = dst_len + suffix_len[m
[31m-            dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-                check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                               new_dst_len, true)[m
[31m-[m
[31m-            ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                     suffix_len)[m
[31m-        end[m
[31m-        return ffi_string(dst_buf, dst_len), count[m
[31m-    end[m
[31m-[m
[31m-    return subj, 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_sub_str_helper(subj, regex, replace, opts, global)[m
[31m-    local compiled, compile_once, flags =[m
[31m-                                    re_sub_compile(regex, opts, replace, nil)[m
[31m-    if not compiled then[m
[31m-        -- error string is in compile_once[m
[31m-        return nil, nil, compile_once[m
[31m-    end[m
[31m-[m
[31m-    -- exec the compiled regex[m
[31m-[m
[31m-    subj = tostring(subj)[m
[31m-    local subj_len = #subj[m
[31m-    local count = 0[m
[31m-    local pos = 0[m
[31m-    local cp_pos = 0[m
[31m-[m
[31m-    local dst_buf_size = get_string_buf_size()[m
[31m-    local dst_buf = get_string_buf(dst_buf_size)[m
[31m-    local dst_pos = dst_buf[m
[31m-    local dst_len = 0[m
[31m-[m
[31m-    while true do[m
[31m-        local rc = C.ngx_http_lua_ffi_exec_regex(compiled, flags, subj,[m
[31m-                                                 subj_len, pos)[m
[31m-        if rc == PCRE_ERROR_NOMATCH then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        if rc < 0 then[m
[31m-            if not compile_once then[m
[31m-                destroy_compiled_regex(compiled)[m
[31m-            end[m
[31m-            return nil, nil, "pcre_exec() failed: " .. rc[m
[31m-        end[m
[31m-[m
[31m-        if rc == 0 then[m
[31m-            if band(flags, FLAG_DFA) == 0 then[m
[31m-                if not compile_once then[m
[31m-                    destroy_compiled_regex(compiled)[m
[31m-                end[m
[31m-                return nil, nil, "capture size too small"[m
[31m-            end[m
[31m-[m
[31m-            rc = 1[m
[31m-        end[m
[31m-[m
[31m-        count = count + 1[m
[31m-        local prefix_len = compiled.captures[0] - cp_pos[m
[31m-[m
[31m-        local cv = compiled.replace[m
[31m-        if cv.lengths ~= nil then[m
[31m-            local e = new_script_engine(subj, compiled, rc)[m
[31m-            if e == nil then[m
[31m-                return nil, nil, "failed to create script engine"[m
[31m-            end[m
[31m-[m
[31m-            local bit_len = C.ngx_http_lua_ffi_script_eval_len(e, cv)[m
[31m-            local new_dst_len = dst_len + prefix_len + bit_len[m
[31m-            dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-                check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                               new_dst_len)[m
[31m-[m
[31m-            if prefix_len > 0 then[m
[31m-                ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                         prefix_len)[m
[31m-                dst_pos = dst_pos + prefix_len[m
[31m-            end[m
[31m-[m
[31m-            if bit_len > 0 then[m
[31m-                C.ngx_http_lua_ffi_script_eval_data(e, cv, dst_pos)[m
[31m-                dst_pos = dst_pos + bit_len[m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            local bit_len = cv.value.len[m
[31m-[m
[31m-            dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-                check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                               dst_len + prefix_len + bit_len)[m
[31m-[m
[31m-            if prefix_len > 0 then[m
[31m-                ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                         prefix_len)[m
[31m-                dst_pos = dst_pos + prefix_len[m
[31m-            end[m
[31m-[m
[31m-            if bit_len > 0 then[m
[31m-                ffi_copy(dst_pos, cv.value.data, bit_len)[m
[31m-                dst_pos = dst_pos + bit_len[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        cp_pos = compiled.captures[1][m
[31m-        pos = cp_pos[m
[31m-        if pos == compiled.captures[0] then[m
[31m-            pos = pos + 1[m
[31m-            if pos > subj_len then[m
[31m-                break[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if not global then[m
[31m-            break[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if not compile_once then[m
[31m-        destroy_compiled_regex(compiled)[m
[31m-    end[m
[31m-[m
[31m-    if count > 0 then[m
[31m-        if pos < subj_len then[m
[31m-            local suffix_len = subj_len - cp_pos[m
[31m-[m
[31m-            local new_dst_len = dst_len + suffix_len[m
[31m-            dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-                check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                               new_dst_len)[m
[31m-[m
[31m-            ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                     suffix_len)[m
[31m-        end[m
[31m-        return ffi_string(dst_buf, dst_len), count[m
[31m-    end[m
[31m-[m
[31m-    return subj, 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_sub_helper(subj, regex, replace, opts, global)[m
[31m-    local repl_type = type(replace)[m
[31m-    if repl_type == "function" then[m
[31m-        return re_sub_func_helper(subj, regex, replace, opts, global)[m
[31m-    end[m
[31m-[m
[31m-    if repl_type ~= "string" then[m
[31m-        replace = tostring(replace)[m
[31m-    end[m
[31m-[m
[31m-    return re_sub_str_helper(subj, regex, replace, opts, global)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.re.sub(subj, regex, replace, opts)[m
[31m-    return re_sub_helper(subj, regex, replace, opts, false)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.re.gsub(subj, regex, replace, opts)[m
[31m-    return re_sub_helper(subj, regex, replace, opts, true)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/request.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/request.lua[m
[1mdeleted file mode 100644[m
[1mindex c737366..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/request.lua[m
[1m+++ /dev/null[m
[36m@@ -1,351 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local new_tab = base.new_tab[m
[31m-local C = ffi.C[m
[31m-local ffi_cast = ffi.cast[m
[31m-local ffi_str = ffi.string[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local setmetatable = setmetatable[m
[31m-local gsub = ngx.re.gsub[m
[31m-local lower = string.lower[m
[31m-local rawget = rawget[m
[31m-local ngx = ngx[m
[31m-local getfenv = getfenv[m
[31m-local type = type[m
[31m-local error = error[m
[31m-local tostring = tostring[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    typedef struct {[m
[31m-        ngx_http_lua_ffi_str_t   key;[m
[31m-        ngx_http_lua_ffi_str_t   value;[m
[31m-    } ngx_http_lua_ffi_table_elt_t;[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_headers_count(ngx_http_request_t *r,[m
[31m-        int max);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_headers(ngx_http_request_t *r,[m
[31m-        ngx_http_lua_ffi_table_elt_t *out, int count, int raw);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_uri_args_count(ngx_http_request_t *r,[m
[31m-        int max);[m
[31m-[m
[31m-    size_t ngx_http_lua_ffi_req_get_querystring_len(ngx_http_request_t *r);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_uri_args(ngx_http_request_t *r,[m
[31m-        unsigned char *buf, ngx_http_lua_ffi_table_elt_t *out, int count);[m
[31m-[m
[31m-    double ngx_http_lua_ffi_req_start_time(ngx_http_request_t *r);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_method(ngx_http_request_t *r);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_method_name(ngx_http_request_t *r,[m
[31m-        char *name, size_t *len);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_set_method(ngx_http_request_t *r, int method);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_header_set_single_value(ngx_http_request_t *r,[m
[31m-        const unsigned char *key, size_t key_len, const unsigned char *value,[m
[31m-        size_t value_len);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local table_elt_type = ffi.typeof("ngx_http_lua_ffi_table_elt_t*")[m
[31m-local table_elt_size = ffi.sizeof("ngx_http_lua_ffi_table_elt_t")[m
[31m-local req_headers_mt = {[m
[31m-    __index = function (tb, key)[m
[31m-        return rawget(tb, (gsub(lower(key), '_', '-', "jo")))[m
[31m-    end[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx.req.get_headers(max_headers, raw)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if not max_headers then[m
[31m-        max_headers = -1[m
[31m-    end[m
[31m-[m
[31m-    if not raw then[m
[31m-        raw = 0[m
[31m-    else[m
[31m-        raw = 1[m
[31m-    end[m
[31m-[m
[31m-    local n = C.ngx_http_lua_ffi_req_get_headers_count(r, max_headers)[m
[31m-    if n == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    if n == 0 then[m
[31m-        return {}[m
[31m-    end[m
[31m-[m
[31m-    local raw_buf = get_string_buf(n * table_elt_size)[m
[31m-    local buf = ffi_cast(table_elt_type, raw_buf)[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_req_get_headers(r, buf, n, raw)[m
[31m-    if rc == 0 then[m
[31m-        local headers = new_tab(0, n)[m
[31m-        for i = 0, n - 1 do[m
[31m-            local h = buf[i][m
[31m-[m
[31m-            local key = h.key[m
[31m-            key = ffi_str(key.data, key.len)[m
[31m-[m
[31m-            local value = h.value[m
[31m-            value = ffi_str(value.data, value.len)[m
[31m-[m
[31m-            local existing = headers[key][m
[31m-            if existing then[m
[31m-                if type(existing) == "table" then[m
[31m-                    existing[#existing + 1] = value[m
[31m-                else[m
[31m-                    headers[key] = {existing, value}[m
[31m-                end[m
[31m-[m
[31m-            else[m
[31m-                headers[key] = value[m
[31m-            end[m
[31m-        end[m
[31m-        if raw == 0 then[m
[31m-            return setmetatable(headers, req_headers_mt)[m
[31m-        end[m
[31m-        return headers[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.req.get_uri_args(max_args)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if not max_args then[m
[31m-        max_args = -1[m
[31m-    end[m
[31m-[m
[31m-    local n = C.ngx_http_lua_ffi_req_get_uri_args_count(r, max_args)[m
[31m-    if n == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    if n == 0 then[m
[31m-        return {}[m
[31m-    end[m
[31m-[m
[31m-    local args_len = C.ngx_http_lua_ffi_req_get_querystring_len(r)[m
[31m-[m
[31m-    local strbuf = get_string_buf(args_len + n * table_elt_size)[m
[31m-    local kvbuf = ffi_cast(table_elt_type, strbuf + args_len)[m
[31m-[m
[31m-    local nargs = C.ngx_http_lua_ffi_req_get_uri_args(r, strbuf, kvbuf, n)[m
[31m-[m
[31m-    local args = new_tab(0, nargs)[m
[31m-    for i = 0, nargs - 1 do[m
[31m-        local arg = kvbuf[i][m
[31m-[m
[31m-        local key = arg.key[m
[31m-        key = ffi_str(key.data, key.len)[m
[31m-[m
[31m-        local value = arg.value[m
[31m-        local len = value.len[m
[31m-        if len == -1 then[m
[31m-            value = true[m
[31m-        else[m
[31m-            value = ffi_str(value.data, len)[m
[31m-        end[m
[31m-[m
[31m-        local existing = args[key][m
[31m-        if existing then[m
[31m-            if type(existing) == "table" then[m
[31m-                existing[#existing + 1] = value[m
[31m-            else[m
[31m-                args[key] = {existing, value}[m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            args[key] = value[m
[31m-        end[m
[31m-    end[m
[31m-    return args[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.req.start_time()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    return tonumber(C.ngx_http_lua_ffi_req_start_time(r))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-do[m
[31m-    local methods = {[m
[31m-        [0x0002] = "GET",[m
[31m-        [0x0004] = "HEAD",[m
[31m-        [0x0008] = "POST",[m
[31m-        [0x0010] = "PUT",[m
[31m-        [0x0020] = "DELETE",[m
[31m-        [0x0040] = "MKCOL",[m
[31m-        [0x0080] = "COPY",[m
[31m-        [0x0100] = "MOVE",[m
[31m-        [0x0200] = "OPTIONS",[m
[31m-        [0x0400] = "PROPFIND",[m
[31m-        [0x0800] = "PROPPATCH",[m
[31m-        [0x1000] = "LOCK",[m
[31m-        [0x2000] = "UNLOCK",[m
[31m-        [0x4000] = "PATCH",[m
[31m-        [0x8000] = "TRACE",[m
[31m-    }[m
[31m-[m
[31m-    function ngx.req.get_method()[m
[31m-        local r = getfenv(0).__ngx_req[m
[31m-        if not r then[m
[31m-            return error("no request found")[m
[31m-        end[m
[31m-[m
[31m-        do[m
[31m-            local id = C.ngx_http_lua_ffi_req_get_method(r)[m
[31m-            if id == FFI_BAD_CONTEXT then[m
[31m-                return error("API disabled in the current context")[m
[31m-            end[m
[31m-[m
[31m-            local method = methods[id][m
[31m-            if method then[m
[31m-                return method[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local buf = get_string_buf(32)[m
[31m-        local sizep = get_size_ptr()[m
[31m-        sizep[0] = 32[m
[31m-[m
[31m-        local rc = C.ngx_http_lua_ffi_req_get_method_name(r, buf, sizep)[m
[31m-        if rc ~= 0 then[m
[31m-            return nil[m
[31m-        end[m
[31m-[m
[31m-        return ffi_str(buf, sizep[0])[m
[31m-    end[m
[31m-end  -- do[m
[31m-[m
[31m-[m
[31m-function ngx.req.set_method(method)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(method) ~= "number" then[m
[31m-        return error("bad method number")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_req_set_method(r, method)[m
[31m-    if rc == FFI_OK then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_DECLINED then[m
[31m-        return error("unsupported HTTP method: " .. method)[m
[31m-    end[m
[31m-[m
[31m-    return error("unknown error: " .. rc)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-do[m
[31m-    local orig_func = ngx.req.set_header[m
[31m-[m
[31m-    function ngx.req.set_header(name, value)[m
[31m-        if type(value) == "table" then[m
[31m-            return orig_func(name, value)[m
[31m-        end[m
[31m-[m
[31m-        local r = getfenv(0).__ngx_req[m
[31m-        if not r then[m
[31m-            return error("no request found")[m
[31m-        end[m
[31m-[m
[31m-        if type(name) ~= "string" then[m
[31m-            name = tostring(name)[m
[31m-        end[m
[31m-[m
[31m-        local rc[m
[31m-        if not value then[m
[31m-            rc = C.ngx_http_lua_ffi_req_header_set_single_value(r, name,[m
[31m-                                                         #name, nil, 0)[m
[31m-[m
[31m-        else[m
[31m-            if type(value) ~= "string" then[m
[31m-                value = tostring(value)[m
[31m-            end[m
[31m-[m
[31m-            rc = C.ngx_http_lua_ffi_req_header_set_single_value(r, name,[m
[31m-                                                         #name, value, #value)[m
[31m-        end[m
[31m-[m
[31m-        if rc == FFI_OK or rc == FFI_DECLINED then[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        if rc == FFI_BAD_CONTEXT then[m
[31m-            return error("API disabled in the current context")[m
[31m-        end[m
[31m-[m
[31m-        return error("error")[m
[31m-    end[m
[31m-end  -- do[m
[31m-[m
[31m-[m
[31m-function ngx.req.clear_header(name)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(name) ~= "string" then[m
[31m-        name = tostring(name)[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_req_header_set_single_value(r, name, #name,[m
[31m-                                                                       nil, 0)[m
[31m-[m
[31m-    if rc == FFI_OK or rc == FFI_DECLINED then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return error("error")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/response.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/response.lua[m
[1mdeleted file mode 100644[m
[1mindex 2944d75..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/response.lua[m
[1m+++ /dev/null[m
[36m@@ -1,165 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-local ffi_cast = ffi.cast[m
[31m-local ffi_str = ffi.string[m
[31m-local new_tab = base.new_tab[m
[31m-local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT[m
[31m-local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local getmetatable = getmetatable[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local getfenv = getfenv[m
[31m-local error = error[m
[31m-local ngx = ngx[m
[31m-[m
[31m-[m
[31m-local MAX_HEADER_VALUES = 100[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-local ffi_str_type = ffi.typeof("ngx_http_lua_ffi_str_t*")[m
[31m-local ffi_str_size = ffi.sizeof("ngx_http_lua_ffi_str_t")[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r,[m
[31m-        const char *key_data, size_t key_len, int is_nil,[m
[31m-        const char *sval, size_t sval_len, ngx_http_lua_ffi_str_t *mvals,[m
[31m-        size_t mvals_len, char **errmsg);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_get_resp_header(ngx_http_request_t *r,[m
[31m-        const unsigned char *key, size_t key_len,[m
[31m-        unsigned char *key_buf, ngx_http_lua_ffi_str_t *values,[m
[31m-        int max_nvalues);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local function set_resp_header(tb, key, value)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local rc[m
[31m-    if value == nil then[m
[31m-        rc = C.ngx_http_lua_ffi_set_resp_header(r, key, #key, true, nil, 0,[m
[31m-                                                nil, 0, errmsg)[m
[31m-    else[m
[31m-        local sval, sval_len, mvals, mvals_len, buf[m
[31m-[m
[31m-        if type(value) == "table" then[m
[31m-            mvals_len = #value[m
[31m-            buf = get_string_buf(ffi_str_size * mvals_len)[m
[31m-            mvals = ffi_cast(ffi_str_type, buf)[m
[31m-            for i = 1, mvals_len do[m
[31m-                local s = value[i][m
[31m-                if type(s) ~= "string" then[m
[31m-                    s = tostring(s)[m
[31m-                    value[i] = s[m
[31m-                end[m
[31m-                local str = mvals[i - 1][m
[31m-                str.data = s[m
[31m-                str.len = #s[m
[31m-            end[m
[31m-[m
[31m-            sval_len = 0[m
[31m-[m
[31m-        else[m
[31m-            if type(value) ~= "string" then[m
[31m-                sval = tostring(value)[m
[31m-            else[m
[31m-                sval = value[m
[31m-            end[m
[31m-            sval_len = #sval[m
[31m-[m
[31m-            mvals_len = 0[m
[31m-        end[m
[31m-[m
[31m-        rc = C.ngx_http_lua_ffi_set_resp_header(r, key, #key, false, sval,[m
[31m-                                                sval_len, mvals, mvals_len,[m
[31m-                                                errmsg)[m
[31m-    end[m
[31m-[m
[31m-    if rc == 0 or rc == FFI_DECLINED then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_NO_REQ_CTX then[m
[31m-        return error("no request ctx found")[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    -- rc == FFI_ERROR[m
[31m-    return error(ffi_str(errmsg[0]))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function get_resp_header(tb, key)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-[m
[31m-    local key_buf = get_string_buf(key_len + ffi_str_size * MAX_HEADER_VALUES)[m
[31m-    local values = ffi_cast(ffi_str_type, key_buf + key_len)[m
[31m-    local n = C.ngx_http_lua_ffi_get_resp_header(r, key, key_len, key_buf,[m
[31m-                                                 values, MAX_HEADER_VALUES)[m
[31m-[m
[31m-    -- print("retval: ", n)[m
[31m-[m
[31m-    if n == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    if n == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if n == 1 then[m
[31m-        local v = values[0][m
[31m-        return ffi_str(v.data, v.len)[m
[31m-    end[m
[31m-[m
[31m-    if n > 0 then[m
[31m-        local ret = new_tab(n, 0)[m
[31m-        for i = 1, n do[m
[31m-            local v = values[i - 1][m
[31m-            ret[i] = ffi_str(v.data, v.len)[m
[31m-        end[m
[31m-        return ret[m
[31m-    end[m
[31m-[m
[31m-    -- n == FFI_ERROR[m
[31m-    return error("no memory")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-do[m
[31m-    local mt = getmetatable(ngx.header)[m
[31m-    mt.__newindex = set_resp_header[m
[31m-    mt.__index = get_resp_header[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/shdict.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/shdict.lua[m
[1mdeleted file mode 100644[m
[1mindex 5ae98ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/shdict.lua[m
[1m+++ /dev/null[m
[36m@@ -1,382 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_string_buf_size = base.get_string_buf_size[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local tonumber = tonumber[m
[31m-local tostring = tostring[m
[31m-local next = next[m
[31m-local type = type[m
[31m-local error = error[m
[31m-local ngx_shared = ngx.shared[m
[31m-local getmetatable = getmetatable[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_shdict_get(void *zone, const unsigned char *key,[m
[31m-        size_t key_len, int *value_type, unsigned char **str_value_buf,[m
[31m-        size_t *str_value_len, double *num_value, int *user_flags,[m
[31m-        int get_stale, int *is_stale);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_shdict_incr(void *zone, const unsigned char *key,[m
[31m-        size_t key_len, double *value, char **err);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_shdict_store(void *zone, int op,[m
[31m-        const unsigned char *key, size_t key_len, int value_type,[m
[31m-        const unsigned char *str_value_buf, size_t str_value_len,[m
[31m-        double num_value, int exptime, int user_flags, char **errmsg,[m
[31m-        int *forcible);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_shdict_flush_all(void *zone);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-if not pcall(function () return C.free end) then[m
[31m-    ffi.cdef[[[m
[31m-        void free(void *ptr);[m
[31m-    ]][m
[31m-end[m
[31m-[m
[31m-[m
[31m-local value_type = ffi_new("int[1]")[m
[31m-local user_flags = ffi_new("int[1]")[m
[31m-local num_value = ffi_new("double[1]")[m
[31m-local is_stale = ffi_new("int[1]")[m
[31m-local forcible = ffi_new("int[1]")[m
[31m-local str_value_buf = ffi_new("unsigned char *[1]")[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-[m
[31m-[m
[31m-local function check_zone(zone)[m
[31m-    if not zone or type(zone) ~= "table" then[m
[31m-        return error("bad \"zone\" argument")[m
[31m-    end[m
[31m-[m
[31m-    zone = zone[1][m
[31m-    if type(zone) ~= "userdata" then[m
[31m-        return error("bad \"zone\" argument")[m
[31m-    end[m
[31m-[m
[31m-    return zone[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_store(zone, op, key, value, exptime, flags)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    if not exptime then[m
[31m-        exptime = 0[m
[31m-    elseif exptime < 0 then[m
[31m-        return error('bad "exptime" argument')[m
[31m-    end[m
[31m-[m
[31m-    if not flags then[m
[31m-        flags = 0[m
[31m-    end[m
[31m-[m
[31m-    if key == nil then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-    if key_len == 0 then[m
[31m-        return nil, "empty key"[m
[31m-    end[m
[31m-    if key_len > 65535 then[m
[31m-        return nil, "key too long"[m
[31m-    end[m
[31m-[m
[31m-    local str_value_buf[m
[31m-    local str_value_len = 0[m
[31m-    local num_value = 0[m
[31m-    local valtyp = type(value)[m
[31m-[m
[31m-    -- print("value type: ", valtyp)[m
[31m-    -- print("exptime: ", exptime)[m
[31m-[m
[31m-    if valtyp == "string" then[m
[31m-        valtyp = 4  -- LUA_TSTRING[m
[31m-        str_value_buf = value[m
[31m-        str_value_len = #value[m
[31m-[m
[31m-    elseif valtyp == "number" then[m
[31m-        valtyp = 3  -- LUA_TNUMBER[m
[31m-        num_value = value[m
[31m-[m
[31m-    elseif value == nil then[m
[31m-        valtyp = 0  -- LUA_TNIL[m
[31m-[m
[31m-    elseif valtyp == "boolean" then[m
[31m-        valtyp = 1  -- LUA_TBOOLEAN[m
[31m-        num_value = value and 1 or 0[m
[31m-[m
[31m-    else[m
[31m-        return nil, "bad value type"[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_shdict_store(zone, op, key, key_len,[m
[31m-                                               valtyp, str_value_buf,[m
[31m-                                               str_value_len, num_value,[m
[31m-                                               exptime * 1000, flags, errmsg,[m
[31m-                                               forcible)[m
[31m-[m
[31m-    -- print("rc == ", rc)[m
[31m-[m
[31m-    if rc == 0 then  -- NGX_OK[m
[31m-        return true, nil, forcible[0] == 1[m
[31m-    end[m
[31m-[m
[31m-    -- NGX_DECLINED or NGX_ERROR[m
[31m-    return false, ffi_str(errmsg[0]), forcible[0] == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_set(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_safe_set(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0x0004, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_add(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0x0001, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_safe_add(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0x0005, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_replace(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0x0002, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_delete(zone, key)[m
[31m-    return shdict_set(zone, key, nil)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_get(zone, key)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    if key == nil then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-    if key_len == 0 then[m
[31m-        return nil, "empty key"[m
[31m-    end[m
[31m-    if key_len > 65535 then[m
[31m-        return nil, "key too long"[m
[31m-    end[m
[31m-[m
[31m-    local size = get_string_buf_size()[m
[31m-    local buf = get_string_buf(size)[m
[31m-    str_value_buf[0] = buf[m
[31m-    local value_len = get_size_ptr()[m
[31m-    value_len[0] = size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_shdict_get(zone, key, key_len, value_type,[m
[31m-                                             str_value_buf, value_len,[m
[31m-                                             num_value, user_flags, 0,[m
[31m-                                             is_stale)[m
[31m-    if rc ~= 0 then[m
[31m-        return error("failed to get the key")[m
[31m-    end[m
[31m-[m
[31m-    local typ = value_type[0][m
[31m-[m
[31m-    if typ == 0 then -- LUA_TNIL[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    local flags = tonumber(user_flags[0])[m
[31m-[m
[31m-    local val[m
[31m-[m
[31m-    if typ == 4 then -- LUA_TSTRING[m
[31m-        if str_value_buf[0] ~= buf then[m
[31m-            -- ngx.say("len: ", tonumber(value_len[0]))[m
[31m-            buf = str_value_buf[0][m
[31m-            val = ffi_str(buf, value_len[0])[m
[31m-            C.free(buf)[m
[31m-        else[m
[31m-            val = ffi_str(buf, value_len[0])[m
[31m-        end[m
[31m-[m
[31m-    elseif typ == 3 then -- LUA_TNUMBER[m
[31m-        val = tonumber(num_value[0])[m
[31m-[m
[31m-    elseif typ == 1 then -- LUA_TBOOLEAN[m
[31m-        val = (tonumber(buf[0]) ~= 0)[m
[31m-[m
[31m-    else[m
[31m-        return error("unknown value type: " .. typ)[m
[31m-    end[m
[31m-[m
[31m-    if flags ~= 0 then[m
[31m-        return val, flags[m
[31m-    end[m
[31m-[m
[31m-    return val[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_get_stale(zone, key)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    if key == nil then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-    if key_len == 0 then[m
[31m-        return nil, "empty key"[m
[31m-    end[m
[31m-    if key_len > 65535 then[m
[31m-        return nil, "key too long"[m
[31m-    end[m
[31m-[m
[31m-    local size = get_string_buf_size()[m
[31m-    local buf = get_string_buf(size)[m
[31m-    str_value_buf[0] = buf[m
[31m-    local value_len = get_size_ptr()[m
[31m-    value_len[0] = size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_shdict_get(zone, key, key_len, value_type,[m
[31m-                                             str_value_buf, value_len,[m
[31m-                                             num_value, user_flags, 1,[m
[31m-                                             is_stale)[m
[31m-    if rc ~= 0 then[m
[31m-        return error("failed to get the key")[m
[31m-    end[m
[31m-[m
[31m-    local typ = value_type[0][m
[31m-[m
[31m-    if typ == 0 then -- LUA_TNIL[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    local flags = tonumber(user_flags[0])[m
[31m-    local val[m
[31m-[m
[31m-    if typ == 4 then -- LUA_TSTRING[m
[31m-        if str_value_buf[0] ~= buf then[m
[31m-            -- ngx.say("len: ", tonumber(value_len[0]))[m
[31m-            buf = str_value_buf[0][m
[31m-            val = ffi_str(buf, value_len[0])[m
[31m-            C.free(buf)[m
[31m-        else[m
[31m-            val = ffi_str(buf, value_len[0])[m
[31m-        end[m
[31m-[m
[31m-    elseif typ == 3 then -- LUA_TNUMBER[m
[31m-        val = tonumber(num_value[0])[m
[31m-[m
[31m-    elseif typ == 1 then -- LUA_TBOOLEAN[m
[31m-        val = (tonumber(buf[0]) ~= 0)[m
[31m-[m
[31m-    else[m
[31m-        return error("unknown value type: " .. typ)[m
[31m-    end[m
[31m-[m
[31m-    if flags ~= 0 then[m
[31m-        return val, flags, is_stale[0] == 1[m
[31m-    end[m
[31m-[m
[31m-    return val, nil, is_stale[0] == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_incr(zone, key, value)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    if key == nil then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-    if key_len == 0 then[m
[31m-        return nil, "empty key"[m
[31m-    end[m
[31m-    if key_len > 65535 then[m
[31m-        return nil, "key too long"[m
[31m-    end[m
[31m-[m
[31m-    if type(value) ~= "number" then[m
[31m-        value = tonumber(value)[m
[31m-    end[m
[31m-    num_value[0] = value[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_shdict_incr(zone, key, key_len, num_value,[m
[31m-                                             errmsg)[m
[31m-    if rc ~= 0 then  -- ~= NGX_OK[m
[31m-        return nil, ffi_str(errmsg[0])[m
[31m-    end[m
[31m-[m
[31m-    return tonumber(num_value[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_flush_all(zone)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    C.ngx_http_lua_ffi_shdict_flush_all(zone)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if ngx_shared then[m
[31m-    local name, dict = next(ngx_shared, nil)[m
[31m-    if dict then[m
[31m-        local mt = getmetatable(dict)[m
[31m-        if mt then[m
[31m-            mt = mt.__index[m
[31m-            if mt then[m
[31m-                mt.get = shdict_get[m
[31m-                mt.get_stale = shdict_get_stale[m
[31m-                mt.incr = shdict_incr[m
[31m-                mt.set = shdict_set[m
[31m-                mt.safe_set = shdict_safe_set[m
[31m-                mt.add = shdict_add[m
[31m-                mt.safe_add = shdict_safe_add[m
[31m-                mt.replace = shdict_replace[m
[31m-                mt.delete = shdict_delete[m
[31m-                mt.flush_all = shdict_flush_all[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/time.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/time.lua[m
[1mdeleted file mode 100644[m
[1mindex 6e45512..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/time.lua[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local tonumber = tonumber[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-double ngx_http_lua_ffi_now(void);[m
[31m-long ngx_http_lua_ffi_time(void);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-function ngx.now()[m
[31m-    return tonumber(C.ngx_http_lua_ffi_now())[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.time()[m
[31m-    return tonumber(C.ngx_http_lua_ffi_time())[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/uri.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/uri.lua[m
[1mdeleted file mode 100644[m
[1mindex af0e655..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/uri.lua[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local ffi_string = ffi.string[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local base = require "resty.core.base"[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    size_t ngx_http_lua_ffi_uri_escaped_length(const unsigned char *src,[m
[31m-                                               size_t len);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_escape_uri(const unsigned char *src, size_t len,[m
[31m-                                     unsigned char *dst);[m
[31m-[m
[31m-    size_t ngx_http_lua_ffi_unescape_uri(const unsigned char *src,[m
[31m-                                         size_t len, unsigned char *dst);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-ngx.escape_uri = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    local slen = #s[m
[31m-    local dlen = C.ngx_http_lua_ffi_uri_escaped_length(s, slen)[m
[31m-    -- print("dlen: ", tonumber(dlen))[m
[31m-    if dlen == slen then[m
[31m-        return s[m
[31m-    end[m
[31m-    local dst = get_string_buf(dlen)[m
[31m-    C.ngx_http_lua_ffi_escape_uri(s, slen, dst)[m
[31m-    return ffi_string(dst, dlen)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-ngx.unescape_uri = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    local slen = #s[m
[31m-    local dlen = slen[m
[31m-    local dst = get_string_buf(dlen)[m
[31m-    dlen = C.ngx_http_lua_ffi_unescape_uri(s, slen, dst)[m
[31m-    return ffi_string(dst, dlen)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version,[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/var.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/var.lua[m
[1mdeleted file mode 100644[m
[1mindex 3fda66a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/var.lua[m
[1m+++ /dev/null[m
[36m@@ -1,127 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local type = type[m
[31m-local getfenv = getfenv[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local error = error[m
[31m-local tostring = tostring[m
[31m-local ngx_var = ngx.var[m
[31m-local getmetatable = getmetatable[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_var_get(ngx_http_request_t *r,[m
[31m-        const char *name_data, size_t name_len, char *lowcase_buf,[m
[31m-        int capture_id, char **value, size_t *value_len, char **err);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_var_set(ngx_http_request_t *r,[m
[31m-        const unsigned char *name_data, size_t name_len,[m
[31m-        unsigned char *lowcase_buf, const unsigned char *value,[m
[31m-        size_t value_len, unsigned char *errbuf, size_t errlen);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local value_ptr = ffi_new("unsigned char *[1]")[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-[m
[31m-[m
[31m-local function var_get(self, name)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local value_len = get_size_ptr()[m
[31m-    local rc[m
[31m-    if type(name) == "number" then[m
[31m-        rc = C.ngx_http_lua_ffi_var_get(r, nil, 0, nil, name, value_ptr,[m
[31m-                                        value_len, errmsg)[m
[31m-[m
[31m-    else[m
[31m-        if type(name) ~= "string" then[m
[31m-            return error("bad variable name")[m
[31m-        end[m
[31m-[m
[31m-        local name_len = #name[m
[31m-        local lowcase_buf = get_string_buf(name_len)[m
[31m-[m
[31m-        rc = C.ngx_http_lua_ffi_var_get(r, name, name_len, lowcase_buf, 0,[m
[31m-                                        value_ptr, value_len, errmsg)[m
[31m-    end[m
[31m-[m
[31m-    -- ngx.log(ngx.WARN, "rc = ", rc)[m
[31m-[m
[31m-    if rc == 0 then -- NGX_OK[m
[31m-        return ffi_str(value_ptr[0], value_len[0])[m
[31m-    end[m
[31m-[m
[31m-    if rc == -5 then  -- NGX_DECLINED[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if rc == -1 then  -- NGX_ERROR[m
[31m-        return error(ffi_str(errmsg[0]))[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function var_set(self, name, value)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(name) ~= "string" then[m
[31m-        return error("bad variable name")[m
[31m-    end[m
[31m-    local name_len = #name[m
[31m-[m
[31m-    local errlen = 256[m
[31m-    local lowcase_buf = get_string_buf(name_len + errlen)[m
[31m-[m
[31m-    local value_len[m
[31m-    if value == nil then[m
[31m-        value_len = 0[m
[31m-    else[m
[31m-        if type(value) ~= 'string' then[m
[31m-            value = tostring(value)[m
[31m-        end[m
[31m-        value_len = #value[m
[31m-    end[m
[31m-[m
[31m-    local errbuf = lowcase_buf + name_len[m
[31m-    local rc = C.ngx_http_lua_ffi_var_set(r, name, name_len, lowcase_buf,[m
[31m-                                          value, value_len, errbuf, errlen)[m
[31m-[m
[31m-    -- ngx.log(ngx.WARN, "rc = ", rc)[m
[31m-[m
[31m-    if rc == 0 then -- NGX_OK[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if rc == -1 then  -- NGX_ERROR[m
[31m-        return error(ffi_str(errbuf, errlen))[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if ngx_var then[m
[31m-    local mt = getmetatable(ngx_var)[m
[31m-    if mt then[m
[31m-        mt.__index = var_get[m
[31m-        mt.__newindex = var_set[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/worker.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/worker.lua[m
[1mdeleted file mode 100644[m
[1mindex 1e9b096..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/lib/resty/core/worker.lua[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int ngx_http_lua_ffi_worker_pid(void);[m
[31m-int ngx_http_lua_ffi_worker_exiting(void);[m
[31m-int ngx_http_lua_ffi_worker_id(void);[m
[31m-int ngx_http_lua_ffi_worker_count(void);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-function ngx.worker.exiting()[m
[31m-    return C.ngx_http_lua_ffi_worker_exiting() ~= 0 and true or false[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.worker.pid()[m
[31m-    return C.ngx_http_lua_ffi_worker_pid()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.worker.id()[m
[31m-    local id = C.ngx_http_lua_ffi_worker_id()[m
[31m-    if id < 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return id[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.worker.count()[m
[31m-    return C.ngx_http_lua_ffi_worker_count()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    _VERSION = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/balancer.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/balancer.t[m
[1mdeleted file mode 100644[m
[1mindex aba3e04..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/balancer.t[m
[1m+++ /dev/null[m
[36m@@ -1,834 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_CWD} = cwd();[m
[31m-[m
[31m-#worker_connections(1024);[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set current peer (separate addr and port)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{connect\(\) failed .*?, upstream: "http://127\.0\.0\.3:12345/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set current peer & next upstream (3 tries)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr{connect\(\) failed .*, upstream: "http://.*?"}[m
[31m---- grep_error_log_out eval[m
[31m-qr#^(?:connect\(\) failed .*?, upstream: "http://127.0.0.3:12345/t"\n){3}$#[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set current peer & next upstream (no retries)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr{connect\(\) failed .*, upstream: "http://.*?"}[m
[31m---- grep_error_log_out eval[m
[31m-qr#^(?:connect\(\) failed .*?, upstream: "http://127.0.0.3:12345/t"\n){1}$#[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set current peer & next upstream (3 tries exceeding the limit)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 2;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr{connect\(\) failed .*, upstream: "http://.*?"}[m
[31m---- grep_error_log_out eval[m
[31m-qr#^(?:connect\(\) failed .*?, upstream: "http://127.0.0.3:12345/t"\n){2}$#[m
[31m---- error_log[m
[31m-set more tries: reduced tries due to limit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get last peer failure status (404)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            local state, status = b.get_last_failure()[m
[31m-            print("last peer failure: ", state, " ", status)[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.1", tonumber(ngx.var.server_port)))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- grep_error_log eval: qr{last peer failure: \S+ \S+}[m
[31m---- grep_error_log_out[m
[31m-last peer failure: nil nil[m
[31m-last peer failure: next 404[m
[31m-last peer failure: next 404[m
[31m-[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: get last peer failure status (500)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            local state, status = b.get_last_failure()[m
[31m-            print("last peer failure: ", state, " ", status)[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.1", tonumber(ngx.var.server_port)))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- grep_error_log eval: qr{last peer failure: \S+ \S+}[m
[31m---- grep_error_log_out[m
[31m-last peer failure: nil nil[m
[31m-last peer failure: failed 500[m
[31m-last peer failure: failed 500[m
[31m-[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get last peer failure status (503)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            local state, status = b.get_last_failure()[m
[31m-            print("last peer failure: ", state, " ", status)[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.1", tonumber(ngx.var.server_port)))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 503;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 503 Service Temporarily Unavailable[m
[31m---- error_code: 503[m
[31m---- grep_error_log eval: qr{last peer failure: \S+ \S+}[m
[31m---- grep_error_log_out[m
[31m-last peer failure: nil nil[m
[31m-last peer failure: failed 502[m
[31m-last peer failure: failed 502[m
[31m-[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: get last peer failure status (connect failed)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            local state, status = b.get_last_failure()[m
[31m-            print("last peer failure: ", state, " ", status)[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr{last peer failure: \S+ \S+}[m
[31m---- grep_error_log_out[m
[31m-last peer failure: nil nil[m
[31m-last peer failure: failed 502[m
[31m-last peer failure: failed 502[m
[31m-[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set current peer (port embedded in addr)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            assert(b.set_current_peer("127.0.0.3:12345"))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{connect\(\) failed .*?, upstream: "http://127\.0\.0\.3:12345/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: keepalive before balancer[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        keepalive 10;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            assert(b.set_current_peer("127.0.0.3:12345"))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- grep_error_log eval: qr/load balancing method redefined in/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"load balancing method redefined in[m
[31m-",[m
[31m-"",[m
[31m-][m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{connect\(\) failed .*?, upstream: "http://127\.0\.0\.3:12345/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: keepalive after balancer[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-            assert(b.set_current_peer("127.0.0.1", tonumber(ngx.var.server_port)))[m
[31m-        }[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local res0 = ngx.location.capture("/tt")[m
[31m-            local res1 = ngx.location.capture("/tt")[m
[31m-            local res2 = ngx.location.capture("/tt")[m
[31m-[m
[31m-            if res2.status == ngx.HTTP_OK then[m
[31m-                ngx.print(res2.body)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /tt {[m
[31m-        proxy_pass http://backend/back;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Connection "";[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "hello keepalive!";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-hello keepalive![m
[31m---- error_code: 200[m
[31m---- grep_error_log eval: qr{\S+ keepalive peer:.*?connection}[m
[31m---- grep_error_log_out eval[m
[31m-["free keepalive peer: saving connection[m
[31m-get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-",[m
[31m-"get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-",[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set_current_peer called in a wrong context[m
[31m---- wait: 0.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-    location = /fake {[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/fake;[m
[31m-[m
[31m-        log_by_lua_block {[m
[31m-            local balancer = require "ngx.balancer"[m
[31m-            local ok, err = balancer.set_current_peer("127.0.0.1", 1234)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to call: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.ALERT, "unexpected success")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? log_by_lua.*? failed to call: API disabled in the current context/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: get_last_failure called in a wrong context[m
[31m---- wait: 0.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-    location = /fake {[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/fake;[m
[31m-[m
[31m-        log_by_lua_block {[m
[31m-            local balancer = require "ngx.balancer"[m
[31m-            local state, status, err = balancer.get_last_failure()[m
[31m-            if not state and err then[m
[31m-                ngx.log(ngx.ERR, "failed to call: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.ALERT, "unexpected success")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? log_by_lua.*? failed to call: API disabled in the current context/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set_more_tries called in a wrong context[m
[31m---- wait: 0.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-    location = /fake {[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/fake;[m
[31m-[m
[31m-        log_by_lua_block {[m
[31m-            local balancer = require "ngx.balancer"[m
[31m-            local ok, err = balancer.set_more_tries(1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to call: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.ALERT, "unexpected success")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? log_by_lua.*? failed to call: API disabled in the current context/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: hot loop when proxy_upstream_next error is hit and keepalive is used.[m
[31m-github issue openresty/lua-nginx-module#693[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-            print("hello from balancer by lua!")[m
[31m-            assert(b.set_current_peer("127.0.0.1", $TEST_NGINX_SERVER_PORT))[m
[31m-        }[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite ^/t(.*) $1 break;[m
[31m-        proxy_pass http://backend;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Connection "";[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 200;[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        echo_location /t/back;[m
[31m-        echo_location /t/bad;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.exit(444)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- ignore_response[m
[31m---- grep_error_log eval: qr{hello from balancer by lua!}[m
[31m---- grep_error_log_out[m
[31m-hello from balancer by lua![m
[31m-hello from balancer by lua![m
[31m-hello from balancer by lua![m
[31m---- error_log eval[m
[31m-qr/\[error] .*? upstream prematurely closed connection while reading response header from upstream/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: https (keepalive)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-            print("hello from balancer by lua!")[m
[31m-            assert(b.set_current_peer("127.0.0.1", 1234))[m
[31m-        }[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        listen 1234 ssl;[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location = /back {[m
[31m-            return 200 "ok";[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        proxy_pass https://backend/back;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Connection "";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m---- response_body chomp[m
[31m-ok[m
[31m---- grep_error_log eval: qr{hello from balancer by lua!}[m
[31m---- grep_error_log_out[m
[31m-hello from balancer by lua![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: https (no keepalive)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-            print("hello from balancer by lua!")[m
[31m-            assert(b.set_current_peer("127.0.0.1", 1234))[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        listen 1234 ssl;[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location = /back {[m
[31m-            return 200 "ok";[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        proxy_pass https://backend/back;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Connection "";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m---- response_body chomp[m
[31m-ok[m
[31m---- grep_error_log eval: qr{hello from balancer by lua!}[m
[31m---- grep_error_log_out[m
[31m-hello from balancer by lua![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: test ngx.var.upstream_addr after using more than one set_current_peer[m
[31m---- wait: 0.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-    proxy_next_upstream_tries 3;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            local balancer = require "ngx.balancer"[m
[31m-            if ngx.ctx.tries == nil then[m
[31m-                balancer.set_more_tries(1)[m
[31m-                ngx.ctx.tries = 1[m
[31m-                balancer.set_current_peer("127.0.0.3", 12345)[m
[31m-            else[m
[31m-                balancer.set_current_peer("127.0.0.3", 12346)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-        log_by_lua_block {[m
[31m-            ngx.log(ngx.INFO, "ngx.var.upstream_addr is " .. ngx.var.upstream_addr)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log[m
[31m-[lua] log_by_lua(nginx.conf:59):2: ngx.var.upstream_addr is 127.0.0.3:12345, 127.0.0.3:12346[m
[31m---- no_error_log[m
[31m-[alert][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/chain.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/chain.der[m
[1mdeleted file mode 100644[m
[1mindex ee6d9ba..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/chain.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/chain.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/chain.pem[m
[1mdeleted file mode 100644[m
[1mindex 21b704f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/chain.pem[m
[1m+++ /dev/null[m
[36m@@ -1,172 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4100 (0x1004)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, O=OpenResty, CN=Signing-CA-2[m
[31m-        Validity[m
[31m-            Not Before: Sep 20 05:27:46 2014 GMT[m
[31m-            Not After : Aug 27 05:27:46 2114 GMT[m
[31m-        Subject: C=US, ST=California, O=OpenResty, CN=test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:d8:53:ac:ac:5c:3f:f9:80:a8:96:4b:b0:58:db:[m
[31m-                    5a:86:de:ca:30:02:d9:19:c8:f6:14:c5:40:c9:41:[m
[31m-                    eb:bb:7a:d1:e1:f9:96:3b:54:d5:e8:bf:ac:50:5a:[m
[31m-                    49:11:da:99:60:44:e0:25:68:40:36:7c:f6:ce:b4:[m
[31m-                    9c:b9:58:d6:ea:e7:44:98:63:eb:a2:72:f8:e9:69:[m
[31m-                    b4:4a:4d:68:86:41:ca:67:58:61:e6:70:e8:08:fe:[m
[31m-                    ad:c2:75:59:24:0e:f0:2f:1a:70:83:8c:a3:77:64:[m
[31m-                    e8:4d:d5:c5:28:62:a9:53:d1:a1:22:f5:36:43:a7:[m
[31m-                    46:00:aa:97:54:72:d4:72:47[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                1F:DB:C0:D9:3C:4B:77:A8:9A:AC:33:1F:7B:70:C4:CF:BA:C8:07:DD[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:39:77:77:A3:4E:92:8B:E2:25:20:72:64:35:0A:7A:87:A8:58:A9:F8[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         1e:cd:83:66:b1:db:ea:5c:37:7e:bc:31:44:52:72:03:ae:9b:[m
[31m-         44:20:2c:ad:00:20:a5:dc:cf:9d:c8:c8:8f:df:cf:24:26:9c:[m
[31m-         43:83:f4:d2:ff:eb:d9:e4:7d:25:cf:1f:b8:aa:63:58:03:b9:[m
[31m-         da:52:42:f8:fe:2e:71:cc:8f:de:26:34:cd:da:5c:7a:3b:64:[m
[31m-         07:18:27:a1:61:b6:58:32:96:10:97:f2:7f:00:c4:44:43:b7:[m
[31m-         9d:e2:31:69:4f:c2:95:c5:a3:32:d1:c0:00:c6:ef:58:b9:0f:[m
[31m-         e6:08:3a:0d:c9:c0:14:f7:26:8c:43:13:55:1b:93:71:72:c7:[m
[31m-         ad:2f[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICijCCAfOgAwIBAgICEAQwDQYJKoZIhvcNAQEFBQAwTTELMAkGA1UEBhMCVVMx[m
[31m-EzARBgNVBAgMCkNhbGlmb3JuaWExEjAQBgNVBAoMCU9wZW5SZXN0eTEVMBMGA1UE[m
[31m-AwwMU2lnbmluZy1DQS0yMCAXDTE0MDkyMDA1Mjc0NloYDzIxMTQwODI3MDUyNzQ2[m
[31m-WjBJMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTESMBAGA1UECgwJ[m
[31m-T3BlblJlc3R5MREwDwYDVQQDDAh0ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB[m
[31m-jQAwgYkCgYEA2FOsrFw/+YColkuwWNtaht7KMALZGcj2FMVAyUHru3rR4fmWO1TV[m
[31m-6L+sUFpJEdqZYETgJWhANnz2zrScuVjW6udEmGPronL46Wm0Sk1ohkHKZ1hh5nDo[m
[31m-CP6twnVZJA7wLxpwg4yjd2ToTdXFKGKpU9GhIvU2Q6dGAKqXVHLUckcCAwEAAaN7[m
[31m-MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQg[m
[31m-Q2VydGlmaWNhdGUwHQYDVR0OBBYEFB/bwNk8S3eomqwzH3twxM+6yAfdMB8GA1Ud[m
[31m-IwQYMBaAFDl3d6NOkoviJSByZDUKeoeoWKn4MA0GCSqGSIb3DQEBBQUAA4GBAB7N[m
[31m-g2ax2+pcN368MURScgOum0QgLK0AIKXcz53IyI/fzyQmnEOD9NL/69nkfSXPH7iq[m
[31m-Y1gDudpSQvj+LnHMj94mNM3aXHo7ZAcYJ6FhtlgylhCX8n8AxERDt53iMWlPwpXF[m
[31m-ozLRwADG71i5D+YIOg3JwBT3JoxDE1Ubk3Fyx60v[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4098 (0x1002)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=San Francisco, O=OpenResty, CN=Root CA[m
[31m-        Validity[m
[31m-            Not Before: Sep 20 05:09:05 2014 GMT[m
[31m-            Not After : Aug 27 05:09:05 2114 GMT[m
[31m-        Subject: C=US, ST=California, O=OpenResty, CN=Signing-CA-1[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:b9:9a:3d:b6:31:dd:b6:8a:f1:9f:61:25:79:70:[m
[31m-                    f6:ea:4b:6a:0f:0c:72:ea:45:fc:4d:51:cf:f5:71:[m
[31m-                    88:94:9c:f9:04:40:99:fd:2d:17:15:3a:de:5f:70:[m
[31m-                    4a:06:79:13:fb:81:49:ad:da:59:44:12:81:74:9d:[m
[31m-                    d8:19:3e:4e:e8:c7:00:ee:f9:96:81:7a:bf:09:e6:[m
[31m-                    88:b0:e3:b2:e8:ca:e3:72:23:e4:86:83:41:ca:b3:[m
[31m-                    49:c0:f5:76:8a:d7:b5:fc:a3:12:1b:2b:0b:b4:57:[m
[31m-                    10:24:97:40:be:cb:17:e7:c5:de:93:1b:59:94:ff:[m
[31m-                    34:3f:cd:4d:14:76:09:0e:f3[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                12:57:8E:2C:9B:CA:C9:8D:F8:88:B1:4D:EE:A6:6D:F3:99:C3:AF:E1[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:56:65:C9:8B:65:55:27:2E:AB:14:F0:26:46:BD:BB:9E:A1:2B:41:58[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         1e:fb:6f:3e:12:bd:45:11:59:52:d5:60:ff:7c:73:9e:32:ce:[m
[31m-         76:fa:0b:b6:4a:58:68:db:92:a4:a0:d2:63:24:27:9c:6a:c5:[m
[31m-         6c:fa:84:d4:b5:80:93:b0:79:8f:33:c6:06:99:49:81:99:f4:[m
[31m-         52:ba:bd:ff:6e:f5:69:3f:65:e0:59:51:ce:16:66:2f:39:b5:[m
[31m-         31:ff:18:2a:a4:8e:14:77:7b:a2:2c:54:4b:f0:a5:2c:83:12:[m
[31m-         c4:d5:1c:4a:5f:7b:31:26:ed:63:ba:d5:83:e2:b5:1d:c3:f3:[m
[31m-         34:a0:ba:dd:ee:87:ee:70:71:ae:1b:c5:97:9b:08:a6:9c:ad:[m
[31m-         c0:c2[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICdjCCAd+gAwIBAgICEAIwDQYJKoZIhvcNAQEFBQAwYDELMAkGA1UEBhMCVVMx[m
[31m-EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQ[m
[31m-BgNVBAoMCU9wZW5SZXN0eTEQMA4GA1UEAwwHUm9vdCBDQTAgFw0xNDA5MjAwNTA5[m
[31m-MDVaGA8yMTE0MDgyNzA1MDkwNVowTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh[m
[31m-bGlmb3JuaWExEjAQBgNVBAoMCU9wZW5SZXN0eTEVMBMGA1UEAwwMU2lnbmluZy1D[m
[31m-QS0xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5mj22Md22ivGfYSV5cPbq[m
[31m-S2oPDHLqRfxNUc/1cYiUnPkEQJn9LRcVOt5fcEoGeRP7gUmt2llEEoF0ndgZPk7o[m
[31m-xwDu+ZaBer8J5oiw47LoyuNyI+SGg0HKs0nA9XaK17X8oxIbKwu0VxAkl0C+yxfn[m
[31m-xd6TG1mU/zQ/zU0UdgkO8wIDAQABo1AwTjAdBgNVHQ4EFgQUEleOLJvKyY34iLFN[m
[31m-7qZt85nDr+EwHwYDVR0jBBgwFoAUVmXJi2VVJy6rFPAmRr27nqErQVgwDAYDVR0T[m
[31m-BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAe+28+Er1FEVlS1WD/fHOeMs52+gu2[m
[31m-Slho25KkoNJjJCecasVs+oTUtYCTsHmPM8YGmUmBmfRSur3/bvVpP2XgWVHOFmYv[m
[31m-ObUx/xgqpI4Ud3uiLFRL8KUsgxLE1RxKX3sxJu1jutWD4rUdw/M0oLrd7ofucHGu[m
[31m-G8WXmwimnK3Awg==[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4099 (0x1003)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, O=OpenResty, CN=Signing-CA-1[m
[31m-        Validity[m
[31m-            Not Before: Sep 20 05:25:04 2014 GMT[m
[31m-            Not After : Aug 27 05:25:04 2114 GMT[m
[31m-        Subject: C=US, ST=California, O=OpenResty, CN=Signing-CA-2[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:a4:d0:ae:16:a8:8f:9d:2c:ee:12:f5:0c:5e:29:[m
[31m-                    65:9b:cc:9b:67:6f:40:24:d7:44:ff:d4:de:8d:d4:[m
[31m-                    36:1c:e1:37:2b:df:ff:69:35:6d:0b:4f:ae:9a:16:[m
[31m-                    e7:a9:c6:24:d3:8e:a4:c3:2f:25:d8:f3:66:73:8e:[m
[31m-                    84:8e:9c:a6:c7:f9:ce:8c:b7:9d:60:26:85:4c:8f:[m
[31m-                    f4:43:17:af:9d:94:1a:f5:21:7b:1c:2b:9c:ee:fe:[m
[31m-                    4a:ca:6d:c7:cf:ee:2a:02:28:1f:6e:13:94:85:3f:[m
[31m-                    50:a3:03:18:bd:6c:f9:b5:9d:37:b9:27:61:29:75:[m
[31m-                    d3:39:77:5e:83:41:aa:8c:21[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                39:77:77:A3:4E:92:8B:E2:25:20:72:64:35:0A:7A:87:A8:58:A9:F8[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:12:57:8E:2C:9B:CA:C9:8D:F8:88:B1:4D:EE:A6:6D:F3:99:C3:AF:E1[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         3b:4b:b6:31:51:72:9a:ef:42:60:5e:98:60:71:d7:26:4a:46:[m
[31m-         f1:0e:1f:08:be:e6:1b:5f:e2:fd:28:54:8d:b1:c5:09:6f:04:[m
[31m-         cb:69:dc:39:5e:67:e0:91:9f:10:94:bc:35:90:4a:65:fe:58:[m
[31m-         bd:e9:9d:18:f0:b2:c4:2c:6e:05:00:a4:63:59:6a:85:cf:0e:[m
[31m-         28:3a:ad:34:1c:1e:8c:08:cf:ac:79:18:e6:2b:16:49:9c:0b:[m
[31m-         09:66:50:29:53:78:04:9e:3d:27:40:c4:0c:72:d6:8c:d6:b1:[m
[31m-         9c:f5:f2:f8:8c:9c:0b:0d:e1:4b:9b:ec:c9:65:0c:1e:fe:27:[m
[31m-         07:96[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICYzCCAcygAwIBAgICEAMwDQYJKoZIhvcNAQEFBQAwTTELMAkGA1UEBhMCVVMx[m
[31m-EzARBgNVBAgMCkNhbGlmb3JuaWExEjAQBgNVBAoMCU9wZW5SZXN0eTEVMBMGA1UE[m
[31m-AwwMU2lnbmluZy1DQS0xMCAXDTE0MDkyMDA1MjUwNFoYDzIxMTQwODI3MDUyNTA0[m
[31m-WjBNMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTESMBAGA1UECgwJ[m
[31m-T3BlblJlc3R5MRUwEwYDVQQDDAxTaWduaW5nLUNBLTIwgZ8wDQYJKoZIhvcNAQEB[m
[31m-BQADgY0AMIGJAoGBAKTQrhaoj50s7hL1DF4pZZvMm2dvQCTXRP/U3o3UNhzhNyvf[m
[31m-/2k1bQtPrpoW56nGJNOOpMMvJdjzZnOOhI6cpsf5zoy3nWAmhUyP9EMXr52UGvUh[m
[31m-exwrnO7+Ssptx8/uKgIoH24TlIU/UKMDGL1s+bWdN7knYSl10zl3XoNBqowhAgMB[m
[31m-AAGjUDBOMB0GA1UdDgQWBBQ5d3ejTpKL4iUgcmQ1CnqHqFip+DAfBgNVHSMEGDAW[m
[31m-gBQSV44sm8rJjfiIsU3upm3zmcOv4TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB[m
[31m-BQUAA4GBADtLtjFRcprvQmBemGBx1yZKRvEOHwi+5htf4v0oVI2xxQlvBMtp3Dle[m
[31m-Z+CRnxCUvDWQSmX+WL3pnRjwssQsbgUApGNZaoXPDig6rTQcHowIz6x5GOYrFkmc[m
[31m-CwlmUClTeASePSdAxAxy1ozWsZz18viMnAsN4Uub7MllDB7+JweW[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/root-ca.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/root-ca.crt[m
[1mdeleted file mode 100644[m
[1mindex d2f3c8f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/root-ca.crt[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICkDCCAfmgAwIBAgIJAK3s1yAQ5tdfMA0GCSqGSIb3DQEBBQUAMGAxCzAJBgNV[m
[31m-BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNp[m
[31m-c2NvMRIwEAYDVQQKDAlPcGVuUmVzdHkxEDAOBgNVBAMMB1Jvb3QgQ0EwIBcNMTQw[m
[31m-OTIwMDM1NTU0WhgPMjExNDA4MjcwMzU1NTRaMGAxCzAJBgNVBAYTAlVTMRMwEQYD[m
[31m-VQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMRIwEAYDVQQK[m
[31m-DAlPcGVuUmVzdHkxEDAOBgNVBAMMB1Jvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQAD[m
[31m-gY0AMIGJAoGBAN7CcpCjiafBdl1KaExRcuutAF0/eq4/ht7L4/i0nPDzikscFJ/O[m
[31m-aVyH3UpUF/KMq+72vom2bEbUeRROr1rL/JRe9raGlQtvdovHZt6f4c3/Coihtupp[m
[31m-9BXYrBCU4P+Bxai5gtTXGFvLC2a72qKcXDNeH+NxpIaemfPxSvemCYUXAgMBAAGj[m
[31m-UDBOMB0GA1UdDgQWBBRWZcmLZVUnLqsU8CZGvbueoStBWDAfBgNVHSMEGDAWgBRW[m
[31m-ZcmLZVUnLqsU8CZGvbueoStBWDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAGjMH6qkY+61311DERFhDuYzMSSZjH53qzFseq/chlIMGjrgJIMy6rl7T0AU[m
[31m-2hjvW+FOyhf5NqRrAQDTTuLbtXZ/ygiUformE8lR/SNRY/DVj1yarQkWUC5UpqOs[m
[31m-GWG1VW9DHQAMFVkYwPO3XKeTXpEFOxPLHtXBYcVemCT4zo42[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/test-com.key.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/test-com.key.der[m
[1mdeleted file mode 100644[m
[1mindex 3a19bbc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/test-com.key.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/test-com.key.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/test-com.key.pem[m
[1mdeleted file mode 100644[m
[1mindex 883ea79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/chain/test-com.key.pem[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXAIBAAKBgQDYU6ysXD/5gKiWS7BY21qG3sowAtkZyPYUxUDJQeu7etHh+ZY7[m
[31m-VNXov6xQWkkR2plgROAlaEA2fPbOtJy5WNbq50SYY+uicvjpabRKTWiGQcpnWGHm[m
[31m-cOgI/q3CdVkkDvAvGnCDjKN3ZOhN1cUoYqlT0aEi9TZDp0YAqpdUctRyRwIDAQAB[m
[31m-AoGBAIl/5elIWYGFPaMKSPSxuECxq2II7WVuTru1BRDnTabE0lMICW185tohuqz4[m
[31m-NimbAJIoNTCRqv73Pwjz1AobZb6Nm7TDaahhstak6IlTYKcjXVBuM/UU4G13Kz/f[m
[31m-hNVblv2cCn9CkeTNOvPZjYJXw/c4XlHasjDMMh8S83Q9095BAkEA+6oPzEiSsdo5[m
[31m-RX9D0EV+Uv4ID08johKbcZdGbsp+mo+PQ9CYOlE67QcKf8J4Hp2SFmq7mpTvvS7F[m
[31m-tA/a2WwJswJBANwNwsJre3QPJmJCBAGsIrPrw9rFKLiT0/ajyhT7kKfG4Rw9t55S[m
[31m-lY9VPFOxAJF9lDo4QiFUHi/8Htvd0B78wx0CQFh5cRRgbzIXhgrosu6Ff+Otayf2[m
[31m-qpBP+lX02M4aYmf0EGnG672U0SKDVy2TMKeSvckjvNCbi6z2xIqJCGdnlAECQFTh[m
[31m-+f6E91oNfgDo9iKvA7PjfeklpE+OtnStOYZeg640SSFbrTilIovnlR2zaUS17DeI[m
[31m-+/lfOUXJOx4UsfNCDQECQD7nndBJDJeSggFSJKcZ0RI59NVG8eGRSX7/3ycbq6+t[m
[31m-guGI7WBvhDH4jNNL8jhuE+XuJuhhzOwP85872AFgIgw=[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/chain.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/chain.pem[m
[1mdeleted file mode 100644[m
[1mindex 4743a36..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/chain.pem[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4 (0x4)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:c7:bd:50:99:71:46:af:93:22:85:ab:74:8b:5b:[m
[31m-                    19:74:af:3e:ad:d2:e1:17:3e:cb:5b:36:9c:8a:38:[m
[31m-                    bd:1b:47:2d:8b:92:55:1d:fe:a6:72:92:78:00:de:[m
[31m-                    30:cb:a3:10:b5:92:aa:b8:e0:7b:44:9a:f5:99:89:[m
[31m-                    36:f4:84:20:81:e3:5c:76:00:9d:76:e7:b9:41:ab:[m
[31m-                    74:b6:14:9f:b2:94:b3:b6:48:a8:92:dc:09:e3:3d:[m
[31m-                    04:e3:5f:0f:5b:50:ad:0c:59:3a:88:06:39:2d:34:[m
[31m-                    a6:52:2f:58:6f:53:1b:df:9f:98:ea:82:8d:52:60:[m
[31m-                    b1:ef:6b:e9:f5:ad:29:87:45[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                67:DF:28:25:D1:F8:83:36:28:EE:DB:41:63:E4:E0:3A:32:0D:EA:30[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-                DirName:/C=US/ST=California/L=Default City/O=OpenResty/CN=signing-ca-1[m
[31m-                serial:03[m
[31m-[m
[31m-            Authority Information Access: [m
[31m-                OCSP - URI:http://127.0.0.1:8888/ocsp?foo=1[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         37:29:3f:ed:d9:47:9a:51:36:a3:5b:00:85:66:de:51:4d:48:[m
[31m-         2d:f8:bc:f1:5e:b4:fd:30:48:f0:25:ee:77:57:9c:f1:4b:0a:[m
[31m-         4f:7e:96:1a:f8:48:76:23:46:8d:d6:f2:5e:1e:08:52:12:53:[m
[31m-         08:07:9f:75:db:77:22:2e:7e:89:c2:2c:66:85:6b:df:e9:77:[m
[31m-         ca:23:6d:9a:af:87:8a:8c:27:37:1e:9e:55:92:8e:8a:a9:93:[m
[31m-         24:41:a8:96:01:c0:65:93:8e:3d:7a:6c:bf:ed:c8:2a:f8:26:[m
[31m-         cc:00:17:b7:27:ca:85:6c:2e:d5:2a:0a:8d:f3:88:e8:26:48:[m
[31m-         e3:e8[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDaTCCAtKgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMjAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MREwDwYDVQQDEwh0ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw[m
[31m-gYkCgYEAx71QmXFGr5Mihat0i1sZdK8+rdLhFz7LWzaciji9G0cti5JVHf6mcpJ4[m
[31m-AN4wy6MQtZKquOB7RJr1mYk29IQggeNcdgCddue5Qat0thSfspSztkioktwJ4z0E[m
[31m-418PW1CtDFk6iAY5LTSmUi9Yb1Mb35+Y6oKNUmCx72vp9a0ph0UCAwEAAaOCASsw[m
[31m-ggEnMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk[m
[31m-IENlcnRpZmljYXRlMB0GA1UdDgQWBBRn3ygl0fiDNiju20Fj5OA6Mg3qMDCBjgYD[m
[31m-VR0jBIGGMIGDgBSzC/V9URZRfig3w6IPHS8QwFGjs6FopGYwZDELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTES[m
[31m-MBAGA1UEChMJT3BlblJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTGCAQMwPAYI[m
[31m-KwYBBQUHAQEEMDAuMCwGCCsGAQUFBzABhiBodHRwOi8vMTI3LjAuMC4xOjg4ODgv[m
[31m-b2NzcD9mb289MTANBgkqhkiG9w0BAQUFAAOBgQA3KT/t2UeaUTajWwCFZt5RTUgt[m
[31m-+LzxXrT9MEjwJe53V5zxSwpPfpYa+Eh2I0aN1vJeHghSElMIB59123ciLn6Jwixm[m
[31m-hWvf6XfKI22ar4eKjCc3Hp5Vko6KqZMkQaiWAcBlk449emy/7cgq+CbMABe3J8qF[m
[31m-bC7VKgqN84joJkjj6A==[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 3 (0x3)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:d3:24:1c:92:a5:bb:00:d9:b1:fb:2b:1d:7a:32:[m
[31m-                    a1:6c:49:eb:3c:2d:29:80:d6:65:8b:17:3a:f0:4b:[m
[31m-                    dc:0c:57:fb:d5:31:68:a5:e4:54:86:55:f9:1b:a8:[m
[31m-                    d7:7d:32:01:3b:cf:5c:38:2b:f5:bc:d3:8b:c8:b6:[m
[31m-                    ab:76:65:32:e6:4b:d5:e4:fd:d1:92:c8:33:6a:74:[m
[31m-                    f3:c7:ec:97:c3:c7:9f:e4:d5:55:75:b8:bd:39:ec:[m
[31m-                    2d:1f:c6:54:c8:2b:2d:17:e0:05:77:28:44:f7:dd:[m
[31m-                    e1:6e:f0:59:05:51:f5:b9:b4:fe:be:ad:40:a6:d5:[m
[31m-                    9a:c1:64:e0:9b:dd:67:e5:f1[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         0c:61:c0:c7:11:c2:f0:39:f0:76:9d:4f:43:d4:90:54:1f:26:[m
[31m-         3d:54:3d:77:5f:c0:b3:4a:c2:1b:b6:18:d2:12:8d:24:4d:76:[m
[31m-         f5:07:0b:14:3e:17:2d:42:ee:85:30:db:e3:4d:81:67:59:97:[m
[31m-         0a:b3:bb:c5:27:ea:69:c6:ee:99:5c:44:36:53:3e:c4:47:68:[m
[31m-         f8:fe:c6:53:38:fb:e7:9a:0c:3c:6c:78:93:29:d2:49:7d:29:[m
[31m-         d0:61:6e:81:9b:d6:ec:1a:e2:3e:62:62:41:bc:6d:4d:33:91:[m
[31m-         76:20:5e:32:70:08:3e:24:72:fe:b1:8a:83:57:04:19:b5:cb:[m
[31m-         99:b7[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICkDCCAfmgAwIBAgIBAzANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMTAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowZDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTIwgZ8wDQYJKoZIhvcNAQEBBQAD[m
[31m-gY0AMIGJAoGBANMkHJKluwDZsfsrHXoyoWxJ6zwtKYDWZYsXOvBL3AxX+9UxaKXk[m
[31m-VIZV+Ruo130yATvPXDgr9bzTi8i2q3ZlMuZL1eT90ZLIM2p088fsl8PHn+TVVXW4[m
[31m-vTnsLR/GVMgrLRfgBXcoRPfd4W7wWQVR9bm0/r6tQKbVmsFk4JvdZ+XxAgMBAAGj[m
[31m-UDBOMB0GA1UdDgQWBBSzC/V9URZRfig3w6IPHS8QwFGjszAfBgNVHSMEGDAWgBTS[m
[31m-MHFWUKa8IcWhoasRpwhb6zqkJzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAAxhwMcRwvA58HadT0PUkFQfJj1UPXdfwLNKwhu2GNISjSRNdvUHCxQ+Fy1C[m
[31m-7oUw2+NNgWdZlwqzu8Un6mnG7plcRDZTPsRHaPj+xlM4++eaDDxseJMp0kl9KdBh[m
[31m-boGb1uwa4j5iYkG8bU0zkXYgXjJwCD4kcv6xioNXBBm1y5m3[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 2 (0x2)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=root-ca[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:a0:3e:1a:4f:6c:b9:3d:ab:0f:02:de:da:82:92:[m
[31m-                    ee:a2:69:88:80:ed:f2:b6:98:bc:c6:ee:d3:47:82:[m
[31m-                    4a:e7:d3:7f:55:68:5c:6d:9e:aa:ba:59:e3:5b:7f:[m
[31m-                    32:4f:79:44:4a:4f:13:e4:2e:3f:1f:98:10:a4:72:[m
[31m-                    d5:f0:e7:44:8e:d4:a7:b9:fb:54:be:b6:fa:f7:dc:[m
[31m-                    9c:29:93:d4:9f:a1:5b:18:6e:68:93:91:1b:8c:a0:[m
[31m-                    4f:02:52:e9:9d:e8:98:f3:fd:67:da:78:4b:4f:d8:[m
[31m-                    2d:90:83:5c:0b:e5:fe:48:27:e4:ec:bb:99:26:06:[m
[31m-                    8e:34:fe:93:e4:d2:fc:97:57[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:1D:2F:09:60:EB:E4:EA:B5:0B:52:A9:5C:5E:09:2B:DD:34:70:CF:BA[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         a6:16:2f:fc:13:67:5e:ce:0e:79:cb:b0:91:52:9b:9e:b5:9f:[m
[31m-         e1:fa:7d:78:f4:2a:93:f3:94:62:45:17:87:b9:0a:59:b9:a3:[m
[31m-         a9:75:51:ca:f0:04:6c:01:d1:3a:a9:dd:66:7d:27:7b:1e:4f:[m
[31m-         48:3a:25:ea:a5:01:32:fc:87:4b:08:da:f8:f5:62:88:e8:b9:[m
[31m-         94:c7:cb:ee:33:08:ab:2f:52:f4:4a:14:4f:ac:2d:a2:f8:de:[m
[31m-         c9:6f:95:b7:91:23:b9:ec:95:90:de:86:21:f5:6f:1b:cf:13:[m
[31m-         47:77:78:dd:7a:16:e9:8b:cc:df:3d:45:8a:76:af:15:d1:9a:[m
[31m-         37:a2[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICizCCAfSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxEDAOBgNVBAMTB3Jvb3QtY2EwIBcNMTQxMDE2MDMyNzA5[m
[31m-WhgPMjExNDA5MjIwMzI3MDlaMGQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxp[m
[31m-Zm9ybmlhMRUwEwYDVQQHEwxEZWZhdWx0IENpdHkxEjAQBgNVBAoTCU9wZW5SZXN0[m
[31m-eTEVMBMGA1UEAxMMc2lnbmluZy1jYS0xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB[m
[31m-iQKBgQCgPhpPbLk9qw8C3tqCku6iaYiA7fK2mLzG7tNHgkrn039VaFxtnqq6WeNb[m
[31m-fzJPeURKTxPkLj8fmBCkctXw50SO1Ke5+1S+tvr33Jwpk9SfoVsYbmiTkRuMoE8C[m
[31m-Uumd6Jjz/WfaeEtP2C2Qg1wL5f5IJ+Tsu5kmBo40/pPk0vyXVwIDAQABo1AwTjAd[m
[31m-BgNVHQ4EFgQU0jBxVlCmvCHFoaGrEacIW+s6pCcwHwYDVR0jBBgwFoAUHS8JYOvk[m
[31m-6rULUqlcXgkr3TRwz7owDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCm[m
[31m-Fi/8E2dezg55y7CRUpuetZ/h+n149CqT85RiRReHuQpZuaOpdVHK8ARsAdE6qd1m[m
[31m-fSd7Hk9IOiXqpQEy/IdLCNr49WKI6LmUx8vuMwirL1L0ShRPrC2i+N7Jb5W3kSO5[m
[31m-7JWQ3oYh9W8bzxNHd3jdehbpi8zfPUWKdq8V0Zo3og==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-req.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-req.der[m
[1mdeleted file mode 100644[m
[1mindex f125311..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-req.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-no-certs.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-no-certs.der[m
[1mdeleted file mode 100644[m
[1mindex 01a45cf..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-no-certs.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned-no-certs.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned-no-certs.der[m
[1mdeleted file mode 100644[m
[1mindex 61c775f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned-no-certs.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned.der[m
[1mdeleted file mode 100644[m
[1mindex 506dbd2..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp.der[m
[1mdeleted file mode 100644[m
[1mindex 1fe910f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/revoked-chain.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/revoked-chain.pem[m
[1mdeleted file mode 100644[m
[1mindex 3f98b7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/revoked-chain.pem[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 8 (0x8)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=revoked-test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:ca:50:23:9a:59:70:ea:00:47:ff:72:05:29:9b:[m
[31m-                    5d:6d:4b:73:37:a4:ff:38:20:4b:5b:ac:1f:3b:34:[m
[31m-                    f5:12:f8:8b:0e:02:bc:bd:14:34:39:6f:7d:5b:1f:[m
[31m-                    d4:15:e7:64:2e:65:fb:b1:a8:aa:f6:96:d3:e6:2b:[m
[31m-                    00:0e:f3:8a:ef:99:ab:3e:e6:5d:eb:6d:a6:4a:d0:[m
[31m-                    aa:ff:a9:d6:9a:41:f0:66:22:0a:38:9c:28:4f:1f:[m
[31m-                    0d:cf:a2:79:96:f9:fc:3d:1e:83:70:f5:97:6e:07:[m
[31m-                    cf:a2:17:87:0d:2a:41:19:3a:44:96:89:e7:0d:cb:[m
[31m-                    88:20:86:e1:de:08:8b:0d:db[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                FB:98:2B:56:90:69:E1:B4:2B:C2:DB:25:7C:13:87:D5:D7:BC:70:B6[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-                DirName:/C=US/ST=California/L=Default City/O=OpenResty/CN=signing-ca-1[m
[31m-                serial:03[m
[31m-[m
[31m-            Authority Information Access: [m
[31m-                OCSP - URI:http://127.0.0.1:8888/ocsp?foo=1[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         43:77:33:e9:cc:b1:42:35:94:0a:57:a5:dd:94:21:c0:cc:42:[m
[31m-         04:81:bd:b2:ac:4d:10:68:f3:fe:33:0a:8e:b9:3e:e9:f2:44:[m
[31m-         aa:1c:e7:3e:e8:e0:57:40:41:ef:4a:b1:32:b0:f2:75:7c:aa:[m
[31m-         77:d2:64:9d:ba:a1:12:ea:f9:83:31:ba:9f:83:58:1c:38:e9:[m
[31m-         d0:a6:dd:04:72:85:d1:2d:c7:3b:b2:71:ef:e4:f6:57:0c:6a:[m
[31m-         b6:fc:e5:13:2d:be:a6:c1:f4:4b:4d:c8:69:cc:7c:2e:25:c1:[m
[31m-         8e:80:9e:19:c3:17:b2:21:a7:af:e8:2f:f1:d4:bb:8c:a3:39:[m
[31m-         be:49[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDcTCCAtqgAwIBAgIBCDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMjAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowaDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MRkwFwYDVQQDExByZXZva2VkLXRlc3QuY29tMIGfMA0GCSqGSIb3DQEB[m
[31m-AQUAA4GNADCBiQKBgQDKUCOaWXDqAEf/cgUpm11tS3M3pP84IEtbrB87NPUS+IsO[m
[31m-Ary9FDQ5b31bH9QV52QuZfuxqKr2ltPmKwAO84rvmas+5l3rbaZK0Kr/qdaaQfBm[m
[31m-Igo4nChPHw3PonmW+fw9HoNw9ZduB8+iF4cNKkEZOkSWiecNy4gghuHeCIsN2wID[m
[31m-AQABo4IBKzCCAScwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH[m
[31m-ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFPuYK1aQaeG0K8LbJXwTh9XX[m
[31m-vHC2MIGOBgNVHSMEgYYwgYOAFLML9X1RFlF+KDfDog8dLxDAUaOzoWikZjBkMQsw[m
[31m-CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVs[m
[31m-dCBDaXR5MRIwEAYDVQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2Et[m
[31m-MYIBAzA8BggrBgEFBQcBAQQwMC4wLAYIKwYBBQUHMAGGIGh0dHA6Ly8xMjcuMC4w[m
[31m-LjE6ODg4OC9vY3NwP2Zvbz0xMA0GCSqGSIb3DQEBBQUAA4GBAEN3M+nMsUI1lApX[m
[31m-pd2UIcDMQgSBvbKsTRBo8/4zCo65PunyRKoc5z7o4FdAQe9KsTKw8nV8qnfSZJ26[m
[31m-oRLq+YMxup+DWBw46dCm3QRyhdEtxzuyce/k9lcMarb85RMtvqbB9EtNyGnMfC4l[m
[31m-wY6AnhnDF7Ihp6/oL/HUu4yjOb5J[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 3 (0x3)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:d3:24:1c:92:a5:bb:00:d9:b1:fb:2b:1d:7a:32:[m
[31m-                    a1:6c:49:eb:3c:2d:29:80:d6:65:8b:17:3a:f0:4b:[m
[31m-                    dc:0c:57:fb:d5:31:68:a5:e4:54:86:55:f9:1b:a8:[m
[31m-                    d7:7d:32:01:3b:cf:5c:38:2b:f5:bc:d3:8b:c8:b6:[m
[31m-                    ab:76:65:32:e6:4b:d5:e4:fd:d1:92:c8:33:6a:74:[m
[31m-                    f3:c7:ec:97:c3:c7:9f:e4:d5:55:75:b8:bd:39:ec:[m
[31m-                    2d:1f:c6:54:c8:2b:2d:17:e0:05:77:28:44:f7:dd:[m
[31m-                    e1:6e:f0:59:05:51:f5:b9:b4:fe:be:ad:40:a6:d5:[m
[31m-                    9a:c1:64:e0:9b:dd:67:e5:f1[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         0c:61:c0:c7:11:c2:f0:39:f0:76:9d:4f:43:d4:90:54:1f:26:[m
[31m-         3d:54:3d:77:5f:c0:b3:4a:c2:1b:b6:18:d2:12:8d:24:4d:76:[m
[31m-         f5:07:0b:14:3e:17:2d:42:ee:85:30:db:e3:4d:81:67:59:97:[m
[31m-         0a:b3:bb:c5:27:ea:69:c6:ee:99:5c:44:36:53:3e:c4:47:68:[m
[31m-         f8:fe:c6:53:38:fb:e7:9a:0c:3c:6c:78:93:29:d2:49:7d:29:[m
[31m-         d0:61:6e:81:9b:d6:ec:1a:e2:3e:62:62:41:bc:6d:4d:33:91:[m
[31m-         76:20:5e:32:70:08:3e:24:72:fe:b1:8a:83:57:04:19:b5:cb:[m
[31m-         99:b7[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICkDCCAfmgAwIBAgIBAzANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMTAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowZDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTIwgZ8wDQYJKoZIhvcNAQEBBQAD[m
[31m-gY0AMIGJAoGBANMkHJKluwDZsfsrHXoyoWxJ6zwtKYDWZYsXOvBL3AxX+9UxaKXk[m
[31m-VIZV+Ruo130yATvPXDgr9bzTi8i2q3ZlMuZL1eT90ZLIM2p088fsl8PHn+TVVXW4[m
[31m-vTnsLR/GVMgrLRfgBXcoRPfd4W7wWQVR9bm0/r6tQKbVmsFk4JvdZ+XxAgMBAAGj[m
[31m-UDBOMB0GA1UdDgQWBBSzC/V9URZRfig3w6IPHS8QwFGjszAfBgNVHSMEGDAWgBTS[m
[31m-MHFWUKa8IcWhoasRpwhb6zqkJzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAAxhwMcRwvA58HadT0PUkFQfJj1UPXdfwLNKwhu2GNISjSRNdvUHCxQ+Fy1C[m
[31m-7oUw2+NNgWdZlwqzu8Un6mnG7plcRDZTPsRHaPj+xlM4++eaDDxseJMp0kl9KdBh[m
[31m-boGb1uwa4j5iYkG8bU0zkXYgXjJwCD4kcv6xioNXBBm1y5m3[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 2 (0x2)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=root-ca[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:a0:3e:1a:4f:6c:b9:3d:ab:0f:02:de:da:82:92:[m
[31m-                    ee:a2:69:88:80:ed:f2:b6:98:bc:c6:ee:d3:47:82:[m
[31m-                    4a:e7:d3:7f:55:68:5c:6d:9e:aa:ba:59:e3:5b:7f:[m
[31m-                    32:4f:79:44:4a:4f:13:e4:2e:3f:1f:98:10:a4:72:[m
[31m-                    d5:f0:e7:44:8e:d4:a7:b9:fb:54:be:b6:fa:f7:dc:[m
[31m-                    9c:29:93:d4:9f:a1:5b:18:6e:68:93:91:1b:8c:a0:[m
[31m-                    4f:02:52:e9:9d:e8:98:f3:fd:67:da:78:4b:4f:d8:[m
[31m-                    2d:90:83:5c:0b:e5:fe:48:27:e4:ec:bb:99:26:06:[m
[31m-                    8e:34:fe:93:e4:d2:fc:97:57[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:1D:2F:09:60:EB:E4:EA:B5:0B:52:A9:5C:5E:09:2B:DD:34:70:CF:BA[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         a6:16:2f:fc:13:67:5e:ce:0e:79:cb:b0:91:52:9b:9e:b5:9f:[m
[31m-         e1:fa:7d:78:f4:2a:93:f3:94:62:45:17:87:b9:0a:59:b9:a3:[m
[31m-         a9:75:51:ca:f0:04:6c:01:d1:3a:a9:dd:66:7d:27:7b:1e:4f:[m
[31m-         48:3a:25:ea:a5:01:32:fc:87:4b:08:da:f8:f5:62:88:e8:b9:[m
[31m-         94:c7:cb:ee:33:08:ab:2f:52:f4:4a:14:4f:ac:2d:a2:f8:de:[m
[31m-         c9:6f:95:b7:91:23:b9:ec:95:90:de:86:21:f5:6f:1b:cf:13:[m
[31m-         47:77:78:dd:7a:16:e9:8b:cc:df:3d:45:8a:76:af:15:d1:9a:[m
[31m-         37:a2[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICizCCAfSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxEDAOBgNVBAMTB3Jvb3QtY2EwIBcNMTQxMDE2MDMyNzA5[m
[31m-WhgPMjExNDA5MjIwMzI3MDlaMGQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxp[m
[31m-Zm9ybmlhMRUwEwYDVQQHEwxEZWZhdWx0IENpdHkxEjAQBgNVBAoTCU9wZW5SZXN0[m
[31m-eTEVMBMGA1UEAxMMc2lnbmluZy1jYS0xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB[m
[31m-iQKBgQCgPhpPbLk9qw8C3tqCku6iaYiA7fK2mLzG7tNHgkrn039VaFxtnqq6WeNb[m
[31m-fzJPeURKTxPkLj8fmBCkctXw50SO1Ke5+1S+tvr33Jwpk9SfoVsYbmiTkRuMoE8C[m
[31m-Uumd6Jjz/WfaeEtP2C2Qg1wL5f5IJ+Tsu5kmBo40/pPk0vyXVwIDAQABo1AwTjAd[m
[31m-BgNVHQ4EFgQU0jBxVlCmvCHFoaGrEacIW+s6pCcwHwYDVR0jBBgwFoAUHS8JYOvk[m
[31m-6rULUqlcXgkr3TRwz7owDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCm[m
[31m-Fi/8E2dezg55y7CRUpuetZ/h+n149CqT85RiRReHuQpZuaOpdVHK8ARsAdE6qd1m[m
[31m-fSd7Hk9IOiXqpQEy/IdLCNr49WKI6LmUx8vuMwirL1L0ShRPrC2i+N7Jb5W3kSO5[m
[31m-7JWQ3oYh9W8bzxNHd3jdehbpi8zfPUWKdq8V0Zo3og==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/revoked-ocsp-resp.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/revoked-ocsp-resp.der[m
[1mdeleted file mode 100644[m
[1mindex 71d41a7..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/revoked-ocsp-resp.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/test-com.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/test-com.crt[m
[1mdeleted file mode 100644[m
[1mindex d34cb6b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/test-com.crt[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4 (0x4)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:c7:bd:50:99:71:46:af:93:22:85:ab:74:8b:5b:[m
[31m-                    19:74:af:3e:ad:d2:e1:17:3e:cb:5b:36:9c:8a:38:[m
[31m-                    bd:1b:47:2d:8b:92:55:1d:fe:a6:72:92:78:00:de:[m
[31m-                    30:cb:a3:10:b5:92:aa:b8:e0:7b:44:9a:f5:99:89:[m
[31m-                    36:f4:84:20:81:e3:5c:76:00:9d:76:e7:b9:41:ab:[m
[31m-                    74:b6:14:9f:b2:94:b3:b6:48:a8:92:dc:09:e3:3d:[m
[31m-                    04:e3:5f:0f:5b:50:ad:0c:59:3a:88:06:39:2d:34:[m
[31m-                    a6:52:2f:58:6f:53:1b:df:9f:98:ea:82:8d:52:60:[m
[31m-                    b1:ef:6b:e9:f5:ad:29:87:45[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                67:DF:28:25:D1:F8:83:36:28:EE:DB:41:63:E4:E0:3A:32:0D:EA:30[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-                DirName:/C=US/ST=California/L=Default City/O=OpenResty/CN=signing-ca-1[m
[31m-                serial:03[m
[31m-[m
[31m-            Authority Information Access: [m
[31m-                OCSP - URI:http://127.0.0.1:8888/ocsp?foo=1[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         37:29:3f:ed:d9:47:9a:51:36:a3:5b:00:85:66:de:51:4d:48:[m
[31m-         2d:f8:bc:f1:5e:b4:fd:30:48:f0:25:ee:77:57:9c:f1:4b:0a:[m
[31m-         4f:7e:96:1a:f8:48:76:23:46:8d:d6:f2:5e:1e:08:52:12:53:[m
[31m-         08:07:9f:75:db:77:22:2e:7e:89:c2:2c:66:85:6b:df:e9:77:[m
[31m-         ca:23:6d:9a:af:87:8a:8c:27:37:1e:9e:55:92:8e:8a:a9:93:[m
[31m-         24:41:a8:96:01:c0:65:93:8e:3d:7a:6c:bf:ed:c8:2a:f8:26:[m
[31m-         cc:00:17:b7:27:ca:85:6c:2e:d5:2a:0a:8d:f3:88:e8:26:48:[m
[31m-         e3:e8[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDaTCCAtKgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMjAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MREwDwYDVQQDEwh0ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw[m
[31m-gYkCgYEAx71QmXFGr5Mihat0i1sZdK8+rdLhFz7LWzaciji9G0cti5JVHf6mcpJ4[m
[31m-AN4wy6MQtZKquOB7RJr1mYk29IQggeNcdgCddue5Qat0thSfspSztkioktwJ4z0E[m
[31m-418PW1CtDFk6iAY5LTSmUi9Yb1Mb35+Y6oKNUmCx72vp9a0ph0UCAwEAAaOCASsw[m
[31m-ggEnMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk[m
[31m-IENlcnRpZmljYXRlMB0GA1UdDgQWBBRn3ygl0fiDNiju20Fj5OA6Mg3qMDCBjgYD[m
[31m-VR0jBIGGMIGDgBSzC/V9URZRfig3w6IPHS8QwFGjs6FopGYwZDELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTES[m
[31m-MBAGA1UEChMJT3BlblJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTGCAQMwPAYI[m
[31m-KwYBBQUHAQEEMDAuMCwGCCsGAQUFBzABhiBodHRwOi8vMTI3LjAuMC4xOjg4ODgv[m
[31m-b2NzcD9mb289MTANBgkqhkiG9w0BAQUFAAOBgQA3KT/t2UeaUTajWwCFZt5RTUgt[m
[31m-+LzxXrT9MEjwJe53V5zxSwpPfpYa+Eh2I0aN1vJeHghSElMIB59123ciLn6Jwixm[m
[31m-hWvf6XfKI22ar4eKjCc3Hp5Vko6KqZMkQaiWAcBlk449emy/7cgq+CbMABe3J8qF[m
[31m-bC7VKgqN84joJkjj6A==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/wrong-issuer-order-chain.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/wrong-issuer-order-chain.pem[m
[1mdeleted file mode 100644[m
[1mindex 098e862..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/ocsp/wrong-issuer-order-chain.pem[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4 (0x4)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:c7:bd:50:99:71:46:af:93:22:85:ab:74:8b:5b:[m
[31m-                    19:74:af:3e:ad:d2:e1:17:3e:cb:5b:36:9c:8a:38:[m
[31m-                    bd:1b:47:2d:8b:92:55:1d:fe:a6:72:92:78:00:de:[m
[31m-                    30:cb:a3:10:b5:92:aa:b8:e0:7b:44:9a:f5:99:89:[m
[31m-                    36:f4:84:20:81:e3:5c:76:00:9d:76:e7:b9:41:ab:[m
[31m-                    74:b6:14:9f:b2:94:b3:b6:48:a8:92:dc:09:e3:3d:[m
[31m-                    04:e3:5f:0f:5b:50:ad:0c:59:3a:88:06:39:2d:34:[m
[31m-                    a6:52:2f:58:6f:53:1b:df:9f:98:ea:82:8d:52:60:[m
[31m-                    b1:ef:6b:e9:f5:ad:29:87:45[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                67:DF:28:25:D1:F8:83:36:28:EE:DB:41:63:E4:E0:3A:32:0D:EA:30[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-                DirName:/C=US/ST=California/L=Default City/O=OpenResty/CN=signing-ca-1[m
[31m-                serial:03[m
[31m-[m
[31m-            Authority Information Access: [m
[31m-                OCSP - URI:http://127.0.0.1:8888/ocsp?foo=1[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         37:29:3f:ed:d9:47:9a:51:36:a3:5b:00:85:66:de:51:4d:48:[m
[31m-         2d:f8:bc:f1:5e:b4:fd:30:48:f0:25:ee:77:57:9c:f1:4b:0a:[m
[31m-         4f:7e:96:1a:f8:48:76:23:46:8d:d6:f2:5e:1e:08:52:12:53:[m
[31m-         08:07:9f:75:db:77:22:2e:7e:89:c2:2c:66:85:6b:df:e9:77:[m
[31m-         ca:23:6d:9a:af:87:8a:8c:27:37:1e:9e:55:92:8e:8a:a9:93:[m
[31m-         24:41:a8:96:01:c0:65:93:8e:3d:7a:6c:bf:ed:c8:2a:f8:26:[m
[31m-         cc:00:17:b7:27:ca:85:6c:2e:d5:2a:0a:8d:f3:88:e8:26:48:[m
[31m-         e3:e8[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDaTCCAtKgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMjAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MREwDwYDVQQDEwh0ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw[m
[31m-gYkCgYEAx71QmXFGr5Mihat0i1sZdK8+rdLhFz7LWzaciji9G0cti5JVHf6mcpJ4[m
[31m-AN4wy6MQtZKquOB7RJr1mYk29IQggeNcdgCddue5Qat0thSfspSztkioktwJ4z0E[m
[31m-418PW1CtDFk6iAY5LTSmUi9Yb1Mb35+Y6oKNUmCx72vp9a0ph0UCAwEAAaOCASsw[m
[31m-ggEnMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk[m
[31m-IENlcnRpZmljYXRlMB0GA1UdDgQWBBRn3ygl0fiDNiju20Fj5OA6Mg3qMDCBjgYD[m
[31m-VR0jBIGGMIGDgBSzC/V9URZRfig3w6IPHS8QwFGjs6FopGYwZDELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTES[m
[31m-MBAGA1UEChMJT3BlblJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTGCAQMwPAYI[m
[31m-KwYBBQUHAQEEMDAuMCwGCCsGAQUFBzABhiBodHRwOi8vMTI3LjAuMC4xOjg4ODgv[m
[31m-b2NzcD9mb289MTANBgkqhkiG9w0BAQUFAAOBgQA3KT/t2UeaUTajWwCFZt5RTUgt[m
[31m-+LzxXrT9MEjwJe53V5zxSwpPfpYa+Eh2I0aN1vJeHghSElMIB59123ciLn6Jwixm[m
[31m-hWvf6XfKI22ar4eKjCc3Hp5Vko6KqZMkQaiWAcBlk449emy/7cgq+CbMABe3J8qF[m
[31m-bC7VKgqN84joJkjj6A==[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 2 (0x2)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=root-ca[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:a0:3e:1a:4f:6c:b9:3d:ab:0f:02:de:da:82:92:[m
[31m-                    ee:a2:69:88:80:ed:f2:b6:98:bc:c6:ee:d3:47:82:[m
[31m-                    4a:e7:d3:7f:55:68:5c:6d:9e:aa:ba:59:e3:5b:7f:[m
[31m-                    32:4f:79:44:4a:4f:13:e4:2e:3f:1f:98:10:a4:72:[m
[31m-                    d5:f0:e7:44:8e:d4:a7:b9:fb:54:be:b6:fa:f7:dc:[m
[31m-                    9c:29:93:d4:9f:a1:5b:18:6e:68:93:91:1b:8c:a0:[m
[31m-                    4f:02:52:e9:9d:e8:98:f3:fd:67:da:78:4b:4f:d8:[m
[31m-                    2d:90:83:5c:0b:e5:fe:48:27:e4:ec:bb:99:26:06:[m
[31m-                    8e:34:fe:93:e4:d2:fc:97:57[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:1D:2F:09:60:EB:E4:EA:B5:0B:52:A9:5C:5E:09:2B:DD:34:70:CF:BA[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         a6:16:2f:fc:13:67:5e:ce:0e:79:cb:b0:91:52:9b:9e:b5:9f:[m
[31m-         e1:fa:7d:78:f4:2a:93:f3:94:62:45:17:87:b9:0a:59:b9:a3:[m
[31m-         a9:75:51:ca:f0:04:6c:01:d1:3a:a9:dd:66:7d:27:7b:1e:4f:[m
[31m-         48:3a:25:ea:a5:01:32:fc:87:4b:08:da:f8:f5:62:88:e8:b9:[m
[31m-         94:c7:cb:ee:33:08:ab:2f:52:f4:4a:14:4f:ac:2d:a2:f8:de:[m
[31m-         c9:6f:95:b7:91:23:b9:ec:95:90:de:86:21:f5:6f:1b:cf:13:[m
[31m-         47:77:78:dd:7a:16:e9:8b:cc:df:3d:45:8a:76:af:15:d1:9a:[m
[31m-         37:a2[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICizCCAfSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxEDAOBgNVBAMTB3Jvb3QtY2EwIBcNMTQxMDE2MDMyNzA5[m
[31m-WhgPMjExNDA5MjIwMzI3MDlaMGQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxp[m
[31m-Zm9ybmlhMRUwEwYDVQQHEwxEZWZhdWx0IENpdHkxEjAQBgNVBAoTCU9wZW5SZXN0[m
[31m-eTEVMBMGA1UEAxMMc2lnbmluZy1jYS0xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB[m
[31m-iQKBgQCgPhpPbLk9qw8C3tqCku6iaYiA7fK2mLzG7tNHgkrn039VaFxtnqq6WeNb[m
[31m-fzJPeURKTxPkLj8fmBCkctXw50SO1Ke5+1S+tvr33Jwpk9SfoVsYbmiTkRuMoE8C[m
[31m-Uumd6Jjz/WfaeEtP2C2Qg1wL5f5IJ+Tsu5kmBo40/pPk0vyXVwIDAQABo1AwTjAd[m
[31m-BgNVHQ4EFgQU0jBxVlCmvCHFoaGrEacIW+s6pCcwHwYDVR0jBBgwFoAUHS8JYOvk[m
[31m-6rULUqlcXgkr3TRwz7owDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCm[m
[31m-Fi/8E2dezg55y7CRUpuetZ/h+n149CqT85RiRReHuQpZuaOpdVHK8ARsAdE6qd1m[m
[31m-fSd7Hk9IOiXqpQEy/IdLCNr49WKI6LmUx8vuMwirL1L0ShRPrC2i+N7Jb5W3kSO5[m
[31m-7JWQ3oYh9W8bzxNHd3jdehbpi8zfPUWKdq8V0Zo3og==[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 3 (0x3)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:d3:24:1c:92:a5:bb:00:d9:b1:fb:2b:1d:7a:32:[m
[31m-                    a1:6c:49:eb:3c:2d:29:80:d6:65:8b:17:3a:f0:4b:[m
[31m-                    dc:0c:57:fb:d5:31:68:a5:e4:54:86:55:f9:1b:a8:[m
[31m-                    d7:7d:32:01:3b:cf:5c:38:2b:f5:bc:d3:8b:c8:b6:[m
[31m-                    ab:76:65:32:e6:4b:d5:e4:fd:d1:92:c8:33:6a:74:[m
[31m-                    f3:c7:ec:97:c3:c7:9f:e4:d5:55:75:b8:bd:39:ec:[m
[31m-                    2d:1f:c6:54:c8:2b:2d:17:e0:05:77:28:44:f7:dd:[m
[31m-                    e1:6e:f0:59:05:51:f5:b9:b4:fe:be:ad:40:a6:d5:[m
[31m-                    9a:c1:64:e0:9b:dd:67:e5:f1[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         0c:61:c0:c7:11:c2:f0:39:f0:76:9d:4f:43:d4:90:54:1f:26:[m
[31m-         3d:54:3d:77:5f:c0:b3:4a:c2:1b:b6:18:d2:12:8d:24:4d:76:[m
[31m-         f5:07:0b:14:3e:17:2d:42:ee:85:30:db:e3:4d:81:67:59:97:[m
[31m-         0a:b3:bb:c5:27:ea:69:c6:ee:99:5c:44:36:53:3e:c4:47:68:[m
[31m-         f8:fe:c6:53:38:fb:e7:9a:0c:3c:6c:78:93:29:d2:49:7d:29:[m
[31m-         d0:61:6e:81:9b:d6:ec:1a:e2:3e:62:62:41:bc:6d:4d:33:91:[m
[31m-         76:20:5e:32:70:08:3e:24:72:fe:b1:8a:83:57:04:19:b5:cb:[m
[31m-         99:b7[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICkDCCAfmgAwIBAgIBAzANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMTAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowZDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTIwgZ8wDQYJKoZIhvcNAQEBBQAD[m
[31m-gY0AMIGJAoGBANMkHJKluwDZsfsrHXoyoWxJ6zwtKYDWZYsXOvBL3AxX+9UxaKXk[m
[31m-VIZV+Ruo130yATvPXDgr9bzTi8i2q3ZlMuZL1eT90ZLIM2p088fsl8PHn+TVVXW4[m
[31m-vTnsLR/GVMgrLRfgBXcoRPfd4W7wWQVR9bm0/r6tQKbVmsFk4JvdZ+XxAgMBAAGj[m
[31m-UDBOMB0GA1UdDgQWBBSzC/V9URZRfig3w6IPHS8QwFGjszAfBgNVHSMEGDAWgBTS[m
[31m-MHFWUKa8IcWhoasRpwhb6zqkJzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAAxhwMcRwvA58HadT0PUkFQfJj1UPXdfwLNKwhu2GNISjSRNdvUHCxQ+Fy1C[m
[31m-7oUw2+NNgWdZlwqzu8Un6mnG7plcRDZTPsRHaPj+xlM4++eaDDxseJMp0kl9KdBh[m
[31m-boGb1uwa4j5iYkG8bU0zkXYgXjJwCD4kcv6xioNXBBm1y5m3[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.crt[m
[1mdeleted file mode 100644[m
[1mindex a69a011..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.crt[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICqTCCAhICCQClDm1WkreW4jANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQD[m
[31m-DAh0ZXN0LmNvbTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20wIBcN[m
[31m-MTQwNzIxMDMyMzQ3WhgPMjE1MTA2MTMwMzIzNDdaMIGXMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MRIwEAYDVQQLDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl[m
[31m-c3QuY29tMSAwHgYJKoZIhvcNAQkBFhFhZ2VudHpoQGdtYWlsLmNvbTCBnzANBgkq[m
[31m-hkiG9w0BAQEFAAOBjQAwgYkCgYEA6P18zUvtmaKQK2xePy8ZbFwSyTLw+jW6t9eZ[m
[31m-aiTec8X3ibN9WemrxHzkTRikxP3cAQoITRuZiQvF4Q7DO6wMkz/b0zwfgX5uedGq[m
[31m-047AJP6n/mwlDOjGSNomBLoXQzo7tVe60ikEm3ZyDUqnJPJMt3hImO5XSop4MPMu[m
[31m-Za9WhFcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQA4OBb9bOyWB1//93nSXX1mdENZ[m
[31m-IQeyTK0Dd6My76lnZxnZ4hTWrvvd0b17KLDU6JnS2N5ee3ATVkojPidRLWLIhnh5[m
[31m-0eXrcKalbO2Ce6nShoFvQCQKXN2Txmq2vO/Mud2bHAWwJALg+qi1Iih/gVYB9sct[m
[31m-FLg8zFOzRlYiU+6Mmw==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.crt.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.crt.der[m
[1mdeleted file mode 100644[m
[1mindex 0b6ef63..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.crt.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.key b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.key[m
[1mdeleted file mode 100644[m
[1mindex 6c13527..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXgIBAAKBgQDo/XzNS+2ZopArbF4/LxlsXBLJMvD6Nbq315lqJN5zxfeJs31Z[m
[31m-6avEfORNGKTE/dwBCghNG5mJC8XhDsM7rAyTP9vTPB+Bfm550arTjsAk/qf+bCUM[m
[31m-6MZI2iYEuhdDOju1V7rSKQSbdnINSqck8ky3eEiY7ldKingw8y5lr1aEVwIDAQAB[m
[31m-AoGBANgB66sKMga2SKN5nQdHS3LDCkevCutu1OWM5ZcbB4Kej5kC57xsf+tzPtab[m
[31m-emeIVGhCPOAALqB4YcT+QtMX967oM1MjcFbtH7si5oq6UYyp3i0G9Si6jIoVHz3+[m
[31m-8yOUaqwKbK+bRX8VS0YsHZmBsPK5ryN50iUwsU08nemoA94BAkEA9GS9Q5OPeFkM[m
[31m-tFxsIQ1f2FSsZAuN/1cpZgJqY+YaAN7MSPGTWyfd7nWG/Zgk3GO9/2ihh4gww+7B[m
[31m-To09GkmW4QJBAPQOHC2V+t2TA98+6Lj6+TYwcGEkhOENfVpH25mQ+kXgF/1Bd6rA[m
[31m-nosT1bdAY+SnmWXbSw6Kv5C20Em+bEX8WjcCQCSRRjhsRdVODbaW9Z7kb2jhEoJN[m
[31m-sEt6cTlQNzcHYPCsZYisjM3g4zYg47fiIfHQAsfKkhDDcfh/KvFj9LaQOEECQQCH[m
[31m-eBWYEDpSJ7rsfqT7mQQgWj7nDThdG/nK1TxGP71McBmg0Gg2dfkLRhVJRQqt74Is[m
[31m-kc9V4Rp4n6F6baL4Lh19AkEA6pZZer0kg3Kv9hjhaITIKUYdfIp9vYnDRWbQlBmR[m
[31m-atV8V9u9q2ETZvqfHpN+9Lu6NYR4yXIEIRf1bnIZ/mr9eQ==[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.key.der b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.key.der[m
[1mdeleted file mode 100644[m
[1mindex 537a4f1..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test.key.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test2.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test2.crt[m
[1mdeleted file mode 100644[m
[1mindex edc3b0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test2.crt[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIChzCCAfACCQDjCkJpJUtZmjANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZI[m
[31m-hvcNAQkBFhNvcGVucmVzdHlAZ21haWwuY29tMCAXDTE0MDkxMzAwMTgxMFoYDzIx[m
[31m-MTQwODIwMDAxODEwWjCBhjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3Ju[m
[31m-aWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCU9wZW5SZXN0eTES[m
[31m-MBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZIhvcNAQkBFhNvcGVucmVzdHlAZ21h[m
[31m-aWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDy+OVI2u5NBOeB2Cyz[m
[31m-Gnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7f[m
[31m-JrKFziJxMy4g4Kdn9G659vE7CWu/UAVjRUtc+mTBAEfjdbumizmHLG7DmnNhGl3R[m
[31m-NGiVNLsUInSMGfUlJRzZJXhI4QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAEMmRvyN[m
[31m-N7uE24Tc6TR19JadNHK8g3YGktRoXWiqd/y0HY4NRPgvnK/nX7CY/wXa1j+uDO8K[m
[31m-e6/Ldm5RZrjtvfHJmTSAu8zkqTJz8bqRDH7kzL5Ni2Ky2x8r9dtB0ImpOiSlwvZN[m
[31m-snMvbrxEdwBiqlC9prV2f9aG+ACo1KnPL0j6[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test2.key b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test2.key[m
[1mdeleted file mode 100644[m
[1mindex 82ce6ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/cert/test2.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXAIBAAKBgQDy+OVI2u5NBOeB2CyzGnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4[m
[31m-PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7fJrKFziJxMy4g4Kdn9G659vE7CWu/UAVj[m
[31m-RUtc+mTBAEfjdbumizmHLG7DmnNhGl3RNGiVNLsUInSMGfUlJRzZJXhI4QIDAQAB[m
[31m-AoGAEqBB83PVENJvbOTFiHVfUAjGtr3R/Wnwd4jOcjHHZB3fZ9sjVoxJntxfp3s1[m
[31m-dwZir2rxlqVS6i3VAFiGiVTOGo2Vvzhw2J7f58twCECmnLb2f863AkGEYe4dAndD[m
[31m-GHGD0WI0CBMD1sT18YCj561o0Wol5deWH0gM9pr2N3HkeIECQQD6hUKFlFhrpaHP[m
[31m-WNJsl6BxgE6pB5kxLcMcpIQ7P+kHUvtyvCJl5QZJqPrpPGjRsAI5Ph92rpsp/zDp[m
[31m-/IZNWGVjAkEA+Ele31Rt+XbV32MrLKZgBDBk+Pzss5LTn9fZ5v1k/7hrMk2VVWvk[m
[31m-AD6n5QiGe/g59woANpPb1T9l956SBf0d6wJABTXOS17pc9uvANP1FGMW6CVl/Wf2[m
[31m-DKrJ+weE5IKQwyE7r4gwIvRfbBrClSU3fNzvPueG2f4JphbzmnoxBNzIxwJAYivY[m
[31m-mGNwzHehXx99/byXMHDWK+EN0n8WsBgP75Z3rekEcbJdfpYXY8Via1vwmOnwOW65[m
[31m-4NqbzHix37PSNw37GwJBALxaGNpREO2Tk+oWOvsD2QyviMVae3mXAJHc6nLVdKDM[m
[31m-q0YvDT6VdeNYYFTkAuzJacsVXOpn6AnUMFj0OBedMhc=[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/count.t[m
[1mdeleted file mode 100644[m
[1mindex 74e61bc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/count.t[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module size[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local base = require "resty.core.base"[m
[31m-            local n = 0[m
[31m-            for _, _ in pairs(base) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("base size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m-[m
[31m---- stap2[m
[31m-global c[m
[31m-probe process("$LIBLUA_PATH").function("rehashtab") {[m
[31m-    c++[m
[31m-    printf("rehash: %d\n", c)[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-base size: 16[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ctx.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ctx.t[m
[1mdeleted file mode 100644[m
[1mindex a848ea0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ctx.t[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;\$prefix/html/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get ngx.ctx[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.ctx.foo = i[m
[31m-            end[m
[31m-            ngx.say("ctx.foo = ", ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ctx.foo = 100[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set ngx.ctx[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.ctx = {foo = i}[m
[31m-            end[m
[31m-            ngx.say("ctx.foo = ", ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ctx.foo = 100[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/decode-base64.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/decode-base64.t[m
[1mdeleted file mode 100644[m
[1mindex 632d080..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/decode-base64.t[m
[1m+++ /dev/null[m
[36m@@ -1,188 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64("aGVsbG8=")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set base64 (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64("")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body eval: "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set base64 (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64("My4xNA==")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-3.14[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set base64 (boolean)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64("dHJ1ZQ==")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-true[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: string (buf size just smaller than 4096)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64(string.rep("a", 5460))[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.say("bad base64 string")[m
[31m-            else[m
[31m-                ngx.say(string.len(s))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-4095[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: string (buf size just a bit bigger than 4096)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64(string.rep("a", 5462))[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.say("bad base64 string")[m
[31m-            else[m
[31m-                ngx.say(string.len(s))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-4096[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/encode-base64.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/encode-base64.t[m
[1mdeleted file mode 100644[m
[1mindex f6bda69..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/encode-base64.t[m
[1m+++ /dev/null[m
[36m@@ -1,228 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set base64 (string)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64("hello")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-aGVsbG8=[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set base64 (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(nil)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body eval: "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set base64 (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(3.14)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-My4xNA==[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set base64 (boolean)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(true)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-dHJ1ZQ==[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set base64 (buf is a little larger than 4096)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(string.rep("a", 3073))[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-4100[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set base64 (buf is just 4096)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(string.rep("a", 3071))[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-4096[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set base64 (number) without padding (explicitly specified)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 200 do[m
[31m-                s = ngx.encode_base64(3.14, true)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-My4xNA[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set base64 (number) with padding (explictly specified)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 200 do[m
[31m-                s = ngx.encode_base64(3.14, false)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-My4xNA==[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/exit.t[m
[1mdeleted file mode 100644[m
[1mindex 86cebb9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(120);[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;\$prefix/html/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-qr/ -- NYI: (?!FastFunc coroutine.yield)/,[m
[31m-" bad argument"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: call ngx.exit() from a custom lua module[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            foo.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local exit = ngx.exit[m
[31m-[m
[31m-local function go()[m
[31m-    exit(403)[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m-return { go = go }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-qr/ -- NYI: (?!FastFunc coroutine.yield)/,[m
[31m-" bad argument"][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/md5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/md5.t[m
[1mdeleted file mode 100644[m
[1mindex 73a5f16..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/md5.t[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local v = require "jit.v"[m
[31m-        v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        require "resty.core"[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set md5 hello[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5("hello")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   1 content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nil string to ngx.md5[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5(nil)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   1 content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: empty string to ngx.md5[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5("")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   1 content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: number to ngx.md5[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5(3.14)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-4beed3b9c4a886067de0e3a094246f78[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   1 content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/md5_bin.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/md5_bin.t[m
[1mdeleted file mode 100644[m
[1mindex decc7e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/md5_bin.t[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set md5_bin (string)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5_bin("hello")[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set md5_bin (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5_bin(nil)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set md5_bin (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5_bin(3.14)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set md5_bin (boolean)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5_bin(true)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/misc.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/misc.t[m
[1mdeleted file mode 100644[m
[1mindex 213731e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/misc.t[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6 + 1);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;\$prefix/html/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.is_subrequest[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        return 201;[m
[31m-        header_filter_by_lua '[m
[31m-            local rc[m
[31m-            for i = 1, 100 do[m
[31m-                rc = ngx.is_subrequest[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "is subrequest: ", rc)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- error_code: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-["is subrequest: false,",[m
[31m-qr/\[TRACE\s+\d+\s+header_filter_by_lua:3 loop\]/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.headers_sent (false)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local rc[m
[31m-            for i = 1, 100 do[m
[31m-                rc = ngx.headers_sent[m
[31m-            end[m
[31m-            ngx.say("headers sent: ", rc)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-headers sent: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.headers_sent (true)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            local rc[m
[31m-            for i = 1, 100 do[m
[31m-                rc = ngx.headers_sent[m
[31m-            end[m
[31m-            ngx.say("headers sent: ", rc)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-headers sent: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ocsp.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ocsp.t[m
[1mdeleted file mode 100644[m
[1mindex f66a7ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ocsp.t[m
[1m+++ /dev/null[m
[36m@@ -1,1549 +0,0 @@[m
[31m-# vim:set ft=ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(10140);[m
[31m-#workers(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6 + 13);[m
[31m-[m
[31m-our $CWD = cwd();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-$ENV{TEST_NGINX_LUA_PACKAGE_PATH} = "$::CWD/lib/?.lua;;";[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get OCSP responder (good case)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data)[m
[31m-            if not url then[m
[31m-                ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP url found: http://127.0.0.1:8888/ocsp?foo=1,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get OCSP responder (not found)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data)[m
[31m-            if not url then[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.WARN, "OCSP responder not found")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP responder not found[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get OCSP responder (no issuer cert at all)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/test-com.crt"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data)[m
[31m-            if not url then[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.WARN, "OCSP responder not found")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to get OCSP responder: no issuer certificate in chain[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get OCSP responder (issuer cert not next to the leaf cert)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/wrong-issuer-order-chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data)[m
[31m-            if not url then[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.WARN, "OCSP responder not found")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to get OCSP responder: issuer certificate not next to leaf[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get OCSP responder (truncated)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data, 6)[m
[31m-            if not url then[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.WARN, "OCSP responder not found")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if err then[m
[31m-                ngx.log(ngx.WARN, "still get an error: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP url found: http:/,[m
[31m-still get an error: truncated[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: create OCSP request (good)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req, err = ocsp.create_ocsp_request(cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP request created with length ", #req)[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-req.der", "r"))[m
[31m-            local expected = assert(f:read("*a"))[m
[31m-            f:close()[m
[31m-            if req ~= expected then[m
[31m-                ngx.log(ngx.ERR, "ocsp responder: got unexpected OCSP request")[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP request created with length 68[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: create OCSP request (buffer too small)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req, err = ocsp.create_ocsp_request(cert_data, 67)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP request created with length ", #req)[m
[31m-            local bytes = {string.byte(req, 1, #req)}[m
[31m-            for i, byte in ipairs(bytes) do[m
[31m-                bytes[i] = string.format("%02x", byte)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "OCSP request content: ", table.concat(bytes, " "))[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to create OCSP request: output buffer too small: 68 > 67[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: create OCSP request (empty string cert chain)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local cert_data = ""[m
[31m-            local req, err = ocsp.create_ocsp_request(cert_data, 67)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP request created with length ", #req)[m
[31m-            local bytes = {string.byte(req, 1, #req)}[m
[31m-            for i, byte in ipairs(bytes) do[m
[31m-                bytes[i] = string.format("%02x", byte)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "OCSP request content: ", table.concat(bytes, " "))[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to create OCSP request: d2i_X509_bio() failed[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: create OCSP request (no issuer cert in the chain)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/test-com.crt"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req, err = ocsp.create_ocsp_request(cert_data, 67)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP request created with length ", #req)[m
[31m-            local bytes = {string.byte(req, 1, #req)}[m
[31m-            for i, byte in ipairs(bytes) do[m
[31m-                bytes[i] = string.format("%02x", byte)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "OCSP request content: ", table.concat(bytes, " "))[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to create OCSP request: no issuer certificate in chain[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: validate good OCSP response[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP response validation ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: fail to validate OCSP response - no issuer cert[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/test-com.crt"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to validate OCSP response: no issuer certificate in chain[m
[31m-[m
[31m---- no_error_log[m
[31m-OCSP response validation ok[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: validate good OCSP response - no certs in response[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp-no-certs.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP response validation ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: validate OCSP response - OCSP response signed by an unknown cert and the OCSP response contains the unknown cert[m
[31m-[m
[31m-FIXME: we should complain in this case.[m
[31m-[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp-signed-by-orphaned.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP response validation ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: fail to validate OCSP response - OCSP response signed by an unknown cert and the OCSP response does not contain the unknown cert[m
[31m-[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp-signed-by-orphaned-no-certs.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to validate OCSP response: OCSP_basic_verify() failed[m
[31m-[m
[31m---- no_error_log[m
[31m-OCSP response validation ok[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: fail to validate OCSP response - OCSP response returns revoked status[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/revoked-chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/revoked-ocsp-resp.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to validate OCSP response: certificate status "revoked" in the OCSP response[m
[31m-[m
[31m---- no_error_log[m
[31m-OCSP response validation ok[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: good status req from client[m
[31m-FIXME: check the OCSP staple actually received by the ssl client[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp.der"))[m
[31m-            local resp = assert(f:read("*a"))[m
[31m-            f:close()[m
[31m-[m
[31m-            print("resp len: ", #resp)[m
[31m-[m
[31m-            local ok, err = ocsp.set_ocsp_status_resp(resp)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set ocsp status resp: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "ocsp status resp set ok: ", err)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true, true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ocsp status resp set ok: nil,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: no status req from client[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp.der"))[m
[31m-            local resp = assert(f:read("*a"))[m
[31m-            f:close()[m
[31m-[m
[31m-            print("resp len: ", #resp)[m
[31m-[m
[31m-            local ok, err = ocsp.set_ocsp_status_resp(resp)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set ocsp status resp: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "ocsp status resp set ok: ", err)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ocsp status resp set ok: no status req,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-find.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-find.t[m
[1mdeleted file mode 100644[m
[1mindex 3b2c889..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-find.t[m
[1m+++ /dev/null[m
[36m@@ -1,263 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched, no submatch, no jit compile, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local from, to, err[m
[31m-            local find = ngx.re.find[m
[31m-            local s = "a"[m
[31m-            for i = 1, 100 do[m
[31m-                from, to, err = find(s, "a")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not from then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("from: ", from)[m
[31m-            ngx.say("to: ", to)[m
[31m-            ngx.say("matched: ", string.sub(s, from, to))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 1[m
[31m-matched: a[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):5 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: matched, no submatch, jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local from, to, err[m
[31m-            local find = ngx.re.find[m
[31m-            local s = "a"[m
[31m-            for i = 1, 200 do[m
[31m-                from, to, err = find(s, "a", "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not from then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("from: ", from)[m
[31m-            ngx.say("to: ", to)[m
[31m-            ngx.say("matched: ", string.sub(s, from, to))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 1[m
[31m-matched: a[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):5 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: not matched, no submatch, jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local from, to, err[m
[31m-            local find = ngx.re.find[m
[31m-            local s = "b"[m
[31m-            for i = 1, 200 do[m
[31m-                from, to, err = find(s, "a", "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not from then[m
[31m-                ngx.say("no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("from: ", from)[m
[31m-            ngx.say("to: ", to)[m
[31m-            ngx.say("matched: ", string.sub(s, from, to))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-no match[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):5 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: nil submatch (2nd)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err[m
[31m-            for i = 1, 100 do[m
[31m-                from, to, err = ngx.re.find(s, "([0-9])|(hello world)", "jo", nil, 2)[m
[31m-            end[m
[31m-            if from or to then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: nil submatch (1st)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err[m
[31m-            for i = 1, 400 do[m
[31m-                from, to, err = ngx.re.find(s, "(hello world)|([0-9])", "jo", nil, 1)[m
[31m-            end[m
[31m-            if from or to then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: specify the group (2)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err[m
[31m-            for i = 1, 100 do[m
[31m-                from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 2)[m
[31m-            end[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 9[m
[31m-to: 11[m
[31m-matched: 234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-match.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-match.t[m
[1mdeleted file mode 100644[m
[1mindex 02a856c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-match.t[m
[1m+++ /dev/null[m
[36m@@ -1,593 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 1);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched, no submatch, no jit compile, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 400 do[m
[31m-                m, err = match("a", "a")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            -- ngx.say("$2: ", m[2])[m
[31m-            -- ngx.say("$3: ", m[3])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-matched: a[m
[31m-$1: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: matched, no submatch, jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 400 do[m
[31m-                m, err = match("a", "a", "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-matched: a[m
[31m-$1: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: not matched, no submatch, jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 200 do[m
[31m-                m, err = match("b", "a", "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.say("no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-no match[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched, no submatch, no jit compile, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("b", "a")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.say("no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-no match[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: submatches, matched, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("hello, 1234", [[(\\d)(\\d+)]])[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            ngx.say("$2: ", m[2])[m
[31m-            ngx.say("$3: ", m[3])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-matched: 1234[m
[31m-$1: 1[m
[31m-$2: 234[m
[31m-$3: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: submatches, matched, with regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("hello, 1234", [[(\\d)(\\d+)]], "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            ngx.say("$2: ", m[2])[m
[31m-            ngx.say("$3: ", m[3])[m
[31m-            -- ngx.say(table.maxn(m))[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-matched: 1234[m
[31m-$1: 1[m
[31m-$2: 234[m
[31m-$3: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: named subpatterns w/ extraction (matched)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z]+), [0-9]+", "jo")[m
[31m-            end[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-hello[m
[31m-nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: named subpatterns w/ extraction (use of duplicate names in non-duplicate mode)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 200 do[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "jo")[m
[31m-            end[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-error: pcre_compile\(\) failed: two named subpatterns have the same name[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: named subpatterns w/ extraction (use of duplicate names in duplicate mode)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-            end[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first, "|"))[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like[m
[31m-hello, 1234[m
[31m-h[m
[31m-ello[m
[31m-h|ello[m
[31m-nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: captures input table in ngx.re.match[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local new_tab = require "table.new"[m
[31m-            local clear_tab = require "table.clear"[m
[31m-            local m[m
[31m-            local res = new_tab(5, 0)[m
[31m-            res[5] = "hello"[m
[31m-            for i = 1, 100 do[m
[31m-                m = ngx.re.match("hello, 1234", "([0-9])([0-9])([0-9])([0-9])", "jo", nil, res)[m
[31m-            end[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-                ngx.say(m[4])[m
[31m-                ngx.say(m[5])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: unmatched captures are false[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello!", "(hello)(, .+)?(!)", "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello![m
[31m-hello[m
[31m-false[m
[31m-![m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: unmatched trailing captures are false[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello", "(hello)(, .+)?(!)?", "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-false[m
[31m-false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: unmatched named captures are false[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello!", "(?<first>hello)(?<second>, .+)?(?<third>!)", "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-                ngx.say(m.third)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello![m
[31m-hello[m
[31m-false[m
[31m-![m
[31m-hello[m
[31m-false[m
[31m-![m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: subject is not a string type[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match(12345, [=[(\\d+)]=], "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-12345[m
[31m-12345[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'subj' (a number value)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: subject is not a string type[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match(12345, "123", "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-123[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'regex' (a number value)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-sub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-sub.t[m
[1mdeleted file mode 100644[m
[1mindex f8af691..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/re-sub.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 9);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sub, no submatch, no jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local sub = ngx.re.sub[m
[31m-            for i = 1, 350 do[m
[31m-                s, n, err = sub("abcbd", "b", "B", "jo")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-s: aBcbd[m
[31m-n: 1[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sub, no submatch, no jit compile, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local sub = ngx.re.sub[m
[31m-            for i = 1, 400 do[m
[31m-                s, n, err = sub("abcbd", "b", "B")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-s: aBcbd[m
[31m-n: 1[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: func + submatches[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local function f(m)[m
[31m-                return "[" .. m[0] .. "(" .. m[1] .. ")]"[m
[31m-            end[m
[31m-            local sub = ngx.re.sub[m
[31m-            for i = 1, 200 do[m
[31m-                s, n, err = sub("abcbd", "b(c)", f, "jo")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-s: a[bc(c)]bd[m
[31m-n: 1[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-"bad argument type",[m
[31m-qr/NYI (?!bytecode 51 at)/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: replace template + submatches[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local sub = ngx.re.sub[m
[31m-            for i = 1, 350 do[m
[31m-                s, n, err = sub("abcbd", "b(c)", "[$0($1)]", "jo")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-s: a[bc(c)]bd[m
[31m-n: 1[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: replace template + submatches (exceeding buffers)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local gsub = ngx.re.gsub[m
[31m-            local subj = string.rep("bcbd", 2048)[m
[31m-            for i = 1, 10 do[m
[31m-                s, n, err = gsub(subj, "b(c)", "[$0($1)]", "jo")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body eval[m
[31m-"s: " . ("[bc(c)]bd" x 2048) .[m
[31m-"\nn: 2048\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.re.gsub: use of ngx.req.get_headers in the user callback[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        local data = [[[m
[31m-            INNER[m
[31m-            INNER[m
[31m-]][m
[31m-[m
[31m-        -- ngx.say(data)[m
[31m-[m
[31m-        local res =  ngx.re.gsub(data, "INNER", function(inner_matches)[m
[31m-            local header = ngx.req.get_headers()["Host"][m
[31m-            -- local header = ngx.var["http_HEADER"][m
[31m-            return "INNER_REPLACED"[m
[31m-        end, "s")[m
[31m-[m
[31m-        ngx.print(res)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-            INNER_REPLACED[m
[31m-            INNER_REPLACED[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.re.gsub: use of ngx.var in the user callback[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        local data = [[[m
[31m-            INNER[m
[31m-            INNER[m
[31m-]][m
[31m-[m
[31m-        -- ngx.say(data)[m
[31m-[m
[31m-        local res =  ngx.re.gsub(data, "INNER", function(inner_matches)[m
[31m-            -- local header = ngx.req.get_headers()["Host"][m
[31m-            local header = ngx.var["http_HEADER"][m
[31m-            return "INNER_REPLACED"[m
[31m-        end, "s")[m
[31m-[m
[31m-        ngx.print(res)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-            INNER_REPLACED[m
[31m-            INNER_REPLACED[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.re.gsub: recursive calling (github openresty/lua-nginx-module#445)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        function test()[m
[31m-            local data = [[[m
[31m-                OUTER {FIRST}[m
[31m-]][m
[31m-[m
[31m-            local p1 = "(OUTER)(.+)"[m
[31m-            local p2 = "{([A-Z]+)}"[m
[31m-[m
[31m-            ngx.print(data)[m
[31m-[m
[31m-            local res =  ngx.re.gsub(data, p1, function(m)[m
[31m-                -- ngx.say("pre: m[1]: [", m[1], "]")[m
[31m-                -- ngx.say("pre: m[2]: [", m[2], "]")[m
[31m-[m
[31m-                local res = ngx.re.gsub(m[2], p2, function(_)[m
[31m-                    return "REPLACED"[m
[31m-                end, "")[m
[31m-[m
[31m-                -- ngx.say("post: m[1]: [", m[1], "]")[m
[31m-                -- ngx.say("post m[2]: [", m[2], "]")[m
[31m-                return m[1] .. res[m
[31m-            end, "")[m
[31m-[m
[31m-            ngx.print(res)[m
[31m-        end[m
[31m-[m
[31m-        test()[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-                OUTER {FIRST}[m
[31m-                OUTER REPLACED[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: string replace subj is not a string type[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-			local newstr, n, err = ngx.re.sub(1234, "([0-9])[0-9]", 5, "jo")[m
[31m-[m
[31m-			ngx.say(newstr)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-534[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'subj' (a number value)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: func replace return is not a string type (ngx.re.sub)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-			local lookup = function(m)[m
[31m-				-- note we are returning a number type here[m
[31m-				return 5[m
[31m-			end[m
[31m-[m
[31m-			local newstr, n, err = ngx.re.sub("hello, 1234", "([0-9])[0-9]", lookup, "jo")[m
[31m-			ngx.say(newstr)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 534[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'bit' (a number value)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: func replace return is not a string type (ngx.re.gsub)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-			local lookup = function(m)[m
[31m-				-- note we are returning a number type here[m
[31m-				return 5[m
[31m-			end[m
[31m-[m
[31m-			local newstr, n, err = ngx.re.gsub("hello, 1234", "([0-9])[0-9]", lookup, "jo")[m
[31m-			ngx.say(newstr)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 55[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'bit' (a number value)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/request.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/request.t[m
[1mdeleted file mode 100644[m
[1mindex 3d13035..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/request.t[m
[1m+++ /dev/null[m
[36m@@ -1,573 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 10);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on("b", "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.req.get_headers[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local headers[m
[31m-            for i = 1, 200 do[m
[31m-                headers = ngx.req.get_headers()[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(headers) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                ngx.say(k, ": ", headers[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-bar: bar[m
[31m-baz: baz[m
[31m-connection: close[m
[31m-foo: foo[m
[31m-host: localhost[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Bar: bar[m
[31m-Baz: baz[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ .*? -> 1\]/[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-qr/ -- NYI: (?!return to lower frame)/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.req.get_headers (raw)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local headers[m
[31m-            for i = 1, 200 do[m
[31m-                headers = ngx.req.get_headers(100, true)[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(headers) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                ngx.say(k, ": ", headers[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Bar: bar[m
[31m-Baz: baz[m
[31m-Connection: close[m
[31m-Foo: foo[m
[31m-Host: localhost[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Bar: bar[m
[31m-Baz: baz[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ .*? -> 1\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.req.get_headers (count is 2)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local headers[m
[31m-            for i = 1, 200 do[m
[31m-                headers = ngx.req.get_headers(2, true)[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(headers) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                ngx.say(k, ": ", headers[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Connection: close[m
[31m-Host: localhost[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Bar: bar[m
[31m-Baz: baz[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.req.get_headers (metatable)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local headers, header[m
[31m-            for i = 1, 100 do[m
[31m-                headers = ngx.req.get_headers()[m
[31m-                header = headers["foo_BAR"][m
[31m-            end[m
[31m-            ngx.say("foo_BAR: ", header)[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(headers) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                ngx.say(k, ": ", headers[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-foo_BAR: foo[m
[31m-baz: baz[m
[31m-connection: close[m
[31m-foo-bar: foo[m
[31m-host: localhost[m
[31m---- more_headers[m
[31m-Foo-Bar: foo[m
[31m-Baz: baz[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ .*? -> \d\]/[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-qr/ -- NYI: (?!return to lower frame at)(?!C function 0x[0-9a-f]+ at content_by_lua\(nginx.conf:\d+\):15)/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.req.get_uri_args[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local args[m
[31m-            for i = 1, 200 do[m
[31m-                args = ngx.req.get_uri_args()[m
[31m-            end[m
[31m-            if type(args) ~= "table" then[m
[31m-                ngx.say("bad args type found: ", args)[m
[31m-                return[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(args) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                local v = args[k][m
[31m-                if type(v) == "table" then[m
[31m-                    ngx.say(k, ": ", table.concat(v, ", "))[m
[31m-                else[m
[31m-                    ngx.say(k, ": ", v)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t?a=3%200&foo%20bar=&a=hello&blah[m
[31m---- response_body[m
[31m-a: 3 0, hello[m
[31m-blah: true[m
[31m-foo bar: [m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ .*? -> \d+\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m---- wait: 0.2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.req.get_uri_args (empty)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local args[m
[31m-            for i = 1, 200 do[m
[31m-                args = ngx.req.get_uri_args()[m
[31m-            end[m
[31m-            if type(args) ~= "table" then[m
[31m-                ngx.say("bad args type found: ", args)[m
[31m-                return[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(args) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                local v = args[k][m
[31m-                if type(v) == "table" then[m
[31m-                    ngx.say(k, ": ", table.concat(v, ", "))[m
[31m-                else[m
[31m-                    ngx.say(k, ": ", v)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t?[m
[31m---- response_body[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.req.start_time()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.start_time()[m
[31m-            end[m
[31m-            ngx.sleep(0.10)[m
[31m-            local elapsed = ngx.now() - t[m
[31m-            ngx.say(t > 1399867351)[m
[31m-            ngx.say(">= 0.099: ", elapsed >= 0.099)[m
[31m-            ngx.say("< 0.11: ", elapsed < 0.11)[m
[31m-            -- ngx.say(t, " ", elapsed)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m->= 0.099: true[m
[31m-< 0.11: true[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.req.get_method (GET)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-method: GET[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.get_method (OPTIONS)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-OPTIONS /t[m
[31m---- response_body[m
[31m-method: OPTIONS[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.req.get_method (POST)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-            ngx.req.discard_body()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- response_body[m
[31m-method: POST[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.req.get_method (unknown method)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-            ngx.req.discard_body()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-BLAH /t[m
[31m-hello[m
[31m---- response_body[m
[31m-method: BLAH[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.req.get_method (CONNECT)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-            ngx.req.discard_body()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-CONNECT /t[m
[31m-hello[m
[31m---- response_body[m
[31m-method: CONNECT[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.req.set_method (GET -> PUT)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                ngx.req.set_method(ngx.HTTP_PUT)[m
[31m-            end[m
[31m-            ngx.say("method: ", ngx.req.get_method())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-method: PUT[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.req.set_header (single number value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                ngx.req.set_header("foo", i)[m
[31m-            end[m
[31m-            ngx.say("header foo: ", ngx.var.http_foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-header foo: 500[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.req.set_header (nil value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                ngx.req.set_header("foo", nil)[m
[31m-            end[m
[31m-            ngx.say("header foo: ", type(ngx.var.http_foo))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-header foo: nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.req.clear_header[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("foo", "hello")[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.clear_header("foo")[m
[31m-            end[m
[31m-            ngx.say("header foo: ", type(ngx.var.http_foo))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-header foo: nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/response.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/response.t[m
[1mdeleted file mode 100644[m
[1mindex 8851018..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/response.t[m
[1m+++ /dev/null[m
[36m@@ -1,234 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on("b", "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: write to ngx.header.HEADER (single value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.header["Foo"] = i[m
[31m-            end[m
[31m-            ngx.say("Foo: ", ngx.header["Foo"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: 100[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: write to ngx.header.HEADER (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 200 do[m
[31m-                ngx.header["Foo"] = i[m
[31m-                ngx.header["Foo"] = nil[m
[31m-            end[m
[31m-            ngx.say("Foo: ", ngx.header["Foo"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: write to ngx.header.HEADER (multi-value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 200 do[m
[31m-                ngx.header["Foo"] = {i, i + 1}[m
[31m-            end[m
[31m-            local v = ngx.header["Foo"][m
[31m-            if type(v) == "table" then[m
[31m-                ngx.say("Foo: ", table.concat(v, ", "))[m
[31m-            else[m
[31m-                ngx.say("Foo: ", v)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: 200, 201[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: read from ngx.header.HEADER (single value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.header["Foo"] = i[m
[31m-                v = ngx.header["Foo"][m
[31m-            end[m
[31m-            ngx.say("Foo: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: 100[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-qr/ -- NYI: (?!return to lower frame)/,[m
[31m-"stitch",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: read from ngx.header.HEADER (not found)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            for i = 1, 100 do[m
[31m-                v = ngx.header["Foo"][m
[31m-            end[m
[31m-            ngx.say("Foo: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: read from ngx.header.HEADER (multi-value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = {"foo", "bar"}[m
[31m-            local v[m
[31m-            for i = 1, 100 do[m
[31m-                v = ngx.header["Foo"][m
[31m-            end[m
[31m-            ngx.say("Foo: ", table.concat(v, ", "))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: foo, bar[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set multi values to cache-control and override it with multiple values[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store" }[m
[31m-            ngx.header.cache_control = { "no-cache", "blah", "foo" }[m
[31m-            local v[m
[31m-            for i = 1, 400 do[m
[31m-                v = ngx.header.cache_control[m
[31m-            end[m
[31m-            ngx.say("Cache-Control: ", table.concat(v, ", "))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: no-cache, blah, foo[m
[31m---- response_body_like chop[m
[31m-^Cache-Control: no-cache[;,] blah[;,] foo$[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):5 (?:loop|-> \d+)\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/semaphore.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/semaphore.t[m
[1mdeleted file mode 100644[m
[1mindex 18c8389..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/semaphore.t[m
[1m+++ /dev/null[m
[36m@@ -1,1843 +0,0 @@[m
[31m-# vim:set ft=ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(10140);[m
[31m-#workers(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 3);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-$ENV{TEST_NGINX_LUA_PACKAGE_PATH} = "\"$pwd/lib/?.lua;;\"";[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic semaphore in uthread[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new()[m
[31m-[m
[31m-            local function sem_wait()[m
[31m-                ngx.say("enter waiting")[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.say("err: ", err)[m
[31m-                else[m
[31m-                    ngx.say("wait success")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local co = ngx.thread.spawn(sem_wait)[m
[31m-[m
[31m-            ngx.say("back in main thread")[m
[31m-[m
[31m-            sem:post()[m
[31m-[m
[31m-            ngx.say("still in main thread")[m
[31m-[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            ngx.say("main thread end")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-enter waiting[m
[31m-back in main thread[m
[31m-still in main thread[m
[31m-wait success[m
[31m-main thread end[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: semaphore wait order[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new()[m
[31m-[m
[31m-            local function sem_wait(id)[m
[31m-                ngx.say("enter waiting, id: ", id)[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.say("err: ", err)[m
[31m-                else[m
[31m-                    ngx.say("wait success, id: ", id)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local co1 = ngx.thread.spawn(sem_wait, 1)[m
[31m-            local co2 = ngx.thread.spawn(sem_wait, 2)[m
[31m-[m
[31m-            ngx.say("back in main thread")[m
[31m-[m
[31m-            sem:post(2)[m
[31m-[m
[31m-            local ok, err = sem:wait(0)[m
[31m-            if ok then[m
[31m-                ngx.say("wait success in main thread")[m
[31m-            else[m
[31m-                ngx.say("wait failed in main thread: ", err) -- busy[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("still in main thread")[m
[31m-[m
[31m-            local ok, err = sem:wait(0.01)[m
[31m-            if ok then[m
[31m-                ngx.say("wait success in main thread")[m
[31m-            else[m
[31m-                ngx.say("wait failed in main thread: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            ngx.say("main thread end")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-enter waiting, id: 1[m
[31m-enter waiting, id: 2[m
[31m-back in main thread[m
[31m-wait failed in main thread: timeout[m
[31m-still in main thread[m
[31m-wait success, id: 1[m
[31m-wait success, id: 2[m
[31m-wait failed in main thread: timeout[m
[31m-main thread end[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: semaphore wait time=0[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(1)[m
[31m-[m
[31m-            local function wait_1s()[m
[31m-                ngx.say("enter 1s wait")[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.say("err in wait 1s: ", err)[m
[31m-                else[m
[31m-                    ngx.say("wait success in 1s wait")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function wait_0()[m
[31m-                local ok, err = sem:wait(0)[m
[31m-                if not ok then[m
[31m-                    ngx.say("err: ", err)[m
[31m-                else[m
[31m-                    ngx.say("wait success")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            wait_0()[m
[31m-            wait_0()[m
[31m-[m
[31m-            local co = ngx.thread.spawn(wait_1s)[m
[31m-[m
[31m-            ngx.say("back in main thread")[m
[31m-[m
[31m-            wait_0()[m
[31m-[m
[31m-            sem:post(2)[m
[31m-[m
[31m-            wait_0()[m
[31m-[m
[31m-            ngx.say("still in main thread")[m
[31m-[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            wait_0()[m
[31m-[m
[31m-            ngx.say("main thread end")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-wait success[m
[31m-err: timeout[m
[31m-enter 1s wait[m
[31m-back in main thread[m
[31m-err: timeout[m
[31m-err: timeout[m
[31m-still in main thread[m
[31m-wait success in 1s wait[m
[31m-wait success[m
[31m-main thread end[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: basic semaphore in subrequest[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua_block {[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/sem_wait"},[m
[31m-                { "/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local g = package.loaded["semaphore_test"] or {}[m
[31m-            package.loaded["semaphore_test"] = g[m
[31m-[m
[31m-            if not g.test then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    return[m
[31m-                end[m
[31m-                g.test = sem[m
[31m-            end[m
[31m-            local sem = g.test[m
[31m-            local ok, err = sem:wait(1)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local g = package.loaded["semaphore_test"] or {}[m
[31m-            package.loaded["semaphore_test"] = g[m
[31m-[m
[31m-            if not g.test then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    ngx.exit(500)[m
[31m-                end[m
[31m-                g.test = sem[m
[31m-            end[m
[31m-            local sem = g.test[m
[31m-            ngx.sleep(0.001)[m
[31m-            collectgarbage("collect")[m
[31m-            sem:post()[m
[31m-            ngx.print("post")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: semaphore.new in init_by_lua* (w/o shdict)[m
[31m---- http_config[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, err)[m
[31m-        else[m
[31m-            ngx.log(ngx.WARN, "sema created: ", tostring(sem))[m
[31m-        end[m
[31m-        sem:post(2)[m
[31m-        package.loaded.my_sema = sem[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.my_sema[m
[31m-            ngx.say("sem count: ", sem:count())[m
[31m-            -- sem:post(1)[m
[31m-            local ok, err = sem:wait(0)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("waited successfully.")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like[m
[31m-sem count: [12][m
[31m-waited successfully.[m
[31m---- grep_error_log eval[m
[31m-qr/\[lua\] init_by_lua:\d+: sema created: table: 0x[a-f0-9]+/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-qr/\[lua\] init_by_lua:\d+: sema created: table: 0x[a-f0-9]+/,[m
[31m-"",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: semaphore.new in init_by_lua* (with shdict)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, err)[m
[31m-        else[m
[31m-            ngx.log(ngx.WARN, "sema created: ", tostring(sem))[m
[31m-        end[m
[31m-        sem:post(2)[m
[31m-        package.loaded.my_sema = sem[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.my_sema[m
[31m-            ngx.say("sem count: ", sem:count())[m
[31m-            -- sem:post(1)[m
[31m-            local ok, err = sem:wait(0)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("waited successfully.")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like[m
[31m-sem count: [12][m
[31m-waited successfully.[m
[31m---- grep_error_log eval[m
[31m-qr/\[lua\] init_by_lua:\d+: sema created: table: 0x[a-f0-9]+/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-qr/\[lua\] init_by_lua:\d+: sema created: table: 0x[a-f0-9]+/,[m
[31m-"",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: semaphore in init_worker_by_lua (wait is not allowed)[m
[31m---- http_config[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_worker_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, "sem new: ", err)[m
[31m-        end[m
[31m-[m
[31m-        sem:post(1)[m
[31m-[m
[31m-        local count = sem:count()[m
[31m-        ngx.log(ngx.ERR, "sem count: ", count)[m
[31m-[m
[31m-        local ok, err = sem:wait(0.1)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "sem wait: ", err)[m
[31m-        end[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo "ok";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem \w+: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem count: 1,[m
[31m-sem wait: API disabled in the context of init_worker_by_lua*,[m
[31m-",[m
[31m-"",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: semaphore in init_worker_by_lua (new and post)[m
[31m---- http_config[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_worker_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, "sem new: ", err)[m
[31m-        end[m
[31m-[m
[31m-        sem:post(2)[m
[31m-[m
[31m-        local count = sem:count()[m
[31m-        ngx.log(ngx.WARN, "sem count: ", count)[m
[31m-[m
[31m-        package.loaded.my_sema = sem[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.my_sema[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("sem wait successfully.")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sem wait successfully.[m
[31m---- grep_error_log eval: qr/sem \w+: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem count: 2,[m
[31m-",[m
[31m-""[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: semaphore in set_by_lua (wait is not allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set_by_lua_block $res {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-        echo "ok";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of set_by_lua*,[m
[31m-",[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of set_by_lua*,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: semaphore in rewrite_by_lua (all allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sem:wait(0.01)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-        echo "ok";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: semaphore in access_by_lua (all allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sem:wait(0.01)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-        echo "ok";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: semaphore in content_by_lua (all allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sem:wait(0.01)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            else[m
[31m-                ngx.say("ok")[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: semaphore in log_by_lua (wait not allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo "ok";[m
[31m-        log_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 1 while logging request,[m
[31m-sem: API disabled in the context of log_by_lua* while logging request,[m
[31m-",[m
[31m-"sem: 1 while logging request,[m
[31m-sem: API disabled in the context of log_by_lua* while logging request,[m
[31m-",[m
[31m-][m
[31m---- wait: 0.2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: semaphore in header_filter_by_lua (wait not allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo "ok";[m
[31m-        header_filter_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of header_filter_by_lua*,[m
[31m-",[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of header_filter_by_lua*,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: semaphore in body_filter_by_lua (wait not allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo "ok";[m
[31m-        body_filter_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of body_filter_by_lua*,[m
[31m-sem: 1,[m
[31m-sem: API disabled in the context of body_filter_by_lua*,[m
[31m-",[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of body_filter_by_lua*,[m
[31m-sem: 1,[m
[31m-sem: API disabled in the context of body_filter_by_lua*,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: semaphore in ngx.timer (all allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            local function func_sem()[m
[31m-                local semaphore = require "ngx.semaphore"[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.log(ngx.ERR, "sem: ", err)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sem:wait(0.01)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "sem: ", err)[m
[31m-                end[m
[31m-[m
[31m-                sem:post(1)[m
[31m-[m
[31m-                local count = sem:count()[m
[31m-                ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-                local ok, err = sem:wait(0.1)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "sem: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.timer.at(0, func_sem)[m
[31m-            if ok then[m
[31m-                ngx.sleep(0.01)[m
[31m-                ngx.say("ok")[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-][m
[31m---- wait: 0.2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: semaphore post in all phase (in a request)[m
[31m---- http_config[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_worker_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, err)[m
[31m-        end[m
[31m-        package.loaded.sem = sem[m
[31m-[m
[31m-        local function wait()[m
[31m-            local i = 0[m
[31m-            while true do[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "sem: ", err)[m
[31m-                end[m
[31m-                i = i + 1[m
[31m-                if i % 6 == 0 then[m
[31m-                    ngx.log(ngx.ERR, "sem: 6 times")[m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, wait)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "sem: ", err)[m
[31m-        end[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set_by_lua_block $res {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        rewrite_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        access_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-        header_filter_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        body_filter_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 6 times,[m
[31m-",[m
[31m-"sem: 6 times,[m
[31m-",[m
[31m-][m
[31m---- wait: 0.2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: semaphore wait post in access_by_lua[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-[m
[31m-            local func_wait = function ()[m
[31m-                ngx.say("enter wait")[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if ok then[m
[31m-                    ngx.say("wait success")[m
[31m-                end[m
[31m-            end[m
[31m-            local func_post = function ()[m
[31m-                ngx.say("enter post")[m
[31m-[m
[31m-                sem:post()[m
[31m-                ngx.say("post success")[m
[31m-            end[m
[31m-[m
[31m-            local co1 = ngx.thread.spawn(func_wait)[m
[31m-            local co2 = ngx.thread.spawn(func_post)[m
[31m-[m
[31m-            ngx.thread.wait(co1)[m
[31m-            ngx.thread.wait(co2)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-enter wait[m
[31m-enter post[m
[31m-post success[m
[31m-wait success[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: semaphore wait post in rewrite_by_lua[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-[m
[31m-            local func_wait = function ()[m
[31m-                ngx.say("enter wait")[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if ok then[m
[31m-                    ngx.say("wait success")[m
[31m-                end[m
[31m-            end[m
[31m-            local func_post = function ()[m
[31m-                ngx.say("enter post")[m
[31m-[m
[31m-                sem:post()[m
[31m-                ngx.say("post success")[m
[31m-            end[m
[31m-[m
[31m-            local co1 = ngx.thread.spawn(func_wait)[m
[31m-            local co2 = ngx.thread.spawn(func_post)[m
[31m-[m
[31m-            ngx.thread.wait(co1)[m
[31m-            ngx.thread.wait(co2)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-enter wait[m
[31m-enter post[m
[31m-post success[m
[31m-wait success[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: semaphore wait in timer.at[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new()[m
[31m-[m
[31m-            local function func_wait(premature)[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.ERR, "wait success")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.timer.at(0, func_wait)[m
[31m-[m
[31m-            sem:post()[m
[31m-            ngx.sleep(0.01)[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-wait success[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: semaphore post in header_filter_by_lua (subrequest)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/sem_wait"},[m
[31m-                {"/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    ngx.exit(500)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            local ok, err = sem:wait(1)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-                ngx.exit(200)[m
[31m-            else[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        header_filter_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.log(ngx.ERR, err)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            ngx.print("post")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: semaphore post in body_filter_by_lua (subrequest)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/sem_wait"},[m
[31m-                {"/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    ngx.exit(500)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            local ok, err = sem:wait(10)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-                ngx.exit(200)[m
[31m-            else[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        body_filter_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.log(ngx.ERR, err)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            ngx.print("post")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: semaphore post in set_by_lua[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/sem_wait"},[m
[31m-                {"/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    ngx.exit(500)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            local ok, err = sem:wait(10)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-                ngx.exit(200)[m
[31m-            else[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        set_by_lua_block $res {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.log(ngx.ERR, err)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        content_by_lua_block {[m
[31m-            ngx.print("post")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: semaphore post in timer.at[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            package.loaded.sem = semaphore.new(0)[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/sem_wait"},[m
[31m-                {"/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            local ok, err = sem:wait(2)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-                ngx.exit(200)[m
[31m-            else[m
[31m-                ngx.status = 500[m
[31m-                ngx.say(err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        content_by_lua_block {[m
[31m-            local function func(premature)[m
[31m-                local sem = package.loaded.sem[m
[31m-                sem:post()[m
[31m-            end[m
[31m-            ngx.timer.at(0, func, g)[m
[31m-            ngx.sleep(0)[m
[31m-            ngx.print("post")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: two thread wait for each other[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem_A = semaphore.new(0)[m
[31m-            local sem_B = semaphore.new(0)[m
[31m-            if not sem_A or not sem_B then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-[m
[31m-            local function th_A()[m
[31m-                for i = 1, 11 do[m
[31m-                    local ok, err = sem_A:wait(1)[m
[31m-                    if not ok then[m
[31m-                        ngx.log(ngx.ERR, err)[m
[31m-                    end[m
[31m-                    sem_B:post(1)[m
[31m-                end[m
[31m-                ngx.say("count in A: ", sem_A:count())[m
[31m-            end[m
[31m-            local function th_B()[m
[31m-                for i = 1, 10 do[m
[31m-                    local ok, err = sem_B:wait(1)[m
[31m-                    if not ok then[m
[31m-                        ngx.log(ngx.ERR, err)[m
[31m-                    end[m
[31m-                    sem_A:post(1)[m
[31m-                end[m
[31m-                ngx.say("count in B: ", sem_B:count())[m
[31m-            end[m
[31m-[m
[31m-            local co_A = ngx.thread.spawn(th_A)[m
[31m-            local co_B = ngx.thread.spawn(th_B)[m
[31m-[m
[31m-            sem_A:post(1)[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-count in B: 0[m
[31m-count in A: 0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: kill a light thread that is waiting on a semaphore(no resource)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-[m
[31m-            local function func_wait()[m
[31m-                sem:wait(1)[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(func_wait)[m
[31m-            local ok, err = ngx.thread.kill(co)[m
[31m-            if ok then[m
[31m-                ngx.say("ok")[m
[31m-            else[m
[31m-                ngx.say(err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: kill a light thread that is waiting on a semaphore(after post)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-[m
[31m-            local function func_wait()[m
[31m-                sem:wait(1)[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(func_wait)[m
[31m-[m
[31m-            sem:post()[m
[31m-            local ok, err = ngx.thread.kill(co)[m
[31m-[m
[31m-            if ok then[m
[31m-                ngx.say("ok")[m
[31m-            else[m
[31m-                ngx.say(err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.say("count: ", count)[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m-count: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: kill a thread that is waiting on another thread that is waiting on semaphore[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-[m
[31m-            local function sem_wait()[m
[31m-                ngx.say("sem waiting start")[m
[31m-                local ok, err = sem:wait(0.1)[m
[31m-                if not ok then[m
[31m-                    ngx.say("sem wait err: ", err)[m
[31m-                end[m
[31m-                ngx.say("sem waiting done")[m
[31m-            end[m
[31m-[m
[31m-            local function thread_wait()[m
[31m-                local co = ngx.thread.spawn(sem_wait)[m
[31m-[m
[31m-                ngx.say("thread waiting start")[m
[31m-                local ok, err = ngx.thread.wait(co)[m
[31m-                if not ok then[m
[31m-                    ngx.say("thread wait err: ", err)[m
[31m-                end[m
[31m-                ngx.say("thread waiting done")[m
[31m-            end[m
[31m-[m
[31m-            local co2 = ngx.thread.spawn(thread_wait)[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(co2)[m
[31m-            if ok then[m
[31m-                ngx.say("thread kill success")[m
[31m-            else[m
[31m-                ngx.say("kill err: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-sem waiting start[m
[31m-thread waiting start[m
[31m-thread kill success[m
[31m-sem wait err: timeout[m
[31m-sem waiting done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: a light thread that is going to exit is waiting on a semaphore[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-            local function func(sem)[m
[31m-                ngx.say("sem waiting")[m
[31m-                local ok, err = sem:wait(0.1)[m
[31m-                if ok then[m
[31m-                    ngx.say("wait success")[m
[31m-                else[m
[31m-                    ngx.say("err: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(func, sem)[m
[31m-            ngx.say("ok")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-sem waiting[m
[31m-ok[m
[31m---- error_log[m
[31m-http lua semaphore cleanup[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: main thread wait a light thread that is waiting on a semaphore[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-            local function func(sem)[m
[31m-                local ok, err = sem:wait(0.001)[m
[31m-                if ok then[m
[31m-                    ngx.say("wait success")[m
[31m-                else[m
[31m-                    ngx.say("err: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(func, sem)[m
[31m-            ngx.thread.wait(co)[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-err: timeout[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: multi wait and mult post with one semaphore[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            local function func(op, id)[m
[31m-                ngx.say(op, ": ", id)[m
[31m-                if op == "wait" then[m
[31m-                    local ok, err = sem:wait(1)[m
[31m-                    if ok then[m
[31m-                        ngx.say("wait success: ", id)[m
[31m-                    end[m
[31m-                else[m
[31m-                    sem:post()[m
[31m-                end[m
[31m-            end[m
[31m-            local tco = {}[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                tco[#tco + 1] = ngx.thread.spawn(func, "wait", i)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                tco[#tco + 1] = ngx.thread.spawn(func, "post", i)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, #tco do[m
[31m-                ngx.thread.wait(tco[i])[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-wait: 1[m
[31m-wait: 2[m
[31m-wait: 3[m
[31m-post: 1[m
[31m-post: 2[m
[31m-post: 3[m
[31m-wait success: 1[m
[31m-wait success: 2[m
[31m-wait success: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: semaphore wait time is zero[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            local ok, err = sem:wait(0)[m
[31m-            if not ok then[m
[31m-                ngx.say(err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-timeout[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: test semaphore gc[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if sem then[m
[31m-                ngx.say("success")[m
[31m-            end[m
[31m-            sem = nil[m
[31m-            collectgarbage("collect")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-success[m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-in lua gc, semaphore[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: basic semaphore_mm alloc[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if sem then[m
[31m-                ngx.say("ok")[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/(new block, alloc semaphore|from head of free queue, alloc semaphore)/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"new block, alloc semaphore[m
[31m-",[m
[31m-"from head of free queue, alloc semaphore[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: basic semaphore_mm free insert tail[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sems = package.loaded.sems or {}[m
[31m-            package.loaded.sems = sems[m
[31m-[m
[31m-            local num_per_block = 4095[m
[31m-            if not sems[num_per_block] then[m
[31m-                for i = 1, num_per_block * 3 do[m
[31m-                    sems[i] = semaphore.new(0)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                if sems[i] then[m
[31m-                    sems[i] = nil[m
[31m-                    ngx.say("ok")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            collectgarbage("collect")[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-add to free queue tail[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: basic semaphore_mm free insert head[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sems = package.loaded.sems or {}[m
[31m-            package.loaded.sems = sems[m
[31m-[m
[31m-            local num_per_block = 4095[m
[31m-            if not sems[num_per_block] then[m
[31m-                for i = 1, num_per_block * 3 do[m
[31m-                    sems[i] = semaphore.new(0)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            if sems[#sems] then[m
[31m-                sems[#sems] = nil[m
[31m-                ngx.say("ok")[m
[31m-            end[m
[31m-            collectgarbage("collect")[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-add to free queue head[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: semaphore_mm free block (load <= 50% & the on the older side)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sems = package.loaded.sems or {}[m
[31m-            package.loaded.sems = sems[m
[31m-[m
[31m-            local num_per_block = 4095[m
[31m-            if not sems[num_per_block * 3] then[m
[31m-                for i = 1, num_per_block * 3 do[m
[31m-                    sems[i] = semaphore.new(0)[m
[31m-                end[m
[31m-[m
[31m-                for i = num_per_block + 1, num_per_block * 2 do[m
[31m-                    sems[i] = nil[m
[31m-                end[m
[31m-            else[m
[31m-                for i = 1, num_per_block do[m
[31m-                    sems[i] = nil[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage("collect")[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/free semaphore block/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"",[m
[31m-"free semaphore block[m
[31m-",[m
[31m-][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: basic semaphore count[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(10)[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-[m
[31m-            sem:wait(0)[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-[m
[31m-            sem:post(3)[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-10[m
[31m-9[m
[31m-12[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: basic semaphore count(negative number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new()[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-[m
[31m-            local function wait()[m
[31m-                sem:wait(0.01)[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(wait)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-0[m
[31m--1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: bugfix: semaphore instance can't be garbage collected when someone is waiting on it[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-[m
[31m-            local my_sema = {}[m
[31m-            local key = "my key"[m
[31m-[m
[31m-            local function my_clean()[m
[31m-                print("cleaning up")[m
[31m-[m
[31m-                my_sema[key]:post()[m
[31m-                my_sema[key] = nil[m
[31m-[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.timer.at(0.001, my_clean)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to create timer: ", err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            my_sema[key] = semaphore:new(0)[m
[31m-[m
[31m-            local ok, err = my_sema[key]:wait(2)[m
[31m-            ngx.say(ok, ", ", err)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-true, nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/sha1_bin.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/sha1_bin.t[m
[1mdeleted file mode 100644[m
[1mindex 8187941..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/sha1_bin.t[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set sha1_bin (string)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /sha1_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.sha1_bin("hello")[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1_bin[m
[31m---- response_body[m
[31m-20[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set sha1_bin (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /sha1_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.sha1_bin(nil)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1_bin[m
[31m---- response_body[m
[31m-20[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set sha1_bin (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /sha1_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.sha1_bin(3.14)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1_bin[m
[31m---- response_body[m
[31m-20[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set sha1_bin (boolean)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /sha1_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.sha1_bin(true)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1_bin[m
[31m---- response_body[m
[31m-20[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/shdict.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/shdict.t[m
[1mdeleted file mode 100644[m
[1mindex c62e25e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/shdict.t[m
[1m+++ /dev/null[m
[36m@@ -1,917 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 2);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, forcible = dogs:set("foo", "bar", 0, 72)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):11 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get an nonexistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            -- dogs:set("foo", "bar")[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: nil[m
[31m-value: nil[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get a boolean value (true)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", true, 0, 5678)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: boolean[m
[31m-value: true[m
[31m-flags: 5678[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get a boolean value (false)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", false, 0, 777)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: boolean[m
[31m-value: false[m
[31m-flags: 777[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get a number value (int)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", 51203)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 51203[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: get a number value (double)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", 3.1415926, 0, 78)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 3.1415926[m
[31m-flags: 78[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get a large string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", string.rep("bbbb", 1024) .. "a", 0, 912)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"value type: string[m
[31m-value: " . ("bbbb" x 1024) . "a[m
[31m-flags: 912[m
[31m-"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: get_stale (false)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags, stale[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", "bar", 0, 72)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags, stale = dogs:get_stale("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-            ngx.say("stale: ", stale)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m-stale: false[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get_stale (true)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags, stale[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, forcible = dogs:set("foo", "bar", 0.001, 72)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.sleep(0.002)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags, stale = dogs:get_stale("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-            ngx.say("stale: ", stale)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m-stale: true[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):12 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: incr int[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, foricible = dogs:set("foo", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            for i = 1, 100 do[m
[31m-                val, err = dogs:incr("foo", 2)[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: 256[m
[31m-err: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):11 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: incr double[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", 56)[m
[31m-            for i = 1, 100 do[m
[31m-                val, err = dogs:incr("foo", 2.1)[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: 266[m
[31m-err: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:set("foo", "bar", 0, 72)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: set a boolean value (true)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:set("foo", true, 0, 5678)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: boolean[m
[31m-value: true[m
[31m-flags: 5678[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set a boolean value (false)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 100 do[m
[31m-                dogs:set("foo", false, 0, 777)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: boolean[m
[31m-value: false[m
[31m-flags: 777[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set a number value (int)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 100 do[m
[31m-                dogs:set("foo", 51203)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 51203[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set a number value (double)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 100 do[m
[31m-                dogs:set("foo", 3.1415926, 0, 78)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 3.1415926[m
[31m-flags: 78[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set a number value and a nil[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 150 do[m
[31m-                dogs:set("foo", 3.1415926, 0, 78)[m
[31m-                dogs:set("foo", nil)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: nil[m
[31m-value: nil[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: safe set a number value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 100 do[m
[31m-                dogs:safe_set("foo", 3.1415926, 0, 78)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 3.1415926[m
[31m-flags: 78[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: add a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:flush_all()[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:add("foo" .. i, "bar", 0, 72)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo100")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):8 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: safe add a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:flush_all()[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:safe_add("foo" .. i, "bar", 0, 72)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo100")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):8 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: replace a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", "hello")[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:replace("foo", "bar" .. i, 0, 72)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar100[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):8 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: set a number value and delete[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 150 do[m
[31m-                dogs:set("foo", 3.1415926, 0, 78)[m
[31m-                dogs:delete("foo")[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: nil[m
[31m-value: nil[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: set nil key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set(nil, "bar")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to set: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: get nil key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local value, err = dogs:get(nil, "bar")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to get: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: get stale key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local value, err = dogs:get_stale(nil, "bar")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to get stale: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to get stale: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: incr key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local value, err = dogs:incr(nil, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to incr: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to incr: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: flush_all[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "bah")[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 150 do[m
[31m-                dogs:flush_all()[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: nil[m
[31m-value: nil[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ssl.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ssl.t[m
[1mdeleted file mode 100644[m
[1mindex 81cca13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/ssl.t[m
[1m+++ /dev/null[m
[36m@@ -1,1559 +0,0 @@[m
[31m-# vim:set ft=ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(10140);[m
[31m-#workers(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6 + 1);[m
[31m-[m
[31m-our $CWD = cwd();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-$ENV{TEST_NGINX_LUA_PACKAGE_PATH} = "$::CWD/lib/?.lua;;";[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear certs[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            ssl.clear_certs()[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-sslv3 alert handshake failure[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set DER cert and private key[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            ssl.clear_certs()[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/test.crt.der"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_cert(cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/test.key.der"))[m
[31m-            local pkey_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_priv_key(pkey_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read SNI name via ssl.server_name()[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            print("read SNI name from Lua: ", ssl.server_name())[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-read SNI name from Lua: test.com[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: read SNI name via ssl.server_name() when no SNI name specified[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local name = ssl.server_name(),[m
[31m-            print("read SNI name from Lua: ", name, ", type: ", type(name))[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, nil, true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-read SNI name from Lua: nil, type: nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: read raw server addr via ssl.raw_server_addr() (unix domain socket)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local addr, addrtyp, err = ssl.raw_server_addr()[m
[31m-            if not addr then[m
[31m-                ngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if addrtyp == "inet" then  -- IPv4[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),[m
[31m-                                   byte(addr, 3), byte(addr, 4))[m
[31m-                print("Using IPv4 address: ", ip)[m
[31m-[m
[31m-            elseif addrtyp == "inet6" then  -- IPv6[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 13), byte(addr, 14),[m
[31m-                                   byte(addr, 15), byte(addr, 16))[m
[31m-                print("Using IPv6 address: ", ip)[m
[31m-[m
[31m-            else  -- unix[m
[31m-                print("Using unix socket file ", addr)[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua ssl server name: "test.com"',[m
[31m-qr/Using unix socket file .*?nginx\.sock/[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: read raw server addr via ssl.raw_server_addr() (IPv4)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.1:12345 ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local byte = string.byte[m
[31m-[m
[31m-            local addr, addrtyp, err = ssl.raw_server_addr()[m
[31m-            if not addr then[m
[31m-                ngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if addrtyp == "inet" then  -- IPv4[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),[m
[31m-                                   byte(addr, 3), byte(addr, 4))[m
[31m-                print("Using IPv4 address: ", ip)[m
[31m-[m
[31m-            elseif addrtyp == "inet6" then  -- IPv6[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 13), byte(addr, 14),[m
[31m-                                   byte(addr, 15), byte(addr, 16))[m
[31m-                print("Using IPv6 address: ", ip)[m
[31m-[m
[31m-            else  -- unix[m
[31m-                print("Using unix socket file ", addr)[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", 12345)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-Using IPv4 address: 127.0.0.1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read raw server addr via ssl.raw_server_addr() (IPv6)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen [::1]:12345 ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local byte = string.byte[m
[31m-[m
[31m-            local addr, addrtyp, err = ssl.raw_server_addr()[m
[31m-            if not addr then[m
[31m-                ngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if addrtyp == "inet" then  -- IPv4[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),[m
[31m-                                   byte(addr, 3), byte(addr, 4))[m
[31m-                print("Using IPv4 address: ", ip)[m
[31m-[m
[31m-            elseif addrtyp == "inet6" then  -- IPv6[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 13), byte(addr, 14),[m
[31m-                                   byte(addr, 15), byte(addr, 16))[m
[31m-                print("Using IPv6 address: ", ip)[m
[31m-[m
[31m-            else  -- unix[m
[31m-                print("Using unix socket file ", addr)[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("[::1]", 12345)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-Using IPv6 address: 0.0.0.1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- skip_eval: 3: system("ping6 -c 1 ::1 >/dev/null 2>&1") ne 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set DER cert chain[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            ssl.clear_certs()[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/chain.der"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_cert(cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/test-com.key.der"))[m
[31m-            local pkey_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_priv_key(pkey_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/chain/root-ca.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: read PEM cert chain but set DER cert chain[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            ssl.clear_certs()[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ssl.set_der_cert(cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/test-com.key.der"))[m
[31m-            local pkey_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_priv_key(pkey_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER private key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/chain/root-ca.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: tls version - SSLv3[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            local ver, err = ssl.get_tls1_version_str(resp)[m
[31m-            if not ver then[m
[31m-                ngx.log(ngx.ERR, "failed to get TLS1 version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "got TLS1 version: ", ver)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols SSLv3;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols SSLv3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-got TLS1 version: SSLv3,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: tls version - TLSv1[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            local ver, err = ssl.get_tls1_version_str(resp)[m
[31m-            if not ver then[m
[31m-                ngx.log(ngx.ERR, "failed to get TLS1 version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "got TLS1 version: ", ver)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols TLSv1;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols TLSv1;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-got TLS1 version: TLSv1,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: tls version - TLSv1.1[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            local ver, err = ssl.get_tls1_version_str(resp)[m
[31m-            if not ver then[m
[31m-                ngx.log(ngx.ERR, "failed to get TLS1 version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "got TLS1 version: ", ver)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols TLSv1.1;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols TLSv1.1;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-got TLS1 version: TLSv1.1,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: tls version - TLSv1.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            local ver, err = ssl.get_tls1_version_str(resp)[m
[31m-            if not ver then[m
[31m-                ngx.log(ngx.ERR, "failed to get TLS1 version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "got TLS1 version: ", ver)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols TLSv1.2;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols TLSv1.2;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-got TLS1 version: TLSv1.2,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.semaphore in ssl_certificate_by_lua*[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-[m
[31m-            local sema = assert(semaphore.new())[m
[31m-[m
[31m-            local function f()[m
[31m-                assert(sema:wait(1))[m
[31m-            end[m
[31m-[m
[31m-            local t = assert(ngx.thread.spawn(f))[m
[31m-            ngx.sleep(0.25)[m
[31m-[m
[31m-            assert(sema:post())[m
[31m-[m
[31m-            assert(ngx.thread.wait(t))[m
[31m-            print("ssl cert by lua done")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols TLSv1.2;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols TLSv1.2;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- grep_error_log eval: qr/http lua semaphore (?:wait yielding|\w[^:,]*)/[m
[31m---- grep_error_log_out[m
[31m-http lua semaphore new[m
[31m-http lua semaphore wait[m
[31m-http lua semaphore wait yielding[m
[31m-http lua semaphore post[m
[31m---- error_log[m
[31m-ssl cert by lua done[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: read PEM key chain but set DER key chain[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            ssl.clear_certs()[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ssl.set_der_cert(cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/test-com.key.pem"))[m
[31m-            local pkey_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            pkey_data, err = ssl.priv_key_pem_to_der(pkey_data)[m
[31m-            if not pkey_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem key to der key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ssl.set_der_priv_key(pkey_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set private key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/chain/root-ca.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/status.t[m
[1mdeleted file mode 100644[m
[1mindex e611b78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/status.t[m
[1m+++ /dev/null[m
[36m@@ -1,92 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 7);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;\$prefix/html/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get ngx.status[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        return 201;[m
[31m-        header_filter_by_lua '[m
[31m-            local sum = 0[m
[31m-            for i = 1, 100 do[m
[31m-                sum = sum + ngx.status[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "sum: ", sum)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- error_code: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-["sum: 20100,",[m
[31m-qr/\[TRACE\s+\d+\s+header_filter_by_lua:3 loop\]/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set ngx.status[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        return 201;[m
[31m-        header_filter_by_lua '[m
[31m-            for i = 100, 200 do[m
[31m-                ngx.status = i[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "status: ", ngx.status)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-["status: 200,",[m
[31m-qr/\[TRACE\s+\d+\s+header_filter_by_lua:2 loop\]/[m
[31m-][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/time.t[m
[1mdeleted file mode 100644[m
[1mindex b9e1c7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/time.t[m
[1m+++ /dev/null[m
[36m@@ -1,106 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.now()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.now()[m
[31m-            end[m
[31m-            ngx.sleep(0.10)[m
[31m-            local elapsed = ngx.now() - t[m
[31m-            ngx.say(t > 1399867351)[m
[31m-            ngx.say(">= 0.099: ", elapsed >= 0.099)[m
[31m-            ngx.say("< 0.11: ", elapsed < 0.11)[m
[31m-            -- ngx.say(t, " ", elapsed)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m->= 0.099: true[m
[31m-< 0.11: true[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.time()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.time()[m
[31m-            end[m
[31m-            ngx.say(t > 1400960598)[m
[31m-            local diff = os.time() - t[m
[31m-            ngx.say(diff <= 1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/uri.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/uri.t[m
[1mdeleted file mode 100644[m
[1mindex cd531d4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/uri.t[m
[1m+++ /dev/null[m
[36m@@ -1,262 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: unescape_uri (string)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.unescape_uri("hello%20world")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-hello world[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unescape_uri (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.unescape_uri(nil)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unescape_uri (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.unescape_uri(3.14)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-3.14[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: escape_uri (string, escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri("hello world")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-hello%20world[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: escape_uri (string, no escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri("helloworld")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-helloworld[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: escape_uri (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(nil)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: escape_uri (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(3.14)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-3.14[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: escape_uri (larger than 4k, nothing to be escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(string.rep("a", 4097))[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "a" x 4097 . "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: escape_uri (a little smaller than 4k, need to be escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(string.rep(" ", 1365))[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "%20" x 1365 . "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: escape_uri (a little bigger than 4k, need to be escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(string.rep(" ", 1366))[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "%20" x 1366 . "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/var.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/var.t[m
[1mdeleted file mode 100644[m
[1mindex a924641..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/var.t[m
[1m+++ /dev/null[m
[36m@@ -1,218 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get normal var[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            for i = 1, 100 do[m
[31m-                val = ngx.var.foo[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: hello[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI: (?!return to lower frame)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get normal var (case)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            for i = 1, 100 do[m
[31m-                val = ngx.var.FOO[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: hello[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI: (?!return to lower frame)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get capturing var (bad)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            for i = 1, 100 do[m
[31m-                val = ngx.var[0][m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get capturing var[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location ~ '^(/t)' {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            for i = 1, 100 do[m
[31m-                val = ngx.var[1][m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: /t[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI: (?!return to lower frame)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set normal var (string value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val = "hello"[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.var.foo = val[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: hello[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set normal var (nil value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.var.foo = nil[m
[31m-            end[m
[31m-            ngx.say("value: ", ngx.var.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set normal var (number value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.var.foo = i[m
[31m-            end[m
[31m-            ngx.say("value: ", ngx.var.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: 100[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/worker.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/worker.t[m
[1mdeleted file mode 100644[m
[1mindex 1083b14..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/worker.t[m
[1m+++ /dev/null[m
[36m@@ -1,144 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on("b", "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.worker.exiting[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local exiting = ngx.worker.exiting[m
[31m-            for i = 1, 400 do[m
[31m-                v = exiting()[m
[31m-            end[m
[31m-            ngx.say(v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-false[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.worker.pid[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local pid = ngx.worker.pid[m
[31m-            for i = 1, 400 do[m
[31m-                v = pid()[m
[31m-            end[m
[31m-            ngx.say(v == tonumber(ngx.var.pid))[m
[31m-            ngx.say(v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^true[m
[31m-\d+$[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.worker.id[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local id = ngx.worker.id[m
[31m-            for i = 1, 400 do[m
[31m-                v = id()[m
[31m-            end[m
[31m-            ngx.say("worker id: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^worker id: [0-1]$[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[31m---- skip_nginx: 3: <=1.9.0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.worker.count[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local count = ngx.worker.count[m
[31m-            for i = 1, 400 do[m
[31m-                v = count()[m
[31m-            end[m
[31m-            ngx.say("workers: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-workers: 1[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/worker_count_5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/worker_count_5.t[m
[1mdeleted file mode 100644[m
[1mindex c0d6828..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/t/worker_count_5.t[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-workers(5);[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on("b", "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.worker.count[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local count = ngx.worker.count[m
[31m-            for i = 1, 400 do[m
[31m-                v = count()[m
[31m-            end[m
[31m-            ngx.say("workers: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-workers: 5[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 389b0bc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-core-0.1.6/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_notify_init[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_connection[m
[31m-   fun:ngx_event_connect_peer[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex c3add77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-  matrix:[m
[31m-    - LUA=libluajit-5.1-dev LUA_DEV=libluajit-5.1-dev LUA_INCLUDE_DIR=/usr/include/luajit-2.0 LUA_CMODULE_DIR=/lib LUALIB=-lluajit-5.1[m
[31m-[m
[31m-install:[m
[31m-    - sudo apt-get update[m
[31m-    - sudo apt-get install -qq -y $LUA cpanminus[m
[31m-    - sudo cpanm --notest Test::Nginx > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-    - wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz[m
[31m-    - git clone https://github.com/openresty/lua-nginx-module.git[m
[31m-    - git clone https://github.com/openresty/lua-cjson.git[m
[31m-[m
[31m-script:[m
[31m-  - cd lua-cjson && make && sudo make install && cd ..[m
[31m-  - tar xzf nginx-${NGINX_VERSION}.tar.gz[m
[31m-  - cd nginx-${NGINX_VERSION}/[m
[31m-  - ./configure --with-debug --with-cc-opt="-DDEBUG_MALLOC" --with-ipv6 --add-module=../lua-nginx-module > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j2 > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - export PATH=$PATH:`pwd`/objs[m
[31m-  - cd ..[m
[31m-  - make[m
[31m-  - prove -lv t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/Makefile[m
[1mdeleted file mode 100644[m
[1mindex a9fc3fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/dns[m
[31m-	$(INSTALL) lib/resty/dns/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/dns/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/lib/resty/dns/resolver.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/lib/resty/dns/resolver.lua[m
[1mdeleted file mode 100644[m
[1mindex 08543a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/lib/resty/dns/resolver.lua[m
[1m+++ /dev/null[m
[36m@@ -1,889 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m--- local socket = require "socket"[m
[31m-local bit = require "bit"[m
[31m-local udp = ngx.socket.udp[m
[31m-local rand = math.random[m
[31m-local char = string.char[m
[31m-local byte = string.byte[m
[31m-local find = string.find[m
[31m-local gsub = string.gsub[m
[31m-local sub = string.sub[m
[31m-local rep = string.rep[m
[31m-local format = string.format[m
[31m-local band = bit.band[m
[31m-local rshift = bit.rshift[m
[31m-local lshift = bit.lshift[m
[31m-local insert = table.insert[m
[31m-local concat = table.concat[m
[31m-local re_sub = ngx.re.sub[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local log = ngx.log[m
[31m-local DEBUG = ngx.DEBUG[m
[31m-local randomseed = math.randomseed[m
[31m-local ngx_time = ngx.time[m
[31m-local unpack = unpack[m
[31m-local setmetatable = setmetatable[m
[31m-local type = type[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local DOT_CHAR = byte(".")[m
[31m-local ZERO_CHAR = byte("0")[m
[31m-local COLON_CHAR = byte(":")[m
[31m-[m
[31m-local IP6_ARPA = "ip6.arpa"[m
[31m-[m
[31m-local TYPE_A      = 1[m
[31m-local TYPE_NS     = 2[m
[31m-local TYPE_CNAME  = 5[m
[31m-local TYPE_PTR    = 12[m
[31m-local TYPE_MX     = 15[m
[31m-local TYPE_TXT    = 16[m
[31m-local TYPE_AAAA   = 28[m
[31m-local TYPE_SRV    = 33[m
[31m-local TYPE_SPF    = 99[m
[31m-[m
[31m-local CLASS_IN    = 1[m
[31m-[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION    = '0.16',[m
[31m-    TYPE_A      = TYPE_A,[m
[31m-    TYPE_NS     = TYPE_NS,[m
[31m-    TYPE_CNAME  = TYPE_CNAME,[m
[31m-    TYPE_PTR    = TYPE_PTR,[m
[31m-    TYPE_MX     = TYPE_MX,[m
[31m-    TYPE_TXT    = TYPE_TXT,[m
[31m-    TYPE_AAAA   = TYPE_AAAA,[m
[31m-    TYPE_SRV    = TYPE_SRV,[m
[31m-    TYPE_SPF    = TYPE_SPF,[m
[31m-    CLASS_IN    = CLASS_IN,[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local resolver_errstrs = {[m
[31m-    "format error",     -- 1[m
[31m-    "server failure",   -- 2[m
[31m-    "name error",       -- 3[m
[31m-    "not implemented",  -- 4[m
[31m-    "refused",          -- 5[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-local arpa_tmpl = new_tab(72, 0)[m
[31m-[m
[31m-for i = 1, #IP6_ARPA do[m
[31m-    arpa_tmpl[64 + i] = byte(IP6_ARPA, i)[m
[31m-end[m
[31m-[m
[31m-for i = 2, 64, 2 do[m
[31m-    arpa_tmpl[i] = DOT_CHAR[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.new(class, opts)[m
[31m-    if not opts then[m
[31m-        return nil, "no options table specified"[m
[31m-    end[m
[31m-[m
[31m-    local servers = opts.nameservers[m
[31m-    if not servers or #servers == 0 then[m
[31m-        return nil, "no nameservers specified"[m
[31m-    end[m
[31m-[m
[31m-    local timeout = opts.timeout or 2000  -- default 2 sec[m
[31m-[m
[31m-    local n = #servers[m
[31m-[m
[31m-    local socks = {}[m
[31m-[m
[31m-    for i = 1, n do[m
[31m-        local server = servers[i][m
[31m-        local sock, err = udp()[m
[31m-        if not sock then[m
[31m-            return nil, "failed to create udp socket: " .. err[m
[31m-        end[m
[31m-[m
[31m-        local host, port[m
[31m-        if type(server) == 'table' then[m
[31m-            host = server[1][m
[31m-            port = server[2] or 53[m
[31m-[m
[31m-        else[m
[31m-            host = server[m
[31m-            port = 53[m
[31m-            servers[i] = {host, port}[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = sock:setpeername(host, port)[m
[31m-        if not ok then[m
[31m-            return nil, "failed to set peer name: " .. err[m
[31m-        end[m
[31m-[m
[31m-        sock:settimeout(timeout)[m
[31m-[m
[31m-        insert(socks, sock)[m
[31m-    end[m
[31m-[m
[31m-    local tcp_sock, err = tcp()[m
[31m-    if not tcp_sock then[m
[31m-        return nil, "failed to create tcp socket: " .. err[m
[31m-    end[m
[31m-[m
[31m-    tcp_sock:settimeout(timeout)[m
[31m-[m
[31m-    return setmetatable([m
[31m-                { cur = rand(1, n), socks = socks,[m
[31m-                  tcp_sock = tcp_sock,[m
[31m-                  servers = servers,[m
[31m-                  retrans = opts.retrans or 5,[m
[31m-                  no_recurse = opts.no_recurse,[m
[31m-                }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function pick_sock(self, socks)[m
[31m-    local cur = self.cur[m
[31m-[m
[31m-    if cur == #socks then[m
[31m-        self.cur = 1[m
[31m-    else[m
[31m-        self.cur = cur + 1[m
[31m-    end[m
[31m-[m
[31m-    return socks[cur][m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _get_cur_server(self)[m
[31m-    local cur = self.cur[m
[31m-[m
[31m-    local servers = self.servers[m
[31m-[m
[31m-    if cur == 1 then[m
[31m-        return servers[#servers][m
[31m-    end[m
[31m-[m
[31m-    return servers[cur - 1][m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local socks = self.socks[m
[31m-    if not socks then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    for i = 1, #socks do[m
[31m-        local sock = socks[i][m
[31m-        sock:settimeout(timeout)[m
[31m-    end[m
[31m-[m
[31m-    local tcp_sock = self.tcp_sock[m
[31m-    if not tcp_sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    tcp_sock:settimeout(timeout)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _encode_name(s)[m
[31m-    return char(#s) .. s[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _decode_name(buf, pos)[m
[31m-    local labels = {}[m
[31m-    local nptrs = 0[m
[31m-    local p = pos[m
[31m-    while nptrs < 128 do[m
[31m-        local fst = byte(buf, p)[m
[31m-[m
[31m-        if not fst then[m
[31m-            return nil, 'truncated';[m
[31m-        end[m
[31m-[m
[31m-        -- print("fst at ", p, ": ", fst)[m
[31m-[m
[31m-        if fst == 0 then[m
[31m-            if nptrs == 0 then[m
[31m-                pos = pos + 1[m
[31m-            end[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        if band(fst, 0xc0) ~= 0 then[m
[31m-            -- being a pointer[m
[31m-            if nptrs == 0 then[m
[31m-                pos = pos + 2[m
[31m-            end[m
[31m-[m
[31m-            nptrs = nptrs + 1[m
[31m-[m
[31m-            local snd = byte(buf, p + 1)[m
[31m-            if not snd then[m
[31m-                return nil, 'truncated'[m
[31m-            end[m
[31m-[m
[31m-            p = lshift(band(fst, 0x3f), 8) + snd + 1[m
[31m-[m
[31m-            -- print("resolving ptr ", p, ": ", byte(buf, p))[m
[31m-[m
[31m-        else[m
[31m-            -- being a label[m
[31m-            local label = sub(buf, p + 1, p + fst)[m
[31m-            insert(labels, label)[m
[31m-[m
[31m-            -- print("resolved label ", label)[m
[31m-[m
[31m-            p = p + fst + 1[m
[31m-[m
[31m-            if nptrs == 0 then[m
[31m-                pos = p[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return concat(labels, "."), pos[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _build_request(qname, id, no_recurse, opts)[m
[31m-    local qtype[m
[31m-[m
[31m-    if opts then[m
[31m-        qtype = opts.qtype[m
[31m-    end[m
[31m-[m
[31m-    if not qtype then[m
[31m-        qtype = 1  -- A record[m
[31m-    end[m
[31m-[m
[31m-    local ident_hi = char(rshift(id, 8))[m
[31m-    local ident_lo = char(band(id, 0xff))[m
[31m-[m
[31m-    local flags[m
[31m-    if no_recurse then[m
[31m-        -- print("found no recurse")[m
[31m-        flags = "\0\0"[m
[31m-    else[m
[31m-        flags = "\1\0"[m
[31m-    end[m
[31m-[m
[31m-    local nqs = "\0\1"[m
[31m-    local nan = "\0\0"[m
[31m-    local nns = "\0\0"[m
[31m-    local nar = "\0\0"[m
[31m-    local typ = "\0" .. char(qtype)[m
[31m-    local class = "\0\1"    -- the Internet class[m
[31m-[m
[31m-    if byte(qname, 1) == DOT_CHAR then[m
[31m-        return nil, "bad name"[m
[31m-    end[m
[31m-[m
[31m-    local name = gsub(qname, "([^.]+)%.?", _encode_name) .. '\0'[m
[31m-[m
[31m-    return {[m
[31m-        ident_hi, ident_lo, flags, nqs, nan, nns, nar,[m
[31m-        name, typ, class[m
[31m-    }[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function parse_response(buf, id)[m
[31m-    local n = #buf[m
[31m-    if n < 12 then[m
[31m-        return nil, 'truncated';[m
[31m-    end[m
[31m-[m
[31m-    -- header layout: ident flags nqs nan nns nar[m
[31m-[m
[31m-    local ident_hi = byte(buf, 1)[m
[31m-    local ident_lo = byte(buf, 2)[m
[31m-    local ans_id = lshift(ident_hi, 8) + ident_lo[m
[31m-[m
[31m-    -- print("id: ", id, ", ans id: ", ans_id)[m
[31m-[m
[31m-    if ans_id ~= id then[m
[31m-        -- identifier mismatch and throw it away[m
[31m-        log(DEBUG, "id mismatch in the DNS reply: ", ans_id, " ~= ", id)[m
[31m-        return nil, "id mismatch"[m
[31m-    end[m
[31m-[m
[31m-    local flags_hi = byte(buf, 3)[m
[31m-    local flags_lo = byte(buf, 4)[m
[31m-    local flags = lshift(flags_hi, 8) + flags_lo[m
[31m-[m
[31m-    -- print(format("flags: 0x%x", flags))[m
[31m-[m
[31m-    if band(flags, 0x8000) == 0 then[m
[31m-        return nil, format("bad QR flag in the DNS response")[m
[31m-    end[m
[31m-[m
[31m-    if band(flags, 0x200) ~= 0 then[m
[31m-        return nil, "truncated"[m
[31m-    end[m
[31m-[m
[31m-    local code = band(flags, 0xf)[m
[31m-[m
[31m-    -- print(format("code: %d", code))[m
[31m-[m
[31m-    local nqs_hi = byte(buf, 5)[m
[31m-    local nqs_lo = byte(buf, 6)[m
[31m-    local nqs = lshift(nqs_hi, 8) + nqs_lo[m
[31m-[m
[31m-    -- print("nqs: ", nqs)[m
[31m-[m
[31m-    if nqs ~= 1 then[m
[31m-        return nil, format("bad number of questions in DNS response: %d", nqs)[m
[31m-    end[m
[31m-[m
[31m-    local nan_hi = byte(buf, 7)[m
[31m-    local nan_lo = byte(buf, 8)[m
[31m-    local nan = lshift(nan_hi, 8) + nan_lo[m
[31m-[m
[31m-    -- print("nan: ", nan)[m
[31m-[m
[31m-    -- skip the question part[m
[31m-[m
[31m-    local ans_qname, pos = _decode_name(buf, 13)[m
[31m-    if not ans_qname then[m
[31m-        return nil, pos[m
[31m-    end[m
[31m-[m
[31m-    -- print("qname in reply: ", ans_qname)[m
[31m-[m
[31m-    -- print("question: ", sub(buf, 13, pos))[m
[31m-[m
[31m-    if pos + 3 + nan * 12 > n then[m
[31m-        -- print(format("%d > %d", pos + 3 + nan * 12, n))[m
[31m-        return nil, 'truncated';[m
[31m-    end[m
[31m-[m
[31m-    -- question section layout: qname qtype(2) qclass(2)[m
[31m-[m
[31m-    local type_hi = byte(buf, pos)[m
[31m-    local type_lo = byte(buf, pos + 1)[m
[31m-    local ans_type = lshift(type_hi, 8) + type_lo[m
[31m-[m
[31m-    -- print("ans qtype: ", ans_type)[m
[31m-[m
[31m-    local class_hi = byte(buf, pos + 2)[m
[31m-    local class_lo = byte(buf, pos + 3)[m
[31m-    local qclass = lshift(class_hi, 8) + class_lo[m
[31m-[m
[31m-    -- print("ans qclass: ", qclass)[m
[31m-[m
[31m-    if qclass ~= 1 then[m
[31m-        return nil, format("unknown query class %d in DNS response", qclass)[m
[31m-    end[m
[31m-[m
[31m-    pos = pos + 4[m
[31m-[m
[31m-    local answers = {}[m
[31m-[m
[31m-    if code ~= 0 then[m
[31m-        answers.errcode = code[m
[31m-        answers.errstr = resolver_errstrs[code] or "unknown"[m
[31m-    end[m
[31m-[m
[31m-    for i = 1, nan do[m
[31m-        -- print(format("ans %d: qtype:%d qclass:%d", i, qtype, qclass))[m
[31m-[m
[31m-        local ans = {}[m
[31m-        insert(answers, ans)[m
[31m-[m
[31m-        local name[m
[31m-        name, pos = _decode_name(buf, pos)[m
[31m-        if not name then[m
[31m-            return nil, pos[m
[31m-        end[m
[31m-[m
[31m-        ans.name = name[m
[31m-[m
[31m-        -- print("name: ", name)[m
[31m-[m
[31m-        type_hi = byte(buf, pos)[m
[31m-        type_lo = byte(buf, pos + 1)[m
[31m-        local typ = lshift(type_hi, 8) + type_lo[m
[31m-[m
[31m-        ans.type = typ[m
[31m-[m
[31m-        -- print("type: ", typ)[m
[31m-[m
[31m-        class_hi = byte(buf, pos + 2)[m
[31m-        class_lo = byte(buf, pos + 3)[m
[31m-        local class = lshift(class_hi, 8) + class_lo[m
[31m-[m
[31m-        ans.class = class[m
[31m-[m
[31m-        -- print("class: ", class)[m
[31m-[m
[31m-        local ttl_bytes = { byte(buf, pos + 4, pos + 7) }[m
[31m-[m
[31m-        -- print("ttl bytes: ", concat(ttl_bytes, " "))[m
[31m-[m
[31m-        local ttl = lshift(ttl_bytes[1], 24) + lshift(ttl_bytes[2], 16)[m
[31m-                    + lshift(ttl_bytes[3], 8) + ttl_bytes[4][m
[31m-[m
[31m-        -- print("ttl: ", ttl)[m
[31m-[m
[31m-        ans.ttl = ttl[m
[31m-[m
[31m-        local len_hi = byte(buf, pos + 8)[m
[31m-        local len_lo = byte(buf, pos + 9)[m
[31m-        local len = lshift(len_hi, 8) + len_lo[m
[31m-[m
[31m-        -- print("record len: ", len)[m
[31m-[m
[31m-        pos = pos + 10[m
[31m-[m
[31m-        if typ == TYPE_A then[m
[31m-[m
[31m-            if len ~= 4 then[m
[31m-                return nil, "bad A record value length: " .. len[m
[31m-            end[m
[31m-[m
[31m-            local addr_bytes = { byte(buf, pos, pos + 3) }[m
[31m-            local addr = concat(addr_bytes, ".")[m
[31m-            -- print("ipv4 address: ", addr)[m
[31m-[m
[31m-            ans.address = addr[m
[31m-[m
[31m-            pos = pos + 4[m
[31m-[m
[31m-        elseif typ == TYPE_CNAME then[m
[31m-[m
[31m-            local cname, p = _decode_name(buf, pos)[m
[31m-            if not cname then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad cname record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-            -- print("cname: ", cname)[m
[31m-[m
[31m-            ans.cname = cname[m
[31m-[m
[31m-        elseif typ == TYPE_AAAA then[m
[31m-[m
[31m-            if len ~= 16 then[m
[31m-                return nil, "bad AAAA record value length: " .. len[m
[31m-            end[m
[31m-[m
[31m-            local addr_bytes = { byte(buf, pos, pos + 15) }[m
[31m-            local flds = {}[m
[31m-            local comp_begin, comp_end[m
[31m-            for i = 1, 16, 2 do[m
[31m-                local a = addr_bytes[i][m
[31m-                local b = addr_bytes[i + 1][m
[31m-                if a == 0 then[m
[31m-                    insert(flds, format("%x", b))[m
[31m-[m
[31m-                else[m
[31m-                    insert(flds, format("%x%02x", a, b))[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            -- we do not compress the IPv6 addresses by default[m
[31m-            --  due to performance considerations[m
[31m-[m
[31m-            ans.address = concat(flds, ":")[m
[31m-[m
[31m-            pos = pos + 16[m
[31m-[m
[31m-        elseif typ == TYPE_MX then[m
[31m-[m
[31m-            -- print("len = ", len)[m
[31m-[m
[31m-            if len < 3 then[m
[31m-                return nil, "bad MX record value length: " .. len[m
[31m-            end[m
[31m-[m
[31m-            local pref_hi = byte(buf, pos)[m
[31m-            local pref_lo = byte(buf, pos + 1)[m
[31m-[m
[31m-            ans.preference = lshift(pref_hi, 8) + pref_lo[m
[31m-[m
[31m-            local host, p = _decode_name(buf, pos + 2)[m
[31m-            if not host then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad cname record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            ans.exchange = host[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-        elseif typ == TYPE_SRV then[m
[31m-            if len < 7 then[m
[31m-                return nil, "bad SRV record value length: " .. len[m
[31m-            end[m
[31m-[m
[31m-            local prio_hi = byte(buf, pos)[m
[31m-            local prio_lo = byte(buf, pos + 1)[m
[31m-            ans.priority = lshift(prio_hi, 8) + prio_lo[m
[31m-[m
[31m-            local weight_hi = byte(buf, pos + 2)[m
[31m-            local weight_lo = byte(buf, pos + 3)[m
[31m-            ans.weight = lshift(weight_hi, 8) + weight_lo[m
[31m-[m
[31m-            local port_hi = byte(buf, pos + 4)[m
[31m-            local port_lo = byte(buf, pos + 5)[m
[31m-            ans.port = lshift(port_hi, 8) + port_lo[m
[31m-[m
[31m-            local name, p = _decode_name(buf, pos + 6)[m
[31m-            if not name then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad srv record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            ans.target = name[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-        elseif typ == TYPE_NS then[m
[31m-[m
[31m-            local name, p = _decode_name(buf, pos)[m
[31m-            if not name then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad cname record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-            -- print("name: ", name)[m
[31m-[m
[31m-            ans.nsdname = name[m
[31m-[m
[31m-        elseif typ == TYPE_TXT or typ == TYPE_SPF then[m
[31m-[m
[31m-            local key = (typ == TYPE_TXT) and "txt" or "spf"[m
[31m-[m
[31m-            local slen = byte(buf, pos)[m
[31m-            if slen + 1 > len then[m
[31m-                -- truncate the over-run TXT record data[m
[31m-                slen = len[m
[31m-            end[m
[31m-[m
[31m-            -- print("slen: ", len)[m
[31m-[m
[31m-            local val = sub(buf, pos + 1, pos + slen)[m
[31m-            local last = pos + len[m
[31m-            pos = pos + slen + 1[m
[31m-[m
[31m-            if pos < last then[m
[31m-                -- more strings to be processed[m
[31m-                -- this code path is usually cold, so we do not[m
[31m-                -- merge the following loop on this code path[m
[31m-                -- with the processing logic above.[m
[31m-[m
[31m-                val = {val}[m
[31m-                local idx = 2[m
[31m-                repeat[m
[31m-                    local slen = byte(buf, pos)[m
[31m-                    if pos + slen + 1 > last then[m
[31m-                        -- truncate the over-run TXT record data[m
[31m-                        slen = last - pos - 1[m
[31m-                    end[m
[31m-[m
[31m-                    val[idx] = sub(buf, pos + 1, pos + slen)[m
[31m-                    idx = idx + 1[m
[31m-                    pos = pos + slen + 1[m
[31m-[m
[31m-                until pos >= last[m
[31m-            end[m
[31m-[m
[31m-            ans[key] = val[m
[31m-[m
[31m-        elseif typ == TYPE_PTR then[m
[31m-[m
[31m-            local name, p = _decode_name(buf, pos)[m
[31m-            if not name then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad cname record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-            -- print("name: ", name)[m
[31m-[m
[31m-            ans.ptrdname = name[m
[31m-[m
[31m-        else[m
[31m-            -- for unknown types, just forward the raw value[m
[31m-[m
[31m-            ans.rdata = sub(buf, pos, pos + len - 1)[m
[31m-            pos = pos + len[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return answers[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _gen_id(self)[m
[31m-    local id = self._id   -- for regression testing[m
[31m-    if id then[m
[31m-        return id[m
[31m-    end[m
[31m-    return rand(0, 65535)   -- two bytes[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _tcp_query(self, query, id)[m
[31m-    local sock = self.tcp_sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    log(DEBUG, "query the TCP server due to reply truncation")[m
[31m-[m
[31m-    local server = _get_cur_server(self)[m
[31m-[m
[31m-    local ok, err = sock:connect(server[1], server[2])[m
[31m-    if not ok then[m
[31m-        return nil, "failed to connect to TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    query = concat(query, "")[m
[31m-    local len = #query[m
[31m-[m
[31m-    local len_hi = char(rshift(len, 8))[m
[31m-    local len_lo = char(band(len, 0xff))[m
[31m-[m
[31m-    local bytes, err = sock:send({len_hi, len_lo, query})[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send query to TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    local buf, err = sock:receive(2)[m
[31m-    if not buf then[m
[31m-        return nil, "failed to receive the reply length field from TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    local len_hi = byte(buf, 1)[m
[31m-    local len_lo = byte(buf, 2)[m
[31m-    local len = lshift(len_hi, 8) + len_lo[m
[31m-[m
[31m-    -- print("tcp message len: ", len)[m
[31m-[m
[31m-    buf, err = sock:receive(len)[m
[31m-    if not buf then[m
[31m-        return nil, "failed to receive the reply message body from TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    local answers, err = parse_response(buf, id)[m
[31m-    if not answers then[m
[31m-        return nil, "failed to parse the reply from the TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    sock:close()[m
[31m-[m
[31m-    return answers[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.tcp_query(self, qname, opts)[m
[31m-    local socks = self.socks[m
[31m-    if not socks then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    pick_sock(self, socks)[m
[31m-[m
[31m-    local id = _gen_id(self)[m
[31m-[m
[31m-    local query, err = _build_request(qname, id, self.no_recurse, opts)[m
[31m-    if not query then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return _tcp_query(self, query, id)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.query(self, qname, opts)[m
[31m-    local socks = self.socks[m
[31m-    if not socks then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local id = _gen_id(self)[m
[31m-[m
[31m-    local query, err = _build_request(qname, id, self.no_recurse, opts)[m
[31m-    if not query then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    -- local cjson = require "cjson"[m
[31m-    -- print("query: ", cjson.encode(concat(query, "")))[m
[31m-[m
[31m-    local retrans = self.retrans[m
[31m-[m
[31m-    -- print("retrans: ", retrans)[m
[31m-[m
[31m-    for i = 1, retrans do[m
[31m-        local sock = pick_sock(self, socks)[m
[31m-[m
[31m-        local ok, err = sock:send(query)[m
[31m-        if not ok then[m
[31m-            local server = _get_cur_server(self)[m
[31m-            return nil, "failed to send request to UDP server "[m
[31m-                .. concat(server, ":") .. ": " .. err[m
[31m-        end[m
[31m-[m
[31m-        local buf, err[m
[31m-[m
[31m-        for j = 1, 128 do[m
[31m-            buf, err = sock:receive(4096)[m
[31m-[m
[31m-            if err then[m
[31m-                break[m
[31m-            end[m
[31m-[m
[31m-            if buf then[m
[31m-                local answers[m
[31m-                answers, err = parse_response(buf, id)[m
[31m-                if not answers then[m
[31m-                    if err == "truncated" then[m
[31m-                        return _tcp_query(self, query, id)[m
[31m-                    end[m
[31m-[m
[31m-                    if err ~= "id mismatch" then[m
[31m-                        return nil, err[m
[31m-                    end[m
[31m-[m
[31m-                    -- retry receiving when err == "id mismatch"[m
[31m-                else[m
[31m-                    return answers[m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if err ~= "timeout" or i == retrans then[m
[31m-            local server = _get_cur_server(self)[m
[31m-            return nil, "failed to receive reply from UDP server "[m
[31m-                .. concat(server, ":") .. ": " .. err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- impossible to reach here[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.compress_ipv6_addr(addr)[m
[31m-    local addr = re_sub(addr, "^(0:)+|(:0)+$|:(0:)+", "::", "jo")[m
[31m-    if addr == "::0" then[m
[31m-        addr = "::"[m
[31m-    end[m
[31m-[m
[31m-    return addr[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _expand_ipv6_addr(addr)[m
[31m-    if find(addr, "::", 1, true) then[m
[31m-        local ncol, addrlen = 8, #addr[m
[31m-[m
[31m-        for i = 1, addrlen do[m
[31m-            if byte(addr, i) == COLON_CHAR then[m
[31m-                ncol = ncol - 1[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if byte(addr, 1) == COLON_CHAR then[m
[31m-            addr = "0" .. addr[m
[31m-        end[m
[31m-[m
[31m-        if byte(addr, -1) == COLON_CHAR then[m
[31m-            addr = addr .. "0"[m
[31m-        end[m
[31m-[m
[31m-        addr = re_sub(addr, "::", ":" .. rep("0:", ncol), "jo")[m
[31m-    end[m
[31m-[m
[31m-    return addr[m
[31m-end[m
[31m-[m
[31m-[m
[31m-_M.expand_ipv6_addr = _expand_ipv6_addr[m
[31m-[m
[31m-[m
[31m-function _M.arpa_str(addr)[m
[31m-    if find(addr, ":", 1, true) then[m
[31m-        addr = _expand_ipv6_addr(addr)[m
[31m-        local idx, hidx, addrlen = 1, 1, #addr[m
[31m-[m
[31m-        for i = addrlen, 0, -1 do[m
[31m-            local s = byte(addr, i)[m
[31m-            if s == COLON_CHAR or not s then[m
[31m-                for j = hidx, 4 do[m
[31m-                    arpa_tmpl[idx] = ZERO_CHAR[m
[31m-                    idx = idx + 2[m
[31m-                end[m
[31m-                hidx = 1[m
[31m-            else[m
[31m-                arpa_tmpl[idx] = s[m
[31m-                idx = idx + 2[m
[31m-                hidx = hidx + 1[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        addr = char(unpack(arpa_tmpl))[m
[31m-    else[m
[31m-        addr = re_sub(addr, [[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})]],[m
[31m-                      "$4.$3.$2.$1.in-addr.arpa", "ajo")[m
[31m-    end[m
[31m-[m
[31m-    return addr[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reverse_query(self, addr)[m
[31m-    return self.query(self, self.arpa_str(addr),[m
[31m-                      {qtype = self.TYPE_PTR})[m
[31m-end[m
[31m-[m
[31m-[m
[31m-randomseed(ngx_time())[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/TestDNS.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/TestDNS.pm[m
[1mdeleted file mode 100644[m
[1mindex 2b3e6e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/TestDNS.pm[m
[1m+++ /dev/null[m
[36m@@ -1,277 +0,0 @@[m
[31m-package TestDNS;[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use 5.010001;[m
[31m-use Test::Nginx::Socket::Lua -Base;[m
[31m-#use JSON::XS;[m
[31m-[m
[31m-use constant {[m
[31m-    TYPE_A => 1,[m
[31m-    TYPE_TXT => 16,[m
[31m-    TYPE_CNAME => 5,[m
[31m-    TYPE_AAAA => 28,[m
[31m-    CLASS_INTERNET => 1,[m
[31m-};[m
[31m-[m
[31m-sub encode_name ($);[m
[31m-sub encode_ipv4 ($);[m
[31m-sub encode_ipv6 ($);[m
[31m-sub gen_dns_reply ($$);[m
[31m-[m
[31m-sub Test::Base::Filter::dns {[m
[31m-    my ($self, $code) = @_;[m
[31m-[m
[31m-    my $args = $self->current_arguments;[m
[31m-    #warn "args: $args";[m
[31m-    if (defined $args && $args ne 'tcp' && $args ne 'udp') {[m
[31m-        die "Invalid argument to the \"dns\" filter: $args\n";[m
[31m-    }[m
[31m-[m
[31m-    my $mode = $args // 'udp';[m
[31m-[m
[31m-    my $block = $self->current_block;[m
[31m-[m
[31m-    my $pointer_spec = $block->dns_pointers;[m
[31m-    my @pointers;[m
[31m-    if (defined $pointer_spec) {[m
[31m-        my @loops = split /\s*,\s*/, $pointer_spec;[m
[31m-        for my $loop (@loops) {[m
[31m-            my @nodes = split /\s*=>\s*/, $loop;[m
[31m-            my $prev;[m
[31m-            for my $n (@nodes) {[m
[31m-                if ($n !~ /^\d+$/ || $n == 0) {[m
[31m-                    die "bad name ID in the --- dns_pointers: $n\n";[m
[31m-                }[m
[31m-[m
[31m-                if (!defined $prev) {[m
[31m-                    $prev = $n;[m
[31m-                    next;[m
[31m-                }[m
[31m-[m
[31m-                $pointers[$prev] = $n;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $input = eval $code;[m
[31m-    if ($@) {[m
[31m-        die "failed to evaluate code $code: $@\n";[m
[31m-    }[m
[31m-[m
[31m-    if (!ref $input) {[m
[31m-        return $input;[m
[31m-    }[m
[31m-[m
[31m-    if (ref $input eq 'ARRAY') {[m
[31m-        my @replies;[m
[31m-        for my $t (@$input) {[m
[31m-            push @replies, gen_dns_reply($t, $mode);[m
[31m-        }[m
[31m-[m
[31m-        return \@replies;[m
[31m-    }[m
[31m-[m
[31m-    if (ref $input eq 'HASH') {[m
[31m-        return gen_dns_reply($input, $mode);[m
[31m-    }[m
[31m-[m
[31m-    return $input;[m
[31m-}[m
[31m-[m
[31m-sub gen_dns_reply ($$) {[m
[31m-    my ($t, $mode) = @_;[m
[31m-[m
[31m-    my @raw_names;[m
[31m-    push @raw_names, \($t->{qname});[m
[31m-[m
[31m-    my $answers = $t->{answer} // [];[m
[31m-    if (!ref $answers) {[m
[31m-        $answers = [$answers];[m
[31m-    }[m
[31m-[m
[31m-    for my $ans (@$answers) {[m
[31m-        push @raw_names, \($ans->{name});[m
[31m-        if (defined $ans->{cname}) {[m
[31m-            push @raw_names, \($ans->{cname});[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for my $rname (@raw_names) {[m
[31m-        $$rname = encode_name($$rname // "");[m
[31m-    }[m
[31m-[m
[31m-    my $qname = $t->{qname};[m
[31m-[m
[31m-    my $s = '';[m
[31m-[m
[31m-    my $id = $t->{id} // 0;[m
[31m-[m
[31m-    $s .= pack("n", $id);[m
[31m-    #warn "id: ", length($s), " ", encode_json([$s]);[m
[31m-[m
[31m-    my $qr = $t->{qr} // 1;[m
[31m-[m
[31m-    my $opcode = $t->{opcode} // 0;[m
[31m-[m
[31m-    my $aa = $t->{aa} // 0;[m
[31m-[m
[31m-    my $tc = $t->{tc} // 0;[m
[31m-    my $rd = $t->{rd} // 1;[m
[31m-    my $ra = $t->{ra} // 1;[m
[31m-[m
[31m-    my $ad = $t->{ad} // 0;[m
[31m-    my $cd = $t->{cd} // 0;[m
[31m-[m
[31m-    my $rcode = $t->{rcode} // 0;[m
[31m-[m
[31m-    my $flags = ($qr << 15) + ($opcode << 11) + ($aa << 10) + ($tc << 9)[m
[31m-                + ($rd << 8) + ($ra << 7) + ($ad << 4) + ($cd << 5) + $rcode;[m
[31m-[m
[31m-    #warn sprintf("flags: %b", $flags);[m
[31m-[m
[31m-    $flags = pack("n", $flags);[m
[31m-    $s .= $flags;[m
[31m-[m
[31m-    #warn "flags: ", length($flags), " ", encode_json([$flags]);[m
[31m-[m
[31m-    my $qdcount = $t->{qdcount} // 1;[m
[31m-    my $ancount = $t->{ancount} // scalar @$answers;[m
[31m-    my $nscount = 0;[m
[31m-    my $arcount = 0;[m
[31m-[m
[31m-    $s .= pack("nnnn", $qdcount, $ancount, $nscount, $arcount);[m
[31m-[m
[31m-    #warn "qname: ", length($qname), " ", encode_json([$qname]);[m
[31m-[m
[31m-    $s .= $qname;[m
[31m-[m
[31m-    my $qs_type = $t->{qtype} // TYPE_A;[m
[31m-    my $qs_class = $t->{qclass} // CLASS_INTERNET;[m
[31m-[m
[31m-    $s .= pack("nn", $qs_type, $qs_class);[m
[31m-[m
[31m-    for my $ans (@$answers) {[m
[31m-        my $name = $ans->{name};[m
[31m-        my $type = $ans->{type};[m
[31m-        my $class = $ans->{class};[m
[31m-        my $ttl = $ans->{ttl};[m
[31m-        my $rdlength = $ans->{rdlength};[m
[31m-        my $rddata = $ans->{rddata};[m
[31m-[m
[31m-        my $ipv4 = $ans->{ipv4};[m
[31m-        if (defined $ipv4) {[m
[31m-            my ($data, $len) = encode_ipv4($ipv4);[m
[31m-            $rddata //= $data;[m
[31m-            $rdlength //= $len;[m
[31m-            $type //= TYPE_A;[m
[31m-            $class //= CLASS_INTERNET;[m
[31m-        }[m
[31m-[m
[31m-        my $ipv6 = $ans->{ipv6};[m
[31m-        if (defined $ipv6) {[m
[31m-            my ($data, $len) = encode_ipv6($ipv6);[m
[31m-            $rddata //= $data;[m
[31m-            $rdlength //= $len;[m
[31m-            $type //= TYPE_AAAA;[m
[31m-            $class //= CLASS_INTERNET;[m
[31m-        }[m
[31m-[m
[31m-        my $cname = $ans->{cname};[m
[31m-        if (defined $cname) {[m
[31m-            $rddata //= $cname;[m
[31m-            $rdlength //= length $rddata;[m
[31m-            $type //= TYPE_CNAME;[m
[31m-            $class //= CLASS_INTERNET;[m
[31m-        }[m
[31m-[m
[31m-        my $txt = $ans->{txt};[m
[31m-        if (defined $txt) {[m
[31m-            $rddata //= $txt;[m
[31m-            $rdlength //= length $rddata;[m
[31m-            $type //= TYPE_TXT;[m
[31m-            $class //= CLASS_INTERNET;[m
[31m-        }[m
[31m-[m
[31m-        $type //= 0;[m
[31m-        $class //= 0;[m
[31m-        $ttl //= 0;[m
[31m-[m
[31m-        #warn "rdlength: $rdlength, rddata: ", encode_json([$rddata]), "\n";[m
[31m-[m
[31m-        $s .= $name . pack("nnNn", $type, $class, $ttl, $rdlength) . $rddata;[m
[31m-    }[m
[31m-[m
[31m-    if ($mode eq 'tcp') {[m
[31m-        return pack("n", length($s)) . $s;[m
[31m-    }[m
[31m-[m
[31m-    return $s;[m
[31m-}[m
[31m-[m
[31m-sub encode_ipv4 ($) {[m
[31m-    my $txt = shift;[m
[31m-    my @bytes = split /\./, $txt;[m
[31m-    return pack("CCCC", @bytes), 4;[m
[31m-}[m
[31m-[m
[31m-sub encode_ipv6 ($) {[m
[31m-    my $txt = shift;[m
[31m-    my @groups = split /:/, $txt;[m
[31m-    my $nils = 0;[m
[31m-    my $nonnils = 0;[m
[31m-    for my $g (@groups) {[m
[31m-        if ($g eq '') {[m
[31m-            $nils++;[m
[31m-        } else {[m
[31m-            $nonnils++;[m
[31m-            $g = hex($g);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $total = $nils + $nonnils;[m
[31m-    if ($total > 8 ) {[m
[31m-        die "Invalid IPv6 address: too many groups: $total: $txt";[m
[31m-    }[m
[31m-[m
[31m-    if ($nils) {[m
[31m-        my $found = 0;[m
[31m-        my @new_groups;[m
[31m-        for my $g (@groups) {[m
[31m-            if ($g eq '') {[m
[31m-                if ($found) {[m
[31m-                    next;[m
[31m-                }[m
[31m-[m
[31m-                for (1 .. 8 - $nonnils) {[m
[31m-                    push @new_groups, 0;[m
[31m-                }[m
[31m-[m
[31m-                $found = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                push @new_groups, $g;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        @groups = @new_groups;[m
[31m-    }[m
[31m-[m
[31m-    if (@groups != 8) {[m
[31m-        die "Invalid IPv6 address: $txt: @groups\n";[m
[31m-    }[m
[31m-[m
[31m-    #warn "IPv6 groups: @groups";[m
[31m-[m
[31m-    return pack("nnnnnnnn", @groups), 16;[m
[31m-}[m
[31m-[m
[31m-sub encode_name ($) {[m
[31m-    my $name = shift;[m
[31m-    $name =~ s/([^.]+)\.?/chr(length($1)) . $1/ge;[m
[31m-    $name .= "\0";[m
[31m-    return $name;[m
[31m-}[m
[31m-[m
[31m-1[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/mock.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/mock.t[m
[1mdeleted file mode 100644[m
[1mindex b9bf219..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/mock.t[m
[1m+++ /dev/null[m
[36m@@ -1,1516 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use lib 't';[m
[31m-use TestDNS;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 16);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-log_level('notice');[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single answer reply, good A answer[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty answer reply[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    qname => 'www.google.com',[m
[31m-    opcode => 0,[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: one byte reply, truncated, without TCP server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply: a[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to connect to TCP server 127.0.0.1:1953: connection refused[m
[31m---- error_log[m
[31m-connect() failed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: empty reply[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply:[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to connect to TCP server 127.0.0.1:1953: connection refused[m
[31m---- error_log[m
[31m-connect() failed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: two answers reply that contains AAAA records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 },[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456},{"address":"0:0:0:0:0:0:0:1","type":28,"class":1,"name":"l.www.google.com","ttl":0}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: good CNAME answer[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", cname => "blah.google.com", ttl => 125 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"ttl":125,"type":5,"class":1,"name":"www.google.com","cname":"blah.google.com"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: CNAME answer with bad rd length[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", cname => "blah.google.com", ttl => 125, rdlength => 3 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad cname record length: 17 ~= 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: single answer reply, bad A answer, wrong record length[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456, rdlength => 1 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad A record value length: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bad AAAA record, wrong len[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0, rdlength => 21 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad AAAA record value length: 21[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: timeout[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 1,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(100)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply_delay: 200ms[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to receive reply from UDP server 127.0.0.1:1953: timeout[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: not timeout finally (re-transmission works)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply_delay: 500ms[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "l.www.google.com", ipv6 => "FF01::101", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"address":"ff01:0:0:0:0:0:0:101","type":28,"class":1,"name":"l.www.google.com","ttl":0}][m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: timeout finally (re-transmission works but not enough retrans times)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 2,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply_delay: 500ms[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "l.www.google.com", ipv6 => "FF01::101", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to receive reply from UDP server 127.0.0.1:1953: timeout[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: RCODE - format error[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 1,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":1,"errstr":"format error"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: RCODE - server failure[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            if ans.errcode then[m
[31m-                ngx.say("error code: ", ans.errcode, ": ", ans.errstr)[m
[31m-            end[m
[31m-[m
[31m-            for i, rec in ipairs(ans) do[m
[31m-                ngx.say("record: ", cjson.encode(rec))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 2,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-error code: 2: server failure[m
[31m-record: {"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: RCODE - name error[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 3,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":3,"errstr":"name error"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: RCODE - not implemented[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 4,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":4,"errstr":"not implemented"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: RCODE - refused[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 5,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":5,"errstr":"refused"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: RCODE - unknown[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 6,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":6,"errstr":"unknown"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: TC (TrunCation) = 1, no TCP server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(1000)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    tc => 1,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to connect to TCP server 127.0.0.1:1953: connection refused[m
[31m---- error_log[m
[31m-connect() failed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: bad QR flag (0)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(1000)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    qr => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad QR flag in the DNS response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: Recursion Desired off[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-                no_recurse = true,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: id mismatch (timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                timeout = 10,[m
[31m-                retrans = 2,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 126,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-failed to query: failed to receive reply from UDP server 127.0.0.1:1953: timeout[m
[31m---- error_log[m
[31m-id mismatch in the DNS reply: 126 ~= 125[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: id mismatch (and then match)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                timeout = 10,[m
[31m-                retrans = 2,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-[[m
[31m-{[m
[31m-    id => 126,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-},[m
[31m-{[m
[31m-    id => 127,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-},[m
[31m-{[m
[31m-    id => 120,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-},[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-},[m
[31m-][m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}][m
[31m---- error_log[m
[31m-id mismatch in the DNS reply: 126 ~= 125[m
[31m-id mismatch in the DNS reply: 120 ~= 125[m
[31m-id mismatch in the DNS reply: 127 ~= 125[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: TC (TrunCation) = 1, with TCP server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(1000)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    tc => 1,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- tcp_listen: 1953[m
[31m---- tcp_query_len: 34[m
[31m---- tcp_reply dns=tcp[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 },[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456},{"address":"0:0:0:0:0:0:0:1","type":28,"class":1,"name":"l.www.google.com","ttl":0}][m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-query the TCP server due to reply truncation[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: one byte reply, truncated, with TCP server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply: a[m
[31m---- tcp_listen: 1953[m
[31m---- tcp_query_len: 34[m
[31m---- tcp_reply dns=tcp[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 },[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456},{"address":"0:0:0:0:0:0:0:1","type":28,"class":1,"name":"l.www.google.com","ttl":0}][m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-query the TCP server due to reply truncation[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: single answer reply, TXT answer with a single char string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qtype => 16,  # TXT[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", txt => "\5hello", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{10}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"class":1,"name":"www.google.com","ttl":123456,"txt":"hello","type":16}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: single answer reply, TXT answer with a null char string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qtype => 16,  # TXT[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", txt => "\0", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{10}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"class":1,"name":"www.google.com","ttl":123456,"txt":"","type":16}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: single answer reply, TXT answer with a multiple char strings[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qtype => 16,  # TXT[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", txt => "\5hello\5world", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{10}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"class":1,"name":"www.google.com","ttl":123456,"txt":["hello","world"],"type":16}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: single answer reply, multiple TXT answers[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qtype => 16,  # TXT[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", txt => "\5hello\6world!", ttl => 123456 }, { name => "www.google.com", txt => "\4blah", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{10}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"class":1,"name":"www.google.com","ttl":123456,"txt":["hello","world!"],"type":16},{"class":1,"name":"www.google.com","ttl":123456,"txt":"blah","type":16}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: single answer reply, good A answer (AD is set)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    ad => 1,[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: single answer reply, good A answer (CD is set)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    cd => 1,[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}][m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex c51b390..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,535 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/t/lib/?.lua;$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: A records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"address":"(?:\d{1,3}\.){3}\d+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: CNAME records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.yahoo.com", { qtype = r.TYPE_CNAME })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"cname":"[-_a-z0-9.]+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: AAAA records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_AAAA })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"address":"[a-fA-F0-9]*(?::[a-fA-F0-9]*)+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: compress ipv6 addr[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local c = resolver.compress_ipv6_addr[m
[31m-[m
[31m-            ngx.say(c("1080:0:0:0:8:800:200C:417A"))[m
[31m-            ngx.say(c("FF01:0:0:0:0:0:0:101"))[m
[31m-            ngx.say(c("0:0:0:0:0:0:0:1"))[m
[31m-            ngx.say(c("1:5:0:0:0:0:0:0"))[m
[31m-            ngx.say(c("7:25:0:0:0:3:0:0"))[m
[31m-            ngx.say(c("0:0:0:0:0:0:0:0"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1080::8:800:200C:417A[m
[31m-FF01::101[m
[31m-::1[m
[31m-1:5::[m
[31m-7:25::3:0:0[m
[31m-::[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: A records (TCP)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:tcp_query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"address":"(?:\d{1,3}\.){3}\d+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: MX records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("gmail.com", { qtype = r.TYPE_MX })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"preference":\d+,.*?"exchange":"[^"]+".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: NS records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("agentzh.org", { qtype = r.TYPE_NS })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"nsdname":"[^"]+".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: TXT query (no ans)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("agentzh.org", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {}[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: TXT query (with ans)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("gmail.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"txt":"v=spf\d+\s[^"]+".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: PTR query[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("4.4.8.8.in-addr.arpa", { qtype = r.TYPE_PTR })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"ptrdname":"google-public-dns-b\.google\.com".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: domains with a trailing dot[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com.", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"address":"(?:\d{1,3}\.){3}\d+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: domains with a leading dot[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query(".www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad name[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: SRV records or XMPP[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("_xmpp-client._tcp.jabber.org", { qtype = r.TYPE_SRV })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[(?:{"class":1,"name":"_xmpp-client._tcp.jabber.org","port":\d+,"priority":\d+,"target":"[\w.]+\.jabber.org","ttl":\d+,"type":33,"weight":\d+},?)+\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: SPF query (with ans)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("linkedin.com", { qtype = r.TYPE_SPF })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"spf":"v=spf\d+\s[^"]+".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: SPF query (no ans)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("agentzh.org", { qtype = r.TYPE_SPF })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {}[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: generate arpa_str[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-            local c = resolver.arpa_str[m
[31m-            ngx.say(c("1234:5678:abcd:ef99:1234:5678:abcd:ef99"))[m
[31m-            ngx.say(c("1080::8:800:200c:417a"))[m
[31m-            ngx.say(c("ff01::101"))[m
[31m-            ngx.say(c("::1"))[m
[31m-            ngx.say(c("::"))[m
[31m-            ngx.say(c("1::"))[m
[31m-            ngx.say(c("127.0.0.1"))[m
[31m-            ngx.say(c("251.252.253.254"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-9.9.f.e.d.c.b.a.8.7.6.5.4.3.2.1.9.9.f.e.d.c.b.a.8.7.6.5.4.3.2.1.ip6.arpa[m
[31m-a.7.1.4.c.0.0.2.0.0.8.0.8.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.0.1.ip6.arpa[m
[31m-1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.f.f.ip6.arpa[m
[31m-1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa[m
[31m-0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa[m
[31m-0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.ip6.arpa[m
[31m-1.0.0.127.in-addr.arpa[m
[31m-254.253.252.251.in-addr.arpa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ee195dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-dns-0.16/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,549 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 4e1b699..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/lib/resty/lock.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/lib/resty/lock.lua[m
[1mdeleted file mode 100644[m
[1mindex dcd601b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/lib/resty/lock.lua[m
[1m+++ /dev/null[m
[36m@@ -1,208 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local shared = ngx.shared[m
[31m-local sleep = ngx.sleep[m
[31m-local shdict_mt[m
[31m-local debug = ngx.config.debug[m
[31m-local setmetatable = setmetatable[m
[31m-local getmetatable = getmetatable[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.04' }[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-local FREE_LIST_REF = 0[m
[31m-[m
[31m--- FIXME: we don't need this when we have __gc metamethod support on Lua[m
[31m---        tables.[m
[31m-local memo = {}[m
[31m-if debug then _M.memo = memo end[m
[31m-[m
[31m-[m
[31m-local function ref_obj(key)[m
[31m-    if key == nil then[m
[31m-        return -1[m
[31m-    end[m
[31m-    local ref = memo[FREE_LIST_REF][m
[31m-    if ref and ref ~= 0 then[m
[31m-         memo[FREE_LIST_REF] = memo[ref][m
[31m-[m
[31m-    else[m
[31m-        ref = #memo + 1[m
[31m-    end[m
[31m-    memo[ref] = key[m
[31m-[m
[31m-    -- print("ref key_id returned ", ref)[m
[31m-    return ref[m
[31m-end[m
[31m-if debug then _M.ref_obj = ref_obj end[m
[31m-[m
[31m-[m
[31m-local function unref_obj(ref)[m
[31m-    if ref >= 0 then[m
[31m-        memo[ref] = memo[FREE_LIST_REF][m
[31m-        memo[FREE_LIST_REF] = ref[m
[31m-    end[m
[31m-end[m
[31m-if debug then _M.unref_obj = unref_obj end[m
[31m-[m
[31m-[m
[31m-local function gc_lock(cdata)[m
[31m-    local dict_id = tonumber(cdata.dict_id)[m
[31m-    local key_id = tonumber(cdata.key_id)[m
[31m-[m
[31m-    -- print("key_id: ", key_id, ", key: ", memo[key_id], "dict: ",[m
[31m-    --       type(memo[cdata.dict_id]))[m
[31m-    if key_id > 0 then[m
[31m-        local key = memo[key_id][m
[31m-        unref_obj(key_id)[m
[31m-        local dict = memo[dict_id][m
[31m-        -- print("dict.delete type: ", type(dict.delete))[m
[31m-        local ok, err = dict:delete(key)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, 'failed to delete key "', key, '": ', err)[m
[31m-        end[m
[31m-        cdata.key_id = 0[m
[31m-    end[m
[31m-[m
[31m-    unref_obj(dict_id)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local ctype = ffi.metatype("struct { int key_id; int dict_id; }",[m
[31m-                           { __gc = gc_lock })[m
[31m-[m
[31m-[m
[31m-function _M.new(_, dict_name, opts)[m
[31m-    local dict = shared[dict_name][m
[31m-    if not dict then[m
[31m-        return nil, "dictionary not found"[m
[31m-    end[m
[31m-    local cdata = ffi_new(ctype)[m
[31m-    cdata.key_id = 0[m
[31m-    cdata.dict_id = ref_obj(dict)[m
[31m-[m
[31m-    local timeout, exptime, step, ratio, max_step[m
[31m-    if opts then[m
[31m-        timeout = opts.timeout[m
[31m-        exptime = opts.exptime[m
[31m-        step = opts.step[m
[31m-        ratio = opts.ratio[m
[31m-        max_step = opts.max_step[m
[31m-    end[m
[31m-[m
[31m-    if not exptime then[m
[31m-        exptime = 30[m
[31m-    end[m
[31m-[m
[31m-    if timeout and timeout > exptime then[m
[31m-        timeout = exptime[m
[31m-    end[m
[31m-[m
[31m-    local self = {[m
[31m-        cdata = cdata,[m
[31m-        dict = dict,[m
[31m-        timeout = timeout or 5,[m
[31m-        exptime = exptime,[m
[31m-        step = step or 0.001,[m
[31m-        ratio = ratio or 2,[m
[31m-        max_step = max_step or 0.5,[m
[31m-    }[m
[31m-    return setmetatable(self, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.lock(self, key)[m
[31m-    if not key then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    local dict = self.dict[m
[31m-    local cdata = self.cdata[m
[31m-    if cdata.key_id > 0 then[m
[31m-        return nil, "locked"[m
[31m-    end[m
[31m-    local exptime = self.exptime[m
[31m-    local ok, err = dict:add(key, true, exptime)[m
[31m-    if ok then[m
[31m-        cdata.key_id = ref_obj(key)[m
[31m-        if not shdict_mt then[m
[31m-            shdict_mt = getmetatable(dict)[m
[31m-        end[m
[31m-        return 0[m
[31m-    end[m
[31m-    if err ~= "exists" then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-    -- lock held by others[m
[31m-    local step = self.step[m
[31m-    local ratio = self.ratio[m
[31m-    local timeout = self.timeout[m
[31m-    local max_step = self.max_step[m
[31m-    local elapsed = 0[m
[31m-    while timeout > 0 do[m
[31m-        if step > timeout then[m
[31m-            step = timeout[m
[31m-        end[m
[31m-[m
[31m-        sleep(step)[m
[31m-        elapsed = elapsed + step[m
[31m-        timeout = timeout - step[m
[31m-[m
[31m-        local ok, err = dict:add(key, true, exptime)[m
[31m-        if ok then[m
[31m-            cdata.key_id = ref_obj(key)[m
[31m-            if not shdict_mt then[m
[31m-                shdict_mt = getmetatable(dict)[m
[31m-            end[m
[31m-            return elapsed[m
[31m-        end[m
[31m-[m
[31m-        if err ~= "exists" then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if timeout <= 0 then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        step = step * ratio[m
[31m-        if step <= 0 then[m
[31m-            step = 0.001[m
[31m-        end[m
[31m-        if step > max_step then[m
[31m-            step = max_step[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return nil, "timeout"[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.unlock(self)[m
[31m-    local dict = self.dict[m
[31m-    local cdata = self.cdata[m
[31m-    local key_id = tonumber(cdata.key_id)[m
[31m-    if key_id <= 0 then[m
[31m-        return nil, "unlocked"[m
[31m-    end[m
[31m-[m
[31m-    local key = memo[key_id][m
[31m-    unref_obj(key_id)[m
[31m-[m
[31m-    local ok, err = dict:delete(key)[m
[31m-    if not ok then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-    cdata.key_id = 0[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex b04497c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,470 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-    lua_shared_dict cache_locks 100k;[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: lock is subject to garbage collection[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            for i = 1, 2 do[m
[31m-                collectgarbage("collect")[m
[31m-                local lock = lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock("foo")[m
[31m-                ngx.say("lock: ", elapsed, ", ", err)[m
[31m-            end[m
[31m-            collectgarbage("collect")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-lock: 0, nil[m
[31m-lock: 0, nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: serial lock and unlock[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            for i = 1, 2 do[m
[31m-                local lock = lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock("foo")[m
[31m-                ngx.say("lock: ", elapsed, ", ", err)[m
[31m-                local ok, err = lock:unlock()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to unlock: ", err)[m
[31m-                end[m
[31m-                ngx.say("unlock: ", ok)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-lock: 0, nil[m
[31m-unlock: 1[m
[31m-lock: 0, nil[m
[31m-unlock: 1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: timed out locks[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            for i = 1, 2 do[m
[31m-                local lock1 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-                local lock2 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-[m
[31m-                local elapsed, err = lock1:lock("foo")[m
[31m-                ngx.say("lock 1: lock: ", elapsed, ", ", err)[m
[31m-[m
[31m-                local elapsed, err = lock2:lock("foo")[m
[31m-                ngx.say("lock 2: lock: ", elapsed, ", ", err)[m
[31m-[m
[31m-                local ok, err = lock1:unlock()[m
[31m-                ngx.say("lock 1: unlock: ", ok, ", ", err)[m
[31m-[m
[31m-                local ok, err = lock2:unlock()[m
[31m-                ngx.say("lock 2: unlock: ", ok, ", ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-lock 1: lock: 0, nil[m
[31m-lock 2: lock: nil, timeout[m
[31m-lock 1: unlock: 1, nil[m
[31m-lock 2: unlock: nil, unlocked[m
[31m-lock 1: lock: 0, nil[m
[31m-lock 2: lock: nil, timeout[m
[31m-lock 1: unlock: 1, nil[m
[31m-lock 2: unlock: nil, unlocked[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: waited locks[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks")[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-sub thread: unlock: 1[m
[31m-main thread: lock: 0.12[6-9] nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: waited locks (custom step)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks", { step = 0.01 })[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-sub thread: unlock: 1[m
[31m-main thread: lock: 0.1[4-5]\d* nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: waited locks (custom ratio)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks", { ratio = 3 })[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-sub thread: unlock: 1[m
[31m-main thread: lock: 0.1[2]\d* nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: waited locks (custom max step)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks", { max_step = 0.05 })[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-sub thread: unlock: 1[m
[31m-main thread: lock: 0.11[2-4]\d* nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: lock expired by itself[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks", { exptime = 0.1 })[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                -- ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks", { max_step = 0.05 })[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-main thread: lock: 0.11[2-4]\d* nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ref & unref (1 at most)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            local memo = lock.memo[m
[31m-            local ref = lock.ref_obj("foo")[m
[31m-            ngx.say(#memo)[m
[31m-            lock.unref_obj(ref)[m
[31m-            ngx.say(#memo)[m
[31m-            ref = lock.ref_obj("bar")[m
[31m-            ngx.say(#memo)[m
[31m-            lock.unref_obj(ref)[m
[31m-            ngx.say(#memo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m-0[m
[31m-1[m
[31m-0[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ref & unref (2 at most)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            local memo = lock.memo[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local refs = {}[m
[31m-[m
[31m-                refs[1] = lock.ref_obj("foo")[m
[31m-                ngx.say(#memo)[m
[31m-[m
[31m-                refs[2] = lock.ref_obj("bar")[m
[31m-                ngx.say(#memo)[m
[31m-[m
[31m-                lock.unref_obj(refs[1])[m
[31m-                ngx.say(#memo)[m
[31m-[m
[31m-                lock.unref_obj(refs[2])[m
[31m-                ngx.say(#memo)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-2[m
[31m-2[m
[31m-2[m
[31m-2[m
[31m-1[m
[31m-1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: lock on a nil key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            local lock = lock:new("cache_locks")[m
[31m-            local elapsed, err = lock:lock(nil)[m
[31m-            if elapsed then[m
[31m-                ngx.say("lock: ", elapsed, ", ", err)[m
[31m-                local ok, err = lock:unlock()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to unlock: ", err)[m
[31m-                end[m
[31m-            else[m
[31m-                ngx.say("failed to lock: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to lock: nil key[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: same shdict, multple locks[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            local memo = lock.memo[m
[31m-            local lock1 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-            for i = 1, 3 do[m
[31m-                lock1:lock("lock_key")[m
[31m-                lock1:unlock()[m
[31m-                collectgarbage("collect")[m
[31m-            end[m
[31m-[m
[31m-            local lock2 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-            local lock3 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-            lock2:lock("lock_key")[m
[31m-            lock3:lock("lock_key")[m
[31m-            collectgarbage("collect")[m
[31m-[m
[31m-            ngx.say(#memo)[m
[31m-[m
[31m-            lock2:unlock()[m
[31m-            lock3:unlock()[m
[31m-            collectgarbage("collect")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: timed out locks (0 timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            for i = 1, 2 do[m
[31m-                local lock1 = lock:new("cache_locks", { timeout = 0 })[m
[31m-                local lock2 = lock:new("cache_locks", { timeout = 0 })[m
[31m-[m
[31m-                local elapsed, err = lock1:lock("foo")[m
[31m-                ngx.say("lock 1: lock: ", elapsed, ", ", err)[m
[31m-[m
[31m-                local elapsed, err = lock2:lock("foo")[m
[31m-                ngx.say("lock 2: lock: ", elapsed, ", ", err)[m
[31m-[m
[31m-                local ok, err = lock1:unlock()[m
[31m-                ngx.say("lock 1: unlock: ", ok, ", ", err)[m
[31m-[m
[31m-                local ok, err = lock2:unlock()[m
[31m-                ngx.say("lock 2: unlock: ", ok, ", ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-lock 1: lock: 0, nil[m
[31m-lock 2: lock: nil, timeout[m
[31m-lock 1: unlock: 1, nil[m
[31m-lock 2: unlock: nil, unlocked[m
[31m-lock 1: lock: 0, nil[m
[31m-lock 2: lock: nil, timeout[m
[31m-lock 1: unlock: 1, nil[m
[31m-lock 2: unlock: nil, unlocked[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 3097828..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lock-0.04/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Param[m
[31m-    epoll_ctl(event)[m
[31m-    fun:epoll_ctl[m
[31m-    fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 133810f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/lrucache[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/[m
[31m-	$(INSTALL) lib/resty/lrucache/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/lrucache/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/lib/resty/lrucache.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/lib/resty/lrucache.lua[m
[1mdeleted file mode 100644[m
[1mindex fdaccde..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/lib/resty/lrucache.lua[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_sizeof = ffi.sizeof[m
[31m-local ffi_cast = ffi.cast[m
[31m-local ffi_fill = ffi.fill[m
[31m-local ngx_now = ngx.now[m
[31m-local uintptr_t = ffi.typeof("uintptr_t")[m
[31m-local setmetatable = setmetatable[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m--- queue data types[m
[31m---[m
[31m--- this queue is a double-ended queue and the first node[m
[31m--- is reserved for the queue itself.[m
[31m--- the implementation is mostly borrowed from nginx's ngx_queue_t data[m
[31m--- structure.[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    typedef struct lrucache_queue_s  lrucache_queue_t;[m
[31m-    struct lrucache_queue_s {[m
[31m-        double             expire;  /* in seconds */[m
[31m-        lrucache_queue_t  *prev;[m
[31m-        lrucache_queue_t  *next;[m
[31m-    };[m
[31m-]][m
[31m-[m
[31m-local queue_arr_type = ffi.typeof("lrucache_queue_t[?]")[m
[31m-local queue_ptr_type = ffi.typeof("lrucache_queue_t*")[m
[31m-local queue_type = ffi.typeof("lrucache_queue_t")[m
[31m-local NULL = ffi.null[m
[31m-[m
[31m-[m
[31m--- queue utility functions[m
[31m-[m
[31m-local function queue_insert_tail(h, x)[m
[31m-    local last = h[0].prev[m
[31m-    x.prev = last[m
[31m-    last.next = x[m
[31m-    x.next = h[m
[31m-    h[0].prev = x[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_init(size)[m
[31m-    if not size then[m
[31m-        size = 0[m
[31m-    end[m
[31m-    local q = ffi_new(queue_arr_type, size + 1)[m
[31m-    ffi_fill(q, ffi_sizeof(queue_type, size + 1), 0)[m
[31m-[m
[31m-    if size == 0 then[m
[31m-        q[0].prev = q[m
[31m-        q[0].next = q[m
[31m-[m
[31m-    else[m
[31m-        local prev = q[0][m
[31m-        for i = 1, size do[m
[31m-          local e = q[i][m
[31m-          prev.next = e[m
[31m-          e.prev = prev[m
[31m-          prev = e[m
[31m-        end[m
[31m-[m
[31m-        local last = q[size][m
[31m-        last.next = q[m
[31m-        q[0].prev = last[m
[31m-    end[m
[31m-[m
[31m-    return q[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_is_empty(q)[m
[31m-    -- print("q: ", tostring(q), "q.prev: ", tostring(q), ": ", q == q.prev)[m
[31m-    return q == q[0].prev[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_remove(x)[m
[31m-    local prev = x.prev[m
[31m-    local next = x.next[m
[31m-[m
[31m-    next.prev = prev[m
[31m-    prev.next = next[m
[31m-[m
[31m-    -- for debugging purpose only:[m
[31m-    x.prev = NULL[m
[31m-    x.next = NULL[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_insert_head(h, x)[m
[31m-    x.next = h[0].next[m
[31m-    x.next.prev = x[m
[31m-    x.prev = h[m
[31m-    h[0].next = x[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_last(h)[m
[31m-    return h[0].prev[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_head(h)[m
[31m-    return h[0].next[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- true module stuffs[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = '0.04'[m
[31m-}[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-local function ptr2num(ptr)[m
[31m-    return tonumber(ffi_cast(uintptr_t, ptr))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.new(size)[m
[31m-    if size < 1 then[m
[31m-        return nil, "size too small"[m
[31m-    end[m
[31m-[m
[31m-    local self = {[m
[31m-        keys = {},[m
[31m-        hasht = {},[m
[31m-        free_queue = queue_init(size),[m
[31m-        cache_queue = queue_init(),[m
[31m-        key2node = {},[m
[31m-        node2key = {},[m
[31m-    }[m
[31m-    return setmetatable(self, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get(self, key)[m
[31m-    local hasht = self.hasht[m
[31m-    local val = hasht[key][m
[31m-    if not val then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    local node = self.key2node[key][m
[31m-[m
[31m-    -- print(key, ": moving node ", tostring(node), " to cache queue head")[m
[31m-    local cache_queue = self.cache_queue[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_head(cache_queue, node)[m
[31m-[m
[31m-    if node.expire >= 0 and node.expire < ngx_now() then[m
[31m-        -- print("expired: ", node.expire, " > ", ngx_now())[m
[31m-        return nil, val[m
[31m-    end[m
[31m-    return val[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.delete(self, key)[m
[31m-    self.hasht[key] = nil[m
[31m-[m
[31m-    local key2node = self.key2node[m
[31m-    local node = key2node[key][m
[31m-[m
[31m-    if not node then[m
[31m-        return false[m
[31m-    end[m
[31m-[m
[31m-    key2node[key] = nil[m
[31m-    self.node2key[ptr2num(node)] = nil[m
[31m-[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_tail(self.free_queue, node)[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set(self, key, value, ttl)[m
[31m-    local hasht = self.hasht[m
[31m-    hasht[key] = value[m
[31m-[m
[31m-    local key2node = self.key2node[m
[31m-    local node = key2node[key][m
[31m-    if not node then[m
[31m-        local free_queue = self.free_queue[m
[31m-        local node2key = self.node2key[m
[31m-[m
[31m-        if queue_is_empty(free_queue) then[m
[31m-            -- evict the least recently used key[m
[31m-            -- assert(not queue_is_empty(self.cache_queue))[m
[31m-            node = queue_last(self.cache_queue)[m
[31m-[m
[31m-            local oldkey = node2key[ptr2num(node)][m
[31m-            -- print(key, ": evicting oldkey: ", oldkey, ", oldnode: ",[m
[31m-            --         tostring(node))[m
[31m-            if oldkey then[m
[31m-                hasht[oldkey] = nil[m
[31m-                key2node[oldkey] = nil[m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            -- take a free queue node[m
[31m-            node = queue_head(free_queue)[m
[31m-            -- print(key, ": get a new free node: ", tostring(node))[m
[31m-        end[m
[31m-[m
[31m-        node2key[ptr2num(node)] = key[m
[31m-        key2node[key] = node[m
[31m-    end[m
[31m-[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_head(self.cache_queue, node)[m
[31m-[m
[31m-    if ttl then[m
[31m-        node.expire = ngx_now() + ttl[m
[31m-    else[m
[31m-        node.expire = -1[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/lib/resty/lrucache/pureffi.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/lib/resty/lrucache/pureffi.lua[m
[1mdeleted file mode 100644[m
[1mindex 6f82ed5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/lib/resty/lrucache/pureffi.lua[m
[1m+++ /dev/null[m
[36m@@ -1,534 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m--- Copyright (C) Shuxin Yang[m
[31m-[m
[31m---[[[m
[31m-  This module implements a key/value cache store. We adopt LRU as our[m
[31m-replace/evict policy. Each key/value pair is tagged with a Time-to-Live (TTL);[m
[31m-from user's perspective, stale pairs are automatically removed from the cache.[m
[31m-[m
[31m-Why FFI[m
[31m--------[m
[31m-  In Lua, expression "table[key] = nil" does not *PHYSICALLY* remove the value[m
[31m-associated with the key; it just set the value to be nil! So the table will[m
[31m-keep growing with large number of the key/nil pairs which will be purged until[m
[31m-resize() operator is called.[m
[31m-[m
[31m-  This "feature" is terribly ill-suited to what we need. Therefore we have to[m
[31m-rely on FFI to build a hash-table where any entry can be physically deleted[m
[31m-immediately.[m
[31m-[m
[31m-Under the hood:[m
[31m---------------[m
[31m-  In concept, we introduce three data structures to implement the cache store:[m
[31m-    1. key/value vector for storing keys and values.[m
[31m-    2. a queue to mimic the LRU.[m
[31m-    3. hash-table for looking up the value for a given key.[m
[31m-[m
[31m-  Unfortunately, efficiency and clarity usually come at each other cost. The[m
[31m-data strucutres we are using are slightly more complicated than what we[m
[31m-described above.[m
[31m-[m
[31m-   o. Lua does not have efficient way to store a vector of pair. So, we use[m
[31m-      two vectors for key/value pair: one for keys and the other for values[m
[31m-      (_M.key_v and _M.val_v, respectively), and i-th key corresponds to[m
[31m-      i-th value.[m
[31m-[m
[31m-      A key/value pair is identified by the "id" field in a "node" (we shall[m
[31m-      discuss node later)[m
[31m-[m
[31m-    o. The queue is nothing more than a doubly-linked list of "node" linked via[m
[31m-        lrucache_pureffi_queue_s::{next|prev} fields.[m
[31m-[m
[31m-    o. The hash-table has two parts:[m
[31m-        - the _M.bucket_v[] a vector of bucket, indiced by hash-value, and[m
[31m-        - a bucket is a singly-linked list of "node" via the[m
[31m-          lrucache_pureffi_queue_s::conflict field.[m
[31m-[m
[31m-      A key must be a string, and the hash value of a key is evaluated by:[m
[31m-      crc32(key-cast-to-pointer) % size(_M.bucket_v).[m
[31m-      We mandate size(_M.bucket_v) being a power-of-two in order to avoid[m
[31m-      expensive modulo operation.[m
[31m-[m
[31m-    At the heart of the module is an array of "node" (of type[m
[31m-    lrucache_pureffi_queue_s). A node:[m
[31m-      - keeps the meta-data of its corresponding key/value pair[m
[31m-        (embodied by the "id", and "expire" field);[m
[31m-      - is a part of LRU queue (embodied by "prev" and "next" fields);[m
[31m-      - is a part of hash-table (embodied by the "conflict" field).[m
[31m-]][m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local bit = require "bit"[m
[31m-[m
[31m-[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_sizeof = ffi.sizeof[m
[31m-local ffi_cast = ffi.cast[m
[31m-local ffi_fill = ffi.fill[m
[31m-local ngx_now = ngx.now[m
[31m-local uintptr_t = ffi.typeof("uintptr_t")[m
[31m-local c_str_t = ffi.typeof("const char*")[m
[31m-local int_t = ffi.typeof("int")[m
[31m-local int_array_t = ffi.typeof("int[?]")[m
[31m-[m
[31m-[m
[31m-local crc_tab = ffi.new("const unsigned int[256]", {[m
[31m-    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,[m
[31m-    0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,[m
[31m-    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,[m
[31m-    0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,[m
[31m-    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,[m
[31m-    0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,[m
[31m-    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,[m
[31m-    0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,[m
[31m-    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,[m
[31m-    0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,[m
[31m-    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,[m
[31m-    0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,[m
[31m-    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,[m
[31m-    0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,[m
[31m-    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,[m
[31m-    0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,[m
[31m-    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,[m
[31m-    0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,[m
[31m-    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,[m
[31m-    0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,[m
[31m-    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,[m
[31m-    0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,[m
[31m-    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,[m
[31m-    0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,[m
[31m-    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,[m
[31m-    0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,[m
[31m-    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,[m
[31m-    0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,[m
[31m-    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,[m
[31m-    0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,[m
[31m-    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,[m
[31m-    0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,[m
[31m-    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,[m
[31m-    0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,[m
[31m-    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,[m
[31m-    0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,[m
[31m-    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,[m
[31m-    0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,[m
[31m-    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,[m
[31m-    0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,[m
[31m-    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,[m
[31m-    0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,[m
[31m-    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D });[m
[31m-[m
[31m-local setmetatable = setmetatable[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-local brshift = bit.rshift[m
[31m-local bxor = bit.bxor[m
[31m-local band = bit.band[m
[31m-[m
[31m-local ok, tab_new = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    tab_new = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m--- queue data types[m
[31m---[m
[31m--- this queue is a double-ended queue and the first node[m
[31m--- is reserved for the queue itself.[m
[31m--- the implementation is mostly borrowed from nginx's ngx_queue_t data[m
[31m--- structure.[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    /* A lrucache_pureffi_queue_s node hook together three data structures:[m
[31m-     *   o. the key/value store as embodied by the "id" (which is in essence the[m
[31m-     *      indentifier of key/pair pair) and the "expire" (which is a metadata[m
[31m-     *      of the corresponding key/pair pair).[m
[31m-     *   o. The LRU queue via the prev/next fields.[m
[31m-     *   o. The hash-tabble as embodied by the "conflict" field.[m
[31m-     */[m
[31m-    typedef struct lrucache_pureffi_queue_s  lrucache_pureffi_queue_t;[m
[31m-    struct lrucache_pureffi_queue_s {[m
[31m-        /* Each node is assigned a unique ID at construction time, and the[m
[31m-         * ID remain immutatble, regardless the node is in active-list or[m
[31m-         * free-list. The queue header is assigned ID 0. Since queue-header[m
[31m-         * is a sentinel node, 0 denodes "invalid ID".[m
[31m-         *[m
[31m-         * Intuitively, we can view the "id" as the identifier of key/value[m
[31m-         * pair.[m
[31m-         */[m
[31m-        int                id;[m
[31m-[m
[31m-        /* The bucket of the hash-table is implemented as a singly-linked list.[m
[31m-         * The "conflict" refers to the ID of the next node in the bucket.[m
[31m-         */[m
[31m-        int                conflict;[m
[31m-[m
[31m-        double             expire;  /* in seconds */[m
[31m-[m
[31m-        lrucache_pureffi_queue_t  *prev;[m
[31m-        lrucache_pureffi_queue_t  *next;[m
[31m-    };[m
[31m-]][m
[31m-[m
[31m-local queue_arr_type = ffi.typeof("lrucache_pureffi_queue_t[?]")[m
[31m-local queue_ptr_type = ffi.typeof("lrucache_pureffi_queue_t*")[m
[31m-local queue_type = ffi.typeof("lrucache_pureffi_queue_t")[m
[31m-local NULL = ffi.null[m
[31m-[m
[31m-[m
[31m---========================================================================[m
[31m---[m
[31m---              Queue utility functions[m
[31m---[m
[31m---========================================================================[m
[31m-[m
[31m--- Append the element "x" to the given queue "h".[m
[31m-local function queue_insert_tail(h, x)[m
[31m-    local last = h[0].prev[m
[31m-    x.prev = last[m
[31m-    last.next = x[m
[31m-    x.next = h[m
[31m-    h[0].prev = x[m
[31m-end[m
[31m-[m
[31m-[m
[31m---[[[m
[31m-Allocate a queue with size + 1 elements. Elements are linked together in a[m
[31m-circular way, i.e. the last element's "next" points to the first element,[m
[31m-while the first element's "prev" element points to the last element.[m
[31m-]][m
[31m-local function queue_init(size)[m
[31m-    if not size then[m
[31m-        size = 0[m
[31m-    end[m
[31m-    local q = ffi_new(queue_arr_type, size + 1)[m
[31m-    ffi_fill(q, ffi_sizeof(queue_type, size + 1), 0)[m
[31m-[m
[31m-    if size == 0 then[m
[31m-        q[0].prev = q[m
[31m-        q[0].next = q[m
[31m-[m
[31m-    else[m
[31m-        local prev = q[0][m
[31m-        for i = 1, size do[m
[31m-          local e = q[i][m
[31m-          e.id = i[m
[31m-          prev.next = e[m
[31m-          e.prev = prev[m
[31m-          prev = e[m
[31m-        end[m
[31m-[m
[31m-        local last = q[size][m
[31m-        last.next = q[m
[31m-        q[0].prev = last[m
[31m-    end[m
[31m-[m
[31m-    return q[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_is_empty(q)[m
[31m-    -- print("q: ", tostring(q), "q.prev: ", tostring(q), ": ", q == q.prev)[m
[31m-    return q == q[0].prev[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_remove(x)[m
[31m-    local prev = x.prev[m
[31m-    local next = x.next[m
[31m-[m
[31m-    next.prev = prev[m
[31m-    prev.next = next[m
[31m-[m
[31m-    -- for debugging purpose only:[m
[31m-    x.prev = NULL[m
[31m-    x.next = NULL[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- Insert the element "x" the to the given queue "h"[m
[31m-local function queue_insert_head(h, x)[m
[31m-    x.next = h[0].next[m
[31m-    x.next.prev = x[m
[31m-    x.prev = h[m
[31m-    h[0].next = x[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_last(h)[m
[31m-    return h[0].prev[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_head(h)[m
[31m-    return h[0].next[m
[31m-end[m
[31m-[m
[31m-[m
[31m---========================================================================[m
[31m---[m
[31m---              Miscellaneous Utility Functions[m
[31m---[m
[31m---========================================================================[m
[31m-[m
[31m-local function ptr2num(ptr)[m
[31m-    return tonumber(ffi_cast(uintptr_t, ptr))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function crc32_ptr(ptr)[m
[31m-    local crc32 = 0;[m
[31m-[m
[31m-    local p = brshift(ptr2num(ptr), 3)[m
[31m-    local b = band(p, 255)[m
[31m-    crc32 = crc_tab[b][m
[31m-[m
[31m-    b = band(brshift(p, 8), 255)[m
[31m-    crc32 = bxor(brshift(crc32, 8), crc_tab[band(bxor(crc32, b), 255)])[m
[31m-[m
[31m-    b = band(brshift(p, 16), 255)[m
[31m-    crc32 = bxor(brshift(crc32, 8), crc_tab[band(bxor(crc32, b), 255)])[m
[31m-[m
[31m-    --b = band(brshift(p, 24), 255)[m
[31m-    --crc32 = bxor(brshift(crc32, 8), crc_tab[band(bxor(crc32, b), 255)])[m
[31m-    return crc32[m
[31m-end[m
[31m-[m
[31m-[m
[31m---========================================================================[m
[31m---[m
[31m---              Implementation of "export" functions[m
[31m---[m
[31m---========================================================================[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = '0.04'[m
[31m-}[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m--- "size" specifies the maximum number of entries in the LRU queue, and the[m
[31m--- "load_factor" designates the 'load factor' of the hash-table we are using[m
[31m--- internally. The default value of load-factor is 0.5 (i.e. 50%); if the[m
[31m--- load-factor is specified, it will be clamped to the range of [0.1, 1](i.e.[m
[31m--- if load-factor is greater than 1, it will be saturated to 1, likewise,[m
[31m--- if load-factor is smaller than 0.1, it will be clamped to 0.1).[m
[31m-function _M.new(size, load_factor)[m
[31m-    if size < 1 then[m
[31m-        return nil, "size too small"[m
[31m-    end[m
[31m-[m
[31m-    -- Determine bucket size, which must be power of two.[m
[31m-    local load_f = load_factor[m
[31m-    if not load_factor then[m
[31m-        load_f = 0.5[m
[31m-    elseif load_factor > 1 then[m
[31m-        load_f = 1[m
[31m-    elseif load_factor < 0.1 then[m
[31m-        load_f = 0.1[m
[31m-    end[m
[31m-[m
[31m-    local bs_min = size / load_f[m
[31m-    -- The bucket_sz *MUST* be a power-of-two. See the hash_string().[m
[31m-    local bucket_sz = 1[m
[31m-    repeat[m
[31m-        bucket_sz = bucket_sz * 2[m
[31m-    until bucket_sz >= bs_min[m
[31m-[m
[31m-    local self = {[m
[31m-        size = size,[m
[31m-        bucket_sz = bucket_sz,[m
[31m-        free_queue = queue_init(size),[m
[31m-        cache_queue = queue_init(0),[m
[31m-        node_v = nil,[m
[31m-        key_v = tab_new(size, 0),[m
[31m-        val_v = tab_new(size, 0),[m
[31m-        bucket_v = ffi_new(int_array_t, bucket_sz)[m
[31m-    }[m
[31m-    -- "note_v" is an array of all the nodes used in the LRU queue. Exprpession[m
[31m-    -- node_v[i] evaluates to the element of ID "i".[m
[31m-    self.node_v = self.free_queue[m
[31m-[m
[31m-    -- Allocate the array-part of the key_v, val_v, bucket_v.[m
[31m-    local key_v = self.key_v[m
[31m-    local val_v = self.val_v[m
[31m-    local bucket_v = self.bucket_v[m
[31m-    ffi_fill(self.bucket_v, ffi_sizeof(int_t, bucket_sz), 0)[m
[31m-[m
[31m-    return setmetatable(self, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function hash_string(self, str)[m
[31m-    local c_str = ffi_cast(c_str_t, str)[m
[31m-[m
[31m-    local hv = crc32_ptr(c_str)[m
[31m-    hv = band(hv, self.bucket_sz - 1)[m
[31m-    -- Hint: bucket is 0-based[m
[31m-    return hv[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- Search the node associated with the key in the bucket, if found returns[m
[31m--- the the id of the node, and the id of its previous node in the conflict list.[m
[31m--- The "bucket_hdr_id" is the ID of the first node in the bucket[m
[31m-local function _find_node_in_bucket(key, key_v, node_v, bucket_hdr_id)[m
[31m-    if bucket_hdr_id ~= 0 then[m
[31m-        local prev = 0[m
[31m-        local cur = bucket_hdr_id[m
[31m-[m
[31m-        while cur ~= 0 and key_v[cur] ~= key do[m
[31m-            prev = cur[m
[31m-            cur = node_v[cur].conflict[m
[31m-        end[m
[31m-[m
[31m-        if cur ~= 0 then[m
[31m-            return cur, prev[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- Return the node corresponding to the key/val.[m
[31m-local function find_key(self, key)[m
[31m-    local key_hash = hash_string(self, key)[m
[31m-    return _find_node_in_bucket(key, self.key_v, self.node_v,[m
[31m-                                self.bucket_v[key_hash])[m
[31m-end[m
[31m-[m
[31m-[m
[31m---[[ This function tries to[m
[31m-  1. Remove the given key and the associated value from the key/value store,[m
[31m-  2. Remove the entry associated with the key from the hash-table.[m
[31m-[m
[31m-  NOTE: all queues remain intact.[m
[31m-[m
[31m-  If there was a node bound to the key/val, return that node; otherwise,[m
[31m-  nil is returned.[m
[31m-]][m
[31m-local function remove_key(self, key)[m
[31m-    local key_v = self.key_v[m
[31m-    local val_v = self.val_v[m
[31m-    local node_v = self.node_v[m
[31m-    local bucket_v = self.bucket_v[m
[31m-[m
[31m-    local key_hash = hash_string(self, key)[m
[31m-    local cur, prev =[m
[31m-        _find_node_in_bucket(key, key_v, node_v, bucket_v[key_hash])[m
[31m-[m
[31m-    if cur then[m
[31m-        -- In an attempt to make key and val dead.[m
[31m-        key_v[cur] = nil[m
[31m-        val_v[cur] = nil[m
[31m-[m
[31m-        -- Remove the node from the hash table[m
[31m-        local next_node = node_v[cur].conflict[m
[31m-        if prev ~= 0 then[m
[31m-            node_v[prev].conflict = next_node[m
[31m-        else[m
[31m-            bucket_v[key_hash] = next_node[m
[31m-        end[m
[31m-        node_v[cur].conflict = 0[m
[31m-[m
[31m-        return cur[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m---[[ Bind the key/val with the given node, and insert the node into the Hashtab.[m
[31m-    NOTE: this function does not touch any queue[m
[31m-]][m
[31m-local function insert_key(self, key, val, node)[m
[31m-    -- Bind the key/val with the node[m
[31m-    local node_id = node.id[m
[31m-    self.key_v[node_id] = key[m
[31m-    self.val_v[node_id] = val[m
[31m-[m
[31m-    -- Insert the node into the hash-table[m
[31m-    local key_hash = hash_string(self, key)[m
[31m-    local bucket_v = self.bucket_v[m
[31m-    node.conflict = bucket_v[key_hash][m
[31m-    bucket_v[key_hash] = node_id[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get(self, key)[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local node_id = find_key(self, key)[m
[31m-    if not node_id then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    -- print(key, ": moving node ", tostring(node), " to cache queue head")[m
[31m-    local cache_queue = self.cache_queue[m
[31m-    local node = self.node_v + node_id[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_head(cache_queue, node)[m
[31m-[m
[31m-    local expire = node.expire[m
[31m-    if expire >= 0 and expire < ngx_now() then[m
[31m-        -- print("expired: ", node.expire, " > ", ngx_now())[m
[31m-        return nil, self.val_v[node_id][m
[31m-    end[m
[31m-[m
[31m-    return self.val_v[node_id][m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.delete(self, key)[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local node_id = remove_key(self, key);[m
[31m-    if not node_id then[m
[31m-        return false[m
[31m-    end[m
[31m-[m
[31m-    local node = self.node_v + node_id[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_tail(self.free_queue, node)[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set(self, key, value, ttl)[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local node_id = find_key(self, key)[m
[31m-    local node[m
[31m-    if not node_id then[m
[31m-        local free_queue = self.free_queue[m
[31m-        if queue_is_empty(free_queue) then[m
[31m-            -- evict the least recently used key[m
[31m-            -- assert(not queue_is_empty(self.cache_queue))[m
[31m-            node = queue_last(self.cache_queue)[m
[31m-            remove_key(self, self.key_v[node.id])[m
[31m-        else[m
[31m-            -- take a free queue node[m
[31m-            node = queue_head(free_queue)[m
[31m-            -- print(key, ": get a new free node: ", tostring(node))[m
[31m-        end[m
[31m-[m
[31m-        -- insert the key[m
[31m-        insert_key(self, key, value, node)[m
[31m-    else[m
[31m-        node = self.node_v + node_id[m
[31m-        self.val_v[node_id] = value[m
[31m-    end[m
[31m-[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_head(self.cache_queue, node)[m
[31m-[m
[31m-    if ttl then[m
[31m-        node.expire = ngx_now() + ttl[m
[31m-    else[m
[31m-        node.expire = -1[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/init-by-lua.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/init-by-lua.t[m
[1mdeleted file mode 100644[m
[1mindex 1de94fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/init-by-lua.t[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 13;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. qq![m
[31m-        init_by_lua '[m
[31m-            local function log(...)[m
[31m-                ngx.log(ngx.WARN, ...)[m
[31m-            end[m
[31m-[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:delete("dog")[m
[31m-            c:delete("cat")[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-![m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. qq![m
[31m-init_by_lua '[m
[31m-    lrucache = require "resty.lrucache"[m
[31m-    flv_index, err = lrucache.new(200)[m
[31m-    if not flv_index then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    flv_meta, err = lrucache.new(200)[m
[31m-    if not flv_meta then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    flv_channel, err = lrucache.new(200)[m
[31m-    if not flv_channel then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.log(ngx.WARN, "3 lrucache initialized.")[m
[31m-';[m
[31m-![m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-3 lrucache initialized.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/mixed.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/mixed.t[m
[1mdeleted file mode 100644[m
[1mindex 29300ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/mixed.t[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c2 = lrucache.new(2)[m
[31m-[m
[31m-            ngx.say("dog: ", c2:get("dog"))[m
[31m-            ngx.say("cat: ", c2:get("cat"))[m
[31m-[m
[31m-            c2:set("dog", 9)[m
[31m-            c2:set("cat", "hi")[m
[31m-[m
[31m-            ngx.say("dog: ", c2:get("dog"))[m
[31m-            ngx.say("cat: ", c2:get("cat"))[m
[31m-[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-dog: 9[m
[31m-cat: hi[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/pureffi/init-by-lua.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/pureffi/init-by-lua.t[m
[1mdeleted file mode 100644[m
[1mindex ad30c99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/pureffi/init-by-lua.t[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 13;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. qq![m
[31m-        init_by_lua '[m
[31m-            local function log(...)[m
[31m-                ngx.log(ngx.WARN, ...)[m
[31m-            end[m
[31m-[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:delete("dog")[m
[31m-            c:delete("cat")[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-![m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. qq![m
[31m-init_by_lua '[m
[31m-    lrucache = require "resty.lrucache.pureffi"[m
[31m-    flv_index, err = lrucache.new(200)[m
[31m-    if not flv_index then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    flv_meta, err = lrucache.new(200)[m
[31m-    if not flv_meta then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    flv_channel, err = lrucache.new(200)[m
[31m-    if not flv_channel then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.log(ngx.WARN, "3 lrucache initialized.")[m
[31m-';[m
[31m-![m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-3 lrucache initialized.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/pureffi/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/pureffi/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 67268f7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/pureffi/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,390 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:delete("dog")[m
[31m-            c:delete("cat")[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: evict existing items[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-            if not c then[m
[31m-               ngx.say("failed to init lrucace: ", err)[m
[31m-               return[m
[31m-            end[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("bird", 76)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-            ngx.say("bird: ", c:get("bird"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: 56[m
[31m-bird: 76[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: evict existing items (reordered, get should also count)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-            if not c then[m
[31m-               ngx.say("failed to init lrucace: ", err)[m
[31m-               return[m
[31m-            end[m
[31m-[m
[31m-            c:set("cat", 56)[m
[31m-            c:set("dog", 32)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("bird", 76)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-            ngx.say("bird: ", c:get("bird"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: 56[m
[31m-bird: 76[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ttl[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 0.6)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.31)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 32[m
[31m-dog: nil32[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: load factor[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1, 0.25)[m
[31m-[m
[31m-            ngx.say(c.bucket_sz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-4[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: load factor clamped to 0.1[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(3, 0.05)[m
[31m-[m
[31m-            ngx.say(c.bucket_sz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: load factor saturated to 1[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(3, 2.1)[m
[31m-[m
[31m-            ngx.say(c.bucket_sz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: non-string keys[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local function log(...)[m
[31m-                ngx.say(...)[m
[31m-            end[m
[31m-[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local tab1 = {1, 2}[m
[31m-            local tab2 = {3, 4}[m
[31m-[m
[31m-            c:set(tab1, 32)[m
[31m-            c:set(tab2, 56)[m
[31m-            log("tab1: ", c:get(tab1))[m
[31m-            log("tab2: ", c:get(tab2))[m
[31m-[m
[31m-            c:set(tab1, 32)[m
[31m-            c:set(tab2, 56)[m
[31m-            log("tab1: ", c:get(tab1))[m
[31m-            log("tab2: ", c:get(tab2))[m
[31m-[m
[31m-            c:delete(tab1)[m
[31m-            c:delete(tab2)[m
[31m-            log("tab1: ", c:get(tab1))[m
[31m-            log("tab2: ", c:get(tab2))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-tab1: 32[m
[31m-tab2: 56[m
[31m-tab1: 32[m
[31m-tab2: 56[m
[31m-tab1: nil[m
[31m-tab2: nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: replace value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            c:set("dog", 33)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: replace value 2[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 1.0)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            c:set("dog", 33, 0.3)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.4)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 33[m
[31m-dog: nil33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: replace value 3 (the old value has longer expire time)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 1.2)[m
[31m-            c:set("dog", 33, 0.6)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.5)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 33[m
[31m-dog: nil33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: replace value 4[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 0.1)[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            c:set("dog", 33)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 961b7db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:delete("dog")[m
[31m-            c:delete("cat")[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: evict existing items[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-            if not c then[m
[31m-               ngx.say("failed to init lrucace: ", err)[m
[31m-               return[m
[31m-            end[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("bird", 76)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-            ngx.say("bird: ", c:get("bird"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: 56[m
[31m-bird: 76[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: evict existing items (reordered, get should also count)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-            if not c then[m
[31m-               ngx.say("failed to init lrucace: ", err)[m
[31m-               return[m
[31m-            end[m
[31m-[m
[31m-            c:set("cat", 56)[m
[31m-            c:set("dog", 32)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("bird", 76)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-            ngx.say("bird: ", c:get("bird"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: 56[m
[31m-bird: 76[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ttl[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 0.5)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.25)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.26)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 32[m
[31m-dog: nil32[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ttl[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local lim = 5[m
[31m-            local c = lrucache.new(lim)[m
[31m-            local n = 1000[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                c:set("dog" .. i, i)[m
[31m-                c:delete("dog" .. i, i)[m
[31m-                c:set("dog" .. i, i)[m
[31m-                local cnt = 0[m
[31m-                for k, v in pairs(c.hasht) do[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-                assert(cnt <= lim)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                local key = "dog" .. math.random(1, n)[m
[31m-                c:get(key)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                local key = "dog" .. math.random(1, n)[m
[31m-                c:get(key)[m
[31m-                c:set("dog" .. i, i)[m
[31m-[m
[31m-                local cnt = 0[m
[31m-                for k, v in pairs(c.hasht) do[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-                assert(cnt <= lim)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 20[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: replace value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            c:set("dog", 33)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex a3c8067..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-lrucache-0.04/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex eebc749..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-*.t_[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f42cae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty-debug[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/lib/resty/memcached.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/lib/resty/memcached.lua[m
[1mdeleted file mode 100644[m
[1mindex 3390e68..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/lib/resty/memcached.lua[m
[1m+++ /dev/null[m
[36m@@ -1,741 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-local sub = string.sub[m
[31m-local escape_uri = ngx.escape_uri[m
[31m-local unescape_uri = ngx.unescape_uri[m
[31m-local match = string.match[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local strlen = string.len[m
[31m-local concat = table.concat[m
[31m-local setmetatable = setmetatable[m
[31m-local type = type[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = '0.13'[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(self, opts)[m
[31m-    local sock, err = tcp()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local escape_key = escape_uri[m
[31m-    local unescape_key = unescape_uri[m
[31m-[m
[31m-    if opts then[m
[31m-       local key_transform = opts.key_transform[m
[31m-[m
[31m-       if key_transform then[m
[31m-          escape_key = key_transform[1][m
[31m-          unescape_key = key_transform[2][m
[31m-          if not escape_key or not unescape_key then[m
[31m-             return nil, "expecting key_transform = { escape, unescape } table"[m
[31m-          end[m
[31m-       end[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({[m
[31m-        sock = sock,[m
[31m-        escape_key = escape_key,[m
[31m-        unescape_key = unescape_key,[m
[31m-    }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    sock:settimeout(timeout)[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.connect(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:connect(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _multi_get(self, keys)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local nkeys = #keys[m
[31m-[m
[31m-    if nkeys == 0 then[m
[31m-        return {}, nil[m
[31m-    end[m
[31m-[m
[31m-    local escape_key = self.escape_key[m
[31m-    local cmd = {"get"}[m
[31m-    local n = 1[m
[31m-[m
[31m-    for i = 1, nkeys do[m
[31m-        cmd[n + 1] = " "[m
[31m-        cmd[n + 2] = escape_key(keys[i])[m
[31m-        n = n + 2[m
[31m-    end[m
[31m-    cmd[n + 1] = "\r\n"[m
[31m-[m
[31m-    -- print("multi get cmd: ", cmd)[m
[31m-[m
[31m-    local bytes, err = sock:send(cmd)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local unescape_key = self.unescape_key[m
[31m-    local results = {}[m
[31m-[m
[31m-    while true do[m
[31m-        local line, err = sock:receive()[m
[31m-        if not line then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if line == 'END' then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        local key, flags, len = match(line, '^VALUE (%S+) (%d+) (%d+)$')[m
[31m-        -- print("key: ", key, "len: ", len, ", flags: ", flags)[m
[31m-[m
[31m-        if not key then[m
[31m-            return nil, line[m
[31m-        end[m
[31m-[m
[31m-        local data, err = sock:receive(len)[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        results[unescape_key(key)] = {data, flags}[m
[31m-[m
[31m-        data, err = sock:receive(2) -- discard the trailing CRLF[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return results[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get(self, key)[m
[31m-    if type(key) == "table" then[m
[31m-        return _multi_get(self, key)[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("get " .. self.escape_key(key) .. "\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    if line == 'END' then[m
[31m-        return nil, nil, nil[m
[31m-    end[m
[31m-[m
[31m-    local flags, len = match(line, '^VALUE %S+ (%d+) (%d+)$')[m
[31m-    if not flags then[m
[31m-        return nil, nil, line[m
[31m-    end[m
[31m-[m
[31m-    -- print("len: ", len, ", flags: ", flags)[m
[31m-[m
[31m-    local data, err = sock:receive(len)[m
[31m-    if not data then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    line, err = sock:receive(7) -- discard the trailing "\r\nEND\r\n"[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    return data, flags[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _multi_gets(self, keys)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local nkeys = #keys[m
[31m-[m
[31m-    if nkeys == 0 then[m
[31m-        return {}, nil[m
[31m-    end[m
[31m-[m
[31m-    local escape_key = self.escape_key[m
[31m-    local cmd = {"gets"}[m
[31m-    local n = 1[m
[31m-    for i = 1, nkeys do[m
[31m-        cmd[n + 1] = " "[m
[31m-        cmd[n + 2] = escape_key(keys[i])[m
[31m-        n = n + 2[m
[31m-    end[m
[31m-    cmd[n + 1] = "\r\n"[m
[31m-[m
[31m-    -- print("multi get cmd: ", cmd)[m
[31m-[m
[31m-    local bytes, err = sock:send(cmd)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local unescape_key = self.unescape_key[m
[31m-    local results = {}[m
[31m-[m
[31m-    while true do[m
[31m-        local line, err = sock:receive()[m
[31m-        if not line then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if line == 'END' then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        local key, flags, len, cas_uniq =[m
[31m-                match(line, '^VALUE (%S+) (%d+) (%d+) (%d+)$')[m
[31m-[m
[31m-        -- print("key: ", key, "len: ", len, ", flags: ", flags)[m
[31m-[m
[31m-        if not key then[m
[31m-            return nil, line[m
[31m-        end[m
[31m-[m
[31m-        local data, err = sock:receive(len)[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        results[unescape_key(key)] = {data, flags, cas_uniq}[m
[31m-[m
[31m-        data, err = sock:receive(2) -- discard the trailing CRLF[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return results[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.gets(self, key)[m
[31m-    if type(key) == "table" then[m
[31m-        return _multi_gets(self, key)[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("gets " .. self.escape_key(key) .. "\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    if line == 'END' then[m
[31m-        return nil, nil, nil, nil[m
[31m-    end[m
[31m-[m
[31m-    local flags, len, cas_uniq = match(line, '^VALUE %S+ (%d+) (%d+) (%d+)$')[m
[31m-    if not flags then[m
[31m-        return nil, nil, nil, line[m
[31m-    end[m
[31m-[m
[31m-    -- print("len: ", len, ", flags: ", flags)[m
[31m-[m
[31m-    local data, err = sock:receive(len)[m
[31m-    if not data then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    line, err = sock:receive(7) -- discard the trailing "\r\nEND\r\n"[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    return data, flags, cas_uniq[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _expand_table(value)[m
[31m-    local segs = {}[m
[31m-    local nelems = #value[m
[31m-    local nsegs = 0[m
[31m-    for i = 1, nelems do[m
[31m-        local seg = value[i][m
[31m-        nsegs = nsegs + 1[m
[31m-        if type(seg) == "table" then[m
[31m-            segs[nsegs] = _expand_table(seg)[m
[31m-        else[m
[31m-            segs[nsegs] = seg[m
[31m-        end[m
[31m-    end[m
[31m-    return concat(segs)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _store(self, cmd, key, value, exptime, flags)[m
[31m-    if not exptime then[m
[31m-        exptime = 0[m
[31m-    end[m
[31m-[m
[31m-    if not flags then[m
[31m-        flags = 0[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if type(value) == "table" then[m
[31m-        value = _expand_table(value)[m
[31m-    end[m
[31m-[m
[31m-    local req = cmd .. " " .. self.escape_key(key) .. " " .. flags .. " "[m
[31m-                .. exptime .. " " .. strlen(value) .. "\r\n" .. value[m
[31m-                .. "\r\n"[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local data, err = sock:receive()[m
[31m-    if not data then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if data == "STORED" then[m
[31m-        return 1[m
[31m-    end[m
[31m-[m
[31m-    return nil, data[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set(self, ...)[m
[31m-    return _store(self, "set", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.add(self, ...)[m
[31m-    return _store(self, "add", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.replace(self, ...)[m
[31m-    return _store(self, "replace", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.append(self, ...)[m
[31m-    return _store(self, "append", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.prepend(self, ...)[m
[31m-    return _store(self, "prepend", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.cas(self, key, value, cas_uniq, exptime, flags)[m
[31m-    if not exptime then[m
[31m-        exptime = 0[m
[31m-    end[m
[31m-[m
[31m-    if not flags then[m
[31m-        flags = 0[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req = "cas " .. self.escape_key(key) .. " " .. flags .. " "[m
[31m-                .. exptime .. " " .. strlen(value) .. " " .. cas_uniq[m
[31m-                .. "\r\n" .. value .. "\r\n"[m
[31m-[m
[31m-    -- local cjson = require "cjson"[m
[31m-    -- print("request: ", cjson.encode(req))[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    -- print("response: [", line, "]")[m
[31m-[m
[31m-    if line == "STORED" then[m
[31m-        return 1[m
[31m-    end[m
[31m-[m
[31m-    return nil, line[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.delete(self, key)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    key = self.escape_key(key)[m
[31m-[m
[31m-    local req = "delete " .. key .. "\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local res, err = sock:receive()[m
[31m-    if not res then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if res ~= 'DELETED' then[m
[31m-        return nil, res[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_keepalive(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:setkeepalive(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_reused_times(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:getreusedtimes()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.flush_all(self, time)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req[m
[31m-    if time then[m
[31m-        req = "flush_all " .. time .. "\r\n"[m
[31m-    else[m
[31m-        req = "flush_all\r\n"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local res, err = sock:receive()[m
[31m-    if not res then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if res ~= 'OK' then[m
[31m-        return nil, res[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _incr_decr(self, cmd, key, value)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req = cmd .. " " .. self.escape_key(key) .. " " .. value .. "\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if not match(line, '^%d+$') then[m
[31m-        return nil, line[m
[31m-    end[m
[31m-[m
[31m-    return line[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.incr(self, key, value)[m
[31m-    return _incr_decr(self, "incr", key, value)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.decr(self, key, value)[m
[31m-    return _incr_decr(self, "decr", key, value)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.stats(self, args)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req[m
[31m-    if args then[m
[31m-        req = "stats " .. args .. "\r\n"[m
[31m-    else[m
[31m-        req = "stats\r\n"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local lines = {}[m
[31m-    local n = 0[m
[31m-    while true do[m
[31m-        local line, err = sock:receive()[m
[31m-        if not line then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if line == 'END' then[m
[31m-            return lines, nil[m
[31m-        end[m
[31m-[m
[31m-        if not match(line, "ERROR") then[m
[31m-            n = n + 1[m
[31m-            lines[n] = line[m
[31m-        else[m
[31m-            return nil, line[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- cannot reach here...[m
[31m-    return lines[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.version(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("version\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local ver = match(line, "^VERSION (.+)$")[m
[31m-    if not ver then[m
[31m-        return nil, ver[m
[31m-    end[m
[31m-[m
[31m-    return ver[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.quit(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("quit\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.verbosity(self, level)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("verbosity " .. level .. "\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if line ~= 'OK' then[m
[31m-        return nil, line[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.touch(self, key, exptime)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("touch " .. self.escape_key(key) .. " "[m
[31m-                                 .. exptime .. "\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    -- moxi server from couchbase returned stored after touching[m
[31m-    if line == "TOUCHED" or line =="STORED" then[m
[31m-        return 1[m
[31m-    end[m
[31m-    return nil, line[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.close(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:close()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/mock.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/mock.t[m
[1mdeleted file mode 100644[m
[1mindex bde19de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/mock.t[m
[1m+++ /dev/null[m
[36m@@ -1,193 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks() + 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: fail to flush[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("flush: ", ok);[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query_len: 11[m
[31m---- tcp_query eval[m
[31m-"flush_all\r\n"[m
[31m---- tcp_reply eval[m
[31m-"SOME ERROR\r\n"[m
[31m---- response_body[m
[31m-failed to flush all: SOME ERROR[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: continue using the obj when read timeout happens[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            memc:set_timeout(100) -- 0.1 sec[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local data, flags, err = memc:get("foo")[m
[31m-                if not data and err then[m
[31m-                    ngx.say("failed to get: ", err)[m
[31m-                else[m
[31m-                    ngx.say("get: ", data);[m
[31m-                end[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query_len: 9[m
[31m---- tcp_query eval[m
[31m-"get foo\r\n"[m
[31m---- tcp_reply eval[m
[31m-"VALUE foo 0 5\r\nhello\r\nEND\r\n"[m
[31m---- tcp_reply_delay: 150ms[m
[31m---- response_body[m
[31m-failed to get: timeout[m
[31m-failed to get: closed[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: gets multi getting error responses[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = memc:gets({"dog", "cat"})[m
[31m-            if not res then[m
[31m-                ngx.say("failed to gets: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("gets: ", table.concat(res, ", "));[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query_len: 14[m
[31m---- tcp_query eval[m
[31m-"gets dog cat\r\n"[m
[31m---- tcp_reply eval[m
[31m-"SERVER_ERROR\r\n"[m
[31m---- response_body[m
[31m-failed to gets: SERVER_ERROR[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get multi getting error responses[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = memc:get({"dog", "cat"})[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("get: ", table.concat(res, ", "));[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query_len: 13[m
[31m---- tcp_query eval[m
[31m-"get dog cat\r\n"[m
[31m---- tcp_reply eval[m
[31m-"SERVER_ERROR\r\n"[m
[31m---- response_body[m
[31m-failed to get: SERVER_ERROR[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 2661e13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,2195 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() - 1);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            assert(memc:set_timeout(1000)) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, flags, err = memc:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 32 (flags: 0)[m
[31m-dog: 32 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: add an exsitent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:add("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to add dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to add dog: NOT_STORED[m
[31m-dog: 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: add a nonexistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:add("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to add dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: replace an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:replace("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to replace dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: replace a nonexsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:replace("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to replace dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to replace dog: NOT_STORED[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: prepend to a nonexsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:prepend("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to prepend to dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to prepend to dog: NOT_STORED[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: prepend to an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:prepend("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to prepend to dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 5632[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: append to a nonexsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:append("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to append to dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to append to dog: NOT_STORED[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: append to an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:append("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to append to dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 3256[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: delete an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:delete("dog")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to delete dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-[m
[31m-            local res, flags, err = memc:add("dog", 772)[m
[31m-            if err then[m
[31m-                ngx.say("failed to add dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: delete a nonexsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:delete("dog")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to delete dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to delete dog: NOT_FOUND[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: delete an exsistent key with delay[m
[31m---- SKIP[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:delete("dog", 1)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to delete dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:add("dog", 76)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to add dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:replace("dog", 53)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to replace dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to add dog: NOT_STORED[m
[31m-failed to replace dog: NOT_STORED[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: flags[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32, 0, 526)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 32 (flags: 526)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set with exptime[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep");[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32, 1, 526)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush with a delay[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all(3)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 32 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: incr an existent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, err = memc:incr("dog", 2)[m
[31m-            if not value then[m
[31m-                ngx.say("failed to incr dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog is now: ", value)[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog is now: 34[m
[31m-dog: 34 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: incr a nonexistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, err = memc:incr("dog", 2)[m
[31m-            if not value then[m
[31m-                ngx.say("failed to incr dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog is now: ", value)[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to incr dog: NOT_FOUND[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: decr an existent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, err = memc:decr("dog", 3)[m
[31m-            if not value then[m
[31m-                ngx.say("failed to decr dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog is now: ", value)[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog is now: 29[m
[31m-dog: 29 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: decr a nonexistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, err = memc:decr("dog", 2)[m
[31m-            if not value then[m
[31m-                ngx.say("failed to decr dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog is now: ", value)[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to decr dog: NOT_FOUND[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: general stats[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local lines, err = memc:stats()[m
[31m-            if not lines then[m
[31m-                ngx.say("failed to stats: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("stats:\\n", table.concat(lines, "\\n"))[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^stats:[m
[31m-STAT pid \d+[m
[31m-(?:STAT [^\n]+\n)*$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: stats items[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local lines, err = memc:stats("items")[m
[31m-            if not lines then[m
[31m-                ngx.say("failed to stats items: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("stats:\\n", table.concat(lines, "\\n"))[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^stats:[m
[31m-(?:STAT items:[^\n]+\n)*$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: stats sizes[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local lines, err = memc:stats("sizes")[m
[31m-            if not lines then[m
[31m-                ngx.say("failed to stats sizes: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("stats:\\n", table.concat(lines, "\\n"))[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^stats:[m
[31m-(?:STAT \d+ \d+\n)*$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ver, err = memc:version()[m
[31m-            if not ver then[m
[31m-                ngx.say("failed to get version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("version: ", ver)[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^version: \d+(?:\.\d+)*$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: quit[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:quit()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to quit: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ver, err = memc:version()[m
[31m-            if not ver then[m
[31m-                ngx.say("failed to get version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("closed successfully")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^failed to get version: (closed|timeout|broken pipe|connection reset by peer)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: verbosity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:verbosity(2)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to quit: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("successfully set verbosity to level 2")[m
[31m-[m
[31m-            local ver, err = memc:version()[m
[31m-            if not ver then[m
[31m-                ngx.say("failed to get version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-successfully set verbosity to level 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: multi get[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("cat", "hello\\nworld\\n")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local results, err = memc:get({"dog", "blah", "cat"})[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get keys: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not results then[m
[31m-                    ngx.say("results empty")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", results.dog and table.concat(results.dog, " ") or "not found")[m
[31m-                ngx.say("cat: ", results.cat and table.concat(results.cat, " ") or "not found")[m
[31m-                ngx.say("blah: ", results.blah and table.concat(results.blah, " ") or "not found")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 32 0[m
[31m-cat: hello[m
[31m-world[m
[31m- 0[m
[31m-blah: not found[m
[31m-dog: 32 0[m
[31m-cat: hello[m
[31m-world[m
[31m- 0[m
[31m-blah: not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multi get (special chars in keys)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog A", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("cat B", "hello\\nworld\\n")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local results, err = memc:get({"dog A", "blah", "cat B"})[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not results then[m
[31m-                ngx.say("results empty")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog A: ", results["dog A"] and table.concat(results["dog A"], " ") or "not found")[m
[31m-            ngx.say("cat B: ", results["cat B"] and table.concat(results["cat B"], " ") or "not found")[m
[31m-            ngx.say("blah: ", results.blah and table.concat(results.blah, " ") or "not found")[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog A: 32 0[m
[31m-cat B: hello[m
[31m-world[m
[31m- 0[m
[31m-blah: not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: connect timeout[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(100) -- 100 ms[m
[31m-[m
[31m-            local ok, err = memc:connect("www.taobao.com", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: set keepalive and get reused times[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local times = memc:get_reused_times()[m
[31m-            ngx.say("reused times: ", times)[m
[31m-[m
[31m-            local ok, err = memc:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            times = memc:get_reused_times()[m
[31m-            ngx.say("reused times: ", times)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-reused times: 0[m
[31m-reused times: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: gets (single key, found)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, cas_uniq, err = memc:gets("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 \(flags: 0, cas_uniq: \d+\)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: gets (single key, not found)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, cas_uniq, err = memc:gets("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: gets (multiple key)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("cat", "hello\\nworld\\n")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local results, err = memc:gets({"dog", "blah", "cat"})[m
[31m-            if err then[m
[31m-                ngx.say("failed to get keys: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not results then[m
[31m-                ngx.say("results empty")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if results.dog then[m
[31m-                ngx.say("dog: ", table.concat(results.dog, " "))[m
[31m-            else[m
[31m-                ngx.say("dog not found")[m
[31m-            end[m
[31m-[m
[31m-            if results.blah then[m
[31m-                ngx.say("blah: ", table.concat(results.blah, " "))[m
[31m-            else[m
[31m-                ngx.say("blah not found")[m
[31m-            end[m
[31m-[m
[31m-            if results.cat then[m
[31m-                ngx.say("cat: ", table.concat(results.cat, " "))[m
[31m-            else[m
[31m-                ngx.say("cat not found")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 0 \d+[m
[31m-blah not found[m
[31m-cat: hello[m
[31m-world[m
[31m- 0 \d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: gets (single key) + cas[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, flags, cas_uniq, err = memc:gets("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-[m
[31m-            local ok, err = memc:cas("dog", "hello world", cas_uniq, 0, 78)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to cas: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("cas succeeded")[m
[31m-[m
[31m-            local value, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 \(flags: 0, cas_uniq: \d+\)[m
[31m-cas succeeded[m
[31m-dog: hello world \(flags: 78\)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: gets (multi key) + cas[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local results, err = memc:gets({"dog"})[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, flags, cas_uniq, err = unpack(results.dog)[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-[m
[31m-            local ok, err = memc:cas("dog", "hello world", cas_uniq, 0, 78)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to cas: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("cas succeeded")[m
[31m-[m
[31m-            local value, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 \(flags: 0, cas_uniq: \d+\)[m
[31m-cas succeeded[m
[31m-dog: hello world \(flags: 78\)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: gets (single key) + cas[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, flags, cas_uniq, err = memc:gets("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = memc:set("dog", 117)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-[m
[31m-            local ok, err = memc:cas("dog", "hello world", cas_uniq, 0, 78)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to cas: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("cas succeeded")[m
[31m-[m
[31m-            local value, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 \(flags: 0, cas_uniq: \d+\)[m
[31m-failed to cas: EXISTS$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: change escape method[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-[m
[31m-            function identity(str)[m
[31m-                return str[m
[31m-            end[m
[31m-[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new{ key_transform = { identity, identity }}[m
[31m-            local key = "dog&cat"[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set(key, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, flags, err = memc:get(key)[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get", key, ": ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say(key, " not found")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say(key, ": ", res, " (flags: ", flags, ")")[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog&cat: 32 (flags: 0)[m
[31m-dog&cat: 32 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: gets (multiple key) + change only unescape key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            function identity(str)[m
[31m-                return str[m
[31m-            end[m
[31m-[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new{key_transform = {ngx.escape_uri, identity}}[m
[31m-[m
[31m-            local key = "dog&cat"[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set(key, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("cat", "hello\\nworld\\n")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local results, err = memc:gets({key, "blah", "cat"})[m
[31m-            if err then[m
[31m-                ngx.say("failed to get keys: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not results then[m
[31m-                ngx.say("results empty")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if results[key] then[m
[31m-                ngx.say(key, ": ", table.concat(results[key], " "))[m
[31m-            else[m
[31m-                ngx.say(key, " not found")[m
[31m-            end[m
[31m-[m
[31m-            -- encode key for second run[m
[31m-            key = ngx.escape_uri(key)[m
[31m-[m
[31m-            if results[key] then[m
[31m-                ngx.say(key, ": ", table.concat(results[key], " "))[m
[31m-            else[m
[31m-                ngx.say(key, " not found")[m
[31m-            end[m
[31m-[m
[31m-[m
[31m-            if results.blah then[m
[31m-                ngx.say("blah: ", table.concat(results.blah, " "))[m
[31m-            else[m
[31m-                ngx.say("blah not found")[m
[31m-            end[m
[31m-[m
[31m-            if results.cat then[m
[31m-                ngx.say("cat: ", table.concat(results.cat, " "))[m
[31m-            else[m
[31m-                ngx.say("cat not found")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog&cat not found[m
[31m-dog%26cat: 32 0 \d+[m
[31m-blah not found[m
[31m-cat: hello[m
[31m-world[m
[31m- 0 \d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/tableset.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/tableset.t[m
[1mdeleted file mode 100644[m
[1mindex 6dadf33..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/tableset.t[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set with table[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", { "c", "a", "t" })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, flags, err = memc:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: cat (flags: 0)[m
[31m-dog: cat (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set with nested table[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", { "c", "a", { "t"} })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, flags, err = memc:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: cat (flags: 0)[m
[31m-dog: cat (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/touch.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/touch.t[m
[1mdeleted file mode 100644[m
[1mindex 62ea21f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/touch.t[m
[1m+++ /dev/null[m
[36m@@ -1,115 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local key = "dog&cat&rabbit"[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set(key, "value", 1)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:touch(key, 120) -- 120sec[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to touch ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("touch: ", ok)[m
[31m-[m
[31m-            ngx.sleep(1.1)[m
[31m-[m
[31m-            local val, err = memc:get(key)[m
[31m-            if not val then[m
[31m-                ngx.say("failed to get ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("get key: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-touch: 1[m
[31m-get key: value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not exists[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local key = "dog&cat&rabbit"[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:touch(key, 120) --120sec[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to touch ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("touch: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m- GET /t[m
[31m---- response_body[m
[31m-failed to touch dog&cat&rabbit: NOT_FOUND[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex c27381c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memc = require "resty.memcached"[m
[31m-            ngx.say(memc._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ee195dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-memcached-0.14/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,549 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex b1c7a31..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-tags[m
[31m-*.t_[m
[31m-src/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f42cae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty-debug[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/lib/resty/mysql.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/lib/resty/mysql.lua[m
[1mdeleted file mode 100644[m
[1mindex 99a253e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/lib/resty/mysql.lua[m
[1m+++ /dev/null[m
[36m@@ -1,897 +0,0 @@[m
[31m--- Copyright (C) 2012 Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local bit = require "bit"[m
[31m-local sub = string.sub[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local strbyte = string.byte[m
[31m-local strchar = string.char[m
[31m-local strfind = string.find[m
[31m-local format = string.format[m
[31m-local strrep = string.rep[m
[31m-local null = ngx.null[m
[31m-local band = bit.band[m
[31m-local bxor = bit.bxor[m
[31m-local bor = bit.bor[m
[31m-local lshift = bit.lshift[m
[31m-local rshift = bit.rshift[m
[31m-local tohex = bit.tohex[m
[31m-local sha1 = ngx.sha1_bin[m
[31m-local concat = table.concat[m
[31m-local unpack = unpack[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-if not ngx.config[m
[31m-   or not ngx.config.ngx_lua_version[m
[31m-   or ngx.config.ngx_lua_version < 9011[m
[31m-then[m
[31m-    error("ngx_lua 0.9.11+ required")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.16' }[m
[31m-[m
[31m-[m
[31m--- constants[m
[31m-[m
[31m-local STATE_CONNECTED = 1[m
[31m-local STATE_COMMAND_SENT = 2[m
[31m-[m
[31m-local COM_QUIT = 0x01[m
[31m-local COM_QUERY = 0x03[m
[31m-local CLIENT_SSL = 0x0800[m
[31m-[m
[31m-local SERVER_MORE_RESULTS_EXISTS = 8[m
[31m-[m
[31m--- 16MB - 1, the default max allowed packet size used by libmysqlclient[m
[31m-local FULL_PACKET_SIZE = 16777215[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m--- mysql field value type converters[m
[31m-local converters = new_tab(0, 8)[m
[31m-[m
[31m-for i = 0x01, 0x05 do[m
[31m-    -- tiny, short, long, float, double[m
[31m-    converters[i] = tonumber[m
[31m-end[m
[31m--- converters[0x08] = tonumber  -- long long[m
[31m-converters[0x09] = tonumber  -- int24[m
[31m-converters[0x0d] = tonumber  -- year[m
[31m-converters[0xf6] = tonumber  -- newdecimal[m
[31m-[m
[31m-[m
[31m-local function _get_byte2(data, i)[m
[31m-    local a, b = strbyte(data, i, i + 1)[m
[31m-    return bor(a, lshift(b, 8)), i + 2[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _get_byte3(data, i)[m
[31m-    local a, b, c = strbyte(data, i, i + 2)[m
[31m-    return bor(a, lshift(b, 8), lshift(c, 16)), i + 3[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _get_byte4(data, i)[m
[31m-    local a, b, c, d = strbyte(data, i, i + 3)[m
[31m-    return bor(a, lshift(b, 8), lshift(c, 16), lshift(d, 24)), i + 4[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _get_byte8(data, i)[m
[31m-    local a, b, c, d, e, f, g, h = strbyte(data, i, i + 7)[m
[31m-[m
[31m-    -- XXX workaround for the lack of 64-bit support in bitop:[m
[31m-    local lo = bor(a, lshift(b, 8), lshift(c, 16), lshift(d, 24))[m
[31m-    local hi = bor(e, lshift(f, 8), lshift(g, 16), lshift(h, 24))[m
[31m-    return lo + hi * 4294967296, i + 8[m
[31m-[m
[31m-    -- return bor(a, lshift(b, 8), lshift(c, 16), lshift(d, 24), lshift(e, 32),[m
[31m-               -- lshift(f, 40), lshift(g, 48), lshift(h, 56)), i + 8[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _set_byte2(n)[m
[31m-    return strchar(band(n, 0xff), band(rshift(n, 8), 0xff))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _set_byte3(n)[m
[31m-    return strchar(band(n, 0xff),[m
[31m-                   band(rshift(n, 8), 0xff),[m
[31m-                   band(rshift(n, 16), 0xff))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _set_byte4(n)[m
[31m-    return strchar(band(n, 0xff),[m
[31m-                   band(rshift(n, 8), 0xff),[m
[31m-                   band(rshift(n, 16), 0xff),[m
[31m-                   band(rshift(n, 24), 0xff))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _from_cstring(data, i)[m
[31m-    local last = strfind(data, "\0", i, true)[m
[31m-    if not last then[m
[31m-        return nil, nil[m
[31m-    end[m
[31m-[m
[31m-    return sub(data, i, last), last + 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _to_cstring(data)[m
[31m-    return data .. "\0"[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _to_binary_coded_string(data)[m
[31m-    return strchar(#data) .. data[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _dump(data)[m
[31m-    local len = #data[m
[31m-    local bytes = new_tab(len, 0)[m
[31m-    for i = 1, len do[m
[31m-        bytes[i] = format("%x", strbyte(data, i))[m
[31m-    end[m
[31m-    return concat(bytes, " ")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _dumphex(data)[m
[31m-    local len = #data[m
[31m-    local bytes = new_tab(len, 0)[m
[31m-    for i = 1, len do[m
[31m-        bytes[i] = tohex(strbyte(data, i), 2)[m
[31m-    end[m
[31m-    return concat(bytes, " ")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _compute_token(password, scramble)[m
[31m-    if password == "" then[m
[31m-        return ""[m
[31m-    end[m
[31m-[m
[31m-    local stage1 = sha1(password)[m
[31m-    local stage2 = sha1(stage1)[m
[31m-    local stage3 = sha1(scramble .. stage2)[m
[31m-    local n = #stage1[m
[31m-    local bytes = new_tab(n, 0)[m
[31m-    for i = 1, n do[m
[31m-         bytes[i] = strchar(bxor(strbyte(stage3, i), strbyte(stage1, i)))[m
[31m-    end[m
[31m-[m
[31m-    return concat(bytes)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _send_packet(self, req, size)[m
[31m-    local sock = self.sock[m
[31m-[m
[31m-    self.packet_no = self.packet_no + 1[m
[31m-[m
[31m-    -- print("packet no: ", self.packet_no)[m
[31m-[m
[31m-    local packet = _set_byte3(size) .. strchar(self.packet_no) .. req[m
[31m-[m
[31m-    -- print("sending packet: ", _dump(packet))[m
[31m-[m
[31m-    -- print("sending packet... of size " .. #packet)[m
[31m-[m
[31m-    return sock:send(packet)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _recv_packet(self)[m
[31m-    local sock = self.sock[m
[31m-[m
[31m-    local data, err = sock:receive(4) -- packet header[m
[31m-    if not data then[m
[31m-        return nil, nil, "failed to receive packet header: " .. err[m
[31m-    end[m
[31m-[m
[31m-    --print("packet header: ", _dump(data))[m
[31m-[m
[31m-    local len, pos = _get_byte3(data, 1)[m
[31m-[m
[31m-    --print("packet length: ", len)[m
[31m-[m
[31m-    if len == 0 then[m
[31m-        return nil, nil, "empty packet"[m
[31m-    end[m
[31m-[m
[31m-    if len > self._max_packet_size then[m
[31m-        return nil, nil, "packet size too big: " .. len[m
[31m-    end[m
[31m-[m
[31m-    local num = strbyte(data, pos)[m
[31m-[m
[31m-    --print("recv packet: packet no: ", num)[m
[31m-[m
[31m-    self.packet_no = num[m
[31m-[m
[31m-    data, err = sock:receive(len)[m
[31m-[m
[31m-    --print("receive returned")[m
[31m-[m
[31m-    if not data then[m
[31m-        return nil, nil, "failed to read packet content: " .. err[m
[31m-    end[m
[31m-[m
[31m-    --print("packet content: ", _dump(data))[m
[31m-    --print("packet content (ascii): ", data)[m
[31m-[m
[31m-    local field_count = strbyte(data, 1)[m
[31m-[m
[31m-    local typ[m
[31m-    if field_count == 0x00 then[m
[31m-        typ = "OK"[m
[31m-    elseif field_count == 0xff then[m
[31m-        typ = "ERR"[m
[31m-    elseif field_count == 0xfe then[m
[31m-        typ = "EOF"[m
[31m-    elseif field_count <= 250 then[m
[31m-        typ = "DATA"[m
[31m-    end[m
[31m-[m
[31m-    return data, typ[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _from_length_coded_bin(data, pos)[m
[31m-    local first = strbyte(data, pos)[m
[31m-[m
[31m-    --print("LCB: first: ", first)[m
[31m-[m
[31m-    if not first then[m
[31m-        return nil, pos[m
[31m-    end[m
[31m-[m
[31m-    if first >= 0 and first <= 250 then[m
[31m-        return first, pos + 1[m
[31m-    end[m
[31m-[m
[31m-    if first == 251 then[m
[31m-        return null, pos + 1[m
[31m-    end[m
[31m-[m
[31m-    if first == 252 then[m
[31m-        pos = pos + 1[m
[31m-        return _get_byte2(data, pos)[m
[31m-    end[m
[31m-[m
[31m-    if first == 253 then[m
[31m-        pos = pos + 1[m
[31m-        return _get_byte3(data, pos)[m
[31m-    end[m
[31m-[m
[31m-    if first == 254 then[m
[31m-        pos = pos + 1[m
[31m-        return _get_byte8(data, pos)[m
[31m-    end[m
[31m-[m
[31m-    return false, pos + 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _from_length_coded_str(data, pos)[m
[31m-    local len[m
[31m-    len, pos = _from_length_coded_bin(data, pos)[m
[31m-    if len == nil or len == null then[m
[31m-        return null, pos[m
[31m-    end[m
[31m-[m
[31m-    return sub(data, pos, pos + len - 1), pos + len[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_ok_packet(packet)[m
[31m-    local res = new_tab(0, 5)[m
[31m-    local pos[m
[31m-[m
[31m-    res.affected_rows, pos = _from_length_coded_bin(packet, 2)[m
[31m-[m
[31m-    --print("affected rows: ", res.affected_rows, ", pos:", pos)[m
[31m-[m
[31m-    res.insert_id, pos = _from_length_coded_bin(packet, pos)[m
[31m-[m
[31m-    --print("insert id: ", res.insert_id, ", pos:", pos)[m
[31m-[m
[31m-    res.server_status, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    --print("server status: ", res.server_status, ", pos:", pos)[m
[31m-[m
[31m-    res.warning_count, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    --print("warning count: ", res.warning_count, ", pos: ", pos)[m
[31m-[m
[31m-    local message = sub(packet, pos)[m
[31m-    if message and message ~= "" then[m
[31m-        res.message = message[m
[31m-    end[m
[31m-[m
[31m-    --print("message: ", res.message, ", pos:", pos)[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_eof_packet(packet)[m
[31m-    local pos = 2[m
[31m-[m
[31m-    local warning_count, pos = _get_byte2(packet, pos)[m
[31m-    local status_flags = _get_byte2(packet, pos)[m
[31m-[m
[31m-    return warning_count, status_flags[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_err_packet(packet)[m
[31m-    local errno, pos = _get_byte2(packet, 2)[m
[31m-    local marker = sub(packet, pos, pos)[m
[31m-    local sqlstate[m
[31m-    if marker == '#' then[m
[31m-        -- with sqlstate[m
[31m-        pos = pos + 1[m
[31m-        sqlstate = sub(packet, pos, pos + 5 - 1)[m
[31m-        pos = pos + 5[m
[31m-    end[m
[31m-[m
[31m-    local message = sub(packet, pos)[m
[31m-    return errno, message, sqlstate[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_result_set_header_packet(packet)[m
[31m-    local field_count, pos = _from_length_coded_bin(packet, 1)[m
[31m-[m
[31m-    local extra[m
[31m-    extra = _from_length_coded_bin(packet, pos)[m
[31m-[m
[31m-    return field_count, extra[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_field_packet(data)[m
[31m-    local col = new_tab(0, 2)[m
[31m-    local catalog, db, table, orig_table, orig_name, charsetnr, length[m
[31m-    local pos[m
[31m-    catalog, pos = _from_length_coded_str(data, 1)[m
[31m-[m
[31m-    --print("catalog: ", col.catalog, ", pos:", pos)[m
[31m-[m
[31m-    db, pos = _from_length_coded_str(data, pos)[m
[31m-    table, pos = _from_length_coded_str(data, pos)[m
[31m-    orig_table, pos = _from_length_coded_str(data, pos)[m
[31m-    col.name, pos = _from_length_coded_str(data, pos)[m
[31m-[m
[31m-    orig_name, pos = _from_length_coded_str(data, pos)[m
[31m-[m
[31m-    pos = pos + 1 -- ignore the filler[m
[31m-[m
[31m-    charsetnr, pos = _get_byte2(data, pos)[m
[31m-[m
[31m-    length, pos = _get_byte4(data, pos)[m
[31m-[m
[31m-    col.type = strbyte(data, pos)[m
[31m-[m
[31m-    --[[[m
[31m-    pos = pos + 1[m
[31m-[m
[31m-    col.flags, pos = _get_byte2(data, pos)[m
[31m-[m
[31m-    col.decimals = strbyte(data, pos)[m
[31m-    pos = pos + 1[m
[31m-[m
[31m-    local default = sub(data, pos + 2)[m
[31m-    if default and default ~= "" then[m
[31m-        col.default = default[m
[31m-    end[m
[31m-    --]][m
[31m-[m
[31m-    return col[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_row_data_packet(data, cols, compact)[m
[31m-    local pos = 1[m
[31m-    local ncols = #cols[m
[31m-    local row[m
[31m-    if compact then[m
[31m-        row = new_tab(ncols, 0)[m
[31m-    else[m
[31m-        row = new_tab(0, ncols)[m
[31m-    end[m
[31m-    for i = 1, ncols do[m
[31m-        local value[m
[31m-        value, pos = _from_length_coded_str(data, pos)[m
[31m-        local col = cols[i][m
[31m-        local typ = col.type[m
[31m-        local name = col.name[m
[31m-[m
[31m-        --print("row field value: ", value, ", type: ", typ)[m
[31m-[m
[31m-        if value ~= null then[m
[31m-            local conv = converters[typ][m
[31m-            if conv then[m
[31m-                value = conv(value)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if compact then[m
[31m-            row[i] = value[m
[31m-[m
[31m-        else[m
[31m-            row[name] = value[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return row[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _recv_field_packet(self)[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if typ == "ERR" then[m
[31m-        local errno, msg, sqlstate = _parse_err_packet(packet)[m
[31m-        return nil, msg, errno, sqlstate[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= 'DATA' then[m
[31m-        return nil, "bad field packet type: " .. typ[m
[31m-    end[m
[31m-[m
[31m-    -- typ == 'DATA'[m
[31m-[m
[31m-    return _parse_field_packet(packet)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local sock, err = tcp()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-    return setmetatable({ sock = sock }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(timeout)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.connect(self, opts)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local max_packet_size = opts.max_packet_size[m
[31m-    if not max_packet_size then[m
[31m-        max_packet_size = 1024 * 1024 -- default 1 MB[m
[31m-    end[m
[31m-    self._max_packet_size = max_packet_size[m
[31m-[m
[31m-    local ok, err[m
[31m-[m
[31m-    self.compact = opts.compact_arrays[m
[31m-[m
[31m-    local database = opts.database or ""[m
[31m-    local user = opts.user or ""[m
[31m-[m
[31m-    local pool = opts.pool[m
[31m-[m
[31m-    local host = opts.host[m
[31m-    if host then[m
[31m-        local port = opts.port or 3306[m
[31m-        if not pool then[m
[31m-            pool = user .. ":" .. database .. ":" .. host .. ":" .. port[m
[31m-        end[m
[31m-[m
[31m-        ok, err = sock:connect(host, port, { pool = pool })[m
[31m-[m
[31m-    else[m
[31m-        local path = opts.path[m
[31m-        if not path then[m
[31m-            return nil, 'neither "host" nor "path" options are specified'[m
[31m-        end[m
[31m-[m
[31m-        if not pool then[m
[31m-            pool = user .. ":" .. database .. ":" .. path[m
[31m-        end[m
[31m-[m
[31m-        ok, err = sock:connect("unix:" .. path, { pool = pool })[m
[31m-    end[m
[31m-[m
[31m-    if not ok then[m
[31m-        return nil, 'failed to connect: ' .. err[m
[31m-    end[m
[31m-[m
[31m-    local reused = sock:getreusedtimes()[m
[31m-[m
[31m-    if reused and reused > 0 then[m
[31m-        self.state = STATE_CONNECTED[m
[31m-        return 1[m
[31m-    end[m
[31m-[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if typ == "ERR" then[m
[31m-        local errno, msg, sqlstate = _parse_err_packet(packet)[m
[31m-        return nil, msg, errno, sqlstate[m
[31m-    end[m
[31m-[m
[31m-    self.protocol_ver = strbyte(packet)[m
[31m-[m
[31m-    --print("protocol version: ", self.protocol_ver)[m
[31m-[m
[31m-    local server_ver, pos = _from_cstring(packet, 2)[m
[31m-    if not server_ver then[m
[31m-        return nil, "bad handshake initialization packet: bad server version"[m
[31m-    end[m
[31m-[m
[31m-    --print("server version: ", server_ver)[m
[31m-[m
[31m-    self._server_ver = server_ver[m
[31m-[m
[31m-    local thread_id, pos = _get_byte4(packet, pos)[m
[31m-[m
[31m-    --print("thread id: ", thread_id)[m
[31m-[m
[31m-    local scramble = sub(packet, pos, pos + 8 - 1)[m
[31m-    if not scramble then[m
[31m-        return nil, "1st part of scramble not found"[m
[31m-    end[m
[31m-[m
[31m-    pos = pos + 9 -- skip filler[m
[31m-[m
[31m-    -- two lower bytes[m
[31m-    local capabilities  -- server capabilities[m
[31m-    capabilities, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    -- print(format("server capabilities: %#x", capabilities))[m
[31m-[m
[31m-    self._server_lang = strbyte(packet, pos)[m
[31m-    pos = pos + 1[m
[31m-[m
[31m-    --print("server lang: ", self._server_lang)[m
[31m-[m
[31m-    self._server_status, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    --print("server status: ", self._server_status)[m
[31m-[m
[31m-    local more_capabilities[m
[31m-    more_capabilities, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    capabilities = bor(capabilities, lshift(more_capabilities, 16))[m
[31m-[m
[31m-    --print("server capabilities: ", capabilities)[m
[31m-[m
[31m-    -- local len = strbyte(packet, pos)[m
[31m-    local len = 21 - 8 - 1[m
[31m-[m
[31m-    --print("scramble len: ", len)[m
[31m-[m
[31m-    pos = pos + 1 + 10[m
[31m-[m
[31m-    local scramble_part2 = sub(packet, pos, pos + len - 1)[m
[31m-    if not scramble_part2 then[m
[31m-        return nil, "2nd part of scramble not found"[m
[31m-    end[m
[31m-[m
[31m-    scramble = scramble .. scramble_part2[m
[31m-    --print("scramble: ", _dump(scramble))[m
[31m-[m
[31m-    local client_flags = 0x3f7cf;[m
[31m-[m
[31m-    local ssl_verify = opts.ssl_verify[m
[31m-    local use_ssl = opts.ssl or ssl_verify[m
[31m-[m
[31m-    if use_ssl then[m
[31m-        if band(capabilities, CLIENT_SSL) == 0 then[m
[31m-            return nil, "ssl disabled on server"[m
[31m-        end[m
[31m-[m
[31m-        -- send a SSL Request Packet[m
[31m-        local req = _set_byte4(bor(client_flags, CLIENT_SSL))[m
[31m-                    .. _set_byte4(self._max_packet_size)[m
[31m-                    .. "\0" -- TODO: add support for charset encoding[m
[31m-                    .. strrep("\0", 23)[m
[31m-[m
[31m-        local packet_len = 4 + 4 + 1 + 23[m
[31m-        local bytes, err = _send_packet(self, req, packet_len)[m
[31m-        if not bytes then[m
[31m-            return nil, "failed to send client authentication packet: " .. err[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = sock:sslhandshake(false, nil, ssl_verify)[m
[31m-        if not ok then[m
[31m-            return nil, "failed to do ssl handshake: " .. (err or "")[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local password = opts.password or ""[m
[31m-[m
[31m-    local token = _compute_token(password, scramble)[m
[31m-[m
[31m-    --print("token: ", _dump(token))[m
[31m-[m
[31m-    local req = _set_byte4(client_flags)[m
[31m-                .. _set_byte4(self._max_packet_size)[m
[31m-                .. "\0" -- TODO: add support for charset encoding[m
[31m-                .. strrep("\0", 23)[m
[31m-                .. _to_cstring(user)[m
[31m-                .. _to_binary_coded_string(token)[m
[31m-                .. _to_cstring(database)[m
[31m-[m
[31m-    local packet_len = 4 + 4 + 1 + 23 + #user + 1[m
[31m-        + #token + 1 + #database + 1[m
[31m-[m
[31m-    -- print("packet content length: ", packet_len)[m
[31m-    -- print("packet content: ", _dump(concat(req, "")))[m
[31m-[m
[31m-    local bytes, err = _send_packet(self, req, packet_len)[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send client authentication packet: " .. err[m
[31m-    end[m
[31m-[m
[31m-    --print("packet sent ", bytes, " bytes")[m
[31m-[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, "failed to receive the result packet: " .. err[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'ERR' then[m
[31m-        local errno, msg, sqlstate = _parse_err_packet(packet)[m
[31m-        return nil, msg, errno, sqlstate[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'EOF' then[m
[31m-        return nil, "old pre-4.1 authentication protocol not supported"[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= 'OK' then[m
[31m-        return nil, "bad packet type: " .. typ[m
[31m-    end[m
[31m-[m
[31m-    self.state = STATE_CONNECTED[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_keepalive(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if self.state ~= STATE_CONNECTED then[m
[31m-        return nil, "cannot be reused in the current connection state: "[m
[31m-                    .. (self.state or "nil")[m
[31m-    end[m
[31m-[m
[31m-    self.state = nil[m
[31m-    return sock:setkeepalive(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_reused_times(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:getreusedtimes()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.close(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    self.state = nil[m
[31m-[m
[31m-    local bytes, err = _send_packet(self, strchar(COM_QUIT), 1)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return sock:close()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.server_ver(self)[m
[31m-    return self._server_ver[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function send_query(self, query)[m
[31m-    if self.state ~= STATE_CONNECTED then[m
[31m-        return nil, "cannot send query in the current context: "[m
[31m-                    .. (self.state or "nil")[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    self.packet_no = -1[m
[31m-[m
[31m-    local cmd_packet = strchar(COM_QUERY) .. query[m
[31m-    local packet_len = 1 + #query[m
[31m-[m
[31m-    local bytes, err = _send_packet(self, cmd_packet, packet_len)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    self.state = STATE_COMMAND_SENT[m
[31m-[m
[31m-    --print("packet sent ", bytes, " bytes")[m
[31m-[m
[31m-    return bytes[m
[31m-end[m
[31m-_M.send_query = send_query[m
[31m-[m
[31m-[m
[31m-local function read_result(self, est_nrows)[m
[31m-    if self.state ~= STATE_COMMAND_SENT then[m
[31m-        return nil, "cannot read result in the current context: "[m
[31m-                    .. (self.state or "nil")[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if typ == "ERR" then[m
[31m-        self.state = STATE_CONNECTED[m
[31m-[m
[31m-        local errno, msg, sqlstate = _parse_err_packet(packet)[m
[31m-        return nil, msg, errno, sqlstate[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'OK' then[m
[31m-        local res = _parse_ok_packet(packet)[m
[31m-        if res and band(res.server_status, SERVER_MORE_RESULTS_EXISTS) ~= 0 then[m
[31m-            return res, "again"[m
[31m-        end[m
[31m-[m
[31m-        self.state = STATE_CONNECTED[m
[31m-        return res[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= 'DATA' then[m
[31m-        self.state = STATE_CONNECTED[m
[31m-[m
[31m-        return nil, "packet type " .. typ .. " not supported"[m
[31m-    end[m
[31m-[m
[31m-    -- typ == 'DATA'[m
[31m-[m
[31m-    --print("read the result set header packet")[m
[31m-[m
[31m-    local field_count, extra = _parse_result_set_header_packet(packet)[m
[31m-[m
[31m-    --print("field count: ", field_count)[m
[31m-[m
[31m-    local cols = new_tab(field_count, 0)[m
[31m-    for i = 1, field_count do[m
[31m-        local col, err, errno, sqlstate = _recv_field_packet(self)[m
[31m-        if not col then[m
[31m-            return nil, err, errno, sqlstate[m
[31m-        end[m
[31m-[m
[31m-        cols[i] = col[m
[31m-    end[m
[31m-[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= 'EOF' then[m
[31m-        return nil, "unexpected packet type " .. typ .. " while eof packet is "[m
[31m-            .. "expected"[m
[31m-    end[m
[31m-[m
[31m-    -- typ == 'EOF'[m
[31m-[m
[31m-    local compact = self.compact[m
[31m-[m
[31m-    local rows = new_tab(est_nrows or 4, 0)[m
[31m-    local i = 0[m
[31m-    while true do[m
[31m-        --print("reading a row")[m
[31m-[m
[31m-        packet, typ, err = _recv_packet(self)[m
[31m-        if not packet then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if typ == 'EOF' then[m
[31m-            local warning_count, status_flags = _parse_eof_packet(packet)[m
[31m-[m
[31m-            --print("status flags: ", status_flags)[m
[31m-[m
[31m-            if band(status_flags, SERVER_MORE_RESULTS_EXISTS) ~= 0 then[m
[31m-                return rows, "again"[m
[31m-            end[m
[31m-[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        -- if typ ~= 'DATA' then[m
[31m-            -- return nil, 'bad row packet type: ' .. typ[m
[31m-        -- end[m
[31m-[m
[31m-        -- typ == 'DATA'[m
[31m-[m
[31m-        local row = _parse_row_data_packet(packet, cols, compact)[m
[31m-        i = i + 1[m
[31m-        rows[i] = row[m
[31m-    end[m
[31m-[m
[31m-    self.state = STATE_CONNECTED[m
[31m-[m
[31m-    return rows[m
[31m-end[m
[31m-_M.read_result = read_result[m
[31m-[m
[31m-[m
[31m-function _M.query(self, query, est_nrows)[m
[31m-    local bytes, err = send_query(self, query)[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send query: " .. err[m
[31m-    end[m
[31m-[m
[31m-    return read_result(self, est_nrows)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_compact_arrays(self, value)[m
[31m-    self.compact = value[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/big.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/big.t[m
[1mdeleted file mode 100644[m
[1mindex 5fc3905..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/big.t[m
[1m+++ /dev/null[m
[36m@@ -1,408 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-my @skip;[m
[31m-BEGIN {[m
[31m-    if ($ENV{LD_PRELOAD} =~ /\bmockeagain\.so\b/) {[m
[31m-        @skip = (skip_all => 'too slow in mockeagain mode')[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua @skip;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(50);[m
[31m-#repeat_each(10);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-log_level 'warn';[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: big field value exceeding 256[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(1024))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'"[m
[31m-                   .. string.rep("B", 1024)[m
[31m-                   .. "\')")[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-'connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-1 rows inserted into table cats (last id: 1)[m
[31m-result: [{"id":"1","name":"' . ('B' x 1024)[m
[31m-   . '"}]' . "\n" .[m
[31m-'result: [{"id":"1","name":"' . ('B' x 1024)[m
[31m-   . '"}]' . "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: big field value exceeding max packet size[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                max_packet_size = 1024 })[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(1024))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'"[m
[31m-                   .. string.rep("B", 1024)[m
[31m-                   .. "\')")[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-'connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-1 rows inserted into table cats (last id: 1)[m
[31m-bad result: packet size too big: 1029: nil: nil.[m
[31m-'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: big field value exceeding 256 (first field in rows)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(1024))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'"[m
[31m-                   .. string.rep("B", 1024)[m
[31m-                   .. "\')")[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-'connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-1 rows inserted into table cats (last id: 1)[m
[31m-result: [{"name":"' . ('B' x 1024)[m
[31m-   . '"}]' . "\n" .[m
[31m-'result: [{"name":"' . ('B' x 1024)[m
[31m-   . '"}]' . "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: big field value exceeding 65536 (first field in rows)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(65540))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'"[m
[31m-                   .. string.rep("B", 65540)[m
[31m-                   .. "\')")[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-'connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-1 rows inserted into table cats (last id: 1)[m
[31m-result: [{"name":"' . ('B' x 65540)[m
[31m-   . '"}]' . "\n" .[m
[31m-'result: [{"name":"' . ('B' x 65540)[m
[31m-   . '"}]' . "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/compact_arrays.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/compact_arrays.t[m
[1mdeleted file mode 100644[m
[1mindex 4581f77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/compact_arrays.t[m
[1m+++ /dev/null[m
[36m@@ -1,345 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: send query w/o result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect{[m
[31m-                compact_arrays = true,[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"}[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: (?:{"insert_id":0,"server_status":2,"warning_count":[01],"affected_rows":0}|{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]})$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: select query with an non-empty result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect{[m
[31m-                compact_arrays = true,[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"}[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name, id from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name, id from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [["Bob","1"],["","2"],[null,"3"]][m
[31m-result: [[null,"3"],["","2"],["Bob","1"]][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: select query with an empty result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect{[m
[31m-                compact_arrays = true,[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"}[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-result: [][m
[31m-result: [][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select query with an non-empty result set - set_compact_arrays[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect{[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"}[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            db:set_compact_arrays(true)[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name, id from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            db:set_compact_arrays(false)[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name, id from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [["Bob","1"],["","2"],[null,"3"]][m
[31m-result: [{"id":"3","name":null},{"id":"2","name":""},{"id":"1","name":"Bob"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/data/test.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/data/test.crt[m
[1mdeleted file mode 100644[m
[1mindex a69a011..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/data/test.crt[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICqTCCAhICCQClDm1WkreW4jANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQD[m
[31m-DAh0ZXN0LmNvbTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20wIBcN[m
[31m-MTQwNzIxMDMyMzQ3WhgPMjE1MTA2MTMwMzIzNDdaMIGXMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MRIwEAYDVQQLDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl[m
[31m-c3QuY29tMSAwHgYJKoZIhvcNAQkBFhFhZ2VudHpoQGdtYWlsLmNvbTCBnzANBgkq[m
[31m-hkiG9w0BAQEFAAOBjQAwgYkCgYEA6P18zUvtmaKQK2xePy8ZbFwSyTLw+jW6t9eZ[m
[31m-aiTec8X3ibN9WemrxHzkTRikxP3cAQoITRuZiQvF4Q7DO6wMkz/b0zwfgX5uedGq[m
[31m-047AJP6n/mwlDOjGSNomBLoXQzo7tVe60ikEm3ZyDUqnJPJMt3hImO5XSop4MPMu[m
[31m-Za9WhFcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQA4OBb9bOyWB1//93nSXX1mdENZ[m
[31m-IQeyTK0Dd6My76lnZxnZ4hTWrvvd0b17KLDU6JnS2N5ee3ATVkojPidRLWLIhnh5[m
[31m-0eXrcKalbO2Ce6nShoFvQCQKXN2Txmq2vO/Mud2bHAWwJALg+qi1Iih/gVYB9sct[m
[31m-FLg8zFOzRlYiU+6Mmw==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/data/test.key b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/data/test.key[m
[1mdeleted file mode 100644[m
[1mindex 6c13527..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/data/test.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXgIBAAKBgQDo/XzNS+2ZopArbF4/LxlsXBLJMvD6Nbq315lqJN5zxfeJs31Z[m
[31m-6avEfORNGKTE/dwBCghNG5mJC8XhDsM7rAyTP9vTPB+Bfm550arTjsAk/qf+bCUM[m
[31m-6MZI2iYEuhdDOju1V7rSKQSbdnINSqck8ky3eEiY7ldKingw8y5lr1aEVwIDAQAB[m
[31m-AoGBANgB66sKMga2SKN5nQdHS3LDCkevCutu1OWM5ZcbB4Kej5kC57xsf+tzPtab[m
[31m-emeIVGhCPOAALqB4YcT+QtMX967oM1MjcFbtH7si5oq6UYyp3i0G9Si6jIoVHz3+[m
[31m-8yOUaqwKbK+bRX8VS0YsHZmBsPK5ryN50iUwsU08nemoA94BAkEA9GS9Q5OPeFkM[m
[31m-tFxsIQ1f2FSsZAuN/1cpZgJqY+YaAN7MSPGTWyfd7nWG/Zgk3GO9/2ihh4gww+7B[m
[31m-To09GkmW4QJBAPQOHC2V+t2TA98+6Lj6+TYwcGEkhOENfVpH25mQ+kXgF/1Bd6rA[m
[31m-nosT1bdAY+SnmWXbSw6Kv5C20Em+bEX8WjcCQCSRRjhsRdVODbaW9Z7kb2jhEoJN[m
[31m-sEt6cTlQNzcHYPCsZYisjM3g4zYg47fiIfHQAsfKkhDDcfh/KvFj9LaQOEECQQCH[m
[31m-eBWYEDpSJ7rsfqT7mQQgWj7nDThdG/nK1TxGP71McBmg0Gg2dfkLRhVJRQqt74Is[m
[31m-kc9V4Rp4n6F6baL4Lh19AkEA6pZZer0kg3Kv9hjhaITIKUYdfIp9vYnDRWbQlBmR[m
[31m-atV8V9u9q2ETZvqfHpN+9Lu6NYR4yXIEIRf1bnIZ/mr9eQ==[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 42d7a9b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,1252 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad user[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "user_not_found",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            db:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: Access denied for user 'user_not_found'@'localhost' (using password: YES): 1045 28000[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bad host[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "host-not-found.org",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            db:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^failed to connect: failed to connect: host-not-found.org could not be resolved(?: \(3: Host not found\))?: nil nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 7[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: connected[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver())[m
[31m-[m
[31m-            db:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-connected to mysql \d\.\S+[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: send query w/o result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: \{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]\}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: send bad query[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("bad SQL")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 12 bytes\.[m
[31m-bad result: You have an error in your SQL syntax; check the manual that corresponds to your (?:MySQL|MariaDB) server version for the right syntax to use near 'bad SQL' at line 1: 1064: 42000\.$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: select query with an non-empty result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [{"id":"1","name":"Bob"},{"id":"2","name":""},{"id":"3","name":null}][m
[31m-result: [{"id":"3","name":null},{"id":"2","name":""},{"id":"1","name":"Bob"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: select query with an empty result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-result: [][m
[31m-result: [][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: numerical types[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists foo")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table foo dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table foo (id serial primary key, bar tinyint, baz smallint, bah float, blah double, kah bigint, hah mediumint, haha year, lah int)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table foo created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into foo (bar, baz, bah, blah, kah, hah, haha, lah) value (3, 4, 3.14, 5.16, 65535, 256, 1998, 579),(null, null, null, null, null, null, null, null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table foo (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from foo order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from foo order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table foo dropped.[m
[31m-table foo created.[m
[31m-2 rows inserted into table foo (last id: 1)[m
[31m-result: [{"bah":3.14,"bar":3,"baz":4,"blah":5.16,"hah":256,"haha":1998,"id":"1","kah":"65535","lah":579},{"bah":null,"bar":null,"baz":null,"blah":null,"hah":null,"haha":null,"id":"2","kah":null,"lah":null}][m
[31m-result: [{"bah":null,"bar":null,"baz":null,"blah":null,"hah":null,"haha":null,"id":"2","kah":null,"lah":null},{"bah":3.14,"bar":3,"baz":4,"blah":5.16,"hah":256,"haha":1998,"id":"1","kah":"65535","lah":579}][m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multiple DDL statements[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate =[m
[31m-                db:query("drop table if exists foo; "[m
[31m-                         .. "create table foo (id serial primary key, name text);")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from foo order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            else[m
[31m-                ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-            end[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            else[m
[31m-                ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-            end[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from foo order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            else[m
[31m-                ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-result: {"affected_rows":0,"insert_id":0,"server_status":10,"warning_count":0}, err:again[m
[31m-bad result: failed to send query: cannot send query in the current context: 2: nil: nil.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: multiple select queries[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate =[m
[31m-                db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("create table cats "[m
[31m-                         .. "(id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("insert into cats (name) "[m
[31m-                         .. "values (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows .. " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc; "[m
[31m-                         .. "select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [{"id":"1","name":"Bob"},{"id":"2","name":""},{"id":"3","name":null}], err:again[m
[31m-result: [{"id":"3","name":null},{"id":"2","name":""},{"id":"1","name":"Bob"}], err:nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set_keepalive in the wrong state[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate =[m
[31m-                db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("create table cats "[m
[31m-                         .. "(id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("insert into cats (name) "[m
[31m-                         .. "values (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows .. " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc; "[m
[31m-                         .. "select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [{"id":"1","name":"Bob"},{"id":"2","name":""},{"id":"3","name":null}], err:again[m
[31m-failed to set keepalive: cannot be reused in the current connection state: 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set keepalive (tcp)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc;")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql: [02][m
[31m-connected to mysql: [13][m
[31m-result: \[\{"id":"1","name":"Bob"\},\{"id":"2","name":""\},\{"id":"3","name":null\}\], err:nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/lua tcp socket keepalive create connection pool for key "ngx_test:ngx_test:[^\s:]+:\d+"/[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: send query w/o result set (unix domain socket)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: (?:\{"insert_id":0,"server_status":2,"warning_count":1,"affected_rows":0}|{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]\})$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: null at the beginning of a row[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [{"name":"Bob"},{"name":""},{"name":null}][m
[31m-result: [{"name":null},{"name":""},{"name":"Bob"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set keepalive (uds)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc;")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql: [02][m
[31m-connected to mysql: [13][m
[31m-result: \[\{"id":"1","name":"Bob"\},\{"id":"2","name":""\},\{"id":"3","name":null\}\], err:nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/lua tcp socket keepalive create connection pool for key "ngx_test:ngx_test:[^\s:]+"/[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set keepalive (explicit pool name)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                pool = "my_pool"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                pool = "my_pool"})[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc;")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql: [02][m
[31m-connected to mysql: [13][m
[31m-result: \[\{"id":"1","name":"Bob"\},\{"id":"2","name":""\},\{"id":"3","name":null\}\], err:nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/lua tcp socket keepalive create connection pool for key "my_pool"/[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: the mysql newdecimal type[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                pool = "my_pool"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                pool = "my_pool"})[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select sum(id) from cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql: [02][m
[31m-connected to mysql: [13][m
[31m-result: \[\{"sum\(id\)":6\}\], err:nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/lua tcp socket keepalive create connection pool for key "my_pool"/[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: large insert_id exceeding a 32-bit integer value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require("resty.mysql")[m
[31m-            local create_sql = [[[m
[31m-                CREATE TABLE `large_t` ([m
[31m-                    `id` bigint(11) NOT NULL AUTO_INCREMENT,[m
[31m-                    PRIMARY KEY (`id`)[m
[31m-                ) AUTO_INCREMENT=5000000312;[m
[31m-            ]][m
[31m-            local drop_sql = [[[m
[31m-                DROP TABLE IF EXISTS `large_t`;[m
[31m-            ]][m
[31m-            local insert_sql = [[[m
[31m-                INSERT INTO `large_t` VALUES(NULL);[m
[31m-            ]][m
[31m-            local db, err = mysql:new()[m
[31m-            if not db then[m
[31m-                ngx.say("failed to instantiate mysql: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            db:set_timeout(1000)[m
[31m-            local ok, err = db:connect{[m
[31m-                                       host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                                       port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                                       database="ngx_test",[m
[31m-                                       user="ngx_test",[m
[31m-                                       password="ngx_test"}[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-            local res, err = db:query(drop_sql)[m
[31m-            if not res then[m
[31m-                ngx.say("drop table error:" .. err)[m
[31m-                return[m
[31m-            end[m
[31m-            local res, err = db:query(create_sql)[m
[31m-            if not res then[m
[31m-                ngx.say("create table error:" .. err)[m
[31m-                return[m
[31m-            end[m
[31m-            local res, err = db:query(insert_sql)[m
[31m-            if not res then[m
[31m-                ngx.say("insert table error:" .. err)[m
[31m-                return[m
[31m-            else[m
[31m-                ngx.say(res.insert_id)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-5000000312[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/ssl.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/ssl.t[m
[1mdeleted file mode 100644[m
[1mindex 4b55b5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/ssl.t[m
[1m+++ /dev/null[m
[36m@@ -1,211 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: send query w/o result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(4000) -- 4 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                ssl = true,[m
[31m-            })[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: \{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]\}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: send query w/o result set (verify)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_ssl_trusted_certificate ../../data/test.crt;  # assuming used by the MySQL server[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(4000) -- 4 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                ssl = true,[m
[31m-                ssl_verify = true,[m
[31m-            })[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: \{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]\}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: send query w/o result set (verify, failed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(4000) -- 4 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                ssl = true,[m
[31m-                ssl_verify = true,[m
[31m-            })[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: failed to do ssl handshake: 18: self signed certificate: nil nil[m
[31m---- error_log[m
[31m-lua ssl certificate verify error: (18: self signed certificate)[m
[31m---- timeout: 5[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex 0e767d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            ngx.say(mysql._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/world.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/world.t[m
[1mdeleted file mode 100644[m
[1mindex a8eb8d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/t/world.t[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test an old bug in table.new() on i386 in luajit v2.1[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            -- jit.off()[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "world",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            local res, err, errno, sqlstate[m
[31m-            for j = 1, 10 do[m
[31m-                res, err, errno, sqlstate = db:query("select * from City order by ID limit 50", 50)[m
[31m-                if not res then[m
[31m-                    ngx.log(ngx.ERR, "bad result #1: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                    return ngx.exit(500)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for _, row in ipairs(res) do[m
[31m-                local ncols = 0[m
[31m-                for k, v in pairs(row) do[m
[31m-                    ncols = ncols + 1[m
[31m-                end[m
[31m-                ngx.say("ncols: ", ncols)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = db:set_keepalive(10000, 50)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set keepalive: ", err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"ncols: 5\n" x 50[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ee195dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-mysql-0.16/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,549 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex c1cf553..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-*.t_[m
[31m-tags[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 9b5a448..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,68 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-services:[m
[31m- - redis-server[m
[31m-[m
[31m-cache:[m
[31m-  directories:[m
[31m-  - download-cache[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - JOBS=3[m
[31m-    - NGX_BUILD_JOBS=$JOBS[m
[31m-    - LUAJIT_PREFIX=/opt/luajit21[m
[31m-    - LUAJIT_LIB=$LUAJIT_PREFIX/lib[m
[31m-    - LUAJIT_INC=$LUAJIT_PREFIX/include/luajit-2.1[m
[31m-    - LUA_INCLUDE_DIR=$LUAJIT_INC[m
[31m-    - LUA_CMODULE_DIR=/lib[m
[31m-    - OPENSSL_PREFIX=/opt/ssl[m
[31m-    - OPENSSL_LIB=$OPENSSL_PREFIX/lib[m
[31m-    - OPENSSL_INC=$OPENSSL_PREFIX/include[m
[31m-    - OPENSSL_VER=1.0.2h[m
[31m-    - LD_LIBRARY_PATH=$LUAJIT_LIB:$LD_LIBRARY_PATH[m
[31m-    - TEST_NGINX_SLEEP=0.006[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-#    - NGINX_VERSION=1.10.0[m
[31m-[m
[31m-install:[m
[31m-  - if [ ! -d download-cache ]; then mkdir download-cache; fi[m
[31m-  - if [ ! -f download-cache/openssl-$OPENSSL_VER.tar.gz ]; then wget -O download-cache/openssl-$OPENSSL_VER.tar.gz https://www.openssl.org/source/openssl-$OPENSSL_VER.tar.gz; fi[m
[31m-  - sudo apt-get install -qq -y cpanminus axel[m
[31m-  - sudo cpanm --notest Test::Nginx > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz[m
[31m-  - git clone https://github.com/openresty/openresty.git ../openresty[m
[31m-  - git clone https://github.com/openresty/nginx-devel-utils.git[m
[31m-  - git clone https://github.com/openresty/lua-cjson.git[m
[31m-  - git clone https://github.com/openresty/lua-nginx-module.git ../lua-nginx-module[m
[31m-  - git clone https://github.com/openresty/echo-nginx-module.git ../echo-nginx-module[m
[31m-  - git clone https://github.com/openresty/no-pool-nginx.git ../no-pool-nginx[m
[31m-  - git clone -b v2.1-agentzh https://github.com/openresty/luajit2.git[m
[31m-[m
[31m-script:[m
[31m-  - cd luajit2/[m
[31m-  - make -j$JOBS CCDEBUG=-g Q= PREFIX=$LUAJIT_PREFIX CC=$CC XCFLAGS='-DLUA_USE_APICHECK -DLUA_USE_ASSERT' > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make install PREFIX=$LUAJIT_PREFIX > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ../lua-cjson && make && sudo PATH=$PATH make install && cd ..[m
[31m-  - tar zxf download-cache/openssl-$OPENSSL_VER.tar.gz[m
[31m-  - cd openssl-$OPENSSL_VER/[m
[31m-  - ./config shared --prefix=$OPENSSL_PREFIX -DPURIFY > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make PATH=$PATH install_sw > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - export PATH=$PWD/work/nginx/sbin:$PWD/nginx-devel-utils:$PATH[m
[31m-  - export NGX_BUILD_CC=$CC[m
[31m-  - ngx-build $NGINX_VERSION --with-ipv6 --with-http_realip_module --with-http_ssl_module --add-module=../echo-nginx-module --add-module=../lua-nginx-module --with-debug[m
[31m-  - nginx -V[m
[31m-  - ldd `which nginx`|grep -E 'luajit|ssl|pcre'[m
[31m-  - prove -r t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f42cae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty-debug[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/lib/resty/redis.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/lib/resty/redis.lua[m
[1mdeleted file mode 100644[m
[1mindex e44bd1b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/lib/resty/redis.lua[m
[1m+++ /dev/null[m
[36m@@ -1,468 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-local sub = string.sub[m
[31m-local byte = string.byte[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local null = ngx.null[m
[31m-local type = type[m
[31m-local pairs = pairs[m
[31m-local unpack = unpack[m
[31m-local setmetatable = setmetatable[m
[31m-local tonumber = tonumber[m
[31m-local tostring = tostring[m
[31m---local error = error[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok or type(new_tab) ~= "function" then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 155)[m
[31m-_M._VERSION = '0.24'[m
[31m-[m
[31m-[m
[31m-local commands = {[m
[31m-    "append",            "auth",              "bgrewriteaof",[m
[31m-    "bgsave",            "bitcount",          "bitop",[m
[31m-    "blpop",             "brpop",[m
[31m-    "brpoplpush",        "client",            "config",[m
[31m-    "dbsize",[m
[31m-    "debug",             "decr",              "decrby",[m
[31m-    "del",               "discard",           "dump",[m
[31m-    "echo",[m
[31m-    "eval",              "exec",              "exists",[m
[31m-    "expire",            "expireat",          "flushall",[m
[31m-    "flushdb",           "get",               "getbit",[m
[31m-    "getrange",          "getset",            "hdel",[m
[31m-    "hexists",           "hget",              "hgetall",[m
[31m-    "hincrby",           "hincrbyfloat",      "hkeys",[m
[31m-    "hlen",[m
[31m-    "hmget",             --[[ "hmset", ]]     "hscan",[m
[31m-    "hset",[m
[31m-    "hsetnx",            "hvals",             "incr",[m
[31m-    "incrby",            "incrbyfloat",       "info",[m
[31m-    "keys",[m
[31m-    "lastsave",          "lindex",            "linsert",[m
[31m-    "llen",              "lpop",              "lpush",[m
[31m-    "lpushx",            "lrange",            "lrem",[m
[31m-    "lset",              "ltrim",             "mget",[m
[31m-    "migrate",[m
[31m-    "monitor",           "move",              "mset",[m
[31m-    "msetnx",            "multi",             "object",[m
[31m-    "persist",           "pexpire",           "pexpireat",[m
[31m-    "ping",              "psetex",       --[[ "psubscribe", ]][m
[31m-    "pttl",[m
[31m-    "publish",      --[[ "punsubscribe", ]]   "pubsub",[m
[31m-    "quit",[m
[31m-    "randomkey",         "rename",            "renamenx",[m
[31m-    "restore",[m
[31m-    "rpop",              "rpoplpush",         "rpush",[m
[31m-    "rpushx",            "sadd",              "save",[m
[31m-    "scan",              "scard",             "script",[m
[31m-    "sdiff",             "sdiffstore",[m
[31m-    "select",            "set",               "setbit",[m
[31m-    "setex",             "setnx",             "setrange",[m
[31m-    "shutdown",          "sinter",            "sinterstore",[m
[31m-    "sismember",         "slaveof",           "slowlog",[m
[31m-    "smembers",          "smove",             "sort",[m
[31m-    "spop",              "srandmember",       "srem",[m
[31m-    "sscan",[m
[31m-    "strlen",       --[[ "subscribe", ]]      "sunion",[m
[31m-    "sunionstore",       "sync",              "time",[m
[31m-    "ttl",[m
[31m-    "type",         --[[ "unsubscribe", ]]    "unwatch",[m
[31m-    "watch",             "zadd",              "zcard",[m
[31m-    "zcount",            "zincrby",           "zinterstore",[m
[31m-    "zrange",            "zrangebyscore",     "zrank",[m
[31m-    "zrem",              "zremrangebyrank",   "zremrangebyscore",[m
[31m-    "zrevrange",         "zrevrangebyscore",  "zrevrank",[m
[31m-    "zscan",[m
[31m-    "zscore",            "zunionstore",       "evalsha"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local sub_commands = {[m
[31m-    "subscribe", "psubscribe"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local unsub_commands = {[m
[31m-    "unsubscribe", "punsubscribe"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local sock, err = tcp()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-    return setmetatable({ sock = sock }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(timeout)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.connect(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    self.subscribed = nil[m
[31m-[m
[31m-    return sock:connect(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_keepalive(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if self.subscribed then[m
[31m-        return nil, "subscribed state"[m
[31m-    end[m
[31m-[m
[31m-    return sock:setkeepalive(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_reused_times(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:getreusedtimes()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function close(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:close()[m
[31m-end[m
[31m-_M.close = close[m
[31m-[m
[31m-[m
[31m-local function _read_reply(self, sock)[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" and not self.subscribed then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local prefix = byte(line)[m
[31m-[m
[31m-    if prefix == 36 then    -- char '$'[m
[31m-        -- print("bulk reply")[m
[31m-[m
[31m-        local size = tonumber(sub(line, 2))[m
[31m-        if size < 0 then[m
[31m-            return null[m
[31m-        end[m
[31m-[m
[31m-        local data, err = sock:receive(size)[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        local dummy, err = sock:receive(2) -- ignore CRLF[m
[31m-        if not dummy then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        return data[m
[31m-[m
[31m-    elseif prefix == 43 then    -- char '+'[m
[31m-        -- print("status reply")[m
[31m-[m
[31m-        return sub(line, 2)[m
[31m-[m
[31m-    elseif prefix == 42 then -- char '*'[m
[31m-        local n = tonumber(sub(line, 2))[m
[31m-[m
[31m-        -- print("multi-bulk reply: ", n)[m
[31m-        if n < 0 then[m
[31m-            return null[m
[31m-        end[m
[31m-[m
[31m-        local vals = new_tab(n, 0)[m
[31m-        local nvals = 0[m
[31m-        for i = 1, n do[m
[31m-            local res, err = _read_reply(self, sock)[m
[31m-            if res then[m
[31m-                nvals = nvals + 1[m
[31m-                vals[nvals] = res[m
[31m-[m
[31m-            elseif res == nil then[m
[31m-                return nil, err[m
[31m-[m
[31m-            else[m
[31m-                -- be a valid redis error value[m
[31m-                nvals = nvals + 1[m
[31m-                vals[nvals] = {false, err}[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        return vals[m
[31m-[m
[31m-    elseif prefix == 58 then    -- char ':'[m
[31m-        -- print("integer reply")[m
[31m-        return tonumber(sub(line, 2))[m
[31m-[m
[31m-    elseif prefix == 45 then    -- char '-'[m
[31m-        -- print("error reply: ", n)[m
[31m-[m
[31m-        return false, sub(line, 2)[m
[31m-[m
[31m-    else[m
[31m-        -- when `line` is an empty string, `prefix` will be equal to nil.[m
[31m-        return nil, "unkown prefix: \"" .. tostring(prefix) .. "\""[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _gen_req(args)[m
[31m-    local nargs = #args[m
[31m-[m
[31m-    local req = new_tab(nargs * 5 + 1, 0)[m
[31m-    req[1] = "*" .. nargs .. "\r\n"[m
[31m-    local nbits = 2[m
[31m-[m
[31m-    for i = 1, nargs do[m
[31m-        local arg = args[i][m
[31m-        if type(arg) ~= "string" then[m
[31m-            arg = tostring(arg)[m
[31m-        end[m
[31m-[m
[31m-        req[nbits] = "$"[m
[31m-        req[nbits + 1] = #arg[m
[31m-        req[nbits + 2] = "\r\n"[m
[31m-        req[nbits + 3] = arg[m
[31m-        req[nbits + 4] = "\r\n"[m
[31m-[m
[31m-        nbits = nbits + 5[m
[31m-    end[m
[31m-[m
[31m-    -- it is much faster to do string concatenation on the C land[m
[31m-    -- in real world (large number of strings in the Lua VM)[m
[31m-    return req[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _do_cmd(self, ...)[m
[31m-    local args = {...}[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req = _gen_req(args)[m
[31m-[m
[31m-    local reqs = self._reqs[m
[31m-    if reqs then[m
[31m-        reqs[#reqs + 1] = req[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    -- print("request: ", table.concat(req))[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return _read_reply(self, sock)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _check_subscribed(self, res)[m
[31m-    if type(res) == "table"[m
[31m-       and (res[1] == "unsubscribe" or res[1] == "punsubscribe")[m
[31m-       and res[3] == 0[m
[31m-   then[m
[31m-        self.subscribed = nil[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.read_reply(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if not self.subscribed then[m
[31m-        return nil, "not subscribed"[m
[31m-    end[m
[31m-[m
[31m-    local res, err = _read_reply(self, sock)[m
[31m-    _check_subscribed(self, res)[m
[31m-[m
[31m-    return res, err[m
[31m-end[m
[31m-[m
[31m-[m
[31m-for i = 1, #commands do[m
[31m-    local cmd = commands[i][m
[31m-[m
[31m-    _M[cmd] =[m
[31m-        function (self, ...)[m
[31m-            return _do_cmd(self, cmd, ...)[m
[31m-        end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-for i = 1, #sub_commands do[m
[31m-    local cmd = sub_commands[i][m
[31m-[m
[31m-    _M[cmd] =[m
[31m-        function (self, ...)[m
[31m-            self.subscribed = true[m
[31m-            return _do_cmd(self, cmd, ...)[m
[31m-        end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-for i = 1, #unsub_commands do[m
[31m-    local cmd = unsub_commands[i][m
[31m-[m
[31m-    _M[cmd] =[m
[31m-        function (self, ...)[m
[31m-            local res, err = _do_cmd(self, cmd, ...)[m
[31m-            _check_subscribed(self, res)[m
[31m-            return res, err[m
[31m-        end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.hmset(self, hashname, ...)[m
[31m-    local args = {...}[m
[31m-    if #args == 1 then[m
[31m-        local t = args[1][m
[31m-[m
[31m-        local n = 0[m
[31m-        for k, v in pairs(t) do[m
[31m-            n = n + 2[m
[31m-        end[m
[31m-[m
[31m-        local array = new_tab(n, 0)[m
[31m-[m
[31m-        local i = 0[m
[31m-        for k, v in pairs(t) do[m
[31m-            array[i + 1] = k[m
[31m-            array[i + 2] = v[m
[31m-            i = i + 2[m
[31m-        end[m
[31m-        -- print("key", hashname)[m
[31m-        return _do_cmd(self, "hmset", hashname, unpack(array))[m
[31m-    end[m
[31m-[m
[31m-    -- backwards compatibility[m
[31m-    return _do_cmd(self, "hmset", hashname, ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.init_pipeline(self, n)[m
[31m-    self._reqs = new_tab(n or 4, 0)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.cancel_pipeline(self)[m
[31m-    self._reqs = nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.commit_pipeline(self)[m
[31m-    local reqs = self._reqs[m
[31m-    if not reqs then[m
[31m-        return nil, "no pipeline"[m
[31m-    end[m
[31m-[m
[31m-    self._reqs = nil[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(reqs)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local nvals = 0[m
[31m-    local nreqs = #reqs[m
[31m-    local vals = new_tab(nreqs, 0)[m
[31m-    for i = 1, nreqs do[m
[31m-        local res, err = _read_reply(self, sock)[m
[31m-        if res then[m
[31m-            nvals = nvals + 1[m
[31m-            vals[nvals] = res[m
[31m-[m
[31m-        elseif res == nil then[m
[31m-            if err == "timeout" then[m
[31m-                close(self)[m
[31m-            end[m
[31m-            return nil, err[m
[31m-[m
[31m-        else[m
[31m-            -- be a valid redis error value[m
[31m-            nvals = nvals + 1[m
[31m-            vals[nvals] = {false, err}[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return vals[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.array_to_hash(self, t)[m
[31m-    local n = #t[m
[31m-    -- print("n = ", n)[m
[31m-    local h = new_tab(0, n / 2)[m
[31m-    for i = 1, n, 2 do[m
[31m-        h[t[i]] = t[i + 1][m
[31m-    end[m
[31m-    return h[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.add_commands(...)[m
[31m-    local cmds = {...}[m
[31m-    for i = 1, #cmds do[m
[31m-        local cmd = cmds[i][m
[31m-        _M[cmd] =[m
[31m-            function (self, ...)[m
[31m-                return _do_cmd(self, cmd, ...)[m
[31m-            end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 58453ba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-my $HtmlDir = html_dir;[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$HtmlDir/?.lua;$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: github issue #108: ngx.locaiton.capture + redis.set_keepalive[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /r1 {[m
[31m-        default_type text/html;[m
[31m-        set $port $TEST_NGINX_REDIS_PORT;[m
[31m-        #lua_code_cache off;[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua_file html/r1.lua;[m
[31m-    }[m
[31m-[m
[31m-    location /r2 {[m
[31m-        default_type text/html;[m
[31m-        set $port $TEST_NGINX_REDIS_PORT;[m
[31m-        #lua_code_cache off;[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua_file html/r2.lua;[m
[31m-    }[m
[31m-[m
[31m-    location /anyurl {[m
[31m-        internal;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/dummy;[m
[31m-    }[m
[31m-[m
[31m-    location = /dummy {[m
[31m-        echo dummy;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> r1.lua[m
[31m-local redis = require "resty.redis"[m
[31m-local red = redis:new()[m
[31m-local ok, err = red:connect("127.0.0.1", ngx.var.port)[m
[31m-if not ok then[m
[31m-    ngx.say("failed to connect: ", err)[m
[31m-    return[m
[31m-end[m
[31m-local ok, err = red:flushall()[m
[31m-if not ok then[m
[31m-    ngx.say("failed to flushall: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ok, err = red:set_keepalive()[m
[31m-if not ok then[m
[31m-    ngx.say("failed to set keepalive: ", err)[m
[31m-    return[m
[31m-end[m
[31m-local http_ress = ngx.location.capture("/r2") -- 1[m
[31m-ngx.say("ok")[m
[31m-[m
[31m->>> r2.lua[m
[31m-local redis = require "resty.redis"[m
[31m-local red = redis:new()[m
[31m-local ok, err = red:connect("127.0.0.1", ngx.var.port) --2[m
[31m-if not ok then[m
[31m-    ngx.say("failed to connect: ", err)[m
[31m-    return[m
[31m-end[m
[31m-local res = ngx.location.capture("/anyurl") --3[m
[31m---- request[m
[31m-    GET /r1[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit(404) after I/O (ngx_lua github issue #110[m
[31m-https://github.com/chaoslawful/lua-nginx-module/issues/110[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    error_page 400 /400.html;[m
[31m-    error_page 404 /404.html;[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            -- ngx.log(ngx.ERR, "hello");[m
[31m-[m
[31m-            -- or connect to a unix domain socket file listened[m
[31m-            -- by a redis server:[m
[31m-            --     local ok, err = red:connect("unix:/path/to/redis.sock")[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:set("dog", "an animal")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.say("set dog: ", res)[m
[31m-[m
[31m-            local res, err = red:get("dog")[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "dog not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.say("dog: ", res)[m
[31m-[m
[31m-            -- red:close()[m
[31m-            local ok, err = red:set_keepalive(0, 100)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-        echo Hello;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 400.html[m
[31m-Bad request, dear...[m
[31m->>> 404.html[m
[31m-Not found, dear...[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-Not found, dear...[m
[31m---- error_code: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set and get an empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            -- or connect to a unix domain socket file listened[m
[31m-            -- by a redis server:[m
[31m-            --     local ok, err = red:connect("unix:/path/to/redis.sock")[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:set("dog", "")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set dog: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, err = red:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res)[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-set dog: OK[m
[31m-dog: [m
[31m-dog: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exec() after red:get()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.exec("/hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /hello {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/count.t[m
[1mdeleted file mode 100644[m
[1mindex 17ebfba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/count.t[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module size of resty.redis[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            n = 0[m
[31m-            for _, _ in pairs(redis) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-size: 155[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/hmset.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/hmset.t[m
[1mdeleted file mode 100644[m
[1mindex 1a76211..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/hmset.t[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hmset key-pairs[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:hmset("animals", "dog", "bark", "cat", "meow")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hmset animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hmget("animals", "dog", "cat")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmget animals: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hmset animals: OK[m
[31m-hmget animals: barkmeow[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: hmset lua tables[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local t = { dog = "bark", cat = "meow", cow = "moo" }[m
[31m-            local res, err = red:hmset("animals", t)[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hmset animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hmget("animals", "dog", "cat", "cow")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmget animals: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hmset animals: OK[m
[31m-hmget animals: barkmeowmoo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: hmset a single scalar[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:hmset("animals", "cat")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hmset animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hmget("animals", "cat")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmget animals: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-table expected, got string[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/mock.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/mock.t[m
[1mdeleted file mode 100644[m
[1mindex d8c578f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/mock.t[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: continue using the obj when read timeout happens[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            red:set_timeout(100) -- 0.1 sec[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local data, err = red:get("foo")[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to get: ", err)[m
[31m-                else[m
[31m-                    ngx.say("get: ", data);[m
[31m-                end[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query eval[m
[31m-"*2\r[m
[31m-\$3\r[m
[31m-get\r[m
[31m-\$3\r[m
[31m-foo\r[m
[31m-"[m
[31m---- tcp_reply eval[m
[31m-"\$5\r\nhello\r\n"[m
[31m---- tcp_reply_delay: 150ms[m
[31m---- response_body[m
[31m-failed to get: timeout[m
[31m-failed to get: closed[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/pipeline.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/pipeline.t[m
[1mdeleted file mode 100644[m
[1mindex e37b9bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/pipeline.t[m
[1m+++ /dev/null[m
[36m@@ -1,329 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                red:init_pipeline()[m
[31m-[m
[31m-                red:set("dog", "an animal")[m
[31m-                red:get("dog")[m
[31m-                red:set("dog", "hello")[m
[31m-                red:get("dog")[m
[31m-[m
[31m-                local results = red:commit_pipeline()[m
[31m-                local cjson = require "cjson"[m
[31m-                ngx.say(cjson.encode(results))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-["OK","an animal","OK","hello"][m
[31m-["OK","an animal","OK","hello"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cancel automatically[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            red:init_pipeline()[m
[31m-[m
[31m-            red:set("dog", "an animal")[m
[31m-            red:get("dog")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                red:init_pipeline()[m
[31m-[m
[31m-                red:set("dog", "an animal")[m
[31m-                red:get("dog")[m
[31m-                red:set("dog", "hello")[m
[31m-                red:get("dog")[m
[31m-[m
[31m-                local results = red:commit_pipeline()[m
[31m-                local cjson = require "cjson"[m
[31m-                ngx.say(cjson.encode(results))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-["OK","an animal","OK","hello"][m
[31m-["OK","an animal","OK","hello"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cancel explicitly[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            red:init_pipeline()[m
[31m-[m
[31m-            red:set("dog", "an animal")[m
[31m-            red:get("dog")[m
[31m-[m
[31m-            red:cancel_pipeline()[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                red:init_pipeline()[m
[31m-[m
[31m-                red:set("dog", "an animal")[m
[31m-                red:get("dog")[m
[31m-                red:set("dog", "hello")[m
[31m-                red:get("dog")[m
[31m-[m
[31m-                local results = red:commit_pipeline()[m
[31m-                local cjson = require "cjson"[m
[31m-                ngx.say(cjson.encode(results))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-["OK","an animal","OK","hello"][m
[31m-["OK","an animal","OK","hello"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: mixed[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:set("dog", "an aniaml")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set result: ", res)[m
[31m-[m
[31m-            local res, err = red:get("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if res == ngx.null then[m
[31m-                ngx.say("dog not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-[m
[31m-            red:init_pipeline()[m
[31m-            red:set("cat", "Marry")[m
[31m-            red:set("horse", "Bob")[m
[31m-            red:get("cat")[m
[31m-            red:get("horse")[m
[31m-            local results, err = red:commit_pipeline()[m
[31m-            if not results then[m
[31m-                ngx.say("failed to commit the pipelined requests: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i, res in ipairs(results) do[m
[31m-                if type(res) == "table" then[m
[31m-                    if res[1] == false then[m
[31m-                        ngx.say("failed to run command ", i, ": ", res[2])[m
[31m-                    else[m
[31m-                        ngx.say("cmd ", i, ": ", res)[m
[31m-                    end[m
[31m-                else[m
[31m-                    -- process the scalar value[m
[31m-                    ngx.say("cmd ", i, ": ", res)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            -- put it into the connection pool of size 100,[m
[31m-            -- with 0 idle timeout[m
[31m-            local ok, err = red:set_keepalive(0, 100)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- or just close the connection right away:[m
[31m-            -- local ok, err = red:close()[m
[31m-            -- if not ok then[m
[31m-            --     ngx.say("failed to close: ", err)[m
[31m-            --     return[m
[31m-            -- end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-set result: OK[m
[31m-dog: an aniaml[m
[31m-cmd 1: OK[m
[31m-cmd 2: OK[m
[31m-cmd 3: Marry[m
[31m-cmd 4: Bob[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: redis return error in pipeline[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:del("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to del dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            red:init_pipeline()[m
[31m-            red:hkeys("dog")[m
[31m-            red:set("dog", "an animal")[m
[31m-            red:hkeys("dog")[m
[31m-            red:get("dog")[m
[31m-            local results, err = red:commit_pipeline()[m
[31m-            if not results then[m
[31m-                ngx.say("failed to commit the pipelined requests: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i, res in ipairs(results) do[m
[31m-                if type(res) == "table" then[m
[31m-                    if res[1] == false then[m
[31m-                        ngx.say("failed to run command ", i, ": ", res[2])[m
[31m-                    else[m
[31m-                        ngx.say("cmd ", i, ": ", res)[m
[31m-                    end[m
[31m-                else[m
[31m-                    -- process the scalar value[m
[31m-                    ngx.say("cmd ", i, ": ", res)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            -- put it into the connection pool of size 100,[m
[31m-            -- with 0 idle timeout[m
[31m-            local ok, err = red:set_keepalive(0, 100)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-cmd 1: [m
[31m-cmd 2: OK[m
[31m-failed to run command 3: WRONGTYPE Operation against a key holding the wrong kind of value[m
[31m-cmd 4: an animal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/pubsub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/pubsub.t[m
[1mdeleted file mode 100644[m
[1mindex 54f4e9b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/pubsub.t[m
[1m+++ /dev/null[m
[36m@@ -1,559 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single channel[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red2:publish("dog", "Hello")[m
[31m-            if not res then[m
[31m-                ngx.say("2: failed to publish: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: publish: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: receive: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-2: publish: 1[m
[31m-1: receive: ["message","dog","Hello"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: single channel (retry read_reply() after timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            red:set_timeout(1)[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:read_reply()[m
[31m-                if not res then[m
[31m-                    ngx.say("1: failed to read reply: ", err)[m
[31m-                    if err ~= "timeout" then[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-            red:set_timeout(1000)[m
[31m-[m
[31m-            res, err = red:unsubscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to unsubscribe: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: unsubscribe: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            res, err = red2:publish("dog", "Hello")[m
[31m-            if not res then[m
[31m-                ngx.say("2: failed to publish: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: publish: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:unsubscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to unsubscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: unsubscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: failed to read reply: timeout[m
[31m-1: failed to read reply: timeout[m
[31m-1: unsubscribe: ["unsubscribe","dog",0][m
[31m-2: publish: 0[m
[31m-1: failed to read reply: not subscribed[m
[31m-1: unsubscribe: ["unsubscribe","dog",0][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multiple channels[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_log_errors off;[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe dog: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:subscribe("cat")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe cat: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red2:publish("dog", "Hello")[m
[31m-            if not res then[m
[31m-                ngx.say("2: failed to publish: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: publish: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:set_timeout(10) -- 10ms[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-            red:set_timeout(1000) -- 1s[m
[31m-[m
[31m-            res, err = red:unsubscribe()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to unscribe: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: unsubscribe: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:set_timeout(10) -- 10ms[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-            red:set_timeout(1000) -- 1s[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^1: subscribe dog: \["subscribe","dog",1\][m
[31m-1: subscribe cat: \["subscribe","cat",2\][m
[31m-2: publish: 1[m
[31m-1: receive: \["message","dog","Hello"\][m
[31m-1: failed to read reply: timeout[m
[31m-1: unsubscribe: \["unsubscribe","(?:cat|dog)",1\][m
[31m-1: receive: \["unsubscribe","(?:dog|cat)",0\][m
[31m-1: failed to read reply: not subscribed$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: call subscribe after read_reply() times out[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            red:set_timeout(1)[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:read_reply()[m
[31m-                if not res then[m
[31m-                    ngx.say("1: failed to read reply: ", err)[m
[31m-                    if err ~= "timeout" then[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-            red:set_timeout(1000)[m
[31m-[m
[31m-            res, err = red:subscribe("cat")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe to cat: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: failed to read reply: timeout[m
[31m-1: failed to read reply: timeout[m
[31m-1: subscribe: ["subscribe","cat",2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: call set_keepalive in subscribed mode (previous read_reply calls timed out)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            red:set_timeout(1)[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:read_reply()[m
[31m-                if not res then[m
[31m-                    ngx.say("1: failed to read reply: ", err)[m
[31m-                    if err ~= "timeout" then[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-            red:set_timeout(1000)[m
[31m-[m
[31m-            res, err = red:set_keepalive()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to set keepalive: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: set keepalive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: failed to read reply: timeout[m
[31m-1: failed to read reply: timeout[m
[31m-1: failed to set keepalive: subscribed state[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: call set_keepalive in subscribed mode[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:set_keepalive()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to set keepalive: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: set keepalive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: failed to set keepalive: subscribed state[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: call set_keepalive in unsubscribed mode[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:unsubscribe()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to unsubscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: unsubscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:set_keepalive()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to set keepalive: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: set keepalive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: unsubscribe: ["unsubscribe","dog",0][m
[31m-1: set keepalive: 1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 90fe403..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,776 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set and get[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:select(1)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to select: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:set("dog", "an animal")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set dog: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, err = red:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res)[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-set dog: OK[m
[31m-dog: an animal[m
[31m-dog: an animal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: flushall[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get nil bulk value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:get("not_found")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if res == ngx.null then[m
[31m-                    ngx.say("not_found not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("get not_found: ", res)[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-not_found not found.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get nil list[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:lrange("nokey", 0, 1)[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if res == ngx.null then[m
[31m-                    ngx.say("nokey not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("get nokey: ", #res, " (", type(res), ")")[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-get nokey: 0 (table)[m
[31m-get nokey: 0 (table)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: incr and decr[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:set("connections", 10)[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set connections: ", res)[m
[31m-[m
[31m-            res, err = red:incr("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("incr connections: ", res)[m
[31m-[m
[31m-            local res, err = red:get("connections")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:incr("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to incr connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("incr connections: ", res)[m
[31m-[m
[31m-            res, err = red:decr("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to decr connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("decr connections: ", res)[m
[31m-[m
[31m-            res, err = red:get("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("connections not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connections: ", res)[m
[31m-[m
[31m-            res, err = red:del("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to del connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("del connections: ", res)[m
[31m-[m
[31m-            res, err = red:incr("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("incr connections: ", res)[m
[31m-[m
[31m-            res, err = red:get("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("connections not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connections: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-set connections: OK[m
[31m-incr connections: 11[m
[31m-incr connections: 12[m
[31m-decr connections: 11[m
[31m-connections: 11[m
[31m-del connections: 1[m
[31m-incr connections: 1[m
[31m-connections: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad incr command format[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:incr("connections", 12)[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set connections: ", res, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("incr connections: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to set connections: false: ERR wrong number of arguments for 'incr' command[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: lpush and lrange[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            local res, err = red:lpush("mylist", "world")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to lpush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("lpush result: ", res)[m
[31m-[m
[31m-            res, err = red:lpush("mylist", "hello")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to lpush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("lpush result: ", res)[m
[31m-[m
[31m-            res, err = red:lrange("mylist", 0, -1)[m
[31m-            if not res then[m
[31m-                ngx.say("failed to lrange: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("lrange result: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-lpush result: 1[m
[31m-lpush result: 2[m
[31m-lrange result: ["hello","world"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: blpop expires its own timeout[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(2500) -- 2.5 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            local res, err = red:blpop("key", 1)[m
[31m-            if err then[m
[31m-                ngx.say("failed to blpop: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if res == ngx.null then[m
[31m-                ngx.say("no element popped.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("blpop result: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-no element popped.[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: blpop expires cosocket timeout[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            red:set_timeout(200) -- 200 ms[m
[31m-[m
[31m-            local res, err = red:blpop("key", 1)[m
[31m-            if err then[m
[31m-                ngx.say("failed to blpop: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("no element popped.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("blpop result: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-failed to blpop: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set keepalive and get reused times[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local times = red:get_reused_times()[m
[31m-            ngx.say("reused times: ", times)[m
[31m-[m
[31m-            local ok, err = red:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            times = red:get_reused_times()[m
[31m-            ngx.say("reused times: ", times)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-reused times: 0[m
[31m-reused times: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: mget[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:flushall()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:set("dog", "an animal")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set dog: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, err = red:mget("dog", "cat", "dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local cjson = require "cjson"[m
[31m-                ngx.say("res: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-set dog: OK[m
[31m-res: ["an animal",null,"an animal"][m
[31m-res: ["an animal",null,"an animal"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: hmget array_to_hash[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:flushall()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:hmset("animals", { dog = "bark", cat = "meow", cow = "moo" })[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmset animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hmget("animals", "dog", "cat", "cow")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmget animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hgetall("animals")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("animals not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local h = red:array_to_hash(res)[m
[31m-[m
[31m-            ngx.say("dog: ", h.dog)[m
[31m-            ngx.say("cat: ", h.cat)[m
[31m-            ngx.say("cow: ", h.cow)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hmset animals: OK[m
[31m-hmget animals: barkmeowmoo[m
[31m-dog: bark[m
[31m-cat: meow[m
[31m-cow: moo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: boolean args[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:set("foo", true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:get("foo")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("foo: ", res, ", type: ", type(res))[m
[31m-[m
[31m-            ok, err = red:set("foo", false)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:get("foo")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("foo: ", res, ", type: ", type(res))[m
[31m-[m
[31m-            ok, err = red:set("foo", nil)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:get("foo")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("foo: ", res, ", type: ", type(res))[m
[31m-[m
[31m-            local ok, err = red:set_keepalive(10, 10)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set_keepalive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-foo: true, type: string[m
[31m-foo: false, type: string[m
[31m-failed to set: ERR wrong number of arguments for 'set' command[m
[31m-foo: false, type: string[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/transaction.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/transaction.t[m
[1mdeleted file mode 100644[m
[1mindex a62f4c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/transaction.t[m
[1m+++ /dev/null[m
[36m@@ -1,142 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local redis_key = "foo"[m
[31m-[m
[31m-            local ok, err = red:multi()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run multi: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("multi ans: ", cjson.encode(ok))[m
[31m-[m
[31m-            local ans, err = red:sort("log", "by", redis_key .. ":*->timestamp")[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to run sort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sort ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            ans, err = red:exec()[m
[31m-[m
[31m-            ngx.say("exec ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            local ok, err = red:set_keepalive(0, 1024)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to put the current redis connection into pool: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-multi ans: "OK"[m
[31m-sort ans: "QUEUED"[m
[31m-exec ans: [{}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: redis cmd reference sample: redis does not halt on errors[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = red:multi()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run multi: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("multi ans: ", cjson.encode(ok))[m
[31m-[m
[31m-            local ans, err = red:set("a", "abc")[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to run sort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            local ans, err = red:lpop("a")[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to run sort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            ans, err = red:exec()[m
[31m-[m
[31m-            ngx.say("exec ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^multi ans: "OK"[m
[31m-set ans: "QUEUED"[m
[31m-set ans: "QUEUED"[m
[31m-exec ans: \["OK",\[false,"(?:ERR|WRONGTYPE) Operation against a key holding the wrong kind of value"\]\][m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/user-cmds.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/user-cmds.t[m
[1mdeleted file mode 100644[m
[1mindex dc7df0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/user-cmds.t[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single channel[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            redis.add_commands("foo", "bar")[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:foo("a")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to foo: ", err)[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:bar()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to bar: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to foo: ERR unknown command 'foo'[m
[31m-failed to bar: ERR unknown command 'bar'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex fd75ccf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            ngx.say(redis._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 14d92de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-redis-0.24/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,462 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex cc9fc36..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/Makefile[m
[1mdeleted file mode 100644[m
[1mindex b5f8719..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/aes.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/aes.lua[m
[1mdeleted file mode 100644[m
[1mindex d20697d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/aes.lua[m
[1m+++ /dev/null[m
[36m@@ -1,238 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m---local asn1 = require "resty.asn1"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_gc = ffi.gc[m
[31m-local ffi_str = ffi.string[m
[31m-local ffi_copy = ffi.copy[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-local type = type[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef struct engine_st ENGINE;[m
[31m-[m
[31m-typedef struct evp_cipher_st EVP_CIPHER;[m
[31m-typedef struct evp_cipher_ctx_st[m
[31m-{[m
[31m-const EVP_CIPHER *cipher;[m
[31m-ENGINE *engine;[m
[31m-int encrypt;[m
[31m-int buf_len;[m
[31m-[m
[31m-unsigned char  oiv[16];[m
[31m-unsigned char  iv[16];[m
[31m-unsigned char buf[32];[m
[31m-int num;[m
[31m-[m
[31m-void *app_data;[m
[31m-int key_len;[m
[31m-unsigned long flags;[m
[31m-void *cipher_data;[m
[31m-int final_used;[m
[31m-int block_mask;[m
[31m-unsigned char final[32];[m
[31m-} EVP_CIPHER_CTX;[m
[31m-[m
[31m-typedef struct env_md_ctx_st EVP_MD_CTX;[m
[31m-typedef struct env_md_st EVP_MD;[m
[31m-[m
[31m-const EVP_MD *EVP_md5(void);[m
[31m-const EVP_MD *EVP_sha(void);[m
[31m-const EVP_MD *EVP_sha1(void);[m
[31m-const EVP_MD *EVP_sha224(void);[m
[31m-const EVP_MD *EVP_sha256(void);[m
[31m-const EVP_MD *EVP_sha384(void);[m
[31m-const EVP_MD *EVP_sha512(void);[m
[31m-[m
[31m-const EVP_CIPHER *EVP_aes_128_ecb(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_cbc(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_cfb1(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_cfb8(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_cfb128(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_ofb(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_ctr(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_ecb(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_cbc(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_cfb1(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_cfb8(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_cfb128(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_ofb(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_ctr(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_ecb(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_cbc(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_cfb1(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_cfb8(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_cfb128(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_ofb(void);[m
[31m-[m
[31m-void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a);[m
[31m-int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);[m
[31m-[m
[31m-int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher,[m
[31m-        ENGINE *impl, unsigned char *key, const unsigned char *iv);[m
[31m-[m
[31m-int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,[m
[31m-        const unsigned char *in, int inl);[m
[31m-[m
[31m-int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);[m
[31m-[m
[31m-int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher,[m
[31m-        ENGINE *impl, unsigned char *key, const unsigned char *iv);[m
[31m-[m
[31m-int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,[m
[31m-        const unsigned char *in, int inl);[m
[31m-[m
[31m-int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);[m
[31m-[m
[31m-int EVP_BytesToKey(const EVP_CIPHER *type,const EVP_MD *md,[m
[31m-        const unsigned char *salt, const unsigned char *data, int datal,[m
[31m-        int count, unsigned char *key,unsigned char *iv);[m
[31m-]][m
[31m-[m
[31m-local ctx_ptr_type = ffi.typeof("EVP_CIPHER_CTX[1]")[m
[31m-[m
[31m-local hash[m
[31m-hash = {[m
[31m-    md5 = C.EVP_md5(),[m
[31m-    sha1 = C.EVP_sha1(),[m
[31m-    sha224 = C.EVP_sha224(),[m
[31m-    sha256 = C.EVP_sha256(),[m
[31m-    sha384 = C.EVP_sha384(),[m
[31m-    sha512 = C.EVP_sha512()[m
[31m-}[m
[31m-_M.hash = hash[m
[31m-[m
[31m-local cipher[m
[31m-cipher = function (size, _cipher)[m
[31m-    local _size = size or 128[m
[31m-    local _cipher = _cipher or "cbc"[m
[31m-    local func = "EVP_aes_" .. _size .. "_" .. _cipher[m
[31m-    if C[func] then[m
[31m-        return { size=_size, cipher=_cipher, method=C[func]()}[m
[31m-    else[m
[31m-        return nil[m
[31m-    end[m
[31m-end[m
[31m-_M.cipher = cipher[m
[31m-[m
[31m-function _M.new(self, key, salt, _cipher, _hash, hash_rounds)[m
[31m-    local encrypt_ctx = ffi_new(ctx_ptr_type)[m
[31m-    local decrypt_ctx = ffi_new(ctx_ptr_type)[m
[31m-    local _cipher = _cipher or cipher()[m
[31m-    local _hash = _hash or hash.md5[m
[31m-    local hash_rounds = hash_rounds or 1[m
[31m-    local _cipherLength = _cipher.size/8[m
[31m-    local gen_key = ffi_new("unsigned char[?]",_cipherLength)[m
[31m-    local gen_iv = ffi_new("unsigned char[?]",_cipherLength)[m
[31m-[m
[31m-    if type(_hash) == "table" then[m
[31m-        if not _hash.iv or #_hash.iv ~= 16 then[m
[31m-          return nil, "bad iv"[m
[31m-        end[m
[31m-[m
[31m-        if _hash.method then[m
[31m-            local tmp_key = _hash.method(key)[m
[31m-[m
[31m-            if #tmp_key ~= _cipherLength then[m
[31m-                return nil, "bad key length"[m
[31m-            end[m
[31m-[m
[31m-            ffi_copy(gen_key, tmp_key, _cipherLength)[m
[31m-[m
[31m-        elseif #key ~= _cipherLength then[m
[31m-            return nil, "bad key length"[m
[31m-[m
[31m-        else[m
[31m-            ffi_copy(gen_key, key, _cipherLength)[m
[31m-        end[m
[31m-[m
[31m-        ffi_copy(gen_iv, _hash.iv, 16)[m
[31m-[m
[31m-    else[m
[31m-        if C.EVP_BytesToKey(_cipher.method, _hash, salt, key, #key,[m
[31m-                            hash_rounds, gen_key, gen_iv)[m
[31m-            ~= _cipherLength[m
[31m-        then[m
[31m-            return nil[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    C.EVP_CIPHER_CTX_init(encrypt_ctx)[m
[31m-    C.EVP_CIPHER_CTX_init(decrypt_ctx)[m
[31m-[m
[31m-    if C.EVP_EncryptInit_ex(encrypt_ctx, _cipher.method, nil,[m
[31m-      gen_key, gen_iv) == 0 or[m
[31m-      C.EVP_DecryptInit_ex(decrypt_ctx, _cipher.method, nil,[m
[31m-      gen_key, gen_iv) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    ffi_gc(encrypt_ctx, C.EVP_CIPHER_CTX_cleanup)[m
[31m-    ffi_gc(decrypt_ctx, C.EVP_CIPHER_CTX_cleanup)[m
[31m-[m
[31m-    return setmetatable({[m
[31m-      _encrypt_ctx = encrypt_ctx,[m
[31m-      _decrypt_ctx = decrypt_ctx[m
[31m-      }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.encrypt(self, s)[m
[31m-    local s_len = #s[m
[31m-    local max_len = s_len + 16[m
[31m-    local buf = ffi_new("unsigned char[?]", max_len)[m
[31m-    local out_len = ffi_new("int[1]")[m
[31m-    local tmp_len = ffi_new("int[1]")[m
[31m-    local ctx = self._encrypt_ctx[m
[31m-[m
[31m-    if C.EVP_EncryptInit_ex(ctx, nil, nil, nil, nil) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if C.EVP_EncryptUpdate(ctx, buf, out_len, s, s_len) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if C.EVP_EncryptFinal_ex(ctx, buf + out_len[0], tmp_len) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return ffi_str(buf, out_len[0] + tmp_len[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.decrypt(self, s)[m
[31m-    local s_len = #s[m
[31m-    local buf = ffi_new("unsigned char[?]", s_len)[m
[31m-    local out_len = ffi_new("int[1]")[m
[31m-    local tmp_len = ffi_new("int[1]")[m
[31m-    local ctx = self._decrypt_ctx[m
[31m-[m
[31m-    if C.EVP_DecryptInit_ex(ctx, nil, nil, nil, nil) == 0 then[m
[31m-      return nil[m
[31m-    end[m
[31m-[m
[31m-    if C.EVP_DecryptUpdate(ctx, buf, out_len, s, s_len) == 0 then[m
[31m-      return nil[m
[31m-    end[m
[31m-[m
[31m-    if C.EVP_DecryptFinal_ex(ctx, buf + out_len[0], tmp_len) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return ffi_str(buf, out_len[0] + tmp_len[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/md5.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/md5.lua[m
[1mdeleted file mode 100644[m
[1mindex 44d9abe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/md5.lua[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef unsigned long MD5_LONG ;[m
[31m-[m
[31m-enum {[m
[31m-    MD5_CBLOCK = 64,[m
[31m-    MD5_LBLOCK = MD5_CBLOCK/4[m
[31m-};[m
[31m-[m
[31m-typedef struct MD5state_st[m
[31m-        {[m
[31m-        MD5_LONG A,B,C,D;[m
[31m-        MD5_LONG Nl,Nh;[m
[31m-        MD5_LONG data[MD5_LBLOCK];[m
[31m-        unsigned int num;[m
[31m-        } MD5_CTX;[m
[31m-[m
[31m-int MD5_Init(MD5_CTX *c);[m
[31m-int MD5_Update(MD5_CTX *c, const void *data, size_t len);[m
[31m-int MD5_Final(unsigned char *md, MD5_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local buf = ffi_new("char[16]")[m
[31m-local ctx_ptr_type = ffi.typeof("MD5_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.MD5_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.MD5_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.MD5_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, 16)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.MD5_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/random.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/random.lua[m
[1mdeleted file mode 100644[m
[1mindex 25bf568..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/random.lua[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int RAND_bytes(unsigned char *buf, int num);[m
[31m-int RAND_pseudo_bytes(unsigned char *buf, int num);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-function _M.bytes(len, strong)[m
[31m-    local buf = ffi_new("char[?]", len)[m
[31m-    if strong then[m
[31m-        if C.RAND_bytes(buf, len) == 0 then[m
[31m-            return nil[m
[31m-        end[m
[31m-    else[m
[31m-        C.RAND_pseudo_bytes(buf,len)[m
[31m-    end[m
[31m-[m
[31m-    return ffi_str(buf, len)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha.lua[m
[1mdeleted file mode 100644[m
[1mindex d8e69c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha.lua[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef unsigned long SHA_LONG;[m
[31m-typedef unsigned long long SHA_LONG64;[m
[31m-[m
[31m-enum {[m
[31m-    SHA_LBLOCK = 16[m
[31m-};[m
[31m-]];[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha1.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha1.lua[m
[1mdeleted file mode 100644[m
[1mindex 9ff27a3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha1.lua[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha = require "resty.sha"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef struct SHAstate_st[m
[31m-        {[m
[31m-        SHA_LONG h0,h1,h2,h3,h4;[m
[31m-        SHA_LONG Nl,Nh;[m
[31m-        SHA_LONG data[SHA_LBLOCK];[m
[31m-        unsigned int num;[m
[31m-        } SHA_CTX;[m
[31m-[m
[31m-int SHA1_Init(SHA_CTX *c);[m
[31m-int SHA1_Update(SHA_CTX *c, const void *data, size_t len);[m
[31m-int SHA1_Final(unsigned char *md, SHA_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 20[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA1_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA1_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA1_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA1_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha224.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha224.lua[m
[1mdeleted file mode 100644[m
[1mindex 91302db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha224.lua[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha256 = require "resty.sha256"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int SHA224_Init(SHA256_CTX *c);[m
[31m-int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);[m
[31m-int SHA224_Final(unsigned char *md, SHA256_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 28[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA256_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA224_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA224_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA224_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA224_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha256.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha256.lua[m
[1mdeleted file mode 100644[m
[1mindex 330c3fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha256.lua[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha = require "resty.sha"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef struct SHA256state_st[m
[31m-        {[m
[31m-        SHA_LONG h[8];[m
[31m-        SHA_LONG Nl,Nh;[m
[31m-        SHA_LONG data[SHA_LBLOCK];[m
[31m-        unsigned int num,md_len;[m
[31m-        } SHA256_CTX;[m
[31m-[m
[31m-int SHA256_Init(SHA256_CTX *c);[m
[31m-int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);[m
[31m-int SHA256_Final(unsigned char *md, SHA256_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 32[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA256_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA256_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA256_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA256_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA256_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha384.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha384.lua[m
[1mdeleted file mode 100644[m
[1mindex 36b80f3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha384.lua[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha512 = require "resty.sha512"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int SHA384_Init(SHA512_CTX *c);[m
[31m-int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);[m
[31m-int SHA384_Final(unsigned char *md, SHA512_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 48[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA512_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA384_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA384_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA384_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA384_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha512.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha512.lua[m
[1mdeleted file mode 100644[m
[1mindex 561df6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/sha512.lua[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha = require "resty.sha"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-enum {[m
[31m-    SHA512_CBLOCK = SHA_LBLOCK*8[m
[31m-};[m
[31m-[m
[31m-typedef struct SHA512state_st[m
[31m-        {[m
[31m-        SHA_LONG64 h[8];[m
[31m-        SHA_LONG64 Nl,Nh;[m
[31m-        union {[m
[31m-                SHA_LONG64      d[SHA_LBLOCK];[m
[31m-                unsigned char   p[SHA512_CBLOCK];[m
[31m-        } u;[m
[31m-        unsigned int num,md_len;[m
[31m-        } SHA512_CTX;[m
[31m-[m
[31m-int SHA512_Init(SHA512_CTX *c);[m
[31m-int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);[m
[31m-int SHA512_Final(unsigned char *md, SHA512_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 64[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA512_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA512_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA512_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA512_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA512_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/string.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/string.lua[m
[1mdeleted file mode 100644[m
[1mindex 09fd652..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/lib/resty/string.lua[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef unsigned char u_char;[m
[31m-[m
[31m-u_char * ngx_hex_dump(u_char *dst, const u_char *src, size_t len);[m
[31m-[m
[31m-intptr_t ngx_atoi(const unsigned char *line, size_t n);[m
[31m-]][m
[31m-[m
[31m-local str_type = ffi.typeof("uint8_t[?]")[m
[31m-[m
[31m-[m
[31m-function _M.to_hex(s)[m
[31m-    local len = #s * 2[m
[31m-    local buf = ffi_new(str_type, len)[m
[31m-    C.ngx_hex_dump(buf, s, #s)[m
[31m-    return ffi_str(buf, len)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.atoi(s)[m
[31m-    return tonumber(C.ngx_atoi(s, #s))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/aes.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/aes.t[m
[1mdeleted file mode 100644[m
[1mindex d64065d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/aes.t[m
[1m+++ /dev/null[m
[36m@@ -1,300 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: AES default hello[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret")[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 CBC MD5: 7b47a4dbb11e2cddb2f3740c9e3a552b[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: AES empty key hello[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("")[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 (empty key) CBC MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 (empty key) CBC MD5: 6cb1a35bf9d66e92c9dec684fc329746[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: AES 8-byte salt[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret","WhatSalt")[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 (salted) CBC MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 (salted) CBC MD5: f72db89f8e19326d8da4928be106705c[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: AES oversized 10-byte salt[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret","Oversized!")[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 (oversized salt) CBC MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret","Oversize")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 (oversized salt) CBC MD5: 90a9c9a96f06c597c8da99c37a6c689f[m
[31m-true[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: AES-256 ECB SHA1 no salt[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret",nil,[m
[31m-              aes.cipher(256,"ecb"),aes.hash.sha1)[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-256 ECB SHA1: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-256 ECB SHA1: 927148b31f0e89696a222489403f540d[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: AES-256 ECB SHA1x5 no salt[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret",nil,[m
[31m-              aes.cipher(256,"ecb"),aes.hash.sha1,5)[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-256 ECB SHA1: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-256 ECB SHA1: d1a9b6e59b8980e783df223889563bee[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: AES-128 CBC custom keygen[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("Xr4ilOzQ4PCOq3aQ0qbuaQ==",nil,[m
[31m-              aes.cipher(128,"cbc"),[m
[31m-              {iv = ngx.decode_base64("Jq5cyFTja2vfyjZoSN6muw=="),[m
[31m-               method = ngx.decode_base64})[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC (custom keygen) MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 CBC (custom keygen) MD5: 7b47a4dbb11e2cddb2f3740c9e3a552b[m
[31m-true[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: AES-128 CBC custom keygen (without method)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new(ngx.decode_base64("Xr4ilOzQ4PCOq3aQ0qbuaQ=="),nil,[m
[31m-              aes.cipher(128,"cbc"),[m
[31m-              {iv = ngx.decode_base64("Jq5cyFTja2vfyjZoSN6muw==")})[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC (custom keygen) MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 CBC (custom keygen) MD5: 7b47a4dbb11e2cddb2f3740c9e3a552b[m
[31m-true[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: AES-128 CBC custom keygen (without method, bad key len)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-[m
[31m-            local aes_default, err = aes:new("hel", nil, aes.cipher(128,"cbc"),[m
[31m-              {iv = ngx.decode_base64("Jq5cyFTja2vfyjZoSN6muw==")})[m
[31m-[m
[31m-            if not aes_default then[m
[31m-                ngx.say("failed to new: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC (custom keygen) MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to new: bad key length[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: AES-128 CBC custom keygen (without method, bad iv)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-[m
[31m-            local aes_default, err = aes:new([m
[31m-                ngx.decode_base64("Xr4ilOzQ4PCOq3aQ0qbuaQ=="),[m
[31m-                nil,[m
[31m-                aes.cipher(128,"cbc"),[m
[31m-                {iv = "hello"}[m
[31m-            )[m
[31m-[m
[31m-            if not aes_default then[m
[31m-                ngx.say("failed to new: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC (custom keygen) MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to new: bad iv[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/atoi.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/atoi.t[m
[1mdeleted file mode 100644[m
[1mindex 0c92041..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/atoi.t[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: atoi[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local str = require "resty.string"[m
[31m-            ngx.say(1 + str.atoi("32"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-33[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/md5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/md5.t[m
[1mdeleted file mode 100644[m
[1mindex e5decfe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/md5.t[m
[1m+++ /dev/null[m
[36m@@ -1,92 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello MD5[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_md5 = require "resty.md5"[m
[31m-            local str = require "resty.string"[m
[31m-            local md5 = resty_md5:new()[m
[31m-            ngx.say(md5:update("hello"))[m
[31m-            local digest = md5:final()[m
[31m-            ngx.say(digest == ngx.md5_bin("hello"))[m
[31m-            ngx.say("md5: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-md5: 5d41402abc4b2a76b9719d911017c592[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: MD5 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_md5 = require "resty.md5"[m
[31m-            local str = require "resty.string"[m
[31m-            local md5 = resty_md5:new()[m
[31m-            ngx.say(md5:update("hel"))[m
[31m-            ngx.say(md5:update("lo"))[m
[31m-            local digest = md5:final()[m
[31m-            ngx.say("md5: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-md5: 5d41402abc4b2a76b9719d911017c592[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: MD5 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_md5 = require "resty.md5"[m
[31m-            local str = require "resty.string"[m
[31m-            local md5 = resty_md5:new()[m
[31m-            ngx.say(md5:update(""))[m
[31m-            local digest = md5:final()[m
[31m-            ngx.say(digest == ngx.md5_bin(""))[m
[31m-            ngx.say("md5: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-md5: d41d8cd98f00b204e9800998ecf8427e[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/random.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/random.t[m
[1mdeleted file mode 100644[m
[1mindex 876edfd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/random.t[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: pseudo random bytes[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local rand = require "resty.random"[m
[31m-            local str = require "resty.string"[m
[31m-            local s = rand.bytes(5)[m
[31m-            ngx.say("res: ", str.to_hex(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^res: [a-f0-9]{10}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: strong random bytes[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local rand = require "resty.random"[m
[31m-            local str = require "resty.string"[m
[31m-            local s = rand.bytes(5, true)[m
[31m-            ngx.say("res: ", str.to_hex(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^res: [a-f0-9]{10}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha1.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha1.t[m
[1mdeleted file mode 100644[m
[1mindex 97e9b37..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha1.t[m
[1m+++ /dev/null[m
[36m@@ -1,93 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-1[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha1 = require "resty.sha1"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha1 = resty_sha1:new()[m
[31m-            ngx.say(sha1:update("hello"))[m
[31m-            local digest = sha1:final()[m
[31m-            ngx.say(digest == ngx.sha1_bin("hello"))[m
[31m-            ngx.say("sha1: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-1 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha1 = require "resty.sha1"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha1 = resty_sha1:new()[m
[31m-            ngx.say(sha1:update("hel"))[m
[31m-            ngx.say(sha1:update("lo"))[m
[31m-            local digest = sha1:final()[m
[31m-            ngx.say("sha1: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-1 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha1 = require "resty.sha1"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha1 = resty_sha1:new()[m
[31m-            ngx.say(sha1:update(""))[m
[31m-            local digest = sha1:final()[m
[31m-            ngx.say(digest == ngx.sha1_bin(""))[m
[31m-            ngx.say("sha1: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha224.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha224.t[m
[1mdeleted file mode 100644[m
[1mindex 7697d63..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha224.t[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-224[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha224 = require "resty.sha224"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha224 = resty_sha224:new()[m
[31m-            ngx.say(sha224:update("hello"))[m
[31m-            local digest = sha224:final()[m
[31m-            ngx.say("sha224: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha224: ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-224 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha224 = require "resty.sha224"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha224 = resty_sha224:new()[m
[31m-            ngx.say(sha224:update("hel"))[m
[31m-            ngx.say(sha224:update("lo"))[m
[31m-            local digest = sha224:final()[m
[31m-            ngx.say("sha224: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha224: ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-224 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha224 = require "resty.sha224"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha224 = resty_sha224:new()[m
[31m-            ngx.say(sha224:update(""))[m
[31m-            local digest = sha224:final()[m
[31m-            ngx.say("sha224: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha224: d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: hello (SHA-1 + SHA-224 + SHA-256 + SHA-512 at the same time)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha224 = require "resty.sha224"[m
[31m-            local resty_sha256 = require "resty.sha256"[m
[31m-            local resty_sha1 = require "resty.sha1"[m
[31m-            local resty_sha512 = require "resty.sha512"[m
[31m-[m
[31m-            local str = require "resty.string"[m
[31m-[m
[31m-            local sha224 = resty_sha224:new()[m
[31m-            local sha256 = resty_sha256:new()[m
[31m-            local sha1 = resty_sha1:new()[m
[31m-            local sha512 = resty_sha512:new()[m
[31m-[m
[31m-            ngx.say(sha224:update("hello"))[m
[31m-            ngx.say(sha256:update("hello"))[m
[31m-            ngx.say(sha1:update("hello"))[m
[31m-            ngx.say(sha512:update("hello"))[m
[31m-[m
[31m-[m
[31m-            local digest = sha224:final()[m
[31m-            ngx.say("sha224: ", str.to_hex(digest))[m
[31m-[m
[31m-            digest = sha256:final()[m
[31m-            ngx.say("sha256: ", str.to_hex(digest))[m
[31m-[m
[31m-            digest = sha1:final()[m
[31m-            ngx.say("sha1: ", str.to_hex(digest))[m
[31m-[m
[31m-            digest = sha512:final()[m
[31m-            ngx.say("sha512: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-true[m
[31m-true[m
[31m-sha224: ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193[m
[31m-sha256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824[m
[31m-sha1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m-sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha256.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha256.t[m
[1mdeleted file mode 100644[m
[1mindex a044a8d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha256.t[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-256[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha256 = require "resty.sha256"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha256 = resty_sha256:new()[m
[31m-            ngx.say(sha256:update("hello"))[m
[31m-            local digest = sha256:final()[m
[31m-            ngx.say("sha256: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-256 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha256 = require "resty.sha256"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha256 = resty_sha256:new()[m
[31m-            ngx.say(sha256:update("hel"))[m
[31m-            ngx.say(sha256:update("lo"))[m
[31m-            local digest = sha256:final()[m
[31m-            ngx.say("sha256: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-256 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha256 = require "resty.sha256"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha256 = resty_sha256:new()[m
[31m-            ngx.say(sha256:update(""))[m
[31m-            local digest = sha256:final()[m
[31m-            ngx.say("sha256: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha384.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha384.lua[m
[1mdeleted file mode 100644[m
[1mindex b40a040..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha384.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-384[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha384 = require "resty.sha384"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha384 = resty_sha384:new()[m
[31m-            ngx.say(sha384:update("hello"))[m
[31m-            local digest = sha384:final()[m
[31m-            ngx.say("sha384: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha384: 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-384 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha384 = require "resty.sha384"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha384 = resty_sha384:new()[m
[31m-            ngx.say(sha384:update("hel"))[m
[31m-            ngx.say(sha384:update("lo"))[m
[31m-            local digest = sha384:final()[m
[31m-            ngx.say("sha384: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha384: 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-384 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha384 = require "resty.sha384"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha384 = resty_sha384:new()[m
[31m-            ngx.say(sha384:update(""))[m
[31m-            local digest = sha384:final()[m
[31m-            ngx.say("sha384: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha384: 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha512.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha512.t[m
[1mdeleted file mode 100644[m
[1mindex 0ce2d15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/sha512.t[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-512[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha512 = require "resty.sha512"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha512 = resty_sha512:new()[m
[31m-            ngx.say(sha512:update("hello"))[m
[31m-            local digest = sha512:final()[m
[31m-            ngx.say("sha512: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-512 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha512 = require "resty.sha512"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha512 = resty_sha512:new()[m
[31m-            ngx.say(sha512:update("hel"))[m
[31m-            ngx.say(sha512:update("lo"))[m
[31m-            local digest = sha512:final()[m
[31m-            ngx.say("sha512: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-512 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha512 = require "resty.sha512"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha512 = resty_sha512:new()[m
[31m-            ngx.say(sha512:update(""))[m
[31m-            local digest = sha512:final()[m
[31m-            ngx.say("sha512: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha512: cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex 12e53da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sha1 version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sha1 = require "resty.sha1"[m
[31m-            ngx.say(sha1._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: md5 version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local md5 = require "resty.md5"[m
[31m-            ngx.say(md5._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: resty.string version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local str = require "resty.string"[m
[31m-            ngx.say(str._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: resty.random version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local rand = require "resty.random"[m
[31m-            ngx.say(rand._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: resty.aes version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            ngx.say(aes._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex c7a4937..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-string-0.09/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,550 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 8023628..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-test.html[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f42cae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty-debug[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/lib/resty/upload.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/lib/resty/upload.lua[m
[1mdeleted file mode 100644[m
[1mindex 5584dda..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/lib/resty/upload.lua[m
[1m+++ /dev/null[m
[36m@@ -1,267 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sub = string.sub[m
[31m-local req_socket = ngx.req.socket[m
[31m-local null = ngx.null[m
[31m-local match = string.match[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-local get_headers = ngx.req.get_headers[m
[31m-local type = type[m
[31m--- local print = print[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.08' }[m
[31m-[m
[31m-[m
[31m-local MAX_LINE_SIZE = 512[m
[31m-[m
[31m-local STATE_BEGIN = 1[m
[31m-local STATE_READING_HEADER = 2[m
[31m-local STATE_READING_BODY = 3[m
[31m-local STATE_EOF = 4[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-local state_handlers[m
[31m-[m
[31m-[m
[31m-local function get_boundary()[m
[31m-    local header = get_headers()["content-type"][m
[31m-    if not header then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if type(header) == "table" then[m
[31m-        header = header[1][m
[31m-    end[m
[31m-[m
[31m-    local m = match(header, ";%s*boundary=\"([^\"]+)\"")[m
[31m-    if m then[m
[31m-        return m[m
[31m-    end[m
[31m-[m
[31m-    return match(header, ";%s*boundary=([^\",;]+)")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.new(self, chunk_size)[m
[31m-    local boundary = get_boundary()[m
[31m-[m
[31m-    -- print("boundary: ", boundary)[m
[31m-[m
[31m-    if not boundary then[m
[31m-        return nil, "no boundary defined in Content-Type"[m
[31m-    end[m
[31m-[m
[31m-    -- print('boundary: "', boundary, '"')[m
[31m-[m
[31m-    local sock, err = req_socket()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local read2boundary, err = sock:receiveuntil("--" .. boundary)[m
[31m-    if not read2boundary then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local read_line, err = sock:receiveuntil("\r\n")[m
[31m-    if not read_line then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({[m
[31m-        sock = sock,[m
[31m-        size = chunk_size or 4096,[m
[31m-        read2boundary = read2boundary,[m
[31m-        read_line = read_line,[m
[31m-        boundary = boundary,[m
[31m-        state = STATE_BEGIN[m
[31m-    }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(timeout)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function discard_line(self)[m
[31m-    local read_line = self.read_line[m
[31m-[m
[31m-    local line, err = self.read_line(MAX_LINE_SIZE)[m
[31m-    if not line then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local dummy, err = self.read_line(1)[m
[31m-    if dummy then[m
[31m-        return nil, "line too long: " .. line .. dummy .. "..."[m
[31m-    end[m
[31m-[m
[31m-    if err then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function discard_rest(self)[m
[31m-    local sock = self.sock[m
[31m-    local size = self.size[m
[31m-[m
[31m-    while true do[m
[31m-        local dummy, err = sock:receive(size)[m
[31m-        if err and err ~= 'closed' then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if not dummy then[m
[31m-            return 1[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function read_body_part(self)[m
[31m-    local read2boundary = self.read2boundary[m
[31m-[m
[31m-    local chunk, err = read2boundary(self.size)[m
[31m-    if err then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    if not chunk then[m
[31m-        local sock = self.sock[m
[31m-[m
[31m-        local data = sock:receive(2)[m
[31m-        if data == "--" then[m
[31m-            local ok, err = discard_rest(self)[m
[31m-            if not ok then[m
[31m-                return nil, nil, err[m
[31m-            end[m
[31m-[m
[31m-            self.state = STATE_EOF[m
[31m-            return "part_end"[m
[31m-        end[m
[31m-[m
[31m-        if data ~= "\r\n" then[m
[31m-            local ok, err = discard_line(self)[m
[31m-            if not ok then[m
[31m-                return nil, nil, err[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        self.state = STATE_READING_HEADER[m
[31m-        return "part_end"[m
[31m-    end[m
[31m-[m
[31m-    return "body", chunk[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function read_header(self)[m
[31m-    local read_line = self.read_line[m
[31m-[m
[31m-    local line, err = read_line(MAX_LINE_SIZE)[m
[31m-    if err then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    local dummy, err = read_line(1)[m
[31m-    if dummy then[m
[31m-        return nil, nil, "line too long: " .. line .. dummy .. "..."[m
[31m-    end[m
[31m-[m
[31m-    if err then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    -- print("read line: ", line)[m
[31m-[m
[31m-    if line == "" then[m
[31m-        -- after the last header[m
[31m-        self.state = STATE_READING_BODY[m
[31m-        return read_body_part(self)[m
[31m-    end[m
[31m-[m
[31m-    local key, value = match(line, "([^: \t]+)%s*:%s*(.+)")[m
[31m-    if not key then[m
[31m-        return 'header', line[m
[31m-    end[m
[31m-[m
[31m-    return 'header', {key, value, line}[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function eof()[m
[31m-    return "eof", nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.read(self)[m
[31m-    local size = self.size[m
[31m-[m
[31m-    local handler = state_handlers[self.state][m
[31m-    if handler then[m
[31m-        return handler(self)[m
[31m-    end[m
[31m-[m
[31m-    return nil, nil, "bad state: " .. self.state[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function read_preamble(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local size = self.size[m
[31m-    local read2boundary = self.read2boundary[m
[31m-[m
[31m-    while true do[m
[31m-        local preamble, err = read2boundary(size)[m
[31m-        if not preamble then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        -- discard the preamble data chunk[m
[31m-        -- print("read preamble: ", preamble)[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = discard_line(self)[m
[31m-    if not ok then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    local read2boundary, err = sock:receiveuntil("\r\n--" .. self.boundary)[m
[31m-    if not read2boundary then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    self.read2boundary = read2boundary[m
[31m-[m
[31m-    self.state = STATE_READING_HEADER[m
[31m-    return read_header(self)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-state_handlers = {[m
[31m-    read_preamble,[m
[31m-    read_header,[m
[31m-    read_body_part,[m
[31m-    eof[m
[31m-}[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex e6e89e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,592 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(5)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: in-part header line too long[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(5)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-} . ("Hello, world" x 64) . qq{\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-failed to read: line too long: Hello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, wo...[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: terminate line too long[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(5)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179} . ("a" x 1024) . qq{--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-failed to read: line too long: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: example from RFC 1521[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(20)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-content-TYPE: multipart/form-data; boundary="simple boundary"[m
[31m---- request eval[m
[31m-qq{POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME conformant readers.[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["body","This is implicitly t"][m
[31m-read: ["body","yped plain ASCII tex"][m
[31m-read: ["body","t.\nIt does NOT end w"][m
[31m-read: ["body","ith a linebreak."][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-type","text\/plain; charset=us-ascii","Content-type: text\/plain; charset=us-ascii"]][m
[31m-read: ["body","This is explicitly t"][m
[31m-read: ["body","yped plain ASCII tex"][m
[31m-read: ["body","t.\nIt DOES end with "][m
[31m-read: ["body","a linebreak.\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: example from RFC 1521, no double quotes for the boundary value in the Content-Type response header[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(20)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=simple boundary[m
[31m---- request eval[m
[31m-qq{POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME conformant readers.[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["body","This is implicitly t"][m
[31m-read: ["body","yped plain ASCII tex"][m
[31m-read: ["body","t.\nIt does NOT end w"][m
[31m-read: ["body","ith a linebreak."][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-type","text\/plain; charset=us-ascii","Content-type: text\/plain; charset=us-ascii"]][m
[31m-read: ["body","This is explicitly t"][m
[31m-read: ["body","yped plain ASCII tex"][m
[31m-read: ["body","t.\nIt DOES end with "][m
[31m-read: ["body","a linebreak.\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: example from RFC 1521, using the default chunk size[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new()[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=simple boundary[m
[31m---- request eval[m
[31m-qq{POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME conformant readers.[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-read: ["body","This is implicitly typed plain ASCII text.\nIt does NOT end with a linebreak."][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-type","text\/plain; charset=us-ascii","Content-type: text\/plain; charset=us-ascii"]][m
[31m-read: ["body","This is explicitly typed plain ASCII text.\nIt DOES end with a linebreak.\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: github issue #2: cannot parse boundary - no space before parameter (w/o quotes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form, err = upload:new(5)[m
[31m-            if not form then[m
[31m-                ngx.say("cannot get form: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data;boundary=---------------------------820127721219505131303151179[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: github issue #2: cannot parse boundary - no space before parameter (with quotes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form, err = upload:new(5)[m
[31m-            if not form then[m
[31m-                ngx.say("cannot get form: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data;boundary="---------------------------820127721219505131303151179"[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multiple Content-Type headers[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(5)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m-[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex bec0061..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            ngx.say(upload._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 49ac2e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upload-0.09/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,537 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 2a9f15a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/upstream/[m
[31m-	$(INSTALL) lib/resty/upstream/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/upstream/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/lib/resty/upstream/healthcheck.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/lib/resty/upstream/healthcheck.lua[m
[1mdeleted file mode 100644[m
[1mindex 2118282..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/lib/resty/upstream/healthcheck.lua[m
[1m+++ /dev/null[m
[36m@@ -1,704 +0,0 @@[m
[31m-local stream_sock = ngx.socket.tcp[m
[31m-local log = ngx.log[m
[31m-local ERR = ngx.ERR[m
[31m-local INFO = ngx.INFO[m
[31m-local WARN = ngx.WARN[m
[31m-local DEBUG = ngx.DEBUG[m
[31m-local str_find = string.find[m
[31m-local sub = string.sub[m
[31m-local re_find = ngx.re.find[m
[31m-local new_timer = ngx.timer.at[m
[31m-local shared = ngx.shared[m
[31m-local debug_mode = ngx.config.debug[m
[31m-local concat = table.concat[m
[31m-local tonumber = tonumber[m
[31m-local tostring = tostring[m
[31m-local ipairs = ipairs[m
[31m-local ceil = math.ceil[m
[31m-local spawn = ngx.thread.spawn[m
[31m-local wait = ngx.thread.wait[m
[31m-local pcall = pcall[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = '0.03'[m
[31m-}[m
[31m-[m
[31m-if not ngx.config[m
[31m-   or not ngx.config.ngx_lua_version[m
[31m-   or ngx.config.ngx_lua_version < 9005[m
[31m-then[m
[31m-    error("ngx_lua 0.9.5+ required")[m
[31m-end[m
[31m-[m
[31m-local ok, upstream = pcall(require, "ngx.upstream")[m
[31m-if not ok then[m
[31m-    error("ngx_upstream_lua module required")[m
[31m-end[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok or type(new_tab) ~= "function" then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local set_peer_down = upstream.set_peer_down[m
[31m-local get_primary_peers = upstream.get_primary_peers[m
[31m-local get_backup_peers = upstream.get_backup_peers[m
[31m-local get_upstreams = upstream.get_upstreams[m
[31m-[m
[31m-local upstream_checker_statuses = {}[m
[31m-[m
[31m-local function info(...)[m
[31m-    log(INFO, "healthcheck: ", ...)[m
[31m-end[m
[31m-[m
[31m-local function warn(...)[m
[31m-    log(WARN, "healthcheck: ", ...)[m
[31m-end[m
[31m-[m
[31m-local function errlog(...)[m
[31m-    log(ERR, "healthcheck: ", ...)[m
[31m-end[m
[31m-[m
[31m-local function debug(...)[m
[31m-    -- print("debug mode: ", debug_mode)[m
[31m-    if debug_mode then[m
[31m-        log(DEBUG, "healthcheck: ", ...)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function gen_peer_key(prefix, u, is_backup, id)[m
[31m-    if is_backup then[m
[31m-        return prefix .. u .. ":b" .. id[m
[31m-    end[m
[31m-    return prefix .. u .. ":p" .. id[m
[31m-end[m
[31m-[m
[31m-local function set_peer_down_globally(ctx, is_backup, id, value)[m
[31m-    local u = ctx.upstream[m
[31m-    local dict = ctx.dict[m
[31m-    local ok, err = set_peer_down(u, is_backup, id, value)[m
[31m-    if not ok then[m
[31m-        errlog("failed to set peer down: ", err)[m
[31m-    end[m
[31m-[m
[31m-    if not ctx.new_version then[m
[31m-        ctx.new_version = true[m
[31m-    end[m
[31m-[m
[31m-    local key = gen_peer_key("d:", u, is_backup, id)[m
[31m-    local ok, err = dict:set(key, value)[m
[31m-    if not ok then[m
[31m-        errlog("failed to set peer down state: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function peer_fail(ctx, is_backup, id, peer)[m
[31m-    debug("peer ", peer.name, " was checked to be not ok")[m
[31m-[m
[31m-    local u = ctx.upstream[m
[31m-    local dict = ctx.dict[m
[31m-[m
[31m-    local key = gen_peer_key("nok:", u, is_backup, id)[m
[31m-    local fails, err = dict:get(key)[m
[31m-    if not fails then[m
[31m-        if err then[m
[31m-            errlog("failed to get peer nok key: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        fails = 1[m
[31m-[m
[31m-        -- below may have a race condition, but it is fine for our[m
[31m-        -- purpose here.[m
[31m-        local ok, err = dict:set(key, 1)[m
[31m-        if not ok then[m
[31m-            errlog("failed to set peer nok key: ", err)[m
[31m-        end[m
[31m-    else[m
[31m-        fails = fails + 1[m
[31m-        local ok, err = dict:incr(key, 1)[m
[31m-        if not ok then[m
[31m-            errlog("failed to incr peer nok key: ", err)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if fails == 1 then[m
[31m-        key = gen_peer_key("ok:", u, is_backup, id)[m
[31m-        local succ, err = dict:get(key)[m
[31m-        if not succ or succ == 0 then[m
[31m-            if err then[m
[31m-                errlog("failed to get peer ok key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        else[m
[31m-            local ok, err = dict:set(key, 0)[m
[31m-            if not ok then[m
[31m-                errlog("failed to set peer ok key: ", err)[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- print("ctx fall: ", ctx.fall, ", peer down: ", peer.down,[m
[31m-          -- ", fails: ", fails)[m
[31m-[m
[31m-    if not peer.down and fails >= ctx.fall then[m
[31m-        warn("peer ", peer.name, " is turned down after ", fails,[m
[31m-                " failure(s)")[m
[31m-        peer.down = true[m
[31m-        set_peer_down_globally(ctx, is_backup, id, true)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function peer_ok(ctx, is_backup, id, peer)[m
[31m-    debug("peer ", peer.name, " was checked to be ok")[m
[31m-[m
[31m-    local u = ctx.upstream[m
[31m-    local dict = ctx.dict[m
[31m-[m
[31m-    local key = gen_peer_key("ok:", u, is_backup, id)[m
[31m-    local succ, err = dict:get(key)[m
[31m-    if not succ then[m
[31m-        if err then[m
[31m-            errlog("failed to get peer ok key: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        succ = 1[m
[31m-[m
[31m-        -- below may have a race condition, but it is fine for our[m
[31m-        -- purpose here.[m
[31m-        local ok, err = dict:set(key, 1)[m
[31m-        if not ok then[m
[31m-            errlog("failed to set peer ok key: ", err)[m
[31m-        end[m
[31m-    else[m
[31m-        succ = succ + 1[m
[31m-        local ok, err = dict:incr(key, 1)[m
[31m-        if not ok then[m
[31m-            errlog("failed to incr peer ok key: ", err)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if succ == 1 then[m
[31m-        key = gen_peer_key("nok:", u, is_backup, id)[m
[31m-        local fails, err = dict:get(key)[m
[31m-        if not fails or fails == 0 then[m
[31m-            if err then[m
[31m-                errlog("failed to get peer nok key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        else[m
[31m-            local ok, err = dict:set(key, 0)[m
[31m-            if not ok then[m
[31m-                errlog("failed to set peer nok key: ", err)[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if peer.down and succ >= ctx.rise then[m
[31m-        warn("peer ", peer.name, " is turned up after ", succ,[m
[31m-                " success(es)")[m
[31m-        peer.down = nil[m
[31m-        set_peer_down_globally(ctx, is_backup, id, nil)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- shortcut error function for check_peer()[m
[31m-local function peer_error(ctx, is_backup, id, peer, ...)[m
[31m-  if not peer.down then[m
[31m-      errlog(...)[m
[31m-  end[m
[31m-  peer_fail(ctx, is_backup, id, peer)[m
[31m-end[m
[31m-[m
[31m-local function check_peer(ctx, id, peer, is_backup)[m
[31m-    local ok, err[m
[31m-    local name = peer.name[m
[31m-    local statuses = ctx.statuses[m
[31m-    local req = ctx.http_req[m
[31m-[m
[31m-    local sock, err = stream_sock()[m
[31m-    if not sock then[m
[31m-        errlog("failed to create stream socket: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    sock:settimeout(ctx.timeout)[m
[31m-[m
[31m-    if peer.host then[m
[31m-        -- print("peer port: ", peer.port)[m
[31m-        ok, err = sock:connect(peer.host, peer.port)[m
[31m-    else[m
[31m-        ok, err = sock:connect(name)[m
[31m-    end[m
[31m-    if not ok then[m
[31m-        if not peer.down then[m
[31m-            errlog("failed to connect to ", name, ": ", err)[m
[31m-        end[m
[31m-        return peer_fail(ctx, is_backup, id, peer)[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return peer_error(ctx, is_backup, id, peer,[m
[31m-                          "failed to send request to ", name, ": ", err)[m
[31m-    end[m
[31m-[m
[31m-    local status_line, err = sock:receive()[m
[31m-    if not status_line then[m
[31m-        peer_error(ctx, is_backup, id, peer,[m
[31m-                   "failed to receive status line from ", name, ": ", err)[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()  -- timeout errors do not close the socket.[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if statuses then[m
[31m-        local from, to, err = re_find(status_line,[m
[31m-                                      [[^HTTP/\d+\.\d+\s+(\d+)]],[m
[31m-                                      "joi", nil, 1)[m
[31m-        if not from then[m
[31m-            peer_error(ctx, is_backup, id, peer,[m
[31m-                       "bad status line from ", name, ": ",[m
[31m-                       status_line)[m
[31m-            sock:close()[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        local status = tonumber(sub(status_line, from, to))[m
[31m-        if not statuses[status] then[m
[31m-            peer_error(ctx, is_backup, id, peer, "bad status code from ",[m
[31m-                       name, ": ", status)[m
[31m-            sock:close()[m
[31m-            return[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    peer_ok(ctx, is_backup, id, peer)[m
[31m-    sock:close()[m
[31m-end[m
[31m-[m
[31m-local function check_peer_range(ctx, from, to, peers, is_backup)[m
[31m-    for i = from, to do[m
[31m-        check_peer(ctx, i - 1, peers[i], is_backup)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function check_peers(ctx, peers, is_backup)[m
[31m-    local n = #peers[m
[31m-    if n == 0 then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local concur = ctx.concurrency[m
[31m-    if concur <= 1 then[m
[31m-        for i = 1, n do[m
[31m-            check_peer(ctx, i - 1, peers[i], is_backup)[m
[31m-        end[m
[31m-    else[m
[31m-        local threads[m
[31m-        local nthr[m
[31m-[m
[31m-        if n <= concur then[m
[31m-            nthr = n - 1[m
[31m-            threads = new_tab(nthr, 0)[m
[31m-            for i = 1, nthr do[m
[31m-[m
[31m-                if debug_mode then[m
[31m-                    debug("spawn a thread checking ",[m
[31m-                          is_backup and "backup" or "primary", " peer ", i - 1)[m
[31m-                end[m
[31m-[m
[31m-                threads[i] = spawn(check_peer, ctx, i - 1, peers[i], is_backup)[m
[31m-            end[m
[31m-            -- use the current "light thread" to run the last task[m
[31m-            if debug_mode then[m
[31m-                debug("check ", is_backup and "backup" or "primary", " peer ",[m
[31m-                      n - 1)[m
[31m-            end[m
[31m-            check_peer(ctx, n - 1, peers[n], is_backup)[m
[31m-[m
[31m-        else[m
[31m-            local group_size = ceil(n / concur)[m
[31m-            local nthr = ceil(n / group_size) - 1[m
[31m-[m
[31m-            threads = new_tab(nthr, 0)[m
[31m-            local from = 1[m
[31m-            local rest = n[m
[31m-            for i = 1, nthr do[m
[31m-                local to[m
[31m-                if rest >= group_size then[m
[31m-                    rest = rest - group_size[m
[31m-                    to = from + group_size - 1[m
[31m-                else[m
[31m-                    rest = 0[m
[31m-                    to = from + rest - 1[m
[31m-                end[m
[31m-[m
[31m-                if debug_mode then[m
[31m-                    debug("spawn a thread checking ",[m
[31m-                          is_backup and "backup" or "primary", " peers ",[m
[31m-                          from - 1, " to ", to - 1)[m
[31m-                end[m
[31m-[m
[31m-                threads[i] = spawn(check_peer_range, ctx, from, to, peers,[m
[31m-                                   is_backup)[m
[31m-                from = from + group_size[m
[31m-                if rest == 0 then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            if rest > 0 then[m
[31m-                local to = from + rest - 1[m
[31m-[m
[31m-                if debug_mode then[m
[31m-                    debug("check ", is_backup and "backup" or "primary",[m
[31m-                          " peers ", from - 1, " to ", to - 1)[m
[31m-                end[m
[31m-[m
[31m-                check_peer_range(ctx, from, to, peers, is_backup)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if nthr and nthr > 0 then[m
[31m-            for i = 1, nthr do[m
[31m-                local t = threads[i][m
[31m-                if t then[m
[31m-                    wait(t)[m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function upgrade_peers_version(ctx, peers, is_backup)[m
[31m-    local dict = ctx.dict[m
[31m-    local u = ctx.upstream[m
[31m-    local n = #peers[m
[31m-    for i = 1, n do[m
[31m-        local peer = peers[i][m
[31m-        local id = i - 1[m
[31m-        local key = gen_peer_key("d:", u, is_backup, id)[m
[31m-        local down = false[m
[31m-        local res, err = dict:get(key)[m
[31m-        if not res then[m
[31m-            if err then[m
[31m-                errlog("failed to get peer down state: ", err)[m
[31m-            end[m
[31m-        else[m
[31m-            down = true[m
[31m-        end[m
[31m-        if (peer.down and not down) or (not peer.down and down) then[m
[31m-            local ok, err = set_peer_down(u, is_backup, id, down)[m
[31m-            if not ok then[m
[31m-                errlog("failed to set peer down: ", err)[m
[31m-            else[m
[31m-                -- update our cache too[m
[31m-                peer.down = down[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function check_peers_updates(ctx)[m
[31m-    local dict = ctx.dict[m
[31m-    local u = ctx.upstream[m
[31m-    local key = "v:" .. u[m
[31m-    local ver, err = dict:get(key)[m
[31m-    if not ver then[m
[31m-        if err then[m
[31m-            errlog("failed to get peers version: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        if ctx.version > 0 then[m
[31m-            ctx.new_version = true[m
[31m-        end[m
[31m-[m
[31m-    elseif ctx.version < ver then[m
[31m-        debug("upgrading peers version to ", ver)[m
[31m-        upgrade_peers_version(ctx, ctx.primary_peers, false);[m
[31m-        upgrade_peers_version(ctx, ctx.backup_peers, true);[m
[31m-        ctx.version = ver[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function get_lock(ctx)[m
[31m-    local dict = ctx.dict[m
[31m-    local key = "l:" .. ctx.upstream[m
[31m-[m
[31m-    -- the lock is held for the whole interval to prevent multiple[m
[31m-    -- worker processes from sending the test request simultaneously.[m
[31m-    -- here we substract the lock expiration time by 1ms to prevent[m
[31m-    -- a race condition with the next timer event.[m
[31m-    local ok, err = dict:add(key, true, ctx.interval - 0.001)[m
[31m-    if not ok then[m
[31m-        if err == "exists" then[m
[31m-            return nil[m
[31m-        end[m
[31m-        errlog("failed to add key \"", key, "\": ", err)[m
[31m-        return nil[m
[31m-    end[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local function do_check(ctx)[m
[31m-    debug("healthcheck: run a check cycle")[m
[31m-[m
[31m-    check_peers_updates(ctx)[m
[31m-[m
[31m-    if get_lock(ctx) then[m
[31m-        check_peers(ctx, ctx.primary_peers, false)[m
[31m-        check_peers(ctx, ctx.backup_peers, true)[m
[31m-    end[m
[31m-[m
[31m-    if ctx.new_version then[m
[31m-        local key = "v:" .. ctx.upstream[m
[31m-        local dict = ctx.dict[m
[31m-[m
[31m-        if debug_mode then[m
[31m-            debug("publishing peers version ", ctx.version + 1)[m
[31m-        end[m
[31m-[m
[31m-        dict:add(key, 0)[m
[31m-        local new_ver, err = dict:incr(key, 1)[m
[31m-        if not new_ver then[m
[31m-            errlog("failed to publish new peers version: ", err)[m
[31m-        end[m
[31m-[m
[31m-        ctx.version = new_ver[m
[31m-        ctx.new_version = nil[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function update_upstream_checker_status(upstream, success)[m
[31m-    local cnt = upstream_checker_statuses[upstream][m
[31m-    if not cnt then[m
[31m-        cnt = 0[m
[31m-    end[m
[31m-[m
[31m-    if success then[m
[31m-        cnt = cnt + 1[m
[31m-    else[m
[31m-        cnt = cnt - 1[m
[31m-    end[m
[31m-[m
[31m-    upstream_checker_statuses[upstream] = cnt[m
[31m-end[m
[31m-[m
[31m-local check[m
[31m-check = function (premature, ctx)[m
[31m-    if premature then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = pcall(do_check, ctx)[m
[31m-    if not ok then[m
[31m-        errlog("failed to run healthcheck cycle: ", err)[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = new_timer(ctx.interval, check, ctx)[m
[31m-    if not ok then[m
[31m-        if err ~= "process exiting" then[m
[31m-            errlog("failed to create timer: ", err)[m
[31m-        end[m
[31m-[m
[31m-        update_upstream_checker_status(ctx.upstream, false)[m
[31m-        return[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function preprocess_peers(peers)[m
[31m-    local n = #peers[m
[31m-    for i = 1, n do[m
[31m-        local p = peers[i][m
[31m-        local name = p.name[m
[31m-[m
[31m-        if name then[m
[31m-            local from, to, err = re_find(name, [[^(.*):\d+$]], "jo", nil, 1)[m
[31m-            if from then[m
[31m-                p.host = sub(name, 1, to)[m
[31m-                p.port = tonumber(sub(name, to + 2))[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-    return peers[m
[31m-end[m
[31m-[m
[31m-function _M.spawn_checker(opts)[m
[31m-    local typ = opts.type[m
[31m-    if not typ then[m
[31m-        return nil, "\"type\" option required"[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= "http" then[m
[31m-        return nil, "only \"http\" type is supported right now"[m
[31m-    end[m
[31m-[m
[31m-    local http_req = opts.http_req[m
[31m-    if not http_req then[m
[31m-        return nil, "\"http_req\" option required"[m
[31m-    end[m
[31m-[m
[31m-    local timeout = opts.timeout[m
[31m-    if not timeout then[m
[31m-        timeout = 1000[m
[31m-    end[m
[31m-[m
[31m-    local interval = opts.interval[m
[31m-    if not interval then[m
[31m-        interval = 1[m
[31m-[m
[31m-    else[m
[31m-        interval = interval / 1000[m
[31m-        if interval < 0.002 then  -- minimum 2ms[m
[31m-            interval = 0.002[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local valid_statuses = opts.valid_statuses[m
[31m-    local statuses[m
[31m-    if valid_statuses then[m
[31m-        statuses = new_tab(0, #valid_statuses)[m
[31m-        for _, status in ipairs(valid_statuses) do[m
[31m-            -- print("found good status ", status)[m
[31m-            statuses[status] = true[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- debug("interval: ", interval)[m
[31m-[m
[31m-    local concur = opts.concurrency[m
[31m-    if not concur then[m
[31m-        concur = 1[m
[31m-    end[m
[31m-[m
[31m-    local fall = opts.fall[m
[31m-    if not fall then[m
[31m-        fall = 5[m
[31m-    end[m
[31m-[m
[31m-    local rise = opts.rise[m
[31m-    if not rise then[m
[31m-        rise = 2[m
[31m-    end[m
[31m-[m
[31m-    local shm = opts.shm[m
[31m-    if not shm then[m
[31m-        return nil, "\"shm\" option required"[m
[31m-    end[m
[31m-[m
[31m-    local dict = shared[shm][m
[31m-    if not dict then[m
[31m-        return nil, "shm \"" .. tostring(shm) .. "\" not found"[m
[31m-    end[m
[31m-[m
[31m-    local u = opts.upstream[m
[31m-    if not u then[m
[31m-        return nil, "no upstream specified"[m
[31m-    end[m
[31m-[m
[31m-    local ppeers, err = get_primary_peers(u)[m
[31m-    if not ppeers then[m
[31m-        return nil, "failed to get primary peers: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local bpeers, err = get_backup_peers(u)[m
[31m-    if not bpeers then[m
[31m-        return nil, "failed to get backup peers: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local ctx = {[m
[31m-        upstream = u,[m
[31m-        primary_peers = preprocess_peers(ppeers),[m
[31m-        backup_peers = preprocess_peers(bpeers),[m
[31m-        http_req = http_req,[m
[31m-        timeout = timeout,[m
[31m-        interval = interval,[m
[31m-        dict = dict,[m
[31m-        fall = fall,[m
[31m-        rise = rise,[m
[31m-        statuses = statuses,[m
[31m-        version = 0,[m
[31m-        concurrency = concur,[m
[31m-    }[m
[31m-[m
[31m-    local ok, err = new_timer(0, check, ctx)[m
[31m-    if not ok then[m
[31m-        return nil, "failed to create timer: " .. err[m
[31m-    end[m
[31m-[m
[31m-    update_upstream_checker_status(u, true)[m
[31m-[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local function gen_peers_status_info(peers, bits, idx)[m
[31m-    local npeers = #peers[m
[31m-    for i = 1, npeers do[m
[31m-        local peer = peers[i][m
[31m-        bits[idx] = "        "[m
[31m-        bits[idx + 1] = peer.name[m
[31m-        if peer.down then[m
[31m-            bits[idx + 2] = " DOWN\n"[m
[31m-        else[m
[31m-            bits[idx + 2] = " up\n"[m
[31m-        end[m
[31m-        idx = idx + 3[m
[31m-    end[m
[31m-    return idx[m
[31m-end[m
[31m-[m
[31m-function _M.status_page()[m
[31m-    -- generate an HTML page[m
[31m-    local us, err = get_upstreams()[m
[31m-    if not us then[m
[31m-        return "failed to get upstream names: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local n = #us[m
[31m-    local bits = new_tab(n * 20, 0)[m
[31m-    local idx = 1[m
[31m-    for i = 1, n do[m
[31m-        if i > 1 then[m
[31m-            bits[idx] = "\n"[m
[31m-            idx = idx + 1[m
[31m-        end[m
[31m-[m
[31m-        local u = us[i][m
[31m-[m
[31m-        bits[idx] = "Upstream "[m
[31m-        bits[idx + 1] = u[m
[31m-        idx = idx + 2[m
[31m-[m
[31m-        local ncheckers = upstream_checker_statuses[u][m
[31m-        if not ncheckers or ncheckers == 0 then[m
[31m-            bits[idx] = " (NO checkers)"[m
[31m-            idx = idx + 1[m
[31m-        end[m
[31m-[m
[31m-        bits[idx] = "\n    Primary Peers\n"[m
[31m-        idx = idx + 1[m
[31m-[m
[31m-        local peers, err = get_primary_peers(u)[m
[31m-        if not peers then[m
[31m-            return "failed to get primary peers in upstream " .. u .. ": "[m
[31m-                   .. err[m
[31m-        end[m
[31m-[m
[31m-        idx = gen_peers_status_info(peers, bits, idx)[m
[31m-[m
[31m-        bits[idx] = "    Backup Peers\n"[m
[31m-        idx = idx + 1[m
[31m-[m
[31m-        peers, err = get_backup_peers(u)[m
[31m-        if not peers then[m
[31m-            return "failed to get backup peers in upstream " .. u .. ": "[m
[31m-                   .. err[m
[31m-        end[m
[31m-[m
[31m-        idx = gen_peers_status_info(peers, bits, idx)[m
[31m-    end[m
[31m-    return concat(bits)[m
[31m-end[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 792c359..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,1373 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6 + 9);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_socket_log_errors off;[m
[31m-    lua_package_path "$pwd/../lua-resty-lock/?.lua;$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: health check (good case), status ignored by default[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[warn][m
[31m-was checked to be not ok[m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|publishing peers version \d+|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){3,5}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: health check (bad case), no listening port in the backup peer[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 DOWN[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: failed to connect to 127.0.0.1:12356: connection refused[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|publishing peers version \d+|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12356 is turned down after 2 failure\(s\)[m
[31m-publishing peers version 1[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be not ok[m
[31m-){2,4}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: health check (bad case), no listening port in a primary peer[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 DOWN[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: failed to connect to 127.0.0.1:12355: connection refused[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned down after 2 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){2,4}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: health check (bad case), bad status[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-        valid_statuses = {200, 503},[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 DOWN[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|healthcheck: bad status code from .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: bad status code from 127\.0\.0\.1:12355: 404[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: bad status code from 127\.0\.0\.1:12355: 404[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned down after 2 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){1,4}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: health check (bad case), timed out[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        echo_sleep 0.5;[m
[31m-        echo ok;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        timeout = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 DOWN[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: failed to receive status line from 127.0.0.1:12354: timeout[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|healthcheck: bad status code from .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12354 is turned down after 2 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){0,2}$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: health check (bad case), bad status, and then rise again[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        content_by_lua '[m
[31m-            local cnt = package.loaded.cnt[m
[31m-            if not cnt then[m
[31m-                cnt = 0[m
[31m-            end[m
[31m-            cnt = cnt + 1[m
[31m-            package.loaded.cnt = cnt[m
[31m-            if cnt >= 3 then[m
[31m-                return ngx.exit(200)[m
[31m-            end[m
[31m-            return ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 1,[m
[31m-        rise = 2,[m
[31m-        valid_statuses = {200, 503},[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|healthcheck: bad status code from .*(?=,)|publishing peers version \d+|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: bad status code from 127\.0\.0\.1:12355: 403[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned down after 1 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-publishing peers version 1[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned up after 2 success\(es\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-publishing peers version 2[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){1,3}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: peers version upgrade (make up peers down)[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    local dict = ngx.shared.healthcheck[m
[31m-    dict:flush_all()[m
[31m-    assert(dict:set("v:foo.com", 1))[m
[31m-    assert(dict:set("d:foo.com:b0", true))[m
[31m-    assert(dict:set("d:foo.com:p1", true))[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-was checked to be not ok[m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|publishing peers version \d+|warn\(\): .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^upgrading peers version to 1[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned up after 2 success\(es\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12356 is turned up after 2 success\(es\)[m
[31m-publishing peers version 2[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){2,4}$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: peers version upgrade (make down peers up)[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354 down;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    local dict = ngx.shared.healthcheck[m
[31m-    dict:flush_all()[m
[31m-    assert(dict:set("v:foo.com", 1))[m
[31m-    -- assert(dict:set("d:foo.com:b0", true))[m
[31m-    -- assert(dict:set("d:foo.com:p1", true))[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 DOWN[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- error_log[m
[31m-failed to connect to 127.0.0.1:12354: connection refused[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|publishing peers version \d+|warn\(\): .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^upgrading peers version to 1[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12354 is turned down after 2 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-publishing peers version 2[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){3,5}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: concurrency == 2 (odd number of peers)[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356;[m
[31m-    server 127.0.0.1:12357;[m
[31m-    server 127.0.0.1:12358;[m
[31m-    server 127.0.0.1:12359 backup;[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-        concurrency = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: peer 127.0.0.1:12354 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12355 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12356 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12357 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12358 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12359 is turned down after 2 failure(s)[m
[31m---- grep_error_log eval: qr/spawn a thread checking .* peer.*|check .*? peer.*/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^(?:spawn a thread checking primary peers 0 to 2[m
[31m-check primary peers 3 to 4[m
[31m-check backup peer 0[m
[31m-){4,6}$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: concurrency == 3 (odd number of peers)[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356;[m
[31m-    server 127.0.0.1:12359 backup;[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-        concurrency = 3,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: peer 127.0.0.1:12354 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12355 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12356 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12359 is turned down after 2 failure(s)[m
[31m---- grep_error_log eval: qr/spawn a thread checking .* peer.*|check .*? peer.*/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^(?:spawn a thread checking primary peer 0[m
[31m-spawn a thread checking primary peer 1[m
[31m-check primary peer 2[m
[31m-check backup peer 0[m
[31m-){4,6}$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: health check (good case), status ignored by default[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:7983;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 1,[m
[31m-        valid_statuses = {200},[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.12)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- tcp_listen: 7983[m
[31m---- tcp_query eval: "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n"[m
[31m---- tcp_reply[m
[31m-<html>[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:7983 DOWN[m
[31m-    Backup Peers[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-bad argument #2 to 'sub' (number expected, got nil)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: health check (bad case), bad status, multiple upstreams[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-upstream bar.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12357;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    listen 12357;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 2m;[m
[31m-init_worker_by_lua_block {[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    for i, upstream in ipairs{'foo.com', 'bar.com'} do[m
[31m-        local ok, err = hc.spawn_checker{[m
[31m-            shm = "healthcheck",[m
[31m-            upstream = upstream,[m
[31m-            type = "http",[m
[31m-            http_req = "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n",[m
[31m-            interval = 50,  -- ms[m
[31m-            fall = 1,[m
[31m-            valid_statuses = {200, 503},[m
[31m-        }[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    end[m
[31m-}[m
[31m-[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 DOWN[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-[m
[31m-Upstream bar.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 DOWN[m
[31m-        127.0.0.1:12357 DOWN[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: bad status code from 127.0.0.1:12355[m
[31m-healthcheck: bad status code from 127.0.0.1:12357[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: crashes in init_by_lua_worker*[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua_block {[m
[31m-    error("bad thing!")[m
[31m-}[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com (NO checkers)[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-bad thing![m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: health check with ipv6 backend (good case), status ignored by default[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server [::1]:12355;[m
[31m-    server [0:0::1]:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen [::1]:12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen [0:0::1]:12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua_block {[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-}[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua_block {[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua_block {[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        [::1]:12355 up[m
[31m-    Backup Peers[m
[31m-        [0:0::1]:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: [::1]:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[warn][m
[31m-was checked to be not ok[m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|publishing peers version \d+|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer \[::1\]:12355 was checked to be ok[m
[31m-healthcheck: peer \[0:0::1\]:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer \[::1\]:12355 was checked to be ok[m
[31m-healthcheck: peer \[0:0::1\]:12356 was checked to be ok[m
[31m-){3,7}$/[m
[31m---- timeout: 6[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex c276f4c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-upstream-healthcheck-0.04/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,91 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Param[m
[31m-    epoll_ctl(event)[m
[31m-    fun:epoll_ctl[m
[31m-    fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Param[m
[31m-    epoll_ctl(event)[m
[31m-    fun:epoll_ctl[m
[31m-    fun:ngx_epoll_add_connection[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Addr4[m
[31m-    fun:ngx_init_cycle[m
[31m-    fun:ngx_master_process_cycle[m
[31m-    fun:main[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Cond[m
[31m-    fun:ngx_init_cycle[m
[31m-    fun:ngx_master_process_cycle[m
[31m-    fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_notify_init[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 19dfbba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-*.t_[m
[31m-tags[m
[31m-a.patch[m
[31m-*.html[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/Makefile[m
[1mdeleted file mode 100644[m
[1mindex c0b7bc7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/websocket[m
[31m-	$(INSTALL) lib/resty/websocket/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/websocket/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/client.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/client.lua[m
[1mdeleted file mode 100644[m
[1mindex 41e41bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/client.lua[m
[1m+++ /dev/null[m
[36m@@ -1,336 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m--- FIXME: this library is very rough and is currently just for testing[m
[31m---        the websocket server.[m
[31m-[m
[31m-[m
[31m-local wbproto = require "resty.websocket.protocol"[m
[31m-local bit = require "bit"[m
[31m-[m
[31m-[m
[31m-local _recv_frame = wbproto.recv_frame[m
[31m-local _send_frame = wbproto.send_frame[m
[31m-local new_tab = wbproto.new_tab[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local re_match = ngx.re.match[m
[31m-local encode_base64 = ngx.encode_base64[m
[31m-local concat = table.concat[m
[31m-local char = string.char[m
[31m-local str_find = string.find[m
[31m-local rand = math.random[m
[31m-local rshift = bit.rshift[m
[31m-local band = bit.band[m
[31m-local setmetatable = setmetatable[m
[31m-local type = type[m
[31m-local debug = ngx.config.debug[m
[31m-local ngx_log = ngx.log[m
[31m-local ngx_DEBUG = ngx.DEBUG[m
[31m-local ssl_support = true[m
[31m-[m
[31m-if not ngx.config[m
[31m-    or not ngx.config.ngx_lua_version[m
[31m-    or ngx.config.ngx_lua_version < 9011[m
[31m-then[m
[31m-    ssl_support = false[m
[31m-end[m
[31m-[m
[31m-local _M = new_tab(0, 13)[m
[31m-_M._VERSION = '0.05'[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(self, opts)[m
[31m-    local sock, err = tcp()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local max_payload_len, send_unmasked, timeout[m
[31m-    if opts then[m
[31m-        max_payload_len = opts.max_payload_len[m
[31m-        send_unmasked = opts.send_unmasked[m
[31m-        timeout = opts.timeout[m
[31m-[m
[31m-        if timeout then[m
[31m-            sock:settimeout(timeout)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({[m
[31m-        sock = sock,[m
[31m-        max_payload_len = max_payload_len or 65535,[m
[31m-        send_unmasked = send_unmasked,[m
[31m-    }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.connect(self, uri, opts)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local m, err = re_match(uri, [[^(wss?)://([^:/]+)(?::(\d+))?(.*)]], "jo")[m
[31m-    if not m then[m
[31m-        if err then[m
[31m-            return nil, "failed to match the uri: " .. err[m
[31m-        end[m
[31m-[m
[31m-        return nil, "bad websocket uri"[m
[31m-    end[m
[31m-[m
[31m-    local scheme = m[1][m
[31m-    local host = m[2][m
[31m-    local port = m[3][m
[31m-    local path = m[4][m
[31m-[m
[31m-    -- ngx.say("host: ", host)[m
[31m-    -- ngx.say("port: ", port)[m
[31m-[m
[31m-    if not port then[m
[31m-        port = 80[m
[31m-    end[m
[31m-[m
[31m-    if path == "" then[m
[31m-        path = "/"[m
[31m-    end[m
[31m-[m
[31m-    local ssl_verify, proto_header, origin_header, sock_opts = false[m
[31m-[m
[31m-    if opts then[m
[31m-        local protos = opts.protocols[m
[31m-        if protos then[m
[31m-            if type(protos) == "table" then[m
[31m-                proto_header = "\r\nSec-WebSocket-Protocol: "[m
[31m-                               .. concat(protos, ",")[m
[31m-[m
[31m-            else[m
[31m-                proto_header = "\r\nSec-WebSocket-Protocol: " .. protos[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local origin = opts.origin[m
[31m-        if origin then[m
[31m-            origin_header = "\r\nOrigin: " .. origin[m
[31m-        end[m
[31m-[m
[31m-        local pool = opts.pool[m
[31m-        if pool then[m
[31m-            sock_opts = { pool = pool }[m
[31m-        end[m
[31m-[m
[31m-        if opts.ssl_verify then[m
[31m-            if not ssl_support then[m
[31m-                return nil, "ngx_lua 0.9.11+ required for SSL sockets"[m
[31m-            end[m
[31m-            ssl_verify = true[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local ok, err[m
[31m-    if sock_opts then[m
[31m-        ok, err = sock:connect(host, port, sock_opts)[m
[31m-    else[m
[31m-        ok, err = sock:connect(host, port)[m
[31m-    end[m
[31m-    if not ok then[m
[31m-        return nil, "failed to connect: " .. err[m
[31m-    end[m
[31m-[m
[31m-    if scheme == "wss" then[m
[31m-        if not ssl_support then[m
[31m-            return nil, "ngx_lua 0.9.11+ required for SSL sockets"[m
[31m-        end[m
[31m-        ok, err = sock:sslhandshake(false, host, ssl_verify)[m
[31m-        if not ok then[m
[31m-            return nil, "ssl handshake failed: " .. err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- check for connections from pool:[m
[31m-[m
[31m-    local count,err = sock:getreusedtimes()[m
[31m-    if not count then[m
[31m-        return nil, "failed to get reused times: " .. err[m
[31m-    end[m
[31m-    if count > 0 then[m
[31m-        -- being a reused connection (must have done handshake)[m
[31m-        return 1[m
[31m-    end[m
[31m-[m
[31m-    -- do the websocket handshake:[m
[31m-[m
[31m-    local bytes = char(rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1)[m
[31m-[m
[31m-    local key = encode_base64(bytes)[m
[31m-    local req = "GET " .. path .. " HTTP/1.1\r\nUpgrade: websocket\r\nHost: "[m
[31m-                .. host .. ":" .. port[m
[31m-                .. "\r\nSec-WebSocket-Key: " .. key[m
[31m-                .. (proto_header or "")[m
[31m-                .. "\r\nSec-WebSocket-Version: 13"[m
[31m-                .. (origin_header or "")[m
[31m-                .. "\r\nConnection: Upgrade\r\n\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send the handshake request: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local header_reader = sock:receiveuntil("\r\n\r\n")[m
[31m-    -- FIXME: check for too big response headers[m
[31m-    local header, err, partial = header_reader()[m
[31m-    if not header then[m
[31m-        return nil, "failed to receive response header: " .. err[m
[31m-    end[m
[31m-[m
[31m-    -- FIXME: verify the response headers[m
[31m-[m
[31m-    m, err = re_match(header, [[^\s*HTTP/1\.1\s+]], "jo")[m
[31m-    if not m then[m
[31m-        return nil, "bad HTTP response status line: " .. header[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, time)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(time)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.recv_frame(self)[m
[31m-    if self.fatal then[m
[31m-        return nil, nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    local data, typ, err =  _recv_frame(sock, self.max_payload_len, false)[m
[31m-    if not data and not str_find(err, ": timeout", 1, true) then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-    return data, typ, err[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function send_frame(self, fin, opcode, payload, max_payload_len)[m
[31m-    if self.fatal then[m
[31m-        return nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    if self.closed then[m
[31m-        return nil, "already closed"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = _send_frame(sock, fin, opcode, payload,[m
[31m-                                   self.max_payload_len,[m
[31m-                                   not self.send_unmasked)[m
[31m-    if not bytes then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-    return bytes, err[m
[31m-end[m
[31m-_M.send_frame = send_frame[m
[31m-[m
[31m-[m
[31m-function _M.send_text(self, data)[m
[31m-    return send_frame(self, true, 0x1, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_binary(self, data)[m
[31m-    return send_frame(self, true, 0x2, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function send_close(self, code, msg)[m
[31m-    local payload[m
[31m-    if code then[m
[31m-        if type(code) ~= "number" or code > 0x7fff then[m
[31m-            return nil, "bad status code"[m
[31m-        end[m
[31m-        payload = char(band(rshift(code, 8), 0xff), band(code, 0xff))[m
[31m-                        .. (msg or "")[m
[31m-    end[m
[31m-[m
[31m-    if debug then[m
[31m-        ngx_log(ngx_DEBUG, "sending the close frame")[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = send_frame(self, true, 0x8, payload)[m
[31m-[m
[31m-    if not bytes then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-[m
[31m-    self.closed = true[m
[31m-[m
[31m-    return bytes, err[m
[31m-end[m
[31m-_M.send_close = send_close[m
[31m-[m
[31m-[m
[31m-function _M.send_ping(self, data)[m
[31m-    return send_frame(self, true, 0x9, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_pong(self, data)[m
[31m-    return send_frame(self, true, 0xa, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.close(self)[m
[31m-    if self.fatal then[m
[31m-        return nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if not self.closed then[m
[31m-        local bytes, err = send_close(self)[m
[31m-        if not bytes then[m
[31m-            return nil, "failed to send close frame: " .. err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return sock:close()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_keepalive(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:setkeepalive(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/protocol.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/protocol.lua[m
[1mdeleted file mode 100644[m
[1mindex 37050de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/protocol.lua[m
[1m+++ /dev/null[m
[36m@@ -1,327 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local bit = require "bit"[m
[31m-[m
[31m-[m
[31m-local byte = string.byte[m
[31m-local char = string.char[m
[31m-local sub = string.sub[m
[31m-local band = bit.band[m
[31m-local bor = bit.bor[m
[31m-local bxor = bit.bxor[m
[31m-local lshift = bit.lshift[m
[31m-local rshift = bit.rshift[m
[31m-local tohex = bit.tohex[m
[31m-local concat = table.concat[m
[31m-local str_char = string.char[m
[31m-local rand = math.random[m
[31m-local type = type[m
[31m-local debug = ngx.config.debug[m
[31m-local ngx_log = ngx.log[m
[31m-local ngx_DEBUG = ngx.DEBUG[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 5)[m
[31m-[m
[31m-_M.new_tab = new_tab[m
[31m-_M._VERSION = '0.05'[m
[31m-[m
[31m-[m
[31m-local types = {[m
[31m-    [0x0] = "continuation",[m
[31m-    [0x1] = "text",[m
[31m-    [0x2] = "binary",[m
[31m-    [0x8] = "close",[m
[31m-    [0x9] = "ping",[m
[31m-    [0xa] = "pong",[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function _M.recv_frame(sock, max_payload_len, force_masking)[m
[31m-    local data, err = sock:receive(2)[m
[31m-    if not data then[m
[31m-        return nil, nil, "failed to receive the first 2 bytes: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local fst, snd = byte(data, 1, 2)[m
[31m-[m
[31m-    local fin = band(fst, 0x80) ~= 0[m
[31m-    -- print("fin: ", fin)[m
[31m-[m
[31m-    if band(fst, 0x70) ~= 0 then[m
[31m-        return nil, nil, "bad RSV1, RSV2, or RSV3 bits"[m
[31m-    end[m
[31m-[m
[31m-    local opcode = band(fst, 0x0f)[m
[31m-    -- print("opcode: ", tohex(opcode))[m
[31m-[m
[31m-    if opcode >= 0x3 and opcode <= 0x7 then[m
[31m-        return nil, nil, "reserved non-control frames"[m
[31m-    end[m
[31m-[m
[31m-    if opcode >= 0xb and opcode <= 0xf then[m
[31m-        return nil, nil, "reserved control frames"[m
[31m-    end[m
[31m-[m
[31m-    local mask = band(snd, 0x80) ~= 0[m
[31m-[m
[31m-    if debug then[m
[31m-        ngx_log(ngx_DEBUG, "recv_frame: mask bit: ", mask and 1 or 0)[m
[31m-    end[m
[31m-[m
[31m-    if force_masking and not mask then[m
[31m-        return nil, nil, "frame unmasked"[m
[31m-    end[m
[31m-[m
[31m-    local payload_len = band(snd, 0x7f)[m
[31m-    -- print("payload len: ", payload_len)[m
[31m-[m
[31m-    if payload_len == 126 then[m
[31m-        local data, err = sock:receive(2)[m
[31m-        if not data then[m
[31m-            return nil, nil, "failed to receive the 2 byte payload length: "[m
[31m-                             .. (err or "unknown")[m
[31m-        end[m
[31m-[m
[31m-        payload_len = bor(lshift(byte(data, 1), 8), byte(data, 2))[m
[31m-[m
[31m-    elseif payload_len == 127 then[m
[31m-        local data, err = sock:receive(8)[m
[31m-        if not data then[m
[31m-            return nil, nil, "failed to receive the 8 byte payload length: "[m
[31m-                             .. (err or "unknown")[m
[31m-        end[m
[31m-[m
[31m-        if byte(data, 1) ~= 0[m
[31m-           or byte(data, 2) ~= 0[m
[31m-           or byte(data, 3) ~= 0[m
[31m-           or byte(data, 4) ~= 0[m
[31m-        then[m
[31m-            return nil, nil, "payload len too large"[m
[31m-        end[m
[31m-[m
[31m-        local fifth = byte(data, 5)[m
[31m-        if band(fifth, 0x80) ~= 0 then[m
[31m-            return nil, nil, "payload len too large"[m
[31m-        end[m
[31m-[m
[31m-        payload_len = bor(lshift(fifth, 24),[m
[31m-                          lshift(byte(data, 6), 16),[m
[31m-                          lshift(byte(data, 7), 8),[m
[31m-                          byte(data, 8))[m
[31m-    end[m
[31m-[m
[31m-    if band(opcode, 0x8) ~= 0 then[m
[31m-        -- being a control frame[m
[31m-        if payload_len > 125 then[m
[31m-            return nil, nil, "too long payload for control frame"[m
[31m-        end[m
[31m-[m
[31m-        if not fin then[m
[31m-            return nil, nil, "fragmented control frame"[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- print("payload len: ", payload_len, ", max payload len: ",[m
[31m-          -- max_payload_len)[m
[31m-[m
[31m-    if payload_len > max_payload_len then[m
[31m-        return nil, nil, "exceeding max payload len"[m
[31m-    end[m
[31m-[m
[31m-    local rest[m
[31m-    if mask then[m
[31m-        rest = payload_len + 4[m
[31m-[m
[31m-    else[m
[31m-        rest = payload_len[m
[31m-    end[m
[31m-    -- print("rest: ", rest)[m
[31m-[m
[31m-    local data[m
[31m-    if rest > 0 then[m
[31m-        data, err = sock:receive(rest)[m
[31m-        if not data then[m
[31m-            return nil, nil, "failed to read masking-len and payload: "[m
[31m-                             .. (err or "unknown")[m
[31m-        end[m
[31m-    else[m
[31m-        data = ""[m
[31m-    end[m
[31m-[m
[31m-    -- print("received rest")[m
[31m-[m
[31m-    if opcode == 0x8 then[m
[31m-        -- being a close frame[m
[31m-        if payload_len > 0 then[m
[31m-            if payload_len < 2 then[m
[31m-                return nil, nil, "close frame with a body must carry a 2-byte"[m
[31m-                                 .. " status code"[m
[31m-            end[m
[31m-[m
[31m-            local msg, code[m
[31m-            if mask then[m
[31m-                local fst = bxor(byte(data, 4 + 1), byte(data, 1))[m
[31m-                local snd = bxor(byte(data, 4 + 2), byte(data, 2))[m
[31m-                code = bor(lshift(fst, 8), snd)[m
[31m-[m
[31m-                if payload_len > 2 then[m
[31m-                    -- TODO string.buffer optimizations[m
[31m-                    local bytes = new_tab(payload_len - 2, 0)[m
[31m-                    for i = 3, payload_len do[m
[31m-                        bytes[i - 2] = str_char(bxor(byte(data, 4 + i),[m
[31m-                                                     byte(data,[m
[31m-                                                          (i - 1) % 4 + 1)))[m
[31m-                    end[m
[31m-                    msg = concat(bytes)[m
[31m-[m
[31m-                else[m
[31m-                    msg = ""[m
[31m-                end[m
[31m-[m
[31m-            else[m
[31m-                local fst = byte(data, 1)[m
[31m-                local snd = byte(data, 2)[m
[31m-                code = bor(lshift(fst, 8), snd)[m
[31m-[m
[31m-                -- print("parsing unmasked close frame payload: ", payload_len)[m
[31m-[m
[31m-                if payload_len > 2 then[m
[31m-                    msg = sub(data, 3)[m
[31m-[m
[31m-                else[m
[31m-                    msg = ""[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            return msg, "close", code[m
[31m-        end[m
[31m-[m
[31m-        return "", "close", nil[m
[31m-    end[m
[31m-[m
[31m-    local msg[m
[31m-    if mask then[m
[31m-        -- TODO string.buffer optimizations[m
[31m-        local bytes = new_tab(payload_len, 0)[m
[31m-        for i = 1, payload_len do[m
[31m-            bytes[i] = str_char(bxor(byte(data, 4 + i),[m
[31m-                                     byte(data, (i - 1) % 4 + 1)))[m
[31m-        end[m
[31m-        msg = concat(bytes)[m
[31m-[m
[31m-    else[m
[31m-        msg = data[m
[31m-    end[m
[31m-[m
[31m-    return msg, types[opcode], not fin and "again" or nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function build_frame(fin, opcode, payload_len, payload, masking)[m
[31m-    -- XXX optimize this when we have string.buffer in LuaJIT 2.1[m
[31m-    local fst[m
[31m-    if fin then[m
[31m-        fst = bor(0x80, opcode)[m
[31m-    else[m
[31m-        fst = opcode[m
[31m-    end[m
[31m-[m
[31m-    local snd, extra_len_bytes[m
[31m-    if payload_len <= 125 then[m
[31m-        snd = payload_len[m
[31m-        extra_len_bytes = ""[m
[31m-[m
[31m-    elseif payload_len <= 65535 then[m
[31m-        snd = 126[m
[31m-        extra_len_bytes = char(band(rshift(payload_len, 8), 0xff),[m
[31m-                               band(payload_len, 0xff))[m
[31m-[m
[31m-    else[m
[31m-        if band(payload_len, 0x7fffffff) < payload_len then[m
[31m-            return nil, "payload too big"[m
[31m-        end[m
[31m-[m
[31m-        snd = 127[m
[31m-        -- XXX we only support 31-bit length here[m
[31m-        extra_len_bytes = char(0, 0, 0, 0, band(rshift(payload_len, 24), 0xff),[m
[31m-                               band(rshift(payload_len, 16), 0xff),[m
[31m-                               band(rshift(payload_len, 8), 0xff),[m
[31m-                               band(payload_len, 0xff))[m
[31m-    end[m
[31m-[m
[31m-    local masking_key[m
[31m-    if masking then[m
[31m-        -- set the mask bit[m
[31m-        snd = bor(snd, 0x80)[m
[31m-        local key = rand(0xffffffff)[m
[31m-        masking_key = char(band(rshift(key, 24), 0xff),[m
[31m-                           band(rshift(key, 16), 0xff),[m
[31m-                           band(rshift(key, 8), 0xff),[m
[31m-                           band(key, 0xff))[m
[31m-[m
[31m-        -- TODO string.buffer optimizations[m
[31m-        local bytes = new_tab(payload_len, 0)[m
[31m-        for i = 1, payload_len do[m
[31m-            bytes[i] = str_char(bxor(byte(payload, i),[m
[31m-                                     byte(masking_key, (i - 1) % 4 + 1)))[m
[31m-        end[m
[31m-        payload = concat(bytes)[m
[31m-[m
[31m-    else[m
[31m-        masking_key = ""[m
[31m-    end[m
[31m-[m
[31m-    return char(fst, snd) .. extra_len_bytes .. masking_key .. payload[m
[31m-end[m
[31m-_M.build_frame = build_frame[m
[31m-[m
[31m-[m
[31m-function _M.send_frame(sock, fin, opcode, payload, max_payload_len, masking)[m
[31m-    -- ngx.log(ngx.WARN, ngx.var.uri, ": masking: ", masking)[m
[31m-[m
[31m-    if not payload then[m
[31m-        payload = ""[m
[31m-[m
[31m-    elseif type(payload) ~= "string" then[m
[31m-        payload = tostring(payload)[m
[31m-    end[m
[31m-[m
[31m-    local payload_len = #payload[m
[31m-[m
[31m-    if payload_len > max_payload_len then[m
[31m-        return nil, "payload too big"[m
[31m-    end[m
[31m-[m
[31m-    if band(opcode, 0x8) ~= 0 then[m
[31m-        -- being a control frame[m
[31m-        if payload_len > 125 then[m
[31m-            return nil, "too much payload for control frame"[m
[31m-        end[m
[31m-        if not fin then[m
[31m-            return nil, "fragmented control frame"[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local frame, err = build_frame(fin, opcode, payload_len, payload,[m
[31m-                                   masking)[m
[31m-    if not frame then[m
[31m-        return nil, "failed to build frame: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(frame)[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send frame: " .. err[m
[31m-    end[m
[31m-    return bytes[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/server.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/server.lua[m
[1mdeleted file mode 100644[m
[1mindex 98cc1f1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/lib/resty/websocket/server.lua[m
[1m+++ /dev/null[m
[36m@@ -1,209 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local bit = require "bit"[m
[31m-local wbproto = require "resty.websocket.protocol"[m
[31m-[m
[31m-local new_tab = wbproto.new_tab[m
[31m-local _recv_frame = wbproto.recv_frame[m
[31m-local _send_frame = wbproto.send_frame[m
[31m-local http_ver = ngx.req.http_version[m
[31m-local req_sock = ngx.req.socket[m
[31m-local ngx_header = ngx.header[m
[31m-local req_headers = ngx.req.get_headers[m
[31m-local str_lower = string.lower[m
[31m-local char = string.char[m
[31m-local str_find = string.find[m
[31m-local sha1_bin = ngx.sha1_bin[m
[31m-local base64 = ngx.encode_base64[m
[31m-local ngx = ngx[m
[31m-local read_body = ngx.req.read_body[m
[31m-local band = bit.band[m
[31m-local rshift = bit.rshift[m
[31m-local type = type[m
[31m-local setmetatable = setmetatable[m
[31m--- local print = print[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 10)[m
[31m-_M._VERSION = '0.05'[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(self, opts)[m
[31m-    if ngx.headers_sent then[m
[31m-        return nil, "response header already sent"[m
[31m-    end[m
[31m-[m
[31m-    read_body()[m
[31m-[m
[31m-    if http_ver() ~= 1.1 then[m
[31m-        return nil, "bad http version"[m
[31m-    end[m
[31m-[m
[31m-    local headers = req_headers()[m
[31m-[m
[31m-    local val = headers.upgrade[m
[31m-    if type(val) == "table" then[m
[31m-        val = val[1][m
[31m-    end[m
[31m-    if not val or str_lower(val) ~= "websocket" then[m
[31m-        return nil, "bad \"upgrade\" request header"[m
[31m-    end[m
[31m-[m
[31m-    val = headers.connection[m
[31m-    if type(val) == "table" then[m
[31m-        val = val[1][m
[31m-    end[m
[31m-    if not val or not str_find(str_lower(val), "upgrade", 1, true) then[m
[31m-        return nil, "bad \"connection\" request header"[m
[31m-    end[m
[31m-[m
[31m-    local key = headers["sec-websocket-key"][m
[31m-    if type(key) == "table" then[m
[31m-        key = key[1][m
[31m-    end[m
[31m-    if not key then[m
[31m-        return nil, "bad \"sec-websocket-key\" request header"[m
[31m-    end[m
[31m-[m
[31m-    local ver = headers["sec-websocket-version"][m
[31m-    if type(ver) == "table" then[m
[31m-        ver = ver[1][m
[31m-    end[m
[31m-    if not ver or ver ~= "13" then[m
[31m-        return nil, "bad \"sec-websocket-version\" request header"[m
[31m-    end[m
[31m-[m
[31m-    local protocols = headers["sec-websocket-protocol"][m
[31m-    if type(protocols) == "table" then[m
[31m-        protocols = protocols[1][m
[31m-    end[m
[31m-[m
[31m-    if protocols then[m
[31m-        ngx_header["Sec-WebSocket-Protocol"] = protocols[m
[31m-    end[m
[31m-    ngx_header["Upgrade"] = "websocket"[m
[31m-[m
[31m-    local sha1 = sha1_bin(key .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")[m
[31m-    ngx_header["Sec-WebSocket-Accept"] = base64(sha1)[m
[31m-[m
[31m-    ngx_header["Content-Type"] = nil[m
[31m-[m
[31m-    ngx.status = 101[m
[31m-    local ok, err = ngx.send_headers()[m
[31m-    if not ok then[m
[31m-        return nil, "failed to send response header: " .. (err or "unknonw")[m
[31m-    end[m
[31m-    ok, err = ngx.flush(true)[m
[31m-    if not ok then[m
[31m-        return nil, "failed to flush response header: " .. (err or "unknown")[m
[31m-    end[m
[31m-[m
[31m-    local sock[m
[31m-    sock, err = req_sock(true)[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local max_payload_len, send_masked, timeout[m
[31m-    if opts then[m
[31m-        max_payload_len = opts.max_payload_len[m
[31m-        send_masked = opts.send_masked[m
[31m-        timeout = opts.timeout[m
[31m-[m
[31m-        if timeout then[m
[31m-            sock:settimeout(timeout)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({[m
[31m-        sock = sock,[m
[31m-        max_payload_len = max_payload_len or 65535,[m
[31m-        send_masked = send_masked,[m
[31m-    }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, time)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(time)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.recv_frame(self)[m
[31m-    if self.fatal then[m
[31m-        return nil, nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    local data, typ, err =  _recv_frame(sock, self.max_payload_len, true)[m
[31m-    if not data and not str_find(err, ": timeout", 1, true) then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-    return data, typ, err[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function send_frame(self, fin, opcode, payload)[m
[31m-    if self.fatal then[m
[31m-        return nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = _send_frame(sock, fin, opcode, payload,[m
[31m-                                   self.max_payload_len, self.send_masked)[m
[31m-    if not bytes then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-    return bytes, err[m
[31m-end[m
[31m-_M.send_frame = send_frame[m
[31m-[m
[31m-[m
[31m-function _M.send_text(self, data)[m
[31m-    return send_frame(self, true, 0x1, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_binary(self, data)[m
[31m-    return send_frame(self, true, 0x2, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_close(self, code, msg)[m
[31m-    local payload[m
[31m-    if code then[m
[31m-        if type(code) ~= "number" or code > 0x7fff then[m
[31m-        end[m
[31m-        payload = char(band(rshift(code, 8), 0xff), band(code, 0xff))[m
[31m-                        .. (msg or "")[m
[31m-    end[m
[31m-    return send_frame(self, true, 0x8, payload)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_ping(self, data)[m
[31m-    return send_frame(self, true, 0x9, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_pong(self, data)[m
[31m-    return send_frame(self, true, 0xa, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cert/test.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cert/test.crt[m
[1mdeleted file mode 100644[m
[1mindex a69a011..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cert/test.crt[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICqTCCAhICCQClDm1WkreW4jANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQD[m
[31m-DAh0ZXN0LmNvbTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20wIBcN[m
[31m-MTQwNzIxMDMyMzQ3WhgPMjE1MTA2MTMwMzIzNDdaMIGXMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MRIwEAYDVQQLDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl[m
[31m-c3QuY29tMSAwHgYJKoZIhvcNAQkBFhFhZ2VudHpoQGdtYWlsLmNvbTCBnzANBgkq[m
[31m-hkiG9w0BAQEFAAOBjQAwgYkCgYEA6P18zUvtmaKQK2xePy8ZbFwSyTLw+jW6t9eZ[m
[31m-aiTec8X3ibN9WemrxHzkTRikxP3cAQoITRuZiQvF4Q7DO6wMkz/b0zwfgX5uedGq[m
[31m-047AJP6n/mwlDOjGSNomBLoXQzo7tVe60ikEm3ZyDUqnJPJMt3hImO5XSop4MPMu[m
[31m-Za9WhFcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQA4OBb9bOyWB1//93nSXX1mdENZ[m
[31m-IQeyTK0Dd6My76lnZxnZ4hTWrvvd0b17KLDU6JnS2N5ee3ATVkojPidRLWLIhnh5[m
[31m-0eXrcKalbO2Ce6nShoFvQCQKXN2Txmq2vO/Mud2bHAWwJALg+qi1Iih/gVYB9sct[m
[31m-FLg8zFOzRlYiU+6Mmw==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cert/test.key b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cert/test.key[m
[1mdeleted file mode 100644[m
[1mindex 6c13527..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cert/test.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXgIBAAKBgQDo/XzNS+2ZopArbF4/LxlsXBLJMvD6Nbq315lqJN5zxfeJs31Z[m
[31m-6avEfORNGKTE/dwBCghNG5mJC8XhDsM7rAyTP9vTPB+Bfm550arTjsAk/qf+bCUM[m
[31m-6MZI2iYEuhdDOju1V7rSKQSbdnINSqck8ky3eEiY7ldKingw8y5lr1aEVwIDAQAB[m
[31m-AoGBANgB66sKMga2SKN5nQdHS3LDCkevCutu1OWM5ZcbB4Kej5kC57xsf+tzPtab[m
[31m-emeIVGhCPOAALqB4YcT+QtMX967oM1MjcFbtH7si5oq6UYyp3i0G9Si6jIoVHz3+[m
[31m-8yOUaqwKbK+bRX8VS0YsHZmBsPK5ryN50iUwsU08nemoA94BAkEA9GS9Q5OPeFkM[m
[31m-tFxsIQ1f2FSsZAuN/1cpZgJqY+YaAN7MSPGTWyfd7nWG/Zgk3GO9/2ihh4gww+7B[m
[31m-To09GkmW4QJBAPQOHC2V+t2TA98+6Lj6+TYwcGEkhOENfVpH25mQ+kXgF/1Bd6rA[m
[31m-nosT1bdAY+SnmWXbSw6Kv5C20Em+bEX8WjcCQCSRRjhsRdVODbaW9Z7kb2jhEoJN[m
[31m-sEt6cTlQNzcHYPCsZYisjM3g4zYg47fiIfHQAsfKkhDDcfh/KvFj9LaQOEECQQCH[m
[31m-eBWYEDpSJ7rsfqT7mQQgWj7nDThdG/nK1TxGP71McBmg0Gg2dfkLRhVJRQqt74Is[m
[31m-kc9V4Rp4n6F6baL4Lh19AkEA6pZZer0kg3Kv9hjhaITIKUYdfIp9vYnDRWbQlBmR[m
[31m-atV8V9u9q2ETZvqfHpN+9Lu6NYR4yXIEIRf1bnIZ/mr9eQ==[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/count.t[m
[1mdeleted file mode 100644[m
[1mindex 085963c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/count.t[m
[1m+++ /dev/null[m
[36m@@ -1,91 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-use Protocol::WebSocket::Frame;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module size of resty.websocket.protocol[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local proto = require "resty.websocket.protocol"[m
[31m-            n = 0[m
[31m-            for _, _ in pairs(proto) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-size: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: module size of resty.websocket.client[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            n = 0[m
[31m-            for _, _ in pairs(client) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-size: 13[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: module size of resty.websocket.server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            n = 0[m
[31m-            for _, _ in pairs(server) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-size: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cs.t[m
[1mdeleted file mode 100644[m
[1mindex c58848d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/cs.t[m
[1m+++ /dev/null[m
[36m@@ -1,1960 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-use Protocol::WebSocket::Frame;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 14);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-check_accum_error_log();[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: text frame[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local bytes, err = wb:send_text("copy: " .. data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-1: received: 你好, WebSocket! (text)[m
[31m-2: received: copy: 你好, WebSocket! (text)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m---- error_log[m
[31m-recv_frame: mask bit: 0[m
[31m-recv_frame: mask bit: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: binary frame[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local bytes, err = wb:send_binary("copy: " .. data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = wb:send_binary("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_binary(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-1: received: 你好, WebSocket! (binary)[m
[31m-2: received: copy: 你好, WebSocket! (binary)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: close frame (without msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lingering_close always;[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            wb:recv_frame()  -- receive the close frame[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            wb:send_close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received close: : nil[m
[31m-[m
[31m---- error_log[m
[31m-received: close: : nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: close frame (with msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_close(1000, "server, let\'s close!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_close(1001, "client, let\'s close!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received close: client, let's close!: 1001[m
[31m-[m
[31m---- error_log[m
[31m-received: close: server, let's close!: 1000[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ping frame (without msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_ping()[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_ping()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received ping: : nil[m
[31m-[m
[31m---- error_log[m
[31m-received: ping: : nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ping frame (with msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_ping("hey, server?")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_ping("hey, client?")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received ping: hey, client?: nil[m
[31m-[m
[31m---- error_log[m
[31m-received: ping: hey, server?: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: pong frame (without msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_pong()[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            wb:recv_frame()  -- receive the close frame[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_pong()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            wb:send_close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received pong: : nil[m
[31m-[m
[31m---- error_log[m
[31m-received: pong: : nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: pong frame (with msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_pong("halo, server!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_pong("halo, client!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received pong: halo, client!: nil[m
[31m-[m
[31m---- error_log[m
[31m-received: pong: halo, server!: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: client recv timeout (set_timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1)[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1000)[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-            else[m
[31m-                ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-failed to receive 1st frame: failed to receive the first 2 bytes: timeout[m
[31m-2: received: 你好, WebSocket! (text)[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: client recv timeout (timeout option)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new{ timeout = 100 }[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1000)[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-            else[m
[31m-                ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-failed to receive 1st frame: failed to receive the first 2 bytes: timeout[m
[31m-2: received: 你好, WebSocket! (text)[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: server recv timeout (set_timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1)[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive 1st frame: ", err)[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, "1: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1000)[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive 2nd frame: ", err)[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, "2: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-failed to receive 1st frame: failed to receive the first 2 bytes: timeout[m
[31m-2: received: 你好, WebSocket! (text)[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: server recv timeout (in constructor)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new{ timeout = 1 }[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive 1st frame: ", err)[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, "1: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1000)[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive 2nd frame: ", err)[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, "2: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-failed to receive 1st frame: failed to receive the first 2 bytes: timeout[m
[31m-2: received: 你好, WebSocket! (text)[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: reused upstream websocket connections (set_keepalive)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-                -- ngx.say("uri: ", uri)[m
[31m-                local ok, err = wb:connect(uri)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: " .. err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data = "hello " .. i[m
[31m-                local bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-                local ok, err = wb:set_keepalive()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to recycle conn: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-[m
[31m-                -- send it back![m
[31m-                bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello 1 (text)[m
[31m-received: hello 2 (text)[m
[31m-received: hello 3 (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m---- error_log[m
[31m-recv_frame: mask bit: 0[m
[31m-recv_frame: mask bit: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: pool option[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location = /c2 {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s2"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri, { pool = "my_conn_pool" })[m
[31m-            if not ok then[m
[31m-                ok, err = wb:connect(uri)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: " .. err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:send_text("hello websocket")[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local ok, err = wb:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s2 {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    -- ngx.log(ngx.ERR, "failed to recv text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-[m
[31m-                local bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c2[m
[31m---- response_body[m
[31m-received: hello websocket (text)[m
[31m---- stap[m
[31m-F(ngx_http_lua_socket_tcp_setkeepalive) {[m
[31m-    println("socket tcp set keepalive")[m
[31m-}[m
[31m---- stap_out[m
[31m-socket tcp set keepalive[m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "my_conn_pool"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: text frame (send masked frames on the server side)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local bytes, err = wb:send_text("copy: " .. data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new{ send_masked = true }[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.001)  -- lingering close[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-1: received: 你好, WebSocket! (text)[m
[31m-2: received: copy: 你好, WebSocket! (text)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-recv_frame: mask bit: 0[m
[31m---- error_log[m
[31m-recv_frame: mask bit: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: text frame (send unmasked frames on the client side)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new{ send_unmasked = true }[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local bytes, err = wb:send_text("copy: " .. data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.001)  -- lingering close[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body_like eval[m
[31m-qr/^1: received: 你好, WebSocket! \(text\)[m
[31m-(?:failed to receive 2nd frame: failed to receive the first 2 bytes: (?:closed|connection reset by peer)[m
[31m-|failed to send frame: failed to send frame: broken pipe)$/[m
[31m---- no_error_log[m
[31m-[warn][m
[31m---- error_log[m
[31m-recv_frame: mask bit: 0[m
[31m-failed to receive a frame: frame unmasked[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: close frame (without msg body) + close()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = wb:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("successfully closed the TCP connection")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received close: : nil[m
[31m-successfully closed the TCP connection[m
[31m-[m
[31m---- error_log[m
[31m-received: close: : nil[m
[31m-sending the close frame[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: directly calling close() without sending the close frame ourselves[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local ok, err = wb:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("successfully closed the TCP connection")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received close: : nil[m
[31m-successfully closed the TCP connection[m
[31m-[m
[31m---- error_log[m
[31m-received: close: : nil[m
[31m-sending the close frame[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: client handshake (scalar protocols)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            math.randomseed(0)[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:7986/"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri, { protocols = "json" })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m---- tcp_listen: 7986[m
[31m---- tcp_query eval[m
[31m-"GET / HTTP/1.1\r[m
[31m-Upgrade: websocket\r[m
[31m-Host: 127.0.0.1:7986\r[m
[31m-Sec-WebSocket-Key: y7KXwBSpVrxtkR0O+bQt+Q==\r[m
[31m-Sec-WebSocket-Protocol: json\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Connection: Upgrade\r[m
[31m-\r[m
[31m-"[m
[31m---- tcp_reply: blah[m
[31m---- response_body[m
[31m-failed to connect: failed to receive response header: closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: client handshake (table protocols)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            math.randomseed(0)[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:7986/"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri, { protocols = {"xml", "json"} })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m---- tcp_listen: 7986[m
[31m---- tcp_query eval[m
[31m-"GET / HTTP/1.1\r[m
[31m-Upgrade: websocket\r[m
[31m-Host: 127.0.0.1:7986\r[m
[31m-Sec-WebSocket-Key: y7KXwBSpVrxtkR0O+bQt+Q==\r[m
[31m-Sec-WebSocket-Protocol: xml,json\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Connection: Upgrade\r[m
[31m-\r[m
[31m-"[m
[31m---- tcp_reply: blah[m
[31m---- response_body[m
[31m-failed to connect: failed to receive response header: closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: client handshake (origin)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            math.randomseed(0)[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:7986/"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri, { origin = "test.com" })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m---- tcp_listen: 7986[m
[31m---- tcp_query eval[m
[31m-"GET / HTTP/1.1\r[m
[31m-Upgrade: websocket\r[m
[31m-Host: 127.0.0.1:7986\r[m
[31m-Sec-WebSocket-Key: y7KXwBSpVrxtkR0O+bQt+Q==\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Origin: test.com\r[m
[31m-Connection: Upgrade\r[m
[31m-\r[m
[31m-"[m
[31m---- tcp_reply: blah[m
[31m---- response_body[m
[31m-failed to connect: failed to receive response header: closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: SSL with keepalive[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local uri = "wss://127.0.0.1:12345/s"[m
[31m-                local ok, err = wb:connect(uri)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: " .. err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data = "hello " .. i[m
[31m-                local bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-                local ok, err = wb:set_keepalive()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to recycle conn: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-[m
[31m-                -- send it back![m
[31m-                bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello 1 (text)[m
[31m-received: hello 2 (text)[m
[31m-received: hello 3 (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: SSL without keepalive[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            local uri = "wss://127.0.0.1:12345/s"[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = "hello"[m
[31m-            local bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local ok, err = wb:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close conn: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: SSL with ssl_verify[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    resolver 127.0.0.1:1953 ipv6=off;[m
[31m-    resolver_timeout 1s;[m
[31m-[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 1;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            local uri = "wss://test.com:12345/s"[m
[31m-            local ok, err = wb:connect(uri, {ssl_verify = true})[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = "hello"[m
[31m-            local bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local ok, err = wb:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close conn: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply eval[m
[31m-sub {[m
[31m-    # Get DNS request ID from passed UDP datagram[m
[31m-    my $dns_id = unpack("n", shift);[m
[31m-    # Set name and encode it[m
[31m-    my $name = "test.com";[m
[31m-    $name =~ s/([^.]+)\.?/chr(length($1)) . $1/ge;[m
[31m-    $name .= "\0";[m
[31m-    my $s = '';[m
[31m-    $s .= pack("n", $dns_id);[m
[31m-    # DNS response flags, hardcoded[m
[31m-    my $flags = (1 << 15) + (0 << 11) + (0 << 10) + (0 << 9) + (1 << 8) + (1 << 7) + 0;[m
[31m-    $flags = pack("n", $flags);[m
[31m-    $s .= $flags;[m
[31m-    $s .= pack("nnnn", 1, 1, 0, 0);[m
[31m-    $s .= $name;[m
[31m-    $s .= pack("nn", 1, 1);[m
[31m-    # Set response address and pack it[m
[31m-    my @addr = split /\./, "127.0.0.1";[m
[31m-    my $data = pack("CCCC", @addr);[m
[31m-    $s .= $name. pack("nnNn", 1, 1, 1, 4) . $data;[m
[31m-    return $s;[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: SSL with ssl_verify (handshake failed)[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    resolver 127.0.0.1:1953 ipv6=off;[m
[31m-    resolver_timeout 1s;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            local uri = "wss://test.com:12345/s"[m
[31m-            local ok, err = wb:connect(uri, {ssl_verify = true})[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply eval[m
[31m-sub {[m
[31m-    # Get DNS request ID from passed UDP datagram[m
[31m-    my $dns_id = unpack("n", shift);[m
[31m-    # Set name and encode it[m
[31m-    my $name = "test.com";[m
[31m-    $name =~ s/([^.]+)\.?/chr(length($1)) . $1/ge;[m
[31m-    $name .= "\0";[m
[31m-    my $s = '';[m
[31m-    $s .= pack("n", $dns_id);[m
[31m-    # DNS response flags, hardcoded[m
[31m-    my $flags = (1 << 15) + (0 << 11) + (0 << 10) + (0 << 9) + (1 << 8) + (1 << 7) + 0;[m
[31m-    $flags = pack("n", $flags);[m
[31m-    $s .= $flags;[m
[31m-    $s .= pack("nnnn", 1, 1, 0, 0);[m
[31m-    $s .= $name;[m
[31m-    $s .= pack("nn", 1, 1);[m
[31m-    # Set response address and pack it[m
[31m-    my @addr = split /\./, "127.0.0.1";[m
[31m-    my $data = pack("CCCC", @addr);[m
[31m-    $s .= $name. pack("nnNn", 1, 1, 1, 4) . $data;[m
[31m-    return $s;[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl certificate verify error: (18: self signed certificate)[m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: SSL without ssl_verify[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local uri = "wss://127.0.0.1:12345/s"[m
[31m-                local ok, err = wb:connect(uri, {ssl_verify = false})[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: " .. err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data = "hello " .. i[m
[31m-                local bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-                local ok, err = wb:set_keepalive()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to close conn: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-[m
[31m-                -- send it back![m
[31m-                bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello 1 (text)[m
[31m-received: hello 2 (text)[m
[31m-received: hello 3 (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 448b088..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,943 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-use Protocol::WebSocket::Frame;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 162;[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple handshake[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage()[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Origin: http://example.com\r[m
[31m-\r[m
[31m-"[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m-!Content-Type[m
[31m---- raw_response_headers_like: ^HTTP/1.1 101 Switching Protocols\r\n[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple text data frame (3 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received: foo: nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple text data frame (0 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => '', type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received: ,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: simple text data frame (125 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 124 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log eval[m
[31m-"text msg received: " . ("a" x 124) . "b,",[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: simple text data frame (126 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 125 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log eval[m
[31m-"text msg received: " . ("a" x 125) . "b,",[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple text data frame (127 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 126 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log eval[m
[31m-"text msg received: " . ("a" x 126) . "b,",[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple text data frame (65535 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local m, err = ngx.re.match(msg, "^a{65534}b$", "jo")[m
[31m-            if m then[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is expected")[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is NOT expected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 65534 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received is expected,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple text data frame (65536 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new{ max_payload_len = 65536 }[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local m, err = ngx.re.match(msg, "^a{65535}b$", "jo")[m
[31m-            if m then[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is expected")[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is NOT expected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 65535 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received is expected,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: simple text data frame (1 Mbytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new{ max_payload_len = 1048576 + 1 }[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local m, err = ngx.re.match(msg, "^a+b$", "jo")[m
[31m-            if m and #msg == 1048576 + 1 then[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is expected")[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to match regex: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is NOT expected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(max_payload_size => 1048576 + 1, buffer => "a" x 1048576 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received is expected,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: simple binary data frame (3 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'binary', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-binary msg received: foo,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: close frame (status code + non-empty msg)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => pack("n", 1000) . 'yes, closed', type => 'close', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-close msg received: yes, closed: 1000,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: close frame (just status code)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => pack("n", 1002), type => 'close', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-close msg received: : 1002,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: close frame (no payload at all)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "", type => 'close', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-close msg received: : nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ping frame (no payload at all)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "", type => 'ping', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-ping msg received: : nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ping frame (with payload)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "are you there? 你好", type => 'ping', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-ping msg received: are you there? 你好: nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: pong frame (with payload)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "are you there? 你好", type => 'pong', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-pong msg received: are you there? 你好: nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exceeding the default 65535 max frame len limit (65536 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local m, err = ngx.re.match(msg, "^a{65535}b$", "jo")[m
[31m-            if m then[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is expected")[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is NOT expected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 65535 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to read msg: exceeding max payload len[m
[31m---- no_error_log[m
[31m-text msg received is expected,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: simple text data frame (3 bytes, fragmented, first frame)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-my $frame = Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'text', masked => 1)->to_bytes();[m
[31m-$frame =~ s/./chr(ord($&) & 0x7f)/e; # clear the FIN bit[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-$frame";[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received: foo: again,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: simple text data frame (3 bytes, fragmented, last frame)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-my $frame = Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'text', masked => 1)->to_bytes();[m
[31m-$frame =~ s/./chr(ord($&) & 0xf0)/e; # clear the opcode[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-$frame";[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-continuation msg received: foo: nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: simple text data frame (3 bytes, fragmented, middle frame)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-my $frame = Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'text', masked => 1)->to_bytes();[m
[31m-$frame =~ s/./chr(ord($&) & 0x70)/e; # clear the opcode[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-$frame";[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-continuation msg received: foo: again,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: Firefox 22.0 handshake[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: keep-alive, Upgrade\r[m
[31m-Cache-Control: no-cache\r[m
[31m-Pragma: no-cache\r[m
[31m-Sec-WebSocket-Key: 05EiFj8mhoZ5F/oFE3Tyeg==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Origin: null\r[m
[31m-\r[m
[31m-"[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: tBNO4O+F4DrQyajB62pvtRNU8LM=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 14d92de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/lua-resty-websocket-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,462 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/bin/luajit b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/bin/luajit[m
[1mdeleted file mode 120000[m
[1mindex 82c0b12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/bin/luajit[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-luajit-2.1.0-beta2[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/bin/luajit-2.1.0-beta2 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/bin/luajit-2.1.0-beta2[m
[1mdeleted file mode 100755[m
[1mindex 3e0ab14..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/bin/luajit-2.1.0-beta2 and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lauxlib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lauxlib.h[m
[1mdeleted file mode 100644[m
[1mindex fed1491..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lauxlib.h[m
[1m+++ /dev/null[m
[36m@@ -1,167 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions for building Lua libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lauxlib_h[m
[31m-#define lauxlib_h[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-#define luaL_getn(L,i)          ((int)lua_objlen(L, i))[m
[31m-#define luaL_setn(L,i,j)        ((void)0)  /* no op! */[m
[31m-[m
[31m-/* extra error code for `luaL_load' */[m
[31m-#define LUA_ERRFILE     (LUA_ERRERR+1)[m
[31m-[m
[31m-typedef struct luaL_Reg {[m
[31m-  const char *name;[m
[31m-  lua_CFunction func;[m
[31m-} luaL_Reg;[m
[31m-[m
[31m-LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l, int nup);[m
[31m-LUALIB_API void (luaL_register) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l);[m
[31m-LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);[m
[31m-LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);[m
[31m-LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,[m
[31m-                                                          size_t *l);[m
[31m-LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,[m
[31m-                                          const char *def, size_t *l);[m
[31m-LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);[m
[31m-[m
[31m-LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,[m
[31m-                                          lua_Integer def);[m
[31m-[m
[31m-LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);[m
[31m-LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);[m
[31m-LUALIB_API void (luaL_checkany) (lua_State *L, int narg);[m
[31m-[m
[31m-LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);[m
[31m-LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);[m
[31m-[m
[31m-LUALIB_API void (luaL_where) (lua_State *L, int lvl);[m
[31m-LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);[m
[31m-[m
[31m-LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,[m
[31m-                                   const char *const lst[]);[m
[31m-[m
[31m-LUALIB_API int (luaL_ref) (lua_State *L, int t);[m
[31m-LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);[m
[31m-[m
[31m-LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);[m
[31m-LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,[m
[31m-                                  const char *name);[m
[31m-LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);[m
[31m-[m
[31m-LUALIB_API lua_State *(luaL_newstate) (void);[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,[m
[31m-                                                  const char *r);[m
[31m-[m
[31m-LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,[m
[31m-                                         const char *fname, int szhint);[m
[31m-[m
[31m-/* From Lua 5.2. */[m
[31m-LUALIB_API int luaL_fileresult(lua_State *L, int stat, const char *fname);[m
[31m-LUALIB_API int luaL_execresult(lua_State *L, int stat);[m
[31m-LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,[m
[31m-				 const char *mode);[m
[31m-LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,[m
[31m-				   const char *name, const char *mode);[m
[31m-LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,[m
[31m-				int level);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define luaL_argcheck(L, cond,numarg,extramsg)	\[m
[31m-		((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))[m
[31m-#define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))[m
[31m-#define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))[m
[31m-#define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))[m
[31m-#define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))[m
[31m-[m
[31m-#define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))[m
[31m-[m
[31m-#define luaL_dofile(L, fn) \[m
[31m-	(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_dostring(L, s) \[m
[31m-	(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))[m
[31m-[m
[31m-#define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Generic Buffer manipulation[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct luaL_Buffer {[m
[31m-  char *p;			/* current position in buffer */[m
[31m-  int lvl;  /* number of strings in the stack (level) */[m
[31m-  lua_State *L;[m
[31m-  char buffer[LUAL_BUFFERSIZE];[m
[31m-} luaL_Buffer;[m
[31m-[m
[31m-#define luaL_addchar(B,c) \[m
[31m-  ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \[m
[31m-   (*(B)->p++ = (char)(c)))[m
[31m-[m
[31m-/* compatibility only */[m
[31m-#define luaL_putchar(B,c)	luaL_addchar(B,c)[m
[31m-[m
[31m-#define luaL_addsize(B,n)	((B)->p += (n))[m
[31m-[m
[31m-LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);[m
[31m-LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);[m
[31m-LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);[m
[31m-LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-/* compatibility with ref system */[m
[31m-[m
[31m-/* pre-defined references */[m
[31m-#define LUA_NOREF       (-2)[m
[31m-#define LUA_REFNIL      (-1)[m
[31m-[m
[31m-#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \[m
[31m-      (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))[m
[31m-[m
[31m-#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-[m
[31m-#define luaL_reg	luaL_Reg[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lua.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lua.h[m
[1mdeleted file mode 100644[m
[1mindex 352d29f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lua.h[m
[1m+++ /dev/null[m
[36m@@ -1,394 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $[m
[31m-** Lua - An Extensible Extension Language[m
[31m-** Lua.org, PUC-Rio, Brazil (http://www.lua.org)[m
[31m-** See Copyright Notice at the end of this file[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lua_h[m
[31m-#define lua_h[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-#include "luaconf.h"[m
[31m-[m
[31m-[m
[31m-#define LUA_VERSION	"Lua 5.1"[m
[31m-#define LUA_RELEASE	"Lua 5.1.4"[m
[31m-#define LUA_VERSION_NUM	501[m
[31m-#define LUA_COPYRIGHT	"Copyright (C) 1994-2008 Lua.org, PUC-Rio"[m
[31m-#define LUA_AUTHORS	"R. Ierusalimschy, L. H. de Figueiredo & W. Celes"[m
[31m-[m
[31m-[m
[31m-/* mark for precompiled code (`<esc>Lua') */[m
[31m-#define	LUA_SIGNATURE	"\033Lua"[m
[31m-[m
[31m-/* option for multiple returns in `lua_pcall' and `lua_call' */[m
[31m-#define LUA_MULTRET	(-1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** pseudo-indices[m
[31m-*/[m
[31m-#define LUA_REGISTRYINDEX	(-10000)[m
[31m-#define LUA_ENVIRONINDEX	(-10001)[m
[31m-#define LUA_GLOBALSINDEX	(-10002)[m
[31m-#define lua_upvalueindex(i)	(LUA_GLOBALSINDEX-(i))[m
[31m-[m
[31m-[m
[31m-/* thread status; 0 is OK */[m
[31m-#define LUA_YIELD	1[m
[31m-#define LUA_ERRRUN	2[m
[31m-#define LUA_ERRSYNTAX	3[m
[31m-#define LUA_ERRMEM	4[m
[31m-#define LUA_ERRERR	5[m
[31m-[m
[31m-[m
[31m-typedef struct lua_State lua_State;[m
[31m-[m
[31m-typedef int (*lua_CFunction) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** functions that read/write blocks when loading/dumping Lua chunks[m
[31m-*/[m
[31m-typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);[m
[31m-[m
[31m-typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** prototype for memory-allocation functions[m
[31m-*/[m
[31m-typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic types[m
[31m-*/[m
[31m-#define LUA_TNONE		(-1)[m
[31m-[m
[31m-#define LUA_TNIL		0[m
[31m-#define LUA_TBOOLEAN		1[m
[31m-#define LUA_TLIGHTUSERDATA	2[m
[31m-#define LUA_TNUMBER		3[m
[31m-#define LUA_TSTRING		4[m
[31m-#define LUA_TTABLE		5[m
[31m-#define LUA_TFUNCTION		6[m
[31m-#define LUA_TUSERDATA		7[m
[31m-#define LUA_TTHREAD		8[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* minimum Lua stack available to a C function */[m
[31m-#define LUA_MINSTACK	20[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** generic extra include file[m
[31m-*/[m
[31m-#if defined(LUA_USER_H)[m
[31m-#include LUA_USER_H[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* type of numbers in Lua */[m
[31m-typedef LUA_NUMBER lua_Number;[m
[31m-[m
[31m-[m
[31m-/* type for integer functions */[m
[31m-typedef LUA_INTEGER lua_Integer;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** state manipulation[m
[31m-*/[m
[31m-LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);[m
[31m-LUA_API void       (lua_close) (lua_State *L);[m
[31m-LUA_API lua_State *(lua_newthread) (lua_State *L);[m
[31m-[m
[31m-LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic stack manipulation[m
[31m-*/[m
[31m-LUA_API int   (lua_gettop) (lua_State *L);[m
[31m-LUA_API void  (lua_settop) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_pushvalue) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_remove) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_insert) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_replace) (lua_State *L, int idx);[m
[31m-LUA_API int   (lua_checkstack) (lua_State *L, int sz);[m
[31m-[m
[31m-LUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** access functions (stack -> C)[m
[31m-*/[m
[31m-[m
[31m-LUA_API int             (lua_isnumber) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isstring) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_iscfunction) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isuserdata) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_type) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_typename) (lua_State *L, int tp);[m
[31m-[m
[31m-LUA_API int            (lua_equal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_rawequal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_lessthan) (lua_State *L, int idx1, int idx2);[m
[31m-[m
[31m-LUA_API lua_Number      (lua_tonumber) (lua_State *L, int idx);[m
[31m-LUA_API lua_Integer     (lua_tointeger) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_toboolean) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);[m
[31m-LUA_API size_t          (lua_objlen) (lua_State *L, int idx);[m
[31m-LUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);[m
[31m-LUA_API void	       *(lua_touserdata) (lua_State *L, int idx);[m
[31m-LUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);[m
[31m-LUA_API const void     *(lua_topointer) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** push functions (C -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_pushnil) (lua_State *L);[m
[31m-LUA_API void  (lua_pushnumber) (lua_State *L, lua_Number n);[m
[31m-LUA_API void  (lua_pushinteger) (lua_State *L, lua_Integer n);[m
[31m-LUA_API void  (lua_pushlstring) (lua_State *L, const char *s, size_t l);[m
[31m-LUA_API void  (lua_pushstring) (lua_State *L, const char *s);[m
[31m-LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,[m
[31m-                                                      va_list argp);[m
[31m-LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);[m
[31m-LUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);[m
[31m-LUA_API void  (lua_pushboolean) (lua_State *L, int b);[m
[31m-LUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);[m
[31m-LUA_API int   (lua_pushthread) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** get functions (Lua -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_gettable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_getfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawget) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawgeti) (lua_State *L, int idx, int n);[m
[31m-LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);[m
[31m-LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);[m
[31m-LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API void  (lua_getfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** set functions (stack -> Lua)[m
[31m-*/[m
[31m-LUA_API void  (lua_settable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawset) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);[m
[31m-LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API int   (lua_setfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `load' and `call' functions (load and run Lua code)[m
[31m-*/[m
[31m-LUA_API void  (lua_call) (lua_State *L, int nargs, int nresults);[m
[31m-LUA_API int   (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);[m
[31m-LUA_API int   (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);[m
[31m-LUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt,[m
[31m-                                        const char *chunkname);[m
[31m-[m
[31m-LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** coroutine functions[m
[31m-*/[m
[31m-LUA_API int  (lua_yield) (lua_State *L, int nresults);[m
[31m-LUA_API int  (lua_resume) (lua_State *L, int narg);[m
[31m-LUA_API int  (lua_status) (lua_State *L);[m
[31m-[m
[31m-/*[m
[31m-** garbage-collection function and options[m
[31m-*/[m
[31m-[m
[31m-#define LUA_GCSTOP		0[m
[31m-#define LUA_GCRESTART		1[m
[31m-#define LUA_GCCOLLECT		2[m
[31m-#define LUA_GCCOUNT		3[m
[31m-#define LUA_GCCOUNTB		4[m
[31m-#define LUA_GCSTEP		5[m
[31m-#define LUA_GCSETPAUSE		6[m
[31m-#define LUA_GCSETSTEPMUL	7[m
[31m-#define LUA_GCISRUNNING		9[m
[31m-[m
[31m-LUA_API int (lua_gc) (lua_State *L, int what, int data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** miscellaneous functions[m
[31m-*/[m
[31m-[m
[31m-LUA_API int   (lua_error) (lua_State *L);[m
[31m-[m
[31m-LUA_API int   (lua_next) (lua_State *L, int idx);[m
[31m-[m
[31m-LUA_API void  (lua_concat) (lua_State *L, int n);[m
[31m-[m
[31m-LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);[m
[31m-LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define lua_pop(L,n)		lua_settop(L, -(n)-1)[m
[31m-[m
[31m-#define lua_newtable(L)		lua_createtable(L, 0, 0)[m
[31m-[m
[31m-#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))[m
[31m-[m
[31m-#define lua_pushcfunction(L,f)	lua_pushcclosure(L, (f), 0)[m
[31m-[m
[31m-#define lua_strlen(L,i)		lua_objlen(L, (i))[m
[31m-[m
[31m-#define lua_isfunction(L,n)	(lua_type(L, (n)) == LUA_TFUNCTION)[m
[31m-#define lua_istable(L,n)	(lua_type(L, (n)) == LUA_TTABLE)[m
[31m-#define lua_islightuserdata(L,n)	(lua_type(L, (n)) == LUA_TLIGHTUSERDATA)[m
[31m-#define lua_isnil(L,n)		(lua_type(L, (n)) == LUA_TNIL)[m
[31m-#define lua_isboolean(L,n)	(lua_type(L, (n)) == LUA_TBOOLEAN)[m
[31m-#define lua_isthread(L,n)	(lua_type(L, (n)) == LUA_TTHREAD)[m
[31m-#define lua_isnone(L,n)		(lua_type(L, (n)) == LUA_TNONE)[m
[31m-#define lua_isnoneornil(L, n)	(lua_type(L, (n)) <= 0)[m
[31m-[m
[31m-#define lua_pushliteral(L, s)	\[m
[31m-	lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)[m
[31m-[m
[31m-#define lua_setglobal(L,s)	lua_setfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-#define lua_getglobal(L,s)	lua_getfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-[m
[31m-#define lua_tostring(L,i)	lua_tolstring(L, (i), NULL)[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** compatibility macros and functions[m
[31m-*/[m
[31m-[m
[31m-#define lua_open()	luaL_newstate()[m
[31m-[m
[31m-#define lua_getregistry(L)	lua_pushvalue(L, LUA_REGISTRYINDEX)[m
[31m-[m
[31m-#define lua_getgccount(L)	lua_gc(L, LUA_GCCOUNT, 0)[m
[31m-[m
[31m-#define lua_Chunkreader		lua_Reader[m
[31m-#define lua_Chunkwriter		lua_Writer[m
[31m-[m
[31m-[m
[31m-/* hack */[m
[31m-LUA_API void lua_setlevel	(lua_State *from, lua_State *to);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Debug API[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event codes[m
[31m-*/[m
[31m-#define LUA_HOOKCALL	0[m
[31m-#define LUA_HOOKRET	1[m
[31m-#define LUA_HOOKLINE	2[m
[31m-#define LUA_HOOKCOUNT	3[m
[31m-#define LUA_HOOKTAILRET 4[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event masks[m
[31m-*/[m
[31m-#define LUA_MASKCALL	(1 << LUA_HOOKCALL)[m
[31m-#define LUA_MASKRET	(1 << LUA_HOOKRET)[m
[31m-#define LUA_MASKLINE	(1 << LUA_HOOKLINE)[m
[31m-#define LUA_MASKCOUNT	(1 << LUA_HOOKCOUNT)[m
[31m-[m
[31m-typedef struct lua_Debug lua_Debug;  /* activation record */[m
[31m-[m
[31m-[m
[31m-/* Functions to be called by the debuger in specific events */[m
[31m-typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar);[m
[31m-LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);[m
[31m-LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n);[m
[31m-LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n);[m
[31m-LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);[m
[31m-LUA_API lua_Hook lua_gethook (lua_State *L);[m
[31m-LUA_API int lua_gethookmask (lua_State *L);[m
[31m-LUA_API int lua_gethookcount (lua_State *L);[m
[31m-[m
[31m-/* From Lua 5.2. */[m
[31m-LUA_API void *lua_upvalueid (lua_State *L, int idx, int n);[m
[31m-LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2);[m
[31m-LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt,[m
[31m-		       const char *chunkname, const char *mode);[m
[31m-[m
[31m-[m
[31m-struct lua_Debug {[m
[31m-  int event;[m
[31m-  const char *name;	/* (n) */[m
[31m-  const char *namewhat;	/* (n) `global', `local', `field', `method' */[m
[31m-  const char *what;	/* (S) `Lua', `C', `main', `tail' */[m
[31m-  const char *source;	/* (S) */[m
[31m-  int currentline;	/* (l) */[m
[31m-  int nups;		/* (u) number of upvalues */[m
[31m-  int linedefined;	/* (S) */[m
[31m-  int lastlinedefined;	/* (S) */[m
[31m-  char short_src[LUA_IDSIZE]; /* (S) */[m
[31m-  /* private part */[m
[31m-  int i_ci;  /* active function */[m
[31m-};[m
[31m-[m
[31m-/* }====================================================================== */[m
[31m-[m
[31m-[m
[31m-/******************************************************************************[m
[31m-* Copyright (C) 1994-2008 Lua.org, PUC-Rio.  All rights reserved.[m
[31m-*[m
[31m-* Permission is hereby granted, free of charge, to any person obtaining[m
[31m-* a copy of this software and associated documentation files (the[m
[31m-* "Software"), to deal in the Software without restriction, including[m
[31m-* without limitation the rights to use, copy, modify, merge, publish,[m
[31m-* distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-* permit persons to whom the Software is furnished to do so, subject to[m
[31m-* the following conditions:[m
[31m-*[m
[31m-* The above copyright notice and this permission notice shall be[m
[31m-* included in all copies or substantial portions of the Software.[m
[31m-*[m
[31m-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-******************************************************************************/[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lua.hpp b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lua.hpp[m
[1mdeleted file mode 100644[m
[1mindex 07e9002..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lua.hpp[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-// C++ wrapper for LuaJIT header files.[m
[31m-[m
[31m-extern "C" {[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-#include "luajit.h"[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/luaconf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/luaconf.h[m
[1mdeleted file mode 100644[m
[1mindex 4f7d4d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/luaconf.h[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-/*[m
[31m-** Configuration header.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef luaconf_h[m
[31m-#define luaconf_h[m
[31m-[m
[31m-#ifndef WINVER[m
[31m-#define WINVER 0x0501[m
[31m-#endif[m
[31m-#include <limits.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-/* Default path for loading Lua and C modules with require(). */[m
[31m-#if defined(_WIN32)[m
[31m-/*[m
[31m-** In Windows, any exclamation mark ('!') in the path is replaced by the[m
[31m-** path of the directory of the executable file of the current process.[m
[31m-*/[m
[31m-#define LUA_LDIR	"!\\lua\\"[m
[31m-#define LUA_CDIR	"!\\"[m
[31m-#define LUA_PATH_DEFAULT \[m
[31m-  ".\\?.lua;" "!\\lualib\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;"[m
[31m-#define LUA_CPATH_DEFAULT \[m
[31m-  ".\\?.dll;" "!\\lualib\\?.so;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"[m
[31m-#else[m
[31m-/*[m
[31m-** Note to distribution maintainers: do NOT patch the following lines![m
[31m-** Please read ../doc/install.html#distro and pass PREFIX=/usr instead.[m
[31m-*/[m
[31m-#ifndef LUA_MULTILIB[m
[31m-#define LUA_MULTILIB	"lib"[m
[31m-#endif[m
[31m-#ifndef LUA_LMULTILIB[m
[31m-#define LUA_LMULTILIB	"lib"[m
[31m-#endif[m
[31m-#define LUA_LROOT	"/usr/local"[m
[31m-#define LUA_LUADIR	"/lua/5.1/"[m
[31m-#define LUA_LJDIR	"/luajit-2.1.0-beta2/"[m
[31m-[m
[31m-#ifdef LUA_ROOT[m
[31m-#define LUA_JROOT	LUA_ROOT[m
[31m-#define LUA_RLDIR	LUA_ROOT "/share" LUA_LUADIR[m
[31m-#define LUA_RCDIR	LUA_ROOT "/" LUA_MULTILIB LUA_LUADIR[m
[31m-#define LUA_RLPATH	";" LUA_RLDIR "?.lua;" LUA_RLDIR "?/init.lua"[m
[31m-#define LUA_RCPATH	";" LUA_RCDIR "?.so"[m
[31m-#else[m
[31m-#define LUA_JROOT	LUA_LROOT[m
[31m-#define LUA_RLPATH[m
[31m-#define LUA_RCPATH[m
[31m-#endif[m
[31m-[m
[31m-#define LUA_JPATH	";" LUA_JROOT "/share" LUA_LJDIR "?.lua"[m
[31m-#define LUA_LLDIR	LUA_LROOT "/share" LUA_LUADIR[m
[31m-#define LUA_LCDIR	LUA_LROOT "/" LUA_LMULTILIB LUA_LUADIR[m
[31m-#define LUA_LLPATH	";" LUA_LLDIR "?.lua;" LUA_LLDIR "?/init.lua"[m
[31m-#define LUA_LCPATH1	";" LUA_LCDIR "?.so"[m
[31m-#define LUA_LCPATH2	";" LUA_LCDIR "loadall.so"[m
[31m-[m
[31m-#define LUA_PATH_DEFAULT	"./?.lua" LUA_JPATH LUA_LLPATH LUA_RLPATH[m
[31m-#define LUA_CPATH_DEFAULT	"./?.so" LUA_LCPATH1 LUA_RCPATH LUA_LCPATH2[m
[31m-#endif[m
[31m-[m
[31m-/* Environment variable names for path overrides and initialization code. */[m
[31m-#define LUA_PATH	"LUA_PATH"[m
[31m-#define LUA_CPATH	"LUA_CPATH"[m
[31m-#define LUA_INIT	"LUA_INIT"[m
[31m-[m
[31m-/* Special file system characters. */[m
[31m-#if defined(_WIN32)[m
[31m-#define LUA_DIRSEP	"\\"[m
[31m-#else[m
[31m-#define LUA_DIRSEP	"/"[m
[31m-#endif[m
[31m-#define LUA_PATHSEP	";"[m
[31m-#define LUA_PATH_MARK	"?"[m
[31m-#define LUA_EXECDIR	"!"[m
[31m-#define LUA_IGMARK	"-"[m
[31m-#define LUA_PATH_CONFIG \[m
[31m-  LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" \[m
[31m-  LUA_EXECDIR "\n" LUA_IGMARK[m
[31m-[m
[31m-/* Quoting in error messages. */[m
[31m-#define LUA_QL(x)	"'" x "'"[m
[31m-#define LUA_QS		LUA_QL("%s")[m
[31m-[m
[31m-/* Various tunables. */[m
[31m-#define LUAI_MAXSTACK	65500	/* Max. # of stack slots for a thread (<64K). */[m
[31m-#define LUAI_MAXCSTACK	8000	/* Max. # of stack slots for a C func (<10K). */[m
[31m-#define LUAI_GCPAUSE	200	/* Pause GC until memory is at 200%. */[m
[31m-#define LUAI_GCMUL	200	/* Run GC at 200% of allocation speed. */[m
[31m-#define LUA_MAXCAPTURES	32	/* Max. pattern captures. */[m
[31m-[m
[31m-/* Compatibility with older library function names. */[m
[31m-#define LUA_COMPAT_MOD		/* OLD: math.mod, NEW: math.fmod */[m
[31m-#define LUA_COMPAT_GFIND	/* OLD: string.gfind, NEW: string.gmatch */[m
[31m-[m
[31m-/* Configuration for the frontend (the luajit executable). */[m
[31m-#if defined(luajit_c)[m
[31m-#define LUA_PROGNAME	"luajit"  /* Fallback frontend name. */[m
[31m-#define LUA_PROMPT	"> "	/* Interactive prompt. */[m
[31m-#define LUA_PROMPT2	">> "	/* Continuation prompt. */[m
[31m-#define LUA_MAXINPUT	512	/* Max. input line length. */[m
[31m-#endif[m
[31m-[m
[31m-/* Note: changing the following defines breaks the Lua 5.1 ABI. */[m
[31m-#define LUA_INTEGER	ptrdiff_t[m
[31m-#define LUA_IDSIZE	60	/* Size of lua_Debug.short_src. */[m
[31m-/*[m
[31m-** Size of lauxlib and io.* on-stack buffers. Weird workaround to avoid using[m
[31m-** unreasonable amounts of stack space, but still retain ABI compatibility.[m
[31m-** Blame Lua for depending on BUFSIZ in the ABI, blame **** for wrecking it.[m
[31m-*/[m
[31m-#define LUAL_BUFFERSIZE	(BUFSIZ > 16384 ? 8192 : BUFSIZ)[m
[31m-[m
[31m-/* The following defines are here only for compatibility with luaconf.h[m
[31m-** from the standard Lua distribution. They must not be changed for LuaJIT.[m
[31m-*/[m
[31m-#define LUA_NUMBER_DOUBLE[m
[31m-#define LUA_NUMBER		double[m
[31m-#define LUAI_UACNUMBER		double[m
[31m-#define LUA_NUMBER_SCAN		"%lf"[m
[31m-#define LUA_NUMBER_FMT		"%.14g"[m
[31m-#define lua_number2str(s, n)	sprintf((s), LUA_NUMBER_FMT, (n))[m
[31m-#define LUAI_MAXNUMBER2STR	32[m
[31m-#define LUA_INTFRMLEN		"l"[m
[31m-#define LUA_INTFRM_T		long[m
[31m-[m
[31m-/* Linkage of public API functions. */[m
[31m-#if defined(LUA_BUILD_AS_DLL)[m
[31m-#if defined(LUA_CORE) || defined(LUA_LIB)[m
[31m-#define LUA_API		__declspec(dllexport)[m
[31m-#else[m
[31m-#define LUA_API		__declspec(dllimport)[m
[31m-#endif[m
[31m-#else[m
[31m-#define LUA_API		extern[m
[31m-#endif[m
[31m-[m
[31m-#define LUALIB_API	LUA_API[m
[31m-[m
[31m-/* Support for internal assertions. */[m
[31m-#if defined(LUA_USE_ASSERT) || defined(LUA_USE_APICHECK)[m
[31m-#include <assert.h>[m
[31m-#endif[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-#define lua_assert(x)		assert(x)[m
[31m-#endif[m
[31m-#ifdef LUA_USE_APICHECK[m
[31m-#define luai_apicheck(L, o)	{ (void)L; assert(o); }[m
[31m-#else[m
[31m-#define luai_apicheck(L, o)	{ (void)L; }[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/luajit.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/luajit.h[m
[1mdeleted file mode 100644[m
[1mindex 1d0a558..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/luajit.h[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/[m
[31m-**[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-**[m
[31m-** Permission is hereby granted, free of charge, to any person obtaining[m
[31m-** a copy of this software and associated documentation files (the[m
[31m-** "Software"), to deal in the Software without restriction, including[m
[31m-** without limitation the rights to use, copy, modify, merge, publish,[m
[31m-** distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-** permit persons to whom the Software is furnished to do so, subject to[m
[31m-** the following conditions:[m
[31m-**[m
[31m-** The above copyright notice and this permission notice shall be[m
[31m-** included in all copies or substantial portions of the Software.[m
[31m-**[m
[31m-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-**[m
[31m-** [ MIT license: http://www.opensource.org/licenses/mit-license.php ][m
[31m-*/[m
[31m-[m
[31m-#ifndef _LUAJIT_H[m
[31m-#define _LUAJIT_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#define LUAJIT_VERSION		"LuaJIT 2.1.0-beta2"[m
[31m-#define LUAJIT_VERSION_NUM	20100  /* Version 2.1.0 = 02.01.00. */[m
[31m-#define LUAJIT_VERSION_SYM	luaJIT_version_2_1_0_beta2[m
[31m-#define LUAJIT_COPYRIGHT	"Copyright (C) 2005-2016 Mike Pall"[m
[31m-#define LUAJIT_URL		"http://luajit.org/"[m
[31m-[m
[31m-/* Modes for luaJIT_setmode. */[m
[31m-#define LUAJIT_MODE_MASK	0x00ff[m
[31m-[m
[31m-enum {[m
[31m-  LUAJIT_MODE_ENGINE,		/* Set mode for whole JIT engine. */[m
[31m-  LUAJIT_MODE_DEBUG,		/* Set debug mode (idx = level). */[m
[31m-[m
[31m-  LUAJIT_MODE_FUNC,		/* Change mode for a function. */[m
[31m-  LUAJIT_MODE_ALLFUNC,		/* Recurse into subroutine protos. */[m
[31m-  LUAJIT_MODE_ALLSUBFUNC,	/* Change only the subroutines. */[m
[31m-[m
[31m-  LUAJIT_MODE_TRACE,		/* Flush a compiled trace. */[m
[31m-[m
[31m-  LUAJIT_MODE_WRAPCFUNC = 0x10,	/* Set wrapper mode for C function calls. */[m
[31m-[m
[31m-  LUAJIT_MODE_MAX[m
[31m-};[m
[31m-[m
[31m-/* Flags or'ed in to the mode. */[m
[31m-#define LUAJIT_MODE_OFF		0x0000	/* Turn feature off. */[m
[31m-#define LUAJIT_MODE_ON		0x0100	/* Turn feature on. */[m
[31m-#define LUAJIT_MODE_FLUSH	0x0200	/* Flush JIT-compiled code. */[m
[31m-[m
[31m-/* LuaJIT public C API. */[m
[31m-[m
[31m-/* Control the JIT engine. */[m
[31m-LUA_API int luaJIT_setmode(lua_State *L, int idx, int mode);[m
[31m-[m
[31m-/* Low-overhead profiling API. */[m
[31m-typedef void (*luaJIT_profile_callback)(void *data, lua_State *L,[m
[31m-					int samples, int vmstate);[m
[31m-LUA_API void luaJIT_profile_start(lua_State *L, const char *mode,[m
[31m-				  luaJIT_profile_callback cb, void *data);[m
[31m-LUA_API void luaJIT_profile_stop(lua_State *L);[m
[31m-LUA_API const char *luaJIT_profile_dumpstack(lua_State *L, const char *fmt,[m
[31m-					     int depth, size_t *len);[m
[31m-[m
[31m-/* Enforce (dynamic) linker error for version mismatches. Call from main. */[m
[31m-LUA_API void LUAJIT_VERSION_SYM(void);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lualib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lualib.h[m
[1mdeleted file mode 100644[m
[1mindex 3a54955..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1/lualib.h[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/*[m
[31m-** Standard library header.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LUALIB_H[m
[31m-#define _LUALIB_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#define LUA_FILEHANDLE	"FILE*"[m
[31m-[m
[31m-#define LUA_COLIBNAME	"coroutine"[m
[31m-#define LUA_MATHLIBNAME	"math"[m
[31m-#define LUA_STRLIBNAME	"string"[m
[31m-#define LUA_TABLIBNAME	"table"[m
[31m-#define LUA_IOLIBNAME	"io"[m
[31m-#define LUA_OSLIBNAME	"os"[m
[31m-#define LUA_LOADLIBNAME	"package"[m
[31m-#define LUA_DBLIBNAME	"debug"[m
[31m-#define LUA_BITLIBNAME	"bit"[m
[31m-#define LUA_JITLIBNAME	"jit"[m
[31m-#define LUA_FFILIBNAME	"ffi"[m
[31m-[m
[31m-LUALIB_API int luaopen_base(lua_State *L);[m
[31m-LUALIB_API int luaopen_math(lua_State *L);[m
[31m-LUALIB_API int luaopen_string(lua_State *L);[m
[31m-LUALIB_API int luaopen_table(lua_State *L);[m
[31m-LUALIB_API int luaopen_io(lua_State *L);[m
[31m-LUALIB_API int luaopen_os(lua_State *L);[m
[31m-LUALIB_API int luaopen_package(lua_State *L);[m
[31m-LUALIB_API int luaopen_debug(lua_State *L);[m
[31m-LUALIB_API int luaopen_bit(lua_State *L);[m
[31m-LUALIB_API int luaopen_jit(lua_State *L);[m
[31m-LUALIB_API int luaopen_ffi(lua_State *L);[m
[31m-[m
[31m-LUALIB_API void luaL_openlibs(lua_State *L);[m
[31m-[m
[31m-#ifndef lua_assert[m
[31m-#define lua_assert(x)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.a b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.a[m
[1mdeleted file mode 100644[m
[1mindex be483b1..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.a and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so[m
[1mdeleted file mode 120000[m
[1mindex 99e43d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-libluajit-5.1.so.2.1.0[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so.2 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so.2[m
[1mdeleted file mode 120000[m
[1mindex 99e43d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so.2[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-libluajit-5.1.so.2.1.0[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so.2.1.0 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so.2.1.0[m
[1mdeleted file mode 100755[m
[1mindex 0f79f0f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/libluajit-5.1.so.2.1.0 and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/pkgconfig/luajit.pc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/pkgconfig/luajit.pc[m
[1mdeleted file mode 100644[m
[1mindex 4a6eca0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib/pkgconfig/luajit.pc[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-# Package information for LuaJIT to be used by pkg-config.[m
[31m-majver=2[m
[31m-minver=1[m
[31m-relver=0[m
[31m-version=${majver}.${minver}.${relver}-beta2[m
[31m-abiver=5.1[m
[31m-[m
[31m-prefix=/usr/local/openresty/luajit[m
[31m-multilib=lib[m
[31m-exec_prefix=${prefix}[m
[31m-libdir=${exec_prefix}/${multilib}[m
[31m-libname=luajit-${abiver}[m
[31m-includedir=${prefix}/include/luajit-${majver}.${minver}[m
[31m-[m
[31m-INSTALL_LMOD=${prefix}/share/lua/${abiver}[m
[31m-INSTALL_CMOD=${prefix}/${multilib}/lua/${abiver}[m
[31m-[m
[31m-Name: LuaJIT[m
[31m-Description: Just-in-time compiler for Lua[m
[31m-URL: http://luajit.org[m
[31m-Version: ${version}[m
[31m-Requires:[m
[31m-Libs: -L${libdir} -l${libname}[m
[31m-Libs.private: -Wl,-E -lm -ldl[m
[31m-Cflags: -I${includedir}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/bc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/bc.lua[m
[1mdeleted file mode 100644[m
[1mindex a8cb849..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/bc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT bytecode listing module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module lists the bytecode of a Lua function. If it's loaded by -jbc[m
[31m--- it hooks into the parser and lists all functions of a chunk as they[m
[31m--- are parsed.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jbc -e 'local x=0; for i=1,1e6 do x=x+i end; print(x)'[m
[31m---   luajit -jbc=- foo.lua[m
[31m---   luajit -jbc=foo.list foo.lua[m
[31m---[m
[31m--- Default output is to stderr. To redirect the output to a file, pass a[m
[31m--- filename as an argument (use '-' for stdout) or set the environment[m
[31m--- variable LUAJIT_LISTFILE. The file is overwritten every time the module[m
[31m--- is started.[m
[31m---[m
[31m--- This module can also be used programmatically:[m
[31m---[m
[31m---   local bc = require("jit.bc")[m
[31m---[m
[31m---   local function foo() print("hello") end[m
[31m---[m
[31m---   bc.dump(foo)           --> -- BYTECODE -- [...][m
[31m---   print(bc.line(foo, 2)) --> 0002    KSTR     1   1      ; "hello"[m
[31m---[m
[31m---   local out = {[m
[31m---     -- Do something with each line:[m
[31m---     write = function(t, ...) io.write(...) end,[m
[31m---     close = function(t) end,[m
[31m---     flush = function(t) end,[m
[31m---   }[m
[31m---   bc.dump(foo, out)[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local bit = require("bit")[m
[31m-local sub, gsub, format = string.sub, string.gsub, string.format[m
[31m-local byte, band, shr = string.byte, bit.band, bit.rshift[m
[31m-local funcinfo, funcbc, funck = jutil.funcinfo, jutil.funcbc, jutil.funck[m
[31m-local funcuvname = jutil.funcuvname[m
[31m-local bcnames = vmdef.bcnames[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function ctlsub(c)[m
[31m-  if c == "\n" then return "\\n"[m
[31m-  elseif c == "\r" then return "\\r"[m
[31m-  elseif c == "\t" then return "\\t"[m
[31m-  else return format("\\%03d", byte(c))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Return one bytecode line.[m
[31m-local function bcline(func, pc, prefix)[m
[31m-  local ins, m = funcbc(func, pc)[m
[31m-  if not ins then return end[m
[31m-  local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128)[m
[31m-  local a = band(shr(ins, 8), 0xff)[m
[31m-  local oidx = 6*band(ins, 0xff)[m
[31m-  local op = sub(bcnames, oidx+1, oidx+6)[m
[31m-  local s = format("%04d %s %-6s %3s ",[m
[31m-    pc, prefix or "  ", op, ma == 0 and "" or a)[m
[31m-  local d = shr(ins, 16)[m
[31m-  if mc == 13*128 then -- BCMjump[m
[31m-    return format("%s=> %04d\n", s, pc+d-0x7fff)[m
[31m-  end[m
[31m-  if mb ~= 0 then[m
[31m-    d = band(d, 0xff)[m
[31m-  elseif mc == 0 then[m
[31m-    return s.."\n"[m
[31m-  end[m
[31m-  local kc[m
[31m-  if mc == 10*128 then -- BCMstr[m
[31m-    kc = funck(func, -d-1)[m
[31m-    kc = format(#kc > 40 and '"%.40s"~' or '"%s"', gsub(kc, "%c", ctlsub))[m
[31m-  elseif mc == 9*128 then -- BCMnum[m
[31m-    kc = funck(func, d)[m
[31m-    if op == "TSETM " then kc = kc - 2^52 end[m
[31m-  elseif mc == 12*128 then -- BCMfunc[m
[31m-    local fi = funcinfo(funck(func, -d-1))[m
[31m-    if fi.ffid then[m
[31m-      kc = vmdef.ffnames[fi.ffid][m
[31m-    else[m
[31m-      kc = fi.loc[m
[31m-    end[m
[31m-  elseif mc == 5*128 then -- BCMuv[m
[31m-    kc = funcuvname(func, d)[m
[31m-  end[m
[31m-  if ma == 5 then -- BCMuv[m
[31m-    local ka = funcuvname(func, a)[m
[31m-    if kc then kc = ka.." ; "..kc else kc = ka end[m
[31m-  end[m
[31m-  if mb ~= 0 then[m
[31m-    local b = shr(ins, 24)[m
[31m-    if kc then return format("%s%3d %3d  ; %s\n", s, b, d, kc) end[m
[31m-    return format("%s%3d %3d\n", s, b, d)[m
[31m-  end[m
[31m-  if kc then return format("%s%3d      ; %s\n", s, d, kc) end[m
[31m-  if mc == 7*128 and d > 32767 then d = d - 65536 end -- BCMlits[m
[31m-  return format("%s%3d\n", s, d)[m
[31m-end[m
[31m-[m
[31m--- Collect branch targets of a function.[m
[31m-local function bctargets(func)[m
[31m-  local target = {}[m
[31m-  for pc=1,1000000000 do[m
[31m-    local ins, m = funcbc(func, pc)[m
[31m-    if not ins then break end[m
[31m-    if band(m, 15*128) == 13*128 then target[pc+shr(ins, 16)-0x7fff] = true end[m
[31m-  end[m
[31m-  return target[m
[31m-end[m
[31m-[m
[31m--- Dump bytecode instructions of a function.[m
[31m-local function bcdump(func, out, all)[m
[31m-  if not out then out = stdout end[m
[31m-  local fi = funcinfo(func)[m
[31m-  if all and fi.children then[m
[31m-    for n=-1,-1000000000,-1 do[m
[31m-      local k = funck(func, n)[m
[31m-      if not k then break end[m
[31m-      if type(k) == "proto" then bcdump(k, out, true) end[m
[31m-    end[m
[31m-  end[m
[31m-  out:write(format("-- BYTECODE -- %s-%d\n", fi.loc, fi.lastlinedefined))[m
[31m-  local target = bctargets(func)[m
[31m-  for pc=1,1000000000 do[m
[31m-    local s = bcline(func, pc, target[pc] and "=>")[m
[31m-    if not s then break end[m
[31m-    out:write(s)[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-  out:flush()[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Active flag and output file handle.[m
[31m-local active, out[m
[31m-[m
[31m--- List handler.[m
[31m-local function h_list(func)[m
[31m-  return bcdump(func, out)[m
[31m-end[m
[31m-[m
[31m--- Detach list handler.[m
[31m-local function bclistoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(h_list)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach list handler.[m
[31m-local function bcliston(outfile)[m
[31m-  if active then bclistoff() end[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_LISTFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stderr[m
[31m-  end[m
[31m-  jit.attach(h_list, "bc")[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  line = bcline,[m
[31m-  dump = bcdump,[m
[31m-  targets = bctargets,[m
[31m-  on = bcliston,[m
[31m-  off = bclistoff,[m
[31m-  start = bcliston -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/bcsave.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/bcsave.lua[m
[1mdeleted file mode 100644[m
[1mindex d0968b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/bcsave.lua[m
[1m+++ /dev/null[m
[36m@@ -1,661 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT module to save/list bytecode.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module saves or lists the bytecode for an input file.[m
[31m--- It's run by the -b command line option.[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local bit = require("bit")[m
[31m-[m
[31m--- Symbol name prefix for LuaJIT bytecode.[m
[31m-local LJBC_PREFIX = "luaJIT_BC_"[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function usage()[m
[31m-  io.stderr:write[[[m
[31m-Save LuaJIT bytecode: luajit -b[options] input output[m
[31m-  -l        Only list bytecode.[m
[31m-  -s        Strip debug info (default).[m
[31m-  -g        Keep debug info.[m
[31m-  -n name   Set module name (default: auto-detect from input name).[m
[31m-  -t type   Set output file type (default: auto-detect from output name).[m
[31m-  -a arch   Override architecture for object files (default: native).[m
[31m-  -o os     Override OS for object files (default: native).[m
[31m-  -e chunk  Use chunk string as input.[m
[31m-  --        Stop handling options.[m
[31m-  -         Use stdin as input and/or stdout as output.[m
[31m-[m
[31m-File types: c h obj o raw (default)[m
[31m-]][m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function check(ok, ...)[m
[31m-  if ok then return ok, ... end[m
[31m-  io.stderr:write("luajit: ", ...)[m
[31m-  io.stderr:write("\n")[m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function readfile(input)[m
[31m-  if type(input) == "function" then return input end[m
[31m-  if input == "-" then input = nil end[m
[31m-  return check(loadfile(input))[m
[31m-end[m
[31m-[m
[31m-local function savefile(name, mode)[m
[31m-  if name == "-" then return io.stdout end[m
[31m-  return check(io.open(name, mode))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_type = {[m
[31m-  raw = "raw", c = "c", h = "h", o = "obj", obj = "obj",[m
[31m-}[m
[31m-[m
[31m-local map_arch = {[m
[31m-  x86 = true, x64 = true, arm = true, arm64 = true, ppc = true,[m
[31m-  mips = true, mipsel = true,[m
[31m-}[m
[31m-[m
[31m-local map_os = {[m
[31m-  linux = true, windows = true, osx = true, freebsd = true, netbsd = true,[m
[31m-  openbsd = true, dragonfly = true, solaris = true,[m
[31m-}[m
[31m-[m
[31m-local function checkarg(str, map, err)[m
[31m-  str = string.lower(str)[m
[31m-  local s = check(map[str], "unknown ", err)[m
[31m-  return s == true and str or s[m
[31m-end[m
[31m-[m
[31m-local function detecttype(str)[m
[31m-  local ext = string.match(string.lower(str), "%.(%a+)$")[m
[31m-  return map_type[ext] or "raw"[m
[31m-end[m
[31m-[m
[31m-local function checkmodname(str)[m
[31m-  check(string.match(str, "^[%w_.%-]+$"), "bad module name")[m
[31m-  return string.gsub(str, "[%.%-]", "_")[m
[31m-end[m
[31m-[m
[31m-local function detectmodname(str)[m
[31m-  if type(str) == "string" then[m
[31m-    local tail = string.match(str, "[^/\\]+$")[m
[31m-    if tail then str = tail end[m
[31m-    local head = string.match(str, "^(.*)%.[^.]*$")[m
[31m-    if head then str = head end[m
[31m-    str = string.match(str, "^[%w_.%-]+")[m
[31m-  else[m
[31m-    str = nil[m
[31m-  end[m
[31m-  check(str, "cannot derive module name, use -n name")[m
[31m-  return string.gsub(str, "[%.%-]", "_")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function bcsave_tail(fp, output, s)[m
[31m-  local ok, err = fp:write(s)[m
[31m-  if ok and output ~= "-" then ok, err = fp:close() end[m
[31m-  check(ok, "cannot write ", output, ": ", err)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_raw(output, s)[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_c(ctx, output, s)[m
[31m-  local fp = savefile(output, "w")[m
[31m-  if ctx.type == "c" then[m
[31m-    fp:write(string.format([[[m
[31m-#ifdef _cplusplus[m
[31m-extern "C"[m
[31m-#endif[m
[31m-#ifdef _WIN32[m
[31m-__declspec(dllexport)[m
[31m-#endif[m
[31m-const char %s%s[] = {[m
[31m-]], LJBC_PREFIX, ctx.modname))[m
[31m-  else[m
[31m-    fp:write(string.format([[[m
[31m-#define %s%s_SIZE %d[m
[31m-static const char %s%s[] = {[m
[31m-]], LJBC_PREFIX, ctx.modname, #s, LJBC_PREFIX, ctx.modname))[m
[31m-  end[m
[31m-  local t, n, m = {}, 0, 0[m
[31m-  for i=1,#s do[m
[31m-    local b = tostring(string.byte(s, i))[m
[31m-    m = m + #b + 1[m
[31m-    if m > 78 then[m
[31m-      fp:write(table.concat(t, ",", 1, n), ",\n")[m
[31m-      n, m = 0, #b + 1[m
[31m-    end[m
[31m-    n = n + 1[m
[31m-    t[n] = b[m
[31m-  end[m
[31m-  bcsave_tail(fp, output, table.concat(t, ",", 1, n).."\n};\n")[m
[31m-end[m
[31m-[m
[31m-local function bcsave_elfobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct {[m
[31m-  uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7];[m
[31m-  uint16_t type, machine;[m
[31m-  uint32_t version;[m
[31m-  uint32_t entry, phofs, shofs;[m
[31m-  uint32_t flags;[m
[31m-  uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx;[m
[31m-} ELF32header;[m
[31m-typedef struct {[m
[31m-  uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7];[m
[31m-  uint16_t type, machine;[m
[31m-  uint32_t version;[m
[31m-  uint64_t entry, phofs, shofs;[m
[31m-  uint32_t flags;[m
[31m-  uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx;[m
[31m-} ELF64header;[m
[31m-typedef struct {[m
[31m-  uint32_t name, type, flags, addr, ofs, size, link, info, align, entsize;[m
[31m-} ELF32sectheader;[m
[31m-typedef struct {[m
[31m-  uint32_t name, type;[m
[31m-  uint64_t flags, addr, ofs, size;[m
[31m-  uint32_t link, info;[m
[31m-  uint64_t align, entsize;[m
[31m-} ELF64sectheader;[m
[31m-typedef struct {[m
[31m-  uint32_t name, value, size;[m
[31m-  uint8_t info, other;[m
[31m-  uint16_t sectidx;[m
[31m-} ELF32symbol;[m
[31m-typedef struct {[m
[31m-  uint32_t name;[m
[31m-  uint8_t info, other;[m
[31m-  uint16_t sectidx;[m
[31m-  uint64_t value, size;[m
[31m-} ELF64symbol;[m
[31m-typedef struct {[m
[31m-  ELF32header hdr;[m
[31m-  ELF32sectheader sect[6];[m
[31m-  ELF32symbol sym[2];[m
[31m-  uint8_t space[4096];[m
[31m-} ELF32obj;[m
[31m-typedef struct {[m
[31m-  ELF64header hdr;[m
[31m-  ELF64sectheader sect[6];[m
[31m-  ELF64symbol sym[2];[m
[31m-  uint8_t space[4096];[m
[31m-} ELF64obj;[m
[31m-]][m
[31m-  local symname = LJBC_PREFIX..ctx.modname[m
[31m-  local is64, isbe = false, false[m
[31m-  if ctx.arch == "x64" or ctx.arch == "arm64" then[m
[31m-    is64 = true[m
[31m-  elseif ctx.arch == "ppc" or ctx.arch == "mips" then[m
[31m-    isbe = true[m
[31m-  end[m
[31m-[m
[31m-  -- Handle different host/target endianess.[m
[31m-  local function f32(x) return x end[m
[31m-  local f16, fofs = f32, f32[m
[31m-  if ffi.abi("be") ~= isbe then[m
[31m-    f32 = bit.bswap[m
[31m-    function f16(x) return bit.rshift(bit.bswap(x), 16) end[m
[31m-    if is64 then[m
[31m-      local two32 = ffi.cast("int64_t", 2^32)[m
[31m-      function fofs(x) return bit.bswap(x)*two32 end[m
[31m-    else[m
[31m-      fofs = f32[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  -- Create ELF object and fill in header.[m
[31m-  local o = ffi.new(is64 and "ELF64obj" or "ELF32obj")[m
[31m-  local hdr = o.hdr[m
[31m-  if ctx.os == "bsd" or ctx.os == "other" then -- Determine native hdr.eosabi.[m
[31m-    local bf = assert(io.open("/bin/ls", "rb"))[m
[31m-    local bs = bf:read(9)[m
[31m-    bf:close()[m
[31m-    ffi.copy(o, bs, 9)[m
[31m-    check(hdr.emagic[0] == 127, "no support for writing native object files")[m
[31m-  else[m
[31m-    hdr.emagic = "\127ELF"[m
[31m-    hdr.eosabi = ({ freebsd=9, netbsd=2, openbsd=12, solaris=6 })[ctx.os] or 0[m
[31m-  end[m
[31m-  hdr.eclass = is64 and 2 or 1[m
[31m-  hdr.eendian = isbe and 2 or 1[m
[31m-  hdr.eversion = 1[m
[31m-  hdr.type = f16(1)[m
[31m-  hdr.machine = f16(({ x86=3, x64=62, arm=40, arm64=183, ppc=20, mips=8, mipsel=8 })[ctx.arch])[m
[31m-  if ctx.arch == "mips" or ctx.arch == "mipsel" then[m
[31m-    hdr.flags = 0x50001006[m
[31m-  end[m
[31m-  hdr.version = f32(1)[m
[31m-  hdr.shofs = fofs(ffi.offsetof(o, "sect"))[m
[31m-  hdr.ehsize = f16(ffi.sizeof(hdr))[m
[31m-  hdr.shentsize = f16(ffi.sizeof(o.sect[0]))[m
[31m-  hdr.shnum = f16(6)[m
[31m-  hdr.shstridx = f16(2)[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  local sofs, ofs = ffi.offsetof(o, "space"), 1[m
[31m-  for i,name in ipairs{[m
[31m-      ".symtab", ".shstrtab", ".strtab", ".rodata", ".note.GNU-stack",[m
[31m-    } do[m
[31m-    local sect = o.sect[i][m
[31m-    sect.align = fofs(1)[m
[31m-    sect.name = f32(ofs)[m
[31m-    ffi.copy(o.space+ofs, name)[m
[31m-    ofs = ofs + #name+1[m
[31m-  end[m
[31m-  o.sect[1].type = f32(2) -- .symtab[m
[31m-  o.sect[1].link = f32(3)[m
[31m-  o.sect[1].info = f32(1)[m
[31m-  o.sect[1].align = fofs(8)[m
[31m-  o.sect[1].ofs = fofs(ffi.offsetof(o, "sym"))[m
[31m-  o.sect[1].entsize = fofs(ffi.sizeof(o.sym[0]))[m
[31m-  o.sect[1].size = fofs(ffi.sizeof(o.sym))[m
[31m-  o.sym[1].name = f32(1)[m
[31m-  o.sym[1].sectidx = f16(4)[m
[31m-  o.sym[1].size = fofs(#s)[m
[31m-  o.sym[1].info = 17[m
[31m-  o.sect[2].type = f32(3) -- .shstrtab[m
[31m-  o.sect[2].ofs = fofs(sofs)[m
[31m-  o.sect[2].size = fofs(ofs)[m
[31m-  o.sect[3].type = f32(3) -- .strtab[m
[31m-  o.sect[3].ofs = fofs(sofs + ofs)[m
[31m-  o.sect[3].size = fofs(#symname+1)[m
[31m-  ffi.copy(o.space+ofs+1, symname)[m
[31m-  ofs = ofs + #symname + 2[m
[31m-  o.sect[4].type = f32(1) -- .rodata[m
[31m-  o.sect[4].flags = fofs(2)[m
[31m-  o.sect[4].ofs = fofs(sofs + ofs)[m
[31m-  o.sect[4].size = fofs(#s)[m
[31m-  o.sect[5].type = f32(1) -- .note.GNU-stack[m
[31m-  o.sect[5].ofs = fofs(sofs + ofs + #s)[m
[31m-[m
[31m-  -- Write ELF object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_peobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct {[m
[31m-  uint16_t arch, nsects;[m
[31m-  uint32_t time, symtabofs, nsyms;[m
[31m-  uint16_t opthdrsz, flags;[m
[31m-} PEheader;[m
[31m-typedef struct {[m
[31m-  char name[8];[m
[31m-  uint32_t vsize, vaddr, size, ofs, relocofs, lineofs;[m
[31m-  uint16_t nreloc, nline;[m
[31m-  uint32_t flags;[m
[31m-} PEsection;[m
[31m-typedef struct __attribute((packed)) {[m
[31m-  union {[m
[31m-    char name[8];[m
[31m-    uint32_t nameref[2];[m
[31m-  };[m
[31m-  uint32_t value;[m
[31m-  int16_t sect;[m
[31m-  uint16_t type;[m
[31m-  uint8_t scl, naux;[m
[31m-} PEsym;[m
[31m-typedef struct __attribute((packed)) {[m
[31m-  uint32_t size;[m
[31m-  uint16_t nreloc, nline;[m
[31m-  uint32_t cksum;[m
[31m-  uint16_t assoc;[m
[31m-  uint8_t comdatsel, unused[3];[m
[31m-} PEsymaux;[m
[31m-typedef struct {[m
[31m-  PEheader hdr;[m
[31m-  PEsection sect[2];[m
[31m-  // Must be an even number of symbol structs.[m
[31m-  PEsym sym0;[m
[31m-  PEsymaux sym0aux;[m
[31m-  PEsym sym1;[m
[31m-  PEsymaux sym1aux;[m
[31m-  PEsym sym2;[m
[31m-  PEsym sym3;[m
[31m-  uint32_t strtabsize;[m
[31m-  uint8_t space[4096];[m
[31m-} PEobj;[m
[31m-]][m
[31m-  local symname = LJBC_PREFIX..ctx.modname[m
[31m-  local is64 = false[m
[31m-  if ctx.arch == "x86" then[m
[31m-    symname = "_"..symname[m
[31m-  elseif ctx.arch == "x64" then[m
[31m-    is64 = true[m
[31m-  end[m
[31m-  local symexport = "   /EXPORT:"..symname..",DATA "[m
[31m-[m
[31m-  -- The file format is always little-endian. Swap if the host is big-endian.[m
[31m-  local function f32(x) return x end[m
[31m-  local f16 = f32[m
[31m-  if ffi.abi("be") then[m
[31m-    f32 = bit.bswap[m
[31m-    function f16(x) return bit.rshift(bit.bswap(x), 16) end[m
[31m-  end[m
[31m-[m
[31m-  -- Create PE object and fill in header.[m
[31m-  local o = ffi.new("PEobj")[m
[31m-  local hdr = o.hdr[m
[31m-  hdr.arch = f16(({ x86=0x14c, x64=0x8664, arm=0x1c0, ppc=0x1f2, mips=0x366, mipsel=0x366 })[ctx.arch])[m
[31m-  hdr.nsects = f16(2)[m
[31m-  hdr.symtabofs = f32(ffi.offsetof(o, "sym0"))[m
[31m-  hdr.nsyms = f32(6)[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  o.sect[0].name = ".drectve"[m
[31m-  o.sect[0].size = f32(#symexport)[m
[31m-  o.sect[0].flags = f32(0x00100a00)[m
[31m-  o.sym0.sect = f16(1)[m
[31m-  o.sym0.scl = 3[m
[31m-  o.sym0.name = ".drectve"[m
[31m-  o.sym0.naux = 1[m
[31m-  o.sym0aux.size = f32(#symexport)[m
[31m-  o.sect[1].name = ".rdata"[m
[31m-  o.sect[1].size = f32(#s)[m
[31m-  o.sect[1].flags = f32(0x40300040)[m
[31m-  o.sym1.sect = f16(2)[m
[31m-  o.sym1.scl = 3[m
[31m-  o.sym1.name = ".rdata"[m
[31m-  o.sym1.naux = 1[m
[31m-  o.sym1aux.size = f32(#s)[m
[31m-  o.sym2.sect = f16(2)[m
[31m-  o.sym2.scl = 2[m
[31m-  o.sym2.nameref[1] = f32(4)[m
[31m-  o.sym3.sect = f16(-1)[m
[31m-  o.sym3.scl = 2[m
[31m-  o.sym3.value = f32(1)[m
[31m-  o.sym3.name = "@feat.00" -- Mark as SafeSEH compliant.[m
[31m-  ffi.copy(o.space, symname)[m
[31m-  local ofs = #symname + 1[m
[31m-  o.strtabsize = f32(ofs + 4)[m
[31m-  o.sect[0].ofs = f32(ffi.offsetof(o, "space") + ofs)[m
[31m-  ffi.copy(o.space + ofs, symexport)[m
[31m-  ofs = ofs + #symexport[m
[31m-  o.sect[1].ofs = f32(ffi.offsetof(o, "space") + ofs)[m
[31m-[m
[31m-  -- Write PE object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_machobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags;[m
[31m-} mach_header;[m
[31m-typedef struct[m
[31m-{[m
[31m-  mach_header; uint32_t reserved;[m
[31m-} mach_header_64;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize;[m
[31m-  char segname[16];[m
[31m-  uint32_t vmaddr, vmsize, fileoff, filesize;[m
[31m-  uint32_t maxprot, initprot, nsects, flags;[m
[31m-} mach_segment_command;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize;[m
[31m-  char segname[16];[m
[31m-  uint64_t vmaddr, vmsize, fileoff, filesize;[m
[31m-  uint32_t maxprot, initprot, nsects, flags;[m
[31m-} mach_segment_command_64;[m
[31m-typedef struct {[m
[31m-  char sectname[16], segname[16];[m
[31m-  uint32_t addr, size;[m
[31m-  uint32_t offset, align, reloff, nreloc, flags;[m
[31m-  uint32_t reserved1, reserved2;[m
[31m-} mach_section;[m
[31m-typedef struct {[m
[31m-  char sectname[16], segname[16];[m
[31m-  uint64_t addr, size;[m
[31m-  uint32_t offset, align, reloff, nreloc, flags;[m
[31m-  uint32_t reserved1, reserved2, reserved3;[m
[31m-} mach_section_64;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize, symoff, nsyms, stroff, strsize;[m
[31m-} mach_symtab_command;[m
[31m-typedef struct {[m
[31m-  int32_t strx;[m
[31m-  uint8_t type, sect;[m
[31m-  int16_t desc;[m
[31m-  uint32_t value;[m
[31m-} mach_nlist;[m
[31m-typedef struct {[m
[31m-  uint32_t strx;[m
[31m-  uint8_t type, sect;[m
[31m-  uint16_t desc;[m
[31m-  uint64_t value;[m
[31m-} mach_nlist_64;[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t magic, nfat_arch;[m
[31m-} mach_fat_header;[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t cputype, cpusubtype, offset, size, align;[m
[31m-} mach_fat_arch;[m
[31m-typedef struct {[m
[31m-  struct {[m
[31m-    mach_header hdr;[m
[31m-    mach_segment_command seg;[m
[31m-    mach_section sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[1];[m
[31m-  mach_nlist sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_obj;[m
[31m-typedef struct {[m
[31m-  struct {[m
[31m-    mach_header_64 hdr;[m
[31m-    mach_segment_command_64 seg;[m
[31m-    mach_section_64 sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[1];[m
[31m-  mach_nlist_64 sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_obj_64;[m
[31m-typedef struct {[m
[31m-  mach_fat_header fat;[m
[31m-  mach_fat_arch fat_arch[2];[m
[31m-  struct {[m
[31m-    mach_header hdr;[m
[31m-    mach_segment_command seg;[m
[31m-    mach_section sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[2];[m
[31m-  mach_nlist sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_fat_obj;[m
[31m-]][m
[31m-  local symname = '_'..LJBC_PREFIX..ctx.modname[m
[31m-  local isfat, is64, align, mobj = false, false, 4, "mach_obj"[m
[31m-  if ctx.arch == "x64" then[m
[31m-    is64, align, mobj = true, 8, "mach_obj_64"[m
[31m-  elseif ctx.arch == "arm" then[m
[31m-    isfat, mobj = true, "mach_fat_obj"[m
[31m-  elseif ctx.arch == "arm64" then[m
[31m-    is64, align, isfat, mobj = true, 8, true, "mach_fat_obj"[m
[31m-  else[m
[31m-    check(ctx.arch == "x86", "unsupported architecture for OSX")[m
[31m-  end[m
[31m-  local function aligned(v, a) return bit.band(v+a-1, -a) end[m
[31m-  local be32 = bit.bswap -- Mach-O FAT is BE, supported archs are LE.[m
[31m-[m
[31m-  -- Create Mach-O object and fill in header.[m
[31m-  local o = ffi.new(mobj)[m
[31m-  local mach_size = aligned(ffi.offsetof(o, "space")+#symname+2, align)[m
[31m-  local cputype = ({ x86={7}, x64={0x01000007}, arm={7,12}, arm64={0x01000007,0x0100000c} })[ctx.arch][m
[31m-  local cpusubtype = ({ x86={3}, x64={3}, arm={3,9}, arm64={3,0} })[ctx.arch][m
[31m-  if isfat then[m
[31m-    o.fat.magic = be32(0xcafebabe)[m
[31m-    o.fat.nfat_arch = be32(#cpusubtype)[m
[31m-  end[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  for i=0,#cpusubtype-1 do[m
[31m-    local ofs = 0[m
[31m-    if isfat then[m
[31m-      local a = o.fat_arch[i][m
[31m-      a.cputype = be32(cputype[i+1])[m
[31m-      a.cpusubtype = be32(cpusubtype[i+1])[m
[31m-      -- Subsequent slices overlap each other to share data.[m
[31m-      ofs = ffi.offsetof(o, "arch") + i*ffi.sizeof(o.arch[0])[m
[31m-      a.offset = be32(ofs)[m
[31m-      a.size = be32(mach_size-ofs+#s)[m
[31m-    end[m
[31m-    local a = o.arch[i][m
[31m-    a.hdr.magic = is64 and 0xfeedfacf or 0xfeedface[m
[31m-    a.hdr.cputype = cputype[i+1][m
[31m-    a.hdr.cpusubtype = cpusubtype[i+1][m
[31m-    a.hdr.filetype = 1[m
[31m-    a.hdr.ncmds = 2[m
[31m-    a.hdr.sizeofcmds = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)+ffi.sizeof(a.sym)[m
[31m-    a.seg.cmd = is64 and 0x19 or 0x1[m
[31m-    a.seg.cmdsize = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)[m
[31m-    a.seg.vmsize = #s[m
[31m-    a.seg.fileoff = mach_size-ofs[m
[31m-    a.seg.filesize = #s[m
[31m-    a.seg.maxprot = 1[m
[31m-    a.seg.initprot = 1[m
[31m-    a.seg.nsects = 1[m
[31m-    ffi.copy(a.sec.sectname, "__data")[m
[31m-    ffi.copy(a.sec.segname, "__DATA")[m
[31m-    a.sec.size = #s[m
[31m-    a.sec.offset = mach_size-ofs[m
[31m-    a.sym.cmd = 2[m
[31m-    a.sym.cmdsize = ffi.sizeof(a.sym)[m
[31m-    a.sym.symoff = ffi.offsetof(o, "sym_entry")-ofs[m
[31m-    a.sym.nsyms = 1[m
[31m-    a.sym.stroff = ffi.offsetof(o, "sym_entry")+ffi.sizeof(o.sym_entry)-ofs[m
[31m-    a.sym.strsize = aligned(#symname+2, align)[m
[31m-  end[m
[31m-  o.sym_entry.type = 0xf[m
[31m-  o.sym_entry.sect = 1[m
[31m-  o.sym_entry.strx = 1[m
[31m-  ffi.copy(o.space+1, symname)[m
[31m-[m
[31m-  -- Write Macho-O object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, mach_size))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_obj(ctx, output, s)[m
[31m-  local ok, ffi = pcall(require, "ffi")[m
[31m-  check(ok, "FFI library required to write this file type")[m
[31m-  if ctx.os == "windows" then[m
[31m-    return bcsave_peobj(ctx, output, s, ffi)[m
[31m-  elseif ctx.os == "osx" then[m
[31m-    return bcsave_machobj(ctx, output, s, ffi)[m
[31m-  else[m
[31m-    return bcsave_elfobj(ctx, output, s, ffi)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function bclist(input, output)[m
[31m-  local f = readfile(input)[m
[31m-  require("jit.bc").dump(f, savefile(output, "w"), true)[m
[31m-end[m
[31m-[m
[31m-local function bcsave(ctx, input, output)[m
[31m-  local f = readfile(input)[m
[31m-  local s = string.dump(f, ctx.strip)[m
[31m-  local t = ctx.type[m
[31m-  if not t then[m
[31m-    t = detecttype(output)[m
[31m-    ctx.type = t[m
[31m-  end[m
[31m-  if t == "raw" then[m
[31m-    bcsave_raw(output, s)[m
[31m-  else[m
[31m-    if not ctx.modname then ctx.modname = detectmodname(input) end[m
[31m-    if t == "obj" then[m
[31m-      bcsave_obj(ctx, output, s)[m
[31m-    else[m
[31m-      bcsave_c(ctx, output, s)[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function docmd(...)[m
[31m-  local arg = {...}[m
[31m-  local n = 1[m
[31m-  local list = false[m
[31m-  local ctx = {[m
[31m-    strip = true, arch = jit.arch, os = string.lower(jit.os),[m
[31m-    type = false, modname = false,[m
[31m-  }[m
[31m-  while n <= #arg do[m
[31m-    local a = arg[n][m
[31m-    if type(a) == "string" and string.sub(a, 1, 1) == "-" and a ~= "-" then[m
[31m-      table.remove(arg, n)[m
[31m-      if a == "--" then break end[m
[31m-      for m=2,#a do[m
[31m-	local opt = string.sub(a, m, m)[m
[31m-	if opt == "l" then[m
[31m-	  list = true[m
[31m-	elseif opt == "s" then[m
[31m-	  ctx.strip = true[m
[31m-	elseif opt == "g" then[m
[31m-	  ctx.strip = false[m
[31m-	else[m
[31m-	  if arg[n] == nil or m ~= #a then usage() end[m
[31m-	  if opt == "e" then[m
[31m-	    if n ~= 1 then usage() end[m
[31m-	    arg[1] = check(loadstring(arg[1]))[m
[31m-	  elseif opt == "n" then[m
[31m-	    ctx.modname = checkmodname(table.remove(arg, n))[m
[31m-	  elseif opt == "t" then[m
[31m-	    ctx.type = checkarg(table.remove(arg, n), map_type, "file type")[m
[31m-	  elseif opt == "a" then[m
[31m-	    ctx.arch = checkarg(table.remove(arg, n), map_arch, "architecture")[m
[31m-	  elseif opt == "o" then[m
[31m-	    ctx.os = checkarg(table.remove(arg, n), map_os, "OS name")[m
[31m-	  else[m
[31m-	    usage()[m
[31m-	  end[m
[31m-	end[m
[31m-      end[m
[31m-    else[m
[31m-      n = n + 1[m
[31m-    end[m
[31m-  end[m
[31m-  if list then[m
[31m-    if #arg == 0 or #arg > 2 then usage() end[m
[31m-    bclist(arg[1], arg[2] or "-")[m
[31m-  else[m
[31m-    if #arg ~= 2 then usage() end[m
[31m-    bcsave(ctx, arg[1], arg[2])[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  start = docmd -- Process -b command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_arm.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_arm.lua[m
[1mdeleted file mode 100644[m
[1mindex 1296d81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_arm.lua[m
[1m+++ /dev/null[m
[36m@@ -1,689 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT ARM disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles most user-mode ARMv7 instructions[m
[31m--- NYI: Advanced SIMD and VFP instructions.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, ror, tohex = bit.band, bit.bor, bit.ror, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_loadc = {[m
[31m-  shift = 8, mask = 15,[m
[31m-  [10] = {[m
[31m-    shift = 20, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovFmDN", "vstmFNdr",[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vstrFdl",[m
[31m-	{ shift = 16, mask = 15, [13] = "vpushFdr", _ = "vstmdbFNdr", }[m
[31m-      },[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovFDNm",[m
[31m-      { shift = 16, mask = 15, [13] = "vpopFdr", _ = "vldmFNdr", },[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vldrFdl", "vldmdbFNdr",[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  [11] = {[m
[31m-    shift = 20, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovGmDN", "vstmGNdr",[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vstrGdl",[m
[31m-	{ shift = 16, mask = 15, [13] = "vpushGdr", _ = "vstmdbGNdr", }[m
[31m-      },[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovGDNm",[m
[31m-      { shift = 16, mask = 15, [13] = "vpopGdr", _ = "vldmGNdr", },[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vldrGdl", "vldmdbGNdr",[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 0, mask = 0 -- NYI ldc, mcrr, mrrc.[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_vfps = {[m
[31m-  shift = 6, mask = 0x2c001,[m
[31m-  [0] = "vmlaF.dnm", "vmlsF.dnm",[m
[31m-  [0x04000] = "vnmlsF.dnm", [0x04001] = "vnmlaF.dnm",[m
[31m-  [0x08000] = "vmulF.dnm", [0x08001] = "vnmulF.dnm",[m
[31m-  [0x0c000] = "vaddF.dnm", [0x0c001] = "vsubF.dnm",[m
[31m-  [0x20000] = "vdivF.dnm",[m
[31m-  [0x24000] = "vfnmsF.dnm", [0x24001] = "vfnmaF.dnm",[m
[31m-  [0x28000] = "vfmaF.dnm", [0x28001] = "vfmsF.dnm",[m
[31m-  [0x2c000] = "vmovF.dY",[m
[31m-  [0x2c001] = {[m
[31m-    shift = 7, mask = 0x1e01,[m
[31m-    [0] = "vmovF.dm", "vabsF.dm",[m
[31m-    [0x0200] = "vnegF.dm", [0x0201] = "vsqrtF.dm",[m
[31m-    [0x0800] = "vcmpF.dm", [0x0801] = "vcmpeF.dm",[m
[31m-    [0x0a00] = "vcmpzF.d", [0x0a01] = "vcmpzeF.d",[m
[31m-    [0x0e01] = "vcvtG.dF.m",[m
[31m-    [0x1000] = "vcvt.f32.u32Fdm", [0x1001] = "vcvt.f32.s32Fdm",[m
[31m-    [0x1800] = "vcvtr.u32F.dm", [0x1801] = "vcvt.u32F.dm",[m
[31m-    [0x1a00] = "vcvtr.s32F.dm", [0x1a01] = "vcvt.s32F.dm",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_vfpd = {[m
[31m-  shift = 6, mask = 0x2c001,[m
[31m-  [0] = "vmlaG.dnm", "vmlsG.dnm",[m
[31m-  [0x04000] = "vnmlsG.dnm", [0x04001] = "vnmlaG.dnm",[m
[31m-  [0x08000] = "vmulG.dnm", [0x08001] = "vnmulG.dnm",[m
[31m-  [0x0c000] = "vaddG.dnm", [0x0c001] = "vsubG.dnm",[m
[31m-  [0x20000] = "vdivG.dnm",[m
[31m-  [0x24000] = "vfnmsG.dnm", [0x24001] = "vfnmaG.dnm",[m
[31m-  [0x28000] = "vfmaG.dnm", [0x28001] = "vfmsG.dnm",[m
[31m-  [0x2c000] = "vmovG.dY",[m
[31m-  [0x2c001] = {[m
[31m-    shift = 7, mask = 0x1e01,[m
[31m-    [0] = "vmovG.dm", "vabsG.dm",[m
[31m-    [0x0200] = "vnegG.dm", [0x0201] = "vsqrtG.dm",[m
[31m-    [0x0800] = "vcmpG.dm", [0x0801] = "vcmpeG.dm",[m
[31m-    [0x0a00] = "vcmpzG.d", [0x0a01] = "vcmpzeG.d",[m
[31m-    [0x0e01] = "vcvtF.dG.m",[m
[31m-    [0x1000] = "vcvt.f64.u32GdFm", [0x1001] = "vcvt.f64.s32GdFm",[m
[31m-    [0x1800] = "vcvtr.u32FdG.m", [0x1801] = "vcvt.u32FdG.m",[m
[31m-    [0x1a00] = "vcvtr.s32FdG.m", [0x1a01] = "vcvt.s32FdG.m",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_datac = {[m
[31m-  shift = 24, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 4, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 8, mask = 15,[m
[31m-      [10] = map_vfps,[m
[31m-      [11] = map_vfpd,[m
[31m-      -- NYI cdp, mcr, mrc.[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 8, mask = 15,[m
[31m-      [10] = {[m
[31m-	shift = 20, mask = 15,[m
[31m-	[0] = "vmovFnD", "vmovFDn",[m
[31m-	[14] = "vmsrD",[m
[31m-	[15] = { shift = 12, mask = 15, [15] = "vmrs", _ = "vmrsD", },[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  "svcT",[m
[31m-}[m
[31m-[m
[31m-local map_loadcu = {[m
[31m-  shift = 0, mask = 0, -- NYI unconditional CP load/store.[m
[31m-}[m
[31m-[m
[31m-local map_datacu = {[m
[31m-  shift = 0, mask = 0, -- NYI unconditional CP data.[m
[31m-}[m
[31m-[m
[31m-local map_simddata = {[m
[31m-  shift = 0, mask = 0, -- NYI SIMD data.[m
[31m-}[m
[31m-[m
[31m-local map_simdload = {[m
[31m-  shift = 0, mask = 0, -- NYI SIMD load/store, preload.[m
[31m-}[m
[31m-[m
[31m-local map_preload = {[m
[31m-  shift = 0, mask = 0, -- NYI preload.[m
[31m-}[m
[31m-[m
[31m-local map_media = {[m
[31m-  shift = 20, mask = 31,[m
[31m-  [0] = false,[m
[31m-  { --01[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "sadd16DNM", "sasxDNM", "ssaxDNM", "ssub16DNM",[m
[31m-    "sadd8DNM", false, false, "ssub8DNM",[m
[31m-  },[m
[31m-  { --02[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "qadd16DNM", "qasxDNM", "qsaxDNM", "qsub16DNM",[m
[31m-    "qadd8DNM", false, false, "qsub8DNM",[m
[31m-  },[m
[31m-  { --03[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "shadd16DNM", "shasxDNM", "shsaxDNM", "shsub16DNM",[m
[31m-    "shadd8DNM", false, false, "shsub8DNM",[m
[31m-  },[m
[31m-  false,[m
[31m-  { --05[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uadd16DNM", "uasxDNM", "usaxDNM", "usub16DNM",[m
[31m-    "uadd8DNM", false, false, "usub8DNM",[m
[31m-  },[m
[31m-  { --06[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uqadd16DNM", "uqasxDNM", "uqsaxDNM", "uqsub16DNM",[m
[31m-    "uqadd8DNM", false, false, "uqsub8DNM",[m
[31m-  },[m
[31m-  { --07[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uhadd16DNM", "uhasxDNM", "uhsaxDNM", "uhsub16DNM",[m
[31m-    "uhadd8DNM", false, false, "uhsub8DNM",[m
[31m-  },[m
[31m-  { --08[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "pkhbtDNMU", false, "pkhtbDNMU",[m
[31m-    { shift = 16, mask = 15, [15] = "sxtb16DMU", _ = "sxtab16DNMU", },[m
[31m-    "pkhbtDNMU", "selDNM", "pkhtbDNMU",[m
[31m-  },[m
[31m-  false,[m
[31m-  { --0a[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "ssatDxMu", "ssat16DxM", "ssatDxMu",[m
[31m-    { shift = 16, mask = 15, [15] = "sxtbDMU", _ = "sxtabDNMU", },[m
[31m-    "ssatDxMu", false, "ssatDxMu",[m
[31m-  },[m
[31m-  { --0b[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "ssatDxMu", "revDM", "ssatDxMu",[m
[31m-    { shift = 16, mask = 15, [15] = "sxthDMU", _ = "sxtahDNMU", },[m
[31m-    "ssatDxMu", "rev16DM", "ssatDxMu",[m
[31m-  },[m
[31m-  { --0c[m
[31m-    shift = 5, mask = 7,[m
[31m-    [3] = { shift = 16, mask = 15, [15] = "uxtb16DMU", _ = "uxtab16DNMU", },[m
[31m-  },[m
[31m-  false,[m
[31m-  { --0e[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "usatDwMu", "usat16DwM", "usatDwMu",[m
[31m-    { shift = 16, mask = 15, [15] = "uxtbDMU", _ = "uxtabDNMU", },[m
[31m-    "usatDwMu", false, "usatDwMu",[m
[31m-  },[m
[31m-  { --0f[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "usatDwMu", "rbitDM", "usatDwMu",[m
[31m-    { shift = 16, mask = 15, [15] = "uxthDMU", _ = "uxtahDNMU", },[m
[31m-    "usatDwMu", "revshDM", "usatDwMu",[m
[31m-  },[m
[31m-  { --10[m
[31m-    shift = 12, mask = 15,[m
[31m-    [15] = {[m
[31m-      shift = 5, mask = 7,[m
[31m-      "smuadNMS", "smuadxNMS", "smusdNMS", "smusdxNMS",[m
[31m-    },[m
[31m-    _ = {[m
[31m-      shift = 5, mask = 7,[m
[31m-      [0] = "smladNMSD", "smladxNMSD", "smlsdNMSD", "smlsdxNMSD",[m
[31m-    },[m
[31m-  },[m
[31m-  false, false, false,[m
[31m-  { --14[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "smlaldDNMS", "smlaldxDNMS", "smlsldDNMS", "smlsldxDNMS",[m
[31m-  },[m
[31m-  { --15[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = { shift = 12, mask = 15, [15] = "smmulNMS", _ = "smmlaNMSD", },[m
[31m-    { shift = 12, mask = 15, [15] = "smmulrNMS", _ = "smmlarNMSD", },[m
[31m-    false, false, false, false,[m
[31m-    "smmlsNMSD", "smmlsrNMSD",[m
[31m-  },[m
[31m-  false, false,[m
[31m-  { --18[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = { shift = 12, mask = 15, [15] = "usad8NMS", _ = "usada8NMSD", },[m
[31m-  },[m
[31m-  false,[m
[31m-  { --1a[m
[31m-    shift = 5, mask = 3, [2] = "sbfxDMvw",[m
[31m-  },[m
[31m-  { --1b[m
[31m-    shift = 5, mask = 3, [2] = "sbfxDMvw",[m
[31m-  },[m
[31m-  { --1c[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 0, mask = 15, [15] = "bfcDvX", _ = "bfiDMvX", },[m
[31m-  },[m
[31m-  { --1d[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 0, mask = 15, [15] = "bfcDvX", _ = "bfiDMvX", },[m
[31m-  },[m
[31m-  { --1e[m
[31m-    shift = 5, mask = 3, [2] = "ubfxDMvw",[m
[31m-  },[m
[31m-  { --1f[m
[31m-    shift = 5, mask = 3, [2] = "ubfxDMvw",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_load = {[m
[31m-  shift = 21, mask = 9,[m
[31m-  {[m
[31m-    shift = 20, mask = 5,[m
[31m-    [0] = "strtDL", "ldrtDL", [4] = "strbtDL", [5] = "ldrbtDL",[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 20, mask = 5,[m
[31m-    [0] = "strDL", "ldrDL", [4] = "strbDL", [5] = "ldrbDL",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_load1 = {[m
[31m-  shift = 4, mask = 1,[m
[31m-  [0] = map_load, map_media,[m
[31m-}[m
[31m-[m
[31m-local map_loadm = {[m
[31m-  shift = 20, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 23, mask = 3,[m
[31m-    [0] = "stmdaNR", "stmNR",[m
[31m-    { shift = 16, mask = 63, [45] = "pushR", _ = "stmdbNR", }, "stmibNR",[m
[31m-  },[m
[31m-  {[m
[31m-    shift = 23, mask = 3,[m
[31m-    [0] = "ldmdaNR", { shift = 16, mask = 63, [61] = "popR", _ = "ldmNR", },[m
[31m-    "ldmdbNR", "ldmibNR",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_data = {[m
[31m-  shift = 21, mask = 15,[m
[31m-  [0] = "andDNPs", "eorDNPs", "subDNPs", "rsbDNPs",[m
[31m-  "addDNPs", "adcDNPs", "sbcDNPs", "rscDNPs",[m
[31m-  "tstNP", "teqNP", "cmpNP", "cmnNP",[m
[31m-  "orrDNPs", "movDPs", "bicDNPs", "mvnDPs",[m
[31m-}[m
[31m-[m
[31m-local map_mul = {[m
[31m-  shift = 21, mask = 7,[m
[31m-  [0] = "mulNMSs", "mlaNMSDs", "umaalDNMS", "mlsDNMS",[m
[31m-  "umullDNMSs", "umlalDNMSs", "smullDNMSs", "smlalDNMSs",[m
[31m-}[m
[31m-[m
[31m-local map_sync = {[m
[31m-  shift = 20, mask = 15, -- NYI: brackets around N. R(D+1) for ldrexd/strexd.[m
[31m-  [0] = "swpDMN", false, false, false,[m
[31m-  "swpbDMN", false, false, false,[m
[31m-  "strexDMN", "ldrexDN", "strexdDN", "ldrexdDN",[m
[31m-  "strexbDMN", "ldrexbDN", "strexhDN", "ldrexhDN",[m
[31m-}[m
[31m-[m
[31m-local map_mulh = {[m
[31m-  shift = 21, mask = 3,[m
[31m-  [0] = { shift = 5, mask = 3,[m
[31m-    [0] = "smlabbNMSD", "smlatbNMSD", "smlabtNMSD", "smlattNMSD", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smlawbNMSD", "smulwbNMS", "smlawtNMSD", "smulwtNMS", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smlalbbDNMS", "smlaltbDNMS", "smlalbtDNMS", "smlalttDNMS", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smulbbNMS", "smultbNMS", "smulbtNMS", "smulttNMS", },[m
[31m-}[m
[31m-[m
[31m-local map_misc = {[m
[31m-  shift = 4, mask = 7,[m
[31m-  -- NYI: decode PSR bits of msr.[m
[31m-  [0] = { shift = 21, mask = 1, [0] = "mrsD", "msrM", },[m
[31m-  { shift = 21, mask = 3, "bxM", false, "clzDM", },[m
[31m-  { shift = 21, mask = 3, "bxjM", },[m
[31m-  { shift = 21, mask = 3, "blxM", },[m
[31m-  false,[m
[31m-  { shift = 21, mask = 3, [0] = "qaddDMN", "qsubDMN", "qdaddDMN", "qdsubDMN", },[m
[31m-  false,[m
[31m-  { shift = 21, mask = 3, "bkptK", },[m
[31m-}[m
[31m-[m
[31m-local map_datar = {[m
[31m-  shift = 4, mask = 9,[m
[31m-  [9] = {[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 24, mask = 1, [0] = map_mul, map_sync, },[m
[31m-    { shift = 20, mask = 1, [0] = "strhDL", "ldrhDL", },[m
[31m-    { shift = 20, mask = 1, [0] = "ldrdDL", "ldrsbDL", },[m
[31m-    { shift = 20, mask = 1, [0] = "strdDL", "ldrshDL", },[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 20, mask = 25,[m
[31m-    [16] = { shift = 7, mask = 1, [0] = map_misc, map_mulh, },[m
[31m-    _ = {[m
[31m-      shift = 0, mask = 0xffffffff,[m
[31m-      [bor(0xe1a00000)] = "nop",[m
[31m-      _ = map_data,[m
[31m-    }[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_datai = {[m
[31m-  shift = 20, mask = 31, -- NYI: decode PSR bits of msr. Decode imm12.[m
[31m-  [16] = "movwDW", [20] = "movtDW",[m
[31m-  [18] = { shift = 0, mask = 0xf00ff, [0] = "nopv6", _ = "msrNW", },[m
[31m-  [22] = "msrNW",[m
[31m-  _ = map_data,[m
[31m-}[m
[31m-[m
[31m-local map_branch = {[m
[31m-  shift = 24, mask = 1,[m
[31m-  [0] = "bB", "blB"[m
[31m-}[m
[31m-[m
[31m-local map_condins = {[m
[31m-  [0] = map_datar, map_datai, map_load, map_load1,[m
[31m-  map_loadm, map_branch, map_loadc, map_datac[m
[31m-}[m
[31m-[m
[31m--- NYI: setend.[m
[31m-local map_uncondins = {[m
[31m-  [0] = false, map_simddata, map_simdload, map_preload,[m
[31m-  false, "blxB", map_loadcu, map_datacu,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",[m
[31m-}[m
[31m-[m
[31m-local map_cond = {[m
[31m-  [0] = "eq", "ne", "hs", "lo", "mi", "pl", "vs", "vc",[m
[31m-  "hi", "ls", "ge", "lt", "gt", "le", "al",[m
[31m-}[m
[31m-[m
[31m-local map_shift = { [0] = "lsl", "lsr", "asr", "ror", }[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then[m
[31m-      extra = "\t->"..sym[m
[31m-    elseif band(ctx.op, 0x0e000000) ~= 0x0a000000 then[m
[31m-      extra = "\t; 0x"..tohex(ctx.rel)[m
[31m-    end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-5s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-5s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m--- Format operand 2 of load/store opcodes.[m
[31m-local function fmtload(ctx, op, pos)[m
[31m-  local base = map_gpr[band(rshift(op, 16), 15)][m
[31m-  local x, ofs[m
[31m-  local ext = (band(op, 0x04000000) == 0)[m
[31m-  if not ext and band(op, 0x02000000) == 0 then[m
[31m-    ofs = band(op, 4095)[m
[31m-    if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-    if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-    ofs = "#"..ofs[m
[31m-  elseif ext and band(op, 0x00400000) ~= 0 then[m
[31m-    ofs = band(op, 15) + band(rshift(op, 4), 0xf0)[m
[31m-    if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-    if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-    ofs = "#"..ofs[m
[31m-  else[m
[31m-    ofs = map_gpr[band(op, 15)][m
[31m-    if ext or band(op, 0xfe0) == 0 then[m
[31m-    elseif band(op, 0xfe0) == 0x60 then[m
[31m-      ofs = format("%s, rrx", ofs)[m
[31m-    else[m
[31m-      local sh = band(rshift(op, 7), 31)[m
[31m-      if sh == 0 then sh = 32 end[m
[31m-      ofs = format("%s, %s #%d", ofs, map_shift[band(rshift(op, 5), 3)], sh)[m
[31m-    end[m
[31m-    if band(op, 0x00800000) == 0 then ofs = "-"..ofs end[m
[31m-  end[m
[31m-  if ofs == "#0" then[m
[31m-    x = format("[%s]", base)[m
[31m-  elseif band(op, 0x01000000) == 0 then[m
[31m-    x = format("[%s], %s", base, ofs)[m
[31m-  else[m
[31m-    x = format("[%s, %s]", base, ofs)[m
[31m-  end[m
[31m-  if band(op, 0x01200000) == 0x01200000 then x = x.."!" end[m
[31m-  return x[m
[31m-end[m
[31m-[m
[31m--- Format operand 2 of vector load/store opcodes.[m
[31m-local function fmtvload(ctx, op, pos)[m
[31m-  local base = map_gpr[band(rshift(op, 16), 15)][m
[31m-  local ofs = band(op, 255)*4[m
[31m-  if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-  if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-  if ofs == 0 then[m
[31m-    return format("[%s]", base)[m
[31m-  else[m
[31m-    return format("[%s, #%d]", base, ofs)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function fmtvr(op, vr, sh0, sh1)[m
[31m-  if vr == "s" then[m
[31m-    return format("s%d", 2*band(rshift(op, sh0), 15)+band(rshift(op, sh1), 1))[m
[31m-  else[m
[31m-    return format("d%d", band(rshift(op, sh0), 15)+band(rshift(op, sh1-4), 16))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  local op = bor(lshift(b3, 24), lshift(b2, 16), lshift(b1, 8), b0)[m
[31m-  local operands = {}[m
[31m-  local suffix = ""[m
[31m-  local last, name, pat[m
[31m-  local vr[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local cond = rshift(op, 28)[m
[31m-  local opat[m
[31m-  if cond == 15 then[m
[31m-    opat = map_uncondins[band(rshift(op, 25), 7)][m
[31m-  else[m
[31m-    if cond ~= 14 then suffix = map_cond[cond] end[m
[31m-    opat = map_condins[band(rshift(op, 25), 7)][m
[31m-  end[m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)] or opat._[m
[31m-  end[m
[31m-  name, pat = match(opat, "^([a-z0-9]*)(.*)")[m
[31m-  if sub(pat, 1, 1) == "." then[m
[31m-    local s2, p2 = match(pat, "^([a-z0-9.]*)(.*)")[m
[31m-    suffix = suffix..s2[m
[31m-    pat = p2[m
[31m-  end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "D" then[m
[31m-      x = map_gpr[band(rshift(op, 12), 15)][m
[31m-    elseif p == "N" then[m
[31m-      x = map_gpr[band(rshift(op, 16), 15)][m
[31m-    elseif p == "S" then[m
[31m-      x = map_gpr[band(rshift(op, 8), 15)][m
[31m-    elseif p == "M" then[m
[31m-      x = map_gpr[band(op, 15)][m
[31m-    elseif p == "d" then[m
[31m-      x = fmtvr(op, vr, 12, 22)[m
[31m-    elseif p == "n" then[m
[31m-      x = fmtvr(op, vr, 16, 7)[m
[31m-    elseif p == "m" then[m
[31m-      x = fmtvr(op, vr, 0, 5)[m
[31m-    elseif p == "P" then[m
[31m-      if band(op, 0x02000000) ~= 0 then[m
[31m-	x = ror(band(op, 255), 2*band(rshift(op, 8), 15))[m
[31m-      else[m
[31m-	x = map_gpr[band(op, 15)][m
[31m-	if band(op, 0xff0) ~= 0 then[m
[31m-	  operands[#operands+1] = x[m
[31m-	  local s = map_shift[band(rshift(op, 5), 3)][m
[31m-	  local r = nil[m
[31m-	  if band(op, 0xf90) == 0 then[m
[31m-	    if s == "ror" then s = "rrx" else r = "#32" end[m
[31m-	  elseif band(op, 0x10) == 0 then[m
[31m-	    r = "#"..band(rshift(op, 7), 31)[m
[31m-	  else[m
[31m-	    r = map_gpr[band(rshift(op, 8), 15)][m
[31m-	  end[m
[31m-	  if name == "mov" then name = s; x = r[m
[31m-	  elseif r then x = format("%s %s", s, r)[m
[31m-	  else x = s end[m
[31m-	end[m
[31m-      end[m
[31m-    elseif p == "L" then[m
[31m-      x = fmtload(ctx, op, pos)[m
[31m-    elseif p == "l" then[m
[31m-      x = fmtvload(ctx, op, pos)[m
[31m-    elseif p == "B" then[m
[31m-      local addr = ctx.addr + pos + 8 + arshift(lshift(op, 8), 6)[m
[31m-      if cond == 15 then addr = addr + band(rshift(op, 23), 2) end[m
[31m-      ctx.rel = addr[m
[31m-      x = "0x"..tohex(addr)[m
[31m-    elseif p == "F" then[m
[31m-      vr = "s"[m
[31m-    elseif p == "G" then[m
[31m-      vr = "d"[m
[31m-    elseif p == "." then[m
[31m-      suffix = suffix..(vr == "s" and ".f32" or ".f64")[m
[31m-    elseif p == "R" then[m
[31m-      if band(op, 0x00200000) ~= 0 and #operands == 1 then[m
[31m-	operands[1] = operands[1].."!"[m
[31m-      end[m
[31m-      local t = {}[m
[31m-      for i=0,15 do[m
[31m-	if band(rshift(op, i), 1) == 1 then t[#t+1] = map_gpr[i] end[m
[31m-      end[m
[31m-      x = "{"..concat(t, ", ").."}"[m
[31m-    elseif p == "r" then[m
[31m-      if band(op, 0x00200000) ~= 0 and #operands == 2 then[m
[31m-	operands[1] = operands[1].."!"[m
[31m-      end[m
[31m-      local s = tonumber(sub(last, 2))[m
[31m-      local n = band(op, 255)[m
[31m-      if vr == "d" then n = rshift(n, 1) end[m
[31m-      operands[#operands] = format("{%s-%s%d}", last, vr, s+n-1)[m
[31m-    elseif p == "W" then[m
[31m-      x = band(op, 0x0fff) + band(rshift(op, 4), 0xf000)[m
[31m-    elseif p == "T" then[m
[31m-      x = "#0x"..tohex(band(op, 0x00ffffff), 6)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "u" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-      if band(op, 0x40) == 0 then[m
[31m-	if x == 0 then x = nil else x = "lsl #"..x end[m
[31m-      else[m
[31m-	if x == 0 then x = "asr #32" else x = "asr #"..x end[m
[31m-      end[m
[31m-    elseif p == "v" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-    elseif p == "w" then[m
[31m-      x = band(rshift(op, 16), 31)[m
[31m-    elseif p == "x" then[m
[31m-      x = band(rshift(op, 16), 31) + 1[m
[31m-    elseif p == "X" then[m
[31m-      x = band(rshift(op, 16), 31) - last + 1[m
[31m-    elseif p == "Y" then[m
[31m-      x = band(rshift(op, 12), 0xf0) + band(op, 0x0f)[m
[31m-    elseif p == "K" then[m
[31m-      x = "#0x"..tohex(band(rshift(op, 4), 0x0000fff0) + band(op, 15), 4)[m
[31m-    elseif p == "s" then[m
[31m-      if band(op, 0x00100000) ~= 0 then suffix = "s"..suffix end[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then[m
[31m-      last = x[m
[31m-      if type(x) == "number" then x = "#"..x end[m
[31m-      operands[#operands+1] = x[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name..suffix, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  ctx.pos = ofs[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 16 then return map_gpr[r] end[m
[31m-  return "d"..(r-16)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  disass = disass,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_mips.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_mips.lua[m
[1mdeleted file mode 100644[m
[1mindex 2bf8b38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_mips.lua[m
[1m+++ /dev/null[m
[36m@@ -1,428 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT MIPS disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT/X license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles all standard MIPS32R1/R2 instructions.[m
[31m--- Default mode is big-endian, but see: dis_mipsel.lua[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, tohex = bit.band, bit.bor, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Primary and extended opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_movci = { shift = 16, mask = 1, [0] = "movfDSC", "movtDSC", }[m
[31m-local map_srl = { shift = 21, mask = 1, [0] = "srlDTA", "rotrDTA", }[m
[31m-local map_srlv = { shift = 6, mask = 1, [0] = "srlvDTS", "rotrvDTS", }[m
[31m-[m
[31m-local map_special = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = { shift = 0, mask = -1, [0] = "nop", _ = "sllDTA" },[m
[31m-  map_movci,	map_srl,	"sraDTA",[m
[31m-  "sllvDTS",	false,		map_srlv,	"sravDTS",[m
[31m-  "jrS",	"jalrD1S",	"movzDST",	"movnDST",[m
[31m-  "syscallY",	"breakY",	false,		"sync",[m
[31m-  "mfhiD",	"mthiS",	"mfloD",	"mtloS",[m
[31m-  false,	false,		false,		false,[m
[31m-  "multST",	"multuST",	"divST",	"divuST",[m
[31m-  false,	false,		false,		false,[m
[31m-  "addDST",	"addu|moveDST0", "subDST",	"subu|neguDS0T",[m
[31m-  "andDST",	"orDST",	"xorDST",	"nor|notDST0",[m
[31m-  false,	false,		"sltDST",	"sltuDST",[m
[31m-  false,	false,		false,		false,[m
[31m-  "tgeSTZ",	"tgeuSTZ",	"tltSTZ",	"tltuSTZ",[m
[31m-  "teqSTZ",	false,		"tneSTZ",[m
[31m-}[m
[31m-[m
[31m-local map_special2 = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "maddST", "madduST",	"mulDST",	false,[m
[31m-  "msubST",	"msubuST",[m
[31m-  [32] = "clzDS", [33] = "cloDS",[m
[31m-  [63] = "sdbbpY",[m
[31m-}[m
[31m-[m
[31m-local map_bshfl = {[m
[31m-  shift = 6, mask = 31,[m
[31m-  [2] = "wsbhDT",[m
[31m-  [16] = "sebDT",[m
[31m-  [24] = "sehDT",[m
[31m-}[m
[31m-[m
[31m-local map_special3 = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "extTSAK", [4] = "insTSAL",[m
[31m-  [32] = map_bshfl,[m
[31m-  [59] = "rdhwrTD",[m
[31m-}[m
[31m-[m
[31m-local map_regimm = {[m
[31m-  shift = 16, mask = 31,[m
[31m-  [0] = "bltzSB",	"bgezSB",	"bltzlSB",	"bgezlSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  "tgeiSI",	"tgeiuSI",	"tltiSI",	"tltiuSI",[m
[31m-  "teqiSI",	false,		"tneiSI",	false,[m
[31m-  "bltzalSB",	"bgezalSB",	"bltzallSB",	"bgezallSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		"synciSO",[m
[31m-}[m
[31m-[m
[31m-local map_cop0 = {[m
[31m-  shift = 25, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 21, mask = 15,[m
[31m-    [0] = "mfc0TDW", [4] = "mtc0TDW",[m
[31m-    [10] = "rdpgprDT",[m
[31m-    [11] = { shift = 5, mask = 1, [0] = "diT0", "eiT0", },[m
[31m-    [14] = "wrpgprDT",[m
[31m-  }, {[m
[31m-    shift = 0, mask = 63,[m
[31m-    [1] = "tlbr", [2] = "tlbwi", [6] = "tlbwr", [8] = "tlbp",[m
[31m-    [24] = "eret", [31] = "deret",[m
[31m-    [32] = "wait",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_cop1s = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.sFGH",	"sub.sFGH",	"mul.sFGH",	"div.sFGH",[m
[31m-  "sqrt.sFG",		"abs.sFG",	"mov.sFG",	"neg.sFG",[m
[31m-  "round.l.sFG",	"trunc.l.sFG",	"ceil.l.sFG",	"floor.l.sFG",[m
[31m-  "round.w.sFG",	"trunc.w.sFG",	"ceil.w.sFG",	"floor.w.sFG",[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.sFGC", "movt.sFGC" },[m
[31m-  "movz.sFGT",	"movn.sFGT",[m
[31m-  false,	"recip.sFG",	"rsqrt.sFG",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	"cvt.d.sFG",	false,		false,[m
[31m-  "cvt.w.sFG",	"cvt.l.sFG",	"cvt.ps.sFGH",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "c.f.sVGH",	"c.un.sVGH",	"c.eq.sVGH",	"c.ueq.sVGH",[m
[31m-  "c.olt.sVGH",	"c.ult.sVGH",	"c.ole.sVGH",	"c.ule.sVGH",[m
[31m-  "c.sf.sVGH",	"c.ngle.sVGH",	"c.seq.sVGH",	"c.ngl.sVGH",[m
[31m-  "c.lt.sVGH",	"c.nge.sVGH",	"c.le.sVGH",	"c.ngt.sVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1d = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.dFGH",	"sub.dFGH",	"mul.dFGH",	"div.dFGH",[m
[31m-  "sqrt.dFG",		"abs.dFG",	"mov.dFG",	"neg.dFG",[m
[31m-  "round.l.dFG",	"trunc.l.dFG",	"ceil.l.dFG",	"floor.l.dFG",[m
[31m-  "round.w.dFG",	"trunc.w.dFG",	"ceil.w.dFG",	"floor.w.dFG",[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.dFGC", "movt.dFGC" },[m
[31m-  "movz.dFGT",	"movn.dFGT",[m
[31m-  false,	"recip.dFG",	"rsqrt.dFG",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.dFG",	false,		false,		false,[m
[31m-  "cvt.w.dFG",	"cvt.l.dFG",	false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "c.f.dVGH",	"c.un.dVGH",	"c.eq.dVGH",	"c.ueq.dVGH",[m
[31m-  "c.olt.dVGH",	"c.ult.dVGH",	"c.ole.dVGH",	"c.ule.dVGH",[m
[31m-  "c.df.dVGH",	"c.ngle.dVGH",	"c.deq.dVGH",	"c.ngl.dVGH",[m
[31m-  "c.lt.dVGH",	"c.nge.dVGH",	"c.le.dVGH",	"c.ngt.dVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1ps = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.psFGH",	"sub.psFGH",	"mul.psFGH",	false,[m
[31m-  false,		"abs.psFG",	"mov.psFG",	"neg.psFG",[m
[31m-  false,		false,		false,		false,[m
[31m-  false,		false,		false,		false,[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.psFGC", "movt.psFGC" },[m
[31m-  "movz.psFGT",	"movn.psFGT",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.puFG",	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.plFG",	false,		false,		false,[m
[31m-  "pll.psFGH",	"plu.psFGH",	"pul.psFGH",	"puu.psFGH",[m
[31m-  "c.f.psVGH",	"c.un.psVGH",	"c.eq.psVGH",	"c.ueq.psVGH",[m
[31m-  "c.olt.psVGH", "c.ult.psVGH",	"c.ole.psVGH",	"c.ule.psVGH",[m
[31m-  "c.psf.psVGH", "c.ngle.psVGH", "c.pseq.psVGH", "c.ngl.psVGH",[m
[31m-  "c.lt.psVGH",	"c.nge.psVGH",	"c.le.psVGH",	"c.ngt.psVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1w = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [32] = "cvt.s.wFG", [33] = "cvt.d.wFG",[m
[31m-}[m
[31m-[m
[31m-local map_cop1l = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [32] = "cvt.s.lFG", [33] = "cvt.d.lFG",[m
[31m-}[m
[31m-[m
[31m-local map_cop1bc = {[m
[31m-  shift = 16, mask = 3,[m
[31m-  [0] = "bc1fCB", "bc1tCB",	"bc1flCB",	"bc1tlCB",[m
[31m-}[m
[31m-[m
[31m-local map_cop1 = {[m
[31m-  shift = 21, mask = 31,[m
[31m-  [0] = "mfc1TG", false,	"cfc1TG",	"mfhc1TG",[m
[31m-  "mtc1TG",	false,		"ctc1TG",	"mthc1TG",[m
[31m-  map_cop1bc,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  map_cop1s,	map_cop1d,	false,		false,[m
[31m-  map_cop1w,	map_cop1l,	map_cop1ps,[m
[31m-}[m
[31m-[m
[31m-local map_cop1x = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "lwxc1FSX",	"ldxc1FSX",	false,		false,[m
[31m-  false,	"luxc1FSX",	false,		false,[m
[31m-  "swxc1FSX",	"sdxc1FSX",	false,		false,[m
[31m-  false,	"suxc1FSX",	false,		"prefxMSX",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		"alnv.psFGHS",	false,[m
[31m-  "madd.sFRGH",	"madd.dFRGH",	false,		false,[m
[31m-  false,	false,		"madd.psFRGH",	false,[m
[31m-  "msub.sFRGH",	"msub.dFRGH",	false,		false,[m
[31m-  false,	false,		"msub.psFRGH",	false,[m
[31m-  "nmadd.sFRGH", "nmadd.dFRGH",	false,		false,[m
[31m-  false,	false,		"nmadd.psFRGH",	false,[m
[31m-  "nmsub.sFRGH", "nmsub.dFRGH",	false,		false,[m
[31m-  false,	false,		"nmsub.psFRGH",	false,[m
[31m-}[m
[31m-[m
[31m-local map_pri = {[m
[31m-  [0] = map_special,	map_regimm,	"jJ",	"jalJ",[m
[31m-  "beq|beqz|bST00B",	"bne|bnezST0B",		"blezSB",	"bgtzSB",[m
[31m-  "addiTSI",	"addiu|liTS0I",	"sltiTSI",	"sltiuTSI",[m
[31m-  "andiTSU",	"ori|liTS0U",	"xoriTSU",	"luiTU",[m
[31m-  map_cop0,	map_cop1,	false,		map_cop1x,[m
[31m-  "beql|beqzlST0B",	"bnel|bnezlST0B",	"blezlSB",	"bgtzlSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  map_special2,	false,		false,		map_special3,[m
[31m-  "lbTSO",	"lhTSO",	"lwlTSO",	"lwTSO",[m
[31m-  "lbuTSO",	"lhuTSO",	"lwrTSO",	false,[m
[31m-  "sbTSO",	"shTSO",	"swlTSO",	"swTSO",[m
[31m-  false,	false,		"swrTSO",	"cacheNSO",[m
[31m-  "llTSO",	"lwc1HSO",	"lwc2TSO",	"prefNSO",[m
[31m-  false,	"ldc1HSO",	"ldc2TSO",	false,[m
[31m-  "scTSO",	"swc1HSO",	"swc2TSO",	false,[m
[31m-  false,	"sdc1HSO",	"sdc2TSO",	false,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",[m
[31m-  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",[m
[31m-  "r24", "r25", "r26", "r27", "r28", "sp", "r30", "ra",[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then extra = "\t->"..sym end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m-local function get_be(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  return bor(lshift(b0, 24), lshift(b1, 16), lshift(b2, 8), b3)[m
[31m-end[m
[31m-[m
[31m-local function get_le(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  return bor(lshift(b3, 24), lshift(b2, 16), lshift(b1, 8), b0)[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local op = ctx:get()[m
[31m-  local operands = {}[m
[31m-  local last = nil[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local opat = map_pri[rshift(op, 26)][m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)] or opat._[m
[31m-  end[m
[31m-  local name, pat = match(opat, "^([a-z0-9_.]*)(.*)")[m
[31m-  local altname, pat2 = match(pat, "|([a-z0-9_.|]*)(.*)")[m
[31m-  if altname then pat = pat2 end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "S" then[m
[31m-      x = map_gpr[band(rshift(op, 21), 31)][m
[31m-    elseif p == "T" then[m
[31m-      x = map_gpr[band(rshift(op, 16), 31)][m
[31m-    elseif p == "D" then[m
[31m-      x = map_gpr[band(rshift(op, 11), 31)][m
[31m-    elseif p == "F" then[m
[31m-      x = "f"..band(rshift(op, 6), 31)[m
[31m-    elseif p == "G" then[m
[31m-      x = "f"..band(rshift(op, 11), 31)[m
[31m-    elseif p == "H" then[m
[31m-      x = "f"..band(rshift(op, 16), 31)[m
[31m-    elseif p == "R" then[m
[31m-      x = "f"..band(rshift(op, 21), 31)[m
[31m-    elseif p == "A" then[m
[31m-      x = band(rshift(op, 6), 31)[m
[31m-    elseif p == "M" then[m
[31m-      x = band(rshift(op, 11), 31)[m
[31m-    elseif p == "N" then[m
[31m-      x = band(rshift(op, 16), 31)[m
[31m-    elseif p == "C" then[m
[31m-      x = band(rshift(op, 18), 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "K" then[m
[31m-      x = band(rshift(op, 11), 31) + 1[m
[31m-    elseif p == "L" then[m
[31m-      x = band(rshift(op, 11), 31) - last + 1[m
[31m-    elseif p == "I" then[m
[31m-      x = arshift(lshift(op, 16), 16)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(op, 0xffff)[m
[31m-    elseif p == "O" then[m
[31m-      local disp = arshift(lshift(op, 16), 16)[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p == "X" then[m
[31m-      local index = map_gpr[band(rshift(op, 16), 31)][m
[31m-      operands[#operands] = format("%s(%s)", index, last)[m
[31m-    elseif p == "B" then[m
[31m-      x = ctx.addr + ctx.pos + arshift(lshift(op, 16), 16)*4 + 4[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "J" then[m
[31m-      x = band(ctx.addr + ctx.pos, 0xf0000000) + band(op, 0x03ffffff)*4[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "V" then[m
[31m-      x = band(rshift(op, 8), 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "W" then[m
[31m-      x = band(op, 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "Y" then[m
[31m-      x = band(rshift(op, 6), 0x000fffff)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "Z" then[m
[31m-      x = band(rshift(op, 6), 1023)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "0" then[m
[31m-      if last == "r0" or last == 0 then[m
[31m-	local n = #operands[m
[31m-	operands[n] = nil[m
[31m-	last = operands[n-1][m
[31m-	if altname then[m
[31m-	  local a1, a2 = match(altname, "([^|]*)|(.*)")[m
[31m-	  if a1 then name, altname = a1, a2[m
[31m-	  else name = altname end[m
[31m-	end[m
[31m-      end[m
[31m-    elseif p == "1" then[m
[31m-      if last == "ra" then[m
[31m-	operands[#operands] = nil[m
[31m-      end[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then operands[#operands+1] = x; last = x end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  stop = stop - stop % 4[m
[31m-  ctx.pos = ofs - ofs % 4[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  ctx.get = get_be[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m-local function create_el(code, addr, out)[m
[31m-  local ctx = create(code, addr, out)[m
[31m-  ctx.get = get_le[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m-local function disass_el(code, addr, out)[m
[31m-  create_el(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 32 then return map_gpr[r] end[m
[31m-  return "f"..(r-32)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  create_el = create_el,[m
[31m-  disass = disass,[m
[31m-  disass_el = disass_el,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_mipsel.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_mipsel.lua[m
[1mdeleted file mode 100644[m
[1mindex 3f2f6ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_mipsel.lua[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT MIPSEL disassembler wrapper module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This module just exports the little-endian functions from the[m
[31m--- MIPS disassembler module. All the interesting stuff is there.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local dis_mips = require((string.match(..., ".*%.") or "").."dis_mips")[m
[31m-return {[m
[31m-  create = dis_mips.create_el,[m
[31m-  disass = dis_mips.disass_el,[m
[31m-  regname = dis_mips.regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_ppc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_ppc.lua[m
[1mdeleted file mode 100644[m
[1mindex 30f51ec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_ppc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,591 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT PPC disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT/X license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles all common, non-privileged 32/64 bit PowerPC instructions[m
[31m--- plus the e500 SPE instructions and some Cell/Xenon extensions.[m
[31m---[m
[31m--- NYI: VMX, VMX128[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, tohex = bit.band, bit.bor, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Primary and extended opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_crops = {[m
[31m-  shift = 1, mask = 1023,[m
[31m-  [0] = "mcrfXX",[m
[31m-  [33] = "crnor|crnotCCC=", [129] = "crandcCCC",[m
[31m-  [193] = "crxor|crclrCCC%", [225] = "crnandCCC",[m
[31m-  [257] = "crandCCC", [289] = "creqv|crsetCCC%",[m
[31m-  [417] = "crorcCCC", [449] = "cror|crmoveCCC=",[m
[31m-  [16] = "b_lrKB", [528] = "b_ctrKB",[m
[31m-  [150] = "isync",[m
[31m-}[m
[31m-[m
[31m-local map_rlwinm = setmetatable({[m
[31m-  shift = 0, mask = -1,[m
[31m-},[m
[31m-{ __index = function(t, x)[m
[31m-    local rot = band(rshift(x, 11), 31)[m
[31m-    local mb = band(rshift(x, 6), 31)[m
[31m-    local me = band(rshift(x, 1), 31)[m
[31m-    if mb == 0 and me == 31-rot then[m
[31m-      return "slwiRR~A."[m
[31m-    elseif me == 31 and mb == 32-rot then[m
[31m-      return "srwiRR~-A."[m
[31m-    else[m
[31m-      return "rlwinmRR~AAA."[m
[31m-    end[m
[31m-  end[m
[31m-})[m
[31m-[m
[31m-local map_rld = {[m
[31m-  shift = 2, mask = 7,[m
[31m-  [0] = "rldiclRR~HM.", "rldicrRR~HM.", "rldicRR~HM.", "rldimiRR~HM.",[m
[31m-  {[m
[31m-    shift = 1, mask = 1,[m
[31m-    [0] = "rldclRR~RM.", "rldcrRR~RM.",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_ext = setmetatable({[m
[31m-  shift = 1, mask = 1023,[m
[31m-[m
[31m-  [0] = "cmp_YLRR", [32] = "cmpl_YLRR",[m
[31m-  [4] = "twARR", [68] = "tdARR",[m
[31m-[m
[31m-  [8] = "subfcRRR.", [40] = "subfRRR.",[m
[31m-  [104] = "negRR.", [136] = "subfeRRR.",[m
[31m-  [200] = "subfzeRR.", [232] = "subfmeRR.",[m
[31m-  [520] = "subfcoRRR.", [552] = "subfoRRR.",[m
[31m-  [616] = "negoRR.", [648] = "subfeoRRR.",[m
[31m-  [712] = "subfzeoRR.", [744] = "subfmeoRR.",[m
[31m-[m
[31m-  [9] = "mulhduRRR.", [73] = "mulhdRRR.", [233] = "mulldRRR.",[m
[31m-  [457] = "divduRRR.", [489] = "divdRRR.",[m
[31m-  [745] = "mulldoRRR.",[m
[31m-  [969] = "divduoRRR.", [1001] = "divdoRRR.",[m
[31m-[m
[31m-  [10] = "addcRRR.", [138] = "addeRRR.",[m
[31m-  [202] = "addzeRR.", [234] = "addmeRR.", [266] = "addRRR.",[m
[31m-  [522] = "addcoRRR.", [650] = "addeoRRR.",[m
[31m-  [714] = "addzeoRR.", [746] = "addmeoRR.", [778] = "addoRRR.",[m
[31m-[m
[31m-  [11] = "mulhwuRRR.", [75] = "mulhwRRR.", [235] = "mullwRRR.",[m
[31m-  [459] = "divwuRRR.", [491] = "divwRRR.",[m
[31m-  [747] = "mullwoRRR.",[m
[31m-  [971] = "divwouRRR.", [1003] = "divwoRRR.",[m
[31m-[m
[31m-  [15] = "iselltRRR", [47] = "iselgtRRR", [79] = "iseleqRRR",[m
[31m-[m
[31m-  [144] = { shift = 20, mask = 1, [0] = "mtcrfRZ~", "mtocrfRZ~", },[m
[31m-  [19] = { shift = 20, mask = 1, [0] = "mfcrR", "mfocrfRZ", },[m
[31m-  [371] = { shift = 11, mask = 1023, [392] = "mftbR", [424] = "mftbuR", },[m
[31m-  [339] = {[m
[31m-    shift = 11, mask = 1023,[m
[31m-    [32] = "mferR", [256] = "mflrR", [288] = "mfctrR", [16] = "mfspefscrR",[m
[31m-  },[m
[31m-  [467] = {[m
[31m-    shift = 11, mask = 1023,[m
[31m-    [32] = "mtxerR", [256] = "mtlrR", [288] = "mtctrR", [16] = "mtspefscrR",[m
[31m-  },[m
[31m-[m
[31m-  [20] = "lwarxRR0R", [84] = "ldarxRR0R",[m
[31m-[m
[31m-  [21] = "ldxRR0R", [53] = "lduxRRR",[m
[31m-  [149] = "stdxRR0R", [181] = "stduxRRR",[m
[31m-  [341] = "lwaxRR0R", [373] = "lwauxRRR",[m
[31m-[m
[31m-  [23] = "lwzxRR0R", [55] = "lwzuxRRR",[m
[31m-  [87] = "lbzxRR0R", [119] = "lbzuxRRR",[m
[31m-  [151] = "stwxRR0R", [183] = "stwuxRRR",[m
[31m-  [215] = "stbxRR0R", [247] = "stbuxRRR",[m
[31m-  [279] = "lhzxRR0R", [311] = "lhzuxRRR",[m
[31m-  [343] = "lhaxRR0R", [375] = "lhauxRRR",[m
[31m-  [407] = "sthxRR0R", [439] = "sthuxRRR",[m
[31m-[m
[31m-  [54] = "dcbst-R0R", [86] = "dcbf-R0R",[m
[31m-  [150] = "stwcxRR0R.", [214] = "stdcxRR0R.",[m
[31m-  [246] = "dcbtst-R0R", [278] = "dcbt-R0R",[m
[31m-  [310] = "eciwxRR0R", [438] = "ecowxRR0R",[m
[31m-  [470] = "dcbi-RR",[m
[31m-[m
[31m-  [598] = {[m
[31m-    shift = 21, mask = 3,[m
[31m-    [0] = "sync", "lwsync", "ptesync",[m
[31m-  },[m
[31m-  [758] = "dcba-RR",[m
[31m-  [854] = "eieio", [982] = "icbi-R0R", [1014] = "dcbz-R0R",[m
[31m-[m
[31m-  [26] = "cntlzwRR~", [58] = "cntlzdRR~",[m
[31m-  [122] = "popcntbRR~",[m
[31m-  [154] = "prtywRR~", [186] = "prtydRR~",[m
[31m-[m
[31m-  [28] = "andRR~R.", [60] = "andcRR~R.", [124] = "nor|notRR~R=.",[m
[31m-  [284] = "eqvRR~R.", [316] = "xorRR~R.",[m
[31m-  [412] = "orcRR~R.", [444] = "or|mrRR~R=.", [476] = "nandRR~R.",[m
[31m-  [508] = "cmpbRR~R",[m
[31m-[m
[31m-  [512] = "mcrxrX",[m
[31m-[m
[31m-  [532] = "ldbrxRR0R", [660] = "stdbrxRR0R",[m
[31m-[m
[31m-  [533] = "lswxRR0R", [597] = "lswiRR0A",[m
[31m-  [661] = "stswxRR0R", [725] = "stswiRR0A",[m
[31m-[m
[31m-  [534] = "lwbrxRR0R", [662] = "stwbrxRR0R",[m
[31m-  [790] = "lhbrxRR0R", [918] = "sthbrxRR0R",[m
[31m-[m
[31m-  [535] = "lfsxFR0R", [567] = "lfsuxFRR",[m
[31m-  [599] = "lfdxFR0R", [631] = "lfduxFRR",[m
[31m-  [663] = "stfsxFR0R", [695] = "stfsuxFRR",[m
[31m-  [727] = "stfdxFR0R", [759] = "stfduxFR0R",[m
[31m-  [855] = "lfiwaxFR0R",[m
[31m-  [983] = "stfiwxFR0R",[m
[31m-[m
[31m-  [24] = "slwRR~R.",[m
[31m-[m
[31m-  [27] = "sldRR~R.", [536] = "srwRR~R.",[m
[31m-  [792] = "srawRR~R.", [824] = "srawiRR~A.",[m
[31m-[m
[31m-  [794] = "sradRR~R.", [826] = "sradiRR~H.", [827] = "sradiRR~H.",[m
[31m-  [922] = "extshRR~.", [954] = "extsbRR~.", [986] = "extswRR~.",[m
[31m-[m
[31m-  [539] = "srdRR~R.",[m
[31m-},[m
[31m-{ __index = function(t, x)[m
[31m-    if band(x, 31) == 15 then return "iselRRRC" end[m
[31m-  end[m
[31m-})[m
[31m-[m
[31m-local map_ld = {[m
[31m-  shift = 0, mask = 3,[m
[31m-  [0] = "ldRRE", "lduRRE", "lwaRRE",[m
[31m-}[m
[31m-[m
[31m-local map_std = {[m
[31m-  shift = 0, mask = 3,[m
[31m-  [0] = "stdRRE", "stduRRE",[m
[31m-}[m
[31m-[m
[31m-local map_fps = {[m
[31m-  shift = 5, mask = 1,[m
[31m-  {[m
[31m-    shift = 1, mask = 15,[m
[31m-    [0] = false, false, "fdivsFFF.", false,[m
[31m-    "fsubsFFF.", "faddsFFF.", "fsqrtsF-F.", false,[m
[31m-    "fresF-F.", "fmulsFF-F.", "frsqrtesF-F.", false,[m
[31m-    "fmsubsFFFF~.", "fmaddsFFFF~.", "fnmsubsFFFF~.", "fnmaddsFFFF~.",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_fpd = {[m
[31m-  shift = 5, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 1, mask = 1023,[m
[31m-    [0] = "fcmpuXFF", [32] = "fcmpoXFF", [64] = "mcrfsXX",[m
[31m-    [38] = "mtfsb1A.", [70] = "mtfsb0A.", [134] = "mtfsfiA>>-A>",[m
[31m-    [8] = "fcpsgnFFF.", [40] = "fnegF-F.", [72] = "fmrF-F.",[m
[31m-    [136] = "fnabsF-F.", [264] = "fabsF-F.",[m
[31m-    [12] = "frspF-F.",[m
[31m-    [14] = "fctiwF-F.", [15] = "fctiwzF-F.",[m
[31m-    [583] = "mffsF.", [711] = "mtfsfZF.",[m
[31m-    [392] = "frinF-F.", [424] = "frizF-F.",[m
[31m-    [456] = "fripF-F.", [488] = "frimF-F.",[m
[31m-    [814] = "fctidF-F.", [815] = "fctidzF-F.", [846] = "fcfidF-F.",[m
[31m-  },[m
[31m-  {[m
[31m-    shift = 1, mask = 15,[m
[31m-    [0] = false, false, "fdivFFF.", false,[m
[31m-    "fsubFFF.", "faddFFF.", "fsqrtF-F.", "fselFFFF~.",[m
[31m-    "freF-F.", "fmulFF-F.", "frsqrteF-F.", false,[m
[31m-    "fmsubFFFF~.", "fmaddFFFF~.", "fnmsubFFFF~.", "fnmaddFFFF~.",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_spe = {[m
[31m-  shift = 0, mask = 2047,[m
[31m-[m
[31m-  [512] = "evaddwRRR", [514] = "evaddiwRAR~",[m
[31m-  [516] = "evsubwRRR~", [518] = "evsubiwRAR~",[m
[31m-  [520] = "evabsRR", [521] = "evnegRR",[m
[31m-  [522] = "evextsbRR", [523] = "evextshRR", [524] = "evrndwRR",[m
[31m-  [525] = "evcntlzwRR", [526] = "evcntlswRR",[m
[31m-[m
[31m-  [527] = "brincRRR",[m
[31m-[m
[31m-  [529] = "evandRRR", [530] = "evandcRRR", [534] = "evxorRRR",[m
[31m-  [535] = "evor|evmrRRR=", [536] = "evnor|evnotRRR=",[m
[31m-  [537] = "eveqvRRR", [539] = "evorcRRR", [542] = "evnandRRR",[m
[31m-[m
[31m-  [544] = "evsrwuRRR", [545] = "evsrwsRRR",[m
[31m-  [546] = "evsrwiuRRA", [547] = "evsrwisRRA",[m
[31m-  [548] = "evslwRRR", [550] = "evslwiRRA",[m
[31m-  [552] = "evrlwRRR", [553] = "evsplatiRS",[m
[31m-  [554] = "evrlwiRRA", [555] = "evsplatfiRS",[m
[31m-  [556] = "evmergehiRRR", [557] = "evmergeloRRR",[m
[31m-  [558] = "evmergehiloRRR", [559] = "evmergelohiRRR",[m
[31m-[m
[31m-  [560] = "evcmpgtuYRR", [561] = "evcmpgtsYRR",[m
[31m-  [562] = "evcmpltuYRR", [563] = "evcmpltsYRR",[m
[31m-  [564] = "evcmpeqYRR",[m
[31m-[m
[31m-  [632] = "evselRRR", [633] = "evselRRRW",[m
[31m-  [634] = "evselRRRW", [635] = "evselRRRW",[m
[31m-  [636] = "evselRRRW", [637] = "evselRRRW",[m
[31m-  [638] = "evselRRRW", [639] = "evselRRRW",[m
[31m-[m
[31m-  [640] = "evfsaddRRR", [641] = "evfssubRRR",[m
[31m-  [644] = "evfsabsRR", [645] = "evfsnabsRR", [646] = "evfsnegRR",[m
[31m-  [648] = "evfsmulRRR", [649] = "evfsdivRRR",[m
[31m-  [652] = "evfscmpgtYRR", [653] = "evfscmpltYRR", [654] = "evfscmpeqYRR",[m
[31m-  [656] = "evfscfuiR-R", [657] = "evfscfsiR-R",[m
[31m-  [658] = "evfscfufR-R", [659] = "evfscfsfR-R",[m
[31m-  [660] = "evfsctuiR-R", [661] = "evfsctsiR-R",[m
[31m-  [662] = "evfsctufR-R", [663] = "evfsctsfR-R",[m
[31m-  [664] = "evfsctuizR-R", [666] = "evfsctsizR-R",[m
[31m-  [668] = "evfststgtYRR", [669] = "evfststltYRR", [670] = "evfststeqYRR",[m
[31m-[m
[31m-  [704] = "efsaddRRR", [705] = "efssubRRR",[m
[31m-  [708] = "efsabsRR", [709] = "efsnabsRR", [710] = "efsnegRR",[m
[31m-  [712] = "efsmulRRR", [713] = "efsdivRRR",[m
[31m-  [716] = "efscmpgtYRR", [717] = "efscmpltYRR", [718] = "efscmpeqYRR",[m
[31m-  [719] = "efscfdR-R",[m
[31m-  [720] = "efscfuiR-R", [721] = "efscfsiR-R",[m
[31m-  [722] = "efscfufR-R", [723] = "efscfsfR-R",[m
[31m-  [724] = "efsctuiR-R", [725] = "efsctsiR-R",[m
[31m-  [726] = "efsctufR-R", [727] = "efsctsfR-R",[m
[31m-  [728] = "efsctuizR-R", [730] = "efsctsizR-R",[m
[31m-  [732] = "efststgtYRR", [733] = "efststltYRR", [734] = "efststeqYRR",[m
[31m-[m
[31m-  [736] = "efdaddRRR", [737] = "efdsubRRR",[m
[31m-  [738] = "efdcfuidR-R", [739] = "efdcfsidR-R",[m
[31m-  [740] = "efdabsRR", [741] = "efdnabsRR", [742] = "efdnegRR",[m
[31m-  [744] = "efdmulRRR", [745] = "efddivRRR",[m
[31m-  [746] = "efdctuidzR-R", [747] = "efdctsidzR-R",[m
[31m-  [748] = "efdcmpgtYRR", [749] = "efdcmpltYRR", [750] = "efdcmpeqYRR",[m
[31m-  [751] = "efdcfsR-R",[m
[31m-  [752] = "efdcfuiR-R", [753] = "efdcfsiR-R",[m
[31m-  [754] = "efdcfufR-R", [755] = "efdcfsfR-R",[m
[31m-  [756] = "efdctuiR-R", [757] = "efdctsiR-R",[m
[31m-  [758] = "efdctufR-R", [759] = "efdctsfR-R",[m
[31m-  [760] = "efdctuizR-R", [762] = "efdctsizR-R",[m
[31m-  [764] = "efdtstgtYRR", [765] = "efdtstltYRR", [766] = "efdtsteqYRR",[m
[31m-[m
[31m-  [768] = "evlddxRR0R", [769] = "evlddRR8",[m
[31m-  [770] = "evldwxRR0R", [771] = "evldwRR8",[m
[31m-  [772] = "evldhxRR0R", [773] = "evldhRR8",[m
[31m-  [776] = "evlhhesplatxRR0R", [777] = "evlhhesplatRR2",[m
[31m-  [780] = "evlhhousplatxRR0R", [781] = "evlhhousplatRR2",[m
[31m-  [782] = "evlhhossplatxRR0R", [783] = "evlhhossplatRR2",[m
[31m-  [784] = "evlwhexRR0R", [785] = "evlwheRR4",[m
[31m-  [788] = "evlwhouxRR0R", [789] = "evlwhouRR4",[m
[31m-  [790] = "evlwhosxRR0R", [791] = "evlwhosRR4",[m
[31m-  [792] = "evlwwsplatxRR0R", [793] = "evlwwsplatRR4",[m
[31m-  [796] = "evlwhsplatxRR0R", [797] = "evlwhsplatRR4",[m
[31m-[m
[31m-  [800] = "evstddxRR0R", [801] = "evstddRR8",[m
[31m-  [802] = "evstdwxRR0R", [803] = "evstdwRR8",[m
[31m-  [804] = "evstdhxRR0R", [805] = "evstdhRR8",[m
[31m-  [816] = "evstwhexRR0R", [817] = "evstwheRR4",[m
[31m-  [820] = "evstwhoxRR0R", [821] = "evstwhoRR4",[m
[31m-  [824] = "evstwwexRR0R", [825] = "evstwweRR4",[m
[31m-  [828] = "evstwwoxRR0R", [829] = "evstwwoRR4",[m
[31m-[m
[31m-  [1027] = "evmhessfRRR", [1031] = "evmhossfRRR", [1032] = "evmheumiRRR",[m
[31m-  [1033] = "evmhesmiRRR", [1035] = "evmhesmfRRR", [1036] = "evmhoumiRRR",[m
[31m-  [1037] = "evmhosmiRRR", [1039] = "evmhosmfRRR", [1059] = "evmhessfaRRR",[m
[31m-  [1063] = "evmhossfaRRR", [1064] = "evmheumiaRRR", [1065] = "evmhesmiaRRR",[m
[31m-  [1067] = "evmhesmfaRRR", [1068] = "evmhoumiaRRR", [1069] = "evmhosmiaRRR",[m
[31m-  [1071] = "evmhosmfaRRR", [1095] = "evmwhssfRRR", [1096] = "evmwlumiRRR",[m
[31m-  [1100] = "evmwhumiRRR", [1101] = "evmwhsmiRRR", [1103] = "evmwhsmfRRR",[m
[31m-  [1107] = "evmwssfRRR", [1112] = "evmwumiRRR", [1113] = "evmwsmiRRR",[m
[31m-  [1115] = "evmwsmfRRR", [1127] = "evmwhssfaRRR", [1128] = "evmwlumiaRRR",[m
[31m-  [1132] = "evmwhumiaRRR", [1133] = "evmwhsmiaRRR", [1135] = "evmwhsmfaRRR",[m
[31m-  [1139] = "evmwssfaRRR", [1144] = "evmwumiaRRR", [1145] = "evmwsmiaRRR",[m
[31m-  [1147] = "evmwsmfaRRR",[m
[31m-[m
[31m-  [1216] = "evaddusiaawRR", [1217] = "evaddssiaawRR",[m
[31m-  [1218] = "evsubfusiaawRR", [1219] = "evsubfssiaawRR",[m
[31m-  [1220] = "evmraRR",[m
[31m-  [1222] = "evdivwsRRR", [1223] = "evdivwuRRR",[m
[31m-  [1224] = "evaddumiaawRR", [1225] = "evaddsmiaawRR",[m
[31m-  [1226] = "evsubfumiaawRR", [1227] = "evsubfsmiaawRR",[m
[31m-[m
[31m-  [1280] = "evmheusiaawRRR", [1281] = "evmhessiaawRRR",[m
[31m-  [1283] = "evmhessfaawRRR", [1284] = "evmhousiaawRRR",[m
[31m-  [1285] = "evmhossiaawRRR", [1287] = "evmhossfaawRRR",[m
[31m-  [1288] = "evmheumiaawRRR", [1289] = "evmhesmiaawRRR",[m
[31m-  [1291] = "evmhesmfaawRRR", [1292] = "evmhoumiaawRRR",[m
[31m-  [1293] = "evmhosmiaawRRR", [1295] = "evmhosmfaawRRR",[m
[31m-  [1320] = "evmhegumiaaRRR", [1321] = "evmhegsmiaaRRR",[m
[31m-  [1323] = "evmhegsmfaaRRR", [1324] = "evmhogumiaaRRR",[m
[31m-  [1325] = "evmhogsmiaaRRR", [1327] = "evmhogsmfaaRRR",[m
[31m-  [1344] = "evmwlusiaawRRR", [1345] = "evmwlssiaawRRR",[m
[31m-  [1352] = "evmwlumiaawRRR", [1353] = "evmwlsmiaawRRR",[m
[31m-  [1363] = "evmwssfaaRRR", [1368] = "evmwumiaaRRR",[m
[31m-  [1369] = "evmwsmiaaRRR", [1371] = "evmwsmfaaRRR",[m
[31m-  [1408] = "evmheusianwRRR", [1409] = "evmhessianwRRR",[m
[31m-  [1411] = "evmhessfanwRRR", [1412] = "evmhousianwRRR",[m
[31m-  [1413] = "evmhossianwRRR", [1415] = "evmhossfanwRRR",[m
[31m-  [1416] = "evmheumianwRRR", [1417] = "evmhesmianwRRR",[m
[31m-  [1419] = "evmhesmfanwRRR", [1420] = "evmhoumianwRRR",[m
[31m-  [1421] = "evmhosmianwRRR", [1423] = "evmhosmfanwRRR",[m
[31m-  [1448] = "evmhegumianRRR", [1449] = "evmhegsmianRRR",[m
[31m-  [1451] = "evmhegsmfanRRR", [1452] = "evmhogumianRRR",[m
[31m-  [1453] = "evmhogsmianRRR", [1455] = "evmhogsmfanRRR",[m
[31m-  [1472] = "evmwlusianwRRR", [1473] = "evmwlssianwRRR",[m
[31m-  [1480] = "evmwlumianwRRR", [1481] = "evmwlsmianwRRR",[m
[31m-  [1491] = "evmwssfanRRR", [1496] = "evmwumianRRR",[m
[31m-  [1497] = "evmwsmianRRR", [1499] = "evmwsmfanRRR",[m
[31m-}[m
[31m-[m
[31m-local map_pri = {[m
[31m-  [0] = false,	false,		"tdiARI",	"twiARI",[m
[31m-  map_spe,	false,		false,		"mulliRRI",[m
[31m-  "subficRRI",	false,		"cmpl_iYLRU",	"cmp_iYLRI",[m
[31m-  "addicRRI",	"addic.RRI",	"addi|liRR0I",	"addis|lisRR0I",[m
[31m-  "b_KBJ",	"sc",		 "bKJ",		map_crops,[m
[31m-  "rlwimiRR~AAA.", map_rlwinm,	false,		"rlwnmRR~RAA.",[m
[31m-  "oriNRR~U",	"orisRR~U",	"xoriRR~U",	"xorisRR~U",[m
[31m-  "andi.RR~U",	"andis.RR~U",	map_rld,	map_ext,[m
[31m-  "lwzRRD",	"lwzuRRD",	"lbzRRD",	"lbzuRRD",[m
[31m-  "stwRRD",	"stwuRRD",	"stbRRD",	"stbuRRD",[m
[31m-  "lhzRRD",	"lhzuRRD",	"lhaRRD",	"lhauRRD",[m
[31m-  "sthRRD",	"sthuRRD",	"lmwRRD",	"stmwRRD",[m
[31m-  "lfsFRD",	"lfsuFRD",	"lfdFRD",	"lfduFRD",[m
[31m-  "stfsFRD",	"stfsuFRD",	"stfdFRD",	"stfduFRD",[m
[31m-  false,	false,		map_ld,		map_fps,[m
[31m-  false,	false,		map_std,	map_fpd,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "sp", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",[m
[31m-  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",[m
[31m-  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",[m
[31m-}[m
[31m-[m
[31m-local map_cond = { [0] = "lt", "gt", "eq", "so", "ge", "le", "ne", "ns", }[m
[31m-[m
[31m--- Format a condition bit.[m
[31m-local function condfmt(cond)[m
[31m-  if cond <= 3 then[m
[31m-    return map_cond[band(cond, 3)][m
[31m-  else[m
[31m-    return format("4*cr%d+%s", rshift(cond, 2), map_cond[band(cond, 3)])[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then extra = "\t->"..sym end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  local op = bor(lshift(b0, 24), lshift(b1, 16), lshift(b2, 8), b3)[m
[31m-  local operands = {}[m
[31m-  local last = nil[m
[31m-  local rs = 21[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local opat = map_pri[rshift(b0, 2)][m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)][m
[31m-  end[m
[31m-  local name, pat = match(opat, "^([a-z0-9_.]*)(.*)")[m
[31m-  local altname, pat2 = match(pat, "|([a-z0-9_.]*)(.*)")[m
[31m-  if altname then pat = pat2 end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "R" then[m
[31m-      x = map_gpr[band(rshift(op, rs), 31)][m
[31m-      rs = rs - 5[m
[31m-    elseif p == "F" then[m
[31m-      x = "f"..band(rshift(op, rs), 31)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "A" then[m
[31m-      x = band(rshift(op, rs), 31)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "S" then[m
[31m-      x = arshift(lshift(op, 27-rs), 27)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "I" then[m
[31m-      x = arshift(lshift(op, 16), 16)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(op, 0xffff)[m
[31m-    elseif p == "D" or p == "E" then[m
[31m-      local disp = arshift(lshift(op, 16), 16)[m
[31m-      if p == "E" then disp = band(disp, -4) end[m
[31m-      if last == "r0" then last = "0" end[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p >= "2" and p <= "8" then[m
[31m-      local disp = band(rshift(op, rs), 31) * p[m
[31m-      if last == "r0" then last = "0" end[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p == "H" then[m
[31m-      x = band(rshift(op, rs), 31) + lshift(band(op, 2), 4)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "M" then[m
[31m-      x = band(rshift(op, rs), 31) + band(op, 0x20)[m
[31m-    elseif p == "C" then[m
[31m-      x = condfmt(band(rshift(op, rs), 31))[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "B" then[m
[31m-      local bo = rshift(op, 21)[m
[31m-      local cond = band(rshift(op, 16), 31)[m
[31m-      local cn = ""[m
[31m-      rs = rs - 10[m
[31m-      if band(bo, 4) == 0 then[m
[31m-	cn = band(bo, 2) == 0 and "dnz" or "dz"[m
[31m-	if band(bo, 0x10) == 0 then[m
[31m-	  cn = cn..(band(bo, 8) == 0 and "f" or "t")[m
[31m-	end[m
[31m-	if band(bo, 0x10) == 0 then x = condfmt(cond) end[m
[31m-	name = name..(band(bo, 1) == band(rshift(op, 15), 1) and "-" or "+")[m
[31m-      elseif band(bo, 0x10) == 0 then[m
[31m-	cn = map_cond[band(cond, 3) + (band(bo, 8) == 0 and 4 or 0)][m
[31m-	if cond > 3 then x = "cr"..rshift(cond, 2) end[m
[31m-	name = name..(band(bo, 1) == band(rshift(op, 15), 1) and "-" or "+")[m
[31m-      end[m
[31m-      name = gsub(name, "_", cn)[m
[31m-    elseif p == "J" then[m
[31m-      x = arshift(lshift(op, 27-rs), 29-rs)*4[m
[31m-      if band(op, 2) == 0 then x = ctx.addr + pos + x end[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "K" then[m
[31m-      if band(op, 1) ~= 0 then name = name.."l" end[m
[31m-      if band(op, 2) ~= 0 then name = name.."a" end[m
[31m-    elseif p == "X" or p == "Y" then[m
[31m-      x = band(rshift(op, rs+2), 7)[m
[31m-      if x == 0 and p == "Y" then x = nil else x = "cr"..x end[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "W" then[m
[31m-      x = "cr"..band(op, 7)[m
[31m-    elseif p == "Z" then[m
[31m-      x = band(rshift(op, rs-4), 255)[m
[31m-      rs = rs - 10[m
[31m-    elseif p == ">" then[m
[31m-      operands[#operands] = rshift(operands[#operands], 1)[m
[31m-    elseif p == "0" then[m
[31m-      if last == "r0" then[m
[31m-	operands[#operands] = nil[m
[31m-	if altname then name = altname end[m
[31m-      end[m
[31m-    elseif p == "L" then[m
[31m-      name = gsub(name, "_", band(op, 0x00200000) ~= 0 and "d" or "w")[m
[31m-    elseif p == "." then[m
[31m-      if band(op, 1) == 1 then name = name.."." end[m
[31m-    elseif p == "N" then[m
[31m-      if op == 0x60000000 then name = "nop"; break end[m
[31m-    elseif p == "~" then[m
[31m-      local n = #operands[m
[31m-      operands[n-1],  operands[n] = operands[n], operands[n-1][m
[31m-    elseif p == "=" then[m
[31m-      local n = #operands[m
[31m-      if last == operands[n-1] then[m
[31m-	operands[n] = nil[m
[31m-	name = altname[m
[31m-      end[m
[31m-    elseif p == "%" then[m
[31m-      local n = #operands[m
[31m-      if last == operands[n-1] and last == operands[n-2] then[m
[31m-	operands[n] = nil[m
[31m-	operands[n-1] = nil[m
[31m-	name = altname[m
[31m-      end[m
[31m-    elseif p == "-" then[m
[31m-      rs = rs - 5[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then operands[#operands+1] = x; last = x end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  stop = stop - stop % 4[m
[31m-  ctx.pos = ofs - ofs % 4[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 32 then return map_gpr[r] end[m
[31m-  return "f"..(r-32)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  disass = disass,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_x64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_x64.lua[m
[1mdeleted file mode 100644[m
[1mindex 077b1b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_x64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT x64 disassembler wrapper module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This module just exports the 64 bit functions from the combined[m
[31m--- x86/x64 disassembler module. All the interesting stuff is there.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local dis_x86 = require((string.match(..., ".*%.") or "").."dis_x86")[m
[31m-return {[m
[31m-  create = dis_x86.create64,[m
[31m-  disass = dis_x86.disass64,[m
[31m-  regname = dis_x86.regname64[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_x86.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_x86.lua[m
[1mdeleted file mode 100644[m
[1mindex 0bbd198..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dis_x86.lua[m
[1m+++ /dev/null[m
[36m@@ -1,931 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT x86/x64 disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- Sending small code snippets to an external disassembler and mixing the[m
[31m--- output with our own stuff was too fragile. So I had to bite the bullet[m
[31m--- and write yet another x86 disassembler. Oh well ...[m
[31m---[m
[31m--- The output format is very similar to what ndisasm generates. But it has[m
[31m--- been developed independently by looking at the opcode tables from the[m
[31m--- Intel and AMD manuals. The supported instruction set is quite extensive[m
[31m--- and reflects what a current generation Intel or AMD CPU implements in[m
[31m--- 32 bit and 64 bit mode. Yes, this includes MMX, SSE, SSE2, SSE3, SSSE3,[m
[31m--- SSE4.1, SSE4.2, SSE4a, AVX, AVX2 and even privileged and hypervisor[m
[31m--- (VMX/SVM) instructions.[m
[31m---[m
[31m--- Notes:[m
[31m--- * The (useless) a16 prefix, 3DNow and pre-586 opcodes are unsupported.[m
[31m--- * No attempt at optimization has been made -- it's fast enough for my needs.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local lower, rep = string.lower, string.rep[m
[31m-local bit = require("bit")[m
[31m-local tohex = bit.tohex[m
[31m-[m
[31m--- Map for 1st opcode byte in 32 bit mode. Ugly? Well ... read on.[m
[31m-local map_opc1_32 = {[m
[31m---0x[m
[31m-[0]="addBmr","addVmr","addBrm","addVrm","addBai","addVai","push es","pop es",[m
[31m-"orBmr","orVmr","orBrm","orVrm","orBai","orVai","push cs","opc2*",[m
[31m---1x[m
[31m-"adcBmr","adcVmr","adcBrm","adcVrm","adcBai","adcVai","push ss","pop ss",[m
[31m-"sbbBmr","sbbVmr","sbbBrm","sbbVrm","sbbBai","sbbVai","push ds","pop ds",[m
[31m---2x[m
[31m-"andBmr","andVmr","andBrm","andVrm","andBai","andVai","es:seg","daa",[m
[31m-"subBmr","subVmr","subBrm","subVrm","subBai","subVai","cs:seg","das",[m
[31m---3x[m
[31m-"xorBmr","xorVmr","xorBrm","xorVrm","xorBai","xorVai","ss:seg","aaa",[m
[31m-"cmpBmr","cmpVmr","cmpBrm","cmpVrm","cmpBai","cmpVai","ds:seg","aas",[m
[31m---4x[m
[31m-"incVR","incVR","incVR","incVR","incVR","incVR","incVR","incVR",[m
[31m-"decVR","decVR","decVR","decVR","decVR","decVR","decVR","decVR",[m
[31m---5x[m
[31m-"pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR",[m
[31m-"popUR","popUR","popUR","popUR","popUR","popUR","popUR","popUR",[m
[31m---6x[m
[31m-"sz*pushaw,pusha","sz*popaw,popa","boundVrm","arplWmr",[m
[31m-"fs:seg","gs:seg","o16:","a16",[m
[31m-"pushUi","imulVrmi","pushBs","imulVrms",[m
[31m-"insb","insVS","outsb","outsVS",[m
[31m---7x[m
[31m-"joBj","jnoBj","jbBj","jnbBj","jzBj","jnzBj","jbeBj","jaBj",[m
[31m-"jsBj","jnsBj","jpeBj","jpoBj","jlBj","jgeBj","jleBj","jgBj",[m
[31m---8x[m
[31m-"arith!Bmi","arith!Vmi","arith!Bmi","arith!Vms",[m
[31m-"testBmr","testVmr","xchgBrm","xchgVrm",[m
[31m-"movBmr","movVmr","movBrm","movVrm",[m
[31m-"movVmg","leaVrm","movWgm","popUm",[m
[31m---9x[m
[31m-"nop*xchgVaR|pause|xchgWaR|repne nop","xchgVaR","xchgVaR","xchgVaR",[m
[31m-"xchgVaR","xchgVaR","xchgVaR","xchgVaR",[m
[31m-"sz*cbw,cwde,cdqe","sz*cwd,cdq,cqo","call farViw","wait",[m
[31m-"sz*pushfw,pushf","sz*popfw,popf","sahf","lahf",[m
[31m---Ax[m
[31m-"movBao","movVao","movBoa","movVoa",[m
[31m-"movsb","movsVS","cmpsb","cmpsVS",[m
[31m-"testBai","testVai","stosb","stosVS",[m
[31m-"lodsb","lodsVS","scasb","scasVS",[m
[31m---Bx[m
[31m-"movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi",[m
[31m-"movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI",[m
[31m---Cx[m
[31m-"shift!Bmu","shift!Vmu","retBw","ret","vex*3$lesVrm","vex*2$ldsVrm","movBmi","movVmi",[m
[31m-"enterBwu","leave","retfBw","retf","int3","intBu","into","iretVS",[m
[31m---Dx[m
[31m-"shift!Bm1","shift!Vm1","shift!Bmc","shift!Vmc","aamBu","aadBu","salc","xlatb",[m
[31m-"fp*0","fp*1","fp*2","fp*3","fp*4","fp*5","fp*6","fp*7",[m
[31m---Ex[m
[31m-"loopneBj","loopeBj","loopBj","sz*jcxzBj,jecxzBj,jrcxzBj",[m
[31m-"inBau","inVau","outBua","outVua",[m
[31m-"callVj","jmpVj","jmp farViw","jmpBj","inBad","inVad","outBda","outVda",[m
[31m---Fx[m
[31m-"lock:","int1","repne:rep","rep:","hlt","cmc","testb!Bm","testv!Vm",[m
[31m-"clc","stc","cli","sti","cld","std","incb!Bm","incd!Vm",[m
[31m-}[m
[31m-assert(#map_opc1_32 == 255)[m
[31m-[m
[31m--- Map for 1st opcode byte in 64 bit mode (overrides only).[m
[31m-local map_opc1_64 = setmetatable({[m
[31m-  [0x06]=false, [0x07]=false, [0x0e]=false,[m
[31m-  [0x16]=false, [0x17]=false, [0x1e]=false, [0x1f]=false,[m
[31m-  [0x27]=false, [0x2f]=false, [0x37]=false, [0x3f]=false,[m
[31m-  [0x60]=false, [0x61]=false, [0x62]=false, [0x63]="movsxdVrDmt", [0x67]="a32:",[m
[31m-  [0x40]="rex*",   [0x41]="rex*b",   [0x42]="rex*x",   [0x43]="rex*xb",[m
[31m-  [0x44]="rex*r",  [0x45]="rex*rb",  [0x46]="rex*rx",  [0x47]="rex*rxb",[m
[31m-  [0x48]="rex*w",  [0x49]="rex*wb",  [0x4a]="rex*wx",  [0x4b]="rex*wxb",[m
[31m-  [0x4c]="rex*wr", [0x4d]="rex*wrb", [0x4e]="rex*wrx", [0x4f]="rex*wrxb",[m
[31m-  [0x82]=false, [0x9a]=false, [0xc4]="vex*3", [0xc5]="vex*2", [0xce]=false,[m
[31m-  [0xd4]=false, [0xd5]=false, [0xd6]=false, [0xea]=false,[m
[31m-}, { __index = map_opc1_32 })[m
[31m-[m
[31m--- Map for 2nd opcode byte (0F xx). True CISC hell. Hey, I told you.[m
[31m--- Prefix dependent MMX/SSE opcodes: (none)|rep|o16|repne, -|F3|66|F2[m
[31m-local map_opc2 = {[m
[31m---0x[m
[31m-[0]="sldt!Dmp","sgdt!Ump","larVrm","lslVrm",nil,"syscall","clts","sysret",[m
[31m-"invd","wbinvd",nil,"ud1",nil,"$prefetch!Bm","femms","3dnowMrmu",[m
[31m---1x[m
[31m-"movupsXrm|movssXrvm|movupdXrm|movsdXrvm",[m
[31m-"movupsXmr|movssXmvr|movupdXmr|movsdXmvr",[m
[31m-"movhlpsXrm$movlpsXrm|movsldupXrm|movlpdXrm|movddupXrm",[m
[31m-"movlpsXmr||movlpdXmr",[m
[31m-"unpcklpsXrvm||unpcklpdXrvm",[m
[31m-"unpckhpsXrvm||unpckhpdXrvm",[m
[31m-"movlhpsXrm$movhpsXrm|movshdupXrm|movhpdXrm",[m
[31m-"movhpsXmr||movhpdXmr",[m
[31m-"$prefetcht!Bm","hintnopVm","hintnopVm","hintnopVm",[m
[31m-"hintnopVm","hintnopVm","hintnopVm","hintnopVm",[m
[31m---2x[m
[31m-"movUmx$","movUmy$","movUxm$","movUym$","movUmz$",nil,"movUzm$",nil,[m
[31m-"movapsXrm||movapdXrm",[m
[31m-"movapsXmr||movapdXmr",[m
[31m-"cvtpi2psXrMm|cvtsi2ssXrvVmt|cvtpi2pdXrMm|cvtsi2sdXrvVmt",[m
[31m-"movntpsXmr|movntssXmr|movntpdXmr|movntsdXmr",[m
[31m-"cvttps2piMrXm|cvttss2siVrXm|cvttpd2piMrXm|cvttsd2siVrXm",[m
[31m-"cvtps2piMrXm|cvtss2siVrXm|cvtpd2piMrXm|cvtsd2siVrXm",[m
[31m-"ucomissXrm||ucomisdXrm",[m
[31m-"comissXrm||comisdXrm",[m
[31m---3x[m
[31m-"wrmsr","rdtsc","rdmsr","rdpmc","sysenter","sysexit",nil,"getsec",[m
[31m-"opc3*38",nil,"opc3*3a",nil,nil,nil,nil,nil,[m
[31m---4x[m
[31m-"cmovoVrm","cmovnoVrm","cmovbVrm","cmovnbVrm",[m
[31m-"cmovzVrm","cmovnzVrm","cmovbeVrm","cmovaVrm",[m
[31m-"cmovsVrm","cmovnsVrm","cmovpeVrm","cmovpoVrm",[m
[31m-"cmovlVrm","cmovgeVrm","cmovleVrm","cmovgVrm",[m
[31m---5x[m
[31m-"movmskpsVrXm$||movmskpdVrXm$","sqrtpsXrm|sqrtssXrm|sqrtpdXrm|sqrtsdXrm",[m
[31m-"rsqrtpsXrm|rsqrtssXrvm","rcppsXrm|rcpssXrvm",[m
[31m-"andpsXrvm||andpdXrvm","andnpsXrvm||andnpdXrvm",[m
[31m-"orpsXrvm||orpdXrvm","xorpsXrvm||xorpdXrvm",[m
[31m-"addpsXrvm|addssXrvm|addpdXrvm|addsdXrvm","mulpsXrvm|mulssXrvm|mulpdXrvm|mulsdXrvm",[m
[31m-"cvtps2pdXrm|cvtss2sdXrvm|cvtpd2psXrm|cvtsd2ssXrvm",[m
[31m-"cvtdq2psXrm|cvttps2dqXrm|cvtps2dqXrm",[m
[31m-"subpsXrvm|subssXrvm|subpdXrvm|subsdXrvm","minpsXrvm|minssXrvm|minpdXrvm|minsdXrvm",[m
[31m-"divpsXrvm|divssXrvm|divpdXrvm|divsdXrvm","maxpsXrvm|maxssXrvm|maxpdXrvm|maxsdXrvm",[m
[31m---6x[m
[31m-"punpcklbwPrvm","punpcklwdPrvm","punpckldqPrvm","packsswbPrvm",[m
[31m-"pcmpgtbPrvm","pcmpgtwPrvm","pcmpgtdPrvm","packuswbPrvm",[m
[31m-"punpckhbwPrvm","punpckhwdPrvm","punpckhdqPrvm","packssdwPrvm",[m
[31m-"||punpcklqdqXrvm","||punpckhqdqXrvm",[m
[31m-"movPrVSm","movqMrm|movdquXrm|movdqaXrm",[m
[31m---7x[m
[31m-"pshufwMrmu|pshufhwXrmu|pshufdXrmu|pshuflwXrmu","pshiftw!Pvmu",[m
[31m-"pshiftd!Pvmu","pshiftq!Mvmu||pshiftdq!Xvmu",[m
[31m-"pcmpeqbPrvm","pcmpeqwPrvm","pcmpeqdPrvm","emms*|",[m
[31m-"vmreadUmr||extrqXmuu$|insertqXrmuu$","vmwriteUrm||extrqXrm$|insertqXrm$",[m
[31m-nil,nil,[m
[31m-"||haddpdXrvm|haddpsXrvm","||hsubpdXrvm|hsubpsXrvm",[m
[31m-"movVSmMr|movqXrm|movVSmXr","movqMmr|movdquXmr|movdqaXmr",[m
[31m---8x[m
[31m-"joVj","jnoVj","jbVj","jnbVj","jzVj","jnzVj","jbeVj","jaVj",[m
[31m-"jsVj","jnsVj","jpeVj","jpoVj","jlVj","jgeVj","jleVj","jgVj",[m
[31m---9x[m
[31m-"setoBm","setnoBm","setbBm","setnbBm","setzBm","setnzBm","setbeBm","setaBm",[m
[31m-"setsBm","setnsBm","setpeBm","setpoBm","setlBm","setgeBm","setleBm","setgBm",[m
[31m---Ax[m
[31m-"push fs","pop fs","cpuid","btVmr","shldVmru","shldVmrc",nil,nil,[m
[31m-"push gs","pop gs","rsm","btsVmr","shrdVmru","shrdVmrc","fxsave!Dmp","imulVrm",[m
[31m---Bx[m
[31m-"cmpxchgBmr","cmpxchgVmr","$lssVrm","btrVmr",[m
[31m-"$lfsVrm","$lgsVrm","movzxVrBmt","movzxVrWmt",[m
[31m-"|popcntVrm","ud2Dp","bt!Vmu","btcVmr",[m
[31m-"bsfVrm","bsrVrm|lzcntVrm|bsrWrm","movsxVrBmt","movsxVrWmt",[m
[31m---Cx[m
[31m-"xaddBmr","xaddVmr",[m
[31m-"cmppsXrvmu|cmpssXrvmu|cmppdXrvmu|cmpsdXrvmu","$movntiVmr|",[m
[31m-"pinsrwPrvWmu","pextrwDrPmu",[m
[31m-"shufpsXrvmu||shufpdXrvmu","$cmpxchg!Qmp",[m
[31m-"bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR",[m
[31m---Dx[m
[31m-"||addsubpdXrvm|addsubpsXrvm","psrlwPrvm","psrldPrvm","psrlqPrvm",[m
[31m-"paddqPrvm","pmullwPrvm",[m
[31m-"|movq2dqXrMm|movqXmr|movdq2qMrXm$","pmovmskbVrMm||pmovmskbVrXm",[m
[31m-"psubusbPrvm","psubuswPrvm","pminubPrvm","pandPrvm",[m
[31m-"paddusbPrvm","padduswPrvm","pmaxubPrvm","pandnPrvm",[m
[31m---Ex[m
[31m-"pavgbPrvm","psrawPrvm","psradPrvm","pavgwPrvm",[m
[31m-"pmulhuwPrvm","pmulhwPrvm",[m
[31m-"|cvtdq2pdXrm|cvttpd2dqXrm|cvtpd2dqXrm","$movntqMmr||$movntdqXmr",[m
[31m-"psubsbPrvm","psubswPrvm","pminswPrvm","porPrvm",[m
[31m-"paddsbPrvm","paddswPrvm","pmaxswPrvm","pxorPrvm",[m
[31m---Fx[m
[31m-"|||lddquXrm","psllwPrvm","pslldPrvm","psllqPrvm",[m
[31m-"pmuludqPrvm","pmaddwdPrvm","psadbwPrvm","maskmovqMrm||maskmovdquXrm$",[m
[31m-"psubbPrvm","psubwPrvm","psubdPrvm","psubqPrvm",[m
[31m-"paddbPrvm","paddwPrvm","padddPrvm","ud",[m
[31m-}[m
[31m-assert(map_opc2[255] == "ud")[m
[31m-[m
[31m--- Map for three-byte opcodes. Can't wait for their next invention.[m
[31m-local map_opc3 = {[m
[31m-["38"] = { -- [66] 0f 38 xx[m
[31m---0x[m
[31m-[0]="pshufbPrvm","phaddwPrvm","phadddPrvm","phaddswPrvm",[m
[31m-"pmaddubswPrvm","phsubwPrvm","phsubdPrvm","phsubswPrvm",[m
[31m-"psignbPrvm","psignwPrvm","psigndPrvm","pmulhrswPrvm",[m
[31m-"||permilpsXrvm","||permilpdXrvm",nil,nil,[m
[31m---1x[m
[31m-"||pblendvbXrma",nil,nil,nil,[m
[31m-"||blendvpsXrma","||blendvpdXrma","||permpsXrvm","||ptestXrm",[m
[31m-"||broadcastssXrm","||broadcastsdXrm","||broadcastf128XrlXm",nil,[m
[31m-"pabsbPrm","pabswPrm","pabsdPrm",nil,[m
[31m---2x[m
[31m-"||pmovsxbwXrm","||pmovsxbdXrm","||pmovsxbqXrm","||pmovsxwdXrm",[m
[31m-"||pmovsxwqXrm","||pmovsxdqXrm",nil,nil,[m
[31m-"||pmuldqXrvm","||pcmpeqqXrvm","||$movntdqaXrm","||packusdwXrvm",[m
[31m-"||maskmovpsXrvm","||maskmovpdXrvm","||maskmovpsXmvr","||maskmovpdXmvr",[m
[31m---3x[m
[31m-"||pmovzxbwXrm","||pmovzxbdXrm","||pmovzxbqXrm","||pmovzxwdXrm",[m
[31m-"||pmovzxwqXrm","||pmovzxdqXrm","||permdXrvm","||pcmpgtqXrvm",[m
[31m-"||pminsbXrvm","||pminsdXrvm","||pminuwXrvm","||pminudXrvm",[m
[31m-"||pmaxsbXrvm","||pmaxsdXrvm","||pmaxuwXrvm","||pmaxudXrvm",[m
[31m---4x[m
[31m-"||pmulddXrvm","||phminposuwXrm",nil,nil,[m
[31m-nil,"||psrlvVSXrvm","||psravdXrvm","||psllvVSXrvm",[m
[31m---5x[m
[31m-[0x58] = "||pbroadcastdXrlXm",[0x59] = "||pbroadcastqXrlXm",[m
[31m-[0x5a] = "||broadcasti128XrlXm",[m
[31m---7x[m
[31m-[0x78] = "||pbroadcastbXrlXm",[0x79] = "||pbroadcastwXrlXm",[m
[31m---8x[m
[31m-[0x8c] = "||pmaskmovXrvVSm",[m
[31m-[0x8e] = "||pmaskmovVSmXvr",[m
[31m---Dx[m
[31m-[0xdc] = "||aesencXrvm", [0xdd] = "||aesenclastXrvm",[m
[31m-[0xde] = "||aesdecXrvm", [0xdf] = "||aesdeclastXrvm",[m
[31m---Fx[m
[31m-[0xf0] = "|||crc32TrBmt",[0xf1] = "|||crc32TrVmt",[m
[31m-[0xf7] = "| sarxVrmv| shlxVrmv| shrxVrmv",[m
[31m-},[m
[31m-[m
[31m-["3a"] = { -- [66] 0f 3a xx[m
[31m---0x[m
[31m-[0x00]="||permqXrmu","||permpdXrmu","||pblenddXrvmu",nil,[m
[31m-"||permilpsXrmu","||permilpdXrmu","||perm2f128Xrvmu",nil,[m
[31m-"||roundpsXrmu","||roundpdXrmu","||roundssXrvmu","||roundsdXrvmu",[m
[31m-"||blendpsXrvmu","||blendpdXrvmu","||pblendwXrvmu","palignrPrvmu",[m
[31m---1x[m
[31m-nil,nil,nil,nil,[m
[31m-"||pextrbVmXru","||pextrwVmXru","||pextrVmSXru","||extractpsVmXru",[m
[31m-"||insertf128XrvlXmu","||extractf128XlXmYru",nil,nil,[m
[31m-nil,nil,nil,nil,[m
[31m---2x[m
[31m-"||pinsrbXrvVmu","||insertpsXrvmu","||pinsrXrvVmuS",nil,[m
[31m---3x[m
[31m-[0x38] = "||inserti128Xrvmu",[0x39] = "||extracti128XlXmYru",[m
[31m---4x[m
[31m-[0x40] = "||dppsXrvmu",[m
[31m-[0x41] = "||dppdXrvmu",[m
[31m-[0x42] = "||mpsadbwXrvmu",[m
[31m-[0x44] = "||pclmulqdqXrvmu",[m
[31m-[0x46] = "||perm2i128Xrvmu",[m
[31m-[0x4a] = "||blendvpsXrvmb",[0x4b] = "||blendvpdXrvmb",[m
[31m-[0x4c] = "||pblendvbXrvmb",[m
[31m---6x[m
[31m-[0x60] = "||pcmpestrmXrmu",[0x61] = "||pcmpestriXrmu",[m
[31m-[0x62] = "||pcmpistrmXrmu",[0x63] = "||pcmpistriXrmu",[m
[31m-[0xdf] = "||aeskeygenassistXrmu",[m
[31m---Fx[m
[31m-[0xf0] = "||| rorxVrmu",[m
[31m-},[m
[31m-}[m
[31m-[m
[31m--- Map for VMX/SVM opcodes 0F 01 C0-FF (sgdt group with register operands).[m
[31m-local map_opcvm = {[m
[31m-[0xc1]="vmcall",[0xc2]="vmlaunch",[0xc3]="vmresume",[0xc4]="vmxoff",[m
[31m-[0xc8]="monitor",[0xc9]="mwait",[m
[31m-[0xd8]="vmrun",[0xd9]="vmmcall",[0xda]="vmload",[0xdb]="vmsave",[m
[31m-[0xdc]="stgi",[0xdd]="clgi",[0xde]="skinit",[0xdf]="invlpga",[m
[31m-[0xf8]="swapgs",[0xf9]="rdtscp",[m
[31m-}[m
[31m-[m
[31m--- Map for FP opcodes. And you thought stack machines are simple?[m
[31m-local map_opcfp = {[m
[31m--- D8-DF 00-BF: opcodes with a memory operand.[m
[31m--- D8[m
[31m-[0]="faddFm","fmulFm","fcomFm","fcompFm","fsubFm","fsubrFm","fdivFm","fdivrFm",[m
[31m-"fldFm",nil,"fstFm","fstpFm","fldenvVm","fldcwWm","fnstenvVm","fnstcwWm",[m
[31m--- DA[m
[31m-"fiaddDm","fimulDm","ficomDm","ficompDm",[m
[31m-"fisubDm","fisubrDm","fidivDm","fidivrDm",[m
[31m--- DB[m
[31m-"fildDm","fisttpDm","fistDm","fistpDm",nil,"fld twordFmp",nil,"fstp twordFmp",[m
[31m--- DC[m
[31m-"faddGm","fmulGm","fcomGm","fcompGm","fsubGm","fsubrGm","fdivGm","fdivrGm",[m
[31m--- DD[m
[31m-"fldGm","fisttpQm","fstGm","fstpGm","frstorDmp",nil,"fnsaveDmp","fnstswWm",[m
[31m--- DE[m
[31m-"fiaddWm","fimulWm","ficomWm","ficompWm",[m
[31m-"fisubWm","fisubrWm","fidivWm","fidivrWm",[m
[31m--- DF[m
[31m-"fildWm","fisttpWm","fistWm","fistpWm",[m
[31m-"fbld twordFmp","fildQm","fbstp twordFmp","fistpQm",[m
[31m--- xx C0-FF: opcodes with a pseudo-register operand.[m
[31m--- D8[m
[31m-"faddFf","fmulFf","fcomFf","fcompFf","fsubFf","fsubrFf","fdivFf","fdivrFf",[m
[31m--- D9[m
[31m-"fldFf","fxchFf",{"fnop"},nil,[m
[31m-{"fchs","fabs",nil,nil,"ftst","fxam"},[m
[31m-{"fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz"},[m
[31m-{"f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp"},[m
[31m-{"fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos"},[m
[31m--- DA[m
[31m-"fcmovbFf","fcmoveFf","fcmovbeFf","fcmovuFf",nil,{nil,"fucompp"},nil,nil,[m
[31m--- DB[m
[31m-"fcmovnbFf","fcmovneFf","fcmovnbeFf","fcmovnuFf",[m
[31m-{nil,nil,"fnclex","fninit"},"fucomiFf","fcomiFf",nil,[m
[31m--- DC[m
[31m-"fadd toFf","fmul toFf",nil,nil,[m
[31m-"fsub toFf","fsubr toFf","fdivr toFf","fdiv toFf",[m
[31m--- DD[m
[31m-"ffreeFf",nil,"fstFf","fstpFf","fucomFf","fucompFf",nil,nil,[m
[31m--- DE[m
[31m-"faddpFf","fmulpFf",nil,{nil,"fcompp"},[m
[31m-"fsubrpFf","fsubpFf","fdivrpFf","fdivpFf",[m
[31m--- DF[m
[31m-nil,nil,nil,nil,{"fnstsw ax"},"fucomipFf","fcomipFf",nil,[m
[31m-}[m
[31m-assert(map_opcfp[126] == "fcomipFf")[m
[31m-[m
[31m--- Map for opcode groups. The subkey is sp from the ModRM byte.[m
[31m-local map_opcgroup = {[m
[31m-  arith = { "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" },[m
[31m-  shift = { "rol", "ror", "rcl", "rcr", "shl", "shr", "sal", "sar" },[m
[31m-  testb = { "testBmi", "testBmi", "not", "neg", "mul", "imul", "div", "idiv" },[m
[31m-  testv = { "testVmi", "testVmi", "not", "neg", "mul", "imul", "div", "idiv" },[m
[31m-  incb = { "inc", "dec" },[m
[31m-  incd = { "inc", "dec", "callUmp", "$call farDmp",[m
[31m-	   "jmpUmp", "$jmp farDmp", "pushUm" },[m
[31m-  sldt = { "sldt", "str", "lldt", "ltr", "verr", "verw" },[m
[31m-  sgdt = { "vm*$sgdt", "vm*$sidt", "$lgdt", "vm*$lidt",[m
[31m-	   "smsw", nil, "lmsw", "vm*$invlpg" },[m
[31m-  bt = { nil, nil, nil, nil, "bt", "bts", "btr", "btc" },[m
[31m-  cmpxchg = { nil, "sz*,cmpxchg8bQmp,cmpxchg16bXmp", nil, nil,[m
[31m-	      nil, nil, "vmptrld|vmxon|vmclear", "vmptrst" },[m
[31m-  pshiftw = { nil, nil, "psrlw", nil, "psraw", nil, "psllw" },[m
[31m-  pshiftd = { nil, nil, "psrld", nil, "psrad", nil, "pslld" },[m
[31m-  pshiftq = { nil, nil, "psrlq", nil, nil, nil, "psllq" },[m
[31m-  pshiftdq = { nil, nil, "psrlq", "psrldq", nil, nil, "psllq", "pslldq" },[m
[31m-  fxsave = { "$fxsave", "$fxrstor", "$ldmxcsr", "$stmxcsr",[m
[31m-	     nil, "lfenceDp$", "mfenceDp$", "sfenceDp$clflush" },[m
[31m-  prefetch = { "prefetch", "prefetchw" },[m
[31m-  prefetcht = { "prefetchnta", "prefetcht0", "prefetcht1", "prefetcht2" },[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Maps for register names.[m
[31m-local map_regs = {[m
[31m-  B = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",[m
[31m-	"r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" },[m
[31m-  B64 = { "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",[m
[31m-	  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" },[m
[31m-  W = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",[m
[31m-	"r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" },[m
[31m-  D = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",[m
[31m-	"r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" },[m
[31m-  Q = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",[m
[31m-	"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" },[m
[31m-  M = { "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",[m
[31m-	"mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7" }, -- No x64 ext![m
[31m-  X = { "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",[m
[31m-	"xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" },[m
[31m-  Y = { "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",[m
[31m-	"ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15" },[m
[31m-}[m
[31m-local map_segregs = { "es", "cs", "ss", "ds", "fs", "gs", "segr6", "segr7" }[m
[31m-[m
[31m--- Maps for size names.[m
[31m-local map_sz2n = {[m
[31m-  B = 1, W = 2, D = 4, Q = 8, M = 8, X = 16, Y = 32,[m
[31m-}[m
[31m-local map_sz2prefix = {[m
[31m-  B = "byte", W = "word", D = "dword",[m
[31m-  Q = "qword",[m
[31m-  M = "qword", X = "xword", Y = "yword",[m
[31m-  F = "dword", G = "qword", -- No need for sizes/register names for these two.[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local code, pos, hex = ctx.code, ctx.pos, ""[m
[31m-  local hmax = ctx.hexdump[m
[31m-  if hmax > 0 then[m
[31m-    for i=ctx.start,pos-1 do[m
[31m-      hex = hex..format("%02X", byte(code, i, i))[m
[31m-    end[m
[31m-    if #hex > hmax then hex = sub(hex, 1, hmax)..". "[m
[31m-    else hex = hex..rep(" ", hmax-#hex+2) end[m
[31m-  end[m
[31m-  if operands then text = text.." "..operands end[m
[31m-  if ctx.o16 then text = "o16 "..text; ctx.o16 = false end[m
[31m-  if ctx.a32 then text = "a32 "..text; ctx.a32 = false end[m
[31m-  if ctx.rep then text = ctx.rep.." "..text; ctx.rep = false end[m
[31m-  if ctx.rex then[m
[31m-    local t = (ctx.rexw and "w" or "")..(ctx.rexr and "r" or "")..[m
[31m-	      (ctx.rexx and "x" or "")..(ctx.rexb and "b" or "")..[m
[31m-	      (ctx.vexl and "l" or "")[m
[31m-    if ctx.vexv and ctx.vexv ~= 0 then t = t.."v"..ctx.vexv end[m
[31m-    if t ~= "" then text = ctx.rex.."."..t.." "..gsub(text, "^ ", "")[m
[31m-    elseif ctx.rex == "vex" then text = gsub("v"..text, "^v ", "") end[m
[31m-    ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false[m
[31m-    ctx.rex = false; ctx.vexl = false; ctx.vexv = false[m
[31m-  end[m
[31m-  if ctx.seg then[m
[31m-    local text2, n = gsub(text, "%[", "["..ctx.seg..":")[m
[31m-    if n == 0 then text = ctx.seg.." "..text else text = text2 end[m
[31m-    ctx.seg = false[m
[31m-  end[m
[31m-  if ctx.lock then text = "lock "..text; ctx.lock = false end[m
[31m-  local imm = ctx.imm[m
[31m-  if imm then[m
[31m-    local sym = ctx.symtab[imm][m
[31m-    if sym then text = text.."\t->"..sym end[m
[31m-  end[m
[31m-  ctx.out(format("%08x  %s%s\n", ctx.addr+ctx.start, hex, text))[m
[31m-  ctx.mrm = false[m
[31m-  ctx.vexv = false[m
[31m-  ctx.start = pos[m
[31m-  ctx.imm = nil[m
[31m-end[m
[31m-[m
[31m--- Clear all prefix flags.[m
[31m-local function clearprefixes(ctx)[m
[31m-  ctx.o16 = false; ctx.seg = false; ctx.lock = false; ctx.rep = false[m
[31m-  ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false[m
[31m-  ctx.rex = false; ctx.a32 = false; ctx.vexl = false[m
[31m-end[m
[31m-[m
[31m--- Fallback for incomplete opcodes at the end.[m
[31m-local function incomplete(ctx)[m
[31m-  ctx.pos = ctx.stop+1[m
[31m-  clearprefixes(ctx)[m
[31m-  return putop(ctx, "(incomplete)")[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  clearprefixes(ctx)[m
[31m-  return putop(ctx, "(unknown)")[m
[31m-end[m
[31m-[m
[31m--- Return an immediate of the specified size.[m
[31m-local function getimm(ctx, pos, n)[m
[31m-  if pos+n-1 > ctx.stop then return incomplete(ctx) end[m
[31m-  local code = ctx.code[m
[31m-  if n == 1 then[m
[31m-    local b1 = byte(code, pos, pos)[m
[31m-    return b1[m
[31m-  elseif n == 2 then[m
[31m-    local b1, b2 = byte(code, pos, pos+1)[m
[31m-    return b1+b2*256[m
[31m-  else[m
[31m-    local b1, b2, b3, b4 = byte(code, pos, pos+3)[m
[31m-    local imm = b1+b2*256+b3*65536+b4*16777216[m
[31m-    ctx.imm = imm[m
[31m-    return imm[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Process pattern string and generate the operands.[m
[31m-local function putpat(ctx, name, pat)[m
[31m-  local operands, regs, sz, mode, sp, rm, sc, rx, sdisp[m
[31m-  local code, pos, stop, vexl = ctx.code, ctx.pos, ctx.stop, ctx.vexl[m
[31m-[m
[31m-  -- Chars used: 1DFGIMPQRSTUVWXYabcdfgijlmoprstuvwxyz[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "V" or p == "U" then[m
[31m-      if ctx.rexw then sz = "Q"; ctx.rexw = false[m
[31m-      elseif ctx.o16 then sz = "W"; ctx.o16 = false[m
[31m-      elseif p == "U" and ctx.x64 then sz = "Q"[m
[31m-      else sz = "D" end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "T" then[m
[31m-      if ctx.rexw then sz = "Q"; ctx.rexw = false else sz = "D" end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "B" then[m
[31m-      sz = "B"[m
[31m-      regs = ctx.rex and map_regs.B64 or map_regs.B[m
[31m-    elseif match(p, "[WDQMXYFG]") then[m
[31m-      sz = p[m
[31m-      if sz == "X" and vexl then sz = "Y"; ctx.vexl = false end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "P" then[m
[31m-      sz = ctx.o16 and "X" or "M"; ctx.o16 = false[m
[31m-      if sz == "X" and vexl then sz = "Y"; ctx.vexl = false end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "S" then[m
[31m-      name = name..lower(sz)[m
[31m-    elseif p == "s" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = imm <= 127 and format("+0x%02x", imm)[m
[31m-		     or format("-0x%02x", 256-imm)[m
[31m-      pos = pos+1[m
[31m-    elseif p == "u" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = format("0x%02x", imm)[m
[31m-      pos = pos+1[m
[31m-    elseif p == "b" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = regs[imm/16+1][m
[31m-      pos = pos+1[m
[31m-    elseif p == "w" then[m
[31m-      local imm = getimm(ctx, pos, 2); if not imm then return end[m
[31m-      x = format("0x%x", imm)[m
[31m-      pos = pos+2[m
[31m-    elseif p == "o" then -- [offset][m
[31m-      if ctx.x64 then[m
[31m-	local imm1 = getimm(ctx, pos, 4); if not imm1 then return end[m
[31m-	local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end[m
[31m-	x = format("[0x%08x%08x]", imm2, imm1)[m
[31m-	pos = pos+8[m
[31m-      else[m
[31m-	local imm = getimm(ctx, pos, 4); if not imm then return end[m
[31m-	x = format("[0x%08x]", imm)[m
[31m-	pos = pos+4[m
[31m-      end[m
[31m-    elseif p == "i" or p == "I" then[m
[31m-      local n = map_sz2n[sz][m
[31m-      if n == 8 and ctx.x64 and p == "I" then[m
[31m-	local imm1 = getimm(ctx, pos, 4); if not imm1 then return end[m
[31m-	local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end[m
[31m-	x = format("0x%08x%08x", imm2, imm1)[m
[31m-      else[m
[31m-	if n == 8 then n = 4 end[m
[31m-	local imm = getimm(ctx, pos, n); if not imm then return end[m
[31m-	if sz == "Q" and (imm < 0 or imm > 0x7fffffff) then[m
[31m-	  imm = (0xffffffff+1)-imm[m
[31m-	  x = format(imm > 65535 and "-0x%08x" or "-0x%x", imm)[m
[31m-	else[m
[31m-	  x = format(imm > 65535 and "0x%08x" or "0x%x", imm)[m
[31m-	end[m
[31m-      end[m
[31m-      pos = pos+n[m
[31m-    elseif p == "j" then[m
[31m-      local n = map_sz2n[sz][m
[31m-      if n == 8 then n = 4 end[m
[31m-      local imm = getimm(ctx, pos, n); if not imm then return end[m
[31m-      if sz == "B" and imm > 127 then imm = imm-256[m
[31m-      elseif imm > 2147483647 then imm = imm-4294967296 end[m
[31m-      pos = pos+n[m
[31m-      imm = imm + pos + ctx.addr[m
[31m-      if imm > 4294967295 and not ctx.x64 then imm = imm-4294967296 end[m
[31m-      ctx.imm = imm[m
[31m-      if sz == "W" then[m
[31m-	x = format("word 0x%04x", imm%65536)[m
[31m-      elseif ctx.x64 then[m
[31m-	local lo = imm % 0x1000000[m
[31m-	x = format("0x%02x%06x", (imm-lo) / 0x1000000, lo)[m
[31m-      else[m
[31m-	x = "0x"..tohex(imm)[m
[31m-      end[m
[31m-    elseif p == "R" then[m
[31m-      local r = byte(code, pos-1, pos-1)%8[m
[31m-      if ctx.rexb then r = r + 8; ctx.rexb = false end[m
[31m-      x = regs[r+1][m
[31m-    elseif p == "a" then x = regs[1][m
[31m-    elseif p == "c" then x = "cl"[m
[31m-    elseif p == "d" then x = "dx"[m
[31m-    elseif p == "1" then x = "1"[m
[31m-    else[m
[31m-      if not mode then[m
[31m-	mode = ctx.mrm[m
[31m-	if not mode then[m
[31m-	  if pos > stop then return incomplete(ctx) end[m
[31m-	  mode = byte(code, pos, pos)[m
[31m-	  pos = pos+1[m
[31m-	end[m
[31m-	rm = mode%8; mode = (mode-rm)/8[m
[31m-	sp = mode%8; mode = (mode-sp)/8[m
[31m-	sdisp = ""[m
[31m-	if mode < 3 then[m
[31m-	  if rm == 4 then[m
[31m-	    if pos > stop then return incomplete(ctx) end[m
[31m-	    sc = byte(code, pos, pos)[m
[31m-	    pos = pos+1[m
[31m-	    rm = sc%8; sc = (sc-rm)/8[m
[31m-	    rx = sc%8; sc = (sc-rx)/8[m
[31m-	    if ctx.rexx then rx = rx + 8; ctx.rexx = false end[m
[31m-	    if rx == 4 then rx = nil end[m
[31m-	  end[m
[31m-	  if mode > 0 or rm == 5 then[m
[31m-	    local dsz = mode[m
[31m-	    if dsz ~= 1 then dsz = 4 end[m
[31m-	    local disp = getimm(ctx, pos, dsz); if not disp then return end[m
[31m-	    if mode == 0 then rm = nil end[m
[31m-	    if rm or rx or (not sc and ctx.x64 and not ctx.a32) then[m
[31m-	      if dsz == 1 and disp > 127 then[m
[31m-		sdisp = format("-0x%x", 256-disp)[m
[31m-	      elseif disp >= 0 and disp <= 0x7fffffff then[m
[31m-		sdisp = format("+0x%x", disp)[m
[31m-	      else[m
[31m-		sdisp = format("-0x%x", (0xffffffff+1)-disp)[m
[31m-	      end[m
[31m-	    else[m
[31m-	      sdisp = format(ctx.x64 and not ctx.a32 and[m
[31m-		not (disp >= 0 and disp <= 0x7fffffff)[m
[31m-		and "0xffffffff%08x" or "0x%08x", disp)[m
[31m-	    end[m
[31m-	    pos = pos+dsz[m
[31m-	  end[m
[31m-	end[m
[31m-	if rm and ctx.rexb then rm = rm + 8; ctx.rexb = false end[m
[31m-	if ctx.rexr then sp = sp + 8; ctx.rexr = false end[m
[31m-      end[m
[31m-      if p == "m" then[m
[31m-	if mode == 3 then x = regs[rm+1][m
[31m-	else[m
[31m-	  local aregs = ctx.a32 and map_regs.D or ctx.aregs[m
[31m-	  local srm, srx = "", ""[m
[31m-	  if rm then srm = aregs[rm+1][m
[31m-	  elseif not sc and ctx.x64 and not ctx.a32 then srm = "rip" end[m
[31m-	  ctx.a32 = false[m
[31m-	  if rx then[m
[31m-	    if rm then srm = srm.."+" end[m
[31m-	    srx = aregs[rx+1][m
[31m-	    if sc > 0 then srx = srx.."*"..(2^sc) end[m
[31m-	  end[m
[31m-	  x = format("[%s%s%s]", srm, srx, sdisp)[m
[31m-	end[m
[31m-	if mode < 3 and[m
[31m-	   (not match(pat, "[aRrgp]") or match(pat, "t")) then -- Yuck.[m
[31m-	  x = map_sz2prefix[sz].." "..x[m
[31m-	end[m
[31m-      elseif p == "r" then x = regs[sp+1][m
[31m-      elseif p == "g" then x = map_segregs[sp+1][m
[31m-      elseif p == "p" then -- Suppress prefix.[m
[31m-      elseif p == "f" then x = "st"..rm[m
[31m-      elseif p == "x" then[m
[31m-	if sp == 0 and ctx.lock and not ctx.x64 then[m
[31m-	  x = "CR8"; ctx.lock = false[m
[31m-	else[m
[31m-	  x = "CR"..sp[m
[31m-	end[m
[31m-      elseif p == "v" then[m
[31m-	if ctx.vexv then[m
[31m-	  x = regs[ctx.vexv+1]; ctx.vexv = false[m
[31m-	end[m
[31m-      elseif p == "y" then x = "DR"..sp[m
[31m-      elseif p == "z" then x = "TR"..sp[m
[31m-      elseif p == "l" then vexl = false[m
[31m-      elseif p == "t" then[m
[31m-      else[m
[31m-	error("bad pattern `"..pat.."'")[m
[31m-      end[m
[31m-    end[m
[31m-    if x then operands = operands and operands..", "..x or x end[m
[31m-  end[m
[31m-  ctx.pos = pos[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m--- Forward declaration.[m
[31m-local map_act[m
[31m-[m
[31m--- Fetch and cache MRM byte.[m
[31m-local function getmrm(ctx)[m
[31m-  local mrm = ctx.mrm[m
[31m-  if not mrm then[m
[31m-    local pos = ctx.pos[m
[31m-    if pos > ctx.stop then return nil end[m
[31m-    mrm = byte(ctx.code, pos, pos)[m
[31m-    ctx.pos = pos+1[m
[31m-    ctx.mrm = mrm[m
[31m-  end[m
[31m-  return mrm[m
[31m-end[m
[31m-[m
[31m--- Dispatch to handler depending on pattern.[m
[31m-local function dispatch(ctx, opat, patgrp)[m
[31m-  if not opat then return unknown(ctx) end[m
[31m-  if match(opat, "%|") then -- MMX/SSE variants depending on prefix.[m
[31m-    local p[m
[31m-    if ctx.rep then[m
[31m-      p = ctx.rep=="rep" and "%|([^%|]*)" or "%|[^%|]*%|[^%|]*%|([^%|]*)"[m
[31m-      ctx.rep = false[m
[31m-    elseif ctx.o16 then p = "%|[^%|]*%|([^%|]*)"; ctx.o16 = false[m
[31m-    else p = "^[^%|]*" end[m
[31m-    opat = match(opat, p)[m
[31m-    if not opat then return unknown(ctx) end[m
[31m---    ctx.rep = false; ctx.o16 = false[m
[31m-    --XXX fails for 66 f2 0f 38 f1 06  crc32 eax,WORD PTR [esi][m
[31m-    --XXX remove in branches?[m
[31m-  end[m
[31m-  if match(opat, "%$") then -- reg$mem variants.[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    opat = match(opat, mrm >= 192 and "^[^%$]*" or "%$(.*)")[m
[31m-    if opat == "" then return unknown(ctx) end[m
[31m-  end[m
[31m-  if opat == "" then return unknown(ctx) end[m
[31m-  local name, pat = match(opat, "^([a-z0-9 ]*)(.*)")[m
[31m-  if pat == "" and patgrp then pat = patgrp end[m
[31m-  return map_act[sub(pat, 1, 1)](ctx, name, pat)[m
[31m-end[m
[31m-[m
[31m--- Get a pattern from an opcode map and dispatch to handler.[m
[31m-local function dispatchmap(ctx, opcmap)[m
[31m-  local pos = ctx.pos[m
[31m-  local opat = opcmap[byte(ctx.code, pos, pos)][m
[31m-  pos = pos + 1[m
[31m-  ctx.pos = pos[m
[31m-  return dispatch(ctx, opat)[m
[31m-end[m
[31m-[m
[31m--- Map for action codes. The key is the first char after the name.[m
[31m-map_act = {[m
[31m-  -- Simple opcodes without operands.[m
[31m-  [""] = function(ctx, name, pat)[m
[31m-    return putop(ctx, name)[m
[31m-  end,[m
[31m-[m
[31m-  -- Operand size chars fall right through.[m
[31m-  B = putpat, W = putpat, D = putpat, Q = putpat,[m
[31m-  V = putpat, U = putpat, T = putpat,[m
[31m-  M = putpat, X = putpat, P = putpat,[m
[31m-  F = putpat, G = putpat, Y = putpat,[m
[31m-[m
[31m-  -- Collect prefixes.[m
[31m-  [":"] = function(ctx, name, pat)[m
[31m-    ctx[pat == ":" and name or sub(pat, 2)] = name[m
[31m-    if ctx.pos - ctx.start > 5 then return unknown(ctx) end -- Limit #prefixes.[m
[31m-  end,[m
[31m-[m
[31m-  -- Chain to special handler specified by name.[m
[31m-  ["*"] = function(ctx, name, pat)[m
[31m-    return map_act[name](ctx, name, sub(pat, 2))[m
[31m-  end,[m
[31m-[m
[31m-  -- Use named subtable for opcode group.[m
[31m-  ["!"] = function(ctx, name, pat)[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    return dispatch(ctx, map_opcgroup[name][((mrm-(mrm%8))/8)%8+1], sub(pat, 2))[m
[31m-  end,[m
[31m-[m
[31m-  -- o16,o32[,o64] variants.[m
[31m-  sz = function(ctx, name, pat)[m
[31m-    if ctx.o16 then ctx.o16 = false[m
[31m-    else[m
[31m-      pat = match(pat, ",(.*)")[m
[31m-      if ctx.rexw then[m
[31m-	local p = match(pat, ",(.*)")[m
[31m-	if p then pat = p; ctx.rexw = false end[m
[31m-      end[m
[31m-    end[m
[31m-    pat = match(pat, "^[^,]*")[m
[31m-    return dispatch(ctx, pat)[m
[31m-  end,[m
[31m-[m
[31m-  -- Two-byte opcode dispatch.[m
[31m-  opc2 = function(ctx, name, pat)[m
[31m-    return dispatchmap(ctx, map_opc2)[m
[31m-  end,[m
[31m-[m
[31m-  -- Three-byte opcode dispatch.[m
[31m-  opc3 = function(ctx, name, pat)[m
[31m-    return dispatchmap(ctx, map_opc3[pat])[m
[31m-  end,[m
[31m-[m
[31m-  -- VMX/SVM dispatch.[m
[31m-  vm = function(ctx, name, pat)[m
[31m-    return dispatch(ctx, map_opcvm[ctx.mrm])[m
[31m-  end,[m
[31m-[m
[31m-  -- Floating point opcode dispatch.[m
[31m-  fp = function(ctx, name, pat)[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    local rm = mrm%8[m
[31m-    local idx = pat*8 + ((mrm-rm)/8)%8[m
[31m-    if mrm >= 192 then idx = idx + 64 end[m
[31m-    local opat = map_opcfp[idx][m
[31m-    if type(opat) == "table" then opat = opat[rm+1] end[m
[31m-    return dispatch(ctx, opat)[m
[31m-  end,[m
[31m-[m
[31m-  -- REX prefix.[m
[31m-  rex = function(ctx, name, pat)[m
[31m-    if ctx.rex then return unknown(ctx) end -- Only 1 REX or VEX prefix allowed.[m
[31m-    for p in gmatch(pat, ".") do ctx["rex"..p] = true end[m
[31m-    ctx.rex = "rex"[m
[31m-  end,[m
[31m-[m
[31m-  -- VEX prefix.[m
[31m-  vex = function(ctx, name, pat)[m
[31m-    if ctx.rex then return unknown(ctx) end -- Only 1 REX or VEX prefix allowed.[m
[31m-    ctx.rex = "vex"[m
[31m-    local pos = ctx.pos[m
[31m-    if ctx.mrm then[m
[31m-      ctx.mrm = nil[m
[31m-      pos = pos-1[m
[31m-    end[m
[31m-    local b = byte(ctx.code, pos, pos)[m
[31m-    if not b then return incomplete(ctx) end[m
[31m-    pos = pos+1[m
[31m-    if b < 128 then ctx.rexr = true end[m
[31m-    local m = 1[m
[31m-    if pat == "3" then[m
[31m-      m = b%32; b = (b-m)/32[m
[31m-      local nb = b%2; b = (b-nb)/2[m
[31m-      if nb == 0 then ctx.rexb = true end[m
[31m-      local nx = b%2; b = (b-nx)/2[m
[31m-      if nx == 0 then ctx.rexx = true end[m
[31m-      b = byte(ctx.code, pos, pos)[m
[31m-      if not b then return incomplete(ctx) end[m
[31m-      pos = pos+1[m
[31m-      if b >= 128 then ctx.rexw = true end[m
[31m-    end[m
[31m-    ctx.pos = pos[m
[31m-    local map[m
[31m-    if m == 1 then map = map_opc2[m
[31m-    elseif m == 2 then map = map_opc3["38"][m
[31m-    elseif m == 3 then map = map_opc3["3a"][m
[31m-    else return unknown(ctx) end[m
[31m-    local p = b%4; b = (b-p)/4[m
[31m-    if p == 1 then ctx.o16 = "o16"[m
[31m-    elseif p == 2 then ctx.rep = "rep"[m
[31m-    elseif p == 3 then ctx.rep = "repne" end[m
[31m-    local l = b%2; b = (b-l)/2[m
[31m-    if l ~= 0 then ctx.vexl = true end[m
[31m-    ctx.vexv = (-1-b)%16[m
[31m-    return dispatchmap(ctx, map)[m
[31m-  end,[m
[31m-[m
[31m-  -- Special case for nop with REX prefix.[m
[31m-  nop = function(ctx, name, pat)[m
[31m-    return dispatch(ctx, ctx.rex and pat or "nop")[m
[31m-  end,[m
[31m-[m
[31m-  -- Special case for 0F 77.[m
[31m-  emms = function(ctx, name, pat)[m
[31m-    if ctx.rex ~= "vex" then[m
[31m-      return putop(ctx, "emms")[m
[31m-    elseif ctx.vexl then[m
[31m-      ctx.vexl = false[m
[31m-      return putop(ctx, "zeroall")[m
[31m-    else[m
[31m-      return putop(ctx, "zeroupper")[m
[31m-    end[m
[31m-  end,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  ofs = ofs + 1[m
[31m-  ctx.start = ofs[m
[31m-  ctx.pos = ofs[m
[31m-  ctx.stop = stop[m
[31m-  ctx.imm = nil[m
[31m-  ctx.mrm = false[m
[31m-  clearprefixes(ctx)[m
[31m-  while ctx.pos <= stop do dispatchmap(ctx, ctx.map1) end[m
[31m-  if ctx.pos ~= ctx.start then incomplete(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = (addr or 0) - 1[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 16[m
[31m-  ctx.x64 = false[m
[31m-  ctx.map1 = map_opc1_32[m
[31m-  ctx.aregs = map_regs.D[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m-local function create64(code, addr, out)[m
[31m-  local ctx = create(code, addr, out)[m
[31m-  ctx.x64 = true[m
[31m-  ctx.map1 = map_opc1_64[m
[31m-  ctx.aregs = map_regs.Q[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m-local function disass64(code, addr, out)[m
[31m-  create64(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 8 then return map_regs.D[r+1] end[m
[31m-  return map_regs.X[r-7][m
[31m-end[m
[31m-[m
[31m-local function regname64(r)[m
[31m-  if r < 16 then return map_regs.Q[r+1] end[m
[31m-  return map_regs.X[r-15][m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  create64 = create64,[m
[31m-  disass = disass,[m
[31m-  disass64 = disass64,[m
[31m-  regname = regname,[m
[31m-  regname64 = regname64[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dump.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dump.lua[m
[1mdeleted file mode 100644[m
[1mindex 6531c6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/dump.lua[m
[1m+++ /dev/null[m
[36m@@ -1,710 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT compiler dump module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module can be used to debug the JIT compiler itself. It dumps the[m
[31m--- code representations and structures used in various compiler stages.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jdump -e "local x=0; for i=1,1e6 do x=x+i end; print(x)"[m
[31m---   luajit -jdump=im -e "for i=1,1000 do for j=1,1000 do end end" | less -R[m
[31m---   luajit -jdump=is myapp.lua | less -R[m
[31m---   luajit -jdump=-b myapp.lua[m
[31m---   luajit -jdump=+aH,myapp.html myapp.lua[m
[31m---   luajit -jdump=ixT,myapp.dump myapp.lua[m
[31m---[m
[31m--- The first argument specifies the dump mode. The second argument gives[m
[31m--- the output file name. Default output is to stdout, unless the environment[m
[31m--- variable LUAJIT_DUMPFILE is set. The file is overwritten every time the[m
[31m--- module is started.[m
[31m---[m
[31m--- Different features can be turned on or off with the dump mode. If the[m
[31m--- mode starts with a '+', the following features are added to the default[m
[31m--- set of features; a '-' removes them. Otherwise the features are replaced.[m
[31m---[m
[31m--- The following dump features are available (* marks the default):[m
[31m---[m
[31m---  * t  Print a line for each started, ended or aborted trace (see also -jv).[m
[31m---  * b  Dump the traced bytecode.[m
[31m---  * i  Dump the IR (intermediate representation).[m
[31m---    r  Augment the IR with register/stack slots.[m
[31m---    s  Dump the snapshot map.[m
[31m---  * m  Dump the generated machine code.[m
[31m---    x  Print each taken trace exit.[m
[31m---    X  Print each taken trace exit and the contents of all registers.[m
[31m---    a  Print the IR of aborted traces, too.[m
[31m---[m
[31m--- The output format can be set with the following characters:[m
[31m---[m
[31m---    T  Plain text output.[m
[31m---    A  ANSI-colored text output[m
[31m---    H  Colorized HTML + CSS output.[m
[31m---[m
[31m--- The default output format is plain text. It's set to ANSI-colored text[m
[31m--- if the COLORTERM variable is set. Note: this is independent of any output[m
[31m--- redirection, which is actually considered a feature.[m
[31m---[m
[31m--- You probably want to use less -R to enjoy viewing ANSI-colored text from[m
[31m--- a pipe or a file. Add this to your ~/.bashrc: export LESS="-R"[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local funcinfo, funcbc = jutil.funcinfo, jutil.funcbc[m
[31m-local traceinfo, traceir, tracek = jutil.traceinfo, jutil.traceir, jutil.tracek[m
[31m-local tracemc, tracesnap = jutil.tracemc, jutil.tracesnap[m
[31m-local traceexitstub, ircalladdr = jutil.traceexitstub, jutil.ircalladdr[m
[31m-local bit = require("bit")[m
[31m-local band, shl, shr, tohex = bit.band, bit.lshift, bit.rshift, bit.tohex[m
[31m-local sub, gsub, format = string.sub, string.gsub, string.format[m
[31m-local byte, char, rep = string.byte, string.char, string.rep[m
[31m-local type, tostring = type, tostring[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m--- Load other modules on-demand.[m
[31m-local bcline, disass[m
[31m-[m
[31m--- Active flag, output file handle and dump mode.[m
[31m-local active, out, dumpmode[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local symtabmt = { __index = false }[m
[31m-local symtab = {}[m
[31m-local nexitsym = 0[m
[31m-[m
[31m--- Fill nested symbol table with per-trace exit stub addresses.[m
[31m-local function fillsymtab_tr(tr, nexit)[m
[31m-  local t = {}[m
[31m-  symtabmt.__index = t[m
[31m-  if jit.arch == "mips" or jit.arch == "mipsel" then[m
[31m-    t[traceexitstub(tr, 0)] = "exit"[m
[31m-    return[m
[31m-  end[m
[31m-  for i=0,nexit-1 do[m
[31m-    local addr = traceexitstub(tr, i)[m
[31m-    if addr < 0 then addr = addr + 2^32 end[m
[31m-    t[addr] = tostring(i)[m
[31m-  end[m
[31m-  local addr = traceexitstub(tr, nexit)[m
[31m-  if addr then t[addr] = "stack_check" end[m
[31m-end[m
[31m-[m
[31m--- Fill symbol table with trace exit stub addresses.[m
[31m-local function fillsymtab(tr, nexit)[m
[31m-  local t = symtab[m
[31m-  if nexitsym == 0 then[m
[31m-    local ircall = vmdef.ircall[m
[31m-    for i=0,#ircall do[m
[31m-      local addr = ircalladdr(i)[m
[31m-      if addr ~= 0 then[m
[31m-	if addr < 0 then addr = addr + 2^32 end[m
[31m-	t[addr] = ircall[i][m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  if nexitsym == 1000000 then -- Per-trace exit stubs.[m
[31m-    fillsymtab_tr(tr, nexit)[m
[31m-  elseif nexit > nexitsym then -- Shared exit stubs.[m
[31m-    for i=nexitsym,nexit-1 do[m
[31m-      local addr = traceexitstub(i)[m
[31m-      if addr == nil then -- Fall back to per-trace exit stubs.[m
[31m-	fillsymtab_tr(tr, nexit)[m
[31m-	setmetatable(symtab, symtabmt)[m
[31m-	nexit = 1000000[m
[31m-	break[m
[31m-      end[m
[31m-      if addr < 0 then addr = addr + 2^32 end[m
[31m-      t[addr] = tostring(i)[m
[31m-    end[m
[31m-    nexitsym = nexit[m
[31m-  end[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m-local function dumpwrite(s)[m
[31m-  out:write(s)[m
[31m-end[m
[31m-[m
[31m--- Disassemble machine code.[m
[31m-local function dump_mcode(tr)[m
[31m-  local info = traceinfo(tr)[m
[31m-  if not info then return end[m
[31m-  local mcode, addr, loop = tracemc(tr)[m
[31m-  if not mcode then return end[m
[31m-  if not disass then disass = require("jit.dis_"..jit.arch) end[m
[31m-  if addr < 0 then addr = addr + 2^32 end[m
[31m-  out:write("---- TRACE ", tr, " mcode ", #mcode, "\n")[m
[31m-  local ctx = disass.create(mcode, addr, dumpwrite)[m
[31m-  ctx.hexdump = 0[m
[31m-  ctx.symtab = fillsymtab(tr, info.nexit)[m
[31m-  if loop ~= 0 then[m
[31m-    symtab[addr+loop] = "LOOP"[m
[31m-    ctx:disass(0, loop)[m
[31m-    out:write("->LOOP:\n")[m
[31m-    ctx:disass(loop, #mcode-loop)[m
[31m-    symtab[addr+loop] = nil[m
[31m-  else[m
[31m-    ctx:disass(0, #mcode)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local irtype_text = {[m
[31m-  [0] = "nil",[m
[31m-  "fal",[m
[31m-  "tru",[m
[31m-  "lud",[m
[31m-  "str",[m
[31m-  "p32",[m
[31m-  "thr",[m
[31m-  "pro",[m
[31m-  "fun",[m
[31m-  "p64",[m
[31m-  "cdt",[m
[31m-  "tab",[m
[31m-  "udt",[m
[31m-  "flt",[m
[31m-  "num",[m
[31m-  "i8 ",[m
[31m-  "u8 ",[m
[31m-  "i16",[m
[31m-  "u16",[m
[31m-  "int",[m
[31m-  "u32",[m
[31m-  "i64",[m
[31m-  "u64",[m
[31m-  "sfp",[m
[31m-}[m
[31m-[m
[31m-local colortype_ansi = {[m
[31m-  [0] = "%s",[m
[31m-  "%s",[m
[31m-  "%s",[m
[31m-  "\027[36m%s\027[m",[m
[31m-  "\027[32m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[1m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[1m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[33m%s\027[m",[m
[31m-  "\027[31m%s\027[m",[m
[31m-  "\027[36m%s\027[m",[m
[31m-  "\027[34m%s\027[m",[m
[31m-  "\027[34m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-}[m
[31m-[m
[31m-local function colorize_text(s, t)[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-local function colorize_ansi(s, t)[m
[31m-  return format(colortype_ansi[t], s)[m
[31m-end[m
[31m-[m
[31m-local irtype_ansi = setmetatable({},[m
[31m-  { __index = function(tab, t)[m
[31m-      local s = colorize_ansi(irtype_text[t], t); tab[t] = s; return s; end })[m
[31m-[m
[31m-local html_escape = { ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;", }[m
[31m-[m
[31m-local function colorize_html(s, t)[m
[31m-  s = gsub(s, "[<>&]", html_escape)[m
[31m-  return format('<span class="irt_%s">%s</span>', irtype_text[t], s)[m
[31m-end[m
[31m-[m
[31m-local irtype_html = setmetatable({},[m
[31m-  { __index = function(tab, t)[m
[31m-      local s = colorize_html(irtype_text[t], t); tab[t] = s; return s; end })[m
[31m-[m
[31m-local header_html = [[[m
[31m-<style type="text/css">[m
[31m-background { background: #ffffff; color: #000000; }[m
[31m-pre.ljdump {[m
[31m-font-size: 10pt;[m
[31m-background: #f0f4ff;[m
[31m-color: #000000;[m
[31m-border: 1px solid #bfcfff;[m
[31m-padding: 0.5em;[m
[31m-margin-left: 2em;[m
[31m-margin-right: 2em;[m
[31m-}[m
[31m-span.irt_str { color: #00a000; }[m
[31m-span.irt_thr, span.irt_fun { color: #404040; font-weight: bold; }[m
[31m-span.irt_tab { color: #c00000; }[m
[31m-span.irt_udt, span.irt_lud { color: #00c0c0; }[m
[31m-span.irt_num { color: #4040c0; }[m
[31m-span.irt_int, span.irt_i8, span.irt_u8, span.irt_i16, span.irt_u16 { color: #b040b0; }[m
[31m-</style>[m
[31m-]][m
[31m-[m
[31m-local colorize, irtype[m
[31m-[m
[31m--- Lookup tables to convert some literals into names.[m
[31m-local litname = {[m
[31m-  ["SLOAD "] = setmetatable({}, { __index = function(t, mode)[m
[31m-    local s = ""[m
[31m-    if band(mode, 1) ~= 0 then s = s.."P" end[m
[31m-    if band(mode, 2) ~= 0 then s = s.."F" end[m
[31m-    if band(mode, 4) ~= 0 then s = s.."T" end[m
[31m-    if band(mode, 8) ~= 0 then s = s.."C" end[m
[31m-    if band(mode, 16) ~= 0 then s = s.."R" end[m
[31m-    if band(mode, 32) ~= 0 then s = s.."I" end[m
[31m-    t[mode] = s[m
[31m-    return s[m
[31m-  end}),[m
[31m-  ["XLOAD "] = { [0] = "", "R", "V", "RV", "U", "RU", "VU", "RVU", },[m
[31m-  ["CONV  "] = setmetatable({}, { __index = function(t, mode)[m
[31m-    local s = irtype[band(mode, 31)][m
[31m-    s = irtype[band(shr(mode, 5), 31)].."."..s[m
[31m-    if band(mode, 0x800) ~= 0 then s = s.." sext" end[m
[31m-    local c = shr(mode, 14)[m
[31m-    if c == 2 then s = s.." index" elseif c == 3 then s = s.." check" end[m
[31m-    t[mode] = s[m
[31m-    return s[m
[31m-  end}),[m
[31m-  ["FLOAD "] = vmdef.irfield,[m
[31m-  ["FREF  "] = vmdef.irfield,[m
[31m-  ["FPMATH"] = vmdef.irfpm,[m
[31m-  ["BUFHDR"] = { [0] = "RESET", "APPEND" },[m
[31m-  ["TOSTR "] = { [0] = "INT", "NUM", "CHAR" },[m
[31m-}[m
[31m-[m
[31m-local function ctlsub(c)[m
[31m-  if c == "\n" then return "\\n"[m
[31m-  elseif c == "\r" then return "\\r"[m
[31m-  elseif c == "\t" then return "\\t"[m
[31m-  else return format("\\%03d", byte(c))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function fmtfunc(func, pc)[m
[31m-  local fi = funcinfo(func, pc)[m
[31m-  if fi.loc then[m
[31m-    return fi.loc[m
[31m-  elseif fi.ffid then[m
[31m-    return vmdef.ffnames[fi.ffid][m
[31m-  elseif fi.addr then[m
[31m-    return format("C:%x", fi.addr)[m
[31m-  else[m
[31m-    return "(?)"[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function formatk(tr, idx)[m
[31m-  local k, t, slot = tracek(tr, idx)[m
[31m-  local tn = type(k)[m
[31m-  local s[m
[31m-  if tn == "number" then[m
[31m-    if k == 2^52+2^51 then[m
[31m-      s = "bias"[m
[31m-    else[m
[31m-      s = format("%+.14g", k)[m
[31m-    end[m
[31m-  elseif tn == "string" then[m
[31m-    s = format(#k > 20 and '"%.20s"~' or '"%s"', gsub(k, "%c", ctlsub))[m
[31m-  elseif tn == "function" then[m
[31m-    s = fmtfunc(k)[m
[31m-  elseif tn == "table" then[m
[31m-    s = format("{%p}", k)[m
[31m-  elseif tn == "userdata" then[m
[31m-    if t == 12 then[m
[31m-      s = format("userdata:%p", k)[m
[31m-    else[m
[31m-      s = format("[%p]", k)[m
[31m-      if s == "[NULL]" then s = "NULL" end[m
[31m-    end[m
[31m-  elseif t == 21 then -- int64_t[m
[31m-    s = sub(tostring(k), 1, -3)[m
[31m-    if sub(s, 1, 1) ~= "-" then s = "+"..s end[m
[31m-  else[m
[31m-    s = tostring(k) -- For primitives.[m
[31m-  end[m
[31m-  s = colorize(format("%-4s", s), t)[m
[31m-  if slot then[m
[31m-    s = format("%s @%d", s, slot)[m
[31m-  end[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-local function printsnap(tr, snap)[m
[31m-  local n = 2[m
[31m-  for s=0,snap[1]-1 do[m
[31m-    local sn = snap[n][m
[31m-    if shr(sn, 24) == s then[m
[31m-      n = n + 1[m
[31m-      local ref = band(sn, 0xffff) - 0x8000 -- REF_BIAS[m
[31m-      if ref < 0 then[m
[31m-	out:write(formatk(tr, ref))[m
[31m-      elseif band(sn, 0x80000) ~= 0 then -- SNAP_SOFTFPNUM[m
[31m-	out:write(colorize(format("%04d/%04d", ref, ref+1), 14))[m
[31m-      else[m
[31m-	local m, ot, op1, op2 = traceir(tr, ref)[m
[31m-	out:write(colorize(format("%04d", ref), band(ot, 31)))[m
[31m-      end[m
[31m-      out:write(band(sn, 0x10000) == 0 and " " or "|") -- SNAP_FRAME[m
[31m-    else[m
[31m-      out:write("---- ")[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("]\n")[m
[31m-end[m
[31m-[m
[31m--- Dump snapshots (not interleaved with IR).[m
[31m-local function dump_snap(tr)[m
[31m-  out:write("---- TRACE ", tr, " snapshots\n")[m
[31m-  for i=0,1000000000 do[m
[31m-    local snap = tracesnap(tr, i)[m
[31m-    if not snap then break end[m
[31m-    out:write(format("#%-3d %04d [ ", i, snap[0]))[m
[31m-    printsnap(tr, snap)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Return a register name or stack slot for a rid/sp location.[m
[31m-local function ridsp_name(ridsp, ins)[m
[31m-  if not disass then disass = require("jit.dis_"..jit.arch) end[m
[31m-  local rid, slot = band(ridsp, 0xff), shr(ridsp, 8)[m
[31m-  if rid == 253 or rid == 254 then[m
[31m-    return (slot == 0 or slot == 255) and " {sink" or format(" {%04d", ins-slot)[m
[31m-  end[m
[31m-  if ridsp > 255 then return format("[%x]", slot*4) end[m
[31m-  if rid < 128 then return disass.regname(rid) end[m
[31m-  return ""[m
[31m-end[m
[31m-[m
[31m--- Dump CALL* function ref and return optional ctype.[m
[31m-local function dumpcallfunc(tr, ins)[m
[31m-  local ctype[m
[31m-  if ins > 0 then[m
[31m-    local m, ot, op1, op2 = traceir(tr, ins)[m
[31m-    if band(ot, 31) == 0 then -- nil type means CARG(func, ctype).[m
[31m-      ins = op1[m
[31m-      ctype = formatk(tr, op2)[m
[31m-    end[m
[31m-  end[m
[31m-  if ins < 0 then[m
[31m-    out:write(format("[0x%x](", tonumber((tracek(tr, ins)))))[m
[31m-  else[m
[31m-    out:write(format("%04d (", ins))[m
[31m-  end[m
[31m-  return ctype[m
[31m-end[m
[31m-[m
[31m--- Recursively gather CALL* args and dump them.[m
[31m-local function dumpcallargs(tr, ins)[m
[31m-  if ins < 0 then[m
[31m-    out:write(formatk(tr, ins))[m
[31m-  else[m
[31m-    local m, ot, op1, op2 = traceir(tr, ins)[m
[31m-    local oidx = 6*shr(ot, 8)[m
[31m-    local op = sub(vmdef.irnames, oidx+1, oidx+6)[m
[31m-    if op == "CARG  " then[m
[31m-      dumpcallargs(tr, op1)[m
[31m-      if op2 < 0 then[m
[31m-	out:write(" ", formatk(tr, op2))[m
[31m-      else[m
[31m-	out:write(" ", format("%04d", op2))[m
[31m-      end[m
[31m-    else[m
[31m-      out:write(format("%04d", ins))[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Dump IR and interleaved snapshots.[m
[31m-local function dump_ir(tr, dumpsnap, dumpreg)[m
[31m-  local info = traceinfo(tr)[m
[31m-  if not info then return end[m
[31m-  local nins = info.nins[m
[31m-  out:write("---- TRACE ", tr, " IR\n")[m
[31m-  local irnames = vmdef.irnames[m
[31m-  local snapref = 65536[m
[31m-  local snap, snapno[m
[31m-  if dumpsnap then[m
[31m-    snap = tracesnap(tr, 0)[m
[31m-    snapref = snap[0][m
[31m-    snapno = 0[m
[31m-  end[m
[31m-  for ins=1,nins do[m
[31m-    if ins >= snapref then[m
[31m-      if dumpreg then[m
[31m-	out:write(format("....              SNAP   #%-3d [ ", snapno))[m
[31m-      else[m
[31m-	out:write(format("....        SNAP   #%-3d [ ", snapno))[m
[31m-      end[m
[31m-      printsnap(tr, snap)[m
[31m-      snapno = snapno + 1[m
[31m-      snap = tracesnap(tr, snapno)[m
[31m-      snapref = snap and snap[0] or 65536[m
[31m-    end[m
[31m-    local m, ot, op1, op2, ridsp = traceir(tr, ins)[m
[31m-    local oidx, t = 6*shr(ot, 8), band(ot, 31)[m
[31m-    local op = sub(irnames, oidx+1, oidx+6)[m
[31m-    if op == "LOOP  " then[m
[31m-      if dumpreg then[m
[31m-	out:write(format("%04d ------------ LOOP ------------\n", ins))[m
[31m-      else[m
[31m-	out:write(format("%04d ------ LOOP ------------\n", ins))[m
[31m-      end[m
[31m-    elseif op ~= "NOP   " and op ~= "CARG  " and[m
[31m-	   (dumpreg or op ~= "RENAME") then[m
[31m-      local rid = band(ridsp, 255)[m
[31m-      if dumpreg then[m
[31m-	out:write(format("%04d %-6s", ins, ridsp_name(ridsp, ins)))[m
[31m-      else[m
[31m-	out:write(format("%04d ", ins))[m
[31m-      end[m
[31m-      out:write(format("%s%s %s %s ",[m
[31m-		       (rid == 254 or rid == 253) and "}" or[m
[31m-		       (band(ot, 128) == 0 and " " or ">"),[m
[31m-		       band(ot, 64) == 0 and " " or "+",[m
[31m-		       irtype[t], op))[m
[31m-      local m1, m2 = band(m, 3), band(m, 3*4)[m
[31m-      if sub(op, 1, 4) == "CALL" then[m
[31m-	local ctype[m
[31m-	if m2 == 1*4 then -- op2 == IRMlit[m
[31m-	  out:write(format("%-10s  (", vmdef.ircall[op2]))[m
[31m-	else[m
[31m-	  ctype = dumpcallfunc(tr, op2)[m
[31m-	end[m
[31m-	if op1 ~= -1 then dumpcallargs(tr, op1) end[m
[31m-	out:write(")")[m
[31m-	if ctype then out:write(" ctype ", ctype) end[m
[31m-      elseif op == "CNEW  " and op2 == -1 then[m
[31m-	out:write(formatk(tr, op1))[m
[31m-      elseif m1 ~= 3 then -- op1 != IRMnone[m
[31m-	if op1 < 0 then[m
[31m-	  out:write(formatk(tr, op1))[m
[31m-	else[m
[31m-	  out:write(format(m1 == 0 and "%04d" or "#%-3d", op1))[m
[31m-	end[m
[31m-	if m2 ~= 3*4 then -- op2 != IRMnone[m
[31m-	  if m2 == 1*4 then -- op2 == IRMlit[m
[31m-	    local litn = litname[op][m
[31m-	    if litn and litn[op2] then[m
[31m-	      out:write("  ", litn[op2])[m
[31m-	    elseif op == "UREFO " or op == "UREFC " then[m
[31m-	      out:write(format("  #%-3d", shr(op2, 8)))[m
[31m-	    else[m
[31m-	      out:write(format("  #%-3d", op2))[m
[31m-	    end[m
[31m-	  elseif op2 < 0 then[m
[31m-	    out:write("  ", formatk(tr, op2))[m
[31m-	  else[m
[31m-	    out:write(format("  %04d", op2))[m
[31m-	  end[m
[31m-	end[m
[31m-      end[m
[31m-      out:write("\n")[m
[31m-    end[m
[31m-  end[m
[31m-  if snap then[m
[31m-    if dumpreg then[m
[31m-      out:write(format("....              SNAP   #%-3d [ ", snapno))[m
[31m-    else[m
[31m-      out:write(format("....        SNAP   #%-3d [ ", snapno))[m
[31m-    end[m
[31m-    printsnap(tr, snap)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local recprefix = ""[m
[31m-local recdepth = 0[m
[31m-[m
[31m--- Format trace error message.[m
[31m-local function fmterr(err, info)[m
[31m-  if type(err) == "number" then[m
[31m-    if type(info) == "function" then info = fmtfunc(info) end[m
[31m-    err = format(vmdef.traceerr[err], info)[m
[31m-  end[m
[31m-  return err[m
[31m-end[m
[31m-[m
[31m--- Dump trace states.[m
[31m-local function dump_trace(what, tr, func, pc, otr, oex)[m
[31m-  if what == "stop" or (what == "abort" and dumpmode.a) then[m
[31m-    if dumpmode.i then dump_ir(tr, dumpmode.s, dumpmode.r and what == "stop")[m
[31m-    elseif dumpmode.s then dump_snap(tr) end[m
[31m-    if dumpmode.m then dump_mcode(tr) end[m
[31m-  end[m
[31m-  if what == "start" then[m
[31m-    if dumpmode.H then out:write('<pre class="ljdump">\n') end[m
[31m-    out:write("---- TRACE ", tr, " ", what)[m
[31m-    if otr then out:write(" ", otr, "/", oex) end[m
[31m-    out:write(" ", fmtfunc(func, pc), "\n")[m
[31m-  elseif what == "stop" or what == "abort" then[m
[31m-    out:write("---- TRACE ", tr, " ", what)[m
[31m-    if what == "abort" then[m
[31m-      out:write(" ", fmtfunc(func, pc), " -- ", fmterr(otr, oex), "\n")[m
[31m-    else[m
[31m-      local info = traceinfo(tr)[m
[31m-      local link, ltype = info.link, info.linktype[m
[31m-      if link == tr or link == 0 then[m
[31m-	out:write(" -> ", ltype, "\n")[m
[31m-      elseif ltype == "root" then[m
[31m-	out:write(" -> ", link, "\n")[m
[31m-      else[m
[31m-	out:write(" -> ", link, " ", ltype, "\n")[m
[31m-      end[m
[31m-    end[m
[31m-    if dumpmode.H then out:write("</pre>\n\n") else out:write("\n") end[m
[31m-  else[m
[31m-    if what == "flush" then symtab, nexitsym = {}, 0 end[m
[31m-    out:write("---- TRACE ", what, "\n\n")[m
[31m-  end[m
[31m-  out:flush()[m
[31m-end[m
[31m-[m
[31m--- Dump recorded bytecode.[m
[31m-local function dump_record(tr, func, pc, depth, callee)[m
[31m-  if depth ~= recdepth then[m
[31m-    recdepth = depth[m
[31m-    recprefix = rep(" .", depth)[m
[31m-  end[m
[31m-  local line[m
[31m-  if pc >= 0 then[m
[31m-    line = bcline(func, pc, recprefix)[m
[31m-    if dumpmode.H then line = gsub(line, "[<>&]", html_escape) end[m
[31m-    if pc > 0 then[m
[31m-      line = sub(line, 1, -2) .. "       (" .. fmtfunc(func, pc) .. ")\n"[m
[31m-    end[m
[31m-  else[m
[31m-    line = "0000 "..recprefix.." FUNCC      \n"[m
[31m-    callee = func[m
[31m-  end[m
[31m-  if pc <= 0 then[m
[31m-    out:write(sub(line, 1, -2), "         ; ", fmtfunc(func), "\n")[m
[31m-  else[m
[31m-    out:write(line)[m
[31m-  end[m
[31m-  if pc >= 0 and band(funcbc(func, pc), 0xff) < 16 then -- ORDER BC[m
[31m-    out:write(bcline(func, pc+1, recprefix)) -- Write JMP for cond.[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump taken trace exits.[m
[31m-local function dump_texit(tr, ex, ngpr, nfpr, ...)[m
[31m-  out:write("---- TRACE ", tr, " exit ", ex, "\n")[m
[31m-  if dumpmode.X then[m
[31m-    local regs = {...}[m
[31m-    if jit.arch == "x64" then[m
[31m-      for i=1,ngpr do[m
[31m-	out:write(format(" %016x", regs[i]))[m
[31m-	if i % 4 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    else[m
[31m-      for i=1,ngpr do[m
[31m-	out:write(" ", tohex(regs[i]))[m
[31m-	if i % 8 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    end[m
[31m-    if jit.arch == "mips" or jit.arch == "mipsel" then[m
[31m-      for i=1,nfpr,2 do[m
[31m-	out:write(format(" %+17.14g", regs[ngpr+i]))[m
[31m-	if i % 8 == 7 then out:write("\n") end[m
[31m-      end[m
[31m-    else[m
[31m-      for i=1,nfpr do[m
[31m-	out:write(format(" %+17.14g", regs[ngpr+i]))[m
[31m-	if i % 4 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Detach dump handlers.[m
[31m-local function dumpoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(dump_texit)[m
[31m-    jit.attach(dump_record)[m
[31m-    jit.attach(dump_trace)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach dump handlers.[m
[31m-local function dumpon(opt, outfile)[m
[31m-  if active then dumpoff() end[m
[31m-[m
[31m-  local colormode = os.getenv("COLORTERM") and "A" or "T"[m
[31m-  if opt then[m
[31m-    opt = gsub(opt, "[TAH]", function(mode) colormode = mode; return ""; end)[m
[31m-  end[m
[31m-[m
[31m-  local m = { t=true, b=true, i=true, m=true, }[m
[31m-  if opt and opt ~= "" then[m
[31m-    local o = sub(opt, 1, 1)[m
[31m-    if o ~= "+" and o ~= "-" then m = {} end[m
[31m-    for i=1,#opt do m[sub(opt, i, i)] = (o ~= "-") end[m
[31m-  end[m
[31m-  dumpmode = m[m
[31m-[m
[31m-  if m.t or m.b or m.i or m.s or m.m then[m
[31m-    jit.attach(dump_trace, "trace")[m
[31m-  end[m
[31m-  if m.b then[m
[31m-    jit.attach(dump_record, "record")[m
[31m-    if not bcline then bcline = require("jit.bc").line end[m
[31m-  end[m
[31m-  if m.x or m.X then[m
[31m-    jit.attach(dump_texit, "texit")[m
[31m-  end[m
[31m-[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_DUMPFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stdout[m
[31m-  end[m
[31m-[m
[31m-  m[colormode] = true[m
[31m-  if colormode == "A" then[m
[31m-    colorize = colorize_ansi[m
[31m-    irtype = irtype_ansi[m
[31m-  elseif colormode == "H" then[m
[31m-    colorize = colorize_html[m
[31m-    irtype = irtype_html[m
[31m-    out:write(header_html)[m
[31m-  else[m
[31m-    colorize = colorize_text[m
[31m-    irtype = irtype_text[m
[31m-  end[m
[31m-[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  on = dumpon,[m
[31m-  off = dumpoff,[m
[31m-  start = dumpon -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/p.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/p.lua[m
[1mdeleted file mode 100644[m
[1mindex 5323728..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/p.lua[m
[1m+++ /dev/null[m
[36m@@ -1,310 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT profiler.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module is a simple command line interface to the built-in[m
[31m--- low-overhead profiler of LuaJIT.[m
[31m---[m
[31m--- The lower-level API of the profiler is accessible via the "jit.profile"[m
[31m--- module or the luaJIT_profile_* C API.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jp myapp.lua[m
[31m---   luajit -jp=s myapp.lua[m
[31m---   luajit -jp=-s myapp.lua[m
[31m---   luajit -jp=vl myapp.lua[m
[31m---   luajit -jp=G,profile.txt myapp.lua[m
[31m---[m
[31m--- The following dump features are available:[m
[31m---[m
[31m---   f  Stack dump: function name, otherwise module:line. Default mode.[m
[31m---   F  Stack dump: ditto, but always prepend module.[m
[31m---   l  Stack dump: module:line.[m
[31m---   <number> stack dump depth (callee < caller). Default: 1.[m
[31m---   -<number> Inverse stack dump depth (caller > callee).[m
[31m---   s  Split stack dump after first stack level. Implies abs(depth) >= 2.[m
[31m---   p  Show full path for module names.[m
[31m---   v  Show VM states. Can be combined with stack dumps, e.g. vf or fv.[m
[31m---   z  Show zones. Can be combined with stack dumps, e.g. zf or fz.[m
[31m---   r  Show raw sample counts. Default: show percentages.[m
[31m---   a  Annotate excerpts from source code files.[m
[31m---   A  Annotate complete source code files.[m
[31m---   G  Produce raw output suitable for graphical tools (e.g. flame graphs).[m
[31m---   m<number> Minimum sample percentage to be shown. Default: 3.[m
[31m---   i<number> Sampling interval in milliseconds. Default: 10.[m
[31m---[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local profile = require("jit.profile")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local math = math[m
[31m-local pairs, ipairs, tonumber, floor = pairs, ipairs, tonumber, math.floor[m
[31m-local sort, format = table.sort, string.format[m
[31m-local stdout = io.stdout[m
[31m-local zone -- Load jit.zone module on demand.[m
[31m-[m
[31m--- Output file handle.[m
[31m-local out[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local prof_ud[m
[31m-local prof_states, prof_split, prof_min, prof_raw, prof_fmt, prof_depth[m
[31m-local prof_ann, prof_count1, prof_count2, prof_samples[m
[31m-[m
[31m-local map_vmmode = {[m
[31m-  N = "Compiled",[m
[31m-  I = "Interpreted",[m
[31m-  C = "C code",[m
[31m-  G = "Garbage Collector",[m
[31m-  J = "JIT Compiler",[m
[31m-}[m
[31m-[m
[31m--- Profiler callback.[m
[31m-local function prof_cb(th, samples, vmmode)[m
[31m-  prof_samples = prof_samples + samples[m
[31m-  local key_stack, key_stack2, key_state[m
[31m-  -- Collect keys for sample.[m
[31m-  if prof_states then[m
[31m-    if prof_states == "v" then[m
[31m-      key_state = map_vmmode[vmmode] or vmmode[m
[31m-    else[m
[31m-      key_state = zone:get() or "(none)"[m
[31m-    end[m
[31m-  end[m
[31m-  if prof_fmt then[m
[31m-    key_stack = profile.dumpstack(th, prof_fmt, prof_depth)[m
[31m-    key_stack = key_stack:gsub("%[builtin#(%d+)%]", function(x)[m
[31m-      return vmdef.ffnames[tonumber(x)][m
[31m-    end)[m
[31m-    if prof_split == 2 then[m
[31m-      local k1, k2 = key_stack:match("(.-) [<>] (.*)")[m
[31m-      if k2 then key_stack, key_stack2 = k1, k2 end[m
[31m-    elseif prof_split == 3 then[m
[31m-      key_stack2 = profile.dumpstack(th, "l", 1)[m
[31m-    end[m
[31m-  end[m
[31m-  -- Order keys.[m
[31m-  local k1, k2[m
[31m-  if prof_split == 1 then[m
[31m-    if key_state then[m
[31m-      k1 = key_state[m
[31m-      if key_stack then k2 = key_stack end[m
[31m-    end[m
[31m-  elseif key_stack then[m
[31m-    k1 = key_stack[m
[31m-    if key_stack2 then k2 = key_stack2 elseif key_state then k2 = key_state end[m
[31m-  end[m
[31m-  -- Coalesce samples in one or two levels.[m
[31m-  if k1 then[m
[31m-    local t1 = prof_count1[m
[31m-    t1[k1] = (t1[k1] or 0) + samples[m
[31m-    if k2 then[m
[31m-      local t2 = prof_count2[m
[31m-      local t3 = t2[k1][m
[31m-      if not t3 then t3 = {}; t2[k1] = t3 end[m
[31m-      t3[k2] = (t3[k2] or 0) + samples[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Show top N list.[m
[31m-local function prof_top(count1, count2, samples, indent)[m
[31m-  local t, n = {}, 0[m
[31m-  for k, v in pairs(count1) do[m
[31m-    n = n + 1[m
[31m-    t[n] = k[m
[31m-  end[m
[31m-  sort(t, function(a, b) return count1[a] > count1[b] end)[m
[31m-  for i=1,n do[m
[31m-    local k = t[i][m
[31m-    local v = count1[k][m
[31m-    local pct = floor(v*100/samples + 0.5)[m
[31m-    if pct < prof_min then break end[m
[31m-    if not prof_raw then[m
[31m-      out:write(format("%s%2d%%  %s\n", indent, pct, k))[m
[31m-    elseif prof_raw == "r" then[m
[31m-      out:write(format("%s%5d  %s\n", indent, v, k))[m
[31m-    else[m
[31m-      out:write(format("%s %d\n", k, v))[m
[31m-    end[m
[31m-    if count2 then[m
[31m-      local r = count2[k][m
[31m-      if r then[m
[31m-	prof_top(r, nil, v, (prof_split == 3 or prof_split == 1) and "  -- " or[m
[31m-			    (prof_depth < 0 and "  -> " or "  <- "))[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Annotate source code[m
[31m-local function prof_annotate(count1, samples)[m
[31m-  local files = {}[m
[31m-  local ms = 0[m
[31m-  for k, v in pairs(count1) do[m
[31m-    local pct = floor(v*100/samples + 0.5)[m
[31m-    ms = math.max(ms, v)[m
[31m-    if pct >= prof_min then[m
[31m-      local file, line = k:match("^(.*):(%d+)$")[m
[31m-      local fl = files[file][m
[31m-      if not fl then fl = {}; files[file] = fl; files[#files+1] = file end[m
[31m-      line = tonumber(line)[m
[31m-      fl[line] = prof_raw and v or pct[m
[31m-    end[m
[31m-  end[m
[31m-  sort(files)[m
[31m-  local fmtv, fmtn = " %3d%% | %s\n", "      | %s\n"[m
[31m-  if prof_raw then[m
[31m-    local n = math.max(5, math.ceil(math.log10(ms)))[m
[31m-    fmtv = "%"..n.."d | %s\n"[m
[31m-    fmtn = (" "):rep(n).." | %s\n"[m
[31m-  end[m
[31m-  local ann = prof_ann[m
[31m-  for _, file in ipairs(files) do[m
[31m-    local f0 = file:byte()[m
[31m-    if f0 == 40 or f0 == 91 then[m
[31m-      out:write(format("\n====== %s ======\n[Cannot annotate non-file]\n", file))[m
[31m-      break[m
[31m-    end[m
[31m-    local fp, err = io.open(file)[m
[31m-    if not fp then[m
[31m-      out:write(format("====== ERROR: %s: %s\n", file, err))[m
[31m-      break[m
[31m-    end[m
[31m-    out:write(format("\n====== %s ======\n", file))[m
[31m-    local fl = files[file][m
[31m-    local n, show = 1, false[m
[31m-    if ann ~= 0 then[m
[31m-      for i=1,ann do[m
[31m-	if fl[i] then show = true; out:write("@@ 1 @@\n"); break end[m
[31m-      end[m
[31m-    end[m
[31m-    for line in fp:lines() do[m
[31m-      if line:byte() == 27 then[m
[31m-	out:write("[Cannot annotate bytecode file]\n")[m
[31m-	break[m
[31m-      end[m
[31m-      local v = fl[n][m
[31m-      if ann ~= 0 then[m
[31m-	local v2 = fl[n+ann][m
[31m-	if show then[m
[31m-	  if v2 then show = n+ann elseif v then show = n[m
[31m-	  elseif show+ann < n then show = false end[m
[31m-	elseif v2 then[m
[31m-	  show = n+ann[m
[31m-	  out:write(format("@@ %d @@\n", n))[m
[31m-	end[m
[31m-	if not show then goto next end[m
[31m-      end[m
[31m-      if v then[m
[31m-	out:write(format(fmtv, v, line))[m
[31m-      else[m
[31m-	out:write(format(fmtn, line))[m
[31m-      end[m
[31m-    ::next::[m
[31m-      n = n + 1[m
[31m-    end[m
[31m-    fp:close()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Finish profiling and dump result.[m
[31m-local function prof_finish()[m
[31m-  if prof_ud then[m
[31m-    profile.stop()[m
[31m-    local samples = prof_samples[m
[31m-    if samples == 0 then[m
[31m-      if prof_raw ~= true then out:write("[No samples collected]\n") end[m
[31m-      return[m
[31m-    end[m
[31m-    if prof_ann then[m
[31m-      prof_annotate(prof_count1, samples)[m
[31m-    else[m
[31m-      prof_top(prof_count1, prof_count2, samples, "")[m
[31m-    end[m
[31m-    prof_count1 = nil[m
[31m-    prof_count2 = nil[m
[31m-    prof_ud = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Start profiling.[m
[31m-local function prof_start(mode)[m
[31m-  local interval = ""[m
[31m-  mode = mode:gsub("i%d*", function(s) interval = s; return "" end)[m
[31m-  prof_min = 3[m
[31m-  mode = mode:gsub("m(%d+)", function(s) prof_min = tonumber(s); return "" end)[m
[31m-  prof_depth = 1[m
[31m-  mode = mode:gsub("%-?%d+", function(s) prof_depth = tonumber(s); return "" end)[m
[31m-  local m = {}[m
[31m-  for c in mode:gmatch(".") do m[c] = c end[m
[31m-  prof_states = m.z or m.v[m
[31m-  if prof_states == "z" then zone = require("jit.zone") end[m
[31m-  local scope = m.l or m.f or m.F or (prof_states and "" or "f")[m
[31m-  local flags = (m.p or "")[m
[31m-  prof_raw = m.r[m
[31m-  if m.s then[m
[31m-    prof_split = 2[m
[31m-    if prof_depth == -1 or m["-"] then prof_depth = -2[m
[31m-    elseif prof_depth == 1 then prof_depth = 2 end[m
[31m-  elseif mode:find("[fF].*l") then[m
[31m-    scope = "l"[m
[31m-    prof_split = 3[m
[31m-  else[m
[31m-    prof_split = (scope == "" or mode:find("[zv].*[lfF]")) and 1 or 0[m
[31m-  end[m
[31m-  prof_ann = m.A and 0 or (m.a and 3)[m
[31m-  if prof_ann then[m
[31m-    scope = "l"[m
[31m-    prof_fmt = "pl"[m
[31m-    prof_split = 0[m
[31m-    prof_depth = 1[m
[31m-  elseif m.G and scope ~= "" then[m
[31m-    prof_fmt = flags..scope.."Z;"[m
[31m-    prof_depth = -100[m
[31m-    prof_raw = true[m
[31m-    prof_min = 0[m
[31m-  elseif scope == "" then[m
[31m-    prof_fmt = false[m
[31m-  else[m
[31m-    local sc = prof_split == 3 and m.f or m.F or scope[m
[31m-    prof_fmt = flags..sc..(prof_depth >= 0 and "Z < " or "Z > ")[m
[31m-  end[m
[31m-  prof_count1 = {}[m
[31m-  prof_count2 = {}[m
[31m-  prof_samples = 0[m
[31m-  profile.start(scope:lower()..interval, prof_cb)[m
[31m-  prof_ud = newproxy(true)[m
[31m-  getmetatable(prof_ud).__gc = prof_finish[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function start(mode, outfile)[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_PROFILEFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stdout[m
[31m-  end[m
[31m-  prof_start(mode or "f")[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  start = start, -- For -j command line option.[m
[31m-  stop = prof_finish[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/v.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/v.lua[m
[1mdeleted file mode 100644[m
[1mindex 60c8b05..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/v.lua[m
[1m+++ /dev/null[m
[36m@@ -1,170 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- Verbose mode of the LuaJIT compiler.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module shows verbose information about the progress of the[m
[31m--- JIT compiler. It prints one line for each generated trace. This module[m
[31m--- is useful to see which code has been compiled or where the compiler[m
[31m--- punts and falls back to the interpreter.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jv -e "for i=1,1000 do for j=1,1000 do end end"[m
[31m---   luajit -jv=myapp.out myapp.lua[m
[31m---[m
[31m--- Default output is to stderr. To redirect the output to a file, pass a[m
[31m--- filename as an argument (use '-' for stdout) or set the environment[m
[31m--- variable LUAJIT_VERBOSEFILE. The file is overwritten every time the[m
[31m--- module is started.[m
[31m---[m
[31m--- The output from the first example should look like this:[m
[31m---[m
[31m--- [TRACE   1 (command line):1 loop][m
[31m--- [TRACE   2 (1/3) (command line):1 -> 1][m
[31m---[m
[31m--- The first number in each line is the internal trace number. Next are[m
[31m--- the file name ('(command line)') and the line number (':1') where the[m
[31m--- trace has started. Side traces also show the parent trace number and[m
[31m--- the exit number where they are attached to in parentheses ('(1/3)').[m
[31m--- An arrow at the end shows where the trace links to ('-> 1'), unless[m
[31m--- it loops to itself.[m
[31m---[m
[31m--- In this case the inner loop gets hot and is traced first, generating[m
[31m--- a root trace. Then the last exit from the 1st trace gets hot, too,[m
[31m--- and triggers generation of the 2nd trace. The side trace follows the[m
[31m--- path along the outer loop and *around* the inner loop, back to its[m
[31m--- start, and then links to the 1st trace. Yes, this may seem unusual,[m
[31m--- if you know how traditional compilers work. Trace compilers are full[m
[31m--- of surprises like this -- have fun! :-)[m
[31m---[m
[31m--- Aborted traces are shown like this:[m
[31m---[m
[31m--- [TRACE --- foo.lua:44 -- leaving loop in root trace at foo:lua:50][m
[31m---[m
[31m--- Don't worry -- trace aborts are quite common, even in programs which[m
[31m--- can be fully compiled. The compiler may retry several times until it[m
[31m--- finds a suitable trace.[m
[31m---[m
[31m--- Of course this doesn't work with features that are not-yet-implemented[m
[31m--- (NYI error messages). The VM simply falls back to the interpreter. This[m
[31m--- may not matter at all if the particular trace is not very high up in[m
[31m--- the CPU usage profile. Oh, and the interpreter is quite fast, too.[m
[31m---[m
[31m--- Also check out the -jdump module, which prints all the gory details.[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local funcinfo, traceinfo = jutil.funcinfo, jutil.traceinfo[m
[31m-local type, format = type, string.format[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m--- Active flag and output file handle.[m
[31m-local active, out[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local startloc, startex[m
[31m-[m
[31m-local function fmtfunc(func, pc)[m
[31m-  local fi = funcinfo(func, pc)[m
[31m-  if fi.loc then[m
[31m-    return fi.loc[m
[31m-  elseif fi.ffid then[m
[31m-    return vmdef.ffnames[fi.ffid][m
[31m-  elseif fi.addr then[m
[31m-    return format("C:%x", fi.addr)[m
[31m-  else[m
[31m-    return "(?)"[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Format trace error message.[m
[31m-local function fmterr(err, info)[m
[31m-  if type(err) == "number" then[m
[31m-    if type(info) == "function" then info = fmtfunc(info) end[m
[31m-    err = format(vmdef.traceerr[err], info)[m
[31m-  end[m
[31m-  return err[m
[31m-end[m
[31m-[m
[31m--- Dump trace states.[m
[31m-local function dump_trace(what, tr, func, pc, otr, oex)[m
[31m-  if what == "start" then[m
[31m-    startloc = fmtfunc(func, pc)[m
[31m-    startex = otr and "("..otr.."/"..oex..") " or ""[m
[31m-  else[m
[31m-    if what == "abort" then[m
[31m-      local loc = fmtfunc(func, pc)[m
[31m-      if loc ~= startloc then[m
[31m-	out:write(format("[TRACE --- %s%s -- %s at %s]\n",[m
[31m-	  startex, startloc, fmterr(otr, oex), loc))[m
[31m-      else[m
[31m-	out:write(format("[TRACE --- %s%s -- %s]\n",[m
[31m-	  startex, startloc, fmterr(otr, oex)))[m
[31m-      end[m
[31m-    elseif what == "stop" then[m
[31m-      local info = traceinfo(tr)[m
[31m-      local link, ltype = info.link, info.linktype[m
[31m-      if ltype == "interpreter" then[m
[31m-	out:write(format("[TRACE %3s %s%s -- fallback to interpreter]\n",[m
[31m-	  tr, startex, startloc))[m
[31m-      elseif ltype == "stitch" then[m
[31m-	out:write(format("[TRACE %3s %s%s %s %s]\n",[m
[31m-	  tr, startex, startloc, ltype, fmtfunc(func, pc)))[m
[31m-      elseif link == tr or link == 0 then[m
[31m-	out:write(format("[TRACE %3s %s%s %s]\n",[m
[31m-	  tr, startex, startloc, ltype))[m
[31m-      elseif ltype == "root" then[m
[31m-	out:write(format("[TRACE %3s %s%s -> %d]\n",[m
[31m-	  tr, startex, startloc, link))[m
[31m-      else[m
[31m-	out:write(format("[TRACE %3s %s%s -> %d %s]\n",[m
[31m-	  tr, startex, startloc, link, ltype))[m
[31m-      end[m
[31m-    else[m
[31m-      out:write(format("[TRACE %s]\n", what))[m
[31m-    end[m
[31m-    out:flush()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Detach dump handlers.[m
[31m-local function dumpoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(dump_trace)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach dump handlers.[m
[31m-local function dumpon(outfile)[m
[31m-  if active then dumpoff() end[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_VERBOSEFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stderr[m
[31m-  end[m
[31m-  jit.attach(dump_trace, "trace")[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  on = dumpon,[m
[31m-  off = dumpoff,[m
[31m-  start = dumpon -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/vmdef.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/vmdef.lua[m
[1mdeleted file mode 100644[m
[1mindex 2ca1783..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/vmdef.lua[m
[1m+++ /dev/null[m
[36m@@ -1,362 +0,0 @@[m
[31m--- This is a generated file. DO NOT EDIT![m
[31m-[m
[31m-return {[m
[31m-[m
[31m-bcnames = "ISLT  ISGE  ISLE  ISGT  ISEQV ISNEV ISEQS ISNES ISEQN ISNEN ISEQP ISNEP ISTC  ISFC  IST   ISF   ISTYPEISNUM MOV   NOT   UNM   LEN   ADDVN SUBVN MULVN DIVVN MODVN ADDNV SUBNV MULNV DIVNV MODNV ADDVV SUBVV MULVV DIVVV MODVV POW   CAT   KSTR  KCDATAKSHORTKNUM  KPRI  KNIL  UGET  USETV USETS USETN USETP UCLO  FNEW  TNEW  TDUP  GGET  GSET  TGETV TGETS TGETB TGETR TSETV TSETS TSETB TSETM TSETR CALLM CALL  CALLMTCALLT ITERC ITERN VARG  ISNEXTRETM  RET   RET0  RET1  FORI  JFORI FORL  IFORL JFORL ITERL IITERLJITERLLOOP  ILOOP JLOOP JMP   FUNCF IFUNCFJFUNCFFUNCV IFUNCVJFUNCVFUNCC FUNCCW",[m
[31m-[m
[31m-irnames = "LT    GE    LE    GT    ULT   UGE   ULE   UGT   EQ    NE    ABC   RETF  NOP   BASE  PVAL  GCSTEPHIOP  LOOP  USE   PHI   RENAMEPROF  KPRI  KINT  KGC   KPTR  KKPTR KNULL KNUM  KINT64KSLOT BNOT  BSWAP BAND  BOR   BXOR  BSHL  BSHR  BSAR  BROL  BROR  ADD   SUB   MUL   DIV   MOD   POW   NEG   ABS   ATAN2 LDEXP MIN   MAX   FPMATHADDOV SUBOV MULOV AREF  HREFK HREF  NEWREFUREFO UREFC FREF  STRREFLREF  ALOAD HLOAD ULOAD FLOAD XLOAD SLOAD VLOAD ASTOREHSTOREUSTOREFSTOREXSTORESNEW  XSNEW TNEW  TDUP  CNEW  CNEWI BUFHDRBUFPUTBUFSTRTBAR  OBAR  XBAR  CONV  TOBIT TOSTR STRTO CALLN CALLA CALLL CALLS CALLXSCARG  ",[m
[31m-[m
[31m-irfpm = { [0]="floor", "ceil", "trunc", "sqrt", "exp", "exp2", "log", "log2", "log10", "sin", "cos", "tan", "other", },[m
[31m-[m
[31m-irfield = { [0]="str.len", "func.env", "func.pc", "func.ffid", "thread.env", "tab.meta", "tab.array", "tab.node", "tab.asize", "tab.hmask", "tab.nomm", "udata.meta", "udata.udtype", "udata.file", "cdata.ctypeid", "cdata.ptr", "cdata.int", "cdata.int64", "cdata.int64_4", },[m
[31m-[m
[31m-ircall = {[m
[31m-[0]="lj_str_cmp",[m
[31m-"lj_str_find",[m
[31m-"lj_str_new",[m
[31m-"lj_strscan_num",[m
[31m-"lj_strfmt_int",[m
[31m-"lj_strfmt_num",[m
[31m-"lj_strfmt_char",[m
[31m-"lj_strfmt_putint",[m
[31m-"lj_strfmt_putnum",[m
[31m-"lj_strfmt_putquoted",[m
[31m-"lj_strfmt_putfxint",[m
[31m-"lj_strfmt_putfnum_int",[m
[31m-"lj_strfmt_putfnum_uint",[m
[31m-"lj_strfmt_putfnum",[m
[31m-"lj_strfmt_putfstr",[m
[31m-"lj_strfmt_putfchar",[m
[31m-"lj_buf_putmem",[m
[31m-"lj_buf_putstr",[m
[31m-"lj_buf_putchar",[m
[31m-"lj_buf_putstr_reverse",[m
[31m-"lj_buf_putstr_lower",[m
[31m-"lj_buf_putstr_upper",[m
[31m-"lj_buf_putstr_rep",[m
[31m-"lj_buf_puttab",[m
[31m-"lj_buf_tostr",[m
[31m-"lj_tab_new_ah",[m
[31m-"lj_tab_new1",[m
[31m-"lj_tab_dup",[m
[31m-"lj_tab_clear",[m
[31m-"lj_tab_newkey",[m
[31m-"lj_tab_len",[m
[31m-"lj_gc_step_jit",[m
[31m-"lj_gc_barrieruv",[m
[31m-"lj_mem_newgco",[m
[31m-"lj_math_random_step",[m
[31m-"lj_vm_modi",[m
[31m-"sinh",[m
[31m-"cosh",[m
[31m-"tanh",[m
[31m-"fputc",[m
[31m-"fwrite",[m
[31m-"fflush",[m
[31m-"lj_vm_floor",[m
[31m-"lj_vm_ceil",[m
[31m-"lj_vm_trunc",[m
[31m-"sqrt",[m
[31m-"exp",[m
[31m-"lj_vm_exp2",[m
[31m-"log",[m
[31m-"lj_vm_log2",[m
[31m-"log10",[m
[31m-"sin",[m
[31m-"cos",[m
[31m-"tan",[m
[31m-"lj_vm_powi",[m
[31m-"pow",[m
[31m-"atan2",[m
[31m-"ldexp",[m
[31m-"lj_vm_tobit",[m
[31m-"softfp_add",[m
[31m-"softfp_sub",[m
[31m-"softfp_mul",[m
[31m-"softfp_div",[m
[31m-"softfp_cmp",[m
[31m-"softfp_i2d",[m
[31m-"softfp_d2i",[m
[31m-"lj_vm_sfmin",[m
[31m-"lj_vm_sfmax",[m
[31m-"softfp_ui2d",[m
[31m-"softfp_f2d",[m
[31m-"softfp_d2ui",[m
[31m-"softfp_d2f",[m
[31m-"softfp_i2f",[m
[31m-"softfp_ui2f",[m
[31m-"softfp_f2i",[m
[31m-"softfp_f2ui",[m
[31m-"fp64_l2d",[m
[31m-"fp64_ul2d",[m
[31m-"fp64_l2f",[m
[31m-"fp64_ul2f",[m
[31m-"fp64_d2l",[m
[31m-"fp64_d2ul",[m
[31m-"fp64_f2l",[m
[31m-"fp64_f2ul",[m
[31m-"lj_carith_divi64",[m
[31m-"lj_carith_divu64",[m
[31m-"lj_carith_modi64",[m
[31m-"lj_carith_modu64",[m
[31m-"lj_carith_powi64",[m
[31m-"lj_carith_powu64",[m
[31m-"lj_cdata_newv",[m
[31m-"lj_cdata_setfin",[m
[31m-"strlen",[m
[31m-"memcpy",[m
[31m-"memset",[m
[31m-"lj_vm_errno",[m
[31m-"lj_carith_mul64",[m
[31m-"lj_carith_shl64",[m
[31m-"lj_carith_shr64",[m
[31m-"lj_carith_sar64",[m
[31m-"lj_carith_rol64",[m
[31m-"lj_carith_ror64",[m
[31m-},[m
[31m-[m
[31m-traceerr = {[m
[31m-[0]="error thrown or hook called during recording",[m
[31m-"trace too short",[m
[31m-"trace too long",[m
[31m-"trace too deep",[m
[31m-"too many snapshots",[m
[31m-"blacklisted",[m
[31m-"retry recording",[m
[31m-"NYI: bytecode %d",[m
[31m-"leaving loop in root trace",[m
[31m-"inner loop in root trace",[m
[31m-"loop unroll limit reached",[m
[31m-"bad argument type",[m
[31m-"JIT compilation disabled for function",[m
[31m-"call unroll limit reached",[m
[31m-"down-recursion, restarting",[m
[31m-"NYI: unsupported variant of FastFunc %s",[m
[31m-"NYI: return to lower frame",[m
[31m-"store with nil or NaN key",[m
[31m-"missing metamethod",[m
[31m-"looping index lookup",[m
[31m-"NYI: mixed sparse/dense table",[m
[31m-"symbol not in cache",[m
[31m-"NYI: unsupported C type conversion",[m
[31m-"NYI: unsupported C function type",[m
[31m-"guard would always fail",[m
[31m-"too many PHIs",[m
[31m-"persistent type instability",[m
[31m-"failed to allocate mcode memory",[m
[31m-"machine code too long",[m
[31m-"hit mcode limit (retrying)",[m
[31m-"too many spill slots",[m
[31m-"inconsistent register allocation",[m
[31m-"NYI: cannot assemble IR instruction %d",[m
[31m-"NYI: PHI shuffling too complex",[m
[31m-"NYI: register coalescing too complex",[m
[31m-},[m
[31m-[m
[31m-ffnames = {[m
[31m-[0]="Lua",[m
[31m-"C",[m
[31m-"assert",[m
[31m-"type",[m
[31m-"next",[m
[31m-"pairs",[m
[31m-"ipairs_aux",[m
[31m-"ipairs",[m
[31m-"getmetatable",[m
[31m-"setmetatable",[m
[31m-"getfenv",[m
[31m-"setfenv",[m
[31m-"rawget",[m
[31m-"rawset",[m
[31m-"rawequal",[m
[31m-"unpack",[m
[31m-"select",[m
[31m-"tonumber",[m
[31m-"tostring",[m
[31m-"error",[m
[31m-"pcall",[m
[31m-"xpcall",[m
[31m-"loadfile",[m
[31m-"load",[m
[31m-"loadstring",[m
[31m-"dofile",[m
[31m-"gcinfo",[m
[31m-"collectgarbage",[m
[31m-"newproxy",[m
[31m-"print",[m
[31m-"coroutine.status",[m
[31m-"coroutine.running",[m
[31m-"coroutine.create",[m
[31m-"coroutine.yield",[m
[31m-"coroutine.resume",[m
[31m-"coroutine.wrap_aux",[m
[31m-"coroutine.wrap",[m
[31m-"math.abs",[m
[31m-"math.floor",[m
[31m-"math.ceil",[m
[31m-"math.sqrt",[m
[31m-"math.log10",[m
[31m-"math.exp",[m
[31m-"math.sin",[m
[31m-"math.cos",[m
[31m-"math.tan",[m
[31m-"math.asin",[m
[31m-"math.acos",[m
[31m-"math.atan",[m
[31m-"math.sinh",[m
[31m-"math.cosh",[m
[31m-"math.tanh",[m
[31m-"math.frexp",[m
[31m-"math.modf",[m
[31m-"math.log",[m
[31m-"math.atan2",[m
[31m-"math.pow",[m
[31m-"math.fmod",[m
[31m-"math.ldexp",[m
[31m-"math.min",[m
[31m-"math.max",[m
[31m-"math.random",[m
[31m-"math.randomseed",[m
[31m-"bit.tobit",[m
[31m-"bit.bnot",[m
[31m-"bit.bswap",[m
[31m-"bit.lshift",[m
[31m-"bit.rshift",[m
[31m-"bit.arshift",[m
[31m-"bit.rol",[m
[31m-"bit.ror",[m
[31m-"bit.band",[m
[31m-"bit.bor",[m
[31m-"bit.bxor",[m
[31m-"bit.tohex",[m
[31m-"string.byte",[m
[31m-"string.char",[m
[31m-"string.sub",[m
[31m-"string.rep",[m
[31m-"string.reverse",[m
[31m-"string.lower",[m
[31m-"string.upper",[m
[31m-"string.dump",[m
[31m-"string.find",[m
[31m-"string.match",[m
[31m-"string.gmatch_aux",[m
[31m-"string.gmatch",[m
[31m-"string.gsub",[m
[31m-"string.format",[m
[31m-"table.maxn",[m
[31m-"table.insert",[m
[31m-"table.concat",[m
[31m-"table.sort",[m
[31m-"table.new",[m
[31m-"table.clear",[m
[31m-"io.method.close",[m
[31m-"io.method.read",[m
[31m-"io.method.write",[m
[31m-"io.method.flush",[m
[31m-"io.method.seek",[m
[31m-"io.method.setvbuf",[m
[31m-"io.method.lines",[m
[31m-"io.method.__gc",[m
[31m-"io.method.__tostring",[m
[31m-"io.open",[m
[31m-"io.popen",[m
[31m-"io.tmpfile",[m
[31m-"io.close",[m
[31m-"io.read",[m
[31m-"io.write",[m
[31m-"io.flush",[m
[31m-"io.input",[m
[31m-"io.output",[m
[31m-"io.lines",[m
[31m-"io.type",[m
[31m-"os.execute",[m
[31m-"os.remove",[m
[31m-"os.rename",[m
[31m-"os.tmpname",[m
[31m-"os.getenv",[m
[31m-"os.exit",[m
[31m-"os.clock",[m
[31m-"os.date",[m
[31m-"os.time",[m
[31m-"os.difftime",[m
[31m-"os.setlocale",[m
[31m-"debug.getregistry",[m
[31m-"debug.getmetatable",[m
[31m-"debug.setmetatable",[m
[31m-"debug.getfenv",[m
[31m-"debug.setfenv",[m
[31m-"debug.getinfo",[m
[31m-"debug.getlocal",[m
[31m-"debug.setlocal",[m
[31m-"debug.getupvalue",[m
[31m-"debug.setupvalue",[m
[31m-"debug.upvalueid",[m
[31m-"debug.upvaluejoin",[m
[31m-"debug.sethook",[m
[31m-"debug.gethook",[m
[31m-"debug.debug",[m
[31m-"debug.traceback",[m
[31m-"jit.on",[m
[31m-"jit.off",[m
[31m-"jit.flush",[m
[31m-"jit.status",[m
[31m-"jit.attach",[m
[31m-"jit.util.funcinfo",[m
[31m-"jit.util.funcbc",[m
[31m-"jit.util.funck",[m
[31m-"jit.util.funcuvname",[m
[31m-"jit.util.traceinfo",[m
[31m-"jit.util.traceir",[m
[31m-"jit.util.tracek",[m
[31m-"jit.util.tracesnap",[m
[31m-"jit.util.tracemc",[m
[31m-"jit.util.traceexitstub",[m
[31m-"jit.util.ircalladdr",[m
[31m-"jit.opt.start",[m
[31m-"jit.profile.start",[m
[31m-"jit.profile.stop",[m
[31m-"jit.profile.dumpstack",[m
[31m-"ffi.meta.__index",[m
[31m-"ffi.meta.__newindex",[m
[31m-"ffi.meta.__eq",[m
[31m-"ffi.meta.__len",[m
[31m-"ffi.meta.__lt",[m
[31m-"ffi.meta.__le",[m
[31m-"ffi.meta.__concat",[m
[31m-"ffi.meta.__call",[m
[31m-"ffi.meta.__add",[m
[31m-"ffi.meta.__sub",[m
[31m-"ffi.meta.__mul",[m
[31m-"ffi.meta.__div",[m
[31m-"ffi.meta.__mod",[m
[31m-"ffi.meta.__pow",[m
[31m-"ffi.meta.__unm",[m
[31m-"ffi.meta.__tostring",[m
[31m-"ffi.meta.__pairs",[m
[31m-"ffi.meta.__ipairs",[m
[31m-"ffi.clib.__index",[m
[31m-"ffi.clib.__newindex",[m
[31m-"ffi.clib.__gc",[m
[31m-"ffi.callback.free",[m
[31m-"ffi.callback.set",[m
[31m-"ffi.cdef",[m
[31m-"ffi.new",[m
[31m-"ffi.cast",[m
[31m-"ffi.typeof",[m
[31m-"ffi.typeinfo",[m
[31m-"ffi.istype",[m
[31m-"ffi.sizeof",[m
[31m-"ffi.alignof",[m
[31m-"ffi.offsetof",[m
[31m-"ffi.errno",[m
[31m-"ffi.string",[m
[31m-"ffi.copy",[m
[31m-"ffi.fill",[m
[31m-"ffi.abi",[m
[31m-"ffi.metatype",[m
[31m-"ffi.gc",[m
[31m-"ffi.load",[m
[31m-},[m
[31m-[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/zone.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/zone.lua[m
[1mdeleted file mode 100644[m
[1mindex f5f9656..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/jit/zone.lua[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT profiler zones.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module implements a simple hierarchical zone model.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   local zone = require("jit.zone")[m
[31m---   zone("AI")[m
[31m---   ...[m
[31m---     zone("A*")[m
[31m---     ...[m
[31m---     print(zone:get()) --> "A*"[m
[31m---     ...[m
[31m---     zone()[m
[31m---   ...[m
[31m---   print(zone:get()) --> "AI"[m
[31m---   ...[m
[31m---   zone()[m
[31m---[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m-local remove = table.remove[m
[31m-[m
[31m-return setmetatable({[m
[31m-  flush = function(t)[m
[31m-    for i=#t,1,-1 do t[i] = nil end[m
[31m-  end,[m
[31m-  get = function(t)[m
[31m-    return t[#t][m
[31m-  end[m
[31m-}, {[m
[31m-  __call = function(t, zone)[m
[31m-    if zone then[m
[31m-      t[#t+1] = zone[m
[31m-    else[m
[31m-      return (assert(remove(t), "empty zone stack"))[m
[31m-    end[m
[31m-  end[m
[31m-})[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/man/man1/luajit.1 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/man/man1/luajit.1[m
[1mdeleted file mode 100644[m
[1mindex 11e88c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/share/man/man1/luajit.1[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-.TH luajit 1 "" "" "LuaJIT documentation"[m
[31m-.SH NAME[m
[31m-luajit \- Just-In-Time Compiler for the Lua Language[m
[31m-\fB[m
[31m-.SH SYNOPSIS[m
[31m-.B luajit[m
[31m-[\fIoptions\fR]... [\fIscript\fR [\fIargs\fR]...][m
[31m-.SH "WEB SITE"[m
[31m-.IR http://luajit.org[m
[31m-.SH DESCRIPTION[m
[31m-.PP[m
[31m-This is the command-line program to run Lua programs with \fBLuaJIT\fR.[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is a just-in-time (JIT) compiler for the Lua language.[m
[31m-The virtual machine (VM) is based on a fast interpreter combined with[m
[31m-a trace compiler. It can significantly improve the performance of Lua programs.[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is API\- and ABI-compatible with the VM of the standard[m
[31m-Lua\ 5.1 interpreter. When embedding the VM into an application,[m
[31m-the built library can be used as a drop-in replacement.[m
[31m-.SH OPTIONS[m
[31m-.TP[m
[31m-.BI "\-e " chunk[m
[31m-Run the given chunk of Lua code.[m
[31m-.TP[m
[31m-.BI "\-l " library[m
[31m-Load the named library, just like \fBrequire("\fR\fIlibrary\fR\fB")\fR.[m
[31m-.TP[m
[31m-.BI "\-b " ...[m
[31m-Save or list bytecode. Run without arguments to get help on options.[m
[31m-.TP[m
[31m-.BI "\-j " command[m
[31m-Perform LuaJIT control command (optional space after \fB\-j\fR).[m
[31m-.TP[m
[31m-.BI "\-O" [opt][m
[31m-Control LuaJIT optimizations.[m
[31m-.TP[m
[31m-.B "\-i"[m
[31m-Run in interactive mode.[m
[31m-.TP[m
[31m-.B "\-v"[m
[31m-Show \fBLuaJIT\fR version.[m
[31m-.TP[m
[31m-.B "\-E"[m
[31m-Ignore environment variables.[m
[31m-.TP[m
[31m-.B "\-\-"[m
[31m-Stop processing options.[m
[31m-.TP[m
[31m-.B "\-"[m
[31m-Read script from stdin instead.[m
[31m-.PP[m
[31m-After all options are processed, the given \fIscript\fR is run.[m
[31m-The arguments are passed in the global \fIarg\fR table.[m
[31m-.PP[m
[31m-Interactive mode is only entered, if no \fIscript\fR and no \fB\-e\fR[m
[31m-option is given. Interactive mode can be left with EOF (\fICtrl\-Z\fB).[m
[31m-.SH EXAMPLES[m
[31m-.TP[m
[31m-luajit hello.lua world[m
[31m-[m
[31m-Prints "Hello world", assuming \fIhello.lua\fR contains:[m
[31m-.br[m
[31m-  print("Hello", arg[1])[m
[31m-.TP[m
[31m-luajit \-e "local x=0; for i=1,1e9 do x=x+i end; print(x)"[m
[31m-[m
[31m-Calculates the sum of the numbers from 1 to 1000000000.[m
[31m-.br[m
[31m-And finishes in a reasonable amount of time, too.[m
[31m-.TP[m
[31m-luajit \-jv \-e "for i=1,10 do for j=1,10 do for k=1,100 do end end end"[m
[31m-[m
[31m-Runs some nested loops and shows the resulting traces.[m
[31m-.SH COPYRIGHT[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is Copyright \(co 2005-2016 Mike Pall.[m
[31m-.br[m
[31m-\fBLuaJIT\fR is open source software, released under the MIT license.[m
[31m-.SH SEE ALSO[m
[31m-.PP[m
[31m-More details in the provided HTML docs or at:[m
[31m-.IR http://luajit.org[m
[31m-.br[m
[31m-More about the Lua language can be found at:[m
[31m-.IR http://lua.org/docs.html[m
[31m-.PP[m
[31m-lua(1)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex ed5f748..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-.libs[m
[31m-*.t_[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-genmobi.sh[m
[31m-*.mobi[m
[31m-misc/chunked[m
[31m-reindex[m
[31m-src/response.c[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.c[m
[31m-src/handler.c[m
[31m-src/response.rl[m
[31m-src/response.h[m
[31m-src/module.h[m
[31m-src/util.h[m
[31m-src/request.h[m
[31m-src/request.c[m
[31m-ctags[m
[31m-nginx[m
[31m-*.html[m
[31m-t/servroot/[m
[31m-all[m
[31m-Changes[m
[31m-build1[0-9][m
[31m-go[m
[31m-buildroot/[m
[31m-analyze[m
[31m-*.plist[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/config[m
[1mdeleted file mode 100644[m
[1mindex 7e4bfd6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/config[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_memc_module[m
[31m-[m
[31m-MEMC_SRCS="                                                                 \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_module.c                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_request.c                          \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_response.c                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_util.c                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_handler.c                          \[m
[31m-        "[m
[31m-[m
[31m-MEMC_DEPS="                                                                 \[m
[31m-        $ngx_addon_dir/src/ddebug.h                                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_module.h                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_request.h                          \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_response.h                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_util.h                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_handler.h                          \[m
[31m-        "[m
[31m-[m
[31m-if [ -n "$ngx_module_link" ]; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_srcs="$MEMC_SRCS"[m
[31m-    ngx_module_deps="$MEMC_DEPS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $MEMC_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $MEMC_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 36e810e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "memc *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_common.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_common.rl[m
[1mdeleted file mode 100644[m
[1mindex eeb61c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_common.rl[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_common;[m
[31m-[m
[31m-    action catch_err {[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-[m
[31m-    msg = any* -- "\r\n";[m
[31m-[m
[31m-    error_helper = "ERROR\r\n"[m
[31m-                 | "CLIENT_ERROR " msg "\r\n"[m
[31m-                 | "SERVER_ERROR " msg "\r\n"[m
[31m-                 ;[m
[31m-[m
[31m-    error = error_helper @catch_err[m
[31m-          ;[m
[31m-[m
[31m-    action finalize {[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-[m
[31m-    action check {[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-[m
[31m-    action handle_stored {[m
[31m-        dd("status set to 201");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_CREATED;[m
[31m-    }[m
[31m-[m
[31m-    action handle_not_found {[m
[31m-        dd("status set to 404");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_delete.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_delete.rl[m
[1mdeleted file mode 100644[m
[1mindex 1e01b05..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_delete.rl[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_delete;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    response = "DELETED\r\n"[m
[31m-             | "NOT_FOUND\r\n" @handle_not_found[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_flush_all.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_flush_all.rl[m
[1mdeleted file mode 100644[m
[1mindex 74c7288..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_flush_all.rl[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_flush_all;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    response = "OK\r\n"[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_incr_decr.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_incr_decr.rl[m
[1mdeleted file mode 100644[m
[1mindex b4b13a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_incr_decr.rl[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_incr_decr;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    value = digit+[m
[31m-          ;[m
[31m-[m
[31m-    response = value " "* "\r\n" @handle_stored[m
[31m-             | "NOT_FOUND\r\n" @handle_not_found[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize $check[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_stats.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_stats.rl[m
[1mdeleted file mode 100644[m
[1mindex 9526b77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_stats.rl[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_stats;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    content = any+ - "\r\n"[m
[31m-            ;[m
[31m-[m
[31m-    stat_line = "STAT " content "\r\n"[m
[31m-              ;[m
[31m-[m
[31m-    response = stat_line* "END\r\n"[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_storage.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_storage.rl[m
[1mdeleted file mode 100644[m
[1mindex b64a441..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_storage.rl[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_storage;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    response = "STORED\r\n" @handle_stored[m
[31m-             | "NOT_STORED\r\n"[m
[31m-             | "EXISTS\r\n"[m
[31m-             | "NOT_FOUND\r\n" @handle_not_found[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_version.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_version.rl[m
[1mdeleted file mode 100644[m
[1mindex 3a85b59..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/memc_version.rl[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_version;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    version = any+ - "\r\n"[m
[31m-            ;[m
[31m-[m
[31m-    response = "VERSION " version "\r\n"[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 6edd0b6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,611 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_memc_handler.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-#include "ngx_http_memc_request.h"[m
[31m-#include "ngx_http_memc_response.h"[m
[31m-#include "ngx_http_memc_util.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_memc_flags_as_http_time_variable([m
[31m-    ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t ngx_http_memc_variables[] = {[m
[31m-[m
[31m-    { ngx_string("memc_flags_as_http_time"), NULL,[m
[31m-      ngx_http_memc_flags_as_http_time_variable, 0,[m
[31m-      0, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_memc_key = ngx_string("memc_key");[m
[31m-static ngx_str_t  ngx_http_memc_cmd = ngx_string("memc_cmd");[m
[31m-static ngx_str_t  ngx_http_memc_value = ngx_string("memc_value");[m
[31m-static ngx_str_t  ngx_http_memc_flags = ngx_string("memc_flags");[m
[31m-static ngx_str_t  ngx_http_memc_exptime = ngx_string("memc_exptime");[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_memc_add_more_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_memc_variable_not_found(ngx_http_request_t *r,[m
[31m-        ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_memc_add_variable(ngx_conf_t *cf, ngx_str_t *name);[m
[31m-static ngx_flag_t ngx_http_memc_in_cmds_allowed(ngx_http_memc_loc_conf_t *mlcf,[m
[31m-        ngx_http_memc_cmd_t memc_cmd);[m
[31m-static ngx_int_t ngx_http_memc_reinit_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_memc_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_memc_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-static ngx_flag_t ngx_http_memc_valid_uint32_str(u_char *data, size_t len);[m
[31m-static ngx_flag_t ngx_http_memc_valid_uint64_str(u_char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_http_memc_loc_conf_t       *mlcf;[m
[31m-    ngx_http_memc_main_conf_t      *mmcf;[m
[31m-    ngx_str_t                       target;[m
[31m-    ngx_url_t                       url;[m
[31m-[m
[31m-    ngx_http_variable_value_t      *cmd_vv;[m
[31m-    ngx_http_variable_value_t      *key_vv;[m
[31m-    ngx_http_variable_value_t      *value_vv;[m
[31m-    ngx_http_variable_value_t      *flags_vv;[m
[31m-    ngx_http_variable_value_t      *exptime_vv;[m
[31m-[m
[31m-    ngx_http_memc_cmd_t             memc_cmd;[m
[31m-    ngx_flag_t                      is_storage_cmd = 0;[m
[31m-[m
[31m-    dd("memc handler");[m
[31m-[m
[31m-    mmcf = ngx_http_get_module_main_conf(r, ngx_http_memc_module);[m
[31m-[m
[31m-    key_vv = ngx_http_get_indexed_variable(r, mmcf->key_index);[m
[31m-    if (key_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd_vv = ngx_http_get_indexed_variable(r, mmcf->cmd_index);[m
[31m-    if (cmd_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd_vv->not_found || cmd_vv->len == 0) {[m
[31m-        dd("variable $memc_cmd not found");[m
[31m-        cmd_vv->not_found = 0;[m
[31m-        cmd_vv->valid = 1;[m
[31m-        cmd_vv->no_cacheable = 0;[m
[31m-[m
[31m-        if (r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD)) {[m
[31m-            cmd_vv->len = sizeof("get") - 1;[m
[31m-            cmd_vv->data = (u_char*) "get";[m
[31m-            memc_cmd = ngx_http_memc_cmd_get;[m
[31m-[m
[31m-        } else if (r->method == NGX_HTTP_POST) {[m
[31m-            cmd_vv->len = sizeof("add") - 1;[m
[31m-            cmd_vv->data = (u_char*) "add";[m
[31m-            memc_cmd = ngx_http_memc_cmd_add;[m
[31m-            is_storage_cmd = 1;[m
[31m-[m
[31m-        } else if (r->method == NGX_HTTP_PUT) {[m
[31m-            cmd_vv->len = sizeof("set") - 1;[m
[31m-            cmd_vv->data = (u_char*) "set";[m
[31m-            memc_cmd = ngx_http_memc_cmd_set;[m
[31m-            is_storage_cmd = 1;[m
[31m-[m
[31m-        } else if (r->method == NGX_HTTP_DELETE) {[m
[31m-            cmd_vv->len = sizeof("delete") - 1;[m
[31m-            cmd_vv->data = (u_char*) "delete";[m
[31m-            memc_cmd = ngx_http_memc_cmd_delete;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "ngx_memc: $memc_cmd variable not found for HTTP "[m
[31m-                          "%V requests", &r->method_name);[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        memc_cmd = ngx_http_memc_parse_cmd(cmd_vv->data, cmd_vv->len,[m
[31m-                                           &is_storage_cmd);[m
[31m-[m
[31m-        if (memc_cmd == ngx_http_memc_cmd_unknown) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "ngx_memc: unknown $memc_cmd \"%v\"", cmd_vv);[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memc_module);[m
[31m-[m
[31m-    dd("XXX connect timeout %d", (int) mlcf->upstream.connect_timeout);[m
[31m-[m
[31m-    if (!ngx_http_memc_in_cmds_allowed(mlcf, memc_cmd)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "ngx_memc: memcached command \"%v\" not allowed",[m
[31m-                      cmd_vv);[m
[31m-[m
[31m-        return NGX_HTTP_FORBIDDEN;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && \[m
[31m-    ((nginx_version >= 7063 && nginx_version < 8000) \[m
[31m-     || nginx_version >= 8007)[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#else /* 0.7.x < 0.7.63, 0.8.x < 0.8.7 */[m
[31m-[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-#  if (NGX_THREADS)[m
[31m-    u->peer.lock = &r->connection->lock;[m
[31m-#  endif[m
[31m-[m
[31m-    r->upstream = u;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (mlcf->complex_target) {[m
[31m-        /* variables used in the memc_pass directive */[m
[31m-        if (ngx_http_complex_value(r, mlcf->complex_target, &target)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            dd("failed to compile");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (target.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memc: handler: empty \"memc_pass\" target");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        url.host = target;[m
[31m-        url.port = 0;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        mlcf->upstream.upstream = ngx_http_memc_upstream_add(r, &url);[m
[31m-[m
[31m-        if (mlcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memc: upstream \"%V\" not found", &target);[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->schema.len = sizeof("memcached://") - 1;[m
[31m-    u->schema.data = (u_char *) "memcached://";[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_memc_module;[m
[31m-[m
[31m-    u->conf = &mlcf->upstream;[m
[31m-[m
[31m-    ctx = ngx_palloc(r->pool, sizeof(ngx_http_memc_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->body_length = 0;[m
[31m-    ctx->memc_key_vv = key_vv;[m
[31m-    ctx->memc_value_vv = NULL;[m
[31m-    ctx->memc_flags_vv = NULL;[m
[31m-[m
[31m-    ctx->parser_state = NGX_ERROR;[m
[31m-[m
[31m-    ctx->rest = NGX_HTTP_MEMC_END;[m
[31m-    ctx->request = r;[m
[31m-[m
[31m-    ctx->cmd_str.data = cmd_vv->data;[m
[31m-    ctx->cmd_str.len  = cmd_vv->len;[m
[31m-[m
[31m-    ctx->cmd = memc_cmd;[m
[31m-[m
[31m-    ctx->is_storage_cmd = is_storage_cmd;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_memc_module);[m
[31m-[m
[31m-    if (is_storage_cmd) {[m
[31m-        u->create_request = ngx_http_memc_create_storage_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_get) {[m
[31m-        u->create_request = ngx_http_memc_create_get_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_get_cmd_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_get_cmd_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_get_cmd_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-        u->create_request = ngx_http_memc_create_flush_all_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_version[m
[31m-            || memc_cmd == ngx_http_memc_cmd_stats)[m
[31m-    {[m
[31m-        u->create_request = ngx_http_memc_create_noarg_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_delete) {[m
[31m-        u->create_request = ngx_http_memc_create_delete_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_incr[m
[31m-            || memc_cmd == ngx_http_memc_cmd_decr) {[m
[31m-        u->create_request = ngx_http_memc_create_incr_decr_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-            "assertion failed: command \"%v\" does not have proper "[m
[31m-            "handlers.", cmd_vv);[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->reinit_request = ngx_http_memc_reinit_request;[m
[31m-    u->abort_request = ngx_http_memc_abort_request;[m
[31m-    u->finalize_request = ngx_http_memc_finalize_request;[m
[31m-[m
[31m-    u->input_filter_ctx = ctx;[m
[31m-[m
[31m-    if (is_storage_cmd[m
[31m-            || memc_cmd == ngx_http_memc_cmd_flush_all[m
[31m-            || memc_cmd == ngx_http_memc_cmd_delete)[m
[31m-    {[m
[31m-        exptime_vv = ngx_http_get_indexed_variable(r, mmcf->exptime_index);[m
[31m-[m
[31m-        if (exptime_vv == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->memc_exptime_vv = exptime_vv;[m
[31m-[m
[31m-        if (!exptime_vv->not_found[m
[31m-            && exptime_vv->len[m
[31m-            && !ngx_http_memc_valid_uint32_str(exptime_vv->data,[m
[31m-                                               exptime_vv->len))[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "variable \"$memc_exptime\" takes invalid value: %v",[m
[31m-                          exptime_vv);[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (is_storage_cmd || memc_cmd == ngx_http_memc_cmd_get) {[m
[31m-        flags_vv = ngx_http_get_indexed_variable(r, mmcf->flags_index);[m
[31m-        if (flags_vv == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->memc_flags_vv = flags_vv;[m
[31m-[m
[31m-        if (is_storage_cmd[m
[31m-            && !flags_vv->not_found[m
[31m-            && flags_vv->len[m
[31m-            && !ngx_http_memc_valid_uint32_str(flags_vv->data, flags_vv->len))[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "variable \"$memc_flags\" takes invalid value: %v",[m
[31m-                          flags_vv);[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (is_storage_cmd[m
[31m-        || memc_cmd == ngx_http_memc_cmd_incr[m
[31m-        || memc_cmd == ngx_http_memc_cmd_decr)[m
[31m-    {[m
[31m-        value_vv = ngx_http_get_indexed_variable(r, mmcf->value_index);[m
[31m-        if (value_vv == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (memc_cmd == ngx_http_memc_cmd_incr[m
[31m-            || memc_cmd == ngx_http_memc_cmd_decr)[m
[31m-        {[m
[31m-            if (value_vv->not_found || value_vv->len == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "the \"$memc_value\" variable is required for "[m
[31m-                              "command \"%V\"", &ctx->cmd_str);[m
[31m-[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            if (!ngx_http_memc_valid_uint64_str(value_vv->data,[m
[31m-                                                value_vv->len))[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "variable \"$memc_value\" is invalid for "[m
[31m-                              "incr/decr: %v", value_vv);[m
[31m-[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ctx->memc_value_vv = value_vv;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_memc_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http memcached request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_memc_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http memcached request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_memc_in_cmds_allowed(ngx_http_memc_loc_conf_t *mlcf,[m
[31m-    ngx_http_memc_cmd_t memc_cmd)[m
[31m-{[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_http_memc_cmd_t         *value;[m
[31m-[m
[31m-    if (mlcf->cmds_allowed == NULL || mlcf->cmds_allowed->nelts == 0) {[m
[31m-        /* by default, all the memcached commands supported are allowed. */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    value = mlcf->cmds_allowed->elts;[m
[31m-[m
[31m-    for (i = 0; i < mlcf->cmds_allowed->nelts; i++) {[m
[31m-        if (memc_cmd == value[i]) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_memc_valid_uint32_str(u_char *data, size_t len)[m
[31m-{[m
[31m-    u_char              *p, *last;[m
[31m-[m
[31m-    if (len > NGX_UINT32_LEN) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    last = data + len;[m
[31m-    for (p = data; p != last; p++) {[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_memc_valid_uint64_str(u_char *data, size_t len)[m
[31m-{[m
[31m-    u_char              *p, *last;[m
[31m-[m
[31m-    if (len > NGX_UINT64_LEN) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    last = data + len;[m
[31m-    for (p = data; p != last; p++) {[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_memc_main_conf_t       *mmcf;[m
[31m-[m
[31m-    mmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_memc_module);[m
[31m-[m
[31m-    if (!mmcf->module_used) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->key_index = ngx_http_memc_add_variable(cf, &ngx_http_memc_key);[m
[31m-    if (mmcf->key_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->cmd_index = ngx_http_memc_add_variable(cf, &ngx_http_memc_cmd);[m
[31m-    if (mmcf->cmd_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->flags_index = ngx_http_memc_add_variable(cf, &ngx_http_memc_flags);[m
[31m-    if (mmcf->flags_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->exptime_index = ngx_http_memc_add_variable(cf,[m
[31m-                                                     &ngx_http_memc_exptime);[m
[31m-    if (mmcf->exptime_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->value_index = ngx_http_memc_add_variable(cf, &ngx_http_memc_value);[m
[31m-    if (mmcf->value_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_memc_add_more_variables(cf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_add_variable(ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_variable_t         *v;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->get_handler = ngx_http_memc_variable_not_found;[m
[31m-    return ngx_http_get_variable_index(cf, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_variable_not_found(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->not_found = 1;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_add_more_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t *var, *v;[m
[31m-    for (v = ngx_http_memc_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_flags_as_http_time_variable([m
[31m-    ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    time_t                       flags_time = 0;[m
[31m-    ngx_http_memc_ctx_t         *ctx;[m
[31m-[m
[31m-    ngx_http_variable_value_t   *flags_vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    flags_vv = ctx->memc_flags_vv;[m
[31m-    if (flags_vv == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    if (flags_vv->not_found || flags_vv->len == 0) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    flags_time = ngx_atotm(flags_vv->data, flags_vv->len);[m
[31m-    if (flags_time == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_time(p, flags_time);[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->not_found = 0;[m
[31m-    v->no_cacheable = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->data = NULL;[m
[31m-    v->valid = 1;[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_handler.h[m
[1mdeleted file mode 100644[m
[1mindex cd63c4c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef NGX_HTTP_MEMC_HANDLER_H[m
[31m-#define NGX_HTTP_MEMC_HANDLER_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_memc_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_HANDLER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6136390..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,404 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Zhang "agentzh" Yichun[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-#include "ngx_http_memc_handler.h"[m
[31m-#include "ngx_http_memc_util.h"[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_memc_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_memc_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_memc_cmds_allowed(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_memc_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_memc_upstream_max_fails_unsupported(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_memc_upstream_fail_timeout_unsupported(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_memc_create_main_conf(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_memc_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_memc_commands[] = {[m
[31m-[m
[31m-    { ngx_string("memc_cmds_allowed"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_memc_cmds_allowed,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_memc_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_memc_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("memc_upstream_max_fails"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_memc_upstream_max_fails_unsupported,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_upstream_fail_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_memc_upstream_fail_timeout_unsupported,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_flags_to_last_modified"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, flags_to_last_modified),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_ignore_client_abort"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_memc_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_memc_init,                    /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_memc_create_main_conf,        /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_memc_create_loc_conf,    /* create location configration */[m
[31m-    ngx_http_memc_merge_loc_conf      /* merge location configration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_memc_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_memc_module_ctx,        /* module context */[m
[31m-    ngx_http_memc_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_memc_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memc_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->cmds_allowed = NULL;[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->flags_to_last_modified = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t *prev = parent;[m
[31m-    ngx_http_memc_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->flags_to_last_modified,[m
[31m-                         prev->flags_to_last_modified, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                                 prev->upstream.next_upstream,[m
[31m-                                 (NGX_CONF_BITMASK_SET[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.upstream == NULL) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->cmds_allowed == NULL) {[m
[31m-        conf->cmds_allowed = prev->cmds_allowed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                         prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t    *mlcf = conf;[m
[31m-    ngx_http_memc_main_conf_t   *mmcf;[m
[31m-[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_url_t                  url;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_uint_t                 n;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    if (mlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_memc_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    mmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_memc_module);[m
[31m-    mmcf->module_used = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-    if (n) {[m
[31m-        mlcf->complex_target = ngx_palloc(cf->pool,[m
[31m-                                          sizeof(ngx_http_complex_value_t));[m
[31m-        if (mlcf->complex_target == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = mlcf->complex_target;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    mlcf->complex_target = NULL;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url = value[1];[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    mlcf->upstream.upstream = ngx_http_upstream_add(cf, &url, 0);[m
[31m-    if (mlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_upstream_max_fails_unsupported(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "\"memc_upstream_max_fails\" is not supported, "[m
[31m-                       "use the \"max_fails\" parameter of the \"server\" "[m
[31m-                       "directive inside the \"upstream\" block");[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_upstream_fail_timeout_unsupported(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "\"memc_upstream_fail_timeout\" is not supported, "[m
[31m-                       "use the \"fail_timeout\" parameter of the \"server\" "[m
[31m-                       "directive inside the \"upstream\" block");[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_cmds_allowed(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t *mlcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_http_memc_cmd_t        memc_cmd;[m
[31m-    ngx_http_memc_cmd_t        *c;[m
[31m-    ngx_flag_t                 is_storage_cmd;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    mlcf->cmds_allowed = ngx_array_create(cf->pool, cf->args->nelts - 1,[m
[31m-                                          sizeof(ngx_http_memc_cmd_t));[m
[31m-[m
[31m-    if (mlcf->cmds_allowed == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        memc_cmd = ngx_http_memc_parse_cmd(value[i].data, value[i].len,[m
[31m-                                           &is_storage_cmd);[m
[31m-[m
[31m-        if (memc_cmd == ngx_http_memc_cmd_unknown) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "Unknown memcached command \"%V\" used in "[m
[31m-                               "\"memc_cmds_allowed\"", &value[i]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c = ngx_array_push(mlcf->cmds_allowed);[m
[31m-        if (c == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *c = memc_cmd;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_memc_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_memc_main_conf_t    *mmcf;[m
[31m-[m
[31m-    mmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memc_main_conf_t));[m
[31m-    if (mmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return mmcf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_module.h[m
[1mdeleted file mode 100644[m
[1mindex bea4578..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,98 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_MEMC_MODULE_H[m
[31m-#define NGX_HTTP_MEMC_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_memc_cmd_set,[m
[31m-    ngx_http_memc_cmd_add,[m
[31m-    ngx_http_memc_cmd_replace,[m
[31m-    ngx_http_memc_cmd_append,[m
[31m-    ngx_http_memc_cmd_prepend,[m
[31m-    /* ngx_http_memc_cmd_cas, */[m
[31m-[m
[31m-    ngx_http_memc_cmd_get,[m
[31m-    /* ngx_http_memc_cmd_gets, */[m
[31m-[m
[31m-    ngx_http_memc_cmd_delete,[m
[31m-[m
[31m-    ngx_http_memc_cmd_incr,[m
[31m-    ngx_http_memc_cmd_decr,[m
[31m-[m
[31m-    ngx_http_memc_cmd_stats,[m
[31m-[m
[31m-    ngx_http_memc_cmd_flush_all,[m
[31m-    ngx_http_memc_cmd_version,[m
[31m-    /* ngx_http_memc_cmd_verbosity, */[m
[31m-[m
[31m-    /* we do not want to support the "quit" command here */[m
[31m-    /* ngx_http_memc_cmd_quit, */[m
[31m-[m
[31m-    ngx_http_memc_cmd_unknown[m
[31m-} ngx_http_memc_cmd_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t                       flags_to_last_modified;[m
[31m-    ngx_http_upstream_conf_t         upstream;[m
[31m-    ngx_array_t                     *cmds_allowed;[m
[31m-    ngx_http_complex_value_t        *complex_target;[m
[31m-[m
[31m-} ngx_http_memc_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t       key_index;[m
[31m-    ngx_int_t       cmd_index;[m
[31m-    ngx_int_t       value_index;[m
[31m-    ngx_int_t       flags_index;[m
[31m-    ngx_int_t       exptime_index;[m
[31m-    ngx_int_t       module_used;[m
[31m-} ngx_http_memc_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    off_t                      rest;[m
[31m-#else[m
[31m-    size_t                     rest;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_request_t        *request;[m
[31m-    ngx_str_t                  key;[m
[31m-[m
[31m-    ngx_str_t                  cmd_str;[m
[31m-    ngx_http_memc_cmd_t        cmd;[m
[31m-[m
[31m-    ngx_http_variable_value_t  *memc_value_vv;[m
[31m-    ngx_http_variable_value_t  *memc_key_vv;[m
[31m-    ngx_http_variable_value_t  *memc_flags_vv;[m
[31m-    ngx_http_variable_value_t  *memc_exptime_vv;[m
[31m-[m
[31m-    ngx_flag_t                 is_storage_cmd;[m
[31m-[m
[31m-    int                        parser_state;[m
[31m-[m
[31m-    /* just for the subrequests in memory support */[m
[31m-    size_t                     body_length;[m
[31m-[m
[31m-} ngx_http_memc_ctx_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_memc_module;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MEMC_END   (sizeof(CRLF "END" CRLF) - 1)[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_request.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_request.c[m
[1mdeleted file mode 100644[m
[1mindex b02e322..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_request.c[m
[1m+++ /dev/null[m
[36m@@ -1,571 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_memc_request.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-#include "ngx_http_memc_util.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_storage_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    off_t                           bytes;[m
[31m-    size_t                          bytes_len;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *cl, *in;[m
[31m-    ngx_chain_t                   **ll;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-[m
[31m-    ngx_http_variable_value_t      *key_vv;[m
[31m-    ngx_http_variable_value_t      *flags_vv;[m
[31m-    ngx_http_variable_value_t      *exptime_vv;[m
[31m-    ngx_http_variable_value_t      *memc_value_vv;[m
[31m-[m
[31m-    u_char                          bytes_buf[NGX_UINT32_LEN];[m
[31m-[m
[31m-    /* TODO add support for the "cas" command */[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    /* prepare the "key" argument */[m
[31m-[m
[31m-    key_vv = ctx->memc_key_vv;[m
[31m-[m
[31m-    if (key_vv == NULL || key_vv->not_found || key_vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memc_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, key_vv->data, key_vv->len,[m
[31m-                                NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    /* prepare the "bytes" argument */[m
[31m-[m
[31m-    if (ctx->memc_value_vv && !ctx->memc_value_vv->not_found) {[m
[31m-        dd("found variable $memc_value");[m
[31m-[m
[31m-        memc_value_vv = ctx->memc_value_vv;[m
[31m-[m
[31m-        bytes = memc_value_vv->len;[m
[31m-[m
[31m-    } else if (r->request_body == NULL || r->request_body->bufs == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "neither the \"$memc_value\" variable "[m
[31m-                      "nor the request body is available");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-    } else {[m
[31m-        memc_value_vv = NULL;[m
[31m-[m
[31m-        bytes = 0;[m
[31m-        for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-            bytes += ngx_buf_size(cl->buf);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    bytes_len = ngx_snprintf(bytes_buf, sizeof(bytes_buf), "%O", bytes)[m
[31m-        - bytes_buf;[m
[31m-[m
[31m-    /* prepare the "flags" argument */[m
[31m-[m
[31m-    flags_vv = ctx->memc_flags_vv;[m
[31m-[m
[31m-    if (flags_vv == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags_vv->not_found) {[m
[31m-        flags_vv->not_found = 0;[m
[31m-        flags_vv->valid = 1;[m
[31m-        flags_vv->no_cacheable = 0;[m
[31m-        flags_vv->len = sizeof("0") - 1;[m
[31m-        flags_vv->data = (u_char *) "0";[m
[31m-    } else if (flags_vv->len == 0) {[m
[31m-        flags_vv->len = sizeof("0") - 1;[m
[31m-        flags_vv->data = (u_char *) "0";[m
[31m-    }[m
[31m-[m
[31m-    /* prepare the "exptime" argument */[m
[31m-[m
[31m-    exptime_vv = ctx->memc_exptime_vv;[m
[31m-[m
[31m-    if (exptime_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (exptime_vv->not_found || exptime_vv->len == 0) {[m
[31m-        dd("setting exptime to its default value 0...");[m
[31m-[m
[31m-        exptime_vv->not_found = 0;[m
[31m-        exptime_vv->valid = 1;[m
[31m-        exptime_vv->no_cacheable = 0;[m
[31m-        exptime_vv->len = sizeof("0") - 1;[m
[31m-        exptime_vv->data = (u_char *) "0";[m
[31m-    }[m
[31m-[m
[31m-    /* calculate the total length of the command */[m
[31m-[m
[31m-    len = ctx->cmd_str.len + sizeof(" ") - 1[m
[31m-        + key_vv->len + escape + sizeof(" ") - 1[m
[31m-        + flags_vv->len + sizeof(" ") - 1[m
[31m-        + exptime_vv->len + sizeof(" ") - 1[m
[31m-        + bytes_len[m
[31m-        + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    ll = &cl->next;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    /* copy the memcached command over */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    /* copy the memcached key over */[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, key_vv->data, key_vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, key_vv->data, key_vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    ctx->key.len = b->last - ctx->key.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http memcached request: \"%V\"", &ctx->key);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    /* copy the memcached flags over */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, flags_vv->data, flags_vv->len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    /* copy the memcached exptime over */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, exptime_vv->data, exptime_vv->len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    /* copy the memcached bytes over */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, bytes_buf, bytes_len);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (memc_value_vv) {[m
[31m-        if (memc_value_vv->len) {[m
[31m-            dd("copy $memc_value to the request");[m
[31m-            b = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->memory = 1;[m
[31m-[m
[31m-            b->start = b->pos = memc_value_vv->data;[m
[31m-            b->last  = b->end = b->start + memc_value_vv->len;[m
[31m-[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = b;[m
[31m-            cl->next = NULL;[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* to preserve the r->request_body->bufs untouched */[m
[31m-[m
[31m-        in = r->request_body->bufs;[m
[31m-[m
[31m-        while (in) {[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = ngx_calloc_buf(r->pool);[m
[31m-            if (cl->buf == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->memory = 1;[m
[31m-            *cl->buf = *in->buf;[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-            in = in->next;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* append the trailing CRLF */[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->start = b->pos = (u_char *) CRLF;[m
[31m-    b->last  = b->end = b->start + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_get_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_http_variable_value_t      *vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    vv = ctx->memc_key_vv;[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found || vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memc_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, vv->data, vv->len, NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    len = sizeof("get ") - 1 + vv->len + escape + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' ';[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, vv->data, vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, vv->data, vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    ctx->key.len = b->last - ctx->key.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http memcached request: \"%V\"", &ctx->key);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    ctx->parser_state = NGX_ERROR;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_noarg_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    len = ctx->cmd_str.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_flush_all_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_http_variable_value_t      *exptime_vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    /* prepare the (optional) "exptime" argument */[m
[31m-[m
[31m-    exptime_vv = ctx->memc_exptime_vv;[m
[31m-[m
[31m-    if (exptime_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = ctx->cmd_str.len;[m
[31m-[m
[31m-    if (!exptime_vv->not_found && exptime_vv->len) {[m
[31m-        dd("found exptime: %s", exptime_vv->data);[m
[31m-[m
[31m-        len += sizeof(' ') + exptime_vv->len;[m
[31m-    }[m
[31m-[m
[31m-    len += sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    if (!exptime_vv->not_found && exptime_vv->len) {[m
[31m-        *b->last++ = ' ';[m
[31m-        b->last = ngx_copy(b->last, exptime_vv->data, exptime_vv->len);[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_delete_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_http_variable_value_t      *key_vv;[m
[31m-    ngx_http_variable_value_t      *exptime_vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    /* prepare the "key" argument */[m
[31m-[m
[31m-    key_vv = ctx->memc_key_vv;[m
[31m-[m
[31m-    if (key_vv == NULL || key_vv->not_found || key_vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memc_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, key_vv->data, key_vv->len,[m
[31m-                                NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    /* prepare the (optional) "exptime" argument */[m
[31m-[m
[31m-    exptime_vv = ctx->memc_exptime_vv;[m
[31m-[m
[31m-    if (exptime_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = ctx->cmd_str.len + sizeof(' ') + key_vv->len + escape;[m
[31m-[m
[31m-    if (!exptime_vv->not_found && exptime_vv->len) {[m
[31m-        dd("found exptime: %s", exptime_vv->data);[m
[31m-[m
[31m-        len += sizeof(' ') + exptime_vv->len;[m
[31m-    }[m
[31m-[m
[31m-    len += sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, key_vv->data, key_vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, key_vv->data, key_vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    if (!exptime_vv->not_found && exptime_vv->len) {[m
[31m-        *b->last++ = ' ';[m
[31m-        b->last = ngx_copy(b->last, exptime_vv->data, exptime_vv->len);[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_incr_decr_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_http_variable_value_t      *key_vv;[m
[31m-    ngx_http_variable_value_t      *value_vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    /* prepare the "key" argument */[m
[31m-[m
[31m-    key_vv = ctx->memc_key_vv;[m
[31m-[m
[31m-    if (key_vv == NULL || key_vv->not_found || key_vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memc_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, key_vv->data, key_vv->len,[m
[31m-                                NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    /* prepare the "value" argument */[m
[31m-[m
[31m-    value_vv = ctx->memc_value_vv;[m
[31m-[m
[31m-    /* XXX validate if $memc_value_vv is a valid uint64 string */[m
[31m-[m
[31m-    len = ctx->cmd_str.len + sizeof(' ') + key_vv->len + escape[m
[31m-        + sizeof(' ') + value_vv->len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, key_vv->data, key_vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, key_vv->data, key_vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, value_vv->data, value_vv->len);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_request.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_request.h[m
[1mdeleted file mode 100644[m
[1mindex 10e74c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_request.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_MEMC_REQUEST_H[m
[31m-#define NGX_HTTP_MEMC_REQUEST_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_get_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_storage_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_noarg_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_flush_all_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_delete_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_incr_decr_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_REQUEST_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.c[m
[1mdeleted file mode 100644[m
[1mindex 697cf13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.c[m
[1m+++ /dev/null[m
[36m@@ -1,3443 +0,0 @@[m
[31m-[m
[31m-#line 1 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_memc_response.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-[m
[31m-[m
[31m-#ifdef s_char[m
[31m-#undef s_char[m
[31m-#endif[m
[31m-[m
[31m-#define s_char signed char[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 24 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 29 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_storage_start = 1;[m
[31m-static const int memc_storage_first_final = 54;[m
[31m-static const int memc_storage_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 25 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 27 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 42 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_flush_all_start = 1;[m
[31m-static const int memc_flush_all_first_final = 30;[m
[31m-static const int memc_flush_all_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 28 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 30 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 55 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_version_start = 1;[m
[31m-static const int memc_version_first_final = 39;[m
[31m-static const int memc_version_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 31 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 33 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 68 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_stats_start = 1;[m
[31m-static const int memc_stats_first_final = 43;[m
[31m-static const int memc_stats_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 34 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 36 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 81 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_delete_start = 1;[m
[31m-static const int memc_delete_first_final = 45;[m
[31m-static const int memc_delete_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 37 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 39 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 94 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_incr_decr_start = 1;[m
[31m-static const int memc_incr_decr_first_final = 40;[m
[31m-static const int memc_incr_decr_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 40 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-u_char  ngx_http_memc_end[] = CRLF "END" CRLF;[m
[31m-[m
[31m-[m
[31m-static u_char *parse_memc_storage(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_flush_all(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_version(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_stats(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_delete(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_incr_decr(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static ngx_int_t ngx_http_memc_write_simple_response(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u, ngx_http_memc_ctx_t *ctx,[m
[31m-        ngx_uint_t status, ngx_str_t *resp);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_process_simple_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    int                      cs;[m
[31m-    s_char                  *p;[m
[31m-    s_char                  *pe;[m
[31m-    s_char                  *orig;[m
[31m-    ngx_str_t                resp;[m
[31m-    ngx_http_upstream_t     *u;[m
[31m-    ngx_http_memc_ctx_t     *ctx;[m
[31m-    ngx_uint_t               status;[m
[31m-    unsigned                 done = 0;[m
[31m-    int                      error_state;[m
[31m-    int                      final_state;[m
[31m-[m
[31m-    status = NGX_HTTP_OK;[m
[31m-[m
[31m-    dd("process simple cmd header");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    if (ctx->parser_state == NGX_ERROR) {[m
[31m-        dd("reinit state");[m
[31m-[m
[31m-        if (ctx->is_storage_cmd) {[m
[31m-            dd("init memc_storage machine...");[m
[31m-[m
[31m-            [m
[31m-#line 91 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 156 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_storage_start;[m
[31m-	}[m
[31m-[m
[31m-#line 92 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-            dd("init memc_flush_all machine...");[m
[31m-[m
[31m-            [m
[31m-#line 97 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 169 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_flush_all_start;[m
[31m-	}[m
[31m-[m
[31m-#line 98 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_version) {[m
[31m-            dd("init memc_version machine...");[m
[31m-[m
[31m-            [m
[31m-#line 103 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 182 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_version_start;[m
[31m-	}[m
[31m-[m
[31m-#line 104 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_stats) {[m
[31m-            dd("init memc_stats machine...");[m
[31m-[m
[31m-            [m
[31m-#line 109 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 195 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_stats_start;[m
[31m-	}[m
[31m-[m
[31m-#line 110 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_delete) {[m
[31m-            dd("init memc_delete machine...");[m
[31m-[m
[31m-            [m
[31m-#line 115 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 208 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_delete_start;[m
[31m-	}[m
[31m-[m
[31m-#line 116 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_incr[m
[31m-                || ctx->cmd == ngx_http_memc_cmd_decr)[m
[31m-        {[m
[31m-            dd("init memc_incr_decr machine...");[m
[31m-[m
[31m-            [m
[31m-#line 123 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 223 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_incr_decr_start;[m
[31m-	}[m
[31m-[m
[31m-#line 124 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-              "unrecognized memcached command in "[m
[31m-              "ngx_http_memc_process_simple_header: \"%V\"",[m
[31m-              &ctx->cmd_str);[m
[31m-[m
[31m-            return NGX_ERROR; /* this results in 500 status */[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cs = ctx->parser_state;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    orig = (s_char *) u->buffer.pos;[m
[31m-[m
[31m-    p  = (s_char *) u->buffer.pos;[m
[31m-    pe = (s_char *) u->buffer.last;[m
[31m-[m
[31m-    dd("buffer len: %d", (int) (pe - p));[m
[31m-[m
[31m-    if (ctx->is_storage_cmd) {[m
[31m-        error_state = memc_storage_error;[m
[31m-        final_state = memc_storage_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_storage(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-        error_state = memc_flush_all_error;[m
[31m-        final_state = memc_flush_all_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_flush_all(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_version) {[m
[31m-        error_state = memc_version_error;[m
[31m-        final_state = memc_version_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_version(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_stats) {[m
[31m-        error_state = memc_stats_error;[m
[31m-        final_state = memc_stats_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_stats(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_delete) {[m
[31m-        error_state = memc_delete_error;[m
[31m-        final_state = memc_delete_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_delete(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_incr[m
[31m-            || ctx->cmd == ngx_http_memc_cmd_decr)[m
[31m-    {[m
[31m-        error_state = memc_incr_decr_error;[m
[31m-        final_state = memc_incr_decr_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_incr_decr(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-          "unrecognized memcached command in "[m
[31m-          "ngx_http_memc_process_simple_header: \"%V\"",[m
[31m-          &ctx->cmd_str);[m
[31m-[m
[31m-        return NGX_ERROR; /* this results in 500 status */[m
[31m-    }[m
[31m-[m
[31m-    ctx->parser_state = cs;[m
[31m-[m
[31m-    resp.data = u->buffer.start;[m
[31m-    resp.len  = (u_char *) p - resp.data;[m
[31m-[m
[31m-    u->buffer.pos = (u_char *) p;[m
[31m-[m
[31m-    dd("machine state: %d (done: %d)", cs, done);[m
[31m-    dd("memcached response: (len: %d) %s", (int) resp.len, resp.data);[m
[31m-[m
[31m-    if (done || cs >= final_state) {[m
[31m-        dd("memcached response parsed (resp.len: %d)", (int) resp.len);[m
[31m-[m
[31m-        rc = ngx_http_memc_write_simple_response(r, u, ctx, status, &resp);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (cs == error_state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response for command \"%V\" "[m
[31m-                  "at pos %O: %V", &ctx->cmd_str, (off_t) (p - orig), &resp);[m
[31m-[m
[31m-        status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        u->headers_in.status_n = status;[m
[31m-        u->state->status = status;[m
[31m-[m
[31m-        /* u->headers_in.status_n will be the final status */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("we need more data to proceed (returned NGX_AGAIN)");[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_empty_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    u->length = 0;[m
[31m-[m
[31m-    /* to persuade ngx_http_upstream_keepalive (if any)[m
[31m-       to cache the connection if the status is neither[m
[31m-       200 nor 404. */[m
[31m-    if (u->headers_in.status_n == NGX_HTTP_CREATED) {[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_empty_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    /* recover the buffer for subrequests in memory */[m
[31m-    u->buffer.last += ctx->body_length;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_get_cmd_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    dd("filter init: u->length: %d", (int) u->length);[m
[31m-[m
[31m-    u->length = u->headers_in.content_length_n + NGX_HTTP_MEMC_END;[m
[31m-[m
[31m-    dd("filter init (2): u->length: %d", (int) u->length);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_get_cmd_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-[m
[31m-    u_char               *last;[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (u->length == ctx->rest) {[m
[31m-[m
[31m-        if (ngx_strncmp(b->last,[m
[31m-                        ngx_http_memc_end + NGX_HTTP_MEMC_END - ctx->rest,[m
[31m-                        bytes) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                          "memcached sent invalid trailer");[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            ctx->rest = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->length -= bytes;[m
[31m-        ctx->rest -= bytes;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = b->last;[m
[31m-    cl->buf->pos = last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "memcached filter bytes:%z size:%z length:%z rest:%z",[m
[31m-                   bytes, b->last - b->pos, u->length, ctx->rest);[m
[31m-[m
[31m-    if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMC_END)) {[m
[31m-        u->length -= bytes;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    last += u->length - NGX_HTTP_MEMC_END;[m
[31m-[m
[31m-    if (ngx_strncmp(last, ngx_http_memc_end, b->last - last) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                      "memcached sent invalid trailer");[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        b->last = last;[m
[31m-        cl->buf->last = last;[m
[31m-        u->length = 0;[m
[31m-        ctx->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest -= b->last - last;[m
[31m-    b->last = last;[m
[31m-    cl->buf->last = last;[m
[31m-    u->length = ctx->rest;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_process_get_cmd_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t        *conf;[m
[31m-    u_char                          *p, *len;[m
[31m-    ngx_str_t                        line;[m
[31m-    ngx_http_upstream_t             *u;[m
[31m-    ngx_http_memc_ctx_t             *ctx;[m
[31m-    ngx_http_variable_value_t       *flags_vv;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    dd("process header: u->length: %u", (unsigned) u->length);[m
[31m-[m
[31m-    for (p = u->buffer.pos; p < u->buffer.last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    line.len = p - u->buffer.pos - 1;[m
[31m-    line.data = u->buffer.pos;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "memcached: \"%V\"", &line);[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {[m
[31m-[m
[31m-        p += sizeof("VALUE ") - 1;[m
[31m-[m
[31m-        if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid key in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        p += ctx->key.len;[m
[31m-[m
[31m-        if (*p++ != ' ') {[m
[31m-            goto no_valid;[m
[31m-        }[m
[31m-[m
[31m-        /* save flags */[m
[31m-[m
[31m-        flags_vv = ctx->memc_flags_vv;[m
[31m-[m
[31m-        if (flags_vv == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (flags_vv->not_found) {[m
[31m-            flags_vv->not_found = 0;[m
[31m-            flags_vv->valid = 1;[m
[31m-            flags_vv->no_cacheable = 0;[m
[31m-        }[m
[31m-[m
[31m-        flags_vv->data = p;[m
[31m-[m
[31m-        while (*p) {[m
[31m-            if (*p++ == ' ') {[m
[31m-                flags_vv->len = p - 1 - flags_vv->data;[m
[31m-                conf = ngx_http_get_module_loc_conf(r, ngx_http_memc_module);[m
[31m-[m
[31m-                if (conf->flags_to_last_modified) {[m
[31m-                    r->headers_out.last_modified_time =[m
[31m-                            ngx_atotm(flags_vv->data, flags_vv->len);[m
[31m-                }[m
[31m-[m
[31m-                goto length;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto no_valid;[m
[31m-[m
[31m-    length:[m
[31m-[m
[31m-        len = p;[m
[31m-[m
[31m-        while (*p && *p++ != CR) { /* void */ }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        u->headers_in.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (u->headers_in.content_length_n == -1) {[m
[31m-#else[m
[31m-        r->headers_out.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (r->headers_out.content_length_n == -1) {[m
[31m-#endif[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid length in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-        u->state->status = NGX_HTTP_OK;[m
[31m-        u->buffer.pos = p + 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(p, "END\x0d") == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "key: \"%V\" was not found by memcached", &ctx->key);[m
[31m-[m
[31m-        u->headers_in.status_n = NGX_HTTP_NOT_FOUND;[m
[31m-        u->state->status = NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        u->keepalive = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-no_valid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response: \"%V\"", &line);[m
[31m-[m
[31m-    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_write_simple_response(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_memc_ctx_t *ctx, ngx_uint_t status,[m
[31m-    ngx_str_t *resp)[m
[31m-{[m
[31m-    ngx_chain_t             *cl, **ll;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-    cl->buf->pos = resp->data;[m
[31m-    cl->buf->last = cl->buf->pos + resp->len;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    /* for subrequests in memory */[m
[31m-    u->buffer.pos = resp->data;[m
[31m-    u->buffer.last = resp->data + resp->len;[m
[31m-    ctx->body_length = resp->len;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    u->headers_in.content_length_n = resp->len;[m
[31m-    u->keepalive = 1;[m
[31m-#else[m
[31m-    r->headers_out.content_length_n = resp->len;[m
[31m-#endif[m
[31m-[m
[31m-    u->headers_in.status_n = status;[m
[31m-    u->state->status = status;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_storage(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 577 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 578 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 686 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 69: goto st16;[m
[31m-		case 78: goto st28;[m
[31m-		case 83: goto st43;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr18;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr18:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st54;[m
[31m-tr30:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st54;[m
[31m-tr41:[m
[31m-#line 37 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 404");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st54;[m
[31m-tr56:[m
[31m-#line 31 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 201");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_CREATED;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st54;[m
[31m-st54:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof54;[m
[31m-case 54:[m
[31m-#line 854 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	switch( (*p) ) {[m
[31m-		case 82: goto st17;[m
[31m-		case 88: goto st22;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st20;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr18;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 83 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st25;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	if ( (*p) == 83 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st27;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr30;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st30;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st31;[m
[31m-	goto st0;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-	switch( (*p) ) {[m
[31m-		case 70: goto st32;[m
[31m-		case 83: goto st38;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	if ( (*p) == 85 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st35;[m
[31m-	goto st0;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st36;[m
[31m-	goto st0;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st37;[m
[31m-	goto st0;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr41;[m
[31m-	goto st0;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st39;[m
[31m-	goto st0;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st40;[m
[31m-	goto st0;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st41;[m
[31m-	goto st0;[m
[31m-st41:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof41;[m
[31m-case 41:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st42;[m
[31m-	goto st0;[m
[31m-st42:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof42;[m
[31m-case 42:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st43:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof43;[m
[31m-case 43:[m
[31m-	switch( (*p) ) {[m
[31m-		case 69: goto st44;[m
[31m-		case 84: goto st48;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st44:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof44;[m
[31m-case 44:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st45;[m
[31m-	goto st0;[m
[31m-st45:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof45;[m
[31m-case 45:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st46;[m
[31m-	goto st0;[m
[31m-st46:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof46;[m
[31m-case 46:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st47;[m
[31m-	goto st0;[m
[31m-st47:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof47;[m
[31m-case 47:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st48:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof48;[m
[31m-case 48:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st49;[m
[31m-	goto st0;[m
[31m-st49:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof49;[m
[31m-case 49:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st50;[m
[31m-	goto st0;[m
[31m-st50:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof50;[m
[31m-case 50:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st51;[m
[31m-	goto st0;[m
[31m-st51:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof51;[m
[31m-case 51:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st52;[m
[31m-	goto st0;[m
[31m-st52:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof52;[m
[31m-case 52:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st53;[m
[31m-	goto st0;[m
[31m-st53:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof53;[m
[31m-case 53:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr56;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof54: cs = 54; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof41: cs = 41; goto _test_eof; [m
[31m-	_test_eof42: cs = 42; goto _test_eof; [m
[31m-	_test_eof43: cs = 43; goto _test_eof; [m
[31m-	_test_eof44: cs = 44; goto _test_eof; [m
[31m-	_test_eof45: cs = 45; goto _test_eof; [m
[31m-	_test_eof46: cs = 46; goto _test_eof; [m
[31m-	_test_eof47: cs = 47; goto _test_eof; [m
[31m-	_test_eof48: cs = 48; goto _test_eof; [m
[31m-	_test_eof49: cs = 49; goto _test_eof; [m
[31m-	_test_eof50: cs = 50; goto _test_eof; [m
[31m-	_test_eof51: cs = 51; goto _test_eof; [m
[31m-	_test_eof52: cs = 52; goto _test_eof; [m
[31m-	_test_eof53: cs = 53; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 579 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_flush_all(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 593 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 594 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 1206 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 69: goto st16;[m
[31m-		case 79: goto st22;[m
[31m-		case 83: goto st25;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr18;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr18:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st30;[m
[31m-tr26:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st30;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-#line 1348 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st17;[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st20;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr18;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 75 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr26;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st27;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st28;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 595 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_version(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 609 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 610 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 1502 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 69: goto st16;[m
[31m-		case 83: goto st22;[m
[31m-		case 86: goto st27;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr18;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr18:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st39;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-#line 1637 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st17;[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st20;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr18;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st25;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st28;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 83 )[m
[31m-		goto st30;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st31;[m
[31m-	goto st0;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st32;[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st37;[m
[31m-	goto st35;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st36;[m
[31m-	goto st35;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr38;[m
[31m-		case 13: goto st36;[m
[31m-	}[m
[31m-	goto st35;[m
[31m-tr38:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st40;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-#line 1799 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st36;[m
[31m-	goto st35;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto st38;[m
[31m-		case 13: goto st36;[m
[31m-	}[m
[31m-	goto st35;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	goto st35;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 611 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_stats(int *cs_addr, u_char *p, u_char *pe, ngx_uint_t *status_addr,[m
[31m-    unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 625 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 626 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 1881 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 69: goto st16;[m
[31m-		case 83: goto st25;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr17;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr17:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st43;[m
[31m-tr22:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st43;[m
[31m-st43:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof43;[m
[31m-case 43:[m
[31m-#line 2022 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	switch( (*p) ) {[m
[31m-		case 78: goto st17;[m
[31m-		case 82: goto st20;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr22;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st22;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr17;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	switch( (*p) ) {[m
[31m-		case 69: goto st26;[m
[31m-		case 84: goto st30;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st27;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st28;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	if ( (*p) == 65 )[m
[31m-		goto st31;[m
[31m-	goto st0;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st32;[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st41;[m
[31m-	goto st34;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st35;[m
[31m-	goto st34;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto st36;[m
[31m-		case 13: goto st35;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st35;[m
[31m-		case 69: goto st37;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st35;[m
[31m-		case 78: goto st38;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st35;[m
[31m-		case 68: goto st39;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st40;[m
[31m-	goto st34;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr43;[m
[31m-		case 13: goto st35;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-tr43:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st44;[m
[31m-st44:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof44;[m
[31m-case 44:[m
[31m-#line 2224 "src/ngx_http_memc_response.c"[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st35;[m
[31m-		case 69: goto st37;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st41:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof41;[m
[31m-case 41:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto st42;[m
[31m-		case 13: goto st35;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st42:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof42;[m
[31m-case 42:[m
[31m-	goto st34;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof43: cs = 43; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof44: cs = 44; goto _test_eof; [m
[31m-	_test_eof41: cs = 41; goto _test_eof; [m
[31m-	_test_eof42: cs = 42; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 627 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_delete(int *cs_addr, u_char *p, u_char *pe, ngx_uint_t *status_addr,[m
[31m-    unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 641 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 642 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 2312 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 68: goto st16;[m
[31m-		case 69: goto st24;[m
[31m-		case 78: goto st30;[m
[31m-		case 83: goto st40;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr19;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr19:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st45;[m
[31m-tr27:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st45;[m
[31m-tr42:[m
[31m-#line 37 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 404");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st45;[m
[31m-st45:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof45;[m
[31m-case 45:[m
[31m-#line 2468 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st17;[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st20;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st22;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr27;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st25;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st27;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st28;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr19;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st31;[m
[31m-	goto st0;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st32;[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	if ( (*p) == 70 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st35;[m
[31m-	goto st0;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	if ( (*p) == 85 )[m
[31m-		goto st36;[m
[31m-	goto st0;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st37;[m
[31m-	goto st0;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st38;[m
[31m-	goto st0;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st39;[m
[31m-	goto st0;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr42;[m
[31m-	goto st0;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st41;[m
[31m-	goto st0;[m
[31m-st41:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof41;[m
[31m-case 41:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st42;[m
[31m-	goto st0;[m
[31m-st42:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof42;[m
[31m-case 42:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st43;[m
[31m-	goto st0;[m
[31m-st43:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof43;[m
[31m-case 43:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st44;[m
[31m-	goto st0;[m
[31m-st44:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof44;[m
[31m-case 44:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof45: cs = 45; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof41: cs = 41; goto _test_eof; [m
[31m-	_test_eof42: cs = 42; goto _test_eof; [m
[31m-	_test_eof43: cs = 43; goto _test_eof; [m
[31m-	_test_eof44: cs = 44; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 643 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_incr_decr(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 657 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 658 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 2742 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto tr2;[m
[31m-		case 69: goto tr3;[m
[31m-		case 78: goto tr4;[m
[31m-		case 83: goto tr5;[m
[31m-	}[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto tr0;[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-tr0:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st2;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-#line 2772 "src/ngx_http_memc_response.c"[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto tr6;[m
[31m-		case 32: goto tr7;[m
[31m-	}[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto tr0;[m
[31m-	goto st0;[m
[31m-tr6:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st3;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-#line 2791 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr8;[m
[31m-	goto st0;[m
[31m-tr8:[m
[31m-#line 31 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 201");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_CREATED;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st40;[m
[31m-tr22:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st40;[m
[31m-tr37:[m
[31m-#line 37 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 404");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st40;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-#line 2854 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-tr7:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st4;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-#line 2867 "src/ngx_http_memc_response.c"[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto tr6;[m
[31m-		case 32: goto tr7;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-tr2:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st5;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-#line 2884 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto tr9;[m
[31m-	goto st0;[m
[31m-tr9:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st6;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-#line 2899 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto tr10;[m
[31m-	goto st0;[m
[31m-tr10:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st7;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-#line 2914 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto tr11;[m
[31m-	goto st0;[m
[31m-tr11:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st8;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-#line 2929 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto tr12;[m
[31m-	goto st0;[m
[31m-tr12:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st9;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-#line 2944 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto tr13;[m
[31m-	goto st0;[m
[31m-tr13:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st10;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-#line 2959 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto tr14;[m
[31m-	goto st0;[m
[31m-tr14:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st11;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-#line 2974 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto tr15;[m
[31m-	goto st0;[m
[31m-tr15:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st12;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-#line 2989 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr16;[m
[31m-	goto st0;[m
[31m-tr16:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st13;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-#line 3004 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr17;[m
[31m-	goto st0;[m
[31m-tr17:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st14;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-#line 3019 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto tr18;[m
[31m-	goto st0;[m
[31m-tr18:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st15;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-#line 3034 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr19;[m
[31m-	goto st0;[m
[31m-tr19:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st16;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-#line 3049 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto tr20;[m
[31m-	goto st0;[m
[31m-tr20:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st17;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-#line 3064 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto tr21;[m
[31m-	goto tr20;[m
[31m-tr21:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st18;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-#line 3079 "src/ngx_http_memc_response.c"[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr22;[m
[31m-		case 13: goto tr21;[m
[31m-	}[m
[31m-	goto tr20;[m
[31m-tr3:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st19;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-#line 3096 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr23;[m
[31m-	goto st0;[m
[31m-tr23:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st20;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-#line 3111 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr24;[m
[31m-	goto st0;[m
[31m-tr24:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st21;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-#line 3126 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto tr25;[m
[31m-	goto st0;[m
[31m-tr25:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st22;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-#line 3141 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr26;[m
[31m-	goto st0;[m
[31m-tr26:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st23;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-#line 3156 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto tr27;[m
[31m-	goto st0;[m
[31m-tr27:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st24;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-#line 3171 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr22;[m
[31m-	goto st0;[m
[31m-tr4:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st25;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-#line 3186 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto tr28;[m
[31m-	goto st0;[m
[31m-tr28:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st26;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-#line 3201 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto tr29;[m
[31m-	goto st0;[m
[31m-tr29:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st27;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-#line 3216 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto tr30;[m
[31m-	goto st0;[m
[31m-tr30:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st28;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-#line 3231 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 70 )[m
[31m-		goto tr31;[m
[31m-	goto st0;[m
[31m-tr31:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st29;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-#line 3246 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto tr32;[m
[31m-	goto st0;[m
[31m-tr32:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st30;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-#line 3261 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 85 )[m
[31m-		goto tr33;[m
[31m-	goto st0;[m
[31m-tr33:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st31;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-#line 3276 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto tr34;[m
[31m-	goto st0;[m
[31m-tr34:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st32;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-#line 3291 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto tr35;[m
[31m-	goto st0;[m
[31m-tr35:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st33;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-#line 3306 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto tr36;[m
[31m-	goto st0;[m
[31m-tr36:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st34;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-#line 3321 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr37;[m
[31m-	goto st0;[m
[31m-tr5:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st35;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-#line 3336 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto tr38;[m
[31m-	goto st0;[m
[31m-tr38:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st36;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-#line 3351 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr39;[m
[31m-	goto st0;[m
[31m-tr39:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st37;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-#line 3366 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto tr40;[m
[31m-	goto st0;[m
[31m-tr40:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st38;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-#line 3381 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto tr41;[m
[31m-	goto st0;[m
[31m-tr41:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st39;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-#line 3396 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr13;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 659 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.h[m
[1mdeleted file mode 100644[m
[1mindex aec26dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.h[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_MEMC_RESPONSE_H[m
[31m-#define NGX_HTTP_MEMC_RESPONSE_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_process_get_cmd_header(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_get_cmd_filter_init(void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_get_cmd_filter(void *data, ssize_t bytes);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_process_simple_header(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_empty_filter_init(void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_empty_filter(void *data, ssize_t bytes);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_process_flush_all_cmd_header(ngx_http_request_t *r);[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_RESPONSE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.rl[m
[1mdeleted file mode 100644[m
[1mindex 31f7c83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_response.rl[m
[1m+++ /dev/null[m
[36m@@ -1,663 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_memc_response.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-[m
[31m-[m
[31m-#ifdef s_char[m
[31m-#undef s_char[m
[31m-#endif[m
[31m-[m
[31m-#define s_char signed char[m
[31m-[m
[31m-[m
[31m-%% machine memc_storage;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_flush_all;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_version;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_stats;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_delete;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_incr_decr;[m
[31m-%% write data;[m
[31m-[m
[31m-[m
[31m-u_char  ngx_http_memc_end[] = CRLF "END" CRLF;[m
[31m-[m
[31m-[m
[31m-static u_char *parse_memc_storage(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_flush_all(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_version(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_stats(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_delete(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_incr_decr(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static ngx_int_t ngx_http_memc_write_simple_response(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u, ngx_http_memc_ctx_t *ctx,[m
[31m-        ngx_uint_t status, ngx_str_t *resp);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_process_simple_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    int                      cs;[m
[31m-    s_char                  *p;[m
[31m-    s_char                  *pe;[m
[31m-    s_char                  *orig;[m
[31m-    ngx_str_t                resp;[m
[31m-    ngx_http_upstream_t     *u;[m
[31m-    ngx_http_memc_ctx_t     *ctx;[m
[31m-    ngx_uint_t               status;[m
[31m-    unsigned                 done = 0;[m
[31m-    int                      error_state;[m
[31m-    int                      final_state;[m
[31m-[m
[31m-    status = NGX_HTTP_OK;[m
[31m-[m
[31m-    dd("process simple cmd header");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    if (ctx->parser_state == NGX_ERROR) {[m
[31m-        dd("reinit state");[m
[31m-[m
[31m-        if (ctx->is_storage_cmd) {[m
[31m-            dd("init memc_storage machine...");[m
[31m-[m
[31m-            %% machine memc_storage;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-            dd("init memc_flush_all machine...");[m
[31m-[m
[31m-            %% machine memc_flush_all;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_version) {[m
[31m-            dd("init memc_version machine...");[m
[31m-[m
[31m-            %% machine memc_version;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_stats) {[m
[31m-            dd("init memc_stats machine...");[m
[31m-[m
[31m-            %% machine memc_stats;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_delete) {[m
[31m-            dd("init memc_delete machine...");[m
[31m-[m
[31m-            %% machine memc_delete;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_incr[m
[31m-                || ctx->cmd == ngx_http_memc_cmd_decr)[m
[31m-        {[m
[31m-            dd("init memc_incr_decr machine...");[m
[31m-[m
[31m-            %% machine memc_incr_decr;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-              "unrecognized memcached command in "[m
[31m-              "ngx_http_memc_process_simple_header: \"%V\"",[m
[31m-              &ctx->cmd_str);[m
[31m-[m
[31m-            return NGX_ERROR; /* this results in 500 status */[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cs = ctx->parser_state;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    orig = (s_char *) u->buffer.pos;[m
[31m-[m
[31m-    p  = (s_char *) u->buffer.pos;[m
[31m-    pe = (s_char *) u->buffer.last;[m
[31m-[m
[31m-    dd("buffer len: %d", (int) (pe - p));[m
[31m-[m
[31m-    if (ctx->is_storage_cmd) {[m
[31m-        error_state = memc_storage_error;[m
[31m-        final_state = memc_storage_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_storage(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-        error_state = memc_flush_all_error;[m
[31m-        final_state = memc_flush_all_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_flush_all(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_version) {[m
[31m-        error_state = memc_version_error;[m
[31m-        final_state = memc_version_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_version(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_stats) {[m
[31m-        error_state = memc_stats_error;[m
[31m-        final_state = memc_stats_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_stats(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_delete) {[m
[31m-        error_state = memc_delete_error;[m
[31m-        final_state = memc_delete_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_delete(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_incr[m
[31m-            || ctx->cmd == ngx_http_memc_cmd_decr)[m
[31m-    {[m
[31m-        error_state = memc_incr_decr_error;[m
[31m-        final_state = memc_incr_decr_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_incr_decr(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-          "unrecognized memcached command in "[m
[31m-          "ngx_http_memc_process_simple_header: \"%V\"",[m
[31m-          &ctx->cmd_str);[m
[31m-[m
[31m-        return NGX_ERROR; /* this results in 500 status */[m
[31m-    }[m
[31m-[m
[31m-    ctx->parser_state = cs;[m
[31m-[m
[31m-    resp.data = u->buffer.start;[m
[31m-    resp.len  = (u_char *) p - resp.data;[m
[31m-[m
[31m-    u->buffer.pos = (u_char *) p;[m
[31m-[m
[31m-    dd("machine state: %d (done: %d)", cs, done);[m
[31m-    dd("memcached response: (len: %d) %s", (int) resp.len, resp.data);[m
[31m-[m
[31m-    if (done || cs >= final_state) {[m
[31m-        dd("memcached response parsed (resp.len: %d)", (int) resp.len);[m
[31m-[m
[31m-        rc = ngx_http_memc_write_simple_response(r, u, ctx, status, &resp);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (cs == error_state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response for command \"%V\" "[m
[31m-                  "at pos %O: %V", &ctx->cmd_str, (off_t) (p - orig), &resp);[m
[31m-[m
[31m-        status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        u->headers_in.status_n = status;[m
[31m-        u->state->status = status;[m
[31m-[m
[31m-        /* u->headers_in.status_n will be the final status */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("we need more data to proceed (returned NGX_AGAIN)");[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_empty_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    u->length = 0;[m
[31m-[m
[31m-    /* to persuade ngx_http_upstream_keepalive (if any)[m
[31m-       to cache the connection if the status is neither[m
[31m-       200 nor 404. */[m
[31m-    if (u->headers_in.status_n == NGX_HTTP_CREATED) {[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_empty_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    /* recover the buffer for subrequests in memory */[m
[31m-    u->buffer.last += ctx->body_length;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_get_cmd_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    dd("filter init: u->length: %d", (int) u->length);[m
[31m-[m
[31m-    u->length = u->headers_in.content_length_n + NGX_HTTP_MEMC_END;[m
[31m-[m
[31m-    dd("filter init (2): u->length: %d", (int) u->length);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_get_cmd_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-[m
[31m-    u_char               *last;[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (u->length == ctx->rest) {[m
[31m-[m
[31m-        if (ngx_strncmp(b->last,[m
[31m-                        ngx_http_memc_end + NGX_HTTP_MEMC_END - ctx->rest,[m
[31m-                        bytes) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                          "memcached sent invalid trailer");[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            ctx->rest = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->length -= bytes;[m
[31m-        ctx->rest -= bytes;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = b->last;[m
[31m-    cl->buf->pos = last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "memcached filter bytes:%z size:%z length:%z rest:%z",[m
[31m-                   bytes, b->last - b->pos, u->length, ctx->rest);[m
[31m-[m
[31m-    if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMC_END)) {[m
[31m-        u->length -= bytes;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    last += u->length - NGX_HTTP_MEMC_END;[m
[31m-[m
[31m-    if (ngx_strncmp(last, ngx_http_memc_end, b->last - last) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                      "memcached sent invalid trailer");[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        b->last = last;[m
[31m-        cl->buf->last = last;[m
[31m-        u->length = 0;[m
[31m-        ctx->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest -= b->last - last;[m
[31m-    b->last = last;[m
[31m-    cl->buf->last = last;[m
[31m-    u->length = ctx->rest;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_process_get_cmd_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t        *conf;[m
[31m-    u_char                          *p, *len;[m
[31m-    ngx_str_t                        line;[m
[31m-    ngx_http_upstream_t             *u;[m
[31m-    ngx_http_memc_ctx_t             *ctx;[m
[31m-    ngx_http_variable_value_t       *flags_vv;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    dd("process header: u->length: %u", (unsigned) u->length);[m
[31m-[m
[31m-    for (p = u->buffer.pos; p < u->buffer.last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    line.len = p - u->buffer.pos - 1;[m
[31m-    line.data = u->buffer.pos;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "memcached: \"%V\"", &line);[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {[m
[31m-[m
[31m-        p += sizeof("VALUE ") - 1;[m
[31m-[m
[31m-        if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid key in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        p += ctx->key.len;[m
[31m-[m
[31m-        if (*p++ != ' ') {[m
[31m-            goto no_valid;[m
[31m-        }[m
[31m-[m
[31m-        /* save flags */[m
[31m-[m
[31m-        flags_vv = ctx->memc_flags_vv;[m
[31m-[m
[31m-        if (flags_vv == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (flags_vv->not_found) {[m
[31m-            flags_vv->not_found = 0;[m
[31m-            flags_vv->valid = 1;[m
[31m-            flags_vv->no_cacheable = 0;[m
[31m-        }[m
[31m-[m
[31m-        flags_vv->data = p;[m
[31m-[m
[31m-        while (*p) {[m
[31m-            if (*p++ == ' ') {[m
[31m-                flags_vv->len = p - 1 - flags_vv->data;[m
[31m-                conf = ngx_http_get_module_loc_conf(r, ngx_http_memc_module);[m
[31m-[m
[31m-                if (conf->flags_to_last_modified) {[m
[31m-                    r->headers_out.last_modified_time =[m
[31m-                            ngx_atotm(flags_vv->data, flags_vv->len);[m
[31m-                }[m
[31m-[m
[31m-                goto length;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto no_valid;[m
[31m-[m
[31m-    length:[m
[31m-[m
[31m-        len = p;[m
[31m-[m
[31m-        while (*p && *p++ != CR) { /* void */ }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        u->headers_in.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (u->headers_in.content_length_n == -1) {[m
[31m-#else[m
[31m-        r->headers_out.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (r->headers_out.content_length_n == -1) {[m
[31m-#endif[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid length in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-        u->state->status = NGX_HTTP_OK;[m
[31m-        u->buffer.pos = p + 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(p, "END\x0d") == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "key: \"%V\" was not found by memcached", &ctx->key);[m
[31m-[m
[31m-        u->headers_in.status_n = NGX_HTTP_NOT_FOUND;[m
[31m-        u->state->status = NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        u->keepalive = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-no_valid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response: \"%V\"", &line);[m
[31m-[m
[31m-    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_write_simple_response(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_memc_ctx_t *ctx, ngx_uint_t status,[m
[31m-    ngx_str_t *resp)[m
[31m-{[m
[31m-    ngx_chain_t             *cl, **ll;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-    cl->buf->pos = resp->data;[m
[31m-    cl->buf->last = cl->buf->pos + resp->len;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    /* for subrequests in memory */[m
[31m-    u->buffer.pos = resp->data;[m
[31m-    u->buffer.last = resp->data + resp->len;[m
[31m-    ctx->body_length = resp->len;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    u->headers_in.content_length_n = resp->len;[m
[31m-    u->keepalive = 1;[m
[31m-#else[m
[31m-    r->headers_out.content_length_n = resp->len;[m
[31m-#endif[m
[31m-[m
[31m-    u->headers_in.status_n = status;[m
[31m-    u->state->status = status;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_storage(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_storage;[m
[31m-    %% include "memc_storage.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_flush_all(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_flush_all;[m
[31m-    %% include "memc_flush_all.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_version(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_version;[m
[31m-    %% include "memc_version.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_stats(int *cs_addr, u_char *p, u_char *pe, ngx_uint_t *status_addr,[m
[31m-    unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_stats;[m
[31m-    %% include "memc_stats.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_delete(int *cs_addr, u_char *p, u_char *pe, ngx_uint_t *status_addr,[m
[31m-    unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_delete;[m
[31m-    %% include "memc_delete.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_incr_decr(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_incr_decr;[m
[31m-    %% include "memc_incr_decr.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_util.c[m
[1mdeleted file mode 100644[m
[1mindex 090bf43..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,158 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_memc_util.h"[m
[31m-[m
[31m-ngx_http_memc_cmd_t[m
[31m-ngx_http_memc_parse_cmd(u_char *data, size_t len, ngx_flag_t *is_storage_cmd)[m
[31m-{[m
[31m-    switch (len) {[m
[31m-        case 3:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "set") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_set;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "add") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_add;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-            if (ngx_str3cmp(data, 'c', 'a', 's')) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_cas;[m
[31m-            }[m
[31m-            */[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "get") == 0) {[m
[31m-                return ngx_http_memc_cmd_get;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 4:[m
[31m-            /*[m
[31m-            if (ngx_str4cmp(data, 'g', 'e', 't', 's')) {[m
[31m-                return ngx_http_memc_cmd_gets;[m
[31m-            }[m
[31m-            */[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "incr") == 0) {[m
[31m-                return ngx_http_memc_cmd_incr;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "decr") == 0) {[m
[31m-                return ngx_http_memc_cmd_decr;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 5:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "stats") == 0) {[m
[31m-                return ngx_http_memc_cmd_stats;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 6:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "append") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_append;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "delete") == 0) {[m
[31m-                return ngx_http_memc_cmd_delete;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 7:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "replace") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_replace;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "prepend") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_prepend;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "version") == 0) {[m
[31m-                return ngx_http_memc_cmd_version;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 9:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "flush_all") == 0) {[m
[31m-                return ngx_http_memc_cmd_flush_all;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-            if (ngx_str9cmp(data, 'v', 'e', 'r', 'b', 'o', 's', 'i', 't', 'y'))[m
[31m-            {[m
[31m-                return ngx_http_memc_cmd_verbosity;[m
[31m-            }[m
[31m-            */[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            break;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_memc_cmd_unknown;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_memc_upstream_add(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_uint_t                      i;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != url->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-                url->host.len) != 0)[m
[31m-        {[m
[31m-            dd("upstream_add: host not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            dd("upstream_add: port not match: %d != %d",[m
[31m-                    (int) uscfp[i]->port, (int) url->port);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && url->default_port[m
[31m-            && uscfp[i]->default_port != url->default_port)[m
[31m-        {[m
[31m-            dd("upstream_add: default_port not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    dd("No upstream found: %.*s", (int) url->host.len, url->host.data);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_util.h[m
[1mdeleted file mode 100644[m
[1mindex 4d18531..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/src/ngx_http_memc_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_MEMC_UTIL_H[m
[31m-#define NGX_HTTP_MEMC_UTIL_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-[m
[31m-#ifndef NGX_UINT32_LEN[m
[31m-#define NGX_UINT32_LEN (NGX_INT32_LEN - 1)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_UINT64_LEN[m
[31m-#define NGX_UINT64_LEN (NGX_INT64_LEN - 1)[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_http_memc_strcmp_const(a, b) \[m
[31m-    ngx_strncmp(a, b, sizeof(b) - 1)[m
[31m-[m
[31m-ngx_http_memc_cmd_t ngx_http_memc_parse_cmd(u_char *data, size_t len,[m
[31m-        ngx_flag_t *is_storage_cmd);[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *ngx_http_memc_upstream_add([m
[31m-        ngx_http_request_t *r, ngx_url_t *url);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_UTIL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex a39260d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,240 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-no_shuffle();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set only[m
[31m---- http_config[m
[31m-   upstream mc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-   }[m
[31m-[m
[31m---- config[m
[31m-   location = "/set" {[m
[31m-       set $memc_cmd 'set';[m
[31m-       set $memc_key 'jalla';[m
[31m-       set $memc_value 'myvalue';[m
[31m-       set $memc_exptime 24;[m
[31m-       memc_pass mc;[m
[31m-   }[m
[31m-[m
[31m-[m
[31m-   location = "/get" {[m
[31m-       set $memc_cmd 'get';[m
[31m-       set $memc_key 'jalla';[m
[31m-       memc_pass mc;[m
[31m-   }[m
[31m-[m
[31m-   location = "/delete" {[m
[31m-       set $memc_cmd 'delete';[m
[31m-       set $memc_key 'jalla';[m
[31m-       memc_pass mc;[m
[31m-   }[m
[31m-   location = "/flush" {[m
[31m-       echo_location /get;[m
[31m-       #echo "";[m
[31m-       echo_location /delete;[m
[31m-   }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set in a subrequest issued from an output filter[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'blah';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        default_type 'text/html';[m
[31m-        add_before_body '/memc';[m
[31m-        echo '~~';[m
[31m-        add_after_body '/memc';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-~~[m
[31m-STORED\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: reuse request body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo';[m
[31m-        echo_subrequest POST '/memc?key=foo&cmd=set';[m
[31m-[m
[31m-        echo 'set bar';[m
[31m-        echo_subrequest POST '/memc?key=bar&cmd=set';[m
[31m-[m
[31m-        echo 'get bar';[m
[31m-        echo_location '/memc?key=bar&cmd=get';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-Hello[m
[31m---- response_body eval[m
[31m-"flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-set foo[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-set bar[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-get bar[m
[31m-status: 200[m
[31m-exptime: [m
[31m-Helloget foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-Hello"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: zero buf when $memc_value is empty[m
[31m-http://github.com/agentzh/memc-nginx-module/issues#issue/2[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value '';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: zero buf when $memc_value is empty[m
[31m-http://github.com/agentzh/memc-nginx-module/issues#issue/2[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value '';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set too long keys[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo';[m
[31m-        set $memc_value 'hi';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_body eval[m
[31m-"CLIENT_ERROR bad command line format\r[m
[31m-"[m
[31m---- error_code: 502[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get too long keys[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'get';[m
[31m-        set $memc_key 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set only[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $echo_request_body;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /memc?key=foo&cmd=set[m
[31m-hello, world[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc?key=foo&cmd=get[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/cmd.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/cmd.t[m
[1mdeleted file mode 100644[m
[1mindex 54858cd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/cmd.t[m
[1m+++ /dev/null[m
[36m@@ -1,144 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad cmd[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $memc_cmd blah;[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-ngx_memc: unknown $memc_cmd "blah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no default value for $memc_cmd for method COPY[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    COPY /foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-ngx_memc: $memc_cmd variable not found for HTTP COPY requests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: bad cmd (case sensitive)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $memc_cmd GET;[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: explicit $memc_cmd in non-empty cmds_allowed list[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd version;[m
[31m-        memc_cmds_allowed get version;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: ^VERSION \d+(\.\d+)+\S*?\r\n$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: explicit $memc_cmd in non-empty cmds_allowed list (in first)[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd version;[m
[31m-        memc_cmds_allowed version get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: ^VERSION \d+(\.\d+)+\S*?\r\n$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: explicit $memc_cmd NOT in non-empty cmds_allowed list[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd version;[m
[31m-        memc_cmds_allowed set get add delete;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-ngx_memc: memcached command "version" not allowed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: implicit $memc_cmd NOT in non-empty cmds_allowed list[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        memc_cmds_allowed set add delete version;[m
[31m-[m
[31m-        set $memcached_key foo;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: $memc_cmd has its default values when it's an empty string[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-        echo 'set big2';[m
[31m-        echo_subrequest PUT '/memc?key=big2';[m
[31m-[m
[31m-        echo 'get big2';[m
[31m-        echo_location '/memc?key=big2&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-nice to meet you![m
[31m---- response_body eval[m
[31m-"set big2[m
[31m-STORED\r[m
[31m-get big2[m
[31m-nice to meet you!"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/core-bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/core-bugs.t[m
[1mdeleted file mode 100644[m
[1mindex a9a580c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/core-bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-#no_diff;[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bug in nginx core? (1)[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- config[m
[31m-    location /set {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value '[["mafiaclans.eu", 12], ["picfu.net", 5], ["www.test.com", 0], ["www.ayom.com", 0], ["www.21dezember2012.org", 0], ["the-indie.ch", 0], ["spiele-check.de", 0], ["online-right-now.net", 0], ["google.com", 0]]';[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bug in nginx core? (2)[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- config[m
[31m-    location /get {[m
[31m-        set $memcached_key foo;[m
[31m-        memcached_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /get[m
[31m---- response_body eval[m
[31m-qq{[["mafiaclans.eu", 12], ["picfu.net", 5], ["www.test.com", 0], ["www.ayom.com", 0], ["www.21dezember2012.org", 0], ["the-indie.ch", 0], ["spiele-check.de", 0], ["online-right-now.net", 0], ["google.com", 0]]}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/delete.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/delete.t[m
[1mdeleted file mode 100644[m
[1mindex 9fccf37..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/delete.t[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: delete non-existent item[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'delete foo';[m
[31m-        echo_location '/memc?key=foo&cmd=delete';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-delete foo[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set and delete and set[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo bar';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=bar';[m
[31m-[m
[31m-        echo 'delete foo';[m
[31m-        echo_location '/memc?key=foo&cmd=delete';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^set foo bar[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-delete foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-DELETED\r[m
[31m-get foo[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set and delete and set (with exptime)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo bar';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=bar';[m
[31m-[m
[31m-        echo 'delete foo 1';[m
[31m-        echo_location '/memc?key=foo&cmd=delete&exptime=1';[m
[31m-[m
[31m-        echo 'add foo cat';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=cat';[m
[31m-[m
[31m-        echo_blocking_sleep 1.6;[m
[31m-[m
[31m-        echo 'add foo cat - 2nd';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=cat';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo bar[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-delete foo 1[m
[31m-status: 200[m
[31m-exptime: 1[m
[31m-DELETED\r[m
[31m-add foo cat[m
[31m-status: 200[m
[31m-exptime: 0[m
[31m-NOT_STORED\r[m
[31m-add foo cat - 2nd[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-"[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/errors.t[m
[1mdeleted file mode 100644[m
[1mindex 1cda000..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key foo;[m
[31m-        set $backend "not-exist";[m
[31m-        memc_pass $backend;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: connection refused[m
[31m-little-endian systems only[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key foo;[m
[31m-        set $backend "not-exist";[m
[31m-        memc_pass 127.0.0.1:1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- error_code: 502[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex 8736de7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # skip_all => 'ngx_memc storage commands do not work with the ngx_eval module';[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set in eval (NO subrequest in memory)[m
[31m---- http_config[m
[31m-   upstream mc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-   }[m
[31m-[m
[31m---- config[m
[31m-    location = /main {[m
[31m-        echo_location /eval;[m
[31m-        echo_location /eval;[m
[31m-    }[m
[31m-   location = /eval {[m
[31m-       eval_subrequest_in_memory off;[m
[31m-       eval_override_content_type text/plain;[m
[31m-       eval $res {[m
[31m-           default_type 'text/plain';[m
[31m-           set $memc_cmd 'set';[m
[31m-           set $memc_key 'foo';[m
[31m-           set $memc_value 'myvalue';[m
[31m-           set $memc_exptime 24;[m
[31m-           memc_pass mc;[m
[31m-       }[m
[31m-       echo [$res];[m
[31m-   }[m
[31m-[m
[31m---- request[m
[31m-    GET /eval[m
[31m---- response_body[m
[31m-[STORED][m
[31m---- timeout: 30[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set in eval (subrequest in memory)[m
[31m---- http_config[m
[31m-   upstream mc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-   }[m
[31m-[m
[31m---- config[m
[31m-    location = /main {[m
[31m-        echo_location /eval;[m
[31m-        echo_location /eval;[m
[31m-    }[m
[31m-   location = /eval {[m
[31m-       eval_subrequest_in_memory on;[m
[31m-       eval_override_content_type text/plain;[m
[31m-       eval $res {[m
[31m-           default_type 'text/plain';[m
[31m-           set $memc_cmd 'set';[m
[31m-           set $memc_key 'foo';[m
[31m-           set $memc_value 'myvalue';[m
[31m-           set $memc_exptime 24;[m
[31m-           memc_pass mc;[m
[31m-       }[m
[31m-       echo [$res];[m
[31m-   }[m
[31m-[m
[31m---- request[m
[31m-    GET /eval[m
[31m---- response_body[m
[31m-[STORED][m
[31m---- timeout: 30[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set in eval (subrequest in memory)[m
[31m---- http_config[m
[31m-   upstream mc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-   }[m
[31m-[m
[31m---- config[m
[31m-    location = /main {[m
[31m-        echo_location /get;[m
[31m-        echo_location /del?foo;[m
[31m-    }[m
[31m-    location = /get {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass mc;[m
[31m-    }[m
[31m-    location = /del {[m
[31m-       eval $res {[m
[31m-           set $memc_cmd delete;[m
[31m-           set $memc_key $query_string;[m
[31m-           memc_pass mc;[m
[31m-       }[m
[31m-       return 200;[m
[31m-   }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[STORED][m
[31m---- timeout: 30[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/exptime.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/exptime.t[m
[1mdeleted file mode 100644[m
[1mindex 0a62190..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/exptime.t[m
[1m+++ /dev/null[m
[36m@@ -1,166 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set exptime[m
[31m---- config[m
[31m-    location /exptime {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo&exptime=1' -b BAR;[m
[31m-[m
[31m-        echo 'get foo - 0 sec';[m
[31m-        echo_location '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo_blocking_sleep 1.1;[m
[31m-[m
[31m-        echo 'get foo - 1.1 sec';[m
[31m-        echo_location '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /exptime[m
[31m---- response_body_like[m
[31m-^flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-exptime: 1[m
[31m-STORED\r[m
[31m-get foo - 0 sec[m
[31m-status: 200[m
[31m-exptime: [m
[31m-BAR[m
[31m-get foo - 1\.1 sec[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test empty flags (default to 0)[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (exptime: EMPTY)';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo_blocking_sleep 1;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (exptime: EMPTY)[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: invalid exptime in set[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'nice';[m
[31m-        set $memc_exptime 'my invalid';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-variable "$memc_exptime" takes invalid value: my invalid,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: invalid exptime in flush_all[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'nice';[m
[31m-        set $memc_exptime 'invalid';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: invalid exptime in delete[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'delete';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'nice';[m
[31m-        set $memc_exptime 'invalid';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set negative exptime[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'sun';[m
[31m-        set $memc_value 'tree';[m
[31m-        set $memc_exptime '-1';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/flags.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/flags.t[m
[1mdeleted file mode 100644[m
[1mindex aa2b29b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/flags.t[m
[1m+++ /dev/null[m
[36m@@ -1,263 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-no_shuffle;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set flags and get flags[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (flag: 1234567890)';[m
[31m-        echo_subrequest PUT '/memc?key=foo&flags=1234567890' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (flag: 1234567890)[m
[31m-status: 201[m
[31m-flags: 1234567890[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 1234567890[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test empty flags (default to 0)[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (flag: EMPTY)';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (flag: EMPTY)[m
[31m-status: 201[m
[31m-flags: 0[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 0[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test empty flags (default to 0) (another form)[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (flag: EMPTY)';[m
[31m-        echo_subrequest PUT '/memc?key=foo&flags=' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (flag: EMPTY)[m
[31m-status: 201[m
[31m-flags: 0[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 0[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: add flags and get flags[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'flush_all';[m
[31m-        echo_subrequest GET '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo BAR (flag: 54321)';[m
[31m-        echo_subrequest POST '/memc?key=foo&flags=54321' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"flush_all[m
[31m-status: 200[m
[31m-flags: [m
[31m-OK\r[m
[31m-add foo BAR (flag: 54321)[m
[31m-status: 201[m
[31m-flags: 54321[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 54321[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set invalid flags[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'nice';[m
[31m-        set $memc_flags 'invalid';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-variable "$memc_flags" takes invalid value: invalid,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set negative flags[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'sun';[m
[31m-        set $memc_value 'tree';[m
[31m-        set $memc_flags '-1';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set flags and get flags in http time[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (flag: 1264680563)';[m
[31m-        echo_subrequest PUT '/memc?key=foo&flags=1264680563' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags $memc_flags_as_http_time";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (flag: 1264680563)[m
[31m-status: 201[m
[31m-flags: 1264680563 Thu, 28 Jan 2010 12:09:23 GMT[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 1264680563 Thu, 28 Jan 2010 12:09:23 GMT[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: last-modified (conditional GET)[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_key;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        memc_flags_to_last_modified on;[m
[31m-        add_header X-Flags $memc_flags;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=foo[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 28 Jan 2010 12:09:23 GMT[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 28 Jan 2010 12:09:23 GMT[m
[31m-X-Flags: 1264680563[m
[31m---- error_code: 304[m
[31m---- response_body:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: last-modified (unconditional GET)[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_key;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        memc_flags_to_last_modified on;[m
[31m-        add_header X-Flags $memc_flags;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=foo[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 28 Jan 2010 12:09:23 GMT[m
[31m-X-Flags: 1264680563[m
[31m---- error_code: 200[m
[31m---- response_body: BAR[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/flush-all.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/flush-all.t[m
[1mdeleted file mode 100644[m
[1mindex aeea8dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/flush-all.t[m
[1m+++ /dev/null[m
[36m@@ -1,120 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush_all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set and flush and get[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=blah';[m
[31m-[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^set foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-flush_all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set exptime[m
[31m---- config[m
[31m-    location /exptime {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'flush_all exptime=2';[m
[31m-        echo_location '/memc?cmd=flush_all&exptime=2';[m
[31m-[m
[31m-        echo 'get foo - 0 sec';[m
[31m-        echo_location '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo_blocking_sleep 2;[m
[31m-[m
[31m-        echo 'get foo - 2 sec';[m
[31m-        echo_location '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /exptime[m
[31m---- response_body_like[m
[31m-flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-flush_all exptime=2[m
[31m-status: 200[m
[31m-exptime: 2[m
[31m-OK\r[m
[31m-get foo - 0 sec[m
[31m-status: 200[m
[31m-exptime: [m
[31m-BAR[m
[31m-get foo - 2 sec[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m---- timeout: 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/if.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/if.t[m
[1mdeleted file mode 100644[m
[1mindex 89c5859..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/if.t[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad cmd[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($uri ~* 'foo') {[m
[31m-            set $memc_cmd flush_all;[m
[31m-        }[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/incr-decr.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/incr-decr.t[m
[1mdeleted file mode 100644[m
[1mindex 8412ec9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/incr-decr.t[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: value required for incr[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: invalid value for incr[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo&val=nice[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-variable "$memc_value" is invalid for incr/decr: nice,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: invalid value (negative intenger) for incr[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo&val=-5[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: key required for incr[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&val=2[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- SKIP[m
[31m---- TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: incr[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-incr 51[m
[31m-status: 201[m
[31m-exptime: [m
[31m-83\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-83"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: decr[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'decr 13';[m
[31m-        echo_location '/memc?key=foo&cmd=decr&val=13';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-decr 13[m
[31m-status: 201[m
[31m-exptime: [m
[31m-19\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-19"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: incr an non-existent key[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^flush all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-incr 51[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: decr[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'decr 13';[m
[31m-        echo_location '/memc?key=foo&cmd=decr&val=13';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-decr 13[m
[31m-status: 201[m
[31m-exptime: [m
[31m-19\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-19"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: incr an non-existent key (with fallback)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        error_page 404 = /set_and_incr?$query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /set_and_incr {[m
[31m-        internal;[m
[31m-[m
[31m-        echo_location /memc?cmd=add&key=$arg_key&val=0;[m
[31m-        echo_location /memc?$query_string;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-incr 51[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-status: 201[m
[31m-exptime: [m
[31m-51\r[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex e1292e6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: keepalive[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-      #server 127.0.0.1:11985;[m
[31m-      #server 127.0.0.1:11986;[m
[31m-      keepalive 2;[m
[31m-      #hash $arg_key;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value 'value';[m
[31m-        memc_pass backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=dog[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-"[m
[31m---- error_code: 201[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive/incr-decr.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive/incr-decr.t[m
[1mdeleted file mode 100644[m
[1mindex b03f1e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive/incr-decr.t[m
[1m+++ /dev/null[m
[36m@@ -1,306 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: value required for incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: invalid value for incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo&val=nice[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: invalid value (negative intenger) for incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo&val=-5[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: key required for incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&val=2[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- SKIP[m
[31m---- TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-incr 51[m
[31m-status: 201[m
[31m-exptime: [m
[31m-83\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-83"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: decr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'decr 13';[m
[31m-        echo_location '/memc?key=foo&cmd=decr&val=13';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-decr 13[m
[31m-status: 201[m
[31m-exptime: [m
[31m-19\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-19"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: incr an non-existent key[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^flush all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-incr 51[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: decr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'decr 13';[m
[31m-        echo_location '/memc?key=foo&cmd=decr&val=13';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-decr 13[m
[31m-status: 201[m
[31m-exptime: [m
[31m-19\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-19"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: incr an non-existent key (with fallback)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-[m
[31m-        error_page 404 = /set_and_incr?$query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /set_and_incr {[m
[31m-        internal;[m
[31m-[m
[31m-        echo_location /memc?cmd=add&key=$arg_key&val=0;[m
[31m-        echo_location /memc?$query_string;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-incr 51[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-status: 201[m
[31m-exptime: [m
[31m-51\r[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive/storage.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive/storage.t[m
[1mdeleted file mode 100644[m
[1mindex 69c2116..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/keepalive/storage.t[m
[1m+++ /dev/null[m
[36m@@ -1,749 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() - 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_shuffle();[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-log_level('warn');[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set only[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=foo&cmd=set&val=blah[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set and get[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=blah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-blah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set UTF-8 and get UTF-8[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 你好';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=你好';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 你好[m
[31m-STORED\r[m
[31m-get foo[m
[31m-你好"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set and get empty values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-OK\r[m
[31m-set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: add[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-added"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set using POST[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo';[m
[31m-        echo_subrequest POST '/memc?key=foo&cmd=set';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, world[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-set foo[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-hello, world"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: default REST interface when no $memc_cmd is set[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'set foo FOO';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b FOO;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"set foo FOO[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-FOO[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-BAR[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: default REST interface when no $memc_cmd is set (read client req body)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'set foo <client req body>';[m
[31m-        echo_subrequest PUT '/memc?key=foo';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-rock[m
[31m---- response_body eval[m
[31m-"set foo <client req body>[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-rock[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-BAR[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: default REST interface when no $memc_cmd is set (read client req body)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'set foo <client req body>';[m
[31m-        echo_subrequest PUT '/memc?key=foo';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'add foo BAR';[m
[31m-        echo_subrequest POST '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-howdy[m
[31m---- response_body eval[m
[31m-"set foo <client req body>[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-howdy[m
[31m-add foo BAR[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-howdy[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: test replace (stored) (without sleep)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-replace foo bah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-bah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: test replace (stored) (with sleep)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-        echo_blocking_sleep 0.001;[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-replace foo bah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-bah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: test replace (not stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-replace foo bah[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: test append (stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo hello';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=hello';[m
[31m-[m
[31m-        echo 'append foo ,world';[m
[31m-        echo_location '/memc?key=foo&cmd=append&val=,world';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo hello[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-append foo ,world[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-hello,world"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: test append (not stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'append foo ,world';[m
[31m-        echo_location '/memc?key=foo&cmd=append&val=,world';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-append foo ,world[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: test prepend (stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo hello';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=hello';[m
[31m-[m
[31m-        echo 'prepend foo world,';[m
[31m-        echo_location '/memc?key=foo&cmd=prepend&val=world,';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo hello[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-prepend foo world,[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-world,hello"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: test prepend (not stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'prepend foo world,';[m
[31m-        echo_location '/memc?key=foo&cmd=prepend&val=world,';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-prepend foo world,[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set and get big value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /big {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        client_body_buffer_size 1k;[m
[31m-        client_max_body_size 100k;[m
[31m-[m
[31m-        echo 'set big';[m
[31m-        echo_subrequest POST '/memc?key=big&cmd=set';[m
[31m-[m
[31m-        echo 'get big';[m
[31m-        echo_location '/memc?key=big&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /big\n" .[m
[31m- 'a' x (1024 * 1) . 'efg'[m
[31m-[m
[31m---- response_body eval[m
[31m-"set big[m
[31m-STORED\r[m
[31m-get big[m
[31m-" . 'a' x (1024 * 1) . 'efg'[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set and get too big values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /big {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        client_max_body_size 100k;[m
[31m-[m
[31m-        echo 'set big';[m
[31m-        echo_subrequest POST '/memc?key=big&cmd=set';[m
[31m-[m
[31m-        echo 'get big';[m
[31m-        echo_location '/memc?key=big&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /big\n" .[m
[31m- 'a' x (1024 * 100) . 'efg'[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-client intended to send too large body: 102403 bytes[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: replace non-existent item[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'replace foo bar';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bar';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-replace foo bar[m
[31m-status: 200[m
[31m-exptime: 0[m
[31m-NOT_STORED\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: eval + memc[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        eval $data {[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/foo;[m
[31m-        }[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key /foo;[m
[31m-        set $memc_value $data;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/stats.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/stats.t[m
[1mdeleted file mode 100644[m
[1mindex 7dd5ea7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/stats.t[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-log_level('error');[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    location /stats {[m
[31m-        set $memc_cmd stats;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /stats[m
[31m---- response_body_like: ^(?:STAT [^\r]*\r\n)*END\r\n$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: timeout[m
[31m---- config[m
[31m-    memc_connect_timeout 10ms;[m
[31m-    memc_send_timeout 10ms;[m
[31m-    location /stats {[m
[31m-        set $memc_cmd stats;[m
[31m-        memc_pass www.taobao.com:12345;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /stats[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 1[m
[31m---- error_code: 504[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/storage.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/storage.t[m
[1mdeleted file mode 100644[m
[1mindex ee0706b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/storage.t[m
[1m+++ /dev/null[m
[36m@@ -1,740 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_shuffle();[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set only[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=foo&cmd=set&val=blah[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set and get[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=blah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-blah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set UTF-8 and get UTF-8[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 你好';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=你好';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 你好[m
[31m-STORED\r[m
[31m-get foo[m
[31m-你好"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set and get empty values[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-OK\r[m
[31m-set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: add[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-added"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set using POST[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo';[m
[31m-        echo_subrequest POST '/memc?key=foo&cmd=set';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, world[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-set foo[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-hello, world"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: default REST interface when no $memc_cmd is set[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo FOO';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b FOO;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"set foo FOO[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-FOO[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-BAR[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: default REST interface when no $memc_cmd is set (read client req body)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-        echo 'set foo <client req body>';[m
[31m-        echo_subrequest PUT '/memc?key=foo';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-rock[m
[31m---- response_body eval[m
[31m-"set foo <client req body>[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-rock[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-BAR[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: default REST interface when no $memc_cmd is set (read client req body)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-        echo 'set foo <client req body>';[m
[31m-        echo_subrequest PUT '/memc?key=foo';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'add foo BAR';[m
[31m-        echo_subrequest POST '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-howdy[m
[31m---- response_body eval[m
[31m-"set foo <client req body>[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-howdy[m
[31m-add foo BAR[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-howdy[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: test replace (stored) (without sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-replace foo bah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-bah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: test replace (stored) (with sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-        echo_blocking_sleep 0.001;[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-replace foo bah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-bah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: test replace (not stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-replace foo bah[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: test append (stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo hello';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=hello';[m
[31m-[m
[31m-        echo 'append foo ,world';[m
[31m-        echo_location '/memc?key=foo&cmd=append&val=,world';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo hello[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-append foo ,world[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-hello,world"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: test append (not stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'append foo ,world';[m
[31m-        echo_location '/memc?key=foo&cmd=append&val=,world';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-append foo ,world[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: test prepend (stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo hello';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=hello';[m
[31m-[m
[31m-        echo 'prepend foo world,';[m
[31m-        echo_location '/memc?key=foo&cmd=prepend&val=world,';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo hello[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-prepend foo world,[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-world,hello"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: test prepend (not stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'prepend foo world,';[m
[31m-        echo_location '/memc?key=foo&cmd=prepend&val=world,';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-prepend foo world,[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set and get big value[m
[31m---- config[m
[31m-    location /big {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        client_max_body_size 100k;[m
[31m-[m
[31m-        echo_read_request_body;[m
[31m-        echo 'set big';[m
[31m-        echo_subrequest POST '/memc?key=big&cmd=set';[m
[31m-[m
[31m-        echo 'get big';[m
[31m-        echo_location '/memc?key=big&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /big\n" .[m
[31m- 'a' x (1024 * 1) . 'efg'[m
[31m-[m
[31m---- response_body eval[m
[31m-"set big[m
[31m-STORED\r[m
[31m-get big[m
[31m-" . 'a' x (1024 * 1) . 'efg'[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set and get too big values[m
[31m---- config[m
[31m-    location /big {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        client_max_body_size 100k;[m
[31m-[m
[31m-        echo 'set big';[m
[31m-        echo_subrequest POST '/memc?key=big&cmd=set';[m
[31m-[m
[31m-        echo 'get big';[m
[31m-        echo_location '/memc?key=big&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /big\n" .[m
[31m- 'a' x (1024 * 100) . 'efg'[m
[31m-[m
[31m---- response_body_like: 413 Request Entity Too Large[m
[31m---- error_code: 413[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: replace non-existent item[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'replace foo bar';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bar';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-replace foo bar[m
[31m-status: 200[m
[31m-exptime: 0[m
[31m-NOT_STORED\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: eval + memc[m
[31m---- config[m
[31m-    location /main {[m
[31m-        eval $data {[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/foo;[m
[31m-        }[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key /foo;[m
[31m-        set $memc_value $data;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: set and get (binary data containing \0)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=blah%00blah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set_unescape_uri $memc_key $arg_key;[m
[31m-        set_unescape_uri $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-blah\0blah"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/upstream.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/upstream.t[m
[1mdeleted file mode 100644[m
[1mindex a50fcac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/upstream.t[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /stats {[m
[31m-        set $memc_cmd stats;[m
[31m-        memc_pass backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /stats[m
[31m---- response_body_like: ^(?:STAT [^\r]*\r\n)*END\r\n$[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-      server 127.0.0.1:11985;[m
[31m-      server 127.0.0.1:11986;[m
[31m-      #keepalive 2;[m
[31m-      #hash $arg_key;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value 'value';[m
[31m-        memc_pass backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=dog[m
[31m---- response_body[m
[31m---- error_code: 201[m
[31m---- timeout: 3[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity with dynamic backend[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /stats {[m
[31m-        set $memc_cmd stats;[m
[31m-        memc_pass $arg_target;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /stats?target=backend[m
[31m---- response_body_like: ^(?:STAT [^\r]*\r\n)*END\r\n$[m
[31m---- timeout: 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/used.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/used.t[m
[1mdeleted file mode 100644[m
[1mindex 4e7b2ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/used.t[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module not used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local v = ngx.var[m
[31m-            ngx.say(v.memc_cmd, v.memc_exptime, v.memc_value, v.memc_key, v.memc_flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap[m
[31m-F(ngx_http_memc_add_variable) {[m
[31m-    printf("memc add variable \"%s\"\n", user_string_n($name->data, $name->len))[m
[31m-}[m
[31m---- stap_out[m
[31m---- response_body[m
[31m-nilnilnilnilnil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: module used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local v = ngx.var[m
[31m-            ngx.say(v.memc_cmd, v.memc_exptime, v.memc_value, v.memc_key, v.memc_flags)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /bah {[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass 127.0.0.1:11211;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap[m
[31m-F(ngx_http_memc_add_variable) {[m
[31m-    printf("memc add variable \"%s\"\n", user_string_n($name->data, $name->len))[m
[31m-}[m
[31m---- stap_out[m
[31m-memc add variable "memc_key"[m
[31m-memc add variable "memc_cmd"[m
[31m-memc add variable "memc_flags"[m
[31m-memc add variable "memc_exptime"[m
[31m-memc add variable "memc_value"[m
[31m-[m
[31m---- response_body[m
[31m-nilnilnilnilnil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex 72d9595..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: the "version" command[m
[31m---- config[m
[31m-    location /ver {[m
[31m-        set $memc_cmd version;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /ver[m
[31m---- response_body_like: ^VERSION \d+(\.\d+)+\S*?\r\n$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 5b05fcb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-ragel -I src -G2 src/ngx_http_memc_response.rl[m
[31m-util/fix-clang-warnings[m
[31m-[m
[31m-if [ $? != 0 ]; then[m
[31m-    echo 'Failed to generate the memcached response parser.' 1>&2[m
[31m-    exit 1;[m
[31m-fi[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-    --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:/usr/local/lib" \[m
[31m-    --with-cc-opt="-O2" \[m
[31m-    --with-http_addition_module \[m
[31m-    --without-mail_pop3_module \[m
[31m-    --without-mail_imap_module \[m
[31m-    --without-mail_smtp_module \[m
[31m-    --without-http_upstream_ip_hash_module \[m
[31m-    --without-http_empty_gif_module \[m
[31m-    --without-http_referer_module \[m
[31m-    --without-http_autoindex_module \[m
[31m-    --without-http_auth_basic_module \[m
[31m-    --without-http_userid_module \[m
[31m-    --add-module=$root $opts \[m
[31m-    --add-module=$root/../ndk-nginx-module \[m
[31m-    --add-module=$root/../eval-nginx-module \[m
[31m-    --add-module=$root/../echo-nginx-module \[m
[31m-    --add-module=$root/../set-misc-nginx-module \[m
[31m-    --add-module=$root/../lua-nginx-module \[m
[31m-    --add-module=$home/work/nginx/ngx_http_upstream_keepalive-0.7 \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-    --with-debug[m
[31m-    #--add-module=$home/work/nginx/nginx_upstream_hash-0.3 \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/fix-clang-warnings b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/fix-clang-warnings[m
[1mdeleted file mode 100755[m
[1mindex 6b1bda6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/fix-clang-warnings[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use File::Temp 'tempfile';[m
[31m-[m
[31m-my $infile = "src/ngx_http_memc_response.c";[m
[31m-my ($out, $outfile) = tempfile();[m
[31m-open my $in, $infile[m
[31m-    or die "Cannot open $infile for reading: $!\n";[m
[31m-my $hits = 0;[m
[31m-while (<$in>) {[m
[31m-    if (/ \b memc_ (?: storage | flush_all | version | stats | delete | incr_decr )[m
[31m-             _en_main \b /x)[m
[31m-     {[m
[31m-        #warn "HIT!";[m
[31m-        $hits++;[m
[31m-        next;[m
[31m-    }[m
[31m-    print $out $_;[m
[31m-}[m
[31m-close $in;[m
[31m-close $out;[m
[31m-if ($hits) {[m
[31m-    my $cmd = "cp $outfile $infile";[m
[31m-    system($cmd) == 0[m
[31m-        or die "Cannot run command \"$cmd\": $!";[m
[31m-}[m
[31m-#die;[m
[31m-[m
[31m-__END__[m
[31m-[m
[31m-This script is to fix the following clang warnings when using Ragel 6.8/6.9/etc:[m
[31m-[m
[31m-src/ngx_http_memc_response.c:33:18: error: unused variable 'memc_storage_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_storage_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:46:18: error: unused variable 'memc_flush_all_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_flush_all_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:59:18: error: unused variable 'memc_version_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_version_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:72:18: error: unused variable 'memc_stats_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_stats_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:85:18: error: unused variable 'memc_delete_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_delete_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:98:18: error: unused variable 'memc_incr_decr_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_incr_decr_en_main = 1;[m
[31m-                 ^[m
[31m-6 errors generated.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex fd9c9d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/readme.wiki > /tmp/a.pod \[m
[31m-    && pod2text /tmp/a.pod > README \[m
[31m-    && perl -i -pe 's{(https?://.*?)>}{$1 >}g' README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex b2c63a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/memc-nginx-module-0.17/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_connection[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_notify_init[m
[31m-   fun:ngx_epoll_init[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 71e9d26..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-default:	build[m
[31m-[m
[31m-clean:[m
[31m-	rm -rf Makefile objs[m
[31m-[m
[31m-build:[m
[31m-	$(MAKE) -f objs/Makefile[m
[31m-[m
[31m-install:[m
[31m-	$(MAKE) -f objs/Makefile install[m
[31m-[m
[31m-modules:[m
[31m-	$(MAKE) -f objs/Makefile modules[m
[31m-[m
[31m-upgrade:[m
[31m-	/usr/local/openresty/nginx/sbin/nginx -t[m
[31m-[m
[31m-	kill -USR2 `cat /usr/local/openresty/nginx/logs/nginx.pid`[m
[31m-	sleep 1[m
[31m-	test -f /usr/local/openresty/nginx/logs/nginx.pid.oldbin[m
[31m-[m
[31m-	kill -QUIT `cat /usr/local/openresty/nginx/logs/nginx.pid.oldbin`[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/README[m
[1mdeleted file mode 100644[m
[1mindex 262822a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/README[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-This is an Nginx fork that adds dtrace USDT probes.[m
[31m-[m
[31m-Installation:[m
[31m-[m
[31m-    ./configure --with-dtrace-probes \[m
[31m-        --with-dtrace=/usr/sbin/dtrace \[m
[31m-        ...[m
[31m-    make[m
[31m-    make install[m
[31m-[m
[31m-Usage on Linux (with systemtap):[m
[31m-[m
[31m-    # make the stap-nginx script visiable in your PATH[m
[31m-    export PATH=/usr/local/nginx/sbin:$PATH[m
[31m-[m
[31m-    # list all the static probes available in your nginx[m
[31m-    stap-nginx -L 'process("nginx").mark("*")'[m
[31m-[m
[31m-    # run the test.stp file[m
[31m-    stap-nginx test.stp[m
[31m-[m
[31m-Sample test.stp file:[m
[31m-[m
[31m-    probe begin[m
[31m-    {[m
[31m-        print("Tracing.  Hit CTRL-C to stop.\n")[m
[31m-    }[m
[31m-[m
[31m-    probe process("nginx").mark("http-subrequest-start")[m
[31m-    {[m
[31m-        printf("uri: %s?%s\n", ngx_http_req_uri($arg1),[m
[31m-            ngx_http_req_args($arg1))[m
[31m-    }[m
[31m-[m
[31m-For now, only tested on Solaris 11 Express and Fedora Linux 17.[m
[31m-[m
[31m-The original Nginx documentation is available at http://nginx.org[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/acc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/acc[m
[1mdeleted file mode 100644[m
[1mindex 6baee67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/acc[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# aCC: HP ANSI C++ B3910B A.03.55.02[m
[31m-[m
[31m-# C89 mode[m
[31m-[m
[31m-CFLAGS="$CFLAGS -Ae"[m
[31m-CC_TEST_FLAGS="-Ae"[m
[31m-[m
[31m-PCRE_OPT="$PCRE_OPT -Ae"[m
[31m-ZLIB_OPT="$ZLIB_OPT -Ae"[m
[31m-MD5_OPT="$MD5_OPT -Ae"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/bcc[m
[1mdeleted file mode 100644[m
[1mindex ec82e60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/bcc[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Borland C++ 5.5[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-# maximize speed[m
[31m-CFLAGS="$CFLAGS -O2"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-5"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-6"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-# __stdcall[m
[31m-#CPU_OPT="$CPU_OPT -ps"[m
[31m-# __fastcall[m
[31m-#CPU_OPT="$CPU_OPT -pr"[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-# multithreaded[m
[31m-CFLAGS="$CFLAGS -tWM"[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -w!"[m
[31m-[m
[31m-# disable logo[m
[31m-CFLAGS="$CFLAGS -q"[m
[31m-[m
[31m-[m
[31m-# precompiled headers[m
[31m-CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.csm"[m
[31m-NGX_PCH="$NGX_OBJS/ngx_config.csm"[m
[31m-NGX_BUILD_PCH="-H=$NGX_OBJS/ngx_config.csm"[m
[31m-NGX_USE_PCH="-Hu -H=$NGX_OBJS/ngx_config.csm"[m
[31m-[m
[31m-[m
[31m-# Win32 GUI mode application[m
[31m-#LINK="\$(CC) -laa"[m
[31m-[m
[31m-[m
[31m-# the resource file[m
[31m-NGX_RES="$NGX_OBJS/nginx.res"[m
[31m-NGX_RCC="brcc32 -fo$NGX_OBJS/nginx.res \$(CORE_INCS) $NGX_WIN32_RC"[m
[31m-# the pragma allows to link the resource file using bcc32 and[m
[31m-# to avoid the direct ilink32 calling and the c0w32.obj's WinMain/main problem[m
[31m-NGX_PRAGMA="#pragma resource \"$NGX_OBJS/nginx.res\""[m
[31m-[m
[31m-[m
[31m-ngx_include_opt="-I"[m
[31m-ngx_objout="-o"[m
[31m-ngx_binout="-e"[m
[31m-ngx_objext="obj"[m
[31m-ngx_binext=".exe"[m
[31m-[m
[31m-ngx_long_start='@&&|[m
[31m-	'[m
[31m-ngx_long_end='|'[m
[31m-[m
[31m-ngx_regex_dirsep='\\'[m
[31m-ngx_dirsep="\\"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/ccc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/ccc[m
[1mdeleted file mode 100644[m
[1mindex c964045..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/ccc[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Compaq C V6.5-207[m
[31m-[m
[31m-ngx_include_opt="-I"[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_enable level6 -msg_fatal level6"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable unknownmacro"[m
[31m-CFLAGS="$CFLAGS -msg_disable unusedincl"[m
[31m-CFLAGS="$CFLAGS -msg_disable unnecincl"[m
[31m-CFLAGS="$CFLAGS -msg_disable nestincl"[m
[31m-CFLAGS="$CFLAGS -msg_disable strctpadding"[m
[31m-CFLAGS="$CFLAGS -msg_disable ansialiascast"[m
[31m-CFLAGS="$CFLAGS -msg_disable inlinestoclsmod"[m
[31m-CFLAGS="$CFLAGS -msg_disable cxxkeyword"[m
[31m-CFLAGS="$CFLAGS -msg_disable longlongsufx"[m
[31m-CFLAGS="$CFLAGS -msg_disable valuepres"[m
[31m-[m
[31m-# STUB[m
[31m-CFLAGS="$CFLAGS -msg_disable truncintcast"[m
[31m-CFLAGS="$CFLAGS -msg_disable trunclongcast"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable truncintasn"[m
[31m-CFLAGS="$CFLAGS -msg_disable trunclongint"[m
[31m-CFLAGS="$CFLAGS -msg_disable intconcastsgn"[m
[31m-CFLAGS="$CFLAGS -msg_disable intconstsign"[m
[31m-CFLAGS="$CFLAGS -msg_disable switchlong"[m
[31m-CFLAGS="$CFLAGS -msg_disable subscrbounds2"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable hexoctunsign"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable ignorecallval"[m
[31m-CFLAGS="$CFLAGS -msg_disable nonstandcast"[m
[31m-CFLAGS="$CFLAGS -msg_disable embedcomment"[m
[31m-CFLAGS="$CFLAGS -msg_disable unreachcode"[m
[31m-CFLAGS="$CFLAGS -msg_disable questcompare2"[m
[31m-CFLAGS="$CFLAGS -msg_disable unusedtop"[m
[31m-CFLAGS="$CFLAGS -msg_disable unrefdecl"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable bitnotint"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/clang b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/clang[m
[1mdeleted file mode 100644[m
[1mindex 22b22a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/clang[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# clang[m
[31m-[m
[31m-[m
[31m-NGX_CLANG_VER=`$CC -v 2>&1 | grep '\(clang\|LLVM\) version' 2>&1 \[m
[31m-                           | sed -e 's/^.* version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + clang version: $NGX_CLANG_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"clang $NGX_CLANG_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-CC_TEST_FLAGS="-pipe"[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-#NGX_CLANG_OPT="-O2"[m
[31m-#NGX_CLANG_OPT="-Oz"[m
[31m-NGX_CLANG_OPT="-O"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro | pentium3)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-march=pentiumpro"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-    athlon)[m
[31m-        # optimize for Athlon[m
[31m-        CPU_OPT="-march=athlon"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron[m
[31m-        CPU_OPT="-march=opteron"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS -pipe $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    PCRE_OPT="$PCRE_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    MD5_OPT="$MD5_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    ZLIB_OPT="$ZLIB_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS $NGX_CLANG_OPT -Wall -Wextra -Wpointer-arith"[m
[31m-CFLAGS="$CFLAGS -Wconditional-uninitialized"[m
[31m-#CFLAGS="$CFLAGS -Wmissing-prototypes"[m
[31m-[m
[31m-# we have a lot of unused function arguments[m
[31m-CFLAGS="$CFLAGS -Wno-unused-parameter"[m
[31m-[m
[31m-# deprecated system OpenSSL library on OS X[m
[31m-if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-    CFLAGS="$CFLAGS -Wno-deprecated-declarations"[m
[31m-fi[m
[31m-[m
[31m-# stop on warning[m
[31m-#CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[31m-[m
[31m-if [ ".$CPP" = "." ]; then[m
[31m-    CPP="$CC -E"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/clang.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/clang.orig[m
[1mdeleted file mode 100644[m
[1mindex 25707b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/clang.orig[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# clang[m
[31m-[m
[31m-[m
[31m-NGX_CLANG_VER=`$CC -v 2>&1 | grep '\(clang\|LLVM\) version' 2>&1 \[m
[31m-                           | sed -e 's/^.* version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + clang version: $NGX_CLANG_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"clang $NGX_CLANG_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-CC_TEST_FLAGS="-pipe"[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-#NGX_CLANG_OPT="-O2"[m
[31m-#NGX_CLANG_OPT="-Oz"[m
[31m-NGX_CLANG_OPT="-O"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro | pentium3)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-march=pentiumpro"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-    athlon)[m
[31m-        # optimize for Athlon[m
[31m-        CPU_OPT="-march=athlon"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron[m
[31m-        CPU_OPT="-march=opteron"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS -pipe $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    PCRE_OPT="$PCRE_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    MD5_OPT="$MD5_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    ZLIB_OPT="$ZLIB_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS $NGX_CLANG_OPT -Wall -Wextra -Wpointer-arith"[m
[31m-CFLAGS="$CFLAGS -Wconditional-uninitialized"[m
[31m-#CFLAGS="$CFLAGS -Wmissing-prototypes"[m
[31m-[m
[31m-# we have a lot of unused function arguments[m
[31m-CFLAGS="$CFLAGS -Wno-unused-parameter"[m
[31m-[m
[31m-# deprecated system OpenSSL library on OS X[m
[31m-if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-    CFLAGS="$CFLAGS -Wno-deprecated-declarations"[m
[31m-fi[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[31m-[m
[31m-if [ ".$CPP" = "." ]; then[m
[31m-    CPP="$CC -E"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/conf[m
[1mdeleted file mode 100644[m
[1mindex e7477c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/conf[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-LINK="\$(CC)"[m
[31m-[m
[31m-MAIN_LINK=[m
[31m-MODULE_LINK="-shared"[m
[31m-[m
[31m-ngx_include_opt="-I "[m
[31m-ngx_compile_opt="-c"[m
[31m-ngx_pic_opt="-fPIC"[m
[31m-ngx_objout="-o "[m
[31m-ngx_binout="-o "[m
[31m-ngx_objext="o"[m
[31m-ngx_binext=[m
[31m-ngx_modext=".so"[m
[31m-[m
[31m-ngx_long_start=[m
[31m-ngx_long_end=[m
[31m-[m
[31m-ngx_regex_dirsep="\/"[m
[31m-ngx_dirsep='/'[m
[31m-[m
[31m-ngx_regex_cont=' \\\[m
[31m-	'[m
[31m-ngx_cont=' \[m
[31m-	'[m
[31m-ngx_tab=' \[m
[31m-		'[m
[31m-ngx_spacer=[m
[31m-[m
[31m-ngx_long_regex_cont=$ngx_regex_cont[m
[31m-ngx_long_cont=$ngx_cont[m
[31m-[m
[31m-. auto/cc/name[m
[31m-[m
[31m-if test -n "$CFLAGS"; then[m
[31m-[m
[31m-    CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT"[m
[31m-[m
[31m-    case $NGX_CC_NAME in[m
[31m-[m
[31m-        ccc)[m
[31m-            # Compaq C V6.5-207[m
[31m-[m
[31m-            ngx_include_opt="-I"[m
[31m-        ;;[m
[31m-[m
[31m-        sunc)[m
[31m-[m
[31m-            MAIN_LINK=[m
[31m-            MODULE_LINK="-G"[m
[31m-[m
[31m-            case "$NGX_MACHINE" in[m
[31m-[m
[31m-                i86pc)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"[m
[31m-                ;;[m
[31m-[m
[31m-                sun4u | sun4v)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-[m
[31m-            case $CPU in[m
[31m-[m
[31m-                amd64)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    case $NGX_CC_NAME in[m
[31m-        gcc)[m
[31m-            # gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2[m
[31m-            #     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2[m
[31m-            #     4.0.0, 4.0.1, 4.1.0[m
[31m-[m
[31m-            . auto/cc/gcc[m
[31m-        ;;[m
[31m-[m
[31m-        clang)[m
[31m-            # Clang C compiler[m
[31m-[m
[31m-            . auto/cc/clang[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            # Intel C++ compiler 7.1, 8.0, 8.1[m
[31m-[m
[31m-            . auto/cc/icc[m
[31m-        ;;[m
[31m-[m
[31m-        sunc)[m
[31m-            # Sun C 5.7 Patch 117837-04 2005/05/11[m
[31m-[m
[31m-            . auto/cc/sunc[m
[31m-        ;;[m
[31m-[m
[31m-        ccc)[m
[31m-            # Compaq C V6.5-207[m
[31m-[m
[31m-            . auto/cc/ccc[m
[31m-        ;;[m
[31m-[m
[31m-        acc)[m
[31m-            # aCC: HP ANSI C++ B3910B A.03.55.02[m
[31m-[m
[31m-            . auto/cc/acc[m
[31m-        ;;[m
[31m-[m
[31m-        msvc*)[m
[31m-            # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003[m
[31m-[m
[31m-            . auto/cc/msvc[m
[31m-        ;;[m
[31m-[m
[31m-        owc)[m
[31m-            # Open Watcom C 1.0, 1.2[m
[31m-[m
[31m-            . auto/cc/owc[m
[31m-        ;;[m
[31m-[m
[31m-        bcc)[m
[31m-            # Borland C++ 5.5[m
[31m-[m
[31m-            . auto/cc/bcc[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-    CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT"[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS $NGX_CC_OPT"[m
[31m-NGX_TEST_LD_OPT="$NGX_LD_OPT"[m
[31m-[m
[31m-if [ 1 ]; then[m
[31m-[m
[31m-    if test -n "$NGX_LD_OPT"; then[m
[31m-        ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\"[m
[31m-        ngx_feature_name=[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs=[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test=[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\"[m
[31m-            echo[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="-Wl,-E switch"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=-Wl,-E[m
[31m-    ngx_feature_test=[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        MAIN_LINK="-Wl,-E"[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc builtin atomic operations"[m
[31m-    ngx_feature_name=NGX_HAVE_GCC_ATOMIC[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="long  n = 0;[m
[31m-                      if (!__sync_bool_compare_and_swap(&n, 0, 1))[m
[31m-                          return 1;[m
[31m-                      if (__sync_fetch_and_add(&n, 1) != 1)[m
[31m-                          return 1;[m
[31m-                      if (n != 2)[m
[31m-                          return 1;[m
[31m-                      __sync_synchronize();"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-    if [ "$NGX_CC_NAME" = "ccc" ]; then[m
[31m-        echo "checking for C99 variadic macros ... disabled"[m
[31m-    else[m
[31m-        ngx_feature="C99 variadic macros"[m
[31m-        ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS"[m
[31m-        ngx_feature_run=yes[m
[31m-        ngx_feature_incs="#include <stdio.h>[m
[31m-#define var(dummy, ...)  sprintf(__VA_ARGS__)"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="char  buf[30]; buf[0] = '0';[m
[31m-                          var(0, buf, \"%d\", 1);[m
[31m-                          if (buf[0] != '1') return 1"[m
[31m-        . auto/feature[m
[31m-     fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc variadic macros"[m
[31m-    ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS"[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs="#include <stdio.h>[m
[31m-#define var(dummy, args...)  sprintf(args)"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="char  buf[30]; buf[0] = '0';[m
[31m-                      var(0, buf, \"%d\", 1);[m
[31m-                      if (buf[0] != '1') return 1"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc builtin 64 bit byteswap"[m
[31m-    ngx_feature_name="NGX_HAVE_GCC_BSWAP64"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="__builtin_bswap64(0)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-#    ngx_feature="inline"[m
[31m-#    ngx_feature_name=[m
[31m-#    ngx_feature_run=no[m
[31m-#    ngx_feature_incs="int inline f(void) { return 1 }"[m
[31m-#    ngx_feature_path=[m
[31m-#    ngx_feature_libs=[m
[31m-#    ngx_feature_test=[m
[31m-#    . auto/feature[m
[31m-#[m
[31m-#    if [ $ngx_found = yes ]; then[m
[31m-#    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/conf.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/conf.orig[m
[1mdeleted file mode 100644[m
[1mindex f2c25ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/conf.orig[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-LINK="\$(CC)"[m
[31m-[m
[31m-MAIN_LINK=[m
[31m-MODULE_LINK="-shared"[m
[31m-[m
[31m-ngx_include_opt="-I "[m
[31m-ngx_compile_opt="-c"[m
[31m-ngx_pic_opt="-fPIC"[m
[31m-ngx_objout="-o "[m
[31m-ngx_binout="-o "[m
[31m-ngx_objext="o"[m
[31m-ngx_binext=[m
[31m-ngx_modext=".so"[m
[31m-[m
[31m-ngx_long_start=[m
[31m-ngx_long_end=[m
[31m-[m
[31m-ngx_regex_dirsep="\/"[m
[31m-ngx_dirsep='/'[m
[31m-[m
[31m-ngx_regex_cont=' \\\[m
[31m-	'[m
[31m-ngx_cont=' \[m
[31m-	'[m
[31m-ngx_tab=' \[m
[31m-		'[m
[31m-ngx_spacer=[m
[31m-[m
[31m-ngx_long_regex_cont=$ngx_regex_cont[m
[31m-ngx_long_cont=$ngx_cont[m
[31m-[m
[31m-. auto/cc/name[m
[31m-[m
[31m-if test -n "$CFLAGS"; then[m
[31m-[m
[31m-    CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT"[m
[31m-[m
[31m-    case $NGX_CC_NAME in[m
[31m-[m
[31m-        ccc)[m
[31m-            # Compaq C V6.5-207[m
[31m-[m
[31m-            ngx_include_opt="-I"[m
[31m-        ;;[m
[31m-[m
[31m-        sunc)[m
[31m-[m
[31m-            MAIN_LINK=[m
[31m-            MODULE_LINK="-G"[m
[31m-[m
[31m-            case "$NGX_MACHINE" in[m
[31m-[m
[31m-                i86pc)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"[m
[31m-                ;;[m
[31m-[m
[31m-                sun4u | sun4v)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-[m
[31m-            case $CPU in[m
[31m-[m
[31m-                amd64)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    case $NGX_CC_NAME in[m
[31m-        gcc)[m
[31m-            # gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2[m
[31m-            #     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2[m
[31m-            #     4.0.0, 4.0.1, 4.1.0[m
[31m-[m
[31m-            . auto/cc/gcc[m
[31m-        ;;[m
[31m-[m
[31m-        clang)[m
[31m-            # Clang C compiler[m
[31m-[m
[31m-            . auto/cc/clang[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            # Intel C++ compiler 7.1, 8.0, 8.1[m
[31m-[m
[31m-            . auto/cc/icc[m
[31m-        ;;[m
[31m-[m
[31m-        sunc)[m
[31m-            # Sun C 5.7 Patch 117837-04 2005/05/11[m
[31m-[m
[31m-            . auto/cc/sunc[m
[31m-        ;;[m
[31m-[m
[31m-        ccc)[m
[31m-            # Compaq C V6.5-207[m
[31m-[m
[31m-            . auto/cc/ccc[m
[31m-        ;;[m
[31m-[m
[31m-        acc)[m
[31m-            # aCC: HP ANSI C++ B3910B A.03.55.02[m
[31m-[m
[31m-            . auto/cc/acc[m
[31m-        ;;[m
[31m-[m
[31m-        msvc*)[m
[31m-            # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003[m
[31m-[m
[31m-            . auto/cc/msvc[m
[31m-        ;;[m
[31m-[m
[31m-        owc)[m
[31m-            # Open Watcom C 1.0, 1.2[m
[31m-[m
[31m-            . auto/cc/owc[m
[31m-        ;;[m
[31m-[m
[31m-        bcc)[m
[31m-            # Borland C++ 5.5[m
[31m-[m
[31m-            . auto/cc/bcc[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-    CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT"[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS $NGX_CC_OPT"[m
[31m-NGX_TEST_LD_OPT="$NGX_LD_OPT"[m
[31m-[m
[31m-if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-    if test -n "$NGX_LD_OPT"; then[m
[31m-        ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\"[m
[31m-        ngx_feature_name=[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs=[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test=[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\"[m
[31m-            echo[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="-Wl,-E switch"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=-Wl,-E[m
[31m-    ngx_feature_test=[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        MAIN_LINK="-Wl,-E"[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc builtin atomic operations"[m
[31m-    ngx_feature_name=NGX_HAVE_GCC_ATOMIC[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="long  n = 0;[m
[31m-                      if (!__sync_bool_compare_and_swap(&n, 0, 1))[m
[31m-                          return 1;[m
[31m-                      if (__sync_fetch_and_add(&n, 1) != 1)[m
[31m-                          return 1;[m
[31m-                      if (n != 2)[m
[31m-                          return 1;[m
[31m-                      __sync_synchronize();"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-    if [ "$NGX_CC_NAME" = "ccc" ]; then[m
[31m-        echo "checking for C99 variadic macros ... disabled"[m
[31m-    else[m
[31m-        ngx_feature="C99 variadic macros"[m
[31m-        ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS"[m
[31m-        ngx_feature_run=yes[m
[31m-        ngx_feature_incs="#include <stdio.h>[m
[31m-#define var(dummy, ...)  sprintf(__VA_ARGS__)"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="char  buf[30]; buf[0] = '0';[m
[31m-                          var(0, buf, \"%d\", 1);[m
[31m-                          if (buf[0] != '1') return 1"[m
[31m-        . auto/feature[m
[31m-     fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc variadic macros"[m
[31m-    ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS"[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs="#include <stdio.h>[m
[31m-#define var(dummy, args...)  sprintf(args)"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="char  buf[30]; buf[0] = '0';[m
[31m-                      var(0, buf, \"%d\", 1);[m
[31m-                      if (buf[0] != '1') return 1"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc builtin 64 bit byteswap"[m
[31m-    ngx_feature_name="NGX_HAVE_GCC_BSWAP64"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="__builtin_bswap64(0)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-#    ngx_feature="inline"[m
[31m-#    ngx_feature_name=[m
[31m-#    ngx_feature_run=no[m
[31m-#    ngx_feature_incs="int inline f(void) { return 1 }"[m
[31m-#    ngx_feature_path=[m
[31m-#    ngx_feature_libs=[m
[31m-#    ngx_feature_test=[m
[31m-#    . auto/feature[m
[31m-#[m
[31m-#    if [ $ngx_found = yes ]; then[m
[31m-#    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/gcc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/gcc[m
[1mdeleted file mode 100644[m
[1mindex 3aae5f7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/gcc[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2[m
[31m-#     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2[m
[31m-#     4.0.0, 4.0.1, 4.1.0[m
[31m-[m
[31m-[m
[31m-NGX_GCC_VER=`$CC -v 2>&1 | grep 'gcc version' 2>&1 \[m
[31m-                         | sed -e 's/^.* version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + gcc version: $NGX_GCC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"gcc $NGX_GCC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-# Solaris 7's /usr/ccs/bin/as does not support "-pipe"[m
[31m-[m
[31m-CC_TEST_FLAGS="-pipe"[m
[31m-[m
[31m-ngx_feature="gcc -pipe switch"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test=[m
[31m-. auto/feature[m
[31m-[m
[31m-CC_TEST_FLAGS=[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    PIPE="-pipe"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case "$NGX_MACHINE" in[m
[31m-[m
[31m-    sun4u | sun4v | sparc | sparc64 )[m
[31m-        # "-mcpu=v9" enables the "casa" assembler instruction[m
[31m-        CFLAGS="$CFLAGS -mcpu=v9"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-#NGX_GCC_OPT="-O2"[m
[31m-#NGX_GCC_OPT="-Os"[m
[31m-NGX_GCC_OPT="-O"[m
[31m-[m
[31m-#CFLAGS="$CFLAGS -fomit-frame-pointer"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro | pentium3)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-march=pentiumpro"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4, gcc 3.x[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-    athlon)[m
[31m-        # optimize for Athlon, gcc 3.x[m
[31m-        CPU_OPT="-march=athlon"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron, gcc 3.x[m
[31m-        CPU_OPT="-march=opteron"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc32)[m
[31m-        # build 32-bit UltraSparc binary[m
[31m-        CPU_OPT="-m32"[m
[31m-        CORE_LINK="$CORE_LINK -m32"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc64)[m
[31m-        # build 64-bit UltraSparc binary[m
[31m-        CPU_OPT="-m64"[m
[31m-        CORE_LINK="$CORE_LINK -m64"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    ppc64)[m
[31m-        # build 64-bit PowerPC binary[m
[31m-        CPU_OPT="-m64"[m
[31m-        CPU_OPT="$CPU_OPT -falign-functions=32 -falign-labels=32"[m
[31m-        CPU_OPT="$CPU_OPT -falign-loops=32 -falign-jumps=32"[m
[31m-        CORE_LINK="$CORE_LINK -m64"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"[m
[31m-[m
[31m-case "$NGX_GCC_VER" in[m
[31m-    2.7*)[m
[31m-        # batch build[m
[31m-        CPU_OPT=[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS $PIPE $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    PCRE_OPT="$PCRE_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    MD5_OPT="$MD5_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    ZLIB_OPT="$ZLIB_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-# -W requires at least -O[m
[31m-CFLAGS="$CFLAGS ${NGX_GCC_OPT:--O} -W"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -Wall -Wpointer-arith"[m
[31m-#CFLAGS="$CFLAGS -Wconversion"[m
[31m-#CFLAGS="$CFLAGS -Winline"[m
[31m-#CFLAGS="$CFLAGS -Wmissing-prototypes"[m
[31m-[m
[31m-[m
[31m-case "$NGX_GCC_VER" in[m
[31m-    [3-5].*)[m
[31m-        # we have a lot of the unused function arguments[m
[31m-        CFLAGS="$CFLAGS -Wno-unused-parameter"[m
[31m-        # 4.2.1 shows the warning in wrong places[m
[31m-        #CFLAGS="$CFLAGS -Wunreachable-code"[m
[31m-[m
[31m-        # deprecated system OpenSSL library on OS X[m
[31m-        if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-            CFLAGS="$CFLAGS -Wno-deprecated-declarations"[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        # we have a lot of the unused function arguments[m
[31m-        CFLAGS="$CFLAGS -Wno-unused"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-# stop on warning[m
[31m-#CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[31m-[m
[31m-# DragonFly's gcc3 generates DWARF[m
[31m-#CFLAGS="$CFLAGS -g -gstabs"[m
[31m-[m
[31m-if [ ".$CPP" = "." ]; then[m
[31m-    CPP="$CC -E"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/gcc.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/gcc.orig[m
[1mdeleted file mode 100644[m
[1mindex c9101fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/gcc.orig[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2[m
[31m-#     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2[m
[31m-#     4.0.0, 4.0.1, 4.1.0[m
[31m-[m
[31m-[m
[31m-NGX_GCC_VER=`$CC -v 2>&1 | grep 'gcc version' 2>&1 \[m
[31m-                         | sed -e 's/^.* version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + gcc version: $NGX_GCC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"gcc $NGX_GCC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-# Solaris 7's /usr/ccs/bin/as does not support "-pipe"[m
[31m-[m
[31m-CC_TEST_FLAGS="-pipe"[m
[31m-[m
[31m-ngx_feature="gcc -pipe switch"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test=[m
[31m-. auto/feature[m
[31m-[m
[31m-CC_TEST_FLAGS=[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    PIPE="-pipe"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case "$NGX_MACHINE" in[m
[31m-[m
[31m-    sun4u | sun4v | sparc | sparc64 )[m
[31m-        # "-mcpu=v9" enables the "casa" assembler instruction[m
[31m-        CFLAGS="$CFLAGS -mcpu=v9"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-#NGX_GCC_OPT="-O2"[m
[31m-#NGX_GCC_OPT="-Os"[m
[31m-NGX_GCC_OPT="-O"[m
[31m-[m
[31m-#CFLAGS="$CFLAGS -fomit-frame-pointer"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro | pentium3)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-march=pentiumpro"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4, gcc 3.x[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-    athlon)[m
[31m-        # optimize for Athlon, gcc 3.x[m
[31m-        CPU_OPT="-march=athlon"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron, gcc 3.x[m
[31m-        CPU_OPT="-march=opteron"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc32)[m
[31m-        # build 32-bit UltraSparc binary[m
[31m-        CPU_OPT="-m32"[m
[31m-        CORE_LINK="$CORE_LINK -m32"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc64)[m
[31m-        # build 64-bit UltraSparc binary[m
[31m-        CPU_OPT="-m64"[m
[31m-        CORE_LINK="$CORE_LINK -m64"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    ppc64)[m
[31m-        # build 64-bit PowerPC binary[m
[31m-        CPU_OPT="-m64"[m
[31m-        CPU_OPT="$CPU_OPT -falign-functions=32 -falign-labels=32"[m
[31m-        CPU_OPT="$CPU_OPT -falign-loops=32 -falign-jumps=32"[m
[31m-        CORE_LINK="$CORE_LINK -m64"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"[m
[31m-[m
[31m-case "$NGX_GCC_VER" in[m
[31m-    2.7*)[m
[31m-        # batch build[m
[31m-        CPU_OPT=[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS $PIPE $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    PCRE_OPT="$PCRE_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    MD5_OPT="$MD5_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    ZLIB_OPT="$ZLIB_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-# -W requires at least -O[m
[31m-CFLAGS="$CFLAGS ${NGX_GCC_OPT:--O} -W"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -Wall -Wpointer-arith"[m
[31m-#CFLAGS="$CFLAGS -Wconversion"[m
[31m-#CFLAGS="$CFLAGS -Winline"[m
[31m-#CFLAGS="$CFLAGS -Wmissing-prototypes"[m
[31m-[m
[31m-[m
[31m-case "$NGX_GCC_VER" in[m
[31m-    [3-5].*)[m
[31m-        # we have a lot of the unused function arguments[m
[31m-        CFLAGS="$CFLAGS -Wno-unused-parameter"[m
[31m-        # 4.2.1 shows the warning in wrong places[m
[31m-        #CFLAGS="$CFLAGS -Wunreachable-code"[m
[31m-[m
[31m-        # deprecated system OpenSSL library on OS X[m
[31m-        if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-            CFLAGS="$CFLAGS -Wno-deprecated-declarations"[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        # we have a lot of the unused function arguments[m
[31m-        CFLAGS="$CFLAGS -Wno-unused"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[31m-[m
[31m-# DragonFly's gcc3 generates DWARF[m
[31m-#CFLAGS="$CFLAGS -g -gstabs"[m
[31m-[m
[31m-if [ ".$CPP" = "." ]; then[m
[31m-    CPP="$CC -E"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/icc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/icc[m
[1mdeleted file mode 100644[m
[1mindex 41eec08..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/icc[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Intel C++ compiler 7.1, 8.0, 8.1, 9.0, 11.1[m
[31m-[m
[31m-NGX_ICC_VER=`$CC -V 2>&1 | grep 'Version' 2>&1 \[m
[31m-                         | sed -e 's/^.* Version \([^ ]*\) *Build.*$/\1/'`[m
[31m-[m
[31m-echo " + icc version: $NGX_ICC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"Intel C Compiler $NGX_ICC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-CFLAGS="$CFLAGS -O"[m
[31m-[m
[31m-CORE_LINK="$CORE_LINK -opt_report_file=$NGX_OBJS/opt_report_file"[m
[31m-[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-mcpu=pentiumpro -march=pentiumpro"[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4, default[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS -w2"[m
[31m-[m
[31m-# disable some warnings[m
[31m-[m
[31m-# invalid type conversion: "int" to "char *"[m
[31m-CFLAGS="$CFLAGS -wd171"[m
[31m-# argument is incompatible with corresponding format string conversion[m
[31m-CFLAGS="$CFLAGS -wd181"[m
[31m-# zero used for undefined preprocessing identifier[m
[31m-CFLAGS="$CFLAGS -wd193"[m
[31m-# the format string ends before this argument[m
[31m-CFLAGS="$CFLAGS -wd268"[m
[31m-# invalid format string conversion[m
[31m-CFLAGS="$CFLAGS -wd269"[m
[31m-# conversion from "long long" to "size_t" may lose significant bits[m
[31m-CFLAGS="$CFLAGS -wd810"[m
[31m-# parameter was never referenced[m
[31m-CFLAGS="$CFLAGS -wd869"[m
[31m-# attribute "unused" is only allowed in a function definition, warning on pTHX_[m
[31m-CFLAGS="$CFLAGS -wd1301"[m
[31m-[m
[31m-# STUB[m
[31m-# enumerated type mixed with another type[m
[31m-CFLAGS="$CFLAGS -wd188"[m
[31m-# controlling expression is constant[m
[31m-CFLAGS="$CFLAGS -wd279"[m
[31m-# operands are evaluated in unspecified order[m
[31m-CFLAGS="$CFLAGS -wd981"[m
[31m-# external definition with no prior declaration[m
[31m-CFLAGS="$CFLAGS -wd1418"[m
[31m-# external declaration in primary source file[m
[31m-CFLAGS="$CFLAGS -wd1419"[m
[31m-[m
[31m-case "$NGX_ICC_VER" in[m
[31m-    9.*)[m
[31m-        # "cc" clobber ignored, warnings for Linux's htonl()/htons()[m
[31m-        CFLAGS="$CFLAGS -wd1469"[m
[31m-        # explicit conversion of a 64-bit integral type to a smaller[m
[31m-        # integral type[m
[31m-        CFLAGS="$CFLAGS -wd1683"[m
[31m-        # conversion from pointer to same-sized integral type,[m
[31m-        # warning on offsetof()[m
[31m-        CFLAGS="$CFLAGS -wd1684"[m
[31m-        # floating-point equality and inequality comparisons are unreliable,[m
[31m-        # warning on SvTRUE()[m
[31m-        CFLAGS="$CFLAGS -wd1572"[m
[31m-    ;;[m
[31m-[m
[31m-    8.*)[m
[31m-        # "cc" clobber ignored, warnings for Linux's htonl()/htons()[m
[31m-        CFLAGS="$CFLAGS -wd1469"[m
[31m-        # floating-point equality and inequality comparisons are unreliable,[m
[31m-        # warning on SvTRUE()[m
[31m-        CFLAGS="$CFLAGS -wd1572"[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-# stop on warning[m
[31m-#CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/msvc[m
[1mdeleted file mode 100644[m
[1mindex 4eef101..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/msvc[m
[1m+++ /dev/null[m
[36m@@ -1,157 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# MSVC 6.0 SP2                            cl 12.00[m
[31m-# MSVC Toolkit 2003 (7.1)                 cl 13.10[m
[31m-# MSVC 2005 Express Edition SP1 (8.0)     cl 14.00[m
[31m-# MSVC 2008 Express Edition (9.0)         cl 15.00[m
[31m-# MSVC 2010 (10.0)                        cl 16.00[m
[31m-# MSVC 2015 (14.0)                        cl 19.00[m
[31m-[m
[31m-[m
[31m-NGX_MSVC_VER=`$NGX_WINE $CC 2>&1 | grep 'Compiler Version' 2>&1 \[m
[31m-                                 | sed -e 's/^.* Version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + cl version: $NGX_MSVC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"cl $NGX_MSVC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-ngx_msvc_ver=`echo $NGX_MSVC_VER | sed -e 's/^\([0-9]*\).*/\1/'`[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-# maximize speed, equivalent to -Og -Oi -Ot -Oy -Ob2 -Gs -GF -Gy[m
[31m-CFLAGS="$CFLAGS -O2"[m
[31m-[m
[31m-# enable global optimization[m
[31m-#CFLAGS="$CFLAGS -Og"[m
[31m-# enable intrinsic functions[m
[31m-#CFLAGS="$CFLAGS -Oi"[m
[31m-[m
[31m-# disable inline expansion[m
[31m-#CFLAGS="$CFLAGS -Ob0"[m
[31m-# explicit inline expansion[m
[31m-#CFLAGS="$CFLAGS -Ob1"[m
[31m-# explicit and implicit inline expansion[m
[31m-#CFLAGS="$CFLAGS -Ob2"[m
[31m-[m
[31m-# enable frame pointer omission[m
[31m-#CFLAGS="$CFLAGS -Oy"[m
[31m-# disable stack checking calls[m
[31m-#CFLAGS="$CFLAGS -Gs"[m
[31m-[m
[31m-# pools strings as read/write[m
[31m-#CFLAGS="$CFLAGS -Gf"[m
[31m-# pools strings as read-only[m
[31m-#CFLAGS="$CFLAGS -GF"[m
[31m-[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-G5"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-G6"[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4, MSVC 7[m
[31m-        CPU_OPT="-G7"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-# __cdecl, default, must be used with OpenSSL, md5 asm, and sha1 asm[m
[31m-#CPU_OPT="$CPU_OPT -Gd"[m
[31m-# __stdcall[m
[31m-#CPU_OPT="$CPU_OPT -Gz"[m
[31m-# __fastcall[m
[31m-#CPU_OPT="$CPU_OPT -Gr"[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS -W4"[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -WX"[m
[31m-[m
[31m-# disable logo[m
[31m-CFLAGS="$CFLAGS -nologo"[m
[31m-[m
[31m-# the link flags[m
[31m-CORE_LINK="$CORE_LINK -link -verbose:lib"[m
[31m-[m
[31m-# link with libcmt.lib, multithreaded[m
[31m-LIBC="-MT"[m
[31m-# link with msvcrt.dll[m
[31m-# however, MSVC Toolkit 2003 has no MSVCRT.LIB[m
[31m-#LIBC="-MD"[m
[31m-[m
[31m-CFLAGS="$CFLAGS $LIBC"[m
[31m-[m
[31m-CORE_LIBS="$CORE_LIBS kernel32.lib user32.lib"[m
[31m-[m
[31m-# Win32 GUI mode application[m
[31m-#CORE_LINK="$CORE_LINK -subsystem:windows -entry:mainCRTStartup"[m
[31m-[m
[31m-# debug[m
[31m-# msvc under Wine issues[m
[31m-# C1902: Program database manager mismatch; please check your installation[m
[31m-if [ -z "$NGX_WINE" ]; then[m
[31m-   CFLAGS="$CFLAGS -Zi"[m
[31m-   CORE_LINK="$CORE_LINK -debug"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# MSVC 2005 supports C99 variadic macros[m
[31m-if [ "$ngx_msvc_ver" -ge 14 ]; then[m
[31m-    have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# precompiled headers[m
[31m-CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch"[m
[31m-CORE_LINK="$CORE_LINK $NGX_OBJS/ngx_pch.obj"[m
[31m-NGX_PCH="$NGX_OBJS/ngx_config.pch"[m
[31m-NGX_BUILD_PCH="-Ycngx_config.h -Fp$NGX_OBJS/ngx_config.pch"[m
[31m-NGX_USE_PCH="-Yungx_config.h -Fp$NGX_OBJS/ngx_config.pch"[m
[31m-[m
[31m-[m
[31m-# the resource file[m
[31m-NGX_RES="$NGX_OBJS/nginx.res"[m
[31m-NGX_RCC="rc -fo$NGX_RES \$(CORE_INCS) $NGX_WIN32_RC"[m
[31m-CORE_LINK="$NGX_RES $CORE_LINK"[m
[31m-[m
[31m-[m
[31m-# dynamic modules[m
[31m-#MAIN_LINK="-link -def:$NGX_OBJS/nginx.def"[m
[31m-#MODULE_LINK="-LD $NGX_OBJS/nginx.lib"[m
[31m-[m
[31m-[m
[31m-ngx_pic_opt=[m
[31m-ngx_objout="-Fo"[m
[31m-ngx_binout="-Fe"[m
[31m-ngx_objext="obj"[m
[31m-ngx_binext=".exe"[m
[31m-[m
[31m-ngx_long_start='@<<[m
[31m-	'[m
[31m-ngx_long_end='<<'[m
[31m-ngx_long_regex_cont=' \[m
[31m-	'[m
[31m-ngx_long_cont='[m
[31m-	'[m
[31m-[m
[31m-# MSVC understand / in path[m
[31m-#ngx_regex_dirsep='\\'[m
[31m-#ngx_dirsep="\\"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/name b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/name[m
[1mdeleted file mode 100644[m
[1mindex 35d319e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/name[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-    ngx_feature="C compiler"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test=[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        echo[m
[31m-        echo $0: error: C compiler $CC is not found[m
[31m-        echo[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ "$CC" = cl ]; then[m
[31m-    NGX_CC_NAME=msvc[m
[31m-    echo " + using Microsoft Visual C++ compiler"[m
[31m-[m
[31m-elif [ "$CC" = wcl386 ]; then[m
[31m-    NGX_CC_NAME=owc[m
[31m-    echo " + using Open Watcom C compiler"[m
[31m-[m
[31m-elif [ "$CC" = bcc32 ]; then[m
[31m-    NGX_CC_NAME=bcc[m
[31m-    echo " + using Borland C++ compiler"[m
[31m-[m
[31m-elif `$CC -V 2>&1 | grep '^Intel(R) C' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=icc[m
[31m-    echo " + using Intel C++ compiler"[m
[31m-[m
[31m-elif `$CC -v 2>&1 | grep 'gcc version' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=gcc[m
[31m-    echo " + using GNU C compiler"[m
[31m-[m
[31m-elif `$CC -v 2>&1 | grep '\(clang\|LLVM\) version' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=clang[m
[31m-    echo " + using Clang C compiler"[m
[31m-[m
[31m-elif `$CC -V 2>&1 | grep 'Sun C' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=sunc[m
[31m-    echo " + using Sun C compiler"[m
[31m-[m
[31m-elif `$CC -V 2>&1 | grep '^Compaq C' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=ccc[m
[31m-    echo " + using Compaq C compiler"[m
[31m-[m
[31m-elif `$CC -V 2>&1 | grep '^aCC: ' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=acc[m
[31m-    echo " + using HP aC++ compiler"[m
[31m-[m
[31m-else[m
[31m-    NGX_CC_NAME=unknown[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/owc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/owc[m
[1mdeleted file mode 100644[m
[1mindex a063aa3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/owc[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Open Watcom C 1.0, 1.2, 1.3[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-# maximize speed[m
[31m-CFLAGS="$CFLAGS -ot"[m
[31m-# reorder instructions for best pipeline usage[m
[31m-CFLAGS="$CFLAGS -op"[m
[31m-# inline intrinsic functions[m
[31m-CFLAGS="$CFLAGS -oi"[m
[31m-# inline expansion[m
[31m-CFLAGS="$CFLAGS -oe"[m
[31m-# disable stack checking calls[m
[31m-CFLAGS="$CFLAGS -s"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        # register-based arguments passing conventions[m
[31m-        CPU_OPT="-5r"[m
[31m-        # stack-based arguments passing conventions[m
[31m-        #CPU_OPT="-5s"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        # register-based arguments passing conventions[m
[31m-        CPU_OPT="-6r"[m
[31m-        # stack-based arguments passing conventions[m
[31m-        #CPU_OPT="-6s"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-# maximum level[m
[31m-CFLAGS="$CFLAGS -wx"[m
[31m-#CFLAGS="$CFLAGS -w3"[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -we"[m
[31m-[m
[31m-# built target is NT[m
[31m-CFLAGS="$CFLAGS -bt=nt"[m
[31m-[m
[31m-# multithreaded[m
[31m-CFLAGS="$CFLAGS -bm"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -d2"[m
[31m-[m
[31m-# quiet[m
[31m-CFLAGS="$CFLAGS -zq"[m
[31m-[m
[31m-# Open Watcom C 1.2[m
[31m-have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have[m
[31m-[m
[31m-[m
[31m-# the precompiled headers[m
[31m-#CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch"[m
[31m-#NGX_PCH="$NGX_OBJS/ngx_config.pch"[m
[31m-#NGX_BUILD_PCH="-fhq=$NGX_OBJS/ngx_config.pch"[m
[31m-#NGX_USE_PCH="-fh=$NGX_OBJS/ngx_config.pch"[m
[31m-[m
[31m-[m
[31m-# the link flags, built target is NT GUI mode application[m
[31m-#CORE_LINK="$CORE_LINK -l=nt_win"[m
[31m-[m
[31m-[m
[31m-# the resource file[m
[31m-NGX_RCC="wrc \$(CORE_INCS) -fo=$NGX_OBJS/nginx.res "[m
[31m-NGX_RCC="$NGX_RCC $NGX_WIN32_RC $NGX_OBJS/nginx.exe"[m
[31m-[m
[31m-[m
[31m-ngx_include_opt="-i="[m
[31m-ngx_objout="-fo"[m
[31m-ngx_binout="-fe="[m
[31m-ngx_objext="obj"[m
[31m-ngx_binext=".exe"[m
[31m-[m
[31m-ngx_regex_dirsep='\\'[m
[31m-ngx_dirsep="\\"[m
[31m-[m
[31m-ngx_long_start=' '[m
[31m-ngx_long_end=' '[m
[31m-ngx_long_regex_cont=' \&\[m
[31m-	'[m
[31m-ngx_long_cont=' &[m
[31m-	'[m
[31m-[m
[31m-ngx_regex_cont=' \&\[m
[31m-	'[m
[31m-ngx_cont=' &[m
[31m-	'[m
[31m-ngx_tab=' &[m
[31m-		'[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/sunc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/sunc[m
[1mdeleted file mode 100644[m
[1mindex 8360c49..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/cc/sunc[m
[1m+++ /dev/null[m
[36m@@ -1,161 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Sun C 5.7 Patch 117837-04 2005/05/11    Sun Studio 10[m
[31m-# Sun C 5.8 2005/10/13                    Sun Studio 11[m
[31m-# Sun C 5.9 SunOS_i386 2007/05/03         Sun Studio 12[m
[31m-# Sun C 5.9 SunOS_sparc 2007/05/03[m
[31m-# Sun C 5.10 SunOS_i386 2009/06/03        Sun Studio 12.1[m
[31m-# Sun C 5.11 SunOS_i386 2010/08/13        Sun Studio 12.2[m
[31m-[m
[31m-NGX_SUNC_VER=`$CC -V 2>&1 | grep 'Sun C' 2>&1 \[m
[31m-                          | sed -e 's/^.* Sun C \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + Sun C version: $NGX_SUNC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"Sun C $NGX_SUNC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-int main() { printf("%d", __SUNPRO_C); }[m
[31m-[m
[31m-END[m
[31m-[m
[31m-eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    ngx_sunc_ver=`$NGX_AUTOTEST`[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-# 1424 == 0x590, Sun Studio 12[m
[31m-[m
[31m-if [ "$ngx_sunc_ver" -ge 1424 ]; then[m
[31m-    ngx_sparc32="-m32"[m
[31m-    ngx_sparc64="-m64"[m
[31m-    ngx_amd64="-m64"[m
[31m-[m
[31m-else[m
[31m-    ngx_sparc32="-xarch=v8plus"[m
[31m-    ngx_sparc64="-xarch=v9"[m
[31m-    ngx_amd64="-xarch=amd64"[m
[31m-fi[m
[31m-[m
[31m-case "$NGX_MACHINE" in[m
[31m-[m
[31m-    i86pc)[m
[31m-        NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"[m
[31m-    ;;[m
[31m-[m
[31m-    sun4u | sun4v)[m
[31m-        NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-MAIN_LINK=[m
[31m-MODULE_LINK="-G"[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-# 20736 == 0x5100, Sun Studio 12.1[m
[31m-[m
[31m-if [ "$ngx_sunc_ver" -ge 20736 ]; then[m
[31m-    ngx_fast="-fast"[m
[31m-[m
[31m-else[m
[31m-    # older versions had problems with bit-fields[m
[31m-    ngx_fast="-fast -xalias_level=any"[m
[31m-fi[m
[31m-[m
[31m-IPO=-xipo[m
[31m-CFLAGS="$CFLAGS $ngx_fast $IPO"[m
[31m-CORE_LINK="$CORE_LINK $ngx_fast $IPO"[m
[31m-[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-xchip=pentium"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II[m
[31m-        CPU_OPT="-xchip=pentium_pro"[m
[31m-    ;;[m
[31m-[m
[31m-    pentium3)[m
[31m-        # optimize for Pentium III[m
[31m-        CPU_OPT="-xchip=pentium3"[m
[31m-        #CPU_OPT="$CPU_OPT -xarch=sse"[m
[31m-        CPU_OPT="$CPU_OPT -xcache=16/32/4:256/32/4"[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4[m
[31m-        CPU_OPT="-xchip=pentium4"[m
[31m-        #CPU_OPT="$CPU_OPT -xarch=sse2"[m
[31m-        CPU_OPT="$CPU_OPT -xcache=8/64/4:256/128/8"[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron[m
[31m-        CPU_OPT="-xchip=opteron"[m
[31m-        #CPU_OPT="$CPU_OPT -xarch=sse2"[m
[31m-        CPU_OPT="$CPU_OPT -xcache=64/64/2:1024/64/16"[m
[31m-    ;;[m
[31m-[m
[31m-    sparc32)[m
[31m-        # build 32-bit UltraSparc binary[m
[31m-        CPU_OPT="$ngx_sparc32"[m
[31m-        CORE_LINK="$CORE_LINK $ngx_sparc32"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_sparc32"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc64)[m
[31m-        # build 64-bit UltraSparc binary[m
[31m-        CPU_OPT="$ngx_sparc64"[m
[31m-        CORE_LINK="$CORE_LINK $ngx_sparc64"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_sparc64"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    amd64)[m
[31m-        # build 64-bit amd64 binary[m
[31m-        CPU_OPT="$ngx_amd64"[m
[31m-        CORE_LINK="$CORE_LINK $ngx_amd64"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_amd64"[m
[31m-        NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="$ngx_fast $IPO $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="$ngx_fast $IPO $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="$ngx_fast $IPO $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -errwarn=%all"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/define b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/define[m
[1mdeleted file mode 100644[m
[1mindex b5a7622..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/define[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $have[m
[31m-#define $have  $value[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/endianness b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/endianness[m
[1mdeleted file mode 100644[m
[1mindex 70b0a10..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/endianness[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for system byte ordering ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for system byte ordering[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-int main() {[m
[31m-    int i = 0x11223344;[m
[31m-    char *p;[m
[31m-[m
[31m-    p = (char *) &i;[m
[31m-    if (*p == 0x44) return 0;[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \[m
[31m-          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"[m
[31m-[m
[31m-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    if $NGX_AUTOTEST >/dev/null 2>&1; then[m
[31m-        echo " little endian"[m
[31m-        have=NGX_HAVE_LITTLE_ENDIAN . auto/have[m
[31m-    else[m
[31m-        echo " big endian"[m
[31m-    fi[m
[31m-[m
[31m-    rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-else[m
[31m-    rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-    echo[m
[31m-    echo "$0: error: cannot detect system byte ordering"[m
[31m-    exit 1[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/feature b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/feature[m
[1mdeleted file mode 100644[m
[1mindex 1145f28..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/feature[m
[1m+++ /dev/null[m
[36m@@ -1,123 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_feature ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_feature[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_found=no[m
[31m-[m
[31m-if test -n "$ngx_feature_name"; then[m
[31m-    ngx_have_feature=`echo $ngx_feature_name \[m
[31m-                   | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`[m
[31m-fi[m
[31m-[m
[31m-if test -n "$ngx_feature_path"; then[m
[31m-    for ngx_temp in $ngx_feature_path; do[m
[31m-        ngx_feature_inc_path="$ngx_feature_inc_path -I $ngx_temp"[m
[31m-    done[m
[31m-fi[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-$NGX_INCLUDE_UNISTD_H[m
[31m-$ngx_feature_incs[m
[31m-[m
[31m-int main() {[m
[31m-    $ngx_feature_test;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \[m
[31m-          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_TEST_LD_OPT $ngx_feature_libs"[m
[31m-[m
[31m-ngx_feature_inc_path=[m
[31m-[m
[31m-eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-[m
[31m-    case "$ngx_feature_run" in[m
[31m-[m
[31m-        yes)[m
[31m-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages[m
[31m-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then[m
[31m-                echo " found"[m
[31m-                ngx_found=yes[m
[31m-[m
[31m-                if test -n "$ngx_feature_name"; then[m
[31m-                    have=$ngx_have_feature . auto/have[m
[31m-                fi[m
[31m-[m
[31m-            else[m
[31m-                echo " found but is not working"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        value)[m
[31m-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages[m
[31m-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then[m
[31m-                echo " found"[m
[31m-                ngx_found=yes[m
[31m-[m
[31m-                cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $ngx_feature_name[m
[31m-#define $ngx_feature_name  `$NGX_AUTOTEST`[m
[31m-#endif[m
[31m-[m
[31m-END[m
[31m-            else[m
[31m-                echo " found but is not working"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        bug)[m
[31m-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages[m
[31m-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then[m
[31m-                echo " not found"[m
[31m-[m
[31m-            else[m
[31m-                echo " found"[m
[31m-                ngx_found=yes[m
[31m-[m
[31m-                if test -n "$ngx_feature_name"; then[m
[31m-                    have=$ngx_have_feature . auto/have[m
[31m-                fi[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            echo " found"[m
[31m-            ngx_found=yes[m
[31m-[m
[31m-            if test -n "$ngx_feature_name"; then[m
[31m-                have=$ngx_have_feature . auto/have[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-    echo " not found"[m
[31m-[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    echo $ngx_test       >> $NGX_AUTOCONF_ERR[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/have b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/have[m
[1mdeleted file mode 100644[m
[1mindex f8e3751..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/have[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $have[m
[31m-#define $have  1[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/have_headers b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/have_headers[m
[1mdeleted file mode 100644[m
[1mindex a3a7543..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/have_headers[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_HEADERS_H[m
[31m-[m
[31m-#ifndef $have[m
[31m-#define $have  1[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/headers b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/headers[m
[1mdeleted file mode 100644[m
[1mindex 5a2e6b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/headers[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-ngx_include="unistd.h";      . auto/include[m
[31m-ngx_include="inttypes.h";    . auto/include[m
[31m-ngx_include="limits.h";      . auto/include[m
[31m-ngx_include="sys/filio.h";   . auto/include[m
[31m-ngx_include="sys/param.h";   . auto/include[m
[31m-ngx_include="sys/mount.h";   . auto/include[m
[31m-ngx_include="sys/statvfs.h"; . auto/include[m
[31m-ngx_include="crypt.h";       . auto/include[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/include b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/include[m
[1mdeleted file mode 100644[m
[1mindex e34dabd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/include[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_include ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_include[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_found=no[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-$NGX_INCLUDE_SYS_PARAM_H[m
[31m-#include <$ngx_include>[m
[31m-[m
[31m-int main() {[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c"[m
[31m-[m
[31m-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-[m
[31m-    ngx_found=yes[m
[31m-[m
[31m-    echo " found"[m
[31m-[m
[31m-    ngx_name=`echo $ngx_include \[m
[31m-              | tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__`[m
[31m-[m
[31m-[m
[31m-    have=NGX_HAVE_$ngx_name . auto/have_headers[m
[31m-[m
[31m-    eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"[m
[31m-[m
[31m-    #STUB[m
[31m-    eval "NGX_$ngx_name='#include <$ngx_include>'"[m
[31m-[m
[31m-else[m
[31m-    echo " not found"[m
[31m-[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    echo $ngx_test       >> $NGX_AUTOCONF_ERR[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/init b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/init[m
[1mdeleted file mode 100644[m
[1mindex 910f529..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/init[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-NGX_MAKEFILE=$NGX_OBJS/Makefile[m
[31m-NGX_MODULES_C=$NGX_OBJS/ngx_modules.c[m
[31m-[m
[31m-NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h[m
[31m-NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h[m
[31m-[m
[31m-NGX_AUTOTEST=$NGX_OBJS/autotest[m
[31m-NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err[m
[31m-[m
[31m-# STUBs[m
[31m-NGX_ERR=$NGX_OBJS/autoconf.err[m
[31m-MAKEFILE=$NGX_OBJS/Makefile[m
[31m-[m
[31m-[m
[31m-NGX_PCH=[m
[31m-NGX_USE_PCH=[m
[31m-[m
[31m-[m
[31m-# check the echo's "-n" option and "\c" capability[m
[31m-[m
[31m-if echo "test\c" | grep c >/dev/null; then[m
[31m-[m
[31m-    if echo -n test | grep n >/dev/null; then[m
[31m-        ngx_n=[m
[31m-        ngx_c=[m
[31m-[m
[31m-    else[m
[31m-        ngx_n=-n[m
[31m-        ngx_c=[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-    ngx_n=[m
[31m-    ngx_c='\c'[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# create Makefile[m
[31m-[m
[31m-cat << END > Makefile[m
[31m-[m
[31m-default:	build[m
[31m-[m
[31m-clean:[m
[31m-	rm -rf Makefile $NGX_OBJS[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/install b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/install[m
[1mdeleted file mode 100644[m
[1mindex c502767..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/install[m
[1m+++ /dev/null[m
[36m@@ -1,285 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $USE_PERL != NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-install_perl_modules:[m
[31m-	cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install[m
[31m-END[m
[31m-[m
[31m-    NGX_INSTALL_PERL_MODULES=install_perl_modules[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case ".$NGX_STAP_NGX_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    .)[m
[31m-        NGX_STAP_NGX_PATH=$NGX_PREFIX/sbin/stap-nginx[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_STAP_NGX_PATH=$NGX_PREFIX/$NGX_STAP_NGX_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_SBIN_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_SBIN_PATH=$NGX_PREFIX/$NGX_SBIN_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_MODULES_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_MODULES_PATH=$NGX_PREFIX/$NGX_MODULES_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-NGX_MODULES_PATH=`dirname $NGX_MODULES_PATH/.`[m
[31m-[m
[31m-[m
[31m-case ".$NGX_CONF_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_CONF_PATH=$NGX_PREFIX/$NGX_CONF_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`[m
[31m-[m
[31m-[m
[31m-case ".$NGX_PID_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_PID_PATH=$NGX_PREFIX/$NGX_PID_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_TAPSET_PREFIX" in[m
[31m-    ./* | .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_TAPSET_PREFIX=$NGX_PREFIX/$NGX_TAPSET_PREFIX[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_ERROR_LOG_PATH" in[m
[31m-    ./* | .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_ERROR_LOG_PATH=$NGX_PREFIX/$NGX_ERROR_LOG_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_HTTP_LOG_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_HTTP_LOG_PATH=$NGX_PREFIX/$NGX_HTTP_LOG_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if test -f man/nginx.8 ; then[m
[31m-    NGX_MAN=man/nginx.8[m
[31m-else[m
[31m-    NGX_MAN=docs/man/nginx.8[m
[31m-fi[m
[31m-[m
[31m-if test -d html ; then[m
[31m-    NGX_HTML=html[m
[31m-else[m
[31m-    NGX_HTML=docs/html[m
[31m-fi[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-manpage:	$NGX_OBJS/nginx.8[m
[31m-[m
[31m-$NGX_OBJS/nginx.8:	$NGX_MAN $NGX_AUTO_CONFIG_H[m
[31m-	sed -e "s|%%PREFIX%%|$NGX_PREFIX|" \\[m
[31m-		-e "s|%%PID_PATH%%|$NGX_PID_PATH|" \\[m
[31m-		-e "s|%%CONF_PATH%%|$NGX_CONF_PATH|" \\[m
[31m-		-e "s|%%ERROR_LOG_PATH%%|${NGX_ERROR_LOG_PATH:-stderr}|" \\[m
[31m-		< $NGX_MAN > \$@[m
[31m-[m
[31m-install:	build $NGX_INSTALL_PERL_MODULES[m
[31m-	test -d '\$(DESTDIR)$NGX_PREFIX' || mkdir -p '\$(DESTDIR)$NGX_PREFIX'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`'[m
[31m-	test ! -f '\$(DESTDIR)$NGX_SBIN_PATH' \\[m
[31m-		|| mv '\$(DESTDIR)$NGX_SBIN_PATH' \\[m
[31m-			'\$(DESTDIR)$NGX_SBIN_PATH.old'[m
[31m-	cp $NGX_OBJS/nginx '\$(DESTDIR)$NGX_SBIN_PATH'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_CONF_PREFIX' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-[m
[31m-	cp conf/koi-win '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/koi-utf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/win-utf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types' \\[m
[31m-		|| cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params' \\[m
[31m-		|| cp conf/fastcgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/fastcgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf' \\[m
[31m-		|| cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params' \\[m
[31m-		|| cp conf/uwsgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/uwsgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params' \\[m
[31m-		|| cp conf/scgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/scgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PATH' \\[m
[31m-		|| cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PATH'[m
[31m-	cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PREFIX/nginx.conf.default'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_PID_PATH"`'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_PREFIX/html' \\[m
[31m-		|| cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX'[m
[31m-END[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES -a $DTRACE_FROM_SYSTEMTAP = YES ]; then[m
[31m-[m
[31m-    ngx_tapset_srcs="$NGX_TAPSET_SRCS"[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-	test -d '\$(DESTDIR)$NGX_TAPSET_PREFIX' || \[m
[31m-		mkdir -p '\$(DESTDIR)$NGX_TAPSET_PREFIX'[m
[31m-END[m
[31m-[m
[31m-    for ngx_tapset_src in $ngx_tapset_srcs[m
[31m-    do[m
[31m-        ngx_tapset_file=`basename $ngx_tapset_src`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-	sed -e "s|NGX_SBIN_PATH|$NGX_SBIN_PATH|g" $ngx_long_cont \[m
[31m-                $ngx_tapset_src > '\$(DESTDIR)$NGX_TAPSET_PREFIX/$ngx_tapset_file'[m
[31m-END[m
[31m-[m
[31m-    done[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_STAP_NGX_PATH"`' || \[m
[31m-		mkdir -p '\$(DESTDIR)`dirname "$NGX_STAP_NGX_PATH"`'[m
[31m-	cp $NGX_OBJS/stap-nginx '\$(DESTDIR)$NGX_STAP_NGX_PATH'[m
[31m-	chmod 0755 '\$(DESTDIR)$NGX_STAP_NGX_PATH'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-if test -n "$NGX_ERROR_LOG_PATH"; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if test -n "$DYNAMIC_MODULES"; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_MODULES_PATH' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)$NGX_MODULES_PATH'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-for ngx_module in $DYNAMIC_MODULES[m
[31m-do[m
[31m-    ngx_module=$ngx_module$ngx_modext[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test ! -f '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\[m
[31m-		|| mv '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\[m
[31m-			'\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module.old'[m
[31m-	cp $NGX_OBJS/$ngx_module '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module'[m
[31m-END[m
[31m-[m
[31m-done[m
[31m-[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$NGX_OBJS${ngx_dirsep}stap-nginx: src/dtrace/stap-nginx[m
[31m-	sed -e "s|NGX_TAPSET_PREFIX|$NGX_TAPSET_PREFIX|g" $ngx_long_cont \[m
[31m-            -e "s|NGX_SBIN_DIR|`dirname $NGX_SBIN_PATH`|g" $ngx_long_cont \[m
[31m-            -e "s|NGX_SBIN_PATH|$NGX_SBIN_PATH|g" $ngx_long_cont \[m
[31m-            src/dtrace/stap-nginx > $NGX_OBJS${ngx_dirsep}stap-nginx[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# create Makefile[m
[31m-[m
[31m-cat << END >> Makefile[m
[31m-[m
[31m-build:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE[m
[31m-[m
[31m-install:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE install[m
[31m-[m
[31m-modules:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE modules[m
[31m-[m
[31m-upgrade:[m
[31m-	$NGX_SBIN_PATH -t[m
[31m-[m
[31m-	kill -USR2 \`cat $NGX_PID_PATH\`[m
[31m-	sleep 1[m
[31m-	test -f $NGX_PID_PATH.oldbin[m
[31m-[m
[31m-	kill -QUIT \`cat $NGX_PID_PATH.oldbin\`[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/install.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/install.orig[m
[1mdeleted file mode 100644[m
[1mindex d884487..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/install.orig[m
[1m+++ /dev/null[m
[36m@@ -1,218 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $USE_PERL != NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-install_perl_modules:[m
[31m-	cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install[m
[31m-END[m
[31m-[m
[31m-    NGX_INSTALL_PERL_MODULES=install_perl_modules[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case ".$NGX_SBIN_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_SBIN_PATH=$NGX_PREFIX/$NGX_SBIN_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_MODULES_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_MODULES_PATH=$NGX_PREFIX/$NGX_MODULES_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-NGX_MODULES_PATH=`dirname $NGX_MODULES_PATH/.`[m
[31m-[m
[31m-[m
[31m-case ".$NGX_CONF_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_CONF_PATH=$NGX_PREFIX/$NGX_CONF_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`[m
[31m-[m
[31m-[m
[31m-case ".$NGX_PID_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_PID_PATH=$NGX_PREFIX/$NGX_PID_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_ERROR_LOG_PATH" in[m
[31m-    ./* | .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_ERROR_LOG_PATH=$NGX_PREFIX/$NGX_ERROR_LOG_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_HTTP_LOG_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_HTTP_LOG_PATH=$NGX_PREFIX/$NGX_HTTP_LOG_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if test -f man/nginx.8 ; then[m
[31m-    NGX_MAN=man/nginx.8[m
[31m-else[m
[31m-    NGX_MAN=docs/man/nginx.8[m
[31m-fi[m
[31m-[m
[31m-if test -d html ; then[m
[31m-    NGX_HTML=html[m
[31m-else[m
[31m-    NGX_HTML=docs/html[m
[31m-fi[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-manpage:	$NGX_OBJS/nginx.8[m
[31m-[m
[31m-$NGX_OBJS/nginx.8:	$NGX_MAN $NGX_AUTO_CONFIG_H[m
[31m-	sed -e "s|%%PREFIX%%|$NGX_PREFIX|" \\[m
[31m-		-e "s|%%PID_PATH%%|$NGX_PID_PATH|" \\[m
[31m-		-e "s|%%CONF_PATH%%|$NGX_CONF_PATH|" \\[m
[31m-		-e "s|%%ERROR_LOG_PATH%%|${NGX_ERROR_LOG_PATH:-stderr}|" \\[m
[31m-		< $NGX_MAN > \$@[m
[31m-[m
[31m-install:	build $NGX_INSTALL_PERL_MODULES[m
[31m-	test -d '\$(DESTDIR)$NGX_PREFIX' || mkdir -p '\$(DESTDIR)$NGX_PREFIX'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`'[m
[31m-	test ! -f '\$(DESTDIR)$NGX_SBIN_PATH' \\[m
[31m-		|| mv '\$(DESTDIR)$NGX_SBIN_PATH' \\[m
[31m-			'\$(DESTDIR)$NGX_SBIN_PATH.old'[m
[31m-	cp $NGX_OBJS/nginx '\$(DESTDIR)$NGX_SBIN_PATH'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_CONF_PREFIX' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-[m
[31m-	cp conf/koi-win '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/koi-utf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/win-utf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types' \\[m
[31m-		|| cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params' \\[m
[31m-		|| cp conf/fastcgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/fastcgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf' \\[m
[31m-		|| cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params' \\[m
[31m-		|| cp conf/uwsgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/uwsgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params' \\[m
[31m-		|| cp conf/scgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/scgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PATH' \\[m
[31m-		|| cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PATH'[m
[31m-	cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PREFIX/nginx.conf.default'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_PID_PATH"`'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_PREFIX/html' \\[m
[31m-		|| cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX'[m
[31m-END[m
[31m-[m
[31m-[m
[31m-if test -n "$NGX_ERROR_LOG_PATH"; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if test -n "$DYNAMIC_MODULES"; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_MODULES_PATH' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)$NGX_MODULES_PATH'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-for ngx_module in $DYNAMIC_MODULES[m
[31m-do[m
[31m-    ngx_module=$ngx_module$ngx_modext[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test ! -f '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\[m
[31m-		|| mv '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\[m
[31m-			'\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module.old'[m
[31m-	cp $NGX_OBJS/$ngx_module '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module'[m
[31m-END[m
[31m-[m
[31m-done[m
[31m-[m
[31m-[m
[31m-# create Makefile[m
[31m-[m
[31m-cat << END >> Makefile[m
[31m-[m
[31m-build:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE[m
[31m-[m
[31m-install:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE install[m
[31m-[m
[31m-modules:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE modules[m
[31m-[m
[31m-upgrade:[m
[31m-	$NGX_SBIN_PATH -t[m
[31m-[m
[31m-	kill -USR2 \`cat $NGX_PID_PATH\`[m
[31m-	sleep 1[m
[31m-	test -f $NGX_PID_PATH.oldbin[m
[31m-[m
[31m-	kill -QUIT \`cat $NGX_PID_PATH.oldbin\`[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/conf[m
[1mdeleted file mode 100644[m
[1mindex a6242e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/conf[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $USE_PCRE = YES -o $PCRE != NONE ]; then[m
[31m-    . auto/lib/pcre/conf[m
[31m-[m
[31m-else[m
[31m-    if [ $USE_PCRE = DISABLED -a $HTTP_REWRITE = YES ]; then[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP rewrite module requires the PCRE library.[m
[31m-You can either disable the module by using --without-http_rewrite_module[m
[31m-option or you have to enable the PCRE support.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $USE_OPENSSL = YES ]; then[m
[31m-    . auto/lib/openssl/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_MD5 = YES ]; then[m
[31m-[m
[31m-    if [ $USE_OPENSSL = YES ]; then[m
[31m-        have=NGX_HAVE_OPENSSL_MD5_H . auto/have[m
[31m-        have=NGX_OPENSSL_MD5 . auto/have[m
[31m-        have=NGX_HAVE_MD5 . auto/have[m
[31m-        MD5=YES[m
[31m-        MD5_LIB=OpenSSL[m
[31m-[m
[31m-    else[m
[31m-        . auto/lib/md5/conf[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_SHA1 = YES ]; then[m
[31m-[m
[31m-    if [ $USE_OPENSSL = YES ]; then[m
[31m-        have=NGX_HAVE_OPENSSL_SHA1_H . auto/have[m
[31m-        have=NGX_HAVE_SHA1 . auto/have[m
[31m-        SHA1=YES[m
[31m-        SHA1_LIB=OpenSSL[m
[31m-[m
[31m-    else[m
[31m-        . auto/lib/sha1/conf[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_ZLIB = YES ]; then[m
[31m-    . auto/lib/zlib/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_LIBXSLT != NO ]; then[m
[31m-    . auto/lib/libxslt/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_LIBGD != NO ]; then[m
[31m-    . auto/lib/libgd/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_PERL != NO ]; then[m
[31m-    . auto/lib/perl/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_GEOIP != NO ]; then[m
[31m-    . auto/lib/geoip/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then[m
[31m-    . auto/lib/google-perftools/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_LIBATOMIC != NO ]; then[m
[31m-    . auto/lib/libatomic/conf[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/geoip/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/geoip/conf[m
[1mdeleted file mode 100644[m
[1mindex ebd2e15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/geoip/conf[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    ngx_feature="GeoIP library"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <GeoIP.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-lGeoIP"[m
[31m-    ngx_feature_test="GeoIP_open(NULL, 0)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="GeoIP library in /usr/local/"[m
[31m-    ngx_feature_path="/usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lGeoIP"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lGeoIP"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # NetBSD port[m
[31m-[m
[31m-    ngx_feature="GeoIP library in /usr/pkg/"[m
[31m-    ngx_feature_path="/usr/pkg/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lGeoIP"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/pkg/lib -lGeoIP"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="GeoIP library in /opt/local/"[m
[31m-    ngx_feature_path="/opt/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lGeoIP"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lGeoIP"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-[m
[31m-    if [ $USE_GEOIP = YES ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_GEOIP=$ngx_feature_libs[m
[31m-[m
[31m-    if [ $NGX_IPV6 = YES ]; then[m
[31m-        ngx_feature="GeoIP IPv6 support"[m
[31m-        ngx_feature_name="NGX_HAVE_GEOIP_V6"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <stdio.h>[m
[31m-                          #include <GeoIP.h>"[m
[31m-        #ngx_feature_path=[m
[31m-        #ngx_feature_libs=[m
[31m-        ngx_feature_test="printf(\"%d\", GEOIP_CITY_EDITION_REV0_V6);"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the GeoIP module requires the GeoIP library.[m
[31m-You can either do not enable the module or install the library.[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/google-perftools/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/google-perftools/conf[m
[1mdeleted file mode 100644[m
[1mindex 5d5ddae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/google-perftools/conf[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    ngx_feature="Google perftools"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-lprofiler"[m
[31m-    ngx_feature_test="ProfilerStop()"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="Google perftools in /usr/local/"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lprofiler"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lprofiler"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="Google perftools in /opt/local/"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lprofiler"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lprofiler"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-[m
[31m-else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the Google perftools module requires the Google perftools[m
[31m-library. You can either do not enable the module or install the library.[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libatomic/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libatomic/conf[m
[1mdeleted file mode 100644[m
[1mindex d1e484a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libatomic/conf[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $NGX_LIBATOMIC != YES ]; then[m
[31m-[m
[31m-    have=NGX_HAVE_LIBATOMIC . auto/have[m
[31m-    CORE_INCS="$CORE_INCS $NGX_LIBATOMIC/src"[m
[31m-    LINK_DEPS="$LINK_DEPS $NGX_LIBATOMIC/src/libatomic_ops.a"[m
[31m-    CORE_LIBS="$CORE_LIBS $NGX_LIBATOMIC/src/libatomic_ops.a"[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    ngx_feature="atomic_ops library"[m
[31m-    ngx_feature_name=NGX_HAVE_LIBATOMIC[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs="#define AO_REQUIRE_CAS[m
[31m-                      #include <atomic_ops.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-latomic_ops"[m
[31m-    ngx_feature_test="long  n = 0;[m
[31m-                      if (!AO_compare_and_swap(&n, 0, 1))[m
[31m-                          return 1;[m
[31m-                      if (AO_fetch_and_add(&n, 1) != 1)[m
[31m-                          return 1;[m
[31m-                      if (n != 2)[m
[31m-                          return 1;[m
[31m-                      AO_nop();"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-    else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: libatomic_ops library was not found.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libatomic/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libatomic/make[m
[1mdeleted file mode 100644[m
[1mindex c90318e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libatomic/make[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$NGX_LIBATOMIC/src/libatomic_ops.a:	$NGX_LIBATOMIC/Makefile[m
[31m-	cd $NGX_LIBATOMIC && \$(MAKE)[m
[31m-[m
[31m-$NGX_LIBATOMIC/Makefile:	$NGX_MAKEFILE[m
[31m-	cd $NGX_LIBATOMIC \\[m
[31m-	&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\[m
[31m-	&& ./configure[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libgd/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libgd/conf[m
[1mdeleted file mode 100644[m
[1mindex 6e4e91c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libgd/conf[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    ngx_feature="GD library"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <gd.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-lgd"[m
[31m-    ngx_feature_test="gdImagePtr img = gdImageCreateFromGifPtr(1, NULL);"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="GD library in /usr/local/"[m
[31m-    ngx_feature_path="/usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lgd"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lgd"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # NetBSD port[m
[31m-[m
[31m-    ngx_feature="GD library in /usr/pkg/"[m
[31m-    ngx_feature_path="/usr/pkg/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lgd"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/pkg/lib -lgd"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="GD library in /opt/local/"[m
[31m-    ngx_feature_path="/opt/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lgd"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lgd"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-[m
[31m-    if [ $USE_LIBGD = YES ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_LIBGD=$ngx_feature_libs[m
[31m-[m
[31m-else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP image filter module requires the GD library.[m
[31m-You can either do not enable the module or install the libraries.[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libxslt/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libxslt/conf[m
[1mdeleted file mode 100644[m
[1mindex 3a0f37b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/libxslt/conf[m
[1m+++ /dev/null[m
[36m@@ -1,165 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    ngx_feature="libxslt"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <libxml/parser.h>[m
[31m-                      #include <libxml/tree.h>[m
[31m-                      #include <libxslt/xslt.h>[m
[31m-                      #include <libxslt/xsltInternals.h>[m
[31m-                      #include <libxslt/transform.h>[m
[31m-                      #include <libxslt/xsltutils.h>"[m
[31m-    ngx_feature_path="/usr/include/libxml2"[m
[31m-    ngx_feature_libs="-lxml2 -lxslt"[m
[31m-    ngx_feature_test="xmlParserCtxtPtr    ctxt = NULL;[m
[31m-                      xsltStylesheetPtr   sheet = NULL;[m
[31m-                      xmlDocPtr           doc;[m
[31m-                      doc = xmlParseChunk(ctxt, NULL, 0, 0);[m
[31m-                      xsltApplyStylesheet(sheet, doc, NULL);"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="libxslt in /usr/local/"[m
[31m-    ngx_feature_path="/usr/local/include/libxml2 /usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lxml2 -lxslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lxml2 -lxslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # NetBSD port[m
[31m-[m
[31m-    ngx_feature="libxslt in /usr/pkg/"[m
[31m-    ngx_feature_path="/usr/pkg/include/libxml2 /usr/pkg/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lxml2 -lxslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/pkg/lib -lxml2 -lxslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="libxslt in /opt/local/"[m
[31m-    ngx_feature_path="/opt/local/include/libxml2 /opt/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lxml2 -lxslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lxml2 -lxslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-[m
[31m-    if [ $USE_LIBXSLT = YES ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_LIBXSLT=$ngx_feature_libs[m
[31m-[m
[31m-else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP XSLT module requires the libxml2/libxslt[m
[31m-libraries. You can either do not enable the module or install the libraries.[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="libexslt"[m
[31m-    ngx_feature_name=NGX_HAVE_EXSLT[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <libexslt/exslt.h>"[m
[31m-    ngx_feature_path="/usr/include/libxml2"[m
[31m-    ngx_feature_libs="-lexslt"[m
[31m-    ngx_feature_test="exsltRegisterAll();"[m
[31m-    . auto/feature[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="libexslt in /usr/local/"[m
[31m-    ngx_feature_path="/usr/local/include/libxml2 /usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lexslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lexslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # NetBSD port[m
[31m-[m
[31m-    ngx_feature="libexslt in /usr/pkg/"[m
[31m-    ngx_feature_path="/usr/pkg/include/libxml2 /usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lexslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/pkg/lib -lexslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="libexslt in /opt/local/"[m
[31m-    ngx_feature_path="/opt/local/include/libxml2 /opt/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lexslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lexslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    if [ $USE_LIBXSLT = YES ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -lexslt"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_LIBXSLT="$NGX_LIB_LIBXSLT -lexslt"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/make[m
[1mdeleted file mode 100644[m
[1mindex 6298b94..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/make[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $PCRE != NONE -a $PCRE != NO -a $PCRE != YES ]; then[m
[31m-    . auto/lib/pcre/make[m
[31m-fi[m
[31m-[m
[31m-if [ $MD5 != NONE -a $MD5 != NO -a $MD5 != YES ]; then[m
[31m-    . auto/lib/md5/make[m
[31m-fi[m
[31m-[m
[31m-if [ $SHA1 != NONE -a $SHA1 != NO -a $SHA1 != YES ]; then[m
[31m-    . auto/lib/sha1/make[m
[31m-fi[m
[31m-[m
[31m-if [ $OPENSSL != NONE -a $OPENSSL != NO -a $OPENSSL != YES ]; then[m
[31m-    . auto/lib/openssl/make[m
[31m-fi[m
[31m-[m
[31m-if [ $ZLIB != NONE -a $ZLIB != NO -a $ZLIB != YES ]; then[m
[31m-    . auto/lib/zlib/make[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_LIBATOMIC != NO -a $NGX_LIBATOMIC != YES ]; then[m
[31m-    . auto/lib/libatomic/make[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_PERL != NO ]; then[m
[31m-    . auto/lib/perl/make[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/conf[m
[1mdeleted file mode 100644[m
[1mindex 49c0ddf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/conf[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $MD5 != NONE ]; then[m
[31m-[m
[31m-    if grep MD5_Init $MD5/md5.h 2>&1 >/dev/null; then[m
[31m-        # OpenSSL md5[m
[31m-        OPENSSL_MD5=YES[m
[31m-        have=NGX_HAVE_OPENSSL_MD5 . auto/have[m
[31m-        have=NGX_OPENSSL_MD5 . auto/have[m
[31m-    else[m
[31m-        # rsaref md5[m
[31m-        OPENSSL_MD5=NO[m
[31m-    fi[m
[31m-[m
[31m-    have=NGX_HAVE_MD5 . auto/have[m
[31m-    CORE_INCS="$CORE_INCS $MD5"[m
[31m-[m
[31m-    case "$NGX_CC_NAME" in[m
[31m-[m
[31m-        msvc | owc | bcc)[m
[31m-            LINK_DEPS="$LINK_DEPS $MD5/md5.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $MD5/md5.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            LINK_DEPS="$LINK_DEPS $MD5/libmd5.a"[m
[31m-[m
[31m-            # to allow -ipo optimization we link with the *.o but not library[m
[31m-            CORE_LIBS="$CORE_LIBS $MD5/md5_dgst.o"[m
[31m-[m
[31m-            if [ $MD5_ASM = YES ]; then[m
[31m-                CORE_LIBS="$CORE_LIBS $MD5/asm/mx86-elf.o"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            LINK_DEPS="$LINK_DEPS $MD5/libmd5.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $MD5/libmd5.a"[m
[31m-            #CORE_LIBS="$CORE_LIBS -L $MD5 -lmd5"[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-            MD5=NO[m
[31m-[m
[31m-            # FreeBSD, Solaris 10[m
[31m-[m
[31m-            ngx_feature="md5 in system md library"[m
[31m-            ngx_feature_name=NGX_HAVE_MD5[m
[31m-            ngx_feature_run=no[m
[31m-            ngx_feature_incs="#include <md5.h>"[m
[31m-            ngx_feature_path=[m
[31m-            ngx_feature_libs="-lmd"[m
[31m-            ngx_feature_test="MD5_CTX md5; MD5Init(&md5)"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            ngx_md5_lib="system md"[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # Solaris 8/9[m
[31m-[m
[31m-            ngx_feature="md5 in system md5 library"[m
[31m-            ngx_feature_libs="-lmd5"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            ngx_md5_lib="system md5"[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # OpenSSL crypto library[m
[31m-[m
[31m-            ngx_feature="md5 in system OpenSSL crypto library"[m
[31m-            ngx_feature_name="NGX_OPENSSL_MD5"[m
[31m-            ngx_feature_incs="#include <openssl/md5.h>"[m
[31m-            ngx_feature_libs="-lcrypto"[m
[31m-            ngx_feature_test="MD5_CTX md5; MD5_Init(&md5)"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            ngx_md5_lib="system crypto"[m
[31m-[m
[31m-            if [ $ngx_found = yes ]; then[m
[31m-                have=NGX_HAVE_OPENSSL_MD5_H . auto/have[m
[31m-                have=NGX_HAVE_MD5 . auto/have[m
[31m-            fi[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            MD5=YES[m
[31m-            MD5_LIB=$ngx_md5_lib[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/make[m
[1mdeleted file mode 100644[m
[1mindex 7000b20..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/make[m
[1m+++ /dev/null[m
[36m@@ -1,96 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    msvc)[m
[31m-        ngx_makefile=makefile.msvc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC MD5_ASM=$MD5_ASM"[m
[31m-        ngx_md5="MD5=\"$MD5\""[m
[31m-    ;;[m
[31m-[m
[31m-    owc)[m
[31m-        ngx_makefile=makefile.owc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_md5=`echo MD5=\"$MD5\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    bcc)[m
[31m-        ngx_makefile=makefile.bcc[m
[31m-        ngx_opt="-DCPU_OPT=\"$CPU_OPT\" -DMD5_ASM=$MD5_ASM"[m
[31m-        ngx_md5=`echo \-DMD5=\"$MD5\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-done=NO[m
[31m-[m
[31m-[m
[31m-case "$NGX_PLATFORM" in[m
[31m-[m
[31m-    win32)[m
[31m-        cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$MD5/md5.lib:	$NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/md5/$ngx_makefile $ngx_opt $ngx_md5[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        done=YES[m
[31m-    ;;[m
[31m-[m
[31m-    SunOS:*:i86pc)[m
[31m-        if [ $MD5_ASM = YES ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$MD5/libmd5.a:	$NGX_MAKEFILE[m
[31m-	cd $MD5 \\[m
[31m-	&& \$(MAKE) CFLAGS="$MD5_OPT -DSOL -DMD5_ASM -DL_ENDIAN" \\[m
[31m-		CC="\$(CC)" CPP="\$(CPP)" \\[m
[31m-		MD5_ASM_OBJ=asm/mx86-sol.o clean libmd5.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-            done=YES[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-    # FreeBSD: i386[m
[31m-    # Linux: i686[m
[31m-[m
[31m-    *:i386 | *:i686)[m
[31m-        if [ $MD5_ASM = YES ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$MD5/libmd5.a:	$NGX_MAKEFILE[m
[31m-	cd $MD5 \\[m
[31m-	&& \$(MAKE) CFLAGS="$MD5_OPT -DELF -DMD5_ASM -DL_ENDIAN" \\[m
[31m-		CC="\$(CC)" CPP="\$(CPP)" \\[m
[31m-		MD5_ASM_OBJ=asm/mx86-elf.o clean libmd5.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-            done=YES[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ $done = NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$MD5/libmd5.a:	$NGX_MAKEFILE[m
[31m-	cd $MD5 \\[m
[31m-	&& \$(MAKE) CFLAGS="$MD5_OPT" \\[m
[31m-		CC="\$(CC)" MD5_ASM_OBJ= clean libmd5.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex eb6fb62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -q -O2 -tWM $(CPU_OPT) -DL_ENDIAN[m
[31m-[m
[31m-!if "$(MD5_ASM)" == "YES"[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	bcc32 -c $(CFLAGS) -DMD5_ASM md5_dgst.c[m
[31m-	tlib md5.lib +md5_dgst.obj +"asm\m-win32.obj"[m
[31m-[m
[31m-!else[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	bcc32 -c $(CFLAGS) md5_dgst.c[m
[31m-	tlib md5.lib +md5_dgst.obj[m
[31m-[m
[31m-!endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex 90d62fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -D L_ENDIAN[m
[31m-[m
[31m-!IF "$(MD5_ASM)" == "YES"[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	cl -c $(CFLAGS) -D MD5_ASM md5_dgst.c[m
[31m-	link -lib -out:md5.lib md5_dgst.obj asm/m-win32.obj[m
[31m-[m
[31m-!ELSE[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	cl -c $(CFLAGS) md5_dgst.c[m
[31m-	link -lib -out:md5.lib md5_dgst.obj[m
[31m-[m
[31m-!ENDIF[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.owc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.owc[m
[1mdeleted file mode 100644[m
[1mindex 78c1e61..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/md5/makefile.owc[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -zq -bt=nt -bm -ot -op -oi -oe -s $(CPU_OPT)[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	wcl386 -c $(CFLAGS) -dL_ENDIAN md5_dgst.c[m
[31m-	wlib -n md5.lib md5_dgst.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/conf[m
[1mdeleted file mode 100644[m
[1mindex 39d9602..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/conf[m
[1m+++ /dev/null[m
[36m@@ -1,127 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $OPENSSL != NONE ]; then[m
[31m-[m
[31m-    case "$CC" in[m
[31m-[m
[31m-        cl | bcc32)[m
[31m-            have=NGX_OPENSSL . auto/have[m
[31m-            have=NGX_SSL . auto/have[m
[31m-[m
[31m-            CFLAGS="$CFLAGS -DNO_SYS_TYPES_H"[m
[31m-[m
[31m-            CORE_INCS="$CORE_INCS $OPENSSL/openssl/include"[m
[31m-            CORE_DEPS="$CORE_DEPS $OPENSSL/openssl/include/openssl/ssl.h"[m
[31m-            CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib"[m
[31m-[m
[31m-            # libeay32.lib requires gdi32.lib[m
[31m-            CORE_LIBS="$CORE_LIBS gdi32.lib"[m
[31m-            # OpenSSL 1.0.0 requires crypt32.lib[m
[31m-            CORE_LIBS="$CORE_LIBS crypt32.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            have=NGX_OPENSSL . auto/have[m
[31m-            have=NGX_SSL . auto/have[m
[31m-[m
[31m-            CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"[m
[31m-            CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"[m
[31m-            CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $NGX_LIBDL"[m
[31m-[m
[31m-            if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-                CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32"[m
[31m-            fi[m
[31m-        ;;[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-        OPENSSL=NO[m
[31m-[m
[31m-        ngx_feature="OpenSSL library"[m
[31m-        ngx_feature_name="NGX_OPENSSL"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <openssl/ssl.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lssl -lcrypto $NGX_LIBDL"[m
[31m-        ngx_feature_test="SSL_CTX_set_options(NULL, 0)"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # FreeBSD port[m
[31m-[m
[31m-            ngx_feature="OpenSSL library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # NetBSD port[m
[31m-[m
[31m-            ngx_feature="OpenSSL library in /usr/pkg/"[m
[31m-            ngx_feature_path="/usr/pkg/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/pkg/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # MacPorts[m
[31m-[m
[31m-            ngx_feature="OpenSSL library in /opt/local/"[m
[31m-            ngx_feature_path="/opt/local/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/opt/local/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            have=NGX_SSL . auto/have[m
[31m-            CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            OPENSSL=YES[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $OPENSSL != YES ]; then[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: SSL modules require the OpenSSL library.[m
[31m-You can either do not enable the modules, or install the OpenSSL library[m
[31m-into the system, or build the OpenSSL library statically from the source[m
[31m-with nginx by using --with-openssl=<path> option.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/make[m
[1mdeleted file mode 100644[m
[1mindex a6090c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/make[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$CC" in[m
[31m-[m
[31m-    cl)[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$OPENSSL/openssl/include/openssl/ssl.h:	$NGX_MAKEFILE[m
[31m-	\$(MAKE) -f auto/lib/openssl/makefile.msvc			\[m
[31m-		OPENSSL="$OPENSSL" OPENSSL_OPT="$OPENSSL_OPT"[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ;;[m
[31m-[m
[31m-    bcc32)[m
[31m-[m
[31m-        ngx_opt=`echo "-DOPENSSL=\"$OPENSSL\" -DOPENSSL_OPT=\"$OPENSSL_OPT\"" \[m
[31m-            | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$OPENSSL\\openssl\\lib\\libeay32.lib:				\[m
[31m-	$OPENSSL\\openssl\\include\\openssl\\ssl.h"			\[m
[31m-	| sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-`echo "$OPENSSL\\openssl\\lib\\ssleay32.lib:				\[m
[31m-	$OPENSSL\\openssl\\include\\openssl\\ssl.h"			\[m
[31m-	| sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-`echo "$OPENSSL\\openssl\\include\\openssl\\ssl.h:	$NGX_MAKEFILE"	\[m
[31m-	| sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/openssl/makefile.bcc $ngx_opt[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        case $OPENSSL in[m
[31m-            /*) ngx_prefix="$OPENSSL/.openssl" ;;[m
[31m-            *)  ngx_prefix="$PWD/$OPENSSL/.openssl" ;;[m
[31m-        esac[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$OPENSSL/.openssl/include/openssl/ssl.h:	$NGX_MAKEFILE[m
[31m-	cd $OPENSSL \\[m
[31m-	&& if [ -f Makefile ]; then \$(MAKE) clean; fi \\[m
[31m-	&& ./config --prefix=$ngx_prefix no-shared $OPENSSL_OPT \\[m
[31m-	&& \$(MAKE) \\[m
[31m-	&& \$(MAKE) install_sw LIBDIR=lib[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex 6a94ff7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-all:[m
[31m-	cd $(OPENSSL)[m
[31m-[m
[31m-	perl Configure BC-32 no-shared --prefix=openssl $(OPENSSL_OPT)[m
[31m-[m
[31m-	ms\do_nasm[m
[31m-[m
[31m-	$(MAKE) -f ms\bcb.mak[m
[31m-	$(MAKE) -f ms\bcb.mak install[m
[31m-[m
[31m-	# Borland's make does not expand "[ch]" in[m
[31m-	#    copy "inc32\openssl\*.[ch]" "openssl\include\openssl"[m
[31m-	copy inc32\openssl\*.h openssl\include\openssl[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex fc9e578..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/openssl/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-all:[m
[31m-	cd $(OPENSSL)[m
[31m-[m
[31m-	perl Configure VC-WIN32 no-shared --prefix=openssl $(OPENSSL_OPT)[m
[31m-[m
[31m-	ms\do_ms[m
[31m-[m
[31m-	$(MAKE) -f ms\nt.mak[m
[31m-	$(MAKE) -f ms\nt.mak install[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/conf[m
[1mdeleted file mode 100644[m
[1mindex 5e3960f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/conf[m
[1m+++ /dev/null[m
[36m@@ -1,203 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $PCRE != NONE ]; then[m
[31m-    CORE_INCS="$CORE_INCS $PCRE"[m
[31m-[m
[31m-    case "$NGX_CC_NAME" in[m
[31m-[m
[31m-        msvc | owc | bcc)[m
[31m-            have=NGX_PCRE . auto/have[m
[31m-            have=PCRE_STATIC . auto/have[m
[31m-            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"[m
[31m-            LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            have=NGX_PCRE . auto/have[m
[31m-            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"[m
[31m-[m
[31m-            LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"[m
[31m-[m
[31m-            echo $ngx_n "checking for PCRE library ...$ngx_c"[m
[31m-[m
[31m-            if [ -f $PCRE/pcre.h ]; then[m
[31m-                ngx_pcre_ver=`grep PCRE_MAJOR $PCRE/pcre.h \[m
[31m-                              | sed -e 's/^.*PCRE_MAJOR.* \(.*\)$/\1/'`[m
[31m-[m
[31m-            else if [ -f $PCRE/configure.in ]; then[m
[31m-                ngx_pcre_ver=`grep PCRE_MAJOR= $PCRE/configure.in \[m
[31m-                              | sed -e 's/^.*=\(.*\)$/\1/'`[m
[31m-[m
[31m-            else[m
[31m-                ngx_pcre_ver=`grep pcre_major, $PCRE/configure.ac \[m
[31m-                              | sed -e 's/^.*pcre_major,.*\[\(.*\)\].*$/\1/'`[m
[31m-            fi[m
[31m-            fi[m
[31m-[m
[31m-            echo " $ngx_pcre_ver major version found"[m
[31m-[m
[31m-            # to allow -ipo optimization we link with the *.o but not library[m
[31m-[m
[31m-            case "$ngx_pcre_ver" in[m
[31m-                4|5)[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre.o"[m
[31m-                ;;[m
[31m-[m
[31m-                6)[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_chartables.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_compile.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_exec.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_fullinfo.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_globals.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_tables.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_try_flipped.o"[m
[31m-                ;;[m
[31m-[m
[31m-                *)[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_chartables.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_compile.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_exec.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_fullinfo.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_globals.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_tables.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_try_flipped.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_newline.o"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            have=NGX_PCRE . auto/have[m
[31m-[m
[31m-            if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-                have=PCRE_STATIC . auto/have[m
[31m-            fi[m
[31m-[m
[31m-            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"[m
[31m-            LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a"[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-[m
[31m-    if [ $PCRE_JIT = YES ]; then[m
[31m-        have=NGX_HAVE_PCRE_JIT . auto/have[m
[31m-        PCRE_CONF_OPT="$PCRE_CONF_OPT --enable-jit"[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-        PCRE=NO[m
[31m-[m
[31m-        ngx_feature="PCRE library"[m
[31m-        ngx_feature_name="NGX_PCRE"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <pcre.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lpcre"[m
[31m-        ngx_feature_test="pcre *re;[m
[31m-                          re = pcre_compile(NULL, 0, NULL, 0, NULL);[m
[31m-                          if (re == NULL) return 1"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # FreeBSD port[m
[31m-[m
[31m-            ngx_feature="PCRE library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpcre"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -lpcre"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # RedHat RPM, Solaris package[m
[31m-[m
[31m-            ngx_feature="PCRE library in /usr/include/pcre/"[m
[31m-            ngx_feature_path="/usr/include/pcre"[m
[31m-            ngx_feature_libs="-lpcre"[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # NetBSD port[m
[31m-[m
[31m-            ngx_feature="PCRE library in /usr/pkg/"[m
[31m-            ngx_feature_path="/usr/pkg/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lpcre"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/pkg/lib -lpcre"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # MacPorts[m
[31m-[m
[31m-            ngx_feature="PCRE library in /opt/local/"[m
[31m-            ngx_feature_path="/opt/local/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lpcre"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/opt/local/lib -lpcre"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            PCRE=YES[m
[31m-        fi[m
[31m-[m
[31m-        if [ $PCRE = YES ]; then[m
[31m-            ngx_feature="PCRE JIT support"[m
[31m-            ngx_feature_name="NGX_HAVE_PCRE_JIT"[m
[31m-            ngx_feature_test="int jit = 0;[m
[31m-                              pcre_free_study(NULL);[m
[31m-                              pcre_config(PCRE_CONFIG_JIT, &jit);[m
[31m-                              if (jit != 1) return 1;"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            if [ $ngx_found = yes ]; then[m
[31m-                PCRE_JIT=YES[m
[31m-            fi[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $PCRE != YES ]; then[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP rewrite module requires the PCRE library.[m
[31m-You can either disable the module by using --without-http_rewrite_module[m
[31m-option, or install the PCRE library into the system, or build the PCRE library[m
[31m-statically from the source with nginx by using --with-pcre=<path> option.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/make[m
[1mdeleted file mode 100644[m
[1mindex 97c9f3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/make[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    msvc)[m
[31m-        ngx_makefile=makefile.msvc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"[m
[31m-        ngx_pcre="PCRE=\"$PCRE\""[m
[31m-    ;;[m
[31m-[m
[31m-    owc)[m
[31m-        ngx_makefile=makefile.owc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    bcc)[m
[31m-        ngx_makefile=makefile.bcc[m
[31m-        ngx_opt="-DCPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_pcre=`echo \-DPCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        ngx_makefile=[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ -n "$ngx_makefile" ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$PCRE/pcre.lib:	$PCRE/pcre.h $NGX_MAKEFILE"			\[m
[31m-	| sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre $ngx_opt[m
[31m-[m
[31m-`echo "$PCRE/pcre.h:" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre pcre.h[m
[31m-[m
[31m-END[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$PCRE/pcre.h:	$PCRE/Makefile[m
[31m-[m
[31m-$PCRE/Makefile:	$NGX_MAKEFILE[m
[31m-	cd $PCRE \\[m
[31m-	&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\[m
[31m-	&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\[m
[31m-	./configure --disable-shared $PCRE_CONF_OPT[m
[31m-[m
[31m-$PCRE/.libs/libpcre.a:	$PCRE/Makefile[m
[31m-	cd $PCRE \\[m
[31m-	&& \$(MAKE) libpcre.la[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex 7a0f2be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS =	-q -O2 -tWM -w-8004 $(CPU_OPT)[m
[31m-PCREFLAGS =	-DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \[m
[31m-		-DSUPPORT_PCRE8 -DHAVE_MEMMOVE[m
[31m-[m
[31m-[m
[31m-pcre.lib:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	bcc32 -c $(CFLAGS) -I. $(PCREFLAGS) pcre_*.c[m
[31m-[m
[31m-	copy /y nul pcre.lst[m
[31m-	for %n in (*.obj) do @echo +%n ^^& >> pcre.lst[m
[31m-	echo + >> pcre.lst[m
[31m-[m
[31m-	tlib pcre.lib @pcre.lst[m
[31m-[m
[31m-pcre.h:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	copy /y pcre.h.generic pcre.h[m
[31m-	copy /y config.h.generic config.h[m
[31m-	copy /y pcre_chartables.c.dist pcre_chartables.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex 07fd9a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS =	-O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT)[m
[31m-PCREFLAGS =	-DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \[m
[31m-		-DSUPPORT_PCRE8 -DHAVE_MEMMOVE[m
[31m-[m
[31m-[m
[31m-pcre.lib:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	cl -nologo -c $(CFLAGS) -I . $(PCREFLAGS) pcre_*.c[m
[31m-[m
[31m-	link -lib -out:pcre.lib -verbose:lib pcre_*.obj[m
[31m-[m
[31m-pcre.h:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	copy /y pcre.h.generic pcre.h[m
[31m-	copy /y config.h.generic config.h[m
[31m-	copy /y pcre_chartables.c.dist pcre_chartables.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.owc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.owc[m
[1mdeleted file mode 100644[m
[1mindex 122fd5b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/pcre/makefile.owc[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS =	-c -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT)[m
[31m-PCREFLAGS =	-DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 &[m
[31m-		-DSUPPORT_PCRE8 -DHAVE_MEMMOVE[m
[31m-[m
[31m-[m
[31m-pcre.lib:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	wcl386 $(CFLAGS) -i=. $(PCREFLAGS) pcre_*.c[m
[31m-[m
[31m-	dir /b *.obj > pcre.lst[m
[31m-[m
[31m-	wlib -n pcre.lib @pcre.lst[m
[31m-[m
[31m-pcre.h:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	copy /y pcre.h.generic pcre.h[m
[31m-	copy /y config.h.generic config.h[m
[31m-	copy /y pcre_chartables.c.dist pcre_chartables.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/perl/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/perl/conf[m
[1mdeleted file mode 100644[m
[1mindex f5f5d3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/perl/conf[m
[1m+++ /dev/null[m
[36m@@ -1,81 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo "checking for perl"[m
[31m-[m
[31m-[m
[31m-NGX_PERL_VER=`$NGX_PERL -v 2>&1 | grep '^This is perl' 2>&1 \[m
[31m-                                | sed -e 's/^This is perl, \(.*\)/\1/'`[m
[31m-[m
[31m-if test -n "$NGX_PERL_VER"; then[m
[31m-    echo " + perl version: $NGX_PERL_VER"[m
[31m-[m
[31m-    if [ "`$NGX_PERL -e 'use 5.006001; print "OK"'`" != "OK" ]; then[m
[31m-        echo[m
[31m-        echo "$0: error: perl 5.6.1 or higher is required"[m
[31m-        echo[m
[31m-[m
[31m-        exit 1;[m
[31m-    fi[m
[31m-[m
[31m-    if [ "`$NGX_PERL -MExtUtils::Embed -e 'print "OK"'`" != "OK" ]; then[m
[31m-        echo[m
[31m-        echo "$0: error: perl module ExtUtils::Embed is required"[m
[31m-        echo[m
[31m-[m
[31m-        exit 1;[m
[31m-    fi[m
[31m-[m
[31m-    NGX_PERL_CFLAGS="$CFLAGS `$NGX_PERL -MExtUtils::Embed -e ccopts`"[m
[31m-    NGX_PM_CFLAGS=`$NGX_PERL -MExtUtils::Embed -e ccopts`[m
[31m-[m
[31m-    # gcc 4.1/4.2 warn about unused values in pTHX_[m
[31m-    NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \[m
[31m-                     | sed -e 's/-Wunused-value/-Wno-unused-value/'`[m
[31m-    # icc8 warns 'declaration hides parameter "my_perl"' in ENTER and LEAVE[m
[31m-    NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \[m
[31m-                     | sed -e 's/-wd171/-wd171 -wd1599/'`[m
[31m-[m
[31m-    ngx_perl_ldopts=`$NGX_PERL -MExtUtils::Embed -e ldopts`[m
[31m-[m
[31m-    ngx_perl_dlext=`$NGX_PERL -MConfig -e 'print $Config{dlext}'`[m
[31m-    ngx_perl_libdir="src/http/modules/perl/blib/arch/auto"[m
[31m-    ngx_perl_module="$ngx_perl_libdir/nginx/nginx.$ngx_perl_dlext"[m
[31m-[m
[31m-    if $NGX_PERL -V:usemultiplicity | grep define > /dev/null; then[m
[31m-        have=NGX_HAVE_PERL_MULTIPLICITY . auto/have[m
[31m-        echo " + perl interpreter multiplicity found"[m
[31m-    fi[m
[31m-[m
[31m-    if $NGX_PERL -V:useithreads | grep undef > /dev/null; then[m
[31m-        # FreeBSD port wants to link with -pthread non-threaded perl[m
[31m-        ngx_perl_ldopts=`echo $ngx_perl_ldopts | sed 's/ -pthread//'`[m
[31m-    fi[m
[31m-[m
[31m-    if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-        # OS X system perl wants to link universal binaries[m
[31m-        ngx_perl_ldopts=`echo $ngx_perl_ldopts \[m
[31m-                         | sed -e 's/-arch i386//' -e 's/-arch x86_64//'`[m
[31m-    fi[m
[31m-[m
[31m-    if [ $USE_PERL = YES ]; then[m
[31m-        CORE_LINK="$CORE_LINK $ngx_perl_ldopts"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_PERL="$ngx_perl_ldopts"[m
[31m-[m
[31m-    if test -n "$NGX_PERL_MODULES"; then[m
[31m-        have=NGX_PERL_MODULES value="(u_char *) \"$NGX_PERL_MODULES\""[m
[31m-        . auto/define[m
[31m-        NGX_PERL_MODULES_MAN=$NGX_PERL_MODULES/man3[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-    echo[m
[31m-    echo "$0: error: perl 5.6.1 or higher is required"[m
[31m-    echo[m
[31m-[m
[31m-    exit 1;[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/perl/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/perl/make[m
[1mdeleted file mode 100644[m
[1mindex 8af8902..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/perl/make[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-v=`grep 'define NGINX_VERSION' src/core/nginx.h | sed -e 's/^.*"\(.*\)".*/\1/'`[m
[31m-[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-$NGX_OBJS/src/http/modules/perl/ngx_http_perl_module.o: \\[m
[31m-		$NGX_OBJS/$ngx_perl_module[m
[31m-[m
[31m-$NGX_OBJS/$ngx_perl_module: \\[m
[31m-		\$(CORE_DEPS) \$(HTTP_DEPS) \\[m
[31m-		src/http/modules/perl/ngx_http_perl_module.h \\[m
[31m-		$NGX_OBJS/src/http/modules/perl/Makefile[m
[31m-	cd $NGX_OBJS/src/http/modules/perl && \$(MAKE)[m
[31m-[m
[31m-	rm -rf $NGX_OBJS/install_perl[m
[31m-[m
[31m-[m
[31m-$NGX_OBJS/src/http/modules/perl/Makefile: \\[m
[31m-		$NGX_AUTO_CONFIG_H \\[m
[31m-		src/core/nginx.h \\[m
[31m-		src/http/modules/perl/Makefile.PL \\[m
[31m-		src/http/modules/perl/nginx.pm \\[m
[31m-		src/http/modules/perl/nginx.xs \\[m
[31m-		src/http/modules/perl/typemap[m
[31m-	sed "s/%%VERSION%%/$v/" src/http/modules/perl/nginx.pm > \\[m
[31m-		$NGX_OBJS/src/http/modules/perl/nginx.pm[m
[31m-	cp -p src/http/modules/perl/nginx.xs $NGX_OBJS/src/http/modules/perl/[m
[31m-	cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/[m
[31m-	cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/[m
[31m-[m
[31m-	cd $NGX_OBJS/src/http/modules/perl \\[m
[31m-		&& NGX_PM_CFLAGS="\$(NGX_PM_CFLAGS) -g $NGX_CC_OPT" \\[m
[31m-			NGX_INCS="$CORE_INCS $NGX_OBJS $HTTP_INCS" \\[m
[31m-			NGX_DEPS="\$(CORE_DEPS) \$(HTTP_DEPS)" \\[m
[31m-		$NGX_PERL Makefile.PL \\[m
[31m-			LIB=$NGX_PERL_MODULES \\[m
[31m-			INSTALLSITEMAN3DIR=$NGX_PERL_MODULES_MAN[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/conf[m
[1mdeleted file mode 100644[m
[1mindex 78f9efd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/conf[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $SHA1 != NONE ]; then[m
[31m-[m
[31m-    have=NGX_HAVE_SHA1 . auto/have[m
[31m-    CORE_INCS="$CORE_INCS $SHA1"[m
[31m-[m
[31m-    case "$NGX_CC_NAME" in[m
[31m-[m
[31m-        msvc | owc | bcc)[m
[31m-            LINK_DEPS="$LINK_DEPS $SHA1/sha1.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $SHA1/sha1.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            LINK_DEPS="$LINK_DEPS $SHA1/libsha.a"[m
[31m-[m
[31m-            # to allow -ipo optimization we link with the *.o but not library[m
[31m-            CORE_LIBS="$CORE_LIBS $SHA1/sha1_dgst.o"[m
[31m-[m
[31m-            if [ $SHA1_ASM = YES ]; then[m
[31m-                CORE_LIBS="$CORE_LIBS $SHA1/asm/sx86-elf.o"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            LINK_DEPS="$LINK_DEPS $SHA1/libsha.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $SHA1/libsha.a"[m
[31m-            #CORE_LIBS="$CORE_LIBS -L $SHA1 -lsha"[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-        SHA1=NO[m
[31m-[m
[31m-        # FreeBSD[m
[31m-[m
[31m-        ngx_feature="sha1 in system md library"[m
[31m-        ngx_feature_name=NGX_HAVE_SHA1[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <sha.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lmd"[m
[31m-        ngx_feature_test="SHA_CTX sha1; SHA1_Init(&sha1)"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        ngx_sha1_lib="system md"[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # OpenSSL crypto library[m
[31m-[m
[31m-            ngx_feature="sha1 in system OpenSSL crypto library"[m
[31m-            ngx_feature_incs="#include <openssl/sha.h>"[m
[31m-            ngx_feature_libs="-lcrypto"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            ngx_sha1_lib="system crypto"[m
[31m-[m
[31m-            if [ $ngx_found = yes ]; then[m
[31m-                have=NGX_HAVE_OPENSSL_SHA1_H . auto/have[m
[31m-            fi[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            SHA1=YES[m
[31m-            SHA1_LIB=$ngx_sha1_lib[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/make[m
[1mdeleted file mode 100644[m
[1mindex fc3b340..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/make[m
[1m+++ /dev/null[m
[36m@@ -1,96 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    msvc)[m
[31m-        ngx_makefile=makefile.msvc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC SHA1_ASM=$SHA1_ASM"[m
[31m-        ngx_sha1="SHA1=\"$SHA1\""[m
[31m-    ;;[m
[31m-[m
[31m-    owc)[m
[31m-        ngx_makefile=makefile.owc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_sha1=`echo SHA1=\"$SHA1\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    bcc)[m
[31m-        ngx_makefile=makefile.bcc[m
[31m-        ngx_opt="-DCPU_OPT=\"$CPU_OPT\" -DSHA1_ASM=$SHA1_ASM"[m
[31m-        ngx_sha1=`echo \-DSHA1=\"$SHA1\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-done=NO[m
[31m-[m
[31m-[m
[31m-case "$NGX_PLATFORM" in[m
[31m-[m
[31m-    win32)[m
[31m-        cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$SHA1/sha1.lib:	$NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/sha1/$ngx_makefile $ngx_opt $ngx_sha1[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        done=YES[m
[31m-    ;;[m
[31m-[m
[31m-    SunOS:*:i86pc)[m
[31m-        if [ $SHA1_ASM = YES ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$SHA1/libsha.a:	$NGX_MAKEFILE[m
[31m-	cd $SHA1 \\[m
[31m-	&& \$(MAKE) CFLAGS="$SHA1_OPT -DSOL -DSHA1_ASM -DL_ENDIAN" \\[m
[31m-		CC="\$(CC)" CPP="\$(CPP)" \\[m
[31m-		SHA_ASM_OBJ=asm/sx86-sol.o clean libsha.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-            done=YES[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-    # FreeBSD: i386[m
[31m-    # Linux: i686[m
[31m-[m
[31m-    *:i386 | *:i686)[m
[31m-        if [ $SHA1_ASM = YES ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$SHA1/libsha.a:	$NGX_MAKEFILE[m
[31m-	cd $SHA1 \\[m
[31m-	&& \$(MAKE) CFLAGS="$SHA1_OPT -DELF -DSHA1_ASM -DL_ENDIAN" \\[m
[31m-		CC="\$(CC)" CPP="\$(CPP)" \\[m
[31m-		SHA_ASM_OBJ=asm/sx86-elf.o clean libsha.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-            done=YES[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ $done = NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$SHA1/libsha.a:	$NGX_MAKEFILE[m
[31m-	cd $SHA1 \\[m
[31m-	&& \$(MAKE) CFLAGS="$SHA1_OPT" \\[m
[31m-		CC="\$(CC)" SHA_ASM_OBJ= clean libsha.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex b0685fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -q -O2 -tWM $(CPU_OPT) -DL_ENDIAN[m
[31m-[m
[31m-!if "$(SHA1_ASM)" == "YES"[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	bcc32 -c $(CFLAGS) -DSHA1_ASM sha1dgst.c[m
[31m-	tlib sha1.lib +sha1dgst.obj +"asm\s-win32.obj"[m
[31m-[m
[31m-!else[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	bcc32 -c $(CFLAGS) sha1dgst.c[m
[31m-	tlib sha1.lib +sha1dgst.obj[m
[31m-[m
[31m-!endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex 3cbd21b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -D L_ENDIAN[m
[31m-[m
[31m-!IF "$(SHA1_ASM)" == "YES"[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	cl -c $(CFLAGS) -D SHA1_ASM sha1dgst.c[m
[31m-	link -lib -out:sha1.lib sha1dgst.obj asm/s-win32.obj[m
[31m-[m
[31m-!ELSE[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	cl -c $(CFLAGS) sha1dgst.c[m
[31m-	link -lib -out:sha1.lib sha1dgst.obj[m
[31m-[m
[31m-!ENDIF[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.owc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.owc[m
[1mdeleted file mode 100644[m
[1mindex fc095cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/sha1/makefile.owc[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -zq -bt=nt -bm -ot -op -oi -oe -s $(CPU_OPT)[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	wcl386 -c $(CFLAGS) -dL_ENDIAN sha1dgst.c[m
[31m-	wlib -n sha1.lib sha1dgst.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/test b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/test[m
[1mdeleted file mode 100644[m
[1mindex ba943a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/test[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_lib ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_lib[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_found=no[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-$ngx_lib_incs[m
[31m-[m
[31m-int main() {[m
[31m-    $ngx_lib_test;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-eval "$CC $cc_test_flags $ngx_lib_cflags \[m
[31m-     -o $NGX_AUTOTEST $NGX_AUTOTEST.c $ngx_libs \[m
[31m-     >> $NGX_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    echo " found"[m
[31m-[m
[31m-    ngx_found=yes[m
[31m-[m
[31m-else[m
[31m-    echo " not found"[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/conf[m
[1mdeleted file mode 100644[m
[1mindex 239592e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/conf[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $ZLIB != NONE ]; then[m
[31m-    CORE_INCS="$CORE_INCS $ZLIB"[m
[31m-[m
[31m-    case "$NGX_CC_NAME" in[m
[31m-[m
[31m-        msvc | owc | bcc)[m
[31m-            have=NGX_ZLIB . auto/have[m
[31m-            LINK_DEPS="$LINK_DEPS $ZLIB/zlib.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/zlib.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            have=NGX_ZLIB . auto/have[m
[31m-            LINK_DEPS="$LINK_DEPS $ZLIB/libz.a"[m
[31m-[m
[31m-            # to allow -ipo optimization we link with the *.o but not library[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/adler32.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/crc32.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/deflate.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/trees.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/zutil.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/compress.o"[m
[31m-[m
[31m-            if [ $ZLIB_ASM != NO ]; then[m
[31m-                CORE_LIBS="$CORE_LIBS $ZLIB/match.o"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            have=NGX_ZLIB . auto/have[m
[31m-            LINK_DEPS="$LINK_DEPS $ZLIB/libz.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/libz.a"[m
[31m-            #CORE_LIBS="$CORE_LIBS -L $ZLIB -lz"[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-        ZLIB=NO[m
[31m-[m
[31m-        # FreeBSD, Solaris, Linux[m
[31m-[m
[31m-        ngx_feature="zlib library"[m
[31m-        ngx_feature_name="NGX_ZLIB"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <zlib.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lz"[m
[31m-        ngx_feature_test="z_stream z; deflate(&z, Z_NO_FLUSH)"[m
[31m-        . auto/feature[m
[31m-[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            ZLIB=YES[m
[31m-            ngx_found=no[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ZLIB != YES ]; then[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP gzip module requires the zlib library.[m
[31m-You can either disable the module by using --without-http_gzip_module[m
[31m-option, or install the zlib library into the system, or build the zlib library[m
[31m-statically from the source with nginx by using --with-zlib=<path> option.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/make[m
[1mdeleted file mode 100644[m
[1mindex 0082ad5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/make[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    msvc)[m
[31m-        ngx_makefile=makefile.msvc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"[m
[31m-        ngx_zlib="ZLIB=\"$ZLIB\""[m
[31m-[m
[31m-    ;;[m
[31m-[m
[31m-    owc)[m
[31m-        ngx_makefile=makefile.owc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_zlib=`echo ZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    bcc)[m
[31m-        ngx_makefile=makefile.bcc[m
[31m-        ngx_opt="-DCPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_zlib=`echo \-DZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        ngx_makefile=[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-done=NO[m
[31m-[m
[31m-[m
[31m-case "$NGX_PLATFORM" in[m
[31m-[m
[31m-    win32)[m
[31m-[m
[31m-        if [ -n "$ngx_makefile" ]; then[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$ZLIB/zlib.lib:	$NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/zlib/$ngx_makefile $ngx_opt $ngx_zlib[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        else[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ZLIB/libz.a:	$NGX_MAKEFILE[m
[31m-	cd $ZLIB \\[m
[31m-	&& \$(MAKE) distclean \\[m
[31m-	&& \$(MAKE) -f win32/Makefile.gcc \\[m
[31m-		CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\[m
[31m-		libz.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        fi[m
[31m-[m
[31m-        done=YES[m
[31m-    ;;[m
[31m-[m
[31m-    # FreeBSD: i386[m
[31m-    # Linux: i686[m
[31m-[m
[31m-    *:i386 | *:i686)[m
[31m-        case $ZLIB_ASM in[m
[31m-            pentium)[m
[31m-[m
[31m-                cat << END                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ZLIB/libz.a:	$NGX_MAKEFILE[m
[31m-	cd $ZLIB \\[m
[31m-	&& \$(MAKE) distclean \\[m
[31m-	&& cp contrib/asm586/match.S . \\[m
[31m-	&& CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\[m
[31m-		./configure \\[m
[31m-	&& \$(MAKE) OBJA=match.o libz.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-                done=YES[m
[31m-            ;;[m
[31m-[m
[31m-            pentiumpro)[m
[31m-[m
[31m-                cat << END                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ZLIB/libz.a:	$NGX_MAKEFILE[m
[31m-	cd $ZLIB \\[m
[31m-	&& \$(MAKE) distclean \\[m
[31m-	&& cp contrib/asm686/match.S . \\[m
[31m-	&& CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\[m
[31m-		./configure \\[m
[31m-	&& \$(MAKE) OBJA=match.o libz.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-                done=YES[m
[31m-            ;;[m
[31m-[m
[31m-            NO)[m
[31m-            ;;[m
[31m-[m
[31m-            *)[m
[31m-                echo "$0: error: invalid --with-zlib-asm=$ZLIB_ASM option."[m
[31m-                echo "The valid values are \"pentium\" and \"pentiumpro\" only".[m
[31m-                echo[m
[31m-[m
[31m-                exit 1;[m
[31m-            ;;[m
[31m-        esac[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ $done = NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ZLIB/libz.a:	$NGX_MAKEFILE[m
[31m-	cd $ZLIB \\[m
[31m-	&& \$(MAKE) distclean \\[m
[31m-	&& CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\[m
[31m-		./configure \\[m
[31m-	&& \$(MAKE) libz.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex 97a30ea..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -q -O2 -tWM -w-8004 -w-8012 $(CPU_OPT)[m
[31m-[m
[31m-zlib.lib:[m
[31m-	cd $(ZLIB)[m
[31m-[m
[31m-	bcc32 -c $(CFLAGS) adler32.c crc32.c deflate.c \[m
[31m-		trees.c zutil.c compress.c \[m
[31m-		inflate.c inffast.c inftrees.c[m
[31m-[m
[31m-	tlib zlib.lib +adler32.obj +crc32.obj +deflate.obj \[m
[31m-		+trees.obj +zutil.obj +compress.obj \[m
[31m-		+inflate.obj +inffast.obj +inftrees.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex 6fbd691..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT)[m
[31m-[m
[31m-zlib.lib:[m
[31m-	cd $(ZLIB)[m
[31m-[m
[31m-	cl -c $(CFLAGS) adler32.c crc32.c deflate.c \[m
[31m-		trees.c zutil.c compress.c \[m
[31m-		inflate.c inffast.c inftrees.c[m
[31m-[m
[31m-	link -lib -out:zlib.lib adler32.obj crc32.obj deflate.obj \[m
[31m-		trees.obj zutil.obj compress.obj \[m
[31m-		inflate.obj inffast.obj inftrees.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.owc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.owc[m
[1mdeleted file mode 100644[m
[1mindex 9e123be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/lib/zlib/makefile.owc[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT)[m
[31m-[m
[31m-zlib.lib:[m
[31m-	cd $(ZLIB)[m
[31m-[m
[31m-	wcl386 -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c &[m
[31m-		compress.c inflate.c inffast.c inftrees.c[m
[31m-	wlib -n zlib.lib adler32.obj crc32.obj deflate.obj trees.obj &[m
[31m-		zutil.obj compress.obj inflate.obj inffast.obj inftrees.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/make b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/make[m
[1mdeleted file mode 100644[m
[1mindex abbf68e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/make[m
[1m+++ /dev/null[m
[36m@@ -1,725 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo "creating $NGX_MAKEFILE"[m
[31m-[m
[31m-mkdir -p $NGX_OBJS/src/core $NGX_OBJS/src/event $NGX_OBJS/src/event/modules \[m
[31m-         $NGX_OBJS/src/os/unix $NGX_OBJS/src/os/win32 \[m
[31m-         $NGX_OBJS/src/http $NGX_OBJS/src/http/v2 $NGX_OBJS/src/http/modules \[m
[31m-         $NGX_OBJS/src/http/modules/perl \[m
[31m-         $NGX_OBJS/src/mail \[m
[31m-         $NGX_OBJS/src/stream \[m
[31m-         $NGX_OBJS/src/misc[m
[31m-[m
[31m-[m
[31m-ngx_objs_dir=$NGX_OBJS$ngx_regex_dirsep[m
[31m-ngx_use_pch=`echo $NGX_USE_PCH | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-[m
[31m-cat << END                                                     > $NGX_MAKEFILE[m
[31m-[m
[31m-CC =	$CC[m
[31m-CFLAGS = $CFLAGS[m
[31m-CPP =	$CPP[m
[31m-LINK =	$LINK[m
[31m-[m
[31m-END[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    echo DTRACE = $DTRACE                   >> $NGX_MAKEFILE[m
[31m-fi[m
[31m-[m
[31m-if test -n "$NGX_PERL_CFLAGS"; then[m
[31m-    echo NGX_PERL_CFLAGS = $NGX_PERL_CFLAGS                   >> $NGX_MAKEFILE[m
[31m-    echo NGX_PM_CFLAGS = $NGX_PM_CFLAGS                       >> $NGX_MAKEFILE[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# ALL_INCS, required by the addons and by OpenWatcom C precompiled headers[m
[31m-[m
[31m-ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS $STREAM_INCS\[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-ALL_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_all_srcs="$CORE_SRCS"[m
[31m-[m
[31m-[m
[31m-# the core dependencies and include paths[m
[31m-[m
[31m-ngx_deps=`echo $CORE_DEPS $NGX_AUTO_CONFIG_H $NGX_PCH \[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-ngx_incs=`echo $CORE_INCS $NGX_OBJS \[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-CORE_DEPS = $ngx_deps[m
[31m-[m
[31m-[m
[31m-CORE_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-# the http dependencies and include paths[m
[31m-[m
[31m-if [ $HTTP = YES ]; then[m
[31m-[m
[31m-    ngx_all_srcs="$ngx_all_srcs $HTTP_SRCS"[m
[31m-[m
[31m-    ngx_deps=`echo $HTTP_DEPS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_incs=`echo $HTTP_INCS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-HTTP_DEPS = $ngx_deps[m
[31m-[m
[31m-[m
[31m-HTTP_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the mail dependencies and include paths[m
[31m-[m
[31m-if [ $MAIL != NO ]; then[m
[31m-[m
[31m-    if [ $MAIL = YES ]; then[m
[31m-        ngx_all_srcs="$ngx_all_srcs $MAIL_SRCS"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_deps=`echo $MAIL_DEPS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_incs=`echo $MAIL_INCS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-MAIL_DEPS = $ngx_deps[m
[31m-[m
[31m-[m
[31m-MAIL_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the stream dependencies and include paths[m
[31m-[m
[31m-if [ $STREAM != NO ]; then[m
[31m-[m
[31m-    if [ $STREAM = YES ]; then[m
[31m-        ngx_all_srcs="$ngx_all_srcs $STREAM_SRCS"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_deps=`echo $STREAM_DEPS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_incs=`echo $STREAM_INCS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-STREAM_DEPS = $ngx_deps[m
[31m-[m
[31m-[m
[31m-STREAM_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_all_srcs="$ngx_all_srcs $MISC_SRCS"[m
[31m-[m
[31m-[m
[31m-if test -n "$NGX_ADDON_SRCS"; then[m
[31m-[m
[31m-cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-ADDON_DEPS = \$(CORE_DEPS) $NGX_ADDON_DEPS[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# nginx[m
[31m-[m
[31m-ngx_all_srcs=`echo $ngx_all_srcs | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-for ngx_src in $NGX_ADDON_SRCS[m
[31m-do[m
[31m-    ngx_obj="addon/`basename \`dirname $ngx_src\``"[m
[31m-[m
[31m-    test -d $NGX_OBJS/$ngx_obj || mkdir -p $NGX_OBJS/$ngx_obj[m
[31m-[m
[31m-    ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \[m
[31m-        | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_all_srcs="$ngx_all_srcs $ngx_obj"[m
[31m-done[m
[31m-[m
[31m-ngx_all_objs=`echo $ngx_all_srcs \[m
[31m-    | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-          -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-          -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-          -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"`[m
[31m-[m
[31m-ngx_modules_c=`echo $NGX_MODULES_C | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-ngx_modules_obj=`echo $ngx_modules_c | sed -e "s/\(.*\.\)c/\1$ngx_objext/"`[m
[31m-[m
[31m-[m
[31m-if test -n "$NGX_RES"; then[m
[31m-   ngx_res=$NGX_RES[m
[31m-else[m
[31m-   ngx_res="$NGX_RC $NGX_ICONS"[m
[31m-   ngx_rcc=`echo $NGX_RCC | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-fi[m
[31m-[m
[31m-ngx_deps=`echo $ngx_all_objs $ngx_modules_obj $ngx_res $LINK_DEPS \[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-[m
[31m-    ngx_dtrace_obj=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.$ngx_objext[m
[31m-[m
[31m-    ngx_dtrace_h=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.h[m
[31m-[m
[31m-    ngx_dtrace_d=$NGX_OBJS${ngx_dirsep}dtrace_providers.d[m
[31m-[m
[31m-    ngx_dtrace_providers=`echo $NGX_DTRACE_PROVIDERS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-all: $NGX_OBJS${ngx_dirsep}nginx${ngx_binext}[m
[31m-[m
[31m-$ngx_dtrace_d: $ngx_dtrace_providers[m
[31m-	cat $ngx_dtrace_providers > $ngx_dtrace_d[m
[31m-[m
[31m-$ngx_dtrace_h: $ngx_dtrace_d[m
[31m-	\$(DTRACE) -h -o $ngx_dtrace_h -s $ngx_dtrace_d[m
[31m-END[m
[31m-[m
[31m-    if [ $DTRACE_PROBE_OBJ = YES ]; then[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-$ngx_dtrace_obj: $ngx_dtrace_d $ngx_deps$ngx_spacer[m
[31m-	\$(DTRACE) -G -o $ngx_dtrace_obj -s $ngx_dtrace_d $ngx_objs[m
[31m-END[m
[31m-[m
[31m-        ngx_deps="$ngx_deps$ngx_long_cont$ngx_dtrace_obj"[m
[31m-        ngx_objs="$ngx_objs$ngx_long_cont$ngx_dtrace_obj"[m
[31m-[m
[31m-        if [ "$DTRACE_FROM_SYSTEMTAP" = YES ]; then[m
[31m-            ngx_deps="$ngx_deps$ngx_long_cont$NGX_OBJS${ngx_dirsep}stap-nginx"[m
[31m-        fi[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_libs=[m
[31m-if test -n "$NGX_LD_OPT$CORE_LIBS"; then[m
[31m-    ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \[m
[31m-        | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`[m
[31m-fi[m
[31m-[m
[31m-ngx_link=${CORE_LINK:+`echo $CORE_LINK \[m
[31m-    | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}[m
[31m-[m
[31m-ngx_main_link=${MAIN_LINK:+`echo $MAIN_LINK \[m
[31m-    | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}[m
[31m-[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-build:	binary modules manpage[m
[31m-[m
[31m-binary:	$NGX_OBJS${ngx_dirsep}nginx$ngx_binext[m
[31m-[m
[31m-$NGX_OBJS${ngx_dirsep}nginx$ngx_binext:	$ngx_deps$ngx_spacer[m
[31m-	\$(LINK) $ngx_long_start$ngx_binout$NGX_OBJS${ngx_dirsep}nginx$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_main_link[m
[31m-	$ngx_rcc[m
[31m-$ngx_long_end[m
[31m-[m
[31m-modules:[m
[31m-END[m
[31m-[m
[31m-[m
[31m-# ngx_modules.c[m
[31m-[m
[31m-if test -n "$NGX_PCH"; then[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-else[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS)"[m
[31m-fi[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_modules_obj:	\$(CORE_DEPS)$ngx_cont$ngx_modules_c[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_modules_obj$ngx_tab$ngx_modules_c$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-# the core sources[m
[31m-[m
[31m-for ngx_src in $CORE_SRCS[m
[31m-do[m
[31m-    ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ngx_obj=`echo $ngx_src \[m
[31m-        | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-              -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-              -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-              -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-done[m
[31m-[m
[31m-[m
[31m-# the http sources[m
[31m-[m
[31m-if [ $HTTP = YES ]; then[m
[31m-[m
[31m-    if test -n "$NGX_PCH"; then[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-    else[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(HTTP_INCS)"[m
[31m-        ngx_perl_cc="\$(CC) $ngx_compile_opt \$(NGX_PERL_CFLAGS)"[m
[31m-        ngx_perl_cc="$ngx_perl_cc \$(CORE_INCS) \$(HTTP_INCS)"[m
[31m-    fi[m
[31m-[m
[31m-    for ngx_source in $HTTP_SRCS[m
[31m-    do[m
[31m-        ngx_src=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-        ngx_obj=`echo $ngx_src \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        if [ $ngx_source = src/http/modules/perl/ngx_http_perl_module.c ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) \$(HTTP_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_perl_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-        else[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) \$(HTTP_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        fi[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the mail sources[m
[31m-[m
[31m-if [ $MAIL = YES ]; then[m
[31m-[m
[31m-    if test -n "$NGX_PCH"; then[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-    else[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(MAIL_INCS)"[m
[31m-    fi[m
[31m-[m
[31m-    for ngx_src in $MAIL_SRCS[m
[31m-    do[m
[31m-        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-        ngx_obj=`echo $ngx_src \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) \$(MAIL_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the stream sources[m
[31m-[m
[31m-if [ $STREAM = YES ]; then[m
[31m-[m
[31m-    if test -n "$NGX_PCH"; then[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-    else[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(STREAM_INCS)"[m
[31m-    fi[m
[31m-[m
[31m-    for ngx_src in $STREAM_SRCS[m
[31m-    do[m
[31m-        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-        ngx_obj=`echo $ngx_src \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) \$(STREAM_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the misc sources[m
[31m-[m
[31m-if test -n "$MISC_SRCS"; then[m
[31m-[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-[m
[31m-    for ngx_src in $MISC_SRCS[m
[31m-    do[m
[31m-        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-        ngx_obj=`echo $ngx_src \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) $ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the addons sources[m
[31m-[m
[31m-if test -n "$NGX_ADDON_SRCS"; then[m
[31m-[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-[m
[31m-    for ngx_src in $NGX_ADDON_SRCS[m
[31m-    do[m
[31m-        ngx_obj="addon/`basename \`dirname $ngx_src\``"[m
[31m-[m
[31m-        ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \[m
[31m-            | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-        ngx_obj=`echo $ngx_obj \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(ADDON_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the addons config.make[m
[31m-[m
[31m-if test -n "$NGX_ADDONS$DYNAMIC_ADDONS"; then[m
[31m-[m
[31m-    for ngx_addon_dir in $NGX_ADDONS $DYNAMIC_ADDONS[m
[31m-    do[m
[31m-        if test -f $ngx_addon_dir/config.make; then[m
[31m-            . $ngx_addon_dir/config.make[m
[31m-        fi[m
[31m-    done[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# Win32 resource file[m
[31m-[m
[31m-if test -n "$NGX_RES"; then[m
[31m-[m
[31m-    ngx_res=`echo "$NGX_RES:	$NGX_RC $NGX_ICONS" \[m
[31m-                 | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ngx_rcc=`echo $NGX_RCC | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_res[m
[31m-	$ngx_rcc[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the precompiled headers[m
[31m-[m
[31m-if test -n "$NGX_PCH"; then[m
[31m-    echo "#include <ngx_config.h>" > $NGX_OBJS/ngx_pch.c[m
[31m-[m
[31m-    ngx_pch="src/core/ngx_config.h $OS_CONFIG $NGX_OBJS/ngx_auto_config.h"[m
[31m-    ngx_pch=`echo "$NGX_PCH:	$ngx_pch" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_src="\$(CC) \$(CFLAGS) $NGX_BUILD_PCH $ngx_compile_opt \$(ALL_INCS)"[m
[31m-    ngx_src="$ngx_src $ngx_objout$NGX_OBJS/ngx_pch.obj $NGX_OBJS/ngx_pch.c"[m
[31m-    ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_pch[m
[31m-	$ngx_src[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# dynamic modules[m
[31m-[m
[31m-if test -n "$NGX_PCH"; then[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-else[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) \$(ALL_INCS)"[m
[31m-    ngx_perl_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(NGX_PERL_CFLAGS)"[m
[31m-    ngx_perl_cc="$ngx_perl_cc \$(ALL_INCS)"[m
[31m-fi[m
[31m-[m
[31m-ngx_obj_deps="\$(CORE_DEPS)"[m
[31m-if [ $HTTP != NO ]; then[m
[31m-    ngx_obj_deps="$ngx_obj_deps \$(HTTP_DEPS)"[m
[31m-fi[m
[31m-if [ $MAIL != NO ]; then[m
[31m-    ngx_obj_deps="$ngx_obj_deps \$(MAIL_DEPS)"[m
[31m-fi[m
[31m-if [ $STREAM != NO ]; then[m
[31m-    ngx_obj_deps="$ngx_obj_deps \$(STREAM_DEPS)"[m
[31m-fi[m
[31m-[m
[31m-for ngx_module in $DYNAMIC_MODULES[m
[31m-do[m
[31m-    eval ngx_module_srcs="\$${ngx_module}_SRCS"[m
[31m-    eval eval ngx_module_libs="\\\"\$${ngx_module}_LIBS\\\""[m
[31m-[m
[31m-    eval ngx_module_modules="\$${ngx_module}_MODULES"[m
[31m-    eval ngx_module_order="\$${ngx_module}_ORDER"[m
[31m-[m
[31m-    ngx_modules_c=$NGX_OBJS/${ngx_module}_modules.c[m
[31m-[m
[31m-    cat << END                                    > $ngx_modules_c[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    for mod in $ngx_module_modules[m
[31m-    do[m
[31m-        echo "extern ngx_module_t  $mod;"         >> $ngx_modules_c[m
[31m-    done[m
[31m-[m
[31m-    echo                                          >> $ngx_modules_c[m
[31m-    echo 'ngx_module_t *ngx_modules[] = {'        >> $ngx_modules_c[m
[31m-[m
[31m-    for mod in $ngx_module_modules[m
[31m-    do[m
[31m-        echo "    &$mod,"                         >> $ngx_modules_c[m
[31m-    done[m
[31m-[m
[31m-    cat << END                                    >> $ngx_modules_c[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    echo 'char *ngx_module_names[] = {'           >> $ngx_modules_c[m
[31m-[m
[31m-    for mod in $ngx_module_modules[m
[31m-    do[m
[31m-        echo "    \"$mod\","                      >> $ngx_modules_c[m
[31m-    done[m
[31m-[m
[31m-    cat << END                                    >> $ngx_modules_c[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    echo 'char *ngx_module_order[] = {'           >> $ngx_modules_c[m
[31m-[m
[31m-    for mod in $ngx_module_order[m
[31m-    do[m
[31m-        echo "    \"$mod\","                      >> $ngx_modules_c[m
[31m-    done[m
[31m-[m
[31m-    cat << END                                    >> $ngx_modules_c[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ngx_modules_c=`echo $ngx_modules_c | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_modules_obj=`echo $ngx_modules_c \[m
[31m-        | sed -e "s/\(.*\.\)c/\1$ngx_objext/"`[m
[31m-[m
[31m-    ngx_module_objs=[m
[31m-    for ngx_src in $ngx_module_srcs[m
[31m-    do[m
[31m-        case "$ngx_src" in[m
[31m-            src/*)[m
[31m-                ngx_obj=$ngx_src[m
[31m-                ;;[m
[31m-            *)[m
[31m-                ngx_obj="addon/`basename \`dirname $ngx_src\``"[m
[31m-                mkdir -p $NGX_OBJS/$ngx_obj[m
[31m-                ngx_obj="$ngx_obj/`basename $ngx_src`"[m
[31m-                ;;[m
[31m-        esac[m
[31m-[m
[31m-        ngx_module_objs="$ngx_module_objs $ngx_obj"[m
[31m-    done[m
[31m-[m
[31m-    ngx_module_objs=`echo $ngx_module_objs \[m
[31m-        | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-              -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-              -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-              -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"`[m
[31m-[m
[31m-    ngx_deps=`echo $ngx_module_objs $ngx_modules_obj $LINK_DEPS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_objs=`echo $ngx_module_objs $ngx_modules_obj \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_obj=$NGX_OBJS$ngx_dirsep$ngx_module$ngx_modext[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-        ngx_module_libs="$CORE_LIBS $ngx_module_libs"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_libs=[m
[31m-    if test -n "$NGX_LD_OPT$ngx_module_libs"; then[m
[31m-        ngx_libs=`echo $NGX_LD_OPT $ngx_module_libs \[m
[31m-            | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`[m
[31m-    fi[m
[31m-[m
[31m-    ngx_link=${CORE_LINK:+`echo $CORE_LINK \[m
[31m-        | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}[m
[31m-[m
[31m-    ngx_module_link=${MODULE_LINK:+`echo $MODULE_LINK \[m
[31m-        | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}[m
[31m-[m
[31m-[m
[31m-    cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-modules:	$ngx_obj[m
[31m-[m
[31m-$ngx_obj:	$ngx_deps$ngx_spacer[m
[31m-	\$(LINK) $ngx_long_start$ngx_binout$ngx_obj$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_module_link[m
[31m-$ngx_long_end[m
[31m-[m
[31m-$ngx_modules_obj:	\$(CORE_DEPS)$ngx_cont$ngx_modules_c[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_modules_obj$ngx_tab$ngx_modules_c$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    for ngx_source in $ngx_module_srcs[m
[31m-    do[m
[31m-        case "$ngx_source" in[m
[31m-            src/*)[m
[31m-                ngx_obj=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-                ;;[m
[31m-            *)[m
[31m-                ngx_obj="addon/`basename \`dirname $ngx_source\``"[m
[31m-                ngx_obj=`echo $ngx_obj/\`basename $ngx_source\` \[m
[31m-                    | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-                ;;[m
[31m-        esac[m
[31m-[m
[31m-        ngx_obj=`echo $ngx_obj \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        ngx_src=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-        if [ $ngx_source = src/http/modules/perl/ngx_http_perl_module.c ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	$ngx_obj_deps$ngx_cont$ngx_src[m
[31m-	$ngx_perl_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-        else[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	$ngx_obj_deps$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        fi[m
[31m-    done[m
[31m-done[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/module b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/module[m
[1mdeleted file mode 100644[m
[1mindex 16a816f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/module[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Ruslan Ermilov[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case $ngx_module_type in[m
[31m-    HTTP_*) ngx_var=HTTP ;;[m
[31m-    *)      ngx_var=$ngx_module_type ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ "$ngx_module_link" = DYNAMIC ]; then[m
[31m-[m
[31m-    for ngx_module in $ngx_module_name; do[m
[31m-        # extract the first name[m
[31m-        break[m
[31m-    done[m
[31m-[m
[31m-    DYNAMIC_MODULES="$DYNAMIC_MODULES $ngx_module"[m
[31m-    eval ${ngx_module}_SRCS=\"$ngx_module_srcs\"[m
[31m-[m
[31m-    eval ${ngx_module}_MODULES=\"$ngx_module_name\"[m
[31m-[m
[31m-    if [ -z "$ngx_module_order" -a \[m
[31m-         \( "$ngx_module_type" = "HTTP_FILTER" \[m
[31m-         -o "$ngx_module_type" = "HTTP_AUX_FILTER" \) ][m
[31m-    then[m
[31m-        eval ${ngx_module}_ORDER=\"$ngx_module_name \[m
[31m-                                   ngx_http_copy_filter_module\"[m
[31m-    else[m
[31m-        eval ${ngx_module}_ORDER=\"$ngx_module_order\"[m
[31m-    fi[m
[31m-[m
[31m-    if test -n "$ngx_module_incs"; then[m
[31m-        CORE_INCS="$CORE_INCS $ngx_module_incs"[m
[31m-    fi[m
[31m-[m
[31m-    libs=[m
[31m-    for lib in $ngx_module_libs[m
[31m-    do[m
[31m-        case $lib in[m
[31m-[m
[31m-            LIBXSLT | LIBGD | GEOIP | PERL)[m
[31m-                libs="$libs \$NGX_LIB_$lib"[m
[31m-[m
[31m-                if eval [ "\$USE_${lib}" = NO ] ; then[m
[31m-                    eval USE_${lib}=DYNAMIC[m
[31m-                fi[m
[31m-            ;;[m
[31m-[m
[31m-            PCRE | OPENSSL | MD5 | SHA1 | ZLIB)[m
[31m-                eval USE_${lib}=YES[m
[31m-            ;;[m
[31m-[m
[31m-            *)[m
[31m-                libs="$libs $lib"[m
[31m-            ;;[m
[31m-[m
[31m-        esac[m
[31m-    done[m
[31m-    eval ${ngx_module}_LIBS=\'$libs\'[m
[31m-[m
[31m-elif [ "$ngx_module_link" = YES ]; then[m
[31m-[m
[31m-    eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \[m
[31m-                                      $ngx_module_name\"[m
[31m-[m
[31m-    eval ${ngx_var}_SRCS=\"\$${ngx_var}_SRCS $ngx_module_srcs\"[m
[31m-[m
[31m-    if test -n "$ngx_module_incs"; then[m
[31m-        eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\"[m
[31m-    fi[m
[31m-[m
[31m-    if test -n "$ngx_module_deps"; then[m
[31m-        eval ${ngx_var}_DEPS=\"\$${ngx_var}_DEPS $ngx_module_deps\"[m
[31m-    fi[m
[31m-[m
[31m-    for lib in $ngx_module_libs[m
[31m-    do[m
[31m-        case $lib in[m
[31m-[m
[31m-            PCRE | OPENSSL | MD5 | SHA1 | ZLIB | LIBXSLT | LIBGD | PERL | GEOIP)[m
[31m-                eval USE_${lib}=YES[m
[31m-            ;;[m
[31m-[m
[31m-            *)[m
[31m-                CORE_LIBS="$CORE_LIBS $lib"[m
[31m-            ;;[m
[31m-[m
[31m-        esac[m
[31m-    done[m
[31m-[m
[31m-elif [ "$ngx_module_link" = ADDON ]; then[m
[31m-[m
[31m-    eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \[m
[31m-                                      $ngx_module_name\"[m
[31m-[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_module_srcs"[m
[31m-[m
[31m-    if test -n "$ngx_module_incs"; then[m
[31m-        eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\"[m
[31m-    fi[m
[31m-[m
[31m-    if test -n "$ngx_module_deps"; then[m
[31m-        NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_module_deps"[m
[31m-    fi[m
[31m-[m
[31m-    for lib in $ngx_module_libs[m
[31m-    do[m
[31m-        case $lib in[m
[31m-[m
[31m-            PCRE | OPENSSL | MD5 | SHA1 | ZLIB | LIBXSLT | LIBGD | PERL | GEOIP)[m
[31m-                eval USE_${lib}=YES[m
[31m-            ;;[m
[31m-[m
[31m-            *)[m
[31m-                CORE_LIBS="$CORE_LIBS $lib"[m
[31m-            ;;[m
[31m-[m
[31m-        esac[m
[31m-    done[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/modules b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/modules[m
[1mdeleted file mode 100644[m
[1mindex 5a82885..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/modules[m
[1m+++ /dev/null[m
[36m@@ -1,1272 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $EVENT_SELECT = NO -a $EVENT_FOUND = NO ]; then[m
[31m-    EVENT_SELECT=YES[m
[31m-fi[m
[31m-[m
[31m-if [ $EVENT_SELECT = YES ]; then[m
[31m-    have=NGX_HAVE_SELECT . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $SELECT_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $EVENT_POLL = NO -a $EVENT_FOUND = NO ]; then[m
[31m-    EVENT_POLL=YES[m
[31m-fi[m
[31m-[m
[31m-if [ $EVENT_POLL = YES ]; then[m
[31m-    have=NGX_HAVE_POLL . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $POLL_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $POLL_MODULE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $NGX_TEST_BUILD_DEVPOLL = YES ]; then[m
[31m-    have=NGX_HAVE_DEVPOLL . auto/have[m
[31m-    have=NGX_TEST_BUILD_DEVPOLL . auto/have[m
[31m-    EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE"[m
[31m-    CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $NGX_TEST_BUILD_EVENTPORT = YES ]; then[m
[31m-    have=NGX_HAVE_EVENTPORT . auto/have[m
[31m-    have=NGX_TEST_BUILD_EVENTPORT . auto/have[m
[31m-    EVENT_MODULES="$EVENT_MODULES $EVENTPORT_MODULE"[m
[31m-    CORE_SRCS="$CORE_SRCS $EVENTPORT_SRCS"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_TEST_BUILD_EPOLL = YES ]; then[m
[31m-    have=NGX_HAVE_EPOLL . auto/have[m
[31m-    have=NGX_HAVE_EPOLLRDHUP . auto/have[m
[31m-    have=NGX_HAVE_EVENTFD . auto/have[m
[31m-    have=NGX_TEST_BUILD_EPOLL . auto/have[m
[31m-    EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE"[m
[31m-    CORE_SRCS="$CORE_SRCS $EPOLL_SRCS"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_TEST_BUILD_SOLARIS_SENDFILEV = YES ]; then[m
[31m-    have=NGX_TEST_BUILD_SOLARIS_SENDFILEV . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-HTTP_MODULES=[m
[31m-HTTP_DEPS=[m
[31m-HTTP_INCS=[m
[31m-[m
[31m-ngx_module_type=HTTP[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name="ngx_http_module \[m
[31m-                     ngx_http_core_module \[m
[31m-                     ngx_http_log_module \[m
[31m-                     ngx_http_upstream_module"[m
[31m-    ngx_module_incs="src/http src/http/modules"[m
[31m-    ngx_module_deps="src/http/ngx_http.h \[m
[31m-                     src/http/ngx_http_request.h \[m
[31m-                     src/http/ngx_http_config.h \[m
[31m-                     src/http/ngx_http_core_module.h \[m
[31m-                     src/http/ngx_http_cache.h \[m
[31m-                     src/http/ngx_http_variables.h \[m
[31m-                     src/http/ngx_http_script.h \[m
[31m-                     src/http/ngx_http_upstream.h \[m
[31m-                     src/http/ngx_http_upstream_round_robin.h \[m
[31m-                     src/http/ngx_http_probe.h"[m
[31m-    ngx_module_srcs="src/http/ngx_http.c \[m
[31m-                     src/http/ngx_http_core_module.c \[m
[31m-                     src/http/ngx_http_special_response.c \[m
[31m-                     src/http/ngx_http_request.c \[m
[31m-                     src/http/ngx_http_parse.c \[m
[31m-                     src/http/modules/ngx_http_log_module.c \[m
[31m-                     src/http/ngx_http_request_body.c \[m
[31m-                     src/http/ngx_http_variables.c \[m
[31m-                     src/http/ngx_http_script.c \[m
[31m-                     src/http/ngx_http_upstream.c \[m
[31m-                     src/http/ngx_http_upstream_round_robin.c"[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP != YES ]; then[m
[31m-    have=NGX_CRYPT . auto/nohave[m
[31m-    CRYPT_LIB=[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP_CACHE = YES ]; then[m
[31m-    USE_MD5=YES[m
[31m-    have=NGX_HTTP_CACHE . auto/have[m
[31m-    HTTP_SRCS="$HTTP_SRCS $HTTP_FILE_CACHE_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP_SSI = YES ]; then[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP_SLICE = YES ]; then[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP_ADDITION = YES ]; then[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the module order is important[m
[31m-#     ngx_http_static_module[m
[31m-#     ngx_http_gzip_static_module[m
[31m-#     ngx_http_dav_module[m
[31m-#     ngx_http_autoindex_module[m
[31m-#     ngx_http_index_module[m
[31m-#     ngx_http_random_index_module[m
[31m-#[m
[31m-#     ngx_http_access_module[m
[31m-#     ngx_http_realip_module[m
[31m-#[m
[31m-#[m
[31m-# the filter order is important[m
[31m-#     ngx_http_write_filter[m
[31m-#     ngx_http_header_filter[m
[31m-#     ngx_http_chunked_filter[m
[31m-#     ngx_http_v2_filter[m
[31m-#     ngx_http_range_header_filter[m
[31m-#     ngx_http_gzip_filter[m
[31m-#     ngx_http_postpone_filter[m
[31m-#     ngx_http_ssi_filter[m
[31m-#     ngx_http_charset_filter[m
[31m-#         ngx_http_xslt_filter[m
[31m-#         ngx_http_image_filter[m
[31m-#         ngx_http_sub_filter[m
[31m-#         ngx_http_addition_filter[m
[31m-#         ngx_http_gunzip_filter[m
[31m-#         ngx_http_userid_filter[m
[31m-#         ngx_http_headers_filter[m
[31m-#     ngx_http_copy_filter[m
[31m-#     ngx_http_range_body_filter[m
[31m-#     ngx_http_not_modified_filter[m
[31m-#     ngx_http_slice_filter[m
[31m-[m
[31m-ngx_module_type=HTTP_FILTER[m
[31m-HTTP_FILTER_MODULES=[m
[31m-[m
[31m-ngx_module_order="ngx_http_static_module \[m
[31m-                  ngx_http_gzip_static_module \[m
[31m-                  ngx_http_dav_module \[m
[31m-                  ngx_http_autoindex_module \[m
[31m-                  ngx_http_index_module \[m
[31m-                  ngx_http_random_index_module \[m
[31m-                  ngx_http_access_module \[m
[31m-                  ngx_http_realip_module \[m
[31m-                  ngx_http_write_filter_module \[m
[31m-                  ngx_http_header_filter_module \[m
[31m-                  ngx_http_chunked_filter_module \[m
[31m-                  ngx_http_v2_filter_module \[m
[31m-                  ngx_http_range_header_filter_module \[m
[31m-                  ngx_http_gzip_filter_module \[m
[31m-                  ngx_http_postpone_filter_module \[m
[31m-                  ngx_http_ssi_filter_module \[m
[31m-                  ngx_http_charset_filter_module \[m
[31m-                  ngx_http_xslt_filter_module \[m
[31m-                  ngx_http_image_filter_module \[m
[31m-                  ngx_http_sub_filter_module \[m
[31m-                  ngx_http_addition_filter_module \[m
[31m-                  ngx_http_gunzip_filter_module \[m
[31m-                  ngx_http_userid_filter_module \[m
[31m-                  ngx_http_headers_filter_module \[m
[31m-                  ngx_http_copy_filter_module \[m
[31m-                  ngx_http_range_body_filter_module \[m
[31m-                  ngx_http_not_modified_filter_module \[m
[31m-                  ngx_http_slice_filter_module"[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_write_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/ngx_http_write_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_header_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/ngx_http_header_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_chunked_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_chunked_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_V2 = YES ]; then[m
[31m-    ngx_module_name=ngx_http_v2_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/v2/ngx_http_v2_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_V2[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_range_header_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_range_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GZIP = YES ]; then[m
[31m-    have=NGX_HTTP_GZIP . auto/have[m
[31m-    USE_ZLIB=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_gzip_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_gzip_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_GZIP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_POSTPONE = YES ]; then[m
[31m-    ngx_module_name=ngx_http_postpone_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/ngx_http_postpone_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_POSTPONE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SSI = YES ]; then[m
[31m-    have=NGX_HTTP_SSI . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_ssi_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=src/http/modules/ngx_http_ssi_filter_module.h[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_ssi_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SSI[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_CHARSET = YES ]; then[m
[31m-    ngx_module_name=ngx_http_charset_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_charset_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_CHARSET[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_XSLT != NO ]; then[m
[31m-    ngx_module_name=ngx_http_xslt_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_xslt_filter_module.c[m
[31m-    ngx_module_libs=LIBXSLT[m
[31m-    ngx_module_link=$HTTP_XSLT[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_IMAGE_FILTER != NO ]; then[m
[31m-    ngx_module_name=ngx_http_image_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_image_filter_module.c[m
[31m-    ngx_module_libs=LIBGD[m
[31m-    ngx_module_link=$HTTP_IMAGE_FILTER[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SUB = YES ]; then[m
[31m-    ngx_module_name=ngx_http_sub_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_sub_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SUB[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_ADDITION = YES ]; then[m
[31m-    ngx_module_name=ngx_http_addition_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_addition_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_ADDITION[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GUNZIP = YES ]; then[m
[31m-    have=NGX_HTTP_GZIP . auto/have[m
[31m-    USE_ZLIB=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_gunzip_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_gunzip_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_GUNZIP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_USERID = YES ]; then[m
[31m-    ngx_module_name=ngx_http_userid_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_userid_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_USERID[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_headers_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_headers_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_module_type=HTTP_INIT_FILTER[m
[31m-HTTP_INIT_FILTER_MODULES=[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_copy_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/ngx_http_copy_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_range_body_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_not_modified_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_not_modified_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SLICE = YES ]; then[m
[31m-    ngx_module_name=ngx_http_slice_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_slice_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SLICE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_module_type=HTTP[m
[31m-[m
[31m-if [ $HTTP_V2 = YES ]; then[m
[31m-    have=NGX_HTTP_V2 . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_v2_module[m
[31m-    ngx_module_incs=src/http/v2[m
[31m-    ngx_module_deps="src/http/v2/ngx_http_v2.h src/http/v2/ngx_http_v2_module.h"[m
[31m-    ngx_module_srcs="src/http/v2/ngx_http_v2.c \[m
[31m-                     src/http/v2/ngx_http_v2_table.c \[m
[31m-                     src/http/v2/ngx_http_v2_huff_decode.c \[m
[31m-                     src/http/v2/ngx_http_v2_huff_encode.c \[m
[31m-                     src/http/v2/ngx_http_v2_module.c"[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_V2[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_static_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_static_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GZIP_STATIC = YES ]; then[m
[31m-    have=NGX_HTTP_GZIP . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_gzip_static_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_gzip_static_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_GZIP_STATIC[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_DAV = YES ]; then[m
[31m-    have=NGX_HTTP_DAV . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_dav_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_dav_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_DAV[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_AUTOINDEX = YES ]; then[m
[31m-    ngx_module_name=ngx_http_autoindex_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_autoindex_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_AUTOINDEX[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_index_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_index_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_RANDOM_INDEX = YES ]; then[m
[31m-    ngx_module_name=ngx_http_random_index_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_random_index_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_RANDOM_INDEX[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_AUTH_REQUEST = YES ]; then[m
[31m-    ngx_module_name=ngx_http_auth_request_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_auth_request_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_AUTH_REQUEST[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_AUTH_BASIC = YES ]; then[m
[31m-    USE_MD5=YES[m
[31m-    USE_SHA1=YES[m
[31m-    have=NGX_CRYPT . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_auth_basic_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_auth_basic_module.c[m
[31m-    ngx_module_libs=$CRYPT_LIB[m
[31m-    ngx_module_link=$HTTP_AUTH_BASIC[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_ACCESS = YES ]; then[m
[31m-    ngx_module_name=ngx_http_access_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_access_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_ACCESS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_LIMIT_CONN = YES ]; then[m
[31m-    ngx_module_name=ngx_http_limit_conn_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_limit_conn_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_LIMIT_CONN[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_LIMIT_REQ = YES ]; then[m
[31m-    ngx_module_name=ngx_http_limit_req_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_limit_req_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_LIMIT_REQ[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_REALIP = YES ]; then[m
[31m-    have=NGX_HTTP_REALIP . auto/have[m
[31m-    have=NGX_HTTP_X_FORWARDED_FOR . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_realip_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_realip_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_REALIP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_STATUS = YES ]; then[m
[31m-    ngx_module_name=ngx_http_status_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_status_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_STATUS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GEO = YES ]; then[m
[31m-    have=NGX_HTTP_X_FORWARDED_FOR . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_geo_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_geo_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_GEO[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GEOIP != NO ]; then[m
[31m-    have=NGX_HTTP_X_FORWARDED_FOR . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_geoip_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_geoip_module.c[m
[31m-    ngx_module_libs=GEOIP[m
[31m-    ngx_module_link=$HTTP_GEOIP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_MAP = YES ]; then[m
[31m-    ngx_module_name=ngx_http_map_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_map_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_MAP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SPLIT_CLIENTS = YES ]; then[m
[31m-    ngx_module_name=ngx_http_split_clients_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_split_clients_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SPLIT_CLIENTS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_REFERER = YES ]; then[m
[31m-    ngx_module_name=ngx_http_referer_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_referer_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_REFERER[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_REWRITE = YES -a $USE_PCRE != DISABLED ]; then[m
[31m-    USE_PCRE=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_rewrite_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_rewrite_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_REWRITE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SSL = YES ]; then[m
[31m-    USE_OPENSSL=YES[m
[31m-    have=NGX_HTTP_SSL . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_ssl_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=src/http/modules/ngx_http_ssl_module.h[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_ssl_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SSL[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_PROXY = YES ]; then[m
[31m-    have=NGX_HTTP_X_FORWARDED_FOR . auto/have[m
[31m-    #USE_MD5=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_proxy_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_proxy_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_PROXY[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_FASTCGI = YES ]; then[m
[31m-    ngx_module_name=ngx_http_fastcgi_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_fastcgi_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_FASTCGI[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UWSGI = YES ]; then[m
[31m-    ngx_module_name=ngx_http_uwsgi_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_uwsgi_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UWSGI[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SCGI = YES ]; then[m
[31m-    ngx_module_name=ngx_http_scgi_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_scgi_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SCGI[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_PERL != NO ]; then[m
[31m-    ngx_module_name=ngx_http_perl_module[m
[31m-    ngx_module_incs=src/http/modules/perl[m
[31m-    ngx_module_deps=src/http/modules/perl/ngx_http_perl_module.h[m
[31m-    ngx_module_srcs=src/http/modules/perl/ngx_http_perl_module.c[m
[31m-    ngx_module_libs=PERL[m
[31m-    ngx_module_link=$HTTP_PERL[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_MEMCACHED = YES ]; then[m
[31m-    ngx_module_name=ngx_http_memcached_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_memcached_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_MEMCACHED[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_EMPTY_GIF = YES ]; then[m
[31m-    ngx_module_name=ngx_http_empty_gif_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_empty_gif_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_EMPTY_GIF[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_BROWSER = YES ]; then[m
[31m-    ngx_module_name=ngx_http_browser_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_browser_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_BROWSER[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SECURE_LINK = YES ]; then[m
[31m-    USE_MD5=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_secure_link_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_secure_link_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SECURE_LINK[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_DEGRADATION = YES ]; then[m
[31m-    have=NGX_HTTP_DEGRADATION . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_degradation_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_degradation_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_DEGRADATION[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_FLV = YES ]; then[m
[31m-    ngx_module_name=ngx_http_flv_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_flv_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_FLV[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_MP4 = YES ]; then[m
[31m-    ngx_module_name=ngx_http_mp4_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_mp4_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_MP4[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_HASH = YES ]; then[m
[31m-    ngx_module_name=ngx_http_upstream_hash_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_hash_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_HASH[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_IP_HASH = YES ]; then[m
[31m-    ngx_module_name=ngx_http_upstream_ip_hash_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_ip_hash_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_IP_HASH[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_LEAST_CONN = YES ]; then[m
[31m-    ngx_module_name=ngx_http_upstream_least_conn_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_least_conn_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_LEAST_CONN[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_KEEPALIVE = YES ]; then[m
[31m-    ngx_module_name=ngx_http_upstream_keepalive_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_keepalive_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_KEEPALIVE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_ZONE = YES ]; then[m
[31m-    have=NGX_HTTP_UPSTREAM_ZONE . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_upstream_zone_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_zone_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_ZONE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_STUB_STATUS = YES ]; then[m
[31m-    have=NGX_STAT_STUB . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_stub_status_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_stub_status_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_STUB_STATUS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $MAIL != NO ]; then[m
[31m-    MAIL_MODULES=[m
[31m-    MAIL_DEPS=[m
[31m-    MAIL_INCS=[m
[31m-[m
[31m-    ngx_module_type=MAIL[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    ngx_module_order=[m
[31m-[m
[31m-    ngx_module_name="ngx_mail_module ngx_mail_core_module"[m
[31m-    ngx_module_incs="src/mail"[m
[31m-    ngx_module_deps="src/mail/ngx_mail.h"[m
[31m-    ngx_module_srcs="src/mail/ngx_mail.c \[m
[31m-                     src/mail/ngx_mail_core_module.c \[m
[31m-                     src/mail/ngx_mail_handler.c \[m
[31m-                     src/mail/ngx_mail_parse.c"[m
[31m-[m
[31m-    . auto/module[m
[31m-[m
[31m-    ngx_module_incs=[m
[31m-[m
[31m-    if [ $MAIL_SSL = YES ]; then[m
[31m-        USE_OPENSSL=YES[m
[31m-        have=NGX_MAIL_SSL . auto/have[m
[31m-[m
[31m-        ngx_module_name=ngx_mail_ssl_module[m
[31m-        ngx_module_deps=src/mail/ngx_mail_ssl_module.h[m
[31m-        ngx_module_srcs=src/mail/ngx_mail_ssl_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $MAIL_POP3 = YES ]; then[m
[31m-        ngx_module_name=ngx_mail_pop3_module[m
[31m-        ngx_module_deps=src/mail/ngx_mail_pop3_module.h[m
[31m-        ngx_module_srcs="src/mail/ngx_mail_pop3_module.c \[m
[31m-                         src/mail/ngx_mail_pop3_handler.c"[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $MAIL_IMAP = YES ]; then[m
[31m-        ngx_module_name=ngx_mail_imap_module[m
[31m-        ngx_module_deps=src/mail/ngx_mail_imap_module.h[m
[31m-        ngx_module_srcs="src/mail/ngx_mail_imap_module.c \[m
[31m-                         src/mail/ngx_mail_imap_handler.c"[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $MAIL_SMTP = YES ]; then[m
[31m-        ngx_module_name=ngx_mail_smtp_module[m
[31m-        ngx_module_deps=src/mail/ngx_mail_smtp_module.h[m
[31m-        ngx_module_srcs="src/mail/ngx_mail_smtp_module.c \[m
[31m-                         src/mail/ngx_mail_smtp_handler.c"[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    ngx_module_name=ngx_mail_auth_http_module[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/mail/ngx_mail_auth_http_module.c[m
[31m-[m
[31m-    . auto/module[m
[31m-[m
[31m-    ngx_module_name=ngx_mail_proxy_module[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/mail/ngx_mail_proxy_module.c[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $STREAM != NO ]; then[m
[31m-    STREAM_MODULES=[m
[31m-    STREAM_DEPS=[m
[31m-    STREAM_INCS=[m
[31m-[m
[31m-    ngx_module_type=STREAM[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    ngx_module_order=[m
[31m-[m
[31m-    ngx_module_name="ngx_stream_module \[m
[31m-                     ngx_stream_core_module \[m
[31m-                     ngx_stream_proxy_module \[m
[31m-                     ngx_stream_upstream_module"[m
[31m-    ngx_module_incs="src/stream"[m
[31m-    ngx_module_deps="src/stream/ngx_stream.h \[m
[31m-                     src/stream/ngx_stream_upstream.h \[m
[31m-                     src/stream/ngx_stream_upstream_round_robin.h"[m
[31m-    ngx_module_srcs="src/stream/ngx_stream.c \[m
[31m-                     src/stream/ngx_stream_handler.c \[m
[31m-                     src/stream/ngx_stream_core_module.c \[m
[31m-                     src/stream/ngx_stream_proxy_module.c \[m
[31m-                     src/stream/ngx_stream_upstream.c \[m
[31m-                     src/stream/ngx_stream_upstream_round_robin.c"[m
[31m-[m
[31m-    . auto/module[m
[31m-[m
[31m-    ngx_module_incs=[m
[31m-[m
[31m-    if [ $STREAM_SSL = YES ]; then[m
[31m-        USE_OPENSSL=YES[m
[31m-        have=NGX_STREAM_SSL . auto/have[m
[31m-[m
[31m-        ngx_module_name=ngx_stream_ssl_module[m
[31m-        ngx_module_deps=src/stream/ngx_stream_ssl_module.h[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_ssl_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_LIMIT_CONN = YES ]; then[m
[31m-        ngx_module_name=ngx_stream_limit_conn_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_limit_conn_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_ACCESS = YES ]; then[m
[31m-        ngx_module_name=ngx_stream_access_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_access_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_UPSTREAM_HASH = YES ]; then[m
[31m-        ngx_module_name=ngx_stream_upstream_hash_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_upstream_hash_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_UPSTREAM_LEAST_CONN = YES ]; then[m
[31m-        ngx_module_name=ngx_stream_upstream_least_conn_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_upstream_least_conn_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_UPSTREAM_ZONE = YES ]; then[m
[31m-        have=NGX_STREAM_UPSTREAM_ZONE . auto/have[m
[31m-[m
[31m-        ngx_module_name=ngx_stream_upstream_zone_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_upstream_zone_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-#if [ -r $NGX_OBJS/auto ]; then[m
[31m-#    . $NGX_OBJS/auto[m
[31m-#fi[m
[31m-[m
[31m-[m
[31m-if test -n "$NGX_ADDONS"; then[m
[31m-[m
[31m-    echo configuring additional modules[m
[31m-[m
[31m-    for ngx_addon_dir in $NGX_ADDONS[m
[31m-    do[m
[31m-        echo "adding module in $ngx_addon_dir"[m
[31m-[m
[31m-        ngx_module_type=[m
[31m-        ngx_module_name=[m
[31m-        ngx_module_incs=[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=[m
[31m-        ngx_module_libs=[m
[31m-        ngx_module_order=[m
[31m-        ngx_module_link=ADDON[m
[31m-[m
[31m-        if test -f $ngx_addon_dir/config; then[m
[31m-            . $ngx_addon_dir/config[m
[31m-[m
[31m-            echo " + $ngx_addon_name was configured"[m
[31m-[m
[31m-        else[m
[31m-            echo "$0: error: no $ngx_addon_dir/config was found"[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    done[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if test -n "$DYNAMIC_ADDONS"; then[m
[31m-[m
[31m-    echo configuring additional dynamic modules[m
[31m-[m
[31m-    for ngx_addon_dir in $DYNAMIC_ADDONS[m
[31m-    do[m
[31m-        echo "adding module in $ngx_addon_dir"[m
[31m-[m
[31m-        ngx_module_type=[m
[31m-        ngx_module_name=[m
[31m-        ngx_module_incs=[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=[m
[31m-        ngx_module_libs=[m
[31m-        ngx_module_order=[m
[31m-        ngx_module_link=DYNAMIC[m
[31m-[m
[31m-        if test -f $ngx_addon_dir/config; then[m
[31m-            . $ngx_addon_dir/config[m
[31m-[m
[31m-            echo " + $ngx_addon_name was configured"[m
[31m-[m
[31m-        else[m
[31m-            echo "$0: error: no $ngx_addon_dir/config was found"[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    done[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $USE_OPENSSL = YES ]; then[m
[31m-    ngx_module_type=CORE[m
[31m-    ngx_module_name=ngx_openssl_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=src/event/ngx_event_openssl.h[m
[31m-    ngx_module_srcs="src/event/ngx_event_openssl.c[m
[31m-                     src/event/ngx_event_openssl_stapling.c"[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-    ngx_module_order=[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $USE_PCRE = YES ]; then[m
[31m-    ngx_module_type=CORE[m
[31m-    ngx_module_name=ngx_regex_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=src/core/ngx_regex.h[m
[31m-    ngx_module_srcs=src/core/ngx_regex.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-    ngx_module_order=[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-modules="$CORE_MODULES $EVENT_MODULES"[m
[31m-[m
[31m-[m
[31m-# thread pool module should be initialized after events[m
[31m-if [ $USE_THREADS = YES ]; then[m
[31m-    modules="$modules $THREAD_POOL_MODULE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP = YES ]; then[m
[31m-    modules="$modules $HTTP_MODULES $HTTP_FILTER_MODULES \[m
[31m-             $HTTP_AUX_FILTER_MODULES $HTTP_INIT_FILTER_MODULES"[m
[31m-[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(HTTP_DEPS)"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $MAIL != NO ]; then[m
[31m-[m
[31m-    if [ $MAIL = YES ]; then[m
[31m-        modules="$modules $MAIL_MODULES"[m
[31m-[m
[31m-    elif [ $MAIL = DYNAMIC ]; then[m
[31m-        ngx_module_name=$MAIL_MODULES[m
[31m-        ngx_module_incs=[m
[31m-        ngx_module_deps=$MAIL_DEPS[m
[31m-        ngx_module_srcs=$MAIL_SRCS[m
[31m-        ngx_module_libs=[m
[31m-        ngx_module_link=DYNAMIC[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(MAIL_DEPS)"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $STREAM != NO ]; then[m
[31m-[m
[31m-    if [ $STREAM = YES ]; then[m
[31m-        modules="$modules $STREAM_MODULES"[m
[31m-[m
[31m-    elif [ $STREAM = DYNAMIC ]; then[m
[31m-        ngx_module_name=$STREAM_MODULES[m
[31m-        ngx_module_incs=[m
[31m-        ngx_module_deps=$STREAM_DEPS[m
[31m-        ngx_module_srcs=$STREAM_SRCS[m
[31m-        ngx_module_libs=[m
[31m-        ngx_module_link=DYNAMIC[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(STREAM_DEPS)"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_module_type=MISC[m
[31m-MISC_MODULES=[m
[31m-[m
[31m-if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then[m
[31m-    ngx_module_name=ngx_google_perftools_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/misc/ngx_google_perftools_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$NGX_GOOGLE_PERFTOOLS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_CPP_TEST = YES ]; then[m
[31m-    ngx_module_name=[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/misc/ngx_cpp_test_module.cpp[m
[31m-    ngx_module_libs=-lstdc++[m
[31m-    ngx_module_link=$NGX_CPP_TEST[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-modules="$modules $MISC_MODULES"[m
[31m-[m
[31m-[m
[31m-cat << END                                    > $NGX_MODULES_C[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-$NGX_PRAGMA[m
[31m-[m
[31m-END[m
[31m-[m
[31m-for mod in $modules[m
[31m-do[m
[31m-    echo "extern ngx_module_t  $mod;"         >> $NGX_MODULES_C[m
[31m-done[m
[31m-[m
[31m-echo                                          >> $NGX_MODULES_C[m
[31m-echo 'ngx_module_t *ngx_modules[] = {'        >> $NGX_MODULES_C[m
[31m-[m
[31m-for mod in $modules[m
[31m-do[m
[31m-    echo "    &$mod,"                         >> $NGX_MODULES_C[m
[31m-done[m
[31m-[m
[31m-cat << END                                    >> $NGX_MODULES_C[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[31m-[m
[31m-echo 'char *ngx_module_names[] = {'           >> $NGX_MODULES_C[m
[31m-[m
[31m-for mod in $modules[m
[31m-do[m
[31m-    echo "    \"$mod\","                      >> $NGX_MODULES_C[m
[31m-done[m
[31m-[m
[31m-cat << END                                    >> $NGX_MODULES_C[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/nohave b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/nohave[m
[1mdeleted file mode 100644[m
[1mindex dfb1718..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/nohave[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $have[m
[31m-#define $have  0[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/options b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/options[m
[1mdeleted file mode 100644[m
[1mindex aed0343..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/options[m
[1m+++ /dev/null[m
[36m@@ -1,608 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-help=no[m
[31m-[m
[31m-NGX_PREFIX=[m
[31m-NGX_SBIN_PATH=[m
[31m-NGX_MODULES_PATH=[m
[31m-NGX_CONF_PREFIX=[m
[31m-NGX_CONF_PATH=[m
[31m-NGX_ERROR_LOG_PATH=[m
[31m-NGX_PID_PATH=[m
[31m-NGX_LOCK_PATH=[m
[31m-NGX_TAPSET_PREFIX=[m
[31m-NGX_STAP_NGX_PATH=[m
[31m-NGX_USER=[m
[31m-NGX_GROUP=[m
[31m-NGX_BUILD=[m
[31m-[m
[31m-CC=${CC:-cc}[m
[31m-CPP=[m
[31m-NGX_OBJS=objs[m
[31m-[m
[31m-NGX_DEBUG=NO[m
[31m-NGX_DTRACE=NO[m
[31m-DTRACE=dtrace[m
[31m-[m
[31m-DTRACE_PROBE_OBJ=YES[m
[31m-DTRACE_FROM_SYSTEMTAP=NO[m
[31m-[m
[31m-NGX_CC_OPT=[m
[31m-NGX_LD_OPT=[m
[31m-CPU=NO[m
[31m-[m
[31m-NGX_RPATH=NO[m
[31m-[m
[31m-NGX_TEST_BUILD_DEVPOLL=NO[m
[31m-NGX_TEST_BUILD_EVENTPORT=NO[m
[31m-NGX_TEST_BUILD_EPOLL=NO[m
[31m-NGX_TEST_BUILD_SOLARIS_SENDFILEV=NO[m
[31m-[m
[31m-NGX_PLATFORM=[m
[31m-NGX_WINE=[m
[31m-[m
[31m-EVENT_FOUND=NO[m
[31m-[m
[31m-EVENT_SELECT=NO[m
[31m-EVENT_POLL=NO[m
[31m-[m
[31m-USE_THREADS=NO[m
[31m-[m
[31m-NGX_FILE_AIO=NO[m
[31m-NGX_IPV6=NO[m
[31m-[m
[31m-HTTP=YES[m
[31m-[m
[31m-NGX_HTTP_LOG_PATH=[m
[31m-NGX_HTTP_CLIENT_TEMP_PATH=[m
[31m-NGX_HTTP_PROXY_TEMP_PATH=[m
[31m-NGX_HTTP_FASTCGI_TEMP_PATH=[m
[31m-NGX_HTTP_UWSGI_TEMP_PATH=[m
[31m-NGX_HTTP_SCGI_TEMP_PATH=[m
[31m-[m
[31m-HTTP_CACHE=YES[m
[31m-HTTP_CHARSET=YES[m
[31m-HTTP_GZIP=YES[m
[31m-HTTP_SSL=NO[m
[31m-HTTP_V2=NO[m
[31m-HTTP_SSI=YES[m
[31m-HTTP_POSTPONE=NO[m
[31m-HTTP_REALIP=NO[m
[31m-HTTP_XSLT=NO[m
[31m-HTTP_IMAGE_FILTER=NO[m
[31m-HTTP_SUB=NO[m
[31m-HTTP_ADDITION=NO[m
[31m-HTTP_DAV=NO[m
[31m-HTTP_ACCESS=YES[m
[31m-HTTP_AUTH_BASIC=YES[m
[31m-HTTP_AUTH_REQUEST=NO[m
[31m-HTTP_USERID=YES[m
[31m-HTTP_SLICE=NO[m
[31m-HTTP_AUTOINDEX=YES[m
[31m-HTTP_RANDOM_INDEX=NO[m
[31m-HTTP_STATUS=NO[m
[31m-HTTP_GEO=YES[m
[31m-HTTP_GEOIP=NO[m
[31m-HTTP_MAP=YES[m
[31m-HTTP_SPLIT_CLIENTS=YES[m
[31m-HTTP_REFERER=YES[m
[31m-HTTP_REWRITE=YES[m
[31m-HTTP_PROXY=YES[m
[31m-HTTP_FASTCGI=YES[m
[31m-HTTP_UWSGI=YES[m
[31m-HTTP_SCGI=YES[m
[31m-HTTP_PERL=NO[m
[31m-HTTP_MEMCACHED=YES[m
[31m-HTTP_LIMIT_CONN=YES[m
[31m-HTTP_LIMIT_REQ=YES[m
[31m-HTTP_EMPTY_GIF=YES[m
[31m-HTTP_BROWSER=YES[m
[31m-HTTP_SECURE_LINK=NO[m
[31m-HTTP_DEGRADATION=NO[m
[31m-HTTP_FLV=NO[m
[31m-HTTP_MP4=NO[m
[31m-HTTP_GUNZIP=NO[m
[31m-HTTP_GZIP_STATIC=NO[m
[31m-HTTP_UPSTREAM_HASH=YES[m
[31m-HTTP_UPSTREAM_IP_HASH=YES[m
[31m-HTTP_UPSTREAM_LEAST_CONN=YES[m
[31m-HTTP_UPSTREAM_KEEPALIVE=YES[m
[31m-HTTP_UPSTREAM_ZONE=YES[m
[31m-[m
[31m-# STUB[m
[31m-HTTP_STUB_STATUS=NO[m
[31m-[m
[31m-MAIL=NO[m
[31m-MAIL_SSL=NO[m
[31m-MAIL_POP3=YES[m
[31m-MAIL_IMAP=YES[m
[31m-MAIL_SMTP=YES[m
[31m-[m
[31m-STREAM=NO[m
[31m-STREAM_SSL=NO[m
[31m-STREAM_LIMIT_CONN=YES[m
[31m-STREAM_ACCESS=YES[m
[31m-STREAM_UPSTREAM_HASH=YES[m
[31m-STREAM_UPSTREAM_LEAST_CONN=YES[m
[31m-STREAM_UPSTREAM_ZONE=YES[m
[31m-[m
[31m-DYNAMIC_MODULES=[m
[31m-[m
[31m-NGX_ADDONS=[m
[31m-NGX_ADDON_DEPS=[m
[31m-DYNAMIC_ADDONS=[m
[31m-[m
[31m-USE_PCRE=NO[m
[31m-PCRE=NONE[m
[31m-PCRE_OPT=[m
[31m-PCRE_CONF_OPT=[m
[31m-PCRE_JIT=NO[m
[31m-[m
[31m-USE_OPENSSL=NO[m
[31m-OPENSSL=NONE[m
[31m-[m
[31m-USE_MD5=NO[m
[31m-MD5=NONE[m
[31m-MD5_OPT=[m
[31m-MD5_ASM=NO[m
[31m-[m
[31m-USE_SHA1=NO[m
[31m-SHA1=NONE[m
[31m-SHA1_OPT=[m
[31m-SHA1_ASM=NO[m
[31m-[m
[31m-USE_ZLIB=NO[m
[31m-ZLIB=NONE[m
[31m-ZLIB_OPT=[m
[31m-ZLIB_ASM=NO[m
[31m-[m
[31m-USE_PERL=NO[m
[31m-NGX_PERL=perl[m
[31m-[m
[31m-USE_LIBXSLT=NO[m
[31m-USE_LIBGD=NO[m
[31m-USE_GEOIP=NO[m
[31m-[m
[31m-NGX_GOOGLE_PERFTOOLS=NO[m
[31m-NGX_CPP_TEST=NO[m
[31m-[m
[31m-NGX_LIBATOMIC=NO[m
[31m-[m
[31m-NGX_CPU_CACHE_LINE=[m
[31m-[m
[31m-NGX_POST_CONF_MSG=[m
[31m-[m
[31m-opt=[m
[31m-[m
[31m-for option[m
[31m-do[m
[31m-    opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"[m
[31m-[m
[31m-    case "$option" in[m
[31m-        -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;[m
[31m-           *) value="" ;;[m
[31m-    esac[m
[31m-[m
[31m-    case "$option" in[m
[31m-        --help)                          help=yes                   ;;[m
[31m-[m
[31m-        --prefix=)                       NGX_PREFIX="!"             ;;[m
[31m-        --prefix=*)                      NGX_PREFIX="$value"        ;;[m
[31m-        --sbin-path=*)                   NGX_SBIN_PATH="$value"     ;;[m
[31m-        --modules-path=*)                NGX_MODULES_PATH="$value"  ;;[m
[31m-        --conf-path=*)                   NGX_CONF_PATH="$value"     ;;[m
[31m-        --error-log-path=*)              NGX_ERROR_LOG_PATH="$value";;[m
[31m-        --pid-path=*)                    NGX_PID_PATH="$value"      ;;[m
[31m-        --lock-path=*)                   NGX_LOCK_PATH="$value"     ;;[m
[31m-        --tapset-prefix=*)               NGX_TAPSET_PREFIX="$value" ;;[m
[31m-        --stap-nginx-path=*)             NGX_STAP_NGX_PATH="$value" ;;[m
[31m-        --user=*)                        NGX_USER="$value"          ;;[m
[31m-        --group=*)                       NGX_GROUP="$value"         ;;[m
[31m-[m
[31m-        --crossbuild=*)                  NGX_PLATFORM="$value"      ;;[m
[31m-[m
[31m-        --build=*)                       NGX_BUILD="$value"         ;;[m
[31m-        --builddir=*)                    NGX_OBJS="$value"          ;;[m
[31m-[m
[31m-        --with-select_module)            EVENT_SELECT=YES           ;;[m
[31m-        --without-select_module)         EVENT_SELECT=NONE          ;;[m
[31m-        --with-poll_module)              EVENT_POLL=YES             ;;[m
[31m-        --without-poll_module)           EVENT_POLL=NONE            ;;[m
[31m-[m
[31m-        --with-threads)                  USE_THREADS=YES            ;;[m
[31m-[m
[31m-        --with-file-aio)                 NGX_FILE_AIO=YES           ;;[m
[31m-        --with-ipv6)                     NGX_IPV6=YES               ;;[m
[31m-[m
[31m-        --without-http)                  HTTP=NO                    ;;[m
[31m-        --without-http-cache)            HTTP_CACHE=NO              ;;[m
[31m-[m
[31m-        --http-log-path=*)               NGX_HTTP_LOG_PATH="$value" ;;[m
[31m-        --http-client-body-temp-path=*)  NGX_HTTP_CLIENT_TEMP_PATH="$value" ;;[m
[31m-        --http-proxy-temp-path=*)        NGX_HTTP_PROXY_TEMP_PATH="$value" ;;[m
[31m-        --http-fastcgi-temp-path=*)      NGX_HTTP_FASTCGI_TEMP_PATH="$value" ;;[m
[31m-        --http-uwsgi-temp-path=*)        NGX_HTTP_UWSGI_TEMP_PATH="$value" ;;[m
[31m-        --http-scgi-temp-path=*)         NGX_HTTP_SCGI_TEMP_PATH="$value" ;;[m
[31m-[m
[31m-        --with-http_ssl_module)          HTTP_SSL=YES               ;;[m
[31m-        --with-http_v2_module)           HTTP_V2=YES                ;;[m
[31m-        --with-http_realip_module)       HTTP_REALIP=YES            ;;[m
[31m-        --with-http_addition_module)     HTTP_ADDITION=YES          ;;[m
[31m-        --with-http_xslt_module)         HTTP_XSLT=YES              ;;[m
[31m-        --with-http_xslt_module=dynamic) HTTP_XSLT=DYNAMIC          ;;[m
[31m-        --with-http_image_filter_module) HTTP_IMAGE_FILTER=YES      ;;[m
[31m-        --with-http_image_filter_module=dynamic)[m
[31m-                                         HTTP_IMAGE_FILTER=DYNAMIC  ;;[m
[31m-        --with-http_geoip_module)        HTTP_GEOIP=YES             ;;[m
[31m-        --with-http_geoip_module=dynamic)[m
[31m-                                         HTTP_GEOIP=DYNAMIC         ;;[m
[31m-        --with-http_sub_module)          HTTP_SUB=YES               ;;[m
[31m-        --with-http_dav_module)          HTTP_DAV=YES               ;;[m
[31m-        --with-http_flv_module)          HTTP_FLV=YES               ;;[m
[31m-        --with-http_mp4_module)          HTTP_MP4=YES               ;;[m
[31m-        --with-http_gunzip_module)       HTTP_GUNZIP=YES            ;;[m
[31m-        --with-http_gzip_static_module)  HTTP_GZIP_STATIC=YES       ;;[m
[31m-        --with-http_auth_request_module) HTTP_AUTH_REQUEST=YES      ;;[m
[31m-        --with-http_random_index_module) HTTP_RANDOM_INDEX=YES      ;;[m
[31m-        --with-http_secure_link_module)  HTTP_SECURE_LINK=YES       ;;[m
[31m-        --with-http_degradation_module)  HTTP_DEGRADATION=YES       ;;[m
[31m-        --with-http_slice_module)        HTTP_SLICE=YES             ;;[m
[31m-[m
[31m-        --without-http_charset_module)   HTTP_CHARSET=NO            ;;[m
[31m-        --without-http_gzip_module)      HTTP_GZIP=NO               ;;[m
[31m-        --without-http_ssi_module)       HTTP_SSI=NO                ;;[m
[31m-        --without-http_userid_module)    HTTP_USERID=NO             ;;[m
[31m-        --without-http_access_module)    HTTP_ACCESS=NO             ;;[m
[31m-        --without-http_auth_basic_module) HTTP_AUTH_BASIC=NO        ;;[m
[31m-        --without-http_autoindex_module) HTTP_AUTOINDEX=NO          ;;[m
[31m-        --without-http_status_module)    HTTP_STATUS=NO             ;;[m
[31m-        --without-http_geo_module)       HTTP_GEO=NO                ;;[m
[31m-        --without-http_map_module)       HTTP_MAP=NO                ;;[m
[31m-        --without-http_split_clients_module) HTTP_SPLIT_CLIENTS=NO  ;;[m
[31m-        --without-http_referer_module)   HTTP_REFERER=NO            ;;[m
[31m-        --without-http_rewrite_module)   HTTP_REWRITE=NO            ;;[m
[31m-        --without-http_proxy_module)     HTTP_PROXY=NO              ;;[m
[31m-        --without-http_fastcgi_module)   HTTP_FASTCGI=NO            ;;[m
[31m-        --without-http_uwsgi_module)     HTTP_UWSGI=NO              ;;[m
[31m-        --without-http_scgi_module)      HTTP_SCGI=NO               ;;[m
[31m-        --without-http_memcached_module) HTTP_MEMCACHED=NO          ;;[m
[31m-        --without-http_limit_conn_module) HTTP_LIMIT_CONN=NO        ;;[m
[31m-        --without-http_limit_req_module) HTTP_LIMIT_REQ=NO         ;;[m
[31m-        --without-http_empty_gif_module) HTTP_EMPTY_GIF=NO          ;;[m
[31m-        --without-http_browser_module)   HTTP_BROWSER=NO            ;;[m
[31m-        --without-http_upstream_hash_module) HTTP_UPSTREAM_HASH=NO  ;;[m
[31m-        --without-http_upstream_ip_hash_module) HTTP_UPSTREAM_IP_HASH=NO ;;[m
[31m-        --without-http_upstream_least_conn_module)[m
[31m-                                         HTTP_UPSTREAM_LEAST_CONN=NO ;;[m
[31m-        --without-http_upstream_keepalive_module) HTTP_UPSTREAM_KEEPALIVE=NO ;;[m
[31m-        --without-http_upstream_zone_module) HTTP_UPSTREAM_ZONE=NO  ;;[m
[31m-[m
[31m-        --with-http_perl_module)         HTTP_PERL=YES              ;;[m
[31m-        --with-http_perl_module=dynamic) HTTP_PERL=DYNAMIC          ;;[m
[31m-        --with-perl_modules_path=*)      NGX_PERL_MODULES="$value"  ;;[m
[31m-        --with-perl=*)                   NGX_PERL="$value"          ;;[m
[31m-[m
[31m-        # STUB[m
[31m-        --with-http_stub_status_module)  HTTP_STUB_STATUS=YES       ;;[m
[31m-[m
[31m-        --with-mail)                     MAIL=YES                   ;;[m
[31m-        --with-mail=dynamic)             MAIL=DYNAMIC               ;;[m
[31m-        --with-mail_ssl_module)          MAIL_SSL=YES               ;;[m
[31m-        # STUB[m
[31m-        --with-imap)[m
[31m-            MAIL=YES[m
[31m-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG[m
[31m-$0: warning: the \"--with-imap\" option is deprecated, \[m
[31m-use the \"--with-mail\" option instead"[m
[31m-        ;;[m
[31m-        --with-imap_ssl_module)[m
[31m-            MAIL_SSL=YES[m
[31m-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG[m
[31m-$0: warning: the \"--with-imap_ssl_module\" option is deprecated, \[m
[31m-use the \"--with-mail_ssl_module\" option instead"[m
[31m-        ;;[m
[31m-        --without-mail_pop3_module)      MAIL_POP3=NO               ;;[m
[31m-        --without-mail_imap_module)      MAIL_IMAP=NO               ;;[m
[31m-        --without-mail_smtp_module)      MAIL_SMTP=NO               ;;[m
[31m-[m
[31m-        --with-stream)                   STREAM=YES                 ;;[m
[31m-        --with-stream=dynamic)           STREAM=DYNAMIC             ;;[m
[31m-        --with-stream_ssl_module)        STREAM_SSL=YES             ;;[m
[31m-        --without-stream_limit_conn_module)[m
[31m-                                         STREAM_LIMIT_CONN=NO       ;;[m
[31m-        --without-stream_access_module)  STREAM_ACCESS=NO           ;;[m
[31m-        --without-stream_upstream_hash_module)[m
[31m-                                         STREAM_UPSTREAM_HASH=NO    ;;[m
[31m-        --without-stream_upstream_least_conn_module)[m
[31m-                                         STREAM_UPSTREAM_LEAST_CONN=NO ;;[m
[31m-        --without-stream_upstream_zone_module)[m
[31m-                                         STREAM_UPSTREAM_ZONE=NO    ;;[m
[31m-[m
[31m-        --with-google_perftools_module)  NGX_GOOGLE_PERFTOOLS=YES   ;;[m
[31m-        --with-cpp_test_module)          NGX_CPP_TEST=YES           ;;[m
[31m-[m
[31m-        --add-module=*)                  NGX_ADDONS="$NGX_ADDONS $value" ;;[m
[31m-        --add-dynamic-module=*)          DYNAMIC_ADDONS="$DYNAMIC_ADDONS $value" ;;[m
[31m-[m
[31m-        --with-cc=*)                     CC="$value"                ;;[m
[31m-        --with-cpp=*)                    CPP="$value"               ;;[m
[31m-        --with-cc-opt=*)                 NGX_CC_OPT="$value"        ;;[m
[31m-        --with-ld-opt=*)                 NGX_LD_OPT="$value"        ;;[m
[31m-        --with-cpu-opt=*)                CPU="$value"               ;;[m
[31m-        --with-debug)                    NGX_DEBUG=YES              ;;[m
[31m-        --with-dtrace=*)                 DTRACE="$value"            ;;[m
[31m-        --with-dtrace-probes)            NGX_DTRACE=YES             ;;[m
[31m-        --without-pcre)                  USE_PCRE=DISABLED          ;;[m
[31m-        --with-pcre)                     USE_PCRE=YES               ;;[m
[31m-        --with-pcre=*)                   PCRE="$value"              ;;[m
[31m-        --with-pcre-opt=*)               PCRE_OPT="$value"          ;;[m
[31m-        --with-pcre-conf-opt=*)          PCRE_CONF_OPT="$value"     ;;[m
[31m-        --with-pcre-jit)                 PCRE_JIT=YES               ;;[m
[31m-[m
[31m-        --with-openssl=*)                OPENSSL="$value"           ;;[m
[31m-        --with-openssl-opt=*)            OPENSSL_OPT="$value"       ;;[m
[31m-[m
[31m-        --with-md5=*)                    MD5="$value"               ;;[m
[31m-        --with-md5-opt=*)                MD5_OPT="$value"           ;;[m
[31m-        --with-md5-asm)                  MD5_ASM=YES                ;;[m
[31m-[m
[31m-        --with-sha1=*)                   SHA1="$value"              ;;[m
[31m-        --with-sha1-opt=*)               SHA1_OPT="$value"          ;;[m
[31m-        --with-sha1-asm)                 SHA1_ASM=YES               ;;[m
[31m-[m
[31m-        --with-zlib=*)                   ZLIB="$value"              ;;[m
[31m-        --with-zlib-opt=*)               ZLIB_OPT="$value"          ;;[m
[31m-        --with-zlib-asm=*)               ZLIB_ASM="$value"          ;;[m
[31m-[m
[31m-        --with-libatomic)                NGX_LIBATOMIC=YES          ;;[m
[31m-        --with-libatomic=*)              NGX_LIBATOMIC="$value"     ;;[m
[31m-[m
[31m-        --test-build-devpoll)            NGX_TEST_BUILD_DEVPOLL=YES ;;[m
[31m-        --test-build-eventport)          NGX_TEST_BUILD_EVENTPORT=YES ;;[m
[31m-        --test-build-epoll)              NGX_TEST_BUILD_EPOLL=YES   ;;[m
[31m-        --test-build-solaris-sendfilev)  NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;;[m
[31m-[m
[31m-        *)[m
[31m-            echo "$0: error: invalid option \"$option\""[m
[31m-            exit 1[m
[31m-        ;;[m
[31m-    esac[m
[31m-done[m
[31m-[m
[31m-[m
[31m-NGX_CONFIGURE="$opt"[m
[31m-[m
[31m-[m
[31m-if [ $help = yes ]; then[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-  --help                             print this message[m
[31m-[m
[31m-  --prefix=PATH                      set installation prefix[m
[31m-  --sbin-path=PATH                   set nginx binary pathname[m
[31m-  --modules-path=PATH                set modules path[m
[31m-  --conf-path=PATH                   set nginx.conf pathname[m
[31m-  --error-log-path=PATH              set error log pathname[m
[31m-  --pid-path=PATH                    set nginx.pid pathname[m
[31m-  --lock-path=PATH                   set nginx.lock pathname[m
[31m-  --tapset-prefix=PATH               set systemtap tapset directory prefix[m
[31m-  --stap-nginx-path=PATH             set stap-nginx pathname[m
[31m-[m
[31m-  --user=USER                        set non-privileged user for[m
[31m-                                     worker processes[m
[31m-  --group=GROUP                      set non-privileged group for[m
[31m-                                     worker processes[m
[31m-[m
[31m-  --build=NAME                       set build name[m
[31m-  --builddir=DIR                     set build directory[m
[31m-[m
[31m-  --with-select_module               enable select module[m
[31m-  --without-select_module            disable select module[m
[31m-  --with-poll_module                 enable poll module[m
[31m-  --without-poll_module              disable poll module[m
[31m-[m
[31m-  --with-threads                     enable thread pool support[m
[31m-[m
[31m-  --with-file-aio                    enable file AIO support[m
[31m-  --with-ipv6                        enable IPv6 support[m
[31m-[m
[31m-  --with-http_ssl_module             enable ngx_http_ssl_module[m
[31m-  --with-http_v2_module              enable ngx_http_v2_module[m
[31m-  --with-http_realip_module          enable ngx_http_realip_module[m
[31m-  --with-http_addition_module        enable ngx_http_addition_module[m
[31m-  --with-http_xslt_module            enable ngx_http_xslt_module[m
[31m-  --with-http_xslt_module=dynamic    enable dynamic ngx_http_xslt_module[m
[31m-  --with-http_image_filter_module    enable ngx_http_image_filter_module[m
[31m-  --with-http_image_filter_module=dynamic[m
[31m-                                     enable dynamic ngx_http_image_filter_module[m
[31m-  --with-http_geoip_module           enable ngx_http_geoip_module[m
[31m-  --with-http_geoip_module=dynamic   enable dynamic ngx_http_geoip_module[m
[31m-  --with-http_sub_module             enable ngx_http_sub_module[m
[31m-  --with-http_dav_module             enable ngx_http_dav_module[m
[31m-  --with-http_flv_module             enable ngx_http_flv_module[m
[31m-  --with-http_mp4_module             enable ngx_http_mp4_module[m
[31m-  --with-http_gunzip_module          enable ngx_http_gunzip_module[m
[31m-  --with-http_gzip_static_module     enable ngx_http_gzip_static_module[m
[31m-  --with-http_auth_request_module    enable ngx_http_auth_request_module[m
[31m-  --with-http_random_index_module    enable ngx_http_random_index_module[m
[31m-  --with-http_secure_link_module     enable ngx_http_secure_link_module[m
[31m-  --with-http_degradation_module     enable ngx_http_degradation_module[m
[31m-  --with-http_slice_module           enable ngx_http_slice_module[m
[31m-  --with-http_stub_status_module     enable ngx_http_stub_status_module[m
[31m-[m
[31m-  --without-http_charset_module      disable ngx_http_charset_module[m
[31m-  --without-http_gzip_module         disable ngx_http_gzip_module[m
[31m-  --without-http_ssi_module          disable ngx_http_ssi_module[m
[31m-  --without-http_userid_module       disable ngx_http_userid_module[m
[31m-  --without-http_access_module       disable ngx_http_access_module[m
[31m-  --without-http_auth_basic_module   disable ngx_http_auth_basic_module[m
[31m-  --without-http_autoindex_module    disable ngx_http_autoindex_module[m
[31m-  --without-http_geo_module          disable ngx_http_geo_module[m
[31m-  --without-http_map_module          disable ngx_http_map_module[m
[31m-  --without-http_split_clients_module disable ngx_http_split_clients_module[m
[31m-  --without-http_referer_module      disable ngx_http_referer_module[m
[31m-  --without-http_rewrite_module      disable ngx_http_rewrite_module[m
[31m-  --without-http_proxy_module        disable ngx_http_proxy_module[m
[31m-  --without-http_fastcgi_module      disable ngx_http_fastcgi_module[m
[31m-  --without-http_uwsgi_module        disable ngx_http_uwsgi_module[m
[31m-  --without-http_scgi_module         disable ngx_http_scgi_module[m
[31m-  --without-http_memcached_module    disable ngx_http_memcached_module[m
[31m-  --without-http_limit_conn_module   disable ngx_http_limit_conn_module[m
[31m-  --without-http_limit_req_module    disable ngx_http_limit_req_module[m
[31m-  --without-http_empty_gif_module    disable ngx_http_empty_gif_module[m
[31m-  --without-http_browser_module      disable ngx_http_browser_module[m
[31m-  --without-http_upstream_hash_module[m
[31m-                                     disable ngx_http_upstream_hash_module[m
[31m-  --without-http_upstream_ip_hash_module[m
[31m-                                     disable ngx_http_upstream_ip_hash_module[m
[31m-  --without-http_upstream_least_conn_module[m
[31m-                                     disable ngx_http_upstream_least_conn_module[m
[31m-  --without-http_upstream_keepalive_module[m
[31m-                                     disable ngx_http_upstream_keepalive_module[m
[31m-  --without-http_upstream_zone_module[m
[31m-                                     disable ngx_http_upstream_zone_module[m
[31m-[m
[31m-  --with-http_perl_module            enable ngx_http_perl_module[m
[31m-  --with-http_perl_module=dynamic    enable dynamic ngx_http_perl_module[m
[31m-  --with-perl_modules_path=PATH      set Perl modules path[m
[31m-  --with-perl=PATH                   set perl binary pathname[m
[31m-[m
[31m-  --http-log-path=PATH               set http access log pathname[m
[31m-  --http-client-body-temp-path=PATH  set path to store[m
[31m-                                     http client request body temporary files[m
[31m-  --http-proxy-temp-path=PATH        set path to store[m
[31m-                                     http proxy temporary files[m
[31m-  --http-fastcgi-temp-path=PATH      set path to store[m
[31m-                                     http fastcgi temporary files[m
[31m-  --http-uwsgi-temp-path=PATH        set path to store[m
[31m-                                     http uwsgi temporary files[m
[31m-  --http-scgi-temp-path=PATH         set path to store[m
[31m-                                     http scgi temporary files[m
[31m-[m
[31m-  --without-http                     disable HTTP server[m
[31m-  --without-http-cache               disable HTTP cache[m
[31m-[m
[31m-  --with-mail                        enable POP3/IMAP4/SMTP proxy module[m
[31m-  --with-mail=dynamic                enable dynamic POP3/IMAP4/SMTP proxy module[m
[31m-  --with-mail_ssl_module             enable ngx_mail_ssl_module[m
[31m-  --without-mail_pop3_module         disable ngx_mail_pop3_module[m
[31m-  --without-mail_imap_module         disable ngx_mail_imap_module[m
[31m-  --without-mail_smtp_module         disable ngx_mail_smtp_module[m
[31m-[m
[31m-  --with-stream                      enable TCP/UDP proxy module[m
[31m-  --with-stream=dynamic              enable dynamic TCP/UDP proxy module[m
[31m-  --with-stream_ssl_module           enable ngx_stream_ssl_module[m
[31m-  --without-stream_limit_conn_module disable ngx_stream_limit_conn_module[m
[31m-  --without-stream_access_module     disable ngx_stream_access_module[m
[31m-  --without-stream_upstream_hash_module[m
[31m-                                     disable ngx_stream_upstream_hash_module[m
[31m-  --without-stream_upstream_least_conn_module[m
[31m-                                     disable ngx_stream_upstream_least_conn_module[m
[31m-  --without-stream_upstream_zone_module[m
[31m-                                     disable ngx_stream_upstream_zone_module[m
[31m-[m
[31m-  --with-google_perftools_module     enable ngx_google_perftools_module[m
[31m-  --with-cpp_test_module             enable ngx_cpp_test_module[m
[31m-[m
[31m-  --add-module=PATH                  enable external module[m
[31m-  --add-dynamic-module=PATH          enable dynamic external module[m
[31m-[m
[31m-  --with-cc=PATH                     set C compiler pathname[m
[31m-  --with-cpp=PATH                    set C preprocessor pathname[m
[31m-  --with-cc-opt=OPTIONS              set additional C compiler options[m
[31m-  --with-ld-opt=OPTIONS              set additional linker options[m
[31m-  --with-cpu-opt=CPU                 build for the specified CPU, valid values:[m
[31m-                                     pentium, pentiumpro, pentium3, pentium4,[m
[31m-                                     athlon, opteron, sparc32, sparc64, ppc64[m
[31m-[m
[31m-  --without-pcre                     disable PCRE library usage[m
[31m-  --with-pcre                        force PCRE library usage[m
[31m-  --with-pcre=DIR                    set path to PCRE library sources[m
[31m-  --with-pcre-opt=OPTIONS            set additional build options for PCRE[m
[31m-  --with-pcre-conf-opt=OPTIONS       set additional configure options for PCRE[m
[31m-  --with-pcre-jit                    build PCRE with JIT compilation support[m
[31m-[m
[31m-  --with-md5=DIR                     set path to md5 library sources[m
[31m-  --with-md5-opt=OPTIONS             set additional build options for md5[m
[31m-  --with-md5-asm                     use md5 assembler sources[m
[31m-[m
[31m-  --with-sha1=DIR                    set path to sha1 library sources[m
[31m-  --with-sha1-opt=OPTIONS            set additional build options for sha1[m
[31m-  --with-sha1-asm                    use sha1 assembler sources[m
[31m-[m
[31m-  --with-zlib=DIR                    set path to zlib library sources[m
[31m-  --with-zlib-opt=OPTIONS            set additional build options for zlib[m
[31m-  --with-zlib-asm=CPU                use zlib assembler sources optimized[m
[31m-                                     for the specified CPU, valid values:[m
[31m-                                     pentium, pentiumpro[m
[31m-[m
[31m-  --with-libatomic                   force libatomic_ops library usage[m
[31m-  --with-libatomic=DIR               set path to libatomic_ops library sources[m
[31m-[m
[31m-  --with-openssl=DIR                 set path to OpenSSL library sources[m
[31m-  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL[m
[31m-[m
[31m-  --with-debug                       enable debug logging[m
[31m-  --with-dtrace-probes               enable dtrace USDT probes[m
[31m-  --with-dtrace=PATH                 set dtrace utility pathname[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP = NO ]; then[m
[31m-    HTTP_CHARSET=NO[m
[31m-    HTTP_GZIP=NO[m
[31m-    HTTP_SSI=NO[m
[31m-    HTTP_USERID=NO[m
[31m-    HTTP_ACCESS=NO[m
[31m-    HTTP_STATUS=NO[m
[31m-    HTTP_REWRITE=NO[m
[31m-    HTTP_PROXY=NO[m
[31m-    HTTP_FASTCGI=NO[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ ".$NGX_PLATFORM" = ".win32" ]; then[m
[31m-    NGX_WINE=$WINE[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx}[m
[31m-NGX_MODULES_PATH=${NGX_MODULES_PATH:-modules}[m
[31m-NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}[m
[31m-NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`[m
[31m-NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}[m
[31m-NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}[m
[31m-NGX_TAPSET_PREFIX=${NGX_TAPSET_PREFIX:-tapset}[m
[31m-[m
[31m-if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then[m
[31m-    NGX_ERROR_LOG_PATH=[m
[31m-else[m
[31m-    NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}[m
[31m-fi[m
[31m-[m
[31m-NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log}[m
[31m-NGX_HTTP_CLIENT_TEMP_PATH=${NGX_HTTP_CLIENT_TEMP_PATH:-client_body_temp}[m
[31m-NGX_HTTP_PROXY_TEMP_PATH=${NGX_HTTP_PROXY_TEMP_PATH:-proxy_temp}[m
[31m-NGX_HTTP_FASTCGI_TEMP_PATH=${NGX_HTTP_FASTCGI_TEMP_PATH:-fastcgi_temp}[m
[31m-NGX_HTTP_UWSGI_TEMP_PATH=${NGX_HTTP_UWSGI_TEMP_PATH:-uwsgi_temp}[m
[31m-NGX_HTTP_SCGI_TEMP_PATH=${NGX_HTTP_SCGI_TEMP_PATH:-scgi_temp}[m
[31m-[m
[31m-case ".$NGX_PERL_MODULES" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES[m
[31m-    ;;[m
[31m-esac[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/options.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/options.orig[m
[1mdeleted file mode 100644[m
[1mindex ba6f2b2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/options.orig[m
[1m+++ /dev/null[m
[36m@@ -1,606 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-help=no[m
[31m-[m
[31m-NGX_PREFIX=[m
[31m-NGX_SBIN_PATH=[m
[31m-NGX_MODULES_PATH=[m
[31m-NGX_CONF_PREFIX=[m
[31m-NGX_CONF_PATH=[m
[31m-NGX_ERROR_LOG_PATH=[m
[31m-NGX_PID_PATH=[m
[31m-NGX_LOCK_PATH=[m
[31m-NGX_TAPSET_PREFIX=[m
[31m-NGX_STAP_NGX_PATH=[m
[31m-NGX_USER=[m
[31m-NGX_GROUP=[m
[31m-NGX_BUILD=[m
[31m-[m
[31m-CC=${CC:-cc}[m
[31m-CPP=[m
[31m-NGX_OBJS=objs[m
[31m-[m
[31m-NGX_DEBUG=NO[m
[31m-NGX_DTRACE=NO[m
[31m-DTRACE=dtrace[m
[31m-[m
[31m-DTRACE_PROBE_OBJ=YES[m
[31m-DTRACE_FROM_SYSTEMTAP=NO[m
[31m-[m
[31m-NGX_CC_OPT=[m
[31m-NGX_LD_OPT=[m
[31m-CPU=NO[m
[31m-[m
[31m-NGX_RPATH=NO[m
[31m-[m
[31m-NGX_TEST_BUILD_DEVPOLL=NO[m
[31m-NGX_TEST_BUILD_EVENTPORT=NO[m
[31m-NGX_TEST_BUILD_EPOLL=NO[m
[31m-NGX_TEST_BUILD_SOLARIS_SENDFILEV=NO[m
[31m-[m
[31m-NGX_PLATFORM=[m
[31m-NGX_WINE=[m
[31m-[m
[31m-EVENT_FOUND=NO[m
[31m-[m
[31m-EVENT_SELECT=NO[m
[31m-EVENT_POLL=NO[m
[31m-[m
[31m-USE_THREADS=NO[m
[31m-[m
[31m-NGX_FILE_AIO=NO[m
[31m-NGX_IPV6=NO[m
[31m-[m
[31m-HTTP=YES[m
[31m-[m
[31m-NGX_HTTP_LOG_PATH=[m
[31m-NGX_HTTP_CLIENT_TEMP_PATH=[m
[31m-NGX_HTTP_PROXY_TEMP_PATH=[m
[31m-NGX_HTTP_FASTCGI_TEMP_PATH=[m
[31m-NGX_HTTP_UWSGI_TEMP_PATH=[m
[31m-NGX_HTTP_SCGI_TEMP_PATH=[m
[31m-[m
[31m-HTTP_CACHE=YES[m
[31m-HTTP_CHARSET=YES[m
[31m-HTTP_GZIP=YES[m
[31m-HTTP_SSL=NO[m
[31m-HTTP_V2=NO[m
[31m-HTTP_SSI=YES[m
[31m-HTTP_POSTPONE=NO[m
[31m-HTTP_REALIP=NO[m
[31m-HTTP_XSLT=NO[m
[31m-HTTP_IMAGE_FILTER=NO[m
[31m-HTTP_SUB=NO[m
[31m-HTTP_ADDITION=NO[m
[31m-HTTP_DAV=NO[m
[31m-HTTP_ACCESS=YES[m
[31m-HTTP_AUTH_BASIC=YES[m
[31m-HTTP_AUTH_REQUEST=NO[m
[31m-HTTP_USERID=YES[m
[31m-HTTP_SLICE=NO[m
[31m-HTTP_AUTOINDEX=YES[m
[31m-HTTP_RANDOM_INDEX=NO[m
[31m-HTTP_STATUS=NO[m
[31m-HTTP_GEO=YES[m
[31m-HTTP_GEOIP=NO[m
[31m-HTTP_MAP=YES[m
[31m-HTTP_SPLIT_CLIENTS=YES[m
[31m-HTTP_REFERER=YES[m
[31m-HTTP_REWRITE=YES[m
[31m-HTTP_PROXY=YES[m
[31m-HTTP_FASTCGI=YES[m
[31m-HTTP_UWSGI=YES[m
[31m-HTTP_SCGI=YES[m
[31m-HTTP_PERL=NO[m
[31m-HTTP_MEMCACHED=YES[m
[31m-HTTP_LIMIT_CONN=YES[m
[31m-HTTP_LIMIT_REQ=YES[m
[31m-HTTP_EMPTY_GIF=YES[m
[31m-HTTP_BROWSER=YES[m
[31m-HTTP_SECURE_LINK=NO[m
[31m-HTTP_DEGRADATION=NO[m
[31m-HTTP_FLV=NO[m
[31m-HTTP_MP4=NO[m
[31m-HTTP_GUNZIP=NO[m
[31m-HTTP_GZIP_STATIC=NO[m
[31m-HTTP_UPSTREAM_HASH=YES[m
[31m-HTTP_UPSTREAM_IP_HASH=YES[m
[31m-HTTP_UPSTREAM_LEAST_CONN=YES[m
[31m-HTTP_UPSTREAM_KEEPALIVE=YES[m
[31m-HTTP_UPSTREAM_ZONE=YES[m
[31m-[m
[31m-# STUB[m
[31m-HTTP_STUB_STATUS=NO[m
[31m-[m
[31m-MAIL=NO[m
[31m-MAIL_SSL=NO[m
[31m-MAIL_POP3=YES[m
[31m-MAIL_IMAP=YES[m
[31m-MAIL_SMTP=YES[m
[31m-[m
[31m-STREAM=NO[m
[31m-STREAM_SSL=NO[m
[31m-STREAM_LIMIT_CONN=YES[m
[31m-STREAM_ACCESS=YES[m
[31m-STREAM_UPSTREAM_HASH=YES[m
[31m-STREAM_UPSTREAM_LEAST_CONN=YES[m
[31m-STREAM_UPSTREAM_ZONE=YES[m
[31m-[m
[31m-DYNAMIC_MODULES=[m
[31m-[m
[31m-NGX_ADDONS=[m
[31m-NGX_ADDON_DEPS=[m
[31m-DYNAMIC_ADDONS=[m
[31m-[m
[31m-USE_PCRE=NO[m
[31m-PCRE=NONE[m
[31m-PCRE_OPT=[m
[31m-PCRE_CONF_OPT=[m
[31m-PCRE_JIT=NO[m
[31m-[m
[31m-USE_OPENSSL=NO[m
[31m-OPENSSL=NONE[m
[31m-[m
[31m-USE_MD5=NO[m
[31m-MD5=NONE[m
[31m-MD5_OPT=[m
[31m-MD5_ASM=NO[m
[31m-[m
[31m-USE_SHA1=NO[m
[31m-SHA1=NONE[m
[31m-SHA1_OPT=[m
[31m-SHA1_ASM=NO[m
[31m-[m
[31m-USE_ZLIB=NO[m
[31m-ZLIB=NONE[m
[31m-ZLIB_OPT=[m
[31m-ZLIB_ASM=NO[m
[31m-[m
[31m-USE_PERL=NO[m
[31m-NGX_PERL=perl[m
[31m-[m
[31m-USE_LIBXSLT=NO[m
[31m-USE_LIBGD=NO[m
[31m-USE_GEOIP=NO[m
[31m-[m
[31m-NGX_GOOGLE_PERFTOOLS=NO[m
[31m-NGX_CPP_TEST=NO[m
[31m-[m
[31m-NGX_LIBATOMIC=NO[m
[31m-[m
[31m-NGX_CPU_CACHE_LINE=[m
[31m-[m
[31m-NGX_POST_CONF_MSG=[m
[31m-[m
[31m-opt=[m
[31m-[m
[31m-for option[m
[31m-do[m
[31m-    opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"[m
[31m-[m
[31m-    case "$option" in[m
[31m-        -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;[m
[31m-           *) value="" ;;[m
[31m-    esac[m
[31m-[m
[31m-    case "$option" in[m
[31m-        --help)                          help=yes                   ;;[m
[31m-[m
[31m-        --prefix=)                       NGX_PREFIX="!"             ;;[m
[31m-        --prefix=*)                      NGX_PREFIX="$value"        ;;[m
[31m-        --sbin-path=*)                   NGX_SBIN_PATH="$value"     ;;[m
[31m-        --modules-path=*)                NGX_MODULES_PATH="$value"  ;;[m
[31m-        --conf-path=*)                   NGX_CONF_PATH="$value"     ;;[m
[31m-        --error-log-path=*)              NGX_ERROR_LOG_PATH="$value";;[m
[31m-        --pid-path=*)                    NGX_PID_PATH="$value"      ;;[m
[31m-        --lock-path=*)                   NGX_LOCK_PATH="$value"     ;;[m
[31m-        --tapset-prefix=*)               NGX_TAPSET_PREFIX="$value" ;;[m
[31m-        --stap-nginx-path=*)             NGX_STAP_NGX_PATH="$value" ;;[m
[31m-        --user=*)                        NGX_USER="$value"          ;;[m
[31m-        --group=*)                       NGX_GROUP="$value"         ;;[m
[31m-[m
[31m-        --crossbuild=*)                  NGX_PLATFORM="$value"      ;;[m
[31m-[m
[31m-        --build=*)                       NGX_BUILD="$value"         ;;[m
[31m-        --builddir=*)                    NGX_OBJS="$value"          ;;[m
[31m-[m
[31m-        --with-select_module)            EVENT_SELECT=YES           ;;[m
[31m-        --without-select_module)         EVENT_SELECT=NONE          ;;[m
[31m-        --with-poll_module)              EVENT_POLL=YES             ;;[m
[31m-        --without-poll_module)           EVENT_POLL=NONE            ;;[m
[31m-[m
[31m-        --with-threads)                  USE_THREADS=YES            ;;[m
[31m-[m
[31m-        --with-file-aio)                 NGX_FILE_AIO=YES           ;;[m
[31m-        --with-ipv6)                     NGX_IPV6=YES               ;;[m
[31m-[m
[31m-        --without-http)                  HTTP=NO                    ;;[m
[31m-        --without-http-cache)            HTTP_CACHE=NO              ;;[m
[31m-[m
[31m-        --http-log-path=*)               NGX_HTTP_LOG_PATH="$value" ;;[m
[31m-        --http-client-body-temp-path=*)  NGX_HTTP_CLIENT_TEMP_PATH="$value" ;;[m
[31m-        --http-proxy-temp-path=*)        NGX_HTTP_PROXY_TEMP_PATH="$value" ;;[m
[31m-        --http-fastcgi-temp-path=*)      NGX_HTTP_FASTCGI_TEMP_PATH="$value" ;;[m
[31m-        --http-uwsgi-temp-path=*)        NGX_HTTP_UWSGI_TEMP_PATH="$value" ;;[m
[31m-        --http-scgi-temp-path=*)         NGX_HTTP_SCGI_TEMP_PATH="$value" ;;[m
[31m-[m
[31m-        --with-http_ssl_module)          HTTP_SSL=YES               ;;[m
[31m-        --with-http_v2_module)           HTTP_V2=YES                ;;[m
[31m-        --with-http_realip_module)       HTTP_REALIP=YES            ;;[m
[31m-        --with-http_addition_module)     HTTP_ADDITION=YES          ;;[m
[31m-        --with-http_xslt_module)         HTTP_XSLT=YES              ;;[m
[31m-        --with-http_xslt_module=dynamic) HTTP_XSLT=DYNAMIC          ;;[m
[31m-        --with-http_image_filter_module) HTTP_IMAGE_FILTER=YES      ;;[m
[31m-        --with-http_image_filter_module=dynamic)[m
[31m-                                         HTTP_IMAGE_FILTER=DYNAMIC  ;;[m
[31m-        --with-http_geoip_module)        HTTP_GEOIP=YES             ;;[m
[31m-        --with-http_geoip_module=dynamic)[m
[31m-                                         HTTP_GEOIP=DYNAMIC         ;;[m
[31m-        --with-http_sub_module)          HTTP_SUB=YES               ;;[m
[31m-        --with-http_dav_module)          HTTP_DAV=YES               ;;[m
[31m-        --with-http_flv_module)          HTTP_FLV=YES               ;;[m
[31m-        --with-http_mp4_module)          HTTP_MP4=YES               ;;[m
[31m-        --with-http_gunzip_module)       HTTP_GUNZIP=YES            ;;[m
[31m-        --with-http_gzip_static_module)  HTTP_GZIP_STATIC=YES       ;;[m
[31m-        --with-http_auth_request_module) HTTP_AUTH_REQUEST=YES      ;;[m
[31m-        --with-http_random_index_module) HTTP_RANDOM_INDEX=YES      ;;[m
[31m-        --with-http_secure_link_module)  HTTP_SECURE_LINK=YES       ;;[m
[31m-        --with-http_degradation_module)  HTTP_DEGRADATION=YES       ;;[m
[31m-        --with-http_slice_module)        HTTP_SLICE=YES             ;;[m
[31m-[m
[31m-        --without-http_charset_module)   HTTP_CHARSET=NO            ;;[m
[31m-        --without-http_gzip_module)      HTTP_GZIP=NO               ;;[m
[31m-        --without-http_ssi_module)       HTTP_SSI=NO                ;;[m
[31m-        --without-http_userid_module)    HTTP_USERID=NO             ;;[m
[31m-        --without-http_access_module)    HTTP_ACCESS=NO             ;;[m
[31m-        --without-http_auth_basic_module) HTTP_AUTH_BASIC=NO        ;;[m
[31m-        --without-http_autoindex_module) HTTP_AUTOINDEX=NO          ;;[m
[31m-        --without-http_status_module)    HTTP_STATUS=NO             ;;[m
[31m-        --without-http_geo_module)       HTTP_GEO=NO                ;;[m
[31m-        --without-http_map_module)       HTTP_MAP=NO                ;;[m
[31m-        --without-http_split_clients_module) HTTP_SPLIT_CLIENTS=NO  ;;[m
[31m-        --without-http_referer_module)   HTTP_REFERER=NO            ;;[m
[31m-        --without-http_rewrite_module)   HTTP_REWRITE=NO            ;;[m
[31m-        --without-http_proxy_module)     HTTP_PROXY=NO              ;;[m
[31m-        --without-http_fastcgi_module)   HTTP_FASTCGI=NO            ;;[m
[31m-        --without-http_uwsgi_module)     HTTP_UWSGI=NO              ;;[m
[31m-        --without-http_scgi_module)      HTTP_SCGI=NO               ;;[m
[31m-        --without-http_memcached_module) HTTP_MEMCACHED=NO          ;;[m
[31m-        --without-http_limit_conn_module) HTTP_LIMIT_CONN=NO        ;;[m
[31m-        --without-http_limit_req_module) HTTP_LIMIT_REQ=NO         ;;[m
[31m-        --without-http_empty_gif_module) HTTP_EMPTY_GIF=NO          ;;[m
[31m-        --without-http_browser_module)   HTTP_BROWSER=NO            ;;[m
[31m-        --without-http_upstream_hash_module) HTTP_UPSTREAM_HASH=NO  ;;[m
[31m-        --without-http_upstream_ip_hash_module) HTTP_UPSTREAM_IP_HASH=NO ;;[m
[31m-        --without-http_upstream_least_conn_module)[m
[31m-                                         HTTP_UPSTREAM_LEAST_CONN=NO ;;[m
[31m-        --without-http_upstream_keepalive_module) HTTP_UPSTREAM_KEEPALIVE=NO ;;[m
[31m-        --without-http_upstream_zone_module) HTTP_UPSTREAM_ZONE=NO  ;;[m
[31m-[m
[31m-        --with-http_perl_module)         HTTP_PERL=YES              ;;[m
[31m-        --with-http_perl_module=dynamic) HTTP_PERL=DYNAMIC          ;;[m
[31m-        --with-perl_modules_path=*)      NGX_PERL_MODULES="$value"  ;;[m
[31m-        --with-perl=*)                   NGX_PERL="$value"          ;;[m
[31m-[m
[31m-        # STUB[m
[31m-        --with-http_stub_status_module)  HTTP_STUB_STATUS=YES       ;;[m
[31m-[m
[31m-        --with-mail)                     MAIL=YES                   ;;[m
[31m-        --with-mail=dynamic)             MAIL=DYNAMIC               ;;[m
[31m-        --with-mail_ssl_module)          MAIL_SSL=YES               ;;[m
[31m-        # STUB[m
[31m-        --with-imap)[m
[31m-            MAIL=YES[m
[31m-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG[m
[31m-$0: warning: the \"--with-imap\" option is deprecated, \[m
[31m-use the \"--with-mail\" option instead"[m
[31m-        ;;[m
[31m-        --with-imap_ssl_module)[m
[31m-            MAIL_SSL=YES[m
[31m-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG[m
[31m-$0: warning: the \"--with-imap_ssl_module\" option is deprecated, \[m
[31m-use the \"--with-mail_ssl_module\" option instead"[m
[31m-        ;;[m
[31m-        --without-mail_pop3_module)      MAIL_POP3=NO               ;;[m
[31m-        --without-mail_imap_module)      MAIL_IMAP=NO               ;;[m
[31m-        --without-mail_smtp_module)      MAIL_SMTP=NO               ;;[m
[31m-[m
[31m-        --with-stream)                   STREAM=YES                 ;;[m
[31m-        --with-stream=dynamic)           STREAM=DYNAMIC             ;;[m
[31m-        --with-stream_ssl_module)        STREAM_SSL=YES             ;;[m
[31m-        --without-stream_limit_conn_module)[m
[31m-                                         STREAM_LIMIT_CONN=NO       ;;[m
[31m-        --without-stream_access_module)  STREAM_ACCESS=NO           ;;[m
[31m-        --without-stream_upstream_hash_module)[m
[31m-                                         STREAM_UPSTREAM_HASH=NO    ;;[m
[31m-        --without-stream_upstream_least_conn_module)[m
[31m-                                         STREAM_UPSTREAM_LEAST_CONN=NO ;;[m
[31m-        --without-stream_upstream_zone_module)[m
[31m-                                         STREAM_UPSTREAM_ZONE=NO    ;;[m
[31m-[m
[31m-        --with-google_perftools_module)  NGX_GOOGLE_PERFTOOLS=YES   ;;[m
[31m-        --with-cpp_test_module)          NGX_CPP_TEST=YES           ;;[m
[31m-[m
[31m-        --add-module=*)                  NGX_ADDONS="$NGX_ADDONS $value" ;;[m
[31m-        --add-dynamic-module=*)          DYNAMIC_ADDONS="$DYNAMIC_ADDONS $value" ;;[m
[31m-[m
[31m-        --with-cc=*)                     CC="$value"                ;;[m
[31m-        --with-cpp=*)                    CPP="$value"               ;;[m
[31m-        --with-cc-opt=*)                 NGX_CC_OPT="$value"        ;;[m
[31m-        --with-ld-opt=*)                 NGX_LD_OPT="$value"        ;;[m
[31m-        --with-cpu-opt=*)                CPU="$value"               ;;[m
[31m-        --with-debug)                    NGX_DEBUG=YES              ;;[m
[31m-        --with-dtrace=*)                 DTRACE="$value"            ;;[m
[31m-        --with-dtrace-probes)            NGX_DTRACE=YES             ;;[m
[31m-        --without-pcre)                  USE_PCRE=DISABLED          ;;[m
[31m-        --with-pcre)                     USE_PCRE=YES               ;;[m
[31m-        --with-pcre=*)                   PCRE="$value"              ;;[m
[31m-        --with-pcre-opt=*)               PCRE_OPT="$value"          ;;[m
[31m-        --with-pcre-jit)                 PCRE_JIT=YES               ;;[m
[31m-[m
[31m-        --with-openssl=*)                OPENSSL="$value"           ;;[m
[31m-        --with-openssl-opt=*)            OPENSSL_OPT="$value"       ;;[m
[31m-[m
[31m-        --with-md5=*)                    MD5="$value"               ;;[m
[31m-        --with-md5-opt=*)                MD5_OPT="$value"           ;;[m
[31m-        --with-md5-asm)                  MD5_ASM=YES                ;;[m
[31m-[m
[31m-        --with-sha1=*)                   SHA1="$value"              ;;[m
[31m-        --with-sha1-opt=*)               SHA1_OPT="$value"          ;;[m
[31m-        --with-sha1-asm)                 SHA1_ASM=YES               ;;[m
[31m-[m
[31m-        --with-zlib=*)                   ZLIB="$value"              ;;[m
[31m-        --with-zlib-opt=*)               ZLIB_OPT="$value"          ;;[m
[31m-        --with-zlib-asm=*)               ZLIB_ASM="$value"          ;;[m
[31m-[m
[31m-        --with-libatomic)                NGX_LIBATOMIC=YES          ;;[m
[31m-        --with-libatomic=*)              NGX_LIBATOMIC="$value"     ;;[m
[31m-[m
[31m-        --test-build-devpoll)            NGX_TEST_BUILD_DEVPOLL=YES ;;[m
[31m-        --test-build-eventport)          NGX_TEST_BUILD_EVENTPORT=YES ;;[m
[31m-        --test-build-epoll)              NGX_TEST_BUILD_EPOLL=YES   ;;[m
[31m-        --test-build-solaris-sendfilev)  NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;;[m
[31m-[m
[31m-        *)[m
[31m-            echo "$0: error: invalid option \"$option\""[m
[31m-            exit 1[m
[31m-        ;;[m
[31m-    esac[m
[31m-done[m
[31m-[m
[31m-[m
[31m-NGX_CONFIGURE="$opt"[m
[31m-[m
[31m-[m
[31m-if [ $help = yes ]; then[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-  --help                             print this message[m
[31m-[m
[31m-  --prefix=PATH                      set installation prefix[m
[31m-  --sbin-path=PATH                   set nginx binary pathname[m
[31m-  --modules-path=PATH                set modules path[m
[31m-  --conf-path=PATH                   set nginx.conf pathname[m
[31m-  --error-log-path=PATH              set error log pathname[m
[31m-  --pid-path=PATH                    set nginx.pid pathname[m
[31m-  --lock-path=PATH                   set nginx.lock pathname[m
[31m-  --tapset-prefix=PATH               set systemtap tapset directory prefix[m
[31m-  --stap-nginx-path=PATH             set stap-nginx pathname[m
[31m-[m
[31m-  --user=USER                        set non-privileged user for[m
[31m-                                     worker processes[m
[31m-  --group=GROUP                      set non-privileged group for[m
[31m-                                     worker processes[m
[31m-[m
[31m-  --build=NAME                       set build name[m
[31m-  --builddir=DIR                     set build directory[m
[31m-[m
[31m-  --with-select_module               enable select module[m
[31m-  --without-select_module            disable select module[m
[31m-  --with-poll_module                 enable poll module[m
[31m-  --without-poll_module              disable poll module[m
[31m-[m
[31m-  --with-threads                     enable thread pool support[m
[31m-[m
[31m-  --with-file-aio                    enable file AIO support[m
[31m-  --with-ipv6                        enable IPv6 support[m
[31m-[m
[31m-  --with-http_ssl_module             enable ngx_http_ssl_module[m
[31m-  --with-http_v2_module              enable ngx_http_v2_module[m
[31m-  --with-http_realip_module          enable ngx_http_realip_module[m
[31m-  --with-http_addition_module        enable ngx_http_addition_module[m
[31m-  --with-http_xslt_module            enable ngx_http_xslt_module[m
[31m-  --with-http_xslt_module=dynamic    enable dynamic ngx_http_xslt_module[m
[31m-  --with-http_image_filter_module    enable ngx_http_image_filter_module[m
[31m-  --with-http_image_filter_module=dynamic[m
[31m-                                     enable dynamic ngx_http_image_filter_module[m
[31m-  --with-http_geoip_module           enable ngx_http_geoip_module[m
[31m-  --with-http_geoip_module=dynamic   enable dynamic ngx_http_geoip_module[m
[31m-  --with-http_sub_module             enable ngx_http_sub_module[m
[31m-  --with-http_dav_module             enable ngx_http_dav_module[m
[31m-  --with-http_flv_module             enable ngx_http_flv_module[m
[31m-  --with-http_mp4_module             enable ngx_http_mp4_module[m
[31m-  --with-http_gunzip_module          enable ngx_http_gunzip_module[m
[31m-  --with-http_gzip_static_module     enable ngx_http_gzip_static_module[m
[31m-  --with-http_auth_request_module    enable ngx_http_auth_request_module[m
[31m-  --with-http_random_index_module    enable ngx_http_random_index_module[m
[31m-  --with-http_secure_link_module     enable ngx_http_secure_link_module[m
[31m-  --with-http_degradation_module     enable ngx_http_degradation_module[m
[31m-  --with-http_slice_module           enable ngx_http_slice_module[m
[31m-  --with-http_stub_status_module     enable ngx_http_stub_status_module[m
[31m-[m
[31m-  --without-http_charset_module      disable ngx_http_charset_module[m
[31m-  --without-http_gzip_module         disable ngx_http_gzip_module[m
[31m-  --without-http_ssi_module          disable ngx_http_ssi_module[m
[31m-  --without-http_userid_module       disable ngx_http_userid_module[m
[31m-  --without-http_access_module       disable ngx_http_access_module[m
[31m-  --without-http_auth_basic_module   disable ngx_http_auth_basic_module[m
[31m-  --without-http_autoindex_module    disable ngx_http_autoindex_module[m
[31m-  --without-http_geo_module          disable ngx_http_geo_module[m
[31m-  --without-http_map_module          disable ngx_http_map_module[m
[31m-  --without-http_split_clients_module disable ngx_http_split_clients_module[m
[31m-  --without-http_referer_module      disable ngx_http_referer_module[m
[31m-  --without-http_rewrite_module      disable ngx_http_rewrite_module[m
[31m-  --without-http_proxy_module        disable ngx_http_proxy_module[m
[31m-  --without-http_fastcgi_module      disable ngx_http_fastcgi_module[m
[31m-  --without-http_uwsgi_module        disable ngx_http_uwsgi_module[m
[31m-  --without-http_scgi_module         disable ngx_http_scgi_module[m
[31m-  --without-http_memcached_module    disable ngx_http_memcached_module[m
[31m-  --without-http_limit_conn_module   disable ngx_http_limit_conn_module[m
[31m-  --without-http_limit_req_module    disable ngx_http_limit_req_module[m
[31m-  --without-http_empty_gif_module    disable ngx_http_empty_gif_module[m
[31m-  --without-http_browser_module      disable ngx_http_browser_module[m
[31m-  --without-http_upstream_hash_module[m
[31m-                                     disable ngx_http_upstream_hash_module[m
[31m-  --without-http_upstream_ip_hash_module[m
[31m-                                     disable ngx_http_upstream_ip_hash_module[m
[31m-  --without-http_upstream_least_conn_module[m
[31m-                                     disable ngx_http_upstream_least_conn_module[m
[31m-  --without-http_upstream_keepalive_module[m
[31m-                                     disable ngx_http_upstream_keepalive_module[m
[31m-  --without-http_upstream_zone_module[m
[31m-                                     disable ngx_http_upstream_zone_module[m
[31m-[m
[31m-  --with-http_perl_module            enable ngx_http_perl_module[m
[31m-  --with-http_perl_module=dynamic    enable dynamic ngx_http_perl_module[m
[31m-  --with-perl_modules_path=PATH      set Perl modules path[m
[31m-  --with-perl=PATH                   set perl binary pathname[m
[31m-[m
[31m-  --http-log-path=PATH               set http access log pathname[m
[31m-  --http-client-body-temp-path=PATH  set path to store[m
[31m-                                     http client request body temporary files[m
[31m-  --http-proxy-temp-path=PATH        set path to store[m
[31m-                                     http proxy temporary files[m
[31m-  --http-fastcgi-temp-path=PATH      set path to store[m
[31m-                                     http fastcgi temporary files[m
[31m-  --http-uwsgi-temp-path=PATH        set path to store[m
[31m-                                     http uwsgi temporary files[m
[31m-  --http-scgi-temp-path=PATH         set path to store[m
[31m-                                     http scgi temporary files[m
[31m-[m
[31m-  --without-http                     disable HTTP server[m
[31m-  --without-http-cache               disable HTTP cache[m
[31m-[m
[31m-  --with-mail                        enable POP3/IMAP4/SMTP proxy module[m
[31m-  --with-mail=dynamic                enable dynamic POP3/IMAP4/SMTP proxy module[m
[31m-  --with-mail_ssl_module             enable ngx_mail_ssl_module[m
[31m-  --without-mail_pop3_module         disable ngx_mail_pop3_module[m
[31m-  --without-mail_imap_module         disable ngx_mail_imap_module[m
[31m-  --without-mail_smtp_module         disable ngx_mail_smtp_module[m
[31m-[m
[31m-  --with-stream                      enable TCP/UDP proxy module[m
[31m-  --with-stream=dynamic              enable dynamic TCP/UDP proxy module[m
[31m-  --with-stream_ssl_module           enable ngx_stream_ssl_module[m
[31m-  --without-stream_limit_conn_module disable ngx_stream_limit_conn_module[m
[31m-  --without-stream_access_module     disable ngx_stream_access_module[m
[31m-  --without-stream_upstream_hash_module[m
[31m-                                     disable ngx_stream_upstream_hash_module[m
[31m-  --without-stream_upstream_least_conn_module[m
[31m-                                     disable ngx_stream_upstream_least_conn_module[m
[31m-  --without-stream_upstream_zone_module[m
[31m-                                     disable ngx_stream_upstream_zone_module[m
[31m-[m
[31m-  --with-google_perftools_module     enable ngx_google_perftools_module[m
[31m-  --with-cpp_test_module             enable ngx_cpp_test_module[m
[31m-[m
[31m-  --add-module=PATH                  enable external module[m
[31m-  --add-dynamic-module=PATH          enable dynamic external module[m
[31m-[m
[31m-  --with-cc=PATH                     set C compiler pathname[m
[31m-  --with-cpp=PATH                    set C preprocessor pathname[m
[31m-  --with-cc-opt=OPTIONS              set additional C compiler options[m
[31m-  --with-ld-opt=OPTIONS              set additional linker options[m
[31m-  --with-cpu-opt=CPU                 build for the specified CPU, valid values:[m
[31m-                                     pentium, pentiumpro, pentium3, pentium4,[m
[31m-                                     athlon, opteron, sparc32, sparc64, ppc64[m
[31m-[m
[31m-  --without-pcre                     disable PCRE library usage[m
[31m-  --with-pcre                        force PCRE library usage[m
[31m-  --with-pcre=DIR                    set path to PCRE library sources[m
[31m-  --with-pcre-opt=OPTIONS            set additional build options for PCRE[m
[31m-  --with-pcre-jit                    build PCRE with JIT compilation support[m
[31m-[m
[31m-  --with-md5=DIR                     set path to md5 library sources[m
[31m-  --with-md5-opt=OPTIONS             set additional build options for md5[m
[31m-  --with-md5-asm                     use md5 assembler sources[m
[31m-[m
[31m-  --with-sha1=DIR                    set path to sha1 library sources[m
[31m-  --with-sha1-opt=OPTIONS            set additional build options for sha1[m
[31m-  --with-sha1-asm                    use sha1 assembler sources[m
[31m-[m
[31m-  --with-zlib=DIR                    set path to zlib library sources[m
[31m-  --with-zlib-opt=OPTIONS            set additional build options for zlib[m
[31m-  --with-zlib-asm=CPU                use zlib assembler sources optimized[m
[31m-                                     for the specified CPU, valid values:[m
[31m-                                     pentium, pentiumpro[m
[31m-[m
[31m-  --with-libatomic                   force libatomic_ops library usage[m
[31m-  --with-libatomic=DIR               set path to libatomic_ops library sources[m
[31m-[m
[31m-  --with-openssl=DIR                 set path to OpenSSL library sources[m
[31m-  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL[m
[31m-[m
[31m-  --with-debug                       enable debug logging[m
[31m-  --with-dtrace-probes               enable dtrace USDT probes[m
[31m-  --with-dtrace=PATH                 set dtrace utility pathname[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP = NO ]; then[m
[31m-    HTTP_CHARSET=NO[m
[31m-    HTTP_GZIP=NO[m
[31m-    HTTP_SSI=NO[m
[31m-    HTTP_USERID=NO[m
[31m-    HTTP_ACCESS=NO[m
[31m-    HTTP_STATUS=NO[m
[31m-    HTTP_REWRITE=NO[m
[31m-    HTTP_PROXY=NO[m
[31m-    HTTP_FASTCGI=NO[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ ".$NGX_PLATFORM" = ".win32" ]; then[m
[31m-    NGX_WINE=$WINE[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx}[m
[31m-NGX_MODULES_PATH=${NGX_MODULES_PATH:-modules}[m
[31m-NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}[m
[31m-NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`[m
[31m-NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}[m
[31m-NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}[m
[31m-NGX_TAPSET_PREFIX=${NGX_TAPSET_PREFIX:-tapset}[m
[31m-[m
[31m-if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then[m
[31m-    NGX_ERROR_LOG_PATH=[m
[31m-else[m
[31m-    NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}[m
[31m-fi[m
[31m-[m
[31m-NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log}[m
[31m-NGX_HTTP_CLIENT_TEMP_PATH=${NGX_HTTP_CLIENT_TEMP_PATH:-client_body_temp}[m
[31m-NGX_HTTP_PROXY_TEMP_PATH=${NGX_HTTP_PROXY_TEMP_PATH:-proxy_temp}[m
[31m-NGX_HTTP_FASTCGI_TEMP_PATH=${NGX_HTTP_FASTCGI_TEMP_PATH:-fastcgi_temp}[m
[31m-NGX_HTTP_UWSGI_TEMP_PATH=${NGX_HTTP_UWSGI_TEMP_PATH:-uwsgi_temp}[m
[31m-NGX_HTTP_SCGI_TEMP_PATH=${NGX_HTTP_SCGI_TEMP_PATH:-scgi_temp}[m
[31m-[m
[31m-case ".$NGX_PERL_MODULES" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES[m
[31m-    ;;[m
[31m-esac[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/conf[m
[1mdeleted file mode 100644[m
[1mindex 6ad0e74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/conf[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo "checking for $NGX_SYSTEM specific features"[m
[31m-[m
[31m-case "$NGX_PLATFORM" in[m
[31m-[m
[31m-    FreeBSD:*)[m
[31m-        . auto/os/freebsd[m
[31m-    ;;[m
[31m-[m
[31m-    Linux:*)[m
[31m-        . auto/os/linux[m
[31m-    ;;[m
[31m-[m
[31m-    SunOS:*)[m
[31m-        . auto/os/solaris[m
[31m-    ;;[m
[31m-[m
[31m-    Darwin:*)[m
[31m-        . auto/os/darwin[m
[31m-    ;;[m
[31m-[m
[31m-    win32)[m
[31m-        . auto/os/win32[m
[31m-    ;;[m
[31m-[m
[31m-    DragonFly:*)[m
[31m-        have=NGX_FREEBSD . auto/have_headers[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $FREEBSD_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS $FREEBSD_SRCS"[m
[31m-[m
[31m-        echo " + sendfile() found"[m
[31m-        have=NGX_HAVE_SENDFILE . auto/have[m
[31m-        CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS"[m
[31m-[m
[31m-        ngx_spacer='[m
[31m-'[m
[31m-    ;;[m
[31m-[m
[31m-    HP-UX:*)[m
[31m-        # HP/UX[m
[31m-        have=NGX_HPUX . auto/have_headers[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS -D_HPUX_ALT_XOPEN_SOCKET_API"[m
[31m-    ;;[m
[31m-[m
[31m-    OSF1:*)[m
[31m-        # Tru64 UNIX[m
[31m-        have=NGX_TRU64 . auto/have_headers[m
[31m-        have=NGX_HAVE_STRERROR_R . auto/nohave[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS"[m
[31m-    ;;[m
[31m-[m
[31m-    GNU:*)[m
[31m-        # GNU Hurd[m
[31m-        have=NGX_GNU_HURD . auto/have_headers[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case "$NGX_MACHINE" in[m
[31m-[m
[31m-    i386 | i686 | i86pc)[m
[31m-        have=NGX_HAVE_NONALIGNED . auto/have[m
[31m-        NGX_MACH_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    amd64 | x86_64)[m
[31m-        have=NGX_HAVE_NONALIGNED . auto/have[m
[31m-        NGX_MACH_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sun4u | sun4v | sparc | sparc64)[m
[31m-        have=NGX_ALIGNMENT value=16 . auto/define[m
[31m-        # TODO[m
[31m-        NGX_MACH_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    ia64 )[m
[31m-        have=NGX_ALIGNMENT value=16 . auto/define[m
[31m-        # TODO[m
[31m-        NGX_MACH_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        have=NGX_ALIGNMENT value=16 . auto/define[m
[31m-        NGX_MACH_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-if test -z "$NGX_CPU_CACHE_LINE"; then[m
[31m-    NGX_CPU_CACHE_LINE=$NGX_MACH_CACHE_LINE[m
[31m-fi[m
[31m-[m
[31m-have=NGX_CPU_CACHE_LINE value=$NGX_CPU_CACHE_LINE . auto/define[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/darwin b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/darwin[m
[1mdeleted file mode 100644[m
[1mindex 1bd931c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/darwin[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_DARWIN . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$UNIX_INCS"[m
[31m-CORE_DEPS="$UNIX_DEPS $DARWIN_DEPS"[m
[31m-CORE_SRCS="$UNIX_SRCS $DARWIN_SRCS"[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_spacer='[m
[31m-'[m
[31m-[m
[31m-MAIN_LINK=[m
[31m-MODULE_LINK="-shared -Wl,-undefined,dynamic_lookup"[m
[31m-[m
[31m-# kqueue[m
[31m-[m
[31m-echo " + kqueue found"[m
[31m-have=NGX_HAVE_KQUEUE . auto/have[m
[31m-have=NGX_HAVE_CLEAR_EVENT . auto/have[m
[31m-EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"[m
[31m-CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"[m
[31m-EVENT_FOUND=YES[m
[31m-NGX_KQUEUE_CHECKED=YES[m
[31m-[m
[31m-ngx_feature="kqueue's EVFILT_TIMER"[m
[31m-ngx_feature_name="NGX_HAVE_TIMER_EVENT"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/event.h>[m
[31m-                  #include <sys/time.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int      kq;[m
[31m-                  struct kevent    kev;[m
[31m-                  struct timespec  ts;[m
[31m-[m
[31m-                  if ((kq = kqueue()) == -1) return 1;[m
[31m-[m
[31m-                  kev.ident = 0;[m
[31m-                  kev.filter = EVFILT_TIMER;[m
[31m-                  kev.flags = EV_ADD|EV_ENABLE;[m
[31m-                  kev.fflags = 0;[m
[31m-                  kev.data = 1000;[m
[31m-                  kev.udata = 0;[m
[31m-[m
[31m-                  ts.tv_sec = 0;[m
[31m-                  ts.tv_nsec = 0;[m
[31m-[m
[31m-                  if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1;[m
[31m-[m
[31m-                  if (kev.flags & EV_ERROR) return 1;"[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="Darwin 64-bit kqueue millisecond timeout bug"[m
[31m-ngx_feature_name=NGX_DARWIN_KEVENT_BUG[m
[31m-ngx_feature_run=bug[m
[31m-ngx_feature_incs="#include <sys/event.h>[m
[31m-                  #include <sys/time.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int  kq;[m
[31m-                  struct kevent    kev;[m
[31m-                  struct timespec  ts;[m
[31m-                  struct timeval   tv, tv0;[m
[31m-[m
[31m-                  kq = kqueue();[m
[31m-[m
[31m-                  ts.tv_sec = 0;[m
[31m-                  ts.tv_nsec = 999000000;[m
[31m-[m
[31m-                  gettimeofday(&tv, 0);[m
[31m-                  kevent(kq, NULL, 0, &kev, 1, &ts);[m
[31m-                  gettimeofday(&tv0, 0);[m
[31m-                  timersub(&tv0, &tv, &tv);[m
[31m-[m
[31m-                  if (tv.tv_sec * 1000000 + tv.tv_usec < 900000) return 1;"[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# sendfile()[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS"[m
[31m-ngx_feature="sendfile()"[m
[31m-ngx_feature_name="NGX_HAVE_SENDFILE"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/socket.h>[m
[31m-                  #include <sys/uio.h>[m
[31m-                  #include <sys/errno.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int s = 0, fd = 1;[m
[31m-                  off_t n; off_t off = 0;[m
[31m-                  n = sendfile(s, fd, off, &n, NULL, 0);[m
[31m-                  if (n == -1 && errno == ENOSYS) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $DARWIN_SENDFILE_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="atomic(3)"[m
[31m-ngx_feature_name=NGX_DARWIN_ATOMIC[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <libkern/OSAtomic.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int32_t  lock, n;[m
[31m-                  n = OSAtomicCompareAndSwap32Barrier(0, 1, &lock)"[m
[31m-. auto/feature[m
[31m-[m
[31m-DTRACE_PROBE_OBJ=NO[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/freebsd b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/freebsd[m
[1mdeleted file mode 100644[m
[1mindex d76b32b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/freebsd[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_FREEBSD . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$UNIX_INCS"[m
[31m-CORE_DEPS="$UNIX_DEPS $FREEBSD_DEPS"[m
[31m-CORE_SRCS="$UNIX_SRCS $FREEBSD_SRCS"[m
[31m-[m
[31m-ngx_spacer='[m
[31m-'[m
[31m-[m
[31m-[m
[31m-# __FreeBSD_version and sysctl kern.osreldate are the best ways[m
[31m-# to determine whether some capability exists and is safe to use.[m
[31m-# __FreeBSD_version is used for the testing of the build environment.[m
[31m-# sysctl kern.osreldate is used for the testing of the kernel capabilities.[m
[31m-[m
[31m-version=`grep "#define __FreeBSD_version" /usr/include/osreldate.h \[m
[31m-         | sed -e 's/^.* \(.*\)$/\1/'`[m
[31m-[m
[31m-osreldate=`/sbin/sysctl -n kern.osreldate`[m
[31m-[m
[31m-[m
[31m-# setproctitle() in libutil[m
[31m-[m
[31m-if [ \( $version -ge 500000 -a $version -lt 500012 \) \[m
[31m-     -o $version -lt 410002 ][m
[31m-then[m
[31m-    echo " + setproctitle() in libutil"[m
[31m-[m
[31m-    CORE_LIBS="$CORE_LIBS -lutil"[m
[31m-    NGX_SETPROCTITLE_LIB="-lutil"[m
[31m-fi[m
[31m-[m
[31m-# sendfile[m
[31m-[m
[31m-if [ $osreldate -gt 300007 ]; then[m
[31m-    echo " + sendfile() found"[m
[31m-[m
[31m-    have=NGX_HAVE_SENDFILE . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_FILE_AIO = YES ]; then[m
[31m-    if [ $osreldate -gt 502103 ]; then[m
[31m-        echo " + sendfile()'s SF_NODISKIO found"[m
[31m-[m
[31m-        have=NGX_HAVE_AIO_SENDFILE . auto/have[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-# POSIX semaphores[m
[31m-# http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/127545[m
[31m-[m
[31m-if [ $osreldate -ge 701106 ]; then[m
[31m-    echo " + POSIX semaphores should work"[m
[31m-else[m
[31m-    have=NGX_HAVE_POSIX_SEM . auto/nohave[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# kqueue[m
[31m-[m
[31m-if [ \( $osreldate -lt 500000 -a $osreldate -ge 410000 \) \[m
[31m-     -o $osreldate -ge 500011 ][m
[31m-then[m
[31m-    echo " + kqueue found"[m
[31m-[m
[31m-    have=NGX_HAVE_KQUEUE . auto/have[m
[31m-    have=NGX_HAVE_CLEAR_EVENT . auto/have[m
[31m-    EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"[m
[31m-    CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"[m
[31m-    EVENT_FOUND=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-NGX_KQUEUE_CHECKED=YES[m
[31m-[m
[31m-[m
[31m-# kqueue's NOTE_LOWAT[m
[31m-[m
[31m-if [ \( $version -lt 500000 -a $version -ge 430000 \) \[m
[31m-     -o $version -ge 500018 ][m
[31m-then[m
[31m-    echo " + kqueue's NOTE_LOWAT found"[m
[31m-    have=NGX_HAVE_LOWAT_EVENT . auto/have[m
[31m-fi[m
[31m-[m
[31m-# kqueue's EVFILT_TIMER[m
[31m-[m
[31m-if [ \( $version -lt 500000 -a $version -ge 440001 \) \[m
[31m-     -o $version -ge 500023 ][m
[31m-then[m
[31m-    echo " + kqueue's EVFILT_TIMER found"[m
[31m-    have=NGX_HAVE_TIMER_EVENT . auto/have[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# cpuset_setaffinity()[m
[31m-[m
[31m-if [ $version -ge 701000 ]; then[m
[31m-    echo " + cpuset_setaffinity() found"[m
[31m-    have=NGX_HAVE_CPUSET_SETAFFINITY . auto/have[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    NGX_LD_OPT="$NGX_LD_OPT -lelf"[m
[31m-fi[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/linux b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/linux[m
[1mdeleted file mode 100644[m
[1mindex b5114d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/linux[m
[1m+++ /dev/null[m
[36m@@ -1,175 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_LINUX . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$UNIX_INCS"[m
[31m-CORE_DEPS="$UNIX_DEPS $LINUX_DEPS"[m
[31m-CORE_SRCS="$UNIX_SRCS $LINUX_SRCS"[m
[31m-[m
[31m-ngx_spacer='[m
[31m-'[m
[31m-[m
[31m-cc_aux_flags="$CC_AUX_FLAGS"[m
[31m-CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"[m
[31m-[m
[31m-[m
[31m-# Linux kernel version[m
[31m-[m
[31m-version=$((`uname -r \[m
[31m-    | sed -n -e 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/ \[m
[31m-                                                 \1*256*256+\2*256+\3/p' \[m
[31m-             -e 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1*256*256+\2*256/p'`))[m
[31m-[m
[31m-version=${version:-0}[m
[31m-[m
[31m-[m
[31m-# posix_fadvise64() had been implemented in 2.5.60[m
[31m-[m
[31m-if [ $version -lt 132412 ]; then[m
[31m-    have=NGX_HAVE_POSIX_FADVISE . auto/nohave[m
[31m-fi[m
[31m-[m
[31m-# epoll, EPOLLET version[m
[31m-[m
[31m-ngx_feature="epoll"[m
[31m-ngx_feature_name="NGX_HAVE_EPOLL"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/epoll.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int efd = 0;[m
[31m-                  struct epoll_event ee;[m
[31m-                  ee.events = EPOLLIN|EPOLLOUT|EPOLLET;[m
[31m-                  ee.data.ptr = NULL;[m
[31m-                  efd = epoll_create(100);[m
[31m-                  if (efd == -1) return 1;"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    have=NGX_HAVE_CLEAR_EVENT . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $EPOLL_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE"[m
[31m-    EVENT_FOUND=YES[m
[31m-[m
[31m-[m
[31m-    # EPOLLRDHUP appeared in Linux 2.6.17, glibc 2.8[m
[31m-[m
[31m-    ngx_feature="EPOLLRDHUP"[m
[31m-    ngx_feature_name="NGX_HAVE_EPOLLRDHUP"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <sys/epoll.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="int efd = 0, fd = 0;[m
[31m-                      struct epoll_event ee;[m
[31m-                      ee.events = EPOLLIN|EPOLLRDHUP|EPOLLET;[m
[31m-                      ee.data.ptr = NULL;[m
[31m-                      epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# O_PATH and AT_EMPTY_PATH were introduced in 2.6.39, glibc 2.14[m
[31m-[m
[31m-ngx_feature="O_PATH"[m
[31m-ngx_feature_name="NGX_HAVE_O_PATH"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/stat.h>[m
[31m-                  #include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int fd; struct stat sb;[m
[31m-                  fd = openat(AT_FDCWD, \".\", O_PATH|O_DIRECTORY|O_NOFOLLOW);[m
[31m-                  if (fstatat(fd, \"\", &sb, AT_EMPTY_PATH) != 0) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# sendfile()[m
[31m-[m
[31m-CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE"[m
[31m-ngx_feature="sendfile()"[m
[31m-ngx_feature_name="NGX_HAVE_SENDFILE"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/sendfile.h>[m
[31m-                  #include <errno.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int s = 0, fd = 1;[m
[31m-                  ssize_t n; off_t off = 0;[m
[31m-                  n = sendfile(s, fd, &off, 1);[m
[31m-                  if (n == -1 && errno == ENOSYS) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $LINUX_SENDFILE_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# sendfile64()[m
[31m-[m
[31m-CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"[m
[31m-ngx_feature="sendfile64()"[m
[31m-ngx_feature_name="NGX_HAVE_SENDFILE64"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/sendfile.h>[m
[31m-                  #include <errno.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int s = 0, fd = 1;[m
[31m-                  ssize_t n; off_t off = 0;[m
[31m-                  n = sendfile(s, fd, &off, 1);[m
[31m-                  if (n == -1 && errno == ENOSYS) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_include="sys/prctl.h"; . auto/include[m
[31m-[m
[31m-# prctl(PR_SET_DUMPABLE)[m
[31m-[m
[31m-ngx_feature="prctl(PR_SET_DUMPABLE)"[m
[31m-ngx_feature_name="NGX_HAVE_PR_SET_DUMPABLE"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/prctl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# sched_setaffinity()[m
[31m-[m
[31m-ngx_feature="sched_setaffinity()"[m
[31m-ngx_feature_name="NGX_HAVE_SCHED_SETAFFINITY"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sched.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="cpu_set_t mask;[m
[31m-                  CPU_ZERO(&mask);[m
[31m-                  sched_setaffinity(0, sizeof(cpu_set_t), &mask)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# crypt_r()[m
[31m-[m
[31m-ngx_feature="crypt_r()"[m
[31m-ngx_feature_name="NGX_HAVE_GNU_CRYPT_R"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <crypt.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=-lcrypt[m
[31m-ngx_feature_test="struct crypt_data  cd;[m
[31m-                  crypt_r(\"key\", \"salt\", &cd);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_include="sys/vfs.h";     . auto/include[m
[31m-[m
[31m-[m
[31m-CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"[m
[31m-[m
[31m-DTRACE_FROM_SYSTEMTAP=YES[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/solaris b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/solaris[m
[1mdeleted file mode 100644[m
[1mindex d39df0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/solaris[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_SOLARIS . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$UNIX_INCS"[m
[31m-CORE_DEPS="$UNIX_DEPS $SOLARIS_DEPS"[m
[31m-CORE_SRCS="$UNIX_SRCS $SOLARIS_SRCS "[m
[31m-CORE_LIBS="$CORE_LIBS -lsocket -lnsl"[m
[31m-[m
[31m-NGX_RPATH=YES[m
[31m-[m
[31m-# Solaris's make does not support a blank line between target and rules[m
[31m-ngx_spacer=[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS -D_FILE_OFFSET_BITS=64 -lsocket -lnsl"[m
[31m-[m
[31m-[m
[31m-if [ $ZLIB_ASM != NO ]; then[m
[31m-    echo "$0: error: the --with-zlib-asm=CPU option is not supported"[m
[31m-    echo "on that platform"[m
[31m-    echo[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="sendfilev()"[m
[31m-ngx_feature_name="NGX_HAVE_SENDFILE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/sendfile.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs="-lsendfile"[m
[31m-ngx_feature_test="int fd = 1; sendfilevec_t vec[1];[m
[31m-                  size_t sent; ssize_t n;[m
[31m-                  n = sendfilev(fd, vec, 1, &sent);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS"[m
[31m-    CORE_LIBS="$CORE_LIBS -lsendfile"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="event ports"[m
[31m-ngx_feature_name="NGX_HAVE_EVENTPORT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <port.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int n = port_create()"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $EVENTPORT_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $EVENTPORT_MODULE"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/win32 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/win32[m
[1mdeleted file mode 100644[m
[1mindex 14ae3b8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/os/win32[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_WIN32 . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$WIN32_INCS"[m
[31m-CORE_DEPS="$WIN32_DEPS"[m
[31m-CORE_SRCS="$WIN32_SRCS $IOCP_SRCS"[m
[31m-OS_CONFIG="$WIN32_CONFIG"[m
[31m-NGX_ICONS="$NGX_WIN32_ICONS"[m
[31m-SELECT_SRCS=$WIN32_SELECT_SRCS[m
[31m-[m
[31m-ngx_pic_opt=[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    gcc)[m
[31m-        CORE_LIBS="$CORE_LIBS -ladvapi32 -lws2_32"[m
[31m-        MAIN_LINK="$MAIN_LINK -Wl,--export-all-symbols"[m
[31m-        MAIN_LINK="$MAIN_LINK -Wl,--out-implib=$NGX_OBJS/libnginx.a"[m
[31m-        MODULE_LINK="-shared -L $NGX_OBJS -lnginx"[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        CORE_LIBS="$CORE_LIBS advapi32.lib ws2_32.lib"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-EVENT_MODULES="$EVENT_MODULES $IOCP_MODULE"[m
[31m-EVENT_FOUND=YES[m
[31m-[m
[31m-if [ $EVENT_SELECT = NO ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $SELECT_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_IPV6 = YES ]; then[m
[31m-    have=NGX_HAVE_INET6 . auto/have[m
[31m-fi[m
[31m-[m
[31m-have=NGX_HAVE_IOCP . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/sources b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/sources[m
[1mdeleted file mode 100644[m
[1mindex 2abdc3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/sources[m
[1m+++ /dev/null[m
[36m@@ -1,264 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CORE_MODULES="ngx_core_module ngx_errlog_module ngx_conf_module"[m
[31m-[m
[31m-CORE_INCS="src/core"[m
[31m-[m
[31m-CORE_DEPS="src/core/nginx.h \[m
[31m-           src/core/ngx_config.h \[m
[31m-           src/core/ngx_core.h \[m
[31m-           src/core/ngx_log.h \[m
[31m-           src/core/ngx_palloc.h \[m
[31m-           src/core/ngx_array.h \[m
[31m-           src/core/ngx_list.h \[m
[31m-           src/core/ngx_hash.h \[m
[31m-           src/core/ngx_buf.h \[m
[31m-           src/core/ngx_queue.h \[m
[31m-           src/core/ngx_string.h \[m
[31m-           src/core/ngx_parse.h \[m
[31m-           src/core/ngx_parse_time.h \[m
[31m-           src/core/ngx_inet.h \[m
[31m-           src/core/ngx_file.h \[m
[31m-           src/core/ngx_crc.h \[m
[31m-           src/core/ngx_crc32.h \[m
[31m-           src/core/ngx_murmurhash.h \[m
[31m-           src/core/ngx_md5.h \[m
[31m-           src/core/ngx_sha1.h \[m
[31m-           src/core/ngx_rbtree.h \[m
[31m-           src/core/ngx_radix_tree.h \[m
[31m-           src/core/ngx_rwlock.h \[m
[31m-           src/core/ngx_slab.h \[m
[31m-           src/core/ngx_times.h \[m
[31m-           src/core/ngx_shmtx.h \[m
[31m-           src/core/ngx_connection.h \[m
[31m-           src/core/ngx_cycle.h \[m
[31m-           src/core/ngx_conf_file.h \[m
[31m-           src/core/ngx_module.h \[m
[31m-           src/core/ngx_resolver.h \[m
[31m-           src/core/ngx_open_file_cache.h \[m
[31m-           src/core/ngx_crypt.h \[m
[31m-           src/core/ngx_core_probe.h \[m
[31m-           src/core/ngx_proxy_protocol.h \[m
[31m-           src/core/ngx_syslog.h"[m
[31m-[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    CORE_DEPS="$CORE_DEPS objs/ngx_dtrace_provider.h"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-CORE_SRCS="src/core/nginx.c \[m
[31m-           src/core/ngx_log.c \[m
[31m-           src/core/ngx_palloc.c \[m
[31m-           src/core/ngx_array.c \[m
[31m-           src/core/ngx_list.c \[m
[31m-           src/core/ngx_hash.c \[m
[31m-           src/core/ngx_buf.c \[m
[31m-           src/core/ngx_queue.c \[m
[31m-           src/core/ngx_output_chain.c \[m
[31m-           src/core/ngx_string.c \[m
[31m-           src/core/ngx_parse.c \[m
[31m-           src/core/ngx_parse_time.c \[m
[31m-           src/core/ngx_inet.c \[m
[31m-           src/core/ngx_file.c \[m
[31m-           src/core/ngx_crc32.c \[m
[31m-           src/core/ngx_murmurhash.c \[m
[31m-           src/core/ngx_md5.c \[m
[31m-           src/core/ngx_rbtree.c \[m
[31m-           src/core/ngx_radix_tree.c \[m
[31m-           src/core/ngx_slab.c \[m
[31m-           src/core/ngx_times.c \[m
[31m-           src/core/ngx_shmtx.c \[m
[31m-           src/core/ngx_connection.c \[m
[31m-           src/core/ngx_cycle.c \[m
[31m-           src/core/ngx_spinlock.c \[m
[31m-           src/core/ngx_rwlock.c \[m
[31m-           src/core/ngx_cpuinfo.c \[m
[31m-           src/core/ngx_conf_file.c \[m
[31m-           src/core/ngx_module.c \[m
[31m-           src/core/ngx_resolver.c \[m
[31m-           src/core/ngx_open_file_cache.c \[m
[31m-           src/core/ngx_crypt.c \[m
[31m-           src/core/ngx_proxy_protocol.c \[m
[31m-           src/core/ngx_syslog.c"[m
[31m-[m
[31m-[m
[31m-EVENT_MODULES="ngx_events_module ngx_event_core_module"[m
[31m-[m
[31m-EVENT_INCS="src/event src/event/modules"[m
[31m-[m
[31m-EVENT_DEPS="src/event/ngx_event.h \[m
[31m-            src/event/ngx_event_timer.h \[m
[31m-            src/event/ngx_event_posted.h \[m
[31m-            src/event/ngx_event_connect.h \[m
[31m-            src/event/ngx_event_pipe.h \[m
[31m-            src/event/ngx_event_probe.h"[m
[31m-[m
[31m-EVENT_SRCS="src/event/ngx_event.c \[m
[31m-            src/event/ngx_event_timer.c \[m
[31m-            src/event/ngx_event_posted.c \[m
[31m-            src/event/ngx_event_accept.c \[m
[31m-            src/event/ngx_event_connect.c \[m
[31m-            src/event/ngx_event_pipe.c"[m
[31m-[m
[31m-[m
[31m-SELECT_MODULE=ngx_select_module[m
[31m-SELECT_SRCS=src/event/modules/ngx_select_module.c[m
[31m-WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c[m
[31m-[m
[31m-POLL_MODULE=ngx_poll_module[m
[31m-POLL_SRCS=src/event/modules/ngx_poll_module.c[m
[31m-[m
[31m-KQUEUE_MODULE=ngx_kqueue_module[m
[31m-KQUEUE_SRCS=src/event/modules/ngx_kqueue_module.c[m
[31m-[m
[31m-DEVPOLL_MODULE=ngx_devpoll_module[m
[31m-DEVPOLL_SRCS=src/event/modules/ngx_devpoll_module.c[m
[31m-[m
[31m-EVENTPORT_MODULE=ngx_eventport_module[m
[31m-EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c[m
[31m-[m
[31m-EPOLL_MODULE=ngx_epoll_module[m
[31m-EPOLL_SRCS=src/event/modules/ngx_epoll_module.c[m
[31m-[m
[31m-IOCP_MODULE=ngx_iocp_module[m
[31m-IOCP_SRCS=src/event/modules/ngx_iocp_module.c[m
[31m-[m
[31m-FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"[m
[31m-LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c"[m
[31m-[m
[31m-UNIX_INCS="$CORE_INCS $EVENT_INCS src/os/unix"[m
[31m-[m
[31m-UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \[m
[31m-            src/os/unix/ngx_time.h \[m
[31m-            src/os/unix/ngx_errno.h \[m
[31m-            src/os/unix/ngx_alloc.h \[m
[31m-            src/os/unix/ngx_files.h \[m
[31m-            src/os/unix/ngx_channel.h \[m
[31m-            src/os/unix/ngx_shmem.h \[m
[31m-            src/os/unix/ngx_process.h \[m
[31m-            src/os/unix/ngx_setaffinity.h \[m
[31m-            src/os/unix/ngx_setproctitle.h \[m
[31m-            src/os/unix/ngx_atomic.h \[m
[31m-            src/os/unix/ngx_gcc_atomic_x86.h \[m
[31m-            src/os/unix/ngx_thread.h \[m
[31m-            src/os/unix/ngx_socket.h \[m
[31m-            src/os/unix/ngx_os.h \[m
[31m-            src/os/unix/ngx_user.h \[m
[31m-            src/os/unix/ngx_dlopen.h \[m
[31m-            src/os/unix/ngx_process_cycle.h"[m
[31m-[m
[31m-# add to UNIX_DEPS[m
[31m-#            src/os/unix/ngx_gcc_atomic_amd64.h \[m
[31m-#            src/os/unix/ngx_gcc_atomic_sparc64.h \[m
[31m-#            src/os/unix/ngx_gcc_atomic_ppc.h \[m
[31m-#            src/os/unix/ngx_sunpro_atomic_sparc64.h \[m
[31m-#            src/os/unix/ngx_sunpro_x86.il \[m
[31m-#            src/os/unix/ngx_sunpro_amd64.il \[m
[31m-#            src/os/unix/ngx_sunpro_sparc64.il \[m
[31m-[m
[31m-[m
[31m-UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \[m
[31m-            src/os/unix/ngx_time.c \[m
[31m-            src/os/unix/ngx_errno.c \[m
[31m-            src/os/unix/ngx_alloc.c \[m
[31m-            src/os/unix/ngx_files.c \[m
[31m-            src/os/unix/ngx_socket.c \[m
[31m-            src/os/unix/ngx_recv.c \[m
[31m-            src/os/unix/ngx_readv_chain.c \[m
[31m-            src/os/unix/ngx_udp_recv.c \[m
[31m-            src/os/unix/ngx_send.c \[m
[31m-            src/os/unix/ngx_writev_chain.c \[m
[31m-            src/os/unix/ngx_udp_send.c \[m
[31m-            src/os/unix/ngx_channel.c \[m
[31m-            src/os/unix/ngx_shmem.c \[m
[31m-            src/os/unix/ngx_process.c \[m
[31m-            src/os/unix/ngx_daemon.c \[m
[31m-            src/os/unix/ngx_setaffinity.c \[m
[31m-            src/os/unix/ngx_setproctitle.c \[m
[31m-            src/os/unix/ngx_posix_init.c \[m
[31m-            src/os/unix/ngx_user.c \[m
[31m-            src/os/unix/ngx_dlopen.c \[m
[31m-            src/os/unix/ngx_process_cycle.c"[m
[31m-[m
[31m-POSIX_DEPS=src/os/unix/ngx_posix_config.h[m
[31m-[m
[31m-THREAD_POOL_MODULE=ngx_thread_pool_module[m
[31m-THREAD_POOL_DEPS=src/core/ngx_thread_pool.h[m
[31m-THREAD_POOL_SRCS="src/core/ngx_thread_pool.c[m
[31m-                  src/os/unix/ngx_thread_cond.c[m
[31m-                  src/os/unix/ngx_thread_mutex.c[m
[31m-                  src/os/unix/ngx_thread_id.c"[m
[31m-[m
[31m-FREEBSD_DEPS="src/os/unix/ngx_freebsd_config.h src/os/unix/ngx_freebsd.h"[m
[31m-FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c[m
[31m-FREEBSD_SENDFILE_SRCS=src/os/unix/ngx_freebsd_sendfile_chain.c[m
[31m-[m
[31m-LINUX_DEPS="src/os/unix/ngx_linux_config.h src/os/unix/ngx_linux.h"[m
[31m-LINUX_SRCS=src/os/unix/ngx_linux_init.c[m
[31m-LINUX_SENDFILE_SRCS=src/os/unix/ngx_linux_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-SOLARIS_DEPS="src/os/unix/ngx_solaris_config.h src/os/unix/ngx_solaris.h"[m
[31m-SOLARIS_SRCS=src/os/unix/ngx_solaris_init.c[m
[31m-SOLARIS_SENDFILEV_SRCS=src/os/unix/ngx_solaris_sendfilev_chain.c[m
[31m-[m
[31m-[m
[31m-DARWIN_DEPS="src/os/unix/ngx_darwin_config.h src/os/unix/ngx_darwin.h"[m
[31m-DARWIN_SRCS=src/os/unix/ngx_darwin_init.c[m
[31m-DARWIN_SENDFILE_SRCS=src/os/unix/ngx_darwin_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-WIN32_INCS="$CORE_INCS $EVENT_INCS src/os/win32"[m
[31m-[m
[31m-WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \[m
[31m-            src/os/win32/ngx_win32_config.h \[m
[31m-            src/os/win32/ngx_time.h \[m
[31m-            src/os/win32/ngx_errno.h \[m
[31m-            src/os/win32/ngx_alloc.h \[m
[31m-            src/os/win32/ngx_files.h \[m
[31m-            src/os/win32/ngx_shmem.h \[m
[31m-            src/os/win32/ngx_process.h \[m
[31m-            src/os/win32/ngx_atomic.h \[m
[31m-            src/os/win32/ngx_thread.h \[m
[31m-            src/os/win32/ngx_socket.h \[m
[31m-            src/os/win32/ngx_os.h \[m
[31m-            src/os/win32/ngx_user.h \[m
[31m-            src/os/win32/ngx_dlopen.h \[m
[31m-            src/os/win32/ngx_process_cycle.h"[m
[31m-[m
[31m-WIN32_CONFIG=src/os/win32/ngx_win32_config.h[m
[31m-[m
[31m-WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \[m
[31m-            src/os/win32/ngx_errno.c \[m
[31m-            src/os/win32/ngx_alloc.c \[m
[31m-            src/os/win32/ngx_files.c \[m
[31m-            src/os/win32/ngx_shmem.c \[m
[31m-            src/os/win32/ngx_time.c \[m
[31m-            src/os/win32/ngx_process.c \[m
[31m-            src/os/win32/ngx_thread.c \[m
[31m-            src/os/win32/ngx_socket.c \[m
[31m-            src/os/win32/ngx_wsarecv.c \[m
[31m-            src/os/win32/ngx_wsarecv_chain.c \[m
[31m-            src/os/win32/ngx_udp_wsarecv.c \[m
[31m-            src/os/win32/ngx_wsasend.c \[m
[31m-            src/os/win32/ngx_wsasend_chain.c \[m
[31m-            src/os/win32/ngx_win32_init.c \[m
[31m-            src/os/win32/ngx_user.c \[m
[31m-            src/os/win32/ngx_dlopen.c \[m
[31m-            src/os/win32/ngx_event_log.c \[m
[31m-            src/os/win32/ngx_process_cycle.c \[m
[31m-            src/event/ngx_event_acceptex.c"[m
[31m-[m
[31m-NGX_WIN32_ICONS="src/os/win32/nginx.ico"[m
[31m-NGX_WIN32_RC="src/os/win32/nginx.rc"[m
[31m-[m
[31m-[m
[31m-HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c[m
[31m-[m
[31m-NGX_DTRACE_PROVIDERS=src/dtrace/nginx_provider.d[m
[31m-[m
[31m-NGX_TAPSET_SRCS=src/dtrace/nginx.stp[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/sources.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/sources.orig[m
[1mdeleted file mode 100644[m
[1mindex 27849e6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/sources.orig[m
[1m+++ /dev/null[m
[36m@@ -1,253 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CORE_MODULES="ngx_core_module ngx_errlog_module ngx_conf_module"[m
[31m-[m
[31m-CORE_INCS="src/core"[m
[31m-[m
[31m-CORE_DEPS="src/core/nginx.h \[m
[31m-           src/core/ngx_config.h \[m
[31m-           src/core/ngx_core.h \[m
[31m-           src/core/ngx_log.h \[m
[31m-           src/core/ngx_palloc.h \[m
[31m-           src/core/ngx_array.h \[m
[31m-           src/core/ngx_list.h \[m
[31m-           src/core/ngx_hash.h \[m
[31m-           src/core/ngx_buf.h \[m
[31m-           src/core/ngx_queue.h \[m
[31m-           src/core/ngx_string.h \[m
[31m-           src/core/ngx_parse.h \[m
[31m-           src/core/ngx_parse_time.h \[m
[31m-           src/core/ngx_inet.h \[m
[31m-           src/core/ngx_file.h \[m
[31m-           src/core/ngx_crc.h \[m
[31m-           src/core/ngx_crc32.h \[m
[31m-           src/core/ngx_murmurhash.h \[m
[31m-           src/core/ngx_md5.h \[m
[31m-           src/core/ngx_sha1.h \[m
[31m-           src/core/ngx_rbtree.h \[m
[31m-           src/core/ngx_radix_tree.h \[m
[31m-           src/core/ngx_rwlock.h \[m
[31m-           src/core/ngx_slab.h \[m
[31m-           src/core/ngx_times.h \[m
[31m-           src/core/ngx_shmtx.h \[m
[31m-           src/core/ngx_connection.h \[m
[31m-           src/core/ngx_cycle.h \[m
[31m-           src/core/ngx_conf_file.h \[m
[31m-           src/core/ngx_module.h \[m
[31m-           src/core/ngx_resolver.h \[m
[31m-           src/core/ngx_open_file_cache.h \[m
[31m-           src/core/ngx_crypt.h \[m
[31m-           src/core/ngx_proxy_protocol.h \[m
[31m-           src/core/ngx_syslog.h"[m
[31m-[m
[31m-[m
[31m-CORE_SRCS="src/core/nginx.c \[m
[31m-           src/core/ngx_log.c \[m
[31m-           src/core/ngx_palloc.c \[m
[31m-           src/core/ngx_array.c \[m
[31m-           src/core/ngx_list.c \[m
[31m-           src/core/ngx_hash.c \[m
[31m-           src/core/ngx_buf.c \[m
[31m-           src/core/ngx_queue.c \[m
[31m-           src/core/ngx_output_chain.c \[m
[31m-           src/core/ngx_string.c \[m
[31m-           src/core/ngx_parse.c \[m
[31m-           src/core/ngx_parse_time.c \[m
[31m-           src/core/ngx_inet.c \[m
[31m-           src/core/ngx_file.c \[m
[31m-           src/core/ngx_crc32.c \[m
[31m-           src/core/ngx_murmurhash.c \[m
[31m-           src/core/ngx_md5.c \[m
[31m-           src/core/ngx_rbtree.c \[m
[31m-           src/core/ngx_radix_tree.c \[m
[31m-           src/core/ngx_slab.c \[m
[31m-           src/core/ngx_times.c \[m
[31m-           src/core/ngx_shmtx.c \[m
[31m-           src/core/ngx_connection.c \[m
[31m-           src/core/ngx_cycle.c \[m
[31m-           src/core/ngx_spinlock.c \[m
[31m-           src/core/ngx_rwlock.c \[m
[31m-           src/core/ngx_cpuinfo.c \[m
[31m-           src/core/ngx_conf_file.c \[m
[31m-           src/core/ngx_module.c \[m
[31m-           src/core/ngx_resolver.c \[m
[31m-           src/core/ngx_open_file_cache.c \[m
[31m-           src/core/ngx_crypt.c \[m
[31m-           src/core/ngx_proxy_protocol.c \[m
[31m-           src/core/ngx_syslog.c"[m
[31m-[m
[31m-[m
[31m-EVENT_MODULES="ngx_events_module ngx_event_core_module"[m
[31m-[m
[31m-EVENT_INCS="src/event src/event/modules"[m
[31m-[m
[31m-EVENT_DEPS="src/event/ngx_event.h \[m
[31m-            src/event/ngx_event_timer.h \[m
[31m-            src/event/ngx_event_posted.h \[m
[31m-            src/event/ngx_event_connect.h \[m
[31m-            src/event/ngx_event_pipe.h"[m
[31m-[m
[31m-EVENT_SRCS="src/event/ngx_event.c \[m
[31m-            src/event/ngx_event_timer.c \[m
[31m-            src/event/ngx_event_posted.c \[m
[31m-            src/event/ngx_event_accept.c \[m
[31m-            src/event/ngx_event_connect.c \[m
[31m-            src/event/ngx_event_pipe.c"[m
[31m-[m
[31m-[m
[31m-SELECT_MODULE=ngx_select_module[m
[31m-SELECT_SRCS=src/event/modules/ngx_select_module.c[m
[31m-WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c[m
[31m-[m
[31m-POLL_MODULE=ngx_poll_module[m
[31m-POLL_SRCS=src/event/modules/ngx_poll_module.c[m
[31m-[m
[31m-KQUEUE_MODULE=ngx_kqueue_module[m
[31m-KQUEUE_SRCS=src/event/modules/ngx_kqueue_module.c[m
[31m-[m
[31m-DEVPOLL_MODULE=ngx_devpoll_module[m
[31m-DEVPOLL_SRCS=src/event/modules/ngx_devpoll_module.c[m
[31m-[m
[31m-EVENTPORT_MODULE=ngx_eventport_module[m
[31m-EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c[m
[31m-[m
[31m-EPOLL_MODULE=ngx_epoll_module[m
[31m-EPOLL_SRCS=src/event/modules/ngx_epoll_module.c[m
[31m-[m
[31m-IOCP_MODULE=ngx_iocp_module[m
[31m-IOCP_SRCS=src/event/modules/ngx_iocp_module.c[m
[31m-[m
[31m-FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"[m
[31m-LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c"[m
[31m-[m
[31m-UNIX_INCS="$CORE_INCS $EVENT_INCS src/os/unix"[m
[31m-[m
[31m-UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \[m
[31m-            src/os/unix/ngx_time.h \[m
[31m-            src/os/unix/ngx_errno.h \[m
[31m-            src/os/unix/ngx_alloc.h \[m
[31m-            src/os/unix/ngx_files.h \[m
[31m-            src/os/unix/ngx_channel.h \[m
[31m-            src/os/unix/ngx_shmem.h \[m
[31m-            src/os/unix/ngx_process.h \[m
[31m-            src/os/unix/ngx_setaffinity.h \[m
[31m-            src/os/unix/ngx_setproctitle.h \[m
[31m-            src/os/unix/ngx_atomic.h \[m
[31m-            src/os/unix/ngx_gcc_atomic_x86.h \[m
[31m-            src/os/unix/ngx_thread.h \[m
[31m-            src/os/unix/ngx_socket.h \[m
[31m-            src/os/unix/ngx_os.h \[m
[31m-            src/os/unix/ngx_user.h \[m
[31m-            src/os/unix/ngx_dlopen.h \[m
[31m-            src/os/unix/ngx_process_cycle.h"[m
[31m-[m
[31m-# add to UNIX_DEPS[m
[31m-#            src/os/unix/ngx_gcc_atomic_amd64.h \[m
[31m-#            src/os/unix/ngx_gcc_atomic_sparc64.h \[m
[31m-#            src/os/unix/ngx_gcc_atomic_ppc.h \[m
[31m-#            src/os/unix/ngx_sunpro_atomic_sparc64.h \[m
[31m-#            src/os/unix/ngx_sunpro_x86.il \[m
[31m-#            src/os/unix/ngx_sunpro_amd64.il \[m
[31m-#            src/os/unix/ngx_sunpro_sparc64.il \[m
[31m-[m
[31m-[m
[31m-UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \[m
[31m-            src/os/unix/ngx_time.c \[m
[31m-            src/os/unix/ngx_errno.c \[m
[31m-            src/os/unix/ngx_alloc.c \[m
[31m-            src/os/unix/ngx_files.c \[m
[31m-            src/os/unix/ngx_socket.c \[m
[31m-            src/os/unix/ngx_recv.c \[m
[31m-            src/os/unix/ngx_readv_chain.c \[m
[31m-            src/os/unix/ngx_udp_recv.c \[m
[31m-            src/os/unix/ngx_send.c \[m
[31m-            src/os/unix/ngx_writev_chain.c \[m
[31m-            src/os/unix/ngx_udp_send.c \[m
[31m-            src/os/unix/ngx_channel.c \[m
[31m-            src/os/unix/ngx_shmem.c \[m
[31m-            src/os/unix/ngx_process.c \[m
[31m-            src/os/unix/ngx_daemon.c \[m
[31m-            src/os/unix/ngx_setaffinity.c \[m
[31m-            src/os/unix/ngx_setproctitle.c \[m
[31m-            src/os/unix/ngx_posix_init.c \[m
[31m-            src/os/unix/ngx_user.c \[m
[31m-            src/os/unix/ngx_dlopen.c \[m
[31m-            src/os/unix/ngx_process_cycle.c"[m
[31m-[m
[31m-POSIX_DEPS=src/os/unix/ngx_posix_config.h[m
[31m-[m
[31m-THREAD_POOL_MODULE=ngx_thread_pool_module[m
[31m-THREAD_POOL_DEPS=src/core/ngx_thread_pool.h[m
[31m-THREAD_POOL_SRCS="src/core/ngx_thread_pool.c[m
[31m-                  src/os/unix/ngx_thread_cond.c[m
[31m-                  src/os/unix/ngx_thread_mutex.c[m
[31m-                  src/os/unix/ngx_thread_id.c"[m
[31m-[m
[31m-FREEBSD_DEPS="src/os/unix/ngx_freebsd_config.h src/os/unix/ngx_freebsd.h"[m
[31m-FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c[m
[31m-FREEBSD_SENDFILE_SRCS=src/os/unix/ngx_freebsd_sendfile_chain.c[m
[31m-[m
[31m-LINUX_DEPS="src/os/unix/ngx_linux_config.h src/os/unix/ngx_linux.h"[m
[31m-LINUX_SRCS=src/os/unix/ngx_linux_init.c[m
[31m-LINUX_SENDFILE_SRCS=src/os/unix/ngx_linux_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-SOLARIS_DEPS="src/os/unix/ngx_solaris_config.h src/os/unix/ngx_solaris.h"[m
[31m-SOLARIS_SRCS=src/os/unix/ngx_solaris_init.c[m
[31m-SOLARIS_SENDFILEV_SRCS=src/os/unix/ngx_solaris_sendfilev_chain.c[m
[31m-[m
[31m-[m
[31m-DARWIN_DEPS="src/os/unix/ngx_darwin_config.h src/os/unix/ngx_darwin.h"[m
[31m-DARWIN_SRCS=src/os/unix/ngx_darwin_init.c[m
[31m-DARWIN_SENDFILE_SRCS=src/os/unix/ngx_darwin_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-WIN32_INCS="$CORE_INCS $EVENT_INCS src/os/win32"[m
[31m-[m
[31m-WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \[m
[31m-            src/os/win32/ngx_win32_config.h \[m
[31m-            src/os/win32/ngx_time.h \[m
[31m-            src/os/win32/ngx_errno.h \[m
[31m-            src/os/win32/ngx_alloc.h \[m
[31m-            src/os/win32/ngx_files.h \[m
[31m-            src/os/win32/ngx_shmem.h \[m
[31m-            src/os/win32/ngx_process.h \[m
[31m-            src/os/win32/ngx_atomic.h \[m
[31m-            src/os/win32/ngx_thread.h \[m
[31m-            src/os/win32/ngx_socket.h \[m
[31m-            src/os/win32/ngx_os.h \[m
[31m-            src/os/win32/ngx_user.h \[m
[31m-            src/os/win32/ngx_dlopen.h \[m
[31m-            src/os/win32/ngx_process_cycle.h"[m
[31m-[m
[31m-WIN32_CONFIG=src/os/win32/ngx_win32_config.h[m
[31m-[m
[31m-WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \[m
[31m-            src/os/win32/ngx_errno.c \[m
[31m-            src/os/win32/ngx_alloc.c \[m
[31m-            src/os/win32/ngx_files.c \[m
[31m-            src/os/win32/ngx_shmem.c \[m
[31m-            src/os/win32/ngx_time.c \[m
[31m-            src/os/win32/ngx_process.c \[m
[31m-            src/os/win32/ngx_thread.c \[m
[31m-            src/os/win32/ngx_socket.c \[m
[31m-            src/os/win32/ngx_wsarecv.c \[m
[31m-            src/os/win32/ngx_wsarecv_chain.c \[m
[31m-            src/os/win32/ngx_udp_wsarecv.c \[m
[31m-            src/os/win32/ngx_wsasend.c \[m
[31m-            src/os/win32/ngx_wsasend_chain.c \[m
[31m-            src/os/win32/ngx_win32_init.c \[m
[31m-            src/os/win32/ngx_user.c \[m
[31m-            src/os/win32/ngx_dlopen.c \[m
[31m-            src/os/win32/ngx_event_log.c \[m
[31m-            src/os/win32/ngx_process_cycle.c \[m
[31m-            src/event/ngx_event_acceptex.c"[m
[31m-[m
[31m-NGX_WIN32_ICONS="src/os/win32/nginx.ico"[m
[31m-NGX_WIN32_RC="src/os/win32/nginx.rc"[m
[31m-[m
[31m-[m
[31m-HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/stubs b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/stubs[m
[1mdeleted file mode 100644[m
[1mindex d8bc1f0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/stubs[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_SUPPRESS_WARN . auto/have[m
[31m-[m
[31m-have=NGX_SMP . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/summary b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/summary[m
[1mdeleted file mode 100644[m
[1mindex ed67c75..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/summary[m
[1m+++ /dev/null[m
[36m@@ -1,109 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo[m
[31m-echo "Configuration summary"[m
[31m-[m
[31m-[m
[31m-if [ $USE_THREADS = YES ]; then[m
[31m-    echo "  + using threads"[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_PCRE = DISABLED ]; then[m
[31m-    echo "  + PCRE library is disabled"[m
[31m-[m
[31m-else[m
[31m-    case $PCRE in[m
[31m-        YES)   echo "  + using system PCRE library" ;;[m
[31m-        NONE)  echo "  + PCRE library is not used" ;;[m
[31m-        *)     echo "  + using PCRE library: $PCRE" ;;[m
[31m-    esac[m
[31m-fi[m
[31m-[m
[31m-case $OPENSSL in[m
[31m-    YES)   echo "  + using system OpenSSL library" ;;[m
[31m-    NONE)  echo "  + OpenSSL library is not used" ;;[m
[31m-    *)     echo "  + using OpenSSL library: $OPENSSL" ;;[m
[31m-esac[m
[31m-[m
[31m-case $MD5 in[m
[31m-    YES)   echo "  + md5: using $MD5_LIB library" ;;[m
[31m-    NONE)  echo "  + md5 library is not used" ;;[m
[31m-    NO)    echo "  + using builtin md5 code" ;;[m
[31m-    *)     echo "  + using md5 library: $MD5" ;;[m
[31m-esac[m
[31m-[m
[31m-case $SHA1 in[m
[31m-    YES)   echo "  + sha1: using $SHA1_LIB library" ;;[m
[31m-    NONE)  echo "  + sha1 library is not used" ;;[m
[31m-    NO)    echo "  + sha1 library is not found" ;;[m
[31m-    *)     echo "  + using sha1 library: $SHA1" ;;[m
[31m-esac[m
[31m-[m
[31m-case $ZLIB in[m
[31m-    YES)   echo "  + using system zlib library" ;;[m
[31m-    NONE)  echo "  + zlib library is not used" ;;[m
[31m-    *)     echo "  + using zlib library: $ZLIB" ;;[m
[31m-esac[m
[31m-[m
[31m-case $NGX_LIBATOMIC in[m
[31m-    YES)   echo "  + using system libatomic_ops library" ;;[m
[31m-    NO)    ;; # not used[m
[31m-    *)     echo "  + using libatomic_ops library: $NGX_LIBATOMIC" ;;[m
[31m-esac[m
[31m-[m
[31m-echo[m
[31m-[m
[31m-[m
[31m-cat << END[m
[31m-  nginx path prefix: "$NGX_PREFIX"[m
[31m-  nginx binary file: "$NGX_SBIN_PATH"[m
[31m-  nginx modules path: "$NGX_MODULES_PATH"[m
[31m-  nginx configuration prefix: "$NGX_CONF_PREFIX"[m
[31m-  nginx configuration file: "$NGX_CONF_PATH"[m
[31m-  nginx pid file: "$NGX_PID_PATH"[m
[31m-END[m
[31m-[m
[31m-if test -n "$NGX_ERROR_LOG_PATH"; then[m
[31m-    echo "  nginx error log file: \"$NGX_ERROR_LOG_PATH\""[m
[31m-else[m
[31m-    echo "  nginx logs errors to stderr"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    cat << END[m
[31m-  nginx dtrace static probes enabled[m
[31m-END[m
[31m-[m
[31m-    if [ $DTRACE_FROM_SYSTEMTAP = YES ]; then[m
[31m-        cat << END[m
[31m-  nginx systemtap tapset prefix: "$NGX_TAPSET_PREFIX"[m
[31m-  nginx systemtap wrapper script: "$NGX_STAP_NGX_PATH"[m
[31m-END[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-cat << END[m
[31m-  nginx http access log file: "$NGX_HTTP_LOG_PATH"[m
[31m-  nginx http client request body temporary files: "$NGX_HTTP_CLIENT_TEMP_PATH"[m
[31m-END[m
[31m-[m
[31m-if [ $HTTP_PROXY = YES ]; then[m
[31m-    echo "  nginx http proxy temporary files: \"$NGX_HTTP_PROXY_TEMP_PATH\""[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_FASTCGI = YES ]; then[m
[31m-    echo "  nginx http fastcgi temporary files: \"$NGX_HTTP_FASTCGI_TEMP_PATH\""[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UWSGI = YES ]; then[m
[31m-    echo "  nginx http uwsgi temporary files: \"$NGX_HTTP_UWSGI_TEMP_PATH\""[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SCGI = YES ]; then[m
[31m-    echo "  nginx http scgi temporary files: \"$NGX_HTTP_SCGI_TEMP_PATH\""[m
[31m-fi[m
[31m-[m
[31m-echo "$NGX_POST_CONF_MSG"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/threads b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/threads[m
[1mdeleted file mode 100644[m
[1mindex 381f07a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/threads[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $USE_THREADS = YES ]; then[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-        cat << END[m
[31m-[m
[31m-$0: --with-threads is not supported on Windows[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-    have=NGX_THREADS . auto/have[m
[31m-    CORE_DEPS="$CORE_DEPS $THREAD_POOL_DEPS"[m
[31m-    CORE_SRCS="$CORE_SRCS $THREAD_POOL_SRCS"[m
[31m-    CORE_LIBS="$CORE_LIBS -lpthread"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/sizeof b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/sizeof[m
[1mdeleted file mode 100644[m
[1mindex b5b71bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/sizeof[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_type size ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_type size[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_size=[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-$NGX_INCLUDE_UNISTD_H[m
[31m-#include <signal.h>[m
[31m-#include <stdio.h>[m
[31m-#include <sys/resource.h>[m
[31m-$NGX_INCLUDE_INTTYPES_H[m
[31m-$NGX_INCLUDE_AUTO_CONFIG_H[m
[31m-[m
[31m-int main() {[m
[31m-    printf("%d", (int) sizeof($ngx_type));[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \[m
[31m-          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"[m
[31m-[m
[31m-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    ngx_size=`$NGX_AUTOTEST`[m
[31m-    echo " $ngx_size bytes"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case $ngx_size in[m
[31m-    4)[m
[31m-        ngx_max_value=2147483647[m
[31m-        ngx_max_len='(sizeof("-2147483648") - 1)'[m
[31m-    ;;[m
[31m-[m
[31m-    8)[m
[31m-        ngx_max_value=9223372036854775807LL[m
[31m-        ngx_max_len='(sizeof("-9223372036854775808") - 1)'[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        echo[m
[31m-        echo "$0: error: can not detect $ngx_type size"[m
[31m-[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-        cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-        echo $ngx_test       >> $NGX_AUTOCONF_ERR[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-        rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-        exit 1[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/typedef b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/typedef[m
[1mdeleted file mode 100644[m
[1mindex b55237e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/typedef[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_type ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_type[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_found=no[m
[31m-[m
[31m-for ngx_try in $ngx_type $ngx_types[m
[31m-do[m
[31m-[m
[31m-    cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <signal.h>[m
[31m-#include <sys/socket.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <netinet/in.h>[m
[31m-$NGX_INCLUDE_INTTYPES_H[m
[31m-[m
[31m-int main() {[m
[31m-    $ngx_try i = 0;[m
[31m-    return (int) i;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \[m
[31m-              -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"[m
[31m-[m
[31m-    eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-    if [ -x $NGX_AUTOTEST ]; then[m
[31m-        if [ $ngx_try = $ngx_type ]; then[m
[31m-            echo " found"[m
[31m-            ngx_found=yes[m
[31m-        else[m
[31m-            echo ", $ngx_try used"[m
[31m-            ngx_found=$ngx_try[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        if [ $ngx_try = $ngx_type ]; then[m
[31m-            echo $ngx_n " $ngx_try not found$ngx_c"[m
[31m-        else[m
[31m-            echo $ngx_n ", $ngx_try not found$ngx_c"[m
[31m-        fi[m
[31m-[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-        cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-        echo $ngx_test       >> $NGX_AUTOCONF_ERR[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    fi[m
[31m-[m
[31m-    rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-    if [ $ngx_found != no ]; then[m
[31m-        break[m
[31m-    fi[m
[31m-done[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    echo[m
[31m-    echo "$0: error: can not define $ngx_type"[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found != yes ]; then[m
[31m-    echo "typedef $ngx_found  $ngx_type;"   >> $NGX_AUTO_CONFIG_H[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/uintptr_t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/uintptr_t[m
[1mdeleted file mode 100644[m
[1mindex 2b7212e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/uintptr_t[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for uintptr_t ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for uintptr_t[m
[31m-[m
[31m-END[m
[31m-[m
[31m-found=no[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-$NGX_INTTYPES_H[m
[31m-[m
[31m-int main() {[m
[31m-    uintptr_t i = 0;[m
[31m-    return (int) i;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \[m
[31m-          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT"[m
[31m-[m
[31m-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    echo " uintptr_t found"[m
[31m-    found=yes[m
[31m-else[m
[31m-    echo $ngx_n " uintptr_t not found" $ngx_c[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-[m
[31m-if [ $found = no ]; then[m
[31m-    found="uint`expr 8 \* $ngx_ptr_size`_t"[m
[31m-    echo ", $found used"[m
[31m-[m
[31m-    echo "typedef $found  uintptr_t;"                   >> $NGX_AUTO_CONFIG_H[m
[31m-    echo "typedef $found  intptr_t;" | sed -e 's/u//g'  >> $NGX_AUTO_CONFIG_H[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/value b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/value[m
[1mdeleted file mode 100644[m
[1mindex ac88a39..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/types/value[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $ngx_param[m
[31m-#define $ngx_param  $ngx_value[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/unix b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/unix[m
[1mdeleted file mode 100755[m
[1mindex 8c0e813..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/auto/unix[m
[1m+++ /dev/null[m
[36m@@ -1,911 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-NGX_USER=${NGX_USER:-nobody}[m
[31m-[m
[31m-if [ -z "$NGX_GROUP" ]; then[m
[31m-    if [ $NGX_USER = nobody ]; then[m
[31m-        if grep nobody /etc/group 2>&1 >/dev/null; then[m
[31m-            echo "checking for nobody group ... found"[m
[31m-            NGX_GROUP=nobody[m
[31m-        else[m
[31m-            echo "checking for nobody group ... not found"[m
[31m-[m
[31m-            if grep nogroup /etc/group 2>&1 >/dev/null; then[m
[31m-                echo "checking for nogroup group ... found"[m
[31m-                NGX_GROUP=nogroup[m
[31m-            else[m
[31m-                echo "checking for nogroup group ... not found"[m
[31m-                NGX_GROUP=nobody[m
[31m-            fi[m
[31m-        fi[m
[31m-    else[m
[31m-        NGX_GROUP=$NGX_USER[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="poll()"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <poll.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int  n; struct pollfd  pl;[m
[31m-                  pl.fd = 0;[m
[31m-                  pl.events = 0;[m
[31m-                  pl.revents = 0;[m
[31m-                  n = poll(&pl, 1, 0);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    EVENT_POLL=NONE[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="/dev/poll"[m
[31m-ngx_feature_name="NGX_HAVE_DEVPOLL"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/devpoll.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int  n, dp; struct dvpoll  dvp;[m
[31m-                  dp = 0;[m
[31m-                  dvp.dp_fds = NULL;[m
[31m-                  dvp.dp_nfds = 0;[m
[31m-                  dvp.dp_timeout = 0;[m
[31m-                  n = ioctl(dp, DP_POLL, &dvp);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE"[m
[31m-    EVENT_FOUND=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if test -z "$NGX_KQUEUE_CHECKED"; then[m
[31m-    ngx_feature="kqueue"[m
[31m-    ngx_feature_name="NGX_HAVE_KQUEUE"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <sys/event.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="int kq; kq = kqueue()"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-        have=NGX_HAVE_CLEAR_EVENT . auto/have[m
[31m-        EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"[m
[31m-        CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"[m
[31m-        EVENT_FOUND=YES[m
[31m-[m
[31m-        ngx_feature="kqueue's NOTE_LOWAT"[m
[31m-        ngx_feature_name="NGX_HAVE_LOWAT_EVENT"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <sys/event.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="struct kevent  kev;[m
[31m-                          kev.fflags = NOTE_LOWAT;"[m
[31m-        . auto/feature[m
[31m-[m
[31m-[m
[31m-        ngx_feature="kqueue's EVFILT_TIMER"[m
[31m-        ngx_feature_name="NGX_HAVE_TIMER_EVENT"[m
[31m-        ngx_feature_run=yes[m
[31m-        ngx_feature_incs="#include <sys/event.h>[m
[31m-                          #include <sys/time.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="int      kq;[m
[31m-                  struct kevent    kev;[m
[31m-                  struct timespec  ts;[m
[31m-[m
[31m-                  if ((kq = kqueue()) == -1) return 1;[m
[31m-[m
[31m-                  kev.ident = 0;[m
[31m-                  kev.filter = EVFILT_TIMER;[m
[31m-                  kev.flags = EV_ADD|EV_ENABLE;[m
[31m-                  kev.fflags = 0;[m
[31m-                  kev.data = 1000;[m
[31m-                  kev.udata = 0;[m
[31m-[m
[31m-                  ts.tv_sec = 0;[m
[31m-                  ts.tv_nsec = 0;[m
[31m-[m
[31m-                  if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1;[m
[31m-[m
[31m-                  if (kev.flags & EV_ERROR) return 1;"[m
[31m-[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ "$NGX_SYSTEM" = "NetBSD" ]; then[m
[31m-[m
[31m-    # NetBSD 2.0 incompatibly defines kevent.udata as "intptr_t"[m
[31m-[m
[31m-    cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#define NGX_KQUEUE_UDATA_T[m
[31m-[m
[31m-END[m
[31m-[m
[31m-else[m
[31m-    cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#define NGX_KQUEUE_UDATA_T  (void *)[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="crypt()"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="crypt(\"test\", \"salt\");"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    ngx_feature="crypt() in libcrypt"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=-lcrypt[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CRYPT_LIB="-lcrypt"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="F_READAHEAD"[m
[31m-ngx_feature_name="NGX_HAVE_F_READAHEAD"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="fcntl(0, F_READAHEAD, 1);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="posix_fadvise()"[m
[31m-ngx_feature_name="NGX_HAVE_POSIX_FADVISE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="O_DIRECT"[m
[31m-ngx_feature_name="NGX_HAVE_O_DIRECT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="fcntl(0, F_SETFL, O_DIRECT);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes -a "$NGX_SYSTEM" = "Linux" ]; then[m
[31m-    have=NGX_HAVE_ALIGNED_DIRECTIO . auto/have[m
[31m-fi[m
[31m-[m
[31m-ngx_feature="F_NOCACHE"[m
[31m-ngx_feature_name="NGX_HAVE_F_NOCACHE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="fcntl(0, F_NOCACHE, 1);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="directio()"[m
[31m-ngx_feature_name="NGX_HAVE_DIRECTIO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="directio(0, DIRECTIO_ON);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="statfs()"[m
[31m-ngx_feature_name="NGX_HAVE_STATFS"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="$NGX_INCLUDE_SYS_PARAM_H[m
[31m-                  $NGX_INCLUDE_SYS_MOUNT_H[m
[31m-                  $NGX_INCLUDE_SYS_VFS_H"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct statfs  fs;[m
[31m-                  statfs(\".\", &fs);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="statvfs()"[m
[31m-ngx_feature_name="NGX_HAVE_STATVFS"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/statvfs.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct statvfs  fs;[m
[31m-                  statvfs(\".\", &fs);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="dlopen()"[m
[31m-ngx_feature_name="NGX_HAVE_DLOPEN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <dlfcn.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); dlsym(NULL, NULL)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found != yes ]; then[m
[31m-[m
[31m-    ngx_feature="dlopen() in libdl"[m
[31m-    ngx_feature_libs="-ldl"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -ldl"[m
[31m-        NGX_LIBDL="-ldl"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="sched_yield()"[m
[31m-ngx_feature_name="NGX_HAVE_SCHED_YIELD"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sched.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="sched_yield()"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found != yes ]; then[m
[31m-[m
[31m-    ngx_feature="sched_yield() in librt"[m
[31m-    ngx_feature_libs="-lrt"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -lrt"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="SO_SETFIB"[m
[31m-ngx_feature_name="NGX_HAVE_SETFIB"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="SO_REUSEPORT"[m
[31m-ngx_feature_name="NGX_HAVE_REUSEPORT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_REUSEPORT, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="SO_ACCEPTFILTER"[m
[31m-ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# BSD way to get IPv4 datagram destination address[m
[31m-[m
[31m-ngx_feature="IP_RECVDSTADDR"[m
[31m-ngx_feature_name="NGX_HAVE_IP_RECVDSTADDR"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_RECVDSTADDR, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# Linux way to get IPv4 datagram destination address[m
[31m-[m
[31m-ngx_feature="IP_PKTINFO"[m
[31m-ngx_feature_name="NGX_HAVE_IP_PKTINFO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_PKTINFO, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# RFC 3542 way to get IPv6 datagram destination address[m
[31m-[m
[31m-ngx_feature="IPV6_RECVPKTINFO"[m
[31m-ngx_feature_name="NGX_HAVE_IPV6_RECVPKTINFO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_IPV6, IPV6_RECVPKTINFO, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="TCP_DEFER_ACCEPT"[m
[31m-ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_DEFER_ACCEPT, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="TCP_KEEPIDLE"[m
[31m-ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPIDLE, NULL, 0);[m
[31m-                  setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0);[m
[31m-                  setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="TCP_FASTOPEN"[m
[31m-ngx_feature_name="NGX_HAVE_TCP_FASTOPEN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_FASTOPEN, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="TCP_INFO"[m
[31m-ngx_feature_name="NGX_HAVE_TCP_INFO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="socklen_t optlen = sizeof(struct tcp_info);[m
[31m-                  struct tcp_info ti;[m
[31m-                  ti.tcpi_rtt = 0;[m
[31m-                  ti.tcpi_rttvar = 0;[m
[31m-                  ti.tcpi_snd_cwnd = 0;[m
[31m-                  ti.tcpi_rcv_space = 0;[m
[31m-                  getsockopt(0, IPPROTO_TCP, TCP_INFO, &ti, &optlen)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="accept4()"[m
[31m-ngx_feature_name="NGX_HAVE_ACCEPT4"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="accept4(0, NULL, NULL, SOCK_NONBLOCK)"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $NGX_FILE_AIO = YES ]; then[m
[31m-[m
[31m-    ngx_feature="kqueue AIO support"[m
[31m-    ngx_feature_name="NGX_HAVE_FILE_AIO"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <aio.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="int  n; struct aiocb  iocb;[m
[31m-                      iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;[m
[31m-                      n = aio_read(&iocb)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_SRCS="$CORE_SRCS $FILE_AIO_SRCS"[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-[m
[31m-        ngx_feature="Linux AIO support"[m
[31m-        ngx_feature_name="NGX_HAVE_FILE_AIO"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <linux/aio_abi.h>[m
[31m-                          #include <sys/eventfd.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="struct iocb  iocb;[m
[31m-                          iocb.aio_lio_opcode = IOCB_CMD_PREAD;[m
[31m-                          iocb.aio_flags = IOCB_FLAG_RESFD;[m
[31m-                          iocb.aio_resfd = -1;[m
[31m-                          (void) eventfd(0, 0)"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            have=NGX_HAVE_EVENTFD . auto/have[m
[31m-            have=NGX_HAVE_SYS_EVENTFD_H . auto/have[m
[31m-            CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS"[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-[m
[31m-        ngx_feature="Linux AIO support (SYS_eventfd)"[m
[31m-        ngx_feature_incs="#include <linux/aio_abi.h>[m
[31m-                          #include <sys/syscall.h>"[m
[31m-        ngx_feature_test="int  n = SYS_eventfd;[m
[31m-                          struct iocb  iocb;[m
[31m-                          iocb.aio_lio_opcode = IOCB_CMD_PREAD;[m
[31m-                          iocb.aio_flags = IOCB_FLAG_RESFD;[m
[31m-                          iocb.aio_resfd = -1;"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            have=NGX_HAVE_EVENTFD . auto/have[m
[31m-            CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS"[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        cat << END[m
[31m-[m
[31m-$0: no supported file AIO was found[m
[31m-Currently file AIO is supported on FreeBSD 4.3+ and Linux 2.6.22+ only[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    ngx_feature="eventfd()"[m
[31m-    ngx_feature_name="NGX_HAVE_EVENTFD"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <sys/eventfd.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="(void) eventfd(0, 0)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        have=NGX_HAVE_SYS_EVENTFD_H . auto/have[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-[m
[31m-        ngx_feature="eventfd() (SYS_eventfd)"[m
[31m-        ngx_feature_incs="#include <sys/syscall.h>"[m
[31m-        ngx_feature_test="int n = SYS_eventfd"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-have=NGX_HAVE_UNIX_DOMAIN . auto/have[m
[31m-[m
[31m-ngx_feature_libs=[m
[31m-[m
[31m-[m
[31m-# C types[m
[31m-[m
[31m-ngx_type="int"; . auto/types/sizeof[m
[31m-[m
[31m-ngx_type="long"; . auto/types/sizeof[m
[31m-[m
[31m-ngx_type="long long"; . auto/types/sizeof[m
[31m-[m
[31m-ngx_type="void *"; . auto/types/sizeof; ngx_ptr_size=$ngx_size[m
[31m-ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value[m
[31m-[m
[31m-[m
[31m-# POSIX types[m
[31m-[m
[31m-NGX_INCLUDE_AUTO_CONFIG_H="#include \"ngx_auto_config.h\""[m
[31m-[m
[31m-ngx_type="uint32_t"; ngx_types="u_int32_t"; . auto/types/typedef[m
[31m-ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef[m
[31m-[m
[31m-ngx_type="sig_atomic_t"; ngx_types="int"; . auto/types/typedef[m
[31m-. auto/types/sizeof[m
[31m-ngx_param=NGX_SIG_ATOMIC_T_SIZE; ngx_value=$ngx_size; . auto/types/value[m
[31m-[m
[31m-ngx_type="socklen_t"; ngx_types="int"; . auto/types/typedef[m
[31m-[m
[31m-ngx_type="in_addr_t"; ngx_types="uint32_t u_int32_t"; . auto/types/typedef[m
[31m-[m
[31m-ngx_type="in_port_t"; ngx_types="u_short"; . auto/types/typedef[m
[31m-[m
[31m-ngx_type="rlim_t"; ngx_types="int"; . auto/types/typedef[m
[31m-[m
[31m-. auto/types/uintptr_t[m
[31m-[m
[31m-. auto/endianness[m
[31m-[m
[31m-ngx_type="size_t"; . auto/types/sizeof[m
[31m-ngx_param=NGX_MAX_SIZE_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value[m
[31m-ngx_param=NGX_SIZE_T_LEN; ngx_value=$ngx_max_len; . auto/types/value[m
[31m-[m
[31m-ngx_type="off_t"; . auto/types/sizeof[m
[31m-ngx_param=NGX_MAX_OFF_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value[m
[31m-ngx_param=NGX_OFF_T_LEN; ngx_value=$ngx_max_len; . auto/types/value[m
[31m-[m
[31m-ngx_type="time_t"; . auto/types/sizeof[m
[31m-ngx_param=NGX_TIME_T_SIZE; ngx_value=$ngx_size; . auto/types/value[m
[31m-ngx_param=NGX_TIME_T_LEN; ngx_value=$ngx_max_len; . auto/types/value[m
[31m-ngx_param=NGX_MAX_TIME_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value[m
[31m-[m
[31m-[m
[31m-# syscalls, libc calls and some features[m
[31m-[m
[31m-[m
[31m-if [ $NGX_IPV6 = YES ]; then[m
[31m-    ngx_feature="AF_INET6"[m
[31m-    ngx_feature_name="NGX_HAVE_INET6"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <sys/socket.h>[m
[31m-                      #include <netinet/in.h>[m
[31m-                      #include <arpa/inet.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="struct sockaddr_in6  sin6;[m
[31m-                      sin6.sin6_family = AF_INET6;"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="setproctitle()"[m
[31m-ngx_feature_name="NGX_HAVE_SETPROCTITLE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdlib.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=$NGX_SETPROCTITLE_LIB[m
[31m-ngx_feature_test="setproctitle(\"test\");"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="pread()"[m
[31m-ngx_feature_name="NGX_HAVE_PREAD"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="char buf[1]; ssize_t n; n = pread(0, buf, 1, 0);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="pwrite()"[m
[31m-ngx_feature_name="NGX_HAVE_PWRITE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="char buf[1]; ssize_t n; n = pwrite(1, buf, 1, 0);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# pwritev() was introduced in FreeBSD 6 and Linux 2.6.30, glibc 2.10[m
[31m-[m
[31m-ngx_feature="pwritev()"[m
[31m-ngx_feature_name="NGX_HAVE_PWRITEV"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs='#include <sys/uio.h>'[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="char buf[1]; struct iovec vec[1]; ssize_t n;[m
[31m-                  vec[0].iov_base = buf;[m
[31m-                  vec[0].iov_len = 1;[m
[31m-                  n = pwritev(1, vec, 1, 0);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="sys_nerr"[m
[31m-ngx_feature_name="NGX_SYS_NERR"[m
[31m-ngx_feature_run=value[m
[31m-ngx_feature_incs='#include <errno.h>[m
[31m-                  #include <stdio.h>'[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test='printf("%d", sys_nerr);'[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # Cygiwn defines _sys_nerr[m
[31m-    ngx_feature="_sys_nerr"[m
[31m-    ngx_feature_name="NGX_SYS_NERR"[m
[31m-    ngx_feature_run=value[m
[31m-    ngx_feature_incs='#include <errno.h>[m
[31m-                      #include <stdio.h>'[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test='printf("%d", _sys_nerr);'[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # Solaris has no sys_nerr[m
[31m-    ngx_feature='maximum errno'[m
[31m-    ngx_feature_name=NGX_SYS_NERR[m
[31m-    ngx_feature_run=value[m
[31m-    ngx_feature_incs='#include <errno.h>[m
[31m-                      #include <string.h>[m
[31m-                      #include <stdio.h>'[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test='int  n;[m
[31m-                      char *p;[m
[31m-                      for (n = 1; n < 1000; n++) {[m
[31m-                          errno = 0;[m
[31m-                          p = strerror(n);[m
[31m-                          if (errno == EINVAL[m
[31m-                              || p == NULL[m
[31m-                              || strncmp(p, "Unknown error", 13) == 0)[m
[31m-                          {[m
[31m-                              break;[m
[31m-                          }[m
[31m-                      }[m
[31m-                      printf("%d", n);'[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="localtime_r()"[m
[31m-ngx_feature_name="NGX_HAVE_LOCALTIME_R"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <time.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct tm t; time_t c=0; localtime_r(&c, &t)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="posix_memalign()"[m
[31m-ngx_feature_name="NGX_HAVE_POSIX_MEMALIGN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdlib.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="void *p; int n; n = posix_memalign(&p, 4096, 4096);[m
[31m-                  if (n != 0) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="memalign()"[m
[31m-ngx_feature_name="NGX_HAVE_MEMALIGN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdlib.h>[m
[31m-                  #include <malloc.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="void *p; p = memalign(4096, 4096);[m
[31m-                  if (p == NULL) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="mmap(MAP_ANON|MAP_SHARED)"[m
[31m-ngx_feature_name="NGX_HAVE_MAP_ANON"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/mman.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="void *p;[m
[31m-                  p = mmap(NULL, 4096, PROT_READ|PROT_WRITE,[m
[31m-                           MAP_ANON|MAP_SHARED, -1, 0);[m
[31m-                  if (p == MAP_FAILED) return 1;"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature='mmap("/dev/zero", MAP_SHARED)'[m
[31m-ngx_feature_name="NGX_HAVE_MAP_DEVZERO"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/mman.h>[m
[31m-                  #include <sys/stat.h>[m
[31m-                  #include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test='void *p; int  fd;[m
[31m-                  fd = open("/dev/zero", O_RDWR);[m
[31m-                  p = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);[m
[31m-                  if (p == MAP_FAILED) return 1;'[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="System V shared memory"[m
[31m-ngx_feature_name="NGX_HAVE_SYSVSHM"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/ipc.h>[m
[31m-                  #include <sys/shm.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int  id;[m
[31m-                  id = shmget(IPC_PRIVATE, 4096, (SHM_R|SHM_W|IPC_CREAT));[m
[31m-                  if (id == -1) return 1;[m
[31m-                  shmctl(id, IPC_RMID, NULL);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="POSIX semaphores"[m
[31m-ngx_feature_name="NGX_HAVE_POSIX_SEM"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <semaphore.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="sem_t  sem;[m
[31m-                  if (sem_init(&sem, 1, 0) == -1) return 1;[m
[31m-                  sem_destroy(&sem);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # Linux has POSIX semaphores in libpthread[m
[31m-    ngx_feature="POSIX semaphores in libpthread"[m
[31m-    ngx_feature_libs=-lpthread[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -lpthread"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # Solaris has POSIX semaphores in librt[m
[31m-    ngx_feature="POSIX semaphores in librt"[m
[31m-    ngx_feature_libs=-lrt[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -lrt"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="struct msghdr.msg_control"[m
[31m-ngx_feature_name="NGX_HAVE_MSGHDR_MSG_CONTROL"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct msghdr  msg;[m
[31m-                  printf(\"%d\", (int) sizeof(msg.msg_control))"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="ioctl(FIONBIO)"[m
[31m-ngx_feature_name="NGX_HAVE_FIONBIO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/ioctl.h>[m
[31m-                  #include <stdio.h>[m
[31m-                  $NGX_INCLUDE_SYS_FILIO_H"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int i = FIONBIO; printf(\"%d\", i)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="struct tm.tm_gmtoff"[m
[31m-ngx_feature_name="NGX_HAVE_GMTOFF"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <time.h>[m
[31m-                  #include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct tm  tm; tm.tm_gmtoff = 0;[m
[31m-                  printf(\"%d\", (int) tm.tm_gmtoff)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="struct dirent.d_namlen"[m
[31m-ngx_feature_name="NGX_HAVE_D_NAMLEN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <dirent.h>[m
[31m-                  #include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct dirent  dir; dir.d_namlen = 0;[m
[31m-                  printf(\"%d\", (int) dir.d_namlen)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="struct dirent.d_type"[m
[31m-ngx_feature_name="NGX_HAVE_D_TYPE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <dirent.h>[m
[31m-                  #include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct dirent  dir; dir.d_type = DT_REG;[m
[31m-                  printf(\"%d\", (int) dir.d_type)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="sysconf(_SC_NPROCESSORS_ONLN)"[m
[31m-ngx_feature_name="NGX_HAVE_SC_NPROCESSORS_ONLN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="sysconf(_SC_NPROCESSORS_ONLN)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="openat(), fstatat()"[m
[31m-ngx_feature_name="NGX_HAVE_OPENAT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/stat.h>[m
[31m-                  #include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct stat sb;[m
[31m-                  openat(AT_FDCWD, \".\", O_RDONLY|O_NOFOLLOW);[m
[31m-                  fstatat(AT_FDCWD, \".\", &sb, AT_SYMLINK_NOFOLLOW);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="getaddrinfo()"[m
[31m-ngx_feature_name="NGX_HAVE_GETADDRINFO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/socket.h>[m
[31m-                  #include <netdb.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test='struct addrinfo *res;[m
[31m-                  if (getaddrinfo("localhost", NULL, NULL, &res) != 0) return 1;[m
[31m-                  freeaddrinfo(res)'[m
[31m-. auto/feature[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/fastcgi.conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/fastcgi.conf[m
[1mdeleted file mode 100644[m
[1mindex 091738c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/fastcgi.conf[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;[m
[31m-fastcgi_param  QUERY_STRING       $query_string;[m
[31m-fastcgi_param  REQUEST_METHOD     $request_method;[m
[31m-fastcgi_param  CONTENT_TYPE       $content_type;[m
[31m-fastcgi_param  CONTENT_LENGTH     $content_length;[m
[31m-[m
[31m-fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;[m
[31m-fastcgi_param  REQUEST_URI        $request_uri;[m
[31m-fastcgi_param  DOCUMENT_URI       $document_uri;[m
[31m-fastcgi_param  DOCUMENT_ROOT      $document_root;[m
[31m-fastcgi_param  SERVER_PROTOCOL    $server_protocol;[m
[31m-fastcgi_param  REQUEST_SCHEME     $scheme;[m
[31m-fastcgi_param  HTTPS              $https if_not_empty;[m
[31m-[m
[31m-fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;[m
[31m-fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;[m
[31m-[m
[31m-fastcgi_param  REMOTE_ADDR        $remote_addr;[m
[31m-fastcgi_param  REMOTE_PORT        $remote_port;[m
[31m-fastcgi_param  SERVER_ADDR        $server_addr;[m
[31m-fastcgi_param  SERVER_PORT        $server_port;[m
[31m-fastcgi_param  SERVER_NAME        $server_name;[m
[31m-[m
[31m-# PHP only, required if PHP was built with --enable-force-cgi-redirect[m
[31m-fastcgi_param  REDIRECT_STATUS    200;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/fastcgi_params b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/fastcgi_params[m
[1mdeleted file mode 100644[m
[1mindex 28decb9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/fastcgi_params[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-fastcgi_param  QUERY_STRING       $query_string;[m
[31m-fastcgi_param  REQUEST_METHOD     $request_method;[m
[31m-fastcgi_param  CONTENT_TYPE       $content_type;[m
[31m-fastcgi_param  CONTENT_LENGTH     $content_length;[m
[31m-[m
[31m-fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;[m
[31m-fastcgi_param  REQUEST_URI        $request_uri;[m
[31m-fastcgi_param  DOCUMENT_URI       $document_uri;[m
[31m-fastcgi_param  DOCUMENT_ROOT      $document_root;[m
[31m-fastcgi_param  SERVER_PROTOCOL    $server_protocol;[m
[31m-fastcgi_param  REQUEST_SCHEME     $scheme;[m
[31m-fastcgi_param  HTTPS              $https if_not_empty;[m
[31m-[m
[31m-fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;[m
[31m-fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;[m
[31m-[m
[31m-fastcgi_param  REMOTE_ADDR        $remote_addr;[m
[31m-fastcgi_param  REMOTE_PORT        $remote_port;[m
[31m-fastcgi_param  SERVER_ADDR        $server_addr;[m
[31m-fastcgi_param  SERVER_PORT        $server_port;[m
[31m-fastcgi_param  SERVER_NAME        $server_name;[m
[31m-[m
[31m-# PHP only, required if PHP was built with --enable-force-cgi-redirect[m
[31m-fastcgi_param  REDIRECT_STATUS    200;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/koi-utf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/koi-utf[m
[1mdeleted file mode 100644[m
[1mindex e7974ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/koi-utf[m
[1m+++ /dev/null[m
[36m@@ -1,109 +0,0 @@[m
[31m-[m
[31m-# This map is not a full koi8-r <> utf8 map: it does not contain[m
[31m-# box-drawing and some other characters.  Besides this map contains[m
[31m-# several koi8-u and Byelorussian letters which are not in koi8-r.[m
[31m-# If you need a full and standard map, use contrib/unicode2nginx/koi-utf[m
[31m-# map instead.[m
[31m-[m
[31m-charset_map  koi8-r  utf-8 {[m
[31m-[m
[31m-    80  E282AC ; # euro[m
[31m-[m
[31m-    95  E280A2 ; # bullet[m
[31m-[m
[31m-    9A  C2A0 ;   # &nbsp;[m
[31m-[m
[31m-    9E  C2B7 ;   # &middot;[m
[31m-[m
[31m-    A3  D191 ;   # small yo[m
[31m-    A4  D194 ;   # small Ukrainian ye[m
[31m-[m
[31m-    A6  D196 ;   # small Ukrainian i[m
[31m-    A7  D197 ;   # small Ukrainian yi[m
[31m-[m
[31m-    AD  D291 ;   # small Ukrainian soft g[m
[31m-    AE  D19E ;   # small Byelorussian short u[m
[31m-[m
[31m-    B0  C2B0 ;   # &deg;[m
[31m-[m
[31m-    B3  D081 ;   # capital YO[m
[31m-    B4  D084 ;   # capital Ukrainian YE[m
[31m-[m
[31m-    B6  D086 ;   # capital Ukrainian I[m
[31m-    B7  D087 ;   # capital Ukrainian YI[m
[31m-[m
[31m-    B9  E28496 ; # numero sign[m
[31m-[m
[31m-    BD  D290 ;   # capital Ukrainian soft G[m
[31m-    BE  D18E ;   # capital Byelorussian short U[m
[31m-[m
[31m-    BF  C2A9 ;   # (C)[m
[31m-[m
[31m-    C0  D18E ;   # small yu[m
[31m-    C1  D0B0 ;   # small a[m
[31m-    C2  D0B1 ;   # small b[m
[31m-    C3  D186 ;   # small ts[m
[31m-    C4  D0B4 ;   # small d[m
[31m-    C5  D0B5 ;   # small ye[m
[31m-    C6  D184 ;   # small f[m
[31m-    C7  D0B3 ;   # small g[m
[31m-    C8  D185 ;   # small kh[m
[31m-    C9  D0B8 ;   # small i[m
[31m-    CA  D0B9 ;   # small j[m
[31m-    CB  D0BA ;   # small k[m
[31m-    CC  D0BB ;   # small l[m
[31m-    CD  D0BC ;   # small m[m
[31m-    CE  D0BD ;   # small n[m
[31m-    CF  D0BE ;   # small o[m
[31m-[m
[31m-    D0  D0BF ;   # small p[m
[31m-    D1  D18F ;   # small ya[m
[31m-    D2  D180 ;   # small r[m
[31m-    D3  D181 ;   # small s[m
[31m-    D4  D182 ;   # small t[m
[31m-    D5  D183 ;   # small u[m
[31m-    D6  D0B6 ;   # small zh[m
[31m-    D7  D0B2 ;   # small v[m
[31m-    D8  D18C ;   # small soft sign[m
[31m-    D9  D18B ;   # small y[m
[31m-    DA  D0B7 ;   # small z[m
[31m-    DB  D188 ;   # small sh[m
[31m-    DC  D18D ;   # small e[m
[31m-    DD  D189 ;   # small shch[m
[31m-    DE  D187 ;   # small ch[m
[31m-    DF  D18A ;   # small hard sign[m
[31m-[m
[31m-    E0  D0AE ;   # capital YU[m
[31m-    E1  D090 ;   # capital A[m
[31m-    E2  D091 ;   # capital B[m
[31m-    E3  D0A6 ;   # capital TS[m
[31m-    E4  D094 ;   # capital D[m
[31m-    E5  D095 ;   # capital YE[m
[31m-    E6  D0A4 ;   # capital F[m
[31m-    E7  D093 ;   # capital G[m
[31m-    E8  D0A5 ;   # capital KH[m
[31m-    E9  D098 ;   # capital I[m
[31m-    EA  D099 ;   # capital J[m
[31m-    EB  D09A ;   # capital K[m
[31m-    EC  D09B ;   # capital L[m
[31m-    ED  D09C ;   # capital M[m
[31m-    EE  D09D ;   # capital N[m
[31m-    EF  D09E ;   # capital O[m
[31m-[m
[31m-    F0  D09F ;   # capital P[m
[31m-    F1  D0AF ;   # capital YA[m
[31m-    F2  D0A0 ;   # capital R[m
[31m-    F3  D0A1 ;   # capital S[m
[31m-    F4  D0A2 ;   # capital T[m
[31m-    F5  D0A3 ;   # capital U[m
[31m-    F6  D096 ;   # capital ZH[m
[31m-    F7  D092 ;   # capital V[m
[31m-    F8  D0AC ;   # capital soft sign[m
[31m-    F9  D0AB ;   # capital Y[m
[31m-    FA  D097 ;   # capital Z[m
[31m-    FB  D0A8 ;   # capital SH[m
[31m-    FC  D0AD ;   # capital E[m
[31m-    FD  D0A9 ;   # capital SHCH[m
[31m-    FE  D0A7 ;   # capital CH[m
[31m-    FF  D0AA ;   # capital hard sign[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/koi-win b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/koi-win[m
[1mdeleted file mode 100644[m
[1mindex 72afabe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/koi-win[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-[m
[31m-charset_map  koi8-r  windows-1251 {[m
[31m-[m
[31m-    80  88 ; # euro[m
[31m-[m
[31m-    95  95 ; # bullet[m
[31m-[m
[31m-    9A  A0 ; # &nbsp;[m
[31m-[m
[31m-    9E  B7 ; # &middot;[m
[31m-[m
[31m-    A3  B8 ; # small yo[m
[31m-    A4  BA ; # small Ukrainian ye[m
[31m-[m
[31m-    A6  B3 ; # small Ukrainian i[m
[31m-    A7  BF ; # small Ukrainian yi[m
[31m-[m
[31m-    AD  B4 ; # small Ukrainian soft g[m
[31m-    AE  A2 ; # small Byelorussian short u[m
[31m-[m
[31m-    B0  B0 ; # &deg;[m
[31m-[m
[31m-    B3  A8 ; # capital YO[m
[31m-    B4  AA ; # capital Ukrainian YE[m
[31m-[m
[31m-    B6  B2 ; # capital Ukrainian I[m
[31m-    B7  AF ; # capital Ukrainian YI[m
[31m-[m
[31m-    B9  B9 ; # numero sign[m
[31m-[m
[31m-    BD  A5 ; # capital Ukrainian soft G[m
[31m-    BE  A1 ; # capital Byelorussian short U[m
[31m-[m
[31m-    BF  A9 ; # (C)[m
[31m-[m
[31m-    C0  FE ; # small yu[m
[31m-    C1  E0 ; # small a[m
[31m-    C2  E1 ; # small b[m
[31m-    C3  F6 ; # small ts[m
[31m-    C4  E4 ; # small d[m
[31m-    C5  E5 ; # small ye[m
[31m-    C6  F4 ; # small f[m
[31m-    C7  E3 ; # small g[m
[31m-    C8  F5 ; # small kh[m
[31m-    C9  E8 ; # small i[m
[31m-    CA  E9 ; # small j[m
[31m-    CB  EA ; # small k[m
[31m-    CC  EB ; # small l[m
[31m-    CD  EC ; # small m[m
[31m-    CE  ED ; # small n[m
[31m-    CF  EE ; # small o[m
[31m-[m
[31m-    D0  EF ; # small p[m
[31m-    D1  FF ; # small ya[m
[31m-    D2  F0 ; # small r[m
[31m-    D3  F1 ; # small s[m
[31m-    D4  F2 ; # small t[m
[31m-    D5  F3 ; # small u[m
[31m-    D6  E6 ; # small zh[m
[31m-    D7  E2 ; # small v[m
[31m-    D8  FC ; # small soft sign[m
[31m-    D9  FB ; # small y[m
[31m-    DA  E7 ; # small z[m
[31m-    DB  F8 ; # small sh[m
[31m-    DC  FD ; # small e[m
[31m-    DD  F9 ; # small shch[m
[31m-    DE  F7 ; # small ch[m
[31m-    DF  FA ; # small hard sign[m
[31m-[m
[31m-    E0  DE ; # capital YU[m
[31m-    E1  C0 ; # capital A[m
[31m-    E2  C1 ; # capital B[m
[31m-    E3  D6 ; # capital TS[m
[31m-    E4  C4 ; # capital D[m
[31m-    E5  C5 ; # capital YE[m
[31m-    E6  D4 ; # capital F[m
[31m-    E7  C3 ; # capital G[m
[31m-    E8  D5 ; # capital KH[m
[31m-    E9  C8 ; # capital I[m
[31m-    EA  C9 ; # capital J[m
[31m-    EB  CA ; # capital K[m
[31m-    EC  CB ; # capital L[m
[31m-    ED  CC ; # capital M[m
[31m-    EE  CD ; # capital N[m
[31m-    EF  CE ; # capital O[m
[31m-[m
[31m-    F0  CF ; # capital P[m
[31m-    F1  DF ; # capital YA[m
[31m-    F2  D0 ; # capital R[m
[31m-    F3  D1 ; # capital S[m
[31m-    F4  D2 ; # capital T[m
[31m-    F5  D3 ; # capital U[m
[31m-    F6  C6 ; # capital ZH[m
[31m-    F7  C2 ; # capital V[m
[31m-    F8  DC ; # capital soft sign[m
[31m-    F9  DB ; # capital Y[m
[31m-    FA  C7 ; # capital Z[m
[31m-    FB  D8 ; # capital SH[m
[31m-    FC  DD ; # capital E[m
[31m-    FD  D9 ; # capital SHCH[m
[31m-    FE  D7 ; # capital CH[m
[31m-    FF  DA ; # capital hard sign[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/mime.types b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/mime.types[m
[1mdeleted file mode 100644[m
[1mindex 89be9a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/mime.types[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-[m
[31m-types {[m
[31m-    text/html                             html htm shtml;[m
[31m-    text/css                              css;[m
[31m-    text/xml                              xml;[m
[31m-    image/gif                             gif;[m
[31m-    image/jpeg                            jpeg jpg;[m
[31m-    application/javascript                js;[m
[31m-    application/atom+xml                  atom;[m
[31m-    application/rss+xml                   rss;[m
[31m-[m
[31m-    text/mathml                           mml;[m
[31m-    text/plain                            txt;[m
[31m-    text/vnd.sun.j2me.app-descriptor      jad;[m
[31m-    text/vnd.wap.wml                      wml;[m
[31m-    text/x-component                      htc;[m
[31m-[m
[31m-    image/png                             png;[m
[31m-    image/tiff                            tif tiff;[m
[31m-    image/vnd.wap.wbmp                    wbmp;[m
[31m-    image/x-icon                          ico;[m
[31m-    image/x-jng                           jng;[m
[31m-    image/x-ms-bmp                        bmp;[m
[31m-    image/svg+xml                         svg svgz;[m
[31m-    image/webp                            webp;[m
[31m-[m
[31m-    application/font-woff                 woff;[m
[31m-    application/java-archive              jar war ear;[m
[31m-    application/json                      json;[m
[31m-    application/mac-binhex40              hqx;[m
[31m-    application/msword                    doc;[m
[31m-    application/pdf                       pdf;[m
[31m-    application/postscript                ps eps ai;[m
[31m-    application/rtf                       rtf;[m
[31m-    application/vnd.apple.mpegurl         m3u8;[m
[31m-    application/vnd.ms-excel              xls;[m
[31m-    application/vnd.ms-fontobject         eot;[m
[31m-    application/vnd.ms-powerpoint         ppt;[m
[31m-    application/vnd.wap.wmlc              wmlc;[m
[31m-    application/vnd.google-earth.kml+xml  kml;[m
[31m-    application/vnd.google-earth.kmz      kmz;[m
[31m-    application/x-7z-compressed           7z;[m
[31m-    application/x-cocoa                   cco;[m
[31m-    application/x-java-archive-diff       jardiff;[m
[31m-    application/x-java-jnlp-file          jnlp;[m
[31m-    application/x-makeself                run;[m
[31m-    application/x-perl                    pl pm;[m
[31m-    application/x-pilot                   prc pdb;[m
[31m-    application/x-rar-compressed          rar;[m
[31m-    application/x-redhat-package-manager  rpm;[m
[31m-    application/x-sea                     sea;[m
[31m-    application/x-shockwave-flash         swf;[m
[31m-    application/x-stuffit                 sit;[m
[31m-    application/x-tcl                     tcl tk;[m
[31m-    application/x-x509-ca-cert            der pem crt;[m
[31m-    application/x-xpinstall               xpi;[m
[31m-    application/xhtml+xml                 xhtml;[m
[31m-    application/xspf+xml                  xspf;[m
[31m-    application/zip                       zip;[m
[31m-[m
[31m-    application/octet-stream              bin exe dll;[m
[31m-    application/octet-stream              deb;[m
[31m-    application/octet-stream              dmg;[m
[31m-    application/octet-stream              iso img;[m
[31m-    application/octet-stream              msi msp msm;[m
[31m-[m
[31m-    application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;[m
[31m-    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;[m
[31m-    application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;[m
[31m-[m
[31m-    audio/midi                            mid midi kar;[m
[31m-    audio/mpeg                            mp3;[m
[31m-    audio/ogg                             ogg;[m
[31m-    audio/x-m4a                           m4a;[m
[31m-    audio/x-realaudio                     ra;[m
[31m-[m
[31m-    video/3gpp                            3gpp 3gp;[m
[31m-    video/mp2t                            ts;[m
[31m-    video/mp4                             mp4;[m
[31m-    video/mpeg                            mpeg mpg;[m
[31m-    video/quicktime                       mov;[m
[31m-    video/webm                            webm;[m
[31m-    video/x-flv                           flv;[m
[31m-    video/x-m4v                           m4v;[m
[31m-    video/x-mng                           mng;[m
[31m-    video/x-ms-asf                        asx asf;[m
[31m-    video/x-ms-wmv                        wmv;[m
[31m-    video/x-msvideo                       avi;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/nginx.conf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/nginx.conf[m
[1mdeleted file mode 100644[m
[1mindex 29bc085..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/nginx.conf[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-[m
[31m-#user  nobody;[m
[31m-worker_processes  1;[m
[31m-[m
[31m-#error_log  logs/error.log;[m
[31m-#error_log  logs/error.log  notice;[m
[31m-#error_log  logs/error.log  info;[m
[31m-[m
[31m-#pid        logs/nginx.pid;[m
[31m-[m
[31m-[m
[31m-events {[m
[31m-    worker_connections  1024;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-http {[m
[31m-    include       mime.types;[m
[31m-    default_type  application/octet-stream;[m
[31m-[m
[31m-    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '[m
[31m-    #                  '$status $body_bytes_sent "$http_referer" '[m
[31m-    #                  '"$http_user_agent" "$http_x_forwarded_for"';[m
[31m-[m
[31m-    #access_log  logs/access.log  main;[m
[31m-[m
[31m-    sendfile        on;[m
[31m-    #tcp_nopush     on;[m
[31m-[m
[31m-    #keepalive_timeout  0;[m
[31m-    keepalive_timeout  65;[m
[31m-[m
[31m-    #gzip  on;[m
[31m-[m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  localhost;[m
[31m-[m
[31m-        #charset koi8-r;[m
[31m-[m
[31m-        #access_log  logs/host.access.log  main;[m
[31m-[m
[31m-        location / {[m
[31m-            root   html;[m
[31m-            index  index.html index.htm;[m
[31m-        }[m
[31m-[m
[31m-        #error_page  404              /404.html;[m
[31m-[m
[31m-        # redirect server error pages to the static page /50x.html[m
[31m-        #[m
[31m-        error_page   500 502 503 504  /50x.html;[m
[31m-        location = /50x.html {[m
[31m-            root   html;[m
[31m-        }[m
[31m-[m
[31m-        # proxy the PHP scripts to Apache listening on 127.0.0.1:80[m
[31m-        #[m
[31m-        #location ~ \.php$ {[m
[31m-        #    proxy_pass   http://127.0.0.1;[m
[31m-        #}[m
[31m-[m
[31m-        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000[m
[31m-        #[m
[31m-        #location ~ \.php$ {[m
[31m-        #    root           html;[m
[31m-        #    fastcgi_pass   127.0.0.1:9000;[m
[31m-        #    fastcgi_index  index.php;[m
[31m-        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;[m
[31m-        #    include        fastcgi_params;[m
[31m-        #}[m
[31m-[m
[31m-        # deny access to .htaccess files, if Apache's document root[m
[31m-        # concurs with nginx's one[m
[31m-        #[m
[31m-        #location ~ /\.ht {[m
[31m-        #    deny  all;[m
[31m-        #}[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    # another virtual host using mix of IP-, name-, and port-based configuration[m
[31m-    #[m
[31m-    #server {[m
[31m-    #    listen       8000;[m
[31m-    #    listen       somename:8080;[m
[31m-    #    server_name  somename  alias  another.alias;[m
[31m-[m
[31m-    #    location / {[m
[31m-    #        root   html;[m
[31m-    #        index  index.html index.htm;[m
[31m-    #    }[m
[31m-    #}[m
[31m-[m
[31m-[m
[31m-    # HTTPS server[m
[31m-    #[m
[31m-    #server {[m
[31m-    #    listen       443 ssl;[m
[31m-    #    server_name  localhost;[m
[31m-[m
[31m-    #    ssl_certificate      cert.pem;[m
[31m-    #    ssl_certificate_key  cert.key;[m
[31m-[m
[31m-    #    ssl_session_cache    shared:SSL:1m;[m
[31m-    #    ssl_session_timeout  5m;[m
[31m-[m
[31m-    #    ssl_ciphers  HIGH:!aNULL:!MD5;[m
[31m-    #    ssl_prefer_server_ciphers  on;[m
[31m-[m
[31m-    #    location / {[m
[31m-    #        root   html;[m
[31m-    #        index  index.html index.htm;[m
[31m-    #    }[m
[31m-    #}[m
[31m-[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/scgi_params b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/scgi_params[m
[1mdeleted file mode 100644[m
[1mindex 6d4ce4f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/scgi_params[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-scgi_param  REQUEST_METHOD     $request_method;[m
[31m-scgi_param  REQUEST_URI        $request_uri;[m
[31m-scgi_param  QUERY_STRING       $query_string;[m
[31m-scgi_param  CONTENT_TYPE       $content_type;[m
[31m-[m
[31m-scgi_param  DOCUMENT_URI       $document_uri;[m
[31m-scgi_param  DOCUMENT_ROOT      $document_root;[m
[31m-scgi_param  SCGI               1;[m
[31m-scgi_param  SERVER_PROTOCOL    $server_protocol;[m
[31m-scgi_param  REQUEST_SCHEME     $scheme;[m
[31m-scgi_param  HTTPS              $https if_not_empty;[m
[31m-[m
[31m-scgi_param  REMOTE_ADDR        $remote_addr;[m
[31m-scgi_param  REMOTE_PORT        $remote_port;[m
[31m-scgi_param  SERVER_PORT        $server_port;[m
[31m-scgi_param  SERVER_NAME        $server_name;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/uwsgi_params b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/uwsgi_params[m
[1mdeleted file mode 100644[m
[1mindex 09c732c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/uwsgi_params[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-uwsgi_param  QUERY_STRING       $query_string;[m
[31m-uwsgi_param  REQUEST_METHOD     $request_method;[m
[31m-uwsgi_param  CONTENT_TYPE       $content_type;[m
[31m-uwsgi_param  CONTENT_LENGTH     $content_length;[m
[31m-[m
[31m-uwsgi_param  REQUEST_URI        $request_uri;[m
[31m-uwsgi_param  PATH_INFO          $document_uri;[m
[31m-uwsgi_param  DOCUMENT_ROOT      $document_root;[m
[31m-uwsgi_param  SERVER_PROTOCOL    $server_protocol;[m
[31m-uwsgi_param  REQUEST_SCHEME     $scheme;[m
[31m-uwsgi_param  HTTPS              $https if_not_empty;[m
[31m-[m
[31m-uwsgi_param  REMOTE_ADDR        $remote_addr;[m
[31m-uwsgi_param  REMOTE_PORT        $remote_port;[m
[31m-uwsgi_param  SERVER_PORT        $server_port;[m
[31m-uwsgi_param  SERVER_NAME        $server_name;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/win-utf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/win-utf[m
[1mdeleted file mode 100644[m
[1mindex ed8bc00..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/conf/win-utf[m
[1m+++ /dev/null[m
[36m@@ -1,126 +0,0 @@[m
[31m-[m
[31m-# This map is not a full windows-1251 <> utf8 map: it does not[m
[31m-# contain Serbian and Macedonian letters.  If you need a full map,[m
[31m-# use contrib/unicode2nginx/win-utf map instead.[m
[31m-[m
[31m-charset_map  windows-1251  utf-8 {[m
[31m-[m
[31m-    82  E2809A ; # single low-9 quotation mark[m
[31m-[m
[31m-    84  E2809E ; # double low-9 quotation mark[m
[31m-    85  E280A6 ; # ellipsis[m
[31m-    86  E280A0 ; # dagger[m
[31m-    87  E280A1 ; # double dagger[m
[31m-    88  E282AC ; # euro[m
[31m-    89  E280B0 ; # per mille[m
[31m-[m
[31m-    91  E28098 ; # left single quotation mark[m
[31m-    92  E28099 ; # right single quotation mark[m
[31m-    93  E2809C ; # left double quotation mark[m
[31m-    94  E2809D ; # right double quotation mark[m
[31m-    95  E280A2 ; # bullet[m
[31m-    96  E28093 ; # en dash[m
[31m-    97  E28094 ; # em dash[m
[31m-[m
[31m-    99  E284A2 ; # trade mark sign[m
[31m-[m
[31m-    A0  C2A0 ;   # &nbsp;[m
[31m-    A1  D18E ;   # capital Byelorussian short U[m
[31m-    A2  D19E ;   # small Byelorussian short u[m
[31m-[m
[31m-    A4  C2A4 ;   # currency sign[m
[31m-    A5  D290 ;   # capital Ukrainian soft G[m
[31m-    A6  C2A6 ;   # borken bar[m
[31m-    A7  C2A7 ;   # section sign[m
[31m-    A8  D081 ;   # capital YO[m
[31m-    A9  C2A9 ;   # (C)[m
[31m-    AA  D084 ;   # capital Ukrainian YE[m
[31m-    AB  C2AB ;   # left-pointing double angle quotation mark[m
[31m-    AC  C2AC ;   # not sign[m
[31m-    AD  C2AD ;   # soft hypen[m
[31m-    AE  C2AE ;   # (R)[m
[31m-    AF  D087 ;   # capital Ukrainian YI[m
[31m-[m
[31m-    B0  C2B0 ;   # &deg;[m
[31m-    B1  C2B1 ;   # plus-minus sign[m
[31m-    B2  D086 ;   # capital Ukrainian I[m
[31m-    B3  D196 ;   # small Ukrainian i[m
[31m-    B4  D291 ;   # small Ukrainian soft g[m
[31m-    B5  C2B5 ;   # micro sign[m
[31m-    B6  C2B6 ;   # pilcrow sign[m
[31m-    B7  C2B7 ;   # &middot;[m
[31m-    B8  D191 ;   # small yo[m
[31m-    B9  E28496 ; # numero sign[m
[31m-    BA  D194 ;   # small Ukrainian ye[m
[31m-    BB  C2BB ;   # right-pointing double angle quotation mark[m
[31m-[m
[31m-    BF  D197 ;   # small Ukrainian yi[m
[31m-[m
[31m-    C0  D090 ;   # capital A[m
[31m-    C1  D091 ;   # capital B[m
[31m-    C2  D092 ;   # capital V[m
[31m-    C3  D093 ;   # capital G[m
[31m-    C4  D094 ;   # capital D[m
[31m-    C5  D095 ;   # capital YE[m
[31m-    C6  D096 ;   # capital ZH[m
[31m-    C7  D097 ;   # capital Z[m
[31m-    C8  D098 ;   # capital I[m
[31m-    C9  D099 ;   # capital J[m
[31m-    CA  D09A ;   # capital K[m
[31m-    CB  D09B ;   # capital L[m
[31m-    CC  D09C ;   # capital M[m
[31m-    CD  D09D ;   # capital N[m
[31m-    CE  D09E ;   # capital O[m
[31m-    CF  D09F ;   # capital P[m
[31m-[m
[31m-    D0  D0A0 ;   # capital R[m
[31m-    D1  D0A1 ;   # capital S[m
[31m-    D2  D0A2 ;   # capital T[m
[31m-    D3  D0A3 ;   # capital U[m
[31m-    D4  D0A4 ;   # capital F[m
[31m-    D5  D0A5 ;   # capital KH[m
[31m-    D6  D0A6 ;   # capital TS[m
[31m-    D7  D0A7 ;   # capital CH[m
[31m-    D8  D0A8 ;   # capital SH[m
[31m-    D9  D0A9 ;   # capital SHCH[m
[31m-    DA  D0AA ;   # capital hard sign[m
[31m-    DB  D0AB ;   # capital Y[m
[31m-    DC  D0AC ;   # capital soft sign[m
[31m-    DD  D0AD ;   # capital E[m
[31m-    DE  D0AE ;   # capital YU[m
[31m-    DF  D0AF ;   # capital YA[m
[31m-[m
[31m-    E0  D0B0 ;   # small a[m
[31m-    E1  D0B1 ;   # small b[m
[31m-    E2  D0B2 ;   # small v[m
[31m-    E3  D0B3 ;   # small g[m
[31m-    E4  D0B4 ;   # small d[m
[31m-    E5  D0B5 ;   # small ye[m
[31m-    E6  D0B6 ;   # small zh[m
[31m-    E7  D0B7 ;   # small z[m
[31m-    E8  D0B8 ;   # small i[m
[31m-    E9  D0B9 ;   # small j[m
[31m-    EA  D0BA ;   # small k[m
[31m-    EB  D0BB ;   # small l[m
[31m-    EC  D0BC ;   # small m[m
[31m-    ED  D0BD ;   # small n[m
[31m-    EE  D0BE ;   # small o[m
[31m-    EF  D0BF ;   # small p[m
[31m-[m
[31m-    F0  D180 ;   # small r[m
[31m-    F1  D181 ;   # small s[m
[31m-    F2  D182 ;   # small t[m
[31m-    F3  D183 ;   # small u[m
[31m-    F4  D184 ;   # small f[m
[31m-    F5  D185 ;   # small kh[m
[31m-    F6  D186 ;   # small ts[m
[31m-    F7  D187 ;   # small ch[m
[31m-    F8  D188 ;   # small sh[m
[31m-    F9  D189 ;   # small shch[m
[31m-    FA  D18A ;   # small hard sign[m
[31m-    FB  D18B ;   # small y[m
[31m-    FC  D18C ;   # small soft sign[m
[31m-    FD  D18D ;   # small e[m
[31m-    FE  D18E ;   # small yu[m
[31m-    FF  D18F ;   # small ya[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/configure b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/configure[m
[1mdeleted file mode 100755[m
[1mindex 49223f8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/configure[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-#!/bin/sh[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-LC_ALL=C[m
[31m-export LC_ALL[m
[31m-[m
[31m-. auto/options[m
[31m-. auto/init[m
[31m-. auto/sources[m
[31m-[m
[31m-test -d $NGX_OBJS || mkdir -p $NGX_OBJS[m
[31m-[m
[31m-echo > $NGX_AUTO_HEADERS_H[m
[31m-echo > $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-[m
[31m-if [ $NGX_DEBUG = YES ]; then[m
[31m-    have=NGX_DEBUG . auto/have[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    have=NGX_DTRACE . auto/have[m
[31m-fi[m
[31m-[m
[31m-if test -z "$NGX_PLATFORM"; then[m
[31m-    echo "checking for OS"[m
[31m-[m
[31m-    NGX_SYSTEM=`uname -s 2>/dev/null`[m
[31m-    NGX_RELEASE=`uname -r 2>/dev/null`[m
[31m-    NGX_MACHINE=`uname -m 2>/dev/null`[m
[31m-[m
[31m-    echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"[m
[31m-[m
[31m-    NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";[m
[31m-[m
[31m-    case "$NGX_SYSTEM" in[m
[31m-        MINGW32_*)[m
[31m-            NGX_PLATFORM=win32[m
[31m-        ;;[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-    echo "building for $NGX_PLATFORM"[m
[31m-    NGX_SYSTEM=$NGX_PLATFORM[m
[31m-fi[m
[31m-[m
[31m-. auto/cc/conf[m
[31m-[m
[31m-if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-    . auto/headers[m
[31m-fi[m
[31m-[m
[31m-. auto/os/conf[m
[31m-[m
[31m-if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-    . auto/unix[m
[31m-fi[m
[31m-[m
[31m-. auto/threads[m
[31m-. auto/modules[m
[31m-. auto/lib/conf[m
[31m-[m
[31m-case ".$NGX_PREFIX" in[m
[31m-    .)[m
[31m-        NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx}[m
[31m-        have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define[m
[31m-    ;;[m
[31m-[m
[31m-    .!)[m
[31m-        NGX_PREFIX=[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-if [ ".$NGX_CONF_PREFIX" != "." ]; then[m
[31m-    have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define[m
[31m-fi[m
[31m-[m
[31m-have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define[m
[31m-have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define[m
[31m-have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define[m
[31m-have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define[m
[31m-have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define[m
[31m-[m
[31m-have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define[m
[31m-have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-have=NGX_HTTP_PROXY_TEMP_PATH value="\"$NGX_HTTP_PROXY_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-have=NGX_HTTP_FASTCGI_TEMP_PATH value="\"$NGX_HTTP_FASTCGI_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-have=NGX_HTTP_UWSGI_TEMP_PATH value="\"$NGX_HTTP_UWSGI_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-[m
[31m-. auto/make[m
[31m-. auto/lib/make[m
[31m-. auto/install[m
[31m-[m
[31m-# STUB[m
[31m-. auto/stubs[m
[31m-[m
[31m-have=NGX_USER value="\"$NGX_USER\"" . auto/define[m
[31m-have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define[m
[31m-[m
[31m-if [ ".$NGX_BUILD" != "." ]; then[m
[31m-    have=NGX_BUILD value="\"$NGX_BUILD\"" . auto/define[m
[31m-fi[m
[31m-[m
[31m-. auto/summary[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/README[m
[1mdeleted file mode 100644[m
[1mindex fec4b20..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/README[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-geo2nginx.pl 		by Andrei Nigmatulin[m
[31m-[m
[31m-	The perl script to convert CSV geoip database ( free download[m
[31m-	at http://www.maxmind.com/app/geoip_country ) to format, suitable[m
[31m-	for use by the ngx_http_geo_module.[m
[31m-[m
[31m-[m
[31m-unicode2nginx		by Maxim Dounin[m
[31m-[m
[31m-	The perl script to convert unicode mappings ( available[m
[31m-	at http://www.unicode.org/Public/MAPPINGS/ ) to the nginx[m
[31m-	configuration file format.[m
[31m-	Two generated full maps for windows-1251 and koi8-r.[m
[31m-[m
[31m-[m
[31m-vim			by Evan Miller[m
[31m-[m
[31m-	Syntax highlighting of nginx configuration for vim, to be[m
[31m-	placed into ~/.vim/.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/geo2nginx.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/geo2nginx.pl[m
[1mdeleted file mode 100644[m
[1mindex 29243ec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/geo2nginx.pl[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-#!/usr/bin/perl -w[m
[31m-[m
[31m-# (c) Andrei Nigmatulin, 2005[m
[31m-#[m
[31m-# this script provided "as is", without any warranties. use it at your own risk.[m
[31m-#[m
[31m-# special thanx to Andrew Sitnikov for perl port[m
[31m-#[m
[31m-# this script converts CSV geoip database (free download at http://www.maxmind.com/app/geoip_country)[m
[31m-# to format, suitable for use with nginx_http_geo module (http://sysoev.ru/nginx)[m
[31m-#[m
[31m-# for example, line with ip range[m
[31m-#[m
[31m-#   "62.16.68.0","62.16.127.255","1041253376","1041268735","RU","Russian Federation"[m
[31m-#[m
[31m-# will be converted to four subnetworks:[m
[31m-#[m
[31m-#   62.16.68.0/22 RU;[m
[31m-#   62.16.72.0/21 RU;[m
[31m-#   62.16.80.0/20 RU;[m
[31m-#   62.16.96.0/19 RU;[m
[31m-[m
[31m-[m
[31m-use warnings;[m
[31m-use strict;[m
[31m-[m
[31m-while( <STDIN> ){[m
[31m-	if (/"[^"]+","[^"]+","([^"]+)","([^"]+)","([^"]+)"/){[m
[31m-		print_subnets($1, $2, $3);[m
[31m-	}[m
[31m-}[m
[31m-[m
[31m-sub  print_subnets {[m
[31m-	my ($a1, $a2, $c) = @_;[m
[31m-	my $l;[m
[31m-    while ($a1 <= $a2) {[m
[31m-		for ($l = 0; ($a1 & (1 << $l)) == 0 && ($a1 + ((1 << ($l + 1)) - 1)) <= $a2; $l++){};[m
[31m-		print long2ip($a1) . "/" . (32 - $l) . " " . $c . ";\n";[m
[31m-    	$a1 += (1 << $l);[m
[31m-	}[m
[31m-}[m
[31m-[m
[31m-sub long2ip {[m
[31m-	my $ip = shift;[m
[31m-[m
[31m-	my $str = 0;[m
[31m-[m
[31m-	$str = ($ip & 255);[m
[31m-[m
[31m-	$ip >>= 8;[m
[31m-	$str = ($ip & 255).".$str";[m
[31m-[m
[31m-	$ip >>= 8;[m
[31m-	$str = ($ip & 255).".$str";[m
[31m-[m
[31m-	$ip >>= 8;[m
[31m-	$str = ($ip & 255).".$str";[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/koi-utf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/koi-utf[m
[1mdeleted file mode 100644[m
[1mindex 48853af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/koi-utf[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-charset_map  koi8-r  utf-8 {[m
[31m-[m
[31m-    80  E29480 ; #	BOX DRAWINGS LIGHT HORIZONTAL[m
[31m-    81  E29482 ; #	BOX DRAWINGS LIGHT VERTICAL[m
[31m-    82  E2948C ; #	BOX DRAWINGS LIGHT DOWN AND RIGHT[m
[31m-    83  E29490 ; #	BOX DRAWINGS LIGHT DOWN AND LEFT[m
[31m-    84  E29494 ; #	BOX DRAWINGS LIGHT UP AND RIGHT[m
[31m-    85  E29498 ; #	BOX DRAWINGS LIGHT UP AND LEFT[m
[31m-    86  E2949C ; #	BOX DRAWINGS LIGHT VERTICAL AND RIGHT[m
[31m-    87  E294A4 ; #	BOX DRAWINGS LIGHT VERTICAL AND LEFT[m
[31m-    88  E294AC ; #	BOX DRAWINGS LIGHT DOWN AND HORIZONTAL[m
[31m-    89  E294B4 ; #	BOX DRAWINGS LIGHT UP AND HORIZONTAL[m
[31m-    8A  E294BC ; #	BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL[m
[31m-    8B  E29680 ; #	UPPER HALF BLOCK[m
[31m-    8C  E29684 ; #	LOWER HALF BLOCK[m
[31m-    8D  E29688 ; #	FULL BLOCK[m
[31m-    8E  E2968C ; #	LEFT HALF BLOCK[m
[31m-    8F  E29690 ; #	RIGHT HALF BLOCK[m
[31m-    90  E29691 ; #	LIGHT SHADE[m
[31m-    91  E29692 ; #	MEDIUM SHADE[m
[31m-    92  E29693 ; #	DARK SHADE[m
[31m-    93  E28CA0 ; #	TOP HALF INTEGRAL[m
[31m-    94  E296A0 ; #	BLACK SQUARE[m
[31m-    95  E28899 ; #	BULLET OPERATOR[m
[31m-    96  E2889A ; #	SQUARE ROOT[m
[31m-    97  E28988 ; #	ALMOST EQUAL TO[m
[31m-    98  E289A4 ; #	LESS-THAN OR EQUAL TO[m
[31m-    99  E289A5 ; #	GREATER-THAN OR EQUAL TO[m
[31m-    9A  C2A0 ; #	NO-BREAK SPACE[m
[31m-    9B  E28CA1 ; #	BOTTOM HALF INTEGRAL[m
[31m-    9C  C2B0 ; #	DEGREE SIGN[m
[31m-    9D  C2B2 ; #	SUPERSCRIPT TWO[m
[31m-    9E  C2B7 ; #	MIDDLE DOT[m
[31m-    9F  C3B7 ; #	DIVISION SIGN[m
[31m-    A0  E29590 ; #	BOX DRAWINGS DOUBLE HORIZONTAL[m
[31m-    A1  E29591 ; #	BOX DRAWINGS DOUBLE VERTICAL[m
[31m-    A2  E29592 ; #	BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE[m
[31m-    A3  D191 ; #	CYRILLIC SMALL LETTER IO[m
[31m-    A4  E29593 ; #	BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE[m
[31m-    A5  E29594 ; #	BOX DRAWINGS DOUBLE DOWN AND RIGHT[m
[31m-    A6  E29595 ; #	BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE[m
[31m-    A7  E29596 ; #	BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE[m
[31m-    A8  E29597 ; #	BOX DRAWINGS DOUBLE DOWN AND LEFT[m
[31m-    A9  E29598 ; #	BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE[m
[31m-    AA  E29599 ; #	BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE[m
[31m-    AB  E2959A ; #	BOX DRAWINGS DOUBLE UP AND RIGHT[m
[31m-    AC  E2959B ; #	BOX DRAWINGS UP SINGLE AND LEFT DOUBLE[m
[31m-    AD  E2959C ; #	BOX DRAWINGS UP DOUBLE AND LEFT SINGLE[m
[31m-    AE  E2959D ; #	BOX DRAWINGS DOUBLE UP AND LEFT[m
[31m-    AF  E2959E ; #	BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE[m
[31m-    B0  E2959F ; #	BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE[m
[31m-    B1  E295A0 ; #	BOX DRAWINGS DOUBLE VERTICAL AND RIGHT[m
[31m-    B2  E295A1 ; #	BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE[m
[31m-    B3  D081 ; #	CYRILLIC CAPITAL LETTER IO[m
[31m-    B4  E295A2 ; #	BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE[m
[31m-    B5  E295A3 ; #	BOX DRAWINGS DOUBLE VERTICAL AND LEFT[m
[31m-    B6  E295A4 ; #	BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE[m
[31m-    B7  E295A5 ; #	BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE[m
[31m-    B8  E295A6 ; #	BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL[m
[31m-    B9  E295A7 ; #	BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE[m
[31m-    BA  E295A8 ; #	BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE[m
[31m-    BB  E295A9 ; #	BOX DRAWINGS DOUBLE UP AND HORIZONTAL[m
[31m-    BC  E295AA ; #	BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE[m
[31m-    BD  E295AB ; #	BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE[m
[31m-    BE  E295AC ; #	BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL[m
[31m-    BF  C2A9 ; #	COPYRIGHT SIGN[m
[31m-    C0  D18E ; #	CYRILLIC SMALL LETTER YU[m
[31m-    C1  D0B0 ; #	CYRILLIC SMALL LETTER A[m
[31m-    C2  D0B1 ; #	CYRILLIC SMALL LETTER BE[m
[31m-    C3  D186 ; #	CYRILLIC SMALL LETTER TSE[m
[31m-    C4  D0B4 ; #	CYRILLIC SMALL LETTER DE[m
[31m-    C5  D0B5 ; #	CYRILLIC SMALL LETTER IE[m
[31m-    C6  D184 ; #	CYRILLIC SMALL LETTER EF[m
[31m-    C7  D0B3 ; #	CYRILLIC SMALL LETTER GHE[m
[31m-    C8  D185 ; #	CYRILLIC SMALL LETTER HA[m
[31m-    C9  D0B8 ; #	CYRILLIC SMALL LETTER I[m
[31m-    CA  D0B9 ; #	CYRILLIC SMALL LETTER SHORT I[m
[31m-    CB  D0BA ; #	CYRILLIC SMALL LETTER KA[m
[31m-    CC  D0BB ; #	CYRILLIC SMALL LETTER EL[m
[31m-    CD  D0BC ; #	CYRILLIC SMALL LETTER EM[m
[31m-    CE  D0BD ; #	CYRILLIC SMALL LETTER EN[m
[31m-    CF  D0BE ; #	CYRILLIC SMALL LETTER O[m
[31m-    D0  D0BF ; #	CYRILLIC SMALL LETTER PE[m
[31m-    D1  D18F ; #	CYRILLIC SMALL LETTER YA[m
[31m-    D2  D180 ; #	CYRILLIC SMALL LETTER ER[m
[31m-    D3  D181 ; #	CYRILLIC SMALL LETTER ES[m
[31m-    D4  D182 ; #	CYRILLIC SMALL LETTER TE[m
[31m-    D5  D183 ; #	CYRILLIC SMALL LETTER U[m
[31m-    D6  D0B6 ; #	CYRILLIC SMALL LETTER ZHE[m
[31m-    D7  D0B2 ; #	CYRILLIC SMALL LETTER VE[m
[31m-    D8  D18C ; #	CYRILLIC SMALL LETTER SOFT SIGN[m
[31m-    D9  D18B ; #	CYRILLIC SMALL LETTER YERU[m
[31m-    DA  D0B7 ; #	CYRILLIC SMALL LETTER ZE[m
[31m-    DB  D188 ; #	CYRILLIC SMALL LETTER SHA[m
[31m-    DC  D18D ; #	CYRILLIC SMALL LETTER E[m
[31m-    DD  D189 ; #	CYRILLIC SMALL LETTER SHCHA[m
[31m-    DE  D187 ; #	CYRILLIC SMALL LETTER CHE[m
[31m-    DF  D18A ; #	CYRILLIC SMALL LETTER HARD SIGN[m
[31m-    E0  D0AE ; #	CYRILLIC CAPITAL LETTER YU[m
[31m-    E1  D090 ; #	CYRILLIC CAPITAL LETTER A[m
[31m-    E2  D091 ; #	CYRILLIC CAPITAL LETTER BE[m
[31m-    E3  D0A6 ; #	CYRILLIC CAPITAL LETTER TSE[m
[31m-    E4  D094 ; #	CYRILLIC CAPITAL LETTER DE[m
[31m-    E5  D095 ; #	CYRILLIC CAPITAL LETTER IE[m
[31m-    E6  D0A4 ; #	CYRILLIC CAPITAL LETTER EF[m
[31m-    E7  D093 ; #	CYRILLIC CAPITAL LETTER GHE[m
[31m-    E8  D0A5 ; #	CYRILLIC CAPITAL LETTER HA[m
[31m-    E9  D098 ; #	CYRILLIC CAPITAL LETTER I[m
[31m-    EA  D099 ; #	CYRILLIC CAPITAL LETTER SHORT I[m
[31m-    EB  D09A ; #	CYRILLIC CAPITAL LETTER KA[m
[31m-    EC  D09B ; #	CYRILLIC CAPITAL LETTER EL[m
[31m-    ED  D09C ; #	CYRILLIC CAPITAL LETTER EM[m
[31m-    EE  D09D ; #	CYRILLIC CAPITAL LETTER EN[m
[31m-    EF  D09E ; #	CYRILLIC CAPITAL LETTER O[m
[31m-    F0  D09F ; #	CYRILLIC CAPITAL LETTER PE[m
[31m-    F1  D0AF ; #	CYRILLIC CAPITAL LETTER YA[m
[31m-    F2  D0A0 ; #	CYRILLIC CAPITAL LETTER ER[m
[31m-    F3  D0A1 ; #	CYRILLIC CAPITAL LETTER ES[m
[31m-    F4  D0A2 ; #	CYRILLIC CAPITAL LETTER TE[m
[31m-    F5  D0A3 ; #	CYRILLIC CAPITAL LETTER U[m
[31m-    F6  D096 ; #	CYRILLIC CAPITAL LETTER ZHE[m
[31m-    F7  D092 ; #	CYRILLIC CAPITAL LETTER VE[m
[31m-    F8  D0AC ; #	CYRILLIC CAPITAL LETTER SOFT SIGN[m
[31m-    F9  D0AB ; #	CYRILLIC CAPITAL LETTER YERU[m
[31m-    FA  D097 ; #	CYRILLIC CAPITAL LETTER ZE[m
[31m-    FB  D0A8 ; #	CYRILLIC CAPITAL LETTER SHA[m
[31m-    FC  D0AD ; #	CYRILLIC CAPITAL LETTER E[m
[31m-    FD  D0A9 ; #	CYRILLIC CAPITAL LETTER SHCHA[m
[31m-    FE  D0A7 ; #	CYRILLIC CAPITAL LETTER CHE[m
[31m-    FF  D0AA ; #	CYRILLIC CAPITAL LETTER HARD SIGN[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/unicode-to-nginx.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/unicode-to-nginx.pl[m
[1mdeleted file mode 100755[m
[1mindex daaf354..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/unicode-to-nginx.pl[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-#!/usr/bin/perl -w[m
[31m-[m
[31m-# Convert unicode mappings to nginx configuration file format.[m
[31m-[m
[31m-# You may find useful mappings in various places, including[m
[31m-# unicode.org official site:[m
[31m-#[m
[31m-# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT[m
[31m-# http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT[m
[31m-[m
[31m-# Needs perl 5.6 or later.[m
[31m-[m
[31m-# Written by Maxim Dounin, mdounin@rambler-co.ru[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-require 5.006;[m
[31m-[m
[31m-while (<>) {[m
[31m-	# Skip comments and empty lines[m
[31m-[m
[31m-	next if /^#/;[m
[31m-	next if /^\s*$/;[m
[31m-	chomp;[m
[31m-[m
[31m-	# Convert mappings[m
[31m-[m
[31m-	if (/^\s*0x(..)\s*0x(....)\s*(#.*)/) {[m
[31m-		# Mapping <from-code> <unicode-code> "#" <unicode-name>[m
[31m-		my $cs_code = $1;[m
[31m-		my $un_code = $2;[m
[31m-		my $un_name = $3;[m
[31m-[m
[31m-		# Produce UTF-8 sequence from character code;[m
[31m-[m
[31m-		my $un_utf8 = join('', map { sprintf("%02X", $_) } unpack("C*", pack("U", hex($un_code))));[m
[31m-[m
[31m-		print "    $cs_code  $un_utf8 ; $un_name\n";[m
[31m-[m
[31m-	} else {[m
[31m-		warn "Unrecognized line: '$_'";[m
[31m-	}[m
[31m-}[m
[31m-[m
[31m-###############################################################################[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/win-utf b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/win-utf[m
[1mdeleted file mode 100644[m
[1mindex af9f9aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/unicode2nginx/win-utf[m
[1m+++ /dev/null[m
[36m@@ -1,130 +0,0 @@[m
[31m-charset_map  windows-1251  utf-8 {[m
[31m-[m
[31m-    80  D082 ; #CYRILLIC CAPITAL LETTER DJE[m
[31m-    81  D083 ; #CYRILLIC CAPITAL LETTER GJE[m
[31m-    82  E2809A ; #SINGLE LOW-9 QUOTATION MARK[m
[31m-    83  D193 ; #CYRILLIC SMALL LETTER GJE[m
[31m-    84  E2809E ; #DOUBLE LOW-9 QUOTATION MARK[m
[31m-    85  E280A6 ; #HORIZONTAL ELLIPSIS[m
[31m-    86  E280A0 ; #DAGGER[m
[31m-    87  E280A1 ; #DOUBLE DAGGER[m
[31m-    88  E282AC ; #EURO SIGN[m
[31m-    89  E280B0 ; #PER MILLE SIGN[m
[31m-    8A  D089 ; #CYRILLIC CAPITAL LETTER LJE[m
[31m-    8B  E280B9 ; #SINGLE LEFT-POINTING ANGLE QUOTATION MARK[m
[31m-    8C  D08A ; #CYRILLIC CAPITAL LETTER NJE[m
[31m-    8D  D08C ; #CYRILLIC CAPITAL LETTER KJE[m
[31m-    8E  D08B ; #CYRILLIC CAPITAL LETTER TSHE[m
[31m-    8F  D08F ; #CYRILLIC CAPITAL LETTER DZHE[m
[31m-    90  D192 ; #CYRILLIC SMALL LETTER DJE[m
[31m-    91  E28098 ; #LEFT SINGLE QUOTATION MARK[m
[31m-    92  E28099 ; #RIGHT SINGLE QUOTATION MARK[m
[31m-    93  E2809C ; #LEFT DOUBLE QUOTATION MARK[m
[31m-    94  E2809D ; #RIGHT DOUBLE QUOTATION MARK[m
[31m-    95  E280A2 ; #BULLET[m
[31m-    96  E28093 ; #EN DASH[m
[31m-    97  E28094 ; #EM DASH[m
[31m-    99  E284A2 ; #TRADE MARK SIGN[m
[31m-    9A  D199 ; #CYRILLIC SMALL LETTER LJE[m
[31m-    9B  E280BA ; #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK[m
[31m-    9C  D19A ; #CYRILLIC SMALL LETTER NJE[m
[31m-    9D  D19C ; #CYRILLIC SMALL LETTER KJE[m
[31m-    9E  D19B ; #CYRILLIC SMALL LETTER TSHE[m
[31m-    9F  D19F ; #CYRILLIC SMALL LETTER DZHE[m
[31m-    A0  C2A0 ; #NO-BREAK SPACE[m
[31m-    A1  D08E ; #CYRILLIC CAPITAL LETTER SHORT U[m
[31m-    A2  D19E ; #CYRILLIC SMALL LETTER SHORT U[m
[31m-    A3  D088 ; #CYRILLIC CAPITAL LETTER JE[m
[31m-    A4  C2A4 ; #CURRENCY SIGN[m
[31m-    A5  D290 ; #CYRILLIC CAPITAL LETTER GHE WITH UPTURN[m
[31m-    A6  C2A6 ; #BROKEN BAR[m
[31m-    A7  C2A7 ; #SECTION SIGN[m
[31m-    A8  D081 ; #CYRILLIC CAPITAL LETTER IO[m
[31m-    A9  C2A9 ; #COPYRIGHT SIGN[m
[31m-    AA  D084 ; #CYRILLIC CAPITAL LETTER UKRAINIAN IE[m
[31m-    AB  C2AB ; #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK[m
[31m-    AC  C2AC ; #NOT SIGN[m
[31m-    AD  C2AD ; #SOFT HYPHEN[m
[31m-    AE  C2AE ; #REGISTERED SIGN[m
[31m-    AF  D087 ; #CYRILLIC CAPITAL LETTER YI[m
[31m-    B0  C2B0 ; #DEGREE SIGN[m
[31m-    B1  C2B1 ; #PLUS-MINUS SIGN[m
[31m-    B2  D086 ; #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I[m
[31m-    B3  D196 ; #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I[m
[31m-    B4  D291 ; #CYRILLIC SMALL LETTER GHE WITH UPTURN[m
[31m-    B5  C2B5 ; #MICRO SIGN[m
[31m-    B6  C2B6 ; #PILCROW SIGN[m
[31m-    B7  C2B7 ; #MIDDLE DOT[m
[31m-    B8  D191 ; #CYRILLIC SMALL LETTER IO[m
[31m-    B9  E28496 ; #NUMERO SIGN[m
[31m-    BA  D194 ; #CYRILLIC SMALL LETTER UKRAINIAN IE[m
[31m-    BB  C2BB ; #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK[m
[31m-    BC  D198 ; #CYRILLIC SMALL LETTER JE[m
[31m-    BD  D085 ; #CYRILLIC CAPITAL LETTER DZE[m
[31m-    BE  D195 ; #CYRILLIC SMALL LETTER DZE[m
[31m-    BF  D197 ; #CYRILLIC SMALL LETTER YI[m
[31m-    C0  D090 ; #CYRILLIC CAPITAL LETTER A[m
[31m-    C1  D091 ; #CYRILLIC CAPITAL LETTER BE[m
[31m-    C2  D092 ; #CYRILLIC CAPITAL LETTER VE[m
[31m-    C3  D093 ; #CYRILLIC CAPITAL LETTER GHE[m
[31m-    C4  D094 ; #CYRILLIC CAPITAL LETTER DE[m
[31m-    C5  D095 ; #CYRILLIC CAPITAL LETTER IE[m
[31m-    C6  D096 ; #CYRILLIC CAPITAL LETTER ZHE[m
[31m-    C7  D097 ; #CYRILLIC CAPITAL LETTER ZE[m
[31m-    C8  D098 ; #CYRILLIC CAPITAL LETTER I[m
[31m-    C9  D099 ; #CYRILLIC CAPITAL LETTER SHORT I[m
[31m-    CA  D09A ; #CYRILLIC CAPITAL LETTER KA[m
[31m-    CB  D09B ; #CYRILLIC CAPITAL LETTER EL[m
[31m-    CC  D09C ; #CYRILLIC CAPITAL LETTER EM[m
[31m-    CD  D09D ; #CYRILLIC CAPITAL LETTER EN[m
[31m-    CE  D09E ; #CYRILLIC CAPITAL LETTER O[m
[31m-    CF  D09F ; #CYRILLIC CAPITAL LETTER PE[m
[31m-    D0  D0A0 ; #CYRILLIC CAPITAL LETTER ER[m
[31m-    D1  D0A1 ; #CYRILLIC CAPITAL LETTER ES[m
[31m-    D2  D0A2 ; #CYRILLIC CAPITAL LETTER TE[m
[31m-    D3  D0A3 ; #CYRILLIC CAPITAL LETTER U[m
[31m-    D4  D0A4 ; #CYRILLIC CAPITAL LETTER EF[m
[31m-    D5  D0A5 ; #CYRILLIC CAPITAL LETTER HA[m
[31m-    D6  D0A6 ; #CYRILLIC CAPITAL LETTER TSE[m
[31m-    D7  D0A7 ; #CYRILLIC CAPITAL LETTER CHE[m
[31m-    D8  D0A8 ; #CYRILLIC CAPITAL LETTER SHA[m
[31m-    D9  D0A9 ; #CYRILLIC CAPITAL LETTER SHCHA[m
[31m-    DA  D0AA ; #CYRILLIC CAPITAL LETTER HARD SIGN[m
[31m-    DB  D0AB ; #CYRILLIC CAPITAL LETTER YERU[m
[31m-    DC  D0AC ; #CYRILLIC CAPITAL LETTER SOFT SIGN[m
[31m-    DD  D0AD ; #CYRILLIC CAPITAL LETTER E[m
[31m-    DE  D0AE ; #CYRILLIC CAPITAL LETTER YU[m
[31m-    DF  D0AF ; #CYRILLIC CAPITAL LETTER YA[m
[31m-    E0  D0B0 ; #CYRILLIC SMALL LETTER A[m
[31m-    E1  D0B1 ; #CYRILLIC SMALL LETTER BE[m
[31m-    E2  D0B2 ; #CYRILLIC SMALL LETTER VE[m
[31m-    E3  D0B3 ; #CYRILLIC SMALL LETTER GHE[m
[31m-    E4  D0B4 ; #CYRILLIC SMALL LETTER DE[m
[31m-    E5  D0B5 ; #CYRILLIC SMALL LETTER IE[m
[31m-    E6  D0B6 ; #CYRILLIC SMALL LETTER ZHE[m
[31m-    E7  D0B7 ; #CYRILLIC SMALL LETTER ZE[m
[31m-    E8  D0B8 ; #CYRILLIC SMALL LETTER I[m
[31m-    E9  D0B9 ; #CYRILLIC SMALL LETTER SHORT I[m
[31m-    EA  D0BA ; #CYRILLIC SMALL LETTER KA[m
[31m-    EB  D0BB ; #CYRILLIC SMALL LETTER EL[m
[31m-    EC  D0BC ; #CYRILLIC SMALL LETTER EM[m
[31m-    ED  D0BD ; #CYRILLIC SMALL LETTER EN[m
[31m-    EE  D0BE ; #CYRILLIC SMALL LETTER O[m
[31m-    EF  D0BF ; #CYRILLIC SMALL LETTER PE[m
[31m-    F0  D180 ; #CYRILLIC SMALL LETTER ER[m
[31m-    F1  D181 ; #CYRILLIC SMALL LETTER ES[m
[31m-    F2  D182 ; #CYRILLIC SMALL LETTER TE[m
[31m-    F3  D183 ; #CYRILLIC SMALL LETTER U[m
[31m-    F4  D184 ; #CYRILLIC SMALL LETTER EF[m
[31m-    F5  D185 ; #CYRILLIC SMALL LETTER HA[m
[31m-    F6  D186 ; #CYRILLIC SMALL LETTER TSE[m
[31m-    F7  D187 ; #CYRILLIC SMALL LETTER CHE[m
[31m-    F8  D188 ; #CYRILLIC SMALL LETTER SHA[m
[31m-    F9  D189 ; #CYRILLIC SMALL LETTER SHCHA[m
[31m-    FA  D18A ; #CYRILLIC SMALL LETTER HARD SIGN[m
[31m-    FB  D18B ; #CYRILLIC SMALL LETTER YERU[m
[31m-    FC  D18C ; #CYRILLIC SMALL LETTER SOFT SIGN[m
[31m-    FD  D18D ; #CYRILLIC SMALL LETTER E[m
[31m-    FE  D18E ; #CYRILLIC SMALL LETTER YU[m
[31m-    FF  D18F ; #CYRILLIC SMALL LETTER YA[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/ftdetect/nginx.vim b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/ftdetect/nginx.vim[m
[1mdeleted file mode 100644[m
[1mindex 3ae470d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/ftdetect/nginx.vim[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-au BufRead,BufNewFile *.nginx set ft=nginx[m
[31m-au BufRead,BufNewFile */etc/nginx/* set ft=nginx[m
[31m-au BufRead,BufNewFile */usr/local/nginx/conf/* set ft=nginx[m
[31m-au BufRead,BufNewFile nginx.conf set ft=nginx[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/indent/nginx.vim b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/indent/nginx.vim[m
[1mdeleted file mode 100644[m
[1mindex 8601366..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/indent/nginx.vim[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-if exists("b:did_indent")[m
[31m-    finish[m
[31m-endif[m
[31m-let b:did_indent = 1[m
[31m-[m
[31m-setlocal indentexpr=[m
[31m-[m
[31m-" cindent actually works for nginx' simple file structure[m
[31m-setlocal cindent[m
[31m-" Just make sure that the comments are not reset as defs would be.[m
[31m-setlocal cinkeys-=0#[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/syntax/nginx.vim b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/syntax/nginx.vim[m
[1mdeleted file mode 100644[m
[1mindex f1fd48a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/contrib/vim/syntax/nginx.vim[m
[1m+++ /dev/null[m
[36m@@ -1,836 +0,0 @@[m
[31m-" Vim syntax file[m
[31m-" Language: nginx.conf[m
[31m-[m
[31m-if exists("b:current_syntax")[m
[31m-  finish[m
[31m-end[m
[31m-[m
[31m-setlocal iskeyword+=.[m
[31m-setlocal iskeyword+=/[m
[31m-setlocal iskeyword+=:[m
[31m-[m
[31m-syn match ngxVariable '\$\(\w\+\|{\w\+}\)'[m
[31m-syn match ngxVariableBlock '\$\(\w\+\|{\w\+}\)' contained[m
[31m-syn match ngxVariableString '\$\(\w\+\|{\w\+}\)' contained[m
[31m-syn region ngxBlock start=+^+ end=+{+ skip=+\${+ contains=ngxComment,ngxDirectiveBlock,ngxVariableBlock,ngxString oneline[m
[31m-syn region ngxString start=+\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ contains=ngxVariableString[m
[31m-syn match ngxComment ' *#.*$'[m
[31m-[m
[31m-syn keyword ngxBoolean on[m
[31m-syn keyword ngxBoolean off[m
[31m-[m
[31m-syn keyword ngxDirectiveBlock http         contained[m
[31m-syn keyword ngxDirectiveBlock mail         contained[m
[31m-syn keyword ngxDirectiveBlock events       contained[m
[31m-syn keyword ngxDirectiveBlock server       contained[m
[31m-syn keyword ngxDirectiveBlock types        contained[m
[31m-syn keyword ngxDirectiveBlock location     contained[m
[31m-syn keyword ngxDirectiveBlock upstream     contained[m
[31m-syn keyword ngxDirectiveBlock charset_map  contained[m
[31m-syn keyword ngxDirectiveBlock limit_except contained[m
[31m-syn keyword ngxDirectiveBlock if           contained[m
[31m-syn keyword ngxDirectiveBlock geo          contained[m
[31m-syn keyword ngxDirectiveBlock map          contained[m
[31m-syn keyword ngxDirectiveBlock split_clients contained[m
[31m-[m
[31m-syn keyword ngxDirectiveImportant include[m
[31m-syn keyword ngxDirectiveImportant root[m
[31m-syn keyword ngxDirectiveImportant server[m
[31m-syn keyword ngxDirectiveImportant server_name[m
[31m-syn keyword ngxDirectiveImportant listen[m
[31m-syn keyword ngxDirectiveImportant internal[m
[31m-syn keyword ngxDirectiveImportant proxy_pass[m
[31m-syn keyword ngxDirectiveImportant memcached_pass[m
[31m-syn keyword ngxDirectiveImportant fastcgi_pass[m
[31m-syn keyword ngxDirectiveImportant scgi_pass[m
[31m-syn keyword ngxDirectiveImportant uwsgi_pass[m
[31m-syn keyword ngxDirectiveImportant try_files[m
[31m-[m
[31m-syn keyword ngxDirectiveControl break[m
[31m-syn keyword ngxDirectiveControl return[m
[31m-syn keyword ngxDirectiveControl rewrite[m
[31m-syn keyword ngxDirectiveControl set[m
[31m-[m
[31m-syn keyword ngxDirectiveError error_page[m
[31m-syn keyword ngxDirectiveError post_action[m
[31m-[m
[31m-syn keyword ngxDirectiveDeprecated connections[m
[31m-syn keyword ngxDirectiveDeprecated imap[m
[31m-syn keyword ngxDirectiveDeprecated limit_zone[m
[31m-syn keyword ngxDirectiveDeprecated mysql_test[m
[31m-syn keyword ngxDirectiveDeprecated open_file_cache_retest[m
[31m-syn keyword ngxDirectiveDeprecated optimize_server_names[m
[31m-syn keyword ngxDirectiveDeprecated satisfy_any[m
[31m-syn keyword ngxDirectiveDeprecated so_keepalive[m
[31m-[m
[31m-syn keyword ngxDirective accept_mutex[m
[31m-syn keyword ngxDirective accept_mutex_delay[m
[31m-syn keyword ngxDirective acceptex_read[m
[31m-syn keyword ngxDirective access_log[m
[31m-syn keyword ngxDirective add_after_body[m
[31m-syn keyword ngxDirective add_before_body[m
[31m-syn keyword ngxDirective add_header[m
[31m-syn keyword ngxDirective addition_types[m
[31m-syn keyword ngxDirective aio[m
[31m-syn keyword ngxDirective alias[m
[31m-syn keyword ngxDirective allow[m
[31m-syn keyword ngxDirective ancient_browser[m
[31m-syn keyword ngxDirective ancient_browser_value[m
[31m-syn keyword ngxDirective auth_basic[m
[31m-syn keyword ngxDirective auth_basic_user_file[m
[31m-syn keyword ngxDirective auth_http[m
[31m-syn keyword ngxDirective auth_http_header[m
[31m-syn keyword ngxDirective auth_http_timeout[m
[31m-syn keyword ngxDirective auth_request[m
[31m-syn keyword ngxDirective auth_request_set[m
[31m-syn keyword ngxDirective autoindex[m
[31m-syn keyword ngxDirective autoindex_exact_size[m
[31m-syn keyword ngxDirective autoindex_localtime[m
[31m-syn keyword ngxDirective charset[m
[31m-syn keyword ngxDirective charset_types[m
[31m-syn keyword ngxDirective chunked_transfer_encoding[m
[31m-syn keyword ngxDirective client_body_buffer_size[m
[31m-syn keyword ngxDirective client_body_in_file_only[m
[31m-syn keyword ngxDirective client_body_in_single_buffer[m
[31m-syn keyword ngxDirective client_body_temp_path[m
[31m-syn keyword ngxDirective client_body_timeout[m
[31m-syn keyword ngxDirective client_header_buffer_size[m
[31m-syn keyword ngxDirective client_header_timeout[m
[31m-syn keyword ngxDirective client_max_body_size[m
[31m-syn keyword ngxDirective connection_pool_size[m
[31m-syn keyword ngxDirective create_full_put_path[m
[31m-syn keyword ngxDirective daemon[m
[31m-syn keyword ngxDirective dav_access[m
[31m-syn keyword ngxDirective dav_methods[m
[31m-syn keyword ngxDirective debug_connection[m
[31m-syn keyword ngxDirective debug_points[m
[31m-syn keyword ngxDirective default_type[m
[31m-syn keyword ngxDirective degradation[m
[31m-syn keyword ngxDirective degrade[m
[31m-syn keyword ngxDirective deny[m
[31m-syn keyword ngxDirective devpoll_changes[m
[31m-syn keyword ngxDirective devpoll_events[m
[31m-syn keyword ngxDirective directio[m
[31m-syn keyword ngxDirective directio_alignment[m
[31m-syn keyword ngxDirective disable_symlinks[m
[31m-syn keyword ngxDirective empty_gif[m
[31m-syn keyword ngxDirective env[m
[31m-syn keyword ngxDirective epoll_events[m
[31m-syn keyword ngxDirective error_log[m
[31m-syn keyword ngxDirective etag[m
[31m-syn keyword ngxDirective eventport_events[m
[31m-syn keyword ngxDirective expires[m
[31m-syn keyword ngxDirective fastcgi_bind[m
[31m-syn keyword ngxDirective fastcgi_buffer_size[m
[31m-syn keyword ngxDirective fastcgi_buffering[m
[31m-syn keyword ngxDirective fastcgi_buffers[m
[31m-syn keyword ngxDirective fastcgi_busy_buffers_size[m
[31m-syn keyword ngxDirective fastcgi_cache[m
[31m-syn keyword ngxDirective fastcgi_cache_bypass[m
[31m-syn keyword ngxDirective fastcgi_cache_key[m
[31m-syn keyword ngxDirective fastcgi_cache_lock[m
[31m-syn keyword ngxDirective fastcgi_cache_lock_timeout[m
[31m-syn keyword ngxDirective fastcgi_cache_methods[m
[31m-syn keyword ngxDirective fastcgi_cache_min_uses[m
[31m-syn keyword ngxDirective fastcgi_cache_path[m
[31m-syn keyword ngxDirective fastcgi_cache_revalidate[m
[31m-syn keyword ngxDirective fastcgi_cache_use_stale[m
[31m-syn keyword ngxDirective fastcgi_cache_valid[m
[31m-syn keyword ngxDirective fastcgi_catch_stderr[m
[31m-syn keyword ngxDirective fastcgi_connect_timeout[m
[31m-syn keyword ngxDirective fastcgi_force_ranges[m
[31m-syn keyword ngxDirective fastcgi_hide_header[m
[31m-syn keyword ngxDirective fastcgi_ignore_client_abort[m
[31m-syn keyword ngxDirective fastcgi_ignore_headers[m
[31m-syn keyword ngxDirective fastcgi_index[m
[31m-syn keyword ngxDirective fastcgi_intercept_errors[m
[31m-syn keyword ngxDirective fastcgi_keep_conn[m
[31m-syn keyword ngxDirective fastcgi_max_temp_file_size[m
[31m-syn keyword ngxDirective fastcgi_next_upstream[m
[31m-syn keyword ngxDirective fastcgi_next_upstream_timeout[m
[31m-syn keyword ngxDirective fastcgi_next_upstream_tries[m
[31m-syn keyword ngxDirective fastcgi_no_cache[m
[31m-syn keyword ngxDirective fastcgi_param[m
[31m-syn keyword ngxDirective fastcgi_pass_header[m
[31m-syn keyword ngxDirective fastcgi_pass_request_body[m
[31m-syn keyword ngxDirective fastcgi_pass_request_headers[m
[31m-syn keyword ngxDirective fastcgi_read_timeout[m
[31m-syn keyword ngxDirective fastcgi_send_lowat[m
[31m-syn keyword ngxDirective fastcgi_send_timeout[m
[31m-syn keyword ngxDirective fastcgi_split_path_info[m
[31m-syn keyword ngxDirective fastcgi_store[m
[31m-syn keyword ngxDirective fastcgi_store_access[m
[31m-syn keyword ngxDirective fastcgi_temp_file_write_size[m
[31m-syn keyword ngxDirective fastcgi_temp_path[m
[31m-syn keyword ngxDirective flv[m
[31m-syn keyword ngxDirective geoip_city[m
[31m-syn keyword ngxDirective geoip_country[m
[31m-syn keyword ngxDirective geoip_org[m
[31m-syn keyword ngxDirective geoip_proxy[m
[31m-syn keyword ngxDirective geoip_proxy_recursive[m
[31m-syn keyword ngxDirective google_perftools_profiles[m
[31m-syn keyword ngxDirective gunzip[m
[31m-syn keyword ngxDirective gunzip_buffers[m
[31m-syn keyword ngxDirective gzip[m
[31m-syn keyword ngxDirective gzip_buffers[m
[31m-syn keyword ngxDirective gzip_comp_level[m
[31m-syn keyword ngxDirective gzip_disable[m
[31m-syn keyword ngxDirective gzip_hash[m
[31m-syn keyword ngxDirective gzip_http_version[m
[31m-syn keyword ngxDirective gzip_min_length[m
[31m-syn keyword ngxDirective gzip_no_buffer[m
[31m-syn keyword ngxDirective gzip_proxied[m
[31m-syn keyword ngxDirective gzip_static[m
[31m-syn keyword ngxDirective gzip_types[m
[31m-syn keyword ngxDirective gzip_vary[m
[31m-syn keyword ngxDirective gzip_window[m
[31m-syn keyword ngxDirective hash[m
[31m-syn keyword ngxDirective if_modified_since[m
[31m-syn keyword ngxDirective ignore_invalid_headers[m
[31m-syn keyword ngxDirective image_filter[m
[31m-syn keyword ngxDirective image_filter_buffer[m
[31m-syn keyword ngxDirective image_filter_interlace[m
[31m-syn keyword ngxDirective image_filter_jpeg_quality[m
[31m-syn keyword ngxDirective image_filter_sharpen[m
[31m-syn keyword ngxDirective image_filter_transparency[m
[31m-syn keyword ngxDirective imap_auth[m
[31m-syn keyword ngxDirective imap_capabilities[m
[31m-syn keyword ngxDirective imap_client_buffer[m
[31m-syn keyword ngxDirective index[m
[31m-syn keyword ngxDirective iocp_threads[m
[31m-syn keyword ngxDirective ip_hash[m
[31m-syn keyword ngxDirective keepalive[m
[31m-syn keyword ngxDirective keepalive_disable[m
[31m-syn keyword ngxDirective keepalive_requests[m
[31m-syn keyword ngxDirective keepalive_timeout[m
[31m-syn keyword ngxDirective kqueue_changes[m
[31m-syn keyword ngxDirective kqueue_events[m
[31m-syn keyword ngxDirective large_client_header_buffers[m
[31m-syn keyword ngxDirective least_conn[m
[31m-syn keyword ngxDirective limit_conn[m
[31m-syn keyword ngxDirective limit_conn_log_level[m
[31m-syn keyword ngxDirective limit_conn_status[m
[31m-syn keyword ngxDirective limit_conn_zone[m
[31m-syn keyword ngxDirective limit_rate[m
[31m-syn keyword ngxDirective limit_rate_after[m
[31m-syn keyword ngxDirective limit_req[m
[31m-syn keyword ngxDirective limit_req_log_level[m
[31m-syn keyword ngxDirective limit_req_status[m
[31m-syn keyword ngxDirective limit_req_zone[m
[31m-syn keyword ngxDirective lingering_close[m
[31m-syn keyword ngxDirective lingering_time[m
[31m-syn keyword ngxDirective lingering_timeout[m
[31m-syn keyword ngxDirective lock_file[m
[31m-syn keyword ngxDirective log_format[m
[31m-syn keyword ngxDirective log_not_found[m
[31m-syn keyword ngxDirective log_subrequest[m
[31m-syn keyword ngxDirective map_hash_bucket_size[m
[31m-syn keyword ngxDirective map_hash_max_size[m
[31m-syn keyword ngxDirective master_process[m
[31m-syn keyword ngxDirective max_ranges[m
[31m-syn keyword ngxDirective memcached_bind[m
[31m-syn keyword ngxDirective memcached_buffer_size[m
[31m-syn keyword ngxDirective memcached_connect_timeout[m
[31m-syn keyword ngxDirective memcached_gzip_flag[m
[31m-syn keyword ngxDirective memcached_next_upstream[m
[31m-syn keyword ngxDirective memcached_next_upstream_timeout[m
[31m-syn keyword ngxDirective memcached_next_upstream_tries[m
[31m-syn keyword ngxDirective memcached_read_timeout[m
[31m-syn keyword ngxDirective memcached_send_timeout[m
[31m-syn keyword ngxDirective merge_slashes[m
[31m-syn keyword ngxDirective min_delete_depth[m
[31m-syn keyword ngxDirective modern_browser[m
[31m-syn keyword ngxDirective modern_browser_value[m
[31m-syn keyword ngxDirective mp4[m
[31m-syn keyword ngxDirective mp4_buffer_size[m
[31m-syn keyword ngxDirective mp4_max_buffer_size[m
[31m-syn keyword ngxDirective msie_padding[m
[31m-syn keyword ngxDirective msie_refresh[m
[31m-syn keyword ngxDirective multi_accept[m
[31m-syn keyword ngxDirective open_file_cache[m
[31m-syn keyword ngxDirective open_file_cache_errors[m
[31m-syn keyword ngxDirective open_file_cache_events[m
[31m-syn keyword ngxDirective open_file_cache_min_uses[m
[31m-syn keyword ngxDirective open_file_cache_valid[m
[31m-syn keyword ngxDirective open_log_file_cache[m
[31m-syn keyword ngxDirective output_buffers[m
[31m-syn keyword ngxDirective override_charset[m
[31m-syn keyword ngxDirective pcre_jit[m
[31m-syn keyword ngxDirective perl[m
[31m-syn keyword ngxDirective perl_modules[m
[31m-syn keyword ngxDirective perl_require[m
[31m-syn keyword ngxDirective perl_set[m
[31m-syn keyword ngxDirective pid[m
[31m-syn keyword ngxDirective pop3_auth[m
[31m-syn keyword ngxDirective pop3_capabilities[m
[31m-syn keyword ngxDirective port_in_redirect[m
[31m-syn keyword ngxDirective post_acceptex[m
[31m-syn keyword ngxDirective postpone_gzipping[m
[31m-syn keyword ngxDirective postpone_output[m
[31m-syn keyword ngxDirective protocol[m
[31m-syn keyword ngxDirective proxy[m
[31m-syn keyword ngxDirective proxy_bind[m
[31m-syn keyword ngxDirective proxy_buffer[m
[31m-syn keyword ngxDirective proxy_buffer_size[m
[31m-syn keyword ngxDirective proxy_buffering[m
[31m-syn keyword ngxDirective proxy_buffers[m
[31m-syn keyword ngxDirective proxy_busy_buffers_size[m
[31m-syn keyword ngxDirective proxy_cache[m
[31m-syn keyword ngxDirective proxy_cache_bypass[m
[31m-syn keyword ngxDirective proxy_cache_key[m
[31m-syn keyword ngxDirective proxy_cache_lock[m
[31m-syn keyword ngxDirective proxy_cache_lock_timeout[m
[31m-syn keyword ngxDirective proxy_cache_methods[m
[31m-syn keyword ngxDirective proxy_cache_min_uses[m
[31m-syn keyword ngxDirective proxy_cache_path[m
[31m-syn keyword ngxDirective proxy_cache_revalidate[m
[31m-syn keyword ngxDirective proxy_cache_use_stale[m
[31m-syn keyword ngxDirective proxy_cache_valid[m
[31m-syn keyword ngxDirective proxy_connect_timeout[m
[31m-syn keyword ngxDirective proxy_cookie_domain[m
[31m-syn keyword ngxDirective proxy_cookie_path[m
[31m-syn keyword ngxDirective proxy_force_ranges[m
[31m-syn keyword ngxDirective proxy_headers_hash_bucket_size[m
[31m-syn keyword ngxDirective proxy_headers_hash_max_size[m
[31m-syn keyword ngxDirective proxy_hide_header[m
[31m-syn keyword ngxDirective proxy_http_version[m
[31m-syn keyword ngxDirective proxy_ignore_client_abort[m
[31m-syn keyword ngxDirective proxy_ignore_headers[m
[31m-syn keyword ngxDirective proxy_intercept_errors[m
[31m-syn keyword ngxDirective proxy_max_temp_file_size[m
[31m-syn keyword ngxDirective proxy_method[m
[31m-syn keyword ngxDirective proxy_next_upstream[m
[31m-syn keyword ngxDirective proxy_next_upstream_timeout[m
[31m-syn keyword ngxDirective proxy_next_upstream_tries[m
[31m-syn keyword ngxDirective proxy_no_cache[m
[31m-syn keyword ngxDirective proxy_pass_error_message[m
[31m-syn keyword ngxDirective proxy_pass_header[m
[31m-syn keyword ngxDirective proxy_pass_request_body[m
[31m-syn keyword ngxDirective proxy_pass_request_headers[m
[31m-syn keyword ngxDirective proxy_read_timeout[m
[31m-syn keyword ngxDirective proxy_redirect[m
[31m-syn keyword ngxDirective proxy_send_lowat[m
[31m-syn keyword ngxDirective proxy_send_timeout[m
[31m-syn keyword ngxDirective proxy_set_body[m
[31m-syn keyword ngxDirective proxy_set_header[m
[31m-syn keyword ngxDirective proxy_ssl_ciphers[m
[31m-syn keyword ngxDirective proxy_ssl_crl[m
[31m-syn keyword ngxDirective proxy_ssl_name[m
[31m-syn keyword ngxDirective proxy_ssl_protocols[m
[31m-syn keyword ngxDirective proxy_ssl_server_name[m
[31m-syn keyword ngxDirective proxy_ssl_session_reuse[m
[31m-syn keyword ngxDirective proxy_ssl_trusted_certificate[m
[31m-syn keyword ngxDirective proxy_ssl_verify[m
[31m-syn keyword ngxDirective proxy_ssl_verify_depth[m
[31m-syn keyword ngxDirective proxy_store[m
[31m-syn keyword ngxDirective proxy_store_access[m
[31m-syn keyword ngxDirective proxy_temp_file_write_size[m
[31m-syn keyword ngxDirective proxy_temp_path[m
[31m-syn keyword ngxDirective proxy_timeout[m
[31m-syn keyword ngxDirective random_index[m
[31m-syn keyword ngxDirective read_ahead[m
[31m-syn keyword ngxDirective real_ip_header[m
[31m-syn keyword ngxDirective real_ip_recursive[m
[31m-syn keyword ngxDirective recursive_error_pages[m
[31m-syn keyword ngxDirective referer_hash_bucket_size[m
[31m-syn keyword ngxDirective referer_hash_max_size[m
[31m-syn keyword ngxDirective request_pool_size[m
[31m-syn keyword ngxDirective reset_timedout_connection[m
[31m-syn keyword ngxDirective resolver[m
[31m-syn keyword ngxDirective resolver_timeout[m
[31m-syn keyword ngxDirective rewrite_log[m
[31m-syn keyword ngxDirective rtsig_overflow_events[m
[31m-syn keyword ngxDirective rtsig_overflow_test[m
[31m-syn keyword ngxDirective rtsig_overflow_threshold[m
[31m-syn keyword ngxDirective rtsig_signo[m
[31m-syn keyword ngxDirective satisfy[m
[31m-syn keyword ngxDirective scgi_bind[m
[31m-syn keyword ngxDirective scgi_buffer_size[m
[31m-syn keyword ngxDirective scgi_buffering[m
[31m-syn keyword ngxDirective scgi_buffers[m
[31m-syn keyword ngxDirective scgi_busy_buffers_size[m
[31m-syn keyword ngxDirective scgi_cache[m
[31m-syn keyword ngxDirective scgi_cache_bypass[m
[31m-syn keyword ngxDirective scgi_cache_key[m
[31m-syn keyword ngxDirective scgi_cache_lock[m
[31m-syn keyword ngxDirective scgi_cache_lock_timeout[m
[31m-syn keyword ngxDirective scgi_cache_methods[m
[31m-syn keyword ngxDirective scgi_cache_min_uses[m
[31m-syn keyword ngxDirective scgi_cache_path[m
[31m-syn keyword ngxDirective scgi_cache_revalidate[m
[31m-syn keyword ngxDirective scgi_cache_use_stale[m
[31m-syn keyword ngxDirective scgi_cache_valid[m
[31m-syn keyword ngxDirective scgi_connect_timeout[m
[31m-syn keyword ngxDirective scgi_force_ranges[m
[31m-syn keyword ngxDirective scgi_hide_header[m
[31m-syn keyword ngxDirective scgi_ignore_client_abort[m
[31m-syn keyword ngxDirective scgi_ignore_headers[m
[31m-syn keyword ngxDirective scgi_intercept_errors[m
[31m-syn keyword ngxDirective scgi_max_temp_file_size[m
[31m-syn keyword ngxDirective scgi_next_upstream[m
[31m-syn keyword ngxDirective scgi_next_upstream_timeout[m
[31m-syn keyword ngxDirective scgi_next_upstream_tries[m
[31m-syn keyword ngxDirective scgi_no_cache[m
[31m-syn keyword ngxDirective scgi_param[m
[31m-syn keyword ngxDirective scgi_pass_header[m
[31m-syn keyword ngxDirective scgi_pass_request_body[m
[31m-syn keyword ngxDirective scgi_pass_request_headers[m
[31m-syn keyword ngxDirective scgi_read_timeout[m
[31m-syn keyword ngxDirective scgi_send_timeout[m
[31m-syn keyword ngxDirective scgi_store[m
[31m-syn keyword ngxDirective scgi_store_access[m
[31m-syn keyword ngxDirective scgi_temp_file_write_size[m
[31m-syn keyword ngxDirective scgi_temp_path[m
[31m-syn keyword ngxDirective secure_link[m
[31m-syn keyword ngxDirective secure_link_md5[m
[31m-syn keyword ngxDirective secure_link_secret[m
[31m-syn keyword ngxDirective send_lowat[m
[31m-syn keyword ngxDirective send_timeout[m
[31m-syn keyword ngxDirective sendfile[m
[31m-syn keyword ngxDirective sendfile_max_chunk[m
[31m-syn keyword ngxDirective server_name_in_redirect[m
[31m-syn keyword ngxDirective server_names_hash_bucket_size[m
[31m-syn keyword ngxDirective server_names_hash_max_size[m
[31m-syn keyword ngxDirective server_tokens[m
[31m-syn keyword ngxDirective set_real_ip_from[m
[31m-syn keyword ngxDirective smtp_auth[m
[31m-syn keyword ngxDirective smtp_capabilities[m
[31m-syn keyword ngxDirective smtp_client_buffer[m
[31m-syn keyword ngxDirective smtp_greeting_delay[m
[31m-syn keyword ngxDirective source_charset[m
[31m-syn keyword ngxDirective spdy_chunk_size[m
[31m-syn keyword ngxDirective spdy_headers_comp[m
[31m-syn keyword ngxDirective spdy_keepalive_timeout[m
[31m-syn keyword ngxDirective spdy_max_concurrent_streams[m
[31m-syn keyword ngxDirective spdy_pool_size[m
[31m-syn keyword ngxDirective spdy_recv_buffer_size[m
[31m-syn keyword ngxDirective spdy_recv_timeout[m
[31m-syn keyword ngxDirective spdy_streams_index_size[m
[31m-syn keyword ngxDirective ssi[m
[31m-syn keyword ngxDirective ssi_ignore_recycled_buffers[m
[31m-syn keyword ngxDirective ssi_last_modified[m
[31m-syn keyword ngxDirective ssi_min_file_chunk[m
[31m-syn keyword ngxDirective ssi_silent_errors[m
[31m-syn keyword ngxDirective ssi_types[m
[31m-syn keyword ngxDirective ssi_value_length[m
[31m-syn keyword ngxDirective ssl[m
[31m-syn keyword ngxDirective ssl_buffer_size[m
[31m-syn keyword ngxDirective ssl_certificate[m
[31m-syn keyword ngxDirective ssl_certificate_key[m
[31m-syn keyword ngxDirective ssl_ciphers[m
[31m-syn keyword ngxDirective ssl_client_certificate[m
[31m-syn keyword ngxDirective ssl_crl[m
[31m-syn keyword ngxDirective ssl_dhparam[m
[31m-syn keyword ngxDirective ssl_ecdh_curve[m
[31m-syn keyword ngxDirective ssl_engine[m
[31m-syn keyword ngxDirective ssl_password_file[m
[31m-syn keyword ngxDirective ssl_prefer_server_ciphers[m
[31m-syn keyword ngxDirective ssl_protocols[m
[31m-syn keyword ngxDirective ssl_session_cache[m
[31m-syn keyword ngxDirective ssl_session_ticket_key[m
[31m-syn keyword ngxDirective ssl_session_tickets[m
[31m-syn keyword ngxDirective ssl_session_timeout[m
[31m-syn keyword ngxDirective ssl_stapling[m
[31m-syn keyword ngxDirective ssl_stapling_file[m
[31m-syn keyword ngxDirective ssl_stapling_responder[m
[31m-syn keyword ngxDirective ssl_stapling_verify[m
[31m-syn keyword ngxDirective ssl_trusted_certificate[m
[31m-syn keyword ngxDirective ssl_verify_client[m
[31m-syn keyword ngxDirective ssl_verify_depth[m
[31m-syn keyword ngxDirective starttls[m
[31m-syn keyword ngxDirective stub_status[m
[31m-syn keyword ngxDirective sub_filter[m
[31m-syn keyword ngxDirective sub_filter_last_modified[m
[31m-syn keyword ngxDirective sub_filter_once[m
[31m-syn keyword ngxDirective sub_filter_types[m
[31m-syn keyword ngxDirective tcp_nodelay[m
[31m-syn keyword ngxDirective tcp_nopush[m
[31m-syn keyword ngxDirective thread_stack_size[m
[31m-syn keyword ngxDirective timeout[m
[31m-syn keyword ngxDirective timer_resolution[m
[31m-syn keyword ngxDirective types_hash_bucket_size[m
[31m-syn keyword ngxDirective types_hash_max_size[m
[31m-syn keyword ngxDirective underscores_in_headers[m
[31m-syn keyword ngxDirective uninitialized_variable_warn[m
[31m-syn keyword ngxDirective use[m
[31m-syn keyword ngxDirective user[m
[31m-syn keyword ngxDirective userid[m
[31m-syn keyword ngxDirective userid_domain[m
[31m-syn keyword ngxDirective userid_expires[m
[31m-syn keyword ngxDirective userid_mark[m
[31m-syn keyword ngxDirective userid_name[m
[31m-syn keyword ngxDirective userid_p3p[m
[31m-syn keyword ngxDirective userid_path[m
[31m-syn keyword ngxDirective userid_service[m
[31m-syn keyword ngxDirective uwsgi_bind[m
[31m-syn keyword ngxDirective uwsgi_buffer_size[m
[31m-syn keyword ngxDirective uwsgi_buffering[m
[31m-syn keyword ngxDirective uwsgi_buffers[m
[31m-syn keyword ngxDirective uwsgi_busy_buffers_size[m
[31m-syn keyword ngxDirective uwsgi_cache[m
[31m-syn keyword ngxDirective uwsgi_cache_bypass[m
[31m-syn keyword ngxDirective uwsgi_cache_key[m
[31m-syn keyword ngxDirective uwsgi_cache_lock[m
[31m-syn keyword ngxDirective uwsgi_cache_lock_timeout[m
[31m-syn keyword ngxDirective uwsgi_cache_methods[m
[31m-syn keyword ngxDirective uwsgi_cache_min_uses[m
[31m-syn keyword ngxDirective uwsgi_cache_path[m
[31m-syn keyword ngxDirective uwsgi_cache_revalidate[m
[31m-syn keyword ngxDirective uwsgi_cache_use_stale[m
[31m-syn keyword ngxDirective uwsgi_cache_valid[m
[31m-syn keyword ngxDirective uwsgi_connect_timeout[m
[31m-syn keyword ngxDirective uwsgi_force_ranges[m
[31m-syn keyword ngxDirective uwsgi_hide_header[m
[31m-syn keyword ngxDirective uwsgi_ignore_client_abort[m
[31m-syn keyword ngxDirective uwsgi_ignore_headers[m
[31m-syn keyword ngxDirective uwsgi_intercept_errors[m
[31m-syn keyword ngxDirective uwsgi_max_temp_file_size[m
[31m-syn keyword ngxDirective uwsgi_modifier1[m
[31m-syn keyword ngxDirective uwsgi_modifier2[m
[31m-syn keyword ngxDirective uwsgi_next_upstream[m
[31m-syn keyword ngxDirective uwsgi_next_upstream_timeout[m
[31m-syn keyword ngxDirective uwsgi_next_upstream_tries[m
[31m-syn keyword ngxDirective uwsgi_no_cache[m
[31m-syn keyword ngxDirective uwsgi_param[m
[31m-syn keyword ngxDirective uwsgi_pass_header[m
[31m-syn keyword ngxDirective uwsgi_pass_request_body[m
[31m-syn keyword ngxDirective uwsgi_pass_request_headers[m
[31m-syn keyword ngxDirective uwsgi_read_timeout[m
[31m-syn keyword ngxDirective uwsgi_send_timeout[m
[31m-syn keyword ngxDirective uwsgi_ssl_ciphers[m
[31m-syn keyword ngxDirective uwsgi_ssl_crl[m
[31m-syn keyword ngxDirective uwsgi_ssl_name[m
[31m-syn keyword ngxDirective uwsgi_ssl_protocols[m
[31m-syn keyword ngxDirective uwsgi_ssl_server_name[m
[31m-syn keyword ngxDirective uwsgi_ssl_session_reuse[m
[31m-syn keyword ngxDirective uwsgi_ssl_trusted_certificate[m
[31m-syn keyword ngxDirective uwsgi_ssl_verify[m
[31m-syn keyword ngxDirective uwsgi_ssl_verify_depth[m
[31m-syn keyword ngxDirective uwsgi_store[m
[31m-syn keyword ngxDirective uwsgi_store_access[m
[31m-syn keyword ngxDirective uwsgi_string[m
[31m-syn keyword ngxDirective uwsgi_temp_file_write_size[m
[31m-syn keyword ngxDirective uwsgi_temp_path[m
[31m-syn keyword ngxDirective valid_referers[m
[31m-syn keyword ngxDirective variables_hash_bucket_size[m
[31m-syn keyword ngxDirective variables_hash_max_size[m
[31m-syn keyword ngxDirective worker_aio_requests[m
[31m-syn keyword ngxDirective worker_connections[m
[31m-syn keyword ngxDirective worker_cpu_affinity[m
[31m-syn keyword ngxDirective worker_priority[m
[31m-syn keyword ngxDirective worker_processes[m
[31m-syn keyword ngxDirective worker_rlimit_core[m
[31m-syn keyword ngxDirective worker_rlimit_nofile[m
[31m-syn keyword ngxDirective worker_rlimit_sigpending[m
[31m-syn keyword ngxDirective worker_threads[m
[31m-syn keyword ngxDirective working_directory[m
[31m-syn keyword ngxDirective xclient[m
[31m-syn keyword ngxDirective xml_entities[m
[31m-syn keyword ngxDirective xslt_last_modified[m
[31m-syn keyword ngxDirective xslt_param[m
[31m-syn keyword ngxDirective xslt_string_param[m
[31m-syn keyword ngxDirective xslt_stylesheet[m
[31m-syn keyword ngxDirective xslt_types[m
[31m-[m
[31m-" 3rd party module list:[m
[31m-" http://wiki.nginx.org/Nginx3rdPartyModules[m
[31m-[m
[31m-" Accept Language Module <http://wiki.nginx.org/NginxAcceptLanguageModule>[m
[31m-" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales.[m
[31m-syn keyword ngxDirectiveThirdParty set_from_accept_language[m
[31m-[m
[31m-" Access Key Module <http://wiki.nginx.org/NginxHttpAccessKeyModule>[m
[31m-" Denies access unless the request URL contains an access key.[m
[31m-syn keyword ngxDirectiveThirdParty accesskey[m
[31m-syn keyword ngxDirectiveThirdParty accesskey_arg[m
[31m-syn keyword ngxDirectiveThirdParty accesskey_hashmethod[m
[31m-syn keyword ngxDirectiveThirdParty accesskey_signature[m
[31m-[m
[31m-" Auth PAM Module <http://web.iti.upv.es/~sto/nginx/>[m
[31m-" HTTP Basic Authentication using PAM.[m
[31m-syn keyword ngxDirectiveThirdParty auth_pam[m
[31m-syn keyword ngxDirectiveThirdParty auth_pam_service_name[m
[31m-[m
[31m-" Cache Purge Module <http://labs.frickle.com/nginx_ngx_cache_purge/>[m
[31m-" Module adding ability to purge content from FastCGI and proxy caches.[m
[31m-syn keyword ngxDirectiveThirdParty fastcgi_cache_purge[m
[31m-syn keyword ngxDirectiveThirdParty proxy_cache_purge[m
[31m-[m
[31m-" Chunkin Module <http://wiki.nginx.org/NginxHttpChunkinModule>[m
[31m-" HTTP 1.1 chunked-encoding request body support for Nginx.[m
[31m-syn keyword ngxDirectiveThirdParty chunkin[m
[31m-syn keyword ngxDirectiveThirdParty chunkin_keepalive[m
[31m-syn keyword ngxDirectiveThirdParty chunkin_max_chunks_per_buf[m
[31m-syn keyword ngxDirectiveThirdParty chunkin_resume[m
[31m-[m
[31m-" Circle GIF Module <http://wiki.nginx.org/NginxHttpCircleGifModule>[m
[31m-" Generates simple circle images with the colors and size specified in the URL.[m
[31m-syn keyword ngxDirectiveThirdParty circle_gif[m
[31m-syn keyword ngxDirectiveThirdParty circle_gif_max_radius[m
[31m-syn keyword ngxDirectiveThirdParty circle_gif_min_radius[m
[31m-syn keyword ngxDirectiveThirdParty circle_gif_step_radius[m
[31m-[m
[31m-" Drizzle Module <http://github.com/chaoslawful/drizzle-nginx-module>[m
[31m-" Make nginx talk directly to mysql, drizzle, and sqlite3 by libdrizzle.[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_connect_timeout[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_dbname[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_keepalive[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_module_header[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_pass[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_query[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_recv_cols_timeout[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_recv_rows_timeout[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_send_query_timeout[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_server[m
[31m-[m
[31m-" Echo Module <http://wiki.nginx.org/NginxHttpEchoModule>[m
[31m-" Brings 'echo', 'sleep', 'time', 'exec' and more shell-style goodies to Nginx config file.[m
[31m-syn keyword ngxDirectiveThirdParty echo[m
[31m-syn keyword ngxDirectiveThirdParty echo_after_body[m
[31m-syn keyword ngxDirectiveThirdParty echo_before_body[m
[31m-syn keyword ngxDirectiveThirdParty echo_blocking_sleep[m
[31m-syn keyword ngxDirectiveThirdParty echo_duplicate[m
[31m-syn keyword ngxDirectiveThirdParty echo_end[m
[31m-syn keyword ngxDirectiveThirdParty echo_exec[m
[31m-syn keyword ngxDirectiveThirdParty echo_flush[m
[31m-syn keyword ngxDirectiveThirdParty echo_foreach_split[m
[31m-syn keyword ngxDirectiveThirdParty echo_location[m
[31m-syn keyword ngxDirectiveThirdParty echo_location_async[m
[31m-syn keyword ngxDirectiveThirdParty echo_read_request_body[m
[31m-syn keyword ngxDirectiveThirdParty echo_request_body[m
[31m-syn keyword ngxDirectiveThirdParty echo_reset_timer[m
[31m-syn keyword ngxDirectiveThirdParty echo_sleep[m
[31m-syn keyword ngxDirectiveThirdParty echo_subrequest[m
[31m-syn keyword ngxDirectiveThirdParty echo_subrequest_async[m
[31m-[m
[31m-" Events Module <http://docs.dutov.org/nginx_modules_events_en.html>[m
[31m-" Provides options for start/stop events.[m
[31m-syn keyword ngxDirectiveThirdParty on_start[m
[31m-syn keyword ngxDirectiveThirdParty on_stop[m
[31m-[m
[31m-" EY Balancer Module <http://github.com/ry/nginx-ey-balancer>[m
[31m-" Adds a request queue to Nginx that allows the limiting of concurrent requests passed to the upstream.[m
[31m-syn keyword ngxDirectiveThirdParty max_connections[m
[31m-syn keyword ngxDirectiveThirdParty max_connections_max_queue_length[m
[31m-syn keyword ngxDirectiveThirdParty max_connections_queue_timeout[m
[31m-[m
[31m-" Fancy Indexes Module <https://connectical.com/projects/ngx-fancyindex/wiki>[m
[31m-" Like the built-in autoindex module, but fancier.[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_exact_size[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_footer[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_header[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_localtime[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_readme[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_readme_mode[m
[31m-[m
[31m-" GeoIP Module (DEPRECATED) <http://wiki.nginx.org/NginxHttp3rdPartyGeoIPModule>[m
[31m-" Country code lookups via the MaxMind GeoIP API.[m
[31m-syn keyword ngxDirectiveThirdParty geoip_country_file[m
[31m-[m
[31m-" Headers More Module <http://wiki.nginx.org/NginxHttpHeadersMoreModule>[m
[31m-" Set and clear input and output headers...more than "add"![m
[31m-syn keyword ngxDirectiveThirdParty more_clear_headers[m
[31m-syn keyword ngxDirectiveThirdParty more_clear_input_headers[m
[31m-syn keyword ngxDirectiveThirdParty more_set_headers[m
[31m-syn keyword ngxDirectiveThirdParty more_set_input_headers[m
[31m-[m
[31m-" HTTP Push Module <http://pushmodule.slact.net/>[m
[31m-" Turn Nginx into an adept long-polling HTTP Push (Comet) server.[m
[31m-syn keyword ngxDirectiveThirdParty push_buffer_size[m
[31m-syn keyword ngxDirectiveThirdParty push_listener[m
[31m-syn keyword ngxDirectiveThirdParty push_message_timeout[m
[31m-syn keyword ngxDirectiveThirdParty push_queue_messages[m
[31m-syn keyword ngxDirectiveThirdParty push_sender[m
[31m-[m
[31m-" HTTP Redis Module <http://people.FreeBSD.ORG/~osa/ngx_http_redis-0.3.1.tar.gz>>[m
[31m-" Redis <http://code.google.com/p/redis/> support.>[m
[31m-syn keyword ngxDirectiveThirdParty redis_bind[m
[31m-syn keyword ngxDirectiveThirdParty redis_buffer_size[m
[31m-syn keyword ngxDirectiveThirdParty redis_connect_timeout[m
[31m-syn keyword ngxDirectiveThirdParty redis_next_upstream[m
[31m-syn keyword ngxDirectiveThirdParty redis_pass[m
[31m-syn keyword ngxDirectiveThirdParty redis_read_timeout[m
[31m-syn keyword ngxDirectiveThirdParty redis_send_timeout[m
[31m-[m
[31m-" HTTP JavaScript Module <http://wiki.github.com/kung-fu-tzu/ngx_http_js_module>[m
[31m-" Embedding SpiderMonkey. Nearly full port on Perl module.[m
[31m-syn keyword ngxDirectiveThirdParty js[m
[31m-syn keyword ngxDirectiveThirdParty js_filter[m
[31m-syn keyword ngxDirectiveThirdParty js_filter_types[m
[31m-syn keyword ngxDirectiveThirdParty js_load[m
[31m-syn keyword ngxDirectiveThirdParty js_maxmem[m
[31m-syn keyword ngxDirectiveThirdParty js_require[m
[31m-syn keyword ngxDirectiveThirdParty js_set[m
[31m-syn keyword ngxDirectiveThirdParty js_utf8[m
[31m-[m
[31m-" Log Request Speed <http://wiki.nginx.org/NginxHttpLogRequestSpeed>[m
[31m-" Log the time it took to process each request.[m
[31m-syn keyword ngxDirectiveThirdParty log_request_speed_filter[m
[31m-syn keyword ngxDirectiveThirdParty log_request_speed_filter_timeout[m
[31m-[m
[31m-" Memc Module <http://wiki.nginx.org/NginxHttpMemcModule>[m
[31m-" An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands.[m
[31m-syn keyword ngxDirectiveThirdParty memc_buffer_size[m
[31m-syn keyword ngxDirectiveThirdParty memc_cmds_allowed[m
[31m-syn keyword ngxDirectiveThirdParty memc_connect_timeout[m
[31m-syn keyword ngxDirectiveThirdParty memc_flags_to_last_modified[m
[31m-syn keyword ngxDirectiveThirdParty memc_next_upstream[m
[31m-syn keyword ngxDirectiveThirdParty memc_pass[m
[31m-syn keyword ngxDirectiveThirdParty memc_read_timeout[m
[31m-syn keyword ngxDirectiveThirdParty memc_send_timeout[m
[31m-syn keyword ngxDirectiveThirdParty memc_upstream_fail_timeout[m
[31m-syn keyword ngxDirectiveThirdParty memc_upstream_max_fails[m
[31m-[m
[31m-" Mogilefs Module <http://www.grid.net.ru/nginx/mogilefs.en.html>[m
[31m-" Implements a MogileFS client, provides a replace to the Perlbal reverse proxy of the original MogileFS.[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_connect_timeout[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_domain[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_methods[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_noverify[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_pass[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_read_timeout[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_send_timeout[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_tracker[m
[31m-[m
[31m-" MP4 Streaming Lite Module <http://wiki.nginx.org/NginxMP4StreamingLite>[m
[31m-" Will seek to a certain time within H.264/MP4 files when provided with a 'start' parameter in the URL.[m
[31m-syn keyword ngxDirectiveThirdParty mp4[m
[31m-[m
[31m-" Nginx Notice Module <http://xph.us/software/nginx-notice/>[m
[31m-" Serve static file to POST requests.[m
[31m-syn keyword ngxDirectiveThirdParty notice[m
[31m-syn keyword ngxDirectiveThirdParty notice_type[m
[31m-[m
[31m-" Phusion Passenger <http://www.modrails.com/documentation.html>[m
[31m-" Easy and robust deployment of Ruby on Rails application on Apache and Nginx webservers.[m
[31m-syn keyword ngxDirectiveThirdParty passenger_base_uri[m
[31m-syn keyword ngxDirectiveThirdParty passenger_default_user[m
[31m-syn keyword ngxDirectiveThirdParty passenger_enabled[m
[31m-syn keyword ngxDirectiveThirdParty passenger_log_level[m
[31m-syn keyword ngxDirectiveThirdParty passenger_max_instances_per_app[m
[31m-syn keyword ngxDirectiveThirdParty passenger_max_pool_size[m
[31m-syn keyword ngxDirectiveThirdParty passenger_pool_idle_time[m
[31m-syn keyword ngxDirectiveThirdParty passenger_root[m
[31m-syn keyword ngxDirectiveThirdParty passenger_ruby[m
[31m-syn keyword ngxDirectiveThirdParty passenger_use_global_queue[m
[31m-syn keyword ngxDirectiveThirdParty passenger_user_switching[m
[31m-syn keyword ngxDirectiveThirdParty rack_env[m
[31m-syn keyword ngxDirectiveThirdParty rails_app_spawner_idle_time[m
[31m-syn keyword ngxDirectiveThirdParty rails_env[m
[31m-syn keyword ngxDirectiveThirdParty rails_framework_spawner_idle_time[m
[31m-syn keyword ngxDirectiveThirdParty rails_spawn_method[m
[31m-[m
[31m-" RDS JSON Module <http://github.com/agentzh/rds-json-nginx-module>[m
[31m-" Help ngx_drizzle and other DBD modules emit JSON data.[m
[31m-syn keyword ngxDirectiveThirdParty rds_json[m
[31m-syn keyword ngxDirectiveThirdParty rds_json_content_type[m
[31m-syn keyword ngxDirectiveThirdParty rds_json_format[m
[31m-syn keyword ngxDirectiveThirdParty rds_json_ret[m
[31m-[m
[31m-" RRD Graph Module <http://wiki.nginx.org/NginxNgx_rrd_graph>[m
[31m-" This module provides an HTTP interface to RRDtool's graphing facilities.[m
[31m-syn keyword ngxDirectiveThirdParty rrd_graph[m
[31m-syn keyword ngxDirectiveThirdParty rrd_graph_root[m
[31m-[m
[31m-" Secure Download <http://wiki.nginx.org/NginxHttpSecureDownload>[m
[31m-" Create expiring links.[m
[31m-syn keyword ngxDirectiveThirdParty secure_download[m
[31m-syn keyword ngxDirectiveThirdParty secure_download_fail_location[m
[31m-syn keyword ngxDirectiveThirdParty secure_download_path_mode[m
[31m-syn keyword ngxDirectiveThirdParty secure_download_secret[m
[31m-[m
[31m-" SlowFS Cache Module <http://labs.frickle.com/nginx_ngx_slowfs_cache/>[m
[31m-" Module adding ability to cache static files.[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_big_file_size[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_key[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_min_uses[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_path[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_purge[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_valid[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_temp_path[m
[31m-[m
[31m-" Strip Module <http://wiki.nginx.org/NginxHttpStripModule>[m
[31m-" Whitespace remover.[m
[31m-syn keyword ngxDirectiveThirdParty strip[m
[31m-[m
[31m-" Substitutions Module <http://wiki.nginx.org/NginxHttpSubsModule>[m
[31m-" A filter module which can do both regular expression and fixed string substitutions on response bodies.[m
[31m-syn keyword ngxDirectiveThirdParty subs_filter[m
[31m-syn keyword ngxDirectiveThirdParty subs_filter_types[m
[31m-[m
[31m-" Supervisord Module <http://labs.frickle.com/nginx_ngx_supervisord/>[m
[31m-" Module providing nginx with API to communicate with supervisord and manage (start/stop) backends on-demand.[m
[31m-syn keyword ngxDirectiveThirdParty supervisord[m
[31m-syn keyword ngxDirectiveThirdParty supervisord_inherit_backend_status[m
[31m-syn keyword ngxDirectiveThirdParty supervisord_name[m
[31m-syn keyword ngxDirectiveThirdParty supervisord_start[m
[31m-syn keyword ngxDirectiveThirdParty supervisord_stop[m
[31m-[m
[31m-" Upload Module <http://www.grid.net.ru/nginx/upload.en.html>[m
[31m-" Parses multipart/form-data allowing arbitrary handling of uploaded files.[m
[31m-syn keyword ngxDirectiveThirdParty upload_aggregate_form_field[m
[31m-syn keyword ngxDirectiveThirdParty upload_buffer_size[m
[31m-syn keyword ngxDirectiveThirdParty upload_cleanup[m
[31m-syn keyword ngxDirectiveThirdParty upload_limit_rate[m
[31m-syn keyword ngxDirectiveThirdParty upload_max_file_size[m
[31m-syn keyword ngxDirectiveThirdParty upload_max_output_body_len[m
[31m-syn keyword ngxDirectiveThirdParty upload_max_part_header_len[m
[31m-syn keyword ngxDirectiveThirdParty upload_pass[m
[31m-syn keyword ngxDirectiveThirdParty upload_pass_args[m
[31m-syn keyword ngxDirectiveThirdParty upload_pass_form_field[m
[31m-syn keyword ngxDirectiveThirdParty upload_set_form_field[m
[31m-syn keyword ngxDirectiveThirdParty upload_store[m
[31m-syn keyword ngxDirectiveThirdParty upload_store_access[m
[31m-[m
[31m-" Upload Progress Module <http://wiki.nginx.org/NginxHttpUploadProgressModule>[m
[31m-" Tracks and reports upload progress.[m
[31m-syn keyword ngxDirectiveThirdParty report_uploads[m
[31m-syn keyword ngxDirectiveThirdParty track_uploads[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress_content_type[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress_header[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress_json_output[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress_template[m
[31m-[m
[31m-" Upstream Fair Balancer <http://wiki.nginx.org/NginxHttpUpstreamFairModule>[m
[31m-" Sends an incoming request to the least-busy backend server, rather than distributing requests round-robin.[m
[31m-syn keyword ngxDirectiveThirdParty fair[m
[31m-syn keyword ngxDirectiveThirdParty upstream_fair_shm_size[m
[31m-[m
[31m-" Upstream Consistent Hash <http://wiki.nginx.org/NginxHttpUpstreamConsistentHash>[m
[31m-" Select backend based on Consistent hash ring.[m
[31m-syn keyword ngxDirectiveThirdParty consistent_hash[m
[31m-[m
[31m-" Upstream Hash Module <http://wiki.nginx.org/NginxHttpUpstreamRequestHashModule>[m
[31m-" Provides simple upstream load distribution by hashing a configurable variable.[m
[31m-syn keyword ngxDirectiveThirdParty hash[m
[31m-syn keyword ngxDirectiveThirdParty hash_again[m
[31m-[m
[31m-" XSS Module <http://github.com/agentzh/xss-nginx-module>[m
[31m-" Native support for cross-site scripting (XSS) in an nginx.[m
[31m-syn keyword ngxDirectiveThirdParty xss_callback_arg[m
[31m-syn keyword ngxDirectiveThirdParty xss_get[m
[31m-syn keyword ngxDirectiveThirdParty xss_input_types[m
[31m-syn keyword ngxDirectiveThirdParty xss_output_type[m
[31m-[m
[31m-" highlight[m
[31m-[m
[31m-hi link ngxComment Comment[m
[31m-hi link ngxVariable Identifier[m
[31m-hi link ngxVariableBlock Identifier[m
[31m-hi link ngxVariableString PreProc[m
[31m-hi link ngxBlock Normal[m
[31m-hi link ngxString String[m
[31m-[m
[31m-hi link ngxBoolean Boolean[m
[31m-hi link ngxDirectiveBlock Statement[m
[31m-hi link ngxDirectiveImportant Type[m
[31m-hi link ngxDirectiveControl Keyword[m
[31m-hi link ngxDirectiveError Constant[m
[31m-hi link ngxDirectiveDeprecated Error[m
[31m-hi link ngxDirective Identifier[m
[31m-hi link ngxDirectiveThirdParty Special[m
[31m-[m
[31m-let b:current_syntax = "nginx"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/GNUmakefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/GNUmakefile[m
[1mdeleted file mode 100644[m
[1mindex 9a920fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/GNUmakefile[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-[m
[31m-VER=	$(shell grep 'define NGINX_VERSION' src/core/nginx.h		\[m
[31m-		| sed -e 's/^.*"\(.*\)".*/\1/')[m
[31m-NGINX=	nginx-$(VER)[m
[31m-TEMP=	tmp[m
[31m-XSLS?=	xslscript.pl[m
[31m-[m
[31m-[m
[31m-all:		changes[m
[31m-[m
[31m-changes:	$(TEMP)/$(NGINX)/CHANGES.ru				\[m
[31m-		$(TEMP)/$(NGINX)/CHANGES[m
[31m-[m
[31m-[m
[31m-$(TEMP)/$(NGINX)/CHANGES.ru:	docs/dtd/changes.dtd			\[m
[31m-				docs/xml/nginx/changes.xml		\[m
[31m-				docs/xml/change_log_conf.xml		\[m
[31m-				docs/xslt/changes.xslt[m
[31m-[m
[31m-	mkdir -p $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	xmllint --noout --valid docs/xml/nginx/changes.xml[m
[31m-	xsltproc --stringparam lang ru					\[m
[31m-		-o $@ docs/xslt/changes.xslt docs/xml/nginx/changes.xml[m
[31m-[m
[31m-[m
[31m-$(TEMP)/$(NGINX)/CHANGES:	docs/dtd/changes.dtd			\[m
[31m-				docs/xml/nginx/changes.xml		\[m
[31m-				docs/xml/change_log_conf.xml		\[m
[31m-				docs/xslt/changes.xslt[m
[31m-[m
[31m-	mkdir -p $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	xmllint --noout --valid docs/xml/nginx/changes.xml[m
[31m-	xsltproc --stringparam lang en					\[m
[31m-		-o $@ docs/xslt/changes.xslt docs/xml/nginx/changes.xml[m
[31m-[m
[31m-[m
[31m-docs/xslt/changes.xslt:		docs/xsls/changes.xsls[m
[31m-[m
[31m-	$(XSLS) -o $@ $<[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/dtd/change_log_conf.dtd b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/dtd/change_log_conf.dtd[m
[1mdeleted file mode 100644[m
[1mindex 40a0123..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/dtd/change_log_conf.dtd[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-<!ELEMENT configuration   (length, start, indent, changes+) >[m
[31m-[m
[31m-<!ELEMENT length          (#PCDATA) >[m
[31m-<!ELEMENT start           (#PCDATA) >[m
[31m-<!ELEMENT indent          (#PCDATA) >[m
[31m-[m
[31m-<!ELEMENT changes         (title, length,[m
[31m-                           bugfix, feature, change, workaround,[m
[31m-                           (month, month, month, month, month, month,[m
[31m-                            month, month, month, month, month, month)?) >[m
[31m-[m
[31m-<!ATTLIST changes         lang ( ru | en) #REQUIRED>[m
[31m-[m
[31m-<!ELEMENT title           (#PCDATA) >[m
[31m-[m
[31m-<!ELEMENT bugfix          (#PCDATA) >[m
[31m-<!ELEMENT feature         (#PCDATA) >[m
[31m-<!ELEMENT change          (#PCDATA) >[m
[31m-<!ELEMENT workaround      (#PCDATA) >[m
[31m-[m
[31m-<!ELEMENT month           (#PCDATA) >[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/dtd/changes.dtd b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/dtd/changes.dtd[m
[1mdeleted file mode 100644[m
[1mindex e14518a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/dtd/changes.dtd[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-<!ENTITY  nbsp         "&#xA0;" >[m
[31m-<!ENTITY  mdash        "&#xA0;- " >[m
[31m-[m
[31m-[m
[31m-<!ELEMENT change_log   (changes)* >[m
[31m-<!ATTLIST change_log   title  CDATA #REQUIRED >[m
[31m-[m
[31m-<!ELEMENT changes      (change)* >[m
[31m-<!ATTLIST changes      ver    CDATA #REQUIRED[m
[31m-                       date   CDATA #REQUIRED[m
[31m->[m
[31m-[m
[31m-<!ELEMENT change       (para)* >[m
[31m-<!ATTLIST change       type (bugfix | feature | change | security | workaround) #IMPLIED >[m
[31m-[m
[31m-<!ELEMENT para         (#PCDATA | at | br | nobr)* >[m
[31m-<!ATTLIST para         lang (ru | en) #REQUIRED >[m
[31m-[m
[31m-<!ELEMENT at           EMPTY >[m
[31m-<!ELEMENT br           EMPTY >[m
[31m-<!ELEMENT nobr         (#PCDATA) >[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/html/50x.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/html/50x.html[m
[1mdeleted file mode 100644[m
[1mindex f60f5e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/html/50x.html[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-<!DOCTYPE html>[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Error</title>[m
[31m-<style>[m
[31m-    body {[m
[31m-        width: 35em;[m
[31m-        margin: 0 auto;[m
[31m-        font-family: Tahoma, Verdana, Arial, sans-serif;[m
[31m-    }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<h1>An error occurred.</h1>[m
[31m-<p>Sorry, the page you are looking for is currently unavailable.<br/>[m
[31m-Please try again later.</p>[m
[31m-<p>If you are the system administrator of this resource then you should check[m
[31m-the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>[m
[31m-<p><em>Faithfully yours, nginx.</em></p>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/html/index.html b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/html/index.html[m
[1mdeleted file mode 100644[m
[1mindex 2ca3b95..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/html/index.html[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-<!DOCTYPE html>[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Welcome to nginx!</title>[m
[31m-<style>[m
[31m-    body {[m
[31m-        width: 35em;[m
[31m-        margin: 0 auto;[m
[31m-        font-family: Tahoma, Verdana, Arial, sans-serif;[m
[31m-    }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<h1>Welcome to nginx!</h1>[m
[31m-<p>If you see this page, the nginx web server is successfully installed and[m
[31m-working. Further configuration is required.</p>[m
[31m-[m
[31m-<p>For online documentation and support please refer to[m
[31m-<a href="http://nginx.org/">nginx.org</a>.<br/>[m
[31m-Commercial support is available at[m
[31m-<a href="http://nginx.com/">nginx.com</a>.</p>[m
[31m-[m
[31m-<p><em>Thank you for using nginx.</em></p>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/man/nginx.8 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/man/nginx.8[m
[1mdeleted file mode 100644[m
[1mindex 1f4dc89..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/man/nginx.8[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-.\"[m
[31m-.\" Copyright (C) 2010 Sergey A. Osokin[m
[31m-.\" Copyright (C) Nginx, Inc.[m
[31m-.\" All rights reserved.[m
[31m-.\"[m
[31m-.\" Redistribution and use in source and binary forms, with or without[m
[31m-.\" modification, are permitted provided that the following conditions[m
[31m-.\" are met:[m
[31m-.\" 1. Redistributions of source code must retain the above copyright[m
[31m-.\"    notice, this list of conditions and the following disclaimer.[m
[31m-.\" 2. Redistributions in binary form must reproduce the above copyright[m
[31m-.\"    notice, this list of conditions and the following disclaimer in the[m
[31m-.\"    documentation and/or other materials provided with the distribution.[m
[31m-.\"[m
[31m-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m-.\" SUCH DAMAGE.[m
[31m-.\"[m
[31m-.\"[m
[31m-.Dd June 16, 2015[m
[31m-.Dt NGINX 8[m
[31m-.Os[m
[31m-.Sh NAME[m
[31m-.Nm nginx[m
[31m-.Nd "HTTP and reverse proxy server, mail proxy server"[m
[31m-.Sh SYNOPSIS[m
[31m-.Nm[m
[31m-.Op Fl ?hqTtVv[m
[31m-.Op Fl c Ar file[m
[31m-.Op Fl g Ar directives[m
[31m-.Op Fl p Ar prefix[m
[31m-.Op Fl s Ar signal[m
[31m-.Sh DESCRIPTION[m
[31m-.Nm[m
[31m-(pronounced[m
[31m-.Dq engine x )[m
[31m-is an HTTP and reverse proxy server, as well as a mail proxy server.[m
[31m-It is known for its high performance, stability, rich feature set, simple[m
[31m-configuration, and low resource consumption.[m
[31m-.Pp[m
[31m-The options are as follows:[m
[31m-.Bl -tag -width ".Fl d Ar directives"[m
[31m-.It Fl ?\& , h[m
[31m-Print help.[m
[31m-.It Fl c Ar file[m
[31m-Use an alternative configuration[m
[31m-.Ar file .[m
[31m-.It Fl g Ar directives[m
[31m-Set global configuration directives.[m
[31m-See[m
[31m-.Sx EXAMPLES[m
[31m-for details.[m
[31m-.It Fl p Ar prefix[m
[31m-Set the prefix path.[m
[31m-The default value is[m
[31m-.Pa %%PREFIX%% .[m
[31m-.It Fl q[m
[31m-Suppress non-error messages during configuration testing.[m
[31m-.It Fl s Ar signal[m
[31m-Send a signal to the master process.[m
[31m-The argument[m
[31m-.Ar signal[m
[31m-can be one of:[m
[31m-.Cm stop , quit , reopen , reload .[m
[31m-The following table shows the corresponding system signals:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Cm reopen" -compact[m
[31m-.It Cm stop[m
[31m-.Dv SIGTERM[m
[31m-.It Cm quit[m
[31m-.Dv SIGQUIT[m
[31m-.It Cm reopen[m
[31m-.Dv SIGUSR1[m
[31m-.It Cm reload[m
[31m-.Dv SIGHUP[m
[31m-.El[m
[31m-.It Fl t[m
[31m-Do not run, just test the configuration file.[m
[31m-.Nm[m
[31m-checks the configuration file syntax and then tries to open files[m
[31m-referenced in the configuration file.[m
[31m-.It Fl T[m
[31m-Same as[m
[31m-.Fl t ,[m
[31m-but additionally dump configuration files to standard output.[m
[31m-.It Fl V[m
[31m-Print the[m
[31m-.Nm[m
[31m-version, compiler version, and[m
[31m-.Pa configure[m
[31m-script parameters.[m
[31m-.It Fl v[m
[31m-Print the[m
[31m-.Nm[m
[31m-version.[m
[31m-.El[m
[31m-.Sh SIGNALS[m
[31m-The master process of[m
[31m-.Nm[m
[31m-can handle the following signals:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Dv SIGINT , SIGTERM" -compact[m
[31m-.It Dv SIGINT , SIGTERM[m
[31m-Shut down quickly.[m
[31m-.It Dv SIGHUP[m
[31m-Reload configuration, start the new worker process with a new[m
[31m-configuration, and gracefully shut down old worker processes.[m
[31m-.It Dv SIGQUIT[m
[31m-Shut down gracefully.[m
[31m-.It Dv SIGUSR1[m
[31m-Reopen log files.[m
[31m-.It Dv SIGUSR2[m
[31m-Upgrade the[m
[31m-.Nm[m
[31m-executable on the fly.[m
[31m-.It Dv SIGWINCH[m
[31m-Shut down worker processes gracefully.[m
[31m-.El[m
[31m-.Pp[m
[31m-While there is no need to explicitly control worker processes normally,[m
[31m-they support some signals too:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Dv SIGINT , SIGTERM" -compact[m
[31m-.It Dv SIGTERM[m
[31m-Shut down quickly.[m
[31m-.It Dv SIGQUIT[m
[31m-Shut down gracefully.[m
[31m-.It Dv SIGUSR1[m
[31m-Reopen log files.[m
[31m-.El[m
[31m-.Sh DEBUGGING LOG[m
[31m-To enable a debugging log, reconfigure[m
[31m-.Nm[m
[31m-to build with debugging:[m
[31m-.Pp[m
[31m-.Dl "./configure --with-debug ..."[m
[31m-.Pp[m
[31m-and then set the[m
[31m-.Cm debug[m
[31m-level of the[m
[31m-.Va error_log :[m
[31m-.Pp[m
[31m-.Dl "error_log /path/to/log debug;"[m
[31m-.Pp[m
[31m-It is also possible to enable the debugging for a particular IP address:[m
[31m-.Bd -literal -offset indent[m
[31m-events {[m
[31m-	debug_connection 127.0.0.1;[m
[31m-}[m
[31m-.Ed[m
[31m-.Sh ENVIRONMENT[m
[31m-The[m
[31m-.Ev NGINX[m
[31m-environment variable is used internally by[m
[31m-.Nm[m
[31m-and should not be set directly by the user.[m
[31m-.Sh FILES[m
[31m-.Bl -tag -width indent[m
[31m-.It Pa %%PID_PATH%%[m
[31m-Contains the process ID of[m
[31m-.Nm .[m
[31m-The contents of this file are not sensitive, so it can be world-readable.[m
[31m-.It Pa %%CONF_PATH%%[m
[31m-The main configuration file.[m
[31m-.It Pa %%ERROR_LOG_PATH%%[m
[31m-Error log file.[m
[31m-.El[m
[31m-.Sh EXIT STATUS[m
[31m-Exit status is 0 on success, or 1 if the command fails.[m
[31m-.Sh EXAMPLES[m
[31m-Test configuration file[m
[31m-.Pa ~/mynginx.conf[m
[31m-with global directives for PID and quantity of worker processes:[m
[31m-.Bd -literal -offset indent[m
[31m-nginx -t -c ~/mynginx.conf \e[m
[31m-	-g "pid /var/run/mynginx.pid; worker_processes 2;"[m
[31m-.Ed[m
[31m-.Sh SEE ALSO[m
[31m-.\"Xr nginx.conf 5[m
[31m-.\"Pp[m
[31m-Documentation at[m
[31m-.Pa http://nginx.org/en/docs/ .[m
[31m-.Pp[m
[31m-For questions and technical support, please refer to[m
[31m-.Pa http://nginx.org/en/support.html .[m
[31m-.Sh HISTORY[m
[31m-Development of[m
[31m-.Nm[m
[31m-started in 2002, with the first public release on October 4, 2004.[m
[31m-.Sh AUTHORS[m
[31m-.An -nosplit[m
[31m-.An Igor Sysoev Aq igor@sysoev.ru .[m
[31m-.Pp[m
[31m-This manual page was originally written by[m
[31m-.An Sergey A. Osokin Aq osa@FreeBSD.org.ru[m
[31m-as a result of compiling many[m
[31m-.Nm[m
[31m-documents from all over the world.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/text/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/text/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 1d3d15c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/text/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-/* [m
[31m- * Copyright (C) 2002-2016 Igor Sysoev[m
[31m- * Copyright (C) 2011-2016 Nginx, Inc.[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xml/change_log_conf.xml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xml/change_log_conf.xml[m
[1mdeleted file mode 100644[m
[1mindex c03dc34..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xml/change_log_conf.xml[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-<?xml version="1.0" ?>[m
[31m-<!DOCTYPE configuration SYSTEM "../dtd/change_log_conf.dtd" >[m
[31m-[m
[31m-<configuration>[m
[31m-[m
[31m-<length>76</length>[m
[31m-[m
[31m-<start>    *) </start>[m
[31m-<indent>       </indent>[m
[31m-[m
[31m-<changes lang="ru">[m
[31m-    <title>Изменения в </title>[m
[31m-    <length>66</length>[m
[31m-[m
[31m-    <bugfix>Исправление</bugfix>[m
[31m-    <feature>Добавление</feature>[m
[31m-    <change>Изменение</change>[m
[31m-    <security>Безопасность</security>[m
[31m-    <workaround>Изменение</workaround>[m
[31m-</changes>[m
[31m-[m
[31m-<changes lang="en">[m
[31m-    <title>Changes with </title>[m
[31m-    <length>65</length>[m
[31m-[m
[31m-    <bugfix>Bugfix</bugfix>[m
[31m-    <feature>Feature</feature>[m
[31m-    <change>Change</change>[m
[31m-    <security>Security</security>[m
[31m-    <workaround>Workaround</workaround>[m
[31m-[m
[31m-    <month> Jan </month>[m
[31m-    <month> Feb </month>[m
[31m-    <month> Mar </month>[m
[31m-    <month> Apr </month>[m
[31m-    <month> May </month>[m
[31m-    <month> Jun </month>[m
[31m-    <month> Jul </month>[m
[31m-    <month> Aug </month>[m
[31m-    <month> Sep </month>[m
[31m-    <month> Oct </month>[m
[31m-    <month> Nov </month>[m
[31m-    <month> Dec </month>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-</configuration>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xml/nginx/changes.xml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xml/nginx/changes.xml[m
[1mdeleted file mode 100644[m
[1mindex 5f40bbc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xml/nginx/changes.xml[m
[1m+++ /dev/null[m
[36m@@ -1,24362 +0,0 @@[m
[31m-<?xml version="1.0" ?>[m
[31m-<!DOCTYPE change_log SYSTEM "../../dtd/changes.dtd" >[m
[31m-[m
[31m-[m
[31m-<change_log title="nginx">[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.15" date="19.04.2016">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HHVM в качестве FastCGI-сервера[m
[31m-могли возникать ошибки "recv() failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"recv() failed" errors might occur[m
[31m-when using HHVM as a FastCGI server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2 и директив limit_req или auth_request[m
[31m-при чтении тела запроса мог произойти таймаут[m
[31m-или ошибка "client violated flow control";[m
[31m-ошибка появилась в 1.9.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-when using HTTP/2 and the "limit_req" or "auth_request" directives[m
[31m-a timeout or a "client violated flow control" error[m
[31m-might occur while reading client request body;[m
[31m-the bug had appeared in 1.9.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2 ответ мог не показываться некоторыми браузерами,[m
[31m-если тело запроса было прочитано не целиком;[m
[31m-ошибка появилась в 1.9.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a response might not be shown by some browsers[m
[31m-if HTTP/2 was used and client request body was not fully read;[m
[31m-the bug had appeared in 1.9.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "aio threads" соединения могли зависать.<br/>[m
[31m-Спасибо Mindaugas Rasiukevicius.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections might hang when using the "aio threads" directive.<br/>[m
[31m-Thanks to Mindaugas Rasiukevicius.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.14" date="05.04.2016">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL 1.1.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL 1.1.0 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_request_buffering, fastcgi_request_buffering,[m
[31m-scgi_request_buffering и uwsgi_request_buffering[m
[31m-теперь работают при использовании HTTP/2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_request_buffering", "fastcgi_request_buffering",[m
[31m-"scgi_request_buffering", and "uwsgi_request_buffering" directives[m
[31m-now work with HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-в логах могли появляться сообщения "zero size buf in output".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"zero size buf in output" alerts might appear in logs[m
[31m-when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-директива client_max_body_size могла работать неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "client_max_body_size" directive might work incorrectly[m
[31m-when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-незначительных ошибок логгирования.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of minor bugs in logging.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.13" date="29.03.2016">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-неидемпотентные запросы (POST, LOCK, PATCH)[m
[31m-теперь по умолчанию не передаются на другой сервер,[m
[31m-если запрос уже был отправлен на бэкенд;[m
[31m-параметр non_idempotent директивы proxy_next_upstream[m
[31m-явно разрешает повторять такие запросы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-non-idempotent requests (POST, LOCK, PATCH)[m
[31m-are no longer passed to the next server by default[m
[31m-if a request has been sent to a backend;[m
[31m-the "non_idempotent" parameter of the "proxy_next_upstream" directive[m
[31m-explicitly allows retrying such requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module теперь можно собрать динамически.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module can be built dynamically.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка UDP в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-UDP support in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива aio_write.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "aio_write" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь cache manager следит за количеством элементов в кэше[m
[31m-и старается не допускать переполнений зоны разделяемой памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now cache manager monitors number of elements in caches[m
[31m-and tries to avoid cache keys zone overflows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив sendfile и aio с подзапросами[m
[31m-в логах могли появляться сообщения "task already active" и "second aio post".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-[m
[31m-"task already active" and "second aio post" alerts might appear in logs[m
[31m-when using the "sendfile" and "aio" directives with subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования[m
[31m-в логах могли появляться сообщения "zero size buf in output",[m
[31m-если клиент закрывал соединение преждевременно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"zero size buf in output" alerts might appear in logs[m
[31m-if caching was used[m
[31m-and a client closed a connection prematurely.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования[m
[31m-соединения с клиентами могли закрываться без необходимости.<br/>[m
[31m-Спасибо Justin Li.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections with clients might be closed needlessly[m
[31m-if caching was used.<br/>[m
[31m-Thanks to Justin Li.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог нагружать процессор[m
[31m-при использовании директивы sendfile на Linux и Solaris,[m
[31m-если отправляемый файл был изменён в процессе отправки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might hog CPU[m
[31m-if the "sendfile" directive was used on Linux or Solaris[m
[31m-and a file being sent was changed during sending.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив sendfile и "aio threads"[m
[31m-соединения могли зависать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections might hang[m
[31m-when using the "sendfile" and "aio threads" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах proxy_pass, fastcgi_pass, scgi_pass и uwsgi_pass[m
[31m-при использовании переменных.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_pass", "fastcgi_pass", "scgi_pass", and "uwsgi_pass" directives[m
[31m-when using variables.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в закэшированном соединении к бэкенду происходила ошибка,[m
[31m-запрос передавался на другой сервер[m
[31m-без учёта директивы proxy_next_upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if an error occurred in a cached backend connection,[m
[31m-the request was passed to the next server[m
[31m-regardless of the proxy_next_upstream directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "CreateFile() failed" при создании временных файлов на Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"CreateFile() failed" errors when creating temporary files on Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.12" date="24.02.2016">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-кодирование Хаффмана заголовков ответов в HTTP/2.<br/>[m
[31m-Спасибо Владу Краснову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Huffman encoding of response headers in HTTP/2.<br/>[m
[31m-Thanks to Vlad Krasnov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_cpu_affinity теперь поддерживает более 64 процессоров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_cpu_affinity" directive now supports more than 64 CPUs.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость со сторонними модулями на C++;[m
[31m-ошибка появилась в 1.9.11.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with 3rd party C++ modules;[m
[31m-the bug had appeared in 1.9.11.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался статически с OpenSSL на Linux;[m
[31m-ошибка появилась в 1.9.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built statically with OpenSSL on Linux;[m
[31m-the bug had appeared in 1.9.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "add_header ... always" с пустым значением[m
[31m-не удаляла из заголовков ошибочных ответов[m
[31m-строки Last-Modified и ETag.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header ... always" directive with an empty value[m
[31m-did not delete "Last-Modified" and "ETag" header lines[m
[31m-from error responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-при использовании OpenSSL 1.0.2f в логах могли появляться[m
[31m-сообщения "called a function you should not call" и[m
[31m-"shutdown while in init".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"called a function you should not call"[m
[31m-and "shutdown while in init" messages might appear in logs[m
[31m-when using OpenSSL 1.0.2f.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибочные заголовки могли логгироваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-invalid headers might be logged incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов при использовании HTTP/2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_v2_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_v2_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.11" date="09.02.2016">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь resolver поддерживает TCP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-TCP support in resolver.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-динамические модули.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-dynamic modules.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-переменная $request_length не учитывала размер заголовков запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_length variable did not include size of request headers[m
[31m-when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_v2_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_v2_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.10" date="26.01.2016">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы resolver[m
[31m-во время обработки ответов DNS-сервера[m
[31m-могло происходить разыменование некорректного адреса,[m
[31m-что позволяло атакующему,[m
[31m-имеющему возможность подделывать UDP-пакеты от DNS-сервера,[m
[31m-вызвать segmentation fault в рабочем процессе (CVE-2016-0742).[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-invalid pointer dereference might occur[m
[31m-during DNS server response processing[m
[31m-if the "resolver" directive was used,[m
[31m-allowing an attacker who is able to forge UDP packets from the DNS server[m
[31m-to cause segmentation fault in a worker process (CVE-2016-0742).[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы resolver[m
[31m-во время обработки CNAME-записей[m
[31m-могло произойти обращение к ранее освобождённой памяти,[m
[31m-что позволяло атакующему,[m
[31m-имеющему возможность инициировать преобразование произвольных имён в адреса,[m
[31m-вызвать segmentation fault в рабочем процессе,[m
[31m-а также потенциально могло иметь другие последствия (CVE-2016-0746).[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-use-after-free condition might occur[m
[31m-during CNAME response processing[m
[31m-if the "resolver" directive was used,[m
[31m-allowing an attacker who is able to trigger name resolution[m
[31m-to cause segmentation fault in a worker process,[m
[31m-or might have potential other impact (CVE-2016-0746).[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы resolver[m
[31m-во время обработки CNAME-записей[m
[31m-не во всех случаях проверялось ограничение[m
[31m-на максимальное количество записей в цепочке,[m
[31m-что позволяло атакующему,[m
[31m-имеющему возможность инициировать преобразование произвольных имён в адреса,[m
[31m-вызвать чрезмерное потребление ресурсов рабочими процессами (CVE-2016-0747).[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-CNAME resolution was insufficiently limited[m
[31m-if the "resolver" directive was used,[m
[31m-allowing an attacker who is able to trigger arbitrary name resolution[m
[31m-to cause excessive resource consumption in worker processes (CVE-2016-0747).[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр auto директивы worker_cpu_affinity.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auto" parameter of the "worker_cpu_affinity" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр proxy_protocol директивы listen не работал[m
[31m-с IPv6 listen-сокетами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_protocol" parameter of the "listen" directive did not work[m
[31m-with IPv6 listen sockets.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы keepalive[m
[31m-соединения к бэкендам могли кэшироваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections to upstream servers might be cached incorrectly[m
[31m-when using the "keepalive" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с помощью X-Accel-Redirect[m
[31m-при проксировании использовался HTTP-метод оригинального запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxying used the HTTP method of the original request[m
[31m-after an "X-Accel-Redirect" redirection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.9" date="09.12.2015">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-проксирование в unix domain сокеты не работало при использовании переменных;[m
[31m-ошибка появилась в 1.9.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxying to unix domain sockets did not work when using variables;[m
[31m-the bug had appeared in 1.9.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.8" date="08.12.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка pwritev().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-pwritev() support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива include в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "include" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_slice_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_slice_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании LibreSSL[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 1.9.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when using LibreSSL;[m
[31m-the bug had appeared in 1.9.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не собираться на OS X.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OS X in some cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.7" date="17.11.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр nohostname логгирования в syslog.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "nohostname" parameter of logging to syslog.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_cache_convert_head.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_convert_head" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $realip_remote_addr в модуле ngx_http_realip_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $realip_remote_addr variable in the ngx_http_realip_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива expires могла не срабатывать при использовании переменных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive might not work when using variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 1.9.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when using HTTP/2;[m
[31m-the bug had appeared in 1.9.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_v2_module,[m
[31m-протокол HTTP/2 мог быть использован клиентом,[m
[31m-даже если не был указан параметр http2 директивы listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with the ngx_http_v2_module[m
[31m-it was possible to use the HTTP/2 protocol[m
[31m-even if the "http2" parameter of the "listen" directive was not specified.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_v2_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_v2_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.6" date="27.10.2015">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Piotr Sikora и Denis Andzakovic.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when using HTTP/2.<br/>[m
[31m-Thanks to Piotr Sikora and Denis Andzakovic.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2 переменная $server_protocol была пустой.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $server_protocol variable was empty when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL-соединения к бэкендам в модуле stream[m
[31m-могли неожиданно завершаться по таймауту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-backend SSL connections in the stream module[m
[31m-might be timed out unexpectedly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании различных настроек ssl_session_cache[m
[31m-в разных виртуальных серверах[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if different ssl_session_cache settings were used[m
[31m-in different virtual servers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не собирался с MinGW gcc;[m
[31m-ошибка появилась в 1.9.4.<br/>[m
[31m-Спасибо Kouhei Sutou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not be built with MinGW gcc;[m
[31m-the bug had appeared in 1.9.4.<br/>[m
[31m-Thanks to Kouhei Sutou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы timer_resolution на Windows время не обновлялось.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-time was not updated when the timer_resolution directive was used on Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Незначительные исправления и улучшения.<br/>[m
[31m-Спасибо Markus Linnala, Kurtis Nusbaum и Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Miscellaneous minor fixes and improvements.<br/>[m
[31m-Thanks to Markus Linnala, Kurtis Nusbaum and Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.5" date="22.09.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_v2_module (заменяет модуль ngx_http_spdy_module).<br/>[m
[31m-Спасибо Dropbox и Automattic за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_v2_module (replaces ngx_http_spdy_module).<br/>[m
[31m-Thanks to Dropbox and Automattic for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию директива output_buffers использует два буфера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "output_buffers" directive uses two buffers by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx ограничивает максимальную вложенность подзапросов,[m
[31m-а не количество одновременных подзапросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx limits subrequests recursion,[m
[31m-not simultaneous subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при возврате ответов из кэша nginx проверяет ключ полностью.<br/>[m
[31m-Спасибо Геннадию Махомеду и Сергею Брестеру.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx checks the whole cache key when returning a response from cache.<br/>[m
[31m-Thanks to Gena Makhomed and Sergey Brester.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэша[m
[31m-в логах могли появляться сообщения "header already sent";[m
[31m-ошибка появилась в 1.7.5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"header already sent" alerts might appear in logs[m
[31m-when using cache;[m
[31m-the bug had appeared in 1.7.5.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании CephFS и директивы timer_resolution на Linux[m
[31m-в логах могли появляться сообщения[m
[31m-"writev() failed (4: Interrupted system call)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"writev() failed (4: Interrupted system call)"[m
[31m-errors might appear in logs[m
[31m-when using CephFS and the "timer_resolution" directive on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок конфигурации.<br/>[m
[31m-Спасибо Markus Linnala.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in invalid configurations handling.<br/>[m
[31m-Thanks to Markus Linnala.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы sub_filter на уровне http[m
[31m-в рабочем процессе происходил segmentation fault;[m
[31m-ошибка появилась в 1.9.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process[m
[31m-if the "sub_filter" directive was used at http level;[m
[31m-the bug had appeared in 1.9.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.4" date="18.08.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_downstream_buffer и proxy_upstream_buffer в модуле stream[m
[31m-заменены директивой proxy_buffer_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_downstream_buffer" and "proxy_upstream_buffer" directives[m
[31m-of the stream module are replaced with the "proxy_buffer_size" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива tcp_nodelay в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "tcp_nodelay" directive in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно указать несколько директив sub_filter одновременно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-multiple "sub_filter" directives can be used simultaneously.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива sub_filter поддерживает переменные в строке поиска.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the search string of the "sub_filter" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-тестирование конфигурации могло не работать под Linux OpenVZ.<br/>[m
[31m-Спасибо Геннадию Махомеду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-configuration testing might fail under Linux OpenVZ.<br/>[m
[31m-Thanks to Gena Makhomed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после переконфигурации старые рабочие процессы могли сильно нагружать процессор[m
[31m-при больших значениях worker_connections.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-old worker processes might hog CPU after reconfiguration[m
[31m-with a large number of worker_connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при совместном использовании директив try_files и alias[m
[31m-внутри location'а, заданного регулярным выражением,[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 1.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "try_files" and "alias" directives were used[m
[31m-inside a location given by a regular expression;[m
[31m-the bug had appeared in 1.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files внутри вложенного location'а, заданного регулярным[m
[31m-выражением, работала неправильно, если во внешнем location'е использовалась[m
[31m-директива alias.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive inside a nested location[m
[31m-given by a regular expression worked incorrectly[m
[31m-if the "alias" directive was used in the outer location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при построении хэш-таблиц.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in hash table initialization error handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с Visual Studio 2015.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with Visual Studio 2015.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.3" date="14.07.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-дублирующиеся блоки http, mail и stream теперь запрещены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-duplicate "http", "mail", and "stream" blocks are now disallowed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ограничение количества соединений в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connection limiting in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ограничение скорости в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-data rate limiting in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива zone в блоке upstream не работала на Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "zone" directive inside the "upstream" block did not work on Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с LibreSSL в модуле stream.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with LibreSSL in the stream module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в параметре --builddir в configure.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "--builddir" configure parameter.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ssl_stapling_file не работала;[m
[31m-ошибка появилась в 1.9.2.<br/>[m
[31m-Спасибо Faidon Liambotis и Brandon Black.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_stapling_file" directive did not work;[m
[31m-the bug had appeared in 1.9.2.<br/>[m
[31m-Thanks to Faidon Liambotis and Brandon Black.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы ssl_stapling[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 1.9.2.<br/>[m
[31m-Спасибо Matthew Baldwin.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "ssl_stapling" directive was used;[m
[31m-the bug had appeared in 1.9.2.<br/>[m
[31m-Thanks to Matthew Baldwin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.2" date="16.06.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр backlog директивы listen[m
[31m-в почтовом прокси-сервере и модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "backlog" parameter of the "listen" directives[m
[31m-of the mail proxy and stream modules.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы allow и deny в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "allow" and "deny" directives in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_bind в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_bind" directive in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_protocol в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_protocol" directive in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -T.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -T switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр REQUEST_SCHEME добавлен в стандартные конфигурационные файлы[m
[31m-fastcgi.conf, fastcgi_params, scgi_params и uwsgi_params.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the REQUEST_SCHEME parameter added to the fastcgi.conf, fastcgi_params,[m
[31m-scgi_params, and uwsgi_params standard configuration files.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр reuseport директивы listen в модуле stream[m
[31m-не работал.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "reuseport" parameter of the "listen" directive of the stream module[m
[31m-did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-OCSP stapling в некоторых случаях мог вернуть устаревший OCSP-ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OCSP stapling might return an expired OCSP response in some cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.1" date="26.05.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь протокол SSLv3 по умолчанию запрещён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now SSLv3 protocol is disabled by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-некоторые давно устаревшие директивы больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some long deprecated directives are not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр reuseport директивы listen.<br/>[m
[31m-Спасибо Yingqi Lu из Intel и Sepherosa Ziehau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "reuseport" parameter of the "listen" directive.<br/>[m
[31m-Thanks to Yingqi Lu at Intel and Sepherosa Ziehau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_connect_time.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_connect_time variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве hash на big-endian платформах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "hash" directive on big-endian platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не запускаться на некоторых старых версиях Linux;[m
[31m-ошибка появилась в 1.7.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might fail to start on some old Linux variants;[m
[31m-the bug had appeared in 1.7.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в парсинге IP-адресов.<br/>[m
[31m-Спасибо Сергею Половко.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in IP address parsing.<br/>[m
[31m-Thanks to Sergey Polovko.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.0" date="28.04.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-устаревшие методы обработки соединений aio и rtsig больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-obsolete aio and rtsig event methods have been removed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива zone в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "zone" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка byte ranges для ответов модуля ngx_http_memcached_module.<br/>[m
[31m-Спасибо Martin Mlynář.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-byte ranges support in the ngx_http_memcached_module.<br/>[m
[31m-Thanks to Martin Mlynář.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-разделяемую память теперь можно использовать на версиях Windows[m
[31m-с рандомизацией адресного пространства.<br/>[m
[31m-Спасибо Сергею Брестеру.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-shared memory can now be used on Windows versions[m
[31m-with address space layout randomization.<br/>[m
[31m-Thanks to Sergey Brester.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву error_log теперь можно использовать[m
[31m-на уровнях mail и server в почтовом прокси-сервере.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_log" directive can now be used[m
[31m-on mail and server levels in mail proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр proxy_protocol директивы listen не работал,[m
[31m-если не был указан в первой директиве listen для данного listen-сокета.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_protocol" parameter of the "listen" directive did not work[m
[31m-if not specified in the first "listen" directive for a listen socket.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.12" date="07.04.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива tcp_nodelay работает для SSL-соединений с бэкендами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "tcp_nodelay" directive works with backend SSL connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь потоки могут использоваться для чтения заголовков файлов в кэше.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now thread pools can be used to read cache file headers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_request_buffering.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_request_buffering" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании потоков на Linux[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when using thread pools on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при использовании директивы ssl_stapling.<br/>[m
[31m-Спасибо Filipe da Silva.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling when using the "ssl_stapling" directive.<br/>[m
[31m-Thanks to Filipe da Silva.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.11" date="24.03.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр sendfile директивы aio более не нужен;[m
[31m-теперь nginx автоматически использует AIO для подгрузки данных для sendfile,[m
[31m-если одновременно используются директивы aio и sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile" parameter of the "aio" directive is deprecated;[m
[31m-now nginx automatically uses AIO to pre-load data for sendfile[m
[31m-if both "aio" and "sendfile" directives are used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-экспериментальная поддержка потоков.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-experimental thread pools support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_request_buffering, fastcgi_request_buffering,[m
[31m-scgi_request_buffering и uwsgi_request_buffering.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_request_buffering", "fastcgi_request_buffering",[m
[31m-"scgi_request_buffering", and "uwsgi_request_buffering" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-экспериментальное API для обработки тела запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-request body filters experimental API.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-проверка клиентских SSL-сертификатов в почтовом прокси-сервере.<br/>[m
[31m-Спасибо Sven Peter, Franck Levionnois и Filipe Da Silva.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-client SSL certificates support in mail proxy.<br/>[m
[31m-Thanks to Sven Peter, Franck Levionnois, and Filipe Da Silva.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение времени запуска[m
[31m-при использовании директивы "hash ... consistent" в блоке upstream.<br/>[m
[31m-Спасибо Wai Keen Woon.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-startup speedup[m
[31m-when using the "hash ... consistent" directive in the upstream block.<br/>[m
[31m-Thanks to Wai Keen Woon.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-отладочное логгирование в кольцевой буфер в памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-debug logging into a cyclic memory buffer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке хэш-таблиц.<br/>[m
[31m-Спасибо Chris West.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in hash table handling.<br/>[m
[31m-Thanks to Chris West.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_cache_revalidate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_cache_revalidate" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL-соединения могли зависать, если использовался отложенный accept[m
[31m-или параметр proxy_protocol директивы listen.<br/>[m
[31m-Спасибо James Hamlin.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL connections might hang if deferred accept[m
[31m-or the "proxy_protocol" parameter of the "listen" directive were used.<br/>[m
[31m-Thanks to James Hamlin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_time могла содержать неверное значение[m
[31m-при использовании директивы image_filter.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_time variable might contain a wrong value[m
[31m-if the "image_filter" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке целочисленных переполнений.<br/>[m
[31m-Спасибо Régis Leroy.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in integer overflow handling.<br/>[m
[31m-Thanks to Régis Leroy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании LibreSSL было невозможно включить поддержку SSLv3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it was not possible to enable SSLv3 with LibreSSL.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании LibreSSL в логах появлялись сообщения[m
[31m-"ignoring stale global SSL error ... called a function you should not call".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ignoring stale global SSL error ... called a function you should not call"[m
[31m-alerts appeared in logs when using LibreSSL.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сертификаты, указанные в директивах ssl_client_certificate и[m
[31m-ssl_trusted_certificate, использовались[m
[31m-для автоматического построения цепочек сертификатов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-certificates specified by the "ssl_client_certificate" and[m
[31m-"ssl_trusted_certificate" directives were inadvertently used[m
[31m-to automatically construct certificate chains.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.10" date="10.02.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр use_temp_path директив proxy_cache_path, fastcgi_cache_path,[m
[31m-scgi_cache_path и uwsgi_cache_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "use_temp_path" parameter of the "proxy_cache_path", "fastcgi_cache_path",[m
[31m-"scgi_cache_path", and "uwsgi_cache_path" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_header_time.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_header_time variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-теперь при переполнении диска nginx пытается писать error_log'и только[m
[31m-раз в секунду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on disk overflow nginx tries to write error logs once a second only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files при тестировании каталогов[m
[31m-не игнорировала обычные файлы.<br/>[m
[31m-Спасибо Damien Tournoud.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive did not ignore normal files[m
[31m-while testing directories.<br/>[m
[31m-Thanks to Damien Tournoud.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы sendfile на OS X[m
[31m-возникали ошибки "sendfile() failed";[m
[31m-ошибка появилась в nginx 1.7.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "sendfile() failed"[m
[31m-if the "sendfile" directive was used on OS X;[m
[31m-the bug had appeared in 1.7.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в лог могли писаться сообщения "sem_post() failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "sem_post() failed" might appear in logs.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с musl libc.<br/>[m
[31m-Спасибо James Taylor.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with musl libc.<br/>[m
[31m-Thanks to James Taylor.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Tru64 UNIX.<br/>[m
[31m-Спасибо Goetz T. Fischer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Tru64 UNIX.<br/>[m
[31m-Thanks to Goetz T. Fischer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.9" date="23.12.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache, fastcgi_cache, scgi_cache и uwsgi_cache[m
[31m-поддерживают переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "proxy_cache", "fastcgi_cache", "scgi_cache",[m
[31m-and "uwsgi_cache" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива expires поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "expires" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-возможность загрузки секретных ключей с аппаратных устройств[m
[31m-с помощью OpenSSL engines.<br/>[m
[31m-Спасибо Дмитрию Пичулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-loading of secret keys from hardware tokens[m
[31m-with OpenSSL engines.<br/>[m
[31m-Thanks to Dmitrii Pichulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива autoindex_format.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "autoindex_format" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ревалидация элементов кэша теперь используется только для ответов[m
[31m-с кодами 200 и 206.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache revalidation is now only used for responses[m
[31m-with 200 and 206 status codes.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строка "TE" заголовка запроса клиента передавалась на бэкенд при проксировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "TE" client request header line was passed to backends while proxying.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass, fastcgi_pass, scgi_pass и uwsgi_pass[m
[31m-могли неправильно работать внутри блоков if и limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass", "fastcgi_pass", "scgi_pass", and "uwsgi_pass" directives[m
[31m-might not work correctly inside the "if" and "limit_except" blocks.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_store с параметром "on" игнорировалась,[m
[31m-если на предыдущем уровне использовалась директива proxy_store[m
[31m-с явно заданным путём к файлам.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store" directive with the "on" parameter was ignored[m
[31m-if the "proxy_store" directive with an explicitly specified file path[m
[31m-was used on a previous level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с BoringSSL.<br/>[m
[31m-Спасибо Lukas Tribus.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with BoringSSL.<br/>[m
[31m-Thanks to Lukas Tribus.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.8" date="02.12.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь строки "If-Modified-Since", "If-Range" и им подобные[m
[31m-в заголовке запроса клиента передаются бэкенду при включённом кэшировании,[m
[31m-если nginx заранее знает, что не будет кэшировать ответ[m
[31m-(например, при использовании proxy_cache_min_uses).[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "If-Modified-Since", "If-Range", etc.[m
[31m-client request header lines are passed to a backend while caching[m
[31m-if nginx knows in advance that the response will not be cached[m
[31m-(e.g., when using proxy_cache_min_uses).[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь после истечения proxy_cache_lock_timeout[m
[31m-nginx отправляет запрос на бэкенд без кэширования;[m
[31m-новые директивы proxy_cache_lock_age, fastcgi_cache_lock_age,[m
[31m-scgi_cache_lock_age и uwsgi_cache_lock_age позволяют указать,[m
[31m-через какое время блокировка будет принудительно снята[m
[31m-и будет сделана ещё одна попытка закэшировать ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now after proxy_cache_lock_timeout[m
[31m-nginx sends a request to a backend with caching disabled;[m
[31m-the new directives "proxy_cache_lock_age", "fastcgi_cache_lock_age",[m
[31m-"scgi_cache_lock_age", and "uwsgi_cache_lock_age" specify a time[m
[31m-after which the lock will be released[m
[31m-and another attempt to cache a response will be made.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива log_format теперь может использоваться только на уровне http.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_format" directive can now be used only at http level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ssl_certificate, proxy_ssl_certificate_key,[m
[31m-proxy_ssl_password_file, uwsgi_ssl_certificate,[m
[31m-uwsgi_ssl_certificate_key и uwsgi_ssl_password_file.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ssl_certificate", "proxy_ssl_certificate_key",[m
[31m-"proxy_ssl_password_file", "uwsgi_ssl_certificate",[m
[31m-"uwsgi_ssl_certificate_key", and "uwsgi_ssl_password_file" directives.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь с помощью X-Accel-Redirect[m
[31m-можно перейти в именованный location.<br/>[m
[31m-Спасибо Toshikuni Fukaya.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it is now possible to switch to a named location[m
[31m-using "X-Accel-Redirect".<br/>[m
[31m-Thanks to Toshikuni Fukaya.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива tcp_nodelay работает для SPDY-соединений.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "tcp_nodelay" directive works with SPDY connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новые директивы в скриптах подсветки синтаксиса для vim.<br/>[m
[31m-Спасибо Peter Wu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-new directives in vim syntax highliting scripts.<br/>[m
[31m-Thanks to Peter Wu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx игнорировал значение "s-maxage"[m
[31m-в строке "Cache-Control" в заголовке ответа бэкенда.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx ignored the "s-maxage" value[m
[31m-in the "Cache-Control" backend response header line.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве ssl_password_file[m
[31m-при использовании OpenSSL 0.9.8zc, 1.0.0o, 1.0.1j.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "ssl_password_file" directive[m
[31m-when using OpenSSL 0.9.8zc, 1.0.0o, 1.0.1j.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы post_action[m
[31m-в лог писались сообщения "header already sent";[m
[31m-ошибка появилась в nginx 1.5.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "header already sent" appeared in logs[m
[31m-if the "post_action" directive was used;[m
[31m-the bug had appeared in 1.5.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "postpone_output 0" с SSI-подзапросами[m
[31m-в лог могли писаться сообщения "the http output chain is empty".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "the http output chain is empty" might appear in logs[m
[31m-if the "postpone_output 0" directive was used with SSI includes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_cache_lock при использовании SSI-подзапросов.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_cache_lock" directive with SSI subrequests.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.7" date="28.10.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx учитывает при кэшировании строку "Vary"[m
[31m-в заголовке ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx takes into account the "Vary"[m
[31m-header line in a backend response while caching.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_force_ranges, fastcgi_force_ranges,[m
[31m-scgi_force_ranges и uwsgi_force_ranges.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_force_ranges", "fastcgi_force_ranges",[m
[31m-"scgi_force_ranges", and "uwsgi_force_ranges" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_limit_rate, fastcgi_limit_rate,[m
[31m-scgi_limit_rate и uwsgi_limit_rate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_limit_rate", "fastcgi_limit_rate",[m
[31m-"scgi_limit_rate", and "uwsgi_limit_rate" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр Vary директив proxy_ignore_headers, fastcgi_ignore_headers,[m
[31m-scgi_ignore_headers и uwsgi_ignore_headers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Vary" parameter of the "proxy_ignore_headers", "fastcgi_ignore_headers",[m
[31m-"scgi_ignore_headers", and "uwsgi_ignore_headers" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-последняя часть ответа, полученного от бэкенда[m
[31m-при небуферизированном проксировании,[m
[31m-могла не отправляться клиенту,[m
[31m-если использовались директивы gzip или gunzip.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the last part of a response received from a backend[m
[31m-with unbufferred proxy[m
[31m-might not be sent to a client[m
[31m-if "gzip" or "gunzip" directives were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_cache_revalidate.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_cache_revalidate" directive.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок.<br/>[m
[31m-Спасибо Yichun Zhang и Даниилу Бондареву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling.<br/>[m
[31m-Thanks to Yichun Zhang and Daniil Bondarev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах[m
[31m-proxy_next_upstream_tries и proxy_next_upstream_timeout.<br/>[m
[31m-Спасибо Feng Gu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_next_upstream_tries" and "proxy_next_upstream_timeout"[m
[31m-directives.<br/>[m
[31m-Thanks to Feng Gu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не собирался с MinGW-w64 gcc.<br/>[m
[31m-Спасибо Kouhei Sutou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not be built with MinGW-w64 gcc.<br/>[m
[31m-Thanks to Kouhei Sutou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.6" date="30.09.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-устаревшая директива limit_zone больше не поддерживается.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the deprecated "limit_zone" directive is not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в директивах limit_conn_zone и limit_req_zone теперь можно использовать[m
[31m-комбинации нескольких переменных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_conn_zone" and "limit_req_zone" directives now can be used[m
[31m-with combinations of multiple variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при повторной отправке FastCGI-запроса на бэкенд[m
[31m-тело запроса могло передаваться неправильно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-request body might be transmitted incorrectly[m
[31m-when retrying a FastCGI request to the next upstream server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в логгировании в syslog.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in logging to syslog.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.5" date="16.09.2014">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании общего для нескольких блоков server[m
[31m-разделяемого кэша SSL-сессий или общего ключа для шифрования[m
[31m-TLS session tickets было возможно повторно использовать[m
[31m-SSL-сессию в контексте другого блока server (CVE-2014-3616).<br/>[m
[31m-Спасибо Antoine Delignat-Lavaud.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it was possible to reuse SSL sessions in unrelated contexts[m
[31m-if a shared SSL session cache or the same TLS session ticket key[m
[31m-was used for multiple "server" blocks (CVE-2014-3616).<br/>[m
[31m-Thanks to Antoine Delignat-Lavaud.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директиву stub_status теперь можно указывать без параметров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "stub_status" directive does not require a parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр always директивы add_header.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "always" parameter of the "add_header" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы[m
[31m-proxy_next_upstream_tries, proxy_next_upstream_timeout,[m
[31m-fastcgi_next_upstream_tries, fastcgi_next_upstream_timeout,[m
[31m-memcached_next_upstream_tries, memcached_next_upstream_timeout,[m
[31m-scgi_next_upstream_tries, scgi_next_upstream_timeout,[m
[31m-uwsgi_next_upstream_tries и uwsgi_next_upstream_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the[m
[31m-"proxy_next_upstream_tries", "proxy_next_upstream_timeout",[m
[31m-"fastcgi_next_upstream_tries", "fastcgi_next_upstream_timeout",[m
[31m-"memcached_next_upstream_tries", "memcached_next_upstream_timeout",[m
[31m-"scgi_next_upstream_tries", "scgi_next_upstream_timeout",[m
[31m-"uwsgi_next_upstream_tries", and "uwsgi_next_upstream_timeout"[m
[31m-directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в параметре if директивы access_log.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "if" parameter of the "access_log" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_perl_module.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_perl_module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива listen почтового прокси-сервера[m
[31m-не позволяла указать более двух параметров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive of the mail proxy module[m
[31m-did not allow to specify more than two parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива sub_filter не работала[m
[31m-с заменяемой строкой из одного символа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sub_filter" directive did not work[m
[31m-with a string to replace consisting of a single character.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-запросы могли зависать, если использовался resolver[m
[31m-и в процессе обращения к DNS-серверу происходил таймаут.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-requests might hang if resolver was used[m
[31m-and a timeout occurred during a DNS request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module при использовании совместно с AIO.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module when using with AIO.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если с помощью директивы set изменялись переменные[m
[31m-"$http_...", "$sent_http_..." или "$upstream_http_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "set" directive was used to change the "$http_...",[m
[31m-"$sent_http_...", or "$upstream_http_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок выделения памяти.<br/>[m
[31m-Спасибо Markus Linnala и Feng Gu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation error handling.<br/>[m
[31m-Thanks to Markus Linnala and Feng Gu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.4" date="05.08.2014">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-pipelined-команды не отбрасывались[m
[31m-после команды STARTTLS в SMTP прокси-сервере (CVE-2014-3556);[m
[31m-ошибка появилась в 1.5.6.<br/>[m
[31m-Спасибо Chris Boulton.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-pipelined commands were not discarded[m
[31m-after STARTTLS command in SMTP proxy (CVE-2014-3556);[m
[31m-the bug had appeared in 1.5.6.<br/>[m
[31m-Thanks to Chris Boulton.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-экранирование символов в URI теперь использует[m
[31m-шестнадцатеричные цифры в верхнем регистре.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-URI escaping now uses[m
[31m-uppercase hexadecimal digits.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx можно собрать с BoringSSL и LibreSSL.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx can be build with BoringSSL and LibreSSL.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-запросы могли зависать, если использовался resolver[m
[31m-и DNS-сервер возвращал некорректный ответ;[m
[31m-ошибка появилась в 1.5.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-requests might hang if resolver was used[m
[31m-and a DNS server returned a malformed response;[m
[31m-the bug had appeared in 1.5.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $uri могла содержать мусор[m
[31m-при возврате ошибок с кодом 400.<br/>[m
[31m-Спасибо Сергею Боброву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $uri variable might contain garbage[m
[31m-when returning errors with code 400.<br/>[m
[31m-Thanks to Sergey Bobrov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок в директиве proxy_store[m
[31m-и в модуле ngx_http_dav_module.<br/>[m
[31m-Спасибо Feng Gu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling in the "proxy_store" directive[m
[31m-and the ngx_http_dav_module.<br/>[m
[31m-Thanks to Feng Gu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при логгировании ошибок в syslog мог происходить segmentation fault;[m
[31m-ошибка появилась в 1.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if logging of errors to syslog was used;[m
[31m-the bug had appeared in 1.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные $geoip_latitude, $geoip_longitude, $geoip_dma_code[m
[31m-и $geoip_area_code могли не работать.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $geoip_latitude, $geoip_longitude, $geoip_dma_code,[m
[31m-and $geoip_area_code variables might not work.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок выделения памяти.<br/>[m
[31m-Спасибо Tatsuhiko Kubo и Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation error handling.<br/>[m
[31m-Thanks to Tatsuhiko Kubo and Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.3" date="08.07.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-weak entity tags теперь не удаляются при изменениях ответа,[m
[31m-а strong entity tags преобразуются в weak.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-weak entity tags are now preserved on response modifications,[m
[31m-and strong ones are changed to weak.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ревалидация элементов кэша теперь, если это возможно,[m
[31m-использует заголовок If-None-Match.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache revalidation now uses If-None-Match header[m
[31m-if possible.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_password_file.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_password_file" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при возврате ответа из кэша[m
[31m-заголовок запроса If-None-Match игнорировался,[m
[31m-если в ответе не было заголовка Last-Modified.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the If-None-Match request header line was ignored[m
[31m-if there was no Last-Modified header[m
[31m-in a response returned from cache.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "peer closed connection in SSL handshake"[m
[31m-при соединении с бэкендами логгировались на уровне info вместо error.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"peer closed connection in SSL handshake" messages[m
[31m-were logged at "info" level instead of "error" while connecting to backends.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_dav_module в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_dav_module module in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SPDY-соединения могли неожиданно закрываться,[m
[31m-если использовалось кэширование.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SPDY connections might be closed prematurely[m
[31m-if caching was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.2" date="17.06.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива hash в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "hash" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-дефрагментация свободных блоков разделяемой памяти.<br/>[m
[31m-Спасибо Wandenberg Peixoto и Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-defragmentation of free shared memory blocks.<br/>[m
[31m-Thanks to Wandenberg Peixoto and Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалось значение access_log по умолчанию;[m
[31m-ошибка появилась в 1.7.0.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the default value of the "access_log" directive was used;[m
[31m-the bug had appeared in 1.7.0.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-завершающий слэш ошибочно удалялся[m
[31m-из последнего параметра директивы try_files.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-trailing slash was mistakenly removed[m
[31m-from the last parameter of the "try_files" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не собираться на OS X.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OS X in some cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.1" date="27.05.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$upstream_cookie_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$upstream_cookie_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_client_fingerprint.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_fingerprint variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы error_log и access_log теперь поддерживают логгирование в syslog.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_log" and "access_log" directives now support logging to syslog.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер теперь логгирует порт клиента при соединении.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy now logs client port on connect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при использовании директивы "ssl_stapling".<br/>[m
[31m-Спасибо Filipe da Silva.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak if the "ssl_stapling" directive was used.<br/>[m
[31m-Thanks to Filipe da Silva.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива alias внутри location'а, заданного регулярным выражением,[m
[31m-работала неправильно, если использовались директивы if или limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "alias" directive used inside a location given by a regular expression[m
[31m-worked incorrectly if the "if" or "limit_except" directives were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива charset не ставила кодировку для сжатых ответов бэкендов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "charset" directive did not set a charset to encoded backend responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass без URI могла использовать оригинальный запрос[m
[31m-после установки переменной $args.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part might use original request[m
[31m-after the $args variable was set.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в работе параметра none директивы smtp_auth;[m
[31m-ошибка появилась в 1.5.6.<br/>[m
[31m-Спасибо Святославу Никольскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "none" parameter in the "smtp_auth" directive;[m
[31m-the bug had appeared in 1.5.6.<br/>[m
[31m-Thanks to Svyatoslav Nikolsky.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при совместном использовании sub_filter и SSI[m
[31m-ответы могли передаваться неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if sub_filter and SSI were used together,[m
[31m-then responses might be transferred incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --with-file-aio на Linux/aarch64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the --with-file-aio option on Linux/aarch64.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.0" date="24.04.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-проверка SSL-сертификатов бэкендов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-backend SSL certificate verification.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка SNI при работе с бэкендами по SSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support for SNI while working with SSL backends.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_server_name.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_server_name variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр if директивы access_log.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" parameter of the "access_log" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.13" date="08.04.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-улучшена обработка хэш-таблиц;[m
[31m-в директивах variables_hash_max_size и types_hash_bucket_size[m
[31m-значения по умолчанию изменены на 1024 и 64 соответственно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-improved hash table handling;[m
[31m-the default values of the "variables_hash_max_size" and[m
[31m-"types_hash_bucket_size" were changed to 1024 and 64 respectively.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module теперь понимает аргумент end.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_mp4_module now supports the "end" argument.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка byte ranges модулем ngx_http_mp4_module и при сохранении[m
[31m-ответов в кэш.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-byte ranges support in the ngx_http_mp4_module and while saving responses[m
[31m-to cache.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx не пишет в лог сообщения "ngx_slab_alloc() failed: no memory"[m
[31m-при использовании разделяемой памяти в ssl_session_cache[m
[31m-и в модуле ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "ngx_slab_alloc() failed: no memory" no longer logged[m
[31m-when using shared memory in the "ssl_session_cache" directive[m
[31m-and in the ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива underscores_in_headers[m
[31m-не разрешала подчёркивание в первом символе заголовка.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "underscores_in_headers" directive[m
[31m-did not allow underscore as a first character of a header.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-cache manager мог нагружать процессор при выходе в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache manager might hog CPU on exit in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании ssl_session_cache с параметром shared[m
[31m-рабочий процесс nginx/Windows завершался аварийно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows terminated abnormally[m
[31m-if the "ssl_session_cache" directive was used with the "shared" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.12" date="18.03.2014">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного запроса модулем ngx_http_spdy_module[m
[31m-могло происходить переполнение буфера в рабочем процессе,[m
[31m-что потенциально могло приводить к выполнению произвольного кода[m
[31m-(CVE-2014-0133).<br/>[m
[31m-Спасибо Lucas Molas из Programa STIC, Fundación Dr. Manuel[m
[31m-Sadosky, Buenos Aires, Argentina.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a heap memory buffer overflow might occur in a worker process[m
[31m-while handling a specially crafted request by ngx_http_spdy_module,[m
[31m-potentially resulting in arbitrary code execution[m
[31m-(CVE-2014-0133).<br/>[m
[31m-Thanks to Lucas Molas, researcher at Programa STIC, Fundación Dr. Manuel[m
[31m-Sadosky, Buenos Aires, Argentina.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр proxy_protocol в директивах listen и real_ip_header,[m
[31m-переменная $proxy_protocol_addr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_protocol" parameters of the "listen" and "real_ip_header" directives,[m
[31m-the $proxy_protocol_addr variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве fastcgi_next_upstream.<br/>[m
[31m-Спасибо Lucas Molas.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "fastcgi_next_upstream" directive.<br/>[m
[31m-Thanks to Lucas Molas.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.11" date="04.03.2014">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного запроса модулем ngx_http_spdy_module[m
[31m-на 32-битных платформах могла повреждаться память рабочего процесса,[m
[31m-что потенциально могло приводить к выполнению произвольного кода[m
[31m-(CVE-2014-0088);[m
[31m-ошибка появилась в 1.5.10.<br/>[m
[31m-Спасибо Lucas Molas из Programa STIC, Fundación Dr. Manuel[m
[31m-Sadosky, Buenos Aires, Argentina.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory corruption might occur in a worker process on 32-bit platforms[m
[31m-while handling a specially crafted request by ngx_http_spdy_module,[m
[31m-potentially resulting in arbitrary code execution (CVE-2014-0088);[m
[31m-the bug had appeared in 1.5.10.<br/>[m
[31m-Thanks to Lucas Molas, researcher at Programa STIC, Fundación Dr. Manuel[m
[31m-Sadosky, Buenos Aires, Argentina.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_session_reused.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_session_reused variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива client_max_body_size могла не работать[m
[31m-при чтении тела запроса с использованием chunked transfer encoding;[m
[31m-ошибка появилась в 1.3.9.<br/>[m
[31m-Спасибо Lucas Molas.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "client_max_body_size" directive might not work[m
[31m-when reading a request body using chunked transfer encoding;[m
[31m-the bug had appeared in 1.3.9.<br/>[m
[31m-Thanks to Lucas Molas.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании WebSocket-соединений[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when proxying WebSocket connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_spdy_module на 32-битных платформах;[m
[31m-ошибка появилась в 1.5.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_spdy_module was used on 32-bit platforms;[m
[31m-the bug had appeared in 1.5.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-значение переменной $upstream_status могло быть неверным,[m
[31m-если использовались директивы proxy_cache_use_stale[m
[31m-или proxy_cache_revalidate.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_status variable might contain wrong data[m
[31m-if the "proxy_cache_use_stale" or "proxy_cache_revalidate" directives[m
[31m-were used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если ошибки с кодом 400 с помощью директивы error_page[m
[31m-перенаправлялись в именованный location.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if errors with code 400 were redirected to a named location[m
[31m-using the "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не собирался с Visual Studio 2013.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not be built with Visual Studio 2013.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.10" date="04.02.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_spdy_module теперь использует протокол SPDY 3.1.<br/>[m
[31m-Спасибо Automattic и MaxCDN за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_spdy_module now uses SPDY 3.1 protocol.<br/>[m
[31m-Thanks to Automattic and MaxCDN for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module теперь пропускает дорожки,[m
[31m-имеющие меньшую длину, чем запрошенная перемотка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_mp4_module now skips tracks[m
[31m-too short for a seek requested.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если переменная $ssl_session_id использовалась при логгировании;[m
[31m-ошибка появилась в 1.5.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the $ssl_session_id variable was used in logs;[m
[31m-the bug had appeared in 1.5.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные $date_local и $date_gmt использовали неверный формат[m
[31m-вне модуля ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $date_local and $date_gmt variables used wrong format[m
[31m-outside of the ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-клиентские соединения могли сразу закрываться,[m
[31m-если использовался отложенный accept;[m
[31m-ошибка появилась в 1.3.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-client connections might be immediately closed[m
[31m-if deferred accept was used;[m
[31m-the bug had appeared in 1.3.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "getsockopt(TCP_FASTOPEN) ... failed" записывались в лог[m
[31m-в процессе обновления исполняемого файла на Linux;[m
[31m-ошибка появилась в 1.5.8.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "getsockopt(TCP_FASTOPEN) ... failed" appeared in logs[m
[31m-during binary upgrade on Linux;[m
[31m-the bug had appeared in 1.5.8.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.9" date="22.01.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь в заголовке X-Accel-Redirect nginx ожидает закодированный URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx expects escaped URIs in "X-Accel-Redirect" headers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_buffer_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_buffer_size" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву limit_rate теперь можно использовать для[m
[31m-ограничения скорости передачи ответов клиенту в SPDY-соединениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive can now be used to[m
[31m-rate limit responses sent in SPDY connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива spdy_chunk_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "spdy_chunk_size" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_session_tickets.<br/>[m
[31m-Спасибо Dirkjan Bussink.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_tickets" directive.<br/>[m
[31m-Thanks to Dirkjan Bussink.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_session_id содержала всю сессию в сериализованном виде[m
[31m-вместо её идентификатора.<br/>[m
[31m-Спасибо Ivan Ristić.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_session_id variable contained full session serialized[m
[31m-instead of just a session id.<br/>[m
[31m-Thanks to Ivan Ristić.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неправильно обрабатывал закодированный символ "?" в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx incorrectly handled escaped "?" character in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module не раскодировал целевой URI при[m
[31m-обработке методов COPY и MOVE.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module did not unescape destination URI[m
[31m-of the COPY and MOVE methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-resolver не понимал доменные имена с точкой в конце.[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-resolver did not understand domain names with a trailing dot.[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании в логах могли появляться сообщения "zero size buf in output";[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "zero size buf in output" might appear in logs while proxying;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_spdy_module was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании методов обработки соединений select, poll и /dev/poll[m
[31m-проксируемые WebSocket-соединения могли зависать сразу после открытия.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxied WebSocket connections might hang right after handshake[m
[31m-if the select, poll, or /dev/poll methods were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива xclient почтового прокси-сервера[m
[31m-некорректно передавала IPv6-адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "xclient" directive of the mail proxy module[m
[31m-incorrectly handled IPv6 client addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.8" date="17.12.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь resolver поддерживает IPv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-IPv6 support in resolver.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen поддерживает параметр fastopen.<br/>[m
[31m-Спасибо Mathew Rodley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive supports the "fastopen" parameter.<br/>[m
[31m-Thanks to Mathew Rodley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка SSL в модуле ngx_http_uwsgi_module.<br/>[m
[31m-Спасибо Roberto De Ioris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL support in the ngx_http_uwsgi_module.<br/>[m
[31m-Thanks to Roberto De Ioris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-скрипты подсветки синтаксиса для vim добавлены в contrib.<br/>[m
[31m-Спасибо Evan Miller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-vim syntax highlighting scripts were added to contrib.<br/>[m
[31m-Thanks to Evan Miller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при чтении тела запроса с использованием chunked transfer encoding[m
[31m-по SSL-соединению мог произойти таймаут.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a timeout might occur while reading client request body[m
[31m-in an SSL connection using chunked transfer encoding.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива master_process работала неправильно в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "master_process" directive did not work correctly in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр setfib директивы listen мог не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "setfib" parameter of the "listen" directive might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.7" date="19.11.2013">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-символ, следующий за незакодированным пробелом в строке запроса,[m
[31m-обрабатывался неправильно (CVE-2013-4547);[m
[31m-ошибка появилась в 0.8.41.<br/>[m
[31m-Спасибо Ivan Fratric из Google Security Team.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a character following an unescaped space in a request line[m
[31m-was handled incorrectly (CVE-2013-4547);[m
[31m-the bug had appeared in 0.8.41.<br/>[m
[31m-Thanks to Ivan Fratric of the Google Security Team.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-уровень логгирования ошибок auth_basic об отсутствии пароля[m
[31m-понижен с уровня error до info.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a logging level of auth_basic errors about no user/password provided[m
[31m-has been lowered from "error" to "info".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache_revalidate, fastcgi_cache_revalidate,[m
[31m-scgi_cache_revalidate и uwsgi_cache_revalidate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_revalidate", "fastcgi_cache_revalidate",[m
[31m-"scgi_cache_revalidate", and "uwsgi_cache_revalidate" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_session_ticket_key.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_ticket_key" directive.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "add_header Cache-Control ''"[m
[31m-добавляла строку заголовка ответа "Cache-Control" с пустым значением.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the directive "add_header Cache-Control ''"[m
[31m-added a "Cache-Control" response header line with an empty value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "satisfy any" могла вернуть ошибку 403 вместо 401[m
[31m-при использовании директив auth_request и auth_basic.<br/>[m
[31m-Спасибо Jan Marc Hoffmann.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "satisfy any" directive might return 403 error instead of 401[m
[31m-if auth_request and auth_basic directives were used.<br/>[m
[31m-Thanks to Jan Marc Hoffmann.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры accept_filter и deferred директивы listen игнорировались[m
[31m-для listen-сокетов, создаваемых в процессе обновления исполняемого файла.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "accept_filter" and "deferred" parameters of the "listen" directive[m
[31m-were ignored for listen sockets created during binary upgrade.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-часть данных, полученных от бэкенда при небуферизированном проксировании,[m
[31m-могла не отправляться клиенту сразу,[m
[31m-если использовались директивы gzip или gunzip.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some data received from a backend with unbufferred proxy[m
[31m-might not be sent to a client immediately[m
[31m-if "gzip" or "gunzip" directives were used.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок в модуле ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling in ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы могли зависать,[m
[31m-если использовался модуль ngx_http_spdy_module[m
[31m-и директива auth_request.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-responses might hang[m
[31m-if the ngx_http_spdy_module was used[m
[31m-with the "auth_request" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.6" date="01.10.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_buffering.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_buffering" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ssl_protocols и proxy_ssl_ciphers.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ssl_protocols" and "proxy_ssl_ciphers" directives.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-оптимизация SSL handshake при использовании длинных цепочек сертификатов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-optimization of SSL handshakes when using long certificate chains.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер поддерживает SMTP pipelining.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy supports SMTP pipelining.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_auth_basic_module[m
[31m-при использовании метода шифрования паролей "$apr1$".<br/>[m
[31m-Спасибо Markus Linnala.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_auth_basic_module[m
[31m-when using "$apr1$" password encryption method.<br/>[m
[31m-Thanks to Markus Linnala.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на MacOSX, Cygwin и nginx/Windows[m
[31m-для обработки запроса мог использоваться неверный location,[m
[31m-если для задания location'ов использовались символы разных регистров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in MacOSX, Cygwin, and nginx/Windows[m
[31m-incorrect location might be used to process a request[m
[31m-if locations were given using characters in different cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-автоматическое перенаправление с добавлением завершающего слэша[m
[31m-для проксированных location'ов могло не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-automatic redirect with appended trailing slash[m
[31m-for proxied locations might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в почтовом прокси-сервере.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the mail proxy server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.5" date="17.09.2013">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx по умолчанию использует HTTP/1.0,[m
[31m-если точно определить протокол не удалось.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx assumes HTTP/1.0 by default[m
[31m-if it is not able to detect protocol reliably.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива disable_symlinks теперь использует O_PATH на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "disable_symlinks" directive now uses O_PATH on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-для определения того, что клиент закрыл соединение,[m
[31m-при использовании метода epoll[m
[31m-теперь используются события EPOLLRDHUP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses EPOLLRDHUP events[m
[31m-to detect premature connection close by clients[m
[31m-if the "epoll" method is used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве valid_referers при использовании параметра server_names.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "valid_referers" directive if the "server_names" parameter was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $request_time не работала в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_time variable did not work in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве image_filter.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "image_filter" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL 1.0.1f.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL 1.0.1f compatibility.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.4" date="27.08.2013">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-MIME-тип для расширения js изменён на "application/javascript";[m
[31m-значение по умолчанию директивы charset_types изменено соответственно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "js" extension MIME type has been changed to "application/javascript";[m
[31m-default value of the "charset_types" directive was changed accordingly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива image_filter с параметром size[m
[31m-возвращает ответ с MIME-типом "application/json".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "image_filter" directive with the "size" parameter[m
[31m-returns responses with the "application/json" MIME type.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_auth_request_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_auth_request_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на старте или во время переконфигурации мог произойти segmentation fault,[m
[31m-если использовалась директива try_files с пустым параметром.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur on start or during reconfiguration[m
[31m-if the "try_files" directive was used with an empty parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при использовании в директивах root и auth_basic_user_file[m
[31m-относительных путей, заданных с помощью переменных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak if relative paths were specified using variables[m
[31m-in the "root" or "auth_basic_user_file" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива valid_referers неправильно выполняла регулярные выражения,[m
[31m-если заголовок Referer начинался с "https://".<br/>[m
[31m-Спасибо Liangbin Li.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid_referers" directive incorrectly executed regular expressions[m
[31m-if a "Referer" header started with "https://".<br/>[m
[31m-Thanks to Liangbin Li.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы могли зависать, если использовались подзапросы и при обработке подзапроса[m
[31m-происходила ошибка во время SSL handshake с бэкендом.<br/>[m
[31m-Спасибо Aviram Cohen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-responses might hang if subrequests were used[m
[31m-and an SSL handshake error happened during subrequest processing.<br/>[m
[31m-Thanks to Aviram Cohen.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.3" date="30.07.2013">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменение во внутреннем API:[m
[31m-теперь при небуферизированной работе с бэкендами[m
[31m-u->length по умолчанию устанавливается в -1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Change in internal API:[m
[31m-now u->length defaults to -1[m
[31m-if working with backends in unbuffered mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при получении неполного ответа от бэкенда[m
[31m-nginx отправляет полученную часть ответа,[m
[31m-после чего закрывает соединение с клиентом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now after receiving an incomplete response from a backend server[m
[31m-nginx tries to send an available part of the response to a client,[m
[31m-and then closes client connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_spdy_module[m
[31m-и директива client_body_in_file_only.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_spdy_module was used[m
[31m-with the "client_body_in_file_only" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр so_keepalive директивы listen[m
[31m-мог работать некорректно на DragonFlyBSD.<br/>[m
[31m-Спасибо Sepherosa Ziehau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "so_keepalive" parameter of the "listen" directive[m
[31m-might be handled incorrectly on DragonFlyBSD.<br/>[m
[31m-Thanks to Sepherosa Ziehau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_xslt_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_xslt_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.2" date="02.07.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно использовать несколько директив error_log.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now several "error_log" directives can be used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод $r->header_in() встроенного перла не возвращал значения строк[m
[31m-"Cookie" и "X-Forwarded-For" из заголовка запроса;[m
[31m-ошибка появилась в 1.3.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->header_in() embedded perl method did not return value of the[m
[31m-"Cookie" and "X-Forwarded-For" request header lines;[m
[31m-the bug had appeared in 1.3.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.<br/>[m
[31m-Спасибо Jim Radford.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.<br/>[m
[31m-Thanks to Jim Radford.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux при использовании x32 ABI.<br/>[m
[31m-Спасибо Сергею Иванцову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux with x32 ABI.<br/>[m
[31m-Thanks to Serguei Ivantsov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.1" date="04.06.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssi_last_modified, sub_filter_last_modified и[m
[31m-xslt_last_modified.<br/>[m
[31m-Спасибо Алексею Колпакову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi_last_modified", "sub_filter_last_modified", and[m
[31m-"xslt_last_modified" directives.<br/>[m
[31m-Thanks to Alexey Kolpakov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр http_403 в директивах proxy_next_upstream, fastcgi_next_upstream,[m
[31m-scgi_next_upstream и uwsgi_next_upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "http_403" parameter of the "proxy_next_upstream", "fastcgi_next_upstream",[m
[31m-"scgi_next_upstream", and "uwsgi_next_upstream" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы allow и deny теперь поддерживают unix domain сокеты.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "allow" and "deny" directives now support unix domain sockets.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с модулем ngx_mail_ssl_module,[m
[31m-но без модуля ngx_http_ssl_module;[m
[31m-ошибка появилась в 1.3.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the ngx_mail_ssl_module,[m
[31m-but without ngx_http_ssl_module;[m
[31m-the bug had appeared in 1.3.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_set_body.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_set_body" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве lingering_time.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "lingering_time" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр fail_timeout директивы server[m
[31m-в блоке upstream мог не работать,[m
[31m-если использовался параметр max_fails;[m
[31m-ошибка появилась в 1.3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fail_timeout" parameter of the "server" directive[m
[31m-in the "upstream" context might not work[m
[31m-if "max_fails" parameter was used;[m
[31m-the bug had appeared in 1.3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива ssl_stapling.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "ssl_stapling" directive was used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в почтовом прокси-сервере.<br/>[m
[31m-Спасибо Filipe Da Silva.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the mail proxy server.<br/>[m
[31m-Thanks to Filipe Da Silva.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог перестать принимать соединения,[m
[31m-если использовалось несколько рабочих процессов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might stop accepting connections[m
[31m-if several worker processes were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.0" date="07.05.2013">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного запроса[m
[31m-мог перезаписываться стек рабочего процесса,[m
[31m-что могло приводить к выполнению произвольного кода (CVE-2013-2028);[m
[31m-ошибка появилась в 1.3.9.<br/>[m
[31m-Спасибо Greg MacManus, iSIGHT Partners Labs.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a stack-based buffer overflow might occur in a worker process[m
[31m-while handling a specially crafted request,[m
[31m-potentially resulting in arbitrary code execution (CVE-2013-2028);[m
[31m-the bug had appeared in 1.3.9.<br/>[m
[31m-Thanks to Greg MacManus, iSIGHT Partners Labs.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.4.0" date="24.04.2013">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с модулем ngx_http_perl_module,[m
[31m-если использовался параметр --with-openssl;[m
[31m-ошибка появилась в 1.3.16.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the ngx_http_perl_module[m
[31m-if the --with-openssl option was used;[m
[31m-the bug had appeared in 1.3.16.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в работе с телом запроса из модуля ngx_http_perl_module;[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a request body handling in the ngx_http_perl_module;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.16" date="16.04.2013">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовались подзапросы;[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if subrequests were used;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива tcp_nodelay вызывала ошибку[m
[31m-при проксировании WebSocket-соединений в unix domain сокет.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "tcp_nodelay" directive caused an error[m
[31m-if a WebSocket connection was proxied into a unix domain socket.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_length возвращала значение "0",[m
[31m-если не использовалась буферизация.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_length variable has an incorrect value "0"[m
[31m-if buffering was not used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в методах обработки соединений eventport и /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the eventport and /dev/poll methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.15" date="26.03.2013">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-открытие и закрытие соединения без отправки в нём каких-либо данных[m
[31m-больше не записывается в access_log с кодом ошибки 400.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-opening and closing a connection without sending any data in it[m
[31m-is no longer logged to access_log with error code 400.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_spdy_module.<br/>[m
[31m-Спасибо Automattic за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_spdy_module.<br/>[m
[31m-Thanks to Automattic for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы limit_req_status и limit_conn_status.<br/>[m
[31m-Спасибо Nick Marden.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_req_status" and "limit_conn_status" directives.<br/>[m
[31m-Thanks to Nick Marden.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_interlace.<br/>[m
[31m-Спасибо Ивану Боброву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_interlace" directive.<br/>[m
[31m-Thanks to Ian Babrou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $connections_waiting в модуле ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$connections_waiting variable in the ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь почтовый прокси-сервер поддерживает IPv6-бэкенды.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy module now supports IPv6 backends.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при повторной отправке запроса на бэкенд[m
[31m-тело запроса могло передаваться неправильно;[m
[31m-ошибка появилась в 1.3.9.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-request body might be transmitted incorrectly[m
[31m-when retrying a request to the next upstream server;[m
[31m-the bug had appeared in 1.3.9.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве client_body_in_file_only;[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "client_body_in_file_only" directive;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы могли зависать,[m
[31m-если использовались подзапросы[m
[31m-и при обработке подзапроса происходила DNS-ошибка.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-responses might hang[m
[31m-if subrequests were used[m
[31m-and a DNS error happened during subrequest processing.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в процедуре учёта использования бэкендов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in backend usage accounting.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.14" date="05.03.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $connections_active, $connections_reading и $connections_writing[m
[31m-в модуле ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$connections_active, $connections_reading, and $connections_writing variables[m
[31m-in the ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка WebSocket-соединений[m
[31m-в модулях ngx_http_uwsgi_module и ngx_http_scgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support of WebSocket connections[m
[31m-in the ngx_http_uwsgi_module and ngx_http_scgi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке виртуальных серверов при использовании SNI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in virtual servers handling with SNI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "ssl_session_cache shared"[m
[31m-новые сессии могли не сохраняться,[m
[31m-если заканчивалось место в разделяемой памяти.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-new sessions were not always stored[m
[31m-if the "ssl_session_cache shared" directive was used[m
[31m-and there was no free space in shared memory.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-несколько заголовков X-Forwarded-For обрабатывались неправильно.<br/>[m
[31m-Спасибо Neal Poole за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-multiple X-Forwarded-For headers were handled incorrectly.<br/>[m
[31m-Thanks to Neal Poole for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.<br/>[m
[31m-Спасибо Gernot Vormayr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.<br/>[m
[31m-Thanks to Gernot Vormayr.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.13" date="19.02.2013">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь для сборки по умолчанию используется компилятор с именем "cc".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a compiler with name "cc" is now used by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка проксирования WebSocket-соединений.<br/>[m
[31m-Спасибо Apcera и CloudBees за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support for proxying of WebSocket connections.<br/>[m
[31m-Thanks to Apcera and CloudBees for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic_user_file поддерживает шифрование паролей[m
[31m-методом "{SHA}".<br/>[m
[31m-Спасибо Louis Opter.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_basic_user_file" directive supports "{SHA}"[m
[31m-password encryption method.<br/>[m
[31m-Thanks to Louis Opter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.12" date="05.02.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_bind, fastcgi_bind, memcached_bind, scgi_bind и uwsgi_bind[m
[31m-поддерживают переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "proxy_bind", "fastcgi_bind", "memcached_bind",[m
[31m-"scgi_bind", and "uwsgi_bind" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $pipe, $request_length, $time_iso8601 и $time_local[m
[31m-теперь можно использовать не только в директиве log_format.<br/>[m
[31m-Спасибо Kiril Kalchev.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $pipe, $request_length, $time_iso8601, and $time_local variables[m
[31m-can now be used not only in the "log_format" directive.[m
[31m-Thanks to Kiril Kalchev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка IPv6 в модуле ngx_http_geoip_module.<br/>[m
[31m-Спасибо Gregor Kališnik.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-IPv6 support in the ngx_http_geoip_module.<br/>[m
[31m-Thanks to Gregor Kališnik.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_method работала неверно, если была указана на уровне http.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_method" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался resolver и метод poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if resolver was used with the poll method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог нагружать процессор во время SSL handshake с бэкендом[m
[31m-при использовании методов обработки соединений select, poll и /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might hog CPU during SSL handshake with a backend[m
[31m-if the select, poll, or /dev/poll methods were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка "[crit] SSL_write() failed (SSL:)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[crit] SSL_write() failed (SSL:)" error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве client_body_in_file_only;[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "client_body_in_file_only" directive;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве fastcgi_keep_conn.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "fastcgi_keep_conn" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.11" date="10.01.2013">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при записи в лог мог происходить segmentation fault;[m
[31m-ошибка появилась в 1.3.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if logging was used;[m
[31m-the bug had appeared in 1.3.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass не работала с IP-адресами[m
[31m-без явного указания порта;[m
[31m-ошибка появилась в 1.3.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" directive did not work with IP addresses[m
[31m-without port specified;[m
[31m-the bug had appeared in 1.3.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на старте или во время переконфигурации происходил segmentation fault,[m
[31m-если директива keepalive была указана несколько раз[m
[31m-в одном блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred on start or during reconfiguration[m
[31m-if the "keepalive" directive was specified more than once[m
[31m-in a single upstream block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр default директивы geo не определял значение по умолчанию[m
[31m-для IPv6-адресов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-parameter "default" of the "geo" directive did not set default value[m
[31m-for IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.10" date="25.12.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-для указанных в конфигурационном файле доменных имён теперь[m
[31m-используются не только IPv4, но и IPv6 адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-domain names specified in configuration file[m
[31m-are now resolved to IPv6 addresses as well as IPv4 ones.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании директивы include с маской на Unix-системах[m
[31m-включаемые файлы сортируются в алфавитном порядке.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if the "include" directive with mask is used on Unix systems,[m
[31m-included files are sorted in alphabetical order.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива add_header добавляет строки в ответы с кодом 201.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header" directive adds headers to 201 responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива geo теперь поддерживает IPv6 адреса в формате CIDR.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "geo" directive now supports IPv6 addresses in CIDR notation.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры flush и gzip в директиве access_log.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "flush" and "gzip" parameters of the "access_log" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "auth_basic" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx в некоторых случаях не собирался с модулем ngx_http_perl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the ngx_http_perl_module in some cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_xslt_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_xslt_module was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не собираться на MacOSX.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOSX in some cases.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы limit_rate с большими значениями скорости[m
[31m-на 32-битных системах ответ мог возвращаться не целиком.<br/>[m
[31m-Спасибо Алексею Антропову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive with high rates[m
[31m-might result in truncated responses on 32-bit platforms.<br/>[m
[31m-Thanks to Alexey Antropov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива if.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "if" directive was used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ "100 Continue" выдавался[m
[31m-вместе с ответом "413 Request Entity Too Large".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "100 Continue" response was issued[m
[31m-with "413 Request Entity Too Large" responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы image_filter, image_filter_jpeg_quality и image_filter_sharpen[m
[31m-могли наследоваться некорректно.<br/>[m
[31m-Спасибо Ивану Боброву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter", "image_filter_jpeg_quality"[m
[31m-and "image_filter_sharpen" directives[m
[31m-might be inherited incorrectly.<br/>[m
[31m-Thanks to Ian Babrou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы auth_basic под Linux[m
[31m-могли возникать ошибки "crypt_r() failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"crypt_r() failed" errors might appear[m
[31m-if the "auth_basic" directive was used on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке backup-серверов.<br/>[m
[31m-Спасибо Thomas Chen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in backup servers handling.<br/>[m
[31m-Thanks to Thomas Chen.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании HEAD-запросов мог возвращаться некорректный ответ,[m
[31m-если использовалась директива gzip.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxied HEAD requests might return incorrect response[m
[31m-if the "gzip" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.9" date="27.11.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка chunked transfer encoding при получении тела запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support for chunked transfer encoding while reading client request body.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $request_time и $msec[m
[31m-теперь можно использовать не только в директиве log_format.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_time and $msec variables[m
[31m-can now be used not only in the "log_format" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-cache manager и cache loader могли не запускаться,[m
[31m-если использовалось более 512 listen-сокетов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache manager and cache loader processes might not be able to start[m
[31m-if more than 512 listen sockets were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_dav_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_dav_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.8" date="30.10.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр optional_no_ca директивы ssl_verify_client.<br/>[m
[31m-Спасибо Михаилу Казанцеву и Eric O'Connor.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "optional_no_ca" parameter of the "ssl_verify_client" directive.<br/>[m
[31m-Thanks to Mike Kazantsev and Eric O'Connor.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $bytes_sent, $connection и $connection_requests[m
[31m-теперь можно использовать не только в директиве log_format.<br/>[m
[31m-Спасибо Benjamin Grössing.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $bytes_sent, $connection, and $connection_requests variables[m
[31m-can now be used not only in the "log_format" directive.<br/>[m
[31m-Thanks to Benjamin Grössing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр auto директивы worker_processes.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auto" parameter of the "worker_processes" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "cache file ... has md5 collision".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"cache file ... has md5 collision" alert.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве ssl_stapling.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "ssl_stapling" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.7" date="02.10.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка OCSP stapling.<br/>[m
[31m-Спасибо Comodo, DigiCert и GlobalSign за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OCSP stapling support.<br/>[m
[31m-Thanks to Comodo, DigiCert and GlobalSign for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_trusted_certificate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_trusted_certificate" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь resolver случайным образом меняет порядок[m
[31m-возвращаемых закэшированных адресов.<br/>[m
[31m-Спасибо Антону Жулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-resolver now randomly rotates addresses[m
[31m-returned from cache.<br/>[m
[31m-Thanks to Anton Jouline.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL 0.9.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL 0.9.7 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.6" date="12.09.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива memcached_gzip_flag.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "memcached_gzip_flag" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр always директивы gzip_static.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "always" parameter of the "gzip_static" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве "limit_req";[m
[31m-ошибка появилась в 1.1.14.<br/>[m
[31m-Спасибо Charles Chen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "limit_req" directive;[m
[31m-the bug had appeared in 1.1.14.<br/>[m
[31m-Thanks to Charles Chen.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался gcc 4.7 с оптимизацией -O2[m
[31m-если использовался параметр --with-ipv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by gcc 4.7 with -O2 optimization[m
[31m-if the --with-ipv6 option was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.5" date="21.08.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module больше не отфильтровывает дорожки[m
[31m-в форматах, отличных от H.264 и AAC.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_mp4_module module no longer skips[m
[31m-tracks in formats other than H.264 and AAC.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если в директиве map в качестве значений использовались переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "map" directive was used with variables as values.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault[m
[31m-при использовании директивы geo с параметром ranges,[m
[31m-но без параметра default; ошибка появилась в 0.8.43.<br/>[m
[31m-Спасибо Zhen Chen и Weibin Yao.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "geo" directive was used with the "ranges" parameter[m
[31m-but without the "default" parameter; the bug had appeared in 0.8.43.<br/>[m
[31m-Thanks to Zhen Chen and Weibin Yao.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке параметра командной строки -p.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the -p command-line parameter handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в почтовом прокси-сервере.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the mail proxy server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-незначительных потенциальных ошибок.<br/>[m
[31m-Спасибо Coverity.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of minor potential bugs.<br/>[m
[31m-Thanks to Coverity.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не собирался с Visual Studio 2005 Express.<br/>[m
[31m-Спасибо HAYASHI Kentaro.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not be built with Visual Studio 2005 Express.<br/>[m
[31m-Thanks to HAYASHI Kentaro.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.4" date="31.07.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь на слушающих IPv6-сокетах параметр ipv6only[m
[31m-включён по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ipv6only" parameter is now turned on by default for[m
[31m-listening IPv6 sockets.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка компилятора Clang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Clang compiler support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-могли создаваться лишние слушающие сокеты.<br/>[m
[31m-Спасибо Роману Одайскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-extra listening sockets might be created.<br/>[m
[31m-Thanks to Roman Odaisky.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог нагружать процессор, если при запуске рабочего процесса[m
[31m-происходила ошибка.<br/>[m
[31m-Спасибо Ricardo Villalobos Guevara.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might hog CPU if a worker process failed to start.<br/>[m
[31m-Thanks to Ricardo Villalobos Guevara.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass_header, fastcgi_pass_header, scgi_pass_header,[m
[31m-uwsgi_pass_header, proxy_hide_header, fastcgi_hide_header,[m
[31m-scgi_hide_header и uwsgi_hide_header[m
[31m-могли наследоваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass_header", "fastcgi_pass_header", "scgi_pass_header",[m
[31m-"uwsgi_pass_header", "proxy_hide_header", "fastcgi_hide_header",[m
[31m-"scgi_hide_header", and "uwsgi_hide_header" directives[m
[31m-might be inherited incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.3" date="10.07.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка entity tags и директива etag.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-entity tags support and the "etag" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы map с параметром hostnames[m
[31m-не игнорировалась конечная точка в исходном значении.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-trailing dot in a source value was not ignored[m
[31m-if the "map" directive was used with the "hostnames" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для обработки запроса мог использоваться неверный location,[m
[31m-если переход в именованный location происходил[m
[31m-после изменения URI с помощью директивы rewrite.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-incorrect location might be used to process a request[m
[31m-if a URI was changed via a "rewrite" directive[m
[31m-before an internal redirect to a named location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.2" date="26.06.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр single директивы keepalive теперь игнорируется.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "single" parameter of the "keepalive" directive is now ignored.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-сжатие SSL теперь отключено[m
[31m-в том числе при использовании OpenSSL старее 1.0.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL compression is now disabled when using all versions of OpenSSL,[m
[31m-including ones prior to 1.0.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву "ip_hash" теперь можно использовать для балансировки IPv6 клиентов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it is now possible to use the "ip_hash" directive to balance IPv6 clients.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменную $status теперь можно использовать не только в директиве log_format.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $status variable can now be used not only in the "log_format" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при завершении рабочего процесса мог произойти segmentation fault,[m
[31m-если использовалась директива resolver.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process on shutdown[m
[31m-if the "resolver" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_mp4_module was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовались конфликтующие имена серверов с масками.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if conflicting wildcard server names were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на платформе ARM nginx мог аварийно завершаться по сигналу SIGBUS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might be terminated abnormally on a SIGBUS signal on ARM platform.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время переконфигурации на HP-UX в лог[m
[31m-записывался alert "sendmsg() failed (9: Bad file number)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an alert "sendmsg() failed (9: Bad file number)" on HP-UX[m
[31m-while reconfiguration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.1" date="05.06.2012">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует точку в конце компонента URI[m
[31m-и не разрешает URI, содержащие последовательность ":$".<br/>[m
[31m-Спасибо Владимиру Кочеткову, Positive Research Center.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores trailing dot in URI path component, and[m
[31m-does not allow URIs with ":$" in it.<br/>[m
[31m-Thanks to Vladimir Kochetkov, Positive Research Center.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass, fastcgi_pass, scgi_pass, uwsgi_pass и[m
[31m-директива server в блоке upstream[m
[31m-теперь поддерживают IPv6-адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass", "fastcgi_pass", "scgi_pass", "uwsgi_pass" directives, and[m
[31m-the "server" directive inside the "upstream" block,[m
[31m-now support IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в директиве resolver теперь можно указывать порт и[m
[31m-задавать IPv6-адреса DNS-серверов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "resolver" directive now supports IPv6 addresses and[m
[31m-an optional port specification.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива least_conn в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "least_conn" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы ip_hash[m
[31m-теперь можно задавать веса серверов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it is now possible to specify a weight for servers[m
[31m-while using the "ip_hash" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива image_filter;[m
[31m-ошибка появилась в 1.3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "image_filter" directive was used;[m
[31m-the bug had appeared in 1.3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с модулем ngx_cpp_test_module;[m
[31m-ошибка появилась в 1.1.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with ngx_cpp_test_module;[m
[31m-the bug had appeared in 1.1.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-доступ к переменным из SSI и встроенного перла мог не работать после[m
[31m-переконфигурации.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-access to variables from SSI and embedded perl module might not work after[m
[31m-reconfiguration.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_xslt_filter_module.<br/>[m
[31m-Спасибо Kuramoto Eiji.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_xslt_filter_module.<br/>[m
[31m-Thanks to Kuramoto Eiji.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при использовании переменной $geoip_org.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak if $geoip_org variable was used.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах proxy_cookie_domain и proxy_cookie_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_cookie_domain" and "proxy_cookie_path" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.0" date="15.05.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива debug_connection теперь поддерживает IPv6-адреса[m
[31m-и параметр "unix:".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "debug_connection" directive now supports IPv6 addresses[m
[31m-and the "unix:" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива set_real_ip_from и параметр proxy[m
[31m-директивы geo теперь поддерживают IPv6-адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set_real_ip_from" directive and the "proxy" parameter[m
[31m-of the "geo" directive now support IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы real_ip_recursive, geoip_proxy и geoip_proxy_recursive.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "real_ip_recursive", "geoip_proxy", and "geoip_proxy_recursive" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр proxy_recursive директивы geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_recursive" parameter of the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива resolver.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "resolver" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовались директивы fastcgi_pass, scgi_pass или uwsgi_pass[m
[31m-и бэкенд возвращал некорректный ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "fastcgi_pass", "scgi_pass", or "uwsgi_pass" directives were used[m
[31m-and backend returned incorrect response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива rewrite и в новых аргументах запроса в строке[m
[31m-замены использовались переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "rewrite" directive was used and new request arguments[m
[31m-in a replacement used variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог нагружать процессор,[m
[31m-если было достигнуто ограничение на количество открытых файлов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might hog CPU[m
[31m-if the open file resource limit was reached.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы proxy_next_upstream с параметром http_404[m
[31m-nginx мог бесконечно перебирать бэкенды, если в блоке upstream был[m
[31m-хотя бы один сервер с флагом backup.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might loop infinitely over backends[m
[31m-if the "proxy_next_upstream" directive with the "http_404" parameter was used[m
[31m-and there were backup servers specified in an upstream block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы ip_hash[m
[31m-установка параметра down директивы server[m
[31m-могла приводить к ненужному перераспределению клиентов между бэкендами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-adding the "down" parameter of the "server" directive[m
[31m-might cause unneeded client redistribution among backend servers[m
[31m-if the "ip_hash" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_fastcgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_fastcgi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.2.0" date="23.04.2012">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива try_files;[m
[31m-ошибка появилась в 1.1.19.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "try_files" directive was used;[m
[31m-the bug had appeared in 1.1.19.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ мог быть передан не полностью,[m
[31m-если использовалось больше IOV_MAX буферов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-response might be truncated[m
[31m-if there were more than IOV_MAX buffers used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в работе параметра crop директивы image_filter.<br/>[m
[31m-Спасибо Maxim Bublis.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "crop" parameter of the "image_filter" directive.<br/>[m
[31m-Thanks to Maxim Bublis.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.19" date="12.04.2012">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного mp4 файла модулем ngx_http_mp4_module[m
[31m-могли перезаписываться области памяти рабочего процесса, что могло[m
[31m-приводить к выполнению произвольного кода (CVE-2012-2089).<br/>[m
[31m-Спасибо Matthew Daley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-specially crafted mp4 file might allow to overwrite[m
[31m-memory locations in a worker process[m
[31m-if the ngx_http_mp4_module was used,[m
[31m-potentially resulting in arbitrary code execution (CVE-2012-2089).<br/>[m
[31m-Thanks to Matthew Daley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог завершаться аварийно.<br/>[m
[31m-Спасибо Vincent Lee.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might be terminated abnormally.<br/>[m
[31m-Thanks to Vincent Lee.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx нагружал процессор, если все серверы в upstream'е были помечены[m
[31m-флагом backup.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx hogged CPU if all servers in an upstream were marked as "backup".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы allow и deny могли наследоваться некорректно,[m
[31m-если в них использовались IPv6 адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "allow" and "deny" directives might be inherited incorrectly[m
[31m-if they were used with IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы modern_browser и ancient_browser[m
[31m-могли наследоваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "modern_browser" and "ancient_browser" directives[m
[31m-might be inherited incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-таймауты могли работать некорректно на Solaris/SPARC.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-timeouts might be handled incorrectly on Solaris/SPARC.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.18" date="28.03.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь keepalive соединения не запрещены для Safari по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-keepalive connections are no longer disabled for Safari by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $connection_requests.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $connection_requests variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd и[m
[31m-$tcpinfo_rcv_space.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd and[m
[31m-$tcpinfo_rcv_space variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_cpu_affinity теперь работает на FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_cpu_affinity" directive now works on FreeBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы xslt_param и xslt_string_param.<br/>[m
[31m-Спасибо Samuel Behan.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "xslt_param" and "xslt_string_param" directives.<br/>[m
[31m-Thanks to Samuel Behan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в configure.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in configure tests.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_xslt_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_xslt_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Debian GNU/Hurd.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Debian GNU/Hurd.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.17" date="15.03.2012">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-содержимое ранее освобождённой памяти могло быть отправлено клиенту,[m
[31m-если бэкенд возвращал специально созданный ответ.<br/>[m
[31m-Спасибо Matthew Daley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-content of previously freed memory might be sent to a client[m
[31m-if backend returned specially crafted response.<br/>[m
[31m-Thanks to Matthew Daley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании встроенного перла из SSI.<br/>[m
[31m-Спасибо Matthew Daley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the embedded perl module if used from SSI.<br/>[m
[31m-Thanks to Matthew Daley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_uwsgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_uwsgi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.16" date="29.02.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ограничение на количество одновременных подзапросов поднято до 200.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the simultaneous subrequest limit has been raised to 200.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр from в директиве disable_symlinks.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "from" parameter of the "disable_symlinks" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы return и error_page теперь могут использоваться для возврата[m
[31m-перенаправлений с кодом 307.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "return" and "error_page" directives can now be used to return 307[m
[31m-redirections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива resolver[m
[31m-и на глобальном уровне не была задана директива error_log.<br/>[m
[31m-Спасибо Роману Арутюняну.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "resolver" directive was used[m
[31m-and there was no "error_log" directive specified at global level.<br/>[m
[31m-Thanks to Roman Arutyunyan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовались директивы "proxy_http_version 1.1" или[m
[31m-"fastcgi_keep_conn on".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "proxy_http_version 1.1" or "fastcgi_keep_conn on" directives[m
[31m-were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечек памяти.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leaks.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве disable_symlinks.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "disable_symlinks" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании ZFS размер кэша на диске мог считаться некорректно;[m
[31m-ошибка появилась в 1.0.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on ZFS filesystem disk cache size might be calculated incorrectly;[m
[31m-the bug had appeared in 1.0.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался компилятором icc 12.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by the icc 12.1 compiler.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался gcc на Solaris;[m
[31m-ошибка появилась в 1.1.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by gcc on Solaris;[m
[31m-the bug had appeared in 1.1.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.15" date="15.02.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива disable_symlinks.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "disable_symlinks" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cookie_domain и proxy_cookie_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cookie_domain" and "proxy_cookie_path" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог некорректно сообщать об ошибке "upstream prematurely closed[m
[31m-connection" вместо "upstream sent too big header".<br/>[m
[31m-Спасибо Feibo Li.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might log incorrect error "upstream prematurely closed connection"[m
[31m-instead of correct "upstream sent too big header" one.<br/>[m
[31m-Thanks to Feibo Li.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с модулем ngx_http_perl_module,[m
[31m-если использовался параметр --with-openssl.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the ngx_http_perl_module[m
[31m-if the --with-openssl option was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-количество внутренних перенаправлений в именованные location'ы[m
[31m-не ограничивалось.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the number of internal redirects to named locations was not limited.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-вызов $r->flush() несколько раз подряд мог приводить к ошибкам[m
[31m-в модуле ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-calling $r->flush() multiple times might cause errors[m
[31m-in the ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы proxy_store с SSI-подзапросами[m
[31m-временные файлы могли не удаляться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-temporary files might be not removed[m
[31m-if the "proxy_store" directive was used with SSI includes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в некоторых случаях некэшируемые переменные (такие, как $args)[m
[31m-возвращали старое пустое закэшированное значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in some cases non-cacheable variables (such as the $args variable)[m
[31m-returned old empty cached value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если одновременно создавалось слишком много SSI-подзапросов;[m
[31m-ошибка появилась в 0.7.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if too many SSI subrequests were issued simultaneously;[m
[31m-the bug had appeared in 0.7.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.14" date="30.01.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно указать несколько ограничений limit_req одновременно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-multiple "limit_req" limits may be used simultaneously.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при соединении с бэкендом.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling while connecting to a backend.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при использовании AIO на FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in AIO error handling on FreeBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в инициализации библиотеки OpenSSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the OpenSSL library initialization.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_redirect могли наследоваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directives might be inherited incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при переконфигурации, если использовалась директива pcre_jit.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak during reconfiguration if the "pcre_jit" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.13" date="16.01.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры TLSv1.1 и TLSv1.2 в директиве ssl_protocols.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "TLSv1.1" and "TLSv1.2" parameters of the "ssl_protocols" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры директивы limit_req наследовались некорректно;[m
[31m-ошибка появилась в 1.1.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_req" directive parameters were not inherited correctly;[m
[31m-the bug had appeared in 1.1.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_redirect некорректно обрабатывала заголовок Refresh[m
[31m-при использовании регулярных выражений.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directive incorrectly processed "Refresh" header[m
[31m-if regular expression were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_cache_use_stale с параметром error не возвращала ответ из[m
[31m-кэша, если все бэкенды были признаны неработающими.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_use_stale" directive with "error" parameter did not return[m
[31m-answer from cache if there were no live upstreams.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива worker_cpu_affinity могла не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_cpu_affinity" directive might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris;[m
[31m-ошибка появилась в 1.1.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris;[m
[31m-the bug had appeared in 1.1.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.12" date="26.12.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с помощью директивы error_page[m
[31m-директива proxy_pass без URI теперь использует изменённый URI.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part now uses changed URI[m
[31m-after redirection with the "error_page" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy/fastcgi/scgi/uwsgi_cache_lock,[m
[31m-proxy/fastcgi/scgi/uwsgi_cache_lock_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy/fastcgi/scgi/uwsgi_cache_lock",[m
[31m-"proxy/fastcgi/scgi/uwsgi_cache_lock_timeout" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива pcre_jit.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "pcre_jit" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-SSI команда if поддерживает выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" SSI command supports captures in regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSI команда if не работала внутри команды block.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" SSI command did not work inside the "block" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы limit_conn_log_level и limit_req_log_level могли не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_conn_log_level" and "limit_req_log_level" directives might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate не позволяла передавать на полной скорости,[m
[31m-даже если был указан очень большой лимит.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive did not allow to use full throughput,[m
[31m-even if limit value was very high.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива sendfile_max_chunk не работала,[m
[31m-если использовалась директива limit_rate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile_max_chunk" directive did not work,[m
[31m-if the "limit_rate" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве proxy_pass использовались переменные и не был указан URI,[m
[31m-всегда использовался URI исходного запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part always used original request URI[m
[31m-if variables were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с помощью директивы try_files[m
[31m-директива proxy_pass без URI могла использовать URI исходного запроса.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part might use original request[m
[31m-after redirection with the "try_files" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_scgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_scgi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris;[m
[31m-ошибка появилась в 1.1.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris;[m
[31m-the bug had appeared in 1.1.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.11" date="12.12.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр so_keepalive в директиве listen.<br/>[m
[31m-Спасибо Всеволоду Стахову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "so_keepalive" parameter of the "listen" directive.<br/>[m
[31m-Thanks to Vsevolod Stakhov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр if_not_empty в директивах fastcgi/scgi/uwsgi_param.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if_not_empty" parameter of the "fastcgi/scgi/uwsgi_param" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $https.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $https variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_redirect поддерживает переменные в первом параметре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directive supports variables in the first parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_redirect поддерживает регулярные выражения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directive supports regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $sent_http_cache_control могла содержать неверное значение при[m
[31m-использовании директивы expires.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $sent_http_cache_control variable might contain a wrong value if the[m
[31m-"expires" directive was used.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива read_ahead могла не работать при использовании совместно с[m
[31m-try_files и open_file_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "read_ahead" directive might not work combined with "try_files"[m
[31m-and "open_file_cache".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в параметре inactive директивы proxy_cache_path[m
[31m-было указано малое время,[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if small time was used in the "inactive" parameter of[m
[31m-the "proxy_cache_path" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы из кэша могли зависать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-responses from cache might hang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.10" date="30.11.2011">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании AIO на Linux в рабочем процессе происходил segmentation fault;[m
[31m-ошибка появилась в 1.1.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process if AIO was used on Linux;[m
[31m-the bug had appeared in 1.1.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.9" date="28.11.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь двойные кавычки экранируется при выводе SSI-командой echo.<br/>[m
[31m-Спасибо Зауру Абасмирзоеву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now double quotes are encoded in an "echo" SSI-command output.<br/>[m
[31m-Thanks to Zaur Abasmirzoev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр valid в директиве resolver.  По умолчанию теперь[m
[31m-используется TTL, возвращённый DNS-сервером.<br/>[m
[31m-Спасибо Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid" parameter of the "resolver" directive.  By default TTL[m
[31m-returned by a DNS server is used.<br/>[m
[31m-Thanks to Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог перестать отвечать, если рабочий процесс завершался аварийно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might hang after a worker process abnormal termination.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалось SNI;[m
[31m-ошибка появилась в 1.1.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if SNI was used;[m
[31m-the bug had appeared in 1.1.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве keepalive_disable;[m
[31m-ошибка появилась в 1.1.8.<br/>[m
[31m-Спасибо Александру Усову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "keepalive_disable" directive;[m
[31m-the bug had appeared in 1.1.8.<br/>[m
[31m-Thanks to Alexander Usov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сигнал SIGWINCH переставал работать после первого обновления исполняемого[m
[31m-файла;[m
[31m-ошибка появилась в 1.1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SIGWINCH signal did not work after first binary upgrade;[m
[31m-the bug had appeared in 1.1.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь ответы бэкендов, длина которых не соответствует заголовку[m
[31m-Content-Length, не кэширутся.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-backend responses with length not matching "Content-Length" header line[m
[31m-are no longer cached.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве scgi_param при использовании составных параметров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "scgi_param" directive, if complex parameters were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в методе epoll.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "epoll" event method.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_flv_module.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_flv_module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx понимает IPv6-адреса в строке запроса и в заголовке Host.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-IPv6 addresses are now handled properly in a request line and in a "Host"[m
[31m-request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы add_header и expires не работали для ответов с кодом 206,[m
[31m-если запрос проксировался.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"add_header" and "expires" directives did not work if a request was proxied[m
[31m-and response status code was 206.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на FreeBSD 10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on FreeBSD 10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на AIX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on AIX.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.8" date="14.11.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_limit_zone_module переименован в ngx_http_limit_conn_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_limit_zone_module was renamed to the ngx_http_limit_conn_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива limit_zone заменена директивой limit_conn_zone с новым синтаксисом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_zone" directive was superseded by the "limit_conn_zone" directive[m
[31m-with a new syntax.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка ограничения по нескольким limit_conn на одном уровне.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support for multiple "limit_conn" limits on the same level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_sharpen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_sharpen" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если resolver получил большой DNS-ответ.<br/>[m
[31m-Спасибо Ben Hawkes.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if resolver got a big DNS response.<br/>[m
[31m-Thanks to Ben Hawkes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в вычислении ключа для кэширования,[m
[31m-если использовалась внутренняя реализация MD5;[m
[31m-ошибка появилась в 1.0.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in cache key calculation[m
[31m-if internal MD5 implementation was used;[m
[31m-the bug had appeared in 1.0.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "If-Modified-Since", "If-Range" и им подобные в заголовке запроса[m
[31m-клиента могли передаваться бэкенду при кэшировании; или не передаваться при[m
[31m-выключенном кэшировании, если кэширование было включено в другой части[m
[31m-конфигурации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Modified-Since", "If-Range", etc. client request header lines[m
[31m-might be passed to backend while caching; or not passed without caching[m
[31m-if caching was enabled in another part of the configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module выдавал неверную строку "Content-Length"[m
[31m-в заголовке ответа, использовался аргумент start.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the module ngx_http_mp4_module sent incorrect "Content-Length" response[m
[31m-header line if the "start" argument was used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.7" date="31.10.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка нескольких DNS серверов в директиве "resolver".<br/>[m
[31m-Спасибо Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support of several DNS servers in the "resolver" directive.<br/>[m
[31m-Thanks to Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на старте или во время переконфигурации происходил segmentation fault,[m
[31m-если директива ssl использовалась на уровне http и не был указан[m
[31m-ssl_certificate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred on start or during reconfiguration[m
[31m-if the "ssl" directive was used at http level and there was[m
[31m-no "ssl_certificate" defined.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-уменьшено потребление памяти при проксировании больших файлов,[m
[31m-если они буферизировались на диск.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-reduced memory consumption while proxying big files[m
[31m-if they were buffered to disk.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива "proxy_http_version 1.1".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if "proxy_http_version 1.1" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве "expires @time".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "expires @time" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.6" date="17.10.2011">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменение во внутреннем API: теперь при внутреннем редиректе[m
[31m-в именованный location контексты модулей очищаются.<br/>[m
[31m-По запросу Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Change in internal API: now module context data are cleared[m
[31m-while internal redirect to named location.<br/>[m
[31m-Requested by Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь если сервер, описанный в блоке upstream, был признан неработающим,[m
[31m-то после истечения fail_timeout на него будет отправлен только один запрос;[m
[31m-сервер будет считаться работающим, если успешно ответит на этот запрос.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a server in an upstream failed, only one request will be sent to it[m
[31m-after fail_timeout; the server will be considered alive if it will[m
[31m-successfully respond to the request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь символы 0x7F-0xFF в access_log записываются в виде \xXX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the 0x7F-0xFF characters are escaped as \xXX in an access_log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы "proxy/fastcgi/scgi/uwsgi_ignore_headers" теперь поддерживают[m
[31m-значения X-Accel-Limit-Rate, X-Accel-Buffering и X-Accel-Charset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"proxy/fastcgi/scgi/uwsgi_ignore_headers" directives support the following[m
[31m-additional values: X-Accel-Limit-Rate, X-Accel-Buffering, X-Accel-Charset.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение потребления памяти при использовании SSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-decrease of memory consumption if SSL is used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-некоторые UTF-8 символы обрабатывались неправильно.<br/>[m
[31m-Спасибо Алексею Куцу.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some UTF-8 characters were processed incorrectly.<br/>[m
[31m-Thanks to Alexey Kuts.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы модуля ngx_http_rewrite_module, заданные на уровне server,[m
[31m-применялись повторно, если для запроса не находилось ни одного location'а.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_rewrite_module directives specified at "server" level were[m
[31m-executed twice if no matching locations were defined.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании "aio sendfile" могла происходить утечка сокетов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a socket leak might occurred if "aio sendfile" was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании файлового AIO соединения с быстрыми клиентами[m
[31m-могли быть закрыты по истечению send_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections with fast clients might be closed after send_timeout[m
[31m-if file AIO was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module не поддерживал перемотку на 32-битных платформах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the module ngx_http_mp4_module did not support seeking on 32-bit platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.5" date="05.10.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы uwsgi_buffering и scgi_buffering.<br/>[m
[31m-Спасибо Peter Smit.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "uwsgi_buffering" and "scgi_buffering" directives.<br/>[m
[31m-Thanks to Peter Smit.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании proxy_cache_bypass могли быть закэшированы[m
[31m-некэшируемые ответы.<br/>[m
[31m-Спасибо John Ferlito.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-non-cacheable responses might be cached if "proxy_cache_bypass" directive[m
[31m-was used.<br/>[m
[31m-Thanks to John Ferlito.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_proxy_module при работе с бэкендами по HTTP/1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in HTTP/1.1 support in the ngx_http_proxy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-закэшированные ответы с пустым телом возвращались некорректно;[m
[31m-ошибка появилась в 0.8.31.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cached responses with an empty body were returned incorrectly;[m
[31m-the bug had appeared in 0.8.31.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы с кодом 201 модуля ngx_http_dav_module были некорректны;[m
[31m-ошибка появилась в 0.8.32.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-201 responses of the ngx_http_dav_module were incorrect;[m
[31m-the bug had appeared in 0.8.32.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве return.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "return" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "ssl_session_cache builtin" происходил[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 1.1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_cache builtin" directive caused segmentation fault;[m
[31m-the bug had appeared in 1.1.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.4" date="20.09.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_upstream_keepalive.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_upstream_keepalive module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_http_version.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_http_version" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_keep_conn.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_keep_conn" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_aio_requests.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_aio_requests" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с файловым AIO,[m
[31m-он не мог запускаться на Linux без поддержки AIO.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built --with-file-aio it could not be run on Linux[m
[31m-kernel which did not support AIO.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при работе с Linux AIO.[m
[31m-<br/>[m
[31m-Спасибо Hagai Avrahami.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in Linux AIO error processing.[m
[31m-<br/>[m
[31m-Thanks to Hagai Avrahami.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-уменьшено потребление памяти для долгоживущих запросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-reduced memory consumption for long-lived requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module не поддерживал 64-битный MP4-атом co64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the module ngx_http_mp4_module did not support 64-bit MP4 "co64" atom.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.3" date="14.09.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the module ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в Linux AIO, используемым совместно с open_file_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in Linux AIO combined with open_file_cache.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-open_file_cache не обновлял информацию о файле,[m
[31m-если файл был изменён не атомарно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-open_file_cache did not update file info on retest[m
[31m-if file was not atomically changed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на MacOSX 10.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOSX 10.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.2" date="05.09.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь, если суммарный размер всех диапазонов больше размера исходного ответа,[m
[31m-то nginx возвращает только исходный ответ, не обрабатывая диапазоны.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if total size of all ranges is greater than source response size,[m
[31m-then nginx disables ranges and returns just the source response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива max_ranges.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "max_ranges" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_verify_client, ssl_verify_depth и ssl_prefer_server_cipher[m
[31m-могли работать некорректно, если использовался SNI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_verify_client", "ssl_verify_depth", and "ssl_prefer_server_ciphers"[m
[31m-directives might work incorrectly if SNI was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах proxy/fastcgi/scgi/ uwsgi_ignore_client_abort.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy/fastcgi/scgi/uwsgi_ignore_client_abort" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.1" date="22.08.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь загрузчик кэша за каждую итерацию либо обрабатывает число файлов,[m
[31m-указанное в параметре load_files, либо работает не дольше времени,[m
[31m-указанного в параметре loader_threshold.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now cache loader processes either as many files as specified by "loader_files"[m
[31m-parameter or works no longer than time specified by the "loader_threshold"[m
[31m-parameter during each iteration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-SIGWINCH сигнал теперь работает только в режиме демона.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now SIGWINCH signal works only in daemon mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь разделяемые зоны и кэши используют семафоры POSIX на Solaris.<br/>[m
[31m-Спасибо Денису Иванову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now shared zones and caches use POSIX semaphores on Solaris.<br/>[m
[31m-Thanks to Den Ivanov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь на NetBSD поддерживаются accept фильтры.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-accept filters are now supported on NetBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux 3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux 3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в некоторых случаях nginx не использовал сжатие;[m
[31m-ошибка появилась в 1.1.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not use gzipping in some cases;[m
[31m-the bug had appeared in 1.1.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-обработка тела запроса могла быть неверной, если клиент использовал pipelining.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-request body might be processed incorrectly if client used pipelining.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве request_body_in_single_buf.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "request_body_in_single_buf" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах proxy_set_body и proxy_pass_request_body[m
[31m-при использовании SSL-соединения с бэкендом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in "proxy_set_body" and "proxy_pass_request_body" directives[m
[31m-if SSL connection to backend was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx нагружал процессор, если все серверы в upstream'е были помечены[m
[31m-флагом down.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx hogged CPU if all servers in an upstream were marked as "down".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при переконфигурации мог произойти segmentation fault,[m
[31m-если в предыдущей конфигурации был определён, но не использовался[m
[31m-ssl_session_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur during reconfiguration[m
[31m-if ssl_session_cache was defined but not used in previous configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании большого количества backup-серверов[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if many backup servers were used in an upstream.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив fastcgi/scgi/uwsgi_param[m
[31m-со значениями, начинающимися со строки "HTTP_",[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.8.40.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if "fastcgi/scgi/uwsgi_param" directives were used[m
[31m-with values starting with "HTTP_";[m
[31m-the bug had appeared in 0.8.40.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.0" date="01.08.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение времени работы загрузчика кэша.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache loader run time decrease.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры loader_files, loader_sleep и loader_threshold[m
[31m-директив proxy/fastcgi/scgi/uwsgi_cache_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"loader_files", "loader_sleep", and "loader_threshold" options[m
[31m-of the "proxy/fastcgi/scgi/uwsgi_cache_path" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение времени загрузки конфигураций с большим количеством HTTPS серверов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-loading time decrease of configuration with large number of HTTPS sites.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx поддерживает шифры с обменом ECDHE-ключами.<br/>[m
[31m-Спасибо Adrian Kotelba.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx supports ECDHE key exchange ciphers.<br/>[m
[31m-Thanks to Adrian Kotelba.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива lingering_close.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "lingering_close" directive.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-закрытия соединения для pipelined-запросов.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in closing connection for pipelined requests.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запрещал сжатие при получении значения "gzip;q=0"[m
[31m-в строке "Accept-Encoding" в заголовке запроса клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not disable gzipping if client sent "gzip;q=0" in[m
[31m-"Accept-Encoding" request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-таймаута при небуферизированном проксировании.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in timeout in unbuffered proxied mode.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при использовании переменных в директиве proxy_pass[m
[31m-при работе с бэкендом по HTTPS.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leaks when a "proxy_pass" directive contains variables and proxies[m
[31m-to an HTTPS backend.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в проверке параметра директивы proxy_pass, заданного переменными.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in parameter validation of a "proxy_pass" directive with variables.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL не работал на QNX.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL did not work on QNX.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL модули не собирались gcc 4.6 без параметра --with-debug.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL modules could not be built by gcc 4.6 without --with-debug option.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.5" date="19.07.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию используются следующие шифры SSL: "HIGH:!aNULL:!MD5".<br/>[m
[31m-Спасибо Rob Stradling.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now default SSL ciphers are "HIGH:!aNULL:!MD5".<br/>[m
[31m-Thanks to Rob Stradling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы referer_hash_max_size и referer_hash_bucket_size.<br/>[m
[31m-Спасибо Witold Filipczyk.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "referer_hash_max_size" and "referer_hash_bucket_size"[m
[31m-directives.<br/>[m
[31m-Thanks to Witold Filipczyk.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $uid_reset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$uid_reset variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if a caching was used.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования рабочие процессы[m
[31m-могли зациклиться во время переконфигурации;[m
[31m-ошибка появилась в 0.8.48.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes may got caught in an endless loop during reconfiguration,[m
[31m-if a caching was used;[m
[31m-the bug had appeared in 0.8.48.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "stalled cache updating".<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"stalled cache updating" alert.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.4" date="01.06.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь в регулярных выражениях в директиве map можно задать[m
[31m-чувствительность к регистру с помощью префиксов "~" и "~*".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now regular expressions case sensitivity in the "map" directive[m
[31m-is given by prefixes "~" or "~*".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь разделяемые зоны и кэши используют семафоры POSIX на Linux.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now shared zones and caches use POSIX semaphores on Linux.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "stalled cache updating".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"stalled cache updating" alert.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http_auth_basic_module;[m
[31m-ошибка появилась в 1.0.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http_auth_basic_module;[m
[31m-the bug had appeared in 1.0.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.3" date="25.05.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic_user_file поддерживает шифрование пароля[m
[31m-методами "$apr1", "{PLAIN}" и "{SSHA}".<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_basic_user_file" directive supports "$apr1", "{PLAIN}",[m
[31m-and "{SSHA}" password encryption methods.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива geoip_org и переменная $geoip_org.<br/>[m
[31m-Спасибо Александру Ускову, Arnaud Granal и Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "geoip_org" directive and $geoip_org variable.<br/>[m
[31m-Thanks to Alexander Uskov, Arnaud Granal, and Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модули ngx_http_geo_module и ngx_http_geoip_module поддерживают[m
[31m-адреса IPv4, отображённые на IPv6 адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_geo_module and ngx_http_geoip_module support IPv4 addresses[m
[31m-mapped to IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проверке адреса IPv4, отображённого на адрес IPv6,[m
[31m-в рабочем процессе происходил segmentation fault,[m
[31m-если директивы access или deny были определены только для адресов IPv6;[m
[31m-ошибка появилась в 0.8.22.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process[m
[31m-during testing IPv4 address mapped to IPv6 address,[m
[31m-if access or deny rules were defined only for IPv6;[m
[31m-the bug had appeared in 0.8.22.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-закэшированный ответ мог быть испорчен, если значения директив[m
[31m-proxy/fastcgi/scgi/uwsgi_cache_bypass и proxy/fastcgi/scgi/ uwsgi_no_cache[m
[31m-были разными;[m
[31m-ошибка появилась в 0.8.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a cached response may be broken if "proxy/fastcgi/scgi/ uwsgi_cache_bypass"[m
[31m-and "proxy/fastcgi/scgi/uwsgi_no_cache" directive values were different;[m
[31m-the bug had appeared in 0.8.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.2" date="10.05.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь разделяемые зоны и кэши используют семафоры POSIX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now shared zones and caches use POSIX semaphores.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в работе параметра rotate директивы image_filter.<br/>[m
[31m-Спасибо Adam Bocim.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "rotate" parameter of the "image_filter" directive.<br/>[m
[31m-Thanks to Adam Bocim.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris;[m
[31m-ошибка появилась в 1.0.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris;[m
[31m-the bug had appeared in 1.0.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.1" date="03.05.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива split_clients использует алгоритм MurmurHash2 из-за[m
[31m-лучшего распределения.<br/>[m
[31m-Спасибо Олегу Мамонтову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "split_clients" directive uses MurmurHash2 algorithm because[m
[31m-of better distribution.<br/>[m
[31m-Thanks to Oleg Mamontov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь длинные строки, начинающиеся с нуля, не считаются ложными[m
[31m-значениями.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now long strings starting with zero are not considered as false values.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию nginx использует значение 511 для listen backlog на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses a default listen backlog value 511 on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $upstream_... можно использовать в SSI и перловом модулях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_... variables may be used in the SSI and perl modules.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx лучше ограничивает размер кэша на диске.<br/>[m
[31m-Спасибо Олегу Мамонтову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx limits better disk cache size.<br/>[m
[31m-Thanks to Oleg Mamontov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при парсинге неправильного IPv4 адреса мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.8.22.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur while parsing incorrect IPv4 address;[m
[31m-the bug had appeared in 0.9.3.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался gcc 4.6 без параметра --with-debug.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by gcc 4.6 without --with-debug option.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris 9 и более ранних;[m
[31m-ошибка появилась в 0.9.3.<br/>[m
[31m-Спасибо Dagobert Michelsen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris 9 and earlier;[m
[31m-the bug had appeared in 0.9.3.<br/>[m
[31m-Thanks to Dagobert Michelsen.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $request_time имела неверные значения, если использовались[m
[31m-подзапросы;[m
[31m-ошибка появилась в 0.8.47.<br/>[m
[31m-Спасибо Игорю А. Валькову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$request_time variable had invalid values if subrequests were used;[m
[31m-the bug had appeared in 0.8.47.<br/>[m
[31m-Thanks to Igor A. Valcov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.0" date="12.04.2011">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-cache manager мог нагружать процессор после переконфигурации.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a cache manager might hog CPU after reload.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "image_filter crop" неправильно работала в сочетании с[m
[31m-"image_filter rotate 180".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "image_filter crop" directive worked incorrectly coupled with[m
[31m-an "image_filter rotate 180" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "satisfy any" запрещала выдачу пользовательской страницы[m
[31m-для 401 кода.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "satisfy any" directive disabled custom 401 error page.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.7" date="04.04.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь соединения в состоянии keepalive могут быть закрыты преждевременно,[m
[31m-если у воркера нет свободных соединений.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now keepalive connections may be closed premature,[m
[31m-if there are no free worker connections.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр rotate директивы image_filter.<br/>[m
[31m-Спасибо Adam Bocim.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rotate" parameter of the "image_filter" directive.<br/>[m
[31m-Thanks to Adam Bocim.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ситуации, когда бэкенд в директивах fastcgi_pass, scgi_pass или uwsgi_pass[m
[31m-задан выражением и ссылается на описанный upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a case when a backend in "fastcgi_pass", "scgi_pass", or "uwsgi_pass"[m
[31m-directives is given by expression and refers to a defined upstream.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.6" date="21.03.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает регулярные выражения в качестве значения[m
[31m-первого параметра.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports regular expressions as value of the first[m
[31m-parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $time_iso8601 для access_log.<br/>[m
[31m-Спасибо Michael Lustfield.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$time_iso8601 access_log variable.<br/>[m
[31m-Thanks to Michael Lustfield.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.5" date="21.02.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию nginx использует значение -1 для listen backlog[m
[31m-на Linux.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses a default listen backlog value -1 on Linux.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр utf8 в директивах geoip_country и geoip_city.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "utf8" parameter of "geoip_country" and "geoip_city" directives.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-исправление в умолчательной директиве proxy_redirect, если в директиве[m
[31m-proxy_pass не был описан URI.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a default "proxy_redirect" directive if "proxy_pass" directive has no[m
[31m-URI part.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не работала с нестандартными кодами ошибок;[m
[31m-ошибка появилась в 0.8.53.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "error_page" directive did not work with nonstandard error codes;[m
[31m-the bug had appeared in 0.8.53.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.4" date="21.01.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает переменную $hostname.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" directive supports the $hostname variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-494 код для ошибки "Request Header Too Large".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-494 code for "Request Header Too Large" error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.3" date="13.12.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если для пары IPv6-адрес:порт описан только один сервер, то выделения[m
[31m-в регулярных выражениях в директиве server_name не работали.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if there was a single server for given IPv6 address:port pair,[m
[31m-then captures in regular expressions in a "server_name" directive did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под Solaris;[m
[31m-ошибка появилась в 0.9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris;[m
[31m-the bug had appeared in 0.9.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.2" date="06.12.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка строки "If-Unmodified-Since" в заголовке запроса клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Unmodified-Since" client request header line support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-использование accept(), если accept4() не реализован;[m
[31m-ошибка появилась в 0.9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fallback to accept() syscall if accept4() was not implemented;[m
[31m-the issue had appeared in 0.9.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под Cygwin;[m
[31m-ошибка появилась в 0.9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Cygwin;[m
[31m-the bug had appeared in 0.9.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-уязвимости в OpenSSL CVE-2010-4180.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for OpenSSL vulnerability CVE-2010-4180.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.1" date="30.11.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы вида "return CODE message" не работали;[m
[31m-ошибка появилась в 0.9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"return CODE message" directives did not work;[m
[31m-the bug had appeared in 0.9.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.0" date="29.11.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива keepalive_disable.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "keepalive_disable" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает переменные в качестве значения определяемой[m
[31m-переменной.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports variables as value of a defined variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает пустые строки в качестве значения первого параметра.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports empty strings as value of the first parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает выражения в первом параметре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports expressions as the first parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-страница руководства nginx(8).<br/>[m
[31m-Спасибо Сергею Осокину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx(8) manual page.<br/>[m
[31m-Thanks to Sergey Osokin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка accept4() в Linux.<br/>[m
[31m-Спасибо Simon Liu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Linux accept4() support.<br/>[m
[31m-Thanks to Simon Liu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-устранение предупреждения линкера о "sys_errlist" и "sys_nerr" под Linux;[m
[31m-предупреждение появилось в 0.8.35.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-elimination of Linux linker warning about "sys_errlist" and "sys_nerr";[m
[31m-the warning had appeared in 0.8.35.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы auth_basic[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Михаилу Лалетину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if the "auth_basic" directive was used.<br/>[m
[31m-Thanks to Michail Laletin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с модулем ngx_http_eval_module;[m
[31m-ошибка появилась в 0.8.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with ngx_http_eval_module;[m
[31m-the bug had appeared in 0.8.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.53" date="18.10.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива error_page позволяет менять код статуса у редиректа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "error_page" directive allows to change a status code in a redirect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_disable поддерживает специальную маску degradation.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "gzip_disable" directive supports special "degradation" mask.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании файлового AIO могла происходить утечка сокетов.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a socket leak might occurred if file AIO was used.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в первом сервере не была описана директива listen и нигде явно[m
[31m-не описан сервер по умолчанию, то сервером по умолчанию становился[m
[31m-следующий сервер с директивой listen;[m
[31m-ошибка появилась в 0.8.21.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the first server had no "listen" directive and there was no explicit[m
[31m-default server, then a next server with a "listen" directive became[m
[31m-the default server;[m
[31m-the bug had appeared in 0.8.21.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.52" date="28.09.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx использовал режим SSL для listen сокета, если для него был[m
[31m-установлен любой listen-параметр;[m
[31m-ошибка появилась в 0.8.51.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx used SSL mode for a listen socket if any listen option was set;[m
[31m-the bug had appeared in 0.8.51.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.51" date="27.09.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива secure_link_expires упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "secure_link_expires" directive has been canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-уровень логгирования ошибок resolver'а понижен с уровня alert на error.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a logging level of resolver errors has been lowered from "alert" to "error".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь параметр "ssl" listen-сокета можно устанавливать несколько раз.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a listen socket "ssl" parameter may be set several times.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.50" date="02.09.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы secure_link, secure_link_md5 и secure_link_expires[m
[31m-модуля ngx_http_secure_link_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "secure_link", "secure_link_md5", and "secure_link_expires" directives of[m
[31m-the ngx_http_secure_link_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -q.<br/>[m
[31m-Спасибо Геннадию Махомеду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -q switch.<br/>[m
[31m-Thanks to Gena Makhomed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования рабочие процессы и могли зациклиться[m
[31m-во время переконфигурации;[m
[31m-ошибка появилась в 0.8.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes may got caught in an endless loop during reconfiguration,[m
[31m-if a caching was used;[m
[31m-the bug had appeared in 0.8.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве gzip_disable.<br/>[m
[31m-Спасибо Derrick Petzold.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "gzip_disable" directive.<br/>[m
[31m-Thanks to Derrick Petzold.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не мог посылать сигналы stop, quit, reopen, reload процессу,[m
[31m-запущенному в другой сессии.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not send stop, quit, reopen, and reload signals[m
[31m-to a process run in other session.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.49" date="09.08.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_jpeg_quality поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_jpeg_quality" directive supports variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной $geoip_region_name[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.8.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if the $geoip_region_name variables was used;[m
[31m-the bug had appeared in 0.8.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки, перехваченные error_page, кэшировались только до следующего запроса;[m
[31m-ошибка появилась в 0.8.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors intercepted by error_page were cached only for next request;[m
[31m-the bug had appeared in 0.8.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.48" date="03.08.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию директива server_name имеет значение пустое имя "".<br/>[m
[31m-Спасибо Геннадию Махомеду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "server_name" directive default value is an empty name "".<br/>[m
[31m-Thanks to Gena Makhomed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию директива server_name_in_redirect имеет значение off.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "server_name_in_redirect" directive default value is "off".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $geoip_dma_code, $geoip_area_code и $geoip_region_name.<br/>[m
[31m-Спасибо Christine McGonagle.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $geoip_dma_code, $geoip_area_code, and $geoip_region_name variables.<br/>[m
[31m-Thanks to Christine McGonagle.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass, fastcgi_pass, uwsgi_pass и scgi_pass не наследовались[m
[31m-в блоки limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass", "fastcgi_pass", "uwsgi_pass", and "scgi_pass" directives[m
[31m-were not inherited inside "limit_except" blocks.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache_min_uses, fastcgi_cache_min_uses[m
[31m-uwsgi_cache_min_uses и scgi_cache_min_uses не работали;[m
[31m-ошибка появилась в 0.8.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_min_uses", "fastcgi_cache_min_uses"[m
[31m-"uwsgi_cache_min_uses", and "scgi_cache_min_uses" directives did not work;[m
[31m-the bug had appeared in 0.8.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_split_path_info неверно использовала выделения,[m
[31m-если в выделения попадала только часть URI.<br/>[m
[31m-Спасибо Юрию Тарадаю и Frank Enderle.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_split_path_info" directive used incorrectly captures,[m
[31m-if only parts of an URI were captured.<br/>[m
[31m-Thanks to Yuriy Taraday and Frank Enderle.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива rewrite не экранировала символ ";" при копировании из URI[m
[31m-в аргументы.<br/>[m
[31m-Спасибо Daisuke Murase.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rewrite" directive did not escape a ";" character during copying[m
[31m-from URI to query string.<br/>[m
[31m-Thanks to Daisuke Murase.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_image_filter_module закрывал соединение,[m
[31m-если изображение было больше размера image_filter_buffer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_image_filter_module closed a connection,[m
[31m-if an image was larger than "image_filter_buffer" size.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.47" date="28.07.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $request_time имела неверные значения для подзапросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$request_time variable had invalid values for subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки, перехваченные error_page, не кэшировались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors intercepted by error_page could not be cached.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался параметр max_size, то cache manager мог зациклиться;[m
[31m-ошибка появилась в 0.8.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a cache manager process may got caught in an endless loop,[m
[31m-if max_size parameter was used;[m
[31m-the bug had appeared in 0.8.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.46" date="19.07.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_no_cache, fastcgi_no_cache, uwsgi_no_cache[m
[31m-и scgi_no_cache теперь влияют только на сохранение закэшированного ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "proxy_no_cache", "fastcgi_no_cache", "uwsgi_no_cache", and[m
[31m-"scgi_no_cache" directives affect on a cached response saving only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache_bypass, fastcgi_cache_bypass, uwsgi_cache_bypass[m
[31m-и scgi_cache_bypass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_bypass", "fastcgi_cache_bypass", "uwsgi_cache_bypass",[m
[31m-and "scgi_cache_bypass" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не освобождал память в keys_zone кэшей в случае ошибки работы с[m
[31m-бэкендом: память освобождалась только по истечении времени неактивности[m
[31m-или при недостатке памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not free memory in cache keys zones if there was an error[m
[31m-during working with backend: the memory was freed only after inactivity[m
[31m-time or on memory low condition.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.45" date="13.07.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-улучшения в модуле ngx_http_xslt_filter.<br/>[m
[31m-Спасибо Laurence Rowe.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_xslt_filter improvements.<br/>[m
[31m-Thanks to Laurence Rowe.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ SSI модуля мог передаваться не полностью после команды include[m
[31m-с параметром wait="yes";[m
[31m-ошибка появилась в 0.7.25.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSI response might be truncated after include with wait="yes";[m
[31m-the bug had appeared in 0.7.25.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива listen не поддерживала параметр setfib=0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive did not support the "setfib=0" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.44" date="05.07.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx по умолчанию не кэширует ответы бэкендов,[m
[31m-в заголовке которых есть строка "Set-Cookie".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx does not cache by default backend responses,[m
[31m-if they have a "Set-Cookie" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen поддерживает параметр setfib.<br/>[m
[31m-Спасибо Андрею Филонову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive supports the "setfib" parameter.<br/>[m
[31m-Thanks to Andrew Filonov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива sub_filter могла изменять регистр букв при частичном совпадении.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sub_filter" directive might change character case on partial match.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с HP/UX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with HP/UX.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с компилятором AIX xlC_r.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with AIX xlC_r compiler.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx считал большие пакеты SSLv2 как обычные текстовые запросы.<br/>[m
[31m-Спасибо Miroslaw Jaworski.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx treated large SSLv2 packets as plain requests.<br/>[m
[31m-Thanks to Miroslaw Jaworski.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.43" date="30.06.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ускорение загрузки больших баз geo-диапазонов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large geo ranges base loading speed-up.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-перенаправление ошибки в "location /zero {return 204;}" без изменения[m
[31m-кода ответа оставляло тело ошибки;[m
[31m-ошибка появилась в 0.8.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an error_page redirection to "location /zero {return 204;}" without[m
[31m-changing status code kept the error body;[m
[31m-the bug had appeared in 0.8.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог закрывать IPv6 listen сокет во время переконфигурации.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might close IPv6 listen socket during reconfiguration.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменную $uid_set можно использовать на любой стадии обработки запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $uid_set variable may be used at any request processing stage.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.42" date="21.06.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx проверяет location'ы, заданные регулярными выражениями,[m
[31m-если запрос полностью совпал с location'ом, заданным строкой префикса.[m
[31m-Предыдущее поведение появилось в 0.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx tests locations given by regular expressions,[m
[31m-if request was matched exactly by a location given by a prefix string.[m
[31m-The previous behavior has been introduced in 0.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_scgi_module.<br/>[m
[31m-Спасибо Manlio Perillo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_scgi_module.<br/>[m
[31m-Thanks to Manlio Perillo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в директиве return можно добавлять текст ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a text answer may be added to a "return" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.41" date="15.06.2010">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс nginx/Windows мог завершаться аварийно при запросе файла[m
[31m-с неверной кодировкой UTF-8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows worker might be terminated abnormally if a requested file name[m
[31m-has invalid UTF-8 encoding.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx разрешает использовать пробелы в строке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx allows to use spaces in a request line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_redirect неправильно изменяла строку "Refresh" в заголовке[m
[31m-ответа бэкенда.<br/>[m
[31m-Спасибо Андрею Андрееву и Максиму Согину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directive changed incorrectly a backend "Refresh"[m
[31m-response header line.<br/>[m
[31m-Thanks to Andrey Andreew and Max Sogin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал путь без имени хоста в[m
[31m-строке "Destination" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support path without host name[m
[31m-in "Destination" request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.40" date="07.06.2010">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует имя потока файла по умолчанию.<br/>[m
[31m-Спасибо Jose Antonio Vazquez Gonzalez.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores default file stream name.<br/>[m
[31m-Thanks to Jose Antonio Vazquez Gonzalez.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_uwsgi_module.<br/>[m
[31m-Спасибо Roberto De Ioris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_uwsgi_module.<br/>[m
[31m-Thanks to Roberto De Ioris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_param со значением, начинающимся со строки "HTTP_",[m
[31m-изменяет строку заголовка в запросе клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "fastcgi_param" directive with value starting with "HTTP_" overrides[m
[31m-a client request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "If-Modified-Since", "If-Range" и им подобные в заголовке запроса[m
[31m-клиента передавались FastCGI-серверу при кэшировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Modified-Since", "If-Range", etc. client request header lines[m
[31m-were passed to FastCGI-server while caching.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-listen unix domain сокет нельзя было изменить во время переконфигурации.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-listen unix domain socket could not be changed during reconfiguration.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.39" date="31.05.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-наследуемая директива alias неправильно работала во вложенном location'е.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an inherited "alias" directive worked incorrectly in inclusive location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в комбинации директив alias с переменными и try_files;[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in "alias" with variables and "try_files" directives combination.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-listen unix domain и IPv6 сокеты не наследовались во время обновления[m
[31m-без перерыва.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-listen unix domain and IPv6 sockets did not inherit while online upgrade.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.38" date="24.05.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_no_cache и fastcgi_no_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_no_cache" and "fastcgi_no_cache" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании переменной $scheme в директиве rewrite[m
[31m-автоматически делается редирект.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "rewrite" directive does a redirect automatically[m
[31m-if the $scheme variable is used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь задержки в директиве limit_req соответствует описанному алгоритму.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now "limit_req" delay directive conforms to the described algorithm.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменную $uid_got нельзя было использовать в SSI и перловом модулях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $uid_got variable might not be used in the SSI and perl modules.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.37" date="17.05.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_split_clients_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_split_clients_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает ключи больше 255 символов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports keys more than 255 characters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx игнорировал значения "private" и "no-store" в строке "Cache-Control"[m
[31m-в заголовке ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx ignored the "private" and "no-store" values[m
[31m-in the "Cache-Control" backend response header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр stub в SSI-директиве include не использовался,[m
[31m-если пустой ответ имел код 200.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "stub" parameter of an "include" SSI directive was not used,[m
[31m-if empty response has 200 status code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если проксированный или FastCGI запрос внутренне перенаправлялся[m
[31m-в другой проксированный или FastCGI location,[m
[31m-то в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.8.33.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a proxied or FastCGI request was internally redirected[m
[31m-to another proxied or FastCGI location,[m
[31m-then a segmentation fault might occur in a worker process;[m
[31m-the bug had appeared in 0.8.33.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-соединения IMAP к серверу Zimbra могло зависнуть до таймаута.<br/>[m
[31m-Спасибо Alan Batie.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-IMAP connections may hang until they timed out[m
[31m-while talking to Zimbra server.<br/>[m
[31m-Thanks to Alan Batie.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.36" date="22.04.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module неправильно обрабатывал методы DELETE, COPY и MOVE[m
[31m-для симлинков.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module handled incorrectly the DELETE, COPY, and MOVE methods[m
[31m-for symlinks.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль SSI в подзапросах использовал закэшированные в основном запросе[m
[31m-значения переменных $query_string, $arg_... и им подобных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-values of the $query_string, $arg_..., etc. variables cached in main[m
[31m-request were used by the SSI module in subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-значение переменной повторно экранировалось после каждого вывода[m
[31m-SSI-команды echo;[m
[31m-ошибка появилась в 0.6.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a variable value was repeatedly encoded after each[m
[31m-an "echo" SSI-command output;[m
[31m-the bug had appeared in 0.6.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс зависал при запросе файла FIFO.<br/>[m
[31m-Спасибо Vicente Aguilar и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process hung if a FIFO file was requested.<br/>[m
[31m-Thanks to Vicente Aguilar and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL-1.0.0 на 64-битном Linux.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL-1.0.0 compatibility on 64-bit Linux.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http-cache;[m
[31m-ошибка появилась в 0.8.35.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http-cache;[m
[31m-the bug had appeared in 0.8.35.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.35" date="01.04.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь charset-фильтр работает до SSI-фильтра.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the charset filter runs before the SSI filter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива chunked_transfer_encoding.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "chunked_transfer_encoding" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-символ "&amp;" при копировании в аргументы в правилах rewrite не экранировался.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "&amp;" character was not escaped when it was copied in arguments part[m
[31m-in a rewrite rule.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог завершаться аварийно во время обработки сигнала или[m
[31m-при использовании директивы timer_resolution на платформах,[m
[31m-не поддерживающих методы kqueue или eventport.<br/>[m
[31m-Спасибо George Xie и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might be terminated abnormally[m
[31m-while a signal processing or if the directive "timer_resolution" was used[m
[31m-on platforms which do not support kqueue or eventport notification methods.<br/>[m
[31m-Thanks to George Xie and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если временные файлы и постоянное место хранения располагались на разных[m
[31m-файловых системах, то у постоянных файлов время изменения было неверным.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if temporary files and permanent storage area resided at different[m
[31m-file systems, then permanent file modification times were incorrect.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_memcached_module мог выдавать ошибку "memcached sent invalid[m
[31m-trailer".<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_memcached_module might issue the error message "memcached sent invalid[m
[31m-trailer".<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не мог собрать библиотеку zlib-1.2.4 из исходных текстов.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not built zlib-1.2.4 library using the library sources.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе происходил segmentation fault,[m
[31m-если перед ответом FastCGI-сервера было много вывода в stderr;[m
[31m-ошибка появилась в 0.8.34.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process,[m
[31m-if there was large stderr output before FastCGI response;[m
[31m-the bug had appeared in 0.8.34.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.34" date="03.03.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал все шифры, используемые в клиентских сертификатах.<br/>[m
[31m-Спасибо Иннокентию Еникееву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support all ciphers and digests used in client certificates.<br/>[m
[31m-Thanks to Innocenty Enikeew.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неправильно кэшировал FastCGI-ответы, если перед ответом было[m
[31m-много вывода в stderr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx cached incorrectly FastCGI responses if there was large stderr output[m
[31m-before response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал HTTPS-рефереры.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support HTTPS referrers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог не находить файлы, если путь в конфигурации был задан[m
[31m-в другом регистре;[m
[31m-ошибка появилась в 0.8.33.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might not find file if path in configuration was given[m
[31m-in other character case;[m
[31m-the bug had appeared in 0.8.33.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $date_local выдавала неверное время,[m
[31m-если использовался формат "%s".<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $date_local variable has an incorrect value,[m
[31m-if the "%s" format was used.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ssl_session_cache не был установлен или установлен в none,[m
[31m-то при проверке клиентского сертификаты могла происходить[m
[31m-ошибка "session id context uninitialized";[m
[31m-ошибка появилась в 0.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if ssl_session_cache was not set or was set to "none",[m
[31m-then during client certificate verify[m
[31m-the error "session id context uninitialized" might occur;[m
[31m-the bug had appeared in 0.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-geo-диапазон возвращал значение по умолчанию, если диапазон включал[m
[31m-в себя одну и более сетей размером /16 и не начинался на границе сети[m
[31m-размером /16.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a geo range returned default value if the range included two or more[m
[31m-/16 networks and did not begin at /16 network boundary.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-блок, используемый в параметре stub в SSI-директиве include,[m
[31m-выводился с MIME-типом "text/plain".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a block used in a "stub" parameter of an "include" SSI directive[m
[31m-was output with "text/plain" MIME type.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-$r->sleep() не работал;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$r->sleep() did not work;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.33" date="01.02.2010">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует пробелы в конце URI.<br/>[m
[31m-Спасибо Dan Crowley, Core Security Technologies.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores trailing spaces in URI.<br/>[m
[31m-Thanks to Dan Crowley, Core Security Technologies.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует короткие имена файлов.<br/>[m
[31m-Спасибо Dan Crowley, Core Security Technologies.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores short files names.<br/>[m
[31m-Thanks to Dan Crowley, Core Security Technologies.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь keepalive соединения после запросов POST не запрещаются для[m
[31m-MSIE 7.0+.<br/>[m
[31m-Спасибо Adam Lounds.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now keepalive connections after POST requests are not disabled for[m
[31m-MSIE 7.0+.<br/>[m
[31m-Thanks to Adam Lounds.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-теперь keepalive соединения запрещены для Safari.<br/>[m
[31m-Спасибо Joshua Sierles.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now keepalive connections are disabled for Safari.<br/>[m
[31m-Thanks to Joshua Sierles.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если проксированный или FastCGI запрос внутренне перенаправлялся[m
[31m-в другой проксированный или FastCGI location, то переменная[m
[31m-$upstream_response_time могла иметь ненормально большое значение;[m
[31m-ошибка появилась в 0.8.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a proxied or FastCGI request was internally redirected[m
[31m-to another proxied or FastCGI location,[m
[31m-then $upstream_response_time variable may have abnormally large value;[m
[31m-the bug had appeared in 0.8.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault[m
[31m-при отбрасывания тела запроса;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-while discarding a request body;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.32" date="11.01.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании кодировки UTF-8 в ngx_http_autoindex_module.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-UTF-8 encoding usage in the ngx_http_autoindex_module.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-именованные выделения в регулярных выражениях работали только для[m
[31m-двух переменных.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expression named captures worked for two names only.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь в строке заголовка запроса "Host" используется имя "localhost",[m
[31m-если в директиве auth_http указан unix domain сокет.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "localhost" name is used in the "Host" request header line,[m
[31m-if an unix domain socket is defined in the "auth_http" directive.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал передачу chunk'ами для 201-ых ответов.<br/>[m
[31m-Спасибо Julian Reich.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support chunked transfer encoding for 201 responses.<br/>[m
[31m-Thanks to Julian Reich.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если директива "expires modified" выставляла дату в прошлом, то в строке[m
[31m-заголовка ответа "Cache-Control" выдавалось отрицательное число.<br/>[m
[31m-Спасибо Алексею Капранову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "expires modified" set date in the past, then a negative number[m
[31m-was set in the "Cache-Control" response header line.<br/>[m
[31m-Thanks to Alex Kapranoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.31" date="23.12.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива error_page может перенаправлять ответы со статусом 301 и 302.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "error_page" directive may redirect the 301 and 302 responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $geoip_city_continent_code, $geoip_latitude и $geoip_longitude.<br/>[m
[31m-Спасибо Arvind Sundararajan.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $geoip_city_continent_code, $geoip_latitude, and $geoip_longitude[m
[31m-variables.<br/>[m
[31m-Thanks to Arvind Sundararajan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_image_filter_module теперь всегда удаляет[m
[31m-EXIF и другие данные, если они занимают больше 5% в JPEG-файле.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_image_filter_module deletes always EXIF and other[m
[31m-application specific data if the data consume more than 5% of a JPEG file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx закрывал соединение при запросе закэшированного[m
[31m-ответа с пустым телом.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx closed a connection if a cached response had an empty body.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не собираться gcc 4.x при использовании оптимизации -O2 и выше.<br/>[m
[31m-Спасибо Максиму Дунину и Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might not be built by gcc 4.x if the -O2 or higher optimization option[m
[31m-was used.<br/>[m
[31m-Thanks to Maxim Dounin and Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-регулярные выражения в location всегда тестировались с учётом регистра;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expressions in location were always tested in case-sensitive mode;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx кэшировал 304 ответ, если в заголовке проксируемого запроса[m
[31m-была строка "If-None-Match".<br/>[m
[31m-Спасибо Tim Dettrick и David Kostal.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx cached a 304 response if there was the "If-None-Match" header line[m
[31m-in a proxied request.<br/>[m
[31m-Thanks to Tim Dettrick and David Kostal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows пытался дважды удалить временный файл[m
[31m-при перезаписи уже существующего файла.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows tried to delete a temporary file twice[m
[31m-if the file should replace an already existent file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.30" date="15.12.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию размер буфера директивы large_client_header_buffers[m
[31m-равен 8K.<br/>[m
[31m-Спасибо Andrew Cholakian.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the default buffer size of the "large_client_header_buffers"[m
[31m-directive is 8K.<br/>[m
[31m-Thanks to Andrew Cholakian.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-файл conf/fastcgi.conf для простых конфигураций FastCGI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the conf/fastcgi.conf for simple FastCGI configurations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows пытался дважды переименовать временный файл[m
[31m-при перезаписи уже существующего файла.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows tried to rename a temporary file twice if the file[m
[31m-should replace an already existent file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки double free or corruption, возникающей, если имя хоста не было найдено;[m
[31m-ошибка появилась в 0.8.22.<br/>[m
[31m-Спасибо Константину Свисту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of "double free or corruption" error issued if host could not be resolved;[m
[31m-the bug had appeared in 0.8.22.<br/>[m
[31m-Thanks to Konstantin Svist.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании libatomic на некоторых платформах.<br/>[m
[31m-Спасибо W-Mark Kubacki.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in libatomic usage on some platforms.<br/>[m
[31m-Thanks to W-Mark Kubacki.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.29" date="30.11.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь для проксируемых ответов HTTP/0.9 в лог пишется код ответа "009".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "009" status code is written to an access log for proxied HTTP/0.9[m
[31m-responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы addition_types, charset_types, gzip_types, ssi_types,[m
[31m-sub_filter_types и xslt_types поддерживают параметр "*".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "addition_types", "charset_types", "gzip_types", "ssi_types",[m
[31m-"sub_filter_types", and "xslt_types" directives support an "*" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-использование встроенных атомарных операций GCC 4.1+.<br/>[m
[31m-Спасибо W-Mark Kubacki.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-GCC 4.1+ built-in atomic operations usage.<br/>[m
[31m-Thanks to W-Mark Kubacki.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр --with-libatomic[=DIR] в configure.<br/>[m
[31m-Спасибо W-Mark Kubacki.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --with-libatomic[=DIR] option in the configure.<br/>[m
[31m-Thanks to W-Mark Kubacki.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-listen unix domain сокет имели ограниченные права доступа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-listen unix domain socket had limited access rights.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-закэшированные ответы ответов HTTP/0.9 неправильно обрабатывались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cached HTTP/0.9 responses were handled incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-именованные выделения в регулярных выражениях, заданные как "?P&lt;...&gt;",[m
[31m-не работали в директиве server_name.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expression named captures given by "?P&lt;...&gt;" did not work[m
[31m-in a "server_name" directive.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.28" date="23.11.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-pcre;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the --without-pcre parameter;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.27" date="17.11.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-регулярные выражения не работали в nginx/Windows;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expressions did not work in nginx/Windows;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.26" date="16.11.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании выделений в директиве rewrite;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in captures usage in "rewrite" directive;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без параметра --with-debug;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without the --with-debug option;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.25" date="16.11.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь в лог ошибок не пишется сообщение, если переменная не найдена[m
[31m-с помощью метода $r->variable().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now no message is written in an error log if a variable is not found by[m
[31m-$r->variable() method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_degradation_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_degradation_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-именованные выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expression named captures.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании переменных в директиве proxy_pass не требуется[m
[31m-задавать URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now URI part is not required a "proxy_pass" directive if variables are used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива msie_padding работает и для Chrome.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "msie_padding" directive works for Chrome too.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе происходил segmentation fault при недостатке памяти;[m
[31m-ошибка появилась в 0.8.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process on low memory condition;[m
[31m-the bug had appeared in 0.8.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx передавал сжатые ответы клиентам, не поддерживающим сжатие,[m
[31m-при настройках gzip_static on и gzip_vary off;[m
[31m-ошибка появилась в 0.8.16.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx sent gzipped responses to clients those do not support gzip,[m
[31m-if "gzip_static on" and "gzip_vary off";[m
[31m-the bug had appeared in 0.8.16.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.24" date="11.11.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx всегда добавлял строку "Content-Encoding: gzip" в заголовок[m
[31m-304-ых ответов модуля ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx always added "Content-Encoding: gzip" response header line[m
[31m-in 304 responses sent by ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без параметра --with-debug;[m
[31m-ошибка появилась в 0.8.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without the --with-debug option;[m
[31m-the bug had appeared in 0.8.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр "unix:" в директиве set_real_ip_from неправильно наследовался[m
[31m-с предыдущего уровня.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "unix:" parameter of the "set_real_ip_from" directive inherited[m
[31m-incorrectly from previous level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в resolver'е при определении пустого имени.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in resolving empty name.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.23" date="11.11.2009">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь SSL/TLS renegotiation запрещён.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now SSL/TLS renegotiation is disabled.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-listen unix domain сокет не наследовался во время обновления без перерыва.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-listen unix domain socket did not inherit while online upgrade.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр "unix:" в директиве set_real_ip_from не работал без ещё[m
[31m-одной директивы с любым IP-адресом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "unix:" parameter of the "set_real_ip_from" directive did not without[m
[31m-yet another directive with any IP address.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-segmentation fault и зацикливания в resolver'е.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault and infinite looping in resolver.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в resolver'е.<br/>[m
[31m-Спасибо Артёму Бохану.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in resolver.<br/>[m
[31m-Thanks to Artem Bokhan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.22" date="03.11.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_bind, fastcgi_bind и memcached_bind.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_bind", "fastcgi_bind", and "memcached_bind" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы access и deny поддерживают IPv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access" and the "deny" directives support IPv6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива set_real_ip_from поддерживает IPv6 адреса в заголовках запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set_real_ip_from" directive supports IPv6 addresses in request headers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр "unix:" в директиве set_real_ip_from.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "unix:" parameter of the "set_real_ip_from" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не удалял unix domain сокет после тестирования конфигурации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not delete unix domain socket after configuration testing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx удалял unix domain сокет во время обновления без перерыва.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx deleted unix domain socket while online upgrade.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-оператор "!-x" не работал.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "!-x" operator did not work.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault[m
[31m-при использовании limit_rate в HTTPS сервере.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if limit_rate was used in HTTPS server.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при записи в лог переменной $limit_rate[m
[31m-в рабочем процессе происходил segmentation fault.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-while $limit_rate logging.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если внутри блока server не было директивы listen;[m
[31m-ошибка появилась в 0.8.21.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if there was no "listen" directive in "server" block;[m
[31m-the bug had appeared in 0.8.21.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.21" date="26.10.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь ключ -V показывает статус поддержки TLS SNI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "-V" switch shows TLS SNI support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen модуля HTTP поддерживает unix domain сокеты.<br/>[m
[31m-Спасибо Hongli Lai.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive of the HTTP module supports unix domain sockets.<br/>[m
[31m-Thanks to Hongli Lai.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр "default_server" в директиве listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "default_server" parameter of the "listen" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь параметр "default" не обязателен для установки параметров listen-сокета.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a "default" parameter is not required to set listen socket options.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал даты в 2038 году на 32-битных платформах;[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support dates in 2038 year on 32-bit platforms;[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.20" date="14.10.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию используются следующие шифры SSL: "HIGH:!ADH:!MD5".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now default SSL ciphers are "HIGH:!ADH:!MD5".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module не показывал последний слэш для линков[m
[31m-на каталоги;[m
[31m-ошибка появилась в 0.7.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not show the trailing slash in links to[m
[31m-a directory;[m
[31m-the bug had appeared in 0.7.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не закрывал лог, заданный параметром конфигурации --error-log-path;[m
[31m-ошибка появилась в 0.7.53.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not close a log file set by the --error-log-path configuration option;[m
[31m-the bug had appeared in 0.7.53.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не считал запятую разделителем в строке "Cache-Control" в[m
[31m-заголовке ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not treat a comma as separator in the "Cache-Control" backend response[m
[31m-header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог не создать временный файл, файл в кэше или файл[m
[31m-с помощью директив proxy/fastcgi_store, если рабочий процесс не имел[m
[31m-достаточно прав для работы с каталогами верхнего уровня.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might not create temporary file, a cache file, or[m
[31m-"proxy/fastcgi_store"d file if a worker had no enough access rights[m
[31m-for top level directories.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "Set-Cookie" и "P3P" в заголовке ответа FastCGI-сервера не скрывались[m
[31m-при кэшировании, если не использовались директивы fastcgi_hide_header[m
[31m-с любыми параметрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Set-Cookie" and "P3P" FastCGI response header lines were not hidden[m
[31m-while caching if no "fastcgi_hide_header" directives were used with[m
[31m-any parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неверно считал размер кэша на диске.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx counted incorrectly disk cache size.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.19" date="06.10.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь протокол SSLv2 по умолчанию запрещён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now SSLv2 protocol is disabled by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию используются следующие шифры SSL:[m
[31m-"ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now default SSL ciphers are "ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива limit_req не работала;[m
[31m-ошибка появилась в 0.8.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "limit_req" directive did not work;[m
[31m-the bug had appeared in 0.8.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.18" date="06.10.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива read_ahead.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "read_ahead" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно использовать несколько директив perl_modules.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now several "perl_modules" directives may be used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы limit_req_log_level и limit_conn_log_level.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_req_log_level" and "limit_conn_log_level" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь директива limit_req соответствует алгоритму leaky bucket.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now "limit_req" directive conforms to the leaky bucket algorithm.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на Linux/sparc.<br/>[m
[31m-Спасибо Marcus Ramberg.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on Linux/sparc.<br/>[m
[31m-Thanks to Marcus Ramberg.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx слал символ '\0' в строке "Location" в заголовке в ответе на запрос[m
[31m-MKCOL.<br/>[m
[31m-Спасибо Xie Zhenye.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx sent '\0' in a "Location" response header line on MKCOL request.<br/>[m
[31m-Thanks to Xie Zhenye.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-вместо кода ответа 499 в лог записывался код 0;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-zero status code was logged instead of 499 status code;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.17" date="28.09.2009">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь символы "/../" запрещены в строке "Destination" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now "/../" are disabled in "Destination" request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь значение переменной $host всегда в нижнем регистре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now $host variable value is always low case.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_session_id.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_session_id variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.16" date="22.09.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_transparency.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_transparency" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "addition_types" была неверно названа "addtion_types".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"addition_types" directive was incorrectly named "addtion_types".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-порчи кэша resolver'а.<br/>[m
[31m-Спасибо Matthew Dempsky.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-resolver cache poisoning.<br/>[m
[31m-Thanks to Matthew Dempsky.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти в resolver'е.<br/>[m
[31m-Спасибо Matthew Dempsky.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak in resolver.<br/>[m
[31m-Thanks to Matthew Dempsky.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-неверная строка запроса в переменной $request записывалась в access_log[m
[31m-только при использовании error_log на уровне info или debug.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-invalid request line in $request variable was written in access_log[m
[31m-only if error_log was set to "info" or "debug" level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в поддержке альфа-канала PNG в модуле ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in PNG alpha-channel support in the ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx всегда добавлял строку "Vary: Accept-Encoding" в заголовок ответа,[m
[31m-если обе директивы gzip_static и gzip_vary были включены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx always added "Vary: Accept-Encoding" response header line,[m
[31m-if both "gzip_static" and "gzip_vary" were on.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в поддержке кодировки UTF-8 директивой try_files в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in UTF-8 encoding support by "try_files" directive in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании post_action;[m
[31m-ошибка появилась в 0.8.11.<br/>[m
[31m-Спасибо Игорю Артемьеву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in "post_action" directive usage;[m
[31m-the bug had appeared in 0.8.11.<br/>[m
[31m-Thanks to Igor Artemiev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.15" date="14.09.2009">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного запроса[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Chris Ries.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-while specially crafted request handling.<br/>[m
[31m-Thanks to Chris Ries.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если были описаны имена .domain.tld, .sub.domain.tld и .domain-some.tld,[m
[31m-то имя .sub.domain.tld попадало под маску .domain.tld.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if names .domain.tld, .sub.domain.tld, and .domain-some.tld were defined,[m
[31m-then the name .sub.domain.tld was matched by .domain.tld.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в поддержке прозрачности в модуле ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in transparency support in the ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в файловом AIO.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in file AIO.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании X-Accel-Redirect;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in X-Accel-Redirect usage;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании встроенного перла;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in embedded perl module;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.14" date="07.09.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-устаревший закэшированный запрос мог залипнуть в состоянии "UPDATING".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an expired cached response might stick in the "UPDATING" state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании error_log на уровне info или debug[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Сергею Боченкову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if error_log was set to info or debug level.<br/>[m
[31m-Thanks to Sergey Bochenkov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании встроенного перла;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in embedded perl module;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не перенаправляла ошибку 413;[m
[31m-ошибка появилась в 0.6.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "error_page" directive did not redirect a 413 error;[m
[31m-the bug had appeared in 0.6.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.13" date="31.08.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве "aio sendfile";[m
[31m-ошибка появилась в 0.8.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "aio sendfile" directive;[m
[31m-the bug had appeared in 0.8.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без параметра --with-file-aio на FreeBSD;[m
[31m-ошибка появилась в 0.8.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without the --with-file-aio option on FreeBSD;[m
[31m-the bug had appeared in 0.8.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.12" date="31.08.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр sendfile в директиве aio во FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile" parameter in the "aio" directive on FreeBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании try_files;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in try_files;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании memcached;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memcached;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-<changes ver="0.8.11" date="28.08.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива "gzip_disable msie6" не запрещает сжатие для[m
[31m-<nobr>MSIE 6.0 SV1.</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now directive "gzip_disable msie6" does not disable gzipping for[m
[31m-<nobr>MSIE 6.0 SV1.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка файлового AIO во FreeBSD и Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-file AIO support on FreeBSD and Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio_alignment.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio_alignment" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.10" date="24.08.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечек памяти при использовании базы GeoIP City.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leaks if GeoIP City database was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при копировании временных файлов в постоянное место хранения;[m
[31m-ошибка появилась в 0.8.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in copying temporary files to permanent storage area;[m
[31m-the bug had appeared in 0.8.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.9" date="17.08.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь стартовый загрузчик кэша работает в отдельном процесс;[m
[31m-это должно улучшить обработку больших кэшей.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the start cache loader runs in a separate process;[m
[31m-this should improve large caches handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь временные файлы и постоянное место хранения могут располагаться[m
[31m-на разных файловых системах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now temporary files and permanent storage area may reside at[m
[31m-different file systems.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.8" date="10.08.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке заголовков ответа, разделённых в FastCGI-записях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in handling FastCGI headers split in records.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если запрос обрабатывался в двух проксированных или FastCGI location'ах[m
[31m-и в первом из них использовалось кэширование,[m
[31m-то в рабочем процессе происходил segmentation fault;[m
[31m-ошибка появилась в 0.8.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if a request was handled in two proxied or FastCGIed locations[m
[31m-and a caching was enabled in the first location;[m
[31m-the bug had appeared in 0.8.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.7" date="27.07.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-минимальная поддерживаемая версия OpenSSL&mdash;0.9.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-minimum supported OpenSSL version is 0.9.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр ask директивы ssl_verify_client изменён на параметр optional[m
[31m-и теперь он проверяет клиентский сертификат, если он был предложен.<br/>[m
[31m-Спасибо Brice Figureau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ask" parameter of the "ssl_verify_client" directive was changed[m
[31m-to the "optional" parameter and now it checks a client certificate if it was[m
[31m-offered.<br/>[m
[31m-Thanks to Brice Figureau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_client_verify.<br/>[m
[31m-Спасибо Brice Figureau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_verify variable.<br/>[m
[31m-Thanks to Brice Figureau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_crl.<br/>[m
[31m-Спасибо Brice Figureau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_crl" directive.<br/>[m
[31m-Thanks to Brice Figureau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр proxy директивы geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy" parameter of the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter поддерживает переменные для задания размеров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter" directive supports variables for setting size.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-использование переменной $ssl_client_cert портило память;[m
[31m-ошибка появилась в 0.7.7.<br/>[m
[31m-Спасибо Сергею Журавлёву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_cert variable usage corrupted memory;[m
[31m-the bug had appeared in 0.7.7.<br/>[m
[31m-Thanks to Sergey Zhuravlev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass_header и fastcgi_pass_header" не передавали клиенту[m
[31m-строки "X-Accel-Redirect", "X-Accel-Limit-Rate", "X-Accel-Buffering" и[m
[31m-"X-Accel-Charset" из заголовка ответа бэкенда.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"proxy_pass_header" and "fastcgi_pass_header" directives did not pass to[m
[31m-a client the "X-Accel-Redirect", "X-Accel-Limit-Rate", "X-Accel-Buffering",[m
[31m-and "X-Accel-Charset" lines from backend response header.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке строк "Last-Modified" и "Accept-Ranges" в заголовке ответа бэкенда;[m
[31m-ошибка появилась в 0.7.44.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in handling "Last-Modified" and "Accept-Ranges" backend response header lines;[m
[31m-the bug had appeared in 0.7.44.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "[alert] zero size buf" при получении пустых ответы в подзапросах;[m
[31m-ошибка появилась в 0.8.5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error if subrequest returns an empty response;[m
[31m-the bug had appeared in 0.8.5.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.6" date="20.07.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_geoip_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_geoip_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-XSLT-фильтр мог выдавать ошибку "not well formed XML document" для[m
[31m-правильного документа.<br/>[m
[31m-Спасибо Kuramoto Eiji.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-XSLT filter may fail with message "not well formed XML document"[m
[31m-for valid XML document.<br/>[m
[31m-Thanks to Kuramoto Eiji.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в MacOSX, Cygwin и nginx/Windows при проверке location'ов, заданных[m
[31m-регулярным выражением, теперь всегда делается сравнение без учёта[m
[31m-регистра символов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now in MacOSX, Cygwin, and nginx/Windows locations given by a regular[m
[31m-expression are always tested in case insensitive mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует точки в конце URI.<br/>[m
[31m-Спасибо Hugo Leisink.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores trailing dots in URI.<br/>[m
[31m-Thanks to Hugo Leisink.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-имя файла указанного в --conf-path игнорировалось при установке;[m
[31m-ошибка появилась в 0.6.6.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-name of file specified in --conf-path was not honored during installation;[m
[31m-the bug had appeared in 0.6.6.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.5" date="13.07.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx разрешает подчёркивания в методе запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx allows underscores in a request method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP Basic-аутентификации на Windows[m
[31m-для неверных имени/пароля возвращалась 500-ая ошибка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a 500 error code was returned for invalid login/password while HTTP[m
[31m-Basic authentication on Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы модуля ngx_http_perl_module не работали в подзапросах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module responses did not work in subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_limit_req_module.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in ngx_http_limit_req_module.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.4" date="22.06.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http-cache;[m
[31m-ошибка появилась в 0.8.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http-cache;[m
[31m-the bug had appeared in 0.8.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.3" date="19.06.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_cache_status.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_cache_status variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на MacOSX 10.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOSX 10.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http-cache;[m
[31m-ошибка появилась в 0.8.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http-cache;[m
[31m-the bug had appeared in 0.8.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался перехват 401 ошибки от бэкенда и бэкенд[m
[31m-не возвращал строку "WWW-Authenticate" в заголовке ответа,[m
[31m-то в рабочем процессе происходил segmentation fault.<br/>[m
[31m-Спасибо Евгению Мычло.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if a backend 401 error was intercepted and the backend did not set[m
[31m-the "WWW-Authenticate" response header line.<br/>[m
[31m-Thanks to Eugene Mychlo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.2" date="15.06.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во взаимодействии open_file_cache и proxy/fastcgi кэша на старте.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in open_file_cache and proxy/fastcgi cache interaction on start up.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-open_file_cache мог кэшировать открытые файлы очень долго;[m
[31m-ошибка появилась в 0.7.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-open_file_cache might cache open file descriptors too long;[m
[31m-the bug had appeared in 0.7.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.1" date="08.06.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр updating в директивах proxy_cache_use_stale и fastcgi_cache_use_stale.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "updating" parameter in "proxy_cache_use_stale" and[m
[31m-"fastcgi_cache_use_stale" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "If-Modified-Since", "If-Range" и им подобные в заголовке запроса[m
[31m-клиента передавались бэкенду при кэшировании, если не использовалась[m
[31m-директива proxy_set_header с любыми параметрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Modified-Since", "If-Range", etc. client request header lines[m
[31m-were passed to backend while caching if no "proxy_set_header" directive[m
[31m-was used with any parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "Set-Cookie" и "P3P" в заголовке ответа бэкенда не скрывались[m
[31m-при кэшировании, если не использовались директивы[m
[31m-proxy_hide_header/fastcgi_hide_header с любыми параметрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Set-Cookie" and "P3P" response header lines were not hidden while caching[m
[31m-if no "proxy_hide_header/fastcgi_hide_header" directives were used with[m
[31m-any parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_image_filter_module не понимал формат GIF87a.<br/>[m
[31m-Спасибо Денису Ильиных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_image_filter_module did not support GIF87a format.<br/>[m
[31m-Thanks to Denis Ilyinyh.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris 10 и более ранних;[m
[31m-ошибка появилась в 0.7.56.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built modules on Solaris 10 and early;[m
[31m-the bug had appeared in 0.7.56.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.0" date="02.06.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива keepalive_requests.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "keepalive_requests" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate_after.<br/>[m
[31m-Спасибо Ivan Debnar.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate_after" directive.<br/>[m
[31m-Thanks to Ivan Debnar.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-XSLT-фильтр не работал в подзапросах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-XLST filter did not work in subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-обработке относительных путей в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in relative paths handling in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в proxy_store, fastcgi_store, proxy_cache и fastcgi_cache в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in proxy_store, fastcgi_store, proxy_cache, and fastcgi_cache in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок выделения памяти.<br/>[m
[31m-Спасибо Максиму Дунину и Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation error handling.<br/>[m
[31m-Thanks to Maxim Dounin and Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.59" date="25.05.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache_methods и fastcgi_cache_methods.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_methods" and "fastcgi_cache_methods" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.7.25.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.7.25.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной $request_body[m
[31m-в рабочем процессе происходил segmentation fault,[m
[31m-если в запросе не было тела;[m
[31m-ошибка появилась в 0.7.58.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-<nobr>if a request</nobr> had no body and the $request_body[m
[31m-variable was used;<br/>[m
[31m-the bug had appeared in 0.7.58.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL-модули могли не собираться на Solaris и Linux;[m
[31m-ошибка появилась в 0.7.56.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the SSL modules might not built on Solaris and Linux;<br/>[m
[31m-the bug had appeared in 0.7.56.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы модуля ngx_http_xslt_filter_module не обрабатывались[m
[31m-SSI-, charset- и gzip-фильтрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_xslt_filter_module responses were not handled by SSI, charset,[m
[31m-and gzip filters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива charset не ставила кодировку для ответов модуля[m
[31m-ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "charset" directive did not set a charset to ngx_http_gzip_static_module[m
[31m-responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.58" date="18.05.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen почтового прокси-сервера поддерживает IPv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "listen" directive of the mail proxy module supports IPv6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_jpeg_quality.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_jpeg_quality" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива client_body_in_single_buffer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "client_body_in_single_buffer" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $request_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_body variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_autoindex_module в ссылках на имена файлов,[m
[31m-содержащих символ ":".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in ngx_http_autoindex_module in file name links[m
[31m-having a ":" symbol in the name.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-процедура "make upgrade" не работала;[m
[31m-ошибка появилась в 0.7.53.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"make upgrade" procedure did not work;[m
[31m-the bug had appeared in 0.7.53.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.57" date="12.05.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении ошибок модуля ngx_http_image_filter_module[m
[31m-в именованный location в рабочем процессе происходил floating-point fault;[m
[31m-ошибка появилась в 0.7.56.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a floating-point fault occurred in worker process,[m
[31m-if the ngx_http_image_filter_module errors were redirected to named location;[m
[31m-the bug had appeared in 0.7.56.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.56" date="11.05.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows поддерживает IPv6 в директиве listen модуля HTTP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows supports IPv6 in a "listen" directive of the HTTP module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.55" date="06.05.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры http_XXX в директивах proxy_cache_use_stale[m
[31m-и fastcgi_cache_use_stale не работали.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the http_XXX parameters in "proxy_cache_use_stale" and[m
[31m-"fastcgi_cache_use_stale" directives did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-fastcgi кэш не кэшировал ответы, состоящие только из заголовка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fastcgi cache did not cache header only responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "select() failed (9: Bad file descriptor)" в nginx/Unix[m
[31m-и "select() failed (10038: ...)" в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of "select() failed (9: Bad file descriptor)" error in nginx/Unix[m
[31m-and "select() failed (10038: ...)" error in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы debug_connection[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.7.54.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if an "debug_connection" directive was used;[m
[31m-the bug had appeared in 0.7.54.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в сборке модуля ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fix ngx_http_image_filter_module building errors.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-файлы больше 2G не передавались с использованием $r->sendfile.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files bigger than 2G could not be transferred using $r->sendfile.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.54" date="01.05.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ignore_headers и fastcgi_ignore_headers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ignore_headers" and "fastcgi_ignore_headers" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменных "open_file_cache_errors on"[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.7.53.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if an "open_file_cache_errors off" directive was used;[m
[31m-the bug had appeared in 0.7.53.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "port_in_redirect off" не работала;[m
[31m-ошибка появилась в 0.7.39.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "port_in_redirect off" directive did not work;[m
[31m-the bug had appeared in 0.7.39.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-улучшение обработки ошибок метода select.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-improve handling of "select" method errors.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "select() failed (10022: ...)" в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of "select() failed (10022: ...)" error in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в текстовых сообщениях об ошибках в nginx/Windows;[m
[31m-ошибка появилась в 0.7.53.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error text descriptions in nginx/Windows;[m
[31m-the bug had appeared in 0.7.53.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.53" date="27.04.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь лог, указанный в --error-log-path, создаётся с самого начала работы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a log set by --error-log-path is created from the very start-up.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь ошибки и предупреждения при старте записываются в error_log[m
[31m-и выводятся на stderr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the start up errors and warnings are outputted to an error_log and stderr.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-при сборке с пустым параметром --prefix= nginx использует как префикс каталог,[m
[31m-в котором он был запущен.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the empty --prefix= configure parameter forces nginx to use a directory[m
[31m-where it was run as prefix.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -p.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -p switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -s на Unix-платформах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -s switch on Unix platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключи -? и -h.<br/>[m
[31m-Спасибо Jerome Loyet.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -? and -h switches.<br/>[m
[31m-Thanks to Jerome Loyet.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь ключи можно задавать в сжатой форме.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now switches may be set in condensed form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не работал, если файл конфигурации был задан ключом -c.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows did not work if configuration file was given by the -c switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив proxy_store, fastcgi_store,[m
[31m-proxy_cache или fastcgi_cache временные файлы могли не удаляться.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-temporary files might be not removed if the "proxy_store", "fastcgi_store",[m
[31m-"proxy_cache", or "fastcgi_cache" were used.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в заголовке Auth-Method запроса серверу аутентификации почтового[m
[31m-прокси-сервера передавалось неверное значение;[m
[31m-ошибка появилась в 0.7.34.<br/>[m
[31m-Спасибо Simon Lecaille.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an incorrect value was passed to mail proxy authentication server[m
[31m-in "Auth-Method" header line;[m
[31m-the bug had appeared<br/>[m
[31m-in 0.7.34.<br/>[m
[31m-Thanks to Simon Lecaille.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при логгировании на Linux не писались текстовые описания системных ошибок;[m
[31m-ошибка появилась в 0.7.45.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-system error text descriptions were not logged on Linux;<br/>[m
[31m-the bug had appeared in 0.7.45.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_cache_min_uses не работала.<br/>[m
[31m-Спасибо Андрею Воробьёву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_cache_min_uses" directive did not work.<br/>[m
[31m-Thanks to Andrew Vorobyoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.52" date="20.04.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-первая бинарная версия под Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the first native Windows binary release.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-корректная обработка метода HEAD при кэшировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in processing HEAD method while caching.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-корректная обработка строк "If-Modified-Since", "If-Range" и им подобных[m
[31m-в заголовке запроса клиента при кэшировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in processing the "If-Modified-Since", "If-Range", etc. client request[m
[31m-header lines while caching.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь строки "Set-Cookie" и "P3P" скрываются в заголовке ответа[m
[31m-для закэшированных ответов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "Set-Cookie" and "P3P" header lines are hidden in cacheable responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_perl_module и perl[m
[31m-поддерживал потоки, то при выходе основного процесса[m
[31m-могла выдаваться ошибка "panic: MUTEX_LOCK".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with the ngx_http_perl_module and with a perl which[m
[31m-supports threads, then during a master process exit[m
[31m-the message "panic: MUTEX_LOCK" might be issued.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http-cache;[m
[31m-ошибка появилась в 0.7.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http-cache;[m
[31m-the bug had appeared in 0.7.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.7.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.7.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.51" date="12.04.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива try_files поддерживает код ответа в последнем параметре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive supports a response code in the fallback parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь в директиве return можно использовать любой код ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now any response code can be used in the "return" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page делала внешний редирект без строки запроса;[m
[31m-ошибка появилась в 0.7.44.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive made an external redirect without query string;[m
[31m-the bug had appeared in 0.7.44.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если сервера слушали на нескольких явно описанных адресах,[m
[31m-то виртуальные сервера могли не работать;[m
[31m-ошибка появилась в 0.7.39.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if servers listened on several defined explicitly addresses,[m
[31m-then virtual servers might not work;[m
[31m-the bug had appeared in 0.7.39.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.50" date="06.04.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные $arg_... не работали;[m
[31m-ошибка появилась в 0.7.49.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $arg_... variables did not work;[m
[31m-the bug had appeared in 0.7.49.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.49" date="06.04.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменных $arg_...[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.7.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if the $arg_... variables were used;[m
[31m-the bug had appeared in 0.7.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.48" date="06.04.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_cache_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_key" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx учитывает при кэшировании строки "X-Accel-Expires",[m
[31m-"Expires" и "Cache-Control" в заголовке ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx takes into account the "X-Accel-Expires", "Expires", and[m
[31m-"Cache-Control" header lines in a backend response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx кэширует только ответы на запросы GET.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx caches responses for the GET requests only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_cache_key не наследовалась.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_cache_key" directive was not inherited.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные $arg_... не работали с SSI-подзапросами.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $arg_... variables did not work with SSI subrequests.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с библиотекой uclibc.<br/>[m
[31m-Спасибо Timothy Redaelli.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with uclibc library.<br/>[m
[31m-Thanks to Timothy Redaelli.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на OpenBSD;[m
[31m-ошибка появилась <nobr>в 0.7.46.</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OpenBSD;[m
[31m-the bug had <nobr>appeared in 0.7.46.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.47" date="01.04.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на FreeBSD 6 и более ранних версиях;[m
[31m-ошибка появилась в 0.7.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on FreeBSD 6 and early versions;[m
[31m-the bug had appeared in 0.7.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на MacOSX;[m
[31m-ошибка появилась в 0.7.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOSX;[m
[31m-the bug had <nobr>appeared in 0.7.46.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался параметр max_size, то cache manager мог удалить весь кэш;[m
[31m-ошибка появилась в 0.7.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "max_size" parameter was set, then the cache manager might purge[m
[31m-a whole cache;[m
[31m-the bug had appeared in 0.7.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если директивы proxy_cache/fastcgi_cache[m
[31m-и proxy_cache_valid/ fastcgi_cache_valid не были заданы на одном уровне;[m
[31m-ошибка появилась в 0.7.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if the "proxy_cache"/"fastcgi_cache" and[m
[31m-the "proxy_cache_valid"/ "fastcgi_cache_valid" were set on different levels;[m
[31m-the bug had appeared in 0.7.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault[m
[31m-при перенаправлении запроса проксированному или FastCGI-серверу[m
[31m-с помощью error_page или try_files;[m
[31m-ошибка появилась в 0.7.44.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if a request was redirected to a proxied or FastCGI server via[m
[31m-error_page or try_files;[m
[31m-the bug had appeared in 0.7.44.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.46" date="30.03.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-архив предыдущего релиза был неверным.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the previous release tarball was incorrect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.45" date="30.03.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директивы proxy_cache и proxy_cache_valid можно задавать[m
[31m-на разных уровнях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "proxy_cache" and the "proxy_cache_valid" directives can be set on[m
[31m-different levels.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр clean_time в директиве proxy_cache_path удалён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "clean_time" parameter of the "proxy_cache_path" directive is canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр max_size в директиве proxy_cache_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "max_size" parameter of the "proxy_cache_path" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-предварительная поддержка кэширования в модуле ngx_http_fastcgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_fastcgi_module preliminary cache support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при ошибках выделения в разделяемой памяти в логе указываются[m
[31m-названия директивы и зоны.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on shared memory allocation errors directive and zone names are logged.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "add_header last-modified ''" не удаляла в заголовке ответа[m
[31m-строку "Last-Modified";[m
[31m-ошибка появилась в 0.7.44.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the directive "add_header last-modified ''" did not delete a "Last-Modified"[m
[31m-response header line;[m
[31m-the bug had appeared in 0.7.44.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве auth_basic_user_file не работал относительный путь,[m
[31m-заданный строкой без переменных;[m
[31m-ошибка появилась в 0.7.44.<br/>[m
[31m-Спасибо Jerome Loyet.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a relative path in the "auth_basic_user_file" directive given without variables[m
[31m-did not work;[m
[31m-the bug had appeared in 0.7.44.<br/>[m
[31m-Thanks to Jerome Loyet.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве alias, заданной переменными[m
[31m-без ссылок на выделения в регулярных выражениях;[m
[31m-ошибка появилась в 0.7.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in an "alias" directive given using variables[m
[31m-without references to captures of regular expressions;[m
[31m-the bug had appeared in 0.7.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.44" date="23.03.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-предварительная поддержка кэширования в модуле ngx_http_proxy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_proxy_module preliminary cache support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр --with-pcre в configure.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --with-pcre option in the configure.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива try_files может быть использована на уровне server.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive is now allowed on the server block level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files неправильно обрабатывала строку запроса в последнем[m
[31m-параметре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive handled incorrectly a query string[m
[31m-in a fallback parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files могла неверно тестировать каталоги.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive might test incorrectly directories.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если для пары адрес:порт описан только один сервер, то выделения[m
[31m-в регулярных выражениях в директиве server_name не работали.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if there was a single server for given address:port pair,[m
[31m-then captures in regular expressions in a "server_name" directive did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.43" date="18.03.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-запрос обрабатывался неверно, если директива root использовала переменные;[m
[31m-ошибка появилась в 0.7.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a request was handled incorrectly, if a "root" directive used variables;[m
[31m-the bug had appeared in 0.7.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если сервер слушал на адресах типа "*", то значение переменной $server_addr[m
[31m-было "0.0.0.0";[m
[31m-ошибка появилась в 0.7.36.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a server listened on wildcard address, then the $server_addr variable[m
[31m-value was "0.0.0.0";[m
[31m-the bug had appeared in 0.7.36.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.42" date="16.03.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ошибка "Invalid argument", возвращаемая setsockopt(TCP_NODELAY) на Solaris,[m
[31m-теперь игнорируется.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "Invalid argument" error returned by setsockopt(TCP_NODELAY) on Solaris,[m
[31m-is ignored.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-при отсутствии файла, указанного в директиве auth_basic_user_file,[m
[31m-теперь возвращается ошибка 403 вместо 500.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if a file specified in a "auth_basic_user_file" directive is absent,[m
[31m-then the 403 error is returned instead of the 500 one.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic_user_file поддерживает переменные.[m
[31m-<br/>[m
[31m-Спасибо Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_basic_user_file" directive supports variables.<br/>[m
[31m-Thanks to Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen поддерживает параметр ipv6only.<br/>[m
[31m-Спасибо Zhang Hua.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive supports the "ipv6only" parameter.[m
[31m-<br/>[m
[31m-Thanks to Zhang Hua.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве alias со ссылками на выделения в регулярных выражениях;[m
[31m-ошибка появилась в 0.7.40.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in an "alias" directive with references to captures of regular expressions;[m
[31m-the bug had appeared in 0.7.40.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с Tru64 UNIX.<br/>[m
[31m-Спасибо Dustin Marquess.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with Tru64 UNIX.<br/>[m
[31m-Thanks to Dustin Marquess.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без библиотеки PCRE;[m
[31m-ошибка появилась в 0.7.41.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without PCRE library;[m
[31m-the bug had appeared in 0.7.41.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.41" date="11.03.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если в server_name или location были выделения в регулярных выражениях;[m
[31m-ошибка появилась в 0.7.40.<br/>[m
[31m-Спасибо Владимиру Сопоту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if a "server_name" or a "location" directives had captures[m
[31m-in regular expressions;[m
[31m-the issue had appeared in 0.7.40.<br/>[m
[31m-Thanks to Vladimir Sopot.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.40" date="09.03.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива location поддерживает выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "location" directive supports captures in regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву alias с ссылками на выделения в регулярных выражениях[m
[31m-можно использовать внутри location'а, заданного регулярным выражением[m
[31m-с выделениями.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "alias" directive with capture references may be used inside[m
[31m-a location given by a regular expression with captures.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" directive supports captures in regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module не показывал последний слэш для каталогов[m
[31m-на файловой системе XFS;[m
[31m-ошибка появилась в 0.7.15.<br/>[m
[31m-Спасибо Дмитрию Кузьменко.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not show the trailing slash in directories[m
[31m-on XFS filesystem;[m
[31m-the issue had appeared in 0.7.15.<br/>[m
[31m-Thanks to Dmitry Kuzmenko.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.39" date="02.03.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включённом сжатии большие ответы с использованием SSI могли зависать;[m
[31m-ошибка появилась в 0.7.28.<br/>[m
[31m-Спасибо Артёму Бохану.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large response with SSI might hang, if gzipping was enabled;[m
[31m-the bug had appeared in 0.7.28.<br/>[m
[31m-Thanks to Artem Bokhan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании коротких статических вариантов в директиве try_files[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if short static variants are used in a "try_files" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.38" date="23.02.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-логгирование ошибок аутентификации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-authentication failures logging.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-имя/пароль, заданные в auth_basic_user_file, игнорировались после нечётного[m
[31m-числа пустых строк.<br/>[m
[31m-Спасибо Александру Загребину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-name/password in auth_basic_user_file were ignored after odd number[m
[31m-of empty lines.<br/>[m
[31m-Thanks to Alexander Zagrebin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании длинного пути в unix domain сокете[m
[31m-в главном процессе происходил segmentation fault;[m
[31m-ошибка появилась в 0.7.36.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a master process,[m
[31m-if long path was used in unix domain socket;[m
[31m-the bug had appeared in 0.7.36.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.37" date="21.02.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы, использующие upstream'ы, не работали;[m
[31m-ошибка появилась в 0.7.36.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-directives using upstreams did not work;[m
[31m-the bug had appeared in 0.7.36.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.36" date="21.02.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-предварительная поддержка IPv6;[m
[31m-директива listen модуля HTTP поддерживает IPv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a preliminary IPv6 support;[m
[31m-the "listen" directive of the HTTP module supports IPv6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $ancient_browser не работала для браузеров, заданных[m
[31m-директивами modern_browser.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ancient_browser variable did not work for browsers[m
[31m-preset by a "modern_browser" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.35" date="16.02.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ssl_engine не использовала SSL-акселератор[m
[31m-для асимметричных шифров.<br/>[m
[31m-Спасибо Marcin Gozdalik.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "ssl_engine" directive did not use a SSL-accelerator[m
[31m-for asymmetric ciphers.<br/>[m
[31m-Thanks to Marcin Gozdalik.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files выставляла MIME-type, исходя из расширения[m
[31m-первоначального запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "try_files" directive set MIME type depending on an[m
[31m-original request extension.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах server_name, valid_referers и map[m
[31m-неправильно обрабатывались имена вида "*domain.tld",[m
[31m-если использовались маски вида ".domain.tld" и ".subdomain.domain.tld";[m
[31m-ошибка появилась в 0.7.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"*domain.tld" names were handled incorrectly in[m
[31m-"server_name", "valid_referers", and "map" directives,[m
[31m-if ".domain.tld" and ".subdomain.domain.tld" wildcards were used;[m
[31m-<nobr>the bug had</nobr> appeared in 0.7.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.34" date="10.02.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр off в директиве if_modified_since.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "off" parameter of the "if_modified_since" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь после команды XCLIENT nginx посылает команду HELO/EHLO.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx sends an HELO/EHLO command after a XCLIENT command.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка Microsoft-специфичного режима[m
[31m-<nobr>"AUTH LOGIN with User Name"</nobr>[m
[31m-в почтовом прокси-сервере.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Microsoft specific "AUTH LOGIN with User Name" mode support[m
[31m-in mail proxy server.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве rewrite, возвращающей редирект, старые аргументы присоединялись[m
[31m-к новым через символ "?" вместо "&amp;";<br/>[m
[31m-ошибка появилась в 0.1.18.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a redirect rewrite directive original arguments were concatenated with[m
[31m-new arguments by a "?" rather than an "&amp;";<br/>[m
[31m-the bug had appeared in 0.1.18.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на AIX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on AIX.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.33" date="02.02.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если на запрос с телом возвращался редирект, то ответ мог быть двойным[m
[31m-при использовании методов epoll или rtsig.<br/>[m
[31m-Спасибо Eden Li.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a double response might be returned if the epoll or rtsig methods are used[m
[31m-and a redirect was returned to a request with body.<br/>[m
[31m-Thanks to Eden Li.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для некоторых типов редиректов в переменной $sent_http_location[m
[31m-было пустое значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $sent_http_location variable was empty for some redirects types.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы resolver в SMTP прокси-сервере[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if "resolver" directive was used in SMTP proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.32" date="26.01.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь в директиве try_files можно явно указать проверку каталога.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a directory existence testing can be set explicitly[m
[31m-in the "try_files" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-fastcgi_store не всегда сохранял файлы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fastcgi_store stored files not always.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в гео-диапазонах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in geo ranges.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки выделения больших блоков в разделяемой памяти,[m
[31m-если nginx был собран без отладки.<br/>[m
[31m-Спасибо Андрею Квасову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in shared memory allocations if nginx was built without debugging.<br/>[m
[31m-Thanks to Andrey Kvasov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.31" date="19.01.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива try_files проверяет только файлы, игнорируя каталоги.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "try_files" directive tests files only and ignores directories.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_split_path_info.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_split_path_info" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в поддержке строки "Expect" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in an "Expect" request header line support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в гео-диапазонах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in geo ranges.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при отсутствии ответа ngx_http_memcached_module возвращал[m
[31m-в теле ответа строку "END" вместо 404-ой страницы по умолчанию;[m
[31m-ошибка появилась в 0.7.18.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a miss case ngx_http_memcached_module returned the "END" line[m
[31m-as response body instead of default 404 page body;[m
[31m-the bug had appeared in 0.7.18.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании SMTP nginx выдавал сообщение[m
[31m-<nobr>"250 2.0.0 OK"</nobr> вместо "235 2.0.0 OK";[m
[31m-ошибка появилась в 0.7.22.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while SMTP proxying nginx issued message[m
[31m-"250 2.0.0 OK" instead of "235 2.0.0 OK";[m
[31m-the bug had appeared in 0.7.22.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.30" date="24.12.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе происходил segmentation fault,[m
[31m-если в директивах fastcgi_pass или proxy_pass[m
[31m-использовались переменные и имя хоста должно было резолвиться;[m
[31m-ошибка появилась в 0.7.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if variables were used in the "fastcgi_pass" or "proxy_pass" directives[m
[31m-and host name must be resolved;[m
[31m-the bug had appeared in 0.7.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.29" date="24.12.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы fastcgi_pass и proxy_pass не поддерживали переменные[m
[31m-при использовании unix domain сокетов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_pass" and "proxy_pass" directives did not support[m
[31m-variables if unix domain sockets were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в обработке подзапросов;[m
[31m-ошибки появились в 0.7.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in subrequest processing;[m
[31m-the bugs had appeared in 0.7.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ "100 Continue" выдавался для запросов версии HTTP/1.0;<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "100 Continue" response was issued for HTTP/1.0 requests;<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в выделении памяти в модуле ngx_http_gzip_filter_module под Cygwin.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation in the ngx_http_gzip_filter_module on Cygwin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.28" date="22.12.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в выделении памяти в модуле ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation in the ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-значения по умолчанию для директивы gzip_buffers изменены с 4 4k/8k[m
[31m-на 32 4k или 16 8k.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the default "gzip_buffers" directive values have been changed[m
[31m-to 32 4k or 16 8k from 4 4k/8k.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.27" date="15.12.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива try_files.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_pass поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "fastcgi_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива geo может брать адрес из переменной.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the $geo variable may get an address from a variable.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь модификатор location'а можно указывать без пробела перед названием.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a location's modifier may be used without space before name.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_length.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_length variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь директива add_header не добавляет пустое значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a "add_header" directive does not add an empty value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при запросе файла нулевой длины nginx закрывал соединение, ничего не передав;[m
[31m-ошибка появилась в 0.7.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if zero length static file was requested, then nginx just closed connection;[m
[31m-the bug had appeared in 0.7.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод MOVE не мог перемещать файл в несуществующий каталог.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a MOVE method could not move file in non-existent directory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в сервере не был описан ни один именованный location,[m
[31m-но такой location использовался в директиве error_page,[m
[31m-то в рабочем процессе происходил segmentation fault.<br/>[m
[31m-Спасибо Сергею Боченкову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if no one named location was defined in server,[m
[31m-but some one was used in an error_page directive.<br/>[m
[31m-Thanks to Sergey Bochenkov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.26" date="08.12.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке подзапросов;[m
[31m-ошибка появилась в 0.7.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in subrequest processing;[m
[31m-the bug had appeared in 0.7.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.25" date="08.12.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в обработке подзапросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in subrequest processing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь разрешаются POST'ы без строки "Content-Length" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now POSTs without "Content-Length" header line are allowed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь директивы limit_req и limit_conn указывают причину запрета запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "limit_req" and "limit_conn" directives log a prohibition reason.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в параметре delete директивы geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "delete" parameter of the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.24" date="01.12.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if_modified_since.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if_modified_since" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не обрабатывал ответ FastCGI-сервера,[m
[31m-если перед ответом сервер передавал много сообщений в stderr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not process a FastCGI server response,[m
[31m-if the server send too many messages to stderr before response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные "$cookie_..." не работали в SSI and в перловом модуле.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$cookie_..." variables did not work in the SSI and the perl module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.23" date="27.11.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры delete и ranges в директиве geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "delete" and "ranges" parameters in the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ускорение загрузки geo-базы с большим числом значений.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-speeding up loading of geo base with large number of values.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение памяти, необходимой для загрузки geo-базы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-decrease of memory required for geo base load.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.22" date="20.11.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр none в директиве smtp_auth.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "none" parameter in the "smtp_auth" directive.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$cookie_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$cookie_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива directio не работала с файловой системой XFS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" directive did not work in XFS filesystem.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-resolver не понимал большие DNS-ответы.<br/>[m
[31m-Спасибо Zyb.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the resolver did not understand big DNS responses.<br/>[m
[31m-Thanks to Zyb.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.21" date="11.11.2008">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменения в модуле ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Changes in the ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка EXSLT в модуле ngx_http_xslt_module.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the EXSLT support in the ngx_http_xslt_module.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-совместимость с glibc 2.3.<br/>[m
[31m-Спасибо Eric Benson и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with glibc 2.3.<br/>[m
[31m-Thanks to Eric Benson and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запускался на MacOSX 10.4 и более ранних;[m
[31m-ошибка появилась в 0.7.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not run on MacOSX 10.4 and earlier;[m
[31m-the bug had appeared in 0.7.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.20" date="10.11.2008">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменения в модуле ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Changes in the ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на платформах sparc и ppc рабочие процессы могли выходить по сигналу SIGBUS;[m
[31m-ошибка появилась в 0.7.3.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes might exit on a SIGBUS signal on sparc and ppc platforms;[m
[31m-the bug had appeared in 0.7.3.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы вида "proxy_pass http://host/some:uri" не работали;[m
[31m-ошибка появилась в 0.7.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass http://host/some:uri" directives did not work;[m
[31m-the bug had appeared in 0.7.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTPS запросы могли завершаться с ошибкой "bad write retry".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in HTTPS mode requests might fail with the "bad write retry" error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_secure_link_module не работал внутри location'ов[m
[31m-с именами меньше 3 символов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_secure_link_module did not work inside locations,[m
[31m-whose names are less than 3 characters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $server_addr могла не иметь значения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$server_addr variable might have no value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.19" date="13.10.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-обновление номера версии.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-version number update.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.18" date="13.10.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива underscores_in_headers;[m
[31m-теперь nginx по умолчанию не разрешает подчёркивания в именах строк[m
[31m-в заголовке запроса клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "underscores_in_headers" directive;[m
[31m-now nginx does not allows underscores in a client request header line names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_secure_link_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_secure_link_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива real_ip_header поддерживает любой заголовок.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "real_ip_header" directive supports any header.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива log_subrequest.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_subrequest" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $realpath_root.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $realpath_root variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры http_502 и http_504 в директиве proxy_next_upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "http_502" and "http_504" parameters of the "proxy_next_upstream" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр http_503 в директивах proxy_next_upstream или fastcgi_next_upstream[m
[31m-не работал.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "http_503" parameter of the "proxy_next_upstream" or[m
[31m-"fastcgi_next_upstream" directives did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог выдавать строку "Transfer-Encoding: chunked" для запросов  HEAD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might send a "Transfer-Encoding: chunked" header line for HEAD requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь accept-лимит зависит от числа worker_connections.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now accept threshold depends on worker_connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.17" date="15.09.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio теперь работает на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "directio" directive works on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $pid.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $pid variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-оптимизация directio, появившаяся в 0.7.15, не работала при использовании[m
[31m-open_file_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" optimization that had appeared in 0.7.15 did not work with[m
[31m-open_file_cache.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-access_log с переменными не работал на Linux;[m
[31m-ошибка появилась в 0.7.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access_log" with variables did not work on Linux;[m
[31m-the bug had appeared in 0.7.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_charset_module не понимал название кодировки в кавычках,[m
[31m-полученное от бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_charset_module did not understand quoted charset name[m
[31m-received from backend.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.16" date="08.09.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на 64-битных платформах;[m
[31m-ошибка появилась в 0.7.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on 64-bit platforms;[m
[31m-the bug had appeared in 0.7.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.15" date="08.09.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_random_index_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_random_index_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio оптимизирована для запросов файлов, начинающихся[m
[31m-с произвольной позиции.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" directive has been optimized for file requests starting[m
[31m-from arbitrary position.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio при необходимости запрещает использование sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" directive turns off sendfile if it is necessary.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx разрешает подчёркивания в именах строк в заголовке запроса клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx allows underscores in a client request header line names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.14" date="01.09.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директивы ssl_certificate и ssl_certificate_key не имеют[m
[31m-значений по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ssl_certificate and ssl_certificate_key directives have no[m
[31m-default values.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen поддерживает параметр ssl.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive supports the "ssl" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при переконфигурации nginx учитывает изменение временной зоны[m
[31m-на FreeBSD и Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx takes into account a time zone change while reconfiguration[m
[31m-on FreeBSD and Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры директивы listen, такие как backlog, rcvbuf и прочие,[m
[31m-не устанавливались, если сервером по умолчанию был не первый сервер.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive parameters such as "backlog", "rcvbuf", etc.[m
[31m-were not set, if a default server was not the first one.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании в качестве аргументов части URI, выделенного с помощью[m
[31m-директивы rewrite, эти аргументы не экранировались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if URI part captured by a "rewrite" directive was used as a query string,[m
[31m-then the query string was not escaped.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-улучшения тестирования правильности конфигурационного файла.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-configuration file validity test improvements.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.13" date="26.08.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux и Solaris;[m
[31m-ошибка появилась в 0.7.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux and Solaris;[m
[31m-the bug had appeared in 0.7.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.12" date="26.08.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает пустое имя "".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" directive supports empty name "".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_disable поддерживает специальную маску msie6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "gzip_disable" directive supports special "msie6" mask.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании параметра max_fails=0 в upstream'е с несколькими[m
[31m-серверами рабочий процесс выходил по сигналу SIGFPE.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "max_fails=0" parameter was used in upstream with several servers,[m
[31m-then a worker process exited on a SIGFPE signal.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса с помощью директивы error_page[m
[31m-терялось тело запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a request body was dropped while redirection via an "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса с методом HEAD с помощью директивы error_page[m
[31m-возвращался полный ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a full response was returned for request method HEAD[m
[31m-while redirection via an "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод $r->header_in() не возвращал значения строк "Host", "User-Agent",[m
[31m-и "Connection" из заголовка запроса;[m
[31m-ошибка появилась в 0.7.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->header_in() method did not return value of the "Host",[m
[31m-"User-Agent", and "Connection" request header lines;[m
[31m-the bug had appeared in 0.7.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.11" date="18.08.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь ngx_http_charset_module по умолчанию не работает MIME-типом text/css.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now ngx_http_charset_module does not work by default with text/css MIME type.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx возвращает код 405 для метода POST при запросе статического[m
[31m-файла, только если файл существует.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx returns the 405 status code for POST method requesting a static file[m
[31m-only if the file exists.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_ssl_session_reuse.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ssl_session_reuse" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с помощью "X-Accel-Redirect"[m
[31m-директива proxy_pass без URI могла использовать оригинальный запрос.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part might use original request[m
[31m-after the "X-Accel-Redirect" redirection was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если у каталога были права доступа только на поиск файлов[m
[31m-и первый индексный файл отсутствовал, то nginx возвращал ошибку 500.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a directory has search only rights and the first index file was absent,[m
[31m-then nginx returned the 500 status code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибок во вложенных location'ах;[m
[31m-ошибки появились в 0.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in inclusive locations;[m
[31m-the bugs had appeared in 0.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.10" date="13.08.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибок в директивах addition_types, charset_types,[m
[31m-gzip_types, ssi_types, sub_filter_types и xslt_types;[m
[31m-ошибки появились в 0.7.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "addition_types", "charset_types",[m
[31m-"gzip_types", "ssi_types", "sub_filter_types", and "xslt_types" directives;[m
[31m-the bugs had appeared in 0.7.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рекурсивной error_page для 500 ошибки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of recursive error_page for 500 status code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь модуль ngx_http_realip_module устанавливает адрес не для[m
[31m-всего keepalive соединения, а для каждого запроса по этому соединению.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_realip_module sets address not for whole keepalive connection,[m
[31m-but for each request passed via the connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.9" date="12.08.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь ngx_http_charset_module по умолчанию работает со следующими MIME-типами:[m
[31m-text/html, text/css, text/xml, text/plain, text/vnd.wap.wml,[m
[31m-application/x-javascript и application/rss+xml.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now ngx_http_charset_module works by default with following MIME types:[m
[31m-text/html, text/css, text/xml, text/plain, text/vnd.wap.wml,[m
[31m-application/x-javascript, and application/rss+xml.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы charset_types и addition_types.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "charset_types" and "addition_types" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директивы gzip_types, ssi_types и sub_filter_types используют хэш.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "gzip_types", "ssi_types", and "sub_filter_types" directives use hash.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_cpp_test_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_cpp_test_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива expires поддерживает суточное время.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive supports daily time.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-улучшения и исправления в модуле ngx_http_xslt_module.<br/>[m
[31m-Спасибо Денису Латыпову и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_xslt_module improvements and bug fixing.<br/>[m
[31m-Thanks to Denis F. Latypoff and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива log_not_found не работала при поиске индексных файлов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_not_found" directive did not work for index files tests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-HTTPS-соединения могли зависнуть,[m
[31m-если использовались методы kqueue, epoll, rtsig или eventport;[m
[31m-ошибка появилась в 0.7.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-HTTPS connections might hang,[m
[31m-if kqueue, epoll, rtsig, or eventport methods were used;[m
[31m-the bug had appeared in 0.7.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директивах server_name, valid_referers и map[m
[31m-использовалась маска вида "*.domain.tld" и при этом полное имя[m
[31m-вида "domain.tld" не было описано, то это имя попадало под маску;[m
[31m-ошибка появилась в 0.3.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "server_name", "valid_referers", and "map" directives used[m
[31m-an "*.domain.tld" wildcard and exact name "domain.tld" was not set,[m
[31m-then the exact name was matched by the wildcard;[m
[31m-the bug had appeared in 0.3.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.8" date="04.08.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_xslt_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_xslt_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$arg_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$arg_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка directio в Solaris.<br/>[m
[31m-Спасибо Ivan Debnar.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Solaris directio support.<br/>[m
[31m-Thanks to Ivan Debnar.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь, если FastCGI-сервер присылает строку "Location" в заголовке ответа[m
[31m-без строки статуса, то nginx использует код статуса 302.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if FastCGI server sends a "Location" header line without status line,[m
[31m-then nginx uses 302 status code.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.7" date="30.07.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь ошибка EAGAIN при вызове connect() не считается временной.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the EAGAIN error returned by connect() is not considered as temporary error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-значением переменной $ssl_client_cert теперь является сертификат,[m
[31m-перед каждой строкой которого, кроме первой, вставляется символ табуляции;[m
[31m-неизменённый сертификат доступен через переменную $ssl_client_raw_cert.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the $ssl_client_cert variable value is a certificate with TAB character[m
[31m-intended before each line except first one;[m
[31m-an unchanged certificate is available in the $ssl_client_raw_cert variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр ask директивы ssl_verify_client.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ask" parameter in the "ssl_verify_client" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-улучшения в обработке byte-range.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-byte-range processing improvements.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio.<br/>[m
[31m-Спасибо Jiang Hong.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" directive.<br/>[m
[31m-Thanks to Jiang Hong.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка sendfile() в MacOSX 10.5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-MacOSX 10.5 sendfile() support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в MacOSX и Cygwin при проверке location'ов теперь делается сравнение[m
[31m-без учёта регистра символов;[m
[31m-однако, сравнение ограничено только однобайтными locale'ями.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now in MacOSX and Cygwin locations are tested in case insensitive mode;[m
[31m-however, the compare is provided by single-byte locales only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-соединения почтового прокси-сервера зависали в режиме SSL,[m
[31m-если использовались методы select, poll или /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-mail proxy SSL connections hanged,[m
[31m-if select, poll, or /dev/poll methods were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании кодировки UTF-8 в ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-UTF-8 encoding usage in the ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.6" date="07.07.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании переменных в директиве access_log[m
[31m-всегда проверяется существовании root'а для запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if variables are used in the "access_log" directive[m
[31m-a request root existence is always tested.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_flv_module не поддерживал несколько значений в[m
[31m-аргументах запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_flv_module did not support several values in a query string.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.5" date="01.07.2008">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в поддержке переменных в директиве access_log;[m
[31m-ошибки появились в 0.7.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in variables support in the "access_log" directive;[m
[31m-the bugs had appeared in 0.7.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http_gzip_module;[m
[31m-ошибка появилась в 0.7.3.<br/>[m
[31m-Спасибо Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http_gzip_module;[m
[31m-the bug had appeared in 0.7.3.<br/>[m
[31m-Thanks to Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при совместном использовании sub_filter и SSI[m
[31m-ответы могли передаваться неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if sub_filter and SSI were used together, then responses might[m
[31m-were transferred incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.4" date="30.06.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива access_log поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "access_log" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива open_log_file_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "open_log_file_cache" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -g.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -g switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка строки "Expect" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Expect" request header line support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-большие включения в SSI могли передавались не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large SSI inclusions might be truncated.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.3" date="23.06.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-MIME-тип для расширения rss изменён на "application/rss+xml".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rss" extension MIME type has been changed to "application/rss+xml".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива "gzip_vary on" выдаёт строку[m
[31m-<nobr>"Vary: Accept-Encoding"</nobr>[m
[31m-в заголовке ответа и для несжатых ответов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "gzip_vary" directive turned on issues[m
[31m-a <nobr>"Vary: Accept-Encoding"</nobr>[m
[31m-header line for uncompressed responses too.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании протокола "https://" в директиве rewrite[m
[31m-автоматически делается редирект.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "rewrite" directive does a redirect automatically[m
[31m-if the "https://" protocol is used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass не работала с протоколом HTTPS;[m
[31m-ошибка появилась в 0.6.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" directive did not work with the HTTPS protocol;[m
[31m-the bug had appeared in 0.6.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.2" date="16.06.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx поддерживает шифры с обменом EDH-ключами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx supports EDH key exchange ciphers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_dhparam.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_dhparam" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_client_cert.<br/>[m
[31m-Спасибо Manlio Perillo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_cert variable.<br/>[m
[31m-Thanks to Manlio Perillo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после изменения URI с помощью директивы rewrite nginx не искал новый location;[m
[31m-ошибка появилась в 0.7.1.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-after changing URI via a "rewrite" directive nginx did not search[m
[31m-a new location;[m
[31m-the bug had appeared in 0.7.1.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без библиотеки PCRE;[m
[31m-ошибка появилась в 0.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without PCRE library;[m
[31m-the bug had appeared in 0.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при редиректе запроса к каталогу с добавлением слэша nginx[m
[31m-не добавлял аргументы из оригинального запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-when a request to a directory was redirected with the slash added,[m
[31m-nginx dropped a query string from the original request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.1" date="26.05.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь поиск location'а делается с помощью дерева.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now locations are searched in a tree.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива optimize_server_names упразднена в связи с появлением[m
[31m-директивы server_name_in_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "optimize_server_names" directive was canceled[m
[31m-due to the "server_name_in_redirect" directive introduction.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-некоторые давно устаревшие директивы больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some long deprecated directives are not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр "none" в директиве ssl_session_cache;[m
[31m-теперь этот параметр используется по умолчанию.<br/>[m
[31m-Спасибо Rob Mueller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "none" parameter in the "ssl_session_cache" directive;[m
[31m-now this is default parameter.<br/>[m
[31m-Thanks to Rob Mueller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочие процессы могли не реагировать на сигналы переконфигурации[m
[31m-и ротации логов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes might not catch reconfiguration and log rotation signals.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на последних Fedora 9 Linux.<br/>[m
[31m-Спасибо Roxis.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on latest Fedora 9 Linux.<br/>[m
[31m-Thanks to Roxis.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.0" date="19.05.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь символы 0x00-0x1F, '"' и '\' в access_log записываются в виде \xXX.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX in an[m
[31m-access_log.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx разрешает несколько строк "Host" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx allows several "Host" request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива expires поддерживает флаг modified.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "modified" flag in the "expires" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $uid_got и $uid_set можно использовать на любой стадии обработки[m
[31m-запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $uid_got and $uid_set variables may be used at any request processing stage.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $hostname.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $hostname variable.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка DESTDIR.<br/>[m
[31m-Спасибо Todd A. Fisher и Andras Voroskoi.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-DESTDIR support.<br/>[m
[31m-Thanks to Todd A. Fisher and Andras Voroskoi.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании keepalive на Linux[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process on Linux,[m
[31m-if keepalive was enabled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.31" date="12.05.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не обрабатывал ответ FastCGI-сервера, если строка заголовка ответа была[m
[31m-в конце записи FastCGI;[m
[31m-ошибка появилась в 0.6.2.<br/>[m
[31m-Спасибо Сергею Серову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not process FastCGI response[m
[31m-if header was at the end of FastCGI record;[m
[31m-the bug had appeared in 0.6.2.<br/>[m
[31m-Thanks to Sergey Serov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при удалении файла и использовании директивы open_file_cache_errors off[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process if a file was deleted[m
[31m-and the "open_file_cache_errors" directive was off.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.30" date="29.04.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь, если маске, заданной в директиве include, не соответствует[m
[31m-ни один файл, то nginx не выдаёт ошибку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if an "include" directive pattern does not match any file,[m
[31m-then nginx does not issue an error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь время в директивах можно задавать без пробела, например, "1h50m".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the time in directives may be specified without spaces,[m
[31m-for example, "1h50m".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечек памяти, если директива ssl_verify_client имела значение on.<br/>[m
[31m-Спасибо Chavelle Vincent.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leaks if the "ssl_verify_client" directive was on.<br/>[m
[31m-Thanks to Chavelle Vincent.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива sub_filter могла вставлять заменяемый текст в вывод.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sub_filter" directive might set text to change into output.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не воспринимала параметры в перенаправляемом URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive did not take into account arguments in[m
[31m-redirected URI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь при сборке с Cygwin nginx всегда открывает файлы в бинарном режиме.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx always opens files in binary mode under Cygwin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под OpenBSD;[m
[31m-ошибка появилась в 0.6.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OpenBSD;[m
[31m-the bug had appeared in 0.6.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.29" date="18.03.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_google_perftools_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_google_perftools_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module не собирался на 64-битных платформах;[m
[31m-ошибка появилась в 0.6.27.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module could not be built on 64-bit platforms;[m
[31m-the bug had appeared in 0.6.27.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.28" date="13.03.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод rtsig не собирался;[m
[31m-ошибка появилась в 0.6.27.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the rtsig method could not be built;[m
[31m-the bug had appeared in 0.6.27.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.27" date="12.03.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь на Linux 2.6.18+ по умолчанию не собирается метод rtsig.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now by default the rtsig method is not built on <nobr>Linux 2.6.18+.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при перенаправлении запроса в именованный location с помощью[m
[31m-директивы error_page метод запроса не изменяется.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a request method is not changed while redirection to a named location[m
[31m-via an "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы resolver и resolver_timeout в SMTP прокси-сервере.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "resolver" and "resolver_timeout" directives in SMTP proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива post_action поддерживает именованные location'ы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_action" directive supports named locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса из location'а c обработчиком proxy, FastCGI[m
[31m-или memcached в именованный location со статическим обработчиком[m
[31m-в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if a request was redirected from proxy, FastCGI, or memcached location[m
[31m-to static named locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-браузеры не повторяли SSL handshake, если при первом handshake[m
[31m-не оказалось правильного клиентского сертификата.[m
[31m-<br/>[m
[31m-Спасибо Александру Инюхину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-browsers did not repeat SSL handshake if there is no valid client certificate[m
[31m-in first handshake.[m
[31m-<br/>[m
[31m-Thanks to Alexander V. Inyukhin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении ошибок 495-497 с помощью директивы error_page[m
[31m-без изменения кода ошибки nginx пытался выделить очень много памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if response code 495-497 was redirected via an "error_page" directive[m
[31m-without code change, then nginx tried to allocate too many memory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти в долгоживущих небуфферизированных соединениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak in long-lived non buffered connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти в resolver'е.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak in resolver.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса из location'а c обработчиком proxy[m
[31m-в другой location с обработчиком proxy[m
[31m-в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if a request was redirected from proxy, FastCGI, or memcached location[m
[31m-to static named locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в кэшировании переменных $proxy_host и $proxy_port.<br/>[m
[31m-Спасибо Сергею Боченкову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the $proxy_host and $proxy_port variables caching.<br/>[m
[31m-Thanks to Sergey Bochenkov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass с переменными использовала порт, описанной в другой[m
[31m-директиве proxy_pass без переменных, но с таким же именем хоста.<br/>[m
[31m-Спасибо Сергею Боченкову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive with variables used incorrectly the same port[m
[31m-as in another "proxy_pass" directive with the same host name[m
[31m-and without variables.<br/>[m
[31m-Thanks to Sergey Bochenkov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время переконфигурации на некоторых 64-битном платформах в лог[m
[31m-записывался alert "sendmsg() failed (9: Bad file descriptor)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an alert "sendmsg() failed (9: Bad file descriptor)" on some 64-bit platforms[m
[31m-while reconfiguration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при повторном использовании в SSI пустого block'а в качестве заглушки[m
[31m-в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if empty stub block was used second time in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при копировании части URI, содержащего экранированные символы,[m
[31m-в аргументы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in copying URI part contained escaped symbols into arguments.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.26" date="11.02.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_store и fastcgi_store не проверяли длину ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store" and "fastcgi_store" directives did not check[m
[31m-a response length.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании большого значения в директиве expires[m
[31m-в рабочем процессе происходил segmentation fault.<br/>[m
[31m-Спасибо Joaquin Cuenca Abela.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if big value was used in a "expires" directive.<br/>[m
[31m-Thanks to Joaquin Cuenca Abela.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неверно определял длину строки кэша на <nobr>Pentium 4.</nobr><br/>[m
[31m-Спасибо Геннадию Махомеду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx incorrectly detected cache line size on Pentium 4.<br/>[m
[31m-Thanks to Gena Makhomed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в проксированных подзапросах и подзапросах к FastCGI-серверу[m
[31m-вместо метода GET использовался оригинальный метод клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in proxied or FastCGI subrequests a client original method was used[m
[31m-instead of the GET method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов в режиме HTTPS при использовании отложенного accept'а.<br/>[m
[31m-Спасибо Ben Maurer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak in HTTPS mode if deferred accept was used.<br/>[m
[31m-Thanks to Ben Maurer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx выдавал ошибочное сообщение "SSL_shutdown() failed (SSL: )";[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx issued the bogus error message "SSL_shutdown() failed (SSL: )";[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTPS запросы могли завершаться с ошибкой "bad write retry";[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in HTTPS mode requests might fail with the "bad write retry" error;[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.25" date="08.01.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-вместо специального параметра "*" в директиве server_name теперь[m
[31m-используется директива server_name_in_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "server_name_in_redirect" directive is used instead of[m
[31m-the "server_name" directive's special "*" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в качестве основного имени в директиве server_name теперь[m
[31m-можно использовать имена с масками и регулярными выражениями.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now wildcard and regex names can be used as main name in[m
[31m-a "server_name" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива satisfy_any заменена директивой satisfy.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "satisfy_any" directive was replaced by the "satisfy" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-после переконфигурации старые рабочие процесс могли сильно нагружать процессор[m
[31m-при запуске под Linux OpenVZ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-old worker processes might hog CPU after reconfiguration if they was run[m
[31m-under Linux OpenVZ.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива min_delete_depth.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "min_delete_depth" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-методы COPY и MOVE не работали с одиночными файлами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the COPY and MOVE methods did not work with single files.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_gzip_static_module не позволял работать модулю[m
[31m-ngx_http_dav_module;[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_gzip_static_module did not allow the ngx_http_dav_module to work;[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов в режиме HTTPS при использовании отложенного accept'а.<br/>[m
[31m-Спасибо Ben Maurer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak in HTTPS mode if deferred accept was used.<br/>[m
[31m-Thanks to Ben Maurer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без библиотеки PCRE;[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without PCRE library;[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-<changes ver="0.6.24" date="27.12.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTPS в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process if HTTPS was used;[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.23" date="27.12.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр "off" в директиве ssl_session_cache;[m
[31m-теперь этот параметр используется по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "off" parameter in the "ssl_session_cache" directive;[m
[31m-now this is default parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива open_file_cache_retest переименована в open_file_cache_valid.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "open_file_cache_retest" directive was renamed[m
[31m-to the "open_file_cache_valid".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива open_file_cache_min_uses.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "open_file_cache_min_uses" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_disable.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "gzip_disable" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву memcached_pass можно использовать внутри блока if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "memcached_pass" directive may be used inside the "if" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если внутри одного location'а использовались директивы "memcached_pass" и "if",[m
[31m-то в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if the "memcached_pass" and "if" directives were used in the same location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании директивы satisfy_any on" были заданы директивы[m
[31m-не всех модулей доступа, то заданные директивы не проверялись.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a "satisfy_any on" directive was used and not all access and auth modules[m
[31m-directives were set, then other given access and auth directives[m
[31m-were not tested;[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры, заданные регулярным выражением в директиве valid_referers,[m
[31m-не наследовалась с предыдущего уровня.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regex parameters in a "valid_referers" directive were not inherited[m
[31m-from previous level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива post_action не работала, если запрос завершался с кодом 499.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "post_action" directive did run if a request was completed[m
[31m-with 499 status code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-оптимизация использования 16K буфера для SSL-соединения.<br/>[m
[31m-Спасибо Ben Maurer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-optimization of 16K buffer usage in a SSL connection.<br/>[m
[31m-Thanks to Ben Maurer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-STARTTLS в режиме SMTP не работал.<br/>[m
[31m-Спасибо Олегу Мотиенко.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the STARTTLS in SMTP mode did not work.<br/>[m
[31m-Thanks to Oleg Motienko.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTPS запросы могли завершаться с ошибкой "bad write retry";[m
[31m-ошибка появилась в 0.5.13.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in HTTPS mode requests might fail with the "bad write retry" error;[m
[31m-the bug had appeared in 0.5.13.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.22" date="19.12.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь все методы модуля ngx_http_perl_module[m
[31m-возвращают значения, скопированные в память, выделенную perl'ом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now all ngx_http_perl_module methods return values copied to perl's[m
[31m-allocated memory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_perl_module,[m
[31m-использовался perl до версии 5.8.6 и perl поддерживал потоки,[m
[31m-то во время переконфигурации основной процесс аварийно выходил;[m
[31m-ошибка появилась в 0.5.9.<br/>[m
[31m-Спасибо Борису Жмурову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with ngx_http_perl_module,[m
[31m-the perl before 5.8.6 was used, and perl supported threads,[m
[31m-then during reconfiguration the master process aborted;[m
[31m-the bug had appeared in 0.5.9.<br/>[m
[31m-Thanks to Boris Zhmurov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в методы модуля ngx_http_perl_module[m
[31m-могли передаваться неверные результаты выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module methods may get invalid values of the regex captures.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если метод $r->has_request_body() вызывался для запроса,[m
[31m-у которого небольшое тело запроса было уже полностью получено,[m
[31m-то в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if the $r->has_request_body() method was called for a request[m
[31m-whose small request body was already received.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-large_client_header_buffers не освобождались перед переходом в состояние[m
[31m-keep-alive.<br/>[m
[31m-Спасибо Олександру Штепе.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large_client_header_buffers did not freed before going to keep-alive state.<br/>[m
[31m-Thanks to Olexander Shtepa.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в переменной $upstream_addr не записывался последний адрес;[m
[31m-ошибка появилась в 0.6.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the last address was missed in the $upstream_addr variable;[m
[31m-the bug had appeared in 0.6.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_catch_stderr не возвращала ошибку;[m
[31m-теперь она возвращает ошибку 502, которую можно направить на следующий сервер[m
[31m-с помощью "fastcgi_next_upstream invalid_header".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_catch_stderr" directive did return error code;[m
[31m-now it returns 502 code, that can be rerouted to a next server using[m
[31m-the "fastcgi_next_upstream invalid_header" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы fastcgi_catch_stderr[m
[31m-в основном процессе происходил segmentation fault;[m
[31m-ошибка появилась в 0.6.10.<br/>[m
[31m-Спасибо Manlio Perillo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in master process[m
[31m-if the "fastcgi_catch_stderr" directive was used;[m
[31m-the bug had appeared in 0.6.10.<br/>[m
[31m-Thanks to Manlio Perillo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.21" date="03.12.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-если в значениях переменных директивы proxy_pass используются[m
[31m-только IP-адреса, то указывать resolver не нужно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if variable values used in a "proxy_pass" directive contain IP-addresses only,[m
[31m-then a "resolver" directive is not mandatory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы proxy_pass c URI-частью[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.6.19.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if a "proxy_pass" directive with URI-part was used;[m
[31m-the bug had appeared in 0.6.19.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если resolver использовался на платформах, не поддерживающих метод kqueue,[m
[31m-то nginx выдавал alert "name is out of response".<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if resolver was used on platform that does not support kqueue,[m
[31m-then nginx issued an alert "name is out of response".<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-При использовании переменной $server_protocol в FastCGI-параметрах[m
[31m-и запросе, длина которого была близка к значению директивы[m
[31m-client_header_buffer_size,[m
[31m-nginx выдавал alert "fastcgi: the request record is too big".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the $server_protocol was used in FastCGI parameters[m
[31m-and a request line length was near to the "client_header_buffer_size"[m
[31m-directive value,[m
[31m-then nginx issued an alert "fastcgi: the request record is too big".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при обычном запросе версии HTTP/0.9 к HTTPS серверу nginx возвращал[m
[31m-обычный ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a plain text HTTP/0.9 version request was made to HTTPS server,[m
[31m-then nginx returned usual response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.20" date="28.11.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы proxy_pass c URI-частью[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.6.19.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if a "proxy_pass" directive with URI-part was used;[m
[31m-the bug had appeared in 0.6.19.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.19" date="27.11.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-версия 0.6.18 не собиралась.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the 0.6.18 version could not be built.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-<changes ver="0.6.18" date="27.11.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь модуль ngx_http_userid_module в поле куки с номером процесса[m
[31m-добавляет микросекунды на время старта.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_userid_module adds start time microseconds[m
[31m-to the cookie field contains a pid value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в error_log теперь записывается полная строка запроса вместо только URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the full request line instead of URI only is written to error_log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы resolver и resolver_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "resolver" and "resolver_timeout" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива "add_header last-modified ''" удаляет в заголовке ответа[m
[31m-строку "Last-Modified".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the directive "add_header last-modified ''" deletes a "Last-Modified"[m
[31m-response header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate не позволяла передавать на полной скорости,[m
[31m-даже если был указан очень большой лимит.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive did not allow to use full throughput,[m
[31m-even if limit value was very high.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.17" date="15.11.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка строки "If-Range" в заголовке запроса.<br/>[m
[31m-Спасибо Александру Инюхину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Range" request header line support.<br/>[m
[31m-Thanks to Alexander V. Inyukhin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы msie_refresh повторно экранировались[m
[31m-уже экранированные символы;[m
[31m-ошибка появилась в 0.6.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-URL double escaping in a redirect of the "msie_refresh" directive;[m
[31m-the bug had appeared in 0.6.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива autoindex не работала при использовании "alias /".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "autoindex" directive did not work with the "alias /" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании подзапросов[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process if subrequests were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSL и gzip большие ответы могли передаваться не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the big responses may be transferred truncated if SSL and gzip were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ответ проксированного сервера был версии HTTP/0.9,[m
[31m-то переменная $status была равна 0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $status variable was equal to 0 if a proxied server returned response[m
[31m-in HTTP/0.9 version.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.16" date="29.10.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь на Linux используется uname(2) вместо procfs.<br/>[m
[31m-Спасибо Илье Новикову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the uname(2) is used on Linux instead of procfs.<br/>[m
[31m-Thanks to Ilya Novikov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве error_page использовался символ "?", то он экранировался[m
[31m-при проксировании запроса;[m
[31m-ошибка появилась в 0.6.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "?" character was in a "error_page" directive, then it was escaped[m
[31m-in a proxied request;[m
[31m-the bug had appeared in 0.6.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с mget.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with mget.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.15" date="22.10.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-совместимость с Cygwin.<br/>[m
[31m-Спасибо Владимиру Кутакову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Cygwin compatibility.<br/>[m
[31m-Thanks to Vladimir Kutakov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива merge_slashes.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "merge_slashes" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_vary.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "gzip_vary" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_tokens.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_tokens" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не раскодировал URI в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not unescape URI in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной в директивах charset или source_charset[m
[31m-на старте или во время переконфигурации происходил segmentation fault,[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred on start or while reconfiguration[m
[31m-if variable was used in the "charset" or "source_charset" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx возвращал ошибку 400 на запросы вида[m
[31m-<nobr>"GET http://www.domain.com HTTP/1.0"</nobr>.<br/>[m
[31m-Спасибо James Oakley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx returned the 400 response on requests like[m
[31m-<nobr>"GET http://www.domain.com HTTP/1.0"</nobr>.<br/>[m
[31m-Thanks to James Oakley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с телом запроса с помощью директивы[m
[31m-error_page nginx пытался снова прочитать тело запроса;[m
[31m-ошибка появилась в 0.6.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if request with request body was redirected using the "error_page" directive,[m
[31m-then nginx tried to read the request body again;[m
[31m-the bug had appeared in 0.6.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе происходил segmentation fault, если у сервера,[m
[31m-обрабатывающему запрос, не был явно определён server_name;[m
[31m-ошибка появилась в 0.6.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if no server_name was explicitly defined for server processing request;[m
[31m-the bug had appeared in 0.6.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.14" date="15.10.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию команда SSI echo использует кодирование entity.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now by default the "echo" SSI command uses entity encoding.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр encoding в команде SSI echo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "encoding" parameter in the "echo" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву access_log можно использовать внутри блока limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access_log" directive may be used inside the "limit_except" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если все сервера апстрима оказывались недоступными,[m
[31m-то до восстановления работоспособности[m
[31m-у всех серверов вес становился равным одному;[m
[31m-ошибка появилась в 0.6.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if all upstream servers were failed, then all servers had got weight[m
[31m-the was equal one until servers became alive;[m
[31m-the bug had appeared in 0.6.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменных $date_local и $date_gmt вне модуля[m
[31m-ngx_http_ssi_filter_module в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if $date_local and $date_gmt were used outside the ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании включённом отладочном логе[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if debug log was enabled.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_memcached_module не устанавливал $upstream_response_time.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_memcached_module did not set $upstream_response_time.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс мог зациклиться при использовании memcached.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop, if the memcached was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx распознавал параметры "close" и "keep-alive" в строке "Connection"[m
[31m-в заголовке запроса только, если они были в нижнем регистре;[m
[31m-ошибка появилась в 0.6.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx supported low case only "close" and "keep-alive" values[m
[31m-in the "Connection" request header line;[m
[31m-the bug had appeared in 0.6.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-sub_filter не работал с пустой строкой замены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-sub_filter did not work with empty substitution.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в парсинге sub_filter.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in sub_filter parsing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.13" date="24.09.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не закрывал файл каталога для запроса HEAD,[m
[31m-если использовался autoindex<br/>[m
[31m-Спасибо Arkadiusz Patyk.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not close directory file on HEAD request if autoindex was used.<br/>[m
[31m-Thanks to Arkadiusz Patyk.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.12" date="21.09.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер разделён на три модуля: pop3, imap и smtp.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-mail proxy was split on three modules: pop3, imap and smtp.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры конфигурации --without-mail_pop3_module,[m
[31m---without-mail_imap_module и --without-mail_smtp_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --without-mail_pop3_module, --without-mail_imap_module,[m
[31m-and --without-mail_smtp_module configuration parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы smtp_greeting_delay и smtp_client_buffer модуля ngx_mail_smtp_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "smtp_greeting_delay" and "smtp_client_buffer" directives[m
[31m-of the ngx_mail_smtp_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-wildcard в конце имени сервера не работали;[m
[31m-ошибка появилась в 0.6.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the trailing wildcards did not work;[m
[31m-the bug had appeared in 0.6.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании разделяемой библиотеки PCRE,[m
[31m-расположенной в нестандартном месте, nginx не запускался на Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not start on Solaris if the shared PCRE library located[m
[31m-in non-standard place was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_hide_header и fastcgi_hide_header не скрывали[m
[31m-строки заголовка ответа с именем больше 32 символов.<br/>[m
[31m-Спасибо Manlio Perillo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_hide_header" and "fastcgi_hide_header" directives did not[m
[31m-hide response header lines whose name was longer than 32 characters.<br/>[m
[31m-Thanks to Manlio Perillo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.11" date="11.09.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-счётчик активных соединений всегда рос при использовании почтового[m
[31m-прокси-сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-active connection counter always increased if mail proxy was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд возвращал только заголовок ответа при небуферизированном[m
[31m-проксировании, то nginx закрывал соединение с бэкендом по таймауту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if backend returned response header only using non-buffered proxy,[m
[31m-then nginx closed backend connection on timeout.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал несколько строк "Connection" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support several "Connection" request header lines.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в сервере апстрима был задан max_fails, то после первой же неудачной[m
[31m-попытки вес сервера навсегда становился равным одному;[m
[31m-ошибка появилась в 0.6.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "max_fails" was set for upstream server, then after first[m
[31m-failure server weight was always one;[m
[31m-the bug had appeared in 0.6.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.10" date="03.09.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы open_file_cache, open_file_cache_retest и open_file_cache_errors.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "open_file_cache", "open_file_cache_retest", and "open_file_cache_errors"[m
[31m-directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.6.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.6.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-В строку заголовка ответа "Content-Type", указанную в методе[m
[31m-$r->send_http_header(), не добавлялась кодировка, указанная в директиве charset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a charset set by the "charset" directive was not appended[m
[31m-to the "Content-Type" header set by $r->send_http_header().[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода /dev/poll[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if /dev/poll method was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.9" date="28.08.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс мог зациклиться при использовании протокола HTTPS;[m
[31m-ошибка появилась в 0.6.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop,[m
[31m-if the HTTPS protocol was used;[m
[31m-the bug had appeared in 0.6.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если сервер слушал на двух адресах или портах, то nginx не запускался[m
[31m-при использовании wildcard в конце имени сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if server listened on two addresses or ports and trailing wildcard was used,[m
[31m-then nginx did not run.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ip_hash могла неверно помечать сервера как нерабочие.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ip_hash" directive might incorrectly mark servers as down.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на amd64;[m
[31m-ошибка появилась в 0.6.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on amd64;[m
[31m-the bug had appeared in 0.6.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.8" date="20.08.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx пытается установить директивы worker_priority,[m
[31m-worker_rlimit_nofile, worker_rlimit_core, worker_rlimit_sigpending[m
[31m-без привилегий root'а.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx tries to set the "worker_priority", "worker_rlimit_nofile",[m
[31m-"worker_rlimit_core", and "worker_rlimit_sigpending" without super-user[m
[31m-privileges.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx экранирует символы пробела и "%" при передаче запроса[m
[31m-серверу аутентификации почтового прокси-сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx escapes space and "%" in request to a mail proxy authentication[m
[31m-server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx экранирует символ "%" в переменной $memcached_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx escapes "%" in $memcached_key variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при указании относительного пути к конфигурационному файлу в качестве[m
[31m-параметра ключа -c nginx определял путь относительно конфигурационного префикса;[m
[31m-ошибка появилась в 0.6.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx used path relative to configuration prefix for non-absolute[m
[31m-configuration file path specified in the "-c" key;[m
[31m-the bug had appeared in 0.6.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на FreeBSD/sparc64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on FreeBSD/sparc64.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.7" date="15.08.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь пути, указанные в директивах include, auth_basic_user_file,[m
[31m-perl_modules, ssl_certificate, ssl_certificate_key и[m
[31m-ssl_client_certificate, определяются относительно каталога конфигурационного[m
[31m-файла nginx.conf, а не относительно префикса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the paths specified in the "include", "auth_basic_user_file",[m
[31m-"perl_modules", "ssl_certificate", "ssl_certificate_key", and[m
[31m-"ssl_client_certificate" directives are relative to directory of[m
[31m-nginx configuration file nginx.conf, but not to nginx prefix directory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр --sysconfdir=PATH в configure упразднён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --sysconfdir=PATH option in configure was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-для обновления на лету версий 0.1.x создан специальный сценарий[m
[31m-<nobr>make upgrade1.</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the special make target "upgrade1" was defined for online upgrade of[m
[31m-0.1.x versions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы server_name и valid_referers поддерживают регулярные выражения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" and "valid_referers" directives support regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server в блоке upstream поддерживает параметр backup.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server" directive in the "upstream" context supports[m
[31m-the "backup" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->discard_request_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->discard_request_body.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива "add_header Last-Modified ..." меняет строку "Last-Modified"[m
[31m-в заголовке ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header Last-Modified ..." directive changes the "Last-Modified"[m
[31m-response header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если на запрос с телом возвращался ответ с кодом HTTP отличным от 200,[m
[31m-и после этого запроса соединение переходило в состояние keep-alive,[m
[31m-то на следующий запрос nginx возвращал 400.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a response different than 200 was returned to a request with body[m
[31m-and connection went to the keep-alive state after the request, then[m
[31m-nginx returned 400 for the next request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве auth_http был задан неправильный адрес, то[m
[31m-в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if invalid address was set in the "auth_http" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию nginx использует значение 511 для listen backlog[m
[31m-на всех платформах, кроме FreeBSD.<br/>[m
[31m-Спасибо Jiang Hong.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses default listen backlog value 511 on all platforms[m
[31m-except FreeBSD.<br/>[m
[31m-Thanks to Jiang Hong.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс мог зациклиться, если server в блоке upstream был помечен[m
[31m-как down;[m
[31m-ошибка появилась в 0.6.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop, if a "server" inside[m
[31m-"upstream" block was marked as "down";[m
[31m-the bug had appeared in 0.6.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-sendfilev() в Solaris теперь не используется при передаче тела запроса[m
[31m-FastCGI-серверу через unix domain сокет.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now Solaris sendfilev() is not used to transfer the client request body[m
[31m-to FastCGI-server via the unix domain socket.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.6" date="30.07.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр --sysconfdir=PATH в configure.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --sysconfdir=PATH option in configure.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-именованные location'ы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-named locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменную $args можно устанавливать с помощью set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $args variable can be set with the "set" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $is_args.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $is_args variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-равномерное распределение запросов к апстримам с большими весами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fair big weight upstream balancer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если клиент в почтовом прокси-сервере закрывал соединение,[m
[31m-то nginx мог не закрывать соединение с бэкендом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a client has closed connection to mail proxy[m
[31m- then nginx might not close connection to backend.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании одного хоста в качестве бэкендов для протоколов HTTP и HTTPS[m
[31m-без явного указания портов, nginx использовал только один порт&mdash;80 или 443.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the same host without specified port was used as backend for HTTP and HTTPS,[m
[31m-then nginx used only one port&mdash;80 or 443.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris/amd64 Sun Studio 11 и более ранними версиями;[m
[31m-ошибка появилась в 0.6.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fix building on Solaris/amd64 by Sun Studio 11 and early versions;[m
[31m-the bug had appeared in 0.6.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.5" date="23.07.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $nginx_version.<br/>[m
[31m-Спасибо Николаю Гречуху.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$nginx_version variable.<br/>[m
[31m-Thanks to Nick S. Grechukh.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер поддерживает AUTHENTICATE в режиме IMAP.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy supports AUTHENTICATE in IMAP mode.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер поддерживает STARTTLS в режиме SMTP.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy supports STARTTLS in SMTP mode.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx экранирует пробел в переменной $memcached_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx escapes space in $memcached_key variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неправильно собирался Sun Studio на Solaris/amd64.<br/>[m
[31m-Спасибо Jiang Hong.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx was incorrectly built by Sun Studio on Solaris/amd64.<br/>[m
[31m-Thanks to Jiang Hong.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-незначительных потенциальных ошибок.<br/>[m
[31m-Спасибо Coverity's Scan.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of minor potential bugs.<br/>[m
[31m-Thanks to Coverity's Scan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.4" date="17.07.2007">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы msie_refresh был возможен XSS.<br/>[m
[31m-Спасибо Максиму Богуку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "msie_refresh" directive allowed XSS.<br/>[m
[31m-Thanks to Maxim Boguk.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_store и fastcgi_store изменены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store" and "fastcgi_store" directives were changed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_store_access и fastcgi_store_access.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store_access" and "fastcgi_store_access" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на Solaris/sparc64, если был собран Sun Studio.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on Solaris/sparc64 if it was built by Sun Studio.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки в Sun Studio 12.<br/>[m
[31m-Спасибо Jiang Hong.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for Sun Studio 12.<br/>[m
[31m-Thanks to Jiang Hong.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.3" date="12.07.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_store и fastcgi_store.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store" and "fastcgi_store" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы auth_http_header[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the "auth_http_header" directive was used.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался метод аутентификации CRAM-MD5, но он не был разрешён,[m
[31m-то в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if the CRAM-MD5 authentication method was used, but it was not enabled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании протокола HTTPS в директиве proxy_pass[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process when[m
[31m-the HTTPS protocol was used in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался метод eventport.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the eventport method was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ignore_client_abort и fastcgi_ignore_client_abort не работали;[m
[31m-ошибка появилась в 0.5.13.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ignore_client_abort" and "fastcgi_ignore_client_abort" directives[m
[31m-did not work;[m
[31m-the bug had appeared in 0.5.13.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.2" date="09.07.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если заголовок ответа был разделён в FastCGI-записях, то nginx передавал[m
[31m-клиенту мусор в таких заголовках.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the FastCGI header was split in records,[m
[31m-then nginx passed garbage in the header to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.1" date="17.06.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в парсинге SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in SSI parsing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании удалённого подзапроса в SSI последующий[m
[31m-подзапрос локального файла мог отдаваться клиенту в неверном порядке.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if remote SSI subrequest was used, then posterior local file subrequest[m
[31m-might transferred to client in wrong order.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-большие включения в SSI, сохранённые во временные файлы,[m
[31m-передавались не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large SSI inclusions buffered in temporary files were truncated.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-значение perl'овой переменной $$ модуля ngx_http_perl_module было равно[m
[31m-номеру главного процесса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the perl $$ variable value in ngx_http_perl_module was equal to the master[m
[31m-process identification number.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.0" date="14.06.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы "server_name", "map", and "valid_referers" поддерживают[m
[31m-маски вида "www.example.*".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name", "map", and "valid_referers" directives support[m
[31m-the "www.example.*" wildcards.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.25" date="11.06.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http_rewrite_module;[m
[31m-ошибка появилась в 0.5.24.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the --without-http_rewrite_module parameter;[m
[31m-the bug had appeared in 0.5.24.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.24" date="06.06.2007">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-директива ssl_verify_client не работала, если запрос выполнялся[m
[31m-по протоколу HTTP/0.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_verify_client" directive did not work if request was made[m
[31m-using HTTP/0.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании сжатия часть ответа могла передаваться несжатой;[m
[31m-ошибка появилась в 0.5.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a part of response body might be passed uncompressed if gzip was used;[m
[31m-the bug had appeared in 0.5.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.23" date="04.06.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssl_module поддерживает расширение TLS Server Name Indication.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssl_module supports Server Name Indication TLS extension.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_catch_stderr.<br/>[m
[31m-Спасибо Николаю Гречуху, проект OWOX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_catch_stderr" directive.<br/>[m
[31m-Thanks to Nick S. Grechukh, OWOX project.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Линуксе в основном процессе происходил segmentation fault,[m
[31m-если два виртуальных сервера должны bind()ится к пересекающимся портам.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in master process if[m
[31m-two virtual servers should bind() to the overlapping ports.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_perl_module и perl[m
[31m-поддерживал потоки, то во время второй переконфигурации[m
[31m-выдавались ошибки "panic: MUTEX_LOCK" и "perl_parse() failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with ngx_http_perl_module and perl supported threads,[m
[31m-then during second reconfiguration the error messages[m
[31m-"panic: MUTEX_LOCK" and "perl_parse() failed" were issued.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании протокола HTTPS в директиве proxy_pass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the HTTPS protocol in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.22" date="29.05.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-большое тело запроса могло не передаваться бэкенду;[m
[31m-ошибка появилась в 0.5.21.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a big request body might not be passed to backend;[m
[31m-the bug had appeared in 0.5.21.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.21" date="28.05.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если внутри сервера описано больше примерно десяти location'ов,[m
[31m-то location'ы, заданные с помощью регулярного выражения,[m
[31m-могли выполняться не в том, порядке, в каком они описаны.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if server has more than about ten locations, then regex locations[m
[31m-might be chosen not in that order as they were specified.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на 64-битной платформе рабочий процесс мог зациклиться, если 33-тий[m
[31m-по счёту или последующий бэкенд упал.<br/>[m
[31m-Спасибо Антону Поварову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop on 64-bit platform,[m
[31m-if the 33-rd or next in succession backend has failed.<br/>[m
[31m-Thanks to Anton Povarov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании библиотеки PCRE на Solaris/sparc64[m
[31m-мог произойти bus error.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a bus error might occur on Solaris/sparc64 if the PCRE library was used.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании протокола HTTPS в директиве proxy_pass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the HTTPS protocol in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.20" date="07.05.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива sendfile_max_chunk.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile_max_chunk" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$http_...", "$sent_http_..." и "$upstream_http_..."[m
[31m-можно менять директивой set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$http_...", "$sent_http_...", and "$upstream_http_..." variables[m
[31m-may be changed using the "set" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSI-команды 'if expr="$var = /"'[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the SSI command 'if expr="$var = /"' was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-завершающая строка multipart range ответа передавалась неверно.<br/>[m
[31m-Спасибо Evan Miller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-trailing boundary of multipart range response was transferred incorrectly.<br/>[m
[31m-Thanks to Evan Miller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на Solaris/sparc64, если был собран Sun Studio.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on Solaris/sparc64 if it was built by Sun Studio.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module не собирался make в Solaris.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module could not be built by Solaris make.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.19" date="24.04.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-значение переменной $request_time теперь записывается с точностью[m
[31m-до миллисекунд.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the $request_time variable has millisecond precision.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-метод $r->rflush в модуле ngx_http_perl_module переименован в $r->flush.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the method $r->rflush of ngx_http_perl_module was renamed to the $r->flush.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_addr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_addr variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_headers_hash_max_size и proxy_headers_hash_bucket_size.<br/>[m
[31m-Спасибо Володымыру Костырко.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_headers_hash_max_size" and "proxy_headers_hash_bucket_size"[m
[31m-directives.<br/>[m
[31m-Thanks to Volodymyr Kostyrko.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile и limit_rate на 64-битных платформах[m
[31m-нельзя было передавать файлы больше 2G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files more than 2G could not be transferred using sendfile and limit_rate[m
[31m-on 64-bit platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile на 64-битном Linux нельзя было передавать файлы[m
[31m-больше 2G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files more than 2G could not be transferred using sendfile on 64-bit Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.18" date="19.04.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$upstream_http_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$upstream_http_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь переменные $upstream_status и $upstream_response_time[m
[31m-содержат данные о всех обращениях к апстримам, сделанным до X-Accel-Redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the $upstream_status and $upstream_response_time variables[m
[31m-keep data about all upstreams before X-Accel-Redirect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_perl_module и perl[m
[31m-не поддерживал multiplicity, то после первой переконфигурации[m
[31m-и после получения любого сигнала[m
[31m-в основном процессе происходил segmentation fault;[m
[31m-ошибка появилась в 0.5.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in master process[m
[31m-after first reconfiguration and receiving any signal[m
[31m-if nginx was built with ngx_http_perl_module and perl[m
[31m-did not support multiplicity;[m
[31m-the bug had appeared in 0.5.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если perl не поддерживал multiplicity, то после переконфигурации[m
[31m-перловый код не работал;[m
[31m-ошибка появилась в 0.3.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if perl did not support multiplicity, then after reconfiguration[m
[31m-perl code did not work;[m
[31m-the bug had appeared in 0.3.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.17" date="02.04.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx для метода TRACE всегда возвращает код 405.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx always returns the 405 status for the TRACE method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx поддерживает директиву include внутри блока types.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx supports the "include" directive inside the "types" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-использование переменной $document_root в директиве root и alias[m
[31m-запрещено: оно вызывало рекурсивное переполнение стека.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $document_root variable usage in the "root" and "alias" directives[m
[31m-is disabled: this caused recursive stack overflow.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании протокола HTTPS в директиве proxy_pass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the HTTPS protocol in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в некоторых случаях некэшируемые переменные (такие, как $uri)[m
[31m-возвращали старое закэшированное значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in some cases non-cacheable variables (such as $uri variable)[m
[31m-returned old cached value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.16" date="26.03.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в качестве ключа для хэша в директиве ip_hash не использовалась сеть[m
[31m-класса С.<br/>[m
[31m-Спасибо Павлу Ярковому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the C-class network was not used as hash key in the "ip_hash" directive.<br/>[m
[31m-Thanks to Pavel Yarkovoy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в строке "Content-Type" в заголовке ответа бэкенда был указан charset[m
[31m-и строка завершалась символом ";",[m
[31m-то в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if a charset was set in the "Content-Type" header line and the line[m
[31m-has trailing ";";[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "[alert] zero size buf" при работе с FastCGI-сервером, если[m
[31m-тело запроса, записанное во временный файл, было кратно 32K.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error when FastCGI server was used and[m
[31m-a request body written in a temporary file was multiple of 32K.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris без параметра --with-debug;[m
[31m-ошибка появилась в 0.5.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris without the --with-debug option;[m
[31m-the bug had appeared in 0.5.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.15" date="19.03.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер поддерживает аутентифицированное SMTP-проксирование и[m
[31m-директивы smtp_auth, smtp_capabilities и xclient.<br/>[m
[31m-Спасибо Антону Южанинову и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy supports authenticated SMTP proxying and[m
[31m-the "smtp_auth", "smtp_capabilities", and "xclient" directives.<br/>[m
[31m-Thanks to Anton Yuzhaninov and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь keep-alive соединения закрываются сразу же по получении сигнала[m
[31m-переконфигурации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the keep-alive connections are closed just after receiving[m
[31m-the reconfiguration signal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы imap и auth переименованы соответственно в mail и pop3_auth.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "imap" and "auth" directives were renamed[m
[31m-to the "mail" and "pop3_auth" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался метод аутентификации CRAM-MD5 и не был разрешён метод APOP,[m
[31m-то в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if the CRAM-MD5 authentication method was used[m
[31m-and the APOP method was disabled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы starttls only в протоколе POP3 nginx[m
[31m-разрешал аутентификацию без перехода в режим SSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "starttls only" directive was used in POP3 protocol,[m
[31m-then nginx allowed authentication without switching to the SSL mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочие процессы не выходили после переконфигурации и не переоткрывали логи,[m
[31m-если использовался метод eventport.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes did not exit after reconfiguration and[m
[31m-did not rotate logs if the eventport method was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы ip_hash рабочий процесс мог зациклиться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop,[m
[31m-if the "ip_hash" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx не пишет в лог некоторые alert'ы,[m
[31m-если используются методы eventport или /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx does not log some alerts if eventport or /dev/poll methods are used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.14" date="23.02.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx игнорировал лишние закрывающие скобки "}" в конце[m
[31m-конфигурационного файла.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx ignored superfluous closing "}" in the end of configuration file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.13" date="19.02.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-методы COPY и MOVE.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the COPY and MOVE methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_realip_module устанавливал мусор для запросов,[m
[31m-переданных по keep-alive соединению.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_realip_module set garbage for requests passed via[m
[31m-keep-alive connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на 64-битном big-endian Linux.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on big-endian 64-bit Linux.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при получении слишком длинной команды IMAP/POP3-прокси теперь сразу[m
[31m-закрывает соединение, а не по таймауту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now when IMAP/POP3 proxy receives too long command it closes the connection[m
[31m-right away, but not after timeout.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании метода epoll клиент закрывал преждевременно[m
[31m-соединение со своей стороны, то nginx закрывал это соединение только[m
[31m-по истечении таймаута на передачу.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "epoll" method was used and a client closed a connection prematurely,[m
[31m-then nginx closed the connection after a send timeout only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.5.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.5.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.12" date="12.02.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.5.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.5.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании временных файлов в время работы с FastCGI-сервером[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.5.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the temporary files were used while working with FastCGI server;[m
[31m-the bug had appeared in 0.5.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если переменная $fastcgi_script_name записывалась в лог,[m
[31m-то в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the $fastcgi_script_name variable was logged.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_perl_module не собирался на Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module could not be built on Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.11" date="05.02.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь configure определяет библиотеку PCRE в MacPorts.<br/>[m
[31m-Спасибо Chris McGrath.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now configure detects system PCRE library in MacPorts.<br/>[m
[31m-Thanks to Chris McGrath.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ был неверным, если запрашивалось несколько диапазонов;[m
[31m-ошибка появилась в 0.5.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response was incorrect if several ranges were requested;[m
[31m-the bug had appeared in 0.5.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива create_full_put_path не могла создавать промежуточные каталоги,[m
[31m-если не была установлена директива dav_access.<br/>[m
[31m-Спасибо Evan Miller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "create_full_put_path" directive could not create the intermediate[m
[31m-directories if no "dav_access" directive was set.<br/>[m
[31m-Thanks to Evan Miller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-вместо кодов ошибок "400" и "408" в access_log мог записываться код "0".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "0" response code might be logged in the access_log instead of[m
[31m-the "400" and "408" error codes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при сборке с оптимизацией -O2 в рабочем процессе мог произойти[m
[31m-segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if nginx was built with -O2 optimization.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.10" date="26.01.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время обновления исполняемого файла новый процесс не наследовал[m
[31m-слушающие сокеты;[m
[31m-ошибка появилась в 0.5.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while online executable file upgrade the new master process did not[m
[31m-inherit the listening sockets;[m
[31m-the bug had appeared in 0.5.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при сборке с оптимизацией -O2 в рабочем процессе мог произойти[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 0.5.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if nginx was built with -O2 optimization;[m
[31m-the bug had appeared in 0.5.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.9" date="25.01.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_memcached_module теперь в качестве ключа использует[m
[31m-значение переменной $memcached_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_memcached_module uses the $memcached_key variable value[m
[31m-as a key.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $memcached_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $memcached_key variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр clean в директиве client_body_in_file_only.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "clean" parameter in the "client_body_in_file_only" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива env.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "env" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива sendfile работает внутри блока if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile" directive is available inside the "if" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при ошибке записи в access_log nginx записывает сообщение в error_log,[m
[31m-но не чаще одного раза в минуту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on failure of the writing to access nginx logs a message to error_log,[m
[31m-but not more often than once a minute.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "access_log off" не всегда запрещала запись в лог.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access_log off" directive did not always turn off the logging.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.8" date="19.01.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовалась директива <nobr>"client_body_in_file_only on"</nobr>[m
[31m-и тело запроса было небольшое, то мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if[m
[31m-<nobr>"client_body_in_file_only on"</nobr> was used[m
[31m-and a request body was small.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если использовались директивы[m
[31m-<nobr>"client_body_in_file_only on"</nobr>[m
[31m-и <nobr>"proxy_pass_request_body off"</nobr>[m
[31m-или <nobr>"fastcgi_pass_request_body off"</nobr>,[m
[31m-и делался переход к следующему бэкенду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if <nobr>"client_body_in_file_only on"</nobr>[m
[31m-and <nobr>"proxy_pass_request_body off"</nobr>[m
[31m-or <nobr>"fastcgi_pass_request_body off"</nobr>[m
[31m-directives were used, and nginx switched to a next upstream.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании директивы "proxy_buffering off" соединение с клиентом[m
[31m-было неактивно, то оно закрывалось по таймауту, заданному директивой[m
[31m-send_timeout;[m
[31m-ошибка появилась в 0.4.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_buffering off" directive was used and a client connection[m
[31m-was non-active, then the connection was closed after send timeout;[m
[31m-the bug had appeared in 0.4.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании метода epoll клиент закрывал преждевременно[m
[31m-соединение со своей стороны, то nginx закрывал это соединение только[m
[31m-по истечении таймаута на передачу.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "epoll" method was used and a client closed a connection prematurely,[m
[31m-then nginx closed the connection after a send timeout only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "[alert] zero size buf" при работе с FastCGI-сервером.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error when FastCGI server was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправление ошибок в директиве limit_zone.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in the "limit_zone" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.7" date="15.01.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-оптимизация использования памяти в ssl_session_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ssl_session_cache storage optimization.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправление ошибок в директивах ssl_session_cache и limit_zone.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in the "ssl_session_cache" and "limit_zone" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на старте или во время переконфигурации происходил segmentation fault,[m
[31m-если директивы ssl_session_cache или limit_zone использовались[m
[31m-на 64-битных платформах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred on start or while reconfiguration[m
[31m-if the "ssl_session_cache" or "limit_zone" directives were used[m
[31m-on 64-bit platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив add_before_body или add_after_body происходил[m
[31m-segmentation fault, если в заголовке ответа нет строки "Content-Type".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if the "add_before_body" or "add_after_body"[m
[31m-directives were used and there was no "Content-Type" header line in response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-библиотека OpenSSL всегда собиралась с поддержкой потоков.<br/>[m
[31m-Спасибо Дену Иванову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the OpenSSL library was always built with the threads support.<br/>[m
[31m-Thanks to Den Ivanov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость библиотеки PCRE-6.5+ и компилятора icc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the PCRE-6.5+ library and the icc compiler compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.6" date="09.01.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь модуль ngx_http_index_module игнорирует все методы,[m
[31m-кроме GET, HEAD и POST.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_index_module ignores all methods except the GET, HEAD, and[m
[31m-POST methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_limit_zone_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_limit_zone_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $binary_remote_addr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $binary_remote_addr variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_session_cache модулей ngx_http_ssl_module и ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_cache" directives[m
[31m-of the ngx_http_ssl_module and ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-метод DELETE поддерживает рекурсивное удаление.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the DELETE method supports recursive removal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании $r->sendfile() byte-ranges передавались неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the byte-ranges were transferred incorrectly if the $r->sendfile() was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.5" date="24.12.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ключ -v больше не выводит информацию о компиляторе.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -v switch does not show compiler information any more.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -V.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -V switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_rlimit_core поддерживает указание размера в K, M и G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_rlimit_core" directive supports size in K, M, and G.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль nginx.pm теперь может устанавливаться непривилегированным пользователем.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the nginx.pm module now could be installed by an unprivileged user.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании методов $r->request_body или $r->request_body_file мог[m
[31m-произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if the $r->request_body or[m
[31m-$r->request_body_file methods were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибок, специфичных для платформы ppc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ppc platform specific bugs.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.4" date="15.12.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву perl можно использовать внутри блока limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "perl" directive may be used inside the "limit_except" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module требовал строку "Date" в заголовке запроса[m
[31m-для метода DELETE.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module required the "Date" request header line[m
[31m-for the DELETE method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании одного параметра в директиве dav_access nginx мог[m
[31m-сообщить об ошибке в конфигурации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if one only parameter was used in the "dav_access" directive, then[m
[31m-nginx might report about configuration error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной $host мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.4.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if the $host variable was used;[m
[31m-the bug had appeared in 0.4.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.3" date="13.12.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает методы $r->status, $r->log_error[m
[31m-и $r->sleep.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->status, $r->log_error,[m
[31m-and $r->sleep methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-метод $r->variable поддерживает переменные, неописанные в конфигурации nginx'а.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->variable method supports variables that do not exist in nginx[m
[31m-configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод $r->has_request_body не работал.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->has_request_body method did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.2" date="11.12.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директивах proxy_pass использовалось имя, указанное в upstream,[m
[31m-то nginx пытался найти IP-адрес этого имени;[m
[31m-ошибка появилась в 0.5.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_pass" directive used the name of the "upstream" block,[m
[31m-then nginx tried to resolve the name;[m
[31m-the bug had appeared in 0.5.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.1" date="11.12.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива post_action могла не работать после неудачного завершения запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_action" directive might not run after a unsuccessful completion[m
[31m-of a request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки в Eudora для Mac;[m
[31m-ошибка появилась в 0.4.11.<br/>[m
[31m-Спасибо Bron Gondwana.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for Eudora for Mac;[m
[31m-the bug had appeared in 0.4.11.<br/>[m
[31m-Thanks to Bron Gondwana.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при указании в директиве fastcgi_pass имени описанного upstream'а выдавалось[m
[31m-сообщение "no port in upstream";[m
[31m-ошибка появилась в 0.5.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "upstream" name was used in the "fastcgi_pass", then the message[m
[31m-"no port in upstream" was issued;[m
[31m-the bug had appeared in 0.5.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директивах proxy_pass и fastcgi_pass использовались одинаковых имена[m
[31m-серверов, но с разными портами, то эти директивы использовали первый[m
[31m-описанный порт;[m
[31m-ошибка появилась в 0.5.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_pass" and "fastcgi_pass" directives used the same servers but[m
[31m-different ports, then these directives uses the first described port;[m
[31m-the bug had appeared in 0.5.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директивах proxy_pass и fastcgi_pass использовались unix domain сокеты,[m
[31m-то эти директивы использовали первый описанный сокет;[m
[31m-ошибка появилась в 0.5.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_pass" and "fastcgi_pass" directives used the unix domain sockets,[m
[31m-then these directives used first described socket;[m
[31m-the bug had appeared in 0.5.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_auth_basic_module игнорировал пользователя, если он был указан[m
[31m-в последней строке файла паролей и после пароля не было перевода строки,[m
[31m-возврата каретки или символа ":".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_auth_basic_module ignored the user if it was in the last line in[m
[31m-the password file and there was no the carriage return, the line feed,[m
[31m-or the ":" symbol after the password.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_time могла быть равна "0.000", хотя время[m
[31m-обработки было больше 1 миллисекунды.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_time variable might be equal to "0.000", although[m
[31m-response time was more than 1 millisecond.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.0" date="04.12.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметры в виде "%name" в директиве log_format больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the parameters in the "%name" form in the "log_format" directive[m
[31m-are not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_upstream_max_fails, proxy_upstream_fail_timeout,[m
[31m-fastcgi_upstream_max_fails, и fastcgi_upstream_fail_timeout,[m
[31m-memcached_upstream_max_fails и memcached_upstream_fail_timeout[m
[31m-больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_upstream_max_fails", "proxy_upstream_fail_timeout",[m
[31m-"fastcgi_upstream_max_fails", "fastcgi_upstream_fail_timeout",[m
[31m-"memcached_upstream_max_fails", and "memcached_upstream_fail_timeout"[m
[31m-directives are not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server в блоке upstream поддерживает параметры[m
[31m-max_fails, fail_timeout и down.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server" directive in the "upstream" context supports[m
[31m-the "max_fails", "fail_timeout", and "down" parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ip_hash в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ip_hash" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-статус WAIT в строке "Auth-Status" в заголовке ответа сервера аутентификации[m
[31m-IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the WAIT status in the "Auth-Status" header line of the IMAP/POP3 proxy[m
[31m-authentication server response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на 64-битных платформах;[m
[31m-ошибка появилась в 0.4.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on 64-bit platforms;[m
[31m-the bug had appeared in 0.4.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.14" date="27.11.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass_error_message в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass_error_message" directive in IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь configure определяет библиотеку PCRE на FreeBSD, Linux и NetBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now configure detects system PCRE library on FreeBSD, Linux, and NetBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_perl_module не работал с перлом, собранным с поддержкой потоков;[m
[31m-ошибка появилась в 0.3.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module did not work with perl built with the threads support;[m
[31m-the bug had appeared in 0.3.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_perl_module не работал корректно, если перл вызывался рекурсивно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module did not work if perl was called recursively.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx игнорировал имя сервера в строке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx ignored a host name in a request line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если FastCGI сервер передавал много в stderr,[m
[31m-то рабочий процесс мог зациклиться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop,[m
[31m-if a FastCGI server sent too many data to the stderr.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при изменении системного времени переменная $upstream_response_time[m
[31m-могла быть отрицательной.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_time variable may be negative if the system time[m
[31m-was changed backward.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании POP3 серверу аутентификации IMAP/POP3 прокси[m
[31m-не передавался параметр Auth-Login-Attempt.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Auth-Login-Attempt" parameter was not sent to[m
[31m-IMAP/POP3 proxy authentication server when POP3 was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при ошибке соединения с сервером аутентификации IMAP/POP3 прокси[m
[31m-мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if connect to IMAP/POP3 proxy[m
[31m-authentication server failed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.13" date="15.11.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву proxy_pass можно использовать внутри блока limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" directive may be used inside the "limit_except" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива limit_except поддерживает все WebDAV методы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_except" directive supports all WebDAV methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы add_before_body без директивы add_after_body[m
[31m-ответ передавался не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "add_before_body" directive was used without[m
[31m-the "add_after_body" directive, then a response did not transferred complete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-большое тело запроса не принималось, если использовались метод epoll[m
[31m-и deferred accept().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a large request body did not receive if the epoll method[m
[31m-and the deferred accept() were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для ответов модуля ngx_http_autoindex_module не выставлялась кодировка;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a charset could not be set for ngx_http_autoindex_module responses;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "[alert] zero size buf" при работе с FastCGI-сервером;[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error when FastCGI server was used;[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр конфигурации --group= игнорировался.<br/>[m
[31m-Спасибо Thomas Moschny.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --group= configuration parameter was ignored.<br/>[m
[31m-Thanks to Thomas Moschny.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-50-й подзапрос в SSI ответе не работал;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the 50th subrequest in SSI response did not work;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.12" date="31.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->variable.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->variable method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении в ответ большого статического файла с помощью SSI[m
[31m-ответ мог передаваться не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a big static file was included using SSI in a response,[m
[31m-then the response may be transferred incomplete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не убирал "#fragment" в URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not omit the "#fragment" part in URI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.11" date="25.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-POP3 прокси поддерживает AUTH LOIGN PLAIN и CRAM-MD5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the POP3 proxy supports the AUTH LOGIN PLAIN and CRAM-MD5.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->allow_ranges.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->allow_ranges method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включённой поддержке команды APOP в POP3 прокси могли[m
[31m-не работать команды USER/PASS;[m
[31m-ошибка появилась в 0.4.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the APOP was enabled in the POP3 proxy, then the USER/PASS commands[m
[31m-might not work;[m
[31m-the bug had appeared in 0.4.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.10" date="23.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-POP3 прокси поддерживает APOP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the POP3 proxy supports the APOP command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании методов select, poll и /dev/poll во время ожидания[m
[31m-ответа от сервера аутентификации IMAP/POP3 прокси нагружал процессор.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the select, poll or /dev/poll methods were used, then while[m
[31m-waiting authentication server response the IMAP/POP3 proxy hogged CPU.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной $server_addr в директиве map мог[m
[31m-произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if the $server_addr variable was used[m
[31m-in the "map" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_flv_module не поддерживал byte ranges для полных ответов;[m
[31m-ошибка появилась в 0.4.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_flv_module did not support the byte ranges for full responses;[m
[31m-the bug had appeared in 0.4.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Debian amd64;[m
[31m-ошибка появилась в 0.4.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Debian amd64;[m
[31m-the bug had appeared in 0.4.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.9" date="13.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр set в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set" parameter in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module теперь проверяет версию модуля nginx.pm.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module now tests the nginx.pm module version.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.8" date="11.10.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если до команды SSI include с параметром wait выполнялась ещё[m
[31m-одна команда SSI include, то параметр wait мог не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if an "include" SSI command were before another "include" SSI command[m
[31m-with a "wait" parameter, then the "wait" parameter might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_flv_module добавлял FLV-заголовок для полных ответов.<br/>[m
[31m-Спасибо Алексею Ковырину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_flv_module added the FLV header to the full responses.<br/>[m
[31m-Thanks to Alexey Kovyrin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.7" date="10.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_flv_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_flv_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $request_body_file.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_body_file variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы charset и source_charset поддерживают переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "charset" and "source_charset" directives support the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если до команды SSI include с параметром wait выполнялась ещё[m
[31m-одна команда SSI include, то параметр wait мог не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if an "include" SSI command were before another "include" SSI command[m
[31m-with a "wait" parameter, then the "wait" parameter might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "proxy_buffering off" или при работе[m
[31m-с memcached соединения могли не закрываться по таймауту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_buffering off" directive was used or while working with[m
[31m-memcached the connections might not be closed on timeout.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запускался на 64-битных платформах, отличных от amd64, sparc64 и ppc64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not run on 64-bit platforms except amd64, sparc64, and ppc64.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.6" date="06.10.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запускался на 64-битных платформах, отличных от amd64, sparc64 и ppc64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not run on 64-bit platforms except amd64, sparc64, and ppc64.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при запросе версии HTTP/1.1 nginx передавал ответ chunk'ами,[m
[31m-если длина ответа в методе $r->headers_out("Content-Length", ...)[m
[31m-была задана текстовой строкой.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx sent the chunked response for HTTP/1.1 request,<br/>[m
[31m-if its length was set by text string in[m
[31m-the $r->headers_out("Content-Length", ...) method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления ошибки с помощью директивы error_page любая директива[m
[31m-модуля ngx_http_rewrite_module возвращала эту ошибку;[m
[31m-ошибка появилась в 0.4.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-after redirecting error by an "error_page" directive[m
[31m-any ngx_http_rewrite_module directive returned this error code;[m
[31m-the bug had appeared in 0.4.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.5" date="02.10.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux и Solaris;[m
[31m-ошибка появилась в 0.4.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux and Solaris;[m
[31m-the bug had appeared in 0.4.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.4" date="02.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $scheme.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $scheme variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива expires поддерживает параметр max.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive supports the "max" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива include поддерживает маску "*".<br/>[m
[31m-Спасибо Jonathan Dance.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "include" directive supports the "*" mask.<br/>[m
[31m-Thanks to Jonathan Dance.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива return всегда изменяла код ответа, перенаправленного[m
[31m-директивой error_page.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "return" directive always overrode the "error_page" response code[m
[31m-redirected by the "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если в методе PUT передавалось[m
[31m-тело нулевой длины.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if zero-length body was in PUT method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменных в директиве proxy_redirect редирект[m
[31m-изменялся неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the redirect was changed incorrectly if the variables were used[m
[31m-in the "proxy_redirect" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.3" date="26.09.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ошибку 499 теперь нельзя перенаправить с помощью директивы error_page.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the 499 error could not be redirected using an "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка Solaris 10 event ports.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Solaris 10 event ports support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_browser_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_browser_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении ошибки 400 проксированному серверу[m
[31m-помощью директивы error_page мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault may occur while redirecting the 400 error[m
[31m-to the proxied server using a "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если в директиве proxy_pass использовался[m
[31m-unix domain сокет;[m
[31m-ошибка появилась в 0.3.47.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if an unix domain socket was used in[m
[31m-a "proxy_pass" directive;[m
[31m-the bug had appeared in 0.3.47.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSI не работал с ответами memcached и небуферизированными проксированными[m
[31m-ответами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSI did work with memcached and nonbuffered responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки PAUSE hardware capability в Sun Studio.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of the Sun Studio PAUSE hardware capability bug.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.2" date="14.09.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-убрана поддержка флага O_NOATIME на Linux;[m
[31m-ошибка появилась в 0.4.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the O_NOATIME flag support on Linux was canceled;[m
[31m-the bug had appeared in 0.4.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.1" date="14.09.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с DragonFlyBSD.<br/>[m
[31m-Спасибо Павлу Назарову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the DragonFlyBSD compatibility.<br/>[m
[31m-Thanks to Pavel Nazarov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки в sendfile() в 64-битном Linux при передаче файлов больше 2G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of bug in 64-bit Linux sendfile(), when file is more than 2G.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь на Linux nginx для статических запросов использует флаг O_NOATIME.<br/>[m
[31m-Спасибо Yusuf Goolamabbas.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on Linux nginx uses O_NOATIME flag for static requests.<br/>[m
[31m-Thanks to Yusuf Goolamabbas.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.0" date="30.08.2006">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменение во внутреннем API: инициализация модулей HTTP перенесена из фазы[m
[31m-init module в фазу HTTP postconfiguration.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Change in internal API: the HTTP modules initialization was moved[m
[31m-from the init module phase to the HTTP postconfiguration phase.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь тело запроса в модуле ngx_http_perl_module не считывается[m
[31m-заранее: нужно явно инициировать чтение с помощью метода $r->has_request_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the request body is not read beforehand for the ngx_http_perl_module:[m
[31m-it's required to start the reading using the $r->has_request_body method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает код возврата DECLINED.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the DECLINED return code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module поддерживает входящую строку заголовка "Date"[m
[31m-для метода PUT.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module supports the incoming "Date" header line[m
[31m-for the PUT method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssi работает внутри блока if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi" directive is available inside the "if" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если в директиве index использовалась[m
[31m-переменные и при этом первое имя индексного файла было без переменных;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if there was an "index" directive with[m
[31m-variables and the first index name was without variables;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.61" date="28.08.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива tcp_nodelay теперь по умолчанию включена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "tcp_nodelay" directive is turned on by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива msie_refresh.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "msie_refresh" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива recursive_error_pages.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "recursive_error_pages" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива rewrite возвращала неправильный редирект, если редирект[m
[31m-включал в себя выделенные закодированные символы из оригинального URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rewrite" directive returned incorrect redirect, if the redirect[m
[31m-had the captured escaped symbols from original URI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.60" date="18.08.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время перенаправления ошибки рабочий процесс мог зациклиться;[m
[31m-ошибка появилась в 0.3.59.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop[m
[31m-while an error redirection;[m
[31m-the bug had appeared in 0.3.59.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.59" date="16.08.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно делать несколько перенаправлений через директиву error_page.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now is possible to do several redirection using the "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива dav_access не поддерживала три параметра.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "dav_access" directive did not support three parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не изменяла строку "Content-Type"[m
[31m-после перенаправления с помощью "X-Accel-Redirect";[m
[31m-ошибка появилась в 0.3.58.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive did not changes the "Content-Type" header line[m
[31m-after the "X-Accel-Redirect" was used;[m
[31m-the bug had appeared in 0.3.58.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.58" date="14.08.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива error_page поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive supports the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь на Linux используется интерфейс procfs вместо sysctl.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the procfs interface instead of sysctl is used on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании "X-Accel-Redirect" строка "Content-Type" наследуется[m
[31m-из первоначального ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "Content-Type" header line is inherited from first response[m
[31m-when the "X-Accel-Redirect" was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не перенаправляла ошибку 413.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive did not redirect the 413 error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-завершающий "?" не удалял старые аргументы, если в переписанном URI[m
[31m-не было новых аргументов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the trailing "?" did not remove old arguments if no new arguments[m
[31m-were added to a rewritten URI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запускался на 64-битной FreeBSD 7.0-CURRENT.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not run on 64-bit FreeBSD 7.0-CURRENT.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.57" date="09.08.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_client_serial.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_serial variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в операторе "!-e" в директиве if.<br/>[m
[31m-Спасибо Андриану Буданцову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "!-e" operator of the "if" directive.<br/>[m
[31m-Thanks to Andrian Budanstov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проверке клиентского сертификата nginx не передавал клиенту[m
[31m-информацию о требуемых сертификатах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while a client certificate verification nginx did not send to a client[m
[31m-the required certificates information.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $document_root не поддерживала переменные в директиве root.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $document_root variable did not support the variables in the "root"[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.56" date="04.08.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива dav_access.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "dav_access" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if поддерживает операторы "-d", "!-d", "-e", "!-e", "-x" и "!-x".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" directive supports the "-d", "!-d", "-e", "!-e", "-x", and "!-x"[m
[31m-operators.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при записи в access_log некоторых передаваемых клиенту строк заголовков[m
[31m-происходил segmentation fault, если запрос возвращал редирект.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if a request returned a redirect and[m
[31m-some sent to client header lines were logged in the access log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.55" date="28.07.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр stub в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "stub" parameter in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-команда SSI block.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "block" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-скрипт unicode2nginx добавлен в contrib.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the unicode2nginx script was added to contrib.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если root был задан только переменной, то корень задавался[m
[31m-относительно префикса сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a "root" was specified by variable only, then the root was relative[m
[31m-to a server prefix.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в запросе был "//" или "/.", и после этого закодированные[m
[31m-символы в виде "%XX", то проксируемый запрос передавался незакодированным.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request contained "//" or "/./" and escaped symbols after them,[m
[31m-then the proxied request was sent unescaped.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод $r->header_in("Cookie") модуля ngx_http_perl_module теперь возвращает[m
[31m-все строки "Cookie" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->header_in("Cookie") of the ngx_http_perl_module now returns[m
[31m-all "Cookie" header lines.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если использовался[m
[31m-<nobr>"client_body_in_file_only on"</nobr>[m
[31m-и делался переход к следующему бэкенду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if <nobr>"client_body_in_file_only on"</nobr>[m
[31m-was used and nginx switched to a next upstream.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условиях во время переконфигурации коды символов[m
[31m-внутри директивы charset_map могли считаться неверными;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on some condition while reconfiguration character codes[m
[31m-inside the "charset_map" may be treated invalid;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.54" date="11.07.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-nginx теперь записывает в лог информацию о подзапросах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now logs the subrequest information to the error log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_next_upstream, fastcgi_next_upstream и memcached_next_upstream[m
[31m-поддерживают параметр off.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_next_upstream", "fastcgi_next_upstream",[m
[31m-and "memcached_next_upstream" directives support the "off" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива debug_connection поддерживает запись адресов в формате CIDR.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "debug_connection" directive supports the CIDR address form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перекодировании ответа проксированного сервера или сервера FastCGI[m
[31m-в UTF-8 или наоборот ответ мог передаваться не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a response of proxied server or FastCGI server was converted from UTF-8[m
[31m-or back, then it may be transferred incomplete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_time содержала время только первого[m
[31m-обращения к бэкенду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_time variable had the time of the first[m
[31m-request to a backend only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформе amd64;[m
[31m-ошибка появилась в 0.3.53.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on amd64 platform;[m
[31m-the bug had appeared in 0.3.53.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.53" date="07.07.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива add_header добавляет строки в ответы с кодом 204, 301 и 302.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header" directive adds the string to 204, 301, and 302 responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server в блоке upstream поддерживает параметр weight.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server" directive in the "upstream" context supports[m
[31m-the "weight" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает маску "*".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" directive supports the "*" wildcard.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-nginx поддерживает тело запроса больше 2G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx supports the request body size more than 2G.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании "satisfy_any on" клиент успешно проходил аутентификацию,[m
[31m-в лог всё равно записалоcь сообщение "access forbidden by rule".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a client was successfully authorized using "satisfy_any on", then anyway[m
[31m-the message "access forbidden by rule" was written in the log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод PUT мог ошибочно не создать файл и вернуть код 409.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "PUT" method may erroneously not create a file and return the 409 code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если во время аутентификации IMAP/POP3 бэкенд возвращал ошибку, nginx[m
[31m-продолжал проксирование.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the IMAP/POP3 backend returned an error, then nginx continued proxying[m
[31m-anyway.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.52" date="03.07.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-восстановлено поведение модуля ngx_http_index_module для запросов "POST /":[m
[31m-как в версии до 0.3.40, модуль теперь не выдаёт ошибку 405.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_index_module behavior for the "POST /" requests is reverted[m
[31m-to the 0.3.40 version state: the module now does not return the 405 error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании ограничения скорости рабочий процесс мог зациклиться;[m
[31m-ошибка появилась в 0.3.37.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker process may got caught in an endless loop if the limit rate was used;[m
[31m-the bug had appeared in 0.3.37.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_charset_module записывал в лог ошибку "unknown charset",[m
[31m-даже если перекодировка не требовалась;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_charset_module logged "unknown charset" alert, even if the recoding[m
[31m-was not needed;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в результате запроса PUT возвращался код 409, то временный файл[m
[31m-не удалялся.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a code response of the PUT request was 409, then a temporary file[m
[31m-was not removed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.51" date="30.06.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условиях в SSI мог пропадать символы "&lt;";[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "&lt;" symbols might disappeared some conditions in the SSI;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.50" date="28.06.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_redirect_errors и fastcgi_redirect_errors[m
[31m-переименованы соответственно в proxy_intercept_errors и[m
[31m-fastcgi_intercept_errors.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect_errors" and "fastcgi_redirect_errors" directives[m
[31m-was renamed to the "proxy_intercept_errors" and[m
[31m-"fastcgi_intercept_errors" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_charset_module поддерживает перекодирование из[m
[31m-однобайтных кодировок в UTF-8 и обратно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_charset_module supports the recoding from the single byte[m
[31m-encodings to the UTF-8 encoding and back.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси и FastCGI поддерживается строка заголовка "X-Accel-Charset"[m
[31m-в ответе бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Charset" response header line is supported in proxy[m
[31m-and FastCGI mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-символ "\" в парах "\"" и "\'" в SSI командах убирался, только если[m
[31m-также использовался символ "$".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "\" escape symbol in the "\"" and "\'" pairs in the SSI command[m
[31m-was removed only if the command also has the "$" symbol.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условиях в SSI после вставки могла быть добавлена[m
[31m-строка "&lt;!--".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "&lt;!--" string might be added on some conditions[m
[31m-in the SSI after inclusion.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в заголовке ответа была строка <nobr>"Content-Length: 0",</nobr>[m
[31m-то при использовании небуферизированного проксировании не закрывалось соединение[m
[31m-с клиентом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "Content-Length: 0" header line was in response, then[m
[31m-in nonbuffered proxying mode the client connection was not closed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.49" date="31.05.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "set" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении в ssi двух и более подзапросов, обрабатываемых через FastCGI,[m
[31m-вместо вывода второго и остальных подзапросов в ответ включался вывод[m
[31m-первого подзапроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if two or more FastCGI subrequests was in SSI, then first subrequest output[m
[31m-was included instead of second and following subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.48" date="29.05.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь модуль ngx_http_charset_module работает для подзапросов,[m
[31m-в ответах которых нет строки заголовка "Content-Type".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_charset_module works for subrequests,[m
[31m-if the response has no "Content-Type" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве proxy_pass не было URI,[m
[31m-то директива "proxy_redirect  default" добавляла в переписанный[m
[31m-редирект в начало лишний слэш.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_pass" directive has no URI part,[m
[31m-then the "proxy_redirect  default" directive add the unnecessary slash[m
[31m-in start of the rewritten redirect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-внутренний редирект всегда превращал любой HTTP-метод в GET,[m
[31m-теперь это делается только для редиректов, выполняемых с помощью[m
[31m-X-Accel-Redirect, и у которых метод не равен HEAD;[m
[31m-ошибка появилась в 0.3.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the internal redirect always transform client's HTTP method to GET,[m
[31m-now the transformation is made for the "X-Accel-Redirect" redirects only[m
[31m-and if the method is not HEAD;[m
[31m-the bug had appeared in 0.3.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module не собирался, если перл был с поддержкой потоков;[m
[31m-ошибка появилась в 0.3.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module could not be built, if the perl was built[m
[31m-with the threads support;[m
[31m-the bug had appeared in 0.3.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.47" date="23.05.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "upstream" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-символ "\" в парах "\"" и "\'" в SSI командах теперь всегда убирается.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "\" escape symbol in the "\"" and "\'" pairs in the SSI command[m
[31m-is always removed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.46" date="11.05.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_hide_header, proxy_pass_header, fastcgi_hide_header[m
[31m-и fastcgi_pass_header.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_hide_header", "proxy_pass_header", "fastcgi_hide_header",[m
[31m-and "fastcgi_pass_header" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass_x_powered_by, fastcgi_x_powered_by и proxy_pass_server[m
[31m-упразднены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass_x_powered_by", "fastcgi_x_powered_by", and "proxy_pass_server"[m
[31m-directives were canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси поддерживается строка заголовка "X-Accel-Buffering"[m
[31m-в ответе бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Buffering" response header line is supported in proxy mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибок и утечек памяти при переконфигурации в модуле ngx_http_perl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the reconfiguration bug and memory leaks in the ngx_http_perl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.45" date="06.05.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_verify_client, ssl_verify_depth и ssl_client_certificate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate"[m
[31m-directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь переменная $request_method возвращает метод только основного запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_method variable now returns the main request method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в таблице перекодировки koi-win изменены коды символа &amp;deg;.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the &amp;deg; symbol codes were changed in koi-win conversion table.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в таблицу перекодировки koi-win добавлены символы евро и номера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the euro and N symbols were added to koi-win conversion table.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx распределял запросы на несколько машин, то при падении[m
[31m-одной из них запросы, предназначенные для этой машины, перенаправлялись только[m
[31m-на одну машину вместо того, чтобы равномерно распределяться между остальными.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx distributed the requests among several backends and some backend[m
[31m-failed, then requests intended for this backend was directed to one live[m
[31m-backend only instead of being distributed among the rest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.44" date="04.05.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр wait в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "wait" parameter in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в таблицу перекодировки koi-win добавлены украинские и белорусские символы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Ukrainian and Byelorussian characters were added to koi-win conversion[m
[31m-table.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.43" date="26.04.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.42" date="26.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр bind в директиве listen в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "bind" option of the "listen" directive in IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании в директиве rewrite одного и того же[m
[31m-выделения более одного раза.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the same capture in the "rewrite" directive was used more then once.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в лог не записывались переменные[m
[31m-$sent_http_content_type, $sent_http_content_length, $sent_http_last_modified,[m
[31m-$sent_http_connection, $sent_http_keep_alive и $sent_http_transfer_encoding.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $sent_http_content_type, $sent_http_content_length,[m
[31m-$sent_http_last_modified, $sent_http_connection, $sent_http_keep_alive,[m
[31m-and $sent_http_transfer_encoding variables were not written to access log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $sent_http_cache_control возвращала содержимое только одной[m
[31m-строки "Cache-Control" в заголовке ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $sent_http_cache_control returned value of the single "Cache-Control"[m
[31m-response header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.41" date="21.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -v.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -v switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении в SSI удалённых подзапросов[m
[31m-мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if the SSI page has remote subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке FastCGI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in FastCGI handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если путь к перловым модулям не был указан с помощью[m
[31m---with-perl_modules_path=PATH или директивы perl_modules,[m
[31m-то на старте происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the perl modules path was not set using[m
[31m---with-perl_modules_path=PATH or the "perl_modules", then[m
[31m-the segmentation fault was occurred.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.40" date="19.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module поддерживает метод MKCOL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module supports the MKCOL method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива create_full_put_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "create_full_put_path" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $limit_rate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$limit_rate" variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.39" date="17.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива uninitialized_variable_warn; уровень логгирования сообщения[m
[31m-о неинициализированной переменной понижен с уровня alert на warn.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "uninitialized_variable_warn" directive; the logging level of the[m
[31m-"uninitialized variable" message was lowered from "alert" to "warn".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива override_charset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "override_charset" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-при использовании неизвестной переменной в SSI-командах echo и if expr='$name'[m
[31m-теперь не записывается в лог сообщение о неизвестной переменной.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if the unknown variable is used in the "echo" and "if expr='$name'"[m
[31m-SSI-commands, then the "unknown variable" message is not logged.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-счётчик активных соединений рос при превышении лимита соединений,[m
[31m-заданного директивой worker_connections;[m
[31m-ошибка появилась в 0.2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the active connection counter increased on the exceeding of the connection[m
[31m-limit specified by the "worker_connections" directive;[m
[31m-the bug had appeared in 0.2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условия ограничение скорости соединения могло не работать;[m
[31m-ошибка появилась в 0.3.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the limit rate might not work on some condition;[m
[31m-the bug had appeared in 0.3.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.38" date="14.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-оптимизация модуля ngx_http_perl_module.<br/>[m
[31m-Спасибо Сергею Скворцову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module optimizations.<br/>[m
[31m-Thanks to Sergey Skvortsov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->request_body_file.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->request_body_file method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива client_body_in_file_only.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "client_body_in_file_only" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-теперь при переполнении диска nginx пытается писать access_log'и только[m
[31m-раз в секунду.<br/>[m
[31m-Спасибо Антону Южанинову и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on disk overflow nginx tries to write access logs once a second only.<br/>[m
[31m-Thanks to Anton Yuzhaninov and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь директива limit_rate точнее ограничивает скорость при значениях[m
[31m-больше <nobr>100 Kbyte/s.</nobr><br/>[m
[31m-Спасибо ForJest.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "limit_rate" directive more precisely limits rate if rate is more[m
[31m-than <nobr>100 Kbyte/s.</nobr><br/>[m
[31m-Thanks to ForJest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси теперь передаёт серверу авторизации символы "\r" и "\n"[m
[31m-в логине и пароле в закодированном виде.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the IMAP/POP3 proxy escapes the "\r" and "\n" symbols in login and[m
[31m-password to pass authorization server.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.37" date="07.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_except" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if поддерживает операторы "!~", "!~*", "-f" и "!-f".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" directive supports the "!~", "!~*", "-f", and "!-f" operators.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->request_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->request_body method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_addition_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_addition_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.36" date="05.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_addition_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_addition_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass и fastcgi_pass можно использовать внутри блока if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" and "fastcgi_pass" directives may be used inside[m
[31m-the "if" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ignore_client_abort и fastcgi_ignore_client_abort.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ignore_client_abort" and "fastcgi_ignore_client_abort" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $request_completion.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$request_completion" variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает методы $r->request_method и[m
[31m-$r->remote_addr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->request_method and $r->remote_addr.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает команду elif.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the "elif" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строка "\/" в начале выражения команды if модуля ngx_http_ssi_module[m
[31m-воспринималась неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "\/" string in the expression of the "if" command of the[m
[31m-ngx_http_ssi_module was treated incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании регулярных выражениях в команде if модуля ngx_http_ssi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the regular expressions in the "if" command of the ngx_http_ssi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при задании относительного пути в директивах[m
[31m-client_body_temp_path, proxy_temp_path, fastcgi_temp_path и perl_modules[m
[31m-использовался каталог относительно текущего каталога, а не относительно[m
[31m-префикса сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the relative path was specified in the "client_body_temp_path",[m
[31m-"proxy_temp_path", "fastcgi_temp_path", and "perl_modules" directives,[m
[31m-then the directory was used relatively to a current path but not[m
[31m-to a server prefix.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.35" date="22.03.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-accept-фильтр и TCP_DEFER_ACCEPT устанавливались только для первой[m
[31m-директивы listen;[m
[31m-ошибка появилась в 0.3.31.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the accept-filter and the TCP_DEFER_ACCEPT option were set for first "listen"[m
[31m-directive only;[m
[31m-the bug had appeared in 0.3.31.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_pass без URI при использовании в подзапросе.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_pass" directive without the URI part in a subrequest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.34" date="21.03.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива add_header поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header" directive supports the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.33" date="15.03.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр http_503 в директивах proxy_next_upstream или fastcgi_next_upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "http_503" parameter of the "proxy_next_upstream" or[m
[31m-"fastcgi_next_upstream" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_perl_module не работал со встроенным в конфигурационный файл кодом,[m
[31m-если он не начинался сразу же с "sub".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module did not work with inlined in the configuration code,[m
[31m-if it was not started with the "sub" word.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве post_action.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "post_action" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.32" date="11.03.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-удаление отладочного логгирования на старте и при переконфигурации;[m
[31m-ошибка появилась в 0.3.31.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the debug logging on startup and reconfiguration time was removed;[m
[31m-the bug had appeared in 0.3.31.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.31" date="10.03.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx передаёт неверные ответы проксированного бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx passes the malformed proxied backend responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы listen поддерживают адрес в виде "*:порт".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directives support the address in the "*:port" form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка EVFILER_TIMER в MacOSX 10.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the EVFILER_TIMER support in MacOSX 10.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки обработки миллисекундных таймаутов kqueue в 64-битном ядре[m
[31m-MacOSX.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for MacOSX 64-bit kernel kqueue millisecond timeout bug.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если внутри одного сервера описаны несколько директив listen, слушающих на[m
[31m-разных адресах, то имена серверов вида "*.domain.tld" работали только[m
[31m-для первого адреса;[m
[31m-ошибка появилась в 0.3.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if there were several "listen" directives listening one various addresses[m
[31m-inside one server, then server names like "*.domain.tld" worked for first[m
[31m-address only;[m
[31m-the bug had appeared in 0.3.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании протокола HTTPS в директиве proxy_pass не передавались[m
[31m-запросы с телом, записанным во временный файл.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the HTTPS protocol was used in the "proxy_pass" directive and[m
[31m-the request body was in temporary file then the request was not transferred.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с perl 5.8.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-perl 5.8.8 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.30" date="22.02.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-уровень записи в лог ошибки ECONNABORTED изменён на error с уровня crit.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ECONNABORTED error log level was changed to "error" from "crit".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module не собирался без модуля ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module could not be build without[m
[31m-the ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на i386 платформе, если использовался PIC;[m
[31m-ошибка появилась в 0.3.27.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on i386 platform, if the PIC was used;[m
[31m-the bug had appeared in 0.3.27.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.29" date="20.02.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx использует меньше памяти, если PHP в режиме FastCGI передаёт[m
[31m-большое количество предупреждений перед ответом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses less memory, if PHP in FastCGI mode sends many warnings[m
[31m-before the response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в ответах 204 для запросов версии HTTP/1.1 выдавалась строка заголовка[m
[31m-"Transfer-Encoding: chunked".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Transfer-Encoding: chunked" header line was issued in the 204 responses[m
[31m-for the HTTP/1.1 requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx возвращал 502 код ответа, если FastCGI сервер передавал полные строки[m
[31m-заголовка ответа в отдельных FastCGI записях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx returned the 502 response, if the complete response header lines[m
[31m-were transferred in a separate FastCGI records.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве post_action был указан проксируемый URI, то он выполнялся[m
[31m-только после успешного завершения запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the proxied URI was specified in the "post_action" directive, then it ran[m
[31m-only after a successful completion of a request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.28" date="16.02.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива restrict_host_names упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "restrict_host_names" directive was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр конфигурации --with-cpu-opt=ppc64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --with-cpu-opt=ppc64 configuration parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условиях проксированное соединение с клиентом завершалось[m
[31m-преждевременно.<br/>[m
[31m-Спасибо Владимиру Шутову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on some condition the proxied connection with a client was terminated[m
[31m-prematurely.<br/>[m
[31m-Thanks to Vladimir Shutoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строка заголовка "X-Accel-Limit-Rate" не учитывалась для запросов,[m
[31m-перенаправленных с помощью строки "X-Accel-Redirect".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Limit-Rate" header line was not taken into account[m
[31m-if the request was redirected using the "X-Accel-Redirect" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива post_action работала только после успешного завершения запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_action" directive ran only after a successful completion of a request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-тело проксированного ответа, создаваемого директивой post_action,[m
[31m-передавалось клиенту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxied response body generated by the "post_action" directive[m
[31m-was transferred to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.27" date="08.02.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы variables_hash_max_size и variables_hash_bucket_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "variables_hash_max_size" and "variables_hash_bucket_size" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $body_bytes_sent доступна не только в директиве log_format.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $body_bytes_sent variable can be used not only in the "log_format"[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $ssl_protocol и $ssl_cipher.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_protocol and $ssl_cipher variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-определение размера строки кэша распространённых процессоров при старте.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the cache line size detection for widespread CPUs at start time.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива accept_mutex теперь поддерживается посредством fcntl(2)[m
[31m-на платформах, отличных от i386, amd64, sparc64 и ppc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "accept_mutex" directive is supported using fcntl(2)[m
[31m-on platforms different from i386, amd64, sparc64, and ppc.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива lock_file и параметр автоконфигурации --with-lock-path=PATH.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "lock_file" directive and the --with-lock-path=PATH autoconfiguration[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании протокола HTTPS в директиве proxy_pass не передавались[m
[31m-запросы с телом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the HTTPS protocol was used in the "proxy_pass" directive then[m
[31m-the requests with the body was not transferred.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.26" date="03.02.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива optimize_host_names переименована в optimize_server_names.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "optimize_host_names" directive was renamed to the "optimize_server_names".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании подзапроса в SSI бэкенду передавался URI основного запроса,[m
[31m-если в директиве proxy_pass отсутствовал URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if in the "proxy_pass" directive was no the URI part, then the main request[m
[31m-URI was transferred to a backend while proxying the SSI subrequest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.25" date="01.02.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при неверной конфигурации на старте или во время переконфигурации происходил[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 0.3.24.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred on start or while reconfiguration[m
[31m-if there was invalid configuration;[m
[31m-the bug had appeared in 0.3.24.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.24" date="01.02.2006">[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки в kqueue во FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for bug in FreeBSD kqueue.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ, создаваемый директивой post_action, теперь не передаётся клиенту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a response generated by the "post_action" directive is not transferred[m
[31m-to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании большого количества лог-файлов происходила утечка памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the memory leaks were occurring if many log files were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-внутри одного location работала только первая директива proxy_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the first "proxy_redirect" directive was working inside one location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на 64-битных платформах при старте мог произойти segmentation fault,[m
[31m-если использовалось большое количество имён в директивах server_name;[m
[31m-ошибка появилась в 0.3.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on 64-bit platforms segmentation fault may occurred on start[m
[31m-if the many names were used in the "server_name" directives;[m
[31m-the bug had appeared in 0.3.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.23" date="24.01.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива optimize_host_names.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "optimize_host_names" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании переменных в директивах path и alias.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in using of the variables in the "path" and "alias" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module неправильно собирался на Linux и Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module was incorrectly built on Linux and Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.22" date="17.01.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает методы $r->args и $r->unescape.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->args and $r->unescape methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-метод $r->query_string в модуле ngx_http_perl_module упразднён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the method $r->query_string of ngx_http_perl_module was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве valid_referers указаны только none или blocked, то[m
[31m-происходил segmentation fault;[m
[31m-ошибка появилась в 0.3.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault was occurred if the "none" or "blocked" values was[m
[31m-specified in the "valid_referers" directive;[m
[31m-the bug had appeared in 0.3.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.21" date="16.01.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива valid_referers разрешает использовать рефереры совсем без URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid_referers" directive allows the referrers without URI part.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.20" date="11.01.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в обработке SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in SSI handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_memcached_module не поддерживал ключи в виде /uri?args.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_memcached_module did not support the keys in the "/usr?args" form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-<changes ver="0.3.19" date="28.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы path и alias поддерживают переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "path" and "alias" directives support the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива valid_referers опять учитывает URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "valid_referers" directive again checks the URI part.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в обработке SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in SSI handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.18" date="26.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_names поддерживает имена вида ".domain.tld".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_names" directive supports the ".domain.tld" names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_names использует хэш для имён вида "*.domain.tld"[m
[31m-и более эффективный хэш для обычных имён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_names" directive uses the hash for the "*.domain.tld" names[m
[31m-and more effective hash for usual names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы server_names_hash_max_size и server_names_hash_bucket_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_names_hash_max_size" and "server_names_hash_bucket_size" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы server_names_hash и server_names_hash_threshold упразднены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_names_hash" and "server_names_hash_threshold" directives[m
[31m-were canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива valid_referers использует хэш для имён сайтов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid_referers" directive uses the hash site names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива valid_referers проверяет только имена сайтов без учёта URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "valid_referers" directive checks the site names only without[m
[31m-the URI part.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-некоторые имена вида ".domain.tld" неверно обрабатывались модулем[m
[31m-ngx_http_map_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some ".domain.tld" names incorrectly processed by the ngx_http_map_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если конфигурационного файла не было, то происходил segmentation fault;[m
[31m-ошибка появилась в 0.3.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault was occurred if configuration file did not exist;[m
[31m-the bug had appeared in 0.3.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на 64-битных платформах при старте мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.3.16.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on 64-bit platforms segmentation fault may occurred on start;[m
[31m-the bug had appeared in 0.3.16.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.17" date="18.12.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-на Linux configure теперь проверяет наличие epoll и sendfile64() в ядре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on Linux configure checks the presence of epoll and sendfile64() in kernel.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает доменные имена в формате ".domain.tld".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports domain names in the ".domain.tld" form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время SSL handshake не иcпользовались таймауты;[m
[31m-ошибка появилась в 0.2.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the timeouts were not used in SSL handshake;[m
[31m-the bug had appeared in 0.2.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании протокола HTTPS в директиве proxy_pass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the HTTPS protocol in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании протокола HTTPS в директиве proxy_pass по умолчанию[m
[31m-использовался порт 80.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-when the HTTPS protocol was used in the "proxy_pass" directive the port 80[m
[31m-was used by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.16" date="16.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_map_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_map_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы types_hash_max_size и types_hash_bucket_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "types_hash_max_size" and "types_hash_bucket_size" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssi_value_length.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi_value_length" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_rlimit_core.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_rlimit_core" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-при сборке компиляторами icc 8.1 и 9.0 с оптимизацией для[m
[31m-<nobr>Pentium 4</nobr> номер соединения в логах всегда был равен 1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the connection number in logs was always 1 if nginx was built by the[m
[31m-icc 8.1 or 9.0 compilers with optimization for <nobr>Pentium 4.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-команда config timefmt в SSI задавала неверный формат времени.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "config timefmt" SSI command set incorrect time format.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не закрывал соединения с IMAP/POP3 бэкендом при использовании SSL[m
[31m-соединений;[m
[31m-ошибка появилась в 0.3.13.<br/>[m
[31m-Спасибо Rob Mueller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not close connection to IMAP/POP3 backend for the SSL[m
[31m-connections;[m
[31m-the bug had appeared in 0.3.13.<br/>[m
[31m-Thanks to Rob Mueller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-segmentation fault мог произойти во время SSL shutdown;[m
[31m-ошибка появилась в 0.3.13.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault may occurred in at SSL shutdown;[m
[31m-the bug had appeared in 0.3.13.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.15" date="07.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новой код 444 в директиве return для закрытия соединения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new 444 code of the "return" directive to close connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива so_keepalive в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "so_keepalive" directive in IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx теперь вызывает abort() при обнаружении незакрытых соединений[m
[31m-только при плавном выходе и включённой директиве debug_points.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if there are unclosed connection nginx now calls abort() only on graceful[m
[31m-quit and active "debug_points" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.14" date="05.12.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в ответе 304 передавалось тело ответа;[m
[31m-ошибка появилась в 0.3.13.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the 304 response the body was transferred;[m
[31m-the bug had appeared in 0.3.13.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.13" date="05.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси поддерживает STARTTLS и STLS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the IMAP/POP3 proxy supports STARTTLS and STLS.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси не работала с методами select, poll и /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the IMAP/POP3 proxy did not work with the select, poll, and /dev/poll methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в обработке SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in SSI handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-sendfilev() в Solaris теперь не используется при передаче тела запроса[m
[31m-FastCGI-серверу через unix domain сокет.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now Solaris sendfilev() is not used to transfer the client request body[m
[31m-to FastCGI-server via the unix domain socket.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic не запрещала аутентификацию;[m
[31m-ошибка появилась в 0.3.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_basic" directive did not disable the authorization;[m
[31m-the bug had appeared in 0.3.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.12" date="26.11.2005">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_realip_module, то при использовании[m
[31m-директивы "satisfy_any on" директивы доступа и аутентификации не работали.[m
[31m-Модуль ngx_http_realip_module не собирался и не собирается по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with the ngx_http_realip_module and the "satisfy_any on"[m
[31m-directive was used, then access and authorization directives did not work.[m
[31m-The ngx_http_realip_module was not built and is not built by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-имя переменной "$time_gmt" изменено на "$time_local".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$time_gmt" variable name was changed to "$time_local".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_header_buffer_size и fastcgi_header_buffer_size[m
[31m-переименованы соответственно в proxy_buffer_size и fastcgi_buffer_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_header_buffer_size" and "fastcgi_header_buffer_size" directives[m
[31m-was renamed to the "proxy_buffer_size" and "fastcgi_buffer_size" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_memcached_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_memcached_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_buffering.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_buffering" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-изменение в работе с accept mutex при использовании метода rtsig;[m
[31m-ошибка появилась в 0.3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the changes in accept mutex  handling when the "rtsig" method was used;[m
[31m-the bug had appeared in 0.3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если клиент передал строку "Transfer-Encoding: chunked" в заголовке[m
[31m-запроса, то nginx теперь выдаёт ошибку 411.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the client sent the "Transfer-Encoding: chunked" header line, then[m
[31m-nginx returns the 411 error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при наследовании директивы auth_basic с уровня http в строке[m
[31m-"WWW-Authenticate" заголовка ответа выводился realm без текста "Basic realm".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "auth_basic" directive was inherited from the http level,[m
[31m-then the realm in the "WWW-Authenticate" header line was without[m
[31m-the "Basic realm" text.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве access_log был явно указан формат combined, то в лог[m
[31m-записывались пустые строки;[m
[31m-ошибка появилась в 0.3.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "combined" format was explicitly specified in the "access_log" directive,[m
[31m-then the empty lines was written to the log;[m
[31m-the bug had appeared in 0.3.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на платформе sparc под любыми OS, кроме Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not run on the sparc platform under any OS except Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве if теперь не нужно разделять пробелом строку в кавычках и[m
[31m-закрывающую скобку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now it is not necessary to place space between the quoted string and closing[m
[31m-bracket in the "if" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.11" date="15.11.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не передавал при проксировании тело запроса и строки заголовка клиента;[m
[31m-ошибка появилась в 0.3.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not pass the client request headers and body while proxying;[m
[31m-the bug had appeared in 0.3.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.10" date="15.11.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива valid_referers и переменная $invalid_referer перенесены[m
[31m-из модуля ngx_http_rewrite_module в новый модуль ngx_http_referer_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid_referers" directive and the "$invalid_referer" variable[m
[31m-were moved to the new ngx_http_referer_module from the ngx_http_rewrite_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-имя переменной "$apache_bytes_sent" изменено на "$body_bytes_sent".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$apache_bytes_sent" variable name was changed to "$body_bytes_sent".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$sent_http_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$sent_http_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if поддерживает операции "=" и "!=".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" directive supports the "=" and "!=" operations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass поддерживает протокол HTTPS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" directive supports the HTTPS protocol.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_set_body" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива post_action.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_action" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_empty_gif_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_empty_gif_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_cpu_affinity для Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_cpu_affinity" directive for Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива rewrite не раскодировала символы в редиректах в URI,[m
[31m-теперь символы раскодируются, кроме символов %00-%25 и %7F-%FF.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rewrite" directive did not unescape URI part in redirect,[m
[31m-now it is unescaped except the %00-%25 and %7F-%FF characters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался компилятором icc 9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by the icc 9.0 compiler.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если для статического файла нулевого размера был разрешён SSI,[m
[31m-то ответ передавался неверно при кодировании chunk'ами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the SSI was enabled for zero size static file, then the chunked[m
[31m-response was encoded incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.9" date="10.11.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx считал небезопасными URI, в которых между двумя слэшами[m
[31m-находилось два любых символа;[m
[31m-ошибка появилась в 0.3.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx considered URI as unsafe if two any symbols was between two slashes;[m
[31m-the bug had appeared in 0.3.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.8" date="09.11.2005">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-nginx теперь проверят URI, полученные от бэкенда в строке "X-Accel-Redirect"[m
[31m-в заголовке ответа, или в SSI файле на наличие путей "/../" и нулей.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now checks URI got from a backend in "X-Accel-Redirect" header line[m
[31m-or in SSI file for the "/../" paths and zeroes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-nginx теперь не воспринимает пустое имя как правильное[m
[31m-в строке "Authorization" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now does not treat the empty user name in the "Authorization" header[m
[31m-line as valid one.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_session_timeout модулей[m
[31m-ngx_http_ssl_module и ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_timeout" directives[m
[31m-of the ngx_http_ssl_module and ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_http_header модуля ngx_imap_auth_http_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_http_header" directive of the ngx_imap_auth_http_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива add_header.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_realip_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_realip_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новые переменные для использования в директиве log_format:[m
[31m-$bytes_sent, $apache_bytes_sent, $status, $time_gmt,[m
[31m-$uri, $request_time, $request_length,[m
[31m-$upstream_status, $upstream_response_time,[m
[31m-$gzip_ratio,[m
[31m-$uid_got, $uid_set,[m
[31m-$connection, $pipe и $msec.[m
[31m-Параметры в виде "%name" скоро будут упразднены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new variables to use in the "log_format" directive:[m
[31m-$bytes_sent, $apache_bytes_sent, $status, $time_gmt,[m
[31m-$uri, $request_time, $request_length,[m
[31m-$upstream_status, $upstream_response_time,[m
[31m-$gzip_ratio,[m
[31m-$uid_got, $uid_set,[m
[31m-$connection, $pipe, and $msec.[m
[31m-The parameters in the "%name" form will be canceled soon.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в директиве "if" ложными значениями переменных теперь являются[m
[31m-пустая строка "" и строки, начинающиеся на "0".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the false variable values in the "if" directive are the empty string ""[m
[31m-and string starting with "0".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при работает с проксированными или FastCGI-серверами nginx мог оставлять[m
[31m-открытыми соединения и временные файлы с запросами клиентов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while using proxied or FastCGI-server nginx may leave connections[m
[31m-and temporary files with client requests in open state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочие процессы не сбрасывали буферизированные логи при плавном выходе.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker processes did not flush the buffered logs on graceful exit.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если URI запроса изменялось с помощью rewrite, а затем запрос проксировался[m
[31m-в location, заданном регулярным выражением, то бэкенду передавался[m
[31m-неверный запрос;[m
[31m-ошибка появилась в 0.2.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request URI was changes by the "rewrite" directive and the request[m
[31m-was proxied in location given by regular expression, then the incorrect[m
[31m-request was transferred to backend;[m
[31m-the bug had appeared in 0.2.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива expires не удаляла уже установленную строку заголовка "Expires".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive did not remove the previous "Expires" header.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода rtsig и нескольких рабочих процессах nginx[m
[31m-мог перестать принимать запросы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx may stop to accept requests if the "rtsig" method and several worker[m
[31m-processes were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в SSI командах неверно обрабатывались строки "\"" и "\'".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "\"" and "\'" escape symbols were incorrectly handled in SSI commands.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ответ заканчивался сразу же после SSI команды, то при использовании[m
[31m-сжатия ответ передавался не до конца или не передавался вообще.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the response was ended just after the SSI command and gzipping was used,[m
[31m-then the response did not transferred complete or did not transferred at all.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.7" date="27.10.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива access_log поддерживает параметр buffer=.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access_log" supports the "buffer=" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.3.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.3.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.6" date="24.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси теперь не передаёт серверу авторизации пустой логин.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the IMAP/POP3 proxy do not send the empty login to authorization server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива log_format поддерживает переменные в виде $name.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_format" supports the variables in the $name form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если хотя бы в одном сервере не было описано ни одной директивы listen, то[m
[31m-nginx не слушал на 80 порту;[m
[31m-ошибка появилась в 0.3.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if at least in one server was no the "listen" directive, then nginx did not[m
[31m-listen on the 80 port;[m
[31m-the bug had appeared in 0.3.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве proxy_pass отсутствовал URI, то всегда использовался порт 80.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the URI part is omitted in "proxy_pass" directive, the 80 port was[m
[31m-always used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.5" date="21.10.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если логин IMAP/POP3 менялся сервером авторизации, то мог произойти[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 0.2.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if the IMAP/POP3 login was changed[m
[31m-by authorization server;[m
[31m-the bug had appeared in 0.2.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-accept mutex не работал, все соединения обрабатывались одним рабочим процессом;[m
[31m-ошибка появилась в 0.3.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the accept mutex did not work and all connections were handled by one process;[m
[31m-the bug had appeared in 0.3.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода rtsig и директивы timer_resolution[m
[31m-не работали таймауты.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the timeout did not work if the "rtsig" method and the "timer_resolution"[m
[31m-directive were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.4" date="19.10.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux 2.4+ и MacOS X;[m
[31m-ошибка появилась в 0.3.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux 2.4+ and MacOS X;[m
[31m-the bug had appeared in 0.3.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.3" date="19.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметры "bl" и "af" директивы listen переименованы в "backlog"[m
[31m-и "accept_filter".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "bl" and "af" parameters of the "listen" directive was renamed to[m
[31m-the "backlog" and "accept_filter".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры "rcvbuf" и "sndbuf" в директиве listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rcvbuf" and "sndbuf" parameters of the "listen" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр лога $msec теперь не требует дополнительного системного[m
[31m-вызова gettimeofday().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$msec" log parameter does not require now the additional[m
[31m-the gettimeofday() system call.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -t теперь проверяет директивы listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -t switch now tests the "listen" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве listen был указан неверный адрес, то nginx после[m
[31m-сигнала -HUP оставлял открытый сокет в состоянии CLOSED.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the invalid address was specified in the "listen" directive, then[m
[31m-after the -HUP signal nginx left an open socket in the CLOSED state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для индексных файлов, содержащих в имени переменную, мог неверно выставляться[m
[31m-тип mime по умолчанию;[m
[31m-ошибка появилась в 0.3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mime type may be incorrectly set to default value for index file with[m
[31m-variable in the name;[m
[31m-the bug had appeared in 0.3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива timer_resolution.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "timer_resolution" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр лога $upstream_response_time в миллисекундах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the millisecond "$upstream_response_time" log parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-временный файл с телом запроса клиента теперь удаляется сразу после того,[m
[31m-как клиенту передан заголовок ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a temporary file with client request body now is removed just after[m
[31m-the response header was transferred to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL 0.9.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL 0.9.6 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-пути к файлам с SSL сертификатом и ключом не могли быть относительными.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the SSL certificate and key file paths could not be relative.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ssl_prefer_server_ciphers не работала для модуля ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_prefer_server_ciphers" directive did not work in[m
[31m-the ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ssl_protocols позволяла задать только один протокол.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_protocols" directive allowed to specify the single protocol only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.2" date="12.10.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка Sun Studio 10 C compiler.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Sun Studio 10 C compiler support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_upstream_max_fails, proxy_upstream_fail_timeout,[m
[31m-fastcgi_upstream_max_fails и fastcgi_upstream_fail_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_upstream_max_fails", "proxy_upstream_fail_timeout",[m
[31m-"fastcgi_upstream_max_fails", and "fastcgi_upstream_fail_timeout"[m
[31m-directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.1" date="10.10.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время переполнения очереди сигналов при использовании метода rtsig[m
[31m-происходил segmentation fault;[m
[31m-ошибка появилась в 0.2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault occurred when the signal queue overflowed[m
[31m-if the "rtsig" method was used;[m
[31m-the bug had appeared in 0.2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-корректная обработка пар "\\", "\"", "\'" и "\$" в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-correct handling of the "\\", "\"", "\'", and "\$" pairs in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.0" date="07.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-убрано десятидневное ограничение времени работы рабочего процесса.[m
[31m-Ограничение было введено из-за переполнения миллисекундных таймеров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the 10-days live time limit of worker process was eliminated.[m
[31m-The limit was introduced because of millisecond timers overflow.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.6" date="05.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-с 60 до 10 секунд уменьшено время повторного обращения к бэкенду[m
[31m-при использовании распределения нагрузки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while using load-balancing the time before the failed backend retry[m
[31m-was decreased from 60 to 10 seconds.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass_unparsed_uri упразднена, оригинальный запрос теперь[m
[31m-передаётся, если в директиве proxy_pass отсутствует URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass_unparsed_uri" was canceled, the original URI now passed,[m
[31m-if the URI part is omitted in "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива error_page поддерживает редиректы и позволяет более гибко[m
[31m-менять код ошибки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive supports redirects and allows more flexible[m
[31m-to change an error code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в проксированных подзапросах теперь игнорируется переданный charset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the charset in the "Content-Type" header line now is ignored[m
[31m-in proxied subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если после изменения URI в блоке if для запроса не находилась[m
[31m-новая конфигурация, то правила модуля ngx_http_rewrite_module выполнялись[m
[31m-снова.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the URI was changed in the "if" block and request did not found[m
[31m-new configuration, then the ngx_http_rewrite_module rules ran again.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если директива set устанавливала переменную модуля ngx_http_geo_module[m
[31m-в какой-либо части конфигурации, то эта переменная не была доступна в[m
[31m-других частях конфигурации и выдавалась ошибка "using uninitialized variable";[m
[31m-ошибка появилась в 0.2.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "set" directive set the ngx_http_geo_module variable in some[m
[31m-configuration part, the this variable was not available in other[m
[31m-configuration parts and the "using uninitialized variable" error was occurred;[m
[31m-the bug had appeared in 0.2.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.5" date="04.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-дублирующее значение переменной модуля ngx_http_geo_module теперь[m
[31m-выдаёт предупреждение и изменяет старое значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the duplicate value of the ngx_http_geo_module variable now causes[m
[31m-the warning and changes old value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает команду set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the "set" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает параметр file в команде include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the "file" parameter in the "include" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает подстановку значений переменных[m
[31m-в выражениях команды if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the variable value substitutions in[m
[31m-expressions of the "if" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.4" date="03.10.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает выражения[m
[31m-"$var=text", "$var!=text", "$var=/text/" и "$var!=/text/"[m
[31m-в команде if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports[m
[31m-"$var=text", "$var!=text", "$var=/text/", and "$var!=/text/" expressions[m
[31m-in the "if" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при проксировании location без слэша в конце;[m
[31m-ошибка появилась в 0.1.44.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in proxying location without trailing slash;[m
[31m-the bug had appeared in 0.1.44.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода rtsig мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if the "rtsig" method was used;[m
[31m-the bug had appeared in 0.2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.3" date="30.09.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без параметра --with-debug;[m
[31m-ошибка появилась в 0.2.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without the --with-debug option;[m
[31m-the bug had appeared in 0.2.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.2" date="30.09.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-команда config errmsg в модуле ngx_http_ssi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "config errmsg" command of the ngx_http_ssi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-переменные модуля ngx_http_geo_module можно переопределять директивой set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_geo_module variables can be overridden by the "set" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_protocols и ssl_prefer_server_ciphers модулей[m
[31m-ngx_http_ssl_module и ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_protocols" and "ssl_prefer_server_ciphers" directives[m
[31m-of the ngx_http_ssl_module and ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_autoindex_module при показе длинных имён файлов;[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not show correctly the long file names;[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module теперь не показывает файлы,[m
[31m-начинающиеся на точку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module now do not show the files starting by dot.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если SSL handshake завершался с ошибкой, то это могло привести также[m
[31m-к закрытию другого соединения.<br/>[m
[31m-Спасибо Rob Mueller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the SSL handshake failed then another connection may be closed too.<br/>[m
[31m-Thanks to Rob Mueller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-экспортные версии MSIE 5.x не могли соединиться по HTTPS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the export versions of MSIE 5.x could not connect via HTTPS.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.1" date="23.09.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если все бэкенды, используемые для балансировки нагрузки, оказывались[m
[31m-в нерабочем состоянии после одной ошибки, то nginx мог зациклится;[m
[31m-ошибка появилась в 0.2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if all backend using in load-balancing failed after one error, then[m
[31m-nginx may got caught in an endless loop;[m
[31m-the bug had appeared in 0.2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.0" date="23.09.2005">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменились имена pid-файлов, используемые во время обновления исполняемого[m
[31m-файла. Ручное переименование теперь не нужно.[m
[31m-Старый основной процесс добавляет к своему pid-файл суффикс ".oldbin"[m
[31m-и запускает новый исполняемый файл.[m
[31m-Новый основной процесс создаёт обычный pid-файл без суффикса ".newbin".[m
[31m-Если новый основной процесс выходит, то старый процесс переименовывает свой[m
[31m-pid-файл c суффиксом ".oldbin" в pid-файл без суффикса.[m
[31m-При обновлении с версии 0.1.х до 0.2.0 нужно учитывать, что оба[m
[31m-процесса&mdash;старый 0.1.x и новый 0.2.0&mdash;используют pid-файл[m
[31m-без суффиксов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-The pid-file names used during online upgrade was changed and now is not[m
[31m-required a manual rename operation.[m
[31m-The old master process adds the ".oldbin" suffix to its pid-file and[m
[31m-executes a new binary file.[m
[31m-The new master process creates usual pid-file without the ".newbin" suffix.[m
[31m-If the master process exits, then old master process renames back[m
[31m-its pid-file with the ".oldbin" suffix to the pid-file without suffix.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива worker_connections, новое название директивы connections;[m
[31m-директива теперь задаёт максимальное число соединений,[m
[31m-а не максимально возможный номер дескриптора для сокета.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_connections" directive, new name of the "connections" directive;[m
[31m-now the directive specifies maximum number of connections,[m
[31m-but not maximum socket descriptor number.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-SSL поддерживает кэширование сессий в пределах одного рабочего процесса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL supports the session cache inside one worker process.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива satisfy_any.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "satisfy_any" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модули ngx_http_access_module и ngx_http_auth_basic_module не работают[m
[31m-для подзапросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_access_module and ngx_http_auth_basic_module do not run[m
[31m-for subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы worker_rlimit_nofile и worker_rlimit_sigpending.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_rlimit_nofile" and "worker_rlimit_sigpending" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если все бэкенды, используемые для балансировки нагрузки, оказывались[m
[31m-в нерабочем состоянии после одной ошибки, то nginx не обращался к ним[m
[31m-в течение 60 секунд.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if all backend using in load-balancing failed after one error, then[m
[31m-nginx did not try do connect to them during 60 seconds.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в парсинге аргументов IMAP/POP3 команд.<br/>[m
[31m-Спасибо Rob Mueller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in IMAP/POP3 command argument parsing.<br/>[m
[31m-Thanks to Rob Mueller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании SSL в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors while using SSL in IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании SSI и сжатия.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors while using SSI and gzipping.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в ответах 304 не добавлялись строки заголовка ответа "Expires" и[m
[31m-"Cache-Control".<br/>[m
[31m-Спасибо Александру Кукушкину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Expires" and "Cache-Control" header lines were omitted[m
[31m-from the 304 responses.<br/>[m
[31m-Thanks to Alexandr Kukushkin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.45" date="08.09.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива ssl_engine упразднена в модуле ngx_http_ssl_module и[m
[31m-перенесена на глобальный уровень.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_engine" directive was canceled in the ngx_http_ssl_module[m
[31m-and now is introduced at global level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы с подзапросами, включённые с помощью SSI, не передавались[m
[31m-через SSL соединение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the responses with SSI subrequests did not transferred via SSL connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Разные исправления в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Various bug fixes in the IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.44" date="06.09.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси поддерживает SSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the IMAP/POP3 proxy supports SSL.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_timeout модуля ngx_imap_proxy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_timeout" directive of the ngx_imap_proxy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива userid_mark.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "userid_mark" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-значение переменной $remote_user определяется независимо от того,[m
[31m-используется ли авторизация или нет.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $remote_user variable value is determined independently of[m
[31m-authorization use.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.43" date="30.08.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-listen(2) backlog в директиве listen можно менять по сигналу -HUP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the listen(2) backlog in the "listen" directive[m
[31m-can be changed using the -HUP signal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-скрипт geo2nginx.pl добавлен в contrib.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the geo2nginx.pl script was added to contrib.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметры FastCGI с пустым значениями теперь передаются серверу.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the FastCGI parameters with the empty values now are passed to a server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<!--[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при ошибках в работе с проксированным сервером или FastCGI сервером[m
[31m-мог произойти segmentation fault;[m
[31m-в режиме прокси ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if there were errors while[m
[31m-working with proxied or FastCGI server;[m
[31m-in the proxied mode the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m--->[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в ответе проксированного сервера или FastCGI сервера была строка[m
[31m-"Cache-Control", то при использовании директивы expires происходил[m
[31m-segmentation fault или рабочий процесс мог зациклится;[m
[31m-в режиме прокси ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault occurred or the worker process may got caught[m
[31m-in an endless loop if the proxied or FastCGI server sent the "Cache-Control"[m
[31m-header line and the "expires" directive was used;[m
[31m-in the proxied mode the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.42" date="23.08.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если URI запроса получался нулевой длины после обработки модулем[m
[31m-ngx_http_rewrite_module, то в модуле ngx_http_proxy_module происходил[m
[31m-segmentation fault или bus error.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request URI had a zero length after the processing in[m
[31m-the ngx_http_proxy_module, then the segmentation fault or bus error occurred[m
[31m-in the ngx_http_proxy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate не работала внутри блока if;[m
[31m-ошибка появилась в 0.1.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive did not work inside the "if" block;[m
[31m-the bug had appeared in 0.1.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.41" date="25.07.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если переменная использовалась в файле конфигурации,[m
[31m-то она не могла использоваться в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the variable was used in the configuration file,[m
[31m-then it can not be used in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.40" date="22.07.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если клиент слал очень длинную строку заголовка, то в логе не помещалась[m
[31m-информация, связанная с этим запросом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a client sent too long header line, then the request information[m
[31m-did not logged in the error log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании "X-Accel-Redirect" не передавалась строка "Set-Cookie";[m
[31m-ошибка появилась в 0.1.39.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Set-Cookie" header line was not transferred when the "X-Accel-Redirect"[m
[31m-was used;[m
[31m-the bug had appeared in 0.1.39.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании "X-Accel-Redirect" не передавалась строка[m
[31m-"Content-Disposition".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Content-Disposition" header line was not transferred when[m
[31m-the "X-Accel-Redirect" was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-по сигналу SIGQUIT основной процесс не закрывал сокеты, на которых он слушал.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the master process did not close the listen socket on the SIGQUIT signal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после обновления исполняемого файла на лету на Linux и Solaris[m
[31m-название процесса в команде ps становилось короче.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-after on-line upgrade on Linux and Solaris the process name[m
[31m-became shorter in the "ps" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.39" date="14.07.2005">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменения в модуле ngx_http_charset_module:[m
[31m-директива default_charset упразднена;[m
[31m-директива charset задаёт кодировку ответа;[m
[31m-директива source_charset задаёт только исходную кодировку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-The changes in the ngx_http_charset_module:[m
[31m-the "default_charset" directive was canceled;[m
[31m-the "charset" directive sets the response charset;[m
[31m-the "source_charset" directive sets the source charset only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении ошибки 401, полученной от бэкенда, не передавалась[m
[31m-строка заголовка "WWW-Authenticate".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the backend "WWW-Authenticate" header line did not transferred while[m
[31m-the 401 response code redirecting.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модули ngx_http_proxy_module и ngx_http_fastcgi_module могли закрыть[m
[31m-соединение до того, как что-нибудь было передано клиенту;[m
[31m-ошибка появилась в 0.1.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_proxy_module and ngx_http_fastcgi_module may close[m
[31m-a connection before anything was transferred to a client;[m
[31m-the bug had appeared in 0.1.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обработка ошибки инициализации в crypt_r() в Linux glibc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Linux glibc crypt_r() initialization bug.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module не поддерживал относительные URI в[m
[31m-команде include virtual.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module did not support the relative URI in[m
[31m-the "include virtual" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в строке заголовка ответа бэкенда была строка "Location",[m
[31m-которую nginx не должен был изменять, то в ответе передавалось тело 500 ошибки;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the backend response had the "Location" header line and nginx[m
[31m-should not rewrite this line, then the 500 code response body was transferred;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-некоторые директивы модулей ngx_http_proxy_module и ngx_http_fastcgi_module[m
[31m-не наследовались с уровня server на уровень location;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some directives of the ngx_http_proxy_module and ngx_http_fastcgi_module[m
[31m-were not inherited from the server to the location level;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssl_module не поддерживал цепочки сертификатов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssl_module did not support the certificate chain.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_autoindex_module при показе длинных имён файлов;[m
[31m-ошибка появилась в 0.1.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not show correctly the long file names;[m
[31m-the bug had appeared in 0.1.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в IMAP/POP3 прокси при взаимодействии с бэкендом на стадии login.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in IMAP/POP3 proxy in interaction with a backend at the login state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.38" date="08.07.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate поддерживается в режиме прокси и FastCGI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive is supported in proxy and FastCGI mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси и FastCGI поддерживается строка заголовка "X-Accel-Limit-Rate"[m
[31m-в ответе бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Limit-Rate" response header line is supported in proxy[m
[31m-and FastCGI mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива break.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "break" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива log_not_found.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_not_found" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса с помощью строки заголовка "X-Accel-Redirect"[m
[31m-не изменялся код ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response status code was not changed when request was redirected[m
[31m-by the ""X-Accel-Redirect" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные, установленные директивой set не могли использоваться в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the variables set by the "set" directive could not be used in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении в SSI более одного удалённого подзапроса[m
[31m-мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if the SSI page has more than one[m
[31m-remote subrequest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если статусная строка в ответе бэкенда передавалась в двух пакетах, то[m
[31m-nginx считал ответ неверным;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx treated the backend response as invalid if the status line in the[m
[31m-header was transferred in two packets;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssi_types.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi_types" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива autoindex_exact_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "autoindex_exact_size" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module не поддерживал длинные имена файлов в UTF-8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not support the long file names in UTF-8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.37" date="23.06.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в конце файла nginx.pid теперь добавляется "\n".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "\n" is added to the end of the "nginx.pid" file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении большого количества вставок или нескольких больших вставок[m
[31m-с помощью SSI ответ мог передаваться не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the responses may be transferred not completely,[m
[31m-if many parts or the big parts were included by SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если все бэкенды возвращали ответ 404, то при использовании параметра http_404[m
[31m-в директивах proxy_next_upstream или fastcgi_next_upstream, nginx[m
[31m-начинал запрашивать все бэкенды снова.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if all backends had returned the 404 response and the "http_404" parameter of[m
[31m-the "proxy_next_upstream" or "fastcgi_next_upstream" directives was used,[m
[31m-then nginx started to request all backends again.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.36" date="15.06.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-если в заголовке запроса есть дублирующиеся строки "Host", "Connection",[m
[31m-"Content-Length" и "Authorization", то nginx теперь выдаёт ошибку 400.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request header has duplicate the "Host", "Connection", "Content-Length",[m
[31m-or "Authorization" lines, then nginx now returns the 400 error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива post_accept_timeout упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_accept_timeout" directive was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры default, af=, bl=, deferred и bind в директиве listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "default", "af=", "bl=", "deferred", and "bind" parameters[m
[31m-of the "listen" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка accept фильтров во FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the FreeBSD accept filters support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка TCP_DEFER_ACCEPT в Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Linux TCP_DEFER_ACCEPT support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module не поддерживал имена файлов в UTF-8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not support the file names in UTF-8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после добавления новый лог-файл ротация этого лога по сигналу -USR1[m
[31m-выполнялась, только если переконфигурировать nginx два раза по сигналу -HUP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new log file can be rotated by the -USR1 signal only if[m
[31m-the reconfiguration by the -HUP signal was made twice.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.35" date="07.06.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива working_directory.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "working_directory" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива port_in_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "port_in_redirect" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если заголовок ответа бэкенда не помещался в один пакет, то[m
[31m-происходил segmentation fault;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred if the backend response header was in[m
[31m-several packets;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если было сконфигурировано более 10 серверов или в сервере не описана[m
[31m-директива "listen",[m
[31m-то при запуске мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if more than 10 servers were configured or some server did not use the[m
[31m-"listen" directive, then the segmentation fault was occurred on the start.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ответ не помещался во временный файл,[m
[31m-то мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault might occur if the response was bigger than[m
[31m-the temporary file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx возвращал ошибку 400 на запросы вида[m
[31m-<nobr>"GET http://www.domain.com/uri HTTP/1.0"</nobr>;[m
[31m-ошибка появилась в 0.1.28.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx returned the 400 response on requests like[m
[31m-<nobr>"GET http://www.domain.com/uri HTTP/1.0"</nobr>;[m
[31m-the bug had appeared in 0.1.28.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.34" date="26.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении больших ответов с помощью SSI рабочий процесс мог зациклиться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker process may got caught in an endless loop if the big response[m
[31m-part were include by SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные, устанавливаемые директивой "set", не были доступны в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the variables set by the "set" directive were not available in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива autoindex_localtime.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "autoindex_localtime" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-пустое значение в директиве proxy_set_header запрещает передачу заголовка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the empty value of the "proxy_set_header" directive forbids the client[m
[31m-request header line passing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.33" date="23.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-pcre;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the --without-pcre parameter;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-3, 5, 7 и 8 директив proxy_set_header на одном уровне вызывали[m
[31m-bus fault при запуске.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-3, 4, 7, and 8 the "proxy_set_header" directives in one level cause[m
[31m-the bus fault on start up.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в редиректах внутри HTTPS сервера был указан протокол HTTP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the HTTP protocol was specified in the HTTPS redirects.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если директива rewrite использовала выделения внутри директивы if, то[m
[31m-возвращалась ошибка 500.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "rewrite" directive used the captures inside the "if" directive, then[m
[31m-the 500 error code was returned.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.32" date="19.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в редиректах, выдаваемых с помощью директивы rewrite, не передавались аргументы;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the arguments were omitted in the redirects, issued by the "rewrite" directive;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if поддерживает выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" directive supports the captures in regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива set поддерживает переменные и выделения из регулярных выражений.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set" directive supports the variables and the captures of regular[m
[31m-expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси и FastCGI поддерживается строка заголовка "X-Accel-Redirect"[m
[31m-в ответе бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Redirect" response header line is supported in proxy and FastCGI[m
[31m-mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.31" date="16.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSL ответ мог передаваться не до конца.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response encrypted by SSL may not transferred complete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при обработке SSI в ответе, полученного от FastCGI-сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors while processing FastCGI response by SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании SSI и сжатия.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors while using SSI and gzipping.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-редирект с кодом 301 передавался без тела ответа;[m
[31m-ошибка появилась в 0.1.30.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the redirect with the 301 code was transferred without response body;[m
[31m-the bug had appeared in 0.1.30.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.30" date="14.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSI рабочий процесс мог зациклиться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker process may got caught in an endless loop if the SSI was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSL ответ мог передаваться не до конца.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response encrypted by SSL may not transferred complete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если длина части ответа, полученного за один раз от проксируемого или[m
[31m-FastCGI сервера была равна 500 байт, то nginx возвращал код ответа 500;[m
[31m-в режиме прокси ошибка появилась только в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the length of the response part received at once from proxied[m
[31m-or FastCGI server was equal to 500, then nginx returns the 500 response code;[m
[31m-in proxy mode the bug had appeared in 0.1.29 only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не считал неверными директивы с 8-ю или 9-ю параметрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not consider the directives with 8 or 9 parameters as invalid.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива return может возвращать код ответа 204.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "return" directive can return the 204 response code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ignore_invalid_headers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ignore_invalid_headers" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.29" date="12.05.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает команду include virtual.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports "include virtual" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает условную команду вида[m
[31m-'if expr="$NAME"' и команды else и endif.[m
[31m-Допускается только один уровень вложенности.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the condition command like[m
[31m-'if expr="$NAME"' and "else" and "endif" commands.[m
[31m-Only one nested level is supported.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает две переменные DATE_LOCAL и DATE_GMT[m
[31m-и команду config timefmt.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the DATE_LOCAL and DATE_GMT variables[m
[31m-and "config timefmt" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssi_ignore_recycled_buffers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi_ignore_recycled_buffers" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если переменная QUERY_STRING не была определена, то в команде echo[m
[31m-не ставилось значение по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "echo" command did not show the default value for the empty QUERY_STRING[m
[31m-variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_proxy_module полностью переписан.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_proxy_module was rewritten.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_redirect, proxy_pass_request_headers,[m
[31m-proxy_pass_request_body и proxy_method.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect", "proxy_pass_request_headers",[m
[31m-"proxy_pass_request_body", and "proxy_method" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_header.[m
[31m-Директива proxy_x_var упразднена и должна быть заменена директивой[m
[31m-proxy_set_header.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_set_header" directive.[m
[31m-The "proxy_x_var" was canceled and must be replaced with the proxy_set_header[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_preserve_host упразднена и должна быть заменена директивами[m
[31m-"proxy_set_header Host $host" и "proxy_redirect off"[m
[31m-или директивой <nobr>"proxy_set_header Host $host:$proxy_port"</nobr>[m
[31m-и соответствующими ей директивами proxy_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_preserve_host" is canceled and must be replaced with[m
[31m-the "proxy_set_header Host $host" and the "proxy_redirect off" directives,[m
[31m-the <nobr>"proxy_set_header Host $host:$proxy_port" directive</nobr>[m
[31m-and the appropriate proxy_redirect directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_x_real_ip упразднена и должна быть заменена директивой[m
[31m-"proxy_set_header X-Real-IP $remote_addr".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_set_x_real_ip" is canceled and must be replaced with[m
[31m-the "proxy_set_header X-Real-IP $remote_addr" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_add_x_forwarded_for упразднена и должна быть заменена[m
[31m-директивой[m
[31m-<nobr>"proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for".</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_add_x_forwarded_for" is canceled and must be replaced with[m
[31m-<nobr>the "proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for"</nobr>[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_x_url упразднена и должна быть заменена директивой[m
[31m-<nobr>"proxy_set_header X-URL http://$host:$server_port$request_uri".</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_set_x_url" is canceled and must be replaced with[m
[31m-the "proxy_set_header X-URL http://$host:$server_port$request_uri"[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_param.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_param" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы fastcgi_root, fastcgi_set_var и fastcgi_params упразднены[m
[31m-и должны быть замены директивами fastcgi_param.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_root", "fastcgi_set_var" and "fastcgi_params" directive[m
[31m-are canceled and must be replaced with the fastcgi_param directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива index может использовать переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "index" directive can use the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива index может быть указана на уровне http и server.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "index" directive can be used at http and server levels.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-только последний параметр в директиве index может быть абсолютным.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the last index only in the "index" directive can be absolute.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в директиве rewrite могут использоваться переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rewrite" directive can use the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива internal.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "internal" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR,[m
[31m-SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME,[m
[31m-REQUEST_METHOD, REQUEST_URI и REMOTE_USER.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR,[m
[31m-SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME,[m
[31m-REQUEST_METHOD, REQUEST_URI, and REMOTE_USER variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-nginx теперь передаёт неверные строки в заголовках запроса клиента и[m
[31m-ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now passes the invalid lines in a client request headers[m
[31m-or a backend response header.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд долго не передавал ответ и send_timeout был меньше, чем[m
[31m-proxy_read_timeout, то клиенту возвращался ответ 408.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the backend did not transfer response for a long time and[m
[31m-the "send_timeout" was less than "proxy_read_timeout", then nginx[m
[31m-returned the 408 response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд передавал неверную строку в заголовке ответа, то происходил[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 0.1.26.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred if the backend sent an invalid line[m
[31m-in response header;[m
[31m-the bug had appeared in 0.1.26.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании отказоустойчивой конфигурации в FastCGI мог[m
[31m-происходить segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred in FastCGI fault tolerance configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива expires не удаляла уже установленные строки заголовка[m
[31m-"Expires" и "Cache-Control".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive did not remove the previous "Expires" and[m
[31m-"Cache-Control" headers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не учитывал завершающую точку в строке заголовка запроса "Host".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not take into account trailing dot in "Host" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_auth_module не работал на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_auth_module did not work under Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива rewrite неверно работала, если в запросе присутствовали аргументы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the rewrite directive worked incorrectly, if the arguments were in a request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на MacOS X.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOS X.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.28" date="08.04.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании больших файлов nginx сильно нагружал процессор.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx hogs CPU while proxying the huge files.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался gcc 4.0 на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by gcc 4.0 on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.27" date="28.03.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр blocked в директиве valid_referers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "blocked" parameter of the "valid_referers" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ошибки обработки заголовка запроса теперь записываются на уровне[m
[31m-info, в лог также записывается имя сервера и строки заголовка[m
[31m-запроса "Host" и "Referer".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the errors while handling the request header now logged at "info" level.[m
[31m-The server name and the "Host" and "Referer" header lines also logged.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-при записи ошибок в лог записывается также строка заголовка запроса "Host".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Host" header line is also logged in error log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass_unparsed_uri.[m
[31m-Специальная обработка символов "://" в URI, введённая в версии 0.1.11,[m
[31m-теперь упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_pass_unparsed_uri directive.[m
[31m-The special handling of the "://" symbols in URI, appeared in 0.1.11 version,[m
[31m-now is canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на FreeBSD и Linux, если был указан параметр конфигурации[m
[31m---without-ngx_http_auth_basic_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on FreeBSD and Linux, if the[m
[31m---without-ngx_http_auth_basic_module configuration parameter was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.26" date="22.03.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-неверные строки заголовка, переданные клиентом, теперь игнорируется и[m
[31m-записываются в error_log на уровне info.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the invalid client header lines are now ignored and logged at the info level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-при записи ошибок в лог записывается также имя сервера, при обращении[m
[31m-к которому произошла ошибка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the server name is also logged in error log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_auth_basic_module и директивы auth_basic и[m
[31m-auth_basic_user_file.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_auth_basic_module module and the auth_basic and[m
[31m-auth_basic_user_file directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.25" date="19.03.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на Linux parisc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did run on Linux parisc.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-nginx теперь не запускается под FreeBSD, если значение[m
[31m-sysctl kern.ipc.somaxconn слишком большое.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now does not start under FreeBSD if the sysctl kern.ipc.somaxconn[m
[31m-value is too big.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если модуль ngx_http_index_module делал внутреннее перенаправление запроса[m
[31m-в модули ngx_http_proxy_module или ngx_http_fastcgi_module, то файл индекса[m
[31m-не закрывался после обслуживания запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a request was internally redirected by the ngx_http_index_module[m
[31m-module to the ngx_http_proxy_module or ngx_http_fastcgi_module modules,[m
[31m-then the index file was not closed after request completion.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass может использоваться в location, заданных регулярным[m
[31m-выражением.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" can be used in location with regular expression.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_rewrite_filter_module поддерживает условия вида[m
[31m-"if ($HTTP_USER_AGENT ~ MSIE)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_rewrite_filter_module module supports the condition like[m
[31m-"if ($HTTP_USER_AGENT ~ MSIE)".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx очень медленно запускался при большом количестве адресов и[m
[31m-использовании текстовых значений в директиве geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx started too slow if the large number of addresses and text values[m
[31m-were used in the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-имя переменной в директиве geo нужно указывать, как $name.[m
[31m-Прежний вариант без "$" пока работает, но вскоре будет убран.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a variable name must be declared as "$name" in the "geo" directive.[m
[31m-The previous variant without "$" is still supported, but will be removed soon.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр лога "%{VARIABLE}v".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "%{VARIABLE}v" logging parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива "set $name value".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set $name value" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с gcc 4.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-gcc 4.0 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр автоконфигурации --with-openssl-opt=OPTIONS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --with-openssl-opt=OPTIONS autoconfiguration directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.24" date="04.03.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_filter_module поддерживает переменные[m
[31m-QUERY_STRING и DOCUMENT_URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_filter_module supports the QUERY_STRING and DOCUMENT_URI[m
[31m-variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module мог выдавать ответ 404[m
[31m-на существующий каталог, если этот каталог был указан как alias.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module may some times return the 404 response[m
[31m-for existent directory, if this directory was used in "alias" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_filter_module неправильно работал при больших[m
[31m-ответах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_filter_module ran incorrectly for large responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-отсутствие строки заголовка "Referer" всегда считалось правильным referrer'ом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the lack of the "Referer" header line was always accounted as valid referrer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.23" date="01.03.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_filter_module и[m
[31m-директивы ssi, ssi_silent_errors и ssi_min_file_chunk.[m
[31m-Поддерживаются команды 'echo var="HTTP_..." default=""' и[m
[31m-'echo var="REMOTE_ADDR"'.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_filter_module and[m
[31m-the ssi, ssi_silent_errors, and ssi_min_file_chunk directives.[m
[31m-The 'echo var="HTTP_..." default=""' and 'echo var="REMOTE_ADDR"' commands[m
[31m-are supported.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр лога %request_time.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %request_time log parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-если запрос пришёл без строки заголовка "Host", то директива[m
[31m-proxy_preserve_host устанавливает в качестве этого заголовка первое имя[m
[31m-сервера из директивы server_name.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request has no the "Host" header line, then the "proxy_preserve_host"[m
[31m-directive set this header line to the first server name of the "server_name"[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.1.22.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.1.22.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module теперь показывает информацию не о[m
[31m-символическом линке, а о файле или каталоге, на который он указывает.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module now shows the information not about the symlink,[m
[31m-but about file or directory it points to.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если клиенту ничего не передавалось, то параметр %apache_length[m
[31m-записывал в лог отрицательную длину заголовка ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %apache_length parameter logged the negative length[m
[31m-of the response header if the no response was transferred to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.22" date="22.02.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_stub_status_module показывал неверную статистику[m
[31m-для обработанных соединений, если использовалось проксирование[m
[31m-или FastCGI-сервер.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_stub_status_module showed incorrect handled connections[m
[31m-statistics if the proxying or FastCGI server were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Linux и Solaris установочные пути были неверно заключены в кавычки;[m
[31m-ошибка появилась в 0.1.21.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the installation paths were incorrectly quoted on Linux and Solaris;[m
[31m-the bug had appeared in 0.1.21.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.21" date="22.02.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_stub_status_module показывал неверную статистику[m
[31m-при использовании метода rtsig или при использовании нескольких[m
[31m-рабочих процессов на SMP машине.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_stub_status_module showed incorrect statistics[m
[31m-if "rtsig" method was used or if several worker process ran on SMP.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался компилятором icc под Линуксом или[m
[31m-если библиотека zlib-1.2.x собиралась из исходных текстов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by the icc compiler on Linux or[m
[31m-if the zlib-1.2.x library was building from sources.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под NetBSD 2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on NetBSD 2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.20" date="17.02.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новые параметры script_filename и remote_port в директиве fastcgi_params.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new "script_filename" and "remote_port" parameters[m
[31m-of the fastcgi_params directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-неправильно обрабатывался поток stderr от FastCGI-сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the FastCGI stderr stream was handled incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.19" date="16.02.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в запросе есть нуль, то для локальных запросов теперь возвращается[m
[31m-ошибка 404.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now, if request contains the zero, then the 404 error is returned[m
[31m-for the local requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под NetBSD 2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on NetBSD 2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время чтения тела запроса клиента в SSL соединении мог произойти таймаут.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the timeout may occur while reading of the client request body[m
[31m-via SSL connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.18" date="09.02.2005">[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-для совместимости с Solaris 10 в директивах devpoll_events и devpoll_changes[m
[31m-значения по умолчанию уменьшены с 512 до 32.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the default values of the devpoll_events and the devpoll_changes directives[m
[31m-changed from 512 to 32 to be compatible with Solaris 10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_set_x_var и fastcgi_set_var не наследовались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_set_x_var and fastcgi_set_var directives were not inherited.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве rewrite, возвращающей редирект, аргументы присоединялись[m
[31m-к URI через символ "&amp;" вместо "?".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a redirect rewrite directive arguments were concatenated with URI[m
[31m-by an "&amp;" rather than a "?".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки для модуля ngx_http_geo_module без символа ";" во включённом файле[m
[31m-игнорировались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the lines without trailing ";" in the file being included[m
[31m-by the ngx_http_geo_module were silently ignored.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-неизвестный формат лог-файла в директиве access_log вызывал segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the unknown log format in the access_log directive caused[m
[31m-the segmentation fault.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новый параметр document_root в директиве fastcgi_params.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new "document_root" parameter of the fastcgi_params directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_redirect_errors.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the fastcgi_redirect_errors directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новый модификатор break в директиве rewrite позволяет прекратить[m
[31m-цикл rewrite/location и устанавливает текущую конфигурацию для запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new "break" modifier of the "rewrite" directive allows to stop[m
[31m-the rewrite/location cycle and sets the current configuration to the request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.17" date="03.02.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_rewrite_module полностью переписан.[m
[31m-Теперь можно делать редиректы, возвращать коды ошибок[m
[31m-и проверять переменные и рефереры.[m
[31m-Эти директивы можно использовать внутри location.[m
[31m-Директива redirect упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_rewrite_module was rewritten from the scratch.[m
[31m-Now it is possible to redirect, to return the error codes,[m
[31m-to check the variables and referrers. The directives can be used[m
[31m-inside locations.[m
[31m-The redirect directive was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_geo_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_geo_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_set_x_var и fastcgi_set_var.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_set_x_var and fastcgi_set_var directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-конфигурация location с модификатором "=" могла использоваться[m
[31m-в другом location.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the location configuration with "=" modifier may be used in another[m
[31m-location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-правильный тип ответа выставлялся только для запросов, у которых в расширении[m
[31m-были только маленькие буквы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the correct content type was set only for requests that use small caps letters[m
[31m-in extension.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если для location установлен proxy_pass или fastcgi_pass, и доступ[m
[31m-к нему запрещался, а ошибка перенаправлялась на статическую страницу,[m
[31m-то происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the proxy_pass or fastcgi_pass directives were set in the location,[m
[31m-and access was denied, and the error was redirected to a static page,[m
[31m-then the segmentation fault occurred.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в проксированном ответе в заголовке "Location" передавался[m
[31m-относительный URL, то к нему добавлялось имя хоста и слэш;[m
[31m-ошибка появилась в 0.1.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if in a proxied "Location" header was a relative URL,[m
[31m-then a host name and a slash were added to them;[m
[31m-the bug had appeared in 0.1.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Linux в лог не записывался текст системной ошибки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the system error message was not logged on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.16" date="25.01.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ответ передавался chunk'ами, то при запросе HEAD выдавался[m
[31m-завершающий chunk.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the response were transferred by chunks, then on the HEAD request[m
[31m-the final chunk was issued.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-заголовок "Connection: keep-alive" выдавался, даже если директива[m
[31m-keepalive_timeout запрещала использование keep-alive.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Connection: keep-alive" header were issued, even if the[m
[31m-keepalive_timeout directive forbade the keep-alive use.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в модуле ngx_http_fastcgi_module вызывали segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the errors in the ngx_http_fastcgi_module caused the segmentation faults.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSL сжатый ответ мог передаваться не до конца.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the compressed response encrypted by SSL may not transferred complete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-опции TCP_NODELAY, TCP_NOPUSH и TCP_CORK, специфичные для TCP сокетов,[m
[31m-не используются для unix domain сокетов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the TCP-specific TCP_NODELAY, TCP_NOPUSH, and TCP_CORK options,[m
[31m-are not used for the unix domain sockets.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива rewrite поддерживает перезаписывание аргументов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the rewrite directive supports the arguments rewriting.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на запрос POST с заголовком "Content-Length: 0" возвращался ответ 400;[m
[31m-ошибка появилась в 0.1.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response code 400 was returned for the POST request with the[m
[31m-"Content-Length: 0" header;[m
[31m-the bug had appeared in 0.1.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.15" date="19.01.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка соединения с FastCGI-сервером вызывала segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the error while the connecting to the FastCGI server caused[m
[31m-segmentation fault.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-корректная обработка регулярного выражения, в котором число[m
[31m-выделенных частей не совпадает с числом подстановок.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the correct handling of the regular expression, that[m
[31m-has different number of the captures and substitutions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-location, который передаётся FastCGI-серверу, может быть задан[m
[31m-с помощью регулярного выражения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the location, that is passed to the FastCGI server, can be[m
[31m-regular expression.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр FastCGI REQUEST_URI теперь передаётся вместе с аргументами[m
[31m-и в том виде, в котором был получен от клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the FastCGI's parameter REQUEST_URI is now passed with the arguments[m
[31m-and in the original state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для использования регулярных выражений в location нужно было[m
[31m-собирать nginx вместе с ngx_http_rewrite_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_rewrite_module module was required to be built to use[m
[31m-the regular expressions in locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд слушал на 80-ом порту, то при использовании директивы[m
[31m-<nobr>"proxy_preserve_host  on"</nobr> в заголовке "Host" указывался[m
[31m-также порт 80;[m
[31m-ошибка появилась в 0.1.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the directive <nobr>"proxy_preserve_host  on"</nobr> adds port 80[m
[31m-to the "Host" headers, if upstream listen on port 80;[m
[31m-the bug had appeared in 0.1.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если задать одинаковые пути в параметрах автоконфигурации[m
[31m---http-client-body-temp-path=PATH и --http-proxy-temp-path=PATH[m
[31m-или --http-client-body-temp-path=PATH и --http-fastcgi-temp-path=PATH,[m
[31m-то происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the same paths in autoconfiguration parameters[m
[31m---http-client-body-temp-path=PATH and --http-proxy-temp-path=PATH,[m
[31m-or --http-client-body-temp-path=PATH and --http-fastcgi-temp-path=PATH[m
[31m-caused segmentation fault.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.14" date="18.01.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры автоконфигурации[m
[31m---http-client-body-temp-path=PATH,[m
[31m---http-proxy-temp-path=PATH[m
[31m-и --http-fastcgi-temp-path=PATH[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the autoconfiguration directives:[m
[31m---http-client-body-temp-path=PATH,[m
[31m---http-proxy-temp-path=PATH,[m
[31m-and --http-fastcgi-temp-path=PATH[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-имя каталога с временными файлами, содержащие тело запроса клиента,[m
[31m-задаётся директивой client_body_temp_path,[m
[31m-по умолчанию &lt;prefix&gt;/client_body_temp.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the directory name for the temporary files with the client request body[m
[31m-is specified by directive client_body_temp_path,[m
[31m-by default it is &lt;prefix&gt;/client_body_temp.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_fastcgi_module и директивы[m
[31m-fastcgi_pass,[m
[31m-fastcgi_root,[m
[31m-fastcgi_index,[m
[31m-fastcgi_params,[m
[31m-fastcgi_connect_timeout,[m
[31m-fastcgi_send_timeout,[m
[31m-fastcgi_read_timeout,[m
[31m-fastcgi_send_lowat,[m
[31m-fastcgi_header_buffer_size,[m
[31m-fastcgi_buffers,[m
[31m-fastcgi_busy_buffers_size,[m
[31m-fastcgi_temp_path,[m
[31m-fastcgi_max_temp_file_size,[m
[31m-fastcgi_temp_file_write_size,[m
[31m-fastcgi_next_upstream[m
[31m-и fastcgi_x_powered_by.[m
[31m-[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_fastcgi_module and the directives:[m
[31m-fastcgi_pass,[m
[31m-fastcgi_root,[m
[31m-fastcgi_index,[m
[31m-fastcgi_params,[m
[31m-fastcgi_connect_timeout,[m
[31m-fastcgi_send_timeout,[m
[31m-fastcgi_read_timeout,[m
[31m-fastcgi_send_lowat,[m
[31m-fastcgi_header_buffer_size,[m
[31m-fastcgi_buffers,[m
[31m-fastcgi_busy_buffers_size,[m
[31m-fastcgi_temp_path,[m
[31m-fastcgi_max_temp_file_size,[m
[31m-fastcgi_temp_file_write_size,[m
[31m-fastcgi_next_upstream,[m
[31m-and fastcgi_x_powered_by.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка "[alert] zero size buf";[m
[31m-ошибка появилась в 0.1.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error;[m
[31m-the bug had appeared in 0.1.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_pass нужно обязательно указывать URI после имени хоста.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the URI must be specified after the host name in the proxy_pass directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-если в URI встречался символ %3F, то он считался началом строки аргументов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %3F symbol in the URI was considered as the argument string start.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка unix domain сокетов в модуле ngx_http_proxy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the unix domain sockets support in the ngx_http_proxy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_engine и ssl_ciphers.<br/>[m
[31m-Спасибо Сергею Скворцову за SSL-акселератор.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ssl_engine and ssl_ciphers directives.<br/>[m
[31m-Thanks to Sergey Skvortsov for SSL-accelerator.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.13" date="21.12.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы server_names_hash и server_names_hash_threshold.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the server_names_hash and server_names_hash_threshold directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-имена *.domain.tld в директиве server_name не работали.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the *.domain.tld names in the "server_name" directive did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр лога %request_length записывал неверную длину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %request_length log parameter logged the incorrect length.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.12" date="06.12.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр лога %request_length.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %request_length log parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании /dev/poll, select и poll на платформах, где возможны[m
[31m-ложные срабатывания указанных методов, могли быть длительные задержки[m
[31m-при обработке запроса по keep-alive соединению.[m
[31m-Наблюдалось по крайней мере на Solaris с использованием /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-when using the /dev/poll, select and poll on the platforms, where[m
[31m-these methods may do the false reports, there may be the long delay when[m
[31m-the request was passed via the keep-alive connection.[m
[31m-It may be at least on Solaris when using the /dev/poll.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива send_lowat игнорируется на Linux, так как Linux не поддерживает[m
[31m-опцию SO_SNDLOWAT.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the send_lowat directive is ignored on Linux because Linux does not support[m
[31m-the SO_SNDLOWAT option.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.11" date="02.12.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_priority.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker_priority directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-под FreeBSD директивы tcp_nopush и tcp_nodelay вместе влияют на передачу[m
[31m-ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-both tcp_nopush and tcp_nodelay directives affect the transferred response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не вызывал initgroups().<br/>[m
[31m-Спасибо Андрею Ситникову и Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not call initgroups().<br/>[m
[31m-Thanks to Andrew Sitnikov and Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ngx_http_auto_index_module теперь выдаёт размер файлов в байтах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_autoindex_module shows the file size in the bytes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_auto_index_module возвращал ошибку 500, если в каталоге есть[m
[31m-битый symlink.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module returned the 500 error if the broken symlink[m
[31m-was in a directory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-файлы больше 4G не передавались с использованием sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files bigger than 4G could not be transferred using sendfile.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд резолвился в несколько адресов и при ожидании от него ответа[m
[31m-происходила ошибка, то процесс зацикливался.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the backend was resolved to several backends and there was an error while[m
[31m-the response waiting then process may got caught in an endless loop.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода /dev/poll рабочий процесс мог завершиться[m
[31m-с сообщением "unknown cycle".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker process may exit with the "unknown cycle" message when the /dev/poll[m
[31m-method was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "close() channel failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"close() channel failed" errors.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-автоматическое определение групп nobody и nogroup.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the autodetection of the "nobody" and "nogroup" groups.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива send_lowat не работала на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the send_lowat directive did not work on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в конфигурации не было раздела events, то происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault occurred if there was no events section[m
[31m-in configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под OpenBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OpenBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-двойные слэшы в "://" в URI превращались в ":/".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the double slashes in "://" in the URI were converted to ":/".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.10" date="26.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в запросе без аргументов есть "//", "/./", "/../" или "%XX",[m
[31m-то терялся последний символ в строке запроса;[m
[31m-ошибка появилась в 0.1.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request without arguments contains "//", "/./", "/../" or "%XX"[m
[31m-then the last character in the request line was lost;[m
[31m-the bug had appeared in 0.1.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-исправление в версии 0.1.9 для файлов больше 2G на Linux не работало.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the fix in 0.1.9 for the files bigger than 2G on Linux did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.9" date="25.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в запросе есть "//", "/./", "/../" или "%XX", то проксируемый[m
[31m-запрос передавался без аргументов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxied request was sent without arguments if the request contains[m
[31m-"//", "/./", "/../" or "%XX".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при сжатии больших ответов иногда они передавались не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the large compressed responses may be transferred not completely.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-не передавались файлы больше 2G на Linux, неподдерживающем sendfile64().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files bigger than 2G was not transferred on Linux that does not support[m
[31m-sendfile64().[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Linux при конфигурации сборки нужно было обязательно использовать[m
[31m-параметр --with-poll_module;[m
[31m-ошибка появилась в 0.1.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while the build configuration on Linux the --with-poll_module parameter[m
[31m-was required;[m
[31m-the bug had appeared in 0.1.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.8" date="20.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_autoindex_module при показе длинных имён файлов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_autoindex_module if the long file names were in the listing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модификатор "^~" в директиве location.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "^~" modifier in the location directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_max_temp_file_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_max_temp_file_size directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.7" date="12.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile, если передаваемый файл менялся, то мог[m
[31m-произойти segmentation fault на FreeBSD;[m
[31m-ошибка появилась в 0.1.5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on FreeBSD the segmentation fault may occur if the size of the transferred[m
[31m-file was changed;[m
[31m-the bug had appeared in 0.1.5.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.6" date="11.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых комбинациях директив location c регулярными выражениями[m
[31m-использовалась конфигурация не из того location.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some location directive combinations with the regular expressions caused[m
[31m-the wrong configuration choose.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.5" date="11.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Solaris и Linux могло быть очень много сообщений "recvmsg() returned[m
[31m-not enough data".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on Solaris and Linux there may be too many "recvmsg() returned not enough data"[m
[31m-alerts.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси без использования sendfile на Solaris возникала[m
[31m-ошибка "writev() failed <nobr>(22: Invalid argument)".</nobr>[m
[31m-На других платформах, не поддерживающих sendfile, процесс зацикливался.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-there were the "writev() failed <nobr>(22: Invalid argument)"</nobr> errors on[m
[31m-Solaris in proxy mode without sendfile. On other platforms that do not[m
[31m-support sendfile at all the process got caught in an endless loop.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile в режиме прокси на Solaris возникал[m
[31m-segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault on Solaris in proxy mode and using sendfile.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-segmentation fault на Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault on Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-обновление исполняемого файла на лету не работало на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on-line upgrade did not work on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в списке файлов, выдаваемом модулем ngx_http_autoindex_module,[m
[31m-не перекодировались пробелы, кавычки и знаки процента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module module did not escape the spaces,[m
[31m-the quotes, and the percent signs in the directory listing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-уменьшение операций копирования.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the decrease of the copy operations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива userid_p3p.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the userid_p3p directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.4" date="26.10.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.3" date="25.10.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module и директива autoindex.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module and the autoindex directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_x_url.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_set_x_url directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль проксировании мог привести к зацикливанию, если не использовался[m
[31m-sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxy module may get caught in an endless loop when sendfile is not used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.2" date="21.10.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры --user=USER, --group=GROUP и --with-ld-opt=OPTIONS в configure.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --user=USER, --group=GROUP, and --with-ld-opt=OPTIONS options in configure.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает *.domain.tld.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the server_name directive supports *.domain.tld.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-улучшена переносимость на неизвестные платформы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the portability improvements.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-нельзя переконфигурировать nginx, если конфигурационный файл указан[m
[31m-в командной строке;[m
[31m-ошибка появилась в 0.1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if configuration file was set in command line, the reconfiguration[m
[31m-was impossible;[m
[31m-the bug had appeared in 0.1.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль проксировании мог привести к зацикливанию, если не использовался[m
[31m-sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxy module may get caught in an endless loop when sendfile is not used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile текст ответа не перекодировался[m
[31m-согласно директивам модуля charset;[m
[31m-ошибка появилась в 0.1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-with sendfile the response was not recoded according to the charset[m
[31m-module directives;[m
[31m-the bug had appeared in 0.1.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-очень редкая ошибка при обработке kqueue.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-very seldom bug in the kqueue processing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль сжатия сжимал уже сжатые ответы, полученные при проксировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the gzip module compressed the proxied responses that was already compressed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.1" date="11.10.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_types.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the gzip_types directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива tcp_nodelay.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the tcp_nodelay directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива send_lowat работает не только на платформах, поддерживающих[m
[31m-kqueue NOTE_LOWAT, но и на всех, поддерживающих SO_SNDLOWAT.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the send_lowat directive is working not only on OSes that support[m
[31m-kqueue NOTE_LOWAT, but also on OSes that support SO_SNDLOWAT.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-эмуляция setproctitle() для Linux и Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the setproctitle() emulation for Linux and Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка при переписывании заголовка "Location" при проксировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Location" header rewrite bug fixed while the proxying.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_chunked_module, приводившая к зацикливанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_chunked_module module may get caught in an endless loop.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в модуле /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the /dev/poll module bugs fixed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании и использовании временных файлов ответы портились.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the responses were corrupted when the temporary files were used[m
[31m-while the proxying.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-бэкенду передавались запросы с неперекодированными символами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the unescaped requests were passed to the backend.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Linux 2.4 при конфигурации сборки нужно было обязательно использовать[m
[31m-параметр --with-poll_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while the build configuration on Linux 2.4 the --with-poll_module parameter[m
[31m-was required.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.0" date="04.10.2004">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Первая публично доступная версия.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-The first public version.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-</change_log>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xsls/changes.xsls b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xsls/changes.xsls[m
[1mdeleted file mode 100644[m
[1mindex 8be25a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xsls/changes.xsls[m
[1m+++ /dev/null[m
[36m@@ -1,128 +0,0 @@[m
[31m-X:stylesheet {[m
[31m-[m
[31m-X:output method="text";[m
[31m-[m
[31m-X:param lang="'en'";[m
[31m-X:param configuration="'../xml/change_log_conf.xml'";[m
[31m-[m
[31m-X:var conf = "document($configuration)/configuration";[m
[31m-X:var start = "$conf/start";[m
[31m-X:var indent = "$conf/indent";[m
[31m-X:var max = "$conf/length";[m
[31m-X:var br = {&lt;br&gt;}[m
[31m-[m
[31m-[m
[31m-X:template = "/" { !! "change_log"; }[m
[31m-X:template = "change_log" { !! "changes"; }[m
[31m-[m
[31m-[m
[31m-X:template = "changes" {[m
[31m-    X:text {&#10;}[m
[31m-[m
[31m-    !{substring(concat($conf/changes[@lang=$lang]/title,[m
[31m-                       //change_log/@title,[m
[31m-                       ' ', @ver,[m
[31m-                       '                                                    '),[m
[31m-                1, $conf/changes[@lang=$lang]/length)}[m
[31m-[m
[31m-    X:if "$lang='ru'" { !{@date} }[m
[31m-[m
[31m-    X:if "$lang='en'" {[m
[31m-        !{substring(@date, 1, 2)}[m
[31m-        !{$conf/changes[@lang=$lang]/month[number(substring(current()/@date,[m
[31m-                                                            4, 2))]}[m
[31m-        !{substring(@date, 7, 4)}[m
[31m-    }[m
[31m-[m
[31m-    X:text {&#10;}[m
[31m-[m
[31m-    !! "change";[m
[31m-[m
[31m-    X:text {&#10;}[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template = "change" {[m
[31m-    X:var prefix = "$conf/changes[@lang=$lang]/*[local-name(.)=current()/@type]"[m
[31m-[m
[31m-    X:var postfix = { X:if "$prefix" { X:text {: } } }[m
[31m-[m
[31m-    !! "para[@lang=$lang]" (prefix = "concat($start, $prefix, $postfix)");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template para(prefix) = "para" {[m
[31m-    X:var text = { !!; }[m
[31m-[m
[31m-    X:text {&#10;}[m
[31m-[m
[31m-    !wrap(text = "normalize-space($text)",[m
[31m-          prefix = { X:if "position() = 1" { !{$prefix} } else { !{$indent} } })[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template wrap(text, prefix) {[m
[31m-    X:if "$text" {[m
[31m-        X:var offset = {[m
[31m-            X:choose {[m
[31m-                X:when "starts-with($text, concat($br, ' '))" {[m
[31m-                    !{string-length($br) + 2}[m
[31m-                }[m
[31m-                X:when "starts-with($text, $br)" {[m
[31m-                    !{string-length($br) + 1}[m
[31m-                }[m
[31m-                X:otherwise {[m
[31m-                    1[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        X:var length = {[m
[31m-            !length(text = "substring($text, $offset)",[m
[31m-                    prefix = "string-length($prefix)",[m
[31m-                    length = "$max")[m
[31m-        }[m
[31m-[m
[31m-        !{$prefix}[m
[31m-[m
[31m-        !{normalize-space(translate(substring($text, $offset, $length),[m
[31m-                                    '&#xA0;', ' '))}[m
[31m-[m
[31m-        X:text {&#10;}[m
[31m-[m
[31m-        !wrap(text = "substring($text, $length + $offset)", prefix = "$indent")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template length(text, prefix, length) {[m
[31m-    X:var break = "substring-before(substring($text, 1,[m
[31m-                                    $length - $prefix + string-length($br)),[m
[31m-                                    $br)"[m
[31m-[m
[31m-    X:choose {[m
[31m-        X:when "$break" { !{string-length($break)} }[m
[31m-[m
[31m-        X:when "$length = 0" { !{$max - $prefix} }[m
[31m-[m
[31m-        X:when "string-length($text) + $prefix &lt;= $length" {[m
[31m-            !{$length - $prefix}[m
[31m-        }[m
[31m-[m
[31m-        X:when "substring($text, $length - $prefix + 1, 1) = ' '" {[m
[31m-            !{$length - $prefix + 1}[m
[31m-        }[m
[31m-[m
[31m-        X:otherwise {[m
[31m-            !length(text = "$text", prefix = "$prefix", length = "$length - 1")[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template = "at" {@}[m
[31m-X:template = "br" { !{$br} }[m
[31m-X:template = "nobr" { !{translate(., ' ', '&#xA0;')} }[m
[31m-[m
[31m-[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xslt/changes.xslt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xslt/changes.xslt[m
[1mdeleted file mode 100644[m
[1mindex a0178f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/docs/xslt/changes.xslt[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-<?xml version="1.0" encoding="utf-8"?>[m
[31m-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">[m
[31m-[m
[31m-<xsl:output method="text"/>[m
[31m-[m
[31m-<xsl:param select="'en'" name="lang"/>[m
[31m-<xsl:param select="'../xml/change_log_conf.xml'" name="configuration"/>[m
[31m-[m
[31m-<xsl:variable select="document($configuration)/configuration" name="conf"/>[m
[31m-<xsl:variable select="$conf/start" name="start"/>[m
[31m-<xsl:variable select="$conf/indent" name="indent"/>[m
[31m-<xsl:variable select="$conf/length" name="max"/>[m
[31m-<xsl:variable name="br">&lt;br&gt;</xsl:variable>[m
[31m-[m
[31m-[m
[31m-<xsl:template match="/"> <xsl:apply-templates select="change_log"/> </xsl:template>[m
[31m-<xsl:template match="change_log"> <xsl:apply-templates select="changes"/> </xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template match="changes">[m
[31m-    <xsl:text>&#10;</xsl:text>[m
[31m-[m
[31m-    <xsl:value-of select="substring(concat($conf/changes[@lang=$lang]/title,[m
[31m-                       //change_log/@title,[m
[31m-                       ' ', @ver,[m
[31m-                       '                                                    '),[m
[31m-                1, $conf/changes[@lang=$lang]/length)"/>[m
[31m-[m
[31m-    <xsl:if test="$lang='ru'"> <xsl:value-of select="@date"/> </xsl:if>[m
[31m-[m
[31m-    <xsl:if test="$lang='en'">[m
[31m-        <xsl:value-of select="substring(@date, 1, 2)"/>[m
[31m-        <xsl:value-of select="$conf/changes[@lang=$lang]/month[number(substring(current()/@date,[m
[31m-                                                            4, 2))]"/>[m
[31m-        <xsl:value-of select="substring(@date, 7, 4)"/>[m
[31m-    </xsl:if>[m
[31m-[m
[31m-    <xsl:text>&#10;</xsl:text>[m
[31m-[m
[31m-    <xsl:apply-templates select="change"/>[m
[31m-[m
[31m-    <xsl:text>&#10;</xsl:text>[m
[31m-</xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template match="change">[m
[31m-    <xsl:variable select="$conf/changes[@lang=$lang]/*[local-name(.)=current()/@type]" name="prefix"/>[m
[31m-[m
[31m-    <xsl:variable name="postfix"> <xsl:if test="$prefix"> <xsl:text>: </xsl:text> </xsl:if> </xsl:variable>[m
[31m-[m
[31m-    <xsl:apply-templates select="para[@lang=$lang]"><xsl:with-param select="concat($start, $prefix, $postfix)" name="prefix"/></xsl:apply-templates>[m
[31m-</xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template name="para" match="para"><xsl:param name="prefix"/>[m
[31m-    <xsl:variable name="text"> <xsl:apply-templates/> </xsl:variable>[m
[31m-[m
[31m-    <xsl:text>&#10;</xsl:text>[m
[31m-[m
[31m-    <xsl:call-template name="wrap"><xsl:with-param select="normalize-space($text)" name="text"/><xsl:with-param name="prefix"> <xsl:choose><xsl:when test="position() = 1"> <xsl:value-of select="$prefix"/> </xsl:when><xsl:otherwise> <xsl:value-of select="$indent"/> </xsl:otherwise></xsl:choose> </xsl:with-param></xsl:call-template></xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template name="wrap"><xsl:param name="text"/><xsl:param name="prefix"/>[m
[31m-    <xsl:if test="$text">[m
[31m-        <xsl:variable name="offset">[m
[31m-            <xsl:choose>[m
[31m-                <xsl:when test="starts-with($text, concat($br, ' '))">[m
[31m-                    <xsl:value-of select="string-length($br) + 2"/>[m
[31m-                </xsl:when>[m
[31m-                <xsl:when test="starts-with($text, $br)">[m
[31m-                    <xsl:value-of select="string-length($br) + 1"/>[m
[31m-                </xsl:when>[m
[31m-                <xsl:otherwise>[m
[31m-                    1[m
[31m-                </xsl:otherwise>[m
[31m-            </xsl:choose>[m
[31m-        </xsl:variable>[m
[31m-[m
[31m-        <xsl:variable name="length">[m
[31m-            <xsl:call-template name="length"><xsl:with-param select="substring($text, $offset)" name="text"/><xsl:with-param select="string-length($prefix)" name="prefix"/><xsl:with-param select="$max" name="length"/></xsl:call-template></xsl:variable>[m
[31m-[m
[31m-        <xsl:value-of select="$prefix"/>[m
[31m-[m
[31m-        <xsl:value-of select="normalize-space(translate(substring($text, $offset, $length),[m
[31m-                                    '&#xA0;', ' '))"/>[m
[31m-[m
[31m-        <xsl:text>&#10;</xsl:text>[m
[31m-[m
[31m-        <xsl:call-template name="wrap"><xsl:with-param select="substring($text, $length + $offset)" name="text"/><xsl:with-param select="$indent" name="prefix"/></xsl:call-template></xsl:if>[m
[31m-</xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template name="length"><xsl:param name="text"/><xsl:param name="prefix"/><xsl:param name="length"/>[m
[31m-    <xsl:variable select="substring-before(substring($text, 1,[m
[31m-                                    $length - $prefix + string-length($br)),[m
[31m-                                    $br)" name="break"/>[m
[31m-[m
[31m-    <xsl:choose>[m
[31m-        <xsl:when test="$break"> <xsl:value-of select="string-length($break)"/> </xsl:when>[m
[31m-[m
[31m-        <xsl:when test="$length = 0"> <xsl:value-of select="$max - $prefix"/> </xsl:when>[m
[31m-[m
[31m-        <xsl:when test="string-length($text) + $prefix &lt;= $length">[m
[31m-            <xsl:value-of select="$length - $prefix"/>[m
[31m-        </xsl:when>[m
[31m-[m
[31m-        <xsl:when test="substring($text, $length - $prefix + 1, 1) = ' '">[m
[31m-            <xsl:value-of select="$length - $prefix + 1"/>[m
[31m-        </xsl:when>[m
[31m-[m
[31m-        <xsl:otherwise>[m
[31m-            <xsl:call-template name="length"><xsl:with-param select="$text" name="text"/><xsl:with-param select="$prefix" name="prefix"/><xsl:with-param select="$length - 1" name="length"/></xsl:call-template></xsl:otherwise>[m
[31m-    </xsl:choose>[m
[31m-</xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template match="at">@</xsl:template>[m
[31m-<xsl:template match="br"> <xsl:value-of select="$br"/> </xsl:template>[m
[31m-<xsl:template match="nobr"> <xsl:value-of select="translate(., ' ', '&#xA0;')"/> </xsl:template>[m
[31m-[m
[31m-[m
[31m-</xsl:stylesheet>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/misc/GNUmakefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/misc/GNUmakefile[m
[1mdeleted file mode 100644[m
[1mindex 1f021c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/misc/GNUmakefile[m
[1m+++ /dev/null[m
[36m@@ -1,154 +0,0 @@[m
[31m-[m
[31m-VER =		$(shell grep 'define NGINX_VERSION' src/core/nginx.h	\[m
[31m-			| sed -e 's/^.*"\(.*\)".*/\1/')[m
[31m-NGINX =		nginx-$(VER)[m
[31m-TEMP =		tmp[m
[31m-[m
[31m-OBJS =		objs.msvc8[m
[31m-OPENSSL =	openssl-1.0.2g[m
[31m-ZLIB =		zlib-1.2.8[m
[31m-PCRE =		pcre-8.38[m
[31m-[m
[31m-[m
[31m-release: export[m
[31m-[m
[31m-	mv $(TEMP)/$(NGINX)/auto/configure $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	# delete incomplete sources[m
[31m-	rm $(TEMP)/$(NGINX)/src/event/ngx_event_acceptex.c[m
[31m-	rm $(TEMP)/$(NGINX)/src/event/ngx_event_connectex.c[m
[31m-	rm $(TEMP)/$(NGINX)/src/event/modules/ngx_iocp_module.*[m
[31m-	rm -r $(TEMP)/$(NGINX)/src/os/win32[m
[31m-[m
[31m-	mv $(TEMP)/$(NGINX)/docs/text/LICENSE $(TEMP)/$(NGINX)[m
[31m-	mv $(TEMP)/$(NGINX)/docs/text/README $(TEMP)/$(NGINX)[m
[31m-	mv $(TEMP)/$(NGINX)/docs/html $(TEMP)/$(NGINX)[m
[31m-	mv $(TEMP)/$(NGINX)/docs/man $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	$(MAKE) -f docs/GNUmakefile changes[m
[31m-[m
[31m-	rm -r $(TEMP)/$(NGINX)/docs[m
[31m-	rm -r $(TEMP)/$(NGINX)/misc[m
[31m-[m
[31m-	tar -c -z -f $(NGINX).tar.gz --directory $(TEMP) $(NGINX)[m
[31m-[m
[31m-[m
[31m-export:[m
[31m-	rm -rf $(TEMP)[m
[31m-	hg archive -X '.hg*' $(TEMP)/$(NGINX)[m
[31m-[m
[31m-[m
[31m-RELEASE:[m
[31m-	hg ci -m nginx-$(VER)-RELEASE[m
[31m-	hg tag -m "release-$(VER) tag" release-$(VER)[m
[31m-[m
[31m-	$(MAKE) -f misc/GNUmakefile release[m
[31m-[m
[31m-[m
[31m-win32:[m
[31m-	./auto/configure						\[m
[31m-		--with-cc=cl						\[m
[31m-		--builddir=$(OBJS)					\[m
[31m-		--with-debug						\[m
[31m-		--prefix= 						\[m
[31m-		--conf-path=conf/nginx.conf				\[m
[31m-		--pid-path=logs/nginx.pid				\[m
[31m-		--http-log-path=logs/access.log				\[m
[31m-		--error-log-path=logs/error.log				\[m
[31m-		--sbin-path=nginx.exe					\[m
[31m-		--http-client-body-temp-path=temp/client_body_temp	\[m
[31m-		--http-proxy-temp-path=temp/proxy_temp			\[m
[31m-		--http-fastcgi-temp-path=temp/fastcgi_temp		\[m
[31m-		--http-scgi-temp-path=temp/scgi_temp			\[m
[31m-		--http-uwsgi-temp-path=temp/uwsgi_temp			\[m
[31m-		--with-cc-opt=-DFD_SETSIZE=1024				\[m
[31m-		--with-pcre=$(OBJS)/lib/$(PCRE)				\[m
[31m-		--with-zlib=$(OBJS)/lib/$(ZLIB)				\[m
[31m-		--with-select_module					\[m
[31m-		--with-http_realip_module				\[m
[31m-		--with-http_addition_module				\[m
[31m-		--with-http_sub_module					\[m
[31m-		--with-http_dav_module					\[m
[31m-		--with-http_stub_status_module				\[m
[31m-		--with-http_flv_module					\[m
[31m-		--with-http_mp4_module					\[m
[31m-		--with-http_gunzip_module				\[m
[31m-		--with-http_gzip_static_module				\[m
[31m-		--with-http_auth_request_module				\[m
[31m-		--with-http_random_index_module				\[m
[31m-		--with-http_secure_link_module				\[m
[31m-		--with-http_slice_module				\[m
[31m-		--with-mail						\[m
[31m-		--with-stream						\[m
[31m-		--with-openssl=$(OBJS)/lib/$(OPENSSL)			\[m
[31m-		--with-openssl-opt=no-asm				\[m
[31m-		--with-http_ssl_module					\[m
[31m-		--with-mail_ssl_module					\[m
[31m-		--with-stream_ssl_module				\[m
[31m-		--with-ipv6[m
[31m-[m
[31m-[m
[31m-zip: export[m
[31m-	rm -f $(NGINX).zip[m
[31m-[m
[31m-	mkdir -p $(TEMP)/$(NGINX)/docs.new[m
[31m-	mkdir -p $(TEMP)/$(NGINX)/logs[m
[31m-	mkdir -p $(TEMP)/$(NGINX)/temp[m
[31m-[m
[31m-	sed -i '' -e "s/$$/`printf '\r'`/" $(TEMP)/$(NGINX)/conf/*[m
[31m-[m
[31m-	mv $(TEMP)/$(NGINX)/docs/text/LICENSE $(TEMP)/$(NGINX)/docs.new[m
[31m-	mv $(TEMP)/$(NGINX)/docs/text/README $(TEMP)/$(NGINX)/docs.new[m
[31m-	mv $(TEMP)/$(NGINX)/docs/html $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	rm -r $(TEMP)/$(NGINX)/docs[m
[31m-	mv $(TEMP)/$(NGINX)/docs.new $(TEMP)/$(NGINX)/docs[m
[31m-[m
[31m-	cp -p $(OBJS)/nginx.exe $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	$(MAKE) -f docs/GNUmakefile changes[m
[31m-	mv $(TEMP)/$(NGINX)/CHANGES* $(TEMP)/$(NGINX)/docs/[m
[31m-[m
[31m-	cp -p $(OBJS)/lib/$(OPENSSL)/LICENSE				\[m
[31m-		$(TEMP)/$(NGINX)/docs/OpenSSL.LICENSE[m
[31m-[m
[31m-	cp -p $(OBJS)/lib/$(PCRE)/LICENCE				\[m
[31m-		$(TEMP)/$(NGINX)/docs/PCRE.LICENCE[m
[31m-[m
[31m-	sed -ne '/^ (C) 1995-20/,/^  jloup@gzip\.org/p'			\[m
[31m-		$(OBJS)/lib/$(ZLIB)/README				\[m
[31m-		> $(TEMP)/$(NGINX)/docs/zlib.LICENSE[m
[31m-[m
[31m-	touch -r $(OBJS)/lib/$(ZLIB)/README				\[m
[31m-		$(TEMP)/$(NGINX)/docs/zlib.LICENSE[m
[31m-[m
[31m-	rm -r $(TEMP)/$(NGINX)/auto[m
[31m-	rm -r $(TEMP)/$(NGINX)/misc[m
[31m-	rm -r $(TEMP)/$(NGINX)/src[m
[31m-[m
[31m-	cd $(TEMP) && zip -r ../$(NGINX).zip $(NGINX)[m
[31m-[m
[31m-[m
[31m-icons:	src/os/win32/nginx.ico[m
[31m-[m
[31m-# 48x48, 32x32 and 16x16 icons[m
[31m-[m
[31m-src/os/win32/nginx.ico:	src/os/win32/nginx_icon48.xpm			\[m
[31m-			src/os/win32/nginx_icon32.xpm			\[m
[31m-			src/os/win32/nginx_icon16.xpm[m
[31m-[m
[31m-	test -d $(TEMP) || mkdir $(TEMP)[m
[31m-[m
[31m-	xpmtoppm --alphaout=$(TEMP)/nginx48.pbm				\[m
[31m-		src/os/win32/nginx_icon48.xpm > $(TEMP)/nginx48.ppm[m
[31m-[m
[31m-	xpmtoppm --alphaout=$(TEMP)/nginx32.pbm				\[m
[31m-		src/os/win32/nginx_icon32.xpm > $(TEMP)/nginx32.ppm[m
[31m-[m
[31m-	xpmtoppm --alphaout=$(TEMP)/nginx16.pbm				\[m
[31m-		src/os/win32/nginx_icon16.xpm > $(TEMP)/nginx16.ppm[m
[31m-[m
[31m-	ppmtowinicon -output src/os/win32/nginx.ico -andpgms		\[m
[31m-		$(TEMP)/nginx48.ppm $(TEMP)/nginx48.pbm			\[m
[31m-		$(TEMP)/nginx32.ppm $(TEMP)/nginx32.pbm			\[m
[31m-		$(TEMP)/nginx16.ppm $(TEMP)/nginx16.pbm[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/misc/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/misc/README[m
[1mdeleted file mode 100644[m
[1mindex 3f7b323..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/misc/README[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-[m
[31m-make -f misc/GNUmakefile release[m
[31m-[m
[31m-the required tools:[m
[31m-*) xsltproc to build CHANGES,[m
[31m-*) xslscript.pl ( http://hg.nginx.org/xslscript ) to build XSLTs[m
[31m-   from XSLScript sources.[m
[31m-[m
[31m-[m
[31m-make -f misc/GNUmakefile icons[m
[31m-[m
[31m-the required tool:[m
[31m-*) netpbm to create Win32 icons from xpm sources.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 31ca1eb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,2354 +0,0 @@[m
[31m-[m
[31m-CC =	cc[m
[31m-CFLAGS = -I/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g -O2 -DNDK_SET_VAR -DNDK_UPSTREAM_LIST -DNDK_SET_VAR -DNDK_SET_VAR -DNDK_SET_VAR -DLUA_DEFAULT_PATH='"/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua"' -DLUA_DEFAULT_CPATH='"/usr/local/openresty/lualib/?.so"' -DNDK_SET_VAR[m
[31m-CPP =	cc -E[m
[31m-LINK =	$(CC)[m
[31m-[m
[31m-[m
[31m-ALL_INCS = -I src/core \[m
[31m-	-I src/event \[m
[31m-	-I src/event/modules \[m
[31m-	-I src/os/unix \[m
[31m-	-I ../ngx_devel_kit-0.3.0/objs \[m
[31m-	-I objs/addon/ndk \[m
[31m-	-I ../ngx_lua-0.10.5/src/api \[m
[31m-	-I objs \[m
[31m-	-I src/http \[m
[31m-	-I src/http/modules \[m
[31m-	-I ../ngx_devel_kit-0.3.0/src \[m
[31m-	-I ../ngx_devel_kit-0.3.0/src \[m
[31m-	-I ../ngx_devel_kit-0.3.0/objs \[m
[31m-	-I objs/addon/ndk \[m
[31m-	-I /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1[m
[31m-[m
[31m-[m
[31m-CORE_DEPS = src/core/nginx.h \[m
[31m-	src/core/ngx_config.h \[m
[31m-	src/core/ngx_core.h \[m
[31m-	src/core/ngx_log.h \[m
[31m-	src/core/ngx_palloc.h \[m
[31m-	src/core/ngx_array.h \[m
[31m-	src/core/ngx_list.h \[m
[31m-	src/core/ngx_hash.h \[m
[31m-	src/core/ngx_buf.h \[m
[31m-	src/core/ngx_queue.h \[m
[31m-	src/core/ngx_string.h \[m
[31m-	src/core/ngx_parse.h \[m
[31m-	src/core/ngx_parse_time.h \[m
[31m-	src/core/ngx_inet.h \[m
[31m-	src/core/ngx_file.h \[m
[31m-	src/core/ngx_crc.h \[m
[31m-	src/core/ngx_crc32.h \[m
[31m-	src/core/ngx_murmurhash.h \[m
[31m-	src/core/ngx_md5.h \[m
[31m-	src/core/ngx_sha1.h \[m
[31m-	src/core/ngx_rbtree.h \[m
[31m-	src/core/ngx_radix_tree.h \[m
[31m-	src/core/ngx_rwlock.h \[m
[31m-	src/core/ngx_slab.h \[m
[31m-	src/core/ngx_times.h \[m
[31m-	src/core/ngx_shmtx.h \[m
[31m-	src/core/ngx_connection.h \[m
[31m-	src/core/ngx_cycle.h \[m
[31m-	src/core/ngx_conf_file.h \[m
[31m-	src/core/ngx_module.h \[m
[31m-	src/core/ngx_resolver.h \[m
[31m-	src/core/ngx_open_file_cache.h \[m
[31m-	src/core/ngx_crypt.h \[m
[31m-	src/core/ngx_core_probe.h \[m
[31m-	src/core/ngx_proxy_protocol.h \[m
[31m-	src/core/ngx_syslog.h \[m
[31m-	src/event/ngx_event.h \[m
[31m-	src/event/ngx_event_timer.h \[m
[31m-	src/event/ngx_event_posted.h \[m
[31m-	src/event/ngx_event_connect.h \[m
[31m-	src/event/ngx_event_pipe.h \[m
[31m-	src/event/ngx_event_probe.h \[m
[31m-	src/os/unix/ngx_time.h \[m
[31m-	src/os/unix/ngx_errno.h \[m
[31m-	src/os/unix/ngx_alloc.h \[m
[31m-	src/os/unix/ngx_files.h \[m
[31m-	src/os/unix/ngx_channel.h \[m
[31m-	src/os/unix/ngx_shmem.h \[m
[31m-	src/os/unix/ngx_process.h \[m
[31m-	src/os/unix/ngx_setaffinity.h \[m
[31m-	src/os/unix/ngx_setproctitle.h \[m
[31m-	src/os/unix/ngx_atomic.h \[m
[31m-	src/os/unix/ngx_gcc_atomic_x86.h \[m
[31m-	src/os/unix/ngx_thread.h \[m
[31m-	src/os/unix/ngx_socket.h \[m
[31m-	src/os/unix/ngx_os.h \[m
[31m-	src/os/unix/ngx_user.h \[m
[31m-	src/os/unix/ngx_dlopen.h \[m
[31m-	src/os/unix/ngx_process_cycle.h \[m
[31m-	src/os/unix/ngx_linux_config.h \[m
[31m-	src/os/unix/ngx_linux.h \[m
[31m-	src/event/ngx_event_openssl.h \[m
[31m-	src/core/ngx_regex.h \[m
[31m-	objs/ngx_auto_config.h[m
[31m-[m
[31m-[m
[31m-CORE_INCS = -I src/core \[m
[31m-	-I src/event \[m
[31m-	-I src/event/modules \[m
[31m-	-I src/os/unix \[m
[31m-	-I ../ngx_devel_kit-0.3.0/objs \[m
[31m-	-I objs/addon/ndk \[m
[31m-	-I ../ngx_lua-0.10.5/src/api \[m
[31m-	-I objs[m
[31m-[m
[31m-[m
[31m-HTTP_DEPS = src/http/ngx_http.h \[m
[31m-	src/http/ngx_http_request.h \[m
[31m-	src/http/ngx_http_config.h \[m
[31m-	src/http/ngx_http_core_module.h \[m
[31m-	src/http/ngx_http_cache.h \[m
[31m-	src/http/ngx_http_variables.h \[m
[31m-	src/http/ngx_http_script.h \[m
[31m-	src/http/ngx_http_upstream.h \[m
[31m-	src/http/ngx_http_upstream_round_robin.h \[m
[31m-	src/http/ngx_http_probe.h \[m
[31m-	src/http/modules/ngx_http_ssi_filter_module.h \[m
[31m-	src/http/modules/ngx_http_ssl_module.h[m
[31m-[m
[31m-[m
[31m-HTTP_INCS = -I src/http \[m
[31m-	-I src/http/modules \[m
[31m-	-I ../ngx_devel_kit-0.3.0/src \[m
[31m-	-I ../ngx_devel_kit-0.3.0/src \[m
[31m-	-I ../ngx_devel_kit-0.3.0/objs \[m
[31m-	-I objs/addon/ndk \[m
[31m-	-I /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1[m
[31m-[m
[31m-[m
[31m-ADDON_DEPS = $(CORE_DEPS)  ../ngx_devel_kit-0.3.0/src/ndk.h                                                                          ../echo-nginx-module-0.59/src/ddebug.h                                                 ../echo-nginx-module-0.59/src/ngx_http_echo_module.h                                   ../echo-nginx-module-0.59/src/ngx_http_echo_handler.h                                  ../echo-nginx-module-0.59/src/ngx_http_echo_util.h                                     ../echo-nginx-module-0.59/src/ngx_http_echo_sleep.h                                    ../echo-nginx-module-0.59/src/ngx_http_echo_filter.h                                   ../echo-nginx-module-0.59/src/ngx_http_echo_var.h                                      ../echo-nginx-module-0.59/src/ngx_http_echo_location.h                                 ../echo-nginx-module-0.59/src/ngx_http_echo_echo.h                                     ../echo-nginx-module-0.59/src/ngx_http_echo_request_info.h                             ../echo-nginx-module-0.59/src/ngx_http_echo_subrequest.h                               ../echo-nginx-module-0.59/src/ngx_http_echo_foreach.h                                   ../xss-nginx-module-0.05/src/ddebug.h ../xss-nginx-module-0.05/src/ngx_http_xss_filter_module.h ../xss-nginx-module-0.05/src/ngx_http_xss_util.h ../ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.h ../ngx_coolkit-0.2rc3/src/ngx_coolkit_module.h ../ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.h                                                                          ../set-misc-nginx-module-0.30/src/ddebug.h                                                 ../set-misc-nginx-module-0.30/src/ngx_http_set_default_value.h                             ../set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.h                           ../set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.h                                 ../set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.h                                ../set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.h                              ../set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.h                                ../set-misc-nginx-module-0.30/src/ngx_http_set_hash.h                                      ../set-misc-nginx-module-0.30/src/ngx_http_set_local_today.h                               ../set-misc-nginx-module-0.30/src/ngx_http_set_hex.h                                       ../set-misc-nginx-module-0.30/src/ngx_http_set_base64.h                                    ../set-misc-nginx-module-0.30/src/ngx_http_set_random.h                                    ../set-misc-nginx-module-0.30/src/ngx_http_set_rotate.h                                    ../set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.h                             ../set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.h                                ../set-misc-nginx-module-0.30/src/ngx_http_set_hmac.h ../form-input-nginx-module-0.12/src/ddebug.h                                                                    ../encrypted-session-nginx-module-0.05/src/ddebug.h                                                 ../encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.h                                                                                                 ../srcache-nginx-module-0.31/src/ddebug.h                                                 ../srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.h                         ../srcache-nginx-module-0.31/src/ngx_http_srcache_util.h                                  ../srcache-nginx-module-0.31/src/ngx_http_srcache_var.h                                   ../srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.h                                 ../srcache-nginx-module-0.31/src/ngx_http_srcache_store.h                                 ../srcache-nginx-module-0.31/src/ngx_http_srcache_headers.h                                             ../ngx_lua-0.10.5/src/ddebug.h             ../ngx_lua-0.10.5/src/ngx_http_lua_script.h             ../ngx_lua-0.10.5/src/ngx_http_lua_log.h             ../ngx_lua-0.10.5/src/ngx_http_lua_subrequest.h             ../ngx_lua-0.10.5/src/ngx_http_lua_ndk.h             ../ngx_lua-0.10.5/src/ngx_http_lua_control.h             ../ngx_lua-0.10.5/src/ngx_http_lua_time.h             ../ngx_lua-0.10.5/src/ngx_http_lua_string.h             ../ngx_lua-0.10.5/src/ngx_http_lua_misc.h             ../ngx_lua-0.10.5/src/ngx_http_lua_variable.h             ../ngx_lua-0.10.5/src/ngx_http_lua_output.h             ../ngx_lua-0.10.5/src/ngx_http_lua_headers.h             ../ngx_lua-0.10.5/src/ngx_http_lua_uri.h             ../ngx_lua-0.10.5/src/ngx_http_lua_req_body.h             ../ngx_lua-0.10.5/src/ngx_http_lua_args.h             ../ngx_lua-0.10.5/src/ngx_http_lua_ctx.h             ../ngx_lua-0.10.5/src/ngx_http_lua_regex.h             ../ngx_lua-0.10.5/src/ngx_http_lua_common.h             ../ngx_lua-0.10.5/src/ngx_http_lua_directive.h             ../ngx_lua-0.10.5/src/ngx_http_lua_headers_out.h             ../ngx_lua-0.10.5/src/ngx_http_lua_headers_in.h             ../ngx_lua-0.10.5/src/ngx_http_lua_consts.h             ../ngx_lua-0.10.5/src/ngx_http_lua_exception.h             ../ngx_lua-0.10.5/src/ngx_http_lua_util.h             ../ngx_lua-0.10.5/src/ngx_http_lua_cache.h             ../ngx_lua-0.10.5/src/ngx_http_lua_contentby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_accessby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_setby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.h             ../ngx_lua-0.10.5/src/ngx_http_lua_clfactory.h             ../ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.h             ../ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_shdict.h             ../ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.h             ../ngx_lua-0.10.5/src/api/ngx_http_lua_api.h             ../ngx_lua-0.10.5/src/ngx_http_lua_logby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_sleep.h             ../ngx_lua-0.10.5/src/ngx_http_lua_semaphore.h            ../ngx_lua-0.10.5/src/ngx_http_lua_coroutine.h             ../ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_initby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.h             ../ngx_lua-0.10.5/src/ngx_http_lua_req_method.h             ../ngx_lua-0.10.5/src/ngx_http_lua_phase.h             ../ngx_lua-0.10.5/src/ngx_http_lua_probe.h             ../ngx_lua-0.10.5/src/ngx_http_lua_uthread.h             ../ngx_lua-0.10.5/src/ngx_http_lua_timer.h             ../ngx_lua-0.10.5/src/ngx_http_lua_config.h             ../ngx_lua-0.10.5/src/ngx_http_lua_worker.h             ../ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.h             ../ngx_lua-0.10.5/src/ngx_http_lua_lex.h             ../ngx_lua-0.10.5/src/ngx_http_lua_balancer.h                                                                                       ../headers-more-nginx-module-0.30/src/ddebug.h                                                 ../headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.h                    ../headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.h                       ../headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.h                      ../headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.h                       ../headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.h                                                                                                         ../array-var-nginx-module-0.05/src/ddebug.h                                                 ../array-var-nginx-module-0.05/src/ngx_http_array_var_util.h                                                                                                          ../memc-nginx-module-0.17/src/ddebug.h                                                 ../memc-nginx-module-0.17/src/ngx_http_memc_module.h                                   ../memc-nginx-module-0.17/src/ngx_http_memc_request.h                                  ../memc-nginx-module-0.17/src/ngx_http_memc_response.h                                 ../memc-nginx-module-0.17/src/ngx_http_memc_util.h                                     ../memc-nginx-module-0.17/src/ngx_http_memc_handler.h                                                                                                              ../redis2-nginx-module-0.13/src/ddebug.h                                                 ../redis2-nginx-module-0.13/src/ngx_http_redis2_module.h                                 ../redis2-nginx-module-0.13/src/ngx_http_redis2_handler.h                                ../redis2-nginx-module-0.13/src/ngx_http_redis2_reply.h                                  ../redis2-nginx-module-0.13/src/ngx_http_redis2_util.h                                    ../rds-json-nginx-module-0.14/src/ddebug.h ../rds-json-nginx-module-0.14/src/resty_dbd_stream.h ../rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.h ../rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.h ../rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.h ../rds-json-nginx-module-0.14/src/ngx_http_rds.h ../rds-json-nginx-module-0.14/src/resty_dbd_stream.h ../rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.h ../rds-json-nginx-module-0.14/src/ngx_http_rds_utils.h ../rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.h ../rds-csv-nginx-module-0.07/src/ddebug.h ../rds-csv-nginx-module-0.07/src/resty_dbd_stream.h ../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.h ../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.h ../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.h ../rds-csv-nginx-module-0.07/src/ngx_http_rds.h ../rds-csv-nginx-module-0.07/src/resty_dbd_stream.h ../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.h ../rds-csv-nginx-module-0.07/src/ngx_http_rds_utils.h $(HTTP_DEPS)[m
[31m-[m
[31m-[m
[31m-build:	binary modules manpage[m
[31m-[m
[31m-binary:	objs/nginx[m
[31m-[m
[31m-objs/nginx:	objs/src/core/nginx.o \[m
[31m-	objs/src/core/ngx_log.o \[m
[31m-	objs/src/core/ngx_palloc.o \[m
[31m-	objs/src/core/ngx_array.o \[m
[31m-	objs/src/core/ngx_list.o \[m
[31m-	objs/src/core/ngx_hash.o \[m
[31m-	objs/src/core/ngx_buf.o \[m
[31m-	objs/src/core/ngx_queue.o \[m
[31m-	objs/src/core/ngx_output_chain.o \[m
[31m-	objs/src/core/ngx_string.o \[m
[31m-	objs/src/core/ngx_parse.o \[m
[31m-	objs/src/core/ngx_parse_time.o \[m
[31m-	objs/src/core/ngx_inet.o \[m
[31m-	objs/src/core/ngx_file.o \[m
[31m-	objs/src/core/ngx_crc32.o \[m
[31m-	objs/src/core/ngx_murmurhash.o \[m
[31m-	objs/src/core/ngx_md5.o \[m
[31m-	objs/src/core/ngx_rbtree.o \[m
[31m-	objs/src/core/ngx_radix_tree.o \[m
[31m-	objs/src/core/ngx_slab.o \[m
[31m-	objs/src/core/ngx_times.o \[m
[31m-	objs/src/core/ngx_shmtx.o \[m
[31m-	objs/src/core/ngx_connection.o \[m
[31m-	objs/src/core/ngx_cycle.o \[m
[31m-	objs/src/core/ngx_spinlock.o \[m
[31m-	objs/src/core/ngx_rwlock.o \[m
[31m-	objs/src/core/ngx_cpuinfo.o \[m
[31m-	objs/src/core/ngx_conf_file.o \[m
[31m-	objs/src/core/ngx_module.o \[m
[31m-	objs/src/core/ngx_resolver.o \[m
[31m-	objs/src/core/ngx_open_file_cache.o \[m
[31m-	objs/src/core/ngx_crypt.o \[m
[31m-	objs/src/core/ngx_proxy_protocol.o \[m
[31m-	objs/src/core/ngx_syslog.o \[m
[31m-	objs/src/event/ngx_event.o \[m
[31m-	objs/src/event/ngx_event_timer.o \[m
[31m-	objs/src/event/ngx_event_posted.o \[m
[31m-	objs/src/event/ngx_event_accept.o \[m
[31m-	objs/src/event/ngx_event_connect.o \[m
[31m-	objs/src/event/ngx_event_pipe.o \[m
[31m-	objs/src/os/unix/ngx_time.o \[m
[31m-	objs/src/os/unix/ngx_errno.o \[m
[31m-	objs/src/os/unix/ngx_alloc.o \[m
[31m-	objs/src/os/unix/ngx_files.o \[m
[31m-	objs/src/os/unix/ngx_socket.o \[m
[31m-	objs/src/os/unix/ngx_recv.o \[m
[31m-	objs/src/os/unix/ngx_readv_chain.o \[m
[31m-	objs/src/os/unix/ngx_udp_recv.o \[m
[31m-	objs/src/os/unix/ngx_send.o \[m
[31m-	objs/src/os/unix/ngx_writev_chain.o \[m
[31m-	objs/src/os/unix/ngx_udp_send.o \[m
[31m-	objs/src/os/unix/ngx_channel.o \[m
[31m-	objs/src/os/unix/ngx_shmem.o \[m
[31m-	objs/src/os/unix/ngx_process.o \[m
[31m-	objs/src/os/unix/ngx_daemon.o \[m
[31m-	objs/src/os/unix/ngx_setaffinity.o \[m
[31m-	objs/src/os/unix/ngx_setproctitle.o \[m
[31m-	objs/src/os/unix/ngx_posix_init.o \[m
[31m-	objs/src/os/unix/ngx_user.o \[m
[31m-	objs/src/os/unix/ngx_dlopen.o \[m
[31m-	objs/src/os/unix/ngx_process_cycle.o \[m
[31m-	objs/src/os/unix/ngx_linux_init.o \[m
[31m-	objs/src/event/modules/ngx_epoll_module.o \[m
[31m-	objs/src/os/unix/ngx_linux_sendfile_chain.o \[m
[31m-	objs/src/event/ngx_event_openssl.o \[m
[31m-	objs/src/event/ngx_event_openssl_stapling.o \[m
[31m-	objs/src/core/ngx_regex.o \[m
[31m-	objs/src/http/ngx_http.o \[m
[31m-	objs/src/http/ngx_http_core_module.o \[m
[31m-	objs/src/http/ngx_http_special_response.o \[m
[31m-	objs/src/http/ngx_http_request.o \[m
[31m-	objs/src/http/ngx_http_parse.o \[m
[31m-	objs/src/http/modules/ngx_http_log_module.o \[m
[31m-	objs/src/http/ngx_http_request_body.o \[m
[31m-	objs/src/http/ngx_http_variables.o \[m
[31m-	objs/src/http/ngx_http_script.o \[m
[31m-	objs/src/http/ngx_http_upstream.o \[m
[31m-	objs/src/http/ngx_http_upstream_round_robin.o \[m
[31m-	objs/src/http/ngx_http_file_cache.o \[m
[31m-	objs/src/http/ngx_http_write_filter_module.o \[m
[31m-	objs/src/http/ngx_http_header_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_chunked_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_range_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_gzip_filter_module.o \[m
[31m-	objs/src/http/ngx_http_postpone_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_ssi_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_charset_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_userid_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_headers_filter_module.o \[m
[31m-	objs/src/http/ngx_http_copy_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_not_modified_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_static_module.o \[m
[31m-	objs/src/http/modules/ngx_http_autoindex_module.o \[m
[31m-	objs/src/http/modules/ngx_http_index_module.o \[m
[31m-	objs/src/http/modules/ngx_http_auth_basic_module.o \[m
[31m-	objs/src/http/modules/ngx_http_access_module.o \[m
[31m-	objs/src/http/modules/ngx_http_limit_conn_module.o \[m
[31m-	objs/src/http/modules/ngx_http_limit_req_module.o \[m
[31m-	objs/src/http/modules/ngx_http_geo_module.o \[m
[31m-	objs/src/http/modules/ngx_http_map_module.o \[m
[31m-	objs/src/http/modules/ngx_http_split_clients_module.o \[m
[31m-	objs/src/http/modules/ngx_http_referer_module.o \[m
[31m-	objs/src/http/modules/ngx_http_rewrite_module.o \[m
[31m-	objs/src/http/modules/ngx_http_ssl_module.o \[m
[31m-	objs/src/http/modules/ngx_http_proxy_module.o \[m
[31m-	objs/src/http/modules/ngx_http_fastcgi_module.o \[m
[31m-	objs/src/http/modules/ngx_http_uwsgi_module.o \[m
[31m-	objs/src/http/modules/ngx_http_scgi_module.o \[m
[31m-	objs/src/http/modules/ngx_http_memcached_module.o \[m
[31m-	objs/src/http/modules/ngx_http_empty_gif_module.o \[m
[31m-	objs/src/http/modules/ngx_http_browser_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_hash_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_ip_hash_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_least_conn_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_keepalive_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_zone_module.o \[m
[31m-	objs/addon/src/ndk.o \[m
[31m-	objs/addon/src/ngx_http_echo_module.o \[m
[31m-	objs/addon/src/ngx_http_echo_util.o \[m
[31m-	objs/addon/src/ngx_http_echo_timer.o \[m
[31m-	objs/addon/src/ngx_http_echo_var.o \[m
[31m-	objs/addon/src/ngx_http_echo_handler.o \[m
[31m-	objs/addon/src/ngx_http_echo_filter.o \[m
[31m-	objs/addon/src/ngx_http_echo_sleep.o \[m
[31m-	objs/addon/src/ngx_http_echo_location.o \[m
[31m-	objs/addon/src/ngx_http_echo_echo.o \[m
[31m-	objs/addon/src/ngx_http_echo_request_info.o \[m
[31m-	objs/addon/src/ngx_http_echo_subrequest.o \[m
[31m-	objs/addon/src/ngx_http_echo_foreach.o \[m
[31m-	objs/addon/src/ngx_http_xss_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_xss_util.o \[m
[31m-	objs/addon/src/ngx_coolkit_handlers.o \[m
[31m-	objs/addon/src/ngx_coolkit_module.o \[m
[31m-	objs/addon/src/ngx_coolkit_variables.o \[m
[31m-	objs/addon/src/ngx_http_set_base32.o \[m
[31m-	objs/addon/src/ngx_http_set_default_value.o \[m
[31m-	objs/addon/src/ngx_http_set_hashed_upstream.o \[m
[31m-	objs/addon/src/ngx_http_set_quote_sql.o \[m
[31m-	objs/addon/src/ngx_http_set_quote_json.o \[m
[31m-	objs/addon/src/ngx_http_set_unescape_uri.o \[m
[31m-	objs/addon/src/ngx_http_set_misc_module.o \[m
[31m-	objs/addon/src/ngx_http_set_escape_uri.o \[m
[31m-	objs/addon/src/ngx_http_set_hash.o \[m
[31m-	objs/addon/src/ngx_http_set_local_today.o \[m
[31m-	objs/addon/src/ngx_http_set_hex.o \[m
[31m-	objs/addon/src/ngx_http_set_base64.o \[m
[31m-	objs/addon/src/ngx_http_set_random.o \[m
[31m-	objs/addon/src/ngx_http_set_secure_random.o \[m
[31m-	objs/addon/src/ngx_http_set_rotate.o \[m
[31m-	objs/addon/src/ngx_http_set_hmac.o \[m
[31m-	objs/addon/src/ngx_http_form_input_module.o \[m
[31m-	objs/addon/src/ngx_http_encrypted_session_module.o \[m
[31m-	objs/addon/src/ngx_http_encrypted_session_cipher.o \[m
[31m-	objs/addon/src/ngx_http_srcache_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_srcache_util.o \[m
[31m-	objs/addon/src/ngx_http_srcache_var.o \[m
[31m-	objs/addon/src/ngx_http_srcache_store.o \[m
[31m-	objs/addon/src/ngx_http_srcache_fetch.o \[m
[31m-	objs/addon/src/ngx_http_srcache_headers.o \[m
[31m-	objs/addon/src/ngx_http_lua_script.o \[m
[31m-	objs/addon/src/ngx_http_lua_log.o \[m
[31m-	objs/addon/src/ngx_http_lua_subrequest.o \[m
[31m-	objs/addon/src/ngx_http_lua_ndk.o \[m
[31m-	objs/addon/src/ngx_http_lua_control.o \[m
[31m-	objs/addon/src/ngx_http_lua_time.o \[m
[31m-	objs/addon/src/ngx_http_lua_misc.o \[m
[31m-	objs/addon/src/ngx_http_lua_variable.o \[m
[31m-	objs/addon/src/ngx_http_lua_string.o \[m
[31m-	objs/addon/src/ngx_http_lua_output.o \[m
[31m-	objs/addon/src/ngx_http_lua_headers.o \[m
[31m-	objs/addon/src/ngx_http_lua_req_body.o \[m
[31m-	objs/addon/src/ngx_http_lua_uri.o \[m
[31m-	objs/addon/src/ngx_http_lua_args.o \[m
[31m-	objs/addon/src/ngx_http_lua_ctx.o \[m
[31m-	objs/addon/src/ngx_http_lua_regex.o \[m
[31m-	objs/addon/src/ngx_http_lua_module.o \[m
[31m-	objs/addon/src/ngx_http_lua_headers_out.o \[m
[31m-	objs/addon/src/ngx_http_lua_headers_in.o \[m
[31m-	objs/addon/src/ngx_http_lua_directive.o \[m
[31m-	objs/addon/src/ngx_http_lua_consts.o \[m
[31m-	objs/addon/src/ngx_http_lua_exception.o \[m
[31m-	objs/addon/src/ngx_http_lua_util.o \[m
[31m-	objs/addon/src/ngx_http_lua_cache.o \[m
[31m-	objs/addon/src/ngx_http_lua_contentby.o \[m
[31m-	objs/addon/src/ngx_http_lua_rewriteby.o \[m
[31m-	objs/addon/src/ngx_http_lua_accessby.o \[m
[31m-	objs/addon/src/ngx_http_lua_setby.o \[m
[31m-	objs/addon/src/ngx_http_lua_capturefilter.o \[m
[31m-	objs/addon/src/ngx_http_lua_clfactory.o \[m
[31m-	objs/addon/src/ngx_http_lua_pcrefix.o \[m
[31m-	objs/addon/src/ngx_http_lua_headerfilterby.o \[m
[31m-	objs/addon/src/ngx_http_lua_shdict.o \[m
[31m-	objs/addon/src/ngx_http_lua_socket_tcp.o \[m
[31m-	objs/addon/src/ngx_http_lua_api.o \[m
[31m-	objs/addon/src/ngx_http_lua_logby.o \[m
[31m-	objs/addon/src/ngx_http_lua_sleep.o \[m
[31m-	objs/addon/src/ngx_http_lua_semaphore.o \[m
[31m-	objs/addon/src/ngx_http_lua_coroutine.o \[m
[31m-	objs/addon/src/ngx_http_lua_bodyfilterby.o \[m
[31m-	objs/addon/src/ngx_http_lua_initby.o \[m
[31m-	objs/addon/src/ngx_http_lua_initworkerby.o \[m
[31m-	objs/addon/src/ngx_http_lua_socket_udp.o \[m
[31m-	objs/addon/src/ngx_http_lua_req_method.o \[m
[31m-	objs/addon/src/ngx_http_lua_phase.o \[m
[31m-	objs/addon/src/ngx_http_lua_uthread.o \[m
[31m-	objs/addon/src/ngx_http_lua_timer.o \[m
[31m-	objs/addon/src/ngx_http_lua_config.o \[m
[31m-	objs/addon/src/ngx_http_lua_worker.o \[m
[31m-	objs/addon/src/ngx_http_lua_ssl_certby.o \[m
[31m-	objs/addon/src/ngx_http_lua_ssl_ocsp.o \[m
[31m-	objs/addon/src/ngx_http_lua_lex.o \[m
[31m-	objs/addon/src/ngx_http_lua_balancer.o \[m
[31m-	objs/addon/src/ngx_http_lua_upstream_module.o \[m
[31m-	objs/addon/src/ngx_http_headers_more_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_headers_more_headers_out.o \[m
[31m-	objs/addon/src/ngx_http_headers_more_headers_in.o \[m
[31m-	objs/addon/src/ngx_http_headers_more_util.o \[m
[31m-	objs/addon/src/ngx_http_array_var_module.o \[m
[31m-	objs/addon/src/ngx_http_array_var_util.o \[m
[31m-	objs/addon/src/ngx_http_memc_module.o \[m
[31m-	objs/addon/src/ngx_http_memc_request.o \[m
[31m-	objs/addon/src/ngx_http_memc_response.o \[m
[31m-	objs/addon/src/ngx_http_memc_util.o \[m
[31m-	objs/addon/src/ngx_http_memc_handler.o \[m
[31m-	objs/addon/src/ngx_http_redis2_module.o \[m
[31m-	objs/addon/src/ngx_http_redis2_handler.o \[m
[31m-	objs/addon/src/ngx_http_redis2_reply.o \[m
[31m-	objs/addon/src/ngx_http_redis2_util.o \[m
[31m-	objs/addon/redis-nginx-module-0.3.7/ngx_http_redis_module.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_processor.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_util.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_output.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_handler.o \[m
[31m-	objs/addon/src/ngx_http_rds_csv_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_rds_csv_processor.o \[m
[31m-	objs/addon/src/ngx_http_rds_csv_util.o \[m
[31m-	objs/addon/src/ngx_http_rds_csv_output.o \[m
[31m-	objs/ngx_modules.o[m
[31m-[m
[31m-	$(LINK) -o objs/nginx \[m
[31m-	objs/src/core/nginx.o \[m
[31m-	objs/src/core/ngx_log.o \[m
[31m-	objs/src/core/ngx_palloc.o \[m
[31m-	objs/src/core/ngx_array.o \[m
[31m-	objs/src/core/ngx_list.o \[m
[31m-	objs/src/core/ngx_hash.o \[m
[31m-	objs/src/core/ngx_buf.o \[m
[31m-	objs/src/core/ngx_queue.o \[m
[31m-	objs/src/core/ngx_output_chain.o \[m
[31m-	objs/src/core/ngx_string.o \[m
[31m-	objs/src/core/ngx_parse.o \[m
[31m-	objs/src/core/ngx_parse_time.o \[m
[31m-	objs/src/core/ngx_inet.o \[m
[31m-	objs/src/core/ngx_file.o \[m
[31m-	objs/src/core/ngx_crc32.o \[m
[31m-	objs/src/core/ngx_murmurhash.o \[m
[31m-	objs/src/core/ngx_md5.o \[m
[31m-	objs/src/core/ngx_rbtree.o \[m
[31m-	objs/src/core/ngx_radix_tree.o \[m
[31m-	objs/src/core/ngx_slab.o \[m
[31m-	objs/src/core/ngx_times.o \[m
[31m-	objs/src/core/ngx_shmtx.o \[m
[31m-	objs/src/core/ngx_connection.o \[m
[31m-	objs/src/core/ngx_cycle.o \[m
[31m-	objs/src/core/ngx_spinlock.o \[m
[31m-	objs/src/core/ngx_rwlock.o \[m
[31m-	objs/src/core/ngx_cpuinfo.o \[m
[31m-	objs/src/core/ngx_conf_file.o \[m
[31m-	objs/src/core/ngx_module.o \[m
[31m-	objs/src/core/ngx_resolver.o \[m
[31m-	objs/src/core/ngx_open_file_cache.o \[m
[31m-	objs/src/core/ngx_crypt.o \[m
[31m-	objs/src/core/ngx_proxy_protocol.o \[m
[31m-	objs/src/core/ngx_syslog.o \[m
[31m-	objs/src/event/ngx_event.o \[m
[31m-	objs/src/event/ngx_event_timer.o \[m
[31m-	objs/src/event/ngx_event_posted.o \[m
[31m-	objs/src/event/ngx_event_accept.o \[m
[31m-	objs/src/event/ngx_event_connect.o \[m
[31m-	objs/src/event/ngx_event_pipe.o \[m
[31m-	objs/src/os/unix/ngx_time.o \[m
[31m-	objs/src/os/unix/ngx_errno.o \[m
[31m-	objs/src/os/unix/ngx_alloc.o \[m
[31m-	objs/src/os/unix/ngx_files.o \[m
[31m-	objs/src/os/unix/ngx_socket.o \[m
[31m-	objs/src/os/unix/ngx_recv.o \[m
[31m-	objs/src/os/unix/ngx_readv_chain.o \[m
[31m-	objs/src/os/unix/ngx_udp_recv.o \[m
[31m-	objs/src/os/unix/ngx_send.o \[m
[31m-	objs/src/os/unix/ngx_writev_chain.o \[m
[31m-	objs/src/os/unix/ngx_udp_send.o \[m
[31m-	objs/src/os/unix/ngx_channel.o \[m
[31m-	objs/src/os/unix/ngx_shmem.o \[m
[31m-	objs/src/os/unix/ngx_process.o \[m
[31m-	objs/src/os/unix/ngx_daemon.o \[m
[31m-	objs/src/os/unix/ngx_setaffinity.o \[m
[31m-	objs/src/os/unix/ngx_setproctitle.o \[m
[31m-	objs/src/os/unix/ngx_posix_init.o \[m
[31m-	objs/src/os/unix/ngx_user.o \[m
[31m-	objs/src/os/unix/ngx_dlopen.o \[m
[31m-	objs/src/os/unix/ngx_process_cycle.o \[m
[31m-	objs/src/os/unix/ngx_linux_init.o \[m
[31m-	objs/src/event/modules/ngx_epoll_module.o \[m
[31m-	objs/src/os/unix/ngx_linux_sendfile_chain.o \[m
[31m-	objs/src/event/ngx_event_openssl.o \[m
[31m-	objs/src/event/ngx_event_openssl_stapling.o \[m
[31m-	objs/src/core/ngx_regex.o \[m
[31m-	objs/src/http/ngx_http.o \[m
[31m-	objs/src/http/ngx_http_core_module.o \[m
[31m-	objs/src/http/ngx_http_special_response.o \[m
[31m-	objs/src/http/ngx_http_request.o \[m
[31m-	objs/src/http/ngx_http_parse.o \[m
[31m-	objs/src/http/modules/ngx_http_log_module.o \[m
[31m-	objs/src/http/ngx_http_request_body.o \[m
[31m-	objs/src/http/ngx_http_variables.o \[m
[31m-	objs/src/http/ngx_http_script.o \[m
[31m-	objs/src/http/ngx_http_upstream.o \[m
[31m-	objs/src/http/ngx_http_upstream_round_robin.o \[m
[31m-	objs/src/http/ngx_http_file_cache.o \[m
[31m-	objs/src/http/ngx_http_write_filter_module.o \[m
[31m-	objs/src/http/ngx_http_header_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_chunked_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_range_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_gzip_filter_module.o \[m
[31m-	objs/src/http/ngx_http_postpone_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_ssi_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_charset_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_userid_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_headers_filter_module.o \[m
[31m-	objs/src/http/ngx_http_copy_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_not_modified_filter_module.o \[m
[31m-	objs/src/http/modules/ngx_http_static_module.o \[m
[31m-	objs/src/http/modules/ngx_http_autoindex_module.o \[m
[31m-	objs/src/http/modules/ngx_http_index_module.o \[m
[31m-	objs/src/http/modules/ngx_http_auth_basic_module.o \[m
[31m-	objs/src/http/modules/ngx_http_access_module.o \[m
[31m-	objs/src/http/modules/ngx_http_limit_conn_module.o \[m
[31m-	objs/src/http/modules/ngx_http_limit_req_module.o \[m
[31m-	objs/src/http/modules/ngx_http_geo_module.o \[m
[31m-	objs/src/http/modules/ngx_http_map_module.o \[m
[31m-	objs/src/http/modules/ngx_http_split_clients_module.o \[m
[31m-	objs/src/http/modules/ngx_http_referer_module.o \[m
[31m-	objs/src/http/modules/ngx_http_rewrite_module.o \[m
[31m-	objs/src/http/modules/ngx_http_ssl_module.o \[m
[31m-	objs/src/http/modules/ngx_http_proxy_module.o \[m
[31m-	objs/src/http/modules/ngx_http_fastcgi_module.o \[m
[31m-	objs/src/http/modules/ngx_http_uwsgi_module.o \[m
[31m-	objs/src/http/modules/ngx_http_scgi_module.o \[m
[31m-	objs/src/http/modules/ngx_http_memcached_module.o \[m
[31m-	objs/src/http/modules/ngx_http_empty_gif_module.o \[m
[31m-	objs/src/http/modules/ngx_http_browser_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_hash_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_ip_hash_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_least_conn_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_keepalive_module.o \[m
[31m-	objs/src/http/modules/ngx_http_upstream_zone_module.o \[m
[31m-	objs/addon/src/ndk.o \[m
[31m-	objs/addon/src/ngx_http_echo_module.o \[m
[31m-	objs/addon/src/ngx_http_echo_util.o \[m
[31m-	objs/addon/src/ngx_http_echo_timer.o \[m
[31m-	objs/addon/src/ngx_http_echo_var.o \[m
[31m-	objs/addon/src/ngx_http_echo_handler.o \[m
[31m-	objs/addon/src/ngx_http_echo_filter.o \[m
[31m-	objs/addon/src/ngx_http_echo_sleep.o \[m
[31m-	objs/addon/src/ngx_http_echo_location.o \[m
[31m-	objs/addon/src/ngx_http_echo_echo.o \[m
[31m-	objs/addon/src/ngx_http_echo_request_info.o \[m
[31m-	objs/addon/src/ngx_http_echo_subrequest.o \[m
[31m-	objs/addon/src/ngx_http_echo_foreach.o \[m
[31m-	objs/addon/src/ngx_http_xss_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_xss_util.o \[m
[31m-	objs/addon/src/ngx_coolkit_handlers.o \[m
[31m-	objs/addon/src/ngx_coolkit_module.o \[m
[31m-	objs/addon/src/ngx_coolkit_variables.o \[m
[31m-	objs/addon/src/ngx_http_set_base32.o \[m
[31m-	objs/addon/src/ngx_http_set_default_value.o \[m
[31m-	objs/addon/src/ngx_http_set_hashed_upstream.o \[m
[31m-	objs/addon/src/ngx_http_set_quote_sql.o \[m
[31m-	objs/addon/src/ngx_http_set_quote_json.o \[m
[31m-	objs/addon/src/ngx_http_set_unescape_uri.o \[m
[31m-	objs/addon/src/ngx_http_set_misc_module.o \[m
[31m-	objs/addon/src/ngx_http_set_escape_uri.o \[m
[31m-	objs/addon/src/ngx_http_set_hash.o \[m
[31m-	objs/addon/src/ngx_http_set_local_today.o \[m
[31m-	objs/addon/src/ngx_http_set_hex.o \[m
[31m-	objs/addon/src/ngx_http_set_base64.o \[m
[31m-	objs/addon/src/ngx_http_set_random.o \[m
[31m-	objs/addon/src/ngx_http_set_secure_random.o \[m
[31m-	objs/addon/src/ngx_http_set_rotate.o \[m
[31m-	objs/addon/src/ngx_http_set_hmac.o \[m
[31m-	objs/addon/src/ngx_http_form_input_module.o \[m
[31m-	objs/addon/src/ngx_http_encrypted_session_module.o \[m
[31m-	objs/addon/src/ngx_http_encrypted_session_cipher.o \[m
[31m-	objs/addon/src/ngx_http_srcache_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_srcache_util.o \[m
[31m-	objs/addon/src/ngx_http_srcache_var.o \[m
[31m-	objs/addon/src/ngx_http_srcache_store.o \[m
[31m-	objs/addon/src/ngx_http_srcache_fetch.o \[m
[31m-	objs/addon/src/ngx_http_srcache_headers.o \[m
[31m-	objs/addon/src/ngx_http_lua_script.o \[m
[31m-	objs/addon/src/ngx_http_lua_log.o \[m
[31m-	objs/addon/src/ngx_http_lua_subrequest.o \[m
[31m-	objs/addon/src/ngx_http_lua_ndk.o \[m
[31m-	objs/addon/src/ngx_http_lua_control.o \[m
[31m-	objs/addon/src/ngx_http_lua_time.o \[m
[31m-	objs/addon/src/ngx_http_lua_misc.o \[m
[31m-	objs/addon/src/ngx_http_lua_variable.o \[m
[31m-	objs/addon/src/ngx_http_lua_string.o \[m
[31m-	objs/addon/src/ngx_http_lua_output.o \[m
[31m-	objs/addon/src/ngx_http_lua_headers.o \[m
[31m-	objs/addon/src/ngx_http_lua_req_body.o \[m
[31m-	objs/addon/src/ngx_http_lua_uri.o \[m
[31m-	objs/addon/src/ngx_http_lua_args.o \[m
[31m-	objs/addon/src/ngx_http_lua_ctx.o \[m
[31m-	objs/addon/src/ngx_http_lua_regex.o \[m
[31m-	objs/addon/src/ngx_http_lua_module.o \[m
[31m-	objs/addon/src/ngx_http_lua_headers_out.o \[m
[31m-	objs/addon/src/ngx_http_lua_headers_in.o \[m
[31m-	objs/addon/src/ngx_http_lua_directive.o \[m
[31m-	objs/addon/src/ngx_http_lua_consts.o \[m
[31m-	objs/addon/src/ngx_http_lua_exception.o \[m
[31m-	objs/addon/src/ngx_http_lua_util.o \[m
[31m-	objs/addon/src/ngx_http_lua_cache.o \[m
[31m-	objs/addon/src/ngx_http_lua_contentby.o \[m
[31m-	objs/addon/src/ngx_http_lua_rewriteby.o \[m
[31m-	objs/addon/src/ngx_http_lua_accessby.o \[m
[31m-	objs/addon/src/ngx_http_lua_setby.o \[m
[31m-	objs/addon/src/ngx_http_lua_capturefilter.o \[m
[31m-	objs/addon/src/ngx_http_lua_clfactory.o \[m
[31m-	objs/addon/src/ngx_http_lua_pcrefix.o \[m
[31m-	objs/addon/src/ngx_http_lua_headerfilterby.o \[m
[31m-	objs/addon/src/ngx_http_lua_shdict.o \[m
[31m-	objs/addon/src/ngx_http_lua_socket_tcp.o \[m
[31m-	objs/addon/src/ngx_http_lua_api.o \[m
[31m-	objs/addon/src/ngx_http_lua_logby.o \[m
[31m-	objs/addon/src/ngx_http_lua_sleep.o \[m
[31m-	objs/addon/src/ngx_http_lua_semaphore.o \[m
[31m-	objs/addon/src/ngx_http_lua_coroutine.o \[m
[31m-	objs/addon/src/ngx_http_lua_bodyfilterby.o \[m
[31m-	objs/addon/src/ngx_http_lua_initby.o \[m
[31m-	objs/addon/src/ngx_http_lua_initworkerby.o \[m
[31m-	objs/addon/src/ngx_http_lua_socket_udp.o \[m
[31m-	objs/addon/src/ngx_http_lua_req_method.o \[m
[31m-	objs/addon/src/ngx_http_lua_phase.o \[m
[31m-	objs/addon/src/ngx_http_lua_uthread.o \[m
[31m-	objs/addon/src/ngx_http_lua_timer.o \[m
[31m-	objs/addon/src/ngx_http_lua_config.o \[m
[31m-	objs/addon/src/ngx_http_lua_worker.o \[m
[31m-	objs/addon/src/ngx_http_lua_ssl_certby.o \[m
[31m-	objs/addon/src/ngx_http_lua_ssl_ocsp.o \[m
[31m-	objs/addon/src/ngx_http_lua_lex.o \[m
[31m-	objs/addon/src/ngx_http_lua_balancer.o \[m
[31m-	objs/addon/src/ngx_http_lua_upstream_module.o \[m
[31m-	objs/addon/src/ngx_http_headers_more_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_headers_more_headers_out.o \[m
[31m-	objs/addon/src/ngx_http_headers_more_headers_in.o \[m
[31m-	objs/addon/src/ngx_http_headers_more_util.o \[m
[31m-	objs/addon/src/ngx_http_array_var_module.o \[m
[31m-	objs/addon/src/ngx_http_array_var_util.o \[m
[31m-	objs/addon/src/ngx_http_memc_module.o \[m
[31m-	objs/addon/src/ngx_http_memc_request.o \[m
[31m-	objs/addon/src/ngx_http_memc_response.o \[m
[31m-	objs/addon/src/ngx_http_memc_util.o \[m
[31m-	objs/addon/src/ngx_http_memc_handler.o \[m
[31m-	objs/addon/src/ngx_http_redis2_module.o \[m
[31m-	objs/addon/src/ngx_http_redis2_handler.o \[m
[31m-	objs/addon/src/ngx_http_redis2_reply.o \[m
[31m-	objs/addon/src/ngx_http_redis2_util.o \[m
[31m-	objs/addon/redis-nginx-module-0.3.7/ngx_http_redis_module.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_processor.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_util.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_output.o \[m
[31m-	objs/addon/src/ngx_http_rds_json_handler.o \[m
[31m-	objs/addon/src/ngx_http_rds_csv_filter_module.o \[m
[31m-	objs/addon/src/ngx_http_rds_csv_processor.o \[m
[31m-	objs/addon/src/ngx_http_rds_csv_util.o \[m
[31m-	objs/addon/src/ngx_http_rds_csv_output.o \[m
[31m-	objs/ngx_modules.o \[m
[31m-	-L/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib -Wl,-rpath,/usr/local/openresty/luajit/lib -Wl,-E -ldl -lpthread -lcrypt -L/home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib -lluajit-5.1 -lm -ldl -lpcre -lssl -lcrypto -ldl -lz \[m
[31m-	-Wl,-E[m
[31m-	[m
[31m-[m
[31m-[m
[31m-modules:[m
[31m-[m
[31m-objs/ngx_modules.o:	$(CORE_DEPS) \[m
[31m-	objs/ngx_modules.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/ngx_modules.o \[m
[31m-		objs/ngx_modules.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/nginx.o:	$(CORE_DEPS) \[m
[31m-	src/core/nginx.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/nginx.o \[m
[31m-		src/core/nginx.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_log.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_log.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_log.o \[m
[31m-		src/core/ngx_log.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_palloc.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_palloc.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_palloc.o \[m
[31m-		src/core/ngx_palloc.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_array.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_array.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_array.o \[m
[31m-		src/core/ngx_array.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_list.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_list.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_list.o \[m
[31m-		src/core/ngx_list.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_hash.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_hash.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_hash.o \[m
[31m-		src/core/ngx_hash.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_buf.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_buf.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_buf.o \[m
[31m-		src/core/ngx_buf.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_queue.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_queue.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_queue.o \[m
[31m-		src/core/ngx_queue.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_output_chain.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_output_chain.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_output_chain.o \[m
[31m-		src/core/ngx_output_chain.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_string.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_string.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_string.o \[m
[31m-		src/core/ngx_string.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_parse.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_parse.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_parse.o \[m
[31m-		src/core/ngx_parse.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_parse_time.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_parse_time.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_parse_time.o \[m
[31m-		src/core/ngx_parse_time.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_inet.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_inet.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_inet.o \[m
[31m-		src/core/ngx_inet.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_file.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_file.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_file.o \[m
[31m-		src/core/ngx_file.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_crc32.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_crc32.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_crc32.o \[m
[31m-		src/core/ngx_crc32.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_murmurhash.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_murmurhash.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_murmurhash.o \[m
[31m-		src/core/ngx_murmurhash.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_md5.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_md5.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_md5.o \[m
[31m-		src/core/ngx_md5.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_rbtree.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_rbtree.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_rbtree.o \[m
[31m-		src/core/ngx_rbtree.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_radix_tree.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_radix_tree.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_radix_tree.o \[m
[31m-		src/core/ngx_radix_tree.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_slab.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_slab.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_slab.o \[m
[31m-		src/core/ngx_slab.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_times.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_times.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_times.o \[m
[31m-		src/core/ngx_times.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_shmtx.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_shmtx.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_shmtx.o \[m
[31m-		src/core/ngx_shmtx.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_connection.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_connection.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_connection.o \[m
[31m-		src/core/ngx_connection.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_cycle.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_cycle.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_cycle.o \[m
[31m-		src/core/ngx_cycle.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_spinlock.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_spinlock.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_spinlock.o \[m
[31m-		src/core/ngx_spinlock.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_rwlock.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_rwlock.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_rwlock.o \[m
[31m-		src/core/ngx_rwlock.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_cpuinfo.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_cpuinfo.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_cpuinfo.o \[m
[31m-		src/core/ngx_cpuinfo.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_conf_file.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_conf_file.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_conf_file.o \[m
[31m-		src/core/ngx_conf_file.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_module.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_module.o \[m
[31m-		src/core/ngx_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_resolver.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_resolver.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_resolver.o \[m
[31m-		src/core/ngx_resolver.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_open_file_cache.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_open_file_cache.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_open_file_cache.o \[m
[31m-		src/core/ngx_open_file_cache.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_crypt.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_crypt.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_crypt.o \[m
[31m-		src/core/ngx_crypt.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_proxy_protocol.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_proxy_protocol.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_proxy_protocol.o \[m
[31m-		src/core/ngx_proxy_protocol.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_syslog.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_syslog.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_syslog.o \[m
[31m-		src/core/ngx_syslog.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/ngx_event.o:	$(CORE_DEPS) \[m
[31m-	src/event/ngx_event.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/ngx_event.o \[m
[31m-		src/event/ngx_event.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/ngx_event_timer.o:	$(CORE_DEPS) \[m
[31m-	src/event/ngx_event_timer.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/ngx_event_timer.o \[m
[31m-		src/event/ngx_event_timer.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/ngx_event_posted.o:	$(CORE_DEPS) \[m
[31m-	src/event/ngx_event_posted.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/ngx_event_posted.o \[m
[31m-		src/event/ngx_event_posted.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/ngx_event_accept.o:	$(CORE_DEPS) \[m
[31m-	src/event/ngx_event_accept.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/ngx_event_accept.o \[m
[31m-		src/event/ngx_event_accept.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/ngx_event_connect.o:	$(CORE_DEPS) \[m
[31m-	src/event/ngx_event_connect.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/ngx_event_connect.o \[m
[31m-		src/event/ngx_event_connect.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/ngx_event_pipe.o:	$(CORE_DEPS) \[m
[31m-	src/event/ngx_event_pipe.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/ngx_event_pipe.o \[m
[31m-		src/event/ngx_event_pipe.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_time.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_time.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_time.o \[m
[31m-		src/os/unix/ngx_time.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_errno.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_errno.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_errno.o \[m
[31m-		src/os/unix/ngx_errno.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_alloc.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_alloc.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_alloc.o \[m
[31m-		src/os/unix/ngx_alloc.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_files.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_files.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_files.o \[m
[31m-		src/os/unix/ngx_files.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_socket.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_socket.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_socket.o \[m
[31m-		src/os/unix/ngx_socket.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_recv.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_recv.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_recv.o \[m
[31m-		src/os/unix/ngx_recv.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_readv_chain.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_readv_chain.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_readv_chain.o \[m
[31m-		src/os/unix/ngx_readv_chain.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_udp_recv.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_udp_recv.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_udp_recv.o \[m
[31m-		src/os/unix/ngx_udp_recv.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_send.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_send.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_send.o \[m
[31m-		src/os/unix/ngx_send.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_writev_chain.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_writev_chain.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_writev_chain.o \[m
[31m-		src/os/unix/ngx_writev_chain.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_udp_send.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_udp_send.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_udp_send.o \[m
[31m-		src/os/unix/ngx_udp_send.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_channel.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_channel.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_channel.o \[m
[31m-		src/os/unix/ngx_channel.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_shmem.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_shmem.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_shmem.o \[m
[31m-		src/os/unix/ngx_shmem.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_process.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_process.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_process.o \[m
[31m-		src/os/unix/ngx_process.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_daemon.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_daemon.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_daemon.o \[m
[31m-		src/os/unix/ngx_daemon.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_setaffinity.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_setaffinity.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_setaffinity.o \[m
[31m-		src/os/unix/ngx_setaffinity.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_setproctitle.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_setproctitle.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_setproctitle.o \[m
[31m-		src/os/unix/ngx_setproctitle.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_posix_init.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_posix_init.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_posix_init.o \[m
[31m-		src/os/unix/ngx_posix_init.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_user.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_user.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_user.o \[m
[31m-		src/os/unix/ngx_user.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_dlopen.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_dlopen.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_dlopen.o \[m
[31m-		src/os/unix/ngx_dlopen.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_process_cycle.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_process_cycle.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_process_cycle.o \[m
[31m-		src/os/unix/ngx_process_cycle.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_linux_init.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_linux_init.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_linux_init.o \[m
[31m-		src/os/unix/ngx_linux_init.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/modules/ngx_epoll_module.o:	$(CORE_DEPS) \[m
[31m-	src/event/modules/ngx_epoll_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/modules/ngx_epoll_module.o \[m
[31m-		src/event/modules/ngx_epoll_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/os/unix/ngx_linux_sendfile_chain.o:	$(CORE_DEPS) \[m
[31m-	src/os/unix/ngx_linux_sendfile_chain.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/os/unix/ngx_linux_sendfile_chain.o \[m
[31m-		src/os/unix/ngx_linux_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/ngx_event_openssl.o:	$(CORE_DEPS) \[m
[31m-	src/event/ngx_event_openssl.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/ngx_event_openssl.o \[m
[31m-		src/event/ngx_event_openssl.c[m
[31m-[m
[31m-[m
[31m-objs/src/event/ngx_event_openssl_stapling.o:	$(CORE_DEPS) \[m
[31m-	src/event/ngx_event_openssl_stapling.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/event/ngx_event_openssl_stapling.o \[m
[31m-		src/event/ngx_event_openssl_stapling.c[m
[31m-[m
[31m-[m
[31m-objs/src/core/ngx_regex.o:	$(CORE_DEPS) \[m
[31m-	src/core/ngx_regex.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) \[m
[31m-		-o objs/src/core/ngx_regex.o \[m
[31m-		src/core/ngx_regex.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http.o \[m
[31m-		src/http/ngx_http.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_core_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_core_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_core_module.o \[m
[31m-		src/http/ngx_http_core_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_special_response.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_special_response.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_special_response.o \[m
[31m-		src/http/ngx_http_special_response.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_request.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_request.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_request.o \[m
[31m-		src/http/ngx_http_request.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_parse.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_parse.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_parse.o \[m
[31m-		src/http/ngx_http_parse.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_log_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_log_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_log_module.o \[m
[31m-		src/http/modules/ngx_http_log_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_request_body.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_request_body.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_request_body.o \[m
[31m-		src/http/ngx_http_request_body.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_variables.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_variables.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_variables.o \[m
[31m-		src/http/ngx_http_variables.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_script.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_script.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_script.o \[m
[31m-		src/http/ngx_http_script.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_upstream.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_upstream.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_upstream.o \[m
[31m-		src/http/ngx_http_upstream.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_upstream_round_robin.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_upstream_round_robin.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_upstream_round_robin.o \[m
[31m-		src/http/ngx_http_upstream_round_robin.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_file_cache.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_file_cache.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_file_cache.o \[m
[31m-		src/http/ngx_http_file_cache.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_write_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_write_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_write_filter_module.o \[m
[31m-		src/http/ngx_http_write_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_header_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_header_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_header_filter_module.o \[m
[31m-		src/http/ngx_http_header_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_chunked_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_chunked_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_chunked_filter_module.o \[m
[31m-		src/http/modules/ngx_http_chunked_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_range_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_range_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_range_filter_module.o \[m
[31m-		src/http/modules/ngx_http_range_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_gzip_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_gzip_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_gzip_filter_module.o \[m
[31m-		src/http/modules/ngx_http_gzip_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_postpone_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_postpone_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_postpone_filter_module.o \[m
[31m-		src/http/ngx_http_postpone_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_ssi_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_ssi_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_ssi_filter_module.o \[m
[31m-		src/http/modules/ngx_http_ssi_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_charset_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_charset_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_charset_filter_module.o \[m
[31m-		src/http/modules/ngx_http_charset_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_userid_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_userid_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_userid_filter_module.o \[m
[31m-		src/http/modules/ngx_http_userid_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_headers_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_headers_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_headers_filter_module.o \[m
[31m-		src/http/modules/ngx_http_headers_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/ngx_http_copy_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/ngx_http_copy_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/ngx_http_copy_filter_module.o \[m
[31m-		src/http/ngx_http_copy_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_not_modified_filter_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_not_modified_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_not_modified_filter_module.o \[m
[31m-		src/http/modules/ngx_http_not_modified_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_static_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_static_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_static_module.o \[m
[31m-		src/http/modules/ngx_http_static_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_autoindex_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_autoindex_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_autoindex_module.o \[m
[31m-		src/http/modules/ngx_http_autoindex_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_index_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_index_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_index_module.o \[m
[31m-		src/http/modules/ngx_http_index_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_auth_basic_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_auth_basic_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_auth_basic_module.o \[m
[31m-		src/http/modules/ngx_http_auth_basic_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_access_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_access_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_access_module.o \[m
[31m-		src/http/modules/ngx_http_access_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_limit_conn_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_limit_conn_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_limit_conn_module.o \[m
[31m-		src/http/modules/ngx_http_limit_conn_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_limit_req_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_limit_req_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_limit_req_module.o \[m
[31m-		src/http/modules/ngx_http_limit_req_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_geo_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_geo_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_geo_module.o \[m
[31m-		src/http/modules/ngx_http_geo_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_map_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_map_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_map_module.o \[m
[31m-		src/http/modules/ngx_http_map_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_split_clients_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_split_clients_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_split_clients_module.o \[m
[31m-		src/http/modules/ngx_http_split_clients_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_referer_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_referer_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_referer_module.o \[m
[31m-		src/http/modules/ngx_http_referer_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_rewrite_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_rewrite_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_rewrite_module.o \[m
[31m-		src/http/modules/ngx_http_rewrite_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_ssl_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_ssl_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_ssl_module.o \[m
[31m-		src/http/modules/ngx_http_ssl_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_proxy_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_proxy_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_proxy_module.o \[m
[31m-		src/http/modules/ngx_http_proxy_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_fastcgi_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_fastcgi_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_fastcgi_module.o \[m
[31m-		src/http/modules/ngx_http_fastcgi_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_uwsgi_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_uwsgi_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_uwsgi_module.o \[m
[31m-		src/http/modules/ngx_http_uwsgi_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_scgi_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_scgi_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_scgi_module.o \[m
[31m-		src/http/modules/ngx_http_scgi_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_memcached_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_memcached_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_memcached_module.o \[m
[31m-		src/http/modules/ngx_http_memcached_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_empty_gif_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_empty_gif_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_empty_gif_module.o \[m
[31m-		src/http/modules/ngx_http_empty_gif_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_browser_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_browser_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_browser_module.o \[m
[31m-		src/http/modules/ngx_http_browser_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_upstream_hash_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_upstream_hash_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_upstream_hash_module.o \[m
[31m-		src/http/modules/ngx_http_upstream_hash_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_upstream_ip_hash_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_upstream_ip_hash_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_upstream_ip_hash_module.o \[m
[31m-		src/http/modules/ngx_http_upstream_ip_hash_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_upstream_least_conn_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_upstream_least_conn_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_upstream_least_conn_module.o \[m
[31m-		src/http/modules/ngx_http_upstream_least_conn_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_upstream_keepalive_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_upstream_keepalive_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_upstream_keepalive_module.o \[m
[31m-		src/http/modules/ngx_http_upstream_keepalive_module.c[m
[31m-[m
[31m-[m
[31m-objs/src/http/modules/ngx_http_upstream_zone_module.o:	$(CORE_DEPS) $(HTTP_DEPS) \[m
[31m-	src/http/modules/ngx_http_upstream_zone_module.c[m
[31m-	$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \[m
[31m-		-o objs/src/http/modules/ngx_http_upstream_zone_module.o \[m
[31m-		src/http/modules/ngx_http_upstream_zone_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ndk.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_devel_kit-0.3.0/src/ndk.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ndk.o \[m
[31m-		../ngx_devel_kit-0.3.0/src/ndk.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_module.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_module.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_util.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_util.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_timer.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_timer.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_timer.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_timer.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_var.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_var.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_var.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_var.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_handler.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_handler.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_handler.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_handler.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_filter.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_filter.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_filter.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_filter.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_sleep.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_sleep.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_sleep.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_sleep.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_location.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_location.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_location.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_location.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_echo.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_echo.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_echo.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_echo.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_request_info.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_request_info.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_request_info.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_request_info.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_subrequest.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_subrequest.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_subrequest.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_subrequest.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_echo_foreach.o:	$(ADDON_DEPS) \[m
[31m-	../echo-nginx-module-0.59/src/ngx_http_echo_foreach.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_echo_foreach.o \[m
[31m-		../echo-nginx-module-0.59/src/ngx_http_echo_foreach.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_xss_filter_module.o:	$(ADDON_DEPS) \[m
[31m-	../xss-nginx-module-0.05/src/ngx_http_xss_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_xss_filter_module.o \[m
[31m-		../xss-nginx-module-0.05/src/ngx_http_xss_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_xss_util.o:	$(ADDON_DEPS) \[m
[31m-	../xss-nginx-module-0.05/src/ngx_http_xss_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_xss_util.o \[m
[31m-		../xss-nginx-module-0.05/src/ngx_http_xss_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_coolkit_handlers.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_coolkit_handlers.o \[m
[31m-		../ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_coolkit_module.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_coolkit-0.2rc3/src/ngx_coolkit_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_coolkit_module.o \[m
[31m-		../ngx_coolkit-0.2rc3/src/ngx_coolkit_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_coolkit_variables.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_coolkit_variables.o \[m
[31m-		../ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_base32.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_base32.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_base32.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_base32.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_default_value.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_default_value.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_default_value.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_default_value.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_hashed_upstream.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_hashed_upstream.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_quote_sql.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_quote_sql.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_quote_json.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_quote_json.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_unescape_uri.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_unescape_uri.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_misc_module.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_misc_module.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_escape_uri.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_escape_uri.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_hash.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_hash.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_hash.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_hash.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_local_today.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_local_today.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_local_today.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_local_today.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_hex.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_hex.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_hex.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_hex.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_base64.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_base64.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_base64.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_base64.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_random.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_random.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_random.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_random.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_secure_random.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_secure_random.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_rotate.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_rotate.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_rotate.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_rotate.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_set_hmac.o:	$(ADDON_DEPS) \[m
[31m-	../set-misc-nginx-module-0.30/src/ngx_http_set_hmac.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_set_hmac.o \[m
[31m-		../set-misc-nginx-module-0.30/src/ngx_http_set_hmac.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_form_input_module.o:	$(ADDON_DEPS) \[m
[31m-	../form-input-nginx-module-0.12/src/ngx_http_form_input_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_form_input_module.o \[m
[31m-		../form-input-nginx-module-0.12/src/ngx_http_form_input_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_encrypted_session_module.o:	$(ADDON_DEPS) \[m
[31m-	../encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_encrypted_session_module.o \[m
[31m-		../encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_encrypted_session_cipher.o:	$(ADDON_DEPS) \[m
[31m-	../encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_encrypted_session_cipher.o \[m
[31m-		../encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_srcache_filter_module.o:	$(ADDON_DEPS) \[m
[31m-	../srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_srcache_filter_module.o \[m
[31m-		../srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_srcache_util.o:	$(ADDON_DEPS) \[m
[31m-	../srcache-nginx-module-0.31/src/ngx_http_srcache_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_srcache_util.o \[m
[31m-		../srcache-nginx-module-0.31/src/ngx_http_srcache_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_srcache_var.o:	$(ADDON_DEPS) \[m
[31m-	../srcache-nginx-module-0.31/src/ngx_http_srcache_var.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_srcache_var.o \[m
[31m-		../srcache-nginx-module-0.31/src/ngx_http_srcache_var.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_srcache_store.o:	$(ADDON_DEPS) \[m
[31m-	../srcache-nginx-module-0.31/src/ngx_http_srcache_store.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_srcache_store.o \[m
[31m-		../srcache-nginx-module-0.31/src/ngx_http_srcache_store.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_srcache_fetch.o:	$(ADDON_DEPS) \[m
[31m-	../srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_srcache_fetch.o \[m
[31m-		../srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_srcache_headers.o:	$(ADDON_DEPS) \[m
[31m-	../srcache-nginx-module-0.31/src/ngx_http_srcache_headers.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_srcache_headers.o \[m
[31m-		../srcache-nginx-module-0.31/src/ngx_http_srcache_headers.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_script.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_script.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_script.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_script.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_log.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_log.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_log.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_log.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_subrequest.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_subrequest.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_subrequest.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_subrequest.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_ndk.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_ndk.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_ndk.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_ndk.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_control.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_control.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_control.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_control.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_time.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_time.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_time.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_time.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_misc.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_misc.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_misc.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_misc.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_variable.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_variable.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_variable.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_variable.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_string.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_string.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_string.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_string.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_output.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_output.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_output.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_output.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_headers.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_headers.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_headers.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_headers.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_req_body.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_req_body.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_req_body.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_req_body.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_uri.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_uri.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_uri.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_uri.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_args.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_args.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_args.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_args.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_ctx.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_ctx.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_ctx.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_ctx.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_regex.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_regex.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_regex.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_regex.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_module.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_module.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_headers_out.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_headers_out.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_headers_out.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_headers_out.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_headers_in.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_headers_in.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_headers_in.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_headers_in.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_directive.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_directive.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_directive.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_directive.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_consts.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_consts.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_consts.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_consts.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_exception.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_exception.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_exception.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_exception.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_util.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_util.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_cache.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_cache.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_cache.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_cache.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_contentby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_contentby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_contentby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_contentby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_rewriteby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_rewriteby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_accessby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_accessby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_accessby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_accessby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_setby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_setby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_setby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_setby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_capturefilter.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_capturefilter.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_clfactory.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_clfactory.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_clfactory.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_clfactory.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_pcrefix.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_pcrefix.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_headerfilterby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_headerfilterby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_shdict.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_shdict.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_shdict.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_shdict.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_socket_tcp.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_socket_tcp.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_api.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_api.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_api.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_api.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_logby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_logby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_logby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_logby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_sleep.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_sleep.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_sleep.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_sleep.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_semaphore.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_semaphore.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_semaphore.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_semaphore.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_coroutine.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_coroutine.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_coroutine.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_coroutine.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_bodyfilterby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_bodyfilterby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_initby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_initby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_initby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_initby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_initworkerby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_initworkerby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_socket_udp.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_socket_udp.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_req_method.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_req_method.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_req_method.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_req_method.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_phase.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_phase.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_phase.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_phase.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_uthread.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_uthread.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_uthread.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_uthread.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_timer.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_timer.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_timer.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_timer.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_config.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_config.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_config.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_config.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_worker.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_worker.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_worker.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_worker.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_ssl_certby.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_ssl_certby.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_ssl_ocsp.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_ssl_ocsp.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_ssl_ocsp.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_ssl_ocsp.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_lex.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_lex.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_lex.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_lex.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_balancer.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua-0.10.5/src/ngx_http_lua_balancer.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_balancer.o \[m
[31m-		../ngx_lua-0.10.5/src/ngx_http_lua_balancer.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_lua_upstream_module.o:	$(ADDON_DEPS) \[m
[31m-	../ngx_lua_upstream-0.05/src/ngx_http_lua_upstream_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_lua_upstream_module.o \[m
[31m-		../ngx_lua_upstream-0.05/src/ngx_http_lua_upstream_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_headers_more_filter_module.o:	$(ADDON_DEPS) \[m
[31m-	../headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_headers_more_filter_module.o \[m
[31m-		../headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_headers_more_headers_out.o:	$(ADDON_DEPS) \[m
[31m-	../headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_headers_more_headers_out.o \[m
[31m-		../headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_headers_more_headers_in.o:	$(ADDON_DEPS) \[m
[31m-	../headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_headers_more_headers_in.o \[m
[31m-		../headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_headers_more_util.o:	$(ADDON_DEPS) \[m
[31m-	../headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_headers_more_util.o \[m
[31m-		../headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_array_var_module.o:	$(ADDON_DEPS) \[m
[31m-	../array-var-nginx-module-0.05/src/ngx_http_array_var_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_array_var_module.o \[m
[31m-		../array-var-nginx-module-0.05/src/ngx_http_array_var_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_array_var_util.o:	$(ADDON_DEPS) \[m
[31m-	../array-var-nginx-module-0.05/src/ngx_http_array_var_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_array_var_util.o \[m
[31m-		../array-var-nginx-module-0.05/src/ngx_http_array_var_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_memc_module.o:	$(ADDON_DEPS) \[m
[31m-	../memc-nginx-module-0.17/src/ngx_http_memc_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_memc_module.o \[m
[31m-		../memc-nginx-module-0.17/src/ngx_http_memc_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_memc_request.o:	$(ADDON_DEPS) \[m
[31m-	../memc-nginx-module-0.17/src/ngx_http_memc_request.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_memc_request.o \[m
[31m-		../memc-nginx-module-0.17/src/ngx_http_memc_request.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_memc_response.o:	$(ADDON_DEPS) \[m
[31m-	../memc-nginx-module-0.17/src/ngx_http_memc_response.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_memc_response.o \[m
[31m-		../memc-nginx-module-0.17/src/ngx_http_memc_response.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_memc_util.o:	$(ADDON_DEPS) \[m
[31m-	../memc-nginx-module-0.17/src/ngx_http_memc_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_memc_util.o \[m
[31m-		../memc-nginx-module-0.17/src/ngx_http_memc_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_memc_handler.o:	$(ADDON_DEPS) \[m
[31m-	../memc-nginx-module-0.17/src/ngx_http_memc_handler.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_memc_handler.o \[m
[31m-		../memc-nginx-module-0.17/src/ngx_http_memc_handler.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_redis2_module.o:	$(ADDON_DEPS) \[m
[31m-	../redis2-nginx-module-0.13/src/ngx_http_redis2_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_redis2_module.o \[m
[31m-		../redis2-nginx-module-0.13/src/ngx_http_redis2_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_redis2_handler.o:	$(ADDON_DEPS) \[m
[31m-	../redis2-nginx-module-0.13/src/ngx_http_redis2_handler.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_redis2_handler.o \[m
[31m-		../redis2-nginx-module-0.13/src/ngx_http_redis2_handler.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_redis2_reply.o:	$(ADDON_DEPS) \[m
[31m-	../redis2-nginx-module-0.13/src/ngx_http_redis2_reply.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_redis2_reply.o \[m
[31m-		../redis2-nginx-module-0.13/src/ngx_http_redis2_reply.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_redis2_util.o:	$(ADDON_DEPS) \[m
[31m-	../redis2-nginx-module-0.13/src/ngx_http_redis2_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_redis2_util.o \[m
[31m-		../redis2-nginx-module-0.13/src/ngx_http_redis2_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/redis-nginx-module-0.3.7/ngx_http_redis_module.o:	$(ADDON_DEPS) \[m
[31m-	../redis-nginx-module-0.3.7/ngx_http_redis_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/redis-nginx-module-0.3.7/ngx_http_redis_module.o \[m
[31m-		../redis-nginx-module-0.3.7/ngx_http_redis_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_json_filter_module.o:	$(ADDON_DEPS) \[m
[31m-	../rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_json_filter_module.o \[m
[31m-		../rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_json_processor.o:	$(ADDON_DEPS) \[m
[31m-	../rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_json_processor.o \[m
[31m-		../rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_json_util.o:	$(ADDON_DEPS) \[m
[31m-	../rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_json_util.o \[m
[31m-		../rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_json_output.o:	$(ADDON_DEPS) \[m
[31m-	../rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_json_output.o \[m
[31m-		../rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_json_handler.o:	$(ADDON_DEPS) \[m
[31m-	../rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_json_handler.o \[m
[31m-		../rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_csv_filter_module.o:	$(ADDON_DEPS) \[m
[31m-	../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_csv_filter_module.o \[m
[31m-		../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_csv_processor.o:	$(ADDON_DEPS) \[m
[31m-	../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_csv_processor.o \[m
[31m-		../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_csv_util.o:	$(ADDON_DEPS) \[m
[31m-	../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_csv_util.o \[m
[31m-		../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.c[m
[31m-[m
[31m-[m
[31m-objs/addon/src/ngx_http_rds_csv_output.o:	$(ADDON_DEPS) \[m
[31m-	../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.c[m
[31m-	$(CC) -c $(CFLAGS)  $(ALL_INCS) \[m
[31m-		-o objs/addon/src/ngx_http_rds_csv_output.o \[m
[31m-		../rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.c[m
[31m-[m
[31m-[m
[31m-manpage:	objs/nginx.8[m
[31m-[m
[31m-objs/nginx.8:	docs/man/nginx.8 objs/ngx_auto_config.h[m
[31m-	sed -e "s|%%PREFIX%%|/usr/local/openresty/nginx|" \[m
[31m-		-e "s|%%PID_PATH%%|/usr/local/openresty/nginx/logs/nginx.pid|" \[m
[31m-		-e "s|%%CONF_PATH%%|/usr/local/openresty/nginx/conf/nginx.conf|" \[m
[31m-		-e "s|%%ERROR_LOG_PATH%%|/usr/local/openresty/nginx/logs/error.log|" \[m
[31m-		< docs/man/nginx.8 > $@[m
[31m-[m
[31m-install:	build [m
[31m-	test -d '$(DESTDIR)/usr/local/openresty/nginx' || mkdir -p '$(DESTDIR)/usr/local/openresty/nginx'[m
[31m-[m
[31m-	test -d '$(DESTDIR)/usr/local/openresty/nginx/sbin' \[m
[31m-		|| mkdir -p '$(DESTDIR)/usr/local/openresty/nginx/sbin'[m
[31m-	test ! -f '$(DESTDIR)/usr/local/openresty/nginx/sbin/nginx' \[m
[31m-		|| mv '$(DESTDIR)/usr/local/openresty/nginx/sbin/nginx' \[m
[31m-			'$(DESTDIR)/usr/local/openresty/nginx/sbin/nginx.old'[m
[31m-	cp objs/nginx '$(DESTDIR)/usr/local/openresty/nginx/sbin/nginx'[m
[31m-[m
[31m-	test -d '$(DESTDIR)/usr/local/openresty/nginx/conf' \[m
[31m-		|| mkdir -p '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-[m
[31m-	cp conf/koi-win '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-	cp conf/koi-utf '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-	cp conf/win-utf '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-[m
[31m-	test -f '$(DESTDIR)/usr/local/openresty/nginx/conf/mime.types' \[m
[31m-		|| cp conf/mime.types '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-	cp conf/mime.types '$(DESTDIR)/usr/local/openresty/nginx/conf/mime.types.default'[m
[31m-[m
[31m-	test -f '$(DESTDIR)/usr/local/openresty/nginx/conf/fastcgi_params' \[m
[31m-		|| cp conf/fastcgi_params '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-	cp conf/fastcgi_params \[m
[31m-		'$(DESTDIR)/usr/local/openresty/nginx/conf/fastcgi_params.default'[m
[31m-[m
[31m-	test -f '$(DESTDIR)/usr/local/openresty/nginx/conf/fastcgi.conf' \[m
[31m-		|| cp conf/fastcgi.conf '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-	cp conf/fastcgi.conf '$(DESTDIR)/usr/local/openresty/nginx/conf/fastcgi.conf.default'[m
[31m-[m
[31m-	test -f '$(DESTDIR)/usr/local/openresty/nginx/conf/uwsgi_params' \[m
[31m-		|| cp conf/uwsgi_params '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-	cp conf/uwsgi_params \[m
[31m-		'$(DESTDIR)/usr/local/openresty/nginx/conf/uwsgi_params.default'[m
[31m-[m
[31m-	test -f '$(DESTDIR)/usr/local/openresty/nginx/conf/scgi_params' \[m
[31m-		|| cp conf/scgi_params '$(DESTDIR)/usr/local/openresty/nginx/conf'[m
[31m-	cp conf/scgi_params \[m
[31m-		'$(DESTDIR)/usr/local/openresty/nginx/conf/scgi_params.default'[m
[31m-[m
[31m-	test -f '$(DESTDIR)/usr/local/openresty/nginx/conf/nginx.conf' \[m
[31m-		|| cp conf/nginx.conf '$(DESTDIR)/usr/local/openresty/nginx/conf/nginx.conf'[m
[31m-	cp conf/nginx.conf '$(DESTDIR)/usr/local/openresty/nginx/conf/nginx.conf.default'[m
[31m-[m
[31m-	test -d '$(DESTDIR)/usr/local/openresty/nginx/logs' \[m
[31m-		|| mkdir -p '$(DESTDIR)/usr/local/openresty/nginx/logs'[m
[31m-[m
[31m-	test -d '$(DESTDIR)/usr/local/openresty/nginx/logs' \[m
[31m-		|| mkdir -p '$(DESTDIR)/usr/local/openresty/nginx/logs'[m
[31m-[m
[31m-	test -d '$(DESTDIR)/usr/local/openresty/nginx/html' \[m
[31m-		|| cp -R docs/html '$(DESTDIR)/usr/local/openresty/nginx'[m
[31m-[m
[31m-	test -d '$(DESTDIR)/usr/local/openresty/nginx/logs' \[m
[31m-		|| mkdir -p '$(DESTDIR)/usr/local/openresty/nginx/logs'[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/redis-nginx-module-0.3.7/ngx_http_redis_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/redis-nginx-module-0.3.7/ngx_http_redis_module.o[m
[1mdeleted file mode 100644[m
[1mindex 986c445..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/redis-nginx-module-0.3.7/ngx_http_redis_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ndk.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ndk.o[m
[1mdeleted file mode 100644[m
[1mindex d4e9c8d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ndk.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_handlers.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_handlers.o[m
[1mdeleted file mode 100644[m
[1mindex 8dde06a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_handlers.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_module.o[m
[1mdeleted file mode 100644[m
[1mindex 8988f99..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_variables.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_variables.o[m
[1mdeleted file mode 100644[m
[1mindex 27beb52..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_coolkit_variables.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_array_var_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_array_var_module.o[m
[1mdeleted file mode 100644[m
[1mindex 20e6759..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_array_var_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_array_var_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_array_var_util.o[m
[1mdeleted file mode 100644[m
[1mindex 1e5ea02..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_array_var_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_echo.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_echo.o[m
[1mdeleted file mode 100644[m
[1mindex 8f79f10..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_echo.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_filter.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_filter.o[m
[1mdeleted file mode 100644[m
[1mindex 1c21322..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_filter.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_foreach.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_foreach.o[m
[1mdeleted file mode 100644[m
[1mindex 8f4d057..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_foreach.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_handler.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_handler.o[m
[1mdeleted file mode 100644[m
[1mindex 83c38bc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_handler.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_location.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_location.o[m
[1mdeleted file mode 100644[m
[1mindex ccce10c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_location.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_module.o[m
[1mdeleted file mode 100644[m
[1mindex 088a5cc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_request_info.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_request_info.o[m
[1mdeleted file mode 100644[m
[1mindex 7a3445a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_request_info.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_sleep.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_sleep.o[m
[1mdeleted file mode 100644[m
[1mindex 2a875b8..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_sleep.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_subrequest.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_subrequest.o[m
[1mdeleted file mode 100644[m
[1mindex 3a4cfac..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_subrequest.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_timer.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_timer.o[m
[1mdeleted file mode 100644[m
[1mindex 09bfcc2..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_timer.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_util.o[m
[1mdeleted file mode 100644[m
[1mindex 9199db4..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_var.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_var.o[m
[1mdeleted file mode 100644[m
[1mindex 0f33bd3..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_echo_var.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_encrypted_session_cipher.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_encrypted_session_cipher.o[m
[1mdeleted file mode 100644[m
[1mindex 5b47f00..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_encrypted_session_cipher.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_encrypted_session_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_encrypted_session_module.o[m
[1mdeleted file mode 100644[m
[1mindex e80799f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_encrypted_session_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_form_input_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_form_input_module.o[m
[1mdeleted file mode 100644[m
[1mindex 329129a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_form_input_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 8d47f14..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_headers_in.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_headers_in.o[m
[1mdeleted file mode 100644[m
[1mindex d549672..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_headers_in.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_headers_out.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_headers_out.o[m
[1mdeleted file mode 100644[m
[1mindex ea802b8..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_headers_out.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_util.o[m
[1mdeleted file mode 100644[m
[1mindex 568a092..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_headers_more_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_accessby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_accessby.o[m
[1mdeleted file mode 100644[m
[1mindex 212d969..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_accessby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_api.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_api.o[m
[1mdeleted file mode 100644[m
[1mindex 473f962..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_api.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_args.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_args.o[m
[1mdeleted file mode 100644[m
[1mindex 12fe0c0..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_args.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_balancer.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_balancer.o[m
[1mdeleted file mode 100644[m
[1mindex 6992a55..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_balancer.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_bodyfilterby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_bodyfilterby.o[m
[1mdeleted file mode 100644[m
[1mindex c536a50..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_bodyfilterby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_cache.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_cache.o[m
[1mdeleted file mode 100644[m
[1mindex 7a6e35a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_cache.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_capturefilter.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_capturefilter.o[m
[1mdeleted file mode 100644[m
[1mindex fc2a2c1..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_capturefilter.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_clfactory.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_clfactory.o[m
[1mdeleted file mode 100644[m
[1mindex f2a9210..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_clfactory.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_config.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_config.o[m
[1mdeleted file mode 100644[m
[1mindex 720cf1c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_config.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_consts.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_consts.o[m
[1mdeleted file mode 100644[m
[1mindex 6a37602..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_consts.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_contentby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_contentby.o[m
[1mdeleted file mode 100644[m
[1mindex 3285b2d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_contentby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_control.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_control.o[m
[1mdeleted file mode 100644[m
[1mindex feb5c9c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_control.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_coroutine.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_coroutine.o[m
[1mdeleted file mode 100644[m
[1mindex e693c7b..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_coroutine.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ctx.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ctx.o[m
[1mdeleted file mode 100644[m
[1mindex fb729e5..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ctx.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_directive.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_directive.o[m
[1mdeleted file mode 100644[m
[1mindex 02ab068..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_directive.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_exception.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_exception.o[m
[1mdeleted file mode 100644[m
[1mindex 40bce0c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_exception.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headerfilterby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headerfilterby.o[m
[1mdeleted file mode 100644[m
[1mindex 8d25fc9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headerfilterby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers.o[m
[1mdeleted file mode 100644[m
[1mindex d5f007e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers_in.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers_in.o[m
[1mdeleted file mode 100644[m
[1mindex b9a63ef..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers_in.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers_out.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers_out.o[m
[1mdeleted file mode 100644[m
[1mindex 7fa296d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_headers_out.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_initby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_initby.o[m
[1mdeleted file mode 100644[m
[1mindex 6b8af10..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_initby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_initworkerby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_initworkerby.o[m
[1mdeleted file mode 100644[m
[1mindex 095345f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_initworkerby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_lex.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_lex.o[m
[1mdeleted file mode 100644[m
[1mindex 823bc84..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_lex.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_log.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_log.o[m
[1mdeleted file mode 100644[m
[1mindex a423fb6..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_log.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_logby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_logby.o[m
[1mdeleted file mode 100644[m
[1mindex 734a055..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_logby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_misc.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_misc.o[m
[1mdeleted file mode 100644[m
[1mindex 9ed3154..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_misc.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_module.o[m
[1mdeleted file mode 100644[m
[1mindex 5b246b7..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ndk.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ndk.o[m
[1mdeleted file mode 100644[m
[1mindex 2f32095..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ndk.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_output.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_output.o[m
[1mdeleted file mode 100644[m
[1mindex cc40fcf..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_output.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_pcrefix.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_pcrefix.o[m
[1mdeleted file mode 100644[m
[1mindex 72fae0d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_pcrefix.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_phase.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_phase.o[m
[1mdeleted file mode 100644[m
[1mindex 96fe52f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_phase.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_regex.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_regex.o[m
[1mdeleted file mode 100644[m
[1mindex 38012a4..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_regex.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_req_body.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_req_body.o[m
[1mdeleted file mode 100644[m
[1mindex c33ae69..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_req_body.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_req_method.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_req_method.o[m
[1mdeleted file mode 100644[m
[1mindex 7bd2b3a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_req_method.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_rewriteby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_rewriteby.o[m
[1mdeleted file mode 100644[m
[1mindex 16bdb38..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_rewriteby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_script.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_script.o[m
[1mdeleted file mode 100644[m
[1mindex e6b72c6..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_script.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_semaphore.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_semaphore.o[m
[1mdeleted file mode 100644[m
[1mindex 6537e81..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_semaphore.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_setby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_setby.o[m
[1mdeleted file mode 100644[m
[1mindex 7f9c282..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_setby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_shdict.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_shdict.o[m
[1mdeleted file mode 100644[m
[1mindex 9c96987..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_shdict.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_sleep.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_sleep.o[m
[1mdeleted file mode 100644[m
[1mindex 0120e5d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_sleep.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_socket_tcp.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_socket_tcp.o[m
[1mdeleted file mode 100644[m
[1mindex ba86522..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_socket_tcp.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_socket_udp.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_socket_udp.o[m
[1mdeleted file mode 100644[m
[1mindex 0bb3450..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_socket_udp.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ssl_certby.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ssl_certby.o[m
[1mdeleted file mode 100644[m
[1mindex 8532bfd..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ssl_certby.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ssl_ocsp.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ssl_ocsp.o[m
[1mdeleted file mode 100644[m
[1mindex 9e5a72d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_ssl_ocsp.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_string.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_string.o[m
[1mdeleted file mode 100644[m
[1mindex b2c5e58..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_string.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_subrequest.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_subrequest.o[m
[1mdeleted file mode 100644[m
[1mindex eecc2c7..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_subrequest.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_time.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_time.o[m
[1mdeleted file mode 100644[m
[1mindex fab7a10..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_time.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_timer.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_timer.o[m
[1mdeleted file mode 100644[m
[1mindex 0e65e64..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_timer.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_upstream_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_upstream_module.o[m
[1mdeleted file mode 100644[m
[1mindex 5188cdd..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_upstream_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_uri.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_uri.o[m
[1mdeleted file mode 100644[m
[1mindex 0a3fd7d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_uri.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_uthread.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_uthread.o[m
[1mdeleted file mode 100644[m
[1mindex 3db8abe..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_uthread.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_util.o[m
[1mdeleted file mode 100644[m
[1mindex bb3d68b..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_variable.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_variable.o[m
[1mdeleted file mode 100644[m
[1mindex abffc2e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_variable.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_worker.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_worker.o[m
[1mdeleted file mode 100644[m
[1mindex 047b072..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_lua_worker.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_handler.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_handler.o[m
[1mdeleted file mode 100644[m
[1mindex 2789747..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_handler.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_module.o[m
[1mdeleted file mode 100644[m
[1mindex cdfb601..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_request.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_request.o[m
[1mdeleted file mode 100644[m
[1mindex 66671e2..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_request.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_response.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_response.o[m
[1mdeleted file mode 100644[m
[1mindex cf00807..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_response.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_util.o[m
[1mdeleted file mode 100644[m
[1mindex e672dae..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_memc_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 10720c1..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_output.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_output.o[m
[1mdeleted file mode 100644[m
[1mindex bc1b11b..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_output.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_processor.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_processor.o[m
[1mdeleted file mode 100644[m
[1mindex 0d53de4..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_processor.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_util.o[m
[1mdeleted file mode 100644[m
[1mindex cc4b159..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_csv_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 5bcf563..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_handler.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_handler.o[m
[1mdeleted file mode 100644[m
[1mindex 28e7b98..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_handler.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_output.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_output.o[m
[1mdeleted file mode 100644[m
[1mindex 9ebf21f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_output.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_processor.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_processor.o[m
[1mdeleted file mode 100644[m
[1mindex 10ff31f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_processor.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_util.o[m
[1mdeleted file mode 100644[m
[1mindex a2c2839..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_rds_json_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_handler.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_handler.o[m
[1mdeleted file mode 100644[m
[1mindex 72f7b4e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_handler.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_module.o[m
[1mdeleted file mode 100644[m
[1mindex 976d6ba..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_reply.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_reply.o[m
[1mdeleted file mode 100644[m
[1mindex 4d6a9c3..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_reply.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_util.o[m
[1mdeleted file mode 100644[m
[1mindex 9ff0e4e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_redis2_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_base32.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_base32.o[m
[1mdeleted file mode 100644[m
[1mindex aa6bf72..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_base32.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_base64.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_base64.o[m
[1mdeleted file mode 100644[m
[1mindex 04caabb..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_base64.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_default_value.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_default_value.o[m
[1mdeleted file mode 100644[m
[1mindex 1dd3989..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_default_value.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_escape_uri.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_escape_uri.o[m
[1mdeleted file mode 100644[m
[1mindex 09bf9b5..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_escape_uri.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hash.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hash.o[m
[1mdeleted file mode 100644[m
[1mindex ae7349b..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hash.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hashed_upstream.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hashed_upstream.o[m
[1mdeleted file mode 100644[m
[1mindex 537c87b..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hashed_upstream.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hex.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hex.o[m
[1mdeleted file mode 100644[m
[1mindex 3ff431f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hex.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hmac.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hmac.o[m
[1mdeleted file mode 100644[m
[1mindex 37873cc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_hmac.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_local_today.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_local_today.o[m
[1mdeleted file mode 100644[m
[1mindex c17ae2e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_local_today.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_misc_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_misc_module.o[m
[1mdeleted file mode 100644[m
[1mindex 3416300..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_misc_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_quote_json.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_quote_json.o[m
[1mdeleted file mode 100644[m
[1mindex d5abff8..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_quote_json.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_quote_sql.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_quote_sql.o[m
[1mdeleted file mode 100644[m
[1mindex 055c09e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_quote_sql.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_random.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_random.o[m
[1mdeleted file mode 100644[m
[1mindex 20d54d9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_random.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_rotate.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_rotate.o[m
[1mdeleted file mode 100644[m
[1mindex ad935d9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_rotate.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_secure_random.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_secure_random.o[m
[1mdeleted file mode 100644[m
[1mindex 9631bba..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_secure_random.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_unescape_uri.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_unescape_uri.o[m
[1mdeleted file mode 100644[m
[1mindex 35a83ad..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_set_unescape_uri.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_fetch.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_fetch.o[m
[1mdeleted file mode 100644[m
[1mindex d1dcf4d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_fetch.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 0ca23c6..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_headers.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_headers.o[m
[1mdeleted file mode 100644[m
[1mindex e62dc32..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_headers.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_store.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_store.o[m
[1mdeleted file mode 100644[m
[1mindex 4859049..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_store.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_util.o[m
[1mdeleted file mode 100644[m
[1mindex befdbc3..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_var.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_var.o[m
[1mdeleted file mode 100644[m
[1mindex bd7f4c6..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_srcache_var.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_xss_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_xss_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 3544ef9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_xss_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_xss_util.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_xss_util.o[m
[1mdeleted file mode 100644[m
[1mindex f32270e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/addon/src/ngx_http_xss_util.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/autoconf.err b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/autoconf.err[m
[1mdeleted file mode 100644[m
[1mindex d3a28b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/autoconf.err[m
[1m+++ /dev/null[m
[36m@@ -1,732 +0,0 @@[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for C compiler[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for gcc -pipe switch[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for --with-ld-opt="-Wl,-rpath,/usr/local/openresty/luajit/lib"[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for -Wl,-E switch[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for gcc builtin atomic operations[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for C99 variadic macros[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for gcc variadic macros[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for gcc builtin 64 bit byteswap[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for unistd.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for inttypes.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for limits.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sys/filio.h[m
[31m-[m
[31m-objs/autotest.c:3:23: fatal error: sys/filio.h: No such file or directory[m
[31m-compilation terminated.[m
[31m-----------[m
[31m-[m
[31m-[m
[31m-#include <sys/filio.h>[m
[31m-[m
[31m-int main() {[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -o objs/autotest objs/autotest.c[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sys/param.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sys/mount.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sys/statvfs.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for crypt.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for epoll[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for EPOLLRDHUP[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for O_PATH[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:10:46: error: 'O_PATH' undeclared (first use in this function)[m
[31m-objs/autotest.c:10:46: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-objs/autotest.c:11:44: error: 'AT_EMPTY_PATH' undeclared (first use in this function)[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <sys/types.h>[m
[31m-                  #include <sys/stat.h>[m
[31m-                  #include <fcntl.h>[m
[31m-[m
[31m-int main() {[m
[31m-    int fd; struct stat sb;[m
[31m-                  fd = openat(AT_FDCWD, ".", O_PATH|O_DIRECTORY|O_NOFOLLOW);[m
[31m-                  if (fstatat(fd, "", &sb, AT_EMPTY_PATH) != 0) return 1;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sendfile()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sendfile64()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sys/prctl.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for prctl(PR_SET_DUMPABLE)[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sched_setaffinity()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for crypt_r()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sys/vfs.h[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for poll()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for /dev/poll[m
[31m-[m
[31m-objs/autotest.c:4:25: fatal error: sys/devpoll.h: No such file or directory[m
[31m-compilation terminated.[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <sys/devpoll.h>[m
[31m-[m
[31m-int main() {[m
[31m-    int  n, dp; struct dvpoll  dvp;[m
[31m-                  dp = 0;[m
[31m-                  dvp.dp_fds = NULL;[m
[31m-                  dvp.dp_nfds = 0;[m
[31m-                  dvp.dp_timeout = 0;[m
[31m-                  n = ioctl(dp, DP_POLL, &dvp);[m
[31m-                  if (n == -1) return 1;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for kqueue[m
[31m-[m
[31m-objs/autotest.c:4:23: fatal error: sys/event.h: No such file or directory[m
[31m-compilation terminated.[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <sys/event.h>[m
[31m-[m
[31m-int main() {[m
[31m-    int kq; kq = kqueue();[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for crypt()[m
[31m-[m
[31m-/tmp/ccmyFY0x.o: In function `main':[m
[31m-autotest.c:(.text.startup+0xf): undefined reference to `crypt'[m
[31m-collect2: error: ld returned 1 exit status[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-[m
[31m-[m
[31m-int main() {[m
[31m-    crypt("test", "salt");;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for crypt() in libcrypt[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for F_READAHEAD[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:7:14: error: 'F_READAHEAD' undeclared (first use in this function)[m
[31m-objs/autotest.c:7:14: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-int main() {[m
[31m-    fcntl(0, F_READAHEAD, 1);;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for posix_fadvise()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for O_DIRECT[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for F_NOCACHE[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:7:14: error: 'F_NOCACHE' undeclared (first use in this function)[m
[31m-objs/autotest.c:7:14: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-int main() {[m
[31m-    fcntl(0, F_NOCACHE, 1);;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for directio()[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:8:17: error: 'DIRECTIO_ON' undeclared (first use in this function)[m
[31m-objs/autotest.c:8:17: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <sys/types.h>[m
[31m-                  #include <sys/fcntl.h>[m
[31m-[m
[31m-int main() {[m
[31m-    directio(0, DIRECTIO_ON);;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for statfs()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for statvfs()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for dlopen()[m
[31m-[m
[31m-/tmp/ccYjZL1Y.o: In function `main':[m
[31m-autotest.c:(.text.startup+0xc): undefined reference to `dlopen'[m
[31m-autotest.c:(.text.startup+0x15): undefined reference to `dlsym'[m
[31m-collect2: error: ld returned 1 exit status[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-int main() {[m
[31m-    dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); dlsym(NULL, NULL);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for dlopen() in libdl[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sched_yield()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for SO_SETFIB[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:7:31: error: 'SO_SETFIB' undeclared (first use in this function)[m
[31m-objs/autotest.c:7:31: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <sys/socket.h>[m
[31m-[m
[31m-int main() {[m
[31m-    setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 0);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for SO_REUSEPORT[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for SO_ACCEPTFILTER[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:7:31: error: 'SO_ACCEPTFILTER' undeclared (first use in this function)[m
[31m-objs/autotest.c:7:31: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <sys/socket.h>[m
[31m-[m
[31m-int main() {[m
[31m-    setsockopt(0, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for IP_RECVDSTADDR[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:8:31: error: 'IP_RECVDSTADDR' undeclared (first use in this function)[m
[31m-objs/autotest.c:8:31: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-[m
[31m-int main() {[m
[31m-    setsockopt(0, IPPROTO_IP, IP_RECVDSTADDR, NULL, 0);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for IP_PKTINFO[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for IPV6_RECVPKTINFO[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for TCP_DEFER_ACCEPT[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for TCP_KEEPIDLE[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for TCP_FASTOPEN[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:9:32: error: 'TCP_FASTOPEN' undeclared (first use in this function)[m
[31m-objs/autotest.c:9:32: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>[m
[31m-[m
[31m-int main() {[m
[31m-    setsockopt(0, IPPROTO_TCP, TCP_FASTOPEN, NULL, 0);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for TCP_INFO[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for accept4()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for eventfd()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for int size[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for long size[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for long long size[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for void * size[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for uint32_t[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for uint64_t[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sig_atomic_t[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sig_atomic_t size[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for socklen_t[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for in_addr_t[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for in_port_t[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for rlim_t[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for uintptr_t[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for system byte ordering[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for size_t size[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for off_t size[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for time_t size[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for setproctitle()[m
[31m-[m
[31m-/tmp/ccGpXXZr.o: In function `main':[m
[31m-autotest.c:(.text.startup+0xc): undefined reference to `setproctitle'[m
[31m-collect2: error: ld returned 1 exit status[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-int main() {[m
[31m-    setproctitle("test");;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for pread()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for pwrite()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for pwritev()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sys_nerr[m
[31m-[m
[31m-/tmp/cc14NbGD.o: In function `main':[m
[31m-autotest.c:(.text.startup+0x6): warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead[m
[31m-135[m
[31m-----------------------------------------[m
[31m-checking for localtime_r()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for posix_memalign()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for memalign()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for mmap(MAP_ANON|MAP_SHARED)[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for mmap("/dev/zero", MAP_SHARED)[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for System V shared memory[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for POSIX semaphores[m
[31m-[m
[31m-/tmp/cciJ2YH2.o: In function `main':[m
[31m-autotest.c:(.text.startup+0xf): undefined reference to `sem_init'[m
[31m-autotest.c:(.text.startup+0x21): undefined reference to `sem_destroy'[m
[31m-collect2: error: ld returned 1 exit status[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <semaphore.h>[m
[31m-[m
[31m-int main() {[m
[31m-    sem_t  sem;[m
[31m-                  if (sem_init(&sem, 1, 0) == -1) return 1;[m
[31m-                  sem_destroy(&sem);;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for POSIX semaphores in libpthread[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for struct msghdr.msg_control[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for ioctl(FIONBIO)[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for struct tm.tm_gmtoff[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for struct dirent.d_namlen[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:8:28: error: 'struct dirent' has no member named 'd_namlen'[m
[31m-objs/autotest.c:9:41: error: 'struct dirent' has no member named 'd_namlen'[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <dirent.h>[m
[31m-                  #include <stdio.h>[m
[31m-[m
[31m-int main() {[m
[31m-    struct dirent  dir; dir.d_namlen = 0;[m
[31m-                  printf("%d", (int) dir.d_namlen);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for struct dirent.d_type[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for sysconf(_SC_NPROCESSORS_ONLN)[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for openat(), fstatat()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for getaddrinfo()[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for LuaJIT library in /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/lib and /home/qa-deploy-utils/qa_shell_script/TEMP/openresty-1.9.15.1/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 (specified by the LUAJIT_LIB and LUAJIT_INC env, with -ldl)[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for export symbols by default (-E)[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for export symbols by default (--export-all-symbols)[m
[31m-[m
[31m-/usr/bin/ld: unrecognized option '--export-all-symbols'[m
[31m-/usr/bin/ld: use the --help option for usage information[m
[31m-collect2: error: ld returned 1 exit status[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-int main() {[m
[31m-    printf("hello");;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib -Wl,--export-all-symbols[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for SO_PASSCRED[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for mmap(sbrk(0))[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for __attribute__(constructor)[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for PCRE library[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for PCRE JIT support[m
[31m-[m
[31m-objs/autotest.c: In function 'main':[m
[31m-objs/autotest.c:9:43: error: 'PCRE_CONFIG_JIT' undeclared (first use in this function)[m
[31m-objs/autotest.c:9:43: note: each undeclared identifier is reported only once for each function it appears in[m
[31m-----------[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <unistd.h>[m
[31m-#include <pcre.h>[m
[31m-[m
[31m-int main() {[m
[31m-    int jit = 0;[m
[31m-                              pcre_free_study(NULL);[m
[31m-                              pcre_config(PCRE_CONFIG_JIT, &jit);[m
[31m-                              if (jit != 1) return 1;;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-----------[m
[31m-cc -O2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c -Wl,-rpath,/usr/local/openresty/luajit/lib -lpcre[m
[31m-----------[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for OpenSSL library[m
[31m-[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for zlib library[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/nginx b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/nginx[m
[1mdeleted file mode 100755[m
[1mindex 1cefee6..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/nginx and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/nginx.8 b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/nginx.8[m
[1mdeleted file mode 100644[m
[1mindex b0cb400..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/nginx.8[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-.\"[m
[31m-.\" Copyright (C) 2010 Sergey A. Osokin[m
[31m-.\" Copyright (C) Nginx, Inc.[m
[31m-.\" All rights reserved.[m
[31m-.\"[m
[31m-.\" Redistribution and use in source and binary forms, with or without[m
[31m-.\" modification, are permitted provided that the following conditions[m
[31m-.\" are met:[m
[31m-.\" 1. Redistributions of source code must retain the above copyright[m
[31m-.\"    notice, this list of conditions and the following disclaimer.[m
[31m-.\" 2. Redistributions in binary form must reproduce the above copyright[m
[31m-.\"    notice, this list of conditions and the following disclaimer in the[m
[31m-.\"    documentation and/or other materials provided with the distribution.[m
[31m-.\"[m
[31m-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m-.\" SUCH DAMAGE.[m
[31m-.\"[m
[31m-.\"[m
[31m-.Dd June 16, 2015[m
[31m-.Dt NGINX 8[m
[31m-.Os[m
[31m-.Sh NAME[m
[31m-.Nm nginx[m
[31m-.Nd "HTTP and reverse proxy server, mail proxy server"[m
[31m-.Sh SYNOPSIS[m
[31m-.Nm[m
[31m-.Op Fl ?hqTtVv[m
[31m-.Op Fl c Ar file[m
[31m-.Op Fl g Ar directives[m
[31m-.Op Fl p Ar prefix[m
[31m-.Op Fl s Ar signal[m
[31m-.Sh DESCRIPTION[m
[31m-.Nm[m
[31m-(pronounced[m
[31m-.Dq engine x )[m
[31m-is an HTTP and reverse proxy server, as well as a mail proxy server.[m
[31m-It is known for its high performance, stability, rich feature set, simple[m
[31m-configuration, and low resource consumption.[m
[31m-.Pp[m
[31m-The options are as follows:[m
[31m-.Bl -tag -width ".Fl d Ar directives"[m
[31m-.It Fl ?\& , h[m
[31m-Print help.[m
[31m-.It Fl c Ar file[m
[31m-Use an alternative configuration[m
[31m-.Ar file .[m
[31m-.It Fl g Ar directives[m
[31m-Set global configuration directives.[m
[31m-See[m
[31m-.Sx EXAMPLES[m
[31m-for details.[m
[31m-.It Fl p Ar prefix[m
[31m-Set the prefix path.[m
[31m-The default value is[m
[31m-.Pa /usr/local/openresty/nginx .[m
[31m-.It Fl q[m
[31m-Suppress non-error messages during configuration testing.[m
[31m-.It Fl s Ar signal[m
[31m-Send a signal to the master process.[m
[31m-The argument[m
[31m-.Ar signal[m
[31m-can be one of:[m
[31m-.Cm stop , quit , reopen , reload .[m
[31m-The following table shows the corresponding system signals:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Cm reopen" -compact[m
[31m-.It Cm stop[m
[31m-.Dv SIGTERM[m
[31m-.It Cm quit[m
[31m-.Dv SIGQUIT[m
[31m-.It Cm reopen[m
[31m-.Dv SIGUSR1[m
[31m-.It Cm reload[m
[31m-.Dv SIGHUP[m
[31m-.El[m
[31m-.It Fl t[m
[31m-Do not run, just test the configuration file.[m
[31m-.Nm[m
[31m-checks the configuration file syntax and then tries to open files[m
[31m-referenced in the configuration file.[m
[31m-.It Fl T[m
[31m-Same as[m
[31m-.Fl t ,[m
[31m-but additionally dump configuration files to standard output.[m
[31m-.It Fl V[m
[31m-Print the[m
[31m-.Nm[m
[31m-version, compiler version, and[m
[31m-.Pa configure[m
[31m-script parameters.[m
[31m-.It Fl v[m
[31m-Print the[m
[31m-.Nm[m
[31m-version.[m
[31m-.El[m
[31m-.Sh SIGNALS[m
[31m-The master process of[m
[31m-.Nm[m
[31m-can handle the following signals:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Dv SIGINT , SIGTERM" -compact[m
[31m-.It Dv SIGINT , SIGTERM[m
[31m-Shut down quickly.[m
[31m-.It Dv SIGHUP[m
[31m-Reload configuration, start the new worker process with a new[m
[31m-configuration, and gracefully shut down old worker processes.[m
[31m-.It Dv SIGQUIT[m
[31m-Shut down gracefully.[m
[31m-.It Dv SIGUSR1[m
[31m-Reopen log files.[m
[31m-.It Dv SIGUSR2[m
[31m-Upgrade the[m
[31m-.Nm[m
[31m-executable on the fly.[m
[31m-.It Dv SIGWINCH[m
[31m-Shut down worker processes gracefully.[m
[31m-.El[m
[31m-.Pp[m
[31m-While there is no need to explicitly control worker processes normally,[m
[31m-they support some signals too:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Dv SIGINT , SIGTERM" -compact[m
[31m-.It Dv SIGTERM[m
[31m-Shut down quickly.[m
[31m-.It Dv SIGQUIT[m
[31m-Shut down gracefully.[m
[31m-.It Dv SIGUSR1[m
[31m-Reopen log files.[m
[31m-.El[m
[31m-.Sh DEBUGGING LOG[m
[31m-To enable a debugging log, reconfigure[m
[31m-.Nm[m
[31m-to build with debugging:[m
[31m-.Pp[m
[31m-.Dl "./configure --with-debug ..."[m
[31m-.Pp[m
[31m-and then set the[m
[31m-.Cm debug[m
[31m-level of the[m
[31m-.Va error_log :[m
[31m-.Pp[m
[31m-.Dl "error_log /path/to/log debug;"[m
[31m-.Pp[m
[31m-It is also possible to enable the debugging for a particular IP address:[m
[31m-.Bd -literal -offset indent[m
[31m-events {[m
[31m-	debug_connection 127.0.0.1;[m
[31m-}[m
[31m-.Ed[m
[31m-.Sh ENVIRONMENT[m
[31m-The[m
[31m-.Ev NGINX[m
[31m-environment variable is used internally by[m
[31m-.Nm[m
[31m-and should not be set directly by the user.[m
[31m-.Sh FILES[m
[31m-.Bl -tag -width indent[m
[31m-.It Pa /usr/local/openresty/nginx/logs/nginx.pid[m
[31m-Contains the process ID of[m
[31m-.Nm .[m
[31m-The contents of this file are not sensitive, so it can be world-readable.[m
[31m-.It Pa /usr/local/openresty/nginx/conf/nginx.conf[m
[31m-The main configuration file.[m
[31m-.It Pa /usr/local/openresty/nginx/logs/error.log[m
[31m-Error log file.[m
[31m-.El[m
[31m-.Sh EXIT STATUS[m
[31m-Exit status is 0 on success, or 1 if the command fails.[m
[31m-.Sh EXAMPLES[m
[31m-Test configuration file[m
[31m-.Pa ~/mynginx.conf[m
[31m-with global directives for PID and quantity of worker processes:[m
[31m-.Bd -literal -offset indent[m
[31m-nginx -t -c ~/mynginx.conf \e[m
[31m-	-g "pid /var/run/mynginx.pid; worker_processes 2;"[m
[31m-.Ed[m
[31m-.Sh SEE ALSO[m
[31m-.\"Xr nginx.conf 5[m
[31m-.\"Pp[m
[31m-Documentation at[m
[31m-.Pa http://nginx.org/en/docs/ .[m
[31m-.Pp[m
[31m-For questions and technical support, please refer to[m
[31m-.Pa http://nginx.org/en/support.html .[m
[31m-.Sh HISTORY[m
[31m-Development of[m
[31m-.Nm[m
[31m-started in 2002, with the first public release on October 4, 2004.[m
[31m-.Sh AUTHORS[m
[31m-.An -nosplit[m
[31m-.An Igor Sysoev Aq igor@sysoev.ru .[m
[31m-.Pp[m
[31m-This manual page was originally written by[m
[31m-.An Sergey A. Osokin Aq osa@FreeBSD.org.ru[m
[31m-as a result of compiling many[m
[31m-.Nm[m
[31m-documents from all over the world.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_auto_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_auto_config.h[m
[1mdeleted file mode 100644[m
[1mindex a895c14..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_auto_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,499 +0,0 @@[m
[31m-#define NGX_CONFIGURE " --prefix=/usr/local/openresty/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.0 --add-module=../echo-nginx-module-0.59 --add-module=../xss-nginx-module-0.05 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.30 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.05 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.5 --add-module=../ngx_lua_upstream-0.05 --add-module=../headers-more-nginx-module-0.30 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.17 --add-module=../redis2-nginx-module-0.13 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.14 --add-module=../rds-csv-nginx-module-0.07 --with-ld-opt=-Wl,-rpath,/usr/local/openresty/luajit/lib --with-http_ssl_module"[m
[31m-[m
[31m-#ifndef NGX_COMPILER[m
[31m-#define NGX_COMPILER  "gcc 4.7.2 20121015 (Red Hat 4.7.2-5) (GCC) "[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_GCC_ATOMIC[m
[31m-#define NGX_HAVE_GCC_ATOMIC  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_C99_VARIADIC_MACROS[m
[31m-#define NGX_HAVE_C99_VARIADIC_MACROS  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_GCC_VARIADIC_MACROS[m
[31m-#define NGX_HAVE_GCC_VARIADIC_MACROS  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_GCC_BSWAP64[m
[31m-#define NGX_HAVE_GCC_BSWAP64  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_EPOLL[m
[31m-#define NGX_HAVE_EPOLL  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_CLEAR_EVENT[m
[31m-#define NGX_HAVE_CLEAR_EVENT  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_EPOLLRDHUP[m
[31m-#define NGX_HAVE_EPOLLRDHUP  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SENDFILE[m
[31m-#define NGX_HAVE_SENDFILE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SENDFILE64[m
[31m-#define NGX_HAVE_SENDFILE64  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_PR_SET_DUMPABLE[m
[31m-#define NGX_HAVE_PR_SET_DUMPABLE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SCHED_SETAFFINITY[m
[31m-#define NGX_HAVE_SCHED_SETAFFINITY  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_GNU_CRYPT_R[m
[31m-#define NGX_HAVE_GNU_CRYPT_R  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_NONALIGNED[m
[31m-#define NGX_HAVE_NONALIGNED  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_CPU_CACHE_LINE[m
[31m-#define NGX_CPU_CACHE_LINE  64[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_KQUEUE_UDATA_T  (void *)[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_POSIX_FADVISE[m
[31m-#define NGX_HAVE_POSIX_FADVISE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_O_DIRECT[m
[31m-#define NGX_HAVE_O_DIRECT  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_ALIGNED_DIRECTIO[m
[31m-#define NGX_HAVE_ALIGNED_DIRECTIO  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_STATFS[m
[31m-#define NGX_HAVE_STATFS  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_STATVFS[m
[31m-#define NGX_HAVE_STATVFS  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_DLOPEN[m
[31m-#define NGX_HAVE_DLOPEN  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SCHED_YIELD[m
[31m-#define NGX_HAVE_SCHED_YIELD  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_REUSEPORT[m
[31m-#define NGX_HAVE_REUSEPORT  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_IP_PKTINFO[m
[31m-#define NGX_HAVE_IP_PKTINFO  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_IPV6_RECVPKTINFO[m
[31m-#define NGX_HAVE_IPV6_RECVPKTINFO  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_DEFERRED_ACCEPT[m
[31m-#define NGX_HAVE_DEFERRED_ACCEPT  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_KEEPALIVE_TUNABLE[m
[31m-#define NGX_HAVE_KEEPALIVE_TUNABLE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_TCP_INFO[m
[31m-#define NGX_HAVE_TCP_INFO  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_ACCEPT4[m
[31m-#define NGX_HAVE_ACCEPT4  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_EVENTFD[m
[31m-#define NGX_HAVE_EVENTFD  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SYS_EVENTFD_H[m
[31m-#define NGX_HAVE_SYS_EVENTFD_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_UNIX_DOMAIN[m
[31m-#define NGX_HAVE_UNIX_DOMAIN  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_PTR_SIZE[m
[31m-#define NGX_PTR_SIZE  8[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_SIG_ATOMIC_T_SIZE[m
[31m-#define NGX_SIG_ATOMIC_T_SIZE  4[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_LITTLE_ENDIAN[m
[31m-#define NGX_HAVE_LITTLE_ENDIAN  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_MAX_SIZE_T_VALUE[m
[31m-#define NGX_MAX_SIZE_T_VALUE  9223372036854775807LL[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_SIZE_T_LEN[m
[31m-#define NGX_SIZE_T_LEN  (sizeof("-9223372036854775808") - 1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_MAX_OFF_T_VALUE[m
[31m-#define NGX_MAX_OFF_T_VALUE  9223372036854775807LL[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_OFF_T_LEN[m
[31m-#define NGX_OFF_T_LEN  (sizeof("-9223372036854775808") - 1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_TIME_T_SIZE[m
[31m-#define NGX_TIME_T_SIZE  8[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_TIME_T_LEN[m
[31m-#define NGX_TIME_T_LEN  (sizeof("-9223372036854775808") - 1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_MAX_TIME_T_VALUE[m
[31m-#define NGX_MAX_TIME_T_VALUE  9223372036854775807LL[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_PREAD[m
[31m-#define NGX_HAVE_PREAD  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_PWRITE[m
[31m-#define NGX_HAVE_PWRITE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_PWRITEV[m
[31m-#define NGX_HAVE_PWRITEV  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_SYS_NERR[m
[31m-#define NGX_SYS_NERR  135[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_LOCALTIME_R[m
[31m-#define NGX_HAVE_LOCALTIME_R  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_POSIX_MEMALIGN[m
[31m-#define NGX_HAVE_POSIX_MEMALIGN  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_MEMALIGN[m
[31m-#define NGX_HAVE_MEMALIGN  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_MAP_ANON[m
[31m-#define NGX_HAVE_MAP_ANON  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_MAP_DEVZERO[m
[31m-#define NGX_HAVE_MAP_DEVZERO  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SYSVSHM[m
[31m-#define NGX_HAVE_SYSVSHM  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_POSIX_SEM[m
[31m-#define NGX_HAVE_POSIX_SEM  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_MSGHDR_MSG_CONTROL[m
[31m-#define NGX_HAVE_MSGHDR_MSG_CONTROL  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_FIONBIO[m
[31m-#define NGX_HAVE_FIONBIO  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_GMTOFF[m
[31m-#define NGX_HAVE_GMTOFF  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_D_TYPE[m
[31m-#define NGX_HAVE_D_TYPE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SC_NPROCESSORS_ONLN[m
[31m-#define NGX_HAVE_SC_NPROCESSORS_ONLN  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_OPENAT[m
[31m-#define NGX_HAVE_OPENAT  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_GETADDRINFO[m
[31m-#define NGX_HAVE_GETADDRINFO  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_CACHE[m
[31m-#define NGX_HTTP_CACHE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_GZIP[m
[31m-#define NGX_HTTP_GZIP  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_SSI[m
[31m-#define NGX_HTTP_SSI  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_CRYPT[m
[31m-#define NGX_CRYPT  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_X_FORWARDED_FOR[m
[31m-#define NGX_HTTP_X_FORWARDED_FOR  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_SSL[m
[31m-#define NGX_HTTP_SSL  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_X_FORWARDED_FOR[m
[31m-#define NGX_HTTP_X_FORWARDED_FOR  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_UPSTREAM_ZONE[m
[31m-#define NGX_HTTP_UPSTREAM_ZONE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NDK[m
[31m-#define NDK  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_COOLKIT_MODULE[m
[31m-#define NGX_COOLKIT_MODULE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_HAVE_SO_PASSCRED[m
[31m-#define NGX_HTTP_LUA_HAVE_SO_PASSCRED  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_HAVE_MMAP_SBRK[m
[31m-#define NGX_HTTP_LUA_HAVE_MMAP_SBRK  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_HAVE_CONSTRUCTOR[m
[31m-#define NGX_HTTP_LUA_HAVE_CONSTRUCTOR  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_PCRE[m
[31m-#define NGX_PCRE  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_OPENSSL[m
[31m-#define NGX_OPENSSL  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_SSL[m
[31m-#define NGX_SSL  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_OPENSSL_MD5_H[m
[31m-#define NGX_HAVE_OPENSSL_MD5_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_OPENSSL_MD5[m
[31m-#define NGX_OPENSSL_MD5  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_MD5[m
[31m-#define NGX_HAVE_MD5  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_OPENSSL_SHA1_H[m
[31m-#define NGX_HAVE_OPENSSL_SHA1_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SHA1[m
[31m-#define NGX_HAVE_SHA1  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_ZLIB[m
[31m-#define NGX_ZLIB  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_PREFIX[m
[31m-#define NGX_PREFIX  "/usr/local/openresty/nginx/"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_CONF_PREFIX[m
[31m-#define NGX_CONF_PREFIX  "conf/"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_SBIN_PATH[m
[31m-#define NGX_SBIN_PATH  "sbin/nginx"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_CONF_PATH[m
[31m-#define NGX_CONF_PATH  "conf/nginx.conf"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_PID_PATH[m
[31m-#define NGX_PID_PATH  "logs/nginx.pid"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LOCK_PATH[m
[31m-#define NGX_LOCK_PATH  "logs/nginx.lock"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_ERROR_LOG_PATH[m
[31m-#define NGX_ERROR_LOG_PATH  "logs/error.log"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LOG_PATH[m
[31m-#define NGX_HTTP_LOG_PATH  "logs/access.log"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_CLIENT_TEMP_PATH[m
[31m-#define NGX_HTTP_CLIENT_TEMP_PATH  "client_body_temp"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_PROXY_TEMP_PATH[m
[31m-#define NGX_HTTP_PROXY_TEMP_PATH  "proxy_temp"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_FASTCGI_TEMP_PATH[m
[31m-#define NGX_HTTP_FASTCGI_TEMP_PATH  "fastcgi_temp"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_UWSGI_TEMP_PATH[m
[31m-#define NGX_HTTP_UWSGI_TEMP_PATH  "uwsgi_temp"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_SCGI_TEMP_PATH[m
[31m-#define NGX_HTTP_SCGI_TEMP_PATH  "scgi_temp"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_SUPPRESS_WARN[m
[31m-#define NGX_SUPPRESS_WARN  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_SMP[m
[31m-#define NGX_SMP  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_USER[m
[31m-#define NGX_USER  "nobody"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_GROUP[m
[31m-#define NGX_GROUP  "nobody"[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_auto_headers.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_auto_headers.h[m
[1mdeleted file mode 100644[m
[1mindex 6710d90..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_auto_headers.h[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_UNISTD_H[m
[31m-#define NGX_HAVE_UNISTD_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INTTYPES_H[m
[31m-#define NGX_HAVE_INTTYPES_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_LIMITS_H[m
[31m-#define NGX_HAVE_LIMITS_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SYS_PARAM_H[m
[31m-#define NGX_HAVE_SYS_PARAM_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SYS_MOUNT_H[m
[31m-#define NGX_HAVE_SYS_MOUNT_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SYS_STATVFS_H[m
[31m-#define NGX_HAVE_SYS_STATVFS_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_CRYPT_H[m
[31m-#define NGX_HAVE_CRYPT_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LINUX[m
[31m-#define NGX_LINUX  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SYS_PRCTL_H[m
[31m-#define NGX_HAVE_SYS_PRCTL_H  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SYS_VFS_H[m
[31m-#define NGX_HAVE_SYS_VFS_H  1[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_modules.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_modules.c[m
[1mdeleted file mode 100644[m
[1mindex ed38da6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_modules.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_core_module;[m
[31m-extern ngx_module_t  ngx_errlog_module;[m
[31m-extern ngx_module_t  ngx_conf_module;[m
[31m-extern ngx_module_t  ngx_openssl_module;[m
[31m-extern ngx_module_t  ngx_regex_module;[m
[31m-extern ngx_module_t  ngx_events_module;[m
[31m-extern ngx_module_t  ngx_event_core_module;[m
[31m-extern ngx_module_t  ngx_epoll_module;[m
[31m-extern ngx_module_t  ngx_http_module;[m
[31m-extern ngx_module_t  ngx_http_core_module;[m
[31m-extern ngx_module_t  ngx_http_log_module;[m
[31m-extern ngx_module_t  ngx_http_upstream_module;[m
[31m-extern ngx_module_t  ngx_http_static_module;[m
[31m-extern ngx_module_t  ngx_http_autoindex_module;[m
[31m-extern ngx_module_t  ngx_http_index_module;[m
[31m-extern ngx_module_t  ngx_http_auth_basic_module;[m
[31m-extern ngx_module_t  ngx_http_access_module;[m
[31m-extern ngx_module_t  ngx_http_limit_conn_module;[m
[31m-extern ngx_module_t  ngx_http_limit_req_module;[m
[31m-extern ngx_module_t  ngx_http_geo_module;[m
[31m-extern ngx_module_t  ngx_http_map_module;[m
[31m-extern ngx_module_t  ngx_http_split_clients_module;[m
[31m-extern ngx_module_t  ngx_http_referer_module;[m
[31m-extern ngx_module_t  ngx_http_rewrite_module;[m
[31m-extern ngx_module_t  ngx_http_ssl_module;[m
[31m-extern ngx_module_t  ngx_http_proxy_module;[m
[31m-extern ngx_module_t  ngx_http_fastcgi_module;[m
[31m-extern ngx_module_t  ngx_http_uwsgi_module;[m
[31m-extern ngx_module_t  ngx_http_scgi_module;[m
[31m-extern ngx_module_t  ngx_http_memcached_module;[m
[31m-extern ngx_module_t  ngx_http_empty_gif_module;[m
[31m-extern ngx_module_t  ngx_http_browser_module;[m
[31m-extern ngx_module_t  ngx_http_upstream_hash_module;[m
[31m-extern ngx_module_t  ngx_http_upstream_ip_hash_module;[m
[31m-extern ngx_module_t  ngx_http_upstream_least_conn_module;[m
[31m-extern ngx_module_t  ngx_http_upstream_keepalive_module;[m
[31m-extern ngx_module_t  ngx_http_upstream_zone_module;[m
[31m-extern ngx_module_t  ndk_http_module;[m
[31m-extern ngx_module_t  ngx_coolkit_module;[m
[31m-extern ngx_module_t  ngx_http_set_misc_module;[m
[31m-extern ngx_module_t  ngx_http_form_input_module;[m
[31m-extern ngx_module_t  ngx_http_encrypted_session_module;[m
[31m-extern ngx_module_t  ngx_http_lua_upstream_module;[m
[31m-extern ngx_module_t  ngx_http_array_var_module;[m
[31m-extern ngx_module_t  ngx_http_memc_module;[m
[31m-extern ngx_module_t  ngx_http_redis2_module;[m
[31m-extern ngx_module_t  ngx_http_redis_module;[m
[31m-extern ngx_module_t  ngx_http_write_filter_module;[m
[31m-extern ngx_module_t  ngx_http_header_filter_module;[m
[31m-extern ngx_module_t  ngx_http_chunked_filter_module;[m
[31m-extern ngx_module_t  ngx_http_range_header_filter_module;[m
[31m-extern ngx_module_t  ngx_http_gzip_filter_module;[m
[31m-extern ngx_module_t  ngx_http_postpone_filter_module;[m
[31m-extern ngx_module_t  ngx_http_ssi_filter_module;[m
[31m-extern ngx_module_t  ngx_http_charset_filter_module;[m
[31m-extern ngx_module_t  ngx_http_userid_filter_module;[m
[31m-extern ngx_module_t  ngx_http_headers_filter_module;[m
[31m-extern ngx_module_t  ngx_http_echo_module;[m
[31m-extern ngx_module_t  ngx_http_xss_filter_module;[m
[31m-extern ngx_module_t  ngx_http_srcache_filter_module;[m
[31m-extern ngx_module_t  ngx_http_lua_module;[m
[31m-extern ngx_module_t  ngx_http_headers_more_filter_module;[m
[31m-extern ngx_module_t  ngx_http_rds_json_filter_module;[m
[31m-extern ngx_module_t  ngx_http_rds_csv_filter_module;[m
[31m-extern ngx_module_t  ngx_http_copy_filter_module;[m
[31m-extern ngx_module_t  ngx_http_range_body_filter_module;[m
[31m-extern ngx_module_t  ngx_http_not_modified_filter_module;[m
[31m-[m
[31m-ngx_module_t *ngx_modules[] = {[m
[31m-    &ngx_core_module,[m
[31m-    &ngx_errlog_module,[m
[31m-    &ngx_conf_module,[m
[31m-    &ngx_openssl_module,[m
[31m-    &ngx_regex_module,[m
[31m-    &ngx_events_module,[m
[31m-    &ngx_event_core_module,[m
[31m-    &ngx_epoll_module,[m
[31m-    &ngx_http_module,[m
[31m-    &ngx_http_core_module,[m
[31m-    &ngx_http_log_module,[m
[31m-    &ngx_http_upstream_module,[m
[31m-    &ngx_http_static_module,[m
[31m-    &ngx_http_autoindex_module,[m
[31m-    &ngx_http_index_module,[m
[31m-    &ngx_http_auth_basic_module,[m
[31m-    &ngx_http_access_module,[m
[31m-    &ngx_http_limit_conn_module,[m
[31m-    &ngx_http_limit_req_module,[m
[31m-    &ngx_http_geo_module,[m
[31m-    &ngx_http_map_module,[m
[31m-    &ngx_http_split_clients_module,[m
[31m-    &ngx_http_referer_module,[m
[31m-    &ngx_http_rewrite_module,[m
[31m-    &ngx_http_ssl_module,[m
[31m-    &ngx_http_proxy_module,[m
[31m-    &ngx_http_fastcgi_module,[m
[31m-    &ngx_http_uwsgi_module,[m
[31m-    &ngx_http_scgi_module,[m
[31m-    &ngx_http_memcached_module,[m
[31m-    &ngx_http_empty_gif_module,[m
[31m-    &ngx_http_browser_module,[m
[31m-    &ngx_http_upstream_hash_module,[m
[31m-    &ngx_http_upstream_ip_hash_module,[m
[31m-    &ngx_http_upstream_least_conn_module,[m
[31m-    &ngx_http_upstream_keepalive_module,[m
[31m-    &ngx_http_upstream_zone_module,[m
[31m-    &ndk_http_module,[m
[31m-    &ngx_coolkit_module,[m
[31m-    &ngx_http_set_misc_module,[m
[31m-    &ngx_http_form_input_module,[m
[31m-    &ngx_http_encrypted_session_module,[m
[31m-    &ngx_http_lua_upstream_module,[m
[31m-    &ngx_http_array_var_module,[m
[31m-    &ngx_http_memc_module,[m
[31m-    &ngx_http_redis2_module,[m
[31m-    &ngx_http_redis_module,[m
[31m-    &ngx_http_write_filter_module,[m
[31m-    &ngx_http_header_filter_module,[m
[31m-    &ngx_http_chunked_filter_module,[m
[31m-    &ngx_http_range_header_filter_module,[m
[31m-    &ngx_http_gzip_filter_module,[m
[31m-    &ngx_http_postpone_filter_module,[m
[31m-    &ngx_http_ssi_filter_module,[m
[31m-    &ngx_http_charset_filter_module,[m
[31m-    &ngx_http_userid_filter_module,[m
[31m-    &ngx_http_headers_filter_module,[m
[31m-    &ngx_http_echo_module,[m
[31m-    &ngx_http_xss_filter_module,[m
[31m-    &ngx_http_srcache_filter_module,[m
[31m-    &ngx_http_lua_module,[m
[31m-    &ngx_http_headers_more_filter_module,[m
[31m-    &ngx_http_rds_json_filter_module,[m
[31m-    &ngx_http_rds_csv_filter_module,[m
[31m-    &ngx_http_copy_filter_module,[m
[31m-    &ngx_http_range_body_filter_module,[m
[31m-    &ngx_http_not_modified_filter_module,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-char *ngx_module_names[] = {[m
[31m-    "ngx_core_module",[m
[31m-    "ngx_errlog_module",[m
[31m-    "ngx_conf_module",[m
[31m-    "ngx_openssl_module",[m
[31m-    "ngx_regex_module",[m
[31m-    "ngx_events_module",[m
[31m-    "ngx_event_core_module",[m
[31m-    "ngx_epoll_module",[m
[31m-    "ngx_http_module",[m
[31m-    "ngx_http_core_module",[m
[31m-    "ngx_http_log_module",[m
[31m-    "ngx_http_upstream_module",[m
[31m-    "ngx_http_static_module",[m
[31m-    "ngx_http_autoindex_module",[m
[31m-    "ngx_http_index_module",[m
[31m-    "ngx_http_auth_basic_module",[m
[31m-    "ngx_http_access_module",[m
[31m-    "ngx_http_limit_conn_module",[m
[31m-    "ngx_http_limit_req_module",[m
[31m-    "ngx_http_geo_module",[m
[31m-    "ngx_http_map_module",[m
[31m-    "ngx_http_split_clients_module",[m
[31m-    "ngx_http_referer_module",[m
[31m-    "ngx_http_rewrite_module",[m
[31m-    "ngx_http_ssl_module",[m
[31m-    "ngx_http_proxy_module",[m
[31m-    "ngx_http_fastcgi_module",[m
[31m-    "ngx_http_uwsgi_module",[m
[31m-    "ngx_http_scgi_module",[m
[31m-    "ngx_http_memcached_module",[m
[31m-    "ngx_http_empty_gif_module",[m
[31m-    "ngx_http_browser_module",[m
[31m-    "ngx_http_upstream_hash_module",[m
[31m-    "ngx_http_upstream_ip_hash_module",[m
[31m-    "ngx_http_upstream_least_conn_module",[m
[31m-    "ngx_http_upstream_keepalive_module",[m
[31m-    "ngx_http_upstream_zone_module",[m
[31m-    "ndk_http_module",[m
[31m-    "ngx_coolkit_module",[m
[31m-    "ngx_http_set_misc_module",[m
[31m-    "ngx_http_form_input_module",[m
[31m-    "ngx_http_encrypted_session_module",[m
[31m-    "ngx_http_lua_upstream_module",[m
[31m-    "ngx_http_array_var_module",[m
[31m-    "ngx_http_memc_module",[m
[31m-    "ngx_http_redis2_module",[m
[31m-    "ngx_http_redis_module",[m
[31m-    "ngx_http_write_filter_module",[m
[31m-    "ngx_http_header_filter_module",[m
[31m-    "ngx_http_chunked_filter_module",[m
[31m-    "ngx_http_range_header_filter_module",[m
[31m-    "ngx_http_gzip_filter_module",[m
[31m-    "ngx_http_postpone_filter_module",[m
[31m-    "ngx_http_ssi_filter_module",[m
[31m-    "ngx_http_charset_filter_module",[m
[31m-    "ngx_http_userid_filter_module",[m
[31m-    "ngx_http_headers_filter_module",[m
[31m-    "ngx_http_echo_module",[m
[31m-    "ngx_http_xss_filter_module",[m
[31m-    "ngx_http_srcache_filter_module",[m
[31m-    "ngx_http_lua_module",[m
[31m-    "ngx_http_headers_more_filter_module",[m
[31m-    "ngx_http_rds_json_filter_module",[m
[31m-    "ngx_http_rds_csv_filter_module",[m
[31m-    "ngx_http_copy_filter_module",[m
[31m-    "ngx_http_range_body_filter_module",[m
[31m-    "ngx_http_not_modified_filter_module",[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_modules.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_modules.o[m
[1mdeleted file mode 100644[m
[1mindex 5d23840..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/ngx_modules.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/nginx.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/nginx.o[m
[1mdeleted file mode 100644[m
[1mindex f88f1d9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/nginx.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_array.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_array.o[m
[1mdeleted file mode 100644[m
[1mindex 3fd73a7..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_array.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_buf.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_buf.o[m
[1mdeleted file mode 100644[m
[1mindex 2b31ea4..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_buf.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_conf_file.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_conf_file.o[m
[1mdeleted file mode 100644[m
[1mindex 2ac43eb..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_conf_file.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_connection.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_connection.o[m
[1mdeleted file mode 100644[m
[1mindex 854aa2f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_connection.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_cpuinfo.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_cpuinfo.o[m
[1mdeleted file mode 100644[m
[1mindex 9293e90..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_cpuinfo.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_crc32.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_crc32.o[m
[1mdeleted file mode 100644[m
[1mindex 18409d2..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_crc32.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_crypt.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_crypt.o[m
[1mdeleted file mode 100644[m
[1mindex 14fe807..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_crypt.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_cycle.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_cycle.o[m
[1mdeleted file mode 100644[m
[1mindex 6ccb243..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_cycle.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_file.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_file.o[m
[1mdeleted file mode 100644[m
[1mindex 00fb983..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_file.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_hash.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_hash.o[m
[1mdeleted file mode 100644[m
[1mindex 6c83062..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_hash.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_inet.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_inet.o[m
[1mdeleted file mode 100644[m
[1mindex 0f07d3c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_inet.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_list.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_list.o[m
[1mdeleted file mode 100644[m
[1mindex 692a0fc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_list.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_log.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_log.o[m
[1mdeleted file mode 100644[m
[1mindex 39cf770..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_log.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_md5.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_md5.o[m
[1mdeleted file mode 100644[m
[1mindex b82dc6b..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_md5.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_module.o[m
[1mdeleted file mode 100644[m
[1mindex 25564c6..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_murmurhash.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_murmurhash.o[m
[1mdeleted file mode 100644[m
[1mindex 6ea5f09..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_murmurhash.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_open_file_cache.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_open_file_cache.o[m
[1mdeleted file mode 100644[m
[1mindex 7bc8f4c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_open_file_cache.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_output_chain.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_output_chain.o[m
[1mdeleted file mode 100644[m
[1mindex 679acda..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_output_chain.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_palloc.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_palloc.o[m
[1mdeleted file mode 100644[m
[1mindex 013af42..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_palloc.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_parse.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_parse.o[m
[1mdeleted file mode 100644[m
[1mindex 618cc1f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_parse.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_parse_time.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_parse_time.o[m
[1mdeleted file mode 100644[m
[1mindex dab0f00..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_parse_time.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_proxy_protocol.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_proxy_protocol.o[m
[1mdeleted file mode 100644[m
[1mindex fd0cd41..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_proxy_protocol.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_queue.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_queue.o[m
[1mdeleted file mode 100644[m
[1mindex ff4d46c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_queue.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_radix_tree.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_radix_tree.o[m
[1mdeleted file mode 100644[m
[1mindex 7acd372..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_radix_tree.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_rbtree.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_rbtree.o[m
[1mdeleted file mode 100644[m
[1mindex f233c21..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_rbtree.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_regex.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_regex.o[m
[1mdeleted file mode 100644[m
[1mindex 6a69992..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_regex.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_resolver.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_resolver.o[m
[1mdeleted file mode 100644[m
[1mindex ecb8419..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_resolver.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_rwlock.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_rwlock.o[m
[1mdeleted file mode 100644[m
[1mindex 7f25b8a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_rwlock.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_shmtx.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_shmtx.o[m
[1mdeleted file mode 100644[m
[1mindex 8819602..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_shmtx.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_slab.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_slab.o[m
[1mdeleted file mode 100644[m
[1mindex a762837..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_slab.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_spinlock.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_spinlock.o[m
[1mdeleted file mode 100644[m
[1mindex 263459d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_spinlock.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_string.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_string.o[m
[1mdeleted file mode 100644[m
[1mindex 336c251..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_string.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_syslog.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_syslog.o[m
[1mdeleted file mode 100644[m
[1mindex a2cd4d2..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_syslog.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_times.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_times.o[m
[1mdeleted file mode 100644[m
[1mindex 6bbf70a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/core/ngx_times.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/modules/ngx_epoll_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/modules/ngx_epoll_module.o[m
[1mdeleted file mode 100644[m
[1mindex 2129030..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/modules/ngx_epoll_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event.o[m
[1mdeleted file mode 100644[m
[1mindex 6e6bae0..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_accept.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_accept.o[m
[1mdeleted file mode 100644[m
[1mindex 1c29665..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_accept.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_connect.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_connect.o[m
[1mdeleted file mode 100644[m
[1mindex e93c86c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_connect.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_openssl.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_openssl.o[m
[1mdeleted file mode 100644[m
[1mindex 7b45496..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_openssl.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_openssl_stapling.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_openssl_stapling.o[m
[1mdeleted file mode 100644[m
[1mindex 1766fc2..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_openssl_stapling.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_pipe.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_pipe.o[m
[1mdeleted file mode 100644[m
[1mindex 3ca1677..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_pipe.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_posted.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_posted.o[m
[1mdeleted file mode 100644[m
[1mindex 9ec1faa..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_posted.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_timer.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_timer.o[m
[1mdeleted file mode 100644[m
[1mindex 38330e6..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/event/ngx_event_timer.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_access_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_access_module.o[m
[1mdeleted file mode 100644[m
[1mindex d4e465a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_access_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_auth_basic_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_auth_basic_module.o[m
[1mdeleted file mode 100644[m
[1mindex f538994..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_auth_basic_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_autoindex_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_autoindex_module.o[m
[1mdeleted file mode 100644[m
[1mindex a5506fa..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_autoindex_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_browser_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_browser_module.o[m
[1mdeleted file mode 100644[m
[1mindex 571e427..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_browser_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_charset_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_charset_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex e397c1e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_charset_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_chunked_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_chunked_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex e934d87..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_chunked_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_empty_gif_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_empty_gif_module.o[m
[1mdeleted file mode 100644[m
[1mindex e744986..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_empty_gif_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_fastcgi_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_fastcgi_module.o[m
[1mdeleted file mode 100644[m
[1mindex e5131bc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_fastcgi_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_geo_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_geo_module.o[m
[1mdeleted file mode 100644[m
[1mindex 648641a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_geo_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_gzip_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_gzip_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex e91fd66..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_gzip_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_headers_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_headers_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 2f3f1f9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_headers_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_index_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_index_module.o[m
[1mdeleted file mode 100644[m
[1mindex 8630de9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_index_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_limit_conn_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_limit_conn_module.o[m
[1mdeleted file mode 100644[m
[1mindex 5ce0698..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_limit_conn_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_limit_req_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_limit_req_module.o[m
[1mdeleted file mode 100644[m
[1mindex 2001afd..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_limit_req_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_log_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_log_module.o[m
[1mdeleted file mode 100644[m
[1mindex 9749909..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_log_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_map_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_map_module.o[m
[1mdeleted file mode 100644[m
[1mindex 61a17f3..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_map_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_memcached_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_memcached_module.o[m
[1mdeleted file mode 100644[m
[1mindex 8424926..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_memcached_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_not_modified_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_not_modified_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 38e23cf..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_not_modified_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_proxy_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_proxy_module.o[m
[1mdeleted file mode 100644[m
[1mindex eed54cc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_proxy_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_range_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_range_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 6d66587..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_range_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_referer_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_referer_module.o[m
[1mdeleted file mode 100644[m
[1mindex 2c3752d..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_referer_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_rewrite_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_rewrite_module.o[m
[1mdeleted file mode 100644[m
[1mindex 65186c2..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_rewrite_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_scgi_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_scgi_module.o[m
[1mdeleted file mode 100644[m
[1mindex 6df136c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_scgi_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_split_clients_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_split_clients_module.o[m
[1mdeleted file mode 100644[m
[1mindex 02f7faa..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_split_clients_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_ssi_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_ssi_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex b85b8ab..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_ssi_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_ssl_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_ssl_module.o[m
[1mdeleted file mode 100644[m
[1mindex f9865fe..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_ssl_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_static_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_static_module.o[m
[1mdeleted file mode 100644[m
[1mindex acfcd43..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_static_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_hash_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_hash_module.o[m
[1mdeleted file mode 100644[m
[1mindex aba15c5..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_hash_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_ip_hash_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_ip_hash_module.o[m
[1mdeleted file mode 100644[m
[1mindex 8fe7939..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_ip_hash_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_keepalive_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_keepalive_module.o[m
[1mdeleted file mode 100644[m
[1mindex d44323f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_keepalive_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_least_conn_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_least_conn_module.o[m
[1mdeleted file mode 100644[m
[1mindex 45117f6..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_least_conn_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_zone_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_zone_module.o[m
[1mdeleted file mode 100644[m
[1mindex 5c4d05e..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_upstream_zone_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_userid_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_userid_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 2591d6f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_userid_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_uwsgi_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_uwsgi_module.o[m
[1mdeleted file mode 100644[m
[1mindex ed5ddea..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/modules/ngx_http_uwsgi_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http.o[m
[1mdeleted file mode 100644[m
[1mindex 4842fe9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_copy_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_copy_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 72fe5b7..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_copy_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_core_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_core_module.o[m
[1mdeleted file mode 100644[m
[1mindex 1c55a28..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_core_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_file_cache.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_file_cache.o[m
[1mdeleted file mode 100644[m
[1mindex 1066dfd..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_file_cache.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_header_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_header_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex 2c60083..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_header_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_parse.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_parse.o[m
[1mdeleted file mode 100644[m
[1mindex 92b446b..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_parse.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_postpone_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_postpone_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex e1585e3..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_postpone_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_request.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_request.o[m
[1mdeleted file mode 100644[m
[1mindex 6fd5bf7..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_request.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_request_body.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_request_body.o[m
[1mdeleted file mode 100644[m
[1mindex 189c91f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_request_body.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_script.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_script.o[m
[1mdeleted file mode 100644[m
[1mindex f046cb3..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_script.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_special_response.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_special_response.o[m
[1mdeleted file mode 100644[m
[1mindex d8e4011..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_special_response.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_upstream.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_upstream.o[m
[1mdeleted file mode 100644[m
[1mindex b42b8a3..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_upstream.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_upstream_round_robin.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_upstream_round_robin.o[m
[1mdeleted file mode 100644[m
[1mindex 52fcc8a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_upstream_round_robin.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_variables.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_variables.o[m
[1mdeleted file mode 100644[m
[1mindex 1f4aae9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_variables.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_write_filter_module.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_write_filter_module.o[m
[1mdeleted file mode 100644[m
[1mindex cf0f757..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/http/ngx_http_write_filter_module.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_alloc.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_alloc.o[m
[1mdeleted file mode 100644[m
[1mindex 311f205..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_alloc.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_channel.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_channel.o[m
[1mdeleted file mode 100644[m
[1mindex 34b6eff..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_channel.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_daemon.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_daemon.o[m
[1mdeleted file mode 100644[m
[1mindex 39d1e43..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_daemon.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_dlopen.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_dlopen.o[m
[1mdeleted file mode 100644[m
[1mindex d0f723c..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_dlopen.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_errno.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_errno.o[m
[1mdeleted file mode 100644[m
[1mindex 694867f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_errno.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_files.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_files.o[m
[1mdeleted file mode 100644[m
[1mindex 3959504..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_files.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_linux_init.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_linux_init.o[m
[1mdeleted file mode 100644[m
[1mindex 53f1386..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_linux_init.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_linux_sendfile_chain.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_linux_sendfile_chain.o[m
[1mdeleted file mode 100644[m
[1mindex d146616..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_linux_sendfile_chain.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_posix_init.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_posix_init.o[m
[1mdeleted file mode 100644[m
[1mindex 020493a..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_posix_init.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_process.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_process.o[m
[1mdeleted file mode 100644[m
[1mindex c599cdf..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_process.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_process_cycle.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_process_cycle.o[m
[1mdeleted file mode 100644[m
[1mindex 3f18aa9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_process_cycle.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_readv_chain.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_readv_chain.o[m
[1mdeleted file mode 100644[m
[1mindex cd39df9..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_readv_chain.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_recv.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_recv.o[m
[1mdeleted file mode 100644[m
[1mindex 4a46f4b..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_recv.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_send.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_send.o[m
[1mdeleted file mode 100644[m
[1mindex 656be92..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_send.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_setaffinity.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_setaffinity.o[m
[1mdeleted file mode 100644[m
[1mindex 2915dce..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_setaffinity.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_setproctitle.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_setproctitle.o[m
[1mdeleted file mode 100644[m
[1mindex ebed7dc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_setproctitle.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_shmem.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_shmem.o[m
[1mdeleted file mode 100644[m
[1mindex fa13b23..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_shmem.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_socket.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_socket.o[m
[1mdeleted file mode 100644[m
[1mindex 65b38cf..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_socket.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_time.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_time.o[m
[1mdeleted file mode 100644[m
[1mindex 977a8dc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_time.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_udp_recv.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_udp_recv.o[m
[1mdeleted file mode 100644[m
[1mindex a9bd357..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_udp_recv.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_udp_send.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_udp_send.o[m
[1mdeleted file mode 100644[m
[1mindex b87d8cf..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_udp_send.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_user.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_user.o[m
[1mdeleted file mode 100644[m
[1mindex 904b852..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_user.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_writev_chain.o b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_writev_chain.o[m
[1mdeleted file mode 100644[m
[1mindex ed72f46..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/objs/src/os/unix/ngx_writev_chain.o and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.c[m
[1mdeleted file mode 100644[m
[1mindex 60f8fe7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.c[m
[1m+++ /dev/null[m
[36m@@ -1,1542 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_show_version_info(void);[m
[31m-static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_get_options(int argc, char *const *argv);[m
[31m-static ngx_int_t ngx_process_options(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv);[m
[31m-static void *ngx_core_module_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_set_env(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_load_module(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-static void ngx_unload_module(void *data);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_debug_points[] = {[m
[31m-    { ngx_string("stop"), NGX_DEBUG_POINTS_STOP },[m
[31m-    { ngx_string("abort"), NGX_DEBUG_POINTS_ABORT },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("daemon"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, daemon),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("master_process"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, master),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("timer_resolution"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, timer_resolution),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("pid"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, pid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lock_file"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, lock_file),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_processes"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_set_worker_processes,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("debug_points"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, debug_points),[m
[31m-      &ngx_debug_points },[m
[31m-[m
[31m-    { ngx_string("user"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_set_user,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_priority"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_set_priority,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_cpu_affinity"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_set_cpu_affinity,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_rlimit_nofile"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, rlimit_nofile),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_rlimit_core"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, rlimit_core),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("working_directory"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, working_directory),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("env"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_set_env,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("load_module"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_load_module,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_core_module_ctx = {[m
[31m-    ngx_string("core"),[m
[31m-    ngx_core_module_create_conf,[m
[31m-    ngx_core_module_init_conf[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_core_module_ctx,                  /* module context */[m
[31m-    ngx_core_commands,                     /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t   ngx_show_help;[m
[31m-static ngx_uint_t   ngx_show_version;[m
[31m-static ngx_uint_t   ngx_show_configure;[m
[31m-static u_char      *ngx_prefix;[m
[31m-static u_char      *ngx_conf_file;[m
[31m-static u_char      *ngx_conf_params;[m
[31m-static char        *ngx_signal;[m
[31m-[m
[31m-[m
[31m-static char **ngx_os_environ;[m
[31m-[m
[31m-[m
[31m-int ngx_cdecl[m
[31m-main(int argc, char *const *argv)[m
[31m-{[m
[31m-    ngx_buf_t        *b;[m
[31m-    ngx_log_t        *log;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_cycle_t      *cycle, init_cycle;[m
[31m-    ngx_conf_dump_t  *cd;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ngx_debug_init();[m
[31m-[m
[31m-    if (ngx_strerror_init() != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_get_options(argc, argv) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_show_version) {[m
[31m-        ngx_show_version_info();[m
[31m-[m
[31m-        if (!ngx_test_config) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* TODO */ ngx_max_sockets = -1;[m
[31m-[m
[31m-    ngx_time_init();[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_init();[m
[31m-#endif[m
[31m-[m
[31m-    ngx_pid = ngx_getpid();[m
[31m-[m
[31m-    log = ngx_log_init(ngx_prefix);[m
[31m-    if (log == NULL) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* STUB */[m
[31m-#if (NGX_OPENSSL)[m
[31m-    ngx_ssl_init(log);[m
[31m-#endif[m
[31m-[m
[31m-    /*[m
[31m-     * init_cycle->log is required for signal handlers and[m
[31m-     * ngx_process_options()[m
[31m-     */[m
[31m-[m
[31m-    ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));[m
[31m-    init_cycle.log = log;[m
[31m-    ngx_cycle = &init_cycle;[m
[31m-[m
[31m-    init_cycle.pool = ngx_create_pool(1024, log);[m
[31m-    if (init_cycle.pool == NULL) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process_options(&init_cycle) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_os_init(log) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init()[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_crc32_table_init() != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_preinit_modules() != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    cycle = ngx_init_cycle(&init_cycle);[m
[31m-    if (cycle == NULL) {[m
[31m-        if (ngx_test_config) {[m
[31m-            ngx_log_stderr(0, "configuration file %s test failed",[m
[31m-                           init_cycle.conf_file.data);[m
[31m-        }[m
[31m-[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_test_config) {[m
[31m-        if (!ngx_quiet_mode) {[m
[31m-            ngx_log_stderr(0, "configuration file %s test is successful",[m
[31m-                           cycle->conf_file.data);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_dump_config) {[m
[31m-            cd = cycle->config_dump.elts;[m
[31m-[m
[31m-            for (i = 0; i < cycle->config_dump.nelts; i++) {[m
[31m-[m
[31m-                ngx_write_stdout("# configuration file ");[m
[31m-                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,[m
[31m-                                    cd[i].name.len);[m
[31m-                ngx_write_stdout(":" NGX_LINEFEED);[m
[31m-[m
[31m-                b = cd[i].buffer;[m
[31m-[m
[31m-                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);[m
[31m-                ngx_write_stdout(NGX_LINEFEED);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_signal) {[m
[31m-        return ngx_signal_process(cycle, ngx_signal);[m
[31m-    }[m
[31m-[m
[31m-    ngx_os_status(cycle->log);[m
[31m-[m
[31m-    ngx_cycle = cycle;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) {[m
[31m-        ngx_process = NGX_PROCESS_MASTER;[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-    if (ngx_init_signals(cycle->log) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_inherited && ccf->daemon) {[m
[31m-        if (ngx_daemon(cycle->log) != NGX_OK) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_daemonized = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inherited) {[m
[31m-        ngx_daemonized = 1;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_log_redirect_stderr(cycle) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (log->file->fd != ngx_stderr) {[m
[31m-        if (ngx_close_file(log->file->fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_close_file_n " built-in log failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_use_stderr = 0;[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_SINGLE) {[m
[31m-        ngx_single_process_cycle(cycle);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_master_process_cycle(cycle);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_show_version_info(void)[m
[31m-{[m
[31m-    ngx_write_stderr("nginx version: " NGINX_VER_BUILD NGX_LINEFEED);[m
[31m-[m
[31m-    if (ngx_show_help) {[m
[31m-        ngx_write_stderr([m
[31m-            "Usage: nginx [-?hvVtTq] [-s signal] [-c filename] "[m
[31m-                         "[-p prefix] [-g directives]" NGX_LINEFEED[m
[31m-                         NGX_LINEFEED[m
[31m-            "Options:" NGX_LINEFEED[m
[31m-            "  -?,-h         : this help" NGX_LINEFEED[m
[31m-            "  -v            : show version and exit" NGX_LINEFEED[m
[31m-            "  -V            : show version and configure options then exit"[m
[31m-                               NGX_LINEFEED[m
[31m-            "  -t            : test configuration and exit" NGX_LINEFEED[m
[31m-            "  -T            : test configuration, dump it and exit"[m
[31m-                               NGX_LINEFEED[m
[31m-            "  -q            : suppress non-error messages "[m
[31m-                               "during configuration testing" NGX_LINEFEED[m
[31m-            "  -s signal     : send signal to a master process: "[m
[31m-                               "stop, quit, reopen, reload" NGX_LINEFEED[m
[31m-#ifdef NGX_PREFIX[m
[31m-            "  -p prefix     : set prefix path (default: " NGX_PREFIX ")"[m
[31m-                               NGX_LINEFEED[m
[31m-#else[m
[31m-            "  -p prefix     : set prefix path (default: NONE)" NGX_LINEFEED[m
[31m-#endif[m
[31m-            "  -c filename   : set configuration file (default: " NGX_CONF_PATH[m
[31m-                               ")" NGX_LINEFEED[m
[31m-            "  -g directives : set global directives out of configuration "[m
[31m-                               "file" NGX_LINEFEED NGX_LINEFEED[m
[31m-        );[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_show_configure) {[m
[31m-[m
[31m-#ifdef NGX_COMPILER[m
[31m-        ngx_write_stderr("built by " NGX_COMPILER NGX_LINEFEED);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_SSL)[m
[31m-        if (ngx_strcmp(ngx_ssl_version(), OPENSSL_VERSION_TEXT) == 0) {[m
[31m-            ngx_write_stderr("built with " OPENSSL_VERSION_TEXT NGX_LINEFEED);[m
[31m-        } else {[m
[31m-            ngx_write_stderr("built with " OPENSSL_VERSION_TEXT[m
[31m-                             " (running with ");[m
[31m-            ngx_write_stderr((char *) (uintptr_t) ngx_ssl_version());[m
[31m-            ngx_write_stderr(")" NGX_LINEFEED);[m
[31m-        }[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-        ngx_write_stderr("TLS SNI support enabled" NGX_LINEFEED);[m
[31m-#else[m
[31m-        ngx_write_stderr("TLS SNI support disabled" NGX_LINEFEED);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-        ngx_write_stderr("configure arguments:" NGX_CONFIGURE NGX_LINEFEED);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_add_inherited_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_char           *p, *v, *inherited;[m
[31m-    ngx_int_t         s;[m
[31m-    ngx_listening_t  *ls;[m
[31m-[m
[31m-    inherited = (u_char *) getenv(NGINX_VAR);[m
[31m-[m
[31m-    if (inherited == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                  "using inherited sockets from \"%s\"", inherited);[m
[31m-[m
[31m-    if (ngx_array_init(&cycle->listening, cycle->pool, 10,[m
[31m-                       sizeof(ngx_listening_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (p = inherited, v = p; *p; p++) {[m
[31m-        if (*p == ':' || *p == ';') {[m
[31m-            s = ngx_atoi(v, p - v);[m
[31m-            if (s == NGX_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                              "invalid socket number \"%s\" in " NGINX_VAR[m
[31m-                              " environment variable, ignoring the rest"[m
[31m-                              " of the variable", v);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            v = p + 1;[m
[31m-[m
[31m-            ls = ngx_array_push(&cycle->listening);[m
[31m-            if (ls == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(ls, sizeof(ngx_listening_t));[m
[31m-[m
[31m-            ls->fd = (ngx_socket_t) s;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (v != p) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "invalid socket number \"%s\" in " NGINX_VAR[m
[31m-                      " environment variable, ignoring", v);[m
[31m-    }[m
[31m-[m
[31m-    ngx_inherited = 1;[m
[31m-[m
[31m-    return ngx_set_inherited_sockets(cycle);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char **[m
[31m-ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last)[m
[31m-{[m
[31m-    char             **p, **env;[m
[31m-    ngx_str_t         *var;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (last == NULL && ccf->environment) {[m
[31m-        return ccf->environment;[m
[31m-    }[m
[31m-[m
[31m-    var = ccf->env.elts;[m
[31m-[m
[31m-    for (i = 0; i < ccf->env.nelts; i++) {[m
[31m-        if (ngx_strcmp(var[i].data, "TZ") == 0[m
[31m-            || ngx_strncmp(var[i].data, "TZ=", 3) == 0)[m
[31m-        {[m
[31m-            goto tz_found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_array_push(&ccf->env);[m
[31m-    if (var == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    var->len = 2;[m
[31m-    var->data = (u_char *) "TZ";[m
[31m-[m
[31m-    var = ccf->env.elts;[m
[31m-[m
[31m-tz_found:[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < ccf->env.nelts; i++) {[m
[31m-[m
[31m-        if (var[i].data[var[i].len] == '=') {[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for (p = ngx_os_environ; *p; p++) {[m
[31m-[m
[31m-            if (ngx_strncmp(*p, var[i].data, var[i].len) == 0[m
[31m-                && (*p)[var[i].len] == '=')[m
[31m-            {[m
[31m-                n++;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        env = ngx_alloc((*last + n + 1) * sizeof(char *), cycle->log);[m
[31m-        *last = n;[m
[31m-[m
[31m-    } else {[m
[31m-        env = ngx_palloc(cycle->pool, (n + 1) * sizeof(char *));[m
[31m-    }[m
[31m-[m
[31m-    if (env == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < ccf->env.nelts; i++) {[m
[31m-[m
[31m-        if (var[i].data[var[i].len] == '=') {[m
[31m-            env[n++] = (char *) var[i].data;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for (p = ngx_os_environ; *p; p++) {[m
[31m-[m
[31m-            if (ngx_strncmp(*p, var[i].data, var[i].len) == 0[m
[31m-                && (*p)[var[i].len] == '=')[m
[31m-            {[m
[31m-                env[n++] = *p;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    env[n] = NULL;[m
[31m-[m
[31m-    if (last == NULL) {[m
[31m-        ccf->environment = env;[m
[31m-        environ = env;[m
[31m-    }[m
[31m-[m
[31m-    return env;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv)[m
[31m-{[m
[31m-    char             **env, *var;[m
[31m-    u_char            *p;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_pid_t          pid;[m
[31m-    ngx_exec_ctx_t     ctx;[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-    ngx_listening_t   *ls;[m
[31m-[m
[31m-    ngx_memzero(&ctx, sizeof(ngx_exec_ctx_t));[m
[31m-[m
[31m-    ctx.path = argv[0];[m
[31m-    ctx.name = "new binary process";[m
[31m-    ctx.argv = argv;[m
[31m-[m
[31m-    n = 2;[m
[31m-    env = ngx_set_environment(cycle, &n);[m
[31m-    if (env == NULL) {[m
[31m-        return NGX_INVALID_PID;[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_alloc(sizeof(NGINX_VAR)[m
[31m-                    + cycle->listening.nelts * (NGX_INT32_LEN + 1) + 2,[m
[31m-                    cycle->log);[m
[31m-    if (var == NULL) {[m
[31m-        ngx_free(env);[m
[31m-        return NGX_INVALID_PID;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(var, NGINX_VAR "=", sizeof(NGINX_VAR));[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-        p = ngx_sprintf(p, "%ud;", ls[i].fd);[m
[31m-    }[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    env[n++] = var;[m
[31m-[m
[31m-#if (NGX_SETPROCTITLE_USES_ENV)[m
[31m-[m
[31m-    /* allocate the spare 300 bytes for the new binary process title */[m
[31m-[m
[31m-    env[n++] = "SPARE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"[m
[31m-               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"[m
[31m-               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"[m
[31m-               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"[m
[31m-               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    env[n] = NULL;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    char  **e;[m
[31m-    for (e = env; *e; e++) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "env: %s", *e);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx.envp = (char *const *) env;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (ngx_rename_file(ccf->pid.data, ccf->oldpid.data) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      ngx_rename_file_n " %s to %s failed "[m
[31m-                      "before executing new binary process \"%s\"",[m
[31m-                      ccf->pid.data, ccf->oldpid.data, argv[0]);[m
[31m-[m
[31m-        ngx_free(env);[m
[31m-        ngx_free(var);[m
[31m-[m
[31m-        return NGX_INVALID_PID;[m
[31m-    }[m
[31m-[m
[31m-    pid = ngx_execute(cycle, &ctx);[m
[31m-[m
[31m-    if (pid == NGX_INVALID_PID) {[m
[31m-        if (ngx_rename_file(ccf->oldpid.data, ccf->pid.data)[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_rename_file_n " %s back to %s failed after "[m
[31m-                          "an attempt to execute new binary process \"%s\"",[m
[31m-                          ccf->oldpid.data, ccf->pid.data, argv[0]);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(env);[m
[31m-    ngx_free(var);[m
[31m-[m
[31m-    return pid;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_get_options(int argc, char *const *argv)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    ngx_int_t   i;[m
[31m-[m
[31m-    for (i = 1; i < argc; i++) {[m
[31m-[m
[31m-        p = (u_char *) argv[i];[m
[31m-[m
[31m-        if (*p++ != '-') {[m
[31m-            ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        while (*p) {[m
[31m-[m
[31m-            switch (*p++) {[m
[31m-[m
[31m-            case '?':[m
[31m-            case 'h':[m
[31m-                ngx_show_version = 1;[m
[31m-                ngx_show_help = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'v':[m
[31m-                ngx_show_version = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'V':[m
[31m-                ngx_show_version = 1;[m
[31m-                ngx_show_configure = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 't':[m
[31m-                ngx_test_config = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'T':[m
[31m-                ngx_test_config = 1;[m
[31m-                ngx_dump_config = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'q':[m
[31m-                ngx_quiet_mode = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'p':[m
[31m-                if (*p) {[m
[31m-                    ngx_prefix = p;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                if (argv[++i]) {[m
[31m-                    ngx_prefix = (u_char *) argv[i];[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_stderr(0, "option \"-p\" requires directory name");[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            case 'c':[m
[31m-                if (*p) {[m
[31m-                    ngx_conf_file = p;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                if (argv[++i]) {[m
[31m-                    ngx_conf_file = (u_char *) argv[i];[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_stderr(0, "option \"-c\" requires file name");[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            case 'g':[m
[31m-                if (*p) {[m
[31m-                    ngx_conf_params = p;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                if (argv[++i]) {[m
[31m-                    ngx_conf_params = (u_char *) argv[i];[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_stderr(0, "option \"-g\" requires parameter");[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            case 's':[m
[31m-                if (*p) {[m
[31m-                    ngx_signal = (char *) p;[m
[31m-[m
[31m-                } else if (argv[++i]) {[m
[31m-                    ngx_signal = argv[i];[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_log_stderr(0, "option \"-s\" requires parameter");[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strcmp(ngx_signal, "stop") == 0[m
[31m-                    || ngx_strcmp(ngx_signal, "quit") == 0[m
[31m-                    || ngx_strcmp(ngx_signal, "reopen") == 0[m
[31m-                    || ngx_strcmp(ngx_signal, "reload") == 0)[m
[31m-                {[m
[31m-                    ngx_process = NGX_PROCESS_SIGNALLER;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_stderr(0, "invalid option: \"-s %s\"", ngx_signal);[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_stderr(0, "invalid option: \"%c\"", *(p - 1));[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-[m
[31m-    ngx_os_argv = (char **) argv;[m
[31m-    ngx_argc = argc;[m
[31m-    ngx_argv = (char **) argv;[m
[31m-[m
[31m-#else[m
[31m-    size_t     len;[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    ngx_os_argv = (char **) argv;[m
[31m-    ngx_argc = argc;[m
[31m-[m
[31m-    ngx_argv = ngx_alloc((argc + 1) * sizeof(char *), cycle->log);[m
[31m-    if (ngx_argv == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < argc; i++) {[m
[31m-        len = ngx_strlen(argv[i]) + 1;[m
[31m-[m
[31m-        ngx_argv[i] = ngx_alloc(len, cycle->log);[m
[31m-        if (ngx_argv[i] == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_cpystrn((u_char *) ngx_argv[i], (u_char *) argv[i], len);[m
[31m-    }[m
[31m-[m
[31m-    ngx_argv[i] = NULL;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_os_environ = environ;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_process_options(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-    size_t   len;[m
[31m-[m
[31m-    if (ngx_prefix) {[m
[31m-        len = ngx_strlen(ngx_prefix);[m
[31m-        p = ngx_prefix;[m
[31m-[m
[31m-        if (len && !ngx_path_separator(p[len - 1])) {[m
[31m-            p = ngx_pnalloc(cycle->pool, len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(p, ngx_prefix, len);[m
[31m-            p[len++] = '/';[m
[31m-        }[m
[31m-[m
[31m-        cycle->conf_prefix.len = len;[m
[31m-        cycle->conf_prefix.data = p;[m
[31m-        cycle->prefix.len = len;[m
[31m-        cycle->prefix.data = p;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#ifndef NGX_PREFIX[m
[31m-[m
[31m-        p = ngx_pnalloc(cycle->pool, NGX_MAX_PATH);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_getcwd(p, NGX_MAX_PATH) == 0) {[m
[31m-            ngx_log_stderr(ngx_errno, "[emerg]: " ngx_getcwd_n " failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_strlen(p);[m
[31m-[m
[31m-        p[len++] = '/';[m
[31m-[m
[31m-        cycle->conf_prefix.len = len;[m
[31m-        cycle->conf_prefix.data = p;[m
[31m-        cycle->prefix.len = len;[m
[31m-        cycle->prefix.data = p;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#ifdef NGX_CONF_PREFIX[m
[31m-        ngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX);[m
[31m-#else[m
[31m-        ngx_str_set(&cycle->conf_prefix, NGX_PREFIX);[m
[31m-#endif[m
[31m-        ngx_str_set(&cycle->prefix, NGX_PREFIX);[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_file) {[m
[31m-        cycle->conf_file.len = ngx_strlen(ngx_conf_file);[m
[31m-        cycle->conf_file.data = ngx_conf_file;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (p = cycle->conf_file.data + cycle->conf_file.len - 1;[m
[31m-         p > cycle->conf_file.data;[m
[31m-         p--)[m
[31m-    {[m
[31m-        if (ngx_path_separator(*p)) {[m
[31m-            cycle->conf_prefix.len = p - ngx_cycle->conf_file.data + 1;[m
[31m-            cycle->conf_prefix.data = ngx_cycle->conf_file.data;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_params) {[m
[31m-        cycle->conf_param.len = ngx_strlen(ngx_conf_params);[m
[31m-        cycle->conf_param.data = ngx_conf_params;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_test_config) {[m
[31m-        cycle->log->log_level = NGX_LOG_INFO;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_core_module_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = ngx_pcalloc(cycle->pool, sizeof(ngx_core_conf_t));[m
[31m-    if (ccf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc()[m
[31m-     *[m
[31m-     *     ccf->pid = NULL;[m
[31m-     *     ccf->oldpid = NULL;[m
[31m-     *     ccf->priority = 0;[m
[31m-     *     ccf->cpu_affinity_auto = 0;[m
[31m-     *     ccf->cpu_affinity_n = 0;[m
[31m-     *     ccf->cpu_affinity = NULL;[m
[31m-     */[m
[31m-[m
[31m-    ccf->daemon = NGX_CONF_UNSET;[m
[31m-    ccf->master = NGX_CONF_UNSET;[m
[31m-    ccf->timer_resolution = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    ccf->worker_processes = NGX_CONF_UNSET;[m
[31m-    ccf->debug_points = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ccf->rlimit_nofile = NGX_CONF_UNSET;[m
[31m-    ccf->rlimit_core = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ccf->user = (ngx_uid_t) NGX_CONF_UNSET_UINT;[m
[31m-    ccf->group = (ngx_gid_t) NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    if (ngx_array_init(&ccf->env, cycle->pool, 1, sizeof(ngx_str_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return ccf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    ngx_conf_init_value(ccf->daemon, 1);[m
[31m-    ngx_conf_init_value(ccf->master, 1);[m
[31m-    ngx_conf_init_msec_value(ccf->timer_resolution, 0);[m
[31m-[m
[31m-    ngx_conf_init_value(ccf->worker_processes, 1);[m
[31m-    ngx_conf_init_value(ccf->debug_points, 0);[m
[31m-[m
[31m-#if (NGX_HAVE_CPU_AFFINITY)[m
[31m-[m
[31m-    if (!ccf->cpu_affinity_auto[m
[31m-        && ccf->cpu_affinity_n[m
[31m-        && ccf->cpu_affinity_n != 1[m
[31m-        && ccf->cpu_affinity_n != (ngx_uint_t) ccf->worker_processes)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cycle->log, 0,[m
[31m-                      "the number of \"worker_processes\" is not equal to "[m
[31m-                      "the number of \"worker_cpu_affinity\" masks, "[m
[31m-                      "using last mask for remaining worker processes");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-    if (ccf->pid.len == 0) {[m
[31m-        ngx_str_set(&ccf->pid, NGX_PID_PATH);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cycle, &ccf->pid, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccf->oldpid.len = ccf->pid.len + sizeof(NGX_OLDPID_EXT);[m
[31m-[m
[31m-    ccf->oldpid.data = ngx_pnalloc(cycle->pool, ccf->oldpid.len);[m
[31m-    if (ccf->oldpid.data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(ngx_cpymem(ccf->oldpid.data, ccf->pid.data, ccf->pid.len),[m
[31m-               NGX_OLDPID_EXT, sizeof(NGX_OLDPID_EXT));[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-    if (ccf->user == (uid_t) NGX_CONF_UNSET_UINT && geteuid() == 0) {[m
[31m-        struct group   *grp;[m
[31m-        struct passwd  *pwd;[m
[31m-[m
[31m-        ngx_set_errno(0);[m
[31m-        pwd = getpwnam(NGX_USER);[m
[31m-        if (pwd == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "getpwnam(\"" NGX_USER "\") failed");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccf->username = NGX_USER;[m
[31m-        ccf->user = pwd->pw_uid;[m
[31m-[m
[31m-        ngx_set_errno(0);[m
[31m-        grp = getgrnam(NGX_GROUP);[m
[31m-        if (grp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "getgrnam(\"" NGX_GROUP "\") failed");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccf->group = grp->gr_gid;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ccf->lock_file.len == 0) {[m
[31m-        ngx_str_set(&ccf->lock_file, NGX_LOCK_PATH);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cycle, &ccf->lock_file, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    {[m
[31m-    ngx_str_t  lock_file;[m
[31m-[m
[31m-    lock_file = cycle->old_cycle->lock_file;[m
[31m-[m
[31m-    if (lock_file.len) {[m
[31m-        lock_file.len--;[m
[31m-[m
[31m-        if (ccf->lock_file.len != lock_file.len[m
[31m-            || ngx_strncmp(ccf->lock_file.data, lock_file.data, lock_file.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                          "\"lock_file\" could not be changed, ignored");[m
[31m-        }[m
[31m-[m
[31m-        cycle->lock_file.len = lock_file.len + 1;[m
[31m-        lock_file.len += sizeof(".accept");[m
[31m-[m
[31m-        cycle->lock_file.data = ngx_pstrdup(cycle->pool, &lock_file);[m
[31m-        if (cycle->lock_file.data == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cycle->lock_file.len = ccf->lock_file.len + 1;[m
[31m-        cycle->lock_file.data = ngx_pnalloc(cycle->pool,[m
[31m-                                      ccf->lock_file.len + sizeof(".accept"));[m
[31m-        if (cycle->lock_file.data == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(ngx_cpymem(cycle->lock_file.data, ccf->lock_file.data,[m
[31m-                              ccf->lock_file.len),[m
[31m-                   ".accept", sizeof(".accept"));[m
[31m-    }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"user\" is not supported, ignored");[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    char             *group;[m
[31m-    struct passwd    *pwd;[m
[31m-    struct group     *grp;[m
[31m-    ngx_str_t        *value;[m
[31m-[m
[31m-    if (ccf->user != (uid_t) NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (geteuid() != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "the \"user\" directive makes sense only "[m
[31m-                           "if the master process runs "[m
[31m-                           "with super-user privileges, ignored");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ccf->username = (char *) value[1].data;[m
[31m-[m
[31m-    ngx_set_errno(0);[m
[31m-    pwd = getpwnam((const char *) value[1].data);[m
[31m-    if (pwd == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           "getpwnam(\"%s\") failed", value[1].data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccf->user = pwd->pw_uid;[m
[31m-[m
[31m-    group = (char *) ((cf->args->nelts == 2) ? value[1].data : value[2].data);[m
[31m-[m
[31m-    ngx_set_errno(0);[m
[31m-    grp = getgrnam(group);[m
[31m-    if (grp == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           "getgrnam(\"%s\") failed", group);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccf->group = grp->gr_gid;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_env(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    ngx_str_t   *value, *var;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    var = ngx_array_push(&ccf->env);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    *var = value[1];[m
[31m-[m
[31m-    for (i = 0; i < value[1].len; i++) {[m
[31m-[m
[31m-        if (value[1].data[i] == '=') {[m
[31m-[m
[31m-            var->len = i;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_uint_t        n, minus;[m
[31m-[m
[31m-    if (ccf->priority != 0) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].data[0] == '-') {[m
[31m-        n = 1;[m
[31m-        minus = 1;[m
[31m-[m
[31m-    } else if (value[1].data[0] == '+') {[m
[31m-        n = 1;[m
[31m-        minus = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        n = 0;[m
[31m-        minus = 0;[m
[31m-    }[m
[31m-[m
[31m-    ccf->priority = ngx_atoi(&value[1].data[n], value[1].len - n);[m
[31m-    if (ccf->priority == NGX_ERROR) {[m
[31m-        return "invalid number";[m
[31m-    }[m
[31m-[m
[31m-    if (minus) {[m
[31m-        ccf->priority = -ccf->priority;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_HAVE_CPU_AFFINITY)[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    u_char            ch, *p;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_uint_t        i, n;[m
[31m-    ngx_cpuset_t     *mask;[m
[31m-[m
[31m-    if (ccf->cpu_affinity) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    mask = ngx_palloc(cf->pool, (cf->args->nelts - 1) * sizeof(ngx_cpuset_t));[m
[31m-    if (mask == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccf->cpu_affinity_n = cf->args->nelts - 1;[m
[31m-    ccf->cpu_affinity = mask;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "auto") == 0) {[m
[31m-[m
[31m-        if (cf->args->nelts > 3) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid number of arguments in "[m
[31m-                               "\"worker_cpu_affinity\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccf->cpu_affinity_auto = 1;[m
[31m-[m
[31m-        CPU_ZERO(&mask[0]);[m
[31m-        for (i = 0; i < (ngx_uint_t) ngx_min(ngx_ncpu, CPU_SETSIZE); i++) {[m
[31m-            CPU_SET(i, &mask[0]);[m
[31m-        }[m
[31m-[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    for ( /* void */ ; n < cf->args->nelts; n++) {[m
[31m-[m
[31m-        if (value[n].len > CPU_SETSIZE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                         "\"worker_cpu_affinity\" supports up to %d CPUs only",[m
[31m-                         CPU_SETSIZE);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-        CPU_ZERO(&mask[n - 1]);[m
[31m-[m
[31m-        for (p = value[n].data + value[n].len - 1;[m
[31m-             p >= value[n].data;[m
[31m-             p--)[m
[31m-        {[m
[31m-            ch = *p;[m
[31m-[m
[31m-            if (ch == ' ') {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            if (ch == '0') {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '1') {[m
[31m-                CPU_SET(i - 1, &mask[n - 1]);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                          "invalid character \"%c\" in \"worker_cpu_affinity\"",[m
[31m-                          ch);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"worker_cpu_affinity\" is not supported "[m
[31m-                       "on this platform, ignored");[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_cpuset_t *[m
[31m-ngx_get_cpu_affinity(ngx_uint_t n)[m
[31m-{[m
[31m-#if (NGX_HAVE_CPU_AFFINITY)[m
[31m-    ngx_uint_t        i, j;[m
[31m-    ngx_cpuset_t     *mask;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    static ngx_cpuset_t  result;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    if (ccf->cpu_affinity == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->cpu_affinity_auto) {[m
[31m-        mask = &ccf->cpu_affinity[ccf->cpu_affinity_n - 1];[m
[31m-[m
[31m-        for (i = 0, j = n; /* void */ ; i++) {[m
[31m-[m
[31m-            if (CPU_ISSET(i % CPU_SETSIZE, mask) && j-- == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (i == CPU_SETSIZE && j == n) {[m
[31m-                /* empty mask */[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            /* void */[m
[31m-        }[m
[31m-[m
[31m-        CPU_ZERO(&result);[m
[31m-        CPU_SET(i % CPU_SETSIZE, &result);[m
[31m-[m
[31m-        return &result;[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->cpu_affinity_n > n) {[m
[31m-        return &ccf->cpu_affinity[n];[m
[31m-    }[m
[31m-[m
[31m-    return &ccf->cpu_affinity[ccf->cpu_affinity_n - 1];[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    return NULL;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) conf;[m
[31m-[m
[31m-    if (ccf->worker_processes != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "auto") == 0) {[m
[31m-        ccf->worker_processes = ngx_ncpu;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ccf->worker_processes = ngx_atoi(value[1].data, value[1].len);[m
[31m-[m
[31m-    if (ccf->worker_processes == NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_load_module(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-    void                *handle;[m
[31m-    char               **names, **order;[m
[31m-    ngx_str_t           *value, file;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_module_t        *module, **modules;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    if (cf->cycle->modules_used) {[m
[31m-        return "is specified too late";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    file = value[1];[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &file, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->cycle->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    handle = ngx_dlopen(file.data);[m
[31m-    if (handle == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           ngx_dlopen_n " \"%s\" failed (%s)",[m
[31m-                           file.data, ngx_dlerror());[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_unload_module;[m
[31m-    cln->data = handle;[m
[31m-[m
[31m-    modules = ngx_dlsym(handle, "ngx_modules");[m
[31m-    if (modules == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           ngx_dlsym_n " \"%V\", \"%s\" failed (%s)",[m
[31m-                           &value[1], "ngx_modules", ngx_dlerror());[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    names = ngx_dlsym(handle, "ngx_module_names");[m
[31m-    if (names == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           ngx_dlsym_n " \"%V\", \"%s\" failed (%s)",[m
[31m-                           &value[1], "ngx_module_names", ngx_dlerror());[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    order = ngx_dlsym(handle, "ngx_module_order");[m
[31m-[m
[31m-    for (i = 0; modules[i]; i++) {[m
[31m-        module = modules[i];[m
[31m-        module->name = names[i];[m
[31m-[m
[31m-        if (ngx_add_module(cf, &file, module, order) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cf->log, 0, "module: %s i:%ui",[m
[31m-                       module->name, module->index);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "\"load_module\" is not supported "[m
[31m-                       "on this platform");[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-[m
[31m-static void[m
[31m-ngx_unload_module(void *data)[m
[31m-{[m
[31m-    void  *handle = data;[m
[31m-[m
[31m-    if (ngx_dlclose(handle) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      ngx_dlclose_n " failed (%s)", ngx_dlerror());[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.h[m
[1mdeleted file mode 100644[m
[1mindex 24022dd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGINX_H_INCLUDED_[m
[31m-#define _NGINX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define nginx_version      1009015[m
[31m-#define NGINX_VERSION      "1.9.15"[m
[31m-#define NGINX_VER          "openresty/" NGINX_VERSION ".1"[m
[31m-[m
[31m-#ifdef NGX_BUILD[m
[31m-#define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"[m
[31m-#else[m
[31m-#define NGINX_VER_BUILD    NGINX_VER[m
[31m-#endif[m
[31m-[m
[31m-#define NGINX_VAR          "NGINX"[m
[31m-#define NGX_OLDPID_EXT     ".oldbin"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGINX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.h.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.h.orig[m
[1mdeleted file mode 100644[m
[1mindex ba8a9c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/nginx.h.orig[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGINX_H_INCLUDED_[m
[31m-#define _NGINX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define nginx_version      1009015[m
[31m-#define NGINX_VERSION      "1.9.15"[m
[31m-#define NGINX_VER          "nginx/" NGINX_VERSION[m
[31m-[m
[31m-#ifdef NGX_BUILD[m
[31m-#define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"[m
[31m-#else[m
[31m-#define NGINX_VER_BUILD    NGINX_VER[m
[31m-#endif[m
[31m-[m
[31m-#define NGINX_VAR          "NGINX"[m
[31m-#define NGX_OLDPID_EXT     ".oldbin"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGINX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_array.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_array.c[m
[1mdeleted file mode 100644[m
[1mindex 4ea226f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_array.c[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)[m
[31m-{[m
[31m-    ngx_array_t *a;[m
[31m-[m
[31m-    a = ngx_palloc(p, sizeof(ngx_array_t));[m
[31m-    if (a == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(a, p, n, size) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_array_destroy(ngx_array_t *a)[m
[31m-{[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = a->pool;[m
[31m-[m
[31m-    if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {[m
[31m-        p->d.last -= a->size * a->nalloc;[m
[31m-    }[m
[31m-[m
[31m-    if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {[m
[31m-        p->d.last = (u_char *) a;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_array_push(ngx_array_t *a)[m
[31m-{[m
[31m-    void        *elt, *new;[m
[31m-    size_t       size;[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    if (a->nelts == a->nalloc) {[m
[31m-[m
[31m-        /* the array is full */[m
[31m-[m
[31m-        size = a->size * a->nalloc;[m
[31m-[m
[31m-        p = a->pool;[m
[31m-[m
[31m-        if ((u_char *) a->elts + size == p->d.last[m
[31m-            && p->d.last + a->size <= p->d.end)[m
[31m-        {[m
[31m-            /*[m
[31m-             * the array allocation is the last in the pool[m
[31m-             * and there is space for new allocation[m
[31m-             */[m
[31m-[m
[31m-            p->d.last += a->size;[m
[31m-            a->nalloc++;[m
[31m-[m
[31m-        } else {[m
[31m-            /* allocate a new array */[m
[31m-[m
[31m-            new = ngx_palloc(p, 2 * size);[m
[31m-            if (new == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(new, a->elts, size);[m
[31m-            a->elts = new;[m
[31m-            a->nalloc *= 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    elt = (u_char *) a->elts + a->size * a->nelts;[m
[31m-    a->nelts++;[m
[31m-[m
[31m-    return elt;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)[m
[31m-{[m
[31m-    void        *elt, *new;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   nalloc;[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    size = n * a->size;[m
[31m-[m
[31m-    if (a->nelts + n > a->nalloc) {[m
[31m-[m
[31m-        /* the array is full */[m
[31m-[m
[31m-        p = a->pool;[m
[31m-[m
[31m-        if ((u_char *) a->elts + a->size * a->nalloc == p->d.last[m
[31m-            && p->d.last + size <= p->d.end)[m
[31m-        {[m
[31m-            /*[m
[31m-             * the array allocation is the last in the pool[m
[31m-             * and there is space for new allocation[m
[31m-             */[m
[31m-[m
[31m-            p->d.last += size;[m
[31m-            a->nalloc += n;[m
[31m-[m
[31m-        } else {[m
[31m-            /* allocate a new array */[m
[31m-[m
[31m-            nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);[m
[31m-[m
[31m-            new = ngx_palloc(p, nalloc * a->size);[m
[31m-            if (new == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(new, a->elts, a->nelts * a->size);[m
[31m-            a->elts = new;[m
[31m-            a->nalloc = nalloc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    elt = (u_char *) a->elts + a->size * a->nelts;[m
[31m-    a->nelts += n;[m
[31m-[m
[31m-    return elt;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_array.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_array.h[m
[1mdeleted file mode 100644[m
[1mindex a0f2a74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_array.h[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ARRAY_H_INCLUDED_[m
[31m-#define _NGX_ARRAY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void        *elts;[m
[31m-    ngx_uint_t   nelts;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   nalloc;[m
[31m-    ngx_pool_t  *pool;[m
[31m-} ngx_array_t;[m
[31m-[m
[31m-[m
[31m-ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);[m
[31m-void ngx_array_destroy(ngx_array_t *a);[m
[31m-void *ngx_array_push(ngx_array_t *a);[m
[31m-void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)[m
[31m-{[m
[31m-    /*[m
[31m-     * set "array->nelts" before "array->elts", otherwise MSVC thinks[m
[31m-     * that "array->nelts" may be used without having been initialized[m
[31m-     */[m
[31m-[m
[31m-    array->nelts = 0;[m
[31m-    array->size = size;[m
[31m-    array->nalloc = n;[m
[31m-    array->pool = pool;[m
[31m-[m
[31m-    array->elts = ngx_palloc(pool, n * size);[m
[31m-    if (array->elts == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ARRAY_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_buf.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_buf.c[m
[1mdeleted file mode 100644[m
[1mindex 00b6644..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_buf.c[m
[1m+++ /dev/null[m
[36m@@ -1,308 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_buf_t *[m
[31m-ngx_create_temp_buf(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    ngx_buf_t *b;[m
[31m-[m
[31m-    b = ngx_calloc_buf(pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->start = ngx_palloc(pool, size);[m
[31m-    if (b->start == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_calloc_buf():[m
[31m-     *[m
[31m-     *     b->file_pos = 0;[m
[31m-     *     b->file_last = 0;[m
[31m-     *     b->file = NULL;[m
[31m-     *     b->shadow = NULL;[m
[31m-     *     b->tag = 0;[m
[31m-     *     and flags[m
[31m-     */[m
[31m-[m
[31m-    b->pos = b->start;[m
[31m-    b->last = b->start;[m
[31m-    b->end = b->last + size;[m
[31m-    b->temporary = 1;[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_alloc_chain_link(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = pool->chain;[m
[31m-[m
[31m-    if (cl) {[m
[31m-        pool->chain = cl->next;[m
[31m-        return cl;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_palloc(pool, sizeof(ngx_chain_t));[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)[m
[31m-{[m
[31m-    u_char       *p;[m
[31m-    ngx_int_t     i;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *chain, *cl, **ll;[m
[31m-[m
[31m-    p = ngx_palloc(pool, bufs->num * bufs->size);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ll = &chain;[m
[31m-[m
[31m-    for (i = 0; i < bufs->num; i++) {[m
[31m-[m
[31m-        b = ngx_calloc_buf(pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * set by ngx_calloc_buf():[m
[31m-         *[m
[31m-         *     b->file_pos = 0;[m
[31m-         *     b->file_last = 0;[m
[31m-         *     b->file = NULL;[m
[31m-         *     b->shadow = NULL;[m
[31m-         *     b->tag = 0;[m
[31m-         *     and flags[m
[31m-         *[m
[31m-         */[m
[31m-[m
[31m-        b->pos = p;[m
[31m-        b->last = p;[m
[31m-        b->temporary = 1;[m
[31m-[m
[31m-        b->start = p;[m
[31m-        p += bufs->size;[m
[31m-        b->end = p;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    return chain;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t  *cl, **ll;[m
[31m-[m
[31m-    ll = chain;[m
[31m-[m
[31m-    for (cl = *chain; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    while (in) {[m
[31m-        cl = ngx_alloc_chain_link(pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = in->buf;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (*free) {[m
[31m-        cl = *free;[m
[31m-        *free = cl->next;[m
[31m-        cl->next = NULL;[m
[31m-        return cl;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(p);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ngx_calloc_buf(p);[m
[31m-    if (cl->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free, ngx_chain_t **busy,[m
[31m-    ngx_chain_t **out, ngx_buf_tag_t tag)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (*busy == NULL) {[m
[31m-        *busy = *out;[m
[31m-[m
[31m-    } else {[m
[31m-        for (cl = *busy; cl->next; cl = cl->next) { /* void */ }[m
[31m-[m
[31m-        cl->next = *out;[m
[31m-    }[m
[31m-[m
[31m-    *out = NULL;[m
[31m-[m
[31m-    while (*busy) {[m
[31m-        cl = *busy;[m
[31m-[m
[31m-        if (ngx_buf_size(cl->buf) != 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->tag != tag) {[m
[31m-            *busy = cl->next;[m
[31m-            ngx_free_chain(p, cl);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf->pos = cl->buf->start;[m
[31m-        cl->buf->last = cl->buf->start;[m
[31m-[m
[31m-        *busy = cl->next;[m
[31m-        cl->next = *free;[m
[31m-        *free = cl;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-off_t[m
[31m-ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit)[m
[31m-{[m
[31m-    off_t         total, size, aligned, fprev;[m
[31m-    ngx_fd_t      fd;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    total = 0;[m
[31m-[m
[31m-    cl = *in;[m
[31m-    fd = cl->buf->file->fd;[m
[31m-[m
[31m-    do {[m
[31m-        size = cl->buf->file_last - cl->buf->file_pos;[m
[31m-[m
[31m-        if (size > limit - total) {[m
[31m-            size = limit - total;[m
[31m-[m
[31m-            aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)[m
[31m-                       & ~((off_t) ngx_pagesize - 1);[m
[31m-[m
[31m-            if (aligned <= cl->buf->file_last) {[m
[31m-                size = aligned - cl->buf->file_pos;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        total += size;[m
[31m-        fprev = cl->buf->file_pos + size;[m
[31m-        cl = cl->next;[m
[31m-[m
[31m-    } while (cl[m
[31m-             && cl->buf->in_file[m
[31m-             && total < limit[m
[31m-             && fd == cl->buf->file->fd[m
[31m-             && fprev == cl->buf->file_pos);[m
[31m-[m
[31m-    *in = cl;[m
[31m-[m
[31m-    return total;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_chain_update_sent(ngx_chain_t *in, off_t sent)[m
[31m-{[m
[31m-    off_t  size;[m
[31m-[m
[31m-    for ( /* void */ ; in; in = in->next) {[m
[31m-[m
[31m-        if (ngx_buf_special(in->buf)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (sent == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        size = ngx_buf_size(in->buf);[m
[31m-[m
[31m-        if (sent >= size) {[m
[31m-            sent -= size;[m
[31m-[m
[31m-            if (ngx_buf_in_memory(in->buf)) {[m
[31m-                in->buf->pos = in->buf->last;[m
[31m-            }[m
[31m-[m
[31m-            if (in->buf->in_file) {[m
[31m-                in->buf->file_pos = in->buf->file_last;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_in_memory(in->buf)) {[m
[31m-            in->buf->pos += (size_t) sent;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->in_file) {[m
[31m-            in->buf->file_pos += sent;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_buf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_buf.h[m
[1mdeleted file mode 100644[m
[1mindex f652b20..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_buf.h[m
[1m+++ /dev/null[m
[36m@@ -1,176 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_BUF_H_INCLUDED_[m
[31m-#define _NGX_BUF_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef void *            ngx_buf_tag_t;[m
[31m-[m
[31m-typedef struct ngx_buf_s  ngx_buf_t;[m
[31m-[m
[31m-struct ngx_buf_s {[m
[31m-    u_char          *pos;[m
[31m-    u_char          *last;[m
[31m-    off_t            file_pos;[m
[31m-    off_t            file_last;[m
[31m-[m
[31m-    u_char          *start;         /* start of buffer */[m
[31m-    u_char          *end;           /* end of buffer */[m
[31m-    ngx_buf_tag_t    tag;[m
[31m-    ngx_file_t      *file;[m
[31m-    ngx_buf_t       *shadow;[m
[31m-[m
[31m-[m
[31m-    /* the buf's content could be changed */[m
[31m-    unsigned         temporary:1;[m
[31m-[m
[31m-    /*[m
[31m-     * the buf's content is in a memory cache or in a read only memory[m
[31m-     * and must not be changed[m
[31m-     */[m
[31m-    unsigned         memory:1;[m
[31m-[m
[31m-    /* the buf's content is mmap()ed and must not be changed */[m
[31m-    unsigned         mmap:1;[m
[31m-[m
[31m-    unsigned         recycled:1;[m
[31m-    unsigned         in_file:1;[m
[31m-    unsigned         flush:1;[m
[31m-    unsigned         sync:1;[m
[31m-    unsigned         last_buf:1;[m
[31m-    unsigned         last_in_chain:1;[m
[31m-[m
[31m-    unsigned         last_shadow:1;[m
[31m-    unsigned         temp_file:1;[m
[31m-[m
[31m-    /* STUB */ int   num;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_chain_s {[m
[31m-    ngx_buf_t    *buf;[m
[31m-    ngx_chain_t  *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t    num;[m
[31m-    size_t       size;[m
[31m-} ngx_bufs_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_output_chain_ctx_s  ngx_output_chain_ctx_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_output_chain_filter_pt)(void *ctx, ngx_chain_t *in);[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-typedef void (*ngx_output_chain_aio_pt)(ngx_output_chain_ctx_t *ctx,[m
[31m-    ngx_file_t *file);[m
[31m-#endif[m
[31m-[m
[31m-struct ngx_output_chain_ctx_s {[m
[31m-    ngx_buf_t                   *buf;[m
[31m-    ngx_chain_t                 *in;[m
[31m-    ngx_chain_t                 *free;[m
[31m-    ngx_chain_t                 *busy;[m
[31m-[m
[31m-    unsigned                     sendfile:1;[m
[31m-    unsigned                     directio:1;[m
[31m-#if (NGX_HAVE_ALIGNED_DIRECTIO)[m
[31m-    unsigned                     unaligned:1;[m
[31m-#endif[m
[31m-    unsigned                     need_in_memory:1;[m
[31m-    unsigned                     need_in_temp:1;[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    unsigned                     aio:1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-    ngx_output_chain_aio_pt      aio_handler;[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    ssize_t                    (*aio_preload)(ngx_buf_t *file);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_int_t                  (*thread_handler)(ngx_thread_task_t *task,[m
[31m-                                                 ngx_file_t *file);[m
[31m-    ngx_thread_task_t           *thread_task;[m
[31m-#endif[m
[31m-[m
[31m-    off_t                        alignment;[m
[31m-[m
[31m-    ngx_pool_t                  *pool;[m
[31m-    ngx_int_t                    allocated;[m
[31m-    ngx_bufs_t                   bufs;[m
[31m-    ngx_buf_tag_t                tag;[m
[31m-[m
[31m-    ngx_output_chain_filter_pt   output_filter;[m
[31m-    void                        *filter_ctx;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t                 *out;[m
[31m-    ngx_chain_t                **last;[m
[31m-    ngx_connection_t            *connection;[m
[31m-    ngx_pool_t                  *pool;[m
[31m-    off_t                        limit;[m
[31m-} ngx_chain_writer_ctx_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_CHAIN_ERROR     (ngx_chain_t *) NGX_ERROR[m
[31m-[m
[31m-[m
[31m-#define ngx_buf_in_memory(b)        (b->temporary || b->memory || b->mmap)[m
[31m-#define ngx_buf_in_memory_only(b)   (ngx_buf_in_memory(b) && !b->in_file)[m
[31m-[m
[31m-#define ngx_buf_special(b)                                                   \[m
[31m-    ((b->flush || b->last_buf || b->sync)                                    \[m
[31m-     && !ngx_buf_in_memory(b) && !b->in_file)[m
[31m-[m
[31m-#define ngx_buf_sync_only(b)                                                 \[m
[31m-    (b->sync                                                                 \[m
[31m-     && !ngx_buf_in_memory(b) && !b->in_file && !b->flush && !b->last_buf)[m
[31m-[m
[31m-#define ngx_buf_size(b)                                                      \[m
[31m-    (ngx_buf_in_memory(b) ? (off_t) (b->last - b->pos):                      \[m
[31m-                            (b->file_last - b->file_pos))[m
[31m-[m
[31m-ngx_buf_t *ngx_create_temp_buf(ngx_pool_t *pool, size_t size);[m
[31m-ngx_chain_t *ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs);[m
[31m-[m
[31m-[m
[31m-#define ngx_alloc_buf(pool)  ngx_palloc(pool, sizeof(ngx_buf_t))[m
[31m-#define ngx_calloc_buf(pool) ngx_pcalloc(pool, sizeof(ngx_buf_t))[m
[31m-[m
[31m-ngx_chain_t *ngx_alloc_chain_link(ngx_pool_t *pool);[m
[31m-#define ngx_free_chain(pool, cl)                                             \[m
[31m-    cl->next = pool->chain;                                                  \[m
[31m-    pool->chain = cl[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in);[m
[31m-ngx_int_t ngx_chain_writer(void *ctx, ngx_chain_t *in);[m
[31m-[m
[31m-ngx_int_t ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain,[m
[31m-    ngx_chain_t *in);[m
[31m-ngx_chain_t *ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free);[m
[31m-void ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free,[m
[31m-    ngx_chain_t **busy, ngx_chain_t **out, ngx_buf_tag_t tag);[m
[31m-[m
[31m-off_t ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit);[m
[31m-[m
[31m-ngx_chain_t *ngx_chain_update_sent(ngx_chain_t *in, off_t sent);[m
[31m-[m
[31m-#endif /* _NGX_BUF_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_conf_file.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_conf_file.c[m
[1mdeleted file mode 100644[m
[1mindex c60d5fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_conf_file.c[m
[1m+++ /dev/null[m
[36m@@ -1,1444 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#define NGX_CONF_BUFFER  4096[m
[31m-[m
[31m-static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last);[m
[31m-static ngx_int_t ngx_conf_read_token(ngx_conf_t *cf);[m
[31m-static void ngx_conf_flush_files(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_conf_commands[] = {[m
[31m-[m
[31m-    { ngx_string("include"),[m
[31m-      NGX_ANY_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_include,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_conf_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    NULL,                                  /* module context */[m
[31m-    ngx_conf_commands,                     /* module directives */[m
[31m-    NGX_CONF_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    ngx_conf_flush_files,                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* The eight fixed arguments */[m
[31m-[m
[31m-static ngx_uint_t argument_number[] = {[m
[31m-    NGX_CONF_NOARGS,[m
[31m-    NGX_CONF_TAKE1,[m
[31m-    NGX_CONF_TAKE2,[m
[31m-    NGX_CONF_TAKE3,[m
[31m-    NGX_CONF_TAKE4,[m
[31m-    NGX_CONF_TAKE5,[m
[31m-    NGX_CONF_TAKE6,[m
[31m-    NGX_CONF_TAKE7[m
[31m-};[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_param(ngx_conf_t *cf)[m
[31m-{[m
[31m-    char             *rv;[m
[31m-    ngx_str_t        *param;[m
[31m-    ngx_buf_t         b;[m
[31m-    ngx_conf_file_t   conf_file;[m
[31m-[m
[31m-    param = &cf->cycle->conf_param;[m
[31m-[m
[31m-    if (param->len == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&conf_file, sizeof(ngx_conf_file_t));[m
[31m-[m
[31m-    ngx_memzero(&b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    b.start = param->data;[m
[31m-    b.pos = param->data;[m
[31m-    b.last = param->data + param->len;[m
[31m-    b.end = b.last;[m
[31m-    b.temporary = 1;[m
[31m-[m
[31m-    conf_file.file.fd = NGX_INVALID_FILE;[m
[31m-    conf_file.file.name.data = NULL;[m
[31m-    conf_file.line = 0;[m
[31m-[m
[31m-    cf->conf_file = &conf_file;[m
[31m-    cf->conf_file->buffer = &b;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    cf->conf_file = NULL;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)[m
[31m-{[m
[31m-    char             *rv;[m
[31m-    u_char           *p;[m
[31m-    off_t             size;[m
[31m-    ngx_fd_t          fd;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_buf_t         buf, *tbuf;[m
[31m-    ngx_conf_file_t  *prev, conf_file;[m
[31m-    ngx_conf_dump_t  *cd;[m
[31m-    enum {[m
[31m-        parse_file = 0,[m
[31m-        parse_block,[m
[31m-        parse_param[m
[31m-    } type;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    fd = NGX_INVALID_FILE;[m
[31m-    prev = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    if (filename) {[m
[31m-[m
[31m-        /* open configuration file */[m
[31m-[m
[31m-        fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-        if (fd == NGX_INVALID_FILE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_open_file_n " \"%s\" failed",[m
[31m-                               filename->data);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        prev = cf->conf_file;[m
[31m-[m
[31m-        cf->conf_file = &conf_file;[m
[31m-[m
[31m-        if (ngx_fd_info(fd, &cf->conf_file->file.info) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno,[m
[31m-                          ngx_fd_info_n " \"%s\" failed", filename->data);[m
[31m-        }[m
[31m-[m
[31m-        cf->conf_file->buffer = &buf;[m
[31m-[m
[31m-        buf.start = ngx_alloc(NGX_CONF_BUFFER, cf->log);[m
[31m-        if (buf.start == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        buf.pos = buf.start;[m
[31m-        buf.last = buf.start;[m
[31m-        buf.end = buf.last + NGX_CONF_BUFFER;[m
[31m-        buf.temporary = 1;[m
[31m-[m
[31m-        cf->conf_file->file.fd = fd;[m
[31m-        cf->conf_file->file.name.len = filename->len;[m
[31m-        cf->conf_file->file.name.data = filename->data;[m
[31m-        cf->conf_file->file.offset = 0;[m
[31m-        cf->conf_file->file.log = cf->log;[m
[31m-        cf->conf_file->line = 1;[m
[31m-[m
[31m-        type = parse_file;[m
[31m-[m
[31m-        if (ngx_dump_config[m
[31m-#if (NGX_DEBUG)[m
[31m-            || 1[m
[31m-#endif[m
[31m-           )[m
[31m-        {[m
[31m-            p = ngx_pstrdup(cf->cycle->pool, filename);[m
[31m-            if (p == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            size = ngx_file_size(&cf->conf_file->file.info);[m
[31m-[m
[31m-            tbuf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size);[m
[31m-            if (tbuf == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            cd = ngx_array_push(&cf->cycle->config_dump);[m
[31m-            if (cd == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            cd->name.len = filename->len;[m
[31m-            cd->name.data = p;[m
[31m-            cd->buffer = tbuf;[m
[31m-[m
[31m-            cf->conf_file->dump = tbuf;[m
[31m-[m
[31m-        } else {[m
[31m-            cf->conf_file->dump = NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else if (cf->conf_file->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        type = parse_block;[m
[31m-[m
[31m-    } else {[m
[31m-        type = parse_param;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        rc = ngx_conf_read_token(cf);[m
[31m-[m
[31m-        /*[m
[31m-         * ngx_conf_read_token() may return[m
[31m-         *[m
[31m-         *    NGX_ERROR             there is error[m
[31m-         *    NGX_OK                the token terminated by ";" was found[m
[31m-         *    NGX_CONF_BLOCK_START  the token terminated by "{" was found[m
[31m-         *    NGX_CONF_BLOCK_DONE   the "}" was found[m
[31m-         *    NGX_CONF_FILE_DONE    the configuration file is done[m
[31m-         */[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_CONF_BLOCK_DONE) {[m
[31m-[m
[31m-            if (type != parse_block) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected \"}\"");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_CONF_FILE_DONE) {[m
[31m-[m
[31m-            if (type == parse_block) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected end of file, expecting \"}\"");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_CONF_BLOCK_START) {[m
[31m-[m
[31m-            if (type == parse_param) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "block directives are not supported "[m
[31m-                                   "in -g option");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_OK || rc == NGX_CONF_BLOCK_START */[m
[31m-[m
[31m-        if (cf->handler) {[m
[31m-[m
[31m-            /*[m
[31m-             * the custom handler, i.e., that is used in the http's[m
[31m-             * "types { ... }" directive[m
[31m-             */[m
[31m-[m
[31m-            if (rc == NGX_CONF_BLOCK_START) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected \"{\"");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            rv = (*cf->handler)(cf, NULL, cf->handler_conf);[m
[31m-            if (rv == NGX_CONF_OK) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rv == NGX_CONF_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, rv);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        rc = ngx_conf_handler(cf, rc);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc = NGX_ERROR;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (filename) {[m
[31m-        if (cf->conf_file->buffer->start) {[m
[31m-            ngx_free(cf->conf_file->buffer->start);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " %s failed",[m
[31m-                          filename->data);[m
[31m-            rc = NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cf->conf_file = prev;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last)[m
[31m-{[m
[31m-    char           *rv;[m
[31m-    void           *conf, **confp;[m
[31m-    ngx_uint_t      i, found;[m
[31m-    ngx_str_t      *name;[m
[31m-    ngx_command_t  *cmd;[m
[31m-[m
[31m-    name = cf->args->elts;[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-[m
[31m-        cmd = cf->cycle->modules[i]->commands;[m
[31m-        if (cmd == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; cmd->name.len; cmd++) {[m
[31m-[m
[31m-            if (name->len != cmd->name.len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strcmp(name->data, cmd->name.data) != 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            found = 1;[m
[31m-[m
[31m-            if (cf->cycle->modules[i]->type != NGX_CONF_MODULE[m
[31m-                && cf->cycle->modules[i]->type != cf->module_type)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* is the directive's location right ? */[m
[31m-[m
[31m-            if (!(cmd->type & cf->cmd_type)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (!(cmd->type & NGX_CONF_BLOCK) && last != NGX_OK) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                  "directive \"%s\" is not terminated by \";\"",[m
[31m-                                  name->data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if ((cmd->type & NGX_CONF_BLOCK) && last != NGX_CONF_BLOCK_START) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "directive \"%s\" has no opening \"{\"",[m
[31m-                                   name->data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* is the directive's argument count right ? */[m
[31m-[m
[31m-            if (!(cmd->type & NGX_CONF_ANY)) {[m
[31m-[m
[31m-                if (cmd->type & NGX_CONF_FLAG) {[m
[31m-[m
[31m-                    if (cf->args->nelts != 2) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                } else if (cmd->type & NGX_CONF_1MORE) {[m
[31m-[m
[31m-                    if (cf->args->nelts < 2) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                } else if (cmd->type & NGX_CONF_2MORE) {[m
[31m-[m
[31m-                    if (cf->args->nelts < 3) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                } else if (cf->args->nelts > NGX_CONF_MAX_ARGS) {[m
[31m-[m
[31m-                    goto invalid;[m
[31m-[m
[31m-                } else if (!(cmd->type & argument_number[cf->args->nelts - 1]))[m
[31m-                {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            /* set up the directive's configuration context */[m
[31m-[m
[31m-            conf = NULL;[m
[31m-[m
[31m-            if (cmd->type & NGX_DIRECT_CONF) {[m
[31m-                conf = ((void **) cf->ctx)[cf->cycle->modules[i]->index];[m
[31m-[m
[31m-            } else if (cmd->type & NGX_MAIN_CONF) {[m
[31m-                conf = &(((void **) cf->ctx)[cf->cycle->modules[i]->index]);[m
[31m-[m
[31m-            } else if (cf->ctx) {[m
[31m-                confp = *(void **) ((char *) cf->ctx + cmd->conf);[m
[31m-[m
[31m-                if (confp) {[m
[31m-                    conf = confp[cf->cycle->modules[i]->ctx_index];[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            rv = cmd->set(cf, cmd, conf);[m
[31m-[m
[31m-            if (rv == NGX_CONF_OK) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (rv == NGX_CONF_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%s\" directive %s", name->data, rv);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (found) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%s\" directive is not allowed here", name->data);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "unknown directive \"%s\"", name->data);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid number of arguments in \"%s\" directive",[m
[31m-                       name->data);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_conf_read_token(ngx_conf_t *cf)[m
[31m-{[m
[31m-    u_char      *start, ch, *src, *dst;[m
[31m-    off_t        file_size;[m
[31m-    size_t       len;[m
[31m-    ssize_t      n, size;[m
[31m-    ngx_uint_t   found, need_space, last_space, sharp_comment, variable;[m
[31m-    ngx_uint_t   quoted, s_quoted, d_quoted, start_line;[m
[31m-    ngx_str_t   *word;[m
[31m-    ngx_buf_t   *b, *dump;[m
[31m-[m
[31m-    found = 0;[m
[31m-    need_space = 0;[m
[31m-    last_space = 1;[m
[31m-    sharp_comment = 0;[m
[31m-    variable = 0;[m
[31m-    quoted = 0;[m
[31m-    s_quoted = 0;[m
[31m-    d_quoted = 0;[m
[31m-[m
[31m-    cf->args->nelts = 0;[m
[31m-    b = cf->conf_file->buffer;[m
[31m-    dump = cf->conf_file->dump;[m
[31m-    start = b->pos;[m
[31m-    start_line = cf->conf_file->line;[m
[31m-[m
[31m-    file_size = ngx_file_size(&cf->conf_file->file.info);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (b->pos >= b->last) {[m
[31m-[m
[31m-            if (cf->conf_file->file.offset >= file_size) {[m
[31m-[m
[31m-                if (cf->args->nelts > 0 || !last_space) {[m
[31m-[m
[31m-                    if (cf->conf_file->file.fd == NGX_INVALID_FILE) {[m
[31m-                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                           "unexpected end of parameter, "[m
[31m-                                           "expecting \";\"");[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                  "unexpected end of file, "[m
[31m-                                  "expecting \";\" or \"}\"");[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_CONF_FILE_DONE;[m
[31m-            }[m
[31m-[m
[31m-            len = b->pos - start;[m
[31m-[m
[31m-            if (len == NGX_CONF_BUFFER) {[m
[31m-                cf->conf_file->line = start_line;[m
[31m-[m
[31m-                if (d_quoted) {[m
[31m-                    ch = '"';[m
[31m-[m
[31m-                } else if (s_quoted) {[m
[31m-                    ch = '\'';[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "too long parameter \"%*s...\" started",[m
[31m-                                       10, start);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "too long parameter, probably "[m
[31m-                                   "missing terminating \"%c\" character", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                ngx_memmove(b->start, start, len);[m
[31m-            }[m
[31m-[m
[31m-            size = (ssize_t) (file_size - cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (size > b->end - (b->start + len)) {[m
[31m-                size = b->end - (b->start + len);[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_read_file(&cf->conf_file->file, b->start + len, size,[m
[31m-                              cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n != size) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   ngx_read_file_n " returned "[m
[31m-                                   "only %z bytes instead of %z",[m
[31m-                                   n, size);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start + len;[m
[31m-            b->last = b->pos + n;[m
[31m-            start = b->start;[m
[31m-[m
[31m-            if (dump) {[m
[31m-                dump->last = ngx_cpymem(dump->last, b->pos, size);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ch = *b->pos++;[m
[31m-[m
[31m-        if (ch == LF) {[m
[31m-            cf->conf_file->line++;[m
[31m-[m
[31m-            if (sharp_comment) {[m
[31m-                sharp_comment = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (sharp_comment) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (quoted) {[m
[31m-            quoted = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (need_space) {[m
[31m-            if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) {[m
[31m-                last_space = 1;[m
[31m-                need_space = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ';') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '{') {[m
[31m-                return NGX_CONF_BLOCK_START;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ')') {[m
[31m-                last_space = 1;[m
[31m-                need_space = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected \"%c\"", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (last_space) {[m
[31m-            if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            start = b->pos - 1;[m
[31m-            start_line = cf->conf_file->line;[m
[31m-[m
[31m-            switch (ch) {[m
[31m-[m
[31m-            case ';':[m
[31m-            case '{':[m
[31m-                if (cf->args->nelts == 0) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "unexpected \"%c\"", ch);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (ch == '{') {[m
[31m-                    return NGX_CONF_BLOCK_START;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            case '}':[m
[31m-                if (cf->args->nelts != 0) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "unexpected \"}\"");[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_CONF_BLOCK_DONE;[m
[31m-[m
[31m-            case '#':[m
[31m-                sharp_comment = 1;[m
[31m-                continue;[m
[31m-[m
[31m-            case '\\':[m
[31m-                quoted = 1;[m
[31m-                last_space = 0;[m
[31m-                continue;[m
[31m-[m
[31m-            case '"':[m
[31m-                start++;[m
[31m-                d_quoted = 1;[m
[31m-                last_space = 0;[m
[31m-                continue;[m
[31m-[m
[31m-            case '\'':[m
[31m-                start++;[m
[31m-                s_quoted = 1;[m
[31m-                last_space = 0;[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-                last_space = 0;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ch == '{' && variable) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            variable = 0;[m
[31m-[m
[31m-            if (ch == '\\') {[m
[31m-                quoted = 1;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '$') {[m
[31m-                variable = 1;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (d_quoted) {[m
[31m-                if (ch == '"') {[m
[31m-                    d_quoted = 0;[m
[31m-                    need_space = 1;[m
[31m-                    found = 1;[m
[31m-                }[m
[31m-[m
[31m-            } else if (s_quoted) {[m
[31m-                if (ch == '\'') {[m
[31m-                    s_quoted = 0;[m
[31m-                    need_space = 1;[m
[31m-                    found = 1;[m
[31m-                }[m
[31m-[m
[31m-            } else if (ch == ' ' || ch == '\t' || ch == CR || ch == LF[m
[31m-                       || ch == ';' || ch == '{')[m
[31m-            {[m
[31m-                last_space = 1;[m
[31m-                found = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (found) {[m
[31m-                word = ngx_array_push(cf->args);[m
[31m-                if (word == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                word->data = ngx_pnalloc(cf->pool, b->pos - 1 - start + 1);[m
[31m-                if (word->data == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                for (dst = word->data, src = start, len = 0;[m
[31m-                     src < b->pos - 1;[m
[31m-                     len++)[m
[31m-                {[m
[31m-                    if (*src == '\\') {[m
[31m-                        switch (src[1]) {[m
[31m-                        case '"':[m
[31m-                        case '\'':[m
[31m-                        case '\\':[m
[31m-                            src++;[m
[31m-                            break;[m
[31m-[m
[31m-                        case 't':[m
[31m-                            *dst++ = '\t';[m
[31m-                            src += 2;[m
[31m-                            continue;[m
[31m-[m
[31m-                        case 'r':[m
[31m-                            *dst++ = '\r';[m
[31m-                            src += 2;[m
[31m-                            continue;[m
[31m-[m
[31m-                        case 'n':[m
[31m-                            *dst++ = '\n';[m
[31m-                            src += 2;[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                    }[m
[31m-                    *dst++ = *src++;[m
[31m-                }[m
[31m-                *dst = '\0';[m
[31m-                word->len = len;[m
[31m-[m
[31m-                if (ch == ';') {[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                if (ch == '{') {[m
[31m-                    return NGX_CONF_BLOCK_START;[m
[31m-                }[m
[31m-[m
[31m-                found = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_str_t   *value, file, name;[m
[31m-    ngx_glob_t   gl;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    file = value[1];[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (strpbrk((char *) file.data, "*?[") == NULL) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-        return ngx_conf_parse(cf, &file);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&gl, sizeof(ngx_glob_t));[m
[31m-[m
[31m-    gl.pattern = file.data;[m
[31m-    gl.log = cf->log;[m
[31m-    gl.test = 1;[m
[31m-[m
[31m-    if (ngx_open_glob(&gl) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           ngx_open_glob_n " \"%s\" failed", file.data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rv = NGX_CONF_OK;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = ngx_read_glob(&gl, &name);[m
[31m-[m
[31m-        if (n != NGX_OK) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        file.len = name.len++;[m
[31m-        file.data = ngx_pstrdup(cf->pool, &name);[m
[31m-        if (file.data == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-        rv = ngx_conf_parse(cf, &file);[m
[31m-[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_glob(&gl);[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name, ngx_uint_t conf_prefix)[m
[31m-{[m
[31m-    ngx_str_t  *prefix;[m
[31m-[m
[31m-    prefix = conf_prefix ? &cycle->conf_prefix : &cycle->prefix;[m
[31m-[m
[31m-    return ngx_get_full_name(cycle->pool, prefix, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_open_file_t *[m
[31m-ngx_conf_open_file(ngx_cycle_t *cycle, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_str_t         full;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_open_file_t  *file;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    ngx_str_null(&full);[m
[31m-#endif[m
[31m-[m
[31m-    if (name->len) {[m
[31m-        full = *name;[m
[31m-[m
[31m-        if (ngx_conf_full_name(cycle, &full, 0) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        part = &cycle->open_files.part;[m
[31m-        file = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-                part = part->next;[m
[31m-                file = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (full.len != file[i].name.len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strcmp(full.data, file[i].name.data) == 0) {[m
[31m-                return &file[i];[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    file = ngx_list_push(&cycle->open_files);[m
[31m-    if (file == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len) {[m
[31m-        file->fd = NGX_INVALID_FILE;[m
[31m-        file->name = full;[m
[31m-[m
[31m-    } else {[m
[31m-        file->fd = ngx_stderr;[m
[31m-        file->name = *name;[m
[31m-    }[m
[31m-[m
[31m-    file->flush = NULL;[m
[31m-    file->data = NULL;[m
[31m-[m
[31m-    return file;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_conf_flush_files(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_open_file_t  *file;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "flush files");[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].flush) {[m
[31m-            file[i].flush(&file[i], cycle->log);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf, ngx_err_t err,[m
[31m-    const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   errstr[NGX_MAX_CONF_ERRSTR], *p, *last;[m
[31m-    va_list  args;[m
[31m-[m
[31m-    last = errstr + NGX_MAX_CONF_ERRSTR;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(errstr, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    if (err) {[m
[31m-        p = ngx_log_errno(p, last, err);[m
[31m-    }[m
[31m-[m
[31m-    if (cf->conf_file == NULL) {[m
[31m-        ngx_log_error(level, cf->log, 0, "%*s", p - errstr, errstr);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->conf_file->file.fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(level, cf->log, 0, "%*s in command line",[m
[31m-                      p - errstr, errstr);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, cf->log, 0, "%*s in %s:%ui",[m
[31m-                  p - errstr, errstr,[m
[31m-                  cf->conf_file->file.name.data, cf->conf_file->line);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_flag_t       *fp;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    fp = (ngx_flag_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*fp != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcasecmp(value[1].data, (u_char *) "on") == 0) {[m
[31m-        *fp = 1;[m
[31m-[m
[31m-    } else if (ngx_strcasecmp(value[1].data, (u_char *) "off") == 0) {[m
[31m-        *fp = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                     "invalid value \"%s\" in \"%s\" directive, "[m
[31m-                     "it must be \"on\" or \"off\"",[m
[31m-                     value[1].data, cmd->name.data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, fp);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t        *field, *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    field = (ngx_str_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (field->data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *field = value[1];[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, field);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_str_array_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t         *value, *s;[m
[31m-    ngx_array_t      **a;[m
[31m-    ngx_conf_post_t   *post;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NGX_CONF_UNSET_PTR) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = ngx_array_push(*a);[m
[31m-    if (s == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *s = value[1];[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, s);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_keyval_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t         *value;[m
[31m-    ngx_array_t      **a;[m
[31m-    ngx_keyval_t      *kv;[m
[31m-    ngx_conf_post_t   *post;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_keyval_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    kv = ngx_array_push(*a);[m
[31m-    if (kv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    kv->key = value[1];[m
[31m-    kv->value = value[2];[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, kv);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_num_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t        *np;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    np = (ngx_int_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*np != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    *np = ngx_atoi(value[1].data, value[1].len);[m
[31m-    if (*np == NGX_ERROR) {[m
[31m-        return "invalid number";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, np);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    size_t           *sp;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    sp = (size_t *) (p + cmd->offset);[m
[31m-    if (*sp != NGX_CONF_UNSET_SIZE) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *sp = ngx_parse_size(&value[1]);[m
[31m-    if (*sp == (size_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, sp);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_off_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    off_t            *op;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    op = (off_t *) (p + cmd->offset);[m
[31m-    if (*op != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *op = ngx_parse_offset(&value[1]);[m
[31m-    if (*op == (off_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, op);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_msec_t       *msp;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    msp = (ngx_msec_t *) (p + cmd->offset);[m
[31m-    if (*msp != NGX_CONF_UNSET_MSEC) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *msp = ngx_parse_time(&value[1], 0);[m
[31m-    if (*msp == (ngx_msec_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, msp);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_sec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    time_t           *sp;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    sp = (time_t *) (p + cmd->offset);[m
[31m-    if (*sp != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *sp = ngx_parse_time(&value[1], 1);[m
[31m-    if (*sp == (time_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, sp);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char *p = conf;[m
[31m-[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_bufs_t  *bufs;[m
[31m-[m
[31m-[m
[31m-    bufs = (ngx_bufs_t *) (p + cmd->offset);[m
[31m-    if (bufs->num) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    bufs->num = ngx_atoi(value[1].data, value[1].len);[m
[31m-    if (bufs->num == NGX_ERROR || bufs->num == 0) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    bufs->size = ngx_parse_size(&value[2]);[m
[31m-    if (bufs->size == (size_t) NGX_ERROR || bufs->size == 0) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_enum_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_uint_t       *np, i;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_enum_t  *e;[m
[31m-[m
[31m-    np = (ngx_uint_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*np != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    e = cmd->post;[m
[31m-[m
[31m-    for (i = 0; e[i].name.len != 0; i++) {[m
[31m-        if (e[i].name.len != value[1].len[m
[31m-            || ngx_strcasecmp(e[i].name.data, value[1].data) != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *np = e[i].value;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "invalid value \"%s\"", value[1].data);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_bitmask_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_uint_t          *np, i, m;[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_conf_bitmask_t  *mask;[m
[31m-[m
[31m-[m
[31m-    np = (ngx_uint_t *) (p + cmd->offset);[m
[31m-    value = cf->args->elts;[m
[31m-    mask = cmd->post;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        for (m = 0; mask[m].name.len != 0; m++) {[m
[31m-[m
[31m-            if (mask[m].name.len != value[i].len[m
[31m-                || ngx_strcasecmp(mask[m].name.data, value[i].data) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (*np & mask[m].mask) {[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                                   "duplicate value \"%s\"", value[i].data);[m
[31m-[m
[31m-            } else {[m
[31m-                *np |= mask[m].mask;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (mask[m].name.len == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "invalid value \"%s\"", value[i].data);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_unsupported(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return "unsupported on this platform";[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_deprecated(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_conf_deprecated_t  *d = post;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "the \"%s\" directive is deprecated, "[m
[31m-                       "use the \"%s\" directive instead",[m
[31m-                       d->old_name, d->new_name);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_conf_num_bounds_t  *bounds = post;[m
[31m-    ngx_int_t  *np = data;[m
[31m-[m
[31m-    if (bounds->high == -1) {[m
[31m-        if (*np >= bounds->low) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "value must be equal to or greater than %i",[m
[31m-                           bounds->low);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*np >= bounds->low && *np <= bounds->high) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "value must be between %i and %i",[m
[31m-                       bounds->low, bounds->high);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_conf_file.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_conf_file.h[m
[1mdeleted file mode 100644[m
[1mindex 9ccee36..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_conf_file.h[m
[1m+++ /dev/null[m
[36m@@ -1,296 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CONF_FILE_H_INCLUDED_[m
[31m-#define _NGX_CONF_FILE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- *        AAAA  number of arguments[m
[31m- *      FF      command flags[m
[31m- *    TT        command type, i.e. HTTP "location" or "server" command[m
[31m- */[m
[31m-[m
[31m-#define NGX_CONF_NOARGS      0x00000001[m
[31m-#define NGX_CONF_TAKE1       0x00000002[m
[31m-#define NGX_CONF_TAKE2       0x00000004[m
[31m-#define NGX_CONF_TAKE3       0x00000008[m
[31m-#define NGX_CONF_TAKE4       0x00000010[m
[31m-#define NGX_CONF_TAKE5       0x00000020[m
[31m-#define NGX_CONF_TAKE6       0x00000040[m
[31m-#define NGX_CONF_TAKE7       0x00000080[m
[31m-[m
[31m-#define NGX_CONF_MAX_ARGS    8[m
[31m-[m
[31m-#define NGX_CONF_TAKE12      (NGX_CONF_TAKE1|NGX_CONF_TAKE2)[m
[31m-#define NGX_CONF_TAKE13      (NGX_CONF_TAKE1|NGX_CONF_TAKE3)[m
[31m-[m
[31m-#define NGX_CONF_TAKE23      (NGX_CONF_TAKE2|NGX_CONF_TAKE3)[m
[31m-[m
[31m-#define NGX_CONF_TAKE123     (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3)[m
[31m-#define NGX_CONF_TAKE1234    (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3   \[m
[31m-                              |NGX_CONF_TAKE4)[m
[31m-[m
[31m-#define NGX_CONF_ARGS_NUMBER 0x000000ff[m
[31m-#define NGX_CONF_BLOCK       0x00000100[m
[31m-#define NGX_CONF_FLAG        0x00000200[m
[31m-#define NGX_CONF_ANY         0x00000400[m
[31m-#define NGX_CONF_1MORE       0x00000800[m
[31m-#define NGX_CONF_2MORE       0x00001000[m
[31m-#define NGX_CONF_MULTI       0x00000000  /* compatibility */[m
[31m-[m
[31m-#define NGX_DIRECT_CONF      0x00010000[m
[31m-[m
[31m-#define NGX_MAIN_CONF        0x01000000[m
[31m-#define NGX_ANY_CONF         0x1F000000[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define NGX_CONF_UNSET       -1[m
[31m-#define NGX_CONF_UNSET_UINT  (ngx_uint_t) -1[m
[31m-#define NGX_CONF_UNSET_PTR   (void *) -1[m
[31m-#define NGX_CONF_UNSET_SIZE  (size_t) -1[m
[31m-#define NGX_CONF_UNSET_MSEC  (ngx_msec_t) -1[m
[31m-[m
[31m-[m
[31m-#define NGX_CONF_OK          NULL[m
[31m-#define NGX_CONF_ERROR       (void *) -1[m
[31m-[m
[31m-#define NGX_CONF_BLOCK_START 1[m
[31m-#define NGX_CONF_BLOCK_DONE  2[m
[31m-#define NGX_CONF_FILE_DONE   3[m
[31m-[m
[31m-#define NGX_CORE_MODULE      0x45524F43  /* "CORE" */[m
[31m-#define NGX_CONF_MODULE      0x464E4F43  /* "CONF" */[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_CONF_ERRSTR  1024[m
[31m-[m
[31m-[m
[31m-struct ngx_command_s {[m
[31m-    ngx_str_t             name;[m
[31m-    ngx_uint_t            type;[m
[31m-    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-    ngx_uint_t            conf;[m
[31m-    ngx_uint_t            offset;[m
[31m-    void                 *post;[m
[31m-};[m
[31m-[m
[31m-#define ngx_null_command  { ngx_null_string, 0, NULL, 0, 0, NULL }[m
[31m-[m
[31m-[m
[31m-struct ngx_open_file_s {[m
[31m-    ngx_fd_t              fd;[m
[31m-    ngx_str_t             name;[m
[31m-[m
[31m-    void                (*flush)(ngx_open_file_t *file, ngx_log_t *log);[m
[31m-    void                 *data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_file_t            file;[m
[31m-    ngx_buf_t            *buffer;[m
[31m-    ngx_buf_t            *dump;[m
[31m-    ngx_uint_t            line;[m
[31m-} ngx_conf_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t             name;[m
[31m-    ngx_buf_t            *buffer;[m
[31m-} ngx_conf_dump_t;[m
[31m-[m
[31m-[m
[31m-typedef char *(*ngx_conf_handler_pt)(ngx_conf_t *cf,[m
[31m-    ngx_command_t *dummy, void *conf);[m
[31m-[m
[31m-[m
[31m-struct ngx_conf_s {[m
[31m-    char                 *name;[m
[31m-    ngx_array_t          *args;[m
[31m-[m
[31m-    ngx_cycle_t          *cycle;[m
[31m-    ngx_pool_t           *pool;[m
[31m-    ngx_pool_t           *temp_pool;[m
[31m-    ngx_conf_file_t      *conf_file;[m
[31m-    ngx_log_t            *log;[m
[31m-[m
[31m-    void                 *ctx;[m
[31m-    ngx_uint_t            module_type;[m
[31m-    ngx_uint_t            cmd_type;[m
[31m-[m
[31m-    ngx_conf_handler_pt   handler;[m
[31m-    char                 *handler_conf;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef char *(*ngx_conf_post_handler_pt) (ngx_conf_t *cf,[m
[31m-    void *data, void *conf);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_post_handler_pt  post_handler;[m
[31m-} ngx_conf_post_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_post_handler_pt  post_handler;[m
[31m-    char                     *old_name;[m
[31m-    char                     *new_name;[m
[31m-} ngx_conf_deprecated_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_post_handler_pt  post_handler;[m
[31m-    ngx_int_t                 low;[m
[31m-    ngx_int_t                 high;[m
[31m-} ngx_conf_num_bounds_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_uint_t                value;[m
[31m-} ngx_conf_enum_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_CONF_BITMASK_SET  1[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_uint_t                mask;[m
[31m-} ngx_conf_bitmask_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-char * ngx_conf_deprecated(ngx_conf_t *cf, void *post, void *data);[m
[31m-char *ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-[m
[31m-#define ngx_get_conf(conf_ctx, module)  conf_ctx[module.index][m
[31m-[m
[31m-[m
[31m-[m
[31m-#define ngx_conf_init_value(conf, default)                                   \[m
[31m-    if (conf == NGX_CONF_UNSET) {                                            \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_init_ptr_value(conf, default)                               \[m
[31m-    if (conf == NGX_CONF_UNSET_PTR) {                                        \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_init_uint_value(conf, default)                              \[m
[31m-    if (conf == NGX_CONF_UNSET_UINT) {                                       \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_init_size_value(conf, default)                              \[m
[31m-    if (conf == NGX_CONF_UNSET_SIZE) {                                       \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_init_msec_value(conf, default)                              \[m
[31m-    if (conf == NGX_CONF_UNSET_MSEC) {                                       \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_value(conf, prev, default)                            \[m
[31m-    if (conf == NGX_CONF_UNSET) {                                            \[m
[31m-        conf = (prev == NGX_CONF_UNSET) ? default : prev;                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_ptr_value(conf, prev, default)                        \[m
[31m-    if (conf == NGX_CONF_UNSET_PTR) {                                        \[m
[31m-        conf = (prev == NGX_CONF_UNSET_PTR) ? default : prev;                \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_uint_value(conf, prev, default)                       \[m
[31m-    if (conf == NGX_CONF_UNSET_UINT) {                                       \[m
[31m-        conf = (prev == NGX_CONF_UNSET_UINT) ? default : prev;               \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_msec_value(conf, prev, default)                       \[m
[31m-    if (conf == NGX_CONF_UNSET_MSEC) {                                       \[m
[31m-        conf = (prev == NGX_CONF_UNSET_MSEC) ? default : prev;               \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_sec_value(conf, prev, default)                        \[m
[31m-    if (conf == NGX_CONF_UNSET) {                                            \[m
[31m-        conf = (prev == NGX_CONF_UNSET) ? default : prev;                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_size_value(conf, prev, default)                       \[m
[31m-    if (conf == NGX_CONF_UNSET_SIZE) {                                       \[m
[31m-        conf = (prev == NGX_CONF_UNSET_SIZE) ? default : prev;               \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_off_value(conf, prev, default)                        \[m
[31m-    if (conf == NGX_CONF_UNSET) {                                            \[m
[31m-        conf = (prev == NGX_CONF_UNSET) ? default : prev;                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_str_value(conf, prev, default)                        \[m
[31m-    if (conf.data == NULL) {                                                 \[m
[31m-        if (prev.data) {                                                     \[m
[31m-            conf.len = prev.len;                                             \[m
[31m-            conf.data = prev.data;                                           \[m
[31m-        } else {                                                             \[m
[31m-            conf.len = sizeof(default) - 1;                                  \[m
[31m-            conf.data = (u_char *) default;                                  \[m
[31m-        }                                                                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_bufs_value(conf, prev, default_num, default_size)     \[m
[31m-    if (conf.num == 0) {                                                     \[m
[31m-        if (prev.num) {                                                      \[m
[31m-            conf.num = prev.num;                                             \[m
[31m-            conf.size = prev.size;                                           \[m
[31m-        } else {                                                             \[m
[31m-            conf.num = default_num;                                          \[m
[31m-            conf.size = default_size;                                        \[m
[31m-        }                                                                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_bitmask_value(conf, prev, default)                    \[m
[31m-    if (conf == 0) {                                                         \[m
[31m-        conf = (prev == 0) ? default : prev;                                 \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-char *ngx_conf_param(ngx_conf_t *cf);[m
[31m-char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename);[m
[31m-char *ngx_conf_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name,[m
[31m-    ngx_uint_t conf_prefix);[m
[31m-ngx_open_file_t *ngx_conf_open_file(ngx_cycle_t *cycle, ngx_str_t *name);[m
[31m-void ngx_cdecl ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf,[m
[31m-    ngx_err_t err, const char *fmt, ...);[m
[31m-[m
[31m-[m
[31m-char *ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_str_array_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_conf_set_keyval_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_num_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_off_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_sec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_enum_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_bitmask_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CONF_FILE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_config.h[m
[1mdeleted file mode 100644[m
[1mindex a0bfa63..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,132 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_headers.h>[m
[31m-[m
[31m-[m
[31m-#if defined __DragonFly__ && !defined __FreeBSD__[m
[31m-#define __FreeBSD__        4[m
[31m-#define __FreeBSD_version  480101[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_FREEBSD)[m
[31m-#include <ngx_freebsd_config.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_LINUX)[m
[31m-#include <ngx_linux_config.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_SOLARIS)[m
[31m-#include <ngx_solaris_config.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_DARWIN)[m
[31m-#include <ngx_darwin_config.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_WIN32)[m
[31m-#include <ngx_win32_config.h>[m
[31m-[m
[31m-[m
[31m-#else /* POSIX */[m
[31m-#include <ngx_posix_config.h>[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SO_SNDLOWAT[m
[31m-#define NGX_HAVE_SO_SNDLOWAT     1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-#define ngx_signal_helper(n)     SIG##n[m
[31m-#define ngx_signal_value(n)      ngx_signal_helper(n)[m
[31m-[m
[31m-#define ngx_random               random[m
[31m-[m
[31m-/* TODO: #ifndef */[m
[31m-#define NGX_SHUTDOWN_SIGNAL      QUIT[m
[31m-#define NGX_TERMINATE_SIGNAL     TERM[m
[31m-#define NGX_NOACCEPT_SIGNAL      WINCH[m
[31m-#define NGX_RECONFIGURE_SIGNAL   HUP[m
[31m-[m
[31m-#if (NGX_LINUXTHREADS)[m
[31m-#define NGX_REOPEN_SIGNAL        INFO[m
[31m-#define NGX_CHANGEBIN_SIGNAL     XCPU[m
[31m-#else[m
[31m-#define NGX_REOPEN_SIGNAL        USR1[m
[31m-#define NGX_CHANGEBIN_SIGNAL     USR2[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_cdecl[m
[31m-#define ngx_libc_cdecl[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef intptr_t        ngx_int_t;[m
[31m-typedef uintptr_t       ngx_uint_t;[m
[31m-typedef intptr_t        ngx_flag_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_INT32_LEN   (sizeof("-2147483648") - 1)[m
[31m-#define NGX_INT64_LEN   (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-#define NGX_INT_T_LEN   NGX_INT32_LEN[m
[31m-#define NGX_MAX_INT_T_VALUE  2147483647[m
[31m-[m
[31m-#else[m
[31m-#define NGX_INT_T_LEN   NGX_INT64_LEN[m
[31m-#define NGX_MAX_INT_T_VALUE  9223372036854775807[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_ALIGNMENT[m
[31m-#define NGX_ALIGNMENT   sizeof(unsigned long)    /* platform word */[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_align(d, a)     (((d) + (a - 1)) & ~(a - 1))[m
[31m-#define ngx_align_ptr(p, a)                                                   \[m
[31m-    (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))[m
[31m-[m
[31m-[m
[31m-#define ngx_abort       abort[m
[31m-[m
[31m-[m
[31m-/* TODO: platform specific: array[NGX_INVALID_ARRAY_INDEX] must cause SIGSEGV */[m
[31m-#define NGX_INVALID_ARRAY_INDEX 0x80000000[m
[31m-[m
[31m-[m
[31m-/* TODO: auto_conf: ngx_inline   inline __inline __inline__ */[m
[31m-#ifndef ngx_inline[m
[31m-#define ngx_inline      inline[m
[31m-#endif[m
[31m-[m
[31m-#ifndef INADDR_NONE  /* Solaris */[m
[31m-#define INADDR_NONE  ((unsigned int) -1)[m
[31m-#endif[m
[31m-[m
[31m-#ifdef MAXHOSTNAMELEN[m
[31m-#define NGX_MAXHOSTNAMELEN  MAXHOSTNAMELEN[m
[31m-#else[m
[31m-#define NGX_MAXHOSTNAMELEN  256[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_UINT32_VALUE  (uint32_t) 0xffffffff[m
[31m-#define NGX_MAX_INT32_VALUE   (uint32_t) 0x7fffffff[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_connection.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_connection.c[m
[1mdeleted file mode 100644[m
[1mindex 5a53bac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_connection.c[m
[1m+++ /dev/null[m
[36m@@ -1,1402 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ngx_os_io_t  ngx_io;[m
[31m-[m
[31m-[m
[31m-static void ngx_drain_connections(void);[m
[31m-[m
[31m-[m
[31m-ngx_listening_t *[m
[31m-ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)[m
[31m-{[m
[31m-    size_t            len;[m
[31m-    ngx_listening_t  *ls;[m
[31m-    struct sockaddr  *sa;[m
[31m-    u_char            text[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    ls = ngx_array_push(&cf->cycle->listening);[m
[31m-    if (ls == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(ls, sizeof(ngx_listening_t));[m
[31m-[m
[31m-    sa = ngx_palloc(cf->pool, socklen);[m
[31m-    if (sa == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(sa, sockaddr, socklen);[m
[31m-[m
[31m-    ls->sockaddr = sa;[m
[31m-    ls->socklen = socklen;[m
[31m-[m
[31m-    len = ngx_sock_ntop(sa, socklen, text, NGX_SOCKADDR_STRLEN, 1);[m
[31m-    ls->addr_text.len = len;[m
[31m-[m
[31m-    switch (ls->sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;[m
[31m-        break;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        ls->addr_text_max_len = NGX_UNIX_ADDRSTRLEN;[m
[31m-        len++;[m
[31m-        break;[m
[31m-#endif[m
[31m-    case AF_INET:[m
[31m-        ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;[m
[31m-        break;[m
[31m-    default:[m
[31m-        ls->addr_text_max_len = NGX_SOCKADDR_STRLEN;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ls->addr_text.data = ngx_pnalloc(cf->pool, len);[m
[31m-    if (ls->addr_text.data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(ls->addr_text.data, text, len);[m
[31m-[m
[31m-    ls->fd = (ngx_socket_t) -1;[m
[31m-    ls->type = SOCK_STREAM;[m
[31m-[m
[31m-    ls->backlog = NGX_LISTEN_BACKLOG;[m
[31m-    ls->rcvbuf = -1;[m
[31m-    ls->sndbuf = -1;[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    ls->setfib = -1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    ls->fastopen = -1;[m
[31m-#endif[m
[31m-[m
[31m-    return ls;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls)[m
[31m-{[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-    ngx_listening_t   ols;[m
[31m-[m
[31m-    if (!ls->reuseport) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ols = *ls;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    for (n = 1; n < ccf->worker_processes; n++) {[m
[31m-[m
[31m-        /* create a socket for each worker process */[m
[31m-[m
[31m-        ls = ngx_array_push(&cf->cycle->listening);[m
[31m-        if (ls == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *ls = ols;[m
[31m-        ls->worker = n;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_set_inherited_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    size_t                     len;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_listening_t           *ls;[m
[31m-    socklen_t                  olen;[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT || NGX_HAVE_TCP_FASTOPEN)[m
[31m-    ngx_err_t                  err;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-    struct accept_filter_arg   af;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-    int                        timeout;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    int                        reuseport;[m
[31m-#endif[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        ls[i].sockaddr = ngx_palloc(cycle->pool, NGX_SOCKADDRLEN);[m
[31m-        if (ls[i].sockaddr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].socklen = NGX_SOCKADDRLEN;[m
[31m-        if (getsockname(ls[i].fd, ls[i].sockaddr, &ls[i].socklen) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockname() of the inherited "[m
[31m-                          "socket #%d failed", ls[i].fd);[m
[31m-            ls[i].ignore = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (ls[i].sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            ls[i].addr_text_max_len = NGX_INET6_ADDRSTRLEN;[m
[31m-            len = NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            ls[i].addr_text_max_len = NGX_UNIX_ADDRSTRLEN;[m
[31m-            len = NGX_UNIX_ADDRSTRLEN;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        case AF_INET:[m
[31m-            ls[i].addr_text_max_len = NGX_INET_ADDRSTRLEN;[m
[31m-            len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,[m
[31m-                          "the inherited socket #%d has "[m
[31m-                          "an unsupported protocol family", ls[i].fd);[m
[31m-            ls[i].ignore = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].addr_text.data = ngx_pnalloc(cycle->pool, len);[m
[31m-        if (ls[i].addr_text.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_sock_ntop(ls[i].sockaddr, ls[i].socklen,[m
[31m-                            ls[i].addr_text.data, len, 1);[m
[31m-        if (len == 0) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].addr_text.len = len;[m
[31m-[m
[31m-        ls[i].backlog = NGX_LISTEN_BACKLOG;[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_TYPE, (void *) &ls[i].type,[m
[31m-                       &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_TYPE) %V failed", &ls[i].addr_text);[m
[31m-            ls[i].ignore = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF, (void *) &ls[i].rcvbuf,[m
[31m-                       &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_RCVBUF) %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-[m
[31m-            ls[i].rcvbuf = -1;[m
[31m-        }[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_SNDBUF, (void *) &ls[i].sndbuf,[m
[31m-                       &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_SNDBUF) %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-[m
[31m-            ls[i].sndbuf = -1;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        /* SO_SETFIB is currently a set only option */[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB,[m
[31m-                       (void *) &ls[i].setfib, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_SETFIB) %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-[m
[31m-            ls[i].setfib = -1;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-        reuseport = 0;[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT,[m
[31m-                       (void *) &reuseport, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_REUSEPORT) %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-[m
[31m-        } else {[m
[31m-            ls[i].reuseport = reuseport ? 1 : 0;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (ls[i].type != SOCK_STREAM) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, IPPROTO_TCP, TCP_FASTOPEN,[m
[31m-                       (void *) &ls[i].fastopen, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err != NGX_EOPNOTSUPP && err != NGX_ENOPROTOOPT) {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, cycle->log, err,[m
[31m-                              "getsockopt(TCP_FASTOPEN) %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-[m
[31m-            ls[i].fastopen = -1;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-[m
[31m-        ngx_memzero(&af, sizeof(struct accept_filter_arg));[m
[31m-        olen = sizeof(struct accept_filter_arg);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, &af, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err == NGX_EINVAL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, err,[m
[31m-                          "getsockopt(SO_ACCEPTFILTER) for %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (olen < sizeof(struct accept_filter_arg) || af.af_name[0] == '\0') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].accept_filter = ngx_palloc(cycle->pool, 16);[m
[31m-        if (ls[i].accept_filter == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_cpystrn((u_char *) ls[i].accept_filter,[m
[31m-                           (u_char *) af.af_name, 16);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-[m
[31m-        timeout = 0;[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &timeout, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err == NGX_EOPNOTSUPP) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, err,[m
[31m-                          "getsockopt(TCP_DEFER_ACCEPT) for %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (olen < sizeof(int) || timeout == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].deferred_accept = 1;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_listening_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int               reuseaddr;[m
[31m-    ngx_uint_t        i, tries, failed;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_log_t        *log;[m
[31m-    ngx_socket_t      s;[m
[31m-    ngx_listening_t  *ls;[m
[31m-[m
[31m-    reuseaddr = 1;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    failed = 0;[m
[31m-#endif[m
[31m-[m
[31m-    log = cycle->log;[m
[31m-[m
[31m-    /* TODO: configurable try number */[m
[31m-[m
[31m-    for (tries = 5; tries; tries--) {[m
[31m-        failed = 0;[m
[31m-[m
[31m-        /* for each listening socket */[m
[31m-[m
[31m-        ls = cycle->listening.elts;[m
[31m-        for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-            if (ls[i].ignore) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-            if (ls[i].add_reuseport) {[m
[31m-[m
[31m-                /*[m
[31m-                 * to allow transition from a socket without SO_REUSEPORT[m
[31m-                 * to multiple sockets with SO_REUSEPORT, we have to set[m
[31m-                 * SO_REUSEPORT on the old socket before opening new ones[m
[31m-                 */[m
[31m-[m
[31m-                int  reuseport = 1;[m
[31m-[m
[31m-                if (setsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT,[m
[31m-                               (const void *) &reuseport, sizeof(int))[m
[31m-                    == -1)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                                  "setsockopt(SO_REUSEPORT) %V failed, ignored",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                ls[i].add_reuseport = 0;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (ls[i].fd != (ngx_socket_t) -1) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ls[i].inherited) {[m
[31m-[m
[31m-                /* TODO: close on exit */[m
[31m-                /* TODO: nonblocking */[m
[31m-                /* TODO: deferred accept */[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_socket(ls[i].sockaddr->sa_family, ls[i].type, 0);[m
[31m-[m
[31m-            if (s == (ngx_socket_t) -1) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                              ngx_socket_n " %V failed", &ls[i].addr_text);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,[m
[31m-                           (const void *) &reuseaddr, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_REUSEADDR) %V failed",[m
[31m-                              &ls[i].addr_text);[m
[31m-[m
[31m-                if (ngx_close_socket(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-            if (ls[i].reuseport) {[m
[31m-                int  reuseport;[m
[31m-[m
[31m-                reuseport = 1;[m
[31m-[m
[31m-                if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT,[m
[31m-                               (const void *) &reuseport, sizeof(int))[m
[31m-                    == -1)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  "setsockopt(SO_REUSEPORT) %V failed, ignored",[m
[31m-                                  &ls[i].addr_text);[m
[31m-[m
[31m-                    if (ngx_close_socket(s) == -1) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                      ngx_close_socket_n " %V failed",[m
[31m-                                      &ls[i].addr_text);[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-[m
[31m-            if (ls[i].sockaddr->sa_family == AF_INET6) {[m
[31m-                int  ipv6only;[m
[31m-[m
[31m-                ipv6only = ls[i].ipv6only;[m
[31m-[m
[31m-                if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,[m
[31m-                               (const void *) &ipv6only, sizeof(int))[m
[31m-                    == -1)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  "setsockopt(IPV6_V6ONLY) %V failed, ignored",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-            /* TODO: close on exit */[m
[31m-[m
[31m-            if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {[m
[31m-                if (ngx_nonblocking(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  ngx_nonblocking_n " %V failed",[m
[31m-                                  &ls[i].addr_text);[m
[31m-[m
[31m-                    if (ngx_close_socket(s) == -1) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                      ngx_close_socket_n " %V failed",[m
[31m-                                      &ls[i].addr_text);[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                           "bind() %V #%d ", &ls[i].addr_text, s);[m
[31m-[m
[31m-            if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) {[m
[31m-                err = ngx_socket_errno;[m
[31m-[m
[31m-                if (err != NGX_EADDRINUSE || !ngx_test_config) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                                  "bind() to %V failed", &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_close_socket(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                if (err != NGX_EADDRINUSE) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (!ngx_test_config) {[m
[31m-                    failed = 1;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-            if (ls[i].sockaddr->sa_family == AF_UNIX) {[m
[31m-                mode_t   mode;[m
[31m-                u_char  *name;[m
[31m-[m
[31m-                name = ls[i].addr_text.data + sizeof("unix:") - 1;[m
[31m-                mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);[m
[31m-[m
[31m-                if (chmod((char *) name, mode) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                  "chmod() \"%s\" failed", name);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_test_config) {[m
[31m-                    if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                      ngx_delete_file_n " %s failed", name);[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (ls[i].type != SOCK_STREAM) {[m
[31m-                ls[i].fd = s;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (listen(s, ls[i].backlog) == -1) {[m
[31m-                err = ngx_socket_errno;[m
[31m-[m
[31m-                /*[m
[31m-                 * on OpenVZ after suspend/resume EADDRINUSE[m
[31m-                 * may be returned by listen() instead of bind(), see[m
[31m-                 * https://bugzilla.openvz.org/show_bug.cgi?id=2470[m
[31m-                 */[m
[31m-[m
[31m-                if (err != NGX_EADDRINUSE || !ngx_test_config) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                                  "listen() to %V, backlog %d failed",[m
[31m-                                  &ls[i].addr_text, ls[i].backlog);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_close_socket(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                if (err != NGX_EADDRINUSE) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (!ngx_test_config) {[m
[31m-                    failed = 1;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls[i].listen = 1;[m
[31m-[m
[31m-            ls[i].fd = s;[m
[31m-        }[m
[31m-[m
[31m-        if (!failed) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* TODO: delay configurable */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                      "try again to bind() after 500ms");[m
[31m-[m
[31m-        ngx_msleep(500);[m
[31m-    }[m
[31m-[m
[31m-    if (failed) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, 0, "still could not bind()");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_configure_listening_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int                        value;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_listening_t           *ls;[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-    struct accept_filter_arg   af;[m
[31m-#endif[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        ls[i].log = *ls[i].logp;[m
[31m-[m
[31m-        if (ls[i].rcvbuf != -1) {[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF,[m
[31m-                           (const void *) &ls[i].rcvbuf, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_RCVBUF, %d) %V failed, ignored",[m
[31m-                              ls[i].rcvbuf, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].sndbuf != -1) {[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SNDBUF,[m
[31m-                           (const void *) &ls[i].sndbuf, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_SNDBUF, %d) %V failed, ignored",[m
[31m-                              ls[i].sndbuf, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].keepalive) {[m
[31m-            value = (ls[i].keepalive == 1) ? 1 : 0;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_KEEPALIVE,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_KEEPALIVE, %d) %V failed, ignored",[m
[31m-                              value, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-[m
[31m-        if (ls[i].keepidle) {[m
[31m-            value = ls[i].keepidle;[m
[31m-[m
[31m-#if (NGX_KEEPALIVE_FACTOR)[m
[31m-            value *= NGX_KEEPALIVE_FACTOR;[m
[31m-#endif[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPIDLE,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_KEEPIDLE, %d) %V failed, ignored",[m
[31m-                              value, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].keepintvl) {[m
[31m-            value = ls[i].keepintvl;[m
[31m-[m
[31m-#if (NGX_KEEPALIVE_FACTOR)[m
[31m-            value *= NGX_KEEPALIVE_FACTOR;[m
[31m-#endif[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPINTVL,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                             "setsockopt(TCP_KEEPINTVL, %d) %V failed, ignored",[m
[31m-                             value, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].keepcnt) {[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPCNT,[m
[31m-                           (const void *) &ls[i].keepcnt, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_KEEPCNT, %d) %V failed, ignored",[m
[31m-                              ls[i].keepcnt, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        if (ls[i].setfib != -1) {[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB,[m
[31m-                           (const void *) &ls[i].setfib, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_SETFIB, %d) %V failed, ignored",[m
[31m-                              ls[i].setfib, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        if (ls[i].fastopen != -1) {[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_FASTOPEN,[m
[31m-                           (const void *) &ls[i].fastopen, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_FASTOPEN, %d) %V failed, ignored",[m
[31m-                              ls[i].fastopen, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if 0[m
[31m-        if (1) {[m
[31m-            int tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_NODELAY) %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ls[i].listen) {[m
[31m-[m
[31m-            /* change backlog via listen() */[m
[31m-[m
[31m-            if (listen(ls[i].fd, ls[i].backlog) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "listen() to %V, backlog %d failed, ignored",[m
[31m-                              &ls[i].addr_text, ls[i].backlog);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * setting deferred mode should be last operation on socket,[m
[31m-         * because code may prematurely continue cycle on failure[m
[31m-         */[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT)[m
[31m-[m
[31m-#ifdef SO_ACCEPTFILTER[m
[31m-[m
[31m-        if (ls[i].delete_deferred) {[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_ACCEPTFILTER, NULL) "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-[m
[31m-                if (ls[i].accept_filter) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                                  "could not change the accept filter "[m
[31m-                                  "to \"%s\" for %V, ignored",[m
[31m-                                  ls[i].accept_filter, &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls[i].deferred_accept = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].add_deferred) {[m
[31m-            ngx_memzero(&af, sizeof(struct accept_filter_arg));[m
[31m-            (void) ngx_cpystrn((u_char *) af.af_name,[m
[31m-                               (u_char *) ls[i].accept_filter, 16);[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER,[m
[31m-                           &af, sizeof(struct accept_filter_arg))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_ACCEPTFILTER, \"%s\") "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              ls[i].accept_filter, &ls[i].addr_text);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls[i].deferred_accept = 1;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#ifdef TCP_DEFER_ACCEPT[m
[31m-[m
[31m-        if (ls[i].add_deferred || ls[i].delete_deferred) {[m
[31m-[m
[31m-            if (ls[i].add_deferred) {[m
[31m-                /*[m
[31m-                 * There is no way to find out how long a connection was[m
[31m-                 * in queue (and a connection may bypass deferred queue at all[m
[31m-                 * if syncookies were used), hence we use 1 second timeout[m
[31m-                 * here.[m
[31m-                 */[m
[31m-                value = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                value = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT,[m
[31m-                           &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_DEFER_ACCEPT, %d) for %V failed, "[m
[31m-                              "ignored",[m
[31m-                              value, &ls[i].addr_text);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].add_deferred) {[m
[31m-            ls[i].deferred_accept = 1;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_HAVE_DEFERRED_ACCEPT */[m
[31m-[m
[31m-#if (NGX_HAVE_IP_RECVDSTADDR)[m
[31m-[m
[31m-        if (ls[i].wildcard[m
[31m-            && ls[i].type == SOCK_DGRAM[m
[31m-            && ls[i].sockaddr->sa_family == AF_INET)[m
[31m-        {[m
[31m-            value = 1;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_IP, IP_RECVDSTADDR,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(IP_RECVDSTADDR) "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#elif (NGX_HAVE_IP_PKTINFO)[m
[31m-[m
[31m-        if (ls[i].wildcard[m
[31m-            && ls[i].type == SOCK_DGRAM[m
[31m-            && ls[i].sockaddr->sa_family == AF_INET)[m
[31m-        {[m
[31m-            value = 1;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_IP, IP_PKTINFO,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(IP_PKTINFO) "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)[m
[31m-[m
[31m-        if (ls[i].wildcard[m
[31m-            && ls[i].type == SOCK_DGRAM[m
[31m-            && ls[i].sockaddr->sa_family == AF_INET6)[m
[31m-        {[m
[31m-            value = 1;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_IPV6, IPV6_RECVPKTINFO,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(IPV6_RECVPKTINFO) "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_listening_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_accept_mutex_held = 0;[m
[31m-    ngx_use_accept_mutex = 0;[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        c = ls[i].connection;[m
[31m-[m
[31m-        if (c) {[m
[31m-            if (c->read->active) {[m
[31m-                if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {[m
[31m-[m
[31m-                    /*[m
[31m-                     * it seems that Linux-2.6.x OpenVZ sends events[m
[31m-                     * for closed shared listening sockets unless[m
[31m-                     * the events was explicitly deleted[m
[31m-                     */[m
[31m-[m
[31m-                    ngx_del_event(c->read, NGX_READ_EVENT, 0);[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_free_connection(c);[m
[31m-[m
[31m-            c->fd = (ngx_socket_t) -1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "close listening %V #%d ", &ls[i].addr_text, ls[i].fd);[m
[31m-[m
[31m-        if (ngx_close_socket(ls[i].fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " %V failed", &ls[i].addr_text);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-        if (ls[i].sockaddr->sa_family == AF_UNIX[m
[31m-            && ngx_process <= NGX_PROCESS_MASTER[m
[31m-            && ngx_new_binary == 0)[m
[31m-        {[m
[31m-            u_char *name = ls[i].addr_text.data + sizeof("unix:") - 1;[m
[31m-[m
[31m-            if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                              ngx_delete_file_n " %s failed", name);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ls[i].fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    cycle->listening.nelts = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_connection_t *[m
[31m-ngx_get_connection(ngx_socket_t s, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t         instance;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    /* disable warning: Win32 SOCKET is u_int while UNIX socket is int */[m
[31m-[m
[31m-    if (ngx_cycle->files && (ngx_uint_t) s >= ngx_cycle->files_n) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "the new socket has number %d, "[m
[31m-                      "but only %ui files are available",[m
[31m-                      s, ngx_cycle->files_n);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_cycle->free_connections;[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        ngx_drain_connections();[m
[31m-        c = ngx_cycle->free_connections;[m
[31m-    }[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "%ui worker_connections are not enough",[m
[31m-                      ngx_cycle->connection_n);[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cycle->free_connections = c->data;[m
[31m-    ngx_cycle->free_connection_n--;[m
[31m-[m
[31m-    if (ngx_cycle->files && ngx_cycle->files[s] == NULL) {[m
[31m-        ngx_cycle->files[s] = c;[m
[31m-    }[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_memzero(c, sizeof(ngx_connection_t));[m
[31m-[m
[31m-    c->read = rev;[m
[31m-    c->write = wev;[m
[31m-    c->fd = s;[m
[31m-    c->log = log;[m
[31m-[m
[31m-    instance = rev->instance;[m
[31m-[m
[31m-    ngx_memzero(rev, sizeof(ngx_event_t));[m
[31m-    ngx_memzero(wev, sizeof(ngx_event_t));[m
[31m-[m
[31m-    rev->instance = !instance;[m
[31m-    wev->instance = !instance;[m
[31m-[m
[31m-    rev->index = NGX_INVALID_INDEX;[m
[31m-    wev->index = NGX_INVALID_INDEX;[m
[31m-[m
[31m-    rev->data = c;[m
[31m-    wev->data = c;[m
[31m-[m
[31m-    wev->write = 1;[m
[31m-[m
[31m-    return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_free_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    c->data = ngx_cycle->free_connections;[m
[31m-    ngx_cycle->free_connections = c;[m
[31m-    ngx_cycle->free_connection_n++;[m
[31m-[m
[31m-    if (ngx_cycle->files && ngx_cycle->files[c->fd] == c) {[m
[31m-        ngx_cycle->files[c->fd] = NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_uint_t    log_error, level;[m
[31m-    ngx_socket_t  fd;[m
[31m-[m
[31m-    if (c->fd == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "connection already closed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (!c->shared) {[m
[31m-        if (ngx_del_conn) {[m
[31m-            ngx_del_conn(c, NGX_CLOSE_EVENT);[m
[31m-[m
[31m-        } else {[m
[31m-            if (c->read->active || c->read->disabled) {[m
[31m-                ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-[m
[31m-            if (c->write->active || c->write->disabled) {[m
[31m-                ngx_del_event(c->write, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->posted) {[m
[31m-        ngx_delete_posted_event(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->posted) {[m
[31m-        ngx_delete_posted_event(c->write);[m
[31m-    }[m
[31m-[m
[31m-    c->read->closed = 1;[m
[31m-    c->write->closed = 1;[m
[31m-[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    log_error = c->log_error;[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    fd = c->fd;[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (c->shared) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_socket(fd) == -1) {[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_ECONNRESET || err == NGX_ENOTCONN) {[m
[31m-[m
[31m-            switch (log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                level = NGX_LOG_CRIT;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-        }[m
[31m-[m
[31m-        /* we use ngx_cycle->log because c->log was in c->pool */[m
[31m-[m
[31m-        ngx_log_error(level, ngx_cycle->log, err,[m
[31m-                      ngx_close_socket_n " %d failed", fd);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "reusable connection: %ui", reusable);[m
[31m-[m
[31m-    if (c->reusable) {[m
[31m-        ngx_queue_remove(&c->queue);[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_waiting, -1);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    c->reusable = reusable;[m
[31m-[m
[31m-    if (reusable) {[m
[31m-        /* need cast as ngx_cycle is volatile */[m
[31m-[m
[31m-        ngx_queue_insert_head([m
[31m-            (ngx_queue_t *) &ngx_cycle->reusable_connections_queue, &c->queue);[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_waiting, 1);[m
[31m-#endif[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_drain_connections(void)[m
[31m-{[m
[31m-    ngx_int_t          i;[m
[31m-    ngx_queue_t       *q;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    for (i = 0; i < 32; i++) {[m
[31m-        if (ngx_queue_empty(&ngx_cycle->reusable_connections_queue)) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&ngx_cycle->reusable_connections_queue);[m
[31m-        c = ngx_queue_data(q, ngx_connection_t, queue);[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                       "reusing connection");[m
[31m-[m
[31m-        c->close = 1;[m
[31m-        c->read->handler(c->read);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_idle_connections(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = cycle->connections;[m
[31m-[m
[31m-    for (i = 0; i < cycle->connection_n; i++) {[m
[31m-[m
[31m-        /* THREAD: lock */[m
[31m-[m
[31m-        if (c[i].fd != (ngx_socket_t) -1 && c[i].idle) {[m
[31m-            c[i].close = 1;[m
[31m-            c[i].read->handler(c[i].read);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,[m
[31m-    ngx_uint_t port)[m
[31m-{[m
[31m-    socklen_t             len;[m
[31m-    ngx_uint_t            addr;[m
[31m-    u_char                sa[NGX_SOCKADDRLEN];[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t            i;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    addr = 0;[m
[31m-[m
[31m-    if (c->local_socklen) {[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-[m
[31m-            for (i = 0; addr == 0 && i < 16; i++) {[m
[31m-                addr |= sin6->sin6_addr.s6_addr[i];[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            addr = 1;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-            addr = sin->sin_addr.s_addr;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (addr == 0) {[m
[31m-[m
[31m-        len = NGX_SOCKADDRLEN;[m
[31m-[m
[31m-        if (getsockname(c->fd, (struct sockaddr *) &sa, &len) == -1) {[m
[31m-            ngx_connection_error(c, ngx_socket_errno, "getsockname() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->local_sockaddr = ngx_palloc(c->pool, len);[m
[31m-        if (c->local_sockaddr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(c->local_sockaddr, &sa, len);[m
[31m-[m
[31m-        c->local_socklen = len;[m
[31m-    }[m
[31m-[m
[31m-    if (s == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    s->len = ngx_sock_ntop(c->local_sockaddr, c->local_socklen,[m
[31m-                           s->data, s->len, port);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text)[m
[31m-{[m
[31m-    ngx_uint_t  level;[m
[31m-[m
[31m-    /* Winsock may return NGX_ECONNABORTED instead of NGX_ECONNRESET */[m
[31m-[m
[31m-    if ((err == NGX_ECONNRESET[m
[31m-#if (NGX_WIN32)[m
[31m-         || err == NGX_ECONNABORTED[m
[31m-#endif[m
[31m-        ) && c->log_error == NGX_ERROR_IGNORE_ECONNRESET)[m
[31m-    {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-    if (err == NGX_EINVAL && c->log_error == NGX_ERROR_IGNORE_EINVAL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (err == 0[m
[31m-        || err == NGX_ECONNRESET[m
[31m-#if (NGX_WIN32)[m
[31m-        || err == NGX_ECONNABORTED[m
[31m-#else[m
[31m-        || err == NGX_EPIPE[m
[31m-#endif[m
[31m-        || err == NGX_ENOTCONN[m
[31m-        || err == NGX_ETIMEDOUT[m
[31m-        || err == NGX_ECONNREFUSED[m
[31m-        || err == NGX_ENETDOWN[m
[31m-        || err == NGX_ENETUNREACH[m
[31m-        || err == NGX_EHOSTDOWN[m
[31m-        || err == NGX_EHOSTUNREACH)[m
[31m-    {[m
[31m-        switch (c->log_error) {[m
[31m-[m
[31m-        case NGX_ERROR_IGNORE_EINVAL:[m
[31m-        case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-        case NGX_ERROR_INFO:[m
[31m-            level = NGX_LOG_INFO;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            level = NGX_LOG_ERR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        level = NGX_LOG_ALERT;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, c->log, err, text);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_connection.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_connection.h[m
[1mdeleted file mode 100644[m
[1mindex b0d162a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_connection.h[m
[1m+++ /dev/null[m
[36m@@ -1,232 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CONNECTION_H_INCLUDED_[m
[31m-#define _NGX_CONNECTION_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_listening_s  ngx_listening_t;[m
[31m-[m
[31m-struct ngx_listening_s {[m
[31m-    ngx_socket_t        fd;[m
[31m-[m
[31m-    struct sockaddr    *sockaddr;[m
[31m-    socklen_t           socklen;    /* size of sockaddr */[m
[31m-    size_t              addr_text_max_len;[m
[31m-    ngx_str_t           addr_text;[m
[31m-[m
[31m-    int                 type;[m
[31m-[m
[31m-    int                 backlog;[m
[31m-    int                 rcvbuf;[m
[31m-    int                 sndbuf;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    int                 keepidle;[m
[31m-    int                 keepintvl;[m
[31m-    int                 keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-    /* handler of accepted connection */[m
[31m-    ngx_connection_handler_pt   handler;[m
[31m-[m
[31m-    void               *servers;  /* array of ngx_http_in_addr_t, for example */[m
[31m-[m
[31m-    ngx_log_t           log;[m
[31m-    ngx_log_t          *logp;[m
[31m-[m
[31m-    size_t              pool_size;[m
[31m-    /* should be here because of the AcceptEx() preread */[m
[31m-    size_t              post_accept_buffer_size;[m
[31m-    /* should be here because of the deferred accept */[m
[31m-    ngx_msec_t          post_accept_timeout;[m
[31m-[m
[31m-    ngx_listening_t    *previous;[m
[31m-    ngx_connection_t   *connection;[m
[31m-[m
[31m-    ngx_uint_t          worker;[m
[31m-[m
[31m-    unsigned            open:1;[m
[31m-    unsigned            remain:1;[m
[31m-    unsigned            ignore:1;[m
[31m-[m
[31m-    unsigned            bound:1;       /* already bound */[m
[31m-    unsigned            inherited:1;   /* inherited from previous process */[m
[31m-    unsigned            nonblocking_accept:1;[m
[31m-    unsigned            listen:1;[m
[31m-    unsigned            nonblocking:1;[m
[31m-    unsigned            shared:1;    /* shared between threads or processes */[m
[31m-    unsigned            addr_ntop:1;[m
[31m-    unsigned            wildcard:1;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    unsigned            ipv6only:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    unsigned            reuseport:1;[m
[31m-    unsigned            add_reuseport:1;[m
[31m-#endif[m
[31m-    unsigned            keepalive:2;[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT)[m
[31m-    unsigned            deferred_accept:1;[m
[31m-    unsigned            delete_deferred:1;[m
[31m-    unsigned            add_deferred:1;[m
[31m-#ifdef SO_ACCEPTFILTER[m
[31m-    char               *accept_filter;[m
[31m-#endif[m
[31m-#endif[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    int                 setfib;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    int                 fastopen;[m
[31m-#endif[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_ERROR_ALERT = 0,[m
[31m-    NGX_ERROR_ERR,[m
[31m-    NGX_ERROR_INFO,[m
[31m-    NGX_ERROR_IGNORE_ECONNRESET,[m
[31m-    NGX_ERROR_IGNORE_EINVAL[m
[31m-} ngx_connection_log_error_e;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_TCP_NODELAY_UNSET = 0,[m
[31m-    NGX_TCP_NODELAY_SET,[m
[31m-    NGX_TCP_NODELAY_DISABLED[m
[31m-} ngx_connection_tcp_nodelay_e;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_TCP_NOPUSH_UNSET = 0,[m
[31m-    NGX_TCP_NOPUSH_SET,[m
[31m-    NGX_TCP_NOPUSH_DISABLED[m
[31m-} ngx_connection_tcp_nopush_e;[m
[31m-[m
[31m-[m
[31m-#define NGX_LOWLEVEL_BUFFERED  0x0f[m
[31m-#define NGX_SSL_BUFFERED       0x01[m
[31m-#define NGX_HTTP_V2_BUFFERED   0x02[m
[31m-[m
[31m-[m
[31m-struct ngx_connection_s {[m
[31m-    void               *data;[m
[31m-    ngx_event_t        *read;[m
[31m-    ngx_event_t        *write;[m
[31m-[m
[31m-    ngx_socket_t        fd;[m
[31m-[m
[31m-    ngx_recv_pt         recv;[m
[31m-    ngx_send_pt         send;[m
[31m-    ngx_recv_chain_pt   recv_chain;[m
[31m-    ngx_send_chain_pt   send_chain;[m
[31m-[m
[31m-    ngx_listening_t    *listening;[m
[31m-[m
[31m-    off_t               sent;[m
[31m-[m
[31m-    ngx_log_t          *log;[m
[31m-[m
[31m-    ngx_pool_t         *pool;[m
[31m-[m
[31m-    int                 type;[m
[31m-[m
[31m-    struct sockaddr    *sockaddr;[m
[31m-    socklen_t           socklen;[m
[31m-    ngx_str_t           addr_text;[m
[31m-[m
[31m-    ngx_str_t           proxy_protocol_addr;[m
[31m-[m
[31m-#if (NGX_SSL)[m
[31m-    ngx_ssl_connection_t  *ssl;[m
[31m-#endif[m
[31m-[m
[31m-    struct sockaddr    *local_sockaddr;[m
[31m-    socklen_t           local_socklen;[m
[31m-[m
[31m-    ngx_buf_t          *buffer;[m
[31m-[m
[31m-    ngx_queue_t         queue;[m
[31m-[m
[31m-    ngx_atomic_uint_t   number;[m
[31m-[m
[31m-    ngx_uint_t          requests;[m
[31m-[m
[31m-    unsigned            buffered:8;[m
[31m-[m
[31m-    unsigned            log_error:3;     /* ngx_connection_log_error_e */[m
[31m-[m
[31m-    unsigned            unexpected_eof:1;[m
[31m-    unsigned            timedout:1;[m
[31m-    unsigned            error:1;[m
[31m-    unsigned            destroyed:1;[m
[31m-[m
[31m-    unsigned            idle:1;[m
[31m-    unsigned            reusable:1;[m
[31m-    unsigned            close:1;[m
[31m-    unsigned            shared:1;[m
[31m-[m
[31m-    unsigned            sendfile:1;[m
[31m-    unsigned            sndlowat:1;[m
[31m-    unsigned            tcp_nodelay:2;   /* ngx_connection_tcp_nodelay_e */[m
[31m-    unsigned            tcp_nopush:2;    /* ngx_connection_tcp_nopush_e */[m
[31m-[m
[31m-    unsigned            need_last_buf:1;[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-    unsigned            accept_context_updated:1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    unsigned            busy_count:2;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_thread_task_t  *sendfile_task;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define ngx_set_connection_log(c, l)                                         \[m
[31m-                                                                             \[m
[31m-    c->log->file = l->file;                                                  \[m
[31m-    c->log->next = l->next;                                                  \[m
[31m-    c->log->writer = l->writer;                                              \[m
[31m-    c->log->wdata = l->wdata;                                                \[m
[31m-    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {                   \[m
[31m-        c->log->log_level = l->log_level;                                    \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-ngx_listening_t *ngx_create_listening(ngx_conf_t *cf, void *sockaddr,[m
[31m-    socklen_t socklen);[m
[31m-ngx_int_t ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls);[m
[31m-ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle);[m
[31m-void ngx_configure_listening_sockets(ngx_cycle_t *cycle);[m
[31m-void ngx_close_listening_sockets(ngx_cycle_t *cycle);[m
[31m-void ngx_close_connection(ngx_connection_t *c);[m
[31m-void ngx_close_idle_connections(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,[m
[31m-    ngx_uint_t port);[m
[31m-ngx_int_t ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text);[m
[31m-[m
[31m-ngx_connection_t *ngx_get_connection(ngx_socket_t s, ngx_log_t *log);[m
[31m-void ngx_free_connection(ngx_connection_t *c);[m
[31m-[m
[31m-void ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable);[m
[31m-[m
[31m-#endif /* _NGX_CONNECTION_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_core.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_core.h[m
[1mdeleted file mode 100644[m
[1mindex 2819c1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_core.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CORE_H_INCLUDED_[m
[31m-#define _NGX_CORE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_module_s      ngx_module_t;[m
[31m-typedef struct ngx_conf_s        ngx_conf_t;[m
[31m-typedef struct ngx_cycle_s       ngx_cycle_t;[m
[31m-typedef struct ngx_pool_s        ngx_pool_t;[m
[31m-typedef struct ngx_chain_s       ngx_chain_t;[m
[31m-typedef struct ngx_log_s         ngx_log_t;[m
[31m-typedef struct ngx_open_file_s   ngx_open_file_t;[m
[31m-typedef struct ngx_command_s     ngx_command_t;[m
[31m-typedef struct ngx_file_s        ngx_file_t;[m
[31m-typedef struct ngx_event_s       ngx_event_t;[m
[31m-typedef struct ngx_event_aio_s   ngx_event_aio_t;[m
[31m-typedef struct ngx_connection_s  ngx_connection_t;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-typedef struct ngx_thread_task_s  ngx_thread_task_t;[m
[31m-#endif[m
[31m-[m
[31m-typedef void (*ngx_event_handler_pt)(ngx_event_t *ev);[m
[31m-typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-#define  NGX_OK          0[m
[31m-#define  NGX_ERROR      -1[m
[31m-#define  NGX_AGAIN      -2[m
[31m-#define  NGX_BUSY       -3[m
[31m-#define  NGX_DONE       -4[m
[31m-#define  NGX_DECLINED   -5[m
[31m-#define  NGX_ABORT      -6[m
[31m-[m
[31m-[m
[31m-#include <ngx_errno.h>[m
[31m-#include <ngx_atomic.h>[m
[31m-#include <ngx_thread.h>[m
[31m-#include <ngx_rbtree.h>[m
[31m-#include <ngx_time.h>[m
[31m-#include <ngx_socket.h>[m
[31m-#include <ngx_string.h>[m
[31m-#include <ngx_files.h>[m
[31m-#include <ngx_shmem.h>[m
[31m-#include <ngx_process.h>[m
[31m-#include <ngx_user.h>[m
[31m-#include <ngx_dlopen.h>[m
[31m-#include <ngx_parse.h>[m
[31m-#include <ngx_parse_time.h>[m
[31m-#include <ngx_log.h>[m
[31m-#include <ngx_alloc.h>[m
[31m-#include <ngx_palloc.h>[m
[31m-#include <ngx_buf.h>[m
[31m-#include <ngx_queue.h>[m
[31m-#include <ngx_array.h>[m
[31m-#include <ngx_list.h>[m
[31m-#include <ngx_hash.h>[m
[31m-#include <ngx_file.h>[m
[31m-#include <ngx_crc.h>[m
[31m-#include <ngx_crc32.h>[m
[31m-#include <ngx_murmurhash.h>[m
[31m-#if (NGX_PCRE)[m
[31m-#include <ngx_regex.h>[m
[31m-#endif[m
[31m-#include <ngx_radix_tree.h>[m
[31m-#include <ngx_times.h>[m
[31m-#include <ngx_rwlock.h>[m
[31m-#include <ngx_shmtx.h>[m
[31m-#include <ngx_slab.h>[m
[31m-#include <ngx_inet.h>[m
[31m-#include <ngx_cycle.h>[m
[31m-#include <ngx_resolver.h>[m
[31m-#if (NGX_OPENSSL)[m
[31m-#include <ngx_event_openssl.h>[m
[31m-#endif[m
[31m-#include <ngx_process_cycle.h>[m
[31m-#include <ngx_conf_file.h>[m
[31m-#include <ngx_module.h>[m
[31m-#include <ngx_open_file_cache.h>[m
[31m-#include <ngx_os.h>[m
[31m-#include <ngx_connection.h>[m
[31m-#include <ngx_syslog.h>[m
[31m-#include <ngx_proxy_protocol.h>[m
[31m-[m
[31m-[m
[31m-#define LF     (u_char) '\n'[m
[31m-#define CR     (u_char) '\r'[m
[31m-#define CRLF   "\r\n"[m
[31m-[m
[31m-[m
[31m-#define ngx_abs(value)       (((value) >= 0) ? (value) : - (value))[m
[31m-#define ngx_max(val1, val2)  ((val1 < val2) ? (val2) : (val1))[m
[31m-#define ngx_min(val1, val2)  ((val1 > val2) ? (val2) : (val1))[m
[31m-[m
[31m-void ngx_cpuinfo(void);[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-#define NGX_DISABLE_SYMLINKS_OFF        0[m
[31m-#define NGX_DISABLE_SYMLINKS_ON         1[m
[31m-#define NGX_DISABLE_SYMLINKS_NOTOWNER   2[m
[31m-#endif[m
[31m-[m
[31m-#endif /* _NGX_CORE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_core_probe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_core_probe.h[m
[1mdeleted file mode 100644[m
[1mindex 1841df9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_core_probe.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-#ifndef _NGX_CORE_PROBE_H_INCLUDED_[m
[31m-#define _NGX_CORE_PROBE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-[m
[31m-#include <ngx_dtrace_provider.h>[m
[31m-[m
[31m-#define ngx_core_probe_create_pool_done(pool, size)                             \[m
[31m-    NGINX_CREATE_POOL_DONE(pool, size)[m
[31m-[m
[31m-#else /* !(NGX_DTRACE) */[m
[31m-[m
[31m-#define ngx_core_probe_create_pool_done(pool, size)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CORE_PROBE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cpuinfo.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cpuinfo.c[m
[1mdeleted file mode 100644[m
[1mindex 7205319..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cpuinfo.c[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (( __i386__ || __amd64__ ) && ( __GNUC__ || __INTEL_COMPILER ))[m
[31m-[m
[31m-[m
[31m-static ngx_inline void ngx_cpuid(uint32_t i, uint32_t *buf);[m
[31m-[m
[31m-[m
[31m-#if ( __i386__ )[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_cpuid(uint32_t i, uint32_t *buf)[m
[31m-{[m
[31m-[m
[31m-    /*[m
[31m-     * we could not use %ebx as output parameter if gcc builds PIC,[m
[31m-     * and we could not save %ebx on stack, because %esp is used,[m
[31m-     * when the -fomit-frame-pointer optimization is specified.[m
[31m-     */[m
[31m-[m
[31m-    __asm__ ([m
[31m-[m
[31m-    "    mov    %%ebx, %%esi;  "[m
[31m-[m
[31m-    "    cpuid;                "[m
[31m-    "    mov    %%eax, (%1);   "[m
[31m-    "    mov    %%ebx, 4(%1);  "[m
[31m-    "    mov    %%edx, 8(%1);  "[m
[31m-    "    mov    %%ecx, 12(%1); "[m
[31m-[m
[31m-    "    mov    %%esi, %%ebx;  "[m
[31m-[m
[31m-    : : "a" (i), "D" (buf) : "ecx", "edx", "esi", "memory" );[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else /* __amd64__ */[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_cpuid(uint32_t i, uint32_t *buf)[m
[31m-{[m
[31m-    uint32_t  eax, ebx, ecx, edx;[m
[31m-[m
[31m-    __asm__ ([m
[31m-[m
[31m-        "cpuid"[m
[31m-[m
[31m-    : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (i) );[m
[31m-[m
[31m-    buf[0] = eax;[m
[31m-    buf[1] = ebx;[m
[31m-    buf[2] = edx;[m
[31m-    buf[3] = ecx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* auto detect the L2 cache line size of modern and widespread CPUs */[m
[31m-[m
[31m-void[m
[31m-ngx_cpuinfo(void)[m
[31m-{[m
[31m-    u_char    *vendor;[m
[31m-    uint32_t   vbuf[5], cpu[4], model;[m
[31m-[m
[31m-    vbuf[0] = 0;[m
[31m-    vbuf[1] = 0;[m
[31m-    vbuf[2] = 0;[m
[31m-    vbuf[3] = 0;[m
[31m-    vbuf[4] = 0;[m
[31m-[m
[31m-    ngx_cpuid(0, vbuf);[m
[31m-[m
[31m-    vendor = (u_char *) &vbuf[1];[m
[31m-[m
[31m-    if (vbuf[0] == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cpuid(1, cpu);[m
[31m-[m
[31m-    if (ngx_strcmp(vendor, "GenuineIntel") == 0) {[m
[31m-[m
[31m-        switch ((cpu[0] & 0xf00) >> 8) {[m
[31m-[m
[31m-        /* Pentium */[m
[31m-        case 5:[m
[31m-            ngx_cacheline_size = 32;[m
[31m-            break;[m
[31m-[m
[31m-        /* Pentium Pro, II, III */[m
[31m-        case 6:[m
[31m-            ngx_cacheline_size = 32;[m
[31m-[m
[31m-            model = ((cpu[0] & 0xf0000) >> 8) | (cpu[0] & 0xf0);[m
[31m-[m
[31m-            if (model >= 0xd0) {[m
[31m-                /* Intel Core, Core 2, Atom */[m
[31m-                ngx_cacheline_size = 64;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /*[m
[31m-         * Pentium 4, although its cache line size is 64 bytes,[m
[31m-         * it prefetches up to two cache lines during memory read[m
[31m-         */[m
[31m-        case 15:[m
[31m-            ngx_cacheline_size = 128;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_strcmp(vendor, "AuthenticAMD") == 0) {[m
[31m-        ngx_cacheline_size = 64;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_cpuinfo(void)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc.h[m
[1mdeleted file mode 100644[m
[1mindex 35981bc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc.h[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CRC_H_INCLUDED_[m
[31m-#define _NGX_CRC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/* 32-bit crc16 */[m
[31m-[m
[31m-static ngx_inline uint32_t[m
[31m-ngx_crc(u_char *data, size_t len)[m
[31m-{[m
[31m-    uint32_t  sum;[m
[31m-[m
[31m-    for (sum = 0; len; len--) {[m
[31m-[m
[31m-        /*[m
[31m-         * gcc 2.95.2 x86 and icc 7.1.006 compile[m
[31m-         * that operator into the single "rol" opcode,[m
[31m-         * msvc 6.0sp2 compiles it into four opcodes.[m
[31m-         */[m
[31m-        sum = sum >> 1 | sum << 31;[m
[31m-[m
[31m-        sum += *data++;[m
[31m-    }[m
[31m-[m
[31m-    return sum;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CRC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc32.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc32.c[m
[1mdeleted file mode 100644[m
[1mindex a5b4017..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc32.c[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The code and lookup tables are based on the algorithm[m
[31m- * described at http://www.w3.org/TR/PNG/[m
[31m- *[m
[31m- * The 256 element lookup table takes 1024 bytes, and it may be completely[m
[31m- * cached after processing about 30-60 bytes of data.  So for short data[m
[31m- * we use the 16 element lookup table that takes only 64 bytes and align it[m
[31m- * to CPU cache line size.  Of course, the small table adds code inside[m
[31m- * CRC32 loop, but the cache misses overhead is bigger than overhead of[m
[31m- * the additional code.  For example, ngx_crc32_short() of 16 bytes of data[m
[31m- * takes half as much CPU clocks than ngx_crc32_long().[m
[31m- */[m
[31m-[m
[31m-[m
[31m-static uint32_t  ngx_crc32_table16[] = {[m
[31m-    0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,[m
[31m-    0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,[m
[31m-    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,[m
[31m-    0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c[m
[31m-};[m
[31m-[m
[31m-[m
[31m-uint32_t  ngx_crc32_table256[] = {[m
[31m-    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,[m
[31m-    0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,[m
[31m-    0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,[m
[31m-    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,[m
[31m-    0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,[m
[31m-    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,[m
[31m-    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,[m
[31m-    0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,[m
[31m-    0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,[m
[31m-    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,[m
[31m-    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,[m
[31m-    0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,[m
[31m-    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,[m
[31m-    0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,[m
[31m-    0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,[m
[31m-    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,[m
[31m-    0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,[m
[31m-    0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,[m
[31m-    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,[m
[31m-    0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,[m
[31m-    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,[m
[31m-    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,[m
[31m-    0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,[m
[31m-    0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,[m
[31m-    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,[m
[31m-    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,[m
[31m-    0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,[m
[31m-    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,[m
[31m-    0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,[m
[31m-    0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,[m
[31m-    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,[m
[31m-    0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,[m
[31m-    0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,[m
[31m-    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,[m
[31m-    0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,[m
[31m-    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,[m
[31m-    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,[m
[31m-    0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,[m
[31m-    0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,[m
[31m-    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,[m
[31m-    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,[m
[31m-    0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,[m
[31m-    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,[m
[31m-    0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,[m
[31m-    0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,[m
[31m-    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,[m
[31m-    0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,[m
[31m-    0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,[m
[31m-    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,[m
[31m-    0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,[m
[31m-    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,[m
[31m-    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,[m
[31m-    0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,[m
[31m-    0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,[m
[31m-    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,[m
[31m-    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,[m
[31m-    0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,[m
[31m-    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,[m
[31m-    0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,[m
[31m-    0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,[m
[31m-    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,[m
[31m-    0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,[m
[31m-    0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,[m
[31m-    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d[m
[31m-};[m
[31m-[m
[31m-[m
[31m-uint32_t *ngx_crc32_table_short = ngx_crc32_table16;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_crc32_table_init(void)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    if (((uintptr_t) ngx_crc32_table_short[m
[31m-          & ~((uintptr_t) ngx_cacheline_size - 1))[m
[31m-        == (uintptr_t) ngx_crc32_table_short)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_alloc(16 * sizeof(uint32_t) + ngx_cacheline_size, ngx_cycle->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_align_ptr(p, ngx_cacheline_size);[m
[31m-[m
[31m-    ngx_memcpy(p, ngx_crc32_table16, 16 * sizeof(uint32_t));[m
[31m-[m
[31m-    ngx_crc32_table_short = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc32.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc32.h[m
[1mdeleted file mode 100644[m
[1mindex f6d6865..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crc32.h[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CRC32_H_INCLUDED_[m
[31m-#define _NGX_CRC32_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-extern uint32_t  *ngx_crc32_table_short;[m
[31m-extern uint32_t   ngx_crc32_table256[];[m
[31m-[m
[31m-[m
[31m-static ngx_inline uint32_t[m
[31m-ngx_crc32_short(u_char *p, size_t len)[m
[31m-{[m
[31m-    u_char    c;[m
[31m-    uint32_t  crc;[m
[31m-[m
[31m-    crc = 0xffffffff;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        c = *p++;[m
[31m-        crc = ngx_crc32_table_short[(crc ^ (c & 0xf)) & 0xf] ^ (crc >> 4);[m
[31m-        crc = ngx_crc32_table_short[(crc ^ (c >> 4)) & 0xf] ^ (crc >> 4);[m
[31m-    }[m
[31m-[m
[31m-    return crc ^ 0xffffffff;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline uint32_t[m
[31m-ngx_crc32_long(u_char *p, size_t len)[m
[31m-{[m
[31m-    uint32_t  crc;[m
[31m-[m
[31m-    crc = 0xffffffff;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        crc = ngx_crc32_table256[(crc ^ *p++) & 0xff] ^ (crc >> 8);[m
[31m-    }[m
[31m-[m
[31m-    return crc ^ 0xffffffff;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_crc32_init(crc)                                                   \[m
[31m-    crc = 0xffffffff[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_crc32_update(uint32_t *crc, u_char *p, size_t len)[m
[31m-{[m
[31m-    uint32_t  c;[m
[31m-[m
[31m-    c = *crc;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        c = ngx_crc32_table256[(c ^ *p++) & 0xff] ^ (c >> 8);[m
[31m-    }[m
[31m-[m
[31m-    *crc = c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_crc32_final(crc)                                                  \[m
[31m-    crc ^= 0xffffffff[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_crc32_table_init(void);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CRC32_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crypt.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crypt.c[m
[1mdeleted file mode 100644[m
[1mindex 9db74f4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crypt.c[m
[1m+++ /dev/null[m
[36m@@ -1,283 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_crypt.h>[m
[31m-#include <ngx_md5.h>[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-#include <ngx_sha1.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_CRYPT)[m
[31m-[m
[31m-static ngx_int_t ngx_crypt_apr1(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-static ngx_int_t ngx_crypt_plain(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-[m
[31m-static ngx_int_t ngx_crypt_ssha(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-static ngx_int_t ngx_crypt_sha(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_crypt_to64(u_char *p, uint32_t v, size_t n);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    if (ngx_strncmp(salt, "$apr1$", sizeof("$apr1$") - 1) == 0) {[m
[31m-        return ngx_crypt_apr1(pool, key, salt, encrypted);[m
[31m-[m
[31m-    } else if (ngx_strncmp(salt, "{PLAIN}", sizeof("{PLAIN}") - 1) == 0) {[m
[31m-        return ngx_crypt_plain(pool, key, salt, encrypted);[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-    } else if (ngx_strncmp(salt, "{SSHA}", sizeof("{SSHA}") - 1) == 0) {[m
[31m-        return ngx_crypt_ssha(pool, key, salt, encrypted);[m
[31m-[m
[31m-    } else if (ngx_strncmp(salt, "{SHA}", sizeof("{SHA}") - 1) == 0) {[m
[31m-        return ngx_crypt_sha(pool, key, salt, encrypted);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    /* fallback to libc crypt() */[m
[31m-[m
[31m-    return ngx_libc_crypt(pool, key, salt, encrypted);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_crypt_apr1(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    ngx_int_t          n;[m
[31m-    ngx_uint_t         i;[m
[31m-    u_char            *p, *last, final[16];[m
[31m-    size_t             saltlen, keylen;[m
[31m-    ngx_md5_t          md5, ctx1;[m
[31m-[m
[31m-    /* Apache's apr1 crypt is Poul-Henning Kamp's md5 crypt with $apr1$ magic */[m
[31m-[m
[31m-    keylen = ngx_strlen(key);[m
[31m-[m
[31m-    /* true salt: no magic, max 8 chars, stop at first $ */[m
[31m-[m
[31m-    salt += sizeof("$apr1$") - 1;[m
[31m-    last = salt + 8;[m
[31m-    for (p = salt; *p && *p != '$' && p < last; p++) { /* void */ }[m
[31m-    saltlen = p - salt;[m
[31m-[m
[31m-    /* hash key and salt */[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, key, keylen);[m
[31m-    ngx_md5_update(&md5, (u_char *) "$apr1$", sizeof("$apr1$") - 1);[m
[31m-    ngx_md5_update(&md5, salt, saltlen);[m
[31m-[m
[31m-    ngx_md5_init(&ctx1);[m
[31m-    ngx_md5_update(&ctx1, key, keylen);[m
[31m-    ngx_md5_update(&ctx1, salt, saltlen);[m
[31m-    ngx_md5_update(&ctx1, key, keylen);[m
[31m-    ngx_md5_final(final, &ctx1);[m
[31m-[m
[31m-    for (n = keylen; n > 0; n -= 16) {[m
[31m-        ngx_md5_update(&md5, final, n > 16 ? 16 : n);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(final, sizeof(final));[m
[31m-[m
[31m-    for (i = keylen; i; i >>= 1) {[m
[31m-        if (i & 1) {[m
[31m-            ngx_md5_update(&md5, final, 1);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_md5_update(&md5, key, 1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_final(final, &md5);[m
[31m-[m
[31m-    for (i = 0; i < 1000; i++) {[m
[31m-        ngx_md5_init(&ctx1);[m
[31m-[m
[31m-        if (i & 1) {[m
[31m-            ngx_md5_update(&ctx1, key, keylen);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_md5_update(&ctx1, final, 16);[m
[31m-        }[m
[31m-[m
[31m-        if (i % 3) {[m
[31m-            ngx_md5_update(&ctx1, salt, saltlen);[m
[31m-        }[m
[31m-[m
[31m-        if (i % 7) {[m
[31m-            ngx_md5_update(&ctx1, key, keylen);[m
[31m-        }[m
[31m-[m
[31m-        if (i & 1) {[m
[31m-            ngx_md5_update(&ctx1, final, 16);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_md5_update(&ctx1, key, keylen);[m
[31m-        }[m
[31m-[m
[31m-        ngx_md5_final(final, &ctx1);[m
[31m-    }[m
[31m-[m
[31m-    /* output */[m
[31m-[m
[31m-    *encrypted = ngx_pnalloc(pool, sizeof("$apr1$") - 1 + saltlen + 1 + 22 + 1);[m
[31m-    if (*encrypted == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(*encrypted, "$apr1$", sizeof("$apr1$") - 1);[m
[31m-    p = ngx_copy(p, salt, saltlen);[m
[31m-    *p++ = '$';[m
[31m-[m
[31m-    p = ngx_crypt_to64(p, (final[ 0]<<16) | (final[ 6]<<8) | final[12], 4);[m
[31m-    p = ngx_crypt_to64(p, (final[ 1]<<16) | (final[ 7]<<8) | final[13], 4);[m
[31m-    p = ngx_crypt_to64(p, (final[ 2]<<16) | (final[ 8]<<8) | final[14], 4);[m
[31m-    p = ngx_crypt_to64(p, (final[ 3]<<16) | (final[ 9]<<8) | final[15], 4);[m
[31m-    p = ngx_crypt_to64(p, (final[ 4]<<16) | (final[10]<<8) | final[ 5], 4);[m
[31m-    p = ngx_crypt_to64(p, final[11], 2);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_crypt_to64(u_char *p, uint32_t v, size_t n)[m
[31m-{[m
[31m-    static u_char   itoa64[] =[m
[31m-        "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";[m
[31m-[m
[31m-    while (n--) {[m
[31m-        *p++ = itoa64[v & 0x3f];[m
[31m-        v >>= 6;[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_crypt_plain(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    len = ngx_strlen(key);[m
[31m-[m
[31m-    *encrypted = ngx_pnalloc(pool, sizeof("{PLAIN}") - 1 + len + 1);[m
[31m-    if (*encrypted == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(*encrypted, "{PLAIN}", sizeof("{PLAIN}") - 1);[m
[31m-    ngx_memcpy(p, key, len + 1);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_crypt_ssha(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    size_t       len;[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_str_t    encoded, decoded;[m
[31m-    ngx_sha1_t   sha1;[m
[31m-[m
[31m-    /* "{SSHA}" base64(SHA1(key salt) salt) */[m
[31m-[m
[31m-    /* decode base64 salt to find out true salt */[m
[31m-[m
[31m-    encoded.data = salt + sizeof("{SSHA}") - 1;[m
[31m-    encoded.len = ngx_strlen(encoded.data);[m
[31m-[m
[31m-    len = ngx_max(ngx_base64_decoded_length(encoded.len), 20);[m
[31m-[m
[31m-    decoded.data = ngx_pnalloc(pool, len);[m
[31m-    if (decoded.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_decode_base64(&decoded, &encoded);[m
[31m-[m
[31m-    if (rc != NGX_OK || decoded.len < 20) {[m
[31m-        decoded.len = 20;[m
[31m-    }[m
[31m-[m
[31m-    /* update SHA1 from key and salt */[m
[31m-[m
[31m-    ngx_sha1_init(&sha1);[m
[31m-    ngx_sha1_update(&sha1, key, ngx_strlen(key));[m
[31m-    ngx_sha1_update(&sha1, decoded.data + 20, decoded.len - 20);[m
[31m-    ngx_sha1_final(decoded.data, &sha1);[m
[31m-[m
[31m-    /* encode it back to base64 */[m
[31m-[m
[31m-    len = sizeof("{SSHA}") - 1 + ngx_base64_encoded_length(decoded.len) + 1;[m
[31m-[m
[31m-    *encrypted = ngx_pnalloc(pool, len);[m
[31m-    if (*encrypted == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    encoded.data = ngx_cpymem(*encrypted, "{SSHA}", sizeof("{SSHA}") - 1);[m
[31m-    ngx_encode_base64(&encoded, &decoded);[m
[31m-    encoded.data[encoded.len] = '\0';[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_crypt_sha(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    ngx_str_t   encoded, decoded;[m
[31m-    ngx_sha1_t  sha1;[m
[31m-    u_char      digest[20];[m
[31m-[m
[31m-    /* "{SHA}" base64(SHA1(key)) */[m
[31m-[m
[31m-    decoded.len = sizeof(digest);[m
[31m-    decoded.data = digest;[m
[31m-[m
[31m-    ngx_sha1_init(&sha1);[m
[31m-    ngx_sha1_update(&sha1, key, ngx_strlen(key));[m
[31m-    ngx_sha1_final(digest, &sha1);[m
[31m-[m
[31m-    len = sizeof("{SHA}") - 1 + ngx_base64_encoded_length(decoded.len) + 1;[m
[31m-[m
[31m-    *encrypted = ngx_pnalloc(pool, len);[m
[31m-    if (*encrypted == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    encoded.data = ngx_cpymem(*encrypted, "{SHA}", sizeof("{SHA}") - 1);[m
[31m-    ngx_encode_base64(&encoded, &decoded);[m
[31m-    encoded.data[encoded.len] = '\0';[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_HAVE_SHA1 */[m
[31m-[m
[31m-#endif /* NGX_CRYPT */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crypt.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crypt.h[m
[1mdeleted file mode 100644[m
[1mindex 3869114..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_crypt.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CRYPT_H_INCLUDED_[m
[31m-#define _NGX_CRYPT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CRYPT_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cycle.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cycle.c[m
[1mdeleted file mode 100644[m
[1mindex 98599f3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cycle.c[m
[1m+++ /dev/null[m
[36m@@ -1,1343 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_destroy_cycle_pools(ngx_conf_t *conf);[m
[31m-static ngx_int_t ngx_init_zone_pool(ngx_cycle_t *cycle,[m
[31m-    ngx_shm_zone_t *shm_zone);[m
[31m-static ngx_int_t ngx_test_lockfile(u_char *file, ngx_log_t *log);[m
[31m-static void ngx_clean_old_cycles(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-volatile ngx_cycle_t  *ngx_cycle;[m
[31m-ngx_array_t            ngx_old_cycles;[m
[31m-[m
[31m-static ngx_pool_t     *ngx_temp_pool;[m
[31m-static ngx_event_t     ngx_cleaner_event;[m
[31m-[m
[31m-ngx_uint_t             ngx_test_config;[m
[31m-ngx_uint_t             ngx_dump_config;[m
[31m-ngx_uint_t             ngx_quiet_mode;[m
[31m-[m
[31m-[m
[31m-/* STUB NAME */[m
[31m-static ngx_connection_t  dumb;[m
[31m-/* STUB */[m
[31m-[m
[31m-[m
[31m-ngx_cycle_t *[m
[31m-ngx_init_cycle(ngx_cycle_t *old_cycle)[m
[31m-{[m
[31m-    void                *rv;[m
[31m-    char               **senv, **env;[m
[31m-    ngx_uint_t           i, n;[m
[31m-    ngx_log_t           *log;[m
[31m-    ngx_time_t          *tp;[m
[31m-    ngx_conf_t           conf;[m
[31m-    ngx_pool_t          *pool;[m
[31m-    ngx_cycle_t         *cycle, **old;[m
[31m-    ngx_shm_zone_t      *shm_zone, *oshm_zone;[m
[31m-    ngx_list_part_t     *part, *opart;[m
[31m-    ngx_open_file_t     *file;[m
[31m-    ngx_listening_t     *ls, *nls;[m
[31m-    ngx_core_conf_t     *ccf, *old_ccf;[m
[31m-    ngx_core_module_t   *module;[m
[31m-    char                 hostname[NGX_MAXHOSTNAMELEN];[m
[31m-[m
[31m-    ngx_timezone_update();[m
[31m-[m
[31m-    /* force localtime update with a new timezone */[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    tp->sec = 0;[m
[31m-[m
[31m-    ngx_time_update();[m
[31m-[m
[31m-[m
[31m-    log = old_cycle->log;[m
[31m-[m
[31m-    pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-    pool->log = log;[m
[31m-[m
[31m-    cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));[m
[31m-    if (cycle == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->pool = pool;[m
[31m-    cycle->log = log;[m
[31m-    cycle->old_cycle = old_cycle;[m
[31m-[m
[31m-    cycle->conf_prefix.len = old_cycle->conf_prefix.len;[m
[31m-    cycle->conf_prefix.data = ngx_pstrdup(pool, &old_cycle->conf_prefix);[m
[31m-    if (cycle->conf_prefix.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->prefix.len = old_cycle->prefix.len;[m
[31m-    cycle->prefix.data = ngx_pstrdup(pool, &old_cycle->prefix);[m
[31m-    if (cycle->prefix.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->conf_file.len = old_cycle->conf_file.len;[m
[31m-    cycle->conf_file.data = ngx_pnalloc(pool, old_cycle->conf_file.len + 1);[m
[31m-    if (cycle->conf_file.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-    ngx_cpystrn(cycle->conf_file.data, old_cycle->conf_file.data,[m
[31m-                old_cycle->conf_file.len + 1);[m
[31m-[m
[31m-    cycle->conf_param.len = old_cycle->conf_param.len;[m
[31m-    cycle->conf_param.data = ngx_pstrdup(pool, &old_cycle->conf_param);[m
[31m-    if (cycle->conf_param.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    n = old_cycle->paths.nelts ? old_cycle->paths.nelts : 10;[m
[31m-[m
[31m-    cycle->paths.elts = ngx_pcalloc(pool, n * sizeof(ngx_path_t *));[m
[31m-    if (cycle->paths.elts == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->paths.nelts = 0;[m
[31m-    cycle->paths.size = sizeof(ngx_path_t *);[m
[31m-    cycle->paths.nalloc = n;[m
[31m-    cycle->paths.pool = pool;[m
[31m-[m
[31m-[m
[31m-    if (ngx_array_init(&cycle->config_dump, pool, 1, sizeof(ngx_conf_dump_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (old_cycle->open_files.part.nelts) {[m
[31m-        n = old_cycle->open_files.part.nelts;[m
[31m-        for (part = old_cycle->open_files.part.next; part; part = part->next) {[m
[31m-            n += part->nelts;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        n = 20;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (old_cycle->shared_memory.part.nelts) {[m
[31m-        n = old_cycle->shared_memory.part.nelts;[m
[31m-        for (part = old_cycle->shared_memory.part.next; part; part = part->next)[m
[31m-        {[m
[31m-            n += part->nelts;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&cycle->shared_memory, pool, n, sizeof(ngx_shm_zone_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;[m
[31m-[m
[31m-    cycle->listening.elts = ngx_pcalloc(pool, n * sizeof(ngx_listening_t));[m
[31m-    if (cycle->listening.elts == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->listening.nelts = 0;[m
[31m-    cycle->listening.size = sizeof(ngx_listening_t);[m
[31m-    cycle->listening.nalloc = n;[m
[31m-    cycle->listening.pool = pool;[m
[31m-[m
[31m-[m
[31m-    ngx_queue_init(&cycle->reusable_connections_queue);[m
[31m-[m
[31m-[m
[31m-    cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));[m
[31m-    if (cycle->conf_ctx == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed");[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* on Linux gethostname() silently truncates name that does not fit */[m
[31m-[m
[31m-    hostname[NGX_MAXHOSTNAMELEN - 1] = '\0';[m
[31m-    cycle->hostname.len = ngx_strlen(hostname);[m
[31m-[m
[31m-    cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len);[m
[31m-    if (cycle->hostname.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(cycle->hostname.data, (u_char *) hostname, cycle->hostname.len);[m
[31m-[m
[31m-[m
[31m-    if (ngx_cycle_modules(cycle) != NGX_OK) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->type != NGX_CORE_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_conf) {[m
[31m-            rv = module->create_conf(cycle);[m
[31m-            if (rv == NULL) {[m
[31m-                ngx_destroy_pool(pool);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-            cycle->conf_ctx[cycle->modules[i]->index] = rv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    senv = environ;[m
[31m-[m
[31m-[m
[31m-    ngx_memzero(&conf, sizeof(ngx_conf_t));[m
[31m-    /* STUB: init array ? */[m
[31m-    conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));[m
[31m-    if (conf.args == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);[m
[31m-    if (conf.temp_pool == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    conf.ctx = cycle->conf_ctx;[m
[31m-    conf.cycle = cycle;[m
[31m-    conf.pool = pool;[m
[31m-    conf.log = log;[m
[31m-    conf.module_type = NGX_CORE_MODULE;[m
[31m-    conf.cmd_type = NGX_MAIN_CONF;[m
[31m-[m
[31m-#if 0[m
[31m-    log->log_level = NGX_LOG_DEBUG_ALL;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_conf_param(&conf) != NGX_CONF_OK) {[m
[31m-        environ = senv;[m
[31m-        ngx_destroy_cycle_pools(&conf);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {[m
[31m-        environ = senv;[m
[31m-        ngx_destroy_cycle_pools(&conf);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_test_config && !ngx_quiet_mode) {[m
[31m-        ngx_log_stderr(0, "the configuration file %s syntax is ok",[m
[31m-                       cycle->conf_file.data);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->type != NGX_CORE_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->init_conf) {[m
[31m-            if (module->init_conf(cycle,[m
[31m-                                  cycle->conf_ctx[cycle->modules[i]->index])[m
[31m-                == NGX_CONF_ERROR)[m
[31m-            {[m
[31m-                environ = senv;[m
[31m-                ngx_destroy_cycle_pools(&conf);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_SIGNALLER) {[m
[31m-        return cycle;[m
[31m-    }[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (ngx_test_config) {[m
[31m-[m
[31m-        if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-    } else if (!ngx_is_init_cycle(old_cycle)) {[m
[31m-[m
[31m-        /*[m
[31m-         * we do not create the pid file in the first ngx_init_cycle() call[m
[31m-         * because we need to write the demonized process pid[m
[31m-         */[m
[31m-[m
[31m-        old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,[m
[31m-                                                   ngx_core_module);[m
[31m-        if (ccf->pid.len != old_ccf->pid.len[m
[31m-            || ngx_strcmp(ccf->pid.data, old_ccf->pid.data) != 0)[m
[31m-        {[m
[31m-            /* new pid file name */[m
[31m-[m
[31m-            if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ngx_delete_pidfile(old_cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_test_lockfile(cycle->lock_file.data, log) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_create_paths(cycle, ccf->user) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_log_open_default(cycle) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /* open the new files */[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].name.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        file[i].fd = ngx_open_file(file[i].name.data,[m
[31m-                                   NGX_FILE_APPEND,[m
[31m-                                   NGX_FILE_CREATE_OR_OPEN,[m
[31m-                                   NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "log: %p %d \"%s\"",[m
[31m-                       &file[i], file[i].fd, file[i].name.data);[m
[31m-[m
[31m-        if (file[i].fd == NGX_INVALID_FILE) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          ngx_open_file_n " \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-        if (fcntl(file[i].fd, F_SETFD, FD_CLOEXEC) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          "fcntl(FD_CLOEXEC) \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    cycle->log = &cycle->new_log;[m
[31m-    pool->log = &cycle->new_log;[m
[31m-[m
[31m-[m
[31m-    /* create shared memory */[m
[31m-[m
[31m-    part = &cycle->shared_memory.part;[m
[31m-    shm_zone = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            shm_zone = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (shm_zone[i].shm.size == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, 0,[m
[31m-                          "zero size shared memory zone \"%V\"",[m
[31m-                          &shm_zone[i].shm.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        shm_zone[i].shm.log = cycle->log;[m
[31m-[m
[31m-        opart = &old_cycle->shared_memory.part;[m
[31m-        oshm_zone = opart->elts;[m
[31m-[m
[31m-        for (n = 0; /* void */ ; n++) {[m
[31m-[m
[31m-            if (n >= opart->nelts) {[m
[31m-                if (opart->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-                opart = opart->next;[m
[31m-                oshm_zone = opart->elts;[m
[31m-                n = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (shm_zone[i].shm.name.len != oshm_zone[n].shm.name.len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp(shm_zone[i].shm.name.data,[m
[31m-                            oshm_zone[n].shm.name.data,[m
[31m-                            shm_zone[i].shm.name.len)[m
[31m-                != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (shm_zone[i].tag == oshm_zone[n].tag[m
[31m-                && shm_zone[i].shm.size == oshm_zone[n].shm.size[m
[31m-                && !shm_zone[i].noreuse)[m
[31m-            {[m
[31m-                shm_zone[i].shm.addr = oshm_zone[n].shm.addr;[m
[31m-#if (NGX_WIN32)[m
[31m-                shm_zone[i].shm.handle = oshm_zone[n].shm.handle;[m
[31m-#endif[m
[31m-[m
[31m-                if (shm_zone[i].init(&shm_zone[i], oshm_zone[n].data)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                goto shm_zone_found;[m
[31m-            }[m
[31m-[m
[31m-            ngx_shm_free(&oshm_zone[n].shm);[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_shm_alloc(&shm_zone[i].shm) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_init_zone_pool(cycle, &shm_zone[i]) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (shm_zone[i].init(&shm_zone[i], NULL) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-    shm_zone_found:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* handle the listening sockets */[m
[31m-[m
[31m-    if (old_cycle->listening.nelts) {[m
[31m-        ls = old_cycle->listening.elts;[m
[31m-        for (i = 0; i < old_cycle->listening.nelts; i++) {[m
[31m-            ls[i].remain = 0;[m
[31m-        }[m
[31m-[m
[31m-        nls = cycle->listening.elts;[m
[31m-        for (n = 0; n < cycle->listening.nelts; n++) {[m
[31m-[m
[31m-            for (i = 0; i < old_cycle->listening.nelts; i++) {[m
[31m-                if (ls[i].ignore) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ls[i].remain) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ls[i].type != nls[n].type) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_cmp_sockaddr(nls[n].sockaddr, nls[n].socklen,[m
[31m-                                     ls[i].sockaddr, ls[i].socklen, 1)[m
[31m-                    == NGX_OK)[m
[31m-                {[m
[31m-                    nls[n].fd = ls[i].fd;[m
[31m-                    nls[n].previous = &ls[i];[m
[31m-                    ls[i].remain = 1;[m
[31m-[m
[31m-                    if (ls[i].backlog != nls[n].backlog) {[m
[31m-                        nls[n].listen = 1;[m
[31m-                    }[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-[m
[31m-                    /*[m
[31m-                     * FreeBSD, except the most recent versions,[m
[31m-                     * could not remove accept filter[m
[31m-                     */[m
[31m-                    nls[n].deferred_accept = ls[i].deferred_accept;[m
[31m-[m
[31m-                    if (ls[i].accept_filter && nls[n].accept_filter) {[m
[31m-                        if (ngx_strcmp(ls[i].accept_filter,[m
[31m-                                       nls[n].accept_filter)[m
[31m-                            != 0)[m
[31m-                        {[m
[31m-                            nls[n].delete_deferred = 1;[m
[31m-                            nls[n].add_deferred = 1;[m
[31m-                        }[m
[31m-[m
[31m-                    } else if (ls[i].accept_filter) {[m
[31m-                        nls[n].delete_deferred = 1;[m
[31m-[m
[31m-                    } else if (nls[n].accept_filter) {[m
[31m-                        nls[n].add_deferred = 1;[m
[31m-                    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-[m
[31m-                    if (ls[i].deferred_accept && !nls[n].deferred_accept) {[m
[31m-                        nls[n].delete_deferred = 1;[m
[31m-[m
[31m-                    } else if (ls[i].deferred_accept != nls[n].deferred_accept)[m
[31m-                    {[m
[31m-                        nls[n].add_deferred = 1;[m
[31m-                    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-                    if (nls[n].reuseport && !ls[i].reuseport) {[m
[31m-                        nls[n].add_reuseport = 1;[m
[31m-                    }[m
[31m-#endif[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (nls[n].fd == (ngx_socket_t) -1) {[m
[31m-                nls[n].open = 1;[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-                if (nls[n].accept_filter) {[m
[31m-                    nls[n].add_deferred = 1;[m
[31m-                }[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-                if (nls[n].deferred_accept) {[m
[31m-                    nls[n].add_deferred = 1;[m
[31m-                }[m
[31m-#endif[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ls = cycle->listening.elts;[m
[31m-        for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-            ls[i].open = 1;[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-            if (ls[i].accept_filter) {[m
[31m-                ls[i].add_deferred = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-            if (ls[i].deferred_accept) {[m
[31m-                ls[i].add_deferred = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_listening_sockets(cycle) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_test_config) {[m
[31m-        ngx_configure_listening_sockets(cycle);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* commit the new cycle configuration */[m
[31m-[m
[31m-    if (!ngx_use_stderr) {[m
[31m-        (void) ngx_log_redirect_stderr(cycle);[m
[31m-    }[m
[31m-[m
[31m-    pool->log = cycle->log;[m
[31m-[m
[31m-    if (ngx_init_modules(cycle) != NGX_OK) {[m
[31m-        /* fatal */[m
[31m-        exit(1);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* close and delete stuff that lefts from an old cycle */[m
[31m-[m
[31m-    /* free the unnecessary shared memory */[m
[31m-[m
[31m-    opart = &old_cycle->shared_memory.part;[m
[31m-    oshm_zone = opart->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= opart->nelts) {[m
[31m-            if (opart->next == NULL) {[m
[31m-                goto old_shm_zone_done;[m
[31m-            }[m
[31m-            opart = opart->next;[m
[31m-            oshm_zone = opart->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        part = &cycle->shared_memory.part;[m
[31m-        shm_zone = part->elts;[m
[31m-[m
[31m-        for (n = 0; /* void */ ; n++) {[m
[31m-[m
[31m-            if (n >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-                part = part->next;[m
[31m-                shm_zone = part->elts;[m
[31m-                n = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (oshm_zone[i].shm.name.len == shm_zone[n].shm.name.len[m
[31m-                && ngx_strncmp(oshm_zone[i].shm.name.data,[m
[31m-                               shm_zone[n].shm.name.data,[m
[31m-                               oshm_zone[i].shm.name.len)[m
[31m-                == 0)[m
[31m-            {[m
[31m-                goto live_shm_zone;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_shm_free(&oshm_zone[i].shm);[m
[31m-[m
[31m-    live_shm_zone:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-old_shm_zone_done:[m
[31m-[m
[31m-[m
[31m-    /* close the unnecessary listening sockets */[m
[31m-[m
[31m-    ls = old_cycle->listening.elts;[m
[31m-    for (i = 0; i < old_cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        if (ls[i].remain || ls[i].fd == (ngx_socket_t) -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_socket(ls[i].fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " listening socket on %V failed",[m
[31m-                          &ls[i].addr_text);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-        if (ls[i].sockaddr->sa_family == AF_UNIX) {[m
[31m-            u_char  *name;[m
[31m-[m
[31m-            name = ls[i].addr_text.data + sizeof("unix:") - 1;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_WARN, cycle->log, 0,[m
[31m-                          "deleting socket %s", name);[m
[31m-[m
[31m-            if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                              ngx_delete_file_n " %s failed", name);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* close the unnecessary open files */[m
[31m-[m
[31m-    part = &old_cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(conf.temp_pool);[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_MASTER || ngx_is_init_cycle(old_cycle)) {[m
[31m-[m
[31m-        /*[m
[31m-         * perl_destruct() frees environ, if it is not the same as it was at[m
[31m-         * perl_construct() time, therefore we save the previous cycle[m
[31m-         * environment before ngx_conf_parse() where it will be changed.[m
[31m-         */[m
[31m-[m
[31m-        env = environ;[m
[31m-        environ = senv;[m
[31m-[m
[31m-        ngx_destroy_pool(old_cycle->pool);[m
[31m-        cycle->old_cycle = NULL;[m
[31m-[m
[31m-        environ = env;[m
[31m-[m
[31m-        return cycle;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_temp_pool == NULL) {[m
[31m-        ngx_temp_pool = ngx_create_pool(128, cycle->log);[m
[31m-        if (ngx_temp_pool == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                          "could not create ngx_temp_pool");[m
[31m-            exit(1);[m
[31m-        }[m
[31m-[m
[31m-        n = 10;[m
[31m-        ngx_old_cycles.elts = ngx_pcalloc(ngx_temp_pool,[m
[31m-                                          n * sizeof(ngx_cycle_t *));[m
[31m-        if (ngx_old_cycles.elts == NULL) {[m
[31m-            exit(1);[m
[31m-        }[m
[31m-        ngx_old_cycles.nelts = 0;[m
[31m-        ngx_old_cycles.size = sizeof(ngx_cycle_t *);[m
[31m-        ngx_old_cycles.nalloc = n;[m
[31m-        ngx_old_cycles.pool = ngx_temp_pool;[m
[31m-[m
[31m-        ngx_cleaner_event.handler = ngx_clean_old_cycles;[m
[31m-        ngx_cleaner_event.log = cycle->log;[m
[31m-        ngx_cleaner_event.data = &dumb;[m
[31m-        dumb.fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_temp_pool->log = cycle->log;[m
[31m-[m
[31m-    old = ngx_array_push(&ngx_old_cycles);[m
[31m-    if (old == NULL) {[m
[31m-        exit(1);[m
[31m-    }[m
[31m-    *old = old_cycle;[m
[31m-[m
[31m-    if (!ngx_cleaner_event.timer_set) {[m
[31m-        ngx_add_timer(&ngx_cleaner_event, 30000);[m
[31m-        ngx_cleaner_event.timer_set = 1;[m
[31m-    }[m
[31m-[m
[31m-    return cycle;[m
[31m-[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (!ngx_is_init_cycle(old_cycle)) {[m
[31m-        old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,[m
[31m-                                                   ngx_core_module);[m
[31m-        if (old_ccf->environment) {[m
[31m-            environ = old_ccf->environment;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* rollback the new cycle configuration */[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_test_config) {[m
[31m-        ngx_destroy_cycle_pools(&conf);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-        if (ls[i].fd == (ngx_socket_t) -1 || !ls[i].open) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_socket(ls[i].fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " %V failed",[m
[31m-                          &ls[i].addr_text);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_cycle_pools(&conf);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_destroy_cycle_pools(ngx_conf_t *conf)[m
[31m-{[m
[31m-    ngx_destroy_pool(conf->temp_pool);[m
[31m-    ngx_destroy_pool(conf->pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)[m
[31m-{[m
[31m-    u_char           *file;[m
[31m-    ngx_slab_pool_t  *sp;[m
[31m-[m
[31m-    sp = (ngx_slab_pool_t *) zn->shm.addr;[m
[31m-[m
[31m-    if (zn->shm.exists) {[m
[31m-[m
[31m-        if (sp == sp->addr) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-        /* remap at the required address */[m
[31m-[m
[31m-        if (ngx_shm_remap(&zn->shm, sp->addr) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sp = (ngx_slab_pool_t *) zn->shm.addr;[m
[31m-[m
[31m-        if (sp == sp->addr) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "shared zone \"%V\" has no equal addresses: %p vs %p",[m
[31m-                      &zn->shm.name, sp->addr, sp);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sp->end = zn->shm.addr + zn->shm.size;[m
[31m-    sp->min_shift = 3;[m
[31m-    sp->addr = zn->shm.addr;[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-    file = NULL;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    file = ngx_pnalloc(cycle->pool, cycle->lock_file.len + zn->shm.name.len);[m
[31m-    if (file == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_sprintf(file, "%V%V%Z", &cycle->lock_file, &zn->shm.name);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_shmtx_create(&sp->mutex, &sp->lock, file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_slab_init(sp);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    ngx_uint_t  create;[m
[31m-    ngx_file_t  file;[m
[31m-    u_char      pid[NGX_INT64_LEN + 2];[m
[31m-[m
[31m-    if (ngx_process > NGX_PROCESS_MASTER) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-[m
[31m-    file.name = *name;[m
[31m-    file.log = log;[m
[31m-[m
[31m-    create = ngx_test_config ? NGX_FILE_CREATE_OR_OPEN : NGX_FILE_TRUNCATE;[m
[31m-[m
[31m-    file.fd = ngx_open_file(file.name.data, NGX_FILE_RDWR,[m
[31m-                            create, NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (file.fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_test_config) {[m
[31m-        len = ngx_snprintf(pid, NGX_INT64_LEN + 2, "%P%N", ngx_pid) - pid;[m
[31m-[m
[31m-        if (ngx_write_file(&file, pid, len, 0) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file.name.data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_delete_pidfile(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_char           *name;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    name = ngx_new_binary ? ccf->oldpid.data : ccf->pid.data;[m
[31m-[m
[31m-    if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      ngx_delete_file_n " \"%s\" failed", name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_signal_process(ngx_cycle_t *cycle, char *sig)[m
[31m-{[m
[31m-    ssize_t           n;[m
[31m-    ngx_pid_t         pid;[m
[31m-    ngx_file_t        file;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-    u_char            buf[NGX_INT64_LEN + 2];[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "signal process started");[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-[m
[31m-    file.name = ccf->pid;[m
[31m-    file.log = cycle->log;[m
[31m-[m
[31m-    file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY,[m
[31m-                            NGX_FILE_OPEN, NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (file.fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", file.name.data);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_file(&file, buf, NGX_INT64_LEN + 2, 0);[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file.name.data);[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    while (n-- && (buf[n] == CR || buf[n] == LF)) { /* void */ }[m
[31m-[m
[31m-    pid = ngx_atoi(buf, ++n);[m
[31m-[m
[31m-    if (pid == (ngx_pid_t) NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cycle->log, 0,[m
[31m-                      "invalid PID number \"%*s\" in \"%s\"",[m
[31m-                      n, buf, file.name.data);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_os_signal_process(cycle, sig, pid);[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_test_lockfile(u_char *file, ngx_log_t *log)[m
[31m-{[m
[31m-#if !(NGX_HAVE_ATOMIC_OPS)[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    fd = ngx_open_file(file, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN,[m
[31m-                       NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", file);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_delete_file(file) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_delete_file_n " \"%s\" failed", file);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user)[m
[31m-{[m
[31m-    ngx_fd_t          fd;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_open_file_t  *file;[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].name.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].flush) {[m
[31m-            file[i].flush(&file[i], cycle->log);[m
[31m-        }[m
[31m-[m
[31m-        fd = ngx_open_file(file[i].name.data, NGX_FILE_APPEND,[m
[31m-                           NGX_FILE_CREATE_OR_OPEN, NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "reopen file \"%s\", old:%d new:%d",[m
[31m-                       file[i].name.data, file[i].fd, fd);[m
[31m-[m
[31m-        if (fd == NGX_INVALID_FILE) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          ngx_open_file_n " \"%s\" failed", file[i].name.data);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-        if (user != (ngx_uid_t) NGX_CONF_UNSET_UINT) {[m
[31m-            ngx_file_info_t  fi;[m
[31m-[m
[31m-            if (ngx_file_info((const char *) file[i].name.data, &fi)[m
[31m-                == NGX_FILE_ERROR)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                              ngx_file_info_n " \"%s\" failed",[m
[31m-                              file[i].name.data);[m
[31m-[m
[31m-                if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                  ngx_close_file_n " \"%s\" failed",[m
[31m-                                  file[i].name.data);[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (fi.st_uid != user) {[m
[31m-                if (chown((const char *) file[i].name.data, user, -1) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                  "chown(\"%s\", %d) failed",[m
[31m-                                  file[i].name.data, user);[m
[31m-[m
[31m-                    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                      ngx_close_file_n " \"%s\" failed",[m
[31m-                                      file[i].name.data);[m
[31m-                    }[m
[31m-[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if ((fi.st_mode & (S_IRUSR|S_IWUSR)) != (S_IRUSR|S_IWUSR)) {[m
[31m-[m
[31m-                fi.st_mode |= (S_IRUSR|S_IWUSR);[m
[31m-[m
[31m-                if (chmod((const char *) file[i].name.data, fi.st_mode) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                  "chmod() \"%s\" failed", file[i].name.data);[m
[31m-[m
[31m-                    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                      ngx_close_file_n " \"%s\" failed",[m
[31m-                                      file[i].name.data);[m
[31m-                    }[m
[31m-[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "fcntl(FD_CLOEXEC) \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-[m
[31m-            if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                              ngx_close_file_n " \"%s\" failed",[m
[31m-                              file[i].name.data);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-        }[m
[31m-[m
[31m-        file[i].fd = fd;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_log_redirect_stderr(cycle);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_shm_zone_t *[m
[31m-ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, size_t size, void *tag)[m
[31m-{[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_shm_zone_t   *shm_zone;[m
[31m-    ngx_list_part_t  *part;[m
[31m-[m
[31m-    part = &cf->cycle->shared_memory.part;[m
[31m-    shm_zone = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            shm_zone = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (name->len != shm_zone[i].shm.name.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(name->data, shm_zone[i].shm.name.data, name->len)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (tag != shm_zone[i].tag) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                            "the shared memory zone \"%V\" is "[m
[31m-                            "already declared for a different use",[m
[31m-                            &shm_zone[i].shm.name);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (shm_zone[i].shm.size == 0) {[m
[31m-            shm_zone[i].shm.size = size;[m
[31m-        }[m
[31m-[m
[31m-        if (size && size != shm_zone[i].shm.size) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                            "the size %uz of shared memory zone \"%V\" "[m
[31m-                            "conflicts with already declared size %uz",[m
[31m-                            size, &shm_zone[i].shm.name, shm_zone[i].shm.size);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        return &shm_zone[i];[m
[31m-    }[m
[31m-[m
[31m-    shm_zone = ngx_list_push(&cf->cycle->shared_memory);[m
[31m-[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone->data = NULL;[m
[31m-    shm_zone->shm.log = cf->cycle->log;[m
[31m-    shm_zone->shm.size = size;[m
[31m-    shm_zone->shm.name = *name;[m
[31m-    shm_zone->shm.exists = 0;[m
[31m-    shm_zone->init = NULL;[m
[31m-    shm_zone->tag = tag;[m
[31m-    shm_zone->noreuse = 0;[m
[31m-[m
[31m-    return shm_zone;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_clean_old_cycles(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_uint_t     i, n, found, live;[m
[31m-    ngx_log_t     *log;[m
[31m-    ngx_cycle_t  **cycle;[m
[31m-[m
[31m-    log = ngx_cycle->log;[m
[31m-    ngx_temp_pool->log = log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycles");[m
[31m-[m
[31m-    live = 0;[m
[31m-[m
[31m-    cycle = ngx_old_cycles.elts;[m
[31m-    for (i = 0; i < ngx_old_cycles.nelts; i++) {[m
[31m-[m
[31m-        if (cycle[i] == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        found = 0;[m
[31m-[m
[31m-        for (n = 0; n < cycle[i]->connection_n; n++) {[m
[31m-            if (cycle[i]->connections[n].fd != (ngx_socket_t) -1) {[m
[31m-                found = 1;[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "live fd:%ui", n);[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (found) {[m
[31m-            live = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycle: %ui", i);[m
[31m-[m
[31m-        ngx_destroy_pool(cycle[i]->pool);[m
[31m-        cycle[i] = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "old cycles status: %ui", live);[m
[31m-[m
[31m-    if (live) {[m
[31m-        ngx_add_timer(ev, 30000);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_destroy_pool(ngx_temp_pool);[m
[31m-        ngx_temp_pool = NULL;[m
[31m-        ngx_old_cycles.nelts = 0;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cycle.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cycle.h[m
[1mdeleted file mode 100644[m
[1mindex c51b7ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_cycle.h[m
[1m+++ /dev/null[m
[36m@@ -1,137 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CYCLE_H_INCLUDED_[m
[31m-#define _NGX_CYCLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_CYCLE_POOL_SIZE[m
[31m-#define NGX_CYCLE_POOL_SIZE     NGX_DEFAULT_POOL_SIZE[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_DEBUG_POINTS_STOP   1[m
[31m-#define NGX_DEBUG_POINTS_ABORT  2[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_shm_zone_s  ngx_shm_zone_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone, void *data);[m
[31m-[m
[31m-struct ngx_shm_zone_s {[m
[31m-    void                     *data;[m
[31m-    ngx_shm_t                 shm;[m
[31m-    ngx_shm_zone_init_pt      init;[m
[31m-    void                     *tag;[m
[31m-    ngx_uint_t                noreuse;  /* unsigned  noreuse:1; */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_cycle_s {[m
[31m-    void                  ****conf_ctx;[m
[31m-    ngx_pool_t               *pool;[m
[31m-[m
[31m-    ngx_log_t                *log;[m
[31m-    ngx_log_t                 new_log;[m
[31m-[m
[31m-    ngx_uint_t                log_use_stderr;  /* unsigned  log_use_stderr:1; */[m
[31m-[m
[31m-    ngx_connection_t        **files;[m
[31m-    ngx_connection_t         *free_connections;[m
[31m-    ngx_uint_t                free_connection_n;[m
[31m-[m
[31m-    ngx_module_t            **modules;[m
[31m-    ngx_uint_t                modules_n;[m
[31m-    ngx_uint_t                modules_used;    /* unsigned  modules_used:1; */[m
[31m-[m
[31m-    ngx_queue_t               reusable_connections_queue;[m
[31m-[m
[31m-    ngx_array_t               listening;[m
[31m-    ngx_array_t               paths;[m
[31m-    ngx_array_t               config_dump;[m
[31m-    ngx_list_t                open_files;[m
[31m-    ngx_list_t                shared_memory;[m
[31m-[m
[31m-    ngx_uint_t                connection_n;[m
[31m-    ngx_uint_t                files_n;[m
[31m-[m
[31m-    ngx_connection_t         *connections;[m
[31m-    ngx_event_t              *read_events;[m
[31m-    ngx_event_t              *write_events;[m
[31m-[m
[31m-    ngx_cycle_t              *old_cycle;[m
[31m-[m
[31m-    ngx_str_t                 conf_file;[m
[31m-    ngx_str_t                 conf_param;[m
[31m-    ngx_str_t                 conf_prefix;[m
[31m-    ngx_str_t                 prefix;[m
[31m-    ngx_str_t                 lock_file;[m
[31m-    ngx_str_t                 hostname;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t                daemon;[m
[31m-    ngx_flag_t                master;[m
[31m-[m
[31m-    ngx_msec_t                timer_resolution;[m
[31m-[m
[31m-    ngx_int_t                 worker_processes;[m
[31m-    ngx_int_t                 debug_points;[m
[31m-[m
[31m-    ngx_int_t                 rlimit_nofile;[m
[31m-    off_t                     rlimit_core;[m
[31m-[m
[31m-    int                       priority;[m
[31m-[m
[31m-    ngx_uint_t                cpu_affinity_auto;[m
[31m-    ngx_uint_t                cpu_affinity_n;[m
[31m-    ngx_cpuset_t             *cpu_affinity;[m
[31m-[m
[31m-    char                     *username;[m
[31m-    ngx_uid_t                 user;[m
[31m-    ngx_gid_t                 group;[m
[31m-[m
[31m-    ngx_str_t                 working_directory;[m
[31m-    ngx_str_t                 lock_file;[m
[31m-[m
[31m-    ngx_str_t                 pid;[m
[31m-    ngx_str_t                 oldpid;[m
[31m-[m
[31m-    ngx_array_t               env;[m
[31m-    char                    **environment;[m
[31m-} ngx_core_conf_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_is_init_cycle(cycle)  (cycle->conf_ctx == NULL)[m
[31m-[m
[31m-[m
[31m-ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);[m
[31m-ngx_int_t ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log);[m
[31m-void ngx_delete_pidfile(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_signal_process(ngx_cycle_t *cycle, char *sig);[m
[31m-void ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user);[m
[31m-char **ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last);[m
[31m-ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv);[m
[31m-ngx_cpuset_t *ngx_get_cpu_affinity(ngx_uint_t n);[m
[31m-ngx_shm_zone_t *ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name,[m
[31m-    size_t size, void *tag);[m
[31m-[m
[31m-[m
[31m-extern volatile ngx_cycle_t  *ngx_cycle;[m
[31m-extern ngx_array_t            ngx_old_cycles;[m
[31m-extern ngx_module_t           ngx_core_module;[m
[31m-extern ngx_uint_t             ngx_test_config;[m
[31m-extern ngx_uint_t             ngx_dump_config;[m
[31m-extern ngx_uint_t             ngx_quiet_mode;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CYCLE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_file.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_file.c[m
[1mdeleted file mode 100644[m
[1mindex fc2dfd3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_file.c[m
[1m+++ /dev/null[m
[36m@@ -1,1102 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_test_full_name(ngx_str_t *name);[m
[31m-[m
[31m-[m
[31m-static ngx_atomic_t   temp_number = 0;[m
[31m-ngx_atomic_t         *ngx_temp_number = &temp_number;[m
[31m-ngx_atomic_int_t      ngx_random_number = 123456;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix, ngx_str_t *name)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    u_char     *p, *n;[m
[31m-    ngx_int_t   rc;[m
[31m-[m
[31m-    rc = ngx_test_full_name(name);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    len = prefix->len;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-    if (rc == 2) {[m
[31m-        len = rc;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = ngx_pnalloc(pool, len + name->len + 1);[m
[31m-    if (n == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(n, prefix->data, len);[m
[31m-    ngx_cpystrn(p, name->data, name->len + 1);[m
[31m-[m
[31m-    name->len += len;[m
[31m-    name->data = n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_test_full_name(ngx_str_t *name)[m
[31m-{[m
[31m-#if (NGX_WIN32)[m
[31m-    u_char  c0, c1;[m
[31m-[m
[31m-    c0 = name->data[0];[m
[31m-[m
[31m-    if (name->len < 2) {[m
[31m-        if (c0 == '/') {[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    c1 = name->data[1];[m
[31m-[m
[31m-    if (c1 == ':') {[m
[31m-        c0 |= 0x20;[m
[31m-[m
[31m-        if ((c0 >= 'a' && c0 <= 'z')) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (c1 == '/') {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c0 == '/') {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (name->data[0] == '/') {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (tf->file.fd == NGX_INVALID_FILE) {[m
[31m-        rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                  tf->persistent, tf->clean, tf->access);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (tf->log_level) {[m
[31m-            ngx_log_error(tf->log_level, tf->file.log, 0, "%s %V",[m
[31m-                          tf->warn, &tf->file.name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS && NGX_HAVE_PWRITEV)[m
[31m-[m
[31m-    if (tf->thread_write) {[m
[31m-        return ngx_thread_write_chain_to_file(&tf->file, chain, tf->offset,[m
[31m-                                              tf->pool);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_write_chain_to_file(&tf->file, chain, tf->offset, tf->pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool,[m
[31m-    ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access)[m
[31m-{[m
[31m-    uint32_t                  n;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_pool_cleanup_t       *cln;[m
[31m-    ngx_pool_cleanup_file_t  *clnf;[m
[31m-[m
[31m-    file->name.len = path->name.len + 1 + path->len + 10;[m
[31m-[m
[31m-    file->name.data = ngx_pnalloc(pool, file->name.len + 1);[m
[31m-    if (file->name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    for (i = 0; i < file->name.len; i++) {[m
[31m-        file->name.data[i] = 'X';[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memcpy(file->name.data, path->name.data, path->name.len);[m
[31m-[m
[31m-    n = (uint32_t) ngx_next_temp_number(0);[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        (void) ngx_sprintf(file->name.data + path->name.len + 1 + path->len,[m
[31m-                           "%010uD%Z", n);[m
[31m-[m
[31m-        ngx_create_hashed_filename(path, file->name.data, file->name.len);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                       "hashed path: %s", file->name.data);[m
[31m-[m
[31m-        file->fd = ngx_open_tempfile(file->name.data, persistent, access);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                       "temp fd:%d", file->fd);[m
[31m-[m
[31m-        if (file->fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-            cln->handler = clean ? ngx_pool_delete_file : ngx_pool_cleanup_file;[m
[31m-            clnf = cln->data;[m
[31m-[m
[31m-            clnf->fd = file->fd;[m
[31m-            clnf->name = file->name.data;[m
[31m-            clnf->log = pool->log;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_EEXIST_FILE) {[m
[31m-            n = (uint32_t) ngx_next_temp_number(1);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((path->level[0] == 0) || (err != NGX_ENOPATH)) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                          ngx_open_tempfile_n " \"%s\" failed",[m
[31m-                          file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_create_path(file, path) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len)[m
[31m-{[m
[31m-    size_t      i, level;[m
[31m-    ngx_uint_t  n;[m
[31m-[m
[31m-    i = path->name.len + 1;[m
[31m-[m
[31m-    file[path->name.len + path->len]  = '/';[m
[31m-[m
[31m-    for (n = 0; n < 3; n++) {[m
[31m-        level = path->level[n];[m
[31m-[m
[31m-        if (level == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        len -= level;[m
[31m-        file[i - 1] = '/';[m
[31m-        ngx_memcpy(&file[i], &file[len], level);[m
[31m-        i += level + 1;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_path(ngx_file_t *file, ngx_path_t *path)[m
[31m-{[m
[31m-    size_t      pos;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    pos = path->name.len;[m
[31m-[m
[31m-    for (i = 0; i < 3; i++) {[m
[31m-        if (path->level[i] == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        pos += path->level[i] + 1;[m
[31m-[m
[31m-        file->name.data[pos] = '\0';[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                       "temp file: \"%s\"", file->name.data);[m
[31m-[m
[31m-        if (ngx_create_dir(file->name.data, 0700) == NGX_FILE_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-            if (err != NGX_EEXIST) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                              ngx_create_dir_n " \"%s\" failed",[m
[31m-                              file->name.data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        file->name.data[pos] = '/';[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_create_full_path(u_char *dir, ngx_uint_t access)[m
[31m-{[m
[31m-    u_char     *p, ch;[m
[31m-    ngx_err_t   err;[m
[31m-[m
[31m-    err = 0;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    p = dir + 3;[m
[31m-#else[m
[31m-    p = dir + 1;[m
[31m-#endif[m
[31m-[m
[31m-    for ( /* void */ ; *p; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        if (ch != '/') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        if (ngx_create_dir(dir, access) == NGX_FILE_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            switch (err) {[m
[31m-            case NGX_EEXIST:[m
[31m-                err = 0;[m
[31m-            case NGX_EACCES:[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return err;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *p = '/';[m
[31m-    }[m
[31m-[m
[31m-    return err;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_next_temp_number(ngx_uint_t collision)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  n, add;[m
[31m-[m
[31m-    add = collision ? ngx_random_number : 1;[m
[31m-[m
[31m-    n = ngx_atomic_fetch_add(ngx_temp_number, add);[m
[31m-[m
[31m-    return n + add;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ssize_t      level;[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_uint_t   i, n;[m
[31m-    ngx_path_t  *path, **slot;[m
[31m-[m
[31m-    slot = (ngx_path_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*slot) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));[m
[31m-    if (path == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    path->name = value[1];[m
[31m-[m
[31m-    if (path->name.data[path->name.len - 1] == '/') {[m
[31m-        path->name.len--;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &path->name, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    path->conf_file = cf->conf_file->file.name.data;[m
[31m-    path->line = cf->conf_file->line;[m
[31m-[m
[31m-    for (i = 0, n = 2; n < cf->args->nelts; i++, n++) {[m
[31m-        level = ngx_atoi(value[n].data, value[n].len);[m
[31m-        if (level == NGX_ERROR || level == 0) {[m
[31m-            return "invalid value";[m
[31m-        }[m
[31m-[m
[31m-        path->level[i] = level;[m
[31m-        path->len += level + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (path->len > 10 + i) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    *slot = path;[m
[31m-[m
[31m-    if (ngx_add_path(cf, slot) == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path, ngx_path_t *prev,[m
[31m-    ngx_path_init_t *init)[m
[31m-{[m
[31m-    if (*path) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (prev) {[m
[31m-        *path = prev;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    *path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));[m
[31m-    if (*path == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (*path)->name = init->name;[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &(*path)->name, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (*path)->level[0] = init->level[0];[m
[31m-    (*path)->level[1] = init->level[1];[m
[31m-    (*path)->level[2] = init->level[2];[m
[31m-[m
[31m-    (*path)->len = init->level[0] + (init->level[0] ? 1 : 0)[m
[31m-                   + init->level[1] + (init->level[1] ? 1 : 0)[m
[31m-                   + init->level[2] + (init->level[2] ? 1 : 0);[m
[31m-[m
[31m-    if (ngx_add_path(cf, path) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *confp = conf;[m
[31m-[m
[31m-    u_char      *p;[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_uint_t   i, right, shift, *access;[m
[31m-[m
[31m-    access = (ngx_uint_t *) (confp + cmd->offset);[m
[31m-[m
[31m-    if (*access != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *access = 0600;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        p = value[i].data;[m
[31m-[m
[31m-        if (ngx_strncmp(p, "user:", sizeof("user:") - 1) == 0) {[m
[31m-            shift = 6;[m
[31m-            p += sizeof("user:") - 1;[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "group:", sizeof("group:") - 1) == 0) {[m
[31m-            shift = 3;[m
[31m-            p += sizeof("group:") - 1;[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "all:", sizeof("all:") - 1) == 0) {[m
[31m-            shift = 0;[m
[31m-            p += sizeof("all:") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(p, "rw") == 0) {[m
[31m-            right = 6;[m
[31m-[m
[31m-        } else if (ngx_strcmp(p, "r") == 0) {[m
[31m-            right = 4;[m
[31m-[m
[31m-        } else {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        *access |= right << shift;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid value \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot)[m
[31m-{[m
[31m-    ngx_uint_t   i, n;[m
[31m-    ngx_path_t  *path, **p;[m
[31m-[m
[31m-    path = *slot;[m
[31m-[m
[31m-    p = cf->cycle->paths.elts;[m
[31m-    for (i = 0; i < cf->cycle->paths.nelts; i++) {[m
[31m-        if (p[i]->name.len == path->name.len[m
[31m-            && ngx_strcmp(p[i]->name.data, path->name.data) == 0)[m
[31m-        {[m
[31m-            if (p[i]->data != path->data) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the same path name \"%V\" "[m
[31m-                                   "used in %s:%ui and",[m
[31m-                                   &p[i]->name, p[i]->conf_file, p[i]->line);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            for (n = 0; n < 3; n++) {[m
[31m-                if (p[i]->level[n] != path->level[n]) {[m
[31m-                    if (path->conf_file == NULL) {[m
[31m-                        if (p[i]->conf_file == NULL) {[m
[31m-                            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                                      "the default path name \"%V\" has "[m
[31m-                                      "the same name as another default path, "[m
[31m-                                      "but the different levels, you need to "[m
[31m-                                      "redefine one of them in http section",[m
[31m-                                      &p[i]->name);[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                                      "the path name \"%V\" in %s:%ui has "[m
[31m-                                      "the same name as default path, but "[m
[31m-                                      "the different levels, you need to "[m
[31m-                                      "define default path in http section",[m
[31m-                                      &p[i]->name, p[i]->conf_file, p[i]->line);[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                      "the same path name \"%V\" in %s:%ui "[m
[31m-                                      "has the different levels than",[m
[31m-                                      &p[i]->name, p[i]->conf_file, p[i]->line);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (p[i]->level[n] == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            *slot = p[i];[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_array_push(&cf->cycle->paths);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *p = path;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user)[m
[31m-{[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_path_t      **path;[m
[31m-[m
[31m-    path = cycle->paths.elts;[m
[31m-    for (i = 0; i < cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_create_dir(path[i]->name.data, 0700) == NGX_FILE_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-            if (err != NGX_EEXIST) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, err,[m
[31m-                              ngx_create_dir_n " \"%s\" failed",[m
[31m-                              path[i]->name.data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (user == (ngx_uid_t) NGX_CONF_UNSET_UINT) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-        {[m
[31m-        ngx_file_info_t   fi;[m
[31m-[m
[31m-        if (ngx_file_info((const char *) path[i]->name.data, &fi)[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          ngx_file_info_n " \"%s\" failed", path[i]->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (fi.st_uid != user) {[m
[31m-            if (chown((const char *) path[i]->name.data, user, -1) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                              "chown(\"%s\", %d) failed",[m
[31m-                              path[i]->name.data, user);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if ((fi.st_mode & (S_IRUSR|S_IWUSR|S_IXUSR))[m
[31m-                                                  != (S_IRUSR|S_IWUSR|S_IXUSR))[m
[31m-        {[m
[31m-            fi.st_mode |= (S_IRUSR|S_IWUSR|S_IXUSR);[m
[31m-[m
[31m-            if (chmod((const char *) path[i]->name.data, fi.st_mode) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                              "chmod() \"%s\" failed", path[i]->name.data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to, ngx_ext_rename_file_t *ext)[m
[31m-{[m
[31m-    u_char           *name;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_copy_file_t   cf;[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-    if (ext->access) {[m
[31m-        if (ngx_change_file_access(src->data, ext->access) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                          ngx_change_file_access_n " \"%s\" failed", src->data);[m
[31m-            err = 0;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ext->time != -1) {[m
[31m-        if (ngx_set_file_time(src->data, ext->fd, ext->time) != NGX_OK) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                          ngx_set_file_time_n " \"%s\" failed", src->data);[m
[31m-            err = 0;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    if (err == NGX_ENOPATH) {[m
[31m-[m
[31m-        if (!ext->create_path) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_create_full_path(to->data, ngx_dir_access(ext->path_access));[m
[31m-[m
[31m-        if (err) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, err,[m
[31m-                          ngx_create_dir_n " \"%s\" failed", to->data);[m
[31m-            err = 0;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-    if (err == NGX_EEXIST || err == NGX_EEXIST_FILE) {[m
[31m-        err = ngx_win32_rename_file(src, to, ext->log);[m
[31m-[m
[31m-        if (err == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (err == NGX_EXDEV) {[m
[31m-[m
[31m-        cf.size = -1;[m
[31m-        cf.buf_size = 0;[m
[31m-        cf.access = ext->access;[m
[31m-        cf.time = ext->time;[m
[31m-        cf.log = ext->log;[m
[31m-[m
[31m-        name = ngx_alloc(to->len + 1 + 10 + 1, ext->log);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_sprintf(name, "%*s.%010uD%Z", to->len, to->data,[m
[31m-                           (uint32_t) ngx_next_temp_number(0));[m
[31m-[m
[31m-        if (ngx_copy_file(src->data, name, &cf) == NGX_OK) {[m
[31m-[m
[31m-            if (ngx_rename_file(name, to->data) != NGX_FILE_ERROR) {[m
[31m-                ngx_free(name);[m
[31m-[m
[31m-                if (ngx_delete_file(src->data) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                                  ngx_delete_file_n " \"%s\" failed",[m
[31m-                                  src->data);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                          ngx_rename_file_n " \"%s\" to \"%s\" failed",[m
[31m-                          name, to->data);[m
[31m-[m
[31m-            if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                              ngx_delete_file_n " \"%s\" failed", name);[m
[31m-[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_free(name);[m
[31m-[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ext->delete_file) {[m
[31m-        if (ngx_delete_file(src->data) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                          ngx_delete_file_n " \"%s\" failed", src->data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ext->log, err,[m
[31m-                      ngx_rename_file_n " \"%s\" to \"%s\" failed",[m
[31m-                      src->data, to->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_copy_file(u_char *from, u_char *to, ngx_copy_file_t *cf)[m
[31m-{[m
[31m-    char             *buf;[m
[31m-    off_t             size;[m
[31m-    size_t            len;[m
[31m-    ssize_t           n;[m
[31m-    ngx_fd_t          fd, nfd;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_file_info_t   fi;[m
[31m-[m
[31m-    rc = NGX_ERROR;[m
[31m-    buf = NULL;[m
[31m-    nfd = NGX_INVALID_FILE;[m
[31m-[m
[31m-    fd = ngx_open_file(from, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", from);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->size != -1) {[m
[31m-        size = cf->size;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_fd_info_n " \"%s\" failed", from);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        size = ngx_file_size(&fi);[m
[31m-    }[m
[31m-[m
[31m-    len = cf->buf_size ? cf->buf_size : 65536;[m
[31m-[m
[31m-    if ((off_t) len > size) {[m
[31m-        len = (size_t) size;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_alloc(len, cf->log);[m
[31m-    if (buf == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    nfd = ngx_open_file(to, NGX_FILE_WRONLY, NGX_FILE_CREATE_OR_OPEN,[m
[31m-                        cf->access);[m
[31m-[m
[31m-    if (nfd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", to);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    while (size > 0) {[m
[31m-[m
[31m-        if ((off_t) len > size) {[m
[31m-            len = (size_t) size;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_read_fd(fd, buf, len);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_read_fd_n " \"%s\" failed", from);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) n != len) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, 0,[m
[31m-                          ngx_read_fd_n " has read only %z of %O from %s",[m
[31m-                          n, size, from);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_write_fd(nfd, buf, len);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_write_fd_n " \"%s\" failed", to);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) n != len) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, 0,[m
[31m-                          ngx_write_fd_n " has written only %z of %O to %s",[m
[31m-                          n, size, to);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        size -= n;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->time != -1) {[m
[31m-        if (ngx_set_file_time(to, nfd, cf->time) != NGX_OK) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_set_file_time_n " \"%s\" failed", to);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (nfd != NGX_INVALID_FILE) {[m
[31m-        if (ngx_close_file(nfd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", to);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (fd != NGX_INVALID_FILE) {[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", from);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (buf) {[m
[31m-        ngx_free(buf);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ctx->init_handler() - see ctx->alloc[m
[31m- * ctx->file_handler() - file handler[m
[31m- * ctx->pre_tree_handler() - handler is called before entering directory[m
[31m- * ctx->post_tree_handler() - handler is called after leaving directory[m
[31m- * ctx->spec_handler() - special (socket, FIFO, etc.) file handler[m
[31m- *[m
[31m- * ctx->data - some data structure, it may be the same on all levels, or[m
[31m- *     reallocated if ctx->alloc is nonzero[m
[31m- *[m
[31m- * ctx->alloc - a size of data structure that is allocated at every level[m
[31m- *     and is initialized by ctx->init_handler()[m
[31m- *[m
[31m- * ctx->log - a log[m
[31m- *[m
[31m- * on fatal (memory) error handler must return NGX_ABORT to stop walking tree[m
[31m- */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree)[m
[31m-{[m
[31m-    void       *data, *prev;[m
[31m-    u_char     *p, *name;[m
[31m-    size_t      len;[m
[31m-    ngx_int_t   rc;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_str_t   file, buf;[m
[31m-    ngx_dir_t   dir;[m
[31m-[m
[31m-    ngx_str_null(&buf);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                   "walk tree \"%V\"", tree);[m
[31m-[m
[31m-    if (ngx_open_dir(tree, &dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,[m
[31m-                      ngx_open_dir_n " \"%s\" failed", tree->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    prev = ctx->data;[m
[31m-[m
[31m-    if (ctx->alloc) {[m
[31m-        data = ngx_alloc(ctx->alloc, ctx->log);[m
[31m-        if (data == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->init_handler(data, prev) == NGX_ABORT) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ctx->data = data;[m
[31m-[m
[31m-    } else {[m
[31m-        data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        ngx_set_errno(0);[m
[31m-[m
[31m-        if (ngx_read_dir(&dir) == NGX_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_ENOMOREFILES) {[m
[31m-                rc = NGX_OK;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, ctx->log, err,[m
[31m-                              ngx_read_dir_n " \"%s\" failed", tree->data);[m
[31m-                rc = NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_de_namelen(&dir);[m
[31m-        name = ngx_de_name(&dir);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                      "tree name %uz:\"%s\"", len, name);[m
[31m-[m
[31m-        if (len == 1 && name[0] == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len == 2 && name[0] == '.' && name[1] == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        file.len = tree->len + 1 + len;[m
[31m-[m
[31m-        if (file.len + NGX_DIR_MASK_LEN > buf.len) {[m
[31m-[m
[31m-            if (buf.len) {[m
[31m-                ngx_free(buf.data);[m
[31m-            }[m
[31m-[m
[31m-            buf.len = tree->len + 1 + len + NGX_DIR_MASK_LEN;[m
[31m-[m
[31m-            buf.data = ngx_alloc(buf.len + 1, ctx->log);[m
[31m-            if (buf.data == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(buf.data, tree->data, tree->len);[m
[31m-        *p++ = '/';[m
[31m-        ngx_memcpy(p, name, len + 1);[m
[31m-[m
[31m-        file.data = buf.data;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                       "tree path \"%s\"", file.data);[m
[31m-[m
[31m-        if (!dir.valid_info) {[m
[31m-            if (ngx_de_info(file.data, &dir) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,[m
[31m-                              ngx_de_info_n " \"%s\" failed", file.data);[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_de_is_file(&dir)) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                           "tree file \"%s\"", file.data);[m
[31m-[m
[31m-            ctx->size = ngx_de_size(&dir);[m
[31m-            ctx->fs_size = ngx_de_fs_size(&dir);[m
[31m-            ctx->access = ngx_de_access(&dir);[m
[31m-            ctx->mtime = ngx_de_mtime(&dir);[m
[31m-[m
[31m-            if (ctx->file_handler(ctx, &file) == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-        } else if (ngx_de_is_dir(&dir)) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                           "tree enter dir \"%s\"", file.data);[m
[31m-[m
[31m-            ctx->access = ngx_de_access(&dir);[m
[31m-            ctx->mtime = ngx_de_mtime(&dir);[m
[31m-[m
[31m-            rc = ctx->pre_tree_handler(ctx, &file);[m
[31m-[m
[31m-            if (rc == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                               "tree skip dir \"%s\"", file.data);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_walk_tree(ctx, &file) == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ctx->access = ngx_de_access(&dir);[m
[31m-            ctx->mtime = ngx_de_mtime(&dir);[m
[31m-[m
[31m-            if (ctx->post_tree_handler(ctx, &file) == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                           "tree special \"%s\"", file.data);[m
[31m-[m
[31m-            if (ctx->spec_handler(ctx, &file) == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc = NGX_ABORT;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (buf.len) {[m
[31m-        ngx_free(buf.data);[m
[31m-    }[m
[31m-[m
[31m-    if (data) {[m
[31m-        ngx_free(data);[m
[31m-        ctx->data = prev;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_dir(&dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%s\" failed", tree->data);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_file.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_file.h[m
[1mdeleted file mode 100644[m
[1mindex 5f8228b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_file.h[m
[1m+++ /dev/null[m
[36m@@ -1,162 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FILE_H_INCLUDED_[m
[31m-#define _NGX_FILE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-struct ngx_file_s {[m
[31m-    ngx_fd_t                   fd;[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_file_info_t            info;[m
[31m-[m
[31m-    off_t                      offset;[m
[31m-    off_t                      sys_offset;[m
[31m-[m
[31m-    ngx_log_t                 *log;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_int_t                (*thread_handler)(ngx_thread_task_t *task,[m
[31m-                                               ngx_file_t *file);[m
[31m-    void                      *thread_ctx;[m
[31m-    ngx_thread_task_t         *thread_task;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-    ngx_event_aio_t           *aio;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                   valid_info:1;[m
[31m-    unsigned                   directio:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_PATH_LEVEL  3[m
[31m-[m
[31m-[m
[31m-typedef time_t (*ngx_path_manager_pt) (void *data);[m
[31m-typedef void (*ngx_path_loader_pt) (void *data);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  name;[m
[31m-    size_t                     len;[m
[31m-    size_t                     level[3];[m
[31m-[m
[31m-    ngx_path_manager_pt        manager;[m
[31m-    ngx_path_loader_pt         loader;[m
[31m-    void                      *data;[m
[31m-[m
[31m-    u_char                    *conf_file;[m
[31m-    ngx_uint_t                 line;[m
[31m-} ngx_path_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  name;[m
[31m-    size_t                     level[3];[m
[31m-} ngx_path_init_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_file_t                 file;[m
[31m-    off_t                      offset;[m
[31m-    ngx_path_t                *path;[m
[31m-    ngx_pool_t                *pool;[m
[31m-    char                      *warn;[m
[31m-[m
[31m-    ngx_uint_t                 access;[m
[31m-[m
[31m-    unsigned                   log_level:8;[m
[31m-    unsigned                   persistent:1;[m
[31m-    unsigned                   clean:1;[m
[31m-    unsigned                   thread_write:1;[m
[31m-} ngx_temp_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                 access;[m
[31m-    ngx_uint_t                 path_access;[m
[31m-    time_t                     time;[m
[31m-    ngx_fd_t                   fd;[m
[31m-[m
[31m-    unsigned                   create_path:1;[m
[31m-    unsigned                   delete_file:1;[m
[31m-[m
[31m-    ngx_log_t                 *log;[m
[31m-} ngx_ext_rename_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t                      size;[m
[31m-    size_t                     buf_size;[m
[31m-[m
[31m-    ngx_uint_t                 access;[m
[31m-    time_t                     time;[m
[31m-[m
[31m-    ngx_log_t                 *log;[m
[31m-} ngx_copy_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_tree_ctx_s  ngx_tree_ctx_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_tree_init_handler_pt) (void *ctx, void *prev);[m
[31m-typedef ngx_int_t (*ngx_tree_handler_pt) (ngx_tree_ctx_t *ctx, ngx_str_t *name);[m
[31m-[m
[31m-struct ngx_tree_ctx_s {[m
[31m-    off_t                      size;[m
[31m-    off_t                      fs_size;[m
[31m-    ngx_uint_t                 access;[m
[31m-    time_t                     mtime;[m
[31m-[m
[31m-    ngx_tree_init_handler_pt   init_handler;[m
[31m-    ngx_tree_handler_pt        file_handler;[m
[31m-    ngx_tree_handler_pt        pre_tree_handler;[m
[31m-    ngx_tree_handler_pt        post_tree_handler;[m
[31m-    ngx_tree_handler_pt        spec_handler;[m
[31m-[m
[31m-    void                      *data;[m
[31m-    size_t                     alloc;[m
[31m-[m
[31m-    ngx_log_t                 *log;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix,[m
[31m-    ngx_str_t *name);[m
[31m-[m
[31m-ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain);[m
[31m-ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,[m
[31m-    ngx_pool_t *pool, ngx_uint_t persistent, ngx_uint_t clean,[m
[31m-    ngx_uint_t access);[m
[31m-void ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len);[m
[31m-ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path);[m
[31m-ngx_err_t ngx_create_full_path(u_char *dir, ngx_uint_t access);[m
[31m-ngx_int_t ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot);[m
[31m-ngx_int_t ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user);[m
[31m-ngx_int_t ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to,[m
[31m-    ngx_ext_rename_file_t *ext);[m
[31m-ngx_int_t ngx_copy_file(u_char *from, u_char *to, ngx_copy_file_t *cf);[m
[31m-ngx_int_t ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree);[m
[31m-[m
[31m-ngx_atomic_uint_t ngx_next_temp_number(ngx_uint_t collision);[m
[31m-[m
[31m-char *ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path,[m
[31m-    ngx_path_t *prev, ngx_path_init_t *init);[m
[31m-char *ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-extern ngx_atomic_t      *ngx_temp_number;[m
[31m-extern ngx_atomic_int_t   ngx_random_number;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FILE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_hash.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_hash.c[m
[1mdeleted file mode 100644[m
[1mindex 151e643..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_hash.c[m
[1m+++ /dev/null[m
[36m@@ -1,989 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len)[m
[31m-{[m
[31m-    ngx_uint_t       i;[m
[31m-    ngx_hash_elt_t  *elt;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "hf:\"%*s\"", len, name);[m
[31m-#endif[m
[31m-[m
[31m-    elt = hash->buckets[key % hash->size];[m
[31m-[m
[31m-    if (elt == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    while (elt->value) {[m
[31m-        if (len != (size_t) elt->len) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            if (name[i] != elt->name[i]) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return elt->value;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        elt = (ngx_hash_elt_t *) ngx_align_ptr(&elt->name[0] + elt->len,[m
[31m-                                               sizeof(void *));[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len)[m
[31m-{[m
[31m-    void        *value;[m
[31m-    ngx_uint_t   i, n, key;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "wch:\"%*s\"", len, name);[m
[31m-#endif[m
[31m-[m
[31m-    n = len;[m
[31m-[m
[31m-    while (n) {[m
[31m-        if (name[n - 1] == '.') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        n--;[m
[31m-    }[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = n; i < len; i++) {[m
[31m-        key = ngx_hash(key, name[i]);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "key:\"%ui\"", key);[m
[31m-#endif[m
[31m-[m
[31m-    value = ngx_hash_find(&hwc->hash, key, &name[n], len - n);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "value:\"%p\"", value);[m
[31m-#endif[m
[31m-[m
[31m-    if (value) {[m
[31m-[m
[31m-        /*[m
[31m-         * the 2 low bits of value have the special meaning:[m
[31m-         *     00 - value is data pointer for both "example.com"[m
[31m-         *          and "*.example.com";[m
[31m-         *     01 - value is data pointer for "*.example.com" only;[m
[31m-         *     10 - value is pointer to wildcard hash allowing[m
[31m-         *          both "example.com" and "*.example.com";[m
[31m-         *     11 - value is pointer to wildcard hash allowing[m
[31m-         *          "*.example.com" only.[m
[31m-         */[m
[31m-[m
[31m-        if ((uintptr_t) value & 2) {[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-[m
[31m-                /* "example.com" */[m
[31m-[m
[31m-                if ((uintptr_t) value & 1) {[m
[31m-                    return NULL;[m
[31m-                }[m
[31m-[m
[31m-                hwc = (ngx_hash_wildcard_t *)[m
[31m-                                          ((uintptr_t) value & (uintptr_t) ~3);[m
[31m-                return hwc->value;[m
[31m-            }[m
[31m-[m
[31m-            hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3);[m
[31m-[m
[31m-            value = ngx_hash_find_wc_head(hwc, name, n - 1);[m
[31m-[m
[31m-            if (value) {[m
[31m-                return value;[m
[31m-            }[m
[31m-[m
[31m-            return hwc->value;[m
[31m-        }[m
[31m-[m
[31m-        if ((uintptr_t) value & 1) {[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-[m
[31m-                /* "example.com" */[m
[31m-[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            return (void *) ((uintptr_t) value & (uintptr_t) ~3);[m
[31m-        }[m
[31m-[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    return hwc->value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len)[m
[31m-{[m
[31m-    void        *value;[m
[31m-    ngx_uint_t   i, key;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "wct:\"%*s\"", len, name);[m
[31m-#endif[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        if (name[i] == '.') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        key = ngx_hash(key, name[i]);[m
[31m-    }[m
[31m-[m
[31m-    if (i == len) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "key:\"%ui\"", key);[m
[31m-#endif[m
[31m-[m
[31m-    value = ngx_hash_find(&hwc->hash, key, name, i);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "value:\"%p\"", value);[m
[31m-#endif[m
[31m-[m
[31m-    if (value) {[m
[31m-[m
[31m-        /*[m
[31m-         * the 2 low bits of value have the special meaning:[m
[31m-         *     00 - value is data pointer;[m
[31m-         *     11 - value is pointer to wildcard hash allowing "example.*".[m
[31m-         */[m
[31m-[m
[31m-        if ((uintptr_t) value & 2) {[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3);[m
[31m-[m
[31m-            value = ngx_hash_find_wc_tail(hwc, &name[i], len - i);[m
[31m-[m
[31m-            if (value) {[m
[31m-                return value;[m
[31m-            }[m
[31m-[m
[31m-            return hwc->value;[m
[31m-        }[m
[31m-[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    return hwc->value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key, u_char *name,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    void  *value;[m
[31m-[m
[31m-    if (hash->hash.buckets) {[m
[31m-        value = ngx_hash_find(&hash->hash, key, name, len);[m
[31m-[m
[31m-        if (value) {[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (hash->wc_head && hash->wc_head->hash.buckets) {[m
[31m-        value = ngx_hash_find_wc_head(hash->wc_head, name, len);[m
[31m-[m
[31m-        if (value) {[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (hash->wc_tail && hash->wc_tail->hash.buckets) {[m
[31m-        value = ngx_hash_find_wc_tail(hash->wc_tail, name, len);[m
[31m-[m
[31m-        if (value) {[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define NGX_HASH_ELT_SIZE(name)                                               \[m
[31m-    (sizeof(void *) + ngx_align((name)->key.len + 2, sizeof(void *)))[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts)[m
[31m-{[m
[31m-    u_char          *elts;[m
[31m-    size_t           len;[m
[31m-    u_short         *test;[m
[31m-    ngx_uint_t       i, n, key, size, start, bucket_size;[m
[31m-    ngx_hash_elt_t  *elt, **buckets;[m
[31m-[m
[31m-    if (hinit->max_size == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,[m
[31m-                      "could not build %s, you should "[m
[31m-                      "increase %s_max_size: %i",[m
[31m-                      hinit->name, hinit->name, hinit->max_size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < nelts; n++) {[m
[31m-        if (hinit->bucket_size < NGX_HASH_ELT_SIZE(&names[n]) + sizeof(void *))[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,[m
[31m-                          "could not build %s, you should "[m
[31m-                          "increase %s_bucket_size: %i",[m
[31m-                          hinit->name, hinit->name, hinit->bucket_size);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    test = ngx_alloc(hinit->max_size * sizeof(u_short), hinit->pool->log);[m
[31m-    if (test == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bucket_size = hinit->bucket_size - sizeof(void *);[m
[31m-[m
[31m-    start = nelts / (bucket_size / (2 * sizeof(void *)));[m
[31m-    start = start ? start : 1;[m
[31m-[m
[31m-    if (hinit->max_size > 10000 && nelts && hinit->max_size / nelts < 100) {[m
[31m-        start = hinit->max_size - 1000;[m
[31m-    }[m
[31m-[m
[31m-    for (size = start; size <= hinit->max_size; size++) {[m
[31m-[m
[31m-        ngx_memzero(test, size * sizeof(u_short));[m
[31m-[m
[31m-        for (n = 0; n < nelts; n++) {[m
[31m-            if (names[n].key.data == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            key = names[n].key_hash % size;[m
[31m-            test[key] = (u_short) (test[key] + NGX_HASH_ELT_SIZE(&names[n]));[m
[31m-[m
[31m-#if 0[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "%ui: %ui %ui \"%V\"",[m
[31m-                          size, key, test[key], &names[n].key);[m
[31m-#endif[m
[31m-[m
[31m-            if (test[key] > (u_short) bucket_size) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto found;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    size = hinit->max_size;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_WARN, hinit->pool->log, 0,[m
[31m-                  "could not build optimal %s, you should increase "[m
[31m-                  "either %s_max_size: %i or %s_bucket_size: %i; "[m
[31m-                  "ignoring %s_bucket_size",[m
[31m-                  hinit->name, hinit->name, hinit->max_size,[m
[31m-                  hinit->name, hinit->bucket_size, hinit->name);[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        test[i] = sizeof(void *);[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < nelts; n++) {[m
[31m-        if (names[n].key.data == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        key = names[n].key_hash % size;[m
[31m-        test[key] = (u_short) (test[key] + NGX_HASH_ELT_SIZE(&names[n]));[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        if (test[i] == sizeof(void *)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        test[i] = (u_short) (ngx_align(test[i], ngx_cacheline_size));[m
[31m-[m
[31m-        len += test[i];[m
[31m-    }[m
[31m-[m
[31m-    if (hinit->hash == NULL) {[m
[31m-        hinit->hash = ngx_pcalloc(hinit->pool, sizeof(ngx_hash_wildcard_t)[m
[31m-                                             + size * sizeof(ngx_hash_elt_t *));[m
[31m-        if (hinit->hash == NULL) {[m
[31m-            ngx_free(test);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buckets = (ngx_hash_elt_t **)[m
[31m-                      ((u_char *) hinit->hash + sizeof(ngx_hash_wildcard_t));[m
[31m-[m
[31m-    } else {[m
[31m-        buckets = ngx_pcalloc(hinit->pool, size * sizeof(ngx_hash_elt_t *));[m
[31m-        if (buckets == NULL) {[m
[31m-            ngx_free(test);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    elts = ngx_palloc(hinit->pool, len + ngx_cacheline_size);[m
[31m-    if (elts == NULL) {[m
[31m-        ngx_free(test);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    elts = ngx_align_ptr(elts, ngx_cacheline_size);[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        if (test[i] == sizeof(void *)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        buckets[i] = (ngx_hash_elt_t *) elts;[m
[31m-        elts += test[i];[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        test[i] = 0;[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < nelts; n++) {[m
[31m-        if (names[n].key.data == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        key = names[n].key_hash % size;[m
[31m-        elt = (ngx_hash_elt_t *) ((u_char *) buckets[key] + test[key]);[m
[31m-[m
[31m-        elt->value = names[n].value;[m
[31m-        elt->len = (u_short) names[n].key.len;[m
[31m-[m
[31m-        ngx_strlow(elt->name, names[n].key.data, names[n].key.len);[m
[31m-[m
[31m-        test[key] = (u_short) (test[key] + NGX_HASH_ELT_SIZE(&names[n]));[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        if (buckets[i] == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        elt = (ngx_hash_elt_t *) ((u_char *) buckets[i] + test[i]);[m
[31m-[m
[31m-        elt->value = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(test);[m
[31m-[m
[31m-    hinit->hash->buckets = buckets;[m
[31m-    hinit->hash->size = size;[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        ngx_str_t   val;[m
[31m-        ngx_uint_t  key;[m
[31m-[m
[31m-        elt = buckets[i];[m
[31m-[m
[31m-        if (elt == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "%ui: NULL", i);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        while (elt->value) {[m
[31m-            val.len = elt->len;[m
[31m-            val.data = &elt->name[0];[m
[31m-[m
[31m-            key = hinit->key(val.data, val.len);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "%ui: %p \"%V\" %ui", i, elt, &val, key);[m
[31m-[m
[31m-            elt = (ngx_hash_elt_t *) ngx_align_ptr(&elt->name[0] + elt->len,[m
[31m-                                                   sizeof(void *));[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,[m
[31m-    ngx_uint_t nelts)[m
[31m-{[m
[31m-    size_t                len, dot_len;[m
[31m-    ngx_uint_t            i, n, dot;[m
[31m-    ngx_array_t           curr_names, next_names;[m
[31m-    ngx_hash_key_t       *name, *next_name;[m
[31m-    ngx_hash_init_t       h;[m
[31m-    ngx_hash_wildcard_t  *wdc;[m
[31m-[m
[31m-    if (ngx_array_init(&curr_names, hinit->temp_pool, nelts,[m
[31m-                       sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&next_names, hinit->temp_pool, nelts,[m
[31m-                       sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < nelts; n = i) {[m
[31m-[m
[31m-#if 0[m
[31m-        ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                      "wc0: \"%V\"", &names[n].key);[m
[31m-#endif[m
[31m-[m
[31m-        dot = 0;[m
[31m-[m
[31m-        for (len = 0; len < names[n].key.len; len++) {[m
[31m-            if (names[n].key.data[len] == '.') {[m
[31m-                dot = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        name = ngx_array_push(&curr_names);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name->key.len = len;[m
[31m-        name->key.data = names[n].key.data;[m
[31m-        name->key_hash = hinit->key(name->key.data, name->key.len);[m
[31m-        name->value = names[n].value;[m
[31m-[m
[31m-#if 0[m
[31m-        ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                      "wc1: \"%V\" %ui", &name->key, dot);[m
[31m-#endif[m
[31m-[m
[31m-        dot_len = len + 1;[m
[31m-[m
[31m-        if (dot) {[m
[31m-            len++;[m
[31m-        }[m
[31m-[m
[31m-        next_names.nelts = 0;[m
[31m-[m
[31m-        if (names[n].key.len != len) {[m
[31m-            next_name = ngx_array_push(&next_names);[m
[31m-            if (next_name == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            next_name->key.len = names[n].key.len - len;[m
[31m-            next_name->key.data = names[n].key.data + len;[m
[31m-            next_name->key_hash = 0;[m
[31m-            next_name->value = names[n].value;[m
[31m-[m
[31m-#if 0[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "wc2: \"%V\"", &next_name->key);[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        for (i = n + 1; i < nelts; i++) {[m
[31m-            if (ngx_strncmp(names[n].key.data, names[i].key.data, len) != 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (!dot[m
[31m-                && names[i].key.len > len[m
[31m-                && names[i].key.data[len] != '.')[m
[31m-            {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            next_name = ngx_array_push(&next_names);[m
[31m-            if (next_name == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            next_name->key.len = names[i].key.len - dot_len;[m
[31m-            next_name->key.data = names[i].key.data + dot_len;[m
[31m-            next_name->key_hash = 0;[m
[31m-            next_name->value = names[i].value;[m
[31m-[m
[31m-#if 0[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "wc3: \"%V\"", &next_name->key);[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (next_names.nelts) {[m
[31m-[m
[31m-            h = *hinit;[m
[31m-            h.hash = NULL;[m
[31m-[m
[31m-            if (ngx_hash_wildcard_init(&h, (ngx_hash_key_t *) next_names.elts,[m
[31m-                                       next_names.nelts)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            wdc = (ngx_hash_wildcard_t *) h.hash;[m
[31m-[m
[31m-            if (names[n].key.len == len) {[m
[31m-                wdc->value = names[n].value;[m
[31m-            }[m
[31m-[m
[31m-            name->value = (void *) ((uintptr_t) wdc | (dot ? 3 : 2));[m
[31m-[m
[31m-        } else if (dot) {[m
[31m-            name->value = (void *) ((uintptr_t) name->value | 1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_hash_init(hinit, (ngx_hash_key_t *) curr_names.elts,[m
[31m-                      curr_names.nelts)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_hash_key(u_char *data, size_t len)[m
[31m-{[m
[31m-    ngx_uint_t  i, key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        key = ngx_hash(key, data[i]);[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_hash_key_lc(u_char *data, size_t len)[m
[31m-{[m
[31m-    ngx_uint_t  i, key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        key = ngx_hash(key, ngx_tolower(data[i]));[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_hash_strlow(u_char *dst, u_char *src, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    while (n--) {[m
[31m-        *dst = ngx_tolower(*src);[m
[31m-        key = ngx_hash(key, *dst);[m
[31m-        dst++;[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t  asize;[m
[31m-[m
[31m-    if (type == NGX_HASH_SMALL) {[m
[31m-        asize = 4;[m
[31m-        ha->hsize = 107;[m
[31m-[m
[31m-    } else {[m
[31m-        asize = NGX_HASH_LARGE_ASIZE;[m
[31m-        ha->hsize = NGX_HASH_LARGE_HSIZE;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&ha->keys, ha->temp_pool, asize, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&ha->dns_wc_head, ha->temp_pool, asize,[m
[31m-                       sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&ha->dns_wc_tail, ha->temp_pool, asize,[m
[31m-                       sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ha->keys_hash = ngx_pcalloc(ha->temp_pool, sizeof(ngx_array_t) * ha->hsize);[m
[31m-    if (ha->keys_hash == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ha->dns_wc_head_hash = ngx_pcalloc(ha->temp_pool,[m
[31m-                                       sizeof(ngx_array_t) * ha->hsize);[m
[31m-    if (ha->dns_wc_head_hash == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ha->dns_wc_tail_hash = ngx_pcalloc(ha->temp_pool,[m
[31m-                                       sizeof(ngx_array_t) * ha->hsize);[m
[31m-    if (ha->dns_wc_tail_hash == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, void *value,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    size_t           len;[m
[31m-    u_char          *p;[m
[31m-    ngx_str_t       *name;[m
[31m-    ngx_uint_t       i, k, n, skip, last;[m
[31m-    ngx_array_t     *keys, *hwc;[m
[31m-    ngx_hash_key_t  *hk;[m
[31m-[m
[31m-    last = key->len;[m
[31m-[m
[31m-    if (flags & NGX_HASH_WILDCARD_KEY) {[m
[31m-[m
[31m-        /*[m
[31m-         * supported wildcards:[m
[31m-         *     "*.example.com", ".example.com", and "www.example.*"[m
[31m-         */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        for (i = 0; i < key->len; i++) {[m
[31m-[m
[31m-            if (key->data[i] == '*') {[m
[31m-                if (++n > 1) {[m
[31m-                    return NGX_DECLINED;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (key->data[i] == '.' && key->data[i + 1] == '.') {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (key->data[i] == '\0') {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (key->len > 1 && key->data[0] == '.') {[m
[31m-            skip = 1;[m
[31m-            goto wildcard;[m
[31m-        }[m
[31m-[m
[31m-        if (key->len > 2) {[m
[31m-[m
[31m-            if (key->data[0] == '*' && key->data[1] == '.') {[m
[31m-                skip = 2;[m
[31m-                goto wildcard;[m
[31m-            }[m
[31m-[m
[31m-            if (key->data[i - 2] == '.' && key->data[i - 1] == '*') {[m
[31m-                skip = 0;[m
[31m-                last -= 2;[m
[31m-                goto wildcard;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* exact hash */[m
[31m-[m
[31m-    k = 0;[m
[31m-[m
[31m-    for (i = 0; i < last; i++) {[m
[31m-        if (!(flags & NGX_HASH_READONLY_KEY)) {[m
[31m-            key->data[i] = ngx_tolower(key->data[i]);[m
[31m-        }[m
[31m-        k = ngx_hash(k, key->data[i]);[m
[31m-    }[m
[31m-[m
[31m-    k %= ha->hsize;[m
[31m-[m
[31m-    /* check conflicts in exact hash */[m
[31m-[m
[31m-    name = ha->keys_hash[k].elts;[m
[31m-[m
[31m-    if (name) {[m
[31m-        for (i = 0; i < ha->keys_hash[k].nelts; i++) {[m
[31m-            if (last != name[i].len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp(key->data, name[i].data, last) == 0) {[m
[31m-                return NGX_BUSY;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_array_init(&ha->keys_hash[k], ha->temp_pool, 4,[m
[31m-                           sizeof(ngx_str_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    name = ngx_array_push(&ha->keys_hash[k]);[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *name = *key;[m
[31m-[m
[31m-    hk = ngx_array_push(&ha->keys);[m
[31m-    if (hk == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hk->key = *key;[m
[31m-    hk->key_hash = ngx_hash_key(key->data, last);[m
[31m-    hk->value = value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-[m
[31m-wildcard:[m
[31m-[m
[31m-    /* wildcard hash */[m
[31m-[m
[31m-    k = ngx_hash_strlow(&key->data[skip], &key->data[skip], last - skip);[m
[31m-[m
[31m-    k %= ha->hsize;[m
[31m-[m
[31m-    if (skip == 1) {[m
[31m-[m
[31m-        /* check conflicts in exact hash for ".example.com" */[m
[31m-[m
[31m-        name = ha->keys_hash[k].elts;[m
[31m-[m
[31m-        if (name) {[m
[31m-            len = last - skip;[m
[31m-[m
[31m-            for (i = 0; i < ha->keys_hash[k].nelts; i++) {[m
[31m-                if (len != name[i].len) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strncmp(&key->data[1], name[i].data, len) == 0) {[m
[31m-                    return NGX_BUSY;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_array_init(&ha->keys_hash[k], ha->temp_pool, 4,[m
[31m-                               sizeof(ngx_str_t))[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        name = ngx_array_push(&ha->keys_hash[k]);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name->len = last - 1;[m
[31m-        name->data = ngx_pnalloc(ha->temp_pool, name->len);[m
[31m-        if (name->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(name->data, &key->data[1], name->len);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (skip) {[m
[31m-[m
[31m-        /*[m
[31m-         * convert "*.example.com" to "com.example.\0"[m
[31m-         *      and ".example.com" to "com.example\0"[m
[31m-         */[m
[31m-[m
[31m-        p = ngx_pnalloc(ha->temp_pool, last);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = 0;[m
[31m-        n = 0;[m
[31m-[m
[31m-        for (i = last - 1; i; i--) {[m
[31m-            if (key->data[i] == '.') {[m
[31m-                ngx_memcpy(&p[n], &key->data[i + 1], len);[m
[31m-                n += len;[m
[31m-                p[n++] = '.';[m
[31m-                len = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len++;[m
[31m-        }[m
[31m-[m
[31m-        if (len) {[m
[31m-            ngx_memcpy(&p[n], &key->data[1], len);[m
[31m-            n += len;[m
[31m-        }[m
[31m-[m
[31m-        p[n] = '\0';[m
[31m-[m
[31m-        hwc = &ha->dns_wc_head;[m
[31m-        keys = &ha->dns_wc_head_hash[k];[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* convert "www.example.*" to "www.example\0" */[m
[31m-[m
[31m-        last++;[m
[31m-[m
[31m-        p = ngx_pnalloc(ha->temp_pool, last);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_cpystrn(p, key->data, last);[m
[31m-[m
[31m-        hwc = &ha->dns_wc_tail;[m
[31m-        keys = &ha->dns_wc_tail_hash[k];[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* check conflicts in wildcard hash */[m
[31m-[m
[31m-    name = keys->elts;[m
[31m-[m
[31m-    if (name) {[m
[31m-        len = last - skip;[m
[31m-[m
[31m-        for (i = 0; i < keys->nelts; i++) {[m
[31m-            if (len != name[i].len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp(key->data + skip, name[i].data, len) == 0) {[m
[31m-                return NGX_BUSY;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_array_init(keys, ha->temp_pool, 4, sizeof(ngx_str_t)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    name = ngx_array_push(keys);[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->len = last - skip;[m
[31m-    name->data = ngx_pnalloc(ha->temp_pool, name->len);[m
[31m-    if (name->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name->data, key->data + skip, name->len);[m
[31m-[m
[31m-[m
[31m-    /* add to wildcard hash */[m
[31m-[m
[31m-    hk = ngx_array_push(hwc);[m
[31m-    if (hk == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hk->key.len = last - 1;[m
[31m-    hk->key.data = p;[m
[31m-    hk->key_hash = 0;[m
[31m-    hk->value = value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_hash.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_hash.h[m
[1mdeleted file mode 100644[m
[1mindex abc3cbe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_hash.h[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HASH_H_INCLUDED_[m
[31m-#define _NGX_HASH_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void             *value;[m
[31m-    u_short           len;[m
[31m-    u_char            name[1];[m
[31m-} ngx_hash_elt_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_elt_t  **buckets;[m
[31m-    ngx_uint_t        size;[m
[31m-} ngx_hash_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t        hash;[m
[31m-    void             *value;[m
[31m-} ngx_hash_wildcard_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t         key;[m
[31m-    ngx_uint_t        key_hash;[m
[31m-    void             *value;[m
[31m-} ngx_hash_key_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_uint_t (*ngx_hash_key_pt) (u_char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t            hash;[m
[31m-    ngx_hash_wildcard_t  *wc_head;[m
[31m-    ngx_hash_wildcard_t  *wc_tail;[m
[31m-} ngx_hash_combined_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t       *hash;[m
[31m-    ngx_hash_key_pt   key;[m
[31m-[m
[31m-    ngx_uint_t        max_size;[m
[31m-    ngx_uint_t        bucket_size;[m
[31m-[m
[31m-    char             *name;[m
[31m-    ngx_pool_t       *pool;[m
[31m-    ngx_pool_t       *temp_pool;[m
[31m-} ngx_hash_init_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HASH_SMALL            1[m
[31m-#define NGX_HASH_LARGE            2[m
[31m-[m
[31m-#define NGX_HASH_LARGE_ASIZE      16384[m
[31m-#define NGX_HASH_LARGE_HSIZE      10007[m
[31m-[m
[31m-#define NGX_HASH_WILDCARD_KEY     1[m
[31m-#define NGX_HASH_READONLY_KEY     2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t        hsize;[m
[31m-[m
[31m-    ngx_pool_t       *pool;[m
[31m-    ngx_pool_t       *temp_pool;[m
[31m-[m
[31m-    ngx_array_t       keys;[m
[31m-    ngx_array_t      *keys_hash;[m
[31m-[m
[31m-    ngx_array_t       dns_wc_head;[m
[31m-    ngx_array_t      *dns_wc_head_hash;[m
[31m-[m
[31m-    ngx_array_t       dns_wc_tail;[m
[31m-    ngx_array_t      *dns_wc_tail_hash;[m
[31m-} ngx_hash_keys_arrays_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t        hash;[m
[31m-    ngx_str_t         key;[m
[31m-    ngx_str_t         value;[m
[31m-    u_char           *lowcase_key;[m
[31m-} ngx_table_elt_t;[m
[31m-[m
[31m-[m
[31m-void *ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len);[m
[31m-void *ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len);[m
[31m-void *ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len);[m
[31m-void *ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key,[m
[31m-    u_char *name, size_t len);[m
[31m-[m
[31m-ngx_int_t ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,[m
[31m-    ngx_uint_t nelts);[m
[31m-ngx_int_t ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,[m
[31m-    ngx_uint_t nelts);[m
[31m-[m
[31m-#define ngx_hash(key, c)   ((ngx_uint_t) key * 31 + c)[m
[31m-ngx_uint_t ngx_hash_key(u_char *data, size_t len);[m
[31m-ngx_uint_t ngx_hash_key_lc(u_char *data, size_t len);[m
[31m-ngx_uint_t ngx_hash_strlow(u_char *dst, u_char *src, size_t n);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type);[m
[31m-ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key,[m
[31m-    void *value, ngx_uint_t flags);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HASH_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_inet.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_inet.c[m
[1mdeleted file mode 100644[m
[1mindex 33b303d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_inet.c[m
[1m+++ /dev/null[m
[36m@@ -1,1277 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-static ngx_int_t ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-[m
[31m-[m
[31m-in_addr_t[m
[31m-ngx_inet_addr(u_char *text, size_t len)[m
[31m-{[m
[31m-    u_char      *p, c;[m
[31m-    in_addr_t    addr;[m
[31m-    ngx_uint_t   octet, n;[m
[31m-[m
[31m-    addr = 0;[m
[31m-    octet = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (p = text; p < text + len; p++) {[m
[31m-        c = *p;[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            octet = octet * 10 + (c - '0');[m
[31m-[m
[31m-            if (octet > 255) {[m
[31m-                return INADDR_NONE;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (c == '.') {[m
[31m-            addr = (addr << 8) + octet;[m
[31m-            octet = 0;[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return INADDR_NONE;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 3) {[m
[31m-        addr = (addr << 8) + octet;[m
[31m-        return htonl(addr);[m
[31m-    }[m
[31m-[m
[31m-    return INADDR_NONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_inet6_addr(u_char *p, size_t len, u_char *addr)[m
[31m-{[m
[31m-    u_char      c, *zero, *digit, *s, *d;[m
[31m-    size_t      len4;[m
[31m-    ngx_uint_t  n, nibbles, word;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    zero = NULL;[m
[31m-    digit = NULL;[m
[31m-    len4 = 0;[m
[31m-    nibbles = 0;[m
[31m-    word = 0;[m
[31m-    n = 8;[m
[31m-[m
[31m-    if (p[0] == ':') {[m
[31m-        p++;[m
[31m-        len--;[m
[31m-    }[m
[31m-[m
[31m-    for (/* void */; len; len--) {[m
[31m-        c = *p++;[m
[31m-[m
[31m-        if (c == ':') {[m
[31m-            if (nibbles) {[m
[31m-                digit = p;[m
[31m-                len4 = len;[m
[31m-                *addr++ = (u_char) (word >> 8);[m
[31m-                *addr++ = (u_char) (word & 0xff);[m
[31m-[m
[31m-                if (--n) {[m
[31m-                    nibbles = 0;[m
[31m-                    word = 0;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                if (zero == NULL) {[m
[31m-                    digit = p;[m
[31m-                    len4 = len;[m
[31m-                    zero = addr;[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (c == '.' && nibbles) {[m
[31m-            if (n < 2 || digit == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            word = ngx_inet_addr(digit, len4 - 1);[m
[31m-            if (word == INADDR_NONE) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            word = ntohl(word);[m
[31m-            *addr++ = (u_char) ((word >> 24) & 0xff);[m
[31m-            *addr++ = (u_char) ((word >> 16) & 0xff);[m
[31m-            n--;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (++nibbles > 4) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            word = word * 16 + (c - '0');[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        c |= 0x20;[m
[31m-[m
[31m-        if (c >= 'a' && c <= 'f') {[m
[31m-            word = word * 16 + (c - 'a') + 10;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (nibbles == 0 && zero == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *addr++ = (u_char) (word >> 8);[m
[31m-    *addr++ = (u_char) (word & 0xff);[m
[31m-[m
[31m-    if (--n) {[m
[31m-        if (zero) {[m
[31m-            n *= 2;[m
[31m-            s = addr - 1;[m
[31m-            d = s + n;[m
[31m-            while (s >= zero) {[m
[31m-                *d-- = *s--;[m
[31m-            }[m
[31m-            ngx_memzero(zero, n);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (zero == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, size_t len,[m
[31m-    ngx_uint_t port)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    size_t                n;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    struct sockaddr_un   *saun;[m
[31m-#endif[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-[m
[31m-        sin = (struct sockaddr_in *) sa;[m
[31m-        p = (u_char *) &sin->sin_addr;[m
[31m-[m
[31m-        if (port) {[m
[31m-            p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud:%d",[m
[31m-                             p[0], p[1], p[2], p[3], ntohs(sin->sin_port));[m
[31m-        } else {[m
[31m-            p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",[m
[31m-                             p[0], p[1], p[2], p[3]);[m
[31m-        }[m
[31m-[m
[31m-        return (p - text);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-[m
[31m-        sin6 = (struct sockaddr_in6 *) sa;[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        if (port) {[m
[31m-            text[n++] = '[';[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_inet6_ntop(sin6->sin6_addr.s6_addr, &text[n], len);[m
[31m-[m
[31m-        if (port) {[m
[31m-            n = ngx_sprintf(&text[1 + n], "]:%d",[m
[31m-                            ntohs(sin6->sin6_port)) - text;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    case AF_UNIX:[m
[31m-        saun = (struct sockaddr_un *) sa;[m
[31m-[m
[31m-        /* on Linux sockaddr might not include sun_path at all */[m
[31m-[m
[31m-        if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)) {[m
[31m-            p = ngx_snprintf(text, len, "unix:%Z");[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path);[m
[31m-        }[m
[31m-[m
[31m-        /* we do not include trailing zero in address length */[m
[31m-[m
[31m-        return (p - text - 1);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_inet_ntop(int family, void *addr, u_char *text, size_t len)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    switch (family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-[m
[31m-        p = addr;[m
[31m-[m
[31m-        return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",[m
[31m-                            p[0], p[1], p[2], p[3])[m
[31m-               - text;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-        return ngx_inet6_ntop(addr, text, len);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-size_t[m
[31m-ngx_inet6_ntop(u_char *p, u_char *text, size_t len)[m
[31m-{[m
[31m-    u_char      *dst;[m
[31m-    size_t       max, n;[m
[31m-    ngx_uint_t   i, zero, last;[m
[31m-[m
[31m-    if (len < NGX_INET6_ADDRSTRLEN) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    zero = (ngx_uint_t) -1;[m
[31m-    last = (ngx_uint_t) -1;[m
[31m-    max = 1;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < 16; i += 2) {[m
[31m-[m
[31m-        if (p[i] || p[i + 1]) {[m
[31m-[m
[31m-            if (max < n) {[m
[31m-                zero = last;[m
[31m-                max = n;[m
[31m-            }[m
[31m-[m
[31m-            n = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n++ == 0) {[m
[31m-            last = i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (max < n) {[m
[31m-        zero = last;[m
[31m-        max = n;[m
[31m-    }[m
[31m-[m
[31m-    dst = text;[m
[31m-    n = 16;[m
[31m-[m
[31m-    if (zero == 0) {[m
[31m-[m
[31m-        if ((max == 5 && p[10] == 0xff && p[11] == 0xff)[m
[31m-            || (max == 6)[m
[31m-            || (max == 7 && p[14] != 0 && p[15] != 1))[m
[31m-        {[m
[31m-            n = 12;[m
[31m-        }[m
[31m-[m
[31m-        *dst++ = ':';[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < n; i += 2) {[m
[31m-[m
[31m-        if (i == zero) {[m
[31m-            *dst++ = ':';[m
[31m-            i += (max - 1) * 2;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dst = ngx_sprintf(dst, "%xd", p[i] * 256 + p[i + 1]);[m
[31m-[m
[31m-        if (i < 14) {[m
[31m-            *dst++ = ':';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n == 12) {[m
[31m-        dst = ngx_sprintf(dst, "%ud.%ud.%ud.%ud", p[12], p[13], p[14], p[15]);[m
[31m-    }[m
[31m-[m
[31m-    return dst - text;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr)[m
[31m-{[m
[31m-    u_char      *addr, *mask, *last;[m
[31m-    size_t       len;[m
[31m-    ngx_int_t    shift;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_uint_t   s, i;[m
[31m-#endif[m
[31m-[m
[31m-    addr = text->data;[m
[31m-    last = addr + text->len;[m
[31m-[m
[31m-    mask = ngx_strlchr(addr, last, '/');[m
[31m-    len = (mask ? mask : last) - addr;[m
[31m-[m
[31m-    cidr->u.in.addr = ngx_inet_addr(addr, len);[m
[31m-[m
[31m-    if (cidr->u.in.addr != INADDR_NONE) {[m
[31m-        cidr->family = AF_INET;[m
[31m-[m
[31m-        if (mask == NULL) {[m
[31m-            cidr->u.in.mask = 0xffffffff;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    } else if (ngx_inet6_addr(addr, len, cidr->u.in6.addr.s6_addr) == NGX_OK) {[m
[31m-        cidr->family = AF_INET6;[m
[31m-[m
[31m-        if (mask == NULL) {[m
[31m-            ngx_memset(cidr->u.in6.mask.s6_addr, 0xff, 16);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    } else {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mask++;[m
[31m-[m
[31m-    shift = ngx_atoi(mask, last - mask);[m
[31m-    if (shift == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (cidr->family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        if (shift > 128) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        addr = cidr->u.in6.addr.s6_addr;[m
[31m-        mask = cidr->u.in6.mask.s6_addr;[m
[31m-        rc = NGX_OK;[m
[31m-[m
[31m-        for (i = 0; i < 16; i++) {[m
[31m-[m
[31m-            s = (shift > 8) ? 8 : shift;[m
[31m-            shift -= s;[m
[31m-[m
[31m-            mask[i] = (u_char) (0xffu << (8 - s));[m
[31m-[m
[31m-            if (addr[i] != (addr[i] & mask[i])) {[m
[31m-                rc = NGX_DONE;[m
[31m-                addr[i] &= mask[i];[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        if (shift > 32) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (shift) {[m
[31m-            cidr->u.in.mask = htonl((uint32_t) (0xffffffffu << (32 - shift)));[m
[31m-[m
[31m-        } else {[m
[31m-            /* x86 compilers use a shl instruction that shifts by modulo 32 */[m
[31m-            cidr->u.in.mask = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (cidr->u.in.addr == (cidr->u.in.addr & cidr->u.in.mask)) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        cidr->u.in.addr &= cidr->u.in.mask;[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len)[m
[31m-{[m
[31m-    in_addr_t             inaddr;[m
[31m-    ngx_uint_t            family;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct in6_addr       inaddr6;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-    /*[m
[31m-     * prevent MSVC8 warning:[m
[31m-     *    potentially uninitialized local variable 'inaddr6' used[m
[31m-     */[m
[31m-    ngx_memzero(&inaddr6, sizeof(struct in6_addr));[m
[31m-#endif[m
[31m-[m
[31m-    inaddr = ngx_inet_addr(text, len);[m
[31m-[m
[31m-    if (inaddr != INADDR_NONE) {[m
[31m-        family = AF_INET;[m
[31m-        len = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    } else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) == NGX_OK) {[m
[31m-        family = AF_INET6;[m
[31m-        len = sizeof(struct sockaddr_in6);[m
[31m-[m
[31m-#endif[m
[31m-    } else {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    addr->sockaddr = ngx_pcalloc(pool, len);[m
[31m-    if (addr->sockaddr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addr->sockaddr->sa_family = (u_char) family;[m
[31m-    addr->socklen = len;[m
[31m-[m
[31m-    switch (family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) addr->sockaddr;[m
[31m-        ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) addr->sockaddr;[m
[31m-        sin->sin_addr.s_addr = inaddr;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-    size_t   len;[m
[31m-[m
[31m-    p = u->url.data;[m
[31m-    len = u->url.len;[m
[31m-[m
[31m-    if (len >= 5 && ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) {[m
[31m-        return ngx_parse_unix_domain_url(pool, u);[m
[31m-    }[m
[31m-[m
[31m-    if (len && p[0] == '[') {[m
[31m-        return ngx_parse_inet6_url(pool, u);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_parse_inet_url(pool, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    u_char              *path, *uri, *last;[m
[31m-    size_t               len;[m
[31m-    struct sockaddr_un  *saun;[m
[31m-[m
[31m-    len = u->url.len;[m
[31m-    path = u->url.data;[m
[31m-[m
[31m-    path += 5;[m
[31m-    len -= 5;[m
[31m-[m
[31m-    if (u->uri_part) {[m
[31m-[m
[31m-        last = path + len;[m
[31m-        uri = ngx_strlchr(path, last, ':');[m
[31m-[m
[31m-        if (uri) {[m
[31m-            len = uri - path;[m
[31m-            uri++;[m
[31m-            u->uri.len = last - uri;[m
[31m-            u->uri.data = uri;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        u->err = "no path in the unix domain socket";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->host.len = len++;[m
[31m-    u->host.data = path;[m
[31m-[m
[31m-    if (len > sizeof(saun->sun_path)) {[m
[31m-        u->err = "too long path in the unix domain socket";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->socklen = sizeof(struct sockaddr_un);[m
[31m-    saun = (struct sockaddr_un *) &u->sockaddr;[m
[31m-    saun->sun_family = AF_UNIX;[m
[31m-    (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);[m
[31m-[m
[31m-    u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));[m
[31m-    if (u->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un));[m
[31m-    if (saun == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->family = AF_UNIX;[m
[31m-    u->naddrs = 1;[m
[31m-[m
[31m-    saun->sun_family = AF_UNIX;[m
[31m-    (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);[m
[31m-[m
[31m-    u->addrs[0].sockaddr = (struct sockaddr *) saun;[m
[31m-    u->addrs[0].socklen = sizeof(struct sockaddr_un);[m
[31m-    u->addrs[0].name.len = len + 4;[m
[31m-    u->addrs[0].name.data = u->url.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u->err = "the unix domain sockets are not supported on this platform";[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-    u_char               *p, *host, *port, *last, *uri, *args;[m
[31m-    size_t                len;[m
[31m-    ngx_int_t             n;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    u->socklen = sizeof(struct sockaddr_in);[m
[31m-    sin = (struct sockaddr_in *) &u->sockaddr;[m
[31m-    sin->sin_family = AF_INET;[m
[31m-[m
[31m-    u->family = AF_INET;[m
[31m-[m
[31m-    host = u->url.data;[m
[31m-[m
[31m-    last = host + u->url.len;[m
[31m-[m
[31m-    port = ngx_strlchr(host, last, ':');[m
[31m-[m
[31m-    uri = ngx_strlchr(host, last, '/');[m
[31m-[m
[31m-    args = ngx_strlchr(host, last, '?');[m
[31m-[m
[31m-    if (args) {[m
[31m-        if (uri == NULL || args < uri) {[m
[31m-            uri = args;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (uri) {[m
[31m-        if (u->listen || !u->uri_part) {[m
[31m-            u->err = "invalid host";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->uri.len = last - uri;[m
[31m-        u->uri.data = uri;[m
[31m-[m
[31m-        last = uri;[m
[31m-[m
[31m-        if (uri < port) {[m
[31m-            port = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (port) {[m
[31m-        port++;[m
[31m-[m
[31m-        len = last - port;[m
[31m-[m
[31m-        n = ngx_atoi(port, len);[m
[31m-[m
[31m-        if (n < 1 || n > 65535) {[m
[31m-            u->err = "invalid port";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->port = (in_port_t) n;[m
[31m-        sin->sin_port = htons((in_port_t) n);[m
[31m-[m
[31m-        u->port_text.len = len;[m
[31m-        u->port_text.data = port;[m
[31m-[m
[31m-        last = port - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        if (uri == NULL) {[m
[31m-[m
[31m-            if (u->listen) {[m
[31m-[m
[31m-                /* test value as port only */[m
[31m-[m
[31m-                n = ngx_atoi(host, last - host);[m
[31m-[m
[31m-                if (n != NGX_ERROR) {[m
[31m-[m
[31m-                    if (n < 1 || n > 65535) {[m
[31m-                        u->err = "invalid port";[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    u->port = (in_port_t) n;[m
[31m-                    sin->sin_port = htons((in_port_t) n);[m
[31m-[m
[31m-                    u->port_text.len = last - host;[m
[31m-                    u->port_text.data = host;[m
[31m-[m
[31m-                    u->wildcard = 1;[m
[31m-[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        u->no_port = 1;[m
[31m-        u->port = u->default_port;[m
[31m-        sin->sin_port = htons(u->default_port);[m
[31m-    }[m
[31m-[m
[31m-    len = last - host;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        u->err = "no host";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->host.len = len;[m
[31m-    u->host.data = host;[m
[31m-[m
[31m-    if (u->listen && len == 1 && *host == '*') {[m
[31m-        sin->sin_addr.s_addr = INADDR_ANY;[m
[31m-        u->wildcard = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sin->sin_addr.s_addr = ngx_inet_addr(host, len);[m
[31m-[m
[31m-    if (sin->sin_addr.s_addr != INADDR_NONE) {[m
[31m-[m
[31m-        if (sin->sin_addr.s_addr == INADDR_ANY) {[m
[31m-            u->wildcard = 1;[m
[31m-        }[m
[31m-[m
[31m-        u->naddrs = 1;[m
[31m-[m
[31m-        u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));[m
[31m-        if (u->addrs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));[m
[31m-        if (sin == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(sin, u->sockaddr, sizeof(struct sockaddr_in));[m
[31m-[m
[31m-        u->addrs[0].sockaddr = (struct sockaddr *) sin;[m
[31m-        u->addrs[0].socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-        p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",[m
[31m-                                           &u->host, u->port) - p;[m
[31m-        u->addrs[0].name.data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->no_resolve) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inet_resolve_host(pool, u) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->family = u->addrs[0].sockaddr->sa_family;[m
[31m-    u->socklen = u->addrs[0].socklen;[m
[31m-    ngx_memcpy(u->sockaddr, u->addrs[0].sockaddr, u->addrs[0].socklen);[m
[31m-[m
[31m-    switch (u->family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) &u->sockaddr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {[m
[31m-            u->wildcard = 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) &u->sockaddr;[m
[31m-[m
[31m-        if (sin->sin_addr.s_addr == INADDR_ANY) {[m
[31m-            u->wildcard = 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char               *p, *host, *port, *last, *uri;[m
[31m-    size_t                len;[m
[31m-    ngx_int_t             n;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-    u->socklen = sizeof(struct sockaddr_in6);[m
[31m-    sin6 = (struct sockaddr_in6 *) &u->sockaddr;[m
[31m-    sin6->sin6_family = AF_INET6;[m
[31m-[m
[31m-    host = u->url.data + 1;[m
[31m-[m
[31m-    last = u->url.data + u->url.len;[m
[31m-[m
[31m-    p = ngx_strlchr(host, last, ']');[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        u->err = "invalid host";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (last - p) {[m
[31m-[m
[31m-        port = p + 1;[m
[31m-[m
[31m-        uri = ngx_strlchr(port, last, '/');[m
[31m-[m
[31m-        if (uri) {[m
[31m-            if (u->listen || !u->uri_part) {[m
[31m-                u->err = "invalid host";[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            u->uri.len = last - uri;[m
[31m-            u->uri.data = uri;[m
[31m-[m
[31m-            last = uri;[m
[31m-        }[m
[31m-[m
[31m-        if (*port == ':') {[m
[31m-            port++;[m
[31m-[m
[31m-            len = last - port;[m
[31m-[m
[31m-            n = ngx_atoi(port, len);[m
[31m-[m
[31m-            if (n < 1 || n > 65535) {[m
[31m-                u->err = "invalid port";[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            u->port = (in_port_t) n;[m
[31m-            sin6->sin6_port = htons((in_port_t) n);[m
[31m-[m
[31m-            u->port_text.len = len;[m
[31m-            u->port_text.data = port;[m
[31m-[m
[31m-        } else {[m
[31m-            u->no_port = 1;[m
[31m-            u->port = u->default_port;[m
[31m-            sin6->sin6_port = htons(u->default_port);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = p - host;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        u->err = "no host";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->host.len = len + 2;[m
[31m-    u->host.data = host - 1;[m
[31m-[m
[31m-    if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) {[m
[31m-        u->err = "invalid IPv6 address";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {[m
[31m-        u->wildcard = 1;[m
[31m-    }[m
[31m-[m
[31m-    u->family = AF_INET6;[m
[31m-    u->naddrs = 1;[m
[31m-[m
[31m-    u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));[m
[31m-    if (u->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6));[m
[31m-    if (sin6 == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(sin6, u->sockaddr, sizeof(struct sockaddr_in6));[m
[31m-[m
[31m-    u->addrs[0].sockaddr = (struct sockaddr *) sin6;[m
[31m-    u->addrs[0].socklen = sizeof(struct sockaddr_in6);[m
[31m-[m
[31m-    p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",[m
[31m-                                       &u->host, u->port) - p;[m
[31m-    u->addrs[0].name.data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u->err = "the INET6 sockets are not supported on this platform";[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-    u_char               *p, *host;[m
[31m-    size_t                len;[m
[31m-    in_port_t             port;[m
[31m-    ngx_uint_t            i;[m
[31m-    struct addrinfo       hints, *res, *rp;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-    port = htons(u->port);[m
[31m-[m
[31m-    host = ngx_alloc(u->host.len + 1, pool->log);[m
[31m-    if (host == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);[m
[31m-[m
[31m-    ngx_memzero(&hints, sizeof(struct addrinfo));[m
[31m-    hints.ai_family = AF_UNSPEC;[m
[31m-    hints.ai_socktype = SOCK_STREAM;[m
[31m-#ifdef AI_ADDRCONFIG[m
[31m-    hints.ai_flags = AI_ADDRCONFIG;[m
[31m-#endif[m
[31m-[m
[31m-    if (getaddrinfo((char *) host, NULL, &hints, &res) != 0) {[m
[31m-        u->err = "host not found";[m
[31m-        ngx_free(host);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(host);[m
[31m-[m
[31m-    for (i = 0, rp = res; rp != NULL; rp = rp->ai_next) {[m
[31m-[m
[31m-        switch (rp->ai_family) {[m
[31m-[m
[31m-        case AF_INET:[m
[31m-        case AF_INET6:[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        i++;[m
[31m-    }[m
[31m-[m
[31m-    if (i == 0) {[m
[31m-        u->err = "host not found";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /* MP: ngx_shared_palloc() */[m
[31m-[m
[31m-    u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));[m
[31m-    if (u->addrs == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    u->naddrs = i;[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    /* AF_INET addresses first */[m
[31m-[m
[31m-    for (rp = res; rp != NULL; rp = rp->ai_next) {[m
[31m-[m
[31m-        if (rp->ai_family != AF_INET) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        sin = ngx_pcalloc(pool, rp->ai_addrlen);[m
[31m-        if (sin == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(sin, rp->ai_addr, rp->ai_addrlen);[m
[31m-[m
[31m-        sin->sin_port = port;[m
[31m-[m
[31m-        u->addrs[i].sockaddr = (struct sockaddr *) sin;[m
[31m-        u->addrs[i].socklen = rp->ai_addrlen;[m
[31m-[m
[31m-        len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;[m
[31m-[m
[31m-        p = ngx_pnalloc(pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_sock_ntop((struct sockaddr *) sin, rp->ai_addrlen, p, len, 1);[m
[31m-[m
[31m-        u->addrs[i].name.len = len;[m
[31m-        u->addrs[i].name.data = p;[m
[31m-[m
[31m-        i++;[m
[31m-    }[m
[31m-[m
[31m-    for (rp = res; rp != NULL; rp = rp->ai_next) {[m
[31m-[m
[31m-        if (rp->ai_family != AF_INET6) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        sin6 = ngx_pcalloc(pool, rp->ai_addrlen);[m
[31m-        if (sin6 == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(sin6, rp->ai_addr, rp->ai_addrlen);[m
[31m-[m
[31m-        sin6->sin6_port = port;[m
[31m-[m
[31m-        u->addrs[i].sockaddr = (struct sockaddr *) sin6;[m
[31m-        u->addrs[i].socklen = rp->ai_addrlen;[m
[31m-[m
[31m-        len = NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1;[m
[31m-[m
[31m-        p = ngx_pnalloc(pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_sock_ntop((struct sockaddr *) sin6, rp->ai_addrlen, p,[m
[31m-                            len, 1);[m
[31m-[m
[31m-        u->addrs[i].name.len = len;[m
[31m-        u->addrs[i].name.data = p;[m
[31m-[m
[31m-        i++;[m
[31m-    }[m
[31m-[m
[31m-    freeaddrinfo(res);[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    freeaddrinfo(res);[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#else /* !NGX_HAVE_GETADDRINFO || !NGX_HAVE_INET6 */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-    u_char              *p, *host;[m
[31m-    size_t               len;[m
[31m-    in_port_t            port;[m
[31m-    in_addr_t            in_addr;[m
[31m-    ngx_uint_t           i;[m
[31m-    struct hostent      *h;[m
[31m-    struct sockaddr_in  *sin;[m
[31m-[m
[31m-    /* AF_INET only */[m
[31m-[m
[31m-    port = htons(u->port);[m
[31m-[m
[31m-    in_addr = ngx_inet_addr(u->host.data, u->host.len);[m
[31m-[m
[31m-    if (in_addr == INADDR_NONE) {[m
[31m-        host = ngx_alloc(u->host.len + 1, pool->log);[m
[31m-        if (host == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);[m
[31m-[m
[31m-        h = gethostbyname((char *) host);[m
[31m-[m
[31m-        ngx_free(host);[m
[31m-[m
[31m-        if (h == NULL || h->h_addr_list[0] == NULL) {[m
[31m-            u->err = "host not found";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ }[m
[31m-[m
[31m-        /* MP: ngx_shared_palloc() */[m
[31m-[m
[31m-        u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));[m
[31m-        if (u->addrs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->naddrs = i;[m
[31m-[m
[31m-        for (i = 0; i < u->naddrs; i++) {[m
[31m-[m
[31m-            sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));[m
[31m-            if (sin == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sin->sin_family = AF_INET;[m
[31m-            sin->sin_port = port;[m
[31m-            sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);[m
[31m-[m
[31m-            u->addrs[i].sockaddr = (struct sockaddr *) sin;[m
[31m-            u->addrs[i].socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-            len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;[m
[31m-[m
[31m-            p = ngx_pnalloc(pool, len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = ngx_sock_ntop((struct sockaddr *) sin,[m
[31m-                                sizeof(struct sockaddr_in), p, len, 1);[m
[31m-[m
[31m-            u->addrs[i].name.len = len;[m
[31m-            u->addrs[i].name.data = p;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* MP: ngx_shared_palloc() */[m
[31m-[m
[31m-        u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));[m
[31m-        if (u->addrs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));[m
[31m-        if (sin == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->naddrs = 1;[m
[31m-[m
[31m-        sin->sin_family = AF_INET;[m
[31m-        sin->sin_port = port;[m
[31m-        sin->sin_addr.s_addr = in_addr;[m
[31m-[m
[31m-        u->addrs[0].sockaddr = (struct sockaddr *) sin;[m
[31m-        u->addrs[0].socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-        p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",[m
[31m-                                           &u->host, ntohs(port)) - p;[m
[31m-        u->addrs[0].name.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6 */[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1,[m
[31m-    struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port)[m
[31m-{[m
[31m-    struct sockaddr_in   *sin1, *sin2;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin61, *sin62;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    struct sockaddr_un   *saun1, *saun2;[m
[31m-#endif[m
[31m-[m
[31m-    if (sa1->sa_family != sa2->sa_family) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    switch (sa1->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-[m
[31m-        sin61 = (struct sockaddr_in6 *) sa1;[m
[31m-        sin62 = (struct sockaddr_in6 *) sa2;[m
[31m-[m
[31m-        if (cmp_port && sin61->sin6_port != sin62->sin6_port) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_memcmp(&sin61->sin6_addr, &sin62->sin6_addr, 16) != 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-[m
[31m-        /* TODO length */[m
[31m-[m
[31m-        saun1 = (struct sockaddr_un *) sa1;[m
[31m-        saun2 = (struct sockaddr_un *) sa2;[m
[31m-[m
[31m-        if (ngx_memcmp(&saun1->sun_path, &saun2->sun_path,[m
[31m-                       sizeof(saun1->sun_path))[m
[31m-            != 0)[m
[31m-        {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-[m
[31m-        sin1 = (struct sockaddr_in *) sa1;[m
[31m-        sin2 = (struct sockaddr_in *) sa2;[m
[31m-[m
[31m-        if (cmp_port && sin1->sin_port != sin2->sin_port) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_inet.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_inet.h[m
[1mdeleted file mode 100644[m
[1mindex 0555750..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_inet.h[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_INET_H_INCLUDED_[m
[31m-#define _NGX_INET_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * TODO: autoconfigure NGX_SOCKADDRLEN and NGX_SOCKADDR_STRLEN as[m
[31m- *       sizeof(struct sockaddr_storage)[m
[31m- *       sizeof(struct sockaddr_un)[m
[31m- *       sizeof(struct sockaddr_in6)[m
[31m- *       sizeof(struct sockaddr_in)[m
[31m- */[m
[31m-[m
[31m-#define NGX_INET_ADDRSTRLEN   (sizeof("255.255.255.255") - 1)[m
[31m-#define NGX_INET6_ADDRSTRLEN                                                 \[m
[31m-    (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)[m
[31m-#define NGX_UNIX_ADDRSTRLEN                                                  \[m
[31m-    (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-#define NGX_SOCKADDR_STRLEN   (sizeof("unix:") - 1 + NGX_UNIX_ADDRSTRLEN)[m
[31m-#else[m
[31m-#define NGX_SOCKADDR_STRLEN   (NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1)[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-#define NGX_SOCKADDRLEN       sizeof(struct sockaddr_un)[m
[31m-#else[m
[31m-#define NGX_SOCKADDRLEN       512[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t                 addr;[m
[31m-    in_addr_t                 mask;[m
[31m-} ngx_in_cidr_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr           addr;[m
[31m-    struct in6_addr           mask;[m
[31m-} ngx_in6_cidr_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                family;[m
[31m-    union {[m
[31m-        ngx_in_cidr_t         in;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        ngx_in6_cidr_t        in6;[m
[31m-#endif[m
[31m-    } u;[m
[31m-} ngx_cidr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct sockaddr          *sockaddr;[m
[31m-    socklen_t                 socklen;[m
[31m-    ngx_str_t                 name;[m
[31m-} ngx_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 url;[m
[31m-    ngx_str_t                 host;[m
[31m-    ngx_str_t                 port_text;[m
[31m-    ngx_str_t                 uri;[m
[31m-[m
[31m-    in_port_t                 port;[m
[31m-    in_port_t                 default_port;[m
[31m-    int                       family;[m
[31m-[m
[31m-    unsigned                  listen:1;[m
[31m-    unsigned                  uri_part:1;[m
[31m-    unsigned                  no_resolve:1;[m
[31m-    unsigned                  one_addr:1;  /* compatibility */[m
[31m-[m
[31m-    unsigned                  no_port:1;[m
[31m-    unsigned                  wildcard:1;[m
[31m-[m
[31m-    socklen_t                 socklen;[m
[31m-    u_char                    sockaddr[NGX_SOCKADDRLEN];[m
[31m-[m
[31m-    ngx_addr_t               *addrs;[m
[31m-    ngx_uint_t                naddrs;[m
[31m-[m
[31m-    char                     *err;[m
[31m-} ngx_url_t;[m
[31m-[m
[31m-[m
[31m-in_addr_t ngx_inet_addr(u_char *text, size_t len);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-ngx_int_t ngx_inet6_addr(u_char *p, size_t len, u_char *addr);[m
[31m-size_t ngx_inet6_ntop(u_char *p, u_char *text, size_t len);[m
[31m-#endif[m
[31m-size_t ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text,[m
[31m-    size_t len, ngx_uint_t port);[m
[31m-size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len);[m
[31m-ngx_int_t ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr);[m
[31m-ngx_int_t ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text,[m
[31m-    size_t len);[m
[31m-ngx_int_t ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-ngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-ngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1,[m
[31m-    struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_INET_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_list.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_list.c[m
[1mdeleted file mode 100644[m
[1mindex d0eb159..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_list.c[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_list_t *[m
[31m-ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)[m
[31m-{[m
[31m-    ngx_list_t  *list;[m
[31m-[m
[31m-    list = ngx_palloc(pool, sizeof(ngx_list_t));[m
[31m-    if (list == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(list, pool, n, size) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return list;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_list_push(ngx_list_t *l)[m
[31m-{[m
[31m-    void             *elt;[m
[31m-    ngx_list_part_t  *last;[m
[31m-[m
[31m-    last = l->last;[m
[31m-[m
[31m-    if (last->nelts == l->nalloc) {[m
[31m-[m
[31m-        /* the last part is full, allocate a new list part */[m
[31m-[m
[31m-        last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));[m
[31m-        if (last == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        last->elts = ngx_palloc(l->pool, l->nalloc * l->size);[m
[31m-        if (last->elts == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        last->nelts = 0;[m
[31m-        last->next = NULL;[m
[31m-[m
[31m-        l->last->next = last;[m
[31m-        l->last = last;[m
[31m-    }[m
[31m-[m
[31m-    elt = (char *) last->elts + l->size * last->nelts;[m
[31m-    last->nelts++;[m
[31m-[m
[31m-    return elt;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_list.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_list.h[m
[1mdeleted file mode 100644[m
[1mindex e0fe643..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_list.h[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LIST_H_INCLUDED_[m
[31m-#define _NGX_LIST_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_list_part_s  ngx_list_part_t;[m
[31m-[m
[31m-struct ngx_list_part_s {[m
[31m-    void             *elts;[m
[31m-    ngx_uint_t        nelts;[m
[31m-    ngx_list_part_t  *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_list_part_t  *last;[m
[31m-    ngx_list_part_t   part;[m
[31m-    size_t            size;[m
[31m-    ngx_uint_t        nalloc;[m
[31m-    ngx_pool_t       *pool;[m
[31m-} ngx_list_t;[m
[31m-[m
[31m-[m
[31m-ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size);[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)[m
[31m-{[m
[31m-    list->part.elts = ngx_palloc(pool, n * size);[m
[31m-    if (list->part.elts == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    list->part.nelts = 0;[m
[31m-    list->part.next = NULL;[m
[31m-    list->last = &list->part;[m
[31m-    list->size = size;[m
[31m-    list->nalloc = n;[m
[31m-    list->pool = pool;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- *[m
[31m- *  the iteration through the list:[m
[31m- *[m
[31m- *  part = &list.part;[m
[31m- *  data = part->elts;[m
[31m- *[m
[31m- *  for (i = 0 ;; i++) {[m
[31m- *[m
[31m- *      if (i >= part->nelts) {[m
[31m- *          if (part->next == NULL) {[m
[31m- *              break;[m
[31m- *          }[m
[31m- *[m
[31m- *          part = part->next;[m
[31m- *          data = part->elts;[m
[31m- *          i = 0;[m
[31m- *      }[m
[31m- *[m
[31m- *      ...  data[i] ...[m
[31m- *[m
[31m- *  }[m
[31m- */[m
[31m-[m
[31m-[m
[31m-void *ngx_list_push(ngx_list_t *list);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LIST_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.c[m
[1mdeleted file mode 100644[m
[1mindex 8e9408d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.c[m
[1m+++ /dev/null[m
[36m@@ -1,755 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log);[m
[31m-static void ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log);[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-static void ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level,[m
[31m-    u_char *buf, size_t len);[m
[31m-static void ngx_log_memory_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char        *start;[m
[31m-    u_char        *end;[m
[31m-    u_char        *pos;[m
[31m-    ngx_atomic_t   written;[m
[31m-} ngx_log_memory_buf_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_errlog_commands[] = {[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_error_log,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_errlog_module_ctx = {[m
[31m-    ngx_string("errlog"),[m
[31m-    NULL,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_errlog_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_errlog_module_ctx,                /* module context */[m
[31m-    ngx_errlog_commands,                   /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_log_t        ngx_log;[m
[31m-static ngx_open_file_t  ngx_log_file;[m
[31m-ngx_uint_t              ngx_use_stderr = 1;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t err_levels[] = {[m
[31m-    ngx_null_string,[m
[31m-    ngx_string("emerg"),[m
[31m-    ngx_string("alert"),[m
[31m-    ngx_string("crit"),[m
[31m-    ngx_string("error"),[m
[31m-    ngx_string("warn"),[m
[31m-    ngx_string("notice"),[m
[31m-    ngx_string("info"),[m
[31m-    ngx_string("debug")[m
[31m-};[m
[31m-[m
[31m-static const char *debug_levels[] = {[m
[31m-    "debug_core", "debug_alloc", "debug_mutex", "debug_event",[m
[31m-    "debug_http", "debug_mail", "debug_stream"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-void[m
[31m-ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-void[m
[31m-ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, va_list args)[m
[31m-[m
[31m-#endif[m
[31m-{[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-    va_list      args;[m
[31m-#endif[m
[31m-    u_char      *p, *last, *msg;[m
[31m-    ssize_t      n;[m
[31m-    ngx_uint_t   wrote_stderr, debug_connection;[m
[31m-    u_char       errstr[NGX_MAX_ERROR_STR];[m
[31m-[m
[31m-    last = errstr + NGX_MAX_ERROR_STR;[m
[31m-[m
[31m-    p = ngx_cpymem(errstr, ngx_cached_err_log_time.data,[m
[31m-                   ngx_cached_err_log_time.len);[m
[31m-[m
[31m-    p = ngx_slprintf(p, last, " [%V] ", &err_levels[level]);[m
[31m-[m
[31m-    /* pid#tid */[m
[31m-    p = ngx_slprintf(p, last, "%P#" NGX_TID_T_FMT ": ",[m
[31m-                    ngx_log_pid, ngx_log_tid);[m
[31m-[m
[31m-    if (log->connection) {[m
[31m-        p = ngx_slprintf(p, last, "*%uA ", log->connection);[m
[31m-    }[m
[31m-[m
[31m-    msg = p;[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(p, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    p = ngx_vslprintf(p, last, fmt, args);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (err) {[m
[31m-        p = ngx_log_errno(p, last, err);[m
[31m-    }[m
[31m-[m
[31m-    if (level != NGX_LOG_DEBUG && log->handler) {[m
[31m-        p = log->handler(log, p, last - p);[m
[31m-    }[m
[31m-[m
[31m-    if (p > last - NGX_LINEFEED_SIZE) {[m
[31m-        p = last - NGX_LINEFEED_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_linefeed(p);[m
[31m-[m
[31m-    wrote_stderr = 0;[m
[31m-    debug_connection = (log->log_level & NGX_LOG_DEBUG_CONNECTION) != 0;[m
[31m-[m
[31m-    while (log) {[m
[31m-[m
[31m-        if (log->log_level < level && !debug_connection) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (log->writer) {[m
[31m-            log->writer(log, level, errstr, p - errstr);[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_time() == log->disk_full_time) {[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD writing to a full filesystem with enabled softupdates[m
[31m-             * may block process for much longer time than writing to non-full[m
[31m-             * filesystem, so we skip writing to a log for one second[m
[31m-             */[m
[31m-[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_write_fd(log->file->fd, errstr, p - errstr);[m
[31m-[m
[31m-        if (n == -1 && ngx_errno == NGX_ENOSPC) {[m
[31m-            log->disk_full_time = ngx_time();[m
[31m-        }[m
[31m-[m
[31m-        if (log->file->fd == ngx_stderr) {[m
[31m-            wrote_stderr = 1;[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        log = log->next;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_use_stderr[m
[31m-        || level > NGX_LOG_WARN[m
[31m-        || wrote_stderr)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    msg -= (7 + err_levels[level].len + 3);[m
[31m-[m
[31m-    (void) ngx_sprintf(msg, "nginx: [%V] ", &err_levels[level]);[m
[31m-[m
[31m-    (void) ngx_write_console(ngx_stderr, msg, p - msg);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if !(NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...)[m
[31m-{[m
[31m-    va_list  args;[m
[31m-[m
[31m-    if (log->log_level >= level) {[m
[31m-        va_start(args, fmt);[m
[31m-        ngx_log_error_core(level, log, err, fmt, args);[m
[31m-        va_end(args);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...)[m
[31m-{[m
[31m-    va_list  args;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, args);[m
[31m-    va_end(args);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_log_abort(ngx_err_t err, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p;[m
[31m-    va_list   args;[m
[31m-    u_char    errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vsnprintf(errstr, sizeof(errstr) - 1, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,[m
[31m-                  "%*s", p - errstr, errstr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_log_stderr(ngx_err_t err, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p, *last;[m
[31m-    va_list   args;[m
[31m-    u_char    errstr[NGX_MAX_ERROR_STR];[m
[31m-[m
[31m-    last = errstr + NGX_MAX_ERROR_STR;[m
[31m-[m
[31m-    p = ngx_cpymem(errstr, "nginx: ", 7);[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(p, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    if (err) {[m
[31m-        p = ngx_log_errno(p, last, err);[m
[31m-    }[m
[31m-[m
[31m-    if (p > last - NGX_LINEFEED_SIZE) {[m
[31m-        p = last - NGX_LINEFEED_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_linefeed(p);[m
[31m-[m
[31m-    (void) ngx_write_console(ngx_stderr, errstr, p - errstr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err)[m
[31m-{[m
[31m-    if (buf > last - 50) {[m
[31m-[m
[31m-        /* leave a space for an error code */[m
[31m-[m
[31m-        buf = last - 50;[m
[31m-        *buf++ = '.';[m
[31m-        *buf++ = '.';[m
[31m-        *buf++ = '.';[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    buf = ngx_slprintf(buf, last, ((unsigned) err < 0x80000000)[m
[31m-                                       ? " (%d: " : " (%Xd: ", err);[m
[31m-#else[m
[31m-    buf = ngx_slprintf(buf, last, " (%d: ", err);[m
[31m-#endif[m
[31m-[m
[31m-    buf = ngx_strerror(err, buf, last - buf);[m
[31m-[m
[31m-    if (buf < last) {[m
[31m-        *buf++ = ')';[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_log_t *[m
[31m-ngx_log_init(u_char *prefix)[m
[31m-{[m
[31m-    u_char  *p, *name;[m
[31m-    size_t   nlen, plen;[m
[31m-[m
[31m-    ngx_log.file = &ngx_log_file;[m
[31m-    ngx_log.log_level = NGX_LOG_NOTICE;[m
[31m-[m
[31m-    name = (u_char *) NGX_ERROR_LOG_PATH;[m
[31m-[m
[31m-    /*[m
[31m-     * we use ngx_strlen() here since BCC warns about[m
[31m-     * condition is always false and unreachable code[m
[31m-     */[m
[31m-[m
[31m-    nlen = ngx_strlen(name);[m
[31m-[m
[31m-    if (nlen == 0) {[m
[31m-        ngx_log_file.fd = ngx_stderr;[m
[31m-        return &ngx_log;[m
[31m-    }[m
[31m-[m
[31m-    p = NULL;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    if (name[1] != ':') {[m
[31m-#else[m
[31m-    if (name[0] != '/') {[m
[31m-#endif[m
[31m-[m
[31m-        if (prefix) {[m
[31m-            plen = ngx_strlen(prefix);[m
[31m-[m
[31m-        } else {[m
[31m-#ifdef NGX_PREFIX[m
[31m-            prefix = (u_char *) NGX_PREFIX;[m
[31m-            plen = ngx_strlen(prefix);[m
[31m-#else[m
[31m-            plen = 0;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (plen) {[m
[31m-            name = malloc(plen + nlen + 2);[m
[31m-            if (name == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_cpymem(name, prefix, plen);[m
[31m-[m
[31m-            if (!ngx_path_separator(*(p - 1))) {[m
[31m-                *p++ = '/';[m
[31m-            }[m
[31m-[m
[31m-            ngx_cpystrn(p, (u_char *) NGX_ERROR_LOG_PATH, nlen + 1);[m
[31m-[m
[31m-            p = name;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND,[m
[31m-                                    NGX_FILE_CREATE_OR_OPEN,[m
[31m-                                    NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (ngx_log_file.fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_stderr(ngx_errno,[m
[31m-                       "[alert] could not open error log file: "[m
[31m-                       ngx_open_file_n " \"%s\" failed", name);[m
[31m-#if (NGX_WIN32)[m
[31m-        ngx_event_log(ngx_errno,[m
[31m-                       "could not open error log file: "[m
[31m-                       ngx_open_file_n " \"%s\" failed", name);[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_file.fd = ngx_stderr;[m
[31m-    }[m
[31m-[m
[31m-    if (p) {[m
[31m-        ngx_free(p);[m
[31m-    }[m
[31m-[m
[31m-    return &ngx_log;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_log_open_default(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_log_t         *log;[m
[31m-    static ngx_str_t   error_log = ngx_string(NGX_ERROR_LOG_PATH);[m
[31m-[m
[31m-    if (ngx_log_get_file_log(&cycle->new_log) != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (cycle->new_log.log_level != 0) {[m
[31m-        /* there are some error logs, but no files */[m
[31m-[m
[31m-        log = ngx_pcalloc(cycle->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* no error logs at all */[m
[31m-        log = &cycle->new_log;[m
[31m-    }[m
[31m-[m
[31m-    log->log_level = NGX_LOG_ERR;[m
[31m-[m
[31m-    log->file = ngx_conf_open_file(cycle, &error_log);[m
[31m-    if (log->file == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (log != &cycle->new_log) {[m
[31m-        ngx_log_insert(&cycle->new_log, log);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_log_redirect_stderr(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    if (cycle->log_use_stderr) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* file log always exists when we are called */[m
[31m-    fd = ngx_log_get_file_log(cycle->log)->file->fd;[m
[31m-[m
[31m-    if (fd != ngx_stderr) {[m
[31m-        if (ngx_set_stderr(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_set_stderr_n " failed");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_log_t *[m
[31m-ngx_log_get_file_log(ngx_log_t *head)[m
[31m-{[m
[31m-    ngx_log_t  *log;[m
[31m-[m
[31m-    for (log = head; log; log = log->next) {[m
[31m-        if (log->file != NULL) {[m
[31m-            return log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t   i, n, d, found;[m
[31m-    ngx_str_t   *value;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        log->log_level = NGX_LOG_ERR;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-        found = 0;[m
[31m-[m
[31m-        for (n = 1; n <= NGX_LOG_DEBUG; n++) {[m
[31m-            if (ngx_strcmp(value[i].data, err_levels[n].data) == 0) {[m
[31m-[m
[31m-                if (log->log_level != 0) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "duplicate log level \"%V\"",[m
[31m-                                       &value[i]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                log->log_level = n;[m
[31m-                found = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) {[m
[31m-            if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) {[m
[31m-                if (log->log_level & ~NGX_LOG_DEBUG_ALL) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid log level \"%V\"",[m
[31m-                                       &value[i]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                log->log_level |= d;[m
[31m-                found = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        if (!found) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid log level \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (log->log_level == NGX_LOG_DEBUG) {[m
[31m-        log->log_level = NGX_LOG_DEBUG_ALL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_log_t  *dummy;[m
[31m-[m
[31m-    dummy = &cf->cycle->new_log;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &dummy);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head)[m
[31m-{[m
[31m-    ngx_log_t          *new_log;[m
[31m-    ngx_str_t          *value, name;[m
[31m-    ngx_syslog_peer_t  *peer;[m
[31m-[m
[31m-    if (*head != NULL && (*head)->log_level == 0) {[m
[31m-        new_log = *head;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        new_log = ngx_pcalloc(cf->pool, sizeof(ngx_log_t));[m
[31m-        if (new_log == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (*head == NULL) {[m
[31m-            *head = new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "stderr") == 0) {[m
[31m-        ngx_str_null(&name);[m
[31m-        cf->cycle->log_use_stderr = 1;[m
[31m-[m
[31m-        new_log->file = ngx_conf_open_file(cf->cycle, &name);[m
[31m-        if (new_log->file == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_strncmp(value[1].data, "memory:", 7) == 0) {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        size_t                 size, needed;[m
[31m-        ngx_pool_cleanup_t    *cln;[m
[31m-        ngx_log_memory_buf_t  *buf;[m
[31m-[m
[31m-        value[1].len -= 7;[m
[31m-        value[1].data += 7;[m
[31m-[m
[31m-        needed = sizeof("MEMLOG  :" NGX_LINEFEED)[m
[31m-                 + cf->conf_file->file.name.len[m
[31m-                 + NGX_SIZE_T_LEN[m
[31m-                 + NGX_INT_T_LEN[m
[31m-                 + NGX_MAX_ERROR_STR;[m
[31m-[m
[31m-        size = ngx_parse_size(&value[1]);[m
[31m-[m
[31m-        if (size == (size_t) NGX_ERROR || size < needed) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid buffer size \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf = ngx_pcalloc(cf->pool, sizeof(ngx_log_memory_buf_t));[m
[31m-        if (buf == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf->start = ngx_pnalloc(cf->pool, size);[m
[31m-        if (buf->start == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf->end = buf->start + size;[m
[31m-[m
[31m-        buf->pos = ngx_slprintf(buf->start, buf->end, "MEMLOG %uz %V:%ui%N",[m
[31m-                                size, &cf->conf_file->file.name,[m
[31m-                                cf->conf_file->line);[m
[31m-[m
[31m-        ngx_memset(buf->pos, ' ', buf->end - buf->pos);[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->data = new_log;[m
[31m-        cln->handler = ngx_log_memory_cleanup;[m
[31m-[m
[31m-        new_log->writer = ngx_log_memory_writer;[m
[31m-        new_log->wdata = buf;[m
[31m-[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "nginx was built without debug support");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) {[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        new_log->writer = ngx_syslog_writer;[m
[31m-        new_log->wdata = peer;[m
[31m-[m
[31m-    } else {[m
[31m-        new_log->file = ngx_conf_open_file(cf->cycle, &value[1]);[m
[31m-        if (new_log->file == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_log_set_levels(cf, new_log) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*head != new_log) {[m
[31m-        ngx_log_insert(*head, new_log);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log)[m
[31m-{[m
[31m-    ngx_log_t  tmp;[m
[31m-[m
[31m-    if (new_log->log_level > log->log_level) {[m
[31m-[m
[31m-        /*[m
[31m-         * list head address is permanent, insert new log after[m
[31m-         * head and swap its contents with head[m
[31m-         */[m
[31m-[m
[31m-        tmp = *log;[m
[31m-        *log = *new_log;[m
[31m-        *new_log = tmp;[m
[31m-[m
[31m-        log->next = new_log;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    while (log->next) {[m
[31m-        if (new_log->log_level > log->next->log_level) {[m
[31m-            new_log->next = log->next;[m
[31m-            log->next = new_log;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        log = log->next;[m
[31m-    }[m
[31m-[m
[31m-    log->next = new_log;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-static void[m
[31m-ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    size_t                 avail, written;[m
[31m-    ngx_log_memory_buf_t  *mem;[m
[31m-[m
[31m-    mem = log->wdata;[m
[31m-[m
[31m-    if (mem == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    written = ngx_atomic_fetch_add(&mem->written, len);[m
[31m-[m
[31m-    p = mem->pos + written % (mem->end - mem->pos);[m
[31m-[m
[31m-    avail = mem->end - p;[m
[31m-[m
[31m-    if (avail >= len) {[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memcpy(p, buf, avail);[m
[31m-        ngx_memcpy(mem->pos, buf + avail, len - avail);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_log_memory_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_log_t *log = data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "destroy memory log buffer");[m
[31m-[m
[31m-    log->wdata = NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.h[m
[1mdeleted file mode 100644[m
[1mindex 385fee4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.h[m
[1m+++ /dev/null[m
[36m@@ -1,270 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LOG_H_INCLUDED_[m
[31m-#define _NGX_LOG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_LOG_STDERR            0[m
[31m-#define NGX_LOG_EMERG             1[m
[31m-#define NGX_LOG_ALERT             2[m
[31m-#define NGX_LOG_CRIT              3[m
[31m-#define NGX_LOG_ERR               4[m
[31m-#define NGX_LOG_WARN              5[m
[31m-#define NGX_LOG_NOTICE            6[m
[31m-#define NGX_LOG_INFO              7[m
[31m-#define NGX_LOG_DEBUG             8[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_CORE        0x010[m
[31m-#define NGX_LOG_DEBUG_ALLOC       0x020[m
[31m-#define NGX_LOG_DEBUG_MUTEX       0x040[m
[31m-#define NGX_LOG_DEBUG_EVENT       0x080[m
[31m-#define NGX_LOG_DEBUG_HTTP        0x100[m
[31m-#define NGX_LOG_DEBUG_MAIL        0x200[m
[31m-#define NGX_LOG_DEBUG_STREAM      0x400[m
[31m-[m
[31m-/*[m
[31m- * do not forget to update debug_levels[] in src/core/ngx_log.c[m
[31m- * after the adding a new debug level[m
[31m- */[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_FIRST       NGX_LOG_DEBUG_CORE[m
[31m-#define NGX_LOG_DEBUG_LAST        NGX_LOG_DEBUG_STREAM[m
[31m-#define NGX_LOG_DEBUG_CONNECTION  0x80000000[m
[31m-#define NGX_LOG_DEBUG_ALL         0x7ffffff0[m
[31m-[m
[31m-[m
[31m-typedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len);[m
[31m-typedef void (*ngx_log_writer_pt) (ngx_log_t *log, ngx_uint_t level,[m
[31m-    u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-struct ngx_log_s {[m
[31m-    ngx_uint_t           log_level;[m
[31m-    ngx_open_file_t     *file;[m
[31m-[m
[31m-    ngx_atomic_uint_t    connection;[m
[31m-[m
[31m-    time_t               disk_full_time;[m
[31m-[m
[31m-    ngx_log_handler_pt   handler;[m
[31m-    void                *data;[m
[31m-[m
[31m-    ngx_log_writer_pt    writer;[m
[31m-    void                *wdata;[m
[31m-[m
[31m-    /*[m
[31m-     * we declare "action" as "char *" because the actions are usually[m
[31m-     * the static strings and in the "u_char *" case we have to override[m
[31m-     * their types all the time[m
[31m-     */[m
[31m-[m
[31m-    char                *action;[m
[31m-[m
[31m-    ngx_log_t           *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_MAX_ERROR_STR[m
[31m-#define NGX_MAX_ERROR_STR   4096[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_HAVE_C99_VARIADIC_MACROS)[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  1[m
[31m-[m
[31m-#define ngx_log_error(level, log, ...)                                        \[m
[31m-    if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__)[m
[31m-[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-#define ngx_log_debug(level, log, ...)                                        \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#elif (NGX_HAVE_GCC_VARIADIC_MACROS)[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  1[m
[31m-[m
[31m-#define ngx_log_error(level, log, args...)                                    \[m
[31m-    if ((log)->log_level >= level) ngx_log_error_core(level, log, args)[m
[31m-[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-#define ngx_log_debug(level, log, args...)                                    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_error_core(NGX_LOG_DEBUG, log, args)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#else /* no variadic macros */[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  0[m
[31m-[m
[31m-void ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, va_list args);[m
[31m-void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-[m
[31m-#endif /* variadic macros */[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)                                  \[m
[31m-        ngx_log_debug(level, log, err, fmt)[m
[31m-[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)                            \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1)[m
[31m-[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2)[m
[31m-[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3)[m
[31m-[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-[m
[31m-#define ngx_log_debug6(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)                    \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-[m
[31m-#define ngx_log_debug7(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)[m
[31m-[m
[31m-#define ngx_log_debug8(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)[m
[31m-[m
[31m-[m
[31m-#else /* no variadic macros */[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)                                  \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt)[m
[31m-[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)                            \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1)[m
[31m-[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2)[m
[31m-[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3)[m
[31m-[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-[m
[31m-#define ngx_log_debug6(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)                    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-[m
[31m-#define ngx_log_debug7(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt,                                     \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)[m
[31m-[m
[31m-#define ngx_log_debug8(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt,                                     \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#else /* !NGX_DEBUG */[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-#define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-#define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \[m
[31m-                       arg6, arg7)[m
[31m-#define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \[m
[31m-                       arg6, arg7, arg8)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-ngx_log_t *ngx_log_init(u_char *prefix);[m
[31m-void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);[m
[31m-void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);[m
[31m-u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);[m
[31m-ngx_int_t ngx_log_open_default(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle);[m
[31m-ngx_log_t *ngx_log_get_file_log(ngx_log_t *head);[m
[31m-char *ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_write_stderr() cannot be implemented as macro, since[m
[31m- * MSVC does not allow to use #ifdef inside macro parameters.[m
[31m- *[m
[31m- * ngx_write_fd() is used instead of ngx_write_console(), since[m
[31m- * CharToOemBuff() inside ngx_write_console() cannot be used with[m
[31m- * read only buffer as destination and CharToOemBuff() is not needed[m
[31m- * for ngx_write_stderr() anyway.[m
[31m- */[m
[31m-static ngx_inline void[m
[31m-ngx_write_stderr(char *text)[m
[31m-{[m
[31m-    (void) ngx_write_fd(ngx_stderr, text, ngx_strlen(text));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_write_stdout(char *text)[m
[31m-{[m
[31m-    (void) ngx_write_fd(ngx_stdout, text, ngx_strlen(text));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_errlog_module;[m
[31m-extern ngx_uint_t    ngx_use_stderr;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LOG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.h.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.h.orig[m
[1mdeleted file mode 100644[m
[1mindex afb73bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_log.h.orig[m
[1m+++ /dev/null[m
[36m@@ -1,268 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LOG_H_INCLUDED_[m
[31m-#define _NGX_LOG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_LOG_STDERR            0[m
[31m-#define NGX_LOG_EMERG             1[m
[31m-#define NGX_LOG_ALERT             2[m
[31m-#define NGX_LOG_CRIT              3[m
[31m-#define NGX_LOG_ERR               4[m
[31m-#define NGX_LOG_WARN              5[m
[31m-#define NGX_LOG_NOTICE            6[m
[31m-#define NGX_LOG_INFO              7[m
[31m-#define NGX_LOG_DEBUG             8[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_CORE        0x010[m
[31m-#define NGX_LOG_DEBUG_ALLOC       0x020[m
[31m-#define NGX_LOG_DEBUG_MUTEX       0x040[m
[31m-#define NGX_LOG_DEBUG_EVENT       0x080[m
[31m-#define NGX_LOG_DEBUG_HTTP        0x100[m
[31m-#define NGX_LOG_DEBUG_MAIL        0x200[m
[31m-#define NGX_LOG_DEBUG_STREAM      0x400[m
[31m-[m
[31m-/*[m
[31m- * do not forget to update debug_levels[] in src/core/ngx_log.c[m
[31m- * after the adding a new debug level[m
[31m- */[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_FIRST       NGX_LOG_DEBUG_CORE[m
[31m-#define NGX_LOG_DEBUG_LAST        NGX_LOG_DEBUG_STREAM[m
[31m-#define NGX_LOG_DEBUG_CONNECTION  0x80000000[m
[31m-#define NGX_LOG_DEBUG_ALL         0x7ffffff0[m
[31m-[m
[31m-[m
[31m-typedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len);[m
[31m-typedef void (*ngx_log_writer_pt) (ngx_log_t *log, ngx_uint_t level,[m
[31m-    u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-struct ngx_log_s {[m
[31m-    ngx_uint_t           log_level;[m
[31m-    ngx_open_file_t     *file;[m
[31m-[m
[31m-    ngx_atomic_uint_t    connection;[m
[31m-[m
[31m-    time_t               disk_full_time;[m
[31m-[m
[31m-    ngx_log_handler_pt   handler;[m
[31m-    void                *data;[m
[31m-[m
[31m-    ngx_log_writer_pt    writer;[m
[31m-    void                *wdata;[m
[31m-[m
[31m-    /*[m
[31m-     * we declare "action" as "char *" because the actions are usually[m
[31m-     * the static strings and in the "u_char *" case we have to override[m
[31m-     * their types all the time[m
[31m-     */[m
[31m-[m
[31m-    char                *action;[m
[31m-[m
[31m-    ngx_log_t           *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_ERROR_STR   2048[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_HAVE_C99_VARIADIC_MACROS)[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  1[m
[31m-[m
[31m-#define ngx_log_error(level, log, ...)                                        \[m
[31m-    if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__)[m
[31m-[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-#define ngx_log_debug(level, log, ...)                                        \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#elif (NGX_HAVE_GCC_VARIADIC_MACROS)[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  1[m
[31m-[m
[31m-#define ngx_log_error(level, log, args...)                                    \[m
[31m-    if ((log)->log_level >= level) ngx_log_error_core(level, log, args)[m
[31m-[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-#define ngx_log_debug(level, log, args...)                                    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_error_core(NGX_LOG_DEBUG, log, args)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#else /* no variadic macros */[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  0[m
[31m-[m
[31m-void ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, va_list args);[m
[31m-void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-[m
[31m-#endif /* variadic macros */[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)                                  \[m
[31m-        ngx_log_debug(level, log, err, fmt)[m
[31m-[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)                            \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1)[m
[31m-[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2)[m
[31m-[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3)[m
[31m-[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-[m
[31m-#define ngx_log_debug6(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)                    \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-[m
[31m-#define ngx_log_debug7(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)[m
[31m-[m
[31m-#define ngx_log_debug8(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)[m
[31m-[m
[31m-[m
[31m-#else /* no variadic macros */[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)                                  \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt)[m
[31m-[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)                            \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1)[m
[31m-[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2)[m
[31m-[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3)[m
[31m-[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-[m
[31m-#define ngx_log_debug6(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)                    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-[m
[31m-#define ngx_log_debug7(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt,                                     \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)[m
[31m-[m
[31m-#define ngx_log_debug8(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt,                                     \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#else /* !NGX_DEBUG */[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-#define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-#define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \[m
[31m-                       arg6, arg7)[m
[31m-#define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \[m
[31m-                       arg6, arg7, arg8)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-ngx_log_t *ngx_log_init(u_char *prefix);[m
[31m-void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);[m
[31m-void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);[m
[31m-u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);[m
[31m-ngx_int_t ngx_log_open_default(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle);[m
[31m-ngx_log_t *ngx_log_get_file_log(ngx_log_t *head);[m
[31m-char *ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_write_stderr() cannot be implemented as macro, since[m
[31m- * MSVC does not allow to use #ifdef inside macro parameters.[m
[31m- *[m
[31m- * ngx_write_fd() is used instead of ngx_write_console(), since[m
[31m- * CharToOemBuff() inside ngx_write_console() cannot be used with[m
[31m- * read only buffer as destination and CharToOemBuff() is not needed[m
[31m- * for ngx_write_stderr() anyway.[m
[31m- */[m
[31m-static ngx_inline void[m
[31m-ngx_write_stderr(char *text)[m
[31m-{[m
[31m-    (void) ngx_write_fd(ngx_stderr, text, ngx_strlen(text));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_write_stdout(char *text)[m
[31m-{[m
[31m-    (void) ngx_write_fd(ngx_stdout, text, ngx_strlen(text));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_errlog_module;[m
[31m-extern ngx_uint_t    ngx_use_stderr;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LOG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_md5.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_md5.c[m
[1mdeleted file mode 100644[m
[1mindex 440c75b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_md5.c[m
[1m+++ /dev/null[m
[36m@@ -1,289 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * An internal implementation, based on Alexander Peslyak's[m
[31m- * public domain implementation:[m
[31m- * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5[m
[31m- * It is not expected to be optimal and is used only[m
[31m- * if no MD5 implementation was found in system.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_md5.h>[m
[31m-[m
[31m-[m
[31m-#if !(NGX_HAVE_MD5)[m
[31m-[m
[31m-static const u_char *ngx_md5_body(ngx_md5_t *ctx, const u_char *data,[m
[31m-    size_t size);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_md5_init(ngx_md5_t *ctx)[m
[31m-{[m
[31m-    ctx->a = 0x67452301;[m
[31m-    ctx->b = 0xefcdab89;[m
[31m-    ctx->c = 0x98badcfe;[m
[31m-    ctx->d = 0x10325476;[m
[31m-[m
[31m-    ctx->bytes = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_md5_update(ngx_md5_t *ctx, const void *data, size_t size)[m
[31m-{[m
[31m-    size_t  used, free;[m
[31m-[m
[31m-    used = (size_t) (ctx->bytes & 0x3f);[m
[31m-    ctx->bytes += size;[m
[31m-[m
[31m-    if (used) {[m
[31m-        free = 64 - used;[m
[31m-[m
[31m-        if (size < free) {[m
[31m-            ngx_memcpy(&ctx->buffer[used], data, size);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(&ctx->buffer[used], data, free);[m
[31m-        data = (u_char *) data + free;[m
[31m-        size -= free;[m
[31m-        (void) ngx_md5_body(ctx, ctx->buffer, 64);[m
[31m-    }[m
[31m-[m
[31m-    if (size >= 64) {[m
[31m-        data = ngx_md5_body(ctx, data, size & ~(size_t) 0x3f);[m
[31m-        size &= 0x3f;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(ctx->buffer, data, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_md5_final(u_char result[16], ngx_md5_t *ctx)[m
[31m-{[m
[31m-    size_t  used, free;[m
[31m-[m
[31m-    used = (size_t) (ctx->bytes & 0x3f);[m
[31m-[m
[31m-    ctx->buffer[used++] = 0x80;[m
[31m-[m
[31m-    free = 64 - used;[m
[31m-[m
[31m-    if (free < 8) {[m
[31m-        ngx_memzero(&ctx->buffer[used], free);[m
[31m-        (void) ngx_md5_body(ctx, ctx->buffer, 64);[m
[31m-        used = 0;[m
[31m-        free = 64;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ctx->buffer[used], free - 8);[m
[31m-[m
[31m-    ctx->bytes <<= 3;[m
[31m-    ctx->buffer[56] = (u_char) ctx->bytes;[m
[31m-    ctx->buffer[57] = (u_char) (ctx->bytes >> 8);[m
[31m-    ctx->buffer[58] = (u_char) (ctx->bytes >> 16);[m
[31m-    ctx->buffer[59] = (u_char) (ctx->bytes >> 24);[m
[31m-    ctx->buffer[60] = (u_char) (ctx->bytes >> 32);[m
[31m-    ctx->buffer[61] = (u_char) (ctx->bytes >> 40);[m
[31m-    ctx->buffer[62] = (u_char) (ctx->bytes >> 48);[m
[31m-    ctx->buffer[63] = (u_char) (ctx->bytes >> 56);[m
[31m-[m
[31m-    (void) ngx_md5_body(ctx, ctx->buffer, 64);[m
[31m-[m
[31m-    result[0] = (u_char) ctx->a;[m
[31m-    result[1] = (u_char) (ctx->a >> 8);[m
[31m-    result[2] = (u_char) (ctx->a >> 16);[m
[31m-    result[3] = (u_char) (ctx->a >> 24);[m
[31m-    result[4] = (u_char) ctx->b;[m
[31m-    result[5] = (u_char) (ctx->b >> 8);[m
[31m-    result[6] = (u_char) (ctx->b >> 16);[m
[31m-    result[7] = (u_char) (ctx->b >> 24);[m
[31m-    result[8] = (u_char) ctx->c;[m
[31m-    result[9] = (u_char) (ctx->c >> 8);[m
[31m-    result[10] = (u_char) (ctx->c >> 16);[m
[31m-    result[11] = (u_char) (ctx->c >> 24);[m
[31m-    result[12] = (u_char) ctx->d;[m
[31m-    result[13] = (u_char) (ctx->d >> 8);[m
[31m-    result[14] = (u_char) (ctx->d >> 16);[m
[31m-    result[15] = (u_char) (ctx->d >> 24);[m
[31m-[m
[31m-    ngx_memzero(ctx, sizeof(*ctx));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The basic MD5 functions.[m
[31m- *[m
[31m- * F and G are optimized compared to their RFC 1321 definitions for[m
[31m- * architectures that lack an AND-NOT instruction, just like in[m
[31m- * Colin Plumb's implementation.[m
[31m- */[m
[31m-[m
[31m-#define F(x, y, z)  ((z) ^ ((x) & ((y) ^ (z))))[m
[31m-#define G(x, y, z)  ((y) ^ ((z) & ((x) ^ (y))))[m
[31m-#define H(x, y, z)  ((x) ^ (y) ^ (z))[m
[31m-#define I(x, y, z)  ((y) ^ ((x) | ~(z)))[m
[31m-[m
[31m-/*[m
[31m- * The MD5 transformation for all four rounds.[m
[31m- */[m
[31m-[m
[31m-#define STEP(f, a, b, c, d, x, t, s)                                          \[m
[31m-    (a) += f((b), (c), (d)) + (x) + (t);                                      \[m
[31m-    (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));                \[m
[31m-    (a) += (b)[m
[31m-[m
[31m-/*[m
[31m- * SET() reads 4 input bytes in little-endian byte order and stores them[m
[31m- * in a properly aligned word in host byte order.[m
[31m- *[m
[31m- * The check for little-endian architectures that tolerate unaligned[m
[31m- * memory accesses is just an optimization.  Nothing will break if it[m
[31m- * does not work.[m
[31m- */[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define SET(n)      (*(uint32_t *) &p[n * 4])[m
[31m-#define GET(n)      (*(uint32_t *) &p[n * 4])[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define SET(n)                                                                \[m
[31m-    (block[n] =                                                               \[m
[31m-    (uint32_t) p[n * 4] |                                                     \[m
[31m-    ((uint32_t) p[n * 4 + 1] << 8) |                                          \[m
[31m-    ((uint32_t) p[n * 4 + 2] << 16) |                                         \[m
[31m-    ((uint32_t) p[n * 4 + 3] << 24))[m
[31m-[m
[31m-#define GET(n)      block[n][m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * This processes one or more 64-byte data blocks, but does not update[m
[31m- * the bit counters.  There are no alignment requirements.[m
[31m- */[m
[31m-[m
[31m-static const u_char *[m
[31m-ngx_md5_body(ngx_md5_t *ctx, const u_char *data, size_t size)[m
[31m-{[m
[31m-    uint32_t       a, b, c, d;[m
[31m-    uint32_t       saved_a, saved_b, saved_c, saved_d;[m
[31m-    const u_char  *p;[m
[31m-#if !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-    uint32_t       block[16];[m
[31m-#endif[m
[31m-[m
[31m-    p = data;[m
[31m-[m
[31m-    a = ctx->a;[m
[31m-    b = ctx->b;[m
[31m-    c = ctx->c;[m
[31m-    d = ctx->d;[m
[31m-[m
[31m-    do {[m
[31m-        saved_a = a;[m
[31m-        saved_b = b;[m
[31m-        saved_c = c;[m
[31m-        saved_d = d;[m
[31m-[m
[31m-        /* Round 1 */[m
[31m-[m
[31m-        STEP(F, a, b, c, d, SET(0),  0xd76aa478, 7);[m
[31m-        STEP(F, d, a, b, c, SET(1),  0xe8c7b756, 12);[m
[31m-        STEP(F, c, d, a, b, SET(2),  0x242070db, 17);[m
[31m-        STEP(F, b, c, d, a, SET(3),  0xc1bdceee, 22);[m
[31m-        STEP(F, a, b, c, d, SET(4),  0xf57c0faf, 7);[m
[31m-        STEP(F, d, a, b, c, SET(5),  0x4787c62a, 12);[m
[31m-        STEP(F, c, d, a, b, SET(6),  0xa8304613, 17);[m
[31m-        STEP(F, b, c, d, a, SET(7),  0xfd469501, 22);[m
[31m-        STEP(F, a, b, c, d, SET(8),  0x698098d8, 7);[m
[31m-        STEP(F, d, a, b, c, SET(9),  0x8b44f7af, 12);[m
[31m-        STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17);[m
[31m-        STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22);[m
[31m-        STEP(F, a, b, c, d, SET(12), 0x6b901122, 7);[m
[31m-        STEP(F, d, a, b, c, SET(13), 0xfd987193, 12);[m
[31m-        STEP(F, c, d, a, b, SET(14), 0xa679438e, 17);[m
[31m-        STEP(F, b, c, d, a, SET(15), 0x49b40821, 22);[m
[31m-[m
[31m-        /* Round 2 */[m
[31m-[m
[31m-        STEP(G, a, b, c, d, GET(1),  0xf61e2562, 5);[m
[31m-        STEP(G, d, a, b, c, GET(6),  0xc040b340, 9);[m
[31m-        STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14);[m
[31m-        STEP(G, b, c, d, a, GET(0),  0xe9b6c7aa, 20);[m
[31m-        STEP(G, a, b, c, d, GET(5),  0xd62f105d, 5);[m
[31m-        STEP(G, d, a, b, c, GET(10), 0x02441453, 9);[m
[31m-        STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14);[m
[31m-        STEP(G, b, c, d, a, GET(4),  0xe7d3fbc8, 20);[m
[31m-        STEP(G, a, b, c, d, GET(9),  0x21e1cde6, 5);[m
[31m-        STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9);[m
[31m-        STEP(G, c, d, a, b, GET(3),  0xf4d50d87, 14);[m
[31m-        STEP(G, b, c, d, a, GET(8),  0x455a14ed, 20);[m
[31m-        STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5);[m
[31m-        STEP(G, d, a, b, c, GET(2),  0xfcefa3f8, 9);[m
[31m-        STEP(G, c, d, a, b, GET(7),  0x676f02d9, 14);[m
[31m-        STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20);[m
[31m-[m
[31m-        /* Round 3 */[m
[31m-[m
[31m-        STEP(H, a, b, c, d, GET(5),  0xfffa3942, 4);[m
[31m-        STEP(H, d, a, b, c, GET(8),  0x8771f681, 11);[m
[31m-        STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16);[m
[31m-        STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23);[m
[31m-        STEP(H, a, b, c, d, GET(1),  0xa4beea44, 4);[m
[31m-        STEP(H, d, a, b, c, GET(4),  0x4bdecfa9, 11);[m
[31m-        STEP(H, c, d, a, b, GET(7),  0xf6bb4b60, 16);[m
[31m-        STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23);[m
[31m-        STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4);[m
[31m-        STEP(H, d, a, b, c, GET(0),  0xeaa127fa, 11);[m
[31m-        STEP(H, c, d, a, b, GET(3),  0xd4ef3085, 16);[m
[31m-        STEP(H, b, c, d, a, GET(6),  0x04881d05, 23);[m
[31m-        STEP(H, a, b, c, d, GET(9),  0xd9d4d039, 4);[m
[31m-        STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11);[m
[31m-        STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16);[m
[31m-        STEP(H, b, c, d, a, GET(2),  0xc4ac5665, 23);[m
[31m-[m
[31m-        /* Round 4 */[m
[31m-[m
[31m-        STEP(I, a, b, c, d, GET(0),  0xf4292244, 6);[m
[31m-        STEP(I, d, a, b, c, GET(7),  0x432aff97, 10);[m
[31m-        STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15);[m
[31m-        STEP(I, b, c, d, a, GET(5),  0xfc93a039, 21);[m
[31m-        STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6);[m
[31m-        STEP(I, d, a, b, c, GET(3),  0x8f0ccc92, 10);[m
[31m-        STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15);[m
[31m-        STEP(I, b, c, d, a, GET(1),  0x85845dd1, 21);[m
[31m-        STEP(I, a, b, c, d, GET(8),  0x6fa87e4f, 6);[m
[31m-        STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10);[m
[31m-        STEP(I, c, d, a, b, GET(6),  0xa3014314, 15);[m
[31m-        STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21);[m
[31m-        STEP(I, a, b, c, d, GET(4),  0xf7537e82, 6);[m
[31m-        STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10);[m
[31m-        STEP(I, c, d, a, b, GET(2),  0x2ad7d2bb, 15);[m
[31m-        STEP(I, b, c, d, a, GET(9),  0xeb86d391, 21);[m
[31m-[m
[31m-        a += saved_a;[m
[31m-        b += saved_b;[m
[31m-        c += saved_c;[m
[31m-        d += saved_d;[m
[31m-[m
[31m-        p += 64;[m
[31m-[m
[31m-    } while (size -= 64);[m
[31m-[m
[31m-    ctx->a = a;[m
[31m-    ctx->b = b;[m
[31m-    ctx->c = c;[m
[31m-    ctx->d = d;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_md5.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_md5.h[m
[1mdeleted file mode 100644[m
[1mindex 18d09d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_md5.h[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MD5_H_INCLUDED_[m
[31m-#define _NGX_MD5_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_MD5)[m
[31m-[m
[31m-#if (NGX_HAVE_OPENSSL_MD5_H)[m
[31m-#include <openssl/md5.h>[m
[31m-#else[m
[31m-#include <md5.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef MD5_CTX  ngx_md5_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_OPENSSL_MD5)[m
[31m-[m
[31m-#define ngx_md5_init    MD5_Init[m
[31m-#define ngx_md5_update  MD5_Update[m
[31m-#define ngx_md5_final   MD5_Final[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_md5_init    MD5Init[m
[31m-#define ngx_md5_update  MD5Update[m
[31m-#define ngx_md5_final   MD5Final[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#else /* !NGX_HAVE_MD5 */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint64_t  bytes;[m
[31m-    uint32_t  a, b, c, d;[m
[31m-    u_char    buffer[64];[m
[31m-} ngx_md5_t;[m
[31m-[m
[31m-[m
[31m-void ngx_md5_init(ngx_md5_t *ctx);[m
[31m-void ngx_md5_update(ngx_md5_t *ctx, const void *data, size_t size);[m
[31m-void ngx_md5_final(u_char result[16], ngx_md5_t *ctx);[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* _NGX_MD5_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_module.c[m
[1mdeleted file mode 100644[m
[1mindex 3e3c506..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,360 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_DYNAMIC_MODULES  128[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t ngx_module_index(ngx_cycle_t *cycle);[m
[31m-static ngx_uint_t ngx_module_ctx_index(ngx_cycle_t *cycle, ngx_uint_t type,[m
[31m-    ngx_uint_t index);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t         ngx_max_module;[m
[31m-static ngx_uint_t  ngx_modules_n;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_preinit_modules(void)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    for (i = 0; ngx_modules[i]; i++) {[m
[31m-        ngx_modules[i]->index = i;[m
[31m-        ngx_modules[i]->name = ngx_module_names[i];[m
[31m-    }[m
[31m-[m
[31m-    ngx_modules_n = i;[m
[31m-    ngx_max_module = ngx_modules_n + NGX_MAX_DYNAMIC_MODULES;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_cycle_modules(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    /*[m
[31m-     * create a list of modules to be used for this cycle,[m
[31m-     * copy static modules to it[m
[31m-     */[m
[31m-[m
[31m-    cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1)[m
[31m-                                              * sizeof(ngx_module_t *));[m
[31m-    if (cycle->modules == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(cycle->modules, ngx_modules,[m
[31m-               ngx_modules_n * sizeof(ngx_module_t *));[m
[31m-[m
[31m-    cycle->modules_n = ngx_modules_n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_init_modules(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_module) {[m
[31m-            if (cycle->modules[i]->init_module(cycle) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_count_modules(ngx_cycle_t *cycle, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t     i, next, max;[m
[31m-    ngx_module_t  *module;[m
[31m-[m
[31m-    next = 0;[m
[31m-    max = 0;[m
[31m-[m
[31m-    /* count appropriate modules, set up their indices */[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        module = cycle->modules[i];[m
[31m-[m
[31m-        if (module->type != type) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (module->ctx_index != NGX_MODULE_UNSET_INDEX) {[m
[31m-[m
[31m-            /* if ctx_index was assigned, preserve it */[m
[31m-[m
[31m-            if (module->ctx_index > max) {[m
[31m-                max = module->ctx_index;[m
[31m-            }[m
[31m-[m
[31m-            if (module->ctx_index == next) {[m
[31m-                next++;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* search for some free index */[m
[31m-[m
[31m-        module->ctx_index = ngx_module_ctx_index(cycle, type, next);[m
[31m-[m
[31m-        if (module->ctx_index > max) {[m
[31m-            max = module->ctx_index;[m
[31m-        }[m
[31m-[m
[31m-        next = module->ctx_index + 1;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * make sure the number returned is big enough for previous[m
[31m-     * cycle as well, else there will be problems if the number[m
[31m-     * will be stored in a global variable (as it's used to be)[m
[31m-     * and we'll have to roll back to the previous cycle[m
[31m-     */[m
[31m-[m
[31m-    if (cycle->old_cycle && cycle->old_cycle->modules) {[m
[31m-[m
[31m-        for (i = 0; cycle->old_cycle->modules[i]; i++) {[m
[31m-            module = cycle->old_cycle->modules[i];[m
[31m-[m
[31m-            if (module->type != type) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (module->ctx_index > max) {[m
[31m-                max = module->ctx_index;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* prevent loading of additional modules */[m
[31m-[m
[31m-    cycle->modules_used = 1;[m
[31m-[m
[31m-    return max + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_add_module(ngx_conf_t *cf, ngx_str_t *file, ngx_module_t *module,[m
[31m-    char **order)[m
[31m-{[m
[31m-    void               *rv;[m
[31m-    ngx_uint_t          i, m, before;[m
[31m-    ngx_core_module_t  *core_module;[m
[31m-[m
[31m-    if (cf->cycle->modules_n >= ngx_max_module) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "too many modules loaded");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (module->version != nginx_version) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "module \"%V\" version %ui instead of %ui",[m
[31m-                           file, module->version, (ngx_uint_t) nginx_version);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(module->signature, NGX_MODULE_SIGNATURE) != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "module \"%V\" is not binary compatible",[m
[31m-                           file);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (ngx_strcmp(cf->cycle->modules[m]->name, module->name) == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "module \"%s\" is already loaded",[m
[31m-                               module->name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * if the module wasn't previously loaded, assign an index[m
[31m-     */[m
[31m-[m
[31m-    if (module->index == NGX_MODULE_UNSET_INDEX) {[m
[31m-        module->index = ngx_module_index(cf->cycle);[m
[31m-[m
[31m-        if (module->index >= ngx_max_module) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "too many modules loaded");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * put the module into the cycle->modules array[m
[31m-     */[m
[31m-[m
[31m-    before = cf->cycle->modules_n;[m
[31m-[m
[31m-    if (order) {[m
[31m-        for (i = 0; order[i]; i++) {[m
[31m-            if (ngx_strcmp(order[i], module->name) == 0) {[m
[31m-                i++;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; order[i]; i++) {[m
[31m-[m
[31m-#if 0[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_CORE, cf->log, 0,[m
[31m-                           "module: %s before %s",[m
[31m-                           module->name, order[i]);[m
[31m-#endif[m
[31m-[m
[31m-            for (m = 0; m < before; m++) {[m
[31m-                if (ngx_strcmp(cf->cycle->modules[m]->name, order[i]) == 0) {[m
[31m-[m
[31m-                    ngx_log_debug3(NGX_LOG_DEBUG_CORE, cf->log, 0,[m
[31m-                                   "module: %s before %s:%i",[m
[31m-                                   module->name, order[i], m);[m
[31m-[m
[31m-                    before = m;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* put the module before modules[before] */[m
[31m-[m
[31m-    if (before != cf->cycle->modules_n) {[m
[31m-        ngx_memmove(&cf->cycle->modules[before + 1],[m
[31m-                    &cf->cycle->modules[before],[m
[31m-                    (cf->cycle->modules_n - before) * sizeof(ngx_module_t *));[m
[31m-    }[m
[31m-[m
[31m-    cf->cycle->modules[before] = module;[m
[31m-    cf->cycle->modules_n++;[m
[31m-[m
[31m-    if (module->type == NGX_CORE_MODULE) {[m
[31m-[m
[31m-        /*[m
[31m-         * we are smart enough to initialize core modules;[m
[31m-         * other modules are expected to be loaded before[m
[31m-         * initialization - e.g., http modules must be loaded[m
[31m-         * before http{} block[m
[31m-         */[m
[31m-[m
[31m-        core_module = module->ctx;[m
[31m-[m
[31m-        if (core_module->create_conf) {[m
[31m-            rv = core_module->create_conf(cf->cycle);[m
[31m-            if (rv == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cf->cycle->conf_ctx[module->index] = rv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_module_index(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t     i, index;[m
[31m-    ngx_module_t  *module;[m
[31m-[m
[31m-    index = 0;[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    /* find an unused index */[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        module = cycle->modules[i];[m
[31m-[m
[31m-        if (module->index == index) {[m
[31m-            index++;[m
[31m-            goto again;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* check previous cycle */[m
[31m-[m
[31m-    if (cycle->old_cycle && cycle->old_cycle->modules) {[m
[31m-[m
[31m-        for (i = 0; cycle->old_cycle->modules[i]; i++) {[m
[31m-            module = cycle->old_cycle->modules[i];[m
[31m-[m
[31m-            if (module->index == index) {[m
[31m-                index++;[m
[31m-                goto again;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return index;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_module_ctx_index(ngx_cycle_t *cycle, ngx_uint_t type, ngx_uint_t index)[m
[31m-{[m
[31m-    ngx_uint_t     i;[m
[31m-    ngx_module_t  *module;[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    /* find an unused ctx_index */[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        module = cycle->modules[i];[m
[31m-[m
[31m-        if (module->type != type) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (module->ctx_index == index) {[m
[31m-            index++;[m
[31m-            goto again;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* check previous cycle */[m
[31m-[m
[31m-    if (cycle->old_cycle && cycle->old_cycle->modules) {[m
[31m-[m
[31m-        for (i = 0; cycle->old_cycle->modules[i]; i++) {[m
[31m-            module = cycle->old_cycle->modules[i];[m
[31m-[m
[31m-            if (module->type != type) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (module->ctx_index == index) {[m
[31m-                index++;[m
[31m-                goto again;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return index;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_module.h[m
[1mdeleted file mode 100644[m
[1mindex e911cb4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,307 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MODULE_H_INCLUDED_[m
[31m-#define _NGX_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MODULE_UNSET_INDEX  (ngx_uint_t) -1[m
[31m-[m
[31m-[m
[31m-#define NGX_MODULE_SIGNATURE_0                                                \[m
[31m-    ngx_value(NGX_PTR_SIZE) ","                                               \[m
[31m-    ngx_value(NGX_SIG_ATOMIC_T_SIZE) ","                                      \[m
[31m-    ngx_value(NGX_TIME_T_SIZE) ","[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-#define NGX_MODULE_SIGNATURE_1   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_1   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-#define NGX_MODULE_SIGNATURE_2   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_2   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-#define NGX_MODULE_SIGNATURE_3   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_3   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-#define NGX_MODULE_SIGNATURE_4   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_4   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-#define NGX_MODULE_SIGNATURE_5   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_5   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL)[m
[31m-#define NGX_MODULE_SIGNATURE_6   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_6   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-#define NGX_MODULE_SIGNATURE_7   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_7   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-#define NGX_MODULE_SIGNATURE_8   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_8   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-#define NGX_MODULE_SIGNATURE_9   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_9   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-#define NGX_MODULE_SIGNATURE_10  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_10  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-#define NGX_MODULE_SIGNATURE_11  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_11  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-#define NGX_MODULE_SIGNATURE_12  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_12  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-#define NGX_MODULE_SIGNATURE_13  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_13  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-#define NGX_MODULE_SIGNATURE_14  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_14  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-#define NGX_MODULE_SIGNATURE_15  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_15  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-#define NGX_MODULE_SIGNATURE_16  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_16  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_MD5)[m
[31m-#define NGX_MODULE_SIGNATURE_17  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_17  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-#define NGX_MODULE_SIGNATURE_18  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_18  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-#define NGX_MODULE_SIGNATURE_19  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_19  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-#define NGX_MODULE_SIGNATURE_20  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_20  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#define NGX_MODULE_SIGNATURE_21  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_21  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-#define NGX_MODULE_SIGNATURE_22  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_22  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-#define NGX_MODULE_SIGNATURE_23  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_23  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-#define NGX_MODULE_SIGNATURE_24  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_24  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-#define NGX_MODULE_SIGNATURE_25  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_25  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-#define NGX_MODULE_SIGNATURE_26  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_26  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-#define NGX_MODULE_SIGNATURE_27  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_27  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-#define NGX_MODULE_SIGNATURE_28  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_28  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-#define NGX_MODULE_SIGNATURE_29  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_29  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_HEADERS)[m
[31m-#define NGX_MODULE_SIGNATURE_30  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_30  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-#define NGX_MODULE_SIGNATURE_31  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_31  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-#define NGX_MODULE_SIGNATURE_32  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_32  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-#define NGX_MODULE_SIGNATURE_33  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_33  "0"[m
[31m-#endif[m
[31m-[m
[31m-#define NGX_MODULE_SIGNATURE                                                  \[m
[31m-    NGX_MODULE_SIGNATURE_0 NGX_MODULE_SIGNATURE_1 NGX_MODULE_SIGNATURE_2      \[m
[31m-    NGX_MODULE_SIGNATURE_3 NGX_MODULE_SIGNATURE_4 NGX_MODULE_SIGNATURE_5      \[m
[31m-    NGX_MODULE_SIGNATURE_6 NGX_MODULE_SIGNATURE_7 NGX_MODULE_SIGNATURE_8      \[m
[31m-    NGX_MODULE_SIGNATURE_9 NGX_MODULE_SIGNATURE_10 NGX_MODULE_SIGNATURE_11    \[m
[31m-    NGX_MODULE_SIGNATURE_12 NGX_MODULE_SIGNATURE_13 NGX_MODULE_SIGNATURE_14   \[m
[31m-    NGX_MODULE_SIGNATURE_15 NGX_MODULE_SIGNATURE_16 NGX_MODULE_SIGNATURE_17   \[m
[31m-    NGX_MODULE_SIGNATURE_18 NGX_MODULE_SIGNATURE_19 NGX_MODULE_SIGNATURE_20   \[m
[31m-    NGX_MODULE_SIGNATURE_21 NGX_MODULE_SIGNATURE_22 NGX_MODULE_SIGNATURE_23   \[m
[31m-    NGX_MODULE_SIGNATURE_24 NGX_MODULE_SIGNATURE_25 NGX_MODULE_SIGNATURE_26   \[m
[31m-    NGX_MODULE_SIGNATURE_27 NGX_MODULE_SIGNATURE_28 NGX_MODULE_SIGNATURE_29   \[m
[31m-    NGX_MODULE_SIGNATURE_30 NGX_MODULE_SIGNATURE_31 NGX_MODULE_SIGNATURE_32   \[m
[31m-    NGX_MODULE_SIGNATURE_33[m
[31m-[m
[31m-[m
[31m-#define NGX_MODULE_V1                                                         \[m
[31m-    NGX_MODULE_UNSET_INDEX, NGX_MODULE_UNSET_INDEX,                           \[m
[31m-    NULL, 0, 0, nginx_version, NGX_MODULE_SIGNATURE[m
[31m-[m
[31m-#define NGX_MODULE_V1_PADDING  0, 0, 0, 0, 0, 0, 0, 0[m
[31m-[m
[31m-[m
[31m-struct ngx_module_s {[m
[31m-    ngx_uint_t            ctx_index;[m
[31m-    ngx_uint_t            index;[m
[31m-[m
[31m-    char                 *name;[m
[31m-[m
[31m-    ngx_uint_t            spare0;[m
[31m-    ngx_uint_t            spare1;[m
[31m-[m
[31m-    ngx_uint_t            version;[m
[31m-    const char           *signature;[m
[31m-[m
[31m-    void                 *ctx;[m
[31m-    ngx_command_t        *commands;[m
[31m-    ngx_uint_t            type;[m
[31m-[m
[31m-    ngx_int_t           (*init_master)(ngx_log_t *log);[m
[31m-[m
[31m-    ngx_int_t           (*init_module)(ngx_cycle_t *cycle);[m
[31m-[m
[31m-    ngx_int_t           (*init_process)(ngx_cycle_t *cycle);[m
[31m-    ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);[m
[31m-    void                (*exit_thread)(ngx_cycle_t *cycle);[m
[31m-    void                (*exit_process)(ngx_cycle_t *cycle);[m
[31m-[m
[31m-    void                (*exit_master)(ngx_cycle_t *cycle);[m
[31m-[m
[31m-    uintptr_t             spare_hook0;[m
[31m-    uintptr_t             spare_hook1;[m
[31m-    uintptr_t             spare_hook2;[m
[31m-    uintptr_t             spare_hook3;[m
[31m-    uintptr_t             spare_hook4;[m
[31m-    uintptr_t             spare_hook5;[m
[31m-    uintptr_t             spare_hook6;[m
[31m-    uintptr_t             spare_hook7;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t             name;[m
[31m-    void               *(*create_conf)(ngx_cycle_t *cycle);[m
[31m-    char               *(*init_conf)(ngx_cycle_t *cycle, void *conf);[m
[31m-} ngx_core_module_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_preinit_modules(void);[m
[31m-ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_init_modules(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_count_modules(ngx_cycle_t *cycle, ngx_uint_t type);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_add_module(ngx_conf_t *cf, ngx_str_t *file,[m
[31m-    ngx_module_t *module, char **order);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  *ngx_modules[];[m
[31m-extern ngx_uint_t     ngx_max_module;[m
[31m-[m
[31m-extern char          *ngx_module_names[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_murmurhash.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_murmurhash.c[m
[1mdeleted file mode 100644[m
[1mindex c31e0e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_murmurhash.c[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Austin Appleby[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-uint32_t[m
[31m-ngx_murmur_hash2(u_char *data, size_t len)[m
[31m-{[m
[31m-    uint32_t  h, k;[m
[31m-[m
[31m-    h = 0 ^ len;[m
[31m-[m
[31m-    while (len >= 4) {[m
[31m-        k  = data[0];[m
[31m-        k |= data[1] << 8;[m
[31m-        k |= data[2] << 16;[m
[31m-        k |= data[3] << 24;[m
[31m-[m
[31m-        k *= 0x5bd1e995;[m
[31m-        k ^= k >> 24;[m
[31m-        k *= 0x5bd1e995;[m
[31m-[m
[31m-        h *= 0x5bd1e995;[m
[31m-        h ^= k;[m
[31m-[m
[31m-        data += 4;[m
[31m-        len -= 4;[m
[31m-    }[m
[31m-[m
[31m-    switch (len) {[m
[31m-    case 3:[m
[31m-        h ^= data[2] << 16;[m
[31m-    case 2:[m
[31m-        h ^= data[1] << 8;[m
[31m-    case 1:[m
[31m-        h ^= data[0];[m
[31m-        h *= 0x5bd1e995;[m
[31m-    }[m
[31m-[m
[31m-    h ^= h >> 13;[m
[31m-    h *= 0x5bd1e995;[m
[31m-    h ^= h >> 15;[m
[31m-[m
[31m-    return h;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_murmurhash.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_murmurhash.h[m
[1mdeleted file mode 100644[m
[1mindex 54e867d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_murmurhash.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MURMURHASH_H_INCLUDED_[m
[31m-#define _NGX_MURMURHASH_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-uint32_t ngx_murmur_hash2(u_char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MURMURHASH_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_open_file_cache.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_open_file_cache.c[m
[1mdeleted file mode 100644[m
[1mindex b23ee78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_open_file_cache.c[m
[1m+++ /dev/null[m
[36m@@ -1,1253 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * open file cache caches[m
[31m- *    open file handles with stat() info;[m
[31m- *    directories stat() info;[m
[31m- *    files and directories errors: not found, access denied, etc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#define NGX_MIN_READ_AHEAD  (128 * 1024)[m
[31m-[m
[31m-[m
[31m-static void ngx_open_file_cache_cleanup(void *data);[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-static ngx_fd_t ngx_openat_file_owner(ngx_fd_t at_fd, const u_char *name,[m
[31m-    ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log);[m
[31m-#if (NGX_HAVE_O_PATH)[m
[31m-static ngx_int_t ngx_file_o_path_info(ngx_fd_t fd, ngx_file_info_t *fi,[m
[31m-    ngx_log_t *log);[m
[31m-#endif[m
[31m-#endif[m
[31m-static ngx_fd_t ngx_open_file_wrapper(ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_int_t mode, ngx_int_t create,[m
[31m-    ngx_int_t access, ngx_log_t *log);[m
[31m-static ngx_int_t ngx_file_info_wrapper(ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_file_info_t *fi, ngx_log_t *log);[m
[31m-static ngx_int_t ngx_open_and_stat_file(ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_log_t *log);[m
[31m-static void ngx_open_file_add_event(ngx_open_file_cache_t *cache,[m
[31m-    ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log);[m
[31m-static void ngx_open_file_cleanup(void *data);[m
[31m-static void ngx_close_cached_file(ngx_open_file_cache_t *cache,[m
[31m-    ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log);[m
[31m-static void ngx_open_file_del_event(ngx_cached_open_file_t *file);[m
[31m-static void ngx_expire_old_cached_files(ngx_open_file_cache_t *cache,[m
[31m-    ngx_uint_t n, ngx_log_t *log);[m
[31m-static void ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-static ngx_cached_open_file_t *[m
[31m-    ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name,[m
[31m-    uint32_t hash);[m
[31m-static void ngx_open_file_cache_remove(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_open_file_cache_t *[m
[31m-ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_open_file_cache_t  *cache;[m
[31m-[m
[31m-    cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t));[m
[31m-    if (cache == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(&cache->rbtree, &cache->sentinel,[m
[31m-                    ngx_open_file_cache_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&cache->expire_queue);[m
[31m-[m
[31m-    cache->current = 0;[m
[31m-    cache->max = max;[m
[31m-    cache->inactive = inactive;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_open_file_cache_cleanup;[m
[31m-    cln->data = cache;[m
[31m-[m
[31m-    return cache;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_cache_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_open_file_cache_t  *cache = data;[m
[31m-[m
[31m-    ngx_queue_t             *q;[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                   "open file cache cleanup");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->expire_queue)) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->expire_queue);[m
[31m-[m
[31m-        file = ngx_queue_data(q, ngx_cached_open_file_t, queue);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->rbtree, &file->node);[m
[31m-[m
[31m-        cache->current--;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                       "delete cached open file: %s", file->name);[m
[31m-[m
[31m-        if (!file->err && !file->is_dir) {[m
[31m-            file->close = 1;[m
[31m-            file->count = 0;[m
[31m-            ngx_close_cached_file(cache, file, 0, ngx_cycle->log);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_free(file->name);[m
[31m-            ngx_free(file);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cache->current) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "%ui items still left in open file cache",[m
[31m-                      cache->current);[m
[31m-    }[m
[31m-[m
[31m-    if (cache->rbtree.root != cache->rbtree.sentinel) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "rbtree still is not empty in open file cache");[m
[31m-[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_pool_t *pool)[m
[31m-{[m
[31m-    time_t                          now;[m
[31m-    uint32_t                        hash;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_file_info_t                 fi;[m
[31m-    ngx_pool_cleanup_t             *cln;[m
[31m-    ngx_cached_open_file_t         *file;[m
[31m-    ngx_pool_cleanup_file_t        *clnf;[m
[31m-    ngx_open_file_cache_cleanup_t  *ofcln;[m
[31m-[m
[31m-    of->fd = NGX_INVALID_FILE;[m
[31m-    of->err = 0;[m
[31m-[m
[31m-    if (cache == NULL) {[m
[31m-[m
[31m-        if (of->test_only) {[m
[31m-[m
[31m-            if (ngx_file_info_wrapper(name, of, &fi, pool->log)[m
[31m-                == NGX_FILE_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            of->uniq = ngx_file_uniq(&fi);[m
[31m-            of->mtime = ngx_file_mtime(&fi);[m
[31m-            of->size = ngx_file_size(&fi);[m
[31m-            of->fs_size = ngx_file_fs_size(&fi);[m
[31m-            of->is_dir = ngx_is_dir(&fi);[m
[31m-            of->is_file = ngx_is_file(&fi);[m
[31m-            of->is_link = ngx_is_link(&fi);[m
[31m-            of->is_exec = ngx_is_exec(&fi);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_open_and_stat_file(name, of, pool->log);[m
[31m-[m
[31m-        if (rc == NGX_OK && !of->is_dir) {[m
[31m-            cln->handler = ngx_pool_cleanup_file;[m
[31m-            clnf = cln->data;[m
[31m-[m
[31m-            clnf->fd = of->fd;[m
[31m-            clnf->name = name->data;[m
[31m-            clnf->log = pool->log;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(pool, sizeof(ngx_open_file_cache_cleanup_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    hash = ngx_crc32_long(name->data, name->len);[m
[31m-[m
[31m-    file = ngx_open_file_lookup(cache, name, hash);[m
[31m-[m
[31m-    if (file) {[m
[31m-[m
[31m-        file->uses++;[m
[31m-[m
[31m-        ngx_queue_remove(&file->queue);[m
[31m-[m
[31m-        if (file->fd == NGX_INVALID_FILE && file->err == 0 && !file->is_dir) {[m
[31m-[m
[31m-            /* file was not used often enough to keep open */[m
[31m-[m
[31m-            rc = ngx_open_and_stat_file(name, of, pool->log);[m
[31m-[m
[31m-            if (rc != NGX_OK && (of->err == 0 || !of->errors)) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            goto add_event;[m
[31m-        }[m
[31m-[m
[31m-        if (file->use_event[m
[31m-            || (file->event == NULL[m
[31m-                && (of->uniq == 0 || of->uniq == file->uniq)[m
[31m-                && now - file->created < of->valid[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-                && of->disable_symlinks == file->disable_symlinks[m
[31m-                && of->disable_symlinks_from == file->disable_symlinks_from[m
[31m-#endif[m
[31m-            ))[m
[31m-        {[m
[31m-            if (file->err == 0) {[m
[31m-[m
[31m-                of->fd = file->fd;[m
[31m-                of->uniq = file->uniq;[m
[31m-                of->mtime = file->mtime;[m
[31m-                of->size = file->size;[m
[31m-[m
[31m-                of->is_dir = file->is_dir;[m
[31m-                of->is_file = file->is_file;[m
[31m-                of->is_link = file->is_link;[m
[31m-                of->is_exec = file->is_exec;[m
[31m-                of->is_directio = file->is_directio;[m
[31m-[m
[31m-                if (!file->is_dir) {[m
[31m-                    file->count++;[m
[31m-                    ngx_open_file_add_event(cache, file, of, pool->log);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                of->err = file->err;[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-                of->failed = file->disable_symlinks ? ngx_openat_file_n[m
[31m-                                                    : ngx_open_file_n;[m
[31m-#else[m
[31m-                of->failed = ngx_open_file_n;[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0,[m
[31m-                       "retest open file: %s, fd:%d, c:%d, e:%d",[m
[31m-                       file->name, file->fd, file->count, file->err);[m
[31m-[m
[31m-        if (file->is_dir) {[m
[31m-[m
[31m-            /*[m
[31m-             * chances that directory became file are very small[m
[31m-             * so test_dir flag allows to use a single syscall[m
[31m-             * in ngx_file_info() instead of three syscalls[m
[31m-             */[m
[31m-[m
[31m-            of->test_dir = 1;[m
[31m-        }[m
[31m-[m
[31m-        of->fd = file->fd;[m
[31m-        of->uniq = file->uniq;[m
[31m-[m
[31m-        rc = ngx_open_and_stat_file(name, of, pool->log);[m
[31m-[m
[31m-        if (rc != NGX_OK && (of->err == 0 || !of->errors)) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (of->is_dir) {[m
[31m-[m
[31m-            if (file->is_dir || file->err) {[m
[31m-                goto update;[m
[31m-            }[m
[31m-[m
[31m-            /* file became directory */[m
[31m-[m
[31m-        } else if (of->err == 0) {  /* file */[m
[31m-[m
[31m-            if (file->is_dir || file->err) {[m
[31m-                goto add_event;[m
[31m-            }[m
[31m-[m
[31m-            if (of->uniq == file->uniq) {[m
[31m-[m
[31m-                if (file->event) {[m
[31m-                    file->use_event = 1;[m
[31m-                }[m
[31m-[m
[31m-                of->is_directio = file->is_directio;[m
[31m-[m
[31m-                goto update;[m
[31m-            }[m
[31m-[m
[31m-            /* file was changed */[m
[31m-[m
[31m-        } else { /* error to cache */[m
[31m-[m
[31m-            if (file->err || file->is_dir) {[m
[31m-                goto update;[m
[31m-            }[m
[31m-[m
[31m-            /* file was removed, etc. */[m
[31m-        }[m
[31m-[m
[31m-        if (file->count == 0) {[m
[31m-[m
[31m-            ngx_open_file_del_event(file);[m
[31m-[m
[31m-            if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,[m
[31m-                              ngx_close_file_n " \"%V\" failed", name);[m
[31m-            }[m
[31m-[m
[31m-            goto add_event;[m
[31m-        }[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->rbtree, &file->node);[m
[31m-[m
[31m-        cache->current--;[m
[31m-[m
[31m-        file->close = 1;[m
[31m-[m
[31m-        goto create;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    rc = ngx_open_and_stat_file(name, of, pool->log);[m
[31m-[m
[31m-    if (rc != NGX_OK && (of->err == 0 || !of->errors)) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-create:[m
[31m-[m
[31m-    if (cache->current >= cache->max) {[m
[31m-        ngx_expire_old_cached_files(cache, 0, pool->log);[m
[31m-    }[m
[31m-[m
[31m-    file = ngx_alloc(sizeof(ngx_cached_open_file_t), pool->log);[m
[31m-[m
[31m-    if (file == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    file->name = ngx_alloc(name->len + 1, pool->log);[m
[31m-[m
[31m-    if (file->name == NULL) {[m
[31m-        ngx_free(file);[m
[31m-        file = NULL;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cpystrn(file->name, name->data, name->len + 1);[m
[31m-[m
[31m-    file->node.key = hash;[m
[31m-[m
[31m-    ngx_rbtree_insert(&cache->rbtree, &file->node);[m
[31m-[m
[31m-    cache->current++;[m
[31m-[m
[31m-    file->uses = 1;[m
[31m-    file->count = 0;[m
[31m-    file->use_event = 0;[m
[31m-    file->event = NULL;[m
[31m-[m
[31m-add_event:[m
[31m-[m
[31m-    ngx_open_file_add_event(cache, file, of, pool->log);[m
[31m-[m
[31m-update:[m
[31m-[m
[31m-    file->fd = of->fd;[m
[31m-    file->err = of->err;[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    file->disable_symlinks = of->disable_symlinks;[m
[31m-    file->disable_symlinks_from = of->disable_symlinks_from;[m
[31m-#endif[m
[31m-[m
[31m-    if (of->err == 0) {[m
[31m-        file->uniq = of->uniq;[m
[31m-        file->mtime = of->mtime;[m
[31m-        file->size = of->size;[m
[31m-[m
[31m-        file->close = 0;[m
[31m-[m
[31m-        file->is_dir = of->is_dir;[m
[31m-        file->is_file = of->is_file;[m
[31m-        file->is_link = of->is_link;[m
[31m-        file->is_exec = of->is_exec;[m
[31m-        file->is_directio = of->is_directio;[m
[31m-[m
[31m-        if (!of->is_dir) {[m
[31m-            file->count++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    file->created = now;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    file->accessed = now;[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->expire_queue, &file->queue);[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_CORE, pool->log, 0,[m
[31m-                   "cached open file: %s, fd:%d, c:%d, e:%d, u:%d",[m
[31m-                   file->name, file->fd, file->count, file->err, file->uses);[m
[31m-[m
[31m-    if (of->err == 0) {[m
[31m-[m
[31m-        if (!of->is_dir) {[m
[31m-            cln->handler = ngx_open_file_cleanup;[m
[31m-            ofcln = cln->data;[m
[31m-[m
[31m-            ofcln->cache = cache;[m
[31m-            ofcln->file = file;[m
[31m-            ofcln->min_uses = of->min_uses;[m
[31m-            ofcln->log = pool->log;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (file) {[m
[31m-        ngx_rbtree_delete(&cache->rbtree, &file->node);[m
[31m-[m
[31m-        cache->current--;[m
[31m-[m
[31m-        if (file->count == 0) {[m
[31m-[m
[31m-            if (file->fd != NGX_INVALID_FILE) {[m
[31m-                if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,[m
[31m-                                  ngx_close_file_n " \"%s\" failed",[m
[31m-                                  file->name);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_free(file->name);[m
[31m-            ngx_free(file);[m
[31m-[m
[31m-        } else {[m
[31m-            file->close = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (of->fd != NGX_INVALID_FILE) {[m
[31m-        if (ngx_close_file(of->fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-static ngx_fd_t[m
[31m-ngx_openat_file_owner(ngx_fd_t at_fd, const u_char *name,[m
[31m-    ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t         fd;[m
[31m-    ngx_err_t        err;[m
[31m-    ngx_file_info_t  fi, atfi;[m
[31m-[m
[31m-    /*[m
[31m-     * To allow symlinks with the same owner, use openat() (followed[m
[31m-     * by fstat()) and fstatat(AT_SYMLINK_NOFOLLOW), and then compare[m
[31m-     * uids between fstat() and fstatat().[m
[31m-     *[m
[31m-     * As there is a race between openat() and fstatat() we don't[m
[31m-     * know if openat() in fact opened symlink or not.  Therefore,[m
[31m-     * we have to compare uids even if fstatat() reports the opened[m
[31m-     * component isn't a symlink (as we don't know whether it was[m
[31m-     * symlink during openat() or not).[m
[31m-     */[m
[31m-[m
[31m-    fd = ngx_openat_file(at_fd, name, mode, create, access);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        return NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_file_at_info(at_fd, name, &atfi, AT_SYMLINK_NOFOLLOW)[m
[31m-        == NGX_FILE_ERROR)[m
[31m-    {[m
[31m-        err = ngx_errno;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_O_PATH)[m
[31m-    if (ngx_file_o_path_info(fd, &fi, log) == NGX_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#else[m
[31m-    if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (fi.st_uid != atfi.st_uid) {[m
[31m-        err = NGX_ELOOP;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    ngx_set_errno(err);[m
[31m-[m
[31m-    return NGX_INVALID_FILE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_O_PATH)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_file_o_path_info(ngx_fd_t fd, ngx_file_info_t *fi, ngx_log_t *log)[m
[31m-{[m
[31m-    static ngx_uint_t  use_fstat = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * In Linux 2.6.39 the O_PATH flag was introduced that allows to obtain[m
[31m-     * a descriptor without actually opening file or directory.  It requires[m
[31m-     * less permissions for path components, but till Linux 3.6 fstat() returns[m
[31m-     * EBADF on such descriptors, and fstatat() with the AT_EMPTY_PATH flag[m
[31m-     * should be used instead.[m
[31m-     *[m
[31m-     * Three scenarios are handled in this function:[m
[31m-     *[m
[31m-     * 1) The kernel is newer than 3.6 or fstat() with O_PATH support was[m
[31m-     *    backported by vendor.  Then fstat() is used.[m
[31m-     *[m
[31m-     * 2) The kernel is newer than 2.6.39 but older than 3.6.  In this case[m
[31m-     *    the first call of fstat() returns EBADF and we fallback to fstatat()[m
[31m-     *    with AT_EMPTY_PATH which was introduced at the same time as O_PATH.[m
[31m-     *[m
[31m-     * 3) The kernel is older than 2.6.39 but nginx was build with O_PATH[m
[31m-     *    support.  Since descriptors are opened with O_PATH|O_RDONLY flags[m
[31m-     *    and O_PATH is ignored by the kernel then the O_RDONLY flag is[m
[31m-     *    actually used.  In this case fstat() just works.[m
[31m-     */[m
[31m-[m
[31m-    if (use_fstat) {[m
[31m-        if (ngx_fd_info(fd, fi) != NGX_FILE_ERROR) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_errno != NGX_EBADF) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                      "fstat(O_PATH) failed with EBADF, "[m
[31m-                      "switching to fstatat(AT_EMPTY_PATH)");[m
[31m-[m
[31m-        use_fstat = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_file_at_info(fd, "", fi, AT_EMPTY_PATH) != NGX_FILE_ERROR) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_HAVE_OPENAT */[m
[31m-[m
[31m-[m
[31m-static ngx_fd_t[m
[31m-ngx_open_file_wrapper(ngx_str_t *name, ngx_open_file_info_t *of,[m
[31m-    ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-#if !(NGX_HAVE_OPENAT)[m
[31m-[m
[31m-    fd = ngx_open_file(name->data, mode, create, access);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        of->err = ngx_errno;[m
[31m-        of->failed = ngx_open_file_n;[m
[31m-        return NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u_char           *p, *cp, *end;[m
[31m-    ngx_fd_t          at_fd;[m
[31m-    ngx_str_t         at_name;[m
[31m-[m
[31m-    if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {[m
[31m-        fd = ngx_open_file(name->data, mode, create, access);[m
[31m-[m
[31m-        if (fd == NGX_INVALID_FILE) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_open_file_n;[m
[31m-            return NGX_INVALID_FILE;[m
[31m-        }[m
[31m-[m
[31m-        return fd;[m
[31m-    }[m
[31m-[m
[31m-    p = name->data;[m
[31m-    end = p + name->len;[m
[31m-[m
[31m-    at_name = *name;[m
[31m-[m
[31m-    if (of->disable_symlinks_from) {[m
[31m-[m
[31m-        cp = p + of->disable_symlinks_from;[m
[31m-[m
[31m-        *cp = '\0';[m
[31m-[m
[31m-        at_fd = ngx_open_file(p, NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,[m
[31m-                              NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-        *cp = '/';[m
[31m-[m
[31m-        if (at_fd == NGX_INVALID_FILE) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_open_file_n;[m
[31m-            return NGX_INVALID_FILE;[m
[31m-        }[m
[31m-[m
[31m-        at_name.len = of->disable_symlinks_from;[m
[31m-        p = cp + 1;[m
[31m-[m
[31m-    } else if (*p == '/') {[m
[31m-[m
[31m-        at_fd = ngx_open_file("/",[m
[31m-                              NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,[m
[31m-                              NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-        if (at_fd == NGX_INVALID_FILE) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_openat_file_n;[m
[31m-            return NGX_INVALID_FILE;[m
[31m-        }[m
[31m-[m
[31m-        at_name.len = 1;[m
[31m-        p++;[m
[31m-[m
[31m-    } else {[m
[31m-        at_fd = NGX_AT_FDCWD;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        cp = ngx_strlchr(p, end, '/');[m
[31m-        if (cp == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (cp == p) {[m
[31m-            p++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *cp = '\0';[m
[31m-[m
[31m-        if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_NOTOWNER) {[m
[31m-            fd = ngx_openat_file_owner(at_fd, p,[m
[31m-                                       NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,[m
[31m-                                       NGX_FILE_OPEN, 0, log);[m
[31m-[m
[31m-        } else {[m
[31m-            fd = ngx_openat_file(at_fd, p,[m
[31m-                           NGX_FILE_SEARCH|NGX_FILE_NONBLOCK|NGX_FILE_NOFOLLOW,[m
[31m-                           NGX_FILE_OPEN, 0);[m
[31m-        }[m
[31m-[m
[31m-        *cp = '/';[m
[31m-[m
[31m-        if (fd == NGX_INVALID_FILE) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_openat_file_n;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (at_fd != NGX_AT_FDCWD && ngx_close_file(at_fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", &at_name);[m
[31m-        }[m
[31m-[m
[31m-        p = cp + 1;[m
[31m-        at_fd = fd;[m
[31m-        at_name.len = cp - at_name.data;[m
[31m-    }[m
[31m-[m
[31m-    if (p == end) {[m
[31m-[m
[31m-        /*[m
[31m-         * If pathname ends with a trailing slash, assume the last path[m
[31m-         * component is a directory and reopen it with requested flags;[m
[31m-         * if not, fail with ENOTDIR as per POSIX.[m
[31m-         *[m
[31m-         * We cannot rely on O_DIRECTORY in the loop above to check[m
[31m-         * that the last path component is a directory because[m
[31m-         * O_DIRECTORY doesn't work on FreeBSD 8.  Fortunately, by[m
[31m-         * reopening a directory, we don't depend on it at all.[m
[31m-         */[m
[31m-[m
[31m-        fd = ngx_openat_file(at_fd, ".", mode, create, access);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_NOTOWNER[m
[31m-        && !(create & (NGX_FILE_CREATE_OR_OPEN|NGX_FILE_TRUNCATE)))[m
[31m-    {[m
[31m-        fd = ngx_openat_file_owner(at_fd, p, mode, create, access, log);[m
[31m-[m
[31m-    } else {[m
[31m-        fd = ngx_openat_file(at_fd, p, mode|NGX_FILE_NOFOLLOW, create, access);[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        of->err = ngx_errno;[m
[31m-        of->failed = ngx_openat_file_n;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (at_fd != NGX_AT_FDCWD && ngx_close_file(at_fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%V\" failed", &at_name);[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_file_info_wrapper(ngx_str_t *name, ngx_open_file_info_t *of,[m
[31m-    ngx_file_info_t *fi, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-#if !(NGX_HAVE_OPENAT)[m
[31m-[m
[31m-    rc = ngx_file_info(name->data, fi);[m
[31m-[m
[31m-    if (rc == NGX_FILE_ERROR) {[m
[31m-        of->err = ngx_errno;[m
[31m-        of->failed = ngx_file_info_n;[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {[m
[31m-[m
[31m-        rc = ngx_file_info(name->data, fi);[m
[31m-[m
[31m-        if (rc == NGX_FILE_ERROR) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_file_info_n;[m
[31m-            return NGX_FILE_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,[m
[31m-                               NGX_FILE_OPEN, 0, log);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_fd_info(fd, fi);[m
[31m-[m
[31m-    if (rc == NGX_FILE_ERROR) {[m
[31m-        of->err = ngx_errno;[m
[31m-        of->failed = ngx_fd_info_n;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%V\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_open_and_stat_file(ngx_str_t *name, ngx_open_file_info_t *of,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t         fd;[m
[31m-    ngx_file_info_t  fi;[m
[31m-[m
[31m-    if (of->fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        if (ngx_file_info_wrapper(name, of, &fi, log) == NGX_FILE_ERROR) {[m
[31m-            of->fd = NGX_INVALID_FILE;[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (of->uniq == ngx_file_uniq(&fi)) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-    } else if (of->test_dir) {[m
[31m-[m
[31m-        if (ngx_file_info_wrapper(name, of, &fi, log) == NGX_FILE_ERROR) {[m
[31m-            of->fd = NGX_INVALID_FILE;[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_is_dir(&fi)) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!of->log) {[m
[31m-[m
[31m-        /*[m
[31m-         * Use non-blocking open() not to hang on FIFO files, etc.[m
[31m-         * This flag has no effect on a regular files.[m
[31m-         */[m
[31m-[m
[31m-        fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,[m
[31m-                                   NGX_FILE_OPEN, 0, log);[m
[31m-[m
[31m-    } else {[m
[31m-        fd = ngx_open_file_wrapper(name, of, NGX_FILE_APPEND,[m
[31m-                                   NGX_FILE_CREATE_OR_OPEN,[m
[31m-                                   NGX_FILE_DEFAULT_ACCESS, log);[m
[31m-    }[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,[m
[31m-                      ngx_fd_info_n " \"%V\" failed", name);[m
[31m-[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-    } else {[m
[31m-        of->fd = fd;[m
[31m-[m
[31m-        if (of->read_ahead && ngx_file_size(&fi) > NGX_MIN_READ_AHEAD) {[m
[31m-            if (ngx_read_ahead(fd, of->read_ahead) == NGX_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                              ngx_read_ahead_n " \"%V\" failed", name);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (of->directio <= ngx_file_size(&fi)) {[m
[31m-            if (ngx_directio_on(fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                              ngx_directio_on_n " \"%V\" failed", name);[m
[31m-[m
[31m-            } else {[m
[31m-                of->is_directio = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    of->uniq = ngx_file_uniq(&fi);[m
[31m-    of->mtime = ngx_file_mtime(&fi);[m
[31m-    of->size = ngx_file_size(&fi);[m
[31m-    of->fs_size = ngx_file_fs_size(&fi);[m
[31m-    of->is_dir = ngx_is_dir(&fi);[m
[31m-    of->is_file = ngx_is_file(&fi);[m
[31m-    of->is_link = ngx_is_link(&fi);[m
[31m-    of->is_exec = ngx_is_exec(&fi);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * we ignore any possible event setting error and[m
[31m- * fallback to usual periodic file retests[m
[31m- */[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_add_event(ngx_open_file_cache_t *cache,[m
[31m-    ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_open_file_cache_event_t  *fev;[m
[31m-[m
[31m-    if (!(ngx_event_flags & NGX_USE_VNODE_EVENT)[m
[31m-        || !of->events[m
[31m-        || file->event[m
[31m-        || of->fd == NGX_INVALID_FILE[m
[31m-        || file->uses < of->min_uses)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    file->use_event = 0;[m
[31m-[m
[31m-    file->event = ngx_calloc(sizeof(ngx_event_t), log);[m
[31m-    if (file->event== NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    fev = ngx_alloc(sizeof(ngx_open_file_cache_event_t), log);[m
[31m-    if (fev == NULL) {[m
[31m-        ngx_free(file->event);[m
[31m-        file->event = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    fev->fd = of->fd;[m
[31m-    fev->file = file;[m
[31m-    fev->cache = cache;[m
[31m-[m
[31m-    file->event->handler = ngx_open_file_cache_remove;[m
[31m-    file->event->data = fev;[m
[31m-[m
[31m-    /*[m
[31m-     * although vnode event may be called while ngx_cycle->poll[m
[31m-     * destruction, however, cleanup procedures are run before any[m
[31m-     * memory freeing and events will be canceled.[m
[31m-     */[m
[31m-[m
[31m-    file->event->log = ngx_cycle->log;[m
[31m-[m
[31m-    if (ngx_add_event(file->event, NGX_VNODE_EVENT, NGX_ONESHOT_EVENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_free(file->event->data);[m
[31m-        ngx_free(file->event);[m
[31m-        file->event = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set file->use_event here because there may be a race[m
[31m-     * condition: a file may be deleted between opening the file and[m
[31m-     * adding event, so we rely upon event notification only after[m
[31m-     * one file revalidation on next file access[m
[31m-     */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_open_file_cache_cleanup_t  *c = data;[m
[31m-[m
[31m-    c->file->count--;[m
[31m-[m
[31m-    ngx_close_cached_file(c->cache, c->file, c->min_uses, c->log);[m
[31m-[m
[31m-    /* drop one or two expired open files */[m
[31m-    ngx_expire_old_cached_files(c->cache, 1, c->log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_close_cached_file(ngx_open_file_cache_t *cache,[m
[31m-    ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "close cached open file: %s, fd:%d, c:%d, u:%d, %d",[m
[31m-                   file->name, file->fd, file->count, file->uses, file->close);[m
[31m-[m
[31m-    if (!file->close) {[m
[31m-[m
[31m-        file->accessed = ngx_time();[m
[31m-[m
[31m-        ngx_queue_remove(&file->queue);[m
[31m-[m
[31m-        ngx_queue_insert_head(&cache->expire_queue, &file->queue);[m
[31m-[m
[31m-        if (file->uses >= min_uses || file->count) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_open_file_del_event(file);[m
[31m-[m
[31m-    if (file->count) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (file->fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", file->name);[m
[31m-        }[m
[31m-[m
[31m-        file->fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    if (!file->close) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(file->name);[m
[31m-    ngx_free(file);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_del_event(ngx_cached_open_file_t *file)[m
[31m-{[m
[31m-    if (file->event == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_del_event(file->event, NGX_VNODE_EVENT,[m
[31m-                         file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT);[m
[31m-[m
[31m-    ngx_free(file->event->data);[m
[31m-    ngx_free(file->event);[m
[31m-    file->event = NULL;[m
[31m-    file->use_event = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, ngx_uint_t n,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    time_t                   now;[m
[31m-    ngx_queue_t             *q;[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    /*[m
[31m-     * n == 1 deletes one or two inactive files[m
[31m-     * n == 0 deletes least recently used file by force[m
[31m-     *        and one or two inactive files[m
[31m-     */[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->expire_queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->expire_queue);[m
[31m-[m
[31m-        file = ngx_queue_data(q, ngx_cached_open_file_t, queue);[m
[31m-[m
[31m-        if (n++ != 0 && now - file->accessed <= cache->inactive) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->rbtree, &file->node);[m
[31m-[m
[31m-        cache->current--;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "expire cached open file: %s", file->name);[m
[31m-[m
[31m-        if (!file->err && !file->is_dir) {[m
[31m-            file->close = 1;[m
[31m-            ngx_close_cached_file(cache, file, 0, log);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_free(file->name);[m
[31m-            ngx_free(file);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t       **p;[m
[31m-    ngx_cached_open_file_t    *file, *file_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            file = (ngx_cached_open_file_t *) node;[m
[31m-            file_temp = (ngx_cached_open_file_t *) temp;[m
[31m-[m
[31m-            p = (ngx_strcmp(file->name, file_temp->name) < 0)[m
[31m-                    ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_cached_open_file_t *[m
[31m-ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_rbtree_node_t       *node, *sentinel;[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-[m
[31m-    node = cache->rbtree.root;[m
[31m-    sentinel = cache->rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        file = (ngx_cached_open_file_t *) node;[m
[31m-[m
[31m-        rc = ngx_strcmp(name->data, file->name);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return file;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_cache_remove(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_cached_open_file_t       *file;[m
[31m-    ngx_open_file_cache_event_t  *fev;[m
[31m-[m
[31m-    fev = ev->data;[m
[31m-    file = fev->file;[m
[31m-[m
[31m-    ngx_queue_remove(&file->queue);[m
[31m-[m
[31m-    ngx_rbtree_delete(&fev->cache->rbtree, &file->node);[m
[31m-[m
[31m-    fev->cache->current--;[m
[31m-[m
[31m-    /* NGX_ONESHOT_EVENT was already deleted */[m
[31m-    file->event = NULL;[m
[31m-    file->use_event = 0;[m
[31m-[m
[31m-    file->close = 1;[m
[31m-[m
[31m-    ngx_close_cached_file(fev->cache, file, 0, ev->log);[m
[31m-[m
[31m-    /* free memory only when fev->cache and fev->file are already not needed */[m
[31m-[m
[31m-    ngx_free(ev->data);[m
[31m-    ngx_free(ev);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_open_file_cache.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_open_file_cache.h[m
[1mdeleted file mode 100644[m
[1mindex d119c12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_open_file_cache.h[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_OPEN_FILE_CACHE_H_INCLUDED_[m
[31m-#define _NGX_OPEN_FILE_CACHE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define NGX_OPEN_FILE_DIRECTIO_OFF  NGX_MAX_OFF_T_VALUE[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_fd_t                 fd;[m
[31m-    ngx_file_uniq_t          uniq;[m
[31m-    time_t                   mtime;[m
[31m-    off_t                    size;[m
[31m-    off_t                    fs_size;[m
[31m-    off_t                    directio;[m
[31m-    size_t                   read_ahead;[m
[31m-[m
[31m-    ngx_err_t                err;[m
[31m-    char                    *failed;[m
[31m-[m
[31m-    time_t                   valid;[m
[31m-[m
[31m-    ngx_uint_t               min_uses;[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    size_t                   disable_symlinks_from;[m
[31m-    unsigned                 disable_symlinks:2;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                 test_dir:1;[m
[31m-    unsigned                 test_only:1;[m
[31m-    unsigned                 log:1;[m
[31m-    unsigned                 errors:1;[m
[31m-    unsigned                 events:1;[m
[31m-[m
[31m-    unsigned                 is_dir:1;[m
[31m-    unsigned                 is_file:1;[m
[31m-    unsigned                 is_link:1;[m
[31m-    unsigned                 is_exec:1;[m
[31m-    unsigned                 is_directio:1;[m
[31m-} ngx_open_file_info_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_cached_open_file_s  ngx_cached_open_file_t;[m
[31m-[m
[31m-struct ngx_cached_open_file_s {[m
[31m-    ngx_rbtree_node_t        node;[m
[31m-    ngx_queue_t              queue;[m
[31m-[m
[31m-    u_char                  *name;[m
[31m-    time_t                   created;[m
[31m-    time_t                   accessed;[m
[31m-[m
[31m-    ngx_fd_t                 fd;[m
[31m-    ngx_file_uniq_t          uniq;[m
[31m-    time_t                   mtime;[m
[31m-    off_t                    size;[m
[31m-    ngx_err_t                err;[m
[31m-[m
[31m-    uint32_t                 uses;[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    size_t                   disable_symlinks_from;[m
[31m-    unsigned                 disable_symlinks:2;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                 count:24;[m
[31m-    unsigned                 close:1;[m
[31m-    unsigned                 use_event:1;[m
[31m-[m
[31m-    unsigned                 is_dir:1;[m
[31m-    unsigned                 is_file:1;[m
[31m-    unsigned                 is_link:1;[m
[31m-    unsigned                 is_exec:1;[m
[31m-    unsigned                 is_directio:1;[m
[31m-[m
[31m-    ngx_event_t             *event;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t             rbtree;[m
[31m-    ngx_rbtree_node_t        sentinel;[m
[31m-    ngx_queue_t              expire_queue;[m
[31m-[m
[31m-    ngx_uint_t               current;[m
[31m-    ngx_uint_t               max;[m
[31m-    time_t                   inactive;[m
[31m-} ngx_open_file_cache_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_open_file_cache_t   *cache;[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-    ngx_uint_t               min_uses;[m
[31m-    ngx_log_t               *log;[m
[31m-} ngx_open_file_cache_cleanup_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-[m
[31m-    /* ngx_connection_t stub to allow use c->fd as event ident */[m
[31m-    void                    *data;[m
[31m-    ngx_event_t             *read;[m
[31m-    ngx_event_t             *write;[m
[31m-    ngx_fd_t                 fd;[m
[31m-[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-    ngx_open_file_cache_t   *cache;[m
[31m-} ngx_open_file_cache_event_t;[m
[31m-[m
[31m-[m
[31m-ngx_open_file_cache_t *ngx_open_file_cache_init(ngx_pool_t *pool,[m
[31m-    ngx_uint_t max, time_t inactive);[m
[31m-ngx_int_t ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_pool_t *pool);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_OPEN_FILE_CACHE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_output_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_output_chain.c[m
[1mdeleted file mode 100644[m
[1mindex f784578..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_output_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,767 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-#define NGX_SENDFILE_LIMIT  4096[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m- * When DIRECTIO is enabled FreeBSD, Solaris, and MacOSX read directly[m
[31m- * to an application memory from a device if parameters are aligned[m
[31m- * to device sector boundary (512 bytes).  They fallback to usual read[m
[31m- * operation if the parameters are not aligned.[m
[31m- * Linux allows DIRECTIO only if the parameters are aligned to a filesystem[m
[31m- * sector boundary, otherwise it returns EINVAL.  The sector size is[m
[31m- * usually 512 bytes, however, on XFS it may be 4096 bytes.[m
[31m- */[m
[31m-[m
[31m-#define NGX_NONE            1[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-    ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf);[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-static ngx_int_t ngx_output_chain_aio_setup(ngx_output_chain_ctx_t *ctx,[m
[31m-    ngx_file_t *file);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_output_chain_add_copy(ngx_pool_t *pool,[m
[31m-    ngx_chain_t **chain, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx,[m
[31m-    off_t bsize);[m
[31m-static ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx,[m
[31m-    off_t bsize);[m
[31m-static ngx_int_t ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    off_t         bsize;[m
[31m-    ngx_int_t     rc, last;[m
[31m-    ngx_chain_t  *cl, *out, **last_out;[m
[31m-[m
[31m-    if (ctx->in == NULL && ctx->busy == NULL[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-        && !ctx->aio[m
[31m-#endif[m
[31m-       )[m
[31m-    {[m
[31m-        /*[m
[31m-         * the short path for the case when the ctx->in and ctx->busy chains[m
[31m-         * are empty, the incoming chain is empty too or has the single buf[m
[31m-         * that does not require the copy[m
[31m-         */[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            return ctx->output_filter(ctx->filter_ctx, in);[m
[31m-        }[m
[31m-[m
[31m-        if (in->next == NULL[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-            && !(in->buf->in_file && in->buf->file_last > NGX_SENDFILE_LIMIT)[m
[31m-#endif[m
[31m-            && ngx_output_chain_as_is(ctx, in->buf))[m
[31m-        {[m
[31m-            return ctx->output_filter(ctx->filter_ctx, in);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* add the incoming buf to the chain ctx->in */[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_output_chain_add_copy(ctx->pool, &ctx->in, in) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    last_out = &out;[m
[31m-    last = NGX_NONE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-        if (ctx->aio) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        while (ctx->in) {[m
[31m-[m
[31m-            /*[m
[31m-             * cycle while there are the ctx->in bufs[m
[31m-             * and there are the free output bufs to copy in[m
[31m-             */[m
[31m-[m
[31m-            bsize = ngx_buf_size(ctx->in->buf);[m
[31m-[m
[31m-            if (bsize == 0 && !ngx_buf_special(ctx->in->buf)) {[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,[m
[31m-                              "zero size buf in output "[m
[31m-                              "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                              ctx->in->buf->temporary,[m
[31m-                              ctx->in->buf->recycled,[m
[31m-                              ctx->in->buf->in_file,[m
[31m-                              ctx->in->buf->start,[m
[31m-                              ctx->in->buf->pos,[m
[31m-                              ctx->in->buf->last,[m
[31m-                              ctx->in->buf->file,[m
[31m-                              ctx->in->buf->file_pos,[m
[31m-                              ctx->in->buf->file_last);[m
[31m-[m
[31m-                ngx_debug_point();[m
[31m-[m
[31m-                ctx->in = ctx->in->next;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_output_chain_as_is(ctx, ctx->in->buf)) {[m
[31m-[m
[31m-                /* move the chain link to the output chain */[m
[31m-[m
[31m-                cl = ctx->in;[m
[31m-                ctx->in = cl->next;[m
[31m-[m
[31m-                *last_out = cl;[m
[31m-                last_out = &cl->next;[m
[31m-                cl->next = NULL;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->buf == NULL) {[m
[31m-[m
[31m-                rc = ngx_output_chain_align_file_buf(ctx, bsize);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-[m
[31m-                    if (ctx->free) {[m
[31m-[m
[31m-                        /* get the free buf */[m
[31m-[m
[31m-                        cl = ctx->free;[m
[31m-                        ctx->buf = cl->buf;[m
[31m-                        ctx->free = cl->next;[m
[31m-[m
[31m-                        ngx_free_chain(ctx->pool, cl);[m
[31m-[m
[31m-                    } else if (out || ctx->allocated == ctx->bufs.num) {[m
[31m-[m
[31m-                        break;[m
[31m-[m
[31m-                    } else if (ngx_output_chain_get_buf(ctx, bsize) != NGX_OK) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_output_chain_copy_buf(ctx);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                if (out) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            /* delete the completed buf from the ctx->in chain */[m
[31m-[m
[31m-            if (ngx_buf_size(ctx->in->buf) == 0) {[m
[31m-                ctx->in = ctx->in->next;[m
[31m-            }[m
[31m-[m
[31m-            cl = ngx_alloc_chain_link(ctx->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = ctx->buf;[m
[31m-            cl->next = NULL;[m
[31m-            *last_out = cl;[m
[31m-            last_out = &cl->next;[m
[31m-            ctx->buf = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (out == NULL && last != NGX_NONE) {[m
[31m-[m
[31m-            if (ctx->in) {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            return last;[m
[31m-        }[m
[31m-[m
[31m-        last = ctx->output_filter(ctx->filter_ctx, out);[m
[31m-[m
[31m-        if (last == NGX_ERROR || last == NGX_DONE) {[m
[31m-            return last;[m
[31m-        }[m
[31m-[m
[31m-        ngx_chain_update_chains(ctx->pool, &ctx->free, &ctx->busy, &out,[m
[31m-                                ctx->tag);[m
[31m-        last_out = &out;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_uint_t  sendfile;[m
[31m-[m
[31m-    if (ngx_buf_special(buf)) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (buf->in_file) {[m
[31m-        buf->file->thread_handler = ctx->thread_handler;[m
[31m-        buf->file->thread_ctx = ctx->filter_ctx;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (buf->in_file && buf->file->directio) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    sendfile = ctx->sendfile;[m
[31m-[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-[m
[31m-    if (buf->in_file && buf->file_pos >= NGX_SENDFILE_LIMIT) {[m
[31m-        sendfile = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (!sendfile) {[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(buf)) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        buf->in_file = 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    if (ctx->aio_preload && buf->in_file) {[m
[31m-        (void) ngx_output_chain_aio_setup(ctx, buf->file);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->need_in_memory && !ngx_buf_in_memory(buf)) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->need_in_temp && (buf->memory || buf->mmap)) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_aio_setup(ngx_output_chain_ctx_t *ctx, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    if (file->aio == NULL && ngx_file_aio_init(file, ctx->pool) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio = file->aio;[m
[31m-[m
[31m-    aio->data = ctx->filter_ctx;[m
[31m-    aio->preload_handler = ctx->aio_preload;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t  *cl, **ll;[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-    ngx_buf_t    *b, *buf;[m
[31m-#endif[m
[31m-[m
[31m-    ll = chain;[m
[31m-[m
[31m-    for (cl = *chain; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    while (in) {[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-[m
[31m-        buf = in->buf;[m
[31m-[m
[31m-        if (buf->in_file[m
[31m-            && buf->file_pos < NGX_SENDFILE_LIMIT[m
[31m-            && buf->file_last > NGX_SENDFILE_LIMIT)[m
[31m-        {[m
[31m-            /* split a file buf on two bufs by the sendfile limit */[m
[31m-[m
[31m-            b = ngx_calloc_buf(pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            if (ngx_buf_in_memory(buf)) {[m
[31m-                buf->pos += (ssize_t) (NGX_SENDFILE_LIMIT - buf->file_pos);[m
[31m-                b->last = buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            buf->file_pos = NGX_SENDFILE_LIMIT;[m
[31m-            b->file_last = NGX_SENDFILE_LIMIT;[m
[31m-[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf = buf;[m
[31m-            in = in->next;[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-        cl->buf = in->buf;[m
[31m-        in = in->next;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        cl->next = NULL;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)[m
[31m-{[m
[31m-    size_t      size;[m
[31m-    ngx_buf_t  *in;[m
[31m-[m
[31m-    in = ctx->in->buf;[m
[31m-[m
[31m-    if (in->file == NULL || !in->file->directio) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx->directio = 1;[m
[31m-[m
[31m-    size = (size_t) (in->file_pos - (in->file_pos & ~(ctx->alignment - 1)));[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-[m
[31m-        if (bsize >= (off_t) ctx->bufs.size) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        size = (size_t) bsize;[m
[31m-[m
[31m-    } else {[m
[31m-        size = (size_t) ctx->alignment - size;[m
[31m-[m
[31m-        if ((off_t) size > bsize) {[m
[31m-            size = (size_t) bsize;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->buf = ngx_create_temp_buf(ctx->pool, size);[m
[31m-    if (ctx->buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set ctx->buf->tag, because we do not want[m
[31m-     * to reuse the buf via ctx->free list[m
[31m-     */[m
[31m-[m
[31m-#if (NGX_HAVE_ALIGNED_DIRECTIO)[m
[31m-    ctx->unaligned = 1;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)[m
[31m-{[m
[31m-    size_t       size;[m
[31m-    ngx_buf_t   *b, *in;[m
[31m-    ngx_uint_t   recycled;[m
[31m-[m
[31m-    in = ctx->in->buf;[m
[31m-    size = ctx->bufs.size;[m
[31m-    recycled = 1;[m
[31m-[m
[31m-    if (in->last_in_chain) {[m
[31m-[m
[31m-        if (bsize < (off_t) size) {[m
[31m-[m
[31m-            /*[m
[31m-             * allocate a small temp buf for a small last buf[m
[31m-             * or its small last part[m
[31m-             */[m
[31m-[m
[31m-            size = (size_t) bsize;[m
[31m-            recycled = 0;[m
[31m-[m
[31m-        } else if (!ctx->directio[m
[31m-                   && ctx->bufs.num == 1[m
[31m-                   && (bsize < (off_t) (size + size / 4)))[m
[31m-        {[m
[31m-            /*[m
[31m-             * allocate a temp buf that equals to a last buf,[m
[31m-             * if there is no directio, the last buf size is lesser[m
[31m-             * than 1.25 of bufs.size and the temp buf is single[m
[31m-             */[m
[31m-[m
[31m-            size = (size_t) bsize;[m
[31m-            recycled = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_calloc_buf(ctx->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->directio) {[m
[31m-[m
[31m-        /*[m
[31m-         * allocate block aligned to a disk sector size to enable[m
[31m-         * userland buffer direct usage conjunctly with directio[m
[31m-         */[m
[31m-[m
[31m-        b->start = ngx_pmemalign(ctx->pool, size, (size_t) ctx->alignment);[m
[31m-        if (b->start == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        b->start = ngx_palloc(ctx->pool, size);[m
[31m-        if (b->start == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = b->start;[m
[31m-    b->last = b->start;[m
[31m-    b->end = b->last + size;[m
[31m-    b->temporary = 1;[m
[31m-    b->tag = ctx->tag;[m
[31m-    b->recycled = recycled;[m
[31m-[m
[31m-    ctx->buf = b;[m
[31m-    ctx->allocated++;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx)[m
[31m-{[m
[31m-    off_t        size;[m
[31m-    ssize_t      n;[m
[31m-    ngx_buf_t   *src, *dst;[m
[31m-    ngx_uint_t   sendfile;[m
[31m-[m
[31m-    src = ctx->in->buf;[m
[31m-    dst = ctx->buf;[m
[31m-[m
[31m-    size = ngx_buf_size(src);[m
[31m-    size = ngx_min(size, dst->end - dst->pos);[m
[31m-[m
[31m-    sendfile = ctx->sendfile & !ctx->directio;[m
[31m-[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-[m
[31m-    if (src->in_file && src->file_pos >= NGX_SENDFILE_LIMIT) {[m
[31m-        sendfile = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_buf_in_memory(src)) {[m
[31m-        ngx_memcpy(dst->pos, src->pos, (size_t) size);[m
[31m-        src->pos += (size_t) size;[m
[31m-        dst->last += (size_t) size;[m
[31m-[m
[31m-        if (src->in_file) {[m
[31m-[m
[31m-            if (sendfile) {[m
[31m-                dst->in_file = 1;[m
[31m-                dst->file = src->file;[m
[31m-                dst->file_pos = src->file_pos;[m
[31m-                dst->file_last = src->file_pos + size;[m
[31m-[m
[31m-            } else {[m
[31m-                dst->in_file = 0;[m
[31m-            }[m
[31m-[m
[31m-            src->file_pos += size;[m
[31m-[m
[31m-        } else {[m
[31m-            dst->in_file = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (src->pos == src->last) {[m
[31m-            dst->flush = src->flush;[m
[31m-            dst->last_buf = src->last_buf;[m
[31m-            dst->last_in_chain = src->last_in_chain;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#if (NGX_HAVE_ALIGNED_DIRECTIO)[m
[31m-[m
[31m-        if (ctx->unaligned) {[m
[31m-            if (ngx_directio_off(src->file->fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, ngx_errno,[m
[31m-                              ngx_directio_off_n " \"%s\" failed",[m
[31m-                              src->file->name.data);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-        if (ctx->aio_handler) {[m
[31m-            n = ngx_file_aio_read(src->file, dst->pos, (size_t) size,[m
[31m-                                  src->file_pos, ctx->pool);[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                ctx->aio_handler(ctx, src->file);[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-        } else[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-        if (ctx->thread_handler) {[m
[31m-            src->file->thread_task = ctx->thread_task;[m
[31m-            src->file->thread_handler = ctx->thread_handler;[m
[31m-            src->file->thread_ctx = ctx->filter_ctx;[m
[31m-[m
[31m-            n = ngx_thread_read(src->file, dst->pos, (size_t) size,[m
[31m-                                src->file_pos, ctx->pool);[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                ctx->thread_task = src->file->thread_task;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-        } else[m
[31m-#endif[m
[31m-        {[m
[31m-            n = ngx_read_file(src->file, dst->pos, (size_t) size,[m
[31m-                              src->file_pos);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_ALIGNED_DIRECTIO)[m
[31m-[m
[31m-        if (ctx->unaligned) {[m
[31m-            ngx_err_t  err;[m
[31m-[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (ngx_directio_on(src->file->fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, ngx_errno,[m
[31m-                              ngx_directio_on_n " \"%s\" failed",[m
[31m-                              src->file->name.data);[m
[31m-            }[m
[31m-[m
[31m-            ngx_set_errno(err);[m
[31m-[m
[31m-            ctx->unaligned = 0;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return (ngx_int_t) n;[m
[31m-        }[m
[31m-[m
[31m-        if (n != size) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,[m
[31m-                          ngx_read_file_n " read only %z of %O from \"%s\"",[m
[31m-                          n, size, src->file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dst->last += n;[m
[31m-[m
[31m-        if (sendfile) {[m
[31m-            dst->in_file = 1;[m
[31m-            dst->file = src->file;[m
[31m-            dst->file_pos = src->file_pos;[m
[31m-            dst->file_last = src->file_pos + n;[m
[31m-[m
[31m-        } else {[m
[31m-            dst->in_file = 0;[m
[31m-        }[m
[31m-[m
[31m-        src->file_pos += n;[m
[31m-[m
[31m-        if (src->file_pos == src->file_last) {[m
[31m-            dst->flush = src->flush;[m
[31m-            dst->last_buf = src->last_buf;[m
[31m-            dst->last_in_chain = src->last_in_chain;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_chain_writer(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_writer_ctx_t *ctx = data;[m
[31m-[m
[31m-    off_t              size;[m
[31m-    ngx_chain_t       *cl, *ln, *chain;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ctx->connection;[m
[31m-[m
[31m-    for (size = 0; in; in = in->next) {[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_buf_size(in->buf) == 0 && !ngx_buf_special(in->buf)) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,[m
[31m-                          "zero size buf in chain writer "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          in->buf->temporary,[m
[31m-                          in->buf->recycled,[m
[31m-                          in->buf->in_file,[m
[31m-                          in->buf->start,[m
[31m-                          in->buf->pos,[m
[31m-                          in->buf->last,[m
[31m-                          in->buf->file,[m
[31m-                          in->buf->file_pos,[m
[31m-                          in->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        size += ngx_buf_size(in->buf);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                       "chain writer buf fl:%d s:%uO",[m
[31m-                       in->buf->flush, ngx_buf_size(in->buf));[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(ctx->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = in->buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last = cl;[m
[31m-        ctx->last = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "chain writer in: %p", ctx->out);[m
[31m-[m
[31m-    for (cl = ctx->out; cl; cl = cl->next) {[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,[m
[31m-                          "zero size buf in chain writer "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          cl->buf->temporary,[m
[31m-                          cl->buf->recycled,[m
[31m-                          cl->buf->in_file,[m
[31m-                          cl->buf->start,[m
[31m-                          cl->buf->pos,[m
[31m-                          cl->buf->last,[m
[31m-                          cl->buf->file,[m
[31m-                          cl->buf->file_pos,[m
[31m-                          cl->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0 && !c->buffered) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    chain = c->send_chain(c, ctx->out, ctx->limit);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "chain writer out: %p", chain);[m
[31m-[m
[31m-    if (chain == NGX_CHAIN_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = ctx->out; cl && cl != chain; /* void */) {[m
[31m-        ln = cl;[m
[31m-        cl = cl->next;[m
[31m-        ngx_free_chain(ctx->pool, ln);[m
[31m-    }[m
[31m-[m
[31m-    ctx->out = chain;[m
[31m-[m
[31m-    if (ctx->out == NULL) {[m
[31m-        ctx->last = &ctx->out;[m
[31m-[m
[31m-        if (!c->buffered) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.c[m
[1mdeleted file mode 100644[m
[1mindex d62ac45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.c[m
[1m+++ /dev/null[m
[36m@@ -1,433 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_core_probe.h>[m
[31m-[m
[31m-[m
[31m-static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size,[m
[31m-    ngx_uint_t align);[m
[31m-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);[m
[31m-static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);[m
[31m-[m
[31m-[m
[31m-ngx_pool_t *[m
[31m-ngx_create_pool(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m-    p->d.end = (u_char *) p + size;[m
[31m-    p->d.next = NULL;[m
[31m-    p->d.failed = 0;[m
[31m-[m
[31m-    size = size - sizeof(ngx_pool_t);[m
[31m-    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;[m
[31m-[m
[31m-    p->current = p;[m
[31m-    p->chain = NULL;[m
[31m-    p->large = NULL;[m
[31m-    p->cleanup = NULL;[m
[31m-    p->log = log;[m
[31m-[m
[31m-    ngx_core_probe_create_pool_done(p, size);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_destroy_pool(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t          *p, *n;[m
[31m-    ngx_pool_large_t    *l;[m
[31m-    ngx_pool_cleanup_t  *c;[m
[31m-[m
[31m-    for (c = pool->cleanup; c; c = c->next) {[m
[31m-        if (c->handler) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                           "run cleanup: %p", c);[m
[31m-            c->handler(c->data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    /*[m
[31m-     * we could allocate the pool->log from this pool[m
[31m-     * so we cannot use this log while free()ing the pool[m
[31m-     */[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                       "free: %p, unused: %uz", p, p->d.end - p->d.last);[m
[31m-[m
[31m-        if (n == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (l->alloc) {[m
[31m-            ngx_free(l->alloc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-        ngx_free(p);[m
[31m-[m
[31m-        if (n == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_reset_pool(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t        *p;[m
[31m-    ngx_pool_large_t  *l;[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (l->alloc) {[m
[31m-            ngx_free(l->alloc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool; p; p = p->d.next) {[m
[31m-        p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m-        p->d.failed = 0;[m
[31m-    }[m
[31m-[m
[31m-    pool->current = pool;[m
[31m-    pool->chain = NULL;[m
[31m-    pool->large = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_palloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-#if !(NGX_DEBUG_PALLOC)[m
[31m-    if (size <= pool->max) {[m
[31m-        return ngx_palloc_small(pool, size, 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_palloc_large(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pnalloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-#if !(NGX_DEBUG_PALLOC)[m
[31m-    if (size <= pool->max) {[m
[31m-        return ngx_palloc_small(pool, size, 0);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_palloc_large(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void *[m
[31m-ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)[m
[31m-{[m
[31m-    u_char      *m;[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = pool->current;[m
[31m-[m
[31m-    do {[m
[31m-        m = p->d.last;[m
[31m-[m
[31m-        if (align) {[m
[31m-            m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) (p->d.end - m) >= size) {[m
[31m-            p->d.last = m + size;[m
[31m-[m
[31m-            return m;[m
[31m-        }[m
[31m-[m
[31m-        p = p->d.next;[m
[31m-[m
[31m-    } while (p);[m
[31m-[m
[31m-    return ngx_palloc_block(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_palloc_block(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    u_char      *m;[m
[31m-    size_t       psize;[m
[31m-    ngx_pool_t  *p, *new;[m
[31m-[m
[31m-    psize = (size_t) (pool->d.end - (u_char *) pool);[m
[31m-[m
[31m-    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);[m
[31m-    if (m == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    new = (ngx_pool_t *) m;[m
[31m-[m
[31m-    new->d.end = m + psize;[m
[31m-    new->d.next = NULL;[m
[31m-    new->d.failed = 0;[m
[31m-[m
[31m-    m += sizeof(ngx_pool_data_t);[m
[31m-    m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m-    new->d.last = m + size;[m
[31m-[m
[31m-    for (p = pool->current; p->d.next; p = p->d.next) {[m
[31m-        if (p->d.failed++ > 4) {[m
[31m-            pool->current = p->d.next;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p->d.next = new;[m
[31m-[m
[31m-    return m;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_palloc_large(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void              *p;[m
[31m-    ngx_uint_t         n;[m
[31m-    ngx_pool_large_t  *large;[m
[31m-[m
[31m-    p = ngx_alloc(size, pool->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (large = pool->large; large; large = large->next) {[m
[31m-        if (large->alloc == NULL) {[m
[31m-            large->alloc = p;[m
[31m-            return p;[m
[31m-        }[m
[31m-[m
[31m-        if (n++ > 3) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m-    if (large == NULL) {[m
[31m-        ngx_free(p);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large->alloc = p;[m
[31m-    large->next = pool->large;[m
[31m-    pool->large = large;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)[m
[31m-{[m
[31m-    void              *p;[m
[31m-    ngx_pool_large_t  *large;[m
[31m-[m
[31m-    p = ngx_memalign(alignment, size, pool->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m-    if (large == NULL) {[m
[31m-        ngx_free(p);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large->alloc = p;[m
[31m-    large->next = pool->large;[m
[31m-    pool->large = large;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_pfree(ngx_pool_t *pool, void *p)[m
[31m-{[m
[31m-    ngx_pool_large_t  *l;[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (p == l->alloc) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                           "free: %p", l->alloc);[m
[31m-            ngx_free(l->alloc);[m
[31m-            l->alloc = NULL;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pcalloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void *p;[m
[31m-[m
[31m-    p = ngx_palloc(pool, size);[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pool_cleanup_t *[m
[31m-ngx_pool_cleanup_add(ngx_pool_t *p, size_t size)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *c;[m
[31m-[m
[31m-    c = ngx_palloc(p, sizeof(ngx_pool_cleanup_t));[m
[31m-    if (c == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        c->data = ngx_palloc(p, size);[m
[31m-        if (c->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        c->data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    c->handler = NULL;[m
[31m-    c->next = p->cleanup;[m
[31m-[m
[31m-    p->cleanup = c;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, p->log, 0, "add cleanup: %p", c);[m
[31m-[m
[31m-    return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t       *c;[m
[31m-    ngx_pool_cleanup_file_t  *cf;[m
[31m-[m
[31m-    for (c = p->cleanup; c; c = c->next) {[m
[31m-        if (c->handler == ngx_pool_cleanup_file) {[m
[31m-[m
[31m-            cf = c->data;[m
[31m-[m
[31m-            if (cf->fd == fd) {[m
[31m-                c->handler(cf);[m
[31m-                c->handler = NULL;[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_cleanup_file(void *data)[m
[31m-{[m
[31m-    ngx_pool_cleanup_file_t  *c = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d",[m
[31m-                   c->fd);[m
[31m-[m
[31m-    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", c->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_delete_file(void *data)[m
[31m-{[m
[31m-    ngx_pool_cleanup_file_t  *c = data;[m
[31m-[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d %s",[m
[31m-                   c->fd, c->name);[m
[31m-[m
[31m-    if (ngx_delete_file(c->name) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, c->log, err,[m
[31m-                          ngx_delete_file_n " \"%s\" failed", c->name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", c->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-static void *[m
[31m-ngx_get_cached_block(size_t size)[m
[31m-{[m
[31m-    void                     *p;[m
[31m-    ngx_cached_block_slot_t  *slot;[m
[31m-[m
[31m-    if (ngx_cycle->cache == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    slot = &ngx_cycle->cache[(size + ngx_pagesize - 1) / ngx_pagesize];[m
[31m-[m
[31m-    slot->tries++;[m
[31m-[m
[31m-    if (slot->number) {[m
[31m-        p = slot->block;[m
[31m-        slot->block = slot->block->next;[m
[31m-        slot->number--;[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.c.orig[m
[1mdeleted file mode 100644[m
[1mindex d3044ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,430 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size,[m
[31m-    ngx_uint_t align);[m
[31m-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);[m
[31m-static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);[m
[31m-[m
[31m-[m
[31m-ngx_pool_t *[m
[31m-ngx_create_pool(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m-    p->d.end = (u_char *) p + size;[m
[31m-    p->d.next = NULL;[m
[31m-    p->d.failed = 0;[m
[31m-[m
[31m-    size = size - sizeof(ngx_pool_t);[m
[31m-    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;[m
[31m-[m
[31m-    p->current = p;[m
[31m-    p->chain = NULL;[m
[31m-    p->large = NULL;[m
[31m-    p->cleanup = NULL;[m
[31m-    p->log = log;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_destroy_pool(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t          *p, *n;[m
[31m-    ngx_pool_large_t    *l;[m
[31m-    ngx_pool_cleanup_t  *c;[m
[31m-[m
[31m-    for (c = pool->cleanup; c; c = c->next) {[m
[31m-        if (c->handler) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                           "run cleanup: %p", c);[m
[31m-            c->handler(c->data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    /*[m
[31m-     * we could allocate the pool->log from this pool[m
[31m-     * so we cannot use this log while free()ing the pool[m
[31m-     */[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                       "free: %p, unused: %uz", p, p->d.end - p->d.last);[m
[31m-[m
[31m-        if (n == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (l->alloc) {[m
[31m-            ngx_free(l->alloc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-        ngx_free(p);[m
[31m-[m
[31m-        if (n == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_reset_pool(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t        *p;[m
[31m-    ngx_pool_large_t  *l;[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (l->alloc) {[m
[31m-            ngx_free(l->alloc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool; p; p = p->d.next) {[m
[31m-        p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m-        p->d.failed = 0;[m
[31m-    }[m
[31m-[m
[31m-    pool->current = pool;[m
[31m-    pool->chain = NULL;[m
[31m-    pool->large = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_palloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-#if !(NGX_DEBUG_PALLOC)[m
[31m-    if (size <= pool->max) {[m
[31m-        return ngx_palloc_small(pool, size, 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_palloc_large(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pnalloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-#if !(NGX_DEBUG_PALLOC)[m
[31m-    if (size <= pool->max) {[m
[31m-        return ngx_palloc_small(pool, size, 0);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_palloc_large(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void *[m
[31m-ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)[m
[31m-{[m
[31m-    u_char      *m;[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = pool->current;[m
[31m-[m
[31m-    do {[m
[31m-        m = p->d.last;[m
[31m-[m
[31m-        if (align) {[m
[31m-            m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) (p->d.end - m) >= size) {[m
[31m-            p->d.last = m + size;[m
[31m-[m
[31m-            return m;[m
[31m-        }[m
[31m-[m
[31m-        p = p->d.next;[m
[31m-[m
[31m-    } while (p);[m
[31m-[m
[31m-    return ngx_palloc_block(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_palloc_block(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    u_char      *m;[m
[31m-    size_t       psize;[m
[31m-    ngx_pool_t  *p, *new;[m
[31m-[m
[31m-    psize = (size_t) (pool->d.end - (u_char *) pool);[m
[31m-[m
[31m-    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);[m
[31m-    if (m == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    new = (ngx_pool_t *) m;[m
[31m-[m
[31m-    new->d.end = m + psize;[m
[31m-    new->d.next = NULL;[m
[31m-    new->d.failed = 0;[m
[31m-[m
[31m-    m += sizeof(ngx_pool_data_t);[m
[31m-    m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m-    new->d.last = m + size;[m
[31m-[m
[31m-    for (p = pool->current; p->d.next; p = p->d.next) {[m
[31m-        if (p->d.failed++ > 4) {[m
[31m-            pool->current = p->d.next;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p->d.next = new;[m
[31m-[m
[31m-    return m;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_palloc_large(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void              *p;[m
[31m-    ngx_uint_t         n;[m
[31m-    ngx_pool_large_t  *large;[m
[31m-[m
[31m-    p = ngx_alloc(size, pool->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (large = pool->large; large; large = large->next) {[m
[31m-        if (large->alloc == NULL) {[m
[31m-            large->alloc = p;[m
[31m-            return p;[m
[31m-        }[m
[31m-[m
[31m-        if (n++ > 3) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m-    if (large == NULL) {[m
[31m-        ngx_free(p);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large->alloc = p;[m
[31m-    large->next = pool->large;[m
[31m-    pool->large = large;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)[m
[31m-{[m
[31m-    void              *p;[m
[31m-    ngx_pool_large_t  *large;[m
[31m-[m
[31m-    p = ngx_memalign(alignment, size, pool->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m-    if (large == NULL) {[m
[31m-        ngx_free(p);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large->alloc = p;[m
[31m-    large->next = pool->large;[m
[31m-    pool->large = large;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_pfree(ngx_pool_t *pool, void *p)[m
[31m-{[m
[31m-    ngx_pool_large_t  *l;[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (p == l->alloc) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                           "free: %p", l->alloc);[m
[31m-            ngx_free(l->alloc);[m
[31m-            l->alloc = NULL;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pcalloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void *p;[m
[31m-[m
[31m-    p = ngx_palloc(pool, size);[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pool_cleanup_t *[m
[31m-ngx_pool_cleanup_add(ngx_pool_t *p, size_t size)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *c;[m
[31m-[m
[31m-    c = ngx_palloc(p, sizeof(ngx_pool_cleanup_t));[m
[31m-    if (c == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        c->data = ngx_palloc(p, size);[m
[31m-        if (c->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        c->data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    c->handler = NULL;[m
[31m-    c->next = p->cleanup;[m
[31m-[m
[31m-    p->cleanup = c;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, p->log, 0, "add cleanup: %p", c);[m
[31m-[m
[31m-    return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t       *c;[m
[31m-    ngx_pool_cleanup_file_t  *cf;[m
[31m-[m
[31m-    for (c = p->cleanup; c; c = c->next) {[m
[31m-        if (c->handler == ngx_pool_cleanup_file) {[m
[31m-[m
[31m-            cf = c->data;[m
[31m-[m
[31m-            if (cf->fd == fd) {[m
[31m-                c->handler(cf);[m
[31m-                c->handler = NULL;[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_cleanup_file(void *data)[m
[31m-{[m
[31m-    ngx_pool_cleanup_file_t  *c = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d",[m
[31m-                   c->fd);[m
[31m-[m
[31m-    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", c->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_delete_file(void *data)[m
[31m-{[m
[31m-    ngx_pool_cleanup_file_t  *c = data;[m
[31m-[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d %s",[m
[31m-                   c->fd, c->name);[m
[31m-[m
[31m-    if (ngx_delete_file(c->name) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, c->log, err,[m
[31m-                          ngx_delete_file_n " \"%s\" failed", c->name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", c->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-static void *[m
[31m-ngx_get_cached_block(size_t size)[m
[31m-{[m
[31m-    void                     *p;[m
[31m-    ngx_cached_block_slot_t  *slot;[m
[31m-[m
[31m-    if (ngx_cycle->cache == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    slot = &ngx_cycle->cache[(size + ngx_pagesize - 1) / ngx_pagesize];[m
[31m-[m
[31m-    slot->tries++;[m
[31m-[m
[31m-    if (slot->number) {[m
[31m-        p = slot->block;[m
[31m-        slot->block = slot->block->next;[m
[31m-        slot->number--;[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.h[m
[1mdeleted file mode 100644[m
[1mindex d652829..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_palloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,95 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PALLOC_H_INCLUDED_[m
[31m-#define _NGX_PALLOC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_MAX_ALLOC_FROM_POOL should be (ngx_pagesize - 1), i.e. 4095 on x86.[m
[31m- * On Windows NT it decreases a number of locked pages in a kernel.[m
[31m- */[m
[31m-#define NGX_MAX_ALLOC_FROM_POOL  (ngx_pagesize - 1)[m
[31m-[m
[31m-#define NGX_DEFAULT_POOL_SIZE    (16 * 1024)[m
[31m-[m
[31m-#define NGX_POOL_ALIGNMENT       16[m
[31m-#define NGX_MIN_POOL_SIZE                                                     \[m
[31m-    ngx_align((sizeof(ngx_pool_t) + 2 * sizeof(ngx_pool_large_t)),            \[m
[31m-              NGX_POOL_ALIGNMENT)[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_pool_cleanup_pt)(void *data);[m
[31m-[m
[31m-typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;[m
[31m-[m
[31m-struct ngx_pool_cleanup_s {[m
[31m-    ngx_pool_cleanup_pt   handler;[m
[31m-    void                 *data;[m
[31m-    ngx_pool_cleanup_t   *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_pool_large_s  ngx_pool_large_t;[m
[31m-[m
[31m-struct ngx_pool_large_s {[m
[31m-    ngx_pool_large_t     *next;[m
[31m-    void                 *alloc;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char               *last;[m
[31m-    u_char               *end;[m
[31m-    ngx_pool_t           *next;[m
[31m-    ngx_uint_t            failed;[m
[31m-} ngx_pool_data_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_pool_s {[m
[31m-    ngx_pool_data_t       d;[m
[31m-    size_t                max;[m
[31m-    ngx_pool_t           *current;[m
[31m-    ngx_chain_t          *chain;[m
[31m-    ngx_pool_large_t     *large;[m
[31m-    ngx_pool_cleanup_t   *cleanup;[m
[31m-    ngx_log_t            *log;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_fd_t              fd;[m
[31m-    u_char               *name;[m
[31m-    ngx_log_t            *log;[m
[31m-} ngx_pool_cleanup_file_t;[m
[31m-[m
[31m-[m
[31m-void *ngx_alloc(size_t size, ngx_log_t *log);[m
[31m-void *ngx_calloc(size_t size, ngx_log_t *log);[m
[31m-[m
[31m-ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);[m
[31m-void ngx_destroy_pool(ngx_pool_t *pool);[m
[31m-void ngx_reset_pool(ngx_pool_t *pool);[m
[31m-[m
[31m-void *ngx_palloc(ngx_pool_t *pool, size_t size);[m
[31m-void *ngx_pnalloc(ngx_pool_t *pool, size_t size);[m
[31m-void *ngx_pcalloc(ngx_pool_t *pool, size_t size);[m
[31m-void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment);[m
[31m-ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);[m
[31m-[m
[31m-[m
[31m-ngx_pool_cleanup_t *ngx_pool_cleanup_add(ngx_pool_t *p, size_t size);[m
[31m-void ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd);[m
[31m-void ngx_pool_cleanup_file(void *data);[m
[31m-void ngx_pool_delete_file(void *data);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PALLOC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse.c[m
[1mdeleted file mode 100644[m
[1mindex 7b60c5f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse.c[m
[1m+++ /dev/null[m
[36m@@ -1,273 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_parse_size(ngx_str_t *line)[m
[31m-{[m
[31m-    u_char   unit;[m
[31m-    size_t   len;[m
[31m-    ssize_t  size, scale, max;[m
[31m-[m
[31m-    len = line->len;[m
[31m-    unit = line->data[len - 1];[m
[31m-[m
[31m-    switch (unit) {[m
[31m-    case 'K':[m
[31m-    case 'k':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_SIZE_T_VALUE / 1024;[m
[31m-        scale = 1024;[m
[31m-        break;[m
[31m-[m
[31m-    case 'M':[m
[31m-    case 'm':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_SIZE_T_VALUE / (1024 * 1024);[m
[31m-        scale = 1024 * 1024;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        max = NGX_MAX_SIZE_T_VALUE;[m
[31m-        scale = 1;[m
[31m-    }[m
[31m-[m
[31m-    size = ngx_atosz(line->data, len);[m
[31m-    if (size == NGX_ERROR || size > max) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size *= scale;[m
[31m-[m
[31m-    return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-off_t[m
[31m-ngx_parse_offset(ngx_str_t *line)[m
[31m-{[m
[31m-    u_char  unit;[m
[31m-    off_t   offset, scale, max;[m
[31m-    size_t  len;[m
[31m-[m
[31m-    len = line->len;[m
[31m-    unit = line->data[len - 1];[m
[31m-[m
[31m-    switch (unit) {[m
[31m-    case 'K':[m
[31m-    case 'k':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_OFF_T_VALUE / 1024;[m
[31m-        scale = 1024;[m
[31m-        break;[m
[31m-[m
[31m-    case 'M':[m
[31m-    case 'm':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_OFF_T_VALUE / (1024 * 1024);[m
[31m-        scale = 1024 * 1024;[m
[31m-        break;[m
[31m-[m
[31m-    case 'G':[m
[31m-    case 'g':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_OFF_T_VALUE / (1024 * 1024 * 1024);[m
[31m-        scale = 1024 * 1024 * 1024;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        max = NGX_MAX_OFF_T_VALUE;[m
[31m-        scale = 1;[m
[31m-    }[m
[31m-[m
[31m-    offset = ngx_atoof(line->data, len);[m
[31m-    if (offset == NGX_ERROR || offset > max) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    offset *= scale;[m
[31m-[m
[31m-    return offset;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec)[m
[31m-{[m
[31m-    u_char      *p, *last;[m
[31m-    ngx_int_t    value, total, scale;[m
[31m-    ngx_int_t    max, cutoff, cutlim;[m
[31m-    ngx_uint_t   valid;[m
[31m-    enum {[m
[31m-        st_start = 0,[m
[31m-        st_year,[m
[31m-        st_month,[m
[31m-        st_week,[m
[31m-        st_day,[m
[31m-        st_hour,[m
[31m-        st_min,[m
[31m-        st_sec,[m
[31m-        st_msec,[m
[31m-        st_last[m
[31m-    } step;[m
[31m-[m
[31m-    valid = 0;[m
[31m-    value = 0;[m
[31m-    total = 0;[m
[31m-    cutoff = NGX_MAX_INT_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_INT_T_VALUE % 10;[m
[31m-    step = is_sec ? st_start : st_month;[m
[31m-[m
[31m-    p = line->data;[m
[31m-    last = p + line->len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        if (*p >= '0' && *p <= '9') {[m
[31m-            if (value >= cutoff && (value > cutoff || *p - '0' > cutlim)) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            value = value * 10 + (*p++ - '0');[m
[31m-            valid = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (*p++) {[m
[31m-[m
[31m-        case 'y':[m
[31m-            if (step > st_start) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_year;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 365);[m
[31m-            scale = 60 * 60 * 24 * 365;[m
[31m-            break;[m
[31m-[m
[31m-        case 'M':[m
[31m-            if (step >= st_month) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_month;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 30);[m
[31m-            scale = 60 * 60 * 24 * 30;[m
[31m-            break;[m
[31m-[m
[31m-        case 'w':[m
[31m-            if (step >= st_week) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_week;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 7);[m
[31m-            scale = 60 * 60 * 24 * 7;[m
[31m-            break;[m
[31m-[m
[31m-        case 'd':[m
[31m-            if (step >= st_day) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_day;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24);[m
[31m-            scale = 60 * 60 * 24;[m
[31m-            break;[m
[31m-[m
[31m-        case 'h':[m
[31m-            if (step >= st_hour) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_hour;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60);[m
[31m-            scale = 60 * 60;[m
[31m-            break;[m
[31m-[m
[31m-        case 'm':[m
[31m-            if (p < last && *p == 's') {[m
[31m-                if (is_sec || step >= st_msec) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                p++;[m
[31m-                step = st_msec;[m
[31m-                max = NGX_MAX_INT_T_VALUE;[m
[31m-                scale = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (step >= st_min) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_min;[m
[31m-            max = NGX_MAX_INT_T_VALUE / 60;[m
[31m-            scale = 60;[m
[31m-            break;[m
[31m-[m
[31m-        case 's':[m
[31m-            if (step >= st_sec) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_sec;[m
[31m-            max = NGX_MAX_INT_T_VALUE;[m
[31m-            scale = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case ' ':[m
[31m-            if (step >= st_sec) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_last;[m
[31m-            max = NGX_MAX_INT_T_VALUE;[m
[31m-            scale = 1;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (step != st_msec && !is_sec) {[m
[31m-            scale *= 1000;[m
[31m-            max /= 1000;[m
[31m-        }[m
[31m-[m
[31m-        if (value > max) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value *= scale;[m
[31m-[m
[31m-        if (total > NGX_MAX_INT_T_VALUE - value) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        total += value;[m
[31m-[m
[31m-        value = 0;[m
[31m-[m
[31m-        while (p < last && *p == ' ') {[m
[31m-            p++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!valid) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!is_sec) {[m
[31m-        if (value > NGX_MAX_INT_T_VALUE / 1000) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value *= 1000;[m
[31m-    }[m
[31m-[m
[31m-    if (total > NGX_MAX_INT_T_VALUE - value) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return total + value;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse.h[m
[1mdeleted file mode 100644[m
[1mindex ec093b5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PARSE_H_INCLUDED_[m
[31m-#define _NGX_PARSE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_parse_size(ngx_str_t *line);[m
[31m-off_t ngx_parse_offset(ngx_str_t *line);[m
[31m-ngx_int_t ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PARSE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse_time.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse_time.c[m
[1mdeleted file mode 100644[m
[1mindex 13afde3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse_time.c[m
[1m+++ /dev/null[m
[36m@@ -1,276 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t  mday[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };[m
[31m-[m
[31m-time_t[m
[31m-ngx_parse_http_time(u_char *value, size_t len)[m
[31m-{[m
[31m-    u_char      *p, *end;[m
[31m-    ngx_int_t    month;[m
[31m-    ngx_uint_t   day, year, hour, min, sec;[m
[31m-    uint64_t     time;[m
[31m-    enum {[m
[31m-        no = 0,[m
[31m-        rfc822,   /* Tue, 10 Nov 2002 23:50:13   */[m
[31m-        rfc850,   /* Tuesday, 10-Dec-02 23:50:13 */[m
[31m-        isoc      /* Tue Dec 10 23:50:13 2002    */[m
[31m-    } fmt;[m
[31m-[m
[31m-    fmt = 0;[m
[31m-    end = value + len;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    day = 32;[m
[31m-    year = 2038;[m
[31m-#endif[m
[31m-[m
[31m-    for (p = value; p < end; p++) {[m
[31m-        if (*p == ',') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == ' ') {[m
[31m-            fmt = isoc;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p++; p < end; p++)[m
[31m-        if (*p != ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    if (end - p < 18) {[m
[31m-        return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    if (fmt != isoc) {[m
[31m-        if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        day = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-        p += 2;[m
[31m-[m
[31m-        if (*p == ' ') {[m
[31m-            if (end - p < 18) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            fmt = rfc822;[m
[31m-[m
[31m-        } else if (*p == '-') {[m
[31m-            fmt = rfc850;[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    switch (*p) {[m
[31m-[m
[31m-    case 'J':[m
[31m-        month = *(p + 1) == 'a' ? 0 : *(p + 2) == 'n' ? 5 : 6;[m
[31m-        break;[m
[31m-[m
[31m-    case 'F':[m
[31m-        month = 1;[m
[31m-        break;[m
[31m-[m
[31m-    case 'M':[m
[31m-        month = *(p + 2) == 'r' ? 2 : 4;[m
[31m-        break;[m
[31m-[m
[31m-    case 'A':[m
[31m-        month = *(p + 1) == 'p' ? 3 : 7;[m
[31m-        break;[m
[31m-[m
[31m-    case 'S':[m
[31m-        month = 8;[m
[31m-        break;[m
[31m-[m
[31m-    case 'O':[m
[31m-        month = 9;[m
[31m-        break;[m
[31m-[m
[31m-    case 'N':[m
[31m-        month = 10;[m
[31m-        break;[m
[31m-[m
[31m-    case 'D':[m
[31m-        month = 11;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p += 3;[m
[31m-[m
[31m-    if ((fmt == rfc822 && *p != ' ') || (fmt == rfc850 && *p != '-')) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p++;[m
[31m-[m
[31m-    if (fmt == rfc822) {[m
[31m-        if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9'[m
[31m-            || *(p + 2) < '0' || *(p + 2) > '9'[m
[31m-            || *(p + 3) < '0' || *(p + 3) > '9')[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100[m
[31m-               + (*(p + 2) - '0') * 10 + *(p + 3) - '0';[m
[31m-        p += 4;[m
[31m-[m
[31m-    } else if (fmt == rfc850) {[m
[31m-        if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        year = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-        year += (year < 70) ? 2000 : 1900;[m
[31m-        p += 2;[m
[31m-    }[m
[31m-[m
[31m-    if (fmt == isoc) {[m
[31m-        if (*p == ' ') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        day = *p++ - '0';[m
[31m-[m
[31m-        if (*p != ' ') {[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            day = day * 10 + *p++ - '0';[m
[31m-        }[m
[31m-[m
[31m-        if (end - p < 14) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (*p++ != ' ') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hour = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-    p += 2;[m
[31m-[m
[31m-    if (*p++ != ':') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    min = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-    p += 2;[m
[31m-[m
[31m-    if (*p++ != ':') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sec = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-[m
[31m-    if (fmt == isoc) {[m
[31m-        p += 2;[m
[31m-[m
[31m-        if (*p++ != ' ') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9'[m
[31m-            || *(p + 2) < '0' || *(p + 2) > '9'[m
[31m-            || *(p + 3) < '0' || *(p + 3) > '9')[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100[m
[31m-               + (*(p + 2) - '0') * 10 + *(p + 3) - '0';[m
[31m-    }[m
[31m-[m
[31m-    if (hour > 23 || min > 59 || sec > 59) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (day == 29 && month == 1) {[m
[31m-        if ((year & 3) || ((year % 100 == 0) && (year % 400) != 0)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else if (day > mday[month]) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * shift new year to March 1 and start months from 1 (not 0),[m
[31m-     * it is needed for Gauss' formula[m
[31m-     */[m
[31m-[m
[31m-    if (--month <= 0) {[m
[31m-        month += 12;[m
[31m-        year -= 1;[m
[31m-    }[m
[31m-[m
[31m-    /* Gauss' formula for Gregorian days since March 1, 1 BC */[m
[31m-[m
[31m-    time = (uint64_t) ([m
[31m-            /* days in years including leap years since March 1, 1 BC */[m
[31m-[m
[31m-            365 * year + year / 4 - year / 100 + year / 400[m
[31m-[m
[31m-            /* days before the month */[m
[31m-[m
[31m-            + 367 * month / 12 - 30[m
[31m-[m
[31m-            /* days before the day */[m
[31m-[m
[31m-            + day - 1[m
[31m-[m
[31m-            /*[m
[31m-             * 719527 days were between March 1, 1 BC and March 1, 1970,[m
[31m-             * 31 and 28 days were in January and February 1970[m
[31m-             */[m
[31m-[m
[31m-            - 719527 + 31 + 28) * 86400 + hour * 3600 + min * 60 + sec;[m
[31m-[m
[31m-#if (NGX_TIME_T_SIZE <= 4)[m
[31m-[m
[31m-    if (time > 0x7fffffff) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return (time_t) time;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse_time.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse_time.h[m
[1mdeleted file mode 100644[m
[1mindex aa542eb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_parse_time.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PARSE_TIME_H_INCLUDED_[m
[31m-#define _NGX_PARSE_TIME_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-time_t ngx_parse_http_time(u_char *value, size_t len);[m
[31m-[m
[31m-/* compatibility */[m
[31m-#define ngx_http_parse_time(value, len)  ngx_parse_http_time(value, len)[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PARSE_TIME_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_proxy_protocol.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_proxy_protocol.c[m
[1mdeleted file mode 100644[m
[1mindex f347e7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_proxy_protocol.c[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last)[m
[31m-{[m
[31m-    size_t  len;[m
[31m-    u_char  ch, *p, *addr;[m
[31m-[m
[31m-    p = buf;[m
[31m-    len = last - buf;[m
[31m-[m
[31m-    if (len < 8 || ngx_strncmp(p, "PROXY ", 6) != 0) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    p += 6;[m
[31m-    len -= 6;[m
[31m-[m
[31m-    if (len >= 7 && ngx_strncmp(p, "UNKNOWN", 7) == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                       "PROXY protocol unknown protocol");[m
[31m-        p += 7;[m
[31m-        goto skip;[m
[31m-    }[m
[31m-[m
[31m-    if (len < 5 || ngx_strncmp(p, "TCP", 3) != 0[m
[31m-        || (p[3] != '4' && p[3] != '6') || p[4] != ' ')[m
[31m-    {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    p += 5;[m
[31m-    addr = p;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (p == last) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        ch = *p++;[m
[31m-[m
[31m-        if (ch == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ch != ':' && ch != '.'[m
[31m-            && (ch < 'a' || ch > 'f')[m
[31m-            && (ch < 'A' || ch > 'F')[m
[31m-            && (ch < '0' || ch > '9'))[m
[31m-        {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = p - addr - 1;[m
[31m-    c->proxy_protocol_addr.data = ngx_pnalloc(c->pool, len);[m
[31m-[m
[31m-    if (c->proxy_protocol_addr.data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(c->proxy_protocol_addr.data, addr, len);[m
[31m-    c->proxy_protocol_addr.len = len;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "PROXY protocol address: \"%V\"", &c->proxy_protocol_addr);[m
[31m-[m
[31m-skip:[m
[31m-[m
[31m-    for ( /* void */ ; p < last - 1; p++) {[m
[31m-        if (p[0] == CR && p[1] == LF) {[m
[31m-            return p + 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                  "broken header: \"%*s\"", (size_t) (last - buf), buf);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf, u_char *last)[m
[31m-{[m
[31m-    ngx_uint_t  port, lport;[m
[31m-[m
[31m-    if (last - buf < NGX_PROXY_PROTOCOL_MAX_HEADER) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    switch (c->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        buf = ngx_cpymem(buf, "PROXY TCP4 ", sizeof("PROXY TCP4 ") - 1);[m
[31m-[m
[31m-        port = ntohs(((struct sockaddr_in *) c->sockaddr)->sin_port);[m
[31m-        lport = ntohs(((struct sockaddr_in *) c->local_sockaddr)->sin_port);[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        buf = ngx_cpymem(buf, "PROXY TCP6 ", sizeof("PROXY TCP6 ") - 1);[m
[31m-[m
[31m-        port = ntohs(((struct sockaddr_in6 *) c->sockaddr)->sin6_port);[m
[31m-        lport = ntohs(((struct sockaddr_in6 *) c->local_sockaddr)->sin6_port);[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        return ngx_cpymem(buf, "PROXY UNKNOWN" CRLF,[m
[31m-                          sizeof("PROXY UNKNOWN" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    buf += ngx_sock_ntop(c->sockaddr, c->socklen, buf, last - buf, 0);[m
[31m-[m
[31m-    *buf++ = ' ';[m
[31m-[m
[31m-    buf += ngx_sock_ntop(c->local_sockaddr, c->local_socklen, buf, last - buf,[m
[31m-                         0);[m
[31m-[m
[31m-    return ngx_slprintf(buf, last, " %ui %ui" CRLF, port, lport);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_proxy_protocol.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_proxy_protocol.h[m
[1mdeleted file mode 100644[m
[1mindex fb848f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_proxy_protocol.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROXY_PROTOCOL_H_INCLUDED_[m
[31m-#define _NGX_PROXY_PROTOCOL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_PROXY_PROTOCOL_MAX_HEADER  107[m
[31m-[m
[31m-[m
[31m-u_char *ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf,[m
[31m-    u_char *last);[m
[31m-u_char *ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf,[m
[31m-    u_char *last);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROXY_PROTOCOL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_queue.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_queue.c[m
[1mdeleted file mode 100644[m
[1mindex 3cacaf3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_queue.c[m
[1m+++ /dev/null[m
[36m@@ -1,80 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * find the middle queue element if the queue has odd number of elements[m
[31m- * or the first element of the queue's second part otherwise[m
[31m- */[m
[31m-[m
[31m-ngx_queue_t *[m
[31m-ngx_queue_middle(ngx_queue_t *queue)[m
[31m-{[m
[31m-    ngx_queue_t  *middle, *next;[m
[31m-[m
[31m-    middle = ngx_queue_head(queue);[m
[31m-[m
[31m-    if (middle == ngx_queue_last(queue)) {[m
[31m-        return middle;[m
[31m-    }[m
[31m-[m
[31m-    next = ngx_queue_head(queue);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        middle = ngx_queue_next(middle);[m
[31m-[m
[31m-        next = ngx_queue_next(next);[m
[31m-[m
[31m-        if (next == ngx_queue_last(queue)) {[m
[31m-            return middle;[m
[31m-        }[m
[31m-[m
[31m-        next = ngx_queue_next(next);[m
[31m-[m
[31m-        if (next == ngx_queue_last(queue)) {[m
[31m-            return middle;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* the stable insertion sort */[m
[31m-[m
[31m-void[m
[31m-ngx_queue_sort(ngx_queue_t *queue,[m
[31m-    ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *))[m
[31m-{[m
[31m-    ngx_queue_t  *q, *prev, *next;[m
[31m-[m
[31m-    q = ngx_queue_head(queue);[m
[31m-[m
[31m-    if (q == ngx_queue_last(queue)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for (q = ngx_queue_next(q); q != ngx_queue_sentinel(queue); q = next) {[m
[31m-[m
[31m-        prev = ngx_queue_prev(q);[m
[31m-        next = ngx_queue_next(q);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        do {[m
[31m-            if (cmp(prev, q) <= 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            prev = ngx_queue_prev(prev);[m
[31m-[m
[31m-        } while (prev != ngx_queue_sentinel(queue));[m
[31m-[m
[31m-        ngx_queue_insert_after(prev, q);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_queue.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_queue.h[m
[1mdeleted file mode 100644[m
[1mindex 038bf12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_queue.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_QUEUE_H_INCLUDED_[m
[31m-#define _NGX_QUEUE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_queue_s  ngx_queue_t;[m
[31m-[m
[31m-struct ngx_queue_s {[m
[31m-    ngx_queue_t  *prev;[m
[31m-    ngx_queue_t  *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_init(q)                                                     \[m
[31m-    (q)->prev = q;                                                            \[m
[31m-    (q)->next = q[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_empty(h)                                                    \[m
[31m-    (h == (h)->prev)[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_insert_head(h, x)                                           \[m
[31m-    (x)->next = (h)->next;                                                    \[m
[31m-    (x)->next->prev = x;                                                      \[m
[31m-    (x)->prev = h;                                                            \[m
[31m-    (h)->next = x[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_insert_after   ngx_queue_insert_head[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_insert_tail(h, x)                                           \[m
[31m-    (x)->prev = (h)->prev;                                                    \[m
[31m-    (x)->prev->next = x;                                                      \[m
[31m-    (x)->next = h;                                                            \[m
[31m-    (h)->prev = x[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_head(h)                                                     \[m
[31m-    (h)->next[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_last(h)                                                     \[m
[31m-    (h)->prev[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_sentinel(h)                                                 \[m
[31m-    (h)[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_next(q)                                                     \[m
[31m-    (q)->next[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_prev(q)                                                     \[m
[31m-    (q)->prev[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-#define ngx_queue_remove(x)                                                   \[m
[31m-    (x)->next->prev = (x)->prev;                                              \[m
[31m-    (x)->prev->next = (x)->next;                                              \[m
[31m-    (x)->prev = NULL;                                                         \[m
[31m-    (x)->next = NULL[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_queue_remove(x)                                                   \[m
[31m-    (x)->next->prev = (x)->prev;                                              \[m
[31m-    (x)->prev->next = (x)->next[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_split(h, q, n)                                              \[m
[31m-    (n)->prev = (h)->prev;                                                    \[m
[31m-    (n)->prev->next = n;                                                      \[m
[31m-    (n)->next = q;                                                            \[m
[31m-    (h)->prev = (q)->prev;                                                    \[m
[31m-    (h)->prev->next = h;                                                      \[m
[31m-    (q)->prev = n;[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_add(h, n)                                                   \[m
[31m-    (h)->prev->next = (n)->next;                                              \[m
[31m-    (n)->next->prev = (h)->prev;                                              \[m
[31m-    (h)->prev = (n)->prev;                                                    \[m
[31m-    (h)->prev->next = h;[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_data(q, type, link)                                         \[m
[31m-    (type *) ((u_char *) q - offsetof(type, link))[m
[31m-[m
[31m-[m
[31m-ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue);[m
[31m-void ngx_queue_sort(ngx_queue_t *queue,[m
[31m-    ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *));[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_QUEUE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_radix_tree.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_radix_tree.c[m
[1mdeleted file mode 100644[m
[1mindex c1d8737..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_radix_tree.c[m
[1m+++ /dev/null[m
[36m@@ -1,488 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_radix_node_t *ngx_radix_alloc(ngx_radix_tree_t *tree);[m
[31m-[m
[31m-[m
[31m-ngx_radix_tree_t *[m
[31m-ngx_radix_tree_create(ngx_pool_t *pool, ngx_int_t preallocate)[m
[31m-{[m
[31m-    uint32_t           key, mask, inc;[m
[31m-    ngx_radix_tree_t  *tree;[m
[31m-[m
[31m-    tree = ngx_palloc(pool, sizeof(ngx_radix_tree_t));[m
[31m-    if (tree == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    tree->pool = pool;[m
[31m-    tree->free = NULL;[m
[31m-    tree->start = NULL;[m
[31m-    tree->size = 0;[m
[31m-[m
[31m-    tree->root = ngx_radix_alloc(tree);[m
[31m-    if (tree->root == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    tree->root->right = NULL;[m
[31m-    tree->root->left = NULL;[m
[31m-    tree->root->parent = NULL;[m
[31m-    tree->root->value = NGX_RADIX_NO_VALUE;[m
[31m-[m
[31m-    if (preallocate == 0) {[m
[31m-        return tree;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Preallocation of first nodes : 0, 1, 00, 01, 10, 11, 000, 001, etc.[m
[31m-     * increases TLB hits even if for first lookup iterations.[m
[31m-     * On 32-bit platforms the 7 preallocated bits takes continuous 4K,[m
[31m-     * 8 - 8K, 9 - 16K, etc.  On 64-bit platforms the 6 preallocated bits[m
[31m-     * takes continuous 4K, 7 - 8K, 8 - 16K, etc.  There is no sense to[m
[31m-     * to preallocate more than one page, because further preallocation[m
[31m-     * distributes the only bit per page.  Instead, a random insertion[m
[31m-     * may distribute several bits per page.[m
[31m-     *[m
[31m-     * Thus, by default we preallocate maximum[m
[31m-     *     6 bits on amd64 (64-bit platform and 4K pages)[m
[31m-     *     7 bits on i386 (32-bit platform and 4K pages)[m
[31m-     *     7 bits on sparc64 in 64-bit mode (8K pages)[m
[31m-     *     8 bits on sparc64 in 32-bit mode (8K pages)[m
[31m-     */[m
[31m-[m
[31m-    if (preallocate == -1) {[m
[31m-        switch (ngx_pagesize / sizeof(ngx_radix_node_t)) {[m
[31m-[m
[31m-        /* amd64 */[m
[31m-        case 128:[m
[31m-            preallocate = 6;[m
[31m-            break;[m
[31m-[m
[31m-        /* i386, sparc64 */[m
[31m-        case 256:[m
[31m-            preallocate = 7;[m
[31m-            break;[m
[31m-[m
[31m-        /* sparc64 in 32-bit mode */[m
[31m-        default:[m
[31m-            preallocate = 8;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    mask = 0;[m
[31m-    inc = 0x80000000;[m
[31m-[m
[31m-    while (preallocate--) {[m
[31m-[m
[31m-        key = 0;[m
[31m-        mask >>= 1;[m
[31m-        mask |= 0x80000000;[m
[31m-[m
[31m-        do {[m
[31m-            if (ngx_radix32tree_insert(tree, key, mask, NGX_RADIX_NO_VALUE)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            key += inc;[m
[31m-[m
[31m-        } while (key);[m
[31m-[m
[31m-        inc >>= 1;[m
[31m-    }[m
[31m-[m
[31m-    return tree;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_radix32tree_insert(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask,[m
[31m-    uintptr_t value)[m
[31m-{[m
[31m-    uint32_t           bit;[m
[31m-    ngx_radix_node_t  *node, *next;[m
[31m-[m
[31m-    bit = 0x80000000;[m
[31m-[m
[31m-    node = tree->root;[m
[31m-    next = tree->root;[m
[31m-[m
[31m-    while (bit & mask) {[m
[31m-        if (key & bit) {[m
[31m-            next = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            next = node->left;[m
[31m-        }[m
[31m-[m
[31m-        if (next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-        node = next;[m
[31m-    }[m
[31m-[m
[31m-    if (next) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-[m
[31m-        node->value = value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    while (bit & mask) {[m
[31m-        next = ngx_radix_alloc(tree);[m
[31m-        if (next == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        next->right = NULL;[m
[31m-        next->left = NULL;[m
[31m-        next->parent = node;[m
[31m-        next->value = NGX_RADIX_NO_VALUE;[m
[31m-[m
[31m-        if (key & bit) {[m
[31m-            node->right = next;[m
[31m-[m
[31m-        } else {[m
[31m-            node->left = next;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-        node = next;[m
[31m-    }[m
[31m-[m
[31m-    node->value = value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_radix32tree_delete(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask)[m
[31m-{[m
[31m-    uint32_t           bit;[m
[31m-    ngx_radix_node_t  *node;[m
[31m-[m
[31m-    bit = 0x80000000;[m
[31m-    node = tree->root;[m
[31m-[m
[31m-    while (node && (bit & mask)) {[m
[31m-        if (key & bit) {[m
[31m-            node = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            node = node->left;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-    }[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (node->right || node->left) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            node->value = NGX_RADIX_NO_VALUE;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (node->parent->right == node) {[m
[31m-            node->parent->right = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            node->parent->left = NULL;[m
[31m-        }[m
[31m-[m
[31m-        node->right = tree->free;[m
[31m-        tree->free = node;[m
[31m-[m
[31m-        node = node->parent;[m
[31m-[m
[31m-        if (node->right || node->left) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (node->parent == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key)[m
[31m-{[m
[31m-    uint32_t           bit;[m
[31m-    uintptr_t          value;[m
[31m-    ngx_radix_node_t  *node;[m
[31m-[m
[31m-    bit = 0x80000000;[m
[31m-    value = NGX_RADIX_NO_VALUE;[m
[31m-    node = tree->root;[m
[31m-[m
[31m-    while (node) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            value = node->value;[m
[31m-        }[m
[31m-[m
[31m-        if (key & bit) {[m
[31m-            node = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            node = node->left;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_radix128tree_insert(ngx_radix_tree_t *tree, u_char *key, u_char *mask,[m
[31m-    uintptr_t value)[m
[31m-{[m
[31m-    u_char             bit;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_radix_node_t  *node, *next;[m
[31m-[m
[31m-    i = 0;[m
[31m-    bit = 0x80;[m
[31m-[m
[31m-    node = tree->root;[m
[31m-    next = tree->root;[m
[31m-[m
[31m-    while (bit & mask[i]) {[m
[31m-        if (key[i] & bit) {[m
[31m-            next = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            next = node->left;[m
[31m-        }[m
[31m-[m
[31m-        if (next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-        node = next;[m
[31m-[m
[31m-        if (bit == 0) {[m
[31m-            if (++i == 16) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            bit = 0x80;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (next) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-[m
[31m-        node->value = value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    while (bit & mask[i]) {[m
[31m-        next = ngx_radix_alloc(tree);[m
[31m-        if (next == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        next->right = NULL;[m
[31m-        next->left = NULL;[m
[31m-        next->parent = node;[m
[31m-        next->value = NGX_RADIX_NO_VALUE;[m
[31m-[m
[31m-        if (key[i] & bit) {[m
[31m-            node->right = next;[m
[31m-[m
[31m-        } else {[m
[31m-            node->left = next;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-        node = next;[m
[31m-[m
[31m-        if (bit == 0) {[m
[31m-            if (++i == 16) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            bit = 0x80;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    node->value = value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_radix128tree_delete(ngx_radix_tree_t *tree, u_char *key, u_char *mask)[m
[31m-{[m
[31m-    u_char             bit;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_radix_node_t  *node;[m
[31m-[m
[31m-    i = 0;[m
[31m-    bit = 0x80;[m
[31m-    node = tree->root;[m
[31m-[m
[31m-    while (node && (bit & mask[i])) {[m
[31m-        if (key[i] & bit) {[m
[31m-            node = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            node = node->left;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-[m
[31m-        if (bit == 0) {[m
[31m-            if (++i == 16) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            bit = 0x80;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (node->right || node->left) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            node->value = NGX_RADIX_NO_VALUE;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (node->parent->right == node) {[m
[31m-            node->parent->right = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            node->parent->left = NULL;[m
[31m-        }[m
[31m-[m
[31m-        node->right = tree->free;[m
[31m-        tree->free = node;[m
[31m-[m
[31m-        node = node->parent;[m
[31m-[m
[31m-        if (node->right || node->left) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (node->parent == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_radix128tree_find(ngx_radix_tree_t *tree, u_char *key)[m
[31m-{[m
[31m-    u_char             bit;[m
[31m-    uintptr_t          value;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_radix_node_t  *node;[m
[31m-[m
[31m-    i = 0;[m
[31m-    bit = 0x80;[m
[31m-    value = NGX_RADIX_NO_VALUE;[m
[31m-    node = tree->root;[m
[31m-[m
[31m-    while (node) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            value = node->value;[m
[31m-        }[m
[31m-[m
[31m-        if (key[i] & bit) {[m
[31m-            node = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            node = node->left;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-[m
[31m-        if (bit == 0) {[m
[31m-            i++;[m
[31m-            bit = 0x80;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_radix_node_t *[m
[31m-ngx_radix_alloc(ngx_radix_tree_t *tree)[m
[31m-{[m
[31m-    ngx_radix_node_t  *p;[m
[31m-[m
[31m-    if (tree->free) {[m
[31m-        p = tree->free;[m
[31m-        tree->free = tree->free->right;[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    if (tree->size < sizeof(ngx_radix_node_t)) {[m
[31m-        tree->start = ngx_pmemalign(tree->pool, ngx_pagesize, ngx_pagesize);[m
[31m-        if (tree->start == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        tree->size = ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    p = (ngx_radix_node_t *) tree->start;[m
[31m-    tree->start += sizeof(ngx_radix_node_t);[m
[31m-    tree->size -= sizeof(ngx_radix_node_t);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_radix_tree.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_radix_tree.h[m
[1mdeleted file mode 100644[m
[1mindex 4fe06e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_radix_tree.h[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_RADIX_TREE_H_INCLUDED_[m
[31m-#define _NGX_RADIX_TREE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_RADIX_NO_VALUE   (uintptr_t) -1[m
[31m-[m
[31m-typedef struct ngx_radix_node_s  ngx_radix_node_t;[m
[31m-[m
[31m-struct ngx_radix_node_s {[m
[31m-    ngx_radix_node_t  *right;[m
[31m-    ngx_radix_node_t  *left;[m
[31m-    ngx_radix_node_t  *parent;[m
[31m-    uintptr_t          value;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_radix_node_t  *root;[m
[31m-    ngx_pool_t        *pool;[m
[31m-    ngx_radix_node_t  *free;[m
[31m-    char              *start;[m
[31m-    size_t             size;[m
[31m-} ngx_radix_tree_t;[m
[31m-[m
[31m-[m
[31m-ngx_radix_tree_t *ngx_radix_tree_create(ngx_pool_t *pool,[m
[31m-    ngx_int_t preallocate);[m
[31m-[m
[31m-ngx_int_t ngx_radix32tree_insert(ngx_radix_tree_t *tree,[m
[31m-    uint32_t key, uint32_t mask, uintptr_t value);[m
[31m-ngx_int_t ngx_radix32tree_delete(ngx_radix_tree_t *tree,[m
[31m-    uint32_t key, uint32_t mask);[m
[31m-uintptr_t ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-ngx_int_t ngx_radix128tree_insert(ngx_radix_tree_t *tree,[m
[31m-    u_char *key, u_char *mask, uintptr_t value);[m
[31m-ngx_int_t ngx_radix128tree_delete(ngx_radix_tree_t *tree,[m
[31m-    u_char *key, u_char *mask);[m
[31m-uintptr_t ngx_radix128tree_find(ngx_radix_tree_t *tree, u_char *key);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_RADIX_TREE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rbtree.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rbtree.c[m
[1mdeleted file mode 100644[m
[1mindex 6c66f40..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rbtree.c[m
[1m+++ /dev/null[m
[36m@@ -1,380 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The red-black tree code is based on the algorithm described in[m
[31m- * the "Introduction to Algorithms" by Cormen, Leiserson and Rivest.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_node_t **root,[m
[31m-    ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node);[m
[31m-static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_node_t **root,[m
[31m-    ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rbtree_insert(ngx_rbtree_t *tree, ngx_rbtree_node_t *node)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **root, *temp, *sentinel;[m
[31m-[m
[31m-    /* a binary tree insert */[m
[31m-[m
[31m-    root = (ngx_rbtree_node_t **) &tree->root;[m
[31m-    sentinel = tree->sentinel;[m
[31m-[m
[31m-    if (*root == sentinel) {[m
[31m-        node->parent = NULL;[m
[31m-        node->left = sentinel;[m
[31m-        node->right = sentinel;[m
[31m-        ngx_rbt_black(node);[m
[31m-        *root = node;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    tree->insert(*root, node, sentinel);[m
[31m-[m
[31m-    /* re-balance tree */[m
[31m-[m
[31m-    while (node != *root && ngx_rbt_is_red(node->parent)) {[m
[31m-[m
[31m-        if (node->parent == node->parent->parent->left) {[m
[31m-            temp = node->parent->parent->right;[m
[31m-[m
[31m-            if (ngx_rbt_is_red(temp)) {[m
[31m-                ngx_rbt_black(node->parent);[m
[31m-                ngx_rbt_black(temp);[m
[31m-                ngx_rbt_red(node->parent->parent);[m
[31m-                node = node->parent->parent;[m
[31m-[m
[31m-            } else {[m
[31m-                if (node == node->parent->right) {[m
[31m-                    node = node->parent;[m
[31m-                    ngx_rbtree_left_rotate(root, sentinel, node);[m
[31m-                }[m
[31m-[m
[31m-                ngx_rbt_black(node->parent);[m
[31m-                ngx_rbt_red(node->parent->parent);[m
[31m-                ngx_rbtree_right_rotate(root, sentinel, node->parent->parent);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            temp = node->parent->parent->left;[m
[31m-[m
[31m-            if (ngx_rbt_is_red(temp)) {[m
[31m-                ngx_rbt_black(node->parent);[m
[31m-                ngx_rbt_black(temp);[m
[31m-                ngx_rbt_red(node->parent->parent);[m
[31m-                node = node->parent->parent;[m
[31m-[m
[31m-            } else {[m
[31m-                if (node == node->parent->left) {[m
[31m-                    node = node->parent;[m
[31m-                    ngx_rbtree_right_rotate(root, sentinel, node);[m
[31m-                }[m
[31m-[m
[31m-                ngx_rbt_black(node->parent);[m
[31m-                ngx_rbt_red(node->parent->parent);[m
[31m-                ngx_rbtree_left_rotate(root, sentinel, node->parent->parent);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbt_black(*root);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,[m
[31m-    ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        p = (node->key < temp->key) ? &temp->left : &temp->right;[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,[m
[31m-    ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /*[m
[31m-         * Timer values[m
[31m-         * 1) are spread in small range, usually several minutes,[m
[31m-         * 2) and overflow each 49 days, if milliseconds are stored in 32 bits.[m
[31m-         * The comparison takes into account that overflow.[m
[31m-         */[m
[31m-[m
[31m-        /*  node->key < temp->key */[m
[31m-[m
[31m-        p = ((ngx_rbtree_key_int_t) (node->key - temp->key) < 0)[m
[31m-            ? &temp->left : &temp->right;[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rbtree_delete(ngx_rbtree_t *tree, ngx_rbtree_node_t *node)[m
[31m-{[m
[31m-    ngx_uint_t           red;[m
[31m-    ngx_rbtree_node_t  **root, *sentinel, *subst, *temp, *w;[m
[31m-[m
[31m-    /* a binary tree delete */[m
[31m-[m
[31m-    root = (ngx_rbtree_node_t **) &tree->root;[m
[31m-    sentinel = tree->sentinel;[m
[31m-[m
[31m-    if (node->left == sentinel) {[m
[31m-        temp = node->right;[m
[31m-        subst = node;[m
[31m-[m
[31m-    } else if (node->right == sentinel) {[m
[31m-        temp = node->left;[m
[31m-        subst = node;[m
[31m-[m
[31m-    } else {[m
[31m-        subst = ngx_rbtree_min(node->right, sentinel);[m
[31m-[m
[31m-        if (subst->left != sentinel) {[m
[31m-            temp = subst->left;[m
[31m-        } else {[m
[31m-            temp = subst->right;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (subst == *root) {[m
[31m-        *root = temp;[m
[31m-        ngx_rbt_black(temp);[m
[31m-[m
[31m-        /* DEBUG stuff */[m
[31m-        node->left = NULL;[m
[31m-        node->right = NULL;[m
[31m-        node->parent = NULL;[m
[31m-        node->key = 0;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    red = ngx_rbt_is_red(subst);[m
[31m-[m
[31m-    if (subst == subst->parent->left) {[m
[31m-        subst->parent->left = temp;[m
[31m-[m
[31m-    } else {[m
[31m-        subst->parent->right = temp;[m
[31m-    }[m
[31m-[m
[31m-    if (subst == node) {[m
[31m-[m
[31m-        temp->parent = subst->parent;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (subst->parent == node) {[m
[31m-            temp->parent = subst;[m
[31m-[m
[31m-        } else {[m
[31m-            temp->parent = subst->parent;[m
[31m-        }[m
[31m-[m
[31m-        subst->left = node->left;[m
[31m-        subst->right = node->right;[m
[31m-        subst->parent = node->parent;[m
[31m-        ngx_rbt_copy_color(subst, node);[m
[31m-[m
[31m-        if (node == *root) {[m
[31m-            *root = subst;[m
[31m-[m
[31m-        } else {[m
[31m-            if (node == node->parent->left) {[m
[31m-                node->parent->left = subst;[m
[31m-            } else {[m
[31m-                node->parent->right = subst;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (subst->left != sentinel) {[m
[31m-            subst->left->parent = subst;[m
[31m-        }[m
[31m-[m
[31m-        if (subst->right != sentinel) {[m
[31m-            subst->right->parent = subst;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* DEBUG stuff */[m
[31m-    node->left = NULL;[m
[31m-    node->right = NULL;[m
[31m-    node->parent = NULL;[m
[31m-    node->key = 0;[m
[31m-[m
[31m-    if (red) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* a delete fixup */[m
[31m-[m
[31m-    while (temp != *root && ngx_rbt_is_black(temp)) {[m
[31m-[m
[31m-        if (temp == temp->parent->left) {[m
[31m-            w = temp->parent->right;[m
[31m-[m
[31m-            if (ngx_rbt_is_red(w)) {[m
[31m-                ngx_rbt_black(w);[m
[31m-                ngx_rbt_red(temp->parent);[m
[31m-                ngx_rbtree_left_rotate(root, sentinel, temp->parent);[m
[31m-                w = temp->parent->right;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_rbt_is_black(w->left) && ngx_rbt_is_black(w->right)) {[m
[31m-                ngx_rbt_red(w);[m
[31m-                temp = temp->parent;[m
[31m-[m
[31m-            } else {[m
[31m-                if (ngx_rbt_is_black(w->right)) {[m
[31m-                    ngx_rbt_black(w->left);[m
[31m-                    ngx_rbt_red(w);[m
[31m-                    ngx_rbtree_right_rotate(root, sentinel, w);[m
[31m-                    w = temp->parent->right;[m
[31m-                }[m
[31m-[m
[31m-                ngx_rbt_copy_color(w, temp->parent);[m
[31m-                ngx_rbt_black(temp->parent);[m
[31m-                ngx_rbt_black(w->right);[m
[31m-                ngx_rbtree_left_rotate(root, sentinel, temp->parent);[m
[31m-                temp = *root;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            w = temp->parent->left;[m
[31m-[m
[31m-            if (ngx_rbt_is_red(w)) {[m
[31m-                ngx_rbt_black(w);[m
[31m-                ngx_rbt_red(temp->parent);[m
[31m-                ngx_rbtree_right_rotate(root, sentinel, temp->parent);[m
[31m-                w = temp->parent->left;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_rbt_is_black(w->left) && ngx_rbt_is_black(w->right)) {[m
[31m-                ngx_rbt_red(w);[m
[31m-                temp = temp->parent;[m
[31m-[m
[31m-            } else {[m
[31m-                if (ngx_rbt_is_black(w->left)) {[m
[31m-                    ngx_rbt_black(w->right);[m
[31m-                    ngx_rbt_red(w);[m
[31m-                    ngx_rbtree_left_rotate(root, sentinel, w);[m
[31m-                    w = temp->parent->left;[m
[31m-                }[m
[31m-[m
[31m-                ngx_rbt_copy_color(w, temp->parent);[m
[31m-                ngx_rbt_black(temp->parent);[m
[31m-                ngx_rbt_black(w->left);[m
[31m-                ngx_rbtree_right_rotate(root, sentinel, temp->parent);[m
[31m-                temp = *root;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbt_black(temp);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_rbtree_left_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,[m
[31m-    ngx_rbtree_node_t *node)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  *temp;[m
[31m-[m
[31m-    temp = node->right;[m
[31m-    node->right = temp->left;[m
[31m-[m
[31m-    if (temp->left != sentinel) {[m
[31m-        temp->left->parent = node;[m
[31m-    }[m
[31m-[m
[31m-    temp->parent = node->parent;[m
[31m-[m
[31m-    if (node == *root) {[m
[31m-        *root = temp;[m
[31m-[m
[31m-    } else if (node == node->parent->left) {[m
[31m-        node->parent->left = temp;[m
[31m-[m
[31m-    } else {[m
[31m-        node->parent->right = temp;[m
[31m-    }[m
[31m-[m
[31m-    temp->left = node;[m
[31m-    node->parent = temp;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_rbtree_right_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,[m
[31m-    ngx_rbtree_node_t *node)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  *temp;[m
[31m-[m
[31m-    temp = node->left;[m
[31m-    node->left = temp->right;[m
[31m-[m
[31m-    if (temp->right != sentinel) {[m
[31m-        temp->right->parent = node;[m
[31m-    }[m
[31m-[m
[31m-    temp->parent = node->parent;[m
[31m-[m
[31m-    if (node == *root) {[m
[31m-        *root = temp;[m
[31m-[m
[31m-    } else if (node == node->parent->right) {[m
[31m-        node->parent->right = temp;[m
[31m-[m
[31m-    } else {[m
[31m-        node->parent->left = temp;[m
[31m-    }[m
[31m-[m
[31m-    temp->right = node;[m
[31m-    node->parent = temp;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rbtree.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rbtree.h[m
[1mdeleted file mode 100644[m
[1mindex 1d33e3f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rbtree.h[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_RBTREE_H_INCLUDED_[m
[31m-#define _NGX_RBTREE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_uint_t  ngx_rbtree_key_t;[m
[31m-typedef ngx_int_t   ngx_rbtree_key_int_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_rbtree_node_s  ngx_rbtree_node_t;[m
[31m-[m
[31m-struct ngx_rbtree_node_s {[m
[31m-    ngx_rbtree_key_t       key;[m
[31m-    ngx_rbtree_node_t     *left;[m
[31m-    ngx_rbtree_node_t     *right;[m
[31m-    ngx_rbtree_node_t     *parent;[m
[31m-    u_char                 color;[m
[31m-    u_char                 data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_rbtree_s  ngx_rbtree_t;[m
[31m-[m
[31m-typedef void (*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-struct ngx_rbtree_s {[m
[31m-    ngx_rbtree_node_t     *root;[m
[31m-    ngx_rbtree_node_t     *sentinel;[m
[31m-    ngx_rbtree_insert_pt   insert;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define ngx_rbtree_init(tree, s, i)                                           \[m
[31m-    ngx_rbtree_sentinel_init(s);                                              \[m
[31m-    (tree)->root = s;                                                         \[m
[31m-    (tree)->sentinel = s;                                                     \[m
[31m-    (tree)->insert = i[m
[31m-[m
[31m-[m
[31m-void ngx_rbtree_insert(ngx_rbtree_t *tree, ngx_rbtree_node_t *node);[m
[31m-void ngx_rbtree_delete(ngx_rbtree_t *tree, ngx_rbtree_node_t *node);[m
[31m-void ngx_rbtree_insert_value(ngx_rbtree_node_t *root, ngx_rbtree_node_t *node,[m
[31m-    ngx_rbtree_node_t *sentinel);[m
[31m-void ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *root,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-[m
[31m-#define ngx_rbt_red(node)               ((node)->color = 1)[m
[31m-#define ngx_rbt_black(node)             ((node)->color = 0)[m
[31m-#define ngx_rbt_is_red(node)            ((node)->color)[m
[31m-#define ngx_rbt_is_black(node)          (!ngx_rbt_is_red(node))[m
[31m-#define ngx_rbt_copy_color(n1, n2)      (n1->color = n2->color)[m
[31m-[m
[31m-[m
[31m-/* a sentinel must be black */[m
[31m-[m
[31m-#define ngx_rbtree_sentinel_init(node)  ngx_rbt_black(node)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_rbtree_node_t *[m
[31m-ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    while (node->left != sentinel) {[m
[31m-        node = node->left;[m
[31m-    }[m
[31m-[m
[31m-    return node;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_RBTREE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_regex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_regex.c[m
[1mdeleted file mode 100644[m
[1mindex 9939dce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_regex.c[m
[1m+++ /dev/null[m
[36m@@ -1,435 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t  pcre_jit;[m
[31m-} ngx_regex_conf_t;[m
[31m-[m
[31m-[m
[31m-static void * ngx_libc_cdecl ngx_regex_malloc(size_t size);[m
[31m-static void ngx_libc_cdecl ngx_regex_free(void *p);[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-static void ngx_pcre_free_studies(void *data);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_regex_module_init(ngx_cycle_t *cycle);[m
[31m-[m
[31m-static void *ngx_regex_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static char *ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data);[m
[31m-static ngx_conf_post_t  ngx_regex_pcre_jit_post = { ngx_regex_pcre_jit };[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_regex_commands[] = {[m
[31m-[m
[31m-    { ngx_string("pcre_jit"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_regex_conf_t, pcre_jit),[m
[31m-      &ngx_regex_pcre_jit_post },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_regex_module_ctx = {[m
[31m-    ngx_string("regex"),[m
[31m-    ngx_regex_create_conf,[m
[31m-    ngx_regex_init_conf[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_regex_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_regex_module_ctx,                 /* module context */[m
[31m-    ngx_regex_commands,                    /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    ngx_regex_module_init,                 /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_pool_t  *ngx_pcre_pool;[m
[31m-static ngx_list_t  *ngx_pcre_studies;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_regex_init(void)[m
[31m-{[m
[31m-    pcre_malloc = ngx_regex_malloc;[m
[31m-    pcre_free = ngx_regex_free;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_regex_malloc_init(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pcre_pool = pool;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_regex_malloc_done(void)[m
[31m-{[m
[31m-    ngx_pcre_pool = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_regex_compile(ngx_regex_compile_t *rc)[m
[31m-{[m
[31m-    int               n, erroff;[m
[31m-    char             *p;[m
[31m-    pcre             *re;[m
[31m-    const char       *errstr;[m
[31m-    ngx_regex_elt_t  *elt;[m
[31m-[m
[31m-    ngx_regex_malloc_init(rc->pool);[m
[31m-[m
[31m-    re = pcre_compile((const char *) rc->pattern.data, (int) rc->options,[m
[31m-                      &errstr, &erroff, NULL);[m
[31m-[m
[31m-    /* ensure that there is no current pool */[m
[31m-    ngx_regex_malloc_done();[m
[31m-[m
[31m-    if (re == NULL) {[m
[31m-        if ((size_t) erroff == rc->pattern.len) {[m
[31m-           rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                              "pcre_compile() failed: %s in \"%V\"",[m
[31m-                               errstr, &rc->pattern)[m
[31m-                      - rc->err.data;[m
[31m-[m
[31m-        } else {[m
[31m-           rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                              "pcre_compile() failed: %s in \"%V\" at \"%s\"",[m
[31m-                               errstr, &rc->pattern, rc->pattern.data + erroff)[m
[31m-                      - rc->err.data;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc->regex = ngx_pcalloc(rc->pool, sizeof(ngx_regex_t));[m
[31m-    if (rc->regex == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    rc->regex->code = re;[m
[31m-[m
[31m-    /* do not study at runtime */[m
[31m-[m
[31m-    if (ngx_pcre_studies != NULL) {[m
[31m-        elt = ngx_list_push(ngx_pcre_studies);[m
[31m-        if (elt == NULL) {[m
[31m-            goto nomem;[m
[31m-        }[m
[31m-[m
[31m-        elt->regex = rc->regex;[m
[31m-        elt->name = rc->pattern.data;[m
[31m-    }[m
[31m-[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &rc->captures);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_CAPTURECOUNT) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc->captures == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMECOUNT, &rc->named_captures);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMECOUNT) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc->named_captures == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &rc->name_size);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMEENTRYSIZE) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMETABLE, &rc->names);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMETABLE) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, p, &rc->pattern, n)[m
[31m-                  - rc->err.data;[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                               "regex \"%V\" compilation failed: no memory",[m
[31m-                               &rc->pattern)[m
[31m-                  - rc->err.data;[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_regex_elt_t  *re;[m
[31m-[m
[31m-    re = a->elts;[m
[31m-[m
[31m-    for (i = 0; i < a->nelts; i++) {[m
[31m-[m
[31m-        n = ngx_regex_exec(re[i].regex, s, NULL, 0);[m
[31m-[m
[31m-        if (n == NGX_REGEX_NO_MATCHED) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n < 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          ngx_regex_exec_n " failed: %i on \"%V\" using \"%s\"",[m
[31m-                          n, s, re[i].name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* match */[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void * ngx_libc_cdecl[m
[31m-ngx_regex_malloc(size_t size)[m
[31m-{[m
[31m-    ngx_pool_t      *pool;[m
[31m-    pool = ngx_pcre_pool;[m
[31m-[m
[31m-    if (pool) {[m
[31m-        return ngx_palloc(pool, size);[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void ngx_libc_cdecl[m
[31m-ngx_regex_free(void *p)[m
[31m-{[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-[m
[31m-static void[m
[31m-ngx_pcre_free_studies(void *data)[m
[31m-{[m
[31m-    ngx_list_t *studies = data;[m
[31m-[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_regex_elt_t  *elts;[m
[31m-[m
[31m-    part = &studies->part;[m
[31m-    elts = part->elts;[m
[31m-[m
[31m-    for (i = 0 ; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            elts = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (elts[i].regex->extra != NULL) {[m
[31m-            pcre_free_study(elts[i].regex->extra);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_regex_module_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int               opt;[m
[31m-    const char       *errstr;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_regex_elt_t  *elts;[m
[31m-[m
[31m-    opt = 0;[m
[31m-[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-    {[m
[31m-    ngx_regex_conf_t    *rcf;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    rcf = (ngx_regex_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_regex_module);[m
[31m-[m
[31m-    if (rcf->pcre_jit) {[m
[31m-        opt = PCRE_STUDY_JIT_COMPILE;[m
[31m-[m
[31m-        /*[m
[31m-         * The PCRE JIT compiler uses mmap for its executable codes, so we[m
[31m-         * have to explicitly call the pcre_free_study() function to free[m
[31m-         * this memory.[m
[31m-         */[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(cycle->pool, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_pcre_free_studies;[m
[31m-        cln->data = ngx_pcre_studies;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_regex_malloc_init(cycle->pool);[m
[31m-[m
[31m-    part = &ngx_pcre_studies->part;[m
[31m-    elts = part->elts;[m
[31m-[m
[31m-    for (i = 0 ; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            elts = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        elts[i].regex->extra = pcre_study(elts[i].regex->code, opt, &errstr);[m
[31m-[m
[31m-        if (errstr != NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "pcre_study() failed: %s in \"%s\"",[m
[31m-                          errstr, elts[i].name);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-        if (opt & PCRE_STUDY_JIT_COMPILE) {[m
[31m-            int jit, n;[m
[31m-[m
[31m-            jit = 0;[m
[31m-            n = pcre_fullinfo(elts[i].regex->code, elts[i].regex->extra,[m
[31m-                              PCRE_INFO_JIT, &jit);[m
[31m-[m
[31m-            if (n != 0 || jit != 1) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, cycle->log, 0,[m
[31m-                              "JIT compiler does not support pattern: \"%s\"",[m
[31m-                              elts[i].name);[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ngx_regex_malloc_done();[m
[31m-[m
[31m-    ngx_pcre_studies = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_regex_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_regex_conf_t  *rcf;[m
[31m-[m
[31m-    rcf = ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t));[m
[31m-    if (rcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rcf->pcre_jit = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ngx_pcre_studies = ngx_list_create(cycle->pool, 8, sizeof(ngx_regex_elt_t));[m
[31m-    if (ngx_pcre_studies == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return rcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_regex_conf_t *rcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_value(rcf->pcre_jit, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_flag_t  *fp = data;[m
[31m-[m
[31m-    if (*fp == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-    {[m
[31m-    int  jit, r;[m
[31m-[m
[31m-    jit = 0;[m
[31m-    r = pcre_config(PCRE_CONFIG_JIT, &jit);[m
[31m-[m
[31m-    if (r != 0 || jit != 1) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "PCRE library does not support JIT");[m
[31m-        *fp = 0;[m
[31m-    }[m
[31m-    }[m
[31m-#else[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "nginx was built without PCRE JIT support");[m
[31m-    *fp = 0;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_regex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_regex.h[m
[1mdeleted file mode 100644[m
[1mindex 680486c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_regex.h[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_REGEX_H_INCLUDED_[m
[31m-#define _NGX_REGEX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#include <pcre.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_REGEX_NO_MATCHED  PCRE_ERROR_NOMATCH   /* -1 */[m
[31m-[m
[31m-#define NGX_REGEX_CASELESS    PCRE_CASELESS[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    pcre        *code;[m
[31m-    pcre_extra  *extra;[m
[31m-} ngx_regex_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     pattern;[m
[31m-    ngx_pool_t   *pool;[m
[31m-    ngx_int_t     options;[m
[31m-[m
[31m-    ngx_regex_t  *regex;[m
[31m-    int           captures;[m
[31m-    int           named_captures;[m
[31m-    int           name_size;[m
[31m-    u_char       *names;[m
[31m-    ngx_str_t     err;[m
[31m-} ngx_regex_compile_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_regex_t  *regex;[m
[31m-    u_char       *name;[m
[31m-} ngx_regex_elt_t;[m
[31m-[m
[31m-[m
[31m-void ngx_regex_init(void);[m
[31m-ngx_int_t ngx_regex_compile(ngx_regex_compile_t *rc);[m
[31m-[m
[31m-#define ngx_regex_exec(re, s, captures, size)                                \[m
[31m-    pcre_exec(re->code, re->extra, (const char *) (s)->data, (s)->len, 0, 0, \[m
[31m-              captures, size)[m
[31m-#define ngx_regex_exec_n      "pcre_exec()"[m
[31m-[m
[31m-ngx_int_t ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_REGEX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_resolver.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_resolver.c[m
[1mdeleted file mode 100644[m
[1mindex e00fe22..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_resolver.c[m
[1m+++ /dev/null[m
[36m@@ -1,4662 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_RESOLVER_UDP_SIZE   4096[m
[31m-[m
[31m-#define NGX_RESOLVER_TCP_RSIZE  (2 + 65535)[m
[31m-#define NGX_RESOLVER_TCP_WSIZE  8192[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  ident_hi;[m
[31m-    u_char  ident_lo;[m
[31m-    u_char  flags_hi;[m
[31m-    u_char  flags_lo;[m
[31m-    u_char  nqs_hi;[m
[31m-    u_char  nqs_lo;[m
[31m-    u_char  nan_hi;[m
[31m-    u_char  nan_lo;[m
[31m-    u_char  nns_hi;[m
[31m-    u_char  nns_lo;[m
[31m-    u_char  nar_hi;[m
[31m-    u_char  nar_lo;[m
[31m-} ngx_resolver_hdr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  type_hi;[m
[31m-    u_char  type_lo;[m
[31m-    u_char  class_hi;[m
[31m-    u_char  class_lo;[m
[31m-} ngx_resolver_qs_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  type_hi;[m
[31m-    u_char  type_lo;[m
[31m-    u_char  class_hi;[m
[31m-    u_char  class_lo;[m
[31m-    u_char  ttl[4];[m
[31m-    u_char  len_hi;[m
[31m-    u_char  len_lo;[m
[31m-} ngx_resolver_an_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_resolver_node(n)                                                 \[m
[31m-    (ngx_resolver_node_t *)                                                  \[m
[31m-        ((u_char *) (n) - offsetof(ngx_resolver_node_t, node))[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_udp_connect(ngx_resolver_connection_t *rec);[m
[31m-ngx_int_t ngx_tcp_connect(ngx_resolver_connection_t *rec);[m
[31m-[m
[31m-[m
[31m-static void ngx_resolver_cleanup(void *data);[m
[31m-static void ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree);[m
[31m-static ngx_int_t ngx_resolve_name_locked(ngx_resolver_t *r,[m
[31m-    ngx_resolver_ctx_t *ctx, ngx_str_t *name);[m
[31m-static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree,[m
[31m-    ngx_queue_t *queue);[m
[31m-static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn);[m
[31m-static ngx_int_t ngx_resolver_send_udp_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_connection_t *rec, u_char *query, u_short qlen);[m
[31m-static ngx_int_t ngx_resolver_send_tcp_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_connection_t *rec, u_char *query, u_short qlen);[m
[31m-static ngx_int_t ngx_resolver_create_name_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn, ngx_str_t *name);[m
[31m-static ngx_int_t ngx_resolver_create_srv_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn, ngx_str_t *name);[m
[31m-static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn, ngx_resolver_addr_t *addr);[m
[31m-static void ngx_resolver_resend_handler(ngx_event_t *ev);[m
[31m-static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree,[m
[31m-    ngx_queue_t *queue);[m
[31m-static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r);[m
[31m-static void ngx_resolver_udp_read(ngx_event_t *rev);[m
[31m-static void ngx_resolver_tcp_write(ngx_event_t *wev);[m
[31m-static void ngx_resolver_tcp_read(ngx_event_t *rev);[m
[31m-static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf,[m
[31m-    size_t n, ngx_uint_t tcp);[m
[31m-static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,[m
[31m-    ngx_uint_t nan, ngx_uint_t trunc, ngx_uint_t ans);[m
[31m-static void ngx_resolver_process_srv(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan,[m
[31m-    ngx_uint_t trunc, ngx_uint_t ans);[m
[31m-static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan);[m
[31m-static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r,[m
[31m-    ngx_str_t *name, uint32_t hash);[m
[31m-static ngx_resolver_node_t *ngx_resolver_lookup_srv(ngx_resolver_t *r,[m
[31m-    ngx_str_t *name, uint32_t hash);[m
[31m-static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r,[m
[31m-    in_addr_t addr);[m
[31m-static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-static ngx_int_t ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name,[m
[31m-    u_char *buf, u_char *src, u_char *last);[m
[31m-static void ngx_resolver_timeout_handler(ngx_event_t *ev);[m
[31m-static void ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn);[m
[31m-static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size);[m
[31m-static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size);[m
[31m-static void ngx_resolver_free(ngx_resolver_t *r, void *p);[m
[31m-static void ngx_resolver_free_locked(ngx_resolver_t *r, void *p);[m
[31m-static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size);[m
[31m-static ngx_resolver_addr_t *ngx_resolver_export(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn, ngx_uint_t rotate);[m
[31m-static void ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx);[m
[31m-static u_char *ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-static void ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx,[m
[31m-    ngx_resolver_node_t *rn);[m
[31m-static void ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_resolver_cmp_srvs(const void *one, const void *two);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static void ngx_resolver_rbtree_insert_addr6_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-static ngx_resolver_node_t *ngx_resolver_lookup_addr6(ngx_resolver_t *r,[m
[31m-    struct in6_addr *addr, uint32_t hash);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_resolver_t *[m
[31m-ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_str_t                   s;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_uint_t                  i, j;[m
[31m-    ngx_resolver_t             *r;[m
[31m-    ngx_pool_cleanup_t         *cln;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_resolver_cleanup;[m
[31m-[m
[31m-    r = ngx_calloc(sizeof(ngx_resolver_t), cf->log);[m
[31m-    if (r == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->data = r;[m
[31m-[m
[31m-    r->event = ngx_calloc(sizeof(ngx_event_t), cf->log);[m
[31m-    if (r->event == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel,[m
[31m-                    ngx_resolver_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_rbtree_init(&r->srv_rbtree, &r->srv_sentinel,[m
[31m-                    ngx_resolver_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_rbtree_init(&r->addr_rbtree, &r->addr_sentinel,[m
[31m-                    ngx_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&r->name_resend_queue);[m
[31m-    ngx_queue_init(&r->srv_resend_queue);[m
[31m-    ngx_queue_init(&r->addr_resend_queue);[m
[31m-[m
[31m-    ngx_queue_init(&r->name_expire_queue);[m
[31m-    ngx_queue_init(&r->srv_expire_queue);[m
[31m-    ngx_queue_init(&r->addr_expire_queue);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    r->ipv6 = 1;[m
[31m-[m
[31m-    ngx_rbtree_init(&r->addr6_rbtree, &r->addr6_sentinel,[m
[31m-                    ngx_resolver_rbtree_insert_addr6_value);[m
[31m-[m
[31m-    ngx_queue_init(&r->addr6_resend_queue);[m
[31m-[m
[31m-    ngx_queue_init(&r->addr6_expire_queue);[m
[31m-#endif[m
[31m-[m
[31m-    r->event->handler = ngx_resolver_resend_handler;[m
[31m-    r->event->data = r;[m
[31m-    r->event->log = &cf->cycle->new_log;[m
[31m-    r->ident = -1;[m
[31m-[m
[31m-    r->resend_timeout = 5;[m
[31m-    r->tcp_timeout = 5;[m
[31m-    r->expire = 30;[m
[31m-    r->valid = 0;[m
[31m-[m
[31m-    r->log = &cf->cycle->new_log;[m
[31m-    r->log_level = NGX_LOG_ERR;[m
[31m-[m
[31m-    if (n) {[m
[31m-        if (ngx_array_init(&r->connections, cf->pool, n,[m
[31m-                           sizeof(ngx_resolver_connection_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        if (ngx_strncmp(names[i].data, "valid=", 6) == 0) {[m
[31m-            s.len = names[i].len - 6;[m
[31m-            s.data = names[i].data + 6;[m
[31m-[m
[31m-            r->valid = ngx_parse_time(&s, 1);[m
[31m-[m
[31m-            if (r->valid == (time_t) NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid parameter: %V", &names[i]);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (ngx_strncmp(names[i].data, "ipv6=", 5) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&names[i].data[5], "on") == 0) {[m
[31m-                r->ipv6 = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&names[i].data[5], "off") == 0) {[m
[31m-                r->ipv6 = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid parameter: %V", &names[i]);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-        u.url = names[i];[m
[31m-        u.default_port = 53;[m
[31m-[m
[31m-        if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-            if (u.err) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "%s in resolver \"%V\"",[m
[31m-                                   u.err, &u.url);[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        rec = ngx_array_push_n(&r->connections, u.naddrs);[m
[31m-        if (rec == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(rec, u.naddrs * sizeof(ngx_resolver_connection_t));[m
[31m-[m
[31m-        for (j = 0; j < u.naddrs; j++) {[m
[31m-            rec[j].sockaddr = u.addrs[j].sockaddr;[m
[31m-            rec[j].socklen = u.addrs[j].socklen;[m
[31m-            rec[j].server = u.addrs[j].name;[m
[31m-            rec[j].resolver = r;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_resolver_t  *r = data;[m
[31m-[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    if (r) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                       "cleanup resolver");[m
[31m-[m
[31m-        ngx_resolver_cleanup_tree(r, &r->name_rbtree);[m
[31m-[m
[31m-        ngx_resolver_cleanup_tree(r, &r->srv_rbtree);[m
[31m-[m
[31m-        ngx_resolver_cleanup_tree(r, &r->addr_rbtree);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        ngx_resolver_cleanup_tree(r, &r->addr6_rbtree);[m
[31m-#endif[m
[31m-[m
[31m-        if (r->event) {[m
[31m-            ngx_free(r->event);[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        rec = r->connections.elts;[m
[31m-[m
[31m-        for (i = 0; i < r->connections.nelts; i++) {[m
[31m-            if (rec[i].udp) {[m
[31m-                ngx_close_connection(rec[i].udp);[m
[31m-            }[m
[31m-[m
[31m-            if (rec[i].tcp) {[m
[31m-                ngx_close_connection(rec[i].tcp);[m
[31m-            }[m
[31m-[m
[31m-            if (rec[i].read_buf) {[m
[31m-                ngx_resolver_free(r, rec[i].read_buf->start);[m
[31m-                ngx_resolver_free(r, rec[i].read_buf);[m
[31m-            }[m
[31m-[m
[31m-            if (rec[i].write_buf) {[m
[31m-                ngx_resolver_free(r, rec[i].write_buf->start);[m
[31m-                ngx_resolver_free(r, rec[i].write_buf);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_free(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t   *ctx, *next;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    while (tree->root != tree->sentinel) {[m
[31m-[m
[31m-        rn = ngx_resolver_node(ngx_rbtree_min(tree->root, tree->sentinel));[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        for (ctx = rn->waiting; ctx; ctx = next) {[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            if (ctx->event) {[m
[31m-                ngx_resolver_free(r, ctx->event);[m
[31m-            }[m
[31m-[m
[31m-            ngx_resolver_free(r, ctx);[m
[31m-        }[m
[31m-[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_resolver_ctx_t *[m
[31m-ngx_resolve_start(ngx_resolver_t *r, ngx_resolver_ctx_t *temp)[m
[31m-{[m
[31m-    in_addr_t            addr;[m
[31m-    ngx_resolver_ctx_t  *ctx;[m
[31m-[m
[31m-    if (temp) {[m
[31m-        addr = ngx_inet_addr(temp->name.data, temp->name.len);[m
[31m-[m
[31m-        if (addr != INADDR_NONE) {[m
[31m-            temp->resolver = r;[m
[31m-            temp->state = NGX_OK;[m
[31m-            temp->naddrs = 1;[m
[31m-            temp->addrs = &temp->addr;[m
[31m-            temp->addr.sockaddr = (struct sockaddr *) &temp->sin;[m
[31m-            temp->addr.socklen = sizeof(struct sockaddr_in);[m
[31m-            ngx_memzero(&temp->sin, sizeof(struct sockaddr_in));[m
[31m-            temp->sin.sin_family = AF_INET;[m
[31m-            temp->sin.sin_addr.s_addr = addr;[m
[31m-            temp->quick = 1;[m
[31m-[m
[31m-            return temp;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->connections.nelts == 0) {[m
[31m-        return NGX_NO_RESOLVER;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_resolver_calloc(r, sizeof(ngx_resolver_ctx_t));[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        ctx->resolver = r;[m
[31m-    }[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_resolve_name(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t           slen;[m
[31m-    ngx_int_t        rc;[m
[31m-    ngx_str_t        name;[m
[31m-    ngx_resolver_t  *r;[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    if (ctx->name.len > 0 && ctx->name.data[ctx->name.len - 1] == '.') {[m
[31m-        ctx->name.len--;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve: \"%V\"", &ctx->name);[m
[31m-[m
[31m-    if (ctx->quick) {[m
[31m-        ctx->handler(ctx);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->service.len) {[m
[31m-        slen = ctx->service.len;[m
[31m-[m
[31m-        if (ngx_strlchr(ctx->service.data,[m
[31m-                        ctx->service.data + ctx->service.len, '.')[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            slen += sizeof("_._tcp") - 1;[m
[31m-        }[m
[31m-[m
[31m-        name.len = slen + 1 + ctx->name.len;[m
[31m-[m
[31m-        name.data = ngx_resolver_alloc(r, name.len);[m
[31m-        if (name.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (slen == ctx->service.len) {[m
[31m-            ngx_sprintf(name.data, "%V.%V", &ctx->service, &ctx->name);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_sprintf(name.data, "_%V._tcp.%V", &ctx->service, &ctx->name);[m
[31m-        }[m
[31m-[m
[31m-        /* lock name mutex */[m
[31m-[m
[31m-        rc = ngx_resolve_name_locked(r, ctx, &name);[m
[31m-[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    } else {[m
[31m-        /* lock name mutex */[m
[31m-[m
[31m-        rc = ngx_resolve_name_locked(r, ctx, &ctx->name);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* NGX_ERROR */[m
[31m-[m
[31m-    if (ctx->event) {[m
[31m-        ngx_resolver_free(r, ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_resolve_name_done(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_resolver_t       *r;[m
[31m-    ngx_resolver_ctx_t   *w, **p;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve name done: %i", ctx->state);[m
[31m-[m
[31m-    if (ctx->quick) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->event && ctx->event->timer_set) {[m
[31m-        ngx_del_timer(ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    /* lock name mutex */[m
[31m-[m
[31m-    if (ctx->nsrvs) {[m
[31m-        for (i = 0; i < ctx->nsrvs; i++) {[m
[31m-            if (ctx->srvs[i].ctx) {[m
[31m-                ngx_resolve_name_done(ctx->srvs[i].ctx);[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->srvs[i].addrs) {[m
[31m-                ngx_resolver_free(r, ctx->srvs[i].addrs->sockaddr);[m
[31m-                ngx_resolver_free(r, ctx->srvs[i].addrs);[m
[31m-            }[m
[31m-[m
[31m-            ngx_resolver_free(r, ctx->srvs[i].name.data);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free(r, ctx->srvs);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) {[m
[31m-[m
[31m-        rn = ctx->node;[m
[31m-[m
[31m-        if (rn) {[m
[31m-            p = &rn->waiting;[m
[31m-            w = rn->waiting;[m
[31m-[m
[31m-            while (w) {[m
[31m-                if (w == ctx) {[m
[31m-                    *p = w->next;[m
[31m-[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                p = &w->next;[m
[31m-                w = w->next;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->log, 0,[m
[31m-                          "could not cancel %V resolving", &ctx->name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (ctx->service.len) {[m
[31m-        ngx_resolver_expire(r, &r->srv_rbtree, &r->srv_expire_queue);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_resolver_expire(r, &r->name_rbtree, &r->name_expire_queue);[m
[31m-    }[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    if (ctx->event) {[m
[31m-        ngx_resolver_free_locked(r, ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free_locked(r, ctx);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-[m
[31m-    if (r->event->timer_set && ngx_resolver_resend_empty(r)) {[m
[31m-        ngx_del_timer(r->event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    uint32_t              hash;[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_str_t             cname;[m
[31m-    ngx_uint_t            i, naddrs;[m
[31m-    ngx_queue_t          *resend_queue, *expire_queue;[m
[31m-    ngx_rbtree_t         *tree;[m
[31m-    ngx_resolver_ctx_t   *next, *last;[m
[31m-    ngx_resolver_addr_t  *addrs;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    ngx_strlow(name->data, name->data, name->len);[m
[31m-[m
[31m-    hash = ngx_crc32_short(name->data, name->len);[m
[31m-[m
[31m-    if (ctx->service.len) {[m
[31m-        rn = ngx_resolver_lookup_srv(r, name, hash);[m
[31m-[m
[31m-        tree = &r->srv_rbtree;[m
[31m-        resend_queue = &r->srv_resend_queue;[m
[31m-        expire_queue = &r->srv_expire_queue;[m
[31m-[m
[31m-    } else {[m
[31m-        rn = ngx_resolver_lookup_name(r, name, hash);[m
[31m-[m
[31m-        tree = &r->name_rbtree;[m
[31m-        resend_queue = &r->name_resend_queue;[m
[31m-        expire_queue = &r->name_expire_queue;[m
[31m-    }[m
[31m-[m
[31m-    if (rn) {[m
[31m-[m
[31m-        /* ctx can be a list after NGX_RESOLVE_CNAME */[m
[31m-        for (last = ctx; last->next; last = last->next);[m
[31m-[m
[31m-        if (rn->valid >= ngx_time()) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");[m
[31m-[m
[31m-            ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-            rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-            ngx_queue_insert_head(expire_queue, &rn->queue);[m
[31m-[m
[31m-            naddrs = (rn->naddrs == (u_short) -1) ? 0 : rn->naddrs;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            naddrs += (rn->naddrs6 == (u_short) -1) ? 0 : rn->naddrs6;[m
[31m-#endif[m
[31m-[m
[31m-            if (naddrs) {[m
[31m-[m
[31m-                if (naddrs == 1 && rn->naddrs == 1) {[m
[31m-                    addrs = NULL;[m
[31m-[m
[31m-                } else {[m
[31m-                    addrs = ngx_resolver_export(r, rn, 1);[m
[31m-                    if (addrs == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                last->next = rn->waiting;[m
[31m-                rn->waiting = NULL;[m
[31m-[m
[31m-                /* unlock name mutex */[m
[31m-[m
[31m-                do {[m
[31m-                    ctx->state = NGX_OK;[m
[31m-                    ctx->valid = rn->valid;[m
[31m-                    ctx->naddrs = naddrs;[m
[31m-[m
[31m-                    if (addrs == NULL) {[m
[31m-                        ctx->addrs = &ctx->addr;[m
[31m-                        ctx->addr.sockaddr = (struct sockaddr *) &ctx->sin;[m
[31m-                        ctx->addr.socklen = sizeof(struct sockaddr_in);[m
[31m-                        ngx_memzero(&ctx->sin, sizeof(struct sockaddr_in));[m
[31m-                        ctx->sin.sin_family = AF_INET;[m
[31m-                        ctx->sin.sin_addr.s_addr = rn->u.addr;[m
[31m-[m
[31m-                    } else {[m
[31m-                        ctx->addrs = addrs;[m
[31m-                    }[m
[31m-[m
[31m-                    next = ctx->next;[m
[31m-[m
[31m-                    ctx->handler(ctx);[m
[31m-[m
[31m-                    ctx = next;[m
[31m-                } while (ctx);[m
[31m-[m
[31m-                if (addrs != NULL) {[m
[31m-                    ngx_resolver_free(r, addrs->sockaddr);[m
[31m-                    ngx_resolver_free(r, addrs);[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (rn->nsrvs) {[m
[31m-                last->next = rn->waiting;[m
[31m-                rn->waiting = NULL;[m
[31m-[m
[31m-                /* unlock name mutex */[m
[31m-[m
[31m-                do {[m
[31m-                    next = ctx->next;[m
[31m-[m
[31m-                    ngx_resolver_resolve_srv_names(ctx, rn);[m
[31m-[m
[31m-                    ctx = next;[m
[31m-                } while (ctx);[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            /* NGX_RESOLVE_CNAME */[m
[31m-[m
[31m-            if (ctx->recursion++ < NGX_RESOLVER_MAX_RECURSION) {[m
[31m-[m
[31m-                cname.len = rn->cnlen;[m
[31m-                cname.data = rn->u.cname;[m
[31m-[m
[31m-                return ngx_resolve_name_locked(r, ctx, &cname);[m
[31m-            }[m
[31m-[m
[31m-            last->next = rn->waiting;[m
[31m-            rn->waiting = NULL;[m
[31m-[m
[31m-            /* unlock name mutex */[m
[31m-[m
[31m-            do {[m
[31m-                ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-                ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-                next = ctx->next;[m
[31m-[m
[31m-                ctx->handler(ctx);[m
[31m-[m
[31m-                ctx = next;[m
[31m-            } while (ctx);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rn->waiting) {[m
[31m-[m
[31m-            if (ctx->event == NULL && ctx->timeout) {[m
[31m-                ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));[m
[31m-                if (ctx->event == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->event->handler = ngx_resolver_timeout_handler;[m
[31m-                ctx->event->data = ctx;[m
[31m-                ctx->event->log = r->log;[m
[31m-                ctx->ident = -1;[m
[31m-[m
[31m-                ngx_add_timer(ctx->event, ctx->timeout);[m
[31m-            }[m
[31m-[m
[31m-            last->next = rn->waiting;[m
[31m-            rn->waiting = ctx;[m
[31m-            ctx->state = NGX_AGAIN;[m
[31m-[m
[31m-            do {[m
[31m-                ctx->node = rn;[m
[31m-                ctx = ctx->next;[m
[31m-            } while (ctx);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        /* lock alloc mutex */[m
[31m-[m
[31m-        if (rn->query) {[m
[31m-            ngx_resolver_free_locked(r, rn->query);[m
[31m-            rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            rn->query6 = NULL;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (rn->cnlen) {[m
[31m-            ngx_resolver_free_locked(r, rn->u.cname);[m
[31m-        }[m
[31m-[m
[31m-        if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) {[m
[31m-            ngx_resolver_free_locked(r, rn->u.addrs);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (rn->naddrs6 > 1 && rn->naddrs6 != (u_short) -1) {[m
[31m-            ngx_resolver_free_locked(r, rn->u6.addrs6);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (rn->nsrvs) {[m
[31m-            for (i = 0; i < rn->nsrvs; i++) {[m
[31m-                if (rn->u.srvs[i].name.data) {[m
[31m-                    ngx_resolver_free_locked(r, rn->u.srvs[i].name.data);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_resolver_free_locked(r, rn->u.srvs);[m
[31m-        }[m
[31m-[m
[31m-        /* unlock alloc mutex */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));[m
[31m-        if (rn == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rn->name = ngx_resolver_dup(r, name->data, name->len);[m
[31m-        if (rn->name == NULL) {[m
[31m-            ngx_resolver_free(r, rn);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rn->node.key = hash;[m
[31m-        rn->nlen = (u_short) name->len;[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ngx_rbtree_insert(tree, &rn->node);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->service.len) {[m
[31m-        rc = ngx_resolver_create_srv_query(r, rn, name);[m
[31m-[m
[31m-    } else {[m
[31m-        rc = ngx_resolver_create_name_query(r, rn, name);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        ngx_resolver_free(r, rn->name);[m
[31m-        ngx_resolver_free(r, rn);[m
[31m-[m
[31m-        do {[m
[31m-            ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-[m
[31m-            ctx = next;[m
[31m-        } while (ctx);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rn->last_connection = r->last_connection++;[m
[31m-    if (r->last_connection == r->connections.nelts) {[m
[31m-        r->last_connection = 0;[m
[31m-    }[m
[31m-[m
[31m-    rn->naddrs = (u_short) -1;[m
[31m-    rn->tcp = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    rn->naddrs6 = r->ipv6 ? (u_short) -1 : 0;[m
[31m-    rn->tcp6 = 0;[m
[31m-#endif[m
[31m-    rn->nsrvs = 0;[m
[31m-[m
[31m-    if (ngx_resolver_send_query(r, rn) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->event == NULL && ctx->timeout) {[m
[31m-        ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));[m
[31m-        if (ctx->event == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ctx->event->handler = ngx_resolver_timeout_handler;[m
[31m-        ctx->event->data = ctx;[m
[31m-        ctx->event->log = r->log;[m
[31m-        ctx->ident = -1;[m
[31m-[m
[31m-        ngx_add_timer(ctx->event, ctx->timeout);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_queue_empty(resend_queue)) {[m
[31m-        ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));[m
[31m-    }[m
[31m-[m
[31m-    rn->expire = ngx_time() + r->resend_timeout;[m
[31m-[m
[31m-    ngx_queue_insert_head(resend_queue, &rn->queue);[m
[31m-[m
[31m-    rn->code = 0;[m
[31m-    rn->cnlen = 0;[m
[31m-    rn->valid = 0;[m
[31m-    rn->ttl = NGX_MAX_UINT32_VALUE;[m
[31m-    rn->waiting = ctx;[m
[31m-[m
[31m-    ctx->state = NGX_AGAIN;[m
[31m-[m
[31m-    do {[m
[31m-        ctx->node = rn;[m
[31m-        ctx = ctx->next;[m
[31m-    } while (ctx);[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-    if (rn->query) {[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, rn->name);[m
[31m-[m
[31m-    ngx_resolver_free(r, rn);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_resolve_addr(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char               *name;[m
[31m-    in_addr_t             addr;[m
[31m-    ngx_queue_t          *resend_queue, *expire_queue;[m
[31m-    ngx_rbtree_t         *tree;[m
[31m-    ngx_resolver_t       *r;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    uint32_t              hash;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    addr = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    hash = 0;[m
[31m-    sin6 = NULL;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    switch (ctx->addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) ctx->addr.sockaddr;[m
[31m-        hash = ngx_crc32_short(sin6->sin6_addr.s6_addr, 16);[m
[31m-[m
[31m-        /* lock addr mutex */[m
[31m-[m
[31m-        rn = ngx_resolver_lookup_addr6(r, &sin6->sin6_addr, hash);[m
[31m-[m
[31m-        tree = &r->addr6_rbtree;[m
[31m-        resend_queue = &r->addr6_resend_queue;[m
[31m-        expire_queue = &r->addr6_expire_queue;[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) ctx->addr.sockaddr;[m
[31m-        addr = ntohl(sin->sin_addr.s_addr);[m
[31m-[m
[31m-        /* lock addr mutex */[m
[31m-[m
[31m-        rn = ngx_resolver_lookup_addr(r, addr);[m
[31m-[m
[31m-        tree = &r->addr_rbtree;[m
[31m-        resend_queue = &r->addr_resend_queue;[m
[31m-        expire_queue = &r->addr_expire_queue;[m
[31m-    }[m
[31m-[m
[31m-    if (rn) {[m
[31m-[m
[31m-        if (rn->valid >= ngx_time()) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");[m
[31m-[m
[31m-            ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-            rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-            ngx_queue_insert_head(expire_queue, &rn->queue);[m
[31m-[m
[31m-            name = ngx_resolver_dup(r, rn->name, rn->nlen);[m
[31m-            if (name == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ctx->name.len = rn->nlen;[m
[31m-            ctx->name.data = name;[m
[31m-[m
[31m-            /* unlock addr mutex */[m
[31m-[m
[31m-            ctx->state = NGX_OK;[m
[31m-            ctx->valid = rn->valid;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-[m
[31m-            ngx_resolver_free(r, name);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rn->waiting) {[m
[31m-[m
[31m-            if (ctx->event == NULL && ctx->timeout) {[m
[31m-                ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));[m
[31m-                if (ctx->event == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->event->handler = ngx_resolver_timeout_handler;[m
[31m-                ctx->event->data = ctx;[m
[31m-                ctx->event->log = r->log;[m
[31m-                ctx->ident = -1;[m
[31m-[m
[31m-                ngx_add_timer(ctx->event, ctx->timeout);[m
[31m-            }[m
[31m-[m
[31m-            ctx->next = rn->waiting;[m
[31m-            rn->waiting = ctx;[m
[31m-            ctx->state = NGX_AGAIN;[m
[31m-            ctx->node = rn;[m
[31m-[m
[31m-            /* unlock addr mutex */[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));[m
[31m-        if (rn == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        switch (ctx->addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            rn->addr6 = sin6->sin6_addr;[m
[31m-            rn->node.key = hash;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            rn->node.key = addr;[m
[31m-        }[m
[31m-[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ngx_rbtree_insert(tree, &rn->node);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_resolver_create_addr_query(r, rn, &ctx->addr) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    rn->last_connection = r->last_connection++;[m
[31m-    if (r->last_connection == r->connections.nelts) {[m
[31m-        r->last_connection = 0;[m
[31m-    }[m
[31m-[m
[31m-    rn->naddrs = (u_short) -1;[m
[31m-    rn->tcp = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    rn->naddrs6 = (u_short) -1;[m
[31m-    rn->tcp6 = 0;[m
[31m-#endif[m
[31m-    rn->nsrvs = 0;[m
[31m-[m
[31m-    if (ngx_resolver_send_query(r, rn) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->event == NULL && ctx->timeout) {[m
[31m-        ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));[m
[31m-        if (ctx->event == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ctx->event->handler = ngx_resolver_timeout_handler;[m
[31m-        ctx->event->data = ctx;[m
[31m-        ctx->event->log = r->log;[m
[31m-        ctx->ident = -1;[m
[31m-[m
[31m-        ngx_add_timer(ctx->event, ctx->timeout);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_queue_empty(resend_queue)) {[m
[31m-        ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));[m
[31m-    }[m
[31m-[m
[31m-    rn->expire = ngx_time() + r->resend_timeout;[m
[31m-[m
[31m-    ngx_queue_insert_head(resend_queue, &rn->queue);[m
[31m-[m
[31m-    rn->code = 0;[m
[31m-    rn->cnlen = 0;[m
[31m-    rn->name = NULL;[m
[31m-    rn->nlen = 0;[m
[31m-    rn->valid = 0;[m
[31m-    rn->ttl = NGX_MAX_UINT32_VALUE;[m
[31m-    rn->waiting = ctx;[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    ctx->state = NGX_AGAIN;[m
[31m-    ctx->node = rn;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (rn) {[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        if (rn->query) {[m
[31m-            ngx_resolver_free(r, rn->query);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free(r, rn);[m
[31m-    }[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    if (ctx->event) {[m
[31m-        ngx_resolver_free(r, ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_queue_t          *expire_queue;[m
[31m-    ngx_rbtree_t         *tree;[m
[31m-    ngx_resolver_t       *r;[m
[31m-    ngx_resolver_ctx_t   *w, **p;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    switch (ctx->addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        tree = &r->addr6_rbtree;[m
[31m-        expire_queue = &r->addr6_expire_queue;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        tree = &r->addr_rbtree;[m
[31m-        expire_queue = &r->addr_expire_queue;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve addr done: %i", ctx->state);[m
[31m-[m
[31m-    if (ctx->event && ctx->event->timer_set) {[m
[31m-        ngx_del_timer(ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    /* lock addr mutex */[m
[31m-[m
[31m-    if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) {[m
[31m-[m
[31m-        rn = ctx->node;[m
[31m-[m
[31m-        if (rn) {[m
[31m-            p = &rn->waiting;[m
[31m-            w = rn->waiting;[m
[31m-[m
[31m-            while (w) {[m
[31m-                if (w == ctx) {[m
[31m-                    *p = w->next;[m
[31m-[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                p = &w->next;[m
[31m-                w = w->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        {[m
[31m-            u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-            ngx_str_t  addrtext;[m
[31m-[m
[31m-            addrtext.data = text;[m
[31m-            addrtext.len = ngx_sock_ntop(ctx->addr.sockaddr, ctx->addr.socklen,[m
[31m-                                         text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->log, 0,[m
[31m-                          "could not cancel %V resolving", &addrtext);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_resolver_expire(r, tree, expire_queue);[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    if (ctx->event) {[m
[31m-        ngx_resolver_free_locked(r, ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free_locked(r, ctx);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-[m
[31m-    if (r->event->timer_set && ngx_resolver_resend_empty(r)) {[m
[31m-        ngx_del_timer(r->event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)[m
[31m-{[m
[31m-    time_t                now;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_queue_t          *q;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver expire");[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    for (i = 0; i < 2; i++) {[m
[31m-        if (ngx_queue_empty(queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(queue);[m
[31m-[m
[31m-        rn = ngx_queue_data(q, ngx_resolver_node_t, queue);[m
[31m-[m
[31m-        if (now <= rn->expire) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                       "resolver expire \"%*s\"", (size_t) rn->nlen, rn->name);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_send_query(ngx_resolver_t *r, ngx_resolver_node_t *rn)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    rec = r->connections.elts;[m
[31m-    rec = &rec[rn->last_connection];[m
[31m-[m
[31m-    if (rec->log.handler == NULL) {[m
[31m-        rec->log = *r->log;[m
[31m-        rec->log.handler = ngx_resolver_log_error;[m
[31m-        rec->log.data = rec;[m
[31m-        rec->log.action = "resolving";[m
[31m-    }[m
[31m-[m
[31m-    if (rn->naddrs == (u_short) -1) {[m
[31m-        rc = rn->tcp ? ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen)[m
[31m-                     : ngx_resolver_send_udp_query(r, rec, rn->query, rn->qlen);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    if (rn->query6 && rn->naddrs6 == (u_short) -1) {[m
[31m-        rc = rn->tcp6[m
[31m-                    ? ngx_resolver_send_tcp_query(r, rec, rn->query6, rn->qlen)[m
[31m-                    : ngx_resolver_send_udp_query(r, rec, rn->query6, rn->qlen);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_send_udp_query(ngx_resolver_t *r, ngx_resolver_connection_t  *rec,[m
[31m-    u_char *query, u_short qlen)[m
[31m-{[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    if (rec->udp == NULL) {[m
[31m-        if (ngx_udp_connect(rec) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rec->udp->data = rec;[m
[31m-        rec->udp->read->handler = ngx_resolver_udp_read;[m
[31m-        rec->udp->read->resolver = 1;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_send(rec->udp, query, qlen);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != (size_t) qlen) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, &rec->log, 0, "send() incomplete");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_send_tcp_query(ngx_resolver_t *r, ngx_resolver_connection_t *rec,[m
[31m-    u_char *query, u_short qlen)[m
[31m-{[m
[31m-    ngx_buf_t  *b;[m
[31m-    ngx_int_t   rc;[m
[31m-[m
[31m-    rc = NGX_OK;[m
[31m-[m
[31m-    if (rec->tcp == NULL) {[m
[31m-        b = rec->read_buf;[m
[31m-[m
[31m-        if (b == NULL) {[m
[31m-            b = ngx_resolver_calloc(r, sizeof(ngx_buf_t));[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = ngx_resolver_alloc(r, NGX_RESOLVER_TCP_RSIZE);[m
[31m-            if (b->start == NULL) {[m
[31m-                ngx_resolver_free(r, b);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->end = b->start + NGX_RESOLVER_TCP_RSIZE;[m
[31m-[m
[31m-            rec->read_buf = b;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-[m
[31m-        b = rec->write_buf;[m
[31m-[m
[31m-        if (b == NULL) {[m
[31m-            b = ngx_resolver_calloc(r, sizeof(ngx_buf_t));[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = ngx_resolver_alloc(r, NGX_RESOLVER_TCP_WSIZE);[m
[31m-            if (b->start == NULL) {[m
[31m-                ngx_resolver_free(r, b);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->end = b->start + NGX_RESOLVER_TCP_WSIZE;[m
[31m-[m
[31m-            rec->write_buf = b;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-[m
[31m-        rc = ngx_tcp_connect(rec);[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rec->tcp->data = rec;[m
[31m-        rec->tcp->write->handler = ngx_resolver_tcp_write;[m
[31m-        rec->tcp->read->handler = ngx_resolver_tcp_read;[m
[31m-        rec->tcp->read->resolver = 1;[m
[31m-[m
[31m-        ngx_add_timer(rec->tcp->write, (ngx_msec_t) (r->tcp_timeout * 1000));[m
[31m-    }[m
[31m-[m
[31m-    b = rec->write_buf;[m
[31m-[m
[31m-    if (b->end - b->last <  2 + qlen) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, &rec->log, 0, "buffer overflow");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = (u_char) (qlen >> 8);[m
[31m-    *b->last++ = (u_char) qlen;[m
[31m-    b->last = ngx_cpymem(b->last, query, qlen);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        ngx_resolver_tcp_write(rec->tcp->write);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_resend_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    time_t           timer, atimer, stimer, ntimer;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    time_t           a6timer;[m
[31m-#endif[m
[31m-    ngx_resolver_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver resend handler");[m
[31m-[m
[31m-    /* lock name mutex */[m
[31m-[m
[31m-    ntimer = ngx_resolver_resend(r, &r->name_rbtree, &r->name_resend_queue);[m
[31m-[m
[31m-    stimer = ngx_resolver_resend(r, &r->srv_rbtree, &r->srv_resend_queue);[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    /* lock addr mutex */[m
[31m-[m
[31m-    atimer = ngx_resolver_resend(r, &r->addr_rbtree, &r->addr_resend_queue);[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    /* lock addr6 mutex */[m
[31m-[m
[31m-    a6timer = ngx_resolver_resend(r, &r->addr6_rbtree, &r->addr6_resend_queue);[m
[31m-[m
[31m-    /* unlock addr6 mutex */[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    timer = ntimer;[m
[31m-[m
[31m-    if (timer == 0) {[m
[31m-        timer = atimer;[m
[31m-[m
[31m-    } else if (atimer) {[m
[31m-        timer = ngx_min(timer, atimer);[m
[31m-    }[m
[31m-[m
[31m-    if (timer == 0) {[m
[31m-        timer = stimer;[m
[31m-[m
[31m-    } else if (stimer) {[m
[31m-        timer = ngx_min(timer, stimer);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    if (timer == 0) {[m
[31m-        timer = a6timer;[m
[31m-[m
[31m-    } else if (a6timer) {[m
[31m-        timer = ngx_min(timer, a6timer);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (timer) {[m
[31m-        ngx_add_timer(r->event, (ngx_msec_t) (timer * 1000));[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)[m
[31m-{[m
[31m-    time_t                now;[m
[31m-    ngx_queue_t          *q;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (ngx_queue_empty(queue)) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(queue);[m
[31m-[m
[31m-        rn = ngx_queue_data(q, ngx_resolver_node_t, queue);[m
[31m-[m
[31m-        if (now < rn->expire) {[m
[31m-            return rn->expire - now;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                       "resolver resend \"%*s\" %p",[m
[31m-                       (size_t) rn->nlen, rn->name, rn->waiting);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        if (rn->waiting) {[m
[31m-[m
[31m-            if (++rn->last_connection == r->connections.nelts) {[m
[31m-                rn->last_connection = 0;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_resolver_send_query(r, rn);[m
[31m-[m
[31m-            rn->expire = now + r->resend_timeout;[m
[31m-[m
[31m-            ngx_queue_insert_head(queue, q);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_resolver_resend_empty(ngx_resolver_t *r)[m
[31m-{[m
[31m-    return ngx_queue_empty(&r->name_resend_queue)[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-           && ngx_queue_empty(&r->addr6_resend_queue)[m
[31m-#endif[m
[31m-           && ngx_queue_empty(&r->addr_resend_queue);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_udp_read(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t                     n;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-    u_char                      buf[NGX_RESOLVER_UDP_SIZE];[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    rec = c->data;[m
[31m-[m
[31m-    do {[m
[31m-        n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE);[m
[31m-[m
[31m-        if (n < 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_process_response(rec->resolver, buf, n, 0);[m
[31m-[m
[31m-    } while (rev->ready);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_tcp_write(ngx_event_t *wev)[m
[31m-{[m
[31m-    off_t                       sent;[m
[31m-    ssize_t                     n;[m
[31m-    ngx_buf_t                  *b;[m
[31m-    ngx_resolver_t             *r;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    rec = c->data;[m
[31m-    b = rec->write_buf;[m
[31m-    r = rec->resolver;[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    sent = c->sent;[m
[31m-[m
[31m-    while (wev->ready && b->pos < b->last) {[m
[31m-        n = ngx_send(c, b->pos, b->last - b->pos);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        b->pos += n;[m
[31m-    }[m
[31m-[m
[31m-    if (b->pos != b->start) {[m
[31m-        b->last = ngx_movemem(b->start, b->pos, b->last - b->pos);[m
[31m-        b->pos = b->start;[m
[31m-    }[m
[31m-[m
[31m-    if (c->sent != sent) {[m
[31m-        ngx_add_timer(wev, (ngx_msec_t) (r->tcp_timeout * 1000));[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    rec->tcp = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_tcp_read(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      size;[m
[31m-    ssize_t                     n;[m
[31m-    u_short                     qlen;[m
[31m-    ngx_buf_t                  *b;[m
[31m-    ngx_resolver_t             *r;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    rec = c->data;[m
[31m-    b = rec->read_buf;[m
[31m-    r = rec->resolver;[m
[31m-[m
[31m-    while (rev->ready) {[m
[31m-        n = ngx_recv(c, b->last, b->end - b->last);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        b->last += n;[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            p = b->pos;[m
[31m-            size = b->last - p;[m
[31m-[m
[31m-            if (size < 2) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            qlen = (u_short) *p++ << 8;[m
[31m-            qlen += *p++;[m
[31m-[m
[31m-            if (size < (size_t) (2 + qlen)) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ngx_resolver_process_response(r, p, qlen, 1);[m
[31m-[m
[31m-            b->pos += 2 + qlen;[m
[31m-        }[m
[31m-[m
[31m-        if (b->pos != b->start) {[m
[31m-            b->last = ngx_movemem(b->start, b->pos, b->last - b->pos);[m
[31m-            b->pos = b->start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    rec->tcp = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t tcp)[m
[31m-{[m
[31m-    char                 *err;[m
[31m-    ngx_uint_t            i, times, ident, qident, flags, code, nqs, nan, trunc,[m
[31m-                          qtype, qclass;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t            qident6;[m
[31m-#endif[m
[31m-    ngx_queue_t          *q;[m
[31m-    ngx_resolver_qs_t    *qs;[m
[31m-    ngx_resolver_hdr_t   *response;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    if (n < sizeof(ngx_resolver_hdr_t)) {[m
[31m-        goto short_response;[m
[31m-    }[m
[31m-[m
[31m-    response = (ngx_resolver_hdr_t *) buf;[m
[31m-[m
[31m-    ident = (response->ident_hi << 8) + response->ident_lo;[m
[31m-    flags = (response->flags_hi << 8) + response->flags_lo;[m
[31m-    nqs = (response->nqs_hi << 8) + response->nqs_lo;[m
[31m-    nan = (response->nan_hi << 8) + response->nan_lo;[m
[31m-    trunc = flags & 0x0200;[m
[31m-[m
[31m-    ngx_log_debug6(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver DNS response %ui fl:%04Xi %ui/%ui/%ud/%ud",[m
[31m-                   ident, flags, nqs, nan,[m
[31m-                   (response->nns_hi << 8) + response->nns_lo,[m
[31m-                   (response->nar_hi << 8) + response->nar_lo);[m
[31m-[m
[31m-    /* response to a standard query */[m
[31m-    if ((flags & 0xf870) != 0x8000 || (trunc && tcp)) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "invalid %s DNS response %ui fl:%04Xi",[m
[31m-                      tcp ? "TCP" : "UDP", ident, flags);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    code = flags & 0xf;[m
[31m-[m
[31m-    if (code == NGX_RESOLVE_FORMERR) {[m
[31m-[m
[31m-        times = 0;[m
[31m-[m
[31m-        for (q = ngx_queue_head(&r->name_resend_queue);[m
[31m-             q != ngx_queue_sentinel(&r->name_resend_queue) && times++ < 100;[m
[31m-             q = ngx_queue_next(q))[m
[31m-        {[m
[31m-            rn = ngx_queue_data(q, ngx_resolver_node_t, queue);[m
[31m-            qident = (rn->query[0] << 8) + rn->query[1];[m
[31m-[m
[31m-            if (qident == ident) {[m
[31m-                goto dns_error_name;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            if (rn->query6) {[m
[31m-                qident6 = (rn->query6[0] << 8) + rn->query6[1];[m
[31m-[m
[31m-                if (qident6 == ident) {[m
[31m-                    goto dns_error_name;[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        goto dns_error;[m
[31m-    }[m
[31m-[m
[31m-    if (code > NGX_RESOLVE_REFUSED) {[m
[31m-        goto dns_error;[m
[31m-    }[m
[31m-[m
[31m-    if (nqs != 1) {[m
[31m-        err = "invalid number of questions in DNS response";[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    i = sizeof(ngx_resolver_hdr_t);[m
[31m-[m
[31m-    while (i < (ngx_uint_t) n) {[m
[31m-        if (buf[i] == '\0') {[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        i += 1 + buf[i];[m
[31m-    }[m
[31m-[m
[31m-    goto short_response;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (i++ == sizeof(ngx_resolver_hdr_t)) {[m
[31m-        err = "zero-length domain name in DNS response";[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (i + sizeof(ngx_resolver_qs_t) + nan * (2 + sizeof(ngx_resolver_an_t))[m
[31m-        > (ngx_uint_t) n)[m
[31m-    {[m
[31m-        goto short_response;[m
[31m-    }[m
[31m-[m
[31m-    qs = (ngx_resolver_qs_t *) &buf[i];[m
[31m-[m
[31m-    qtype = (qs->type_hi << 8) + qs->type_lo;[m
[31m-    qclass = (qs->class_hi << 8) + qs->class_lo;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver DNS response qt:%ui cl:%ui", qtype, qclass);[m
[31m-[m
[31m-    if (qclass != 1) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unknown query class %ui in DNS response", qclass);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    switch (qtype) {[m
[31m-[m
[31m-    case NGX_RESOLVE_A:[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case NGX_RESOLVE_AAAA:[m
[31m-#endif[m
[31m-[m
[31m-        ngx_resolver_process_a(r, buf, n, ident, code, qtype, nan, trunc,[m
[31m-                               i + sizeof(ngx_resolver_qs_t));[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_RESOLVE_SRV:[m
[31m-[m
[31m-        ngx_resolver_process_srv(r, buf, n, ident, code, nan, trunc,[m
[31m-                                 i + sizeof(ngx_resolver_qs_t));[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_RESOLVE_PTR:[m
[31m-[m
[31m-        ngx_resolver_process_ptr(r, buf, n, ident, code, nan);[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unknown query type %ui in DNS response", qtype);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-short_response:[m
[31m-[m
[31m-    err = "short DNS response";[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-dns_error_name:[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "DNS error (%ui: %s), query id:%ui, name:\"%*s\"",[m
[31m-                  code, ngx_resolver_strerror(code), ident,[m
[31m-                  (size_t) rn->nlen, rn->name);[m
[31m-    return;[m
[31m-[m
[31m-dns_error:[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "DNS error (%ui: %s), query id:%ui",[m
[31m-                  code, ngx_resolver_strerror(code), ident);[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,[m
[31m-    ngx_uint_t nan, ngx_uint_t trunc, ngx_uint_t ans)[m
[31m-{[m
[31m-    char                       *err;[m
[31m-    u_char                     *cname;[m
[31m-    size_t                      len;[m
[31m-    int32_t                     ttl;[m
[31m-    uint32_t                    hash;[m
[31m-    in_addr_t                  *addr;[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_uint_t                  type, class, qident, naddrs, a, i, j, start;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct in6_addr            *addr6;[m
[31m-#endif[m
[31m-    ngx_resolver_an_t          *an;[m
[31m-    ngx_resolver_ctx_t         *ctx, *next;[m
[31m-    ngx_resolver_node_t        *rn;[m
[31m-    ngx_resolver_addr_t        *addrs;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    if (ngx_resolver_copy(r, &name, buf,[m
[31m-                          buf + sizeof(ngx_resolver_hdr_t), buf + n)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);[m
[31m-[m
[31m-    hash = ngx_crc32_short(name.data, name.len);[m
[31m-[m
[31m-    /* lock name mutex */[m
[31m-[m
[31m-    rn = ngx_resolver_lookup_name(r, &name, hash);[m
[31m-[m
[31m-    if (rn == NULL) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unexpected response for %V", &name);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    switch (qtype) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-        if (rn->query6 == NULL || rn->naddrs6 != (u_short) -1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected response for %V", &name);[m
[31m-            ngx_resolver_free(r, name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (trunc && rn->tcp6) {[m
[31m-            ngx_resolver_free(r, name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        qident = (rn->query6[0] << 8) + rn->query6[1];[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-        if (rn->query == NULL || rn->naddrs != (u_short) -1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected response for %V", &name);[m
[31m-            ngx_resolver_free(r, name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (trunc && rn->tcp) {[m
[31m-            ngx_resolver_free(r, name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        qident = (rn->query[0] << 8) + rn->query[1];[m
[31m-    }[m
[31m-[m
[31m-    if (ident != qident) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "wrong ident %ui response for %V, expect %ui",[m
[31m-                      ident, &name, qident);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    if (trunc) {[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        if (rn->waiting == NULL) {[m
[31m-            ngx_rbtree_delete(&r->name_rbtree, &rn->node);[m
[31m-            ngx_resolver_free_node(r, rn);[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        rec = r->connections.elts;[m
[31m-        rec = &rec[rn->last_connection];[m
[31m-[m
[31m-        switch (qtype) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            rn->tcp6 = 1;[m
[31m-[m
[31m-            (void) ngx_resolver_send_tcp_query(r, rec, rn->query6, rn->qlen);[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-            rn->tcp = 1;[m
[31m-[m
[31m-            (void) ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen);[m
[31m-        }[m
[31m-[m
[31m-        rn->expire = ngx_time() + r->resend_timeout;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->name_resend_queue, &rn->queue);[m
[31m-[m
[31m-        goto next;[m
[31m-    }[m
[31m-[m
[31m-    if (code == 0 && rn->code) {[m
[31m-        code = rn->code;[m
[31m-    }[m
[31m-[m
[31m-    if (code == 0 && nan == 0) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        switch (qtype) {[m
[31m-[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            rn->naddrs6 = 0;[m
[31m-[m
[31m-            if (rn->naddrs == (u_short) -1) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (rn->naddrs) {[m
[31m-                goto export;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-            rn->naddrs = 0;[m
[31m-[m
[31m-            if (rn->naddrs6 == (u_short) -1) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (rn->naddrs6) {[m
[31m-                goto export;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        code = NGX_RESOLVE_NXDOMAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (code) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        switch (qtype) {[m
[31m-[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            rn->naddrs6 = 0;[m
[31m-[m
[31m-            if (rn->naddrs == (u_short) -1) {[m
[31m-                rn->code = (u_char) code;[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-            rn->naddrs = 0;[m
[31m-[m
[31m-            if (rn->naddrs6 == (u_short) -1) {[m
[31m-                rn->code = (u_char) code;[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        ngx_rbtree_delete(&r->name_rbtree, &rn->node);[m
[31m-[m
[31m-        /* unlock name mutex */[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            ctx->state = code;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    i = ans;[m
[31m-    naddrs = 0;[m
[31m-    cname = NULL;[m
[31m-[m
[31m-    for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-        start = i;[m
[31m-[m
[31m-        while (i < n) {[m
[31m-[m
[31m-            if (buf[i] & 0xc0) {[m
[31m-                i += 2;[m
[31m-                goto found;[m
[31m-            }[m
[31m-[m
[31m-            if (buf[i] == 0) {[m
[31m-                i++;[m
[31m-                goto test_length;[m
[31m-            }[m
[31m-[m
[31m-            i += 1 + buf[i];[m
[31m-        }[m
[31m-[m
[31m-        goto short_response;[m
[31m-[m
[31m-    test_length:[m
[31m-[m
[31m-        if (i - start < 2) {[m
[31m-            err = "invalid name in DNS response";[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        if (i + sizeof(ngx_resolver_an_t) >= n) {[m
[31m-            goto short_response;[m
[31m-        }[m
[31m-[m
[31m-        an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-        type = (an->type_hi << 8) + an->type_lo;[m
[31m-        class = (an->class_hi << 8) + an->class_lo;[m
[31m-        len = (an->len_hi << 8) + an->len_lo;[m
[31m-        ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)[m
[31m-            + (an->ttl[2] << 8) + (an->ttl[3]);[m
[31m-[m
[31m-        if (class != 1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR class %ui", class);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ttl < 0) {[m
[31m-            ttl = 0;[m
[31m-        }[m
[31m-[m
[31m-        rn->ttl = ngx_min(rn->ttl, (uint32_t) ttl);[m
[31m-[m
[31m-        i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-        switch (type) {[m
[31m-[m
[31m-        case NGX_RESOLVE_A:[m
[31m-[m
[31m-            if (qtype != NGX_RESOLVE_A) {[m
[31m-                err = "unexpected A record in DNS response";[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (len != 4) {[m
[31m-                err = "invalid A record in DNS response";[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (i + 4 > n) {[m
[31m-                goto short_response;[m
[31m-            }[m
[31m-[m
[31m-            naddrs++;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            if (qtype != NGX_RESOLVE_AAAA) {[m
[31m-                err = "unexpected AAAA record in DNS response";[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (len != 16) {[m
[31m-                err = "invalid AAAA record in DNS response";[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (i + 16 > n) {[m
[31m-                goto short_response;[m
[31m-            }[m
[31m-[m
[31m-            naddrs++;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        case NGX_RESOLVE_CNAME:[m
[31m-[m
[31m-            cname = &buf[i];[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_RESOLVE_DNAME:[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR type %ui", type);[m
[31m-        }[m
[31m-[m
[31m-        i += len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver naddrs:%ui cname:%p ttl:%uD",[m
[31m-                   naddrs, cname, rn->ttl);[m
[31m-[m
[31m-    if (naddrs) {[m
[31m-[m
[31m-        switch (qtype) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            if (naddrs == 1) {[m
[31m-                addr6 = &rn->u6.addr6;[m
[31m-                rn->naddrs6 = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                addr6 = ngx_resolver_alloc(r, naddrs * sizeof(struct in6_addr));[m
[31m-                if (addr6 == NULL) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                rn->u6.addrs6 = addr6;[m
[31m-                rn->naddrs6 = (u_short) naddrs;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-            addr = NULL;[m
[31m-#endif[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-            if (naddrs == 1) {[m
[31m-                addr = &rn->u.addr;[m
[31m-                rn->naddrs = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                addr = ngx_resolver_alloc(r, naddrs * sizeof(in_addr_t));[m
[31m-                if (addr == NULL) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                rn->u.addrs = addr;[m
[31m-                rn->naddrs = (u_short) naddrs;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_SUPPRESS_WARN)[m
[31m-            addr6 = NULL;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        j = 0;[m
[31m-        i = ans;[m
[31m-[m
[31m-        for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-            for ( ;; ) {[m
[31m-[m
[31m-                if (buf[i] & 0xc0) {[m
[31m-                    i += 2;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (buf[i] == 0) {[m
[31m-                    i++;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                i += 1 + buf[i];[m
[31m-            }[m
[31m-[m
[31m-            an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-            type = (an->type_hi << 8) + an->type_lo;[m
[31m-            len = (an->len_hi << 8) + an->len_lo;[m
[31m-[m
[31m-            i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-            if (type == NGX_RESOLVE_A) {[m
[31m-[m
[31m-                addr[j] = htonl((buf[i] << 24) + (buf[i + 1] << 16)[m
[31m-                                + (buf[i + 2] << 8) + (buf[i + 3]));[m
[31m-[m
[31m-                if (++j == naddrs) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-                    if (rn->naddrs6 == (u_short) -1) {[m
[31m-                        goto next;[m
[31m-                    }[m
[31m-#endif[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            else if (type == NGX_RESOLVE_AAAA) {[m
[31m-[m
[31m-                ngx_memcpy(addr6[j].s6_addr, &buf[i], 16);[m
[31m-[m
[31m-                if (++j == naddrs) {[m
[31m-[m
[31m-                    if (rn->naddrs == (u_short) -1) {[m
[31m-                        goto next;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            i += len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (qtype) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-        if (rn->naddrs6 == (u_short) -1) {[m
[31m-            rn->naddrs6 = 0;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-        if (rn->naddrs == (u_short) -1) {[m
[31m-            rn->naddrs = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rn->naddrs != (u_short) -1[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        && rn->naddrs6 != (u_short) -1[m
[31m-#endif[m
[31m-        && rn->naddrs[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-           + rn->naddrs6[m
[31m-#endif[m
[31m-           > 0)[m
[31m-    {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    export:[m
[31m-#endif[m
[31m-[m
[31m-        naddrs = rn->naddrs;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        naddrs += rn->naddrs6;[m
[31m-#endif[m
[31m-[m
[31m-        if (naddrs == 1 && rn->naddrs == 1) {[m
[31m-            addrs = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            addrs = ngx_resolver_export(r, rn, 0);[m
[31m-            if (addrs == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);[m
[31m-        rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);[m
[31m-[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        /* unlock name mutex */[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            ctx->state = NGX_OK;[m
[31m-            ctx->valid = rn->valid;[m
[31m-            ctx->naddrs = naddrs;[m
[31m-[m
[31m-            if (addrs == NULL) {[m
[31m-                ctx->addrs = &ctx->addr;[m
[31m-                ctx->addr.sockaddr = (struct sockaddr *) &ctx->sin;[m
[31m-                ctx->addr.socklen = sizeof(struct sockaddr_in);[m
[31m-                ngx_memzero(&ctx->sin, sizeof(struct sockaddr_in));[m
[31m-                ctx->sin.sin_family = AF_INET;[m
[31m-                ctx->sin.sin_addr.s_addr = rn->u.addr;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->addrs = addrs;[m
[31m-            }[m
[31m-[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-        }[m
[31m-[m
[31m-        if (addrs != NULL) {[m
[31m-            ngx_resolver_free(r, addrs->sockaddr);[m
[31m-            ngx_resolver_free(r, addrs);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (cname) {[m
[31m-[m
[31m-        /* CNAME only */[m
[31m-[m
[31m-        if (rn->naddrs == (u_short) -1[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            || rn->naddrs6 == (u_short) -1[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_resolver_copy(r, &name, buf, cname, buf + n) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                       "resolver cname:\"%V\"", &name);[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        rn->cnlen = (u_short) name.len;[m
[31m-        rn->u.cname = name.data;[m
[31m-[m
[31m-        rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);[m
[31m-        rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ctx = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        if (ctx) {[m
[31m-[m
[31m-            if (ctx->recursion++ >= NGX_RESOLVER_MAX_RECURSION) {[m
[31m-[m
[31m-                /* unlock name mutex */[m
[31m-[m
[31m-                do {[m
[31m-                    ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-                    next = ctx->next;[m
[31m-[m
[31m-                    ctx->handler(ctx);[m
[31m-[m
[31m-                    ctx = next;[m
[31m-                } while (ctx);[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            for (next = ctx; next; next = next->next) {[m
[31m-                next->node = NULL;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_resolve_name_locked(r, ctx, &name);[m
[31m-        }[m
[31m-[m
[31m-        /* unlock name mutex */[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "no A or CNAME types in DNS response");[m
[31m-    return;[m
[31m-[m
[31m-short_response:[m
[31m-[m
[31m-    err = "short DNS response";[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-next:[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_process_srv(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan,[m
[31m-    ngx_uint_t trunc, ngx_uint_t ans)[m
[31m-{[m
[31m-    char                       *err;[m
[31m-    u_char                     *cname;[m
[31m-    size_t                      len;[m
[31m-    int32_t                     ttl;[m
[31m-    uint32_t                    hash;[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_uint_t                  type, qident, class, start, nsrvs, a, i, j;[m
[31m-    ngx_resolver_an_t          *an;[m
[31m-    ngx_resolver_ctx_t         *ctx, *next;[m
[31m-    ngx_resolver_srv_t         *srvs;[m
[31m-    ngx_resolver_node_t        *rn;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    if (ngx_resolver_copy(r, &name, buf,[m
[31m-                          buf + sizeof(ngx_resolver_hdr_t), buf + n)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);[m
[31m-[m
[31m-    hash = ngx_crc32_short(name.data, name.len);[m
[31m-[m
[31m-    rn = ngx_resolver_lookup_srv(r, &name, hash);[m
[31m-[m
[31m-    if (rn == NULL || rn->query == NULL) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unexpected response for %V", &name);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (trunc && rn->tcp) {[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    qident = (rn->query[0] << 8) + rn->query[1];[m
[31m-[m
[31m-    if (ident != qident) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "wrong ident %ui response for %V, expect %ui",[m
[31m-                      ident, &name, qident);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    if (trunc) {[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        if (rn->waiting == NULL) {[m
[31m-            ngx_rbtree_delete(&r->srv_rbtree, &rn->node);[m
[31m-            ngx_resolver_free_node(r, rn);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rec = r->connections.elts;[m
[31m-        rec = &rec[rn->last_connection];[m
[31m-[m
[31m-        rn->tcp = 1;[m
[31m-[m
[31m-        (void) ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen);[m
[31m-[m
[31m-        rn->expire = ngx_time() + r->resend_timeout;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->srv_resend_queue, &rn->queue);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (code == 0 && rn->code) {[m
[31m-        code = rn->code;[m
[31m-    }[m
[31m-[m
[31m-    if (code == 0 && nan == 0) {[m
[31m-        code = NGX_RESOLVE_NXDOMAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (code) {[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        ngx_rbtree_delete(&r->srv_rbtree, &rn->node);[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            ctx->state = code;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    i = ans;[m
[31m-    nsrvs = 0;[m
[31m-    cname = NULL;[m
[31m-[m
[31m-    for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-        start = i;[m
[31m-[m
[31m-        while (i < n) {[m
[31m-[m
[31m-            if (buf[i] & 0xc0) {[m
[31m-                i += 2;[m
[31m-                goto found;[m
[31m-            }[m
[31m-[m
[31m-            if (buf[i] == 0) {[m
[31m-                i++;[m
[31m-                goto test_length;[m
[31m-            }[m
[31m-[m
[31m-            i += 1 + buf[i];[m
[31m-        }[m
[31m-[m
[31m-        goto short_response;[m
[31m-[m
[31m-    test_length:[m
[31m-[m
[31m-        if (i - start < 2) {[m
[31m-            err = "invalid name DNS response";[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        if (i + sizeof(ngx_resolver_an_t) >= n) {[m
[31m-            goto short_response;[m
[31m-        }[m
[31m-[m
[31m-        an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-        type = (an->type_hi << 8) + an->type_lo;[m
[31m-        class = (an->class_hi << 8) + an->class_lo;[m
[31m-        len = (an->len_hi << 8) + an->len_lo;[m
[31m-        ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)[m
[31m-            + (an->ttl[2] << 8) + (an->ttl[3]);[m
[31m-[m
[31m-        if (class != 1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR class %ui", class);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ttl < 0) {[m
[31m-            ttl = 0;[m
[31m-        }[m
[31m-[m
[31m-        rn->ttl = ngx_min(rn->ttl, (uint32_t) ttl);[m
[31m-[m
[31m-        i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-        switch (type) {[m
[31m-[m
[31m-        case NGX_RESOLVE_SRV:[m
[31m-[m
[31m-            if (i + 6 > n) {[m
[31m-                goto short_response;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_resolver_copy(r, NULL, buf, &buf[i + 6], buf + n)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            nsrvs++;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_RESOLVE_CNAME:[m
[31m-[m
[31m-            cname = &buf[i];[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_RESOLVE_DNAME:[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR type %ui", type);[m
[31m-        }[m
[31m-[m
[31m-        i += len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver nsrvs:%ui cname:%p ttl:%uD",[m
[31m-                   nsrvs, cname, rn->ttl);[m
[31m-[m
[31m-    if (nsrvs) {[m
[31m-[m
[31m-        srvs = ngx_resolver_calloc(r, nsrvs * sizeof(ngx_resolver_srv_t));[m
[31m-        if (srvs == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        rn->u.srvs = srvs;[m
[31m-        rn->nsrvs = (u_short) nsrvs;[m
[31m-[m
[31m-        j = 0;[m
[31m-        i = ans;[m
[31m-[m
[31m-        for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-            for ( ;; ) {[m
[31m-[m
[31m-                if (buf[i] & 0xc0) {[m
[31m-                    i += 2;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (buf[i] == 0) {[m
[31m-                    i++;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                i += 1 + buf[i];[m
[31m-            }[m
[31m-[m
[31m-            an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-            type = (an->type_hi << 8) + an->type_lo;[m
[31m-            len = (an->len_hi << 8) + an->len_lo;[m
[31m-[m
[31m-            i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-            if (type == NGX_RESOLVE_SRV) {[m
[31m-[m
[31m-                srvs[j].priority = (buf[i] << 8) + buf[i + 1];[m
[31m-                srvs[j].weight = (buf[i + 2] << 8) + buf[i + 3];[m
[31m-[m
[31m-                if (srvs[j].weight == 0) {[m
[31m-                    srvs[j].weight = 1;[m
[31m-                }[m
[31m-[m
[31m-                srvs[j].port = (buf[i + 4] << 8) + buf[i + 5];[m
[31m-[m
[31m-                if (ngx_resolver_copy(r, &srvs[j].name, buf, &buf[i + 6],[m
[31m-                                      buf + n)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                j++;[m
[31m-            }[m
[31m-[m
[31m-            i += len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_sort(srvs, nsrvs, sizeof(ngx_resolver_srv_t),[m
[31m-                 ngx_resolver_cmp_srvs);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);[m
[31m-        rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->srv_expire_queue, &rn->queue);[m
[31m-[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ngx_resolver_resolve_srv_names(ctx, rn);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rn->nsrvs = 0;[m
[31m-[m
[31m-    if (cname) {[m
[31m-[m
[31m-        /* CNAME only */[m
[31m-[m
[31m-        if (ngx_resolver_copy(r, &name, buf, cname, buf + n) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                       "resolver cname:\"%V\"", &name);[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        rn->cnlen = (u_short) name.len;[m
[31m-        rn->u.cname = name.data;[m
[31m-[m
[31m-        rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);[m
[31m-        rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->srv_expire_queue, &rn->queue);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ctx = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        if (ctx) {[m
[31m-[m
[31m-            if (ctx->recursion++ >= NGX_RESOLVER_MAX_RECURSION) {[m
[31m-[m
[31m-                /* unlock name mutex */[m
[31m-[m
[31m-                do {[m
[31m-                    ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-                    next = ctx->next;[m
[31m-[m
[31m-                    ctx->handler(ctx);[m
[31m-[m
[31m-                    ctx = next;[m
[31m-                } while (ctx);[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            for (next = ctx; next; next = next->next) {[m
[31m-                next->node = NULL;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_resolve_name_locked(r, ctx, &name);[m
[31m-        }[m
[31m-[m
[31m-        /* unlock name mutex */[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, "no SRV type in DNS response");[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-short_response:[m
[31m-[m
[31m-    err = "short DNS response";[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx, ngx_resolver_node_t *rn)[m
[31m-{[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_resolver_t           *r;[m
[31m-    ngx_resolver_ctx_t       *cctx;[m
[31m-    ngx_resolver_srv_name_t  *srvs;[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    ctx->node = NULL;[m
[31m-    ctx->state = NGX_OK;[m
[31m-    ctx->valid = rn->valid;[m
[31m-    ctx->count = rn->nsrvs;[m
[31m-[m
[31m-    srvs = ngx_resolver_calloc(r, rn->nsrvs * sizeof(ngx_resolver_srv_name_t));[m
[31m-    if (srvs == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ctx->srvs = srvs;[m
[31m-    ctx->nsrvs = rn->nsrvs;[m
[31m-[m
[31m-    for (i = 0; i < rn->nsrvs; i++) {[m
[31m-        srvs[i].name.data = ngx_resolver_alloc(r, rn->u.srvs[i].name.len);[m
[31m-        if (srvs[i].name.data == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        srvs[i].name.len = rn->u.srvs[i].name.len;[m
[31m-        ngx_memcpy(srvs[i].name.data, rn->u.srvs[i].name.data,[m
[31m-                   srvs[i].name.len);[m
[31m-[m
[31m-        cctx = ngx_resolve_start(r, NULL);[m
[31m-        if (cctx == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        cctx->name = srvs[i].name;[m
[31m-        cctx->handler = ngx_resolver_srv_names_handler;[m
[31m-        cctx->data = ctx;[m
[31m-        cctx->srvs = &srvs[i];[m
[31m-        cctx->timeout = 0;[m
[31m-[m
[31m-        srvs[i].priority = rn->u.srvs[i].priority;[m
[31m-        srvs[i].weight = rn->u.srvs[i].weight;[m
[31m-        srvs[i].port = rn->u.srvs[i].port;[m
[31m-        srvs[i].ctx = cctx;[m
[31m-[m
[31m-        if (ngx_resolve_name(cctx) == NGX_ERROR) {[m
[31m-            srvs[i].ctx = NULL;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ctx->state = NGX_ERROR;[m
[31m-    ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-    ctx->handler(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)[m
[31m-{[m
[31m-    ngx_uint_t                 i;[m
[31m-    u_char                   (*sockaddr)[NGX_SOCKADDRLEN];[m
[31m-    ngx_addr_t                *addrs;[m
[31m-    ngx_resolver_t            *r;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-    ngx_resolver_ctx_t        *ctx;[m
[31m-    ngx_resolver_srv_name_t   *srv;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    r = cctx->resolver;[m
[31m-    ctx = cctx->data;[m
[31m-    srv = cctx->srvs;[m
[31m-[m
[31m-    ctx->count--;[m
[31m-[m
[31m-    srv->ctx = NULL;[m
[31m-[m
[31m-    if (cctx->naddrs) {[m
[31m-[m
[31m-        ctx->valid = ngx_min(ctx->valid, cctx->valid);[m
[31m-[m
[31m-        addrs = ngx_resolver_calloc(r, cctx->naddrs * sizeof(ngx_addr_t));[m
[31m-        if (addrs == NULL) {[m
[31m-            ngx_resolve_name_done(cctx);[m
[31m-[m
[31m-            ctx->state = NGX_ERROR;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sockaddr = ngx_resolver_alloc(r, cctx->naddrs * NGX_SOCKADDRLEN);[m
[31m-        if (sockaddr == NULL) {[m
[31m-            ngx_resolver_free(r, addrs);[m
[31m-            ngx_resolve_name_done(cctx);[m
[31m-[m
[31m-            ctx->state = NGX_ERROR;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < cctx->naddrs; i++) {[m
[31m-            addrs[i].sockaddr = (struct sockaddr *) sockaddr[i];[m
[31m-            addrs[i].socklen = cctx->addrs[i].socklen;[m
[31m-[m
[31m-            ngx_memcpy(sockaddr[i], cctx->addrs[i].sockaddr,[m
[31m-                       addrs[i].socklen);[m
[31m-[m
[31m-            switch (addrs[i].sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                sin6 = (struct sockaddr_in6 *) addrs[i].sockaddr;[m
[31m-                sin6->sin6_port = htons(srv->port);[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                sin = (struct sockaddr_in *) addrs[i].sockaddr;[m
[31m-                sin->sin_port = htons(srv->port);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        srv->addrs = addrs;[m
[31m-        srv->naddrs = cctx->naddrs;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(cctx);[m
[31m-[m
[31m-    if (ctx->count == 0) {[m
[31m-        ngx_resolver_report_srv(r, ctx);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan)[m
[31m-{[m
[31m-    char                 *err;[m
[31m-    size_t                len;[m
[31m-    in_addr_t             addr;[m
[31m-    int32_t               ttl;[m
[31m-    ngx_int_t             octet;[m
[31m-    ngx_str_t             name;[m
[31m-    ngx_uint_t            mask, type, class, qident, a, i, start;[m
[31m-    ngx_queue_t          *expire_queue;[m
[31m-    ngx_rbtree_t         *tree;[m
[31m-    ngx_resolver_an_t    *an;[m
[31m-    ngx_resolver_ctx_t   *ctx, *next;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    uint32_t              hash;[m
[31m-    ngx_int_t             digit;[m
[31m-    struct in6_addr       addr6;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_resolver_copy(r, &name, buf,[m
[31m-                          buf + sizeof(ngx_resolver_hdr_t), buf + n)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);[m
[31m-[m
[31m-    /* AF_INET */[m
[31m-[m
[31m-    addr = 0;[m
[31m-    i = sizeof(ngx_resolver_hdr_t);[m
[31m-[m
[31m-    for (mask = 0; mask < 32; mask += 8) {[m
[31m-        len = buf[i++];[m
[31m-[m
[31m-        octet = ngx_atoi(&buf[i], len);[m
[31m-        if (octet == NGX_ERROR || octet > 255) {[m
[31m-            goto invalid_in_addr_arpa;[m
[31m-        }[m
[31m-[m
[31m-        addr += octet << mask;[m
[31m-        i += len;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcasecmp(&buf[i], (u_char *) "\7in-addr\4arpa") == 0) {[m
[31m-        i += sizeof("\7in-addr\4arpa");[m
[31m-[m
[31m-        /* lock addr mutex */[m
[31m-[m
[31m-        rn = ngx_resolver_lookup_addr(r, addr);[m
[31m-[m
[31m-        tree = &r->addr_rbtree;[m
[31m-        expire_queue = &r->addr_expire_queue;[m
[31m-[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-invalid_in_addr_arpa:[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    i = sizeof(ngx_resolver_hdr_t);[m
[31m-[m
[31m-    for (octet = 15; octet >= 0; octet--) {[m
[31m-        if (buf[i++] != '\1') {[m
[31m-            goto invalid_ip6_arpa;[m
[31m-        }[m
[31m-[m
[31m-        digit = ngx_hextoi(&buf[i++], 1);[m
[31m-        if (digit == NGX_ERROR) {[m
[31m-            goto invalid_ip6_arpa;[m
[31m-        }[m
[31m-[m
[31m-        addr6.s6_addr[octet] = (u_char) digit;[m
[31m-[m
[31m-        if (buf[i++] != '\1') {[m
[31m-            goto invalid_ip6_arpa;[m
[31m-        }[m
[31m-[m
[31m-        digit = ngx_hextoi(&buf[i++], 1);[m
[31m-        if (digit == NGX_ERROR) {[m
[31m-            goto invalid_ip6_arpa;[m
[31m-        }[m
[31m-[m
[31m-        addr6.s6_addr[octet] += (u_char) (digit * 16);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcasecmp(&buf[i], (u_char *) "\3ip6\4arpa") == 0) {[m
[31m-        i += sizeof("\3ip6\4arpa");[m
[31m-[m
[31m-        /* lock addr mutex */[m
[31m-[m
[31m-        hash = ngx_crc32_short(addr6.s6_addr, 16);[m
[31m-        rn = ngx_resolver_lookup_addr6(r, &addr6, hash);[m
[31m-[m
[31m-        tree = &r->addr6_rbtree;[m
[31m-        expire_queue = &r->addr6_expire_queue;[m
[31m-[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-invalid_ip6_arpa:[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "invalid in-addr.arpa or ip6.arpa name in DNS response");[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-    return;[m
[31m-[m
[31m-valid:[m
[31m-[m
[31m-    if (rn == NULL || rn->query == NULL) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unexpected response for %V", &name);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    qident = (rn->query[0] << 8) + rn->query[1];[m
[31m-[m
[31m-    if (ident != qident) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "wrong ident %ui response for %V, expect %ui",[m
[31m-                      ident, &name, qident);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    if (code == 0 && nan == 0) {[m
[31m-        code = NGX_RESOLVE_NXDOMAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (code) {[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        /* unlock addr mutex */[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            ctx->state = code;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    i += sizeof(ngx_resolver_qs_t);[m
[31m-[m
[31m-    for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-        start = i;[m
[31m-[m
[31m-        while (i < n) {[m
[31m-[m
[31m-            if (buf[i] & 0xc0) {[m
[31m-                i += 2;[m
[31m-                goto found;[m
[31m-            }[m
[31m-[m
[31m-            if (buf[i] == 0) {[m
[31m-                i++;[m
[31m-                goto test_length;[m
[31m-            }[m
[31m-[m
[31m-            i += 1 + buf[i];[m
[31m-        }[m
[31m-[m
[31m-        goto short_response;[m
[31m-[m
[31m-    test_length:[m
[31m-[m
[31m-        if (i - start < 2) {[m
[31m-            err = "invalid name in DNS response";[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        if (i + sizeof(ngx_resolver_an_t) >= n) {[m
[31m-            goto short_response;[m
[31m-        }[m
[31m-[m
[31m-        an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-        type = (an->type_hi << 8) + an->type_lo;[m
[31m-        class = (an->class_hi << 8) + an->class_lo;[m
[31m-        len = (an->len_hi << 8) + an->len_lo;[m
[31m-        ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)[m
[31m-            + (an->ttl[2] << 8) + (an->ttl[3]);[m
[31m-[m
[31m-        if (class != 1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR class %ui", class);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ttl < 0) {[m
[31m-            ttl = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                      "resolver qt:%ui cl:%ui len:%uz",[m
[31m-                      type, class, len);[m
[31m-[m
[31m-        i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-        switch (type) {[m
[31m-[m
[31m-        case NGX_RESOLVE_PTR:[m
[31m-[m
[31m-            goto ptr;[m
[31m-[m
[31m-        case NGX_RESOLVE_CNAME:[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR type %ui", type);[m
[31m-        }[m
[31m-[m
[31m-        i += len;[m
[31m-    }[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "no PTR type in DNS response");[m
[31m-    return;[m
[31m-[m
[31m-ptr:[m
[31m-[m
[31m-    if (ngx_resolver_copy(r, &name, buf, buf + i, buf + n) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver an:%V", &name);[m
[31m-[m
[31m-    if (name.len != (size_t) rn->nlen[m
[31m-        || ngx_strncmp(name.data, rn->name, name.len) != 0)[m
[31m-    {[m
[31m-        if (rn->nlen) {[m
[31m-            ngx_resolver_free(r, rn->name);[m
[31m-        }[m
[31m-[m
[31m-        rn->nlen = (u_short) name.len;[m
[31m-        rn->name = name.data;[m
[31m-[m
[31m-        name.data = ngx_resolver_dup(r, rn->name, name.len);[m
[31m-        if (name.data == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-    rn->valid = ngx_time() + (r->valid ? r->valid : ttl);[m
[31m-    rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-    ngx_queue_insert_head(expire_queue, &rn->queue);[m
[31m-[m
[31m-    next = rn->waiting;[m
[31m-    rn->waiting = NULL;[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    while (next) {[m
[31m-        ctx = next;[m
[31m-        ctx->state = NGX_OK;[m
[31m-        ctx->valid = rn->valid;[m
[31m-        ctx->name = name;[m
[31m-        next = ctx->next;[m
[31m-[m
[31m-        ctx->handler(ctx);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-short_response:[m
[31m-[m
[31m-    err = "short DNS response";[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_resolver_node_t *[m
[31m-ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_rbtree_node_t    *node, *sentinel;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    node = r->name_rbtree.root;[m
[31m-    sentinel = r->name_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        rn = ngx_resolver_node(node);[m
[31m-[m
[31m-        rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return rn;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_resolver_node_t *[m
[31m-ngx_resolver_lookup_srv(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_rbtree_node_t    *node, *sentinel;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    node = r->srv_rbtree.root;[m
[31m-    sentinel = r->srv_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        rn = ngx_resolver_node(node);[m
[31m-[m
[31m-        rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return rn;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_resolver_node_t *[m
[31m-ngx_resolver_lookup_addr(ngx_resolver_t *r, in_addr_t addr)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  *node, *sentinel;[m
[31m-[m
[31m-    node = r->addr_rbtree.root;[m
[31m-    sentinel = r->addr_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (addr < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (addr > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* addr == node->key */[m
[31m-[m
[31m-        return ngx_resolver_node(node);[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_resolver_node_t *[m
[31m-ngx_resolver_lookup_addr6(ngx_resolver_t *r, struct in6_addr *addr,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_rbtree_node_t    *node, *sentinel;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    node = r->addr6_rbtree.root;[m
[31m-    sentinel = r->addr6_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        rn = ngx_resolver_node(node);[m
[31m-[m
[31m-        rc = ngx_memcmp(addr, &rn->addr6, 16);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return rn;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t    **p;[m
[31m-    ngx_resolver_node_t   *rn, *rn_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            rn = ngx_resolver_node(node);[m
[31m-            rn_temp = ngx_resolver_node(temp);[m
[31m-[m
[31m-            p = (ngx_memn2cmp(rn->name, rn_temp->name, rn->nlen, rn_temp->nlen)[m
[31m-                 < 0) ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_rbtree_insert_addr6_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t    **p;[m
[31m-    ngx_resolver_node_t   *rn, *rn_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            rn = ngx_resolver_node(node);[m
[31m-            rn_temp = ngx_resolver_node(temp);[m
[31m-[m
[31m-            p = (ngx_memcmp(&rn->addr6, &rn_temp->addr6, 16)[m
[31m-                 < 0) ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    u_char              *p, *s;[m
[31m-    size_t               len, nlen;[m
[31m-    ngx_uint_t           ident;[m
[31m-    ngx_resolver_qs_t   *qs;[m
[31m-    ngx_resolver_hdr_t  *query;[m
[31m-[m
[31m-    nlen = name->len ? (1 + name->len + 1) : 1;[m
[31m-[m
[31m-    len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    p = ngx_resolver_alloc(r, r->ipv6 ? len * 2 : len);[m
[31m-#else[m
[31m-    p = ngx_resolver_alloc(r, len);[m
[31m-#endif[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rn->qlen = (u_short) len;[m
[31m-    rn->query = p;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (r->ipv6) {[m
[31m-        rn->query6 = p + len;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    query = (ngx_resolver_hdr_t *) p;[m
[31m-[m
[31m-    ident = ngx_random();[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve: \"%V\" A %i", name, ident & 0xffff);[m
[31m-[m
[31m-    query->ident_hi = (u_char) ((ident >> 8) & 0xff);[m
[31m-    query->ident_lo = (u_char) (ident & 0xff);[m
[31m-[m
[31m-    /* recursion query */[m
[31m-    query->flags_hi = 1; query->flags_lo = 0;[m
[31m-[m
[31m-    /* one question */[m
[31m-    query->nqs_hi = 0; query->nqs_lo = 1;[m
[31m-    query->nan_hi = 0; query->nan_lo = 0;[m
[31m-    query->nns_hi = 0; query->nns_lo = 0;[m
[31m-    query->nar_hi = 0; query->nar_lo = 0;[m
[31m-[m
[31m-    p += sizeof(ngx_resolver_hdr_t) + nlen;[m
[31m-[m
[31m-    qs = (ngx_resolver_qs_t *) p;[m
[31m-[m
[31m-    /* query type */[m
[31m-    qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_A;[m
[31m-[m
[31m-    /* IN query class */[m
[31m-    qs->class_hi = 0; qs->class_lo = 1;[m
[31m-[m
[31m-    /* convert "www.example.com" to "\3www\7example\3com\0" */[m
[31m-[m
[31m-    len = 0;[m
[31m-    p--;[m
[31m-    *p-- = '\0';[m
[31m-[m
[31m-    if (name->len == 0)  {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    for (s = name->data + name->len - 1; s >= name->data; s--) {[m
[31m-        if (*s != '.') {[m
[31m-            *p = *s;[m
[31m-            len++;[m
[31m-[m
[31m-        } else {[m
[31m-            if (len == 0 || len > 255) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            *p = (u_char) len;[m
[31m-            len = 0;[m
[31m-        }[m
[31m-[m
[31m-        p--;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 || len > 255) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    *p = (u_char) len;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (!r->ipv6) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = rn->query6;[m
[31m-[m
[31m-    ngx_memcpy(p, rn->query, rn->qlen);[m
[31m-[m
[31m-    query = (ngx_resolver_hdr_t *) p;[m
[31m-[m
[31m-    ident = ngx_random();[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve: \"%V\" AAAA %i", name, ident & 0xffff);[m
[31m-[m
[31m-    query->ident_hi = (u_char) ((ident >> 8) & 0xff);[m
[31m-    query->ident_lo = (u_char) (ident & 0xff);[m
[31m-[m
[31m-    p += sizeof(ngx_resolver_hdr_t) + nlen;[m
[31m-[m
[31m-    qs = (ngx_resolver_qs_t *) p;[m
[31m-[m
[31m-    qs->type_lo = NGX_RESOLVE_AAAA;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_create_srv_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    u_char              *p, *s;[m
[31m-    size_t               len, nlen;[m
[31m-    ngx_uint_t           ident;[m
[31m-    ngx_resolver_qs_t   *qs;[m
[31m-    ngx_resolver_hdr_t  *query;[m
[31m-[m
[31m-    nlen = name->len ? (1 + name->len + 1) : 1;[m
[31m-[m
[31m-    len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t);[m
[31m-[m
[31m-    p = ngx_resolver_alloc(r, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rn->qlen = (u_short) len;[m
[31m-    rn->query = p;[m
[31m-[m
[31m-    query = (ngx_resolver_hdr_t *) p;[m
[31m-[m
[31m-    ident = ngx_random();[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve: \"%V\" SRV %i", name, ident & 0xffff);[m
[31m-[m
[31m-    query->ident_hi = (u_char) ((ident >> 8) & 0xff);[m
[31m-    query->ident_lo = (u_char) (ident & 0xff);[m
[31m-[m
[31m-    /* recursion query */[m
[31m-    query->flags_hi = 1; query->flags_lo = 0;[m
[31m-[m
[31m-    /* one question */[m
[31m-    query->nqs_hi = 0; query->nqs_lo = 1;[m
[31m-    query->nan_hi = 0; query->nan_lo = 0;[m
[31m-    query->nns_hi = 0; query->nns_lo = 0;[m
[31m-    query->nar_hi = 0; query->nar_lo = 0;[m
[31m-[m
[31m-    p += sizeof(ngx_resolver_hdr_t) + nlen;[m
[31m-[m
[31m-    qs = (ngx_resolver_qs_t *) p;[m
[31m-[m
[31m-    /* query type */[m
[31m-    qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_SRV;[m
[31m-[m
[31m-    /* IN query class */[m
[31m-    qs->class_hi = 0; qs->class_lo = 1;[m
[31m-[m
[31m-    /* converts "www.example.com" to "\3www\7example\3com\0" */[m
[31m-[m
[31m-    len = 0;[m
[31m-    p--;[m
[31m-    *p-- = '\0';[m
[31m-[m
[31m-    if (name->len == 0)  {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    for (s = name->data + name->len - 1; s >= name->data; s--) {[m
[31m-        if (*s != '.') {[m
[31m-            *p = *s;[m
[31m-            len++;[m
[31m-[m
[31m-        } else {[m
[31m-            if (len == 0 || len > 255) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            *p = (u_char) len;[m
[31m-            len = 0;[m
[31m-        }[m
[31m-[m
[31m-        p--;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 || len > 255) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    *p = (u_char) len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_create_addr_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,[m
[31m-    ngx_resolver_addr_t *addr)[m
[31m-{[m
[31m-    u_char               *p, *d;[m
[31m-    size_t                len;[m
[31m-    in_addr_t             inaddr;[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_uint_t            ident;[m
[31m-    ngx_resolver_hdr_t   *query;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    switch (addr->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        len = sizeof(ngx_resolver_hdr_t)[m
[31m-              + 64 + sizeof(".ip6.arpa.") - 1[m
[31m-              + sizeof(ngx_resolver_qs_t);[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        len = sizeof(ngx_resolver_hdr_t)[m
[31m-              + sizeof(".255.255.255.255.in-addr.arpa.") - 1[m
[31m-              + sizeof(ngx_resolver_qs_t);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_resolver_alloc(r, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rn->query = p;[m
[31m-    query = (ngx_resolver_hdr_t *) p;[m
[31m-[m
[31m-    ident = ngx_random();[m
[31m-[m
[31m-    query->ident_hi = (u_char) ((ident >> 8) & 0xff);[m
[31m-    query->ident_lo = (u_char) (ident & 0xff);[m
[31m-[m
[31m-    /* recursion query */[m
[31m-    query->flags_hi = 1; query->flags_lo = 0;[m
[31m-[m
[31m-    /* one question */[m
[31m-    query->nqs_hi = 0; query->nqs_lo = 1;[m
[31m-    query->nan_hi = 0; query->nan_lo = 0;[m
[31m-    query->nns_hi = 0; query->nns_lo = 0;[m
[31m-    query->nar_hi = 0; query->nar_lo = 0;[m
[31m-[m
[31m-    p += sizeof(ngx_resolver_hdr_t);[m
[31m-[m
[31m-    switch (addr->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) addr->sockaddr;[m
[31m-[m
[31m-        for (n = 15; n >= 0; n--) {[m
[31m-            p = ngx_sprintf(p, "\1%xd\1%xd",[m
[31m-                            sin6->sin6_addr.s6_addr[n] & 0xf,[m
[31m-                            (sin6->sin6_addr.s6_addr[n] >> 4) & 0xf);[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, "\3ip6\4arpa\0", 10);[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-[m
[31m-        sin = (struct sockaddr_in *) addr->sockaddr;[m
[31m-        inaddr = ntohl(sin->sin_addr.s_addr);[m
[31m-[m
[31m-        for (n = 0; n < 32; n += 8) {[m
[31m-            d = ngx_sprintf(&p[1], "%ud", (inaddr >> n) & 0xff);[m
[31m-            *p = (u_char) (d - &p[1]);[m
[31m-            p = d;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14);[m
[31m-    }[m
[31m-[m
[31m-    /* query type "PTR", IN query class */[m
[31m-    p = ngx_cpymem(p, "\0\14\0\1", 4);[m
[31m-[m
[31m-    rn->qlen = (u_short) (p - rn->query);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, u_char *buf, u_char *src,[m
[31m-    u_char *last)[m
[31m-{[m
[31m-    char        *err;[m
[31m-    u_char      *p, *dst;[m
[31m-    ssize_t      len;[m
[31m-    ngx_uint_t   i, n;[m
[31m-[m
[31m-    p = src;[m
[31m-    len = -1;[m
[31m-[m
[31m-    /*[m
[31m-     * compression pointers allow to create endless loop, so we set limit;[m
[31m-     * 128 pointers should be enough to store 255-byte name[m
[31m-     */[m
[31m-[m
[31m-    for (i = 0; i < 128; i++) {[m
[31m-        n = *p++;[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (n & 0xc0) {[m
[31m-            n = ((n & 0x3f) << 8) + *p;[m
[31m-            p = &buf[n];[m
[31m-[m
[31m-        } else {[m
[31m-            len += 1 + n;[m
[31m-            p = &p[n];[m
[31m-        }[m
[31m-[m
[31m-        if (p >= last) {[m
[31m-            err = "name is out of response";[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    err = "compression pointers loop";[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (len == -1) {[m
[31m-        ngx_str_null(name);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dst = ngx_resolver_alloc(r, len);[m
[31m-    if (dst == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->data = dst;[m
[31m-[m
[31m-    n = *src++;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (n & 0xc0) {[m
[31m-            n = ((n & 0x3f) << 8) + *src;[m
[31m-            src = &buf[n];[m
[31m-[m
[31m-            n = *src++;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_strlow(dst, src, n);[m
[31m-            dst += n;[m
[31m-            src += n;[m
[31m-[m
[31m-            n = *src++;[m
[31m-[m
[31m-            if (n != 0) {[m
[31m-                *dst++ = '.';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            name->len = dst - name->data;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_timeout_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ev->data;[m
[31m-[m
[31m-    ctx->state = NGX_RESOLVE_TIMEDOUT;[m
[31m-[m
[31m-    ctx->handler(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    if (rn->query) {[m
[31m-        ngx_resolver_free_locked(r, rn->query);[m
[31m-    }[m
[31m-[m
[31m-    if (rn->name) {[m
[31m-        ngx_resolver_free_locked(r, rn->name);[m
[31m-    }[m
[31m-[m
[31m-    if (rn->cnlen) {[m
[31m-        ngx_resolver_free_locked(r, rn->u.cname);[m
[31m-    }[m
[31m-[m
[31m-    if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) {[m
[31m-        ngx_resolver_free_locked(r, rn->u.addrs);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (rn->naddrs6 > 1 && rn->naddrs6 != (u_short) -1) {[m
[31m-        ngx_resolver_free_locked(r, rn->u6.addrs6);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (rn->nsrvs) {[m
[31m-        for (i = 0; i < rn->nsrvs; i++) {[m
[31m-            if (rn->u.srvs[i].name.data) {[m
[31m-                ngx_resolver_free_locked(r, rn->u.srvs[i].name.data);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free_locked(r, rn->u.srvs);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free_locked(r, rn);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_resolver_alloc(ngx_resolver_t *r, size_t size)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    p = ngx_alloc(size, r->log);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_resolver_calloc(ngx_resolver_t *r, size_t size)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_resolver_alloc(r, size);[m
[31m-[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_free(ngx_resolver_t *r, void *p)[m
[31m-{[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    ngx_free(p);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_free_locked(ngx_resolver_t *r, void *p)[m
[31m-{[m
[31m-    ngx_free(p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size)[m
[31m-{[m
[31m-    void  *dst;[m
[31m-[m
[31m-    dst = ngx_resolver_alloc(r, size);[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(dst, src, size);[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_resolver_addr_t *[m
[31m-ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn,[m
[31m-    ngx_uint_t rotate)[m
[31m-{[m
[31m-    ngx_uint_t             d, i, j, n;[m
[31m-    u_char               (*sockaddr)[NGX_SOCKADDRLEN];[m
[31m-    in_addr_t             *addr;[m
[31m-    struct sockaddr_in    *sin;[m
[31m-    ngx_resolver_addr_t   *dst;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct in6_addr       *addr6;[m
[31m-    struct sockaddr_in6   *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    n = rn->naddrs;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    n += rn->naddrs6;[m
[31m-#endif[m
[31m-[m
[31m-    dst = ngx_resolver_calloc(r, n * sizeof(ngx_resolver_addr_t));[m
[31m-    if (dst == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    sockaddr = ngx_resolver_calloc(r, n * NGX_SOCKADDRLEN);[m
[31m-    if (sockaddr == NULL) {[m
[31m-        ngx_resolver_free(r, dst);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    i = 0;[m
[31m-    d = rotate ? ngx_random() % n : 0;[m
[31m-[m
[31m-    if (rn->naddrs) {[m
[31m-        j = rotate ? ngx_random() % rn->naddrs : 0;[m
[31m-[m
[31m-        addr = (rn->naddrs == 1) ? &rn->u.addr : rn->u.addrs;[m
[31m-[m
[31m-        do {[m
[31m-            sin = (struct sockaddr_in *) sockaddr[d];[m
[31m-            sin->sin_family = AF_INET;[m
[31m-            sin->sin_addr.s_addr = addr[j++];[m
[31m-            dst[d].sockaddr = (struct sockaddr *) sin;[m
[31m-            dst[d++].socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-            if (d == n) {[m
[31m-                d = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (j == rn->naddrs) {[m
[31m-                j = 0;[m
[31m-            }[m
[31m-        } while (++i < rn->naddrs);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (rn->naddrs6) {[m
[31m-        j = rotate ? ngx_random() % rn->naddrs6 : 0;[m
[31m-[m
[31m-        addr6 = (rn->naddrs6 == 1) ? &rn->u6.addr6 : rn->u6.addrs6;[m
[31m-[m
[31m-        do {[m
[31m-            sin6 = (struct sockaddr_in6 *) sockaddr[d];[m
[31m-            sin6->sin6_family = AF_INET6;[m
[31m-            ngx_memcpy(sin6->sin6_addr.s6_addr, addr6[j++].s6_addr, 16);[m
[31m-            dst[d].sockaddr = (struct sockaddr *) sin6;[m
[31m-            dst[d++].socklen = sizeof(struct sockaddr_in6);[m
[31m-[m
[31m-            if (d == n) {[m
[31m-                d = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (j == rn->naddrs6) {[m
[31m-                j = 0;[m
[31m-            }[m
[31m-        } while (++i < n);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t                naddrs, nsrvs, nw, i, j, k, l, m, n, w;[m
[31m-    ngx_resolver_addr_t      *addrs;[m
[31m-    ngx_resolver_srv_name_t  *srvs;[m
[31m-[m
[31m-    naddrs = 0;[m
[31m-[m
[31m-    for (i = 0; i < ctx->nsrvs; i++) {[m
[31m-        naddrs += ctx->srvs[i].naddrs;[m
[31m-    }[m
[31m-[m
[31m-    if (naddrs == 0) {[m
[31m-        ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-        ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-        ctx->handler(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    addrs = ngx_resolver_calloc(r, naddrs * sizeof(ngx_resolver_addr_t));[m
[31m-    if (addrs == NULL) {[m
[31m-        ctx->state = NGX_ERROR;[m
[31m-        ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-        ctx->handler(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    srvs = ctx->srvs;[m
[31m-    nsrvs = ctx->nsrvs;[m
[31m-[m
[31m-    i = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        nw = 0;[m
[31m-[m
[31m-        for (j = i; j < nsrvs; j++) {[m
[31m-            if (srvs[j].priority != srvs[i].priority) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            nw += srvs[j].naddrs * srvs[j].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (nw == 0) {[m
[31m-            goto next_srv;[m
[31m-        }[m
[31m-[m
[31m-        w = ngx_random() % nw;[m
[31m-[m
[31m-        for (k = i; k < j; k++) {[m
[31m-            if (w < srvs[k].naddrs * srvs[k].weight) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            w -= srvs[k].naddrs * srvs[k].weight;[m
[31m-        }[m
[31m-[m
[31m-        for (l = i; l < j; l++) {[m
[31m-[m
[31m-            for (m = 0; m < srvs[k].naddrs; m++) {[m
[31m-                addrs[n].socklen = srvs[k].addrs[m].socklen;[m
[31m-                addrs[n].sockaddr = srvs[k].addrs[m].sockaddr;[m
[31m-                addrs[n].name = srvs[k].name;[m
[31m-                addrs[n].priority = srvs[k].priority;[m
[31m-                addrs[n].weight = srvs[k].weight;[m
[31m-                n++;[m
[31m-            }[m
[31m-[m
[31m-            if (++k == j) {[m
[31m-                k = i;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-next_srv:[m
[31m-[m
[31m-        i = j;[m
[31m-[m
[31m-    } while (i < ctx->nsrvs);[m
[31m-[m
[31m-    ctx->state = NGX_OK;[m
[31m-    ctx->addrs = addrs;[m
[31m-    ctx->naddrs = naddrs;[m
[31m-[m
[31m-    ctx->handler(ctx);[m
[31m-[m
[31m-    ngx_resolver_free(r, addrs);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_resolver_strerror(ngx_int_t err)[m
[31m-{[m
[31m-    static char *errors[] = {[m
[31m-        "Format error",     /* FORMERR */[m
[31m-        "Server failure",   /* SERVFAIL */[m
[31m-        "Host not found",   /* NXDOMAIN */[m
[31m-        "Unimplemented",    /* NOTIMP */[m
[31m-        "Operation refused" /* REFUSED */[m
[31m-    };[m
[31m-[m
[31m-    if (err > 0 && err < 6) {[m
[31m-        return errors[err - 1];[m
[31m-    }[m
[31m-[m
[31m-    if (err == NGX_RESOLVE_TIMEDOUT) {[m
[31m-        return "Operation timed out";[m
[31m-    }[m
[31m-[m
[31m-    return "Unknown error";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    p = buf;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-    }[m
[31m-[m
[31m-    rec = log->data;[m
[31m-[m
[31m-    if (rec) {[m
[31m-        p = ngx_snprintf(p, len, ", resolver: %V", &rec->server);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_udp_connect(ngx_resolver_connection_t *rec)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    ngx_int_t          event;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    s = ngx_socket(rec->sockaddr->sa_family, SOCK_DGRAM, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "UDP socket %d", s);[m
[31m-[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(s, &rec->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n "failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = &rec->log;[m
[31m-    wev->log = &rec->log;[m
[31m-[m
[31m-    rec->udp = c;[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &rec->log, 0,[m
[31m-                   "connect to %V, fd:%d #%uA", &rec->server, s, c->number);[m
[31m-[m
[31m-    rc = connect(s, rec->sockaddr, rec->socklen);[m
[31m-[m
[31m-    /* TODO: iocp */[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, &rec->log, ngx_socket_errno,[m
[31m-                      "connect() failed");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /* UDP sockets are always ready to write */[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?[m
[31m-                /* kqueue, epoll */                 NGX_CLEAR_EVENT:[m
[31m-                /* select, poll, /dev/poll */       NGX_LEVEL_EVENT;[m
[31m-                /* eventport event type has no meaning: oneshot only */[m
[31m-[m
[31m-    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    rec->udp = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_tcp_connect(ngx_resolver_connection_t *rec)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    ngx_int_t          event;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_uint_t         level;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    s = ngx_socket(rec->sockaddr->sa_family, SOCK_STREAM, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "TCP socket %d", s);[m
[31m-[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(s, &rec->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n "failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = &rec->log;[m
[31m-    wev->log = &rec->log;[m
[31m-[m
[31m-    rec->tcp = c;[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &rec->log, 0,[m
[31m-                   "connect to %V, fd:%d #%uA", &rec->server, s, c->number);[m
[31m-[m
[31m-    rc = connect(s, rec->sockaddr, rec->socklen);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-[m
[31m-        if (err != NGX_EINPROGRESS[m
[31m-#if (NGX_WIN32)[m
[31m-            /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */[m
[31m-            && err != NGX_EAGAIN[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            if (err == NGX_ECONNREFUSED[m
[31m-#if (NGX_LINUX)[m
[31m-                /*[m
[31m-                 * Linux returns EAGAIN instead of ECONNREFUSED[m
[31m-                 * for unix sockets if listen queue is full[m
[31m-                 */[m
[31m-                || err == NGX_EAGAIN[m
[31m-#endif[m
[31m-                || err == NGX_ECONNRESET[m
[31m-                || err == NGX_ENETDOWN[m
[31m-                || err == NGX_ENETUNREACH[m
[31m-                || err == NGX_EHOSTDOWN[m
[31m-                || err == NGX_EHOSTUNREACH)[m
[31m-            {[m
[31m-                level = NGX_LOG_ERR;[m
[31m-[m
[31m-            } else {[m
[31m-                level = NGX_LOG_CRIT;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(level, c->log, err, "connect() to %V failed",[m
[31m-                          &rec->server);[m
[31m-[m
[31m-            ngx_close_connection(c);[m
[31m-            rec->tcp = NULL;[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        if (rc == -1) {[m
[31m-[m
[31m-            /* NGX_EINPROGRESS */[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "connected");[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, ngx_socket_errno,[m
[31m-                       "connect(): %d", rc);[m
[31m-[m
[31m-        if (ngx_blocking(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                          ngx_blocking_n " failed");[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * FreeBSD's aio allows to post an operation on non-connected socket.[m
[31m-         * NT does not support it.[m
[31m-         *[m
[31m-         * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT[m
[31m-         */[m
[31m-[m
[31m-        rev->ready = 1;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue */[m
[31m-[m
[31m-        event = NGX_CLEAR_EVENT;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        event = NGX_LEVEL_EVENT;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-[m
[31m-        /* NGX_EINPROGRESS */[m
[31m-[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "connected");[m
[31m-[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    rec->tcp = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_cmp_srvs(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_int_t            p1, p2;[m
[31m-    ngx_resolver_srv_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_resolver_srv_t *) one;[m
[31m-    second = (ngx_resolver_srv_t *) two;[m
[31m-[m
[31m-    p1 = first->priority;[m
[31m-    p2 = second->priority;[m
[31m-[m
[31m-    return p1 - p2;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_resolver.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_resolver.h[m
[1mdeleted file mode 100644[m
[1mindex e36cfdc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_resolver.h[m
[1m+++ /dev/null[m
[36m@@ -1,237 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_RESOLVER_H_INCLUDED_[m
[31m-#define _NGX_RESOLVER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define NGX_RESOLVE_A         1[m
[31m-#define NGX_RESOLVE_CNAME     5[m
[31m-#define NGX_RESOLVE_PTR       12[m
[31m-#define NGX_RESOLVE_MX        15[m
[31m-#define NGX_RESOLVE_TXT       16[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-#define NGX_RESOLVE_AAAA      28[m
[31m-#endif[m
[31m-#define NGX_RESOLVE_SRV       33[m
[31m-#define NGX_RESOLVE_DNAME     39[m
[31m-[m
[31m-#define NGX_RESOLVE_FORMERR   1[m
[31m-#define NGX_RESOLVE_SERVFAIL  2[m
[31m-#define NGX_RESOLVE_NXDOMAIN  3[m
[31m-#define NGX_RESOLVE_NOTIMP    4[m
[31m-#define NGX_RESOLVE_REFUSED   5[m
[31m-#define NGX_RESOLVE_TIMEDOUT  NGX_ETIMEDOUT[m
[31m-[m
[31m-[m
[31m-#define NGX_NO_RESOLVER       (void *) -1[m
[31m-[m
[31m-#define NGX_RESOLVER_MAX_RECURSION    50[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_resolver_s  ngx_resolver_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_connection_t         *udp;[m
[31m-    ngx_connection_t         *tcp;[m
[31m-    struct sockaddr          *sockaddr;[m
[31m-    socklen_t                 socklen;[m
[31m-    ngx_str_t                 server;[m
[31m-    ngx_log_t                 log;[m
[31m-    ngx_buf_t                *read_buf;[m
[31m-    ngx_buf_t                *write_buf;[m
[31m-    ngx_resolver_t           *resolver;[m
[31m-} ngx_resolver_connection_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_resolver_ctx_s  ngx_resolver_ctx_t;[m
[31m-[m
[31m-typedef void (*ngx_resolver_handler_pt)(ngx_resolver_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct sockaddr          *sockaddr;[m
[31m-    socklen_t                 socklen;[m
[31m-    ngx_str_t                 name;[m
[31m-    u_short                   priority;[m
[31m-    u_short                   weight;[m
[31m-} ngx_resolver_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    u_short                   priority;[m
[31m-    u_short                   weight;[m
[31m-    u_short                   port;[m
[31m-} ngx_resolver_srv_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    u_short                   priority;[m
[31m-    u_short                   weight;[m
[31m-    u_short                   port;[m
[31m-[m
[31m-    ngx_resolver_ctx_t       *ctx;[m
[31m-[m
[31m-    ngx_uint_t                naddrs;[m
[31m-    ngx_addr_t               *addrs;[m
[31m-} ngx_resolver_srv_name_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_node_t         node;[m
[31m-    ngx_queue_t               queue;[m
[31m-[m
[31m-    /* PTR: resolved name, A: name to resolve */[m
[31m-    u_char                   *name;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    /* PTR: IPv6 address to resolve (IPv4 address is in rbtree node key) */[m
[31m-    struct in6_addr           addr6;[m
[31m-#endif[m
[31m-[m
[31m-    u_short                   nlen;[m
[31m-    u_short                   qlen;[m
[31m-[m
[31m-    u_char                   *query;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                   *query6;[m
[31m-#endif[m
[31m-[m
[31m-    union {[m
[31m-        in_addr_t             addr;[m
[31m-        in_addr_t            *addrs;[m
[31m-        u_char               *cname;[m
[31m-        ngx_resolver_srv_t   *srvs;[m
[31m-    } u;[m
[31m-[m
[31m-    u_char                    code;[m
[31m-    u_short                   naddrs;[m
[31m-    u_short                   nsrvs;[m
[31m-    u_short                   cnlen;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    union {[m
[31m-        struct in6_addr       addr6;[m
[31m-        struct in6_addr      *addrs6;[m
[31m-    } u6;[m
[31m-[m
[31m-    u_short                   naddrs6;[m
[31m-#endif[m
[31m-[m
[31m-    time_t                    expire;[m
[31m-    time_t                    valid;[m
[31m-    uint32_t                  ttl;[m
[31m-[m
[31m-    unsigned                  tcp:1;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    unsigned                  tcp6:1;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t                last_connection;[m
[31m-[m
[31m-    ngx_resolver_ctx_t       *waiting;[m
[31m-} ngx_resolver_node_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_resolver_s {[m
[31m-    /* has to be pointer because of "incomplete type" */[m
[31m-    ngx_event_t              *event;[m
[31m-    void                     *dummy;[m
[31m-    ngx_log_t                *log;[m
[31m-[m
[31m-    /* event ident must be after 3 pointers as in ngx_connection_t */[m
[31m-    ngx_int_t                 ident;[m
[31m-[m
[31m-    /* simple round robin DNS peers balancer */[m
[31m-    ngx_array_t               connections;[m
[31m-    ngx_uint_t                last_connection;[m
[31m-[m
[31m-    ngx_rbtree_t              name_rbtree;[m
[31m-    ngx_rbtree_node_t         name_sentinel;[m
[31m-[m
[31m-    ngx_rbtree_t              srv_rbtree;[m
[31m-    ngx_rbtree_node_t         srv_sentinel;[m
[31m-[m
[31m-    ngx_rbtree_t              addr_rbtree;[m
[31m-    ngx_rbtree_node_t         addr_sentinel;[m
[31m-[m
[31m-    ngx_queue_t               name_resend_queue;[m
[31m-    ngx_queue_t               srv_resend_queue;[m
[31m-    ngx_queue_t               addr_resend_queue;[m
[31m-[m
[31m-    ngx_queue_t               name_expire_queue;[m
[31m-    ngx_queue_t               srv_expire_queue;[m
[31m-    ngx_queue_t               addr_expire_queue;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t                ipv6;                 /* unsigned  ipv6:1; */[m
[31m-    ngx_rbtree_t              addr6_rbtree;[m
[31m-    ngx_rbtree_node_t         addr6_sentinel;[m
[31m-    ngx_queue_t               addr6_resend_queue;[m
[31m-    ngx_queue_t               addr6_expire_queue;[m
[31m-#endif[m
[31m-[m
[31m-    time_t                    resend_timeout;[m
[31m-    time_t                    tcp_timeout;[m
[31m-    time_t                    expire;[m
[31m-    time_t                    valid;[m
[31m-[m
[31m-    ngx_uint_t                log_level;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_resolver_ctx_s {[m
[31m-    ngx_resolver_ctx_t       *next;[m
[31m-    ngx_resolver_t           *resolver;[m
[31m-    ngx_resolver_node_t      *node;[m
[31m-[m
[31m-    /* event ident must be after 3 pointers as in ngx_connection_t */[m
[31m-    ngx_int_t                 ident;[m
[31m-[m
[31m-    ngx_int_t                 state;[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_str_t                 service;[m
[31m-[m
[31m-    time_t                    valid;[m
[31m-    ngx_uint_t                naddrs;[m
[31m-    ngx_resolver_addr_t      *addrs;[m
[31m-    ngx_resolver_addr_t       addr;[m
[31m-    struct sockaddr_in        sin;[m
[31m-[m
[31m-    ngx_uint_t                count;[m
[31m-    ngx_uint_t                nsrvs;[m
[31m-    ngx_resolver_srv_name_t  *srvs;[m
[31m-[m
[31m-    ngx_resolver_handler_pt   handler;[m
[31m-    void                     *data;[m
[31m-    ngx_msec_t                timeout;[m
[31m-[m
[31m-    ngx_uint_t                quick;  /* unsigned  quick:1; */[m
[31m-    ngx_uint_t                recursion;[m
[31m-    ngx_event_t              *event;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_resolver_t *ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names,[m
[31m-    ngx_uint_t n);[m
[31m-ngx_resolver_ctx_t *ngx_resolve_start(ngx_resolver_t *r,[m
[31m-    ngx_resolver_ctx_t *temp);[m
[31m-ngx_int_t ngx_resolve_name(ngx_resolver_ctx_t *ctx);[m
[31m-void ngx_resolve_name_done(ngx_resolver_ctx_t *ctx);[m
[31m-ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx);[m
[31m-void ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx);[m
[31m-char *ngx_resolver_strerror(ngx_int_t err);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_RESOLVER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rwlock.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rwlock.c[m
[1mdeleted file mode 100644[m
[1mindex 905de78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rwlock.c[m
[1m+++ /dev/null[m
[36m@@ -1,120 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-[m
[31m-#define NGX_RWLOCK_SPIN   2048[m
[31m-#define NGX_RWLOCK_WLOCK  ((ngx_atomic_uint_t) -1)[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rwlock_wlock(ngx_atomic_t *lock)[m
[31m-{[m
[31m-    ngx_uint_t  i, n;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ncpu > 1) {[m
[31m-[m
[31m-            for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) {[m
[31m-[m
[31m-                for (i = 0; i < n; i++) {[m
[31m-                    ngx_cpu_pause();[m
[31m-                }[m
[31m-[m
[31m-                if (*lock == 0[m
[31m-                    && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK))[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_sched_yield();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rwlock_rlock(ngx_atomic_t *lock)[m
[31m-{[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_atomic_uint_t  readers;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        readers = *lock;[m
[31m-[m
[31m-        if (readers != NGX_RWLOCK_WLOCK[m
[31m-            && ngx_atomic_cmp_set(lock, readers, readers + 1))[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ncpu > 1) {[m
[31m-[m
[31m-            for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) {[m
[31m-[m
[31m-                for (i = 0; i < n; i++) {[m
[31m-                    ngx_cpu_pause();[m
[31m-                }[m
[31m-[m
[31m-                readers = *lock;[m
[31m-[m
[31m-                if (readers != NGX_RWLOCK_WLOCK[m
[31m-                    && ngx_atomic_cmp_set(lock, readers, readers + 1))[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_sched_yield();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rwlock_unlock(ngx_atomic_t *lock)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  readers;[m
[31m-[m
[31m-    readers = *lock;[m
[31m-[m
[31m-    if (readers == NGX_RWLOCK_WLOCK) {[m
[31m-        *lock = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_atomic_cmp_set(lock, readers, readers - 1)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        readers = *lock;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE || NGX_STREAM_UPSTREAM_ZONE)[m
[31m-[m
[31m-#error ngx_atomic_cmp_set() is not defined![m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rwlock.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rwlock.h[m
[1mdeleted file mode 100644[m
[1mindex 8b16eca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_rwlock.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_RWLOCK_H_INCLUDED_[m
[31m-#define _NGX_RWLOCK_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void ngx_rwlock_wlock(ngx_atomic_t *lock);[m
[31m-void ngx_rwlock_rlock(ngx_atomic_t *lock);[m
[31m-void ngx_rwlock_unlock(ngx_atomic_t *lock);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_RWLOCK_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_sha1.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_sha1.h[m
[1mdeleted file mode 100644[m
[1mindex 81c909e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_sha1.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SHA1_H_INCLUDED_[m
[31m-#define _NGX_SHA1_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENSSL_SHA1_H)[m
[31m-#include <openssl/sha.h>[m
[31m-#else[m
[31m-#include <sha.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef SHA_CTX  ngx_sha1_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_sha1_init    SHA1_Init[m
[31m-#define ngx_sha1_update  SHA1_Update[m
[31m-#define ngx_sha1_final   SHA1_Final[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SHA1_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_shmtx.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_shmtx.c[m
[1mdeleted file mode 100644[m
[1mindex a255903..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_shmtx.c[m
[1m+++ /dev/null[m
[36m@@ -1,310 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-[m
[31m-static void ngx_shmtx_wakeup(ngx_shmtx_t *mtx);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, u_char *name)[m
[31m-{[m
[31m-    mtx->lock = &addr->lock;[m
[31m-[m
[31m-    if (mtx->spin == (ngx_uint_t) -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    mtx->spin = 2048;[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-[m
[31m-    mtx->wait = &addr->wait;[m
[31m-[m
[31m-    if (sem_init(&mtx->sem, 1, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      "sem_init() failed");[m
[31m-    } else {[m
[31m-        mtx->semaphore = 1;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_destroy(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-[m
[31m-    if (mtx->semaphore) {[m
[31m-        if (sem_destroy(&mtx->sem) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                          "sem_destroy() failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_shmtx_trylock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_lock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    ngx_uint_t         i, n;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "shmtx lock");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ncpu > 1) {[m
[31m-[m
[31m-            for (n = 1; n < mtx->spin; n <<= 1) {[m
[31m-[m
[31m-                for (i = 0; i < n; i++) {[m
[31m-                    ngx_cpu_pause();[m
[31m-                }[m
[31m-[m
[31m-                if (*mtx->lock == 0[m
[31m-                    && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid))[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-[m
[31m-        if (mtx->semaphore) {[m
[31m-            (void) ngx_atomic_fetch_add(mtx->wait, 1);[m
[31m-[m
[31m-            if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)) {[m
[31m-                (void) ngx_atomic_fetch_add(mtx->wait, -1);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                           "shmtx wait %uA", *mtx->wait);[m
[31m-[m
[31m-            while (sem_wait(&mtx->sem) == -1) {[m
[31m-                ngx_err_t  err;[m
[31m-[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                if (err != NGX_EINTR) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,[m
[31m-                                  "sem_wait() failed while waiting on shmtx");[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                           "shmtx awoke");[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_sched_yield();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_unlock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    if (mtx->spin != (ngx_uint_t) -1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "shmtx unlock");[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_atomic_cmp_set(mtx->lock, ngx_pid, 0)) {[m
[31m-        ngx_shmtx_wakeup(mtx);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                   "shmtx forced unlock");[m
[31m-[m
[31m-    if (ngx_atomic_cmp_set(mtx->lock, pid, 0)) {[m
[31m-        ngx_shmtx_wakeup(mtx);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_shmtx_wakeup(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-    ngx_atomic_uint_t  wait;[m
[31m-[m
[31m-    if (!mtx->semaphore) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        wait = *mtx->wait;[m
[31m-[m
[31m-        if ((ngx_atomic_int_t) wait <= 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_atomic_cmp_set(mtx->wait, wait, wait - 1)) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                   "shmtx wake %uA", wait);[m
[31m-[m
[31m-    if (sem_post(&mtx->sem) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      "sem_post() failed while wake shmtx");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, u_char *name)[m
[31m-{[m
[31m-    if (mtx->name) {[m
[31m-[m
[31m-        if (ngx_strcmp(name, mtx->name) == 0) {[m
[31m-            mtx->name = name;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_destroy(mtx);[m
[31m-    }[m
[31m-[m
[31m-    mtx->fd = ngx_open_file(name, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN,[m
[31m-                            NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (mtx->fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      ngx_delete_file_n " \"%s\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    mtx->name = name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_destroy(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    if (ngx_close_file(mtx->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", mtx->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_shmtx_trylock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = ngx_trylock_fd(mtx->fd);[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (err == NGX_EAGAIN) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#if __osf__ /* Tru64 UNIX */[m
[31m-[m
[31m-    if (err == NGX_EACCES) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_abort(err, ngx_trylock_fd_n " %s failed", mtx->name);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_lock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = ngx_lock_fd(mtx->fd);[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_abort(err, ngx_lock_fd_n " %s failed", mtx->name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_unlock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = ngx_unlock_fd(mtx->fd);[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_abort(err, ngx_unlock_fd_n " %s failed", mtx->name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid)[m
[31m-{[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_shmtx.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_shmtx.h[m
[1mdeleted file mode 100644[m
[1mindex 91e11be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_shmtx.h[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SHMTX_H_INCLUDED_[m
[31m-#define _NGX_SHMTX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_atomic_t   lock;[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-    ngx_atomic_t   wait;[m
[31m-#endif[m
[31m-} ngx_shmtx_sh_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-    ngx_atomic_t  *lock;[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-    ngx_atomic_t  *wait;[m
[31m-    ngx_uint_t     semaphore;[m
[31m-    sem_t          sem;[m
[31m-#endif[m
[31m-#else[m
[31m-    ngx_fd_t       fd;[m
[31m-    u_char        *name;[m
[31m-#endif[m
[31m-    ngx_uint_t     spin;[m
[31m-} ngx_shmtx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr,[m
[31m-    u_char *name);[m
[31m-void ngx_shmtx_destroy(ngx_shmtx_t *mtx);[m
[31m-ngx_uint_t ngx_shmtx_trylock(ngx_shmtx_t *mtx);[m
[31m-void ngx_shmtx_lock(ngx_shmtx_t *mtx);[m
[31m-void ngx_shmtx_unlock(ngx_shmtx_t *mtx);[m
[31m-ngx_uint_t ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SHMTX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_slab.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_slab.c[m
[1mdeleted file mode 100644[m
[1mindex 56e7765..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_slab.c[m
[1m+++ /dev/null[m
[36m@@ -1,790 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_SLAB_PAGE_MASK   3[m
[31m-#define NGX_SLAB_PAGE        0[m
[31m-#define NGX_SLAB_BIG         1[m
[31m-#define NGX_SLAB_EXACT       2[m
[31m-#define NGX_SLAB_SMALL       3[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-[m
[31m-#define NGX_SLAB_PAGE_FREE   0[m
[31m-#define NGX_SLAB_PAGE_BUSY   0xffffffff[m
[31m-#define NGX_SLAB_PAGE_START  0x80000000[m
[31m-[m
[31m-#define NGX_SLAB_SHIFT_MASK  0x0000000f[m
[31m-#define NGX_SLAB_MAP_MASK    0xffff0000[m
[31m-#define NGX_SLAB_MAP_SHIFT   16[m
[31m-[m
[31m-#define NGX_SLAB_BUSY        0xffffffff[m
[31m-[m
[31m-#else /* (NGX_PTR_SIZE == 8) */[m
[31m-[m
[31m-#define NGX_SLAB_PAGE_FREE   0[m
[31m-#define NGX_SLAB_PAGE_BUSY   0xffffffffffffffff[m
[31m-#define NGX_SLAB_PAGE_START  0x8000000000000000[m
[31m-[m
[31m-#define NGX_SLAB_SHIFT_MASK  0x000000000000000f[m
[31m-#define NGX_SLAB_MAP_MASK    0xffffffff00000000[m
[31m-#define NGX_SLAB_MAP_SHIFT   32[m
[31m-[m
[31m-#define NGX_SLAB_BUSY        0xffffffffffffffff[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG_MALLOC)[m
[31m-[m
[31m-#define ngx_slab_junk(p, size)     ngx_memset(p, 0xA5, size)[m
[31m-[m
[31m-#elif (NGX_HAVE_DEBUG_MALLOC)[m
[31m-[m
[31m-#define ngx_slab_junk(p, size)                                                \[m
[31m-    if (ngx_debug_malloc)          ngx_memset(p, 0xA5, size)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_slab_junk(p, size)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-static ngx_slab_page_t *ngx_slab_alloc_pages(ngx_slab_pool_t *pool,[m
[31m-    ngx_uint_t pages);[m
[31m-static void ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page,[m
[31m-    ngx_uint_t pages);[m
[31m-static void ngx_slab_error(ngx_slab_pool_t *pool, ngx_uint_t level,[m
[31m-    char *text);[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t  ngx_slab_max_size;[m
[31m-static ngx_uint_t  ngx_slab_exact_size;[m
[31m-static ngx_uint_t  ngx_slab_exact_shift;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_slab_init(ngx_slab_pool_t *pool)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    size_t            size;[m
[31m-    ngx_int_t         m;[m
[31m-    ngx_uint_t        i, n, pages;[m
[31m-    ngx_slab_page_t  *slots;[m
[31m-[m
[31m-    /* STUB */[m
[31m-    if (ngx_slab_max_size == 0) {[m
[31m-        ngx_slab_max_size = ngx_pagesize / 2;[m
[31m-        ngx_slab_exact_size = ngx_pagesize / (8 * sizeof(uintptr_t));[m
[31m-        for (n = ngx_slab_exact_size; n >>= 1; ngx_slab_exact_shift++) {[m
[31m-            /* void */[m
[31m-        }[m
[31m-    }[m
[31m-    /**/[m
[31m-[m
[31m-    pool->min_size = 1 << pool->min_shift;[m
[31m-[m
[31m-    p = (u_char *) pool + sizeof(ngx_slab_pool_t);[m
[31m-    size = pool->end - p;[m
[31m-[m
[31m-    ngx_slab_junk(p, size);[m
[31m-[m
[31m-    slots = (ngx_slab_page_t *) p;[m
[31m-    n = ngx_pagesize_shift - pool->min_shift;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        slots[i].slab = 0;[m
[31m-        slots[i].next = &slots[i];[m
[31m-        slots[i].prev = 0;[m
[31m-    }[m
[31m-[m
[31m-    p += n * sizeof(ngx_slab_page_t);[m
[31m-[m
[31m-    pages = (ngx_uint_t) (size / (ngx_pagesize + sizeof(ngx_slab_page_t)));[m
[31m-[m
[31m-    ngx_memzero(p, pages * sizeof(ngx_slab_page_t));[m
[31m-[m
[31m-    pool->pages = (ngx_slab_page_t *) p;[m
[31m-[m
[31m-    pool->free.prev = 0;[m
[31m-    pool->free.next = (ngx_slab_page_t *) p;[m
[31m-[m
[31m-    pool->pages->slab = pages;[m
[31m-    pool->pages->next = &pool->free;[m
[31m-    pool->pages->prev = (uintptr_t) &pool->free;[m
[31m-[m
[31m-    pool->start = (u_char *)[m
[31m-                  ngx_align_ptr((uintptr_t) p + pages * sizeof(ngx_slab_page_t),[m
[31m-                                 ngx_pagesize);[m
[31m-[m
[31m-    m = pages - (pool->end - pool->start) / ngx_pagesize;[m
[31m-    if (m > 0) {[m
[31m-        pages -= m;[m
[31m-        pool->pages->slab = pages;[m
[31m-    }[m
[31m-[m
[31m-    pool->last = pool->pages + pages;[m
[31m-[m
[31m-    pool->log_nomem = 1;[m
[31m-    pool->log_ctx = &pool->zero;[m
[31m-    pool->zero = '\0';[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    ngx_shmtx_lock(&pool->mutex);[m
[31m-[m
[31m-    p = ngx_slab_alloc_locked(pool, size);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&pool->mutex);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    size_t            s;[m
[31m-    uintptr_t         p, n, m, mask, *bitmap;[m
[31m-    ngx_uint_t        i, slot, shift, map;[m
[31m-    ngx_slab_page_t  *page, *prev, *slots;[m
[31m-[m
[31m-    if (size > ngx_slab_max_size) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0,[m
[31m-                       "slab alloc: %uz", size);[m
[31m-[m
[31m-        page = ngx_slab_alloc_pages(pool, (size >> ngx_pagesize_shift)[m
[31m-                                          + ((size % ngx_pagesize) ? 1 : 0));[m
[31m-        if (page) {[m
[31m-            p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-            p += (uintptr_t) pool->start;[m
[31m-[m
[31m-        } else {[m
[31m-            p = 0;[m
[31m-        }[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (size > pool->min_size) {[m
[31m-        shift = 1;[m
[31m-        for (s = size - 1; s >>= 1; shift++) { /* void */ }[m
[31m-        slot = shift - pool->min_shift;[m
[31m-[m
[31m-    } else {[m
[31m-        size = pool->min_size;[m
[31m-        shift = pool->min_shift;[m
[31m-        slot = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0,[m
[31m-                   "slab alloc: %uz slot: %ui", size, slot);[m
[31m-[m
[31m-    slots = (ngx_slab_page_t *) ((u_char *) pool + sizeof(ngx_slab_pool_t));[m
[31m-    page = slots[slot].next;[m
[31m-[m
[31m-    if (page->next != page) {[m
[31m-[m
[31m-        if (shift < ngx_slab_exact_shift) {[m
[31m-[m
[31m-            do {[m
[31m-                p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-                bitmap = (uintptr_t *) (pool->start + p);[m
[31m-[m
[31m-                map = (1 << (ngx_pagesize_shift - shift))[m
[31m-                          / (sizeof(uintptr_t) * 8);[m
[31m-[m
[31m-                for (n = 0; n < map; n++) {[m
[31m-[m
[31m-                    if (bitmap[n] != NGX_SLAB_BUSY) {[m
[31m-[m
[31m-                        for (m = 1, i = 0; m; m <<= 1, i++) {[m
[31m-                            if ((bitmap[n] & m)) {[m
[31m-                                continue;[m
[31m-                            }[m
[31m-[m
[31m-                            bitmap[n] |= m;[m
[31m-[m
[31m-                            i = ((n * sizeof(uintptr_t) * 8) << shift)[m
[31m-                                + (i << shift);[m
[31m-[m
[31m-                            if (bitmap[n] == NGX_SLAB_BUSY) {[m
[31m-                                for (n = n + 1; n < map; n++) {[m
[31m-                                    if (bitmap[n] != NGX_SLAB_BUSY) {[m
[31m-                                        p = (uintptr_t) bitmap + i;[m
[31m-[m
[31m-                                        goto done;[m
[31m-                                    }[m
[31m-                                }[m
[31m-[m
[31m-                                prev = (ngx_slab_page_t *)[m
[31m-                                            (page->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                                prev->next = page->next;[m
[31m-                                page->next->prev = page->prev;[m
[31m-[m
[31m-                                page->next = NULL;[m
[31m-                                page->prev = NGX_SLAB_SMALL;[m
[31m-                            }[m
[31m-[m
[31m-                            p = (uintptr_t) bitmap + i;[m
[31m-[m
[31m-                            goto done;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                page = page->next;[m
[31m-[m
[31m-            } while (page);[m
[31m-[m
[31m-        } else if (shift == ngx_slab_exact_shift) {[m
[31m-[m
[31m-            do {[m
[31m-                if (page->slab != NGX_SLAB_BUSY) {[m
[31m-[m
[31m-                    for (m = 1, i = 0; m; m <<= 1, i++) {[m
[31m-                        if ((page->slab & m)) {[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                        page->slab |= m;[m
[31m-[m
[31m-                        if (page->slab == NGX_SLAB_BUSY) {[m
[31m-                            prev = (ngx_slab_page_t *)[m
[31m-                                            (page->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                            prev->next = page->next;[m
[31m-                            page->next->prev = page->prev;[m
[31m-[m
[31m-                            page->next = NULL;[m
[31m-                            page->prev = NGX_SLAB_EXACT;[m
[31m-                        }[m
[31m-[m
[31m-                        p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-                        p += i << shift;[m
[31m-                        p += (uintptr_t) pool->start;[m
[31m-[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                page = page->next;[m
[31m-[m
[31m-            } while (page);[m
[31m-[m
[31m-        } else { /* shift > ngx_slab_exact_shift */[m
[31m-[m
[31m-            n = ngx_pagesize_shift - (page->slab & NGX_SLAB_SHIFT_MASK);[m
[31m-            n = 1 << n;[m
[31m-            n = ((uintptr_t) 1 << n) - 1;[m
[31m-            mask = n << NGX_SLAB_MAP_SHIFT;[m
[31m-[m
[31m-            do {[m
[31m-                if ((page->slab & NGX_SLAB_MAP_MASK) != mask) {[m
[31m-[m
[31m-                    for (m = (uintptr_t) 1 << NGX_SLAB_MAP_SHIFT, i = 0;[m
[31m-                         m & mask;[m
[31m-                         m <<= 1, i++)[m
[31m-                    {[m
[31m-                        if ((page->slab & m)) {[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                        page->slab |= m;[m
[31m-[m
[31m-                        if ((page->slab & NGX_SLAB_MAP_MASK) == mask) {[m
[31m-                            prev = (ngx_slab_page_t *)[m
[31m-                                            (page->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                            prev->next = page->next;[m
[31m-                            page->next->prev = page->prev;[m
[31m-[m
[31m-                            page->next = NULL;[m
[31m-                            page->prev = NGX_SLAB_BIG;[m
[31m-                        }[m
[31m-[m
[31m-                        p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-                        p += i << shift;[m
[31m-                        p += (uintptr_t) pool->start;[m
[31m-[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                page = page->next;[m
[31m-[m
[31m-            } while (page);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    page = ngx_slab_alloc_pages(pool, 1);[m
[31m-[m
[31m-    if (page) {[m
[31m-        if (shift < ngx_slab_exact_shift) {[m
[31m-            p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-            bitmap = (uintptr_t *) (pool->start + p);[m
[31m-[m
[31m-            s = 1 << shift;[m
[31m-            n = (1 << (ngx_pagesize_shift - shift)) / 8 / s;[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                n = 1;[m
[31m-            }[m
[31m-[m
[31m-            bitmap[0] = (2 << n) - 1;[m
[31m-[m
[31m-            map = (1 << (ngx_pagesize_shift - shift)) / (sizeof(uintptr_t) * 8);[m
[31m-[m
[31m-            for (i = 1; i < map; i++) {[m
[31m-                bitmap[i] = 0;[m
[31m-            }[m
[31m-[m
[31m-            page->slab = shift;[m
[31m-            page->next = &slots[slot];[m
[31m-            page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_SMALL;[m
[31m-[m
[31m-            slots[slot].next = page;[m
[31m-[m
[31m-            p = ((page - pool->pages) << ngx_pagesize_shift) + s * n;[m
[31m-            p += (uintptr_t) pool->start;[m
[31m-[m
[31m-            goto done;[m
[31m-[m
[31m-        } else if (shift == ngx_slab_exact_shift) {[m
[31m-[m
[31m-            page->slab = 1;[m
[31m-            page->next = &slots[slot];[m
[31m-            page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_EXACT;[m
[31m-[m
[31m-            slots[slot].next = page;[m
[31m-[m
[31m-            p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-            p += (uintptr_t) pool->start;[m
[31m-[m
[31m-            goto done;[m
[31m-[m
[31m-        } else { /* shift > ngx_slab_exact_shift */[m
[31m-[m
[31m-            page->slab = ((uintptr_t) 1 << NGX_SLAB_MAP_SHIFT) | shift;[m
[31m-            page->next = &slots[slot];[m
[31m-            page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_BIG;[m
[31m-[m
[31m-            slots[slot].next = page;[m
[31m-[m
[31m-            p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-            p += (uintptr_t) pool->start;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = 0;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0,[m
[31m-                   "slab alloc: %p", (void *) p);[m
[31m-[m
[31m-    return (void *) p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    ngx_shmtx_lock(&pool->mutex);[m
[31m-[m
[31m-    p = ngx_slab_calloc_locked(pool, size);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&pool->mutex);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = ngx_slab_alloc_locked(pool, size);[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_slab_free(ngx_slab_pool_t *pool, void *p)[m
[31m-{[m
[31m-    ngx_shmtx_lock(&pool->mutex);[m
[31m-[m
[31m-    ngx_slab_free_locked(pool, p);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&pool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p)[m
[31m-{[m
[31m-    size_t            size;[m
[31m-    uintptr_t         slab, m, *bitmap;[m
[31m-    ngx_uint_t        n, type, slot, shift, map;[m
[31m-    ngx_slab_page_t  *slots, *page;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, "slab free: %p", p);[m
[31m-[m
[31m-    if ((u_char *) p < pool->start || (u_char *) p > pool->end) {[m
[31m-        ngx_slab_error(pool, NGX_LOG_ALERT, "ngx_slab_free(): outside of pool");[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    n = ((u_char *) p - pool->start) >> ngx_pagesize_shift;[m
[31m-    page = &pool->pages[n];[m
[31m-    slab = page->slab;[m
[31m-    type = page->prev & NGX_SLAB_PAGE_MASK;[m
[31m-[m
[31m-    switch (type) {[m
[31m-[m
[31m-    case NGX_SLAB_SMALL:[m
[31m-[m
[31m-        shift = slab & NGX_SLAB_SHIFT_MASK;[m
[31m-        size = 1 << shift;[m
[31m-[m
[31m-        if ((uintptr_t) p & (size - 1)) {[m
[31m-            goto wrong_chunk;[m
[31m-        }[m
[31m-[m
[31m-        n = ((uintptr_t) p & (ngx_pagesize - 1)) >> shift;[m
[31m-        m = (uintptr_t) 1 << (n & (sizeof(uintptr_t) * 8 - 1));[m
[31m-        n /= (sizeof(uintptr_t) * 8);[m
[31m-        bitmap = (uintptr_t *)[m
[31m-                             ((uintptr_t) p & ~((uintptr_t) ngx_pagesize - 1));[m
[31m-[m
[31m-        if (bitmap[n] & m) {[m
[31m-[m
[31m-            if (page->next == NULL) {[m
[31m-                slots = (ngx_slab_page_t *)[m
[31m-                                   ((u_char *) pool + sizeof(ngx_slab_pool_t));[m
[31m-                slot = shift - pool->min_shift;[m
[31m-[m
[31m-                page->next = slots[slot].next;[m
[31m-                slots[slot].next = page;[m
[31m-[m
[31m-                page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_SMALL;[m
[31m-                page->next->prev = (uintptr_t) page | NGX_SLAB_SMALL;[m
[31m-            }[m
[31m-[m
[31m-            bitmap[n] &= ~m;[m
[31m-[m
[31m-            n = (1 << (ngx_pagesize_shift - shift)) / 8 / (1 << shift);[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                n = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (bitmap[0] & ~(((uintptr_t) 1 << n) - 1)) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            map = (1 << (ngx_pagesize_shift - shift)) / (sizeof(uintptr_t) * 8);[m
[31m-[m
[31m-            for (n = 1; n < map; n++) {[m
[31m-                if (bitmap[n]) {[m
[31m-                    goto done;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_slab_free_pages(pool, page, 1);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        goto chunk_already_free;[m
[31m-[m
[31m-    case NGX_SLAB_EXACT:[m
[31m-[m
[31m-        m = (uintptr_t) 1 <<[m
[31m-                (((uintptr_t) p & (ngx_pagesize - 1)) >> ngx_slab_exact_shift);[m
[31m-        size = ngx_slab_exact_size;[m
[31m-[m
[31m-        if ((uintptr_t) p & (size - 1)) {[m
[31m-            goto wrong_chunk;[m
[31m-        }[m
[31m-[m
[31m-        if (slab & m) {[m
[31m-            if (slab == NGX_SLAB_BUSY) {[m
[31m-                slots = (ngx_slab_page_t *)[m
[31m-                                   ((u_char *) pool + sizeof(ngx_slab_pool_t));[m
[31m-                slot = ngx_slab_exact_shift - pool->min_shift;[m
[31m-[m
[31m-                page->next = slots[slot].next;[m
[31m-                slots[slot].next = page;[m
[31m-[m
[31m-                page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_EXACT;[m
[31m-                page->next->prev = (uintptr_t) page | NGX_SLAB_EXACT;[m
[31m-            }[m
[31m-[m
[31m-            page->slab &= ~m;[m
[31m-[m
[31m-            if (page->slab) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            ngx_slab_free_pages(pool, page, 1);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        goto chunk_already_free;[m
[31m-[m
[31m-    case NGX_SLAB_BIG:[m
[31m-[m
[31m-        shift = slab & NGX_SLAB_SHIFT_MASK;[m
[31m-        size = 1 << shift;[m
[31m-[m
[31m-        if ((uintptr_t) p & (size - 1)) {[m
[31m-            goto wrong_chunk;[m
[31m-        }[m
[31m-[m
[31m-        m = (uintptr_t) 1 << ((((uintptr_t) p & (ngx_pagesize - 1)) >> shift)[m
[31m-                              + NGX_SLAB_MAP_SHIFT);[m
[31m-[m
[31m-        if (slab & m) {[m
[31m-[m
[31m-            if (page->next == NULL) {[m
[31m-                slots = (ngx_slab_page_t *)[m
[31m-                                   ((u_char *) pool + sizeof(ngx_slab_pool_t));[m
[31m-                slot = shift - pool->min_shift;[m
[31m-[m
[31m-                page->next = slots[slot].next;[m
[31m-                slots[slot].next = page;[m
[31m-[m
[31m-                page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_BIG;[m
[31m-                page->next->prev = (uintptr_t) page | NGX_SLAB_BIG;[m
[31m-            }[m
[31m-[m
[31m-            page->slab &= ~m;[m
[31m-[m
[31m-            if (page->slab & NGX_SLAB_MAP_MASK) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            ngx_slab_free_pages(pool, page, 1);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        goto chunk_already_free;[m
[31m-[m
[31m-    case NGX_SLAB_PAGE:[m
[31m-[m
[31m-        if ((uintptr_t) p & (ngx_pagesize - 1)) {[m
[31m-            goto wrong_chunk;[m
[31m-        }[m
[31m-[m
[31m-        if (slab == NGX_SLAB_PAGE_FREE) {[m
[31m-            ngx_slab_error(pool, NGX_LOG_ALERT,[m
[31m-                           "ngx_slab_free(): page is already free");[m
[31m-            goto fail;[m
[31m-        }[m
[31m-[m
[31m-        if (slab == NGX_SLAB_PAGE_BUSY) {[m
[31m-            ngx_slab_error(pool, NGX_LOG_ALERT,[m
[31m-                           "ngx_slab_free(): pointer to wrong page");[m
[31m-            goto fail;[m
[31m-        }[m
[31m-[m
[31m-        n = ((u_char *) p - pool->start) >> ngx_pagesize_shift;[m
[31m-        size = slab & ~NGX_SLAB_PAGE_START;[m
[31m-[m
[31m-        ngx_slab_free_pages(pool, &pool->pages[n], size);[m
[31m-[m
[31m-        ngx_slab_junk(p, size << ngx_pagesize_shift);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* not reached */[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_slab_junk(p, size);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-wrong_chunk:[m
[31m-[m
[31m-    ngx_slab_error(pool, NGX_LOG_ALERT,[m
[31m-                   "ngx_slab_free(): pointer to wrong chunk");[m
[31m-[m
[31m-    goto fail;[m
[31m-[m
[31m-chunk_already_free:[m
[31m-[m
[31m-    ngx_slab_error(pool, NGX_LOG_ALERT,[m
[31m-                   "ngx_slab_free(): chunk is already free");[m
[31m-[m
[31m-fail:[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_slab_page_t *[m
[31m-ngx_slab_alloc_pages(ngx_slab_pool_t *pool, ngx_uint_t pages)[m
[31m-{[m
[31m-    ngx_slab_page_t  *page, *p;[m
[31m-[m
[31m-    for (page = pool->free.next; page != &pool->free; page = page->next) {[m
[31m-[m
[31m-        if (page->slab >= pages) {[m
[31m-[m
[31m-            if (page->slab > pages) {[m
[31m-                page[page->slab - 1].prev = (uintptr_t) &page[pages];[m
[31m-[m
[31m-                page[pages].slab = page->slab - pages;[m
[31m-                page[pages].next = page->next;[m
[31m-                page[pages].prev = page->prev;[m
[31m-[m
[31m-                p = (ngx_slab_page_t *) page->prev;[m
[31m-                p->next = &page[pages];[m
[31m-                page->next->prev = (uintptr_t) &page[pages];[m
[31m-[m
[31m-            } else {[m
[31m-                p = (ngx_slab_page_t *) page->prev;[m
[31m-                p->next = page->next;[m
[31m-                page->next->prev = page->prev;[m
[31m-            }[m
[31m-[m
[31m-            page->slab = pages | NGX_SLAB_PAGE_START;[m
[31m-            page->next = NULL;[m
[31m-            page->prev = NGX_SLAB_PAGE;[m
[31m-[m
[31m-            if (--pages == 0) {[m
[31m-                return page;[m
[31m-            }[m
[31m-[m
[31m-            for (p = page + 1; pages; pages--) {[m
[31m-                p->slab = NGX_SLAB_PAGE_BUSY;[m
[31m-                p->next = NULL;[m
[31m-                p->prev = NGX_SLAB_PAGE;[m
[31m-                p++;[m
[31m-            }[m
[31m-[m
[31m-            return page;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pool->log_nomem) {[m
[31m-        ngx_slab_error(pool, NGX_LOG_CRIT,[m
[31m-                       "ngx_slab_alloc() failed: no memory");[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page,[m
[31m-    ngx_uint_t pages)[m
[31m-{[m
[31m-    ngx_uint_t        type;[m
[31m-    ngx_slab_page_t  *prev, *join;[m
[31m-[m
[31m-    page->slab = pages--;[m
[31m-[m
[31m-    if (pages) {[m
[31m-        ngx_memzero(&page[1], pages * sizeof(ngx_slab_page_t));[m
[31m-    }[m
[31m-[m
[31m-    if (page->next) {[m
[31m-        prev = (ngx_slab_page_t *) (page->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-        prev->next = page->next;[m
[31m-        page->next->prev = page->prev;[m
[31m-    }[m
[31m-[m
[31m-    join = page + page->slab;[m
[31m-[m
[31m-    if (join < pool->last) {[m
[31m-        type = join->prev & NGX_SLAB_PAGE_MASK;[m
[31m-[m
[31m-        if (type == NGX_SLAB_PAGE) {[m
[31m-[m
[31m-            if (join->next != NULL) {[m
[31m-                pages += join->slab;[m
[31m-                page->slab += join->slab;[m
[31m-[m
[31m-                prev = (ngx_slab_page_t *) (join->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                prev->next = join->next;[m
[31m-                join->next->prev = join->prev;[m
[31m-[m
[31m-                join->slab = NGX_SLAB_PAGE_FREE;[m
[31m-                join->next = NULL;[m
[31m-                join->prev = NGX_SLAB_PAGE;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (page > pool->pages) {[m
[31m-        join = page - 1;[m
[31m-        type = join->prev & NGX_SLAB_PAGE_MASK;[m
[31m-[m
[31m-        if (type == NGX_SLAB_PAGE) {[m
[31m-[m
[31m-            if (join->slab == NGX_SLAB_PAGE_FREE) {[m
[31m-                join = (ngx_slab_page_t *) (join->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-            }[m
[31m-[m
[31m-            if (join->next != NULL) {[m
[31m-                pages += join->slab;[m
[31m-                join->slab += page->slab;[m
[31m-[m
[31m-                prev = (ngx_slab_page_t *) (join->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                prev->next = join->next;[m
[31m-                join->next->prev = join->prev;[m
[31m-[m
[31m-                page->slab = NGX_SLAB_PAGE_FREE;[m
[31m-                page->next = NULL;[m
[31m-                page->prev = NGX_SLAB_PAGE;[m
[31m-[m
[31m-                page = join;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pages) {[m
[31m-        page[pages].prev = (uintptr_t) page;[m
[31m-    }[m
[31m-[m
[31m-    page->prev = (uintptr_t) &pool->free;[m
[31m-    page->next = pool->free.next;[m
[31m-[m
[31m-    page->next->prev = (uintptr_t) page;[m
[31m-[m
[31m-    pool->free.next = page;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_slab_error(ngx_slab_pool_t *pool, ngx_uint_t level, char *text)[m
[31m-{[m
[31m-    ngx_log_error(level, ngx_cycle->log, 0, "%s%s", text, pool->log_ctx);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_slab.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_slab.h[m
[1mdeleted file mode 100644[m
[1mindex 2922a80..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_slab.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SLAB_H_INCLUDED_[m
[31m-#define _NGX_SLAB_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_slab_page_s  ngx_slab_page_t;[m
[31m-[m
[31m-struct ngx_slab_page_s {[m
[31m-    uintptr_t         slab;[m
[31m-    ngx_slab_page_t  *next;[m
[31m-    uintptr_t         prev;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shmtx_sh_t    lock;[m
[31m-[m
[31m-    size_t            min_size;[m
[31m-    size_t            min_shift;[m
[31m-[m
[31m-    ngx_slab_page_t  *pages;[m
[31m-    ngx_slab_page_t  *last;[m
[31m-    ngx_slab_page_t   free;[m
[31m-[m
[31m-    u_char           *start;[m
[31m-    u_char           *end;[m
[31m-[m
[31m-    ngx_shmtx_t       mutex;[m
[31m-[m
[31m-    u_char           *log_ctx;[m
[31m-    u_char            zero;[m
[31m-[m
[31m-    unsigned          log_nomem:1;[m
[31m-[m
[31m-    void             *data;[m
[31m-    void             *addr;[m
[31m-} ngx_slab_pool_t;[m
[31m-[m
[31m-[m
[31m-void ngx_slab_init(ngx_slab_pool_t *pool);[m
[31m-void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);[m
[31m-void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);[m
[31m-void *ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size);[m
[31m-void *ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size);[m
[31m-void ngx_slab_free(ngx_slab_pool_t *pool, void *p);[m
[31m-void ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SLAB_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_spinlock.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_spinlock.c[m
[1mdeleted file mode 100644[m
[1mindex 9c93afa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_spinlock.c[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)[m
[31m-{[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-    ngx_uint_t  i, n;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ncpu > 1) {[m
[31m-[m
[31m-            for (n = 1; n < spin; n <<= 1) {[m
[31m-[m
[31m-                for (i = 0; i < n; i++) {[m
[31m-                    ngx_cpu_pause();[m
[31m-                }[m
[31m-[m
[31m-                if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_sched_yield();[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-#error ngx_spinlock() or ngx_atomic_cmp_set() are not defined ![m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_string.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_string.c[m
[1mdeleted file mode 100644[m
[1mindex cf665a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_string.c[m
[1m+++ /dev/null[m
[36m@@ -1,1976 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64,[m
[31m-    u_char zero, ngx_uint_t hexadecimal, ngx_uint_t width);[m
[31m-static void ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src,[m
[31m-    const u_char *basis, ngx_uint_t padding);[m
[31m-static ngx_int_t ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src,[m
[31m-    const u_char *basis);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_strlow(u_char *dst, u_char *src, size_t n)[m
[31m-{[m
[31m-    while (n) {[m
[31m-        *dst = ngx_tolower(*src);[m
[31m-        dst++;[m
[31m-        src++;[m
[31m-        n--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_cpystrn(u_char *dst, u_char *src, size_t n)[m
[31m-{[m
[31m-    if (n == 0) {[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    while (--n) {[m
[31m-        *dst = *src;[m
[31m-[m
[31m-        if (*dst == '\0') {[m
[31m-            return dst;[m
[31m-        }[m
[31m-[m
[31m-        dst++;[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    *dst = '\0';[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src)[m
[31m-{[m
[31m-    u_char  *dst;[m
[31m-[m
[31m-    dst = ngx_pnalloc(pool, src->len);[m
[31m-    if (dst == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(dst, src->data, src->len);[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * supported formats:[m
[31m- *    %[0][width][x][X]O        off_t[m
[31m- *    %[0][width]T              time_t[m
[31m- *    %[0][width][u][x|X]z      ssize_t/size_t[m
[31m- *    %[0][width][u][x|X]d      int/u_int[m
[31m- *    %[0][width][u][x|X]l      long[m
[31m- *    %[0][width|m][u][x|X]i    ngx_int_t/ngx_uint_t[m
[31m- *    %[0][width][u][x|X]D      int32_t/uint32_t[m
[31m- *    %[0][width][u][x|X]L      int64_t/uint64_t[m
[31m- *    %[0][width|m][u][x|X]A    ngx_atomic_int_t/ngx_atomic_uint_t[m
[31m- *    %[0][width][.width]f      double, max valid number fits to %18.15f[m
[31m- *    %P                        ngx_pid_t[m
[31m- *    %M                        ngx_msec_t[m
[31m- *    %r                        rlim_t[m
[31m- *    %p                        void *[m
[31m- *    %V                        ngx_str_t *[m
[31m- *    %v                        ngx_variable_value_t *[m
[31m- *    %s                        null-terminated string[m
[31m- *    %*s                       length and string[m
[31m- *    %Z                        '\0'[m
[31m- *    %N                        '\n'[m
[31m- *    %c                        char[m
[31m- *    %%                        %[m
[31m- *[m
[31m- *  reserved:[m
[31m- *    %t                        ptrdiff_t[m
[31m- *    %S                        null-terminated wchar string[m
[31m- *    %C                        wchar[m
[31m- */[m
[31m-[m
[31m-[m
[31m-u_char * ngx_cdecl[m
[31m-ngx_sprintf(u_char *buf, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p;[m
[31m-    va_list   args;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(buf, (void *) -1, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char * ngx_cdecl[m
[31m-ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p;[m
[31m-    va_list   args;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(buf, buf + max, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char * ngx_cdecl[m
[31m-ngx_slprintf(u_char *buf, u_char *last, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p;[m
[31m-    va_list   args;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(buf, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args)[m
[31m-{[m
[31m-    u_char                *p, zero;[m
[31m-    int                    d;[m
[31m-    double                 f;[m
[31m-    size_t                 len, slen;[m
[31m-    int64_t                i64;[m
[31m-    uint64_t               ui64, frac;[m
[31m-    ngx_msec_t             ms;[m
[31m-    ngx_uint_t             width, sign, hex, max_width, frac_width, scale, n;[m
[31m-    ngx_str_t             *v;[m
[31m-    ngx_variable_value_t  *vv;[m
[31m-[m
[31m-    while (*fmt && buf < last) {[m
[31m-[m
[31m-        /*[m
[31m-         * "buf < last" means that we could copy at least one character:[m
[31m-         * the plain character, "%%", "%c", and minus without the checking[m
[31m-         */[m
[31m-[m
[31m-        if (*fmt == '%') {[m
[31m-[m
[31m-            i64 = 0;[m
[31m-            ui64 = 0;[m
[31m-[m
[31m-            zero = (u_char) ((*++fmt == '0') ? '0' : ' ');[m
[31m-            width = 0;[m
[31m-            sign = 1;[m
[31m-            hex = 0;[m
[31m-            max_width = 0;[m
[31m-            frac_width = 0;[m
[31m-            slen = (size_t) -1;[m
[31m-[m
[31m-            while (*fmt >= '0' && *fmt <= '9') {[m
[31m-                width = width * 10 + *fmt++ - '0';[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            for ( ;; ) {[m
[31m-                switch (*fmt) {[m
[31m-[m
[31m-                case 'u':[m
[31m-                    sign = 0;[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                case 'm':[m
[31m-                    max_width = 1;[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                case 'X':[m
[31m-                    hex = 2;[m
[31m-                    sign = 0;[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                case 'x':[m
[31m-                    hex = 1;[m
[31m-                    sign = 0;[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                case '.':[m
[31m-                    fmt++;[m
[31m-[m
[31m-                    while (*fmt >= '0' && *fmt <= '9') {[m
[31m-                        frac_width = frac_width * 10 + *fmt++ - '0';[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case '*':[m
[31m-                    slen = va_arg(args, size_t);[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                default:[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            switch (*fmt) {[m
[31m-[m
[31m-            case 'V':[m
[31m-                v = va_arg(args, ngx_str_t *);[m
[31m-[m
[31m-                len = ngx_min(((size_t) (last - buf)), v->len);[m
[31m-                buf = ngx_cpymem(buf, v->data, len);[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 'v':[m
[31m-                vv = va_arg(args, ngx_variable_value_t *);[m
[31m-[m
[31m-                len = ngx_min(((size_t) (last - buf)), vv->len);[m
[31m-                buf = ngx_cpymem(buf, vv->data, len);[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 's':[m
[31m-                p = va_arg(args, u_char *);[m
[31m-[m
[31m-                if (slen == (size_t) -1) {[m
[31m-                    while (*p && buf < last) {[m
[31m-                        *buf++ = *p++;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    len = ngx_min(((size_t) (last - buf)), slen);[m
[31m-                    buf = ngx_cpymem(buf, p, len);[m
[31m-                }[m
[31m-[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 'O':[m
[31m-                i64 = (int64_t) va_arg(args, off_t);[m
[31m-                sign = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'P':[m
[31m-                i64 = (int64_t) va_arg(args, ngx_pid_t);[m
[31m-                sign = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'T':[m
[31m-                i64 = (int64_t) va_arg(args, time_t);[m
[31m-                sign = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'M':[m
[31m-                ms = (ngx_msec_t) va_arg(args, ngx_msec_t);[m
[31m-                if ((ngx_msec_int_t) ms == -1) {[m
[31m-                    sign = 1;[m
[31m-                    i64 = -1;[m
[31m-                } else {[m
[31m-                    sign = 0;[m
[31m-                    ui64 = (uint64_t) ms;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'z':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, ssize_t);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, size_t);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'i':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, ngx_int_t);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, ngx_uint_t);[m
[31m-                }[m
[31m-[m
[31m-                if (max_width) {[m
[31m-                    width = NGX_INT_T_LEN;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case 'd':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, int);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, u_int);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'l':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, long);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, u_long);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'D':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, int32_t);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, uint32_t);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'L':[m
[31m-                if (sign) {[m
[31m-                    i64 = va_arg(args, int64_t);[m
[31m-                } else {[m
[31m-                    ui64 = va_arg(args, uint64_t);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'A':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, ngx_atomic_int_t);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, ngx_atomic_uint_t);[m
[31m-                }[m
[31m-[m
[31m-                if (max_width) {[m
[31m-                    width = NGX_ATOMIC_T_LEN;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case 'f':[m
[31m-                f = va_arg(args, double);[m
[31m-[m
[31m-                if (f < 0) {[m
[31m-                    *buf++ = '-';[m
[31m-                    f = -f;[m
[31m-                }[m
[31m-[m
[31m-                ui64 = (int64_t) f;[m
[31m-                frac = 0;[m
[31m-[m
[31m-                if (frac_width) {[m
[31m-[m
[31m-                    scale = 1;[m
[31m-                    for (n = frac_width; n; n--) {[m
[31m-                        scale *= 10;[m
[31m-                    }[m
[31m-[m
[31m-                    frac = (uint64_t) ((f - (double) ui64) * scale + 0.5);[m
[31m-[m
[31m-                    if (frac == scale) {[m
[31m-                        ui64++;[m
[31m-                        frac = 0;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                buf = ngx_sprintf_num(buf, last, ui64, zero, 0, width);[m
[31m-[m
[31m-                if (frac_width) {[m
[31m-                    if (buf < last) {[m
[31m-                        *buf++ = '.';[m
[31m-                    }[m
[31m-[m
[31m-                    buf = ngx_sprintf_num(buf, last, frac, '0', 0, frac_width);[m
[31m-                }[m
[31m-[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-            case 'r':[m
[31m-                i64 = (int64_t) va_arg(args, rlim_t);[m
[31m-                sign = 1;[m
[31m-                break;[m
[31m-#endif[m
[31m-[m
[31m-            case 'p':[m
[31m-                ui64 = (uintptr_t) va_arg(args, void *);[m
[31m-                hex = 2;[m
[31m-                sign = 0;[m
[31m-                zero = '0';[m
[31m-                width = 2 * sizeof(void *);[m
[31m-                break;[m
[31m-[m
[31m-            case 'c':[m
[31m-                d = va_arg(args, int);[m
[31m-                *buf++ = (u_char) (d & 0xff);[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 'Z':[m
[31m-                *buf++ = '\0';[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 'N':[m
[31m-#if (NGX_WIN32)[m
[31m-                *buf++ = CR;[m
[31m-                if (buf < last) {[m
[31m-                    *buf++ = LF;[m
[31m-                }[m
[31m-#else[m
[31m-                *buf++ = LF;[m
[31m-#endif[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case '%':[m
[31m-                *buf++ = '%';[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-                *buf++ = *fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (sign) {[m
[31m-                if (i64 < 0) {[m
[31m-                    *buf++ = '-';[m
[31m-                    ui64 = (uint64_t) -i64;[m
[31m-[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) i64;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            buf = ngx_sprintf_num(buf, last, ui64, zero, hex, width);[m
[31m-[m
[31m-            fmt++;[m
[31m-[m
[31m-        } else {[m
[31m-            *buf++ = *fmt++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64, u_char zero,[m
[31m-    ngx_uint_t hexadecimal, ngx_uint_t width)[m
[31m-{[m
[31m-    u_char         *p, temp[NGX_INT64_LEN + 1];[m
[31m-                       /*[m
[31m-                        * we need temp[NGX_INT64_LEN] only,[m
[31m-                        * but icc issues the warning[m
[31m-                        */[m
[31m-    size_t          len;[m
[31m-    uint32_t        ui32;[m
[31m-    static u_char   hex[] = "0123456789abcdef";[m
[31m-    static u_char   HEX[] = "0123456789ABCDEF";[m
[31m-[m
[31m-    p = temp + NGX_INT64_LEN;[m
[31m-[m
[31m-    if (hexadecimal == 0) {[m
[31m-[m
[31m-        if (ui64 <= (uint64_t) NGX_MAX_UINT32_VALUE) {[m
[31m-[m
[31m-            /*[m
[31m-             * To divide 64-bit numbers and to find remainders[m
[31m-             * on the x86 platform gcc and icc call the libc functions[m
[31m-             * [u]divdi3() and [u]moddi3(), they call another function[m
[31m-             * in its turn.  On FreeBSD it is the qdivrem() function,[m
[31m-             * its source code is about 170 lines of the code.[m
[31m-             * The glibc counterpart is about 150 lines of the code.[m
[31m-             *[m
[31m-             * For 32-bit numbers and some divisors gcc and icc use[m
[31m-             * a inlined multiplication and shifts.  For example,[m
[31m-             * unsigned "i32 / 10" is compiled to[m
[31m-             *[m
[31m-             *     (i32 * 0xCCCCCCCD) >> 35[m
[31m-             */[m
[31m-[m
[31m-            ui32 = (uint32_t) ui64;[m
[31m-[m
[31m-            do {[m
[31m-                *--p = (u_char) (ui32 % 10 + '0');[m
[31m-            } while (ui32 /= 10);[m
[31m-[m
[31m-        } else {[m
[31m-            do {[m
[31m-                *--p = (u_char) (ui64 % 10 + '0');[m
[31m-            } while (ui64 /= 10);[m
[31m-        }[m
[31m-[m
[31m-    } else if (hexadecimal == 1) {[m
[31m-[m
[31m-        do {[m
[31m-[m
[31m-            /* the "(uint32_t)" cast disables the BCC's warning */[m
[31m-            *--p = hex[(uint32_t) (ui64 & 0xf)];[m
[31m-[m
[31m-        } while (ui64 >>= 4);[m
[31m-[m
[31m-    } else { /* hexadecimal == 2 */[m
[31m-[m
[31m-        do {[m
[31m-[m
[31m-            /* the "(uint32_t)" cast disables the BCC's warning */[m
[31m-            *--p = HEX[(uint32_t) (ui64 & 0xf)];[m
[31m-[m
[31m-        } while (ui64 >>= 4);[m
[31m-    }[m
[31m-[m
[31m-    /* zero or space padding */[m
[31m-[m
[31m-    len = (temp + NGX_INT64_LEN) - p;[m
[31m-[m
[31m-    while (len++ < width && buf < last) {[m
[31m-        *buf++ = zero;[m
[31m-    }[m
[31m-[m
[31m-    /* number safe copy */[m
[31m-[m
[31m-    len = (temp + NGX_INT64_LEN) - p;[m
[31m-[m
[31m-    if (buf + len > last) {[m
[31m-        len = last - buf;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_cpymem(buf, p, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * We use ngx_strcasecmp()/ngx_strncasecmp() for 7-bit ASCII strings only,[m
[31m- * and implement our own ngx_strcasecmp()/ngx_strncasecmp()[m
[31m- * to avoid libc locale overhead.  Besides, we use the ngx_uint_t's[m
[31m- * instead of the u_char's, because they are slightly faster.[m
[31m- */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_strcasecmp(u_char *s1, u_char *s2)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        c1 = (ngx_uint_t) *s1++;[m
[31m-        c2 = (ngx_uint_t) *s2++;[m
[31m-[m
[31m-        c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-        c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-[m
[31m-        if (c1 == c2) {[m
[31m-[m
[31m-            if (c1) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        return c1 - c2;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_strncasecmp(u_char *s1, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    while (n) {[m
[31m-        c1 = (ngx_uint_t) *s1++;[m
[31m-        c2 = (ngx_uint_t) *s2++;[m
[31m-[m
[31m-        c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-        c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-[m
[31m-        if (c1 == c2) {[m
[31m-[m
[31m-            if (c1) {[m
[31m-                n--;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        return c1 - c2;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strnstr(u_char *s1, char *s2, size_t len)[m
[31m-{[m
[31m-    u_char  c1, c2;[m
[31m-    size_t  n;[m
[31m-[m
[31m-    c2 = *(u_char *) s2++;[m
[31m-[m
[31m-    n = ngx_strlen(s2);[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (len-- == 0) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = *s1++;[m
[31m-[m
[31m-            if (c1 == 0) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-        if (n > len) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, (u_char *) s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_strstrn() and ngx_strcasestrn() are intended to search for static[m
[31m- * substring with known length in null-terminated string. The argument n[m
[31m- * must be length of the second substring - 1.[m
[31m- */[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strstrn(u_char *s1, char *s2, size_t n)[m
[31m-{[m
[31m-    u_char  c1, c2;[m
[31m-[m
[31m-    c2 = *(u_char *) s2++;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            c1 = *s1++;[m
[31m-[m
[31m-            if (c1 == 0) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, (u_char *) s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strcasestrn(u_char *s1, char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-            if (c1 == 0) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncasecmp(s1, (u_char *) s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_strlcasestrn() is intended to search for static substring[m
[31m- * with known length in string until the argument last. The argument n[m
[31m- * must be length of the second substring - 1.[m
[31m- */[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-    last -= n;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (s1 >= last) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-            c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncasecmp(s1, s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_rstrncmp(u_char *s1, u_char *s2, size_t n)[m
[31m-{[m
[31m-    if (n == 0) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    n--;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (s1[n] != s2[n]) {[m
[31m-            return s1[n] - s2[n];[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        n--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n)[m
[31m-{[m
[31m-    u_char  c1, c2;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    n--;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        c1 = s1[n];[m
[31m-        if (c1 >= 'a' && c1 <= 'z') {[m
[31m-            c1 -= 'a' - 'A';[m
[31m-        }[m
[31m-[m
[31m-        c2 = s2[n];[m
[31m-        if (c2 >= 'a' && c2 <= 'z') {[m
[31m-            c2 -= 'a' - 'A';[m
[31m-        }[m
[31m-[m
[31m-        if (c1 != c2) {[m
[31m-            return c1 - c2;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        n--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_memn2cmp(u_char *s1, u_char *s2, size_t n1, size_t n2)[m
[31m-{[m
[31m-    size_t     n;[m
[31m-    ngx_int_t  m, z;[m
[31m-[m
[31m-    if (n1 <= n2) {[m
[31m-        n = n1;[m
[31m-        z = -1;[m
[31m-[m
[31m-    } else {[m
[31m-        n = n2;[m
[31m-        z = 1;[m
[31m-    }[m
[31m-[m
[31m-    m = ngx_memcmp(s1, s2, n);[m
[31m-[m
[31m-    if (m || n1 == n2) {[m
[31m-        return m;[m
[31m-    }[m
[31m-[m
[31m-    return z;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_dns_strcmp(u_char *s1, u_char *s2)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        c1 = (ngx_uint_t) *s1++;[m
[31m-        c2 = (ngx_uint_t) *s2++;[m
[31m-[m
[31m-        c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-        c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-[m
[31m-        if (c1 == c2) {[m
[31m-[m
[31m-            if (c1) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        /* in ASCII '.' > '-', but we need '.' to be the lowest character */[m
[31m-[m
[31m-        c1 = (c1 == '.') ? ' ' : c1;[m
[31m-        c2 = (c2 == '.') ? ' ' : c2;[m
[31m-[m
[31m-        return c1 - c2;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_filename_cmp(u_char *s1, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    while (n) {[m
[31m-        c1 = (ngx_uint_t) *s1++;[m
[31m-        c2 = (ngx_uint_t) *s2++;[m
[31m-[m
[31m-#if (NGX_HAVE_CASELESS_FILESYSTEM)[m
[31m-        c1 = tolower(c1);[m
[31m-        c2 = tolower(c2);[m
[31m-#endif[m
[31m-[m
[31m-        if (c1 == c2) {[m
[31m-[m
[31m-            if (c1) {[m
[31m-                n--;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        /* we need '/' to be the lowest character */[m
[31m-[m
[31m-        if (c1 == 0 || c2 == 0) {[m
[31m-            return c1 - c2;[m
[31m-        }[m
[31m-[m
[31m-        c1 = (c1 == '/') ? 0 : c1;[m
[31m-        c2 = (c2 == '/') ? 0 : c2;[m
[31m-[m
[31m-        return c1 - c2;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_atoi(u_char *line, size_t n)[m
[31m-{[m
[31m-    ngx_int_t  value, cutoff, cutlim;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_INT_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_INT_T_VALUE % 10;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* parse a fixed point number, e.g., ngx_atofp("10.5", 4, 2) returns 1050 */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_atofp(u_char *line, size_t n, size_t point)[m
[31m-{[m
[31m-    ngx_int_t   value, cutoff, cutlim;[m
[31m-    ngx_uint_t  dot;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_INT_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_INT_T_VALUE % 10;[m
[31m-[m
[31m-    dot = 0;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-[m
[31m-        if (point == 0) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (*line == '.') {[m
[31m-            if (dot) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            dot = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-        point -= dot;[m
[31m-    }[m
[31m-[m
[31m-    while (point--) {[m
[31m-        if (value > cutoff) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_atosz(u_char *line, size_t n)[m
[31m-{[m
[31m-    ssize_t  value, cutoff, cutlim;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_SIZE_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_SIZE_T_VALUE % 10;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-off_t[m
[31m-ngx_atoof(u_char *line, size_t n)[m
[31m-{[m
[31m-    off_t  value, cutoff, cutlim;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_OFF_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_OFF_T_VALUE % 10;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-time_t[m
[31m-ngx_atotm(u_char *line, size_t n)[m
[31m-{[m
[31m-    time_t  value, cutoff, cutlim;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_TIME_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_TIME_T_VALUE % 10;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hextoi(u_char *line, size_t n)[m
[31m-{[m
[31m-    u_char     c, ch;[m
[31m-    ngx_int_t  value, cutoff;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_INT_T_VALUE / 16;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (value > cutoff) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ch = *line;[m
[31m-[m
[31m-        if (ch >= '0' && ch <= '9') {[m
[31m-            value = value * 16 + (ch - '0');[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        c = (u_char) (ch | 0x20);[m
[31m-[m
[31m-        if (c >= 'a' && c <= 'f') {[m
[31m-            value = value * 16 + (c - 'a' + 10);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_hex_dump(u_char *dst, u_char *src, size_t len)[m
[31m-{[m
[31m-    static u_char  hex[] = "0123456789abcdef";[m
[31m-[m
[31m-    while (len--) {[m
[31m-        *dst++ = hex[*src >> 4];[m
[31m-        *dst++ = hex[*src++ & 0xf];[m
[31m-    }[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src)[m
[31m-{[m
[31m-    static u_char   basis64[] =[m
[31m-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";[m
[31m-[m
[31m-    ngx_encode_base64_internal(dst, src, basis64, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src)[m
[31m-{[m
[31m-    static u_char   basis64[] =[m
[31m-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";[m
[31m-[m
[31m-    ngx_encode_base64_internal(dst, src, basis64, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis,[m
[31m-    ngx_uint_t padding)[m
[31m-{[m
[31m-    u_char         *d, *s;[m
[31m-    size_t          len;[m
[31m-[m
[31m-    len = src->len;[m
[31m-    s = src->data;[m
[31m-    d = dst->data;[m
[31m-[m
[31m-    while (len > 2) {[m
[31m-        *d++ = basis[(s[0] >> 2) & 0x3f];[m
[31m-        *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];[m
[31m-        *d++ = basis[((s[1] & 0x0f) << 2) | (s[2] >> 6)];[m
[31m-        *d++ = basis[s[2] & 0x3f];[m
[31m-[m
[31m-        s += 3;[m
[31m-        len -= 3;[m
[31m-    }[m
[31m-[m
[31m-    if (len) {[m
[31m-        *d++ = basis[(s[0] >> 2) & 0x3f];[m
[31m-[m
[31m-        if (len == 1) {[m
[31m-            *d++ = basis[(s[0] & 3) << 4];[m
[31m-            if (padding) {[m
[31m-                *d++ = '=';[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];[m
[31m-            *d++ = basis[(s[1] & 0x0f) << 2];[m
[31m-        }[m
[31m-[m
[31m-        if (padding) {[m
[31m-            *d++ = '=';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dst->len = d - dst->data;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src)[m
[31m-{[m
[31m-    static u_char   basis64[] = {[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63,[m
[31m-        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,[m
[31m-        77,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,[m
[31m-        15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 77,[m
[31m-        77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,[m
[31m-        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,[m
[31m-[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77[m
[31m-    };[m
[31m-[m
[31m-    return ngx_decode_base64_internal(dst, src, basis64);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_decode_base64url(ngx_str_t *dst, ngx_str_t *src)[m
[31m-{[m
[31m-    static u_char   basis64[] = {[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77,[m
[31m-        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,[m
[31m-        77,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,[m
[31m-        15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 63,[m
[31m-        77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,[m
[31m-        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,[m
[31m-[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77[m
[31m-    };[m
[31m-[m
[31m-    return ngx_decode_base64_internal(dst, src, basis64);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis)[m
[31m-{[m
[31m-    size_t          len;[m
[31m-    u_char         *d, *s;[m
[31m-[m
[31m-    for (len = 0; len < src->len; len++) {[m
[31m-        if (src->data[len] == '=') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (basis[src->data[len]] == 77) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len % 4 == 1) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s = src->data;[m
[31m-    d = dst->data;[m
[31m-[m
[31m-    while (len > 3) {[m
[31m-        *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);[m
[31m-        *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);[m
[31m-        *d++ = (u_char) (basis[s[2]] << 6 | basis[s[3]]);[m
[31m-[m
[31m-        s += 4;[m
[31m-        len -= 4;[m
[31m-    }[m
[31m-[m
[31m-    if (len > 1) {[m
[31m-        *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);[m
[31m-    }[m
[31m-[m
[31m-    if (len > 2) {[m
[31m-        *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);[m
[31m-    }[m
[31m-[m
[31m-    dst->len = d - dst->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_utf8_decode() decodes two and more bytes UTF sequences only[m
[31m- * the return values:[m
[31m- *    0x80 - 0x10ffff         valid character[m
[31m- *    0x110000 - 0xfffffffd   invalid sequence[m
[31m- *    0xfffffffe              incomplete sequence[m
[31m- *    0xffffffff              error[m
[31m- */[m
[31m-[m
[31m-uint32_t[m
[31m-ngx_utf8_decode(u_char **p, size_t n)[m
[31m-{[m
[31m-    size_t    len;[m
[31m-    uint32_t  u, i, valid;[m
[31m-[m
[31m-    u = **p;[m
[31m-[m
[31m-    if (u >= 0xf0) {[m
[31m-[m
[31m-        u &= 0x07;[m
[31m-        valid = 0xffff;[m
[31m-        len = 3;[m
[31m-[m
[31m-    } else if (u >= 0xe0) {[m
[31m-[m
[31m-        u &= 0x0f;[m
[31m-        valid = 0x7ff;[m
[31m-        len = 2;[m
[31m-[m
[31m-    } else if (u >= 0xc2) {[m
[31m-[m
[31m-        u &= 0x1f;[m
[31m-        valid = 0x7f;[m
[31m-        len = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        (*p)++;[m
[31m-        return 0xffffffff;[m
[31m-    }[m
[31m-[m
[31m-    if (n - 1 < len) {[m
[31m-        return 0xfffffffe;[m
[31m-    }[m
[31m-[m
[31m-    (*p)++;[m
[31m-[m
[31m-    while (len) {[m
[31m-        i = *(*p)++;[m
[31m-[m
[31m-        if (i < 0x80) {[m
[31m-            return 0xffffffff;[m
[31m-        }[m
[31m-[m
[31m-        u = (u << 6) | (i & 0x3f);[m
[31m-[m
[31m-        len--;[m
[31m-    }[m
[31m-[m
[31m-    if (u > valid) {[m
[31m-        return u;[m
[31m-    }[m
[31m-[m
[31m-    return 0xffffffff;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_utf8_length(u_char *p, size_t n)[m
[31m-{[m
[31m-    u_char  c, *last;[m
[31m-    size_t  len;[m
[31m-[m
[31m-    last = p + n;[m
[31m-[m
[31m-    for (len = 0; p < last; len++) {[m
[31m-[m
[31m-        c = *p;[m
[31m-[m
[31m-        if (c < 0x80) {[m
[31m-            p++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_utf8_decode(&p, n) > 0x10ffff) {[m
[31m-            /* invalid UTF-8 */[m
[31m-            return n;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len)[m
[31m-{[m
[31m-    u_char  c, *next;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    while (--n) {[m
[31m-[m
[31m-        c = *src;[m
[31m-        *dst = c;[m
[31m-[m
[31m-        if (c < 0x80) {[m
[31m-[m
[31m-            if (c != '\0') {[m
[31m-                dst++;[m
[31m-                src++;[m
[31m-                len--;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return dst;[m
[31m-        }[m
[31m-[m
[31m-        next = src;[m
[31m-[m
[31m-        if (ngx_utf8_decode(&next, len) > 0x10ffff) {[m
[31m-            /* invalid UTF-8 */[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        while (src < next) {[m
[31m-            *dst++ = *src++;[m
[31m-            len--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *dst = '\0';[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t      n;[m
[31m-    uint32_t       *escape;[m
[31m-    static u_char   hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-                    /* " ", "#", "%", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   uri[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x80000029, /* 1000 0000 0000 0000  0000 0000 0010 1001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", "%", "&", "+", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   args[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x88000869, /* 1000 1000 0000 0000  0000 1000 0110 1001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* not ALPHA, DIGIT, "-", ".", "_", "~" */[m
[31m-[m
[31m-    static uint32_t   uri_component[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0xfc009fff, /* 1111 1100 0000 0000  1001 1111 1111 1111 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x78000001, /* 0111 1000 0000 0000  0000 0000 0000 0001 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0xb8000001, /* 1011 1000 0000 0000  0000 0000 0000 0001 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   html[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x000000ad, /* 0000 0000 0000 0000  0000 0000 1010 1101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   refresh[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000085, /* 0000 0000 0000 0000  0000 0000 1000 0101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "%", %00-%1F */[m
[31m-[m
[31m-    static uint32_t   memcached[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000021, /* 0000 0000 0000 0000  0000 0000 0010 0001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-    };[m
[31m-[m
[31m-                    /* mail_auth is the same as memcached */[m
[31m-[m
[31m-    static uint32_t  *map[] =[m
[31m-        { uri, args, uri_component, html, refresh, memcached, memcached };[m
[31m-[m
[31m-[m
[31m-    escape = map[type];[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '%';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type)[m
[31m-{[m
[31m-    u_char  *d, *s, ch, c, decoded;[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_quoted,[m
[31m-        sw_quoted_second[m
[31m-    } state;[m
[31m-[m
[31m-    d = *dst;[m
[31m-    s = *src;[m
[31m-[m
[31m-    state = 0;[m
[31m-    decoded = 0;[m
[31m-[m
[31m-    while (size--) {[m
[31m-[m
[31m-        ch = *s++;[m
[31m-[m
[31m-        switch (state) {[m
[31m-        case sw_usual:[m
[31m-            if (ch == '?'[m
[31m-                && (type & (NGX_UNESCAPE_URI|NGX_UNESCAPE_REDIRECT)))[m
[31m-            {[m
[31m-                *d++ = ch;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '%') {[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted:[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                decoded = (u_char) (ch - '0');[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                decoded = (u_char) (c - 'a' + 10);[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted_second:[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ch = (u_char) ((decoded << 4) + ch - '0');[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ch = (u_char) ((decoded << 4) + c - 'a' + 10);[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_URI) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = ch;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    *dst = d;[m
[31m-    *src = s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_escape_html(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    ngx_uint_t  len;[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        len = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            switch (*src++) {[m
[31m-[m
[31m-            case '<':[m
[31m-                len += sizeof("&lt;") - 2;[m
[31m-                break;[m
[31m-[m
[31m-            case '>':[m
[31m-                len += sizeof("&gt;") - 2;[m
[31m-                break;[m
[31m-[m
[31m-            case '&':[m
[31m-                len += sizeof("&amp;") - 2;[m
[31m-                break;[m
[31m-[m
[31m-            case '"':[m
[31m-                len += sizeof("&quot;") - 2;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) len;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        ch = *src++;[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '<':[m
[31m-            *dst++ = '&'; *dst++ = 'l'; *dst++ = 't'; *dst++ = ';';[m
[31m-            break;[m
[31m-[m
[31m-        case '>':[m
[31m-            *dst++ = '&'; *dst++ = 'g'; *dst++ = 't'; *dst++ = ';';[m
[31m-            break;[m
[31m-[m
[31m-        case '&':[m
[31m-            *dst++ = '&'; *dst++ = 'a'; *dst++ = 'm'; *dst++ = 'p';[m
[31m-            *dst++ = ';';[m
[31m-            break;[m
[31m-[m
[31m-        case '"':[m
[31m-            *dst++ = '&'; *dst++ = 'q'; *dst++ = 'u'; *dst++ = 'o';[m
[31m-            *dst++ = 't'; *dst++ = ';';[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            *dst++ = ch;[m
[31m-            break;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_escape_json(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    ngx_uint_t  len;[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        len = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            ch = *src++;[m
[31m-[m
[31m-            if (ch == '\\' || ch == '"') {[m
[31m-                len++;[m
[31m-[m
[31m-            } else if (ch <= 0x1f) {[m
[31m-                len += sizeof("\\u001F") - 2;[m
[31m-            }[m
[31m-[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) len;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        ch = *src++;[m
[31m-[m
[31m-        if (ch > 0x1f) {[m
[31m-[m
[31m-            if (ch == '\\' || ch == '"') {[m
[31m-                *dst++ = '\\';[m
[31m-            }[m
[31m-[m
[31m-            *dst++ = ch;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = '\\'; *dst++ = 'u'; *dst++ = '0'; *dst++ = '0';[m
[31m-            *dst++ = '0' + (ch >> 4);[m
[31m-[m
[31m-            ch &= 0xf;[m
[31m-[m
[31m-            *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10);[m
[31m-        }[m
[31m-[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_str_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_str_node_t      *n, *t;[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = (ngx_str_node_t *) node;[m
[31m-        t = (ngx_str_node_t *) temp;[m
[31m-[m
[31m-        if (node->key != temp->key) {[m
[31m-[m
[31m-            p = (node->key < temp->key) ? &temp->left : &temp->right;[m
[31m-[m
[31m-        } else if (n->str.len != t->str.len) {[m
[31m-[m
[31m-            p = (n->str.len < t->str.len) ? &temp->left : &temp->right;[m
[31m-[m
[31m-        } else {[m
[31m-            p = (ngx_memcmp(n->str.data, t->str.data, n->str.len) < 0)[m
[31m-                 ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_str_node_t *[m
[31m-ngx_str_rbtree_lookup(ngx_rbtree_t *rbtree, ngx_str_t *val, uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-    ngx_str_node_t     *n;[m
[31m-    ngx_rbtree_node_t  *node, *sentinel;[m
[31m-[m
[31m-    node = rbtree->root;[m
[31m-    sentinel = rbtree->sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        n = (ngx_str_node_t *) node;[m
[31m-[m
[31m-        if (hash != node->key) {[m
[31m-            node = (hash < node->key) ? node->left : node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (val->len != n->str.len) {[m
[31m-            node = (val->len < n->str.len) ? node->left : node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_memcmp(val->data, n->str.data, val->len);[m
[31m-[m
[31m-        if (rc < 0) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc > 0) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* ngx_sort() is implemented as insertion sort because we need stable sort */[m
[31m-[m
[31m-void[m
[31m-ngx_sort(void *base, size_t n, size_t size,[m
[31m-    ngx_int_t (*cmp)(const void *, const void *))[m
[31m-{[m
[31m-    u_char  *p1, *p2, *p;[m
[31m-[m
[31m-    p = ngx_alloc(size, ngx_cycle->log);[m
[31m-    if (p == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for (p1 = (u_char *) base + size;[m
[31m-         p1 < (u_char *) base + n * size;[m
[31m-         p1 += size)[m
[31m-    {[m
[31m-        ngx_memcpy(p, p1, size);[m
[31m-[m
[31m-        for (p2 = p1;[m
[31m-             p2 > (u_char *) base && cmp(p2 - size, p) > 0;[m
[31m-             p2 -= size)[m
[31m-        {[m
[31m-            ngx_memcpy(p2, p2 - size, size);[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p2, p, size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_MEMCPY_LIMIT)[m
[31m-[m
[31m-void *[m
[31m-ngx_memcpy(void *dst, const void *src, size_t n)[m
[31m-{[m
[31m-    if (n > NGX_MEMCPY_LIMIT) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "memcpy %uz bytes", n);[m
[31m-        ngx_debug_point();[m
[31m-    }[m
[31m-[m
[31m-    return memcpy(dst, src, n);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_string.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_string.h[m
[1mdeleted file mode 100644[m
[1mindex 7363bd2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_string.h[m
[1m+++ /dev/null[m
[36m@@ -1,234 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STRING_H_INCLUDED_[m
[31m-#define _NGX_STRING_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t      len;[m
[31m-    u_char     *data;[m
[31m-} ngx_str_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t   key;[m
[31m-    ngx_str_t   value;[m
[31m-} ngx_keyval_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned    len:28;[m
[31m-[m
[31m-    unsigned    valid:1;[m
[31m-    unsigned    no_cacheable:1;[m
[31m-    unsigned    not_found:1;[m
[31m-    unsigned    escape:1;[m
[31m-[m
[31m-    u_char     *data;[m
[31m-} ngx_variable_value_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_string(str)     { sizeof(str) - 1, (u_char *) str }[m
[31m-#define ngx_null_string     { 0, NULL }[m
[31m-#define ngx_str_set(str, text)                                               \[m
[31m-    (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text[m
[31m-#define ngx_str_null(str)   (str)->len = 0; (str)->data = NULL[m
[31m-[m
[31m-[m
[31m-#define ngx_tolower(c)      (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)[m
[31m-#define ngx_toupper(c)      (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)[m
[31m-[m
[31m-void ngx_strlow(u_char *dst, u_char *src, size_t n);[m
[31m-[m
[31m-[m
[31m-#define ngx_strncmp(s1, s2, n)  strncmp((const char *) s1, (const char *) s2, n)[m
[31m-[m
[31m-[m
[31m-/* msvc and icc7 compile strcmp() to inline loop */[m
[31m-#define ngx_strcmp(s1, s2)  strcmp((const char *) s1, (const char *) s2)[m
[31m-[m
[31m-[m
[31m-#define ngx_strstr(s1, s2)  strstr((const char *) s1, (const char *) s2)[m
[31m-#define ngx_strlen(s)       strlen((const char *) s)[m
[31m-[m
[31m-#define ngx_strchr(s1, c)   strchr((const char *) s1, (int) c)[m
[31m-[m
[31m-static ngx_inline u_char *[m
[31m-ngx_strlchr(u_char *p, u_char *last, u_char c)[m
[31m-{[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        if (*p == c) {[m
[31m-            return p;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * msvc and icc7 compile memset() to the inline "rep stos"[m
[31m- * while ZeroMemory() and bzero() are the calls.[m
[31m- * icc7 may also inline several mov's of a zeroed register for small blocks.[m
[31m- */[m
[31m-#define ngx_memzero(buf, n)       (void) memset(buf, 0, n)[m
[31m-#define ngx_memset(buf, c, n)     (void) memset(buf, c, n)[m
[31m-[m
[31m-[m
[31m-#if (NGX_MEMCPY_LIMIT)[m
[31m-[m
[31m-void *ngx_memcpy(void *dst, const void *src, size_t n);[m
[31m-#define ngx_cpymem(dst, src, n)   (((u_char *) ngx_memcpy(dst, src, n)) + (n))[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/*[m
[31m- * gcc3, msvc, and icc7 compile memcpy() to the inline "rep movs".[m
[31m- * gcc3 compiles memcpy(d, s, 4) to the inline "mov"es.[m
[31m- * icc8 compile memcpy(d, s, 4) to the inline "mov"es or XMM moves.[m
[31m- */[m
[31m-#define ngx_memcpy(dst, src, n)   (void) memcpy(dst, src, n)[m
[31m-#define ngx_cpymem(dst, src, n)   (((u_char *) memcpy(dst, src, n)) + (n))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if ( __INTEL_COMPILER >= 800 )[m
[31m-[m
[31m-/*[m
[31m- * the simple inline cycle copies the variable length strings up to 16[m
[31m- * bytes faster than icc8 autodetecting _intel_fast_memcpy()[m
[31m- */[m
[31m-[m
[31m-static ngx_inline u_char *[m
[31m-ngx_copy(u_char *dst, u_char *src, size_t len)[m
[31m-{[m
[31m-    if (len < 17) {[m
[31m-[m
[31m-        while (len) {[m
[31m-            *dst++ = *src++;[m
[31m-            len--;[m
[31m-        }[m
[31m-[m
[31m-        return dst;[m
[31m-[m
[31m-    } else {[m
[31m-        return ngx_cpymem(dst, src, len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_copy                  ngx_cpymem[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_memmove(dst, src, n)   (void) memmove(dst, src, n)[m
[31m-#define ngx_movemem(dst, src, n)   (((u_char *) memmove(dst, src, n)) + (n))[m
[31m-[m
[31m-[m
[31m-/* msvc and icc7 compile memcmp() to the inline loop */[m
[31m-#define ngx_memcmp(s1, s2, n)  memcmp((const char *) s1, (const char *) s2, n)[m
[31m-[m
[31m-[m
[31m-u_char *ngx_cpystrn(u_char *dst, u_char *src, size_t n);[m
[31m-u_char *ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src);[m
[31m-u_char * ngx_cdecl ngx_sprintf(u_char *buf, const char *fmt, ...);[m
[31m-u_char * ngx_cdecl ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...);[m
[31m-u_char * ngx_cdecl ngx_slprintf(u_char *buf, u_char *last, const char *fmt,[m
[31m-    ...);[m
[31m-u_char *ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args);[m
[31m-#define ngx_vsnprintf(buf, max, fmt, args)                                   \[m
[31m-    ngx_vslprintf(buf, buf + (max), fmt, args)[m
[31m-[m
[31m-ngx_int_t ngx_strcasecmp(u_char *s1, u_char *s2);[m
[31m-ngx_int_t ngx_strncasecmp(u_char *s1, u_char *s2, size_t n);[m
[31m-[m
[31m-u_char *ngx_strnstr(u_char *s1, char *s2, size_t n);[m
[31m-[m
[31m-u_char *ngx_strstrn(u_char *s1, char *s2, size_t n);[m
[31m-u_char *ngx_strcasestrn(u_char *s1, char *s2, size_t n);[m
[31m-u_char *ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n);[m
[31m-[m
[31m-ngx_int_t ngx_rstrncmp(u_char *s1, u_char *s2, size_t n);[m
[31m-ngx_int_t ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n);[m
[31m-ngx_int_t ngx_memn2cmp(u_char *s1, u_char *s2, size_t n1, size_t n2);[m
[31m-ngx_int_t ngx_dns_strcmp(u_char *s1, u_char *s2);[m
[31m-ngx_int_t ngx_filename_cmp(u_char *s1, u_char *s2, size_t n);[m
[31m-[m
[31m-ngx_int_t ngx_atoi(u_char *line, size_t n);[m
[31m-ngx_int_t ngx_atofp(u_char *line, size_t n, size_t point);[m
[31m-ssize_t ngx_atosz(u_char *line, size_t n);[m
[31m-off_t ngx_atoof(u_char *line, size_t n);[m
[31m-time_t ngx_atotm(u_char *line, size_t n);[m
[31m-ngx_int_t ngx_hextoi(u_char *line, size_t n);[m
[31m-[m
[31m-u_char *ngx_hex_dump(u_char *dst, u_char *src, size_t len);[m
[31m-[m
[31m-[m
[31m-#define ngx_base64_encoded_length(len)  (((len + 2) / 3) * 4)[m
[31m-#define ngx_base64_decoded_length(len)  (((len + 3) / 4) * 3)[m
[31m-[m
[31m-void ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src);[m
[31m-void ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src);[m
[31m-ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src);[m
[31m-ngx_int_t ngx_decode_base64url(ngx_str_t *dst, ngx_str_t *src);[m
[31m-[m
[31m-uint32_t ngx_utf8_decode(u_char **p, size_t n);[m
[31m-size_t ngx_utf8_length(u_char *p, size_t n);[m
[31m-u_char *ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len);[m
[31m-[m
[31m-[m
[31m-#define NGX_ESCAPE_URI            0[m
[31m-#define NGX_ESCAPE_ARGS           1[m
[31m-#define NGX_ESCAPE_URI_COMPONENT  2[m
[31m-#define NGX_ESCAPE_HTML           3[m
[31m-#define NGX_ESCAPE_REFRESH        4[m
[31m-#define NGX_ESCAPE_MEMCACHED      5[m
[31m-#define NGX_ESCAPE_MAIL_AUTH      6[m
[31m-[m
[31m-#define NGX_UNESCAPE_URI       1[m
[31m-#define NGX_UNESCAPE_REDIRECT  2[m
[31m-[m
[31m-uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,[m
[31m-    ngx_uint_t type);[m
[31m-void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);[m
[31m-uintptr_t ngx_escape_html(u_char *dst, u_char *src, size_t size);[m
[31m-uintptr_t ngx_escape_json(u_char *dst, u_char *src, size_t size);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_node_t         node;[m
[31m-    ngx_str_t                 str;[m
[31m-} ngx_str_node_t;[m
[31m-[m
[31m-[m
[31m-void ngx_str_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-ngx_str_node_t *ngx_str_rbtree_lookup(ngx_rbtree_t *rbtree, ngx_str_t *name,[m
[31m-    uint32_t hash);[m
[31m-[m
[31m-[m
[31m-void ngx_sort(void *base, size_t n, size_t size,[m
[31m-    ngx_int_t (*cmp)(const void *, const void *));[m
[31m-#define ngx_qsort             qsort[m
[31m-[m
[31m-[m
[31m-#define ngx_value_helper(n)   #n[m
[31m-#define ngx_value(n)          ngx_value_helper(n)[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STRING_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_syslog.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_syslog.c[m
[1mdeleted file mode 100644[m
[1mindex 0a67928..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_syslog.c[m
[1m+++ /dev/null[m
[36m@@ -1,382 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_SYSLOG_MAX_STR                                                    \[m
[31m-    NGX_MAX_ERROR_STR + sizeof("<255>Jan 01 00:00:00 ") - 1                   \[m
[31m-    + (NGX_MAXHOSTNAMELEN - 1) + 1 /* space */                                \[m
[31m-    + 32 /* tag */ + 2 /* colon, space */[m
[31m-[m
[31m-[m
[31m-static char *ngx_syslog_parse_args(ngx_conf_t *cf, ngx_syslog_peer_t *peer);[m
[31m-static ngx_int_t ngx_syslog_init_peer(ngx_syslog_peer_t *peer);[m
[31m-static void ngx_syslog_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-static char  *facilities[] = {[m
[31m-    "kern", "user", "mail", "daemon", "auth", "intern", "lpr", "news", "uucp",[m
[31m-    "clock", "authpriv", "ftp", "ntp", "audit", "alert", "cron", "local0",[m
[31m-    "local1", "local2", "local3", "local4", "local5", "local6", "local7",[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-/* note 'error/warn' like in nginx.conf, not 'err/warning' */[m
[31m-static char  *severities[] = {[m
[31m-    "emerg", "alert", "crit", "error", "warn", "notice", "info", "debug", NULL[m
[31m-};[m
[31m-[m
[31m-static ngx_log_t    ngx_syslog_dummy_log;[m
[31m-static ngx_event_t  ngx_syslog_dummy_event;[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_syslog_process_conf(ngx_conf_t *cf, ngx_syslog_peer_t *peer)[m
[31m-{[m
[31m-    peer->pool = cf->pool;[m
[31m-    peer->facility = NGX_CONF_UNSET_UINT;[m
[31m-    peer->severity = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    if (ngx_syslog_parse_args(cf, peer) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (peer->server.sockaddr == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no syslog server specified");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (peer->facility == NGX_CONF_UNSET_UINT) {[m
[31m-        peer->facility = 23; /* local7 */[m
[31m-    }[m
[31m-[m
[31m-    if (peer->severity == NGX_CONF_UNSET_UINT) {[m
[31m-        peer->severity = 6; /* info */[m
[31m-    }[m
[31m-[m
[31m-    if (peer->tag.data == NULL) {[m
[31m-        ngx_str_set(&peer->tag, "nginx");[m
[31m-    }[m
[31m-[m
[31m-    peer->conn.fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_syslog_parse_args(ngx_conf_t *cf, ngx_syslog_peer_t *peer)[m
[31m-{[m
[31m-    u_char      *p, *comma, c;[m
[31m-    size_t       len;[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_url_t    u;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    p = value[1].data + sizeof("syslog:") - 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        comma = (u_char *) ngx_strchr(p, ',');[m
[31m-[m
[31m-        if (comma != NULL) {[m
[31m-            len = comma - p;[m
[31m-            *comma = '\0';[m
[31m-[m
[31m-        } else {[m
[31m-            len = value[1].data + value[1].len - p;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(p, "server=", 7) == 0) {[m
[31m-[m
[31m-            if (peer->server.sockaddr != NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "duplicate syslog \"server\"");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-            u.url.data = p + 7;[m
[31m-            u.url.len = len - 7;[m
[31m-            u.default_port = 514;[m
[31m-[m
[31m-            if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-                if (u.err) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "%s in syslog server \"%V\"",[m
[31m-                                       u.err, &u.url);[m
[31m-                }[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            peer->server = u.addrs[0];[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "facility=", 9) == 0) {[m
[31m-[m
[31m-            if (peer->facility != NGX_CONF_UNSET_UINT) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "duplicate syslog \"facility\"");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; facilities[i] != NULL; i++) {[m
[31m-[m
[31m-                if (ngx_strcmp(p + 9, facilities[i]) == 0) {[m
[31m-                    peer->facility = i;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "unknown syslog facility \"%s\"", p + 9);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "severity=", 9) == 0) {[m
[31m-[m
[31m-            if (peer->severity != NGX_CONF_UNSET_UINT) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "duplicate syslog \"severity\"");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; severities[i] != NULL; i++) {[m
[31m-[m
[31m-                if (ngx_strcmp(p + 9, severities[i]) == 0) {[m
[31m-                    peer->severity = i;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "unknown syslog severity \"%s\"", p + 9);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "tag=", 4) == 0) {[m
[31m-[m
[31m-            if (peer->tag.data != NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "duplicate syslog \"tag\"");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * RFC 3164: the TAG is a string of ABNF alphanumeric characters[m
[31m-             * that MUST NOT exceed 32 characters.[m
[31m-             */[m
[31m-            if (len - 4 > 32) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "syslog tag length exceeds 32");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            for (i = 4; i < len; i++) {[m
[31m-                c = ngx_tolower(p[i]);[m
[31m-[m
[31m-                if (c < '0' || (c > '9' && c < 'a' && c != '_') || c > 'z') {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "syslog \"tag\" only allows "[m
[31m-                                       "alphanumeric characters "[m
[31m-                                       "and underscore");[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            peer->tag.data = p + 4;[m
[31m-            peer->tag.len = len - 4;[m
[31m-[m
[31m-        } else if (len == 10 && ngx_strncmp(p, "nohostname", 10) == 0) {[m
[31m-            peer->nohostname = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "unknown syslog parameter \"%s\"", p);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        if (comma == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        p = comma + 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_syslog_add_header(ngx_syslog_peer_t *peer, u_char *buf)[m
[31m-{[m
[31m-    ngx_uint_t  pri;[m
[31m-[m
[31m-    pri = peer->facility * 8 + peer->severity;[m
[31m-[m
[31m-    if (peer->nohostname) {[m
[31m-        return ngx_sprintf(buf, "<%ui>%V %V: ", pri, &ngx_cached_syslog_time,[m
[31m-                           &peer->tag);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_sprintf(buf, "<%ui>%V %V %V: ", pri, &ngx_cached_syslog_time,[m
[31m-                       &ngx_cycle->hostname, &peer->tag);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_syslog_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    u_char             *p, msg[NGX_SYSLOG_MAX_STR];[m
[31m-    ngx_uint_t          head_len;[m
[31m-    ngx_syslog_peer_t  *peer;[m
[31m-[m
[31m-    peer = log->wdata;[m
[31m-[m
[31m-    if (peer->busy) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    peer->busy = 1;[m
[31m-    peer->severity = level - 1;[m
[31m-[m
[31m-    p = ngx_syslog_add_header(peer, msg);[m
[31m-    head_len = p - msg;[m
[31m-[m
[31m-    len -= NGX_LINEFEED_SIZE;[m
[31m-[m
[31m-    if (len > NGX_SYSLOG_MAX_STR - head_len) {[m
[31m-        len = NGX_SYSLOG_MAX_STR - head_len;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(p, len, "%s", buf);[m
[31m-[m
[31m-    (void) ngx_syslog_send(peer, msg, p - msg);[m
[31m-[m
[31m-    peer->busy = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len)[m
[31m-{[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    if (peer->conn.fd == (ngx_socket_t) -1) {[m
[31m-        if (ngx_syslog_init_peer(peer) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* log syslog socket events with valid log */[m
[31m-    peer->conn.log = ngx_cycle->log;[m
[31m-[m
[31m-    if (ngx_send) {[m
[31m-        n = ngx_send(&peer->conn, buf, len);[m
[31m-[m
[31m-    } else {[m
[31m-        /* event module has not yet set ngx_io */[m
[31m-        n = ngx_os_io.send(&peer->conn, buf, len);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    if (n == NGX_ERROR && peer->server.sockaddr->sa_family == AF_UNIX) {[m
[31m-[m
[31m-        if (ngx_close_socket(peer->conn.fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " failed");[m
[31m-        }[m
[31m-[m
[31m-        peer->conn.fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_syslog_init_peer(ngx_syslog_peer_t *peer)[m
[31m-{[m
[31m-    ngx_socket_t         fd;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    peer->conn.read = &ngx_syslog_dummy_event;[m
[31m-    peer->conn.write = &ngx_syslog_dummy_event;[m
[31m-[m
[31m-    ngx_syslog_dummy_event.log = &ngx_syslog_dummy_log;[m
[31m-[m
[31m-    fd = ngx_socket(peer->server.sockaddr->sa_family, SOCK_DGRAM, 0);[m
[31m-    if (fd == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (connect(fd, peer->server.sockaddr, peer->server.socklen) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      "connect() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(peer->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln->data = peer;[m
[31m-    cln->handler = ngx_syslog_cleanup;[m
[31m-[m
[31m-    peer->conn.fd = fd;[m
[31m-[m
[31m-    /* UDP sockets are always ready to write */[m
[31m-    peer->conn.write->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_socket(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_syslog_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_syslog_peer_t  *peer = data;[m
[31m-[m
[31m-    /* prevents further use of this peer */[m
[31m-    peer->busy = 1;[m
[31m-[m
[31m-    if (peer->conn.fd == (ngx_socket_t) -1) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_socket(peer->conn.fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_syslog.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_syslog.h[m
[1mdeleted file mode 100644[m
[1mindex cc4c842..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_syslog.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SYSLOG_H_INCLUDED_[m
[31m-#define _NGX_SYSLOG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_pool_t       *pool;[m
[31m-    ngx_uint_t        facility;[m
[31m-    ngx_uint_t        severity;[m
[31m-    ngx_str_t         tag;[m
[31m-[m
[31m-    ngx_addr_t        server;[m
[31m-    ngx_connection_t  conn;[m
[31m-    unsigned          busy:1;[m
[31m-    unsigned          nohostname:1;[m
[31m-} ngx_syslog_peer_t;[m
[31m-[m
[31m-[m
[31m-char *ngx_syslog_process_conf(ngx_conf_t *cf, ngx_syslog_peer_t *peer);[m
[31m-u_char *ngx_syslog_add_header(ngx_syslog_peer_t *peer, u_char *buf);[m
[31m-void ngx_syslog_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf,[m
[31m-    size_t len);[m
[31m-ssize_t ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SYSLOG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_thread_pool.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_thread_pool.c[m
[1mdeleted file mode 100644[m
[1mindex f3655aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_thread_pool.c[m
[1m+++ /dev/null[m
[36m@@ -1,634 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_thread_pool.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t               pools;[m
[31m-} ngx_thread_pool_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_thread_task_t        *first;[m
[31m-    ngx_thread_task_t       **last;[m
[31m-} ngx_thread_pool_queue_t;[m
[31m-[m
[31m-#define ngx_thread_pool_queue_init(q)                                         \[m
[31m-    (q)->first = NULL;                                                        \[m
[31m-    (q)->last = &(q)->first[m
[31m-[m
[31m-[m
[31m-struct ngx_thread_pool_s {[m
[31m-    ngx_thread_mutex_t        mtx;[m
[31m-    ngx_thread_pool_queue_t   queue;[m
[31m-    ngx_int_t                 waiting;[m
[31m-    ngx_thread_cond_t         cond;[m
[31m-[m
[31m-    ngx_log_t                *log;[m
[31m-[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_uint_t                threads;[m
[31m-    ngx_int_t                 max_queue;[m
[31m-[m
[31m-    u_char                   *file;[m
[31m-    ngx_uint_t                line;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log,[m
[31m-    ngx_pool_t *pool);[m
[31m-static void ngx_thread_pool_destroy(ngx_thread_pool_t *tp);[m
[31m-static void ngx_thread_pool_exit_handler(void *data, ngx_log_t *log);[m
[31m-[m
[31m-static void *ngx_thread_pool_cycle(void *data);[m
[31m-static void ngx_thread_pool_handler(ngx_event_t *ev);[m
[31m-[m
[31m-static char *ngx_thread_pool(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-static void *ngx_thread_pool_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_thread_pool_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static ngx_int_t ngx_thread_pool_init_worker(ngx_cycle_t *cycle);[m
[31m-static void ngx_thread_pool_exit_worker(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_thread_pool_commands[] = {[m
[31m-[m
[31m-    { ngx_string("thread_pool"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE23,[m
[31m-      ngx_thread_pool,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_thread_pool_module_ctx = {[m
[31m-    ngx_string("thread_pool"),[m
[31m-    ngx_thread_pool_create_conf,[m
[31m-    ngx_thread_pool_init_conf[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_thread_pool_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_thread_pool_module_ctx,           /* module context */[m
[31m-    ngx_thread_pool_commands,              /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    ngx_thread_pool_init_worker,           /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    ngx_thread_pool_exit_worker,           /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_thread_pool_default = ngx_string("default");[m
[31m-[m
[31m-static ngx_uint_t               ngx_thread_pool_task_id;[m
[31m-static ngx_atomic_t             ngx_thread_pool_done_lock;[m
[31m-static ngx_thread_pool_queue_t  ngx_thread_pool_done;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log, ngx_pool_t *pool)[m
[31m-{[m
[31m-    int             err;[m
[31m-    pthread_t       tid;[m
[31m-    ngx_uint_t      n;[m
[31m-    pthread_attr_t  attr;[m
[31m-[m
[31m-    if (ngx_notify == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-               "the configured event method cannot be used with thread pools");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_thread_pool_queue_init(&tp->queue);[m
[31m-[m
[31m-    if (ngx_thread_mutex_create(&tp->mtx, log) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_thread_cond_create(&tp->cond, log) != NGX_OK) {[m
[31m-        (void) ngx_thread_mutex_destroy(&tp->mtx, log);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tp->log = log;[m
[31m-[m
[31m-    err = pthread_attr_init(&attr);[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "pthread_attr_init() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    err = pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "pthread_attr_setstacksize() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    for (n = 0; n < tp->threads; n++) {[m
[31m-        err = pthread_create(&tid, &attr, ngx_thread_pool_cycle, tp);[m
[31m-        if (err) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "pthread_create() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    (void) pthread_attr_destroy(&attr);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_pool_destroy(ngx_thread_pool_t *tp)[m
[31m-{[m
[31m-    ngx_uint_t           n;[m
[31m-    ngx_thread_task_t    task;[m
[31m-    volatile ngx_uint_t  lock;[m
[31m-[m
[31m-    ngx_memzero(&task, sizeof(ngx_thread_task_t));[m
[31m-[m
[31m-    task.handler = ngx_thread_pool_exit_handler;[m
[31m-    task.ctx = (void *) &lock;[m
[31m-[m
[31m-    for (n = 0; n < tp->threads; n++) {[m
[31m-        lock = 1;[m
[31m-[m
[31m-        if (ngx_thread_task_post(tp, &task) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        while (lock) {[m
[31m-            ngx_sched_yield();[m
[31m-        }[m
[31m-[m
[31m-        task.event.active = 0;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_thread_cond_destroy(&tp->cond, tp->log);[m
[31m-[m
[31m-    (void) ngx_thread_mutex_destroy(&tp->mtx, tp->log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_pool_exit_handler(void *data, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t *lock = data;[m
[31m-[m
[31m-    *lock = 0;[m
[31m-[m
[31m-    pthread_exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_thread_task_t *[m
[31m-ngx_thread_task_alloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    ngx_thread_task_t  *task;[m
[31m-[m
[31m-    task = ngx_pcalloc(pool, sizeof(ngx_thread_task_t) + size);[m
[31m-    if (task == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    task->ctx = task + 1;[m
[31m-[m
[31m-    return task;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_task_post(ngx_thread_pool_t *tp, ngx_thread_task_t *task)[m
[31m-{[m
[31m-    if (task->event.active) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, tp->log, 0,[m
[31m-                      "task #%ui already active", task->id);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_thread_mutex_lock(&tp->mtx, tp->log) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (tp->waiting >= tp->max_queue) {[m
[31m-        (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, tp->log, 0,[m
[31m-                      "thread pool \"%V\" queue overflow: %i tasks waiting",[m
[31m-                      &tp->name, tp->waiting);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    task->event.active = 1;[m
[31m-[m
[31m-    task->id = ngx_thread_pool_task_id++;[m
[31m-    task->next = NULL;[m
[31m-[m
[31m-    if (ngx_thread_cond_signal(&tp->cond, tp->log) != NGX_OK) {[m
[31m-        (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *tp->queue.last = task;[m
[31m-    tp->queue.last = &task->next;[m
[31m-[m
[31m-    tp->waiting++;[m
[31m-[m
[31m-    (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0,[m
[31m-                   "task #%ui added to thread pool \"%V\"",[m
[31m-                   task->id, &tp->name);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_thread_pool_cycle(void *data)[m
[31m-{[m
[31m-    ngx_thread_pool_t *tp = data;[m
[31m-[m
[31m-    int                 err;[m
[31m-    sigset_t            set;[m
[31m-    ngx_thread_task_t  *task;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, tp->log, 0,[m
[31m-                   "thread in pool \"%V\" started", &tp->name);[m
[31m-[m
[31m-    sigfillset(&set);[m
[31m-[m
[31m-    sigdelset(&set, SIGILL);[m
[31m-    sigdelset(&set, SIGFPE);[m
[31m-    sigdelset(&set, SIGSEGV);[m
[31m-    sigdelset(&set, SIGBUS);[m
[31m-[m
[31m-    err = pthread_sigmask(SIG_BLOCK, &set, NULL);[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, tp->log, err, "pthread_sigmask() failed");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (ngx_thread_mutex_lock(&tp->mtx, tp->log) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        /* the number may become negative */[m
[31m-        tp->waiting--;[m
[31m-[m
[31m-        while (tp->queue.first == NULL) {[m
[31m-            if (ngx_thread_cond_wait(&tp->cond, &tp->mtx, tp->log)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        task = tp->queue.first;[m
[31m-        tp->queue.first = task->next;[m
[31m-[m
[31m-        if (tp->queue.first == NULL) {[m
[31m-            tp->queue.last = &tp->queue.first;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_thread_mutex_unlock(&tp->mtx, tp->log) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0,[m
[31m-                       "run task #%ui in thread pool \"%V\"",[m
[31m-                       task->id, &tp->name);[m
[31m-[m
[31m-        task->handler(task->ctx, tp->log);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0,[m
[31m-                       "complete task #%ui in thread pool \"%V\"",[m
[31m-                       task->id, &tp->name);[m
[31m-[m
[31m-        task->next = NULL;[m
[31m-[m
[31m-        ngx_spinlock(&ngx_thread_pool_done_lock, 1, 2048);[m
[31m-[m
[31m-        *ngx_thread_pool_done.last = task;[m
[31m-        ngx_thread_pool_done.last = &task->next;[m
[31m-[m
[31m-        ngx_memory_barrier();[m
[31m-[m
[31m-        ngx_unlock(&ngx_thread_pool_done_lock);[m
[31m-[m
[31m-        (void) ngx_notify(ngx_thread_pool_handler);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_pool_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_t        *event;[m
[31m-    ngx_thread_task_t  *task;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "thread pool handler");[m
[31m-[m
[31m-    ngx_spinlock(&ngx_thread_pool_done_lock, 1, 2048);[m
[31m-[m
[31m-    task = ngx_thread_pool_done.first;[m
[31m-    ngx_thread_pool_done.first = NULL;[m
[31m-    ngx_thread_pool_done.last = &ngx_thread_pool_done.first;[m
[31m-[m
[31m-    ngx_memory_barrier();[m
[31m-[m
[31m-    ngx_unlock(&ngx_thread_pool_done_lock);[m
[31m-[m
[31m-    while (task) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                       "run completion handler for task #%ui", task->id);[m
[31m-[m
[31m-        event = &task->event;[m
[31m-        task = task->next;[m
[31m-[m
[31m-        event->complete = 1;[m
[31m-        event->active = 0;[m
[31m-[m
[31m-        event->handler(event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_thread_pool_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_thread_pool_conf_t  *tcf;[m
[31m-[m
[31m-    tcf = ngx_pcalloc(cycle->pool, sizeof(ngx_thread_pool_conf_t));[m
[31m-    if (tcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&tcf->pools, cycle->pool, 4,[m
[31m-                       sizeof(ngx_thread_pool_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return tcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_thread_pool_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_thread_pool_conf_t *tcf = conf;[m
[31m-[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_thread_pool_t  **tpp;[m
[31m-[m
[31m-    tpp = tcf->pools.elts;[m
[31m-[m
[31m-    for (i = 0; i < tcf->pools.nelts; i++) {[m
[31m-[m
[31m-        if (tpp[i]->threads) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (tpp[i]->name.len == ngx_thread_pool_default.len[m
[31m-            && ngx_strncmp(tpp[i]->name.data, ngx_thread_pool_default.data,[m
[31m-                           ngx_thread_pool_default.len)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            tpp[i]->threads = 32;[m
[31m-            tpp[i]->max_queue = 65536;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "unknown thread pool \"%V\" in %s:%ui",[m
[31m-                      &tpp[i]->name, tpp[i]->file, tpp[i]->line);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_thread_pool(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t          *value;[m
[31m-    ngx_uint_t          i;[m
[31m-    ngx_thread_pool_t  *tp;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    tp = ngx_thread_pool_add(cf, &value[1]);[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (tp->threads) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate thread pool \"%V\"", &tp->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tp->max_queue = 65536;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "threads=", 8) == 0) {[m
[31m-[m
[31m-            tp->threads = ngx_atoi(value[i].data + 8, value[i].len - 8);[m
[31m-[m
[31m-            if (tp->threads == (ngx_uint_t) NGX_ERROR || tp->threads == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid threads value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_queue=", 10) == 0) {[m
[31m-[m
[31m-            tp->max_queue = ngx_atoi(value[i].data + 10, value[i].len - 10);[m
[31m-[m
[31m-            if (tp->max_queue == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid max_queue value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (tp->threads == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"threads\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_thread_pool_t *[m
[31m-ngx_thread_pool_add(ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_thread_pool_t       *tp, **tpp;[m
[31m-    ngx_thread_pool_conf_t  *tcf;[m
[31m-[m
[31m-    if (name == NULL) {[m
[31m-        name = &ngx_thread_pool_default;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_thread_pool_get(cf->cycle, name);[m
[31m-[m
[31m-    if (tp) {[m
[31m-        return tp;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_pcalloc(cf->pool, sizeof(ngx_thread_pool_t));[m
[31m-    if (tp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    tp->name = *name;[m
[31m-    tp->file = cf->conf_file->file.name.data;[m
[31m-    tp->line = cf->conf_file->line;[m
[31m-[m
[31m-    tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cf->cycle->conf_ctx,[m
[31m-                                                  ngx_thread_pool_module);[m
[31m-[m
[31m-    tpp = ngx_array_push(&tcf->pools);[m
[31m-    if (tpp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *tpp = tp;[m
[31m-[m
[31m-    return tp;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_thread_pool_t *[m
[31m-ngx_thread_pool_get(ngx_cycle_t *cycle, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_thread_pool_t       **tpp;[m
[31m-    ngx_thread_pool_conf_t   *tcf;[m
[31m-[m
[31m-    tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                  ngx_thread_pool_module);[m
[31m-[m
[31m-    tpp = tcf->pools.elts;[m
[31m-[m
[31m-    for (i = 0; i < tcf->pools.nelts; i++) {[m
[31m-[m
[31m-        if (tpp[i]->name.len == name->len[m
[31m-            && ngx_strncmp(tpp[i]->name.data, name->data, name->len) == 0)[m
[31m-        {[m
[31m-            return tpp[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_thread_pool_init_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_thread_pool_t       **tpp;[m
[31m-    ngx_thread_pool_conf_t   *tcf;[m
[31m-[m
[31m-    if (ngx_process != NGX_PROCESS_WORKER[m
[31m-        && ngx_process != NGX_PROCESS_SINGLE)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                  ngx_thread_pool_module);[m
[31m-[m
[31m-    if (tcf == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_thread_pool_queue_init(&ngx_thread_pool_done);[m
[31m-[m
[31m-    tpp = tcf->pools.elts;[m
[31m-[m
[31m-    for (i = 0; i < tcf->pools.nelts; i++) {[m
[31m-        if (ngx_thread_pool_init(tpp[i], cycle->log, cycle->pool) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_pool_exit_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_thread_pool_t       **tpp;[m
[31m-    ngx_thread_pool_conf_t   *tcf;[m
[31m-[m
[31m-    if (ngx_process != NGX_PROCESS_WORKER[m
[31m-        && ngx_process != NGX_PROCESS_SINGLE)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                  ngx_thread_pool_module);[m
[31m-[m
[31m-    if (tcf == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    tpp = tcf->pools.elts;[m
[31m-[m
[31m-    for (i = 0; i < tcf->pools.nelts; i++) {[m
[31m-        ngx_thread_pool_destroy(tpp[i]);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_thread_pool.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_thread_pool.h[m
[1mdeleted file mode 100644[m
[1mindex 5e5adf6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_thread_pool.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_THREAD_POOL_H_INCLUDED_[m
[31m-#define _NGX_THREAD_POOL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-struct ngx_thread_task_s {[m
[31m-    ngx_thread_task_t   *next;[m
[31m-    ngx_uint_t           id;[m
[31m-    void                *ctx;[m
[31m-    void               (*handler)(void *data, ngx_log_t *log);[m
[31m-    ngx_event_t          event;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_thread_pool_s  ngx_thread_pool_t;[m
[31m-[m
[31m-[m
[31m-ngx_thread_pool_t *ngx_thread_pool_add(ngx_conf_t *cf, ngx_str_t *name);[m
[31m-ngx_thread_pool_t *ngx_thread_pool_get(ngx_cycle_t *cycle, ngx_str_t *name);[m
[31m-[m
[31m-ngx_thread_task_t *ngx_thread_task_alloc(ngx_pool_t *pool, size_t size);[m
[31m-ngx_int_t ngx_thread_task_post(ngx_thread_pool_t *tp, ngx_thread_task_t *task);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_THREAD_POOL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_times.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_times.c[m
[1mdeleted file mode 100644[m
[1mindex 843314a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_times.c[m
[1m+++ /dev/null[m
[36m@@ -1,428 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The time may be updated by signal handler or by several threads.[m
[31m- * The time update operations are rare and require to hold the ngx_time_lock.[m
[31m- * The time read operations are frequent, so they are lock-free and get time[m
[31m- * values and strings from the current slot.  Thus thread may get the corrupted[m
[31m- * values only if it is preempted while copying and then it is not scheduled[m
[31m- * to run more than NGX_TIME_SLOTS seconds.[m
[31m- */[m
[31m-[m
[31m-#define NGX_TIME_SLOTS   64[m
[31m-[m
[31m-static ngx_uint_t        slot;[m
[31m-static ngx_atomic_t      ngx_time_lock;[m
[31m-[m
[31m-volatile ngx_msec_t      ngx_current_msec;[m
[31m-volatile ngx_time_t     *ngx_cached_time;[m
[31m-volatile ngx_str_t       ngx_cached_err_log_time;[m
[31m-volatile ngx_str_t       ngx_cached_http_time;[m
[31m-volatile ngx_str_t       ngx_cached_http_log_time;[m
[31m-volatile ngx_str_t       ngx_cached_http_log_iso8601;[m
[31m-volatile ngx_str_t       ngx_cached_syslog_time;[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-/*[m
[31m- * localtime() and localtime_r() are not Async-Signal-Safe functions, therefore,[m
[31m- * they must not be called by a signal handler, so we use the cached[m
[31m- * GMT offset value. Fortunately the value is changed only two times a year.[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t         cached_gmtoff;[m
[31m-#endif[m
[31m-[m
[31m-static ngx_time_t        cached_time[NGX_TIME_SLOTS];[m
[31m-static u_char            cached_err_log_time[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("1970/09/28 12:00:00")];[m
[31m-static u_char            cached_http_time[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("Mon, 28 Sep 1970 06:00:00 GMT")];[m
[31m-static u_char            cached_http_log_time[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("28/Sep/1970:12:00:00 +0600")];[m
[31m-static u_char            cached_http_log_iso8601[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("1970-09-28T12:00:00+06:00")];[m
[31m-static u_char            cached_syslog_time[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("Sep 28 12:00:00")];[m
[31m-[m
[31m-[m
[31m-static char  *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };[m
[31m-static char  *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",[m
[31m-                           "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };[m
[31m-[m
[31m-void[m
[31m-ngx_time_init(void)[m
[31m-{[m
[31m-    ngx_cached_err_log_time.len = sizeof("1970/09/28 12:00:00") - 1;[m
[31m-    ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1;[m
[31m-    ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1;[m
[31m-    ngx_cached_http_log_iso8601.len = sizeof("1970-09-28T12:00:00+06:00") - 1;[m
[31m-    ngx_cached_syslog_time.len = sizeof("Sep 28 12:00:00") - 1;[m
[31m-[m
[31m-    ngx_cached_time = &cached_time[0];[m
[31m-[m
[31m-    ngx_time_update();[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_time_update(void)[m
[31m-{[m
[31m-    u_char          *p0, *p1, *p2, *p3, *p4;[m
[31m-    ngx_tm_t         tm, gmt;[m
[31m-    time_t           sec;[m
[31m-    ngx_uint_t       msec;[m
[31m-    ngx_time_t      *tp;[m
[31m-    struct timeval   tv;[m
[31m-[m
[31m-    if (!ngx_trylock(&ngx_time_lock)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_gettimeofday(&tv);[m
[31m-[m
[31m-    sec = tv.tv_sec;[m
[31m-    msec = tv.tv_usec / 1000;[m
[31m-[m
[31m-    ngx_current_msec = (ngx_msec_t) sec * 1000 + msec;[m
[31m-[m
[31m-    tp = &cached_time[slot];[m
[31m-[m
[31m-    if (tp->sec == sec) {[m
[31m-        tp->msec = msec;[m
[31m-        ngx_unlock(&ngx_time_lock);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (slot == NGX_TIME_SLOTS - 1) {[m
[31m-        slot = 0;[m
[31m-    } else {[m
[31m-        slot++;[m
[31m-    }[m
[31m-[m
[31m-    tp = &cached_time[slot];[m
[31m-[m
[31m-    tp->sec = sec;[m
[31m-    tp->msec = msec;[m
[31m-[m
[31m-    ngx_gmtime(sec, &gmt);[m
[31m-[m
[31m-[m
[31m-    p0 = &cached_http_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p0, "%s, %02d %s %4d %02d:%02d:%02d GMT",[m
[31m-                       week[gmt.ngx_tm_wday], gmt.ngx_tm_mday,[m
[31m-                       months[gmt.ngx_tm_mon - 1], gmt.ngx_tm_year,[m
[31m-                       gmt.ngx_tm_hour, gmt.ngx_tm_min, gmt.ngx_tm_sec);[m
[31m-[m
[31m-#if (NGX_HAVE_GETTIMEZONE)[m
[31m-[m
[31m-    tp->gmtoff = ngx_gettimezone();[m
[31m-    ngx_gmtime(sec + tp->gmtoff * 60, &tm);[m
[31m-[m
[31m-#elif (NGX_HAVE_GMTOFF)[m
[31m-[m
[31m-    ngx_localtime(sec, &tm);[m
[31m-    cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60);[m
[31m-    tp->gmtoff = cached_gmtoff;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_localtime(sec, &tm);[m
[31m-    cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst);[m
[31m-    tp->gmtoff = cached_gmtoff;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-    p1 = &cached_err_log_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p1, "%4d/%02d/%02d %02d:%02d:%02d",[m
[31m-                       tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                       tm.ngx_tm_mday, tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-[m
[31m-    p2 = &cached_http_log_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p2, "%02d/%s/%d:%02d:%02d:%02d %c%02i%02i",[m
[31m-                       tm.ngx_tm_mday, months[tm.ngx_tm_mon - 1],[m
[31m-                       tm.ngx_tm_year, tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min, tm.ngx_tm_sec,[m
[31m-                       tp->gmtoff < 0 ? '-' : '+',[m
[31m-                       ngx_abs(tp->gmtoff / 60), ngx_abs(tp->gmtoff % 60));[m
[31m-[m
[31m-    p3 = &cached_http_log_iso8601[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p3, "%4d-%02d-%02dT%02d:%02d:%02d%c%02i:%02i",[m
[31m-                       tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                       tm.ngx_tm_mday, tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min, tm.ngx_tm_sec,[m
[31m-                       tp->gmtoff < 0 ? '-' : '+',[m
[31m-                       ngx_abs(tp->gmtoff / 60), ngx_abs(tp->gmtoff % 60));[m
[31m-[m
[31m-    p4 = &cached_syslog_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p4, "%s %2d %02d:%02d:%02d",[m
[31m-                       months[tm.ngx_tm_mon - 1], tm.ngx_tm_mday,[m
[31m-                       tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-    ngx_memory_barrier();[m
[31m-[m
[31m-    ngx_cached_time = tp;[m
[31m-    ngx_cached_http_time.data = p0;[m
[31m-    ngx_cached_err_log_time.data = p1;[m
[31m-    ngx_cached_http_log_time.data = p2;[m
[31m-    ngx_cached_http_log_iso8601.data = p3;[m
[31m-    ngx_cached_syslog_time.data = p4;[m
[31m-[m
[31m-    ngx_unlock(&ngx_time_lock);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-void[m
[31m-ngx_time_sigsafe_update(void)[m
[31m-{[m
[31m-    u_char          *p, *p2;[m
[31m-    ngx_tm_t         tm;[m
[31m-    time_t           sec;[m
[31m-    ngx_time_t      *tp;[m
[31m-    struct timeval   tv;[m
[31m-[m
[31m-    if (!ngx_trylock(&ngx_time_lock)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_gettimeofday(&tv);[m
[31m-[m
[31m-    sec = tv.tv_sec;[m
[31m-[m
[31m-    tp = &cached_time[slot];[m
[31m-[m
[31m-    if (tp->sec == sec) {[m
[31m-        ngx_unlock(&ngx_time_lock);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (slot == NGX_TIME_SLOTS - 1) {[m
[31m-        slot = 0;[m
[31m-    } else {[m
[31m-        slot++;[m
[31m-    }[m
[31m-[m
[31m-    tp = &cached_time[slot];[m
[31m-[m
[31m-    tp->sec = 0;[m
[31m-[m
[31m-    ngx_gmtime(sec + cached_gmtoff * 60, &tm);[m
[31m-[m
[31m-    p = &cached_err_log_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p, "%4d/%02d/%02d %02d:%02d:%02d",[m
[31m-                       tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                       tm.ngx_tm_mday, tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-    p2 = &cached_syslog_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p2, "%s %2d %02d:%02d:%02d",[m
[31m-                       months[tm.ngx_tm_mon - 1], tm.ngx_tm_mday,[m
[31m-                       tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-    ngx_memory_barrier();[m
[31m-[m
[31m-    ngx_cached_err_log_time.data = p;[m
[31m-    ngx_cached_syslog_time.data = p2;[m
[31m-[m
[31m-    ngx_unlock(&ngx_time_lock);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_time(u_char *buf, time_t t)[m
[31m-{[m
[31m-    ngx_tm_t  tm;[m
[31m-[m
[31m-    ngx_gmtime(t, &tm);[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%s, %02d %s %4d %02d:%02d:%02d GMT",[m
[31m-                       week[tm.ngx_tm_wday],[m
[31m-                       tm.ngx_tm_mday,[m
[31m-                       months[tm.ngx_tm_mon - 1],[m
[31m-                       tm.ngx_tm_year,[m
[31m-                       tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min,[m
[31m-                       tm.ngx_tm_sec);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_cookie_time(u_char *buf, time_t t)[m
[31m-{[m
[31m-    ngx_tm_t  tm;[m
[31m-[m
[31m-    ngx_gmtime(t, &tm);[m
[31m-[m
[31m-    /*[m
[31m-     * Netscape 3.x does not understand 4-digit years at all and[m
[31m-     * 2-digit years more than "37"[m
[31m-     */[m
[31m-[m
[31m-    return ngx_sprintf(buf,[m
[31m-                       (tm.ngx_tm_year > 2037) ?[m
[31m-                                         "%s, %02d-%s-%d %02d:%02d:%02d GMT":[m
[31m-                                         "%s, %02d-%s-%02d %02d:%02d:%02d GMT",[m
[31m-                       week[tm.ngx_tm_wday],[m
[31m-                       tm.ngx_tm_mday,[m
[31m-                       months[tm.ngx_tm_mon - 1],[m
[31m-                       (tm.ngx_tm_year > 2037) ? tm.ngx_tm_year:[m
[31m-                                                 tm.ngx_tm_year % 100,[m
[31m-                       tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min,[m
[31m-                       tm.ngx_tm_sec);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_gmtime(time_t t, ngx_tm_t *tp)[m
[31m-{[m
[31m-    ngx_int_t   yday;[m
[31m-    ngx_uint_t  n, sec, min, hour, mday, mon, year, wday, days, leap;[m
[31m-[m
[31m-    /* the calculation is valid for positive time_t only */[m
[31m-[m
[31m-    n = (ngx_uint_t) t;[m
[31m-[m
[31m-    days = n / 86400;[m
[31m-[m
[31m-    /* January 1, 1970 was Thursday */[m
[31m-[m
[31m-    wday = (4 + days) % 7;[m
[31m-[m
[31m-    n %= 86400;[m
[31m-    hour = n / 3600;[m
[31m-    n %= 3600;[m
[31m-    min = n / 60;[m
[31m-    sec = n % 60;[m
[31m-[m
[31m-    /*[m
[31m-     * the algorithm based on Gauss' formula,[m
[31m-     * see src/http/ngx_http_parse_time.c[m
[31m-     */[m
[31m-[m
[31m-    /* days since March 1, 1 BC */[m
[31m-    days = days - (31 + 28) + 719527;[m
[31m-[m
[31m-    /*[m
[31m-     * The "days" should be adjusted to 1 only, however, some March 1st's go[m
[31m-     * to previous year, so we adjust them to 2.  This causes also shift of the[m
[31m-     * last February days to next year, but we catch the case when "yday"[m
[31m-     * becomes negative.[m
[31m-     */[m
[31m-[m
[31m-    year = (days + 2) * 400 / (365 * 400 + 100 - 4 + 1);[m
[31m-[m
[31m-    yday = days - (365 * year + year / 4 - year / 100 + year / 400);[m
[31m-[m
[31m-    if (yday < 0) {[m
[31m-        leap = (year % 4 == 0) && (year % 100 || (year % 400 == 0));[m
[31m-        yday = 365 + leap + yday;[m
[31m-        year--;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * The empirical formula that maps "yday" to month.[m
[31m-     * There are at least 10 variants, some of them are:[m
[31m-     *     mon = (yday + 31) * 15 / 459[m
[31m-     *     mon = (yday + 31) * 17 / 520[m
[31m-     *     mon = (yday + 31) * 20 / 612[m
[31m-     */[m
[31m-[m
[31m-    mon = (yday + 31) * 10 / 306;[m
[31m-[m
[31m-    /* the Gauss' formula that evaluates days before the month */[m
[31m-[m
[31m-    mday = yday - (367 * mon / 12 - 30) + 1;[m
[31m-[m
[31m-    if (yday >= 306) {[m
[31m-[m
[31m-        year++;[m
[31m-        mon -= 10;[m
[31m-[m
[31m-        /*[m
[31m-         * there is no "yday" in Win32 SYSTEMTIME[m
[31m-         *[m
[31m-         * yday -= 306;[m
[31m-         */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        mon += 2;[m
[31m-[m
[31m-        /*[m
[31m-         * there is no "yday" in Win32 SYSTEMTIME[m
[31m-         *[m
[31m-         * yday += 31 + 28 + leap;[m
[31m-         */[m
[31m-    }[m
[31m-[m
[31m-    tp->ngx_tm_sec = (ngx_tm_sec_t) sec;[m
[31m-    tp->ngx_tm_min = (ngx_tm_min_t) min;[m
[31m-    tp->ngx_tm_hour = (ngx_tm_hour_t) hour;[m
[31m-    tp->ngx_tm_mday = (ngx_tm_mday_t) mday;[m
[31m-    tp->ngx_tm_mon = (ngx_tm_mon_t) mon;[m
[31m-    tp->ngx_tm_year = (ngx_tm_year_t) year;[m
[31m-    tp->ngx_tm_wday = (ngx_tm_wday_t) wday;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-time_t[m
[31m-ngx_next_time(time_t when)[m
[31m-{[m
[31m-    time_t     now, next;[m
[31m-    struct tm  tm;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    ngx_libc_localtime(now, &tm);[m
[31m-[m
[31m-    tm.tm_hour = (int) (when / 3600);[m
[31m-    when %= 3600;[m
[31m-    tm.tm_min = (int) (when / 60);[m
[31m-    tm.tm_sec = (int) (when % 60);[m
[31m-[m
[31m-    next = mktime(&tm);[m
[31m-[m
[31m-    if (next == -1) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (next - now > 0) {[m
[31m-        return next;[m
[31m-    }[m
[31m-[m
[31m-    tm.tm_mday++;[m
[31m-[m
[31m-    /* mktime() should normalize a date (Jan 32, etc) */[m
[31m-[m
[31m-    next = mktime(&tm);[m
[31m-[m
[31m-    if (next != -1) {[m
[31m-        return next;[m
[31m-    }[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_times.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_times.h[m
[1mdeleted file mode 100644[m
[1mindex 94aedcd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/core/ngx_times.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_TIMES_H_INCLUDED_[m
[31m-#define _NGX_TIMES_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    time_t      sec;[m
[31m-    ngx_uint_t  msec;[m
[31m-    ngx_int_t   gmtoff;[m
[31m-} ngx_time_t;[m
[31m-[m
[31m-[m
[31m-void ngx_time_init(void);[m
[31m-void ngx_time_update(void);[m
[31m-void ngx_time_sigsafe_update(void);[m
[31m-u_char *ngx_http_time(u_char *buf, time_t t);[m
[31m-u_char *ngx_http_cookie_time(u_char *buf, time_t t);[m
[31m-void ngx_gmtime(time_t t, ngx_tm_t *tp);[m
[31m-[m
[31m-time_t ngx_next_time(time_t when);[m
[31m-#define ngx_next_time_n      "mktime()"[m
[31m-[m
[31m-[m
[31m-extern volatile ngx_time_t  *ngx_cached_time;[m
[31m-[m
[31m-#define ngx_time()           ngx_cached_time->sec[m
[31m-#define ngx_timeofday()      (ngx_time_t *) ngx_cached_time[m
[31m-[m
[31m-extern volatile ngx_str_t    ngx_cached_err_log_time;[m
[31m-extern volatile ngx_str_t    ngx_cached_http_time;[m
[31m-extern volatile ngx_str_t    ngx_cached_http_log_time;[m
[31m-extern volatile ngx_str_t    ngx_cached_http_log_iso8601;[m
[31m-extern volatile ngx_str_t    ngx_cached_syslog_time;[m
[31m-[m
[31m-/*[m
[31m- * milliseconds elapsed since epoch and truncated to ngx_msec_t,[m
[31m- * used in event timers[m
[31m- */[m
[31m-extern volatile ngx_msec_t  ngx_current_msec;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_TIMES_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/nginx.stp b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/nginx.stp[m
[1mdeleted file mode 100644[m
[1mindex e824daf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/nginx.stp[m
[1m+++ /dev/null[m
[36m@@ -1,299 +0,0 @@[m
[31m-/* tapset for nginx */[m
[31m-[m
[31m-[m
[31m-function ngx_indent(n, delta)[m
[31m-{[m
[31m-    s = ""[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        s .= delta[m
[31m-    }[m
[31m-[m
[31m-    return s[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_http_subreq_depth(r)[m
[31m-{[m
[31m-    depth = 0[m
[31m-[m
[31m-    for (pr = @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->parent;[m
[31m-         pr != 0;[m
[31m-         pr = @cast(pr, "ngx_http_request_t", "NGX_SBIN_PATH")->parent)[m
[31m-    {[m
[31m-        depth++[m
[31m-    }[m
[31m-[m
[31m-    return depth[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_http_req_parent(r)[m
[31m-{[m
[31m-    return @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->parent[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* retrieve the request uri string from the ngx_http_request_t pointer */[m
[31m-function ngx_http_req_uri(r)[m
[31m-{[m
[31m-    len = @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->uri->len[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    return user_string_n(@cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->uri->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* retrieve the request query string from the ngx_http_request_t pointer */[m
[31m-function ngx_http_req_args(r)[m
[31m-{[m
[31m-    len = @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->args->len[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    return user_string_n(@cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->args->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* retrieve the first command name (or directive name) from[m
[31m- * the ngx_module_t pointer */[m
[31m-function ngx_http_module_cmd(m)[m
[31m-{[m
[31m-    cmds = @cast(m, "ngx_module_t", "NGX_SBIN_PATH")->commands[m
[31m-    if (cmds == 0) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    len = @cast(cmds, "ngx_command_t", "NGX_SBIN_PATH")->name->len[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    return user_string_n(@cast(cmds, "ngx_command_t", "NGX_SBIN_PATH")->name->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_chain_buf(cl)[m
[31m-{[m
[31m-    return @cast(cl, "ngx_chain_t", "NGX_SBIN_PATH")->buf[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_chain_next(cl)[m
[31m-{[m
[31m-    return @cast(cl, "ngx_chain_t", "NGX_SBIN_PATH")->next[m
[31m-}[m
[31m-[m
[31m-function ngx_buf_tag(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->tag[m
[31m-}[m
[31m-[m
[31m-function ngx_buf_in_memory(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->temporary[m
[31m-        || @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->memory[m
[31m-        || @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->mmap[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_pos(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->pos[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_file_pos(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->file_pos[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_last(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->last[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_file_last(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->file_last[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_end(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->end[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_in_file(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->in_file[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_last_buf(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->last_buf[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_last_in_chain(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->last_in_chain[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_sync(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->sync[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_flush(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->flush[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_size(b)[m
[31m-{[m
[31m-    if (ngx_buf_in_memory(b)) {[m
[31m-        return ngx_buf_last(b) - ngx_buf_pos(b)[m
[31m-    }[m
[31m-[m
[31m-    return ngx_buf_file_last(b) - ngx_buf_file_pos(b)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_data(b)[m
[31m-{[m
[31m-    return user_string_n(ngx_buf_pos(b), ngx_buf_last(b) - ngx_buf_pos(b))[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_chain_writer_ctx_out(ctx)[m
[31m-{[m
[31m-    return @cast(c, "ngx_chain_writer_ctx_t", "NGX_SBIN_PATH")->out[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_chain_dump:string (input)[m
[31m-{[m
[31m-    if (input == 0) {[m
[31m-        return "NULL"[m
[31m-    }[m
[31m-[m
[31m-    out = ""[m
[31m-    cl = input[m
[31m-    while (cl) {[m
[31m-        buf = ngx_chain_buf(cl)[m
[31m-[m
[31m-        if (ngx_buf_in_memory(buf)) {[m
[31m-            out .= sprintf("[%s]", text_str(ngx_buf_data(buf)))[m
[31m-[m
[31m-        } else {[m
[31m-            out .= "\"\""[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_in_file(buf)) {[m
[31m-            out .= sprintf("<in_file:%d-%d>", ngx_buf_file_pos(buf),[m
[31m-                           ngx_buf_file_last(buf))[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_last_buf(buf)) {[m
[31m-            out .= "<last_buf>"[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_last_in_chain(buf)) {[m
[31m-            out .= "<last_in_chain>"[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_sync(buf)) {[m
[31m-            out .= "<sync>"[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_flush(buf)) {[m
[31m-            out .= "<flush>"[m
[31m-        }[m
[31m-[m
[31m-        tag = ngx_buf_tag(buf)[m
[31m-        if (tag) {[m
[31m-            out .= sprintf("<tag:%p>", tag)[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_chain_next(cl)[m
[31m-        if (cl) {[m
[31m-            out .= " "[m
[31m-        }[m
[31m-    }[m
[31m-    return out[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_pool_cleanup_file_name(c)[m
[31m-{[m
[31m-    return user_string(@cast(c, "ngx_pool_cleanup_file_t", "NGX_SBIN_PATH")->name)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_http_req_content_length(r)[m
[31m-{[m
[31m-    return @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->headers_in->content_length_n[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_http_req_body_temp_file_name(r)[m
[31m-{[m
[31m-    rb = @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->request_body[m
[31m-    if (!rb) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    tf = @cast(rb, "ngx_http_request_body_t", "NGX_SBIN_PATH")->temp_file[m
[31m-    if (!tf) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    len = @cast(tf, "ngx_temp_file_t", "NGX_SBIN_PATH")->file->name->len[m
[31m-[m
[31m-    return user_string_n(@cast(tf, "ngx_temp_file_t", "NGX_SBIN_PATH")->file->name->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_table_elt_key(e)[m
[31m-{[m
[31m-    len = @cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->key->len[m
[31m-[m
[31m-    return user_string_n(@cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->key->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_table_elt_value(e)[m
[31m-{[m
[31m-    len = @cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->value->len[m
[31m-[m
[31m-    return user_string_n(@cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->value->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_iovec_dump:string (iov, iovcnt) {[m
[31m-    out = ""[m
[31m-    for (i = 0; i < iovcnt; i++) {[m
[31m-        out .= sprintf("\"%s\"(%p)", text_str(user_string_n([m
[31m-                @cast(iov, "struct iovec")[i]->iov_base,[m
[31m-                @cast(iov, "struct iovec")[i]->iov_len)[m
[31m-            ), @cast(iov, "struct iovec")[i]->iov_base)[m
[31m-        if (i != iovcnt - 1) {[m
[31m-            out .= " "[m
[31m-        }[m
[31m-    }[m
[31m-    return out[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/nginx_provider.d b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/nginx_provider.d[m
[1mdeleted file mode 100644[m
[1mindex 435adf4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/nginx_provider.d[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-typedef struct { int dummy; } ngx_str_t;[m
[31m-typedef int64_t ngx_int_t;[m
[31m-typedef uint64_t ngx_uint_t;[m
[31m-typedef ngx_uint_t ngx_msec_t;[m
[31m-typedef struct { int dummy; } ngx_module_t;[m
[31m-typedef struct { int dummy; } ngx_http_module_t;[m
[31m-typedef struct { int dummy; } ngx_table_elt_t;[m
[31m-typedef struct { int dummy; } ngx_event_t;[m
[31m-typedef struct { int dummy; } ngx_pool_t;[m
[31m-typedef char unsigned u_char;[m
[31m-[m
[31m-[m
[31m-provider nginx {[m
[31m-    /* probes for subrequests */[m
[31m-    probe http__subrequest__cycle(void *pr, ngx_str_t *uri, ngx_str_t *args);[m
[31m-    probe http__subrequest__start(void *r);[m
[31m-    probe http__subrequest__finalize_writing(void *r);[m
[31m-    probe http__subrequest__finalize_nonactive(void *r);[m
[31m-    probe http__subrequest__wake__parent(void *r);[m
[31m-    probe http__subrequest__done(void *r);[m
[31m-    probe http__subrequest__post__start(void *r, ngx_int_t rc);[m
[31m-    probe http__subrequest__post__done(void *r, ngx_int_t rc);[m
[31m-    probe http__module__post__config(ngx_module_t *m);[m
[31m-    probe http__read__body__done(void *r);[m
[31m-    probe http__read__req__line__done(void *r);[m
[31m-    probe http__read__req__header__done(void *r, ngx_table_elt_t *h);[m
[31m-    probe timer__add(ngx_event_t *ev, ngx_msec_t timer);[m
[31m-    probe timer__del(ngx_event_t *ev);[m
[31m-    probe timer__expire(ngx_event_t *ev);[m
[31m-    probe create__pool__done(ngx_pool_t *pool, size_t size);[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#pragma D attributes Evolving/Evolving/Common      provider nginx provider[m
[31m-#pragma D attributes Private/Private/Unknown       provider nginx module[m
[31m-#pragma D attributes Private/Private/Unknown       provider nginx function[m
[31m-#pragma D attributes Private/Private/Common        provider nginx name[m
[31m-#pragma D attributes Evolving/Evolving/Common      provider nginx args[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/stap-nginx b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/stap-nginx[m
[1mdeleted file mode 100644[m
[1mindex 1bca4cf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/dtrace/stap-nginx[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-#!/bin/sh[m
[31m-[m
[31m-PATH="NGX_SBIN_DIR:$PATH"[m
[31m-export PATH[m
[31m-exec stap -d "NGX_SBIN_PATH" -I "NGX_TAPSET_PREFIX" "$@"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_devpoll_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_devpoll_module.c[m
[1mdeleted file mode 100644[m
[1mindex f985fbd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_devpoll_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,562 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_TEST_BUILD_DEVPOLL)[m
[31m-[m
[31m-/* Solaris declarations */[m
[31m-[m
[31m-#ifndef POLLREMOVE[m
[31m-#define POLLREMOVE   0x0800[m
[31m-#endif[m
[31m-#define DP_POLL      0xD001[m
[31m-#define DP_ISPOLLED  0xD002[m
[31m-[m
[31m-struct dvpoll {[m
[31m-    struct pollfd  *dp_fds;[m
[31m-    int             dp_nfds;[m
[31m-    int             dp_timeout;[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t      changes;[m
[31m-    ngx_uint_t      events;[m
[31m-} ngx_devpoll_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_devpoll_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_devpoll_process_events(ngx_cycle_t *cycle,[m
[31m-    ngx_msec_t timer, ngx_uint_t flags);[m
[31m-[m
[31m-static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static int              dp = -1;[m
[31m-static struct pollfd   *change_list, *event_list;[m
[31m-static ngx_uint_t       nchanges, max_changes, nevents;[m
[31m-[m
[31m-static ngx_event_t    **change_index;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t      devpoll_name = ngx_string("/dev/poll");[m
[31m-[m
[31m-static ngx_command_t  ngx_devpoll_commands[] = {[m
[31m-[m
[31m-    { ngx_string("devpoll_changes"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_devpoll_conf_t, changes),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("devpoll_events"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_devpoll_conf_t, events),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_devpoll_module_ctx = {[m
[31m-    &devpoll_name,[m
[31m-    ngx_devpoll_create_conf,               /* create configuration */[m
[31m-    ngx_devpoll_init_conf,                 /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_devpoll_add_event,             /* add an event */[m
[31m-        ngx_devpoll_del_event,             /* delete an event */[m
[31m-        ngx_devpoll_add_event,             /* enable an event */[m
[31m-        ngx_devpoll_del_event,             /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_devpoll_process_events,        /* process the events */[m
[31m-        ngx_devpoll_init,                  /* init the events */[m
[31m-        ngx_devpoll_done,                  /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_devpoll_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_devpoll_module_ctx,               /* module context */[m
[31m-    ngx_devpoll_commands,                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    size_t               n;[m
[31m-    ngx_devpoll_conf_t  *dpcf;[m
[31m-[m
[31m-    dpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_devpoll_module);[m
[31m-[m
[31m-    if (dp == -1) {[m
[31m-        dp = open("/dev/poll", O_RDWR);[m
[31m-[m
[31m-        if (dp == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "open(/dev/poll) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (max_changes < dpcf->changes) {[m
[31m-        if (nchanges) {[m
[31m-            n = nchanges * sizeof(struct pollfd);[m
[31m-            if (write(dp, change_list, n) != (ssize_t) n) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                              "write(/dev/poll) failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            nchanges = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (change_list) {[m
[31m-            ngx_free(change_list);[m
[31m-        }[m
[31m-[m
[31m-        change_list = ngx_alloc(sizeof(struct pollfd) * dpcf->changes,[m
[31m-                                cycle->log);[m
[31m-        if (change_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (change_index) {[m
[31m-            ngx_free(change_index);[m
[31m-        }[m
[31m-[m
[31m-        change_index = ngx_alloc(sizeof(ngx_event_t *) * dpcf->changes,[m
[31m-                                 cycle->log);[m
[31m-        if (change_index == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    max_changes = dpcf->changes;[m
[31m-[m
[31m-    if (nevents < dpcf->events) {[m
[31m-        if (event_list) {[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = ngx_alloc(sizeof(struct pollfd) * dpcf->events,[m
[31m-                               cycle->log);[m
[31m-        if (event_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    nevents = dpcf->events;[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_devpoll_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_FD_EVENT;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_devpoll_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (close(dp) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "close(/dev/poll) failed");[m
[31m-    }[m
[31m-[m
[31m-    dp = -1;[m
[31m-[m
[31m-    ngx_free(change_list);[m
[31m-    ngx_free(event_list);[m
[31m-    ngx_free(change_index);[m
[31m-[m
[31m-    change_list = NULL;[m
[31m-    event_list = NULL;[m
[31m-    change_index = NULL;[m
[31m-    max_changes = 0;[m
[31m-    nchanges = 0;[m
[31m-    nevents = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_connection_t *c;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-    event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    c = ev->data;[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "devpoll add event: fd:%d ev:%04Xi", c->fd, event);[m
[31m-#endif[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-[m
[31m-    return ngx_devpoll_set_event(ev, event, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-    event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "devpoll del event: fd:%d ev:%04Xi", c->fd, event);[m
[31m-[m
[31m-    if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        e = (event == POLLIN) ? c->write : c->read;[m
[31m-[m
[31m-        if (e) {[m
[31m-            e->active = 0;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* restore the pair event if it exists */[m
[31m-[m
[31m-    if (event == POLLIN) {[m
[31m-        e = c->write;[m
[31m-        event = POLLOUT;[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        event = POLLIN;[m
[31m-    }[m
[31m-[m
[31m-    if (e && e->active) {[m
[31m-        return ngx_devpoll_set_event(e, event, 0);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    size_t             n;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "devpoll fd:%d ev:%04Xi fl:%04Xi", c->fd, event, flags);[m
[31m-[m
[31m-    if (nchanges >= max_changes) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ev->log, 0,[m
[31m-                      "/dev/pool change list is filled up");[m
[31m-[m
[31m-        n = nchanges * sizeof(struct pollfd);[m
[31m-        if (write(dp, change_list, n) != (ssize_t) n) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                          "write(/dev/poll) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    change_list[nchanges].fd = c->fd;[m
[31m-    change_list[nchanges].events = (short) event;[m
[31m-    change_list[nchanges].revents = 0;[m
[31m-[m
[31m-    change_index[nchanges] = ev;[m
[31m-    ev->index = nchanges;[m
[31m-[m
[31m-    nchanges++;[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        n = nchanges * sizeof(struct pollfd);[m
[31m-        if (write(dp, change_list, n) != (ssize_t) n) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                          "write(/dev/poll) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                 events, revents, rc;[m
[31m-    size_t              n;[m
[31m-    ngx_fd_t            fd;[m
[31m-    ngx_err_t           err;[m
[31m-    ngx_int_t           i;[m
[31m-    ngx_uint_t          level, instance;[m
[31m-    ngx_event_t        *rev, *wev;[m
[31m-    ngx_queue_t        *queue;[m
[31m-    ngx_connection_t   *c;[m
[31m-    struct pollfd       pfd;[m
[31m-    struct dvpoll       dvp;[m
[31m-[m
[31m-    /* NGX_TIMER_INFINITE == INFTIM */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "devpoll timer: %M", timer);[m
[31m-[m
[31m-    if (nchanges) {[m
[31m-        n = nchanges * sizeof(struct pollfd);[m
[31m-        if (write(dp, change_list, n) != (ssize_t) n) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "write(/dev/poll) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    dvp.dp_fds = event_list;[m
[31m-    dvp.dp_nfds = (int) nevents;[m
[31m-    dvp.dp_timeout = timer;[m
[31m-    events = ioctl(dp, DP_POLL, &dvp);[m
[31m-[m
[31m-    err = (events == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "ioctl(DP_POLL) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (events == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "ioctl(DP_POLL) returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < events; i++) {[m
[31m-[m
[31m-        fd = event_list[i].fd;[m
[31m-        revents = event_list[i].revents;[m
[31m-[m
[31m-        c = ngx_cycle->files[fd];[m
[31m-[m
[31m-        if (c == NULL || c->fd == -1) {[m
[31m-[m
[31m-            pfd.fd = fd;[m
[31m-            pfd.events = 0;[m
[31m-            pfd.revents = 0;[m
[31m-[m
[31m-            rc = ioctl(dp, DP_ISPOLLED, &pfd);[m
[31m-[m
[31m-            switch (rc) {[m
[31m-[m
[31m-            case -1:[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                    "ioctl(DP_ISPOLLED) failed for socket %d, event %04Xd",[m
[31m-                    fd, revents);[m
[31m-                break;[m
[31m-[m
[31m-            case 0:[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                    "phantom event %04Xd for closed and removed socket %d",[m
[31m-                    revents, fd);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                    "unexpected event %04Xd for closed and removed socket %d, "[m
[31m-                    "ioctl(DP_ISPOLLED) returned rc:%d, fd:%d, event %04Xd",[m
[31m-                    revents, fd, rc, pfd.fd, pfd.revents);[m
[31m-[m
[31m-                pfd.fd = fd;[m
[31m-                pfd.events = POLLREMOVE;[m
[31m-                pfd.revents = 0;[m
[31m-[m
[31m-                if (write(dp, &pfd, sizeof(struct pollfd))[m
[31m-                    != (ssize_t) sizeof(struct pollfd))[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                                  "write(/dev/poll) for %d failed", fd);[m
[31m-                }[m
[31m-[m
[31m-                if (close(fd) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                                  "close(%d) failed", fd);[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "devpoll: fd:%d, ev:%04Xd, rev:%04Xd",[m
[31m-                       fd, event_list[i].events, revents);[m
[31m-[m
[31m-        if (revents & (POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                          "ioctl(DP_POLL) error fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                          fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-[m
[31m-        if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "strange ioctl(DP_POLL) events "[m
[31m-                          "fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                          fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-[m
[31m-        if ((revents & (POLLERR|POLLHUP|POLLNVAL))[m
[31m-             && (revents & (POLLIN|POLLOUT)) == 0)[m
[31m-        {[m
[31m-            /*[m
[31m-             * if the error events were returned without POLLIN or POLLOUT,[m
[31m-             * then add these flags to handle the events at least in one[m
[31m-             * active handler[m
[31m-             */[m
[31m-[m
[31m-            revents |= POLLIN|POLLOUT;[m
[31m-        }[m
[31m-[m
[31m-        rev = c->read;[m
[31m-[m
[31m-        if ((revents & POLLIN) && rev->active) {[m
[31m-            rev->ready = 1;[m
[31m-[m
[31m-            if (flags & NGX_POST_EVENTS) {[m
[31m-                queue = rev->accept ? &ngx_posted_accept_events[m
[31m-                                    : &ngx_posted_events;[m
[31m-[m
[31m-                ngx_post_event(rev, queue);[m
[31m-[m
[31m-            } else {[m
[31m-                instance = rev->instance;[m
[31m-[m
[31m-                rev->handler(rev);[m
[31m-[m
[31m-                if (c->fd == -1 || rev->instance != instance) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        if ((revents & POLLOUT) && wev->active) {[m
[31m-            wev->ready = 1;[m
[31m-[m
[31m-            if (flags & NGX_POST_EVENTS) {[m
[31m-                ngx_post_event(wev, &ngx_posted_events);[m
[31m-[m
[31m-            } else {[m
[31m-                wev->handler(wev);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_devpoll_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_devpoll_conf_t  *dpcf;[m
[31m-[m
[31m-    dpcf = ngx_palloc(cycle->pool, sizeof(ngx_devpoll_conf_t));[m
[31m-    if (dpcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dpcf->changes = NGX_CONF_UNSET;[m
[31m-    dpcf->events = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return dpcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_devpoll_conf_t *dpcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(dpcf->changes, 32);[m
[31m-    ngx_conf_init_uint_value(dpcf->events, 32);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_epoll_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_epoll_module.c[m
[1mdeleted file mode 100644[m
[1mindex 166c461..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_epoll_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,972 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_TEST_BUILD_EPOLL)[m
[31m-[m
[31m-/* epoll declarations */[m
[31m-[m
[31m-#define EPOLLIN        0x001[m
[31m-#define EPOLLPRI       0x002[m
[31m-#define EPOLLOUT       0x004[m
[31m-#define EPOLLRDNORM    0x040[m
[31m-#define EPOLLRDBAND    0x080[m
[31m-#define EPOLLWRNORM    0x100[m
[31m-#define EPOLLWRBAND    0x200[m
[31m-#define EPOLLMSG       0x400[m
[31m-#define EPOLLERR       0x008[m
[31m-#define EPOLLHUP       0x010[m
[31m-[m
[31m-#define EPOLLRDHUP     0x2000[m
[31m-[m
[31m-#define EPOLLET        0x80000000[m
[31m-#define EPOLLONESHOT   0x40000000[m
[31m-[m
[31m-#define EPOLL_CTL_ADD  1[m
[31m-#define EPOLL_CTL_DEL  2[m
[31m-#define EPOLL_CTL_MOD  3[m
[31m-[m
[31m-typedef union epoll_data {[m
[31m-    void         *ptr;[m
[31m-    int           fd;[m
[31m-    uint32_t      u32;[m
[31m-    uint64_t      u64;[m
[31m-} epoll_data_t;[m
[31m-[m
[31m-struct epoll_event {[m
[31m-    uint32_t      events;[m
[31m-    epoll_data_t  data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int epoll_create(int size);[m
[31m-[m
[31m-int epoll_create(int size)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);[m
[31m-[m
[31m-int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout);[m
[31m-[m
[31m-int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-#define SYS_eventfd       323[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-#define SYS_io_setup      245[m
[31m-#define SYS_io_destroy    246[m
[31m-#define SYS_io_getevents  247[m
[31m-[m
[31m-typedef u_int  aio_context_t;[m
[31m-[m
[31m-struct io_event {[m
[31m-    uint64_t  data;  /* the data field from the iocb */[m
[31m-    uint64_t  obj;   /* what iocb this event came from */[m
[31m-    int64_t   res;   /* result code for this event */[m
[31m-    int64_t   res2;  /* secondary result */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-#endif /* NGX_TEST_BUILD_EPOLL */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  events;[m
[31m-    ngx_uint_t  aio_requests;[m
[31m-} ngx_epoll_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-static ngx_int_t ngx_epoll_notify_init(ngx_log_t *log);[m
[31m-static void ngx_epoll_notify_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-static void ngx_epoll_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_epoll_add_connection(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_epoll_del_connection(ngx_connection_t *c,[m
[31m-    ngx_uint_t flags);[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-static ngx_int_t ngx_epoll_notify(ngx_event_handler_pt handler);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-static void ngx_epoll_eventfd_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_epoll_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static int                  ep = -1;[m
[31m-static struct epoll_event  *event_list;[m
[31m-static ngx_uint_t           nevents;[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-static int                  notify_fd = -1;[m
[31m-static ngx_event_t          notify_event;[m
[31m-static ngx_connection_t     notify_conn;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-int                         ngx_eventfd = -1;[m
[31m-aio_context_t               ngx_aio_ctx = 0;[m
[31m-[m
[31m-static ngx_event_t          ngx_eventfd_event;[m
[31m-static ngx_connection_t     ngx_eventfd_conn;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-static ngx_str_t      epoll_name = ngx_string("epoll");[m
[31m-[m
[31m-static ngx_command_t  ngx_epoll_commands[] = {[m
[31m-[m
[31m-    { ngx_string("epoll_events"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_epoll_conf_t, events),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_aio_requests"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_epoll_conf_t, aio_requests),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_epoll_module_ctx = {[m
[31m-    &epoll_name,[m
[31m-    ngx_epoll_create_conf,               /* create configuration */[m
[31m-    ngx_epoll_init_conf,                 /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_epoll_add_event,             /* add an event */[m
[31m-        ngx_epoll_del_event,             /* delete an event */[m
[31m-        ngx_epoll_add_event,             /* enable an event */[m
[31m-        ngx_epoll_del_event,             /* disable an event */[m
[31m-        ngx_epoll_add_connection,        /* add an connection */[m
[31m-        ngx_epoll_del_connection,        /* delete an connection */[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-        ngx_epoll_notify,                /* trigger a notify */[m
[31m-#else[m
[31m-        NULL,                            /* trigger a notify */[m
[31m-#endif[m
[31m-        ngx_epoll_process_events,        /* process the events */[m
[31m-        ngx_epoll_init,                  /* init the events */[m
[31m-        ngx_epoll_done,                  /* done the events */[m
[31m-    }[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_epoll_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_epoll_module_ctx,               /* module context */[m
[31m-    ngx_epoll_commands,                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                    /* module type */[m
[31m-    NULL,                                /* init master */[m
[31m-    NULL,                                /* init module */[m
[31m-    NULL,                                /* init process */[m
[31m-    NULL,                                /* init thread */[m
[31m-    NULL,                                /* exit thread */[m
[31m-    NULL,                                /* exit process */[m
[31m-    NULL,                                /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-/*[m
[31m- * We call io_setup(), io_destroy() io_submit(), and io_getevents() directly[m
[31m- * as syscalls instead of libaio usage, because the library header file[m
[31m- * supports eventfd() since 0.3.107 version only.[m
[31m- */[m
[31m-[m
[31m-static int[m
[31m-io_setup(u_int nr_reqs, aio_context_t *ctx)[m
[31m-{[m
[31m-    return syscall(SYS_io_setup, nr_reqs, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-io_destroy(aio_context_t ctx)[m
[31m-{[m
[31m-    return syscall(SYS_io_destroy, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-io_getevents(aio_context_t ctx, long min_nr, long nr, struct io_event *events,[m
[31m-    struct timespec *tmo)[m
[31m-{[m
[31m-    return syscall(SYS_io_getevents, ctx, min_nr, nr, events, tmo);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_epoll_aio_init(ngx_cycle_t *cycle, ngx_epoll_conf_t *epcf)[m
[31m-{[m
[31m-    int                 n;[m
[31m-    struct epoll_event  ee;[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_EVENTFD_H)[m
[31m-    ngx_eventfd = eventfd(0, 0);[m
[31m-#else[m
[31m-    ngx_eventfd = syscall(SYS_eventfd, 0);[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_eventfd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                      "eventfd() failed");[m
[31m-        ngx_file_aio = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "eventfd: %d", ngx_eventfd);[m
[31m-[m
[31m-    n = 1;[m
[31m-[m
[31m-    if (ioctl(ngx_eventfd, FIONBIO, &n) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                      "ioctl(eventfd, FIONBIO) failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (io_setup(epcf->aio_requests, &ngx_aio_ctx) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                      "io_setup() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_eventfd_event.data = &ngx_eventfd_conn;[m
[31m-    ngx_eventfd_event.handler = ngx_epoll_eventfd_handler;[m
[31m-    ngx_eventfd_event.log = cycle->log;[m
[31m-    ngx_eventfd_event.active = 1;[m
[31m-    ngx_eventfd_conn.fd = ngx_eventfd;[m
[31m-    ngx_eventfd_conn.read = &ngx_eventfd_event;[m
[31m-    ngx_eventfd_conn.log = cycle->log;[m
[31m-[m
[31m-    ee.events = EPOLLIN|EPOLLET;[m
[31m-    ee.data.ptr = &ngx_eventfd_conn;[m
[31m-[m
[31m-    if (epoll_ctl(ep, EPOLL_CTL_ADD, ngx_eventfd, &ee) != -1) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                  "epoll_ctl(EPOLL_CTL_ADD, eventfd) failed");[m
[31m-[m
[31m-    if (io_destroy(ngx_aio_ctx) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "io_destroy() failed");[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (close(ngx_eventfd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "eventfd close() failed");[m
[31m-    }[m
[31m-[m
[31m-    ngx_eventfd = -1;[m
[31m-    ngx_aio_ctx = 0;[m
[31m-    ngx_file_aio = 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_epoll_conf_t  *epcf;[m
[31m-[m
[31m-    epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);[m
[31m-[m
[31m-    if (ep == -1) {[m
[31m-        ep = epoll_create(cycle->connection_n / 2);[m
[31m-[m
[31m-        if (ep == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "epoll_create() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-        if (ngx_epoll_notify_init(cycle->log) != NGX_OK) {[m
[31m-            ngx_epoll_module_ctx.actions.notify = NULL;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-        ngx_epoll_aio_init(cycle, epcf);[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (nevents < epcf->events) {[m
[31m-        if (event_list) {[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = ngx_alloc(sizeof(struct epoll_event) * epcf->events,[m
[31m-                               cycle->log);[m
[31m-        if (event_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    nevents = epcf->events;[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_epoll_module_ctx.actions;[m
[31m-[m
[31m-#if (NGX_HAVE_CLEAR_EVENT)[m
[31m-    ngx_event_flags = NGX_USE_CLEAR_EVENT[m
[31m-#else[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT[m
[31m-#endif[m
[31m-                      |NGX_USE_GREEDY_EVENT[m
[31m-                      |NGX_USE_EPOLL_EVENT;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_notify_init(ngx_log_t *log)[m
[31m-{[m
[31m-    struct epoll_event  ee;[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_EVENTFD_H)[m
[31m-    notify_fd = eventfd(0, 0);[m
[31m-#else[m
[31m-    notify_fd = syscall(SYS_eventfd, 0);[m
[31m-#endif[m
[31m-[m
[31m-    if (notify_fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "eventfd() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                   "notify eventfd: %d", notify_fd);[m
[31m-[m
[31m-    notify_event.handler = ngx_epoll_notify_handler;[m
[31m-    notify_event.log = log;[m
[31m-    notify_event.active = 1;[m
[31m-[m
[31m-    notify_conn.fd = notify_fd;[m
[31m-    notify_conn.read = &notify_event;[m
[31m-    notify_conn.log = log;[m
[31m-[m
[31m-    ee.events = EPOLLIN|EPOLLET;[m
[31m-    ee.data.ptr = &notify_conn;[m
[31m-[m
[31m-    if (epoll_ctl(ep, EPOLL_CTL_ADD, notify_fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "epoll_ctl(EPOLL_CTL_ADD, eventfd) failed");[m
[31m-[m
[31m-        if (close(notify_fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                            "eventfd close() failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_epoll_notify_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ssize_t               n;[m
[31m-    uint64_t              count;[m
[31m-    ngx_err_t             err;[m
[31m-    ngx_event_handler_pt  handler;[m
[31m-[m
[31m-    if (++ev->index == NGX_MAX_UINT32_VALUE) {[m
[31m-        ev->index = 0;[m
[31m-[m
[31m-        n = read(notify_fd, &count, sizeof(uint64_t));[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "read() eventfd %d: %z count:%uL", notify_fd, n, count);[m
[31m-[m
[31m-        if ((size_t) n != sizeof(uint64_t)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, err,[m
[31m-                          "read() eventfd %d failed", notify_fd);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    handler = ev->data;[m
[31m-    handler(ev);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_epoll_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (close(ep) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "epoll close() failed");[m
[31m-    }[m
[31m-[m
[31m-    ep = -1;[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-[m
[31m-    if (close(notify_fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "eventfd close() failed");[m
[31m-    }[m
[31m-[m
[31m-    notify_fd = -1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-    if (ngx_eventfd != -1) {[m
[31m-[m
[31m-        if (io_destroy(ngx_aio_ctx) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "io_destroy() failed");[m
[31m-        }[m
[31m-[m
[31m-        if (close(ngx_eventfd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "eventfd close() failed");[m
[31m-        }[m
[31m-[m
[31m-        ngx_eventfd = -1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_aio_ctx = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_free(event_list);[m
[31m-[m
[31m-    event_list = NULL;[m
[31m-    nevents = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                  op;[m
[31m-    uint32_t             events, prev;[m
[31m-    ngx_event_t         *e;[m
[31m-    ngx_connection_t    *c;[m
[31m-    struct epoll_event   ee;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    events = (uint32_t) event;[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-        prev = EPOLLOUT;[m
[31m-#if (NGX_READ_EVENT != EPOLLIN|EPOLLRDHUP)[m
[31m-        events = EPOLLIN|EPOLLRDHUP;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        prev = EPOLLIN|EPOLLRDHUP;[m
[31m-#if (NGX_WRITE_EVENT != EPOLLOUT)[m
[31m-        events = EPOLLOUT;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (e->active) {[m
[31m-        op = EPOLL_CTL_MOD;[m
[31m-        events |= prev;[m
[31m-[m
[31m-    } else {[m
[31m-        op = EPOLL_CTL_ADD;[m
[31m-    }[m
[31m-[m
[31m-    ee.events = events | (uint32_t) flags;[m
[31m-    ee.data.ptr = (void *) ((uintptr_t) c | ev->instance);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "epoll add event: fd:%d op:%d ev:%08XD",[m
[31m-                   c->fd, op, ee.events);[m
[31m-[m
[31m-    if (epoll_ctl(ep, op, c->fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                      "epoll_ctl(%d, %d) failed", op, c->fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-#if 0[m
[31m-    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                  op;[m
[31m-    uint32_t             prev;[m
[31m-    ngx_event_t         *e;[m
[31m-    ngx_connection_t    *c;[m
[31m-    struct epoll_event   ee;[m
[31m-[m
[31m-    /*[m
[31m-     * when the file descriptor is closed, the epoll automatically deletes[m
[31m-     * it from its queue, so we do not need to delete explicitly the event[m
[31m-     * before the closing the file descriptor[m
[31m-     */[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        ev->active = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-        prev = EPOLLOUT;[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        prev = EPOLLIN|EPOLLRDHUP;[m
[31m-    }[m
[31m-[m
[31m-    if (e->active) {[m
[31m-        op = EPOLL_CTL_MOD;[m
[31m-        ee.events = prev | (uint32_t) flags;[m
[31m-        ee.data.ptr = (void *) ((uintptr_t) c | ev->instance);[m
[31m-[m
[31m-    } else {[m
[31m-        op = EPOLL_CTL_DEL;[m
[31m-        ee.events = 0;[m
[31m-        ee.data.ptr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "epoll del event: fd:%d op:%d ev:%08XD",[m
[31m-                   c->fd, op, ee.events);[m
[31m-[m
[31m-    if (epoll_ctl(ep, op, c->fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                      "epoll_ctl(%d, %d) failed", op, c->fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_add_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    struct epoll_event  ee;[m
[31m-[m
[31m-    ee.events = EPOLLIN|EPOLLOUT|EPOLLET|EPOLLRDHUP;[m
[31m-    ee.data.ptr = (void *) ((uintptr_t) c | c->read->instance);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "epoll add connection: fd:%d ev:%08XD", c->fd, ee.events);[m
[31m-[m
[31m-    if (epoll_ctl(ep, EPOLL_CTL_ADD, c->fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "epoll_ctl(EPOLL_CTL_ADD, %d) failed", c->fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->read->active = 1;[m
[31m-    c->write->active = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_del_connection(ngx_connection_t *c, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                 op;[m
[31m-    struct epoll_event  ee;[m
[31m-[m
[31m-    /*[m
[31m-     * when the file descriptor is closed the epoll automatically deletes[m
[31m-     * it from its queue so we do not need to delete explicitly the event[m
[31m-     * before the closing the file descriptor[m
[31m-     */[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        c->read->active = 0;[m
[31m-        c->write->active = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "epoll del connection: fd:%d", c->fd);[m
[31m-[m
[31m-    op = EPOLL_CTL_DEL;[m
[31m-    ee.events = 0;[m
[31m-    ee.data.ptr = NULL;[m
[31m-[m
[31m-    if (epoll_ctl(ep, op, c->fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "epoll_ctl(%d, %d) failed", op, c->fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->read->active = 0;[m
[31m-    c->write->active = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_notify(ngx_event_handler_pt handler)[m
[31m-{[m
[31m-    static uint64_t inc = 1;[m
[31m-[m
[31m-    notify_event.data = handler;[m
[31m-[m
[31m-    if ((size_t) write(notify_fd, &inc, sizeof(uint64_t)) != sizeof(uint64_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno,[m
[31m-                      "write() to eventfd %d failed", notify_fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                events;[m
[31m-    uint32_t           revents;[m
[31m-    ngx_int_t          instance, i;[m
[31m-    ngx_uint_t         level;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_queue_t       *queue;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    /* NGX_TIMER_INFINITE == INFTIM */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "epoll timer: %M", timer);[m
[31m-[m
[31m-    events = epoll_wait(ep, event_list, (int) nevents, timer);[m
[31m-[m
[31m-    err = (events == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "epoll_wait() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (events == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "epoll_wait() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < events; i++) {[m
[31m-        c = event_list[i].data.ptr;[m
[31m-[m
[31m-        instance = (uintptr_t) c & 1;[m
[31m-        c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1);[m
[31m-[m
[31m-        rev = c->read;[m
[31m-[m
[31m-        if (c->fd == -1 || rev->instance != instance) {[m
[31m-[m
[31m-            /*[m
[31m-             * the stale event from a file descriptor[m
[31m-             * that was just closed in this iteration[m
[31m-             */[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "epoll: stale event %p", c);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        revents = event_list[i].events;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "epoll: fd:%d ev:%04XD d:%p",[m
[31m-                       c->fd, revents, event_list[i].data.ptr);[m
[31m-[m
[31m-        if (revents & (EPOLLERR|EPOLLHUP)) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "epoll_wait() error on fd:%d ev:%04XD",[m
[31m-                           c->fd, revents);[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        if (revents & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "strange epoll_wait() events fd:%d ev:%04XD",[m
[31m-                          c->fd, revents);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if ((revents & (EPOLLERR|EPOLLHUP))[m
[31m-             && (revents & (EPOLLIN|EPOLLOUT)) == 0)[m
[31m-        {[m
[31m-            /*[m
[31m-             * if the error events were returned without EPOLLIN or EPOLLOUT,[m
[31m-             * then add these flags to handle the events at least in one[m
[31m-             * active handler[m
[31m-             */[m
[31m-[m
[31m-            revents |= EPOLLIN|EPOLLOUT;[m
[31m-        }[m
[31m-[m
[31m-        if ((revents & EPOLLIN) && rev->active) {[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-            if (revents & EPOLLRDHUP) {[m
[31m-                rev->pending_eof = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            rev->ready = 1;[m
[31m-[m
[31m-            if (flags & NGX_POST_EVENTS) {[m
[31m-                queue = rev->accept ? &ngx_posted_accept_events[m
[31m-                                    : &ngx_posted_events;[m
[31m-[m
[31m-                ngx_post_event(rev, queue);[m
[31m-[m
[31m-            } else {[m
[31m-                rev->handler(rev);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        if ((revents & EPOLLOUT) && wev->active) {[m
[31m-[m
[31m-            if (c->fd == -1 || wev->instance != instance) {[m
[31m-[m
[31m-                /*[m
[31m-                 * the stale event from a file descriptor[m
[31m-                 * that was just closed in this iteration[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "epoll: stale event %p", c);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            wev->ready = 1;[m
[31m-#if (NGX_THREADS)[m
[31m-            wev->complete = 1;[m
[31m-#endif[m
[31m-[m
[31m-            if (flags & NGX_POST_EVENTS) {[m
[31m-                ngx_post_event(wev, &ngx_posted_events);[m
[31m-[m
[31m-            } else {[m
[31m-                wev->handler(wev);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-static void[m
[31m-ngx_epoll_eventfd_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    int               n, events;[m
[31m-    long              i;[m
[31m-    uint64_t          ready;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *e;[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-    struct io_event   event[64];[m
[31m-    struct timespec   ts;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd handler");[m
[31m-[m
[31m-    n = read(ngx_eventfd, &ready, 8);[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd: %d", n);[m
[31m-[m
[31m-    if (n != 8) {[m
[31m-        if (n == -1) {[m
[31m-            if (err == NGX_EAGAIN) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, err, "read(eventfd) failed");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "read(eventfd) returned only %d bytes", n);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ts.tv_sec = 0;[m
[31m-    ts.tv_nsec = 0;[m
[31m-[m
[31m-    while (ready) {[m
[31m-[m
[31m-        events = io_getevents(ngx_aio_ctx, 1, 64, event, &ts);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "io_getevents: %d", events);[m
[31m-[m
[31m-        if (events > 0) {[m
[31m-            ready -= events;[m
[31m-[m
[31m-            for (i = 0; i < events; i++) {[m
[31m-[m
[31m-                ngx_log_debug4(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                               "io_event: %XL %XL %L %L",[m
[31m-                                event[i].data, event[i].obj,[m
[31m-                                event[i].res, event[i].res2);[m
[31m-[m
[31m-                e = (ngx_event_t *) (uintptr_t) event[i].data;[m
[31m-[m
[31m-                e->complete = 1;[m
[31m-                e->active = 0;[m
[31m-                e->ready = 1;[m
[31m-[m
[31m-                aio = e->data;[m
[31m-                aio->res = event[i].res;[m
[31m-[m
[31m-                ngx_post_event(e, &ngx_posted_events);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (events == 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* events == -1 */[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                      "io_getevents() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_epoll_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_epoll_conf_t  *epcf;[m
[31m-[m
[31m-    epcf = ngx_palloc(cycle->pool, sizeof(ngx_epoll_conf_t));[m
[31m-    if (epcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    epcf->events = NGX_CONF_UNSET;[m
[31m-    epcf->aio_requests = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return epcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_epoll_conf_t *epcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(epcf->events, 512);[m
[31m-    ngx_conf_init_uint_value(epcf->aio_requests, 32);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_eventport_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_eventport_module.c[m
[1mdeleted file mode 100644[m
[1mindex dafa27f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_eventport_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,651 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_TEST_BUILD_EVENTPORT)[m
[31m-[m
[31m-#define ushort_t  u_short[m
[31m-#define uint_t    u_int[m
[31m-[m
[31m-#ifndef CLOCK_REALTIME[m
[31m-#define CLOCK_REALTIME          0[m
[31m-typedef int     clockid_t;[m
[31m-typedef void *  timer_t;[m
[31m-#endif[m
[31m-[m
[31m-/* Solaris declarations */[m
[31m-[m
[31m-#define PORT_SOURCE_AIO         1[m
[31m-#define PORT_SOURCE_TIMER       2[m
[31m-#define PORT_SOURCE_USER        3[m
[31m-#define PORT_SOURCE_FD          4[m
[31m-#define PORT_SOURCE_ALERT       5[m
[31m-#define PORT_SOURCE_MQ          6[m
[31m-[m
[31m-#ifndef ETIME[m
[31m-#define ETIME                   64[m
[31m-#endif[m
[31m-[m
[31m-#define SIGEV_PORT              4[m
[31m-[m
[31m-typedef struct {[m
[31m-    int         portev_events;  /* event data is source specific */[m
[31m-    ushort_t    portev_source;  /* event source */[m
[31m-    ushort_t    portev_pad;     /* port internal use */[m
[31m-    uintptr_t   portev_object;  /* source specific object */[m
[31m-    void       *portev_user;    /* user cookie */[m
[31m-} port_event_t;[m
[31m-[m
[31m-typedef struct  port_notify {[m
[31m-    int         portnfy_port;   /* bind request(s) to port */[m
[31m-    void       *portnfy_user;   /* user defined */[m
[31m-} port_notify_t;[m
[31m-[m
[31m-#if (__FreeBSD__ && __FreeBSD_version < 700005) || (NGX_DARWIN)[m
[31m-[m
[31m-typedef struct itimerspec {     /* definition per POSIX.4 */[m
[31m-    struct timespec it_interval;/* timer period */[m
[31m-    struct timespec it_value;   /* timer expiration */[m
[31m-} itimerspec_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-int port_create(void);[m
[31m-[m
[31m-int port_create(void)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int port_associate(int port, int source, uintptr_t object, int events,[m
[31m-    void *user);[m
[31m-[m
[31m-int port_associate(int port, int source, uintptr_t object, int events,[m
[31m-    void *user)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int port_dissociate(int port, int source, uintptr_t object);[m
[31m-[m
[31m-int port_dissociate(int port, int source, uintptr_t object)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget,[m
[31m-    struct timespec *timeout);[m
[31m-[m
[31m-int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget,[m
[31m-    struct timespec *timeout)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-int port_send(int port, int events, void *user);[m
[31m-[m
[31m-int port_send(int port, int events, void *user)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid);[m
[31m-[m
[31m-int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,[m
[31m-    struct itimerspec *ovalue);[m
[31m-[m
[31m-int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,[m
[31m-    struct itimerspec *ovalue)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int timer_delete(timer_t timerid);[m
[31m-[m
[31m-int timer_delete(timer_t timerid)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  events;[m
[31m-} ngx_eventport_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_eventport_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_eventport_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_eventport_notify(ngx_event_handler_pt handler);[m
[31m-static ngx_int_t ngx_eventport_process_events(ngx_cycle_t *cycle,[m
[31m-    ngx_msec_t timer, ngx_uint_t flags);[m
[31m-[m
[31m-static void *ngx_eventport_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_eventport_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static int            ep = -1;[m
[31m-static port_event_t  *event_list;[m
[31m-static ngx_uint_t     nevents;[m
[31m-static timer_t        event_timer = (timer_t) -1;[m
[31m-static ngx_event_t    notify_event;[m
[31m-[m
[31m-static ngx_str_t      eventport_name = ngx_string("eventport");[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_eventport_commands[] = {[m
[31m-[m
[31m-    { ngx_string("eventport_events"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_eventport_conf_t, events),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_eventport_module_ctx = {[m
[31m-    &eventport_name,[m
[31m-    ngx_eventport_create_conf,             /* create configuration */[m
[31m-    ngx_eventport_init_conf,               /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_eventport_add_event,           /* add an event */[m
[31m-        ngx_eventport_del_event,           /* delete an event */[m
[31m-        ngx_eventport_add_event,           /* enable an event */[m
[31m-        ngx_eventport_del_event,           /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        ngx_eventport_notify,              /* trigger a notify */[m
[31m-        ngx_eventport_process_events,      /* process the events */[m
[31m-        ngx_eventport_init,                /* init the events */[m
[31m-        ngx_eventport_done,                /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_eventport_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_eventport_module_ctx,             /* module context */[m
[31m-    ngx_eventport_commands,                /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_eventport_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    port_notify_t          pn;[m
[31m-    struct itimerspec      its;[m
[31m-    struct sigevent        sev;[m
[31m-    ngx_eventport_conf_t  *epcf;[m
[31m-[m
[31m-    epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_eventport_module);[m
[31m-[m
[31m-    if (ep == -1) {[m
[31m-        ep = port_create();[m
[31m-[m
[31m-        if (ep == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "port_create() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        notify_event.active = 1;[m
[31m-        notify_event.log = cycle->log;[m
[31m-    }[m
[31m-[m
[31m-    if (nevents < epcf->events) {[m
[31m-        if (event_list) {[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = ngx_alloc(sizeof(port_event_t) * epcf->events,[m
[31m-                               cycle->log);[m
[31m-        if (event_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_EVENTPORT_EVENT;[m
[31m-[m
[31m-    if (timer) {[m
[31m-        ngx_memzero(&pn, sizeof(port_notify_t));[m
[31m-        pn.portnfy_port = ep;[m
[31m-[m
[31m-        ngx_memzero(&sev, sizeof(struct sigevent));[m
[31m-        sev.sigev_notify = SIGEV_PORT;[m
[31m-#if !(NGX_TEST_BUILD_EVENTPORT)[m
[31m-        sev.sigev_value.sival_ptr = &pn;[m
[31m-#endif[m
[31m-[m
[31m-        if (timer_create(CLOCK_REALTIME, &sev, &event_timer) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "timer_create() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        its.it_interval.tv_sec = timer / 1000;[m
[31m-        its.it_interval.tv_nsec = (timer % 1000) * 1000000;[m
[31m-        its.it_value.tv_sec = timer / 1000;[m
[31m-        its.it_value.tv_nsec = (timer % 1000) * 1000000;[m
[31m-[m
[31m-        if (timer_settime(event_timer, 0, &its, NULL) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "timer_settime() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_event_flags |= NGX_USE_TIMER_EVENT;[m
[31m-    }[m
[31m-[m
[31m-    nevents = epcf->events;[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_eventport_module_ctx.actions;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_eventport_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (event_timer != (timer_t) -1) {[m
[31m-        if (timer_delete(event_timer) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "timer_delete() failed");[m
[31m-        }[m
[31m-[m
[31m-        event_timer = (timer_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    if (close(ep) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "close() event port failed");[m
[31m-    }[m
[31m-[m
[31m-    ep = -1;[m
[31m-[m
[31m-    ngx_free(event_list);[m
[31m-[m
[31m-    event_list = NULL;[m
[31m-    nevents = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t          events, prev;[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    events = event;[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-        prev = POLLOUT;[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-        events = POLLIN;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        prev = POLLIN;[m
[31m-#if (NGX_WRITE_EVENT != POLLOUT)[m
[31m-        events = POLLOUT;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (e->oneshot) {[m
[31m-        events |= prev;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "eventport add event: fd:%d ev:%04Xi", c->fd, events);[m
[31m-[m
[31m-    if (port_associate(ep, PORT_SOURCE_FD, c->fd, events,[m
[31m-                       (void *) ((uintptr_t) ev | ev->instance))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                      "port_associate() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-    ev->oneshot = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    /*[m
[31m-     * when the file descriptor is closed, the event port automatically[m
[31m-     * dissociates it from the port, so we do not need to dissociate explicitly[m
[31m-     * the event before the closing the file descriptor[m
[31m-     */[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        ev->active = 0;[m
[31m-        ev->oneshot = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-        event = POLLOUT;[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        event = POLLIN;[m
[31m-    }[m
[31m-[m
[31m-    if (e->oneshot) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "eventport change event: fd:%d ev:%04Xi", c->fd, event);[m
[31m-[m
[31m-        if (port_associate(ep, PORT_SOURCE_FD, c->fd, event,[m
[31m-                           (void *) ((uintptr_t) ev | ev->instance))[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                          "port_associate() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "eventport del event: fd:%d", c->fd);[m
[31m-[m
[31m-        if (port_dissociate(ep, PORT_SOURCE_FD, c->fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                          "port_dissociate() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-    ev->oneshot = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_eventport_notify(ngx_event_handler_pt handler)[m
[31m-{[m
[31m-    notify_event.handler = handler;[m
[31m-[m
[31m-    if (port_send(ep, 0, &notify_event) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno,[m
[31m-                      "port_send() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                 n, revents;[m
[31m-    u_int               events;[m
[31m-    ngx_err_t           err;[m
[31m-    ngx_int_t           instance;[m
[31m-    ngx_uint_t          i, level;[m
[31m-    ngx_event_t        *ev, *rev, *wev;[m
[31m-    ngx_queue_t        *queue;[m
[31m-    ngx_connection_t   *c;[m
[31m-    struct timespec     ts, *tp;[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        tp = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        ts.tv_sec = timer / 1000;[m
[31m-        ts.tv_nsec = (timer % 1000) * 1000000;[m
[31m-        tp = &ts;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "eventport timer: %M", timer);[m
[31m-[m
[31m-    events = 1;[m
[31m-[m
[31m-    n = port_getn(ep, event_list, (u_int) nevents, &events, tp);[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == ETIME) {[m
[31m-            if (timer != NGX_TIMER_INFINITE) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "port_getn() returned no events without timeout");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        level = (err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT;[m
[31m-        ngx_log_error(level, cycle->log, err, "port_getn() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (events == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "port_getn() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < events; i++) {[m
[31m-[m
[31m-        if (event_list[i].portev_source == PORT_SOURCE_TIMER) {[m
[31m-            ngx_time_update();[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ev = event_list[i].portev_user;[m
[31m-[m
[31m-        switch (event_list[i].portev_source) {[m
[31m-[m
[31m-        case PORT_SOURCE_FD:[m
[31m-[m
[31m-            instance = (uintptr_t) ev & 1;[m
[31m-            ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);[m
[31m-[m
[31m-            if (ev->closed || ev->instance != instance) {[m
[31m-[m
[31m-                /*[m
[31m-                 * the stale event from a file descriptor[m
[31m-                 * that was just closed in this iteration[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "eventport: stale event %p", ev);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            revents = event_list[i].portev_events;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "eventport: fd:%d, ev:%04Xd",[m
[31m-                           (int) event_list[i].portev_object, revents);[m
[31m-[m
[31m-            if (revents & (POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "port_getn() error fd:%d ev:%04Xd",[m
[31m-                               (int) event_list[i].portev_object, revents);[m
[31m-            }[m
[31m-[m
[31m-            if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "strange port_getn() events fd:%d ev:%04Xd",[m
[31m-                              (int) event_list[i].portev_object, revents);[m
[31m-            }[m
[31m-[m
[31m-            if ((revents & (POLLERR|POLLHUP|POLLNVAL))[m
[31m-                 && (revents & (POLLIN|POLLOUT)) == 0)[m
[31m-            {[m
[31m-                /*[m
[31m-                 * if the error events were returned without POLLIN or POLLOUT,[m
[31m-                 * then add these flags to handle the events at least in one[m
[31m-                 * active handler[m
[31m-                 */[m
[31m-[m
[31m-                revents |= POLLIN|POLLOUT;[m
[31m-            }[m
[31m-[m
[31m-            c = ev->data;[m
[31m-            rev = c->read;[m
[31m-            wev = c->write;[m
[31m-[m
[31m-            rev->active = 0;[m
[31m-            wev->active = 0;[m
[31m-[m
[31m-            if (revents & POLLIN) {[m
[31m-                rev->ready = 1;[m
[31m-[m
[31m-                if (flags & NGX_POST_EVENTS) {[m
[31m-                    queue = rev->accept ? &ngx_posted_accept_events[m
[31m-                                        : &ngx_posted_events;[m
[31m-[m
[31m-                    ngx_post_event(rev, queue);[m
[31m-[m
[31m-                } else {[m
[31m-                    rev->handler(rev);[m
[31m-[m
[31m-                    if (ev->closed || ev->instance != instance) {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (rev->accept) {[m
[31m-                    if (ngx_use_accept_mutex) {[m
[31m-                        ngx_accept_events = 1;[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    if (port_associate(ep, PORT_SOURCE_FD, c->fd, POLLIN,[m
[31m-                                       (void *) ((uintptr_t) ev | ev->instance))[m
[31m-                        == -1)[m
[31m-                    {[m
[31m-                        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                                      "port_associate() failed");[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (revents & POLLOUT) {[m
[31m-                wev->ready = 1;[m
[31m-[m
[31m-                if (flags & NGX_POST_EVENTS) {[m
[31m-                    ngx_post_event(wev, &ngx_posted_events);[m
[31m-[m
[31m-                } else {[m
[31m-                    wev->handler(wev);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case PORT_SOURCE_USER:[m
[31m-[m
[31m-            ev->handler(ev);[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "unexpected eventport object %d",[m
[31m-                          (int) event_list[i].portev_object);[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_eventport_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_eventport_conf_t  *epcf;[m
[31m-[m
[31m-    epcf = ngx_palloc(cycle->pool, sizeof(ngx_eventport_conf_t));[m
[31m-    if (epcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    epcf->events = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return epcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_eventport_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_eventport_conf_t *epcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(epcf->events, 32);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_iocp_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_iocp_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8f163e3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_iocp_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,378 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_iocp_module.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static ngx_thread_value_t __stdcall ngx_iocp_timer(void *data);[m
[31m-static void ngx_iocp_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t key);[m
[31m-static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static void *ngx_iocp_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t      iocp_name = ngx_string("iocp");[m
[31m-[m
[31m-static ngx_command_t  ngx_iocp_commands[] = {[m
[31m-[m
[31m-    { ngx_string("iocp_threads"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_iocp_conf_t, threads),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("post_acceptex"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_iocp_conf_t, post_acceptex),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("acceptex_read"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_iocp_conf_t, acceptex_read),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_iocp_module_ctx = {[m
[31m-    &iocp_name,[m
[31m-    ngx_iocp_create_conf,                  /* create configuration */[m
[31m-    ngx_iocp_init_conf,                    /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_iocp_add_event,                /* add an event */[m
[31m-        NULL,                              /* delete an event */[m
[31m-        NULL,                              /* enable an event */[m
[31m-        NULL,                              /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        ngx_iocp_del_connection,           /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_iocp_process_events,           /* process the events */[m
[31m-        ngx_iocp_init,                     /* init the events */[m
[31m-        ngx_iocp_done                      /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_iocp_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_iocp_module_ctx,                  /* module context */[m
[31m-    ngx_iocp_commands,                     /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_os_io_t ngx_iocp_io = {[m
[31m-    ngx_overlapped_wsarecv,[m
[31m-    NULL,[m
[31m-    ngx_udp_overlapped_wsarecv,[m
[31m-    NULL,[m
[31m-    ngx_overlapped_wsasend_chain,[m
[31m-    0[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static HANDLE      iocp;[m
[31m-static ngx_tid_t   timer_thread;[m
[31m-static ngx_msec_t  msec;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_iocp_conf_t  *cf;[m
[31m-[m
[31m-    cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);[m
[31m-[m
[31m-    if (iocp == NULL) {[m
[31m-        iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0,[m
[31m-                                      cf->threads);[m
[31m-    }[m
[31m-[m
[31m-    if (iocp == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateIoCompletionPort() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_io = ngx_iocp_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_iocp_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_IOCP_EVENT;[m
[31m-[m
[31m-    if (timer == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * The waitable timer could not be used, because[m
[31m-     * GetQueuedCompletionStatus() does not set a thread to alertable state[m
[31m-     */[m
[31m-[m
[31m-    if (timer_thread == NULL) {[m
[31m-[m
[31m-        msec = timer;[m
[31m-[m
[31m-        if (ngx_create_thread(&timer_thread, ngx_iocp_timer, &msec, cycle->log)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_flags |= NGX_USE_TIMER_EVENT;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_thread_value_t __stdcall[m
[31m-ngx_iocp_timer(void *data)[m
[31m-{[m
[31m-    ngx_msec_t  timer = *(ngx_msec_t *) data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                   "THREAD %p %p", &msec, data);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        Sleep(timer);[m
[31m-[m
[31m-        ngx_time_update();[m
[31m-#if 1[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer");[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if defined(__WATCOMC__) || defined(__GNUC__)[m
[31m-    return 0;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_iocp_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (CloseHandle(iocp) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "iocp CloseHandle() failed");[m
[31m-    }[m
[31m-[m
[31m-    iocp = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_iocp_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t key)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = (ngx_connection_t *) ev->data;[m
[31m-[m
[31m-    c->read->active = 1;[m
[31m-    c->write->active = 1;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "iocp add: fd:%d k:%ui ov:%p", c->fd, key, &ev->ovlp);[m
[31m-[m
[31m-    if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "CreateIoCompletionPort() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_iocp_del_connection(ngx_connection_t *c, ngx_uint_t flags)[m
[31m-{[m
[31m-#if 0[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (CancelIo((HANDLE) c->fd) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static[m
[31m-ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    u_int              key;[m
[31m-    u_long             bytes;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_msec_t         delta;[m
[31m-    ngx_event_t       *ev;[m
[31m-    ngx_event_ovlp_t  *ovlp;[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        timer = INFINITE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "iocp timer: %M", timer);[m
[31m-[m
[31m-    rc = GetQueuedCompletionStatus(iocp, &bytes, (PULONG_PTR) &key,[m
[31m-                                   (LPOVERLAPPED *) &ovlp, (u_long) timer);[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        err = ngx_errno;[m
[31m-    } else {[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    delta = ngx_current_msec;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "iocp: %d b:%d k:%d ov:%p", rc, bytes, key, ovlp);[m
[31m-[m
[31m-    if (timer != INFINITE) {[m
[31m-        delta = ngx_current_msec - delta;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "iocp timer: %M, delta: %M", timer, delta);[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (ovlp == NULL) {[m
[31m-            if (err != WAIT_TIMEOUT) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                              "GetQueuedCompletionStatus() failed");[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ovlp->error = err;[m
[31m-    }[m
[31m-[m
[31m-    if (ovlp == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "GetQueuedCompletionStatus() returned no operation");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ev = ovlp->event;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, "iocp event:%p", ev);[m
[31m-[m
[31m-[m
[31m-    if (err == ERROR_NETNAME_DELETED /* the socket was closed */[m
[31m-        || err == ERROR_OPERATION_ABORTED /* the operation was canceled */)[m
[31m-    {[m
[31m-[m
[31m-        /*[m
[31m-         * the WSA_OPERATION_ABORTED completion notification[m
[31m-         * for a file descriptor that was closed[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err,[m
[31m-                       "iocp: aborted event %p", ev);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                      "GetQueuedCompletionStatus() returned operation error");[m
[31m-    }[m
[31m-[m
[31m-    switch (key) {[m
[31m-[m
[31m-    case NGX_IOCP_ACCEPT:[m
[31m-        if (bytes) {[m
[31m-            ev->ready = 1;[m
[31m-        }[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_IOCP_IO:[m
[31m-        ev->complete = 1;[m
[31m-        ev->ready = 1;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_IOCP_CONNECT:[m
[31m-        ev->ready = 1;[m
[31m-    }[m
[31m-[m
[31m-    ev->available = bytes;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "iocp event handler: %p", ev->handler);[m
[31m-[m
[31m-    ev->handler(ev);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_iocp_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_iocp_conf_t  *cf;[m
[31m-[m
[31m-    cf = ngx_palloc(cycle->pool, sizeof(ngx_iocp_conf_t));[m
[31m-    if (cf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cf->threads = NGX_CONF_UNSET;[m
[31m-    cf->post_acceptex = NGX_CONF_UNSET;[m
[31m-    cf->acceptex_read = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return cf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_iocp_conf_t *cf = conf;[m
[31m-[m
[31m-    ngx_conf_init_value(cf->threads, 0);[m
[31m-    ngx_conf_init_value(cf->post_acceptex, 10);[m
[31m-    ngx_conf_init_value(cf->acceptex_read, 1);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_iocp_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_iocp_module.h[m
[1mdeleted file mode 100644[m
[1mindex dc73983..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_iocp_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_IOCP_MODULE_H_INCLUDED_[m
[31m-#define _NGX_IOCP_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int  threads;[m
[31m-    int  post_acceptex;[m
[31m-    int  acceptex_read;[m
[31m-} ngx_iocp_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_iocp_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_IOCP_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_kqueue_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_kqueue_module.c[m
[1mdeleted file mode 100644[m
[1mindex ca3bfe4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_kqueue_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,722 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  changes;[m
[31m-    ngx_uint_t  events;[m
[31m-} ngx_kqueue_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-#ifdef EVFILT_USER[m
[31m-static ngx_int_t ngx_kqueue_notify_init(ngx_log_t *log);[m
[31m-#endif[m
[31m-static void ngx_kqueue_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter,[m
[31m-    ngx_uint_t flags);[m
[31m-#ifdef EVFILT_USER[m
[31m-static ngx_int_t ngx_kqueue_notify(ngx_event_handler_pt handler);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_inline void ngx_kqueue_dump_event(ngx_log_t *log,[m
[31m-    struct kevent *kev);[m
[31m-[m
[31m-static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-int                    ngx_kqueue = -1;[m
[31m-[m
[31m-static struct kevent  *change_list;[m
[31m-static struct kevent  *event_list;[m
[31m-static ngx_uint_t      max_changes, nchanges, nevents;[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-static ngx_event_t     notify_event;[m
[31m-static struct kevent   notify_kev;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_str_t      kqueue_name = ngx_string("kqueue");[m
[31m-[m
[31m-static ngx_command_t  ngx_kqueue_commands[] = {[m
[31m-[m
[31m-    { ngx_string("kqueue_changes"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_kqueue_conf_t, changes),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("kqueue_events"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_kqueue_conf_t, events),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_kqueue_module_ctx = {[m
[31m-    &kqueue_name,[m
[31m-    ngx_kqueue_create_conf,                /* create configuration */[m
[31m-    ngx_kqueue_init_conf,                  /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_kqueue_add_event,              /* add an event */[m
[31m-        ngx_kqueue_del_event,              /* delete an event */[m
[31m-        ngx_kqueue_add_event,              /* enable an event */[m
[31m-        ngx_kqueue_del_event,              /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-#ifdef EVFILT_USER[m
[31m-        ngx_kqueue_notify,                 /* trigger a notify */[m
[31m-#else[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-#endif[m
[31m-        ngx_kqueue_process_events,         /* process the events */[m
[31m-        ngx_kqueue_init,                   /* init the events */[m
[31m-        ngx_kqueue_done                    /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_kqueue_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_kqueue_module_ctx,                /* module context */[m
[31m-    ngx_kqueue_commands,                   /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_kqueue_conf_t  *kcf;[m
[31m-    struct timespec     ts;[m
[31m-#if (NGX_HAVE_TIMER_EVENT)[m
[31m-    struct kevent       kev;[m
[31m-#endif[m
[31m-[m
[31m-    kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);[m
[31m-[m
[31m-    if (ngx_kqueue == -1) {[m
[31m-        ngx_kqueue = kqueue();[m
[31m-[m
[31m-        if (ngx_kqueue == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "kqueue() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-        if (ngx_kqueue_notify_init(cycle->log) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (max_changes < kcf->changes) {[m
[31m-        if (nchanges) {[m
[31m-            ts.tv_sec = 0;[m
[31m-            ts.tv_nsec = 0;[m
[31m-[m
[31m-            if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts)[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                              "kevent() failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            nchanges = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (change_list) {[m
[31m-            ngx_free(change_list);[m
[31m-        }[m
[31m-[m
[31m-        change_list = ngx_alloc(kcf->changes * sizeof(struct kevent),[m
[31m-                                cycle->log);[m
[31m-        if (change_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    max_changes = kcf->changes;[m
[31m-[m
[31m-    if (nevents < kcf->events) {[m
[31m-        if (event_list) {[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = ngx_alloc(kcf->events * sizeof(struct kevent), cycle->log);[m
[31m-        if (event_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_ONESHOT_EVENT[m
[31m-                      |NGX_USE_KQUEUE_EVENT[m
[31m-                      |NGX_USE_VNODE_EVENT;[m
[31m-[m
[31m-#if (NGX_HAVE_TIMER_EVENT)[m
[31m-[m
[31m-    if (timer) {[m
[31m-        kev.ident = 0;[m
[31m-        kev.filter = EVFILT_TIMER;[m
[31m-        kev.flags = EV_ADD|EV_ENABLE;[m
[31m-        kev.fflags = 0;[m
[31m-        kev.data = timer;[m
[31m-        kev.udata = 0;[m
[31m-[m
[31m-        ts.tv_sec = 0;[m
[31m-        ts.tv_nsec = 0;[m
[31m-[m
[31m-        if (kevent(ngx_kqueue, &kev, 1, NULL, 0, &ts) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "kevent(EVFILT_TIMER) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_event_flags |= NGX_USE_TIMER_EVENT;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_CLEAR_EVENT)[m
[31m-    ngx_event_flags |= NGX_USE_CLEAR_EVENT;[m
[31m-#else[m
[31m-    ngx_event_flags |= NGX_USE_LEVEL_EVENT;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_LOWAT_EVENT)[m
[31m-    ngx_event_flags |= NGX_USE_LOWAT_EVENT;[m
[31m-#endif[m
[31m-[m
[31m-    nevents = kcf->events;[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_kqueue_module_ctx.actions;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_notify_init(ngx_log_t *log)[m
[31m-{[m
[31m-    notify_kev.ident = 0;[m
[31m-    notify_kev.filter = EVFILT_USER;[m
[31m-    notify_kev.data = 0;[m
[31m-    notify_kev.flags = EV_ADD|EV_CLEAR;[m
[31m-    notify_kev.fflags = 0;[m
[31m-    notify_kev.udata = 0;[m
[31m-[m
[31m-    if (kevent(ngx_kqueue, &notify_kev, 1, NULL, 0, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "kevent(EVFILT_USER, EV_ADD) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    notify_event.active = 1;[m
[31m-    notify_event.log = log;[m
[31m-[m
[31m-    notify_kev.flags = 0;[m
[31m-    notify_kev.fflags = NOTE_TRIGGER;[m
[31m-    notify_kev.udata = NGX_KQUEUE_UDATA_T ((uintptr_t) &notify_event);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_kqueue_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (close(ngx_kqueue) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "kqueue close() failed");[m
[31m-    }[m
[31m-[m
[31m-    ngx_kqueue = -1;[m
[31m-[m
[31m-    ngx_free(change_list);[m
[31m-    ngx_free(event_list);[m
[31m-[m
[31m-    change_list = NULL;[m
[31m-    event_list = NULL;[m
[31m-    max_changes = 0;[m
[31m-    nchanges = 0;[m
[31m-    nevents = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-#if 0[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-#endif[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-    ev->disabled = 0;[m
[31m-    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-    if (ev->index < nchanges[m
[31m-        && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)[m
[31m-            == (uintptr_t) ev)[m
[31m-    {[m
[31m-        if (change_list[ev->index].flags == EV_DISABLE) {[m
[31m-[m
[31m-            /*[m
[31m-             * if the EV_DISABLE is still not passed to a kernel[m
[31m-             * we will not pass it[m
[31m-             */[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                           "kevent activated: %d: ft:%i",[m
[31m-                           ngx_event_ident(ev->data), event);[m
[31m-[m
[31m-            if (ev->index < --nchanges) {[m
[31m-                e = (ngx_event_t *)[m
[31m-                    ((uintptr_t) change_list[nchanges].udata & (uintptr_t) ~1);[m
[31m-                change_list[ev->index] = change_list[nchanges];[m
[31m-                e->index = ev->index;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        c = ev->data;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "previous event on #%d were not passed in kernel", c->fd);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_event_t  *e;[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-    ev->disabled = 0;[m
[31m-[m
[31m-    if (ev->index < nchanges[m
[31m-        && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)[m
[31m-            == (uintptr_t) ev)[m
[31m-    {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "kevent deleted: %d: ft:%i",[m
[31m-                       ngx_event_ident(ev->data), event);[m
[31m-[m
[31m-        /* if the event is still not passed to a kernel we will not pass it */[m
[31m-[m
[31m-        nchanges--;[m
[31m-[m
[31m-        if (ev->index < nchanges) {[m
[31m-            e = (ngx_event_t *)[m
[31m-                    ((uintptr_t) change_list[nchanges].udata & (uintptr_t) ~1);[m
[31m-            change_list[ev->index] = change_list[nchanges];[m
[31m-            e->index = ev->index;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * when the file descriptor is closed the kqueue automatically deletes[m
[31m-     * its filters so we do not need to delete explicitly the event[m
[31m-     * before the closing the file descriptor.[m
[31m-     */[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_DISABLE_EVENT) {[m
[31m-        ev->disabled = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        flags |= EV_DELETE;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_kqueue_set_event(ev, event, flags);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, ngx_uint_t flags)[m
[31m-{[m
[31m-    struct kevent     *kev;[m
[31m-    struct timespec    ts;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "kevent set event: %d: ft:%i fl:%04Xi",[m
[31m-                   c->fd, filter, flags);[m
[31m-[m
[31m-    if (nchanges >= max_changes) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ev->log, 0,[m
[31m-                      "kqueue change list is filled up");[m
[31m-[m
[31m-        ts.tv_sec = 0;[m
[31m-        ts.tv_nsec = 0;[m
[31m-[m
[31m-        if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    kev = &change_list[nchanges];[m
[31m-[m
[31m-    kev->ident = c->fd;[m
[31m-    kev->filter = (short) filter;[m
[31m-    kev->flags = (u_short) flags;[m
[31m-    kev->udata = NGX_KQUEUE_UDATA_T ((uintptr_t) ev | ev->instance);[m
[31m-[m
[31m-    if (filter == EVFILT_VNODE) {[m
[31m-        kev->fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND[m
[31m-                                 |NOTE_ATTRIB|NOTE_RENAME[m
[31m-#if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \[m
[31m-    || __FreeBSD_version >= 500018[m
[31m-                                 |NOTE_REVOKE[m
[31m-#endif[m
[31m-                      ;[m
[31m-        kev->data = 0;[m
[31m-[m
[31m-    } else {[m
[31m-#if (NGX_HAVE_LOWAT_EVENT)[m
[31m-        if (flags & NGX_LOWAT_EVENT) {[m
[31m-            kev->fflags = NOTE_LOWAT;[m
[31m-            kev->data = ev->available;[m
[31m-[m
[31m-        } else {[m
[31m-            kev->fflags = 0;[m
[31m-            kev->data = 0;[m
[31m-        }[m
[31m-#else[m
[31m-        kev->fflags = 0;[m
[31m-        kev->data = 0;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ev->index = nchanges;[m
[31m-    nchanges++;[m
[31m-[m
[31m-    if (flags & NGX_FLUSH_EVENT) {[m
[31m-        ts.tv_sec = 0;[m
[31m-        ts.tv_nsec = 0;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "kevent flush");[m
[31m-[m
[31m-        if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_notify(ngx_event_handler_pt handler)[m
[31m-{[m
[31m-    notify_event.handler = handler;[m
[31m-[m
[31m-    if (kevent(ngx_kqueue, &notify_kev, 1, NULL, 0, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno,[m
[31m-                      "kevent(EVFILT_USER, NOTE_TRIGGER) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int               events, n;[m
[31m-    ngx_int_t         i, instance;[m
[31m-    ngx_uint_t        level;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *ev;[m
[31m-    ngx_queue_t      *queue;[m
[31m-    struct timespec   ts, *tp;[m
[31m-[m
[31m-    n = (int) nchanges;[m
[31m-    nchanges = 0;[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        tp = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ts.tv_sec = timer / 1000;[m
[31m-        ts.tv_nsec = (timer % 1000) * 1000000;[m
[31m-[m
[31m-        /*[m
[31m-         * 64-bit Darwin kernel has the bug: kernel level ts.tv_nsec is[m
[31m-         * the int32_t while user level ts.tv_nsec is the long (64-bit),[m
[31m-         * so on the big endian PowerPC all nanoseconds are lost.[m
[31m-         */[m
[31m-[m
[31m-#if (NGX_DARWIN_KEVENT_BUG)[m
[31m-        ts.tv_nsec <<= 32;[m
[31m-#endif[m
[31m-[m
[31m-        tp = &ts;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "kevent timer: %M, changes: %d", timer, n);[m
[31m-[m
[31m-    events = kevent(ngx_kqueue, change_list, n, event_list, (int) nevents, tp);[m
[31m-[m
[31m-    err = (events == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "kevent events: %d", events);[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "kevent() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (events == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "kevent() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < events; i++) {[m
[31m-[m
[31m-        ngx_kqueue_dump_event(cycle->log, &event_list[i]);[m
[31m-[m
[31m-        if (event_list[i].flags & EV_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, event_list[i].data,[m
[31m-                          "kevent() error on %d filter:%d flags:%04Xd",[m
[31m-                          (int) event_list[i].ident, event_list[i].filter,[m
[31m-                          event_list[i].flags);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_TIMER_EVENT)[m
[31m-[m
[31m-        if (event_list[i].filter == EVFILT_TIMER) {[m
[31m-            ngx_time_update();[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ev = (ngx_event_t *) event_list[i].udata;[m
[31m-[m
[31m-        switch (event_list[i].filter) {[m
[31m-[m
[31m-        case EVFILT_READ:[m
[31m-        case EVFILT_WRITE:[m
[31m-[m
[31m-            instance = (uintptr_t) ev & 1;[m
[31m-            ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);[m
[31m-[m
[31m-            if (ev->closed || ev->instance != instance) {[m
[31m-[m
[31m-                /*[m
[31m-                 * the stale event from a file descriptor[m
[31m-                 * that was just closed in this iteration[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "kevent: stale event %p", ev);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ev->log && (ev->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {[m
[31m-                ngx_kqueue_dump_event(ev->log, &event_list[i]);[m
[31m-            }[m
[31m-[m
[31m-            if (ev->oneshot) {[m
[31m-                ev->active = 0;[m
[31m-            }[m
[31m-[m
[31m-            ev->available = event_list[i].data;[m
[31m-[m
[31m-            if (event_list[i].flags & EV_EOF) {[m
[31m-                ev->pending_eof = 1;[m
[31m-                ev->kq_errno = event_list[i].fflags;[m
[31m-            }[m
[31m-[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case EVFILT_VNODE:[m
[31m-            ev->kq_vnode = 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case EVFILT_AIO:[m
[31m-            ev->complete = 1;[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-        case EVFILT_USER:[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "unexpected kevent() filter %d",[m
[31m-                          event_list[i].filter);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_POST_EVENTS) {[m
[31m-            queue = ev->accept ? &ngx_posted_accept_events[m
[31m-                               : &ngx_posted_events;[m
[31m-[m
[31m-            ngx_post_event(ev, queue);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_kqueue_dump_event(ngx_log_t *log, struct kevent *kev)[m
[31m-{[m
[31m-    if (kev->ident > 0x8000000 && kev->ident != (unsigned) -1) {[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                       "kevent: %p: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p",[m
[31m-                       (void *) kev->ident, kev->filter,[m
[31m-                       kev->flags, kev->fflags,[m
[31m-                       (int) kev->data, kev->udata);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                       "kevent: %d: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p",[m
[31m-                       (int) kev->ident, kev->filter,[m
[31m-                       kev->flags, kev->fflags,[m
[31m-                       (int) kev->data, kev->udata);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_kqueue_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_kqueue_conf_t  *kcf;[m
[31m-[m
[31m-    kcf = ngx_palloc(cycle->pool, sizeof(ngx_kqueue_conf_t));[m
[31m-    if (kcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    kcf->changes = NGX_CONF_UNSET;[m
[31m-    kcf->events = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return kcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_kqueue_conf_t *kcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(kcf->changes, 512);[m
[31m-    ngx_conf_init_uint_value(kcf->events, 512);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_poll_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_poll_module.c[m
[1mdeleted file mode 100644[m
[1mindex 4370950..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_poll_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,417 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_poll_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static char *ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static struct pollfd  *event_list;[m
[31m-static ngx_uint_t      nevents;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t    poll_name = ngx_string("poll");[m
[31m-[m
[31m-ngx_event_module_t  ngx_poll_module_ctx = {[m
[31m-    &poll_name,[m
[31m-    NULL,                                  /* create configuration */[m
[31m-    ngx_poll_init_conf,                    /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_poll_add_event,                /* add an event */[m
[31m-        ngx_poll_del_event,                /* delete an event */[m
[31m-        ngx_poll_add_event,                /* enable an event */[m
[31m-        ngx_poll_del_event,                /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_poll_process_events,           /* process the events */[m
[31m-        ngx_poll_init,                     /* init the events */[m
[31m-        ngx_poll_done                      /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_poll_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_poll_module_ctx,                  /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    struct pollfd   *list;[m
[31m-[m
[31m-    if (event_list == NULL) {[m
[31m-        nevents = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process >= NGX_PROCESS_WORKER[m
[31m-        || cycle->old_cycle == NULL[m
[31m-        || cycle->old_cycle->connection_n < cycle->connection_n)[m
[31m-    {[m
[31m-        list = ngx_alloc(sizeof(struct pollfd) * cycle->connection_n,[m
[31m-                         cycle->log);[m
[31m-        if (list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (event_list) {[m
[31m-            ngx_memcpy(list, event_list, sizeof(ngx_event_t *) * nevents);[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = list;[m
[31m-    }[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_poll_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_FD_EVENT;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_poll_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_free(event_list);[m
[31m-[m
[31m-    event_list = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-[m
[31m-    if (ev->index != NGX_INVALID_INDEX) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "poll event fd:%d ev:%i is already set", c->fd, event);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-        event = POLLIN;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-#if (NGX_WRITE_EVENT != POLLOUT)[m
[31m-        event = POLLOUT;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "poll add event: fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (e == NULL || e->index == NGX_INVALID_INDEX) {[m
[31m-        event_list[nevents].fd = c->fd;[m
[31m-        event_list[nevents].events = (short) event;[m
[31m-        event_list[nevents].revents = 0;[m
[31m-[m
[31m-        ev->index = nevents;[m
[31m-        nevents++;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "poll add index: %i", e->index);[m
[31m-[m
[31m-        event_list[e->index].events |= (short) event;[m
[31m-        ev->index = e->index;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    if (ev->index == NGX_INVALID_INDEX) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "poll event fd:%d ev:%i is already deleted",[m
[31m-                      c->fd, event);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-        event = POLLIN;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-#if (NGX_WRITE_EVENT != POLLOUT)[m
[31m-        event = POLLOUT;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "poll del event: fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (e == NULL || e->index == NGX_INVALID_INDEX) {[m
[31m-        nevents--;[m
[31m-[m
[31m-        if (ev->index < nevents) {[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                           "index: copy event %ui to %i", nevents, ev->index);[m
[31m-[m
[31m-            event_list[ev->index] = event_list[nevents];[m
[31m-[m
[31m-            c = ngx_cycle->files[event_list[nevents].fd];[m
[31m-[m
[31m-            if (c->fd == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                              "unexpected last event");[m
[31m-[m
[31m-            } else {[m
[31m-                if (c->read->index == nevents) {[m
[31m-                    c->read->index = ev->index;[m
[31m-                }[m
[31m-[m
[31m-                if (c->write->index == nevents) {[m
[31m-                    c->write->index = ev->index;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "poll del index: %i", e->index);[m
[31m-[m
[31m-        event_list[e->index].events &= (short) ~event;[m
[31m-    }[m
[31m-[m
[31m-    ev->index = NGX_INVALID_INDEX;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                 ready, revents;[m
[31m-    ngx_err_t           err;[m
[31m-    ngx_uint_t          i, found, level;[m
[31m-    ngx_event_t        *ev;[m
[31m-    ngx_queue_t        *queue;[m
[31m-    ngx_connection_t   *c;[m
[31m-[m
[31m-    /* NGX_TIMER_INFINITE == INFTIM */[m
[31m-[m
[31m-#if (NGX_DEBUG0)[m
[31m-    if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) {[m
[31m-        for (i = 0; i < nevents; i++) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "poll: %ui: fd:%d ev:%04Xd",[m
[31m-                           i, event_list[i].fd, event_list[i].events);[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "poll timer: %M", timer);[m
[31m-[m
[31m-    ready = poll(event_list, (u_int) nevents, (int) timer);[m
[31m-[m
[31m-    err = (ready == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "poll ready %d of %ui", ready, nevents);[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "poll() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ready == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "poll() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < nevents && ready; i++) {[m
[31m-[m
[31m-        revents = event_list[i].revents;[m
[31m-[m
[31m-#if 1[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "poll: %ui: fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                       i, event_list[i].fd, event_list[i].events, revents);[m
[31m-#else[m
[31m-        if (revents) {[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "poll: %ui: fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                           i, event_list[i].fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (revents & POLLNVAL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "poll() error fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                          event_list[i].fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-[m
[31m-        if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "strange poll() events fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                          event_list[i].fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-[m
[31m-        if (event_list[i].fd == -1) {[m
[31m-            /*[m
[31m-             * the disabled event, a workaround for our possible bug,[m
[31m-             * see the comment below[m
[31m-             */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        c = ngx_cycle->files[event_list[i].fd];[m
[31m-[m
[31m-        if (c->fd == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unexpected event");[m
[31m-[m
[31m-            /*[m
[31m-             * it is certainly our fault and it should be investigated,[m
[31m-             * in the meantime we disable this event to avoid a CPU spinning[m
[31m-             */[m
[31m-[m
[31m-            if (i == nevents - 1) {[m
[31m-                nevents--;[m
[31m-            } else {[m
[31m-                event_list[i].fd = -1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((revents & (POLLERR|POLLHUP|POLLNVAL))[m
[31m-             && (revents & (POLLIN|POLLOUT)) == 0)[m
[31m-        {[m
[31m-            /*[m
[31m-             * if the error events were returned without POLLIN or POLLOUT,[m
[31m-             * then add these flags to handle the events at least in one[m
[31m-             * active handler[m
[31m-             */[m
[31m-[m
[31m-            revents |= POLLIN|POLLOUT;[m
[31m-        }[m
[31m-[m
[31m-        found = 0;[m
[31m-[m
[31m-        if ((revents & POLLIN) && c->read->active) {[m
[31m-            found = 1;[m
[31m-[m
[31m-            ev = c->read;[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            queue = ev->accept ? &ngx_posted_accept_events[m
[31m-                               : &ngx_posted_events;[m
[31m-[m
[31m-            ngx_post_event(ev, queue);[m
[31m-        }[m
[31m-[m
[31m-        if ((revents & POLLOUT) && c->write->active) {[m
[31m-            found = 1;[m
[31m-[m
[31m-            ev = c->write;[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            ngx_post_event(ev, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        if (found) {[m
[31m-            ready--;[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ready != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll ready != events");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (ecf->use != ngx_poll_module.ctx_index) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_select_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_select_module.c[m
[1mdeleted file mode 100644[m
[1mindex 5a976bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_select_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,423 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_select_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static void ngx_select_repair_fd_sets(ngx_cycle_t *cycle);[m
[31m-static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static fd_set         master_read_fd_set;[m
[31m-static fd_set         master_write_fd_set;[m
[31m-static fd_set         work_read_fd_set;[m
[31m-static fd_set         work_write_fd_set;[m
[31m-[m
[31m-static ngx_int_t      max_fd;[m
[31m-static ngx_uint_t     nevents;[m
[31m-[m
[31m-static ngx_event_t  **event_index;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t    select_name = ngx_string("select");[m
[31m-[m
[31m-ngx_event_module_t  ngx_select_module_ctx = {[m
[31m-    &select_name,[m
[31m-    NULL,                                  /* create configuration */[m
[31m-    ngx_select_init_conf,                  /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_select_add_event,              /* add an event */[m
[31m-        ngx_select_del_event,              /* delete an event */[m
[31m-        ngx_select_add_event,              /* enable an event */[m
[31m-        ngx_select_del_event,              /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_select_process_events,         /* process the events */[m
[31m-        ngx_select_init,                   /* init the events */[m
[31m-        ngx_select_done                    /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_select_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_select_module_ctx,                /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_event_t  **index;[m
[31m-[m
[31m-    if (event_index == NULL) {[m
[31m-        FD_ZERO(&master_read_fd_set);[m
[31m-        FD_ZERO(&master_write_fd_set);[m
[31m-        nevents = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process >= NGX_PROCESS_WORKER[m
[31m-        || cycle->old_cycle == NULL[m
[31m-        || cycle->old_cycle->connection_n < cycle->connection_n)[m
[31m-    {[m
[31m-        index = ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n,[m
[31m-                          cycle->log);[m
[31m-        if (index == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (event_index) {[m
[31m-            ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents);[m
[31m-            ngx_free(event_index);[m
[31m-        }[m
[31m-[m
[31m-        event_index = index;[m
[31m-    }[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_select_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT;[m
[31m-[m
[31m-    max_fd = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_select_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_free(event_index);[m
[31m-[m
[31m-    event_index = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "select add event fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (ev->index != NGX_INVALID_INDEX) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "select event fd:%d ev:%i is already set", c->fd, event);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if ((event == NGX_READ_EVENT && ev->write)[m
[31m-        || (event == NGX_WRITE_EVENT && !ev->write))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "invalid select %s event fd:%d ev:%i",[m
[31m-                      ev->write ? "write" : "read", c->fd, event);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        FD_SET(c->fd, &master_read_fd_set);[m
[31m-[m
[31m-    } else if (event == NGX_WRITE_EVENT) {[m
[31m-        FD_SET(c->fd, &master_write_fd_set);[m
[31m-    }[m
[31m-[m
[31m-    if (max_fd != -1 && max_fd < c->fd) {[m
[31m-        max_fd = c->fd;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-[m
[31m-    event_index[nevents] = ev;[m
[31m-    ev->index = nevents;[m
[31m-    nevents++;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    if (ev->index == NGX_INVALID_INDEX) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "select del event fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        FD_CLR(c->fd, &master_read_fd_set);[m
[31m-[m
[31m-    } else if (event == NGX_WRITE_EVENT) {[m
[31m-        FD_CLR(c->fd, &master_write_fd_set);[m
[31m-    }[m
[31m-[m
[31m-    if (max_fd == c->fd) {[m
[31m-        max_fd = -1;[m
[31m-    }[m
[31m-[m
[31m-    if (ev->index < --nevents) {[m
[31m-        e = event_index[nevents];[m
[31m-        event_index[ev->index] = e;[m
[31m-        e->index = ev->index;[m
[31m-    }[m
[31m-[m
[31m-    ev->index = NGX_INVALID_INDEX;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                ready, nready;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_uint_t         i, found;[m
[31m-    ngx_event_t       *ev;[m
[31m-    ngx_queue_t       *queue;[m
[31m-    struct timeval     tv, *tp;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (max_fd == -1) {[m
[31m-        for (i = 0; i < nevents; i++) {[m
[31m-            c = event_index[i]->data;[m
[31m-            if (max_fd < c->fd) {[m
[31m-                max_fd = c->fd;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "change max_fd: %i", max_fd);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) {[m
[31m-        for (i = 0; i < nevents; i++) {[m
[31m-            ev = event_index[i];[m
[31m-            c = ev->data;[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "select event: fd:%d wr:%d", c->fd, ev->write);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "max_fd: %i", max_fd);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        tp = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        tv.tv_sec = (long) (timer / 1000);[m
[31m-        tv.tv_usec = (long) ((timer % 1000) * 1000);[m
[31m-        tp = &tv;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "select timer: %M", timer);[m
[31m-[m
[31m-    work_read_fd_set = master_read_fd_set;[m
[31m-    work_write_fd_set = master_write_fd_set;[m
[31m-[m
[31m-    ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, NULL, tp);[m
[31m-[m
[31m-    err = (ready == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "select ready %d", ready);[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_uint_t  level;[m
[31m-[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "select() failed");[m
[31m-[m
[31m-        if (err == NGX_EBADF) {[m
[31m-            ngx_select_repair_fd_sets(cycle);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ready == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "select() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    nready = 0;[m
[31m-[m
[31m-    for (i = 0; i < nevents; i++) {[m
[31m-        ev = event_index[i];[m
[31m-        c = ev->data;[m
[31m-        found = 0;[m
[31m-[m
[31m-        if (ev->write) {[m
[31m-            if (FD_ISSET(c->fd, &work_write_fd_set)) {[m
[31m-                found = 1;[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "select write %d", c->fd);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (FD_ISSET(c->fd, &work_read_fd_set)) {[m
[31m-                found = 1;[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "select read %d", c->fd);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (found) {[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            queue = ev->accept ? &ngx_posted_accept_events[m
[31m-                               : &ngx_posted_events;[m
[31m-[m
[31m-            ngx_post_event(ev, queue);[m
[31m-[m
[31m-            nready++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ready != nready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "select ready != events: %d:%d", ready, nready);[m
[31m-[m
[31m-        ngx_select_repair_fd_sets(cycle);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_select_repair_fd_sets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int           n;[m
[31m-    socklen_t     len;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_socket_t  s;[m
[31m-[m
[31m-    for (s = 0; s <= max_fd; s++) {[m
[31m-[m
[31m-        if (FD_ISSET(s, &master_read_fd_set) == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "invalid descriptor #%d in read fd_set", s);[m
[31m-[m
[31m-            FD_CLR(s, &master_read_fd_set);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (s = 0; s <= max_fd; s++) {[m
[31m-[m
[31m-        if (FD_ISSET(s, &master_write_fd_set) == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "invalid descriptor #%d in write fd_set", s);[m
[31m-[m
[31m-            FD_CLR(s, &master_write_fd_set);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    max_fd = -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_select_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (ecf->use != ngx_select_module.ctx_index) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */[m
[31m-[m
[31m-    if (cycle->connection_n > FD_SETSIZE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "the maximum number of files "[m
[31m-                      "supported by select() is %ud", FD_SETSIZE);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_win32_select_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_win32_select_module.c[m
[1mdeleted file mode 100644[m
[1mindex c671f83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/modules/ngx_win32_select_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,398 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_select_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static void ngx_select_repair_fd_sets(ngx_cycle_t *cycle);[m
[31m-static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static fd_set         master_read_fd_set;[m
[31m-static fd_set         master_write_fd_set;[m
[31m-static fd_set         work_read_fd_set;[m
[31m-static fd_set         work_write_fd_set;[m
[31m-[m
[31m-static ngx_uint_t     max_read;[m
[31m-static ngx_uint_t     max_write;[m
[31m-static ngx_uint_t     nevents;[m
[31m-[m
[31m-static ngx_event_t  **event_index;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t    select_name = ngx_string("select");[m
[31m-[m
[31m-ngx_event_module_t  ngx_select_module_ctx = {[m
[31m-    &select_name,[m
[31m-    NULL,                                  /* create configuration */[m
[31m-    ngx_select_init_conf,                  /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_select_add_event,              /* add an event */[m
[31m-        ngx_select_del_event,              /* delete an event */[m
[31m-        ngx_select_add_event,              /* enable an event */[m
[31m-        ngx_select_del_event,              /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_select_process_events,         /* process the events */[m
[31m-        ngx_select_init,                   /* init the events */[m
[31m-        ngx_select_done                    /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_select_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_select_module_ctx,                /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_event_t  **index;[m
[31m-[m
[31m-    if (event_index == NULL) {[m
[31m-        FD_ZERO(&master_read_fd_set);[m
[31m-        FD_ZERO(&master_write_fd_set);[m
[31m-        nevents = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process >= NGX_PROCESS_WORKER[m
[31m-        || cycle->old_cycle == NULL[m
[31m-        || cycle->old_cycle->connection_n < cycle->connection_n)[m
[31m-    {[m
[31m-        index = ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n,[m
[31m-                          cycle->log);[m
[31m-        if (index == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (event_index) {[m
[31m-            ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents);[m
[31m-            ngx_free(event_index);[m
[31m-        }[m
[31m-[m
[31m-        event_index = index;[m
[31m-    }[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_select_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT;[m
[31m-[m
[31m-    max_read = 0;[m
[31m-    max_write = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_select_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_free(event_index);[m
[31m-[m
[31m-    event_index = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "select add event fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (ev->index != NGX_INVALID_INDEX) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "select event fd:%d ev:%i is already set", c->fd, event);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if ((event == NGX_READ_EVENT && ev->write)[m
[31m-        || (event == NGX_WRITE_EVENT && !ev->write))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "invalid select %s event fd:%d ev:%i",[m
[31m-                      ev->write ? "write" : "read", c->fd, event);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((event == NGX_READ_EVENT && max_read >= FD_SETSIZE)[m
[31m-        || (event == NGX_WRITE_EVENT && max_write >= FD_SETSIZE))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ev->log, 0,[m
[31m-                      "maximum number of descriptors "[m
[31m-                      "supported by select() is %d", FD_SETSIZE);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        FD_SET(c->fd, &master_read_fd_set);[m
[31m-        max_read++;[m
[31m-[m
[31m-    } else if (event == NGX_WRITE_EVENT) {[m
[31m-        FD_SET(c->fd, &master_write_fd_set);[m
[31m-        max_write++;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-[m
[31m-    event_index[nevents] = ev;[m
[31m-    ev->index = nevents;[m
[31m-    nevents++;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    if (ev->index == NGX_INVALID_INDEX) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "select del event fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        FD_CLR(c->fd, &master_read_fd_set);[m
[31m-        max_read--;[m
[31m-[m
[31m-    } else if (event == NGX_WRITE_EVENT) {[m
[31m-        FD_CLR(c->fd, &master_write_fd_set);[m
[31m-        max_write--;[m
[31m-    }[m
[31m-[m
[31m-    if (ev->index < --nevents) {[m
[31m-        e = event_index[nevents];[m
[31m-        event_index[ev->index] = e;[m
[31m-        e->index = ev->index;[m
[31m-    }[m
[31m-[m
[31m-    ev->index = NGX_INVALID_INDEX;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                ready, nready;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_uint_t         i, found;[m
[31m-    ngx_event_t       *ev;[m
[31m-    ngx_queue_t       *queue;[m
[31m-    struct timeval     tv, *tp;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) {[m
[31m-        for (i = 0; i < nevents; i++) {[m
[31m-            ev = event_index[i];[m
[31m-            c = ev->data;[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "select event: fd:%d wr:%d", c->fd, ev->write);[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        tp = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        tv.tv_sec = (long) (timer / 1000);[m
[31m-        tv.tv_usec = (long) ((timer % 1000) * 1000);[m
[31m-        tp = &tv;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "select timer: %M", timer);[m
[31m-[m
[31m-    work_read_fd_set = master_read_fd_set;[m
[31m-    work_write_fd_set = master_write_fd_set;[m
[31m-[m
[31m-    if (max_read || max_write) {[m
[31m-        ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /*[m
[31m-         * Winsock select() requires that at least one descriptor set must be[m
[31m-         * be non-null, and any non-null descriptor set must contain at least[m
[31m-         * one handle to a socket.  Otherwise select() returns WSAEINVAL.[m
[31m-         */[m
[31m-[m
[31m-        ngx_msleep(timer);[m
[31m-[m
[31m-        ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    err = (ready == -1) ? ngx_socket_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "select ready %d", ready);[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed");[m
[31m-[m
[31m-        if (err == WSAENOTSOCK) {[m
[31m-            ngx_select_repair_fd_sets(cycle);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ready == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "select() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    nready = 0;[m
[31m-[m
[31m-    for (i = 0; i < nevents; i++) {[m
[31m-        ev = event_index[i];[m
[31m-        c = ev->data;[m
[31m-        found = 0;[m
[31m-[m
[31m-        if (ev->write) {[m
[31m-            if (FD_ISSET(c->fd, &work_write_fd_set)) {[m
[31m-                found = 1;[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "select write %d", c->fd);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (FD_ISSET(c->fd, &work_read_fd_set)) {[m
[31m-                found = 1;[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "select read %d", c->fd);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (found) {[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            queue = ev->accept ? &ngx_posted_accept_events[m
[31m-                               : &ngx_posted_events;[m
[31m-[m
[31m-            ngx_post_event(ev, queue);[m
[31m-[m
[31m-            nready++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ready != nready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "select ready != events: %d:%d", ready, nready);[m
[31m-[m
[31m-        ngx_select_repair_fd_sets(cycle);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_select_repair_fd_sets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int           n;[m
[31m-    u_int         i;[m
[31m-    socklen_t     len;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_socket_t  s;[m
[31m-[m
[31m-    for (i = 0; i < master_read_fd_set.fd_count; i++) {[m
[31m-[m
[31m-        s = master_read_fd_set.fd_array[i];[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "invalid descriptor #%d in read fd_set", s);[m
[31m-[m
[31m-            FD_CLR(s, &master_read_fd_set);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < master_write_fd_set.fd_count; i++) {[m
[31m-[m
[31m-        s = master_write_fd_set.fd_array[i];[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "invalid descriptor #%d in write fd_set", s);[m
[31m-[m
[31m-            FD_CLR(s, &master_write_fd_set);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_select_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (ecf->use != ngx_select_module.ctx_index) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event.c[m
[1mdeleted file mode 100644[m
[1mindex c8ae5b2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event.c[m
[1m+++ /dev/null[m
[36m@@ -1,1268 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define DEFAULT_CONNECTIONS  512[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t ngx_kqueue_module;[m
[31m-extern ngx_module_t ngx_eventport_module;[m
[31m-extern ngx_module_t ngx_devpoll_module;[m
[31m-extern ngx_module_t ngx_epoll_module;[m
[31m-extern ngx_module_t ngx_select_module;[m
[31m-[m
[31m-[m
[31m-static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-static ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle);[m
[31m-static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-static char *ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static void *ngx_event_core_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t     ngx_timer_resolution;[m
[31m-sig_atomic_t          ngx_event_timer_alarm;[m
[31m-[m
[31m-static ngx_uint_t     ngx_event_max_module;[m
[31m-[m
[31m-ngx_uint_t            ngx_event_flags;[m
[31m-ngx_event_actions_t   ngx_event_actions;[m
[31m-[m
[31m-[m
[31m-static ngx_atomic_t   connection_counter = 1;[m
[31m-ngx_atomic_t         *ngx_connection_counter = &connection_counter;[m
[31m-[m
[31m-[m
[31m-ngx_atomic_t         *ngx_accept_mutex_ptr;[m
[31m-ngx_shmtx_t           ngx_accept_mutex;[m
[31m-ngx_uint_t            ngx_use_accept_mutex;[m
[31m-ngx_uint_t            ngx_accept_events;[m
[31m-ngx_uint_t            ngx_accept_mutex_held;[m
[31m-ngx_msec_t            ngx_accept_mutex_delay;[m
[31m-ngx_int_t             ngx_accept_disabled;[m
[31m-[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-ngx_atomic_t   ngx_stat_accepted0;[m
[31m-ngx_atomic_t  *ngx_stat_accepted = &ngx_stat_accepted0;[m
[31m-ngx_atomic_t   ngx_stat_handled0;[m
[31m-ngx_atomic_t  *ngx_stat_handled = &ngx_stat_handled0;[m
[31m-ngx_atomic_t   ngx_stat_requests0;[m
[31m-ngx_atomic_t  *ngx_stat_requests = &ngx_stat_requests0;[m
[31m-ngx_atomic_t   ngx_stat_active0;[m
[31m-ngx_atomic_t  *ngx_stat_active = &ngx_stat_active0;[m
[31m-ngx_atomic_t   ngx_stat_reading0;[m
[31m-ngx_atomic_t  *ngx_stat_reading = &ngx_stat_reading0;[m
[31m-ngx_atomic_t   ngx_stat_writing0;[m
[31m-ngx_atomic_t  *ngx_stat_writing = &ngx_stat_writing0;[m
[31m-ngx_atomic_t   ngx_stat_waiting0;[m
[31m-ngx_atomic_t  *ngx_stat_waiting = &ngx_stat_waiting0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_events_commands[] = {[m
[31m-[m
[31m-    { ngx_string("events"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_events_block,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_events_module_ctx = {[m
[31m-    ngx_string("events"),[m
[31m-    NULL,[m
[31m-    ngx_event_init_conf[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_events_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_events_module_ctx,                /* module context */[m
[31m-    ngx_events_commands,                   /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  event_core_name = ngx_string("event_core");[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_event_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("worker_connections"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_event_connections,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("use"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_event_use,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("multi_accept"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_event_conf_t, multi_accept),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("accept_mutex"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_event_conf_t, accept_mutex),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("accept_mutex_delay"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_event_conf_t, accept_mutex_delay),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("debug_connection"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_event_debug_connection,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_event_core_module_ctx = {[m
[31m-    &event_core_name,[m
[31m-    ngx_event_core_create_conf,            /* create configuration */[m
[31m-    ngx_event_core_init_conf,              /* init configuration */[m
[31m-[m
[31m-    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_event_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_event_core_module_ctx,            /* module context */[m
[31m-    ngx_event_core_commands,               /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    ngx_event_module_init,                 /* init module */[m
[31m-    ngx_event_process_init,                /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_process_events_and_timers(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  flags;[m
[31m-    ngx_msec_t  timer, delta;[m
[31m-[m
[31m-    if (ngx_timer_resolution) {[m
[31m-        timer = NGX_TIMER_INFINITE;[m
[31m-        flags = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        timer = ngx_event_find_timer();[m
[31m-        flags = NGX_UPDATE_TIME;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-        /* handle signals from master in case of network inactivity */[m
[31m-[m
[31m-        if (timer == NGX_TIMER_INFINITE || timer > 500) {[m
[31m-            timer = 500;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_use_accept_mutex) {[m
[31m-        if (ngx_accept_disabled > 0) {[m
[31m-            ngx_accept_disabled--;[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_accept_mutex_held) {[m
[31m-                flags |= NGX_POST_EVENTS;[m
[31m-[m
[31m-            } else {[m
[31m-                if (timer == NGX_TIMER_INFINITE[m
[31m-                    || timer > ngx_accept_mutex_delay)[m
[31m-                {[m
[31m-                    timer = ngx_accept_mutex_delay;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    delta = ngx_current_msec;[m
[31m-[m
[31m-    (void) ngx_process_events(cycle, timer, flags);[m
[31m-[m
[31m-    delta = ngx_current_msec - delta;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "timer delta: %M", delta);[m
[31m-[m
[31m-    ngx_event_process_posted(cycle, &ngx_posted_accept_events);[m
[31m-[m
[31m-    if (ngx_accept_mutex_held) {[m
[31m-        ngx_shmtx_unlock(&ngx_accept_mutex);[m
[31m-    }[m
[31m-[m
[31m-    if (delta) {[m
[31m-        ngx_event_expire_timers();[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_process_posted(cycle, &ngx_posted_events);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)[m
[31m-{[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue, epoll */[m
[31m-[m
[31m-        if (!rev->active && !rev->ready) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_LEVEL_EVENT) {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        if (!rev->active && !rev->ready) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rev->active && (rev->ready || (flags & NGX_CLOSE_EVENT))) {[m
[31m-            if (ngx_del_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT | flags)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {[m
[31m-[m
[31m-        /* event ports */[m
[31m-[m
[31m-        if (!rev->active && !rev->ready) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rev->oneshot && !rev->ready) {[m
[31m-            if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* iocp */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_handle_write_event(ngx_event_t *wev, size_t lowat)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (lowat) {[m
[31m-        c = wev->data;[m
[31m-[m
[31m-        if (ngx_send_lowat(c, lowat) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue, epoll */[m
[31m-[m
[31m-        if (!wev->active && !wev->ready) {[m
[31m-            if (ngx_add_event(wev, NGX_WRITE_EVENT,[m
[31m-                              NGX_CLEAR_EVENT | (lowat ? NGX_LOWAT_EVENT : 0))[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_LEVEL_EVENT) {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        if (!wev->active && !wev->ready) {[m
[31m-            if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (wev->active && wev->ready) {[m
[31m-            if (ngx_del_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {[m
[31m-[m
[31m-        /* event ports */[m
[31m-[m
[31m-        if (!wev->active && !wev->ready) {[m
[31m-            if (ngx_add_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (wev->oneshot && wev->ready) {[m
[31m-            if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* iocp */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    if (ngx_get_conf(cycle->conf_ctx, ngx_events_module) == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "no \"events\" section in configuration");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_module_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    void              ***cf;[m
[31m-    u_char              *shared;[m
[31m-    size_t               size, cl;[m
[31m-    ngx_shm_t            shm;[m
[31m-    ngx_time_t          *tp;[m
[31m-    ngx_core_conf_t     *ccf;[m
[31m-    ngx_event_conf_t    *ecf;[m
[31m-[m
[31m-    cf = ngx_get_conf(cycle->conf_ctx, ngx_events_module);[m
[31m-    ecf = (*cf)[ngx_event_core_module.ctx_index];[m
[31m-[m
[31m-    if (!ngx_test_config && ngx_process <= NGX_PROCESS_MASTER) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                      "using the \"%s\" event method", ecf->name);[m
[31m-    }[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    ngx_timer_resolution = ccf->timer_resolution;[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-    {[m
[31m-    ngx_int_t      limit;[m
[31m-    struct rlimit  rlmt;[m
[31m-[m
[31m-    if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "getrlimit(RLIMIT_NOFILE) failed, ignored");[m
[31m-[m
[31m-    } else {[m
[31m-        if (ecf->connections > (ngx_uint_t) rlmt.rlim_cur[m
[31m-            && (ccf->rlimit_nofile == NGX_CONF_UNSET[m
[31m-                || ecf->connections > (ngx_uint_t) ccf->rlimit_nofile))[m
[31m-        {[m
[31m-            limit = (ccf->rlimit_nofile == NGX_CONF_UNSET) ?[m
[31m-                         (ngx_int_t) rlmt.rlim_cur : ccf->rlimit_nofile;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_WARN, cycle->log, 0,[m
[31m-                          "%ui worker_connections exceed "[m
[31m-                          "open file resource limit: %i",[m
[31m-                          ecf->connections, limit);[m
[31m-        }[m
[31m-    }[m
[31m-    }[m
[31m-#endif /* !(NGX_WIN32) */[m
[31m-[m
[31m-[m
[31m-    if (ccf->master == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_accept_mutex_ptr) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* cl should be equal to or greater than cache line size */[m
[31m-[m
[31m-    cl = 128;[m
[31m-[m
[31m-    size = cl            /* ngx_accept_mutex */[m
[31m-           + cl          /* ngx_connection_counter */[m
[31m-           + cl;         /* ngx_temp_number */[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-    size += cl           /* ngx_stat_accepted */[m
[31m-           + cl          /* ngx_stat_handled */[m
[31m-           + cl          /* ngx_stat_requests */[m
[31m-           + cl          /* ngx_stat_active */[m
[31m-           + cl          /* ngx_stat_reading */[m
[31m-           + cl          /* ngx_stat_writing */[m
[31m-           + cl;         /* ngx_stat_waiting */[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    shm.size = size;[m
[31m-    shm.name.len = sizeof("nginx_shared_zone") - 1;[m
[31m-    shm.name.data = (u_char *) "nginx_shared_zone";[m
[31m-    shm.log = cycle->log;[m
[31m-[m
[31m-    if (ngx_shm_alloc(&shm) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shared = shm.addr;[m
[31m-[m
[31m-    ngx_accept_mutex_ptr = (ngx_atomic_t *) shared;[m
[31m-    ngx_accept_mutex.spin = (ngx_uint_t) -1;[m
[31m-[m
[31m-    if (ngx_shmtx_create(&ngx_accept_mutex, (ngx_shmtx_sh_t *) shared,[m
[31m-                         cycle->lock_file.data)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_connection_counter = (ngx_atomic_t *) (shared + 1 * cl);[m
[31m-[m
[31m-    (void) ngx_atomic_cmp_set(ngx_connection_counter, 0, 1);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "counter: %p, %uA",[m
[31m-                   ngx_connection_counter, *ngx_connection_counter);[m
[31m-[m
[31m-    ngx_temp_number = (ngx_atomic_t *) (shared + 2 * cl);[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ngx_random_number = (tp->msec << 16) + ngx_pid;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-    ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * cl);[m
[31m-    ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * cl);[m
[31m-    ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * cl);[m
[31m-    ngx_stat_active = (ngx_atomic_t *) (shared + 6 * cl);[m
[31m-    ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * cl);[m
[31m-    ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * cl);[m
[31m-    ngx_stat_waiting = (ngx_atomic_t *) (shared + 9 * cl);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-static void[m
[31m-ngx_timer_signal_handler(int signo)[m
[31m-{[m
[31m-    ngx_event_timer_alarm = 1;[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer signal");[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_process_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t           m, i;[m
[31m-    ngx_event_t         *rev, *wev;[m
[31m-    ngx_listening_t     *ls;[m
[31m-    ngx_connection_t    *c, *next, *old;[m
[31m-    ngx_core_conf_t     *ccf;[m
[31m-    ngx_event_conf_t    *ecf;[m
[31m-    ngx_event_module_t  *module;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (ccf->master && ccf->worker_processes > 1 && ecf->accept_mutex) {[m
[31m-        ngx_use_accept_mutex = 1;[m
[31m-        ngx_accept_mutex_held = 0;[m
[31m-        ngx_accept_mutex_delay = ecf->accept_mutex_delay;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_use_accept_mutex = 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-    /*[m
[31m-     * disable accept mutex on win32 as it may cause deadlock if[m
[31m-     * grabbed by a process which can't accept connections[m
[31m-     */[m
[31m-[m
[31m-    ngx_use_accept_mutex = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_queue_init(&ngx_posted_accept_events);[m
[31m-    ngx_queue_init(&ngx_posted_events);[m
[31m-[m
[31m-    if (ngx_event_timer_init(cycle->log) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cycle->modules[m]; m++) {[m
[31m-        if (cycle->modules[m]->type != NGX_EVENT_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (cycle->modules[m]->ctx_index != ecf->use) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->actions.init(cycle, ngx_timer_resolution) != NGX_OK) {[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-    if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) {[m
[31m-        struct sigaction  sa;[m
[31m-        struct itimerval  itv;[m
[31m-[m
[31m-        ngx_memzero(&sa, sizeof(struct sigaction));[m
[31m-        sa.sa_handler = ngx_timer_signal_handler;[m
[31m-        sigemptyset(&sa.sa_mask);[m
[31m-[m
[31m-        if (sigaction(SIGALRM, &sa, NULL) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "sigaction(SIGALRM) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        itv.it_interval.tv_sec = ngx_timer_resolution / 1000;[m
[31m-        itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000;[m
[31m-        itv.it_value.tv_sec = ngx_timer_resolution / 1000;[m
[31m-        itv.it_value.tv_usec = (ngx_timer_resolution % 1000 ) * 1000;[m
[31m-[m
[31m-        if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setitimer() failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_FD_EVENT) {[m
[31m-        struct rlimit  rlmt;[m
[31m-[m
[31m-        if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "getrlimit(RLIMIT_NOFILE) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cycle->files_n = (ngx_uint_t) rlmt.rlim_cur;[m
[31m-[m
[31m-        cycle->files = ngx_calloc(sizeof(ngx_connection_t *) * cycle->files_n,[m
[31m-                                  cycle->log);[m
[31m-        if (cycle->files == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cycle->log, 0,[m
[31m-                      "the \"timer_resolution\" directive is not supported "[m
[31m-                      "with the configured event method, ignored");[m
[31m-        ngx_timer_resolution = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    cycle->connections =[m
[31m-        ngx_alloc(sizeof(ngx_connection_t) * cycle->connection_n, cycle->log);[m
[31m-    if (cycle->connections == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = cycle->connections;[m
[31m-[m
[31m-    cycle->read_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n,[m
[31m-                                   cycle->log);[m
[31m-    if (cycle->read_events == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rev = cycle->read_events;[m
[31m-    for (i = 0; i < cycle->connection_n; i++) {[m
[31m-        rev[i].closed = 1;[m
[31m-        rev[i].instance = 1;[m
[31m-    }[m
[31m-[m
[31m-    cycle->write_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n,[m
[31m-                                    cycle->log);[m
[31m-    if (cycle->write_events == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    wev = cycle->write_events;[m
[31m-    for (i = 0; i < cycle->connection_n; i++) {[m
[31m-        wev[i].closed = 1;[m
[31m-    }[m
[31m-[m
[31m-    i = cycle->connection_n;[m
[31m-    next = NULL;[m
[31m-[m
[31m-    do {[m
[31m-        i--;[m
[31m-[m
[31m-        c[i].data = next;[m
[31m-        c[i].read = &cycle->read_events[i];[m
[31m-        c[i].write = &cycle->write_events[i];[m
[31m-        c[i].fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-        next = &c[i];[m
[31m-    } while (i);[m
[31m-[m
[31m-    cycle->free_connections = next;[m
[31m-    cycle->free_connection_n = cycle->connection_n;[m
[31m-[m
[31m-    /* for each listening socket */[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-        if (ls[i].reuseport && ls[i].worker != ngx_worker) {[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c = ngx_get_connection(ls[i].fd, cycle->log);[m
[31m-[m
[31m-        if (c == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->type = ls[i].type;[m
[31m-        c->log = &ls[i].log;[m
[31m-[m
[31m-        c->listening = &ls[i];[m
[31m-        ls[i].connection = c;[m
[31m-[m
[31m-        rev = c->read;[m
[31m-[m
[31m-        rev->log = c->log;[m
[31m-        rev->accept = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT)[m
[31m-        rev->deferred_accept = ls[i].deferred_accept;[m
[31m-#endif[m
[31m-[m
[31m-        if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {[m
[31m-            if (ls[i].previous) {[m
[31m-[m
[31m-                /*[m
[31m-                 * delete the old accept events that were bound to[m
[31m-                 * the old cycle read events array[m
[31m-                 */[m
[31m-[m
[31m-                old = ls[i].previous->connection;[m
[31m-[m
[31m-                if (ngx_del_event(old->read, NGX_READ_EVENT, NGX_CLOSE_EVENT)[m
[31m-                    == NGX_ERROR)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                old->fd = (ngx_socket_t) -1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            ngx_iocp_conf_t  *iocpcf;[m
[31m-[m
[31m-            rev->handler = ngx_event_acceptex;[m
[31m-[m
[31m-            if (ngx_use_accept_mutex) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls[i].log.handler = ngx_acceptex_log_error;[m
[31m-[m
[31m-            iocpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);[m
[31m-            if (ngx_event_post_acceptex(&ls[i], iocpcf->post_acceptex)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            rev->handler = ngx_event_accept;[m
[31m-[m
[31m-            if (ngx_use_accept_mutex) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        rev->handler = (c->type == SOCK_STREAM) ? ngx_event_accept[m
[31m-                                                : ngx_event_recvmsg;[m
[31m-[m
[31m-        if (ngx_use_accept_mutex[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            && !ls[i].reuseport[m
[31m-#endif[m
[31m-           )[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_send_lowat(ngx_connection_t *c, size_t lowat)[m
[31m-{[m
[31m-    int  sndlowat;[m
[31m-[m
[31m-#if (NGX_HAVE_LOWAT_EVENT)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        c->write->available = lowat;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (lowat == 0 || c->sndlowat) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sndlowat = (int) lowat;[m
[31m-[m
[31m-    if (setsockopt(c->fd, SOL_SOCKET, SO_SNDLOWAT,[m
[31m-                   (const void *) &sndlowat, sizeof(int))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_connection_error(c, ngx_socket_errno,[m
[31m-                             "setsockopt(SO_SNDLOWAT) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->sndlowat = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                 *rv;[m
[31m-    void               ***ctx;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_conf_t            pcf;[m
[31m-    ngx_event_module_t   *m;[m
[31m-[m
[31m-    if (*(void **) conf) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* count the number of the event modules and set up their indices */[m
[31m-[m
[31m-    ngx_event_max_module = ngx_count_modules(cf->cycle, NGX_EVENT_MODULE);[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(void *));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));[m
[31m-    if (*ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(void **) conf = ctx;[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        m = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (m->create_conf) {[m
[31m-            (*ctx)[cf->cycle->modules[i]->ctx_index] =[m
[31m-                                                     m->create_conf(cf->cycle);[m
[31m-            if ((*ctx)[cf->cycle->modules[i]->ctx_index] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->module_type = NGX_EVENT_MODULE;[m
[31m-    cf->cmd_type = NGX_EVENT_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        m = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (m->init_conf) {[m
[31m-            rv = m->init_conf(cf->cycle,[m
[31m-                              (*ctx)[cf->cycle->modules[i]->ctx_index]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                return rv;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (ecf->connections != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    ecf->connections = ngx_atoi(value[1].data, value[1].len);[m
[31m-    if (ecf->connections == (ngx_uint_t) NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number \"%V\"", &value[1]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cf->cycle->connection_n = ecf->connections;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf = conf;[m
[31m-[m
[31m-    ngx_int_t             m;[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_event_conf_t     *old_ecf;[m
[31m-    ngx_event_module_t   *module;[m
[31m-[m
[31m-    if (ecf->use != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->cycle->old_cycle->conf_ctx) {[m
[31m-        old_ecf = ngx_event_get_conf(cf->cycle->old_cycle->conf_ctx,[m
[31m-                                     ngx_event_core_module);[m
[31m-    } else {[m
[31m-        old_ecf = NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_EVENT_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        if (module->name->len == value[1].len) {[m
[31m-            if (ngx_strcmp(module->name->data, value[1].data) == 0) {[m
[31m-                ecf->use = cf->cycle->modules[m]->ctx_index;[m
[31m-                ecf->name = module->name->data;[m
[31m-[m
[31m-                if (ngx_process == NGX_PROCESS_SINGLE[m
[31m-                    && old_ecf[m
[31m-                    && old_ecf->use != ecf->use)[m
[31m-                {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "when the server runs without a master process "[m
[31m-                               "the \"%V\" event type must be the same as "[m
[31m-                               "in previous configuration - \"%s\" "[m
[31m-                               "and it cannot be changed on the fly, "[m
[31m-                               "to change it you need to stop server "[m
[31m-                               "and start it again",[m
[31m-                               &value[1], old_ecf->name);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid event type \"%V\"", &value[1]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_event_conf_t  *ecf = conf;[m
[31m-[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_url_t             u;[m
[31m-    ngx_cidr_t            c, *cidr;[m
[31m-    ngx_uint_t            i;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "unix:") == 0) {[m
[31m-        cidr = ngx_array_push(&ecf->debug_connection);[m
[31m-        if (cidr == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cidr->family = AF_UNIX;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_ptocidr(&value[1], &c);[m
[31m-[m
[31m-    if (rc != NGX_ERROR) {[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "low address bits of %V are meaningless",[m
[31m-                               &value[1]);[m
[31m-        }[m
[31m-[m
[31m-        cidr = ngx_array_push(&ecf->debug_connection);[m
[31m-        if (cidr == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *cidr = c;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-    u.host = value[1];[m
[31m-[m
[31m-    if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in debug_connection \"%V\"",[m
[31m-                               u.err, &u.host);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cidr = ngx_array_push_n(&ecf->debug_connection, u.naddrs);[m
[31m-    if (cidr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(cidr, u.naddrs * sizeof(ngx_cidr_t));[m
[31m-[m
[31m-    for (i = 0; i < u.naddrs; i++) {[m
[31m-        cidr[i].family = u.addrs[i].sockaddr->sa_family;[m
[31m-[m
[31m-        switch (cidr[i].family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) u.addrs[i].sockaddr;[m
[31m-            cidr[i].u.in6.addr = sin6->sin6_addr;[m
[31m-            ngx_memset(cidr[i].u.in6.mask.s6_addr, 0xff, 16);[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) u.addrs[i].sockaddr;[m
[31m-            cidr[i].u.in.addr = sin->sin_addr.s_addr;[m
[31m-            cidr[i].u.in.mask = 0xffffffff;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"debug_connection\" is ignored, you need to rebuild "[m
[31m-                       "nginx using --with-debug option to enable it");[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_event_core_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-[m
[31m-    ecf = ngx_palloc(cycle->pool, sizeof(ngx_event_conf_t));[m
[31m-    if (ecf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ecf->connections = NGX_CONF_UNSET_UINT;[m
[31m-    ecf->use = NGX_CONF_UNSET_UINT;[m
[31m-    ecf->multi_accept = NGX_CONF_UNSET;[m
[31m-    ecf->accept_mutex = NGX_CONF_UNSET;[m
[31m-    ecf->accept_mutex_delay = NGX_CONF_UNSET_MSEC;[m
[31m-    ecf->name = (void *) NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    if (ngx_array_init(&ecf->debug_connection, cycle->pool, 4,[m
[31m-                       sizeof(ngx_cidr_t)) == NGX_ERROR)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return ecf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf = conf;[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)[m
[31m-    int                  fd;[m
[31m-#endif[m
[31m-    ngx_int_t            i;[m
[31m-    ngx_module_t        *module;[m
[31m-    ngx_event_module_t  *event_module;[m
[31m-[m
[31m-    module = NULL;[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)[m
[31m-[m
[31m-    fd = epoll_create(100);[m
[31m-[m
[31m-    if (fd != -1) {[m
[31m-        (void) close(fd);[m
[31m-        module = &ngx_epoll_module;[m
[31m-[m
[31m-    } else if (ngx_errno != NGX_ENOSYS) {[m
[31m-        module = &ngx_epoll_module;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEVPOLL) && !(NGX_TEST_BUILD_DEVPOLL)[m
[31m-[m
[31m-    module = &ngx_devpoll_module;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    module = &ngx_kqueue_module;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SELECT)[m
[31m-[m
[31m-    if (module == NULL) {[m
[31m-        module = &ngx_select_module;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (module == NULL) {[m
[31m-        for (i = 0; cycle->modules[i]; i++) {[m
[31m-[m
[31m-            if (cycle->modules[i]->type != NGX_EVENT_MODULE) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            event_module = cycle->modules[i]->ctx;[m
[31m-[m
[31m-            if (ngx_strcmp(event_module->name->data, event_core_name.data) == 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            module = cycle->modules[i];[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (module == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no events module found");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_init_uint_value(ecf->connections, DEFAULT_CONNECTIONS);[m
[31m-    cycle->connection_n = ecf->connections;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(ecf->use, module->ctx_index);[m
[31m-[m
[31m-    event_module = module->ctx;[m
[31m-    ngx_conf_init_ptr_value(ecf->name, event_module->name->data);[m
[31m-[m
[31m-    ngx_conf_init_value(ecf->multi_accept, 0);[m
[31m-    ngx_conf_init_value(ecf->accept_mutex, 1);[m
[31m-    ngx_conf_init_msec_value(ecf->accept_mutex_delay, 500);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event.h[m
[1mdeleted file mode 100644[m
[1mindex ed0682c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event.h[m
[1m+++ /dev/null[m
[36m@@ -1,530 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_H_INCLUDED_[m
[31m-#define _NGX_EVENT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_INVALID_INDEX  0xd0d0d0d0[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-[m
[31m-typedef struct {[m
[31m-    WSAOVERLAPPED    ovlp;[m
[31m-    ngx_event_t     *event;[m
[31m-    int              error;[m
[31m-} ngx_event_ovlp_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-struct ngx_event_s {[m
[31m-    void            *data;[m
[31m-[m
[31m-    unsigned         write:1;[m
[31m-[m
[31m-    unsigned         accept:1;[m
[31m-[m
[31m-    /* used to detect the stale events in kqueue and epoll */[m
[31m-    unsigned         instance:1;[m
[31m-[m
[31m-    /*[m
[31m-     * the event was passed or would be passed to a kernel;[m
[31m-     * in aio mode - operation was posted.[m
[31m-     */[m
[31m-    unsigned         active:1;[m
[31m-[m
[31m-    unsigned         disabled:1;[m
[31m-[m
[31m-    /* the ready event; in aio mode 0 means that no operation can be posted */[m
[31m-    unsigned         ready:1;[m
[31m-[m
[31m-    unsigned         oneshot:1;[m
[31m-[m
[31m-    /* aio operation is complete */[m
[31m-    unsigned         complete:1;[m
[31m-[m
[31m-    unsigned         eof:1;[m
[31m-    unsigned         error:1;[m
[31m-[m
[31m-    unsigned         timedout:1;[m
[31m-    unsigned         timer_set:1;[m
[31m-[m
[31m-    unsigned         delayed:1;[m
[31m-[m
[31m-    unsigned         deferred_accept:1;[m
[31m-[m
[31m-    /* the pending eof reported by kqueue, epoll or in aio chain operation */[m
[31m-    unsigned         pending_eof:1;[m
[31m-[m
[31m-    unsigned         posted:1;[m
[31m-[m
[31m-    unsigned         closed:1;[m
[31m-[m
[31m-    /* to test on worker exit */[m
[31m-    unsigned         channel:1;[m
[31m-    unsigned         resolver:1;[m
[31m-[m
[31m-    unsigned         cancelable:1;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    /* setsockopt(SO_UPDATE_ACCEPT_CONTEXT) was successful */[m
[31m-    unsigned         accept_context_updated:1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-    unsigned         kq_vnode:1;[m
[31m-[m
[31m-    /* the pending errno reported by kqueue */[m
[31m-    int              kq_errno;[m
[31m-#endif[m
[31m-[m
[31m-    /*[m
[31m-     * kqueue only:[m
[31m-     *   accept:     number of sockets that wait to be accepted[m
[31m-     *   read:       bytes to read when event is ready[m
[31m-     *               or lowat when event is set with NGX_LOWAT_EVENT flag[m
[31m-     *   write:      available space in buffer when event is ready[m
[31m-     *               or lowat when event is set with NGX_LOWAT_EVENT flag[m
[31m-     *[m
[31m-     * iocp: TODO[m
[31m-     *[m
[31m-     * otherwise:[m
[31m-     *   accept:     1 if accept many, 0 otherwise[m
[31m-     */[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE) || (NGX_HAVE_IOCP)[m
[31m-    int              available;[m
[31m-#else[m
[31m-    unsigned         available:1;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_event_handler_pt  handler;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-    ngx_event_ovlp_t ovlp;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t       index;[m
[31m-[m
[31m-    ngx_log_t       *log;[m
[31m-[m
[31m-    ngx_rbtree_node_t   timer;[m
[31m-[m
[31m-    /* the posted queue */[m
[31m-    ngx_queue_t      queue;[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-    /* the threads support */[m
[31m-[m
[31m-    /*[m
[31m-     * the event thread context, we store it here[m
[31m-     * if $(CC) does not understand __thread declaration[m
[31m-     * and pthread_getspecific() is too costly[m
[31m-     */[m
[31m-[m
[31m-    void            *thr_ctx;[m
[31m-[m
[31m-#if (NGX_EVENT_T_PADDING)[m
[31m-[m
[31m-    /* event should not cross cache line in SMP */[m
[31m-[m
[31m-    uint32_t         padding[NGX_EVENT_T_PADDING];[m
[31m-#endif[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-struct ngx_event_aio_s {[m
[31m-    void                      *data;[m
[31m-    ngx_event_handler_pt       handler;[m
[31m-    ngx_file_t                *file;[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    ssize_t                  (*preload_handler)(ngx_buf_t *file);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_fd_t                   fd;[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-    int64_t                    res;[m
[31m-#endif[m
[31m-[m
[31m-#if !(NGX_HAVE_EVENTFD) || (NGX_TEST_BUILD_EPOLL)[m
[31m-    ngx_err_t                  err;[m
[31m-    size_t                     nbytes;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_aiocb_t                aiocb;[m
[31m-    ngx_event_t                event;[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);[m
[31m-    ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);[m
[31m-[m
[31m-    ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);[m
[31m-    ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);[m
[31m-[m
[31m-    ngx_int_t  (*add_conn)(ngx_connection_t *c);[m
[31m-    ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);[m
[31m-[m
[31m-    ngx_int_t  (*notify)(ngx_event_handler_pt handler);[m
[31m-[m
[31m-    ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-                                 ngx_uint_t flags);[m
[31m-[m
[31m-    ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-    void       (*done)(ngx_cycle_t *cycle);[m
[31m-} ngx_event_actions_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_event_actions_t   ngx_event_actions;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The event filter requires to read/write the whole data:[m
[31m- * select, poll, /dev/poll, kqueue, epoll.[m
[31m- */[m
[31m-#define NGX_USE_LEVEL_EVENT      0x00000001[m
[31m-[m
[31m-/*[m
[31m- * The event filter is deleted after a notification without an additional[m
[31m- * syscall: kqueue, epoll.[m
[31m- */[m
[31m-#define NGX_USE_ONESHOT_EVENT    0x00000002[m
[31m-[m
[31m-/*[m
[31m- * The event filter notifies only the changes and an initial level:[m
[31m- * kqueue, epoll.[m
[31m- */[m
[31m-#define NGX_USE_CLEAR_EVENT      0x00000004[m
[31m-[m
[31m-/*[m
[31m- * The event filter has kqueue features: the eof flag, errno,[m
[31m- * available data, etc.[m
[31m- */[m
[31m-#define NGX_USE_KQUEUE_EVENT     0x00000008[m
[31m-[m
[31m-/*[m
[31m- * The event filter supports low water mark: kqueue's NOTE_LOWAT.[m
[31m- * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag.[m
[31m- */[m
[31m-#define NGX_USE_LOWAT_EVENT      0x00000010[m
[31m-[m
[31m-/*[m
[31m- * The event filter requires to do i/o operation until EAGAIN: epoll.[m
[31m- */[m
[31m-#define NGX_USE_GREEDY_EVENT     0x00000020[m
[31m-[m
[31m-/*[m
[31m- * The event filter is epoll.[m
[31m- */[m
[31m-#define NGX_USE_EPOLL_EVENT      0x00000040[m
[31m-[m
[31m-/*[m
[31m- * Obsolete.[m
[31m- */[m
[31m-#define NGX_USE_RTSIG_EVENT      0x00000080[m
[31m-[m
[31m-/*[m
[31m- * Obsolete.[m
[31m- */[m
[31m-#define NGX_USE_AIO_EVENT        0x00000100[m
[31m-[m
[31m-/*[m
[31m- * Need to add socket or handle only once: i/o completion port.[m
[31m- */[m
[31m-#define NGX_USE_IOCP_EVENT       0x00000200[m
[31m-[m
[31m-/*[m
[31m- * The event filter has no opaque data and requires file descriptors table:[m
[31m- * poll, /dev/poll.[m
[31m- */[m
[31m-#define NGX_USE_FD_EVENT         0x00000400[m
[31m-[m
[31m-/*[m
[31m- * The event module handles periodic or absolute timer event by itself:[m
[31m- * kqueue in FreeBSD 4.4, NetBSD 2.0, and MacOSX 10.4, Solaris 10's event ports.[m
[31m- */[m
[31m-#define NGX_USE_TIMER_EVENT      0x00000800[m
[31m-[m
[31m-/*[m
[31m- * All event filters on file descriptor are deleted after a notification:[m
[31m- * Solaris 10's event ports.[m
[31m- */[m
[31m-#define NGX_USE_EVENTPORT_EVENT  0x00001000[m
[31m-[m
[31m-/*[m
[31m- * The event filter support vnode notifications: kqueue.[m
[31m- */[m
[31m-#define NGX_USE_VNODE_EVENT      0x00002000[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The event filter is deleted just before the closing file.[m
[31m- * Has no meaning for select and poll.[m
[31m- * kqueue, epoll, eventport:         allows to avoid explicit delete,[m
[31m- *                                   because filter automatically is deleted[m
[31m- *                                   on file close,[m
[31m- *[m
[31m- * /dev/poll:                        we need to flush POLLREMOVE event[m
[31m- *                                   before closing file.[m
[31m- */[m
[31m-#define NGX_CLOSE_EVENT    1[m
[31m-[m
[31m-/*[m
[31m- * disable temporarily event filter, this may avoid locks[m
[31m- * in kernel malloc()/free(): kqueue.[m
[31m- */[m
[31m-#define NGX_DISABLE_EVENT  2[m
[31m-[m
[31m-/*[m
[31m- * event must be passed to kernel right now, do not wait until batch processing.[m
[31m- */[m
[31m-#define NGX_FLUSH_EVENT    4[m
[31m-[m
[31m-[m
[31m-/* these flags have a meaning only for kqueue */[m
[31m-#define NGX_LOWAT_EVENT    0[m
[31m-#define NGX_VNODE_EVENT    0[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL) && !(NGX_HAVE_EPOLLRDHUP)[m
[31m-#define EPOLLRDHUP         0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-#define NGX_READ_EVENT     EVFILT_READ[m
[31m-#define NGX_WRITE_EVENT    EVFILT_WRITE[m
[31m-[m
[31m-#undef  NGX_VNODE_EVENT[m
[31m-#define NGX_VNODE_EVENT    EVFILT_VNODE[m
[31m-[m
[31m-/*[m
[31m- * NGX_CLOSE_EVENT, NGX_LOWAT_EVENT, and NGX_FLUSH_EVENT are the module flags[m
[31m- * and they must not go into a kernel so we need to choose the value[m
[31m- * that must not interfere with any existent and future kqueue flags.[m
[31m- * kqueue has such values - EV_FLAG1, EV_EOF, and EV_ERROR:[m
[31m- * they are reserved and cleared on a kernel entrance.[m
[31m- */[m
[31m-#undef  NGX_CLOSE_EVENT[m
[31m-#define NGX_CLOSE_EVENT    EV_EOF[m
[31m-[m
[31m-#undef  NGX_LOWAT_EVENT[m
[31m-#define NGX_LOWAT_EVENT    EV_FLAG1[m
[31m-[m
[31m-#undef  NGX_FLUSH_EVENT[m
[31m-#define NGX_FLUSH_EVENT    EV_ERROR[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_ONESHOT_EVENT  EV_ONESHOT[m
[31m-#define NGX_CLEAR_EVENT    EV_CLEAR[m
[31m-[m
[31m-#undef  NGX_DISABLE_EVENT[m
[31m-#define NGX_DISABLE_EVENT  EV_DISABLE[m
[31m-[m
[31m-[m
[31m-#elif (NGX_HAVE_DEVPOLL && !(NGX_TEST_BUILD_DEVPOLL)) \[m
[31m-      || (NGX_HAVE_EVENTPORT && !(NGX_TEST_BUILD_EVENTPORT))[m
[31m-[m
[31m-#define NGX_READ_EVENT     POLLIN[m
[31m-#define NGX_WRITE_EVENT    POLLOUT[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_ONESHOT_EVENT  1[m
[31m-[m
[31m-[m
[31m-#elif (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)[m
[31m-[m
[31m-#define NGX_READ_EVENT     (EPOLLIN|EPOLLRDHUP)[m
[31m-#define NGX_WRITE_EVENT    EPOLLOUT[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_CLEAR_EVENT    EPOLLET[m
[31m-#define NGX_ONESHOT_EVENT  0x70000000[m
[31m-#if 0[m
[31m-#define NGX_ONESHOT_EVENT  EPOLLONESHOT[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif (NGX_HAVE_POLL)[m
[31m-[m
[31m-#define NGX_READ_EVENT     POLLIN[m
[31m-#define NGX_WRITE_EVENT    POLLOUT[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_ONESHOT_EVENT  1[m
[31m-[m
[31m-[m
[31m-#else /* select */[m
[31m-[m
[31m-#define NGX_READ_EVENT     0[m
[31m-#define NGX_WRITE_EVENT    1[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_ONESHOT_EVENT  1[m
[31m-[m
[31m-#endif /* NGX_HAVE_KQUEUE */[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-#define NGX_IOCP_ACCEPT      0[m
[31m-#define NGX_IOCP_IO          1[m
[31m-#define NGX_IOCP_CONNECT     2[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_CLEAR_EVENT[m
[31m-#define NGX_CLEAR_EVENT    0    /* dummy declaration */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_process_events   ngx_event_actions.process_events[m
[31m-#define ngx_done_events      ngx_event_actions.done[m
[31m-[m
[31m-#define ngx_add_event        ngx_event_actions.add[m
[31m-#define ngx_del_event        ngx_event_actions.del[m
[31m-#define ngx_add_conn         ngx_event_actions.add_conn[m
[31m-#define ngx_del_conn         ngx_event_actions.del_conn[m
[31m-[m
[31m-#define ngx_notify           ngx_event_actions.notify[m
[31m-[m
[31m-#define ngx_add_timer        ngx_event_add_timer[m
[31m-#define ngx_del_timer        ngx_event_del_timer[m
[31m-[m
[31m-[m
[31m-extern ngx_os_io_t  ngx_io;[m
[31m-[m
[31m-#define ngx_recv             ngx_io.recv[m
[31m-#define ngx_recv_chain       ngx_io.recv_chain[m
[31m-#define ngx_udp_recv         ngx_io.udp_recv[m
[31m-#define ngx_send             ngx_io.send[m
[31m-#define ngx_send_chain       ngx_io.send_chain[m
[31m-#define ngx_udp_send         ngx_io.udp_send[m
[31m-[m
[31m-[m
[31m-#define NGX_EVENT_MODULE      0x544E5645  /* "EVNT" */[m
[31m-#define NGX_EVENT_CONF        0x02000000[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t    connections;[m
[31m-    ngx_uint_t    use;[m
[31m-[m
[31m-    ngx_flag_t    multi_accept;[m
[31m-    ngx_flag_t    accept_mutex;[m
[31m-[m
[31m-    ngx_msec_t    accept_mutex_delay;[m
[31m-[m
[31m-    u_char       *name;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_array_t   debug_connection;[m
[31m-#endif[m
[31m-} ngx_event_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t              *name;[m
[31m-[m
[31m-    void                 *(*create_conf)(ngx_cycle_t *cycle);[m
[31m-    char                 *(*init_conf)(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-    ngx_event_actions_t     actions;[m
[31m-} ngx_event_module_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_atomic_t          *ngx_connection_counter;[m
[31m-[m
[31m-extern ngx_atomic_t          *ngx_accept_mutex_ptr;[m
[31m-extern ngx_shmtx_t            ngx_accept_mutex;[m
[31m-extern ngx_uint_t             ngx_use_accept_mutex;[m
[31m-extern ngx_uint_t             ngx_accept_events;[m
[31m-extern ngx_uint_t             ngx_accept_mutex_held;[m
[31m-extern ngx_msec_t             ngx_accept_mutex_delay;[m
[31m-extern ngx_int_t              ngx_accept_disabled;[m
[31m-[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-extern ngx_atomic_t  *ngx_stat_accepted;[m
[31m-extern ngx_atomic_t  *ngx_stat_handled;[m
[31m-extern ngx_atomic_t  *ngx_stat_requests;[m
[31m-extern ngx_atomic_t  *ngx_stat_active;[m
[31m-extern ngx_atomic_t  *ngx_stat_reading;[m
[31m-extern ngx_atomic_t  *ngx_stat_writing;[m
[31m-extern ngx_atomic_t  *ngx_stat_waiting;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_UPDATE_TIME         1[m
[31m-#define NGX_POST_EVENTS         2[m
[31m-[m
[31m-[m
[31m-extern sig_atomic_t           ngx_event_timer_alarm;[m
[31m-extern ngx_uint_t             ngx_event_flags;[m
[31m-extern ngx_module_t           ngx_events_module;[m
[31m-extern ngx_module_t           ngx_event_core_module;[m
[31m-[m
[31m-[m
[31m-#define ngx_event_get_conf(conf_ctx, module)                                  \[m
[31m-             (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];[m
[31m-[m
[31m-[m
[31m-[m
[31m-void ngx_event_accept(ngx_event_t *ev);[m
[31m-#if !(NGX_WIN32)[m
[31m-void ngx_event_recvmsg(ngx_event_t *ev);[m
[31m-#endif[m
[31m-ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle);[m
[31m-u_char *ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-void ngx_process_events_and_timers(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags);[m
[31m-ngx_int_t ngx_handle_write_event(ngx_event_t *wev, size_t lowat);[m
[31m-[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-void ngx_event_acceptex(ngx_event_t *ev);[m
[31m-ngx_int_t ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n);[m
[31m-u_char *ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat);[m
[31m-[m
[31m-[m
[31m-/* used in ngx_log_debugX() */[m
[31m-#define ngx_event_ident(p)  ((ngx_connection_t *) (p))->fd[m
[31m-[m
[31m-[m
[31m-#include <ngx_event_timer.h>[m
[31m-#include <ngx_event_posted.h>[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-#include <ngx_iocp_module.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_accept.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_accept.c[m
[1mdeleted file mode 100644[m
[1mindex 1c87a34..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_accept.c[m
[1m+++ /dev/null[m
[36m@@ -1,834 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all);[m
[31m-static void ngx_close_accepted_connection(ngx_connection_t *c);[m
[31m-#if (NGX_DEBUG)[m
[31m-static void ngx_debug_accepted_connection(ngx_event_conf_t *ecf,[m
[31m-    ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_accept(ngx_event_t *ev)[m
[31m-{[m
[31m-    socklen_t          socklen;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_log_t         *log;[m
[31m-    ngx_uint_t         level;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c, *lc;[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-    u_char             sa[NGX_SOCKADDRLEN];[m
[31m-#if (NGX_HAVE_ACCEPT4)[m
[31m-    static ngx_uint_t  use_accept4 = 1;[m
[31m-#endif[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->timedout = 0;[m
[31m-    }[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {[m
[31m-        ev->available = ecf->multi_accept;[m
[31m-    }[m
[31m-[m
[31m-    lc = ev->data;[m
[31m-    ls = lc->listening;[m
[31m-    ev->ready = 0;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "accept on %V, ready: %d", &ls->addr_text, ev->available);[m
[31m-[m
[31m-    do {[m
[31m-        socklen = NGX_SOCKADDRLEN;[m
[31m-[m
[31m-#if (NGX_HAVE_ACCEPT4)[m
[31m-        if (use_accept4) {[m
[31m-            s = accept4(lc->fd, (struct sockaddr *) sa, &socklen,[m
[31m-                        SOCK_NONBLOCK);[m
[31m-        } else {[m
[31m-            s = accept(lc->fd, (struct sockaddr *) sa, &socklen);[m
[31m-        }[m
[31m-#else[m
[31m-        s = accept(lc->fd, (struct sockaddr *) sa, &socklen);[m
[31m-#endif[m
[31m-[m
[31m-        if (s == (ngx_socket_t) -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err == NGX_EAGAIN) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err,[m
[31m-                               "accept() not ready");[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-[m
[31m-            if (err == NGX_ECONNABORTED) {[m
[31m-                level = NGX_LOG_ERR;[m
[31m-[m
[31m-            } else if (err == NGX_EMFILE || err == NGX_ENFILE) {[m
[31m-                level = NGX_LOG_CRIT;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_ACCEPT4)[m
[31m-            ngx_log_error(level, ev->log, err,[m
[31m-                          use_accept4 ? "accept4() failed" : "accept() failed");[m
[31m-[m
[31m-            if (use_accept4 && err == NGX_ENOSYS) {[m
[31m-                use_accept4 = 0;[m
[31m-                ngx_inherited_nonblocking = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-#else[m
[31m-            ngx_log_error(level, ev->log, err, "accept() failed");[m
[31m-#endif[m
[31m-[m
[31m-            if (err == NGX_ECONNABORTED) {[m
[31m-                if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                    ev->available--;[m
[31m-                }[m
[31m-[m
[31m-                if (ev->available) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (err == NGX_EMFILE || err == NGX_ENFILE) {[m
[31m-                if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle, 1)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_use_accept_mutex) {[m
[31m-                    if (ngx_accept_mutex_held) {[m
[31m-                        ngx_shmtx_unlock(&ngx_accept_mutex);[m
[31m-                        ngx_accept_mutex_held = 0;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_accept_disabled = 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_add_timer(ev, ecf->accept_mutex_delay);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1);[m
[31m-#endif[m
[31m-[m
[31m-        ngx_accept_disabled = ngx_cycle->connection_n / 8[m
[31m-                              - ngx_cycle->free_connection_n;[m
[31m-[m
[31m-        c = ngx_get_connection(s, ev->log);[m
[31m-[m
[31m-        if (c == NULL) {[m
[31m-            if (ngx_close_socket(s) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,[m
[31m-                              ngx_close_socket_n " failed");[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->type = SOCK_STREAM;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_active, 1);[m
[31m-#endif[m
[31m-[m
[31m-        c->pool = ngx_create_pool(ls->pool_size, ev->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->sockaddr = ngx_palloc(c->pool, socklen);[m
[31m-        if (c->sockaddr == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(c->sockaddr, sa, socklen);[m
[31m-[m
[31m-        log = ngx_palloc(c->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* set a blocking mode for iocp and non-blocking mode for others */[m
[31m-[m
[31m-        if (ngx_inherited_nonblocking) {[m
[31m-            if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-                if (ngx_blocking(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,[m
[31m-                                  ngx_blocking_n " failed");[m
[31m-                    ngx_close_accepted_connection(c);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {[m
[31m-                if (ngx_nonblocking(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,[m
[31m-                                  ngx_nonblocking_n " failed");[m
[31m-                    ngx_close_accepted_connection(c);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *log = ls->log;[m
[31m-[m
[31m-        c->recv = ngx_recv;[m
[31m-        c->send = ngx_send;[m
[31m-        c->recv_chain = ngx_recv_chain;[m
[31m-        c->send_chain = ngx_send_chain;[m
[31m-[m
[31m-        c->log = log;[m
[31m-        c->pool->log = log;[m
[31m-[m
[31m-        c->socklen = socklen;[m
[31m-        c->listening = ls;[m
[31m-        c->local_sockaddr = ls->sockaddr;[m
[31m-        c->local_socklen = ls->socklen;[m
[31m-[m
[31m-        c->unexpected_eof = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        if (c->sockaddr->sa_family == AF_UNIX) {[m
[31m-            c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */[m
[31m-            c->sendfile = 0;[m
[31m-#endif[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            rev->ready = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ev->deferred_accept) {[m
[31m-            rev->ready = 1;[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-            rev->available = 1;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        rev->log = log;[m
[31m-        wev->log = log;[m
[31m-[m
[31m-        /*[m
[31m-         * TODO: MT: - ngx_atomic_fetch_add()[m
[31m-         *             or protection by critical section or light mutex[m
[31m-         *[m
[31m-         * TODO: MP: - allocated in a shared memory[m
[31m-         *           - ngx_atomic_fetch_add()[m
[31m-         *             or protection by critical section or light mutex[m
[31m-         */[m
[31m-[m
[31m-        c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_handled, 1);[m
[31m-#endif[m
[31m-[m
[31m-        if (ls->addr_ntop) {[m
[31m-            c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);[m
[31m-            if (c->addr_text.data == NULL) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,[m
[31m-                                             c->addr_text.data,[m
[31m-                                             ls->addr_text_max_len, 0);[m
[31m-            if (c->addr_text.len == 0) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        ngx_str_t  addr;[m
[31m-        u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-        ngx_debug_accepted_connection(ecf, c);[m
[31m-[m
[31m-        if (log->log_level & NGX_LOG_DEBUG_EVENT) {[m
[31m-            addr.data = text;[m
[31m-            addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text,[m
[31m-                                     NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                           "*%uA accept: %V fd:%d", c->number, &addr, s);[m
[31m-        }[m
[31m-[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {[m
[31m-            if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        log->data = NULL;[m
[31m-        log->handler = NULL;[m
[31m-[m
[31m-        ls->handler(c);[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-            ev->available--;[m
[31m-        }[m
[31m-[m
[31m-    } while (ev->available);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-void[m
[31m-ngx_event_recvmsg(ngx_event_t *ev)[m
[31m-{[m
[31m-    ssize_t            n;[m
[31m-    ngx_log_t         *log;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    struct iovec       iov[1];[m
[31m-    struct msghdr      msg;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-    ngx_connection_t  *c, *lc;[m
[31m-    u_char             sa[NGX_SOCKADDRLEN];[m
[31m-    static u_char      buffer[65535];[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-#if (NGX_HAVE_IP_RECVDSTADDR)[m
[31m-    u_char             msg_control[CMSG_SPACE(sizeof(struct in_addr))];[m
[31m-#elif (NGX_HAVE_IP_PKTINFO)[m
[31m-    u_char             msg_control[CMSG_SPACE(sizeof(struct in_pktinfo))];[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)[m
[31m-    u_char             msg_control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->timedout = 0;[m
[31m-    }[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {[m
[31m-        ev->available = ecf->multi_accept;[m
[31m-    }[m
[31m-[m
[31m-    lc = ev->data;[m
[31m-    ls = lc->listening;[m
[31m-    ev->ready = 0;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "recvmsg on %V, ready: %d", &ls->addr_text, ev->available);[m
[31m-[m
[31m-    do {[m
[31m-        ngx_memzero(&msg, sizeof(struct msghdr));[m
[31m-[m
[31m-        iov[0].iov_base = (void *) buffer;[m
[31m-        iov[0].iov_len = sizeof(buffer);[m
[31m-[m
[31m-        msg.msg_name = &sa;[m
[31m-        msg.msg_namelen = sizeof(sa);[m
[31m-        msg.msg_iov = iov;[m
[31m-        msg.msg_iovlen = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-        if (ls->wildcard) {[m
[31m-[m
[31m-#if (NGX_HAVE_IP_RECVDSTADDR || NGX_HAVE_IP_PKTINFO)[m
[31m-            if (ls->sockaddr->sa_family == AF_INET) {[m
[31m-                msg.msg_control = &msg_control;[m
[31m-                msg.msg_controllen = sizeof(msg_control);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)[m
[31m-            if (ls->sockaddr->sa_family == AF_INET6) {[m
[31m-                msg.msg_control = &msg_control6;[m
[31m-                msg.msg_controllen = sizeof(msg_control6);[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        n = recvmsg(lc->fd, &msg, 0);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err == NGX_EAGAIN) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err,[m
[31m-                               "recvmsg() not ready");[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, err, "recvmsg() failed");[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-        if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                          "recvmsg() truncated data");[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_accept_disabled = ngx_cycle->connection_n / 8[m
[31m-                              - ngx_cycle->free_connection_n;[m
[31m-[m
[31m-        c = ngx_get_connection(lc->fd, ev->log);[m
[31m-        if (c == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->shared = 1;[m
[31m-        c->type = SOCK_DGRAM;[m
[31m-        c->socklen = msg.msg_namelen;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_active, 1);[m
[31m-#endif[m
[31m-[m
[31m-        c->pool = ngx_create_pool(ls->pool_size, ev->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->sockaddr = ngx_palloc(c->pool, c->socklen);[m
[31m-        if (c->sockaddr == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(c->sockaddr, msg.msg_name, c->socklen);[m
[31m-[m
[31m-        log = ngx_palloc(c->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        *log = ls->log;[m
[31m-[m
[31m-        c->send = ngx_udp_send;[m
[31m-[m
[31m-        c->log = log;[m
[31m-        c->pool->log = log;[m
[31m-[m
[31m-        c->listening = ls;[m
[31m-        c->local_sockaddr = ls->sockaddr;[m
[31m-        c->local_socklen = ls->socklen;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-        if (ls->wildcard) {[m
[31m-            struct cmsghdr   *cmsg;[m
[31m-            struct sockaddr  *sockaddr;[m
[31m-[m
[31m-            sockaddr = ngx_palloc(c->pool, c->local_socklen);[m
[31m-            if (sockaddr == NULL) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(sockaddr, c->local_sockaddr, c->local_socklen);[m
[31m-            c->local_sockaddr = sockaddr;[m
[31m-[m
[31m-            for (cmsg = CMSG_FIRSTHDR(&msg);[m
[31m-                 cmsg != NULL;[m
[31m-                 cmsg = CMSG_NXTHDR(&msg, cmsg))[m
[31m-            {[m
[31m-[m
[31m-#if (NGX_HAVE_IP_RECVDSTADDR)[m
[31m-[m
[31m-                if (cmsg->cmsg_level == IPPROTO_IP[m
[31m-                    && cmsg->cmsg_type == IP_RECVDSTADDR[m
[31m-                    && sockaddr->sa_family == AF_INET)[m
[31m-                {[m
[31m-                    struct in_addr      *addr;[m
[31m-                    struct sockaddr_in  *sin;[m
[31m-[m
[31m-                    addr = (struct in_addr *) CMSG_DATA(cmsg);[m
[31m-                    sin = (struct sockaddr_in *) sockaddr;[m
[31m-                    sin->sin_addr = *addr;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-#elif (NGX_HAVE_IP_PKTINFO)[m
[31m-[m
[31m-                if (cmsg->cmsg_level == IPPROTO_IP[m
[31m-                    && cmsg->cmsg_type == IP_PKTINFO[m
[31m-                    && sockaddr->sa_family == AF_INET)[m
[31m-                {[m
[31m-                    struct in_pktinfo   *pkt;[m
[31m-                    struct sockaddr_in  *sin;[m
[31m-[m
[31m-                    pkt = (struct in_pktinfo *) CMSG_DATA(cmsg);[m
[31m-                    sin = (struct sockaddr_in *) sockaddr;[m
[31m-                    sin->sin_addr = pkt->ipi_addr;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)[m
[31m-[m
[31m-                if (cmsg->cmsg_level == IPPROTO_IPV6[m
[31m-                    && cmsg->cmsg_type == IPV6_PKTINFO[m
[31m-                    && sockaddr->sa_family == AF_INET6)[m
[31m-                {[m
[31m-                    struct in6_pktinfo   *pkt6;[m
[31m-                    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-                    pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg);[m
[31m-                    sin6 = (struct sockaddr_in6 *) sockaddr;[m
[31m-                    sin6->sin6_addr = pkt6->ipi6_addr;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        c->buffer = ngx_create_temp_buf(c->pool, n);[m
[31m-        if (c->buffer == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->buffer->last = ngx_cpymem(c->buffer->last, buffer, n);[m
[31m-[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        rev->log = log;[m
[31m-        wev->log = log;[m
[31m-[m
[31m-        /*[m
[31m-         * TODO: MT: - ngx_atomic_fetch_add()[m
[31m-         *             or protection by critical section or light mutex[m
[31m-         *[m
[31m-         * TODO: MP: - allocated in a shared memory[m
[31m-         *           - ngx_atomic_fetch_add()[m
[31m-         *             or protection by critical section or light mutex[m
[31m-         */[m
[31m-[m
[31m-        c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_handled, 1);[m
[31m-#endif[m
[31m-[m
[31m-        if (ls->addr_ntop) {[m
[31m-            c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);[m
[31m-            if (c->addr_text.data == NULL) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,[m
[31m-                                             c->addr_text.data,[m
[31m-                                             ls->addr_text_max_len, 0);[m
[31m-            if (c->addr_text.len == 0) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        ngx_str_t  addr;[m
[31m-        u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-        ngx_debug_accepted_connection(ecf, c);[m
[31m-[m
[31m-        if (log->log_level & NGX_LOG_DEBUG_EVENT) {[m
[31m-            addr.data = text;[m
[31m-            addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text,[m
[31m-                                     NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                           "*%uA recvmsg: %V fd:%d n:%z",[m
[31m-                           c->number, &addr, c->fd, n);[m
[31m-        }[m
[31m-[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        log->data = NULL;[m
[31m-        log->handler = NULL;[m
[31m-[m
[31m-        ls->handler(c);[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-            ev->available -= n;[m
[31m-        }[m
[31m-[m
[31m-    } while (ev->available);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_trylock_accept_mutex(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (ngx_shmtx_trylock(&ngx_accept_mutex)) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "accept mutex locked");[m
[31m-[m
[31m-        if (ngx_accept_mutex_held && ngx_accept_events == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_enable_accept_events(cycle) == NGX_ERROR) {[m
[31m-            ngx_shmtx_unlock(&ngx_accept_mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_accept_events = 0;[m
[31m-        ngx_accept_mutex_held = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "accept mutex lock failed: %ui", ngx_accept_mutex_held);[m
[31m-[m
[31m-    if (ngx_accept_mutex_held) {[m
[31m-        if (ngx_disable_accept_events(cycle, 0) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_accept_mutex_held = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_enable_accept_events(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        c = ls[i].connection;[m
[31m-[m
[31m-        if (c == NULL || c->read->active) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        c = ls[i].connection;[m
[31m-[m
[31m-        if (c == NULL || !c->read->active) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-        /*[m
[31m-         * do not disable accept on worker's own sockets[m
[31m-         * when disabling accept events due to accept mutex[m
[31m-         */[m
[31m-[m
[31m-        if (ls[i].reuseport && !all) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_del_event(c->read, NGX_READ_EVENT, NGX_DISABLE_EVENT)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_close_accepted_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_socket_t  fd;[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    fd = c->fd;[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (!c->shared && ngx_close_socket(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-[m
[31m-    if (c->pool) {[m
[31m-        ngx_destroy_pool(c->pool);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    return ngx_snprintf(buf, len, " while accepting new connection on %V",[m
[31m-                        log->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-static void[m
[31m-ngx_debug_accepted_connection(ngx_event_conf_t *ecf, ngx_connection_t *c)[m
[31m-{[m
[31m-    struct sockaddr_in   *sin;[m
[31m-    ngx_cidr_t           *cidr;[m
[31m-    ngx_uint_t            i;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-    ngx_uint_t            n;[m
[31m-#endif[m
[31m-[m
[31m-    cidr = ecf->debug_connection.elts;[m
[31m-    for (i = 0; i < ecf->debug_connection.nelts; i++) {[m
[31m-        if (cidr[i].family != (ngx_uint_t) c->sockaddr->sa_family) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        switch (cidr[i].family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->sockaddr;[m
[31m-            for (n = 0; n < 16; n++) {[m
[31m-                if ((sin6->sin6_addr.s6_addr[n][m
[31m-                    & cidr[i].u.in6.mask.s6_addr[n])[m
[31m-                    != cidr[i].u.in6.addr.s6_addr[n])[m
[31m-                {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->sockaddr;[m
[31m-            if ((sin->sin_addr.s_addr & cidr[i].u.in.mask)[m
[31m-                != cidr[i].u.in.addr)[m
[31m-            {[m
[31m-                goto next;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        c->log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;[m
[31m-        break;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_acceptex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_acceptex.c[m
[1mdeleted file mode 100644[m
[1mindex 1dbfd6c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_acceptex.c[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_close_posted_connection(ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_acceptex(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    ls = c->listening;[m
[31m-[m
[31m-    c->log->handler = ngx_accept_log_error;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "AcceptEx: %d", c->fd);[m
[31m-[m
[31m-    if (rev->ovlp.error) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error,[m
[31m-                      "AcceptEx() %V failed", &ls->addr_text);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */[m
[31m-[m
[31m-    if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,[m
[31m-                   (char *) &ls->fd, sizeof(ngx_socket_t))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,[m
[31m-                      "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %V",[m
[31m-                      &c->addr_text);[m
[31m-    } else {[m
[31m-        c->accept_context_updated = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_getacceptexsockaddrs(c->buffer->pos,[m
[31m-                             ls->post_accept_buffer_size,[m
[31m-                             ls->socklen + 16,[m
[31m-                             ls->socklen + 16,[m
[31m-                             &c->local_sockaddr, &c->local_socklen,[m
[31m-                             &c->sockaddr, &c->socklen);[m
[31m-[m
[31m-    if (ls->post_accept_buffer_size) {[m
[31m-        c->buffer->last += rev->available;[m
[31m-        c->buffer->end = c->buffer->start + ls->post_accept_buffer_size;[m
[31m-[m
[31m-    } else {[m
[31m-        c->buffer = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ls->addr_ntop) {[m
[31m-        c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);[m
[31m-        if (c->addr_text.data == NULL) {[m
[31m-            /* TODO: close socket */[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,[m
[31m-                                         c->addr_text.data,[m
[31m-                                         ls->addr_text_max_len, 0);[m
[31m-        if (c->addr_text.len == 0) {[m
[31m-            /* TODO: close socket */[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_post_acceptex(ls, 1);[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    ls->handler(c);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n)[m
[31m-{[m
[31m-    u_long             rcvd;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_log_t         *log;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        /* TODO: look up reused sockets */[m
[31m-[m
[31m-        s = ngx_socket(ls->sockaddr->sa_family, ls->type, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &ls->log, 0,[m
[31m-                       ngx_socket_n " s:%d", s);[m
[31m-[m
[31m-        if (s == (ngx_socket_t) -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &ls->log, ngx_socket_errno,[m
[31m-                          ngx_socket_n " failed");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c = ngx_get_connection(s, &ls->log);[m
[31m-[m
[31m-        if (c == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->pool = ngx_create_pool(ls->pool_size, &ls->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log = ngx_palloc(c->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->buffer = ngx_create_temp_buf(c->pool, ls->post_accept_buffer_size[m
[31m-                                                 + 2 * (ls->socklen + 16));[m
[31m-        if (c->buffer == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->local_sockaddr = ngx_palloc(c->pool, ls->socklen);[m
[31m-        if (c->local_sockaddr == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->sockaddr = ngx_palloc(c->pool, ls->socklen);[m
[31m-        if (c->sockaddr == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *log = ls->log;[m
[31m-        c->log = log;[m
[31m-[m
[31m-        c->recv = ngx_recv;[m
[31m-        c->send = ngx_send;[m
[31m-        c->recv_chain = ngx_recv_chain;[m
[31m-        c->send_chain = ngx_send_chain;[m
[31m-[m
[31m-        c->unexpected_eof = 1;[m
[31m-[m
[31m-        c->listening = ls;[m
[31m-[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        rev->ovlp.event = rev;[m
[31m-        wev->ovlp.event = wev;[m
[31m-        rev->handler = ngx_event_acceptex;[m
[31m-[m
[31m-        rev->ready = 1;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        rev->log = c->log;[m
[31m-        wev->log = c->log;[m
[31m-[m
[31m-        if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_acceptex(ls->fd, s, c->buffer->pos, ls->post_accept_buffer_size,[m
[31m-                         ls->socklen + 16, ls->socklen + 16,[m
[31m-                         &rcvd, (LPOVERLAPPED) &rev->ovlp)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-            if (err != WSA_IO_PENDING) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, &ls->log, err,[m
[31m-                              "AcceptEx() %V failed", &ls->addr_text);[m
[31m-[m
[31m-                ngx_close_posted_connection(c);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_close_posted_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_socket_t  fd;[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    fd = c->fd;[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (ngx_close_socket(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-[m
[31m-    if (c->pool) {[m
[31m-        ngx_destroy_pool(c->pool);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    return ngx_snprintf(buf, len, " while posting AcceptEx() on %V", log->data);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connect.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connect.c[m
[1mdeleted file mode 100644[m
[1mindex 8aca862..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connect.c[m
[1m+++ /dev/null[m
[36m@@ -1,256 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_connect_peer(ngx_peer_connection_t *pc)[m
[31m-{[m
[31m-    int                rc, type;[m
[31m-    ngx_int_t          event;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_uint_t         level;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    rc = pc->get(pc, pc->data);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    type = (pc->type ? pc->type : SOCK_STREAM);[m
[31m-[m
[31m-    s = ngx_socket(pc->sockaddr->sa_family, type, 0);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, "%s socket %d",[m
[31m-                   (type == SOCK_STREAM) ? "stream" : "dgram", s);[m
[31m-[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    c = ngx_get_connection(s, pc->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n "failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->type = type;[m
[31m-[m
[31m-    if (pc->rcvbuf) {[m
[31m-        if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,[m
[31m-                       (const void *) &pc->rcvbuf, sizeof(int)) == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                          "setsockopt(SO_RCVBUF) failed");[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (pc->local) {[m
[31m-        if (bind(s, pc->local->sockaddr, pc->local->socklen) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, pc->log, ngx_socket_errno,[m
[31m-                          "bind(%V) failed", &pc->local->name);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (type == SOCK_STREAM) {[m
[31m-        c->recv = ngx_recv;[m
[31m-        c->send = ngx_send;[m
[31m-        c->recv_chain = ngx_recv_chain;[m
[31m-        c->send_chain = ngx_send_chain;[m
[31m-[m
[31m-        c->sendfile = 1;[m
[31m-[m
[31m-        if (pc->sockaddr->sa_family == AF_UNIX) {[m
[31m-            c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */[m
[31m-            c->sendfile = 0;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-    } else { /* type == SOCK_DGRAM */[m
[31m-        c->recv = ngx_udp_recv;[m
[31m-        c->send = ngx_send;[m
[31m-    }[m
[31m-[m
[31m-    c->log_error = pc->log_error;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = pc->log;[m
[31m-    wev->log = pc->log;[m
[31m-[m
[31m-    pc->connection = c;[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0,[m
[31m-                   "connect to %V, fd:%d #%uA", pc->name, s, c->number);[m
[31m-[m
[31m-    rc = connect(s, pc->sockaddr, pc->socklen);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-[m
[31m-        if (err != NGX_EINPROGRESS[m
[31m-#if (NGX_WIN32)[m
[31m-            /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */[m
[31m-            && err != NGX_EAGAIN[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            if (err == NGX_ECONNREFUSED[m
[31m-#if (NGX_LINUX)[m
[31m-                /*[m
[31m-                 * Linux returns EAGAIN instead of ECONNREFUSED[m
[31m-                 * for unix sockets if listen queue is full[m
[31m-                 */[m
[31m-                || err == NGX_EAGAIN[m
[31m-#endif[m
[31m-                || err == NGX_ECONNRESET[m
[31m-                || err == NGX_ENETDOWN[m
[31m-                || err == NGX_ENETUNREACH[m
[31m-                || err == NGX_EHOSTDOWN[m
[31m-                || err == NGX_EHOSTUNREACH)[m
[31m-            {[m
[31m-                level = NGX_LOG_ERR;[m
[31m-[m
[31m-            } else {[m
[31m-                level = NGX_LOG_CRIT;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(level, c->log, err, "connect() to %V failed",[m
[31m-                          pc->name);[m
[31m-[m
[31m-            ngx_close_connection(c);[m
[31m-            pc->connection = NULL;[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        if (rc == -1) {[m
[31m-[m
[31m-            /* NGX_EINPROGRESS */[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, ngx_socket_errno,[m
[31m-                       "connect(): %d", rc);[m
[31m-[m
[31m-        if (ngx_blocking(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                          ngx_blocking_n " failed");[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * FreeBSD's aio allows to post an operation on non-connected socket.[m
[31m-         * NT does not support it.[m
[31m-         *[m
[31m-         * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT[m
[31m-         */[m
[31m-[m
[31m-        rev->ready = 1;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue */[m
[31m-[m
[31m-        event = NGX_CLEAR_EVENT;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        event = NGX_LEVEL_EVENT;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-[m
[31m-        /* NGX_EINPROGRESS */[m
[31m-[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");[m
[31m-[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connect.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connect.h[m
[1mdeleted file mode 100644[m
[1mindex 1bacf82..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connect.h[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_CONNECT_H_INCLUDED_[m
[31m-#define _NGX_EVENT_CONNECT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_PEER_KEEPALIVE           1[m
[31m-#define NGX_PEER_NEXT                2[m
[31m-#define NGX_PEER_FAILED              4[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_peer_connection_s  ngx_peer_connection_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_event_get_peer_pt)(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-typedef void (*ngx_event_free_peer_pt)(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state);[m
[31m-#if (NGX_SSL)[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_event_set_peer_session_pt)(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-typedef void (*ngx_event_save_peer_session_pt)(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-struct ngx_peer_connection_s {[m
[31m-    ngx_connection_t                *connection;[m
[31m-[m
[31m-    struct sockaddr                 *sockaddr;[m
[31m-    socklen_t                        socklen;[m
[31m-    ngx_str_t                       *name;[m
[31m-[m
[31m-    ngx_uint_t                       tries;[m
[31m-    ngx_msec_t                       start_time;[m
[31m-[m
[31m-    ngx_event_get_peer_pt            get;[m
[31m-    ngx_event_free_peer_pt           free;[m
[31m-    void                            *data;[m
[31m-[m
[31m-#if (NGX_SSL)[m
[31m-    ngx_event_set_peer_session_pt    set_session;[m
[31m-    ngx_event_save_peer_session_pt   save_session;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_addr_t                      *local;[m
[31m-[m
[31m-    int                              type;[m
[31m-    int                              rcvbuf;[m
[31m-[m
[31m-    ngx_log_t                       *log;[m
[31m-[m
[31m-    unsigned                         cached:1;[m
[31m-[m
[31m-                                     /* ngx_connection_log_error_e */[m
[31m-    unsigned                         log_error:2;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_event_connect_peer(ngx_peer_connection_t *pc);[m
[31m-ngx_int_t ngx_event_get_peer(ngx_peer_connection_t *pc, void *data);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_CONNECT_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connectex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connectex.c[m
[1mdeleted file mode 100644[m
[1mindex 59ada74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_connectex.c[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_PENDING_CONN  10[m
[31m-[m
[31m-[m
[31m-static CRITICAL_SECTION  connect_lock;[m
[31m-static int               nconnects;[m
[31m-static ngx_connection_t  pending_connects[NGX_MAX_PENDING_CONN];[m
[31m-[m
[31m-static HANDLE            pending_connect_event;[m
[31m-[m
[31m-__declspec(thread) int                nevents = 0;[m
[31m-__declspec(thread) WSAEVENT           events[WSA_MAXIMUM_WAIT_EVENTS + 1];[m
[31m-__declspec(thread) ngx_connection_t  *conn[WSA_MAXIMUM_WAIT_EVENTS + 1];[m
[31m-[m
[31m-[m
[31m-[m
[31m-int ngx_iocp_wait_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    for ( ;; ) {[m
[31m-        EnterCriticalSection(&connect_lock);[m
[31m-[m
[31m-        if (nconnects < NGX_MAX_PENDING_CONN) {[m
[31m-            pending_connects[--nconnects] = c;[m
[31m-            LeaveCriticalSection(&connect_lock);[m
[31m-[m
[31m-            if (SetEvent(pending_connect_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                              "SetEvent() failed");[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        LeaveCriticalSection(&connect_lock);[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, c->log, 0,[m
[31m-                      "max number of pending connect()s is %d",[m
[31m-                      NGX_MAX_PENDING_CONN);[m
[31m-        msleep(100);[m
[31m-    }[m
[31m-[m
[31m-    if (!started) {[m
[31m-        if (ngx_iocp_new_thread(1) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        started = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int ngx_iocp_new_thread(int main)[m
[31m-{[m
[31m-    u_int  id;[m
[31m-[m
[31m-    if (main) {[m
[31m-        pending_connect_event = CreateEvent(NULL, 0, 1, NULL);[m
[31m-        if (pending_connect_event == INVALID_HANDLE_VALUE) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                          "CreateThread() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (CreateThread(NULL, 0, ngx_iocp_wait_events, main, 0, &id)[m
[31m-                                                       == INVALID_HANDLE_VALUE)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "CreateThread() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SetEvent(event) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "SetEvent() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int ngx_iocp_new_connect()[m
[31m-{[m
[31m-    EnterCriticalSection(&connect_lock);[m
[31m-    c = pending_connects[--nconnects];[m
[31m-    LeaveCriticalSection(&connect_lock);[m
[31m-[m
[31m-    conn[nevents] = c;[m
[31m-[m
[31m-    events[nevents] = WSACreateEvent();[m
[31m-    if (events[nevents] == INVALID_HANDLE_VALUE) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,[m
[31m-                      "WSACreateEvent() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (WSAEventSelect(c->fd, events[nevents], FD_CONNECT) == -1)[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,[m
[31m-                      "WSAEventSelect() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    nevents++;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_iocp_wait_events(int main)[m
[31m-{[m
[31m-    WSANETWORKEVENTS  ne;[m
[31m-[m
[31m-    nevents = 1;[m
[31m-    events[0] = pending_connect_event;[m
[31m-    conn[0] = NULL;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        offset = (nevents == WSA_MAXIMUM_WAIT_EVENTS + 1) ? 1: 0;[m
[31m-        timeout = (nevents == 1 && !first) ? 60000: INFINITE;[m
[31m-[m
[31m-        n = WSAWaitForMultipleEvents(nevents - offset, events[offset],[m
[31m-                                     0, timeout, 0);[m
[31m-        if (n == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                          "WSAWaitForMultipleEvents() failed");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == WAIT_TIMEOUT) {[m
[31m-            if (nevents == 2 && !main) {[m
[31m-                ExitThread(0);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "WSAWaitForMultipleEvents() "[m
[31m-                          "returned unexpected WAIT_TIMEOUT");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        n -= WSA_WAIT_EVENT_0;[m
[31m-[m
[31m-        if (events[n] == NULL) {[m
[31m-[m
[31m-            /* the pending_connect_event */[m
[31m-[m
[31m-            if (nevents == WSA_MAXIMUM_WAIT_EVENTS) {[m
[31m-                ngx_iocp_new_thread(0);[m
[31m-            } else {[m
[31m-                ngx_iocp_new_connect();[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (WSAEnumNetworkEvents(c[n].fd, events[n], &ne) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                          "WSAEnumNetworkEvents() failed");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ne.lNetworkEvents & FD_CONNECT) {[m
[31m-            conn[n].write->ovlp.error = ne.iErrorCode[FD_CONNECT_BIT];[m
[31m-[m
[31m-            if (PostQueuedCompletionStatus(iocp, 0, NGX_IOCP_CONNECT,[m
[31m-                                           &conn[n].write->ovlp) == 0)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                              "PostQueuedCompletionStatus() failed");[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n < nevents) {[m
[31m-                conn[n] = conn[nevents];[m
[31m-                events[n] = events[nevents];[m
[31m-            }[m
[31m-[m
[31m-            nevents--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ne.lNetworkEvents & FD_ACCEPT) {[m
[31m-[m
[31m-            /* CHECK ERROR ??? */[m
[31m-[m
[31m-            ngx_event_post_acceptex(conn[n].listening, 1);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c[n].log, 0,[m
[31m-                      "WSAWaitForMultipleEvents() "[m
[31m-                      "returned unexpected network event %ul",[m
[31m-                      ne.lNetworkEvents);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.c[m
[1mdeleted file mode 100644[m
[1mindex a570383..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.c[m
[1m+++ /dev/null[m
[36m@@ -1,3587 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_PASSWORD_BUFFER_SIZE  4096[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  engine;   /* unsigned  engine:1; */[m
[31m-} ngx_openssl_conf_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_ssl_password_callback(char *buf, int size, int rwflag,[m
[31m-    void *userdata);[m
[31m-static int ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store);[m
[31m-static void ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where,[m
[31m-    int ret);[m
[31m-static void ngx_ssl_passwords_cleanup(void *data);[m
[31m-static void ngx_ssl_handshake_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n);[m
[31m-static void ngx_ssl_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_ssl_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_ssl_shutdown_handler(ngx_event_t *ev);[m
[31m-static void ngx_ssl_connection_error(ngx_connection_t *c, int sslerr,[m
[31m-    ngx_err_t err, char *text);[m
[31m-static void ngx_ssl_clear_error(ngx_log_t *log);[m
[31m-[m
[31m-static ngx_int_t ngx_ssl_session_id_context(ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *sess_ctx);[m
[31m-ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data);[m
[31m-static int ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-    ngx_ssl_session_t *sess);[m
[31m-static ngx_ssl_session_t *ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char *id, int len, int *copy);[m
[31m-static void ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess);[m
[31m-static void ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache,[m
[31m-    ngx_slab_pool_t *shpool, ngx_uint_t n);[m
[31m-static void ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-static int ngx_ssl_session_ticket_key_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx,[m
[31m-    HMAC_CTX *hctx, int enc);[m
[31m-#endif[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10002002L[m
[31m-static ngx_int_t ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *str);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_openssl_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void ngx_openssl_exit(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_openssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl_engine"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_openssl_engine,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_openssl_module_ctx = {[m
[31m-    ngx_string("openssl"),[m
[31m-    ngx_openssl_create_conf,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_openssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_openssl_module_ctx,               /* module context */[m
[31m-    ngx_openssl_commands,                  /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    ngx_openssl_exit,                      /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int  ngx_ssl_connection_index;[m
[31m-int  ngx_ssl_server_conf_index;[m
[31m-int  ngx_ssl_session_cache_index;[m
[31m-int  ngx_ssl_session_ticket_keys_index;[m
[31m-int  ngx_ssl_certificate_index;[m
[31m-int  ngx_ssl_stapling_index;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_init(ngx_log_t *log)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-[m
[31m-    OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG, NULL);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#ifndef OPENSSL_IS_BORINGSSL[m
[31m-    OPENSSL_config(NULL);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_library_init();[m
[31m-    SSL_load_error_strings();[m
[31m-[m
[31m-    OpenSSL_add_all_algorithms();[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-#ifndef SSL_OP_NO_COMPRESSION[m
[31m-    {[m
[31m-    /*[m
[31m-     * Disable gzip compression in OpenSSL prior to 1.0.0 version,[m
[31m-     * this saves about 522K per connection.[m
[31m-     */[m
[31m-    int                  n;[m
[31m-    STACK_OF(SSL_COMP)  *ssl_comp_methods;[m
[31m-[m
[31m-    ssl_comp_methods = SSL_COMP_get_compression_methods();[m
[31m-    n = sk_SSL_COMP_num(ssl_comp_methods);[m
[31m-[m
[31m-    while (n--) {[m
[31m-        (void) sk_SSL_COMP_pop(ssl_comp_methods);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    ngx_ssl_connection_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_connection_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0, "SSL_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_server_conf_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                         NULL);[m
[31m-    if (ngx_ssl_server_conf_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_session_cache_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                           NULL);[m
[31m-    if (ngx_ssl_session_cache_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_session_ticket_keys_index = SSL_CTX_get_ex_new_index(0, NULL, NULL,[m
[31m-                                                                 NULL, NULL);[m
[31m-    if (ngx_ssl_session_ticket_keys_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_certificate_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                         NULL);[m
[31m-    if (ngx_ssl_certificate_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_stapling_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                      NULL);[m
[31m-    if (ngx_ssl_stapling_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data)[m
[31m-{[m
[31m-    ssl->ctx = SSL_CTX_new(SSLv23_method());[m
[31m-[m
[31m-    if (ssl->ctx == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "SSL_CTX_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_server_conf_index, data) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl->buffer_size = NGX_SSL_BUFSIZE;[m
[31m-[m
[31m-    /* client side options */[m
[31m-[m
[31m-#ifdef SSL_OP_MICROSOFT_SESS_ID_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_SESS_ID_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_NETSCAPE_CHALLENGE_BUG);[m
[31m-#endif[m
[31m-[m
[31m-    /* server side options */[m
[31m-[m
[31m-#ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING[m
[31m-    /* this option allow a potential SSL 2.0 rollback (CAN-2005-2969) */[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MSIE_SSLV2_RSA_PADDING);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLEAY_080_CLIENT_DH_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_TLS_D5_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_D5_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_TLS_BLOCK_PADDING_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_BLOCK_PADDING_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_DH_USE);[m
[31m-[m
[31m-#ifdef SSL_CTRL_CLEAR_OPTIONS[m
[31m-    /* only in 0.9.8m+ */[m
[31m-    SSL_CTX_clear_options(ssl->ctx,[m
[31m-                          SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1);[m
[31m-#endif[m
[31m-[m
[31m-    if (!(protocols & NGX_SSL_SSLv2)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv2);[m
[31m-    }[m
[31m-    if (!(protocols & NGX_SSL_SSLv3)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv3);[m
[31m-    }[m
[31m-    if (!(protocols & NGX_SSL_TLSv1)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1);[m
[31m-    }[m
[31m-#ifdef SSL_OP_NO_TLSv1_1[m
[31m-    SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_1);[m
[31m-    if (!(protocols & NGX_SSL_TLSv1_1)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_1);[m
[31m-    }[m
[31m-#endif[m
[31m-#ifdef SSL_OP_NO_TLSv1_2[m
[31m-    SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_2);[m
[31m-    if (!(protocols & NGX_SSL_TLSv1_2)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_2);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_NO_COMPRESSION[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_COMPRESSION);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_MODE_RELEASE_BUFFERS[m
[31m-    SSL_CTX_set_mode(ssl->ctx, SSL_MODE_RELEASE_BUFFERS);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_MODE_NO_AUTO_CHAIN[m
[31m-    SSL_CTX_set_mode(ssl->ctx, SSL_MODE_NO_AUTO_CHAIN);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_CTX_set_read_ahead(ssl->ctx, 1);[m
[31m-[m
[31m-    SSL_CTX_set_info_callback(ssl->ctx, ngx_ssl_info_callback);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_str_t *key, ngx_array_t *passwords)[m
[31m-{[m
[31m-    BIO         *bio;[m
[31m-    X509        *x509;[m
[31m-    u_long       n;[m
[31m-    ngx_str_t   *pwd;[m
[31m-    ngx_uint_t   tries;[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we can't use SSL_CTX_use_certificate_chain_file() as it doesn't[m
[31m-     * allow to access certificate later from SSL_CTX, so we reimplement[m
[31m-     * it here[m
[31m-     */[m
[31m-[m
[31m-    bio = BIO_new_file((char *) cert->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL);[m
[31m-    if (x509 == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "PEM_read_bio_X509_AUX(\"%s\") failed", cert->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_use_certificate(ssl->ctx, x509) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_use_certificate(\"%s\") failed", cert->data);[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_certificate_index, x509)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_free(x509);[m
[31m-[m
[31m-    /* read rest of the chain */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);[m
[31m-        if (x509 == NULL) {[m
[31m-            n = ERR_peek_last_error();[m
[31m-[m
[31m-            if (ERR_GET_LIB(n) == ERR_LIB_PEM[m
[31m-                && ERR_GET_REASON(n) == PEM_R_NO_START_LINE)[m
[31m-            {[m
[31m-                /* end of file */[m
[31m-                ERR_clear_error();[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* some real error */[m
[31m-[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "PEM_read_bio_X509(\"%s\") failed", cert->data);[m
[31m-            BIO_free(bio);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (SSL_CTX_add_extra_chain_cert(ssl->ctx, x509) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_add_extra_chain_cert(\"%s\") failed",[m
[31m-                          cert->data);[m
[31m-            X509_free(x509);[m
[31m-            BIO_free(bio);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    if (ngx_strncmp(key->data, "engine:", sizeof("engine:") - 1) == 0) {[m
[31m-[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-[m
[31m-        u_char      *p, *last;[m
[31m-        ENGINE      *engine;[m
[31m-        EVP_PKEY    *pkey;[m
[31m-[m
[31m-        p = key->data + sizeof("engine:") - 1;[m
[31m-        last = (u_char *) ngx_strchr(p, ':');[m
[31m-[m
[31m-        if (last == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid syntax in \"%V\"", key);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *last = '\0';[m
[31m-[m
[31m-        engine = ENGINE_by_id((char *) p);[m
[31m-[m
[31m-        if (engine == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "ENGINE_by_id(\"%s\") failed", p);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *last++ = ':';[m
[31m-[m
[31m-        pkey = ENGINE_load_private_key(engine, (char *) last, 0, 0);[m
[31m-[m
[31m-        if (pkey == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "ENGINE_load_private_key(\"%s\") failed", last);[m
[31m-            ENGINE_free(engine);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ENGINE_free(engine);[m
[31m-[m
[31m-        if (SSL_CTX_use_PrivateKey(ssl->ctx, pkey) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_use_PrivateKey(\"%s\") failed", last);[m
[31m-            EVP_PKEY_free(pkey);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        EVP_PKEY_free(pkey);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "loading \"engine:...\" certificate keys "[m
[31m-                           "is not supported");[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, key, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (passwords) {[m
[31m-        tries = passwords->nelts;[m
[31m-        pwd = passwords->elts;[m
[31m-[m
[31m-        SSL_CTX_set_default_passwd_cb(ssl->ctx, ngx_ssl_password_callback);[m
[31m-        SSL_CTX_set_default_passwd_cb_userdata(ssl->ctx, pwd);[m
[31m-[m
[31m-    } else {[m
[31m-        tries = 1;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        pwd = NULL;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (SSL_CTX_use_PrivateKey_file(ssl->ctx, (char *) key->data,[m
[31m-                                        SSL_FILETYPE_PEM)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (--tries) {[m
[31m-            ERR_clear_error();[m
[31m-            SSL_CTX_set_default_passwd_cb_userdata(ssl->ctx, ++pwd);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_use_PrivateKey_file(\"%s\") failed", key->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_default_passwd_cb(ssl->ctx, NULL);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_password_callback(char *buf, int size, int rwflag, void *userdata)[m
[31m-{[m
[31m-    ngx_str_t *pwd = userdata;[m
[31m-[m
[31m-    if (rwflag) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "ngx_ssl_password_callback() is called for encryption");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (pwd->len > (size_t) size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                      "password is truncated to %d bytes", size);[m
[31m-    } else {[m
[31m-        size = pwd->len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(buf, pwd->data, size);[m
[31m-[m
[31m-    return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_int_t depth)[m
[31m-{[m
[31m-    STACK_OF(X509_NAME)  *list;[m
[31m-[m
[31m-    SSL_CTX_set_verify(ssl->ctx, SSL_VERIFY_PEER, ngx_ssl_verify_callback);[m
[31m-[m
[31m-    SSL_CTX_set_verify_depth(ssl->ctx, depth);[m
[31m-[m
[31m-    if (cert->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_load_verify_locations(\"%s\") failed",[m
[31m-                      cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_CTX_load_verify_locations() may leave errors in the error queue[m
[31m-     * while returning success[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    list = SSL_load_client_CA_file((char *) cert->data);[m
[31m-[m
[31m-    if (list == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_load_client_CA_file(\"%s\") failed", cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * before 0.9.7h and 0.9.8 SSL_load_client_CA_file()[m
[31m-     * always leaved an error in the error queue[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    SSL_CTX_set_client_CA_list(ssl->ctx, list);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_trusted_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_int_t depth)[m
[31m-{[m
[31m-    SSL_CTX_set_verify_depth(ssl->ctx, depth);[m
[31m-[m
[31m-    if (cert->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_load_verify_locations(\"%s\") failed",[m
[31m-                      cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_CTX_load_verify_locations() may leave errors in the error queue[m
[31m-     * while returning success[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl)[m
[31m-{[m
[31m-    X509_STORE   *store;[m
[31m-    X509_LOOKUP  *lookup;[m
[31m-[m
[31m-    if (crl->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, crl, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    store = SSL_CTX_get_cert_store(ssl->ctx);[m
[31m-[m
[31m-    if (store == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_get_cert_store() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());[m
[31m-[m
[31m-    if (lookup == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_add_lookup() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_LOOKUP_load_file(lookup, (char *) crl->data, X509_FILETYPE_PEM)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_LOOKUP_load_file(\"%s\") failed", crl->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_STORE_set_flags(store,[m
[31m-                         X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    char              *subject, *issuer;[m
[31m-    int                err, depth;[m
[31m-    X509              *cert;[m
[31m-    X509_NAME         *sname, *iname;[m
[31m-    ngx_connection_t  *c;[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    ssl_conn = X509_STORE_CTX_get_ex_data(x509_store,[m
[31m-                                          SSL_get_ex_data_X509_STORE_CTX_idx());[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    cert = X509_STORE_CTX_get_current_cert(x509_store);[m
[31m-    err = X509_STORE_CTX_get_error(x509_store);[m
[31m-    depth = X509_STORE_CTX_get_error_depth(x509_store);[m
[31m-[m
[31m-    sname = X509_get_subject_name(cert);[m
[31m-    subject = sname ? X509_NAME_oneline(sname, NULL, 0) : "(none)";[m
[31m-[m
[31m-    iname = X509_get_issuer_name(cert);[m
[31m-    issuer = iname ? X509_NAME_oneline(iname, NULL, 0) : "(none)";[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "verify:%d, error:%d, depth:%d, "[m
[31m-                   "subject:\"%s\", issuer:\"%s\"",[m
[31m-                   ok, err, depth, subject, issuer);[m
[31m-[m
[31m-    if (sname) {[m
[31m-        OPENSSL_free(subject);[m
[31m-    }[m
[31m-[m
[31m-    if (iname) {[m
[31m-        OPENSSL_free(issuer);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where, int ret)[m
[31m-{[m
[31m-    BIO               *rbio, *wbio;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (where & SSL_CB_HANDSHAKE_START) {[m
[31m-        c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-        if (c->ssl->handshaked) {[m
[31m-            c->ssl->renegotiation = 1;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL renegotiation");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((where & SSL_CB_ACCEPT_LOOP) == SSL_CB_ACCEPT_LOOP) {[m
[31m-        c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-        if (!c->ssl->handshake_buffer_set) {[m
[31m-            /*[m
[31m-             * By default OpenSSL uses 4k buffer during a handshake,[m
[31m-             * which is too low for long certificate chains and might[m
[31m-             * result in extra round-trips.[m
[31m-             *[m
[31m-             * To adjust a buffer size we detect that buffering was added[m
[31m-             * to write side of the connection by comparing rbio and wbio.[m
[31m-             * If they are different, we assume that it's due to buffering[m
[31m-             * added to wbio, and set buffer size.[m
[31m-             */[m
[31m-[m
[31m-            rbio = SSL_get_rbio((ngx_ssl_conn_t *) ssl_conn);[m
[31m-            wbio = SSL_get_wbio((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-            if (rbio != wbio) {[m
[31m-                (void) BIO_set_write_buffer_size(wbio, NGX_SSL_BUFSIZE);[m
[31m-                c->ssl->handshake_buffer_set = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-RSA *[m
[31m-ngx_ssl_rsa512_key_callback(ngx_ssl_conn_t *ssl_conn, int is_export,[m
[31m-    int key_length)[m
[31m-{[m
[31m-    static RSA  *key;[m
[31m-[m
[31m-    if (key_length != 512) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100003L && !defined OPENSSL_NO_DEPRECATED)[m
[31m-[m
[31m-    if (key == NULL) {[m
[31m-        key = RSA_generate_key(512, RSA_F4, NULL, NULL);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file)[m
[31m-{[m
[31m-    u_char              *p, *last, *end;[m
[31m-    size_t               len;[m
[31m-    ssize_t              n;[m
[31m-    ngx_fd_t             fd;[m
[31m-    ngx_str_t           *pwd;[m
[31m-    ngx_array_t         *passwords;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-    u_char               buf[NGX_SSL_PASSWORD_BUFFER_SIZE];[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->temp_pool, 0);[m
[31m-    passwords = ngx_array_create(cf->temp_pool, 4, sizeof(ngx_str_t));[m
[31m-[m
[31m-    if (cln == NULL || passwords == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_passwords_cleanup;[m
[31m-    cln->data = passwords;[m
[31m-[m
[31m-    fd = ngx_open_file(file->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           ngx_open_file_n " \"%s\" failed", file->data);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    last = buf;[m
[31m-[m
[31m-    do {[m
[31m-        n = ngx_read_fd(fd, last, NGX_SSL_PASSWORD_BUFFER_SIZE - len);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_read_fd_n " \"%s\" failed", file->data);[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        end = last + n;[m
[31m-[m
[31m-        if (len && n == 0) {[m
[31m-            *end++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            last = ngx_strlchr(last, end, LF);[m
[31m-[m
[31m-            if (last == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            len = last++ - p;[m
[31m-[m
[31m-            if (len && p[len - 1] == CR) {[m
[31m-                len--;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                pwd = ngx_array_push(passwords);[m
[31m-                if (pwd == NULL) {[m
[31m-                    passwords = NULL;[m
[31m-                    goto cleanup;[m
[31m-                }[m
[31m-[m
[31m-                pwd->len = len;[m
[31m-                pwd->data = ngx_pnalloc(cf->temp_pool, len);[m
[31m-[m
[31m-                if (pwd->data == NULL) {[m
[31m-                    passwords->nelts--;[m
[31m-                    passwords = NULL;[m
[31m-                    goto cleanup;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(pwd->data, p, len);[m
[31m-            }[m
[31m-[m
[31m-            p = last;[m
[31m-        }[m
[31m-[m
[31m-        len = end - p;[m
[31m-[m
[31m-        if (len == NGX_SSL_PASSWORD_BUFFER_SIZE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "too long line in \"%s\"", file->data);[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memmove(buf, p, len);[m
[31m-        last = buf + len;[m
[31m-[m
[31m-    } while (n != 0);[m
[31m-[m
[31m-    if (passwords->nelts == 0) {[m
[31m-        pwd = ngx_array_push(passwords);[m
[31m-        if (pwd == NULL) {[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(pwd, sizeof(ngx_str_t));[m
[31m-    }[m
[31m-[m
[31m-cleanup:[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, ngx_errno,[m
[31m-                           ngx_close_file_n " \"%s\" failed", file->data);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(buf, NGX_SSL_PASSWORD_BUFFER_SIZE);[m
[31m-[m
[31m-    return passwords;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_passwords_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_array_t *passwords = data;[m
[31m-[m
[31m-    ngx_str_t   *pwd;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    pwd = passwords->elts;[m
[31m-[m
[31m-    for (i = 0; i < passwords->nelts; i++) {[m
[31m-        ngx_memzero(pwd[i].data, pwd[i].len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_dhparam(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file)[m
[31m-{[m
[31m-    DH   *dh;[m
[31m-    BIO  *bio;[m
[31m-[m
[31m-    /*[m
[31m-     * -----BEGIN DH PARAMETERS-----[m
[31m-     * MIGHAoGBALu8LcrYRnSQfEP89YDpz9vZWKP1aLQtSwju1OsPs1BMbAMCducQgAxc[m
[31m-     * y7qokiYUxb7spWWl/fHSh6K8BJvmd4Bg6RqSp1fjBI9osHb302zI8pul34HcLKcl[m
[31m-     * 7OZicMyaUDXYzs7vnqAnSmOrHlj6/UmI0PZdFGdX2gcd8EXP4WubAgEC[m
[31m-     * -----END DH PARAMETERS-----[m
[31m-     */[m
[31m-[m
[31m-    static unsigned char dh1024_p[] = {[m
[31m-        0xBB, 0xBC, 0x2D, 0xCA, 0xD8, 0x46, 0x74, 0x90, 0x7C, 0x43, 0xFC, 0xF5,[m
[31m-        0x80, 0xE9, 0xCF, 0xDB, 0xD9, 0x58, 0xA3, 0xF5, 0x68, 0xB4, 0x2D, 0x4B,[m
[31m-        0x08, 0xEE, 0xD4, 0xEB, 0x0F, 0xB3, 0x50, 0x4C, 0x6C, 0x03, 0x02, 0x76,[m
[31m-        0xE7, 0x10, 0x80, 0x0C, 0x5C, 0xCB, 0xBA, 0xA8, 0x92, 0x26, 0x14, 0xC5,[m
[31m-        0xBE, 0xEC, 0xA5, 0x65, 0xA5, 0xFD, 0xF1, 0xD2, 0x87, 0xA2, 0xBC, 0x04,[m
[31m-        0x9B, 0xE6, 0x77, 0x80, 0x60, 0xE9, 0x1A, 0x92, 0xA7, 0x57, 0xE3, 0x04,[m
[31m-        0x8F, 0x68, 0xB0, 0x76, 0xF7, 0xD3, 0x6C, 0xC8, 0xF2, 0x9B, 0xA5, 0xDF,[m
[31m-        0x81, 0xDC, 0x2C, 0xA7, 0x25, 0xEC, 0xE6, 0x62, 0x70, 0xCC, 0x9A, 0x50,[m
[31m-        0x35, 0xD8, 0xCE, 0xCE, 0xEF, 0x9E, 0xA0, 0x27, 0x4A, 0x63, 0xAB, 0x1E,[m
[31m-        0x58, 0xFA, 0xFD, 0x49, 0x88, 0xD0, 0xF6, 0x5D, 0x14, 0x67, 0x57, 0xDA,[m
[31m-        0x07, 0x1D, 0xF0, 0x45, 0xCF, 0xE1, 0x6B, 0x9B[m
[31m-    };[m
[31m-[m
[31m-    static unsigned char dh1024_g[] = { 0x02 };[m
[31m-[m
[31m-[m
[31m-    if (file->len == 0) {[m
[31m-[m
[31m-        dh = DH_new();[m
[31m-        if (dh == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "DH_new() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);[m
[31m-        dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);[m
[31m-[m
[31m-        if (dh->p == NULL || dh->g == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "BN_bin2bn() failed");[m
[31m-            DH_free(dh);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        SSL_CTX_set_tmp_dh(ssl->ctx, dh);[m
[31m-[m
[31m-        DH_free(dh);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_file((char *) file->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", file->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);[m
[31m-    if (dh == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "PEM_read_bio_DHparams(\"%s\") failed", file->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_tmp_dh(ssl->ctx, dh);[m
[31m-[m
[31m-    DH_free(dh);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_ecdh_curve(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *name)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-#ifndef OPENSSL_NO_ECDH[m
[31m-    int      nid;[m
[31m-    EC_KEY  *ecdh;[m
[31m-[m
[31m-    /*[m
[31m-     * Elliptic-Curve Diffie-Hellman parameters are either "named curves"[m
[31m-     * from RFC 4492 section 5.1.1, or explicitly described curves over[m
[31m-     * binary fields. OpenSSL only supports the "named curves", which provide[m
[31m-     * maximum interoperability.[m
[31m-     */[m
[31m-[m
[31m-    nid = OBJ_sn2nid((const char *) name->data);[m
[31m-    if (nid == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "Unknown curve name \"%s\"", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ecdh = EC_KEY_new_by_curve_name(nid);[m
[31m-    if (ecdh == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "Unable to create curve \"%s\"", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_ECDH_USE);[m
[31m-[m
[31m-    SSL_CTX_set_tmp_ecdh(ssl->ctx, ecdh);[m
[31m-[m
[31m-    EC_KEY_free(ecdh);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_ssl_connection_t  *sc;[m
[31m-[m
[31m-    sc = ngx_pcalloc(c->pool, sizeof(ngx_ssl_connection_t));[m
[31m-    if (sc == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sc->buffer = ((flags & NGX_SSL_BUFFER) != 0);[m
[31m-    sc->buffer_size = ssl->buffer_size;[m
[31m-[m
[31m-    sc->session_ctx = ssl->ctx;[m
[31m-[m
[31m-    sc->connection = SSL_new(ssl->ctx);[m
[31m-[m
[31m-    if (sc->connection == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_set_fd(sc->connection, c->fd) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_fd() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_SSL_CLIENT) {[m
[31m-        SSL_set_connect_state(sc->connection);[m
[31m-[m
[31m-    } else {[m
[31m-        SSL_set_accept_state(sc->connection);[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_set_ex_data(sc->connection, ngx_ssl_connection_index, c) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl = sc;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session)[m
[31m-{[m
[31m-    if (session) {[m
[31m-        if (SSL_set_session(c->ssl->connection, session) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_session() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_handshake(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        n, sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    n = SSL_do_handshake(c->ssl->connection);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        char         buf[129], *s, *d;[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10000000L[m
[31m-        const[m
[31m-#endif[m
[31m-        SSL_CIPHER  *cipher;[m
[31m-[m
[31m-        cipher = SSL_get_current_cipher(c->ssl->connection);[m
[31m-[m
[31m-        if (cipher) {[m
[31m-            SSL_CIPHER_description(cipher, &buf[1], 128);[m
[31m-[m
[31m-            for (s = &buf[1], d = buf; *s; s++) {[m
[31m-                if (*s == ' ' && *d == ' ') {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (*s == LF || *s == CR) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                *++d = *s;[m
[31m-            }[m
[31m-[m
[31m-            if (*d != ' ') {[m
[31m-                d++;[m
[31m-            }[m
[31m-[m
[31m-            *d = '\0';[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL: %s, cipher: \"%s\"",[m
[31m-                           SSL_get_version(c->ssl->connection), &buf[1]);[m
[31m-[m
[31m-            if (SSL_session_reused(c->ssl->connection)) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                               "SSL reused session");[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL no shared ciphers");[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c->ssl->handshaked = 1;[m
[31m-[m
[31m-        c->recv = ngx_ssl_recv;[m
[31m-        c->send = ngx_ssl_write;[m
[31m-        c->recv_chain = ngx_ssl_recv_chain;[m
[31m-        c->send_chain = ngx_ssl_send_chain;[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10100000L[m
[31m-#ifdef SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS[m
[31m-[m
[31m-        /* initial handshake done, disable renegotiation (CVE-2009-3555) */[m
[31m-        if (c->ssl->connection->s3) {[m
[31m-            c->ssl->connection->s3->flags |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-        c->read->ready = 0;[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->write->ready = 0;[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10002000L[m
[31m-    if (sslerr == SSL_ERROR_WANT_X509_LOOKUP) {[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-    c->read->eof = 1;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {[m
[31m-        ngx_connection_error(c, err,[m
[31m-                             "peer closed connection in SSL handshake");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->read->error = 1;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_do_handshake() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_handshake_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL handshake handler: %d", ev->write);[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->ssl->handler(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_handshake(c) == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit)[m
[31m-{[m
[31m-    u_char     *last;[m
[31m-    ssize_t     n, bytes, size;[m
[31m-    ngx_buf_t  *b;[m
[31m-[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-    last = b->last;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        size = b->end - last;[m
[31m-[m
[31m-        if (limit) {[m
[31m-            if (bytes >= limit) {[m
[31m-                return bytes;[m
[31m-            }[m
[31m-[m
[31m-            if (bytes + size > limit) {[m
[31m-                size = (ssize_t) (limit - bytes);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_ssl_recv(c, last, size);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            last += n;[m
[31m-            bytes += n;[m
[31m-[m
[31m-            if (last == b->end) {[m
[31m-                cl = cl->next;[m
[31m-[m
[31m-                if (cl == NULL) {[m
[31m-                    return bytes;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-                last = b->last;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bytes) {[m
[31m-[m
[31m-            if (n == 0 || n == NGX_ERROR) {[m
[31m-                c->read->ready = 1;[m
[31m-            }[m
[31m-[m
[31m-            return bytes;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int  n, bytes;[m
[31m-[m
[31m-    if (c->ssl->last == NGX_ERROR) {[m
[31m-        c->read->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (c->ssl->last == NGX_DONE) {[m
[31m-        c->read->ready = 0;[m
[31m-        c->read->eof = 1;[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_read() may return data in parts, so try to read[m
[31m-     * until SSL_read() would return no data[m
[31m-     */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = SSL_read(c->ssl->connection, buf, size);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_read: %d", n);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            bytes += n;[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->last = ngx_ssl_handle_recv(c, n);[m
[31m-[m
[31m-        if (c->ssl->last == NGX_OK) {[m
[31m-[m
[31m-            size -= n;[m
[31m-[m
[31m-            if (size == 0) {[m
[31m-                c->read->ready = 1;[m
[31m-                return bytes;[m
[31m-            }[m
[31m-[m
[31m-            buf += n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bytes) {[m
[31m-            if (c->ssl->last != NGX_AGAIN) {[m
[31m-                c->read->ready = 1;[m
[31m-            }[m
[31m-[m
[31m-            return bytes;[m
[31m-        }[m
[31m-[m
[31m-        switch (c->ssl->last) {[m
[31m-[m
[31m-        case NGX_DONE:[m
[31m-            c->read->ready = 0;[m
[31m-            c->read->eof = 1;[m
[31m-            return 0;[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            c->read->error = 1;[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case NGX_AGAIN:[m
[31m-            return c->ssl->last;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_handle_recv(ngx_connection_t *c, int n)[m
[31m-{[m
[31m-    int        sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (c->ssl->renegotiation) {[m
[31m-        /*[m
[31m-         * disable renegotiation (CVE-2009-3555):[m
[31m-         * OpenSSL (at least up to 0.9.8l) does not handle disabled[m
[31m-         * renegotiation gracefully, so drop connection here[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, c->log, 0, "SSL renegotiation disabled");[m
[31m-[m
[31m-        while (ERR_peek_error()) {[m
[31m-            ngx_ssl_error(NGX_LOG_DEBUG, c->log, 0,[m
[31m-                          "ignoring stale global SSL error");[m
[31m-        }[m
[31m-[m
[31m-        ERR_clear_error();[m
[31m-[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-        c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-[m
[31m-        if (c->ssl->saved_write_handler) {[m
[31m-[m
[31m-            c->write->handler = c->ssl->saved_write_handler;[m
[31m-            c->ssl->saved_write_handler = NULL;[m
[31m-            c->write->ready = 1;[m
[31m-[m
[31m-            if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_post_event(c->write, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-        c->read->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "peer started SSL renegotiation");[m
[31m-[m
[31m-        c->write->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not set the timer because there is already the read event timer[m
[31m-         */[m
[31m-[m
[31m-        if (c->ssl->saved_write_handler == NULL) {[m
[31m-            c->ssl->saved_write_handler = c->write->handler;[m
[31m-            c->write->handler = ngx_ssl_write_handler;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "peer shutdown SSL cleanly");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-[m
[31m-    c->read->handler(c->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * OpenSSL has no SSL_writev() so we copy several bufs into our 16K buffer[m
[31m- * before the SSL_write() call to decrease a SSL overhead.[m
[31m- *[m
[31m- * Besides for protocols such as HTTP it is possible to always buffer[m
[31m- * the output to decrease a SSL overhead some more.[m
[31m- */[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int          n;[m
[31m-    ngx_uint_t   flush;[m
[31m-    ssize_t      send, size;[m
[31m-    ngx_buf_t   *buf;[m
[31m-[m
[31m-    if (!c->ssl->buffer) {[m
[31m-[m
[31m-        while (in) {[m
[31m-            if (ngx_buf_special(in->buf)) {[m
[31m-                in = in->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_ssl_write(c, in->buf->pos, in->buf->last - in->buf->pos);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                return in;[m
[31m-            }[m
[31m-[m
[31m-            in->buf->pos += n;[m
[31m-[m
[31m-            if (in->buf->pos == in->buf->last) {[m
[31m-                in = in->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the maximum limit size is the maximum int32_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_INT32_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_INT32_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    buf = c->ssl->buf;[m
[31m-[m
[31m-    if (buf == NULL) {[m
[31m-        buf = ngx_create_temp_buf(c->pool, c->ssl->buffer_size);[m
[31m-        if (buf == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->buf = buf;[m
[31m-    }[m
[31m-[m
[31m-    if (buf->start == NULL) {[m
[31m-        buf->start = ngx_palloc(c->pool, c->ssl->buffer_size);[m
[31m-        if (buf->start == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf->pos = buf->start;[m
[31m-        buf->last = buf->start;[m
[31m-        buf->end = buf->start + c->ssl->buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    send = buf->last - buf->pos;[m
[31m-    flush = (in == NULL) ? 1 : buf->flush;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        while (in && buf->last < buf->end && send < limit) {[m
[31m-            if (in->buf->last_buf || in->buf->flush) {[m
[31m-                flush = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_special(in->buf)) {[m
[31m-                in = in->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            size = in->buf->last - in->buf->pos;[m
[31m-[m
[31m-            if (size > buf->end - buf->last) {[m
[31m-                size = buf->end - buf->last;[m
[31m-            }[m
[31m-[m
[31m-            if (send + size > limit) {[m
[31m-                size = (ssize_t) (limit - send);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL buf copy: %z", size);[m
[31m-[m
[31m-            ngx_memcpy(buf->last, in->buf->pos, size);[m
[31m-[m
[31m-            buf->last += size;[m
[31m-            in->buf->pos += size;[m
[31m-            send += size;[m
[31m-[m
[31m-            if (in->buf->pos == in->buf->last) {[m
[31m-                in = in->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!flush && send < limit && buf->last < buf->end) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        size = buf->last - buf->pos;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            buf->flush = 0;[m
[31m-            c->buffered &= ~NGX_SSL_BUFFERED;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_ssl_write(c, buf->pos, size);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        buf->pos += n;[m
[31m-[m
[31m-        if (n < size) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        flush = 0;[m
[31m-[m
[31m-        buf->pos = buf->start;[m
[31m-        buf->last = buf->start;[m
[31m-[m
[31m-        if (in == NULL || send == limit) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    buf->flush = flush;[m
[31m-[m
[31m-    if (buf->pos < buf->last) {[m
[31m-        c->buffered |= NGX_SSL_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        c->buffered &= ~NGX_SSL_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size)[m
[31m-{[m
[31m-    int        n, sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL to write: %uz", size);[m
[31m-[m
[31m-    n = SSL_write(c->ssl->connection, data, size);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_write: %d", n);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-[m
[31m-        if (c->ssl->saved_read_handler) {[m
[31m-[m
[31m-            c->read->handler = c->ssl->saved_read_handler;[m
[31m-            c->ssl->saved_read_handler = NULL;[m
[31m-            c->read->ready = 1;[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_post_event(c->read, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        c->sent += n;[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->write->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "peer started SSL renegotiation");[m
[31m-[m
[31m-        c->read->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not set the timer because there is already[m
[31m-         * the write event timer[m
[31m-         */[m
[31m-[m
[31m-        if (c->ssl->saved_read_handler == NULL) {[m
[31m-            c->ssl->saved_read_handler = c->read->handler;[m
[31m-            c->read->handler = ngx_ssl_read_handler;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-    c->write->error = 1;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_write() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->write->handler(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_free_buffer(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (c->ssl->buf && c->ssl->buf->start) {[m
[31m-        if (ngx_pfree(c->pool, c->ssl->buf->start) == NGX_OK) {[m
[31m-            c->ssl->buf->start = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_shutdown(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        n, sslerr, mode;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (SSL_in_init(c->ssl->connection)) {[m
[31m-        /*[m
[31m-         * OpenSSL 1.0.2f complains if SSL_shutdown() is called during[m
[31m-         * an SSL handshake, while previous versions always return 0.[m
[31m-         * Avoid calling SSL_shutdown() if handshake wasn't completed.[m
[31m-         */[m
[31m-[m
[31m-        SSL_free(c->ssl->connection);[m
[31m-        c->ssl = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c->timedout) {[m
[31m-        mode = SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN;[m
[31m-        SSL_set_quiet_shutdown(c->ssl->connection, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        mode = SSL_get_shutdown(c->ssl->connection);[m
[31m-[m
[31m-        if (c->ssl->no_wait_shutdown) {[m
[31m-            mode |= SSL_RECEIVED_SHUTDOWN;[m
[31m-        }[m
[31m-[m
[31m-        if (c->ssl->no_send_shutdown) {[m
[31m-            mode |= SSL_SENT_SHUTDOWN;[m
[31m-        }[m
[31m-[m
[31m-        if (c->ssl->no_wait_shutdown && c->ssl->no_send_shutdown) {[m
[31m-            SSL_set_quiet_shutdown(c->ssl->connection, 1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    SSL_set_shutdown(c->ssl->connection, mode);[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    n = SSL_shutdown(c->ssl->connection);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_shutdown: %d", n);[m
[31m-[m
[31m-    sslerr = 0;[m
[31m-[m
[31m-    /* before 0.9.8m SSL_shutdown() returned 0 instead of -1 on errors */[m
[31m-[m
[31m-    if (n != 1 && ERR_peek_error()) {[m
[31m-        sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL_get_error: %d", sslerr);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1 || sslerr == 0 || sslerr == SSL_ERROR_ZERO_RETURN) {[m
[31m-        SSL_free(c->ssl->connection);[m
[31m-        c->ssl = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ || sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->read->handler = ngx_ssl_shutdown_handler;[m
[31m-        c->write->handler = ngx_ssl_shutdown_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-            ngx_add_timer(c->read, 30000);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_shutdown() failed");[m
[31m-[m
[31m-    SSL_free(c->ssl->connection);[m
[31m-    c->ssl = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_shutdown_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_connection_handler_pt   handler;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    handler = c->ssl->handler;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "SSL shutdown handler");[m
[31m-[m
[31m-    if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_connection_error(ngx_connection_t *c, int sslerr, ngx_err_t err,[m
[31m-    char *text)[m
[31m-{[m
[31m-    int         n;[m
[31m-    ngx_uint_t  level;[m
[31m-[m
[31m-    level = NGX_LOG_CRIT;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_SYSCALL) {[m
[31m-[m
[31m-        if (err == NGX_ECONNRESET[m
[31m-            || err == NGX_EPIPE[m
[31m-            || err == NGX_ENOTCONN[m
[31m-            || err == NGX_ETIMEDOUT[m
[31m-            || err == NGX_ECONNREFUSED[m
[31m-            || err == NGX_ENETDOWN[m
[31m-            || err == NGX_ENETUNREACH[m
[31m-            || err == NGX_EHOSTDOWN[m
[31m-            || err == NGX_EHOSTUNREACH)[m
[31m-        {[m
[31m-            switch (c->log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else if (sslerr == SSL_ERROR_SSL) {[m
[31m-[m
[31m-        n = ERR_GET_REASON(ERR_peek_error());[m
[31m-[m
[31m-            /* handshake failures */[m
[31m-        if (n == SSL_R_BAD_CHANGE_CIPHER_SPEC                        /*  103 */[m
[31m-            || n == SSL_R_BLOCK_CIPHER_PAD_IS_WRONG                  /*  129 */[m
[31m-            || n == SSL_R_DIGEST_CHECK_FAILED                        /*  149 */[m
[31m-            || n == SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST              /*  151 */[m
[31m-            || n == SSL_R_EXCESSIVE_MESSAGE_SIZE                     /*  152 */[m
[31m-            || n == SSL_R_LENGTH_MISMATCH                            /*  159 */[m
[31m-            || n == SSL_R_NO_CIPHERS_PASSED                          /*  182 */[m
[31m-            || n == SSL_R_NO_CIPHERS_SPECIFIED                       /*  183 */[m
[31m-            || n == SSL_R_NO_COMPRESSION_SPECIFIED                   /*  187 */[m
[31m-            || n == SSL_R_NO_SHARED_CIPHER                           /*  193 */[m
[31m-            || n == SSL_R_RECORD_LENGTH_MISMATCH                     /*  213 */[m
[31m-#ifdef SSL_R_PARSE_TLSEXT[m
[31m-            || n == SSL_R_PARSE_TLSEXT                               /*  227 */[m
[31m-#endif[m
[31m-            || n == SSL_R_UNEXPECTED_MESSAGE                         /*  244 */[m
[31m-            || n == SSL_R_UNEXPECTED_RECORD                          /*  245 */[m
[31m-            || n == SSL_R_UNKNOWN_ALERT_TYPE                         /*  246 */[m
[31m-            || n == SSL_R_UNKNOWN_PROTOCOL                           /*  252 */[m
[31m-            || n == SSL_R_WRONG_VERSION_NUMBER                       /*  267 */[m
[31m-            || n == SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC        /*  281 */[m
[31m-#ifdef SSL_R_RENEGOTIATE_EXT_TOO_LONG[m
[31m-            || n == SSL_R_RENEGOTIATE_EXT_TOO_LONG                   /*  335 */[m
[31m-            || n == SSL_R_RENEGOTIATION_ENCODING_ERR                 /*  336 */[m
[31m-            || n == SSL_R_RENEGOTIATION_MISMATCH                     /*  337 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED[m
[31m-            || n == SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED       /*  338 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING[m
[31m-            || n == SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING           /*  345 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_INAPPROPRIATE_FALLBACK[m
[31m-            || n == SSL_R_INAPPROPRIATE_FALLBACK                     /*  373 */[m
[31m-#endif[m
[31m-            || n == 1000 /* SSL_R_SSLV3_ALERT_CLOSE_NOTIFY */[m
[31m-#ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE[m
[31m-            || n == SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE             /* 1010 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_BAD_RECORD_MAC                 /* 1020 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECRYPTION_FAILED              /* 1021 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_RECORD_OVERFLOW                /* 1022 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE          /* 1030 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE              /* 1040 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_NO_CERTIFICATE                 /* 1041 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_BAD_CERTIFICATE                /* 1042 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE        /* 1043 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED            /* 1044 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED            /* 1045 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN            /* 1046 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER              /* 1047 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_UNKNOWN_CA                     /* 1048 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_ACCESS_DENIED                  /* 1049 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECODE_ERROR                   /* 1050 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECRYPT_ERROR                  /* 1051 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION             /* 1060 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_PROTOCOL_VERSION               /* 1070 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY          /* 1071 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_INTERNAL_ERROR                 /* 1080 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_USER_CANCELLED                 /* 1090 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_NO_RENEGOTIATION               /* 1100 */[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            switch (c->log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_error(level, c->log, err, text);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_clear_error(ngx_log_t *log)[m
[31m-{[m
[31m-    while (ERR_peek_error()) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0, "ignoring stale global SSL error");[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_ssl_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, char *fmt, ...)[m
[31m-{[m
[31m-    int          flags;[m
[31m-    u_long       n;[m
[31m-    va_list      args;[m
[31m-    u_char      *p, *last;[m
[31m-    u_char       errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    const char  *data;[m
[31m-[m
[31m-    last = errstr + NGX_MAX_CONF_ERRSTR;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(errstr, last - 1, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    p = ngx_cpystrn(p, (u_char *) " (SSL:", last - p);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = ERR_peek_error_line_data(NULL, NULL, &data, &flags);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (p >= last) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        *p++ = ' ';[m
[31m-[m
[31m-        ERR_error_string_n(n, (char *) p, last - p);[m
[31m-[m
[31m-        while (p < last && *p) {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (p < last && *data && (flags & ERR_TXT_STRING)) {[m
[31m-            *p++ = ':';[m
[31m-            p = ngx_cpystrn(p, (u_char *) data, last - p);[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        (void) ERR_get_error();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, log, err, "%*s)", p - errstr, errstr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx,[m
[31m-    ssize_t builtin_session_cache, ngx_shm_zone_t *shm_zone, time_t timeout)[m
[31m-{[m
[31m-    long  cache_mode;[m
[31m-[m
[31m-    SSL_CTX_set_timeout(ssl->ctx, (long) timeout);[m
[31m-[m
[31m-    if (ngx_ssl_session_id_context(ssl, sess_ctx) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (builtin_session_cache == NGX_SSL_NO_SCACHE) {[m
[31m-        SSL_CTX_set_session_cache_mode(ssl->ctx, SSL_SESS_CACHE_OFF);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (builtin_session_cache == NGX_SSL_NONE_SCACHE) {[m
[31m-[m
[31m-        /*[m
[31m-         * If the server explicitly says that it does not support[m
[31m-         * session reuse (see SSL_SESS_CACHE_OFF above), then[m
[31m-         * Outlook Express fails to upload a sent email to[m
[31m-         * the Sent Items folder on the IMAP server via a separate IMAP[m
[31m-         * connection in the background. Therefore we have a special[m
[31m-         * mode (SSL_SESS_CACHE_SERVER|SSL_SESS_CACHE_NO_INTERNAL_STORE)[m
[31m-         * where the server pretends that it supports session reuse,[m
[31m-         * but it does not actually store any session.[m
[31m-         */[m
[31m-[m
[31m-        SSL_CTX_set_session_cache_mode(ssl->ctx,[m
[31m-                                       SSL_SESS_CACHE_SERVER[m
[31m-                                       |SSL_SESS_CACHE_NO_AUTO_CLEAR[m
[31m-                                       |SSL_SESS_CACHE_NO_INTERNAL_STORE);[m
[31m-[m
[31m-        SSL_CTX_sess_set_cache_size(ssl->ctx, 1);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache_mode = SSL_SESS_CACHE_SERVER;[m
[31m-[m
[31m-    if (shm_zone && builtin_session_cache == NGX_SSL_NO_BUILTIN_SCACHE) {[m
[31m-        cache_mode |= SSL_SESS_CACHE_NO_INTERNAL;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_session_cache_mode(ssl->ctx, cache_mode);[m
[31m-[m
[31m-    if (builtin_session_cache != NGX_SSL_NO_BUILTIN_SCACHE) {[m
[31m-[m
[31m-        if (builtin_session_cache != NGX_SSL_DFLT_BUILTIN_SCACHE) {[m
[31m-            SSL_CTX_sess_set_cache_size(ssl->ctx, builtin_session_cache);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone) {[m
[31m-        SSL_CTX_sess_set_new_cb(ssl->ctx, ngx_ssl_new_session);[m
[31m-        SSL_CTX_sess_set_get_cb(ssl->ctx, ngx_ssl_get_cached_session);[m
[31m-        SSL_CTX_sess_set_remove_cb(ssl->ctx, ngx_ssl_remove_session);[m
[31m-[m
[31m-        if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_cache_index, shm_zone)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_set_ex_data() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_session_id_context(ngx_ssl_t *ssl, ngx_str_t *sess_ctx)[m
[31m-{[m
[31m-    int                   n, i;[m
[31m-    X509                 *cert;[m
[31m-    X509_NAME            *name;[m
[31m-    EVP_MD_CTX           *md;[m
[31m-    unsigned int          len;[m
[31m-    STACK_OF(X509_NAME)  *list;[m
[31m-    u_char                buf[EVP_MAX_MD_SIZE];[m
[31m-[m
[31m-    /*[m
[31m-     * Session ID context is set based on the string provided,[m
[31m-     * the server certificate, and the client CA list.[m
[31m-     */[m
[31m-[m
[31m-    md = EVP_MD_CTX_create();[m
[31m-    if (md == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestInit_ex(md, EVP_sha1(), NULL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestInit_ex() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestUpdate(md, sess_ctx->data, sess_ctx->len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cert = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_certificate_index);[m
[31m-[m
[31m-    if (X509_digest(cert, EVP_sha1(), buf, &len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_digest() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestUpdate(md, buf, len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    list = SSL_CTX_get_client_CA_list(ssl->ctx);[m
[31m-[m
[31m-    if (list != NULL) {[m
[31m-        n = sk_X509_NAME_num(list);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            name = sk_X509_NAME_value(list, i);[m
[31m-[m
[31m-            if (X509_NAME_digest(name, EVP_sha1(), buf, &len) == 0) {[m
[31m-                ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                              "X509_NAME_digest() failed");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (EVP_DigestUpdate(md, buf, len) == 0) {[m
[31m-                ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                              "EVP_DigestUpdate() failed");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestFinal_ex(md, buf, &len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    EVP_MD_CTX_destroy(md);[m
[31m-[m
[31m-    if (SSL_CTX_set_session_id_context(ssl->ctx, buf, len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_session_id_context() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    EVP_MD_CTX_destroy(md);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    size_t                    len;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-[m
[31m-    if (data) {[m
[31m-        shm_zone->data = data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        shm_zone->data = shpool->data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache = ngx_slab_alloc(shpool, sizeof(ngx_ssl_session_cache_t));[m
[31m-    if (cache == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shpool->data = cache;[m
[31m-    shm_zone->data = cache;[m
[31m-[m
[31m-    ngx_rbtree_init(&cache->session_rbtree, &cache->sentinel,[m
[31m-                    ngx_ssl_session_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&cache->expire_queue);[m
[31m-[m
[31m-    len = sizeof(" in SSL session shared cache \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in SSL session shared cache \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    shpool->log_nomem = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The length of the session id is 16 bytes for SSLv2 sessions and[m
[31m- * between 1 and 32 bytes for SSLv3/TLSv1, typically 32 bytes.[m
[31m- * It seems that the typical length of the external ASN1 representation[m
[31m- * of a session is 118 or 119 bytes for SSLv3/TSLv1.[m
[31m- *[m
[31m- * Thus on 32-bit platforms we allocate separately an rbtree node,[m
[31m- * a session id, and an ASN1 representation, they take accordingly[m
[31m- * 64, 32, and 128 bytes.[m
[31m- *[m
[31m- * On 64-bit platforms we allocate separately an rbtree node + session_id,[m
[31m- * and an ASN1 representation, they take accordingly 128 and 128 bytes.[m
[31m- *[m
[31m- * OpenSSL's i2d_SSL_SESSION() and d2i_SSL_SESSION are slow,[m
[31m- * so they are outside the code locked by shared pool mutex[m
[31m- */[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    int                       len;[m
[31m-    u_char                   *p, *id, *cached_sess, *session_id;[m
[31m-    uint32_t                  hash;[m
[31m-    SSL_CTX                  *ssl_ctx;[m
[31m-    unsigned int              session_id_length;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_connection_t         *c;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-    u_char                    buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-[m
[31m-    len = i2d_SSL_SESSION(sess, NULL);[m
[31m-[m
[31m-    /* do not cache too big session */[m
[31m-[m
[31m-    if (len > (int) NGX_SSL_MAX_SESSION_SIZE) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    p = buf;[m
[31m-    i2d_SSL_SESSION(sess, &p);[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ssl_ctx = c->ssl->session_ctx;[m
[31m-    shm_zone = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    /* drop one or two expired sessions */[m
[31m-    ngx_ssl_expire_sessions(cache, shpool, 1);[m
[31m-[m
[31m-    cached_sess = ngx_slab_alloc_locked(shpool, len);[m
[31m-[m
[31m-    if (cached_sess == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        cached_sess = ngx_slab_alloc_locked(shpool, len);[m
[31m-[m
[31m-        if (cached_sess == NULL) {[m
[31m-            sess_id = NULL;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));[m
[31m-[m
[31m-    if (sess_id == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));[m
[31m-[m
[31m-        if (sess_id == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    session_id = (u_char *) SSL_SESSION_get_id(sess, &session_id_length);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    session_id = sess->session_id;[m
[31m-    session_id_length = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-    id = sess_id->sess_id;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    id = ngx_slab_alloc_locked(shpool, session_id_length);[m
[31m-[m
[31m-    if (id == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        id = ngx_slab_alloc_locked(shpool, session_id_length);[m
[31m-[m
[31m-        if (id == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memcpy(cached_sess, buf, len);[m
[31m-[m
[31m-    ngx_memcpy(id, session_id, session_id_length);[m
[31m-[m
[31m-    hash = ngx_crc32_short(session_id, session_id_length);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "ssl new session: %08XD:%ud:%d",[m
[31m-                   hash, session_id_length, len);[m
[31m-[m
[31m-    sess_id->node.key = hash;[m
[31m-    sess_id->node.data = (u_char) session_id_length;[m
[31m-    sess_id->id = id;[m
[31m-    sess_id->len = len;[m
[31m-    sess_id->session = cached_sess;[m
[31m-[m
[31m-    sess_id->expire = ngx_time() + SSL_CTX_get_timeout(ssl_ctx);[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->expire_queue, &sess_id->queue);[m
[31m-[m
[31m-    ngx_rbtree_insert(&cache->session_rbtree, &sess_id->node);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (cached_sess) {[m
[31m-        ngx_slab_free_locked(shpool, cached_sess);[m
[31m-    }[m
[31m-[m
[31m-    if (sess_id) {[m
[31m-        ngx_slab_free_locked(shpool, sess_id);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                  "could not allocate new session%s", shpool->log_ctx);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_ssl_session_t *[m
[31m-ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char *id, int len, int *copy)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                   *p;[m
[31m-    uint32_t                  hash;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_rbtree_node_t        *node, *sentinel;[m
[31m-    ngx_ssl_session_t        *sess;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-    u_char                    buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-    ngx_connection_t         *c;[m
[31m-[m
[31m-    hash = ngx_crc32_short((u_char *) (uintptr_t) id, (size_t) len);[m
[31m-    *copy = 0;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "ssl get session: %08XD:%d", hash, len);[m
[31m-[m
[31m-    shm_zone = SSL_CTX_get_ex_data(c->ssl->session_ctx,[m
[31m-                                   ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-    sess = NULL;[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    node = cache->session_rbtree.root;[m
[31m-    sentinel = cache->session_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-[m
[31m-        rc = ngx_memn2cmp((u_char *) (uintptr_t) id, sess_id->id,[m
[31m-                          (size_t) len, (size_t) node->data);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-[m
[31m-            if (sess_id->expire > ngx_time()) {[m
[31m-                ngx_memcpy(buf, sess_id->session, sess_id->len);[m
[31m-[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-                p = buf;[m
[31m-                sess = d2i_SSL_SESSION(NULL, &p, sess_id->len);[m
[31m-[m
[31m-                return sess;[m
[31m-            }[m
[31m-[m
[31m-            ngx_queue_remove(&sess_id->queue);[m
[31m-[m
[31m-            ngx_rbtree_delete(&cache->session_rbtree, node);[m
[31m-[m
[31m-            ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-            ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-            ngx_slab_free_locked(shpool, sess_id);[m
[31m-[m
[31m-            sess = NULL;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    return sess;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_remove_cached_session(SSL_CTX *ssl, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    SSL_CTX_remove_session(ssl, sess);[m
[31m-[m
[31m-    ngx_ssl_remove_session(ssl, sess);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    u_char                   *id;[m
[31m-    uint32_t                  hash;[m
[31m-    ngx_int_t                 rc;[m
[31m-    unsigned int              len;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_rbtree_node_t        *node, *sentinel;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-[m
[31m-    shm_zone = SSL_CTX_get_ex_data(ssl, ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    id = (u_char *) SSL_SESSION_get_id(sess, &len);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    id = sess->session_id;[m
[31m-    len = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    hash = ngx_crc32_short(id, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                   "ssl remove session: %08XD:%ud", hash, len);[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    node = cache->session_rbtree.root;[m
[31m-    sentinel = cache->session_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(id, sess_id->id, len, (size_t) node->data);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-[m
[31m-            ngx_queue_remove(&sess_id->queue);[m
[31m-[m
[31m-            ngx_rbtree_delete(&cache->session_rbtree, node);[m
[31m-[m
[31m-            ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-            ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-            ngx_slab_free_locked(shpool, sess_id);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache,[m
[31m-    ngx_slab_pool_t *shpool, ngx_uint_t n)[m
[31m-{[m
[31m-    time_t              now;[m
[31m-    ngx_queue_t        *q;[m
[31m-    ngx_ssl_sess_id_t  *sess_id;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->expire_queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->expire_queue);[m
[31m-[m
[31m-        sess_id = ngx_queue_data(q, ngx_ssl_sess_id_t, queue);[m
[31m-[m
[31m-        if (n++ != 0 && sess_id->expire > now) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                       "expire session: %08Xi", sess_id->node.key);[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->session_rbtree, &sess_id->node);[m
[31m-[m
[31m-        ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-        ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-        ngx_slab_free_locked(shpool, sess_id);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-    ngx_ssl_sess_id_t   *sess_id, *sess_id_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-            sess_id_temp = (ngx_ssl_sess_id_t *) temp;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(sess_id->id, sess_id_temp->id,[m
[31m-                              (size_t) node->data, (size_t) temp->data)[m
[31m-                 < 0) ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths)[m
[31m-{[m
[31m-    u_char                         buf[48];[m
[31m-    ssize_t                        n;[m
[31m-    ngx_str_t                     *path;[m
[31m-    ngx_file_t                     file;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_array_t                   *keys;[m
[31m-    ngx_file_info_t                fi;[m
[31m-    ngx_ssl_session_ticket_key_t  *key;[m
[31m-[m
[31m-    if (paths == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    keys = ngx_array_create(cf->pool, paths->nelts,[m
[31m-                            sizeof(ngx_ssl_session_ticket_key_t));[m
[31m-    if (keys == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    path = paths->elts;[m
[31m-    for (i = 0; i < paths->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_conf_full_name(cf->cycle, &path[i], 1) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-        file.name = path[i];[m
[31m-        file.log = cf->log;[m
[31m-[m
[31m-        file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, 0, 0);[m
[31m-        if (file.fd == NGX_INVALID_FILE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_open_file_n " \"%V\" failed", &file.name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                               ngx_fd_info_n " \"%V\" failed", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_file_size(&fi) != 48) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" must be 48 bytes", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_read_file(&file, buf, 48, 0);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                               ngx_read_file_n " \"%V\" failed", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (n != 48) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, 0,[m
[31m-                               ngx_read_file_n " \"%V\" returned only "[m
[31m-                               "%z bytes instead of 48", &file.name, n);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        key = ngx_array_push(keys);[m
[31m-        if (key == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(key->name, buf, 16);[m
[31m-        ngx_memcpy(key->aes_key, buf + 16, 16);[m
[31m-        ngx_memcpy(key->hmac_key, buf + 32, 16);[m
[31m-[m
[31m-        if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", &file.name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_ticket_keys_index, keys)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_tlsext_ticket_key_cb(ssl->ctx,[m
[31m-                                         ngx_ssl_session_ticket_key_callback)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "nginx was built with Session Tickets support, however, "[m
[31m-                      "now it is linked dynamically to an OpenSSL library "[m
[31m-                      "which has no tlsext support, therefore Session Tickets "[m
[31m-                      "are not available");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%V\" failed", &file.name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef OPENSSL_NO_SHA256[m
[31m-#define ngx_ssl_session_ticket_md  EVP_sha1[m
[31m-#else[m
[31m-#define ngx_ssl_session_ticket_md  EVP_sha256[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_session_ticket_key_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx,[m
[31m-    HMAC_CTX *hctx, int enc)[m
[31m-{[m
[31m-    SSL_CTX                       *ssl_ctx;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_array_t                   *keys;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_ssl_session_ticket_key_t  *key;[m
[31m-#if (NGX_DEBUG)[m
[31m-    u_char                         buf[32];[m
[31m-#endif[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-    ssl_ctx = c->ssl->session_ctx;[m
[31m-[m
[31m-    keys = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_ticket_keys_index);[m
[31m-    if (keys == NULL) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    key = keys->elts;[m
[31m-[m
[31m-    if (enc == 1) {[m
[31m-        /* encrypt session ticket */[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket encrypt, key: \"%*s\" (%s session)",[m
[31m-                       ngx_hex_dump(buf, key[0].name, 16) - buf, buf,[m
[31m-                       SSL_session_reused(ssl_conn) ? "reused" : "new");[m
[31m-[m
[31m-        RAND_bytes(iv, 16);[m
[31m-        EVP_EncryptInit_ex(ectx, EVP_aes_128_cbc(), NULL, key[0].aes_key, iv);[m
[31m-        HMAC_Init_ex(hctx, key[0].hmac_key, 16,[m
[31m-                     ngx_ssl_session_ticket_md(), NULL);[m
[31m-        ngx_memcpy(name, key[0].name, 16);[m
[31m-[m
[31m-        return 0;[m
[31m-[m
[31m-    } else {[m
[31m-        /* decrypt session ticket */[m
[31m-[m
[31m-        for (i = 0; i < keys->nelts; i++) {[m
[31m-            if (ngx_memcmp(name, key[i].name, 16) == 0) {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket decrypt, key: \"%*s\" not found",[m
[31m-                       ngx_hex_dump(buf, name, 16) - buf, buf);[m
[31m-[m
[31m-        return 0;[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket decrypt, key: \"%*s\"%s",[m
[31m-                       ngx_hex_dump(buf, key[i].name, 16) - buf, buf,[m
[31m-                       (i == 0) ? " (default)" : "");[m
[31m-[m
[31m-        HMAC_Init_ex(hctx, key[i].hmac_key, 16,[m
[31m-                     ngx_ssl_session_ticket_md(), NULL);[m
[31m-        EVP_DecryptInit_ex(ectx, EVP_aes_128_cbc(), NULL, key[i].aes_key, iv);[m
[31m-[m
[31m-        return (i == 0) ? 1 : 2 /* renew */;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths)[m
[31m-{[m
[31m-    if (paths) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                      "\"ssl_session_ticket_keys\" ignored, not supported");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_cleanup_ctx(void *data)[m
[31m-{[m
[31m-    ngx_ssl_t  *ssl = data;[m
[31m-[m
[31m-    SSL_CTX_free(ssl->ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_check_host(ngx_connection_t *c, ngx_str_t *name)[m
[31m-{[m
[31m-    X509   *cert;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10002002L[m
[31m-[m
[31m-    /* X509_check_host() is only available in OpenSSL 1.0.2+ */[m
[31m-[m
[31m-    if (name->len == 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_check_host(cert, (char *) name->data, name->len, 0, NULL) != 1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "X509_check_host(): no match");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "X509_check_host(): match");[m
[31m-[m
[31m-    goto found;[m
[31m-[m
[31m-#else[m
[31m-    {[m
[31m-    int                      n, i;[m
[31m-    X509_NAME               *sname;[m
[31m-    ASN1_STRING             *str;[m
[31m-    X509_NAME_ENTRY         *entry;[m
[31m-    GENERAL_NAME            *altname;[m
[31m-    STACK_OF(GENERAL_NAME)  *altnames;[m
[31m-[m
[31m-    /*[m
[31m-     * As per RFC6125 and RFC2818, we check subjectAltName extension,[m
[31m-     * and if it's not present - commonName in Subject is checked.[m
[31m-     */[m
[31m-[m
[31m-    altnames = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);[m
[31m-[m
[31m-    if (altnames) {[m
[31m-        n = sk_GENERAL_NAME_num(altnames);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            altname = sk_GENERAL_NAME_value(altnames, i);[m
[31m-[m
[31m-            if (altname->type != GEN_DNS) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            str = altname->d.dNSName;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL subjectAltName: \"%*s\"",[m
[31m-                           ASN1_STRING_length(str), ASN1_STRING_data(str));[m
[31m-[m
[31m-            if (ngx_ssl_check_name(name, str) == NGX_OK) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                               "SSL subjectAltName: match");[m
[31m-                GENERAL_NAMES_free(altnames);[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL subjectAltName: no match");[m
[31m-[m
[31m-        GENERAL_NAMES_free(altnames);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * If there is no subjectAltName extension, check commonName[m
[31m-     * in Subject.  While RFC2818 requires to only check "most specific"[m
[31m-     * CN, both Apache and OpenSSL check all CNs, and so do we.[m
[31m-     */[m
[31m-[m
[31m-    sname = X509_get_subject_name(cert);[m
[31m-[m
[31m-    if (sname == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    i = -1;[m
[31m-    for ( ;; ) {[m
[31m-        i = X509_NAME_get_index_by_NID(sname, NID_commonName, i);[m
[31m-[m
[31m-        if (i < 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        entry = X509_NAME_get_entry(sname, i);[m
[31m-        str = X509_NAME_ENTRY_get_data(entry);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL commonName: \"%*s\"",[m
[31m-                       ASN1_STRING_length(str), ASN1_STRING_data(str));[m
[31m-[m
[31m-        if (ngx_ssl_check_name(name, str) == NGX_OK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL commonName: match");[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL commonName: no match");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10002002L[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *pattern)[m
[31m-{[m
[31m-    u_char  *s, *p, *end;[m
[31m-    size_t   slen, plen;[m
[31m-[m
[31m-    s = name->data;[m
[31m-    slen = name->len;[m
[31m-[m
[31m-    p = ASN1_STRING_data(pattern);[m
[31m-    plen = ASN1_STRING_length(pattern);[m
[31m-[m
[31m-    if (slen == plen && ngx_strncasecmp(s, p, plen) == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (plen > 2 && p[0] == '*' && p[1] == '.') {[m
[31m-        plen -= 1;[m
[31m-        p += 1;[m
[31m-[m
[31m-        end = s + slen;[m
[31m-        s = ngx_strlchr(s, end, '.');[m
[31m-[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        slen = end - s;[m
[31m-[m
[31m-        if (plen == slen && ngx_strncasecmp(s, p, plen) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_protocol(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    s->data = (u_char *) SSL_get_version(c->ssl->connection);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_cipher_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    s->data = (u_char *) SSL_get_cipher_name(c->ssl->connection);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_session_id(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    u_char        *buf;[m
[31m-    SSL_SESSION   *sess;[m
[31m-    unsigned int   len;[m
[31m-[m
[31m-    sess = SSL_get0_session(c->ssl->connection);[m
[31m-    if (sess == NULL) {[m
[31m-        s->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    buf = (u_char *) SSL_SESSION_get_id(sess, &len);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    buf = sess->session_id;[m
[31m-    len = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->len = 2 * len;[m
[31m-    s->data = ngx_pnalloc(pool, 2 * len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(s->data, buf, len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_session_reused(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    if (SSL_session_reused(c->ssl->connection)) {[m
[31m-        ngx_str_set(s, "r");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(s, ".");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    const char  *servername;[m
[31m-[m
[31m-    servername = SSL_get_servername(c->ssl->connection,[m
[31m-                                    TLSEXT_NAMETYPE_host_name);[m
[31m-    if (servername) {[m
[31m-        s->data = (u_char *) servername;[m
[31m-        s->len = ngx_strlen(servername);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->len = 0;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_raw_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    BIO     *bio;[m
[31m-    X509    *cert;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed");[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PEM_write_bio_X509(bio, cert) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "PEM_write_bio_X509() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = BIO_pending(bio);[m
[31m-    s->len = len;[m
[31m-[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    BIO_read(bio, s->data, len);[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    size_t       len;[m
[31m-    ngx_uint_t   i;[m
[31m-    ngx_str_t    cert;[m
[31m-[m
[31m-    if (ngx_ssl_get_raw_certificate(c, pool, &cert) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cert.len == 0) {[m
[31m-        s->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = cert.len - 1;[m
[31m-[m
[31m-    for (i = 0; i < cert.len - 1; i++) {[m
[31m-        if (cert.data[i] == LF) {[m
[31m-            len++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = s->data;[m
[31m-[m
[31m-    for (i = 0; i < cert.len - 1; i++) {[m
[31m-        *p++ = cert.data[i];[m
[31m-        if (cert.data[i] == LF) {[m
[31m-            *p++ = '\t';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    char       *p;[m
[31m-    size_t      len;[m
[31m-    X509       *cert;[m
[31m-    X509_NAME  *name;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    name = X509_get_subject_name(cert);[m
[31m-    if (name == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = X509_NAME_oneline(name, NULL, 0);[m
[31m-[m
[31m-    for (len = 0; p[len]; len++) { /* void */ }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        OPENSSL_free(p);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    OPENSSL_free(p);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    char       *p;[m
[31m-    size_t      len;[m
[31m-    X509       *cert;[m
[31m-    X509_NAME  *name;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    name = X509_get_issuer_name(cert);[m
[31m-    if (name == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = X509_NAME_oneline(name, NULL, 0);[m
[31m-[m
[31m-    for (len = 0; p[len]; len++) { /* void */ }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        OPENSSL_free(p);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    OPENSSL_free(p);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    X509    *cert;[m
[31m-    BIO     *bio;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    i2a_ASN1_INTEGER(bio, X509_get_serialNumber(cert));[m
[31m-    len = BIO_pending(bio);[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        BIO_free(bio);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    BIO_read(bio, s->data, len);[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    X509          *cert;[m
[31m-    unsigned int   len;[m
[31m-    u_char         buf[EVP_MAX_MD_SIZE];[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!X509_digest(cert, EVP_sha1(), buf, &len)) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->len = 2 * len;[m
[31m-    s->data = ngx_pnalloc(pool, 2 * len);[m
[31m-    if (s->data == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(s->data, buf, len);[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    X509  *cert;[m
[31m-[m
[31m-    if (SSL_get_verify_result(c->ssl->connection) != X509_V_OK) {[m
[31m-        ngx_str_set(s, "FAILED");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-    if (cert) {[m
[31m-        ngx_str_set(s, "SUCCESS");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(s, "NONE");[m
[31m-    }[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_openssl_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_openssl_conf_t  *oscf;[m
[31m-[m
[31m-    oscf = ngx_pcalloc(cycle->pool, sizeof(ngx_openssl_conf_t));[m
[31m-    if (oscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     oscf->engine = 0;[m
[31m-     */[m
[31m-[m
[31m-    return oscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-[m
[31m-    ngx_openssl_conf_t *oscf = conf;[m
[31m-[m
[31m-    ENGINE     *engine;[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (oscf->engine) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    oscf->engine = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    engine = ENGINE_by_id((const char *) value[1].data);[m
[31m-[m
[31m-    if (engine == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "ENGINE_by_id(\"%V\") failed", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ENGINE_set_default(engine, ENGINE_METHOD_ALL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "ENGINE_set_default(\"%V\", ENGINE_METHOD_ALL) failed",[m
[31m-                      &value[1]);[m
[31m-[m
[31m-        ENGINE_free(engine);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ENGINE_free(engine);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    return "is not supported";[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_openssl_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10100003L[m
[31m-[m
[31m-    EVP_cleanup();[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-    ENGINE_cleanup();[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.c.orig[m
[1mdeleted file mode 100644[m
[1mindex de10296..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,3570 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_PASSWORD_BUFFER_SIZE  4096[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  engine;   /* unsigned  engine:1; */[m
[31m-} ngx_openssl_conf_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_ssl_password_callback(char *buf, int size, int rwflag,[m
[31m-    void *userdata);[m
[31m-static int ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store);[m
[31m-static void ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where,[m
[31m-    int ret);[m
[31m-static void ngx_ssl_passwords_cleanup(void *data);[m
[31m-static void ngx_ssl_handshake_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n);[m
[31m-static void ngx_ssl_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_ssl_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_ssl_shutdown_handler(ngx_event_t *ev);[m
[31m-static void ngx_ssl_connection_error(ngx_connection_t *c, int sslerr,[m
[31m-    ngx_err_t err, char *text);[m
[31m-static void ngx_ssl_clear_error(ngx_log_t *log);[m
[31m-[m
[31m-static ngx_int_t ngx_ssl_session_id_context(ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *sess_ctx);[m
[31m-ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data);[m
[31m-static int ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-    ngx_ssl_session_t *sess);[m
[31m-static ngx_ssl_session_t *ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char *id, int len, int *copy);[m
[31m-static void ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess);[m
[31m-static void ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache,[m
[31m-    ngx_slab_pool_t *shpool, ngx_uint_t n);[m
[31m-static void ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-static int ngx_ssl_session_ticket_key_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx,[m
[31m-    HMAC_CTX *hctx, int enc);[m
[31m-#endif[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10002002L[m
[31m-static ngx_int_t ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *str);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_openssl_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void ngx_openssl_exit(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_openssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl_engine"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_openssl_engine,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_openssl_module_ctx = {[m
[31m-    ngx_string("openssl"),[m
[31m-    ngx_openssl_create_conf,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_openssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_openssl_module_ctx,               /* module context */[m
[31m-    ngx_openssl_commands,                  /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    ngx_openssl_exit,                      /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int  ngx_ssl_connection_index;[m
[31m-int  ngx_ssl_server_conf_index;[m
[31m-int  ngx_ssl_session_cache_index;[m
[31m-int  ngx_ssl_session_ticket_keys_index;[m
[31m-int  ngx_ssl_certificate_index;[m
[31m-int  ngx_ssl_stapling_index;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_init(ngx_log_t *log)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-[m
[31m-    OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG, NULL);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#ifndef OPENSSL_IS_BORINGSSL[m
[31m-    OPENSSL_config(NULL);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_library_init();[m
[31m-    SSL_load_error_strings();[m
[31m-[m
[31m-    OpenSSL_add_all_algorithms();[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-#ifndef SSL_OP_NO_COMPRESSION[m
[31m-    {[m
[31m-    /*[m
[31m-     * Disable gzip compression in OpenSSL prior to 1.0.0 version,[m
[31m-     * this saves about 522K per connection.[m
[31m-     */[m
[31m-    int                  n;[m
[31m-    STACK_OF(SSL_COMP)  *ssl_comp_methods;[m
[31m-[m
[31m-    ssl_comp_methods = SSL_COMP_get_compression_methods();[m
[31m-    n = sk_SSL_COMP_num(ssl_comp_methods);[m
[31m-[m
[31m-    while (n--) {[m
[31m-        (void) sk_SSL_COMP_pop(ssl_comp_methods);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    ngx_ssl_connection_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_connection_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0, "SSL_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_server_conf_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                         NULL);[m
[31m-    if (ngx_ssl_server_conf_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_session_cache_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                           NULL);[m
[31m-    if (ngx_ssl_session_cache_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_session_ticket_keys_index = SSL_CTX_get_ex_new_index(0, NULL, NULL,[m
[31m-                                                                 NULL, NULL);[m
[31m-    if (ngx_ssl_session_ticket_keys_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_certificate_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                         NULL);[m
[31m-    if (ngx_ssl_certificate_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_stapling_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                      NULL);[m
[31m-    if (ngx_ssl_stapling_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data)[m
[31m-{[m
[31m-    ssl->ctx = SSL_CTX_new(SSLv23_method());[m
[31m-[m
[31m-    if (ssl->ctx == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "SSL_CTX_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_server_conf_index, data) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl->buffer_size = NGX_SSL_BUFSIZE;[m
[31m-[m
[31m-    /* client side options */[m
[31m-[m
[31m-#ifdef SSL_OP_MICROSOFT_SESS_ID_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_SESS_ID_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_NETSCAPE_CHALLENGE_BUG);[m
[31m-#endif[m
[31m-[m
[31m-    /* server side options */[m
[31m-[m
[31m-#ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING[m
[31m-    /* this option allow a potential SSL 2.0 rollback (CAN-2005-2969) */[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MSIE_SSLV2_RSA_PADDING);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLEAY_080_CLIENT_DH_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_TLS_D5_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_D5_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_TLS_BLOCK_PADDING_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_BLOCK_PADDING_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_DH_USE);[m
[31m-[m
[31m-#ifdef SSL_CTRL_CLEAR_OPTIONS[m
[31m-    /* only in 0.9.8m+ */[m
[31m-    SSL_CTX_clear_options(ssl->ctx,[m
[31m-                          SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1);[m
[31m-#endif[m
[31m-[m
[31m-    if (!(protocols & NGX_SSL_SSLv2)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv2);[m
[31m-    }[m
[31m-    if (!(protocols & NGX_SSL_SSLv3)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv3);[m
[31m-    }[m
[31m-    if (!(protocols & NGX_SSL_TLSv1)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1);[m
[31m-    }[m
[31m-#ifdef SSL_OP_NO_TLSv1_1[m
[31m-    SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_1);[m
[31m-    if (!(protocols & NGX_SSL_TLSv1_1)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_1);[m
[31m-    }[m
[31m-#endif[m
[31m-#ifdef SSL_OP_NO_TLSv1_2[m
[31m-    SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_2);[m
[31m-    if (!(protocols & NGX_SSL_TLSv1_2)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_2);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_NO_COMPRESSION[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_COMPRESSION);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_MODE_RELEASE_BUFFERS[m
[31m-    SSL_CTX_set_mode(ssl->ctx, SSL_MODE_RELEASE_BUFFERS);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_MODE_NO_AUTO_CHAIN[m
[31m-    SSL_CTX_set_mode(ssl->ctx, SSL_MODE_NO_AUTO_CHAIN);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_CTX_set_read_ahead(ssl->ctx, 1);[m
[31m-[m
[31m-    SSL_CTX_set_info_callback(ssl->ctx, ngx_ssl_info_callback);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_str_t *key, ngx_array_t *passwords)[m
[31m-{[m
[31m-    BIO         *bio;[m
[31m-    X509        *x509;[m
[31m-    u_long       n;[m
[31m-    ngx_str_t   *pwd;[m
[31m-    ngx_uint_t   tries;[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we can't use SSL_CTX_use_certificate_chain_file() as it doesn't[m
[31m-     * allow to access certificate later from SSL_CTX, so we reimplement[m
[31m-     * it here[m
[31m-     */[m
[31m-[m
[31m-    bio = BIO_new_file((char *) cert->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL);[m
[31m-    if (x509 == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "PEM_read_bio_X509_AUX(\"%s\") failed", cert->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_use_certificate(ssl->ctx, x509) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_use_certificate(\"%s\") failed", cert->data);[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_certificate_index, x509)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_free(x509);[m
[31m-[m
[31m-    /* read rest of the chain */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);[m
[31m-        if (x509 == NULL) {[m
[31m-            n = ERR_peek_last_error();[m
[31m-[m
[31m-            if (ERR_GET_LIB(n) == ERR_LIB_PEM[m
[31m-                && ERR_GET_REASON(n) == PEM_R_NO_START_LINE)[m
[31m-            {[m
[31m-                /* end of file */[m
[31m-                ERR_clear_error();[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* some real error */[m
[31m-[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "PEM_read_bio_X509(\"%s\") failed", cert->data);[m
[31m-            BIO_free(bio);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (SSL_CTX_add_extra_chain_cert(ssl->ctx, x509) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_add_extra_chain_cert(\"%s\") failed",[m
[31m-                          cert->data);[m
[31m-            X509_free(x509);[m
[31m-            BIO_free(bio);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    if (ngx_strncmp(key->data, "engine:", sizeof("engine:") - 1) == 0) {[m
[31m-[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-[m
[31m-        u_char      *p, *last;[m
[31m-        ENGINE      *engine;[m
[31m-        EVP_PKEY    *pkey;[m
[31m-[m
[31m-        p = key->data + sizeof("engine:") - 1;[m
[31m-        last = (u_char *) ngx_strchr(p, ':');[m
[31m-[m
[31m-        if (last == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid syntax in \"%V\"", key);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *last = '\0';[m
[31m-[m
[31m-        engine = ENGINE_by_id((char *) p);[m
[31m-[m
[31m-        if (engine == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "ENGINE_by_id(\"%s\") failed", p);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *last++ = ':';[m
[31m-[m
[31m-        pkey = ENGINE_load_private_key(engine, (char *) last, 0, 0);[m
[31m-[m
[31m-        if (pkey == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "ENGINE_load_private_key(\"%s\") failed", last);[m
[31m-            ENGINE_free(engine);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ENGINE_free(engine);[m
[31m-[m
[31m-        if (SSL_CTX_use_PrivateKey(ssl->ctx, pkey) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_use_PrivateKey(\"%s\") failed", last);[m
[31m-            EVP_PKEY_free(pkey);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        EVP_PKEY_free(pkey);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "loading \"engine:...\" certificate keys "[m
[31m-                           "is not supported");[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, key, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (passwords) {[m
[31m-        tries = passwords->nelts;[m
[31m-        pwd = passwords->elts;[m
[31m-[m
[31m-        SSL_CTX_set_default_passwd_cb(ssl->ctx, ngx_ssl_password_callback);[m
[31m-        SSL_CTX_set_default_passwd_cb_userdata(ssl->ctx, pwd);[m
[31m-[m
[31m-    } else {[m
[31m-        tries = 1;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        pwd = NULL;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (SSL_CTX_use_PrivateKey_file(ssl->ctx, (char *) key->data,[m
[31m-                                        SSL_FILETYPE_PEM)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (--tries) {[m
[31m-            ERR_clear_error();[m
[31m-            SSL_CTX_set_default_passwd_cb_userdata(ssl->ctx, ++pwd);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_use_PrivateKey_file(\"%s\") failed", key->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_default_passwd_cb(ssl->ctx, NULL);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_password_callback(char *buf, int size, int rwflag, void *userdata)[m
[31m-{[m
[31m-    ngx_str_t *pwd = userdata;[m
[31m-[m
[31m-    if (rwflag) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "ngx_ssl_password_callback() is called for encryption");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (pwd->len > (size_t) size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                      "password is truncated to %d bytes", size);[m
[31m-    } else {[m
[31m-        size = pwd->len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(buf, pwd->data, size);[m
[31m-[m
[31m-    return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_int_t depth)[m
[31m-{[m
[31m-    STACK_OF(X509_NAME)  *list;[m
[31m-[m
[31m-    SSL_CTX_set_verify(ssl->ctx, SSL_VERIFY_PEER, ngx_ssl_verify_callback);[m
[31m-[m
[31m-    SSL_CTX_set_verify_depth(ssl->ctx, depth);[m
[31m-[m
[31m-    if (cert->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_load_verify_locations(\"%s\") failed",[m
[31m-                      cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_CTX_load_verify_locations() may leave errors in the error queue[m
[31m-     * while returning success[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    list = SSL_load_client_CA_file((char *) cert->data);[m
[31m-[m
[31m-    if (list == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_load_client_CA_file(\"%s\") failed", cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * before 0.9.7h and 0.9.8 SSL_load_client_CA_file()[m
[31m-     * always leaved an error in the error queue[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    SSL_CTX_set_client_CA_list(ssl->ctx, list);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_trusted_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_int_t depth)[m
[31m-{[m
[31m-    SSL_CTX_set_verify_depth(ssl->ctx, depth);[m
[31m-[m
[31m-    if (cert->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_load_verify_locations(\"%s\") failed",[m
[31m-                      cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_CTX_load_verify_locations() may leave errors in the error queue[m
[31m-     * while returning success[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl)[m
[31m-{[m
[31m-    X509_STORE   *store;[m
[31m-    X509_LOOKUP  *lookup;[m
[31m-[m
[31m-    if (crl->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, crl, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    store = SSL_CTX_get_cert_store(ssl->ctx);[m
[31m-[m
[31m-    if (store == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_get_cert_store() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());[m
[31m-[m
[31m-    if (lookup == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_add_lookup() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_LOOKUP_load_file(lookup, (char *) crl->data, X509_FILETYPE_PEM)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_LOOKUP_load_file(\"%s\") failed", crl->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_STORE_set_flags(store,[m
[31m-                         X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    char              *subject, *issuer;[m
[31m-    int                err, depth;[m
[31m-    X509              *cert;[m
[31m-    X509_NAME         *sname, *iname;[m
[31m-    ngx_connection_t  *c;[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    ssl_conn = X509_STORE_CTX_get_ex_data(x509_store,[m
[31m-                                          SSL_get_ex_data_X509_STORE_CTX_idx());[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    cert = X509_STORE_CTX_get_current_cert(x509_store);[m
[31m-    err = X509_STORE_CTX_get_error(x509_store);[m
[31m-    depth = X509_STORE_CTX_get_error_depth(x509_store);[m
[31m-[m
[31m-    sname = X509_get_subject_name(cert);[m
[31m-    subject = sname ? X509_NAME_oneline(sname, NULL, 0) : "(none)";[m
[31m-[m
[31m-    iname = X509_get_issuer_name(cert);[m
[31m-    issuer = iname ? X509_NAME_oneline(iname, NULL, 0) : "(none)";[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "verify:%d, error:%d, depth:%d, "[m
[31m-                   "subject:\"%s\", issuer:\"%s\"",[m
[31m-                   ok, err, depth, subject, issuer);[m
[31m-[m
[31m-    if (sname) {[m
[31m-        OPENSSL_free(subject);[m
[31m-    }[m
[31m-[m
[31m-    if (iname) {[m
[31m-        OPENSSL_free(issuer);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where, int ret)[m
[31m-{[m
[31m-    BIO               *rbio, *wbio;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (where & SSL_CB_HANDSHAKE_START) {[m
[31m-        c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-        if (c->ssl->handshaked) {[m
[31m-            c->ssl->renegotiation = 1;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL renegotiation");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((where & SSL_CB_ACCEPT_LOOP) == SSL_CB_ACCEPT_LOOP) {[m
[31m-        c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-        if (!c->ssl->handshake_buffer_set) {[m
[31m-            /*[m
[31m-             * By default OpenSSL uses 4k buffer during a handshake,[m
[31m-             * which is too low for long certificate chains and might[m
[31m-             * result in extra round-trips.[m
[31m-             *[m
[31m-             * To adjust a buffer size we detect that buffering was added[m
[31m-             * to write side of the connection by comparing rbio and wbio.[m
[31m-             * If they are different, we assume that it's due to buffering[m
[31m-             * added to wbio, and set buffer size.[m
[31m-             */[m
[31m-[m
[31m-            rbio = SSL_get_rbio((ngx_ssl_conn_t *) ssl_conn);[m
[31m-            wbio = SSL_get_wbio((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-            if (rbio != wbio) {[m
[31m-                (void) BIO_set_write_buffer_size(wbio, NGX_SSL_BUFSIZE);[m
[31m-                c->ssl->handshake_buffer_set = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-RSA *[m
[31m-ngx_ssl_rsa512_key_callback(ngx_ssl_conn_t *ssl_conn, int is_export,[m
[31m-    int key_length)[m
[31m-{[m
[31m-    static RSA  *key;[m
[31m-[m
[31m-    if (key_length != 512) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100003L && !defined OPENSSL_NO_DEPRECATED)[m
[31m-[m
[31m-    if (key == NULL) {[m
[31m-        key = RSA_generate_key(512, RSA_F4, NULL, NULL);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file)[m
[31m-{[m
[31m-    u_char              *p, *last, *end;[m
[31m-    size_t               len;[m
[31m-    ssize_t              n;[m
[31m-    ngx_fd_t             fd;[m
[31m-    ngx_str_t           *pwd;[m
[31m-    ngx_array_t         *passwords;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-    u_char               buf[NGX_SSL_PASSWORD_BUFFER_SIZE];[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->temp_pool, 0);[m
[31m-    passwords = ngx_array_create(cf->temp_pool, 4, sizeof(ngx_str_t));[m
[31m-[m
[31m-    if (cln == NULL || passwords == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_passwords_cleanup;[m
[31m-    cln->data = passwords;[m
[31m-[m
[31m-    fd = ngx_open_file(file->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           ngx_open_file_n " \"%s\" failed", file->data);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    last = buf;[m
[31m-[m
[31m-    do {[m
[31m-        n = ngx_read_fd(fd, last, NGX_SSL_PASSWORD_BUFFER_SIZE - len);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_read_fd_n " \"%s\" failed", file->data);[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        end = last + n;[m
[31m-[m
[31m-        if (len && n == 0) {[m
[31m-            *end++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            last = ngx_strlchr(last, end, LF);[m
[31m-[m
[31m-            if (last == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            len = last++ - p;[m
[31m-[m
[31m-            if (len && p[len - 1] == CR) {[m
[31m-                len--;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                pwd = ngx_array_push(passwords);[m
[31m-                if (pwd == NULL) {[m
[31m-                    passwords = NULL;[m
[31m-                    goto cleanup;[m
[31m-                }[m
[31m-[m
[31m-                pwd->len = len;[m
[31m-                pwd->data = ngx_pnalloc(cf->temp_pool, len);[m
[31m-[m
[31m-                if (pwd->data == NULL) {[m
[31m-                    passwords->nelts--;[m
[31m-                    passwords = NULL;[m
[31m-                    goto cleanup;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(pwd->data, p, len);[m
[31m-            }[m
[31m-[m
[31m-            p = last;[m
[31m-        }[m
[31m-[m
[31m-        len = end - p;[m
[31m-[m
[31m-        if (len == NGX_SSL_PASSWORD_BUFFER_SIZE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "too long line in \"%s\"", file->data);[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memmove(buf, p, len);[m
[31m-        last = buf + len;[m
[31m-[m
[31m-    } while (n != 0);[m
[31m-[m
[31m-    if (passwords->nelts == 0) {[m
[31m-        pwd = ngx_array_push(passwords);[m
[31m-        if (pwd == NULL) {[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(pwd, sizeof(ngx_str_t));[m
[31m-    }[m
[31m-[m
[31m-cleanup:[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, ngx_errno,[m
[31m-                           ngx_close_file_n " \"%s\" failed", file->data);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(buf, NGX_SSL_PASSWORD_BUFFER_SIZE);[m
[31m-[m
[31m-    return passwords;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_passwords_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_array_t *passwords = data;[m
[31m-[m
[31m-    ngx_str_t   *pwd;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    pwd = passwords->elts;[m
[31m-[m
[31m-    for (i = 0; i < passwords->nelts; i++) {[m
[31m-        ngx_memzero(pwd[i].data, pwd[i].len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_dhparam(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file)[m
[31m-{[m
[31m-    DH   *dh;[m
[31m-    BIO  *bio;[m
[31m-[m
[31m-    /*[m
[31m-     * -----BEGIN DH PARAMETERS-----[m
[31m-     * MIGHAoGBALu8LcrYRnSQfEP89YDpz9vZWKP1aLQtSwju1OsPs1BMbAMCducQgAxc[m
[31m-     * y7qokiYUxb7spWWl/fHSh6K8BJvmd4Bg6RqSp1fjBI9osHb302zI8pul34HcLKcl[m
[31m-     * 7OZicMyaUDXYzs7vnqAnSmOrHlj6/UmI0PZdFGdX2gcd8EXP4WubAgEC[m
[31m-     * -----END DH PARAMETERS-----[m
[31m-     */[m
[31m-[m
[31m-    static unsigned char dh1024_p[] = {[m
[31m-        0xBB, 0xBC, 0x2D, 0xCA, 0xD8, 0x46, 0x74, 0x90, 0x7C, 0x43, 0xFC, 0xF5,[m
[31m-        0x80, 0xE9, 0xCF, 0xDB, 0xD9, 0x58, 0xA3, 0xF5, 0x68, 0xB4, 0x2D, 0x4B,[m
[31m-        0x08, 0xEE, 0xD4, 0xEB, 0x0F, 0xB3, 0x50, 0x4C, 0x6C, 0x03, 0x02, 0x76,[m
[31m-        0xE7, 0x10, 0x80, 0x0C, 0x5C, 0xCB, 0xBA, 0xA8, 0x92, 0x26, 0x14, 0xC5,[m
[31m-        0xBE, 0xEC, 0xA5, 0x65, 0xA5, 0xFD, 0xF1, 0xD2, 0x87, 0xA2, 0xBC, 0x04,[m
[31m-        0x9B, 0xE6, 0x77, 0x80, 0x60, 0xE9, 0x1A, 0x92, 0xA7, 0x57, 0xE3, 0x04,[m
[31m-        0x8F, 0x68, 0xB0, 0x76, 0xF7, 0xD3, 0x6C, 0xC8, 0xF2, 0x9B, 0xA5, 0xDF,[m
[31m-        0x81, 0xDC, 0x2C, 0xA7, 0x25, 0xEC, 0xE6, 0x62, 0x70, 0xCC, 0x9A, 0x50,[m
[31m-        0x35, 0xD8, 0xCE, 0xCE, 0xEF, 0x9E, 0xA0, 0x27, 0x4A, 0x63, 0xAB, 0x1E,[m
[31m-        0x58, 0xFA, 0xFD, 0x49, 0x88, 0xD0, 0xF6, 0x5D, 0x14, 0x67, 0x57, 0xDA,[m
[31m-        0x07, 0x1D, 0xF0, 0x45, 0xCF, 0xE1, 0x6B, 0x9B[m
[31m-    };[m
[31m-[m
[31m-    static unsigned char dh1024_g[] = { 0x02 };[m
[31m-[m
[31m-[m
[31m-    if (file->len == 0) {[m
[31m-[m
[31m-        dh = DH_new();[m
[31m-        if (dh == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "DH_new() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);[m
[31m-        dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);[m
[31m-[m
[31m-        if (dh->p == NULL || dh->g == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "BN_bin2bn() failed");[m
[31m-            DH_free(dh);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        SSL_CTX_set_tmp_dh(ssl->ctx, dh);[m
[31m-[m
[31m-        DH_free(dh);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_file((char *) file->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", file->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);[m
[31m-    if (dh == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "PEM_read_bio_DHparams(\"%s\") failed", file->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_tmp_dh(ssl->ctx, dh);[m
[31m-[m
[31m-    DH_free(dh);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_ecdh_curve(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *name)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-#ifndef OPENSSL_NO_ECDH[m
[31m-    int      nid;[m
[31m-    EC_KEY  *ecdh;[m
[31m-[m
[31m-    /*[m
[31m-     * Elliptic-Curve Diffie-Hellman parameters are either "named curves"[m
[31m-     * from RFC 4492 section 5.1.1, or explicitly described curves over[m
[31m-     * binary fields. OpenSSL only supports the "named curves", which provide[m
[31m-     * maximum interoperability.[m
[31m-     */[m
[31m-[m
[31m-    nid = OBJ_sn2nid((const char *) name->data);[m
[31m-    if (nid == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "Unknown curve name \"%s\"", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ecdh = EC_KEY_new_by_curve_name(nid);[m
[31m-    if (ecdh == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "Unable to create curve \"%s\"", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_ECDH_USE);[m
[31m-[m
[31m-    SSL_CTX_set_tmp_ecdh(ssl->ctx, ecdh);[m
[31m-[m
[31m-    EC_KEY_free(ecdh);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_ssl_connection_t  *sc;[m
[31m-[m
[31m-    sc = ngx_pcalloc(c->pool, sizeof(ngx_ssl_connection_t));[m
[31m-    if (sc == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sc->buffer = ((flags & NGX_SSL_BUFFER) != 0);[m
[31m-    sc->buffer_size = ssl->buffer_size;[m
[31m-[m
[31m-    sc->session_ctx = ssl->ctx;[m
[31m-[m
[31m-    sc->connection = SSL_new(ssl->ctx);[m
[31m-[m
[31m-    if (sc->connection == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_set_fd(sc->connection, c->fd) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_fd() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_SSL_CLIENT) {[m
[31m-        SSL_set_connect_state(sc->connection);[m
[31m-[m
[31m-    } else {[m
[31m-        SSL_set_accept_state(sc->connection);[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_set_ex_data(sc->connection, ngx_ssl_connection_index, c) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl = sc;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session)[m
[31m-{[m
[31m-    if (session) {[m
[31m-        if (SSL_set_session(c->ssl->connection, session) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_session() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_handshake(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        n, sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    n = SSL_do_handshake(c->ssl->connection);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        char         buf[129], *s, *d;[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10000000L[m
[31m-        const[m
[31m-#endif[m
[31m-        SSL_CIPHER  *cipher;[m
[31m-[m
[31m-        cipher = SSL_get_current_cipher(c->ssl->connection);[m
[31m-[m
[31m-        if (cipher) {[m
[31m-            SSL_CIPHER_description(cipher, &buf[1], 128);[m
[31m-[m
[31m-            for (s = &buf[1], d = buf; *s; s++) {[m
[31m-                if (*s == ' ' && *d == ' ') {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (*s == LF || *s == CR) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                *++d = *s;[m
[31m-            }[m
[31m-[m
[31m-            if (*d != ' ') {[m
[31m-                d++;[m
[31m-            }[m
[31m-[m
[31m-            *d = '\0';[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL: %s, cipher: \"%s\"",[m
[31m-                           SSL_get_version(c->ssl->connection), &buf[1]);[m
[31m-[m
[31m-            if (SSL_session_reused(c->ssl->connection)) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                               "SSL reused session");[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL no shared ciphers");[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c->ssl->handshaked = 1;[m
[31m-[m
[31m-        c->recv = ngx_ssl_recv;[m
[31m-        c->send = ngx_ssl_write;[m
[31m-        c->recv_chain = ngx_ssl_recv_chain;[m
[31m-        c->send_chain = ngx_ssl_send_chain;[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10100000L[m
[31m-#ifdef SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS[m
[31m-[m
[31m-        /* initial handshake done, disable renegotiation (CVE-2009-3555) */[m
[31m-        if (c->ssl->connection->s3) {[m
[31m-            c->ssl->connection->s3->flags |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-        c->read->ready = 0;[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->write->ready = 0;[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-    c->read->eof = 1;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {[m
[31m-        ngx_connection_error(c, err,[m
[31m-                             "peer closed connection in SSL handshake");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->read->error = 1;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_do_handshake() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_handshake_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL handshake handler: %d", ev->write);[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->ssl->handler(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_handshake(c) == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit)[m
[31m-{[m
[31m-    u_char     *last;[m
[31m-    ssize_t     n, bytes, size;[m
[31m-    ngx_buf_t  *b;[m
[31m-[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-    last = b->last;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        size = b->end - last;[m
[31m-[m
[31m-        if (limit) {[m
[31m-            if (bytes >= limit) {[m
[31m-                return bytes;[m
[31m-            }[m
[31m-[m
[31m-            if (bytes + size > limit) {[m
[31m-                size = (ssize_t) (limit - bytes);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_ssl_recv(c, last, size);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            last += n;[m
[31m-            bytes += n;[m
[31m-[m
[31m-            if (last == b->end) {[m
[31m-                cl = cl->next;[m
[31m-[m
[31m-                if (cl == NULL) {[m
[31m-                    return bytes;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-                last = b->last;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bytes) {[m
[31m-[m
[31m-            if (n == 0 || n == NGX_ERROR) {[m
[31m-                c->read->ready = 1;[m
[31m-            }[m
[31m-[m
[31m-            return bytes;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int  n, bytes;[m
[31m-[m
[31m-    if (c->ssl->last == NGX_ERROR) {[m
[31m-        c->read->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (c->ssl->last == NGX_DONE) {[m
[31m-        c->read->ready = 0;[m
[31m-        c->read->eof = 1;[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_read() may return data in parts, so try to read[m
[31m-     * until SSL_read() would return no data[m
[31m-     */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = SSL_read(c->ssl->connection, buf, size);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_read: %d", n);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            bytes += n;[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->last = ngx_ssl_handle_recv(c, n);[m
[31m-[m
[31m-        if (c->ssl->last == NGX_OK) {[m
[31m-[m
[31m-            size -= n;[m
[31m-[m
[31m-            if (size == 0) {[m
[31m-                c->read->ready = 1;[m
[31m-                return bytes;[m
[31m-            }[m
[31m-[m
[31m-            buf += n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bytes) {[m
[31m-            if (c->ssl->last != NGX_AGAIN) {[m
[31m-                c->read->ready = 1;[m
[31m-            }[m
[31m-[m
[31m-            return bytes;[m
[31m-        }[m
[31m-[m
[31m-        switch (c->ssl->last) {[m
[31m-[m
[31m-        case NGX_DONE:[m
[31m-            c->read->ready = 0;[m
[31m-            c->read->eof = 1;[m
[31m-            return 0;[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            c->read->error = 1;[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case NGX_AGAIN:[m
[31m-            return c->ssl->last;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_handle_recv(ngx_connection_t *c, int n)[m
[31m-{[m
[31m-    int        sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (c->ssl->renegotiation) {[m
[31m-        /*[m
[31m-         * disable renegotiation (CVE-2009-3555):[m
[31m-         * OpenSSL (at least up to 0.9.8l) does not handle disabled[m
[31m-         * renegotiation gracefully, so drop connection here[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, c->log, 0, "SSL renegotiation disabled");[m
[31m-[m
[31m-        while (ERR_peek_error()) {[m
[31m-            ngx_ssl_error(NGX_LOG_DEBUG, c->log, 0,[m
[31m-                          "ignoring stale global SSL error");[m
[31m-        }[m
[31m-[m
[31m-        ERR_clear_error();[m
[31m-[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-        c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-[m
[31m-        if (c->ssl->saved_write_handler) {[m
[31m-[m
[31m-            c->write->handler = c->ssl->saved_write_handler;[m
[31m-            c->ssl->saved_write_handler = NULL;[m
[31m-            c->write->ready = 1;[m
[31m-[m
[31m-            if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_post_event(c->write, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-        c->read->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "peer started SSL renegotiation");[m
[31m-[m
[31m-        c->write->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not set the timer because there is already the read event timer[m
[31m-         */[m
[31m-[m
[31m-        if (c->ssl->saved_write_handler == NULL) {[m
[31m-            c->ssl->saved_write_handler = c->write->handler;[m
[31m-            c->write->handler = ngx_ssl_write_handler;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "peer shutdown SSL cleanly");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-[m
[31m-    c->read->handler(c->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * OpenSSL has no SSL_writev() so we copy several bufs into our 16K buffer[m
[31m- * before the SSL_write() call to decrease a SSL overhead.[m
[31m- *[m
[31m- * Besides for protocols such as HTTP it is possible to always buffer[m
[31m- * the output to decrease a SSL overhead some more.[m
[31m- */[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int          n;[m
[31m-    ngx_uint_t   flush;[m
[31m-    ssize_t      send, size;[m
[31m-    ngx_buf_t   *buf;[m
[31m-[m
[31m-    if (!c->ssl->buffer) {[m
[31m-[m
[31m-        while (in) {[m
[31m-            if (ngx_buf_special(in->buf)) {[m
[31m-                in = in->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_ssl_write(c, in->buf->pos, in->buf->last - in->buf->pos);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                return in;[m
[31m-            }[m
[31m-[m
[31m-            in->buf->pos += n;[m
[31m-[m
[31m-            if (in->buf->pos == in->buf->last) {[m
[31m-                in = in->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the maximum limit size is the maximum int32_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_INT32_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_INT32_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    buf = c->ssl->buf;[m
[31m-[m
[31m-    if (buf == NULL) {[m
[31m-        buf = ngx_create_temp_buf(c->pool, c->ssl->buffer_size);[m
[31m-        if (buf == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->buf = buf;[m
[31m-    }[m
[31m-[m
[31m-    if (buf->start == NULL) {[m
[31m-        buf->start = ngx_palloc(c->pool, c->ssl->buffer_size);[m
[31m-        if (buf->start == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf->pos = buf->start;[m
[31m-        buf->last = buf->start;[m
[31m-        buf->end = buf->start + c->ssl->buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    send = buf->last - buf->pos;[m
[31m-    flush = (in == NULL) ? 1 : buf->flush;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        while (in && buf->last < buf->end && send < limit) {[m
[31m-            if (in->buf->last_buf || in->buf->flush) {[m
[31m-                flush = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_special(in->buf)) {[m
[31m-                in = in->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            size = in->buf->last - in->buf->pos;[m
[31m-[m
[31m-            if (size > buf->end - buf->last) {[m
[31m-                size = buf->end - buf->last;[m
[31m-            }[m
[31m-[m
[31m-            if (send + size > limit) {[m
[31m-                size = (ssize_t) (limit - send);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL buf copy: %z", size);[m
[31m-[m
[31m-            ngx_memcpy(buf->last, in->buf->pos, size);[m
[31m-[m
[31m-            buf->last += size;[m
[31m-            in->buf->pos += size;[m
[31m-            send += size;[m
[31m-[m
[31m-            if (in->buf->pos == in->buf->last) {[m
[31m-                in = in->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!flush && send < limit && buf->last < buf->end) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        size = buf->last - buf->pos;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            buf->flush = 0;[m
[31m-            c->buffered &= ~NGX_SSL_BUFFERED;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_ssl_write(c, buf->pos, size);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        buf->pos += n;[m
[31m-[m
[31m-        if (n < size) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        flush = 0;[m
[31m-[m
[31m-        buf->pos = buf->start;[m
[31m-        buf->last = buf->start;[m
[31m-[m
[31m-        if (in == NULL || send == limit) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    buf->flush = flush;[m
[31m-[m
[31m-    if (buf->pos < buf->last) {[m
[31m-        c->buffered |= NGX_SSL_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        c->buffered &= ~NGX_SSL_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size)[m
[31m-{[m
[31m-    int        n, sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL to write: %uz", size);[m
[31m-[m
[31m-    n = SSL_write(c->ssl->connection, data, size);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_write: %d", n);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-[m
[31m-        if (c->ssl->saved_read_handler) {[m
[31m-[m
[31m-            c->read->handler = c->ssl->saved_read_handler;[m
[31m-            c->ssl->saved_read_handler = NULL;[m
[31m-            c->read->ready = 1;[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_post_event(c->read, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        c->sent += n;[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->write->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "peer started SSL renegotiation");[m
[31m-[m
[31m-        c->read->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not set the timer because there is already[m
[31m-         * the write event timer[m
[31m-         */[m
[31m-[m
[31m-        if (c->ssl->saved_read_handler == NULL) {[m
[31m-            c->ssl->saved_read_handler = c->read->handler;[m
[31m-            c->read->handler = ngx_ssl_read_handler;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-    c->write->error = 1;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_write() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->write->handler(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_free_buffer(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (c->ssl->buf && c->ssl->buf->start) {[m
[31m-        if (ngx_pfree(c->pool, c->ssl->buf->start) == NGX_OK) {[m
[31m-            c->ssl->buf->start = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_shutdown(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        n, sslerr, mode;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (SSL_in_init(c->ssl->connection)) {[m
[31m-        /*[m
[31m-         * OpenSSL 1.0.2f complains if SSL_shutdown() is called during[m
[31m-         * an SSL handshake, while previous versions always return 0.[m
[31m-         * Avoid calling SSL_shutdown() if handshake wasn't completed.[m
[31m-         */[m
[31m-[m
[31m-        SSL_free(c->ssl->connection);[m
[31m-        c->ssl = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c->timedout) {[m
[31m-        mode = SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN;[m
[31m-        SSL_set_quiet_shutdown(c->ssl->connection, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        mode = SSL_get_shutdown(c->ssl->connection);[m
[31m-[m
[31m-        if (c->ssl->no_wait_shutdown) {[m
[31m-            mode |= SSL_RECEIVED_SHUTDOWN;[m
[31m-        }[m
[31m-[m
[31m-        if (c->ssl->no_send_shutdown) {[m
[31m-            mode |= SSL_SENT_SHUTDOWN;[m
[31m-        }[m
[31m-[m
[31m-        if (c->ssl->no_wait_shutdown && c->ssl->no_send_shutdown) {[m
[31m-            SSL_set_quiet_shutdown(c->ssl->connection, 1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    SSL_set_shutdown(c->ssl->connection, mode);[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    n = SSL_shutdown(c->ssl->connection);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_shutdown: %d", n);[m
[31m-[m
[31m-    sslerr = 0;[m
[31m-[m
[31m-    /* before 0.9.8m SSL_shutdown() returned 0 instead of -1 on errors */[m
[31m-[m
[31m-    if (n != 1 && ERR_peek_error()) {[m
[31m-        sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL_get_error: %d", sslerr);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1 || sslerr == 0 || sslerr == SSL_ERROR_ZERO_RETURN) {[m
[31m-        SSL_free(c->ssl->connection);[m
[31m-        c->ssl = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ || sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->read->handler = ngx_ssl_shutdown_handler;[m
[31m-        c->write->handler = ngx_ssl_shutdown_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-            ngx_add_timer(c->read, 30000);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_shutdown() failed");[m
[31m-[m
[31m-    SSL_free(c->ssl->connection);[m
[31m-    c->ssl = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_shutdown_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_connection_handler_pt   handler;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    handler = c->ssl->handler;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "SSL shutdown handler");[m
[31m-[m
[31m-    if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_connection_error(ngx_connection_t *c, int sslerr, ngx_err_t err,[m
[31m-    char *text)[m
[31m-{[m
[31m-    int         n;[m
[31m-    ngx_uint_t  level;[m
[31m-[m
[31m-    level = NGX_LOG_CRIT;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_SYSCALL) {[m
[31m-[m
[31m-        if (err == NGX_ECONNRESET[m
[31m-            || err == NGX_EPIPE[m
[31m-            || err == NGX_ENOTCONN[m
[31m-            || err == NGX_ETIMEDOUT[m
[31m-            || err == NGX_ECONNREFUSED[m
[31m-            || err == NGX_ENETDOWN[m
[31m-            || err == NGX_ENETUNREACH[m
[31m-            || err == NGX_EHOSTDOWN[m
[31m-            || err == NGX_EHOSTUNREACH)[m
[31m-        {[m
[31m-            switch (c->log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else if (sslerr == SSL_ERROR_SSL) {[m
[31m-[m
[31m-        n = ERR_GET_REASON(ERR_peek_error());[m
[31m-[m
[31m-            /* handshake failures */[m
[31m-        if (n == SSL_R_BAD_CHANGE_CIPHER_SPEC                        /*  103 */[m
[31m-            || n == SSL_R_BLOCK_CIPHER_PAD_IS_WRONG                  /*  129 */[m
[31m-            || n == SSL_R_DIGEST_CHECK_FAILED                        /*  149 */[m
[31m-            || n == SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST              /*  151 */[m
[31m-            || n == SSL_R_EXCESSIVE_MESSAGE_SIZE                     /*  152 */[m
[31m-            || n == SSL_R_LENGTH_MISMATCH                            /*  159 */[m
[31m-            || n == SSL_R_NO_CIPHERS_PASSED                          /*  182 */[m
[31m-            || n == SSL_R_NO_CIPHERS_SPECIFIED                       /*  183 */[m
[31m-            || n == SSL_R_NO_COMPRESSION_SPECIFIED                   /*  187 */[m
[31m-            || n == SSL_R_NO_SHARED_CIPHER                           /*  193 */[m
[31m-            || n == SSL_R_RECORD_LENGTH_MISMATCH                     /*  213 */[m
[31m-#ifdef SSL_R_PARSE_TLSEXT[m
[31m-            || n == SSL_R_PARSE_TLSEXT                               /*  227 */[m
[31m-#endif[m
[31m-            || n == SSL_R_UNEXPECTED_MESSAGE                         /*  244 */[m
[31m-            || n == SSL_R_UNEXPECTED_RECORD                          /*  245 */[m
[31m-            || n == SSL_R_UNKNOWN_ALERT_TYPE                         /*  246 */[m
[31m-            || n == SSL_R_UNKNOWN_PROTOCOL                           /*  252 */[m
[31m-            || n == SSL_R_WRONG_VERSION_NUMBER                       /*  267 */[m
[31m-            || n == SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC        /*  281 */[m
[31m-#ifdef SSL_R_RENEGOTIATE_EXT_TOO_LONG[m
[31m-            || n == SSL_R_RENEGOTIATE_EXT_TOO_LONG                   /*  335 */[m
[31m-            || n == SSL_R_RENEGOTIATION_ENCODING_ERR                 /*  336 */[m
[31m-            || n == SSL_R_RENEGOTIATION_MISMATCH                     /*  337 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED[m
[31m-            || n == SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED       /*  338 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING[m
[31m-            || n == SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING           /*  345 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_INAPPROPRIATE_FALLBACK[m
[31m-            || n == SSL_R_INAPPROPRIATE_FALLBACK                     /*  373 */[m
[31m-#endif[m
[31m-            || n == 1000 /* SSL_R_SSLV3_ALERT_CLOSE_NOTIFY */[m
[31m-#ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE[m
[31m-            || n == SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE             /* 1010 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_BAD_RECORD_MAC                 /* 1020 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECRYPTION_FAILED              /* 1021 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_RECORD_OVERFLOW                /* 1022 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE          /* 1030 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE              /* 1040 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_NO_CERTIFICATE                 /* 1041 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_BAD_CERTIFICATE                /* 1042 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE        /* 1043 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED            /* 1044 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED            /* 1045 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN            /* 1046 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER              /* 1047 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_UNKNOWN_CA                     /* 1048 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_ACCESS_DENIED                  /* 1049 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECODE_ERROR                   /* 1050 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECRYPT_ERROR                  /* 1051 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION             /* 1060 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_PROTOCOL_VERSION               /* 1070 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY          /* 1071 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_INTERNAL_ERROR                 /* 1080 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_USER_CANCELLED                 /* 1090 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_NO_RENEGOTIATION               /* 1100 */[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            switch (c->log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_error(level, c->log, err, text);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_clear_error(ngx_log_t *log)[m
[31m-{[m
[31m-    while (ERR_peek_error()) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0, "ignoring stale global SSL error");[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_ssl_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, char *fmt, ...)[m
[31m-{[m
[31m-    int          flags;[m
[31m-    u_long       n;[m
[31m-    va_list      args;[m
[31m-    u_char      *p, *last;[m
[31m-    u_char       errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    const char  *data;[m
[31m-[m
[31m-    last = errstr + NGX_MAX_CONF_ERRSTR;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(errstr, last - 1, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    p = ngx_cpystrn(p, (u_char *) " (SSL:", last - p);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = ERR_peek_error_line_data(NULL, NULL, &data, &flags);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (p >= last) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        *p++ = ' ';[m
[31m-[m
[31m-        ERR_error_string_n(n, (char *) p, last - p);[m
[31m-[m
[31m-        while (p < last && *p) {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (p < last && *data && (flags & ERR_TXT_STRING)) {[m
[31m-            *p++ = ':';[m
[31m-            p = ngx_cpystrn(p, (u_char *) data, last - p);[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        (void) ERR_get_error();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, log, err, "%*s)", p - errstr, errstr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx,[m
[31m-    ssize_t builtin_session_cache, ngx_shm_zone_t *shm_zone, time_t timeout)[m
[31m-{[m
[31m-    long  cache_mode;[m
[31m-[m
[31m-    SSL_CTX_set_timeout(ssl->ctx, (long) timeout);[m
[31m-[m
[31m-    if (ngx_ssl_session_id_context(ssl, sess_ctx) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (builtin_session_cache == NGX_SSL_NO_SCACHE) {[m
[31m-        SSL_CTX_set_session_cache_mode(ssl->ctx, SSL_SESS_CACHE_OFF);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (builtin_session_cache == NGX_SSL_NONE_SCACHE) {[m
[31m-[m
[31m-        /*[m
[31m-         * If the server explicitly says that it does not support[m
[31m-         * session reuse (see SSL_SESS_CACHE_OFF above), then[m
[31m-         * Outlook Express fails to upload a sent email to[m
[31m-         * the Sent Items folder on the IMAP server via a separate IMAP[m
[31m-         * connection in the background. Therefore we have a special[m
[31m-         * mode (SSL_SESS_CACHE_SERVER|SSL_SESS_CACHE_NO_INTERNAL_STORE)[m
[31m-         * where the server pretends that it supports session reuse,[m
[31m-         * but it does not actually store any session.[m
[31m-         */[m
[31m-[m
[31m-        SSL_CTX_set_session_cache_mode(ssl->ctx,[m
[31m-                                       SSL_SESS_CACHE_SERVER[m
[31m-                                       |SSL_SESS_CACHE_NO_AUTO_CLEAR[m
[31m-                                       |SSL_SESS_CACHE_NO_INTERNAL_STORE);[m
[31m-[m
[31m-        SSL_CTX_sess_set_cache_size(ssl->ctx, 1);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache_mode = SSL_SESS_CACHE_SERVER;[m
[31m-[m
[31m-    if (shm_zone && builtin_session_cache == NGX_SSL_NO_BUILTIN_SCACHE) {[m
[31m-        cache_mode |= SSL_SESS_CACHE_NO_INTERNAL;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_session_cache_mode(ssl->ctx, cache_mode);[m
[31m-[m
[31m-    if (builtin_session_cache != NGX_SSL_NO_BUILTIN_SCACHE) {[m
[31m-[m
[31m-        if (builtin_session_cache != NGX_SSL_DFLT_BUILTIN_SCACHE) {[m
[31m-            SSL_CTX_sess_set_cache_size(ssl->ctx, builtin_session_cache);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone) {[m
[31m-        SSL_CTX_sess_set_new_cb(ssl->ctx, ngx_ssl_new_session);[m
[31m-        SSL_CTX_sess_set_get_cb(ssl->ctx, ngx_ssl_get_cached_session);[m
[31m-        SSL_CTX_sess_set_remove_cb(ssl->ctx, ngx_ssl_remove_session);[m
[31m-[m
[31m-        if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_cache_index, shm_zone)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_set_ex_data() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_session_id_context(ngx_ssl_t *ssl, ngx_str_t *sess_ctx)[m
[31m-{[m
[31m-    int                   n, i;[m
[31m-    X509                 *cert;[m
[31m-    X509_NAME            *name;[m
[31m-    EVP_MD_CTX           *md;[m
[31m-    unsigned int          len;[m
[31m-    STACK_OF(X509_NAME)  *list;[m
[31m-    u_char                buf[EVP_MAX_MD_SIZE];[m
[31m-[m
[31m-    /*[m
[31m-     * Session ID context is set based on the string provided,[m
[31m-     * the server certificate, and the client CA list.[m
[31m-     */[m
[31m-[m
[31m-    md = EVP_MD_CTX_create();[m
[31m-    if (md == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestInit_ex(md, EVP_sha1(), NULL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestInit_ex() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestUpdate(md, sess_ctx->data, sess_ctx->len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cert = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_certificate_index);[m
[31m-[m
[31m-    if (X509_digest(cert, EVP_sha1(), buf, &len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_digest() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestUpdate(md, buf, len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    list = SSL_CTX_get_client_CA_list(ssl->ctx);[m
[31m-[m
[31m-    if (list != NULL) {[m
[31m-        n = sk_X509_NAME_num(list);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            name = sk_X509_NAME_value(list, i);[m
[31m-[m
[31m-            if (X509_NAME_digest(name, EVP_sha1(), buf, &len) == 0) {[m
[31m-                ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                              "X509_NAME_digest() failed");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (EVP_DigestUpdate(md, buf, len) == 0) {[m
[31m-                ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                              "EVP_DigestUpdate() failed");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestFinal_ex(md, buf, &len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    EVP_MD_CTX_destroy(md);[m
[31m-[m
[31m-    if (SSL_CTX_set_session_id_context(ssl->ctx, buf, len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_session_id_context() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    EVP_MD_CTX_destroy(md);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    size_t                    len;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-[m
[31m-    if (data) {[m
[31m-        shm_zone->data = data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        shm_zone->data = shpool->data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache = ngx_slab_alloc(shpool, sizeof(ngx_ssl_session_cache_t));[m
[31m-    if (cache == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shpool->data = cache;[m
[31m-    shm_zone->data = cache;[m
[31m-[m
[31m-    ngx_rbtree_init(&cache->session_rbtree, &cache->sentinel,[m
[31m-                    ngx_ssl_session_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&cache->expire_queue);[m
[31m-[m
[31m-    len = sizeof(" in SSL session shared cache \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in SSL session shared cache \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    shpool->log_nomem = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The length of the session id is 16 bytes for SSLv2 sessions and[m
[31m- * between 1 and 32 bytes for SSLv3/TLSv1, typically 32 bytes.[m
[31m- * It seems that the typical length of the external ASN1 representation[m
[31m- * of a session is 118 or 119 bytes for SSLv3/TSLv1.[m
[31m- *[m
[31m- * Thus on 32-bit platforms we allocate separately an rbtree node,[m
[31m- * a session id, and an ASN1 representation, they take accordingly[m
[31m- * 64, 32, and 128 bytes.[m
[31m- *[m
[31m- * On 64-bit platforms we allocate separately an rbtree node + session_id,[m
[31m- * and an ASN1 representation, they take accordingly 128 and 128 bytes.[m
[31m- *[m
[31m- * OpenSSL's i2d_SSL_SESSION() and d2i_SSL_SESSION are slow,[m
[31m- * so they are outside the code locked by shared pool mutex[m
[31m- */[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    int                       len;[m
[31m-    u_char                   *p, *id, *cached_sess, *session_id;[m
[31m-    uint32_t                  hash;[m
[31m-    SSL_CTX                  *ssl_ctx;[m
[31m-    unsigned int              session_id_length;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_connection_t         *c;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-    u_char                    buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-[m
[31m-    len = i2d_SSL_SESSION(sess, NULL);[m
[31m-[m
[31m-    /* do not cache too big session */[m
[31m-[m
[31m-    if (len > (int) NGX_SSL_MAX_SESSION_SIZE) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    p = buf;[m
[31m-    i2d_SSL_SESSION(sess, &p);[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ssl_ctx = c->ssl->session_ctx;[m
[31m-    shm_zone = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    /* drop one or two expired sessions */[m
[31m-    ngx_ssl_expire_sessions(cache, shpool, 1);[m
[31m-[m
[31m-    cached_sess = ngx_slab_alloc_locked(shpool, len);[m
[31m-[m
[31m-    if (cached_sess == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        cached_sess = ngx_slab_alloc_locked(shpool, len);[m
[31m-[m
[31m-        if (cached_sess == NULL) {[m
[31m-            sess_id = NULL;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));[m
[31m-[m
[31m-    if (sess_id == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));[m
[31m-[m
[31m-        if (sess_id == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    session_id = (u_char *) SSL_SESSION_get_id(sess, &session_id_length);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    session_id = sess->session_id;[m
[31m-    session_id_length = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-    id = sess_id->sess_id;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    id = ngx_slab_alloc_locked(shpool, session_id_length);[m
[31m-[m
[31m-    if (id == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        id = ngx_slab_alloc_locked(shpool, session_id_length);[m
[31m-[m
[31m-        if (id == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memcpy(cached_sess, buf, len);[m
[31m-[m
[31m-    ngx_memcpy(id, session_id, session_id_length);[m
[31m-[m
[31m-    hash = ngx_crc32_short(session_id, session_id_length);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "ssl new session: %08XD:%ud:%d",[m
[31m-                   hash, session_id_length, len);[m
[31m-[m
[31m-    sess_id->node.key = hash;[m
[31m-    sess_id->node.data = (u_char) session_id_length;[m
[31m-    sess_id->id = id;[m
[31m-    sess_id->len = len;[m
[31m-    sess_id->session = cached_sess;[m
[31m-[m
[31m-    sess_id->expire = ngx_time() + SSL_CTX_get_timeout(ssl_ctx);[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->expire_queue, &sess_id->queue);[m
[31m-[m
[31m-    ngx_rbtree_insert(&cache->session_rbtree, &sess_id->node);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (cached_sess) {[m
[31m-        ngx_slab_free_locked(shpool, cached_sess);[m
[31m-    }[m
[31m-[m
[31m-    if (sess_id) {[m
[31m-        ngx_slab_free_locked(shpool, sess_id);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                  "could not allocate new session%s", shpool->log_ctx);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_ssl_session_t *[m
[31m-ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char *id, int len, int *copy)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                   *p;[m
[31m-    uint32_t                  hash;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_rbtree_node_t        *node, *sentinel;[m
[31m-    ngx_ssl_session_t        *sess;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-    u_char                    buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-    ngx_connection_t         *c;[m
[31m-[m
[31m-    hash = ngx_crc32_short((u_char *) (uintptr_t) id, (size_t) len);[m
[31m-    *copy = 0;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "ssl get session: %08XD:%d", hash, len);[m
[31m-[m
[31m-    shm_zone = SSL_CTX_get_ex_data(c->ssl->session_ctx,[m
[31m-                                   ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-    sess = NULL;[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    node = cache->session_rbtree.root;[m
[31m-    sentinel = cache->session_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-[m
[31m-        rc = ngx_memn2cmp((u_char *) (uintptr_t) id, sess_id->id,[m
[31m-                          (size_t) len, (size_t) node->data);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-[m
[31m-            if (sess_id->expire > ngx_time()) {[m
[31m-                ngx_memcpy(buf, sess_id->session, sess_id->len);[m
[31m-[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-                p = buf;[m
[31m-                sess = d2i_SSL_SESSION(NULL, &p, sess_id->len);[m
[31m-[m
[31m-                return sess;[m
[31m-            }[m
[31m-[m
[31m-            ngx_queue_remove(&sess_id->queue);[m
[31m-[m
[31m-            ngx_rbtree_delete(&cache->session_rbtree, node);[m
[31m-[m
[31m-            ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-            ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-            ngx_slab_free_locked(shpool, sess_id);[m
[31m-[m
[31m-            sess = NULL;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    return sess;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_remove_cached_session(SSL_CTX *ssl, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    SSL_CTX_remove_session(ssl, sess);[m
[31m-[m
[31m-    ngx_ssl_remove_session(ssl, sess);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    u_char                   *id;[m
[31m-    uint32_t                  hash;[m
[31m-    ngx_int_t                 rc;[m
[31m-    unsigned int              len;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_rbtree_node_t        *node, *sentinel;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-[m
[31m-    shm_zone = SSL_CTX_get_ex_data(ssl, ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    id = (u_char *) SSL_SESSION_get_id(sess, &len);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    id = sess->session_id;[m
[31m-    len = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    hash = ngx_crc32_short(id, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                   "ssl remove session: %08XD:%ud", hash, len);[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    node = cache->session_rbtree.root;[m
[31m-    sentinel = cache->session_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(id, sess_id->id, len, (size_t) node->data);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-[m
[31m-            ngx_queue_remove(&sess_id->queue);[m
[31m-[m
[31m-            ngx_rbtree_delete(&cache->session_rbtree, node);[m
[31m-[m
[31m-            ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-            ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-            ngx_slab_free_locked(shpool, sess_id);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache,[m
[31m-    ngx_slab_pool_t *shpool, ngx_uint_t n)[m
[31m-{[m
[31m-    time_t              now;[m
[31m-    ngx_queue_t        *q;[m
[31m-    ngx_ssl_sess_id_t  *sess_id;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->expire_queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->expire_queue);[m
[31m-[m
[31m-        sess_id = ngx_queue_data(q, ngx_ssl_sess_id_t, queue);[m
[31m-[m
[31m-        if (n++ != 0 && sess_id->expire > now) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                       "expire session: %08Xi", sess_id->node.key);[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->session_rbtree, &sess_id->node);[m
[31m-[m
[31m-        ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-        ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-        ngx_slab_free_locked(shpool, sess_id);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-    ngx_ssl_sess_id_t   *sess_id, *sess_id_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-            sess_id_temp = (ngx_ssl_sess_id_t *) temp;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(sess_id->id, sess_id_temp->id,[m
[31m-                              (size_t) node->data, (size_t) temp->data)[m
[31m-                 < 0) ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths)[m
[31m-{[m
[31m-    u_char                         buf[48];[m
[31m-    ssize_t                        n;[m
[31m-    ngx_str_t                     *path;[m
[31m-    ngx_file_t                     file;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_array_t                   *keys;[m
[31m-    ngx_file_info_t                fi;[m
[31m-    ngx_ssl_session_ticket_key_t  *key;[m
[31m-[m
[31m-    if (paths == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    keys = ngx_array_create(cf->pool, paths->nelts,[m
[31m-                            sizeof(ngx_ssl_session_ticket_key_t));[m
[31m-    if (keys == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    path = paths->elts;[m
[31m-    for (i = 0; i < paths->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_conf_full_name(cf->cycle, &path[i], 1) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-        file.name = path[i];[m
[31m-        file.log = cf->log;[m
[31m-[m
[31m-        file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, 0, 0);[m
[31m-        if (file.fd == NGX_INVALID_FILE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_open_file_n " \"%V\" failed", &file.name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                               ngx_fd_info_n " \"%V\" failed", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_file_size(&fi) != 48) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" must be 48 bytes", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_read_file(&file, buf, 48, 0);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                               ngx_read_file_n " \"%V\" failed", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (n != 48) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, 0,[m
[31m-                               ngx_read_file_n " \"%V\" returned only "[m
[31m-                               "%z bytes instead of 48", &file.name, n);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        key = ngx_array_push(keys);[m
[31m-        if (key == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(key->name, buf, 16);[m
[31m-        ngx_memcpy(key->aes_key, buf + 16, 16);[m
[31m-        ngx_memcpy(key->hmac_key, buf + 32, 16);[m
[31m-[m
[31m-        if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", &file.name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_ticket_keys_index, keys)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_tlsext_ticket_key_cb(ssl->ctx,[m
[31m-                                         ngx_ssl_session_ticket_key_callback)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "nginx was built with Session Tickets support, however, "[m
[31m-                      "now it is linked dynamically to an OpenSSL library "[m
[31m-                      "which has no tlsext support, therefore Session Tickets "[m
[31m-                      "are not available");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%V\" failed", &file.name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef OPENSSL_NO_SHA256[m
[31m-#define ngx_ssl_session_ticket_md  EVP_sha1[m
[31m-#else[m
[31m-#define ngx_ssl_session_ticket_md  EVP_sha256[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_session_ticket_key_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx,[m
[31m-    HMAC_CTX *hctx, int enc)[m
[31m-{[m
[31m-    SSL_CTX                       *ssl_ctx;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_array_t                   *keys;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_ssl_session_ticket_key_t  *key;[m
[31m-#if (NGX_DEBUG)[m
[31m-    u_char                         buf[32];[m
[31m-#endif[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-    ssl_ctx = c->ssl->session_ctx;[m
[31m-[m
[31m-    keys = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_ticket_keys_index);[m
[31m-    if (keys == NULL) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    key = keys->elts;[m
[31m-[m
[31m-    if (enc == 1) {[m
[31m-        /* encrypt session ticket */[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket encrypt, key: \"%*s\" (%s session)",[m
[31m-                       ngx_hex_dump(buf, key[0].name, 16) - buf, buf,[m
[31m-                       SSL_session_reused(ssl_conn) ? "reused" : "new");[m
[31m-[m
[31m-        RAND_bytes(iv, 16);[m
[31m-        EVP_EncryptInit_ex(ectx, EVP_aes_128_cbc(), NULL, key[0].aes_key, iv);[m
[31m-        HMAC_Init_ex(hctx, key[0].hmac_key, 16,[m
[31m-                     ngx_ssl_session_ticket_md(), NULL);[m
[31m-        ngx_memcpy(name, key[0].name, 16);[m
[31m-[m
[31m-        return 0;[m
[31m-[m
[31m-    } else {[m
[31m-        /* decrypt session ticket */[m
[31m-[m
[31m-        for (i = 0; i < keys->nelts; i++) {[m
[31m-            if (ngx_memcmp(name, key[i].name, 16) == 0) {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket decrypt, key: \"%*s\" not found",[m
[31m-                       ngx_hex_dump(buf, name, 16) - buf, buf);[m
[31m-[m
[31m-        return 0;[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket decrypt, key: \"%*s\"%s",[m
[31m-                       ngx_hex_dump(buf, key[i].name, 16) - buf, buf,[m
[31m-                       (i == 0) ? " (default)" : "");[m
[31m-[m
[31m-        HMAC_Init_ex(hctx, key[i].hmac_key, 16,[m
[31m-                     ngx_ssl_session_ticket_md(), NULL);[m
[31m-        EVP_DecryptInit_ex(ectx, EVP_aes_128_cbc(), NULL, key[i].aes_key, iv);[m
[31m-[m
[31m-        return (i == 0) ? 1 : 2 /* renew */;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths)[m
[31m-{[m
[31m-    if (paths) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                      "\"ssl_session_ticket_keys\" ignored, not supported");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_cleanup_ctx(void *data)[m
[31m-{[m
[31m-    ngx_ssl_t  *ssl = data;[m
[31m-[m
[31m-    SSL_CTX_free(ssl->ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_check_host(ngx_connection_t *c, ngx_str_t *name)[m
[31m-{[m
[31m-    X509   *cert;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10002002L[m
[31m-[m
[31m-    /* X509_check_host() is only available in OpenSSL 1.0.2+ */[m
[31m-[m
[31m-    if (name->len == 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_check_host(cert, (char *) name->data, name->len, 0, NULL) != 1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "X509_check_host(): no match");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "X509_check_host(): match");[m
[31m-[m
[31m-    goto found;[m
[31m-[m
[31m-#else[m
[31m-    {[m
[31m-    int                      n, i;[m
[31m-    X509_NAME               *sname;[m
[31m-    ASN1_STRING             *str;[m
[31m-    X509_NAME_ENTRY         *entry;[m
[31m-    GENERAL_NAME            *altname;[m
[31m-    STACK_OF(GENERAL_NAME)  *altnames;[m
[31m-[m
[31m-    /*[m
[31m-     * As per RFC6125 and RFC2818, we check subjectAltName extension,[m
[31m-     * and if it's not present - commonName in Subject is checked.[m
[31m-     */[m
[31m-[m
[31m-    altnames = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);[m
[31m-[m
[31m-    if (altnames) {[m
[31m-        n = sk_GENERAL_NAME_num(altnames);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            altname = sk_GENERAL_NAME_value(altnames, i);[m
[31m-[m
[31m-            if (altname->type != GEN_DNS) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            str = altname->d.dNSName;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL subjectAltName: \"%*s\"",[m
[31m-                           ASN1_STRING_length(str), ASN1_STRING_data(str));[m
[31m-[m
[31m-            if (ngx_ssl_check_name(name, str) == NGX_OK) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                               "SSL subjectAltName: match");[m
[31m-                GENERAL_NAMES_free(altnames);[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL subjectAltName: no match");[m
[31m-[m
[31m-        GENERAL_NAMES_free(altnames);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * If there is no subjectAltName extension, check commonName[m
[31m-     * in Subject.  While RFC2818 requires to only check "most specific"[m
[31m-     * CN, both Apache and OpenSSL check all CNs, and so do we.[m
[31m-     */[m
[31m-[m
[31m-    sname = X509_get_subject_name(cert);[m
[31m-[m
[31m-    if (sname == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    i = -1;[m
[31m-    for ( ;; ) {[m
[31m-        i = X509_NAME_get_index_by_NID(sname, NID_commonName, i);[m
[31m-[m
[31m-        if (i < 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        entry = X509_NAME_get_entry(sname, i);[m
[31m-        str = X509_NAME_ENTRY_get_data(entry);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL commonName: \"%*s\"",[m
[31m-                       ASN1_STRING_length(str), ASN1_STRING_data(str));[m
[31m-[m
[31m-        if (ngx_ssl_check_name(name, str) == NGX_OK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL commonName: match");[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL commonName: no match");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10002002L[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *pattern)[m
[31m-{[m
[31m-    u_char  *s, *p, *end;[m
[31m-    size_t   slen, plen;[m
[31m-[m
[31m-    s = name->data;[m
[31m-    slen = name->len;[m
[31m-[m
[31m-    p = ASN1_STRING_data(pattern);[m
[31m-    plen = ASN1_STRING_length(pattern);[m
[31m-[m
[31m-    if (slen == plen && ngx_strncasecmp(s, p, plen) == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (plen > 2 && p[0] == '*' && p[1] == '.') {[m
[31m-        plen -= 1;[m
[31m-        p += 1;[m
[31m-[m
[31m-        end = s + slen;[m
[31m-        s = ngx_strlchr(s, end, '.');[m
[31m-[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        slen = end - s;[m
[31m-[m
[31m-        if (plen == slen && ngx_strncasecmp(s, p, plen) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_protocol(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    s->data = (u_char *) SSL_get_version(c->ssl->connection);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_cipher_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    s->data = (u_char *) SSL_get_cipher_name(c->ssl->connection);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_session_id(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    u_char        *buf;[m
[31m-    SSL_SESSION   *sess;[m
[31m-    unsigned int   len;[m
[31m-[m
[31m-    sess = SSL_get0_session(c->ssl->connection);[m
[31m-    if (sess == NULL) {[m
[31m-        s->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    buf = (u_char *) SSL_SESSION_get_id(sess, &len);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    buf = sess->session_id;[m
[31m-    len = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->len = 2 * len;[m
[31m-    s->data = ngx_pnalloc(pool, 2 * len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(s->data, buf, len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_session_reused(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    if (SSL_session_reused(c->ssl->connection)) {[m
[31m-        ngx_str_set(s, "r");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(s, ".");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    const char  *servername;[m
[31m-[m
[31m-    servername = SSL_get_servername(c->ssl->connection,[m
[31m-                                    TLSEXT_NAMETYPE_host_name);[m
[31m-    if (servername) {[m
[31m-        s->data = (u_char *) servername;[m
[31m-        s->len = ngx_strlen(servername);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->len = 0;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_raw_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    BIO     *bio;[m
[31m-    X509    *cert;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed");[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PEM_write_bio_X509(bio, cert) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "PEM_write_bio_X509() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = BIO_pending(bio);[m
[31m-    s->len = len;[m
[31m-[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    BIO_read(bio, s->data, len);[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    size_t       len;[m
[31m-    ngx_uint_t   i;[m
[31m-    ngx_str_t    cert;[m
[31m-[m
[31m-    if (ngx_ssl_get_raw_certificate(c, pool, &cert) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cert.len == 0) {[m
[31m-        s->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = cert.len - 1;[m
[31m-[m
[31m-    for (i = 0; i < cert.len - 1; i++) {[m
[31m-        if (cert.data[i] == LF) {[m
[31m-            len++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = s->data;[m
[31m-[m
[31m-    for (i = 0; i < cert.len - 1; i++) {[m
[31m-        *p++ = cert.data[i];[m
[31m-        if (cert.data[i] == LF) {[m
[31m-            *p++ = '\t';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    char       *p;[m
[31m-    size_t      len;[m
[31m-    X509       *cert;[m
[31m-    X509_NAME  *name;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    name = X509_get_subject_name(cert);[m
[31m-    if (name == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = X509_NAME_oneline(name, NULL, 0);[m
[31m-[m
[31m-    for (len = 0; p[len]; len++) { /* void */ }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        OPENSSL_free(p);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    OPENSSL_free(p);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    char       *p;[m
[31m-    size_t      len;[m
[31m-    X509       *cert;[m
[31m-    X509_NAME  *name;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    name = X509_get_issuer_name(cert);[m
[31m-    if (name == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = X509_NAME_oneline(name, NULL, 0);[m
[31m-[m
[31m-    for (len = 0; p[len]; len++) { /* void */ }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        OPENSSL_free(p);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    OPENSSL_free(p);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    X509    *cert;[m
[31m-    BIO     *bio;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    i2a_ASN1_INTEGER(bio, X509_get_serialNumber(cert));[m
[31m-    len = BIO_pending(bio);[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        BIO_free(bio);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    BIO_read(bio, s->data, len);[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    X509          *cert;[m
[31m-    unsigned int   len;[m
[31m-    u_char         buf[EVP_MAX_MD_SIZE];[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!X509_digest(cert, EVP_sha1(), buf, &len)) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->len = 2 * len;[m
[31m-    s->data = ngx_pnalloc(pool, 2 * len);[m
[31m-    if (s->data == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(s->data, buf, len);[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    X509  *cert;[m
[31m-[m
[31m-    if (SSL_get_verify_result(c->ssl->connection) != X509_V_OK) {[m
[31m-        ngx_str_set(s, "FAILED");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-    if (cert) {[m
[31m-        ngx_str_set(s, "SUCCESS");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(s, "NONE");[m
[31m-    }[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_openssl_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_openssl_conf_t  *oscf;[m
[31m-[m
[31m-    oscf = ngx_pcalloc(cycle->pool, sizeof(ngx_openssl_conf_t));[m
[31m-    if (oscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     oscf->engine = 0;[m
[31m-     */[m
[31m-[m
[31m-    return oscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-[m
[31m-    ngx_openssl_conf_t *oscf = conf;[m
[31m-[m
[31m-    ENGINE     *engine;[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (oscf->engine) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    oscf->engine = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    engine = ENGINE_by_id((const char *) value[1].data);[m
[31m-[m
[31m-    if (engine == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "ENGINE_by_id(\"%V\") failed", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ENGINE_set_default(engine, ENGINE_METHOD_ALL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "ENGINE_set_default(\"%V\", ENGINE_METHOD_ALL) failed",[m
[31m-                      &value[1]);[m
[31m-[m
[31m-        ENGINE_free(engine);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ENGINE_free(engine);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    return "is not supported";[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_openssl_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10100003L[m
[31m-[m
[31m-    EVP_cleanup();[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-    ENGINE_cleanup();[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.h[m
[1mdeleted file mode 100644[m
[1mindex 09654db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl.h[m
[1m+++ /dev/null[m
[36m@@ -1,233 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_OPENSSL_H_INCLUDED_[m
[31m-#define _NGX_EVENT_OPENSSL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#include <openssl/ssl.h>[m
[31m-#include <openssl/err.h>[m
[31m-#include <openssl/bn.h>[m
[31m-#include <openssl/conf.h>[m
[31m-#include <openssl/crypto.h>[m
[31m-#include <openssl/dh.h>[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-#include <openssl/engine.h>[m
[31m-#endif[m
[31m-#include <openssl/evp.h>[m
[31m-#ifndef OPENSSL_NO_OCSP[m
[31m-#include <openssl/ocsp.h>[m
[31m-#endif[m
[31m-#include <openssl/rand.h>[m
[31m-#include <openssl/rsa.h>[m
[31m-#include <openssl/x509.h>[m
[31m-#include <openssl/x509v3.h>[m
[31m-[m
[31m-#define NGX_SSL_NAME     "OpenSSL"[m
[31m-[m
[31m-[m
[31m-#if (defined LIBRESSL_VERSION_NUMBER && OPENSSL_VERSION_NUMBER == 0x20000000L)[m
[31m-#undef OPENSSL_VERSION_NUMBER[m
[31m-#define OPENSSL_VERSION_NUMBER  0x1000107fL[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER >= 0x10100001L)[m
[31m-[m
[31m-#define ngx_ssl_version()       OpenSSL_version(OPENSSL_VERSION)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_ssl_version()       SSLeay_version(SSLEAY_VERSION)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_ssl_session_t       SSL_SESSION[m
[31m-#define ngx_ssl_conn_t          SSL[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    SSL_CTX                    *ctx;[m
[31m-    ngx_log_t                  *log;[m
[31m-    size_t                      buffer_size;[m
[31m-} ngx_ssl_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_ssl_conn_t             *connection;[m
[31m-    SSL_CTX                    *session_ctx;[m
[31m-[m
[31m-    ngx_int_t                   last;[m
[31m-    ngx_buf_t                  *buf;[m
[31m-    size_t                      buffer_size;[m
[31m-[m
[31m-    ngx_connection_handler_pt   handler;[m
[31m-[m
[31m-    ngx_event_handler_pt        saved_read_handler;[m
[31m-    ngx_event_handler_pt        saved_write_handler;[m
[31m-[m
[31m-    unsigned                    handshaked:1;[m
[31m-    unsigned                    renegotiation:1;[m
[31m-    unsigned                    buffer:1;[m
[31m-    unsigned                    no_wait_shutdown:1;[m
[31m-    unsigned                    no_send_shutdown:1;[m
[31m-    unsigned                    handshake_buffer_set:1;[m
[31m-} ngx_ssl_connection_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_NO_SCACHE            -2[m
[31m-#define NGX_SSL_NONE_SCACHE          -3[m
[31m-#define NGX_SSL_NO_BUILTIN_SCACHE    -4[m
[31m-#define NGX_SSL_DFLT_BUILTIN_SCACHE  -5[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_MAX_SESSION_SIZE  4096[m
[31m-[m
[31m-typedef struct ngx_ssl_sess_id_s  ngx_ssl_sess_id_t;[m
[31m-[m
[31m-struct ngx_ssl_sess_id_s {[m
[31m-    ngx_rbtree_node_t           node;[m
[31m-    u_char                     *id;[m
[31m-    size_t                      len;[m
[31m-    u_char                     *session;[m
[31m-    ngx_queue_t                 queue;[m
[31m-    time_t                      expire;[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-    void                       *stub;[m
[31m-    u_char                      sess_id[32];[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t                session_rbtree;[m
[31m-    ngx_rbtree_node_t           sentinel;[m
[31m-    ngx_queue_t                 expire_queue;[m
[31m-} ngx_ssl_session_cache_t;[m
[31m-[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                      name[16];[m
[31m-    u_char                      aes_key[16];[m
[31m-    u_char                      hmac_key[16];[m
[31m-} ngx_ssl_session_ticket_key_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_SSLv2    0x0002[m
[31m-#define NGX_SSL_SSLv3    0x0004[m
[31m-#define NGX_SSL_TLSv1    0x0008[m
[31m-#define NGX_SSL_TLSv1_1  0x0010[m
[31m-#define NGX_SSL_TLSv1_2  0x0020[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_BUFFER   1[m
[31m-#define NGX_SSL_CLIENT   2[m
[31m-[m
[31m-#define NGX_SSL_BUFSIZE  16384[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_ssl_init(ngx_log_t *log);[m
[31m-ngx_int_t ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data);[m
[31m-ngx_int_t ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *cert, ngx_str_t *key, ngx_array_t *passwords);[m
[31m-ngx_int_t ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *cert, ngx_int_t depth);[m
[31m-ngx_int_t ngx_ssl_trusted_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *cert, ngx_int_t depth);[m
[31m-ngx_int_t ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl);[m
[31m-ngx_int_t ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *file, ngx_str_t *responder, ngx_uint_t verify);[m
[31m-ngx_int_t ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_resolver_t *resolver, ngx_msec_t resolver_timeout);[m
[31m-RSA *ngx_ssl_rsa512_key_callback(ngx_ssl_conn_t *ssl_conn, int is_export,[m
[31m-    int key_length);[m
[31m-ngx_array_t *ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file);[m
[31m-ngx_int_t ngx_ssl_dhparam(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file);[m
[31m-ngx_int_t ngx_ssl_ecdh_curve(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *name);[m
[31m-ngx_int_t ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx,[m
[31m-    ssize_t builtin_session_cache, ngx_shm_zone_t *shm_zone, time_t timeout);[m
[31m-ngx_int_t ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_array_t *paths);[m
[31m-ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data);[m
[31m-ngx_int_t ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c,[m
[31m-    ngx_uint_t flags);[m
[31m-[m
[31m-void ngx_ssl_remove_cached_session(SSL_CTX *ssl, ngx_ssl_session_t *sess);[m
[31m-ngx_int_t ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session);[m
[31m-#define ngx_ssl_get_session(c)      SSL_get1_session(c->ssl->connection)[m
[31m-#define ngx_ssl_free_session        SSL_SESSION_free[m
[31m-#define ngx_ssl_get_connection(ssl_conn)                                      \[m
[31m-    SSL_get_ex_data(ssl_conn, ngx_ssl_connection_index)[m
[31m-#define ngx_ssl_get_server_conf(ssl_ctx)                                      \[m
[31m-    SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_server_conf_index)[m
[31m-[m
[31m-#define ngx_ssl_verify_error_optional(n)                                      \[m
[31m-    (n == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT                              \[m
[31m-     || n == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN                             \[m
[31m-     || n == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY                     \[m
[31m-     || n == X509_V_ERR_CERT_UNTRUSTED                                        \[m
[31m-     || n == X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE)[m
[31m-[m
[31m-ngx_int_t ngx_ssl_check_host(ngx_connection_t *c, ngx_str_t *name);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_ssl_get_protocol(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_cipher_name(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_session_id(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_session_reused(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_raw_certificate(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_certificate(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_ssl_handshake(ngx_connection_t *c);[m
[31m-ssize_t ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size);[m
[31m-ssize_t ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit);[m
[31m-ngx_chain_t *ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-void ngx_ssl_free_buffer(ngx_connection_t *c);[m
[31m-ngx_int_t ngx_ssl_shutdown(ngx_connection_t *c);[m
[31m-void ngx_cdecl ngx_ssl_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    char *fmt, ...);[m
[31m-void ngx_ssl_cleanup_ctx(void *data);[m
[31m-[m
[31m-[m
[31m-extern int  ngx_ssl_connection_index;[m
[31m-extern int  ngx_ssl_server_conf_index;[m
[31m-extern int  ngx_ssl_session_cache_index;[m
[31m-extern int  ngx_ssl_session_ticket_keys_index;[m
[31m-extern int  ngx_ssl_certificate_index;[m
[31m-extern int  ngx_ssl_stapling_index;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_OPENSSL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl_stapling.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl_stapling.c[m
[1mdeleted file mode 100644[m
[1mindex 5322b1b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_openssl_stapling.c[m
[1m+++ /dev/null[m
[36m@@ -1,1830 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-[m
[31m-[m
[31m-#if (!defined OPENSSL_NO_OCSP && defined SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                    staple;[m
[31m-    ngx_msec_t                   timeout;[m
[31m-[m
[31m-    ngx_resolver_t              *resolver;[m
[31m-    ngx_msec_t                   resolver_timeout;[m
[31m-[m
[31m-    ngx_addr_t                  *addrs;[m
[31m-    ngx_str_t                    host;[m
[31m-    ngx_str_t                    uri;[m
[31m-    in_port_t                    port;[m
[31m-[m
[31m-    SSL_CTX                     *ssl_ctx;[m
[31m-[m
[31m-    X509                        *cert;[m
[31m-    X509                        *issuer;[m
[31m-[m
[31m-    time_t                       valid;[m
[31m-    time_t                       refresh;[m
[31m-[m
[31m-    unsigned                     verify:1;[m
[31m-    unsigned                     loading:1;[m
[31m-} ngx_ssl_stapling_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_ssl_ocsp_ctx_s  ngx_ssl_ocsp_ctx_t;[m
[31m-[m
[31m-struct ngx_ssl_ocsp_ctx_s {[m
[31m-    X509                        *cert;[m
[31m-    X509                        *issuer;[m
[31m-[m
[31m-    ngx_uint_t                   naddrs;[m
[31m-[m
[31m-    ngx_addr_t                  *addrs;[m
[31m-    ngx_str_t                    host;[m
[31m-    ngx_str_t                    uri;[m
[31m-    in_port_t                    port;[m
[31m-[m
[31m-    ngx_resolver_t              *resolver;[m
[31m-    ngx_msec_t                   resolver_timeout;[m
[31m-[m
[31m-    ngx_msec_t                   timeout;[m
[31m-[m
[31m-    void                       (*handler)(ngx_ssl_ocsp_ctx_t *r);[m
[31m-    void                        *data;[m
[31m-[m
[31m-    ngx_buf_t                   *request;[m
[31m-    ngx_buf_t                   *response;[m
[31m-    ngx_peer_connection_t        peer;[m
[31m-[m
[31m-    ngx_int_t                  (*process)(ngx_ssl_ocsp_ctx_t *r);[m
[31m-[m
[31m-    ngx_uint_t                   state;[m
[31m-[m
[31m-    ngx_uint_t                   code;[m
[31m-    ngx_uint_t                   count;[m
[31m-[m
[31m-    ngx_uint_t                   done;[m
[31m-[m
[31m-    u_char                      *header_name_start;[m
[31m-    u_char                      *header_name_end;[m
[31m-    u_char                      *header_start;[m
[31m-    u_char                      *header_end;[m
[31m-[m
[31m-    ngx_pool_t                  *pool;[m
[31m-    ngx_log_t                   *log;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_ssl_stapling_file(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *file);[m
[31m-static ngx_int_t ngx_ssl_stapling_issuer(ngx_conf_t *cf, ngx_ssl_t *ssl);[m
[31m-static ngx_int_t ngx_ssl_stapling_responder(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *responder);[m
[31m-[m
[31m-static int ngx_ssl_certificate_status_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    void *data);[m
[31m-static void ngx_ssl_stapling_update(ngx_ssl_stapling_t *staple);[m
[31m-static void ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-[m
[31m-static time_t ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time);[m
[31m-[m
[31m-static void ngx_ssl_stapling_cleanup(void *data);[m
[31m-[m
[31m-static ngx_ssl_ocsp_ctx_t *ngx_ssl_ocsp_start(void);[m
[31m-static void ngx_ssl_ocsp_done(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static void ngx_ssl_ocsp_request(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static void ngx_ssl_ocsp_resolve_handler(ngx_resolver_ctx_t *resolve);[m
[31m-static void ngx_ssl_ocsp_connect(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static void ngx_ssl_ocsp_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_ssl_ocsp_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_ssl_ocsp_dummy_handler(ngx_event_t *ev);[m
[31m-[m
[31m-static ngx_int_t ngx_ssl_ocsp_create_request(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_process_status_line(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_parse_status_line(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_process_headers(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_parse_header_line(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_process_body(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-[m
[31m-static u_char *ngx_ssl_ocsp_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file,[m
[31m-    ngx_str_t *responder, ngx_uint_t verify)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_pool_cleanup_t        *cln;[m
[31m-    ngx_ssl_stapling_t        *staple;[m
[31m-[m
[31m-    staple = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_stapling_t));[m
[31m-    if (staple == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_stapling_cleanup;[m
[31m-    cln->data = staple;[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_stapling_index, staple)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    staple->ssl_ctx = ssl->ctx;[m
[31m-    staple->timeout = 60000;[m
[31m-    staple->verify = verify;[m
[31m-[m
[31m-    if (file->len) {[m
[31m-        /* use OCSP response from the file */[m
[31m-[m
[31m-        if (ngx_ssl_stapling_file(cf, ssl, file) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_ssl_stapling_issuer(cf, ssl);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_ssl_stapling_responder(cf, ssl, responder);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    SSL_CTX_set_tlsext_status_cb(ssl->ctx, ngx_ssl_certificate_status_callback);[m
[31m-    SSL_CTX_set_tlsext_status_arg(ssl->ctx, staple);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_stapling_file(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file)[m
[31m-{[m
[31m-    BIO                 *bio;[m
[31m-    int                  len;[m
[31m-    u_char              *p, *buf;[m
[31m-    OCSP_RESPONSE       *response;[m
[31m-    ngx_ssl_stapling_t  *staple;[m
[31m-[m
[31m-    staple = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_stapling_index);[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_file((char *) file->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", file->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    response = d2i_OCSP_RESPONSE_bio(bio, NULL);[m
[31m-    if (response == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "d2i_OCSP_RESPONSE_bio(\"%s\") failed", file->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = i2d_OCSP_RESPONSE(response, NULL);[m
[31m-    if (len <= 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "i2d_OCSP_RESPONSE(\"%s\") failed", file->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_alloc(len, ssl->log);[m
[31m-    if (buf == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    p = buf;[m
[31m-    len = i2d_OCSP_RESPONSE(response, &p);[m
[31m-    if (len <= 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "i2d_OCSP_RESPONSE(\"%s\") failed", file->data);[m
[31m-        ngx_free(buf);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    OCSP_RESPONSE_free(response);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    staple->staple.data = buf;[m
[31m-    staple->staple.len = len;[m
[31m-    staple->valid = NGX_MAX_TIME_T_VALUE;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    OCSP_RESPONSE_free(response);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_stapling_issuer(ngx_conf_t *cf, ngx_ssl_t *ssl)[m
[31m-{[m
[31m-    int                  i, n, rc;[m
[31m-    X509                *cert, *issuer;[m
[31m-    X509_STORE          *store;[m
[31m-    X509_STORE_CTX      *store_ctx;[m
[31m-    STACK_OF(X509)      *chain;[m
[31m-    ngx_ssl_stapling_t  *staple;[m
[31m-[m
[31m-    staple = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_stapling_index);[m
[31m-    cert = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_certificate_index);[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10001000L[m
[31m-    SSL_CTX_get_extra_chain_certs(ssl->ctx, &chain);[m
[31m-#else[m
[31m-    chain = ssl->ctx->extra_certs;[m
[31m-#endif[m
[31m-[m
[31m-    n = sk_X509_num(chain);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0,[m
[31m-                   "SSL get issuer: %d extra certs", n);[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        issuer = sk_X509_value(chain, i);[m
[31m-        if (X509_check_issued(issuer, cert) == X509_V_OK) {[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100001L[m
[31m-            X509_up_ref(issuer);[m
[31m-#else[m
[31m-            CRYPTO_add(&issuer->references, 1, CRYPTO_LOCK_X509);[m
[31m-#endif[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0,[m
[31m-                           "SSL get issuer: found %p in extra certs", issuer);[m
[31m-[m
[31m-            staple->cert = cert;[m
[31m-            staple->issuer = issuer;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    store = SSL_CTX_get_cert_store(ssl->ctx);[m
[31m-    if (store == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_get_cert_store() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    store_ctx = X509_STORE_CTX_new();[m
[31m-    if (store_ctx == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_CTX_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_STORE_CTX_init(store_ctx, store, NULL, NULL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_CTX_init() failed");[m
[31m-        X509_STORE_CTX_free(store_ctx);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = X509_STORE_CTX_get1_issuer(&issuer, store_ctx, cert);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_CTX_get1_issuer() failed");[m
[31m-        X509_STORE_CTX_free(store_ctx);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                      "\"ssl_stapling\" ignored, issuer certificate not found");[m
[31m-        X509_STORE_CTX_free(store_ctx);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    X509_STORE_CTX_free(store_ctx);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0,[m
[31m-                   "SSL get issuer: found %p in cert store", issuer);[m
[31m-[m
[31m-    staple->cert = cert;[m
[31m-    staple->issuer = issuer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_stapling_responder(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *responder)[m
[31m-{[m
[31m-    ngx_url_t                  u;[m
[31m-    char                      *s;[m
[31m-    ngx_ssl_stapling_t        *staple;[m
[31m-    STACK_OF(OPENSSL_STRING)  *aia;[m
[31m-[m
[31m-    staple = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_stapling_index);[m
[31m-[m
[31m-    if (responder->len == 0) {[m
[31m-[m
[31m-        /* extract OCSP responder URL from certificate */[m
[31m-[m
[31m-        aia = X509_get1_ocsp(staple->cert);[m
[31m-        if (aia == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                          "\"ssl_stapling\" ignored, "[m
[31m-                          "no OCSP responder URL in the certificate");[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10000000L[m
[31m-        s = sk_OPENSSL_STRING_value(aia, 0);[m
[31m-#else[m
[31m-        s = sk_value(aia, 0);[m
[31m-#endif[m
[31m-        if (s == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                          "\"ssl_stapling\" ignored, "[m
[31m-                          "no OCSP responder URL in the certificate");[m
[31m-            X509_email_free(aia);[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        responder->len = ngx_strlen(s);[m
[31m-        responder->data = ngx_palloc(cf->pool, responder->len);[m
[31m-        if (responder->data == NULL) {[m
[31m-            X509_email_free(aia);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(responder->data, s, responder->len);[m
[31m-        X509_email_free(aia);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = *responder;[m
[31m-    u.default_port = 80;[m
[31m-    u.uri_part = 1;[m
[31m-[m
[31m-    if (u.url.len > 7[m
[31m-        && ngx_strncasecmp(u.url.data, (u_char *) "http://", 7) == 0)[m
[31m-    {[m
[31m-        u.url.len -= 7;[m
[31m-        u.url.data += 7;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                      "\"ssl_stapling\" ignored, "[m
[31m-                      "invalid URL prefix in OCSP responder \"%V\"", &u.url);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                          "\"ssl_stapling\" ignored, "[m
[31m-                          "%s in OCSP responder \"%V\"", u.err, &u.url);[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    staple->addrs = u.addrs;[m
[31m-    staple->host = u.host;[m
[31m-    staple->uri = u.uri;[m
[31m-    staple->port = u.port;[m
[31m-[m
[31m-    if (staple->uri.len == 0) {[m
[31m-        ngx_str_set(&staple->uri, "/");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_resolver_t *resolver, ngx_msec_t resolver_timeout)[m
[31m-{[m
[31m-    ngx_ssl_stapling_t  *staple;[m
[31m-[m
[31m-    staple = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_stapling_index);[m
[31m-[m
[31m-    staple->resolver = resolver;[m
[31m-    staple->resolver_timeout = resolver_timeout;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_certificate_status_callback(ngx_ssl_conn_t *ssl_conn, void *data)[m
[31m-{[m
[31m-    int                  rc;[m
[31m-    u_char              *p;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_ssl_stapling_t  *staple;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL certificate status callback");[m
[31m-[m
[31m-    staple = data;[m
[31m-    rc = SSL_TLSEXT_ERR_NOACK;[m
[31m-[m
[31m-    if (staple->staple.len[m
[31m-        && staple->valid >= ngx_time())[m
[31m-    {[m
[31m-        /* we have to copy ocsp response as OpenSSL will free it by itself */[m
[31m-[m
[31m-        p = OPENSSL_malloc(staple->staple.len);[m
[31m-        if (p == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "OPENSSL_malloc() failed");[m
[31m-            return SSL_TLSEXT_ERR_NOACK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, staple->staple.data, staple->staple.len);[m
[31m-[m
[31m-        SSL_set_tlsext_status_ocsp_resp(ssl_conn, p, staple->staple.len);[m
[31m-[m
[31m-        rc = SSL_TLSEXT_ERR_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_stapling_update(staple);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_stapling_update(ngx_ssl_stapling_t *staple)[m
[31m-{[m
[31m-    ngx_ssl_ocsp_ctx_t  *ctx;[m
[31m-[m
[31m-    if (staple->host.len == 0[m
[31m-        || staple->loading || staple->refresh >= ngx_time())[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    staple->loading = 1;[m
[31m-[m
[31m-    ctx = ngx_ssl_ocsp_start();[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cert = staple->cert;[m
[31m-    ctx->issuer = staple->issuer;[m
[31m-[m
[31m-    ctx->addrs = staple->addrs;[m
[31m-    ctx->host = staple->host;[m
[31m-    ctx->uri = staple->uri;[m
[31m-    ctx->port = staple->port;[m
[31m-    ctx->timeout = staple->timeout;[m
[31m-[m
[31m-    ctx->resolver = staple->resolver;[m
[31m-    ctx->resolver_timeout = staple->resolver_timeout;[m
[31m-[m
[31m-    ctx->handler = ngx_ssl_stapling_ocsp_handler;[m
[31m-    ctx->data = staple;[m
[31m-[m
[31m-    ngx_ssl_ocsp_request(ctx);[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                *p;[m
[31m-    int                    n;[m
[31m-    size_t                 len;[m
[31m-    time_t                 now, valid;[m
[31m-    ngx_str_t              response;[m
[31m-    X509_STORE            *store;[m
[31m-    STACK_OF(X509)        *chain;[m
[31m-    OCSP_CERTID           *id;[m
[31m-    OCSP_RESPONSE         *ocsp;[m
[31m-    OCSP_BASICRESP        *basic;[m
[31m-    ngx_ssl_stapling_t    *staple;[m
[31m-    ASN1_GENERALIZEDTIME  *thisupdate, *nextupdate;[m
[31m-[m
[31m-    staple = ctx->data;[m
[31m-    now = ngx_time();[m
[31m-    ocsp = NULL;[m
[31m-    basic = NULL;[m
[31m-    id = NULL;[m
[31m-[m
[31m-    if (ctx->code != 200) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    /* check the response */[m
[31m-[m
[31m-    len = ctx->response->last - ctx->response->pos;[m
[31m-    p = ctx->response->pos;[m
[31m-[m
[31m-    ocsp = d2i_OCSP_RESPONSE(NULL, &p, len);[m
[31m-    if (ocsp == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "d2i_OCSP_RESPONSE() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    n = OCSP_response_status(ocsp);[m
[31m-[m
[31m-    if (n != OCSP_RESPONSE_STATUS_SUCCESSFUL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP response not successful (%d: %s)",[m
[31m-                      n, OCSP_response_status_str(n));[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    basic = OCSP_response_get1_basic(ocsp);[m
[31m-    if (basic == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP_response_get1_basic() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    store = SSL_CTX_get_cert_store(staple->ssl_ctx);[m
[31m-    if (store == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "SSL_CTX_get_cert_store() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10001000L[m
[31m-    SSL_CTX_get_extra_chain_certs(staple->ssl_ctx, &chain);[m
[31m-#else[m
[31m-    chain = staple->ssl_ctx->extra_certs;[m
[31m-#endif[m
[31m-[m
[31m-    if (OCSP_basic_verify(basic, chain, store,[m
[31m-                          staple->verify ? OCSP_TRUSTOTHER : OCSP_NOVERIFY)[m
[31m-        != 1)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP_basic_verify() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    id = OCSP_cert_to_id(NULL, ctx->cert, ctx->issuer);[m
[31m-    if (id == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "OCSP_cert_to_id() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_resp_find_status(basic, id, &n, NULL, NULL,[m
[31m-                              &thisupdate, &nextupdate)[m
[31m-        != 1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "certificate status not found in the OCSP response");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (n != V_OCSP_CERTSTATUS_GOOD) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "certificate status \"%s\" in the OCSP response",[m
[31m-                      OCSP_cert_status_str(n));[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_check_validity(thisupdate, nextupdate, 300, -1) != 1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP_check_validity() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (nextupdate) {[m
[31m-        valid = ngx_ssl_stapling_time(nextupdate);[m
[31m-        if (valid == (time_t) NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                          "invalid nextUpdate time in certificate status");[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        valid = NGX_MAX_TIME_T_VALUE;[m
[31m-    }[m
[31m-[m
[31m-    OCSP_CERTID_free(id);[m
[31m-    OCSP_BASICRESP_free(basic);[m
[31m-    OCSP_RESPONSE_free(ocsp);[m
[31m-[m
[31m-    id = NULL;[m
[31m-    basic = NULL;[m
[31m-    ocsp = NULL;[m
[31m-[m
[31m-    /* copy the response to memory not in ctx->pool */[m
[31m-[m
[31m-    response.len = len;[m
[31m-    response.data = ngx_alloc(response.len, ctx->log);[m
[31m-[m
[31m-    if (response.data == NULL) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(response.data, ctx->response->pos, response.len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp response, %s, %uz",[m
[31m-                   OCSP_cert_status_str(n), response.len);[m
[31m-[m
[31m-    if (staple->staple.data) {[m
[31m-        ngx_free(staple->staple.data);[m
[31m-    }[m
[31m-[m
[31m-    staple->staple = response;[m
[31m-    staple->valid = valid;[m
[31m-[m
[31m-    /*[m
[31m-     * refresh before the response expires,[m
[31m-     * but not earlier than in 5 minutes, and at least in an hour[m
[31m-     */[m
[31m-[m
[31m-    staple->loading = 0;[m
[31m-    staple->refresh = ngx_max(ngx_min(valid - 300, now + 3600), now + 300);[m
[31m-[m
[31m-    ngx_ssl_ocsp_done(ctx);[m
[31m-    return;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    staple->loading = 0;[m
[31m-    staple->refresh = now + 300;[m
[31m-[m
[31m-    if (id) {[m
[31m-        OCSP_CERTID_free(id);[m
[31m-    }[m
[31m-[m
[31m-    if (basic) {[m
[31m-        OCSP_BASICRESP_free(basic);[m
[31m-    }[m
[31m-[m
[31m-    if (ocsp) {[m
[31m-        OCSP_RESPONSE_free(ocsp);[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_ocsp_done(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time)[m
[31m-{[m
[31m-    u_char  *value;[m
[31m-    size_t   len;[m
[31m-    time_t   time;[m
[31m-    BIO     *bio;[m
[31m-[m
[31m-    /*[m
[31m-     * OpenSSL doesn't provide a way to convert ASN1_GENERALIZEDTIME[m
[31m-     * into time_t.  To do this, we use ASN1_GENERALIZEDTIME_print(),[m
[31m-     * which uses the "MMM DD HH:MM:SS YYYY [GMT]" format (e.g.,[m
[31m-     * "Feb  3 00:55:52 2015 GMT"), and parse the result.[m
[31m-     */[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* fake weekday prepended to match C asctime() format */[m
[31m-[m
[31m-    BIO_write(bio, "Tue ", sizeof("Tue ") - 1);[m
[31m-    ASN1_GENERALIZEDTIME_print(bio, asn1time);[m
[31m-    len = BIO_get_mem_data(bio, &value);[m
[31m-[m
[31m-    time = ngx_parse_http_time(value, len);[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return time;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_stapling_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_ssl_stapling_t  *staple = data;[m
[31m-[m
[31m-    if (staple->issuer) {[m
[31m-        X509_free(staple->issuer);[m
[31m-    }[m
[31m-[m
[31m-    if (staple->staple.data) {[m
[31m-        ngx_free(staple->staple.data);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_ssl_ocsp_ctx_t *[m
[31m-ngx_ssl_ocsp_start(void)[m
[31m-{[m
[31m-    ngx_log_t           *log;[m
[31m-    ngx_pool_t          *pool;[m
[31m-    ngx_ssl_ocsp_ctx_t  *ctx;[m
[31m-[m
[31m-    pool = ngx_create_pool(2048, ngx_cycle->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(pool, sizeof(ngx_ssl_ocsp_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    log = ngx_palloc(pool, sizeof(ngx_log_t));[m
[31m-    if (log == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->pool = pool;[m
[31m-[m
[31m-    *log = *ctx->pool->log;[m
[31m-[m
[31m-    ctx->pool->log = log;[m
[31m-    ctx->log = log;[m
[31m-[m
[31m-    log->handler = ngx_ssl_ocsp_log_error;[m
[31m-    log->data = ctx;[m
[31m-    log->action = "requesting certificate status";[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_done(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp done");[m
[31m-[m
[31m-    if (ctx->peer.connection) {[m
[31m-        ngx_close_connection(ctx->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(ctx->pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_error(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp error");[m
[31m-[m
[31m-    ctx->code = 0;[m
[31m-    ctx->handler(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_request(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t  *resolve, temp;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp request");[m
[31m-[m
[31m-    if (ngx_ssl_ocsp_create_request(ctx) != NGX_OK) {[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->resolver) {[m
[31m-        /* resolve OCSP responder hostname */[m
[31m-[m
[31m-        temp.name = ctx->host;[m
[31m-[m
[31m-        resolve = ngx_resolve_start(ctx->resolver, &temp);[m
[31m-        if (resolve == NULL) {[m
[31m-            ngx_ssl_ocsp_error(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (resolve == NGX_NO_RESOLVER) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, ctx->log, 0,[m
[31m-                          "no resolver defined to resolve %V", &ctx->host);[m
[31m-            goto connect;[m
[31m-        }[m
[31m-[m
[31m-        resolve->name = ctx->host;[m
[31m-        resolve->handler = ngx_ssl_ocsp_resolve_handler;[m
[31m-        resolve->data = ctx;[m
[31m-        resolve->timeout = ctx->resolver_timeout;[m
[31m-[m
[31m-        if (ngx_resolve_name(resolve) != NGX_OK) {[m
[31m-            ngx_ssl_ocsp_error(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-connect:[m
[31m-[m
[31m-    ngx_ssl_ocsp_connect(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_resolve_handler(ngx_resolver_ctx_t *resolve)[m
[31m-{[m
[31m-    ngx_ssl_ocsp_ctx_t *ctx = resolve->data;[m
[31m-[m
[31m-    u_char           *p;[m
[31m-    size_t            len;[m
[31m-    in_port_t         port;[m
[31m-    socklen_t         socklen;[m
[31m-    ngx_uint_t        i;[m
[31m-    struct sockaddr  *sockaddr;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp resolve handler");[m
[31m-[m
[31m-    if (resolve->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "%V could not be resolved (%i: %s)",[m
[31m-                      &resolve->name, resolve->state,[m
[31m-                      ngx_resolver_strerror(resolve->state));[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t  addr;[m
[31m-[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < resolve->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(resolve->addrs[i].sockaddr,[m
[31m-                                 resolve->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx->naddrs = resolve->naddrs;[m
[31m-    ctx->addrs = ngx_pcalloc(ctx->pool, ctx->naddrs * sizeof(ngx_addr_t));[m
[31m-[m
[31m-    if (ctx->addrs == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    port = htons(ctx->port);[m
[31m-[m
[31m-    for (i = 0; i < resolve->naddrs; i++) {[m
[31m-[m
[31m-        socklen = resolve->addrs[i].socklen;[m
[31m-[m
[31m-        sockaddr = ngx_palloc(ctx->pool, socklen);[m
[31m-        if (sockaddr == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(sockaddr, resolve->addrs[i].sockaddr, socklen);[m
[31m-[m
[31m-        switch (sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            ((struct sockaddr_in6 *) sockaddr)->sin6_port = port;[m
[31m-            break;[m
[31m-#endif[m
[31m-        default: /* AF_INET */[m
[31m-            ((struct sockaddr_in *) sockaddr)->sin_port = port;[m
[31m-        }[m
[31m-[m
[31m-        ctx->addrs[i].sockaddr = sockaddr;[m
[31m-        ctx->addrs[i].socklen = socklen;[m
[31m-[m
[31m-        p = ngx_pnalloc(ctx->pool, NGX_SOCKADDR_STRLEN);[m
[31m-        if (p == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        ctx->addrs[i].name.len = len;[m
[31m-        ctx->addrs[i].name.data = p;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(resolve);[m
[31m-[m
[31m-    ngx_ssl_ocsp_connect(ctx);[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_resolve_name_done(resolve);[m
[31m-    ngx_ssl_ocsp_error(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_connect(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t    rc;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp connect");[m
[31m-[m
[31m-    /* TODO: use all ip addresses */[m
[31m-[m
[31m-    ctx->peer.sockaddr = ctx->addrs[0].sockaddr;[m
[31m-    ctx->peer.socklen = ctx->addrs[0].socklen;[m
[31m-    ctx->peer.name = &ctx->addrs[0].name;[m
[31m-    ctx->peer.get = ngx_event_get_peer;[m
[31m-    ctx->peer.log = ctx->log;[m
[31m-    ctx->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&ctx->peer);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp connect peer done");[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->peer.connection->data = ctx;[m
[31m-    ctx->peer.connection->pool = ctx->pool;[m
[31m-[m
[31m-    ctx->peer.connection->read->handler = ngx_ssl_ocsp_read_handler;[m
[31m-    ctx->peer.connection->write->handler = ngx_ssl_ocsp_write_handler;[m
[31m-[m
[31m-    ctx->process = ngx_ssl_ocsp_process_status_line;[m
[31m-[m
[31m-    ngx_add_timer(ctx->peer.connection->read, ctx->timeout);[m
[31m-    ngx_add_timer(ctx->peer.connection->write, ctx->timeout);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        ngx_ssl_ocsp_write_handler(ctx->peer.connection->write);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ssize_t              n, size;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_ssl_ocsp_ctx_t  *ctx;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    ctx = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0,[m
[31m-                   "ssl ocsp write handler");[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT,[m
[31m-                      "OCSP responder timed out");[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    size = ctx->request->last - ctx->request->pos;[m
[31m-[m
[31m-    n = ngx_send(c, ctx->request->pos, size);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        ctx->request->pos += n;[m
[31m-[m
[31m-        if (n == size) {[m
[31m-            wev->handler = ngx_ssl_ocsp_dummy_handler;[m
[31m-[m
[31m-            if (wev->timer_set) {[m
[31m-                ngx_del_timer(wev);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-                ngx_ssl_ocsp_error(ctx);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!wev->timer_set) {[m
[31m-        ngx_add_timer(wev, ctx->timeout);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t            n, size;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_ssl_ocsp_ctx_t    *ctx;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    ctx = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0,[m
[31m-                   "ssl ocsp read handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT,[m
[31m-                      "OCSP responder timed out");[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->response == NULL) {[m
[31m-        ctx->response = ngx_create_temp_buf(ctx->pool, 16384);[m
[31m-        if (ctx->response == NULL) {[m
[31m-            ngx_ssl_ocsp_error(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        size = ctx->response->end - ctx->response->last;[m
[31m-[m
[31m-        n = ngx_recv(c, ctx->response->last, size);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            ctx->response->last += n;[m
[31m-[m
[31m-            rc = ctx->process(ctx);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                ngx_ssl_ocsp_error(ctx);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_ssl_ocsp_error(ctx);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    rc = ctx->process(ctx);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        /* ctx->handler() was called */[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                  "OCSP responder prematurely closed connection");[m
[31m-[m
[31m-    ngx_ssl_ocsp_error(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "ssl ocsp dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_create_request(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    int            len;[m
[31m-    u_char        *p;[m
[31m-    uintptr_t      escape;[m
[31m-    ngx_str_t      binary, base64;[m
[31m-    ngx_buf_t     *b;[m
[31m-    OCSP_CERTID   *id;[m
[31m-    OCSP_REQUEST  *ocsp;[m
[31m-[m
[31m-    ocsp = OCSP_REQUEST_new();[m
[31m-    if (ocsp == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "OCSP_REQUEST_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    id = OCSP_cert_to_id(NULL, ctx->cert, ctx->issuer);[m
[31m-    if (id == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "OCSP_cert_to_id() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_request_add0_id(ocsp, id) == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "OCSP_request_add0_id() failed");[m
[31m-        OCSP_CERTID_free(id);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = i2d_OCSP_REQUEST(ocsp, NULL);[m
[31m-    if (len <= 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "i2d_OCSP_REQUEST() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    binary.len = len;[m
[31m-    binary.data = ngx_palloc(ctx->pool, len);[m
[31m-    if (binary.data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    p = binary.data;[m
[31m-    len = i2d_OCSP_REQUEST(ocsp, &p);[m
[31m-    if (len <= 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ctx->log, 0,[m
[31m-                      "i2d_OCSP_REQUEST() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    base64.len = ngx_base64_encoded_length(binary.len);[m
[31m-    base64.data = ngx_palloc(ctx->pool, base64.len);[m
[31m-    if (base64.data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_encode_base64(&base64, &binary);[m
[31m-[m
[31m-    escape = ngx_escape_uri(NULL, base64.data, base64.len,[m
[31m-                            NGX_ESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp request length %z, escape %d",[m
[31m-                   base64.len, (int) escape);[m
[31m-[m
[31m-    len = sizeof("GET ") - 1 + ctx->uri.len + sizeof("/") - 1[m
[31m-          + base64.len + 2 * escape + sizeof(" HTTP/1.0" CRLF) - 1[m
[31m-          + sizeof("Host: ") - 1 + ctx->host.len + sizeof(CRLF) - 1[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(ctx->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    p = b->last;[m
[31m-[m
[31m-    p = ngx_cpymem(p, "GET ", sizeof("GET ") - 1);[m
[31m-    p = ngx_cpymem(p, ctx->uri.data, ctx->uri.len);[m
[31m-[m
[31m-    if (ctx->uri.data[ctx->uri.len - 1] != '/') {[m
[31m-        *p++ = '/';[m
[31m-    }[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_cpymem(p, base64.data, base64.len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_escape_uri(p, base64.data, base64.len,[m
[31m-                                      NGX_ESCAPE_URI_COMPONENT);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(p, " HTTP/1.0" CRLF, sizeof(" HTTP/1.0" CRLF) - 1);[m
[31m-    p = ngx_cpymem(p, "Host: ", sizeof("Host: ") - 1);[m
[31m-    p = ngx_cpymem(p, ctx->host.data, ctx->host.len);[m
[31m-    *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-    /* add "\r\n" at the header end */[m
[31m-    *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-    b->last = p;[m
[31m-    ctx->request = b;[m
[31m-[m
[31m-    OCSP_REQUEST_free(ocsp);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    OCSP_REQUEST_free(ocsp);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_process_status_line(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    rc = ngx_ssl_ocsp_parse_status_line(ctx);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-#if 0[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                       "ssl ocsp status line \"%*s\"",[m
[31m-                       ctx->response->pos - ctx->response->start,[m
[31m-                       ctx->response->start);[m
[31m-#endif[m
[31m-[m
[31m-        ctx->process = ngx_ssl_ocsp_process_headers;[m
[31m-        return ctx->process(ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR */[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                  "OCSP responder sent invalid response");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_parse_status_line(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    u_char     *p;[m
[31m-    ngx_buf_t  *b;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_H,[m
[31m-        sw_HT,[m
[31m-        sw_HTT,[m
[31m-        sw_HTTP,[m
[31m-        sw_first_major_digit,[m
[31m-        sw_major_digit,[m
[31m-        sw_first_minor_digit,[m
[31m-        sw_minor_digit,[m
[31m-        sw_status,[m
[31m-        sw_space_after_status,[m
[31m-        sw_status_text,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp process status line");[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-    b = ctx->response;[m
[31m-[m
[31m-    for (p = b->pos; p < b->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* "HTTP/" */[m
[31m-        case sw_start:[m
[31m-            switch (ch) {[m
[31m-            case 'H':[m
[31m-                state = sw_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_H:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_HT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HT:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_HTT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HTT:[m
[31m-            switch (ch) {[m
[31m-            case 'P':[m
[31m-                state = sw_HTTP;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HTTP:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_first_major_digit;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* the first digit of major HTTP version */[m
[31m-        case sw_first_major_digit:[m
[31m-            if (ch < '1' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_major_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* the major HTTP version or dot */[m
[31m-        case sw_major_digit:[m
[31m-            if (ch == '.') {[m
[31m-                state = sw_first_minor_digit;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* the first digit of minor HTTP version */[m
[31m-        case sw_first_minor_digit:[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_minor_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* the minor HTTP version or the end of the request line */[m
[31m-        case sw_minor_digit:[m
[31m-            if (ch == ' ') {[m
[31m-                state = sw_status;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* HTTP status code */[m
[31m-        case sw_status:[m
[31m-            if (ch == ' ') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->code = ctx->code * 10 + ch - '0';[m
[31m-[m
[31m-            if (++ctx->count == 3) {[m
[31m-                state = sw_space_after_status;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* space or end of line */[m
[31m-        case sw_space_after_status:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                state = sw_status_text;[m
[31m-                break;[m
[31m-            case '.':                    /* IIS may send 403.1, 403.2, etc */[m
[31m-                state = sw_status_text;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* any text until end of line */[m
[31m-        case sw_status_text:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of status line */[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = p;[m
[31m-    ctx->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_process_headers(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t     len;[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp process headers");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        rc = ngx_ssl_ocsp_parse_header_line(ctx);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                           "ssl ocsp header \"%*s: %*s\"",[m
[31m-                           ctx->header_name_end - ctx->header_name_start,[m
[31m-                           ctx->header_name_start,[m
[31m-                           ctx->header_end - ctx->header_start,[m
[31m-                           ctx->header_start);[m
[31m-[m
[31m-            len = ctx->header_name_end - ctx->header_name_start;[m
[31m-[m
[31m-            if (len == sizeof("Content-Type") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Content-Type",[m
[31m-                                   sizeof("Content-Type") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                if (len != sizeof("application/ocsp-response") - 1[m
[31m-                    || ngx_strncasecmp(ctx->header_start,[m
[31m-                                       (u_char *) "application/ocsp-response",[m
[31m-                                       sizeof("application/ocsp-response") - 1)[m
[31m-                       != 0)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                                  "OCSP responder sent invalid "[m
[31m-                                  "\"Content-Type\" header: \"%*s\"",[m
[31m-                                  ctx->header_end - ctx->header_start,[m
[31m-                                  ctx->header_start);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* TODO: honor Content-Length */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_ERROR */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP responder sent invalid response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->process = ngx_ssl_ocsp_process_body;[m
[31m-    return ctx->process(ctx);[m
[31m-}[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_parse_header_line(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char      c, ch, *p;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_name,[m
[31m-        sw_space_before_value,[m
[31m-        sw_value,[m
[31m-        sw_space_after_value,[m
[31m-        sw_almost_done,[m
[31m-        sw_header_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-[m
[31m-    for (p = ctx->response->pos; p < ctx->response->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-#if 0[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                       "s:%d in:'%02Xd:%c'", state, ch, ch);[m
[31m-#endif[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* first char */[m
[31m-        case sw_start:[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_header_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_end = p;[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                state = sw_name;[m
[31m-                ctx->header_name_start = p;[m
[31m-[m
[31m-                c = (u_char) (ch | 0x20);[m
[31m-                if (c >= 'a' && c <= 'z') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (ch >= '0' && ch <= '9') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header name */[m
[31m-        case sw_name:[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                ctx->header_name_end = p;[m
[31m-                state = sw_space_before_value;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '-') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == CR) {[m
[31m-                ctx->header_name_end = p;[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == LF) {[m
[31m-                ctx->header_name_end = p;[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        /* space* before header value */[m
[31m-        case sw_space_before_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                ctx->header_start = p;[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header value */[m
[31m-        case sw_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_space_after_value;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before end of header line */[m
[31m-        case sw_space_after_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of header line */[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        /* end of header */[m
[31m-        case sw_header_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->response->pos = p;[m
[31m-    ctx->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-header_done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_process_body(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp process body");[m
[31m-[m
[31m-    if (ctx->done) {[m
[31m-        ctx->handler(ctx);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_ssl_ocsp_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_ssl_ocsp_ctx_t  *ctx;[m
[31m-[m
[31m-    p = buf;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-    }[m
[31m-[m
[31m-    ctx = log->data;[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        p = ngx_snprintf(p, len, ", responder: %V", &ctx->host);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file,[m
[31m-    ngx_str_t *responder, ngx_uint_t verify)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                  "\"ssl_stapling\" ignored, not supported");[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_resolver_t *resolver, ngx_msec_t resolver_timeout)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_pipe.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_pipe.c[m
[1mdeleted file mode 100644[m
[1mindex 5ce59ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_pipe.c[m
[1m+++ /dev/null[m
[36m@@ -1,1095 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_pipe.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_event_pipe_read_upstream(ngx_event_pipe_t *p);[m
[31m-static ngx_int_t ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p);[m
[31m-[m
[31m-static ngx_int_t ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p);[m
[31m-static ngx_inline void ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_event_pipe_drain_chains(ngx_event_pipe_t *p);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_uint_t    flags;[m
[31m-    ngx_event_t  *rev, *wev;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (do_write) {[m
[31m-            p->log->action = "sending to client";[m
[31m-[m
[31m-            rc = ngx_event_pipe_write_to_downstream(p);[m
[31m-[m
[31m-            if (rc == NGX_ABORT) {[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_BUSY) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        p->read = 0;[m
[31m-        p->upstream_blocked = 0;[m
[31m-[m
[31m-        p->log->action = "reading upstream";[m
[31m-[m
[31m-        if (ngx_event_pipe_read_upstream(p) == NGX_ABORT) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        if (!p->read && !p->upstream_blocked) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        do_write = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (p->upstream->fd != (ngx_socket_t) -1) {[m
[31m-        rev = p->upstream->read;[m
[31m-[m
[31m-        flags = (rev->eof || rev->error) ? NGX_CLOSE_EVENT : 0;[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, flags) != NGX_OK) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        if (!rev->delayed) {[m
[31m-            if (rev->active && !rev->ready) {[m
[31m-                ngx_add_timer(rev, p->read_timeout);[m
[31m-[m
[31m-            } else if (rev->timer_set) {[m
[31m-                ngx_del_timer(rev);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->downstream->fd != (ngx_socket_t) -1[m
[31m-        && p->downstream->data == p->output_ctx)[m
[31m-    {[m
[31m-        wev = p->downstream->write;[m
[31m-        if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            if (wev->active && !wev->ready) {[m
[31m-                ngx_add_timer(wev, p->send_timeout);[m
[31m-[m
[31m-            } else if (wev->timer_set) {[m
[31m-                ngx_del_timer(wev);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_pipe_read_upstream(ngx_event_pipe_t *p)[m
[31m-{[m
[31m-    off_t         limit;[m
[31m-    ssize_t       n, size;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_msec_t    delay;[m
[31m-    ngx_chain_t  *chain, *cl, *ln;[m
[31m-[m
[31m-    if (p->upstream_eof || p->upstream_error || p->upstream_done) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (p->aio) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe read upstream: aio");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                   "pipe read upstream: %d", p->upstream->read->ready);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (p->upstream_eof || p->upstream_error || p->upstream_done) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (p->preread_bufs == NULL && !p->upstream->read->ready) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (p->preread_bufs) {[m
[31m-[m
[31m-            /* use the pre-read bufs if they exist */[m
[31m-[m
[31m-            chain = p->preread_bufs;[m
[31m-            p->preread_bufs = NULL;[m
[31m-            n = p->preread_size;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "pipe preread: %z", n);[m
[31m-[m
[31m-            if (n) {[m
[31m-                p->read = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            /*[m
[31m-             * kqueue notifies about the end of file or a pending error.[m
[31m-             * This test allows not to allocate a buf on these conditions[m
[31m-             * and not to call c->recv_chain().[m
[31m-             */[m
[31m-[m
[31m-            if (p->upstream->read->available == 0[m
[31m-                && p->upstream->read->pending_eof)[m
[31m-            {[m
[31m-                p->upstream->read->ready = 0;[m
[31m-                p->upstream->read->eof = 1;[m
[31m-                p->upstream_eof = 1;[m
[31m-                p->read = 1;[m
[31m-[m
[31m-                if (p->upstream->read->kq_errno) {[m
[31m-                    p->upstream->read->error = 1;[m
[31m-                    p->upstream_error = 1;[m
[31m-                    p->upstream_eof = 0;[m
[31m-[m
[31m-                    ngx_log_error(NGX_LOG_ERR, p->log,[m
[31m-                                  p->upstream->read->kq_errno,[m
[31m-                                  "kevent() reported that upstream "[m
[31m-                                  "closed connection");[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (p->limit_rate) {[m
[31m-                if (p->upstream->read->delayed) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                limit = (off_t) p->limit_rate * (ngx_time() - p->start_sec + 1)[m
[31m-                        - p->read_length;[m
[31m-[m
[31m-                if (limit <= 0) {[m
[31m-                    p->upstream->read->delayed = 1;[m
[31m-                    delay = (ngx_msec_t) (- limit * 1000 / p->limit_rate + 1);[m
[31m-                    ngx_add_timer(p->upstream->read, delay);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                limit = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (p->free_raw_bufs) {[m
[31m-[m
[31m-                /* use the free bufs if they exist */[m
[31m-[m
[31m-                chain = p->free_raw_bufs;[m
[31m-                if (p->single_buf) {[m
[31m-                    p->free_raw_bufs = p->free_raw_bufs->next;[m
[31m-                    chain->next = NULL;[m
[31m-                } else {[m
[31m-                    p->free_raw_bufs = NULL;[m
[31m-                }[m
[31m-[m
[31m-            } else if (p->allocated < p->bufs.num) {[m
[31m-[m
[31m-                /* allocate a new buf if it's still allowed */[m
[31m-[m
[31m-                b = ngx_create_temp_buf(p->pool, p->bufs.size);[m
[31m-                if (b == NULL) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                p->allocated++;[m
[31m-[m
[31m-                chain = ngx_alloc_chain_link(p->pool);[m
[31m-                if (chain == NULL) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                chain->buf = b;[m
[31m-                chain->next = NULL;[m
[31m-[m
[31m-            } else if (!p->cacheable[m
[31m-                       && p->downstream->data == p->output_ctx[m
[31m-                       && p->downstream->write->ready[m
[31m-                       && !p->downstream->write->delayed)[m
[31m-            {[m
[31m-                /*[m
[31m-                 * if the bufs are not needed to be saved in a cache and[m
[31m-                 * a downstream is ready then write the bufs to a downstream[m
[31m-                 */[m
[31m-[m
[31m-                p->upstream_blocked = 1;[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe downstream ready");[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            } else if (p->cacheable[m
[31m-                       || p->temp_file->offset < p->max_temp_file_size)[m
[31m-            {[m
[31m-[m
[31m-                /*[m
[31m-                 * if it is allowed, then save some bufs from p->in[m
[31m-                 * to a temporary file, and add them to a p->out chain[m
[31m-                 */[m
[31m-[m
[31m-                rc = ngx_event_pipe_write_chain_to_temp_file(p);[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe temp offset: %O", p->temp_file->offset);[m
[31m-[m
[31m-                if (rc == NGX_BUSY) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                chain = p->free_raw_bufs;[m
[31m-                if (p->single_buf) {[m
[31m-                    p->free_raw_bufs = p->free_raw_bufs->next;[m
[31m-                    chain->next = NULL;[m
[31m-                } else {[m
[31m-                    p->free_raw_bufs = NULL;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                /* there are no bufs to read in */[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "no pipe bufs to read in");[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            n = p->upstream->recv_chain(p->upstream, chain, limit);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "pipe recv chain: %z", n);[m
[31m-[m
[31m-            if (p->free_raw_bufs) {[m
[31m-                chain->next = p->free_raw_bufs;[m
[31m-            }[m
[31m-            p->free_raw_bufs = chain;[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                p->upstream_error = 1;[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                if (p->single_buf) {[m
[31m-                    ngx_event_pipe_remove_shadow_links(chain->buf);[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            p->read = 1;[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                p->upstream_eof = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        delay = p->limit_rate ? (ngx_msec_t) n * 1000 / p->limit_rate : 0;[m
[31m-[m
[31m-        p->read_length += n;[m
[31m-        cl = chain;[m
[31m-        p->free_raw_bufs = NULL;[m
[31m-[m
[31m-        while (cl && n > 0) {[m
[31m-[m
[31m-            ngx_event_pipe_remove_shadow_links(cl->buf);[m
[31m-[m
[31m-            size = cl->buf->end - cl->buf->last;[m
[31m-[m
[31m-            if (n >= size) {[m
[31m-                cl->buf->last = cl->buf->end;[m
[31m-[m
[31m-                /* STUB */ cl->buf->num = p->num++;[m
[31m-[m
[31m-                if (p->input_filter(p, cl->buf) == NGX_ERROR) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                n -= size;[m
[31m-                ln = cl;[m
[31m-                cl = cl->next;[m
[31m-                ngx_free_chain(p->pool, ln);[m
[31m-[m
[31m-            } else {[m
[31m-                cl->buf->last += n;[m
[31m-                n = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (cl) {[m
[31m-            for (ln = cl; ln->next; ln = ln->next) { /* void */ }[m
[31m-[m
[31m-            ln->next = p->free_raw_bufs;[m
[31m-            p->free_raw_bufs = cl;[m
[31m-        }[m
[31m-[m
[31m-        if (delay > 0) {[m
[31m-            p->upstream->read->delayed = 1;[m
[31m-            ngx_add_timer(p->upstream->read, delay);[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    for (cl = p->busy; cl; cl = cl->next) {[m
[31m-        ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe buf busy s:%d t:%d f:%d "[m
[31m-                       "%p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       (cl->buf->shadow ? 1 : 0),[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = p->out; cl; cl = cl->next) {[m
[31m-        ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe buf out  s:%d t:%d f:%d "[m
[31m-                       "%p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       (cl->buf->shadow ? 1 : 0),[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = p->in; cl; cl = cl->next) {[m
[31m-        ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe buf in   s:%d t:%d f:%d "[m
[31m-                       "%p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       (cl->buf->shadow ? 1 : 0),[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = p->free_raw_bufs; cl; cl = cl->next) {[m
[31m-        ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe buf free s:%d t:%d f:%d "[m
[31m-                       "%p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       (cl->buf->shadow ? 1 : 0),[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                   "pipe length: %O", p->length);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (p->free_raw_bufs && p->length != -1) {[m
[31m-        cl = p->free_raw_bufs;[m
[31m-[m
[31m-        if (cl->buf->last - cl->buf->pos >= p->length) {[m
[31m-[m
[31m-            p->free_raw_bufs = cl->next;[m
[31m-[m
[31m-            /* STUB */ cl->buf->num = p->num++;[m
[31m-[m
[31m-            if (p->input_filter(p, cl->buf) == NGX_ERROR) {[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            ngx_free_chain(p->pool, cl);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->length == 0) {[m
[31m-        p->upstream_done = 1;[m
[31m-        p->read = 1;[m
[31m-    }[m
[31m-[m
[31m-    if ((p->upstream_eof || p->upstream_error) && p->free_raw_bufs) {[m
[31m-[m
[31m-        /* STUB */ p->free_raw_bufs->buf->num = p->num++;[m
[31m-[m
[31m-        if (p->input_filter(p, p->free_raw_bufs->buf) == NGX_ERROR) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        p->free_raw_bufs = p->free_raw_bufs->next;[m
[31m-[m
[31m-        if (p->free_bufs && p->buf_to_file == NULL) {[m
[31m-            for (cl = p->free_raw_bufs; cl; cl = cl->next) {[m
[31m-                if (cl->buf->shadow == NULL) {[m
[31m-                    ngx_pfree(p->pool, cl->buf->start);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->cacheable && (p->in || p->buf_to_file)) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe write chain");[m
[31m-[m
[31m-        rc = ngx_event_pipe_write_chain_to_temp_file(p);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p)[m
[31m-{[m
[31m-    u_char            *prev;[m
[31m-    size_t             bsize;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_uint_t         flush, flushed, prev_last_shadow;[m
[31m-    ngx_chain_t       *out, **ll, *cl;[m
[31m-    ngx_connection_t  *downstream;[m
[31m-[m
[31m-    downstream = p->downstream;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                   "pipe write downstream: %d", downstream->write->ready);[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-    if (p->writing) {[m
[31m-        rc = ngx_event_pipe_write_chain_to_temp_file(p);[m
[31m-[m
[31m-        if (rc == NGX_ABORT) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    flushed = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (p->downstream_error) {[m
[31m-            return ngx_event_pipe_drain_chains(p);[m
[31m-        }[m
[31m-[m
[31m-        if (p->upstream_eof || p->upstream_error || p->upstream_done) {[m
[31m-[m
[31m-            /* pass the p->out and p->in chains to the output filter */[m
[31m-[m
[31m-            for (cl = p->busy; cl; cl = cl->next) {[m
[31m-                cl->buf->recycled = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (p->out) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe write downstream flush out");[m
[31m-[m
[31m-                for (cl = p->out; cl; cl = cl->next) {[m
[31m-                    cl->buf->recycled = 0;[m
[31m-                }[m
[31m-[m
[31m-                rc = p->output_filter(p->output_ctx, p->out);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    p->downstream_error = 1;[m
[31m-                    return ngx_event_pipe_drain_chains(p);[m
[31m-                }[m
[31m-[m
[31m-                p->out = NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (p->writing) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (p->in) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe write downstream flush in");[m
[31m-[m
[31m-                for (cl = p->in; cl; cl = cl->next) {[m
[31m-                    cl->buf->recycled = 0;[m
[31m-                }[m
[31m-[m
[31m-                rc = p->output_filter(p->output_ctx, p->in);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    p->downstream_error = 1;[m
[31m-                    return ngx_event_pipe_drain_chains(p);[m
[31m-                }[m
[31m-[m
[31m-                p->in = NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "pipe write downstream done");[m
[31m-[m
[31m-            /* TODO: free unused bufs */[m
[31m-[m
[31m-            p->downstream_done = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (downstream->data != p->output_ctx[m
[31m-            || !downstream->write->ready[m
[31m-            || downstream->write->delayed)[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* bsize is the size of the busy recycled bufs */[m
[31m-[m
[31m-        prev = NULL;[m
[31m-        bsize = 0;[m
[31m-[m
[31m-        for (cl = p->busy; cl; cl = cl->next) {[m
[31m-[m
[31m-            if (cl->buf->recycled) {[m
[31m-                if (prev == cl->buf->start) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                bsize += cl->buf->end - cl->buf->start;[m
[31m-                prev = cl->buf->start;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe write busy: %uz", bsize);[m
[31m-[m
[31m-        out = NULL;[m
[31m-[m
[31m-        if (bsize >= (size_t) p->busy_size) {[m
[31m-            flush = 1;[m
[31m-            goto flush;[m
[31m-        }[m
[31m-[m
[31m-        flush = 0;[m
[31m-        ll = NULL;[m
[31m-        prev_last_shadow = 1;[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            if (p->out) {[m
[31m-                cl = p->out;[m
[31m-[m
[31m-                if (cl->buf->recycled) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, p->log, 0,[m
[31m-                                  "recycled buffer in pipe out chain");[m
[31m-                }[m
[31m-[m
[31m-                p->out = p->out->next;[m
[31m-[m
[31m-            } else if (!p->cacheable && !p->writing && p->in) {[m
[31m-                cl = p->in;[m
[31m-[m
[31m-                ngx_log_debug3(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe write buf ls:%d %p %z",[m
[31m-                               cl->buf->last_shadow,[m
[31m-                               cl->buf->pos,[m
[31m-                               cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-                if (cl->buf->recycled && prev_last_shadow) {[m
[31m-                    if (bsize + cl->buf->end - cl->buf->start > p->busy_size) {[m
[31m-                        flush = 1;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    bsize += cl->buf->end - cl->buf->start;[m
[31m-                }[m
[31m-[m
[31m-                prev_last_shadow = cl->buf->last_shadow;[m
[31m-[m
[31m-                p->in = p->in->next;[m
[31m-[m
[31m-            } else {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            cl->next = NULL;[m
[31m-[m
[31m-            if (out) {[m
[31m-                *ll = cl;[m
[31m-            } else {[m
[31m-                out = cl;[m
[31m-            }[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-    flush:[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe write: out:%p, f:%ui", out, flush);[m
[31m-[m
[31m-        if (out == NULL) {[m
[31m-[m
[31m-            if (!flush) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* a workaround for AIO */[m
[31m-            if (flushed++ > 10) {[m
[31m-                return NGX_BUSY;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = p->output_filter(p->output_ctx, out);[m
[31m-[m
[31m-        ngx_chain_update_chains(p->pool, &p->free, &p->busy, &out, p->tag);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            p->downstream_error = 1;[m
[31m-            return ngx_event_pipe_drain_chains(p);[m
[31m-        }[m
[31m-[m
[31m-        for (cl = p->free; cl; cl = cl->next) {[m
[31m-[m
[31m-            if (cl->buf->temp_file) {[m
[31m-                if (p->cacheable || !p->cyclic_temp_file) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                /* reset p->temp_offset if all bufs had been sent */[m
[31m-[m
[31m-                if (cl->buf->file_last == p->temp_file->offset) {[m
[31m-                    p->temp_file->offset = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            /* TODO: free buf if p->free_bufs && upstream done */[m
[31m-[m
[31m-            /* add the free shadow raw buf to p->free_raw_bufs */[m
[31m-[m
[31m-            if (cl->buf->last_shadow) {[m
[31m-                if (ngx_event_pipe_add_free_buf(p, cl->buf->shadow) != NGX_OK) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf->last_shadow = 0;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->shadow = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p)[m
[31m-{[m
[31m-    ssize_t       size, bsize, n;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_uint_t    prev_last_shadow;[m
[31m-    ngx_chain_t  *cl, *tl, *next, *out, **ll, **last_out, **last_free;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-    if (p->writing) {[m
[31m-[m
[31m-        if (p->aio) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        out = p->writing;[m
[31m-        p->writing = NULL;[m
[31m-[m
[31m-        n = ngx_write_chain_to_temp_file(p->temp_file, NULL);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (p->buf_to_file) {[m
[31m-        out = ngx_alloc_chain_link(p->pool);[m
[31m-        if (out == NULL) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        out->buf = p->buf_to_file;[m
[31m-        out->next = p->in;[m
[31m-[m
[31m-    } else {[m
[31m-        out = p->in;[m
[31m-    }[m
[31m-[m
[31m-    if (!p->cacheable) {[m
[31m-[m
[31m-        size = 0;[m
[31m-        cl = out;[m
[31m-        ll = NULL;[m
[31m-        prev_last_shadow = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe offset: %O", p->temp_file->offset);[m
[31m-[m
[31m-        do {[m
[31m-            bsize = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "pipe buf ls:%d %p, pos %p, size: %z",[m
[31m-                           cl->buf->last_shadow, cl->buf->start,[m
[31m-                           cl->buf->pos, bsize);[m
[31m-[m
[31m-            if (prev_last_shadow[m
[31m-                && ((size + bsize > p->temp_file_write_size)[m
[31m-                    || (p->temp_file->offset + size + bsize[m
[31m-                        > p->max_temp_file_size)))[m
[31m-            {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            prev_last_shadow = cl->buf->last_shadow;[m
[31m-[m
[31m-            size += bsize;[m
[31m-            ll = &cl->next;[m
[31m-            cl = cl->next;[m
[31m-[m
[31m-        } while (cl);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "size: %z", size);[m
[31m-[m
[31m-        if (ll == NULL) {[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-[m
[31m-        if (cl) {[m
[31m-            p->in = cl;[m
[31m-            *ll = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            p->in = NULL;[m
[31m-            p->last_in = &p->in;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p->in = NULL;[m
[31m-        p->last_in = &p->in;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    p->temp_file->thread_write = p->thread_handler ? 1 : 0;[m
[31m-    p->temp_file->file.thread_task = p->thread_task;[m
[31m-    p->temp_file->file.thread_handler = p->thread_handler;[m
[31m-    p->temp_file->file.thread_ctx = p->thread_ctx;[m
[31m-#endif[m
[31m-[m
[31m-    n = ngx_write_chain_to_temp_file(p->temp_file, out);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        p->writing = out;[m
[31m-        p->thread_task = p->temp_file->file.thread_task;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (p->buf_to_file) {[m
[31m-        p->temp_file->offset = p->buf_to_file->last - p->buf_to_file->pos;[m
[31m-        n -= p->buf_to_file->last - p->buf_to_file->pos;[m
[31m-        p->buf_to_file = NULL;[m
[31m-        out = out->next;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        /* update previous buffer or add new buffer */[m
[31m-[m
[31m-        if (p->out) {[m
[31m-            for (cl = p->out; cl->next; cl = cl->next) { /* void */ }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (b->file_last == p->temp_file->offset) {[m
[31m-                p->temp_file->offset += n;[m
[31m-                b->file_last = p->temp_file->offset;[m
[31m-                goto free;[m
[31m-            }[m
[31m-[m
[31m-            last_out = &cl->next;[m
[31m-[m
[31m-        } else {[m
[31m-            last_out = &p->out;[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->tag = p->tag;[m
[31m-[m
[31m-        b->file = &p->temp_file->file;[m
[31m-        b->file_pos = p->temp_file->offset;[m
[31m-        p->temp_file->offset += n;[m
[31m-        b->file_last = p->temp_file->offset;[m
[31m-[m
[31m-        b->in_file = 1;[m
[31m-        b->temp_file = 1;[m
[31m-[m
[31m-        *last_out = cl;[m
[31m-    }[m
[31m-[m
[31m-free:[m
[31m-[m
[31m-    for (last_free = &p->free_raw_bufs;[m
[31m-         *last_free != NULL;[m
[31m-         last_free = &(*last_free)->next)[m
[31m-    {[m
[31m-        /* void */[m
[31m-    }[m
[31m-[m
[31m-    for (cl = out; cl; cl = next) {[m
[31m-        next = cl->next;[m
[31m-[m
[31m-        cl->next = p->free;[m
[31m-        p->free = cl;[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (b->last_shadow) {[m
[31m-[m
[31m-            tl = ngx_alloc_chain_link(p->pool);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            tl->buf = b->shadow;[m
[31m-            tl->next = NULL;[m
[31m-[m
[31m-            *last_free = tl;[m
[31m-            last_free = &tl->next;[m
[31m-[m
[31m-            b->shadow->pos = b->shadow->start;[m
[31m-            b->shadow->last = b->shadow->start;[m
[31m-[m
[31m-            ngx_event_pipe_remove_shadow_links(b->shadow);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* the copy input filter */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    ngx_memcpy(b, buf, sizeof(ngx_buf_t));[m
[31m-    b->shadow = buf;[m
[31m-    b->tag = p->tag;[m
[31m-    b->last_shadow = 1;[m
[31m-    b->recycled = 1;[m
[31m-    buf->shadow = b;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num);[m
[31m-[m
[31m-    if (p->in) {[m
[31m-        *p->last_in = cl;[m
[31m-    } else {[m
[31m-        p->in = cl;[m
[31m-    }[m
[31m-    p->last_in = &cl->next;[m
[31m-[m
[31m-    if (p->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p->length -= b->last - b->pos;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_buf_t  *b, *next;[m
[31m-[m
[31m-    b = buf->shadow;[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    while (!b->last_shadow) {[m
[31m-        next = b->shadow;[m
[31m-[m
[31m-        b->temporary = 0;[m
[31m-        b->recycled = 0;[m
[31m-[m
[31m-        b->shadow = NULL;[m
[31m-        b = next;[m
[31m-    }[m
[31m-[m
[31m-    b->temporary = 0;[m
[31m-    b->recycled = 0;[m
[31m-    b->last_shadow = 0;[m
[31m-[m
[31m-    b->shadow = NULL;[m
[31m-[m
[31m-    buf->shadow = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(p->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (p->buf_to_file && b->start == p->buf_to_file->start) {[m
[31m-        b->pos = p->buf_to_file->last;[m
[31m-        b->last = p->buf_to_file->last;[m
[31m-[m
[31m-    } else {[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-    }[m
[31m-[m
[31m-    b->shadow = NULL;[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    if (p->free_raw_bufs == NULL) {[m
[31m-        p->free_raw_bufs = cl;[m
[31m-        cl->next = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (p->free_raw_bufs->buf->pos == p->free_raw_bufs->buf->last) {[m
[31m-[m
[31m-        /* add the free buf to the list start */[m
[31m-[m
[31m-        cl->next = p->free_raw_bufs;[m
[31m-        p->free_raw_bufs = cl;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* the first free buf is partially filled, thus add the free buf after it */[m
[31m-[m
[31m-    cl->next = p->free_raw_bufs->next;[m
[31m-    p->free_raw_bufs->next = cl;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_pipe_drain_chains(ngx_event_pipe_t *p)[m
[31m-{[m
[31m-    ngx_chain_t  *cl, *tl;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (p->busy) {[m
[31m-            cl = p->busy;[m
[31m-            p->busy = NULL;[m
[31m-[m
[31m-        } else if (p->out) {[m
[31m-            cl = p->out;[m
[31m-            p->out = NULL;[m
[31m-[m
[31m-        } else if (p->in) {[m
[31m-            cl = p->in;[m
[31m-            p->in = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        while (cl) {[m
[31m-            if (cl->buf->last_shadow) {[m
[31m-                if (ngx_event_pipe_add_free_buf(p, cl->buf->shadow) != NGX_OK) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf->last_shadow = 0;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->shadow = NULL;[m
[31m-            tl = cl->next;[m
[31m-            cl->next = p->free;[m
[31m-            p->free = cl;[m
[31m-            cl = tl;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_pipe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_pipe.h[m
[1mdeleted file mode 100644[m
[1mindex ef2e7a0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_pipe.h[m
[1m+++ /dev/null[m
[36m@@ -1,107 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_PIPE_H_INCLUDED_[m
[31m-#define _NGX_EVENT_PIPE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_event_pipe_s  ngx_event_pipe_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_event_pipe_input_filter_pt)(ngx_event_pipe_t *p,[m
[31m-                                                    ngx_buf_t *buf);[m
[31m-typedef ngx_int_t (*ngx_event_pipe_output_filter_pt)(void *data,[m
[31m-                                                     ngx_chain_t *chain);[m
[31m-[m
[31m-[m
[31m-struct ngx_event_pipe_s {[m
[31m-    ngx_connection_t  *upstream;[m
[31m-    ngx_connection_t  *downstream;[m
[31m-[m
[31m-    ngx_chain_t       *free_raw_bufs;[m
[31m-    ngx_chain_t       *in;[m
[31m-    ngx_chain_t      **last_in;[m
[31m-[m
[31m-    ngx_chain_t       *writing;[m
[31m-[m
[31m-    ngx_chain_t       *out;[m
[31m-    ngx_chain_t       *free;[m
[31m-    ngx_chain_t       *busy;[m
[31m-[m
[31m-    /*[m
[31m-     * the input filter i.e. that moves HTTP/1.1 chunks[m
[31m-     * from the raw bufs to an incoming chain[m
[31m-     */[m
[31m-[m
[31m-    ngx_event_pipe_input_filter_pt    input_filter;[m
[31m-    void                             *input_ctx;[m
[31m-[m
[31m-    ngx_event_pipe_output_filter_pt   output_filter;[m
[31m-    void                             *output_ctx;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_int_t                       (*thread_handler)(ngx_thread_task_t *task,[m
[31m-                                                      ngx_file_t *file);[m
[31m-    void                             *thread_ctx;[m
[31m-    ngx_thread_task_t                *thread_task;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned           read:1;[m
[31m-    unsigned           cacheable:1;[m
[31m-    unsigned           single_buf:1;[m
[31m-    unsigned           free_bufs:1;[m
[31m-    unsigned           upstream_done:1;[m
[31m-    unsigned           upstream_error:1;[m
[31m-    unsigned           upstream_eof:1;[m
[31m-    unsigned           upstream_blocked:1;[m
[31m-    unsigned           downstream_done:1;[m
[31m-    unsigned           downstream_error:1;[m
[31m-    unsigned           cyclic_temp_file:1;[m
[31m-    unsigned           aio:1;[m
[31m-[m
[31m-    ngx_int_t          allocated;[m
[31m-    ngx_bufs_t         bufs;[m
[31m-    ngx_buf_tag_t      tag;[m
[31m-[m
[31m-    ssize_t            busy_size;[m
[31m-[m
[31m-    off_t              read_length;[m
[31m-    off_t              length;[m
[31m-[m
[31m-    off_t              max_temp_file_size;[m
[31m-    ssize_t            temp_file_write_size;[m
[31m-[m
[31m-    ngx_msec_t         read_timeout;[m
[31m-    ngx_msec_t         send_timeout;[m
[31m-    ssize_t            send_lowat;[m
[31m-[m
[31m-    ngx_pool_t        *pool;[m
[31m-    ngx_log_t         *log;[m
[31m-[m
[31m-    ngx_chain_t       *preread_bufs;[m
[31m-    size_t             preread_size;[m
[31m-    ngx_buf_t         *buf_to_file;[m
[31m-[m
[31m-    size_t             limit_rate;[m
[31m-    time_t             start_sec;[m
[31m-[m
[31m-    ngx_temp_file_t   *temp_file;[m
[31m-[m
[31m-    /* STUB */ int     num;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write);[m
[31m-ngx_int_t ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf);[m
[31m-ngx_int_t ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_PIPE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_posted.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_posted.c[m
[1mdeleted file mode 100644[m
[1mindex d851f3d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_posted.c[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ngx_queue_t  ngx_posted_accept_events;[m
[31m-ngx_queue_t  ngx_posted_events;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted)[m
[31m-{[m
[31m-    ngx_queue_t  *q;[m
[31m-    ngx_event_t  *ev;[m
[31m-[m
[31m-    while (!ngx_queue_empty(posted)) {[m
[31m-[m
[31m-        q = ngx_queue_head(posted);[m
[31m-        ev = ngx_queue_data(q, ngx_event_t, queue);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                      "posted event %p", ev);[m
[31m-[m
[31m-        ngx_delete_posted_event(ev);[m
[31m-[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_posted.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_posted.h[m
[1mdeleted file mode 100644[m
[1mindex 145d30f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_posted.h[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_POSTED_H_INCLUDED_[m
[31m-#define _NGX_EVENT_POSTED_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_post_event(ev, q)                                                 \[m
[31m-                                                                              \[m
[31m-    if (!(ev)->posted) {                                                      \[m
[31m-        (ev)->posted = 1;                                                     \[m
[31m-        ngx_queue_insert_tail(q, &(ev)->queue);                               \[m
[31m-                                                                              \[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0, "post event %p", ev);\[m
[31m-                                                                              \[m
[31m-    } else  {                                                                 \[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0,                      \[m
[31m-                       "update posted event %p", ev);                         \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_posted_event(ev)                                           \[m
[31m-                                                                              \[m
[31m-    (ev)->posted = 0;                                                         \[m
[31m-    ngx_queue_remove(&(ev)->queue);                                           \[m
[31m-                                                                              \[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0,                          \[m
[31m-                   "delete posted event %p", ev);[m
[31m-[m
[31m-[m
[31m-[m
[31m-void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted);[m
[31m-[m
[31m-[m
[31m-extern ngx_queue_t  ngx_posted_accept_events;[m
[31m-extern ngx_queue_t  ngx_posted_events;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_POSTED_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_probe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_probe.h[m
[1mdeleted file mode 100644[m
[1mindex b7b2749..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_probe.h[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-#ifndef _NGX_EVENT_PROBE_H_INCLUDED_[m
[31m-#define _NGX_EVENT_PROBE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-[m
[31m-#include <ngx_dtrace_provider.h>[m
[31m-[m
[31m-#define ngx_event_probe_timer_add(ev, timer)                                 \[m
[31m-    NGINX_TIMER_ADD(ev, timer)[m
[31m-[m
[31m-#define ngx_event_probe_timer_del(ev)                                        \[m
[31m-    NGINX_TIMER_DEL(ev)[m
[31m-[m
[31m-#define ngx_event_probe_timer_expire(ev)                                     \[m
[31m-    NGINX_TIMER_EXPIRE(ev)[m
[31m-[m
[31m-#else /* !(NGX_DTRACE) */[m
[31m-[m
[31m-#define ngx_event_probe_timer_add(ev, timer)[m
[31m-#define ngx_event_probe_timer_del(ev)[m
[31m-#define ngx_event_probe_timer_expire(ev)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_PROBE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_timer.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_timer.c[m
[1mdeleted file mode 100644[m
[1mindex 6e77465..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_timer.c[m
[1m+++ /dev/null[m
[36m@@ -1,157 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_probe.h>[m
[31m-[m
[31m-[m
[31m-ngx_rbtree_t              ngx_event_timer_rbtree;[m
[31m-static ngx_rbtree_node_t  ngx_event_timer_sentinel;[m
[31m-[m
[31m-/*[m
[31m- * the event timer rbtree may contain the duplicate keys, however,[m
[31m- * it should not be a problem, because we use the rbtree to find[m
[31m- * a minimum timer value only[m
[31m- */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_timer_init(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_rbtree_init(&ngx_event_timer_rbtree, &ngx_event_timer_sentinel,[m
[31m-                    ngx_rbtree_insert_timer_value);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_msec_t[m
[31m-ngx_event_find_timer(void)[m
[31m-{[m
[31m-    ngx_msec_int_t      timer;[m
[31m-    ngx_rbtree_node_t  *node, *root, *sentinel;[m
[31m-[m
[31m-    if (ngx_event_timer_rbtree.root == &ngx_event_timer_sentinel) {[m
[31m-        return NGX_TIMER_INFINITE;[m
[31m-    }[m
[31m-[m
[31m-    root = ngx_event_timer_rbtree.root;[m
[31m-    sentinel = ngx_event_timer_rbtree.sentinel;[m
[31m-[m
[31m-    node = ngx_rbtree_min(root, sentinel);[m
[31m-[m
[31m-    timer = (ngx_msec_int_t) (node->key - ngx_current_msec);[m
[31m-[m
[31m-    return (ngx_msec_t) (timer > 0 ? timer : 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_expire_timers(void)[m
[31m-{[m
[31m-    ngx_event_t        *ev;[m
[31m-    ngx_rbtree_node_t  *node, *root, *sentinel;[m
[31m-[m
[31m-    sentinel = ngx_event_timer_rbtree.sentinel;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        root = ngx_event_timer_rbtree.root;[m
[31m-[m
[31m-        if (root == sentinel) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        node = ngx_rbtree_min(root, sentinel);[m
[31m-[m
[31m-        /* node->key > ngx_current_time */[m
[31m-[m
[31m-        if ((ngx_msec_int_t) (node->key - ngx_current_msec) > 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer));[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "event timer del: %d: %M",[m
[31m-                       ngx_event_ident(ev->data), ev->timer.key);[m
[31m-[m
[31m-        ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        ev->timer.left = NULL;[m
[31m-        ev->timer.right = NULL;[m
[31m-        ev->timer.parent = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ev->timer_set = 0;[m
[31m-[m
[31m-        ev->timedout = 1;[m
[31m-[m
[31m-        ngx_event_probe_timer_expire(ev);[m
[31m-[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_cancel_timers(void)[m
[31m-{[m
[31m-    ngx_event_t        *ev;[m
[31m-    ngx_rbtree_node_t  *node, *root, *sentinel;[m
[31m-[m
[31m-    sentinel = ngx_event_timer_rbtree.sentinel;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        root = ngx_event_timer_rbtree.root;[m
[31m-[m
[31m-        if (root == sentinel) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        node = ngx_rbtree_min(root, sentinel);[m
[31m-[m
[31m-        ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer));[m
[31m-[m
[31m-        if (!ev->cancelable) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "event timer cancel: %d: %M",[m
[31m-                       ngx_event_ident(ev->data), ev->timer.key);[m
[31m-[m
[31m-        ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        ev->timer.left = NULL;[m
[31m-        ev->timer.right = NULL;[m
[31m-        ev->timer.parent = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ev->timer_set = 0;[m
[31m-[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-void[m
[31m-ngx_event_probe_timer_add_helper(ngx_event_t *ev, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_event_probe_timer_add(ev, timer);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_probe_timer_del_helper(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_probe_timer_del(ev);[m
[31m-}[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_timer.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_timer.h[m
[1mdeleted file mode 100644[m
[1mindex 8bc619a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/event/ngx_event_timer.h[m
[1m+++ /dev/null[m
[36m@@ -1,105 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_TIMER_H_INCLUDED_[m
[31m-#define _NGX_EVENT_TIMER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_TIMER_INFINITE  (ngx_msec_t) -1[m
[31m-[m
[31m-#define NGX_TIMER_LAZY_DELAY  300[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_event_timer_init(ngx_log_t *log);[m
[31m-ngx_msec_t ngx_event_find_timer(void);[m
[31m-void ngx_event_expire_timers(void);[m
[31m-void ngx_event_cancel_timers(void);[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-void ngx_event_probe_timer_add_helper(ngx_event_t *ev,[m
[31m-    ngx_msec_t timer);[m
[31m-void ngx_event_probe_timer_del_helper(ngx_event_t *ev);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern ngx_rbtree_t  ngx_event_timer_rbtree;[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_event_del_timer(ngx_event_t *ev)[m
[31m-{[m
[31m-#if (NGX_DTRACE)[m
[31m-    ngx_event_probe_timer_del_helper(ev);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "event timer del: %d: %M",[m
[31m-                    ngx_event_ident(ev->data), ev->timer.key);[m
[31m-[m
[31m-    ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ev->timer.left = NULL;[m
[31m-    ev->timer.right = NULL;[m
[31m-    ev->timer.parent = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    ev->timer_set = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_msec_t      key;[m
[31m-    ngx_msec_int_t  diff;[m
[31m-[m
[31m-    key = ngx_current_msec + timer;[m
[31m-[m
[31m-    if (ev->timer_set) {[m
[31m-[m
[31m-        /*[m
[31m-         * Use a previous timer value if difference between it and a new[m
[31m-         * value is less than NGX_TIMER_LAZY_DELAY milliseconds: this allows[m
[31m-         * to minimize the rbtree operations for fast connections.[m
[31m-         */[m
[31m-[m
[31m-        diff = (ngx_msec_int_t) (key - ev->timer.key);[m
[31m-[m
[31m-        if (ngx_abs(diff) < NGX_TIMER_LAZY_DELAY) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                           "event timer: %d, old: %M, new: %M",[m
[31m-                            ngx_event_ident(ev->data), ev->timer.key, key);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_del_timer(ev);[m
[31m-    }[m
[31m-[m
[31m-    ev->timer.key = key;[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-    ngx_event_probe_timer_add_helper(ev, timer);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "event timer add: %d: %M:%M",[m
[31m-                    ngx_event_ident(ev->data), timer, ev->timer.key);[m
[31m-[m
[31m-    ngx_rbtree_insert(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-    ev->timer_set = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_TIMER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_access_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_access_module.c[m
[1mdeleted file mode 100644[m
[1mindex c553e46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_access_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,469 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t         mask;[m
[31m-    in_addr_t         addr;[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_http_access_rule_t;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr   addr;[m
[31m-    struct in6_addr   mask;[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_http_access_rule6_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_http_access_rule_un_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t      *rules;     /* array of ngx_http_access_rule_t */[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_array_t      *rules6;    /* array of ngx_http_access_rule6_t */[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    ngx_array_t      *rules_un;  /* array of ngx_http_access_rule_un_t */[m
[31m-#endif[m
[31m-} ngx_http_access_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_access_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_access_inet(ngx_http_request_t *r,[m
[31m-    ngx_http_access_loc_conf_t *alcf, in_addr_t addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_http_access_inet6(ngx_http_request_t *r,[m
[31m-    ngx_http_access_loc_conf_t *alcf, u_char *p);[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-static ngx_int_t ngx_http_access_unix(ngx_http_request_t *r,[m
[31m-    ngx_http_access_loc_conf_t *alcf);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny);[m
[31m-static char *ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_http_access_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_access_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_access_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_access_commands[] = {[m
[31m-[m
[31m-    { ngx_string("allow"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_access_rule,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("deny"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_access_rule,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_access_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_access_init,                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_access_create_loc_conf,       /* create location configuration */[m
[31m-    ngx_http_access_merge_loc_conf         /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_access_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_access_module_ctx,           /* module context */[m
[31m-    ngx_http_access_commands,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    struct sockaddr_in          *sin;[m
[31m-    ngx_http_access_loc_conf_t  *alcf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                      *p;[m
[31m-    in_addr_t                    addr;[m
[31m-    struct sockaddr_in6         *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_access_module);[m
[31m-[m
[31m-    switch (r->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        if (alcf->rules) {[m
[31m-            sin = (struct sockaddr_in *) r->connection->sockaddr;[m
[31m-            return ngx_http_access_inet(r, alcf, sin->sin_addr.s_addr);[m
[31m-        }[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;[m
[31m-        p = sin6->sin6_addr.s6_addr;[m
[31m-[m
[31m-        if (alcf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {[m
[31m-            addr = p[12] << 24;[m
[31m-            addr += p[13] << 16;[m
[31m-            addr += p[14] << 8;[m
[31m-            addr += p[15];[m
[31m-            return ngx_http_access_inet(r, alcf, htonl(addr));[m
[31m-        }[m
[31m-[m
[31m-        if (alcf->rules6) {[m
[31m-            return ngx_http_access_inet6(r, alcf, p);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    case AF_UNIX:[m
[31m-        if (alcf->rules_un) {[m
[31m-            return ngx_http_access_unix(r, alcf);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_inet(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf,[m
[31m-    in_addr_t addr)[m
[31m-{[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_access_rule_t  *rule;[m
[31m-[m
[31m-    rule = alcf->rules->elts;[m
[31m-    for (i = 0; i < alcf->rules->nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "access: %08XD %08XD %08XD",[m
[31m-                       addr, rule[i].mask, rule[i].addr);[m
[31m-[m
[31m-        if ((addr & rule[i].mask) == rule[i].addr) {[m
[31m-            return ngx_http_access_found(r, rule[i].deny);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_inet6(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf,[m
[31m-    u_char *p)[m
[31m-{[m
[31m-    ngx_uint_t                n;[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_http_access_rule6_t  *rule6;[m
[31m-[m
[31m-    rule6 = alcf->rules6->elts;[m
[31m-    for (i = 0; i < alcf->rules6->nelts; i++) {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        size_t  cl, ml, al;[m
[31m-        u_char  ct[NGX_INET6_ADDRSTRLEN];[m
[31m-        u_char  mt[NGX_INET6_ADDRSTRLEN];[m
[31m-        u_char  at[NGX_INET6_ADDRSTRLEN];[m
[31m-[m
[31m-        cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN);[m
[31m-        ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN);[m
[31m-        al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN);[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "access: %*s %*s %*s", cl, ct, ml, mt, al, at);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        for (n = 0; n < 16; n++) {[m
[31m-            if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_access_found(r, rule6[i].deny);[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_unix(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_access_rule_un_t  *rule_un;[m
[31m-[m
[31m-    rule_un = alcf->rules_un->elts;[m
[31m-    for (i = 0; i < alcf->rules_un->nelts; i++) {[m
[31m-[m
[31m-        /* TODO: check path */[m
[31m-        if (1) {[m
[31m-            return ngx_http_access_found(r, rule_un[i].deny);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (deny) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "access forbidden by rule");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_FORBIDDEN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_access_loc_conf_t *alcf = conf;[m
[31m-[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  all;[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_cidr_t                  cidr;[m
[31m-    ngx_http_access_rule_t     *rule;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_http_access_rule6_t    *rule6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    ngx_http_access_rule_un_t  *rule_un;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memzero(&cidr, sizeof(ngx_cidr_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    all = (value[1].len == 3 && ngx_strcmp(value[1].data, "all") == 0);[m
[31m-[m
[31m-    if (!all) {[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-        if (value[1].len == 5 && ngx_strcmp(value[1].data, "unix:") == 0) {[m
[31m-            cidr.family = AF_UNIX;[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_ptocidr(&value[1], &cidr);[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-        rc = ngx_ptocidr(&value[1], &cidr);[m
[31m-#endif[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                         "invalid parameter \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                         "low address bits of %V are meaningless", &value[1]);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cidr.family == AF_INET || all) {[m
[31m-[m
[31m-        if (alcf->rules == NULL) {[m
[31m-            alcf->rules = ngx_array_create(cf->pool, 4,[m
[31m-                                           sizeof(ngx_http_access_rule_t));[m
[31m-            if (alcf->rules == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule = ngx_array_push(alcf->rules);[m
[31m-        if (rule == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule->mask = cidr.u.in.mask;[m
[31m-        rule->addr = cidr.u.in.addr;[m
[31m-        rule->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (cidr.family == AF_INET6 || all) {[m
[31m-[m
[31m-        if (alcf->rules6 == NULL) {[m
[31m-            alcf->rules6 = ngx_array_create(cf->pool, 4,[m
[31m-                                            sizeof(ngx_http_access_rule6_t));[m
[31m-            if (alcf->rules6 == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule6 = ngx_array_push(alcf->rules6);[m
[31m-        if (rule6 == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule6->mask = cidr.u.in6.mask;[m
[31m-        rule6->addr = cidr.u.in6.addr;[m
[31m-        rule6->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    if (cidr.family == AF_UNIX || all) {[m
[31m-[m
[31m-        if (alcf->rules_un == NULL) {[m
[31m-            alcf->rules_un = ngx_array_create(cf->pool, 1,[m
[31m-                                            sizeof(ngx_http_access_rule_un_t));[m
[31m-            if (alcf->rules_un == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule_un = ngx_array_push(alcf->rules_un);[m
[31m-        if (rule_un == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule_un->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_access_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_access_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_access_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_access_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_access_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_access_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->rules == NULL[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        && conf->rules6 == NULL[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        && conf->rules_un == NULL[m
[31m-#endif[m
[31m-    ) {[m
[31m-        conf->rules = prev->rules;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        conf->rules6 = prev->rules6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        conf->rules_un = prev->rules_un;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_access_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_addition_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_addition_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex db4970b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_addition_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,251 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     before_body;[m
[31m-    ngx_str_t     after_body;[m
[31m-[m
[31m-    ngx_hash_t    types;[m
[31m-    ngx_array_t  *types_keys;[m
[31m-} ngx_http_addition_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t    before_body_sent;[m
[31m-} ngx_http_addition_ctx_t;[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_addition_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_addition_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_addition_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_addition_commands[] = {[m
[31m-[m
[31m-    { ngx_string("add_before_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_addition_conf_t, before_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("add_after_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_addition_conf_t, after_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("addition_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_addition_conf_t, types_keys),[m
[31m-      &ngx_http_html_default_types[0] },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_addition_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_addition_filter_init,         /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_addition_create_conf,         /* create location configuration */[m
[31m-    ngx_http_addition_merge_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_addition_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_addition_filter_module_ctx,  /* module context */[m
[31m-    ngx_http_addition_commands,            /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_addition_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_addition_ctx_t   *ctx;[m
[31m-    ngx_http_addition_conf_t  *conf;[m
[31m-[m
[31m-    if (r->headers_out.status != NGX_HTTP_OK || r != r->main) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    if (conf->before_body.len == 0 && conf->after_body.len == 0) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_test_content_type(r, &conf->types) == NULL) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_addition_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_weak_etag(r);[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_addition_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 last;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_request_t        *sr;[m
[31m-    ngx_http_addition_ctx_t   *ctx;[m
[31m-    ngx_http_addition_conf_t  *conf;[m
[31m-[m
[31m-    if (in == NULL || r->header_only) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    if (!ctx->before_body_sent) {[m
[31m-        ctx->before_body_sent = 1;[m
[31m-[m
[31m-        if (conf->before_body.len) {[m
[31m-            if (ngx_http_subrequest(r, &conf->before_body, NULL, &sr, NULL, 0)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->after_body.len == 0) {[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_addition_filter_module);[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            cl->buf->last_buf = 0;[m
[31m-            cl->buf->sync = 1;[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || !last || conf->after_body.len == 0) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_subrequest(r, &conf->after_body, NULL, &sr, NULL, 0)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, NULL, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    return ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_addition_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_addition_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_addition_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_addition_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_addition_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_addition_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->before_body = { 0, NULL };[m
[31m-     *     conf->after_body = { 0, NULL };[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_addition_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_addition_conf_t *prev = parent;[m
[31m-    ngx_http_addition_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->before_body, prev->before_body, "");[m
[31m-    ngx_conf_merge_str_value(conf->after_body, prev->after_body, "");[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_html_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_auth_basic_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_auth_basic_module.c[m
[1mdeleted file mode 100644[m
[1mindex 1e7a0c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_auth_basic_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,467 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_crypt.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_AUTH_BUF_SIZE  2048[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 passwd;[m
[31m-} ngx_http_auth_basic_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t  *realm;[m
[31m-    ngx_http_complex_value_t   user_file;[m
[31m-} ngx_http_auth_basic_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_auth_basic_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm);[m
[31m-static ngx_int_t ngx_http_auth_basic_set_realm(ngx_http_request_t *r,[m
[31m-    ngx_str_t *realm);[m
[31m-static void ngx_http_auth_basic_close(ngx_file_t *file);[m
[31m-static void *ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_auth_basic_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_auth_basic_user_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_auth_basic_commands[] = {[m
[31m-[m
[31m-    { ngx_string("auth_basic"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_auth_basic_loc_conf_t, realm),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_basic_user_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_auth_basic_user_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_auth_basic_loc_conf_t, user_file),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_auth_basic_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_auth_basic_init,              /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_auth_basic_create_loc_conf,   /* create location configuration */[m
[31m-    ngx_http_auth_basic_merge_loc_conf     /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_auth_basic_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_auth_basic_module_ctx,       /* module context */[m
[31m-    ngx_http_auth_basic_commands,          /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_basic_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                            offset;[m
[31m-    ssize_t                          n;[m
[31m-    ngx_fd_t                         fd;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_err_t                        err;[m
[31m-    ngx_str_t                        pwd, realm, user_file;[m
[31m-    ngx_uint_t                       i, level, login, left, passwd;[m
[31m-    ngx_file_t                       file;[m
[31m-    ngx_http_auth_basic_ctx_t       *ctx;[m
[31m-    ngx_http_auth_basic_loc_conf_t  *alcf;[m
[31m-    u_char                           buf[NGX_HTTP_AUTH_BUF_SIZE];[m
[31m-    enum {[m
[31m-        sw_login,[m
[31m-        sw_passwd,[m
[31m-        sw_skip[m
[31m-    } state;[m
[31m-[m
[31m-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_basic_module);[m
[31m-[m
[31m-    if (alcf->realm == NULL || alcf->user_file.value.data == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, alcf->realm, &realm) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (realm.len == 3 && ngx_strncmp(realm.data, "off", 3) == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_auth_basic_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        return ngx_http_auth_basic_crypt_handler(r, ctx, &ctx->passwd,[m
[31m-                                                 &realm);[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_auth_basic_user(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "no user/password was provided for basic authentication");[m
[31m-[m
[31m-        return ngx_http_auth_basic_set_realm(r, &realm);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &alcf->user_file, &user_file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fd = ngx_open_file(user_file.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT) {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, r->connection->log, err,[m
[31m-                      ngx_open_file_n " \"%s\" failed", user_file.data);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-[m
[31m-    file.fd = fd;[m
[31m-    file.name = user_file;[m
[31m-    file.log = r->connection->log;[m
[31m-[m
[31m-    state = sw_login;[m
[31m-    passwd = 0;[m
[31m-    login = 0;[m
[31m-    left = 0;[m
[31m-    offset = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        i = left;[m
[31m-[m
[31m-        n = ngx_read_file(&file, buf + left, NGX_HTTP_AUTH_BUF_SIZE - left,[m
[31m-                          offset);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            ngx_http_auth_basic_close(&file);[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        for (i = left; i < left + n; i++) {[m
[31m-            switch (state) {[m
[31m-[m
[31m-            case sw_login:[m
[31m-                if (login == 0) {[m
[31m-[m
[31m-                    if (buf[i] == '#' || buf[i] == CR) {[m
[31m-                        state = sw_skip;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (buf[i] == LF) {[m
[31m-                        break;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (buf[i] != r->headers_in.user.data[login]) {[m
[31m-                    state = sw_skip;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (login == r->headers_in.user.len) {[m
[31m-                    state = sw_passwd;[m
[31m-                    passwd = i + 1;[m
[31m-                }[m
[31m-[m
[31m-                login++;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case sw_passwd:[m
[31m-                if (buf[i] == LF || buf[i] == CR || buf[i] == ':') {[m
[31m-                    buf[i] = '\0';[m
[31m-[m
[31m-                    ngx_http_auth_basic_close(&file);[m
[31m-[m
[31m-                    pwd.len = i - passwd;[m
[31m-                    pwd.data = &buf[passwd];[m
[31m-[m
[31m-                    return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd,[m
[31m-                                                             &realm);[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case sw_skip:[m
[31m-                if (buf[i] == LF) {[m
[31m-                    state = sw_login;[m
[31m-                    login = 0;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (state == sw_passwd) {[m
[31m-            left = left + n - passwd;[m
[31m-            ngx_memmove(buf, &buf[passwd], left);[m
[31m-            passwd = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            left = 0;[m
[31m-        }[m
[31m-[m
[31m-        offset += n;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_auth_basic_close(&file);[m
[31m-[m
[31m-    if (state == sw_passwd) {[m
[31m-        pwd.len = i - passwd;[m
[31m-        pwd.data = ngx_pnalloc(r->pool, pwd.len + 1);[m
[31m-        if (pwd.data == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_cpystrn(pwd.data, &buf[passwd], pwd.len + 1);[m
[31m-[m
[31m-        return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd, &realm);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "user \"%V\" was not found in \"%V\"",[m
[31m-                  &r->headers_in.user, &user_file);[m
[31m-[m
[31m-    return ngx_http_auth_basic_set_realm(r, &realm);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm)[m
[31m-{[m
[31m-    ngx_int_t   rc;[m
[31m-    u_char     *encrypted;[m
[31m-[m
[31m-    rc = ngx_crypt(r->pool, r->headers_in.passwd.data, passwd->data,[m
[31m-                   &encrypted);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rc: %i user: \"%V\" salt: \"%s\"",[m
[31m-                   rc, &r->headers_in.user, passwd->data);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        if (ngx_strcmp(encrypted, passwd->data) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "encrypted: \"%s\"", encrypted);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "user \"%V\": password mismatch",[m
[31m-                      &r->headers_in.user);[m
[31m-[m
[31m-        return ngx_http_auth_basic_set_realm(r, realm);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_palloc(r->pool, sizeof(ngx_http_auth_basic_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_auth_basic_module);[m
[31m-[m
[31m-        ctx->passwd.len = passwd->len;[m
[31m-        passwd->len++;[m
[31m-[m
[31m-        ctx->passwd.data = ngx_pstrdup(r->pool, passwd);[m
[31m-        if (ctx->passwd.data == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: add mutex event */[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_basic_set_realm(ngx_http_request_t *r, ngx_str_t *realm)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    u_char  *basic, *p;[m
[31m-[m
[31m-    r->headers_out.www_authenticate = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (r->headers_out.www_authenticate == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("Basic realm=\"\"") - 1 + realm->len;[m
[31m-[m
[31m-    basic = ngx_pnalloc(r->pool, len);[m
[31m-    if (basic == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(basic, "Basic realm=\"", sizeof("Basic realm=\"") - 1);[m
[31m-    p = ngx_cpymem(p, realm->data, realm->len);[m
[31m-    *p = '"';[m
[31m-[m
[31m-    r->headers_out.www_authenticate->hash = 1;[m
[31m-    ngx_str_set(&r->headers_out.www_authenticate->key, "WWW-Authenticate");[m
[31m-    r->headers_out.www_authenticate->value.data = basic;[m
[31m-    r->headers_out.www_authenticate->value.len = len;[m
[31m-[m
[31m-    return NGX_HTTP_UNAUTHORIZED;[m
[31m-}[m
[31m-[m
[31m-static void[m
[31m-ngx_http_auth_basic_close(ngx_file_t *file)[m
[31m-{[m
[31m-    if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, file->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file->name.data);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_auth_basic_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_basic_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_auth_basic_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_auth_basic_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->realm == NULL) {[m
[31m-        conf->realm = prev->realm;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->user_file.value.data == NULL) {[m
[31m-        conf->user_file = prev->user_file;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_basic_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_auth_basic_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_basic_user_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_auth_basic_loc_conf_t *alcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (alcf->user_file.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &alcf->user_file;[m
[31m-    ccv.zero = 1;[m
[31m-    ccv.conf_prefix = 1;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_auth_request_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_auth_request_module.c[m
[1mdeleted file mode 100644[m
[1mindex bab79e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_auth_request_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,444 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 uri;[m
[31m-    ngx_array_t              *vars;[m
[31m-} ngx_http_auth_request_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                done;[m
[31m-    ngx_uint_t                status;[m
[31m-    ngx_http_request_t       *subrequest;[m
[31m-} ngx_http_auth_request_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                 index;[m
[31m-    ngx_http_complex_value_t  value;[m
[31m-    ngx_http_set_variable_pt  set_handler;[m
[31m-} ngx_http_auth_request_variable_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_auth_request_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_auth_request_done(ngx_http_request_t *r,[m
[31m-    void *data, ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_auth_request_set_variables(ngx_http_request_t *r,[m
[31m-    ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_auth_request_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static void *ngx_http_auth_request_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_auth_request_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_auth_request_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_auth_request_commands[] = {[m
[31m-[m
[31m-    { ngx_string("auth_request"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_auth_request,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_request_set"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_auth_request_set,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_auth_request_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_auth_request_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_auth_request_create_conf,     /* create location configuration */[m
[31m-    ngx_http_auth_request_merge_conf       /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_auth_request_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_auth_request_module_ctx,     /* module context */[m
[31m-    ngx_http_auth_request_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t               *h, *ho;[m
[31m-    ngx_http_request_t            *sr;[m
[31m-    ngx_http_post_subrequest_t    *ps;[m
[31m-    ngx_http_auth_request_ctx_t   *ctx;[m
[31m-    ngx_http_auth_request_conf_t  *arcf;[m
[31m-[m
[31m-    arcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_request_module);[m
[31m-[m
[31m-    if (arcf->uri.len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "auth request handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_auth_request_module);[m
[31m-[m
[31m-    if (ctx != NULL) {[m
[31m-        if (!ctx->done) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * as soon as we are done - explicitly set variables to make[m
[31m-         * sure they will be available after internal redirects[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_http_auth_request_set_variables(r, arcf, ctx) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* return appropriate status */[m
[31m-[m
[31m-        if (ctx->status == NGX_HTTP_FORBIDDEN) {[m
[31m-            return ctx->status;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->status == NGX_HTTP_UNAUTHORIZED) {[m
[31m-            sr = ctx->subrequest;[m
[31m-[m
[31m-            h = sr->headers_out.www_authenticate;[m
[31m-[m
[31m-            if (!h && sr->upstream) {[m
[31m-                h = sr->upstream->headers_in.www_authenticate;[m
[31m-            }[m
[31m-[m
[31m-            if (h) {[m
[31m-                ho = ngx_list_push(&r->headers_out.headers);[m
[31m-                if (ho == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                *ho = *h;[m
[31m-[m
[31m-                r->headers_out.www_authenticate = ho;[m
[31m-            }[m
[31m-[m
[31m-            return ctx->status;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->status >= NGX_HTTP_OK[m
[31m-            && ctx->status < NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "auth request unexpected status: %ui", ctx->status);[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_auth_request_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ps = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-    if (ps == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ps->handler = ngx_http_auth_request_done;[m
[31m-    ps->data = ctx;[m
[31m-[m
[31m-    if (ngx_http_subrequest(r, &arcf->uri, NULL, &sr, ps,[m
[31m-                            NGX_HTTP_SUBREQUEST_WAITED)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * allocate fake request body to avoid attempts to read it and to make[m
[31m-     * sure real body file (if already read) won't be closed by upstream[m
[31m-     */[m
[31m-[m
[31m-    sr->request_body = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (sr->request_body == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr->header_only = 1;[m
[31m-[m
[31m-    ctx->subrequest = sr;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_auth_request_module);[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_done(ngx_http_request_t *r, void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_auth_request_ctx_t   *ctx = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "auth request done s:%ui", r->headers_out.status);[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-    ctx->status = r->headers_out.status;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_set_variables(ngx_http_request_t *r,[m
[31m-    ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_str_t                          val;[m
[31m-    ngx_http_variable_t               *v;[m
[31m-    ngx_http_variable_value_t         *vv;[m
[31m-    ngx_http_auth_request_variable_t  *av, *last;[m
[31m-    ngx_http_core_main_conf_t         *cmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "auth request set variables");[m
[31m-[m
[31m-    if (arcf->vars == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-    v = cmcf->variables.elts;[m
[31m-[m
[31m-    av = arcf->vars->elts;[m
[31m-    last = av + arcf->vars->nelts;[m
[31m-[m
[31m-    while (av < last) {[m
[31m-        /*[m
[31m-         * explicitly set new value to make sure it will be available after[m
[31m-         * internal redirects[m
[31m-         */[m
[31m-[m
[31m-        vv = &r->variables[av->index];[m
[31m-[m
[31m-        if (ngx_http_complex_value(ctx->subrequest, &av->value, &val)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        vv->valid = 1;[m
[31m-        vv->not_found = 0;[m
[31m-        vv->data = val.data;[m
[31m-        vv->len = val.len;[m
[31m-[m
[31m-        if (av->set_handler) {[m
[31m-            /*[m
[31m-             * set_handler only available in cmcf->variables_keys, so we store[m
[31m-             * it explicitly[m
[31m-             */[m
[31m-[m
[31m-            av->set_handler(r, vv, v[av->index].data);[m
[31m-        }[m
[31m-[m
[31m-        av++;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "auth request variable");[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_auth_request_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_auth_request_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_request_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->uri = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->vars = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_request_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_auth_request_conf_t *prev = parent;[m
[31m-    ngx_http_auth_request_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->uri, prev->uri, "");[m
[31m-    ngx_conf_merge_ptr_value(conf->vars, prev->vars, NULL);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_auth_request_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_auth_request_conf_t *arcf = conf;[m
[31m-[m
[31m-    ngx_str_t        *value;[m
[31m-[m
[31m-    if (arcf->uri.data != NULL) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        arcf->uri.len = 0;[m
[31m-        arcf->uri.data = (u_char *) "";[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    arcf->uri = value[1];[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_auth_request_conf_t *arcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_variable_t               *v;[m
[31m-    ngx_http_auth_request_variable_t  *av;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value[1].len--;[m
[31m-    value[1].data++;[m
[31m-[m
[31m-    if (arcf->vars == NGX_CONF_UNSET_PTR) {[m
[31m-        arcf->vars = ngx_array_create(cf->pool, 1,[m
[31m-                                      sizeof(ngx_http_auth_request_variable_t));[m
[31m-        if (arcf->vars == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    av = ngx_array_push(arcf->vars);[m
[31m-    if (av == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    av->index = ngx_http_get_variable_index(cf, &value[1]);[m
[31m-    if (av->index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->get_handler == NULL) {[m
[31m-        v->get_handler = ngx_http_auth_request_variable;[m
[31m-        v->data = (uintptr_t) av;[m
[31m-    }[m
[31m-[m
[31m-    av->set_handler = v->set_handler;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &av->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_autoindex_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_autoindex_module.c[m
[1mdeleted file mode 100644[m
[1mindex b3bf652..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_autoindex_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1050 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_buf_t     *buf;[m
[31m-    size_t         size;[m
[31m-    ngx_pool_t    *pool;[m
[31m-    size_t         alloc_size;[m
[31m-    ngx_chain_t  **last_out;[m
[31m-} ngx_http_autoindex_ctx_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t      name;[m
[31m-    size_t         utf_len;[m
[31m-    size_t         escape;[m
[31m-    size_t         escape_html;[m
[31m-[m
[31m-    unsigned       dir:1;[m
[31m-    unsigned       file:1;[m
[31m-[m
[31m-    time_t         mtime;[m
[31m-    off_t          size;[m
[31m-} ngx_http_autoindex_entry_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t     enable;[m
[31m-    ngx_uint_t     format;[m
[31m-    ngx_flag_t     localtime;[m
[31m-    ngx_flag_t     exact_size;[m
[31m-} ngx_http_autoindex_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_AUTOINDEX_HTML         0[m
[31m-#define NGX_HTTP_AUTOINDEX_JSON         1[m
[31m-#define NGX_HTTP_AUTOINDEX_JSONP        2[m
[31m-#define NGX_HTTP_AUTOINDEX_XML          3[m
[31m-[m
[31m-#define NGX_HTTP_AUTOINDEX_PREALLOCATE  50[m
[31m-[m
[31m-#define NGX_HTTP_AUTOINDEX_NAME_LEN     50[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *ngx_http_autoindex_html(ngx_http_request_t *r,[m
[31m-    ngx_array_t *entries);[m
[31m-static ngx_buf_t *ngx_http_autoindex_json(ngx_http_request_t *r,[m
[31m-    ngx_array_t *entries, ngx_str_t *callback);[m
[31m-static ngx_int_t ngx_http_autoindex_jsonp_callback(ngx_http_request_t *r,[m
[31m-    ngx_str_t *callback);[m
[31m-static ngx_buf_t *ngx_http_autoindex_xml(ngx_http_request_t *r,[m
[31m-    ngx_array_t *entries);[m
[31m-[m
[31m-static int ngx_libc_cdecl ngx_http_autoindex_cmp_entries(const void *one,[m
[31m-    const void *two);[m
[31m-static ngx_int_t ngx_http_autoindex_error(ngx_http_request_t *r,[m
[31m-    ngx_dir_t *dir, ngx_str_t *name);[m
[31m-[m
[31m-static ngx_int_t ngx_http_autoindex_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_autoindex_format[] = {[m
[31m-    { ngx_string("html"), NGX_HTTP_AUTOINDEX_HTML },[m
[31m-    { ngx_string("json"), NGX_HTTP_AUTOINDEX_JSON },[m
[31m-    { ngx_string("jsonp"), NGX_HTTP_AUTOINDEX_JSONP },[m
[31m-    { ngx_string("xml"), NGX_HTTP_AUTOINDEX_XML },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_autoindex_commands[] = {[m
[31m-[m
[31m-    { ngx_string("autoindex"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_autoindex_loc_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("autoindex_format"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_autoindex_loc_conf_t, format),[m
[31m-      &ngx_http_autoindex_format },[m
[31m-[m
[31m-    { ngx_string("autoindex_localtime"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_autoindex_loc_conf_t, localtime),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("autoindex_exact_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_autoindex_loc_conf_t, exact_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_autoindex_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_autoindex_init,               /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_autoindex_create_loc_conf,    /* create location configuration */[m
[31m-    ngx_http_autoindex_merge_loc_conf      /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_autoindex_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_autoindex_module_ctx,        /* module context */[m
[31m-    ngx_http_autoindex_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_autoindex_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                         *last, *filename;[m
[31m-    size_t                          len, allocated, root;[m
[31m-    ngx_err_t                       err;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_str_t                       path, callback;[m
[31m-    ngx_dir_t                       dir;[m
[31m-    ngx_uint_t                      level, format;[m
[31m-    ngx_pool_t                     *pool;[m
[31m-    ngx_chain_t                     out;[m
[31m-    ngx_array_t                     entries;[m
[31m-    ngx_http_autoindex_entry_t     *entry;[m
[31m-    ngx_http_autoindex_loc_conf_t  *alcf;[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);[m
[31m-[m
[31m-    if (!alcf->enable) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    /* NGX_DIR_MASK_LEN is lesser than NGX_HTTP_AUTOINDEX_PREALLOCATE */[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root,[m
[31m-                                    NGX_HTTP_AUTOINDEX_PREALLOCATE);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    allocated = path.len;[m
[31m-    path.len = last - path.data;[m
[31m-    if (path.len > 1) {[m
[31m-        path.len--;[m
[31m-    }[m
[31m-    path.data[path.len] = '\0';[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http autoindex: \"%s\"", path.data);[m
[31m-[m
[31m-    format = alcf->format;[m
[31m-[m
[31m-    if (format == NGX_HTTP_AUTOINDEX_JSONP) {[m
[31m-        if (ngx_http_autoindex_jsonp_callback(r, &callback) != NGX_OK) {[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        if (callback.len == 0) {[m
[31m-            format = NGX_HTTP_AUTOINDEX_JSON;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_dir(&path, &dir) == NGX_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT[m
[31m-            || err == NGX_ENOTDIR[m
[31m-            || err == NGX_ENAMETOOLONG)[m
[31m-        {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-        } else if (err == NGX_EACCES) {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, r->connection->log, err,[m
[31m-                      ngx_open_dir_n " \"%s\" failed", path.data);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-[m
[31m-    /* MSVC thinks 'entries' may be used without having been initialized */[m
[31m-    ngx_memzero(&entries, sizeof(ngx_array_t));[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: pool should be temporary pool */[m
[31m-    pool = r->pool;[m
[31m-[m
[31m-    if (ngx_array_init(&entries, pool, 40, sizeof(ngx_http_autoindex_entry_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-[m
[31m-    switch (format) {[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_JSON:[m
[31m-        ngx_str_set(&r->headers_out.content_type, "application/json");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_JSONP:[m
[31m-        ngx_str_set(&r->headers_out.content_type, "application/javascript");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_XML:[m
[31m-        ngx_str_set(&r->headers_out.content_type, "text/xml");[m
[31m-        ngx_str_set(&r->headers_out.charset, "utf-8");[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_HTTP_AUTOINDEX_HTML */[m
[31m-        ngx_str_set(&r->headers_out.content_type, "text/html");[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_len = r->headers_out.content_type.len;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        if (ngx_close_dir(&dir) == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                          ngx_close_dir_n " \"%V\" failed", &path);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    filename = path.data;[m
[31m-    filename[path.len] = '/';[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_set_errno(0);[m
[31m-[m
[31m-        if (ngx_read_dir(&dir) == NGX_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err != NGX_ENOMOREFILES) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                              ngx_read_dir_n " \"%V\" failed", &path);[m
[31m-                return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http autoindex file: \"%s\"", ngx_de_name(&dir));[m
[31m-[m
[31m-        len = ngx_de_namelen(&dir);[m
[31m-[m
[31m-        if (ngx_de_name(&dir)[0] == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (!dir.valid_info) {[m
[31m-[m
[31m-            /* 1 byte for '/' and 1 byte for terminating '\0' */[m
[31m-[m
[31m-            if (path.len + 1 + len + 1 > allocated) {[m
[31m-                allocated = path.len + 1 + len + 1[m
[31m-                                     + NGX_HTTP_AUTOINDEX_PREALLOCATE;[m
[31m-[m
[31m-                filename = ngx_pnalloc(pool, allocated);[m
[31m-                if (filename == NULL) {[m
[31m-                    return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-                }[m
[31m-[m
[31m-                last = ngx_cpystrn(filename, path.data, path.len + 1);[m
[31m-                *last++ = '/';[m
[31m-            }[m
[31m-[m
[31m-            ngx_cpystrn(last, ngx_de_name(&dir), len + 1);[m
[31m-[m
[31m-            if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                if (err != NGX_ENOENT && err != NGX_ELOOP) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                                  ngx_de_info_n " \"%s\" failed", filename);[m
[31m-[m
[31m-                    if (err == NGX_EACCES) {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                                  ngx_de_link_info_n " \"%s\" failed",[m
[31m-                                  filename);[m
[31m-                    return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        entry = ngx_array_push(&entries);[m
[31m-        if (entry == NULL) {[m
[31m-            return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-        }[m
[31m-[m
[31m-        entry->name.len = len;[m
[31m-[m
[31m-        entry->name.data = ngx_pnalloc(pool, len + 1);[m
[31m-        if (entry->name.data == NULL) {[m
[31m-            return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-        }[m
[31m-[m
[31m-        ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1);[m
[31m-[m
[31m-        entry->dir = ngx_de_is_dir(&dir);[m
[31m-        entry->file = ngx_de_is_file(&dir);[m
[31m-        entry->mtime = ngx_de_mtime(&dir);[m
[31m-        entry->size = ngx_de_size(&dir);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_dir(&dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%V\" failed", &path);[m
[31m-    }[m
[31m-[m
[31m-    if (entries.nelts > 1) {[m
[31m-        ngx_qsort(entries.elts, (size_t) entries.nelts,[m
[31m-                  sizeof(ngx_http_autoindex_entry_t),[m
[31m-                  ngx_http_autoindex_cmp_entries);[m
[31m-    }[m
[31m-[m
[31m-    switch (format) {[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_JSON:[m
[31m-        b = ngx_http_autoindex_json(r, &entries, NULL);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_JSONP:[m
[31m-        b = ngx_http_autoindex_json(r, &entries, &callback);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_XML:[m
[31m-        b = ngx_http_autoindex_xml(r, &entries);[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_HTTP_AUTOINDEX_HTML */[m
[31m-        b = ngx_http_autoindex_html(r, &entries);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: free temporary pool */[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_autoindex_html(ngx_http_request_t *r, ngx_array_t *entries)[m
[31m-{[m
[31m-    u_char                         *last, scale;[m
[31m-    off_t                           length;[m
[31m-    size_t                          len, char_len, escape_html;[m
[31m-    ngx_tm_t                        tm;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_int_t                       size;[m
[31m-    ngx_uint_t                      i, utf8;[m
[31m-    ngx_time_t                     *tp;[m
[31m-    ngx_http_autoindex_entry_t     *entry;[m
[31m-    ngx_http_autoindex_loc_conf_t  *alcf;[m
[31m-[m
[31m-    static u_char  title[] =[m
[31m-        "<html>" CRLF[m
[31m-        "<head><title>Index of "[m
[31m-    ;[m
[31m-[m
[31m-    static u_char  header[] =[m
[31m-        "</title></head>" CRLF[m
[31m-        "<body bgcolor=\"white\">" CRLF[m
[31m-        "<h1>Index of "[m
[31m-    ;[m
[31m-[m
[31m-    static u_char  tail[] =[m
[31m-        "</body>" CRLF[m
[31m-        "</html>" CRLF[m
[31m-    ;[m
[31m-[m
[31m-    static char  *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",[m
[31m-                               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };[m
[31m-[m
[31m-    if (r->headers_out.charset.len == 5[m
[31m-        && ngx_strncasecmp(r->headers_out.charset.data, (u_char *) "utf-8", 5)[m
[31m-           == 0)[m
[31m-    {[m
[31m-        utf8 = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        utf8 = 0;[m
[31m-    }[m
[31m-[m
[31m-    escape_html = ngx_escape_html(NULL, r->uri.data, r->uri.len);[m
[31m-[m
[31m-    len = sizeof(title) - 1[m
[31m-          + r->uri.len + escape_html[m
[31m-          + sizeof(header) - 1[m
[31m-          + r->uri.len + escape_html[m
[31m-          + sizeof("</h1>") - 1[m
[31m-          + sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1[m
[31m-          + sizeof("</pre><hr>") - 1[m
[31m-          + sizeof(tail) - 1;[m
[31m-[m
[31m-    entry = entries->elts;[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        entry[i].escape = 2 * ngx_escape_uri(NULL, entry[i].name.data,[m
[31m-                                             entry[i].name.len,[m
[31m-                                             NGX_ESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-        entry[i].escape_html = ngx_escape_html(NULL, entry[i].name.data,[m
[31m-                                               entry[i].name.len);[m
[31m-[m
[31m-        if (utf8) {[m
[31m-            entry[i].utf_len = ngx_utf8_length(entry[i].name.data,[m
[31m-                                               entry[i].name.len);[m
[31m-        } else {[m
[31m-            entry[i].utf_len = entry[i].name.len;[m
[31m-        }[m
[31m-[m
[31m-        len += sizeof("<a href=\"") - 1[m
[31m-            + entry[i].name.len + entry[i].escape[m
[31m-            + 1                                          /* 1 is for "/" */[m
[31m-            + sizeof("\">") - 1[m
[31m-            + entry[i].name.len - entry[i].utf_len[m
[31m-            + entry[i].escape_html[m
[31m-            + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof("&gt;") - 2[m
[31m-            + sizeof("</a>") - 1[m
[31m-            + sizeof(" 28-Sep-1970 12:00 ") - 1[m
[31m-            + 20                                         /* the file size */[m
[31m-            + 2;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, title, sizeof(title) - 1);[m
[31m-[m
[31m-    if (escape_html) {[m
[31m-        b->last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len);[m
[31m-        b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);[m
[31m-        b->last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);[m
[31m-        b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);[m
[31m-        b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "</h1>", sizeof("</h1>") - 1);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "<hr><pre><a href=\"../\">../</a>" CRLF,[m
[31m-                         sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1);[m
[31m-[m
[31m-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        b->last = ngx_cpymem(b->last, "<a href=\"", sizeof("<a href=\"") - 1);[m
[31m-[m
[31m-        if (entry[i].escape) {[m
[31m-            ngx_escape_uri(b->last, entry[i].name.data, entry[i].name.len,[m
[31m-                           NGX_ESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            b->last += entry[i].name.len + entry[i].escape;[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_cpymem(b->last, entry[i].name.data,[m
[31m-                                 entry[i].name.len);[m
[31m-        }[m
[31m-[m
[31m-        if (entry[i].dir) {[m
[31m-            *b->last++ = '/';[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = '"';[m
[31m-        *b->last++ = '>';[m
[31m-[m
[31m-        len = entry[i].utf_len;[m
[31m-[m
[31m-        if (entry[i].name.len != len) {[m
[31m-            if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {[m
[31m-                char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3 + 1;[m
[31m-[m
[31m-            } else {[m
[31m-                char_len = NGX_HTTP_AUTOINDEX_NAME_LEN + 1;[m
[31m-            }[m
[31m-[m
[31m-            last = b->last;[m
[31m-            b->last = ngx_utf8_cpystrn(b->last, entry[i].name.data,[m
[31m-                                       char_len, entry[i].name.len + 1);[m
[31m-[m
[31m-            if (entry[i].escape_html) {[m
[31m-                b->last = (u_char *) ngx_escape_html(last, entry[i].name.data,[m
[31m-                                                     b->last - last);[m
[31m-            }[m
[31m-[m
[31m-            last = b->last;[m
[31m-[m
[31m-        } else {[m
[31m-            if (entry[i].escape_html) {[m
[31m-                if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {[m
[31m-                    char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3;[m
[31m-[m
[31m-                } else {[m
[31m-                    char_len = len;[m
[31m-                }[m
[31m-[m
[31m-                b->last = (u_char *) ngx_escape_html(b->last,[m
[31m-                                                  entry[i].name.data, char_len);[m
[31m-                last = b->last;[m
[31m-[m
[31m-            } else {[m
[31m-                b->last = ngx_cpystrn(b->last, entry[i].name.data,[m
[31m-                                      NGX_HTTP_AUTOINDEX_NAME_LEN + 1);[m
[31m-                last = b->last - 3;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {[m
[31m-            b->last = ngx_cpymem(last, "..&gt;</a>", sizeof("..&gt;</a>") - 1);[m
[31m-[m
[31m-        } else {[m
[31m-            if (entry[i].dir && NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {[m
[31m-                *b->last++ = '/';[m
[31m-                len++;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_cpymem(b->last, "</a>", sizeof("</a>") - 1);[m
[31m-[m
[31m-            if (NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {[m
[31m-                ngx_memset(b->last, ' ', NGX_HTTP_AUTOINDEX_NAME_LEN - len);[m
[31m-                b->last += NGX_HTTP_AUTOINDEX_NAME_LEN - len;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = ' ';[m
[31m-[m
[31m-        ngx_gmtime(entry[i].mtime + tp->gmtoff * 60 * alcf->localtime, &tm);[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "%02d-%s-%d %02d:%02d ",[m
[31m-                              tm.ngx_tm_mday,[m
[31m-                              months[tm.ngx_tm_mon - 1],[m
[31m-                              tm.ngx_tm_year,[m
[31m-                              tm.ngx_tm_hour,[m
[31m-                              tm.ngx_tm_min);[m
[31m-[m
[31m-        if (alcf->exact_size) {[m
[31m-            if (entry[i].dir) {[m
[31m-                b->last = ngx_cpymem(b->last,  "                  -",[m
[31m-                                     sizeof("                  -") - 1);[m
[31m-            } else {[m
[31m-                b->last = ngx_sprintf(b->last, "%19O", entry[i].size);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (entry[i].dir) {[m
[31m-                b->last = ngx_cpymem(b->last,  "      -",[m
[31m-                                     sizeof("      -") - 1);[m
[31m-[m
[31m-            } else {[m
[31m-                length = entry[i].size;[m
[31m-[m
[31m-                if (length > 1024 * 1024 * 1024 - 1) {[m
[31m-                    size = (ngx_int_t) (length / (1024 * 1024 * 1024));[m
[31m-                    if ((length % (1024 * 1024 * 1024))[m
[31m-                                                > (1024 * 1024 * 1024 / 2 - 1))[m
[31m-                    {[m
[31m-                        size++;[m
[31m-                    }[m
[31m-                    scale = 'G';[m
[31m-[m
[31m-                } else if (length > 1024 * 1024 - 1) {[m
[31m-                    size = (ngx_int_t) (length / (1024 * 1024));[m
[31m-                    if ((length % (1024 * 1024)) > (1024 * 1024 / 2 - 1)) {[m
[31m-                        size++;[m
[31m-                    }[m
[31m-                    scale = 'M';[m
[31m-[m
[31m-                } else if (length > 9999) {[m
[31m-                    size = (ngx_int_t) (length / 1024);[m
[31m-                    if (length % 1024 > 511) {[m
[31m-                        size++;[m
[31m-                    }[m
[31m-                    scale = 'K';[m
[31m-[m
[31m-                } else {[m
[31m-                    size = (ngx_int_t) length;[m
[31m-                    scale = '\0';[m
[31m-                }[m
[31m-[m
[31m-                if (scale) {[m
[31m-                    b->last = ngx_sprintf(b->last, "%6i%c", size, scale);[m
[31m-[m
[31m-                } else {[m
[31m-                    b->last = ngx_sprintf(b->last, " %6i", size);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = CR;[m
[31m-        *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "</pre><hr>", sizeof("</pre><hr>") - 1);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_autoindex_json(ngx_http_request_t *r, ngx_array_t *entries,[m
[31m-    ngx_str_t *callback)[m
[31m-{[m
[31m-    size_t                       len;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_http_autoindex_entry_t  *entry;[m
[31m-[m
[31m-    len = sizeof("[" CRLF CRLF "]") - 1;[m
[31m-[m
[31m-    if (callback) {[m
[31m-        len += sizeof("/* callback */" CRLF "();") - 1 + callback->len;[m
[31m-    }[m
[31m-[m
[31m-    entry = entries->elts;[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        entry[i].escape = ngx_escape_json(NULL, entry[i].name.data,[m
[31m-                                          entry[i].name.len);[m
[31m-[m
[31m-        len += sizeof("{  }," CRLF) - 1[m
[31m-            + sizeof("\"name\":\"\"") - 1[m
[31m-            + entry[i].name.len + entry[i].escape[m
[31m-            + sizeof(", \"type\":\"directory\"") - 1[m
[31m-            + sizeof(", \"mtime\":\"Wed, 31 Dec 1986 10:00:00 GMT\"") - 1;[m
[31m-[m
[31m-        if (entry[i].file) {[m
[31m-            len += sizeof(", \"size\":") - 1 + NGX_OFF_T_LEN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (callback) {[m
[31m-        b->last = ngx_cpymem(b->last, "/* callback */" CRLF,[m
[31m-                             sizeof("/* callback */" CRLF) - 1);[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, callback->data, callback->len);[m
[31m-[m
[31m-        *b->last++ = '(';[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = '[';[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        b->last = ngx_cpymem(b->last, CRLF "{ \"name\":\"",[m
[31m-                             sizeof(CRLF "{ \"name\":\"") - 1);[m
[31m-[m
[31m-        if (entry[i].escape) {[m
[31m-            b->last = (u_char *) ngx_escape_json(b->last, entry[i].name.data,[m
[31m-                                                 entry[i].name.len);[m
[31m-        } else {[m
[31m-            b->last = ngx_cpymem(b->last, entry[i].name.data,[m
[31m-                                 entry[i].name.len);[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "\", \"type\":\"",[m
[31m-                             sizeof("\", \"type\":\"") - 1);[m
[31m-[m
[31m-        if (entry[i].dir) {[m
[31m-            b->last = ngx_cpymem(b->last, "directory", sizeof("directory") - 1);[m
[31m-[m
[31m-        } else if (entry[i].file) {[m
[31m-            b->last = ngx_cpymem(b->last, "file", sizeof("file") - 1);[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_cpymem(b->last, "other", sizeof("other") - 1);[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "\", \"mtime\":\"",[m
[31m-                             sizeof("\", \"mtime\":\"") - 1);[m
[31m-[m
[31m-        b->last = ngx_http_time(b->last, entry[i].mtime);[m
[31m-[m
[31m-        if (entry[i].file) {[m
[31m-            b->last = ngx_cpymem(b->last, "\", \"size\":",[m
[31m-                                 sizeof("\", \"size\":") - 1);[m
[31m-            b->last = ngx_sprintf(b->last, "%O", entry[i].size);[m
[31m-[m
[31m-        } else {[m
[31m-            *b->last++ = '"';[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, " },", sizeof(" },") - 1);[m
[31m-    }[m
[31m-[m
[31m-    if (i > 0) {[m
[31m-        b->last--;  /* strip last comma */[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, CRLF "]", sizeof(CRLF "]") - 1);[m
[31m-[m
[31m-    if (callback) {[m
[31m-        *b->last++ = ')'; *b->last++ = ';';[m
[31m-    }[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_autoindex_jsonp_callback(ngx_http_request_t *r, ngx_str_t *callback)[m
[31m-{[m
[31m-    u_char      *p, c, ch;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (ngx_http_arg(r, (u_char *) "callback", 8, callback) != NGX_OK) {[m
[31m-        callback->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (callback->len > 128) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent too long callback name: \"%V\"", callback);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    p = callback->data;[m
[31m-[m
[31m-    for (i = 0; i < callback->len; i++) {[m
[31m-        ch = p[i];[m
[31m-[m
[31m-        c = (u_char) (ch | 0x20);[m
[31m-        if (c >= 'a' && c <= 'z') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((ch >= '0' && ch <= '9') || ch == '_' || ch == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent invalid callback name: \"%V\"", callback);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_autoindex_xml(ngx_http_request_t *r, ngx_array_t *entries)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_tm_t                        tm;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_str_t                       type;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_http_autoindex_entry_t     *entry;[m
[31m-[m
[31m-    static u_char  head[] = "<?xml version=\"1.0\"?>" CRLF "<list>" CRLF;[m
[31m-    static u_char  tail[] = "</list>" CRLF;[m
[31m-[m
[31m-    len = sizeof(head) - 1 + sizeof(tail) - 1;[m
[31m-[m
[31m-    entry = entries->elts;[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        entry[i].escape = ngx_escape_html(NULL, entry[i].name.data,[m
[31m-                                          entry[i].name.len);[m
[31m-[m
[31m-        len += sizeof("<directory></directory>" CRLF) - 1[m
[31m-            + entry[i].name.len + entry[i].escape[m
[31m-            + sizeof(" mtime=\"1986-12-31T10:00:00Z\"") - 1;[m
[31m-[m
[31m-        if (entry[i].file) {[m
[31m-            len += sizeof(" size=\"\"") - 1 + NGX_OFF_T_LEN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, head, sizeof(head) - 1);[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        *b->last++ = '<';[m
[31m-[m
[31m-        if (entry[i].dir) {[m
[31m-            ngx_str_set(&type, "directory");[m
[31m-[m
[31m-        } else if (entry[i].file) {[m
[31m-            ngx_str_set(&type, "file");[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_set(&type, "other");[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, type.data, type.len);[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, " mtime=\"", sizeof(" mtime=\"") - 1);[m
[31m-[m
[31m-        ngx_gmtime(entry[i].mtime, &tm);[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "%4d-%02d-%02dT%02d:%02d:%02dZ",[m
[31m-                              tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                              tm.ngx_tm_mday, tm.ngx_tm_hour,[m
[31m-                              tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-        if (entry[i].file) {[m
[31m-            b->last = ngx_cpymem(b->last, "\" size=\"",[m
[31m-                                 sizeof("\" size=\"") - 1);[m
[31m-            b->last = ngx_sprintf(b->last, "%O", entry[i].size);[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = '"'; *b->last++ = '>';[m
[31m-[m
[31m-        if (entry[i].escape) {[m
[31m-            b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data,[m
[31m-                                                 entry[i].name.len);[m
[31m-        } else {[m
[31m-            b->last = ngx_cpymem(b->last, entry[i].name.data,[m
[31m-                                 entry[i].name.len);[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = '<'; *b->last++ = '/';[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, type.data, type.len);[m
[31m-[m
[31m-        *b->last++ = '>';[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_autoindex_cmp_entries(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_http_autoindex_entry_t *first = (ngx_http_autoindex_entry_t *) one;[m
[31m-    ngx_http_autoindex_entry_t *second = (ngx_http_autoindex_entry_t *) two;[m
[31m-[m
[31m-    if (first->dir && !second->dir) {[m
[31m-        /* move the directories to the start */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->dir && second->dir) {[m
[31m-        /* move the directories to the start */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return (int) ngx_strcmp(first->name.data, second->name.data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_autoindex_alloc(ngx_http_autoindex_ctx_t *ctx, size_t size)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (ctx->buf) {[m
[31m-[m
[31m-        if ((size_t) (ctx->buf->end - ctx->buf->last) >= size) {[m
[31m-            return ctx->buf;[m
[31m-        }[m
[31m-[m
[31m-        ctx->size += ctx->buf->last - ctx->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    ctx->buf = ngx_create_temp_buf(ctx->pool, ctx->alloc_size);[m
[31m-    if (ctx->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(ctx->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ctx->buf;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    *ctx->last_out = cl;[m
[31m-    ctx->last_out = &cl->next;[m
[31m-[m
[31m-    return ctx->buf;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir, ngx_str_t *name)[m
[31m-{[m
[31m-    if (ngx_close_dir(dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%V\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    return r->header_sent ? NGX_ERROR : NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_autoindex_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_autoindex_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET;[m
[31m-    conf->format = NGX_CONF_UNSET_UINT;[m
[31m-    conf->localtime = NGX_CONF_UNSET;[m
[31m-    conf->exact_size = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_autoindex_loc_conf_t *prev = parent;[m
[31m-    ngx_http_autoindex_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->format, prev->format,[m
[31m-                              NGX_HTTP_AUTOINDEX_HTML);[m
[31m-    ngx_conf_merge_value(conf->localtime, prev->localtime, 0);[m
[31m-    ngx_conf_merge_value(conf->exact_size, prev->exact_size, 1);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_autoindex_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_autoindex_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_browser_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_browser_module.c[m
[1mdeleted file mode 100644[m
[1mindex 80da0d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_browser_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,715 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The module can check browser versions conforming to the following formats:[m
[31m- * X, X.X, X.X.X, and X.X.X.X.  The maximum values of each format may be[m
[31m- * 4000, 4000.99, 4000.99.99, and 4000.99.99.99.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#define  NGX_HTTP_MODERN_BROWSER   0[m
[31m-#define  NGX_HTTP_ANCIENT_BROWSER  1[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                      browser[12];[m
[31m-    size_t                      skip;[m
[31m-    size_t                      add;[m
[31m-    u_char                      name[12];[m
[31m-} ngx_http_modern_browser_mask_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                  version;[m
[31m-    size_t                      skip;[m
[31m-    size_t                      add;[m
[31m-    u_char                      name[12];[m
[31m-} ngx_http_modern_browser_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_http_get_variable_pt    handler;[m
[31m-    uintptr_t                   data;[m
[31m-} ngx_http_browser_variable_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *modern_browsers;[m
[31m-    ngx_array_t                *ancient_browsers;[m
[31m-    ngx_http_variable_value_t  *modern_browser_value;[m
[31m-    ngx_http_variable_value_t  *ancient_browser_value;[m
[31m-[m
[31m-    unsigned                    modern_unlisted_browsers:1;[m
[31m-    unsigned                    netscape4:1;[m
[31m-} ngx_http_browser_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_msie_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_browser_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_uint_t ngx_http_browser(ngx_http_request_t *r,[m
[31m-    ngx_http_browser_conf_t *cf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_browser_add_variable(ngx_conf_t *cf);[m
[31m-static void *ngx_http_browser_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_browser_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static int ngx_libc_cdecl ngx_http_modern_browser_sort(const void *one,[m
[31m-    const void *two);[m
[31m-static char *ngx_http_modern_browser(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_ancient_browser(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_modern_browser_value(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_ancient_browser_value(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_browser_commands[] = {[m
[31m-[m
[31m-    { ngx_string("modern_browser"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_modern_browser,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ancient_browser"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_ancient_browser,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("modern_browser_value"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_modern_browser_value,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ancient_browser_value"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_ancient_browser_value,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_browser_module_ctx = {[m
[31m-    ngx_http_browser_add_variable,         /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_browser_create_conf,          /* create location configuration */[m
[31m-    ngx_http_browser_merge_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_browser_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_browser_module_ctx,          /* module context */[m
[31m-    ngx_http_browser_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_modern_browser_mask_t  ngx_http_modern_browser_masks[] = {[m
[31m-[m
[31m-    /* Opera must be the first browser to check */[m
[31m-[m
[31m-    /*[m
[31m-     * "Opera/7.50 (X11; FreeBSD i386; U)  [en]"[m
[31m-     * "Mozilla/5.0 (X11; FreeBSD i386; U) Opera 7.50  [en]"[m
[31m-     * "Mozilla/4.0 (compatible; MSIE 6.0; X11; FreeBSD i386) Opera 7.50  [en]"[m
[31m-     * "Opera/8.0 (Windows NT 5.1; U; ru)"[m
[31m-     * "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.0"[m
[31m-     * "Opera/9.01 (X11; FreeBSD 6 i386; U; en)"[m
[31m-     */[m
[31m-[m
[31m-    { "opera",[m
[31m-      0,[m
[31m-      sizeof("Opera ") - 1,[m
[31m-      "Opera"},[m
[31m-[m
[31m-    /* "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" */[m
[31m-[m
[31m-    { "msie",[m
[31m-      sizeof("Mozilla/4.0 (compatible; ") - 1,[m
[31m-      sizeof("MSIE ") - 1,[m
[31m-      "MSIE "},[m
[31m-[m
[31m-    /*[m
[31m-     * "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020610"[m
[31m-     * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.5) Gecko/20031006"[m
[31m-     * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.6) Gecko/20040206[m
[31m-     *              Firefox/0.8"[m
[31m-     * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.8)[m
[31m-     *              Gecko/20050511 Firefox/1.0.4"[m
[31m-     * "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.5) Gecko/20060729[m
[31m-     *              Firefox/1.5.0.5"[m
[31m-     */[m
[31m-[m
[31m-    { "gecko",[m
[31m-      sizeof("Mozilla/5.0 (") - 1,[m
[31m-      sizeof("rv:") - 1,[m
[31m-      "rv:"},[m
[31m-[m
[31m-    /*[m
[31m-     * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ru-ru) AppleWebKit/125.2[m
[31m-     *              (KHTML, like Gecko) Safari/125.7"[m
[31m-     * "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413[m
[31m-     *              (KHTML, like Gecko) Safari/413"[m
[31m-     * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418[m
[31m-     *              (KHTML, like Gecko) Safari/417.9.3"[m
[31m-     * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ru-ru) AppleWebKit/418.8[m
[31m-     *              (KHTML, like Gecko) Safari/419.3"[m
[31m-     */[m
[31m-[m
[31m-    { "safari",[m
[31m-      sizeof("Mozilla/5.0 (") - 1,[m
[31m-      sizeof("Safari/") - 1,[m
[31m-      "Safari/"},[m
[31m-[m
[31m-    /*[m
[31m-     * "Mozilla/5.0 (compatible; Konqueror/3.1; Linux)"[m
[31m-     * "Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.2 (like Gecko)"[m
[31m-     * "Mozilla/5.0 (compatible; Konqueror/3.5; FreeBSD) KHTML/3.5.1[m
[31m-     *              (like Gecko)"[m
[31m-     */[m
[31m-[m
[31m-    { "konqueror",[m
[31m-      sizeof("Mozilla/5.0 (compatible; ") - 1,[m
[31m-      sizeof("Konqueror/") - 1,[m
[31m-      "Konqueror/"},[m
[31m-[m
[31m-    { "", 0, 0, "" }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_browser_variable_t  ngx_http_browsers[] = {[m
[31m-    { ngx_string("msie"), ngx_http_msie_variable, 0 },[m
[31m-    { ngx_string("modern_browser"), ngx_http_browser_variable,[m
[31m-          NGX_HTTP_MODERN_BROWSER },[m
[31m-    { ngx_string("ancient_browser"), ngx_http_browser_variable,[m
[31m-          NGX_HTTP_ANCIENT_BROWSER },[m
[31m-    { ngx_null_string, NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_browser_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t                rc;[m
[31m-    ngx_http_browser_conf_t  *cf;[m
[31m-[m
[31m-    cf = ngx_http_get_module_loc_conf(r, ngx_http_browser_module);[m
[31m-[m
[31m-    rc = ngx_http_browser(r, cf);[m
[31m-[m
[31m-    if (data == NGX_HTTP_MODERN_BROWSER && rc == NGX_HTTP_MODERN_BROWSER) {[m
[31m-        *v = *cf->modern_browser_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (data == NGX_HTTP_ANCIENT_BROWSER && rc == NGX_HTTP_ANCIENT_BROWSER) {[m
[31m-        *v = *cf->ancient_browser_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_browser(ngx_http_request_t *r, ngx_http_browser_conf_t *cf)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    u_char                     *name, *ua, *last, c;[m
[31m-    ngx_str_t                  *ancient;[m
[31m-    ngx_uint_t                  i, version, ver, scale;[m
[31m-    ngx_http_modern_browser_t  *modern;[m
[31m-[m
[31m-    if (r->headers_in.user_agent == NULL) {[m
[31m-        if (cf->modern_unlisted_browsers) {[m
[31m-            return NGX_HTTP_MODERN_BROWSER;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-    }[m
[31m-[m
[31m-    ua = r->headers_in.user_agent->value.data;[m
[31m-    len = r->headers_in.user_agent->value.len;[m
[31m-    last = ua + len;[m
[31m-[m
[31m-    if (cf->modern_browsers) {[m
[31m-        modern = cf->modern_browsers->elts;[m
[31m-[m
[31m-        for (i = 0; i < cf->modern_browsers->nelts; i++) {[m
[31m-            name = ua + modern[i].skip;[m
[31m-[m
[31m-            if (name >= last) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            name = (u_char *) ngx_strstr(name, modern[i].name);[m
[31m-[m
[31m-            if (name == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "browser: \"%s\"", name);[m
[31m-[m
[31m-            name += modern[i].add;[m
[31m-[m
[31m-            if (name >= last) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "version: \"%ui\" \"%s\"", modern[i].version, name);[m
[31m-[m
[31m-            version = 0;[m
[31m-            ver = 0;[m
[31m-            scale = 1000000;[m
[31m-[m
[31m-            while (name < last) {[m
[31m-[m
[31m-                c = *name++;[m
[31m-[m
[31m-                if (c >= '0' && c <= '9') {[m
[31m-                    ver = ver * 10 + (c - '0');[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (c == '.') {[m
[31m-                    version += ver * scale;[m
[31m-[m
[31m-                    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "version: \"%ui\" \"%ui\"",[m
[31m-                                   modern[i].version, version);[m
[31m-[m
[31m-                    if (version > modern[i].version) {[m
[31m-                        return NGX_HTTP_MODERN_BROWSER;[m
[31m-                    }[m
[31m-[m
[31m-                    ver = 0;[m
[31m-                    scale /= 100;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            version += ver * scale;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "version: \"%ui\" \"%ui\"",[m
[31m-                           modern[i].version, version);[m
[31m-[m
[31m-            if (version >= modern[i].version) {[m
[31m-                return NGX_HTTP_MODERN_BROWSER;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-        }[m
[31m-[m
[31m-        if (!cf->modern_unlisted_browsers) {[m
[31m-            return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->netscape4) {[m
[31m-        if (len > sizeof("Mozilla/4.72 ") - 1[m
[31m-            && ngx_strncmp(ua, "Mozilla/", sizeof("Mozilla/") - 1) == 0[m
[31m-            && ua[8] > '0' && ua[8] < '5')[m
[31m-        {[m
[31m-            return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->ancient_browsers) {[m
[31m-        ancient = cf->ancient_browsers->elts;[m
[31m-[m
[31m-        for (i = 0; i < cf->ancient_browsers->nelts; i++) {[m
[31m-            if (len >= ancient[i].len[m
[31m-                && ngx_strstr(ua, ancient[i].data) != NULL)[m
[31m-            {[m
[31m-                return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->modern_unlisted_browsers) {[m
[31m-        return NGX_HTTP_MODERN_BROWSER;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_msie_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    if (r->headers_in.msie) {[m
[31m-        *v = ngx_http_variable_true_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_browser_add_variable(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_browser_variable_t   *var;[m
[31m-    ngx_http_variable_t           *v;[m
[31m-[m
[31m-    for (var = ngx_http_browsers; var->name.len; var++) {[m
[31m-[m
[31m-        v = ngx_http_add_variable(cf, &var->name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-        if (v == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->get_handler = var->handler;[m
[31m-        v->data = var->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_browser_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_browser_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->modern_browsers = NULL;[m
[31m-     *     conf->ancient_browsers = NULL;[m
[31m-     *     conf->modern_browser_value = NULL;[m
[31m-     *     conf->ancient_browser_value = NULL;[m
[31m-     *[m
[31m-     *     conf->modern_unlisted_browsers = 0;[m
[31m-     *     conf->netscape4 = 0;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_browser_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *prev = parent;[m
[31m-    ngx_http_browser_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_modern_browser_t  *browsers, *opera;[m
[31m-[m
[31m-    /*[m
[31m-     * At the merge the skip field is used to store the browser slot,[m
[31m-     * it will be used in sorting and then will overwritten[m
[31m-     * with a real skip value.  The zero value means Opera.[m
[31m-     */[m
[31m-[m
[31m-    if (conf->modern_browsers == NULL && conf->modern_unlisted_browsers == 0) {[m
[31m-        conf->modern_browsers = prev->modern_browsers;[m
[31m-        conf->modern_unlisted_browsers = prev->modern_unlisted_browsers;[m
[31m-[m
[31m-    } else if (conf->modern_browsers != NULL) {[m
[31m-        browsers = conf->modern_browsers->elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->modern_browsers->nelts; i++) {[m
[31m-            if (browsers[i].skip == 0) {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * Opera may contain MSIE string, so if Opera was not enumerated[m
[31m-         * as modern browsers, then add it and set a unreachable version[m
[31m-         */[m
[31m-[m
[31m-        opera = ngx_array_push(conf->modern_browsers);[m
[31m-        if (opera == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        opera->skip = 0;[m
[31m-        opera->version = 4001000000U;[m
[31m-[m
[31m-        browsers = conf->modern_browsers->elts;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-        ngx_qsort(browsers, (size_t) conf->modern_browsers->nelts,[m
[31m-                  sizeof(ngx_http_modern_browser_t),[m
[31m-                  ngx_http_modern_browser_sort);[m
[31m-[m
[31m-        for (i = 0; i < conf->modern_browsers->nelts; i++) {[m
[31m-             n = browsers[i].skip;[m
[31m-[m
[31m-             browsers[i].skip = ngx_http_modern_browser_masks[n].skip;[m
[31m-             browsers[i].add = ngx_http_modern_browser_masks[n].add;[m
[31m-             (void) ngx_cpystrn(browsers[i].name,[m
[31m-                                ngx_http_modern_browser_masks[n].name, 12);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->ancient_browsers == NULL && conf->netscape4 == 0) {[m
[31m-        conf->ancient_browsers = prev->ancient_browsers;[m
[31m-        conf->netscape4 = prev->netscape4;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->modern_browser_value == NULL) {[m
[31m-        conf->modern_browser_value = prev->modern_browser_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->modern_browser_value == NULL) {[m
[31m-        conf->modern_browser_value = &ngx_http_variable_true_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->ancient_browser_value == NULL) {[m
[31m-        conf->ancient_browser_value = prev->ancient_browser_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->ancient_browser_value == NULL) {[m
[31m-        conf->ancient_browser_value = &ngx_http_variable_true_value;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_modern_browser_sort(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_http_modern_browser_t *first = (ngx_http_modern_browser_t *) one;[m
[31m-    ngx_http_modern_browser_t *second = (ngx_http_modern_browser_t *) two;[m
[31m-[m
[31m-    return (first->skip - second->skip);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_modern_browser(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *bcf = conf;[m
[31m-[m
[31m-    u_char                           c;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_uint_t                       i, n, version, ver, scale;[m
[31m-    ngx_http_modern_browser_t       *browser;[m
[31m-    ngx_http_modern_browser_mask_t  *mask;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        if (ngx_strcmp(value[1].data, "unlisted") == 0) {[m
[31m-            bcf->modern_unlisted_browsers = 1;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (bcf->modern_browsers == NULL) {[m
[31m-        bcf->modern_browsers = ngx_array_create(cf->pool, 5,[m
[31m-                                            sizeof(ngx_http_modern_browser_t));[m
[31m-        if (bcf->modern_browsers == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    browser = ngx_array_push(bcf->modern_browsers);[m
[31m-    if (browser == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mask = ngx_http_modern_browser_masks;[m
[31m-[m
[31m-    for (n = 0; mask[n].browser[0] != '\0'; n++) {[m
[31m-        if (ngx_strcasecmp(mask[n].browser, value[1].data) == 0) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "unknown browser name \"%V\"", &value[1]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    /*[m
[31m-     * at this stage the skip field is used to store the browser slot,[m
[31m-     * it will be used in sorting in merge stage and then will overwritten[m
[31m-     * with a real value[m
[31m-     */[m
[31m-[m
[31m-    browser->skip = n;[m
[31m-[m
[31m-    version = 0;[m
[31m-    ver = 0;[m
[31m-    scale = 1000000;[m
[31m-[m
[31m-    for (i = 0; i < value[2].len; i++) {[m
[31m-[m
[31m-        c = value[2].data[i];[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            ver = ver * 10 + (c - '0');[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (c == '.') {[m
[31m-            version += ver * scale;[m
[31m-            ver = 0;[m
[31m-            scale /= 100;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid browser version \"%V\"", &value[2]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    version += ver * scale;[m
[31m-[m
[31m-    browser->version = version;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ancient_browser(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *bcf = conf;[m
[31m-[m
[31m-    ngx_str_t   *value, *browser;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (ngx_strcmp(value[i].data, "netscape4") == 0) {[m
[31m-            bcf->netscape4 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bcf->ancient_browsers == NULL) {[m
[31m-            bcf->ancient_browsers = ngx_array_create(cf->pool, 4,[m
[31m-                                                     sizeof(ngx_str_t));[m
[31m-            if (bcf->ancient_browsers == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        browser = ngx_array_push(bcf->ancient_browsers);[m
[31m-        if (browser == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *browser = value[i];[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_modern_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *bcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    bcf->modern_browser_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_variable_value_t));[m
[31m-    if (bcf->modern_browser_value == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    bcf->modern_browser_value->len = value[1].len;[m
[31m-    bcf->modern_browser_value->valid = 1;[m
[31m-    bcf->modern_browser_value->no_cacheable = 0;[m
[31m-    bcf->modern_browser_value->not_found = 0;[m
[31m-    bcf->modern_browser_value->data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ancient_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *bcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    bcf->ancient_browser_value = ngx_palloc(cf->pool,[m
[31m-                                            sizeof(ngx_http_variable_value_t));[m
[31m-    if (bcf->ancient_browser_value == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    bcf->ancient_browser_value->len = value[1].len;[m
[31m-    bcf->ancient_browser_value->valid = 1;[m
[31m-    bcf->ancient_browser_value->no_cacheable = 0;[m
[31m-    bcf->ancient_browser_value->not_found = 0;[m
[31m-    bcf->ancient_browser_value->data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_charset_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_charset_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 4ea9818..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_charset_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1685 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_CHARSET_OFF    -2[m
[31m-#define NGX_HTTP_NO_CHARSET     -3[m
[31m-#define NGX_HTTP_CHARSET_VAR    0x10000[m
[31m-[m
[31m-/* 1 byte length and up to 3 bytes for the UTF-8 encoding of the UCS-2 */[m
[31m-#define NGX_UTF_LEN             4[m
[31m-[m
[31m-#define NGX_HTML_ENTITY_LEN     (sizeof("&#1114111;") - 1)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                    **tables;[m
[31m-    ngx_str_t                   name;[m
[31m-[m
[31m-    unsigned                    length:16;[m
[31m-    unsigned                    utf8:1;[m
[31m-} ngx_http_charset_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                   src;[m
[31m-    ngx_int_t                   dst;[m
[31m-} ngx_http_charset_recode_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                   src;[m
[31m-    ngx_int_t                   dst;[m
[31m-    u_char                     *src2dst;[m
[31m-    u_char                     *dst2src;[m
[31m-} ngx_http_charset_tables_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                 charsets;       /* ngx_http_charset_t */[m
[31m-    ngx_array_t                 tables;         /* ngx_http_charset_tables_t */[m
[31m-    ngx_array_t                 recodes;        /* ngx_http_charset_recode_t */[m
[31m-} ngx_http_charset_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                   charset;[m
[31m-    ngx_int_t                   source_charset;[m
[31m-    ngx_flag_t                  override_charset;[m
[31m-[m
[31m-    ngx_hash_t                  types;[m
[31m-    ngx_array_t                *types_keys;[m
[31m-} ngx_http_charset_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *table;[m
[31m-    ngx_int_t                   charset;[m
[31m-    ngx_str_t                   charset_name;[m
[31m-[m
[31m-    ngx_chain_t                *busy;[m
[31m-    ngx_chain_t                *free_bufs;[m
[31m-    ngx_chain_t                *free_buffers;[m
[31m-[m
[31m-    size_t                      saved_len;[m
[31m-    u_char                      saved[NGX_UTF_LEN];[m
[31m-[m
[31m-    unsigned                    length:16;[m
[31m-    unsigned                    from_utf8:1;[m
[31m-    unsigned                    to_utf8:1;[m
[31m-} ngx_http_charset_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_charset_tables_t  *table;[m
[31m-    ngx_http_charset_t         *charset;[m
[31m-    ngx_uint_t                  characters;[m
[31m-} ngx_http_charset_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_destination_charset(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_main_request_charset(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_source_charset(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_get_charset(ngx_http_request_t *r, ngx_str_t *name);[m
[31m-static ngx_inline void ngx_http_set_charset(ngx_http_request_t *r,[m
[31m-    ngx_str_t *charset);[m
[31m-static ngx_int_t ngx_http_charset_ctx(ngx_http_request_t *r,[m
[31m-    ngx_http_charset_t *charsets, ngx_int_t charset, ngx_int_t source_charset);[m
[31m-static ngx_uint_t ngx_http_charset_recode(ngx_buf_t *b, u_char *table);[m
[31m-static ngx_chain_t *ngx_http_charset_recode_from_utf8(ngx_pool_t *pool,[m
[31m-    ngx_buf_t *buf, ngx_http_charset_ctx_t *ctx);[m
[31m-static ngx_chain_t *ngx_http_charset_recode_to_utf8(ngx_pool_t *pool,[m
[31m-    ngx_buf_t *buf, ngx_http_charset_ctx_t *ctx);[m
[31m-[m
[31m-static ngx_chain_t *ngx_http_charset_get_buf(ngx_pool_t *pool,[m
[31m-    ngx_http_charset_ctx_t *ctx);[m
[31m-static ngx_chain_t *ngx_http_charset_get_buffer(ngx_pool_t *pool,[m
[31m-    ngx_http_charset_ctx_t *ctx, size_t size);[m
[31m-[m
[31m-static char *ngx_http_charset_map_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_charset_map(ngx_conf_t *cf, ngx_command_t *dummy,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_set_charset_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_add_charset(ngx_array_t *charsets, ngx_str_t *name);[m
[31m-[m
[31m-static void *ngx_http_charset_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_charset_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_charset_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_charset_postconfiguration(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_charset_default_types[] = {[m
[31m-    ngx_string("text/html"),[m
[31m-    ngx_string("text/xml"),[m
[31m-    ngx_string("text/plain"),[m
[31m-    ngx_string("text/vnd.wap.wml"),[m
[31m-    ngx_string("application/javascript"),[m
[31m-    ngx_string("application/rss+xml"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_charset_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("charset"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_charset_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_charset_loc_conf_t, charset),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("source_charset"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_charset_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_charset_loc_conf_t, source_charset),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("override_charset"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_charset_loc_conf_t, override_charset),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("charset_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_charset_loc_conf_t, types_keys),[m
[31m-      &ngx_http_charset_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("charset_map"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,[m
[31m-      ngx_http_charset_map_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_charset_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_charset_postconfiguration,    /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_charset_create_main_conf,     /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_charset_create_loc_conf,      /* create location configuration */[m
[31m-    ngx_http_charset_merge_loc_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_charset_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_charset_filter_module_ctx,   /* module context */[m
[31m-    ngx_http_charset_filter_commands,      /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_charset_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                      charset, source_charset;[m
[31m-    ngx_str_t                      dst, src;[m
[31m-    ngx_http_charset_t            *charsets;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        charset = ngx_http_destination_charset(r, &dst);[m
[31m-[m
[31m-    } else {[m
[31m-        charset = ngx_http_main_request_charset(r, &dst);[m
[31m-    }[m
[31m-[m
[31m-    if (charset == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (charset == NGX_DECLINED) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    /* charset: charset index or NGX_HTTP_NO_CHARSET */[m
[31m-[m
[31m-    source_charset = ngx_http_source_charset(r, &src);[m
[31m-[m
[31m-    if (source_charset == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * source_charset: charset index, NGX_HTTP_NO_CHARSET,[m
[31m-     *                 or NGX_HTTP_CHARSET_OFF[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "charset: \"%V\" > \"%V\"", &src, &dst);[m
[31m-[m
[31m-    if (source_charset == NGX_HTTP_CHARSET_OFF) {[m
[31m-        ngx_http_set_charset(r, &dst);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (charset == NGX_HTTP_NO_CHARSET[m
[31m-        || source_charset == NGX_HTTP_NO_CHARSET)[m
[31m-    {[m
[31m-        if (source_charset != charset[m
[31m-            || ngx_strncasecmp(dst.data, src.data, dst.len) != 0)[m
[31m-        {[m
[31m-            goto no_charset_map;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_charset(r, &dst);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (source_charset == charset) {[m
[31m-        r->headers_out.content_type.len = r->headers_out.content_type_len;[m
[31m-[m
[31m-        ngx_http_set_charset(r, &dst);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    /* source_charset != charset */[m
[31m-[m
[31m-    if (r->headers_out.content_encoding[m
[31m-        && r->headers_out.content_encoding->value.len)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);[m
[31m-    charsets = mcf->charsets.elts;[m
[31m-[m
[31m-    if (charsets[source_charset].tables == NULL[m
[31m-        || charsets[source_charset].tables[charset] == NULL)[m
[31m-    {[m
[31m-        goto no_charset_map;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type.len = r->headers_out.content_type_len;[m
[31m-[m
[31m-    ngx_http_set_charset(r, &dst);[m
[31m-[m
[31m-    return ngx_http_charset_ctx(r, charsets, charset, source_charset);[m
[31m-[m
[31m-no_charset_map:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "no \"charset_map\" between the charsets \"%V\" and \"%V\"",[m
[31m-                  &src, &dst);[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_destination_charset(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_int_t                      charset;[m
[31m-    ngx_http_charset_t            *charsets;[m
[31m-    ngx_http_variable_value_t     *vv;[m
[31m-    ngx_http_charset_loc_conf_t   *mlcf;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    if (r->headers_out.content_type.len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.override_charset[m
[31m-        && r->headers_out.override_charset->len)[m
[31m-    {[m
[31m-        *name = *r->headers_out.override_charset;[m
[31m-[m
[31m-        charset = ngx_http_get_charset(r, name);[m
[31m-[m
[31m-        if (charset != NGX_HTTP_NO_CHARSET) {[m
[31m-            return charset;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unknown charset \"%V\" to override", name);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_charset_filter_module);[m
[31m-    charset = mlcf->charset;[m
[31m-[m
[31m-    if (charset == NGX_HTTP_CHARSET_OFF) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.charset.len) {[m
[31m-        if (mlcf->override_charset == 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_test_content_type(r, &mlcf->types) == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (charset < NGX_HTTP_CHARSET_VAR) {[m
[31m-        mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);[m
[31m-        charsets = mcf->charsets.elts;[m
[31m-        *name = charsets[charset].name;[m
[31m-        return charset;[m
[31m-    }[m
[31m-[m
[31m-    vv = ngx_http_get_indexed_variable(r, charset - NGX_HTTP_CHARSET_VAR);[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->len = vv->len;[m
[31m-    name->data = vv->data;[m
[31m-[m
[31m-    return ngx_http_get_charset(r, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_main_request_charset(ngx_http_request_t *r, ngx_str_t *src)[m
[31m-{[m
[31m-    ngx_int_t                charset;[m
[31m-    ngx_str_t               *main_charset;[m
[31m-    ngx_http_charset_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r->main, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        *src = ctx->charset_name;[m
[31m-        return ctx->charset;[m
[31m-    }[m
[31m-[m
[31m-    main_charset = &r->main->headers_out.charset;[m
[31m-[m
[31m-    if (main_charset->len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_charset_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r->main, ctx, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    charset = ngx_http_get_charset(r, main_charset);[m
[31m-[m
[31m-    ctx->charset = charset;[m
[31m-    ctx->charset_name = *main_charset;[m
[31m-    *src = *main_charset;[m
[31m-[m
[31m-    return charset;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_source_charset(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_int_t                      charset;[m
[31m-    ngx_http_charset_t            *charsets;[m
[31m-    ngx_http_variable_value_t     *vv;[m
[31m-    ngx_http_charset_loc_conf_t   *lcf;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    if (r->headers_out.charset.len) {[m
[31m-        *name = r->headers_out.charset;[m
[31m-        return ngx_http_get_charset(r, name);[m
[31m-    }[m
[31m-[m
[31m-    lcf = ngx_http_get_module_loc_conf(r, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    charset = lcf->source_charset;[m
[31m-[m
[31m-    if (charset == NGX_HTTP_CHARSET_OFF) {[m
[31m-        name->len = 0;[m
[31m-        return charset;[m
[31m-    }[m
[31m-[m
[31m-    if (charset < NGX_HTTP_CHARSET_VAR) {[m
[31m-        mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);[m
[31m-        charsets = mcf->charsets.elts;[m
[31m-        *name = charsets[charset].name;[m
[31m-        return charset;[m
[31m-    }[m
[31m-[m
[31m-    vv = ngx_http_get_indexed_variable(r, charset - NGX_HTTP_CHARSET_VAR);[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->len = vv->len;[m
[31m-    name->data = vv->data;[m
[31m-[m
[31m-    return ngx_http_get_charset(r, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_get_charset(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_uint_t                     i, n;[m
[31m-    ngx_http_charset_t            *charset;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    charset = mcf->charsets.elts;[m
[31m-    n = mcf->charsets.nelts;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        if (charset[i].name.len != name->len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(charset[i].name.data, name->data, name->len) == 0) {[m
[31m-            return i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_NO_CHARSET;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_set_charset(ngx_http_request_t *r, ngx_str_t *charset)[m
[31m-{[m
[31m-    if (r != r->main) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_MOVED_PERMANENTLY[m
[31m-        || r->headers_out.status == NGX_HTTP_MOVED_TEMPORARILY)[m
[31m-    {[m
[31m-        /*[m
[31m-         * do not set charset for the redirect because NN 4.x[m
[31m-         * use this charset instead of the next page charset[m
[31m-         */[m
[31m-[m
[31m-        r->headers_out.charset.len = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.charset = *charset;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_charset_ctx(ngx_http_request_t *r, ngx_http_charset_t *charsets,[m
[31m-    ngx_int_t charset, ngx_int_t source_charset)[m
[31m-{[m
[31m-    ngx_http_charset_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_charset_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    ctx->table = charsets[source_charset].tables[charset];[m
[31m-    ctx->charset = charset;[m
[31m-    ctx->charset_name = charsets[charset].name;[m
[31m-    ctx->length = charsets[charset].length;[m
[31m-    ctx->from_utf8 = charsets[source_charset].utf8;[m
[31m-    ctx->to_utf8 = charsets[charset].utf8;[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    if ((ctx->to_utf8 || ctx->from_utf8) && r == r->main) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-[m
[31m-    } else {[m
[31m-        r->filter_need_temporary = 1;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_charset_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_buf_t               *b;[m
[31m-    ngx_chain_t             *cl, *out, **ll;[m
[31m-    ngx_http_charset_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->table == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->to_utf8 || ctx->from_utf8) || ctx->busy) {[m
[31m-[m
[31m-        out = NULL;[m
[31m-        ll = &out;[m
[31m-[m
[31m-        for (cl = in; cl; cl = cl->next) {[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (ngx_buf_size(b) == 0) {[m
[31m-[m
[31m-                *ll = ngx_alloc_chain_link(r->pool);[m
[31m-                if (*ll == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                (*ll)->buf = b;[m
[31m-                (*ll)->next = NULL;[m
[31m-[m
[31m-                ll = &(*ll)->next;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->to_utf8) {[m
[31m-                *ll = ngx_http_charset_recode_to_utf8(r->pool, b, ctx);[m
[31m-[m
[31m-            } else {[m
[31m-                *ll = ngx_http_charset_recode_from_utf8(r->pool, b, ctx);[m
[31m-            }[m
[31m-[m
[31m-            if (*ll == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            while (*ll) {[m
[31m-                ll = &(*ll)->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_next_body_filter(r, out);[m
[31m-[m
[31m-        if (out) {[m
[31m-            if (ctx->busy == NULL) {[m
[31m-                ctx->busy = out;[m
[31m-[m
[31m-            } else {[m
[31m-                for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }[m
[31m-                cl->next = out;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        while (ctx->busy) {[m
[31m-[m
[31m-            cl = ctx->busy;[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (ngx_buf_size(b) != 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ctx->busy = cl->next;[m
[31m-[m
[31m-            if (b->tag != (ngx_buf_tag_t) &ngx_http_charset_filter_module) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (b->shadow) {[m
[31m-                b->shadow->pos = b->shadow->last;[m
[31m-            }[m
[31m-[m
[31m-            if (b->pos) {[m
[31m-                cl->next = ctx->free_buffers;[m
[31m-                ctx->free_buffers = cl;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            cl->next = ctx->free_bufs;[m
[31m-            ctx->free_bufs = cl;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        (void) ngx_http_charset_recode(cl->buf, ctx->table);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_charset_recode(ngx_buf_t *b, u_char *table)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    last = b->last;[m
[31m-[m
[31m-    for (p = b->pos; p < last; p++) {[m
[31m-[m
[31m-        if (*p != table[*p]) {[m
[31m-            goto recode;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-recode:[m
[31m-[m
[31m-    do {[m
[31m-        if (*p != table[*p]) {[m
[31m-            *p = table[*p];[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-[m
[31m-    } while (p < last);[m
[31m-[m
[31m-    b->in_file = 0;[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_charset_recode_from_utf8(ngx_pool_t *pool, ngx_buf_t *buf,[m
[31m-    ngx_http_charset_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t        len, size;[m
[31m-    u_char        c, *p, *src, *dst, *saved, **table;[m
[31m-    uint32_t      n;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_chain_t  *out, *cl, **ll;[m
[31m-[m
[31m-    src = buf->pos;[m
[31m-[m
[31m-    if (ctx->saved_len == 0) {[m
[31m-[m
[31m-        for ( /* void */ ; src < buf->last; src++) {[m
[31m-[m
[31m-            if (*src < 0x80) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len = src - buf->pos;[m
[31m-[m
[31m-            if (len > 512) {[m
[31m-                out = ngx_http_charset_get_buf(pool, ctx);[m
[31m-                if (out == NULL) {[m
[31m-                    return NULL;[m
[31m-                }[m
[31m-[m
[31m-                b = out->buf;[m
[31m-[m
[31m-                b->temporary = buf->temporary;[m
[31m-                b->memory = buf->memory;[m
[31m-                b->mmap = buf->mmap;[m
[31m-                b->flush = buf->flush;[m
[31m-[m
[31m-                b->pos = buf->pos;[m
[31m-                b->last = src;[m
[31m-[m
[31m-                out->buf = b;[m
[31m-                out->next = NULL;[m
[31m-[m
[31m-                size = buf->last - src;[m
[31m-[m
[31m-                saved = src;[m
[31m-                n = ngx_utf8_decode(&saved, size);[m
[31m-[m
[31m-                if (n == 0xfffffffe) {[m
[31m-                    /* incomplete UTF-8 symbol */[m
[31m-[m
[31m-                    ngx_memcpy(ctx->saved, src, size);[m
[31m-                    ctx->saved_len = size;[m
[31m-[m
[31m-                    b->shadow = buf;[m
[31m-[m
[31m-                    return out;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                out = NULL;[m
[31m-                size = len + buf->last - src;[m
[31m-                src = buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            if (size < NGX_HTML_ENTITY_LEN) {[m
[31m-                size += NGX_HTML_ENTITY_LEN;[m
[31m-            }[m
[31m-[m
[31m-            cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-            if (cl == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (out) {[m
[31m-                out->next = cl;[m
[31m-[m
[31m-            } else {[m
[31m-                out = cl;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-            dst = b->pos;[m
[31m-[m
[31m-            goto recode;[m
[31m-        }[m
[31m-[m
[31m-        out = ngx_alloc_chain_link(pool);[m
[31m-        if (out == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        out->buf = buf;[m
[31m-        out->next = NULL;[m
[31m-[m
[31m-        return out;[m
[31m-    }[m
[31m-[m
[31m-    /* process incomplete UTF sequence from previous buffer */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                   "http charset utf saved: %z", ctx->saved_len);[m
[31m-[m
[31m-    p = src;[m
[31m-[m
[31m-    for (i = ctx->saved_len; i < NGX_UTF_LEN; i++) {[m
[31m-        ctx->saved[i] = *p++;[m
[31m-[m
[31m-        if (p == buf->last) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    saved = ctx->saved;[m
[31m-    n = ngx_utf8_decode(&saved, i);[m
[31m-[m
[31m-    c = '\0';[m
[31m-[m
[31m-    if (n < 0x10000) {[m
[31m-        table = (u_char **) ctx->table;[m
[31m-        p = table[n >> 8];[m
[31m-[m
[31m-        if (p) {[m
[31m-            c = p[n & 0xff];[m
[31m-        }[m
[31m-[m
[31m-    } else if (n == 0xfffffffe) {[m
[31m-[m
[31m-        /* incomplete UTF-8 symbol */[m
[31m-[m
[31m-        if (i < NGX_UTF_LEN) {[m
[31m-            out = ngx_http_charset_get_buf(pool, ctx);[m
[31m-            if (out == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            b = out->buf;[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->last = buf->last;[m
[31m-            b->sync = 1;[m
[31m-            b->shadow = buf;[m
[31m-[m
[31m-            ngx_memcpy(&ctx->saved[ctx->saved_len], src, i);[m
[31m-            ctx->saved_len += i;[m
[31m-[m
[31m-            return out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = buf->last - buf->pos;[m
[31m-[m
[31m-    if (size < NGX_HTML_ENTITY_LEN) {[m
[31m-        size += NGX_HTML_ENTITY_LEN;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    out = cl;[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-    dst = b->pos;[m
[31m-[m
[31m-    if (c) {[m
[31m-        *dst++ = c;[m
[31m-[m
[31m-    } else if (n == 0xfffffffe) {[m
[31m-        *dst++ = '?';[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                       "http charset invalid utf 0");[m
[31m-[m
[31m-        saved = &ctx->saved[NGX_UTF_LEN];[m
[31m-[m
[31m-    } else if (n > 0x10ffff) {[m
[31m-        *dst++ = '?';[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                       "http charset invalid utf 1");[m
[31m-[m
[31m-    } else {[m
[31m-        dst = ngx_sprintf(dst, "&#%uD;", n);[m
[31m-    }[m
[31m-[m
[31m-    src += (saved - ctx->saved) - ctx->saved_len;[m
[31m-    ctx->saved_len = 0;[m
[31m-[m
[31m-recode:[m
[31m-[m
[31m-    ll = &cl->next;[m
[31m-[m
[31m-    table = (u_char **) ctx->table;[m
[31m-[m
[31m-    while (src < buf->last) {[m
[31m-[m
[31m-        if ((size_t) (b->end - dst) < NGX_HTML_ENTITY_LEN) {[m
[31m-            b->last = dst;[m
[31m-[m
[31m-            size = buf->last - src + NGX_HTML_ENTITY_LEN;[m
[31m-[m
[31m-            cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-            if (cl == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-            dst = b->pos;[m
[31m-        }[m
[31m-[m
[31m-        if (*src < 0x80) {[m
[31m-            *dst++ = *src++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len = buf->last - src;[m
[31m-[m
[31m-        n = ngx_utf8_decode(&src, len);[m
[31m-[m
[31m-        if (n < 0x10000) {[m
[31m-[m
[31m-            p = table[n >> 8];[m
[31m-[m
[31m-            if (p) {[m
[31m-                c = p[n & 0xff];[m
[31m-[m
[31m-                if (c) {[m
[31m-                    *dst++ = c;[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            dst = ngx_sprintf(dst, "&#%uD;", n);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0xfffffffe) {[m
[31m-            /* incomplete UTF-8 symbol */[m
[31m-[m
[31m-            ngx_memcpy(ctx->saved, src, len);[m
[31m-            ctx->saved_len = len;[m
[31m-[m
[31m-            if (b->pos == dst) {[m
[31m-                b->sync = 1;[m
[31m-                b->temporary = 0;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0x10ffff) {[m
[31m-            *dst++ = '?';[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                           "http charset invalid utf 2");[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* n > 0xffff */[m
[31m-[m
[31m-        dst = ngx_sprintf(dst, "&#%uD;", n);[m
[31m-    }[m
[31m-[m
[31m-    b->last = dst;[m
[31m-[m
[31m-    b->last_buf = buf->last_buf;[m
[31m-    b->last_in_chain = buf->last_in_chain;[m
[31m-    b->flush = buf->flush;[m
[31m-[m
[31m-    b->shadow = buf;[m
[31m-[m
[31m-    return out;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_charset_recode_to_utf8(ngx_pool_t *pool, ngx_buf_t *buf,[m
[31m-    ngx_http_charset_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t        len, size;[m
[31m-    u_char       *p, *src, *dst, *table;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *out, *cl, **ll;[m
[31m-[m
[31m-    table = ctx->table;[m
[31m-[m
[31m-    for (src = buf->pos; src < buf->last; src++) {[m
[31m-        if (table[*src * NGX_UTF_LEN] == '\1') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto recode;[m
[31m-    }[m
[31m-[m
[31m-    out = ngx_alloc_chain_link(pool);[m
[31m-    if (out == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    out->buf = buf;[m
[31m-    out->next = NULL;[m
[31m-[m
[31m-    return out;[m
[31m-[m
[31m-recode:[m
[31m-[m
[31m-    /*[m
[31m-     * we assume that there are about half of characters to be recoded,[m
[31m-     * so we preallocate "size / 2 + size / 2 * ctx->length"[m
[31m-     */[m
[31m-[m
[31m-    len = src - buf->pos;[m
[31m-[m
[31m-    if (len > 512) {[m
[31m-        out = ngx_http_charset_get_buf(pool, ctx);[m
[31m-        if (out == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        b = out->buf;[m
[31m-[m
[31m-        b->temporary = buf->temporary;[m
[31m-        b->memory = buf->memory;[m
[31m-        b->mmap = buf->mmap;[m
[31m-        b->flush = buf->flush;[m
[31m-[m
[31m-        b->pos = buf->pos;[m
[31m-        b->last = src;[m
[31m-[m
[31m-        out->buf = b;[m
[31m-        out->next = NULL;[m
[31m-[m
[31m-        size = buf->last - src;[m
[31m-        size = size / 2 + size / 2 * ctx->length;[m
[31m-[m
[31m-    } else {[m
[31m-        out = NULL;[m
[31m-[m
[31m-        size = buf->last - src;[m
[31m-        size = len + size / 2 + size / 2 * ctx->length;[m
[31m-[m
[31m-        src = buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (out) {[m
[31m-        out->next = cl;[m
[31m-[m
[31m-    } else {[m
[31m-        out = cl;[m
[31m-    }[m
[31m-[m
[31m-    ll = &cl->next;[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-    dst = b->pos;[m
[31m-[m
[31m-    while (src < buf->last) {[m
[31m-[m
[31m-        p = &table[*src++ * NGX_UTF_LEN];[m
[31m-        len = *p++;[m
[31m-[m
[31m-        if ((size_t) (b->end - dst) < len) {[m
[31m-            b->last = dst;[m
[31m-[m
[31m-            size = buf->last - src;[m
[31m-            size = len + size / 2 + size / 2 * ctx->length;[m
[31m-[m
[31m-            cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-            if (cl == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-            dst = b->pos;[m
[31m-        }[m
[31m-[m
[31m-        while (len) {[m
[31m-            *dst++ = *p++;[m
[31m-            len--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->last = dst;[m
[31m-[m
[31m-    b->last_buf = buf->last_buf;[m
[31m-    b->last_in_chain = buf->last_in_chain;[m
[31m-    b->flush = buf->flush;[m
[31m-[m
[31m-    b->shadow = buf;[m
[31m-[m
[31m-    return out;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_charset_get_buf(ngx_pool_t *pool, ngx_http_charset_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = ctx->free_bufs;[m
[31m-[m
[31m-    if (cl) {[m
[31m-        ctx->free_bufs = cl->next;[m
[31m-[m
[31m-        cl->buf->shadow = NULL;[m
[31m-        cl->next = NULL;[m
[31m-[m
[31m-        return cl;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ngx_calloc_buf(pool);[m
[31m-    if (cl->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    cl->buf->tag = (ngx_buf_tag_t) &ngx_http_charset_filter_module;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_charset_get_buffer(ngx_pool_t *pool, ngx_http_charset_ctx_t *ctx,[m
[31m-    size_t size)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl, **ll;[m
[31m-[m
[31m-    for (ll = &ctx->free_buffers, cl = ctx->free_buffers;[m
[31m-         cl;[m
[31m-         ll = &cl->next, cl = cl->next)[m
[31m-    {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if ((size_t) (b->end - b->start) >= size) {[m
[31m-            *ll = cl->next;[m
[31m-            cl->next = NULL;[m
[31m-[m
[31m-            b->pos = b->start;[m
[31m-            b->temporary = 1;[m
[31m-            b->shadow = NULL;[m
[31m-[m
[31m-            return cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ngx_create_temp_buf(pool, size);[m
[31m-    if (cl->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    cl->buf->temporary = 1;[m
[31m-    cl->buf->tag = (ngx_buf_tag_t) &ngx_http_charset_filter_module;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_charset_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_charset_main_conf_t  *mcf = conf;[m
[31m-[m
[31m-    char                         *rv;[m
[31m-    u_char                       *p, *dst2src, **pp;[m
[31m-    ngx_int_t                     src, dst;[m
[31m-    ngx_uint_t                    i, n;[m
[31m-    ngx_str_t                    *value;[m
[31m-    ngx_conf_t                    pvcf;[m
[31m-    ngx_http_charset_t           *charset;[m
[31m-    ngx_http_charset_tables_t    *table;[m
[31m-    ngx_http_charset_conf_ctx_t   ctx;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    src = ngx_http_add_charset(&mcf->charsets, &value[1]);[m
[31m-    if (src == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dst = ngx_http_add_charset(&mcf->charsets, &value[2]);[m
[31m-    if (dst == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (src == dst) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"charset_map\" between the same charsets "[m
[31m-                           "\"%V\" and \"%V\"", &value[1], &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    table = mcf->tables.elts;[m
[31m-    for (i = 0; i < mcf->tables.nelts; i++) {[m
[31m-        if ((src == table->src && dst == table->dst)[m
[31m-             || (src == table->dst && dst == table->src))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate \"charset_map\" between "[m
[31m-                               "\"%V\" and \"%V\"", &value[1], &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    table = ngx_array_push(&mcf->tables);[m
[31m-    if (table == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    table->src = src;[m
[31m-    table->dst = dst;[m
[31m-[m
[31m-    if (ngx_strcasecmp(value[2].data, (u_char *) "utf-8") == 0) {[m
[31m-        table->src2dst = ngx_pcalloc(cf->pool, 256 * NGX_UTF_LEN);[m
[31m-        if (table->src2dst == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        table->dst2src = ngx_pcalloc(cf->pool, 256 * sizeof(void *));[m
[31m-        if (table->dst2src == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dst2src = ngx_pcalloc(cf->pool, 256);[m
[31m-        if (dst2src == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pp = (u_char **) &table->dst2src[0];[m
[31m-        pp[0] = dst2src;[m
[31m-[m
[31m-        for (i = 0; i < 128; i++) {[m
[31m-            p = &table->src2dst[i * NGX_UTF_LEN];[m
[31m-            p[0] = '\1';[m
[31m-            p[1] = (u_char) i;[m
[31m-            dst2src[i] = (u_char) i;[m
[31m-        }[m
[31m-[m
[31m-        for (/* void */; i < 256; i++) {[m
[31m-            p = &table->src2dst[i * NGX_UTF_LEN];[m
[31m-            p[0] = '\1';[m
[31m-            p[1] = '?';[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        table->src2dst = ngx_palloc(cf->pool, 256);[m
[31m-        if (table->src2dst == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        table->dst2src = ngx_palloc(cf->pool, 256);[m
[31m-        if (table->dst2src == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < 128; i++) {[m
[31m-            table->src2dst[i] = (u_char) i;[m
[31m-            table->dst2src[i] = (u_char) i;[m
[31m-        }[m
[31m-[m
[31m-        for (/* void */; i < 256; i++) {[m
[31m-            table->src2dst[i] = '?';[m
[31m-            table->dst2src[i] = '?';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    charset = mcf->charsets.elts;[m
[31m-[m
[31m-    ctx.table = table;[m
[31m-    ctx.charset = &charset[dst];[m
[31m-    ctx.characters = 0;[m
[31m-[m
[31m-    pvcf = *cf;[m
[31m-    cf->ctx = &ctx;[m
[31m-    cf->handler = ngx_http_charset_map;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pvcf;[m
[31m-[m
[31m-    if (ctx.characters) {[m
[31m-        n = ctx.charset->length;[m
[31m-        ctx.charset->length /= ctx.characters;[m
[31m-[m
[31m-        if (((n * 10) / ctx.characters) % 10 > 4) {[m
[31m-            ctx.charset->length++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_charset_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    u_char                       *p, *dst2src, **pp;[m
[31m-    uint32_t                      n;[m
[31m-    ngx_int_t                     src, dst;[m
[31m-    ngx_str_t                    *value;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_http_charset_tables_t    *table;[m
[31m-    ngx_http_charset_conf_ctx_t  *ctx;[m
[31m-[m
[31m-    if (cf->args->nelts != 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameters number");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    src = ngx_hextoi(value[0].data, value[0].len);[m
[31m-    if (src == NGX_ERROR || src > 255) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid value \"%V\"", &value[0]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = cf->ctx;[m
[31m-    table = ctx->table;[m
[31m-[m
[31m-    if (ctx->charset->utf8) {[m
[31m-        p = &table->src2dst[src * NGX_UTF_LEN];[m
[31m-[m
[31m-        *p++ = (u_char) (value[1].len / 2);[m
[31m-[m
[31m-        for (i = 0; i < value[1].len; i += 2) {[m
[31m-            dst = ngx_hextoi(&value[1].data[i], 2);[m
[31m-            if (dst == NGX_ERROR || dst > 255) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid value \"%V\"", &value[1]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *p++ = (u_char) dst;[m
[31m-        }[m
[31m-[m
[31m-        i /= 2;[m
[31m-[m
[31m-        ctx->charset->length += i;[m
[31m-        ctx->characters++;[m
[31m-[m
[31m-        p = &table->src2dst[src * NGX_UTF_LEN] + 1;[m
[31m-[m
[31m-        n = ngx_utf8_decode(&p, i);[m
[31m-[m
[31m-        if (n > 0xffff) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pp = (u_char **) &table->dst2src[0];[m
[31m-[m
[31m-        dst2src = pp[n >> 8];[m
[31m-[m
[31m-        if (dst2src == NULL) {[m
[31m-            dst2src = ngx_pcalloc(cf->pool, 256);[m
[31m-            if (dst2src == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pp[n >> 8] = dst2src;[m
[31m-        }[m
[31m-[m
[31m-        dst2src[n & 0xff] = (u_char) src;[m
[31m-[m
[31m-    } else {[m
[31m-        dst = ngx_hextoi(value[1].data, value[1].len);[m
[31m-        if (dst == NGX_ERROR || dst > 255) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        table->src2dst[src] = (u_char) dst;[m
[31m-        table->dst2src[dst] = (u_char) src;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_charset_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t                     *cp;[m
[31m-    ngx_str_t                     *value, var;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    cp = (ngx_int_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*cp != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cmd->offset == offsetof(ngx_http_charset_loc_conf_t, charset)[m
[31m-        && ngx_strcmp(value[1].data, "off") == 0)[m
[31m-    {[m
[31m-        *cp = NGX_HTTP_CHARSET_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (value[1].data[0] == '$') {[m
[31m-        var.len = value[1].len - 1;[m
[31m-        var.data = value[1].data + 1;[m
[31m-[m
[31m-        *cp = ngx_http_get_variable_index(cf, &var);[m
[31m-[m
[31m-        if (*cp == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *cp += NGX_HTTP_CHARSET_VAR;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    mcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                             ngx_http_charset_filter_module);[m
[31m-[m
[31m-    *cp = ngx_http_add_charset(&mcf->charsets, &value[1]);[m
[31m-    if (*cp == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_charset(ngx_array_t *charsets, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_http_charset_t  *c;[m
[31m-[m
[31m-    c = charsets->elts;[m
[31m-    for (i = 0; i < charsets->nelts; i++) {[m
[31m-        if (name->len != c[i].name.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcasecmp(name->data, c[i].name.data) == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (i < charsets->nelts) {[m
[31m-        return i;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_array_push(charsets);[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->tables = NULL;[m
[31m-    c->name = *name;[m
[31m-    c->length = 0;[m
[31m-[m
[31m-    if (ngx_strcasecmp(name->data, (u_char *) "utf-8") == 0) {[m
[31m-        c->utf8 = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        c->utf8 = 0;[m
[31m-    }[m
[31m-[m
[31m-    return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_charset_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_charset_main_conf_t));[m
[31m-    if (mcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&mcf->charsets, cf->pool, 2, sizeof(ngx_http_charset_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&mcf->tables, cf->pool, 1,[m
[31m-                       sizeof(ngx_http_charset_tables_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&mcf->recodes, cf->pool, 2,[m
[31m-                       sizeof(ngx_http_charset_recode_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return mcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_charset_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_charset_loc_conf_t  *lcf;[m
[31m-[m
[31m-    lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_charset_loc_conf_t));[m
[31m-    if (lcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     lcf->types = { NULL };[m
[31m-     *     lcf->types_keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-    lcf->charset = NGX_CONF_UNSET;[m
[31m-    lcf->source_charset = NGX_CONF_UNSET;[m
[31m-    lcf->override_charset = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return lcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_charset_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_charset_loc_conf_t *prev = parent;[m
[31m-    ngx_http_charset_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_http_charset_recode_t     *recode;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_charset_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->override_charset, prev->override_charset, 0);[m
[31m-    ngx_conf_merge_value(conf->charset, prev->charset, NGX_HTTP_CHARSET_OFF);[m
[31m-    ngx_conf_merge_value(conf->source_charset, prev->source_charset,[m
[31m-                         NGX_HTTP_CHARSET_OFF);[m
[31m-[m
[31m-    if (conf->charset == NGX_HTTP_CHARSET_OFF[m
[31m-        || conf->source_charset == NGX_HTTP_CHARSET_OFF[m
[31m-        || conf->charset == conf->source_charset)[m
[31m-    {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->source_charset >= NGX_HTTP_CHARSET_VAR[m
[31m-        || conf->charset >= NGX_HTTP_CHARSET_VAR)[m
[31m-    {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    mcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                             ngx_http_charset_filter_module);[m
[31m-    recode = mcf->recodes.elts;[m
[31m-    for (i = 0; i < mcf->recodes.nelts; i++) {[m
[31m-        if (conf->source_charset == recode[i].src[m
[31m-            && conf->charset == recode[i].dst)[m
[31m-        {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    recode = ngx_array_push(&mcf->recodes);[m
[31m-    if (recode == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    recode->src = conf->source_charset;[m
[31m-    recode->dst = conf->charset;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_charset_postconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    u_char                       **src, **dst;[m
[31m-    ngx_int_t                      c;[m
[31m-    ngx_uint_t                     i, t;[m
[31m-    ngx_http_charset_t            *charset;[m
[31m-    ngx_http_charset_recode_t     *recode;[m
[31m-    ngx_http_charset_tables_t     *tables;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    mcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                             ngx_http_charset_filter_module);[m
[31m-[m
[31m-    recode = mcf->recodes.elts;[m
[31m-    tables = mcf->tables.elts;[m
[31m-    charset = mcf->charsets.elts;[m
[31m-[m
[31m-    for (i = 0; i < mcf->recodes.nelts; i++) {[m
[31m-[m
[31m-        c = recode[i].src;[m
[31m-[m
[31m-        for (t = 0; t < mcf->tables.nelts; t++) {[m
[31m-[m
[31m-            if (c == tables[t].src && recode[i].dst == tables[t].dst) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (c == tables[t].dst && recode[i].dst == tables[t].src) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                   "no \"charset_map\" between the charsets \"%V\" and \"%V\"",[m
[31m-                   &charset[c].name, &charset[recode[i].dst].name);[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (t = 0; t < mcf->tables.nelts; t++) {[m
[31m-[m
[31m-        src = charset[tables[t].src].tables;[m
[31m-[m
[31m-        if (src == NULL) {[m
[31m-            src = ngx_pcalloc(cf->pool, sizeof(u_char *) * mcf->charsets.nelts);[m
[31m-            if (src == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            charset[tables[t].src].tables = src;[m
[31m-        }[m
[31m-[m
[31m-        dst = charset[tables[t].dst].tables;[m
[31m-[m
[31m-        if (dst == NULL) {[m
[31m-            dst = ngx_pcalloc(cf->pool, sizeof(u_char *) * mcf->charsets.nelts);[m
[31m-            if (dst == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            charset[tables[t].dst].tables = dst;[m
[31m-        }[m
[31m-[m
[31m-        src[tables[t].dst] = tables[t].src2dst;[m
[31m-        dst[tables[t].src] = tables[t].dst2src;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_charset_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_charset_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_chunked_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_chunked_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex ac2e3e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_chunked_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,243 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t         *free;[m
[31m-    ngx_chain_t         *busy;[m
[31m-} ngx_http_chunked_filter_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_chunked_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_chunked_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_chunked_filter_init,          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_chunked_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_chunked_filter_module_ctx,   /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_chunked_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_http_chunked_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED[m
[31m-        || r->headers_out.status == NGX_HTTP_NO_CONTENT[m
[31m-        || r->headers_out.status < NGX_HTTP_OK[m
[31m-        || r != r->main[m
[31m-        || r->method == NGX_HTTP_HEAD)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length_n == -1) {[m
[31m-        if (r->http_version < NGX_HTTP_VERSION_11) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            if (clcf->chunked_transfer_encoding) {[m
[31m-                r->chunked = 1;[m
[31m-[m
[31m-                ctx = ngx_pcalloc(r->pool,[m
[31m-                                  sizeof(ngx_http_chunked_filter_ctx_t));[m
[31m-                if (ctx == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_set_ctx(r, ctx, ngx_http_chunked_filter_module);[m
[31m-[m
[31m-            } else {[m
[31m-                r->keepalive = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_chunked_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    u_char                         *chunk;[m
[31m-    off_t                           size;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *out, *cl, *tl, **ll;[m
[31m-    ngx_http_chunked_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    if (in == NULL || !r->chunked || r->header_only) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_chunked_filter_module);[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    size = 0;[m
[31m-    cl = in;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http chunk: %O", ngx_buf_size(cl->buf));[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush[m
[31m-            || cl->buf->sync[m
[31m-            || ngx_buf_in_memory(cl->buf)[m
[31m-            || cl->buf->in_file)[m
[31m-        {[m
[31m-            tl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            tl->buf = cl->buf;[m
[31m-            *ll = tl;[m
[31m-            ll = &tl->next;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-        chunk = b->start;[m
[31m-[m
[31m-        if (chunk == NULL) {[m
[31m-            /* the "0000000000000000" is 64-bit hexadecimal string */[m
[31m-[m
[31m-            chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1);[m
[31m-            if (chunk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = chunk;[m
[31m-            b->end = chunk + sizeof("0000000000000000" CRLF) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;[m
[31m-        b->memory = 0;[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = chunk;[m
[31m-        b->last = ngx_sprintf(chunk, "%xO" CRLF, size);[m
[31m-[m
[31m-        tl->next = out;[m
[31m-        out = tl;[m
[31m-    }[m
[31m-[m
[31m-    if (cl->buf->last_buf) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->last_buf = 1;[m
[31m-        b->pos = (u_char *) CRLF "0" CRLF CRLF;[m
[31m-        b->last = b->pos + 7;[m
[31m-[m
[31m-        cl->buf->last_buf = 0;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            b->pos += 2;[m
[31m-        }[m
[31m-[m
[31m-    } else if (size > 0) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->pos = (u_char *) CRLF;[m
[31m-        b->last = b->pos + 2;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-    } else {[m
[31m-        *ll = NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_chunked_filter_module);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_chunked_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_chunked_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_chunked_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_dav_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_dav_module.c[m
[1mdeleted file mode 100644[m
[1mindex 3600265..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_dav_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1156 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_DAV_OFF             2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_DAV_NO_DEPTH        -3[m
[31m-#define NGX_HTTP_DAV_INVALID_DEPTH   -2[m
[31m-#define NGX_HTTP_DAV_INFINITY_DEPTH  -1[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  methods;[m
[31m-    ngx_uint_t  access;[m
[31m-    ngx_uint_t  min_delete_depth;[m
[31m-    ngx_flag_t  create_full_put_path;[m
[31m-} ngx_http_dav_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t   path;[m
[31m-    size_t      len;[m
[31m-} ngx_http_dav_copy_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-static void ngx_http_dav_put_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_delete_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_dav_delete_path(ngx_http_request_t *r,[m
[31m-    ngx_str_t *path, ngx_uint_t dir);[m
[31m-static ngx_int_t ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_dav_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_dav_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path);[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_mkcol_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_dav_loc_conf_t *dlcf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_copy_move_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt);[m
[31m-static ngx_int_t ngx_http_dav_error(ngx_log_t *log, ngx_err_t err,[m
[31m-    ngx_int_t not_found, char *failed, u_char *path);[m
[31m-static ngx_int_t ngx_http_dav_location(ngx_http_request_t *r, u_char *path);[m
[31m-static void *ngx_http_dav_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_dav_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_dav_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_dav_methods_mask[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_DAV_OFF },[m
[31m-    { ngx_string("put"), NGX_HTTP_PUT },[m
[31m-    { ngx_string("delete"), NGX_HTTP_DELETE },[m
[31m-    { ngx_string("mkcol"), NGX_HTTP_MKCOL },[m
[31m-    { ngx_string("copy"), NGX_HTTP_COPY },[m
[31m-    { ngx_string("move"), NGX_HTTP_MOVE },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_dav_commands[] = {[m
[31m-[m
[31m-    { ngx_string("dav_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_dav_loc_conf_t, methods),[m
[31m-      &ngx_http_dav_methods_mask },[m
[31m-[m
[31m-    { ngx_string("create_full_put_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_dav_loc_conf_t, create_full_put_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("min_delete_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_dav_loc_conf_t, min_delete_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("dav_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_dav_loc_conf_t, access),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_dav_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_dav_init,                     /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_dav_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_dav_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_dav_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_dav_module_ctx,              /* module context */[m
[31m-    ngx_http_dav_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_http_dav_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-    if (!(r->method & dlcf->methods)) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    switch (r->method) {[m
[31m-[m
[31m-    case NGX_HTTP_PUT:[m
[31m-[m
[31m-        if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "cannot PUT to a collection");[m
[31m-            return NGX_HTTP_CONFLICT;[m
[31m-        }[m
[31m-[m
[31m-        r->request_body_in_file_only = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file = 1;[m
[31m-        r->request_body_file_group_access = 1;[m
[31m-        r->request_body_file_log_level = 0;[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r, ngx_http_dav_put_handler);[m
[31m-[m
[31m-        if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-[m
[31m-    case NGX_HTTP_DELETE:[m
[31m-[m
[31m-        return ngx_http_dav_delete_handler(r);[m
[31m-[m
[31m-    case NGX_HTTP_MKCOL:[m
[31m-[m
[31m-        return ngx_http_dav_mkcol_handler(r, dlcf);[m
[31m-[m
[31m-    case NGX_HTTP_COPY:[m
[31m-[m
[31m-        return ngx_http_dav_copy_move_handler(r);[m
[31m-[m
[31m-    case NGX_HTTP_MOVE:[m
[31m-[m
[31m-        return ngx_http_dav_copy_move_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_dav_put_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                    root;[m
[31m-    time_t                    date;[m
[31m-    ngx_str_t                *temp, path;[m
[31m-    ngx_uint_t                status;[m
[31m-    ngx_file_info_t           fi;[m
[31m-    ngx_ext_rename_file_t     ext;[m
[31m-    ngx_http_dav_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    if (r->request_body == NULL || r->request_body->temp_file == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    path.len--;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http put filename: \"%s\"", path.data);[m
[31m-[m
[31m-    temp = &r->request_body->temp_file->file.name;[m
[31m-[m
[31m-    if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) {[m
[31m-        status = NGX_HTTP_CREATED;[m
[31m-[m
[31m-    } else {[m
[31m-        status = NGX_HTTP_NO_CONTENT;[m
[31m-[m
[31m-        if (ngx_is_dir(&fi)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR,[m
[31m-                          "\"%s\" could not be created", path.data);[m
[31m-[m
[31m-            if (ngx_delete_file(temp->data) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                              ngx_delete_file_n " \"%s\" failed",[m
[31m-                              temp->data);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_CONFLICT);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-    ext.access = dlcf->access;[m
[31m-    ext.path_access = dlcf->access;[m
[31m-    ext.time = -1;[m
[31m-    ext.create_path = dlcf->create_full_put_path;[m
[31m-    ext.delete_file = 1;[m
[31m-    ext.log = r->connection->log;[m
[31m-[m
[31m-    if (r->headers_in.date) {[m
[31m-        date = ngx_parse_http_time(r->headers_in.date->value.data,[m
[31m-                                   r->headers_in.date->value.len);[m
[31m-[m
[31m-        if (date != NGX_ERROR) {[m
[31m-            ext.time = date;[m
[31m-            ext.fd = r->request_body->temp_file->file.fd;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ext_rename_file(temp, &path, &ext) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (status == NGX_HTTP_CREATED) {[m
[31m-        if (ngx_http_dav_location(r, path.data) != NGX_OK) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_length_n = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = status;[m
[31m-    r->header_only = 1;[m
[31m-[m
[31m-    ngx_http_finalize_request(r, ngx_http_send_header(r));[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_delete_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                    root;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_int_t                 rc, depth;[m
[31m-    ngx_uint_t                i, d, dir;[m
[31m-    ngx_str_t                 path;[m
[31m-    ngx_file_info_t           fi;[m
[31m-    ngx_http_dav_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n > 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "DELETE with body is unsupported");[m
[31m-        return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;[m
[31m-    }[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-    if (dlcf->min_delete_depth) {[m
[31m-        d = 0;[m
[31m-[m
[31m-        for (i = 0; i < r->uri.len; /* void */) {[m
[31m-            if (r->uri.data[i++] == '/') {[m
[31m-                if (++d >= dlcf->min_delete_depth && i < r->uri.len) {[m
[31m-                    goto ok;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "insufficient URI depth:%i to DELETE", d);[m
[31m-        return NGX_HTTP_CONFLICT;[m
[31m-    }[m
[31m-[m
[31m-ok:[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http delete filename: \"%s\"", path.data);[m
[31m-[m
[31m-    if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        rc = (err == NGX_ENOTDIR) ? NGX_HTTP_CONFLICT : NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-        return ngx_http_dav_error(r->connection->log, err,[m
[31m-                                  rc, ngx_link_info_n, path.data);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-[m
[31m-        if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR,[m
[31m-                          "DELETE \"%s\" failed", path.data);[m
[31m-            return NGX_HTTP_CONFLICT;[m
[31m-        }[m
[31m-[m
[31m-        depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH);[m
[31m-[m
[31m-        if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"Depth\" header must be infinity");[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        path.len -= 2;  /* omit "/\0" */[m
[31m-[m
[31m-        dir = 1;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /*[m
[31m-         * we do not need to test (r->uri.data[r->uri.len - 1] == '/')[m
[31m-         * because ngx_link_info("/file/") returned NGX_ENOTDIR above[m
[31m-         */[m
[31m-[m
[31m-        depth = ngx_http_dav_depth(r, 0);[m
[31m-[m
[31m-        if (depth != 0 && depth != NGX_HTTP_DAV_INFINITY_DEPTH) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"Depth\" header must be 0 or infinity");[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        dir = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_dav_delete_path(r, &path, dir);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return NGX_HTTP_NO_CONTENT;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_delete_path(ngx_http_request_t *r, ngx_str_t *path, ngx_uint_t dir)[m
[31m-{[m
[31m-    char            *failed;[m
[31m-    ngx_tree_ctx_t   tree;[m
[31m-[m
[31m-    if (dir) {[m
[31m-[m
[31m-        tree.init_handler = NULL;[m
[31m-        tree.file_handler = ngx_http_dav_delete_file;[m
[31m-        tree.pre_tree_handler = ngx_http_dav_noop;[m
[31m-        tree.post_tree_handler = ngx_http_dav_delete_dir;[m
[31m-        tree.spec_handler = ngx_http_dav_delete_file;[m
[31m-        tree.data = NULL;[m
[31m-        tree.alloc = 0;[m
[31m-        tree.log = r->connection->log;[m
[31m-[m
[31m-        /* TODO: 207 */[m
[31m-[m
[31m-        if (ngx_walk_tree(&tree, path) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_delete_dir(path->data) != NGX_FILE_ERROR) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        failed = ngx_delete_dir_n;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (ngx_delete_file(path->data) != NGX_FILE_ERROR) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        failed = ngx_delete_file_n;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_dav_error(r->connection->log, ngx_errno,[m
[31m-                              NGX_HTTP_NOT_FOUND, failed, path->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http delete dir: \"%s\"", path->data);[m
[31m-[m
[31m-    if (ngx_delete_dir(path->data) == NGX_FILE_ERROR) {[m
[31m-[m
[31m-        /* TODO: add to 207 */[m
[31m-[m
[31m-        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_dir_n,[m
[31m-                                  path->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http delete file: \"%s\"", path->data);[m
[31m-[m
[31m-    if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {[m
[31m-[m
[31m-        /* TODO: add to 207 */[m
[31m-[m
[31m-        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_file_n,[m
[31m-                                  path->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_mkcol_handler(ngx_http_request_t *r, ngx_http_dav_loc_conf_t *dlcf)[m
[31m-{[m
[31m-    u_char    *p;[m
[31m-    size_t     root;[m
[31m-    ngx_str_t  path;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n > 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "MKCOL with body is unsupported");[m
[31m-        return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "MKCOL can create a collection only");[m
[31m-        return NGX_HTTP_CONFLICT;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_http_map_uri_to_path(r, &path, &root, 0);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(p - 1) = '\0';[m
[31m-    r->uri.len--;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http mkcol path: \"%s\"", path.data);[m
[31m-[m
[31m-    if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access))[m
[31m-        != NGX_FILE_ERROR)[m
[31m-    {[m
[31m-        if (ngx_http_dav_location(r, path.data) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_CREATED;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_dav_error(r->connection->log, ngx_errno,[m
[31m-                              NGX_HTTP_CONFLICT, ngx_create_dir_n, path.data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_copy_move_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                   *p, *host, *last, ch;[m
[31m-    size_t                    len, root;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_int_t                 rc, depth;[m
[31m-    ngx_uint_t                overwrite, slash, dir, flags;[m
[31m-    ngx_str_t                 path, uri, duri, args;[m
[31m-    ngx_tree_ctx_t            tree;[m
[31m-    ngx_copy_file_t           cf;[m
[31m-    ngx_file_info_t           fi;[m
[31m-    ngx_table_elt_t          *dest, *over;[m
[31m-    ngx_ext_rename_file_t     ext;[m
[31m-    ngx_http_dav_copy_ctx_t   copy;[m
[31m-    ngx_http_dav_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n > 0) {[m
[31m-        return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;[m
[31m-    }[m
[31m-[m
[31m-    dest = r->headers_in.destination;[m
[31m-[m
[31m-    if (dest == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent no \"Destination\" header");[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    p = dest->value.data;[m
[31m-    /* there is always '\0' even after empty header value */[m
[31m-    if (p[0] == '/') {[m
[31m-        last = p + dest->value.len;[m
[31m-        goto destination_done;[m
[31m-    }[m
[31m-[m
[31m-    len = r->headers_in.server.len;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent no \"Host\" header");[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-        if (ngx_strncmp(dest->value.data, "https://", sizeof("https://") - 1)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            goto invalid_destination;[m
[31m-        }[m
[31m-[m
[31m-        host = dest->value.data + sizeof("https://") - 1;[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        if (ngx_strncmp(dest->value.data, "http://", sizeof("http://") - 1)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            goto invalid_destination;[m
[31m-        }[m
[31m-[m
[31m-        host = dest->value.data + sizeof("http://") - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncmp(host, r->headers_in.server.data, len) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "\"Destination\" URI \"%V\" is handled by "[m
[31m-                      "different repository than the source URI",[m
[31m-                      &dest->value);[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    last = dest->value.data + dest->value.len;[m
[31m-[m
[31m-    for (p = host + len; p < last; p++) {[m
[31m-        if (*p == '/') {[m
[31m-            goto destination_done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-invalid_destination:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "client sent invalid \"Destination\" header: \"%V\"",[m
[31m-                  &dest->value);[m
[31m-    return NGX_HTTP_BAD_REQUEST;[m
[31m-[m
[31m-destination_done:[m
[31m-[m
[31m-    duri.len = last - p;[m
[31m-    duri.data = p;[m
[31m-    flags = NGX_HTTP_LOG_UNSAFE;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &duri, &args, &flags) != NGX_OK) {[m
[31m-        goto invalid_destination;[m
[31m-    }[m
[31m-[m
[31m-    if ((r->uri.data[r->uri.len - 1] == '/' && *(last - 1) != '/')[m
[31m-        || (r->uri.data[r->uri.len - 1] != '/' && *(last - 1) == '/'))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "both URI \"%V\" and \"Destination\" URI \"%V\" "[m
[31m-                      "should be either collections or non-collections",[m
[31m-                      &r->uri, &dest->value);[m
[31m-        return NGX_HTTP_CONFLICT;[m
[31m-    }[m
[31m-[m
[31m-    depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH);[m
[31m-[m
[31m-    if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) {[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_COPY) {[m
[31m-            if (depth != 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "\"Depth\" header must be 0 or infinity");[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"Depth\" header must be infinity");[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    over = r->headers_in.overwrite;[m
[31m-[m
[31m-    if (over) {[m
[31m-        if (over->value.len == 1) {[m
[31m-            ch = over->value.data[0];[m
[31m-[m
[31m-            if (ch == 'T' || ch == 't') {[m
[31m-                overwrite = 1;[m
[31m-                goto overwrite_done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == 'F' || ch == 'f') {[m
[31m-                overwrite = 0;[m
[31m-                goto overwrite_done;[m
[31m-            }[m
[31m-[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent invalid \"Overwrite\" header: \"%V\"",[m
[31m-                      &over->value);[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    overwrite = 1;[m
[31m-[m
[31m-overwrite_done:[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http copy from: \"%s\"", path.data);[m
[31m-[m
[31m-    uri = r->uri;[m
[31m-    r->uri = duri;[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &copy.path, &root, 0) == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->uri = uri;[m
[31m-[m
[31m-    copy.path.len--;  /* omit "\0" */[m
[31m-[m
[31m-    if (copy.path.data[copy.path.len - 1] == '/') {[m
[31m-        slash = 1;[m
[31m-        copy.path.len--;[m
[31m-        copy.path.data[copy.path.len] = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        slash = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http copy to: \"%s\"", copy.path.data);[m
[31m-[m
[31m-    if (ngx_link_info(copy.path.data, &fi) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-            return ngx_http_dav_error(r->connection->log, err,[m
[31m-                                      NGX_HTTP_NOT_FOUND, ngx_link_info_n,[m
[31m-                                      copy.path.data);[m
[31m-        }[m
[31m-[m
[31m-        /* destination does not exist */[m
[31m-[m
[31m-        overwrite = 0;[m
[31m-        dir = 0;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* destination exists */[m
[31m-[m
[31m-        if (ngx_is_dir(&fi) && !slash) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"%V\" could not be %Ved to collection \"%V\"",[m
[31m-                          &r->uri, &r->method_name, &dest->value);[m
[31m-            return NGX_HTTP_CONFLICT;[m
[31m-        }[m
[31m-[m
[31m-        if (!overwrite) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EEXIST,[m
[31m-                          "\"%s\" could not be created", copy.path.data);[m
[31m-            return NGX_HTTP_PRECONDITION_FAILED;[m
[31m-        }[m
[31m-[m
[31m-        dir = ngx_is_dir(&fi);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {[m
[31m-        return ngx_http_dav_error(r->connection->log, ngx_errno,[m
[31m-                                  NGX_HTTP_NOT_FOUND, ngx_link_info_n,[m
[31m-                                  path.data);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-[m
[31m-        if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"%V\" is collection", &r->uri);[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        if (overwrite) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http delete: \"%s\"", copy.path.data);[m
[31m-[m
[31m-            rc = ngx_http_dav_delete_path(r, &copy.path, dir);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-[m
[31m-        path.len -= 2;  /* omit "/\0" */[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_MOVE) {[m
[31m-            if (ngx_rename_file(path.data, copy.path.data) != NGX_FILE_ERROR) {[m
[31m-                return NGX_HTTP_CREATED;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_create_dir(copy.path.data, ngx_file_access(&fi))[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_dav_error(r->connection->log, ngx_errno,[m
[31m-                                      NGX_HTTP_NOT_FOUND,[m
[31m-                                      ngx_create_dir_n, copy.path.data);[m
[31m-        }[m
[31m-[m
[31m-        copy.len = path.len;[m
[31m-[m
[31m-        tree.init_handler = NULL;[m
[31m-        tree.file_handler = ngx_http_dav_copy_tree_file;[m
[31m-        tree.pre_tree_handler = ngx_http_dav_copy_dir;[m
[31m-        tree.post_tree_handler = ngx_http_dav_copy_dir_time;[m
[31m-        tree.spec_handler = ngx_http_dav_noop;[m
[31m-        tree.data = &copy;[m
[31m-        tree.alloc = 0;[m
[31m-        tree.log = r->connection->log;[m
[31m-[m
[31m-        if (ngx_walk_tree(&tree, &path) == NGX_OK) {[m
[31m-[m
[31m-            if (r->method == NGX_HTTP_MOVE) {[m
[31m-                rc = ngx_http_dav_delete_path(r, &path, 1);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_CREATED;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_MOVE) {[m
[31m-[m
[31m-            dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-            ext.access = 0;[m
[31m-            ext.path_access = dlcf->access;[m
[31m-            ext.time = -1;[m
[31m-            ext.create_path = 1;[m
[31m-            ext.delete_file = 0;[m
[31m-            ext.log = r->connection->log;[m
[31m-[m
[31m-            if (ngx_ext_rename_file(&path, &copy.path, &ext) == NGX_OK) {[m
[31m-                return NGX_HTTP_NO_CONTENT;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-        cf.size = ngx_file_size(&fi);[m
[31m-        cf.buf_size = 0;[m
[31m-        cf.access = dlcf->access;[m
[31m-        cf.time = ngx_file_mtime(&fi);[m
[31m-        cf.log = r->connection->log;[m
[31m-[m
[31m-        if (ngx_copy_file(path.data, copy.path.data, &cf) == NGX_OK) {[m
[31m-            return NGX_HTTP_NO_CONTENT;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    u_char                   *p, *dir;[m
[31m-    size_t                    len;[m
[31m-    ngx_http_dav_copy_ctx_t  *copy;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy dir: \"%s\"", path->data);[m
[31m-[m
[31m-    copy = ctx->data;[m
[31m-[m
[31m-    len = copy->path.len + path->len;[m
[31m-[m
[31m-    dir = ngx_alloc(len + 1, ctx->log);[m
[31m-    if (dir == NULL) {[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(dir, copy->path.data, copy->path.len);[m
[31m-    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy dir to: \"%s\"", dir);[m
[31m-[m
[31m-    if (ngx_create_dir(dir, ngx_dir_access(ctx->access)) == NGX_FILE_ERROR) {[m
[31m-        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_create_dir_n,[m
[31m-                                  dir);[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(dir);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    u_char                   *p, *dir;[m
[31m-    size_t                    len;[m
[31m-    ngx_http_dav_copy_ctx_t  *copy;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy dir time: \"%s\"", path->data);[m
[31m-[m
[31m-    copy = ctx->data;[m
[31m-[m
[31m-    len = copy->path.len + path->len;[m
[31m-[m
[31m-    dir = ngx_alloc(len + 1, ctx->log);[m
[31m-    if (dir == NULL) {[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(dir, copy->path.data, copy->path.len);[m
[31m-    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy dir time to: \"%s\"", dir);[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    {[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    fd = ngx_open_file(dir, NGX_FILE_RDWR, NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_open_file_n, dir);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_set_file_time(NULL, fd, ctx->mtime) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,[m
[31m-                      ngx_set_file_time_n " \"%s\" failed", dir);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", dir);[m
[31m-    }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (ngx_set_file_time(dir, 0, ctx->mtime) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,[m
[31m-                      ngx_set_file_time_n " \"%s\" failed", dir);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_free(dir);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    u_char                   *p, *file;[m
[31m-    size_t                    len;[m
[31m-    ngx_copy_file_t           cf;[m
[31m-    ngx_http_dav_copy_ctx_t  *copy;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy file: \"%s\"", path->data);[m
[31m-[m
[31m-    copy = ctx->data;[m
[31m-[m
[31m-    len = copy->path.len + path->len;[m
[31m-[m
[31m-    file = ngx_alloc(len + 1, ctx->log);[m
[31m-    if (file == NULL) {[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(file, copy->path.data, copy->path.len);[m
[31m-    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy file to: \"%s\"", file);[m
[31m-[m
[31m-    cf.size = ctx->size;[m
[31m-    cf.buf_size = 0;[m
[31m-    cf.access = ctx->access;[m
[31m-    cf.time = ctx->mtime;[m
[31m-    cf.log = ctx->log;[m
[31m-[m
[31m-    (void) ngx_copy_file(path->data, file, &cf);[m
[31m-[m
[31m-    ngx_free(file);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt)[m
[31m-{[m
[31m-    ngx_table_elt_t  *depth;[m
[31m-[m
[31m-    depth = r->headers_in.depth;[m
[31m-[m
[31m-    if (depth == NULL) {[m
[31m-        return dflt;[m
[31m-    }[m
[31m-[m
[31m-    if (depth->value.len == 1) {[m
[31m-[m
[31m-        if (depth->value.data[0] == '0') {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (depth->value.data[0] == '1') {[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (depth->value.len == sizeof("infinity") - 1[m
[31m-            && ngx_strcmp(depth->value.data, "infinity") == 0)[m
[31m-        {[m
[31m-            return NGX_HTTP_DAV_INFINITY_DEPTH;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "client sent invalid \"Depth\" header: \"%V\"",[m
[31m-                  &depth->value);[m
[31m-[m
[31m-    return NGX_HTTP_DAV_INVALID_DEPTH;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_error(ngx_log_t *log, ngx_err_t err, ngx_int_t not_found,[m
[31m-    char *failed, u_char *path)[m
[31m-{[m
[31m-    ngx_int_t   rc;[m
[31m-    ngx_uint_t  level;[m
[31m-[m
[31m-    if (err == NGX_ENOENT || err == NGX_ENOTDIR || err == NGX_ENAMETOOLONG) {[m
[31m-        level = NGX_LOG_ERR;[m
[31m-        rc = not_found;[m
[31m-[m
[31m-    } else if (err == NGX_EACCES || err == NGX_EPERM) {[m
[31m-        level = NGX_LOG_ERR;[m
[31m-        rc = NGX_HTTP_FORBIDDEN;[m
[31m-[m
[31m-    } else if (err == NGX_EEXIST) {[m
[31m-        level = NGX_LOG_ERR;[m
[31m-        rc = NGX_HTTP_NOT_ALLOWED;[m
[31m-[m
[31m-    } else if (err == NGX_ENOSPC) {[m
[31m-        level = NGX_LOG_CRIT;[m
[31m-        rc = NGX_HTTP_INSUFFICIENT_STORAGE;[m
[31m-[m
[31m-    } else {[m
[31m-        level = NGX_LOG_CRIT;[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, log, err, "%s \"%s\" failed", failed, path);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_location(ngx_http_request_t *r, u_char *path)[m
[31m-{[m
[31m-    u_char                    *location;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));[m
[31m-    if (r->headers_out.location == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!clcf->alias && clcf->root_lengths == NULL) {[m
[31m-        location = path + clcf->root.len;[m
[31m-[m
[31m-    } else {[m
[31m-        location = ngx_pnalloc(r->pool, r->uri.len);[m
[31m-        if (location == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(location, r->uri.data, r->uri.len);[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not need to set the r->headers_out.location->hash and[m
[31m-     * r->headers_out.location->key fields[m
[31m-     */[m
[31m-[m
[31m-    r->headers_out.location->value.len = r->uri.len;[m
[31m-    r->headers_out.location->value.data = location;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_dav_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_dav_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->methods = 0;[m
[31m-     */[m
[31m-[m
[31m-    conf->min_delete_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->create_full_put_path = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_dav_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_dav_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_dav_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->methods, prev->methods,[m
[31m-                         (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_OFF));[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->min_delete_depth,[m
[31m-                         prev->min_delete_depth, 0);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->access, prev->access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->create_full_put_path,[m
[31m-                         prev->create_full_put_path, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_dav_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_degradation_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_degradation_module.c[m
[1mdeleted file mode 100644[m
[1mindex b9c65cd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_degradation_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,243 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t      sbrk_size;[m
[31m-} ngx_http_degradation_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  degrade;[m
[31m-} ngx_http_degradation_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_degrade[] = {[m
[31m-    { ngx_string("204"), 204 },[m
[31m-    { ngx_string("444"), 444 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_degradation_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_degradation_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_degradation_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_degradation(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_degradation_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_degradation_commands[] = {[m
[31m-[m
[31m-    { ngx_string("degradation"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_degradation,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("degrade"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_degradation_loc_conf_t, degrade),[m
[31m-      &ngx_http_degrade },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_degradation_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_degradation_init,             /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_degradation_create_main_conf, /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_degradation_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_http_degradation_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_degradation_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_degradation_module_ctx,      /* module context */[m
[31m-    ngx_http_degradation_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_degradation_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_degradation_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_degradation_module);[m
[31m-[m
[31m-    if (dlcf->degrade && ngx_http_degraded(r)) {[m
[31m-        return dlcf->degrade;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_http_degraded(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                             now;[m
[31m-    ngx_uint_t                         log;[m
[31m-    static size_t                      sbrk_size;[m
[31m-    static time_t                      sbrk_time;[m
[31m-    ngx_http_degradation_main_conf_t  *dmcf;[m
[31m-[m
[31m-    dmcf = ngx_http_get_module_main_conf(r, ngx_http_degradation_module);[m
[31m-[m
[31m-    if (dmcf->sbrk_size) {[m
[31m-[m
[31m-        log = 0;[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        /* lock mutex */[m
[31m-[m
[31m-        if (now != sbrk_time) {[m
[31m-[m
[31m-            /*[m
[31m-             * ELF/i386 is loaded at 0x08000000, 128M[m
[31m-             * ELF/amd64 is loaded at 0x00400000, 4M[m
[31m-             *[m
[31m-             * use a function address to subtract the loading address[m
[31m-             */[m
[31m-[m
[31m-            sbrk_size = (size_t) sbrk(0) - ((uintptr_t) ngx_palloc & ~0x3FFFFF);[m
[31m-            sbrk_time = now;[m
[31m-            log = 1;[m
[31m-        }[m
[31m-[m
[31m-        /* unlock mutex */[m
[31m-[m
[31m-        if (sbrk_size >= dmcf->sbrk_size) {[m
[31m-            if (log) {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                              "degradation sbrk:%uzM",[m
[31m-                              sbrk_size / (1024 * 1024));[m
[31m-            }[m
[31m-[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_degradation_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_degradation_main_conf_t  *dmcf;[m
[31m-[m
[31m-    dmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_degradation_main_conf_t));[m
[31m-    if (dmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return dmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_degradation_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_degradation_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_degradation_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->degrade = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_degradation_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_degradation_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_degradation_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->degrade, prev->degrade, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_degradation(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_degradation_main_conf_t  *dmcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value, s;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "sbrk=", 5) == 0) {[m
[31m-[m
[31m-        s.len = value[1].len - 5;[m
[31m-        s.data = value[1].data + 5;[m
[31m-[m
[31m-        dmcf->sbrk_size = ngx_parse_size(&s);[m
[31m-        if (dmcf->sbrk_size == (size_t) NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid sbrk size \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid parameter \"%V\"", &value[1]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_degradation_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_degradation_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_empty_gif_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_empty_gif_module.c[m
[1mdeleted file mode 100644[m
[1mindex 04114dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_empty_gif_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_empty_gif(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_command_t  ngx_http_empty_gif_commands[] = {[m
[31m-[m
[31m-    { ngx_string("empty_gif"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_empty_gif,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* the minimal single pixel transparent GIF, 43 bytes */[m
[31m-[m
[31m-static u_char  ngx_empty_gif[] = {[m
[31m-[m
[31m-    'G', 'I', 'F', '8', '9', 'a',  /* header                                 */[m
[31m-[m
[31m-                                   /* logical screen descriptor              */[m
[31m-    0x01, 0x00,                    /* logical screen width                   */[m
[31m-    0x01, 0x00,                    /* logical screen height                  */[m
[31m-    0x80,                          /* global 1-bit color table               */[m
[31m-    0x01,                          /* background color #1                    */[m
[31m-    0x00,                          /* no aspect ratio                        */[m
[31m-[m
[31m-                                   /* global color table                     */[m
[31m-    0x00, 0x00, 0x00,              /* #0: black                              */[m
[31m-    0xff, 0xff, 0xff,              /* #1: white                              */[m
[31m-[m
[31m-                                   /* graphic control extension              */[m
[31m-    0x21,                          /* extension introducer                   */[m
[31m-    0xf9,                          /* graphic control label                  */[m
[31m-    0x04,                          /* block size                             */[m
[31m-    0x01,                          /* transparent color is given,            */[m
[31m-                                   /*     no disposal specified,             */[m
[31m-                                   /*     user input is not expected         */[m
[31m-    0x00, 0x00,                    /* delay time                             */[m
[31m-    0x01,                          /* transparent color #1                   */[m
[31m-    0x00,                          /* block terminator                       */[m
[31m-[m
[31m-                                   /* image descriptor                       */[m
[31m-    0x2c,                          /* image separator                        */[m
[31m-    0x00, 0x00,                    /* image left position                    */[m
[31m-    0x00, 0x00,                    /* image top position                     */[m
[31m-    0x01, 0x00,                    /* image width                            */[m
[31m-    0x01, 0x00,                    /* image height                           */[m
[31m-    0x00,                          /* no local color table, no interlaced    */[m
[31m-[m
[31m-                                   /* table based image data                 */[m
[31m-    0x02,                          /* LZW minimum code size,                 */[m
[31m-                                   /*     must be at least 2-bit             */[m
[31m-    0x02,                          /* block size                             */[m
[31m-    0x4c, 0x01,                    /* compressed bytes 01_001_100, 0000000_1 */[m
[31m-                                   /* 100: clear code                        */[m
[31m-                                   /* 001: 1                                 */[m
[31m-                                   /* 101: end of information code           */[m
[31m-    0x00,                          /* block terminator                       */[m
[31m-[m
[31m-    0x3B                           /* trailer                                */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_empty_gif_module_ctx = {[m
[31m-    NULL,                          /* preconfiguration */[m
[31m-    NULL,                          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                          /* create main configuration */[m
[31m-    NULL,                          /* init main configuration */[m
[31m-[m
[31m-    NULL,                          /* create server configuration */[m
[31m-    NULL,                          /* merge server configuration */[m
[31m-[m
[31m-    NULL,                          /* create location configuration */[m
[31m-    NULL                           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_empty_gif_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_empty_gif_module_ctx, /* module context */[m
[31m-    ngx_http_empty_gif_commands,   /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_gif_type = ngx_string("image/gif");[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_empty_gif_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_complex_value_t  cv;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&cv, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    cv.value.len = sizeof(ngx_empty_gif);[m
[31m-    cv.value.data = ngx_empty_gif;[m
[31m-    r->headers_out.last_modified_time = 23349600;[m
[31m-[m
[31m-    return ngx_http_send_response(r, NGX_HTTP_OK, &ngx_http_gif_type, &cv);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_empty_gif(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_empty_gif_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_fastcgi_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_fastcgi_module.c[m
[1mdeleted file mode 100644[m
[1mindex 2d288ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_fastcgi_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,3752 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_fastcgi_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                   *flushes;[m
[31m-    ngx_array_t                   *lengths;[m
[31m-    ngx_array_t                   *values;[m
[31m-    ngx_uint_t                     number;[m
[31m-    ngx_hash_t                     hash;[m
[31m-} ngx_http_fastcgi_params_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t       upstream;[m
[31m-[m
[31m-    ngx_str_t                      index;[m
[31m-[m
[31m-    ngx_http_fastcgi_params_t      params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_fastcgi_params_t      params_cache;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t                   *params_source;[m
[31m-    ngx_array_t                   *catch_stderr;[m
[31m-[m
[31m-    ngx_array_t                   *fastcgi_lengths;[m
[31m-    ngx_array_t                   *fastcgi_values;[m
[31m-[m
[31m-    ngx_flag_t                     keep_conn;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t       cache_key;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_t                   *split_regex;[m
[31m-    ngx_str_t                      split_name;[m
[31m-#endif[m
[31m-} ngx_http_fastcgi_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_fastcgi_st_version = 0,[m
[31m-    ngx_http_fastcgi_st_type,[m
[31m-    ngx_http_fastcgi_st_request_id_hi,[m
[31m-    ngx_http_fastcgi_st_request_id_lo,[m
[31m-    ngx_http_fastcgi_st_content_length_hi,[m
[31m-    ngx_http_fastcgi_st_content_length_lo,[m
[31m-    ngx_http_fastcgi_st_padding_length,[m
[31m-    ngx_http_fastcgi_st_reserved,[m
[31m-    ngx_http_fastcgi_st_data,[m
[31m-    ngx_http_fastcgi_st_padding[m
[31m-} ngx_http_fastcgi_state_e;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                        *start;[m
[31m-    u_char                        *end;[m
[31m-} ngx_http_fastcgi_split_part_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_fastcgi_state_e       state;[m
[31m-    u_char                        *pos;[m
[31m-    u_char                        *last;[m
[31m-    ngx_uint_t                     type;[m
[31m-    size_t                         length;[m
[31m-    size_t                         padding;[m
[31m-[m
[31m-    ngx_chain_t                   *free;[m
[31m-    ngx_chain_t                   *busy;[m
[31m-[m
[31m-    unsigned                       fastcgi_stdout:1;[m
[31m-    unsigned                       large_stderr:1;[m
[31m-    unsigned                       header_sent:1;[m
[31m-[m
[31m-    ngx_array_t                   *split_parts;[m
[31m-[m
[31m-    ngx_str_t                      script_name;[m
[31m-    ngx_str_t                      path_info;[m
[31m-} ngx_http_fastcgi_ctx_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_FASTCGI_RESPONDER      1[m
[31m-[m
[31m-#define NGX_HTTP_FASTCGI_KEEP_CONN      1[m
[31m-[m
[31m-#define NGX_HTTP_FASTCGI_BEGIN_REQUEST  1[m
[31m-#define NGX_HTTP_FASTCGI_ABORT_REQUEST  2[m
[31m-#define NGX_HTTP_FASTCGI_END_REQUEST    3[m
[31m-#define NGX_HTTP_FASTCGI_PARAMS         4[m
[31m-#define NGX_HTTP_FASTCGI_STDIN          5[m
[31m-#define NGX_HTTP_FASTCGI_STDOUT         6[m
[31m-#define NGX_HTTP_FASTCGI_STDERR         7[m
[31m-#define NGX_HTTP_FASTCGI_DATA           8[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  version;[m
[31m-    u_char  type;[m
[31m-    u_char  request_id_hi;[m
[31m-    u_char  request_id_lo;[m
[31m-    u_char  content_length_hi;[m
[31m-    u_char  content_length_lo;[m
[31m-    u_char  padding_length;[m
[31m-    u_char  reserved;[m
[31m-} ngx_http_fastcgi_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  role_hi;[m
[31m-    u_char  role_lo;[m
[31m-    u_char  flags;[m
[31m-    u_char  reserved[5];[m
[31m-} ngx_http_fastcgi_begin_request_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  version;[m
[31m-    u_char  type;[m
[31m-    u_char  request_id_hi;[m
[31m-    u_char  request_id_lo;[m
[31m-} ngx_http_fastcgi_header_small_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_fastcgi_header_t         h0;[m
[31m-    ngx_http_fastcgi_begin_request_t  br;[m
[31m-    ngx_http_fastcgi_header_small_t   h1;[m
[31m-} ngx_http_fastcgi_request_start_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_fastcgi_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_fastcgi_create_key(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_fastcgi_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_fastcgi_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_fastcgi_body_output_filter(void *data,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_fastcgi_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_fastcgi_input_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_fastcgi_non_buffered_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_fastcgi_process_record(ngx_http_request_t *r,[m
[31m-    ngx_http_fastcgi_ctx_t *f);[m
[31m-static void ngx_http_fastcgi_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_fastcgi_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_fastcgi_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_fastcgi_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_fastcgi_init_params(ngx_conf_t *cf,[m
[31m-    ngx_http_fastcgi_loc_conf_t *conf, ngx_http_fastcgi_params_t *params,[m
[31m-    ngx_keyval_t *default_params);[m
[31m-[m
[31m-static ngx_int_t ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_http_fastcgi_ctx_t *ngx_http_fastcgi_split(ngx_http_request_t *r,[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf);[m
[31m-[m
[31m-static char *ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_fastcgi_split_path_info(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static char *ngx_http_fastcgi_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_fastcgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post,[m
[31m-    void *data);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_fastcgi_lowat_post =[m
[31m-    { ngx_http_fastcgi_lowat_check };[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_fastcgi_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_fastcgi_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_fastcgi_commands[] = {[m
[31m-[m
[31m-    { ngx_string("fastcgi_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_index"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, index),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_split_path_info"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_split_path_info,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.send_lowat),[m
[31m-      &ngx_http_fastcgi_lowat_post },[m
[31m-[m
[31m-    { ngx_string("fastcgi_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_main_conf_t, caches),[m
[31m-      &ngx_http_fastcgi_module },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_fastcgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("fastcgi_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_fastcgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("fastcgi_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23,[m
[31m-      ngx_http_upstream_param_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, params_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-    { ngx_string("fastcgi_catch_stderr"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, catch_stderr),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_keep_conn"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, keep_conn),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_fastcgi_module_ctx = {[m
[31m-    ngx_http_fastcgi_add_variables,        /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_fastcgi_create_main_conf,     /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_fastcgi_create_loc_conf,      /* create location configuration */[m
[31m-    ngx_http_fastcgi_merge_loc_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_fastcgi_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_fastcgi_module_ctx,          /* module context */[m
[31m-    ngx_http_fastcgi_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_fastcgi_request_start_t  ngx_http_fastcgi_request_start = {[m
[31m-    { 1,                                               /* version */[m
[31m-      NGX_HTTP_FASTCGI_BEGIN_REQUEST,                  /* type */[m
[31m-      0,                                               /* request_id_hi */[m
[31m-      1,                                               /* request_id_lo */[m
[31m-      0,                                               /* content_length_hi */[m
[31m-      sizeof(ngx_http_fastcgi_begin_request_t),        /* content_length_lo */[m
[31m-      0,                                               /* padding_length */[m
[31m-      0 },                                             /* reserved */[m
[31m-[m
[31m-    { 0,                                               /* role_hi */[m
[31m-      NGX_HTTP_FASTCGI_RESPONDER,                      /* role_lo */[m
[31m-      0, /* NGX_HTTP_FASTCGI_KEEP_CONN */              /* flags */[m
[31m-      { 0, 0, 0, 0, 0 } },                             /* reserved[5] */[m
[31m-[m
[31m-    { 1,                                               /* version */[m
[31m-      NGX_HTTP_FASTCGI_PARAMS,                         /* type */[m
[31m-      0,                                               /* request_id_hi */[m
[31m-      1 },                                             /* request_id_lo */[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_fastcgi_vars[] = {[m
[31m-[m
[31m-    { ngx_string("fastcgi_script_name"), NULL,[m
[31m-      ngx_http_fastcgi_script_name_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("fastcgi_path_info"), NULL,[m
[31m-      ngx_http_fastcgi_path_info_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_fastcgi_hide_headers[] = {[m
[31m-    ngx_string("Status"),[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_fastcgi_cache_headers[] = {[m
[31m-    { ngx_string("HTTP_IF_MODIFIED_SINCE"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("HTTP_IF_MATCH"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_RANGE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_RANGE"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_fastcgi_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_FASTCGI_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_http_upstream_t           *u;[m
[31m-    ngx_http_fastcgi_ctx_t        *f;[m
[31m-    ngx_http_fastcgi_loc_conf_t   *flcf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_fastcgi_main_conf_t  *fmcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t));[m
[31m-    if (f == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, f, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (flcf->fastcgi_lengths) {[m
[31m-        if (ngx_http_fastcgi_eval(r, flcf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_str_set(&u->schema, "fastcgi://");[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_fastcgi_module;[m
[31m-[m
[31m-    u->conf = &flcf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    fmcf = ngx_http_get_module_main_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    u->caches = &fmcf->caches;[m
[31m-    u->create_key = ngx_http_fastcgi_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_fastcgi_create_request;[m
[31m-    u->reinit_request = ngx_http_fastcgi_reinit_request;[m
[31m-    u->process_header = ngx_http_fastcgi_process_header;[m
[31m-    u->abort_request = ngx_http_fastcgi_abort_request;[m
[31m-    u->finalize_request = ngx_http_fastcgi_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    u->buffering = flcf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_http_fastcgi_input_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_fastcgi_input_filter_init;[m
[31m-    u->input_filter = ngx_http_fastcgi_non_buffered_filter;[m
[31m-    u->input_filter_ctx = r;[m
[31m-[m
[31m-    if (!flcf->upstream.request_buffering[m
[31m-        && flcf->upstream.pass_request_body)[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_eval(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf)[m
[31m-{[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &url.url, flcf->fastcgi_lengths->elts, 0,[m
[31m-                            flcf->fastcgi_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = url.port;[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                    *key;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &flcf->cache_key, key) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                         file_pos;[m
[31m-    u_char                        ch, *pos, *lowcase_key;[m
[31m-    size_t                        size, len, key_len, val_len, padding,[m
[31m-                                  allocated;[m
[31m-    ngx_uint_t                    i, n, next, hash, skip_empty, header_params;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header, **ignored;[m
[31m-    ngx_http_upstream_t          *u;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_fastcgi_header_t    *h;[m
[31m-    ngx_http_fastcgi_params_t    *params;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    len = 0;[m
[31m-    header_params = 0;[m
[31m-    ignored = NULL;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    params = u->cacheable ? &flcf->params_cache : &flcf->params;[m
[31m-#else[m
[31m-    params = &flcf->params;[m
[31m-#endif[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, params->flushes);[m
[31m-        le.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-        le.request = r;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = lcode(&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += 1 + key_len + ((val_len > 127) ? 4 : 1) + val_len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flcf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        allocated = 0;[m
[31m-        lowcase_key = NULL;[m
[31m-[m
[31m-        if (params->number) {[m
[31m-            n = 0;[m
[31m-            part = &r->headers_in.headers.part;[m
[31m-[m
[31m-            while (part) {[m
[31m-                n += part->nelts;[m
[31m-                part = part->next;[m
[31m-            }[m
[31m-[m
[31m-            ignored = ngx_palloc(r->pool, n * sizeof(void *));[m
[31m-            if (ignored == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (params->number) {[m
[31m-                if (allocated < header[i].key.len) {[m
[31m-                    allocated = header[i].key.len + 16;[m
[31m-                    lowcase_key = ngx_pnalloc(r->pool, allocated);[m
[31m-                    if (lowcase_key == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                hash = 0;[m
[31m-[m
[31m-                for (n = 0; n < header[i].key.len; n++) {[m
[31m-                    ch = header[i].key.data[n];[m
[31m-[m
[31m-                    if (ch >= 'A' && ch <= 'Z') {[m
[31m-                        ch |= 0x20;[m
[31m-[m
[31m-                    } else if (ch == '-') {[m
[31m-                        ch = '_';[m
[31m-                    }[m
[31m-[m
[31m-                    hash = ngx_hash(hash, ch);[m
[31m-                    lowcase_key[n] = ch;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_hash_find(&params->hash, hash, lowcase_key, n)) {[m
[31m-                    ignored[header_params++] = &header[i];[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                n += sizeof("HTTP_") - 1;[m
[31m-[m
[31m-            } else {[m
[31m-                n = sizeof("HTTP_") - 1 + header[i].key.len;[m
[31m-            }[m
[31m-[m
[31m-            len += ((n > 127) ? 4 : 1) + ((header[i].value.len > 127) ? 4 : 1)[m
[31m-                + n + header[i].value.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (len > 65535) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "fastcgi request record is too big: %uz", len);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    padding = 8 - len % 8;[m
[31m-    padding = (padding == 8) ? 0 : padding;[m
[31m-[m
[31m-[m
[31m-    size = sizeof(ngx_http_fastcgi_header_t)[m
[31m-           + sizeof(ngx_http_fastcgi_begin_request_t)[m
[31m-[m
[31m-           + sizeof(ngx_http_fastcgi_header_t)  /* NGX_HTTP_FASTCGI_PARAMS */[m
[31m-           + len + padding[m
[31m-           + sizeof(ngx_http_fastcgi_header_t)  /* NGX_HTTP_FASTCGI_PARAMS */[m
[31m-[m
[31m-           + sizeof(ngx_http_fastcgi_header_t); /* NGX_HTTP_FASTCGI_STDIN */[m
[31m-[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    ngx_http_fastcgi_request_start.br.flags =[m
[31m-        flcf->keep_conn ? NGX_HTTP_FASTCGI_KEEP_CONN : 0;[m
[31m-[m
[31m-    ngx_memcpy(b->pos, &ngx_http_fastcgi_request_start,[m
[31m-               sizeof(ngx_http_fastcgi_request_start_t));[m
[31m-[m
[31m-    h = (ngx_http_fastcgi_header_t *)[m
[31m-             (b->pos + sizeof(ngx_http_fastcgi_header_t)[m
[31m-                     + sizeof(ngx_http_fastcgi_begin_request_t));[m
[31m-[m
[31m-    h->content_length_hi = (u_char) ((len >> 8) & 0xff);[m
[31m-    h->content_length_lo = (u_char) (len & 0xff);[m
[31m-    h->padding_length = (u_char) padding;[m
[31m-    h->reserved = 0;[m
[31m-[m
[31m-    b->last = b->pos + sizeof(ngx_http_fastcgi_header_t)[m
[31m-                     + sizeof(ngx_http_fastcgi_begin_request_t)[m
[31m-                     + sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        e.ip = params->values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.request = r;[m
[31m-        e.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = (u_char) lcode(&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                e.skip = 1;[m
[31m-[m
[31m-                while (*(uintptr_t *) e.ip) {[m
[31m-                    code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                    code((ngx_http_script_engine_t *) &e);[m
[31m-                }[m
[31m-                e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-                e.skip = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            *e.pos++ = (u_char) key_len;[m
[31m-[m
[31m-            if (val_len > 127) {[m
[31m-                *e.pos++ = (u_char) (((val_len >> 24) & 0x7f) | 0x80);[m
[31m-                *e.pos++ = (u_char) ((val_len >> 16) & 0xff);[m
[31m-                *e.pos++ = (u_char) ((val_len >> 8) & 0xff);[m
[31m-                *e.pos++ = (u_char) (val_len & 0xff);[m
[31m-[m
[31m-            } else {[m
[31m-                *e.pos++ = (u_char) val_len;[m
[31m-            }[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-            e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "fastcgi param: \"%*s: %*s\"",[m
[31m-                           key_len, e.pos - (key_len + val_len),[m
[31m-                           val_len, e.pos - val_len);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (flcf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            for (n = 0; n < header_params; n++) {[m
[31m-                if (&header[i] == ignored[n]) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            key_len = sizeof("HTTP_") - 1 + header[i].key.len;[m
[31m-            if (key_len > 127) {[m
[31m-                *b->last++ = (u_char) (((key_len >> 24) & 0x7f) | 0x80);[m
[31m-                *b->last++ = (u_char) ((key_len >> 16) & 0xff);[m
[31m-                *b->last++ = (u_char) ((key_len >> 8) & 0xff);[m
[31m-                *b->last++ = (u_char) (key_len & 0xff);[m
[31m-[m
[31m-            } else {[m
[31m-                *b->last++ = (u_char) key_len;[m
[31m-            }[m
[31m-[m
[31m-            val_len = header[i].value.len;[m
[31m-            if (val_len > 127) {[m
[31m-                *b->last++ = (u_char) (((val_len >> 24) & 0x7f) | 0x80);[m
[31m-                *b->last++ = (u_char) ((val_len >> 16) & 0xff);[m
[31m-                *b->last++ = (u_char) ((val_len >> 8) & 0xff);[m
[31m-                *b->last++ = (u_char) (val_len & 0xff);[m
[31m-[m
[31m-            } else {[m
[31m-                *b->last++ = (u_char) val_len;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_cpymem(b->last, "HTTP_", sizeof("HTTP_") - 1);[m
[31m-[m
[31m-            for (n = 0; n < header[i].key.len; n++) {[m
[31m-                ch = header[i].key.data[n];[m
[31m-[m
[31m-                if (ch >= 'a' && ch <= 'z') {[m
[31m-                    ch &= ~0x20;[m
[31m-[m
[31m-                } else if (ch == '-') {[m
[31m-                    ch = '_';[m
[31m-                }[m
[31m-[m
[31m-                *b->last++ = ch;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].value.data, val_len);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "fastcgi param: \"%*s: %*s\"",[m
[31m-                           key_len, b->last - (key_len + val_len),[m
[31m-                           val_len, b->last - val_len);[m
[31m-        next:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (padding) {[m
[31m-        ngx_memzero(b->last, padding);[m
[31m-        b->last += padding;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    h = (ngx_http_fastcgi_header_t *) b->last;[m
[31m-    b->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-    h->version = 1;[m
[31m-    h->type = NGX_HTTP_FASTCGI_PARAMS;[m
[31m-    h->request_id_hi = 0;[m
[31m-    h->request_id_lo = 1;[m
[31m-    h->content_length_hi = 0;[m
[31m-    h->content_length_lo = 0;[m
[31m-    h->padding_length = 0;[m
[31m-    h->reserved = 0;[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        u->output.output_filter = ngx_http_fastcgi_body_output_filter;[m
[31m-        u->output.filter_ctx = r;[m
[31m-[m
[31m-    } else if (flcf->upstream.pass_request_body) {[m
[31m-[m
[31m-        body = u->request_bufs;[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        file_pos = 0;[m
[31m-        pos = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        while (body) {[m
[31m-[m
[31m-            if (ngx_buf_special(body->buf)) {[m
[31m-                body = body->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (body->buf->in_file) {[m
[31m-                file_pos = body->buf->file_pos;[m
[31m-[m
[31m-            } else {[m
[31m-                pos = body->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            next = 0;[m
[31m-[m
[31m-            do {[m
[31m-                b = ngx_alloc_buf(r->pool);[m
[31m-                if (b == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                if (body->buf->in_file) {[m
[31m-                    b->file_pos = file_pos;[m
[31m-                    file_pos += 32 * 1024;[m
[31m-[m
[31m-                    if (file_pos >= body->buf->file_last) {[m
[31m-                        file_pos = body->buf->file_last;[m
[31m-                        next = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    b->file_last = file_pos;[m
[31m-                    len = (ngx_uint_t) (file_pos - b->file_pos);[m
[31m-[m
[31m-                } else {[m
[31m-                    b->pos = pos;[m
[31m-                    b->start = pos;[m
[31m-                    pos += 32 * 1024;[m
[31m-[m
[31m-                    if (pos >= body->buf->last) {[m
[31m-                        pos = body->buf->last;[m
[31m-                        next = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    b->last = pos;[m
[31m-                    len = (ngx_uint_t) (pos - b->pos);[m
[31m-                }[m
[31m-[m
[31m-                padding = 8 - len % 8;[m
[31m-                padding = (padding == 8) ? 0 : padding;[m
[31m-[m
[31m-                h = (ngx_http_fastcgi_header_t *) cl->buf->last;[m
[31m-                cl->buf->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-                h->version = 1;[m
[31m-                h->type = NGX_HTTP_FASTCGI_STDIN;[m
[31m-                h->request_id_hi = 0;[m
[31m-                h->request_id_lo = 1;[m
[31m-                h->content_length_hi = (u_char) ((len >> 8) & 0xff);[m
[31m-                h->content_length_lo = (u_char) (len & 0xff);[m
[31m-                h->padding_length = (u_char) padding;[m
[31m-                h->reserved = 0;[m
[31m-[m
[31m-                cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl->next == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl = cl->next;[m
[31m-                cl->buf = b;[m
[31m-[m
[31m-                b = ngx_create_temp_buf(r->pool,[m
[31m-                                        sizeof(ngx_http_fastcgi_header_t)[m
[31m-                                        + padding);[m
[31m-                if (b == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (padding) {[m
[31m-                    ngx_memzero(b->last, padding);[m
[31m-                    b->last += padding;[m
[31m-                }[m
[31m-[m
[31m-                cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl->next == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl = cl->next;[m
[31m-                cl->buf = b;[m
[31m-[m
[31m-            } while (!next);[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        u->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-        h = (ngx_http_fastcgi_header_t *) cl->buf->last;[m
[31m-        cl->buf->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-        h->version = 1;[m
[31m-        h->type = NGX_HTTP_FASTCGI_STDIN;[m
[31m-        h->request_id_hi = 0;[m
[31m-        h->request_id_lo = 1;[m
[31m-        h->content_length_hi = 0;[m
[31m-        h->content_length_lo = 0;[m
[31m-        h->padding_length = 0;[m
[31m-        h->reserved = 0;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_fastcgi_ctx_t  *f;[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    f->state = ngx_http_fastcgi_st_version;[m
[31m-    f->fastcgi_stdout = 0;[m
[31m-    f->large_stderr = 0;[m
[31m-[m
[31m-    if (f->split_parts) {[m
[31m-        f->split_parts->nelts = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_body_output_filter(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    off_t                       file_pos;[m
[31m-    u_char                     *pos, *start;[m
[31m-    size_t                      len, padding;[m
[31m-    ngx_buf_t                  *b;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  next, last;[m
[31m-    ngx_chain_t                *cl, *tl, *out, **ll;[m
[31m-    ngx_http_fastcgi_ctx_t     *f;[m
[31m-    ngx_http_fastcgi_header_t  *h;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "fastcgi output filter");[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        out = in;[m
[31m-        goto out;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    if (!f->header_sent) {[m
[31m-        /* first buffer contains headers, pass it unmodified */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "fastcgi output header");[m
[31m-[m
[31m-        f->header_sent = 1;[m
[31m-[m
[31m-        tl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tl->buf = in->buf;[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            tl->next = NULL;[m
[31m-            goto out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &f->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter;[m
[31m-    b->temporary = 1;[m
[31m-[m
[31m-    if (b->start == NULL) {[m
[31m-        /* reserve space for maximum possible padding, 7 bytes */[m
[31m-[m
[31m-        b->start = ngx_palloc(r->pool,[m
[31m-                              sizeof(ngx_http_fastcgi_header_t) + 7);[m
[31m-        if (b->start == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-[m
[31m-        b->end = b->start + sizeof(ngx_http_fastcgi_header_t) + 7;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = 0;[m
[31m-    padding = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    file_pos = 0;[m
[31m-    pos = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    while (in) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "fastcgi output in  l:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       in->buf->last_buf,[m
[31m-                       in->buf->in_file,[m
[31m-                       in->buf->start, in->buf->pos,[m
[31m-                       in->buf->last - in->buf->pos,[m
[31m-                       in->buf->file_pos,[m
[31m-                       in->buf->file_last - in->buf->file_pos);[m
[31m-[m
[31m-        if (in->buf->last_buf) {[m
[31m-            last = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_special(in->buf)) {[m
[31m-            in = in->next;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->in_file) {[m
[31m-            file_pos = in->buf->file_pos;[m
[31m-[m
[31m-        } else {[m
[31m-            pos = in->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        next = 0;[m
[31m-[m
[31m-        do {[m
[31m-            tl = ngx_chain_get_free_buf(r->pool, &f->free);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = tl->buf;[m
[31m-            start = b->start;[m
[31m-[m
[31m-            ngx_memcpy(b, in->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            /*[m
[31m-             * restore b->start to preserve memory allocated in the buffer,[m
[31m-             * to reuse it later for headers and padding[m
[31m-             */[m
[31m-[m
[31m-            b->start = start;[m
[31m-[m
[31m-            if (in->buf->in_file) {[m
[31m-                b->file_pos = file_pos;[m
[31m-                file_pos += 32 * 1024;[m
[31m-[m
[31m-                if (file_pos >= in->buf->file_last) {[m
[31m-                    file_pos = in->buf->file_last;[m
[31m-                    next = 1;[m
[31m-                }[m
[31m-[m
[31m-                b->file_last = file_pos;[m
[31m-                len = (ngx_uint_t) (file_pos - b->file_pos);[m
[31m-[m
[31m-            } else {[m
[31m-                b->pos = pos;[m
[31m-                pos += 32 * 1024;[m
[31m-[m
[31m-                if (pos >= in->buf->last) {[m
[31m-                    pos = in->buf->last;[m
[31m-                    next = 1;[m
[31m-                }[m
[31m-[m
[31m-                b->last = pos;[m
[31m-                len = (ngx_uint_t) (pos - b->pos);[m
[31m-            }[m
[31m-[m
[31m-            b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter;[m
[31m-            b->shadow = in->buf;[m
[31m-            b->last_shadow = next;[m
[31m-[m
[31m-            b->last_buf = 0;[m
[31m-            b->last_in_chain = 0;[m
[31m-[m
[31m-            padding = 8 - len % 8;[m
[31m-            padding = (padding == 8) ? 0 : padding;[m
[31m-[m
[31m-            h = (ngx_http_fastcgi_header_t *) cl->buf->last;[m
[31m-            cl->buf->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-            h->version = 1;[m
[31m-            h->type = NGX_HTTP_FASTCGI_STDIN;[m
[31m-            h->request_id_hi = 0;[m
[31m-            h->request_id_lo = 1;[m
[31m-            h->content_length_hi = (u_char) ((len >> 8) & 0xff);[m
[31m-            h->content_length_lo = (u_char) (len & 0xff);[m
[31m-            h->padding_length = (u_char) padding;[m
[31m-            h->reserved = 0;[m
[31m-[m
[31m-            cl->next = tl;[m
[31m-            cl = tl;[m
[31m-[m
[31m-            tl = ngx_chain_get_free_buf(r->pool, &f->free);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = tl->buf;[m
[31m-[m
[31m-            b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter;[m
[31m-            b->temporary = 1;[m
[31m-[m
[31m-            if (b->start == NULL) {[m
[31m-                /* reserve space for maximum possible padding, 7 bytes */[m
[31m-[m
[31m-                b->start = ngx_palloc(r->pool,[m
[31m-                                      sizeof(ngx_http_fastcgi_header_t) + 7);[m
[31m-                if (b->start == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b->pos = b->start;[m
[31m-                b->last = b->start;[m
[31m-[m
[31m-                b->end = b->start + sizeof(ngx_http_fastcgi_header_t) + 7;[m
[31m-            }[m
[31m-[m
[31m-            if (padding) {[m
[31m-                ngx_memzero(b->last, padding);[m
[31m-                b->last += padding;[m
[31m-            }[m
[31m-[m
[31m-            cl->next = tl;[m
[31m-            cl = tl;[m
[31m-[m
[31m-        } while (!next);[m
[31m-[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        h = (ngx_http_fastcgi_header_t *) cl->buf->last;[m
[31m-        cl->buf->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-        h->version = 1;[m
[31m-        h->type = NGX_HTTP_FASTCGI_STDIN;[m
[31m-        h->request_id_hi = 0;[m
[31m-        h->request_id_lo = 1;[m
[31m-        h->content_length_hi = 0;[m
[31m-        h->content_length_lo = 0;[m
[31m-        h->padding_length = 0;[m
[31m-        h->reserved = 0;[m
[31m-[m
[31m-        cl->buf->last_buf = 1;[m
[31m-[m
[31m-    } else if (padding == 0) {[m
[31m-        /* TODO: do not allocate buffers instead */[m
[31m-        cl->buf->temporary = 0;[m
[31m-        cl->buf->sync = 1;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-out:[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    for (cl = out; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "fastcgi output out l:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->last_buf,[m
[31m-                       cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_chain_writer(&r->upstream->writer, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &f->free, &f->busy, &out,[m
[31m-                         (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter);[m
[31m-[m
[31m-    for (cl = f->free; cl; cl = cl->next) {[m
[31m-[m
[31m-        /* mark original buffers as sent */[m
[31m-[m
[31m-        if (cl->buf->shadow) {[m
[31m-            if (cl->buf->last_shadow) {[m
[31m-                b = cl->buf->shadow;[m
[31m-                b->pos = b->last;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->shadow = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                         *p, *msg, *start, *last,[m
[31m-                                   *part_start, *part_end;[m
[31m-    size_t                          size;[m
[31m-    ngx_str_t                      *status_line, *pattern;[m
[31m-    ngx_int_t                       rc, status;[m
[31m-    ngx_buf_t                       buf;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_fastcgi_ctx_t         *f;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_fastcgi_loc_conf_t    *flcf;[m
[31m-    ngx_http_fastcgi_split_part_t  *part;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (f->state < ngx_http_fastcgi_st_data) {[m
[31m-[m
[31m-            f->pos = u->buffer.pos;[m
[31m-            f->last = u->buffer.last;[m
[31m-[m
[31m-            rc = ngx_http_fastcgi_process_record(r, f);[m
[31m-[m
[31m-            u->buffer.pos = f->pos;[m
[31m-            u->buffer.last = f->last;[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type != NGX_HTTP_FASTCGI_STDOUT[m
[31m-                && f->type != NGX_HTTP_FASTCGI_STDERR)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent unexpected FastCGI record: %ui",[m
[31m-                              f->type);[m
[31m-[m
[31m-                return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream prematurely closed FastCGI stdout");[m
[31m-[m
[31m-                return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (f->state == ngx_http_fastcgi_st_padding) {[m
[31m-[m
[31m-            if (u->buffer.pos + f->padding < u->buffer.last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-                u->buffer.pos += f->padding;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (u->buffer.pos + f->padding == u->buffer.last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-                u->buffer.pos = u->buffer.last;[m
[31m-[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            f->padding -= u->buffer.last - u->buffer.pos;[m
[31m-            u->buffer.pos = u->buffer.last;[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->state == ngx_http_fastcgi_st_data */[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_STDERR) {[m
[31m-[m
[31m-            if (f->length) {[m
[31m-                msg = u->buffer.pos;[m
[31m-[m
[31m-                if (u->buffer.pos + f->length <= u->buffer.last) {[m
[31m-                    u->buffer.pos += f->length;[m
[31m-                    f->length = 0;[m
[31m-                    f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                } else {[m
[31m-                    f->length -= u->buffer.last - u->buffer.pos;[m
[31m-                    u->buffer.pos = u->buffer.last;[m
[31m-                }[m
[31m-[m
[31m-                for (p = u->buffer.pos - 1; msg < p; p--) {[m
[31m-                    if (*p != LF && *p != CR && *p != '.' && *p != ' ') {[m
[31m-                        break;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                p++;[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "FastCGI sent in stderr: \"%*s\"", p - msg, msg);[m
[31m-[m
[31m-                flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-                if (flcf->catch_stderr) {[m
[31m-                    pattern = flcf->catch_stderr->elts;[m
[31m-[m
[31m-                    for (i = 0; i < flcf->catch_stderr->nelts; i++) {[m
[31m-                        if (ngx_strnstr(msg, (char *) pattern[i].data,[m
[31m-                                        p - msg)[m
[31m-                            != NULL)[m
[31m-                        {[m
[31m-                            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (u->buffer.pos == u->buffer.last) {[m
[31m-[m
[31m-                    if (!f->fastcgi_stdout) {[m
[31m-[m
[31m-                        /*[m
[31m-                         * the special handling the large number[m
[31m-                         * of the PHP warnings to not allocate memory[m
[31m-                         */[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-                        if (r->cache) {[m
[31m-                            u->buffer.pos = u->buffer.start[m
[31m-                                                     + r->cache->header_start;[m
[31m-                        } else {[m
[31m-                            u->buffer.pos = u->buffer.start;[m
[31m-                        }[m
[31m-#else[m
[31m-                        u->buffer.pos = u->buffer.start;[m
[31m-#endif[m
[31m-                        u->buffer.last = u->buffer.pos;[m
[31m-                        f->large_stderr = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_AGAIN;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->type == NGX_HTTP_FASTCGI_STDOUT */[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (f->large_stderr && r->cache) {[m
[31m-            ssize_t                     len;[m
[31m-            ngx_http_fastcgi_header_t  *fh;[m
[31m-[m
[31m-            start = u->buffer.start + r->cache->header_start;[m
[31m-[m
[31m-            len = u->buffer.pos - start - 2 * sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-            /*[m
[31m-             * A tail of large stderr output before HTTP header is placed[m
[31m-             * in a cache file without a FastCGI record header.[m
[31m-             * To workaround it we put a dummy FastCGI record header at the[m
[31m-             * start of the stderr output or update r->cache_header_start,[m
[31m-             * if there is no enough place for the record header.[m
[31m-             */[m
[31m-[m
[31m-            if (len >= 0) {[m
[31m-                fh = (ngx_http_fastcgi_header_t *) start;[m
[31m-                fh->version = 1;[m
[31m-                fh->type = NGX_HTTP_FASTCGI_STDERR;[m
[31m-                fh->request_id_hi = 0;[m
[31m-                fh->request_id_lo = 1;[m
[31m-                fh->content_length_hi = (u_char) ((len >> 8) & 0xff);[m
[31m-                fh->content_length_lo = (u_char) (len & 0xff);[m
[31m-                fh->padding_length = 0;[m
[31m-                fh->reserved = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                r->cache->header_start += u->buffer.pos - start[m
[31m-                                          - sizeof(ngx_http_fastcgi_header_t);[m
[31m-            }[m
[31m-[m
[31m-            f->large_stderr = 0;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        f->fastcgi_stdout = 1;[m
[31m-[m
[31m-        start = u->buffer.pos;[m
[31m-[m
[31m-        if (u->buffer.pos + f->length < u->buffer.last) {[m
[31m-[m
[31m-            /*[m
[31m-             * set u->buffer.last to the end of the FastCGI record data[m
[31m-             * for ngx_http_parse_header_line()[m
[31m-             */[m
[31m-[m
[31m-            last = u->buffer.last;[m
[31m-            u->buffer.last = u->buffer.pos + f->length;[m
[31m-[m
[31m-        } else {[m
[31m-            last = NULL;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            part_start = u->buffer.pos;[m
[31m-            part_end = u->buffer.last;[m
[31m-[m
[31m-            rc = ngx_http_parse_header_line(r, &u->buffer, 1);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http fastcgi parser: %i", rc);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a header line has been parsed successfully */[m
[31m-[m
[31m-                h = ngx_list_push(&u->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (f->split_parts && f->split_parts->nelts) {[m
[31m-[m
[31m-                    part = f->split_parts->elts;[m
[31m-                    size = u->buffer.pos - part_start;[m
[31m-[m
[31m-                    for (i = 0; i < f->split_parts->nelts; i++) {[m
[31m-                        size += part[i].end - part[i].start;[m
[31m-                    }[m
[31m-[m
[31m-                    p = ngx_pnalloc(r->pool, size);[m
[31m-                    if (p == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    buf.pos = p;[m
[31m-[m
[31m-                    for (i = 0; i < f->split_parts->nelts; i++) {[m
[31m-                        p = ngx_cpymem(p, part[i].start,[m
[31m-                                       part[i].end - part[i].start);[m
[31m-                    }[m
[31m-[m
[31m-                    p = ngx_cpymem(p, part_start, u->buffer.pos - part_start);[m
[31m-[m
[31m-                    buf.last = p;[m
[31m-[m
[31m-                    f->split_parts->nelts = 0;[m
[31m-[m
[31m-                    rc = ngx_http_parse_header_line(r, &buf, 1);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                                      "invalid header after joining "[m
[31m-                                      "FastCGI records");[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    h->key.len = r->header_name_end - r->header_name_start;[m
[31m-                    h->key.data = r->header_name_start;[m
[31m-                    h->key.data[h->key.len] = '\0';[m
[31m-[m
[31m-                    h->value.len = r->header_end - r->header_start;[m
[31m-                    h->value.data = r->header_start;[m
[31m-                    h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-                    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-                    if (h->lowcase_key == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    h->key.len = r->header_name_end - r->header_name_start;[m
[31m-                    h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-                    h->key.data = ngx_pnalloc(r->pool,[m
[31m-                                              h->key.len + 1 + h->value.len + 1[m
[31m-                                              + h->key.len);[m
[31m-                    if (h->key.data == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    h->value.data = h->key.data + h->key.len + 1;[m
[31m-                    h->lowcase_key = h->key.data + h->key.len + 1[m
[31m-                                     + h->value.len + 1;[m
[31m-[m
[31m-                    ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-                    h->key.data[h->key.len] = '\0';[m
[31m-                    ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-                    h->value.data[h->value.len] = '\0';[m
[31m-                }[m
[31m-[m
[31m-                h->hash = r->header_hash;[m
[31m-[m
[31m-                if (h->key.len == r->lowcase_index) {[m
[31m-                    ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-                }[m
[31m-[m
[31m-                hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                                   h->lowcase_key, h->key.len);[m
[31m-[m
[31m-                if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "http fastcgi header: \"%V: %V\"",[m
[31m-                               &h->key, &h->value);[m
[31m-[m
[31m-                if (u->buffer.pos < u->buffer.last) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                /* the end of the FastCGI record */[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-                /* a whole header has been parsed successfully */[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "http fastcgi header done");[m
[31m-[m
[31m-                if (u->headers_in.status) {[m
[31m-                    status_line = &u->headers_in.status->value;[m
[31m-[m
[31m-                    status = ngx_atoi(status_line->data, 3);[m
[31m-[m
[31m-                    if (status == NGX_ERROR) {[m
[31m-                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                      "upstream sent invalid status \"%V\"",[m
[31m-                                      status_line);[m
[31m-                        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-                    }[m
[31m-[m
[31m-                    u->headers_in.status_n = status;[m
[31m-                    u->headers_in.status_line = *status_line;[m
[31m-[m
[31m-                } else if (u->headers_in.location) {[m
[31m-                    u->headers_in.status_n = 302;[m
[31m-                    ngx_str_set(&u->headers_in.status_line,[m
[31m-                                "302 Moved Temporarily");[m
[31m-[m
[31m-                } else {[m
[31m-                    u->headers_in.status_n = 200;[m
[31m-                    ngx_str_set(&u->headers_in.status_line, "200 OK");[m
[31m-                }[m
[31m-[m
[31m-                if (u->state && u->state->status == 0) {[m
[31m-                    u->state->status = u->headers_in.status_n;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* there was error while a header line parsing */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "upstream sent invalid header");[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        if (last) {[m
[31m-            u->buffer.last = last;[m
[31m-        }[m
[31m-[m
[31m-        f->length -= u->buffer.pos - start;[m
[31m-[m
[31m-        if (f->length == 0) {[m
[31m-            f->state = ngx_http_fastcgi_st_padding;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_AGAIN */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "upstream split a header line in FastCGI records");[m
[31m-[m
[31m-        if (f->split_parts == NULL) {[m
[31m-            f->split_parts = ngx_array_create(r->pool, 1,[m
[31m-                                        sizeof(ngx_http_fastcgi_split_part_t));[m
[31m-            if (f->split_parts == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        part = ngx_array_push(f->split_parts);[m
[31m-        if (part == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        part->start = part_start;[m
[31m-        part->end = part_end;[m
[31m-[m
[31m-        if (u->buffer.pos < u->buffer.last) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t           *r = data;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    r->upstream->pipe->length = flcf->keep_conn ?[m
[31m-                                (off_t) sizeof(ngx_http_fastcgi_header_t) : -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    u_char                       *m, *msg;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_buf_t                    *b, **prev;[m
[31m-    ngx_chain_t                  *cl;[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_http_fastcgi_ctx_t       *f;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r = p->input_ctx;[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    b = NULL;[m
[31m-    prev = &buf->shadow;[m
[31m-[m
[31m-    f->pos = buf->pos;[m
[31m-    f->last = buf->last;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (f->state < ngx_http_fastcgi_st_data) {[m
[31m-[m
[31m-            rc = ngx_http_fastcgi_process_record(r, f);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                if (!flcf->keep_conn) {[m
[31m-                    p->upstream_done = 1;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0,[m
[31m-                               "http fastcgi closed stdout");[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0,[m
[31m-                               "http fastcgi sent end request");[m
[31m-[m
[31m-                if (!flcf->keep_conn) {[m
[31m-                    p->upstream_done = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        if (f->state == ngx_http_fastcgi_st_padding) {[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-                if (f->pos + f->padding < f->last) {[m
[31m-                    p->upstream_done = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (f->pos + f->padding == f->last) {[m
[31m-                    p->upstream_done = 1;[m
[31m-                    r->upstream->keepalive = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                f->padding -= f->last - f->pos;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (f->pos + f->padding < f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-                f->pos += f->padding;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (f->pos + f->padding == f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            f->padding -= f->last - f->pos;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->state == ngx_http_fastcgi_st_data */[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_STDERR) {[m
[31m-[m
[31m-            if (f->length) {[m
[31m-[m
[31m-                if (f->pos == f->last) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                msg = f->pos;[m
[31m-[m
[31m-                if (f->pos + f->length <= f->last) {[m
[31m-                    f->pos += f->length;[m
[31m-                    f->length = 0;[m
[31m-                    f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                } else {[m
[31m-                    f->length -= f->last - f->pos;[m
[31m-                    f->pos = f->last;[m
[31m-                }[m
[31m-[m
[31m-                for (m = f->pos - 1; msg < m; m--) {[m
[31m-                    if (*m != LF && *m != CR && *m != '.' && *m != ' ') {[m
[31m-                        break;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, p->log, 0,[m
[31m-                              "FastCGI sent in stderr: \"%*s\"",[m
[31m-                              m + 1 - msg, msg);[m
[31m-[m
[31m-            } else {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-            if (f->pos + f->length <= f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-                f->pos += f->length;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            f->length -= f->last - f->pos;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->type == NGX_HTTP_FASTCGI_STDOUT */[m
[31m-[m
[31m-        if (f->pos == f->last) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->pos = f->pos;[m
[31m-        b->start = buf->start;[m
[31m-        b->end = buf->end;[m
[31m-        b->tag = p->tag;[m
[31m-        b->temporary = 1;[m
[31m-        b->recycled = 1;[m
[31m-[m
[31m-        *prev = b;[m
[31m-        prev = &b->shadow;[m
[31m-[m
[31m-        if (p->in) {[m
[31m-            *p->last_in = cl;[m
[31m-        } else {[m
[31m-            p->in = cl;[m
[31m-        }[m
[31m-        p->last_in = &cl->next;[m
[31m-[m
[31m-[m
[31m-        /* STUB */ b->num = buf->num;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "input buf #%d %p", b->num, b->pos);[m
[31m-[m
[31m-        if (f->pos + f->length <= f->last) {[m
[31m-            f->state = ngx_http_fastcgi_st_padding;[m
[31m-            f->pos += f->length;[m
[31m-            b->last = f->pos;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        f->length -= f->last - f->pos;[m
[31m-[m
[31m-        b->last = f->last;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    if (flcf->keep_conn) {[m
[31m-[m
[31m-        /* set p->length, minimal amount of data we want to see */[m
[31m-[m
[31m-        if (f->state < ngx_http_fastcgi_st_data) {[m
[31m-            p->length = 1;[m
[31m-[m
[31m-        } else if (f->state == ngx_http_fastcgi_st_padding) {[m
[31m-            p->length = f->padding;[m
[31m-[m
[31m-        } else {[m
[31m-            /* ngx_http_fastcgi_st_data */[m
[31m-[m
[31m-            p->length = f->length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (b) {[m
[31m-        b->shadow = buf;[m
[31m-        b->last_shadow = 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "input buf %p %z", b->pos, b->last - b->pos);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* there is no data record in the buf, add it to free chain */[m
[31m-[m
[31m-    if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_non_buffered_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    u_char                  *m, *msg;[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_buf_t               *b, *buf;[m
[31m-    ngx_chain_t             *cl, **ll;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_upstream_t     *u;[m
[31m-    ngx_http_fastcgi_ctx_t  *f;[m
[31m-[m
[31m-    r = data;[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    buf = &u->buffer;[m
[31m-[m
[31m-    buf->pos = buf->last;[m
[31m-    buf->last += bytes;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    f->pos = buf->pos;[m
[31m-    f->last = buf->last;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (f->state < ngx_http_fastcgi_st_data) {[m
[31m-[m
[31m-            rc = ngx_http_fastcgi_process_record(r, f);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "http fastcgi closed stdout");[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (f->state == ngx_http_fastcgi_st_padding) {[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-                if (f->pos + f->padding < f->last) {[m
[31m-                    u->length = 0;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (f->pos + f->padding == f->last) {[m
[31m-                    u->length = 0;[m
[31m-                    u->keepalive = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                f->padding -= f->last - f->pos;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (f->pos + f->padding < f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-                f->pos += f->padding;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (f->pos + f->padding == f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            f->padding -= f->last - f->pos;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->state == ngx_http_fastcgi_st_data */[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_STDERR) {[m
[31m-[m
[31m-            if (f->length) {[m
[31m-[m
[31m-                if (f->pos == f->last) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                msg = f->pos;[m
[31m-[m
[31m-                if (f->pos + f->length <= f->last) {[m
[31m-                    f->pos += f->length;[m
[31m-                    f->length = 0;[m
[31m-                    f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                } else {[m
[31m-                    f->length -= f->last - f->pos;[m
[31m-                    f->pos = f->last;[m
[31m-                }[m
[31m-[m
[31m-                for (m = f->pos - 1; msg < m; m--) {[m
[31m-                    if (*m != LF && *m != CR && *m != '.' && *m != ' ') {[m
[31m-                        break;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "FastCGI sent in stderr: \"%*s\"",[m
[31m-                              m + 1 - msg, msg);[m
[31m-[m
[31m-            } else {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-            if (f->pos + f->length <= f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-                f->pos += f->length;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            f->length -= f->last - f->pos;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->type == NGX_HTTP_FASTCGI_STDOUT */[m
[31m-[m
[31m-        if (f->pos == f->last) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        b->flush = 1;[m
[31m-        b->memory = 1;[m
[31m-[m
[31m-        b->pos = f->pos;[m
[31m-        b->tag = u->output.tag;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http fastcgi output buf %p", b->pos);[m
[31m-[m
[31m-        if (f->pos + f->length <= f->last) {[m
[31m-            f->state = ngx_http_fastcgi_st_padding;[m
[31m-            f->pos += f->length;[m
[31m-            b->last = f->pos;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        f->length -= f->last - f->pos;[m
[31m-        b->last = f->last;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    /* provide continuous buffer for subrequests in memory */[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-[m
[31m-        cl = u->out_bufs;[m
[31m-[m
[31m-        if (cl) {[m
[31m-            buf->pos = cl->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        buf->last = buf->pos;[m
[31m-[m
[31m-        for (cl = u->out_bufs; cl; cl = cl->next) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http fastcgi in memory %p-%p %O",[m
[31m-                           cl->buf->pos, cl->buf->last, ngx_buf_size(cl->buf));[m
[31m-[m
[31m-            if (buf->last == cl->buf->pos) {[m
[31m-                buf->last = cl->buf->last;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_movemem(buf->last, cl->buf->pos,[m
[31m-                                    cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-            cl->buf->pos = buf->last - (cl->buf->last - cl->buf->pos);[m
[31m-            cl->buf->last = buf->last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_process_record(ngx_http_request_t *r,[m
[31m-    ngx_http_fastcgi_ctx_t *f)[m
[31m-{[m
[31m-    u_char                     ch, *p;[m
[31m-    ngx_http_fastcgi_state_e   state;[m
[31m-[m
[31m-    state = f->state;[m
[31m-[m
[31m-    for (p = f->pos; p < f->last; p++) {[m
[31m-[m
[31m-        ch = *p;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http fastcgi record byte: %02Xd", ch);[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_version:[m
[31m-            if (ch != 1) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent unsupported FastCGI "[m
[31m-                              "protocol version: %d", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            state = ngx_http_fastcgi_st_type;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_type:[m
[31m-            switch (ch) {[m
[31m-            case NGX_HTTP_FASTCGI_STDOUT:[m
[31m-            case NGX_HTTP_FASTCGI_STDERR:[m
[31m-            case NGX_HTTP_FASTCGI_END_REQUEST:[m
[31m-                f->type = (ngx_uint_t) ch;[m
[31m-                break;[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent invalid FastCGI "[m
[31m-                              "record type: %d", ch);[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            }[m
[31m-            state = ngx_http_fastcgi_st_request_id_hi;[m
[31m-            break;[m
[31m-[m
[31m-        /* we support the single request per connection */[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_request_id_hi:[m
[31m-            if (ch != 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent unexpected FastCGI "[m
[31m-                              "request id high byte: %d", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            state = ngx_http_fastcgi_st_request_id_lo;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_request_id_lo:[m
[31m-            if (ch != 1) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent unexpected FastCGI "[m
[31m-                              "request id low byte: %d", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            state = ngx_http_fastcgi_st_content_length_hi;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_content_length_hi:[m
[31m-            f->length = ch << 8;[m
[31m-            state = ngx_http_fastcgi_st_content_length_lo;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_content_length_lo:[m
[31m-            f->length |= (size_t) ch;[m
[31m-            state = ngx_http_fastcgi_st_padding_length;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_padding_length:[m
[31m-            f->padding = (size_t) ch;[m
[31m-            state = ngx_http_fastcgi_st_reserved;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_reserved:[m
[31m-            state = ngx_http_fastcgi_st_data;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http fastcgi record length: %z", f->length);[m
[31m-[m
[31m-            f->pos = p + 1;[m
[31m-            f->state = state;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        /* suppress warning */[m
[31m-        case ngx_http_fastcgi_st_data:[m
[31m-        case ngx_http_fastcgi_st_padding:[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    f->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_fastcgi_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http fastcgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_fastcgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http fastcgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_fastcgi_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_fastcgi_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fastcgi_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fastcgi_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.ignore_headers = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.cache_zone = NULL;[m
[31m-     *     conf->upstream.cache_use_stale = 0;[m
[31m-     *     conf->upstream.cache_methods = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.hide_headers_hash = { NULL, 0 };[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     *     conf->upstream.store_lengths = NULL;[m
[31m-     *     conf->upstream.store_values = NULL;[m
[31m-     *[m
[31m-     *     conf->index.len = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-    /* "fastcgi_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    conf->catch_stderr = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->keep_conn = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "fastcgi");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *prev = parent;[m
[31m-    ngx_http_fastcgi_loc_conf_t *conf = child;[m
[31m-[m
[31m-    size_t                        size;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store,[m
[31m-                              prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"fastcgi_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-                                         conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"fastcgi_busy_buffers_size\" must be equal to or greater than "[m
[31m-             "the maximum of the value of \"fastcgi_buffer_size\" and "[m
[31m-             "one of the \"fastcgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"fastcgi_busy_buffers_size\" must be less than "[m
[31m-             "the size of all \"fastcgi_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-                                      conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"fastcgi_temp_file_write_size\" must be equal to or greater "[m
[31m-             "than the maximum of the value of \"fastcgi_buffer_size\" and "[m
[31m-             "one of the \"fastcgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-                                        conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"fastcgi_max_temp_file_size\" must be equal to zero to disable "[m
[31m-             "temporary files usage or must be equal to or greater than "[m
[31m-             "the maximum of the value of \"fastcgi_buffer_size\" and "[m
[31m-             "one of the \"fastcgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                              prev->upstream.ignore_headers,[m
[31m-                              NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                              prev->upstream.temp_path,[m
[31m-                              &ngx_http_fastcgi_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"fastcgi_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache && conf->cache_key.value.data == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "no \"fastcgi_cache_key\" for \"fastcgi_cache\"");[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                              prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                              prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                              prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->catch_stderr, prev->catch_stderr, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->keep_conn, prev->keep_conn, 0);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->index, prev->index, "");[m
[31m-[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "fastcgi_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-             &prev->upstream, ngx_http_fastcgi_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->fastcgi_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->fastcgi_lengths = prev->fastcgi_lengths;[m
[31m-        conf->fastcgi_values = prev->fastcgi_values;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->fastcgi_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_fastcgi_handler;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (conf->split_regex == NULL) {[m
[31m-        conf->split_regex = prev->split_regex;[m
[31m-        conf->split_name = prev->split_name;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->params_source == NULL) {[m
[31m-        conf->params = prev->params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->params_cache = prev->params_cache;[m
[31m-#endif[m
[31m-        conf->params_source = prev->params_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_fastcgi_init_params(cf, conf, &conf->params, NULL);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_fastcgi_init_params(cf, conf, &conf->params_cache,[m
[31m-                                          ngx_http_fastcgi_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_init_params(ngx_conf_t *cf, ngx_http_fastcgi_loc_conf_t *conf,[m
[31m-    ngx_http_fastcgi_params_t *params, ngx_keyval_t *default_params)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i, nsrc;[m
[31m-    ngx_array_t                   headers_names, params_merged;[m
[31m-    ngx_keyval_t                 *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_upstream_param_t    *src, *s;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (params->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source == NULL && default_params == NULL) {[m
[31m-        params->hash.buckets = (void *) 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    params->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (params->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    params->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (params->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source) {[m
[31m-        src = conf->params_source->elts;[m
[31m-        nsrc = conf->params_source->nelts;[m
[31m-[m
[31m-    } else {[m
[31m-        src = NULL;[m
[31m-        nsrc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (default_params) {[m
[31m-        if (ngx_array_init(&params_merged, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_upstream_param_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = src[i];[m
[31m-        }[m
[31m-[m
[31m-        h = default_params;[m
[31m-[m
[31m-        while (h->key.len) {[m
[31m-[m
[31m-            src = params_merged.elts;[m
[31m-            nsrc = params_merged.nelts;[m
[31m-[m
[31m-            for (i = 0; i < nsrc; i++) {[m
[31m-                if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            s->key = h->key;[m
[31m-            s->value = h->value;[m
[31m-            s->skip_empty = 1;[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            h++;[m
[31m-        }[m
[31m-[m
[31m-        src = params_merged.elts;[m
[31m-        nsrc = params_merged.nelts;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-        if (src[i].key.len > sizeof("HTTP_") - 1[m
[31m-            && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0)[m
[31m-        {[m
[31m-            hk = ngx_array_push(&headers_names);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key.len = src[i].key.len - 5;[m
[31m-            hk->key.data = src[i].key.data + 5;[m
[31m-            hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-            if (src[i].value.len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].key.len;[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].skip_empty;[m
[31m-[m
[31m-[m
[31m-        size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                + src[i].key.len + sizeof(uintptr_t) - 1)[m
[31m-               & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->values, size);[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = ngx_http_script_copy_code;[m
[31m-        copy->len = src[i].key.len;[m
[31m-[m
[31m-        p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-        ngx_memcpy(p, src[i].key.data, src[i].key.len);[m
[31m-[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &src[i].value;[m
[31m-        sc.flushes = &params->flushes;[m
[31m-        sc.lengths = &params->lengths;[m
[31m-        sc.values = &params->values;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-        code = ngx_array_push_n(params->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-    params->number = headers_names.nelts;[m
[31m-[m
[31m-    hash.hash = &params->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = 64;[m
[31m-    hash.name = "fastcgi_params_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    ngx_http_fastcgi_ctx_t       *f;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    f = ngx_http_fastcgi_split(r, flcf);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (f->script_name.len == 0[m
[31m-        || f->script_name.data[f->script_name.len - 1] != '/')[m
[31m-    {[m
[31m-        v->len = f->script_name.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = f->script_name.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = f->script_name.len + flcf->index.len;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, v->len);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(v->data, f->script_name.data, f->script_name.len);[m
[31m-    ngx_memcpy(p, flcf->index.data, flcf->index.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_fastcgi_ctx_t       *f;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    f = ngx_http_fastcgi_split(r, flcf);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = f->path_info.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = f->path_info.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_fastcgi_ctx_t *[m
[31m-ngx_http_fastcgi_split(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_ctx_t       *f;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                     n;[m
[31m-    int                           captures[(1 + 2) * 3];[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t));[m
[31m-        if (f == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, f, ngx_http_fastcgi_module);[m
[31m-    }[m
[31m-[m
[31m-    if (f->script_name.len) {[m
[31m-        return f;[m
[31m-    }[m
[31m-[m
[31m-    if (flcf->split_regex == NULL) {[m
[31m-        f->script_name = r->uri;[m
[31m-        return f;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_regex_exec(flcf->split_regex, &r->uri, captures, (1 + 2) * 3);[m
[31m-[m
[31m-    if (n >= 0) { /* match */[m
[31m-        f->script_name.len = captures[3] - captures[2];[m
[31m-        f->script_name.data = r->uri.data + captures[2];[m
[31m-[m
[31m-        f->path_info.len = captures[5] - captures[4];[m
[31m-        f->path_info.data = r->uri.data + captures[4];[m
[31m-[m
[31m-        return f;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_REGEX_NO_MATCHED) {[m
[31m-        f->script_name = r->uri;[m
[31m-        return f;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                  ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"",[m
[31m-                  n, &r->uri, &flcf->split_name);[m
[31m-    return NULL;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t));[m
[31m-        if (f == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, f, ngx_http_fastcgi_module);[m
[31m-    }[m
[31m-[m
[31m-    f->script_name = r->uri;[m
[31m-[m
[31m-    return f;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (flcf->upstream.upstream || flcf->fastcgi_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_fastcgi_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &flcf->fastcgi_lengths;[m
[31m-        sc.values = &flcf->fastcgi_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    flcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (flcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_split_path_info(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_regex_compile_t   rc;[m
[31m-    u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    flcf->split_name = value[1];[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = value[1];[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc.captures != 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "pattern \"%V\" must have 2 captures", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    flcf->split_regex = rc.regex;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "\"%V\" requires PCRE library", &cmd->name);[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (flcf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        flcf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (flcf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"fastcgi_cache\"";[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    flcf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &flcf->upstream.store_lengths;[m
[31m-    sc.values = &flcf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (flcf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        flcf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (flcf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"fastcgi_store\"";[m
[31m-    }[m
[31m-[m
[31m-    flcf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        flcf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (flcf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *flcf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    flcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                      &ngx_http_fastcgi_module);[m
[31m-    if (flcf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (flcf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &flcf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"fastcgi_send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"fastcgi_send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_flv_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_flv_module.c[m
[1mdeleted file mode 100644[m
[1mindex cc25320..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_flv_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,266 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_flv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-static ngx_command_t  ngx_http_flv_commands[] = {[m
[31m-[m
[31m-    { ngx_string("flv"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_flv,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_char  ngx_flv_header[] = "FLV\x1\x5\0\0\0\x9\0\0\0\0";[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_flv_module_ctx = {[m
[31m-    NULL,                          /* preconfiguration */[m
[31m-    NULL,                          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                          /* create main configuration */[m
[31m-    NULL,                          /* init main configuration */[m
[31m-[m
[31m-    NULL,                          /* create server configuration */[m
[31m-    NULL,                          /* merge server configuration */[m
[31m-[m
[31m-    NULL,                          /* create location configuration */[m
[31m-    NULL                           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_flv_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_flv_module_ctx,      /* module context */[m
[31m-    ngx_http_flv_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_flv_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *last;[m
[31m-    off_t                      start, len;[m
[31m-    size_t                     root;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 level, i;[m
[31m-    ngx_str_t                  path, value;[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out[2];[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root, 0);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    path.len = last - path.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "http flv filename: \"%V\"", &path);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-        case NGX_ENAMETOOLONG:[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_EACCES:[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-        case NGX_EMLINK:[m
[31m-        case NGX_ELOOP:[m
[31m-#endif[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {[m
[31m-            ngx_log_error(level, log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, path.data);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (!of.is_file) {[m
[31m-[m
[31m-        if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", path.data);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->root_tested = !r->error_page;[m
[31m-[m
[31m-    start = 0;[m
[31m-    len = of.size;[m
[31m-    i = 1;[m
[31m-[m
[31m-    if (r->args.len) {[m
[31m-[m
[31m-        if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) {[m
[31m-[m
[31m-            start = ngx_atoof(value.data, value.len);[m
[31m-[m
[31m-            if (start == NGX_ERROR || start >= len) {[m
[31m-                start = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (start) {[m
[31m-                len = sizeof(ngx_flv_header) - 1 + len - start;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    log->action = "sending flv to client";[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_length_n = len;[m
[31m-    r->headers_out.last_modified_time = of.mtime;[m
[31m-[m
[31m-    if (ngx_http_set_etag(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (i == 0) {[m
[31m-        b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = ngx_flv_header;[m
[31m-        b->last = ngx_flv_header + sizeof(ngx_flv_header) - 1;[m
[31m-        b->memory = 1;[m
[31m-[m
[31m-        out[0].buf = b;[m
[31m-        out[0].next = &out[1];[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = start;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = b->file_last ? 1: 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->name = path;[m
[31m-    b->file->log = log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    out[1].buf = b;[m
[31m-    out[1].next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out[i]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_flv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_flv_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_geo_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_geo_module.c[m
[1mdeleted file mode 100644[m
[1mindex 9b3c6cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_geo_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1644 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_variable_value_t       *value;[m
[31m-    u_short                          start;[m
[31m-    u_short                          end;[m
[31m-} ngx_http_geo_range_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_radix_tree_t                *tree;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_radix_tree_t                *tree6;[m
[31m-#endif[m
[31m-} ngx_http_geo_trees_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_geo_range_t           **low;[m
[31m-    ngx_http_variable_value_t       *default_value;[m
[31m-} ngx_http_geo_high_ranges_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_node_t                   sn;[m
[31m-    ngx_http_variable_value_t       *value;[m
[31m-    size_t                           offset;[m
[31m-} ngx_http_geo_variable_value_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_variable_value_t       *value;[m
[31m-    ngx_str_t                       *net;[m
[31m-    ngx_http_geo_high_ranges_t       high;[m
[31m-    ngx_radix_tree_t                *tree;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_radix_tree_t                *tree6;[m
[31m-#endif[m
[31m-    ngx_rbtree_t                     rbtree;[m
[31m-    ngx_rbtree_node_t                sentinel;[m
[31m-    ngx_array_t                     *proxies;[m
[31m-    ngx_pool_t                      *pool;[m
[31m-    ngx_pool_t                      *temp_pool;[m
[31m-[m
[31m-    size_t                           data_size;[m
[31m-[m
[31m-    ngx_str_t                        include_name;[m
[31m-    ngx_uint_t                       includes;[m
[31m-    ngx_uint_t                       entries;[m
[31m-[m
[31m-    unsigned                         ranges:1;[m
[31m-    unsigned                         outside_entries:1;[m
[31m-    unsigned                         allow_binary_include:1;[m
[31m-    unsigned                         binary_include:1;[m
[31m-    unsigned                         proxy_recursive:1;[m
[31m-} ngx_http_geo_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    union {[m
[31m-        ngx_http_geo_trees_t         trees;[m
[31m-        ngx_http_geo_high_ranges_t   high;[m
[31m-    } u;[m
[31m-[m
[31m-    ngx_array_t                     *proxies;[m
[31m-    unsigned                         proxy_recursive:1;[m
[31m-[m
[31m-    ngx_int_t                        index;[m
[31m-} ngx_http_geo_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_geo_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr);[m
[31m-static ngx_int_t ngx_http_geo_real_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr);[m
[31m-static char *ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);[m
[31m-static char *ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value);[m
[31m-static char *ngx_http_geo_add_range(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end);[m
[31m-static ngx_uint_t ngx_http_geo_delete_range(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end);[m
[31m-static char *ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value);[m
[31m-static char *ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net);[m
[31m-static ngx_http_variable_value_t *ngx_http_geo_value(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *value);[m
[31m-static char *ngx_http_geo_add_proxy(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, ngx_cidr_t *cidr);[m
[31m-static ngx_int_t ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net,[m
[31m-    ngx_cidr_t *cidr);[m
[31m-static char *ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_geo_include_binary_base(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *name);[m
[31m-static void ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx);[m
[31m-static u_char *ngx_http_geo_copy_values(u_char *base, u_char *p,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_geo_commands[] = {[m
[31m-[m
[31m-    { ngx_string("geo"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,[m
[31m-      ngx_http_geo_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_geo_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_geo_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_geo_module_ctx,              /* module context */[m
[31m-    ngx_http_geo_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    GEORNG[6];[m
[31m-    u_char    version;[m
[31m-    u_char    ptr_size;[m
[31m-    uint32_t  endianness;[m
[31m-    uint32_t  crc32;[m
[31m-} ngx_http_geo_header_t;[m
[31m-[m
[31m-[m
[31m-static ngx_http_geo_header_t  ngx_http_geo_header = {[m
[31m-    { 'G', 'E', 'O', 'R', 'N', 'G' }, 0, sizeof(void *), 0x12345678, 0[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* geo range is AF_INET only */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_cidr_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data;[m
[31m-[m
[31m-    in_addr_t                   inaddr;[m
[31m-    ngx_addr_t                  addr;[m
[31m-    struct sockaddr_in         *sin;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                     *p;[m
[31m-    struct in6_addr            *inaddr6;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_geo_addr(r, ctx, &addr) != NGX_OK) {[m
[31m-        vv = (ngx_http_variable_value_t *)[m
[31m-                  ngx_radix32tree_find(ctx->u.trees.tree, INADDR_NONE);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    switch (addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;[m
[31m-        p = inaddr6->s6_addr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-            inaddr = p[12] << 24;[m
[31m-            inaddr += p[13] << 16;[m
[31m-            inaddr += p[14] << 8;[m
[31m-            inaddr += p[15];[m
[31m-[m
[31m-            vv = (ngx_http_variable_value_t *)[m
[31m-                      ngx_radix32tree_find(ctx->u.trees.tree, inaddr);[m
[31m-[m
[31m-        } else {[m
[31m-            vv = (ngx_http_variable_value_t *)[m
[31m-                      ngx_radix128tree_find(ctx->u.trees.tree6, p);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) addr.sockaddr;[m
[31m-        inaddr = ntohl(sin->sin_addr.s_addr);[m
[31m-[m
[31m-        vv = (ngx_http_variable_value_t *)[m
[31m-                  ngx_radix32tree_find(ctx->u.trees.tree, inaddr);[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    *v = *vv;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http geo: %v", v);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_range_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data;[m
[31m-[m
[31m-    in_addr_t              inaddr;[m
[31m-    ngx_addr_t             addr;[m
[31m-    ngx_uint_t             n;[m
[31m-    struct sockaddr_in    *sin;[m
[31m-    ngx_http_geo_range_t  *range;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                *p;[m
[31m-    struct in6_addr       *inaddr6;[m
[31m-#endif[m
[31m-[m
[31m-    *v = *ctx->u.high.default_value;[m
[31m-[m
[31m-    if (ngx_http_geo_addr(r, ctx, &addr) == NGX_OK) {[m
[31m-[m
[31m-        switch (addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;[m
[31m-[m
[31m-            if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-                p = inaddr6->s6_addr;[m
[31m-[m
[31m-                inaddr = p[12] << 24;[m
[31m-                inaddr += p[13] << 16;[m
[31m-                inaddr += p[14] << 8;[m
[31m-                inaddr += p[15];[m
[31m-[m
[31m-            } else {[m
[31m-                inaddr = INADDR_NONE;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) addr.sockaddr;[m
[31m-            inaddr = ntohl(sin->sin_addr.s_addr);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        inaddr = INADDR_NONE;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->u.high.low) {[m
[31m-        range = ctx->u.high.low[inaddr >> 16];[m
[31m-[m
[31m-        if (range) {[m
[31m-            n = inaddr & 0xffff;[m
[31m-            do {[m
[31m-                if (n >= (ngx_uint_t) range->start[m
[31m-                    && n <= (ngx_uint_t) range->end)[m
[31m-                {[m
[31m-                    *v = *range->value;[m
[31m-                    break;[m
[31m-                }[m
[31m-            } while ((++range)->value);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http geo: %v", v);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx,[m
[31m-    ngx_addr_t *addr)[m
[31m-{[m
[31m-    ngx_array_t  *xfwd;[m
[31m-[m
[31m-    if (ngx_http_geo_real_addr(r, ctx, addr) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    xfwd = &r->headers_in.x_forwarded_for;[m
[31m-[m
[31m-    if (xfwd->nelts > 0 && ctx->proxies != NULL) {[m
[31m-        (void) ngx_http_get_forwarded_addr(r, addr, xfwd, NULL,[m
[31m-                                           ctx->proxies, ctx->proxy_recursive);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_real_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx,[m
[31m-    ngx_addr_t *addr)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *v;[m
[31m-[m
[31m-    if (ctx->index == -1) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http geo started: %V", &r->connection->addr_text);[m
[31m-[m
[31m-        addr->sockaddr = r->connection->sockaddr;[m
[31m-        addr->socklen = r->connection->socklen;[m
[31m-        /* addr->name = r->connection->addr_text; */[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v = ngx_http_get_flushed_variable(r, ctx->index);[m
[31m-[m
[31m-    if (v == NULL || v->not_found) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http geo not found");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http geo started: %v", v);[m
[31m-[m
[31m-    if (ngx_parse_addr(r->pool, addr, v->data, v->len) == NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                     *rv;[m
[31m-    size_t                    len;[m
[31m-    ngx_str_t                *value, name;[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_conf_t                save;[m
[31m-    ngx_pool_t               *pool;[m
[31m-    ngx_array_t              *a;[m
[31m-    ngx_http_variable_t      *var;[m
[31m-    ngx_http_geo_ctx_t       *geo;[m
[31m-    ngx_http_geo_conf_ctx_t   ctx;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    static struct in6_addr    zero;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    geo = ngx_palloc(cf->pool, sizeof(ngx_http_geo_ctx_t));[m
[31m-    if (geo == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name = value[1];[m
[31m-[m
[31m-    if (name.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name.len--;[m
[31m-    name.data++;[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-[m
[31m-        geo->index = ngx_http_get_variable_index(cf, &name);[m
[31m-        if (geo->index == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name = value[2];[m
[31m-[m
[31m-        if (name.data[0] != '$') {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid variable name \"%V\"", &name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name.len--;[m
[31m-        name.data++;[m
[31m-[m
[31m-    } else {[m
[31m-        geo->index = -1;[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ctx, sizeof(ngx_http_geo_conf_ctx_t));[m
[31m-[m
[31m-    ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);[m
[31m-    if (ctx.temp_pool == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(&ctx.rbtree, &ctx.sentinel, ngx_str_rbtree_insert_value);[m
[31m-[m
[31m-    ctx.pool = cf->pool;[m
[31m-    ctx.data_size = sizeof(ngx_http_geo_header_t)[m
[31m-                  + sizeof(ngx_http_variable_value_t)[m
[31m-                  + 0x10000 * sizeof(ngx_http_geo_range_t *);[m
[31m-    ctx.allow_binary_include = 1;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->pool = pool;[m
[31m-    cf->ctx = &ctx;[m
[31m-    cf->handler = ngx_http_geo;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    geo->proxies = ctx.proxies;[m
[31m-    geo->proxy_recursive = ctx.proxy_recursive;[m
[31m-[m
[31m-    if (ctx.ranges) {[m
[31m-[m
[31m-        if (ctx.high.low && !ctx.binary_include) {[m
[31m-            for (i = 0; i < 0x10000; i++) {[m
[31m-                a = (ngx_array_t *) ctx.high.low[i];[m
[31m-[m
[31m-                if (a == NULL || a->nelts == 0) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                len = a->nelts * sizeof(ngx_http_geo_range_t);[m
[31m-[m
[31m-                ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *));[m
[31m-                if (ctx.high.low[i] == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(ctx.high.low[i], a->elts, len);[m
[31m-                ctx.high.low[i][a->nelts].value = NULL;[m
[31m-                ctx.data_size += len + sizeof(void *);[m
[31m-            }[m
[31m-[m
[31m-            if (ctx.allow_binary_include[m
[31m-                && !ctx.outside_entries[m
[31m-                && ctx.entries > 100000[m
[31m-                && ctx.includes == 1)[m
[31m-            {[m
[31m-                ngx_http_geo_create_binary_base(&ctx);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ctx.high.default_value == NULL) {[m
[31m-            ctx.high.default_value = &ngx_http_variable_null_value;[m
[31m-        }[m
[31m-[m
[31m-        geo->u.high = ctx.high;[m
[31m-[m
[31m-        var->get_handler = ngx_http_geo_range_variable;[m
[31m-        var->data = (uintptr_t) geo;[m
[31m-[m
[31m-        ngx_destroy_pool(ctx.temp_pool);[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-    } else {[m
[31m-        if (ctx.tree == NULL) {[m
[31m-            ctx.tree = ngx_radix_tree_create(cf->pool, -1);[m
[31m-            if (ctx.tree == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        geo->u.trees.tree = ctx.tree;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (ctx.tree6 == NULL) {[m
[31m-            ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);[m
[31m-            if (ctx.tree6 == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        geo->u.trees.tree6 = ctx.tree6;[m
[31m-#endif[m
[31m-[m
[31m-        var->get_handler = ngx_http_geo_cidr_variable;[m
[31m-        var->data = (uintptr_t) geo;[m
[31m-[m
[31m-        ngx_destroy_pool(ctx.temp_pool);[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-        if (ngx_radix32tree_insert(ctx.tree, 0, 0,[m
[31m-                                   (uintptr_t) &ngx_http_variable_null_value)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_BUSY is okay (default was set explicitly) */[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (ngx_radix128tree_insert(ctx.tree6, zero.s6_addr, zero.s6_addr,[m
[31m-                                    (uintptr_t) &ngx_http_variable_null_value)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    char                     *rv;[m
[31m-    ngx_str_t                *value;[m
[31m-    ngx_cidr_t                cidr;[m
[31m-    ngx_http_geo_conf_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = cf->ctx;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 1) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[0].data, "ranges") == 0) {[m
[31m-[m
[31m-            if (ctx->tree[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-                || ctx->tree6[m
[31m-#endif[m
[31m-               )[m
[31m-            {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"ranges\" directive must be "[m
[31m-                                   "the first directive inside \"geo\" block");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ctx->ranges = 1;[m
[31m-[m
[31m-            rv = NGX_CONF_OK;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        else if (ngx_strcmp(value[0].data, "proxy_recursive") == 0) {[m
[31m-            ctx->proxy_recursive = 1;[m
[31m-            rv = NGX_CONF_OK;[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts != 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number of the geo parameters");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "include") == 0) {[m
[31m-[m
[31m-        rv = ngx_http_geo_include(cf, ctx, &value[1]);[m
[31m-[m
[31m-        goto done;[m
[31m-[m
[31m-    } else if (ngx_strcmp(value[0].data, "proxy") == 0) {[m
[31m-[m
[31m-        if (ngx_http_geo_cidr_value(cf, &value[1], &cidr) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        rv = ngx_http_geo_add_proxy(cf, ctx, &cidr);[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ranges) {[m
[31m-        rv = ngx_http_geo_range(cf, ctx, value);[m
[31m-[m
[31m-    } else {[m
[31m-        rv = ngx_http_geo_cidr(cf, ctx, value);[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_reset_pool(cf->pool);[m
[31m-[m
[31m-    return rv;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_reset_pool(cf->pool);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    u_char      *p, *last;[m
[31m-    in_addr_t    start, end;[m
[31m-    ngx_str_t   *net;[m
[31m-    ngx_uint_t   del;[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "default") == 0) {[m
[31m-[m
[31m-        if (ctx->high.default_value) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                "duplicate default geo range value: \"%V\", old value: \"%v\"",[m
[31m-                &value[1], ctx->high.default_value);[m
[31m-        }[m
[31m-[m
[31m-        ctx->high.default_value = ngx_http_geo_value(cf, ctx, &value[1]);[m
[31m-        if (ctx->high.default_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->binary_include) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "binary geo range base \"%s\" cannot be mixed with usual entries",[m
[31m-            ctx->include_name.data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->high.low == NULL) {[m
[31m-        ctx->high.low = ngx_pcalloc(ctx->pool,[m
[31m-                                    0x10000 * sizeof(ngx_http_geo_range_t *));[m
[31m-        if (ctx->high.low == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->entries++;[m
[31m-    ctx->outside_entries = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "delete") == 0) {[m
[31m-        net = &value[1];[m
[31m-        del = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        net = &value[0];[m
[31m-        del = 0;[m
[31m-    }[m
[31m-[m
[31m-    last = net->data + net->len;[m
[31m-[m
[31m-    p = ngx_strlchr(net->data, last, '-');[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    start = ngx_inet_addr(net->data, p - net->data);[m
[31m-[m
[31m-    if (start == INADDR_NONE) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    start = ntohl(start);[m
[31m-[m
[31m-    p++;[m
[31m-[m
[31m-    end = ngx_inet_addr(p, last - p);[m
[31m-[m
[31m-    if (end == INADDR_NONE) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    end = ntohl(end);[m
[31m-[m
[31m-    if (start > end) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (del) {[m
[31m-        if (ngx_http_geo_delete_range(cf, ctx, start, end)) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "no address range \"%V\" to delete", net);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->value = ngx_http_geo_value(cf, ctx, &value[1]);[m
[31m-[m
[31m-    if (ctx->value == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->net = net;[m
[31m-[m
[31m-    return ngx_http_geo_add_range(cf, ctx, start, end);[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid range \"%V\"", net);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* the add procedure is optimized to add a growing up sequence */[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_add_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    in_addr_t start, in_addr_t end)[m
[31m-{[m
[31m-    in_addr_t              n;[m
[31m-    ngx_uint_t             h, i, s, e;[m
[31m-    ngx_array_t           *a;[m
[31m-    ngx_http_geo_range_t  *range;[m
[31m-[m
[31m-    for (n = start; n <= end; n = (n + 0x10000) & 0xffff0000) {[m
[31m-[m
[31m-        h = n >> 16;[m
[31m-[m
[31m-        if (n == start) {[m
[31m-            s = n & 0xffff;[m
[31m-        } else {[m
[31m-            s = 0;[m
[31m-        }[m
[31m-[m
[31m-        if ((n | 0xffff) > end) {[m
[31m-            e = end & 0xffff;[m
[31m-[m
[31m-        } else {[m
[31m-            e = 0xffff;[m
[31m-        }[m
[31m-[m
[31m-        a = (ngx_array_t *) ctx->high.low[h];[m
[31m-[m
[31m-        if (a == NULL) {[m
[31m-            a = ngx_array_create(ctx->temp_pool, 64,[m
[31m-                                 sizeof(ngx_http_geo_range_t));[m
[31m-            if (a == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->high.low[h] = (ngx_http_geo_range_t *) a;[m
[31m-        }[m
[31m-[m
[31m-        i = a->nelts;[m
[31m-        range = a->elts;[m
[31m-[m
[31m-        while (i) {[m
[31m-[m
[31m-            i--;[m
[31m-[m
[31m-            if (e < (ngx_uint_t) range[i].start) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (s > (ngx_uint_t) range[i].end) {[m
[31m-[m
[31m-                /* add after the range */[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = a->elts;[m
[31m-[m
[31m-                ngx_memmove(&range[i + 2], &range[i + 1],[m
[31m-                           (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                range[i + 1].start = (u_short) s;[m
[31m-                range[i + 1].end = (u_short) e;[m
[31m-                range[i + 1].value = ctx->value;[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (s == (ngx_uint_t) range[i].start[m
[31m-                && e == (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                    "duplicate range \"%V\", value: \"%v\", old value: \"%v\"",[m
[31m-                    ctx->net, ctx->value, range[i].value);[m
[31m-[m
[31m-                range[i].value = ctx->value;[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (s > (ngx_uint_t) range[i].start[m
[31m-                && e < (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                /* split the range and insert the new one */[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = a->elts;[m
[31m-[m
[31m-                ngx_memmove(&range[i + 3], &range[i + 1],[m
[31m-                           (a->nelts - 3 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                range[i + 2].start = (u_short) (e + 1);[m
[31m-                range[i + 2].end = range[i].end;[m
[31m-                range[i + 2].value = range[i].value;[m
[31m-[m
[31m-                range[i + 1].start = (u_short) s;[m
[31m-                range[i + 1].end = (u_short) e;[m
[31m-                range[i + 1].value = ctx->value;[m
[31m-[m
[31m-                range[i].end = (u_short) (s - 1);[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (s == (ngx_uint_t) range[i].start[m
[31m-                && e < (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                /* shift the range start and insert the new range */[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = a->elts;[m
[31m-[m
[31m-                ngx_memmove(&range[i + 1], &range[i],[m
[31m-                           (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                range[i + 1].start = (u_short) (e + 1);[m
[31m-[m
[31m-                range[i].start = (u_short) s;[m
[31m-                range[i].end = (u_short) e;[m
[31m-                range[i].value = ctx->value;[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (s > (ngx_uint_t) range[i].start[m
[31m-                && e == (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                /* shift the range end and insert the new range */[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = a->elts;[m
[31m-[m
[31m-                ngx_memmove(&range[i + 2], &range[i + 1],[m
[31m-                           (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                range[i + 1].start = (u_short) s;[m
[31m-                range[i + 1].end = (u_short) e;[m
[31m-                range[i + 1].value = ctx->value;[m
[31m-[m
[31m-                range[i].end = (u_short) (s - 1);[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            s = (ngx_uint_t) range[i].start;[m
[31m-            e = (ngx_uint_t) range[i].end;[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                         "range \"%V\" overlaps \"%d.%d.%d.%d-%d.%d.%d.%d\"",[m
[31m-                         ctx->net,[m
[31m-                         h >> 8, h & 0xff, s >> 8, s & 0xff,[m
[31m-                         h >> 8, h & 0xff, e >> 8, e & 0xff);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* add the first range */[m
[31m-[m
[31m-        range = ngx_array_push(a);[m
[31m-        if (range == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        range->start = (u_short) s;[m
[31m-        range->end = (u_short) e;[m
[31m-        range->value = ctx->value;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_geo_delete_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    in_addr_t start, in_addr_t end)[m
[31m-{[m
[31m-    in_addr_t              n;[m
[31m-    ngx_uint_t             h, i, s, e, warn;[m
[31m-    ngx_array_t           *a;[m
[31m-    ngx_http_geo_range_t  *range;[m
[31m-[m
[31m-    warn = 0;[m
[31m-[m
[31m-    for (n = start; n <= end; n += 0x10000) {[m
[31m-[m
[31m-        h = n >> 16;[m
[31m-[m
[31m-        if (n == start) {[m
[31m-            s = n & 0xffff;[m
[31m-        } else {[m
[31m-            s = 0;[m
[31m-        }[m
[31m-[m
[31m-        if ((n | 0xffff) > end) {[m
[31m-            e = end & 0xffff;[m
[31m-[m
[31m-        } else {[m
[31m-            e = 0xffff;[m
[31m-        }[m
[31m-[m
[31m-        a = (ngx_array_t *) ctx->high.low[h];[m
[31m-[m
[31m-        if (a == NULL) {[m
[31m-            warn = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        range = a->elts;[m
[31m-        for (i = 0; i < a->nelts; i++) {[m
[31m-[m
[31m-            if (s == (ngx_uint_t) range[i].start[m
[31m-                && e == (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                ngx_memmove(&range[i], &range[i + 1],[m
[31m-                           (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                a->nelts--;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (s != (ngx_uint_t) range[i].start[m
[31m-                && e != (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            warn = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return warn;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_int_t    rc, del;[m
[31m-    ngx_str_t   *net;[m
[31m-    ngx_cidr_t   cidr;[m
[31m-[m
[31m-    if (ctx->tree == NULL) {[m
[31m-        ctx->tree = ngx_radix_tree_create(ctx->pool, -1);[m
[31m-        if (ctx->tree == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (ctx->tree6 == NULL) {[m
[31m-        ctx->tree6 = ngx_radix_tree_create(ctx->pool, -1);[m
[31m-        if (ctx->tree6 == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "default") == 0) {[m
[31m-        cidr.family = AF_INET;[m
[31m-        cidr.u.in.addr = 0;[m
[31m-        cidr.u.in.mask = 0;[m
[31m-[m
[31m-        rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]);[m
[31m-[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        cidr.family = AF_INET6;[m
[31m-        ngx_memzero(&cidr.u.in6, sizeof(ngx_in6_cidr_t));[m
[31m-[m
[31m-        rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]);[m
[31m-[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "delete") == 0) {[m
[31m-        net = &value[1];[m
[31m-        del = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        net = &value[0];[m
[31m-        del = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_geo_cidr_value(cf, net, &cidr) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cidr.family == AF_INET) {[m
[31m-        cidr.u.in.addr = ntohl(cidr.u.in.addr);[m
[31m-        cidr.u.in.mask = ntohl(cidr.u.in.mask);[m
[31m-    }[m
[31m-[m
[31m-    if (del) {[m
[31m-        switch (cidr.family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            rc = ngx_radix128tree_delete(ctx->tree6,[m
[31m-                                         cidr.u.in6.addr.s6_addr,[m
[31m-                                         cidr.u.in6.mask.s6_addr);[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            rc = ngx_radix32tree_delete(ctx->tree, cidr.u.in.addr,[m
[31m-                                        cidr.u.in.mask);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "no network \"%V\" to delete", net);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], net);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_variable_value_t  *val, *old;[m
[31m-[m
[31m-    val = ngx_http_geo_value(cf, ctx, value);[m
[31m-[m
[31m-    if (val == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (cidr->family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr,[m
[31m-                                     cidr->u.in6.mask.s6_addr,[m
[31m-                                     (uintptr_t) val);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_BUSY */[m
[31m-[m
[31m-        old = (ngx_http_variable_value_t *)[m
[31m-                   ngx_radix128tree_find(ctx->tree6,[m
[31m-                                         cidr->u.in6.addr.s6_addr);[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-              "duplicate network \"%V\", value: \"%v\", old value: \"%v\"",[m
[31m-              net, val, old);[m
[31m-[m
[31m-        rc = ngx_radix128tree_delete(ctx->tree6,[m
[31m-                                     cidr->u.in6.addr.s6_addr,[m
[31m-                                     cidr->u.in6.mask.s6_addr);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr,[m
[31m-                                     cidr->u.in6.mask.s6_addr,[m
[31m-                                     (uintptr_t) val);[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr,[m
[31m-                                    cidr->u.in.mask, (uintptr_t) val);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_BUSY */[m
[31m-[m
[31m-        old = (ngx_http_variable_value_t *)[m
[31m-                   ngx_radix32tree_find(ctx->tree, cidr->u.in.addr);[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-              "duplicate network \"%V\", value: \"%v\", old value: \"%v\"",[m
[31m-              net, val, old);[m
[31m-[m
[31m-        rc = ngx_radix32tree_delete(ctx->tree,[m
[31m-                                    cidr->u.in.addr, cidr->u.in.mask);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr,[m
[31m-                                    cidr->u.in.mask, (uintptr_t) val);[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_value_t *[m
[31m-ngx_http_geo_value(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    uint32_t                             hash;[m
[31m-    ngx_http_variable_value_t           *val;[m
[31m-    ngx_http_geo_variable_value_node_t  *gvvn;[m
[31m-[m
[31m-    hash = ngx_crc32_long(value->data, value->len);[m
[31m-[m
[31m-    gvvn = (ngx_http_geo_variable_value_node_t *)[m
[31m-               ngx_str_rbtree_lookup(&ctx->rbtree, value, hash);[m
[31m-[m
[31m-    if (gvvn) {[m
[31m-        return gvvn->value;[m
[31m-    }[m
[31m-[m
[31m-    val = ngx_palloc(ctx->pool, sizeof(ngx_http_variable_value_t));[m
[31m-    if (val == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    val->len = value->len;[m
[31m-    val->data = ngx_pstrdup(ctx->pool, value);[m
[31m-    if (val->data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    val->valid = 1;[m
[31m-    val->no_cacheable = 0;[m
[31m-    val->not_found = 0;[m
[31m-[m
[31m-    gvvn = ngx_palloc(ctx->temp_pool,[m
[31m-                      sizeof(ngx_http_geo_variable_value_node_t));[m
[31m-    if (gvvn == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    gvvn->sn.node.key = hash;[m
[31m-    gvvn->sn.str.len = val->len;[m
[31m-    gvvn->sn.str.data = val->data;[m
[31m-    gvvn->value = val;[m
[31m-    gvvn->offset = 0;[m
[31m-[m
[31m-    ngx_rbtree_insert(&ctx->rbtree, &gvvn->sn.node);[m
[31m-[m
[31m-    ctx->data_size += ngx_align(sizeof(ngx_http_variable_value_t) + value->len,[m
[31m-                                sizeof(void *));[m
[31m-[m
[31m-    return val;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_add_proxy(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_cidr_t *cidr)[m
[31m-{[m
[31m-    ngx_cidr_t  *c;[m
[31m-[m
[31m-    if (ctx->proxies == NULL) {[m
[31m-        ctx->proxies = ngx_array_create(ctx->pool, 4, sizeof(ngx_cidr_t));[m
[31m-        if (ctx->proxies == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_array_push(ctx->proxies);[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *c = *cidr;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (ngx_strcmp(net->data, "255.255.255.255") == 0) {[m
[31m-        cidr->family = AF_INET;[m
[31m-        cidr->u.in.addr = 0xffffffff;[m
[31m-        cidr->u.in.mask = 0xffffffff;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_ptocidr(net, cidr);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "low address bits of %V are meaningless", net);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    char       *rv;[m
[31m-    ngx_str_t   file;[m
[31m-[m
[31m-    file.len = name->len + 4;[m
[31m-    file.data = ngx_pnalloc(ctx->temp_pool, name->len + 5);[m
[31m-    if (file.data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(file.data, "%V.bin%Z", name);[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ranges) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-        switch (ngx_http_geo_include_binary_base(cf, ctx, &file)) {[m
[31m-        case NGX_OK:[m
[31m-            return NGX_CONF_OK;[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        default:[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    file.len -= 4;[m
[31m-    file.data[file.len] = '\0';[m
[31m-[m
[31m-    ctx->include_name = file;[m
[31m-[m
[31m-    if (ctx->outside_entries) {[m
[31m-        ctx->allow_binary_include = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, &file);[m
[31m-[m
[31m-    ctx->includes++;[m
[31m-    ctx->outside_entries = 0;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_include_binary_base(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    u_char                     *base, ch;[m
[31m-    time_t                      mtime;[m
[31m-    size_t                      size, len;[m
[31m-    ssize_t                     n;[m
[31m-    uint32_t                    crc32;[m
[31m-    ngx_err_t                   err;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_file_t                  file;[m
[31m-    ngx_file_info_t             fi;[m
[31m-    ngx_http_geo_range_t       *range, **ranges;[m
[31m-    ngx_http_geo_header_t      *header;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-    file.name = *name;[m
[31m-    file.log = cf->log;[m
[31m-[m
[31m-    file.fd = ngx_open_file(name->data, NGX_FILE_RDONLY, 0, 0);[m
[31m-    if (file.fd == NGX_INVALID_FILE) {[m
[31m-        err = ngx_errno;[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, err,[m
[31m-                               ngx_open_file_n " \"%s\" failed", name->data);[m
[31m-        }[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->outside_entries) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "binary geo range base \"%s\" cannot be mixed with usual entries",[m
[31m-            name->data);[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->binary_include) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "second binary geo range base \"%s\" cannot be mixed with \"%s\"",[m
[31m-            name->data, ctx->include_name.data);[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                           ngx_fd_info_n " \"%s\" failed", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    size = (size_t) ngx_file_size(&fi);[m
[31m-    mtime = ngx_file_mtime(&fi);[m
[31m-[m
[31m-    ch = name->data[name->len - 4];[m
[31m-    name->data[name->len - 4] = '\0';[m
[31m-[m
[31m-    if (ngx_file_info(name->data, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                           ngx_file_info_n " \"%s\" failed", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    name->data[name->len - 4] = ch;[m
[31m-[m
[31m-    if (mtime < ngx_file_mtime(&fi)) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "stale binary geo range base \"%s\"", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    base = ngx_palloc(ctx->pool, size);[m
[31m-    if (base == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_file(&file, base, size, 0);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                           ngx_read_file_n " \"%s\" failed", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_CRIT, cf, 0,[m
[31m-            ngx_read_file_n " \"%s\" returned only %z bytes instead of %z",[m
[31m-            name->data, n, size);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    header = (ngx_http_geo_header_t *) base;[m
[31m-[m
[31m-    if (size < 16 || ngx_memcmp(&ngx_http_geo_header, header, 12) != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-             "incompatible binary geo range base \"%s\"", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_crc32_init(crc32);[m
[31m-[m
[31m-    vv = (ngx_http_variable_value_t *) (base + sizeof(ngx_http_geo_header_t));[m
[31m-[m
[31m-    while (vv->data) {[m
[31m-        len = ngx_align(sizeof(ngx_http_variable_value_t) + vv->len,[m
[31m-                        sizeof(void *));[m
[31m-        ngx_crc32_update(&crc32, (u_char *) vv, len);[m
[31m-        vv->data += (size_t) base;[m
[31m-        vv = (ngx_http_variable_value_t *) ((u_char *) vv + len);[m
[31m-    }[m
[31m-    ngx_crc32_update(&crc32, (u_char *) vv, sizeof(ngx_http_variable_value_t));[m
[31m-    vv++;[m
[31m-[m
[31m-    ranges = (ngx_http_geo_range_t **) vv;[m
[31m-[m
[31m-    for (i = 0; i < 0x10000; i++) {[m
[31m-        ngx_crc32_update(&crc32, (u_char *) &ranges[i], sizeof(void *));[m
[31m-        if (ranges[i]) {[m
[31m-            ranges[i] = (ngx_http_geo_range_t *)[m
[31m-                            ((u_char *) ranges[i] + (size_t) base);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    range = (ngx_http_geo_range_t *) &ranges[0x10000];[m
[31m-[m
[31m-    while ((u_char *) range < base + size) {[m
[31m-        while (range->value) {[m
[31m-            ngx_crc32_update(&crc32, (u_char *) range,[m
[31m-                             sizeof(ngx_http_geo_range_t));[m
[31m-            range->value = (ngx_http_variable_value_t *)[m
[31m-                               ((u_char *) range->value + (size_t) base);[m
[31m-            range++;[m
[31m-        }[m
[31m-        ngx_crc32_update(&crc32, (u_char *) range, sizeof(void *));[m
[31m-        range = (ngx_http_geo_range_t *) ((u_char *) range + sizeof(void *));[m
[31m-    }[m
[31m-[m
[31m-    ngx_crc32_final(crc32);[m
[31m-[m
[31m-    if (crc32 != header->crc32) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                  "CRC32 mismatch in binary geo range base \"%s\"", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_NOTICE, cf, 0,[m
[31m-                       "using binary geo range base \"%s\"", name->data);[m
[31m-[m
[31m-    ctx->include_name = *name;[m
[31m-    ctx->binary_include = 1;[m
[31m-    ctx->high.low = ranges;[m
[31m-    rc = NGX_OK;[m
[31m-[m
[31m-    goto done;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", name->data);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char                              *p;[m
[31m-    uint32_t                             hash;[m
[31m-    ngx_str_t                            s;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_file_mapping_t                   fm;[m
[31m-    ngx_http_geo_range_t                *r, *range, **ranges;[m
[31m-    ngx_http_geo_header_t               *header;[m
[31m-    ngx_http_geo_variable_value_node_t  *gvvn;[m
[31m-[m
[31m-    fm.name = ngx_pnalloc(ctx->temp_pool, ctx->include_name.len + 5);[m
[31m-    if (fm.name == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(fm.name, "%V.bin%Z", &ctx->include_name);[m
[31m-[m
[31m-    fm.size = ctx->data_size;[m
[31m-    fm.log = ctx->pool->log;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, fm.log, 0,[m
[31m-                  "creating binary geo range base \"%s\"", fm.name);[m
[31m-[m
[31m-    if (ngx_create_file_mapping(&fm) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(fm.addr, &ngx_http_geo_header,[m
[31m-                   sizeof(ngx_http_geo_header_t));[m
[31m-[m
[31m-    p = ngx_http_geo_copy_values(fm.addr, p, ctx->rbtree.root,[m
[31m-                                 ctx->rbtree.sentinel);[m
[31m-[m
[31m-    p += sizeof(ngx_http_variable_value_t);[m
[31m-[m
[31m-    ranges = (ngx_http_geo_range_t **) p;[m
[31m-[m
[31m-    p += 0x10000 * sizeof(ngx_http_geo_range_t *);[m
[31m-[m
[31m-    for (i = 0; i < 0x10000; i++) {[m
[31m-        r = ctx->high.low[i];[m
[31m-        if (r == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        range = (ngx_http_geo_range_t *) p;[m
[31m-        ranges[i] = (ngx_http_geo_range_t *) (p - (u_char *) fm.addr);[m
[31m-[m
[31m-        do {[m
[31m-            s.len = r->value->len;[m
[31m-            s.data = r->value->data;[m
[31m-            hash = ngx_crc32_long(s.data, s.len);[m
[31m-            gvvn = (ngx_http_geo_variable_value_node_t *)[m
[31m-                        ngx_str_rbtree_lookup(&ctx->rbtree, &s, hash);[m
[31m-[m
[31m-            range->value = (ngx_http_variable_value_t *) gvvn->offset;[m
[31m-            range->start = r->start;[m
[31m-            range->end = r->end;[m
[31m-            range++;[m
[31m-[m
[31m-        } while ((++r)->value);[m
[31m-[m
[31m-        range->value = NULL;[m
[31m-[m
[31m-        p = (u_char *) range + sizeof(void *);[m
[31m-    }[m
[31m-[m
[31m-    header = fm.addr;[m
[31m-    header->crc32 = ngx_crc32_long((u_char *) fm.addr[m
[31m-                                       + sizeof(ngx_http_geo_header_t),[m
[31m-                                   fm.size - sizeof(ngx_http_geo_header_t));[m
[31m-[m
[31m-    ngx_close_file_mapping(&fm);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_geo_copy_values(u_char *base, u_char *p, ngx_rbtree_node_t *node,[m
[31m-    ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_http_variable_value_t           *vv;[m
[31m-    ngx_http_geo_variable_value_node_t  *gvvn;[m
[31m-[m
[31m-    if (node == sentinel) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    gvvn = (ngx_http_geo_variable_value_node_t *) node;[m
[31m-    gvvn->offset = p - base;[m
[31m-[m
[31m-    vv = (ngx_http_variable_value_t *) p;[m
[31m-    *vv = *gvvn->value;[m
[31m-    p += sizeof(ngx_http_variable_value_t);[m
[31m-    vv->data = (u_char *) (p - base);[m
[31m-[m
[31m-    p = ngx_cpymem(p, gvvn->sn.str.data, gvvn->sn.str.len);[m
[31m-[m
[31m-    p = ngx_align_ptr(p, sizeof(void *));[m
[31m-[m
[31m-    p = ngx_http_geo_copy_values(base, p, node->left, sentinel);[m
[31m-[m
[31m-    return ngx_http_geo_copy_values(base, p, node->right, sentinel);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_geoip_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_geoip_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8e151aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_geoip_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,925 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <GeoIP.h>[m
[31m-#include <GeoIPCity.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_GEOIP_COUNTRY_CODE   0[m
[31m-#define NGX_GEOIP_COUNTRY_CODE3  1[m
[31m-#define NGX_GEOIP_COUNTRY_NAME   2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    GeoIP        *country;[m
[31m-    GeoIP        *org;[m
[31m-    GeoIP        *city;[m
[31m-    ngx_array_t  *proxies;    /* array of ngx_cidr_t */[m
[31m-    ngx_flag_t    proxy_recursive;[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    unsigned      country_v6:1;[m
[31m-    unsigned      org_v6:1;[m
[31m-    unsigned      city_v6:1;[m
[31m-#endif[m
[31m-} ngx_http_geoip_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t    *name;[m
[31m-    uintptr_t     data;[m
[31m-} ngx_http_geoip_var_t;[m
[31m-[m
[31m-[m
[31m-typedef const char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *,[m
[31m-    u_long addr);[m
[31m-[m
[31m-[m
[31m-ngx_http_geoip_variable_handler_pt ngx_http_geoip_country_functions[] = {[m
[31m-    GeoIP_country_code_by_ipnum,[m
[31m-    GeoIP_country_code3_by_ipnum,[m
[31m-    GeoIP_country_name_by_ipnum,[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-[m
[31m-typedef const char *(*ngx_http_geoip_variable_handler_v6_pt)(GeoIP *,[m
[31m-    geoipv6_t addr);[m
[31m-[m
[31m-[m
[31m-ngx_http_geoip_variable_handler_v6_pt ngx_http_geoip_country_v6_functions[] = {[m
[31m-    GeoIP_country_code_by_ipnum_v6,[m
[31m-    GeoIP_country_code3_by_ipnum_v6,[m
[31m-    GeoIP_country_name_by_ipnum_v6,[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_org_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_region_name_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_city_float_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_city_int_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf);[m
[31m-static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net,[m
[31m-    ngx_cidr_t *cidr);[m
[31m-static void ngx_http_geoip_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_geoip_commands[] = {[m
[31m-[m
[31m-    { ngx_string("geoip_country"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_geoip_country,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("geoip_org"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_geoip_org,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("geoip_city"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_geoip_city,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("geoip_proxy"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_geoip_proxy,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("geoip_proxy_recursive"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_geoip_conf_t, proxy_recursive),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_geoip_module_ctx = {[m
[31m-    ngx_http_geoip_add_variables,          /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_geoip_create_conf,            /* create main configuration */[m
[31m-    ngx_http_geoip_init_conf,              /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_geoip_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_geoip_module_ctx,            /* module context */[m
[31m-    ngx_http_geoip_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_geoip_vars[] = {[m
[31m-[m
[31m-    { ngx_string("geoip_country_code"), NULL,[m
[31m-      ngx_http_geoip_country_variable,[m
[31m-      NGX_GEOIP_COUNTRY_CODE, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_country_code3"), NULL,[m
[31m-      ngx_http_geoip_country_variable,[m
[31m-      NGX_GEOIP_COUNTRY_CODE3, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_country_name"), NULL,[m
[31m-      ngx_http_geoip_country_variable,[m
[31m-      NGX_GEOIP_COUNTRY_NAME, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_org"), NULL,[m
[31m-      ngx_http_geoip_org_variable,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city_continent_code"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, continent_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city_country_code"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, country_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city_country_code3"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, country_code3), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city_country_name"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, country_name), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_region"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, region), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_region_name"), NULL,[m
[31m-      ngx_http_geoip_region_name_variable,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, city), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_postal_code"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, postal_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_latitude"), NULL,[m
[31m-      ngx_http_geoip_city_float_variable,[m
[31m-      offsetof(GeoIPRecord, latitude), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_longitude"), NULL,[m
[31m-      ngx_http_geoip_city_float_variable,[m
[31m-      offsetof(GeoIPRecord, longitude), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_dma_code"), NULL,[m
[31m-      ngx_http_geoip_city_int_variable,[m
[31m-      offsetof(GeoIPRecord, dma_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_area_code"), NULL,[m
[31m-      ngx_http_geoip_city_int_variable,[m
[31m-      offsetof(GeoIPRecord, area_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_long[m
[31m-ngx_http_geoip_addr(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf)[m
[31m-{[m
[31m-    ngx_addr_t           addr;[m
[31m-    ngx_array_t         *xfwd;[m
[31m-    struct sockaddr_in  *sin;[m
[31m-[m
[31m-    addr.sockaddr = r->connection->sockaddr;[m
[31m-    addr.socklen = r->connection->socklen;[m
[31m-    /* addr.name = r->connection->addr_text; */[m
[31m-[m
[31m-    xfwd = &r->headers_in.x_forwarded_for;[m
[31m-[m
[31m-    if (xfwd->nelts > 0 && gcf->proxies != NULL) {[m
[31m-        (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL,[m
[31m-                                           gcf->proxies, gcf->proxy_recursive);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    if (addr.sockaddr->sa_family == AF_INET6) {[m
[31m-        u_char           *p;[m
[31m-        in_addr_t         inaddr;[m
[31m-        struct in6_addr  *inaddr6;[m
[31m-[m
[31m-        inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-            p = inaddr6->s6_addr;[m
[31m-[m
[31m-            inaddr = p[12] << 24;[m
[31m-            inaddr += p[13] << 16;[m
[31m-            inaddr += p[14] << 8;[m
[31m-            inaddr += p[15];[m
[31m-[m
[31m-            return inaddr;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (addr.sockaddr->sa_family != AF_INET) {[m
[31m-        return INADDR_NONE;[m
[31m-    }[m
[31m-[m
[31m-    sin = (struct sockaddr_in *) addr.sockaddr;[m
[31m-    return ntohl(sin->sin_addr.s_addr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-[m
[31m-static geoipv6_t[m
[31m-ngx_http_geoip_addr_v6(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf)[m
[31m-{[m
[31m-    ngx_addr_t            addr;[m
[31m-    ngx_array_t          *xfwd;[m
[31m-    in_addr_t             addr4;[m
[31m-    struct in6_addr       addr6;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-    addr.sockaddr = r->connection->sockaddr;[m
[31m-    addr.socklen = r->connection->socklen;[m
[31m-    /* addr.name = r->connection->addr_text; */[m
[31m-[m
[31m-    xfwd = &r->headers_in.x_forwarded_for;[m
[31m-[m
[31m-    if (xfwd->nelts > 0 && gcf->proxies != NULL) {[m
[31m-        (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL,[m
[31m-                                           gcf->proxies, gcf->proxy_recursive);[m
[31m-    }[m
[31m-[m
[31m-    switch (addr.sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        /* Produce IPv4-mapped IPv6 address. */[m
[31m-        sin = (struct sockaddr_in *) addr.sockaddr;[m
[31m-        addr4 = ntohl(sin->sin_addr.s_addr);[m
[31m-[m
[31m-        ngx_memzero(&addr6, sizeof(struct in6_addr));[m
[31m-        addr6.s6_addr[10] = 0xff;[m
[31m-        addr6.s6_addr[11] = 0xff;[m
[31m-        addr6.s6_addr[12] = addr4 >> 24;[m
[31m-        addr6.s6_addr[13] = addr4 >> 16;[m
[31m-        addr6.s6_addr[14] = addr4 >> 8;[m
[31m-        addr6.s6_addr[15] = addr4;[m
[31m-        return addr6;[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) addr.sockaddr;[m
[31m-        return sin6->sin6_addr;[m
[31m-[m
[31m-    default:[m
[31m-        return in6addr_any;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_country_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_geoip_variable_handler_pt     handler =[m
[31m-        ngx_http_geoip_country_functions[data];[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    ngx_http_geoip_variable_handler_v6_pt  handler_v6 =[m
[31m-        ngx_http_geoip_country_v6_functions[data];[m
[31m-#endif[m
[31m-[m
[31m-    const char             *val;[m
[31m-    ngx_http_geoip_conf_t  *gcf;[m
[31m-[m
[31m-    gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);[m
[31m-[m
[31m-    if (gcf->country == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    val = gcf->country_v6[m
[31m-              ? handler_v6(gcf->country, ngx_http_geoip_addr_v6(r, gcf))[m
[31m-              : handler(gcf->country, ngx_http_geoip_addr(r, gcf));[m
[31m-#else[m
[31m-    val = handler(gcf->country, ngx_http_geoip_addr(r, gcf));[m
[31m-#endif[m
[31m-[m
[31m-    if (val == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_strlen(val);[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) val;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_org_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t                  len;[m
[31m-    char                   *val;[m
[31m-    ngx_http_geoip_conf_t  *gcf;[m
[31m-[m
[31m-    gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);[m
[31m-[m
[31m-    if (gcf->org == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    val = gcf->org_v6[m
[31m-              ? GeoIP_name_by_ipnum_v6(gcf->org,[m
[31m-                                       ngx_http_geoip_addr_v6(r, gcf))[m
[31m-              : GeoIP_name_by_ipnum(gcf->org,[m
[31m-                                    ngx_http_geoip_addr(r, gcf));[m
[31m-#else[m
[31m-    val = GeoIP_name_by_ipnum(gcf->org, ngx_http_geoip_addr(r, gcf));[m
[31m-#endif[m
[31m-[m
[31m-    if (val == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(val);[m
[31m-    v->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (v->data == NULL) {[m
[31m-        ngx_free(val);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(v->data, val, len);[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ngx_free(val);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_city_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    char         *val;[m
[31m-    size_t        len;[m
[31m-    GeoIPRecord  *gr;[m
[31m-[m
[31m-    gr = ngx_http_geoip_get_city_record(r);[m
[31m-    if (gr == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    val = *(char **) ((char *) gr + data);[m
[31m-    if (val == NULL) {[m
[31m-        goto no_value;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(val);[m
[31m-    v->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (v->data == NULL) {[m
[31m-        GeoIPRecord_delete(gr);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(v->data, val, len);[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-no_value:[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_region_name_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t        len;[m
[31m-    const char   *val;[m
[31m-    GeoIPRecord  *gr;[m
[31m-[m
[31m-    gr = ngx_http_geoip_get_city_record(r);[m
[31m-    if (gr == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    val = GeoIP_region_name_by_code(gr->country_code, gr->region);[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-    if (val == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(val);[m
[31m-    v->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(v->data, val, len);[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_city_float_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    float         val;[m
[31m-    GeoIPRecord  *gr;[m
[31m-[m
[31m-    gr = ngx_http_geoip_get_city_record(r);[m
[31m-    if (gr == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN + 5);[m
[31m-    if (v->data == NULL) {[m
[31m-        GeoIPRecord_delete(gr);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    val = *(float *) ((char *) gr + data);[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%.4f", val) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_city_int_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    int           val;[m
[31m-    GeoIPRecord  *gr;[m
[31m-[m
[31m-    gr = ngx_http_geoip_get_city_record(r);[m
[31m-    if (gr == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        GeoIPRecord_delete(gr);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    val = *(int *) ((char *) gr + data);[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%d", val) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static GeoIPRecord *[m
[31m-ngx_http_geoip_get_city_record(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf;[m
[31m-[m
[31m-    gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);[m
[31m-[m
[31m-    if (gcf->city) {[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-        return gcf->city_v6[m
[31m-                   ? GeoIP_record_by_ipnum_v6(gcf->city,[m
[31m-                                              ngx_http_geoip_addr_v6(r, gcf))[m
[31m-                   : GeoIP_record_by_ipnum(gcf->city,[m
[31m-                                           ngx_http_geoip_addr(r, gcf));[m
[31m-#else[m
[31m-        return GeoIP_record_by_ipnum(gcf->city, ngx_http_geoip_addr(r, gcf));[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_geoip_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_geoip_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_http_geoip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->proxy_recursive = NGX_CONF_UNSET;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_geoip_cleanup;[m
[31m-    cln->data = conf;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_value(gcf->proxy_recursive, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (gcf->country) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    gcf->country = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);[m
[31m-[m
[31m-    if (gcf->country == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "GeoIP_open(\"%V\") failed", &value[1]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        if (ngx_strcmp(value[2].data, "utf8") == 0) {[m
[31m-            GeoIP_set_charset(gcf->country, GEOIP_CHARSET_UTF8);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (gcf->country->databaseType) {[m
[31m-[m
[31m-    case GEOIP_COUNTRY_EDITION:[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    case GEOIP_COUNTRY_EDITION_V6:[m
[31m-[m
[31m-        gcf->country_v6 = 1;[m
[31m-        return NGX_CONF_OK;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid GeoIP database \"%V\" type:%d",[m
[31m-                           &value[1], gcf->country->databaseType);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (gcf->org) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    gcf->org = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);[m
[31m-[m
[31m-    if (gcf->org == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "GeoIP_open(\"%V\") failed", &value[1]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        if (ngx_strcmp(value[2].data, "utf8") == 0) {[m
[31m-            GeoIP_set_charset(gcf->org, GEOIP_CHARSET_UTF8);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (gcf->org->databaseType) {[m
[31m-[m
[31m-    case GEOIP_ISP_EDITION:[m
[31m-    case GEOIP_ORG_EDITION:[m
[31m-    case GEOIP_DOMAIN_EDITION:[m
[31m-    case GEOIP_ASNUM_EDITION:[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    case GEOIP_ISP_EDITION_V6:[m
[31m-    case GEOIP_ORG_EDITION_V6:[m
[31m-    case GEOIP_DOMAIN_EDITION_V6:[m
[31m-    case GEOIP_ASNUM_EDITION_V6:[m
[31m-[m
[31m-        gcf->org_v6 = 1;[m
[31m-        return NGX_CONF_OK;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid GeoIP database \"%V\" type:%d",[m
[31m-                           &value[1], gcf->org->databaseType);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (gcf->city) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    gcf->city = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);[m
[31m-[m
[31m-    if (gcf->city == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "GeoIP_open(\"%V\") failed", &value[1]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        if (ngx_strcmp(value[2].data, "utf8") == 0) {[m
[31m-            GeoIP_set_charset(gcf->city, GEOIP_CHARSET_UTF8);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (gcf->city->databaseType) {[m
[31m-[m
[31m-    case GEOIP_CITY_EDITION_REV0:[m
[31m-    case GEOIP_CITY_EDITION_REV1:[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    case GEOIP_CITY_EDITION_REV0_V6:[m
[31m-    case GEOIP_CITY_EDITION_REV1_V6:[m
[31m-[m
[31m-        gcf->city_v6 = 1;[m
[31m-        return NGX_CONF_OK;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid GeoIP City database \"%V\" type:%d",[m
[31m-                           &value[1], gcf->city->databaseType);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_cidr_t  cidr, *c;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_http_geoip_cidr_value(cf, &value[1], &cidr) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (gcf->proxies == NULL) {[m
[31m-        gcf->proxies = ngx_array_create(cf->pool, 4, sizeof(ngx_cidr_t));[m
[31m-        if (gcf->proxies == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_array_push(gcf->proxies);[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *c = cidr;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (ngx_strcmp(net->data, "255.255.255.255") == 0) {[m
[31m-        cidr->family = AF_INET;[m
[31m-        cidr->u.in.addr = 0xffffffff;[m
[31m-        cidr->u.in.mask = 0xffffffff;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_ptocidr(net, cidr);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "low address bits of %V are meaningless", net);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_geoip_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = data;[m
[31m-[m
[31m-    if (gcf->country) {[m
[31m-        GeoIP_delete(gcf->country);[m
[31m-    }[m
[31m-[m
[31m-    if (gcf->org) {[m
[31m-        GeoIP_delete(gcf->org);[m
[31m-    }[m
[31m-[m
[31m-    if (gcf->city) {[m
[31m-        GeoIP_delete(gcf->city);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gunzip_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gunzip_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex c1341f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gunzip_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,687 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <zlib.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t           enable;[m
[31m-    ngx_bufs_t           bufs;[m
[31m-} ngx_http_gunzip_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t         *in;[m
[31m-    ngx_chain_t         *free;[m
[31m-    ngx_chain_t         *busy;[m
[31m-    ngx_chain_t         *out;[m
[31m-    ngx_chain_t        **last_out;[m
[31m-[m
[31m-    ngx_buf_t           *in_buf;[m
[31m-    ngx_buf_t           *out_buf;[m
[31m-    ngx_int_t            bufs;[m
[31m-[m
[31m-    unsigned             started:1;[m
[31m-    unsigned             flush:4;[m
[31m-    unsigned             redo:1;[m
[31m-    unsigned             done:1;[m
[31m-    unsigned             nomem:1;[m
[31m-[m
[31m-    z_stream             zstream;[m
[31m-    ngx_http_request_t  *request;[m
[31m-} ngx_http_gunzip_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gunzip_filter_inflate(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-[m
[31m-static void *ngx_http_gunzip_filter_alloc(void *opaque, u_int items,[m
[31m-    u_int size);[m
[31m-static void ngx_http_gunzip_filter_free(void *opaque, void *address);[m
[31m-[m
[31m-static ngx_int_t ngx_http_gunzip_filter_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_gunzip_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_gunzip_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_gunzip_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("gunzip"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gunzip_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gunzip_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gunzip_conf_t, bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_gunzip_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_gunzip_filter_init,           /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_gunzip_create_conf,           /* create location configuration */[m
[31m-    ngx_http_gunzip_merge_conf             /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_gunzip_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_gunzip_filter_module_ctx,    /* module context */[m
[31m-    ngx_http_gunzip_filter_commands,       /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_gunzip_ctx_t   *ctx;[m
[31m-    ngx_http_gunzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module);[m
[31m-[m
[31m-    /* TODO support multiple content-codings */[m
[31m-    /* TODO always gunzip - due to configuration or module request */[m
[31m-    /* TODO ignore content encoding? */[m
[31m-[m
[31m-    if (!conf->enable[m
[31m-        || r->headers_out.content_encoding == NULL[m
[31m-        || r->headers_out.content_encoding->value.len != 4[m
[31m-        || ngx_strncasecmp(r->headers_out.content_encoding->value.data,[m
[31m-                           (u_char *) "gzip", 4) != 0)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    r->gzip_vary = 1;[m
[31m-[m
[31m-    if (!r->gzip_tested) {[m
[31m-        if (ngx_http_gzip_ok(r) == NGX_OK) {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-    } else if (r->gzip_ok) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gunzip_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_gunzip_filter_module);[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    r->headers_out.content_encoding->hash = 0;[m
[31m-    r->headers_out.content_encoding = NULL;[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_weak_etag(r);[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    int                     rc;[m
[31m-    ngx_uint_t              flush;[m
[31m-    ngx_chain_t            *cl;[m
[31m-    ngx_http_gunzip_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_gunzip_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->done) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http gunzip filter");[m
[31m-[m
[31m-    if (!ctx->started) {[m
[31m-        if (ngx_http_gunzip_filter_inflate_start(r, ctx) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->nomem) {[m
[31m-[m
[31m-        /* flush busy buffers */[m
[31m-[m
[31m-        if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        cl = NULL;[m
[31m-[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_gunzip_filter_module);[m
[31m-        ctx->nomem = 0;[m
[31m-        flush = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        flush = ctx->busy ? 1 : 0;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /* cycle while we can write to a client */[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            /* cycle while there is data to feed zlib and ... */[m
[31m-[m
[31m-            rc = ngx_http_gunzip_filter_add_data(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            /* ... there are buffers to write zlib output */[m
[31m-[m
[31m-            rc = ngx_http_gunzip_filter_get_buf(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_gunzip_filter_inflate(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->out == NULL && !flush) {[m
[31m-            return ctx->busy ? NGX_AGAIN : NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_gunzip_filter_module);[m
[31m-        ctx->last_out = &ctx->out;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "gunzip out: %p", ctx->out);[m
[31m-[m
[31m-        ctx->nomem = 0;[m
[31m-        flush = 0;[m
[31m-[m
[31m-        if (ctx->done) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* unreachable */[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int  rc;[m
[31m-[m
[31m-    ctx->zstream.next_in = Z_NULL;[m
[31m-    ctx->zstream.avail_in = 0;[m
[31m-[m
[31m-    ctx->zstream.zalloc = ngx_http_gunzip_filter_alloc;[m
[31m-    ctx->zstream.zfree = ngx_http_gunzip_filter_free;[m
[31m-    ctx->zstream.opaque = ctx;[m
[31m-[m
[31m-    /* windowBits +16 to decode gzip, zlib 1.2.0.4+ */[m
[31m-    rc = inflateInit2(&ctx->zstream, MAX_WBITS + 16);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "inflateInit2() failed: %d", rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->started = 1;[m
[31m-[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-    ctx->flush = Z_NO_FLUSH;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gunzip in: %p", ctx->in);[m
[31m-[m
[31m-    if (ctx->in == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx->in_buf = ctx->in->buf;[m
[31m-    ctx->in = ctx->in->next;[m
[31m-[m
[31m-    ctx->zstream.next_in = ctx->in_buf->pos;[m
[31m-    ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gunzip in_buf:%p ni:%p ai:%ud",[m
[31m-                   ctx->in_buf,[m
[31m-                   ctx->zstream.next_in, ctx->zstream.avail_in);[m
[31m-[m
[31m-    if (ctx->in_buf->last_buf || ctx->in_buf->last_in_chain) {[m
[31m-        ctx->flush = Z_FINISH;[m
[31m-[m
[31m-    } else if (ctx->in_buf->flush) {[m
[31m-        ctx->flush = Z_SYNC_FLUSH;[m
[31m-[m
[31m-    } else if (ctx->zstream.avail_in == 0) {[m
[31m-        /* ctx->flush == Z_NO_FLUSH */[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_gunzip_conf_t  *conf;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module);[m
[31m-[m
[31m-    if (ctx->free) {[m
[31m-        ctx->out_buf = ctx->free->buf;[m
[31m-        ctx->free = ctx->free->next;[m
[31m-[m
[31m-        ctx->out_buf->flush = 0;[m
[31m-[m
[31m-    } else if (ctx->bufs < conf->bufs.num) {[m
[31m-[m
[31m-        ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size);[m
[31m-        if (ctx->out_buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_gunzip_filter_module;[m
[31m-        ctx->out_buf->recycled = 1;[m
[31m-        ctx->bufs++;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->nomem = 1;[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx->zstream.next_out = ctx->out_buf->pos;[m
[31m-    ctx->zstream.avail_out = conf->bufs.size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_inflate(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "inflate in: ni:%p no:%p ai:%ud ao:%ud fl:%d redo:%d",[m
[31m-                   ctx->zstream.next_in, ctx->zstream.next_out,[m
[31m-                   ctx->zstream.avail_in, ctx->zstream.avail_out,[m
[31m-                   ctx->flush, ctx->redo);[m
[31m-[m
[31m-    rc = inflate(&ctx->zstream, ctx->flush);[m
[31m-[m
[31m-    if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "inflate() failed: %d, %d", ctx->flush, rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",[m
[31m-                   ctx->zstream.next_in, ctx->zstream.next_out,[m
[31m-                   ctx->zstream.avail_in, ctx->zstream.avail_out,[m
[31m-                   rc);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gunzip in_buf:%p pos:%p",[m
[31m-                   ctx->in_buf, ctx->in_buf->pos);[m
[31m-[m
[31m-    if (ctx->zstream.next_in) {[m
[31m-        ctx->in_buf->pos = ctx->zstream.next_in;[m
[31m-[m
[31m-        if (ctx->zstream.avail_in == 0) {[m
[31m-            ctx->zstream.next_in = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->out_buf->last = ctx->zstream.next_out;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out == 0) {[m
[31m-[m
[31m-        /* zlib wants to output some more data */[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ctx->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        ctx->redo = 1;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ctx->redo = 0;[m
[31m-[m
[31m-    if (ctx->flush == Z_SYNC_FLUSH) {[m
[31m-[m
[31m-        ctx->flush = Z_NO_FLUSH;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = ctx->out_buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) == 0) {[m
[31m-[m
[31m-            b = ngx_calloc_buf(ctx->request->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->zstream.avail_out = 0;[m
[31m-        }[m
[31m-[m
[31m-        b->flush = 1;[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->flush == Z_FINISH && ctx->zstream.avail_in == 0) {[m
[31m-[m
[31m-        if (rc != Z_STREAM_END) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "inflate() returned %d on response end", rc);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_gunzip_filter_inflate_end(r, ctx) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == Z_STREAM_END && ctx->zstream.avail_in > 0) {[m
[31m-[m
[31m-        rc = inflateReset(&ctx->zstream);[m
[31m-[m
[31m-        if (rc != Z_OK) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                          "inflateReset() failed: %d", rc);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->redo = 1;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->in == NULL) {[m
[31m-[m
[31m-        b = ctx->out_buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->zstream.avail_out = 0;[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gunzip inflate end");[m
[31m-[m
[31m-    rc = inflateEnd(&ctx->zstream);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "inflateEnd() failed: %d", rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = ctx->out_buf;[m
[31m-[m
[31m-    if (ngx_buf_size(b) == 0) {[m
[31m-[m
[31m-        b = ngx_calloc_buf(ctx->request->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-    *ctx->last_out = cl;[m
[31m-    ctx->last_out = &cl->next;[m
[31m-[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-    b->sync = 1;[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gunzip_filter_alloc(void *opaque, u_int items, u_int size)[m
[31m-{[m
[31m-    ngx_http_gunzip_ctx_t *ctx = opaque;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "gunzip alloc: n:%ud s:%ud",[m
[31m-                   items, size);[m
[31m-[m
[31m-    return ngx_palloc(ctx->request->pool, items * size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_gunzip_filter_free(void *opaque, void *address)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_http_gunzip_ctx_t *ctx = opaque;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "gunzip free: %p", address);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gunzip_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_gunzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gunzip_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->bufs.num = 0;[m
[31m-     */[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gunzip_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_gunzip_conf_t *prev = parent;[m
[31m-    ngx_http_gunzip_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->bufs, prev->bufs,[m
[31m-                              (128 * 1024) / ngx_pagesize, ngx_pagesize);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_gunzip_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_gunzip_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gzip_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gzip_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 536fdf8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gzip_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1235 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <zlib.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t           enable;[m
[31m-    ngx_flag_t           no_buffer;[m
[31m-[m
[31m-    ngx_hash_t           types;[m
[31m-[m
[31m-    ngx_bufs_t           bufs;[m
[31m-[m
[31m-    size_t               postpone_gzipping;[m
[31m-    ngx_int_t            level;[m
[31m-    size_t               wbits;[m
[31m-    size_t               memlevel;[m
[31m-    ssize_t              min_length;[m
[31m-[m
[31m-    ngx_array_t         *types_keys;[m
[31m-} ngx_http_gzip_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t         *in;[m
[31m-    ngx_chain_t         *free;[m
[31m-    ngx_chain_t         *busy;[m
[31m-    ngx_chain_t         *out;[m
[31m-    ngx_chain_t        **last_out;[m
[31m-[m
[31m-    ngx_chain_t         *copied;[m
[31m-    ngx_chain_t         *copy_buf;[m
[31m-[m
[31m-    ngx_buf_t           *in_buf;[m
[31m-    ngx_buf_t           *out_buf;[m
[31m-    ngx_int_t            bufs;[m
[31m-[m
[31m-    void                *preallocated;[m
[31m-    char                *free_mem;[m
[31m-    ngx_uint_t           allocated;[m
[31m-[m
[31m-    int                  wbits;[m
[31m-    int                  memlevel;[m
[31m-[m
[31m-    unsigned             flush:4;[m
[31m-    unsigned             redo:1;[m
[31m-    unsigned             done:1;[m
[31m-    unsigned             nomem:1;[m
[31m-    unsigned             gzheader:1;[m
[31m-    unsigned             buffering:1;[m
[31m-[m
[31m-    size_t               zin;[m
[31m-    size_t               zout;[m
[31m-[m
[31m-    uint32_t             crc32;[m
[31m-    z_stream             zstream;[m
[31m-    ngx_http_request_t  *request;[m
[31m-} ngx_http_gzip_ctx_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-struct gztrailer {[m
[31m-    uint32_t  crc32;[m
[31m-    uint32_t  zlen;[m
[31m-};[m
[31m-[m
[31m-#else /* NGX_HAVE_BIG_ENDIAN || !NGX_HAVE_NONALIGNED */[m
[31m-[m
[31m-struct gztrailer {[m
[31m-    u_char  crc32[4];[m
[31m-    u_char  zlen[4];[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void ngx_http_gzip_filter_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_buffer(ngx_http_gzip_ctx_t *ctx,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_gzip_filter_deflate_start(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_gzheader(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_add_data(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_deflate(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_deflate_end(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-[m
[31m-static void *ngx_http_gzip_filter_alloc(void *opaque, u_int items,[m
[31m-    u_int size);[m
[31m-static void ngx_http_gzip_filter_free(void *opaque, void *address);[m
[31m-static void ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-[m
[31m-static ngx_int_t ngx_http_gzip_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_gzip_ratio_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_gzip_filter_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_gzip_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_gzip_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static char *ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_gzip_hash(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_num_bounds_t  ngx_http_gzip_comp_level_bounds = {[m
[31m-    ngx_conf_check_num_bounds, 1, 9[m
[31m-};[m
[31m-[m
[31m-static ngx_conf_post_handler_pt  ngx_http_gzip_window_p = ngx_http_gzip_window;[m
[31m-static ngx_conf_post_handler_pt  ngx_http_gzip_hash_p = ngx_http_gzip_hash;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_gzip_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("gzip"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, types_keys),[m
[31m-      &ngx_http_html_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("gzip_comp_level"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, level),[m
[31m-      &ngx_http_gzip_comp_level_bounds },[m
[31m-[m
[31m-    { ngx_string("gzip_window"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, wbits),[m
[31m-      &ngx_http_gzip_window_p },[m
[31m-[m
[31m-    { ngx_string("gzip_hash"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, memlevel),[m
[31m-      &ngx_http_gzip_hash_p },[m
[31m-[m
[31m-    { ngx_string("postpone_gzipping"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, postpone_gzipping),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_no_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, no_buffer),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_min_length"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, min_length),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_gzip_filter_module_ctx = {[m
[31m-    ngx_http_gzip_add_variables,           /* preconfiguration */[m
[31m-    ngx_http_gzip_filter_init,             /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_gzip_create_conf,             /* create location configuration */[m
[31m-    ngx_http_gzip_merge_conf               /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_gzip_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_gzip_filter_module_ctx,      /* module context */[m
[31m-    ngx_http_gzip_filter_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_gzip_ratio = ngx_string("gzip_ratio");[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t       *h;[m
[31m-    ngx_http_gzip_ctx_t   *ctx;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (!conf->enable[m
[31m-        || (r->headers_out.status != NGX_HTTP_OK[m
[31m-            && r->headers_out.status != NGX_HTTP_FORBIDDEN[m
[31m-            && r->headers_out.status != NGX_HTTP_NOT_FOUND)[m
[31m-        || (r->headers_out.content_encoding[m
[31m-            && r->headers_out.content_encoding->value.len)[m
[31m-        || (r->headers_out.content_length_n != -1[m
[31m-            && r->headers_out.content_length_n < conf->min_length)[m
[31m-        || ngx_http_test_content_type(r, &conf->types) == NULL[m
[31m-        || r->header_only)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    r->gzip_vary = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-    {[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->gzip_disable_degradation && ngx_http_degraded(r)) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (!r->gzip_tested) {[m
[31m-        if (ngx_http_gzip_ok(r) != NGX_OK) {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-    } else if (!r->gzip_ok) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gzip_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-    ctx->buffering = (conf->postpone_gzipping != 0);[m
[31m-[m
[31m-    ngx_http_gzip_filter_memory(r, ctx);[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = 1;[m
[31m-    ngx_str_set(&h->key, "Content-Encoding");[m
[31m-    ngx_str_set(&h->value, "gzip");[m
[31m-    r->headers_out.content_encoding = h;[m
[31m-[m
[31m-    r->main_filter_need_in_memory = 1;[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_weak_etag(r);[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    int                   rc;[m
[31m-    ngx_uint_t            flush;[m
[31m-    ngx_chain_t          *cl;[m
[31m-    ngx_http_gzip_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->done || r->header_only) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http gzip filter");[m
[31m-[m
[31m-    if (ctx->buffering) {[m
[31m-[m
[31m-        /*[m
[31m-         * With default memory settings zlib starts to output gzipped data[m
[31m-         * only after it has got about 90K, so it makes sense to allocate[m
[31m-         * zlib memory (200-400K) only after we have enough data to compress.[m
[31m-         * Although we copy buffers, nevertheless for not big responses[m
[31m-         * this allows to allocate zlib memory, to compress and to output[m
[31m-         * the response in one step using hot CPU cache.[m
[31m-         */[m
[31m-[m
[31m-        if (in) {[m
[31m-            switch (ngx_http_gzip_filter_buffer(ctx, in)) {[m
[31m-[m
[31m-            case NGX_OK:[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            case NGX_DONE:[m
[31m-                in = NULL;[m
[31m-                break;[m
[31m-[m
[31m-            default:  /* NGX_ERROR */[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->buffering = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->preallocated == NULL) {[m
[31m-        if (ngx_http_gzip_filter_deflate_start(r, ctx) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->nomem) {[m
[31m-[m
[31m-        /* flush busy buffers */[m
[31m-[m
[31m-        if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        cl = NULL;[m
[31m-[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_gzip_filter_module);[m
[31m-        ctx->nomem = 0;[m
[31m-        flush = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        flush = ctx->busy ? 1 : 0;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /* cycle while we can write to a client */[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            /* cycle while there is data to feed zlib and ... */[m
[31m-[m
[31m-            rc = ngx_http_gzip_filter_add_data(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            /* ... there are buffers to write zlib output */[m
[31m-[m
[31m-            rc = ngx_http_gzip_filter_get_buf(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            rc = ngx_http_gzip_filter_deflate(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->out == NULL && !flush) {[m
[31m-            ngx_http_gzip_filter_free_copy_buf(r, ctx);[m
[31m-[m
[31m-            return ctx->busy ? NGX_AGAIN : NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!ctx->gzheader) {[m
[31m-            if (ngx_http_gzip_filter_gzheader(r, ctx) != NGX_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_gzip_filter_free_copy_buf(r, ctx);[m
[31m-[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_gzip_filter_module);[m
[31m-        ctx->last_out = &ctx->out;[m
[31m-[m
[31m-        ctx->nomem = 0;[m
[31m-        flush = 0;[m
[31m-[m
[31m-        if (ctx->done) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* unreachable */[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    if (ctx->preallocated) {[m
[31m-        deflateEnd(&ctx->zstream);[m
[31m-[m
[31m-        ngx_pfree(r->pool, ctx->preallocated);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_gzip_filter_free_copy_buf(r, ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_gzip_filter_memory(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int                    wbits, memlevel;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    wbits = conf->wbits;[m
[31m-    memlevel = conf->memlevel;[m
[31m-[m
[31m-    if (r->headers_out.content_length_n > 0) {[m
[31m-[m
[31m-        /* the actual zlib window size is smaller by 262 bytes */[m
[31m-[m
[31m-        while (r->headers_out.content_length_n < ((1 << (wbits - 1)) - 262)) {[m
[31m-            wbits--;[m
[31m-            memlevel--;[m
[31m-        }[m
[31m-[m
[31m-        if (memlevel < 1) {[m
[31m-            memlevel = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->wbits = wbits;[m
[31m-    ctx->memlevel = memlevel;[m
[31m-[m
[31m-    /*[m
[31m-     * We preallocate a memory for zlib in one buffer (200K-400K), this[m
[31m-     * decreases a number of malloc() and free() calls and also probably[m
[31m-     * decreases a number of syscalls (sbrk()/mmap() and so on).[m
[31m-     * Besides we free the memory as soon as a gzipping will complete[m
[31m-     * and do not wait while a whole response will be sent to a client.[m
[31m-     *[m
[31m-     * 8K is for zlib deflate_state, it takes[m
[31m-     *  *) 5816 bytes on i386 and sparc64 (32-bit mode)[m
[31m-     *  *) 5920 bytes on amd64 and sparc64[m
[31m-     */[m
[31m-[m
[31m-    ctx->allocated = 8192 + (1 << (wbits + 2)) + (1 << (memlevel + 9));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_buffer(ngx_http_gzip_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                 size, buffered;[m
[31m-    ngx_buf_t             *b, *buf;[m
[31m-    ngx_chain_t           *cl, **ll;[m
[31m-    ngx_http_request_t    *r;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED;[m
[31m-[m
[31m-    buffered = 0;[m
[31m-    ll = &ctx->in;[m
[31m-[m
[31m-    for (cl = ctx->in; cl; cl = cl->next) {[m
[31m-        buffered += cl->buf->last - cl->buf->pos;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    while (in) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-[m
[31m-        size = b->last - b->pos;[m
[31m-        buffered += size;[m
[31m-[m
[31m-        if (b->flush || b->last_buf || buffered > conf->postpone_gzipping) {[m
[31m-            ctx->buffering = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->buffering && size) {[m
[31m-[m
[31m-            buf = ngx_create_temp_buf(r->pool, size);[m
[31m-            if (buf == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_cpymem(buf->pos, b->pos, size);[m
[31m-            b->pos = b->last;[m
[31m-[m
[31m-            buf->last_buf = b->last_buf;[m
[31m-            buf->tag = (ngx_buf_tag_t) &ngx_http_gzip_filter_module;[m
[31m-[m
[31m-            cl->buf = buf;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf = b;[m
[31m-        }[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    return ctx->buffering ? NGX_OK : NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_deflate_start(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int                    rc;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    ctx->preallocated = ngx_palloc(r->pool, ctx->allocated);[m
[31m-    if (ctx->preallocated == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->free_mem = ctx->preallocated;[m
[31m-[m
[31m-    ctx->zstream.zalloc = ngx_http_gzip_filter_alloc;[m
[31m-    ctx->zstream.zfree = ngx_http_gzip_filter_free;[m
[31m-    ctx->zstream.opaque = ctx;[m
[31m-[m
[31m-    rc = deflateInit2(&ctx->zstream, (int) conf->level, Z_DEFLATED,[m
[31m-                      - ctx->wbits, ctx->memlevel, Z_DEFAULT_STRATEGY);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "deflateInit2() failed: %d", rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-    ctx->crc32 = crc32(0L, Z_NULL, 0);[m
[31m-    ctx->flush = Z_NO_FLUSH;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_gzheader(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t      *b;[m
[31m-    ngx_chain_t    *cl;[m
[31m-    static u_char  gzheader[10] =[m
[31m-                               { 0x1f, 0x8b, Z_DEFLATED, 0, 0, 0, 0, 0, 0, 3 };[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-    b->pos = gzheader;[m
[31m-    b->last = b->pos + 10;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = ctx->out;[m
[31m-    ctx->out = cl;[m
[31m-[m
[31m-    ctx->gzheader = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_add_data(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gzip in: %p", ctx->in);[m
[31m-[m
[31m-    if (ctx->in == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->copy_buf) {[m
[31m-[m
[31m-        /*[m
[31m-         * to avoid CPU cache trashing we do not free() just quit buf,[m
[31m-         * but postpone free()ing after zlib compressing and data output[m
[31m-         */[m
[31m-[m
[31m-        ctx->copy_buf->next = ctx->copied;[m
[31m-        ctx->copied = ctx->copy_buf;[m
[31m-        ctx->copy_buf = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->in_buf = ctx->in->buf;[m
[31m-[m
[31m-    if (ctx->in_buf->tag == (ngx_buf_tag_t) &ngx_http_gzip_filter_module) {[m
[31m-        ctx->copy_buf = ctx->in;[m
[31m-    }[m
[31m-[m
[31m-    ctx->in = ctx->in->next;[m
[31m-[m
[31m-    ctx->zstream.next_in = ctx->in_buf->pos;[m
[31m-    ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gzip in_buf:%p ni:%p ai:%ud",[m
[31m-                   ctx->in_buf,[m
[31m-                   ctx->zstream.next_in, ctx->zstream.avail_in);[m
[31m-[m
[31m-    if (ctx->in_buf->last_buf) {[m
[31m-        ctx->flush = Z_FINISH;[m
[31m-[m
[31m-    } else if (ctx->in_buf->flush) {[m
[31m-        ctx->flush = Z_SYNC_FLUSH;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->zstream.avail_in) {[m
[31m-[m
[31m-        ctx->crc32 = crc32(ctx->crc32, ctx->zstream.next_in,[m
[31m-                           ctx->zstream.avail_in);[m
[31m-[m
[31m-    } else if (ctx->flush == Z_NO_FLUSH) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_get_buf(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (ctx->free) {[m
[31m-        ctx->out_buf = ctx->free->buf;[m
[31m-        ctx->free = ctx->free->next;[m
[31m-[m
[31m-    } else if (ctx->bufs < conf->bufs.num) {[m
[31m-[m
[31m-        ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size);[m
[31m-        if (ctx->out_buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_gzip_filter_module;[m
[31m-        ctx->out_buf->recycled = 1;[m
[31m-        ctx->bufs++;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->nomem = 1;[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx->zstream.next_out = ctx->out_buf->pos;[m
[31m-    ctx->zstream.avail_out = conf->bufs.size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int                    rc;[m
[31m-    ngx_buf_t             *b;[m
[31m-    ngx_chain_t           *cl;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                 "deflate in: ni:%p no:%p ai:%ud ao:%ud fl:%d redo:%d",[m
[31m-                 ctx->zstream.next_in, ctx->zstream.next_out,[m
[31m-                 ctx->zstream.avail_in, ctx->zstream.avail_out,[m
[31m-                 ctx->flush, ctx->redo);[m
[31m-[m
[31m-    rc = deflate(&ctx->zstream, ctx->flush);[m
[31m-[m
[31m-    if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "deflate() failed: %d, %d", ctx->flush, rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",[m
[31m-                   ctx->zstream.next_in, ctx->zstream.next_out,[m
[31m-                   ctx->zstream.avail_in, ctx->zstream.avail_out,[m
[31m-                   rc);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gzip in_buf:%p pos:%p",[m
[31m-                   ctx->in_buf, ctx->in_buf->pos);[m
[31m-[m
[31m-    if (ctx->zstream.next_in) {[m
[31m-        ctx->in_buf->pos = ctx->zstream.next_in;[m
[31m-[m
[31m-        if (ctx->zstream.avail_in == 0) {[m
[31m-            ctx->zstream.next_in = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->out_buf->last = ctx->zstream.next_out;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out == 0) {[m
[31m-[m
[31m-        /* zlib wants to output some more gzipped data */[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ctx->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        ctx->redo = 1;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ctx->redo = 0;[m
[31m-[m
[31m-    if (ctx->flush == Z_SYNC_FLUSH) {[m
[31m-[m
[31m-        ctx->flush = Z_NO_FLUSH;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = ctx->out_buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) == 0) {[m
[31m-[m
[31m-            b = ngx_calloc_buf(ctx->request->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->zstream.avail_out = 0;[m
[31m-        }[m
[31m-[m
[31m-        b->flush = 1;[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == Z_STREAM_END) {[m
[31m-[m
[31m-        if (ngx_http_gzip_filter_deflate_end(r, ctx) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (conf->no_buffer && ctx->in == NULL) {[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ctx->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_deflate_end(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_chain_t       *cl;[m
[31m-    struct gztrailer  *trailer;[m
[31m-[m
[31m-    ctx->zin = ctx->zstream.total_in;[m
[31m-    ctx->zout = 10 + ctx->zstream.total_out + 8;[m
[31m-[m
[31m-    rc = deflateEnd(&ctx->zstream);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "deflateEnd() failed: %d", rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_pfree(r->pool, ctx->preallocated);[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ctx->out_buf;[m
[31m-    cl->next = NULL;[m
[31m-    *ctx->last_out = cl;[m
[31m-    ctx->last_out = &cl->next;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out >= 8) {[m
[31m-        trailer = (struct gztrailer *) ctx->out_buf->last;[m
[31m-        ctx->out_buf->last += 8;[m
[31m-        ctx->out_buf->last_buf = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        b = ngx_create_temp_buf(r->pool, 8);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->last_buf = 1;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-        trailer = (struct gztrailer *) b->pos;[m
[31m-        b->last += 8;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-    trailer->crc32 = ctx->crc32;[m
[31m-    trailer->zlen = ctx->zin;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    trailer->crc32[0] = (u_char) (ctx->crc32 & 0xff);[m
[31m-    trailer->crc32[1] = (u_char) ((ctx->crc32 >> 8) & 0xff);[m
[31m-    trailer->crc32[2] = (u_char) ((ctx->crc32 >> 16) & 0xff);[m
[31m-    trailer->crc32[3] = (u_char) ((ctx->crc32 >> 24) & 0xff);[m
[31m-[m
[31m-    trailer->zlen[0] = (u_char) (ctx->zin & 0xff);[m
[31m-    trailer->zlen[1] = (u_char) ((ctx->zin >> 8) & 0xff);[m
[31m-    trailer->zlen[2] = (u_char) ((ctx->zin >> 16) & 0xff);[m
[31m-    trailer->zlen[3] = (u_char) ((ctx->zin >> 24) & 0xff);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ctx->zstream.avail_in = 0;[m
[31m-    ctx->zstream.avail_out = 0;[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gzip_filter_alloc(void *opaque, u_int items, u_int size)[m
[31m-{[m
[31m-    ngx_http_gzip_ctx_t *ctx = opaque;[m
[31m-[m
[31m-    void        *p;[m
[31m-    ngx_uint_t   alloc;[m
[31m-[m
[31m-    alloc = items * size;[m
[31m-[m
[31m-    if (alloc % 512 != 0 && alloc < 8192) {[m
[31m-[m
[31m-        /*[m
[31m-         * The zlib deflate_state allocation, it takes about 6K,[m
[31m-         * we allocate 8K.  Other allocations are divisible by 512.[m
[31m-         */[m
[31m-[m
[31m-        alloc = 8192;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc <= ctx->allocated) {[m
[31m-        p = ctx->free_mem;[m
[31m-        ctx->free_mem += alloc;[m
[31m-        ctx->allocated -= alloc;[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                       "gzip alloc: n:%ud s:%ud a:%ui p:%p",[m
[31m-                       items, size, alloc, p);[m
[31m-[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ctx->request->connection->log, 0,[m
[31m-                  "gzip filter failed to use preallocated memory: %ud of %ui",[m
[31m-                  items * size, ctx->allocated);[m
[31m-[m
[31m-    p = ngx_palloc(ctx->request->pool, items * size);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_gzip_filter_free(void *opaque, void *address)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_http_gzip_ctx_t *ctx = opaque;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "gzip free: %p", address);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    for (cl = ctx->copied; cl; cl = cl->next) {[m
[31m-        ngx_pfree(r->pool, cl->buf->start);[m
[31m-    }[m
[31m-[m
[31m-    ctx->copied = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_gzip_ratio, NGX_HTTP_VAR_NOHASH);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_gzip_ratio_variable;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_ratio_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t            zint, zfrac;[m
[31m-    ngx_http_gzip_ctx_t  *ctx;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->zout == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN + 3);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    zint = (ngx_uint_t) (ctx->zin / ctx->zout);[m
[31m-    zfrac = (ngx_uint_t) ((ctx->zin * 100 / ctx->zout) % 100);[m
[31m-[m
[31m-    if ((ctx->zin * 1000 / ctx->zout) % 10 > 4) {[m
[31m-[m
[31m-        /* the rounding, e.g., 2.125 to 2.13 */[m
[31m-[m
[31m-        zfrac++;[m
[31m-[m
[31m-        if (zfrac > 99) {[m
[31m-            zint++;[m
[31m-            zfrac = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%ui.%02ui", zint, zfrac) - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gzip_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gzip_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->bufs.num = 0;[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET;[m
[31m-    conf->no_buffer = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->postpone_gzipping = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->level = NGX_CONF_UNSET;[m
[31m-    conf->wbits = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->memlevel = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->min_length = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_gzip_conf_t *prev = parent;[m
[31m-    ngx_http_gzip_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_value(conf->no_buffer, prev->no_buffer, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->bufs, prev->bufs,[m
[31m-                              (128 * 1024) / ngx_pagesize, ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->postpone_gzipping, prev->postpone_gzipping,[m
[31m-                              0);[m
[31m-    ngx_conf_merge_value(conf->level, prev->level, 1);[m
[31m-    ngx_conf_merge_size_value(conf->wbits, prev->wbits, MAX_WBITS);[m
[31m-    ngx_conf_merge_size_value(conf->memlevel, prev->memlevel,[m
[31m-                              MAX_MEM_LEVEL - 1);[m
[31m-    ngx_conf_merge_value(conf->min_length, prev->min_length, 20);[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_html_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_gzip_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_gzip_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *np = data;[m
[31m-[m
[31m-    size_t  wbits, wsize;[m
[31m-[m
[31m-    wbits = 15;[m
[31m-[m
[31m-    for (wsize = 32 * 1024; wsize > 256; wsize >>= 1) {[m
[31m-[m
[31m-        if (wsize == *np) {[m
[31m-            *np = wbits;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        wbits--;[m
[31m-    }[m
[31m-[m
[31m-    return "must be 512, 1k, 2k, 4k, 8k, 16k, or 32k";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_hash(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *np = data;[m
[31m-[m
[31m-    size_t  memlevel, hsize;[m
[31m-[m
[31m-    memlevel = 9;[m
[31m-[m
[31m-    for (hsize = 128 * 1024; hsize > 256; hsize >>= 1) {[m
[31m-[m
[31m-        if (hsize == *np) {[m
[31m-            *np = memlevel;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        memlevel--;[m
[31m-    }[m
[31m-[m
[31m-    return "must be 512, 1k, 2k, 4k, 8k, 16k, 32k, 64k, or 128k";[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gzip_static_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gzip_static_module.c[m
[1mdeleted file mode 100644[m
[1mindex 4d54090..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_gzip_static_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,331 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_GZIP_STATIC_OFF     0[m
[31m-#define NGX_HTTP_GZIP_STATIC_ON      1[m
[31m-#define NGX_HTTP_GZIP_STATIC_ALWAYS  2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  enable;[m
[31m-} ngx_http_gzip_static_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_gzip_static_handler(ngx_http_request_t *r);[m
[31m-static void *ngx_http_gzip_static_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_gzip_static_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_gzip_static[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_GZIP_STATIC_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_GZIP_STATIC_ON },[m
[31m-    { ngx_string("always"), NGX_HTTP_GZIP_STATIC_ALWAYS },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_gzip_static_commands[] = {[m
[31m-[m
[31m-    { ngx_string("gzip_static"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_static_conf_t, enable),[m
[31m-      &ngx_http_gzip_static },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t  ngx_http_gzip_static_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_gzip_static_init,             /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_gzip_static_create_conf,      /* create location configuration */[m
[31m-    ngx_http_gzip_static_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_gzip_static_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_gzip_static_module_ctx,      /* module context */[m
[31m-    ngx_http_gzip_static_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_static_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        root;[m
[31m-    ngx_str_t                     path;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_uint_t                    level;[m
[31m-    ngx_log_t                    *log;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_chain_t                   out;[m
[31m-    ngx_table_elt_t              *h;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_gzip_static_conf_t  *gzcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    gzcf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_static_module);[m
[31m-[m
[31m-    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_OFF) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) {[m
[31m-        rc = ngx_http_gzip_ok(r);[m
[31m-[m
[31m-    } else {[m
[31m-        /* always */[m
[31m-        rc = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!clcf->gzip_vary && rc != NGX_OK) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    p = ngx_http_map_uri_to_path(r, &path, &root, sizeof(".gz") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '.';[m
[31m-    *p++ = 'g';[m
[31m-    *p++ = 'z';[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    path.len = p - path.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "http filename: \"%s\"", path.data);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-        case NGX_ENAMETOOLONG:[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        case NGX_EACCES:[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-        case NGX_EMLINK:[m
[31m-        case NGX_ELOOP:[m
[31m-#endif[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, log, of.err,[m
[31m-                      "%s \"%s\" failed", of.failed, path.data);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) {[m
[31m-        r->gzip_vary = 1;[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "http static fd: %d", of.fd);[m
[31m-[m
[31m-    if (of.is_dir) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http dir");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_WIN32) /* the not regular files are probably Unix specific */[m
[31m-[m
[31m-    if (!of.is_file) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, 0,[m
[31m-                      "\"%s\" is not a regular file", path.data);[m
[31m-[m
[31m-        return NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    r->root_tested = !r->error_page;[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    log->action = "sending response to client";[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_length_n = of.size;[m
[31m-    r->headers_out.last_modified_time = of.mtime;[m
[31m-[m
[31m-    if (ngx_http_set_etag(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = 1;[m
[31m-    ngx_str_set(&h->key, "Content-Encoding");[m
[31m-    ngx_str_set(&h->value, "gzip");[m
[31m-    r->headers_out.content_encoding = h;[m
[31m-[m
[31m-    /* we need to allocate all before the header would be sent */[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = 0;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = b->file_last ? 1 : 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->name = path;[m
[31m-    b->file->log = log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gzip_static_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_gzip_static_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_gzip_static_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_gzip_static_conf_t *prev = parent;[m
[31m-    ngx_http_gzip_static_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->enable, prev->enable,[m
[31m-                              NGX_HTTP_GZIP_STATIC_OFF);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_static_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_gzip_static_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_headers_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_headers_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6738afe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_headers_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,741 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_header_val_s  ngx_http_header_val_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_set_header_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_uint_t                 offset;[m
[31m-    ngx_http_set_header_pt     handler;[m
[31m-} ngx_http_set_header_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_header_val_s {[m
[31m-    ngx_http_complex_value_t   value;[m
[31m-    ngx_str_t                  key;[m
[31m-    ngx_http_set_header_pt     handler;[m
[31m-    ngx_uint_t                 offset;[m
[31m-    ngx_uint_t                 always;  /* unsigned  always:1 */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_EXPIRES_OFF,[m
[31m-    NGX_HTTP_EXPIRES_EPOCH,[m
[31m-    NGX_HTTP_EXPIRES_MAX,[m
[31m-    NGX_HTTP_EXPIRES_ACCESS,[m
[31m-    NGX_HTTP_EXPIRES_MODIFIED,[m
[31m-    NGX_HTTP_EXPIRES_DAILY,[m
[31m-    NGX_HTTP_EXPIRES_UNSET[m
[31m-} ngx_http_expires_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_expires_t         expires;[m
[31m-    time_t                     expires_time;[m
[31m-    ngx_http_complex_value_t  *expires_value;[m
[31m-    ngx_array_t               *headers;[m
[31m-} ngx_http_headers_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_expires(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_conf_t *conf);[m
[31m-static ngx_int_t ngx_http_parse_expires(ngx_str_t *value,[m
[31m-    ngx_http_expires_t *expires, time_t *expires_time, char **err);[m
[31m-static ngx_int_t ngx_http_add_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_add_header(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_response_header(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-static void *ngx_http_headers_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_headers_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_headers_filter_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_headers_add(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_set_header_t  ngx_http_set_headers[] = {[m
[31m-[m
[31m-    { ngx_string("Cache-Control"), 0, ngx_http_add_cache_control },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified),[m
[31m-                 ngx_http_set_last_modified },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 offsetof(ngx_http_headers_out_t, etag),[m
[31m-                 ngx_http_set_response_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_headers_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("expires"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE12,[m
[31m-      ngx_http_headers_expires,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-    { ngx_string("add_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE23,[m
[31m-      ngx_http_headers_add,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_headers_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_headers_filter_init,          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_headers_create_conf,          /* create location configuration */[m
[31m-    ngx_http_headers_merge_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_headers_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_headers_filter_module_ctx,   /* module context */[m
[31m-    ngx_http_headers_filter_commands,      /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                 value;[m
[31m-    ngx_uint_t                i, safe_status;[m
[31m-    ngx_http_header_val_t    *h;[m
[31m-    ngx_http_headers_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_filter_module);[m
[31m-[m
[31m-    if ((conf->expires == NGX_HTTP_EXPIRES_OFF && conf->headers == NULL)[m
[31m-        || r != r->main)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    switch (r->headers_out.status) {[m
[31m-[m
[31m-    case NGX_HTTP_OK:[m
[31m-    case NGX_HTTP_CREATED:[m
[31m-    case NGX_HTTP_NO_CONTENT:[m
[31m-    case NGX_HTTP_PARTIAL_CONTENT:[m
[31m-    case NGX_HTTP_MOVED_PERMANENTLY:[m
[31m-    case NGX_HTTP_MOVED_TEMPORARILY:[m
[31m-    case NGX_HTTP_SEE_OTHER:[m
[31m-    case NGX_HTTP_NOT_MODIFIED:[m
[31m-    case NGX_HTTP_TEMPORARY_REDIRECT:[m
[31m-        safe_status = 1;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        safe_status = 0;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->expires != NGX_HTTP_EXPIRES_OFF && safe_status) {[m
[31m-        if (ngx_http_set_expires(r, conf) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers) {[m
[31m-        h = conf->headers->elts;[m
[31m-        for (i = 0; i < conf->headers->nelts; i++) {[m
[31m-[m
[31m-            if (!safe_status && !h[i].always) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (h[i].handler(r, &h[i], &value) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_expires(ngx_http_request_t *r, ngx_http_headers_conf_t *conf)[m
[31m-{[m
[31m-    char                *err;[m
[31m-    size_t               len;[m
[31m-    time_t               now, expires_time, max_age;[m
[31m-    ngx_str_t            value;[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_table_elt_t     *e, *cc, **ccp;[m
[31m-    ngx_http_expires_t   expires;[m
[31m-[m
[31m-    expires = conf->expires;[m
[31m-    expires_time = conf->expires_time;[m
[31m-[m
[31m-    if (conf->expires_value != NULL) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, conf->expires_value, &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_parse_expires(&value, &expires, &expires_time, &err);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (expires == NGX_HTTP_EXPIRES_OFF) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    e = r->headers_out.expires;[m
[31m-[m
[31m-    if (e == NULL) {[m
[31m-[m
[31m-        e = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (e == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.expires = e;[m
[31m-[m
[31m-        e->hash = 1;[m
[31m-        ngx_str_set(&e->key, "Expires");[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT");[m
[31m-    e->value.len = len - 1;[m
[31m-[m
[31m-    ccp = r->headers_out.cache_control.elts;[m
[31m-[m
[31m-    if (ccp == NULL) {[m
[31m-[m
[31m-        if (ngx_array_init(&r->headers_out.cache_control, r->pool,[m
[31m-                           1, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccp = ngx_array_push(&r->headers_out.cache_control);[m
[31m-        if (ccp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cc = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (cc == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cc->hash = 1;[m
[31m-        ngx_str_set(&cc->key, "Cache-Control");[m
[31m-        *ccp = cc;[m
[31m-[m
[31m-    } else {[m
[31m-        for (i = 1; i < r->headers_out.cache_control.nelts; i++) {[m
[31m-            ccp[i]->hash = 0;[m
[31m-        }[m
[31m-[m
[31m-        cc = ccp[0];[m
[31m-    }[m
[31m-[m
[31m-    if (expires == NGX_HTTP_EXPIRES_EPOCH) {[m
[31m-        e->value.data = (u_char *) "Thu, 01 Jan 1970 00:00:01 GMT";[m
[31m-        ngx_str_set(&cc->value, "no-cache");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (expires == NGX_HTTP_EXPIRES_MAX) {[m
[31m-        e->value.data = (u_char *) "Thu, 31 Dec 2037 23:55:55 GMT";[m
[31m-        /* 10 years */[m
[31m-        ngx_str_set(&cc->value, "max-age=315360000");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    e->value.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (e->value.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (expires_time == 0 && expires != NGX_HTTP_EXPIRES_DAILY) {[m
[31m-        ngx_memcpy(e->value.data, ngx_cached_http_time.data,[m
[31m-                   ngx_cached_http_time.len + 1);[m
[31m-        ngx_str_set(&cc->value, "max-age=0");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    if (expires == NGX_HTTP_EXPIRES_DAILY) {[m
[31m-        expires_time = ngx_next_time(expires_time);[m
[31m-        max_age = expires_time - now;[m
[31m-[m
[31m-    } else if (expires == NGX_HTTP_EXPIRES_ACCESS[m
[31m-               || r->headers_out.last_modified_time == -1)[m
[31m-    {[m
[31m-        max_age = expires_time;[m
[31m-        expires_time += now;[m
[31m-[m
[31m-    } else {[m
[31m-        expires_time += r->headers_out.last_modified_time;[m
[31m-        max_age = expires_time - now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_time(e->value.data, expires_time);[m
[31m-[m
[31m-    if (conf->expires_time < 0 || max_age < 0) {[m
[31m-        ngx_str_set(&cc->value, "no-cache");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cc->value.data = ngx_pnalloc(r->pool,[m
[31m-                                 sizeof("max-age=") + NGX_TIME_T_LEN + 1);[m
[31m-    if (cc->value.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cc->value.len = ngx_sprintf(cc->value.data, "max-age=%T", max_age)[m
[31m-                    - cc->value.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_parse_expires(ngx_str_t *value, ngx_http_expires_t *expires,[m
[31m-    time_t *expires_time, char **err)[m
[31m-{[m
[31m-    ngx_uint_t  minus;[m
[31m-[m
[31m-    if (*expires != NGX_HTTP_EXPIRES_MODIFIED) {[m
[31m-[m
[31m-        if (value->len == 5 && ngx_strncmp(value->data, "epoch", 5) == 0) {[m
[31m-            *expires = NGX_HTTP_EXPIRES_EPOCH;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (value->len == 3 && ngx_strncmp(value->data, "max", 3) == 0) {[m
[31m-            *expires = NGX_HTTP_EXPIRES_MAX;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (value->len == 3 && ngx_strncmp(value->data, "off", 3) == 0) {[m
[31m-            *expires = NGX_HTTP_EXPIRES_OFF;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (value->len && value->data[0] == '@') {[m
[31m-        value->data++;[m
[31m-        value->len--;[m
[31m-        minus = 0;[m
[31m-[m
[31m-        if (*expires == NGX_HTTP_EXPIRES_MODIFIED) {[m
[31m-            *err = "daily time cannot be used with \"modified\" parameter";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *expires = NGX_HTTP_EXPIRES_DAILY;[m
[31m-[m
[31m-    } else if (value->len && value->data[0] == '+') {[m
[31m-        value->data++;[m
[31m-        value->len--;[m
[31m-        minus = 0;[m
[31m-[m
[31m-    } else if (value->len && value->data[0] == '-') {[m
[31m-        value->data++;[m
[31m-        value->len--;[m
[31m-        minus = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        minus = 0;[m
[31m-    }[m
[31m-[m
[31m-    *expires_time = ngx_parse_time(value, 1);[m
[31m-[m
[31m-    if (*expires_time == (time_t) NGX_ERROR) {[m
[31m-        *err = "invalid value";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*expires == NGX_HTTP_EXPIRES_DAILY[m
[31m-        && *expires_time > 24 * 60 * 60)[m
[31m-    {[m
[31m-        *err = "daily time value must be less than 24 hours";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (minus) {[m
[31m-        *expires_time = - *expires_time;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_header(ngx_http_request_t *r, ngx_http_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    if (value->len) {[m
[31m-        h = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h->hash = 1;[m
[31m-        h->key = hv->key;[m
[31m-        h->value = *value;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_cache_control(ngx_http_request_t *r, ngx_http_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *cc, **ccp;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ccp = r->headers_out.cache_control.elts;[m
[31m-[m
[31m-    if (ccp == NULL) {[m
[31m-[m
[31m-        if (ngx_array_init(&r->headers_out.cache_control, r->pool,[m
[31m-                           1, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ccp = ngx_array_push(&r->headers_out.cache_control);[m
[31m-    if (ccp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cc = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (cc == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cc->hash = 1;[m
[31m-    ngx_str_set(&cc->key, "Cache-Control");[m
[31m-    cc->value = *value;[m
[31m-[m
[31m-    *ccp = cc;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_last_modified(ngx_http_request_t *r, ngx_http_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    if (ngx_http_set_response_header(r, hv, value) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.last_modified_time =[m
[31m-        (value->len) ? ngx_parse_http_time(value->data, value->len) : -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_response_header(ngx_http_request_t *r, ngx_http_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h, **old;[m
[31m-[m
[31m-    old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        if (*old) {[m
[31m-            (*old)->hash = 0;[m
[31m-            *old = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (*old) {[m
[31m-        h = *old;[m
[31m-[m
[31m-    } else {[m
[31m-        h = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *old = h;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = 1;[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_headers_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_headers_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_headers_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->headers = NULL;[m
[31m-     *     conf->expires_time = 0;[m
[31m-     *     conf->expires_value = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->expires = NGX_HTTP_EXPIRES_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_headers_conf_t *prev = parent;[m
[31m-    ngx_http_headers_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->expires == NGX_HTTP_EXPIRES_UNSET) {[m
[31m-        conf->expires = prev->expires;[m
[31m-        conf->expires_time = prev->expires_time;[m
[31m-        conf->expires_value = prev->expires_value;[m
[31m-[m
[31m-        if (conf->expires == NGX_HTTP_EXPIRES_UNSET) {[m
[31m-            conf->expires = NGX_HTTP_EXPIRES_OFF;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers == NULL) {[m
[31m-        conf->headers = prev->headers;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_headers_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_headers_conf_t *hcf = conf;[m
[31m-[m
[31m-    char                              *err;[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_int_t                          rc;[m
[31m-    ngx_uint_t                         n;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (hcf->expires != NGX_HTTP_EXPIRES_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        hcf->expires = NGX_HTTP_EXPIRES_ACCESS;[m
[31m-[m
[31m-        n = 1;[m
[31m-[m
[31m-    } else { /* cf->args->nelts == 3 */[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "modified") != 0) {[m
[31m-            return "invalid value";[m
[31m-        }[m
[31m-[m
[31m-        hcf->expires = NGX_HTTP_EXPIRES_MODIFIED;[m
[31m-[m
[31m-        n = 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[n];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        hcf->expires_value = ngx_palloc(cf->pool,[m
[31m-                                        sizeof(ngx_http_complex_value_t));[m
[31m-        if (hcf->expires_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *hcf->expires_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_parse_expires(&value[n], &hcf->expires, &hcf->expires_time,[m
[31m-                                &err);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return err;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_add(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_headers_conf_t *hcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_header_val_t             *hv;[m
[31m-    ngx_http_set_header_t             *set;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (hcf->headers == NULL) {[m
[31m-        hcf->headers = ngx_array_create(cf->pool, 1,[m
[31m-                                        sizeof(ngx_http_header_val_t));[m
[31m-        if (hcf->headers == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hv = ngx_array_push(hcf->headers);[m
[31m-    if (hv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hv->key = value[1];[m
[31m-    hv->handler = ngx_http_add_header;[m
[31m-    hv->offset = 0;[m
[31m-    hv->always = 0;[m
[31m-[m
[31m-    set = ngx_http_set_headers;[m
[31m-    for (i = 0; set[i].name.len; i++) {[m
[31m-        if (ngx_strcasecmp(value[1].data, set[i].name.data) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hv->offset = set[i].offset;[m
[31m-        hv->handler = set[i].handler;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (value[2].len == 0) {[m
[31m-        ngx_memzero(&hv->value, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[2];[m
[31m-        ccv.complex_value = &hv->value;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[3].data, "always") != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[3]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hv->always = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_image_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_image_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex b608de1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_image_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1521 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <gd.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMAGE_OFF       0[m
[31m-#define NGX_HTTP_IMAGE_TEST      1[m
[31m-#define NGX_HTTP_IMAGE_SIZE      2[m
[31m-#define NGX_HTTP_IMAGE_RESIZE    3[m
[31m-#define NGX_HTTP_IMAGE_CROP      4[m
[31m-#define NGX_HTTP_IMAGE_ROTATE    5[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMAGE_START     0[m
[31m-#define NGX_HTTP_IMAGE_READ      1[m
[31m-#define NGX_HTTP_IMAGE_PROCESS   2[m
[31m-#define NGX_HTTP_IMAGE_PASS      3[m
[31m-#define NGX_HTTP_IMAGE_DONE      4[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMAGE_NONE      0[m
[31m-#define NGX_HTTP_IMAGE_JPEG      1[m
[31m-#define NGX_HTTP_IMAGE_GIF       2[m
[31m-#define NGX_HTTP_IMAGE_PNG       3[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMAGE_BUFFERED  0x08[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                   filter;[m
[31m-    ngx_uint_t                   width;[m
[31m-    ngx_uint_t                   height;[m
[31m-    ngx_uint_t                   angle;[m
[31m-    ngx_uint_t                   jpeg_quality;[m
[31m-    ngx_uint_t                   sharpen;[m
[31m-[m
[31m-    ngx_flag_t                   transparency;[m
[31m-    ngx_flag_t                   interlace;[m
[31m-[m
[31m-    ngx_http_complex_value_t    *wcv;[m
[31m-    ngx_http_complex_value_t    *hcv;[m
[31m-    ngx_http_complex_value_t    *acv;[m
[31m-    ngx_http_complex_value_t    *jqcv;[m
[31m-    ngx_http_complex_value_t    *shcv;[m
[31m-[m
[31m-    size_t                       buffer_size;[m
[31m-} ngx_http_image_filter_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                      *image;[m
[31m-    u_char                      *last;[m
[31m-[m
[31m-    size_t                       length;[m
[31m-[m
[31m-    ngx_uint_t                   width;[m
[31m-    ngx_uint_t                   height;[m
[31m-    ngx_uint_t                   max_width;[m
[31m-    ngx_uint_t                   max_height;[m
[31m-    ngx_uint_t                   angle;[m
[31m-[m
[31m-    ngx_uint_t                   phase;[m
[31m-    ngx_uint_t                   type;[m
[31m-    ngx_uint_t                   force;[m
[31m-} ngx_http_image_filter_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_image_send(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx, ngx_chain_t *in);[m
[31m-static ngx_uint_t ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_image_read(ngx_http_request_t *r, ngx_chain_t *in);[m
[31m-static ngx_buf_t *ngx_http_image_process(ngx_http_request_t *r);[m
[31m-static ngx_buf_t *ngx_http_image_json(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-static ngx_buf_t *ngx_http_image_asis(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-static void ngx_http_image_length(ngx_http_request_t *r, ngx_buf_t *b);[m
[31m-static ngx_int_t ngx_http_image_size(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-[m
[31m-static ngx_buf_t *ngx_http_image_resize(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-static gdImagePtr ngx_http_image_source(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-static gdImagePtr ngx_http_image_new(ngx_http_request_t *r, int w, int h,[m
[31m-    int colors);[m
[31m-static u_char *ngx_http_image_out(ngx_http_request_t *r, ngx_uint_t type,[m
[31m-    gdImagePtr img, int *size);[m
[31m-static void ngx_http_image_cleanup(void *data);[m
[31m-static ngx_uint_t ngx_http_image_filter_get_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *cv, ngx_uint_t v);[m
[31m-static ngx_uint_t ngx_http_image_filter_value(ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_image_filter_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_image_filter_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_image_filter(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_image_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_image_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("image_filter"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_http_image_filter,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_jpeg_quality"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_image_filter_jpeg_quality,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_sharpen"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_image_filter_sharpen,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_transparency"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_image_filter_conf_t, transparency),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_interlace"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_image_filter_conf_t, interlace),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_image_filter_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_image_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_image_filter_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_image_filter_create_conf,     /* create location configuration */[m
[31m-    ngx_http_image_filter_merge_conf       /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_image_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_image_filter_module_ctx,     /* module context */[m
[31m-    ngx_http_image_filter_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_image_types[] = {[m
[31m-    ngx_string("image/jpeg"),[m
[31m-    ngx_string("image/gif"),[m
[31m-    ngx_string("image/png")[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                          len;[m
[31m-    ngx_http_image_filter_ctx_t   *ctx;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_image_filter_module);[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_OFF) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len[m
[31m-            >= sizeof("multipart/x-mixed-replace") - 1[m
[31m-        && ngx_strncasecmp(r->headers_out.content_type.data,[m
[31m-                           (u_char *) "multipart/x-mixed-replace",[m
[31m-                           sizeof("multipart/x-mixed-replace") - 1)[m
[31m-           == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "image filter: multipart/x-mixed-replace response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_image_filter_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_image_filter_module);[m
[31m-[m
[31m-    len = r->headers_out.content_length_n;[m
[31m-[m
[31m-    if (len != -1 && len > (off_t) conf->buffer_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "image filter: too big response: %O", len);[m
[31m-[m
[31m-        return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;[m
[31m-    }[m
[31m-[m
[31m-    if (len == -1) {[m
[31m-        ctx->length = conf->buffer_size;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->length = (size_t) len;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.refresh) {[m
[31m-        r->headers_out.refresh->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->main_filter_need_in_memory = 1;[m
[31m-    r->allow_ranges = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_str_t                     *ct;[m
[31m-    ngx_chain_t                    out;[m
[31m-    ngx_http_image_filter_ctx_t   *ctx;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "image filter");[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    switch (ctx->phase) {[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_START:[m
[31m-[m
[31m-        ctx->type = ngx_http_image_test(r, in);[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-        if (ctx->type == NGX_HTTP_IMAGE_NONE) {[m
[31m-[m
[31m-            if (conf->filter == NGX_HTTP_IMAGE_SIZE) {[m
[31m-                out.buf = ngx_http_image_json(r, NULL);[m
[31m-[m
[31m-                if (out.buf) {[m
[31m-                    out.next = NULL;[m
[31m-                    ctx->phase = NGX_HTTP_IMAGE_DONE;[m
[31m-[m
[31m-                    return ngx_http_image_send(r, ctx, &out);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return ngx_http_filter_finalize_request(r,[m
[31m-                                              &ngx_http_image_filter_module,[m
[31m-                                              NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);[m
[31m-        }[m
[31m-[m
[31m-        /* override content type */[m
[31m-[m
[31m-        ct = &ngx_http_image_types[ctx->type - 1];[m
[31m-        r->headers_out.content_type_len = ct->len;[m
[31m-        r->headers_out.content_type = *ct;[m
[31m-        r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-        if (conf->filter == NGX_HTTP_IMAGE_TEST) {[m
[31m-            ctx->phase = NGX_HTTP_IMAGE_PASS;[m
[31m-[m
[31m-            return ngx_http_image_send(r, ctx, in);[m
[31m-        }[m
[31m-[m
[31m-        ctx->phase = NGX_HTTP_IMAGE_READ;[m
[31m-[m
[31m-        /* fall through */[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_READ:[m
[31m-[m
[31m-        rc = ngx_http_image_read(r, in);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return ngx_http_filter_finalize_request(r,[m
[31m-                                              &ngx_http_image_filter_module,[m
[31m-                                              NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);[m
[31m-        }[m
[31m-[m
[31m-        /* fall through */[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PROCESS:[m
[31m-[m
[31m-        out.buf = ngx_http_image_process(r);[m
[31m-[m
[31m-        if (out.buf == NULL) {[m
[31m-            return ngx_http_filter_finalize_request(r,[m
[31m-                                              &ngx_http_image_filter_module,[m
[31m-                                              NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);[m
[31m-        }[m
[31m-[m
[31m-        out.next = NULL;[m
[31m-        ctx->phase = NGX_HTTP_IMAGE_PASS;[m
[31m-[m
[31m-        return ngx_http_image_send(r, ctx, &out);[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PASS:[m
[31m-[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-[m
[31m-    default: /* NGX_HTTP_IMAGE_DONE */[m
[31m-[m
[31m-        rc = ngx_http_next_body_filter(r, NULL);[m
[31m-[m
[31m-        /* NGX_ERROR resets any pending data */[m
[31m-        return (rc == NGX_OK) ? NGX_ERROR : rc;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_send(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    rc = ngx_http_next_header_filter(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, in);[m
[31m-[m
[31m-    if (ctx->phase == NGX_HTTP_IMAGE_DONE) {[m
[31m-        /* NGX_ERROR resets any pending data */[m
[31m-        return (rc == NGX_OK) ? NGX_ERROR : rc;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = in->buf->pos;[m
[31m-[m
[31m-    if (in->buf->last - p < 16) {[m
[31m-        return NGX_HTTP_IMAGE_NONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "image filter: \"%c%c\"", p[0], p[1]);[m
[31m-[m
[31m-    if (p[0] == 0xff && p[1] == 0xd8) {[m
[31m-[m
[31m-        /* JPEG */[m
[31m-[m
[31m-        return NGX_HTTP_IMAGE_JPEG;[m
[31m-[m
[31m-    } else if (p[0] == 'G' && p[1] == 'I' && p[2] == 'F' && p[3] == '8'[m
[31m-               && p[5] == 'a')[m
[31m-    {[m
[31m-        if (p[4] == '9' || p[4] == '7') {[m
[31m-            /* GIF */[m
[31m-            return NGX_HTTP_IMAGE_GIF;[m
[31m-        }[m
[31m-[m
[31m-    } else if (p[0] == 0x89 && p[1] == 'P' && p[2] == 'N' && p[3] == 'G'[m
[31m-               && p[4] == 0x0d && p[5] == 0x0a && p[6] == 0x1a && p[7] == 0x0a)[m
[31m-    {[m
[31m-        /* PNG */[m
[31m-[m
[31m-        return NGX_HTTP_IMAGE_PNG;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_IMAGE_NONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_read(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size, rest;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_chain_t                  *cl;[m
[31m-    ngx_http_image_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (ctx->image == NULL) {[m
[31m-        ctx->image = ngx_palloc(r->pool, ctx->length);[m
[31m-        if (ctx->image == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->last = ctx->image;[m
[31m-    }[m
[31m-[m
[31m-    p = ctx->last;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-        size = b->last - b->pos;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "image buf: %uz", size);[m
[31m-[m
[31m-        rest = ctx->image + ctx->length - p;[m
[31m-[m
[31m-        if (size > rest) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "image filter: too big response");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, b->pos, size);[m
[31m-        b->pos += size;[m
[31m-[m
[31m-        if (b->last_buf) {[m
[31m-            ctx->last = p;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->last = p;[m
[31m-    r->connection->buffered |= NGX_HTTP_IMAGE_BUFFERED;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_image_process(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_http_image_filter_ctx_t   *ctx;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    r->connection->buffered &= ~NGX_HTTP_IMAGE_BUFFERED;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    rc = ngx_http_image_size(r, ctx);[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_SIZE) {[m
[31m-        return ngx_http_image_json(r, rc == NGX_OK ? ctx : NULL);[m
[31m-    }[m
[31m-[m
[31m-    ctx->angle = ngx_http_image_filter_get_value(r, conf->acv, conf->angle);[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_ROTATE) {[m
[31m-[m
[31m-        if (ctx->angle != 90 && ctx->angle != 180 && ctx->angle != 270) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_image_resize(r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    ctx->max_width = ngx_http_image_filter_get_value(r, conf->wcv, conf->width);[m
[31m-    if (ctx->max_width == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->max_height = ngx_http_image_filter_get_value(r, conf->hcv,[m
[31m-                                                      conf->height);[m
[31m-    if (ctx->max_height == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK[m
[31m-        && ctx->width <= ctx->max_width[m
[31m-        && ctx->height <= ctx->max_height[m
[31m-        && ctx->angle == 0[m
[31m-        && !ctx->force)[m
[31m-    {[m
[31m-        return ngx_http_image_asis(r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_image_resize(r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_image_json(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    ngx_buf_t  *b;[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    ngx_http_clean_header(r);[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_type_len = sizeof("application/json") - 1;[m
[31m-    ngx_str_set(&r->headers_out.content_type, "application/json");[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        b->pos = (u_char *) "{}" CRLF;[m
[31m-        b->last = b->pos + sizeof("{}" CRLF) - 1;[m
[31m-[m
[31m-        ngx_http_image_length(r, b);[m
[31m-[m
[31m-        return b;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("{ \"img\" : "[m
[31m-                 "{ \"width\": , \"height\": , \"type\": \"jpeg\" } }" CRLF) - 1[m
[31m-          + 2 * NGX_SIZE_T_LEN;[m
[31m-[m
[31m-    b->pos = ngx_pnalloc(r->pool, len);[m
[31m-    if (b->pos == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->pos,[m
[31m-                          "{ \"img\" : "[m
[31m-                                       "{ \"width\": %uz,"[m
[31m-                                        " \"height\": %uz,"[m
[31m-                                        " \"type\": \"%s\" } }" CRLF,[m
[31m-                          ctx->width, ctx->height,[m
[31m-                          ngx_http_image_types[ctx->type - 1].data + 6);[m
[31m-[m
[31m-    ngx_http_image_length(r, b);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_image_asis(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t  *b;[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = ctx->image;[m
[31m-    b->last = ctx->last;[m
[31m-    b->memory = 1;[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    ngx_http_image_length(r, b);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_image_length(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    r->headers_out.content_length_n = b->last - b->pos;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char      *p, *last;[m
[31m-    size_t       len, app;[m
[31m-    ngx_uint_t   width, height;[m
[31m-[m
[31m-    p = ctx->image;[m
[31m-[m
[31m-    switch (ctx->type) {[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_JPEG:[m
[31m-[m
[31m-        p += 2;[m
[31m-        last = ctx->image + ctx->length - 10;[m
[31m-        width = 0;[m
[31m-        height = 0;[m
[31m-        app = 0;[m
[31m-[m
[31m-        while (p < last) {[m
[31m-[m
[31m-            if (p[0] == 0xff && p[1] != 0xff) {[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "JPEG: %02xd %02xd", p[0], p[1]);[m
[31m-[m
[31m-                p++;[m
[31m-[m
[31m-                if ((*p == 0xc0 || *p == 0xc1 || *p == 0xc2 || *p == 0xc3[m
[31m-                     || *p == 0xc9 || *p == 0xca || *p == 0xcb)[m
[31m-                    && (width == 0 || height == 0))[m
[31m-                {[m
[31m-                    width = p[6] * 256 + p[7];[m
[31m-                    height = p[4] * 256 + p[5];[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "JPEG: %02xd %02xd", p[1], p[2]);[m
[31m-[m
[31m-                len = p[1] * 256 + p[2];[m
[31m-[m
[31m-                if (*p >= 0xe1 && *p <= 0xef) {[m
[31m-                    /* application data, e.g., EXIF, Adobe XMP, etc. */[m
[31m-                    app += len;[m
[31m-                }[m
[31m-[m
[31m-                p += len;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (width == 0 || height == 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->length / 20 < app) {[m
[31m-            /* force conversion if application data consume more than 5% */[m
[31m-            ctx->force = 1;[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "app data size: %uz", app);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_GIF:[m
[31m-[m
[31m-        if (ctx->length < 10) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        width = p[7] * 256 + p[6];[m
[31m-        height = p[9] * 256 + p[8];[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PNG:[m
[31m-[m
[31m-        if (ctx->length < 24) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        width = p[18] * 256 + p[19];[m
[31m-        height = p[22] * 256 + p[23];[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "image size: %d x %d", (int) width, (int) height);[m
[31m-[m
[31m-    ctx->width = width;[m
[31m-    ctx->height = height;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_image_resize(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    int                            sx, sy, dx, dy, ox, oy, ax, ay, size,[m
[31m-                                   colors, palette, transparent, sharpen,[m
[31m-                                   red, green, blue, t;[m
[31m-    u_char                        *out;[m
[31m-    ngx_buf_t                     *b;[m
[31m-    ngx_uint_t                     resize;[m
[31m-    gdImagePtr                     src, dst;[m
[31m-    ngx_pool_cleanup_t            *cln;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    src = ngx_http_image_source(r, ctx);[m
[31m-[m
[31m-    if (src == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    sx = gdImageSX(src);[m
[31m-    sy = gdImageSY(src);[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (!ctx->force[m
[31m-        && ctx->angle == 0[m
[31m-        && (ngx_uint_t) sx <= ctx->max_width[m
[31m-        && (ngx_uint_t) sy <= ctx->max_height)[m
[31m-    {[m
[31m-        gdImageDestroy(src);[m
[31m-        return ngx_http_image_asis(r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    colors = gdImageColorsTotal(src);[m
[31m-[m
[31m-    if (colors && conf->transparency) {[m
[31m-        transparent = gdImageGetTransparent(src);[m
[31m-[m
[31m-        if (transparent != -1) {[m
[31m-            palette = colors;[m
[31m-            red = gdImageRed(src, transparent);[m
[31m-            green = gdImageGreen(src, transparent);[m
[31m-            blue = gdImageBlue(src, transparent);[m
[31m-[m
[31m-            goto transparent;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    palette = 0;[m
[31m-    transparent = -1;[m
[31m-    red = 0;[m
[31m-    green = 0;[m
[31m-    blue = 0;[m
[31m-[m
[31m-transparent:[m
[31m-[m
[31m-    gdImageColorTransparent(src, -1);[m
[31m-[m
[31m-    dx = sx;[m
[31m-    dy = sy;[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_RESIZE) {[m
[31m-[m
[31m-        if ((ngx_uint_t) dx > ctx->max_width) {[m
[31m-            dy = dy * ctx->max_width / dx;[m
[31m-            dy = dy ? dy : 1;[m
[31m-            dx = ctx->max_width;[m
[31m-        }[m
[31m-[m
[31m-        if ((ngx_uint_t) dy > ctx->max_height) {[m
[31m-            dx = dx * ctx->max_height / dy;[m
[31m-            dx = dx ? dx : 1;[m
[31m-            dy = ctx->max_height;[m
[31m-        }[m
[31m-[m
[31m-        resize = 1;[m
[31m-[m
[31m-    } else if (conf->filter == NGX_HTTP_IMAGE_ROTATE) {[m
[31m-[m
[31m-        resize = 0;[m
[31m-[m
[31m-    } else { /* NGX_HTTP_IMAGE_CROP */[m
[31m-[m
[31m-        resize = 0;[m
[31m-[m
[31m-        if ((double) dx / dy < (double) ctx->max_width / ctx->max_height) {[m
[31m-            if ((ngx_uint_t) dx > ctx->max_width) {[m
[31m-                dy = dy * ctx->max_width / dx;[m
[31m-                dy = dy ? dy : 1;[m
[31m-                dx = ctx->max_width;[m
[31m-                resize = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if ((ngx_uint_t) dy > ctx->max_height) {[m
[31m-                dx = dx * ctx->max_height / dy;[m
[31m-                dx = dx ? dx : 1;[m
[31m-                dy = ctx->max_height;[m
[31m-                resize = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (resize) {[m
[31m-        dst = ngx_http_image_new(r, dx, dy, palette);[m
[31m-        if (dst == NULL) {[m
[31m-            gdImageDestroy(src);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (colors == 0) {[m
[31m-            gdImageSaveAlpha(dst, 1);[m
[31m-            gdImageAlphaBlending(dst, 0);[m
[31m-        }[m
[31m-[m
[31m-        gdImageCopyResampled(dst, src, 0, 0, 0, 0, dx, dy, sx, sy);[m
[31m-[m
[31m-        if (colors) {[m
[31m-            gdImageTrueColorToPalette(dst, 1, 256);[m
[31m-        }[m
[31m-[m
[31m-        gdImageDestroy(src);[m
[31m-[m
[31m-    } else {[m
[31m-        dst = src;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->angle) {[m
[31m-        src = dst;[m
[31m-[m
[31m-        ax = (dx % 2 == 0) ? 1 : 0;[m
[31m-        ay = (dy % 2 == 0) ? 1 : 0;[m
[31m-[m
[31m-        switch (ctx->angle) {[m
[31m-[m
[31m-        case 90:[m
[31m-        case 270:[m
[31m-            dst = ngx_http_image_new(r, dy, dx, palette);[m
[31m-            if (dst == NULL) {[m
[31m-                gdImageDestroy(src);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-            if (ctx->angle == 90) {[m
[31m-                ox = dy / 2 + ay;[m
[31m-                oy = dx / 2 - ax;[m
[31m-[m
[31m-            } else {[m
[31m-                ox = dy / 2 - ay;[m
[31m-                oy = dx / 2 + ax;[m
[31m-            }[m
[31m-[m
[31m-            gdImageCopyRotated(dst, src, ox, oy, 0, 0,[m
[31m-                               dx + ax, dy + ay, ctx->angle);[m
[31m-            gdImageDestroy(src);[m
[31m-[m
[31m-            t = dx;[m
[31m-            dx = dy;[m
[31m-            dy = t;[m
[31m-            break;[m
[31m-[m
[31m-        case 180:[m
[31m-            dst = ngx_http_image_new(r, dx, dy, palette);[m
[31m-            if (dst == NULL) {[m
[31m-                gdImageDestroy(src);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-            gdImageCopyRotated(dst, src, dx / 2 - ax, dy / 2 - ay, 0, 0,[m
[31m-                               dx + ax, dy + ay, ctx->angle);[m
[31m-            gdImageDestroy(src);[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_CROP) {[m
[31m-[m
[31m-        src = dst;[m
[31m-[m
[31m-        if ((ngx_uint_t) dx > ctx->max_width) {[m
[31m-            ox = dx - ctx->max_width;[m
[31m-[m
[31m-        } else {[m
[31m-            ox = 0;[m
[31m-        }[m
[31m-[m
[31m-        if ((ngx_uint_t) dy > ctx->max_height) {[m
[31m-            oy = dy - ctx->max_height;[m
[31m-[m
[31m-        } else {[m
[31m-            oy = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ox || oy) {[m
[31m-[m
[31m-            dst = ngx_http_image_new(r, dx - ox, dy - oy, colors);[m
[31m-[m
[31m-            if (dst == NULL) {[m
[31m-                gdImageDestroy(src);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            ox /= 2;[m
[31m-            oy /= 2;[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "image crop: %d x %d @ %d x %d",[m
[31m-                           dx, dy, ox, oy);[m
[31m-[m
[31m-            if (colors == 0) {[m
[31m-                gdImageSaveAlpha(dst, 1);[m
[31m-                gdImageAlphaBlending(dst, 0);[m
[31m-            }[m
[31m-[m
[31m-            gdImageCopy(dst, src, 0, 0, ox, oy, dx - ox, dy - oy);[m
[31m-[m
[31m-            if (colors) {[m
[31m-                gdImageTrueColorToPalette(dst, 1, 256);[m
[31m-            }[m
[31m-[m
[31m-            gdImageDestroy(src);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (transparent != -1 && colors) {[m
[31m-        gdImageColorTransparent(dst, gdImageColorExact(dst, red, green, blue));[m
[31m-    }[m
[31m-[m
[31m-    sharpen = ngx_http_image_filter_get_value(r, conf->shcv, conf->sharpen);[m
[31m-    if (sharpen > 0) {[m
[31m-        gdImageSharpen(dst, sharpen);[m
[31m-    }[m
[31m-[m
[31m-    gdImageInterlace(dst, (int) conf->interlace);[m
[31m-[m
[31m-    out = ngx_http_image_out(r, ctx->type, dst, &size);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "image: %d x %d %d", sx, sy, colors);[m
[31m-[m
[31m-    gdImageDestroy(dst);[m
[31m-    ngx_pfree(r->pool, ctx->image);[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        gdFree(out);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        gdFree(out);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_image_cleanup;[m
[31m-    cln->data = out;[m
[31m-[m
[31m-    b->pos = out;[m
[31m-    b->last = out + size;[m
[31m-    b->memory = 1;[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    ngx_http_image_length(r, b);[m
[31m-    ngx_http_weak_etag(r);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static gdImagePtr[m
[31m-ngx_http_image_source(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    char        *failed;[m
[31m-    gdImagePtr   img;[m
[31m-[m
[31m-    img = NULL;[m
[31m-[m
[31m-    switch (ctx->type) {[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_JPEG:[m
[31m-        img = gdImageCreateFromJpegPtr(ctx->length, ctx->image);[m
[31m-        failed = "gdImageCreateFromJpegPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_GIF:[m
[31m-        img = gdImageCreateFromGifPtr(ctx->length, ctx->image);[m
[31m-        failed = "gdImageCreateFromGifPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PNG:[m
[31m-        img = gdImageCreateFromPngPtr(ctx->length, ctx->image);[m
[31m-        failed = "gdImageCreateFromPngPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        failed = "unknown image type";[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (img == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, failed);[m
[31m-    }[m
[31m-[m
[31m-    return img;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static gdImagePtr[m
[31m-ngx_http_image_new(ngx_http_request_t *r, int w, int h, int colors)[m
[31m-{[m
[31m-    gdImagePtr  img;[m
[31m-[m
[31m-    if (colors == 0) {[m
[31m-        img = gdImageCreateTrueColor(w, h);[m
[31m-[m
[31m-        if (img == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "gdImageCreateTrueColor() failed");[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        img = gdImageCreate(w, h);[m
[31m-[m
[31m-        if (img == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "gdImageCreate() failed");[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return img;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_image_out(ngx_http_request_t *r, ngx_uint_t type, gdImagePtr img,[m
[31m-    int *size)[m
[31m-{[m
[31m-    char                          *failed;[m
[31m-    u_char                        *out;[m
[31m-    ngx_int_t                      jq;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    out = NULL;[m
[31m-[m
[31m-    switch (type) {[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_JPEG:[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-        jq = ngx_http_image_filter_get_value(r, conf->jqcv, conf->jpeg_quality);[m
[31m-        if (jq <= 0) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        out = gdImageJpegPtr(img, size, jq);[m
[31m-        failed = "gdImageJpegPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_GIF:[m
[31m-        out = gdImageGifPtr(img, size);[m
[31m-        failed = "gdImageGifPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PNG:[m
[31m-        out = gdImagePngPtr(img, size);[m
[31m-        failed = "gdImagePngPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        failed = "unknown image type";[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, failed);[m
[31m-    }[m
[31m-[m
[31m-    return out;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_image_cleanup(void *data)[m
[31m-{[m
[31m-    gdFree(data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_image_filter_get_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *cv, ngx_uint_t v)[m
[31m-{[m
[31m-    ngx_str_t  val;[m
[31m-[m
[31m-    if (cv == NULL) {[m
[31m-        return v;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, cv, &val) != NGX_OK) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_image_filter_value(&val);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_image_filter_value(ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    if (value->len == 1 && value->data[0] == '-') {[m
[31m-        return (ngx_uint_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(value->data, value->len);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return (ngx_uint_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_image_filter_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_image_filter_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->width = 0;[m
[31m-     *     conf->height = 0;[m
[31m-     *     conf->angle = 0;[m
[31m-     *     conf->wcv = NULL;[m
[31m-     *     conf->hcv = NULL;[m
[31m-     *     conf->acv = NULL;[m
[31m-     *     conf->jqcv = NULL;[m
[31m-     *     conf->shcv = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->filter = NGX_CONF_UNSET_UINT;[m
[31m-    conf->jpeg_quality = NGX_CONF_UNSET_UINT;[m
[31m-    conf->sharpen = NGX_CONF_UNSET_UINT;[m
[31m-    conf->transparency = NGX_CONF_UNSET;[m
[31m-    conf->interlace = NGX_CONF_UNSET;[m
[31m-    conf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_image_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t *prev = parent;[m
[31m-    ngx_http_image_filter_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->filter == NGX_CONF_UNSET_UINT) {[m
[31m-[m
[31m-        if (prev->filter == NGX_CONF_UNSET_UINT) {[m
[31m-            conf->filter = NGX_HTTP_IMAGE_OFF;[m
[31m-[m
[31m-        } else {[m
[31m-            conf->filter = prev->filter;[m
[31m-            conf->width = prev->width;[m
[31m-            conf->height = prev->height;[m
[31m-            conf->angle = prev->angle;[m
[31m-            conf->wcv = prev->wcv;[m
[31m-            conf->hcv = prev->hcv;[m
[31m-            conf->acv = prev->acv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->jpeg_quality == NGX_CONF_UNSET_UINT) {[m
[31m-[m
[31m-        /* 75 is libjpeg default quality */[m
[31m-        ngx_conf_merge_uint_value(conf->jpeg_quality, prev->jpeg_quality, 75);[m
[31m-[m
[31m-        if (conf->jqcv == NULL) {[m
[31m-            conf->jqcv = prev->jqcv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->sharpen == NGX_CONF_UNSET_UINT) {[m
[31m-        ngx_conf_merge_uint_value(conf->sharpen, prev->sharpen, 0);[m
[31m-[m
[31m-        if (conf->shcv == NULL) {[m
[31m-            conf->shcv = prev->shcv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->transparency, prev->transparency, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->interlace, prev->interlace, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,[m
[31m-                              1 * 1024 * 1024);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_image_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t *imcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_int_t                          n;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    i = 1;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            imcf->filter = NGX_HTTP_IMAGE_OFF;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[i].data, "test") == 0) {[m
[31m-            imcf->filter = NGX_HTTP_IMAGE_TEST;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[i].data, "size") == 0) {[m
[31m-            imcf->filter = NGX_HTTP_IMAGE_SIZE;[m
[31m-[m
[31m-        } else {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    } else if (cf->args->nelts == 3) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "rotate") == 0) {[m
[31m-            if (imcf->filter != NGX_HTTP_IMAGE_RESIZE[m
[31m-                && imcf->filter != NGX_HTTP_IMAGE_CROP)[m
[31m-            {[m
[31m-                imcf->filter = NGX_HTTP_IMAGE_ROTATE;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &value[++i];[m
[31m-            ccv.complex_value = &cv;[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (cv.lengths == NULL) {[m
[31m-                n = ngx_http_image_filter_value(&value[i]);[m
[31m-[m
[31m-                if (n != 90 && n != 180 && n != 270) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                imcf->angle = (ngx_uint_t) n;[m
[31m-[m
[31m-            } else {[m
[31m-                imcf->acv = ngx_palloc(cf->pool,[m
[31m-                                       sizeof(ngx_http_complex_value_t));[m
[31m-                if (imcf->acv == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                *imcf->acv = cv;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[i].data, "resize") == 0) {[m
[31m-        imcf->filter = NGX_HTTP_IMAGE_RESIZE;[m
[31m-[m
[31m-    } else if (ngx_strcmp(value[i].data, "crop") == 0) {[m
[31m-        imcf->filter = NGX_HTTP_IMAGE_CROP;[m
[31m-[m
[31m-    } else {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[++i];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths == NULL) {[m
[31m-        n = ngx_http_image_filter_value(&value[i]);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        imcf->width = (ngx_uint_t) n;[m
[31m-[m
[31m-    } else {[m
[31m-        imcf->wcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (imcf->wcv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *imcf->wcv = cv;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[++i];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths == NULL) {[m
[31m-        n = ngx_http_image_filter_value(&value[i]);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        imcf->height = (ngx_uint_t) n;[m
[31m-[m
[31m-    } else {[m
[31m-        imcf->hcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (imcf->hcv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *imcf->hcv = cv;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%V\"",[m
[31m-                       &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t *imcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_int_t                          n;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths == NULL) {[m
[31m-        n = ngx_http_image_filter_value(&value[1]);[m
[31m-[m
[31m-        if (n <= 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        imcf->jpeg_quality = (ngx_uint_t) n;[m
[31m-[m
[31m-    } else {[m
[31m-        imcf->jqcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (imcf->jqcv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *imcf->jqcv = cv;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t *imcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_int_t                          n;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths == NULL) {[m
[31m-        n = ngx_http_image_filter_value(&value[1]);[m
[31m-[m
[31m-        if (n < 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        imcf->sharpen = (ngx_uint_t) n;[m
[31m-[m
[31m-    } else {[m
[31m-        imcf->shcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (imcf->shcv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *imcf->shcv = cv;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_image_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_image_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_index_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_index_module.c[m
[1mdeleted file mode 100644[m
[1mindex d3544db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_index_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,540 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                name;[m
[31m-    ngx_array_t             *lengths;[m
[31m-    ngx_array_t             *values;[m
[31m-} ngx_http_index_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t             *indices;    /* array of ngx_http_index_t */[m
[31m-    size_t                   max_index_len;[m
[31m-} ngx_http_index_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_DEFAULT_INDEX   "index.html"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_index_test_dir(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, u_char *path, u_char *last);[m
[31m-static ngx_int_t ngx_http_index_error(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, u_char *file, ngx_err_t err);[m
[31m-[m
[31m-static ngx_int_t ngx_http_index_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_index_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_index_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static char *ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_index_commands[] = {[m
[31m-[m
[31m-    { ngx_string("index"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_index_set_index,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_index_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_index_init,                   /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_index_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_index_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_index_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_index_module_ctx,            /* module context */[m
[31m-    ngx_http_index_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Try to open/test the first index file before the test of directory[m
[31m- * existence because valid requests should prevail over invalid ones.[m
[31m- * If open()/stat() of a file will fail then stat() of a directory[m
[31m- * should be faster because kernel may have already cached some data.[m
[31m- * Besides, Win32 may return ERROR_PATH_NOT_FOUND (NGX_ENOTDIR) at once.[m
[31m- * Unix has ENOTDIR error; however, it's less helpful than Win32's one:[m
[31m- * it only indicates that path points to a regular file, not a directory.[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_index_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                       *p, *name;[m
[31m-    size_t                        len, root, reserve, allocated;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_str_t                     path, uri;[m
[31m-    ngx_uint_t                    i, dir_tested;[m
[31m-    ngx_http_index_t             *index;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_index_loc_conf_t    *ilcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ilcf = ngx_http_get_module_loc_conf(r, ngx_http_index_module);[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    allocated = 0;[m
[31m-    root = 0;[m
[31m-    dir_tested = 0;[m
[31m-    name = NULL;[m
[31m-    /* suppress MSVC warning */[m
[31m-    path.data = NULL;[m
[31m-[m
[31m-    index = ilcf->indices->elts;[m
[31m-    for (i = 0; i < ilcf->indices->nelts; i++) {[m
[31m-[m
[31m-        if (index[i].lengths == NULL) {[m
[31m-[m
[31m-            if (index[i].name.data[0] == '/') {[m
[31m-                return ngx_http_internal_redirect(r, &index[i].name, &r->args);[m
[31m-            }[m
[31m-[m
[31m-            reserve = ilcf->max_index_len;[m
[31m-            len = index[i].name.len;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-            e.ip = index[i].lengths->elts;[m
[31m-            e.request = r;[m
[31m-            e.flushed = 1;[m
[31m-[m
[31m-            /* 1 is for terminating '\0' as in static names */[m
[31m-            len = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-                len += lcode(&e);[m
[31m-            }[m
[31m-[m
[31m-            /* 16 bytes are preallocation */[m
[31m-[m
[31m-            reserve = len + 16;[m
[31m-        }[m
[31m-[m
[31m-        if (reserve > allocated) {[m
[31m-[m
[31m-            name = ngx_http_map_uri_to_path(r, &path, &root, reserve);[m
[31m-            if (name == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            allocated = path.data + path.len - name;[m
[31m-        }[m
[31m-[m
[31m-        if (index[i].values == NULL) {[m
[31m-[m
[31m-            /* index[i].name.len includes the terminating '\0' */[m
[31m-[m
[31m-            ngx_memcpy(name, index[i].name.data, index[i].name.len);[m
[31m-[m
[31m-            path.len = (name + index[i].name.len - 1) - path.data;[m
[31m-[m
[31m-        } else {[m
[31m-            e.ip = index[i].values->elts;[m
[31m-            e.pos = name;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-[m
[31m-            if (*name == '/') {[m
[31m-                uri.len = len - 1;[m
[31m-                uri.data = name;[m
[31m-                return ngx_http_internal_redirect(r, &uri, &r->args);[m
[31m-            }[m
[31m-[m
[31m-            path.len = e.pos - path.data;[m
[31m-[m
[31m-            *e.pos = '\0';[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "open index \"%V\"", &path);[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.read_ahead = clcf->read_ahead;[m
[31m-        of.directio = clcf->directio;[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, of.err,[m
[31m-                           "%s \"%s\" failed", of.failed, path.data);[m
[31m-[m
[31m-            if (of.err == 0) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-            if (of.err == NGX_EMLINK[m
[31m-                || of.err == NGX_ELOOP)[m
[31m-            {[m
[31m-                return NGX_HTTP_FORBIDDEN;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (of.err == NGX_ENOTDIR[m
[31m-                || of.err == NGX_ENAMETOOLONG[m
[31m-                || of.err == NGX_EACCES)[m
[31m-            {[m
[31m-                return ngx_http_index_error(r, clcf, path.data, of.err);[m
[31m-            }[m
[31m-[m
[31m-            if (!dir_tested) {[m
[31m-                rc = ngx_http_index_test_dir(r, clcf, path.data, name - 1);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                dir_tested = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (of.err == NGX_ENOENT) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, path.data);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        uri.len = r->uri.len + len - 1;[m
[31m-[m
[31m-        if (!clcf->alias) {[m
[31m-            uri.data = path.data + root;[m
[31m-[m
[31m-        } else {[m
[31m-            uri.data = ngx_pnalloc(r->pool, uri.len);[m
[31m-            if (uri.data == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_copy(uri.data, r->uri.data, r->uri.len);[m
[31m-            ngx_memcpy(p, name, len - 1);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_internal_redirect(r, &uri, &r->args);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_index_test_dir(ngx_http_request_t *r, ngx_http_core_loc_conf_t *clcf,[m
[31m-    u_char *path, u_char *last)[m
[31m-{[m
[31m-    u_char                c;[m
[31m-    ngx_str_t             dir;[m
[31m-    ngx_open_file_info_t  of;[m
[31m-[m
[31m-    c = *last;[m
[31m-    if (c != '/' || path == last) {[m
[31m-        /* "alias" without trailing slash */[m
[31m-        c = *(++last);[m
[31m-    }[m
[31m-    *last = '\0';[m
[31m-[m
[31m-    dir.len = last - path;[m
[31m-    dir.data = path;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http index check dir: \"%V\"", &dir);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.test_dir = 1;[m
[31m-    of.test_only = 1;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &dir, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &dir, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        if (of.err) {[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-            if (of.err == NGX_EMLINK[m
[31m-                || of.err == NGX_ELOOP)[m
[31m-            {[m
[31m-                return NGX_HTTP_FORBIDDEN;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (of.err == NGX_ENOENT) {[m
[31m-                *last = c;[m
[31m-                return ngx_http_index_error(r, clcf, dir.data, NGX_ENOENT);[m
[31m-            }[m
[31m-[m
[31m-            if (of.err == NGX_EACCES) {[m
[31m-[m
[31m-                *last = c;[m
[31m-[m
[31m-                /*[m
[31m-                 * ngx_http_index_test_dir() is called after the first index[m
[31m-                 * file testing has returned an error distinct from NGX_EACCES.[m
[31m-                 * This means that directory searching is allowed.[m
[31m-                 */[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, dir.data);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *last = c;[m
[31m-[m
[31m-    if (of.is_dir) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                  "\"%s\" is not a directory", dir.data);[m
[31m-[m
[31m-    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_index_error(ngx_http_request_t *r, ngx_http_core_loc_conf_t  *clcf,[m
[31m-    u_char *file, ngx_err_t err)[m
[31m-{[m
[31m-    if (err == NGX_EACCES) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, err,[m
[31m-                      "\"%s\" is forbidden", file);[m
[31m-[m
[31m-        return NGX_HTTP_FORBIDDEN;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->log_not_found) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, err,[m
[31m-                      "\"%s\" is not found", file);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_NOT_FOUND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_index_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_index_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_index_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->indices = NULL;[m
[31m-    conf->max_index_len = 0;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_index_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_index_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    ngx_http_index_t  *index;[m
[31m-[m
[31m-    if (conf->indices == NULL) {[m
[31m-        conf->indices = prev->indices;[m
[31m-        conf->max_index_len = prev->max_index_len;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->indices == NULL) {[m
[31m-        conf->indices = ngx_array_create(cf->pool, 1, sizeof(ngx_http_index_t));[m
[31m-        if (conf->indices == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index = ngx_array_push(conf->indices);[m
[31m-        if (index == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index->name.len = sizeof(NGX_HTTP_DEFAULT_INDEX);[m
[31m-        index->name.data = (u_char *) NGX_HTTP_DEFAULT_INDEX;[m
[31m-        index->lengths = NULL;[m
[31m-        index->values = NULL;[m
[31m-[m
[31m-        conf->max_index_len = sizeof(NGX_HTTP_DEFAULT_INDEX);[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_index_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_index_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* TODO: warn about duplicate indices */[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_index_loc_conf_t *ilcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_index_t           *index;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (ilcf->indices == NULL) {[m
[31m-        ilcf->indices = ngx_array_create(cf->pool, 2, sizeof(ngx_http_index_t));[m
[31m-        if (ilcf->indices == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (value[i].data[0] == '/' && i != cf->args->nelts - 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "only the last index in \"index\" directive "[m
[31m-                               "should be absolute");[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "index \"%V\" in \"index\" directive is invalid",[m
[31m-                               &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index = ngx_array_push(ilcf->indices);[m
[31m-        if (index == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index->name.len = value[i].len;[m
[31m-        index->name.data = value[i].data;[m
[31m-        index->lengths = NULL;[m
[31m-        index->values = NULL;[m
[31m-[m
[31m-        n = ngx_http_script_variables_count(&value[i]);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            if (ilcf->max_index_len < index->name.len) {[m
[31m-                ilcf->max_index_len = index->name.len;[m
[31m-            }[m
[31m-[m
[31m-            if (index->name.data[0] == '/') {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* include the terminating '\0' to the length to use ngx_memcpy() */[m
[31m-            index->name.len++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &value[i];[m
[31m-        sc.lengths = &index->lengths;[m
[31m-        sc.values = &index->values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_limit_conn_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_limit_conn_module.c[m
[1mdeleted file mode 100644[m
[1mindex 913d599..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_limit_conn_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,670 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     color;[m
[31m-    u_char                     len;[m
[31m-    u_short                    conn;[m
[31m-    u_char                     data[1];[m
[31m-} ngx_http_limit_conn_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t            *shm_zone;[m
[31m-    ngx_rbtree_node_t         *node;[m
[31m-} ngx_http_limit_conn_cleanup_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t              *rbtree;[m
[31m-    ngx_http_complex_value_t   key;[m
[31m-} ngx_http_limit_conn_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t            *shm_zone;[m
[31m-    ngx_uint_t                 conn;[m
[31m-} ngx_http_limit_conn_limit_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                limits;[m
[31m-    ngx_uint_t                 log_level;[m
[31m-    ngx_uint_t                 status_code;[m
[31m-} ngx_http_limit_conn_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_rbtree_node_t *ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree,[m
[31m-    ngx_str_t *key, uint32_t hash);[m
[31m-static void ngx_http_limit_conn_cleanup(void *data);[m
[31m-static ngx_inline void ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool);[m
[31m-[m
[31m-static void *ngx_http_limit_conn_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_limit_conn_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_limit_conn_log_levels[] = {[m
[31m-    { ngx_string("info"), NGX_LOG_INFO },[m
[31m-    { ngx_string("notice"), NGX_LOG_NOTICE },[m
[31m-    { ngx_string("warn"), NGX_LOG_WARN },[m
[31m-    { ngx_string("error"), NGX_LOG_ERR },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_num_bounds_t  ngx_http_limit_conn_status_bounds = {[m
[31m-    ngx_conf_check_num_bounds, 400, 599[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_limit_conn_commands[] = {[m
[31m-[m
[31m-    { ngx_string("limit_conn_zone"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_limit_conn_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_conn"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_limit_conn,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_conn_log_level"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_limit_conn_conf_t, log_level),[m
[31m-      &ngx_http_limit_conn_log_levels },[m
[31m-[m
[31m-    { ngx_string("limit_conn_status"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_limit_conn_conf_t, status_code),[m
[31m-      &ngx_http_limit_conn_status_bounds },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_limit_conn_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_limit_conn_init,              /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_limit_conn_create_conf,       /* create location configuration */[m
[31m-    ngx_http_limit_conn_merge_conf         /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_limit_conn_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_limit_conn_module_ctx,       /* module context */[m
[31m-    ngx_http_limit_conn_commands,          /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_conn_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          n;[m
[31m-    uint32_t                        hash;[m
[31m-    ngx_str_t                       key;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_slab_pool_t                *shpool;[m
[31m-    ngx_rbtree_node_t              *node;[m
[31m-    ngx_pool_cleanup_t             *cln;[m
[31m-    ngx_http_limit_conn_ctx_t      *ctx;[m
[31m-    ngx_http_limit_conn_node_t     *lc;[m
[31m-    ngx_http_limit_conn_conf_t     *lccf;[m
[31m-    ngx_http_limit_conn_limit_t    *limits;[m
[31m-    ngx_http_limit_conn_cleanup_t  *lccln;[m
[31m-[m
[31m-    if (r->main->limit_conn_set) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    lccf = ngx_http_get_module_loc_conf(r, ngx_http_limit_conn_module);[m
[31m-    limits = lccf->limits.elts;[m
[31m-[m
[31m-    for (i = 0; i < lccf->limits.nelts; i++) {[m
[31m-        ctx = limits[i].shm_zone->data;[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &ctx->key, &key) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (key.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (key.len > 255) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "the value of the \"%V\" key "[m
[31m-                          "is more than 255 bytes: \"%V\"",[m
[31m-                          &ctx->key.value, &key);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        r->main->limit_conn_set = 1;[m
[31m-[m
[31m-        hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-        shpool = (ngx_slab_pool_t *) limits[i].shm_zone->shm.addr;[m
[31m-[m
[31m-        ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-        node = ngx_http_limit_conn_lookup(ctx->rbtree, &key, hash);[m
[31m-[m
[31m-        if (node == NULL) {[m
[31m-[m
[31m-            n = offsetof(ngx_rbtree_node_t, color)[m
[31m-                + offsetof(ngx_http_limit_conn_node_t, data)[m
[31m-                + key.len;[m
[31m-[m
[31m-            node = ngx_slab_alloc_locked(shpool, n);[m
[31m-[m
[31m-            if (node == NULL) {[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-                ngx_http_limit_conn_cleanup_all(r->pool);[m
[31m-                return lccf->status_code;[m
[31m-            }[m
[31m-[m
[31m-            lc = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-            node->key = hash;[m
[31m-            lc->len = (u_char) key.len;[m
[31m-            lc->conn = 1;[m
[31m-            ngx_memcpy(lc->data, key.data, key.len);[m
[31m-[m
[31m-            ngx_rbtree_insert(ctx->rbtree, node);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            lc = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-            if ((ngx_uint_t) lc->conn >= limits[i].conn) {[m
[31m-[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-                ngx_log_error(lccf->log_level, r->connection->log, 0,[m
[31m-                              "limiting connections by zone \"%V\"",[m
[31m-                              &limits[i].shm_zone->shm.name);[m
[31m-[m
[31m-                ngx_http_limit_conn_cleanup_all(r->pool);[m
[31m-                return lccf->status_code;[m
[31m-            }[m
[31m-[m
[31m-            lc->conn++;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "limit conn: %08Xi %d", node->key, lc->conn);[m
[31m-[m
[31m-        ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(r->pool,[m
[31m-                                   sizeof(ngx_http_limit_conn_cleanup_t));[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_limit_conn_cleanup;[m
[31m-        lccln = cln->data;[m
[31m-[m
[31m-        lccln->shm_zone = limits[i].shm_zone;[m
[31m-        lccln->node = node;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t           **p;[m
[31m-    ngx_http_limit_conn_node_t   *lcn, *lcnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            lcn = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-            lcnt = (ngx_http_limit_conn_node_t *) &temp->color;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0)[m
[31m-                ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_rbtree_node_t *[m
[31m-ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_rbtree_node_t           *node, *sentinel;[m
[31m-    ngx_http_limit_conn_node_t  *lcn;[m
[31m-[m
[31m-    node = rbtree->root;[m
[31m-    sentinel = rbtree->sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        lcn = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return node;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_conn_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_limit_conn_cleanup_t  *lccln = data;[m
[31m-[m
[31m-    ngx_slab_pool_t             *shpool;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    ngx_http_limit_conn_ctx_t   *ctx;[m
[31m-    ngx_http_limit_conn_node_t  *lc;[m
[31m-[m
[31m-    ctx = lccln->shm_zone->data;[m
[31m-    shpool = (ngx_slab_pool_t *) lccln->shm_zone->shm.addr;[m
[31m-    node = lccln->node;[m
[31m-    lc = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, lccln->shm_zone->shm.log, 0,[m
[31m-                   "limit conn cleanup: %08Xi %d", node->key, lc->conn);[m
[31m-[m
[31m-    lc->conn--;[m
[31m-[m
[31m-    if (lc->conn == 0) {[m
[31m-        ngx_rbtree_delete(ctx->rbtree, node);[m
[31m-        ngx_slab_free_locked(shpool, node);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    cln = pool->cleanup;[m
[31m-[m
[31m-    while (cln && cln->handler == ngx_http_limit_conn_cleanup) {[m
[31m-        ngx_http_limit_conn_cleanup(cln->data);[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    pool->cleanup = cln;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_http_limit_conn_ctx_t  *octx = data;[m
[31m-[m
[31m-    size_t                      len;[m
[31m-    ngx_slab_pool_t            *shpool;[m
[31m-    ngx_rbtree_node_t          *sentinel;[m
[31m-    ngx_http_limit_conn_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    if (octx) {[m
[31m-        if (ctx->key.value.len != octx->key.value.len[m
[31m-            || ngx_strncmp(ctx->key.value.data, octx->key.value.data,[m
[31m-                           ctx->key.value.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,[m
[31m-                          "limit_conn_zone \"%V\" uses the \"%V\" key "[m
[31m-                          "while previously it used the \"%V\" key",[m
[31m-                          &shm_zone->shm.name, &ctx->key.value,[m
[31m-                          &octx->key.value);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->rbtree = octx->rbtree;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        ctx->rbtree = shpool->data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rbtree = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_t));[m
[31m-    if (ctx->rbtree == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shpool->data = ctx->rbtree;[m
[31m-[m
[31m-    sentinel = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_node_t));[m
[31m-    if (sentinel == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(ctx->rbtree, sentinel,[m
[31m-                    ngx_http_limit_conn_rbtree_insert_value);[m
[31m-[m
[31m-    len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in limit_conn_zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_limit_conn_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_limit_conn_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->limits.elts = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->log_level = NGX_CONF_UNSET_UINT;[m
[31m-    conf->status_code = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_limit_conn_conf_t *prev = parent;[m
[31m-    ngx_http_limit_conn_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->limits.elts == NULL) {[m
[31m-        conf->limits = prev->limits;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR);[m
[31m-    ngx_conf_merge_uint_value(conf->status_code, prev->status_code,[m
[31m-                              NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                            *p;[m
[31m-    ssize_t                            size;[m
[31m-    ngx_str_t                         *value, name, s;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_shm_zone_t                    *shm_zone;[m
[31m-    ngx_http_limit_conn_ctx_t         *ctx;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &ctx->key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    name.len = 0;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {[m
[31m-[m
[31m-            name.data = value[i].data + 5;[m
[31m-[m
[31m-            p = (u_char *) ngx_strchr(name.data, ':');[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            name.len = p - name.data;[m
[31m-[m
[31m-            s.data = p + 1;[m
[31m-            s.len = value[i].data + value[i].len - s.data;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "zone \"%V\" is too small", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &name, size,[m
[31m-                                     &ngx_http_limit_conn_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone->data) {[m
[31m-        ctx = shm_zone->data;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "%V \"%V\" is already bound to key \"%V\"",[m
[31m-                           &cmd->name, &name, &ctx->key.value);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone->init = ngx_http_limit_conn_init_zone;[m
[31m-    shm_zone->data = ctx;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_shm_zone_t               *shm_zone;[m
[31m-    ngx_http_limit_conn_conf_t   *lccf = conf;[m
[31m-    ngx_http_limit_conn_limit_t  *limit, *limits;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                     &ngx_http_limit_conn_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limits = lccf->limits.elts;[m
[31m-[m
[31m-    if (limits == NULL) {[m
[31m-        if (ngx_array_init(&lccf->limits, cf->pool, 1,[m
[31m-                           sizeof(ngx_http_limit_conn_limit_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < lccf->limits.nelts; i++) {[m
[31m-        if (shm_zone == limits[i].shm_zone) {[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(value[2].data, value[2].len);[m
[31m-    if (n <= 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number of connections \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 65535) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "connection limit must be less 65536");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit = ngx_array_push(&lccf->limits);[m
[31m-    if (limit == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit->conn = n;[m
[31m-    limit->shm_zone = shm_zone;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_conn_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_limit_conn_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_limit_req_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_limit_req_module.c[m
[1mdeleted file mode 100644[m
[1mindex 9059ac3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_limit_req_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,968 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                       color;[m
[31m-    u_char                       dummy;[m
[31m-    u_short                      len;[m
[31m-    ngx_queue_t                  queue;[m
[31m-    ngx_msec_t                   last;[m
[31m-    /* integer value, 1 corresponds to 0.001 r/s */[m
[31m-    ngx_uint_t                   excess;[m
[31m-    ngx_uint_t                   count;[m
[31m-    u_char                       data[1];[m
[31m-} ngx_http_limit_req_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t                  rbtree;[m
[31m-    ngx_rbtree_node_t             sentinel;[m
[31m-    ngx_queue_t                   queue;[m
[31m-} ngx_http_limit_req_shctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_limit_req_shctx_t  *sh;[m
[31m-    ngx_slab_pool_t             *shpool;[m
[31m-    /* integer value, 1 corresponds to 0.001 r/s */[m
[31m-    ngx_uint_t                   rate;[m
[31m-    ngx_http_complex_value_t     key;[m
[31m-    ngx_http_limit_req_node_t   *node;[m
[31m-} ngx_http_limit_req_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t              *shm_zone;[m
[31m-    /* integer value, 1 corresponds to 0.001 r/s */[m
[31m-    ngx_uint_t                   burst;[m
[31m-    ngx_uint_t                   nodelay; /* unsigned  nodelay:1 */[m
[31m-} ngx_http_limit_req_limit_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                  limits;[m
[31m-    ngx_uint_t                   limit_log_level;[m
[31m-    ngx_uint_t                   delay_log_level;[m
[31m-    ngx_uint_t                   status_code;[m
[31m-} ngx_http_limit_req_conf_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_http_limit_req_delay(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit,[m
[31m-    ngx_uint_t hash, ngx_str_t *key, ngx_uint_t *ep, ngx_uint_t account);[m
[31m-static ngx_msec_t ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits,[m
[31m-    ngx_uint_t n, ngx_uint_t *ep, ngx_http_limit_req_limit_t **limit);[m
[31m-static void ngx_http_limit_req_expire(ngx_http_limit_req_ctx_t *ctx,[m
[31m-    ngx_uint_t n);[m
[31m-[m
[31m-static void *ngx_http_limit_req_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_limit_req_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_limit_req_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_limit_req_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_limit_req_log_levels[] = {[m
[31m-    { ngx_string("info"), NGX_LOG_INFO },[m
[31m-    { ngx_string("notice"), NGX_LOG_NOTICE },[m
[31m-    { ngx_string("warn"), NGX_LOG_WARN },[m
[31m-    { ngx_string("error"), NGX_LOG_ERR },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_num_bounds_t  ngx_http_limit_req_status_bounds = {[m
[31m-    ngx_conf_check_num_bounds, 400, 599[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_limit_req_commands[] = {[m
[31m-[m
[31m-    { ngx_string("limit_req_zone"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE3,[m
[31m-      ngx_http_limit_req_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_req"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_http_limit_req,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_req_log_level"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_limit_req_conf_t, limit_log_level),[m
[31m-      &ngx_http_limit_req_log_levels },[m
[31m-[m
[31m-    { ngx_string("limit_req_status"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_limit_req_conf_t, status_code),[m
[31m-      &ngx_http_limit_req_status_bounds },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_limit_req_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_limit_req_init,               /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_limit_req_create_conf,        /* create location configuration */[m
[31m-    ngx_http_limit_req_merge_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_limit_req_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_limit_req_module_ctx,        /* module context */[m
[31m-    ngx_http_limit_req_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_req_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n, excess;[m
[31m-    ngx_msec_t                   delay;[m
[31m-    ngx_http_limit_req_ctx_t    *ctx;[m
[31m-    ngx_http_limit_req_conf_t   *lrcf;[m
[31m-    ngx_http_limit_req_limit_t  *limit, *limits;[m
[31m-[m
[31m-    if (r->main->limit_req_set) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    lrcf = ngx_http_get_module_loc_conf(r, ngx_http_limit_req_module);[m
[31m-    limits = lrcf->limits.elts;[m
[31m-[m
[31m-    excess = 0;[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    limit = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    for (n = 0; n < lrcf->limits.nelts; n++) {[m
[31m-[m
[31m-        limit = &limits[n];[m
[31m-[m
[31m-        ctx = limit->shm_zone->data;[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &ctx->key, &key) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (key.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (key.len > 65535) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "the value of the \"%V\" key "[m
[31m-                          "is more than 65535 bytes: \"%V\"",[m
[31m-                          &ctx->key.value, &key);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-        ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        rc = ngx_http_limit_req_lookup(limit, hash, &key, &excess,[m
[31m-                                       (n == lrcf->limits.nelts - 1));[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "limit_req[%ui]: %i %ui.%03ui",[m
[31m-                       n, rc, excess / 1000, excess % 1000);[m
[31m-[m
[31m-        if (rc != NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->main->limit_req_set = 1;[m
[31m-[m
[31m-    if (rc == NGX_BUSY || rc == NGX_ERROR) {[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            ngx_log_error(lrcf->limit_log_level, r->connection->log, 0,[m
[31m-                          "limiting requests, excess: %ui.%03ui by zone \"%V\"",[m
[31m-                          excess / 1000, excess % 1000,[m
[31m-                          &limit->shm_zone->shm.name);[m
[31m-        }[m
[31m-[m
[31m-        while (n--) {[m
[31m-            ctx = limits[n].shm_zone->data;[m
[31m-[m
[31m-            if (ctx->node == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            ctx->node->count--;[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            ctx->node = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return lrcf->status_code;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN || rc == NGX_OK */[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        excess = 0;[m
[31m-    }[m
[31m-[m
[31m-    delay = ngx_http_limit_req_account(limits, n, &excess, &limit);[m
[31m-[m
[31m-    if (!delay) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(lrcf->delay_log_level, r->connection->log, 0,[m
[31m-                  "delaying request, excess: %ui.%03ui, by zone \"%V\"",[m
[31m-                  excess / 1000, excess % 1000, &limit->shm_zone->shm.name);[m
[31m-[m
[31m-    if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_test_reading;[m
[31m-    r->write_event_handler = ngx_http_limit_req_delay;[m
[31m-    ngx_add_timer(r->connection->write, delay);[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_req_delay(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "limit_req delay");[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (!wev->timedout) {[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev->timedout = 0;[m
[31m-[m
[31m-    if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-    r->write_event_handler = ngx_http_core_run_phases;[m
[31m-[m
[31m-    ngx_http_core_run_phases(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_req_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t          **p;[m
[31m-    ngx_http_limit_req_node_t   *lrn, *lrnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            lrn = (ngx_http_limit_req_node_t *) &node->color;[m
[31m-            lrnt = (ngx_http_limit_req_node_t *) &temp->color;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(lrn->data, lrnt->data, lrn->len, lrnt->len) < 0)[m
[31m-                ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, ngx_uint_t hash,[m
[31m-    ngx_str_t *key, ngx_uint_t *ep, ngx_uint_t account)[m
[31m-{[m
[31m-    size_t                      size;[m
[31m-    ngx_int_t                   rc, excess;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_msec_t                  now;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_rbtree_node_t          *node, *sentinel;[m
[31m-    ngx_http_limit_req_ctx_t   *ctx;[m
[31m-    ngx_http_limit_req_node_t  *lr;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);[m
[31m-[m
[31m-    ctx = limit->shm_zone->data;[m
[31m-[m
[31m-    node = ctx->sh->rbtree.root;[m
[31m-    sentinel = ctx->sh->rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        lr = (ngx_http_limit_req_node_t *) &node->color;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(key->data, lr->data, key->len, (size_t) lr->len);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            ngx_queue_remove(&lr->queue);[m
[31m-            ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);[m
[31m-[m
[31m-            ms = (ngx_msec_int_t) (now - lr->last);[m
[31m-[m
[31m-            excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;[m
[31m-[m
[31m-            if (excess < 0) {[m
[31m-                excess = 0;[m
[31m-            }[m
[31m-[m
[31m-            *ep = excess;[m
[31m-[m
[31m-            if ((ngx_uint_t) excess > limit->burst) {[m
[31m-                return NGX_BUSY;[m
[31m-            }[m
[31m-[m
[31m-            if (account) {[m
[31m-                lr->excess = excess;[m
[31m-                lr->last = now;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            lr->count++;[m
[31m-[m
[31m-            ctx->node = lr;[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    *ep = 0;[m
[31m-[m
[31m-    size = offsetof(ngx_rbtree_node_t, color)[m
[31m-           + offsetof(ngx_http_limit_req_node_t, data)[m
[31m-           + key->len;[m
[31m-[m
[31m-    ngx_http_limit_req_expire(ctx, 1);[m
[31m-[m
[31m-    node = ngx_slab_alloc_locked(ctx->shpool, size);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        ngx_http_limit_req_expire(ctx, 0);[m
[31m-[m
[31m-        node = ngx_slab_alloc_locked(ctx->shpool, size);[m
[31m-        if (node == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "could not allocate node%s", ctx->shpool->log_ctx);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    node->key = hash;[m
[31m-[m
[31m-    lr = (ngx_http_limit_req_node_t *) &node->color;[m
[31m-[m
[31m-    lr->len = (u_short) key->len;[m
[31m-    lr->excess = 0;[m
[31m-[m
[31m-    ngx_memcpy(lr->data, key->data, key->len);[m
[31m-[m
[31m-    ngx_rbtree_insert(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);[m
[31m-[m
[31m-    if (account) {[m
[31m-        lr->last = now;[m
[31m-        lr->count = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    lr->last = 0;[m
[31m-    lr->count = 1;[m
[31m-[m
[31m-    ctx->node = lr;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_msec_t[m
[31m-ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits, ngx_uint_t n,[m
[31m-    ngx_uint_t *ep, ngx_http_limit_req_limit_t **limit)[m
[31m-{[m
[31m-    ngx_int_t                   excess;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_msec_t                  now, delay, max_delay;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_http_limit_req_ctx_t   *ctx;[m
[31m-    ngx_http_limit_req_node_t  *lr;[m
[31m-[m
[31m-    excess = *ep;[m
[31m-[m
[31m-    if (excess == 0 || (*limit)->nodelay) {[m
[31m-        max_delay = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx = (*limit)->shm_zone->data;[m
[31m-        max_delay = excess * 1000 / ctx->rate;[m
[31m-    }[m
[31m-[m
[31m-    while (n--) {[m
[31m-        ctx = limits[n].shm_zone->data;[m
[31m-        lr = ctx->node;[m
[31m-[m
[31m-        if (lr == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        tp = ngx_timeofday();[m
[31m-[m
[31m-        now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);[m
[31m-        ms = (ngx_msec_int_t) (now - lr->last);[m
[31m-[m
[31m-        excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;[m
[31m-[m
[31m-        if (excess < 0) {[m
[31m-            excess = 0;[m
[31m-        }[m
[31m-[m
[31m-        lr->last = now;[m
[31m-        lr->excess = excess;[m
[31m-        lr->count--;[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        ctx->node = NULL;[m
[31m-[m
[31m-        if (limits[n].nodelay) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        delay = excess * 1000 / ctx->rate;[m
[31m-[m
[31m-        if (delay > max_delay) {[m
[31m-            max_delay = delay;[m
[31m-            *ep = excess;[m
[31m-            *limit = &limits[n];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return max_delay;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_req_expire(ngx_http_limit_req_ctx_t *ctx, ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_int_t                   excess;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_msec_t                  now;[m
[31m-    ngx_queue_t                *q;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_rbtree_node_t          *node;[m
[31m-    ngx_http_limit_req_node_t  *lr;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);[m
[31m-[m
[31m-    /*[m
[31m-     * n == 1 deletes one or two zero rate entries[m
[31m-     * n == 0 deletes oldest entry by force[m
[31m-     *        and one or two zero rate entries[m
[31m-     */[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&ctx->sh->queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-        lr = ngx_queue_data(q, ngx_http_limit_req_node_t, queue);[m
[31m-[m
[31m-        if (lr->count) {[m
[31m-[m
[31m-            /*[m
[31m-             * There is not much sense in looking further,[m
[31m-             * because we bump nodes on the lookup stage.[m
[31m-             */[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (n++ != 0) {[m
[31m-[m
[31m-            ms = (ngx_msec_int_t) (now - lr->last);[m
[31m-            ms = ngx_abs(ms);[m
[31m-[m
[31m-            if (ms < 60000) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            excess = lr->excess - ctx->rate * ms / 1000;[m
[31m-[m
[31m-            if (excess > 0) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        node = (ngx_rbtree_node_t *)[m
[31m-                   ((u_char *) lr - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-        ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-        ngx_slab_free_locked(ctx->shpool, node);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_req_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_http_limit_req_ctx_t  *octx = data;[m
[31m-[m
[31m-    size_t                     len;[m
[31m-    ngx_http_limit_req_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    if (octx) {[m
[31m-        if (ctx->key.value.len != octx->key.value.len[m
[31m-            || ngx_strncmp(ctx->key.value.data, octx->key.value.data,[m
[31m-                           ctx->key.value.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,[m
[31m-                          "limit_req \"%V\" uses the \"%V\" key "[m
[31m-                          "while previously it used the \"%V\" key",[m
[31m-                          &shm_zone->shm.name, &ctx->key.value,[m
[31m-                          &octx->key.value);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->sh = octx->sh;[m
[31m-        ctx->shpool = octx->shpool;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        ctx->sh = ctx->shpool->data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_limit_req_shctx_t));[m
[31m-    if (ctx->sh == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->shpool->data = ctx->sh;[m
[31m-[m
[31m-    ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel,[m
[31m-                    ngx_http_limit_req_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&ctx->sh->queue);[m
[31m-[m
[31m-    len = sizeof(" in limit_req zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len);[m
[31m-    if (ctx->shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(ctx->shpool->log_ctx, " in limit_req zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    ctx->shpool->log_nomem = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_limit_req_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_limit_req_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->limits.elts = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->limit_log_level = NGX_CONF_UNSET_UINT;[m
[31m-    conf->status_code = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_req_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_limit_req_conf_t *prev = parent;[m
[31m-    ngx_http_limit_req_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->limits.elts == NULL) {[m
[31m-        conf->limits = prev->limits;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->limit_log_level, prev->limit_log_level,[m
[31m-                              NGX_LOG_ERR);[m
[31m-[m
[31m-    conf->delay_log_level = (conf->limit_log_level == NGX_LOG_INFO) ?[m
[31m-                                NGX_LOG_INFO : conf->limit_log_level + 1;[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->status_code, prev->status_code,[m
[31m-                              NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_req_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                            *p;[m
[31m-    size_t                             len;[m
[31m-    ssize_t                            size;[m
[31m-    ngx_str_t                         *value, name, s;[m
[31m-    ngx_int_t                          rate, scale;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_shm_zone_t                    *shm_zone;[m
[31m-    ngx_http_limit_req_ctx_t          *ctx;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &ctx->key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    rate = 1;[m
[31m-    scale = 1;[m
[31m-    name.len = 0;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {[m
[31m-[m
[31m-            name.data = value[i].data + 5;[m
[31m-[m
[31m-            p = (u_char *) ngx_strchr(name.data, ':');[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            name.len = p - name.data;[m
[31m-[m
[31m-            s.data = p + 1;[m
[31m-            s.len = value[i].data + value[i].len - s.data;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "zone \"%V\" is too small", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "rate=", 5) == 0) {[m
[31m-[m
[31m-            len = value[i].len;[m
[31m-            p = value[i].data + len - 3;[m
[31m-[m
[31m-            if (ngx_strncmp(p, "r/s", 3) == 0) {[m
[31m-                scale = 1;[m
[31m-                len -= 3;[m
[31m-[m
[31m-            } else if (ngx_strncmp(p, "r/m", 3) == 0) {[m
[31m-                scale = 60;[m
[31m-                len -= 3;[m
[31m-            }[m
[31m-[m
[31m-            rate = ngx_atoi(value[i].data + 5, len - 5);[m
[31m-            if (rate <= 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid rate \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rate = rate * 1000 / scale;[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &name, size,[m
[31m-                                     &ngx_http_limit_req_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone->data) {[m
[31m-        ctx = shm_zone->data;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "%V \"%V\" is already bound to key \"%V\"",[m
[31m-                           &cmd->name, &name, &ctx->key.value);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone->init = ngx_http_limit_req_init_zone;[m
[31m-    shm_zone->data = ctx;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_limit_req_conf_t  *lrcf = conf;[m
[31m-[m
[31m-    ngx_int_t                    burst;[m
[31m-    ngx_str_t                   *value, s;[m
[31m-    ngx_uint_t                   i, nodelay;[m
[31m-    ngx_shm_zone_t              *shm_zone;[m
[31m-    ngx_http_limit_req_limit_t  *limit, *limits;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    shm_zone = NULL;[m
[31m-    burst = 0;[m
[31m-    nodelay = 0;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 5;[m
[31m-            s.data = value[i].data + 5;[m
[31m-[m
[31m-            shm_zone = ngx_shared_memory_add(cf, &s, 0,[m
[31m-                                             &ngx_http_limit_req_module);[m
[31m-            if (shm_zone == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "burst=", 6) == 0) {[m
[31m-[m
[31m-            burst = ngx_atoi(value[i].data + 6, value[i].len - 6);[m
[31m-            if (burst <= 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid burst rate \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "nodelay") == 0) {[m
[31m-            nodelay = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limits = lrcf->limits.elts;[m
[31m-[m
[31m-    if (limits == NULL) {[m
[31m-        if (ngx_array_init(&lrcf->limits, cf->pool, 1,[m
[31m-                           sizeof(ngx_http_limit_req_limit_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < lrcf->limits.nelts; i++) {[m
[31m-        if (shm_zone == limits[i].shm_zone) {[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    limit = ngx_array_push(&lrcf->limits);[m
[31m-    if (limit == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit->shm_zone = shm_zone;[m
[31m-    limit->burst = burst * 1000;[m
[31m-    limit->nodelay = nodelay;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_req_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_limit_req_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_log_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_log_module.c[m
[1mdeleted file mode 100644[m
[1mindex 0978e51..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_log_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1819 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-#include <zlib.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_log_op_s  ngx_http_log_op_t;[m
[31m-[m
[31m-typedef u_char *(*ngx_http_log_op_run_pt) (ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-[m
[31m-typedef size_t (*ngx_http_log_op_getlen_pt) (ngx_http_request_t *r,[m
[31m-    uintptr_t data);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_log_op_s {[m
[31m-    size_t                      len;[m
[31m-    ngx_http_log_op_getlen_pt   getlen;[m
[31m-    ngx_http_log_op_run_pt      run;[m
[31m-    uintptr_t                   data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_array_t                *flushes;[m
[31m-    ngx_array_t                *ops;        /* array of ngx_http_log_op_t */[m
[31m-} ngx_http_log_fmt_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                 formats;    /* array of ngx_http_log_fmt_t */[m
[31m-    ngx_uint_t                  combined_used; /* unsigned  combined_used:1 */[m
[31m-} ngx_http_log_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *start;[m
[31m-    u_char                     *pos;[m
[31m-    u_char                     *last;[m
[31m-[m
[31m-    ngx_event_t                *event;[m
[31m-    ngx_msec_t                  flush;[m
[31m-    ngx_int_t                   gzip;[m
[31m-} ngx_http_log_buf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *lengths;[m
[31m-    ngx_array_t                *values;[m
[31m-} ngx_http_log_script_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_open_file_t            *file;[m
[31m-    ngx_http_log_script_t      *script;[m
[31m-    time_t                      disk_full_time;[m
[31m-    time_t                      error_log_time;[m
[31m-    ngx_syslog_peer_t          *syslog_peer;[m
[31m-    ngx_http_log_fmt_t         *format;[m
[31m-    ngx_http_complex_value_t   *filter;[m
[31m-} ngx_http_log_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *logs;       /* array of ngx_http_log_t */[m
[31m-[m
[31m-    ngx_open_file_cache_t      *open_file_cache;[m
[31m-    time_t                      open_file_cache_valid;[m
[31m-    ngx_uint_t                  open_file_cache_min_uses;[m
[31m-[m
[31m-    ngx_flag_t                  escape_non_ascii;[m
[31m-[m
[31m-    ngx_uint_t                  off;        /* unsigned  off:1 */[m
[31m-} ngx_http_log_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    size_t                      len;[m
[31m-    ngx_http_log_op_run_pt      run;[m
[31m-} ngx_http_log_var_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log,[m
[31m-    u_char *buf, size_t len);[m
[31m-static ssize_t ngx_http_log_script_write(ngx_http_request_t *r,[m
[31m-    ngx_http_log_script_t *script, u_char **name, u_char *buf, size_t len);[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-static ssize_t ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len,[m
[31m-    ngx_int_t level, ngx_log_t *log);[m
[31m-[m
[31m-static void *ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size);[m
[31m-static void ngx_http_log_gzip_free(void *opaque, void *address);[m
[31m-#endif[m
[31m-[m
[31m-static void ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log);[m
[31m-static void ngx_http_log_flush_handler(ngx_event_t *ev);[m
[31m-[m
[31m-static u_char *ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_msec(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_status(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_body_bytes_sent(ngx_http_request_t *r,[m
[31m-    u_char *buf, ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-[m
[31m-static ngx_int_t ngx_http_log_variable_compile(ngx_conf_t *cf,[m
[31m-    ngx_http_log_op_t *op, ngx_str_t *value);[m
[31m-static size_t ngx_http_log_variable_getlen(ngx_http_request_t *r,[m
[31m-    uintptr_t data);[m
[31m-static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,[m
[31m-    u_char *src, size_t size);[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_log_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_log_compile_format(ngx_conf_t *cf,[m
[31m-    ngx_array_t *flushes, ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s);[m
[31m-static char *ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_log_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_log_commands[] = {[m
[31m-[m
[31m-    { ngx_string("log_format"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_log_set_format,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("access_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_HTTP_LMT_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_log_set_log,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_log_file_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_http_log_open_file_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_escape_non_ascii"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_log_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_log_init,                     /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_log_create_main_conf,         /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_log_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_log_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_log_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_log_module_ctx,              /* module context */[m
[31m-    ngx_http_log_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_access_log = ngx_string(NGX_HTTP_LOG_PATH);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_combined_fmt =[m
[31m-    ngx_string("$remote_addr - $remote_user [$time_local] "[m
[31m-               "\"$request\" $status $body_bytes_sent "[m
[31m-               "\"$http_referer\" \"$http_user_agent\"");[m
[31m-[m
[31m-[m
[31m-static ngx_http_log_var_t  ngx_http_log_vars[] = {[m
[31m-    { ngx_string("pipe"), 1, ngx_http_log_pipe },[m
[31m-    { ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1,[m
[31m-                          ngx_http_log_time },[m
[31m-    { ngx_string("time_iso8601"), sizeof("1970-09-28T12:00:00+06:00") - 1,[m
[31m-                          ngx_http_log_iso8601 },[m
[31m-    { ngx_string("msec"), NGX_TIME_T_LEN + 4, ngx_http_log_msec },[m
[31m-    { ngx_string("request_time"), NGX_TIME_T_LEN + 4,[m
[31m-                          ngx_http_log_request_time },[m
[31m-    { ngx_string("status"), NGX_INT_T_LEN, ngx_http_log_status },[m
[31m-    { ngx_string("bytes_sent"), NGX_OFF_T_LEN, ngx_http_log_bytes_sent },[m
[31m-    { ngx_string("body_bytes_sent"), NGX_OFF_T_LEN,[m
[31m-                          ngx_http_log_body_bytes_sent },[m
[31m-    { ngx_string("request_length"), NGX_SIZE_T_LEN,[m
[31m-                          ngx_http_log_request_length },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                   *line, *p;[m
[31m-    size_t                    len, size;[m
[31m-    ssize_t                   n;[m
[31m-    ngx_str_t                 val;[m
[31m-    ngx_uint_t                i, l;[m
[31m-    ngx_http_log_t           *log;[m
[31m-    ngx_http_log_op_t        *op;[m
[31m-    ngx_http_log_buf_t       *buffer;[m
[31m-    ngx_http_log_loc_conf_t  *lcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log handler");[m
[31m-[m
[31m-    lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    if (lcf->off) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    log = lcf->logs->elts;[m
[31m-    for (l = 0; l < lcf->logs->nelts; l++) {[m
[31m-[m
[31m-        if (log[l].filter) {[m
[31m-            if (ngx_http_complex_value(r, log[l].filter, &val) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (val.len == 0 || (val.len == 1 && val.data[0] == '0')) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_time() == log[l].disk_full_time) {[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD writing to a full filesystem with enabled softupdates[m
[31m-             * may block process for much longer time than writing to non-full[m
[31m-             * filesystem, so we skip writing to a log for one second[m
[31m-             */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, log[l].format->flushes);[m
[31m-[m
[31m-        len = 0;[m
[31m-        op = log[l].format->ops->elts;[m
[31m-        for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-            if (op[i].len == 0) {[m
[31m-                len += op[i].getlen(r, op[i].data);[m
[31m-[m
[31m-            } else {[m
[31m-                len += op[i].len;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-[m
[31m-            /* length of syslog's PRI and HEADER message parts */[m
[31m-            len += sizeof("<255>Jan 01 00:00:00 ") - 1[m
[31m-                   + ngx_cycle->hostname.len + 1[m
[31m-                   + log[l].syslog_peer->tag.len + 2;[m
[31m-[m
[31m-            goto alloc_line;[m
[31m-        }[m
[31m-[m
[31m-        len += NGX_LINEFEED_SIZE;[m
[31m-[m
[31m-        buffer = log[l].file ? log[l].file->data : NULL;[m
[31m-[m
[31m-        if (buffer) {[m
[31m-[m
[31m-            if (len > (size_t) (buffer->last - buffer->pos)) {[m
[31m-[m
[31m-                ngx_http_log_write(r, &log[l], buffer->start,[m
[31m-                                   buffer->pos - buffer->start);[m
[31m-[m
[31m-                buffer->pos = buffer->start;[m
[31m-            }[m
[31m-[m
[31m-            if (len <= (size_t) (buffer->last - buffer->pos)) {[m
[31m-[m
[31m-                p = buffer->pos;[m
[31m-[m
[31m-                if (buffer->event && p == buffer->start) {[m
[31m-                    ngx_add_timer(buffer->event, buffer->flush);[m
[31m-                }[m
[31m-[m
[31m-                for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-                    p = op[i].run(r, p, &op[i]);[m
[31m-                }[m
[31m-[m
[31m-                ngx_linefeed(p);[m
[31m-[m
[31m-                buffer->pos = p;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (buffer->event && buffer->event->timer_set) {[m
[31m-                ngx_del_timer(buffer->event);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    alloc_line:[m
[31m-[m
[31m-        line = ngx_pnalloc(r->pool, len);[m
[31m-        if (line == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = line;[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-            p = ngx_syslog_add_header(log[l].syslog_peer, line);[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-            p = op[i].run(r, p, &op[i]);[m
[31m-        }[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-[m
[31m-            size = p - line;[m
[31m-[m
[31m-            n = ngx_syslog_send(log[l].syslog_peer, line, size);[m
[31m-[m
[31m-            if (n < 0) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "send() to syslog failed");[m
[31m-[m
[31m-            } else if ((size_t) n != size) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "send() to syslog has written only %z of %uz",[m
[31m-                              n, size);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_linefeed(p);[m
[31m-[m
[31m-        ngx_http_log_write(r, &log[l], line, p - line);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log, u_char *buf,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    u_char              *name;[m
[31m-    time_t               now;[m
[31m-    ssize_t              n;[m
[31m-    ngx_err_t            err;[m
[31m-#if (NGX_ZLIB)[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-#endif[m
[31m-[m
[31m-    if (log->script == NULL) {[m
[31m-        name = log->file->name.data;[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-        buffer = log->file->data;[m
[31m-[m
[31m-        if (buffer && buffer->gzip) {[m
[31m-            n = ngx_http_log_gzip(log->file->fd, buf, len, buffer->gzip,[m
[31m-                                  r->connection->log);[m
[31m-        } else {[m
[31m-            n = ngx_write_fd(log->file->fd, buf, len);[m
[31m-        }[m
[31m-#else[m
[31m-        n = ngx_write_fd(log->file->fd, buf, len);[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        name = NULL;[m
[31m-        n = ngx_http_log_script_write(r, log->script, &name, buf, len);[m
[31m-    }[m
[31m-[m
[31m-    if (n == (ssize_t) len) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOSPC) {[m
[31m-            log->disk_full_time = now;[m
[31m-        }[m
[31m-[m
[31m-        if (now - log->error_log_time > 59) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, err,[m
[31m-                          ngx_write_fd_n " to \"%s\" failed", name);[m
[31m-[m
[31m-            log->error_log_time = now;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (now - log->error_log_time > 59) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",[m
[31m-                      name, n, len);[m
[31m-[m
[31m-        log->error_log_time = now;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_log_script_write(ngx_http_request_t *r, ngx_http_log_script_t *script,[m
[31m-    u_char **name, u_char *buf, size_t len)[m
[31m-{[m
[31m-    size_t                     root;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_str_t                  log, path;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_log_loc_conf_t   *llcf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->root_tested) {[m
[31m-[m
[31m-        /* test root directory existence */[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        path.data[root] = '\0';[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_dir = 1;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            if (of.err == 0) {[m
[31m-                /* simulate successful logging */[m
[31m-                return len;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, of.err,[m
[31m-                          "testing \"%s\" existence failed", path.data);[m
[31m-[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        if (!of.is_dir) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ENOTDIR,[m
[31m-                          "testing \"%s\" existence failed", path.data);[m
[31m-[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &log, script->lengths->elts, 1,[m
[31m-                            script->values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    log.data[log.len - 1] = '\0';[m
[31m-    *name = log.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log \"%s\"", log.data);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.log = 1;[m
[31m-    of.valid = llcf->open_file_cache_valid;[m
[31m-    of.min_uses = llcf->open_file_cache_min_uses;[m
[31m-    of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &log, &of) != NGX_OK) {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(llcf->open_file_cache, &log, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      "%s \"%s\" failed", of.failed, log.data);[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log #%d", of.fd);[m
[31m-[m
[31m-    n = ngx_write_fd(of.fd, buf, len);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len, ngx_int_t level,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    int          rc, wbits, memlevel;[m
[31m-    u_char      *out;[m
[31m-    size_t       size;[m
[31m-    ssize_t      n;[m
[31m-    z_stream     zstream;[m
[31m-    ngx_err_t    err;[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    wbits = MAX_WBITS;[m
[31m-    memlevel = MAX_MEM_LEVEL - 1;[m
[31m-[m
[31m-    while ((ssize_t) len < ((1 << (wbits - 1)) - 262)) {[m
[31m-        wbits--;[m
[31m-        memlevel--;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * This is a formula from deflateBound() for conservative upper bound of[m
[31m-     * compressed data plus 18 bytes of gzip wrapper.[m
[31m-     */[m
[31m-[m
[31m-    size = len + ((len + 7) >> 3) + ((len + 63) >> 6) + 5 + 18;[m
[31m-[m
[31m-    ngx_memzero(&zstream, sizeof(z_stream));[m
[31m-[m
[31m-    pool = ngx_create_pool(256, log);[m
[31m-    if (pool == NULL) {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    pool->log = log;[m
[31m-[m
[31m-    zstream.zalloc = ngx_http_log_gzip_alloc;[m
[31m-    zstream.zfree = ngx_http_log_gzip_free;[m
[31m-    zstream.opaque = pool;[m
[31m-[m
[31m-    out = ngx_pnalloc(pool, size);[m
[31m-    if (out == NULL) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    zstream.next_in = buf;[m
[31m-    zstream.avail_in = len;[m
[31m-    zstream.next_out = out;[m
[31m-    zstream.avail_out = size;[m
[31m-[m
[31m-    rc = deflateInit2(&zstream, (int) level, Z_DEFLATED, wbits + 16, memlevel,[m
[31m-                      Z_DEFAULT_STRATEGY);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateInit2() failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "deflate in: ni:%p no:%p ai:%ud ao:%ud",[m
[31m-                   zstream.next_in, zstream.next_out,[m
[31m-                   zstream.avail_in, zstream.avail_out);[m
[31m-[m
[31m-    rc = deflate(&zstream, Z_FINISH);[m
[31m-[m
[31m-    if (rc != Z_STREAM_END) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "deflate(Z_FINISH) failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",[m
[31m-                   zstream.next_in, zstream.next_out,[m
[31m-                   zstream.avail_in, zstream.avail_out,[m
[31m-                   rc);[m
[31m-[m
[31m-    size -= zstream.avail_out;[m
[31m-[m
[31m-    rc = deflateEnd(&zstream);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateEnd() failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_fd(fd, out, size);[m
[31m-[m
[31m-    if (n != (ssize_t) size) {[m
[31m-        err = (n == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-        ngx_set_errno(err);[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-[m
[31m-    /* simulate successful logging */[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size)[m
[31m-{[m
[31m-    ngx_pool_t *pool = opaque;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                   "gzip alloc: n:%ud s:%ud", items, size);[m
[31m-[m
[31m-    return ngx_palloc(pool, items * size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_gzip_free(void *opaque, void *address)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_pool_t *pool = opaque;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0, "gzip free: %p", address);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log)[m
[31m-{[m
[31m-    size_t               len;[m
[31m-    ssize_t              n;[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-[m
[31m-    buffer = file->data;[m
[31m-[m
[31m-    len = buffer->pos - buffer->start;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-    if (buffer->gzip) {[m
[31m-        n = ngx_http_log_gzip(file->fd, buffer->start, len, buffer->gzip, log);[m
[31m-    } else {[m
[31m-        n = ngx_write_fd(file->fd, buffer->start, len);[m
[31m-    }[m
[31m-#else[m
[31m-    n = ngx_write_fd(file->fd, buffer->start, len);[m
[31m-#endif[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_write_fd_n " to \"%s\" failed",[m
[31m-                      file->name.data);[m
[31m-[m
[31m-    } else if ((size_t) n != len) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",[m
[31m-                      file->name.data, n, len);[m
[31m-    }[m
[31m-[m
[31m-    buffer->pos = buffer->start;[m
[31m-[m
[31m-    if (buffer->event && buffer->event->timer_set) {[m
[31m-        ngx_del_timer(buffer->event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_flush_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_open_file_t     *file;[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "http log buffer flush handler");[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ngx_http_log_flush(ev->data, ev->log);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* cancel the flush timer for graceful shutdown */[m
[31m-[m
[31m-    file = ev->data;[m
[31m-    buffer = file->data;[m
[31m-[m
[31m-    buffer->event = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_copy_short(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    size_t     len;[m
[31m-    uintptr_t  data;[m
[31m-[m
[31m-    len = op->len;[m
[31m-    data = op->data;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        *buf++ = (u_char) (data & 0xff);[m
[31m-        data >>= 8;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_copy_long(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, (u_char *) op->data, op->len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    if (r->pipeline) {[m
[31m-        *buf = 'p';[m
[31m-    } else {[m
[31m-        *buf = '.';[m
[31m-    }[m
[31m-[m
[31m-    return buf + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_time(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, ngx_cached_http_log_time.data,[m
[31m-                      ngx_cached_http_log_time.len);[m
[31m-}[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, ngx_cached_http_log_iso8601.data,[m
[31m-                      ngx_cached_http_log_iso8601.len);[m
[31m-}[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_msec(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_time_t  *tp;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%T.%03M", tp->sec, tp->msec);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_time_t      *tp;[m
[31m-    ngx_msec_int_t   ms;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ms = (ngx_msec_int_t)[m
[31m-             ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec));[m
[31m-    ms = ngx_max(ms, 0);[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%T.%03M", (time_t) ms / 1000, ms % 1000);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_status(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_uint_t  status;[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        status = r->err_status;[m
[31m-[m
[31m-    } else if (r->headers_out.status) {[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-    } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-        status = 9;[m
[31m-[m
[31m-    } else {[m
[31m-        status = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%03ui", status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_sprintf(buf, "%O", r->connection->sent);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * although there is a real $body_bytes_sent variable,[m
[31m- * this log operation code function is more optimized for logging[m
[31m- */[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_body_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    off_t  length;[m
[31m-[m
[31m-    length = r->connection->sent - r->header_size;[m
[31m-[m
[31m-    if (length > 0) {[m
[31m-        return ngx_sprintf(buf, "%O", length);[m
[31m-    }[m
[31m-[m
[31m-    *buf = '0';[m
[31m-[m
[31m-    return buf + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_sprintf(buf, "%O", r->request_length);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_variable_compile(ngx_conf_t *cf, ngx_http_log_op_t *op,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t  index;[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, value);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    op->len = 0;[m
[31m-    op->getlen = ngx_http_log_variable_getlen;[m
[31m-    op->run = ngx_http_log_variable;[m
[31m-    op->data = index;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)[m
[31m-{[m
[31m-    uintptr_t                   len;[m
[31m-    ngx_http_log_loc_conf_t    *lcf;[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    value = ngx_http_get_indexed_variable(r, data);[m
[31m-[m
[31m-    if (value == NULL || value->not_found) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    len = ngx_http_log_escape(lcf, NULL, value->data, value->len);[m
[31m-[m
[31m-    value->escape = len ? 1 : 0;[m
[31m-[m
[31m-    return value->len + len * 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t    *lcf;[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    value = ngx_http_get_indexed_variable(r, op->data);[m
[31m-[m
[31m-    if (value == NULL || value->not_found) {[m
[31m-        *buf = '-';[m
[31m-        return buf + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (value->escape == 0) {[m
[31m-        return ngx_cpymem(buf, value->data, value->len);[m
[31m-[m
[31m-    } else {[m
[31m-        lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-        return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uintptr_t[m
[31m-ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,[m
[31m-    size_t size)[m
[31m-{[m
[31m-    ngx_uint_t                   n;[m
[31m-    static u_char                hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-    static uint32_t   escape[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000004, /* 0000 0000 0000 0000  0000 0000 0000 0100 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x10000000, /* 0001 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-    if (lcf->escape_non_ascii) {[m
[31m-        ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&escape[4], sizeof(uint32_t) * 4);[m
[31m-    }[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '\\';[m
[31m-            *dst++ = 'x';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_log_main_conf_t  *conf;[m
[31m-[m
[31m-    ngx_http_log_fmt_t  *fmt;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&conf->formats, cf->pool, 4, sizeof(ngx_http_log_fmt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    fmt = ngx_array_push(&conf->formats);[m
[31m-    if (fmt == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&fmt->name, "combined");[m
[31m-[m
[31m-    fmt->flushes = NULL;[m
[31m-[m
[31m-    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t));[m
[31m-    if (fmt->ops == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->open_file_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->escape_non_ascii = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *prev = parent;[m
[31m-    ngx_http_log_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_http_log_t            *log;[m
[31m-    ngx_http_log_fmt_t        *fmt;[m
[31m-    ngx_http_log_main_conf_t  *lmcf;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);[m
[31m-[m
[31m-    if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        conf->open_file_cache = prev->open_file_cache;[m
[31m-        conf->open_file_cache_valid = prev->open_file_cache_valid;[m
[31m-        conf->open_file_cache_min_uses = prev->open_file_cache_min_uses;[m
[31m-[m
[31m-        if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->open_file_cache = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->logs || conf->off) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf->logs = prev->logs;[m
[31m-    conf->off = prev->off;[m
[31m-[m
[31m-    if (conf->logs || conf->off) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t));[m
[31m-    if (conf->logs == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    log = ngx_array_push(conf->logs);[m
[31m-    if (log == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(log, sizeof(ngx_http_log_t));[m
[31m-[m
[31m-    log->file = ngx_conf_open_file(cf->cycle, &ngx_http_access_log);[m
[31m-    if (log->file == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-[m
[31m-    /* the default "combined" format */[m
[31m-    log->format = &fmt[0];[m
[31m-    lmcf->combined_used = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *llcf = conf;[m
[31m-[m
[31m-    ssize_t                            size;[m
[31m-    ngx_int_t                          gzip;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_msec_t                         flush;[m
[31m-    ngx_str_t                         *value, name, s;[m
[31m-    ngx_http_log_t                    *log;[m
[31m-    ngx_syslog_peer_t                 *peer;[m
[31m-    ngx_http_log_buf_t                *buffer;[m
[31m-    ngx_http_log_fmt_t                *fmt;[m
[31m-    ngx_http_log_main_conf_t          *lmcf;[m
[31m-    ngx_http_script_compile_t          sc;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        llcf->off = 1;[m
[31m-        if (cf->args->nelts == 2) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->logs == NULL) {[m
[31m-        llcf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t));[m
[31m-        if (llcf->logs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-[m
[31m-    log = ngx_array_push(llcf->logs);[m
[31m-    if (log == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(log, sizeof(ngx_http_log_t));[m
[31m-[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) {[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log->syslog_peer = peer;[m
[31m-[m
[31m-        goto process_formats;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        log->file = ngx_conf_open_file(cf->cycle, &value[1]);[m
[31m-        if (log->file == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log->script = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_script_t));[m
[31m-        if (log->script == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &value[1];[m
[31m-        sc.lengths = &log->script->lengths;[m
[31m-        sc.values = &log->script->values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-process_formats:[m
[31m-[m
[31m-    if (cf->args->nelts >= 3) {[m
[31m-        name = value[2];[m
[31m-[m
[31m-        if (ngx_strcmp(name.data, "combined") == 0) {[m
[31m-            lmcf->combined_used = 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&name, "combined");[m
[31m-        lmcf->combined_used = 1;[m
[31m-    }[m
[31m-[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-    for (i = 0; i < lmcf->formats.nelts; i++) {[m
[31m-        if (fmt[i].name.len == name.len[m
[31m-            && ngx_strcasecmp(fmt[i].name.data, name.data) == 0)[m
[31m-        {[m
[31m-            log->format = &fmt[i];[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (log->format == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unknown log format \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    flush = 0;[m
[31m-    gzip = 0;[m
[31m-[m
[31m-    for (i = 3; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "buffer=", 7) == 0) {[m
[31m-            s.len = value[i].len - 7;[m
[31m-            s.data = value[i].data + 7;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR || size == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid buffer size \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "flush=", 6) == 0) {[m
[31m-            s.len = value[i].len - 6;[m
[31m-            s.data = value[i].data + 6;[m
[31m-[m
[31m-            flush = ngx_parse_time(&s, 0);[m
[31m-[m
[31m-            if (flush == (ngx_msec_t) NGX_ERROR || flush == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid flush time \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "gzip", 4) == 0[m
[31m-            && (value[i].len == 4 || value[i].data[4] == '='))[m
[31m-        {[m
[31m-#if (NGX_ZLIB)[m
[31m-            if (size == 0) {[m
[31m-                size = 64 * 1024;[m
[31m-            }[m
[31m-[m
[31m-            if (value[i].len == 4) {[m
[31m-                gzip = Z_BEST_SPEED;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 5;[m
[31m-            s.data = value[i].data + 5;[m
[31m-[m
[31m-            gzip = ngx_atoi(s.data, s.len);[m
[31m-[m
[31m-            if (gzip < 1 || gzip > 9) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid compression level \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "nginx was built without zlib support");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "if=", 3) == 0) {[m
[31m-            s.len = value[i].len - 3;[m
[31m-            s.data = value[i].data + 3;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &s;[m
[31m-            ccv.complex_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_complex_value_t));[m
[31m-            if (ccv.complex_value == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            log->filter = ccv.complex_value;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flush && size == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no buffer is defined for access_log \"%V\"",[m
[31m-                           &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-[m
[31m-        if (log->script) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "buffered logs cannot have variables in name");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (log->syslog_peer) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "logs to syslog cannot be buffered");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (log->file->data) {[m
[31m-            buffer = log->file->data;[m
[31m-[m
[31m-            if (buffer->last - buffer->start != size[m
[31m-                || buffer->flush != flush[m
[31m-                || buffer->gzip != gzip)[m
[31m-            {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "access_log \"%V\" already defined "[m
[31m-                                   "with conflicting parameters",[m
[31m-                                   &value[1]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        buffer = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_buf_t));[m
[31m-        if (buffer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buffer->start = ngx_pnalloc(cf->pool, size);[m
[31m-        if (buffer->start == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buffer->pos = buffer->start;[m
[31m-        buffer->last = buffer->start + size;[m
[31m-[m
[31m-        if (flush) {[m
[31m-            buffer->event = ngx_pcalloc(cf->pool, sizeof(ngx_event_t));[m
[31m-            if (buffer->event == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            buffer->event->data = log->file;[m
[31m-            buffer->event->handler = ngx_http_log_flush_handler;[m
[31m-            buffer->event->log = &cf->cycle->new_log;[m
[31m-            buffer->event->cancelable = 1;[m
[31m-[m
[31m-            buffer->flush = flush;[m
[31m-        }[m
[31m-[m
[31m-        buffer->gzip = gzip;[m
[31m-[m
[31m-        log->file->flush = ngx_http_log_flush;[m
[31m-        log->file->data = buffer;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_main_conf_t *lmcf = conf;[m
[31m-[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_http_log_fmt_t  *fmt;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-    for (i = 0; i < lmcf->formats.nelts; i++) {[m
[31m-        if (fmt[i].name.len == value[1].len[m
[31m-            && ngx_strcmp(fmt[i].name.data, value[1].data) == 0)[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate \"log_format\" name \"%V\"",[m
[31m-                               &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fmt = ngx_array_push(&lmcf->formats);[m
[31m-    if (fmt == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fmt->name = value[1];[m
[31m-[m
[31m-    fmt->flushes = ngx_array_create(cf->pool, 4, sizeof(ngx_int_t));[m
[31m-    if (fmt->flushes == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t));[m
[31m-    if (fmt->ops == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_log_compile_format(cf, fmt->flushes, fmt->ops, cf->args, 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_compile_format(ngx_conf_t *cf, ngx_array_t *flushes,[m
[31m-    ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s)[m
[31m-{[m
[31m-    u_char              *data, *p, ch;[m
[31m-    size_t               i, len;[m
[31m-    ngx_str_t           *value, var;[m
[31m-    ngx_int_t           *flush;[m
[31m-    ngx_uint_t           bracket;[m
[31m-    ngx_http_log_op_t   *op;[m
[31m-    ngx_http_log_var_t  *v;[m
[31m-[m
[31m-    value = args->elts;[m
[31m-[m
[31m-    for ( /* void */ ; s < args->nelts; s++) {[m
[31m-[m
[31m-        i = 0;[m
[31m-[m
[31m-        while (i < value[s].len) {[m
[31m-[m
[31m-            op = ngx_array_push(ops);[m
[31m-            if (op == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            data = &value[s].data[i];[m
[31m-[m
[31m-            if (value[s].data[i] == '$') {[m
[31m-[m
[31m-                if (++i == value[s].len) {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                if (value[s].data[i] == '{') {[m
[31m-                    bracket = 1;[m
[31m-[m
[31m-                    if (++i == value[s].len) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                    var.data = &value[s].data[i];[m
[31m-[m
[31m-                } else {[m
[31m-                    bracket = 0;[m
[31m-                    var.data = &value[s].data[i];[m
[31m-                }[m
[31m-[m
[31m-                for (var.len = 0; i < value[s].len; i++, var.len++) {[m
[31m-                    ch = value[s].data[i];[m
[31m-[m
[31m-                    if (ch == '}' && bracket) {[m
[31m-                        i++;[m
[31m-                        bracket = 0;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if ((ch >= 'A' && ch <= 'Z')[m
[31m-                        || (ch >= 'a' && ch <= 'z')[m
[31m-                        || (ch >= '0' && ch <= '9')[m
[31m-                        || ch == '_')[m
[31m-                    {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (bracket) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "the closing bracket in \"%V\" "[m
[31m-                                       "variable is missing", &var);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (var.len == 0) {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                for (v = ngx_http_log_vars; v->name.len; v++) {[m
[31m-[m
[31m-                    if (v->name.len == var.len[m
[31m-                        && ngx_strncmp(v->name.data, var.data, var.len) == 0)[m
[31m-                    {[m
[31m-                        op->len = v->len;[m
[31m-                        op->getlen = NULL;[m
[31m-                        op->run = v->run;[m
[31m-                        op->data = 0;[m
[31m-[m
[31m-                        goto found;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_http_log_variable_compile(cf, op, &var) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (flushes) {[m
[31m-[m
[31m-                    flush = ngx_array_push(flushes);[m
[31m-                    if (flush == NULL) {[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    *flush = op->data; /* variable index */[m
[31m-                }[m
[31m-[m
[31m-            found:[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            while (i < value[s].len && value[s].data[i] != '$') {[m
[31m-                i++;[m
[31m-            }[m
[31m-[m
[31m-            len = &value[s].data[i] - data;[m
[31m-[m
[31m-            if (len) {[m
[31m-[m
[31m-                op->len = len;[m
[31m-                op->getlen = NULL;[m
[31m-[m
[31m-                if (len <= sizeof(uintptr_t)) {[m
[31m-                    op->run = ngx_http_log_copy_short;[m
[31m-                    op->data = 0;[m
[31m-[m
[31m-                    while (len--) {[m
[31m-                        op->data <<= 8;[m
[31m-                        op->data |= data[len];[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    op->run = ngx_http_log_copy_long;[m
[31m-[m
[31m-                    p = ngx_pnalloc(cf->pool, len);[m
[31m-                    if (p == NULL) {[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_memcpy(p, data, len);[m
[31m-                    op->data = (uintptr_t) p;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%s\"", data);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *llcf = conf;[m
[31m-[m
[31m-    time_t       inactive, valid;[m
[31m-    ngx_str_t   *value, s;[m
[31m-    ngx_int_t    max, min_uses;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (llcf->open_file_cache != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    max = 0;[m
[31m-    inactive = 10;[m
[31m-    valid = 60;[m
[31m-    min_uses = 1;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", 4) == 0) {[m
[31m-[m
[31m-            max = ngx_atoi(value[i].data + 4, value[i].len - 4);[m
[31m-            if (max == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "min_uses=", 9) == 0) {[m
[31m-[m
[31m-            min_uses = ngx_atoi(value[i].data + 9, value[i].len - 9);[m
[31m-            if (min_uses == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "valid=", 6) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 6;[m
[31m-            s.data = value[i].data + 6;[m
[31m-[m
[31m-            valid = ngx_parse_time(&s, 1);[m
[31m-            if (valid == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-[m
[31m-            llcf->open_file_cache = NULL;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    failed:[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid \"open_log_file_cache\" parameter \"%V\"",[m
[31m-                           &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->open_file_cache == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (max == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "\"open_log_file_cache\" must have \"max\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive);[m
[31m-[m
[31m-    if (llcf->open_file_cache) {[m
[31m-[m
[31m-        llcf->open_file_cache_valid = valid;[m
[31m-        llcf->open_file_cache_min_uses = min_uses;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_array_t                 a;[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_log_fmt_t         *fmt;[m
[31m-    ngx_http_log_main_conf_t   *lmcf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-[m
[31m-    if (lmcf->combined_used) {[m
[31m-        if (ngx_array_init(&a, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = ngx_array_push(&a);[m
[31m-        if (value == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *value = ngx_http_combined_fmt;[m
[31m-        fmt = lmcf->formats.elts;[m
[31m-[m
[31m-        if (ngx_http_log_compile_format(cf, NULL, fmt->ops, &a, 0)[m
[31m-            != NGX_CONF_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_log_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_log_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_log_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex df9424f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_log_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,1794 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-#include <zlib.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_log_op_s  ngx_http_log_op_t;[m
[31m-[m
[31m-typedef u_char *(*ngx_http_log_op_run_pt) (ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-[m
[31m-typedef size_t (*ngx_http_log_op_getlen_pt) (ngx_http_request_t *r,[m
[31m-    uintptr_t data);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_log_op_s {[m
[31m-    size_t                      len;[m
[31m-    ngx_http_log_op_getlen_pt   getlen;[m
[31m-    ngx_http_log_op_run_pt      run;[m
[31m-    uintptr_t                   data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_array_t                *flushes;[m
[31m-    ngx_array_t                *ops;        /* array of ngx_http_log_op_t */[m
[31m-} ngx_http_log_fmt_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                 formats;    /* array of ngx_http_log_fmt_t */[m
[31m-    ngx_uint_t                  combined_used; /* unsigned  combined_used:1 */[m
[31m-} ngx_http_log_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *start;[m
[31m-    u_char                     *pos;[m
[31m-    u_char                     *last;[m
[31m-[m
[31m-    ngx_event_t                *event;[m
[31m-    ngx_msec_t                  flush;[m
[31m-    ngx_int_t                   gzip;[m
[31m-} ngx_http_log_buf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *lengths;[m
[31m-    ngx_array_t                *values;[m
[31m-} ngx_http_log_script_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_open_file_t            *file;[m
[31m-    ngx_http_log_script_t      *script;[m
[31m-    time_t                      disk_full_time;[m
[31m-    time_t                      error_log_time;[m
[31m-    ngx_syslog_peer_t          *syslog_peer;[m
[31m-    ngx_http_log_fmt_t         *format;[m
[31m-    ngx_http_complex_value_t   *filter;[m
[31m-} ngx_http_log_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *logs;       /* array of ngx_http_log_t */[m
[31m-[m
[31m-    ngx_open_file_cache_t      *open_file_cache;[m
[31m-    time_t                      open_file_cache_valid;[m
[31m-    ngx_uint_t                  open_file_cache_min_uses;[m
[31m-[m
[31m-    ngx_uint_t                  off;        /* unsigned  off:1 */[m
[31m-} ngx_http_log_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    size_t                      len;[m
[31m-    ngx_http_log_op_run_pt      run;[m
[31m-} ngx_http_log_var_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log,[m
[31m-    u_char *buf, size_t len);[m
[31m-static ssize_t ngx_http_log_script_write(ngx_http_request_t *r,[m
[31m-    ngx_http_log_script_t *script, u_char **name, u_char *buf, size_t len);[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-static ssize_t ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len,[m
[31m-    ngx_int_t level, ngx_log_t *log);[m
[31m-[m
[31m-static void *ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size);[m
[31m-static void ngx_http_log_gzip_free(void *opaque, void *address);[m
[31m-#endif[m
[31m-[m
[31m-static void ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log);[m
[31m-static void ngx_http_log_flush_handler(ngx_event_t *ev);[m
[31m-[m
[31m-static u_char *ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_msec(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_status(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_body_bytes_sent(ngx_http_request_t *r,[m
[31m-    u_char *buf, ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-[m
[31m-static ngx_int_t ngx_http_log_variable_compile(ngx_conf_t *cf,[m
[31m-    ngx_http_log_op_t *op, ngx_str_t *value);[m
[31m-static size_t ngx_http_log_variable_getlen(ngx_http_request_t *r,[m
[31m-    uintptr_t data);[m
[31m-static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_log_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_log_compile_format(ngx_conf_t *cf,[m
[31m-    ngx_array_t *flushes, ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s);[m
[31m-static char *ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_log_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_log_commands[] = {[m
[31m-[m
[31m-    { ngx_string("log_format"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_log_set_format,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("access_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_HTTP_LMT_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_log_set_log,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_log_file_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_http_log_open_file_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_log_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_log_init,                     /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_log_create_main_conf,         /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_log_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_log_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_log_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_log_module_ctx,              /* module context */[m
[31m-    ngx_http_log_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_access_log = ngx_string(NGX_HTTP_LOG_PATH);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_combined_fmt =[m
[31m-    ngx_string("$remote_addr - $remote_user [$time_local] "[m
[31m-               "\"$request\" $status $body_bytes_sent "[m
[31m-               "\"$http_referer\" \"$http_user_agent\"");[m
[31m-[m
[31m-[m
[31m-static ngx_http_log_var_t  ngx_http_log_vars[] = {[m
[31m-    { ngx_string("pipe"), 1, ngx_http_log_pipe },[m
[31m-    { ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1,[m
[31m-                          ngx_http_log_time },[m
[31m-    { ngx_string("time_iso8601"), sizeof("1970-09-28T12:00:00+06:00") - 1,[m
[31m-                          ngx_http_log_iso8601 },[m
[31m-    { ngx_string("msec"), NGX_TIME_T_LEN + 4, ngx_http_log_msec },[m
[31m-    { ngx_string("request_time"), NGX_TIME_T_LEN + 4,[m
[31m-                          ngx_http_log_request_time },[m
[31m-    { ngx_string("status"), NGX_INT_T_LEN, ngx_http_log_status },[m
[31m-    { ngx_string("bytes_sent"), NGX_OFF_T_LEN, ngx_http_log_bytes_sent },[m
[31m-    { ngx_string("body_bytes_sent"), NGX_OFF_T_LEN,[m
[31m-                          ngx_http_log_body_bytes_sent },[m
[31m-    { ngx_string("request_length"), NGX_SIZE_T_LEN,[m
[31m-                          ngx_http_log_request_length },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                   *line, *p;[m
[31m-    size_t                    len, size;[m
[31m-    ssize_t                   n;[m
[31m-    ngx_str_t                 val;[m
[31m-    ngx_uint_t                i, l;[m
[31m-    ngx_http_log_t           *log;[m
[31m-    ngx_http_log_op_t        *op;[m
[31m-    ngx_http_log_buf_t       *buffer;[m
[31m-    ngx_http_log_loc_conf_t  *lcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log handler");[m
[31m-[m
[31m-    lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    if (lcf->off) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    log = lcf->logs->elts;[m
[31m-    for (l = 0; l < lcf->logs->nelts; l++) {[m
[31m-[m
[31m-        if (log[l].filter) {[m
[31m-            if (ngx_http_complex_value(r, log[l].filter, &val) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (val.len == 0 || (val.len == 1 && val.data[0] == '0')) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_time() == log[l].disk_full_time) {[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD writing to a full filesystem with enabled softupdates[m
[31m-             * may block process for much longer time than writing to non-full[m
[31m-             * filesystem, so we skip writing to a log for one second[m
[31m-             */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, log[l].format->flushes);[m
[31m-[m
[31m-        len = 0;[m
[31m-        op = log[l].format->ops->elts;[m
[31m-        for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-            if (op[i].len == 0) {[m
[31m-                len += op[i].getlen(r, op[i].data);[m
[31m-[m
[31m-            } else {[m
[31m-                len += op[i].len;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-[m
[31m-            /* length of syslog's PRI and HEADER message parts */[m
[31m-            len += sizeof("<255>Jan 01 00:00:00 ") - 1[m
[31m-                   + ngx_cycle->hostname.len + 1[m
[31m-                   + log[l].syslog_peer->tag.len + 2;[m
[31m-[m
[31m-            goto alloc_line;[m
[31m-        }[m
[31m-[m
[31m-        len += NGX_LINEFEED_SIZE;[m
[31m-[m
[31m-        buffer = log[l].file ? log[l].file->data : NULL;[m
[31m-[m
[31m-        if (buffer) {[m
[31m-[m
[31m-            if (len > (size_t) (buffer->last - buffer->pos)) {[m
[31m-[m
[31m-                ngx_http_log_write(r, &log[l], buffer->start,[m
[31m-                                   buffer->pos - buffer->start);[m
[31m-[m
[31m-                buffer->pos = buffer->start;[m
[31m-            }[m
[31m-[m
[31m-            if (len <= (size_t) (buffer->last - buffer->pos)) {[m
[31m-[m
[31m-                p = buffer->pos;[m
[31m-[m
[31m-                if (buffer->event && p == buffer->start) {[m
[31m-                    ngx_add_timer(buffer->event, buffer->flush);[m
[31m-                }[m
[31m-[m
[31m-                for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-                    p = op[i].run(r, p, &op[i]);[m
[31m-                }[m
[31m-[m
[31m-                ngx_linefeed(p);[m
[31m-[m
[31m-                buffer->pos = p;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (buffer->event && buffer->event->timer_set) {[m
[31m-                ngx_del_timer(buffer->event);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    alloc_line:[m
[31m-[m
[31m-        line = ngx_pnalloc(r->pool, len);[m
[31m-        if (line == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = line;[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-            p = ngx_syslog_add_header(log[l].syslog_peer, line);[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-            p = op[i].run(r, p, &op[i]);[m
[31m-        }[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-[m
[31m-            size = p - line;[m
[31m-[m
[31m-            n = ngx_syslog_send(log[l].syslog_peer, line, size);[m
[31m-[m
[31m-            if (n < 0) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "send() to syslog failed");[m
[31m-[m
[31m-            } else if ((size_t) n != size) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "send() to syslog has written only %z of %uz",[m
[31m-                              n, size);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_linefeed(p);[m
[31m-[m
[31m-        ngx_http_log_write(r, &log[l], line, p - line);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log, u_char *buf,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    u_char              *name;[m
[31m-    time_t               now;[m
[31m-    ssize_t              n;[m
[31m-    ngx_err_t            err;[m
[31m-#if (NGX_ZLIB)[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-#endif[m
[31m-[m
[31m-    if (log->script == NULL) {[m
[31m-        name = log->file->name.data;[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-        buffer = log->file->data;[m
[31m-[m
[31m-        if (buffer && buffer->gzip) {[m
[31m-            n = ngx_http_log_gzip(log->file->fd, buf, len, buffer->gzip,[m
[31m-                                  r->connection->log);[m
[31m-        } else {[m
[31m-            n = ngx_write_fd(log->file->fd, buf, len);[m
[31m-        }[m
[31m-#else[m
[31m-        n = ngx_write_fd(log->file->fd, buf, len);[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        name = NULL;[m
[31m-        n = ngx_http_log_script_write(r, log->script, &name, buf, len);[m
[31m-    }[m
[31m-[m
[31m-    if (n == (ssize_t) len) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOSPC) {[m
[31m-            log->disk_full_time = now;[m
[31m-        }[m
[31m-[m
[31m-        if (now - log->error_log_time > 59) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, err,[m
[31m-                          ngx_write_fd_n " to \"%s\" failed", name);[m
[31m-[m
[31m-            log->error_log_time = now;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (now - log->error_log_time > 59) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",[m
[31m-                      name, n, len);[m
[31m-[m
[31m-        log->error_log_time = now;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_log_script_write(ngx_http_request_t *r, ngx_http_log_script_t *script,[m
[31m-    u_char **name, u_char *buf, size_t len)[m
[31m-{[m
[31m-    size_t                     root;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_str_t                  log, path;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_log_loc_conf_t   *llcf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->root_tested) {[m
[31m-[m
[31m-        /* test root directory existence */[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        path.data[root] = '\0';[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_dir = 1;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            if (of.err == 0) {[m
[31m-                /* simulate successful logging */[m
[31m-                return len;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, of.err,[m
[31m-                          "testing \"%s\" existence failed", path.data);[m
[31m-[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        if (!of.is_dir) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ENOTDIR,[m
[31m-                          "testing \"%s\" existence failed", path.data);[m
[31m-[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &log, script->lengths->elts, 1,[m
[31m-                            script->values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    log.data[log.len - 1] = '\0';[m
[31m-    *name = log.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log \"%s\"", log.data);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.log = 1;[m
[31m-    of.valid = llcf->open_file_cache_valid;[m
[31m-    of.min_uses = llcf->open_file_cache_min_uses;[m
[31m-    of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &log, &of) != NGX_OK) {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(llcf->open_file_cache, &log, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      "%s \"%s\" failed", of.failed, log.data);[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log #%d", of.fd);[m
[31m-[m
[31m-    n = ngx_write_fd(of.fd, buf, len);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len, ngx_int_t level,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    int          rc, wbits, memlevel;[m
[31m-    u_char      *out;[m
[31m-    size_t       size;[m
[31m-    ssize_t      n;[m
[31m-    z_stream     zstream;[m
[31m-    ngx_err_t    err;[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    wbits = MAX_WBITS;[m
[31m-    memlevel = MAX_MEM_LEVEL - 1;[m
[31m-[m
[31m-    while ((ssize_t) len < ((1 << (wbits - 1)) - 262)) {[m
[31m-        wbits--;[m
[31m-        memlevel--;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * This is a formula from deflateBound() for conservative upper bound of[m
[31m-     * compressed data plus 18 bytes of gzip wrapper.[m
[31m-     */[m
[31m-[m
[31m-    size = len + ((len + 7) >> 3) + ((len + 63) >> 6) + 5 + 18;[m
[31m-[m
[31m-    ngx_memzero(&zstream, sizeof(z_stream));[m
[31m-[m
[31m-    pool = ngx_create_pool(256, log);[m
[31m-    if (pool == NULL) {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    pool->log = log;[m
[31m-[m
[31m-    zstream.zalloc = ngx_http_log_gzip_alloc;[m
[31m-    zstream.zfree = ngx_http_log_gzip_free;[m
[31m-    zstream.opaque = pool;[m
[31m-[m
[31m-    out = ngx_pnalloc(pool, size);[m
[31m-    if (out == NULL) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    zstream.next_in = buf;[m
[31m-    zstream.avail_in = len;[m
[31m-    zstream.next_out = out;[m
[31m-    zstream.avail_out = size;[m
[31m-[m
[31m-    rc = deflateInit2(&zstream, (int) level, Z_DEFLATED, wbits + 16, memlevel,[m
[31m-                      Z_DEFAULT_STRATEGY);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateInit2() failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "deflate in: ni:%p no:%p ai:%ud ao:%ud",[m
[31m-                   zstream.next_in, zstream.next_out,[m
[31m-                   zstream.avail_in, zstream.avail_out);[m
[31m-[m
[31m-    rc = deflate(&zstream, Z_FINISH);[m
[31m-[m
[31m-    if (rc != Z_STREAM_END) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "deflate(Z_FINISH) failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",[m
[31m-                   zstream.next_in, zstream.next_out,[m
[31m-                   zstream.avail_in, zstream.avail_out,[m
[31m-                   rc);[m
[31m-[m
[31m-    size -= zstream.avail_out;[m
[31m-[m
[31m-    rc = deflateEnd(&zstream);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateEnd() failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_fd(fd, out, size);[m
[31m-[m
[31m-    if (n != (ssize_t) size) {[m
[31m-        err = (n == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-        ngx_set_errno(err);[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-[m
[31m-    /* simulate successful logging */[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size)[m
[31m-{[m
[31m-    ngx_pool_t *pool = opaque;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                   "gzip alloc: n:%ud s:%ud", items, size);[m
[31m-[m
[31m-    return ngx_palloc(pool, items * size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_gzip_free(void *opaque, void *address)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_pool_t *pool = opaque;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0, "gzip free: %p", address);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log)[m
[31m-{[m
[31m-    size_t               len;[m
[31m-    ssize_t              n;[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-[m
[31m-    buffer = file->data;[m
[31m-[m
[31m-    len = buffer->pos - buffer->start;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-    if (buffer->gzip) {[m
[31m-        n = ngx_http_log_gzip(file->fd, buffer->start, len, buffer->gzip, log);[m
[31m-    } else {[m
[31m-        n = ngx_write_fd(file->fd, buffer->start, len);[m
[31m-    }[m
[31m-#else[m
[31m-    n = ngx_write_fd(file->fd, buffer->start, len);[m
[31m-#endif[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_write_fd_n " to \"%s\" failed",[m
[31m-                      file->name.data);[m
[31m-[m
[31m-    } else if ((size_t) n != len) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",[m
[31m-                      file->name.data, n, len);[m
[31m-    }[m
[31m-[m
[31m-    buffer->pos = buffer->start;[m
[31m-[m
[31m-    if (buffer->event && buffer->event->timer_set) {[m
[31m-        ngx_del_timer(buffer->event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_flush_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_open_file_t     *file;[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "http log buffer flush handler");[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ngx_http_log_flush(ev->data, ev->log);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* cancel the flush timer for graceful shutdown */[m
[31m-[m
[31m-    file = ev->data;[m
[31m-    buffer = file->data;[m
[31m-[m
[31m-    buffer->event = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_copy_short(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    size_t     len;[m
[31m-    uintptr_t  data;[m
[31m-[m
[31m-    len = op->len;[m
[31m-    data = op->data;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        *buf++ = (u_char) (data & 0xff);[m
[31m-        data >>= 8;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_copy_long(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, (u_char *) op->data, op->len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    if (r->pipeline) {[m
[31m-        *buf = 'p';[m
[31m-    } else {[m
[31m-        *buf = '.';[m
[31m-    }[m
[31m-[m
[31m-    return buf + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_time(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, ngx_cached_http_log_time.data,[m
[31m-                      ngx_cached_http_log_time.len);[m
[31m-}[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, ngx_cached_http_log_iso8601.data,[m
[31m-                      ngx_cached_http_log_iso8601.len);[m
[31m-}[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_msec(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_time_t  *tp;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%T.%03M", tp->sec, tp->msec);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_time_t      *tp;[m
[31m-    ngx_msec_int_t   ms;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ms = (ngx_msec_int_t)[m
[31m-             ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec));[m
[31m-    ms = ngx_max(ms, 0);[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%T.%03M", (time_t) ms / 1000, ms % 1000);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_status(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_uint_t  status;[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        status = r->err_status;[m
[31m-[m
[31m-    } else if (r->headers_out.status) {[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-    } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-        status = 9;[m
[31m-[m
[31m-    } else {[m
[31m-        status = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%03ui", status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_sprintf(buf, "%O", r->connection->sent);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * although there is a real $body_bytes_sent variable,[m
[31m- * this log operation code function is more optimized for logging[m
[31m- */[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_body_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    off_t  length;[m
[31m-[m
[31m-    length = r->connection->sent - r->header_size;[m
[31m-[m
[31m-    if (length > 0) {[m
[31m-        return ngx_sprintf(buf, "%O", length);[m
[31m-    }[m
[31m-[m
[31m-    *buf = '0';[m
[31m-[m
[31m-    return buf + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_sprintf(buf, "%O", r->request_length);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_variable_compile(ngx_conf_t *cf, ngx_http_log_op_t *op,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t  index;[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, value);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    op->len = 0;[m
[31m-    op->getlen = ngx_http_log_variable_getlen;[m
[31m-    op->run = ngx_http_log_variable;[m
[31m-    op->data = index;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)[m
[31m-{[m
[31m-    uintptr_t                   len;[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    value = ngx_http_get_indexed_variable(r, data);[m
[31m-[m
[31m-    if (value == NULL || value->not_found) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_http_log_escape(NULL, value->data, value->len);[m
[31m-[m
[31m-    value->escape = len ? 1 : 0;[m
[31m-[m
[31m-    return value->len + len * 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    value = ngx_http_get_indexed_variable(r, op->data);[m
[31m-[m
[31m-    if (value == NULL || value->not_found) {[m
[31m-        *buf = '-';[m
[31m-        return buf + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (value->escape == 0) {[m
[31m-        return ngx_cpymem(buf, value->data, value->len);[m
[31m-[m
[31m-    } else {[m
[31m-        return (u_char *) ngx_http_log_escape(buf, value->data, value->len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uintptr_t[m
[31m-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    ngx_uint_t      n;[m
[31m-    static u_char   hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-    static uint32_t   escape[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000004, /* 0000 0000 0000 0000  0000 0000 0000 0100 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x10000000, /* 0001 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '\\';[m
[31m-            *dst++ = 'x';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_log_main_conf_t  *conf;[m
[31m-[m
[31m-    ngx_http_log_fmt_t  *fmt;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&conf->formats, cf->pool, 4, sizeof(ngx_http_log_fmt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    fmt = ngx_array_push(&conf->formats);[m
[31m-    if (fmt == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&fmt->name, "combined");[m
[31m-[m
[31m-    fmt->flushes = NULL;[m
[31m-[m
[31m-    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t));[m
[31m-    if (fmt->ops == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->open_file_cache = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *prev = parent;[m
[31m-    ngx_http_log_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_http_log_t            *log;[m
[31m-    ngx_http_log_fmt_t        *fmt;[m
[31m-    ngx_http_log_main_conf_t  *lmcf;[m
[31m-[m
[31m-    if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        conf->open_file_cache = prev->open_file_cache;[m
[31m-        conf->open_file_cache_valid = prev->open_file_cache_valid;[m
[31m-        conf->open_file_cache_min_uses = prev->open_file_cache_min_uses;[m
[31m-[m
[31m-        if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->open_file_cache = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->logs || conf->off) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf->logs = prev->logs;[m
[31m-    conf->off = prev->off;[m
[31m-[m
[31m-    if (conf->logs || conf->off) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t));[m
[31m-    if (conf->logs == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    log = ngx_array_push(conf->logs);[m
[31m-    if (log == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(log, sizeof(ngx_http_log_t));[m
[31m-[m
[31m-    log->file = ngx_conf_open_file(cf->cycle, &ngx_http_access_log);[m
[31m-    if (log->file == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-[m
[31m-    /* the default "combined" format */[m
[31m-    log->format = &fmt[0];[m
[31m-    lmcf->combined_used = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *llcf = conf;[m
[31m-[m
[31m-    ssize_t                            size;[m
[31m-    ngx_int_t                          gzip;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_msec_t                         flush;[m
[31m-    ngx_str_t                         *value, name, s;[m
[31m-    ngx_http_log_t                    *log;[m
[31m-    ngx_syslog_peer_t                 *peer;[m
[31m-    ngx_http_log_buf_t                *buffer;[m
[31m-    ngx_http_log_fmt_t                *fmt;[m
[31m-    ngx_http_log_main_conf_t          *lmcf;[m
[31m-    ngx_http_script_compile_t          sc;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        llcf->off = 1;[m
[31m-        if (cf->args->nelts == 2) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->logs == NULL) {[m
[31m-        llcf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t));[m
[31m-        if (llcf->logs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-[m
[31m-    log = ngx_array_push(llcf->logs);[m
[31m-    if (log == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(log, sizeof(ngx_http_log_t));[m
[31m-[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) {[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log->syslog_peer = peer;[m
[31m-[m
[31m-        goto process_formats;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        log->file = ngx_conf_open_file(cf->cycle, &value[1]);[m
[31m-        if (log->file == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log->script = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_script_t));[m
[31m-        if (log->script == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &value[1];[m
[31m-        sc.lengths = &log->script->lengths;[m
[31m-        sc.values = &log->script->values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-process_formats:[m
[31m-[m
[31m-    if (cf->args->nelts >= 3) {[m
[31m-        name = value[2];[m
[31m-[m
[31m-        if (ngx_strcmp(name.data, "combined") == 0) {[m
[31m-            lmcf->combined_used = 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&name, "combined");[m
[31m-        lmcf->combined_used = 1;[m
[31m-    }[m
[31m-[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-    for (i = 0; i < lmcf->formats.nelts; i++) {[m
[31m-        if (fmt[i].name.len == name.len[m
[31m-            && ngx_strcasecmp(fmt[i].name.data, name.data) == 0)[m
[31m-        {[m
[31m-            log->format = &fmt[i];[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (log->format == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unknown log format \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    flush = 0;[m
[31m-    gzip = 0;[m
[31m-[m
[31m-    for (i = 3; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "buffer=", 7) == 0) {[m
[31m-            s.len = value[i].len - 7;[m
[31m-            s.data = value[i].data + 7;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR || size == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid buffer size \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "flush=", 6) == 0) {[m
[31m-            s.len = value[i].len - 6;[m
[31m-            s.data = value[i].data + 6;[m
[31m-[m
[31m-            flush = ngx_parse_time(&s, 0);[m
[31m-[m
[31m-            if (flush == (ngx_msec_t) NGX_ERROR || flush == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid flush time \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "gzip", 4) == 0[m
[31m-            && (value[i].len == 4 || value[i].data[4] == '='))[m
[31m-        {[m
[31m-#if (NGX_ZLIB)[m
[31m-            if (size == 0) {[m
[31m-                size = 64 * 1024;[m
[31m-            }[m
[31m-[m
[31m-            if (value[i].len == 4) {[m
[31m-                gzip = Z_BEST_SPEED;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 5;[m
[31m-            s.data = value[i].data + 5;[m
[31m-[m
[31m-            gzip = ngx_atoi(s.data, s.len);[m
[31m-[m
[31m-            if (gzip < 1 || gzip > 9) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid compression level \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "nginx was built without zlib support");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "if=", 3) == 0) {[m
[31m-            s.len = value[i].len - 3;[m
[31m-            s.data = value[i].data + 3;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &s;[m
[31m-            ccv.complex_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_complex_value_t));[m
[31m-            if (ccv.complex_value == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            log->filter = ccv.complex_value;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flush && size == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no buffer is defined for access_log \"%V\"",[m
[31m-                           &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-[m
[31m-        if (log->script) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "buffered logs cannot have variables in name");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (log->syslog_peer) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "logs to syslog cannot be buffered");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (log->file->data) {[m
[31m-            buffer = log->file->data;[m
[31m-[m
[31m-            if (buffer->last - buffer->start != size[m
[31m-                || buffer->flush != flush[m
[31m-                || buffer->gzip != gzip)[m
[31m-            {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "access_log \"%V\" already defined "[m
[31m-                                   "with conflicting parameters",[m
[31m-                                   &value[1]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        buffer = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_buf_t));[m
[31m-        if (buffer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buffer->start = ngx_pnalloc(cf->pool, size);[m
[31m-        if (buffer->start == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buffer->pos = buffer->start;[m
[31m-        buffer->last = buffer->start + size;[m
[31m-[m
[31m-        if (flush) {[m
[31m-            buffer->event = ngx_pcalloc(cf->pool, sizeof(ngx_event_t));[m
[31m-            if (buffer->event == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            buffer->event->data = log->file;[m
[31m-            buffer->event->handler = ngx_http_log_flush_handler;[m
[31m-            buffer->event->log = &cf->cycle->new_log;[m
[31m-            buffer->event->cancelable = 1;[m
[31m-[m
[31m-            buffer->flush = flush;[m
[31m-        }[m
[31m-[m
[31m-        buffer->gzip = gzip;[m
[31m-[m
[31m-        log->file->flush = ngx_http_log_flush;[m
[31m-        log->file->data = buffer;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_main_conf_t *lmcf = conf;[m
[31m-[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_http_log_fmt_t  *fmt;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-    for (i = 0; i < lmcf->formats.nelts; i++) {[m
[31m-        if (fmt[i].name.len == value[1].len[m
[31m-            && ngx_strcmp(fmt[i].name.data, value[1].data) == 0)[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate \"log_format\" name \"%V\"",[m
[31m-                               &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fmt = ngx_array_push(&lmcf->formats);[m
[31m-    if (fmt == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fmt->name = value[1];[m
[31m-[m
[31m-    fmt->flushes = ngx_array_create(cf->pool, 4, sizeof(ngx_int_t));[m
[31m-    if (fmt->flushes == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t));[m
[31m-    if (fmt->ops == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_log_compile_format(cf, fmt->flushes, fmt->ops, cf->args, 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_compile_format(ngx_conf_t *cf, ngx_array_t *flushes,[m
[31m-    ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s)[m
[31m-{[m
[31m-    u_char              *data, *p, ch;[m
[31m-    size_t               i, len;[m
[31m-    ngx_str_t           *value, var;[m
[31m-    ngx_int_t           *flush;[m
[31m-    ngx_uint_t           bracket;[m
[31m-    ngx_http_log_op_t   *op;[m
[31m-    ngx_http_log_var_t  *v;[m
[31m-[m
[31m-    value = args->elts;[m
[31m-[m
[31m-    for ( /* void */ ; s < args->nelts; s++) {[m
[31m-[m
[31m-        i = 0;[m
[31m-[m
[31m-        while (i < value[s].len) {[m
[31m-[m
[31m-            op = ngx_array_push(ops);[m
[31m-            if (op == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            data = &value[s].data[i];[m
[31m-[m
[31m-            if (value[s].data[i] == '$') {[m
[31m-[m
[31m-                if (++i == value[s].len) {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                if (value[s].data[i] == '{') {[m
[31m-                    bracket = 1;[m
[31m-[m
[31m-                    if (++i == value[s].len) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                    var.data = &value[s].data[i];[m
[31m-[m
[31m-                } else {[m
[31m-                    bracket = 0;[m
[31m-                    var.data = &value[s].data[i];[m
[31m-                }[m
[31m-[m
[31m-                for (var.len = 0; i < value[s].len; i++, var.len++) {[m
[31m-                    ch = value[s].data[i];[m
[31m-[m
[31m-                    if (ch == '}' && bracket) {[m
[31m-                        i++;[m
[31m-                        bracket = 0;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if ((ch >= 'A' && ch <= 'Z')[m
[31m-                        || (ch >= 'a' && ch <= 'z')[m
[31m-                        || (ch >= '0' && ch <= '9')[m
[31m-                        || ch == '_')[m
[31m-                    {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (bracket) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "the closing bracket in \"%V\" "[m
[31m-                                       "variable is missing", &var);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (var.len == 0) {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                for (v = ngx_http_log_vars; v->name.len; v++) {[m
[31m-[m
[31m-                    if (v->name.len == var.len[m
[31m-                        && ngx_strncmp(v->name.data, var.data, var.len) == 0)[m
[31m-                    {[m
[31m-                        op->len = v->len;[m
[31m-                        op->getlen = NULL;[m
[31m-                        op->run = v->run;[m
[31m-                        op->data = 0;[m
[31m-[m
[31m-                        goto found;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_http_log_variable_compile(cf, op, &var) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (flushes) {[m
[31m-[m
[31m-                    flush = ngx_array_push(flushes);[m
[31m-                    if (flush == NULL) {[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    *flush = op->data; /* variable index */[m
[31m-                }[m
[31m-[m
[31m-            found:[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            while (i < value[s].len && value[s].data[i] != '$') {[m
[31m-                i++;[m
[31m-            }[m
[31m-[m
[31m-            len = &value[s].data[i] - data;[m
[31m-[m
[31m-            if (len) {[m
[31m-[m
[31m-                op->len = len;[m
[31m-                op->getlen = NULL;[m
[31m-[m
[31m-                if (len <= sizeof(uintptr_t)) {[m
[31m-                    op->run = ngx_http_log_copy_short;[m
[31m-                    op->data = 0;[m
[31m-[m
[31m-                    while (len--) {[m
[31m-                        op->data <<= 8;[m
[31m-                        op->data |= data[len];[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    op->run = ngx_http_log_copy_long;[m
[31m-[m
[31m-                    p = ngx_pnalloc(cf->pool, len);[m
[31m-                    if (p == NULL) {[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_memcpy(p, data, len);[m
[31m-                    op->data = (uintptr_t) p;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%s\"", data);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *llcf = conf;[m
[31m-[m
[31m-    time_t       inactive, valid;[m
[31m-    ngx_str_t   *value, s;[m
[31m-    ngx_int_t    max, min_uses;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (llcf->open_file_cache != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    max = 0;[m
[31m-    inactive = 10;[m
[31m-    valid = 60;[m
[31m-    min_uses = 1;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", 4) == 0) {[m
[31m-[m
[31m-            max = ngx_atoi(value[i].data + 4, value[i].len - 4);[m
[31m-            if (max == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "min_uses=", 9) == 0) {[m
[31m-[m
[31m-            min_uses = ngx_atoi(value[i].data + 9, value[i].len - 9);[m
[31m-            if (min_uses == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "valid=", 6) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 6;[m
[31m-            s.data = value[i].data + 6;[m
[31m-[m
[31m-            valid = ngx_parse_time(&s, 1);[m
[31m-            if (valid == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-[m
[31m-            llcf->open_file_cache = NULL;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    failed:[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid \"open_log_file_cache\" parameter \"%V\"",[m
[31m-                           &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->open_file_cache == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (max == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "\"open_log_file_cache\" must have \"max\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive);[m
[31m-[m
[31m-    if (llcf->open_file_cache) {[m
[31m-[m
[31m-        llcf->open_file_cache_valid = valid;[m
[31m-        llcf->open_file_cache_min_uses = min_uses;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_array_t                 a;[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_log_fmt_t         *fmt;[m
[31m-    ngx_http_log_main_conf_t   *lmcf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-[m
[31m-    if (lmcf->combined_used) {[m
[31m-        if (ngx_array_init(&a, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = ngx_array_push(&a);[m
[31m-        if (value == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *value = ngx_http_combined_fmt;[m
[31m-        fmt = lmcf->formats.elts;[m
[31m-[m
[31m-        if (ngx_http_log_compile_format(cf, NULL, fmt->ops, &a, 0)[m
[31m-            != NGX_CONF_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_log_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_map_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_map_module.c[m
[1mdeleted file mode 100644[m
[1mindex 091ff09..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_map_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,567 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                  hash_max_size;[m
[31m-    ngx_uint_t                  hash_bucket_size;[m
[31m-} ngx_http_map_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_keys_arrays_t      keys;[m
[31m-[m
[31m-    ngx_array_t                *values_hash;[m
[31m-    ngx_array_t                 var_values;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_array_t                 regexes;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_variable_value_t  *default_value;[m
[31m-    ngx_conf_t                 *cf;[m
[31m-    ngx_uint_t                  hostnames;      /* unsigned  hostnames:1 */[m
[31m-} ngx_http_map_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_map_t              map;[m
[31m-    ngx_http_complex_value_t    value;[m
[31m-    ngx_http_variable_value_t  *default_value;[m
[31m-    ngx_uint_t                  hostnames;      /* unsigned  hostnames:1 */[m
[31m-} ngx_http_map_ctx_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl ngx_http_map_cmp_dns_wildcards(const void *one,[m
[31m-    const void *two);[m
[31m-static void *ngx_http_map_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_map_commands[] = {[m
[31m-[m
[31m-    { ngx_string("map"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,[m
[31m-      ngx_http_map_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("map_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_map_conf_t, hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("map_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_map_conf_t, hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_map_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_map_create_conf,              /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_map_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_map_module_ctx,              /* module context */[m
[31m-    ngx_http_map_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_map_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_map_ctx_t  *map = (ngx_http_map_ctx_t *) data;[m
[31m-[m
[31m-    ngx_str_t                   val;[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http map started");[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &map->value, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (map->hostnames && val.len > 0 && val.data[val.len - 1] == '.') {[m
[31m-        val.len--;[m
[31m-    }[m
[31m-[m
[31m-    value = ngx_http_map_find(r, &map->map, &val);[m
[31m-[m
[31m-    if (value == NULL) {[m
[31m-        value = map->default_value;[m
[31m-    }[m
[31m-[m
[31m-    if (!value->valid) {[m
[31m-        value = ngx_http_get_flushed_variable(r, (uintptr_t) value->data);[m
[31m-[m
[31m-        if (value == NULL || value->not_found) {[m
[31m-            value = &ngx_http_variable_null_value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *v = *value;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http map: \"%V\" \"%v\"", &val, v);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_map_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_map_conf_t  *mcf;[m
[31m-[m
[31m-    mcf = ngx_palloc(cf->pool, sizeof(ngx_http_map_conf_t));[m
[31m-    if (mcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    mcf->hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    mcf->hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return mcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_map_conf_t  *mcf = conf;[m
[31m-[m
[31m-    char                              *rv;[m
[31m-    ngx_str_t                         *value, name;[m
[31m-    ngx_conf_t                         save;[m
[31m-    ngx_pool_t                        *pool;[m
[31m-    ngx_hash_init_t                    hash;[m
[31m-    ngx_http_map_ctx_t                *map;[m
[31m-    ngx_http_variable_t               *var;[m
[31m-    ngx_http_map_conf_ctx_t            ctx;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (mcf->hash_max_size == NGX_CONF_UNSET_UINT) {[m
[31m-        mcf->hash_max_size = 2048;[m
[31m-    }[m
[31m-[m
[31m-    if (mcf->hash_bucket_size == NGX_CONF_UNSET_UINT) {[m
[31m-        mcf->hash_bucket_size = ngx_cacheline_size;[m
[31m-[m
[31m-    } else {[m
[31m-        mcf->hash_bucket_size = ngx_align(mcf->hash_bucket_size,[m
[31m-                                          ngx_cacheline_size);[m
[31m-    }[m
[31m-[m
[31m-    map = ngx_pcalloc(cf->pool, sizeof(ngx_http_map_ctx_t));[m
[31m-    if (map == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &map->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name = value[2];[m
[31m-[m
[31m-    if (name.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name.len--;[m
[31m-    name.data++;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_map_variable;[m
[31m-    var->data = (uintptr_t) map;[m
[31m-[m
[31m-    pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx.keys.pool = cf->pool;[m
[31m-    ctx.keys.temp_pool = pool;[m
[31m-[m
[31m-    if (ngx_hash_keys_array_init(&ctx.keys, NGX_HASH_LARGE) != NGX_OK) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx.values_hash = ngx_pcalloc(pool, sizeof(ngx_array_t) * ctx.keys.hsize);[m
[31m-    if (ctx.values_hash == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&ctx.var_values, cf->pool, 2,[m
[31m-                       sizeof(ngx_http_variable_value_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (ngx_array_init(&ctx.regexes, cf->pool, 2, sizeof(ngx_http_map_regex_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx.default_value = NULL;[m
[31m-    ctx.cf = &save;[m
[31m-    ctx.hostnames = 0;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->pool = pool;[m
[31m-    cf->ctx = &ctx;[m
[31m-    cf->handler = ngx_http_map;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    map->default_value = ctx.default_value ? ctx.default_value:[m
[31m-                                             &ngx_http_variable_null_value;[m
[31m-[m
[31m-    map->hostnames = ctx.hostnames;[m
[31m-[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = mcf->hash_max_size;[m
[31m-    hash.bucket_size = mcf->hash_bucket_size;[m
[31m-    hash.name = "map_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-[m
[31m-    if (ctx.keys.keys.nelts) {[m
[31m-        hash.hash = &map->map.hash.hash;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, ctx.keys.keys.elts, ctx.keys.keys.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_destroy_pool(pool);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx.keys.dns_wc_head.nelts) {[m
[31m-[m
[31m-        ngx_qsort(ctx.keys.dns_wc_head.elts,[m
[31m-                  (size_t) ctx.keys.dns_wc_head.nelts,[m
[31m-                  sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_head.elts,[m
[31m-                                   ctx.keys.dns_wc_head.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_destroy_pool(pool);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        map->map.hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx.keys.dns_wc_tail.nelts) {[m
[31m-[m
[31m-        ngx_qsort(ctx.keys.dns_wc_tail.elts,[m
[31m-                  (size_t) ctx.keys.dns_wc_tail.nelts,[m
[31m-                  sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_tail.elts,[m
[31m-                                   ctx.keys.dns_wc_tail.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_destroy_pool(pool);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        map->map.hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (ctx.regexes.nelts) {[m
[31m-        map->map.regex = ctx.regexes.elts;[m
[31m-        map->map.nregex = ctx.regexes.nelts;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_map_cmp_dns_wildcards(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_hash_key_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_hash_key_t *) one;[m
[31m-    second = (ngx_hash_key_t *) two;[m
[31m-[m
[31m-    return ngx_dns_strcmp(first->key.data, second->key.data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    ngx_int_t                   rv, index;[m
[31m-    ngx_str_t                  *value, name;[m
[31m-    ngx_uint_t                  i, key;[m
[31m-    ngx_http_map_conf_ctx_t    *ctx;[m
[31m-    ngx_http_variable_value_t  *var, **vp;[m
[31m-[m
[31m-    ctx = cf->ctx;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 1[m
[31m-        && ngx_strcmp(value[0].data, "hostnames") == 0)[m
[31m-    {[m
[31m-        ctx->hostnames = 1;[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    } else if (cf->args->nelts != 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number of the map parameters");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "include") == 0) {[m
[31m-        return ngx_conf_include(cf, dummy, conf);[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '$') {[m
[31m-        name = value[1];[m
[31m-        name.len--;[m
[31m-        name.data++;[m
[31m-[m
[31m-        index = ngx_http_get_variable_index(ctx->cf, &name);[m
[31m-        if (index == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var = ctx->var_values.elts;[m
[31m-[m
[31m-        for (i = 0; i < ctx->var_values.nelts; i++) {[m
[31m-            if (index == (intptr_t) var[i].data) {[m
[31m-                var = &var[i];[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        var = ngx_array_push(&ctx->var_values);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->valid = 0;[m
[31m-        var->no_cacheable = 0;[m
[31m-        var->not_found = 0;[m
[31m-        var->len = 0;[m
[31m-        var->data = (u_char *) (intptr_t) index;[m
[31m-[m
[31m-        goto found;[m
[31m-    }[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = 0; i < value[1].len; i++) {[m
[31m-        key = ngx_hash(key, value[1].data[i]);[m
[31m-    }[m
[31m-[m
[31m-    key %= ctx->keys.hsize;[m
[31m-[m
[31m-    vp = ctx->values_hash[key].elts;[m
[31m-[m
[31m-    if (vp) {[m
[31m-        for (i = 0; i < ctx->values_hash[key].nelts; i++) {[m
[31m-            if (value[1].len != (size_t) vp[i]->len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp(value[1].data, vp[i]->data, value[1].len) == 0) {[m
[31m-                var = vp[i];[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_array_init(&ctx->values_hash[key], cf->pool, 4,[m
[31m-                           sizeof(ngx_http_variable_value_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_palloc(ctx->keys.pool, sizeof(ngx_http_variable_value_t));[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->len = value[1].len;[m
[31m-    var->data = ngx_pstrdup(ctx->keys.pool, &value[1]);[m
[31m-    if (var->data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->valid = 1;[m
[31m-    var->no_cacheable = 0;[m
[31m-    var->not_found = 0;[m
[31m-[m
[31m-    vp = ngx_array_push(&ctx->values_hash[key]);[m
[31m-    if (vp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *vp = var;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "default") == 0) {[m
[31m-[m
[31m-        if (ctx->default_value) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate default map parameter");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->default_value = var;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (value[0].len && value[0].data[0] == '~') {[m
[31m-        ngx_regex_compile_t    rc;[m
[31m-        ngx_http_map_regex_t  *regex;[m
[31m-        u_char                 errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-        regex = ngx_array_push(&ctx->regexes);[m
[31m-        if (regex == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value[0].len--;[m
[31m-        value[0].data++;[m
[31m-[m
[31m-        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-        if (value[0].data[0] == '*') {[m
[31m-            value[0].len--;[m
[31m-            value[0].data++;[m
[31m-            rc.options = NGX_REGEX_CASELESS;[m
[31m-        }[m
[31m-[m
[31m-        rc.pattern = value[0];[m
[31m-        rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-        rc.err.data = errstr;[m
[31m-[m
[31m-        regex->regex = ngx_http_regex_compile(ctx->cf, &rc);[m
[31m-        if (regex->regex == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        regex->value = var;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (value[0].len && value[0].data[0] == '\\') {[m
[31m-        value[0].len--;[m
[31m-        value[0].data++;[m
[31m-    }[m
[31m-[m
[31m-    rv = ngx_hash_add_key(&ctx->keys, &value[0], var,[m
[31m-                          (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0);[m
[31m-[m
[31m-    if (rv == NGX_OK) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rv == NGX_DECLINED) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid hostname or wildcard \"%V\"", &value[0]);[m
[31m-    }[m
[31m-[m
[31m-    if (rv == NGX_BUSY) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "conflicting parameter \"%V\"", &value[0]);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_memcached_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_memcached_module.c[m
[1mdeleted file mode 100644[m
[1mindex d31996a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_memcached_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,723 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-    ngx_int_t                  index;[m
[31m-    ngx_uint_t                 gzip_flag;[m
[31m-} ngx_http_memcached_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                     rest;[m
[31m-    ngx_http_request_t        *request;[m
[31m-    ngx_str_t                  key;[m
[31m-} ngx_http_memcached_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_memcached_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_memcached_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_memcached_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_memcached_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_memcached_filter(void *data, ssize_t bytes);[m
[31m-static void ngx_http_memcached_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_memcached_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static void *ngx_http_memcached_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_memcached_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_memcached_commands[] = {[m
[31m-[m
[31m-    { ngx_string("memcached_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_memcached_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_memcached_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("memcached_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_gzip_flag"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, gzip_flag),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_memcached_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_memcached_create_loc_conf,    /* create location configuration */[m
[31m-    ngx_http_memcached_merge_loc_conf      /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_memcached_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_memcached_module_ctx,        /* module context */[m
[31m-    ngx_http_memcached_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_memcached_key = ngx_string("memcached_key");[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MEMCACHED_END   (sizeof(ngx_http_memcached_end) - 1)[m
[31m-static u_char  ngx_http_memcached_end[] = CRLF "END" CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_memcached_ctx_t       *ctx;[m
[31m-    ngx_http_memcached_loc_conf_t  *mlcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_str_set(&u->schema, "memcached://");[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module;[m
[31m-[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);[m
[31m-[m
[31m-    u->conf = &mlcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_http_memcached_create_request;[m
[31m-    u->reinit_request = ngx_http_memcached_reinit_request;[m
[31m-    u->process_header = ngx_http_memcached_process_header;[m
[31m-    u->abort_request = ngx_http_memcached_abort_request;[m
[31m-    u->finalize_request = ngx_http_memcached_finalize_request;[m
[31m-[m
[31m-    ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_memcached_module);[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_memcached_filter_init;[m
[31m-    u->input_filter = ngx_http_memcached_filter;[m
[31m-    u->input_filter_ctx = ctx;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    ngx_http_upstream_init(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_http_memcached_ctx_t       *ctx;[m
[31m-    ngx_http_variable_value_t      *vv;[m
[31m-    ngx_http_memcached_loc_conf_t  *mlcf;[m
[31m-[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);[m
[31m-[m
[31m-    vv = ngx_http_get_indexed_variable(r, mlcf->index);[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found || vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memcached_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, vv->data, vv->len, NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    len = sizeof("get ") - 1 + vv->len + escape + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' ';[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module);[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, vv->data, vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, vv->data, vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    ctx->key.len = b->last - ctx->key.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http memcached request: \"%V\"", &ctx->key);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                         *p, *start;[m
[31m-    ngx_str_t                       line;[m
[31m-    ngx_uint_t                      flags;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_memcached_ctx_t       *ctx;[m
[31m-    ngx_http_memcached_loc_conf_t  *mlcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (p = u->buffer.pos; p < u->buffer.last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    line.data = u->buffer.pos;[m
[31m-    line.len = p - u->buffer.pos;[m
[31m-[m
[31m-    if (line.len == 0 || *(p - 1) != CR) {[m
[31m-        goto no_valid;[m
[31m-    }[m
[31m-[m
[31m-    *p = '\0';[m
[31m-    line.len--;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "memcached: \"%V\"", &line);[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module);[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);[m
[31m-[m
[31m-    if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {[m
[31m-[m
[31m-        p += sizeof("VALUE ") - 1;[m
[31m-[m
[31m-        if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid key in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        p += ctx->key.len;[m
[31m-[m
[31m-        if (*p++ != ' ') {[m
[31m-            goto no_valid;[m
[31m-        }[m
[31m-[m
[31m-        /* flags */[m
[31m-[m
[31m-        start = p;[m
[31m-[m
[31m-        while (*p) {[m
[31m-            if (*p++ == ' ') {[m
[31m-                if (mlcf->gzip_flag) {[m
[31m-                    goto flags;[m
[31m-                } else {[m
[31m-                    goto length;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto no_valid;[m
[31m-[m
[31m-    flags:[m
[31m-[m
[31m-        flags = ngx_atoi(start, p - start - 1);[m
[31m-[m
[31m-        if (flags == (ngx_uint_t) NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid flags in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & mlcf->gzip_flag) {[m
[31m-            h = ngx_list_push(&r->headers_out.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = 1;[m
[31m-            ngx_str_set(&h->key, "Content-Encoding");[m
[31m-            ngx_str_set(&h->value, "gzip");[m
[31m-            r->headers_out.content_encoding = h;[m
[31m-        }[m
[31m-[m
[31m-    length:[m
[31m-[m
[31m-        start = p;[m
[31m-        p = line.data + line.len;[m
[31m-[m
[31m-        u->headers_in.content_length_n = ngx_atoof(start, p - start);[m
[31m-        if (u->headers_in.content_length_n == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid length in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        u->headers_in.status_n = 200;[m
[31m-        u->state->status = 200;[m
[31m-        u->buffer.pos = p + sizeof(CRLF) - 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(p, "END\x0d") == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "key: \"%V\" was not found by memcached", &ctx->key);[m
[31m-[m
[31m-        u->headers_in.content_length_n = 0;[m
[31m-        u->headers_in.status_n = 404;[m
[31m-        u->state->status = 404;[m
[31m-        u->buffer.pos = p + sizeof("END" CRLF) - 1;[m
[31m-        u->keepalive = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-no_valid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response: \"%V\"", &line);[m
[31m-[m
[31m-    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memcached_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    if (u->headers_in.status_n != 404) {[m
[31m-        u->length = u->headers_in.content_length_n + NGX_HTTP_MEMCACHED_END;[m
[31m-        ctx->rest = NGX_HTTP_MEMCACHED_END;[m
[31m-[m
[31m-    } else {[m
[31m-        u->length = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memcached_ctx_t  *ctx = data;[m
[31m-[m
[31m-    u_char               *last;[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (u->length == (ssize_t) ctx->rest) {[m
[31m-[m
[31m-        if (ngx_strncmp(b->last,[m
[31m-                   ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest,[m
[31m-                   bytes)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                          "memcached sent invalid trailer");[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            ctx->rest = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->length -= bytes;[m
[31m-        ctx->rest -= bytes;[m
[31m-[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = b->last;[m
[31m-    cl->buf->pos = last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "memcached filter bytes:%z size:%z length:%O rest:%z",[m
[31m-                   bytes, b->last - b->pos, u->length, ctx->rest);[m
[31m-[m
[31m-    if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMCACHED_END)) {[m
[31m-        u->length -= bytes;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    last += (size_t) (u->length - NGX_HTTP_MEMCACHED_END);[m
[31m-[m
[31m-    if (ngx_strncmp(last, ngx_http_memcached_end, b->last - last) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                      "memcached sent invalid trailer");[m
[31m-[m
[31m-        b->last = last;[m
[31m-        cl->buf->last = last;[m
[31m-        u->length = 0;[m
[31m-        ctx->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest -= b->last - last;[m
[31m-    b->last = last;[m
[31m-    cl->buf->last = last;[m
[31m-    u->length = ctx->rest;[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_memcached_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http memcached request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_memcached_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http memcached request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_memcached_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_memcached_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memcached_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.ignore_client_abort = 0;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-    conf->upstream.force_ranges = 1;[m
[31m-[m
[31m-    conf->index = NGX_CONF_UNSET;[m
[31m-    conf->gzip_flag = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_memcached_loc_conf_t *prev = parent;[m
[31m-    ngx_http_memcached_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.upstream == NULL) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->index == NGX_CONF_UNSET) {[m
[31m-        conf->index = prev->index;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->gzip_flag, prev->gzip_flag, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_memcached_loc_conf_t *mlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_url_t                  u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (mlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    mlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (mlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_memcached_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    mlcf->index = ngx_http_get_variable_index(cf, &ngx_http_memcached_key);[m
[31m-[m
[31m-    if (mlcf->index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_mp4_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_mp4_module.c[m
[1mdeleted file mode 100644[m
[1mindex 16ef83c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_mp4_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,3500 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MP4_TRAK_ATOM     0[m
[31m-#define NGX_HTTP_MP4_TKHD_ATOM     1[m
[31m-#define NGX_HTTP_MP4_MDIA_ATOM     2[m
[31m-#define NGX_HTTP_MP4_MDHD_ATOM     3[m
[31m-#define NGX_HTTP_MP4_HDLR_ATOM     4[m
[31m-#define NGX_HTTP_MP4_MINF_ATOM     5[m
[31m-#define NGX_HTTP_MP4_VMHD_ATOM     6[m
[31m-#define NGX_HTTP_MP4_SMHD_ATOM     7[m
[31m-#define NGX_HTTP_MP4_DINF_ATOM     8[m
[31m-#define NGX_HTTP_MP4_STBL_ATOM     9[m
[31m-#define NGX_HTTP_MP4_STSD_ATOM    10[m
[31m-#define NGX_HTTP_MP4_STTS_ATOM    11[m
[31m-#define NGX_HTTP_MP4_STTS_DATA    12[m
[31m-#define NGX_HTTP_MP4_STSS_ATOM    13[m
[31m-#define NGX_HTTP_MP4_STSS_DATA    14[m
[31m-#define NGX_HTTP_MP4_CTTS_ATOM    15[m
[31m-#define NGX_HTTP_MP4_CTTS_DATA    16[m
[31m-#define NGX_HTTP_MP4_STSC_ATOM    17[m
[31m-#define NGX_HTTP_MP4_STSC_START   18[m
[31m-#define NGX_HTTP_MP4_STSC_DATA    19[m
[31m-#define NGX_HTTP_MP4_STSC_END     20[m
[31m-#define NGX_HTTP_MP4_STSZ_ATOM    21[m
[31m-#define NGX_HTTP_MP4_STSZ_DATA    22[m
[31m-#define NGX_HTTP_MP4_STCO_ATOM    23[m
[31m-#define NGX_HTTP_MP4_STCO_DATA    24[m
[31m-#define NGX_HTTP_MP4_CO64_ATOM    25[m
[31m-#define NGX_HTTP_MP4_CO64_DATA    26[m
[31m-[m
[31m-#define NGX_HTTP_MP4_LAST_ATOM    NGX_HTTP_MP4_CO64_DATA[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                buffer_size;[m
[31m-    size_t                max_buffer_size;[m
[31m-} ngx_http_mp4_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                chunk[4];[m
[31m-    u_char                samples[4];[m
[31m-    u_char                id[4];[m
[31m-} ngx_mp4_stsc_entry_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t              timescale;[m
[31m-    uint32_t              time_to_sample_entries;[m
[31m-    uint32_t              sample_to_chunk_entries;[m
[31m-    uint32_t              sync_samples_entries;[m
[31m-    uint32_t              composition_offset_entries;[m
[31m-    uint32_t              sample_sizes_entries;[m
[31m-    uint32_t              chunks;[m
[31m-[m
[31m-    ngx_uint_t            start_sample;[m
[31m-    ngx_uint_t            end_sample;[m
[31m-    ngx_uint_t            start_chunk;[m
[31m-    ngx_uint_t            end_chunk;[m
[31m-    ngx_uint_t            start_chunk_samples;[m
[31m-    ngx_uint_t            end_chunk_samples;[m
[31m-    uint64_t              start_chunk_samples_size;[m
[31m-    uint64_t              end_chunk_samples_size;[m
[31m-    off_t                 start_offset;[m
[31m-    off_t                 end_offset;[m
[31m-[m
[31m-    size_t                tkhd_size;[m
[31m-    size_t                mdhd_size;[m
[31m-    size_t                hdlr_size;[m
[31m-    size_t                vmhd_size;[m
[31m-    size_t                smhd_size;[m
[31m-    size_t                dinf_size;[m
[31m-    size_t                size;[m
[31m-[m
[31m-    ngx_chain_t           out[NGX_HTTP_MP4_LAST_ATOM + 1];[m
[31m-[m
[31m-    ngx_buf_t             trak_atom_buf;[m
[31m-    ngx_buf_t             tkhd_atom_buf;[m
[31m-    ngx_buf_t             mdia_atom_buf;[m
[31m-    ngx_buf_t             mdhd_atom_buf;[m
[31m-    ngx_buf_t             hdlr_atom_buf;[m
[31m-    ngx_buf_t             minf_atom_buf;[m
[31m-    ngx_buf_t             vmhd_atom_buf;[m
[31m-    ngx_buf_t             smhd_atom_buf;[m
[31m-    ngx_buf_t             dinf_atom_buf;[m
[31m-    ngx_buf_t             stbl_atom_buf;[m
[31m-    ngx_buf_t             stsd_atom_buf;[m
[31m-    ngx_buf_t             stts_atom_buf;[m
[31m-    ngx_buf_t             stts_data_buf;[m
[31m-    ngx_buf_t             stss_atom_buf;[m
[31m-    ngx_buf_t             stss_data_buf;[m
[31m-    ngx_buf_t             ctts_atom_buf;[m
[31m-    ngx_buf_t             ctts_data_buf;[m
[31m-    ngx_buf_t             stsc_atom_buf;[m
[31m-    ngx_buf_t             stsc_start_chunk_buf;[m
[31m-    ngx_buf_t             stsc_end_chunk_buf;[m
[31m-    ngx_buf_t             stsc_data_buf;[m
[31m-    ngx_buf_t             stsz_atom_buf;[m
[31m-    ngx_buf_t             stsz_data_buf;[m
[31m-    ngx_buf_t             stco_atom_buf;[m
[31m-    ngx_buf_t             stco_data_buf;[m
[31m-    ngx_buf_t             co64_atom_buf;[m
[31m-    ngx_buf_t             co64_data_buf;[m
[31m-[m
[31m-    ngx_mp4_stsc_entry_t  stsc_start_chunk_entry;[m
[31m-    ngx_mp4_stsc_entry_t  stsc_end_chunk_entry;[m
[31m-} ngx_http_mp4_trak_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_file_t            file;[m
[31m-[m
[31m-    u_char               *buffer;[m
[31m-    u_char               *buffer_start;[m
[31m-    u_char               *buffer_pos;[m
[31m-    u_char               *buffer_end;[m
[31m-    size_t                buffer_size;[m
[31m-[m
[31m-    off_t                 offset;[m
[31m-    off_t                 end;[m
[31m-    off_t                 content_length;[m
[31m-    ngx_uint_t            start;[m
[31m-    ngx_uint_t            length;[m
[31m-    uint32_t              timescale;[m
[31m-    ngx_http_request_t   *request;[m
[31m-    ngx_array_t           trak;[m
[31m-    ngx_http_mp4_trak_t   traks[2];[m
[31m-[m
[31m-    size_t                ftyp_size;[m
[31m-    size_t                moov_size;[m
[31m-[m
[31m-    ngx_chain_t          *out;[m
[31m-    ngx_chain_t           ftyp_atom;[m
[31m-    ngx_chain_t           moov_atom;[m
[31m-    ngx_chain_t           mvhd_atom;[m
[31m-    ngx_chain_t           mdat_atom;[m
[31m-    ngx_chain_t           mdat_data;[m
[31m-[m
[31m-    ngx_buf_t             ftyp_atom_buf;[m
[31m-    ngx_buf_t             moov_atom_buf;[m
[31m-    ngx_buf_t             mvhd_atom_buf;[m
[31m-    ngx_buf_t             mdat_atom_buf;[m
[31m-    ngx_buf_t             mdat_data_buf;[m
[31m-[m
[31m-    u_char                moov_atom_header[8];[m
[31m-    u_char                mdat_atom_header[16];[m
[31m-} ngx_http_mp4_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char                 *name;[m
[31m-    ngx_int_t           (*handler)(ngx_http_mp4_file_t *mp4,[m
[31m-                                   uint64_t atom_data_size);[m
[31m-} ngx_http_mp4_atom_handler_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_mp4_atom_header(mp4)   (mp4->buffer_pos - 8)[m
[31m-#define ngx_mp4_atom_data(mp4)     mp4->buffer_pos[m
[31m-#define ngx_mp4_atom_data_size(t)  (uint64_t) (sizeof(t) - 8)[m
[31m-[m
[31m-[m
[31m-#define ngx_mp4_atom_next(mp4, n)                                             \[m
[31m-    mp4->buffer_pos += (size_t) n;                                            \[m
[31m-    mp4->offset += n[m
[31m-[m
[31m-[m
[31m-#define ngx_mp4_set_atom_name(p, n1, n2, n3, n4)                              \[m
[31m-    ((u_char *) (p))[4] = n1;                                                 \[m
[31m-    ((u_char *) (p))[5] = n2;                                                 \[m
[31m-    ((u_char *) (p))[6] = n3;                                                 \[m
[31m-    ((u_char *) (p))[7] = n4[m
[31m-[m
[31m-#define ngx_mp4_get_32value(p)                                                \[m
[31m-    ( ((uint32_t) ((u_char *) (p))[0] << 24)                                  \[m
[31m-    + (           ((u_char *) (p))[1] << 16)                                  \[m
[31m-    + (           ((u_char *) (p))[2] << 8)                                   \[m
[31m-    + (           ((u_char *) (p))[3]) )[m
[31m-[m
[31m-#define ngx_mp4_set_32value(p, n)                                             \[m
[31m-    ((u_char *) (p))[0] = (u_char) ((n) >> 24);                               \[m
[31m-    ((u_char *) (p))[1] = (u_char) ((n) >> 16);                               \[m
[31m-    ((u_char *) (p))[2] = (u_char) ((n) >> 8);                                \[m
[31m-    ((u_char *) (p))[3] = (u_char)  (n)[m
[31m-[m
[31m-#define ngx_mp4_get_64value(p)                                                \[m
[31m-    ( ((uint64_t) ((u_char *) (p))[0] << 56)                                  \[m
[31m-    + ((uint64_t) ((u_char *) (p))[1] << 48)                                  \[m
[31m-    + ((uint64_t) ((u_char *) (p))[2] << 40)                                  \[m
[31m-    + ((uint64_t) ((u_char *) (p))[3] << 32)                                  \[m
[31m-    + ((uint64_t) ((u_char *) (p))[4] << 24)                                  \[m
[31m-    + (           ((u_char *) (p))[5] << 16)                                  \[m
[31m-    + (           ((u_char *) (p))[6] << 8)                                   \[m
[31m-    + (           ((u_char *) (p))[7]) )[m
[31m-[m
[31m-#define ngx_mp4_set_64value(p, n)                                             \[m
[31m-    ((u_char *) (p))[0] = (u_char) ((uint64_t) (n) >> 56);                    \[m
[31m-    ((u_char *) (p))[1] = (u_char) ((uint64_t) (n) >> 48);                    \[m
[31m-    ((u_char *) (p))[2] = (u_char) ((uint64_t) (n) >> 40);                    \[m
[31m-    ((u_char *) (p))[3] = (u_char) ((uint64_t) (n) >> 32);                    \[m
[31m-    ((u_char *) (p))[4] = (u_char) (           (n) >> 24);                    \[m
[31m-    ((u_char *) (p))[5] = (u_char) (           (n) >> 16);                    \[m
[31m-    ((u_char *) (p))[6] = (u_char) (           (n) >> 8);                     \[m
[31m-    ((u_char *) (p))[7] = (u_char)             (n)[m
[31m-[m
[31m-#define ngx_mp4_last_trak(mp4)                                                \[m
[31m-    &((ngx_http_mp4_trak_t *) mp4->trak.elts)[mp4->trak.nelts - 1][m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_mp4_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_mp4_process(ngx_http_mp4_file_t *mp4);[m
[31m-static ngx_int_t ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_atom_handler_t *atom, uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read(ngx_http_mp4_file_t *mp4, size_t size);[m
[31m-static ngx_int_t ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static size_t ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    off_t start_offset, off_t end_offset);[m
[31m-static ngx_int_t ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_trak_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_trak_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_cmov_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_mdia_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_minf_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_stbl_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_crop_stts_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start);[m
[31m-static ngx_int_t ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stss_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static void ngx_http_mp4_crop_stss_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start);[m
[31m-static ngx_int_t ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_ctts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static void ngx_http_mp4_crop_ctts_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start);[m
[31m-static ngx_int_t ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stsc_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start);[m
[31m-static ngx_int_t ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stsz_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static void ngx_http_mp4_adjust_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, int32_t adjustment);[m
[31m-static ngx_int_t ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static void ngx_http_mp4_adjust_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, off_t adjustment);[m
[31m-[m
[31m-static char *ngx_http_mp4(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_mp4_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_mp4_merge_conf(ngx_conf_t *cf, void *parent, void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_mp4_commands[] = {[m
[31m-[m
[31m-    { ngx_string("mp4"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_mp4,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("mp4_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_mp4_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("mp4_max_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_mp4_conf_t, max_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_mp4_module_ctx = {[m
[31m-    NULL,                          /* preconfiguration */[m
[31m-    NULL,                          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                          /* create main configuration */[m
[31m-    NULL,                          /* init main configuration */[m
[31m-[m
[31m-    NULL,                          /* create server configuration */[m
[31m-    NULL,                          /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_mp4_create_conf,      /* create location configuration */[m
[31m-    ngx_http_mp4_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_mp4_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_mp4_module_ctx,      /* module context */[m
[31m-    ngx_http_mp4_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_atoms[] = {[m
[31m-    { "ftyp", ngx_http_mp4_read_ftyp_atom },[m
[31m-    { "moov", ngx_http_mp4_read_moov_atom },[m
[31m-    { "mdat", ngx_http_mp4_read_mdat_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_moov_atoms[] = {[m
[31m-    { "mvhd", ngx_http_mp4_read_mvhd_atom },[m
[31m-    { "trak", ngx_http_mp4_read_trak_atom },[m
[31m-    { "cmov", ngx_http_mp4_read_cmov_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_trak_atoms[] = {[m
[31m-    { "tkhd", ngx_http_mp4_read_tkhd_atom },[m
[31m-    { "mdia", ngx_http_mp4_read_mdia_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_mdia_atoms[] = {[m
[31m-    { "mdhd", ngx_http_mp4_read_mdhd_atom },[m
[31m-    { "hdlr", ngx_http_mp4_read_hdlr_atom },[m
[31m-    { "minf", ngx_http_mp4_read_minf_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_minf_atoms[] = {[m
[31m-    { "vmhd", ngx_http_mp4_read_vmhd_atom },[m
[31m-    { "smhd", ngx_http_mp4_read_smhd_atom },[m
[31m-    { "dinf", ngx_http_mp4_read_dinf_atom },[m
[31m-    { "stbl", ngx_http_mp4_read_stbl_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_stbl_atoms[] = {[m
[31m-    { "stsd", ngx_http_mp4_read_stsd_atom },[m
[31m-    { "stts", ngx_http_mp4_read_stts_atom },[m
[31m-    { "stss", ngx_http_mp4_read_stss_atom },[m
[31m-    { "ctts", ngx_http_mp4_read_ctts_atom },[m
[31m-    { "stsc", ngx_http_mp4_read_stsc_atom },[m
[31m-    { "stsz", ngx_http_mp4_read_stsz_atom },[m
[31m-    { "stco", ngx_http_mp4_read_stco_atom },[m
[31m-    { "co64", ngx_http_mp4_read_co64_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *last;[m
[31m-    size_t                     root;[m
[31m-    ngx_int_t                  rc, start, end;[m
[31m-    ngx_uint_t                 level, length;[m
[31m-    ngx_str_t                  path, value;[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_http_mp4_file_t       *mp4;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root, 0);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    path.len = last - path.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "http mp4 filename: \"%V\"", &path);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = NGX_MAX_OFF_T_VALUE;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-        case NGX_ENAMETOOLONG:[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_EACCES:[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-        case NGX_EMLINK:[m
[31m-        case NGX_ELOOP:[m
[31m-#endif[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {[m
[31m-            ngx_log_error(level, log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, path.data);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (!of.is_file) {[m
[31m-[m
[31m-        if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", path.data);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->root_tested = !r->error_page;[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-    start = -1;[m
[31m-    length = 0;[m
[31m-    r->headers_out.content_length_n = of.size;[m
[31m-    mp4 = NULL;[m
[31m-    b = NULL;[m
[31m-[m
[31m-    if (r->args.len) {[m
[31m-[m
[31m-        if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) {[m
[31m-[m
[31m-            /*[m
[31m-             * A Flash player may send start value with a lot of digits[m
[31m-             * after dot so strtod() is used instead of atofp().  NaNs and[m
[31m-             * infinities become negative numbers after (int) conversion.[m
[31m-             */[m
[31m-[m
[31m-            ngx_set_errno(0);[m
[31m-            start = (int) (strtod((char *) value.data, NULL) * 1000);[m
[31m-[m
[31m-            if (ngx_errno != 0) {[m
[31m-                start = -1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_arg(r, (u_char *) "end", 3, &value) == NGX_OK) {[m
[31m-[m
[31m-            ngx_set_errno(0);[m
[31m-            end = (int) (strtod((char *) value.data, NULL) * 1000);[m
[31m-[m
[31m-            if (ngx_errno != 0) {[m
[31m-                end = -1;[m
[31m-            }[m
[31m-[m
[31m-            if (end > 0) {[m
[31m-                if (start < 0) {[m
[31m-                    start = 0;[m
[31m-                }[m
[31m-[m
[31m-                if (end > start) {[m
[31m-                    length = end - start;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (start >= 0) {[m
[31m-        r->single_range = 1;[m
[31m-[m
[31m-        mp4 = ngx_pcalloc(r->pool, sizeof(ngx_http_mp4_file_t));[m
[31m-        if (mp4 == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        mp4->file.fd = of.fd;[m
[31m-        mp4->file.name = path;[m
[31m-        mp4->file.log = r->connection->log;[m
[31m-        mp4->end = of.size;[m
[31m-        mp4->start = (ngx_uint_t) start;[m
[31m-        mp4->length = length;[m
[31m-        mp4->request = r;[m
[31m-[m
[31m-        switch (ngx_http_mp4_process(mp4)) {[m
[31m-[m
[31m-        case NGX_DECLINED:[m
[31m-            if (mp4->buffer) {[m
[31m-                ngx_pfree(r->pool, mp4->buffer);[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(r->pool, mp4);[m
[31m-            mp4 = NULL;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_OK:[m
[31m-            r->headers_out.content_length_n = mp4->content_length;[m
[31m-            break;[m
[31m-[m
[31m-        default: /* NGX_ERROR */[m
[31m-            if (mp4->buffer) {[m
[31m-                ngx_pfree(r->pool, mp4->buffer);[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(r->pool, mp4);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    log->action = "sending mp4 to client";[m
[31m-[m
[31m-    if (clcf->directio <= of.size) {[m
[31m-[m
[31m-        /*[m
[31m-         * DIRECTIO is set on transfer only[m
[31m-         * to allow kernel to cache "moov" atom[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_directio_on(of.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_directio_on_n " \"%s\" failed", path.data);[m
[31m-        }[m
[31m-[m
[31m-        of.is_directio = 1;[m
[31m-[m
[31m-        if (mp4) {[m
[31m-            mp4->file.directio = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.last_modified_time = of.mtime;[m
[31m-[m
[31m-    if (ngx_http_set_etag(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4 == NULL) {[m
[31m-        b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-        if (b->file == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4) {[m
[31m-        return ngx_http_output_filter(r, mp4->out);[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = 0;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = b->file_last ? 1 : 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->name = path;[m
[31m-    b->file->log = log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_process(ngx_http_mp4_file_t *mp4)[m
[31m-{[m
[31m-    off_t                  start_offset, end_offset, adjustment;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_uint_t             i, j;[m
[31m-    ngx_chain_t          **prev;[m
[31m-    ngx_http_mp4_trak_t   *trak;[m
[31m-    ngx_http_mp4_conf_t   *conf;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 start:%ui, length:%ui", mp4->start, mp4->length);[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module);[m
[31m-[m
[31m-    mp4->buffer_size = conf->buffer_size;[m
[31m-[m
[31m-    rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_atoms, mp4->end);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->trak.nelts == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 trak atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->mdat_atom.buf == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 mdat atom was found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    prev = &mp4->out;[m
[31m-[m
[31m-    if (mp4->ftyp_atom.buf) {[m
[31m-        *prev = &mp4->ftyp_atom;[m
[31m-        prev = &mp4->ftyp_atom.next;[m
[31m-    }[m
[31m-[m
[31m-    *prev = &mp4->moov_atom;[m
[31m-    prev = &mp4->moov_atom.next;[m
[31m-[m
[31m-    if (mp4->mvhd_atom.buf) {[m
[31m-        mp4->moov_size += mp4->mvhd_atom_buf.last - mp4->mvhd_atom_buf.pos;[m
[31m-        *prev = &mp4->mvhd_atom;[m
[31m-        prev = &mp4->mvhd_atom.next;[m
[31m-    }[m
[31m-[m
[31m-    start_offset = mp4->end;[m
[31m-    end_offset = 0;[m
[31m-    trak = mp4->trak.elts;[m
[31m-[m
[31m-    for (i = 0; i < mp4->trak.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_mp4_update_stts_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_mp4_update_stss_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_mp4_update_ctts_atom(mp4, &trak[i]);[m
[31m-[m
[31m-        if (ngx_http_mp4_update_stsc_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_mp4_update_stsz_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (trak[i].out[NGX_HTTP_MP4_CO64_DATA].buf) {[m
[31m-            if (ngx_http_mp4_update_co64_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_mp4_update_stco_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_mp4_update_stbl_atom(mp4, &trak[i]);[m
[31m-        ngx_http_mp4_update_minf_atom(mp4, &trak[i]);[m
[31m-        trak[i].size += trak[i].mdhd_size;[m
[31m-        trak[i].size += trak[i].hdlr_size;[m
[31m-        ngx_http_mp4_update_mdia_atom(mp4, &trak[i]);[m
[31m-        trak[i].size += trak[i].tkhd_size;[m
[31m-        ngx_http_mp4_update_trak_atom(mp4, &trak[i]);[m
[31m-[m
[31m-        mp4->moov_size += trak[i].size;[m
[31m-[m
[31m-        if (start_offset > trak[i].start_offset) {[m
[31m-            start_offset = trak[i].start_offset;[m
[31m-        }[m
[31m-[m
[31m-        if (end_offset < trak[i].end_offset) {[m
[31m-            end_offset = trak[i].end_offset;[m
[31m-        }[m
[31m-[m
[31m-        *prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM];[m
[31m-        prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM].next;[m
[31m-[m
[31m-        for (j = 0; j < NGX_HTTP_MP4_LAST_ATOM + 1; j++) {[m
[31m-            if (trak[i].out[j].buf) {[m
[31m-                *prev = &trak[i].out[j];[m
[31m-                prev = &trak[i].out[j].next;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (end_offset < start_offset) {[m
[31m-        end_offset = start_offset;[m
[31m-    }[m
[31m-[m
[31m-    mp4->moov_size += 8;[m
[31m-[m
[31m-    ngx_mp4_set_32value(mp4->moov_atom_header, mp4->moov_size);[m
[31m-    ngx_mp4_set_atom_name(mp4->moov_atom_header, 'm', 'o', 'o', 'v');[m
[31m-    mp4->content_length += mp4->moov_size;[m
[31m-[m
[31m-    *prev = &mp4->mdat_atom;[m
[31m-[m
[31m-    if (start_offset > mp4->mdat_data.buf->file_last) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "start time is out mp4 mdat atom in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    adjustment = mp4->ftyp_size + mp4->moov_size[m
[31m-                 + ngx_http_mp4_update_mdat_atom(mp4, start_offset, end_offset)[m
[31m-                 - start_offset;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 adjustment:%O", adjustment);[m
[31m-[m
[31m-    for (i = 0; i < mp4->trak.nelts; i++) {[m
[31m-        if (trak[i].out[NGX_HTTP_MP4_CO64_DATA].buf) {[m
[31m-            ngx_http_mp4_adjust_co64_atom(mp4, &trak[i], adjustment);[m
[31m-        } else {[m
[31m-            ngx_http_mp4_adjust_stco_atom(mp4, &trak[i], (int32_t) adjustment);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-} ngx_mp4_atom_header_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    size64[8];[m
[31m-} ngx_mp4_atom_header64_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_atom_handler_t *atom, uint64_t atom_data_size)[m
[31m-{[m
[31m-    off_t        end;[m
[31m-    size_t       atom_header_size;[m
[31m-    u_char      *atom_header, *atom_name;[m
[31m-    uint64_t     atom_size;[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_uint_t   n;[m
[31m-[m
[31m-    end = mp4->offset + atom_data_size;[m
[31m-[m
[31m-    while (mp4->offset < end) {[m
[31m-[m
[31m-        if (ngx_http_mp4_read(mp4, sizeof(uint32_t)) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        atom_header = mp4->buffer_pos;[m
[31m-        atom_size = ngx_mp4_get_32value(atom_header);[m
[31m-        atom_header_size = sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-        if (atom_size == 0) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                           "mp4 atom end");[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (atom_size < sizeof(ngx_mp4_atom_header_t)) {[m
[31m-[m
[31m-            if (atom_size == 1) {[m
[31m-[m
[31m-                if (ngx_http_mp4_read(mp4, sizeof(ngx_mp4_atom_header64_t))[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                /* 64-bit atom size */[m
[31m-                atom_header = mp4->buffer_pos;[m
[31m-                atom_size = ngx_mp4_get_64value(atom_header + 8);[m
[31m-                atom_header_size = sizeof(ngx_mp4_atom_header64_t);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                              "\"%s\" mp4 atom is too small:%uL",[m
[31m-                              mp4->file.name.data, atom_size);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_mp4_read(mp4, sizeof(ngx_mp4_atom_header_t)) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        atom_header = mp4->buffer_pos;[m
[31m-        atom_name = atom_header + sizeof(uint32_t);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 atom: %*s @%O:%uL",[m
[31m-                       (size_t) 4, atom_name, mp4->offset, atom_size);[m
[31m-[m
[31m-        if (atom_size > (uint64_t) (NGX_MAX_OFF_T_VALUE - mp4->offset)[m
[31m-            || mp4->offset + (off_t) atom_size > end)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 atom too large:%uL",[m
[31m-                          mp4->file.name.data, atom_size);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (n = 0; atom[n].name; n++) {[m
[31m-[m
[31m-            if (ngx_strncmp(atom_name, atom[n].name, 4) == 0) {[m
[31m-[m
[31m-                ngx_mp4_atom_next(mp4, atom_header_size);[m
[31m-[m
[31m-                rc = atom[n].handler(mp4, atom_size - atom_header_size);[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_mp4_atom_next(mp4, atom_size);[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read(ngx_http_mp4_file_t *mp4, size_t size)[m
[31m-{[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    if (mp4->buffer_pos + size <= mp4->buffer_end) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->offset + (off_t) mp4->buffer_size > mp4->end) {[m
[31m-        mp4->buffer_size = (size_t) (mp4->end - mp4->offset);[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->buffer_size < size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 file truncated", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->buffer == NULL) {[m
[31m-        mp4->buffer = ngx_palloc(mp4->request->pool, mp4->buffer_size);[m
[31m-        if (mp4->buffer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        mp4->buffer_start = mp4->buffer;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_file(&mp4->file, mp4->buffer_start, mp4->buffer_size,[m
[31m-                      mp4->offset);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != mp4->buffer_size) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, mp4->file.log, 0,[m
[31m-                      ngx_read_file_n " read only %z of %z from \"%s\"",[m
[31m-                      n, mp4->buffer_size, mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mp4->buffer_pos = mp4->buffer_start;[m
[31m-    mp4->buffer_end = mp4->buffer_start + mp4->buffer_size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char     *ftyp_atom;[m
[31m-    size_t      atom_size;[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 ftyp atom");[m
[31m-[m
[31m-    if (atom_data_size > 1024[m
[31m-        || ngx_mp4_atom_data(mp4) + (size_t) atom_data_size > mp4->buffer_end)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 ftyp atom is too large:%uL",[m
[31m-                      mp4->file.name.data, atom_data_size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-[m
[31m-    ftyp_atom = ngx_palloc(mp4->request->pool, atom_size);[m
[31m-    if (ftyp_atom == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mp4_set_32value(ftyp_atom, atom_size);[m
[31m-    ngx_mp4_set_atom_name(ftyp_atom, 'f', 't', 'y', 'p');[m
[31m-[m
[31m-    /*[m
[31m-     * only moov atom content is guaranteed to be in mp4->buffer[m
[31m-     * during sending response, so ftyp atom content should be copied[m
[31m-     */[m
[31m-    ngx_memcpy(ftyp_atom + sizeof(ngx_mp4_atom_header_t),[m
[31m-               ngx_mp4_atom_data(mp4), (size_t) atom_data_size);[m
[31m-[m
[31m-    atom = &mp4->ftyp_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = ftyp_atom;[m
[31m-    atom->last = ftyp_atom + atom_size;[m
[31m-[m
[31m-    mp4->ftyp_atom.buf = atom;[m
[31m-    mp4->ftyp_size = atom_size;[m
[31m-    mp4->content_length = atom_size;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Small excess buffer to process atoms after moov atom, mp4->buffer_start[m
[31m- * will be set to this buffer part after moov atom processing.[m
[31m- */[m
[31m-#define NGX_HTTP_MP4_MOOV_BUFFER_EXCESS  (4 * 1024)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_uint_t            no_mdat;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_conf_t  *conf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 moov atom");[m
[31m-[m
[31m-    no_mdat = (mp4->mdat_atom.buf == NULL);[m
[31m-[m
[31m-    if (no_mdat && mp4->start == 0 && mp4->length == 0) {[m
[31m-        /*[m
[31m-         * send original file if moov atom resides before[m
[31m-         * mdat atom and client requests integral file[m
[31m-         */[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module);[m
[31m-[m
[31m-    if (atom_data_size > mp4->buffer_size) {[m
[31m-[m
[31m-        if (atom_data_size > conf->max_buffer_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 moov atom is too large:%uL, "[m
[31m-                          "you may want to increase mp4_max_buffer_size",[m
[31m-                          mp4->file.name.data, atom_data_size);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_pfree(mp4->request->pool, mp4->buffer);[m
[31m-        mp4->buffer = NULL;[m
[31m-        mp4->buffer_pos = NULL;[m
[31m-        mp4->buffer_end = NULL;[m
[31m-[m
[31m-        mp4->buffer_size = (size_t) atom_data_size[m
[31m-                         + NGX_HTTP_MP4_MOOV_BUFFER_EXCESS * no_mdat;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_read(mp4, (size_t) atom_data_size) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mp4->trak.elts = &mp4->traks;[m
[31m-    mp4->trak.size = sizeof(ngx_http_mp4_trak_t);[m
[31m-    mp4->trak.nalloc = 2;[m
[31m-    mp4->trak.pool = mp4->request->pool;[m
[31m-[m
[31m-    atom = &mp4->moov_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = mp4->moov_atom_header;[m
[31m-    atom->last = mp4->moov_atom_header + 8;[m
[31m-[m
[31m-    mp4->moov_atom.buf = &mp4->moov_atom_buf;[m
[31m-[m
[31m-    rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_moov_atoms, atom_data_size);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 moov atom done");[m
[31m-[m
[31m-    if (no_mdat) {[m
[31m-        mp4->buffer_start = mp4->buffer_pos;[m
[31m-        mp4->buffer_size = NGX_HTTP_MP4_MOOV_BUFFER_EXCESS;[m
[31m-[m
[31m-        if (mp4->buffer_start + mp4->buffer_size > mp4->buffer_end) {[m
[31m-            mp4->buffer = NULL;[m
[31m-            mp4->buffer_pos = NULL;[m
[31m-            mp4->buffer_end = NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* skip atoms after moov atom */[m
[31m-        mp4->offset = mp4->end;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    ngx_buf_t  *data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdat atom");[m
[31m-[m
[31m-    data = &mp4->mdat_data_buf;[m
[31m-    data->file = &mp4->file;[m
[31m-    data->in_file = 1;[m
[31m-    data->last_buf = 1;[m
[31m-    data->last_in_chain = 1;[m
[31m-    data->file_last = mp4->offset + atom_data_size;[m
[31m-[m
[31m-    mp4->mdat_atom.buf = &mp4->mdat_atom_buf;[m
[31m-    mp4->mdat_atom.next = &mp4->mdat_data;[m
[31m-    mp4->mdat_data.buf = data;[m
[31m-[m
[31m-    if (mp4->trak.nelts) {[m
[31m-        /* skip atoms after mdat atom */[m
[31m-        mp4->offset = mp4->end;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4, off_t start_offset,[m
[31m-    off_t end_offset)[m
[31m-{[m
[31m-    off_t       atom_data_size;[m
[31m-    u_char     *atom_header;[m
[31m-    uint32_t    atom_header_size;[m
[31m-    uint64_t    atom_size;[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    atom_data_size = end_offset - start_offset;[m
[31m-    mp4->mdat_data.buf->file_pos = start_offset;[m
[31m-    mp4->mdat_data.buf->file_last = end_offset;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mdat new offset @%O:%O", start_offset, atom_data_size);[m
[31m-[m
[31m-    atom_header = mp4->mdat_atom_header;[m
[31m-[m
[31m-    if ((uint64_t) atom_data_size > (uint64_t) 0xffffffff) {[m
[31m-        atom_size = 1;[m
[31m-        atom_header_size = sizeof(ngx_mp4_atom_header64_t);[m
[31m-        ngx_mp4_set_64value(atom_header + sizeof(ngx_mp4_atom_header_t),[m
[31m-                            sizeof(ngx_mp4_atom_header64_t) + atom_data_size);[m
[31m-    } else {[m
[31m-        atom_size = sizeof(ngx_mp4_atom_header_t) + atom_data_size;[m
[31m-        atom_header_size = sizeof(ngx_mp4_atom_header_t);[m
[31m-    }[m
[31m-[m
[31m-    mp4->content_length += atom_header_size + atom_data_size;[m
[31m-[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'a', 't');[m
[31m-[m
[31m-    atom = &mp4->mdat_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_header_size;[m
[31m-[m
[31m-    return atom_header_size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[4];[m
[31m-    u_char    modification_time[4];[m
[31m-    u_char    timescale[4];[m
[31m-    u_char    duration[4];[m
[31m-    u_char    rate[4];[m
[31m-    u_char    volume[2];[m
[31m-    u_char    reserved[10];[m
[31m-    u_char    matrix[36];[m
[31m-    u_char    preview_time[4];[m
[31m-    u_char    preview_duration[4];[m
[31m-    u_char    poster_time[4];[m
[31m-    u_char    selection_time[4];[m
[31m-    u_char    selection_duration[4];[m
[31m-    u_char    current_time[4];[m
[31m-    u_char    next_track_id[4];[m
[31m-} ngx_mp4_mvhd_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[8];[m
[31m-    u_char    modification_time[8];[m
[31m-    u_char    timescale[4];[m
[31m-    u_char    duration[8];[m
[31m-    u_char    rate[4];[m
[31m-    u_char    volume[2];[m
[31m-    u_char    reserved[10];[m
[31m-    u_char    matrix[36];[m
[31m-    u_char    preview_time[4];[m
[31m-    u_char    preview_duration[4];[m
[31m-    u_char    poster_time[4];[m
[31m-    u_char    selection_time[4];[m
[31m-    u_char    selection_duration[4];[m
[31m-    u_char    current_time[4];[m
[31m-    u_char    next_track_id[4];[m
[31m-} ngx_mp4_mvhd64_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char                 *atom_header;[m
[31m-    size_t                  atom_size;[m
[31m-    uint32_t                timescale;[m
[31m-    uint64_t                duration, start_time, length_time;[m
[31m-    ngx_buf_t              *atom;[m
[31m-    ngx_mp4_mvhd_atom_t    *mvhd_atom;[m
[31m-    ngx_mp4_mvhd64_atom_t  *mvhd64_atom;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mvhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    mvhd_atom = (ngx_mp4_mvhd_atom_t *) atom_header;[m
[31m-    mvhd64_atom = (ngx_mp4_mvhd64_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'm', 'v', 'h', 'd');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_mvhd_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 mvhd atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mvhd_atom->version[0] == 0) {[m
[31m-        /* version 0: 32-bit duration */[m
[31m-        timescale = ngx_mp4_get_32value(mvhd_atom->timescale);[m
[31m-        duration = ngx_mp4_get_32value(mvhd_atom->duration);[m
[31m-[m
[31m-    } else {[m
[31m-        /* version 1: 64-bit duration */[m
[31m-[m
[31m-        if (ngx_mp4_atom_data_size(ngx_mp4_mvhd64_atom_t) > atom_data_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 mvhd atom too small",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        timescale = ngx_mp4_get_32value(mvhd64_atom->timescale);[m
[31m-        duration = ngx_mp4_get_64value(mvhd64_atom->duration);[m
[31m-    }[m
[31m-[m
[31m-    mp4->timescale = timescale;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mvhd timescale:%uD, duration:%uL, time:%.3fs",[m
[31m-                   timescale, duration, (double) duration / timescale);[m
[31m-[m
[31m-    start_time = (uint64_t) mp4->start * timescale / 1000;[m
[31m-[m
[31m-    if (duration < start_time) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 start time exceeds file duration",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    duration -= start_time;[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-        length_time = (uint64_t) mp4->length * timescale / 1000;[m
[31m-[m
[31m-        if (duration > length_time) {[m
[31m-            duration = length_time;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mvhd new duration:%uL, time:%.3fs",[m
[31m-                   duration, (double) duration / timescale);[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(mvhd_atom->size, atom_size);[m
[31m-[m
[31m-    if (mvhd_atom->version[0] == 0) {[m
[31m-        ngx_mp4_set_32value(mvhd_atom->duration, duration);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_64value(mvhd64_atom->duration, duration);[m
[31m-    }[m
[31m-[m
[31m-    atom = &mp4->mvhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    mp4->mvhd_atom.buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_trak_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_end;[m
[31m-    off_t                 atom_file_end;[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 trak atom");[m
[31m-[m
[31m-    trak = ngx_array_push(&mp4->trak);[m
[31m-    if (trak == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t));[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 't', 'r', 'a', 'k');[m
[31m-[m
[31m-    atom = &trak->trak_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_TRAK_ATOM].buf = atom;[m
[31m-[m
[31m-    atom_end = mp4->buffer_pos + (size_t) atom_data_size;[m
[31m-    atom_file_end = mp4->offset + atom_data_size;[m
[31m-[m
[31m-    rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_trak_atoms, atom_data_size);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 trak atom: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        /* skip this trak */[m
[31m-        ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t));[m
[31m-        mp4->trak.nelts--;[m
[31m-        mp4->buffer_pos = atom_end;[m
[31m-        mp4->offset = atom_file_end;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_trak_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    trak->size += sizeof(ngx_mp4_atom_header_t);[m
[31m-    atom = &trak->trak_atom_buf;[m
[31m-    ngx_mp4_set_32value(atom->pos, trak->size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_cmov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                  "\"%s\" mp4 compressed moov atom (cmov) is not supported",[m
[31m-                  mp4->file.name.data);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[4];[m
[31m-    u_char    modification_time[4];[m
[31m-    u_char    track_id[4];[m
[31m-    u_char    reserved1[4];[m
[31m-    u_char    duration[4];[m
[31m-    u_char    reserved2[8];[m
[31m-    u_char    layer[2];[m
[31m-    u_char    group[2];[m
[31m-    u_char    volume[2];[m
[31m-    u_char    reserved3[2];[m
[31m-    u_char    matrix[36];[m
[31m-    u_char    width[4];[m
[31m-    u_char    height[4];[m
[31m-} ngx_mp4_tkhd_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[8];[m
[31m-    u_char    modification_time[8];[m
[31m-    u_char    track_id[4];[m
[31m-    u_char    reserved1[4];[m
[31m-    u_char    duration[8];[m
[31m-    u_char    reserved2[8];[m
[31m-    u_char    layer[2];[m
[31m-    u_char    group[2];[m
[31m-    u_char    volume[2];[m
[31m-    u_char    reserved3[2];[m
[31m-    u_char    matrix[36];[m
[31m-    u_char    width[4];[m
[31m-    u_char    height[4];[m
[31m-} ngx_mp4_tkhd64_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char                 *atom_header;[m
[31m-    size_t                  atom_size;[m
[31m-    uint64_t                duration, start_time, length_time;[m
[31m-    ngx_buf_t              *atom;[m
[31m-    ngx_http_mp4_trak_t    *trak;[m
[31m-    ngx_mp4_tkhd_atom_t    *tkhd_atom;[m
[31m-    ngx_mp4_tkhd64_atom_t  *tkhd64_atom;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 tkhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    tkhd_atom = (ngx_mp4_tkhd_atom_t *) atom_header;[m
[31m-    tkhd64_atom = (ngx_mp4_tkhd64_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(tkhd_atom, 't', 'k', 'h', 'd');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_tkhd_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 tkhd atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (tkhd_atom->version[0] == 0) {[m
[31m-        /* version 0: 32-bit duration */[m
[31m-        duration = ngx_mp4_get_32value(tkhd_atom->duration);[m
[31m-[m
[31m-    } else {[m
[31m-        /* version 1: 64-bit duration */[m
[31m-[m
[31m-        if (ngx_mp4_atom_data_size(ngx_mp4_tkhd64_atom_t) > atom_data_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 tkhd atom too small",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        duration = ngx_mp4_get_64value(tkhd64_atom->duration);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "tkhd duration:%uL, time:%.3fs",[m
[31m-                   duration, (double) duration / mp4->timescale);[m
[31m-[m
[31m-    start_time = (uint64_t) mp4->start * mp4->timescale / 1000;[m
[31m-[m
[31m-    if (duration <= start_time) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "tkhd duration is less than start time");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    duration -= start_time;[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-        length_time = (uint64_t) mp4->length * mp4->timescale / 1000;[m
[31m-[m
[31m-        if (duration > length_time) {[m
[31m-            duration = length_time;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "tkhd new duration:%uL, time:%.3fs",[m
[31m-                   duration, (double) duration / mp4->timescale);[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->tkhd_size = atom_size;[m
[31m-[m
[31m-    ngx_mp4_set_32value(tkhd_atom->size, atom_size);[m
[31m-[m
[31m-    if (tkhd_atom->version[0] == 0) {[m
[31m-        ngx_mp4_set_32value(tkhd_atom->duration, duration);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_64value(tkhd64_atom->duration, duration);[m
[31m-    }[m
[31m-[m
[31m-    atom = &trak->tkhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_TKHD_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process mdia atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'i', 'a');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->mdia_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_MDIA_ATOM].buf = atom;[m
[31m-[m
[31m-    return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_mdia_atoms, atom_data_size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_mdia_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    trak->size += sizeof(ngx_mp4_atom_header_t);[m
[31m-    atom = &trak->mdia_atom_buf;[m
[31m-    ngx_mp4_set_32value(atom->pos, trak->size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[4];[m
[31m-    u_char    modification_time[4];[m
[31m-    u_char    timescale[4];[m
[31m-    u_char    duration[4];[m
[31m-    u_char    language[2];[m
[31m-    u_char    quality[2];[m
[31m-} ngx_mp4_mdhd_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[8];[m
[31m-    u_char    modification_time[8];[m
[31m-    u_char    timescale[4];[m
[31m-    u_char    duration[8];[m
[31m-    u_char    language[2];[m
[31m-    u_char    quality[2];[m
[31m-} ngx_mp4_mdhd64_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char                 *atom_header;[m
[31m-    size_t                  atom_size;[m
[31m-    uint32_t                timescale;[m
[31m-    uint64_t                duration, start_time, length_time;[m
[31m-    ngx_buf_t              *atom;[m
[31m-    ngx_http_mp4_trak_t    *trak;[m
[31m-    ngx_mp4_mdhd_atom_t    *mdhd_atom;[m
[31m-    ngx_mp4_mdhd64_atom_t  *mdhd64_atom;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    mdhd_atom = (ngx_mp4_mdhd_atom_t *) atom_header;[m
[31m-    mdhd64_atom = (ngx_mp4_mdhd64_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(mdhd_atom, 'm', 'd', 'h', 'd');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_mdhd_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 mdhd atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mdhd_atom->version[0] == 0) {[m
[31m-        /* version 0: everything is 32-bit */[m
[31m-        timescale = ngx_mp4_get_32value(mdhd_atom->timescale);[m
[31m-        duration = ngx_mp4_get_32value(mdhd_atom->duration);[m
[31m-[m
[31m-    } else {[m
[31m-        /* version 1: 64-bit duration and 32-bit timescale */[m
[31m-[m
[31m-        if (ngx_mp4_atom_data_size(ngx_mp4_mdhd64_atom_t) > atom_data_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 mdhd atom too small",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        timescale = ngx_mp4_get_32value(mdhd64_atom->timescale);[m
[31m-        duration = ngx_mp4_get_64value(mdhd64_atom->duration);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mdhd timescale:%uD, duration:%uL, time:%.3fs",[m
[31m-                   timescale, duration, (double) duration / timescale);[m
[31m-[m
[31m-    start_time = (uint64_t) mp4->start * timescale / 1000;[m
[31m-[m
[31m-    if (duration <= start_time) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mdhd duration is less than start time");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    duration -= start_time;[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-        length_time = (uint64_t) mp4->length * timescale / 1000;[m
[31m-[m
[31m-        if (duration > length_time) {[m
[31m-            duration = length_time;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mdhd new duration:%uL, time:%.3fs",[m
[31m-                   duration, (double) duration / timescale);[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->mdhd_size = atom_size;[m
[31m-    trak->timescale = timescale;[m
[31m-[m
[31m-    ngx_mp4_set_32value(mdhd_atom->size, atom_size);[m
[31m-[m
[31m-    if (mdhd_atom->version[0] == 0) {[m
[31m-        ngx_mp4_set_32value(mdhd_atom->duration, duration);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_64value(mdhd64_atom->duration, duration);[m
[31m-    }[m
[31m-[m
[31m-    atom = &trak->mdhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char              *atom_header;[m
[31m-    size_t               atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 hdlr atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'h', 'd', 'l', 'r');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->hdlr_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->hdlr_size = atom_size;[m
[31m-    trak->out[NGX_HTTP_MP4_HDLR_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process minf atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'm', 'i', 'n', 'f');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->minf_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_MINF_ATOM].buf = atom;[m
[31m-[m
[31m-    return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_minf_atoms, atom_data_size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_minf_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    trak->size += sizeof(ngx_mp4_atom_header_t)[m
[31m-               + trak->vmhd_size[m
[31m-               + trak->smhd_size[m
[31m-               + trak->dinf_size;[m
[31m-    atom = &trak->minf_atom_buf;[m
[31m-    ngx_mp4_set_32value(atom->pos, trak->size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char              *atom_header;[m
[31m-    size_t               atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 vmhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'v', 'm', 'h', 'd');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->vmhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->vmhd_size += atom_size;[m
[31m-    trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char              *atom_header;[m
[31m-    size_t               atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 smhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 's', 'm', 'h', 'd');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->smhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->smhd_size += atom_size;[m
[31m-    trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char              *atom_header;[m
[31m-    size_t               atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 dinf atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'd', 'i', 'n', 'f');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->dinf_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->dinf_size += atom_size;[m
[31m-    trak->out[NGX_HTTP_MP4_DINF_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process stbl atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 's', 't', 'b', 'l');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->stbl_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STBL_ATOM].buf = atom;[m
[31m-[m
[31m-    return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_stbl_atoms, atom_data_size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_stbl_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    trak->size += sizeof(ngx_mp4_atom_header_t);[m
[31m-    atom = &trak->stbl_atom_buf;[m
[31m-    ngx_mp4_set_32value(atom->pos, trak->size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-[m
[31m-    u_char    media_size[4];[m
[31m-    u_char    media_name[4];[m
[31m-} ngx_mp4_stsd_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table;[m
[31m-    size_t                atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_mp4_stsd_atom_t  *stsd_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* sample description atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stsd_atom = (ngx_mp4_stsd_atom_t *) atom_header;[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    atom_table = atom_header + atom_size;[m
[31m-    ngx_mp4_set_32value(stsd_atom->size, atom_size);[m
[31m-    ngx_mp4_set_atom_name(stsd_atom, 's', 't', 's', 'd');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stsd_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stsd atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "stsd entries:%uD, media:%*s",[m
[31m-                   ngx_mp4_get_32value(stsd_atom->entries),[m
[31m-                   (size_t) 4, stsd_atom->media_name);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->stsd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STSD_ATOM].buf = atom;[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_stts_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    count[4];[m
[31m-    u_char    duration[4];[m
[31m-} ngx_mp4_stts_entry_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stts_atom_t  *stts_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* time-to-sample atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stts atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stts_atom = (ngx_mp4_stts_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stts_atom, 's', 't', 't', 's');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stts_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stts atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(stts_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 time-to-sample entries:%uD", entries);[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stts_atom_t)[m
[31m-        + entries * sizeof(ngx_mp4_stts_entry_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stts atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_stts_atom_t);[m
[31m-    atom_end = atom_table + entries * sizeof(ngx_mp4_stts_entry_t);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->time_to_sample_entries = entries;[m
[31m-[m
[31m-    atom = &trak->stts_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    data = &trak->stts_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STTS_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_STTS_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stts_atom_t  *stts_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stts updating requires trak->timescale[m
[31m-     * from mdia.mdhd atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stts atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 stts atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_crop_stts_data(mp4, trak, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_crop_stts_data(mp4, trak, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "time-to-sample entries:%uD", trak->time_to_sample_entries);[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_stts_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_STTS_ATOM].buf;[m
[31m-    stts_atom = (ngx_mp4_stts_atom_t *) atom->pos;[m
[31m-    ngx_mp4_set_32value(stts_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(stts_atom->entries, trak->time_to_sample_entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_crop_stts_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start)[m
[31m-{[m
[31m-    uint32_t               count, duration, rest;[m
[31m-    uint64_t               start_time;[m
[31m-    ngx_buf_t             *data;[m
[31m-    ngx_uint_t             start_sample, entries, start_sec;[m
[31m-    ngx_mp4_stts_entry_t  *entry, *end;[m
[31m-[m
[31m-    if (start) {[m
[31m-        start_sec = mp4->start;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stts crop start_time:%ui", start_sec);[m
[31m-[m
[31m-    } else if (mp4->length) {[m
[31m-        start_sec = mp4->length;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stts crop end_time:%ui", start_sec);[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf;[m
[31m-[m
[31m-    start_time = (uint64_t) start_sec * trak->timescale / 1000;[m
[31m-[m
[31m-    entries = trak->time_to_sample_entries;[m
[31m-    start_sample = 0;[m
[31m-    entry = (ngx_mp4_stts_entry_t *) data->pos;[m
[31m-    end = (ngx_mp4_stts_entry_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        count = ngx_mp4_get_32value(entry->count);[m
[31m-        duration = ngx_mp4_get_32value(entry->duration);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "time:%uL, count:%uD, duration:%uD",[m
[31m-                       start_time, count, duration);[m
[31m-[m
[31m-        if (start_time < (uint64_t) count * duration) {[m
[31m-            start_sample += (ngx_uint_t) (start_time / duration);[m
[31m-            rest = (uint32_t) (start_time / duration);[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        start_sample += count;[m
[31m-        start_time -= count * duration;[m
[31m-        entries--;[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    if (start) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "start time is out mp4 stts samples in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    } else {[m
[31m-        trak->end_sample = trak->start_sample + start_sample;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "end_sample:%ui", trak->end_sample);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (start) {[m
[31m-        ngx_mp4_set_32value(entry->count, count - rest);[m
[31m-        data->pos = (u_char *) entry;[m
[31m-        trak->time_to_sample_entries = entries;[m
[31m-        trak->start_sample = start_sample;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "start_sample:%ui, new count:%uD",[m
[31m-                       trak->start_sample, count - rest);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_32value(entry->count, rest);[m
[31m-        data->last = (u_char *) (entry + 1);[m
[31m-        trak->time_to_sample_entries -= entries - 1;[m
[31m-        trak->end_sample = trak->start_sample + start_sample;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "end_sample:%ui, new count:%uD",[m
[31m-                       trak->end_sample, rest);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_http_mp4_stss_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char                    *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t                   entries;[m
[31m-    ngx_buf_t                 *atom, *data;[m
[31m-    ngx_http_mp4_trak_t       *trak;[m
[31m-    ngx_http_mp4_stss_atom_t  *stss_atom;[m
[31m-[m
[31m-    /* sync samples atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stss atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stss_atom = (ngx_http_mp4_stss_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stss_atom, 's', 't', 's', 's');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_http_mp4_stss_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stss atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(stss_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sync sample entries:%uD", entries);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->sync_samples_entries = entries;[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_http_mp4_stss_atom_t);[m
[31m-[m
[31m-    atom = &trak->stss_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_http_mp4_stss_atom_t)[m
[31m-        + entries * sizeof(uint32_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stss atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_end = atom_table + entries * sizeof(uint32_t);[m
[31m-[m
[31m-    data = &trak->stss_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STSS_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_STSS_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stss_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                     atom_size;[m
[31m-    uint32_t                   sample, start_sample, *entry, *end;[m
[31m-    ngx_buf_t                 *atom, *data;[m
[31m-    ngx_http_mp4_stss_atom_t  *stss_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stss updating requires trak->start_sample[m
[31m-     * from mdia.minf.stbl.stts which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stss atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_mp4_crop_stss_data(mp4, trak, 1);[m
[31m-    ngx_http_mp4_crop_stss_data(mp4, trak, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sync sample entries:%uD", trak->sync_samples_entries);[m
[31m-[m
[31m-    if (trak->sync_samples_entries) {[m
[31m-        entry = (uint32_t *) data->pos;[m
[31m-        end = (uint32_t *) data->last;[m
[31m-[m
[31m-        start_sample = trak->start_sample;[m
[31m-[m
[31m-        while (entry < end) {[m
[31m-            sample = ngx_mp4_get_32value(entry);[m
[31m-            sample -= start_sample;[m
[31m-            ngx_mp4_set_32value(entry, sample);[m
[31m-            entry++;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        trak->out[NGX_HTTP_MP4_STSS_DATA].buf = NULL;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_http_mp4_stss_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_STSS_ATOM].buf;[m
[31m-    stss_atom = (ngx_http_mp4_stss_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(stss_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(stss_atom->entries, trak->sync_samples_entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_crop_stss_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start)[m
[31m-{[m
[31m-    uint32_t     sample, start_sample, *entry, *end;[m
[31m-    ngx_buf_t   *data;[m
[31m-    ngx_uint_t   entries;[m
[31m-[m
[31m-    /* sync samples starts from 1 */[m
[31m-[m
[31m-    if (start) {[m
[31m-        start_sample = trak->start_sample + 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stss crop start_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else if (mp4->length) {[m
[31m-        start_sample = trak->end_sample + 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stss crop end_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf;[m
[31m-[m
[31m-    entries = trak->sync_samples_entries;[m
[31m-    entry = (uint32_t *) data->pos;[m
[31m-    end = (uint32_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        sample = ngx_mp4_get_32value(entry);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "sync:%uD", sample);[m
[31m-[m
[31m-        if (sample >= start_sample) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        entries--;[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample is out of mp4 stss atom");[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (start) {[m
[31m-        data->pos = (u_char *) entry;[m
[31m-        trak->sync_samples_entries = entries;[m
[31m-[m
[31m-    } else {[m
[31m-        data->last = (u_char *) entry;[m
[31m-        trak->sync_samples_entries -= entries;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_ctts_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    count[4];[m
[31m-    u_char    offset[4];[m
[31m-} ngx_mp4_ctts_entry_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_ctts_atom_t  *ctts_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* composition offsets atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 ctts atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ctts_atom = (ngx_mp4_ctts_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(ctts_atom, 'c', 't', 't', 's');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_ctts_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 ctts atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(ctts_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "composition offset entries:%uD", entries);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->composition_offset_entries = entries;[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_ctts_atom_t);[m
[31m-[m
[31m-    atom = &trak->ctts_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_ctts_atom_t)[m
[31m-        + entries * sizeof(ngx_mp4_ctts_entry_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 ctts atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_end = atom_table + entries * sizeof(ngx_mp4_ctts_entry_t);[m
[31m-[m
[31m-    data = &trak->ctts_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_ctts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_ctts_atom_t  *ctts_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.ctts updating requires trak->start_sample[m
[31m-     * from mdia.minf.stbl.stts which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 ctts atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_mp4_crop_ctts_data(mp4, trak, 1);[m
[31m-    ngx_http_mp4_crop_ctts_data(mp4, trak, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "composition offset entries:%uD",[m
[31m-                   trak->composition_offset_entries);[m
[31m-[m
[31m-    if (trak->composition_offset_entries == 0) {[m
[31m-        trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = NULL;[m
[31m-        trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_ctts_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf;[m
[31m-    ctts_atom = (ngx_mp4_ctts_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(ctts_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(ctts_atom->entries, trak->composition_offset_entries);[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_crop_ctts_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start)[m
[31m-{[m
[31m-    uint32_t               count, start_sample, rest;[m
[31m-    ngx_buf_t             *data;[m
[31m-    ngx_uint_t             entries;[m
[31m-    ngx_mp4_ctts_entry_t  *entry, *end;[m
[31m-[m
[31m-    /* sync samples starts from 1 */[m
[31m-[m
[31m-    if (start) {[m
[31m-        start_sample = trak->start_sample + 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 ctts crop start_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else if (mp4->length) {[m
[31m-        start_sample = trak->end_sample - trak->start_sample + 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 ctts crop end_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf;[m
[31m-[m
[31m-    entries = trak->composition_offset_entries;[m
[31m-    entry = (ngx_mp4_ctts_entry_t *) data->pos;[m
[31m-    end = (ngx_mp4_ctts_entry_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        count = ngx_mp4_get_32value(entry->count);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "sample:%uD, count:%uD, offset:%uD",[m
[31m-                       start_sample, count, ngx_mp4_get_32value(entry->offset));[m
[31m-[m
[31m-        if (start_sample <= count) {[m
[31m-            rest = start_sample - 1;[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        start_sample -= count;[m
[31m-        entries--;[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    if (start) {[m
[31m-        data->pos = (u_char *) end;[m
[31m-        trak->composition_offset_entries = 0;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (start) {[m
[31m-        ngx_mp4_set_32value(entry->count, count - rest);[m
[31m-        data->pos = (u_char *) entry;[m
[31m-        trak->composition_offset_entries = entries;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_32value(entry->count, rest);[m
[31m-        data->last = (u_char *) (entry + 1);[m
[31m-        trak->composition_offset_entries -= entries - 1;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_stsc_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stsc_atom_t  *stsc_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* sample-to-chunk atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsc atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stsc_atom = (ngx_mp4_stsc_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stsc_atom, 's', 't', 's', 'c');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stsc_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stsc atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(stsc_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample-to-chunk entries:%uD", entries);[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stsc_atom_t)[m
[31m-        + entries * sizeof(ngx_mp4_stsc_entry_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stsc atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_stsc_atom_t);[m
[31m-    atom_end = atom_table + entries * sizeof(ngx_mp4_stsc_entry_t);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->sample_to_chunk_entries = entries;[m
[31m-[m
[31m-    atom = &trak->stsc_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    data = &trak->stsc_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STSC_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_STSC_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stsc_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                 atom_size;[m
[31m-    uint32_t               chunk;[m
[31m-    ngx_buf_t             *atom, *data;[m
[31m-    ngx_mp4_stsc_atom_t   *stsc_atom;[m
[31m-    ngx_mp4_stsc_entry_t  *entry, *end;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stsc updating requires trak->start_sample[m
[31m-     * from mdia.minf.stbl.stts which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stsc atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 stsc atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (trak->sample_to_chunk_entries == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "zero number of entries in stsc atom in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_crop_stsc_data(mp4, trak, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_crop_stsc_data(mp4, trak, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample-to-chunk entries:%uD",[m
[31m-                   trak->sample_to_chunk_entries);[m
[31m-[m
[31m-    entry = (ngx_mp4_stsc_entry_t *) data->pos;[m
[31m-    end = (ngx_mp4_stsc_entry_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        chunk = ngx_mp4_get_32value(entry->chunk);[m
[31m-        chunk -= trak->start_chunk;[m
[31m-        ngx_mp4_set_32value(entry->chunk, chunk);[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_stsc_atom_t)[m
[31m-                + trak->sample_to_chunk_entries * sizeof(ngx_mp4_stsc_entry_t);[m
[31m-[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_STSC_ATOM].buf;[m
[31m-    stsc_atom = (ngx_mp4_stsc_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(stsc_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(stsc_atom->entries, trak->sample_to_chunk_entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start)[m
[31m-{[m
[31m-    uint32_t               start_sample, chunk, samples, id, next_chunk, n,[m
[31m-                           prev_samples;[m
[31m-    ngx_buf_t             *data, *buf;[m
[31m-    ngx_uint_t             entries, target_chunk, chunk_samples;[m
[31m-    ngx_mp4_stsc_entry_t  *entry, *end, *first;[m
[31m-[m
[31m-    entries = trak->sample_to_chunk_entries - 1;[m
[31m-[m
[31m-    if (start) {[m
[31m-        start_sample = (uint32_t) trak->start_sample;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stsc crop start_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else if (mp4->length) {[m
[31m-        start_sample = (uint32_t) (trak->end_sample - trak->start_sample);[m
[31m-        samples = 0;[m
[31m-[m
[31m-        data = trak->out[NGX_HTTP_MP4_STSC_START].buf;[m
[31m-[m
[31m-        if (data) {[m
[31m-            entry = (ngx_mp4_stsc_entry_t *) data->pos;[m
[31m-            samples = ngx_mp4_get_32value(entry->samples);[m
[31m-            entries--;[m
[31m-[m
[31m-            if (samples > start_sample) {[m
[31m-                samples = start_sample;[m
[31m-                ngx_mp4_set_32value(entry->samples, samples);[m
[31m-            }[m
[31m-[m
[31m-            start_sample -= samples;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stsc crop end_sample:%uD, ext_samples:%uD",[m
[31m-                       start_sample, samples);[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf;[m
[31m-[m
[31m-    entry = (ngx_mp4_stsc_entry_t *) data->pos;[m
[31m-    end = (ngx_mp4_stsc_entry_t *) data->last;[m
[31m-[m
[31m-    chunk = ngx_mp4_get_32value(entry->chunk);[m
[31m-    samples = ngx_mp4_get_32value(entry->samples);[m
[31m-    id = ngx_mp4_get_32value(entry->id);[m
[31m-    prev_samples = 0;[m
[31m-    entry++;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-[m
[31m-        next_chunk = ngx_mp4_get_32value(entry->chunk);[m
[31m-[m
[31m-        ngx_log_debug5(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "sample:%uD, chunk:%uD, chunks:%uD, "[m
[31m-                       "samples:%uD, id:%uD",[m
[31m-                       start_sample, chunk, next_chunk - chunk, samples, id);[m
[31m-[m
[31m-        n = (next_chunk - chunk) * samples;[m
[31m-[m
[31m-        if (start_sample < n) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        start_sample -= n;[m
[31m-[m
[31m-        prev_samples = samples;[m
[31m-        chunk = next_chunk;[m
[31m-        samples = ngx_mp4_get_32value(entry->samples);[m
[31m-        id = ngx_mp4_get_32value(entry->id);[m
[31m-        entries--;[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    next_chunk = trak->chunks + 1;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample:%uD, chunk:%uD, chunks:%uD, samples:%uD",[m
[31m-                   start_sample, chunk, next_chunk - chunk, samples);[m
[31m-[m
[31m-    n = (next_chunk - chunk) * samples;[m
[31m-[m
[31m-    if (start_sample > n) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "%s time is out mp4 stsc chunks in \"%s\"",[m
[31m-                      start ? "start" : "end", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    entries++;[m
[31m-    entry--;[m
[31m-[m
[31m-    if (samples == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "zero number of samples in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    target_chunk = chunk - 1;[m
[31m-    target_chunk += start_sample / samples;[m
[31m-    chunk_samples = start_sample % samples;[m
[31m-[m
[31m-    if (start) {[m
[31m-        data->pos = (u_char *) entry;[m
[31m-[m
[31m-        trak->sample_to_chunk_entries = entries;[m
[31m-        trak->start_chunk = target_chunk;[m
[31m-        trak->start_chunk_samples = chunk_samples;[m
[31m-[m
[31m-        ngx_mp4_set_32value(entry->chunk, trak->start_chunk + 1);[m
[31m-[m
[31m-        samples -= chunk_samples;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "start_chunk:%ui, start_chunk_samples:%ui",[m
[31m-                       trak->start_chunk, trak->start_chunk_samples);[m
[31m-[m
[31m-    } else {[m
[31m-        if (start_sample) {[m
[31m-            data->last = (u_char *) (entry + 1);[m
[31m-            trak->sample_to_chunk_entries -= entries - 1;[m
[31m-            trak->end_chunk_samples = samples;[m
[31m-[m
[31m-        } else {[m
[31m-            data->last = (u_char *) entry;[m
[31m-            trak->sample_to_chunk_entries -= entries;[m
[31m-            trak->end_chunk_samples = prev_samples;[m
[31m-        }[m
[31m-[m
[31m-        if (chunk_samples) {[m
[31m-            trak->end_chunk = target_chunk + 1;[m
[31m-            trak->end_chunk_samples = chunk_samples;[m
[31m-[m
[31m-        } else {[m
[31m-            trak->end_chunk = target_chunk;[m
[31m-        }[m
[31m-[m
[31m-        samples = chunk_samples;[m
[31m-        next_chunk = chunk + 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "end_chunk:%ui, end_chunk_samples:%ui",[m
[31m-                       trak->end_chunk, trak->end_chunk_samples);[m
[31m-    }[m
[31m-[m
[31m-    if (chunk_samples && next_chunk - target_chunk == 2) {[m
[31m-[m
[31m-        ngx_mp4_set_32value(entry->samples, samples);[m
[31m-[m
[31m-    } else if (chunk_samples && start) {[m
[31m-[m
[31m-        first = &trak->stsc_start_chunk_entry;[m
[31m-        ngx_mp4_set_32value(first->chunk, 1);[m
[31m-        ngx_mp4_set_32value(first->samples, samples);[m
[31m-        ngx_mp4_set_32value(first->id, id);[m
[31m-[m
[31m-        buf = &trak->stsc_start_chunk_buf;[m
[31m-        buf->temporary = 1;[m
[31m-        buf->pos = (u_char *) first;[m
[31m-        buf->last = (u_char *) first + sizeof(ngx_mp4_stsc_entry_t);[m
[31m-[m
[31m-        trak->out[NGX_HTTP_MP4_STSC_START].buf = buf;[m
[31m-[m
[31m-        ngx_mp4_set_32value(entry->chunk, trak->start_chunk + 2);[m
[31m-[m
[31m-        trak->sample_to_chunk_entries++;[m
[31m-[m
[31m-    } else if (chunk_samples) {[m
[31m-[m
[31m-        first = &trak->stsc_end_chunk_entry;[m
[31m-        ngx_mp4_set_32value(first->chunk, trak->end_chunk - trak->start_chunk);[m
[31m-        ngx_mp4_set_32value(first->samples, samples);[m
[31m-        ngx_mp4_set_32value(first->id, id);[m
[31m-[m
[31m-        buf = &trak->stsc_end_chunk_buf;[m
[31m-        buf->temporary = 1;[m
[31m-        buf->pos = (u_char *) first;[m
[31m-        buf->last = (u_char *) first + sizeof(ngx_mp4_stsc_entry_t);[m
[31m-[m
[31m-        trak->out[NGX_HTTP_MP4_STSC_END].buf = buf;[m
[31m-[m
[31m-        trak->sample_to_chunk_entries++;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    uniform_size[4];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_stsz_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    size_t                atom_size;[m
[31m-    uint32_t              entries, size;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stsz_atom_t  *stsz_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* sample sizes atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsz atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stsz_atom = (ngx_mp4_stsz_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stsz_atom, 's', 't', 's', 'z');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stsz_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stsz atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = ngx_mp4_get_32value(stsz_atom->uniform_size);[m
[31m-    entries = ngx_mp4_get_32value(stsz_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample uniform size:%uD, entries:%uD", size, entries);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->sample_sizes_entries = entries;[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_stsz_atom_t);[m
[31m-[m
[31m-    atom = &trak->stsz_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf = atom;[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        if (ngx_mp4_atom_data_size(ngx_mp4_stsz_atom_t)[m
[31m-            + entries * sizeof(uint32_t) > atom_data_size)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 stsz atom too small",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        atom_end = atom_table + entries * sizeof(uint32_t);[m
[31m-[m
[31m-        data = &trak->stsz_data_buf;[m
[31m-        data->temporary = 1;[m
[31m-        data->pos = atom_table;[m
[31m-        data->last = atom_end;[m
[31m-[m
[31m-        trak->out[NGX_HTTP_MP4_STSZ_DATA].buf = data;[m
[31m-[m
[31m-    } else {[m
[31m-        /* if size != 0 then all samples are the same size */[m
[31m-        /* TODO : chunk samples */[m
[31m-        atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-        ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-        trak->size += atom_size;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stsz_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    uint32_t             *pos, *end, entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stsz_atom_t  *stsz_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stsz updating requires trak->start_sample[m
[31m-     * from mdia.minf.stbl.stts which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stsz atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSZ_DATA].buf;[m
[31m-[m
[31m-    if (data) {[m
[31m-        entries = trak->sample_sizes_entries;[m
[31m-[m
[31m-        if (trak->start_sample > entries) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "start time is out mp4 stsz samples in \"%s\"",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        entries -= trak->start_sample;[m
[31m-        data->pos += trak->start_sample * sizeof(uint32_t);[m
[31m-        end = (uint32_t *) data->pos;[m
[31m-[m
[31m-        for (pos = end - trak->start_chunk_samples; pos < end; pos++) {[m
[31m-            trak->start_chunk_samples_size += ngx_mp4_get_32value(pos);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "chunk samples sizes:%uL",[m
[31m-                       trak->start_chunk_samples_size);[m
[31m-[m
[31m-        if (mp4->length) {[m
[31m-            if (trak->end_sample - trak->start_sample > entries) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                              "end time is out mp4 stsz samples in \"%s\"",[m
[31m-                              mp4->file.name.data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            entries = trak->end_sample - trak->start_sample;[m
[31m-            data->last = data->pos + entries * sizeof(uint32_t);[m
[31m-            end = (uint32_t *) data->last;[m
[31m-[m
[31m-            for (pos = end - trak->end_chunk_samples; pos < end; pos++) {[m
[31m-                trak->end_chunk_samples_size += ngx_mp4_get_32value(pos);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                           "mp4 stsz end_chunk_samples_size:%uL",[m
[31m-                           trak->end_chunk_samples_size);[m
[31m-        }[m
[31m-[m
[31m-        atom_size = sizeof(ngx_mp4_stsz_atom_t) + (data->last - data->pos);[m
[31m-        trak->size += atom_size;[m
[31m-[m
[31m-        atom = trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf;[m
[31m-        stsz_atom = (ngx_mp4_stsz_atom_t *) atom->pos;[m
[31m-[m
[31m-        ngx_mp4_set_32value(stsz_atom->size, atom_size);[m
[31m-        ngx_mp4_set_32value(stsz_atom->entries, entries);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_stco_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stco_atom_t  *stco_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* chunk offsets atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stco atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stco_atom = (ngx_mp4_stco_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stco_atom, 's', 't', 'c', 'o');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stco_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stco atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(stco_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "chunks:%uD", entries);[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stco_atom_t)[m
[31m-        + entries * sizeof(uint32_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stco atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_stco_atom_t);[m
[31m-    atom_end = atom_table + entries * sizeof(uint32_t);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->chunks = entries;[m
[31m-[m
[31m-    atom = &trak->stco_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    data = &trak->stco_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STCO_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_STCO_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stco_atom_t  *stco_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stco updating requires trak->start_chunk[m
[31m-     * from mdia.minf.stbl.stsc which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stco atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 stco atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (trak->start_chunk > trak->chunks) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "start time is out mp4 stco chunks in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    data->pos += trak->start_chunk * sizeof(uint32_t);[m
[31m-[m
[31m-    trak->start_offset = ngx_mp4_get_32value(data->pos);[m
[31m-    trak->start_offset += trak->start_chunk_samples_size;[m
[31m-    ngx_mp4_set_32value(data->pos, trak->start_offset);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "start chunk offset:%O", trak->start_offset);[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-[m
[31m-        if (trak->end_chunk > trak->chunks) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "end time is out mp4 stco chunks in \"%s\"",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        entries = trak->end_chunk - trak->start_chunk;[m
[31m-        data->last = data->pos + entries * sizeof(uint32_t);[m
[31m-[m
[31m-        if (entries) {[m
[31m-            trak->end_offset =[m
[31m-                            ngx_mp4_get_32value(data->last - sizeof(uint32_t));[m
[31m-            trak->end_offset += trak->end_chunk_samples_size;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                           "end chunk offset:%O", trak->end_offset);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        entries = trak->chunks - trak->start_chunk;[m
[31m-        trak->end_offset = mp4->mdat_data.buf->file_last;[m
[31m-    }[m
[31m-[m
[31m-    if (entries == 0) {[m
[31m-        trak->start_offset = mp4->end;[m
[31m-        trak->end_offset = 0;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_stco_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_STCO_ATOM].buf;[m
[31m-    stco_atom = (ngx_mp4_stco_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(stco_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(stco_atom->entries, entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_adjust_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, int32_t adjustment)[m
[31m-{[m
[31m-    uint32_t    offset, *entry, *end;[m
[31m-    ngx_buf_t  *data;[m
[31m-[m
[31m-    /*[m
[31m-     * moov.trak.mdia.minf.stbl.stco adjustment requires[m
[31m-     * minimal start offset of all traks and new moov atom size[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stco atom adjustment");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf;[m
[31m-    entry = (uint32_t *) data->pos;[m
[31m-    end = (uint32_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        offset = ngx_mp4_get_32value(entry);[m
[31m-        offset += adjustment;[m
[31m-        ngx_mp4_set_32value(entry, offset);[m
[31m-        entry++;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_co64_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_co64_atom_t  *co64_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* chunk offsets atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 co64 atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    co64_atom = (ngx_mp4_co64_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(co64_atom, 'c', 'o', '6', '4');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_co64_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 co64 atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(co64_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "chunks:%uD", entries);[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_co64_atom_t)[m
[31m-        + entries * sizeof(uint64_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 co64 atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_co64_atom_t);[m
[31m-    atom_end = atom_table + entries * sizeof(uint64_t);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->chunks = entries;[m
[31m-[m
[31m-    atom = &trak->co64_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    data = &trak->co64_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_CO64_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_CO64_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    uint64_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_co64_atom_t  *co64_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.co64 updating requires trak->start_chunk[m
[31m-     * from mdia.minf.stbl.stsc which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 co64 atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 co64 atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (trak->start_chunk > trak->chunks) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "start time is out mp4 co64 chunks in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    data->pos += trak->start_chunk * sizeof(uint64_t);[m
[31m-[m
[31m-    trak->start_offset = ngx_mp4_get_64value(data->pos);[m
[31m-    trak->start_offset += trak->start_chunk_samples_size;[m
[31m-    ngx_mp4_set_64value(data->pos, trak->start_offset);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "start chunk offset:%O", trak->start_offset);[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-[m
[31m-        if (trak->end_chunk > trak->chunks) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "end time is out mp4 co64 chunks in \"%s\"",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        entries = trak->end_chunk - trak->start_chunk;[m
[31m-        data->last = data->pos + entries * sizeof(uint64_t);[m
[31m-[m
[31m-        if (entries) {[m
[31m-            trak->end_offset =[m
[31m-                            ngx_mp4_get_64value(data->last - sizeof(uint64_t));[m
[31m-            trak->end_offset += trak->end_chunk_samples_size;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                           "end chunk offset:%O", trak->end_offset);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        entries = trak->chunks - trak->start_chunk;[m
[31m-        trak->end_offset = mp4->mdat_data.buf->file_last;[m
[31m-    }[m
[31m-[m
[31m-    if (entries == 0) {[m
[31m-        trak->start_offset = mp4->end;[m
[31m-        trak->end_offset = 0;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_co64_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_CO64_ATOM].buf;[m
[31m-    co64_atom = (ngx_mp4_co64_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(co64_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(co64_atom->entries, entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_adjust_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, off_t adjustment)[m
[31m-{[m
[31m-    uint64_t    offset, *entry, *end;[m
[31m-    ngx_buf_t  *data;[m
[31m-[m
[31m-    /*[m
[31m-     * moov.trak.mdia.minf.stbl.co64 adjustment requires[m
[31m-     * minimal start offset of all traks and new moov atom size[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 co64 atom adjustment");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf;[m
[31m-    entry = (uint64_t *) data->pos;[m
[31m-    end = (uint64_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        offset = ngx_mp4_get_64value(entry);[m
[31m-        offset += adjustment;[m
[31m-        ngx_mp4_set_64value(entry, offset);[m
[31m-        entry++;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_mp4(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_mp4_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_mp4_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_mp4_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_mp4_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->max_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_mp4_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_mp4_conf_t *prev = parent;[m
[31m-    ngx_http_mp4_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size, 512 * 1024);[m
[31m-    ngx_conf_merge_size_value(conf->max_buffer_size, prev->max_buffer_size,[m
[31m-                              10 * 1024 * 1024);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_not_modified_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_not_modified_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 032ba96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_not_modified_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,266 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t ngx_http_test_if_unmodified(ngx_http_request_t *r);[m
[31m-static ngx_uint_t ngx_http_test_if_modified(ngx_http_request_t *r);[m
[31m-static ngx_uint_t ngx_http_test_if_match(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *header, ngx_uint_t weak);[m
[31m-static ngx_int_t ngx_http_not_modified_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_not_modified_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_not_modified_filter_init,     /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_not_modified_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_not_modified_filter_module_ctx, /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_not_modified_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->headers_out.status != NGX_HTTP_OK[m
[31m-        || r != r->main[m
[31m-        || r->disable_not_modified)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.if_unmodified_since[m
[31m-        && !ngx_http_test_if_unmodified(r))[m
[31m-    {[m
[31m-        return ngx_http_filter_finalize_request(r, NULL,[m
[31m-                                                NGX_HTTP_PRECONDITION_FAILED);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.if_match[m
[31m-        && !ngx_http_test_if_match(r, r->headers_in.if_match, 0))[m
[31m-    {[m
[31m-        return ngx_http_filter_finalize_request(r, NULL,[m
[31m-                                                NGX_HTTP_PRECONDITION_FAILED);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.if_modified_since || r->headers_in.if_none_match) {[m
[31m-[m
[31m-        if (r->headers_in.if_modified_since[m
[31m-            && ngx_http_test_if_modified(r))[m
[31m-        {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_in.if_none_match[m
[31m-            && !ngx_http_test_if_match(r, r->headers_in.if_none_match, 1))[m
[31m-        {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        /* not modified */[m
[31m-[m
[31m-        r->headers_out.status = NGX_HTTP_NOT_MODIFIED;[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-        r->headers_out.content_type.len = 0;[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-        ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-        if (r->headers_out.content_encoding) {[m
[31m-            r->headers_out.content_encoding->hash = 0;[m
[31m-            r->headers_out.content_encoding = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_test_if_unmodified(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t  iums;[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time == (time_t) -1) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    iums = ngx_parse_http_time(r->headers_in.if_unmodified_since->value.data,[m
[31m-                               r->headers_in.if_unmodified_since->value.len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                 "http iums:%T lm:%T", iums, r->headers_out.last_modified_time);[m
[31m-[m
[31m-    if (iums >= r->headers_out.last_modified_time) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_test_if_modified(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                     ims;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time == (time_t) -1) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->if_modified_since == NGX_HTTP_IMS_OFF) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ims = ngx_parse_http_time(r->headers_in.if_modified_since->value.data,[m
[31m-                              r->headers_in.if_modified_since->value.len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http ims:%T lm:%T", ims, r->headers_out.last_modified_time);[m
[31m-[m
[31m-    if (ims == r->headers_out.last_modified_time) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->if_modified_since == NGX_HTTP_IMS_EXACT[m
[31m-        || ims < r->headers_out.last_modified_time)[m
[31m-    {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_test_if_match(ngx_http_request_t *r, ngx_table_elt_t *header,[m
[31m-    ngx_uint_t weak)[m
[31m-{[m
[31m-    u_char     *start, *end, ch;[m
[31m-    ngx_str_t   etag, *list;[m
[31m-[m
[31m-    list = &header->value;[m
[31m-[m
[31m-    if (list->len == 1 && list->data[0] == '*') {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.etag == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    etag = r->headers_out.etag->value;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http im:\"%V\" etag:%V", list, &etag);[m
[31m-[m
[31m-    if (weak[m
[31m-        && etag.len > 2[m
[31m-        && etag.data[0] == 'W'[m
[31m-        && etag.data[1] == '/')[m
[31m-    {[m
[31m-        etag.len -= 2;[m
[31m-        etag.data += 2;[m
[31m-    }[m
[31m-[m
[31m-    start = list->data;[m
[31m-    end = list->data + list->len;[m
[31m-[m
[31m-    while (start < end) {[m
[31m-[m
[31m-        if (weak[m
[31m-            && end - start > 2[m
[31m-            && start[0] == 'W'[m
[31m-            && start[1] == '/')[m
[31m-        {[m
[31m-            start += 2;[m
[31m-        }[m
[31m-[m
[31m-        if (etag.len > (size_t) (end - start)) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(start, etag.data, etag.len) != 0) {[m
[31m-            goto skip;[m
[31m-        }[m
[31m-[m
[31m-        start += etag.len;[m
[31m-[m
[31m-        while (start < end) {[m
[31m-            ch = *start;[m
[31m-[m
[31m-            if (ch == ' ' || ch == '\t') {[m
[31m-                start++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (start == end || *start == ',') {[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-    skip:[m
[31m-[m
[31m-        while (start < end && *start != ',') { start++; }[m
[31m-        while (start < end) {[m
[31m-            ch = *start;[m
[31m-[m
[31m-            if (ch == ' ' || ch == '\t' || ch == ',') {[m
[31m-                start++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_not_modified_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_not_modified_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c[m
[1mdeleted file mode 100644[m
[1mindex 826f54d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,4393 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_proxy_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_proxy_rewrite_s  ngx_http_proxy_rewrite_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len,[m
[31m-    ngx_http_proxy_rewrite_t *pr);[m
[31m-[m
[31m-struct ngx_http_proxy_rewrite_s {[m
[31m-    ngx_http_proxy_rewrite_pt      handler;[m
[31m-[m
[31m-    union {[m
[31m-        ngx_http_complex_value_t   complex;[m
[31m-#if (NGX_PCRE)[m
[31m-        ngx_http_regex_t          *regex;[m
[31m-#endif[m
[31m-    } pattern;[m
[31m-[m
[31m-    ngx_http_complex_value_t       replacement;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                      key_start;[m
[31m-    ngx_str_t                      schema;[m
[31m-    ngx_str_t                      host_header;[m
[31m-    ngx_str_t                      port;[m
[31m-    ngx_str_t                      uri;[m
[31m-} ngx_http_proxy_vars_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                   *flushes;[m
[31m-    ngx_array_t                   *lengths;[m
[31m-    ngx_array_t                   *values;[m
[31m-    ngx_hash_t                     hash;[m
[31m-} ngx_http_proxy_headers_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t       upstream;[m
[31m-[m
[31m-    ngx_array_t                   *body_flushes;[m
[31m-    ngx_array_t                   *body_lengths;[m
[31m-    ngx_array_t                   *body_values;[m
[31m-    ngx_str_t                      body_source;[m
[31m-[m
[31m-    ngx_http_proxy_headers_t       headers;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_proxy_headers_t       headers_cache;[m
[31m-#endif[m
[31m-    ngx_array_t                   *headers_source;[m
[31m-[m
[31m-    ngx_array_t                   *proxy_lengths;[m
[31m-    ngx_array_t                   *proxy_values;[m
[31m-[m
[31m-    ngx_array_t                   *redirects;[m
[31m-    ngx_array_t                   *cookie_domains;[m
[31m-    ngx_array_t                   *cookie_paths;[m
[31m-[m
[31m-    ngx_str_t                      method;[m
[31m-    ngx_str_t                      location;[m
[31m-    ngx_str_t                      url;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t       cache_key;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_proxy_vars_t          vars;[m
[31m-[m
[31m-    ngx_flag_t                     redirect;[m
[31m-[m
[31m-    ngx_uint_t                     http_version;[m
[31m-[m
[31m-    ngx_uint_t                     headers_hash_max_size;[m
[31m-    ngx_uint_t                     headers_hash_bucket_size;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_uint_t                     ssl;[m
[31m-    ngx_uint_t                     ssl_protocols;[m
[31m-    ngx_str_t                      ssl_ciphers;[m
[31m-    ngx_uint_t                     ssl_verify_depth;[m
[31m-    ngx_str_t                      ssl_trusted_certificate;[m
[31m-    ngx_str_t                      ssl_crl;[m
[31m-    ngx_str_t                      ssl_certificate;[m
[31m-    ngx_str_t                      ssl_certificate_key;[m
[31m-    ngx_array_t                   *ssl_passwords;[m
[31m-#endif[m
[31m-} ngx_http_proxy_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_status_t              status;[m
[31m-    ngx_http_chunked_t             chunked;[m
[31m-    ngx_http_proxy_vars_t          vars;[m
[31m-    off_t                          internal_body_length;[m
[31m-[m
[31m-    ngx_chain_t                   *free;[m
[31m-    ngx_chain_t                   *busy;[m
[31m-[m
[31m-    unsigned                       head:1;[m
[31m-    unsigned                       internal_chunked:1;[m
[31m-    unsigned                       header_sent:1;[m
[31m-} ngx_http_proxy_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_proxy_ctx_t *ctx, ngx_http_proxy_loc_conf_t *plcf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_proxy_create_key(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_proxy_process_status_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_input_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_proxy_copy_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_proxy_non_buffered_copy_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_proxy_non_buffered_chunked_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static void ngx_http_proxy_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_proxy_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, u_char *value, ngx_array_t *rewrites);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_str_t *replacement);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers,[m
[31m-    ngx_keyval_t *default_headers);[m
[31m-[m
[31m-static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static char *ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static char *ngx_http_proxy_ssl_password_file(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_regex(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_rewrite_t *pr, ngx_str_t *regex, ngx_uint_t caseless);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_proxy_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_loc_conf_t *plcf);[m
[31m-#endif[m
[31m-static void ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_proxy_lowat_post =[m
[31m-    { ngx_http_proxy_lowat_check };[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_proxy_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_proxy_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_proxy_http_version[] = {[m
[31m-    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },[m
[31m-    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_proxy_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_proxy_commands[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_redirect,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cookie_domain"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_cookie_domain,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cookie_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_cookie_path,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_lowat),[m
[31m-      &ngx_http_proxy_lowat_post },[m
[31m-[m
[31m-    { ngx_string("proxy_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_set_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_keyval_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_headers_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_headers_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_set_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, body_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_method"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, method),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("proxy_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_main_conf_t, caches),[m
[31m-      &ngx_http_proxy_module },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_proxy_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_convert_head"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_convert_head),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("proxy_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_proxy_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_http_version"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, http_version),[m
[31m-      &ngx_http_proxy_http_version },[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_session_reuse"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_session_reuse),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_protocols),[m
[31m-      &ngx_http_proxy_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_server_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_password_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_ssl_password_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_proxy_module_ctx = {[m
[31m-    ngx_http_proxy_add_variables,          /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_proxy_create_main_conf,       /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_proxy_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_proxy_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_proxy_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_proxy_module_ctx,            /* module context */[m
[31m-    ngx_http_proxy_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char  ngx_http_proxy_version[] = " HTTP/1.0" CRLF;[m
[31m-static char  ngx_http_proxy_version_11[] = " HTTP/1.1" CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_proxy_headers[] = {[m
[31m-    { ngx_string("Host"), ngx_string("$proxy_host") },[m
[31m-    { ngx_string("Connection"), ngx_string("close") },[m
[31m-    { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },[m
[31m-    { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },[m
[31m-    { ngx_string("TE"), ngx_string("") },[m
[31m-    { ngx_string("Keep-Alive"), ngx_string("") },[m
[31m-    { ngx_string("Expect"), ngx_string("") },[m
[31m-    { ngx_string("Upgrade"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_proxy_hide_headers[] = {[m
[31m-    ngx_string("Date"),[m
[31m-    ngx_string("Server"),[m
[31m-    ngx_string("X-Pad"),[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_proxy_cache_headers[] = {[m
[31m-    { ngx_string("Host"), ngx_string("$proxy_host") },[m
[31m-    { ngx_string("Connection"), ngx_string("close") },[m
[31m-    { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },[m
[31m-    { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },[m
[31m-    { ngx_string("TE"), ngx_string("") },[m
[31m-    { ngx_string("Keep-Alive"), ngx_string("") },[m
[31m-    { ngx_string("Expect"), ngx_string("") },[m
[31m-    { ngx_string("Upgrade"), ngx_string("") },[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("If-Unmodified-Since"), ngx_string("") },[m
[31m-    { ngx_string("If-None-Match"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("If-Match"), ngx_string("") },[m
[31m-    { ngx_string("Range"), ngx_string("") },[m
[31m-    { ngx_string("If-Range"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_proxy_vars[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_host"), NULL, ngx_http_proxy_host_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_port"), NULL, ngx_http_proxy_port_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_add_x_forwarded_for"), NULL,[m
[31m-      ngx_http_proxy_add_x_forwarded_for_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-#if 0[m
[31m-    { ngx_string("proxy_add_via"), NULL, NULL, 0, NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("proxy_internal_body_length"), NULL,[m
[31m-      ngx_http_proxy_internal_body_length_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_internal_chunked"), NULL,[m
[31m-      ngx_http_proxy_internal_chunked_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_proxy_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_PROXY_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-    ngx_http_proxy_ctx_t        *ctx;[m
[31m-    ngx_http_proxy_loc_conf_t   *plcf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_proxy_main_conf_t  *pmcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_proxy_module);[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (plcf->proxy_lengths == NULL) {[m
[31m-        ctx->vars = plcf->vars;[m
[31m-        u->schema = plcf->vars.schema;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl = (plcf->upstream.ssl != NULL);[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_proxy_eval(r, ctx, plcf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_proxy_module;[m
[31m-[m
[31m-    u->conf = &plcf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    u->caches = &pmcf->caches;[m
[31m-    u->create_key = ngx_http_proxy_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_proxy_create_request;[m
[31m-    u->reinit_request = ngx_http_proxy_reinit_request;[m
[31m-    u->process_header = ngx_http_proxy_process_status_line;[m
[31m-    u->abort_request = ngx_http_proxy_abort_request;[m
[31m-    u->finalize_request = ngx_http_proxy_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    if (plcf->redirects) {[m
[31m-        u->rewrite_redirect = ngx_http_proxy_rewrite_redirect;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_domains || plcf->cookie_paths) {[m
[31m-        u->rewrite_cookie = ngx_http_proxy_rewrite_cookie;[m
[31m-    }[m
[31m-[m
[31m-    u->buffering = plcf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_http_proxy_copy_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_proxy_input_filter_init;[m
[31m-    u->input_filter = ngx_http_proxy_non_buffered_copy_filter;[m
[31m-    u->input_filter_ctx = r;[m
[31m-[m
[31m-    u->accel = 1;[m
[31m-[m
[31m-    if (!plcf->upstream.request_buffering[m
[31m-        && plcf->body_values == NULL && plcf->upstream.pass_request_body[m
[31m-        && (!r->headers_in.chunked[m
[31m-            || plcf->http_version == NGX_HTTP_VERSION_11))[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx,[m
[31m-    ngx_http_proxy_loc_conf_t *plcf)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    size_t                add;[m
[31m-    u_short               port;[m
[31m-    ngx_str_t             proxy;[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &proxy, plcf->proxy_lengths->elts, 0,[m
[31m-                            plcf->proxy_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (proxy.len > 7[m
[31m-        && ngx_strncasecmp(proxy.data, (u_char *) "http://", 7) == 0)[m
[31m-    {[m
[31m-        add = 7;[m
[31m-        port = 80;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    } else if (proxy.len > 8[m
[31m-               && ngx_strncasecmp(proxy.data, (u_char *) "https://", 8) == 0)[m
[31m-    {[m
[31m-        add = 8;[m
[31m-        port = 443;[m
[31m-        r->upstream->ssl = 1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid URL prefix in \"%V\"", &proxy);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->schema.len = add;[m
[31m-    u->schema.data = proxy.data;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.len = proxy.len - add;[m
[31m-    url.url.data = proxy.data + add;[m
[31m-    url.default_port = port;[m
[31m-    url.uri_part = 1;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.uri.len) {[m
[31m-        if (url.uri.data[0] == '?') {[m
[31m-            p = ngx_pnalloc(r->pool, url.uri.len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *p++ = '/';[m
[31m-            ngx_memcpy(p, url.uri.data, url.uri.len);[m
[31m-[m
[31m-            url.uri.len++;[m
[31m-            url.uri.data = p - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->vars.key_start = u->schema;[m
[31m-[m
[31m-    ngx_http_proxy_set_vars(&url, &ctx->vars);[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = (in_port_t) (url.no_port ? port : url.port);[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                      len, loc_len;[m
[31m-    u_char                     *p;[m
[31m-    uintptr_t                   escape;[m
[31m-    ngx_str_t                  *key;[m
[31m-    ngx_http_upstream_t        *u;[m
[31m-    ngx_http_proxy_ctx_t       *ctx;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cache_key.value.data) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &plcf->cache_key, key) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *key = ctx->vars.key_start;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-[m
[31m-        *key = ctx->vars.uri;[m
[31m-        u->uri = ctx->vars.uri;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)[m
[31m-    {[m
[31m-        *key = r->unparsed_uri;[m
[31m-        u->uri = r->unparsed_uri;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    loc_len = (r->valid_location && ctx->vars.uri.len) ? plcf->location.len : 0;[m
[31m-[m
[31m-    if (r->quoted_uri || r->internal) {[m
[31m-        escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,[m
[31m-                                    r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-    } else {[m
[31m-        escape = 0;[m
[31m-    }[m
[31m-[m
[31m-    len = ctx->vars.uri.len + r->uri.len - loc_len + escape[m
[31m-          + sizeof("?") - 1 + r->args.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    key->data = p;[m
[31m-[m
[31m-    if (r->valid_location) {[m
[31m-        p = ngx_copy(p, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-    }[m
[31m-[m
[31m-    if (escape) {[m
[31m-        ngx_escape_uri(p, r->uri.data + loc_len,[m
[31m-                       r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-        p += r->uri.len - loc_len + escape;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_copy(p, r->uri.data + loc_len, r->uri.len - loc_len);[m
[31m-    }[m
[31m-[m
[31m-    if (r->args.len > 0) {[m
[31m-        *p++ = '?';[m
[31m-        p = ngx_copy(p, r->args.data, r->args.len);[m
[31m-    }[m
[31m-[m
[31m-    key->len = p - key->data;[m
[31m-    u->uri = *key;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                        len, uri_len, loc_len, body_len;[m
[31m-    uintptr_t                     escape;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_str_t                     method;[m
[31m-    ngx_uint_t                    i, unparsed_uri;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header;[m
[31m-    ngx_http_upstream_t          *u;[m
[31m-    ngx_http_proxy_ctx_t         *ctx;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_proxy_headers_t     *headers;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_proxy_loc_conf_t    *plcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    headers = u->cacheable ? &plcf->headers_cache : &plcf->headers;[m
[31m-#else[m
[31m-    headers = &plcf->headers;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->method.len) {[m
[31m-        /* HEAD was changed to GET to cache response */[m
[31m-        method = u->method;[m
[31m-[m
[31m-    } else if (plcf->method.len) {[m
[31m-        method = plcf->method;[m
[31m-[m
[31m-    } else {[m
[31m-        method = r->method_name;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (method.len == 4[m
[31m-        && ngx_strncasecmp(method.data, (u_char *) "HEAD", 4) == 0)[m
[31m-    {[m
[31m-        ctx->head = 1;[m
[31m-    }[m
[31m-[m
[31m-    len = method.len + 1 + sizeof(ngx_http_proxy_version) - 1[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    escape = 0;[m
[31m-    loc_len = 0;[m
[31m-    unparsed_uri = 0;[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-        uri_len = ctx->vars.uri.len;[m
[31m-[m
[31m-    } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)[m
[31m-    {[m
[31m-        unparsed_uri = 1;[m
[31m-        uri_len = r->unparsed_uri.len;[m
[31m-[m
[31m-    } else {[m
[31m-        loc_len = (r->valid_location && ctx->vars.uri.len) ?[m
[31m-                      plcf->location.len : 0;[m
[31m-[m
[31m-        if (r->quoted_uri || r->space_in_uri || r->internal) {[m
[31m-            escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,[m
[31m-                                        r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-        }[m
[31m-[m
[31m-        uri_len = ctx->vars.uri.len + r->uri.len - loc_len + escape[m
[31m-                  + sizeof("?") - 1 + r->args.len;[m
[31m-    }[m
[31m-[m
[31m-    if (uri_len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "zero length URI to proxy");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len += uri_len;[m
[31m-[m
[31m-    ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    ngx_http_script_flush_no_cacheable_variables(r, plcf->body_flushes);[m
[31m-    ngx_http_script_flush_no_cacheable_variables(r, headers->flushes);[m
[31m-[m
[31m-    if (plcf->body_lengths) {[m
[31m-        le.ip = plcf->body_lengths->elts;[m
[31m-        le.request = r;[m
[31m-        le.flushed = 1;[m
[31m-        body_len = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            body_len += lcode(&le);[m
[31m-        }[m
[31m-[m
[31m-        ctx->internal_body_length = body_len;[m
[31m-        len += body_len;[m
[31m-[m
[31m-    } else if (r->headers_in.chunked && r->reading_body) {[m
[31m-        ctx->internal_body_length = -1;[m
[31m-        ctx->internal_chunked = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->internal_body_length = r->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    le.ip = headers->lengths->elts;[m
[31m-    le.request = r;[m
[31m-    le.flushed = 1;[m
[31m-[m
[31m-    while (*(uintptr_t *) le.ip) {[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            len += lcode(&le);[m
[31m-        }[m
[31m-        le.ip += sizeof(uintptr_t);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (plcf->upstream.pass_request_headers) {[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_hash_find(&headers->hash, header[i].hash,[m
[31m-                              header[i].lowcase_key, header[i].key.len))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += header[i].key.len + sizeof(": ") - 1[m
[31m-                + header[i].value.len + sizeof(CRLF) - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-[m
[31m-    /* the request line */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, method.data, method.len);[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    u->uri.data = b->last;[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-        b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-[m
[31m-    } else if (unparsed_uri) {[m
[31m-        b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len);[m
[31m-[m
[31m-    } else {[m
[31m-        if (r->valid_location) {[m
[31m-            b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-        }[m
[31m-[m
[31m-        if (escape) {[m
[31m-            ngx_escape_uri(b->last, r->uri.data + loc_len,[m
[31m-                           r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-            b->last += r->uri.len - loc_len + escape;[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_copy(b->last, r->uri.data + loc_len,[m
[31m-                               r->uri.len - loc_len);[m
[31m-        }[m
[31m-[m
[31m-        if (r->args.len > 0) {[m
[31m-            *b->last++ = '?';[m
[31m-            b->last = ngx_copy(b->last, r->args.data, r->args.len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->uri.len = b->last - u->uri.data;[m
[31m-[m
[31m-    if (plcf->http_version == NGX_HTTP_VERSION_11) {[m
[31m-        b->last = ngx_cpymem(b->last, ngx_http_proxy_version_11,[m
[31m-                             sizeof(ngx_http_proxy_version_11) - 1);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, ngx_http_proxy_version,[m
[31m-                             sizeof(ngx_http_proxy_version) - 1);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    e.ip = headers->values->elts;[m
[31m-    e.pos = b->last;[m
[31m-    e.request = r;[m
[31m-    e.flushed = 1;[m
[31m-[m
[31m-    le.ip = headers->lengths->elts;[m
[31m-[m
[31m-    while (*(uintptr_t *) le.ip) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-[m
[31m-        /* skip the header line name length */[m
[31m-        (void) lcode(&le);[m
[31m-[m
[31m-        if (*(ngx_http_script_len_code_pt *) le.ip) {[m
[31m-[m
[31m-            for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-[m
[31m-            e.skip = (len == sizeof(CRLF) - 1) ? 1 : 0;[m
[31m-[m
[31m-        } else {[m
[31m-            e.skip = 0;[m
[31m-        }[m
[31m-[m
[31m-        le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-        while (*(uintptr_t *) e.ip) {[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) &e);[m
[31m-        }[m
[31m-        e.ip += sizeof(uintptr_t);[m
[31m-    }[m
[31m-[m
[31m-    b->last = e.pos;[m
[31m-[m
[31m-[m
[31m-    if (plcf->upstream.pass_request_headers) {[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_hash_find(&headers->hash, header[i].hash,[m
[31m-                              header[i].lowcase_key, header[i].key.len))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-            *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].value.data,[m
[31m-                               header[i].value.len);[m
[31m-[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header: \"%V: %V\"",[m
[31m-                           &header[i].key, &header[i].value);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* add "\r\n" at the header end */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (plcf->body_values) {[m
[31m-        e.ip = plcf->body_values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.skip = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) e.ip) {[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) &e);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy header:%N\"%*s\"",[m
[31m-                   (size_t) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        if (ctx->internal_chunked) {[m
[31m-            u->output.output_filter = ngx_http_proxy_body_output_filter;[m
[31m-            u->output.filter_ctx = r;[m
[31m-        }[m
[31m-[m
[31m-    } else if (plcf->body_values == NULL && plcf->upstream.pass_request_body) {[m
[31m-[m
[31m-        body = u->request_bufs;[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        while (body) {[m
[31m-            b = ngx_alloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl->next == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl = cl->next;[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        u->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    b->flush = 1;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->status.code = 0;[m
[31m-    ctx->status.count = 0;[m
[31m-    ctx->status.start = NULL;[m
[31m-    ctx->status.end = NULL;[m
[31m-    ctx->chunked.state = 0;[m
[31m-[m
[31m-    r->upstream->process_header = ngx_http_proxy_process_status_line;[m
[31m-    r->upstream->pipe->input_filter = ngx_http_proxy_copy_filter;[m
[31m-    r->upstream->input_filter = ngx_http_proxy_non_buffered_copy_filter;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    off_t                  size;[m
[31m-    u_char                *chunk;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b;[m
[31m-    ngx_chain_t           *out, *cl, *tl, **ll, **fl;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "proxy output filter");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        out = in;[m
[31m-        goto out;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    if (!ctx->header_sent) {[m
[31m-        /* first buffer contains headers, pass it unmodified */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "proxy output header");[m
[31m-[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        tl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tl->buf = in->buf;[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            tl->next = NULL;[m
[31m-            goto out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    cl = in;[m
[31m-    fl = ll;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "proxy output chunk: %O", ngx_buf_size(cl->buf));[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush[m
[31m-            || cl->buf->sync[m
[31m-            || ngx_buf_in_memory(cl->buf)[m
[31m-            || cl->buf->in_file)[m
[31m-        {[m
[31m-            tl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            tl->buf = cl->buf;[m
[31m-            *ll = tl;[m
[31m-            ll = &tl->next;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-        chunk = b->start;[m
[31m-[m
[31m-        if (chunk == NULL) {[m
[31m-            /* the "0000000000000000" is 64-bit hexadecimal string */[m
[31m-[m
[31m-            chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1);[m
[31m-            if (chunk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = chunk;[m
[31m-            b->end = chunk + sizeof("0000000000000000" CRLF) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->memory = 0;[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = chunk;[m
[31m-        b->last = ngx_sprintf(chunk, "%xO" CRLF, size);[m
[31m-[m
[31m-        tl->next = *fl;[m
[31m-        *fl = tl;[m
[31m-    }[m
[31m-[m
[31m-    if (cl->buf->last_buf) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->last_buf = 1;[m
[31m-        b->pos = (u_char *) CRLF "0" CRLF CRLF;[m
[31m-        b->last = b->pos + 7;[m
[31m-[m
[31m-        cl->buf->last_buf = 0;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            b->pos += 2;[m
[31m-        }[m
[31m-[m
[31m-    } else if (size > 0) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->pos = (u_char *) CRLF;[m
[31m-        b->last = b->pos + 2;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-    } else {[m
[31m-        *ll = NULL;[m
[31m-    }[m
[31m-[m
[31m-out:[m
[31m-[m
[31m-    rc = ngx_chain_writer(&r->upstream->writer, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_process_status_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                 len;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, &u->buffer, &ctx->status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (r->cache) {[m
[31m-            r->http_version = NGX_HTTP_VERSION_9;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent no valid HTTP/1.0 header");[m
[31m-[m
[31m-#if 0[m
[31m-        if (u->accel) {[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        r->http_version = NGX_HTTP_VERSION_9;[m
[31m-        u->state->status = NGX_HTTP_OK;[m
[31m-        u->headers_in.connection_close = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->status == 0) {[m
[31m-        u->state->status = ctx->status.code;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = ctx->status.code;[m
[31m-[m
[31m-    len = ctx->status.end - ctx->status.start;[m
[31m-    u->headers_in.status_line.len = len;[m
[31m-[m
[31m-    u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (u->headers_in.status_line.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u->headers_in.status_line.data, ctx->status.start, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy status %ui \"%V\"",[m
[31m-                   u->headers_in.status_n, &u->headers_in.status_line);[m
[31m-[m
[31m-    if (ctx->status.http_version < NGX_HTTP_VERSION_11) {[m
[31m-        u->headers_in.connection_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    u->process_header = ngx_http_proxy_process_header;[m
[31m-[m
[31m-    return ngx_http_proxy_process_header(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_proxy_ctx_t           *ctx;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            h->key.data = ngx_pnalloc(r->pool,[m
[31m-                               h->key.len + 1 + h->value.len + 1 + h->key.len);[m
[31m-            if (h->key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->value.data = h->key.data + h->key.len + 1;[m
[31m-            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;[m
[31m-[m
[31m-            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-            ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header: \"%V: %V\"",[m
[31m-                           &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header done");[m
[31m-[m
[31m-            /*[m
[31m-             * if no "Server" and "Date" in header line,[m
[31m-             * then add the special empty headers[m
[31m-             */[m
[31m-[m
[31m-            if (r->upstream->headers_in.server == NULL) {[m
[31m-                h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash([m
[31m-                                    ngx_hash('s', 'e'), 'r'), 'v'), 'e'), 'r');[m
[31m-[m
[31m-                ngx_str_set(&h->key, "Server");[m
[31m-                ngx_str_null(&h->value);[m
[31m-                h->lowcase_key = (u_char *) "server";[m
[31m-            }[m
[31m-[m
[31m-            if (r->upstream->headers_in.date == NULL) {[m
[31m-                h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                h->hash = ngx_hash(ngx_hash(ngx_hash('d', 'a'), 't'), 'e');[m
[31m-[m
[31m-                ngx_str_set(&h->key, "Date");[m
[31m-                ngx_str_null(&h->value);[m
[31m-                h->lowcase_key = (u_char *) "date";[m
[31m-            }[m
[31m-[m
[31m-            /* clear content length if response is chunked */[m
[31m-[m
[31m-            u = r->upstream;[m
[31m-[m
[31m-            if (u->headers_in.chunked) {[m
[31m-                u->headers_in.content_length_n = -1;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * set u->keepalive if response has no body; this allows to keep[m
[31m-             * connections alive in case of r->header_only or X-Accel-Redirect[m
[31m-             */[m
[31m-[m
[31m-            ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT[m
[31m-                || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED[m
[31m-                || ctx->head[m
[31m-                || (!u->headers_in.chunked[m
[31m-                    && u->headers_in.content_length_n == 0))[m
[31m-            {[m
[31m-                u->keepalive = !u->headers_in.connection_close;[m
[31m-            }[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-                u->keepalive = 0;[m
[31m-[m
[31m-                if (r->headers_in.upgrade) {[m
[31m-                    u->upgrade = 1;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid header");[m
[31m-[m
[31m-        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t    *r = data;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy filter init s:%ui h:%d c:%d l:%O",[m
[31m-                   u->headers_in.status_n, ctx->head, u->headers_in.chunked,[m
[31m-                   u->headers_in.content_length_n);[m
[31m-[m
[31m-    /* as per RFC2616, 4.4 Message Length */[m
[31m-[m
[31m-    if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT[m
[31m-        || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED[m
[31m-        || ctx->head)[m
[31m-    {[m
[31m-        /* 1xx, 204, and 304 and replies to HEAD requests */[m
[31m-        /* no 1xx since we don't send Expect and Upgrade */[m
[31m-[m
[31m-        u->pipe->length = 0;[m
[31m-        u->length = 0;[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-[m
[31m-    } else if (u->headers_in.chunked) {[m
[31m-        /* chunked */[m
[31m-[m
[31m-        u->pipe->input_filter = ngx_http_proxy_chunked_filter;[m
[31m-        u->pipe->length = 3; /* "0" LF LF */[m
[31m-[m
[31m-        u->input_filter = ngx_http_proxy_non_buffered_chunked_filter;[m
[31m-        u->length = 1;[m
[31m-[m
[31m-    } else if (u->headers_in.content_length_n == 0) {[m
[31m-        /* empty body: special case as filter won't be called */[m
[31m-[m
[31m-        u->pipe->length = 0;[m
[31m-        u->length = 0;[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-[m
[31m-    } else {[m
[31m-        /* content length or connection close */[m
[31m-[m
[31m-        u->pipe->length = u->headers_in.content_length_n;[m
[31m-        u->length = u->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_buf_t           *b;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    ngx_memcpy(b, buf, sizeof(ngx_buf_t));[m
[31m-    b->shadow = buf;[m
[31m-    b->tag = p->tag;[m
[31m-    b->last_shadow = 1;[m
[31m-    b->recycled = 1;[m
[31m-    buf->shadow = b;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num);[m
[31m-[m
[31m-    if (p->in) {[m
[31m-        *p->last_in = cl;[m
[31m-    } else {[m
[31m-        p->in = cl;[m
[31m-    }[m
[31m-    p->last_in = &cl->next;[m
[31m-[m
[31m-    if (p->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p->length -= b->last - b->pos;[m
[31m-[m
[31m-    if (p->length == 0) {[m
[31m-        r = p->input_ctx;[m
[31m-        p->upstream_done = 1;[m
[31m-        r->upstream->keepalive = !r->upstream->headers_in.connection_close;[m
[31m-[m
[31m-    } else if (p->length < 0) {[m
[31m-        r = p->input_ctx;[m
[31m-        p->upstream_done = 1;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                      "upstream sent more data than specified in "[m
[31m-                      "\"Content-Length\" header");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b, **prev;[m
[31m-    ngx_chain_t           *cl;[m
[31m-    ngx_http_request_t    *r;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r = p->input_ctx;[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = NULL;[m
[31m-    prev = &buf->shadow;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a chunk has been parsed successfully */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->start = buf->start;[m
[31m-            b->end = buf->end;[m
[31m-            b->tag = p->tag;[m
[31m-            b->temporary = 1;[m
[31m-            b->recycled = 1;[m
[31m-[m
[31m-            *prev = b;[m
[31m-            prev = &b->shadow;[m
[31m-[m
[31m-            if (p->in) {[m
[31m-                *p->last_in = cl;[m
[31m-            } else {[m
[31m-                p->in = cl;[m
[31m-            }[m
[31m-            p->last_in = &cl->next;[m
[31m-[m
[31m-            /* STUB */ b->num = buf->num;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "input buf #%d %p", b->num, b->pos);[m
[31m-[m
[31m-            if (buf->last - buf->pos >= ctx->chunked.size) {[m
[31m-[m
[31m-                buf->pos += (size_t) ctx->chunked.size;[m
[31m-                b->last = buf->pos;[m
[31m-                ctx->chunked.size = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ctx->chunked.size -= buf->last - buf->pos;[m
[31m-            buf->pos = buf->last;[m
[31m-            b->last = buf->last;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-[m
[31m-            /* a whole response has been parsed successfully */[m
[31m-[m
[31m-            p->upstream_done = 1;[m
[31m-            r->upstream->keepalive = !r->upstream->headers_in.connection_close;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            /* set p->length, minimal amount of data we want to see */[m
[31m-[m
[31m-            p->length = ctx->chunked.length;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* invalid response */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid chunked response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy chunked state %ui, length %O",[m
[31m-                   ctx->chunked.state, p->length);[m
[31m-[m
[31m-    if (b) {[m
[31m-        b->shadow = buf;[m
[31m-        b->last_shadow = 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "input buf %p %z", b->pos, b->last - b->pos);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* there is no data record in the buf, add it to free chain */[m
[31m-[m
[31m-    if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_non_buffered_copy_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t   *r = data;[m
[31m-[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    cl->buf->pos = b->last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    if (u->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u->length -= bytes;[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_non_buffered_chunked_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t   *r = data;[m
[31m-[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b, *buf;[m
[31m-    ngx_chain_t           *cl, **ll;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    buf = &u->buffer;[m
[31m-[m
[31m-    buf->pos = buf->last;[m
[31m-    buf->last += bytes;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a chunk has been parsed successfully */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            b->flush = 1;[m
[31m-            b->memory = 1;[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->tag = u->output.tag;[m
[31m-[m
[31m-            if (buf->last - buf->pos >= ctx->chunked.size) {[m
[31m-                buf->pos += (size_t) ctx->chunked.size;[m
[31m-                b->last = buf->pos;[m
[31m-                ctx->chunked.size = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->chunked.size -= buf->last - buf->pos;[m
[31m-                buf->pos = buf->last;[m
[31m-                b->last = buf->last;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy out buf %p %z",[m
[31m-                           b->pos, b->last - b->pos);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-[m
[31m-            /* a whole response has been parsed successfully */[m
[31m-[m
[31m-            u->keepalive = !u->headers_in.connection_close;[m
[31m-            u->length = 0;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* invalid response */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid chunked response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* provide continuous buffer for subrequests in memory */[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-[m
[31m-        cl = u->out_bufs;[m
[31m-[m
[31m-        if (cl) {[m
[31m-            buf->pos = cl->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        buf->last = buf->pos;[m
[31m-[m
[31m-        for (cl = u->out_bufs; cl; cl = cl->next) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy in memory %p-%p %O",[m
[31m-                           cl->buf->pos, cl->buf->last, ngx_buf_size(cl->buf));[m
[31m-[m
[31m-            if (buf->last == cl->buf->pos) {[m
[31m-                buf->last = cl->buf->last;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_movemem(buf->last, cl->buf->pos,[m
[31m-                                    cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-            cl->buf->pos = buf->last - (cl->buf->last - cl->buf->pos);[m
[31m-            cl->buf->last = buf->last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http proxy request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http proxy request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_host_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ctx->vars.host_header.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ctx->vars.host_header.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_port_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ctx->vars.port.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ctx->vars.port.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t             len;[m
[31m-    u_char            *p;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    n = r->headers_in.x_forwarded_for.nelts;[m
[31m-    h = r->headers_in.x_forwarded_for.elts;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        len += h[i]->value.len + sizeof(", ") - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        v->len = r->connection->addr_text.len;[m
[31m-        v->data = r->connection->addr_text.data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len += r->connection->addr_text.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        p = ngx_copy(p, h[i]->value.data, h[i]->value.len);[m
[31m-        *p++ = ','; *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, r->connection->addr_text.data, r->connection->addr_text.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->internal_body_length < 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%O", ctx->internal_body_length) - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL || !ctx->internal_chunked) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = (u_char *) "chunked";[m
[31m-    v->len = sizeof("chunked") - 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    size_t prefix)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_proxy_rewrite_t   *pr;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    pr = plcf->redirects->elts;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    len = h->value.len - prefix;[m
[31m-[m
[31m-    for (i = 0; i < plcf->redirects->nelts; i++) {[m
[31m-        rc = pr[i].handler(r, h, prefix, len, &pr[i]);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r, ngx_table_elt_t *h)[m
[31m-{[m
[31m-    size_t                      prefix;[m
[31m-    u_char                     *p;[m
[31m-    ngx_int_t                   rc, rv;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    p = (u_char *) ngx_strchr(h->value.data, ';');[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    prefix = p + 1 - h->value.data;[m
[31m-[m
[31m-    rv = NGX_DECLINED;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (plcf->cookie_domains) {[m
[31m-        p = ngx_strcasestrn(h->value.data + prefix, "domain=", 7 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 7,[m
[31m-                                                     plcf->cookie_domains);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                rv = rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_paths) {[m
[31m-        p = ngx_strcasestrn(h->value.data + prefix, "path=", 5 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 5,[m
[31m-                                                     plcf->cookie_paths);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                rv = rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    u_char *value, ngx_array_t *rewrites)[m
[31m-{[m
[31m-    size_t                     len, prefix;[m
[31m-    u_char                    *p;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_proxy_rewrite_t  *pr;[m
[31m-[m
[31m-    prefix = value - h->value.data;[m
[31m-[m
[31m-    p = (u_char *) ngx_strchr(value, ';');[m
[31m-[m
[31m-    len = p ? (size_t) (p - value) : (h->value.len - prefix);[m
[31m-[m
[31m-    pr = rewrites->elts;[m
[31m-[m
[31m-    for (i = 0; i < rewrites->nelts; i++) {[m
[31m-        rc = pr[i].handler(r, h, prefix, len, &pr[i]);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    ngx_str_t  pattern, replacement;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pattern.len > len[m
[31m-        || ngx_rstrncmp(h->value.data + prefix, pattern.data,[m
[31m-                        pattern.len) != 0)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, pattern.len, &replacement);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    ngx_str_t  pattern, replacement;[m
[31m-[m
[31m-    pattern.len = len;[m
[31m-    pattern.data = h->value.data + prefix;[m
[31m-[m
[31m-    if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (prefix == 0 && h->value.len == len) {[m
[31m-        h->value = replacement;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    ngx_str_t   pattern, replacement;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = h->value.data + prefix;[m
[31m-[m
[31m-    if (p[0] == '.') {[m
[31m-        p++;[m
[31m-        prefix++;[m
[31m-        len--;[m
[31m-    }[m
[31m-[m
[31m-    if (pattern.len != len || ngx_rstrncasecmp(pattern.data, p, len) != 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite(ngx_http_request_t *r, ngx_table_elt_t *h, size_t prefix,[m
[31m-    size_t len, ngx_str_t *replacement)[m
[31m-{[m
[31m-    u_char  *p, *data;[m
[31m-    size_t   new_len;[m
[31m-[m
[31m-    new_len = replacement->len + h->value.len - len;[m
[31m-[m
[31m-    if (replacement->len > len) {[m
[31m-[m
[31m-        data = ngx_pnalloc(r->pool, new_len + 1);[m
[31m-        if (data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(data, h->value.data, prefix);[m
[31m-        p = ngx_copy(p, replacement->data, replacement->len);[m
[31m-[m
[31m-        ngx_memcpy(p, h->value.data + prefix + len,[m
[31m-                   h->value.len - len - prefix + 1);[m
[31m-[m
[31m-        h->value.data = data;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_copy(h->value.data + prefix, replacement->data,[m
[31m-                     replacement->len);[m
[31m-[m
[31m-        ngx_memmove(p, h->value.data + prefix + len,[m
[31m-                    h->value.len - len - prefix + 1);[m
[31m-    }[m
[31m-[m
[31m-    h->value.len = new_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_proxy_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_proxy_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_proxy_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_proxy_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.ignore_headers = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.cache_zone = NULL;[m
[31m-     *     conf->upstream.cache_use_stale = 0;[m
[31m-     *     conf->upstream.cache_methods = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.hide_headers_hash = { NULL, 0 };[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     *     conf->upstream.store_lengths = NULL;[m
[31m-     *     conf->upstream.store_values = NULL;[m
[31m-     *     conf->upstream.ssl_name = NULL;[m
[31m-     *[m
[31m-     *     conf->method = { 0, NULL };[m
[31m-     *     conf->headers_source = NULL;[m
[31m-     *     conf->headers.lengths = NULL;[m
[31m-     *     conf->headers.values = NULL;[m
[31m-     *     conf->headers.hash = { NULL, 0 };[m
[31m-     *     conf->headers_cache.lengths = NULL;[m
[31m-     *     conf->headers_cache.values = NULL;[m
[31m-     *     conf->headers_cache.hash = { NULL, 0 };[m
[31m-     *     conf->body_lengths = NULL;[m
[31m-     *     conf->body_values = NULL;[m
[31m-     *     conf->body_source = { 0, NULL };[m
[31m-     *     conf->redirects = NULL;[m
[31m-     *     conf->ssl = 0;[m
[31m-     *     conf->ssl_protocols = 0;[m
[31m-     *     conf->ssl_ciphers = { 0, NULL };[m
[31m-     *     conf->ssl_trusted_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_crl = { 0, NULL };[m
[31m-     *     conf->ssl_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_certificate_key = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_convert_head = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_server_name = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_verify = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->ssl_passwords = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    /* "proxy_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->redirect = NGX_CONF_UNSET;[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    conf->cookie_domains = NGX_CONF_UNSET_PTR;[m
[31m-    conf->cookie_paths = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->http_version = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->headers_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    conf->headers_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "proxy");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *prev = parent;[m
[31m-    ngx_http_proxy_loc_conf_t *conf = child;[m
[31m-[m
[31m-    u_char                     *p;[m
[31m-    size_t                      size;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_hash_init_t             hash;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_proxy_rewrite_t   *pr;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store,[m
[31m-                              prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"proxy_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-                                         conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_busy_buffers_size\" must be equal to or greater than "[m
[31m-             "the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_busy_buffers_size\" must be less than "[m
[31m-             "the size of all \"proxy_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-                                      conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_temp_file_write_size\" must be equal to or greater "[m
[31m-             "than the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-                                        conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_max_temp_file_size\" must be equal to zero to disable "[m
[31m-             "temporary files usage or must be equal to or greater than "[m
[31m-             "the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                              prev->upstream.ignore_headers,[m
[31m-                              NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                              prev->upstream.temp_path,[m
[31m-                              &ngx_http_proxy_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"proxy_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_convert_head,[m
[31m-                              prev->upstream.cache_convert_head, 1);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->method, prev->method, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                              prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                              prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                              prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_session_reuse,[m
[31m-                              prev->upstream.ssl_session_reuse, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                                  |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,[m
[31m-                             "DEFAULT");[m
[31m-[m
[31m-    if (conf->upstream.ssl_name == NULL) {[m
[31m-        conf->upstream.ssl_name = prev->upstream.ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_server_name,[m
[31m-                              prev->upstream.ssl_server_name, 0);[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_verify,[m
[31m-                              prev->upstream.ssl_verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                              prev->ssl_trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate,[m
[31m-                              prev->ssl_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate_key,[m
[31m-                              prev->ssl_certificate_key, "");[m
[31m-    ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);[m
[31m-[m
[31m-    if (conf->ssl && ngx_http_proxy_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->redirect, prev->redirect, 1);[m
[31m-[m
[31m-    if (conf->redirect) {[m
[31m-[m
[31m-        if (conf->redirects == NULL) {[m
[31m-            conf->redirects = prev->redirects;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->redirects == NULL && conf->url.data) {[m
[31m-[m
[31m-            conf->redirects = ngx_array_create(cf->pool, 1,[m
[31m-                                             sizeof(ngx_http_proxy_rewrite_t));[m
[31m-            if (conf->redirects == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pr = ngx_array_push(conf->redirects);[m
[31m-            if (pr == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(&pr->pattern.complex,[m
[31m-                        sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-            ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-            pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-[m
[31m-            if (conf->vars.uri.len) {[m
[31m-                pr->pattern.complex.value = conf->url;[m
[31m-                pr->replacement.value = conf->location;[m
[31m-[m
[31m-            } else {[m
[31m-                pr->pattern.complex.value.len = conf->url.len[m
[31m-                                                + sizeof("/") - 1;[m
[31m-[m
[31m-                p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);[m
[31m-                if (p == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                pr->pattern.complex.value.data = p;[m
[31m-[m
[31m-                p = ngx_cpymem(p, conf->url.data, conf->url.len);[m
[31m-                *p = '/';[m
[31m-[m
[31m-                ngx_str_set(&pr->replacement.value, "/");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->cookie_domains, prev->cookie_domains, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->cookie_paths, prev->cookie_paths, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->http_version, prev->http_version,[m
[31m-                              NGX_HTTP_VERSION_10);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->headers_hash_max_size,[m
[31m-                              prev->headers_hash_max_size, 512);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->headers_hash_bucket_size,[m
[31m-                              prev->headers_hash_bucket_size, 64);[m
[31m-[m
[31m-    conf->headers_hash_bucket_size = ngx_align(conf->headers_hash_bucket_size,[m
[31m-                                               ngx_cacheline_size);[m
[31m-[m
[31m-    hash.max_size = conf->headers_hash_max_size;[m
[31m-    hash.bucket_size = conf->headers_hash_bucket_size;[m
[31m-    hash.name = "proxy_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_proxy_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->proxy_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->location = prev->location;[m
[31m-        conf->vars = prev->vars;[m
[31m-[m
[31m-        conf->proxy_lengths = prev->proxy_lengths;[m
[31m-        conf->proxy_values = prev->proxy_values;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        conf->upstream.ssl = prev->upstream.ssl;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->proxy_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_proxy_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_source.data == NULL) {[m
[31m-        conf->body_flushes = prev->body_flushes;[m
[31m-        conf->body_source = prev->body_source;[m
[31m-        conf->body_lengths = prev->body_lengths;[m
[31m-        conf->body_values = prev->body_values;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_source.data && conf->body_lengths == NULL) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &conf->body_source;[m
[31m-        sc.flushes = &conf->body_flushes;[m
[31m-        sc.lengths = &conf->body_lengths;[m
[31m-        sc.values = &conf->body_values;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers_source == NULL) {[m
[31m-        conf->headers = prev->headers;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->headers_cache = prev->headers_cache;[m
[31m-#endif[m
[31m-        conf->headers_source = prev->headers_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers,[m
[31m-                                     ngx_http_proxy_headers);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers_cache,[m
[31m-                                         ngx_http_proxy_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_init_headers(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf,[m
[31m-    ngx_http_proxy_headers_t *headers, ngx_keyval_t *default_headers)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_array_t                   headers_names, headers_merged;[m
[31m-    ngx_keyval_t                 *src, *s, *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (headers->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers_source == NULL) {[m
[31m-        conf->headers_source = ngx_array_create(cf->pool, 4,[m
[31m-                                                sizeof(ngx_keyval_t));[m
[31m-        if (conf->headers_source == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    headers->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (headers->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    headers->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (headers->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    src = conf->headers_source->elts;[m
[31m-    for (i = 0; i < conf->headers_source->nelts; i++) {[m
[31m-[m
[31m-        s = ngx_array_push(&headers_merged);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = src[i];[m
[31m-    }[m
[31m-[m
[31m-    h = default_headers;[m
[31m-[m
[31m-    while (h->key.len) {[m
[31m-[m
[31m-        src = headers_merged.elts;[m
[31m-        for (i = 0; i < headers_merged.nelts; i++) {[m
[31m-            if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        s = ngx_array_push(&headers_merged);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = *h;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        h++;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    src = headers_merged.elts;[m
[31m-    for (i = 0; i < headers_merged.nelts; i++) {[m
[31m-[m
[31m-        hk = ngx_array_push(&headers_names);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = src[i].key;[m
[31m-        hk->key_hash = ngx_hash_key_lc(src[i].key.data, src[i].key.len);[m
[31m-        hk->value = (void *) 1;[m
[31m-[m
[31m-        if (src[i].value.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_script_variables_count(&src[i].value) == 0) {[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1[m
[31m-                        + src[i].value.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                       + src[i].key.len + sizeof(": ") - 1[m
[31m-                       + src[i].value.len + sizeof(CRLF) - 1[m
[31m-                       + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1[m
[31m-                        + src[i].value.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-[m
[31m-            p = ngx_cpymem(p, src[i].key.data, src[i].key.len);[m
[31m-            *p++ = ':'; *p++ = ' ';[m
[31m-            p = ngx_cpymem(p, src[i].value.data, src[i].value.len);[m
[31m-            *p++ = CR; *p = LF;[m
[31m-[m
[31m-        } else {[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                    + src[i].key.len + sizeof(": ") - 1 + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-            p = ngx_cpymem(p, src[i].key.data, src[i].key.len);[m
[31m-            *p++ = ':'; *p = ' ';[m
[31m-[m
[31m-[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &src[i].value;[m
[31m-            sc.flushes = &headers->flushes;[m
[31m-            sc.lengths = &headers->lengths;[m
[31m-            sc.values = &headers->values;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = sizeof(CRLF) - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                    + sizeof(CRLF) - 1 + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = sizeof(CRLF) - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-            *p++ = CR; *p = LF;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-        code = ngx_array_push_n(headers->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-    hash.hash = &headers->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = conf->headers_hash_max_size;[m
[31m-    hash.bucket_size = conf->headers_hash_bucket_size;[m
[31m-    hash.name = "proxy_headers_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    size_t                      add;[m
[31m-    u_short                     port;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (plcf->upstream.upstream || plcf->proxy_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_proxy_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &plcf->proxy_lengths;[m
[31m-        sc.values = &plcf->proxy_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        plcf->ssl = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncasecmp(url->data, (u_char *) "http://", 7) == 0) {[m
[31m-        add = 7;[m
[31m-        port = 80;[m
[31m-[m
[31m-    } else if (ngx_strncasecmp(url->data, (u_char *) "https://", 8) == 0) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        plcf->ssl = 1;[m
[31m-[m
[31m-        add = 8;[m
[31m-        port = 443;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "https protocol requires SSL support");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid URL prefix");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url.len = url->len - add;[m
[31m-    u.url.data = url->data + add;[m
[31m-    u.default_port = port;[m
[31m-    u.uri_part = 1;[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    plcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (plcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    plcf->vars.schema.len = add;[m
[31m-    plcf->vars.schema.data = url->data;[m
[31m-    plcf->vars.key_start = plcf->vars.schema;[m
[31m-[m
[31m-    ngx_http_proxy_set_vars(&u, &plcf->vars);[m
[31m-[m
[31m-    plcf->location = clcf->name;[m
[31m-[m
[31m-    if (clcf->named[m
[31m-#if (NGX_PCRE)[m
[31m-        || clcf->regex[m
[31m-#endif[m
[31m-        || clcf->noname)[m
[31m-    {[m
[31m-        if (plcf->vars.uri.len) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_pass\" cannot have URI part in "[m
[31m-                               "location given by regular expression, "[m
[31m-                               "or inside named location, "[m
[31m-                               "or inside \"if\" statement, "[m
[31m-                               "or inside \"limit_except\" block");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        plcf->location.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    plcf->url = *url;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->redirect == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    plcf->redirect = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->redirect = 0;[m
[31m-            plcf->redirects = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "false") == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid parameter \"false\", use \"off\" instead");[m
[31m-            plcf->redirect = 0;[m
[31m-            plcf->redirects = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "default") != 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->redirects == NULL) {[m
[31m-        plcf->redirects = ngx_array_create(cf->pool, 1,[m
[31m-                                           sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->redirects == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->redirects);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "default") == 0) {[m
[31m-        if (plcf->proxy_lengths) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_redirect default\" cannot be used "[m
[31m-                               "with \"proxy_pass\" directive with variables");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (plcf->url.data == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_redirect default\" should be placed "[m
[31m-                               "after the \"proxy_pass\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-[m
[31m-        ngx_memzero(&pr->pattern.complex, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        if (plcf->vars.uri.len) {[m
[31m-            pr->pattern.complex.value = plcf->url;[m
[31m-            pr->replacement.value = plcf->location;[m
[31m-[m
[31m-        } else {[m
[31m-            pr->pattern.complex.value.len = plcf->url.len + sizeof("/") - 1;[m
[31m-[m
[31m-            p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pr->pattern.complex.value.data = p;[m
[31m-[m
[31m-            p = ngx_cpymem(p, plcf->url.data, plcf->url.len);[m
[31m-            *p = '/';[m
[31m-[m
[31m-            ngx_str_set(&pr->replacement.value, "/");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (value[1].data[0] == '*') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->cookie_domains == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->cookie_domains = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_domains == NGX_CONF_UNSET_PTR) {[m
[31m-        plcf->cookie_domains = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->cookie_domains == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->cookie_domains);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (value[1].data[0] == '.') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_domain_handler;[m
[31m-[m
[31m-        if (value[2].data[0] == '.') {[m
[31m-            value[2].len--;[m
[31m-            value[2].data++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->cookie_paths == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->cookie_paths = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_paths == NGX_CONF_UNSET_PTR) {[m
[31m-        plcf->cookie_paths = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->cookie_paths == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->cookie_paths);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (value[1].data[0] == '*') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_regex(ngx_conf_t *cf, ngx_http_proxy_rewrite_t *pr,[m
[31m-    ngx_str_t *regex, ngx_uint_t caseless)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    u_char               errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    ngx_regex_compile_t  rc;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *regex;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    if (caseless) {[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-    }[m
[31m-[m
[31m-    pr->pattern.regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (pr->pattern.regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->handler = ngx_http_proxy_rewrite_regex_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "using regex \"%V\" requires PCRE library", regex);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (plcf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        plcf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (plcf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"proxy_cache\"";[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    plcf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &plcf->upstream.store_lengths;[m
[31m-    sc.values = &plcf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        plcf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"proxy_store\"";[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        plcf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (plcf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *plcf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                      &ngx_http_proxy_module);[m
[31m-    if (plcf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &plcf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (plcf->ssl_passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    plcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (plcf->ssl_passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"proxy_send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"proxy_send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_set_ssl(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *plcf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    plcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (plcf->upstream.ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(plcf->upstream.ssl, plcf->ssl_protocols, NULL)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = plcf->upstream.ssl;[m
[31m-[m
[31m-    if (plcf->ssl_certificate.len) {[m
[31m-[m
[31m-        if (plcf->ssl_certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"proxy_ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &plcf->ssl_certificate);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_certificate(cf, plcf->upstream.ssl, &plcf->ssl_certificate,[m
[31m-                                &plcf->ssl_certificate_key, plcf->ssl_passwords)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(plcf->upstream.ssl->ctx,[m
[31m-                                (const char *) plcf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &plcf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->upstream.ssl_verify) {[m
[31m-        if (plcf->ssl_trusted_certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no proxy_ssl_trusted_certificate for proxy_ssl_verify");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, plcf->upstream.ssl,[m
[31m-                                        &plcf->ssl_trusted_certificate,[m
[31m-                                        plcf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, plcf->upstream.ssl, &plcf->ssl_crl) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v)[m
[31m-{[m
[31m-    if (u->family != AF_UNIX) {[m
[31m-[m
[31m-        if (u->no_port || u->port == u->default_port) {[m
[31m-[m
[31m-            v->host_header = u->host;[m
[31m-[m
[31m-            if (u->default_port == 80) {[m
[31m-                ngx_str_set(&v->port, "80");[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_str_set(&v->port, "443");[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            v->host_header.len = u->host.len + 1 + u->port_text.len;[m
[31m-            v->host_header.data = u->host.data;[m
[31m-            v->port = u->port_text;[m
[31m-        }[m
[31m-[m
[31m-        v->key_start.len += v->host_header.len;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&v->host_header, "localhost");[m
[31m-        ngx_str_null(&v->port);[m
[31m-        v->key_start.len += sizeof("unix:") - 1 + u->host.len + 1;[m
[31m-    }[m
[31m-[m
[31m-    v->uri = u->uri;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex c24ef17..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,4393 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_proxy_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_proxy_rewrite_s  ngx_http_proxy_rewrite_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len,[m
[31m-    ngx_http_proxy_rewrite_t *pr);[m
[31m-[m
[31m-struct ngx_http_proxy_rewrite_s {[m
[31m-    ngx_http_proxy_rewrite_pt      handler;[m
[31m-[m
[31m-    union {[m
[31m-        ngx_http_complex_value_t   complex;[m
[31m-#if (NGX_PCRE)[m
[31m-        ngx_http_regex_t          *regex;[m
[31m-#endif[m
[31m-    } pattern;[m
[31m-[m
[31m-    ngx_http_complex_value_t       replacement;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                      key_start;[m
[31m-    ngx_str_t                      schema;[m
[31m-    ngx_str_t                      host_header;[m
[31m-    ngx_str_t                      port;[m
[31m-    ngx_str_t                      uri;[m
[31m-} ngx_http_proxy_vars_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                   *flushes;[m
[31m-    ngx_array_t                   *lengths;[m
[31m-    ngx_array_t                   *values;[m
[31m-    ngx_hash_t                     hash;[m
[31m-} ngx_http_proxy_headers_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t       upstream;[m
[31m-[m
[31m-    ngx_array_t                   *body_flushes;[m
[31m-    ngx_array_t                   *body_lengths;[m
[31m-    ngx_array_t                   *body_values;[m
[31m-    ngx_str_t                      body_source;[m
[31m-[m
[31m-    ngx_http_proxy_headers_t       headers;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_proxy_headers_t       headers_cache;[m
[31m-#endif[m
[31m-    ngx_array_t                   *headers_source;[m
[31m-[m
[31m-    ngx_array_t                   *proxy_lengths;[m
[31m-    ngx_array_t                   *proxy_values;[m
[31m-[m
[31m-    ngx_array_t                   *redirects;[m
[31m-    ngx_array_t                   *cookie_domains;[m
[31m-    ngx_array_t                   *cookie_paths;[m
[31m-[m
[31m-    ngx_str_t                      method;[m
[31m-    ngx_str_t                      location;[m
[31m-    ngx_str_t                      url;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t       cache_key;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_proxy_vars_t          vars;[m
[31m-[m
[31m-    ngx_flag_t                     redirect;[m
[31m-[m
[31m-    ngx_uint_t                     http_version;[m
[31m-[m
[31m-    ngx_uint_t                     headers_hash_max_size;[m
[31m-    ngx_uint_t                     headers_hash_bucket_size;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_uint_t                     ssl;[m
[31m-    ngx_uint_t                     ssl_protocols;[m
[31m-    ngx_str_t                      ssl_ciphers;[m
[31m-    ngx_uint_t                     ssl_verify_depth;[m
[31m-    ngx_str_t                      ssl_trusted_certificate;[m
[31m-    ngx_str_t                      ssl_crl;[m
[31m-    ngx_str_t                      ssl_certificate;[m
[31m-    ngx_str_t                      ssl_certificate_key;[m
[31m-    ngx_array_t                   *ssl_passwords;[m
[31m-#endif[m
[31m-} ngx_http_proxy_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_status_t              status;[m
[31m-    ngx_http_chunked_t             chunked;[m
[31m-    ngx_http_proxy_vars_t          vars;[m
[31m-    off_t                          internal_body_length;[m
[31m-[m
[31m-    ngx_chain_t                   *free;[m
[31m-    ngx_chain_t                   *busy;[m
[31m-[m
[31m-    unsigned                       head:1;[m
[31m-    unsigned                       internal_chunked:1;[m
[31m-    unsigned                       header_sent:1;[m
[31m-} ngx_http_proxy_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_proxy_ctx_t *ctx, ngx_http_proxy_loc_conf_t *plcf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_proxy_create_key(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_proxy_process_status_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_input_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_proxy_copy_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_proxy_non_buffered_copy_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_proxy_non_buffered_chunked_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static void ngx_http_proxy_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_proxy_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, u_char *value, ngx_array_t *rewrites);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_str_t *replacement);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers,[m
[31m-    ngx_keyval_t *default_headers);[m
[31m-[m
[31m-static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static char *ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static char *ngx_http_proxy_ssl_password_file(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_regex(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_rewrite_t *pr, ngx_str_t *regex, ngx_uint_t caseless);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_proxy_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_loc_conf_t *plcf);[m
[31m-#endif[m
[31m-static void ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_proxy_lowat_post =[m
[31m-    { ngx_http_proxy_lowat_check };[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_proxy_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_proxy_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_proxy_http_version[] = {[m
[31m-    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },[m
[31m-    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_proxy_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_proxy_commands[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_redirect,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cookie_domain"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_cookie_domain,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cookie_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_cookie_path,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_lowat),[m
[31m-      &ngx_http_proxy_lowat_post },[m
[31m-[m
[31m-    { ngx_string("proxy_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_set_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_keyval_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_headers_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_headers_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_set_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, body_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_method"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, method),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("proxy_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_main_conf_t, caches),[m
[31m-      &ngx_http_proxy_module },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_proxy_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_convert_head"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_convert_head),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("proxy_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_proxy_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_http_version"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, http_version),[m
[31m-      &ngx_http_proxy_http_version },[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_session_reuse"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_session_reuse),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_protocols),[m
[31m-      &ngx_http_proxy_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_server_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_password_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_ssl_password_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_proxy_module_ctx = {[m
[31m-    ngx_http_proxy_add_variables,          /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_proxy_create_main_conf,       /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_proxy_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_proxy_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_proxy_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_proxy_module_ctx,            /* module context */[m
[31m-    ngx_http_proxy_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char  ngx_http_proxy_version[] = " HTTP/1.0" CRLF;[m
[31m-static char  ngx_http_proxy_version_11[] = " HTTP/1.1" CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_proxy_headers[] = {[m
[31m-    { ngx_string("Host"), ngx_string("$proxy_host") },[m
[31m-    { ngx_string("Connection"), ngx_string("close") },[m
[31m-    { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },[m
[31m-    { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },[m
[31m-    { ngx_string("TE"), ngx_string("") },[m
[31m-    { ngx_string("Keep-Alive"), ngx_string("") },[m
[31m-    { ngx_string("Expect"), ngx_string("") },[m
[31m-    { ngx_string("Upgrade"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_proxy_hide_headers[] = {[m
[31m-    ngx_string("Date"),[m
[31m-    ngx_string("Server"),[m
[31m-    ngx_string("X-Pad"),[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_proxy_cache_headers[] = {[m
[31m-    { ngx_string("Host"), ngx_string("$proxy_host") },[m
[31m-    { ngx_string("Connection"), ngx_string("close") },[m
[31m-    { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },[m
[31m-    { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },[m
[31m-    { ngx_string("TE"), ngx_string("") },[m
[31m-    { ngx_string("Keep-Alive"), ngx_string("") },[m
[31m-    { ngx_string("Expect"), ngx_string("") },[m
[31m-    { ngx_string("Upgrade"), ngx_string("") },[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("If-Unmodified-Since"), ngx_string("") },[m
[31m-    { ngx_string("If-None-Match"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("If-Match"), ngx_string("") },[m
[31m-    { ngx_string("Range"), ngx_string("") },[m
[31m-    { ngx_string("If-Range"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_proxy_vars[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_host"), NULL, ngx_http_proxy_host_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_port"), NULL, ngx_http_proxy_port_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_add_x_forwarded_for"), NULL,[m
[31m-      ngx_http_proxy_add_x_forwarded_for_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-#if 0[m
[31m-    { ngx_string("proxy_add_via"), NULL, NULL, 0, NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("proxy_internal_body_length"), NULL,[m
[31m-      ngx_http_proxy_internal_body_length_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_internal_chunked"), NULL,[m
[31m-      ngx_http_proxy_internal_chunked_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_proxy_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_PROXY_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-    ngx_http_proxy_ctx_t        *ctx;[m
[31m-    ngx_http_proxy_loc_conf_t   *plcf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_proxy_main_conf_t  *pmcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_proxy_module);[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (plcf->proxy_lengths == NULL) {[m
[31m-        ctx->vars = plcf->vars;[m
[31m-        u->schema = plcf->vars.schema;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl = (plcf->upstream.ssl != NULL);[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_proxy_eval(r, ctx, plcf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_proxy_module;[m
[31m-[m
[31m-    u->conf = &plcf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    u->caches = &pmcf->caches;[m
[31m-    u->create_key = ngx_http_proxy_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_proxy_create_request;[m
[31m-    u->reinit_request = ngx_http_proxy_reinit_request;[m
[31m-    u->process_header = ngx_http_proxy_process_status_line;[m
[31m-    u->abort_request = ngx_http_proxy_abort_request;[m
[31m-    u->finalize_request = ngx_http_proxy_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    if (plcf->redirects) {[m
[31m-        u->rewrite_redirect = ngx_http_proxy_rewrite_redirect;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_domains || plcf->cookie_paths) {[m
[31m-        u->rewrite_cookie = ngx_http_proxy_rewrite_cookie;[m
[31m-    }[m
[31m-[m
[31m-    u->buffering = plcf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_http_proxy_copy_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_proxy_input_filter_init;[m
[31m-    u->input_filter = ngx_http_proxy_non_buffered_copy_filter;[m
[31m-    u->input_filter_ctx = r;[m
[31m-[m
[31m-    u->accel = 1;[m
[31m-[m
[31m-    if (!plcf->upstream.request_buffering[m
[31m-        && plcf->body_values == NULL && plcf->upstream.pass_request_body[m
[31m-        && (!r->headers_in.chunked[m
[31m-            || plcf->http_version == NGX_HTTP_VERSION_11))[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx,[m
[31m-    ngx_http_proxy_loc_conf_t *plcf)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    size_t                add;[m
[31m-    u_short               port;[m
[31m-    ngx_str_t             proxy;[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &proxy, plcf->proxy_lengths->elts, 0,[m
[31m-                            plcf->proxy_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (proxy.len > 7[m
[31m-        && ngx_strncasecmp(proxy.data, (u_char *) "http://", 7) == 0)[m
[31m-    {[m
[31m-        add = 7;[m
[31m-        port = 80;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    } else if (proxy.len > 8[m
[31m-               && ngx_strncasecmp(proxy.data, (u_char *) "https://", 8) == 0)[m
[31m-    {[m
[31m-        add = 8;[m
[31m-        port = 443;[m
[31m-        r->upstream->ssl = 1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid URL prefix in \"%V\"", &proxy);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->schema.len = add;[m
[31m-    u->schema.data = proxy.data;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.len = proxy.len - add;[m
[31m-    url.url.data = proxy.data + add;[m
[31m-    url.default_port = port;[m
[31m-    url.uri_part = 1;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.uri.len) {[m
[31m-        if (url.uri.data[0] == '?') {[m
[31m-            p = ngx_pnalloc(r->pool, url.uri.len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *p++ = '/';[m
[31m-            ngx_memcpy(p, url.uri.data, url.uri.len);[m
[31m-[m
[31m-            url.uri.len++;[m
[31m-            url.uri.data = p - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->vars.key_start = u->schema;[m
[31m-[m
[31m-    ngx_http_proxy_set_vars(&url, &ctx->vars);[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = (in_port_t) (url.no_port ? port : url.port);[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                      len, loc_len;[m
[31m-    u_char                     *p;[m
[31m-    uintptr_t                   escape;[m
[31m-    ngx_str_t                  *key;[m
[31m-    ngx_http_upstream_t        *u;[m
[31m-    ngx_http_proxy_ctx_t       *ctx;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cache_key.value.data) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &plcf->cache_key, key) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *key = ctx->vars.key_start;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-[m
[31m-        *key = ctx->vars.uri;[m
[31m-        u->uri = ctx->vars.uri;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)[m
[31m-    {[m
[31m-        *key = r->unparsed_uri;[m
[31m-        u->uri = r->unparsed_uri;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    loc_len = (r->valid_location && ctx->vars.uri.len) ? plcf->location.len : 0;[m
[31m-[m
[31m-    if (r->quoted_uri || r->internal) {[m
[31m-        escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,[m
[31m-                                    r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-    } else {[m
[31m-        escape = 0;[m
[31m-    }[m
[31m-[m
[31m-    len = ctx->vars.uri.len + r->uri.len - loc_len + escape[m
[31m-          + sizeof("?") - 1 + r->args.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    key->data = p;[m
[31m-[m
[31m-    if (r->valid_location) {[m
[31m-        p = ngx_copy(p, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-    }[m
[31m-[m
[31m-    if (escape) {[m
[31m-        ngx_escape_uri(p, r->uri.data + loc_len,[m
[31m-                       r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-        p += r->uri.len - loc_len + escape;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_copy(p, r->uri.data + loc_len, r->uri.len - loc_len);[m
[31m-    }[m
[31m-[m
[31m-    if (r->args.len > 0) {[m
[31m-        *p++ = '?';[m
[31m-        p = ngx_copy(p, r->args.data, r->args.len);[m
[31m-    }[m
[31m-[m
[31m-    key->len = p - key->data;[m
[31m-    u->uri = *key;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                        len, uri_len, loc_len, body_len;[m
[31m-    uintptr_t                     escape;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_str_t                     method;[m
[31m-    ngx_uint_t                    i, unparsed_uri;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header;[m
[31m-    ngx_http_upstream_t          *u;[m
[31m-    ngx_http_proxy_ctx_t         *ctx;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_proxy_headers_t     *headers;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_proxy_loc_conf_t    *plcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    headers = u->cacheable ? &plcf->headers_cache : &plcf->headers;[m
[31m-#else[m
[31m-    headers = &plcf->headers;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->method.len) {[m
[31m-        /* HEAD was changed to GET to cache response */[m
[31m-        method = u->method;[m
[31m-[m
[31m-    } else if (plcf->method.len) {[m
[31m-        method = plcf->method;[m
[31m-[m
[31m-    } else {[m
[31m-        method = r->method_name;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (method.len == 4[m
[31m-        && ngx_strncasecmp(method.data, (u_char *) "HEAD", 4) == 0)[m
[31m-    {[m
[31m-        ctx->head = 1;[m
[31m-    }[m
[31m-[m
[31m-    len = method.len + 1 + sizeof(ngx_http_proxy_version) - 1[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    escape = 0;[m
[31m-    loc_len = 0;[m
[31m-    unparsed_uri = 0;[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-        uri_len = ctx->vars.uri.len;[m
[31m-[m
[31m-    } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)[m
[31m-    {[m
[31m-        unparsed_uri = 1;[m
[31m-        uri_len = r->unparsed_uri.len;[m
[31m-[m
[31m-    } else {[m
[31m-        loc_len = (r->valid_location && ctx->vars.uri.len) ?[m
[31m-                      plcf->location.len : 0;[m
[31m-[m
[31m-        if (r->quoted_uri || r->space_in_uri || r->internal) {[m
[31m-            escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,[m
[31m-                                        r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-        }[m
[31m-[m
[31m-        uri_len = ctx->vars.uri.len + r->uri.len - loc_len + escape[m
[31m-                  + sizeof("?") - 1 + r->args.len;[m
[31m-    }[m
[31m-[m
[31m-    if (uri_len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "zero length URI to proxy");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len += uri_len;[m
[31m-[m
[31m-    ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    ngx_http_script_flush_no_cacheable_variables(r, plcf->body_flushes);[m
[31m-    ngx_http_script_flush_no_cacheable_variables(r, headers->flushes);[m
[31m-[m
[31m-    if (plcf->body_lengths) {[m
[31m-        le.ip = plcf->body_lengths->elts;[m
[31m-        le.request = r;[m
[31m-        le.flushed = 1;[m
[31m-        body_len = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            body_len += lcode(&le);[m
[31m-        }[m
[31m-[m
[31m-        ctx->internal_body_length = body_len;[m
[31m-        len += body_len;[m
[31m-[m
[31m-    } else if (r->headers_in.chunked && r->reading_body) {[m
[31m-        ctx->internal_body_length = -1;[m
[31m-        ctx->internal_chunked = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->internal_body_length = r->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    le.ip = headers->lengths->elts;[m
[31m-    le.request = r;[m
[31m-    le.flushed = 1;[m
[31m-[m
[31m-    while (*(uintptr_t *) le.ip) {[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            len += lcode(&le);[m
[31m-        }[m
[31m-        le.ip += sizeof(uintptr_t);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (plcf->upstream.pass_request_headers) {[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_hash_find(&headers->hash, header[i].hash,[m
[31m-                              header[i].lowcase_key, header[i].key.len))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += header[i].key.len + sizeof(": ") - 1[m
[31m-                + header[i].value.len + sizeof(CRLF) - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-[m
[31m-    /* the request line */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, method.data, method.len);[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    u->uri.data = b->last;[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-        b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-[m
[31m-    } else if (unparsed_uri) {[m
[31m-        b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len);[m
[31m-[m
[31m-    } else {[m
[31m-        if (r->valid_location) {[m
[31m-            b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-        }[m
[31m-[m
[31m-        if (escape) {[m
[31m-            ngx_escape_uri(b->last, r->uri.data + loc_len,[m
[31m-                           r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-            b->last += r->uri.len - loc_len + escape;[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_copy(b->last, r->uri.data + loc_len,[m
[31m-                               r->uri.len - loc_len);[m
[31m-        }[m
[31m-[m
[31m-        if (r->args.len > 0) {[m
[31m-            *b->last++ = '?';[m
[31m-            b->last = ngx_copy(b->last, r->args.data, r->args.len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->uri.len = b->last - u->uri.data;[m
[31m-[m
[31m-    if (plcf->http_version == NGX_HTTP_VERSION_11) {[m
[31m-        b->last = ngx_cpymem(b->last, ngx_http_proxy_version_11,[m
[31m-                             sizeof(ngx_http_proxy_version_11) - 1);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, ngx_http_proxy_version,[m
[31m-                             sizeof(ngx_http_proxy_version) - 1);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    e.ip = headers->values->elts;[m
[31m-    e.pos = b->last;[m
[31m-    e.request = r;[m
[31m-    e.flushed = 1;[m
[31m-[m
[31m-    le.ip = headers->lengths->elts;[m
[31m-[m
[31m-    while (*(uintptr_t *) le.ip) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-[m
[31m-        /* skip the header line name length */[m
[31m-        (void) lcode(&le);[m
[31m-[m
[31m-        if (*(ngx_http_script_len_code_pt *) le.ip) {[m
[31m-[m
[31m-            for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-[m
[31m-            e.skip = (len == sizeof(CRLF) - 1) ? 1 : 0;[m
[31m-[m
[31m-        } else {[m
[31m-            e.skip = 0;[m
[31m-        }[m
[31m-[m
[31m-        le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-        while (*(uintptr_t *) e.ip) {[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) &e);[m
[31m-        }[m
[31m-        e.ip += sizeof(uintptr_t);[m
[31m-    }[m
[31m-[m
[31m-    b->last = e.pos;[m
[31m-[m
[31m-[m
[31m-    if (plcf->upstream.pass_request_headers) {[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_hash_find(&headers->hash, header[i].hash,[m
[31m-                              header[i].lowcase_key, header[i].key.len))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-            *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].value.data,[m
[31m-                               header[i].value.len);[m
[31m-[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header: \"%V: %V\"",[m
[31m-                           &header[i].key, &header[i].value);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* add "\r\n" at the header end */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (plcf->body_values) {[m
[31m-        e.ip = plcf->body_values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.skip = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) e.ip) {[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) &e);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy header:%N\"%*s\"",[m
[31m-                   (size_t) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        if (ctx->internal_chunked) {[m
[31m-            u->output.output_filter = ngx_http_proxy_body_output_filter;[m
[31m-            u->output.filter_ctx = r;[m
[31m-        }[m
[31m-[m
[31m-    } else if (plcf->body_values == NULL && plcf->upstream.pass_request_body) {[m
[31m-[m
[31m-        body = u->request_bufs;[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        while (body) {[m
[31m-            b = ngx_alloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl->next == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl = cl->next;[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        u->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    b->flush = 1;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->status.code = 0;[m
[31m-    ctx->status.count = 0;[m
[31m-    ctx->status.start = NULL;[m
[31m-    ctx->status.end = NULL;[m
[31m-    ctx->chunked.state = 0;[m
[31m-[m
[31m-    r->upstream->process_header = ngx_http_proxy_process_status_line;[m
[31m-    r->upstream->pipe->input_filter = ngx_http_proxy_copy_filter;[m
[31m-    r->upstream->input_filter = ngx_http_proxy_non_buffered_copy_filter;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    off_t                  size;[m
[31m-    u_char                *chunk;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b;[m
[31m-    ngx_chain_t           *out, *cl, *tl, **ll, **fl;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "proxy output filter");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        out = in;[m
[31m-        goto out;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    if (!ctx->header_sent) {[m
[31m-        /* first buffer contains headers, pass it unmodified */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "proxy output header");[m
[31m-[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        tl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tl->buf = in->buf;[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            tl->next = NULL;[m
[31m-            goto out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    cl = in;[m
[31m-    fl = ll;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "proxy output chunk: %O", ngx_buf_size(cl->buf));[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush[m
[31m-            || cl->buf->sync[m
[31m-            || ngx_buf_in_memory(cl->buf)[m
[31m-            || cl->buf->in_file)[m
[31m-        {[m
[31m-            tl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            tl->buf = cl->buf;[m
[31m-            *ll = tl;[m
[31m-            ll = &tl->next;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-        chunk = b->start;[m
[31m-[m
[31m-        if (chunk == NULL) {[m
[31m-            /* the "0000000000000000" is 64-bit hexadecimal string */[m
[31m-[m
[31m-            chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1);[m
[31m-            if (chunk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = chunk;[m
[31m-            b->end = chunk + sizeof("0000000000000000" CRLF) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->memory = 0;[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = chunk;[m
[31m-        b->last = ngx_sprintf(chunk, "%xO" CRLF, size);[m
[31m-[m
[31m-        tl->next = *fl;[m
[31m-        *fl = tl;[m
[31m-    }[m
[31m-[m
[31m-    if (cl->buf->last_buf) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->last_buf = 1;[m
[31m-        b->pos = (u_char *) CRLF "0" CRLF CRLF;[m
[31m-        b->last = b->pos + 7;[m
[31m-[m
[31m-        cl->buf->last_buf = 0;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            b->pos += 2;[m
[31m-        }[m
[31m-[m
[31m-    } else if (size > 0) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->pos = (u_char *) CRLF;[m
[31m-        b->last = b->pos + 2;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-    } else {[m
[31m-        *ll = NULL;[m
[31m-    }[m
[31m-[m
[31m-out:[m
[31m-[m
[31m-    rc = ngx_chain_writer(&r->upstream->writer, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_process_status_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                 len;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, &u->buffer, &ctx->status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (r->cache) {[m
[31m-            r->http_version = NGX_HTTP_VERSION_9;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent no valid HTTP/1.0 header");[m
[31m-[m
[31m-#if 0[m
[31m-        if (u->accel) {[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        r->http_version = NGX_HTTP_VERSION_9;[m
[31m-        u->state->status = NGX_HTTP_OK;[m
[31m-        u->headers_in.connection_close = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->status == 0) {[m
[31m-        u->state->status = ctx->status.code;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = ctx->status.code;[m
[31m-[m
[31m-    len = ctx->status.end - ctx->status.start;[m
[31m-    u->headers_in.status_line.len = len;[m
[31m-[m
[31m-    u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (u->headers_in.status_line.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u->headers_in.status_line.data, ctx->status.start, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy status %ui \"%V\"",[m
[31m-                   u->headers_in.status_n, &u->headers_in.status_line);[m
[31m-[m
[31m-    if (ctx->status.http_version < NGX_HTTP_VERSION_11) {[m
[31m-        u->headers_in.connection_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    u->process_header = ngx_http_proxy_process_header;[m
[31m-[m
[31m-    return ngx_http_proxy_process_header(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_proxy_ctx_t           *ctx;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            h->key.data = ngx_pnalloc(r->pool,[m
[31m-                               h->key.len + 1 + h->value.len + 1 + h->key.len);[m
[31m-            if (h->key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->value.data = h->key.data + h->key.len + 1;[m
[31m-            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;[m
[31m-[m
[31m-            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-            ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header: \"%V: %V\"",[m
[31m-                           &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header done");[m
[31m-[m
[31m-            /*[m
[31m-             * if no "Server" and "Date" in header line,[m
[31m-             * then add the special empty headers[m
[31m-             */[m
[31m-[m
[31m-            if (r->upstream->headers_in.server == NULL) {[m
[31m-                h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash([m
[31m-                                    ngx_hash('s', 'e'), 'r'), 'v'), 'e'), 'r');[m
[31m-[m
[31m-                ngx_str_set(&h->key, "Server");[m
[31m-                ngx_str_null(&h->value);[m
[31m-                h->lowcase_key = (u_char *) "server";[m
[31m-            }[m
[31m-[m
[31m-            if (r->upstream->headers_in.date == NULL) {[m
[31m-                h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                h->hash = ngx_hash(ngx_hash(ngx_hash('d', 'a'), 't'), 'e');[m
[31m-[m
[31m-                ngx_str_set(&h->key, "Date");[m
[31m-                ngx_str_null(&h->value);[m
[31m-                h->lowcase_key = (u_char *) "date";[m
[31m-            }[m
[31m-[m
[31m-            /* clear content length if response is chunked */[m
[31m-[m
[31m-            u = r->upstream;[m
[31m-[m
[31m-            if (u->headers_in.chunked) {[m
[31m-                u->headers_in.content_length_n = -1;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * set u->keepalive if response has no body; this allows to keep[m
[31m-             * connections alive in case of r->header_only or X-Accel-Redirect[m
[31m-             */[m
[31m-[m
[31m-            ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT[m
[31m-                || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED[m
[31m-                || ctx->head[m
[31m-                || (!u->headers_in.chunked[m
[31m-                    && u->headers_in.content_length_n == 0))[m
[31m-            {[m
[31m-                u->keepalive = !u->headers_in.connection_close;[m
[31m-            }[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-                u->keepalive = 0;[m
[31m-[m
[31m-                if (r->headers_in.upgrade) {[m
[31m-                    u->upgrade = 1;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid header");[m
[31m-[m
[31m-        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t    *r = data;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy filter init s:%ui h:%d c:%d l:%O",[m
[31m-                   u->headers_in.status_n, ctx->head, u->headers_in.chunked,[m
[31m-                   u->headers_in.content_length_n);[m
[31m-[m
[31m-    /* as per RFC2616, 4.4 Message Length */[m
[31m-[m
[31m-    if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT[m
[31m-        || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED[m
[31m-        || ctx->head)[m
[31m-    {[m
[31m-        /* 1xx, 204, and 304 and replies to HEAD requests */[m
[31m-        /* no 1xx since we don't send Expect and Upgrade */[m
[31m-[m
[31m-        u->pipe->length = 0;[m
[31m-        u->length = 0;[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-[m
[31m-    } else if (u->headers_in.chunked) {[m
[31m-        /* chunked */[m
[31m-[m
[31m-        u->pipe->input_filter = ngx_http_proxy_chunked_filter;[m
[31m-        u->pipe->length = 3; /* "0" LF LF */[m
[31m-[m
[31m-        u->input_filter = ngx_http_proxy_non_buffered_chunked_filter;[m
[31m-        u->length = 1;[m
[31m-[m
[31m-    } else if (u->headers_in.content_length_n == 0) {[m
[31m-        /* empty body: special case as filter won't be called */[m
[31m-[m
[31m-        u->pipe->length = 0;[m
[31m-        u->length = 0;[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-[m
[31m-    } else {[m
[31m-        /* content length or connection close */[m
[31m-[m
[31m-        u->pipe->length = u->headers_in.content_length_n;[m
[31m-        u->length = u->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_buf_t           *b;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    ngx_memcpy(b, buf, sizeof(ngx_buf_t));[m
[31m-    b->shadow = buf;[m
[31m-    b->tag = p->tag;[m
[31m-    b->last_shadow = 1;[m
[31m-    b->recycled = 1;[m
[31m-    buf->shadow = b;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num);[m
[31m-[m
[31m-    if (p->in) {[m
[31m-        *p->last_in = cl;[m
[31m-    } else {[m
[31m-        p->in = cl;[m
[31m-    }[m
[31m-    p->last_in = &cl->next;[m
[31m-[m
[31m-    if (p->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p->length -= b->last - b->pos;[m
[31m-[m
[31m-    if (p->length == 0) {[m
[31m-        r = p->input_ctx;[m
[31m-        p->upstream_done = 1;[m
[31m-        r->upstream->keepalive = !r->upstream->headers_in.connection_close;[m
[31m-[m
[31m-    } else if (p->length < 0) {[m
[31m-        r = p->input_ctx;[m
[31m-        p->upstream_done = 1;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                      "upstream sent more data than specified in "[m
[31m-                      "\"Content-Length\" header");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b, **prev;[m
[31m-    ngx_chain_t           *cl;[m
[31m-    ngx_http_request_t    *r;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r = p->input_ctx;[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = NULL;[m
[31m-    prev = &buf->shadow;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a chunk has been parsed successfully */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->start = buf->start;[m
[31m-            b->end = buf->end;[m
[31m-            b->tag = p->tag;[m
[31m-            b->temporary = 1;[m
[31m-            b->recycled = 1;[m
[31m-[m
[31m-            *prev = b;[m
[31m-            prev = &b->shadow;[m
[31m-[m
[31m-            if (p->in) {[m
[31m-                *p->last_in = cl;[m
[31m-            } else {[m
[31m-                p->in = cl;[m
[31m-            }[m
[31m-            p->last_in = &cl->next;[m
[31m-[m
[31m-            /* STUB */ b->num = buf->num;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "input buf #%d %p", b->num, b->pos);[m
[31m-[m
[31m-            if (buf->last - buf->pos >= ctx->chunked.size) {[m
[31m-[m
[31m-                buf->pos += (size_t) ctx->chunked.size;[m
[31m-                b->last = buf->pos;[m
[31m-                ctx->chunked.size = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ctx->chunked.size -= buf->last - buf->pos;[m
[31m-            buf->pos = buf->last;[m
[31m-            b->last = buf->last;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-[m
[31m-            /* a whole response has been parsed successfully */[m
[31m-[m
[31m-            p->upstream_done = 1;[m
[31m-            r->upstream->keepalive = !r->upstream->headers_in.connection_close;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            /* set p->length, minimal amount of data we want to see */[m
[31m-[m
[31m-            p->length = ctx->chunked.length;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* invalid response */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid chunked response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy chunked state %ui, length %O",[m
[31m-                   ctx->chunked.state, p->length);[m
[31m-[m
[31m-    if (b) {[m
[31m-        b->shadow = buf;[m
[31m-        b->last_shadow = 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "input buf %p %z", b->pos, b->last - b->pos);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* there is no data record in the buf, add it to free chain */[m
[31m-[m
[31m-    if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_non_buffered_copy_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t   *r = data;[m
[31m-[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    cl->buf->pos = b->last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    if (u->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u->length -= bytes;[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_non_buffered_chunked_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t   *r = data;[m
[31m-[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b, *buf;[m
[31m-    ngx_chain_t           *cl, **ll;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    buf = &u->buffer;[m
[31m-[m
[31m-    buf->pos = buf->last;[m
[31m-    buf->last += bytes;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a chunk has been parsed successfully */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            b->flush = 1;[m
[31m-            b->memory = 1;[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->tag = u->output.tag;[m
[31m-[m
[31m-            if (buf->last - buf->pos >= ctx->chunked.size) {[m
[31m-                buf->pos += (size_t) ctx->chunked.size;[m
[31m-                b->last = buf->pos;[m
[31m-                ctx->chunked.size = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->chunked.size -= buf->last - buf->pos;[m
[31m-                buf->pos = buf->last;[m
[31m-                b->last = buf->last;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy out buf %p %z",[m
[31m-                           b->pos, b->last - b->pos);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-[m
[31m-            /* a whole response has been parsed successfully */[m
[31m-[m
[31m-            u->keepalive = !u->headers_in.connection_close;[m
[31m-            u->length = 0;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* invalid response */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid chunked response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* provide continuous buffer for subrequests in memory */[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-[m
[31m-        cl = u->out_bufs;[m
[31m-[m
[31m-        if (cl) {[m
[31m-            buf->pos = cl->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        buf->last = buf->pos;[m
[31m-[m
[31m-        for (cl = u->out_bufs; cl; cl = cl->next) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy in memory %p-%p %O",[m
[31m-                           cl->buf->pos, cl->buf->last, ngx_buf_size(cl->buf));[m
[31m-[m
[31m-            if (buf->last == cl->buf->pos) {[m
[31m-                buf->last = cl->buf->last;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_movemem(buf->last, cl->buf->pos,[m
[31m-                                    cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-            cl->buf->pos = buf->last - (cl->buf->last - cl->buf->pos);[m
[31m-            cl->buf->last = buf->last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http proxy request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http proxy request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_host_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ctx->vars.host_header.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ctx->vars.host_header.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_port_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ctx->vars.port.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ctx->vars.port.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t             len;[m
[31m-    u_char            *p;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    n = r->headers_in.x_forwarded_for.nelts;[m
[31m-    h = r->headers_in.x_forwarded_for.elts;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        len += h[i]->value.len + sizeof(", ") - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        v->len = r->connection->addr_text.len;[m
[31m-        v->data = r->connection->addr_text.data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len += r->connection->addr_text.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        p = ngx_copy(p, h[i]->value.data, h[i]->value.len);[m
[31m-        *p++ = ','; *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, r->connection->addr_text.data, r->connection->addr_text.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->internal_body_length < 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%O", ctx->internal_body_length) - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL || !ctx->internal_chunked) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = (u_char *) "chunked";[m
[31m-    v->len = sizeof("chunked") - 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    size_t prefix)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_proxy_rewrite_t   *pr;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    pr = plcf->redirects->elts;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    len = h->value.len - prefix;[m
[31m-[m
[31m-    for (i = 0; i < plcf->redirects->nelts; i++) {[m
[31m-        rc = pr[i].handler(r, h, prefix, len, &pr[i]);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r, ngx_table_elt_t *h)[m
[31m-{[m
[31m-    size_t                      prefix;[m
[31m-    u_char                     *p;[m
[31m-    ngx_int_t                   rc, rv;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    p = (u_char *) ngx_strchr(h->value.data, ';');[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    prefix = p + 1 - h->value.data;[m
[31m-[m
[31m-    rv = NGX_DECLINED;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (plcf->cookie_domains) {[m
[31m-        p = ngx_strcasestrn(h->value.data + prefix, "domain=", 7 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 7,[m
[31m-                                                     plcf->cookie_domains);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                rv = rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_paths) {[m
[31m-        p = ngx_strcasestrn(h->value.data + prefix, "path=", 5 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 5,[m
[31m-                                                     plcf->cookie_paths);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                rv = rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    u_char *value, ngx_array_t *rewrites)[m
[31m-{[m
[31m-    size_t                     len, prefix;[m
[31m-    u_char                    *p;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_proxy_rewrite_t  *pr;[m
[31m-[m
[31m-    prefix = value - h->value.data;[m
[31m-[m
[31m-    p = (u_char *) ngx_strchr(value, ';');[m
[31m-[m
[31m-    len = p ? (size_t) (p - value) : (h->value.len - prefix);[m
[31m-[m
[31m-    pr = rewrites->elts;[m
[31m-[m
[31m-    for (i = 0; i < rewrites->nelts; i++) {[m
[31m-        rc = pr[i].handler(r, h, prefix, len, &pr[i]);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    ngx_str_t  pattern, replacement;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pattern.len > len[m
[31m-        || ngx_rstrncmp(h->value.data + prefix, pattern.data,[m
[31m-                        pattern.len) != 0)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, pattern.len, &replacement);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    ngx_str_t  pattern, replacement;[m
[31m-[m
[31m-    pattern.len = len;[m
[31m-    pattern.data = h->value.data + prefix;[m
[31m-[m
[31m-    if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (prefix == 0 && h->value.len == len) {[m
[31m-        h->value = replacement;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    ngx_str_t   pattern, replacement;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = h->value.data + prefix;[m
[31m-[m
[31m-    if (p[0] == '.') {[m
[31m-        p++;[m
[31m-        prefix++;[m
[31m-        len--;[m
[31m-    }[m
[31m-[m
[31m-    if (pattern.len != len || ngx_rstrncasecmp(pattern.data, p, len) != 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite(ngx_http_request_t *r, ngx_table_elt_t *h, size_t prefix,[m
[31m-    size_t len, ngx_str_t *replacement)[m
[31m-{[m
[31m-    u_char  *p, *data;[m
[31m-    size_t   new_len;[m
[31m-[m
[31m-    new_len = replacement->len + h->value.len - len;[m
[31m-[m
[31m-    if (replacement->len > len) {[m
[31m-[m
[31m-        data = ngx_pnalloc(r->pool, new_len + 1);[m
[31m-        if (data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(data, h->value.data, prefix);[m
[31m-        p = ngx_copy(p, replacement->data, replacement->len);[m
[31m-[m
[31m-        ngx_memcpy(p, h->value.data + prefix + len,[m
[31m-                   h->value.len - len - prefix + 1);[m
[31m-[m
[31m-        h->value.data = data;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_copy(h->value.data + prefix, replacement->data,[m
[31m-                     replacement->len);[m
[31m-[m
[31m-        ngx_memmove(p, h->value.data + prefix + len,[m
[31m-                    h->value.len - len - prefix + 1);[m
[31m-    }[m
[31m-[m
[31m-    h->value.len = new_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_proxy_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_proxy_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_proxy_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_proxy_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.ignore_headers = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.cache_zone = NULL;[m
[31m-     *     conf->upstream.cache_use_stale = 0;[m
[31m-     *     conf->upstream.cache_methods = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.hide_headers_hash = { NULL, 0 };[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     *     conf->upstream.store_lengths = NULL;[m
[31m-     *     conf->upstream.store_values = NULL;[m
[31m-     *     conf->upstream.ssl_name = NULL;[m
[31m-     *[m
[31m-     *     conf->method = { 0, NULL };[m
[31m-     *     conf->headers_source = NULL;[m
[31m-     *     conf->headers.lengths = NULL;[m
[31m-     *     conf->headers.values = NULL;[m
[31m-     *     conf->headers.hash = { NULL, 0 };[m
[31m-     *     conf->headers_cache.lengths = NULL;[m
[31m-     *     conf->headers_cache.values = NULL;[m
[31m-     *     conf->headers_cache.hash = { NULL, 0 };[m
[31m-     *     conf->body_lengths = NULL;[m
[31m-     *     conf->body_values = NULL;[m
[31m-     *     conf->body_source = { 0, NULL };[m
[31m-     *     conf->redirects = NULL;[m
[31m-     *     conf->ssl = 0;[m
[31m-     *     conf->ssl_protocols = 0;[m
[31m-     *     conf->ssl_ciphers = { 0, NULL };[m
[31m-     *     conf->ssl_trusted_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_crl = { 0, NULL };[m
[31m-     *     conf->ssl_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_certificate_key = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_convert_head = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_server_name = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_verify = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->ssl_passwords = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    /* "proxy_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->redirect = NGX_CONF_UNSET;[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    conf->cookie_domains = NGX_CONF_UNSET_PTR;[m
[31m-    conf->cookie_paths = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->http_version = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->headers_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    conf->headers_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "proxy");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *prev = parent;[m
[31m-    ngx_http_proxy_loc_conf_t *conf = child;[m
[31m-[m
[31m-    u_char                     *p;[m
[31m-    size_t                      size;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_hash_init_t             hash;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_proxy_rewrite_t   *pr;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store,[m
[31m-                              prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"proxy_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-                                         conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_busy_buffers_size\" must be equal to or greater than "[m
[31m-             "the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_busy_buffers_size\" must be less than "[m
[31m-             "the size of all \"proxy_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-                                      conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_temp_file_write_size\" must be equal to or greater "[m
[31m-             "than the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-                                        conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_max_temp_file_size\" must be equal to zero to disable "[m
[31m-             "temporary files usage or must be equal to or greater than "[m
[31m-             "the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                              prev->upstream.ignore_headers,[m
[31m-                              NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                              prev->upstream.temp_path,[m
[31m-                              &ngx_http_proxy_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"proxy_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_convert_head,[m
[31m-                              prev->upstream.cache_convert_head, 1);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->method, prev->method, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                              prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                              prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                              prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_session_reuse,[m
[31m-                              prev->upstream.ssl_session_reuse, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                                  |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,[m
[31m-                             "DEFAULT");[m
[31m-[m
[31m-    if (conf->upstream.ssl_name == NULL) {[m
[31m-        conf->upstream.ssl_name = prev->upstream.ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_server_name,[m
[31m-                              prev->upstream.ssl_server_name, 0);[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_verify,[m
[31m-                              prev->upstream.ssl_verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                              prev->ssl_trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate,[m
[31m-                              prev->ssl_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate_key,[m
[31m-                              prev->ssl_certificate_key, "");[m
[31m-    ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);[m
[31m-[m
[31m-    if (conf->ssl && ngx_http_proxy_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->redirect, prev->redirect, 1);[m
[31m-[m
[31m-    if (conf->redirect) {[m
[31m-[m
[31m-        if (conf->redirects == NULL) {[m
[31m-            conf->redirects = prev->redirects;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->redirects == NULL && conf->url.data) {[m
[31m-[m
[31m-            conf->redirects = ngx_array_create(cf->pool, 1,[m
[31m-                                             sizeof(ngx_http_proxy_rewrite_t));[m
[31m-            if (conf->redirects == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pr = ngx_array_push(conf->redirects);[m
[31m-            if (pr == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(&pr->pattern.complex,[m
[31m-                        sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-            ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-            pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-[m
[31m-            if (conf->vars.uri.len) {[m
[31m-                pr->pattern.complex.value = conf->url;[m
[31m-                pr->replacement.value = conf->location;[m
[31m-[m
[31m-            } else {[m
[31m-                pr->pattern.complex.value.len = conf->url.len[m
[31m-                                                + sizeof("/") - 1;[m
[31m-[m
[31m-                p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);[m
[31m-                if (p == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                pr->pattern.complex.value.data = p;[m
[31m-[m
[31m-                p = ngx_cpymem(p, conf->url.data, conf->url.len);[m
[31m-                *p = '/';[m
[31m-[m
[31m-                ngx_str_set(&pr->replacement.value, "/");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->cookie_domains, prev->cookie_domains, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->cookie_paths, prev->cookie_paths, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->http_version, prev->http_version,[m
[31m-                              NGX_HTTP_VERSION_10);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->headers_hash_max_size,[m
[31m-                              prev->headers_hash_max_size, 512);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->headers_hash_bucket_size,[m
[31m-                              prev->headers_hash_bucket_size, 64);[m
[31m-[m
[31m-    conf->headers_hash_bucket_size = ngx_align(conf->headers_hash_bucket_size,[m
[31m-                                               ngx_cacheline_size);[m
[31m-[m
[31m-    hash.max_size = conf->headers_hash_max_size;[m
[31m-    hash.bucket_size = conf->headers_hash_bucket_size;[m
[31m-    hash.name = "proxy_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_proxy_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->proxy_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->location = prev->location;[m
[31m-        conf->vars = prev->vars;[m
[31m-[m
[31m-        conf->proxy_lengths = prev->proxy_lengths;[m
[31m-        conf->proxy_values = prev->proxy_values;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        conf->upstream.ssl = prev->upstream.ssl;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->proxy_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_proxy_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_source.data == NULL) {[m
[31m-        conf->body_flushes = prev->body_flushes;[m
[31m-        conf->body_source = prev->body_source;[m
[31m-        conf->body_lengths = prev->body_lengths;[m
[31m-        conf->body_values = prev->body_values;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_source.data && conf->body_lengths == NULL) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &conf->body_source;[m
[31m-        sc.flushes = &conf->body_flushes;[m
[31m-        sc.lengths = &conf->body_lengths;[m
[31m-        sc.values = &conf->body_values;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers_source == NULL) {[m
[31m-        conf->headers = prev->headers;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->headers_cache = prev->headers_cache;[m
[31m-#endif[m
[31m-        conf->headers_source = prev->headers_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers,[m
[31m-                                     ngx_http_proxy_headers);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers_cache,[m
[31m-                                         ngx_http_proxy_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_init_headers(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf,[m
[31m-    ngx_http_proxy_headers_t *headers, ngx_keyval_t *default_headers)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_array_t                   headers_names, headers_merged;[m
[31m-    ngx_keyval_t                 *src, *s, *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (headers->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers_source == NULL) {[m
[31m-        conf->headers_source = ngx_array_create(cf->pool, 4,[m
[31m-                                                sizeof(ngx_keyval_t));[m
[31m-        if (conf->headers_source == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    headers->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (headers->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    headers->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (headers->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    src = conf->headers_source->elts;[m
[31m-    for (i = 0; i < conf->headers_source->nelts; i++) {[m
[31m-[m
[31m-        s = ngx_array_push(&headers_merged);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = src[i];[m
[31m-    }[m
[31m-[m
[31m-    h = default_headers;[m
[31m-[m
[31m-    while (h->key.len) {[m
[31m-[m
[31m-        src = headers_merged.elts;[m
[31m-        for (i = 0; i < headers_merged.nelts; i++) {[m
[31m-            if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        s = ngx_array_push(&headers_merged);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = *h;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        h++;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    src = headers_merged.elts;[m
[31m-    for (i = 0; i < headers_merged.nelts; i++) {[m
[31m-[m
[31m-        hk = ngx_array_push(&headers_names);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = src[i].key;[m
[31m-        hk->key_hash = ngx_hash_key_lc(src[i].key.data, src[i].key.len);[m
[31m-        hk->value = (void *) 1;[m
[31m-[m
[31m-        if (src[i].value.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_script_variables_count(&src[i].value) == 0) {[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1[m
[31m-                        + src[i].value.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                       + src[i].key.len + sizeof(": ") - 1[m
[31m-                       + src[i].value.len + sizeof(CRLF) - 1[m
[31m-                       + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1[m
[31m-                        + src[i].value.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-[m
[31m-            p = ngx_cpymem(p, src[i].key.data, src[i].key.len);[m
[31m-            *p++ = ':'; *p++ = ' ';[m
[31m-            p = ngx_cpymem(p, src[i].value.data, src[i].value.len);[m
[31m-            *p++ = CR; *p = LF;[m
[31m-[m
[31m-        } else {[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                    + src[i].key.len + sizeof(": ") - 1 + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-            p = ngx_cpymem(p, src[i].key.data, src[i].key.len);[m
[31m-            *p++ = ':'; *p = ' ';[m
[31m-[m
[31m-[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &src[i].value;[m
[31m-            sc.flushes = &headers->flushes;[m
[31m-            sc.lengths = &headers->lengths;[m
[31m-            sc.values = &headers->values;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = sizeof(CRLF) - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                    + sizeof(CRLF) - 1 + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = sizeof(CRLF) - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-            *p++ = CR; *p = LF;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-        code = ngx_array_push_n(headers->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-    hash.hash = &headers->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = conf->headers_hash_max_size;[m
[31m-    hash.bucket_size = conf->headers_hash_bucket_size;[m
[31m-    hash.name = "proxy_headers_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    size_t                      add;[m
[31m-    u_short                     port;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (plcf->upstream.upstream || plcf->proxy_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_proxy_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &plcf->proxy_lengths;[m
[31m-        sc.values = &plcf->proxy_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        plcf->ssl = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncasecmp(url->data, (u_char *) "http://", 7) == 0) {[m
[31m-        add = 7;[m
[31m-        port = 80;[m
[31m-[m
[31m-    } else if (ngx_strncasecmp(url->data, (u_char *) "https://", 8) == 0) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        plcf->ssl = 1;[m
[31m-[m
[31m-        add = 8;[m
[31m-        port = 443;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "https protocol requires SSL support");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid URL prefix");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url.len = url->len - add;[m
[31m-    u.url.data = url->data + add;[m
[31m-    u.default_port = port;[m
[31m-    u.uri_part = 1;[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    plcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (plcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    plcf->vars.schema.len = add;[m
[31m-    plcf->vars.schema.data = url->data;[m
[31m-    plcf->vars.key_start = plcf->vars.schema;[m
[31m-[m
[31m-    ngx_http_proxy_set_vars(&u, &plcf->vars);[m
[31m-[m
[31m-    plcf->location = clcf->name;[m
[31m-[m
[31m-    if (clcf->named[m
[31m-#if (NGX_PCRE)[m
[31m-        || clcf->regex[m
[31m-#endif[m
[31m-        || clcf->noname)[m
[31m-    {[m
[31m-        if (plcf->vars.uri.len) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_pass\" cannot have URI part in "[m
[31m-                               "location given by regular expression, "[m
[31m-                               "or inside named location, "[m
[31m-                               "or inside \"if\" statement, "[m
[31m-                               "or inside \"limit_except\" block");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        plcf->location.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    plcf->url = *url;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->redirect == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    plcf->redirect = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->redirect = 0;[m
[31m-            plcf->redirects = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "false") == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid parameter \"false\", use \"off\" instead");[m
[31m-            plcf->redirect = 0;[m
[31m-            plcf->redirects = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "default") != 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->redirects == NULL) {[m
[31m-        plcf->redirects = ngx_array_create(cf->pool, 1,[m
[31m-                                           sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->redirects == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->redirects);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "default") == 0) {[m
[31m-        if (plcf->proxy_lengths) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_redirect default\" cannot be used "[m
[31m-                               "with \"proxy_pass\" directive with variables");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (plcf->url.data == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_redirect default\" should be placed "[m
[31m-                               "after the \"proxy_pass\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-[m
[31m-        ngx_memzero(&pr->pattern.complex, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        if (plcf->vars.uri.len) {[m
[31m-            pr->pattern.complex.value = plcf->url;[m
[31m-            pr->replacement.value = plcf->location;[m
[31m-[m
[31m-        } else {[m
[31m-            pr->pattern.complex.value.len = plcf->url.len + sizeof("/") - 1;[m
[31m-[m
[31m-            p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pr->pattern.complex.value.data = p;[m
[31m-[m
[31m-            p = ngx_cpymem(p, plcf->url.data, plcf->url.len);[m
[31m-            *p = '/';[m
[31m-[m
[31m-            ngx_str_set(&pr->replacement.value, "/");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (value[1].data[0] == '*') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->cookie_domains == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->cookie_domains = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_domains == NGX_CONF_UNSET_PTR) {[m
[31m-        plcf->cookie_domains = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->cookie_domains == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->cookie_domains);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (value[1].data[0] == '.') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_domain_handler;[m
[31m-[m
[31m-        if (value[2].data[0] == '.') {[m
[31m-            value[2].len--;[m
[31m-            value[2].data++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->cookie_paths == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->cookie_paths = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_paths == NGX_CONF_UNSET_PTR) {[m
[31m-        plcf->cookie_paths = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->cookie_paths == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->cookie_paths);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (value[1].data[0] == '*') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_regex(ngx_conf_t *cf, ngx_http_proxy_rewrite_t *pr,[m
[31m-    ngx_str_t *regex, ngx_uint_t caseless)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    u_char               errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    ngx_regex_compile_t  rc;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *regex;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    if (caseless) {[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-    }[m
[31m-[m
[31m-    pr->pattern.regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (pr->pattern.regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->handler = ngx_http_proxy_rewrite_regex_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "using regex \"%V\" requires PCRE library", regex);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (plcf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        plcf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (plcf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"proxy_cache\"";[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    plcf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &plcf->upstream.store_lengths;[m
[31m-    sc.values = &plcf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        plcf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"proxy_store\"";[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        plcf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (plcf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *plcf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                      &ngx_http_proxy_module);[m
[31m-    if (plcf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &plcf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (plcf->ssl_passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    plcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (plcf->ssl_passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"proxy_send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"proxy_send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_set_ssl(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *plcf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    plcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (plcf->upstream.ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(plcf->upstream.ssl, plcf->ssl_protocols, NULL)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = plcf->upstream.ssl;[m
[31m-[m
[31m-    if (plcf->ssl_certificate.len) {[m
[31m-[m
[31m-        if (plcf->ssl_certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"proxy_ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &plcf->ssl_certificate);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_certificate(cf, plcf->upstream.ssl, &plcf->ssl_certificate,[m
[31m-                                &plcf->ssl_certificate_key, plcf->ssl_passwords)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(plcf->upstream.ssl->ctx,[m
[31m-                                (const char *) plcf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &plcf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->upstream.ssl_verify) {[m
[31m-        if (plcf->ssl_trusted_certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no proxy_ssl_trusted_certificate for proxy_ssl_verify");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, plcf->upstream.ssl,[m
[31m-                                        &plcf->ssl_trusted_certificate,[m
[31m-                                        plcf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, plcf->upstream.ssl, &plcf->ssl_crl) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v)[m
[31m-{[m
[31m-    if (u->family != AF_UNIX) {[m
[31m-[m
[31m-        if (u->no_port || u->port == u->default_port) {[m
[31m-[m
[31m-            v->host_header = u->host;[m
[31m-[m
[31m-            if (u->default_port == 80) {[m
[31m-                ngx_str_set(&v->port, "80");[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_str_set(&v->port, "443");[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            v->host_header.len = u->host.len + 1 + u->port_text.len;[m
[31m-            v->host_header.data = u->host.data;[m
[31m-            v->port = u->port_text;[m
[31m-        }[m
[31m-[m
[31m-        v->key_start.len += v->host_header.len;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&v->host_header, "localhost");[m
[31m-        ngx_str_null(&v->port);[m
[31m-        v->key_start.len += sizeof("unix:") - 1 + u->host.len + 1;[m
[31m-    }[m
[31m-[m
[31m-    v->uri = u->uri;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_random_index_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_random_index_module.c[m
[1mdeleted file mode 100644[m
[1mindex b47ee4f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_random_index_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,317 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t  enable;[m
[31m-} ngx_http_random_index_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_RANDOM_INDEX_PREALLOCATE  50[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_random_index_error(ngx_http_request_t *r,[m
[31m-    ngx_dir_t *dir, ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_random_index_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_random_index_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_random_index_commands[] = {[m
[31m-[m
[31m-    { ngx_string("random_index"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_random_index_loc_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_random_index_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_random_index_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_random_index_create_loc_conf, /* create location configuration */[m
[31m-    ngx_http_random_index_merge_loc_conf   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_random_index_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_random_index_module_ctx,     /* module context */[m
[31m-    ngx_http_random_index_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_random_index_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                            *last, *filename;[m
[31m-    size_t                             len, allocated, root;[m
[31m-    ngx_err_t                          err;[m
[31m-    ngx_int_t                          rc;[m
[31m-    ngx_str_t                          path, uri, *name;[m
[31m-    ngx_dir_t                          dir;[m
[31m-    ngx_uint_t                         n, level;[m
[31m-    ngx_array_t                        names;[m
[31m-    ngx_http_random_index_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_random_index_module);[m
[31m-[m
[31m-    if (!rlcf->enable) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_D_TYPE)[m
[31m-    len = NGX_DIR_MASK_LEN;[m
[31m-#else[m
[31m-    len = NGX_HTTP_RANDOM_INDEX_PREALLOCATE;[m
[31m-#endif[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root, len);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    allocated = path.len;[m
[31m-[m
[31m-    path.len = last - path.data - 1;[m
[31m-    path.data[path.len] = '\0';[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http random index: \"%s\"", path.data);[m
[31m-[m
[31m-    if (ngx_open_dir(&path, &dir) == NGX_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT[m
[31m-            || err == NGX_ENOTDIR[m
[31m-            || err == NGX_ENAMETOOLONG)[m
[31m-        {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-        } else if (err == NGX_EACCES) {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, r->connection->log, err,[m
[31m-                      ngx_open_dir_n " \"%s\" failed", path.data);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&names, r->pool, 32, sizeof(ngx_str_t)) != NGX_OK) {[m
[31m-        return ngx_http_random_index_error(r, &dir, &path);[m
[31m-    }[m
[31m-[m
[31m-    filename = path.data;[m
[31m-    filename[path.len] = '/';[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_set_errno(0);[m
[31m-[m
[31m-        if (ngx_read_dir(&dir) == NGX_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err != NGX_ENOMOREFILES) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                              ngx_read_dir_n " \"%V\" failed", &path);[m
[31m-                return ngx_http_random_index_error(r, &dir, &path);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http random index file: \"%s\"", ngx_de_name(&dir));[m
[31m-[m
[31m-        if (ngx_de_name(&dir)[0] == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_de_namelen(&dir);[m
[31m-[m
[31m-        if (dir.type == 0 || ngx_de_is_link(&dir)) {[m
[31m-[m
[31m-            /* 1 byte for '/' and 1 byte for terminating '\0' */[m
[31m-[m
[31m-            if (path.len + 1 + len + 1 > allocated) {[m
[31m-                allocated = path.len + 1 + len + 1[m
[31m-                                     + NGX_HTTP_RANDOM_INDEX_PREALLOCATE;[m
[31m-[m
[31m-                filename = ngx_pnalloc(r->pool, allocated);[m
[31m-                if (filename == NULL) {[m
[31m-                    return ngx_http_random_index_error(r, &dir, &path);[m
[31m-                }[m
[31m-[m
[31m-                last = ngx_cpystrn(filename, path.data, path.len + 1);[m
[31m-                *last++ = '/';[m
[31m-            }[m
[31m-[m
[31m-            ngx_cpystrn(last, ngx_de_name(&dir), len + 1);[m
[31m-[m
[31m-            if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                if (err != NGX_ENOENT) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                                  ngx_de_info_n " \"%s\" failed", filename);[m
[31m-                    return ngx_http_random_index_error(r, &dir, &path);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                                  ngx_de_link_info_n " \"%s\" failed",[m
[31m-                                  filename);[m
[31m-                    return ngx_http_random_index_error(r, &dir, &path);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!ngx_de_is_file(&dir)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        name = ngx_array_push(&names);[m
[31m-        if (name == NULL) {[m
[31m-            return ngx_http_random_index_error(r, &dir, &path);[m
[31m-        }[m
[31m-[m
[31m-        name->len = len;[m
[31m-[m
[31m-        name->data = ngx_pnalloc(r->pool, len);[m
[31m-        if (name->data == NULL) {[m
[31m-            return ngx_http_random_index_error(r, &dir, &path);[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(name->data, ngx_de_name(&dir), len);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_dir(&dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%V\" failed", &path);[m
[31m-    }[m
[31m-[m
[31m-    n = names.nelts;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    name = names.elts;[m
[31m-[m
[31m-    n = (ngx_uint_t) (((uint64_t) ngx_random() * n) / 0x80000000);[m
[31m-[m
[31m-    uri.len = r->uri.len + name[n].len;[m
[31m-[m
[31m-    uri.data = ngx_pnalloc(r->pool, uri.len);[m
[31m-    if (uri.data == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_copy(uri.data, r->uri.data, r->uri.len);[m
[31m-    ngx_memcpy(last, name[n].data, name[n].len);[m
[31m-[m
[31m-    return ngx_http_internal_redirect(r, &uri, &r->args);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_random_index_error(ngx_http_request_t *r, ngx_dir_t *dir,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    if (ngx_close_dir(dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%V\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_random_index_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_random_index_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_random_index_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_random_index_loc_conf_t *prev = parent;[m
[31m-    ngx_http_random_index_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_random_index_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_random_index_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_range_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_range_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 57065e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_range_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,919 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * the single part format:[m
[31m- *[m
[31m- * "HTTP/1.0 206 Partial Content" CRLF[m
[31m- * ... header ...[m
[31m- * "Content-Type: image/jpeg" CRLF[m
[31m- * "Content-Length: SIZE" CRLF[m
[31m- * "Content-Range: bytes START-END/SIZE" CRLF[m
[31m- * CRLF[m
[31m- * ... data ...[m
[31m- *[m
[31m- *[m
[31m- * the multipart format:[m
[31m- *[m
[31m- * "HTTP/1.0 206 Partial Content" CRLF[m
[31m- * ... header ...[m
[31m- * "Content-Type: multipart/byteranges; boundary=0123456789" CRLF[m
[31m- * CRLF[m
[31m- * CRLF[m
[31m- * "--0123456789" CRLF[m
[31m- * "Content-Type: image/jpeg" CRLF[m
[31m- * "Content-Range: bytes START0-END0/SIZE" CRLF[m
[31m- * CRLF[m
[31m- * ... data ...[m
[31m- * CRLF[m
[31m- * "--0123456789" CRLF[m
[31m- * "Content-Type: image/jpeg" CRLF[m
[31m- * "Content-Range: bytes START1-END1/SIZE" CRLF[m
[31m- * CRLF[m
[31m- * ... data ...[m
[31m- * CRLF[m
[31m- * "--0123456789--" CRLF[m
[31m- */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t        start;[m
[31m-    off_t        end;[m
[31m-    ngx_str_t    content_range;[m
[31m-} ngx_http_range_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t        offset;[m
[31m-    ngx_str_t    boundary_header;[m
[31m-    ngx_array_t  ranges;[m
[31m-} ngx_http_range_filter_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_range_parse(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_uint_t ranges);[m
[31m-static ngx_int_t ngx_http_range_singlepart_header(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_range_multipart_header(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_range_not_satisfiable(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_range_test_overlapped(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_range_singlepart_body(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_range_multipart_body(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);[m
[31m-[m
[31m-static ngx_int_t ngx_http_range_header_filter_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_range_body_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_range_header_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_range_header_filter_init,     /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_range_header_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_range_header_filter_module_ctx, /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_range_body_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_range_body_filter_init,       /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_range_body_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_range_body_filter_module_ctx, /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                        if_range_time;[m
[31m-    ngx_str_t                    *if_range, *etag;[m
[31m-    ngx_uint_t                    ranges;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_range_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10[m
[31m-        || r->headers_out.status != NGX_HTTP_OK[m
[31m-        || (r != r->main && !r->subrequest_ranges)[m
[31m-        || r->headers_out.content_length_n == -1[m
[31m-        || !r->allow_ranges)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->max_ranges == 0) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.range == NULL[m
[31m-        || r->headers_in.range->value.len < 7[m
[31m-        || ngx_strncasecmp(r->headers_in.range->value.data,[m
[31m-                           (u_char *) "bytes=", 6)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        goto next_filter;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.if_range) {[m
[31m-[m
[31m-        if_range = &r->headers_in.if_range->value;[m
[31m-[m
[31m-        if (if_range->len >= 2 && if_range->data[if_range->len - 1] == '"') {[m
[31m-[m
[31m-            if (r->headers_out.etag == NULL) {[m
[31m-                goto next_filter;[m
[31m-            }[m
[31m-[m
[31m-            etag = &r->headers_out.etag->value;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http ir:%V etag:%V", if_range, etag);[m
[31m-[m
[31m-            if (if_range->len != etag->len[m
[31m-                || ngx_strncmp(if_range->data, etag->data, etag->len) != 0)[m
[31m-            {[m
[31m-                goto next_filter;[m
[31m-            }[m
[31m-[m
[31m-            goto parse;[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_out.last_modified_time == (time_t) -1) {[m
[31m-            goto next_filter;[m
[31m-        }[m
[31m-[m
[31m-        if_range_time = ngx_parse_http_time(if_range->data, if_range->len);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http ir:%T lm:%T",[m
[31m-                       if_range_time, r->headers_out.last_modified_time);[m
[31m-[m
[31m-        if (if_range_time != r->headers_out.last_modified_time) {[m
[31m-            goto next_filter;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-parse:[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->offset = r->headers_out.content_offset;[m
[31m-[m
[31m-    if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_range_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ranges = r->single_range ? 1 : clcf->max_ranges;[m
[31m-[m
[31m-    switch (ngx_http_range_parse(r, ctx, ranges)) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module);[m
[31m-[m
[31m-        r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT;[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-[m
[31m-        if (ctx->ranges.nelts == 1) {[m
[31m-            return ngx_http_range_singlepart_header(r, ctx);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_range_multipart_header(r, ctx);[m
[31m-[m
[31m-    case NGX_HTTP_RANGE_NOT_SATISFIABLE:[m
[31m-        return ngx_http_range_not_satisfiable(r);[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    default: /* NGX_DECLINED */[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-next_filter:[m
[31m-[m
[31m-    r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (r->headers_out.accept_ranges == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.accept_ranges->hash = 1;[m
[31m-    ngx_str_set(&r->headers_out.accept_ranges->key, "Accept-Ranges");[m
[31m-    ngx_str_set(&r->headers_out.accept_ranges->value, "bytes");[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_parse(ngx_http_request_t *r, ngx_http_range_filter_ctx_t *ctx,[m
[31m-    ngx_uint_t ranges)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    off_t                         start, end, size, content_length, cutoff,[m
[31m-                                  cutlim;[m
[31m-    ngx_uint_t                    suffix;[m
[31m-    ngx_http_range_t             *range;[m
[31m-    ngx_http_range_filter_ctx_t  *mctx;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        mctx = ngx_http_get_module_ctx(r->main,[m
[31m-                                       ngx_http_range_body_filter_module);[m
[31m-        if (mctx) {[m
[31m-            ctx->ranges = mctx->ranges;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = r->headers_in.range->value.data + 6;[m
[31m-    size = 0;[m
[31m-    content_length = r->headers_out.content_length_n;[m
[31m-[m
[31m-    cutoff = NGX_MAX_OFF_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_OFF_T_VALUE % 10;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        start = 0;[m
[31m-        end = 0;[m
[31m-        suffix = 0;[m
[31m-[m
[31m-        while (*p == ' ') { p++; }[m
[31m-[m
[31m-        if (*p != '-') {[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-            }[m
[31m-[m
[31m-            while (*p >= '0' && *p <= '9') {[m
[31m-                if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {[m
[31m-                    return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-                }[m
[31m-[m
[31m-                start = start * 10 + *p++ - '0';[m
[31m-            }[m
[31m-[m
[31m-            while (*p == ' ') { p++; }[m
[31m-[m
[31m-            if (*p++ != '-') {[m
[31m-                return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-            }[m
[31m-[m
[31m-            while (*p == ' ') { p++; }[m
[31m-[m
[31m-            if (*p == ',' || *p == '\0') {[m
[31m-                end = content_length;[m
[31m-                goto found;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            suffix = 1;[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-        }[m
[31m-[m
[31m-        while (*p >= '0' && *p <= '9') {[m
[31m-            if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) {[m
[31m-                return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-            }[m
[31m-[m
[31m-            end = end * 10 + *p++ - '0';[m
[31m-        }[m
[31m-[m
[31m-        while (*p == ' ') { p++; }[m
[31m-[m
[31m-        if (*p != ',' && *p != '\0') {[m
[31m-            return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-        }[m
[31m-[m
[31m-        if (suffix) {[m
[31m-            start = content_length - end;[m
[31m-            end = content_length - 1;[m
[31m-        }[m
[31m-[m
[31m-        if (end >= content_length) {[m
[31m-            end = content_length;[m
[31m-[m
[31m-        } else {[m
[31m-            end++;[m
[31m-        }[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        if (start < end) {[m
[31m-            range = ngx_array_push(&ctx->ranges);[m
[31m-            if (range == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            range->start = start;[m
[31m-            range->end = end;[m
[31m-[m
[31m-            size += end - start;[m
[31m-[m
[31m-            if (ranges-- == 0) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (*p++ != ',') {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ranges.nelts == 0) {[m
[31m-        return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-    }[m
[31m-[m
[31m-    if (size > content_length) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_singlepart_header(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_table_elt_t   *content_range;[m
[31m-    ngx_http_range_t  *range;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    content_range = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (content_range == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_range = content_range;[m
[31m-[m
[31m-    content_range->hash = 1;[m
[31m-    ngx_str_set(&content_range->key, "Content-Range");[m
[31m-[m
[31m-    content_range->value.data = ngx_pnalloc(r->pool,[m
[31m-                                    sizeof("bytes -/") - 1 + 3 * NGX_OFF_T_LEN);[m
[31m-    if (content_range->value.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* "Content-Range: bytes SSSS-EEEE/TTTT" header */[m
[31m-[m
[31m-    range = ctx->ranges.elts;[m
[31m-[m
[31m-    content_range->value.len = ngx_sprintf(content_range->value.data,[m
[31m-                                           "bytes %O-%O/%O",[m
[31m-                                           range->start, range->end - 1,[m
[31m-                                           r->headers_out.content_length_n)[m
[31m-                               - content_range->value.data;[m
[31m-[m
[31m-    r->headers_out.content_length_n = range->end - range->start;[m
[31m-    r->headers_out.content_offset = range->start;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_multipart_header(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t              len;[m
[31m-    ngx_uint_t          i;[m
[31m-    ngx_http_range_t   *range;[m
[31m-    ngx_atomic_uint_t   boundary;[m
[31m-[m
[31m-    len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN[m
[31m-          + sizeof(CRLF "Content-Type: ") - 1[m
[31m-          + r->headers_out.content_type.len[m
[31m-          + sizeof(CRLF "Content-Range: bytes ") - 1;[m
[31m-[m
[31m-    if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-        && r->headers_out.charset.len)[m
[31m-    {[m
[31m-        len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-    }[m
[31m-[m
[31m-    ctx->boundary_header.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (ctx->boundary_header.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    boundary = ngx_next_temp_number(0);[m
[31m-[m
[31m-    /*[m
[31m-     * The boundary header of the range:[m
[31m-     * CRLF[m
[31m-     * "--0123456789" CRLF[m
[31m-     * "Content-Type: image/jpeg" CRLF[m
[31m-     * "Content-Range: bytes "[m
[31m-     */[m
[31m-[m
[31m-    if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-        && r->headers_out.charset.len)[m
[31m-    {[m
[31m-        ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,[m
[31m-                                           CRLF "--%0muA" CRLF[m
[31m-                                           "Content-Type: %V; charset=%V" CRLF[m
[31m-                                           "Content-Range: bytes ",[m
[31m-                                           boundary,[m
[31m-                                           &r->headers_out.content_type,[m
[31m-                                           &r->headers_out.charset)[m
[31m-                                   - ctx->boundary_header.data;[m
[31m-[m
[31m-    } else if (r->headers_out.content_type.len) {[m
[31m-        ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,[m
[31m-                                           CRLF "--%0muA" CRLF[m
[31m-                                           "Content-Type: %V" CRLF[m
[31m-                                           "Content-Range: bytes ",[m
[31m-                                           boundary,[m
[31m-                                           &r->headers_out.content_type)[m
[31m-                                   - ctx->boundary_header.data;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,[m
[31m-                                           CRLF "--%0muA" CRLF[m
[31m-                                           "Content-Range: bytes ",[m
[31m-                                           boundary)[m
[31m-                                   - ctx->boundary_header.data;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type.data =[m
[31m-        ngx_pnalloc(r->pool,[m
[31m-                    sizeof("Content-Type: multipart/byteranges; boundary=") - 1[m
[31m-                    + NGX_ATOMIC_T_LEN);[m
[31m-[m
[31m-    if (r->headers_out.content_type.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    /* "Content-Type: multipart/byteranges; boundary=0123456789" */[m
[31m-[m
[31m-    r->headers_out.content_type.len =[m
[31m-                           ngx_sprintf(r->headers_out.content_type.data,[m
[31m-                                       "multipart/byteranges; boundary=%0muA",[m
[31m-                                       boundary)[m
[31m-                           - r->headers_out.content_type.data;[m
[31m-[m
[31m-    r->headers_out.content_type_len = r->headers_out.content_type.len;[m
[31m-[m
[31m-    r->headers_out.charset.len = 0;[m
[31m-[m
[31m-    /* the size of the last boundary CRLF "--0123456789--" CRLF */[m
[31m-[m
[31m-    len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN + sizeof("--" CRLF) - 1;[m
[31m-[m
[31m-    range = ctx->ranges.elts;[m
[31m-    for (i = 0; i < ctx->ranges.nelts; i++) {[m
[31m-[m
[31m-        /* the size of the range: "SSSS-EEEE/TTTT" CRLF CRLF */[m
[31m-[m
[31m-        range[i].content_range.data =[m
[31m-                               ngx_pnalloc(r->pool, 3 * NGX_OFF_T_LEN + 2 + 4);[m
[31m-[m
[31m-        if (range[i].content_range.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        range[i].content_range.len = ngx_sprintf(range[i].content_range.data,[m
[31m-                                               "%O-%O/%O" CRLF CRLF,[m
[31m-                                               range[i].start, range[i].end - 1,[m
[31m-                                               r->headers_out.content_length_n)[m
[31m-                                     - range[i].content_range.data;[m
[31m-[m
[31m-        len += ctx->boundary_header.len + range[i].content_range.len[m
[31m-                                    + (size_t) (range[i].end - range[i].start);[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = len;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_not_satisfiable(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t  *content_range;[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-[m
[31m-    content_range = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (content_range == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_range = content_range;[m
[31m-[m
[31m-    content_range->hash = 1;[m
[31m-    ngx_str_set(&content_range->key, "Content-Range");[m
[31m-[m
[31m-    content_range->value.data = ngx_pnalloc(r->pool,[m
[31m-                                       sizeof("bytes */") - 1 + NGX_OFF_T_LEN);[m
[31m-    if (content_range->value.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    content_range->value.len = ngx_sprintf(content_range->value.data,[m
[31m-                                           "bytes */%O",[m
[31m-                                           r->headers_out.content_length_n)[m
[31m-                               - content_range->value.data;[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-[m
[31m-    return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_range_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_range_body_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ranges.nelts == 1) {[m
[31m-        return ngx_http_range_singlepart_body(r, ctx, in);[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * multipart ranges are supported only if whole body is in a single buffer[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_buf_special(in->buf)) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_range_test_overlapped(r, ctx, in) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_range_multipart_body(r, ctx, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_test_overlapped(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    off_t              start, last;[m
[31m-    ngx_buf_t         *buf;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_http_range_t  *range;[m
[31m-[m
[31m-    if (ctx->offset) {[m
[31m-        goto overlapped;[m
[31m-    }[m
[31m-[m
[31m-    buf = in->buf;[m
[31m-[m
[31m-    if (!buf->last_buf) {[m
[31m-        start = ctx->offset;[m
[31m-        last = ctx->offset + ngx_buf_size(buf);[m
[31m-[m
[31m-        range = ctx->ranges.elts;[m
[31m-        for (i = 0; i < ctx->ranges.nelts; i++) {[m
[31m-            if (start > range[i].start || last < range[i].end) {[m
[31m-                goto overlapped;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->offset = ngx_buf_size(buf);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-overlapped:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                  "range in overlapped buffers");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_singlepart_body(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    off_t              start, last;[m
[31m-    ngx_buf_t         *buf;[m
[31m-    ngx_chain_t       *out, *cl, **ll;[m
[31m-    ngx_http_range_t  *range;[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-    range = ctx->ranges.elts;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        buf = cl->buf;[m
[31m-[m
[31m-        start = ctx->offset;[m
[31m-        last = ctx->offset + ngx_buf_size(buf);[m
[31m-[m
[31m-        ctx->offset = last;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http range body buf: %O-%O", start, last);[m
[31m-[m
[31m-        if (ngx_buf_special(buf)) {[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (range->end <= start || range->start >= last) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http range body skip");[m
[31m-[m
[31m-            if (buf->in_file) {[m
[31m-                buf->file_pos = buf->file_last;[m
[31m-            }[m
[31m-[m
[31m-            buf->pos = buf->last;[m
[31m-            buf->sync = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (range->start > start) {[m
[31m-[m
[31m-            if (buf->in_file) {[m
[31m-                buf->file_pos += range->start - start;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_in_memory(buf)) {[m
[31m-                buf->pos += (size_t) (range->start - start);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (range->end <= last) {[m
[31m-[m
[31m-            if (buf->in_file) {[m
[31m-                buf->file_last -= last - range->end;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_in_memory(buf)) {[m
[31m-                buf->last -= (size_t) (last - range->end);[m
[31m-            }[m
[31m-[m
[31m-            buf->last_buf = 1;[m
[31m-            *ll = cl;[m
[31m-            cl->next = NULL;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_multipart_body(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_buf_t         *b, *buf;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_chain_t       *out, *hcl, *rcl, *dcl, **ll;[m
[31m-    ngx_http_range_t  *range;[m
[31m-[m
[31m-    ll = &out;[m
[31m-    buf = in->buf;[m
[31m-    range = ctx->ranges.elts;[m
[31m-[m
[31m-    for (i = 0; i < ctx->ranges.nelts; i++) {[m
[31m-[m
[31m-        /*[m
[31m-         * The boundary header of the range:[m
[31m-         * CRLF[m
[31m-         * "--0123456789" CRLF[m
[31m-         * "Content-Type: image/jpeg" CRLF[m
[31m-         * "Content-Range: bytes "[m
[31m-         */[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->memory = 1;[m
[31m-        b->pos = ctx->boundary_header.data;[m
[31m-        b->last = ctx->boundary_header.data + ctx->boundary_header.len;[m
[31m-[m
[31m-        hcl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (hcl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hcl->buf = b;[m
[31m-[m
[31m-[m
[31m-        /* "SSSS-EEEE/TTTT" CRLF CRLF */[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = range[i].content_range.data;[m
[31m-        b->last = range[i].content_range.data + range[i].content_range.len;[m
[31m-[m
[31m-        rcl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rcl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rcl->buf = b;[m
[31m-[m
[31m-[m
[31m-        /* the range data */[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->in_file = buf->in_file;[m
[31m-        b->temporary = buf->temporary;[m
[31m-        b->memory = buf->memory;[m
[31m-        b->mmap = buf->mmap;[m
[31m-        b->file = buf->file;[m
[31m-[m
[31m-        if (buf->in_file) {[m
[31m-            b->file_pos = buf->file_pos + range[i].start;[m
[31m-            b->file_last = buf->file_pos + range[i].end;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_in_memory(buf)) {[m
[31m-            b->pos = buf->pos + (size_t) range[i].start;[m
[31m-            b->last = buf->pos + (size_t) range[i].end;[m
[31m-        }[m
[31m-[m
[31m-        dcl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (dcl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dcl->buf = b;[m
[31m-[m
[31m-        *ll = hcl;[m
[31m-        hcl->next = rcl;[m
[31m-        rcl->next = dcl;[m
[31m-        ll = &dcl->next;[m
[31m-    }[m
[31m-[m
[31m-    /* the last boundary CRLF "--0123456789--" CRLF  */[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->temporary = 1;[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    b->pos = ngx_pnalloc(r->pool, sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN[m
[31m-                                  + sizeof("--" CRLF) - 1);[m
[31m-    if (b->pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->pos, ctx->boundary_header.data,[m
[31m-                         sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN);[m
[31m-    *b->last++ = '-'; *b->last++ = '-';[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    hcl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (hcl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hcl->buf = b;[m
[31m-    hcl->next = NULL;[m
[31m-[m
[31m-    *ll = hcl;[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_header_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_range_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_body_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_range_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_realip_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_realip_module.c[m
[1mdeleted file mode 100644[m
[1mindex b7befe6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_realip_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,512 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REALIP_XREALIP  0[m
[31m-#define NGX_HTTP_REALIP_XFWD     1[m
[31m-#define NGX_HTTP_REALIP_HEADER   2[m
[31m-#define NGX_HTTP_REALIP_PROXY    3[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t       *from;     /* array of ngx_cidr_t */[m
[31m-    ngx_uint_t         type;[m
[31m-    ngx_uint_t         hash;[m
[31m-    ngx_str_t          header;[m
[31m-    ngx_flag_t         recursive;[m
[31m-} ngx_http_realip_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_connection_t  *connection;[m
[31m-    struct sockaddr   *sockaddr;[m
[31m-    socklen_t          socklen;[m
[31m-    ngx_str_t          addr_text;[m
[31m-} ngx_http_realip_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_realip_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_realip_set_addr(ngx_http_request_t *r,[m
[31m-    ngx_addr_t *addr);[m
[31m-static void ngx_http_realip_cleanup(void *data);[m
[31m-static char *ngx_http_realip_from(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_realip(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_realip_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_realip_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_realip_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_realip_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_realip_remote_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_realip_commands[] = {[m
[31m-[m
[31m-    { ngx_string("set_real_ip_from"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_realip_from,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("real_ip_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_realip,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("real_ip_recursive"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_realip_loc_conf_t, recursive),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_realip_module_ctx = {[m
[31m-    ngx_http_realip_add_variables,         /* preconfiguration */[m
[31m-    ngx_http_realip_init,                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_realip_create_loc_conf,       /* create location configuration */[m
[31m-    ngx_http_realip_merge_loc_conf         /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_realip_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_realip_module_ctx,           /* module context */[m
[31m-    ngx_http_realip_commands,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_realip_vars[] = {[m
[31m-[m
[31m-    { ngx_string("realip_remote_addr"), NULL,[m
[31m-      ngx_http_realip_remote_addr_variable, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_uint_t                   i, hash;[m
[31m-    ngx_addr_t                   addr;[m
[31m-    ngx_array_t                 *xfwd;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_table_elt_t             *header;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_realip_ctx_t       *ctx;[m
[31m-    ngx_http_realip_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_realip_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_realip_module);[m
[31m-[m
[31m-    if (rlcf->from == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    switch (rlcf->type) {[m
[31m-[m
[31m-    case NGX_HTTP_REALIP_XREALIP:[m
[31m-[m
[31m-        if (r->headers_in.x_real_ip == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        value = &r->headers_in.x_real_ip->value;[m
[31m-        xfwd = NULL;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_REALIP_XFWD:[m
[31m-[m
[31m-        xfwd = &r->headers_in.x_forwarded_for;[m
[31m-[m
[31m-        if (xfwd->elts == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        value = NULL;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_REALIP_PROXY:[m
[31m-[m
[31m-        value = &r->connection->proxy_protocol_addr;[m
[31m-[m
[31m-        if (value->len == 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        xfwd = NULL;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_HTTP_REALIP_HEADER */[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        hash = rlcf->hash;[m
[31m-        len = rlcf->header.len;[m
[31m-        p = rlcf->header.data;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (hash == header[i].hash[m
[31m-                && len == header[i].key.len[m
[31m-                && ngx_strncmp(p, header[i].lowcase_key, len) == 0)[m
[31m-            {[m
[31m-                value = &header[i].value;[m
[31m-                xfwd = NULL;[m
[31m-[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    addr.sockaddr = c->sockaddr;[m
[31m-    addr.socklen = c->socklen;[m
[31m-    /* addr.name = c->addr_text; */[m
[31m-[m
[31m-    if (ngx_http_get_forwarded_addr(r, &addr, xfwd, value, rlcf->from,[m
[31m-                                    rlcf->recursive)[m
[31m-        != NGX_DECLINED)[m
[31m-    {[m
[31m-        return ngx_http_realip_set_addr(r, &addr);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_set_addr(ngx_http_request_t *r, ngx_addr_t *addr)[m
[31m-{[m
[31m-    size_t                  len;[m
[31m-    u_char                 *p;[m
[31m-    u_char                  text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_connection_t       *c;[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_http_realip_ctx_t  *ctx;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool, sizeof(ngx_http_realip_ctx_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = cln->data;[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_realip_module);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    len = ngx_sock_ntop(addr->sockaddr, addr->socklen, text,[m
[31m-                        NGX_SOCKADDR_STRLEN, 0);[m
[31m-    if (len == 0) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(c->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, text, len);[m
[31m-[m
[31m-    cln->handler = ngx_http_realip_cleanup;[m
[31m-[m
[31m-    ctx->connection = c;[m
[31m-    ctx->sockaddr = c->sockaddr;[m
[31m-    ctx->socklen = c->socklen;[m
[31m-    ctx->addr_text = c->addr_text;[m
[31m-[m
[31m-    c->sockaddr = addr->sockaddr;[m
[31m-    c->socklen = addr->socklen;[m
[31m-    c->addr_text.len = len;[m
[31m-    c->addr_text.data = p;[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_realip_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_realip_ctx_t *ctx = data;[m
[31m-[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ctx->connection;[m
[31m-[m
[31m-    c->sockaddr = ctx->sockaddr;[m
[31m-    c->socklen = ctx->socklen;[m
[31m-    c->addr_text = ctx->addr_text;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_realip_loc_conf_t *rlcf = conf;[m
[31m-[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_cidr_t              *cidr;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (rlcf->from == NULL) {[m
[31m-        rlcf->from = ngx_array_create(cf->pool, 2,[m
[31m-                                      sizeof(ngx_cidr_t));[m
[31m-        if (rlcf->from == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cidr = ngx_array_push(rlcf->from);[m
[31m-    if (cidr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "unix:") == 0) {[m
[31m-        cidr->family = AF_UNIX;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_ptocidr(&value[1], cidr);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%V\"",[m
[31m-                           &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "low address bits of %V are meaningless", &value[1]);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_realip(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_realip_loc_conf_t *rlcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "X-Real-IP") == 0) {[m
[31m-        rlcf->type = NGX_HTTP_REALIP_XREALIP;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "X-Forwarded-For") == 0) {[m
[31m-        rlcf->type = NGX_HTTP_REALIP_XFWD;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "proxy_protocol") == 0) {[m
[31m-        rlcf->type = NGX_HTTP_REALIP_PROXY;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->type = NGX_HTTP_REALIP_HEADER;[m
[31m-    rlcf->hash = ngx_hash_strlow(value[1].data, value[1].data, value[1].len);[m
[31m-    rlcf->header = value[1];[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_realip_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_realip_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_realip_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->from = NULL;[m
[31m-     *     conf->hash = 0;[m
[31m-     *     conf->header = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->type = NGX_CONF_UNSET_UINT;[m
[31m-    conf->recursive = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_realip_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_realip_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_realip_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->from == NULL) {[m
[31m-        conf->from = prev->from;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->type, prev->type, NGX_HTTP_REALIP_XREALIP);[m
[31m-    ngx_conf_merge_value(conf->recursive, prev->recursive, 0);[m
[31m-[m
[31m-    if (conf->header.len == 0) {[m
[31m-        conf->hash = prev->hash;[m
[31m-        conf->header = prev->header;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_realip_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_realip_handler;[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_realip_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_remote_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t              *addr_text;[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_http_realip_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_realip_module);[m
[31m-[m
[31m-    if (ctx == NULL && (r->internal || r->filter_finalize)) {[m
[31m-[m
[31m-        /*[m
[31m-         * if module context was reset, the original address[m
[31m-         * can still be found in the cleanup handler[m
[31m-         */[m
[31m-[m
[31m-        for (cln = r->pool->cleanup; cln; cln = cln->next) {[m
[31m-            if (cln->handler == ngx_http_realip_cleanup) {[m
[31m-                ctx = cln->data;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    addr_text = ctx ? &ctx->addr_text : &r->connection->addr_text;[m
[31m-[m
[31m-    v->len = addr_text->len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = addr_text->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_referer_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_referer_module.c[m
[1mdeleted file mode 100644[m
[1mindex 3f0f78e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_referer_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,671 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REFERER_NO_URI_PART  ((void *) 4)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_combined_t      hash;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_array_t             *regex;[m
[31m-    ngx_array_t             *server_name_regex;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_flag_t               no_referer;[m
[31m-    ngx_flag_t               blocked_referer;[m
[31m-    ngx_flag_t               server_names;[m
[31m-[m
[31m-    ngx_hash_keys_arrays_t  *keys;[m
[31m-[m
[31m-    ngx_uint_t               referer_hash_max_size;[m
[31m-    ngx_uint_t               referer_hash_bucket_size;[m
[31m-} ngx_http_referer_conf_t;[m
[31m-[m
[31m-[m
[31m-static void * ngx_http_referer_create_conf(ngx_conf_t *cf);[m
[31m-static char * ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_add_referer(ngx_conf_t *cf,[m
[31m-    ngx_hash_keys_arrays_t *keys, ngx_str_t *value, ngx_str_t *uri);[m
[31m-static ngx_int_t ngx_http_add_regex_referer(ngx_conf_t *cf,[m
[31m-    ngx_http_referer_conf_t *rlcf, ngx_str_t *name);[m
[31m-#if (NGX_PCRE)[m
[31m-static ngx_int_t ngx_http_add_regex_server_name(ngx_conf_t *cf,[m
[31m-    ngx_http_referer_conf_t *rlcf, ngx_http_regex_t *regex);[m
[31m-#endif[m
[31m-static int ngx_libc_cdecl ngx_http_cmp_referer_wildcards(const void *one,[m
[31m-    const void *two);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_referer_commands[] = {[m
[31m-[m
[31m-    { ngx_string("valid_referers"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_valid_referers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("referer_hash_max_size"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_referer_conf_t, referer_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("referer_hash_bucket_size"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_referer_conf_t, referer_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_referer_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_referer_create_conf,          /* create location configuration */[m
[31m-    ngx_http_referer_merge_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_referer_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_referer_module_ctx,          /* module context */[m
[31m-    ngx_http_referer_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    u_char                    *p, *ref, *last;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                 *uri;[m
[31m-    ngx_uint_t                 i, key;[m
[31m-    ngx_http_referer_conf_t   *rlcf;[m
[31m-    u_char                     buf[256];[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_str_t                  referer;[m
[31m-#endif[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module);[m
[31m-[m
[31m-    if (rlcf->hash.hash.buckets == NULL[m
[31m-        && rlcf->hash.wc_head == NULL[m
[31m-        && rlcf->hash.wc_tail == NULL[m
[31m-#if (NGX_PCRE)[m
[31m-        && rlcf->regex == NULL[m
[31m-        && rlcf->server_name_regex == NULL[m
[31m-#endif[m
[31m-       )[m
[31m-    {[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.referer == NULL) {[m
[31m-        if (rlcf->no_referer) {[m
[31m-            goto valid;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    len = r->headers_in.referer->value.len;[m
[31m-    ref = r->headers_in.referer->value.data;[m
[31m-[m
[31m-    if (len >= sizeof("http://i.ru") - 1) {[m
[31m-        last = ref + len;[m
[31m-[m
[31m-        if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) {[m
[31m-            ref += 7;[m
[31m-            len -= 7;[m
[31m-            goto valid_scheme;[m
[31m-[m
[31m-        } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) {[m
[31m-            ref += 8;[m
[31m-            len -= 8;[m
[31m-            goto valid_scheme;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->blocked_referer) {[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-    goto invalid;[m
[31m-[m
[31m-valid_scheme:[m
[31m-[m
[31m-    i = 0;[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (p = ref; p < last; p++) {[m
[31m-        if (*p == '/' || *p == ':') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (i == 256) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        buf[i] = ngx_tolower(*p);[m
[31m-        key = ngx_hash(key, buf[i++]);[m
[31m-    }[m
[31m-[m
[31m-    uri = ngx_hash_find_combined(&rlcf->hash, key, buf, p - ref);[m
[31m-[m
[31m-    if (uri) {[m
[31m-        goto uri;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (rlcf->server_name_regex) {[m
[31m-        referer.len = p - ref;[m
[31m-        referer.data = buf;[m
[31m-[m
[31m-        rc = ngx_regex_exec_array(rlcf->server_name_regex, &referer,[m
[31m-                                  r->connection->log);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            goto valid;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_DECLINED */[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->regex) {[m
[31m-        referer.len = len;[m
[31m-        referer.data = ref;[m
[31m-[m
[31m-        rc = ngx_regex_exec_array(rlcf->regex, &referer, r->connection->log);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            goto valid;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_DECLINED */[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    *v = ngx_http_variable_true_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-uri:[m
[31m-[m
[31m-    for ( /* void */ ; p < last; p++) {[m
[31m-        if (*p == '/') {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = last - p;[m
[31m-[m
[31m-    if (uri == NGX_HTTP_REFERER_NO_URI_PART) {[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-    if (len < uri->len || ngx_strncmp(uri->data, p, uri->len) != 0) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-valid:[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_referer_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_referer_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_referer_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->hash = { NULL };[m
[31m-     *     conf->server_names = 0;[m
[31m-     *     conf->keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    conf->regex = NGX_CONF_UNSET_PTR;[m
[31m-    conf->server_name_regex = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    conf->no_referer = NGX_CONF_UNSET;[m
[31m-    conf->blocked_referer = NGX_CONF_UNSET;[m
[31m-    conf->referer_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    conf->referer_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_referer_conf_t *prev = parent;[m
[31m-    ngx_http_referer_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t                 n;[m
[31m-    ngx_hash_init_t            hash;[m
[31m-    ngx_http_server_name_t    *sn;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (conf->keys == NULL) {[m
[31m-        conf->hash = prev->hash;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL);[m
[31m-        ngx_conf_merge_ptr_value(conf->server_name_regex,[m
[31m-                                 prev->server_name_regex, NULL);[m
[31m-#endif[m
[31m-        ngx_conf_merge_value(conf->no_referer, prev->no_referer, 0);[m
[31m-        ngx_conf_merge_value(conf->blocked_referer, prev->blocked_referer, 0);[m
[31m-        ngx_conf_merge_uint_value(conf->referer_hash_max_size,[m
[31m-                                  prev->referer_hash_max_size, 2048);[m
[31m-        ngx_conf_merge_uint_value(conf->referer_hash_bucket_size,[m
[31m-                                  prev->referer_hash_bucket_size, 64);[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->server_names == 1) {[m
[31m-        cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-        sn = cscf->server_names.elts;[m
[31m-        for (n = 0; n < cscf->server_names.nelts; n++) {[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            if (sn[n].regex) {[m
[31m-[m
[31m-                if (ngx_http_add_regex_server_name(cf, conf, sn[n].regex)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (ngx_http_add_referer(cf, conf->keys, &sn[n].name, NULL)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((conf->no_referer == 1 || conf->blocked_referer == 1)[m
[31m-        && conf->keys->keys.nelts == 0[m
[31m-        && conf->keys->dns_wc_head.nelts == 0[m
[31m-        && conf->keys->dns_wc_tail.nelts == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "the \"none\" or \"blocked\" referers are specified "[m
[31m-                      "in the \"valid_referers\" directive "[m
[31m-                      "without any valid referer");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->referer_hash_max_size,[m
[31m-                              prev->referer_hash_max_size, 2048);[m
[31m-    ngx_conf_merge_uint_value(conf->referer_hash_bucket_size,[m
[31m-                              prev->referer_hash_bucket_size, 64);[m
[31m-    conf->referer_hash_bucket_size = ngx_align(conf->referer_hash_bucket_size,[m
[31m-                                               ngx_cacheline_size);[m
[31m-[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = conf->referer_hash_max_size;[m
[31m-    hash.bucket_size = conf->referer_hash_bucket_size;[m
[31m-    hash.name = "referer_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-[m
[31m-    if (conf->keys->keys.nelts) {[m
[31m-        hash.hash = &conf->hash.hash;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, conf->keys->keys.elts, conf->keys->keys.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->keys->dns_wc_head.nelts) {[m
[31m-[m
[31m-        ngx_qsort(conf->keys->dns_wc_head.elts,[m
[31m-                  (size_t) conf->keys->dns_wc_head.nelts,[m
[31m-                  sizeof(ngx_hash_key_t),[m
[31m-                  ngx_http_cmp_referer_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = cf->temp_pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_head.elts,[m
[31m-                                   conf->keys->dns_wc_head.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf->hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->keys->dns_wc_tail.nelts) {[m
[31m-[m
[31m-        ngx_qsort(conf->keys->dns_wc_tail.elts,[m
[31m-                  (size_t) conf->keys->dns_wc_tail.nelts,[m
[31m-                  sizeof(ngx_hash_key_t),[m
[31m-                  ngx_http_cmp_referer_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = cf->temp_pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_tail.elts,[m
[31m-                                   conf->keys->dns_wc_tail.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf->hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL);[m
[31m-    ngx_conf_merge_ptr_value(conf->server_name_regex, prev->server_name_regex,[m
[31m-                             NULL);[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->no_referer == NGX_CONF_UNSET) {[m
[31m-        conf->no_referer = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->blocked_referer == NGX_CONF_UNSET) {[m
[31m-        conf->blocked_referer = 0;[m
[31m-    }[m
[31m-[m
[31m-    conf->keys = NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_referer_conf_t  *rlcf = conf;[m
[31m-[m
[31m-    u_char                    *p;[m
[31m-    ngx_str_t                 *value, uri, name;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_variable_t       *var;[m
[31m-[m
[31m-    ngx_str_set(&name, "invalid_referer");[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_referer_variable;[m
[31m-[m
[31m-    if (rlcf->keys == NULL) {[m
[31m-        rlcf->keys = ngx_pcalloc(cf->temp_pool, sizeof(ngx_hash_keys_arrays_t));[m
[31m-        if (rlcf->keys == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rlcf->keys->pool = cf->pool;[m
[31m-        rlcf->keys->temp_pool = cf->pool;[m
[31m-[m
[31m-        if (ngx_hash_keys_array_init(rlcf->keys, NGX_HASH_SMALL) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (value[i].len == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid referer \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "none") == 0) {[m
[31m-            rlcf->no_referer = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "blocked") == 0) {[m
[31m-            rlcf->blocked_referer = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "server_names") == 0) {[m
[31m-            rlcf->server_names = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].data[0] == '~') {[m
[31m-            if (ngx_http_add_regex_referer(cf, rlcf, &value[i]) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_str_null(&uri);[m
[31m-[m
[31m-        p = (u_char *) ngx_strchr(value[i].data, '/');[m
[31m-[m
[31m-        if (p) {[m
[31m-            uri.len = (value[i].data + value[i].len) - p;[m
[31m-            uri.data = p;[m
[31m-            value[i].len = p - value[i].data;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_add_referer(cf, rlcf->keys, &value[i], &uri) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_referer(ngx_conf_t *cf, ngx_hash_keys_arrays_t *keys,[m
[31m-    ngx_str_t *value, ngx_str_t *uri)[m
[31m-{[m
[31m-    ngx_int_t   rc;[m
[31m-    ngx_str_t  *u;[m
[31m-[m
[31m-    if (uri == NULL || uri->len == 0) {[m
[31m-        u = NGX_HTTP_REFERER_NO_URI_PART;[m
[31m-[m
[31m-    } else {[m
[31m-        u = ngx_palloc(cf->pool, sizeof(ngx_str_t));[m
[31m-        if (u == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *u = *uri;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_hash_add_key(keys, value, u, NGX_HASH_WILDCARD_KEY);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid hostname or wildcard \"%V\"", value);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "conflicting parameter \"%V\"", value);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_elt_t      *re;[m
[31m-    ngx_regex_compile_t   rc;[m
[31m-    u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    if (name->len == 1) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->regex == NGX_CONF_UNSET_PTR) {[m
[31m-        rlcf->regex = ngx_array_create(cf->pool, 2, sizeof(ngx_regex_elt_t));[m
[31m-        if (rlcf->regex == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    re = ngx_array_push(rlcf->regex);[m
[31m-    if (re == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->len--;[m
[31m-    name->data++;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *name;[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.options = NGX_REGEX_CASELESS;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = rc.regex;[m
[31m-    re->name = name->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "the using of the regex \"%V\" requires PCRE library",[m
[31m-                       name);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_regex_server_name(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf,[m
[31m-    ngx_http_regex_t *regex)[m
[31m-{[m
[31m-    ngx_regex_elt_t  *re;[m
[31m-[m
[31m-    if (rlcf->server_name_regex == NGX_CONF_UNSET_PTR) {[m
[31m-        rlcf->server_name_regex = ngx_array_create(cf->pool, 2,[m
[31m-                                                   sizeof(ngx_regex_elt_t));[m
[31m-        if (rlcf->server_name_regex == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    re = ngx_array_push(rlcf->server_name_regex);[m
[31m-    if (re == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = regex->regex;[m
[31m-    re->name = regex->name.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_cmp_referer_wildcards(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_hash_key_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_hash_key_t *) one;[m
[31m-    second = (ngx_hash_key_t *) two;[m
[31m-[m
[31m-    return ngx_dns_strcmp(first->key.data, second->key.data);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_rewrite_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_rewrite_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6b2444c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_rewrite_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1029 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t  *codes;        /* uintptr_t */[m
[31m-[m
[31m-    ngx_uint_t    stack_size;[m
[31m-[m
[31m-    ngx_flag_t    log;[m
[31m-    ngx_flag_t    uninitialized_variable_warn;[m
[31m-} ngx_http_rewrite_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_rewrite_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char * ngx_http_rewrite_if_condition(ngx_conf_t *cf,[m
[31m-    ngx_http_rewrite_loc_conf_t *lcf);[m
[31m-static char *ngx_http_rewrite_variable(ngx_conf_t *cf,[m
[31m-    ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-static char *ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char * ngx_http_rewrite_value(ngx_conf_t *cf,[m
[31m-    ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_rewrite_commands[] = {[m
[31m-[m
[31m-    { ngx_string("rewrite"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_TAKE23,[m
[31m-      ngx_http_rewrite,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("return"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_TAKE12,[m
[31m-      ngx_http_rewrite_return,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("break"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_NOARGS,[m
[31m-      ngx_http_rewrite_break,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("if"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_1MORE,[m
[31m-      ngx_http_rewrite_if,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("set"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_TAKE2,[m
[31m-      ngx_http_rewrite_set,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rewrite_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rewrite_loc_conf_t, log),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uninitialized_variable_warn"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rewrite_loc_conf_t, uninitialized_variable_warn),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_rewrite_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_rewrite_init,                 /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_rewrite_create_loc_conf,      /* create location configuration */[m
[31m-    ngx_http_rewrite_merge_loc_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_rewrite_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_rewrite_module_ctx,          /* module context */[m
[31m-    ngx_http_rewrite_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rewrite_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                     index;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t     *e;[m
[31m-    ngx_http_core_srv_conf_t     *cscf;[m
[31m-    ngx_http_core_main_conf_t    *cmcf;[m
[31m-    ngx_http_rewrite_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    index = cmcf->phase_engine.location_rewrite_index;[m
[31m-[m
[31m-    if (r->phase_handler == index && r->loc_conf == cscf->ctx->loc_conf) {[m
[31m-        /* skipping location rewrite phase for server null location */[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (rlcf->codes == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    e = ngx_pcalloc(r->pool, sizeof(ngx_http_script_engine_t));[m
[31m-    if (e == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    e->sp = ngx_pcalloc(r->pool,[m
[31m-                        rlcf->stack_size * sizeof(ngx_http_variable_value_t));[m
[31m-    if (e->sp == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    e->ip = rlcf->codes->elts;[m
[31m-    e->request = r;[m
[31m-    e->quote = 1;[m
[31m-    e->log = rlcf->log;[m
[31m-    e->status = NGX_DECLINED;[m
[31m-[m
[31m-    while (*(uintptr_t *) e->ip) {[m
[31m-        code = *(ngx_http_script_code_pt *) e->ip;[m
[31m-        code(e);[m
[31m-    }[m
[31m-[m
[31m-    if (e->status < NGX_HTTP_BAD_REQUEST) {[m
[31m-        return e->status;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status == 0) {[m
[31m-        return e->status;[m
[31m-    }[m
[31m-[m
[31m-    return r->err_status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_variable_t          *var;[m
[31m-    ngx_http_core_main_conf_t    *cmcf;[m
[31m-    ngx_http_rewrite_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (rlcf->uninitialized_variable_warn == 0) {[m
[31m-        *v = ngx_http_variable_null_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    var = cmcf->variables.elts;[m
[31m-[m
[31m-    /*[m
[31m-     * the ngx_http_rewrite_module sets variables directly in r->variables,[m
[31m-     * and they should be handled by ngx_http_get_indexed_variable(),[m
[31m-     * so the handler is called only if the variable is not initialized[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                  "using uninitialized \"%V\" variable", &var[data].name);[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_rewrite_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->stack_size = NGX_CONF_UNSET_UINT;[m
[31m-    conf->log = NGX_CONF_UNSET;[m
[31m-    conf->uninitialized_variable_warn = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t *prev = parent;[m
[31m-    ngx_http_rewrite_loc_conf_t *conf = child;[m
[31m-[m
[31m-    uintptr_t  *code;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->log, prev->log, 0);[m
[31m-    ngx_conf_merge_value(conf->uninitialized_variable_warn,[m
[31m-                         prev->uninitialized_variable_warn, 1);[m
[31m-    ngx_conf_merge_uint_value(conf->stack_size, prev->stack_size, 10);[m
[31m-[m
[31m-    if (conf->codes == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->codes == prev->codes) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(conf->codes, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rewrite_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_rewrite_handler;[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_rewrite_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         last;[m
[31m-    ngx_regex_compile_t                rc;[m
[31m-    ngx_http_script_code_pt           *code;[m
[31m-    ngx_http_script_compile_t          sc;[m
[31m-    ngx_http_script_regex_code_t      *regex;[m
[31m-    ngx_http_script_regex_end_code_t  *regex_end;[m
[31m-    u_char                             errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    regex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                       sizeof(ngx_http_script_regex_code_t));[m
[31m-    if (regex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = value[1];[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    /* TODO: NGX_REGEX_CASELESS */[m
[31m-[m
[31m-    regex->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (regex->regex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    regex->code = ngx_http_script_regex_start_code;[m
[31m-    regex->uri = 1;[m
[31m-    regex->name = value[1];[m
[31m-[m
[31m-    if (value[2].data[value[2].len - 1] == '?') {[m
[31m-[m
[31m-        /* the last "?" drops the original arguments */[m
[31m-        value[2].len--;[m
[31m-[m
[31m-    } else {[m
[31m-        regex->add_args = 1;[m
[31m-    }[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    if (ngx_strncmp(value[2].data, "http://", sizeof("http://") - 1) == 0[m
[31m-        || ngx_strncmp(value[2].data, "https://", sizeof("https://") - 1) == 0[m
[31m-        || ngx_strncmp(value[2].data, "$scheme", sizeof("$scheme") - 1) == 0)[m
[31m-    {[m
[31m-        regex->status = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-        regex->redirect = 1;[m
[31m-        last = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 4) {[m
[31m-        if (ngx_strcmp(value[3].data, "last") == 0) {[m
[31m-            last = 1;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[3].data, "break") == 0) {[m
[31m-            regex->break_cycle = 1;[m
[31m-            last = 1;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[3].data, "redirect") == 0) {[m
[31m-            regex->status = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-            regex->redirect = 1;[m
[31m-            last = 1;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[3].data, "permanent") == 0) {[m
[31m-            regex->status = NGX_HTTP_MOVED_PERMANENTLY;[m
[31m-            regex->redirect = 1;[m
[31m-            last = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[3]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[2];[m
[31m-    sc.lengths = &regex->lengths;[m
[31m-    sc.values = &lcf->codes;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[2]);[m
[31m-    sc.main = regex;[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.compile_args = !regex->redirect;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    regex = sc.main;[m
[31m-[m
[31m-    regex->size = sc.size;[m
[31m-    regex->args = sc.args;[m
[31m-[m
[31m-    if (sc.variables == 0 && !sc.dup_capture) {[m
[31m-        regex->lengths = NULL;[m
[31m-    }[m
[31m-[m
[31m-    regex_end = ngx_http_script_add_code(lcf->codes,[m
[31m-                                      sizeof(ngx_http_script_regex_end_code_t),[m
[31m-                                      &regex);[m
[31m-    if (regex_end == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    regex_end->code = ngx_http_script_regex_end_code;[m
[31m-    regex_end->uri = regex->uri;[m
[31m-    regex_end->args = regex->args;[m
[31m-    regex_end->add_args = regex->add_args;[m
[31m-    regex_end->redirect = regex->redirect;[m
[31m-[m
[31m-    if (last) {[m
[31m-        code = ngx_http_script_add_code(lcf->codes, sizeof(uintptr_t), &regex);[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = NULL;[m
[31m-    }[m
[31m-[m
[31m-    regex->next = (u_char *) lcf->codes->elts + lcf->codes->nelts[m
[31m-                                              - (u_char *) regex;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_str_t                         *value, *v;[m
[31m-    ngx_http_script_return_code_t     *ret;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    ret = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                     sizeof(ngx_http_script_return_code_t));[m
[31m-    if (ret == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(ret, sizeof(ngx_http_script_return_code_t));[m
[31m-[m
[31m-    ret->code = ngx_http_script_return_code;[m
[31m-[m
[31m-    p = value[1].data;[m
[31m-[m
[31m-    ret->status = ngx_atoi(p, value[1].len);[m
[31m-[m
[31m-    if (ret->status == (uintptr_t) NGX_ERROR) {[m
[31m-[m
[31m-        if (cf->args->nelts == 2[m
[31m-            && (ngx_strncmp(p, "http://", sizeof("http://") - 1) == 0[m
[31m-                || ngx_strncmp(p, "https://", sizeof("https://") - 1) == 0[m
[31m-                || ngx_strncmp(p, "$scheme", sizeof("$scheme") - 1) == 0))[m
[31m-        {[m
[31m-            ret->status = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-            v = &value[1];[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid return code \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (ret->status > 999) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid return code \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cf->args->nelts == 2) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        v = &value[2];[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = v;[m
[31m-    ccv.complex_value = &ret->text;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t *lcf = conf;[m
[31m-[m
[31m-    ngx_http_script_code_pt  *code;[m
[31m-[m
[31m-    code = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = ngx_http_script_break_code;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-[m
[31m-    void                         *mconf;[m
[31m-    char                         *rv;[m
[31m-    u_char                       *elts;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_conf_t                    save;[m
[31m-    ngx_http_module_t            *module;[m
[31m-    ngx_http_conf_ctx_t          *ctx, *pctx;[m
[31m-    ngx_http_core_loc_conf_t     *clcf, *pclcf;[m
[31m-    ngx_http_script_if_code_t    *if_code;[m
[31m-    ngx_http_rewrite_loc_conf_t  *nlcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-    clcf->name = pclcf->name;[m
[31m-    clcf->noname = 1;[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_rewrite_if_condition(cf, lcf) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if_code = ngx_array_push_n(lcf->codes, sizeof(ngx_http_script_if_code_t));[m
[31m-    if (if_code == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if_code->code = ngx_http_script_if_code;[m
[31m-[m
[31m-    elts = lcf->codes->elts;[m
[31m-[m
[31m-[m
[31m-    /* the inner directives must be compiled to the same code array */[m
[31m-[m
[31m-    nlcf = ctx->loc_conf[ngx_http_rewrite_module.ctx_index];[m
[31m-    nlcf->codes = lcf->codes;[m
[31m-[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-[m
[31m-    if (cf->cmd_type == NGX_HTTP_SRV_CONF) {[m
[31m-        if_code->loc_conf = NULL;[m
[31m-        cf->cmd_type = NGX_HTTP_SIF_CONF;[m
[31m-[m
[31m-    } else {[m
[31m-        if_code->loc_conf = ctx->loc_conf;[m
[31m-        cf->cmd_type = NGX_HTTP_LIF_CONF;[m
[31m-    }[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (elts != lcf->codes->elts) {[m
[31m-        if_code = (ngx_http_script_if_code_t *)[m
[31m-                   ((u_char *) if_code + ((u_char *) lcf->codes->elts - elts));[m
[31m-    }[m
[31m-[m
[31m-    if_code->next = (u_char *) lcf->codes->elts + lcf->codes->nelts[m
[31m-                                                - (u_char *) if_code;[m
[31m-[m
[31m-    /* the code array belong to parent block */[m
[31m-[m
[31m-    nlcf->codes = NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf)[m
[31m-{[m
[31m-    u_char                        *p;[m
[31m-    size_t                         len;[m
[31m-    ngx_str_t                     *value;[m
[31m-    ngx_uint_t                     cur, last;[m
[31m-    ngx_regex_compile_t            rc;[m
[31m-    ngx_http_script_code_pt       *code;[m
[31m-    ngx_http_script_file_code_t   *fop;[m
[31m-    ngx_http_script_regex_code_t  *regex;[m
[31m-    u_char                         errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    last = cf->args->nelts - 1;[m
[31m-[m
[31m-    if (value[1].len < 1 || value[1].data[0] != '(') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid condition \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len == 1) {[m
[31m-        cur = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        cur = 1;[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-    }[m
[31m-[m
[31m-    if (value[last].len < 1 || value[last].data[value[last].len - 1] != ')') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid condition \"%V\"", &value[last]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[last].len == 1) {[m
[31m-        last--;[m
[31m-[m
[31m-    } else {[m
[31m-        value[last].len--;[m
[31m-        value[last].data[value[last].len] = '\0';[m
[31m-    }[m
[31m-[m
[31m-    len = value[cur].len;[m
[31m-    p = value[cur].data;[m
[31m-[m
[31m-    if (len > 1 && p[0] == '$') {[m
[31m-[m
[31m-        if (cur != last && cur + 2 != last) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid condition \"%V\"", &value[cur]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_rewrite_variable(cf, lcf, &value[cur]) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cur == last) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        cur++;[m
[31m-[m
[31m-        len = value[cur].len;[m
[31m-        p = value[cur].data;[m
[31m-[m
[31m-        if (len == 1 && p[0] == '=') {[m
[31m-[m
[31m-            if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            code = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                              sizeof(uintptr_t));[m
[31m-            if (code == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *code = ngx_http_script_equal_code;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (len == 2 && p[0] == '!' && p[1] == '=') {[m
[31m-[m
[31m-            if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            code = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                              sizeof(uintptr_t));[m
[31m-            if (code == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *code = ngx_http_script_not_equal_code;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if ((len == 1 && p[0] == '~')[m
[31m-            || (len == 2 && p[0] == '~' && p[1] == '*')[m
[31m-            || (len == 2 && p[0] == '!' && p[1] == '~')[m
[31m-            || (len == 3 && p[0] == '!' && p[1] == '~' && p[2] == '*'))[m
[31m-        {[m
[31m-            regex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                         sizeof(ngx_http_script_regex_code_t));[m
[31m-            if (regex == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t));[m
[31m-[m
[31m-            ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-            rc.pattern = value[last];[m
[31m-            rc.options = (p[len - 1] == '*') ? NGX_REGEX_CASELESS : 0;[m
[31m-            rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-            rc.err.data = errstr;[m
[31m-[m
[31m-            regex->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-            if (regex->regex == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            regex->code = ngx_http_script_regex_start_code;[m
[31m-            regex->next = sizeof(ngx_http_script_regex_code_t);[m
[31m-            regex->test = 1;[m
[31m-            if (p[0] == '!') {[m
[31m-                regex->negative_test = 1;[m
[31m-            }[m
[31m-            regex->name = value[last];[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unexpected \"%V\" in condition", &value[cur]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-    } else if ((len == 2 && p[0] == '-')[m
[31m-               || (len == 3 && p[0] == '!' && p[1] == '-'))[m
[31m-    {[m
[31m-        if (cur + 1 != last) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid condition \"%V\"", &value[cur]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value[last].data[value[last].len] = '\0';[m
[31m-        value[last].len++;[m
[31m-[m
[31m-        if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        fop = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                          sizeof(ngx_http_script_file_code_t));[m
[31m-        if (fop == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        fop->code = ngx_http_script_file_code;[m
[31m-[m
[31m-        if (p[1] == 'f') {[m
[31m-            fop->op = ngx_http_script_file_plain;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (p[1] == 'd') {[m
[31m-            fop->op = ngx_http_script_file_dir;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (p[1] == 'e') {[m
[31m-            fop->op = ngx_http_script_file_exists;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (p[1] == 'x') {[m
[31m-            fop->op = ngx_http_script_file_exec;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (p[0] == '!') {[m
[31m-            if (p[2] == 'f') {[m
[31m-                fop->op = ngx_http_script_file_not_plain;[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (p[2] == 'd') {[m
[31m-                fop->op = ngx_http_script_file_not_dir;[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (p[2] == 'e') {[m
[31m-                fop->op = ngx_http_script_file_not_exists;[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (p[2] == 'x') {[m
[31m-                fop->op = ngx_http_script_file_not_exec;[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid condition \"%V\"", &value[cur]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid condition \"%V\"", &value[cur]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t                    index;[m
[31m-    ngx_http_script_var_code_t  *var_code;[m
[31m-[m
[31m-    value->len--;[m
[31m-    value->data++;[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, value);[m
[31m-[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var_code = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                          sizeof(ngx_http_script_var_code_t));[m
[31m-    if (var_code == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var_code->code = ngx_http_script_var_code;[m
[31m-    var_code->index = index;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-[m
[31m-    ngx_int_t                            index;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_http_variable_t                 *v;[m
[31m-    ngx_http_script_var_code_t          *vcode;[m
[31m-    ngx_http_script_var_handler_code_t  *vhcode;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value[1].len--;[m
[31m-    value[1].data++;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, &value[1]);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->get_handler == NULL[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "http_", 5) != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "sent_http_", 10) != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "upstream_http_", 14) != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "cookie_", 7) != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "upstream_cookie_", 16)[m
[31m-           != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "arg_", 4) != 0)[m
[31m-    {[m
[31m-        v->get_handler = ngx_http_rewrite_var;[m
[31m-        v->data = index;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_rewrite_value(cf, lcf, &value[2]) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->set_handler) {[m
[31m-        vhcode = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                   sizeof(ngx_http_script_var_handler_code_t));[m
[31m-        if (vhcode == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        vhcode->code = ngx_http_script_var_set_handler_code;[m
[31m-        vhcode->handler = v->set_handler;[m
[31m-        vhcode->data = v->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    vcode = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                       sizeof(ngx_http_script_var_code_t));[m
[31m-    if (vcode == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vcode->code = ngx_http_script_set_var_code;[m
[31m-    vcode->index = (uintptr_t) index;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t                              n;[m
[31m-    ngx_http_script_compile_t              sc;[m
[31m-    ngx_http_script_value_code_t          *val;[m
[31m-    ngx_http_script_complex_value_code_t  *complex;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(value);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        val = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                         sizeof(ngx_http_script_value_code_t));[m
[31m-        if (val == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_atoi(value->data, value->len);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            n = 0;[m
[31m-        }[m
[31m-[m
[31m-        val->code = ngx_http_script_value_code;[m
[31m-        val->value = (uintptr_t) n;[m
[31m-        val->text_len = (uintptr_t) value->len;[m
[31m-        val->text_data = (uintptr_t) value->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    complex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                 sizeof(ngx_http_script_complex_value_code_t));[m
[31m-    if (complex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    complex->code = ngx_http_script_complex_value_code;[m
[31m-    complex->lengths = NULL;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = value;[m
[31m-    sc.lengths = &complex->lengths;[m
[31m-    sc.values = &lcf->codes;[m
[31m-    sc.variables = n;[m
[31m-    sc.complete_lengths = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_scgi_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_scgi_module.c[m
[1mdeleted file mode 100644[m
[1mindex f09617e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_scgi_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1969 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Manlio Perillo (manlio.perillo@gmail.com)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_scgi_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t               *flushes;[m
[31m-    ngx_array_t               *lengths;[m
[31m-    ngx_array_t               *values;[m
[31m-    ngx_uint_t                 number;[m
[31m-    ngx_hash_t                 hash;[m
[31m-} ngx_http_scgi_params_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-[m
[31m-    ngx_http_scgi_params_t     params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_scgi_params_t     params_cache;[m
[31m-#endif[m
[31m-    ngx_array_t               *params_source;[m
[31m-[m
[31m-    ngx_array_t               *scgi_lengths;[m
[31m-    ngx_array_t               *scgi_values;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t   cache_key;[m
[31m-#endif[m
[31m-} ngx_http_scgi_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_scgi_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_scgi_loc_conf_t *scf);[m
[31m-static ngx_int_t ngx_http_scgi_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_scgi_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_scgi_process_status_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_scgi_process_header(ngx_http_request_t *r);[m
[31m-static void ngx_http_scgi_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-[m
[31m-static void *ngx_http_scgi_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_scgi_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_scgi_init_params(ngx_conf_t *cf,[m
[31m-    ngx_http_scgi_loc_conf_t *conf, ngx_http_scgi_params_t *params,[m
[31m-    ngx_keyval_t *default_params);[m
[31m-[m
[31m-static char *ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_scgi_create_key(ngx_http_request_t *r);[m
[31m-static char *ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t ngx_http_scgi_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_scgi_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_scgi_commands[] = {[m
[31m-[m
[31m-    { ngx_string("scgi_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_scgi_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_scgi_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("scgi_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_scgi_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_scgi_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_main_conf_t, caches),[m
[31m-      &ngx_http_scgi_module },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_scgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("scgi_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_scgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("scgi_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23,[m
[31m-      ngx_http_upstream_param_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, params_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_scgi_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_scgi_create_main_conf,        /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_scgi_create_loc_conf,         /* create location configuration */[m
[31m-    ngx_http_scgi_merge_loc_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_scgi_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_scgi_module_ctx,             /* module context */[m
[31m-    ngx_http_scgi_commands,                /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_scgi_hide_headers[] = {[m
[31m-    ngx_string("Status"),[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_scgi_cache_headers[] = {[m
[31m-    { ngx_string("HTTP_IF_MODIFIED_SINCE"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("HTTP_IF_MATCH"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_RANGE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_RANGE"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t ngx_http_scgi_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_SCGI_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_status_t          *status;[m
[31m-    ngx_http_upstream_t        *u;[m
[31m-    ngx_http_scgi_loc_conf_t   *scf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_scgi_main_conf_t  *smcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    status = ngx_pcalloc(r->pool, sizeof(ngx_http_status_t));[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, status, ngx_http_scgi_module);[m
[31m-[m
[31m-    scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    if (scf->scgi_lengths) {[m
[31m-        if (ngx_http_scgi_eval(r, scf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_str_set(&u->schema, "scgi://");[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_scgi_module;[m
[31m-[m
[31m-    u->conf = &scf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    smcf = ngx_http_get_module_main_conf(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    u->caches = &smcf->caches;[m
[31m-    u->create_key = ngx_http_scgi_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_scgi_create_request;[m
[31m-    u->reinit_request = ngx_http_scgi_reinit_request;[m
[31m-    u->process_header = ngx_http_scgi_process_status_line;[m
[31m-    u->abort_request = ngx_http_scgi_abort_request;[m
[31m-    u->finalize_request = ngx_http_scgi_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    u->buffering = scf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_event_pipe_copy_input_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    if (!scf->upstream.request_buffering[m
[31m-        && scf->upstream.pass_request_body[m
[31m-        && !r->headers_in.chunked)[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_eval(ngx_http_request_t *r, ngx_http_scgi_loc_conf_t * scf)[m
[31m-{[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &url.url, scf->scgi_lengths->elts, 0,[m
[31m-                            scf->scgi_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = url.port;[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                 *key;[m
[31m-    ngx_http_scgi_loc_conf_t  *scf;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &scf->cache_key, key) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                         content_length_n;[m
[31m-    u_char                        ch, *key, *val, *lowcase_key;[m
[31m-    size_t                        len, key_len, val_len, allocated;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_str_t                     content_length;[m
[31m-    ngx_uint_t                    i, n, hash, skip_empty, header_params;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header, **ignored;[m
[31m-    ngx_http_scgi_params_t       *params;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_scgi_loc_conf_t     *scf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-    u_char                        buffer[NGX_OFF_T_LEN];[m
[31m-[m
[31m-    content_length_n = 0;[m
[31m-    body = r->upstream->request_bufs;[m
[31m-[m
[31m-    while (body) {[m
[31m-        content_length_n += ngx_buf_size(body->buf);[m
[31m-        body = body->next;[m
[31m-    }[m
[31m-[m
[31m-    content_length.data = buffer;[m
[31m-    content_length.len = ngx_sprintf(buffer, "%O", content_length_n) - buffer;[m
[31m-[m
[31m-    len = sizeof("CONTENT_LENGTH") + content_length.len + 1;[m
[31m-[m
[31m-    header_params = 0;[m
[31m-    ignored = NULL;[m
[31m-[m
[31m-    scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    params = r->upstream->cacheable ? &scf->params_cache : &scf->params;[m
[31m-#else[m
[31m-    params = &scf->params;[m
[31m-#endif[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, params->flushes);[m
[31m-        le.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-        le.request = r;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = lcode(&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += key_len + val_len + 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (scf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        allocated = 0;[m
[31m-        lowcase_key = NULL;[m
[31m-[m
[31m-        if (params->number) {[m
[31m-            n = 0;[m
[31m-            part = &r->headers_in.headers.part;[m
[31m-[m
[31m-            while (part) {[m
[31m-                n += part->nelts;[m
[31m-                part = part->next;[m
[31m-            }[m
[31m-[m
[31m-            ignored = ngx_palloc(r->pool, n * sizeof(void *));[m
[31m-            if (ignored == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (params->number) {[m
[31m-                if (allocated < header[i].key.len) {[m
[31m-                    allocated = header[i].key.len + 16;[m
[31m-                    lowcase_key = ngx_pnalloc(r->pool, allocated);[m
[31m-                    if (lowcase_key == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                hash = 0;[m
[31m-[m
[31m-                for (n = 0; n < header[i].key.len; n++) {[m
[31m-                    ch = header[i].key.data[n];[m
[31m-[m
[31m-                    if (ch >= 'A' && ch <= 'Z') {[m
[31m-                        ch |= 0x20;[m
[31m-[m
[31m-                    } else if (ch == '-') {[m
[31m-                        ch = '_';[m
[31m-                    }[m
[31m-[m
[31m-                    hash = ngx_hash(hash, ch);[m
[31m-                    lowcase_key[n] = ch;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_hash_find(&params->hash, hash, lowcase_key, n)) {[m
[31m-                    ignored[header_params++] = &header[i];[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            len += sizeof("HTTP_") - 1 + header[i].key.len + 1[m
[31m-                + header[i].value.len + 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* netstring: "length:" + packet + "," */[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, NGX_SIZE_T_LEN + 1 + len + 1);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, "%ui:CONTENT_LENGTH%Z%V%Z",[m
[31m-                          len, &content_length);[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        e.ip = params->values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.request = r;[m
[31m-        e.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            lcode(&le); /* key length */[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                e.skip = 1;[m
[31m-[m
[31m-                while (*(uintptr_t *) e.ip) {[m
[31m-                    code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                    code((ngx_http_script_engine_t *) &e);[m
[31m-                }[m
[31m-                e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-                e.skip = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-            key = e.pos;[m
[31m-#endif[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) & e);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-            val = e.pos;[m
[31m-#endif[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-            *e.pos++ = '\0';[m
[31m-            e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "scgi param: \"%s: %s\"", key, val);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            for (n = 0; n < header_params; n++) {[m
[31m-                if (&header[i] == ignored[n]) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            key = b->last;[m
[31m-            b->last = ngx_cpymem(key, "HTTP_", sizeof("HTTP_") - 1);[m
[31m-[m
[31m-            for (n = 0; n < header[i].key.len; n++) {[m
[31m-                ch = header[i].key.data[n];[m
[31m-[m
[31m-                if (ch >= 'a' && ch <= 'z') {[m
[31m-                    ch &= ~0x20;[m
[31m-[m
[31m-                } else if (ch == '-') {[m
[31m-                    ch = '_';[m
[31m-                }[m
[31m-[m
[31m-                *b->last++ = ch;[m
[31m-            }[m
[31m-[m
[31m-            *b->last++ = (u_char) 0;[m
[31m-[m
[31m-            val = b->last;[m
[31m-            b->last = ngx_copy(val, header[i].value.data, header[i].value.len);[m
[31m-            *b->last++ = (u_char) 0;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "scgi param: \"%s: %s\"", key, val);[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = (u_char) ',';[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    } else if (scf->upstream.pass_request_body) {[m
[31m-        body = r->upstream->request_bufs;[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-[m
[31m-        while (body) {[m
[31m-            b = ngx_alloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl->next == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl = cl->next;[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_status_t  *status;[m
[31m-[m
[31m-    status = ngx_http_get_module_ctx(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    status->code = 0;[m
[31m-    status->count = 0;[m
[31m-    status->start = NULL;[m
[31m-    status->end = NULL;[m
[31m-[m
[31m-    r->upstream->process_header = ngx_http_scgi_process_status_line;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_process_status_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                len;[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_http_status_t    *status;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    status = ngx_http_get_module_ctx(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, &u->buffer, status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        u->process_header = ngx_http_scgi_process_header;[m
[31m-        return ngx_http_scgi_process_header(r);[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->status == 0) {[m
[31m-        u->state->status = status->code;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = status->code;[m
[31m-[m
[31m-    len = status->end - status->start;[m
[31m-    u->headers_in.status_line.len = len;[m
[31m-[m
[31m-    u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (u->headers_in.status_line.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u->headers_in.status_line.data, status->start, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http scgi status %ui \"%V\"",[m
[31m-                   u->headers_in.status_n, &u->headers_in.status_line);[m
[31m-[m
[31m-    u->process_header = ngx_http_scgi_process_header;[m
[31m-[m
[31m-    return ngx_http_scgi_process_header(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *status_line;[m
[31m-    ngx_int_t                       rc, status;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            h->key.data = ngx_pnalloc(r->pool,[m
[31m-                                      h->key.len + 1 + h->value.len + 1[m
[31m-                                      + h->key.len);[m
[31m-            if (h->key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->value.data = h->key.data + h->key.len + 1;[m
[31m-            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;[m
[31m-[m
[31m-            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-            ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http scgi header: \"%V: %V\"", &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http scgi header done");[m
[31m-[m
[31m-            u = r->upstream;[m
[31m-[m
[31m-            if (u->headers_in.status_n) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (u->headers_in.status) {[m
[31m-                status_line = &u->headers_in.status->value;[m
[31m-[m
[31m-                status = ngx_atoi(status_line->data, 3);[m
[31m-                if (status == NGX_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "upstream sent invalid status \"%V\"",[m
[31m-                                  status_line);[m
[31m-                    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-                }[m
[31m-[m
[31m-                u->headers_in.status_n = status;[m
[31m-                u->headers_in.status_line = *status_line;[m
[31m-[m
[31m-            } else if (u->headers_in.location) {[m
[31m-                u->headers_in.status_n = 302;[m
[31m-                ngx_str_set(&u->headers_in.status_line,[m
[31m-                            "302 Moved Temporarily");[m
[31m-[m
[31m-            } else {[m
[31m-                u->headers_in.status_n = 200;[m
[31m-                ngx_str_set(&u->headers_in.status_line, "200 OK");[m
[31m-            }[m
[31m-[m
[31m-            if (u->state && u->state->status == 0) {[m
[31m-                u->state->status = u->headers_in.status_n;[m
[31m-            }[m
[31m-[m
[31m-        done:[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS[m
[31m-                && r->headers_in.upgrade)[m
[31m-            {[m
[31m-                u->upgrade = 1;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid header");[m
[31m-[m
[31m-        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_scgi_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http scgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http scgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_scgi_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_scgi_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_scgi_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-    /* "scgi_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "scgi");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *prev = parent;[m
[31m-    ngx_http_scgi_loc_conf_t *conf = child;[m
[31m-[m
[31m-    size_t                        size;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store, prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"scgi_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-            conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"scgi_busy_buffers_size\" must be equal to or greater "[m
[31m-            "than the maximum of the value of \"scgi_buffer_size\" and "[m
[31m-            "one of the \"scgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"scgi_busy_buffers_size\" must be less than "[m
[31m-            "the size of all \"scgi_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-            conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"scgi_temp_file_write_size\" must be equal to or greater than "[m
[31m-            "the maximum of the value of \"scgi_buffer_size\" and "[m
[31m-            "one of the \"scgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-            conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"scgi_max_temp_file_size\" must be equal to zero to disable "[m
[31m-            "temporary files usage or must be equal to or greater than "[m
[31m-            "the maximum of the value of \"scgi_buffer_size\" and "[m
[31m-            "one of the \"scgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                                 prev->upstream.ignore_headers,[m
[31m-                                 NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                                 prev->upstream.next_upstream,[m
[31m-                                 (NGX_CONF_BITMASK_SET[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                                  prev->upstream.temp_path,[m
[31m-                                  &ngx_http_scgi_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"scgi_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache && conf->cache_key.value.data == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "no \"scgi_cache_key\" for \"scgi_cache\"");[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                         prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                         prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                         prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "scgi_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_scgi_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->scgi_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->scgi_lengths = prev->scgi_lengths;[m
[31m-        conf->scgi_values = prev->scgi_values;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->scgi_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_scgi_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source == NULL) {[m
[31m-        conf->params = prev->params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->params_cache = prev->params_cache;[m
[31m-#endif[m
[31m-        conf->params_source = prev->params_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_scgi_init_params(cf, conf, &conf->params, NULL);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_scgi_init_params(cf, conf, &conf->params_cache,[m
[31m-                                       ngx_http_scgi_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_init_params(ngx_conf_t *cf, ngx_http_scgi_loc_conf_t *conf,[m
[31m-    ngx_http_scgi_params_t *params, ngx_keyval_t *default_params)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i, nsrc;[m
[31m-    ngx_array_t                   headers_names, params_merged;[m
[31m-    ngx_keyval_t                 *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_upstream_param_t    *src, *s;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (params->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source == NULL && default_params == NULL) {[m
[31m-        params->hash.buckets = (void *) 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    params->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (params->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    params->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (params->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source) {[m
[31m-        src = conf->params_source->elts;[m
[31m-        nsrc = conf->params_source->nelts;[m
[31m-[m
[31m-    } else {[m
[31m-        src = NULL;[m
[31m-        nsrc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (default_params) {[m
[31m-        if (ngx_array_init(&params_merged, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_upstream_param_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = src[i];[m
[31m-        }[m
[31m-[m
[31m-        h = default_params;[m
[31m-[m
[31m-        while (h->key.len) {[m
[31m-[m
[31m-            src = params_merged.elts;[m
[31m-            nsrc = params_merged.nelts;[m
[31m-[m
[31m-            for (i = 0; i < nsrc; i++) {[m
[31m-                if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            s->key = h->key;[m
[31m-            s->value = h->value;[m
[31m-            s->skip_empty = 1;[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            h++;[m
[31m-        }[m
[31m-[m
[31m-        src = params_merged.elts;[m
[31m-        nsrc = params_merged.nelts;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-        if (src[i].key.len > sizeof("HTTP_") - 1[m
[31m-            && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0)[m
[31m-        {[m
[31m-            hk = ngx_array_push(&headers_names);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key.len = src[i].key.len - 5;[m
[31m-            hk->key.data = src[i].key.data + 5;[m
[31m-            hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-            if (src[i].value.len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].key.len + 1;[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].skip_empty;[m
[31m-[m
[31m-[m
[31m-        size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                + src[i].key.len + 1 + sizeof(uintptr_t) - 1)[m
[31m-               & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->values, size);[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = ngx_http_script_copy_code;[m
[31m-        copy->len = src[i].key.len + 1;[m
[31m-[m
[31m-        p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-        (void) ngx_cpystrn(p, src[i].key.data, src[i].key.len + 1);[m
[31m-[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &src[i].value;[m
[31m-        sc.flushes = &params->flushes;[m
[31m-        sc.lengths = &params->lengths;[m
[31m-        sc.values = &params->values;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-        code = ngx_array_push_n(params->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-    params->number = headers_names.nelts;[m
[31m-[m
[31m-    hash.hash = &params->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = 64;[m
[31m-    hash.name = "scgi_params_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *scf = conf;[m
[31m-[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (scf->upstream.upstream || scf->scgi_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_scgi_handler;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &scf->scgi_lengths;[m
[31m-        sc.values = &scf->scgi_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    scf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (scf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *scf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (scf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        scf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (scf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"scgi_cache\"";[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    scf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &scf->upstream.store_lengths;[m
[31m-    sc.values = &scf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *scf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (scf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        scf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"scgi_store\"";[m
[31m-    }[m
[31m-[m
[31m-    scf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        scf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (scf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *scf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    scf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                     &ngx_http_scgi_module);[m
[31m-    if (scf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *scf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (scf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &scf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_secure_link_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_secure_link_module.c[m
[1mdeleted file mode 100644[m
[1mindex 907ba6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_secure_link_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,368 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_md5.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t  *variable;[m
[31m-    ngx_http_complex_value_t  *md5;[m
[31m-    ngx_str_t                  secret;[m
[31m-} ngx_http_secure_link_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  expires;[m
[31m-} ngx_http_secure_link_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_secure_link_old_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_secure_link_conf_t *conf, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data);[m
[31m-static ngx_int_t ngx_http_secure_link_expires_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static void *ngx_http_secure_link_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_secure_link_add_variables(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_secure_link_commands[] = {[m
[31m-[m
[31m-    { ngx_string("secure_link"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_secure_link_conf_t, variable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("secure_link_md5"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_secure_link_conf_t, md5),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("secure_link_secret"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_secure_link_conf_t, secret),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_secure_link_module_ctx = {[m
[31m-    ngx_http_secure_link_add_variables,    /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_secure_link_create_conf,      /* create location configuration */[m
[31m-    ngx_http_secure_link_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_secure_link_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_secure_link_module_ctx,      /* module context */[m
[31m-    ngx_http_secure_link_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_secure_link_name = ngx_string("secure_link");[m
[31m-static ngx_str_t  ngx_http_secure_link_expires_name =[m
[31m-    ngx_string("secure_link_expires");[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_secure_link_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                       *p, *last;[m
[31m-    ngx_str_t                     val, hash;[m
[31m-    time_t                        expires;[m
[31m-    ngx_md5_t                     md5;[m
[31m-    ngx_http_secure_link_ctx_t   *ctx;[m
[31m-    ngx_http_secure_link_conf_t  *conf;[m
[31m-    u_char                        hash_buf[16], md5_buf[16];[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_secure_link_module);[m
[31m-[m
[31m-    if (conf->secret.data) {[m
[31m-        return ngx_http_secure_link_old_variable(r, conf, v, data);[m
[31m-    }[m
[31m-[m
[31m-    if (conf->variable == NULL || conf->md5 == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, conf->variable, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "secure link: \"%V\"", &val);[m
[31m-[m
[31m-    last = val.data + val.len;[m
[31m-[m
[31m-    p = ngx_strlchr(val.data, last, ',');[m
[31m-    expires = 0;[m
[31m-[m
[31m-    if (p) {[m
[31m-        val.len = p++ - val.data;[m
[31m-[m
[31m-        expires = ngx_atotm(p, last - p);[m
[31m-        if (expires <= 0) {[m
[31m-            goto not_found;[m
[31m-        }[m
[31m-[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_secure_link_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_secure_link_module);[m
[31m-[m
[31m-        ctx->expires.len = last - p;[m
[31m-        ctx->expires.data = p;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len > 24) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    hash.len = 16;[m
[31m-    hash.data = hash_buf;[m
[31m-[m
[31m-    if (ngx_decode_base64url(&hash, &val) != NGX_OK) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    if (hash.len != 16) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, conf->md5, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "secure link md5: \"%V\"", &val);[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, val.data, val.len);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    if (ngx_memcmp(hash_buf, md5_buf, 16) != 0) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    v->data = (u_char *) ((expires && expires < ngx_time()) ? "0" : "1");[m
[31m-    v->len = 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_secure_link_old_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_secure_link_conf_t *conf, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    u_char      *p, *start, *end, *last;[m
[31m-    size_t       len;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i;[m
[31m-    ngx_md5_t    md5;[m
[31m-    u_char       hash[16];[m
[31m-[m
[31m-    p = &r->unparsed_uri.data[1];[m
[31m-    last = r->unparsed_uri.data + r->unparsed_uri.len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        if (*p++ == '/') {[m
[31m-            start = p;[m
[31m-            goto md5_start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    goto not_found;[m
[31m-[m
[31m-md5_start:[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        if (*p++ == '/') {[m
[31m-            end = p - 1;[m
[31m-            goto url_start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    goto not_found;[m
[31m-[m
[31m-url_start:[m
[31m-[m
[31m-    len = last - p;[m
[31m-[m
[31m-    if (end - start != 32 || len == 0) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, p, len);[m
[31m-    ngx_md5_update(&md5, conf->secret.data, conf->secret.len);[m
[31m-    ngx_md5_final(hash, &md5);[m
[31m-[m
[31m-    for (i = 0; i < 16; i++) {[m
[31m-        n = ngx_hextoi(&start[2 * i], 2);[m
[31m-        if (n == NGX_ERROR || n != hash[i]) {[m
[31m-            goto not_found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_secure_link_expires_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_secure_link_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_secure_link_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        v->len = ctx->expires.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = ctx->expires.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_secure_link_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_secure_link_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_secure_link_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->variable = NULL;[m
[31m-     *     conf->md5 = NULL;[m
[31m-     *     conf->secret = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_secure_link_conf_t *prev = parent;[m
[31m-    ngx_http_secure_link_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->secret.data) {[m
[31m-        if (conf->variable || conf->md5) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"secure_link_secret\" cannot be mixed with "[m
[31m-                               "\"secure_link\" and \"secure_link_md5\"");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->variable == NULL) {[m
[31m-        conf->variable = prev->variable;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->md5 == NULL) {[m
[31m-        conf->md5 = prev->md5;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->variable == NULL && conf->md5 == NULL) {[m
[31m-        conf->secret = prev->secret;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_secure_link_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_secure_link_name, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_secure_link_variable;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_secure_link_expires_name, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_secure_link_expires_variable;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_slice_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_slice_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 5e149b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_slice_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,526 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t      size;[m
[31m-} ngx_http_slice_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t       start;[m
[31m-    off_t       end;[m
[31m-    ngx_str_t   range;[m
[31m-    ngx_str_t   etag;[m
[31m-    ngx_uint_t  last;  /* unsigned  last:1; */[m
[31m-} ngx_http_slice_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t       start;[m
[31m-    off_t       end;[m
[31m-    off_t       complete_length;[m
[31m-} ngx_http_slice_content_range_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_slice_header_filter(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_slice_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_slice_parse_content_range(ngx_http_request_t *r,[m
[31m-    ngx_http_slice_content_range_t *cr);[m
[31m-static ngx_int_t ngx_http_slice_range_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static off_t ngx_http_slice_get_start(ngx_http_request_t *r);[m
[31m-static void *ngx_http_slice_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_slice_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_slice_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_slice_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_slice_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("slice"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_slice_loc_conf_t, size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_slice_filter_module_ctx = {[m
[31m-    ngx_http_slice_add_variables,          /* preconfiguration */[m
[31m-    ngx_http_slice_init,                   /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_slice_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_slice_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_slice_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_slice_filter_module_ctx,     /* module context */[m
[31m-    ngx_http_slice_filter_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_slice_range_name = ngx_string("slice_range");[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                            end;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_table_elt_t                 *h;[m
[31m-    ngx_http_slice_ctx_t            *ctx;[m
[31m-    ngx_http_slice_loc_conf_t       *slcf;[m
[31m-    ngx_http_slice_content_range_t   cr;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT) {[m
[31m-        if (r == r->main) {[m
[31m-            ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unexpected status code %ui in slice response",[m
[31m-                      r->headers_out.status);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = r->headers_out.etag;[m
[31m-[m
[31m-    if (ctx->etag.len) {[m
[31m-        if (h == NULL[m
[31m-            || h->value.len != ctx->etag.len[m
[31m-            || ngx_strncmp(h->value.data, ctx->etag.data, ctx->etag.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "etag mismatch in slice response");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (h) {[m
[31m-        ctx->etag = h->value;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_slice_parse_content_range(r, &cr) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid range in slice response");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cr.complete_length == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "no complete length in slice response");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http slice response range: %O-%O/%O",[m
[31m-                   cr.start, cr.end, cr.complete_length);[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    end = ngx_min(cr.start + (off_t) slcf->size, cr.complete_length);[m
[31m-[m
[31m-    if (cr.start != ctx->start || cr.end != end) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unexpected range in slice response: %O-%O",[m
[31m-                      cr.start, cr.end);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->start = end;[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.status_line.len = 0;[m
[31m-    r->headers_out.content_length_n = cr.complete_length;[m
[31m-    r->headers_out.content_offset = cr.start;[m
[31m-    r->headers_out.content_range->hash = 0;[m
[31m-    r->headers_out.content_range = NULL;[m
[31m-[m
[31m-    r->allow_ranges = 1;[m
[31m-    r->subrequest_ranges = 1;[m
[31m-    r->single_range = 1;[m
[31m-[m
[31m-    rc = ngx_http_next_header_filter(r);[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {[m
[31m-        if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) {[m
[31m-            ctx->start = slcf->size[m
[31m-                         * (r->headers_out.content_offset / slcf->size);[m
[31m-        }[m
[31m-[m
[31m-        ctx->end = r->headers_out.content_offset[m
[31m-                   + r->headers_out.content_length_n;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->end = cr.complete_length;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_chain_t                *cl;[m
[31m-    ngx_http_request_t         *sr;[m
[31m-    ngx_http_slice_ctx_t       *ctx;[m
[31m-    ngx_http_slice_loc_conf_t  *slcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || r != r->main) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            cl->buf->last_buf = 0;[m
[31m-            cl->buf->last_in_chain = 1;[m
[31m-            cl->buf->sync = 1;[m
[31m-            ctx->last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || !ctx->last) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->start >= ctx->end) {[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);[m
[31m-        ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_subrequest(r, &r->uri, &r->args, &sr, NULL, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(sr, ctx, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    ctx->range.len = ngx_sprintf(ctx->range.data, "bytes=%O-%O", ctx->start,[m
[31m-                                 ctx->start + (off_t) slcf->size - 1)[m
[31m-                     - ctx->range.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http slice subrequest: \"%V\"", &ctx->range);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_parse_content_range(ngx_http_request_t *r,[m
[31m-    ngx_http_slice_content_range_t *cr)[m
[31m-{[m
[31m-    off_t             start, end, complete_length, cutoff, cutlim;[m
[31m-    u_char           *p;[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    h = r->headers_out.content_range;[m
[31m-[m
[31m-    if (h == NULL[m
[31m-        || h->value.len < 7[m
[31m-        || ngx_strncmp(h->value.data, "bytes ", 6) != 0)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = h->value.data + 6;[m
[31m-[m
[31m-    cutoff = NGX_MAX_OFF_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_OFF_T_VALUE % 10;[m
[31m-[m
[31m-    start = 0;[m
[31m-    end = 0;[m
[31m-    complete_length = 0;[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (*p >= '0' && *p <= '9') {[m
[31m-        if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        start = start * 10 + *p++ - '0';[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p++ != '-') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (*p >= '0' && *p <= '9') {[m
[31m-        if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        end = end * 10 + *p++ - '0';[m
[31m-    }[m
[31m-[m
[31m-    end++;[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p++ != '/') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p != '*') {[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        while (*p >= '0' && *p <= '9') {[m
[31m-            if (complete_length >= cutoff[m
[31m-                && (complete_length > cutoff || *p - '0' > cutlim))[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            complete_length = complete_length * 10 + *p++ - '0';[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        complete_length = -1;[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p != '\0') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cr->start = start;[m
[31m-    cr->end = end;[m
[31m-    cr->complete_length = complete_length;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_range_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    ngx_http_slice_ctx_t       *ctx;[m
[31m-    ngx_http_slice_loc_conf_t  *slcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        if (r != r->main || r->headers_out.status) {[m
[31m-            v->not_found = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-        if (slcf->size == 0) {[m
[31m-            v->not_found = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_slice_filter_module);[m
[31m-[m
[31m-        p = ngx_pnalloc(r->pool, sizeof("bytes=-") - 1 + 2 * NGX_OFF_T_LEN);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->start = slcf->size * (ngx_http_slice_get_start(r) / slcf->size);[m
[31m-[m
[31m-        ctx->range.data = p;[m
[31m-        ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,[m
[31m-                                     ctx->start + (off_t) slcf->size - 1)[m
[31m-                         - p;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ctx->range.data;[m
[31m-    v->valid = 1;[m
[31m-    v->not_found = 0;[m
[31m-    v->no_cacheable = 1;[m
[31m-    v->len = ctx->range.len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static off_t[m
[31m-ngx_http_slice_get_start(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t             start, cutoff, cutlim;[m
[31m-    u_char           *p;[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    if (r->headers_in.if_range) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    h = r->headers_in.range;[m
[31m-[m
[31m-    if (h == NULL[m
[31m-        || h->value.len < 7[m
[31m-        || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0)[m
[31m-    {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    p = h->value.data + 6;[m
[31m-[m
[31m-    if (ngx_strchr(p, ',')) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p == '-') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_OFF_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_OFF_T_VALUE % 10;[m
[31m-[m
[31m-    start = 0;[m
[31m-[m
[31m-    while (*p >= '0' && *p <= '9') {[m
[31m-        if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        start = start * 10 + *p++ - '0';[m
[31m-    }[m
[31m-[m
[31m-    return start;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_slice_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_slice_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_palloc(cf->pool, sizeof(ngx_http_slice_loc_conf_t));[m
[31m-    if (slcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    slcf->size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return slcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_slice_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_slice_loc_conf_t *prev = parent;[m
[31m-    ngx_http_slice_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->size, prev->size, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_slice_range_name, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_slice_range_variable;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_slice_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_slice_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_split_clients_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_split_clients_module.c[m
[1mdeleted file mode 100644[m
[1mindex 2f92c9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_split_clients_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,246 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t                    percent;[m
[31m-    ngx_http_variable_value_t   value;[m
[31m-} ngx_http_split_clients_part_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t    value;[m
[31m-    ngx_array_t                 parts;[m
[31m-} ngx_http_split_clients_ctx_t;[m
[31m-[m
[31m-[m
[31m-static char *ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_split_clients(ngx_conf_t *cf, ngx_command_t *dummy,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_command_t  ngx_http_split_clients_commands[] = {[m
[31m-[m
[31m-    { ngx_string("split_clients"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_split_clients_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_split_clients_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_split_clients_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_split_clients_module_ctx,    /* module context */[m
[31m-    ngx_http_split_clients_commands,       /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_split_clients_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_split_clients_ctx_t *ctx = (ngx_http_split_clients_ctx_t *) data;[m
[31m-[m
[31m-    uint32_t                        hash;[m
[31m-    ngx_str_t                       val;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_http_split_clients_part_t  *part;[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &ctx->value, &val) != NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_murmur_hash2(val.data, val.len);[m
[31m-[m
[31m-    part = ctx->parts.elts;[m
[31m-[m
[31m-    for (i = 0; i < ctx->parts.nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http split: %uD %uD", hash, part[i].percent);[m
[31m-[m
[31m-        if (hash < part[i].percent || part[i].percent == 0) {[m
[31m-            *v = part[i].value;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                                *rv;[m
[31m-    uint32_t                             sum, last;[m
[31m-    ngx_str_t                           *value, name;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_conf_t                           save;[m
[31m-    ngx_http_variable_t                 *var;[m
[31m-    ngx_http_split_clients_ctx_t        *ctx;[m
[31m-    ngx_http_split_clients_part_t       *part;[m
[31m-    ngx_http_compile_complex_value_t     ccv;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_split_clients_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &ctx->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name = value[2];[m
[31m-[m
[31m-    if (name.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name.len--;[m
[31m-    name.data++;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_split_clients_variable;[m
[31m-    var->data = (uintptr_t) ctx;[m
[31m-[m
[31m-    if (ngx_array_init(&ctx->parts, cf->pool, 2,[m
[31m-                       sizeof(ngx_http_split_clients_part_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->handler = ngx_http_split_clients;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    sum = 0;[m
[31m-    last = 0;[m
[31m-    part = ctx->parts.elts;[m
[31m-[m
[31m-    for (i = 0; i < ctx->parts.nelts; i++) {[m
[31m-        sum = part[i].percent ? sum + part[i].percent : 10000;[m
[31m-        if (sum > 10000) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "percent total is greater than 100%%");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (part[i].percent) {[m
[31m-            last += part[i].percent * (uint64_t) 0xffffffff / 10000;[m
[31m-            part[i].percent = last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_split_clients(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    ngx_int_t                       n;[m
[31m-    ngx_str_t                      *value;[m
[31m-    ngx_http_split_clients_ctx_t   *ctx;[m
[31m-    ngx_http_split_clients_part_t  *part;[m
[31m-[m
[31m-    ctx = cf->ctx;[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    part = ngx_array_push(&ctx->parts);[m
[31m-    if (part == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[0].len == 1 && value[0].data[0] == '*') {[m
[31m-        part->percent = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        if (value[0].len == 0 || value[0].data[value[0].len - 1] != '%') {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_atofp(value[0].data, value[0].len - 1, 2);[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        part->percent = (uint32_t) n;[m
[31m-    }[m
[31m-[m
[31m-    part->value.len = value[1].len;[m
[31m-    part->value.valid = 1;[m
[31m-    part->value.no_cacheable = 0;[m
[31m-    part->value.not_found = 0;[m
[31m-    part->value.data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid percent value \"%V\"", &value[0]);[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex fc6e65b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,2930 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#define NGX_HTTP_SSI_ERROR          1[m
[31m-[m
[31m-#define NGX_HTTP_SSI_DATE_LEN       2048[m
[31m-[m
[31m-#define NGX_HTTP_SSI_ADD_PREFIX     1[m
[31m-#define NGX_HTTP_SSI_ADD_ZERO       2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t    enable;[m
[31m-    ngx_flag_t    silent_errors;[m
[31m-    ngx_flag_t    ignore_recycled_buffers;[m
[31m-    ngx_flag_t    last_modified;[m
[31m-[m
[31m-    ngx_hash_t    types;[m
[31m-[m
[31m-    size_t        min_file_chunk;[m
[31m-    size_t        value_len;[m
[31m-[m
[31m-    ngx_array_t  *types_keys;[m
[31m-} ngx_http_ssi_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     name;[m
[31m-    ngx_uint_t    key;[m
[31m-    ngx_str_t     value;[m
[31m-} ngx_http_ssi_var_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     name;[m
[31m-    ngx_chain_t  *bufs;[m
[31m-    ngx_uint_t    count;[m
[31m-} ngx_http_ssi_block_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ssi_start_state = 0,[m
[31m-    ssi_tag_state,[m
[31m-    ssi_comment0_state,[m
[31m-    ssi_comment1_state,[m
[31m-    ssi_sharp_state,[m
[31m-    ssi_precommand_state,[m
[31m-    ssi_command_state,[m
[31m-    ssi_preparam_state,[m
[31m-    ssi_param_state,[m
[31m-    ssi_preequal_state,[m
[31m-    ssi_prevalue_state,[m
[31m-    ssi_double_quoted_value_state,[m
[31m-    ssi_quoted_value_state,[m
[31m-    ssi_quoted_symbol_state,[m
[31m-    ssi_postparam_state,[m
[31m-    ssi_comment_end0_state,[m
[31m-    ssi_comment_end1_state,[m
[31m-    ssi_error_state,[m
[31m-    ssi_error_end0_state,[m
[31m-    ssi_error_end1_state[m
[31m-} ngx_http_ssi_state_e;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssi_output(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx);[m
[31m-static void ngx_http_ssi_buffered(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx);[m
[31m-static ngx_str_t *ngx_http_ssi_get_variable(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name, ngx_uint_t key);[m
[31m-static ngx_int_t ngx_http_ssi_evaluate_string(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t *text, ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_http_ssi_regex_match(ngx_http_request_t *r,[m
[31m-    ngx_str_t *pattern, ngx_str_t *str);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssi_include(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_stub_output(ngx_http_request_t *r, void *data,[m
[31m-    ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_ssi_set_variable(ngx_http_request_t *r, void *data,[m
[31m-    ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_ssi_echo(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_config(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_set(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_if(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_else(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_endif(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_block(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_endblock(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssi_date_gmt_local_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t gmt);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssi_preconfiguration(ngx_conf_t *cf);[m
[31m-static void *ngx_http_ssi_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_ssi_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_ssi_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_ssi_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_ssi_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_ssi_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssi"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_silent_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, silent_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_ignore_recycled_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, ignore_recycled_buffers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_min_file_chunk"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, min_file_chunk),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_value_length"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, value_len),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, types_keys),[m
[31m-      &ngx_http_html_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("ssi_last_modified"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, last_modified),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_ssi_filter_module_ctx = {[m
[31m-    ngx_http_ssi_preconfiguration,         /* preconfiguration */[m
[31m-    ngx_http_ssi_filter_init,              /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_ssi_create_main_conf,         /* create main configuration */[m
[31m-    ngx_http_ssi_init_main_conf,           /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_ssi_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_ssi_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_ssi_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_ssi_filter_module_ctx,       /* module context */[m
[31m-    ngx_http_ssi_filter_commands,          /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_ssi_string[] = "<!--";[m
[31m-[m
[31m-static ngx_str_t ngx_http_ssi_none = ngx_string("(none)");[m
[31m-static ngx_str_t ngx_http_ssi_timefmt = ngx_string("%A, %d-%b-%Y %H:%M:%S %Z");[m
[31m-static ngx_str_t ngx_http_ssi_null_string = ngx_null_string;[m
[31m-[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_VIRTUAL  0[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_FILE     1[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_WAIT     2[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_SET      3[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_STUB     4[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_ECHO_VAR         0[m
[31m-#define  NGX_HTTP_SSI_ECHO_DEFAULT     1[m
[31m-#define  NGX_HTTP_SSI_ECHO_ENCODING    2[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_CONFIG_ERRMSG    0[m
[31m-#define  NGX_HTTP_SSI_CONFIG_TIMEFMT   1[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_SET_VAR          0[m
[31m-#define  NGX_HTTP_SSI_SET_VALUE        1[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_IF_EXPR          0[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_BLOCK_NAME       0[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_include_params[] = {[m
[31m-    { ngx_string("virtual"), NGX_HTTP_SSI_INCLUDE_VIRTUAL, 0, 0 },[m
[31m-    { ngx_string("file"), NGX_HTTP_SSI_INCLUDE_FILE, 0, 0 },[m
[31m-    { ngx_string("wait"), NGX_HTTP_SSI_INCLUDE_WAIT, 0, 0 },[m
[31m-    { ngx_string("set"), NGX_HTTP_SSI_INCLUDE_SET, 0, 0 },[m
[31m-    { ngx_string("stub"), NGX_HTTP_SSI_INCLUDE_STUB, 0, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_echo_params[] = {[m
[31m-    { ngx_string("var"), NGX_HTTP_SSI_ECHO_VAR, 1, 0 },[m
[31m-    { ngx_string("default"), NGX_HTTP_SSI_ECHO_DEFAULT, 0, 0 },[m
[31m-    { ngx_string("encoding"), NGX_HTTP_SSI_ECHO_ENCODING, 0, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_config_params[] = {[m
[31m-    { ngx_string("errmsg"), NGX_HTTP_SSI_CONFIG_ERRMSG, 0, 0 },[m
[31m-    { ngx_string("timefmt"), NGX_HTTP_SSI_CONFIG_TIMEFMT, 0, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_set_params[] = {[m
[31m-    { ngx_string("var"), NGX_HTTP_SSI_SET_VAR, 1, 0 },[m
[31m-    { ngx_string("value"), NGX_HTTP_SSI_SET_VALUE, 1, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_if_params[] = {[m
[31m-    { ngx_string("expr"), NGX_HTTP_SSI_IF_EXPR, 1, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_block_params[] = {[m
[31m-    { ngx_string("name"), NGX_HTTP_SSI_BLOCK_NAME, 1, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_no_params[] = {[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_command_t  ngx_http_ssi_commands[] = {[m
[31m-    { ngx_string("include"), ngx_http_ssi_include,[m
[31m-                       ngx_http_ssi_include_params, 0, 0, 1 },[m
[31m-    { ngx_string("echo"), ngx_http_ssi_echo,[m
[31m-                       ngx_http_ssi_echo_params, 0, 0, 0 },[m
[31m-    { ngx_string("config"), ngx_http_ssi_config,[m
[31m-                       ngx_http_ssi_config_params, 0, 0, 0 },[m
[31m-    { ngx_string("set"), ngx_http_ssi_set, ngx_http_ssi_set_params, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("if"), ngx_http_ssi_if, ngx_http_ssi_if_params, 0, 0, 0 },[m
[31m-    { ngx_string("elif"), ngx_http_ssi_if, ngx_http_ssi_if_params,[m
[31m-                       NGX_HTTP_SSI_COND_IF, 0, 0 },[m
[31m-    { ngx_string("else"), ngx_http_ssi_else, ngx_http_ssi_no_params,[m
[31m-                       NGX_HTTP_SSI_COND_IF, 0, 0 },[m
[31m-    { ngx_string("endif"), ngx_http_ssi_endif, ngx_http_ssi_no_params,[m
[31m-                       NGX_HTTP_SSI_COND_ELSE, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("block"), ngx_http_ssi_block,[m
[31m-                       ngx_http_ssi_block_params, 0, 0, 0 },[m
[31m-    { ngx_string("endblock"), ngx_http_ssi_endblock,[m
[31m-                       ngx_http_ssi_no_params, 0, 1, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_ssi_vars[] = {[m
[31m-[m
[31m-    { ngx_string("date_local"), NULL, ngx_http_ssi_date_gmt_local_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("date_gmt"), NULL, ngx_http_ssi_date_gmt_local_variable, 1,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_ssi_ctx_t       *ctx;[m
[31m-    ngx_http_ssi_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (!slcf->enable[m
[31m-        || r->headers_out.content_length_n == 0[m
[31m-        || ngx_http_test_content_type(r, &slcf->types) == NULL)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_ssi_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-[m
[31m-    ctx->value_len = slcf->value_len;[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    ctx->encoding = NGX_HTTP_SSI_ENTITY_ENCODING;[m
[31m-    ctx->output = 1;[m
[31m-[m
[31m-    ctx->params.elts = ctx->params_array;[m
[31m-    ctx->params.size = sizeof(ngx_table_elt_t);[m
[31m-    ctx->params.nalloc = NGX_HTTP_SSI_PARAMS_N;[m
[31m-    ctx->params.pool = r->pool;[m
[31m-[m
[31m-    ctx->timefmt = ngx_http_ssi_timefmt;[m
[31m-    ngx_str_set(&ctx->errmsg,[m
[31m-                "[an error occurred while processing the directive]");[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-        ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-        if (!slcf->last_modified) {[m
[31m-            ngx_http_clear_last_modified(r);[m
[31m-            ngx_http_clear_etag(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_http_weak_etag(r);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     len;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_uint_t                 i, index;[m
[31m-    ngx_chain_t               *cl, **ll;[m
[31m-    ngx_table_elt_t           *param;[m
[31m-    ngx_http_ssi_ctx_t        *ctx, *mctx;[m
[31m-    ngx_http_ssi_block_t      *bl;[m
[31m-    ngx_http_ssi_param_t      *prm;[m
[31m-    ngx_http_ssi_command_t    *cmd;[m
[31m-    ngx_http_ssi_loc_conf_t   *slcf;[m
[31m-    ngx_http_ssi_main_conf_t  *smcf;[m
[31m-    ngx_str_t                 *params[NGX_HTTP_SSI_MAX_PARAMS + 1];[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL[m
[31m-        || (in == NULL[m
[31m-            && ctx->buf == NULL[m
[31m-            && ctx->in == NULL[m
[31m-            && ctx->busy == NULL))[m
[31m-    {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    /* add the incoming chain to the chain ctx->in */[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http ssi filter \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ctx->wait) {[m
[31m-[m
[31m-        if (r != r->connection->data) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http ssi filter wait \"%V?%V\" non-active",[m
[31m-                           &ctx->wait->uri, &ctx->wait->args);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->wait->done) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http ssi filter wait \"%V?%V\" done",[m
[31m-                           &ctx->wait->uri, &ctx->wait->args);[m
[31m-[m
[31m-            ctx->wait = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http ssi filter wait \"%V?%V\"",[m
[31m-                           &ctx->wait->uri, &ctx->wait->args);[m
[31m-[m
[31m-            return ngx_http_next_body_filter(r, NULL);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    while (ctx->in || ctx->buf) {[m
[31m-[m
[31m-        if (ctx->buf == NULL) {[m
[31m-            ctx->buf = ctx->in->buf;[m
[31m-            ctx->in = ctx->in->next;[m
[31m-            ctx->pos = ctx->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->state == ssi_start_state) {[m
[31m-            ctx->copy_start = ctx->pos;[m
[31m-            ctx->copy_end = ctx->pos;[m
[31m-        }[m
[31m-[m
[31m-        b = NULL;[m
[31m-[m
[31m-        while (ctx->pos < ctx->buf->last) {[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "saved: %uz state: %ui", ctx->saved, ctx->state);[m
[31m-[m
[31m-            rc = ngx_http_ssi_parse(r, ctx);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "parse: %i, looked: %uz %p-%p",[m
[31m-                           rc, ctx->looked, ctx->copy_start, ctx->copy_end);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->copy_start != ctx->copy_end) {[m
[31m-[m
[31m-                if (ctx->output) {[m
[31m-[m
[31m-                    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "saved: %uz", ctx->saved);[m
[31m-[m
[31m-                    if (ctx->saved) {[m
[31m-[m
[31m-                        if (ctx->free) {[m
[31m-                            cl = ctx->free;[m
[31m-                            ctx->free = ctx->free->next;[m
[31m-                            b = cl->buf;[m
[31m-                            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                        } else {[m
[31m-                            b = ngx_calloc_buf(r->pool);[m
[31m-                            if (b == NULL) {[m
[31m-                                return NGX_ERROR;[m
[31m-                            }[m
[31m-[m
[31m-                            cl = ngx_alloc_chain_link(r->pool);[m
[31m-                            if (cl == NULL) {[m
[31m-                                return NGX_ERROR;[m
[31m-                            }[m
[31m-[m
[31m-                            cl->buf = b;[m
[31m-                        }[m
[31m-[m
[31m-                        b->memory = 1;[m
[31m-                        b->pos = ngx_http_ssi_string;[m
[31m-                        b->last = ngx_http_ssi_string + ctx->saved;[m
[31m-[m
[31m-                        *ctx->last_out = cl;[m
[31m-                        ctx->last_out = &cl->next;[m
[31m-[m
[31m-                        ctx->saved = 0;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ctx->free) {[m
[31m-                        cl = ctx->free;[m
[31m-                        ctx->free = ctx->free->next;[m
[31m-                        b = cl->buf;[m
[31m-[m
[31m-                    } else {[m
[31m-                        b = ngx_alloc_buf(r->pool);[m
[31m-                        if (b == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl = ngx_alloc_chain_link(r->pool);[m
[31m-                        if (cl == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl->buf = b;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                    b->pos = ctx->copy_start;[m
[31m-                    b->last = ctx->copy_end;[m
[31m-                    b->shadow = NULL;[m
[31m-                    b->last_buf = 0;[m
[31m-                    b->recycled = 0;[m
[31m-[m
[31m-                    if (b->in_file) {[m
[31m-                        if (slcf->min_file_chunk < (size_t) (b->last - b->pos))[m
[31m-                        {[m
[31m-                            b->file_last = b->file_pos[m
[31m-                                                   + (b->last - ctx->buf->pos);[m
[31m-                            b->file_pos += b->pos - ctx->buf->pos;[m
[31m-[m
[31m-                        } else {[m
[31m-                            b->in_file = 0;[m
[31m-                        }[m
[31m-                    }[m
[31m-[m
[31m-                    cl->next = NULL;[m
[31m-                    *ctx->last_out = cl;[m
[31m-                    ctx->last_out = &cl->next;[m
[31m-[m
[31m-                } else {[m
[31m-                    if (ctx->block[m
[31m-                        && ctx->saved + (ctx->copy_end - ctx->copy_start))[m
[31m-                    {[m
[31m-                        b = ngx_create_temp_buf(r->pool,[m
[31m-                               ctx->saved + (ctx->copy_end - ctx->copy_start));[m
[31m-[m
[31m-                        if (b == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        if (ctx->saved) {[m
[31m-                            b->last = ngx_cpymem(b->pos, ngx_http_ssi_string,[m
[31m-                                                 ctx->saved);[m
[31m-                        }[m
[31m-[m
[31m-                        b->last = ngx_cpymem(b->last, ctx->copy_start,[m
[31m-                                             ctx->copy_end - ctx->copy_start);[m
[31m-[m
[31m-                        cl = ngx_alloc_chain_link(r->pool);[m
[31m-                        if (cl == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl->buf = b;[m
[31m-                        cl->next = NULL;[m
[31m-[m
[31m-                        b = NULL;[m
[31m-[m
[31m-                        mctx = ngx_http_get_module_ctx(r->main,[m
[31m-                                                   ngx_http_ssi_filter_module);[m
[31m-                        bl = mctx->blocks->elts;[m
[31m-                        for (ll = &bl[mctx->blocks->nelts - 1].bufs;[m
[31m-                             *ll;[m
[31m-                             ll = &(*ll)->next)[m
[31m-                        {[m
[31m-                            /* void */[m
[31m-                        }[m
[31m-[m
[31m-                        *ll = cl;[m
[31m-                    }[m
[31m-[m
[31m-                    ctx->saved = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->state == ssi_start_state) {[m
[31m-                ctx->copy_start = ctx->pos;[m
[31m-                ctx->copy_end = ctx->pos;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->copy_start = NULL;[m
[31m-                ctx->copy_end = NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            b = NULL;[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                smcf = ngx_http_get_module_main_conf(r,[m
[31m-                                                   ngx_http_ssi_filter_module);[m
[31m-[m
[31m-                cmd = ngx_hash_find(&smcf->hash, ctx->key, ctx->command.data,[m
[31m-                                    ctx->command.len);[m
[31m-[m
[31m-                if (cmd == NULL) {[m
[31m-                    if (ctx->output) {[m
[31m-                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                      "invalid SSI command: \"%V\"",[m
[31m-                                      &ctx->command);[m
[31m-                        goto ssi_error;[m
[31m-                    }[m
[31m-[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (!ctx->output && !cmd->block) {[m
[31m-[m
[31m-                    if (ctx->block) {[m
[31m-[m
[31m-                        /* reconstruct the SSI command text */[m
[31m-[m
[31m-                        len = 5 + ctx->command.len + 4;[m
[31m-[m
[31m-                        param = ctx->params.elts;[m
[31m-                        for (i = 0; i < ctx->params.nelts; i++) {[m
[31m-                            len += 1 + param[i].key.len + 2[m
[31m-                                + param[i].value.len + 1;[m
[31m-                        }[m
[31m-[m
[31m-                        b = ngx_create_temp_buf(r->pool, len);[m
[31m-[m
[31m-                        if (b == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl = ngx_alloc_chain_link(r->pool);[m
[31m-                        if (cl == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl->buf = b;[m
[31m-                        cl->next = NULL;[m
[31m-[m
[31m-                        *b->last++ = '<';[m
[31m-                        *b->last++ = '!';[m
[31m-                        *b->last++ = '-';[m
[31m-                        *b->last++ = '-';[m
[31m-                        *b->last++ = '#';[m
[31m-[m
[31m-                        b->last = ngx_cpymem(b->last, ctx->command.data,[m
[31m-                                             ctx->command.len);[m
[31m-[m
[31m-                        for (i = 0; i < ctx->params.nelts; i++) {[m
[31m-                            *b->last++ = ' ';[m
[31m-                            b->last = ngx_cpymem(b->last, param[i].key.data,[m
[31m-                                                 param[i].key.len);[m
[31m-                            *b->last++ = '=';[m
[31m-                            *b->last++ = '"';[m
[31m-                            b->last = ngx_cpymem(b->last, param[i].value.data,[m
[31m-                                                 param[i].value.len);[m
[31m-                            *b->last++ = '"';[m
[31m-                        }[m
[31m-[m
[31m-                        *b->last++ = ' ';[m
[31m-                        *b->last++ = '-';[m
[31m-                        *b->last++ = '-';[m
[31m-                        *b->last++ = '>';[m
[31m-[m
[31m-                        mctx = ngx_http_get_module_ctx(r->main,[m
[31m-                                                   ngx_http_ssi_filter_module);[m
[31m-                        bl = mctx->blocks->elts;[m
[31m-                        for (ll = &bl[mctx->blocks->nelts - 1].bufs;[m
[31m-                             *ll;[m
[31m-                             ll = &(*ll)->next)[m
[31m-                        {[m
[31m-                            /* void */[m
[31m-                        }[m
[31m-[m
[31m-                        *ll = cl;[m
[31m-[m
[31m-                        b = NULL;[m
[31m-[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    if (cmd->conditional == 0) {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (cmd->conditional[m
[31m-                    && (ctx->conditional == 0[m
[31m-                        || ctx->conditional > cmd->conditional))[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "invalid context of SSI command: \"%V\"",[m
[31m-                                  &ctx->command);[m
[31m-                    goto ssi_error;[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->params.nelts > NGX_HTTP_SSI_MAX_PARAMS) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "too many SSI command parameters: \"%V\"",[m
[31m-                                  &ctx->command);[m
[31m-                    goto ssi_error;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memzero(params,[m
[31m-                           (NGX_HTTP_SSI_MAX_PARAMS + 1) * sizeof(ngx_str_t *));[m
[31m-[m
[31m-                param = ctx->params.elts;[m
[31m-[m
[31m-                for (i = 0; i < ctx->params.nelts; i++) {[m
[31m-[m
[31m-                    for (prm = cmd->params; prm->name.len; prm++) {[m
[31m-[m
[31m-                        if (param[i].key.len != prm->name.len[m
[31m-                            || ngx_strncmp(param[i].key.data, prm->name.data,[m
[31m-                                           prm->name.len) != 0)[m
[31m-                        {[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                        if (!prm->multiple) {[m
[31m-                            if (params[prm->index]) {[m
[31m-                                ngx_log_error(NGX_LOG_ERR,[m
[31m-                                              r->connection->log, 0,[m
[31m-                                              "duplicate \"%V\" parameter "[m
[31m-                                              "in \"%V\" SSI command",[m
[31m-                                              &param[i].key, &ctx->command);[m
[31m-[m
[31m-                                goto ssi_error;[m
[31m-                            }[m
[31m-[m
[31m-                            params[prm->index] = &param[i].value;[m
[31m-[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        for (index = prm->index; params[index]; index++) {[m
[31m-                            /* void */[m
[31m-                        }[m
[31m-[m
[31m-                        params[index] = &param[i].value;[m
[31m-[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (prm->name.len == 0) {[m
[31m-                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                      "invalid parameter name: \"%V\" "[m
[31m-                                      "in \"%V\" SSI command",[m
[31m-                                      &param[i].key, &ctx->command);[m
[31m-[m
[31m-                        goto ssi_error;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                for (prm = cmd->params; prm->name.len; prm++) {[m
[31m-                    if (prm->mandatory && params[prm->index] == 0) {[m
[31m-                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                      "mandatory \"%V\" parameter is absent "[m
[31m-                                      "in \"%V\" SSI command",[m
[31m-                                      &prm->name, &ctx->command);[m
[31m-[m
[31m-                        goto ssi_error;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (cmd->flush && ctx->out) {[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "ssi flush");[m
[31m-[m
[31m-                    if (ngx_http_ssi_output(r, ctx) == NGX_ERROR) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                rc = cmd->handler(r, ctx, params);[m
[31m-[m
[31m-                if (rc == NGX_OK) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (rc == NGX_DONE || rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-                    ngx_http_ssi_buffered(r, ctx);[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            /* rc == NGX_HTTP_SSI_ERROR */[m
[31m-[m
[31m-    ssi_error:[m
[31m-[m
[31m-            if (slcf->silent_errors) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->free) {[m
[31m-                cl = ctx->free;[m
[31m-                ctx->free = ctx->free->next;[m
[31m-                b = cl->buf;[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            } else {[m
[31m-                b = ngx_calloc_buf(r->pool);[m
[31m-                if (b == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf = b;[m
[31m-            }[m
[31m-[m
[31m-            b->memory = 1;[m
[31m-            b->pos = ctx->errmsg.data;[m
[31m-            b->last = ctx->errmsg.data + ctx->errmsg.len;[m
[31m-[m
[31m-            cl->next = NULL;[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->buf->last_buf || ngx_buf_in_memory(ctx->buf)) {[m
[31m-            if (b == NULL) {[m
[31m-                if (ctx->free) {[m
[31m-                    cl = ctx->free;[m
[31m-                    ctx->free = ctx->free->next;[m
[31m-                    b = cl->buf;[m
[31m-                    ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                } else {[m
[31m-                    b = ngx_calloc_buf(r->pool);[m
[31m-                    if (b == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    cl = ngx_alloc_chain_link(r->pool);[m
[31m-                    if (cl == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    cl->buf = b;[m
[31m-                }[m
[31m-[m
[31m-                b->sync = 1;[m
[31m-[m
[31m-                cl->next = NULL;[m
[31m-                *ctx->last_out = cl;[m
[31m-                ctx->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            b->last_buf = ctx->buf->last_buf;[m
[31m-            b->shadow = ctx->buf;[m
[31m-[m
[31m-            if (slcf->ignore_recycled_buffers == 0)  {[m
[31m-                b->recycled = ctx->buf->recycled;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ctx->buf = NULL;[m
[31m-[m
[31m-        ctx->saved = ctx->looked;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->out == NULL && ctx->busy == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_ssi_output(r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_output(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-#if 1[m
[31m-    b = NULL;[m
[31m-    for (cl = ctx->out; cl; cl = cl->next) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "ssi out: %p %p", cl->buf, cl->buf->pos);[m
[31m-        if (cl->buf == b) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                          "the same buf was used in ssi");[m
[31m-            ngx_debug_point();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        b = cl->buf;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-    if (ctx->busy == NULL) {[m
[31m-        ctx->busy = ctx->out;[m
[31m-[m
[31m-    } else {[m
[31m-        for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }[m
[31m-        cl->next = ctx->out;[m
[31m-    }[m
[31m-[m
[31m-    ctx->out = NULL;[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    while (ctx->busy) {[m
[31m-[m
[31m-        cl = ctx->busy;[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) != 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (b->shadow) {[m
[31m-            b->shadow->pos = b->shadow->last;[m
[31m-        }[m
[31m-[m
[31m-        ctx->busy = cl->next;[m
[31m-[m
[31m-        if (ngx_buf_in_memory(b) || b->in_file) {[m
[31m-            /* add data bufs only to the free buf chain */[m
[31m-[m
[31m-            cl->next = ctx->free;[m
[31m-            ctx->free = cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_ssi_buffered(r, ctx);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssi_buffered(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)[m
[31m-{[m
[31m-    if (ctx->in || ctx->buf) {[m
[31m-        r->buffered |= NGX_HTTP_SSI_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        r->buffered &= ~NGX_HTTP_SSI_BUFFERED;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char                *p, *value, *last, *copy_end, ch;[m
[31m-    size_t                 looked;[m
[31m-    ngx_http_ssi_state_e   state;[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-    looked = ctx->looked;[m
[31m-    last = ctx->buf->last;[m
[31m-    copy_end = ctx->copy_end;[m
[31m-[m
[31m-    for (p = ctx->pos; p < last; p++) {[m
[31m-[m
[31m-        ch = *p;[m
[31m-[m
[31m-        if (state == ssi_start_state) {[m
[31m-[m
[31m-            /* the tight loop */[m
[31m-[m
[31m-            for ( ;; ) {[m
[31m-                if (ch == '<') {[m
[31m-                    copy_end = p;[m
[31m-                    looked = 1;[m
[31m-                    state = ssi_tag_state;[m
[31m-[m
[31m-                    goto tag_started;[m
[31m-                }[m
[31m-[m
[31m-                if (++p == last) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ch = *p;[m
[31m-            }[m
[31m-[m
[31m-            ctx->state = state;[m
[31m-            ctx->pos = p;[m
[31m-            ctx->looked = looked;[m
[31m-            ctx->copy_end = p;[m
[31m-[m
[31m-            if (ctx->copy_start == NULL) {[m
[31m-                ctx->copy_start = ctx->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-[m
[31m-        tag_started:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case ssi_start_state:[m
[31m-            /* not reached */[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_tag_state:[m
[31m-            switch (ch) {[m
[31m-            case '!':[m
[31m-                looked = 2;[m
[31m-                state = ssi_comment0_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '<':[m
[31m-                copy_end = p;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                copy_end = p;[m
[31m-                looked = 0;[m
[31m-                state = ssi_start_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_comment0_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                looked = 3;[m
[31m-                state = ssi_comment1_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '<':[m
[31m-                copy_end = p;[m
[31m-                looked = 1;[m
[31m-                state = ssi_tag_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                copy_end = p;[m
[31m-                looked = 0;[m
[31m-                state = ssi_start_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_comment1_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                looked = 4;[m
[31m-                state = ssi_sharp_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '<':[m
[31m-                copy_end = p;[m
[31m-                looked = 1;[m
[31m-                state = ssi_tag_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                copy_end = p;[m
[31m-                looked = 0;[m
[31m-                state = ssi_start_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_sharp_state:[m
[31m-            switch (ch) {[m
[31m-            case '#':[m
[31m-                if (p - ctx->pos < 4) {[m
[31m-                    ctx->saved = 0;[m
[31m-                }[m
[31m-                looked = 0;[m
[31m-                state = ssi_precommand_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '<':[m
[31m-                copy_end = p;[m
[31m-                looked = 1;[m
[31m-                state = ssi_tag_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                copy_end = p;[m
[31m-                looked = 0;[m
[31m-                state = ssi_start_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_precommand_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ctx->command.len = 1;[m
[31m-                ctx->command.data = ngx_pnalloc(r->pool,[m
[31m-                                                NGX_HTTP_SSI_COMMAND_LEN);[m
[31m-                if (ctx->command.data == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->command.data[0] = ch;[m
[31m-[m
[31m-                ctx->key = 0;[m
[31m-                ctx->key = ngx_hash(ctx->key, ch);[m
[31m-[m
[31m-                ctx->params.nelts = 0;[m
[31m-[m
[31m-                state = ssi_command_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_command_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                state = ssi_preparam_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '-':[m
[31m-                state = ssi_comment_end0_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (ctx->command.len == NGX_HTTP_SSI_COMMAND_LEN) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "the \"%V%c...\" SSI command is too long",[m
[31m-                                  &ctx->command, ch);[m
[31m-[m
[31m-                    state = ssi_error_state;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ctx->command.data[ctx->command.len++] = ch;[m
[31m-                ctx->key = ngx_hash(ctx->key, ch);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_preparam_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                break;[m
[31m-[m
[31m-            case '-':[m
[31m-                state = ssi_comment_end0_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ctx->param = ngx_array_push(&ctx->params);[m
[31m-                if (ctx->param == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->key.len = 1;[m
[31m-                ctx->param->key.data = ngx_pnalloc(r->pool,[m
[31m-                                                   NGX_HTTP_SSI_PARAM_LEN);[m
[31m-                if (ctx->param->key.data == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->key.data[0] = ch;[m
[31m-[m
[31m-                ctx->param->value.len = 0;[m
[31m-[m
[31m-                if (ctx->value_buf == NULL) {[m
[31m-                    ctx->param->value.data = ngx_pnalloc(r->pool,[m
[31m-                                                         ctx->value_len + 1);[m
[31m-                    if (ctx->param->value.data == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    ctx->param->value.data = ctx->value_buf;[m
[31m-                }[m
[31m-[m
[31m-                state = ssi_param_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_param_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                state = ssi_preequal_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '=':[m
[31m-                state = ssi_prevalue_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '-':[m
[31m-                state = ssi_error_end0_state;[m
[31m-[m
[31m-                ctx->param->key.data[ctx->param->key.len++] = ch;[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "invalid \"%V\" parameter in \"%V\" SSI command",[m
[31m-                              &ctx->param->key, &ctx->command);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (ctx->param->key.len == NGX_HTTP_SSI_PARAM_LEN) {[m
[31m-                    state = ssi_error_state;[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "too long \"%V%c...\" parameter in "[m
[31m-                                  "\"%V\" SSI command",[m
[31m-                                  &ctx->param->key, ch, &ctx->command);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->key.data[ctx->param->key.len++] = ch;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_preequal_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                break;[m
[31m-[m
[31m-            case '=':[m
[31m-                state = ssi_prevalue_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (ch == '-') {[m
[31m-                    state = ssi_error_end0_state;[m
[31m-                } else {[m
[31m-                    state = ssi_error_state;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol after \"%V\" "[m
[31m-                              "parameter in \"%V\" SSI command",[m
[31m-                              ch, &ctx->param->key, &ctx->command);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_prevalue_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                break;[m
[31m-[m
[31m-            case '"':[m
[31m-                state = ssi_double_quoted_value_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '\'':[m
[31m-                state = ssi_quoted_value_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (ch == '-') {[m
[31m-                    state = ssi_error_end0_state;[m
[31m-                } else {[m
[31m-                    state = ssi_error_state;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol before value of "[m
[31m-                              "\"%V\" parameter in \"%V\" SSI command",[m
[31m-                              ch, &ctx->param->key, &ctx->command);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_double_quoted_value_state:[m
[31m-            switch (ch) {[m
[31m-            case '"':[m
[31m-                state = ssi_postparam_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '\\':[m
[31m-                ctx->saved_state = ssi_double_quoted_value_state;[m
[31m-                state = ssi_quoted_symbol_state;[m
[31m-[m
[31m-                /* fall through */[m
[31m-[m
[31m-            default:[m
[31m-                if (ctx->param->value.len == ctx->value_len) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "too long \"%V%c...\" value of \"%V\" "[m
[31m-                                  "parameter in \"%V\" SSI command",[m
[31m-                                  &ctx->param->value, ch, &ctx->param->key,[m
[31m-                                  &ctx->command);[m
[31m-                    state = ssi_error_state;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->value.data[ctx->param->value.len++] = ch;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_quoted_value_state:[m
[31m-            switch (ch) {[m
[31m-            case '\'':[m
[31m-                state = ssi_postparam_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '\\':[m
[31m-                ctx->saved_state = ssi_quoted_value_state;[m
[31m-                state = ssi_quoted_symbol_state;[m
[31m-[m
[31m-                /* fall through */[m
[31m-[m
[31m-            default:[m
[31m-                if (ctx->param->value.len == ctx->value_len) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "too long \"%V%c...\" value of \"%V\" "[m
[31m-                                  "parameter in \"%V\" SSI command",[m
[31m-                                  &ctx->param->value, ch, &ctx->param->key,[m
[31m-                                  &ctx->command);[m
[31m-                    state = ssi_error_state;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->value.data[ctx->param->value.len++] = ch;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_quoted_symbol_state:[m
[31m-            state = ctx->saved_state;[m
[31m-[m
[31m-            if (ctx->param->value.len == ctx->value_len) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "too long \"%V%c...\" value of \"%V\" "[m
[31m-                              "parameter in \"%V\" SSI command",[m
[31m-                              &ctx->param->value, ch, &ctx->param->key,[m
[31m-                              &ctx->command);[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ctx->param->value.data[ctx->param->value.len++] = ch;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_postparam_state:[m
[31m-[m
[31m-            if (ctx->param->value.len + 1 < ctx->value_len / 2) {[m
[31m-                value = ngx_pnalloc(r->pool, ctx->param->value.len + 1);[m
[31m-                if (value == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(value, ctx->param->value.data,[m
[31m-                           ctx->param->value.len);[m
[31m-[m
[31m-                ctx->value_buf = ctx->param->value.data;[m
[31m-                ctx->param->value.data = value;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->value_buf = NULL;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                state = ssi_preparam_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '-':[m
[31m-                state = ssi_comment_end0_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol after \"%V\" value "[m
[31m-                              "of \"%V\" parameter in \"%V\" SSI command",[m
[31m-                              ch, &ctx->param->value, &ctx->param->key,[m
[31m-                              &ctx->command);[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_comment_end0_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                state = ssi_comment_end1_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol in \"%V\" SSI command",[m
[31m-                              ch, &ctx->command);[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_comment_end1_state:[m
[31m-            switch (ch) {[m
[31m-            case '>':[m
[31m-                ctx->state = ssi_start_state;[m
[31m-                ctx->pos = p + 1;[m
[31m-                ctx->looked = looked;[m
[31m-                ctx->copy_end = copy_end;[m
[31m-[m
[31m-                if (ctx->copy_start == NULL && copy_end) {[m
[31m-                    ctx->copy_start = ctx->buf->pos;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol in \"%V\" SSI command",[m
[31m-                              ch, &ctx->command);[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_error_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                state = ssi_error_end0_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_error_end0_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                state = ssi_error_end1_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_error_end1_state:[m
[31m-            switch (ch) {[m
[31m-            case '>':[m
[31m-                ctx->state = ssi_start_state;[m
[31m-                ctx->pos = p + 1;[m
[31m-                ctx->looked = looked;[m
[31m-                ctx->copy_end = copy_end;[m
[31m-[m
[31m-                if (ctx->copy_start == NULL && copy_end) {[m
[31m-                    ctx->copy_start = ctx->buf->pos;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_HTTP_SSI_ERROR;[m
[31m-[m
[31m-            default:[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->state = state;[m
[31m-    ctx->pos = p;[m
[31m-    ctx->looked = looked;[m
[31m-[m
[31m-    ctx->copy_end = (state == ssi_start_state) ? p : copy_end;[m
[31m-[m
[31m-    if (ctx->copy_start == NULL && ctx->copy_end) {[m
[31m-        ctx->copy_start = ctx->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_str_t *[m
[31m-ngx_http_ssi_get_variable(ngx_http_request_t *r, ngx_str_t *name,[m
[31m-    ngx_uint_t key)[m
[31m-{[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_list_part_t     *part;[m
[31m-    ngx_http_ssi_var_t  *var;[m
[31m-    ngx_http_ssi_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    {[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (key >= '0' && key <= '9') {[m
[31m-        i = key - '0';[m
[31m-[m
[31m-        if (i < ctx->ncaptures) {[m
[31m-            value = ngx_palloc(r->pool, sizeof(ngx_str_t));[m
[31m-            if (value == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            i *= 2;[m
[31m-[m
[31m-            value->data = ctx->captures_data + ctx->captures[i];[m
[31m-            value->len = ctx->captures[i + 1] - ctx->captures[i];[m
[31m-[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->variables == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    part = &ctx->variables->part;[m
[31m-    var = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            var = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (name->len != var[i].name.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (key != var[i].key) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(name->data, var[i].name.data, name->len) == 0) {[m
[31m-            return &var[i].value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_evaluate_string(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t *text, ngx_uint_t flags)[m
[31m-{[m
[31m-    u_char                      ch, *p, **value, *data, *part_data;[m
[31m-    size_t                     *size, len, prefix, part_len;[m
[31m-    ngx_str_t                   var, *val;[m
[31m-    ngx_int_t                   key;[m
[31m-    ngx_uint_t                  i, n, bracket, quoted;[m
[31m-    ngx_array_t                 lengths, values;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(text);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-[m
[31m-        data = text->data;[m
[31m-        p = data;[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_SSI_ADD_PREFIX) && text->data[0] != '/') {[m
[31m-[m
[31m-            for (prefix = r->uri.len; prefix; prefix--) {[m
[31m-                if (r->uri.data[prefix - 1] == '/') {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (prefix) {[m
[31m-                len = prefix + text->len;[m
[31m-[m
[31m-                data = ngx_pnalloc(r->pool, len);[m
[31m-                if (data == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                p = ngx_copy(data, r->uri.data, prefix);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        quoted = 0;[m
[31m-[m
[31m-        for (i = 0; i < text->len; i++) {[m
[31m-            ch = text->data[i];[m
[31m-[m
[31m-            if (!quoted) {[m
[31m-[m
[31m-                if (ch == '\\') {[m
[31m-                    quoted = 1;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                quoted = 0;[m
[31m-[m
[31m-                if (ch != '\\' && ch != '\'' && ch != '"' && ch != '$') {[m
[31m-                    *p++ = '\\';[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            *p++ = ch;[m
[31m-        }[m
[31m-[m
[31m-        text->len = p - data;[m
[31m-        text->data = data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&lengths, r->pool, 8, sizeof(size_t *)) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&values, r->pool, 8, sizeof(u_char *)) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    i = 0;[m
[31m-[m
[31m-    while (i < text->len) {[m
[31m-[m
[31m-        if (text->data[i] == '$') {[m
[31m-[m
[31m-            var.len = 0;[m
[31m-[m
[31m-            if (++i == text->len) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            if (text->data[i] == '{') {[m
[31m-                bracket = 1;[m
[31m-[m
[31m-                if (++i == text->len) {[m
[31m-                    goto invalid_variable;[m
[31m-                }[m
[31m-[m
[31m-                var.data = &text->data[i];[m
[31m-[m
[31m-            } else {[m
[31m-                bracket = 0;[m
[31m-                var.data = &text->data[i];[m
[31m-            }[m
[31m-[m
[31m-            for ( /* void */ ; i < text->len; i++, var.len++) {[m
[31m-                ch = text->data[i];[m
[31m-[m
[31m-                if (ch == '}' && bracket) {[m
[31m-                    i++;[m
[31m-                    bracket = 0;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if ((ch >= 'A' && ch <= 'Z')[m
[31m-                    || (ch >= 'a' && ch <= 'z')[m
[31m-                    || (ch >= '0' && ch <= '9')[m
[31m-                    || ch == '_')[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (bracket) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "the closing bracket in \"%V\" "[m
[31m-                              "variable is missing", &var);[m
[31m-                return NGX_HTTP_SSI_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (var.len == 0) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            key = ngx_hash_strlow(var.data, var.data, var.len);[m
[31m-[m
[31m-            val = ngx_http_ssi_get_variable(r, &var, key);[m
[31m-[m
[31m-            if (val == NULL) {[m
[31m-                vv = ngx_http_get_variable(r, &var, key);[m
[31m-                if (vv == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (vv->not_found) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                part_data = vv->data;[m
[31m-                part_len = vv->len;[m
[31m-[m
[31m-            } else {[m
[31m-                part_data = val->data;[m
[31m-                part_len = val->len;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            part_data = &text->data[i];[m
[31m-            quoted = 0;[m
[31m-[m
[31m-            for (p = part_data; i < text->len; i++) {[m
[31m-                ch = text->data[i];[m
[31m-[m
[31m-                if (!quoted) {[m
[31m-[m
[31m-                    if (ch == '\\') {[m
[31m-                        quoted = 1;[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ch == '$') {[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    quoted = 0;[m
[31m-[m
[31m-                    if (ch != '\\' && ch != '\'' && ch != '"' && ch != '$') {[m
[31m-                        *p++ = '\\';[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                *p++ = ch;[m
[31m-            }[m
[31m-[m
[31m-            part_len = p - part_data;[m
[31m-        }[m
[31m-[m
[31m-        len += part_len;[m
[31m-[m
[31m-        size = ngx_array_push(&lengths);[m
[31m-        if (size == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *size = part_len;[m
[31m-[m
[31m-        value = ngx_array_push(&values);[m
[31m-        if (value == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *value = part_data;[m
[31m-    }[m
[31m-[m
[31m-    prefix = 0;[m
[31m-[m
[31m-    size = lengths.elts;[m
[31m-    value = values.elts;[m
[31m-[m
[31m-    if (flags & NGX_HTTP_SSI_ADD_PREFIX) {[m
[31m-        for (i = 0; i < values.nelts; i++) {[m
[31m-            if (size[i] != 0) {[m
[31m-                if (*value[i] != '/') {[m
[31m-                    for (prefix = r->uri.len; prefix; prefix--) {[m
[31m-                        if (r->uri.data[prefix - 1] == '/') {[m
[31m-                            len += prefix;[m
[31m-                            break;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len + ((flags & NGX_HTTP_SSI_ADD_ZERO) ? 1 : 0));[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    text->len = len;[m
[31m-    text->data = p;[m
[31m-[m
[31m-    p = ngx_copy(p, r->uri.data, prefix);[m
[31m-[m
[31m-    for (i = 0; i < values.nelts; i++) {[m
[31m-        p = ngx_copy(p, value[i], size[i]);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid_variable:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "invalid variable name in \"%V\"", text);[m
[31m-[m
[31m-    return NGX_HTTP_SSI_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_regex_match(ngx_http_request_t *r, ngx_str_t *pattern,[m
[31m-    ngx_str_t *str)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    int                   rc, *captures;[m
[31m-    u_char               *p, errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    size_t                size;[m
[31m-    ngx_int_t             key;[m
[31m-    ngx_str_t            *vv, name, value;[m
[31m-    ngx_uint_t            i, n;[m
[31m-    ngx_http_ssi_ctx_t   *ctx;[m
[31m-    ngx_http_ssi_var_t   *var;[m
[31m-    ngx_regex_compile_t   rgc;[m
[31m-[m
[31m-    ngx_memzero(&rgc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rgc.pattern = *pattern;[m
[31m-    rgc.pool = r->pool;[m
[31m-    rgc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rgc.err.data = errstr;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rgc) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "%V", &rgc.err);[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = (rgc.captures + 1) * 3;[m
[31m-[m
[31m-    captures = ngx_palloc(r->pool, n * sizeof(int));[m
[31m-    if (captures == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_regex_exec(rgc.regex, str, captures, n);[m
[31m-[m
[31m-    if (rc < NGX_REGEX_NO_MATCHED) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      ngx_regex_exec_n " failed: %d on \"%V\" using \"%V\"",[m
[31m-                      rc, str, pattern);[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    ctx->ncaptures = rc;[m
[31m-    ctx->captures = captures;[m
[31m-    ctx->captures_data = str->data;[m
[31m-[m
[31m-    if (rgc.named_captures > 0) {[m
[31m-[m
[31m-        if (ctx->variables == NULL) {[m
[31m-            ctx->variables = ngx_list_create(r->pool, 4,[m
[31m-                                             sizeof(ngx_http_ssi_var_t));[m
[31m-            if (ctx->variables == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = rgc.name_size;[m
[31m-        p = rgc.names;[m
[31m-[m
[31m-        for (i = 0; i < (ngx_uint_t) rgc.named_captures; i++, p += size) {[m
[31m-[m
[31m-            name.data = &p[2];[m
[31m-            name.len = ngx_strlen(name.data);[m
[31m-[m
[31m-            n = 2 * ((p[0] << 8) + p[1]);[m
[31m-[m
[31m-            value.data = &str->data[captures[n]];[m
[31m-            value.len = captures[n + 1] - captures[n];[m
[31m-[m
[31m-            key = ngx_hash_strlow(name.data, name.data, name.len);[m
[31m-[m
[31m-            vv = ngx_http_ssi_get_variable(r, &name, key);[m
[31m-[m
[31m-            if (vv) {[m
[31m-                *vv = value;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            var = ngx_list_push(ctx->variables);[m
[31m-            if (var == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            var->name = name;[m
[31m-            var->key = key;[m
[31m-            var->value = value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                  "the using of the regex \"%V\" in SSI requires PCRE library",[m
[31m-                  pattern);[m
[31m-    return NGX_HTTP_SSI_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_include(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_int_t                    rc, key;[m
[31m-    ngx_str_t                   *uri, *file, *wait, *set, *stub, args;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_uint_t                   flags, i;[m
[31m-    ngx_chain_t                 *cl, *tl, **ll, *out;[m
[31m-    ngx_http_request_t          *sr;[m
[31m-    ngx_http_ssi_var_t          *var;[m
[31m-    ngx_http_ssi_ctx_t          *mctx;[m
[31m-    ngx_http_ssi_block_t        *bl;[m
[31m-    ngx_http_post_subrequest_t  *psr;[m
[31m-[m
[31m-    uri = params[NGX_HTTP_SSI_INCLUDE_VIRTUAL];[m
[31m-    file = params[NGX_HTTP_SSI_INCLUDE_FILE];[m
[31m-    wait = params[NGX_HTTP_SSI_INCLUDE_WAIT];[m
[31m-    set = params[NGX_HTTP_SSI_INCLUDE_SET];[m
[31m-    stub = params[NGX_HTTP_SSI_INCLUDE_STUB];[m
[31m-[m
[31m-    if (uri && file) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "inclusion may be either virtual=\"%V\" or file=\"%V\"",[m
[31m-                      uri, file);[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (uri == NULL && file == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "no parameter in \"include\" SSI command");[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (set && stub) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "\"set\" and \"stub\" cannot be used together "[m
[31m-                      "in \"include\" SSI command");[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (wait) {[m
[31m-        if (uri == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"wait\" cannot be used with file=\"%V\"", file);[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (wait->len == 2[m
[31m-            && ngx_strncasecmp(wait->data, (u_char *) "no", 2) == 0)[m
[31m-        {[m
[31m-            wait = NULL;[m
[31m-[m
[31m-        } else if (wait->len != 3[m
[31m-                   || ngx_strncasecmp(wait->data, (u_char *) "yes", 3) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "invalid value \"%V\" in the \"wait\" parameter",[m
[31m-                          wait);[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (uri == NULL) {[m
[31m-        uri = file;[m
[31m-        wait = (ngx_str_t *) -1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_ssi_evaluate_string(r, ctx, uri, NGX_HTTP_SSI_ADD_PREFIX);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi include: \"%V\"", uri);[m
[31m-[m
[31m-    ngx_str_null(&args);[m
[31m-    flags = NGX_HTTP_LOG_UNSAFE;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    psr = NULL;[m
[31m-[m
[31m-    mctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (stub) {[m
[31m-        if (mctx->blocks) {[m
[31m-            bl = mctx->blocks->elts;[m
[31m-            for (i = 0; i < mctx->blocks->nelts; i++) {[m
[31m-                if (stub->len == bl[i].name.len[m
[31m-                    && ngx_strncmp(stub->data, bl[i].name.data, stub->len) == 0)[m
[31m-                {[m
[31m-                    goto found;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "\"stub\"=\"%V\" for \"include\" not found", stub);[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-        if (psr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        psr->handler = ngx_http_ssi_stub_output;[m
[31m-[m
[31m-        if (bl[i].count++) {[m
[31m-[m
[31m-            out = NULL;[m
[31m-            ll = &out;[m
[31m-[m
[31m-            for (tl = bl[i].bufs; tl; tl = tl->next) {[m
[31m-[m
[31m-                if (ctx->free) {[m
[31m-                    cl = ctx->free;[m
[31m-                    ctx->free = ctx->free->next;[m
[31m-                    b = cl->buf;[m
[31m-[m
[31m-                } else {[m
[31m-                    b = ngx_alloc_buf(r->pool);[m
[31m-                    if (b == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    cl = ngx_alloc_chain_link(r->pool);[m
[31m-                    if (cl == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    cl->buf = b;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(b, tl->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->pos = b->start;[m
[31m-[m
[31m-                *ll = cl;[m
[31m-                cl->next = NULL;[m
[31m-                ll = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            psr->data = out;[m
[31m-[m
[31m-        } else {[m
[31m-            psr->data = bl[i].bufs;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (wait) {[m
[31m-        flags |= NGX_HTTP_SUBREQUEST_WAITED;[m
[31m-    }[m
[31m-[m
[31m-    if (set) {[m
[31m-        key = ngx_hash_strlow(set->data, set->data, set->len);[m
[31m-[m
[31m-        psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-        if (psr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        psr->handler = ngx_http_ssi_set_variable;[m
[31m-        psr->data = ngx_http_ssi_get_variable(r, set, key);[m
[31m-[m
[31m-        if (psr->data == NULL) {[m
[31m-[m
[31m-            if (mctx->variables == NULL) {[m
[31m-                mctx->variables = ngx_list_create(r->pool, 4,[m
[31m-                                                  sizeof(ngx_http_ssi_var_t));[m
[31m-                if (mctx->variables == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            var = ngx_list_push(mctx->variables);[m
[31m-            if (var == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            var->name = *set;[m
[31m-            var->key = key;[m
[31m-            var->value = ngx_http_ssi_null_string;[m
[31m-            psr->data = &var->value;[m
[31m-        }[m
[31m-[m
[31m-        flags |= NGX_HTTP_SUBREQUEST_IN_MEMORY|NGX_HTTP_SUBREQUEST_WAITED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_subrequest(r, uri, &args, &sr, psr, flags) != NGX_OK) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (wait == NULL && set == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->wait == NULL) {[m
[31m-        ctx->wait = sr;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "can only wait for one subrequest at a time");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_stub_output(ngx_http_request_t *r, void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_chain_t  *out;[m
[31m-[m
[31m-    if (rc == NGX_ERROR || r->connection->error || r->request_output) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi stub output: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    out = data;[m
[31m-[m
[31m-    if (!r->header_sent) {[m
[31m-        r->headers_out.content_type_len =[m
[31m-                                      r->parent->headers_out.content_type_len;[m
[31m-        r->headers_out.content_type = r->parent->headers_out.content_type;[m
[31m-[m
[31m-        if (ngx_http_send_header(r) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_set_variable(ngx_http_request_t *r, void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_str_t  *value = data;[m
[31m-[m
[31m-    if (r->upstream) {[m
[31m-        value->len = r->upstream->buffer.last - r->upstream->buffer.pos;[m
[31m-        value->data = r->upstream->buffer.pos;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_echo(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    uintptr_t                   len;[m
[31m-    ngx_int_t                   key;[m
[31m-    ngx_buf_t                  *b;[m
[31m-    ngx_str_t                  *var, *value, *enc, text;[m
[31m-    ngx_chain_t                *cl;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-[m
[31m-    var = params[NGX_HTTP_SSI_ECHO_VAR];[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi echo \"%V\"", var);[m
[31m-[m
[31m-    key = ngx_hash_strlow(var->data, var->data, var->len);[m
[31m-[m
[31m-    value = ngx_http_ssi_get_variable(r, var, key);[m
[31m-[m
[31m-    if (value == NULL) {[m
[31m-        vv = ngx_http_get_variable(r, var, key);[m
[31m-[m
[31m-        if (vv == NULL) {[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (!vv->not_found) {[m
[31m-            text.data = vv->data;[m
[31m-            text.len = vv->len;[m
[31m-            value = &text;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (value == NULL) {[m
[31m-        value = params[NGX_HTTP_SSI_ECHO_DEFAULT];[m
[31m-[m
[31m-        if (value == NULL) {[m
[31m-            value = &ngx_http_ssi_none;[m
[31m-[m
[31m-        } else if (value->len == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (value->len == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    enc = params[NGX_HTTP_SSI_ECHO_ENCODING];[m
[31m-[m
[31m-    if (enc) {[m
[31m-        if (enc->len == 4 && ngx_strncmp(enc->data, "none", 4) == 0) {[m
[31m-[m
[31m-            ctx->encoding = NGX_HTTP_SSI_NO_ENCODING;[m
[31m-[m
[31m-        } else if (enc->len == 3 && ngx_strncmp(enc->data, "url", 3) == 0) {[m
[31m-[m
[31m-            ctx->encoding = NGX_HTTP_SSI_URL_ENCODING;[m
[31m-[m
[31m-        } else if (enc->len == 6 && ngx_strncmp(enc->data, "entity", 6) == 0) {[m
[31m-[m
[31m-            ctx->encoding = NGX_HTTP_SSI_ENTITY_ENCODING;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "unknown encoding \"%V\" in the \"echo\" command",[m
[31m-                          enc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = value->data;[m
[31m-[m
[31m-    switch (ctx->encoding) {[m
[31m-[m
[31m-    case NGX_HTTP_SSI_URL_ENCODING:[m
[31m-        len = 2 * ngx_escape_uri(NULL, value->data, value->len,[m
[31m-                                 NGX_ESCAPE_HTML);[m
[31m-[m
[31m-        if (len) {[m
[31m-            p = ngx_pnalloc(r->pool, value->len + len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_HTTP_SSI_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_escape_uri(p, value->data, value->len, NGX_ESCAPE_HTML);[m
[31m-        }[m
[31m-[m
[31m-        len += value->len;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_SSI_ENTITY_ENCODING:[m
[31m-        len = ngx_escape_html(NULL, value->data, value->len);[m
[31m-[m
[31m-        if (len) {[m
[31m-            p = ngx_pnalloc(r->pool, value->len + len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_HTTP_SSI_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_escape_html(p, value->data, value->len);[m
[31m-        }[m
[31m-[m
[31m-        len += value->len;[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_HTTP_SSI_NO_ENCODING */[m
[31m-        len = value->len;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-    b->pos = p;[m
[31m-    b->last = p + len;[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-    *ctx->last_out = cl;[m
[31m-    ctx->last_out = &cl->next;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_config(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    value = params[NGX_HTTP_SSI_CONFIG_TIMEFMT];[m
[31m-[m
[31m-    if (value) {[m
[31m-        ctx->timefmt.len = value->len;[m
[31m-        ctx->timefmt.data = ngx_pnalloc(r->pool, value->len + 1);[m
[31m-        if (ctx->timefmt.data == NULL) {[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_cpystrn(ctx->timefmt.data, value->data, value->len + 1);[m
[31m-    }[m
[31m-[m
[31m-    value = params[NGX_HTTP_SSI_CONFIG_ERRMSG];[m
[31m-[m
[31m-    if (value) {[m
[31m-        ctx->errmsg = *value;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_set(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_int_t            key, rc;[m
[31m-    ngx_str_t           *name, *value, *vv;[m
[31m-    ngx_http_ssi_var_t  *var;[m
[31m-    ngx_http_ssi_ctx_t  *mctx;[m
[31m-[m
[31m-    mctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (mctx->variables == NULL) {[m
[31m-        mctx->variables = ngx_list_create(r->pool, 4,[m
[31m-                                          sizeof(ngx_http_ssi_var_t));[m
[31m-        if (mctx->variables == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    name = params[NGX_HTTP_SSI_SET_VAR];[m
[31m-    value = params[NGX_HTTP_SSI_SET_VALUE];[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi set \"%V\" \"%V\"", name, value);[m
[31m-[m
[31m-    rc = ngx_http_ssi_evaluate_string(r, ctx, value, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    key = ngx_hash_strlow(name->data, name->data, name->len);[m
[31m-[m
[31m-    vv = ngx_http_ssi_get_variable(r, name, key);[m
[31m-[m
[31m-    if (vv) {[m
[31m-        *vv = *value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_list_push(mctx->variables);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->name = *name;[m
[31m-    var->key = key;[m
[31m-    var->value = *value;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "set: \"%V\"=\"%V\"", name, value);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_if(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    u_char       *p, *last;[m
[31m-    ngx_str_t    *expr, left, right;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_uint_t    negative, noregex, flags;[m
[31m-[m
[31m-    if (ctx->command.len == 2) {[m
[31m-        if (ctx->conditional) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "the \"if\" command inside the \"if\" command");[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->output_chosen) {[m
[31m-        ctx->output = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    expr = params[NGX_HTTP_SSI_IF_EXPR];[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi if expr=\"%V\"", expr);[m
[31m-[m
[31m-    left.data = expr->data;[m
[31m-    last = expr->data + expr->len;[m
[31m-[m
[31m-    for (p = left.data; p < last; p++) {[m
[31m-        if (*p >= 'A' && *p <= 'Z') {[m
[31m-            *p |= 0x20;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((*p >= 'a' && *p <= 'z')[m
[31m-             || (*p >= '0' && *p <= '9')[m
[31m-             || *p == '$' || *p == '{' || *p == '}' || *p == '_'[m
[31m-             || *p == '"' || *p == '\'')[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    left.len = p - left.data;[m
[31m-[m
[31m-    while (p < last && *p == ' ') {[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    flags = 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "left: \"%V\"", &left);[m
[31m-[m
[31m-    rc = ngx_http_ssi_evaluate_string(r, ctx, &left, flags);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "evaluated left: \"%V\"", &left);[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        if (left.len) {[m
[31m-            ctx->output = 1;[m
[31m-            ctx->output_chosen = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->output = 0;[m
[31m-        }[m
[31m-[m
[31m-        ctx->conditional = NGX_HTTP_SSI_COND_IF;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (p < last && *p == '=') {[m
[31m-        negative = 0;[m
[31m-        p++;[m
[31m-[m
[31m-    } else if (p + 1 < last && *p == '!' && *(p + 1) == '=') {[m
[31m-        negative = 1;[m
[31m-        p += 2;[m
[31m-[m
[31m-    } else {[m
[31m-        goto invalid_expression;[m
[31m-    }[m
[31m-[m
[31m-    while (p < last && *p == ' ') {[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    if (p < last - 1 && *p == '/') {[m
[31m-        if (*(last - 1) != '/') {[m
[31m-            goto invalid_expression;[m
[31m-        }[m
[31m-[m
[31m-        noregex = 0;[m
[31m-        flags = NGX_HTTP_SSI_ADD_ZERO;[m
[31m-        last--;[m
[31m-        p++;[m
[31m-[m
[31m-    } else {[m
[31m-        noregex = 1;[m
[31m-        flags = 0;[m
[31m-[m
[31m-        if (p < last - 1 && p[0] == '\\' && p[1] == '/') {[m
[31m-            p++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    right.len = last - p;[m
[31m-    right.data = p;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "right: \"%V\"", &right);[m
[31m-[m
[31m-    rc = ngx_http_ssi_evaluate_string(r, ctx, &right, flags);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "evaluated right: \"%V\"", &right);[m
[31m-[m
[31m-    if (noregex) {[m
[31m-        if (left.len != right.len) {[m
[31m-            rc = -1;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_strncmp(left.data, right.data, right.len);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        right.data[right.len] = '\0';[m
[31m-[m
[31m-        rc = ngx_http_ssi_regex_match(r, &right, &left);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = 0;[m
[31m-        } else if (rc == NGX_DECLINED) {[m
[31m-            rc = -1;[m
[31m-        } else {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((rc == 0 && !negative) || (rc != 0 && negative)) {[m
[31m-        ctx->output = 1;[m
[31m-        ctx->output_chosen = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->output = 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx->conditional = NGX_HTTP_SSI_COND_IF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid_expression:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "invalid expression in \"%V\"", expr);[m
[31m-[m
[31m-    return NGX_HTTP_SSI_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_else(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi else");[m
[31m-[m
[31m-    if (ctx->output_chosen) {[m
[31m-        ctx->output = 0;[m
[31m-    } else {[m
[31m-        ctx->output = 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->conditional = NGX_HTTP_SSI_COND_ELSE;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_endif(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi endif");[m
[31m-[m
[31m-    ctx->output = 1;[m
[31m-    ctx->output_chosen = 0;[m
[31m-    ctx->conditional = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_block(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_http_ssi_ctx_t    *mctx;[m
[31m-    ngx_http_ssi_block_t  *bl;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi block");[m
[31m-[m
[31m-    mctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (mctx->blocks == NULL) {[m
[31m-        mctx->blocks = ngx_array_create(r->pool, 4,[m
[31m-                                        sizeof(ngx_http_ssi_block_t));[m
[31m-        if (mctx->blocks == NULL) {[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    bl = ngx_array_push(mctx->blocks);[m
[31m-    if (bl == NULL) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bl->name = *params[NGX_HTTP_SSI_BLOCK_NAME];[m
[31m-    bl->bufs = NULL;[m
[31m-    bl->count = 0;[m
[31m-[m
[31m-    ctx->output = 0;[m
[31m-    ctx->block = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_endblock(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi endblock");[m
[31m-[m
[31m-    ctx->output = 1;[m
[31m-    ctx->block = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_date_gmt_local_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t gmt)[m
[31m-{[m
[31m-    ngx_http_ssi_ctx_t  *ctx;[m
[31m-    ngx_time_t          *tp;[m
[31m-    ngx_str_t           *timefmt;[m
[31m-    struct tm            tm;[m
[31m-    char                 buf[NGX_HTTP_SSI_DATE_LEN];[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    timefmt = ctx ? &ctx->timefmt : &ngx_http_ssi_timefmt;[m
[31m-[m
[31m-    if (timefmt->len == sizeof("%s") - 1[m
[31m-        && timefmt->data[0] == '%' && timefmt->data[1] == 's')[m
[31m-    {[m
[31m-        v->data = ngx_pnalloc(r->pool, NGX_TIME_T_LEN);[m
[31m-        if (v->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_sprintf(v->data, "%T", tp->sec) - v->data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (gmt) {[m
[31m-        ngx_libc_gmtime(tp->sec, &tm);[m
[31m-    } else {[m
[31m-        ngx_libc_localtime(tp->sec, &tm);[m
[31m-    }[m
[31m-[m
[31m-    v->len = strftime(buf, NGX_HTTP_SSI_DATE_LEN,[m
[31m-                      (char *) timefmt->data, &tm);[m
[31m-    if (v->len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, v->len);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(v->data, buf, v->len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_variable_t       *var, *v;[m
[31m-    ngx_http_ssi_command_t    *cmd;[m
[31m-    ngx_http_ssi_main_conf_t  *smcf;[m
[31m-[m
[31m-    for (v = ngx_http_ssi_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    smcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    for (cmd = ngx_http_ssi_commands; cmd->name.len; cmd++) {[m
[31m-        rc = ngx_hash_add_key(&smcf->commands, &cmd->name, cmd,[m
[31m-                              NGX_HASH_READONLY_KEY);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "conflicting SSI command \"%V\"", &cmd->name);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_ssi_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_ssi_main_conf_t  *smcf;[m
[31m-[m
[31m-    smcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ssi_main_conf_t));[m
[31m-    if (smcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    smcf->commands.pool = cf->pool;[m
[31m-    smcf->commands.temp_pool = cf->temp_pool;[m
[31m-[m
[31m-    if (ngx_hash_keys_array_init(&smcf->commands, NGX_HASH_SMALL) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return smcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssi_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_ssi_main_conf_t *smcf = conf;[m
[31m-[m
[31m-    ngx_hash_init_t  hash;[m
[31m-[m
[31m-    hash.hash = &smcf->hash;[m
[31m-    hash.key = ngx_hash_key;[m
[31m-    hash.max_size = 1024;[m
[31m-    hash.bucket_size = ngx_cacheline_size;[m
[31m-    hash.name = "ssi_command_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, smcf->commands.keys.elts,[m
[31m-                      smcf->commands.keys.nelts)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_ssi_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_ssi_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ssi_loc_conf_t));[m
[31m-    if (slcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-    slcf->enable = NGX_CONF_UNSET;[m
[31m-    slcf->silent_errors = NGX_CONF_UNSET;[m
[31m-    slcf->ignore_recycled_buffers = NGX_CONF_UNSET;[m
[31m-    slcf->last_modified = NGX_CONF_UNSET;[m
[31m-[m
[31m-    slcf->min_file_chunk = NGX_CONF_UNSET_SIZE;[m
[31m-    slcf->value_len = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return slcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_ssi_loc_conf_t *prev = parent;[m
[31m-    ngx_http_ssi_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_value(conf->silent_errors, prev->silent_errors, 0);[m
[31m-    ngx_conf_merge_value(conf->ignore_recycled_buffers,[m
[31m-                         prev->ignore_recycled_buffers, 0);[m
[31m-    ngx_conf_merge_value(conf->last_modified, prev->last_modified, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->min_file_chunk, prev->min_file_chunk, 1024);[m
[31m-    ngx_conf_merge_size_value(conf->value_len, prev->value_len, 255);[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_html_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_ssi_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_ssi_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.h[m
[1mdeleted file mode 100644[m
[1mindex 0bd01a0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SSI_FILTER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SSI_FILTER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_SSI_MAX_PARAMS       16[m
[31m-[m
[31m-#define NGX_HTTP_SSI_COMMAND_LEN      32[m
[31m-#define NGX_HTTP_SSI_PARAM_LEN        32[m
[31m-#define NGX_HTTP_SSI_PARAMS_N         4[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_SSI_COND_IF          1[m
[31m-#define NGX_HTTP_SSI_COND_ELSE        2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_SSI_NO_ENCODING      0[m
[31m-#define NGX_HTTP_SSI_URL_ENCODING     1[m
[31m-#define NGX_HTTP_SSI_ENTITY_ENCODING  2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t                hash;[m
[31m-    ngx_hash_keys_arrays_t    commands;[m
[31m-} ngx_http_ssi_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_buf_t                *buf;[m
[31m-[m
[31m-    u_char                   *pos;[m
[31m-    u_char                   *copy_start;[m
[31m-    u_char                   *copy_end;[m
[31m-[m
[31m-    ngx_uint_t                key;[m
[31m-    ngx_str_t                 command;[m
[31m-    ngx_array_t               params;[m
[31m-    ngx_table_elt_t          *param;[m
[31m-    ngx_table_elt_t           params_array[NGX_HTTP_SSI_PARAMS_N];[m
[31m-[m
[31m-    ngx_chain_t              *in;[m
[31m-    ngx_chain_t              *out;[m
[31m-    ngx_chain_t             **last_out;[m
[31m-    ngx_chain_t              *busy;[m
[31m-    ngx_chain_t              *free;[m
[31m-[m
[31m-    ngx_uint_t                state;[m
[31m-    ngx_uint_t                saved_state;[m
[31m-    size_t                    saved;[m
[31m-    size_t                    looked;[m
[31m-[m
[31m-    size_t                    value_len;[m
[31m-[m
[31m-    ngx_list_t               *variables;[m
[31m-    ngx_array_t              *blocks;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                ncaptures;[m
[31m-    int                      *captures;[m
[31m-    u_char                   *captures_data;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                  conditional:2;[m
[31m-    unsigned                  encoding:2;[m
[31m-    unsigned                  block:1;[m
[31m-    unsigned                  output:1;[m
[31m-    unsigned                  output_chosen:1;[m
[31m-[m
[31m-    ngx_http_request_t       *wait;[m
[31m-    void                     *value_buf;[m
[31m-    ngx_str_t                 timefmt;[m
[31m-    ngx_str_t                 errmsg;[m
[31m-} ngx_http_ssi_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_ssi_command_pt) (ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_uint_t                index;[m
[31m-[m
[31m-    unsigned                  mandatory:1;[m
[31m-    unsigned                  multiple:1;[m
[31m-} ngx_http_ssi_param_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_http_ssi_command_pt   handler;[m
[31m-    ngx_http_ssi_param_t     *params;[m
[31m-[m
[31m-    unsigned                  conditional:2;[m
[31m-    unsigned                  block:1;[m
[31m-    unsigned                  flush:1;[m
[31m-} ngx_http_ssi_command_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_ssi_filter_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SSI_FILTER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6a4108c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,967 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_ssl_variable_handler_pt)(ngx_connection_t *c,[m
[31m-    ngx_pool_t *pool, ngx_str_t *s);[m
[31m-[m
[31m-[m
[31m-#define NGX_DEFAULT_CIPHERS     "HIGH:!aNULL:!MD5"[m
[31m-#define NGX_DEFAULT_ECDH_CURVE  "prime256v1"[m
[31m-[m
[31m-#define NGX_HTTP_NPN_ADVERTISE  "\x08http/1.1"[m
[31m-[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-static int ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn,[m
[31m-    const unsigned char **out, unsigned char *outlen,[m
[31m-    const unsigned char *in, unsigned int inlen, void *arg);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-static int ngx_http_ssl_npn_advertised(ngx_ssl_conn_t *ssl_conn,[m
[31m-    const unsigned char **out, unsigned int *outlen, void *arg);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssl_static_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_ssl_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssl_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_ssl_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_ssl_merge_srv_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssl_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_ssl_verify[] = {[m
[31m-    { ngx_string("off"), 0 },[m
[31m-    { ngx_string("on"), 1 },[m
[31m-    { ngx_string("optional"), 2 },[m
[31m-    { ngx_string("optional_no_ca"), 3 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_ssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_http_ssl_enable,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_password_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_ssl_password_file,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_dhparam"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, dhparam),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_ecdh_curve"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, ecdh_curve),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, protocols),[m
[31m-      &ngx_http_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_verify_client"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, verify),[m
[31m-      &ngx_http_ssl_verify },[m
[31m-[m
[31m-    { ngx_string("ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_client_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, client_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_prefer_server_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, prefer_server_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_ssl_session_cache,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_tickets"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, session_tickets),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_ticket_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, session_ticket_keys),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, session_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_stapling"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, stapling),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_stapling_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, stapling_file),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_stapling_responder"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, stapling_responder),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_stapling_verify"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, stapling_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_ssl_module_ctx = {[m
[31m-    ngx_http_ssl_add_variables,            /* preconfiguration */[m
[31m-    ngx_http_ssl_init,                     /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_http_ssl_create_srv_conf,          /* create server configuration */[m
[31m-    ngx_http_ssl_merge_srv_conf,           /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_ssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_ssl_module_ctx,              /* module context */[m
[31m-    ngx_http_ssl_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_ssl_vars[] = {[m
[31m-[m
[31m-    { ngx_string("ssl_protocol"), NULL, ngx_http_ssl_static_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_protocol, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_cipher"), NULL, ngx_http_ssl_static_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_cipher_name, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_session_id"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_session_id, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_session_reused"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_session_reused, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_server_name"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_server_name, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_cert"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_certificate, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_raw_cert"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_raw_certificate,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_s_dn"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_subject_dn, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_i_dn"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_issuer_dn, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_serial"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_serial_number, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_fingerprint"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_fingerprint, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_verify"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_client_verify, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_ssl_sess_id_ctx = ngx_string("HTTP");[m
[31m-[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-[m
[31m-static int[m
[31m-ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,[m
[31m-    unsigned char *outlen, const unsigned char *in, unsigned int inlen,[m
[31m-    void *arg)[m
[31m-{[m
[31m-    unsigned int            srvlen;[m
[31m-    unsigned char          *srv;[m
[31m-#if (NGX_DEBUG)[m
[31m-    unsigned int            i;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    ngx_http_connection_t  *hc;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2 || NGX_DEBUG)[m
[31m-    ngx_connection_t       *c;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    for (i = 0; i < inlen; i += in[i] + 1) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "SSL ALPN supported by client: %*s",[m
[31m-                       (size_t) in[i], &in[i + 1]);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    if (hc->addr_conf->http2) {[m
[31m-        srv =[m
[31m-           (unsigned char *) NGX_HTTP_V2_ALPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;[m
[31m-        srvlen = sizeof(NGX_HTTP_V2_ALPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE) - 1;[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        srv = (unsigned char *) NGX_HTTP_NPN_ADVERTISE;[m
[31m-        srvlen = sizeof(NGX_HTTP_NPN_ADVERTISE) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_select_next_proto((unsigned char **) out, outlen, srv, srvlen,[m
[31m-                              in, inlen)[m
[31m-        != OPENSSL_NPN_NEGOTIATED)[m
[31m-    {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "SSL ALPN selected: %*s", (size_t) *outlen, *out);[m
[31m-[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-[m
[31m-static int[m
[31m-ngx_http_ssl_npn_advertised(ngx_ssl_conn_t *ssl_conn,[m
[31m-    const unsigned char **out, unsigned int *outlen, void *arg)[m
[31m-{[m
[31m-#if (NGX_HTTP_V2 || NGX_DEBUG)[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "SSL NPN advertised");[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    {[m
[31m-    ngx_http_connection_t  *hc;[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    if (hc->addr_conf->http2) {[m
[31m-        *out =[m
[31m-            (unsigned char *) NGX_HTTP_V2_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;[m
[31m-        *outlen = sizeof(NGX_HTTP_V2_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE) - 1;[m
[31m-[m
[31m-        return SSL_TLSEXT_ERR_OK;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    *out = (unsigned char *) NGX_HTTP_NPN_ADVERTISE;[m
[31m-    *outlen = sizeof(NGX_HTTP_NPN_ADVERTISE) - 1;[m
[31m-[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssl_static_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_ssl_variable_handler_pt  handler = (ngx_ssl_variable_handler_pt) data;[m
[31m-[m
[31m-    size_t     len;[m
[31m-    ngx_str_t  s;[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-[m
[31m-        (void) handler(r->connection, NULL, &s);[m
[31m-[m
[31m-        v->data = s.data;[m
[31m-[m
[31m-        for (len = 0; v->data[len]; len++) { /* void */ }[m
[31m-[m
[31m-        v->len = len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_ssl_variable_handler_pt  handler = (ngx_ssl_variable_handler_pt) data;[m
[31m-[m
[31m-    ngx_str_t  s;[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-[m
[31m-        if (handler(r->connection, r->pool, &s) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = s.len;[m
[31m-        v->data = s.data;[m
[31m-[m
[31m-        if (v->len) {[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 0;[m
[31m-            v->not_found = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssl_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_ssl_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_ssl_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ssl_srv_conf_t));[m
[31m-    if (sscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     sscf->protocols = 0;[m
[31m-     *     sscf->certificate = { 0, NULL };[m
[31m-     *     sscf->certificate_key = { 0, NULL };[m
[31m-     *     sscf->dhparam = { 0, NULL };[m
[31m-     *     sscf->ecdh_curve = { 0, NULL };[m
[31m-     *     sscf->client_certificate = { 0, NULL };[m
[31m-     *     sscf->trusted_certificate = { 0, NULL };[m
[31m-     *     sscf->crl = { 0, NULL };[m
[31m-     *     sscf->ciphers = { 0, NULL };[m
[31m-     *     sscf->shm_zone = NULL;[m
[31m-     *     sscf->stapling_file = { 0, NULL };[m
[31m-     *     sscf->stapling_responder = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    sscf->enable = NGX_CONF_UNSET;[m
[31m-    sscf->prefer_server_ciphers = NGX_CONF_UNSET;[m
[31m-    sscf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    sscf->verify = NGX_CONF_UNSET_UINT;[m
[31m-    sscf->verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    sscf->passwords = NGX_CONF_UNSET_PTR;[m
[31m-    sscf->builtin_session_cache = NGX_CONF_UNSET;[m
[31m-    sscf->session_timeout = NGX_CONF_UNSET;[m
[31m-    sscf->session_tickets = NGX_CONF_UNSET;[m
[31m-    sscf->session_ticket_keys = NGX_CONF_UNSET_PTR;[m
[31m-    sscf->stapling = NGX_CONF_UNSET;[m
[31m-    sscf->stapling_verify = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return sscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t *prev = parent;[m
[31m-    ngx_http_ssl_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    if (conf->enable == NGX_CONF_UNSET) {[m
[31m-        if (prev->enable == NGX_CONF_UNSET) {[m
[31m-            conf->enable = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            conf->enable = prev->enable;[m
[31m-            conf->file = prev->file;[m
[31m-            conf->line = prev->line;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_timeout,[m
[31m-                         prev->session_timeout, 300);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->prefer_server_ciphers,[m
[31m-                         prev->prefer_server_ciphers, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,[m
[31m-                         (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                          |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,[m
[31m-                         NGX_SSL_BUFSIZE);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->verify, prev->verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->verify_depth, prev->verify_depth, 1);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->certificate, prev->certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->certificate_key, prev->certificate_key, "");[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->client_certificate, prev->client_certificate,[m
[31m-                         "");[m
[31m-    ngx_conf_merge_str_value(conf->trusted_certificate,[m
[31m-                         prev->trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->crl, prev->crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve,[m
[31m-                         NGX_DEFAULT_ECDH_CURVE);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->stapling, prev->stapling, 0);[m
[31m-    ngx_conf_merge_value(conf->stapling_verify, prev->stapling_verify, 0);[m
[31m-    ngx_conf_merge_str_value(conf->stapling_file, prev->stapling_file, "");[m
[31m-    ngx_conf_merge_str_value(conf->stapling_responder,[m
[31m-                         prev->stapling_responder, "");[m
[31m-[m
[31m-    conf->ssl.log = cf->log;[m
[31m-[m
[31m-    if (conf->enable) {[m
[31m-[m
[31m-        if (conf->certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined for "[m
[31m-                          "the \"ssl\" directive in %s:%ui",[m
[31m-                          conf->file, conf->line);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate_key\" is defined for "[m
[31m-                          "the \"ssl\" directive in %s:%ui",[m
[31m-                          conf->file, conf->line);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (conf->certificate.len == 0) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &conf->certificate);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create(&conf->ssl, conf->protocols, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    if (SSL_CTX_set_tlsext_servername_callback(conf->ssl.ctx,[m
[31m-                                               ngx_http_ssl_servername)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-            "nginx was built with SNI support, however, now it is linked "[m
[31m-            "dynamically to an OpenSSL library which has no tlsext support, "[m
[31m-            "therefore SNI is not available");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-    SSL_CTX_set_alpn_select_cb(conf->ssl.ctx, ngx_http_ssl_alpn_select, NULL);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-    SSL_CTX_set_next_protos_advertised_cb(conf->ssl.ctx,[m
[31m-                                          ngx_http_ssl_npn_advertised, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = &conf->ssl;[m
[31m-[m
[31m-    if (ngx_ssl_certificate(cf, &conf->ssl, &conf->certificate,[m
[31m-                            &conf->certificate_key, conf->passwords)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(conf->ssl.ctx,[m
[31m-                                (const char *) conf->ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &conf->ciphers);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->ssl.buffer_size = conf->buffer_size;[m
[31m-[m
[31m-    if (conf->verify) {[m
[31m-[m
[31m-        if (conf->client_certificate.len == 0 && conf->verify != 3) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no ssl_client_certificate for ssl_client_verify");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_client_certificate(cf, &conf->ssl,[m
[31m-                                       &conf->client_certificate,[m
[31m-                                       conf->verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_trusted_certificate(cf, &conf->ssl,[m
[31m-                                    &conf->trusted_certificate,[m
[31m-                                    conf->verify_depth)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_crl(cf, &conf->ssl, &conf->crl) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->prefer_server_ciphers) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100001L && !defined LIBRESSL_VERSION_NUMBER)[m
[31m-    /* a temporary 512-bit RSA key is required for export versions of MSIE */[m
[31m-    SSL_CTX_set_tmp_rsa_callback(conf->ssl.ctx, ngx_ssl_rsa512_key_callback);[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->builtin_session_cache,[m
[31m-                         prev->builtin_session_cache, NGX_SSL_NONE_SCACHE);[m
[31m-[m
[31m-    if (conf->shm_zone == NULL) {[m
[31m-        conf->shm_zone = prev->shm_zone;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_session_cache(&conf->ssl, &ngx_http_ssl_sess_id_ctx,[m
[31m-                              conf->builtin_session_cache,[m
[31m-                              conf->shm_zone, conf->session_timeout)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_tickets, prev->session_tickets, 1);[m
[31m-[m
[31m-#ifdef SSL_OP_NO_TICKET[m
[31m-    if (!conf->session_tickets) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->session_ticket_keys,[m
[31m-                         prev->session_ticket_keys, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->stapling) {[m
[31m-[m
[31m-        if (ngx_ssl_stapling(cf, &conf->ssl, &conf->stapling_file,[m
[31m-                             &conf->stapling_responder, conf->stapling_verify)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t *sscf = conf;[m
[31m-[m
[31m-    char  *rv;[m
[31m-[m
[31m-    rv = ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    sscf->file = cf->conf_file->file.name.data;[m
[31m-    sscf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t *sscf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (sscf->passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    sscf->passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (sscf->passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t *sscf = conf;[m
[31m-[m
[31m-    size_t       len;[m
[31m-    ngx_str_t   *value, name, size;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i, j;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            sscf->builtin_session_cache = NGX_SSL_NO_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "none") == 0) {[m
[31m-            sscf->builtin_session_cache = NGX_SSL_NONE_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "builtin") == 0) {[m
[31m-            sscf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("builtin:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            n = ngx_atoi(value[i].data + sizeof("builtin:") - 1,[m
[31m-                         value[i].len - (sizeof("builtin:") - 1));[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            sscf->builtin_session_cache = n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("shared:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            len = 0;[m
[31m-[m
[31m-            for (j = sizeof("shared:") - 1; j < value[i].len; j++) {[m
[31m-                if (value[i].data[j] == ':') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                len++;[m
[31m-            }[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            name.len = len;[m
[31m-            name.data = value[i].data + sizeof("shared:") - 1;[m
[31m-[m
[31m-            size.len = value[i].len - j - 1;[m
[31m-            size.data = name.data + len + 1;[m
[31m-[m
[31m-            n = ngx_parse_size(&size);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (n < (ngx_int_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "session cache \"%V\" is too small",[m
[31m-                                   &value[i]);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sscf->shm_zone = ngx_shared_memory_add(cf, &name, n,[m
[31m-                                                   &ngx_http_ssl_module);[m
[31m-            if (sscf->shm_zone == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sscf->shm_zone->init = ngx_ssl_session_cache_init;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (sscf->shm_zone && sscf->builtin_session_cache == NGX_CONF_UNSET) {[m
[31m-        sscf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid session cache \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssl_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_uint_t                   s;[m
[31m-    ngx_http_ssl_srv_conf_t     *sscf;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_core_srv_conf_t   **cscfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-[m
[31m-    for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-        sscf = cscfp[s]->ctx->srv_conf[ngx_http_ssl_module.ctx_index];[m
[31m-[m
[31m-        if (sscf->ssl.ctx == NULL || !sscf->stapling) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-        if (ngx_ssl_stapling_resolver(cf, &sscf->ssl, clcf->resolver,[m
[31m-                                      clcf->resolver_timeout)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.h[m
[1mdeleted file mode 100644[m
[1mindex 8e69e9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SSL_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SSL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t                      enable;[m
[31m-[m
[31m-    ngx_ssl_t                       ssl;[m
[31m-[m
[31m-    ngx_flag_t                      prefer_server_ciphers;[m
[31m-[m
[31m-    ngx_uint_t                      protocols;[m
[31m-[m
[31m-    ngx_uint_t                      verify;[m
[31m-    ngx_uint_t                      verify_depth;[m
[31m-[m
[31m-    size_t                          buffer_size;[m
[31m-[m
[31m-    ssize_t                         builtin_session_cache;[m
[31m-[m
[31m-    time_t                          session_timeout;[m
[31m-[m
[31m-    ngx_str_t                       certificate;[m
[31m-    ngx_str_t                       certificate_key;[m
[31m-    ngx_str_t                       dhparam;[m
[31m-    ngx_str_t                       ecdh_curve;[m
[31m-    ngx_str_t                       client_certificate;[m
[31m-    ngx_str_t                       trusted_certificate;[m
[31m-    ngx_str_t                       crl;[m
[31m-[m
[31m-    ngx_str_t                       ciphers;[m
[31m-[m
[31m-    ngx_array_t                    *passwords;[m
[31m-[m
[31m-    ngx_shm_zone_t                 *shm_zone;[m
[31m-[m
[31m-    ngx_flag_t                      session_tickets;[m
[31m-    ngx_array_t                    *session_ticket_keys;[m
[31m-[m
[31m-    ngx_flag_t                      stapling;[m
[31m-    ngx_flag_t                      stapling_verify;[m
[31m-    ngx_str_t                       stapling_file;[m
[31m-    ngx_str_t                       stapling_responder;[m
[31m-[m
[31m-    u_char                         *file;[m
[31m-    ngx_uint_t                      line;[m
[31m-} ngx_http_ssl_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_ssl_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SSL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_static_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_static_module.c[m
[1mdeleted file mode 100644[m
[1mindex f79c4ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_static_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,290 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_static_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_static_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t  ngx_http_static_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_static_init,                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_static_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_static_module_ctx,           /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_static_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *last, *location;[m
[31m-    size_t                     root, len;[m
[31m-    ngx_str_t                  path;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 level;[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    /*[m
[31m-     * ngx_http_map_uri_to_path() allocates memory for terminating '\0'[m
[31m-     * so we do not need to reserve memory for '/' for possible redirect[m
[31m-     */[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root, 0);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    path.len = last - path.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "http filename: \"%s\"", path.data);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-        case NGX_ENAMETOOLONG:[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_EACCES:[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-        case NGX_EMLINK:[m
[31m-        case NGX_ELOOP:[m
[31m-#endif[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {[m
[31m-            ngx_log_error(level, log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, path.data);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->root_tested = !r->error_page;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "http static fd: %d", of.fd);[m
[31m-[m
[31m-    if (of.is_dir) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http dir");[m
[31m-[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = r->uri.len + 1;[m
[31m-[m
[31m-        if (!clcf->alias && clcf->root_lengths == NULL && r->args.len == 0) {[m
[31m-            location = path.data + clcf->root.len;[m
[31m-[m
[31m-            *last = '/';[m
[31m-[m
[31m-        } else {[m
[31m-            if (r->args.len) {[m
[31m-                len += r->args.len + 1;[m
[31m-            }[m
[31m-[m
[31m-            location = ngx_pnalloc(r->pool, len);[m
[31m-            if (location == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            last = ngx_copy(location, r->uri.data, r->uri.len);[m
[31m-[m
[31m-            *last = '/';[m
[31m-[m
[31m-            if (r->args.len) {[m
[31m-                *++last = '?';[m
[31m-                ngx_memcpy(++last, r->args.data, r->args.len);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not need to set the r->headers_out.location->hash and[m
[31m-         * r->headers_out.location->key fields[m
[31m-         */[m
[31m-[m
[31m-        r->headers_out.location->value.len = len;[m
[31m-        r->headers_out.location->value.data = location;[m
[31m-[m
[31m-        return NGX_HTTP_MOVED_PERMANENTLY;[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_WIN32) /* the not regular files are probably Unix specific */[m
[31m-[m
[31m-    if (!of.is_file) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, 0,[m
[31m-                      "\"%s\" is not a regular file", path.data);[m
[31m-[m
[31m-        return NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_POST) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    log->action = "sending response to client";[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_length_n = of.size;[m
[31m-    r->headers_out.last_modified_time = of.mtime;[m
[31m-[m
[31m-    if (ngx_http_set_etag(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main && of.size == 0) {[m
[31m-        return ngx_http_send_header(r);[m
[31m-    }[m
[31m-[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-    /* we need to allocate all before the header would be sent */[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = 0;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = b->file_last ? 1: 0;[m
[31m-    b->last_buf = (r == r->main) ? 1: 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->name = path;[m
[31m-    b->file->log = log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_static_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_static_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_stub_status_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_stub_status_module.c[m
[1mdeleted file mode 100644[m
[1mindex 61199f2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_stub_status_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,236 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_stub_status_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_stub_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_stub_status_add_variables(ngx_conf_t *cf);[m
[31m-static char *ngx_http_set_stub_status(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_status_commands[] = {[m
[31m-[m
[31m-    { ngx_string("stub_status"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_stub_status,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_stub_status_module_ctx = {[m
[31m-    ngx_http_stub_status_add_variables,    /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_stub_status_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_stub_status_module_ctx,      /* module context */[m
[31m-    ngx_http_status_commands,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_stub_status_vars[] = {[m
[31m-[m
[31m-    { ngx_string("connections_active"), NULL, ngx_http_stub_status_variable,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("connections_reading"), NULL, ngx_http_stub_status_variable,[m
[31m-      1, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("connections_writing"), NULL, ngx_http_stub_status_variable,[m
[31m-      2, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("connections_waiting"), NULL, ngx_http_stub_status_variable,[m
[31m-      3, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_stub_status_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_chain_t        out;[m
[31m-    ngx_atomic_int_t   ap, hn, ac, rq, rd, wr, wa;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_len = sizeof("text/plain") - 1;[m
[31m-    ngx_str_set(&r->headers_out.content_type, "text/plain");[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->headers_out.status = NGX_HTTP_OK;[m
[31m-[m
[31m-        rc = ngx_http_send_header(r);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof("Active connections:  \n") + NGX_ATOMIC_T_LEN[m
[31m-           + sizeof("server accepts handled requests\n") - 1[m
[31m-           + 6 + 3 * NGX_ATOMIC_T_LEN[m
[31m-           + sizeof("Reading:  Writing:  Waiting:  \n") + 3 * NGX_ATOMIC_T_LEN;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    ap = *ngx_stat_accepted;[m
[31m-    hn = *ngx_stat_handled;[m
[31m-    ac = *ngx_stat_active;[m
[31m-    rq = *ngx_stat_requests;[m
[31m-    rd = *ngx_stat_reading;[m
[31m-    wr = *ngx_stat_writing;[m
[31m-    wa = *ngx_stat_waiting;[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, "Active connections: %uA \n", ac);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "server accepts handled requests\n",[m
[31m-                         sizeof("server accepts handled requests\n") - 1);[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, " %uA %uA %uA \n", ap, hn, rq);[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, "Reading: %uA Writing: %uA Waiting: %uA \n",[m
[31m-                          rd, wr, wa);[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_length_n = b->last - b->pos;[m
[31m-[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_stub_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char            *p;[m
[31m-    ngx_atomic_int_t   value;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_ATOMIC_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (data) {[m
[31m-    case 0:[m
[31m-        value = *ngx_stat_active;[m
[31m-        break;[m
[31m-[m
[31m-    case 1:[m
[31m-        value = *ngx_stat_reading;[m
[31m-        break;[m
[31m-[m
[31m-    case 2:[m
[31m-        value = *ngx_stat_writing;[m
[31m-        break;[m
[31m-[m
[31m-    case 3:[m
[31m-        value = *ngx_stat_waiting;[m
[31m-        break;[m
[31m-[m
[31m-    /* suppress warning */[m
[31m-    default:[m
[31m-        value = 0;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%uA", value) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_stub_status_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_stub_status_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_stub_status(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_stub_status_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_sub_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_sub_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex bb1c50b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_sub_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,964 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t   match;[m
[31m-    ngx_http_complex_value_t   value;[m
[31m-} ngx_http_sub_pair_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  match;[m
[31m-    ngx_http_complex_value_t  *value;[m
[31m-} ngx_http_sub_match_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                 min_match_len;[m
[31m-    ngx_uint_t                 max_match_len;[m
[31m-[m
[31m-    u_char                     index[257];[m
[31m-    u_char                     shift[256];[m
[31m-} ngx_http_sub_tables_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                 dynamic; /* unsigned dynamic:1; */[m
[31m-[m
[31m-    ngx_array_t               *pairs;[m
[31m-[m
[31m-    ngx_http_sub_tables_t     *tables;[m
[31m-[m
[31m-    ngx_hash_t                 types;[m
[31m-[m
[31m-    ngx_flag_t                 once;[m
[31m-    ngx_flag_t                 last_modified;[m
[31m-[m
[31m-    ngx_array_t               *types_keys;[m
[31m-    ngx_array_t               *matches;[m
[31m-} ngx_http_sub_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  saved;[m
[31m-    ngx_str_t                  looked;[m
[31m-[m
[31m-    ngx_uint_t                 once;   /* unsigned  once:1 */[m
[31m-[m
[31m-    ngx_buf_t                 *buf;[m
[31m-[m
[31m-    u_char                    *pos;[m
[31m-    u_char                    *copy_start;[m
[31m-    u_char                    *copy_end;[m
[31m-[m
[31m-    ngx_chain_t               *in;[m
[31m-    ngx_chain_t               *out;[m
[31m-    ngx_chain_t              **last_out;[m
[31m-    ngx_chain_t               *busy;[m
[31m-    ngx_chain_t               *free;[m
[31m-[m
[31m-    ngx_str_t                 *sub;[m
[31m-    ngx_uint_t                 applied;[m
[31m-[m
[31m-    ngx_int_t                  offset;[m
[31m-    ngx_uint_t                 index;[m
[31m-[m
[31m-    ngx_http_sub_tables_t     *tables;[m
[31m-    ngx_array_t               *matches;[m
[31m-} ngx_http_sub_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t ngx_http_sub_cmp_index;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_sub_output(ngx_http_request_t *r,[m
[31m-    ngx_http_sub_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_sub_parse(ngx_http_request_t *r,[m
[31m-    ngx_http_sub_ctx_t *ctx);[m
[31m-[m
[31m-static char * ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_http_sub_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_sub_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static void ngx_http_sub_init_tables(ngx_http_sub_tables_t *tables,[m
[31m-    ngx_http_sub_match_t *match, ngx_uint_t n);[m
[31m-static ngx_int_t ngx_http_sub_cmp_matches(const void *one, const void *two);[m
[31m-static ngx_int_t ngx_http_sub_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_sub_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("sub_filter"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_sub_filter,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sub_filter_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_sub_loc_conf_t, types_keys),[m
[31m-      &ngx_http_html_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("sub_filter_once"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_sub_loc_conf_t, once),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sub_filter_last_modified"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_sub_loc_conf_t, last_modified),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_sub_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_sub_filter_init,              /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_sub_create_conf,              /* create location configuration */[m
[31m-    ngx_http_sub_merge_conf                /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_sub_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_sub_filter_module_ctx,       /* module context */[m
[31m-    ngx_http_sub_filter_commands,          /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                *m;[m
[31m-    ngx_uint_t                i, j, n;[m
[31m-    ngx_http_sub_ctx_t       *ctx;[m
[31m-    ngx_http_sub_pair_t      *pairs;[m
[31m-    ngx_http_sub_match_t     *matches;[m
[31m-    ngx_http_sub_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);[m
[31m-[m
[31m-    if (slcf->pairs == NULL[m
[31m-        || r->headers_out.content_length_n == 0[m
[31m-        || ngx_http_test_content_type(r, &slcf->types) == NULL)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_sub_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->dynamic == 0) {[m
[31m-        ctx->tables = slcf->tables;[m
[31m-        ctx->matches = slcf->matches;[m
[31m-[m
[31m-    } else {[m
[31m-        pairs = slcf->pairs->elts;[m
[31m-        n = slcf->pairs->nelts;[m
[31m-[m
[31m-        matches = ngx_pcalloc(r->pool, sizeof(ngx_http_sub_match_t) * n);[m
[31m-        if (matches == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        j = 0;[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            matches[j].value = &pairs[i].value;[m
[31m-[m
[31m-            if (pairs[i].match.lengths == NULL) {[m
[31m-                matches[j].match = pairs[i].match.value;[m
[31m-                j++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            m = &matches[j].match;[m
[31m-            if (ngx_http_complex_value(r, &pairs[i].match, m) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (m->len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_strlow(m->data, m->data, m->len);[m
[31m-            j++;[m
[31m-        }[m
[31m-[m
[31m-        if (j == 0) {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        ctx->matches = ngx_palloc(r->pool, sizeof(ngx_array_t));[m
[31m-        if (ctx->matches == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->matches->elts = matches;[m
[31m-        ctx->matches->nelts = j;[m
[31m-[m
[31m-        ctx->tables = ngx_palloc(r->pool, sizeof(ngx_http_sub_tables_t));[m
[31m-        if (ctx->tables == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_sub_init_tables(ctx->tables, ctx->matches->elts,[m
[31m-                                 ctx->matches->nelts);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);[m
[31m-[m
[31m-    ctx->saved.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);[m
[31m-    if (ctx->saved.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->looked.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);[m
[31m-    if (ctx->looked.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->offset = ctx->tables->min_match_len - 1;[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-[m
[31m-        if (!slcf->last_modified) {[m
[31m-            ngx_http_clear_last_modified(r);[m
[31m-            ngx_http_clear_etag(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_http_weak_etag(r);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_str_t                 *sub;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_sub_ctx_t        *ctx;[m
[31m-    ngx_http_sub_match_t      *match;[m
[31m-    ngx_http_sub_loc_conf_t   *slcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_sub_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if ((in == NULL[m
[31m-         && ctx->buf == NULL[m
[31m-         && ctx->in == NULL[m
[31m-         && ctx->busy == NULL))[m
[31m-    {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {[m
[31m-[m
[31m-        if (ctx->busy) {[m
[31m-            if (ngx_http_sub_output(r, ctx) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    /* add the incoming chain to the chain ctx->in */[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http sub filter \"%V\"", &r->uri);[m
[31m-[m
[31m-    while (ctx->in || ctx->buf) {[m
[31m-[m
[31m-        if (ctx->buf == NULL) {[m
[31m-            ctx->buf = ctx->in->buf;[m
[31m-            ctx->in = ctx->in->next;[m
[31m-            ctx->pos = ctx->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        b = NULL;[m
[31m-[m
[31m-        while (ctx->pos < ctx->buf->last) {[m
[31m-[m
[31m-            rc = ngx_http_sub_parse(r, ctx);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "parse: %i, looked: \"%V\" %p-%p",[m
[31m-                           rc, &ctx->looked, ctx->copy_start, ctx->copy_end);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->saved.len) {[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "saved: \"%V\"", &ctx->saved);[m
[31m-[m
[31m-                cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->pos = ngx_pnalloc(r->pool, ctx->saved.len);[m
[31m-                if (b->pos == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(b->pos, ctx->saved.data, ctx->saved.len);[m
[31m-                b->last = b->pos + ctx->saved.len;[m
[31m-                b->memory = 1;[m
[31m-[m
[31m-                *ctx->last_out = cl;[m
[31m-                ctx->last_out = &cl->next;[m
[31m-[m
[31m-                ctx->saved.len = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->copy_start != ctx->copy_end) {[m
[31m-[m
[31m-                cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-[m
[31m-                ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->pos = ctx->copy_start;[m
[31m-                b->last = ctx->copy_end;[m
[31m-                b->shadow = NULL;[m
[31m-                b->last_buf = 0;[m
[31m-                b->last_in_chain = 0;[m
[31m-                b->recycled = 0;[m
[31m-[m
[31m-                if (b->in_file) {[m
[31m-                    b->file_last = b->file_pos + (b->last - ctx->buf->pos);[m
[31m-                    b->file_pos += b->pos - ctx->buf->pos;[m
[31m-                }[m
[31m-[m
[31m-                *ctx->last_out = cl;[m
[31m-                ctx->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            /* rc == NGX_OK */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);[m
[31m-[m
[31m-            if (ctx->sub == NULL) {[m
[31m-                ctx->sub = ngx_pcalloc(r->pool, sizeof(ngx_str_t)[m
[31m-                                                * ctx->matches->nelts);[m
[31m-                if (ctx->sub == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            sub = &ctx->sub[ctx->index];[m
[31m-[m
[31m-            if (sub->data == NULL) {[m
[31m-                match = ctx->matches->elts;[m
[31m-[m
[31m-                if (ngx_http_complex_value(r, match[ctx->index].value, sub)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (sub->len) {[m
[31m-                b->memory = 1;[m
[31m-                b->pos = sub->data;[m
[31m-                b->last = sub->data + sub->len;[m
[31m-[m
[31m-            } else {[m
[31m-                b->sync = 1;[m
[31m-            }[m
[31m-[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            ctx->index = 0;[m
[31m-            ctx->once = slcf->once && (++ctx->applied == ctx->matches->nelts);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->looked.len[m
[31m-            && (ctx->buf->last_buf || ctx->buf->last_in_chain))[m
[31m-        {[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->pos = ctx->looked.data;[m
[31m-            b->last = b->pos + ctx->looked.len;[m
[31m-            b->memory = 1;[m
[31m-[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            ctx->looked.len = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->buf->last_buf || ctx->buf->flush || ctx->buf->sync[m
[31m-            || ngx_buf_in_memory(ctx->buf))[m
[31m-        {[m
[31m-            if (b == NULL) {[m
[31m-                cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->sync = 1;[m
[31m-[m
[31m-                *ctx->last_out = cl;[m
[31m-                ctx->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            b->last_buf = ctx->buf->last_buf;[m
[31m-            b->last_in_chain = ctx->buf->last_in_chain;[m
[31m-            b->flush = ctx->buf->flush;[m
[31m-            b->shadow = ctx->buf;[m
[31m-[m
[31m-            b->recycled = ctx->buf->recycled;[m
[31m-        }[m
[31m-[m
[31m-        ctx->buf = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->out == NULL && ctx->busy == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_sub_output(r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_output(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-#if 1[m
[31m-    b = NULL;[m
[31m-    for (cl = ctx->out; cl; cl = cl->next) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "sub out: %p %p", cl->buf, cl->buf->pos);[m
[31m-        if (cl->buf == b) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                          "the same buf was used in sub");[m
[31m-            ngx_debug_point();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        b = cl->buf;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-    if (ctx->busy == NULL) {[m
[31m-        ctx->busy = ctx->out;[m
[31m-[m
[31m-    } else {[m
[31m-        for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }[m
[31m-        cl->next = ctx->out;[m
[31m-    }[m
[31m-[m
[31m-    ctx->out = NULL;[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    while (ctx->busy) {[m
[31m-[m
[31m-        cl = ctx->busy;[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) != 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (b->shadow) {[m
[31m-            b->shadow->pos = b->shadow->last;[m
[31m-        }[m
[31m-[m
[31m-        ctx->busy = cl->next;[m
[31m-[m
[31m-        if (ngx_buf_in_memory(b) || b->in_file) {[m
[31m-            /* add data bufs only to the free buf chain */[m
[31m-[m
[31m-            cl->next = ctx->free;[m
[31m-            ctx->free = cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->in || ctx->buf) {[m
[31m-        r->buffered |= NGX_HTTP_SUB_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        r->buffered &= ~NGX_HTTP_SUB_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_parse(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char                   *p, *last, *pat, *pat_end, c;[m
[31m-    ngx_str_t                *m;[m
[31m-    ngx_int_t                 offset, start, next, end, len, rc;[m
[31m-    ngx_uint_t                shift, i, j;[m
[31m-    ngx_http_sub_match_t     *match;[m
[31m-    ngx_http_sub_tables_t    *tables;[m
[31m-    ngx_http_sub_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);[m
[31m-    tables = ctx->tables;[m
[31m-[m
[31m-    offset = ctx->offset;[m
[31m-    end = ctx->buf->last - ctx->pos;[m
[31m-[m
[31m-    if (ctx->once) {[m
[31m-        /* sets start and next to end */[m
[31m-        offset = end + (ngx_int_t) tables->min_match_len - 1;[m
[31m-        goto again;[m
[31m-    }[m
[31m-[m
[31m-    while (offset < end) {[m
[31m-[m
[31m-        c = offset < 0 ? ctx->looked.data[ctx->looked.len + offset][m
[31m-                       : ctx->pos[offset];[m
[31m-[m
[31m-        c = ngx_tolower(c);[m
[31m-[m
[31m-        shift = tables->shift[c];[m
[31m-        if (shift > 0) {[m
[31m-            offset += shift;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* a potential match */[m
[31m-[m
[31m-        start = offset - (ngx_int_t) tables->min_match_len + 1;[m
[31m-        match = ctx->matches->elts;[m
[31m-[m
[31m-        i = ngx_max(tables->index[c], ctx->index);[m
[31m-        j = tables->index[c + 1];[m
[31m-[m
[31m-        while (i != j) {[m
[31m-[m
[31m-            if (slcf->once && ctx->sub && ctx->sub[i].data) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            m = &match[i].match;[m
[31m-[m
[31m-            pat = m->data;[m
[31m-            pat_end = m->data + m->len;[m
[31m-[m
[31m-            if (start >= 0) {[m
[31m-                p = ctx->pos + start;[m
[31m-[m
[31m-            } else {[m
[31m-                last = ctx->looked.data + ctx->looked.len;[m
[31m-                p = last + start;[m
[31m-[m
[31m-                while (p < last && pat < pat_end) {[m
[31m-                    if (ngx_tolower(*p) != *pat) {[m
[31m-                        goto next;[m
[31m-                    }[m
[31m-[m
[31m-                    p++;[m
[31m-                    pat++;[m
[31m-                }[m
[31m-[m
[31m-                p = ctx->pos;[m
[31m-            }[m
[31m-[m
[31m-            while (p < ctx->buf->last && pat < pat_end) {[m
[31m-                if (ngx_tolower(*p) != *pat) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                p++;[m
[31m-                pat++;[m
[31m-            }[m
[31m-[m
[31m-            ctx->index = i;[m
[31m-[m
[31m-            if (pat != pat_end) {[m
[31m-                /* partial match */[m
[31m-                goto again;[m
[31m-            }[m
[31m-[m
[31m-            ctx->offset = offset + (ngx_int_t) m->len;[m
[31m-            next = start + (ngx_int_t) m->len;[m
[31m-            end = ngx_max(next, 0);[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-            goto done;[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            i++;[m
[31m-        }[m
[31m-[m
[31m-        offset++;[m
[31m-        ctx->index = 0;[m
[31m-    }[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    ctx->offset = offset;[m
[31m-    start = offset - (ngx_int_t) tables->min_match_len + 1;[m
[31m-    next = start;[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    /* send [ - looked.len, start ] to client */[m
[31m-[m
[31m-    ctx->saved.len = ctx->looked.len + ngx_min(start, 0);[m
[31m-    ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->saved.len);[m
[31m-[m
[31m-    ctx->copy_start = ctx->pos;[m
[31m-    ctx->copy_end = ctx->pos + ngx_max(start, 0);[m
[31m-[m
[31m-    /* save [ next, end ] in looked */[m
[31m-[m
[31m-    len = ngx_min(next, 0);[m
[31m-    p = ctx->looked.data;[m
[31m-    p = ngx_movemem(p, p + ctx->looked.len + len, - len);[m
[31m-[m
[31m-    len = ngx_max(next, 0);[m
[31m-    p = ngx_cpymem(p, ctx->pos + len, end - len);[m
[31m-    ctx->looked.len = p - ctx->looked.data;[m
[31m-[m
[31m-    /* update position */[m
[31m-[m
[31m-    ctx->pos += end;[m
[31m-    ctx->offset -= end;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_sub_loc_conf_t *slcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_sub_pair_t               *pair;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty search pattern");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->pairs == NULL) {[m
[31m-        slcf->pairs = ngx_array_create(cf->pool, 1,[m
[31m-                                       sizeof(ngx_http_sub_pair_t));[m
[31m-        if (slcf->pairs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->pairs->nelts == 255) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "number of search patterns exceeds 255");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(value[1].data, value[1].data, value[1].len);[m
[31m-[m
[31m-    pair = ngx_array_push(slcf->pairs);[m
[31m-    if (pair == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &pair->match;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ccv.complex_value->lengths != NULL) {[m
[31m-        slcf->dynamic = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_strlow(pair->match.value.data, pair->match.value.data,[m
[31m-                   pair->match.value.len);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pair->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_sub_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_sub_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_sub_loc_conf_t));[m
[31m-    if (slcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->dynamic = 0;[m
[31m-     *     conf->pairs = NULL;[m
[31m-     *     conf->tables = NULL;[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     *     conf->matches = NULL;[m
[31m-     */[m
[31m-[m
[31m-    slcf->once = NGX_CONF_UNSET;[m
[31m-    slcf->last_modified = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return slcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_sub_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_uint_t                i, n;[m
[31m-    ngx_http_sub_pair_t      *pairs;[m
[31m-    ngx_http_sub_match_t     *matches;[m
[31m-    ngx_http_sub_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_sub_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->once, prev->once, 1);[m
[31m-    ngx_conf_merge_value(conf->last_modified, prev->last_modified, 0);[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_html_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pairs == NULL) {[m
[31m-        conf->dynamic = prev->dynamic;[m
[31m-        conf->pairs = prev->pairs;[m
[31m-        conf->matches = prev->matches;[m
[31m-        conf->tables = prev->tables;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pairs && conf->dynamic == 0 && conf->tables == NULL) {[m
[31m-        pairs = conf->pairs->elts;[m
[31m-        n = conf->pairs->nelts;[m
[31m-[m
[31m-        matches = ngx_palloc(cf->pool, sizeof(ngx_http_sub_match_t) * n);[m
[31m-        if (matches == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            matches[i].match = pairs[i].match.value;[m
[31m-            matches[i].value = &pairs[i].value;[m
[31m-        }[m
[31m-[m
[31m-        conf->matches = ngx_palloc(cf->pool, sizeof(ngx_array_t));[m
[31m-        if (conf->matches == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf->matches->elts = matches;[m
[31m-        conf->matches->nelts = n;[m
[31m-[m
[31m-        conf->tables = ngx_palloc(cf->pool, sizeof(ngx_http_sub_tables_t));[m
[31m-        if (conf->tables == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_sub_init_tables(conf->tables, conf->matches->elts,[m
[31m-                                 conf->matches->nelts);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_sub_init_tables(ngx_http_sub_tables_t *tables,[m
[31m-    ngx_http_sub_match_t *match, ngx_uint_t n)[m
[31m-{[m
[31m-    u_char      c;[m
[31m-    ngx_uint_t  i, j, min, max, ch;[m
[31m-[m
[31m-    min = match[0].match.len;[m
[31m-    max = match[0].match.len;[m
[31m-[m
[31m-    for (i = 1; i < n; i++) {[m
[31m-        min = ngx_min(min, match[i].match.len);[m
[31m-        max = ngx_max(max, match[i].match.len);[m
[31m-    }[m
[31m-[m
[31m-    tables->min_match_len = min;[m
[31m-    tables->max_match_len = max;[m
[31m-[m
[31m-    ngx_http_sub_cmp_index = tables->min_match_len - 1;[m
[31m-    ngx_sort(match, n, sizeof(ngx_http_sub_match_t), ngx_http_sub_cmp_matches);[m
[31m-[m
[31m-    min = ngx_min(min, 255);[m
[31m-    ngx_memset(tables->shift, min, 256);[m
[31m-[m
[31m-    ch = 0;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        for (j = 0; j < min; j++) {[m
[31m-            c = match[i].match.data[tables->min_match_len - 1 - j];[m
[31m-            tables->shift[c] = ngx_min(tables->shift[c], (u_char) j);[m
[31m-        }[m
[31m-[m
[31m-        c = match[i].match.data[tables->min_match_len - 1];[m
[31m-        while (ch <= c) {[m
[31m-            tables->index[ch++] = (u_char) i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    while (ch < 257) {[m
[31m-        tables->index[ch++] = (u_char) n;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_cmp_matches(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_int_t              c1, c2;[m
[31m-    ngx_http_sub_match_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_http_sub_match_t *) one;[m
[31m-    second = (ngx_http_sub_match_t *) two;[m
[31m-[m
[31m-    c1 = first->match.data[ngx_http_sub_cmp_index];[m
[31m-    c2 = second->match.data[ngx_http_sub_cmp_index];[m
[31m-[m
[31m-    return c1 - c2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_sub_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_sub_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_hash_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_hash_module.c[m
[1mdeleted file mode 100644[m
[1mindex 1e2e05c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_hash_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,667 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t                            hash;[m
[31m-    ngx_str_t                          *server;[m
[31m-} ngx_http_upstream_chash_point_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          number;[m
[31m-    ngx_http_upstream_chash_point_t     point[1];[m
[31m-} ngx_http_upstream_chash_points_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t            key;[m
[31m-    ngx_http_upstream_chash_points_t   *points;[m
[31m-} ngx_http_upstream_hash_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* the round robin data must be first */[m
[31m-    ngx_http_upstream_rr_peer_data_t    rrp;[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *conf;[m
[31m-    ngx_str_t                           key;[m
[31m-    ngx_uint_t                          tries;[m
[31m-    ngx_uint_t                          rehash;[m
[31m-    uint32_t                            hash;[m
[31m-    ngx_event_get_peer_pt               get_rr_peer;[m
[31m-} ngx_http_upstream_hash_peer_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_init_hash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_chash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static int ngx_libc_cdecl[m
[31m-    ngx_http_upstream_chash_cmp_points(const void *one, const void *two);[m
[31m-static ngx_uint_t ngx_http_upstream_find_chash_point([m
[31m-    ngx_http_upstream_chash_points_t *points, uint32_t hash);[m
[31m-static ngx_int_t ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-static void *ngx_http_upstream_hash_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_hash_commands[] = {[m
[31m-[m
[31m-    { ngx_string("hash"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_upstream_hash,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_hash_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_http_upstream_hash_create_conf,    /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_hash_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_hash_module_ctx,    /* module context */[m
[31m-    ngx_http_upstream_hash_commands,       /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_hash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_hash_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_hash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_srv_conf_t   *hcf;[m
[31m-    ngx_http_upstream_hash_peer_data_t  *hp;[m
[31m-[m
[31m-    hp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_hash_peer_data_t));[m
[31m-    if (hp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.data = &hp->rrp;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_hash_peer;[m
[31m-[m
[31m-    hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &hcf->key, &hp->key) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream hash key:\"%V\"", &hp->key);[m
[31m-[m
[31m-    hp->conf = hcf;[m
[31m-    hp->tries = 0;[m
[31m-    hp->rehash = 0;[m
[31m-    hp->hash = 0;[m
[31m-    hp->get_rr_peer = ngx_http_upstream_get_round_robin_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_peer_data_t  *hp = data;[m
[31m-[m
[31m-    time_t                        now;[m
[31m-    u_char                        buf[NGX_INT_T_LEN];[m
[31m-    size_t                        size;[m
[31m-    uint32_t                      hash;[m
[31m-    ngx_int_t                     w;[m
[31m-    uintptr_t                     m;[m
[31m-    ngx_uint_t                    n, p;[m
[31m-    ngx_http_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);[m
[31m-[m
[31m-    if (hp->tries > 20 || hp->rrp.peers->single) {[m
[31m-        ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-        return hp->get_rr_peer(pc, &hp->rrp);[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /*[m
[31m-         * Hash expression is compatible with Cache::Memcached:[m
[31m-         * ((crc32([REHASH] KEY) >> 16) & 0x7fff) + PREV_HASH[m
[31m-         * with REHASH omitted at the first iteration.[m
[31m-         */[m
[31m-[m
[31m-        ngx_crc32_init(hash);[m
[31m-[m
[31m-        if (hp->rehash > 0) {[m
[31m-            size = ngx_sprintf(buf, "%ui", hp->rehash) - buf;[m
[31m-            ngx_crc32_update(&hash, buf, size);[m
[31m-        }[m
[31m-[m
[31m-        ngx_crc32_update(&hash, hp->key.data, hp->key.len);[m
[31m-        ngx_crc32_final(hash);[m
[31m-[m
[31m-        hash = (hash >> 16) & 0x7fff;[m
[31m-[m
[31m-        hp->hash += hash;[m
[31m-        hp->rehash++;[m
[31m-[m
[31m-        w = hp->hash % hp->rrp.peers->total_weight;[m
[31m-        peer = hp->rrp.peers->peer;[m
[31m-        p = 0;[m
[31m-[m
[31m-        while (w >= peer->weight) {[m
[31m-            w -= peer->weight;[m
[31m-            peer = peer->next;[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        n = p / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (hp->rrp.tried[n] & m) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get hash peer, value:%uD, peer:%ui", hp->hash, p);[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        if (++hp->tries > 20) {[m
[31m-            ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-            return hp->get_rr_peer(pc, &hp->rrp);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hp->rrp.current = peer;[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    if (now - peer->checked > peer->fail_timeout) {[m
[31m-        peer->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    hp->rrp.tried[n] |= m;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_chash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    u_char                             *host, *port, c;[m
[31m-    size_t                              host_len, port_len, size;[m
[31m-    uint32_t                            hash, base_hash;[m
[31m-    ngx_str_t                          *server;[m
[31m-    ngx_uint_t                          npoints, i, j;[m
[31m-    ngx_http_upstream_rr_peer_t        *peer;[m
[31m-    ngx_http_upstream_rr_peers_t       *peers;[m
[31m-    ngx_http_upstream_chash_points_t   *points;[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *hcf;[m
[31m-    union {[m
[31m-        uint32_t                        value;[m
[31m-        u_char                          byte[4];[m
[31m-    } prev_hash;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_chash_peer;[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-    npoints = peers->total_weight * 160;[m
[31m-[m
[31m-    size = sizeof(ngx_http_upstream_chash_points_t)[m
[31m-           + sizeof(ngx_http_upstream_chash_point_t) * (npoints - 1);[m
[31m-[m
[31m-    points = ngx_palloc(cf->pool, size);[m
[31m-    if (points == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    points->number = 0;[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        server = &peer->server;[m
[31m-[m
[31m-        /*[m
[31m-         * Hash expression is compatible with Cache::Memcached::Fast:[m
[31m-         * crc32(HOST \0 PORT PREV_HASH).[m
[31m-         */[m
[31m-[m
[31m-        if (server->len >= 5[m
[31m-            && ngx_strncasecmp(server->data, (u_char *) "unix:", 5) == 0)[m
[31m-        {[m
[31m-            host = server->data + 5;[m
[31m-            host_len = server->len - 5;[m
[31m-            port = NULL;[m
[31m-            port_len = 0;[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        for (j = 0; j < server->len; j++) {[m
[31m-            c = server->data[server->len - j - 1];[m
[31m-[m
[31m-            if (c == ':') {[m
[31m-                host = server->data;[m
[31m-                host_len = server->len - j - 1;[m
[31m-                port = server->data + server->len - j;[m
[31m-                port_len = j;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (c < '0' || c > '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        host = server->data;[m
[31m-        host_len = server->len;[m
[31m-        port = NULL;[m
[31m-        port_len = 0;[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-        ngx_crc32_init(base_hash);[m
[31m-        ngx_crc32_update(&base_hash, host, host_len);[m
[31m-        ngx_crc32_update(&base_hash, (u_char *) "", 1);[m
[31m-        ngx_crc32_update(&base_hash, port, port_len);[m
[31m-[m
[31m-        prev_hash.value = 0;[m
[31m-        npoints = peer->weight * 160;[m
[31m-[m
[31m-        for (j = 0; j < npoints; j++) {[m
[31m-            hash = base_hash;[m
[31m-[m
[31m-            ngx_crc32_update(&hash, prev_hash.byte, 4);[m
[31m-            ngx_crc32_final(hash);[m
[31m-[m
[31m-            points->point[points->number].hash = hash;[m
[31m-            points->point[points->number].server = server;[m
[31m-            points->number++;[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN)[m
[31m-            prev_hash.value = hash;[m
[31m-#else[m
[31m-            prev_hash.byte[0] = (u_char) (hash & 0xff);[m
[31m-            prev_hash.byte[1] = (u_char) ((hash >> 8) & 0xff);[m
[31m-            prev_hash.byte[2] = (u_char) ((hash >> 16) & 0xff);[m
[31m-            prev_hash.byte[3] = (u_char) ((hash >> 24) & 0xff);[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_qsort(points->point,[m
[31m-              points->number,[m
[31m-              sizeof(ngx_http_upstream_chash_point_t),[m
[31m-              ngx_http_upstream_chash_cmp_points);[m
[31m-[m
[31m-    for (i = 0, j = 1; j < points->number; j++) {[m
[31m-        if (points->point[i].hash != points->point[j].hash) {[m
[31m-            points->point[++i] = points->point[j];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    points->number = i + 1;[m
[31m-[m
[31m-    hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);[m
[31m-    hcf->points = points;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_upstream_chash_cmp_points(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_http_upstream_chash_point_t *first =[m
[31m-                                       (ngx_http_upstream_chash_point_t *) one;[m
[31m-    ngx_http_upstream_chash_point_t *second =[m
[31m-                                       (ngx_http_upstream_chash_point_t *) two;[m
[31m-[m
[31m-    if (first->hash < second->hash) {[m
[31m-        return -1;[m
[31m-[m
[31m-    } else if (first->hash > second->hash) {[m
[31m-        return 1;[m
[31m-[m
[31m-    } else {[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_upstream_find_chash_point(ngx_http_upstream_chash_points_t *points,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_uint_t                        i, j, k;[m
[31m-    ngx_http_upstream_chash_point_t  *point;[m
[31m-[m
[31m-    /* find first point >= hash */[m
[31m-[m
[31m-    point = &points->point[0];[m
[31m-[m
[31m-    i = 0;[m
[31m-    j = points->number;[m
[31m-[m
[31m-    while (i < j) {[m
[31m-        k = (i + j) / 2;[m
[31m-[m
[31m-        if (hash > point[k].hash) {[m
[31m-            i = k + 1;[m
[31m-[m
[31m-        } else if (hash < point[k].hash) {[m
[31m-            j = k;[m
[31m-[m
[31m-        } else {[m
[31m-            return k;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    uint32_t                             hash;[m
[31m-    ngx_http_upstream_hash_srv_conf_t   *hcf;[m
[31m-    ngx_http_upstream_hash_peer_data_t  *hp;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_hash_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_chash_peer;[m
[31m-[m
[31m-    hp = r->upstream->peer.data;[m
[31m-    hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);[m
[31m-[m
[31m-    hash = ngx_crc32_long(hp->key.data, hp->key.len);[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_rlock(hp->rrp.peers);[m
[31m-[m
[31m-    hp->hash = ngx_http_upstream_find_chash_point(hcf->points, hash);[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_peer_data_t  *hp = data;[m
[31m-[m
[31m-    time_t                              now;[m
[31m-    intptr_t                            m;[m
[31m-    ngx_str_t                          *server;[m
[31m-    ngx_int_t                           total;[m
[31m-    ngx_uint_t                          i, n, best_i;[m
[31m-    ngx_http_upstream_rr_peer_t        *peer, *best;[m
[31m-    ngx_http_upstream_chash_point_t    *point;[m
[31m-    ngx_http_upstream_chash_points_t   *points;[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *hcf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get consistent hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-    hcf = hp->conf;[m
[31m-[m
[31m-    points = hcf->points;[m
[31m-    point = &points->point[0];[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        server = point[hp->hash % points->number].server;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "consistent hash peer:%uD, server:\"%V\"",[m
[31m-                       hp->hash, server);[m
[31m-[m
[31m-        best = NULL;[m
[31m-        best_i = 0;[m
[31m-        total = 0;[m
[31m-[m
[31m-        for (peer = hp->rrp.peers->peer, i = 0;[m
[31m-             peer;[m
[31m-             peer = peer->next, i++)[m
[31m-        {[m
[31m-[m
[31m-            n = i / (8 * sizeof(uintptr_t));[m
[31m-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-            if (hp->rrp.tried[n] & m) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->down) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->server.len != server->len[m
[31m-                || ngx_strncmp(peer->server.data, server->data, server->len)[m
[31m-                   != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->max_fails[m
[31m-                && peer->fails >= peer->max_fails[m
[31m-                && now - peer->checked <= peer->fail_timeout)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            peer->current_weight += peer->effective_weight;[m
[31m-            total += peer->effective_weight;[m
[31m-[m
[31m-            if (peer->effective_weight < peer->weight) {[m
[31m-                peer->effective_weight++;[m
[31m-            }[m
[31m-[m
[31m-            if (best == NULL || peer->current_weight > best->current_weight) {[m
[31m-                best = peer;[m
[31m-                best_i = i;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (best) {[m
[31m-            best->current_weight -= total;[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        hp->hash++;[m
[31m-        hp->tries++;[m
[31m-[m
[31m-        if (hp->tries >= points->number) {[m
[31m-            ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    hp->rrp.current = best;[m
[31m-[m
[31m-    pc->sockaddr = best->sockaddr;[m
[31m-    pc->socklen = best->socklen;[m
[31m-    pc->name = &best->name;[m
[31m-[m
[31m-    best->conns++;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    n = best_i / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    hp->rrp.tried[n] |= m;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_upstream_hash_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_upstream_hash_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->points = NULL;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *hcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_upstream_srv_conf_t      *uscf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &hcf->key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = NGX_HTTP_UPSTREAM_CREATE[m
[31m-                  |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                  |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_HTTP_UPSTREAM_DOWN;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        uscf->peer.init_upstream = ngx_http_upstream_init_hash;[m
[31m-[m
[31m-    } else if (ngx_strcmp(value[2].data, "consistent") == 0) {[m
[31m-        uscf->peer.init_upstream = ngx_http_upstream_init_chash;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_ip_hash_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_ip_hash_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8a5f0fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_ip_hash_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,267 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* the round robin data must be first */[m
[31m-    ngx_http_upstream_rr_peer_data_t   rrp;[m
[31m-[m
[31m-    ngx_uint_t                         hash;[m
[31m-[m
[31m-    u_char                             addrlen;[m
[31m-    u_char                            *addr;[m
[31m-[m
[31m-    u_char                             tries;[m
[31m-[m
[31m-    ngx_event_get_peer_pt              get_rr_peer;[m
[31m-} ngx_http_upstream_ip_hash_peer_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static char *ngx_http_upstream_ip_hash(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_ip_hash_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ip_hash"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_upstream_ip_hash,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_ip_hash_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_ip_hash_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_ip_hash_module_ctx, /* module context */[m
[31m-    ngx_http_upstream_ip_hash_commands,    /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_upstream_ip_hash_pseudo_addr[3];[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_ip_hash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_ip_hash_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    struct sockaddr_in                     *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6                    *sin6;[m
[31m-#endif[m
[31m-    ngx_http_upstream_ip_hash_peer_data_t  *iphp;[m
[31m-[m
[31m-    iphp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_ip_hash_peer_data_t));[m
[31m-    if (iphp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.data = &iphp->rrp;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_ip_hash_peer;[m
[31m-[m
[31m-    switch (r->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        sin = (struct sockaddr_in *) r->connection->sockaddr;[m
[31m-        iphp->addr = (u_char *) &sin->sin_addr.s_addr;[m
[31m-        iphp->addrlen = 3;[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;[m
[31m-        iphp->addr = (u_char *) &sin6->sin6_addr.s6_addr;[m
[31m-        iphp->addrlen = 16;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        iphp->addr = ngx_http_upstream_ip_hash_pseudo_addr;[m
[31m-        iphp->addrlen = 3;[m
[31m-    }[m
[31m-[m
[31m-    iphp->hash = 89;[m
[31m-    iphp->tries = 0;[m
[31m-    iphp->get_rr_peer = ngx_http_upstream_get_round_robin_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_ip_hash_peer_data_t  *iphp = data;[m
[31m-[m
[31m-    time_t                        now;[m
[31m-    ngx_int_t                     w;[m
[31m-    uintptr_t                     m;[m
[31m-    ngx_uint_t                    i, n, p, hash;[m
[31m-    ngx_http_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get ip hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    /* TODO: cached */[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_wlock(iphp->rrp.peers);[m
[31m-[m
[31m-    if (iphp->tries > 20 || iphp->rrp.peers->single) {[m
[31m-        ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);[m
[31m-        return iphp->get_rr_peer(pc, &iphp->rrp);[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    hash = iphp->hash;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        for (i = 0; i < (ngx_uint_t) iphp->addrlen; i++) {[m
[31m-            hash = (hash * 113 + iphp->addr[i]) % 6271;[m
[31m-        }[m
[31m-[m
[31m-        w = hash % iphp->rrp.peers->total_weight;[m
[31m-        peer = iphp->rrp.peers->peer;[m
[31m-        p = 0;[m
[31m-[m
[31m-        while (w >= peer->weight) {[m
[31m-            w -= peer->weight;[m
[31m-            peer = peer->next;[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        n = p / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (iphp->rrp.tried[n] & m) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get ip hash peer, hash: %ui %04XL", p, (uint64_t) m);[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        if (++iphp->tries > 20) {[m
[31m-            ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);[m
[31m-            return iphp->get_rr_peer(pc, &iphp->rrp);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    iphp->rrp.current = peer;[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    if (now - peer->checked > peer->fail_timeout) {[m
[31m-        peer->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);[m
[31m-[m
[31m-    iphp->rrp.tried[n] |= m;[m
[31m-    iphp->hash = hash;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_ip_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_upstream_init_ip_hash;[m
[31m-[m
[31m-    uscf->flags = NGX_HTTP_UPSTREAM_CREATE[m
[31m-                  |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                  |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_HTTP_UPSTREAM_DOWN;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_keepalive_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_keepalive_module.c[m
[1mdeleted file mode 100644[m
[1mindex 85bfcdb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_keepalive_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,529 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                         max_cached;[m
[31m-[m
[31m-    ngx_queue_t                        cache;[m
[31m-    ngx_queue_t                        free;[m
[31m-[m
[31m-    ngx_http_upstream_init_pt          original_init_upstream;[m
[31m-    ngx_http_upstream_init_peer_pt     original_init_peer;[m
[31m-[m
[31m-} ngx_http_upstream_keepalive_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *conf;[m
[31m-[m
[31m-    ngx_queue_t                        queue;[m
[31m-    ngx_connection_t                  *connection;[m
[31m-[m
[31m-    socklen_t                          socklen;[m
[31m-    u_char                             sockaddr[NGX_SOCKADDRLEN];[m
[31m-[m
[31m-} ngx_http_upstream_keepalive_cache_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *conf;[m
[31m-[m
[31m-    ngx_http_upstream_t               *upstream;[m
[31m-[m
[31m-    void                              *data;[m
[31m-[m
[31m-    ngx_event_get_peer_pt              original_get_peer;[m
[31m-    ngx_event_free_peer_pt             original_free_peer;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_event_set_peer_session_pt      original_set_session;[m
[31m-    ngx_event_save_peer_session_pt     original_save_session;[m
[31m-#endif[m
[31m-[m
[31m-} ngx_http_upstream_keepalive_peer_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static void ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state);[m
[31m-[m
[31m-static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_keepalive_close(ngx_connection_t *c);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_upstream_keepalive_set_session([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-static void ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_keepalive_commands[] = {[m
[31m-[m
[31m-    { ngx_string("keepalive"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_keepalive,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_keepalive_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_http_upstream_keepalive_create_conf, /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_keepalive_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_keepalive_module_ctx, /* module context */[m
[31m-    ngx_http_upstream_keepalive_commands,    /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_keepalive(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_uint_t                               i;[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *kcf;[m
[31m-    ngx_http_upstream_keepalive_cache_t     *cached;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,[m
[31m-                   "init keepalive");[m
[31m-[m
[31m-    kcf = ngx_http_conf_upstream_srv_conf(us,[m
[31m-                                          ngx_http_upstream_keepalive_module);[m
[31m-[m
[31m-    if (kcf->original_init_upstream(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    kcf->original_init_peer = us->peer.init;[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_keepalive_peer;[m
[31m-[m
[31m-    /* allocate cache items and add to free queue */[m
[31m-[m
[31m-    cached = ngx_pcalloc(cf->pool,[m
[31m-                sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);[m
[31m-    if (cached == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_init(&kcf->cache);[m
[31m-    ngx_queue_init(&kcf->free);[m
[31m-[m
[31m-    for (i = 0; i < kcf->max_cached; i++) {[m
[31m-        ngx_queue_insert_head(&kcf->free, &cached[i].queue);[m
[31m-        cached[i].conf = kcf;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp;[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t   *kcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "init keepalive peer");[m
[31m-[m
[31m-    kcf = ngx_http_conf_upstream_srv_conf(us,[m
[31m-                                          ngx_http_upstream_keepalive_module);[m
[31m-[m
[31m-    kp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_keepalive_peer_data_t));[m
[31m-    if (kp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (kcf->original_init_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    kp->conf = kcf;[m
[31m-    kp->upstream = r->upstream;[m
[31m-    kp->data = r->upstream->peer.data;[m
[31m-    kp->original_get_peer = r->upstream->peer.get;[m
[31m-    kp->original_free_peer = r->upstream->peer.free;[m
[31m-[m
[31m-    r->upstream->peer.data = kp;[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;[m
[31m-    r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    kp->original_set_session = r->upstream->peer.set_session;[m
[31m-    kp->original_save_session = r->upstream->peer.save_session;[m
[31m-    r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session;[m
[31m-    r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp = data;[m
[31m-    ngx_http_upstream_keepalive_cache_t      *item;[m
[31m-[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_queue_t       *q, *cache;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get keepalive peer");[m
[31m-[m
[31m-    /* ask balancer */[m
[31m-[m
[31m-    rc = kp->original_get_peer(pc, kp->data);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* search cache for suitable connection */[m
[31m-[m
[31m-    cache = &kp->conf->cache;[m
[31m-[m
[31m-    for (q = ngx_queue_head(cache);[m
[31m-         q != ngx_queue_sentinel(cache);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,[m
[31m-                         item->socklen, pc->socklen)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_queue_remove(q);[m
[31m-            ngx_queue_insert_head(&kp->conf->free, q);[m
[31m-[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get keepalive peer: using connection %p", c);[m
[31m-[m
[31m-    c->idle = 0;[m
[31m-    c->sent = 0;[m
[31m-    c->log = pc->log;[m
[31m-    c->read->log = pc->log;[m
[31m-    c->write->log = pc->log;[m
[31m-    c->pool->log = pc->log;[m
[31m-[m
[31m-    pc->connection = c;[m
[31m-    pc->cached = 1;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp = data;[m
[31m-    ngx_http_upstream_keepalive_cache_t      *item;[m
[31m-[m
[31m-    ngx_queue_t          *q;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "free keepalive peer");[m
[31m-[m
[31m-    /* cache valid connections */[m
[31m-[m
[31m-    u = kp->upstream;[m
[31m-    c = pc->connection;[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED[m
[31m-        || c == NULL[m
[31m-        || c->read->eof[m
[31m-        || c->read->error[m
[31m-        || c->read->timedout[m
[31m-        || c->write->error[m
[31m-        || c->write->timedout)[m
[31m-    {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->keepalive) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_body_sent) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_terminate || ngx_exiting) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "free keepalive peer: saving connection %p", c);[m
[31m-[m
[31m-    if (ngx_queue_empty(&kp->conf->free)) {[m
[31m-[m
[31m-        q = ngx_queue_last(&kp->conf->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);[m
[31m-[m
[31m-        ngx_http_upstream_keepalive_close(item->connection);[m
[31m-[m
[31m-    } else {[m
[31m-        q = ngx_queue_head(&kp->conf->free);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_insert_head(&kp->conf->cache, q);[m
[31m-[m
[31m-    item->connection = c;[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_http_upstream_keepalive_dummy_handler;[m
[31m-    c->read->handler = ngx_http_upstream_keepalive_close_handler;[m
[31m-[m
[31m-    c->data = item;[m
[31m-    c->idle = 1;[m
[31m-    c->log = ngx_cycle->log;[m
[31m-    c->read->log = ngx_cycle->log;[m
[31m-    c->write->log = ngx_cycle->log;[m
[31m-    c->pool->log = ngx_cycle->log;[m
[31m-[m
[31m-    item->socklen = pc->socklen;[m
[31m-    ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        ngx_http_upstream_keepalive_close_handler(c->read);[m
[31m-    }[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    kp->original_free_peer(pc, kp->data, state);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "keepalive dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *conf;[m
[31m-    ngx_http_upstream_keepalive_cache_t     *item;[m
[31m-[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "keepalive close handler");[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {[m
[31m-        ev->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            goto close;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-close:[m
[31m-[m
[31m-    item = c->data;[m
[31m-    conf = item->conf;[m
[31m-[m
[31m-    ngx_http_upstream_keepalive_close(c);[m
[31m-[m
[31m-    ngx_queue_remove(&item->queue);[m
[31m-    ngx_queue_insert_head(&conf->free, &item->queue);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_keepalive_close(ngx_connection_t *c)[m
[31m-{[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-        c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_http_upstream_keepalive_close;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_destroy_pool(c->pool);[m
[31m-    ngx_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_keepalive_set_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp = data;[m
[31m-[m
[31m-    return kp->original_set_session(pc, kp->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp = data;[m
[31m-[m
[31m-    kp->original_save_session(pc, kp->data);[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool,[m
[31m-                       sizeof(ngx_http_upstream_keepalive_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->original_init_upstream = NULL;[m
[31m-     *     conf->original_init_peer = NULL;[m
[31m-     *     conf->max_cached = 0;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t            *uscf;[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *kcf = conf;[m
[31m-[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_str_t   *value;[m
[31m-[m
[31m-    if (kcf->max_cached) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* read options */[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_atoi(value[1].data, value[1].len);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid value \"%V\" in \"%V\" directive",[m
[31m-                           &value[1], &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    kcf->max_cached = n;[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    kcf->original_init_upstream = uscf->peer.init_upstream[m
[31m-                                  ? uscf->peer.init_upstream[m
[31m-                                  : ngx_http_upstream_init_round_robin;[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_least_conn_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_least_conn_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8a300c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_least_conn_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,312 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_least_conn_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_least_conn_peer([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-static char *ngx_http_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_least_conn_commands[] = {[m
[31m-[m
[31m-    { ngx_string("least_conn"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_upstream_least_conn,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_least_conn_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_least_conn_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_least_conn_module_ctx, /* module context */[m
[31m-    ngx_http_upstream_least_conn_commands, /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_least_conn(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,[m
[31m-                   "init least conn");[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_least_conn_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_least_conn_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "init least conn peer");[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_least_conn_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    time_t                         now;[m
[31m-    uintptr_t                      m;[m
[31m-    ngx_int_t                      rc, total;[m
[31m-    ngx_uint_t                     i, n, p, many;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer, *best;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get least conn peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    if (rrp->peers->single) {[m
[31m-        return ngx_http_upstream_get_round_robin_peer(pc, rrp);[m
[31m-    }[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_wlock(peers);[m
[31m-[m
[31m-    best = NULL;[m
[31m-    total = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    many = 0;[m
[31m-    p = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (peer = peers->peer, i = 0;[m
[31m-         peer;[m
[31m-         peer = peer->next, i++)[m
[31m-    {[m
[31m-[m
[31m-        n = i / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (rrp->tried[n] & m) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * select peer with least number of connections; if there are[m
[31m-         * multiple peers with the same number of connections, select[m
[31m-         * based on round-robin[m
[31m-         */[m
[31m-[m
[31m-        if (best == NULL[m
[31m-            || peer->conns * best->weight < best->conns * peer->weight)[m
[31m-        {[m
[31m-            best = peer;[m
[31m-            many = 0;[m
[31m-            p = i;[m
[31m-[m
[31m-        } else if (peer->conns * best->weight == best->conns * peer->weight) {[m
[31m-            many = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (best == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get least conn peer, no peer found");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (many) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get least conn peer, many");[m
[31m-[m
[31m-        for (peer = best, i = p;[m
[31m-             peer;[m
[31m-             peer = peer->next, i++)[m
[31m-        {[m
[31m-            n = i / (8 * sizeof(uintptr_t));[m
[31m-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-            if (rrp->tried[n] & m) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->down) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->conns * best->weight != best->conns * peer->weight) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->max_fails[m
[31m-                && peer->fails >= peer->max_fails[m
[31m-                && now - peer->checked <= peer->fail_timeout)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            peer->current_weight += peer->effective_weight;[m
[31m-            total += peer->effective_weight;[m
[31m-[m
[31m-            if (peer->effective_weight < peer->weight) {[m
[31m-                peer->effective_weight++;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->current_weight > best->current_weight) {[m
[31m-                best = peer;[m
[31m-                p = i;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    best->current_weight -= total;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    pc->sockaddr = best->sockaddr;[m
[31m-    pc->socklen = best->socklen;[m
[31m-    pc->name = &best->name;[m
[31m-[m
[31m-    best->conns++;[m
[31m-[m
[31m-    rrp->current = best;[m
[31m-[m
[31m-    n = p / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    rrp->tried[n] |= m;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (peers->next) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get least conn peer, backup servers");[m
[31m-[m
[31m-        rrp->peers = peers->next;[m
[31m-[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            rrp->tried[i] = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        rc = ngx_http_upstream_get_least_conn_peer(pc, rrp);[m
[31m-[m
[31m-        if (rc != NGX_BUSY) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_wlock(peers);[m
[31m-    }[m
[31m-[m
[31m-    /* all peers failed, mark them as live for quick recovery */[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        peer->fails = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    pc->name = peers->name;[m
[31m-[m
[31m-    return NGX_BUSY;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_upstream_init_least_conn;[m
[31m-[m
[31m-    uscf->flags = NGX_HTTP_UPSTREAM_CREATE[m
[31m-                  |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                  |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_HTTP_UPSTREAM_DOWN[m
[31m-                  |NGX_HTTP_UPSTREAM_BACKUP;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_zone_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_zone_module.c[m
[1mdeleted file mode 100644[m
[1mindex 7e5bd74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_upstream_zone_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,246 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,[m
[31m-    void *data);[m
[31m-static ngx_http_upstream_rr_peers_t *ngx_http_upstream_zone_copy_peers([m
[31m-    ngx_slab_pool_t *shpool, ngx_http_upstream_srv_conf_t *uscf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_zone_commands[] = {[m
[31m-[m
[31m-    { ngx_string("zone"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_upstream_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_zone_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_zone_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_zone_module_ctx,    /* module context */[m
[31m-    ngx_http_upstream_zone_commands,       /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ssize_t                         size;[m
[31m-    ngx_str_t                      *value;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-    umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (!value[1].len) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid zone name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        size = ngx_parse_size(&value[2]);[m
[31m-[m
[31m-        if (size == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid zone size \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "zone \"%V\" is too small", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = 0;[m
[31m-    }[m
[31m-[m
[31m-    uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size,[m
[31m-                                           &ngx_http_upstream_module);[m
[31m-    if (uscf->shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf->shm_zone->init = ngx_http_upstream_init_zone;[m
[31m-    uscf->shm_zone->data = umcf;[m
[31m-[m
[31m-    uscf->shm_zone->noreuse = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_slab_pool_t                *shpool;[m
[31m-    ngx_http_upstream_rr_peers_t   *peers, **peersp;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-    umcf = shm_zone->data;[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        peers = shpool->data;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->shm_zone != shm_zone) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            uscf->peer.data = peers;[m
[31m-            peers = peers->zone_next;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-[m
[31m-    /* copy peers to shared memory */[m
[31m-[m
[31m-    peersp = (ngx_http_upstream_rr_peers_t **) (void *) &shpool->data;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->shm_zone != shm_zone) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        peers = ngx_http_upstream_zone_copy_peers(shpool, uscf);[m
[31m-        if (peers == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *peersp = peers;[m
[31m-        peersp = &peers->zone_next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_rr_peers_t *[m
[31m-ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_t   *peer, **peerp;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers, *backup;[m
[31m-[m
[31m-    peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-[m
[31m-    peers->shpool = shpool;[m
[31m-[m
[31m-    for (peerp = &peers->peer; *peerp; peerp = &peer->next) {[m
[31m-        /* pool is unlocked */[m
[31m-        peer = ngx_slab_calloc_locked(shpool,[m
[31m-                                      sizeof(ngx_http_upstream_rr_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));[m
[31m-[m
[31m-        *peerp = peer;[m
[31m-    }[m
[31m-[m
[31m-    if (peers->next == NULL) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-    if (backup == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-[m
[31m-    backup->shpool = shpool;[m
[31m-[m
[31m-    for (peerp = &backup->peer; *peerp; peerp = &peer->next) {[m
[31m-        /* pool is unlocked */[m
[31m-        peer = ngx_slab_calloc_locked(shpool,[m
[31m-                                      sizeof(ngx_http_upstream_rr_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));[m
[31m-[m
[31m-        *peerp = peer;[m
[31m-    }[m
[31m-[m
[31m-    peers->next = backup;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    uscf->peer.data = peers;[m
[31m-[m
[31m-    return peers;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_userid_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_userid_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 1487c09..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_userid_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,842 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_USERID_OFF   0[m
[31m-#define NGX_HTTP_USERID_LOG   1[m
[31m-#define NGX_HTTP_USERID_V1    2[m
[31m-#define NGX_HTTP_USERID_ON    3[m
[31m-[m
[31m-/* 31 Dec 2037 23:55:55 GMT */[m
[31m-#define NGX_HTTP_USERID_MAX_EXPIRES  2145916555[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  enable;[m
[31m-[m
[31m-    ngx_int_t   service;[m
[31m-[m
[31m-    ngx_str_t   name;[m
[31m-    ngx_str_t   domain;[m
[31m-    ngx_str_t   path;[m
[31m-    ngx_str_t   p3p;[m
[31m-[m
[31m-    time_t      expires;[m
[31m-[m
[31m-    u_char      mark;[m
[31m-} ngx_http_userid_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t    uid_got[4];[m
[31m-    uint32_t    uid_set[4];[m
[31m-    ngx_str_t   cookie;[m
[31m-    ngx_uint_t  reset;[m
[31m-} ngx_http_userid_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_http_userid_ctx_t *ngx_http_userid_get_uid(ngx_http_request_t *r,[m
[31m-    ngx_http_userid_conf_t *conf);[m
[31m-static ngx_int_t ngx_http_userid_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, ngx_str_t *name, uint32_t *uid);[m
[31m-static ngx_int_t ngx_http_userid_set_uid(ngx_http_request_t *r,[m
[31m-    ngx_http_userid_ctx_t *ctx, ngx_http_userid_conf_t *conf);[m
[31m-static ngx_int_t ngx_http_userid_create_uid(ngx_http_request_t *r,[m
[31m-    ngx_http_userid_ctx_t *ctx, ngx_http_userid_conf_t *conf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_userid_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_userid_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_userid_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_userid_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_userid_domain(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_userid_path(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_userid_expires(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_userid_p3p(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_userid_mark(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_userid_init_worker(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-[m
[31m-static uint32_t  start_value;[m
[31m-static uint32_t  sequencer_v1 = 1;[m
[31m-static uint32_t  sequencer_v2 = 0x03030302;[m
[31m-[m
[31m-[m
[31m-static u_char expires[] = "; expires=Thu, 31-Dec-37 23:55:55 GMT";[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_userid_state[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_USERID_OFF },[m
[31m-    { ngx_string("log"), NGX_HTTP_USERID_LOG },[m
[31m-    { ngx_string("v1"), NGX_HTTP_USERID_V1 },[m
[31m-    { ngx_string("on"), NGX_HTTP_USERID_ON },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_handler_pt  ngx_http_userid_domain_p =[m
[31m-    ngx_http_userid_domain;[m
[31m-static ngx_conf_post_handler_pt  ngx_http_userid_path_p = ngx_http_userid_path;[m
[31m-static ngx_conf_post_handler_pt  ngx_http_userid_p3p_p = ngx_http_userid_p3p;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_userid_commands[] = {[m
[31m-[m
[31m-    { ngx_string("userid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, enable),[m
[31m-      ngx_http_userid_state },[m
[31m-[m
[31m-    { ngx_string("userid_service"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, service),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("userid_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("userid_domain"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, domain),[m
[31m-      &ngx_http_userid_domain_p },[m
[31m-[m
[31m-    { ngx_string("userid_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, path),[m
[31m-      &ngx_http_userid_path_p },[m
[31m-[m
[31m-    { ngx_string("userid_expires"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_userid_expires,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("userid_p3p"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, p3p),[m
[31m-      &ngx_http_userid_p3p_p },[m
[31m-[m
[31m-    { ngx_string("userid_mark"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_userid_mark,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_userid_filter_module_ctx = {[m
[31m-    ngx_http_userid_add_variables,         /* preconfiguration */[m
[31m-    ngx_http_userid_init,                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_userid_create_conf,           /* create location configuration */[m
[31m-    ngx_http_userid_merge_conf             /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_userid_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_userid_filter_module_ctx,    /* module context */[m
[31m-    ngx_http_userid_commands,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    ngx_http_userid_init_worker,           /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t   ngx_http_userid_got = ngx_string("uid_got");[m
[31m-static ngx_str_t   ngx_http_userid_set = ngx_string("uid_set");[m
[31m-static ngx_str_t   ngx_http_userid_reset = ngx_string("uid_reset");[m
[31m-static ngx_uint_t  ngx_http_userid_reset_index;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_userid_ctx_t   *ctx;[m
[31m-    ngx_http_userid_conf_t  *conf;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_userid_filter_module);[m
[31m-[m
[31m-    if (conf->enable < NGX_HTTP_USERID_V1) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_userid_get_uid(r, conf);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_userid_set_uid(r, ctx, conf) == NGX_OK) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_got_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_userid_ctx_t   *ctx;[m
[31m-    ngx_http_userid_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r->main, ngx_http_userid_filter_module);[m
[31m-[m
[31m-    if (conf->enable == NGX_HTTP_USERID_OFF) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_userid_get_uid(r->main, conf);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->uid_got[3] != 0) {[m
[31m-        return ngx_http_userid_variable(r->main, v, &conf->name, ctx->uid_got);[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_set_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_userid_ctx_t   *ctx;[m
[31m-    ngx_http_userid_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r->main, ngx_http_userid_filter_module);[m
[31m-[m
[31m-    if (conf->enable < NGX_HTTP_USERID_V1) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_userid_get_uid(r->main, conf);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_userid_create_uid(r->main, ctx, conf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->uid_set[3] == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_userid_variable(r->main, v, &conf->name, ctx->uid_set);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_userid_ctx_t *[m
[31m-ngx_http_userid_get_uid(ngx_http_request_t *r, ngx_http_userid_conf_t *conf)[m
[31m-{[m
[31m-    ngx_int_t                n;[m
[31m-    ngx_str_t                src, dst;[m
[31m-    ngx_table_elt_t        **cookies;[m
[31m-    ngx_http_userid_ctx_t   *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_userid_filter_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        return ctx;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_userid_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_userid_filter_module);[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &conf->name,[m
[31m-                                          &ctx->cookie);[m
[31m-    if (n == NGX_DECLINED) {[m
[31m-        return ctx;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uid cookie: \"%V\"", &ctx->cookie);[m
[31m-[m
[31m-    if (ctx->cookie.len < 22) {[m
[31m-        cookies = r->headers_in.cookies.elts;[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent too short userid cookie \"%V\"",[m
[31m-                      &cookies[n]->value);[m
[31m-        return ctx;[m
[31m-    }[m
[31m-[m
[31m-    src = ctx->cookie;[m
[31m-[m
[31m-    /*[m
[31m-     * we have to limit the encoded string to 22 characters because[m
[31m-     *  1) cookie may be marked by "userid_mark",[m
[31m-     *  2) and there are already the millions cookies with a garbage[m
[31m-     *     instead of the correct base64 trail "=="[m
[31m-     */[m
[31m-[m
[31m-    src.len = 22;[m
[31m-[m
[31m-    dst.data = (u_char *) ctx->uid_got;[m
[31m-[m
[31m-    if (ngx_decode_base64(&dst, &src) == NGX_ERROR) {[m
[31m-        cookies = r->headers_in.cookies.elts;[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent invalid userid cookie \"%V\"",[m
[31m-                      &cookies[n]->value);[m
[31m-        return ctx;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uid: %08XD%08XD%08XD%08XD",[m
[31m-                   ctx->uid_got[0], ctx->uid_got[1],[m
[31m-                   ctx->uid_got[2], ctx->uid_got[3]);[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_set_uid(ngx_http_request_t *r, ngx_http_userid_ctx_t *ctx,[m
[31m-    ngx_http_userid_conf_t *conf)[m
[31m-{[m
[31m-    u_char           *cookie, *p;[m
[31m-    size_t            len;[m
[31m-    ngx_str_t         src, dst;[m
[31m-    ngx_table_elt_t  *set_cookie, *p3p;[m
[31m-[m
[31m-    if (ngx_http_userid_create_uid(r, ctx, conf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->uid_set[3] == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = conf->name.len + 1 + ngx_base64_encoded_length(16) + conf->path.len;[m
[31m-[m
[31m-    if (conf->expires) {[m
[31m-        len += sizeof(expires) - 1 + 2;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->domain.len) {[m
[31m-        len += conf->domain.len;[m
[31m-    }[m
[31m-[m
[31m-    cookie = ngx_pnalloc(r->pool, len);[m
[31m-    if (cookie == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(cookie, conf->name.data, conf->name.len);[m
[31m-    *p++ = '=';[m
[31m-[m
[31m-    if (ctx->uid_got[3] == 0 || ctx->reset) {[m
[31m-        src.len = 16;[m
[31m-        src.data = (u_char *) ctx->uid_set;[m
[31m-        dst.data = p;[m
[31m-[m
[31m-        ngx_encode_base64(&dst, &src);[m
[31m-[m
[31m-        p += dst.len;[m
[31m-[m
[31m-        if (conf->mark) {[m
[31m-            *(p - 2) = conf->mark;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_cpymem(p, ctx->cookie.data, 22);[m
[31m-        *p++ = conf->mark;[m
[31m-        *p++ = '=';[m
[31m-    }[m
[31m-[m
[31m-    if (conf->expires == NGX_HTTP_USERID_MAX_EXPIRES) {[m
[31m-        p = ngx_cpymem(p, expires, sizeof(expires) - 1);[m
[31m-[m
[31m-    } else if (conf->expires) {[m
[31m-        p = ngx_cpymem(p, expires, sizeof("; expires=") - 1);[m
[31m-        p = ngx_http_cookie_time(p, ngx_time() + conf->expires);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(p, conf->domain.data, conf->domain.len);[m
[31m-[m
[31m-    p = ngx_copy(p, conf->path.data, conf->path.len);[m
[31m-[m
[31m-    set_cookie = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (set_cookie == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    set_cookie->hash = 1;[m
[31m-    ngx_str_set(&set_cookie->key, "Set-Cookie");[m
[31m-    set_cookie->value.len = p - cookie;[m
[31m-    set_cookie->value.data = cookie;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uid cookie: \"%V\"", &set_cookie->value);[m
[31m-[m
[31m-    if (conf->p3p.len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p3p = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (p3p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p3p->hash = 1;[m
[31m-    ngx_str_set(&p3p->key, "P3P");[m
[31m-    p3p->value = conf->p3p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_create_uid(ngx_http_request_t *r, ngx_http_userid_ctx_t *ctx,[m
[31m-    ngx_http_userid_conf_t *conf)[m
[31m-{[m
[31m-    ngx_connection_t           *c;[m
[31m-    struct sockaddr_in         *sin;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                     *p;[m
[31m-    struct sockaddr_in6        *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->uid_set[3] != 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->uid_got[3] != 0) {[m
[31m-[m
[31m-        vv = ngx_http_get_indexed_variable(r, ngx_http_userid_reset_index);[m
[31m-[m
[31m-        if (vv->len == 0 || (vv->len == 1 && vv->data[0] == '0')) {[m
[31m-[m
[31m-            if (conf->mark == '\0'[m
[31m-                || (ctx->cookie.len > 23[m
[31m-                    && ctx->cookie.data[22] == conf->mark[m
[31m-                    && ctx->cookie.data[23] == '='))[m
[31m-            {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ctx->uid_set[0] = ctx->uid_got[0];[m
[31m-            ctx->uid_set[1] = ctx->uid_got[1];[m
[31m-            ctx->uid_set[2] = ctx->uid_got[2];[m
[31m-            ctx->uid_set[3] = ctx->uid_got[3];[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->reset = 1;[m
[31m-[m
[31m-            if (vv->len == 3 && ngx_strncmp(vv->data, "log", 3) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                        "userid cookie \"%V=%08XD%08XD%08XD%08XD\" was reset",[m
[31m-                        &conf->name, ctx->uid_got[0], ctx->uid_got[1],[m
[31m-                        ctx->uid_got[2], ctx->uid_got[3]);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * TODO: in the threaded mode the sequencers should be in TLS and their[m
[31m-     * ranges should be divided between threads[m
[31m-     */[m
[31m-[m
[31m-    if (conf->enable == NGX_HTTP_USERID_V1) {[m
[31m-        if (conf->service == NGX_CONF_UNSET) {[m
[31m-            ctx->uid_set[0] = 0;[m
[31m-        } else {[m
[31m-            ctx->uid_set[0] = conf->service;[m
[31m-        }[m
[31m-        ctx->uid_set[1] = (uint32_t) ngx_time();[m
[31m-        ctx->uid_set[2] = start_value;[m
[31m-        ctx->uid_set[3] = sequencer_v1;[m
[31m-        sequencer_v1 += 0x100;[m
[31m-[m
[31m-    } else {[m
[31m-        if (conf->service == NGX_CONF_UNSET) {[m
[31m-[m
[31m-            c = r->connection;[m
[31m-[m
[31m-            if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-[m
[31m-                p = (u_char *) &ctx->uid_set[0];[m
[31m-[m
[31m-                *p++ = sin6->sin6_addr.s6_addr[12];[m
[31m-                *p++ = sin6->sin6_addr.s6_addr[13];[m
[31m-                *p++ = sin6->sin6_addr.s6_addr[14];[m
[31m-                *p = sin6->sin6_addr.s6_addr[15];[m
[31m-[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-                ctx->uid_set[0] = sin->sin_addr.s_addr;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->uid_set[0] = htonl(conf->service);[m
[31m-        }[m
[31m-[m
[31m-        ctx->uid_set[1] = htonl((uint32_t) ngx_time());[m
[31m-        ctx->uid_set[2] = htonl(start_value);[m
[31m-        ctx->uid_set[3] = htonl(sequencer_v2);[m
[31m-        sequencer_v2 += 0x100;[m
[31m-        if (sequencer_v2 < 0x03030302) {[m
[31m-            sequencer_v2 = 0x03030302;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    ngx_str_t *name, uint32_t *uid)[m
[31m-{[m
[31m-    v->len = name->len + sizeof("=00001111222233334444555566667777") - 1;[m
[31m-    v->data = ngx_pnalloc(r->pool, v->len);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ngx_sprintf(v->data, "%V=%08XD%08XD%08XD%08XD",[m
[31m-                name, uid[0], uid[1], uid[2], uid[3]);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_reset_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_userid_got, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_userid_got_variable;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_userid_set, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_userid_set_variable;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_userid_reset,[m
[31m-                                NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_userid_reset_variable;[m
[31m-[m
[31m-    n = ngx_http_get_variable_index(cf, &ngx_http_userid_reset);[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_userid_reset_index = n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_userid_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_userid_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_userid_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->name = { 0, NULL };[m
[31m-     *     conf->domain = { 0, NULL };[m
[31m-     *     conf->path = { 0, NULL };[m
[31m-     *     conf->p3p = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET_UINT;[m
[31m-    conf->service = NGX_CONF_UNSET;[m
[31m-    conf->expires = NGX_CONF_UNSET;[m
[31m-    conf->mark = (u_char) '\xFF';[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_userid_conf_t *prev = parent;[m
[31m-    ngx_http_userid_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->enable, prev->enable,[m
[31m-                              NGX_HTTP_USERID_OFF);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->name, prev->name, "uid");[m
[31m-    ngx_conf_merge_str_value(conf->domain, prev->domain, "");[m
[31m-    ngx_conf_merge_str_value(conf->path, prev->path, "; path=/");[m
[31m-    ngx_conf_merge_str_value(conf->p3p, prev->p3p, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->service, prev->service, NGX_CONF_UNSET);[m
[31m-    ngx_conf_merge_sec_value(conf->expires, prev->expires, 0);[m
[31m-[m
[31m-    if (conf->mark == (u_char) '\xFF') {[m
[31m-        if (prev->mark == (u_char) '\xFF') {[m
[31m-            conf->mark = '\0';[m
[31m-        } else {[m
[31m-            conf->mark = prev->mark;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_userid_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_domain(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_str_t  *domain = data;[m
[31m-[m
[31m-    u_char  *p, *new;[m
[31m-[m
[31m-    if (ngx_strcmp(domain->data, "none") == 0) {[m
[31m-        ngx_str_set(domain, "");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    new = ngx_pnalloc(cf->pool, sizeof("; domain=") - 1 + domain->len);[m
[31m-    if (new == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(new, "; domain=", sizeof("; domain=") - 1);[m
[31m-    ngx_memcpy(p, domain->data, domain->len);[m
[31m-[m
[31m-    domain->len += sizeof("; domain=") - 1;[m
[31m-    domain->data = new;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_path(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_str_t  *path = data;[m
[31m-[m
[31m-    u_char  *p, *new;[m
[31m-[m
[31m-    new = ngx_pnalloc(cf->pool, sizeof("; path=") - 1 + path->len);[m
[31m-    if (new == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(new, "; path=", sizeof("; path=") - 1);[m
[31m-    ngx_memcpy(p, path->data, path->len);[m
[31m-[m
[31m-    path->len += sizeof("; path=") - 1;[m
[31m-    path->data = new;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_expires(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_userid_conf_t *ucf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (ucf->expires != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "max") == 0) {[m
[31m-        ucf->expires = NGX_HTTP_USERID_MAX_EXPIRES;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        ucf->expires = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ucf->expires = ngx_parse_time(&value[1], 1);[m
[31m-    if (ucf->expires == (time_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_p3p(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_str_t  *p3p = data;[m
[31m-[m
[31m-    if (ngx_strcmp(p3p->data, "none") == 0) {[m
[31m-        ngx_str_set(p3p, "");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_mark(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_userid_conf_t *ucf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (ucf->mark != (u_char) '\xFF') {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        ucf->mark = '\0';[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len != 1[m
[31m-        || !((value[1].data[0] >= '0' && value[1].data[0] <= '9')[m
[31m-              || (value[1].data[0] >= 'A' && value[1].data[0] <= 'Z')[m
[31m-              || (value[1].data[0] >= 'a' && value[1].data[0] <= 'z')[m
[31m-              || value[1].data[0] == '='))[m
[31m-    {[m
[31m-        return "value must be \"off\" or a single letter, digit or \"=\"";[m
[31m-    }[m
[31m-[m
[31m-    ucf->mark = value[1].data[0];[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_init_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    struct timeval  tp;[m
[31m-[m
[31m-    ngx_gettimeofday(&tp);[m
[31m-[m
[31m-    /* use the most significant usec part that fits to 16 bits */[m
[31m-    start_value = ((tp.tv_usec / 20) << 16) | ngx_pid;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_uwsgi_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_uwsgi_module.c[m
[1mdeleted file mode 100644[m
[1mindex fef2c46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_uwsgi_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,2361 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Unbit S.a.s. 2009-2010[m
[31m- * Copyright (C) 2008 Manlio Perillo (manlio.perillo@gmail.com)[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_uwsgi_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t               *flushes;[m
[31m-    ngx_array_t               *lengths;[m
[31m-    ngx_array_t               *values;[m
[31m-    ngx_uint_t                 number;[m
[31m-    ngx_hash_t                 hash;[m
[31m-} ngx_http_uwsgi_params_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-[m
[31m-    ngx_http_uwsgi_params_t    params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_uwsgi_params_t    params_cache;[m
[31m-#endif[m
[31m-    ngx_array_t               *params_source;[m
[31m-[m
[31m-    ngx_array_t               *uwsgi_lengths;[m
[31m-    ngx_array_t               *uwsgi_values;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t   cache_key;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_str_t                  uwsgi_string;[m
[31m-[m
[31m-    ngx_uint_t                 modifier1;[m
[31m-    ngx_uint_t                 modifier2;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_uint_t                 ssl;[m
[31m-    ngx_uint_t                 ssl_protocols;[m
[31m-    ngx_str_t                  ssl_ciphers;[m
[31m-    ngx_uint_t                 ssl_verify_depth;[m
[31m-    ngx_str_t                  ssl_trusted_certificate;[m
[31m-    ngx_str_t                  ssl_crl;[m
[31m-    ngx_str_t                  ssl_certificate;[m
[31m-    ngx_str_t                  ssl_certificate_key;[m
[31m-    ngx_array_t               *ssl_passwords;[m
[31m-#endif[m
[31m-} ngx_http_uwsgi_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_uwsgi_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf);[m
[31m-static ngx_int_t ngx_http_uwsgi_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_uwsgi_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_uwsgi_process_status_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_uwsgi_process_header(ngx_http_request_t *r);[m
[31m-static void ngx_http_uwsgi_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_uwsgi_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static void *ngx_http_uwsgi_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_uwsgi_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_uwsgi_init_params(ngx_conf_t *cf,[m
[31m-    ngx_http_uwsgi_loc_conf_t *conf, ngx_http_uwsgi_params_t *params,[m
[31m-    ngx_keyval_t *default_params);[m
[31m-[m
[31m-static char *ngx_http_uwsgi_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_uwsgi_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_uwsgi_create_key(ngx_http_request_t *r);[m
[31m-static char *ngx_http_uwsgi_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_uwsgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static char *ngx_http_uwsgi_ssl_password_file(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_http_uwsgi_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_num_bounds_t  ngx_http_uwsgi_modifier_bounds = {[m
[31m-    ngx_conf_check_num_bounds, 0, 255[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t ngx_http_uwsgi_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_uwsgi_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_uwsgi_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_uwsgi_commands[] = {[m
[31m-[m
[31m-    { ngx_string("uwsgi_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_modifier1"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, modifier1),[m
[31m-      &ngx_http_uwsgi_modifier_bounds },[m
[31m-[m
[31m-    { ngx_string("uwsgi_modifier2"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, modifier2),[m
[31m-      &ngx_http_uwsgi_modifier_bounds },[m
[31m-[m
[31m-    { ngx_string("uwsgi_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_main_conf_t, caches),[m
[31m-      &ngx_http_uwsgi_module },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_uwsgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("uwsgi_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_uwsgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("uwsgi_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23,[m
[31m-      ngx_http_upstream_param_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, params_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_string"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, uwsgi_string),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_session_reuse"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ssl_session_reuse),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_protocols),[m
[31m-      &ngx_http_uwsgi_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ssl_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_server_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ssl_server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_verify"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ssl_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_certificate_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_password_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_ssl_password_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_uwsgi_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_uwsgi_create_main_conf,       /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_uwsgi_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_uwsgi_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_uwsgi_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_uwsgi_module_ctx,            /* module context */[m
[31m-    ngx_http_uwsgi_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_uwsgi_hide_headers[] = {[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_uwsgi_cache_headers[] = {[m
[31m-    { ngx_string("HTTP_IF_MODIFIED_SINCE"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("HTTP_IF_MATCH"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_RANGE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_RANGE"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t ngx_http_uwsgi_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_UWSGI_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_status_t           *status;[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-    ngx_http_uwsgi_loc_conf_t   *uwcf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_uwsgi_main_conf_t  *uwmcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    status = ngx_pcalloc(r->pool, sizeof(ngx_http_status_t));[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, status, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    uwcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (uwcf->uwsgi_lengths == NULL) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl = (uwcf->upstream.ssl != NULL);[m
[31m-[m
[31m-        if (u->ssl) {[m
[31m-            ngx_str_set(&u->schema, "suwsgi://");[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_set(&u->schema, "uwsgi://");[m
[31m-        }[m
[31m-#else[m
[31m-        ngx_str_set(&u->schema, "uwsgi://");[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_uwsgi_eval(r, uwcf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_uwsgi_module;[m
[31m-[m
[31m-    u->conf = &uwcf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    uwmcf = ngx_http_get_module_main_conf(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    u->caches = &uwmcf->caches;[m
[31m-    u->create_key = ngx_http_uwsgi_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_uwsgi_create_request;[m
[31m-    u->reinit_request = ngx_http_uwsgi_reinit_request;[m
[31m-    u->process_header = ngx_http_uwsgi_process_status_line;[m
[31m-    u->abort_request = ngx_http_uwsgi_abort_request;[m
[31m-    u->finalize_request = ngx_http_uwsgi_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    u->buffering = uwcf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_event_pipe_copy_input_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    if (!uwcf->upstream.request_buffering[m
[31m-        && uwcf->upstream.pass_request_body[m
[31m-        && !r->headers_in.chunked)[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_eval(ngx_http_request_t *r, ngx_http_uwsgi_loc_conf_t * uwcf)[m
[31m-{[m
[31m-    size_t                add;[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &url.url, uwcf->uwsgi_lengths->elts, 0,[m
[31m-                            uwcf->uwsgi_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.url.len > 8[m
[31m-        && ngx_strncasecmp(url.url.data, (u_char *) "uwsgi://", 8) == 0)[m
[31m-    {[m
[31m-        add = 8;[m
[31m-[m
[31m-    } else if (url.url.len > 9[m
[31m-               && ngx_strncasecmp(url.url.data, (u_char *) "suwsgi://", 9) == 0)[m
[31m-    {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        add = 9;[m
[31m-        r->upstream->ssl = 1;[m
[31m-#else[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "suwsgi protocol requires SSL support");[m
[31m-        return NGX_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        add = 0;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (add) {[m
[31m-        u->schema.len = add;[m
[31m-        u->schema.data = url.url.data;[m
[31m-[m
[31m-        url.url.data += add;[m
[31m-        url.url.len -= add;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&u->schema, "uwsgi://");[m
[31m-    }[m
[31m-[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = url.port;[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                  *key;[m
[31m-    ngx_http_uwsgi_loc_conf_t  *uwcf;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uwcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &uwcf->cache_key, key) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                        ch, *lowcase_key;[m
[31m-    size_t                        key_len, val_len, len, allocated;[m
[31m-    ngx_uint_t                    i, n, hash, skip_empty, header_params;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header, **ignored;[m
[31m-    ngx_http_uwsgi_params_t      *params;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_uwsgi_loc_conf_t    *uwcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    len = 0;[m
[31m-    header_params = 0;[m
[31m-    ignored = NULL;[m
[31m-[m
[31m-    uwcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    params = r->upstream->cacheable ? &uwcf->params_cache : &uwcf->params;[m
[31m-#else[m
[31m-    params = &uwcf->params;[m
[31m-#endif[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, params->flushes);[m
[31m-        le.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-        le.request = r;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = lcode(&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode (&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += 2 + key_len + 2 + val_len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (uwcf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        allocated = 0;[m
[31m-        lowcase_key = NULL;[m
[31m-[m
[31m-        if (params->number) {[m
[31m-            n = 0;[m
[31m-            part = &r->headers_in.headers.part;[m
[31m-[m
[31m-            while (part) {[m
[31m-                n += part->nelts;[m
[31m-                part = part->next;[m
[31m-            }[m
[31m-[m
[31m-            ignored = ngx_palloc(r->pool, n * sizeof(void *));[m
[31m-            if (ignored == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (params->number) {[m
[31m-                if (allocated < header[i].key.len) {[m
[31m-                    allocated = header[i].key.len + 16;[m
[31m-                    lowcase_key = ngx_pnalloc(r->pool, allocated);[m
[31m-                    if (lowcase_key == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                hash = 0;[m
[31m-[m
[31m-                for (n = 0; n < header[i].key.len; n++) {[m
[31m-                    ch = header[i].key.data[n];[m
[31m-[m
[31m-                    if (ch >= 'A' && ch <= 'Z') {[m
[31m-                        ch |= 0x20;[m
[31m-[m
[31m-                    } else if (ch == '-') {[m
[31m-                        ch = '_';[m
[31m-                    }[m
[31m-[m
[31m-                    hash = ngx_hash(hash, ch);[m
[31m-                    lowcase_key[n] = ch;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_hash_find(&params->hash, hash, lowcase_key, n)) {[m
[31m-                    ignored[header_params++] = &header[i];[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            len += 2 + sizeof("HTTP_") - 1 + header[i].key.len[m
[31m-                 + 2 + header[i].value.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len += uwcf->uwsgi_string.len;[m
[31m-[m
[31m-#if 0[m
[31m-    /* allow custom uwsgi packet */[m
[31m-    if (len > 0 && len < 2) {[m
[31m-        ngx_log_error (NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                       "uwsgi request is too little: %uz", len);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len + 4);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    *b->last++ = (u_char) uwcf->modifier1;[m
[31m-    *b->last++ = (u_char) (len & 0xff);[m
[31m-    *b->last++ = (u_char) ((len >> 8) & 0xff);[m
[31m-    *b->last++ = (u_char) uwcf->modifier2;[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        e.ip = params->values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.request = r;[m
[31m-        e.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = (u_char) lcode (&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                e.skip = 1;[m
[31m-[m
[31m-                while (*(uintptr_t *) e.ip) {[m
[31m-                    code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                    code((ngx_http_script_engine_t *) &e);[m
[31m-                }[m
[31m-                e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-                e.skip = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            *e.pos++ = (u_char) (key_len & 0xff);[m
[31m-            *e.pos++ = (u_char) ((key_len >> 8) & 0xff);[m
[31m-[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) & e);[m
[31m-[m
[31m-            *e.pos++ = (u_char) (val_len & 0xff);[m
[31m-            *e.pos++ = (u_char) ((val_len >> 8) & 0xff);[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) & e);[m
[31m-            }[m
[31m-[m
[31m-            e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "uwsgi param: \"%*s: %*s\"",[m
[31m-                           key_len, e.pos - (key_len + 2 + val_len),[m
[31m-                           val_len, e.pos - val_len);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-    if (uwcf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            for (n = 0; n < header_params; n++) {[m
[31m-                if (&header[i] == ignored[n]) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            key_len = sizeof("HTTP_") - 1 + header[i].key.len;[m
[31m-            *b->last++ = (u_char) (key_len & 0xff);[m
[31m-            *b->last++ = (u_char) ((key_len >> 8) & 0xff);[m
[31m-[m
[31m-            b->last = ngx_cpymem(b->last, "HTTP_", sizeof("HTTP_") - 1);[m
[31m-            for (n = 0; n < header[i].key.len; n++) {[m
[31m-                ch = header[i].key.data[n];[m
[31m-[m
[31m-                if (ch >= 'a' && ch <= 'z') {[m
[31m-                    ch &= ~0x20;[m
[31m-[m
[31m-                } else if (ch == '-') {[m
[31m-                    ch = '_';[m
[31m-                }[m
[31m-[m
[31m-                *b->last++ = ch;[m
[31m-            }[m
[31m-[m
[31m-            val_len = header[i].value.len;[m
[31m-            *b->last++ = (u_char) (val_len & 0xff);[m
[31m-            *b->last++ = (u_char) ((val_len >> 8) & 0xff);[m
[31m-            b->last = ngx_copy(b->last, header[i].value.data, val_len);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "uwsgi param: \"%*s: %*s\"",[m
[31m-                           key_len, b->last - (key_len + 2 + val_len),[m
[31m-                           val_len, b->last - val_len);[m
[31m-        next:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, uwcf->uwsgi_string.data,[m
[31m-                       uwcf->uwsgi_string.len);[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    } else if (uwcf->upstream.pass_request_body) {[m
[31m-        body = r->upstream->request_bufs;[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-[m
[31m-        while (body) {[m
[31m-            b = ngx_alloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl->next == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl = cl->next;[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_status_t  *status;[m
[31m-[m
[31m-    status = ngx_http_get_module_ctx(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    status->code = 0;[m
[31m-    status->count = 0;[m
[31m-    status->start = NULL;[m
[31m-    status->end = NULL;[m
[31m-[m
[31m-    r->upstream->process_header = ngx_http_uwsgi_process_status_line;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_process_status_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                 len;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_http_status_t     *status;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    status = ngx_http_get_module_ctx(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, &u->buffer, status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        u->process_header = ngx_http_uwsgi_process_header;[m
[31m-        return ngx_http_uwsgi_process_header(r);[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->status == 0) {[m
[31m-        u->state->status = status->code;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = status->code;[m
[31m-[m
[31m-    len = status->end - status->start;[m
[31m-    u->headers_in.status_line.len = len;[m
[31m-[m
[31m-    u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (u->headers_in.status_line.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u->headers_in.status_line.data, status->start, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http uwsgi status %ui \"%V\"",[m
[31m-                   u->headers_in.status_n, &u->headers_in.status_line);[m
[31m-[m
[31m-    u->process_header = ngx_http_uwsgi_process_header;[m
[31m-[m
[31m-    return ngx_http_uwsgi_process_header(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *status_line;[m
[31m-    ngx_int_t                       rc, status;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            h->key.data = ngx_pnalloc(r->pool,[m
[31m-                                      h->key.len + 1 + h->value.len + 1[m
[31m-                                      + h->key.len);[m
[31m-            if (h->key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->value.data = h->key.data + h->key.len + 1;[m
[31m-            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;[m
[31m-[m
[31m-            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-            ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http uwsgi header: \"%V: %V\"", &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http uwsgi header done");[m
[31m-[m
[31m-            u = r->upstream;[m
[31m-[m
[31m-            if (u->headers_in.status_n) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (u->headers_in.status) {[m
[31m-                status_line = &u->headers_in.status->value;[m
[31m-[m
[31m-                status = ngx_atoi(status_line->data, 3);[m
[31m-                if (status == NGX_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "upstream sent invalid status \"%V\"",[m
[31m-                                  status_line);[m
[31m-                    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-                }[m
[31m-[m
[31m-                u->headers_in.status_n = status;[m
[31m-                u->headers_in.status_line = *status_line;[m
[31m-[m
[31m-            } else if (u->headers_in.location) {[m
[31m-                u->headers_in.status_n = 302;[m
[31m-                ngx_str_set(&u->headers_in.status_line,[m
[31m-                            "302 Moved Temporarily");[m
[31m-[m
[31m-            } else {[m
[31m-                u->headers_in.status_n = 200;[m
[31m-                ngx_str_set(&u->headers_in.status_line, "200 OK");[m
[31m-            }[m
[31m-[m
[31m-            if (u->state && u->state->status == 0) {[m
[31m-                u->state->status = u->headers_in.status_n;[m
[31m-            }[m
[31m-[m
[31m-        done:[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS[m
[31m-                && r->headers_in.upgrade)[m
[31m-            {[m
[31m-                u->upgrade = 1;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid header");[m
[31m-[m
[31m-        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_uwsgi_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http uwsgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_uwsgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http uwsgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_uwsgi_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_uwsgi_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_uwsgi_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_uwsgi_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->modifier1 = NGX_CONF_UNSET_UINT;[m
[31m-    conf->modifier2 = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_server_name = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_verify = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->ssl_passwords = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    /* "uwsgi_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "uwsgi");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *prev = parent;[m
[31m-    ngx_http_uwsgi_loc_conf_t *conf = child;[m
[31m-[m
[31m-    size_t                        size;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store, prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"uwsgi_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-            conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"uwsgi_busy_buffers_size\" must be equal to or greater "[m
[31m-            "than the maximum of the value of \"uwsgi_buffer_size\" and "[m
[31m-            "one of the \"uwsgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"uwsgi_busy_buffers_size\" must be less than "[m
[31m-            "the size of all \"uwsgi_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-            conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"uwsgi_temp_file_write_size\" must be equal to or greater than "[m
[31m-            "the maximum of the value of \"uwsgi_buffer_size\" and "[m
[31m-            "one of the \"uwsgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-            conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"uwsgi_max_temp_file_size\" must be equal to zero to disable "[m
[31m-            "temporary files usage or must be equal to or greater than "[m
[31m-            "the maximum of the value of \"uwsgi_buffer_size\" and "[m
[31m-            "one of the \"uwsgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                                 prev->upstream.ignore_headers,[m
[31m-                                 NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                                 prev->upstream.next_upstream,[m
[31m-                                 (NGX_CONF_BITMASK_SET[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                                  prev->upstream.temp_path,[m
[31m-                                  &ngx_http_uwsgi_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"uwsgi_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache && conf->cache_key.value.data == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "no \"uwsgi_cache_key\" for \"uwsgi_cache\"");[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                         prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                         prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                         prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_session_reuse,[m
[31m-                              prev->upstream.ssl_session_reuse, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                                  |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,[m
[31m-                             "DEFAULT");[m
[31m-[m
[31m-    if (conf->upstream.ssl_name == NULL) {[m
[31m-        conf->upstream.ssl_name = prev->upstream.ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_server_name,[m
[31m-                              prev->upstream.ssl_server_name, 0);[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_verify,[m
[31m-                              prev->upstream.ssl_verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                              prev->ssl_trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate,[m
[31m-                              prev->ssl_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate_key,[m
[31m-                              prev->ssl_certificate_key, "");[m
[31m-    ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);[m
[31m-[m
[31m-    if (conf->ssl && ngx_http_uwsgi_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->uwsgi_string, prev->uwsgi_string, "");[m
[31m-[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "uwsgi_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_uwsgi_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->uwsgi_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-[m
[31m-        conf->uwsgi_lengths = prev->uwsgi_lengths;[m
[31m-        conf->uwsgi_values = prev->uwsgi_values;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        conf->upstream.ssl = prev->upstream.ssl;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->uwsgi_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_uwsgi_handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->modifier1, prev->modifier1, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->modifier2, prev->modifier2, 0);[m
[31m-[m
[31m-    if (conf->params_source == NULL) {[m
[31m-        conf->params = prev->params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->params_cache = prev->params_cache;[m
[31m-#endif[m
[31m-        conf->params_source = prev->params_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_uwsgi_init_params(cf, conf, &conf->params, NULL);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_uwsgi_init_params(cf, conf, &conf->params_cache,[m
[31m-                                        ngx_http_uwsgi_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_init_params(ngx_conf_t *cf, ngx_http_uwsgi_loc_conf_t *conf,[m
[31m-    ngx_http_uwsgi_params_t *params, ngx_keyval_t *default_params)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i, nsrc;[m
[31m-    ngx_array_t                   headers_names, params_merged;[m
[31m-    ngx_keyval_t                 *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_upstream_param_t    *src, *s;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (params->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source == NULL && default_params == NULL) {[m
[31m-        params->hash.buckets = (void *) 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    params->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (params->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    params->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (params->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source) {[m
[31m-        src = conf->params_source->elts;[m
[31m-        nsrc = conf->params_source->nelts;[m
[31m-[m
[31m-    } else {[m
[31m-        src = NULL;[m
[31m-        nsrc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (default_params) {[m
[31m-        if (ngx_array_init(&params_merged, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_upstream_param_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = src[i];[m
[31m-        }[m
[31m-[m
[31m-        h = default_params;[m
[31m-[m
[31m-        while (h->key.len) {[m
[31m-[m
[31m-            src = params_merged.elts;[m
[31m-            nsrc = params_merged.nelts;[m
[31m-[m
[31m-            for (i = 0; i < nsrc; i++) {[m
[31m-                if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            s->key = h->key;[m
[31m-            s->value = h->value;[m
[31m-            s->skip_empty = 1;[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            h++;[m
[31m-        }[m
[31m-[m
[31m-        src = params_merged.elts;[m
[31m-        nsrc = params_merged.nelts;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-        if (src[i].key.len > sizeof("HTTP_") - 1[m
[31m-            && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0)[m
[31m-        {[m
[31m-            hk = ngx_array_push(&headers_names);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key.len = src[i].key.len - 5;[m
[31m-            hk->key.data = src[i].key.data + 5;[m
[31m-            hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-            if (src[i].value.len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].key.len;[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].skip_empty;[m
[31m-[m
[31m-[m
[31m-        size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                + src[i].key.len + sizeof(uintptr_t) - 1)[m
[31m-               & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->values, size);[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = ngx_http_script_copy_code;[m
[31m-        copy->len = src[i].key.len;[m
[31m-[m
[31m-        p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-        ngx_memcpy(p, src[i].key.data, src[i].key.len);[m
[31m-[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &src[i].value;[m
[31m-        sc.flushes = &params->flushes;[m
[31m-        sc.lengths = &params->lengths;[m
[31m-        sc.values = &params->values;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-        code = ngx_array_push_n(params->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-    params->number = headers_names.nelts;[m
[31m-[m
[31m-    hash.hash = &params->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = 64;[m
[31m-    hash.name = "uwsgi_params_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    size_t                      add;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (uwcf->upstream.upstream || uwcf->uwsgi_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_uwsgi_handler;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &uwcf->uwsgi_lengths;[m
[31m-        sc.values = &uwcf->uwsgi_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        uwcf->ssl = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncasecmp(url->data, (u_char *) "uwsgi://", 8) == 0) {[m
[31m-        add = 8;[m
[31m-[m
[31m-    } else if (ngx_strncasecmp(url->data, (u_char *) "suwsgi://", 9) == 0) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        add = 9;[m
[31m-        uwcf->ssl = 1;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "suwsgi protocol requires SSL support");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        add = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url.len = url->len - add;[m
[31m-    u.url.data = url->data + add;[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    uwcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (uwcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (uwcf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        uwcf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (uwcf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"uwsgi_cache\"";[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    uwcf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &uwcf->upstream.store_lengths;[m
[31m-    sc.values = &uwcf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (uwcf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        uwcf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (uwcf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"uwsgi_store\"";[m
[31m-    }[m
[31m-[m
[31m-    uwcf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        uwcf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (uwcf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *uwcf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    uwcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                      &ngx_http_uwsgi_module);[m
[31m-    if (uwcf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (uwcf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &uwcf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (uwcf->ssl_passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    uwcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (uwcf->ssl_passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_set_ssl(ngx_conf_t *cf, ngx_http_uwsgi_loc_conf_t *uwcf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    uwcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (uwcf->upstream.ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uwcf->upstream.ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(uwcf->upstream.ssl, uwcf->ssl_protocols, NULL)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = uwcf->upstream.ssl;[m
[31m-[m
[31m-    if (uwcf->ssl_certificate.len) {[m
[31m-[m
[31m-        if (uwcf->ssl_certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"uwsgi_ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &uwcf->ssl_certificate);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_certificate(cf, uwcf->upstream.ssl, &uwcf->ssl_certificate,[m
[31m-                                &uwcf->ssl_certificate_key, uwcf->ssl_passwords)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(uwcf->upstream.ssl->ctx,[m
[31m-                                (const char *) uwcf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &uwcf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (uwcf->upstream.ssl_verify) {[m
[31m-        if (uwcf->ssl_trusted_certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no uwsgi_ssl_trusted_certificate for uwsgi_ssl_verify");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, uwcf->upstream.ssl,[m
[31m-                                        &uwcf->ssl_trusted_certificate,[m
[31m-                                        uwcf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, uwcf->upstream.ssl, &uwcf->ssl_crl) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_xslt_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_xslt_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 315081e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/ngx_http_xslt_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1147 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <libxml/parser.h>[m
[31m-#include <libxml/tree.h>[m
[31m-#include <libxslt/xslt.h>[m
[31m-#include <libxslt/xsltInternals.h>[m
[31m-#include <libxslt/transform.h>[m
[31m-#include <libxslt/variables.h>[m
[31m-#include <libxslt/xsltutils.h>[m
[31m-[m
[31m-#if (NGX_HAVE_EXSLT)[m
[31m-#include <libexslt/exslt.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_XSLT_REUSE_DTD[m
[31m-#define NGX_HTTP_XSLT_REUSE_DTD  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                    *name;[m
[31m-    void                      *data;[m
[31m-} ngx_http_xslt_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                dtd_files;    /* ngx_http_xslt_file_t */[m
[31m-    ngx_array_t                sheet_files;  /* ngx_http_xslt_file_t */[m
[31m-} ngx_http_xslt_filter_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                    *name;[m
[31m-    ngx_http_complex_value_t   value;[m
[31m-    ngx_uint_t                 quote;        /* unsigned  quote:1; */[m
[31m-} ngx_http_xslt_param_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    xsltStylesheetPtr          stylesheet;[m
[31m-    ngx_array_t                params;       /* ngx_http_xslt_param_t */[m
[31m-} ngx_http_xslt_sheet_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    xmlDtdPtr                  dtd;[m
[31m-    ngx_array_t                sheets;       /* ngx_http_xslt_sheet_t */[m
[31m-    ngx_hash_t                 types;[m
[31m-    ngx_array_t               *types_keys;[m
[31m-    ngx_array_t               *params;       /* ngx_http_xslt_param_t */[m
[31m-    ngx_flag_t                 last_modified;[m
[31m-} ngx_http_xslt_filter_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    xmlDocPtr                  doc;[m
[31m-    xmlParserCtxtPtr           ctxt;[m
[31m-    xsltTransformContextPtr    transform;[m
[31m-    ngx_http_request_t        *request;[m
[31m-    ngx_array_t                params;[m
[31m-[m
[31m-    ngx_uint_t                 done;         /* unsigned  done:1; */[m
[31m-} ngx_http_xslt_filter_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_xslt_send(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx, ngx_buf_t *b);[m
[31m-static ngx_int_t ngx_http_xslt_add_chunk(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx, ngx_buf_t *b);[m
[31m-[m
[31m-[m
[31m-static void ngx_http_xslt_sax_external_subset(void *data, const xmlChar *name,[m
[31m-    const xmlChar *externalId, const xmlChar *systemId);[m
[31m-static void ngx_cdecl ngx_http_xslt_sax_error(void *data, const char *msg, ...);[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *ngx_http_xslt_apply_stylesheet(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_xslt_params(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx, ngx_array_t *params, ngx_uint_t final);[m
[31m-static u_char *ngx_http_xslt_content_type(xsltStylesheetPtr s);[m
[31m-static u_char *ngx_http_xslt_encoding(xsltStylesheetPtr s);[m
[31m-static void ngx_http_xslt_cleanup(void *data);[m
[31m-[m
[31m-static char *ngx_http_xslt_entities(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_xslt_stylesheet(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_xslt_param(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void ngx_http_xslt_cleanup_dtd(void *data);[m
[31m-static void ngx_http_xslt_cleanup_stylesheet(void *data);[m
[31m-static void *ngx_http_xslt_filter_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_xslt_filter_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_xslt_filter_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_xslt_filter_preconfiguration(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_xslt_filter_init(ngx_conf_t *cf);[m
[31m-static void ngx_http_xslt_filter_exit(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_xslt_default_types[] = {[m
[31m-    ngx_string("text/xml"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_xslt_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("xml_entities"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_xslt_entities,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xslt_stylesheet"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_xslt_stylesheet,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xslt_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_xslt_param,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xslt_string_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_xslt_param,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) 1 },[m
[31m-[m
[31m-    { ngx_string("xslt_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xslt_filter_loc_conf_t, types_keys),[m
[31m-      &ngx_http_xslt_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("xslt_last_modified"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xslt_filter_loc_conf_t, last_modified),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_xslt_filter_module_ctx = {[m
[31m-    ngx_http_xslt_filter_preconfiguration, /* preconfiguration */[m
[31m-    ngx_http_xslt_filter_init,             /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_xslt_filter_create_main_conf, /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_xslt_filter_create_conf,      /* create location configuration */[m
[31m-    ngx_http_xslt_filter_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_xslt_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_xslt_filter_module_ctx,      /* module context */[m
[31m-    ngx_http_xslt_filter_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    ngx_http_xslt_filter_exit,             /* exit process */[m
[31m-    ngx_http_xslt_filter_exit,             /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_ctx_t       *ctx;[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xslt filter header");[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    if (conf->sheets.nelts == 0[m
[31m-        || ngx_http_test_content_type(r, &conf->types) == NULL)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_xslt_filter_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    r->main_filter_need_in_memory = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    int                          wellFormed;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_http_xslt_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xslt filter body");[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->done) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        if (ngx_http_xslt_add_chunk(r, ctx, cl->buf) != NGX_OK) {[m
[31m-[m
[31m-            if (ctx->ctxt->myDoc) {[m
[31m-[m
[31m-#if (NGX_HTTP_XSLT_REUSE_DTD)[m
[31m-                ctx->ctxt->myDoc->extSubset = NULL;[m
[31m-#endif[m
[31m-                xmlFreeDoc(ctx->ctxt->myDoc);[m
[31m-            }[m
[31m-[m
[31m-            xmlFreeParserCtxt(ctx->ctxt);[m
[31m-[m
[31m-            return ngx_http_xslt_send(r, ctx, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_buf || cl->buf->last_in_chain) {[m
[31m-[m
[31m-            ctx->doc = ctx->ctxt->myDoc;[m
[31m-[m
[31m-#if (NGX_HTTP_XSLT_REUSE_DTD)[m
[31m-            ctx->doc->extSubset = NULL;[m
[31m-#endif[m
[31m-[m
[31m-            wellFormed = ctx->ctxt->wellFormed;[m
[31m-[m
[31m-            xmlFreeParserCtxt(ctx->ctxt);[m
[31m-[m
[31m-            if (wellFormed) {[m
[31m-                return ngx_http_xslt_send(r, ctx,[m
[31m-                                       ngx_http_xslt_apply_stylesheet(r, ctx));[m
[31m-            }[m
[31m-[m
[31m-            xmlFreeDoc(ctx->doc);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "not well formed XML document");[m
[31m-[m
[31m-            return ngx_http_xslt_send(r, ctx, NULL);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_send(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,[m
[31m-    ngx_buf_t *b)[m
[31m-{[m
[31m-    ngx_int_t                         rc;[m
[31m-    ngx_chain_t                       out;[m
[31m-    ngx_pool_cleanup_t               *cln;[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        return ngx_http_filter_finalize_request(r, &ngx_http_xslt_filter_module,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_free(b->pos);[m
[31m-        return ngx_http_filter_finalize_request(r, &ngx_http_xslt_filter_module,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        r->headers_out.content_length_n = b->last - b->pos;[m
[31m-[m
[31m-        if (r->headers_out.content_length) {[m
[31m-            r->headers_out.content_length->hash = 0;[m
[31m-            r->headers_out.content_length = NULL;[m
[31m-        }[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-        if (!conf->last_modified) {[m
[31m-            ngx_http_clear_last_modified(r);[m
[31m-            ngx_http_clear_etag(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_http_weak_etag(r);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_header_filter(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        ngx_free(b->pos);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_xslt_cleanup;[m
[31m-    cln->data = b->pos;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_add_chunk(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,[m
[31m-    ngx_buf_t *b)[m
[31m-{[m
[31m-    int               err;[m
[31m-    xmlParserCtxtPtr  ctxt;[m
[31m-[m
[31m-    if (ctx->ctxt == NULL) {[m
[31m-[m
[31m-        ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL);[m
[31m-        if (ctxt == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "xmlCreatePushParserCtxt() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        xmlCtxtUseOptions(ctxt, XML_PARSE_NOENT|XML_PARSE_DTDLOAD[m
[31m-                                               |XML_PARSE_NOWARNING);[m
[31m-[m
[31m-        ctxt->sax->externalSubset = ngx_http_xslt_sax_external_subset;[m
[31m-        ctxt->sax->setDocumentLocator = NULL;[m
[31m-        ctxt->sax->error = ngx_http_xslt_sax_error;[m
[31m-        ctxt->sax->fatalError = ngx_http_xslt_sax_error;[m
[31m-        ctxt->sax->_private = ctx;[m
[31m-[m
[31m-        ctx->ctxt = ctxt;[m
[31m-        ctx->request = r;[m
[31m-    }[m
[31m-[m
[31m-    err = xmlParseChunk(ctx->ctxt, (char *) b->pos, (int) (b->last - b->pos),[m
[31m-                        (b->last_buf) || (b->last_in_chain));[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        b->pos = b->last;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "xmlParseChunk() failed, error:%d", err);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_sax_external_subset(void *data, const xmlChar *name,[m
[31m-    const xmlChar *externalId, const xmlChar *systemId)[m
[31m-{[m
[31m-    xmlParserCtxtPtr ctxt = data;[m
[31m-[m
[31m-    xmlDocPtr                         doc;[m
[31m-    xmlDtdPtr                         dtd;[m
[31m-    ngx_http_request_t               *r;[m
[31m-    ngx_http_xslt_filter_ctx_t       *ctx;[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    ctx = ctxt->sax->_private;[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xslt filter extSubset: \"%s\" \"%s\" \"%s\"",[m
[31m-                   name ? name : (xmlChar *) "",[m
[31m-                   externalId ? externalId : (xmlChar *) "",[m
[31m-                   systemId ? systemId : (xmlChar *) "");[m
[31m-[m
[31m-    doc = ctxt->myDoc;[m
[31m-[m
[31m-#if (NGX_HTTP_XSLT_REUSE_DTD)[m
[31m-[m
[31m-    dtd = conf->dtd;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    dtd = xmlCopyDtd(conf->dtd);[m
[31m-    if (dtd == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xmlCopyDtd() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (doc->children == NULL) {[m
[31m-        xmlAddChild((xmlNodePtr) doc, (xmlNodePtr) dtd);[m
[31m-[m
[31m-    } else {[m
[31m-        xmlAddPrevSibling(doc->children, (xmlNodePtr) dtd);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    doc->extSubset = dtd;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void ngx_cdecl[m
[31m-ngx_http_xslt_sax_error(void *data, const char *msg, ...)[m
[31m-{[m
[31m-    xmlParserCtxtPtr ctxt = data;[m
[31m-[m
[31m-    size_t                       n;[m
[31m-    va_list                      args;[m
[31m-    ngx_http_xslt_filter_ctx_t  *ctx;[m
[31m-    u_char                       buf[NGX_MAX_ERROR_STR];[m
[31m-[m
[31m-    ctx = ctxt->sax->_private;[m
[31m-[m
[31m-    buf[0] = '\0';[m
[31m-[m
[31m-    va_start(args, msg);[m
[31m-    n = (size_t) vsnprintf((char *) buf, NGX_MAX_ERROR_STR, msg, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    while (--n && (buf[n] == CR || buf[n] == LF)) { /* void */ }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                  "libxml2 error: \"%*s\"", n + 1, buf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_xslt_apply_stylesheet(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    int                               len, rc, doc_type;[m
[31m-    u_char                           *type, *encoding;[m
[31m-    ngx_buf_t                        *b;[m
[31m-    ngx_uint_t                        i;[m
[31m-    xmlChar                          *buf;[m
[31m-    xmlDocPtr                         doc, res;[m
[31m-    ngx_http_xslt_sheet_t            *sheet;[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);[m
[31m-    sheet = conf->sheets.elts;[m
[31m-    doc = ctx->doc;[m
[31m-[m
[31m-    /* preallocate array for 4 params */[m
[31m-[m
[31m-    if (ngx_array_init(&ctx->params, r->pool, 4 * 2 + 1, sizeof(char *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        xmlFreeDoc(doc);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < conf->sheets.nelts; i++) {[m
[31m-[m
[31m-        ctx->transform = xsltNewTransformContext(sheet[i].stylesheet, doc);[m
[31m-        if (ctx->transform == NULL) {[m
[31m-            xmlFreeDoc(doc);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->params[m
[31m-            && ngx_http_xslt_params(r, ctx, conf->params, 0) != NGX_OK)[m
[31m-        {[m
[31m-            xsltFreeTransformContext(ctx->transform);[m
[31m-            xmlFreeDoc(doc);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_xslt_params(r, ctx, &sheet[i].params, 1) != NGX_OK) {[m
[31m-            xsltFreeTransformContext(ctx->transform);[m
[31m-            xmlFreeDoc(doc);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        res = xsltApplyStylesheetUser(sheet[i].stylesheet, doc,[m
[31m-                                      ctx->params.elts, NULL, NULL,[m
[31m-                                      ctx->transform);[m
[31m-[m
[31m-        xsltFreeTransformContext(ctx->transform);[m
[31m-        xmlFreeDoc(doc);[m
[31m-[m
[31m-        if (res == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "xsltApplyStylesheet() failed");[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        doc = res;[m
[31m-[m
[31m-        /* reset array elements */[m
[31m-        ctx->params.nelts = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* there must be at least one stylesheet */[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        type = ngx_http_xslt_content_type(sheet[i - 1].stylesheet);[m
[31m-[m
[31m-    } else {[m
[31m-        type = NULL;[m
[31m-    }[m
[31m-[m
[31m-    encoding = ngx_http_xslt_encoding(sheet[i - 1].stylesheet);[m
[31m-    doc_type = doc->type;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xslt filter type: %d t:%s e:%s",[m
[31m-                   doc_type, type ? type : (u_char *) "(null)",[m
[31m-                   encoding ? encoding : (u_char *) "(null)");[m
[31m-[m
[31m-    rc = xsltSaveResultToString(&buf, &len, doc, sheet[i - 1].stylesheet);[m
[31m-[m
[31m-    xmlFreeDoc(doc);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xsltSaveResultToString() failed");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xsltSaveResultToString() returned zero-length result");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        ngx_free(buf);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = buf;[m
[31m-    b->last = buf + len;[m
[31m-    b->memory = 1;[m
[31m-[m
[31m-    if (encoding) {[m
[31m-        r->headers_out.charset.len = ngx_strlen(encoding);[m
[31m-        r->headers_out.charset.data = encoding;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return b;[m
[31m-    }[m
[31m-[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    if (type) {[m
[31m-        len = ngx_strlen(type);[m
[31m-[m
[31m-        r->headers_out.content_type_len = len;[m
[31m-        r->headers_out.content_type.len = len;[m
[31m-        r->headers_out.content_type.data = type;[m
[31m-[m
[31m-    } else if (doc_type == XML_HTML_DOCUMENT_NODE) {[m
[31m-[m
[31m-        r->headers_out.content_type_len = sizeof("text/html") - 1;[m
[31m-        ngx_str_set(&r->headers_out.content_type, "text/html");[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_params(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,[m
[31m-    ngx_array_t *params, ngx_uint_t final)[m
[31m-{[m
[31m-    u_char                 *p, *last, *value, *dst, *src, **s;[m
[31m-    size_t                  len;[m
[31m-    ngx_uint_t              i;[m
[31m-    ngx_str_t               string;[m
[31m-    ngx_http_xslt_param_t  *param;[m
[31m-[m
[31m-    param = params->elts;[m
[31m-[m
[31m-    for (i = 0; i < params->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &param[i].value, &string) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "xslt filter param: \"%s\"", string.data);[m
[31m-[m
[31m-        if (param[i].name) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xslt filter param name: \"%s\"", param[i].name);[m
[31m-[m
[31m-            if (param[i].quote) {[m
[31m-                if (xsltQuoteOneUserParam(ctx->transform, param[i].name,[m
[31m-                                          string.data)[m
[31m-                    != 0)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                "xsltQuoteOneUserParam(\"%s\", \"%s\") failed",[m
[31m-                                param[i].name, string.data);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(&ctx->params);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = param[i].name;[m
[31m-[m
[31m-            s = ngx_array_push(&ctx->params);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = string.data;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * parse param1=value1:param2=value2 syntax as used by parameters[m
[31m-         * specified in xslt_stylesheet directives[m
[31m-         */[m
[31m-[m
[31m-        p = string.data;[m
[31m-        last = string.data + string.len;[m
[31m-[m
[31m-        while (p && *p) {[m
[31m-[m
[31m-            value = p;[m
[31m-            p = (u_char *) ngx_strchr(p, '=');[m
[31m-            if (p == NULL) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                "invalid libxslt parameter \"%s\"", value);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            *p++ = '\0';[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xslt filter param name: \"%s\"", value);[m
[31m-[m
[31m-            s = ngx_array_push(&ctx->params);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = value;[m
[31m-[m
[31m-            value = p;[m
[31m-            p = (u_char *) ngx_strchr(p, ':');[m
[31m-[m
[31m-            if (p) {[m
[31m-                len = p - value;[m
[31m-                *p++ = '\0';[m
[31m-[m
[31m-            } else {[m
[31m-                len = last - value;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xslt filter param value: \"%s\"", value);[m
[31m-[m
[31m-            dst = value;[m
[31m-            src = value;[m
[31m-[m
[31m-            ngx_unescape_uri(&dst, &src, len, 0);[m
[31m-[m
[31m-            *dst = '\0';[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xslt filter param unescaped: \"%s\"", value);[m
[31m-[m
[31m-            s = ngx_array_push(&ctx->params);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (final) {[m
[31m-        s = ngx_array_push(&ctx->params);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_xslt_content_type(xsltStylesheetPtr s)[m
[31m-{[m
[31m-    u_char  *type;[m
[31m-[m
[31m-    if (s->mediaType) {[m
[31m-        return s->mediaType;[m
[31m-    }[m
[31m-[m
[31m-    for (s = s->imports; s; s = s->next) {[m
[31m-[m
[31m-        type = ngx_http_xslt_content_type(s);[m
[31m-[m
[31m-        if (type) {[m
[31m-            return type;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_xslt_encoding(xsltStylesheetPtr s)[m
[31m-{[m
[31m-    u_char  *encoding;[m
[31m-[m
[31m-    if (s->encoding) {[m
[31m-        return s->encoding;[m
[31m-    }[m
[31m-[m
[31m-    for (s = s->imports; s; s = s->next) {[m
[31m-[m
[31m-        encoding = ngx_http_xslt_encoding(s);[m
[31m-[m
[31m-        if (encoding) {[m
[31m-            return encoding;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_free(data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xslt_entities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t *xlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_pool_cleanup_t                *cln;[m
[31m-    ngx_http_xslt_file_t              *file;[m
[31m-    ngx_http_xslt_filter_main_conf_t  *xmcf;[m
[31m-[m
[31m-    if (xlcf->dtd) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    xmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    file = xmcf->dtd_files.elts;[m
[31m-    for (i = 0; i < xmcf->dtd_files.nelts; i++) {[m
[31m-        if (ngx_strcmp(file[i].name, value[1].data) == 0) {[m
[31m-            xlcf->dtd = file[i].data;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    xlcf->dtd = xmlParseDTD(NULL, (xmlChar *) value[1].data);[m
[31m-[m
[31m-    if (xlcf->dtd == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0, "xmlParseDTD() failed");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_xslt_cleanup_dtd;[m
[31m-    cln->data = xlcf->dtd;[m
[31m-[m
[31m-    file = ngx_array_push(&xmcf->dtd_files);[m
[31m-    if (file == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->name = value[1].data;[m
[31m-    file->data = xlcf->dtd;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xslt_stylesheet(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t *xlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_pool_cleanup_t                *cln;[m
[31m-    ngx_http_xslt_file_t              *file;[m
[31m-    ngx_http_xslt_sheet_t             *sheet;[m
[31m-    ngx_http_xslt_param_t             *param;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_http_xslt_filter_main_conf_t  *xmcf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (xlcf->sheets.elts == NULL) {[m
[31m-        if (ngx_array_init(&xlcf->sheets, cf->pool, 1,[m
[31m-                           sizeof(ngx_http_xslt_sheet_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sheet = ngx_array_push(&xlcf->sheets);[m
[31m-    if (sheet == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(sheet, sizeof(ngx_http_xslt_sheet_t));[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    xmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    file = xmcf->sheet_files.elts;[m
[31m-    for (i = 0; i < xmcf->sheet_files.nelts; i++) {[m
[31m-        if (ngx_strcmp(file[i].name, value[1].data) == 0) {[m
[31m-            sheet->stylesheet = file[i].data;[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sheet->stylesheet = xsltParseStylesheetFile(value[1].data);[m
[31m-    if (sheet->stylesheet == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "xsltParseStylesheetFile(\"%s\") failed",[m
[31m-                           value[1].data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_xslt_cleanup_stylesheet;[m
[31m-    cln->data = sheet->stylesheet;[m
[31m-[m
[31m-    file = ngx_array_push(&xmcf->sheet_files);[m
[31m-    if (file == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->name = value[1].data;[m
[31m-    file->data = sheet->stylesheet;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    n = cf->args->nelts;[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&sheet->params, cf->pool, n - 2,[m
[31m-                       sizeof(ngx_http_xslt_param_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 2; i < n; i++) {[m
[31m-[m
[31m-        param = ngx_array_push(&sheet->params);[m
[31m-        if (param == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(param, sizeof(ngx_http_xslt_param_t));[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[i];[m
[31m-        ccv.complex_value = &param->value;[m
[31m-        ccv.zero = 1;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xslt_param(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *xlcf = conf;[m
[31m-[m
[31m-    ngx_http_xslt_param_t            *param;[m
[31m-    ngx_http_compile_complex_value_t  ccv;[m
[31m-    ngx_str_t                        *value;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (xlcf->params == NULL) {[m
[31m-        xlcf->params = ngx_array_create(cf->pool, 2,[m
[31m-                                        sizeof(ngx_http_xslt_param_t));[m
[31m-        if (xlcf->params == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    param = ngx_array_push(xlcf->params);[m
[31m-    if (param == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    param->name = value[1].data;[m
[31m-    param->quote = (cmd->post == NULL) ? 0 : 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &param->value;[m
[31m-    ccv.zero = 1;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_cleanup_dtd(void *data)[m
[31m-{[m
[31m-    xmlFreeDtd(data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_cleanup_stylesheet(void *data)[m
[31m-{[m
[31m-    xsltFreeStylesheet(data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_xslt_filter_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_xslt_filter_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&conf->dtd_files, cf->pool, 1,[m
[31m-                       sizeof(ngx_http_xslt_file_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&conf->sheet_files, cf->pool, 1,[m
[31m-                       sizeof(ngx_http_xslt_file_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_xslt_filter_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_xslt_filter_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->dtd = NULL;[m
[31m-     *     conf->sheets = { NULL };[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     *     conf->params = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->last_modified = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xslt_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t *prev = parent;[m
[31m-    ngx_http_xslt_filter_loc_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->dtd == NULL) {[m
[31m-        conf->dtd = prev->dtd;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->sheets.nelts == 0) {[m
[31m-        conf->sheets = prev->sheets;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params == NULL) {[m
[31m-        conf->params = prev->params;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_xslt_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->last_modified, prev->last_modified, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_filter_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    xmlInitParser();[m
[31m-[m
[31m-#if (NGX_HAVE_EXSLT)[m
[31m-    exsltRegisterAll();[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_xslt_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_xslt_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_filter_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    xsltCleanupGlobals();[m
[31m-    xmlCleanupParser();[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/Makefile.PL b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/Makefile.PL[m
[1mdeleted file mode 100644[m
[1mindex 03348b5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/Makefile.PL[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-use 5.006001;[m
[31m-use ExtUtils::MakeMaker;[m
[31m-[m
[31m-WriteMakefile([m
[31m-    NAME              => 'nginx',[m
[31m-    VERSION_FROM      => 'nginx.pm',     # finds $VERSION[m
[31m-    PREREQ_PM         => {},             # e.g., Module::Name => 1.1[m
[31m-[m
[31m-    ABSTRACT_FROM     => 'nginx.pm',     # retrieve abstract from module[m
[31m-    AUTHOR            => 'Igor Sysoev',[m
[31m-[m
[31m-    CCFLAGS           => "$ENV{NGX_PM_CFLAGS}",[m
[31m-    OPTIMIZE          => '-O',[m
[31m-[m
[31m-    INC               => join(" ", map {[m
[31m-                             m#^/# ? "-I $_" : "-I ../../../../../$_"[m
[31m-                         } (split /\s+/, $ENV{NGX_INCS})),[m
[31m-[m
[31m-    depend => {[m
[31m-        'nginx.c'     => join(" ", map {[m
[31m-                             m#^/# ? $_ : "../../../../../$_"[m
[31m-                         } (split(/\s+/, $ENV{NGX_DEPS}),[m
[31m-                            "src/http/modules/perl/ngx_http_perl_module.h"))[m
[31m-    },[m
[31m-[m
[31m-    PM => {[m
[31m-        'nginx.pm'    => '$(INST_LIBDIR)/nginx.pm'[m
[31m-    }[m
[31m-);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/nginx.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/nginx.pm[m
[1mdeleted file mode 100644[m
[1mindex e3f7361..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/nginx.pm[m
[1m+++ /dev/null[m
[36m@@ -1,138 +0,0 @@[m
[31m-package nginx;[m
[31m-[m
[31m-use 5.006001;[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-require Exporter;[m
[31m-[m
[31m-our @ISA = qw(Exporter);[m
[31m-[m
[31m-our @EXPORT = qw([m
[31m-    OK[m
[31m-    DECLINED[m
[31m-[m
[31m-    HTTP_OK[m
[31m-    HTTP_CREATED[m
[31m-    HTTP_ACCEPTED[m
[31m-    HTTP_NO_CONTENT[m
[31m-    HTTP_PARTIAL_CONTENT[m
[31m-[m
[31m-    HTTP_MOVED_PERMANENTLY[m
[31m-    HTTP_MOVED_TEMPORARILY[m
[31m-    HTTP_REDIRECT[m
[31m-    HTTP_SEE_OTHER[m
[31m-    HTTP_NOT_MODIFIED[m
[31m-    HTTP_TEMPORARY_REDIRECT[m
[31m-[m
[31m-    HTTP_BAD_REQUEST[m
[31m-    HTTP_UNAUTHORIZED[m
[31m-    HTTP_PAYMENT_REQUIRED[m
[31m-    HTTP_FORBIDDEN[m
[31m-    HTTP_NOT_FOUND[m
[31m-    HTTP_NOT_ALLOWED[m
[31m-    HTTP_NOT_ACCEPTABLE[m
[31m-    HTTP_REQUEST_TIME_OUT[m
[31m-    HTTP_CONFLICT[m
[31m-    HTTP_GONE[m
[31m-    HTTP_LENGTH_REQUIRED[m
[31m-    HTTP_REQUEST_ENTITY_TOO_LARGE[m
[31m-    HTTP_REQUEST_URI_TOO_LARGE[m
[31m-    HTTP_UNSUPPORTED_MEDIA_TYPE[m
[31m-    HTTP_RANGE_NOT_SATISFIABLE[m
[31m-[m
[31m-    HTTP_INTERNAL_SERVER_ERROR[m
[31m-    HTTP_SERVER_ERROR[m
[31m-    HTTP_NOT_IMPLEMENTED[m
[31m-    HTTP_BAD_GATEWAY[m
[31m-    HTTP_SERVICE_UNAVAILABLE[m
[31m-    HTTP_GATEWAY_TIME_OUT[m
[31m-    HTTP_INSUFFICIENT_STORAGE[m
[31m-);[m
[31m-[m
[31m-our $VERSION = '%%VERSION%%';[m
[31m-[m
[31m-require XSLoader;[m
[31m-XSLoader::load('nginx', $VERSION);[m
[31m-[m
[31m-# Preloaded methods go here.[m
[31m-[m
[31m-use constant OK                             => 0;[m
[31m-use constant DECLINED                       => -5;[m
[31m-[m
[31m-use constant HTTP_OK                        => 200;[m
[31m-use constant HTTP_CREATED                   => 201;[m
[31m-use constant HTTP_ACCEPTED                  => 202;[m
[31m-use constant HTTP_NO_CONTENT                => 204;[m
[31m-use constant HTTP_PARTIAL_CONTENT           => 206;[m
[31m-[m
[31m-use constant HTTP_MOVED_PERMANENTLY         => 301;[m
[31m-use constant HTTP_MOVED_TEMPORARILY         => 302;[m
[31m-use constant HTTP_REDIRECT                  => 302;[m
[31m-use constant HTTP_SEE_OTHER                 => 303;[m
[31m-use constant HTTP_NOT_MODIFIED              => 304;[m
[31m-use constant HTTP_TEMPORARY_REDIRECT        => 307;[m
[31m-[m
[31m-use constant HTTP_BAD_REQUEST               => 400;[m
[31m-use constant HTTP_UNAUTHORIZED              => 401;[m
[31m-use constant HTTP_PAYMENT_REQUIRED          => 402;[m
[31m-use constant HTTP_FORBIDDEN                 => 403;[m
[31m-use constant HTTP_NOT_FOUND                 => 404;[m
[31m-use constant HTTP_NOT_ALLOWED               => 405;[m
[31m-use constant HTTP_NOT_ACCEPTABLE            => 406;[m
[31m-use constant HTTP_REQUEST_TIME_OUT          => 408;[m
[31m-use constant HTTP_CONFLICT                  => 409;[m
[31m-use constant HTTP_GONE                      => 410;[m
[31m-use constant HTTP_LENGTH_REQUIRED           => 411;[m
[31m-use constant HTTP_REQUEST_ENTITY_TOO_LARGE  => 413;[m
[31m-use constant HTTP_REQUEST_URI_TOO_LARGE     => 414;[m
[31m-use constant HTTP_UNSUPPORTED_MEDIA_TYPE    => 415;[m
[31m-use constant HTTP_RANGE_NOT_SATISFIABLE     => 416;[m
[31m-[m
[31m-use constant HTTP_INTERNAL_SERVER_ERROR     => 500;[m
[31m-use constant HTTP_SERVER_ERROR              => 500;[m
[31m-use constant HTTP_NOT_IMPLEMENTED           => 501;[m
[31m-use constant HTTP_BAD_GATEWAY               => 502;[m
[31m-use constant HTTP_SERVICE_UNAVAILABLE       => 503;[m
[31m-use constant HTTP_GATEWAY_TIME_OUT          => 504;[m
[31m-use constant HTTP_INSUFFICIENT_STORAGE      => 507;[m
[31m-[m
[31m-[m
[31m-sub rflush {[m
[31m-    my $r = shift;[m
[31m-[m
[31m-    $r->flush;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-1;[m
[31m-__END__[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-nginx - Perl interface to the nginx HTTP server API[m
[31m-[m
[31m-=head1 SYNOPSIS[m
[31m-[m
[31m-  use nginx;[m
[31m-[m
[31m-=head1 DESCRIPTION[m
[31m-[m
[31m-This module provides a Perl interface to the nginx HTTP server API.[m
[31m-[m
[31m-[m
[31m-=head1 SEE ALSO[m
[31m-[m
[31m-http://nginx.org/en/docs/http/ngx_http_perl_module.html[m
[31m-[m
[31m-=head1 AUTHOR[m
[31m-[m
[31m-Igor Sysoev[m
[31m-[m
[31m-=head1 COPYRIGHT AND LICENSE[m
[31m-[m
[31m-Copyright (C) Igor Sysoev[m
[31m-Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-=cut[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/nginx.xs b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/nginx.xs[m
[1mdeleted file mode 100644[m
[1mindex 6716620..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/nginx.xs[m
[1m+++ /dev/null[m
[36m@@ -1,1038 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#define PERL_NO_GET_CONTEXT[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_perl_module.h>[m
[31m-[m
[31m-#include "XSUB.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_perl_set_request(r)                                          \[m
[31m-    r = INT2PTR(ngx_http_request_t *, SvIV((SV *) SvRV(ST(0))))[m
[31m-[m
[31m-[m
[31m-#define ngx_http_perl_set_targ(p, len)                                        \[m
[31m-                                                                              \[m
[31m-    SvUPGRADE(TARG, SVt_PV);                                                  \[m
[31m-    SvPOK_on(TARG);                                                           \[m
[31m-    sv_setpvn(TARG, (char *) p, len)[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_sv2str(pTHX_ ngx_http_request_t *r, ngx_str_t *s, SV *sv)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-    STRLEN   len;[m
[31m-[m
[31m-    if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {[m
[31m-        sv = SvRV(sv);[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) SvPV(sv, len);[m
[31m-[m
[31m-    s->len = len;[m
[31m-[m
[31m-    if (SvREADONLY(sv) && SvPOK(sv)) {[m
[31m-        s->data = p;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "perl sv2str: %08XD \"%V\"", sv->sv_flags, s);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    s->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl sv2str: %08XD \"%V\"", sv->sv_flags, s);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_output(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    ngx_chain_t           out;[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-    ngx_chain_t          *cl;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ctx->ssi) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->ssi->last_out = cl;[m
[31m-        ctx->ssi->last_out = &cl->next;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-MODULE = nginx    PACKAGE = nginx[m
[31m-[m
[31m-[m
[31m-PROTOTYPES: DISABLE[m
[31m-[m
[31m-[m
[31m-void[m
[31m-status(r, code)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    r->headers_out.status = SvIV(ST(1));[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl status: %d", r->headers_out.status);[m
[31m-[m
[31m-    XSRETURN_UNDEF;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-send_http_header(r, ...)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *sv;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (r->headers_out.status == 0) {[m
[31m-        r->headers_out.status = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (items != 1) {[m
[31m-        sv = ST(1);[m
[31m-[m
[31m-        if (ngx_http_perl_sv2str(aTHX_ r, &r->headers_out.content_type, sv)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            XSRETURN_EMPTY;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_len = r->headers_out.content_type.len;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-            XSRETURN_EMPTY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_http_send_header(r);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-header_only(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    sv_upgrade(TARG, SVt_IV);[m
[31m-    sv_setiv(TARG, r->header_only);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-uri(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-    ngx_http_perl_set_targ(r->uri.data, r->uri.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-args(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-    ngx_http_perl_set_targ(r->args.data, r->args.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-request_method(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-    ngx_http_perl_set_targ(r->method_name.data, r->method_name.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-remote_addr(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-    ngx_http_perl_set_targ(r->connection->addr_text.data,[m
[31m-                           r->connection->addr_text.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-header_in(r, key)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    SV                         *key;[m
[31m-    u_char                     *p, *lowcase_key, *value, sep;[m
[31m-    STRLEN                      len;[m
[31m-    ssize_t                     size;[m
[31m-    ngx_uint_t                  i, n, hash;[m
[31m-    ngx_array_t                *a;[m
[31m-    ngx_list_part_t            *part;[m
[31m-    ngx_table_elt_t            *h, **ph;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    key = ST(1);[m
[31m-[m
[31m-    if (SvROK(key) && SvTYPE(SvRV(key)) == SVt_PV) {[m
[31m-        key = SvRV(key);[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) SvPV(key, len);[m
[31m-[m
[31m-    /* look up hashed headers */[m
[31m-[m
[31m-    lowcase_key = ngx_pnalloc(r->pool, len);[m
[31m-    if (lowcase_key == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase_key, p, len);[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    hh = ngx_hash_find(&cmcf->headers_in_hash, hash, lowcase_key, len);[m
[31m-[m
[31m-    if (hh) {[m
[31m-[m
[31m-        if (hh->offset == offsetof(ngx_http_headers_in_t, cookies)) {[m
[31m-            sep = ';';[m
[31m-            goto multi;[m
[31m-        }[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-        if (hh->offset == offsetof(ngx_http_headers_in_t, x_forwarded_for)) {[m
[31m-            sep = ',';[m
[31m-            goto multi;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset);[m
[31m-[m
[31m-        if (*ph) {[m
[31m-            ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        XSRETURN_UNDEF;[m
[31m-[m
[31m-    multi:[m
[31m-[m
[31m-        /* Cookie, X-Forwarded-For */[m
[31m-[m
[31m-        a = (ngx_array_t *) ((char *) &r->headers_in + hh->offset);[m
[31m-[m
[31m-        n = a->nelts;[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            XSRETURN_UNDEF;[m
[31m-        }[m
[31m-[m
[31m-        ph = a->elts;[m
[31m-[m
[31m-        if (n == 1) {[m
[31m-            ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        size = - (ssize_t) (sizeof("; ") - 1);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            size += ph[i]->value.len + sizeof("; ") - 1;[m
[31m-        }[m
[31m-[m
[31m-        value = ngx_pnalloc(r->pool, size);[m
[31m-        if (value == NULL) {[m
[31m-            XSRETURN_UNDEF;[m
[31m-        }[m
[31m-[m
[31m-        p = value;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-            p = ngx_copy(p, ph[i]->value.data, ph[i]->value.len);[m
[31m-[m
[31m-            if (i == n - 1) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *p++ = sep; *p++ = ' ';[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_perl_set_targ(value, size);[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /* iterate over all headers */[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (len != h[i].key.len[m
[31m-            || ngx_strcasecmp(p, h[i].key.data) != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_perl_set_targ(h[i].value.data, h[i].value.len);[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    XSRETURN_UNDEF;[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-has_request_body(r, next)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-    ctx->next = SvRV(ST(1));[m
[31m-[m
[31m-    r->request_body_in_single_buf = 1;[m
[31m-    r->request_body_in_persistent_file = 1;[m
[31m-    r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-    if (r->request_body_in_file_only) {[m
[31m-        r->request_body_file_log_level = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_read_client_request_body(r, ngx_http_perl_handle_request);[m
[31m-[m
[31m-    sv_upgrade(TARG, SVt_IV);[m
[31m-    sv_setiv(TARG, 1);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-request_body(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-    u_char              *p, *data;[m
[31m-    size_t               len;[m
[31m-    ngx_buf_t           *buf;[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->temp_file[m
[31m-        || r->request_body->bufs == NULL)[m
[31m-    {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    cl = r->request_body->bufs;[m
[31m-    buf = cl->buf;[m
[31m-[m
[31m-    if (cl->next == NULL) {[m
[31m-        len = buf->last - buf->pos;[m
[31m-        data = buf->pos;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    len = buf->last - buf->pos;[m
[31m-    cl = cl->next;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        len += buf->last - buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    data = p;[m
[31m-    cl = r->request_body->bufs;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_perl_set_targ(data, len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-request_body_file(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (r->request_body == NULL || r->request_body->temp_file == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data,[m
[31m-                           r->request_body->temp_file->file.name.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-discard_request_body(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    ngx_http_discard_request_body(r);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-header_out(r, key, value)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *key;[m
[31m-    SV                  *value;[m
[31m-    ngx_table_elt_t     *header;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    key = ST(1);[m
[31m-    value = ST(2);[m
[31m-[m
[31m-    header = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (header == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    header->hash = 1;[m
[31m-[m
[31m-    if (ngx_http_perl_sv2str(aTHX_ r, &header->key, key) != NGX_OK) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_perl_sv2str(aTHX_ r, &header->value, value) != NGX_OK) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    if (header->key.len == sizeof("Content-Length") - 1[m
[31m-        && ngx_strncasecmp(header->key.data, (u_char *) "Content-Length",[m
[31m-                           sizeof("Content-Length") - 1) == 0)[m
[31m-    {[m
[31m-        r->headers_out.content_length_n = (off_t) SvIV(value);[m
[31m-        r->headers_out.content_length = header;[m
[31m-    }[m
[31m-[m
[31m-    if (header->key.len == sizeof("Content-Encoding") - 1[m
[31m-        && ngx_strncasecmp(header->key.data, (u_char *) "Content-Encoding",[m
[31m-                           sizeof("Content-Encoding") - 1) == 0)[m
[31m-    {[m
[31m-        r->headers_out.content_encoding = header;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-void[m
[31m-filename(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    size_t                root;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-    if (ctx->filename.data) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &ctx->filename, &root, 0) == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ctx->filename.len--;[m
[31m-    sv_setpv(PL_statname, (char *) ctx->filename.data);[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-    ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-print(r, ...)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *sv;[m
[31m-    int                  i;[m
[31m-    u_char              *p;[m
[31m-    size_t               size;[m
[31m-    STRLEN               len;[m
[31m-    ngx_buf_t           *b;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (items == 2) {[m
[31m-[m
[31m-        /*[m
[31m-         * do zero copy for prolate single read-only SV:[m
[31m-         *     $r->print("some text\n");[m
[31m-         */[m
[31m-[m
[31m-        sv = ST(1);[m
[31m-[m
[31m-        if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {[m
[31m-            sv = SvRV(sv);[m
[31m-        }[m
[31m-[m
[31m-        if (SvREADONLY(sv) && SvPOK(sv)) {[m
[31m-[m
[31m-            p = (u_char *) SvPV(sv, len);[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                XSRETURN_EMPTY;[m
[31m-            }[m
[31m-[m
[31m-            b = ngx_calloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                XSRETURN_EMPTY;[m
[31m-            }[m
[31m-[m
[31m-            b->memory = 1;[m
[31m-            b->pos = p;[m
[31m-            b->last = p + len;[m
[31m-            b->start = p;[m
[31m-            b->end = b->last;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "$r->print: read-only SV: %z", len);[m
[31m-[m
[31m-            goto out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 1; i < items; i++) {[m
[31m-[m
[31m-        sv = ST(i);[m
[31m-[m
[31m-        if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {[m
[31m-            sv = SvRV(sv);[m
[31m-        }[m
[31m-[m
[31m-        (void) SvPV(sv, len);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "$r->print: copy SV: %z", len);[m
[31m-[m
[31m-        size += len;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < items; i++) {[m
[31m-        sv = ST(i);[m
[31m-[m
[31m-        if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {[m
[31m-            sv = SvRV(sv);[m
[31m-        }[m
[31m-[m
[31m-        p = (u_char *) SvPV(sv, len);[m
[31m-        b->last = ngx_cpymem(b->last, p, len);[m
[31m-    }[m
[31m-[m
[31m-    out:[m
[31m-[m
[31m-    (void) ngx_http_perl_output(r, b);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-sendfile(r, filename, offset = -1, bytes = 0)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t        *r;[m
[31m-    char                      *filename;[m
[31m-    off_t                      offset;[m
[31m-    size_t                     bytes;[m
[31m-    ngx_str_t                  path;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    filename = SvPV_nolen(ST(1));[m
[31m-[m
[31m-    if (filename == NULL) {[m
[31m-        croak("sendfile(): NULL filename");[m
[31m-    }[m
[31m-[m
[31m-    offset = items < 3 ? -1 : SvIV(ST(2));[m
[31m-    bytes = items < 4 ? 0 : SvIV(ST(3));[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    path.len = ngx_strlen(filename);[m
[31m-[m
[31m-    path.data = ngx_pnalloc(r->pool, path.len + 1);[m
[31m-    if (path.data == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(path.data, (u_char *) filename, path.len + 1);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        if (of.err == 0) {[m
[31m-            XSRETURN_EMPTY;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      "%s \"%s\" failed", of.failed, filename);[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    if (offset == -1) {[m
[31m-        offset = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        bytes = of.size - offset;[m
[31m-    }[m
[31m-[m
[31m-    b->in_file = 1;[m
[31m-[m
[31m-    b->file_pos = offset;[m
[31m-    b->file_last = offset + bytes;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->log = r->connection->log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    (void) ngx_http_perl_output(r, b);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-flush(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    ngx_buf_t           *b;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    b->flush = 1;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "$r->flush");[m
[31m-[m
[31m-    (void) ngx_http_perl_output(r, b);[m
[31m-[m
[31m-    XSRETURN_EMPTY;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-internal_redirect(r, uri)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t   *r;[m
[31m-    SV                   *uri;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    uri = ST(1);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ngx_http_perl_sv2str(aTHX_ r, &ctx->redirect_uri, uri) != NGX_OK) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < ctx->redirect_uri.len; i++) {[m
[31m-        if (ctx->redirect_uri.data[i] == '?') {[m
[31m-[m
[31m-            ctx->redirect_args.len = ctx->redirect_uri.len - (i + 1);[m
[31m-            ctx->redirect_args.data = &ctx->redirect_uri.data[i + 1];[m
[31m-            ctx->redirect_uri.len = i;[m
[31m-[m
[31m-            XSRETURN_EMPTY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-void[m
[31m-allow_ranges(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-unescape(r, text, type = 0)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *text;[m
[31m-    int                  type;[m
[31m-    u_char              *p, *dst, *src;[m
[31m-    STRLEN               len;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    text = ST(1);[m
[31m-[m
[31m-    src = (u_char *) SvPV(text, len);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    dst = p;[m
[31m-[m
[31m-    type = items < 3 ? 0 : SvIV(ST(2));[m
[31m-[m
[31m-    ngx_unescape_uri(&dst, &src, len, (ngx_uint_t) type);[m
[31m-    *dst = '\0';[m
[31m-[m
[31m-    ngx_http_perl_set_targ(p, dst - p);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-variable(r, name, value = NULL)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    SV                         *name, *value;[m
[31m-    u_char                     *p, *lowcase;[m
[31m-    STRLEN                      len;[m
[31m-    ngx_str_t                   var, val;[m
[31m-    ngx_uint_t                  i, hash;[m
[31m-    ngx_http_perl_var_t        *v;[m
[31m-    ngx_http_perl_ctx_t        *ctx;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    name = ST(1);[m
[31m-[m
[31m-    if (SvROK(name) && SvTYPE(SvRV(name)) == SVt_PV) {[m
[31m-        name = SvRV(name);[m
[31m-    }[m
[31m-[m
[31m-    if (items == 2) {[m
[31m-        value = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        value = ST(2);[m
[31m-[m
[31m-        if (SvROK(value) && SvTYPE(SvRV(value)) == SVt_PV) {[m
[31m-            value = SvRV(value);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_perl_sv2str(aTHX_ r, &val, value) != NGX_OK) {[m
[31m-            XSRETURN_UNDEF;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) SvPV(name, len);[m
[31m-[m
[31m-    lowcase = ngx_pnalloc(r->pool, len);[m
[31m-    if (lowcase == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase, p, len);[m
[31m-[m
[31m-    var.len = len;[m
[31m-    var.data = lowcase;[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    if (value) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "perl variable: \"%V\"=\"%V\"", &var, &val);[m
[31m-    } else {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "perl variable: \"%V\"", &var);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    vv = ngx_http_get_variable(r, &var, hash);[m
[31m-    if (vv == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    if (vv->not_found) {[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-        if (ctx->variables) {[m
[31m-[m
[31m-            v = ctx->variables->elts;[m
[31m-            for (i = 0; i < ctx->variables->nelts; i++) {[m
[31m-[m
[31m-                if (hash != v[i].hash[m
[31m-                    || len != v[i].name.len[m
[31m-                    || ngx_strncmp(lowcase, v[i].name.data, len) != 0)[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (value) {[m
[31m-                    v[i].value = val;[m
[31m-                    XSRETURN_UNDEF;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_perl_set_targ(v[i].value.data, v[i].value.len);[m
[31m-[m
[31m-                goto done;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (value) {[m
[31m-            if (ctx->variables == NULL) {[m
[31m-                ctx->variables = ngx_array_create(r->pool, 1,[m
[31m-                                                  sizeof(ngx_http_perl_var_t));[m
[31m-                if (ctx->variables == NULL) {[m
[31m-                    XSRETURN_UNDEF;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            v = ngx_array_push(ctx->variables);[m
[31m-            if (v == NULL) {[m
[31m-                XSRETURN_UNDEF;[m
[31m-            }[m
[31m-[m
[31m-            v->hash = hash;[m
[31m-            v->name.len = len;[m
[31m-            v->name.data = lowcase;[m
[31m-            v->value = val;[m
[31m-[m
[31m-            XSRETURN_UNDEF;[m
[31m-        }[m
[31m-[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    if (value) {[m
[31m-        vv->len = val.len;[m
[31m-        vv->valid = 1;[m
[31m-        vv->no_cacheable = 0;[m
[31m-        vv->not_found = 0;[m
[31m-        vv->data = val.data;[m
[31m-[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_perl_set_targ(vv->data, vv->len);[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-sleep(r, sleep, next)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_msec_t            sleep;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    sleep = (ngx_msec_t) SvIV(ST(1));[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl sleep: %M", sleep);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    ctx->next = SvRV(ST(2));[m
[31m-[m
[31m-    ngx_add_timer(r->connection->write, sleep);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_perl_sleep_handler;[m
[31m-    r->main->count++;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-log_error(r, err, msg)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *err, *msg;[m
[31m-    u_char              *p;[m
[31m-    STRLEN               len;[m
[31m-    ngx_err_t            e;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    err = ST(1);[m
[31m-[m
[31m-    if (SvROK(err) && SvTYPE(SvRV(err)) == SVt_PV) {[m
[31m-        err = SvRV(err);[m
[31m-    }[m
[31m-[m
[31m-    e = SvIV(err);[m
[31m-[m
[31m-    msg = ST(2);[m
[31m-[m
[31m-    if (SvROK(msg) && SvTYPE(SvRV(msg)) == SVt_PV) {[m
[31m-        msg = SvRV(msg);[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) SvPV(msg, len);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, e, "perl: %s", p);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6a8894c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1077 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_perl_module.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    PerlInterpreter   *perl;[m
[31m-    HV                *nginx;[m
[31m-    ngx_array_t       *modules;[m
[31m-    ngx_array_t       *requires;[m
[31m-} ngx_http_perl_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    SV                *sub;[m
[31m-    ngx_str_t          handler;[m
[31m-} ngx_http_perl_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    SV                *sub;[m
[31m-    ngx_str_t          handler;[m
[31m-} ngx_http_perl_variable_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-static ngx_int_t ngx_http_perl_ssi(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ssi_ctx, ngx_str_t **params);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_perl_init_interpreter(ngx_conf_t *cf,[m
[31m-    ngx_http_perl_main_conf_t *pmcf);[m
[31m-static PerlInterpreter *ngx_http_perl_create_interpreter(ngx_conf_t *cf,[m
[31m-    ngx_http_perl_main_conf_t *pmcf);[m
[31m-static ngx_int_t ngx_http_perl_run_requires(pTHX_ ngx_array_t *requires,[m
[31m-    ngx_log_t *log);[m
[31m-static ngx_int_t ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r,[m
[31m-    HV *nginx, SV *sub, SV **args, ngx_str_t *handler, ngx_str_t *rv);[m
[31m-static void ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv);[m
[31m-[m
[31m-static ngx_int_t ngx_http_perl_preconfiguration(ngx_conf_t *cf);[m
[31m-static void *ngx_http_perl_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_perl_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_perl_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_perl_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_perl(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-static void ngx_http_perl_cleanup_perl(void *data);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_perl_init_worker(ngx_cycle_t *cycle);[m
[31m-static void ngx_http_perl_exit(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_perl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("perl_modules"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_perl_main_conf_t, modules),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("perl_require"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_perl_main_conf_t, requires),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("perl"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_perl,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("perl_set"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_perl_set,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_perl_module_ctx = {[m
[31m-    ngx_http_perl_preconfiguration,        /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_perl_create_main_conf,        /* create main configuration */[m
[31m-    ngx_http_perl_init_main_conf,          /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_perl_create_loc_conf,         /* create location configuration */[m
[31m-    ngx_http_perl_merge_loc_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_perl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_perl_module_ctx,             /* module context */[m
[31m-    ngx_http_perl_commands,                /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    ngx_http_perl_init_worker,             /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    ngx_http_perl_exit,                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-[m
[31m-#define NGX_HTTP_PERL_SSI_SUB  0[m
[31m-#define NGX_HTTP_PERL_SSI_ARG  1[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_perl_ssi_params[] = {[m
[31m-    { ngx_string("sub"), NGX_HTTP_PERL_SSI_SUB, 1, 0 },[m
[31m-    { ngx_string("arg"), NGX_HTTP_PERL_SSI_ARG, 0, 1 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_ssi_command_t  ngx_http_perl_ssi_command = {[m
[31m-    ngx_string("perl"), ngx_http_perl_ssi, ngx_http_perl_ssi_params, 0, 0, 1[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_str_t         ngx_null_name = ngx_null_string;[m
[31m-static HV               *nginx_stash;[m
[31m-[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-static ngx_uint_t        ngx_perl_term;[m
[31m-#else[m
[31m-static PerlInterpreter  *perl;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_perl_xs_init(pTHX)[m
[31m-{[m
[31m-    newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);[m
[31m-[m
[31m-    nginx_stash = gv_stashpv("nginx", TRUE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    ngx_http_perl_handle_request(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_perl_handle_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    SV                         *sub;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_str_t                   uri, args, *handler;[m
[31m-    ngx_http_perl_ctx_t        *ctx;[m
[31m-    ngx_http_perl_loc_conf_t   *plcf;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "perl handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-    if (ctx->next == NULL) {[m
[31m-        plcf = ngx_http_get_module_loc_conf(r, ngx_http_perl_module);[m
[31m-        sub = plcf->sub;[m
[31m-        handler = &plcf->handler;[m
[31m-[m
[31m-    } else {[m
[31m-        sub = ctx->next;[m
[31m-        handler = &ngx_null_name;[m
[31m-        ctx->next = NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, sub, NULL, handler,[m
[31m-                                    NULL);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl handler done: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc > 600) {[m
[31m-        rc = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->redirect_uri.len) {[m
[31m-        uri = ctx->redirect_uri;[m
[31m-        args = ctx->redirect_args;[m
[31m-[m
[31m-    } else {[m
[31m-        uri.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx->filename.data = NULL;[m
[31m-    ctx->redirect_uri.len = 0;[m
[31m-[m
[31m-    if (ctx->done || ctx->next) {[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (uri.len) {[m
[31m-        ngx_http_internal_redirect(r, &uri, &args);[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_HTTP_OK) {[m
[31m-        ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-        ctx->done = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_perl_sleep_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl sleep handler");[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        wev->timedout = 0;[m
[31m-        ngx_http_perl_handle_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_perl_variable_t *pv = (ngx_http_perl_variable_t *) data;[m
[31m-[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_str_t                   value;[m
[31m-    ngx_http_perl_ctx_t        *ctx;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl variable handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);[m
[31m-[m
[31m-    value.data = NULL;[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, pv->sub, NULL,[m
[31m-                                    &pv->handler, &value);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    if (value.data) {[m
[31m-        v->len = value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = value.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->filename.data = NULL;[m
[31m-    ctx->redirect_uri.len = 0;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl variable done");[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_ssi(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ssi_ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    SV                         *sv, **asv;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_str_t                  *handler, **args;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_perl_ctx_t        *ctx;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl ssi handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);[m
[31m-[m
[31m-    ctx->ssi = ssi_ctx;[m
[31m-[m
[31m-    handler = params[NGX_HTTP_PERL_SSI_SUB];[m
[31m-    handler->data[handler->len] = '\0';[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-    /* the code is disabled to force the precompiled perl code using only */[m
[31m-[m
[31m-    ngx_http_perl_eval_anon_sub(aTHX_ handler, &sv);[m
[31m-[m
[31m-    if (sv == &PL_sv_undef) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "eval_pv(\"%V\") failed", handler);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sv == NULL) {[m
[31m-        sv = newSVpvn((char *) handler->data, handler->len);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    sv = newSVpvn((char *) handler->data, handler->len);[m
[31m-[m
[31m-    args = &params[NGX_HTTP_PERL_SSI_ARG];[m
[31m-[m
[31m-    if (args) {[m
[31m-[m
[31m-        for (i = 0; args[i]; i++) { /* void */ }[m
[31m-[m
[31m-        asv = ngx_pcalloc(r->pool, (i + 1) * sizeof(SV *));[m
[31m-[m
[31m-        if (asv == NULL) {[m
[31m-            SvREFCNT_dec(sv);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        asv[0] = (SV *) (uintptr_t) i;[m
[31m-[m
[31m-        for (i = 0; args[i]; i++) {[m
[31m-            asv[i + 1] = newSVpvn((char *) args[i]->data, args[i]->len);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        asv = NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, sv, asv, handler,[m
[31m-                                    NULL);[m
[31m-[m
[31m-    SvREFCNT_dec(sv);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    ctx->filename.data = NULL;[m
[31m-    ctx->redirect_uri.len = 0;[m
[31m-    ctx->ssi = NULL;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "perl ssi done");[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl_init_interpreter(ngx_conf_t *cf, ngx_http_perl_main_conf_t *pmcf)[m
[31m-{[m
[31m-    ngx_str_t           *m;[m
[31m-    ngx_uint_t           i;[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#ifdef NGX_PERL_MODULES[m
[31m-    if (pmcf->modules == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        pmcf->modules = ngx_array_create(cf->pool, 1, sizeof(ngx_str_t));[m
[31m-        if (pmcf->modules == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        m = ngx_array_push(pmcf->modules);[m
[31m-        if (m == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_str_set(m, NGX_PERL_MODULES);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (pmcf->modules != NGX_CONF_UNSET_PTR) {[m
[31m-        m = pmcf->modules->elts;[m
[31m-        for (i = 0; i < pmcf->modules->nelts; i++) {[m
[31m-            if (ngx_conf_full_name(cf->cycle, &m[i], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-[m
[31m-    if (perl) {[m
[31m-[m
[31m-        if (ngx_set_environment(cf->cycle, NULL) == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_perl_run_requires(aTHX_ pmcf->requires, cf->log)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pmcf->perl = perl;[m
[31m-        pmcf->nginx = nginx_stash;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (nginx_stash == NULL) {[m
[31m-        PERL_SYS_INIT(&ngx_argc, &ngx_argv);[m
[31m-    }[m
[31m-[m
[31m-    pmcf->perl = ngx_http_perl_create_interpreter(cf, pmcf);[m
[31m-[m
[31m-    if (pmcf->perl == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pmcf->nginx = nginx_stash;[m
[31m-[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-[m
[31m-    cln->handler = ngx_http_perl_cleanup_perl;[m
[31m-    cln->data = pmcf->perl;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    perl = pmcf->perl;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static PerlInterpreter *[m
[31m-ngx_http_perl_create_interpreter(ngx_conf_t *cf,[m
[31m-    ngx_http_perl_main_conf_t *pmcf)[m
[31m-{[m
[31m-    int                n;[m
[31m-    STRLEN             len;[m
[31m-    SV                *sv;[m
[31m-    char              *ver, **embedding;[m
[31m-    ngx_str_t         *m;[m
[31m-    ngx_uint_t         i;[m
[31m-    PerlInterpreter   *perl;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0, "create perl interpreter");[m
[31m-[m
[31m-    if (ngx_set_environment(cf->cycle, NULL) == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    perl = perl_alloc();[m
[31m-    if (perl == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, 0, "perl_alloc() failed");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(perl);[m
[31m-    PERL_SET_CONTEXT(perl);[m
[31m-[m
[31m-    perl_construct(perl);[m
[31m-[m
[31m-#ifdef PERL_EXIT_DESTRUCT_END[m
[31m-    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;[m
[31m-#endif[m
[31m-[m
[31m-    n = (pmcf->modules != NGX_CONF_UNSET_PTR) ? pmcf->modules->nelts * 2 : 0;[m
[31m-[m
[31m-    embedding = ngx_palloc(cf->pool, (5 + n) * sizeof(char *));[m
[31m-    if (embedding == NULL) {[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    embedding[0] = "";[m
[31m-[m
[31m-    if (n++) {[m
[31m-        m = pmcf->modules->elts;[m
[31m-        for (i = 0; i < pmcf->modules->nelts; i++) {[m
[31m-            embedding[2 * i + 1] = "-I";[m
[31m-            embedding[2 * i + 2] = (char *) m[i].data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    embedding[n++] = "-Mnginx";[m
[31m-    embedding[n++] = "-e";[m
[31m-    embedding[n++] = "0";[m
[31m-    embedding[n] = NULL;[m
[31m-[m
[31m-    n = perl_parse(perl, ngx_http_perl_xs_init, n, embedding, NULL);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, 0, "perl_parse() failed: %d", n);[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    sv = get_sv("nginx::VERSION", FALSE);[m
[31m-    ver = SvPV(sv, len);[m
[31m-[m
[31m-    if (ngx_strcmp(ver, NGINX_VERSION) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, 0,[m
[31m-                      "version " NGINX_VERSION " of nginx.pm is required, "[m
[31m-                      "but %s was found", ver);[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_perl_run_requires(aTHX_ pmcf->requires, cf->log) != NGX_OK) {[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return perl;[m
[31m-[m
[31m-fail:[m
[31m-[m
[31m-    (void) perl_destruct(perl);[m
[31m-[m
[31m-    perl_free(perl);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_run_requires(pTHX_ ngx_array_t *requires, ngx_log_t *log)[m
[31m-{[m
[31m-    u_char      *err;[m
[31m-    STRLEN       len;[m
[31m-    ngx_str_t   *script;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (requires == NGX_CONF_UNSET_PTR) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    script = requires->elts;[m
[31m-    for (i = 0; i < requires->nelts; i++) {[m
[31m-[m
[31m-        require_pv((char *) script[i].data);[m
[31m-[m
[31m-        if (SvTRUE(ERRSV)) {[m
[31m-[m
[31m-            err = (u_char *) SvPV(ERRSV, len);[m
[31m-            while (--len && (err[len] == CR || err[len] == LF)) { /* void */ }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, 0,[m
[31m-                          "require_pv(\"%s\") failed: \"%*s\"",[m
[31m-                          script[i].data, len + 1, err);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r, HV *nginx, SV *sub,[m
[31m-    SV **args, ngx_str_t *handler, ngx_str_t *rv)[m
[31m-{[m
[31m-    SV                *sv;[m
[31m-    int                n, status;[m
[31m-    char              *line;[m
[31m-    u_char            *err;[m
[31m-    STRLEN             len, n_a;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    dSP;[m
[31m-[m
[31m-    status = 0;[m
[31m-[m
[31m-    ENTER;[m
[31m-    SAVETMPS;[m
[31m-[m
[31m-    PUSHMARK(sp);[m
[31m-[m
[31m-    sv = sv_2mortal(sv_bless(newRV_noinc(newSViv(PTR2IV(r))), nginx));[m
[31m-    XPUSHs(sv);[m
[31m-[m
[31m-    if (args) {[m
[31m-        EXTEND(sp, (intptr_t) args[0]);[m
[31m-[m
[31m-        for (i = 1; i <= (uintptr_t) args[0]; i++) {[m
[31m-            PUSHs(sv_2mortal(args[i]));[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    PUTBACK;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    n = call_sv(sub, G_EVAL);[m
[31m-[m
[31m-    SPAGAIN;[m
[31m-[m
[31m-    if (n) {[m
[31m-        if (rv == NULL) {[m
[31m-            status = POPi;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "call_sv: %d", status);[m
[31m-[m
[31m-        } else {[m
[31m-            line = SvPVx(POPs, n_a);[m
[31m-            rv->len = n_a;[m
[31m-[m
[31m-            rv->data = ngx_pnalloc(r->pool, n_a);[m
[31m-            if (rv->data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(rv->data, line, n_a);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    PUTBACK;[m
[31m-[m
[31m-    FREETMPS;[m
[31m-    LEAVE;[m
[31m-[m
[31m-    /* check $@ */[m
[31m-[m
[31m-    if (SvTRUE(ERRSV)) {[m
[31m-[m
[31m-        err = (u_char *) SvPV(ERRSV, len);[m
[31m-        while (--len && (err[len] == CR || err[len] == LF)) { /* void */ }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "call_sv(\"%V\") failed: \"%*s\"", handler, len + 1, err);[m
[31m-[m
[31m-        if (rv) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n != 1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "call_sv(\"%V\") returned %d results", handler, n);[m
[31m-        status = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rv) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return (ngx_int_t) status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    for (p = handler->data; *p; p++) {[m
[31m-        if (*p != ' ' && *p != '\t' && *p != CR && *p != LF) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncmp(p, "sub ", 4) == 0[m
[31m-        || ngx_strncmp(p, "sub{", 4) == 0[m
[31m-        || ngx_strncmp(p, "use ", 4) == 0)[m
[31m-    {[m
[31m-        *sv = eval_pv((char *) p, FALSE);[m
[31m-[m
[31m-        /* eval_pv() does not set ERRSV on failure */[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *sv = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_perl_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    pmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_perl_main_conf_t));[m
[31m-    if (pmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    pmcf->modules = NGX_CONF_UNSET_PTR;[m
[31m-    pmcf->requires = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return pmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_perl_main_conf_t *pmcf = conf;[m
[31m-[m
[31m-    if (pmcf->perl == NULL) {[m
[31m-        if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_perl_cleanup_perl(void *data)[m
[31m-{[m
[31m-    PerlInterpreter  *perl = data;[m
[31m-[m
[31m-    PERL_SET_CONTEXT(perl);[m
[31m-[m
[31m-    (void) perl_destruct(perl);[m
[31m-[m
[31m-    perl_free(perl);[m
[31m-[m
[31m-    if (ngx_perl_term) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, "perl term");[m
[31m-[m
[31m-        PERL_SYS_TERM();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_ssi_main_conf_t  *smcf;[m
[31m-[m
[31m-    smcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    rc = ngx_hash_add_key(&smcf->commands, &ngx_http_perl_ssi_command.name,[m
[31m-                          &ngx_http_perl_ssi_command, NGX_HASH_READONLY_KEY);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "conflicting SSI command \"%V\"",[m
[31m-                               &ngx_http_perl_ssi_command.name);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_perl_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_perl_loc_conf_t *plcf;[m
[31m-[m
[31m-    plcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_perl_loc_conf_t));[m
[31m-    if (plcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     plcf->handler = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    return plcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_perl_loc_conf_t *prev = parent;[m
[31m-    ngx_http_perl_loc_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->sub == NULL) {[m
[31m-        conf->sub = prev->sub;[m
[31m-        conf->handler = prev->handler;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_perl_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->handler.data) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate perl handler \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_perl_module);[m
[31m-[m
[31m-    if (pmcf->perl == NULL) {[m
[31m-        if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    plcf->handler = value[1];[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-    ngx_http_perl_eval_anon_sub(aTHX_ &value[1], &plcf->sub);[m
[31m-[m
[31m-    if (plcf->sub == &PL_sv_undef) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "eval_pv(\"%V\") failed", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->sub == NULL) {[m
[31m-        plcf->sub = newSVpvn((char *) value[1].data, value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_perl_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_int_t                   index;[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_perl_variable_t   *pv;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value[1].len--;[m
[31m-    value[1].data++;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pv = ngx_palloc(cf->pool, sizeof(ngx_http_perl_variable_t));[m
[31m-    if (pv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, &value[1]);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_perl_module);[m
[31m-[m
[31m-    if (pmcf->perl == NULL) {[m
[31m-        if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pv->handler = value[2];[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-    ngx_http_perl_eval_anon_sub(aTHX_ &value[2], &pv->sub);[m
[31m-[m
[31m-    if (pv->sub == &PL_sv_undef) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "eval_pv(\"%V\") failed", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pv->sub == NULL) {[m
[31m-        pv->sub = newSVpvn((char *) value[2].data, value[2].len);[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    v->get_handler = ngx_http_perl_variable;[m
[31m-    v->data = (uintptr_t) pv;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_init_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    pmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_perl_module);[m
[31m-[m
[31m-    if (pmcf) {[m
[31m-        dTHXa(pmcf->perl);[m
[31m-        PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-        /* set worker's $$ */[m
[31m-[m
[31m-        sv_setiv(GvSV(gv_fetchpv("$", TRUE, SVt_PV)), (I32) ngx_pid);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_perl_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-[m
[31m-    /*[m
[31m-     * the master exit hook is run before global pool cleanup,[m
[31m-     * therefore just set flag here[m
[31m-     */[m
[31m-[m
[31m-    ngx_perl_term = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (nginx_stash) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cycle->log, 0, "perl term");[m
[31m-[m
[31m-        (void) perl_destruct(perl);[m
[31m-[m
[31m-        perl_free(perl);[m
[31m-[m
[31m-        PERL_SYS_TERM();[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.h[m
[1mdeleted file mode 100644[m
[1mindex 5e60b03..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_PERL_MODULE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_PERL_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-#include <EXTERN.h>[m
[31m-#include <perl.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_http_request_t   *nginx;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 filename;[m
[31m-    ngx_str_t                 redirect_uri;[m
[31m-    ngx_str_t                 redirect_args;[m
[31m-[m
[31m-    SV                       *next;[m
[31m-[m
[31m-    ngx_uint_t                done;       /* unsigned  done:1; */[m
[31m-[m
[31m-    ngx_array_t              *variables;  /* array of ngx_http_perl_var_t */[m
[31m-[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-    ngx_http_ssi_ctx_t       *ssi;[m
[31m-#endif[m
[31m-} ngx_http_perl_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t    hash;[m
[31m-    ngx_str_t     name;[m
[31m-    ngx_str_t     value;[m
[31m-} ngx_http_perl_var_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_perl_module;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * workaround for "unused variable `Perl___notused'" warning[m
[31m- * when building with perl 5.6.1[m
[31m- */[m
[31m-#ifndef PERL_IMPLICIT_CONTEXT[m
[31m-#undef  dTHXa[m
[31m-#define dTHXa(a)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern void boot_DynaLoader(pTHX_ CV* cv);[m
[31m-[m
[31m-[m
[31m-void ngx_http_perl_handle_request(ngx_http_request_t *r);[m
[31m-void ngx_http_perl_sleep_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_PERL_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/typemap b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/typemap[m
[1mdeleted file mode 100644[m
[1mindex e2f1a4c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/modules/perl/typemap[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-TYPEMAP[m
[31m-[m
[31m-nginx	T_PTROBJ[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http.c[m
[1mdeleted file mode 100644[m
[1mindex 986f717..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http.c[m
[1m+++ /dev/null[m
[36m@@ -1,2133 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_http_init_phases(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf);[m
[31m-static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf);[m
[31m-static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf,[m
[31m-    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,[m
[31m-    ngx_http_listen_opt_t *lsopt);[m
[31m-static ngx_int_t ngx_http_add_address(ngx_conf_t *cf,[m
[31m-    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,[m
[31m-    ngx_http_listen_opt_t *lsopt);[m
[31m-static ngx_int_t ngx_http_add_server(ngx_conf_t *cf,[m
[31m-    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr);[m
[31m-[m
[31m-static char *ngx_http_merge_servers(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf, ngx_http_module_t *module,[m
[31m-    ngx_uint_t ctx_index);[m
[31m-static char *ngx_http_merge_locations(ngx_conf_t *cf,[m
[31m-    ngx_queue_t *locations, void **loc_conf, ngx_http_module_t *module,[m
[31m-    ngx_uint_t ctx_index);[m
[31m-static ngx_int_t ngx_http_init_locations(ngx_conf_t *cf,[m
[31m-    ngx_http_core_srv_conf_t *cscf, ngx_http_core_loc_conf_t *pclcf);[m
[31m-static ngx_int_t ngx_http_init_static_location_trees(ngx_conf_t *cf,[m
[31m-    ngx_http_core_loc_conf_t *pclcf);[m
[31m-static ngx_int_t ngx_http_cmp_locations(const ngx_queue_t *one,[m
[31m-    const ngx_queue_t *two);[m
[31m-static ngx_int_t ngx_http_join_exact_locations(ngx_conf_t *cf,[m
[31m-    ngx_queue_t *locations);[m
[31m-static void ngx_http_create_locations_list(ngx_queue_t *locations,[m
[31m-    ngx_queue_t *q);[m
[31m-static ngx_http_location_tree_node_t *[m
[31m-    ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,[m
[31m-    size_t prefix);[m
[31m-[m
[31m-static ngx_int_t ngx_http_optimize_servers(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf, ngx_array_t *ports);[m
[31m-static ngx_int_t ngx_http_server_names(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf, ngx_http_conf_addr_t *addr);[m
[31m-static ngx_int_t ngx_http_cmp_conf_addrs(const void *one, const void *two);[m
[31m-static int ngx_libc_cdecl ngx_http_cmp_dns_wildcards(const void *one,[m
[31m-    const void *two);[m
[31m-[m
[31m-static ngx_int_t ngx_http_init_listening(ngx_conf_t *cf,[m
[31m-    ngx_http_conf_port_t *port);[m
[31m-static ngx_listening_t *ngx_http_add_listening(ngx_conf_t *cf,[m
[31m-    ngx_http_conf_addr_t *addr);[m
[31m-static ngx_int_t ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,[m
[31m-    ngx_http_conf_addr_t *addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,[m
[31m-    ngx_http_conf_addr_t *addr);[m
[31m-#endif[m
[31m-[m
[31m-ngx_uint_t   ngx_http_max_module;[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt  ngx_http_top_header_filter;[m
[31m-ngx_http_output_body_filter_pt    ngx_http_top_body_filter;[m
[31m-ngx_http_request_body_filter_pt   ngx_http_top_request_body_filter;[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_html_default_types[] = {[m
[31m-    ngx_string("text/html"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_commands[] = {[m
[31m-[m
[31m-    { ngx_string("http"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_block,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_http_module_ctx = {[m
[31m-    ngx_string("http"),[m
[31m-    NULL,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_module_ctx,                  /* module context */[m
[31m-    ngx_http_commands,                     /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    ngx_uint_t                   mi, m, s;[m
[31m-    ngx_conf_t                   pcf;[m
[31m-    ngx_http_module_t           *module;[m
[31m-    ngx_http_conf_ctx_t         *ctx;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_core_srv_conf_t   **cscfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    if (*(ngx_http_conf_ctx_t **) conf) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* the main http context */[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(ngx_http_conf_ctx_t **) conf = ctx;[m
[31m-[m
[31m-[m
[31m-    /* count the number of the http modules and set up their indices */[m
[31m-[m
[31m-    ngx_http_max_module = ngx_count_modules(cf->cycle, NGX_HTTP_MODULE);[m
[31m-[m
[31m-[m
[31m-    /* the http main_conf context, it is the same in the all http contexts */[m
[31m-[m
[31m-    ctx->main_conf = ngx_pcalloc(cf->pool,[m
[31m-                                 sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->main_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * the http null srv_conf context, it is used to merge[m
[31m-     * the server{}s' srv_conf's[m
[31m-     */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * the http null loc_conf context, it is used to merge[m
[31m-     * the server{}s' loc_conf's[m
[31m-     */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * create the main_conf's, the null srv_conf's, and the null loc_conf's[m
[31m-     * of the all http modules[m
[31m-     */[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        if (module->create_main_conf) {[m
[31m-            ctx->main_conf[mi] = module->create_main_conf(cf);[m
[31m-            if (ctx->main_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            ctx->srv_conf[mi] = module->create_srv_conf(cf);[m
[31m-            if (ctx->srv_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            ctx->loc_conf[mi] = module->create_loc_conf(cf);[m
[31m-            if (ctx->loc_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->preconfiguration) {[m
[31m-            if (module->preconfiguration(cf) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* parse inside the http{} block */[m
[31m-[m
[31m-    cf->module_type = NGX_HTTP_MODULE;[m
[31m-    cf->cmd_type = NGX_HTTP_MAIN_CONF;[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * init http{} main_conf's, merge the server{}s' srv_conf's[m
[31m-     * and its location{}s' loc_conf's[m
[31m-     */[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        /* init http{} main_conf's */[m
[31m-[m
[31m-        if (module->init_main_conf) {[m
[31m-            rv = module->init_main_conf(cf, ctx->main_conf[mi]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rv = ngx_http_merge_servers(cf, cmcf, module, mi);[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* create location trees */[m
[31m-[m
[31m-    for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-        clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-        if (ngx_http_init_locations(cf, cscfp[s], clcf) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_http_init_phases(cf, cmcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_init_headers_in_hash(cf, cmcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->postconfiguration) {[m
[31m-[m
[31m-            ngx_http_probe_module_post_config(ngx_modules[m]);[m
[31m-[m
[31m-            if (module->postconfiguration(cf) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_variables_init_vars(cf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * http{}'s cf->ctx was needed while the configuration merging[m
[31m-     * and in postconfiguration process[m
[31m-     */[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-[m
[31m-    if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* optimize the lists of ports, addresses and server names */[m
[31m-[m
[31m-    if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)[m
[31m-{[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers,[m
[31m-                       cf->pool, 2, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers,[m
[31m-                       cf->pool, 4, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_headers_in_hash(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)[m
[31m-{[m
[31m-    ngx_array_t         headers_in;[m
[31m-    ngx_hash_key_t     *hk;[m
[31m-    ngx_hash_init_t     hash;[m
[31m-    ngx_http_header_t  *header;[m
[31m-[m
[31m-    if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (header = ngx_http_headers_in; header->name.len; header++) {[m
[31m-        hk = ngx_array_push(&headers_in);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = header->name;[m
[31m-        hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);[m
[31m-        hk->value = header;[m
[31m-    }[m
[31m-[m
[31m-    hash.hash = &cmcf->headers_in_hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "headers_in_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)[m
[31m-{[m
[31m-    ngx_int_t                   j;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_uint_t                  find_config_index, use_rewrite, use_access;[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_phase_handler_t   *ph;[m
[31m-    ngx_http_phase_handler_pt   checker;[m
[31m-[m
[31m-    cmcf->phase_engine.server_rewrite_index = (ngx_uint_t) -1;[m
[31m-    cmcf->phase_engine.location_rewrite_index = (ngx_uint_t) -1;[m
[31m-    find_config_index = 0;[m
[31m-    use_rewrite = cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers.nelts ? 1 : 0;[m
[31m-    use_access = cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers.nelts ? 1 : 0;[m
[31m-[m
[31m-    n = use_rewrite + use_access + cmcf->try_files + 1 /* find config phase */;[m
[31m-[m
[31m-    for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {[m
[31m-        n += cmcf->phases[i].handlers.nelts;[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_pcalloc(cf->pool,[m
[31m-                     n * sizeof(ngx_http_phase_handler_t) + sizeof(void *));[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->phase_engine.handlers = ph;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {[m
[31m-        h = cmcf->phases[i].handlers.elts;[m
[31m-[m
[31m-        switch (i) {[m
[31m-[m
[31m-        case NGX_HTTP_SERVER_REWRITE_PHASE:[m
[31m-            if (cmcf->phase_engine.server_rewrite_index == (ngx_uint_t) -1) {[m
[31m-                cmcf->phase_engine.server_rewrite_index = n;[m
[31m-            }[m
[31m-            checker = ngx_http_core_rewrite_phase;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_FIND_CONFIG_PHASE:[m
[31m-            find_config_index = n;[m
[31m-[m
[31m-            ph->checker = ngx_http_core_find_config_phase;[m
[31m-            n++;[m
[31m-            ph++;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case NGX_HTTP_REWRITE_PHASE:[m
[31m-            if (cmcf->phase_engine.location_rewrite_index == (ngx_uint_t) -1) {[m
[31m-                cmcf->phase_engine.location_rewrite_index = n;[m
[31m-            }[m
[31m-            checker = ngx_http_core_rewrite_phase;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST_REWRITE_PHASE:[m
[31m-            if (use_rewrite) {[m
[31m-                ph->checker = ngx_http_core_post_rewrite_phase;[m
[31m-                ph->next = find_config_index;[m
[31m-                n++;[m
[31m-                ph++;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case NGX_HTTP_ACCESS_PHASE:[m
[31m-            checker = ngx_http_core_access_phase;[m
[31m-            n++;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST_ACCESS_PHASE:[m
[31m-            if (use_access) {[m
[31m-                ph->checker = ngx_http_core_post_access_phase;[m
[31m-                ph->next = n;[m
[31m-                ph++;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case NGX_HTTP_TRY_FILES_PHASE:[m
[31m-            if (cmcf->try_files) {[m
[31m-                ph->checker = ngx_http_core_try_files_phase;[m
[31m-                n++;[m
[31m-                ph++;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case NGX_HTTP_CONTENT_PHASE:[m
[31m-            checker = ngx_http_core_content_phase;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            checker = ngx_http_core_generic_phase;[m
[31m-        }[m
[31m-[m
[31m-        n += cmcf->phases[i].handlers.nelts;[m
[31m-[m
[31m-        for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--) {[m
[31m-            ph->checker = checker;[m
[31m-            ph->handler = h[j];[m
[31m-            ph->next = n;[m
[31m-            ph++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_merge_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,[m
[31m-    ngx_http_module_t *module, ngx_uint_t ctx_index)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    ngx_uint_t                   s;[m
[31m-    ngx_http_conf_ctx_t         *ctx, saved;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_core_srv_conf_t   **cscfp;[m
[31m-[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-    ctx = (ngx_http_conf_ctx_t *) cf->ctx;[m
[31m-    saved = *ctx;[m
[31m-    rv = NGX_CONF_OK;[m
[31m-[m
[31m-    for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-        /* merge the server{}s' srv_conf's */[m
[31m-[m
[31m-        ctx->srv_conf = cscfp[s]->ctx->srv_conf;[m
[31m-[m
[31m-        if (module->merge_srv_conf) {[m
[31m-            rv = module->merge_srv_conf(cf, saved.srv_conf[ctx_index],[m
[31m-                                        cscfp[s]->ctx->srv_conf[ctx_index]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->merge_loc_conf) {[m
[31m-[m
[31m-            /* merge the server{}'s loc_conf */[m
[31m-[m
[31m-            ctx->loc_conf = cscfp[s]->ctx->loc_conf;[m
[31m-[m
[31m-            rv = module->merge_loc_conf(cf, saved.loc_conf[ctx_index],[m
[31m-                                        cscfp[s]->ctx->loc_conf[ctx_index]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            /* merge the locations{}' loc_conf's */[m
[31m-[m
[31m-            clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-            rv = ngx_http_merge_locations(cf, clcf->locations,[m
[31m-                                          cscfp[s]->ctx->loc_conf,[m
[31m-                                          module, ctx_index);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    *ctx = saved;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,[m
[31m-    void **loc_conf, ngx_http_module_t *module, ngx_uint_t ctx_index)[m
[31m-{[m
[31m-    char                       *rv;[m
[31m-    ngx_queue_t                *q;[m
[31m-    ngx_http_conf_ctx_t        *ctx, saved;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_location_queue_t  *lq;[m
[31m-[m
[31m-    if (locations == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = (ngx_http_conf_ctx_t *) cf->ctx;[m
[31m-    saved = *ctx;[m
[31m-[m
[31m-    for (q = ngx_queue_head(locations);[m
[31m-         q != ngx_queue_sentinel(locations);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-        clcf = lq->exact ? lq->exact : lq->inclusive;[m
[31m-        ctx->loc_conf = clcf->loc_conf;[m
[31m-[m
[31m-        rv = module->merge_loc_conf(cf, loc_conf[ctx_index],[m
[31m-                                    clcf->loc_conf[ctx_index]);[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-[m
[31m-        rv = ngx_http_merge_locations(cf, clcf->locations, clcf->loc_conf,[m
[31m-                                      module, ctx_index);[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *ctx = saved;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_locations(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_core_loc_conf_t *pclcf)[m
[31m-{[m
[31m-    ngx_uint_t                   n;[m
[31m-    ngx_queue_t                 *q, *locations, *named, tail;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_location_queue_t   *lq;[m
[31m-    ngx_http_core_loc_conf_t   **clcfp;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                   r;[m
[31m-    ngx_queue_t                 *regex;[m
[31m-#endif[m
[31m-[m
[31m-    locations = pclcf->locations;[m
[31m-[m
[31m-    if (locations == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_sort(locations, ngx_http_cmp_locations);[m
[31m-[m
[31m-    named = NULL;[m
[31m-    n = 0;[m
[31m-#if (NGX_PCRE)[m
[31m-    regex = NULL;[m
[31m-    r = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (q = ngx_queue_head(locations);[m
[31m-         q != ngx_queue_sentinel(locations);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-        clcf = lq->exact ? lq->exact : lq->inclusive;[m
[31m-[m
[31m-        if (ngx_http_init_locations(cf, NULL, clcf) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-        if (clcf->regex) {[m
[31m-            r++;[m
[31m-[m
[31m-            if (regex == NULL) {[m
[31m-                regex = q;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (clcf->named) {[m
[31m-            n++;[m
[31m-[m
[31m-            if (named == NULL) {[m
[31m-                named = q;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->noname) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (q != ngx_queue_sentinel(locations)) {[m
[31m-        ngx_queue_split(locations, q, &tail);[m
[31m-    }[m
[31m-[m
[31m-    if (named) {[m
[31m-        clcfp = ngx_palloc(cf->pool,[m
[31m-                           (n + 1) * sizeof(ngx_http_core_loc_conf_t *));[m
[31m-        if (clcfp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cscf->named_locations = clcfp;[m
[31m-[m
[31m-        for (q = named;[m
[31m-             q != ngx_queue_sentinel(locations);[m
[31m-             q = ngx_queue_next(q))[m
[31m-        {[m
[31m-            lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-            *(clcfp++) = lq->exact;[m
[31m-        }[m
[31m-[m
[31m-        *clcfp = NULL;[m
[31m-[m
[31m-        ngx_queue_split(locations, named, &tail);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (regex) {[m
[31m-[m
[31m-        clcfp = ngx_palloc(cf->pool,[m
[31m-                           (r + 1) * sizeof(ngx_http_core_loc_conf_t *));[m
[31m-        if (clcfp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pclcf->regex_locations = clcfp;[m
[31m-[m
[31m-        for (q = regex;[m
[31m-             q != ngx_queue_sentinel(locations);[m
[31m-             q = ngx_queue_next(q))[m
[31m-        {[m
[31m-            lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-            *(clcfp++) = lq->exact;[m
[31m-        }[m
[31m-[m
[31m-        *clcfp = NULL;[m
[31m-[m
[31m-        ngx_queue_split(locations, regex, &tail);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_static_location_trees(ngx_conf_t *cf,[m
[31m-    ngx_http_core_loc_conf_t *pclcf)[m
[31m-{[m
[31m-    ngx_queue_t                *q, *locations;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_location_queue_t  *lq;[m
[31m-[m
[31m-    locations = pclcf->locations;[m
[31m-[m
[31m-    if (locations == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_queue_empty(locations)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (q = ngx_queue_head(locations);[m
[31m-         q != ngx_queue_sentinel(locations);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-        clcf = lq->exact ? lq->exact : lq->inclusive;[m
[31m-[m
[31m-        if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_join_exact_locations(cf, locations) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_create_locations_list(locations, ngx_queue_head(locations));[m
[31m-[m
[31m-    pclcf->static_locations = ngx_http_create_locations_tree(cf, locations, 0);[m
[31m-    if (pclcf->static_locations == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,[m
[31m-    ngx_http_core_loc_conf_t *clcf)[m
[31m-{[m
[31m-    ngx_http_location_queue_t  *lq;[m
[31m-[m
[31m-    if (*locations == NULL) {[m
[31m-        *locations = ngx_palloc(cf->temp_pool,[m
[31m-                                sizeof(ngx_http_location_queue_t));[m
[31m-        if (*locations == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_init(*locations);[m
[31m-    }[m
[31m-[m
[31m-    lq = ngx_palloc(cf->temp_pool, sizeof(ngx_http_location_queue_t));[m
[31m-    if (lq == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->exact_match[m
[31m-#if (NGX_PCRE)[m
[31m-        || clcf->regex[m
[31m-#endif[m
[31m-        || clcf->named || clcf->noname)[m
[31m-    {[m
[31m-        lq->exact = clcf;[m
[31m-        lq->inclusive = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        lq->exact = NULL;[m
[31m-        lq->inclusive = clcf;[m
[31m-    }[m
[31m-[m
[31m-    lq->name = &clcf->name;[m
[31m-    lq->file_name = cf->conf_file->file.name.data;[m
[31m-    lq->line = cf->conf_file->line;[m
[31m-[m
[31m-    ngx_queue_init(&lq->list);[m
[31m-[m
[31m-    ngx_queue_insert_tail(*locations, &lq->queue);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_cmp_locations(const ngx_queue_t *one, const ngx_queue_t *two)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_core_loc_conf_t   *first, *second;[m
[31m-    ngx_http_location_queue_t  *lq1, *lq2;[m
[31m-[m
[31m-    lq1 = (ngx_http_location_queue_t *) one;[m
[31m-    lq2 = (ngx_http_location_queue_t *) two;[m
[31m-[m
[31m-    first = lq1->exact ? lq1->exact : lq1->inclusive;[m
[31m-    second = lq2->exact ? lq2->exact : lq2->inclusive;[m
[31m-[m
[31m-    if (first->noname && !second->noname) {[m
[31m-        /* shift no named locations to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->noname && second->noname) {[m
[31m-        /* shift no named locations to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->noname || second->noname) {[m
[31m-        /* do not sort no named locations */[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (first->named && !second->named) {[m
[31m-        /* shift named locations to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->named && second->named) {[m
[31m-        /* shift named locations to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->named && second->named) {[m
[31m-        return ngx_strcmp(first->name.data, second->name.data);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (first->regex && !second->regex) {[m
[31m-        /* shift the regex matches to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->regex && second->regex) {[m
[31m-        /* shift the regex matches to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->regex || second->regex) {[m
[31m-        /* do not sort the regex matches */[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_filename_cmp(first->name.data, second->name.data,[m
[31m-                          ngx_min(first->name.len, second->name.len) + 1);[m
[31m-[m
[31m-    if (rc == 0 && !first->exact_match && second->exact_match) {[m
[31m-        /* an exact match must be before the same inclusive one */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_join_exact_locations(ngx_conf_t *cf, ngx_queue_t *locations)[m
[31m-{[m
[31m-    ngx_queue_t                *q, *x;[m
[31m-    ngx_http_location_queue_t  *lq, *lx;[m
[31m-[m
[31m-    q = ngx_queue_head(locations);[m
[31m-[m
[31m-    while (q != ngx_queue_last(locations)) {[m
[31m-[m
[31m-        x = ngx_queue_next(q);[m
[31m-[m
[31m-        lq = (ngx_http_location_queue_t *) q;[m
[31m-        lx = (ngx_http_location_queue_t *) x;[m
[31m-[m
[31m-        if (lq->name->len == lx->name->len[m
[31m-            && ngx_filename_cmp(lq->name->data, lx->name->data, lx->name->len)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            if ((lq->exact && lx->exact) || (lq->inclusive && lx->inclusive)) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                              "duplicate location \"%V\" in %s:%ui",[m
[31m-                              lx->name, lx->file_name, lx->line);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            lq->inclusive = lx->inclusive;[m
[31m-[m
[31m-            ngx_queue_remove(x);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_next(q);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_create_locations_list(ngx_queue_t *locations, ngx_queue_t *q)[m
[31m-{[m
[31m-    u_char                     *name;[m
[31m-    size_t                      len;[m
[31m-    ngx_queue_t                *x, tail;[m
[31m-    ngx_http_location_queue_t  *lq, *lx;[m
[31m-[m
[31m-    if (q == ngx_queue_last(locations)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-    if (lq->inclusive == NULL) {[m
[31m-        ngx_http_create_locations_list(locations, ngx_queue_next(q));[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    len = lq->name->len;[m
[31m-    name = lq->name->data;[m
[31m-[m
[31m-    for (x = ngx_queue_next(q);[m
[31m-         x != ngx_queue_sentinel(locations);[m
[31m-         x = ngx_queue_next(x))[m
[31m-    {[m
[31m-        lx = (ngx_http_location_queue_t *) x;[m
[31m-[m
[31m-        if (len > lx->name->len[m
[31m-            || ngx_filename_cmp(name, lx->name->data, len) != 0)[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    q = ngx_queue_next(q);[m
[31m-[m
[31m-    if (q == x) {[m
[31m-        ngx_http_create_locations_list(locations, x);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_split(locations, q, &tail);[m
[31m-    ngx_queue_add(&lq->list, &tail);[m
[31m-[m
[31m-    if (x == ngx_queue_sentinel(locations)) {[m
[31m-        ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_split(&lq->list, x, &tail);[m
[31m-    ngx_queue_add(locations, &tail);[m
[31m-[m
[31m-    ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));[m
[31m-[m
[31m-    ngx_http_create_locations_list(locations, x);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * to keep cache locality for left leaf nodes, allocate nodes in following[m
[31m- * order: node, left subtree, right subtree, inclusive subtree[m
[31m- */[m
[31m-[m
[31m-static ngx_http_location_tree_node_t *[m
[31m-ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,[m
[31m-    size_t prefix)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_queue_t                    *q, tail;[m
[31m-    ngx_http_location_queue_t      *lq;[m
[31m-    ngx_http_location_tree_node_t  *node;[m
[31m-[m
[31m-    q = ngx_queue_middle(locations);[m
[31m-[m
[31m-    lq = (ngx_http_location_queue_t *) q;[m
[31m-    len = lq->name->len - prefix;[m
[31m-[m
[31m-    node = ngx_palloc(cf->pool,[m
[31m-                      offsetof(ngx_http_location_tree_node_t, name) + len);[m
[31m-    if (node == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    node->left = NULL;[m
[31m-    node->right = NULL;[m
[31m-    node->tree = NULL;[m
[31m-    node->exact = lq->exact;[m
[31m-    node->inclusive = lq->inclusive;[m
[31m-[m
[31m-    node->auto_redirect = (u_char) ((lq->exact && lq->exact->auto_redirect)[m
[31m-                           || (lq->inclusive && lq->inclusive->auto_redirect));[m
[31m-[m
[31m-    node->len = (u_char) len;[m
[31m-    ngx_memcpy(node->name, &lq->name->data[prefix], len);[m
[31m-[m
[31m-    ngx_queue_split(locations, q, &tail);[m
[31m-[m
[31m-    if (ngx_queue_empty(locations)) {[m
[31m-        /*[m
[31m-         * ngx_queue_split() insures that if left part is empty,[m
[31m-         * then right one is empty too[m
[31m-         */[m
[31m-        goto inclusive;[m
[31m-    }[m
[31m-[m
[31m-    node->left = ngx_http_create_locations_tree(cf, locations, prefix);[m
[31m-    if (node->left == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(q);[m
[31m-[m
[31m-    if (ngx_queue_empty(&tail)) {[m
[31m-        goto inclusive;[m
[31m-    }[m
[31m-[m
[31m-    node->right = ngx_http_create_locations_tree(cf, &tail, prefix);[m
[31m-    if (node->right == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-inclusive:[m
[31m-[m
[31m-    if (ngx_queue_empty(&lq->list)) {[m
[31m-        return node;[m
[31m-    }[m
[31m-[m
[31m-    node->tree = ngx_http_create_locations_tree(cf, &lq->list, prefix + len);[m
[31m-    if (node->tree == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return node;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_listen_opt_t *lsopt)[m
[31m-{[m
[31m-    in_port_t                   p;[m
[31m-    ngx_uint_t                  i;[m
[31m-    struct sockaddr            *sa;[m
[31m-    struct sockaddr_in         *sin;[m
[31m-    ngx_http_conf_port_t       *port;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6        *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (cmcf->ports == NULL) {[m
[31m-        cmcf->ports = ngx_array_create(cf->temp_pool, 2,[m
[31m-                                       sizeof(ngx_http_conf_port_t));[m
[31m-        if (cmcf->ports == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sa = &lsopt->u.sockaddr;[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = &lsopt->u.sockaddr_in6;[m
[31m-        p = sin6->sin6_port;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        p = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = &lsopt->u.sockaddr_in;[m
[31m-        p = sin->sin_port;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    port = cmcf->ports->elts;[m
[31m-    for (i = 0; i < cmcf->ports->nelts; i++) {[m
[31m-[m
[31m-        if (p != port[i].port || sa->sa_family != port[i].family) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* a port is already in the port list */[m
[31m-[m
[31m-        return ngx_http_add_addresses(cf, cscf, &port[i], lsopt);[m
[31m-    }[m
[31m-[m
[31m-    /* add a port to the port list */[m
[31m-[m
[31m-    port = ngx_array_push(cmcf->ports);[m
[31m-    if (port == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    port->family = sa->sa_family;[m
[31m-    port->port = p;[m
[31m-    port->addrs.elts = NULL;[m
[31m-[m
[31m-    return ngx_http_add_address(cf, cscf, port, lsopt);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    size_t                 len, off;[m
[31m-    ngx_uint_t             i, default_server, proxy_protocol;[m
[31m-    struct sockaddr       *sa;[m
[31m-    ngx_http_conf_addr_t  *addr;[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    struct sockaddr_un    *saun;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_uint_t             ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    ngx_uint_t             http2;[m
[31m-#endif[m
[31m-[m
[31m-    /*[m
[31m-     * we cannot compare whole sockaddr struct's as kernel[m
[31m-     * may fill some fields in inherited sockaddr struct's[m
[31m-     */[m
[31m-[m
[31m-    sa = &lsopt->u.sockaddr;[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        off = offsetof(struct sockaddr_in6, sin6_addr);[m
[31m-        len = 16;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        off = offsetof(struct sockaddr_un, sun_path);[m
[31m-        len = sizeof(saun->sun_path);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        off = offsetof(struct sockaddr_in, sin_addr);[m
[31m-        len = 4;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    p = lsopt->u.sockaddr_data + off;[m
[31m-[m
[31m-    addr = port->addrs.elts;[m
[31m-[m
[31m-    for (i = 0; i < port->addrs.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_memcmp(p, addr[i].opt.u.sockaddr_data + off, len) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* the address is already in the address list */[m
[31m-[m
[31m-        if (ngx_http_add_server(cf, cscf, &addr[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* preserve default_server bit during listen options overwriting */[m
[31m-        default_server = addr[i].opt.default_server;[m
[31m-[m
[31m-        proxy_protocol = lsopt->proxy_protocol || addr[i].opt.proxy_protocol;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        ssl = lsopt->ssl || addr[i].opt.ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-        http2 = lsopt->http2 || addr[i].opt.http2;[m
[31m-#endif[m
[31m-[m
[31m-        if (lsopt->set) {[m
[31m-[m
[31m-            if (addr[i].opt.set) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "duplicate listen options for %s", addr[i].opt.addr);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            addr[i].opt = *lsopt;[m
[31m-        }[m
[31m-[m
[31m-        /* check the duplicate "default" server for this address:port */[m
[31m-[m
[31m-        if (lsopt->default_server) {[m
[31m-[m
[31m-            if (default_server) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "a duplicate default server for %s", addr[i].opt.addr);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            default_server = 1;[m
[31m-            addr[i].default_server = cscf;[m
[31m-        }[m
[31m-[m
[31m-        addr[i].opt.default_server = default_server;[m
[31m-        addr[i].opt.proxy_protocol = proxy_protocol;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        addr[i].opt.ssl = ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-        addr[i].opt.http2 = http2;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* add the address to the addresses list that bound to this port */[m
[31m-[m
[31m-    return ngx_http_add_address(cf, cscf, port, lsopt);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * add the server address, the server names and the server core module[m
[31m- * configurations to the port list[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_address(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)[m
[31m-{[m
[31m-    ngx_http_conf_addr_t  *addr;[m
[31m-[m
[31m-    if (port->addrs.elts == NULL) {[m
[31m-        if (ngx_array_init(&port->addrs, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_conf_addr_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2 && NGX_HTTP_SSL                                              \[m
[31m-     && !defined TLSEXT_TYPE_application_layer_protocol_negotiation           \[m
[31m-     && !defined TLSEXT_TYPE_next_proto_neg)[m
[31m-[m
[31m-    if (lsopt->http2 && lsopt->ssl) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "nginx was built with OpenSSL that lacks ALPN "[m
[31m-                           "and NPN support, HTTP/2 is not enabled for %s",[m
[31m-                           lsopt->addr);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    addr = ngx_array_push(&port->addrs);[m
[31m-    if (addr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addr->opt = *lsopt;[m
[31m-    addr->hash.buckets = NULL;[m
[31m-    addr->hash.size = 0;[m
[31m-    addr->wc_head = NULL;[m
[31m-    addr->wc_tail = NULL;[m
[31m-#if (NGX_PCRE)[m
[31m-    addr->nregex = 0;[m
[31m-    addr->regex = NULL;[m
[31m-#endif[m
[31m-    addr->default_server = cscf;[m
[31m-    addr->servers.elts = NULL;[m
[31m-[m
[31m-    return ngx_http_add_server(cf, cscf, addr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* add the server core module configuration to the address:port */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_server(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_core_srv_conf_t  **server;[m
[31m-[m
[31m-    if (addr->servers.elts == NULL) {[m
[31m-        if (ngx_array_init(&addr->servers, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_core_srv_conf_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        server = addr->servers.elts;[m
[31m-        for (i = 0; i < addr->servers.nelts; i++) {[m
[31m-            if (server[i] == cscf) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "a duplicate listen %s", addr->opt.addr);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    server = ngx_array_push(&addr->servers);[m
[31m-    if (server == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *server = cscf;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_optimize_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,[m
[31m-    ngx_array_t *ports)[m
[31m-{[m
[31m-    ngx_uint_t             p, a;[m
[31m-    ngx_http_conf_port_t  *port;[m
[31m-    ngx_http_conf_addr_t  *addr;[m
[31m-[m
[31m-    if (ports == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (p = 0; p < ports->nelts; p++) {[m
[31m-[m
[31m-        ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,[m
[31m-                 sizeof(ngx_http_conf_addr_t), ngx_http_cmp_conf_addrs);[m
[31m-[m
[31m-        /*[m
[31m-         * check whether all name-based servers have the same[m
[31m-         * configuration as a default server for given address:port[m
[31m-         */[m
[31m-[m
[31m-        addr = port[p].addrs.elts;[m
[31m-        for (a = 0; a < port[p].addrs.nelts; a++) {[m
[31m-[m
[31m-            if (addr[a].servers.nelts > 1[m
[31m-#if (NGX_PCRE)[m
[31m-                || addr[a].default_server->captures[m
[31m-#endif[m
[31m-               )[m
[31m-            {[m
[31m-                if (ngx_http_server_names(cf, cmcf, &addr[a]) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_init_listening(cf, &port[p]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_server_names(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,[m
[31m-    ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  n, s;[m
[31m-    ngx_hash_init_t             hash;[m
[31m-    ngx_hash_keys_arrays_t      ha;[m
[31m-    ngx_http_server_name_t     *name;[m
[31m-    ngx_http_core_srv_conf_t  **cscfp;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                  regex, i;[m
[31m-[m
[31m-    regex = 0;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t));[m
[31m-[m
[31m-    ha.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);[m
[31m-    if (ha.temp_pool == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ha.pool = cf->pool;[m
[31m-[m
[31m-    if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cscfp = addr->servers.elts;[m
[31m-[m
[31m-    for (s = 0; s < addr->servers.nelts; s++) {[m
[31m-[m
[31m-        name = cscfp[s]->server_names.elts;[m
[31m-[m
[31m-        for (n = 0; n < cscfp[s]->server_names.nelts; n++) {[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            if (name[n].regex) {[m
[31m-                regex++;[m
[31m-                continue;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server,[m
[31m-                                  NGX_HASH_WILDCARD_KEY);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                              "invalid server name or wildcard \"%V\" on %s",[m
[31m-                              &name[n].name, addr->opt.addr);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_BUSY) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                              "conflicting server name \"%V\" on %s, ignored",[m
[31m-                              &name[n].name, addr->opt.addr);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = cmcf->server_names_hash_max_size;[m
[31m-    hash.bucket_size = cmcf->server_names_hash_bucket_size;[m
[31m-    hash.name = "server_names_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-[m
[31m-    if (ha.keys.nelts) {[m
[31m-        hash.hash = &addr->hash;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ha.dns_wc_head.nelts) {[m
[31m-[m
[31m-        ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts,[m
[31m-                  sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = ha.temp_pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts,[m
[31m-                                   ha.dns_wc_head.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        addr->wc_head = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-    if (ha.dns_wc_tail.nelts) {[m
[31m-[m
[31m-        ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts,[m
[31m-                  sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = ha.temp_pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts,[m
[31m-                                   ha.dns_wc_tail.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        addr->wc_tail = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(ha.temp_pool);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (regex == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    addr->nregex = regex;[m
[31m-    addr->regex = ngx_palloc(cf->pool, regex * sizeof(ngx_http_server_name_t));[m
[31m-    if (addr->regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    for (s = 0; s < addr->servers.nelts; s++) {[m
[31m-[m
[31m-        name = cscfp[s]->server_names.elts;[m
[31m-[m
[31m-        for (n = 0; n < cscfp[s]->server_names.nelts; n++) {[m
[31m-            if (name[n].regex) {[m
[31m-                addr->regex[i++] = name[n];[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_destroy_pool(ha.temp_pool);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_cmp_conf_addrs(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_http_conf_addr_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_http_conf_addr_t *) one;[m
[31m-    second = (ngx_http_conf_addr_t *) two;[m
[31m-[m
[31m-    if (first->opt.wildcard) {[m
[31m-        /* a wildcard address must be the last resort, shift it to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (second->opt.wildcard) {[m
[31m-        /* a wildcard address must be the last resort, shift it to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->opt.bind && !second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->opt.bind && second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* do not sort by default */[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_cmp_dns_wildcards(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_hash_key_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_hash_key_t *) one;[m
[31m-    second = (ngx_hash_key_t *) two;[m
[31m-[m
[31m-    return ngx_dns_strcmp(first->key.data, second->key.data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_port_t *port)[m
[31m-{[m
[31m-    ngx_uint_t                 i, last, bind_wildcard;[m
[31m-    ngx_listening_t           *ls;[m
[31m-    ngx_http_port_t           *hport;[m
[31m-    ngx_http_conf_addr_t      *addr;[m
[31m-[m
[31m-    addr = port->addrs.elts;[m
[31m-    last = port->addrs.nelts;[m
[31m-[m
[31m-    /*[m
[31m-     * If there is a binding to an "*:port" then we need to bind() to[m
[31m-     * the "*:port" only and ignore other implicit bindings.  The bindings[m
[31m-     * have been already sorted: explicit bindings are on the start, then[m
[31m-     * implicit bindings go, and wildcard binding is in the end.[m
[31m-     */[m
[31m-[m
[31m-    if (addr[last - 1].opt.wildcard) {[m
[31m-        addr[last - 1].opt.bind = 1;[m
[31m-        bind_wildcard = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        bind_wildcard = 0;[m
[31m-    }[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    while (i < last) {[m
[31m-[m
[31m-        if (bind_wildcard && !addr[i].opt.bind) {[m
[31m-            i++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ls = ngx_http_add_listening(cf, &addr[i]);[m
[31m-        if (ls == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hport = ngx_pcalloc(cf->pool, sizeof(ngx_http_port_t));[m
[31m-        if (hport == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ls->servers = hport;[m
[31m-[m
[31m-        hport->naddrs = i + 1;[m
[31m-[m
[31m-        switch (ls->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            if (ngx_http_add_addrs6(cf, hport, addr) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-#endif[m
[31m-        default: /* AF_INET */[m
[31m-            if (ngx_http_add_addrs(cf, hport, addr) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_clone_listening(cf, ls) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        addr++;[m
[31m-        last--;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_listening_t *[m
[31m-ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_listening_t           *ls;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ls = ngx_create_listening(cf, &addr->opt.u.sockaddr, addr->opt.socklen);[m
[31m-    if (ls == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ls->addr_ntop = 1;[m
[31m-[m
[31m-    ls->handler = ngx_http_init_connection;[m
[31m-[m
[31m-    cscf = addr->default_server;[m
[31m-    ls->pool_size = cscf->connection_pool_size;[m
[31m-    ls->post_accept_timeout = cscf->client_header_timeout;[m
[31m-[m
[31m-    clcf = cscf->ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    ls->logp = clcf->error_log;[m
[31m-    ls->log.data = &ls->addr_text;[m
[31m-    ls->log.handler = ngx_accept_log_error;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    {[m
[31m-    ngx_iocp_conf_t  *iocpcf = NULL;[m
[31m-[m
[31m-    if (ngx_get_conf(cf->cycle->conf_ctx, ngx_events_module)) {[m
[31m-        iocpcf = ngx_event_get_conf(cf->cycle->conf_ctx, ngx_iocp_module);[m
[31m-    }[m
[31m-    if (iocpcf && iocpcf->acceptex_read) {[m
[31m-        ls->post_accept_buffer_size = cscf->client_header_buffer_size;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ls->backlog = addr->opt.backlog;[m
[31m-    ls->rcvbuf = addr->opt.rcvbuf;[m
[31m-    ls->sndbuf = addr->opt.sndbuf;[m
[31m-[m
[31m-    ls->keepalive = addr->opt.so_keepalive;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    ls->keepidle = addr->opt.tcp_keepidle;[m
[31m-    ls->keepintvl = addr->opt.tcp_keepintvl;[m
[31m-    ls->keepcnt = addr->opt.tcp_keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-    ls->accept_filter = addr->opt.accept_filter;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-    ls->deferred_accept = addr->opt.deferred_accept;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    ls->ipv6only = addr->opt.ipv6only;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    ls->setfib = addr->opt.setfib;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    ls->fastopen = addr->opt.fastopen;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    ls->reuseport = addr->opt.reuseport;[m
[31m-#endif[m
[31m-[m
[31m-    return ls;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,[m
[31m-    ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_in_addr_t        *addrs;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-    ngx_http_virtual_names_t  *vn;[m
[31m-[m
[31m-    hport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                               hport->naddrs * sizeof(ngx_http_in_addr_t));[m
[31m-    if (hport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs = hport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < hport->naddrs; i++) {[m
[31m-[m
[31m-        sin = &addr[i].opt.u.sockaddr_in;[m
[31m-        addrs[i].addr = sin->sin_addr.s_addr;[m
[31m-        addrs[i].conf.default_server = addr[i].default_server;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        addrs[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-        addrs[i].conf.http2 = addr[i].opt.http2;[m
[31m-#endif[m
[31m-        addrs[i].conf.proxy_protocol = addr[i].opt.proxy_protocol;[m
[31m-[m
[31m-        if (addr[i].hash.buckets == NULL[m
[31m-            && (addr[i].wc_head == NULL[m
[31m-                || addr[i].wc_head->hash.buckets == NULL)[m
[31m-            && (addr[i].wc_tail == NULL[m
[31m-                || addr[i].wc_tail->hash.buckets == NULL)[m
[31m-#if (NGX_PCRE)[m
[31m-            && addr[i].nregex == 0[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t));[m
[31m-        if (vn == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        addrs[i].conf.virtual_names = vn;[m
[31m-[m
[31m-        vn->names.hash = addr[i].hash;[m
[31m-        vn->names.wc_head = addr[i].wc_head;[m
[31m-        vn->names.wc_tail = addr[i].wc_tail;[m
[31m-#if (NGX_PCRE)[m
[31m-        vn->nregex = addr[i].nregex;[m
[31m-        vn->regex = addr[i].regex;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,[m
[31m-    ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_in6_addr_t       *addrs6;[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-    ngx_http_virtual_names_t  *vn;[m
[31m-[m
[31m-    hport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                               hport->naddrs * sizeof(ngx_http_in6_addr_t));[m
[31m-    if (hport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs6 = hport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < hport->naddrs; i++) {[m
[31m-[m
[31m-        sin6 = &addr[i].opt.u.sockaddr_in6;[m
[31m-        addrs6[i].addr6 = sin6->sin6_addr;[m
[31m-        addrs6[i].conf.default_server = addr[i].default_server;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        addrs6[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-        addrs6[i].conf.http2 = addr[i].opt.http2;[m
[31m-#endif[m
[31m-        addrs6[i].conf.proxy_protocol = addr[i].opt.proxy_protocol;[m
[31m-[m
[31m-        if (addr[i].hash.buckets == NULL[m
[31m-            && (addr[i].wc_head == NULL[m
[31m-                || addr[i].wc_head->hash.buckets == NULL)[m
[31m-            && (addr[i].wc_tail == NULL[m
[31m-                || addr[i].wc_tail->hash.buckets == NULL)[m
[31m-#if (NGX_PCRE)[m
[31m-            && addr[i].nregex == 0[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t));[m
[31m-        if (vn == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        addrs6[i].conf.virtual_names = vn;[m
[31m-[m
[31m-        vn->names.hash = addr[i].hash;[m
[31m-        vn->names.wc_head = addr[i].wc_head;[m
[31m-        vn->names.wc_tail = addr[i].wc_tail;[m
[31m-#if (NGX_PCRE)[m
[31m-        vn->nregex = addr[i].nregex;[m
[31m-        vn->regex = addr[i].regex;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_types_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_array_t     **types;[m
[31m-    ngx_str_t        *value, *default_type;[m
[31m-    ngx_uint_t        i, n, hash;[m
[31m-    ngx_hash_key_t   *type;[m
[31m-[m
[31m-    types = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*types == (void *) -1) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    default_type = cmd->post;[m
[31m-[m
[31m-    if (*types == NULL) {[m
[31m-        *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t));[m
[31m-        if (*types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (default_type) {[m
[31m-            type = ngx_array_push(*types);[m
[31m-            if (type == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            type->key = *default_type;[m
[31m-            type->key_hash = ngx_hash_key(default_type->data,[m
[31m-                                          default_type->len);[m
[31m-            type->value = (void *) 4;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (value[i].len == 1 && value[i].data[0] == '*') {[m
[31m-            *types = (void *) -1;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len);[m
[31m-        value[i].data[value[i].len] = '\0';[m
[31m-[m
[31m-        type = (*types)->elts;[m
[31m-        for (n = 0; n < (*types)->nelts; n++) {[m
[31m-[m
[31m-            if (ngx_strcmp(value[i].data, type[n].key.data) == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                                   "duplicate MIME type \"%V\"", &value[i]);[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        type = ngx_array_push(*types);[m
[31m-        if (type == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        type->key = value[i];[m
[31m-        type->key_hash = hash;[m
[31m-        type->value = (void *) 4;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_merge_types(ngx_conf_t *cf, ngx_array_t **keys, ngx_hash_t *types_hash,[m
[31m-    ngx_array_t **prev_keys, ngx_hash_t *prev_types_hash,[m
[31m-    ngx_str_t *default_types)[m
[31m-{[m
[31m-    ngx_hash_init_t  hash;[m
[31m-[m
[31m-    if (*keys) {[m
[31m-[m
[31m-        if (*keys == (void *) -1) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        hash.hash = types_hash;[m
[31m-        hash.key = NULL;[m
[31m-        hash.max_size = 2048;[m
[31m-        hash.bucket_size = 64;[m
[31m-        hash.name = "test_types_hash";[m
[31m-        hash.pool = cf->pool;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, (*keys)->elts, (*keys)->nelts) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (prev_types_hash->buckets == NULL) {[m
[31m-[m
[31m-        if (*prev_keys == NULL) {[m
[31m-[m
[31m-            if (ngx_http_set_default_types(cf, prev_keys, default_types)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else if (*prev_keys == (void *) -1) {[m
[31m-            *keys = *prev_keys;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        hash.hash = prev_types_hash;[m
[31m-        hash.key = NULL;[m
[31m-        hash.max_size = 2048;[m
[31m-        hash.bucket_size = 64;[m
[31m-        hash.name = "test_types_hash";[m
[31m-        hash.pool = cf->pool;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, (*prev_keys)->elts, (*prev_keys)->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *types_hash = *prev_types_hash;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_default_types(ngx_conf_t *cf, ngx_array_t **types,[m
[31m-    ngx_str_t *default_type)[m
[31m-{[m
[31m-    ngx_hash_key_t  *type;[m
[31m-[m
[31m-    *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t));[m
[31m-    if (*types == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (default_type->len) {[m
[31m-[m
[31m-        type = ngx_array_push(*types);[m
[31m-        if (type == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        type->key = *default_type;[m
[31m-        type->key_hash = ngx_hash_key(default_type->data,[m
[31m-                                      default_type->len);[m
[31m-        type->value = (void *) 4;[m
[31m-[m
[31m-        default_type++;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http.h[m
[1mdeleted file mode 100644[m
[1mindex 19cb680..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http.h[m
[1m+++ /dev/null[m
[36m@@ -1,179 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_H_INCLUDED_[m
[31m-#define _NGX_HTTP_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_request_s     ngx_http_request_t;[m
[31m-typedef struct ngx_http_upstream_s    ngx_http_upstream_t;[m
[31m-typedef struct ngx_http_cache_s       ngx_http_cache_t;[m
[31m-typedef struct ngx_http_file_cache_s  ngx_http_file_cache_t;[m
[31m-typedef struct ngx_http_log_ctx_s     ngx_http_log_ctx_t;[m
[31m-typedef struct ngx_http_chunked_s     ngx_http_chunked_t;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-typedef struct ngx_http_v2_stream_s   ngx_http_v2_stream_t;[m
[31m-#endif[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_header_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-typedef u_char *(*ngx_http_log_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_request_t *sr, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-#include <ngx_http_variables.h>[m
[31m-#include <ngx_http_config.h>[m
[31m-#include <ngx_http_request.h>[m
[31m-#include <ngx_http_script.h>[m
[31m-#include <ngx_http_upstream.h>[m
[31m-#include <ngx_http_upstream_round_robin.h>[m
[31m-#include <ngx_http_core_module.h>[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-#include <ngx_http_v2.h>[m
[31m-#endif[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-#include <ngx_http_cache.h>[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-#include <ngx_http_ssi_filter_module.h>[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-#include <ngx_http_ssl_module.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-struct ngx_http_log_ctx_s {[m
[31m-    ngx_connection_t    *connection;[m
[31m-    ngx_http_request_t  *request;[m
[31m-    ngx_http_request_t  *current_request;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_chunked_s {[m
[31m-    ngx_uint_t           state;[m
[31m-    off_t                size;[m
[31m-    off_t                length;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t           http_version;[m
[31m-    ngx_uint_t           code;[m
[31m-    ngx_uint_t           count;[m
[31m-    u_char              *start;[m
[31m-    u_char              *end;[m
[31m-} ngx_http_status_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_http_get_module_ctx(r, module)  (r)->ctx[module.ctx_index][m
[31m-#define ngx_http_set_ctx(r, c, module)      r->ctx[module.ctx_index] = c;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,[m
[31m-    ngx_http_core_loc_conf_t *clcf);[m
[31m-ngx_int_t ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_listen_opt_t *lsopt);[m
[31m-[m
[31m-[m
[31m-void ngx_http_init_connection(ngx_connection_t *c);[m
[31m-void ngx_http_close_connection(ngx_connection_t *c);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-int ngx_http_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg);[m
[31m-#endif[m
[31m-[m
[31m-ngx_int_t ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b);[m
[31m-ngx_int_t ngx_http_parse_uri(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_parse_complex_uri(ngx_http_request_t *r,[m
[31m-    ngx_uint_t merge_slashes);[m
[31m-ngx_int_t ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_status_t *status);[m
[31m-ngx_int_t ngx_http_parse_unsafe_uri(ngx_http_request_t *r, ngx_str_t *uri,[m
[31m-    ngx_str_t *args, ngx_uint_t *flags);[m
[31m-ngx_int_t ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_uint_t allow_underscores);[m
[31m-ngx_int_t ngx_http_parse_multi_header_lines(ngx_array_t *headers,[m
[31m-    ngx_str_t *name, ngx_str_t *value);[m
[31m-ngx_int_t ngx_http_parse_set_cookie_lines(ngx_array_t *headers,[m
[31m-    ngx_str_t *name, ngx_str_t *value);[m
[31m-ngx_int_t ngx_http_arg(ngx_http_request_t *r, u_char *name, size_t len,[m
[31m-    ngx_str_t *value);[m
[31m-void ngx_http_split_args(ngx_http_request_t *r, ngx_str_t *uri,[m
[31m-    ngx_str_t *args);[m
[31m-ngx_int_t ngx_http_parse_chunked(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_chunked_t *ctx);[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *ngx_http_create_request(ngx_connection_t *c);[m
[31m-ngx_int_t ngx_http_process_request_uri(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_process_request_header(ngx_http_request_t *r);[m
[31m-void ngx_http_process_request(ngx_http_request_t *r);[m
[31m-void ngx_http_update_location_config(ngx_http_request_t *r);[m
[31m-void ngx_http_handler(ngx_http_request_t *r);[m
[31m-void ngx_http_run_posted_requests(ngx_connection_t *c);[m
[31m-ngx_int_t ngx_http_post_request(ngx_http_request_t *r,[m
[31m-    ngx_http_posted_request_t *pr);[m
[31m-void ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-void ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-[m
[31m-void ngx_http_empty_handler(ngx_event_t *wev);[m
[31m-void ngx_http_request_empty_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LAST   1[m
[31m-#define NGX_HTTP_FLUSH  2[m
[31m-[m
[31m-ngx_int_t ngx_http_send_special(ngx_http_request_t *r, ngx_uint_t flags);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_read_client_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler);[m
[31m-ngx_int_t ngx_http_read_unbuffered_request_body(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_send_header(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_special_response_handler(ngx_http_request_t *r,[m
[31m-    ngx_int_t error);[m
[31m-ngx_int_t ngx_http_filter_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_module_t *m, ngx_int_t error);[m
[31m-void ngx_http_clean_header(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_discard_request_body(ngx_http_request_t *r);[m
[31m-void ngx_http_discarded_request_body_handler(ngx_http_request_t *r);[m
[31m-void ngx_http_block_reading(ngx_http_request_t *r);[m
[31m-void ngx_http_test_reading(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-char *ngx_http_types_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_merge_types(ngx_conf_t *cf, ngx_array_t **keys,[m
[31m-    ngx_hash_t *types_hash, ngx_array_t **prev_keys,[m
[31m-    ngx_hash_t *prev_types_hash, ngx_str_t *default_types);[m
[31m-ngx_int_t ngx_http_set_default_types(ngx_conf_t *cf, ngx_array_t **types,[m
[31m-    ngx_str_t *default_type);[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-ngx_uint_t  ngx_http_degraded(ngx_http_request_t *);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_module;[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_html_default_types[];[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt  ngx_http_top_header_filter;[m
[31m-extern ngx_http_output_body_filter_pt    ngx_http_top_body_filter;[m
[31m-extern ngx_http_request_body_filter_pt   ngx_http_top_request_body_filter;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_cache.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_cache.h[m
[1mdeleted file mode 100644[m
[1mindex 2667cbb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_cache.h[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_CACHE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_CACHE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_CACHE_MISS          1[m
[31m-#define NGX_HTTP_CACHE_BYPASS        2[m
[31m-#define NGX_HTTP_CACHE_EXPIRED       3[m
[31m-#define NGX_HTTP_CACHE_STALE         4[m
[31m-#define NGX_HTTP_CACHE_UPDATING      5[m
[31m-#define NGX_HTTP_CACHE_REVALIDATED   6[m
[31m-#define NGX_HTTP_CACHE_HIT           7[m
[31m-#define NGX_HTTP_CACHE_SCARCE        8[m
[31m-[m
[31m-#define NGX_HTTP_CACHE_KEY_LEN       16[m
[31m-#define NGX_HTTP_CACHE_ETAG_LEN      42[m
[31m-#define NGX_HTTP_CACHE_VARY_LEN      42[m
[31m-[m
[31m-#define NGX_HTTP_CACHE_VERSION       3[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                       status;[m
[31m-    time_t                           valid;[m
[31m-} ngx_http_cache_valid_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_node_t                node;[m
[31m-    ngx_queue_t                      queue;[m
[31m-[m
[31m-    u_char                           key[NGX_HTTP_CACHE_KEY_LEN[m
[31m-                                         - sizeof(ngx_rbtree_key_t)];[m
[31m-[m
[31m-    unsigned                         count:20;[m
[31m-    unsigned                         uses:10;[m
[31m-    unsigned                         valid_msec:10;[m
[31m-    unsigned                         error:10;[m
[31m-    unsigned                         exists:1;[m
[31m-    unsigned                         updating:1;[m
[31m-    unsigned                         deleting:1;[m
[31m-                                     /* 11 unused bits */[m
[31m-[m
[31m-    ngx_file_uniq_t                  uniq;[m
[31m-    time_t                           expire;[m
[31m-    time_t                           valid_sec;[m
[31m-    size_t                           body_start;[m
[31m-    off_t                            fs_size;[m
[31m-    ngx_msec_t                       lock_time;[m
[31m-} ngx_http_file_cache_node_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_cache_s {[m
[31m-    ngx_file_t                       file;[m
[31m-    ngx_array_t                      keys;[m
[31m-    uint32_t                         crc32;[m
[31m-    u_char                           key[NGX_HTTP_CACHE_KEY_LEN];[m
[31m-    u_char                           main[NGX_HTTP_CACHE_KEY_LEN];[m
[31m-[m
[31m-    ngx_file_uniq_t                  uniq;[m
[31m-    time_t                           valid_sec;[m
[31m-    time_t                           last_modified;[m
[31m-    time_t                           date;[m
[31m-[m
[31m-    ngx_str_t                        etag;[m
[31m-    ngx_str_t                        vary;[m
[31m-    u_char                           variant[NGX_HTTP_CACHE_KEY_LEN];[m
[31m-[m
[31m-    size_t                           header_start;[m
[31m-    size_t                           body_start;[m
[31m-    off_t                            length;[m
[31m-    off_t                            fs_size;[m
[31m-[m
[31m-    ngx_uint_t                       min_uses;[m
[31m-    ngx_uint_t                       error;[m
[31m-    ngx_uint_t                       valid_msec;[m
[31m-[m
[31m-    ngx_buf_t                       *buf;[m
[31m-[m
[31m-    ngx_http_file_cache_t           *file_cache;[m
[31m-    ngx_http_file_cache_node_t      *node;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_thread_task_t               *thread_task;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_msec_t                       lock_timeout;[m
[31m-    ngx_msec_t                       lock_age;[m
[31m-    ngx_msec_t                       lock_time;[m
[31m-    ngx_msec_t                       wait_time;[m
[31m-[m
[31m-    ngx_event_t                      wait_event;[m
[31m-[m
[31m-    unsigned                         lock:1;[m
[31m-    unsigned                         waiting:1;[m
[31m-[m
[31m-    unsigned                         updated:1;[m
[31m-    unsigned                         updating:1;[m
[31m-    unsigned                         exists:1;[m
[31m-    unsigned                         temp_file:1;[m
[31m-    unsigned                         reading:1;[m
[31m-    unsigned                         secondary:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                       version;[m
[31m-    time_t                           valid_sec;[m
[31m-    time_t                           last_modified;[m
[31m-    time_t                           date;[m
[31m-    uint32_t                         crc32;[m
[31m-    u_short                          valid_msec;[m
[31m-    u_short                          header_start;[m
[31m-    u_short                          body_start;[m
[31m-    u_char                           etag_len;[m
[31m-    u_char                           etag[NGX_HTTP_CACHE_ETAG_LEN];[m
[31m-    u_char                           vary_len;[m
[31m-    u_char                           vary[NGX_HTTP_CACHE_VARY_LEN];[m
[31m-    u_char                           variant[NGX_HTTP_CACHE_KEY_LEN];[m
[31m-} ngx_http_file_cache_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t                     rbtree;[m
[31m-    ngx_rbtree_node_t                sentinel;[m
[31m-    ngx_queue_t                      queue;[m
[31m-    ngx_atomic_t                     cold;[m
[31m-    ngx_atomic_t                     loading;[m
[31m-    off_t                            size;[m
[31m-    ngx_uint_t                       count;[m
[31m-    ngx_uint_t                       watermark;[m
[31m-} ngx_http_file_cache_sh_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_file_cache_s {[m
[31m-    ngx_http_file_cache_sh_t        *sh;[m
[31m-    ngx_slab_pool_t                 *shpool;[m
[31m-[m
[31m-    ngx_path_t                      *path;[m
[31m-    ngx_path_t                      *temp_path;[m
[31m-[m
[31m-    off_t                            max_size;[m
[31m-    size_t                           bsize;[m
[31m-[m
[31m-    time_t                           inactive;[m
[31m-[m
[31m-    time_t                           fail_time;[m
[31m-[m
[31m-    ngx_uint_t                       files;[m
[31m-    ngx_uint_t                       loader_files;[m
[31m-    ngx_msec_t                       last;[m
[31m-    ngx_msec_t                       loader_sleep;[m
[31m-    ngx_msec_t                       loader_threshold;[m
[31m-[m
[31m-    ngx_shm_zone_t                  *shm_zone;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_file_cache_new(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_file_cache_create(ngx_http_request_t *r);[m
[31m-void ngx_http_file_cache_create_key(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_file_cache_open(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf);[m
[31m-void ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf);[m
[31m-void ngx_http_file_cache_update_header(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_cache_send(ngx_http_request_t *);[m
[31m-void ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf);[m
[31m-time_t ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status);[m
[31m-[m
[31m-char *ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_cache_status[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_config.h[m
[1mdeleted file mode 100644[m
[1mindex 2208c60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_HTTP_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void        **main_conf;[m
[31m-    void        **srv_conf;[m
[31m-    void        **loc_conf;[m
[31m-} ngx_http_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t   (*preconfiguration)(ngx_conf_t *cf);[m
[31m-    ngx_int_t   (*postconfiguration)(ngx_conf_t *cf);[m
[31m-[m
[31m-    void       *(*create_main_conf)(ngx_conf_t *cf);[m
[31m-    char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-    void       *(*create_srv_conf)(ngx_conf_t *cf);[m
[31m-    char       *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);[m
[31m-[m
[31m-    void       *(*create_loc_conf)(ngx_conf_t *cf);[m
[31m-    char       *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);[m
[31m-} ngx_http_module_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MODULE           0x50545448   /* "HTTP" */[m
[31m-[m
[31m-#define NGX_HTTP_MAIN_CONF        0x02000000[m
[31m-#define NGX_HTTP_SRV_CONF         0x04000000[m
[31m-#define NGX_HTTP_LOC_CONF         0x08000000[m
[31m-#define NGX_HTTP_UPS_CONF         0x10000000[m
[31m-#define NGX_HTTP_SIF_CONF         0x20000000[m
[31m-#define NGX_HTTP_LIF_CONF         0x40000000[m
[31m-#define NGX_HTTP_LMT_CONF         0x80000000[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MAIN_CONF_OFFSET  offsetof(ngx_http_conf_ctx_t, main_conf)[m
[31m-#define NGX_HTTP_SRV_CONF_OFFSET   offsetof(ngx_http_conf_ctx_t, srv_conf)[m
[31m-#define NGX_HTTP_LOC_CONF_OFFSET   offsetof(ngx_http_conf_ctx_t, loc_conf)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_get_module_main_conf(r, module)                             \[m
[31m-    (r)->main_conf[module.ctx_index][m
[31m-#define ngx_http_get_module_srv_conf(r, module)  (r)->srv_conf[module.ctx_index][m
[31m-#define ngx_http_get_module_loc_conf(r, module)  (r)->loc_conf[module.ctx_index][m
[31m-[m
[31m-[m
[31m-#define ngx_http_conf_get_module_main_conf(cf, module)                        \[m
[31m-    ((ngx_http_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index][m
[31m-#define ngx_http_conf_get_module_srv_conf(cf, module)                         \[m
[31m-    ((ngx_http_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index][m
[31m-#define ngx_http_conf_get_module_loc_conf(cf, module)                         \[m
[31m-    ((ngx_http_conf_ctx_t *) cf->ctx)->loc_conf[module.ctx_index][m
[31m-[m
[31m-#define ngx_http_cycle_get_module_main_conf(cycle, module)                    \[m
[31m-    (cycle->conf_ctx[ngx_http_module.index] ?                                 \[m
[31m-        ((ngx_http_conf_ctx_t *) cycle->conf_ctx[ngx_http_module.index])      \[m
[31m-            ->main_conf[module.ctx_index]:                                    \[m
[31m-        NULL)[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_copy_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_copy_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex c696fb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_copy_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,352 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_bufs_t  bufs;[m
[31m-} ngx_http_copy_filter_conf_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-static void ngx_http_copy_aio_handler(ngx_output_chain_ctx_t *ctx,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_copy_aio_event_handler(ngx_event_t *ev);[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-static ssize_t ngx_http_copy_aio_sendfile_preload(ngx_buf_t *file);[m
[31m-static void ngx_http_copy_aio_sendfile_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-static ngx_int_t ngx_http_copy_thread_handler(ngx_thread_task_t *task,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_copy_thread_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_http_copy_filter_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_copy_filter_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_copy_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_copy_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("output_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_copy_filter_conf_t, bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_copy_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_copy_filter_init,             /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_copy_filter_create_conf,      /* create location configuration */[m
[31m-    ngx_http_copy_filter_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_copy_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_copy_filter_module_ctx,      /* module context */[m
[31m-    ngx_http_copy_filter_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_connection_t             *c;[m
[31m-    ngx_output_chain_ctx_t       *ctx;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_copy_filter_conf_t  *conf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http copy filter: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_copy_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_output_chain_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_copy_filter_module);[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_copy_filter_module);[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ctx->sendfile = c->sendfile;[m
[31m-        ctx->need_in_memory = r->main_filter_need_in_memory[m
[31m-                              || r->filter_need_in_memory;[m
[31m-        ctx->need_in_temp = r->filter_need_temporary;[m
[31m-[m
[31m-        ctx->alignment = clcf->directio_alignment;[m
[31m-[m
[31m-        ctx->pool = r->pool;[m
[31m-        ctx->bufs = conf->bufs;[m
[31m-        ctx->tag = (ngx_buf_tag_t) &ngx_http_copy_filter_module;[m
[31m-[m
[31m-        ctx->output_filter = (ngx_output_chain_filter_pt)[m
[31m-                                  ngx_http_next_body_filter;[m
[31m-        ctx->filter_ctx = r;[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-        if (ngx_file_aio && clcf->aio == NGX_HTTP_AIO_ON) {[m
[31m-            ctx->aio_handler = ngx_http_copy_aio_handler;[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-            ctx->aio_preload = ngx_http_copy_aio_sendfile_preload;[m
[31m-#endif[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-        if (clcf->aio == NGX_HTTP_AIO_THREADS) {[m
[31m-            ctx->thread_handler = ngx_http_copy_thread_handler;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (in && in->buf && ngx_buf_size(in->buf)) {[m
[31m-            r->request_output = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    ctx->aio = r->aio;[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_output_chain(ctx, in);[m
[31m-[m
[31m-    if (ctx->in == NULL) {[m
[31m-        r->buffered &= ~NGX_HTTP_COPY_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        r->buffered |= NGX_HTTP_COPY_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http copy filter: %i \"%V?%V\"", rc, &r->uri, &r->args);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_copy_aio_handler(ngx_output_chain_ctx_t *ctx, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_http_request_t *r;[m
[31m-[m
[31m-    r = ctx->filter_ctx;[m
[31m-[m
[31m-    file->aio->data = r;[m
[31m-    file->aio->handler = ngx_http_copy_aio_event_handler;[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-    ctx->aio = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_copy_aio_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t     *aio;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-    r = aio->data;[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->connection->write->handler(r->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_copy_aio_sendfile_preload(ngx_buf_t *file)[m
[31m-{[m
[31m-    ssize_t                  n;[m
[31m-    static u_char            buf[1];[m
[31m-    ngx_event_aio_t         *aio;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_output_chain_ctx_t  *ctx;[m
[31m-[m
[31m-    n = ngx_file_aio_read(file->file, buf, 1, file->file_pos, NULL);[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        aio = file->file->aio;[m
[31m-        aio->handler = ngx_http_copy_aio_sendfile_event_handler;[m
[31m-[m
[31m-        r = aio->data;[m
[31m-        r->main->blocked++;[m
[31m-        r->aio = 1;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_copy_filter_module);[m
[31m-        ctx->aio = 1;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_copy_aio_sendfile_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t     *aio;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-    r = aio->data;[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-    ev->complete = 0;[m
[31m-[m
[31m-    r->connection->write->handler(r->connection->write);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_copy_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_thread_pool_t         *tp;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_output_chain_ctx_t    *ctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r = file->thread_ctx;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    tp = clcf->thread_pool;[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "thread pool \"%V\" not found", &name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    task->event.data = r;[m
[31m-    task->event.handler = ngx_http_copy_thread_event_handler;[m
[31m-[m
[31m-    if (ngx_thread_task_post(tp, task) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_copy_filter_module);[m
[31m-    ctx->aio = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_copy_thread_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->connection->write->handler(r->connection->write);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_copy_filter_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_copy_filter_conf_t *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_copy_filter_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->bufs.num = 0;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_copy_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_copy_filter_conf_t *prev = parent;[m
[31m-    ngx_http_copy_filter_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, 2, 32768);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_copy_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_copy_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.c[m
[1mdeleted file mode 100644[m
[1mindex 649ca40..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,5440 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    *name;[m
[31m-    uint32_t   method;[m
[31m-} ngx_http_method_name_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_OFF    0[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_ON     1[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_CLEAN  2[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_core_find_static_location(ngx_http_request_t *r,[m
[31m-    ngx_http_location_tree_node_t *node);[m
[31m-[m
[31m-static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_core_postconfiguration(ngx_conf_t *cf);[m
[31m-static void *ngx_http_core_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_core_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_merge_srv_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static void *ngx_http_core_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static char *ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static ngx_int_t ngx_http_core_regex_location(ngx_conf_t *cf,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *regex, ngx_uint_t caseless);[m
[31m-[m
[31m-static char *ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_core_limit_except(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_set_aio(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_internal(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae);[m
[31m-static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last);[m
[31m-static char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r,[m
[31m-    ngx_addr_t *addr, u_char *xff, size_t xfflen, ngx_array_t *proxies,[m
[31m-    int recursive);[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-static char *ngx_http_disable_symlinks(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_core_pool_size(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_core_lowat_post =[m
[31m-    { ngx_http_core_lowat_check };[m
[31m-[m
[31m-static ngx_conf_post_handler_pt  ngx_http_core_pool_size_p =[m
[31m-    ngx_http_core_pool_size;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_request_body_in_file[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_REQUEST_BODY_FILE_ON },[m
[31m-    { ngx_string("clean"), NGX_HTTP_REQUEST_BODY_FILE_CLEAN },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_satisfy[] = {[m
[31m-    { ngx_string("all"), NGX_HTTP_SATISFY_ALL },[m
[31m-    { ngx_string("any"), NGX_HTTP_SATISFY_ANY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_lingering_close[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_LINGERING_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_LINGERING_ON },[m
[31m-    { ngx_string("always"), NGX_HTTP_LINGERING_ALWAYS },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_if_modified_since[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_IMS_OFF },[m
[31m-    { ngx_string("exact"), NGX_HTTP_IMS_EXACT },[m
[31m-    { ngx_string("before"), NGX_HTTP_IMS_BEFORE },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_core_keepalive_disable[] = {[m
[31m-    { ngx_string("none"), NGX_HTTP_KEEPALIVE_DISABLE_NONE },[m
[31m-    { ngx_string("msie6"), NGX_HTTP_KEEPALIVE_DISABLE_MSIE6 },[m
[31m-    { ngx_string("safari"), NGX_HTTP_KEEPALIVE_DISABLE_SAFARI },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_client_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_CLIENT_TEMP_PATH), { 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_gzip_http_version[] = {[m
[31m-    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },[m
[31m-    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_gzip_proxied_mask[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_GZIP_PROXIED_OFF },[m
[31m-    { ngx_string("expired"), NGX_HTTP_GZIP_PROXIED_EXPIRED },[m
[31m-    { ngx_string("no-cache"), NGX_HTTP_GZIP_PROXIED_NO_CACHE },[m
[31m-    { ngx_string("no-store"), NGX_HTTP_GZIP_PROXIED_NO_STORE },[m
[31m-    { ngx_string("private"), NGX_HTTP_GZIP_PROXIED_PRIVATE },[m
[31m-    { ngx_string("no_last_modified"), NGX_HTTP_GZIP_PROXIED_NO_LM },[m
[31m-    { ngx_string("no_etag"), NGX_HTTP_GZIP_PROXIED_NO_ETAG },[m
[31m-    { ngx_string("auth"), NGX_HTTP_GZIP_PROXIED_AUTH },[m
[31m-    { ngx_string("any"), NGX_HTTP_GZIP_PROXIED_ANY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_gzip_no_cache = ngx_string("no-cache");[m
[31m-static ngx_str_t  ngx_http_gzip_no_store = ngx_string("no-store");[m
[31m-static ngx_str_t  ngx_http_gzip_private = ngx_string("private");[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("variables_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, variables_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("variables_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, variables_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_names_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, server_names_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_names_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, server_names_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_server,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("connection_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, connection_pool_size),[m
[31m-      &ngx_http_core_pool_size_p },[m
[31m-[m
[31m-    { ngx_string("request_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, request_pool_size),[m
[31m-      &ngx_http_core_pool_size_p },[m
[31m-[m
[31m-    { ngx_string("client_header_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, client_header_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_header_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, client_header_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("large_client_header_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, large_client_header_buffers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ignore_invalid_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, ignore_invalid_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("merge_slashes"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, merge_slashes),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("underscores_in_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, underscores_in_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("location"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_location,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("listen"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_listen,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_server_name,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, types_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, types_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                                          |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_types,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("default_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, default_type),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("root"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("alias"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_except"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_limit_except,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_max_body_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_max_body_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_in_file_only"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_in_file_only),[m
[31m-      &ngx_http_core_request_body_in_file },[m
[31m-[m
[31m-    { ngx_string("client_body_in_single_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_in_single_buffer),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sendfile"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, sendfile),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sendfile_max_chunk"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, sendfile_max_chunk),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("aio"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_set_aio,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("aio_write"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, aio_write),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("read_ahead"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, read_ahead),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("directio"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_directio,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("directio_alignment"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, directio_alignment),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nopush"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, tcp_nopush),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nodelay"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, tcp_nodelay),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, send_lowat),[m
[31m-      &ngx_http_core_lowat_post },[m
[31m-[m
[31m-    { ngx_string("postpone_output"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, postpone_output),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_rate_after"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, limit_rate_after),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_keepalive,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_requests"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, keepalive_requests),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_disable"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, keepalive_disable),[m
[31m-      &ngx_http_core_keepalive_disable },[m
[31m-[m
[31m-    { ngx_string("satisfy"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, satisfy),[m
[31m-      &ngx_http_core_satisfy },[m
[31m-[m
[31m-    { ngx_string("internal"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_internal,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lingering_close"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_close),[m
[31m-      &ngx_http_core_lingering_close },[m
[31m-[m
[31m-    { ngx_string("lingering_time"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_time),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lingering_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("reset_timedout_connection"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, reset_timedout_connection),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name_in_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, server_name_in_redirect),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("port_in_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, port_in_redirect),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("msie_padding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, msie_padding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("msie_refresh"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, msie_refresh),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_not_found"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, log_not_found),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_subrequest"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, log_subrequest),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("recursive_error_pages"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, recursive_error_pages),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_tokens"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, server_tokens),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("if_modified_since"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, if_modified_since),[m
[31m-      &ngx_http_core_if_modified_since },[m
[31m-[m
[31m-    { ngx_string("max_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, max_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("chunked_transfer_encoding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, chunked_transfer_encoding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("etag"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, etag),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_page"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_2MORE,[m
[31m-      ngx_http_core_error_page,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("no_error_pages"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_no_error_pages,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("try_files"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_core_try_files,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("post_action"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, post_action),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_error_log,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_open_file_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_events"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_events),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_resolver,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, resolver_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-    { ngx_string("gzip_vary"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_vary),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_http_version"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_http_version),[m
[31m-      &ngx_http_gzip_http_version },[m
[31m-[m
[31m-    { ngx_string("gzip_proxied"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_proxied),[m
[31m-      &ngx_http_gzip_proxied_mask },[m
[31m-[m
[31m-    { ngx_string("gzip_disable"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_gzip_disable,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-    { ngx_string("disable_symlinks"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_disable_symlinks,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_core_module_ctx = {[m
[31m-    ngx_http_core_preconfiguration,        /* preconfiguration */[m
[31m-    ngx_http_core_postconfiguration,       /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_core_create_main_conf,        /* create main configuration */[m
[31m-    ngx_http_core_init_main_conf,          /* init main configuration */[m
[31m-[m
[31m-    ngx_http_core_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_http_core_merge_srv_conf,          /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_core_create_loc_conf,         /* create location configuration */[m
[31m-    ngx_http_core_merge_loc_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_core_module_ctx,             /* module context */[m
[31m-    ngx_http_core_commands,                /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_core_get_method = { 3, (u_char *) "GET" };[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    r->connection->log->action = NULL;[m
[31m-[m
[31m-    r->connection->unexpected_eof = 0;[m
[31m-[m
[31m-    if (!r->internal) {[m
[31m-        switch (r->headers_in.connection_type) {[m
[31m-        case 0:[m
[31m-            r->keepalive = (r->http_version > NGX_HTTP_VERSION_10);[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_CONNECTION_CLOSE:[m
[31m-            r->keepalive = 0;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_CONNECTION_KEEP_ALIVE:[m
[31m-            r->keepalive = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        r->lingering_close = (r->headers_in.content_length_n > 0[m
[31m-                              || r->headers_in.chunked);[m
[31m-        r->phase_handler = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-        r->phase_handler = cmcf->phase_engine.server_rewrite_index;[m
[31m-    }[m
[31m-[m
[31m-    r->valid_location = 1;[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    r->gzip_tested = 0;[m
[31m-    r->gzip_ok = 0;[m
[31m-    r->gzip_vary = 0;[m
[31m-#endif[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    ngx_http_core_run_phases(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_core_run_phases(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_phase_handler_t   *ph;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ph = cmcf->phase_engine.handlers;[m
[31m-[m
[31m-    while (ph[r->phase_handler].checker) {[m
[31m-[m
[31m-        rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_generic_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    /*[m
[31m-     * generic phase checker,[m
[31m-     * used by the post read and pre-access phases[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "generic phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->phase_handler = ph->next;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_rewrite_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rewrite phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* NGX_OK, NGX_AGAIN, NGX_ERROR, NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_find_config_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     len;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->content_handler = NULL;[m
[31m-    r->uri_changed = 0;[m
[31m-[m
[31m-    rc = ngx_http_core_find_location(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->internal && clcf->internal) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "using configuration \"%s%V\"",[m
[31m-                   (clcf->noname ? "*" : (clcf->exact_match ? "=" : "")),[m
[31m-                   &clcf->name);[m
[31m-[m
[31m-    ngx_http_update_location_config(r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http cl:%O max:%O",[m
[31m-                   r->headers_in.content_length_n, clcf->client_max_body_size);[m
[31m-[m
[31m-    if (r->headers_in.content_length_n != -1[m
[31m-        && !r->discard_body[m
[31m-        && clcf->client_max_body_size[m
[31m-        && clcf->client_max_body_size < r->headers_in.content_length_n)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client intended to send too large body: %O bytes",[m
[31m-                      r->headers_in.content_length_n);[m
[31m-[m
[31m-        r->expect_tested = 1;[m
[31m-        (void) ngx_http_discard_request_body(r);[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_ENTITY_TOO_LARGE);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not need to set the r->headers_out.location->hash and[m
[31m-         * r->headers_out.location->key fields[m
[31m-         */[m
[31m-[m
[31m-        if (r->args.len == 0) {[m
[31m-            r->headers_out.location->value = clcf->name;[m
[31m-[m
[31m-        } else {[m
[31m-            len = clcf->name.len + 1 + r->args.len;[m
[31m-            p = ngx_pnalloc(r->pool, len);[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            r->headers_out.location->value.len = len;[m
[31m-            r->headers_out.location->value.data = p;[m
[31m-[m
[31m-            p = ngx_cpymem(p, clcf->name.data, clcf->name.len);[m
[31m-            *p++ = '?';[m
[31m-            ngx_memcpy(p, r->args.data, r->args.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_MOVED_PERMANENTLY);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler++;[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_post_rewrite_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post rewrite phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    if (!r->uri_changed) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uri changes: %d", r->uri_changes);[m
[31m-[m
[31m-    /*[m
[31m-     * gcc before 3.3 compiles the broken code for[m
[31m-     *     if (r->uri_changes-- == 0)[m
[31m-     * if the r->uri_changes is defined as[m
[31m-     *     unsigned  uri_changes:4[m
[31m-     */[m
[31m-[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while processing \"%V\"", &r->uri);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler = ph->next;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_access_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        r->phase_handler = ph->next;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "access phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) {[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->phase_handler++;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->access_code = 0;[m
[31m-[m
[31m-            if (r->headers_out.www_authenticate) {[m
[31m-                r->headers_out.www_authenticate->hash = 0;[m
[31m-            }[m
[31m-[m
[31m-            r->phase_handler = ph->next;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_FORBIDDEN || rc == NGX_HTTP_UNAUTHORIZED) {[m
[31m-            if (r->access_code != NGX_HTTP_UNAUTHORIZED) {[m
[31m-                r->access_code = rc;[m
[31m-            }[m
[31m-[m
[31m-            r->phase_handler++;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_post_access_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  access_code;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post access phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    access_code = r->access_code;[m
[31m-[m
[31m-    if (access_code) {[m
[31m-        if (access_code == NGX_HTTP_FORBIDDEN) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "access forbidden by rule");[m
[31m-        }[m
[31m-[m
[31m-        r->access_code = 0;[m
[31m-        ngx_http_finalize_request(r, access_code);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler++;[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_try_files_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    size_t                        len, root, alias, reserve, allocated;[m
[31m-    u_char                       *p, *name;[m
[31m-    ngx_str_t                     path, args;[m
[31m-    ngx_uint_t                    test_dir;[m
[31m-    ngx_http_try_file_t          *tf;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "try files phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->try_files == NULL) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    allocated = 0;[m
[31m-    root = 0;[m
[31m-    name = NULL;[m
[31m-    /* suppress MSVC warning */[m
[31m-    path.data = NULL;[m
[31m-[m
[31m-    tf = clcf->try_files;[m
[31m-[m
[31m-    alias = clcf->alias;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (tf->lengths) {[m
[31m-            ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-            e.ip = tf->lengths->elts;[m
[31m-            e.request = r;[m
[31m-[m
[31m-            /* 1 is for terminating '\0' as in static names */[m
[31m-            len = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-                len += lcode(&e);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            len = tf->name.len;[m
[31m-        }[m
[31m-[m
[31m-        if (!alias) {[m
[31m-            reserve = len > r->uri.len ? len - r->uri.len : 0;[m
[31m-[m
[31m-        } else if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            reserve = len;[m
[31m-[m
[31m-        } else {[m
[31m-            reserve = len > r->uri.len - alias ? len - (r->uri.len - alias) : 0;[m
[31m-        }[m
[31m-[m
[31m-        if (reserve > allocated || !allocated) {[m
[31m-[m
[31m-            /* 16 bytes are preallocation */[m
[31m-            allocated = reserve + 16;[m
[31m-[m
[31m-            if (ngx_http_map_uri_to_path(r, &path, &root, allocated) == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            name = path.data + root;[m
[31m-        }[m
[31m-[m
[31m-        if (tf->values == NULL) {[m
[31m-[m
[31m-            /* tf->name.len includes the terminating '\0' */[m
[31m-[m
[31m-            ngx_memcpy(name, tf->name.data, tf->name.len);[m
[31m-[m
[31m-            path.len = (name + tf->name.len - 1) - path.data;[m
[31m-[m
[31m-        } else {[m
[31m-            e.ip = tf->values->elts;[m
[31m-            e.pos = name;[m
[31m-            e.flushed = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-[m
[31m-            path.len = e.pos - path.data;[m
[31m-[m
[31m-            *e.pos = '\0';[m
[31m-[m
[31m-            if (alias && alias != NGX_MAX_SIZE_T_VALUE[m
[31m-                && ngx_strncmp(name, r->uri.data, alias) == 0)[m
[31m-            {[m
[31m-                ngx_memmove(name, name + alias, len - alias);[m
[31m-                path.len -= alias;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        test_dir = tf->test_dir;[m
[31m-[m
[31m-        tf++;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "trying to use %s: \"%s\" \"%s\"",[m
[31m-                       test_dir ? "dir" : "file", name, path.data);[m
[31m-[m
[31m-        if (tf->lengths == NULL && tf->name.len == 0) {[m
[31m-[m
[31m-            if (tf->code) {[m
[31m-                ngx_http_finalize_request(r, tf->code);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            path.len -= root;[m
[31m-            path.data += root;[m
[31m-[m
[31m-            if (path.data[0] == '@') {[m
[31m-                (void) ngx_http_named_location(r, &path);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_http_split_args(r, &path, &args);[m
[31m-[m
[31m-                (void) ngx_http_internal_redirect(r, &path, &args);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_DONE);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.read_ahead = clcf->read_ahead;[m
[31m-        of.directio = clcf->directio;[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            if (of.err != NGX_ENOENT[m
[31m-                && of.err != NGX_ENOTDIR[m
[31m-                && of.err != NGX_ENAMETOOLONG)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                              "%s \"%s\" failed", of.failed, path.data);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (of.is_dir != test_dir) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        path.len -= root;[m
[31m-        path.data += root;[m
[31m-[m
[31m-        if (!alias) {[m
[31m-            r->uri = path;[m
[31m-[m
[31m-        } else if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            if (!test_dir) {[m
[31m-                r->uri = path;[m
[31m-                r->add_uri_to_alias = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            name = r->uri.data;[m
[31m-[m
[31m-            r->uri.len = alias + path.len;[m
[31m-            r->uri.data = ngx_pnalloc(r->pool, r->uri.len);[m
[31m-            if (r->uri.data == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_copy(r->uri.data, name, alias);[m
[31m-            ngx_memcpy(p, path.data, path.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_exten(r);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "try file uri: \"%V\"", &r->uri);[m
[31m-[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* not reached */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_content_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    size_t     root;[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_str_t  path;[m
[31m-[m
[31m-    if (r->content_handler) {[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-        ngx_http_finalize_request(r, r->content_handler(r));[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "content phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc != NGX_DECLINED) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    ph++;[m
[31m-[m
[31m-    if (ph->checker) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* no content handler was found */[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) != NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "directory index of \"%s\" is forbidden", path.data);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_FORBIDDEN);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no handler found");[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_update_location_config(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->method & clcf->limit_except) {[m
[31m-        r->loc_conf = clcf->limit_except_loc_conf;[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_io.flags & NGX_IO_SENDFILE) && clcf->sendfile) {[m
[31m-        r->connection->sendfile = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        r->connection->sendfile = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->client_body_in_file_only) {[m
[31m-        r->request_body_in_file_only = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file =[m
[31m-            clcf->client_body_in_file_only == NGX_HTTP_REQUEST_BODY_FILE_CLEAN;[m
[31m-        r->request_body_file_log_level = NGX_LOG_NOTICE;[m
[31m-[m
[31m-    } else {[m
[31m-        r->request_body_file_log_level = NGX_LOG_WARN;[m
[31m-    }[m
[31m-[m
[31m-    r->request_body_in_single_buf = clcf->client_body_in_single_buffer;[m
[31m-[m
[31m-    if (r->keepalive) {[m
[31m-        if (clcf->keepalive_timeout == 0) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->connection->requests >= clcf->keepalive_requests) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->headers_in.msie6[m
[31m-                   && r->method == NGX_HTTP_POST[m
[31m-                   && (clcf->keepalive_disable[m
[31m-                       & NGX_HTTP_KEEPALIVE_DISABLE_MSIE6))[m
[31m-        {[m
[31m-            /*[m
[31m-             * MSIE may wait for some time if an response for[m
[31m-             * a POST request was sent over a keepalive connection[m
[31m-             */[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->headers_in.safari[m
[31m-                   && (clcf->keepalive_disable[m
[31m-                       & NGX_HTTP_KEEPALIVE_DISABLE_SAFARI))[m
[31m-        {[m
[31m-            /*[m
[31m-             * Safari may send a POST request to a closed keepalive[m
[31m-             * connection and may stall for some time, see[m
[31m-             *     https://bugs.webkit.org/show_bug.cgi?id=5760[m
[31m-             */[m
[31m-            r->keepalive = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!clcf->tcp_nopush) {[m
[31m-        /* disable TCP_NOPUSH/TCP_CORK use */[m
[31m-        r->connection->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->limit_rate == 0) {[m
[31m-        r->limit_rate = clcf->limit_rate;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->handler) {[m
[31m-        r->content_handler = clcf->handler;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_OK       - exact or regex match[m
[31m- * NGX_DONE     - auto redirect[m
[31m- * NGX_AGAIN    - inclusive match[m
[31m- * NGX_ERROR    - regex error[m
[31m- * NGX_DECLINED - no match[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_find_location(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *pclcf;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                  n;[m
[31m-    ngx_uint_t                 noregex;[m
[31m-    ngx_http_core_loc_conf_t  *clcf, **clcfp;[m
[31m-[m
[31m-    noregex = 0;[m
[31m-#endif[m
[31m-[m
[31m-    pclcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rc = ngx_http_core_find_static_location(r, pclcf->static_locations);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        noregex = clcf->noregex;[m
[31m-#endif[m
[31m-[m
[31m-        /* look up nested locations */[m
[31m-[m
[31m-        rc = ngx_http_core_find_location(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DONE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED or rc == NGX_AGAIN in nested location */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (noregex == 0 && pclcf->regex_locations) {[m
[31m-[m
[31m-        for (clcfp = pclcf->regex_locations; *clcfp; clcfp++) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "test location: ~ \"%V\"", &(*clcfp)->name);[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, (*clcfp)->regex, &r->uri);[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                r->loc_conf = (*clcfp)->loc_conf;[m
[31m-[m
[31m-                /* look up nested locations */[m
[31m-[m
[31m-                rc = ngx_http_core_find_location(r);[m
[31m-[m
[31m-                return (rc == NGX_ERROR) ? rc : NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_OK       - exact match[m
[31m- * NGX_DONE     - auto redirect[m
[31m- * NGX_AGAIN    - inclusive match[m
[31m- * NGX_DECLINED - no match[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_find_static_location(ngx_http_request_t *r,[m
[31m-    ngx_http_location_tree_node_t *node)[m
[31m-{[m
[31m-    u_char     *uri;[m
[31m-    size_t      len, n;[m
[31m-    ngx_int_t   rc, rv;[m
[31m-[m
[31m-    len = r->uri.len;[m
[31m-    uri = r->uri.data;[m
[31m-[m
[31m-    rv = NGX_DECLINED;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node == NULL) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "test location: \"%*s\"",[m
[31m-                       (size_t) node->len, node->name);[m
[31m-[m
[31m-        n = (len <= (size_t) node->len) ? len : node->len;[m
[31m-[m
[31m-        rc = ngx_filename_cmp(uri, node->name, n);[m
[31m-[m
[31m-        if (rc != 0) {[m
[31m-            node = (rc < 0) ? node->left : node->right;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len > (size_t) node->len) {[m
[31m-[m
[31m-            if (node->inclusive) {[m
[31m-[m
[31m-                r->loc_conf = node->inclusive->loc_conf;[m
[31m-                rv = NGX_AGAIN;[m
[31m-[m
[31m-                node = node->tree;[m
[31m-                uri += n;[m
[31m-                len -= n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* exact only */[m
[31m-[m
[31m-            node = node->right;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len == (size_t) node->len) {[m
[31m-[m
[31m-            if (node->exact) {[m
[31m-                r->loc_conf = node->exact->loc_conf;[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            } else {[m
[31m-                r->loc_conf = node->inclusive->loc_conf;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* len < node->len */[m
[31m-[m
[31m-        if (len + 1 == (size_t) node->len && node->auto_redirect) {[m
[31m-[m
[31m-            r->loc_conf = (node->exact) ? node->exact->loc_conf:[m
[31m-                                          node->inclusive->loc_conf;[m
[31m-            rv = NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        node = node->left;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash)[m
[31m-{[m
[31m-    u_char      c, *lowcase;[m
[31m-    size_t      len;[m
[31m-    ngx_uint_t  i, hash;[m
[31m-[m
[31m-    if (types_hash->size == 0) {[m
[31m-        return (void *) 4;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    len = r->headers_out.content_type_len;[m
[31m-[m
[31m-    if (r->headers_out.content_type_lowcase == NULL) {[m
[31m-[m
[31m-        lowcase = ngx_pnalloc(r->pool, len);[m
[31m-        if (lowcase == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_lowcase = lowcase;[m
[31m-[m
[31m-        hash = 0;[m
[31m-[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            c = ngx_tolower(r->headers_out.content_type.data[i]);[m
[31m-            hash = ngx_hash(hash, c);[m
[31m-            lowcase[i] = c;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_hash = hash;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_hash_find(types_hash, r->headers_out.content_type_hash,[m
[31m-                         r->headers_out.content_type_lowcase, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_content_type(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                     c, *exten;[m
[31m-    ngx_str_t                 *type;[m
[31m-    ngx_uint_t                 i, hash;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->exten.len) {[m
[31m-[m
[31m-        hash = 0;[m
[31m-[m
[31m-        for (i = 0; i < r->exten.len; i++) {[m
[31m-            c = r->exten.data[i];[m
[31m-[m
[31m-            if (c >= 'A' && c <= 'Z') {[m
[31m-[m
[31m-                exten = ngx_pnalloc(r->pool, r->exten.len);[m
[31m-                if (exten == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                hash = ngx_hash_strlow(exten, r->exten.data, r->exten.len);[m
[31m-[m
[31m-                r->exten.data = exten;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            hash = ngx_hash(hash, c);[m
[31m-        }[m
[31m-[m
[31m-        type = ngx_hash_find(&clcf->types_hash, hash,[m
[31m-                             r->exten.data, r->exten.len);[m
[31m-[m
[31m-        if (type) {[m
[31m-            r->headers_out.content_type_len = type->len;[m
[31m-            r->headers_out.content_type = *type;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_len = clcf->default_type.len;[m
[31m-    r->headers_out.content_type = clcf->default_type;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_set_exten(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    ngx_str_null(&r->exten);[m
[31m-[m
[31m-    for (i = r->uri.len - 1; i > 1; i--) {[m
[31m-        if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {[m
[31m-[m
[31m-            r->exten.len = r->uri.len - i - 1;[m
[31m-            r->exten.data = &r->uri.data[i + 1];[m
[31m-[m
[31m-            return;[m
[31m-[m
[31m-        } else if (r->uri.data[i] == '/') {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_etag(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t           *etag;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!clcf->etag) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    etag = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (etag == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    etag->hash = 1;[m
[31m-    ngx_str_set(&etag->key, "ETag");[m
[31m-[m
[31m-    etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);[m
[31m-    if (etag->value.data == NULL) {[m
[31m-        etag->hash = 0;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",[m
[31m-                                  r->headers_out.last_modified_time,[m
[31m-                                  r->headers_out.content_length_n)[m
[31m-                      - etag->value.data;[m
[31m-[m
[31m-    r->headers_out.etag = etag;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_weak_etag(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t            len;[m
[31m-    u_char           *p;[m
[31m-    ngx_table_elt_t  *etag;[m
[31m-[m
[31m-    etag = r->headers_out.etag;[m
[31m-[m
[31m-    if (etag == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (etag->value.len > 2[m
[31m-        && etag->value.data[0] == 'W'[m
[31m-        && etag->value.data[1] == '/')[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (etag->value.len < 1 || etag->value.data[0] != '"') {[m
[31m-        r->headers_out.etag->hash = 0;[m
[31m-        r->headers_out.etag = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, etag->value.len + 2);[m
[31m-    if (p == NULL) {[m
[31m-        r->headers_out.etag->hash = 0;[m
[31m-        r->headers_out.etag = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_sprintf(p, "W/%V", &etag->value) - p;[m
[31m-[m
[31m-    etag->value.data = p;[m
[31m-    etag->value.len = len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,[m
[31m-    ngx_str_t *ct, ngx_http_complex_value_t *cv)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_str_t     val;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = status;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, cv, &val) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (status == NGX_HTTP_MOVED_PERMANENTLY[m
[31m-        || status == NGX_HTTP_MOVED_TEMPORARILY[m
[31m-        || status == NGX_HTTP_SEE_OTHER[m
[31m-        || status == NGX_HTTP_TEMPORARY_REDIRECT)[m
[31m-    {[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.location->hash = 1;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-        r->headers_out.location->value = val;[m
[31m-[m
[31m-        return status;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = val.len;[m
[31m-[m
[31m-    if (ct) {[m
[31m-        r->headers_out.content_type_len = ct->len;[m
[31m-        r->headers_out.content_type = *ct;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD || (r != r->main && val.len == 0)) {[m
[31m-        return ngx_http_send_header(r);[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = val.data;[m
[31m-    b->last = val.data + val.len;[m
[31m-    b->memory = val.len ? 1 : 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->post_action) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "header already sent");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        r->headers_out.status = r->err_status;[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_top_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http output filter \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    rc = ngx_http_top_body_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        /* NGX_ERROR may be returned by any filter */[m
[31m-        c->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *path,[m
[31m-    size_t *root_length, size_t reserved)[m
[31m-{[m
[31m-    u_char                    *last;[m
[31m-    size_t                     alias;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    alias = clcf->alias;[m
[31m-[m
[31m-    if (alias && !r->valid_location) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "\"alias\" cannot be used in location \"%V\" "[m
[31m-                      "where URI was rewritten", &clcf->name);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->root_lengths == NULL) {[m
[31m-[m
[31m-        *root_length = clcf->root.len;[m
[31m-[m
[31m-        path->len = clcf->root.len + reserved + r->uri.len - alias + 1;[m
[31m-[m
[31m-        path->data = ngx_pnalloc(r->pool, path->len);[m
[31m-        if (path->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        last = ngx_copy(path->data, clcf->root.data, clcf->root.len);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            reserved += r->add_uri_to_alias ? r->uri.len + 1 : 1;[m
[31m-[m
[31m-        } else {[m
[31m-            reserved += r->uri.len - alias + 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_script_run(r, path, clcf->root_lengths->elts, reserved,[m
[31m-                                clcf->root_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, path)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        *root_length = path->len - reserved;[m
[31m-        last = path->data + *root_length;[m
[31m-[m
[31m-        if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            if (!r->add_uri_to_alias) {[m
[31m-                *last = '\0';[m
[31m-                return last;[m
[31m-            }[m
[31m-[m
[31m-            alias = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_cpystrn(last, r->uri.data + alias, r->uri.len - alias + 1);[m
[31m-[m
[31m-    return last;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_auth_basic_user(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t   auth, encoded;[m
[31m-    ngx_uint_t  len;[m
[31m-[m
[31m-    if (r->headers_in.user.len == 0 && r->headers_in.user.data != NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.authorization == NULL) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    encoded = r->headers_in.authorization->value;[m
[31m-[m
[31m-    if (encoded.len < sizeof("Basic ") - 1[m
[31m-        || ngx_strncasecmp(encoded.data, (u_char *) "Basic ",[m
[31m-                           sizeof("Basic ") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    encoded.len -= sizeof("Basic ") - 1;[m
[31m-    encoded.data += sizeof("Basic ") - 1;[m
[31m-[m
[31m-    while (encoded.len && encoded.data[0] == ' ') {[m
[31m-        encoded.len--;[m
[31m-        encoded.data++;[m
[31m-    }[m
[31m-[m
[31m-    if (encoded.len == 0) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    auth.len = ngx_base64_decoded_length(encoded.len);[m
[31m-    auth.data = ngx_pnalloc(r->pool, auth.len + 1);[m
[31m-    if (auth.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&auth, &encoded) != NGX_OK) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    auth.data[auth.len] = '\0';[m
[31m-[m
[31m-    for (len = 0; len < auth.len; len++) {[m
[31m-        if (auth.data[len] == ':') {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 || len == auth.len) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.user.len = len;[m
[31m-    r->headers_in.user.data = auth.data;[m
[31m-    r->headers_in.passwd.len = auth.len - len - 1;[m
[31m-    r->headers_in.passwd.data = &auth.data[len + 1];[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_gzip_ok(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                     date, expires;[m
[31m-    ngx_uint_t                 p;[m
[31m-    ngx_array_t               *cc;[m
[31m-    ngx_table_elt_t           *e, *d, *ae;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->gzip_tested = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ae = r->headers_in.accept_encoding;[m
[31m-    if (ae == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ae->value.len < sizeof("gzip") - 1) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * test first for the most common case "gzip,...":[m
[31m-     *   MSIE:    "gzip, deflate"[m
[31m-     *   Firefox: "gzip,deflate"[m
[31m-     *   Chrome:  "gzip,deflate,sdch"[m
[31m-     *   Safari:  "gzip, deflate"[m
[31m-     *   Opera:   "gzip, deflate"[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_memcmp(ae->value.data, "gzip,", 5) != 0[m
[31m-        && ngx_http_gzip_accept_encoding(&ae->value) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_in.msie6 && clcf->gzip_disable_msie6) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < clcf->gzip_http_version) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.via == NULL) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    p = clcf->gzip_proxied;[m
[31m-[m
[31m-    if (p & NGX_HTTP_GZIP_PROXIED_OFF) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (p & NGX_HTTP_GZIP_PROXIED_ANY) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.authorization && (p & NGX_HTTP_GZIP_PROXIED_AUTH)) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    e = r->headers_out.expires;[m
[31m-[m
[31m-    if (e) {[m
[31m-[m
[31m-        if (!(p & NGX_HTTP_GZIP_PROXIED_EXPIRED)) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        expires = ngx_parse_http_time(e->value.data, e->value.len);[m
[31m-        if (expires == NGX_ERROR) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        d = r->headers_out.date;[m
[31m-[m
[31m-        if (d) {[m
[31m-            date = ngx_parse_http_time(d->value.data, d->value.len);[m
[31m-            if (date == NGX_ERROR) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            date = ngx_time();[m
[31m-        }[m
[31m-[m
[31m-        if (expires < date) {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cc = &r->headers_out.cache_control;[m
[31m-[m
[31m-    if (cc->elts) {[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_NO_CACHE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_cache,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_NO_STORE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_store,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_PRIVATE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_private,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((p & NGX_HTTP_GZIP_PROXIED_NO_LM) && r->headers_out.last_modified) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((p & NGX_HTTP_GZIP_PROXIED_NO_ETAG) && r->headers_out.etag) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-ok:[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (clcf->gzip_disable && r->headers_in.user_agent) {[m
[31m-[m
[31m-        if (ngx_regex_exec_array(clcf->gzip_disable,[m
[31m-                                 &r->headers_in.user_agent->value,[m
[31m-                                 r->connection->log)[m
[31m-            != NGX_DECLINED)[m
[31m-        {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    r->gzip_ok = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * gzip is enabled for the following quantities:[m
[31m- *     "gzip; q=0.001" ... "gzip; q=1.000"[m
[31m- * gzip is disabled for the following quantities:[m
[31m- *     "gzip; q=0" ... "gzip; q=0.000", and for any invalid cases[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_accept_encoding(ngx_str_t *ae)[m
[31m-{[m
[31m-    u_char  *p, *start, *last;[m
[31m-[m
[31m-    start = ae->data;[m
[31m-    last = start + ae->len;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        p = ngx_strcasestrn(start, "gzip", 4 - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (p == start || (*(p - 1) == ',' || *(p - 1) == ' ')) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        start = p + 4;[m
[31m-    }[m
[31m-[m
[31m-    p += 4;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        switch (*p++) {[m
[31m-        case ',':[m
[31m-            return NGX_OK;[m
[31m-        case ';':[m
[31m-            goto quantity;[m
[31m-        case ' ':[m
[31m-            continue;[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-quantity:[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        switch (*p++) {[m
[31m-        case 'q':[m
[31m-        case 'Q':[m
[31m-            goto equal;[m
[31m-        case ' ':[m
[31m-            continue;[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-equal:[m
[31m-[m
[31m-    if (p + 2 > last || *p++ != '=') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_gzip_quantity(p, last) == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_gzip_quantity(u_char *p, u_char *last)[m
[31m-{[m
[31m-    u_char      c;[m
[31m-    ngx_uint_t  n, q;[m
[31m-[m
[31m-    c = *p++;[m
[31m-[m
[31m-    if (c != '0' && c != '1') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    q = (c - '0') * 100;[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        return q;[m
[31m-    }[m
[31m-[m
[31m-    c = *p++;[m
[31m-[m
[31m-    if (c == ',' || c == ' ') {[m
[31m-        return q;[m
[31m-    }[m
[31m-[m
[31m-    if (c != '.') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        c = *p++;[m
[31m-[m
[31m-        if (c == ',' || c == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            q += c - '0';[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (q > 100 || n > 3) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    return q;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,[m
[31m-    ngx_http_post_subrequest_t *ps, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_time_t                    *tp;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *sr;[m
[31m-    ngx_http_core_srv_conf_t      *cscf;[m
[31m-    ngx_http_postponed_request_t  *pr, *p;[m
[31m-[m
[31m-    if (r->subrequests == 0) {[m
[31m-        ngx_http_probe_subrequest_cycle(r, uri, args);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "subrequests cycle while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * 1000 is reserved for other purposes.[m
[31m-     */[m
[31m-    if (r->main->count >= 65535 - 1000) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "request reference counter overflow "[m
[31m-                      "while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr = ngx_pcalloc(r->pool, sizeof(ngx_http_request_t));[m
[31m-    if (sr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr->signature = NGX_HTTP_MODULE;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    sr->connection = c;[m
[31m-[m
[31m-    sr->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (sr->ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&sr->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    sr->main_conf = cscf->ctx->main_conf;[m
[31m-    sr->srv_conf = cscf->ctx->srv_conf;[m
[31m-    sr->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    sr->pool = r->pool;[m
[31m-[m
[31m-    sr->headers_in = r->headers_in;[m
[31m-[m
[31m-    ngx_http_clear_content_length(sr);[m
[31m-    ngx_http_clear_accept_ranges(sr);[m
[31m-    ngx_http_clear_last_modified(sr);[m
[31m-[m
[31m-    sr->request_body = r->request_body;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    sr->stream = r->stream;[m
[31m-#endif[m
[31m-[m
[31m-    sr->method = NGX_HTTP_GET;[m
[31m-    sr->http_version = r->http_version;[m
[31m-[m
[31m-    sr->request_line = r->request_line;[m
[31m-    sr->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        sr->args = *args;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http subrequest \"%V?%V\"", uri, &sr->args);[m
[31m-[m
[31m-    sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;[m
[31m-    sr->waited = (flags & NGX_HTTP_SUBREQUEST_WAITED) != 0;[m
[31m-[m
[31m-    sr->unparsed_uri = r->unparsed_uri;[m
[31m-    sr->method_name = ngx_http_core_get_method;[m
[31m-    sr->http_protocol = r->http_protocol;[m
[31m-[m
[31m-    ngx_http_set_exten(sr);[m
[31m-[m
[31m-    sr->main = r->main;[m
[31m-    sr->parent = r;[m
[31m-    sr->post_subrequest = ps;[m
[31m-    sr->read_event_handler = ngx_http_request_empty_handler;[m
[31m-    sr->write_event_handler = ngx_http_handler;[m
[31m-[m
[31m-    if (c->data == r && r->postponed == NULL) {[m
[31m-        c->data = sr;[m
[31m-    }[m
[31m-[m
[31m-    sr->variables = r->variables;[m
[31m-[m
[31m-    sr->log_handler = r->log_handler;[m
[31m-[m
[31m-    pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->request = sr;[m
[31m-    pr->out = NULL;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-    if (r->postponed) {[m
[31m-        for (p = r->postponed; p->next; p = p->next) { /* void */ }[m
[31m-        p->next = pr;[m
[31m-[m
[31m-    } else {[m
[31m-        r->postponed = pr;[m
[31m-    }[m
[31m-[m
[31m-    sr->internal = 1;[m
[31m-[m
[31m-    sr->discard_body = r->discard_body;[m
[31m-    sr->expect_tested = 1;[m
[31m-    sr->main_filter_need_in_memory = r->main_filter_need_in_memory;[m
[31m-[m
[31m-    sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    sr->subrequests = r->subrequests - 1;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    sr->start_sec = tp->sec;[m
[31m-    sr->start_msec = tp->msec;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    *psr = sr;[m
[31m-[m
[31m-    ngx_http_probe_subrequest_start(sr);[m
[31m-[m
[31m-    return ngx_http_post_request(sr, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_internal_redirect(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while internally redirecting to \"%V\"", uri);[m
[31m-[m
[31m-        r->main->count++;[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    r->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        r->args = *args;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&r->args);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "internal redirect: \"%V?%V\"", uri, &r->args);[m
[31m-[m
[31m-    ngx_http_set_exten(r);[m
[31m-[m
[31m-    /* clear the modules contexts */[m
[31m-    ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    ngx_http_update_location_config(r);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    r->cache = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    r->internal = 1;[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-    r->add_uri_to_alias = 0;[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    ngx_http_handler(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t    *cscf;[m
[31m-    ngx_http_core_loc_conf_t   **clcfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while redirect to named location \"%V\"", name);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "empty URI in redirect to named location \"%V\"", name);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (cscf->named_locations) {[m
[31m-[m
[31m-        for (clcfp = cscf->named_locations; *clcfp; clcfp++) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "test location: \"%V\"", &(*clcfp)->name);[m
[31m-[m
[31m-            if (name->len != (*clcfp)->name.len[m
[31m-                || ngx_strncmp(name->data, (*clcfp)->name.data, name->len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "using location: %V \"%V?%V\"",[m
[31m-                           name, &r->uri, &r->args);[m
[31m-[m
[31m-            r->internal = 1;[m
[31m-            r->content_handler = NULL;[m
[31m-            r->uri_changed = 0;[m
[31m-            r->loc_conf = (*clcfp)->loc_conf;[m
[31m-[m
[31m-            /* clear the modules contexts */[m
[31m-            ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-            ngx_http_update_location_config(r);[m
[31m-[m
[31m-            cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            r->phase_handler = cmcf->phase_engine.location_rewrite_index;[m
[31m-[m
[31m-            r->write_event_handler = ngx_http_core_run_phases;[m
[31m-            ngx_http_core_run_phases(r);[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "could not find named location \"%V\"", name);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_cleanup_t *[m
[31m-ngx_http_cleanup_add(ngx_http_request_t *r, size_t size)[m
[31m-{[m
[31m-    ngx_http_cleanup_t  *cln;[m
[31m-[m
[31m-    r = r->main;[m
[31m-[m
[31m-    cln = ngx_palloc(r->pool, sizeof(ngx_http_cleanup_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        cln->data = ngx_palloc(r->pool, size);[m
[31m-        if (cln->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cln->data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = NULL;[m
[31m-    cln->next = r->cleanup;[m
[31m-[m
[31m-    r->cleanup = cln;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http cleanup add: %p", cln);[m
[31m-[m
[31m-    return cln;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_disable_symlinks(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *path, ngx_open_file_info_t *of)[m
[31m-{[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    u_char     *p;[m
[31m-    ngx_str_t   from;[m
[31m-[m
[31m-    of->disable_symlinks = clcf->disable_symlinks;[m
[31m-[m
[31m-    if (clcf->disable_symlinks_from == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, clcf->disable_symlinks_from, &from)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (from.len == 0[m
[31m-        || from.len > path->len[m
[31m-        || ngx_memcmp(path->data, from.data, from.len) != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (from.len == path->len) {[m
[31m-        of->disable_symlinks = NGX_DISABLE_SYMLINKS_OFF;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = path->data + from.len;[m
[31m-[m
[31m-    if (*p == '/') {[m
[31m-        of->disable_symlinks_from = from.len;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p--;[m
[31m-[m
[31m-    if (*p == '/') {[m
[31m-        of->disable_symlinks_from = from.len - 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    ngx_array_t *headers, ngx_str_t *value, ngx_array_t *proxies,[m
[31m-    int recursive)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_uint_t         i, found;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    if (headers == NULL) {[m
[31m-        return ngx_http_get_forwarded_addr_internal(r, addr, value->data,[m
[31m-                                                    value->len, proxies,[m
[31m-                                                    recursive);[m
[31m-    }[m
[31m-[m
[31m-    i = headers->nelts;[m
[31m-    h = headers->elts;[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-    while (i-- > 0) {[m
[31m-        rc = ngx_http_get_forwarded_addr_internal(r, addr, h[i]->value.data,[m
[31m-                                                  h[i]->value.len, proxies,[m
[31m-                                                  recursive);[m
[31m-[m
[31m-        if (!recursive) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED && found) {[m
[31m-            rc = NGX_DONE;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    u_char *xff, size_t xfflen, ngx_array_t *proxies, int recursive)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    in_addr_t         inaddr;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_addr_t        paddr;[m
[31m-    ngx_cidr_t       *cidr;[m
[31m-    ngx_uint_t        family, i;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t        n;[m
[31m-    struct in6_addr  *inaddr6;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    inaddr = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    inaddr6 = NULL;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    family = addr->sockaddr->sa_family;[m
[31m-[m
[31m-    if (family == AF_INET) {[m
[31m-        inaddr = ((struct sockaddr_in *) addr->sockaddr)->sin_addr.s_addr;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    else if (family == AF_INET6) {[m
[31m-        inaddr6 = &((struct sockaddr_in6 *) addr->sockaddr)->sin6_addr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-            family = AF_INET;[m
[31m-[m
[31m-            p = inaddr6->s6_addr;[m
[31m-[m
[31m-            inaddr = p[12] << 24;[m
[31m-            inaddr += p[13] << 16;[m
[31m-            inaddr += p[14] << 8;[m
[31m-            inaddr += p[15];[m
[31m-[m
[31m-            inaddr = htonl(inaddr);[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    for (cidr = proxies->elts, i = 0; i < proxies->nelts; i++) {[m
[31m-        if (cidr[i].family != family) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        switch (family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            for (n = 0; n < 16; n++) {[m
[31m-                if ((inaddr6->s6_addr[n] & cidr[i].u.in6.mask.s6_addr[n])[m
[31m-                    != cidr[i].u.in6.addr.s6_addr[n])[m
[31m-                {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            if ((inaddr & cidr[i].u.in.mask) != cidr[i].u.in.addr) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        for (p = xff + xfflen - 1; p > xff; p--, xfflen--) {[m
[31m-            if (*p != ' ' && *p != ',') {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; p > xff; p--) {[m
[31m-            if (*p == ' ' || *p == ',') {[m
[31m-                p++;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_parse_addr(r->pool, &paddr, p, xfflen - (p - xff)) != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        *addr = paddr;[m
[31m-[m
[31m-        if (recursive && p > xff) {[m
[31m-            rc = ngx_http_get_forwarded_addr_internal(r, addr, xff, p - 1 - xff,[m
[31m-                                                      proxies, 1);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_OK || rc == NGX_DONE  */[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    void                        *mconf;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_conf_t                   pcf;[m
[31m-    ngx_http_module_t           *module;[m
[31m-    struct sockaddr_in          *sin;[m
[31m-    ngx_http_conf_ctx_t         *ctx, *http_ctx;[m
[31m-    ngx_http_listen_opt_t        lsopt;[m
[31m-    ngx_http_core_srv_conf_t    *cscf, **cscfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx = cf->ctx;[m
[31m-    ctx->main_conf = http_ctx->main_conf;[m
[31m-[m
[31m-    /* the server{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* the server{}'s loc_conf */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the server configuration context */[m
[31m-[m
[31m-    cscf = ctx->srv_conf[ngx_http_core_module.ctx_index];[m
[31m-    cscf->ctx = ctx;[m
[31m-[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    cscfp = ngx_array_push(&cmcf->servers);[m
[31m-    if (cscfp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *cscfp = cscf;[m
[31m-[m
[31m-[m
[31m-    /* parse inside server{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_SRV_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv == NGX_CONF_OK && !cscf->listen) {[m
[31m-        ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));[m
[31m-[m
[31m-        sin = &lsopt.u.sockaddr_in;[m
[31m-[m
[31m-        sin->sin_family = AF_INET;[m
[31m-#if (NGX_WIN32)[m
[31m-        sin->sin_port = htons(80);[m
[31m-#else[m
[31m-        sin->sin_port = htons((getuid() == 0) ? 80 : 8000);[m
[31m-#endif[m
[31m-        sin->sin_addr.s_addr = INADDR_ANY;[m
[31m-[m
[31m-        lsopt.socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-        lsopt.backlog = NGX_LISTEN_BACKLOG;[m
[31m-        lsopt.rcvbuf = -1;[m
[31m-        lsopt.sndbuf = -1;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        lsopt.setfib = -1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        lsopt.fastopen = -1;[m
[31m-#endif[m
[31m-        lsopt.wildcard = 1;[m
[31m-[m
[31m-        (void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.socklen, lsopt.addr,[m
[31m-                             NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                      *rv;[m
[31m-    u_char                    *mod;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                 *value, *name;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_conf_t                 save;[m
[31m-    ngx_http_module_t         *module;[m
[31m-    ngx_http_conf_ctx_t       *ctx, *pctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf, *pclcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] =[m
[31m-                                                   module->create_loc_conf(cf);[m
[31m-            if (ctx->loc_conf[cf->cycle->modules[i]->ctx_index] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-[m
[31m-        len = value[1].len;[m
[31m-        mod = value[1].data;[m
[31m-        name = &value[2];[m
[31m-[m
[31m-        if (len == 1 && mod[0] == '=') {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-            clcf->exact_match = 1;[m
[31m-[m
[31m-        } else if (len == 2 && mod[0] == '^' && mod[1] == '~') {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-            clcf->noregex = 1;[m
[31m-[m
[31m-        } else if (len == 1 && mod[0] == '~') {[m
[31m-[m
[31m-            if (ngx_http_core_regex_location(cf, clcf, name, 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else if (len == 2 && mod[0] == '~' && mod[1] == '*') {[m
[31m-[m
[31m-            if (ngx_http_core_regex_location(cf, clcf, name, 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid location modifier \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        name = &value[1];[m
[31m-[m
[31m-        if (name->data[0] == '=') {[m
[31m-[m
[31m-            clcf->name.len = name->len - 1;[m
[31m-            clcf->name.data = name->data + 1;[m
[31m-            clcf->exact_match = 1;[m
[31m-[m
[31m-        } else if (name->data[0] == '^' && name->data[1] == '~') {[m
[31m-[m
[31m-            clcf->name.len = name->len - 2;[m
[31m-            clcf->name.data = name->data + 2;[m
[31m-            clcf->noregex = 1;[m
[31m-[m
[31m-        } else if (name->data[0] == '~') {[m
[31m-[m
[31m-            name->len--;[m
[31m-            name->data++;[m
[31m-[m
[31m-            if (name->data[0] == '*') {[m
[31m-[m
[31m-                name->len--;[m
[31m-                name->data++;[m
[31m-[m
[31m-                if (ngx_http_core_regex_location(cf, clcf, name, 1) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                if (ngx_http_core_regex_location(cf, clcf, name, 0) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-[m
[31m-            if (name->data[0] == '@') {[m
[31m-                clcf->named = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    if (cf->cmd_type == NGX_HTTP_LOC_CONF) {[m
[31m-[m
[31m-        /* nested location */[m
[31m-[m
[31m-#if 0[m
[31m-        clcf->prev_location = pclcf;[m
[31m-#endif[m
[31m-[m
[31m-        if (pclcf->exact_match) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" cannot be inside "[m
[31m-                               "the exact location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (pclcf->named) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" cannot be inside "[m
[31m-                               "the named location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->named) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "named location \"%V\" can be "[m
[31m-                               "on the server level only",[m
[31m-                               &clcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = pclcf->name.len;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        if (clcf->regex == NULL[m
[31m-            && ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)[m
[31m-#else[m
[31m-        if (ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)[m
[31m-#endif[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" is outside location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_LOC_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_regex_location(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf,[m
[31m-    ngx_str_t *regex, ngx_uint_t caseless)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_compile_t  rc;[m
[31m-    u_char               errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *regex;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-#if (NGX_HAVE_CASELESS_FILESYSTEM)[m
[31m-    rc.options = NGX_REGEX_CASELESS;[m
[31m-#else[m
[31m-    rc.options = caseless ? NGX_REGEX_CASELESS : 0;[m
[31m-#endif[m
[31m-[m
[31m-    clcf->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (clcf->regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->name = *regex;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "using regex \"%V\" requires PCRE library",[m
[31m-                       regex);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    if (clcf->types == NULL) {[m
[31m-        clcf->types = ngx_array_create(cf->pool, 64, sizeof(ngx_hash_key_t));[m
[31m-        if (clcf->types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_core_type;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t       *value, *content_type, *old;[m
[31m-    ngx_uint_t       i, n, hash;[m
[31m-    ngx_hash_key_t  *type;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "include") == 0) {[m
[31m-        if (cf->args->nelts != 2) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid number of arguments"[m
[31m-                               " in \"include\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_conf_include(cf, dummy, conf);[m
[31m-    }[m
[31m-[m
[31m-    content_type = ngx_palloc(cf->pool, sizeof(ngx_str_t));[m
[31m-    if (content_type == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *content_type = value[0];[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len);[m
[31m-[m
[31m-        type = clcf->types->elts;[m
[31m-        for (n = 0; n < clcf->types->nelts; n++) {[m
[31m-            if (ngx_strcmp(value[i].data, type[n].key.data) == 0) {[m
[31m-                old = type[n].value;[m
[31m-                type[n].value = content_type;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                                   "duplicate extension \"%V\", "[m
[31m-                                   "content type: \"%V\", "[m
[31m-                                   "previous content type: \"%V\"",[m
[31m-                                   &value[i], content_type, old);[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        type = ngx_array_push(clcf->types);[m
[31m-        if (type == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        type->key = value[i];[m
[31m-        type->key_hash = hash;[m
[31m-        type->value = content_type;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    return ngx_http_variables_add_core_vars(cf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_postconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_request_body_filter = ngx_http_request_body_save_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_main_conf_t));[m
[31m-    if (cmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->servers, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_core_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    cmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    cmcf->variables_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    cmcf->variables_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return cmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t *cmcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512);[m
[31m-    ngx_conf_init_uint_value(cmcf->server_names_hash_bucket_size,[m
[31m-                             ngx_cacheline_size);[m
[31m-[m
[31m-    cmcf->server_names_hash_bucket_size =[m
[31m-            ngx_align(cmcf->server_names_hash_bucket_size, ngx_cacheline_size);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_init_uint_value(cmcf->variables_hash_max_size, 1024);[m
[31m-    ngx_conf_init_uint_value(cmcf->variables_hash_bucket_size, 64);[m
[31m-[m
[31m-    cmcf->variables_hash_bucket_size =[m
[31m-               ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size);[m
[31m-[m
[31m-    if (cmcf->ncaptures) {[m
[31m-        cmcf->ncaptures = (cmcf->ncaptures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_srv_conf_t));[m
[31m-    if (cscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->client_large_buffers.num = 0;[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_array_init(&cscf->server_names, cf->temp_pool, 4,[m
[31m-                       sizeof(ngx_http_server_name_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cscf->connection_pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->request_pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->client_header_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    cscf->client_header_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->ignore_invalid_headers = NGX_CONF_UNSET;[m
[31m-    cscf->merge_slashes = NGX_CONF_UNSET;[m
[31m-    cscf->underscores_in_headers = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return cscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *prev = parent;[m
[31m-    ngx_http_core_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_str_t                name;[m
[31m-    ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-    /* TODO: it does not merge, it inits only */[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->connection_pool_size,[m
[31m-                              prev->connection_pool_size, 64 * sizeof(void *));[m
[31m-    ngx_conf_merge_size_value(conf->request_pool_size,[m
[31m-                              prev->request_pool_size, 4096);[m
[31m-    ngx_conf_merge_msec_value(conf->client_header_timeout,[m
[31m-                              prev->client_header_timeout, 60000);[m
[31m-    ngx_conf_merge_size_value(conf->client_header_buffer_size,[m
[31m-                              prev->client_header_buffer_size, 1024);[m
[31m-    ngx_conf_merge_bufs_value(conf->large_client_header_buffers,[m
[31m-                              prev->large_client_header_buffers,[m
[31m-                              4, 8192);[m
[31m-[m
[31m-    if (conf->large_client_header_buffers.size < conf->connection_pool_size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the \"large_client_header_buffers\" size must be "[m
[31m-                           "equal to or greater than \"connection_pool_size\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ignore_invalid_headers,[m
[31m-                              prev->ignore_invalid_headers, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->underscores_in_headers,[m
[31m-                              prev->underscores_in_headers, 0);[m
[31m-[m
[31m-    if (conf->server_names.nelts == 0) {[m
[31m-        /* the array has 4 empty preallocated elements, so push cannot fail */[m
[31m-        sn = ngx_array_push(&conf->server_names);[m
[31m-#if (NGX_PCRE)[m
[31m-        sn->regex = NULL;[m
[31m-#endif[m
[31m-        sn->server = conf;[m
[31m-        ngx_str_set(&sn->name, "");[m
[31m-    }[m
[31m-[m
[31m-    sn = conf->server_names.elts;[m
[31m-    name = sn[0].name;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (sn->regex) {[m
[31m-        name.len++;[m
[31m-        name.data--;[m
[31m-    } else[m
[31m-#endif[m
[31m-[m
[31m-    if (name.data[0] == '.') {[m
[31m-        name.len--;[m
[31m-        name.data++;[m
[31m-    }[m
[31m-[m
[31m-    conf->server_name.len = name.len;[m
[31m-    conf->server_name.data = ngx_pstrdup(cf->pool, &name);[m
[31m-    if (conf->server_name.data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_loc_conf_t));[m
[31m-    if (clcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     clcf->root = { 0, NULL };[m
[31m-     *     clcf->limit_except = 0;[m
[31m-     *     clcf->post_action = { 0, NULL };[m
[31m-     *     clcf->types = NULL;[m
[31m-     *     clcf->default_type = { 0, NULL };[m
[31m-     *     clcf->error_log = NULL;[m
[31m-     *     clcf->try_files = NULL;[m
[31m-     *     clcf->client_body_path = NULL;[m
[31m-     *     clcf->regex = NULL;[m
[31m-     *     clcf->exact_match = 0;[m
[31m-     *     clcf->auto_redirect = 0;[m
[31m-     *     clcf->alias = 0;[m
[31m-     *     clcf->gzip_proxied = 0;[m
[31m-     *     clcf->keepalive_disable = 0;[m
[31m-     */[m
[31m-[m
[31m-    clcf->error_pages = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->client_max_body_size = NGX_CONF_UNSET;[m
[31m-    clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->satisfy = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->if_modified_since = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->max_ranges = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->client_body_in_file_only = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->client_body_in_single_buffer = NGX_CONF_UNSET;[m
[31m-    clcf->internal = NGX_CONF_UNSET;[m
[31m-    clcf->sendfile = NGX_CONF_UNSET;[m
[31m-    clcf->sendfile_max_chunk = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->aio = NGX_CONF_UNSET;[m
[31m-    clcf->aio_write = NGX_CONF_UNSET;[m
[31m-#if (NGX_THREADS)[m
[31m-    clcf->thread_pool = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->thread_pool_value = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-    clcf->read_ahead = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->directio = NGX_CONF_UNSET;[m
[31m-    clcf->directio_alignment = NGX_CONF_UNSET;[m
[31m-    clcf->tcp_nopush = NGX_CONF_UNSET;[m
[31m-    clcf->tcp_nodelay = NGX_CONF_UNSET;[m
[31m-    clcf->send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->postpone_output = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->limit_rate_after = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->keepalive_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->keepalive_header = NGX_CONF_UNSET;[m
[31m-    clcf->keepalive_requests = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->lingering_close = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->lingering_time = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->lingering_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->resolver_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->reset_timedout_connection = NGX_CONF_UNSET;[m
[31m-    clcf->server_name_in_redirect = NGX_CONF_UNSET;[m
[31m-    clcf->port_in_redirect = NGX_CONF_UNSET;[m
[31m-    clcf->msie_padding = NGX_CONF_UNSET;[m
[31m-    clcf->msie_refresh = NGX_CONF_UNSET;[m
[31m-    clcf->log_not_found = NGX_CONF_UNSET;[m
[31m-    clcf->log_subrequest = NGX_CONF_UNSET;[m
[31m-    clcf->recursive_error_pages = NGX_CONF_UNSET;[m
[31m-    clcf->server_tokens = NGX_CONF_UNSET;[m
[31m-    clcf->chunked_transfer_encoding = NGX_CONF_UNSET;[m
[31m-    clcf->etag = NGX_CONF_UNSET;[m
[31m-    clcf->types_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->types_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    clcf->open_file_cache = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->open_file_cache_valid = NGX_CONF_UNSET;[m
[31m-    clcf->open_file_cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->open_file_cache_errors = NGX_CONF_UNSET;[m
[31m-    clcf->open_file_cache_events = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    clcf->gzip_vary = NGX_CONF_UNSET;[m
[31m-    clcf->gzip_http_version = NGX_CONF_UNSET_UINT;[m
[31m-#if (NGX_PCRE)[m
[31m-    clcf->gzip_disable = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-    clcf->gzip_disable_msie6 = 3;[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-    clcf->gzip_disable_degradation = 3;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    clcf->disable_symlinks = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->disable_symlinks_from = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    return clcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_core_text_html_type = ngx_string("text/html");[m
[31m-static ngx_str_t  ngx_http_core_image_gif_type = ngx_string("image/gif");[m
[31m-static ngx_str_t  ngx_http_core_image_jpeg_type = ngx_string("image/jpeg");[m
[31m-[m
[31m-static ngx_hash_key_t  ngx_http_core_default_types[] = {[m
[31m-    { ngx_string("html"), 0, &ngx_http_core_text_html_type },[m
[31m-    { ngx_string("gif"), 0, &ngx_http_core_image_gif_type },[m
[31m-    { ngx_string("jpg"), 0, &ngx_http_core_image_jpeg_type },[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *prev = parent;[m
[31m-    ngx_http_core_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_hash_key_t   *type;[m
[31m-    ngx_hash_init_t   types_hash;[m
[31m-[m
[31m-    if (conf->root.data == NULL) {[m
[31m-[m
[31m-        conf->alias = prev->alias;[m
[31m-        conf->root = prev->root;[m
[31m-        conf->root_lengths = prev->root_lengths;[m
[31m-        conf->root_values = prev->root_values;[m
[31m-[m
[31m-        if (prev->root.data == NULL) {[m
[31m-            ngx_str_set(&conf->root, "html");[m
[31m-[m
[31m-            if (ngx_conf_full_name(cf->cycle, &conf->root, 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->post_action.data == NULL) {[m
[31m-        conf->post_action = prev->post_action;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->types_hash_max_size,[m
[31m-                              prev->types_hash_max_size, 1024);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->types_hash_bucket_size,[m
[31m-                              prev->types_hash_bucket_size, 64);[m
[31m-[m
[31m-    conf->types_hash_bucket_size = ngx_align(conf->types_hash_bucket_size,[m
[31m-                                             ngx_cacheline_size);[m
[31m-[m
[31m-    /*[m
[31m-     * the special handling of the "types" directive in the "http" section[m
[31m-     * to inherit the http's conf->types_hash to all servers[m
[31m-     */[m
[31m-[m
[31m-    if (prev->types && prev->types_hash.buckets == NULL) {[m
[31m-[m
[31m-        types_hash.hash = &prev->types_hash;[m
[31m-        types_hash.key = ngx_hash_key_lc;[m
[31m-        types_hash.max_size = conf->types_hash_max_size;[m
[31m-        types_hash.bucket_size = conf->types_hash_bucket_size;[m
[31m-        types_hash.name = "types_hash";[m
[31m-        types_hash.pool = cf->pool;[m
[31m-        types_hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&types_hash, prev->types->elts, prev->types->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types == NULL) {[m
[31m-        conf->types = prev->types;[m
[31m-        conf->types_hash = prev->types_hash;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types == NULL) {[m
[31m-        conf->types = ngx_array_create(cf->pool, 3, sizeof(ngx_hash_key_t));[m
[31m-        if (conf->types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; ngx_http_core_default_types[i].key.len; i++) {[m
[31m-            type = ngx_array_push(conf->types);[m
[31m-            if (type == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            type->key = ngx_http_core_default_types[i].key;[m
[31m-            type->key_hash =[m
[31m-                       ngx_hash_key_lc(ngx_http_core_default_types[i].key.data,[m
[31m-                                       ngx_http_core_default_types[i].key.len);[m
[31m-            type->value = ngx_http_core_default_types[i].value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types_hash.buckets == NULL) {[m
[31m-[m
[31m-        types_hash.hash = &conf->types_hash;[m
[31m-        types_hash.key = ngx_hash_key_lc;[m
[31m-        types_hash.max_size = conf->types_hash_max_size;[m
[31m-        types_hash.bucket_size = conf->types_hash_bucket_size;[m
[31m-        types_hash.name = "types_hash";[m
[31m-        types_hash.pool = cf->pool;[m
[31m-        types_hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&types_hash, conf->types->elts, conf->types->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->error_log == NULL) {[m
[31m-        if (prev->error_log) {[m
[31m-            conf->error_log = prev->error_log;[m
[31m-        } else {[m
[31m-            conf->error_log = &cf->cycle->new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->default_type,[m
[31m-                              prev->default_type, "text/plain");[m
[31m-[m
[31m-    ngx_conf_merge_off_value(conf->client_max_body_size,[m
[31m-                              prev->client_max_body_size, 1 * 1024 * 1024);[m
[31m-    ngx_conf_merge_size_value(conf->client_body_buffer_size,[m
[31m-                              prev->client_body_buffer_size,[m
[31m-                              (size_t) 2 * ngx_pagesize);[m
[31m-    ngx_conf_merge_msec_value(conf->client_body_timeout,[m
[31m-                              prev->client_body_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->keepalive_disable,[m
[31m-                              prev->keepalive_disable,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_KEEPALIVE_DISABLE_MSIE6));[m
[31m-    ngx_conf_merge_uint_value(conf->satisfy, prev->satisfy,[m
[31m-                              NGX_HTTP_SATISFY_ALL);[m
[31m-    ngx_conf_merge_uint_value(conf->if_modified_since, prev->if_modified_since,[m
[31m-                              NGX_HTTP_IMS_EXACT);[m
[31m-    ngx_conf_merge_uint_value(conf->max_ranges, prev->max_ranges,[m
[31m-                              NGX_MAX_INT32_VALUE);[m
[31m-    ngx_conf_merge_uint_value(conf->client_body_in_file_only,[m
[31m-                              prev->client_body_in_file_only,[m
[31m-                              NGX_HTTP_REQUEST_BODY_FILE_OFF);[m
[31m-    ngx_conf_merge_value(conf->client_body_in_single_buffer,[m
[31m-                              prev->client_body_in_single_buffer, 0);[m
[31m-    ngx_conf_merge_value(conf->internal, prev->internal, 0);[m
[31m-    ngx_conf_merge_value(conf->sendfile, prev->sendfile, 0);[m
[31m-    ngx_conf_merge_size_value(conf->sendfile_max_chunk,[m
[31m-                              prev->sendfile_max_chunk, 0);[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    ngx_conf_merge_value(conf->aio, prev->aio, NGX_HTTP_AIO_OFF);[m
[31m-    ngx_conf_merge_value(conf->aio_write, prev->aio_write, 0);[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_conf_merge_ptr_value(conf->thread_pool, prev->thread_pool, NULL);[m
[31m-    ngx_conf_merge_ptr_value(conf->thread_pool_value, prev->thread_pool_value,[m
[31m-                             NULL);[m
[31m-#endif[m
[31m-    ngx_conf_merge_size_value(conf->read_ahead, prev->read_ahead, 0);[m
[31m-    ngx_conf_merge_off_value(conf->directio, prev->directio,[m
[31m-                              NGX_OPEN_FILE_DIRECTIO_OFF);[m
[31m-    ngx_conf_merge_off_value(conf->directio_alignment, prev->directio_alignment,[m
[31m-                              512);[m
[31m-    ngx_conf_merge_value(conf->tcp_nopush, prev->tcp_nopush, 0);[m
[31m-    ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->send_timeout, prev->send_timeout, 60000);[m
[31m-    ngx_conf_merge_size_value(conf->send_lowat, prev->send_lowat, 0);[m
[31m-    ngx_conf_merge_size_value(conf->postpone_output, prev->postpone_output,[m
[31m-                              1460);[m
[31m-    ngx_conf_merge_size_value(conf->limit_rate, prev->limit_rate, 0);[m
[31m-    ngx_conf_merge_size_value(conf->limit_rate_after, prev->limit_rate_after,[m
[31m-                              0);[m
[31m-    ngx_conf_merge_msec_value(conf->keepalive_timeout,[m
[31m-                              prev->keepalive_timeout, 75000);[m
[31m-    ngx_conf_merge_sec_value(conf->keepalive_header,[m
[31m-                              prev->keepalive_header, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->keepalive_requests,[m
[31m-                              prev->keepalive_requests, 100);[m
[31m-    ngx_conf_merge_uint_value(conf->lingering_close,[m
[31m-                              prev->lingering_close, NGX_HTTP_LINGERING_ON);[m
[31m-    ngx_conf_merge_msec_value(conf->lingering_time,[m
[31m-                              prev->lingering_time, 30000);[m
[31m-    ngx_conf_merge_msec_value(conf->lingering_timeout,[m
[31m-                              prev->lingering_timeout, 5000);[m
[31m-    ngx_conf_merge_msec_value(conf->resolver_timeout,[m
[31m-                              prev->resolver_timeout, 30000);[m
[31m-[m
[31m-    if (conf->resolver == NULL) {[m
[31m-[m
[31m-        if (prev->resolver == NULL) {[m
[31m-[m
[31m-            /*[m
[31m-             * create dummy resolver in http {} context[m
[31m-             * to inherit it in all servers[m
[31m-             */[m
[31m-[m
[31m-            prev->resolver = ngx_resolver_create(cf, NULL, 0);[m
[31m-            if (prev->resolver == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        conf->resolver = prev->resolver;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->client_body_temp_path,[m
[31m-                              prev->client_body_temp_path,[m
[31m-                              &ngx_http_client_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->reset_timedout_connection,[m
[31m-                              prev->reset_timedout_connection, 0);[m
[31m-    ngx_conf_merge_value(conf->server_name_in_redirect,[m
[31m-                              prev->server_name_in_redirect, 0);[m
[31m-    ngx_conf_merge_value(conf->port_in_redirect, prev->port_in_redirect, 1);[m
[31m-    ngx_conf_merge_value(conf->msie_padding, prev->msie_padding, 1);[m
[31m-    ngx_conf_merge_value(conf->msie_refresh, prev->msie_refresh, 0);[m
[31m-    ngx_conf_merge_value(conf->log_not_found, prev->log_not_found, 1);[m
[31m-    ngx_conf_merge_value(conf->log_subrequest, prev->log_subrequest, 0);[m
[31m-    ngx_conf_merge_value(conf->recursive_error_pages,[m
[31m-                              prev->recursive_error_pages, 0);[m
[31m-    ngx_conf_merge_value(conf->server_tokens, prev->server_tokens, 1);[m
[31m-    ngx_conf_merge_value(conf->chunked_transfer_encoding,[m
[31m-                              prev->chunked_transfer_encoding, 1);[m
[31m-    ngx_conf_merge_value(conf->etag, prev->etag, 1);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->open_file_cache,[m
[31m-                              prev->open_file_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_valid,[m
[31m-                              prev->open_file_cache_valid, 60);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->open_file_cache_min_uses,[m
[31m-                              prev->open_file_cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_errors,[m
[31m-                              prev->open_file_cache_errors, 0);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_events,[m
[31m-                              prev->open_file_cache_events, 0);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->gzip_vary, prev->gzip_vary, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->gzip_http_version, prev->gzip_http_version,[m
[31m-                              NGX_HTTP_VERSION_11);[m
[31m-    ngx_conf_merge_bitmask_value(conf->gzip_proxied, prev->gzip_proxied,[m
[31m-                              (NGX_CONF_BITMASK_SET|NGX_HTTP_GZIP_PROXIED_OFF));[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_conf_merge_ptr_value(conf->gzip_disable, prev->gzip_disable, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->gzip_disable_msie6 == 3) {[m
[31m-        conf->gzip_disable_msie6 =[m
[31m-            (prev->gzip_disable_msie6 == 3) ? 0 : prev->gzip_disable_msie6;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-    if (conf->gzip_disable_degradation == 3) {[m
[31m-        conf->gzip_disable_degradation =[m
[31m-            (prev->gzip_disable_degradation == 3) ?[m
[31m-                 0 : prev->gzip_disable_degradation;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    ngx_conf_merge_uint_value(conf->disable_symlinks, prev->disable_symlinks,[m
[31m-                              NGX_DISABLE_SYMLINKS_OFF);[m
[31m-    ngx_conf_merge_ptr_value(conf->disable_symlinks_from,[m
[31m-                             prev->disable_symlinks_from, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *cscf = conf;[m
[31m-[m
[31m-    ngx_str_t              *value, size;[m
[31m-    ngx_url_t               u;[m
[31m-    ngx_uint_t              n;[m
[31m-    ngx_http_listen_opt_t   lsopt;[m
[31m-[m
[31m-    cscf->listen = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.listen = 1;[m
[31m-    u.default_port = 80;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in \"%V\" of the \"listen\" directive",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));[m
[31m-[m
[31m-    ngx_memcpy(&lsopt.u.sockaddr, u.sockaddr, u.socklen);[m
[31m-[m
[31m-    lsopt.socklen = u.socklen;[m
[31m-    lsopt.backlog = NGX_LISTEN_BACKLOG;[m
[31m-    lsopt.rcvbuf = -1;[m
[31m-    lsopt.sndbuf = -1;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    lsopt.setfib = -1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    lsopt.fastopen = -1;[m
[31m-#endif[m
[31m-    lsopt.wildcard = u.wildcard;[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    lsopt.ipv6only = 1;[m
[31m-#endif[m
[31m-[m
[31m-    (void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.socklen, lsopt.addr,[m
[31m-                         NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-    for (n = 2; n < cf->args->nelts; n++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "default_server") == 0[m
[31m-            || ngx_strcmp(value[n].data, "default") == 0)[m
[31m-        {[m
[31m-            lsopt.default_server = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "bind") == 0) {[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        if (ngx_strncmp(value[n].data, "setfib=", 7) == 0) {[m
[31m-            lsopt.setfib = ngx_atoi(value[n].data + 7, value[n].len - 7);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.setfib == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid setfib \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        if (ngx_strncmp(value[n].data, "fastopen=", 9) == 0) {[m
[31m-            lsopt.fastopen = ngx_atoi(value[n].data + 9, value[n].len - 9);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.fastopen == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid fastopen \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "backlog=", 8) == 0) {[m
[31m-            lsopt.backlog = ngx_atoi(value[n].data + 8, value[n].len - 8);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.backlog == NGX_ERROR || lsopt.backlog == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid backlog \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "rcvbuf=", 7) == 0) {[m
[31m-            size.len = value[n].len - 7;[m
[31m-            size.data = value[n].data + 7;[m
[31m-[m
[31m-            lsopt.rcvbuf = ngx_parse_size(&size);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.rcvbuf == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid rcvbuf \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "sndbuf=", 7) == 0) {[m
[31m-            size.len = value[n].len - 7;[m
[31m-            size.data = value[n].data + 7;[m
[31m-[m
[31m-            lsopt.sndbuf = ngx_parse_size(&size);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.sndbuf == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid sndbuf \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "accept_filter=", 14) == 0) {[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-            lsopt.accept_filter = (char *) &value[n].data[14];[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "accept filters \"%V\" are not supported "[m
[31m-                               "on this platform, ignored",[m
[31m-                               &value[n]);[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "deferred") == 0) {[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-            lsopt.deferred_accept = 1;[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the deferred accept is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "ipv6only=o", 10) == 0) {[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            struct sockaddr  *sa;[m
[31m-[m
[31m-            sa = &lsopt.u.sockaddr;[m
[31m-[m
[31m-            if (sa->sa_family == AF_INET6) {[m
[31m-[m
[31m-                if (ngx_strcmp(&value[n].data[10], "n") == 0) {[m
[31m-                    lsopt.ipv6only = 1;[m
[31m-[m
[31m-                } else if (ngx_strcmp(&value[n].data[10], "ff") == 0) {[m
[31m-                    lsopt.ipv6only = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid ipv6only flags \"%s\"",[m
[31m-                                       &value[n].data[9]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                lsopt.set = 1;[m
[31m-                lsopt.bind = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "ipv6only is not supported "[m
[31m-                                   "on addr \"%s\", ignored", lsopt.addr);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "ipv6only is not supported "[m
[31m-                               "on this platform");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "reuseport") == 0) {[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            lsopt.reuseport = 1;[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "reuseport is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "ssl") == 0) {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            lsopt.ssl = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"ssl\" parameter requires "[m
[31m-                               "ngx_http_ssl_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "http2") == 0) {[m
[31m-#if (NGX_HTTP_V2)[m
[31m-            lsopt.http2 = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"http2\" parameter requires "[m
[31m-                               "ngx_http_v2_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "spdy") == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "invalid parameter \"spdy\": "[m
[31m-                               "ngx_http_spdy_module was superseded "[m
[31m-                               "by ngx_http_v2_module");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "so_keepalive=", 13) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[n].data[13], "on") == 0) {[m
[31m-                lsopt.so_keepalive = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[n].data[13], "off") == 0) {[m
[31m-                lsopt.so_keepalive = 2;[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-                u_char     *p, *end;[m
[31m-                ngx_str_t   s;[m
[31m-[m
[31m-                end = value[n].data + value[n].len;[m
[31m-                s.data = value[n].data + 13;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepidle = ngx_parse_time(&s, 1);[m
[31m-                    if (lsopt.tcp_keepidle == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepintvl = ngx_parse_time(&s, 1);[m
[31m-                    if (lsopt.tcp_keepintvl == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                if (s.data < end) {[m
[31m-                    s.len = end - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepcnt = ngx_atoi(s.data, s.len);[m
[31m-                    if (lsopt.tcp_keepcnt == NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (lsopt.tcp_keepidle == 0 && lsopt.tcp_keepintvl == 0[m
[31m-                    && lsopt.tcp_keepcnt == 0)[m
[31m-                {[m
[31m-                    goto invalid_so_keepalive;[m
[31m-                }[m
[31m-[m
[31m-                lsopt.so_keepalive = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"so_keepalive\" parameter accepts "[m
[31m-                                   "only \"on\" or \"off\" on this platform");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-        invalid_so_keepalive:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid so_keepalive value: \"%s\"",[m
[31m-                               &value[n].data[13]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "proxy_protocol") == 0) {[m
[31m-            lsopt.proxy_protocol = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[n]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_add_listen(cf, cscf, &lsopt) == NGX_OK) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *cscf = conf;[m
[31m-[m
[31m-    u_char                   ch;[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        ch = value[i].data[0];[m
[31m-[m
[31m-        if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.'))[m
[31m-            || (ch == '.' && value[i].len < 2))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "server name \"%V\" is invalid", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strchr(value[i].data, '/')) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "server name \"%V\" has suspicious symbols",[m
[31m-                               &value[i]);[m
[31m-        }[m
[31m-[m
[31m-        sn = ngx_array_push(&cscf->server_names);[m
[31m-        if (sn == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        sn->regex = NULL;[m
[31m-#endif[m
[31m-        sn->server = cscf;[m
[31m-[m
[31m-        if (ngx_strcasecmp(value[i].data, (u_char *) "$hostname") == 0) {[m
[31m-            sn->name = cf->cycle->hostname;[m
[31m-[m
[31m-        } else {[m
[31m-            sn->name = value[i];[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].data[0] != '~') {[m
[31m-            ngx_strlow(sn->name.data, sn->name.data, sn->name.len);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        {[m
[31m-        u_char               *p;[m
[31m-        ngx_regex_compile_t   rc;[m
[31m-        u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-        if (value[i].len == 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "empty regex in server name \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value[i].len--;[m
[31m-        value[i].data++;[m
[31m-[m
[31m-        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-        rc.pattern = value[i];[m
[31m-        rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-        rc.err.data = errstr;[m
[31m-[m
[31m-        for (p = value[i].data; p < value[i].data + value[i].len; p++) {[m
[31m-            if (*p >= 'A' && *p <= 'Z') {[m
[31m-                rc.options = NGX_REGEX_CASELESS;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        sn->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-        if (sn->regex == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sn->name = value[i];[m
[31m-        cscf->captures = (rc.captures > 0);[m
[31m-        }[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "using regex \"%V\" "[m
[31m-                           "requires PCRE library", &value[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_int_t                   alias;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    alias = (cmd->name.len == sizeof("alias") - 1) ? 1 : 0;[m
[31m-[m
[31m-    if (clcf->root.data) {[m
[31m-[m
[31m-        if ((clcf->alias != 0) == alias) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" directive is duplicate",[m
[31m-                               &cmd->name);[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" directive is duplicate, "[m
[31m-                               "\"%s\" directive was specified earlier",[m
[31m-                               &cmd->name, clcf->alias ? "alias" : "root");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->named && alias) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the \"alias\" directive cannot be used "[m
[31m-                           "inside the named location");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strstr(value[1].data, "$document_root")[m
[31m-        || ngx_strstr(value[1].data, "${document_root}"))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the $document_root variable cannot be used "[m
[31m-                           "in the \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstr(value[1].data, "$realpath_root")[m
[31m-        || ngx_strstr(value[1].data, "${realpath_root}"))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the $realpath_root variable cannot be used "[m
[31m-                           "in the \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->alias = alias ? clcf->name.len : 0;[m
[31m-    clcf->root = value[1];[m
[31m-[m
[31m-    if (!alias && clcf->root.len > 0[m
[31m-        && clcf->root.data[clcf->root.len - 1] == '/')[m
[31m-    {[m
[31m-        clcf->root.len--;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->root.data[0] != '$') {[m
[31m-        if (ngx_conf_full_name(cf->cycle, &clcf->root, 0) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&clcf->root);[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-    sc.variables = n;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (alias && clcf->regex) {[m
[31m-        clcf->alias = NGX_MAX_SIZE_T_VALUE;[m
[31m-        n = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (n) {[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &clcf->root;[m
[31m-        sc.lengths = &clcf->root_lengths;[m
[31m-        sc.values = &clcf->root_values;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_method_name_t  ngx_methods_names[] = {[m
[31m-    { (u_char *) "GET",       (uint32_t) ~NGX_HTTP_GET },[m
[31m-    { (u_char *) "HEAD",      (uint32_t) ~NGX_HTTP_HEAD },[m
[31m-    { (u_char *) "POST",      (uint32_t) ~NGX_HTTP_POST },[m
[31m-    { (u_char *) "PUT",       (uint32_t) ~NGX_HTTP_PUT },[m
[31m-    { (u_char *) "DELETE",    (uint32_t) ~NGX_HTTP_DELETE },[m
[31m-    { (u_char *) "MKCOL",     (uint32_t) ~NGX_HTTP_MKCOL },[m
[31m-    { (u_char *) "COPY",      (uint32_t) ~NGX_HTTP_COPY },[m
[31m-    { (u_char *) "MOVE",      (uint32_t) ~NGX_HTTP_MOVE },[m
[31m-    { (u_char *) "OPTIONS",   (uint32_t) ~NGX_HTTP_OPTIONS },[m
[31m-    { (u_char *) "PROPFIND",  (uint32_t) ~NGX_HTTP_PROPFIND },[m
[31m-    { (u_char *) "PROPPATCH", (uint32_t) ~NGX_HTTP_PROPPATCH },[m
[31m-    { (u_char *) "LOCK",      (uint32_t) ~NGX_HTTP_LOCK },[m
[31m-    { (u_char *) "UNLOCK",    (uint32_t) ~NGX_HTTP_UNLOCK },[m
[31m-    { (u_char *) "PATCH",     (uint32_t) ~NGX_HTTP_PATCH },[m
[31m-    { NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_limit_except(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *pclcf = conf;[m
[31m-[m
[31m-    char                      *rv;[m
[31m-    void                      *mconf;[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_conf_t                 save;[m
[31m-    ngx_http_module_t         *module;[m
[31m-    ngx_http_conf_ctx_t       *ctx, *pctx;[m
[31m-    ngx_http_method_name_t    *name;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (pclcf->limit_except) {[m
[31m-        return "duplicate";[m
[31m-    }[m
[31m-[m
[31m-    pclcf->limit_except = 0xffffffff;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        for (name = ngx_methods_names; name->name; name++) {[m
[31m-[m
[31m-            if (ngx_strcasecmp(value[i].data, name->name) == 0) {[m
[31m-                pclcf->limit_except &= name->method;[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid method \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    if (!(pclcf->limit_except & NGX_HTTP_GET)) {[m
[31m-        pclcf->limit_except &= (uint32_t) ~NGX_HTTP_HEAD;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    pclcf->limit_except_loc_conf = ctx->loc_conf;[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-    clcf->name = pclcf->name;[m
[31m-    clcf->noname = 1;[m
[31m-    clcf->lmt_excpt = 1;[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_LMT_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_set_aio(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->aio != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    clcf->thread_pool = NULL;[m
[31m-    clcf->thread_pool_value = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        clcf->aio = NGX_HTTP_AIO_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-        clcf->aio = NGX_HTTP_AIO_ON;[m
[31m-        return NGX_CONF_OK;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"aio on\" "[m
[31m-                           "is unsupported on this platform");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "sendfile") == 0) {[m
[31m-        clcf->aio = NGX_HTTP_AIO_ON;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "the \"sendfile\" parameter of "[m
[31m-                           "the \"aio\" directive is deprecated");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "threads", 7) == 0[m
[31m-        && (value[1].len == 7 || value[1].data[7] == '='))[m
[31m-    {[m
[31m-#if (NGX_THREADS)[m
[31m-        ngx_str_t                          name;[m
[31m-        ngx_thread_pool_t                 *tp;[m
[31m-        ngx_http_complex_value_t           cv;[m
[31m-        ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-        clcf->aio = NGX_HTTP_AIO_THREADS;[m
[31m-[m
[31m-        if (value[1].len >= 8) {[m
[31m-            name.len = value[1].len - 8;[m
[31m-            name.data = value[1].data + 8;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &name;[m
[31m-            ccv.complex_value = &cv;[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (cv.lengths != NULL) {[m
[31m-                clcf->thread_pool_value = ngx_palloc(cf->pool,[m
[31m-                                    sizeof(ngx_http_complex_value_t));[m
[31m-                if (clcf->thread_pool_value == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                *clcf->thread_pool_value = cv;[m
[31m-[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            tp = ngx_thread_pool_add(cf, &name);[m
[31m-[m
[31m-        } else {[m
[31m-            tp = ngx_thread_pool_add(cf, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf->thread_pool = tp;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"aio threads\" "[m
[31m-                           "is unsupported on this platform");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return "invalid value";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->directio != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        clcf->directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf->directio = ngx_parse_offset(&value[1]);[m
[31m-    if (clcf->directio == (off_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_int_t                          overwrite;[m
[31m-    ngx_str_t                         *value, uri, args;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_http_err_page_t               *err;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return "conflicts with \"no_error_pages\"";[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->error_pages == NGX_CONF_UNSET_PTR) {[m
[31m-        clcf->error_pages = ngx_array_create(cf->pool, 4,[m
[31m-                                             sizeof(ngx_http_err_page_t));[m
[31m-        if (clcf->error_pages == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    i = cf->args->nelts - 2;[m
[31m-[m
[31m-    if (value[i].data[0] == '=') {[m
[31m-        if (i == 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > 1) {[m
[31m-            overwrite = ngx_atoi(&value[i].data[1], value[i].len - 1);[m
[31m-[m
[31m-            if (overwrite == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            overwrite = 0;[m
[31m-        }[m
[31m-[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        overwrite = -1;[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    uri = value[cf->args->nelts - 1];[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &uri;[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_null(&args);[m
[31m-[m
[31m-    if (cv.lengths == NULL && uri.len && uri.data[0] == '/') {[m
[31m-        p = (u_char *) ngx_strchr(uri.data, '?');[m
[31m-[m
[31m-        if (p) {[m
[31m-            cv.value.len = p - uri.data;[m
[31m-            cv.value.data = uri.data;[m
[31m-            p++;[m
[31m-            args.len = (uri.data + uri.len) - p;[m
[31m-            args.data = p;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts - n; i++) {[m
[31m-        err = ngx_array_push(clcf->error_pages);[m
[31m-        if (err == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        err->status = ngx_atoi(value[i].data, value[i].len);[m
[31m-[m
[31m-        if (err->status == NGX_ERROR || err->status == 499) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (err->status < 300 || err->status > 599) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "value \"%V\" must be between 300 and 599",[m
[31m-                               &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        err->overwrite = overwrite;[m
[31m-[m
[31m-        if (overwrite == -1) {[m
[31m-            switch (err->status) {[m
[31m-                case NGX_HTTP_TO_HTTPS:[m
[31m-                case NGX_HTTPS_CERT_ERROR:[m
[31m-                case NGX_HTTPS_NO_CERT:[m
[31m-                    err->overwrite = NGX_HTTP_BAD_REQUEST;[m
[31m-                default:[m
[31m-                    break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        err->value = cv;[m
[31m-        err->args = args;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->error_pages != NGX_CONF_UNSET_PTR) {[m
[31m-        return "conflicts with \"error_page\"";[m
[31m-    }[m
[31m-[m
[31m-    clcf->error_pages = NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_int_t                   code;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_try_file_t        *tf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    if (clcf->try_files) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    cmcf->try_files = 1;[m
[31m-[m
[31m-    tf = ngx_pcalloc(cf->pool, cf->args->nelts * sizeof(ngx_http_try_file_t));[m
[31m-    if (tf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->try_files = tf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 0; i < cf->args->nelts - 1; i++) {[m
[31m-[m
[31m-        tf[i].name = value[i + 1];[m
[31m-[m
[31m-        if (tf[i].name.len > 0[m
[31m-            && tf[i].name.data[tf[i].name.len - 1] == '/'[m
[31m-            && i + 2 < cf->args->nelts)[m
[31m-        {[m
[31m-            tf[i].test_dir = 1;[m
[31m-            tf[i].name.len--;[m
[31m-            tf[i].name.data[tf[i].name.len] = '\0';[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_http_script_variables_count(&tf[i].name);[m
[31m-[m
[31m-        if (n) {[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &tf[i].name;[m
[31m-            sc.lengths = &tf[i].lengths;[m
[31m-            sc.values = &tf[i].values;[m
[31m-            sc.variables = n;[m
[31m-            sc.complete_lengths = 1;[m
[31m-            sc.complete_values = 1;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* add trailing '\0' to length */[m
[31m-            tf[i].name.len++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (tf[i - 1].name.data[0] == '=') {[m
[31m-[m
[31m-        code = ngx_atoi(tf[i - 1].name.data + 1, tf[i - 1].name.len - 2);[m
[31m-[m
[31m-        if (code == NGX_ERROR || code > 999) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid code \"%*s\"",[m
[31m-                               tf[i - 1].name.len - 1, tf[i - 1].name.data);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tf[i].code = code;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    time_t       inactive;[m
[31m-    ngx_str_t   *value, s;[m
[31m-    ngx_int_t    max;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (clcf->open_file_cache != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    max = 0;[m
[31m-    inactive = 60;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", 4) == 0) {[m
[31m-[m
[31m-            max = ngx_atoi(value[i].data + 4, value[i].len - 4);[m
[31m-            if (max <= 0) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-[m
[31m-            clcf->open_file_cache = NULL;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    failed:[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid \"open_file_cache\" parameter \"%V\"",[m
[31m-                           &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->open_file_cache == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (max == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "\"open_file_cache\" must have the \"max\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive);[m
[31m-    if (clcf->open_file_cache) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &clcf->error_log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->keepalive_timeout != NGX_CONF_UNSET_MSEC) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    clcf->keepalive_timeout = ngx_parse_time(&value[1], 0);[m
[31m-[m
[31m-    if (clcf->keepalive_timeout == (ngx_msec_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf->keepalive_header = ngx_parse_time(&value[2], 1);[m
[31m-[m
[31m-    if (clcf->keepalive_header == (time_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_internal(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    if (clcf->internal != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf->internal = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->resolver) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    clcf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);[m
[31m-    if (clcf->resolver == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf = conf;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_regex_elt_t      *re;[m
[31m-    ngx_regex_compile_t   rc;[m
[31m-    u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    if (clcf->gzip_disable == NGX_CONF_UNSET_PTR) {[m
[31m-        clcf->gzip_disable = ngx_array_create(cf->pool, 2,[m
[31m-                                              sizeof(ngx_regex_elt_t));[m
[31m-        if (clcf->gzip_disable == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "msie6") == 0) {[m
[31m-            clcf->gzip_disable_msie6 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "degradation") == 0) {[m
[31m-            clcf->gzip_disable_degradation = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        re = ngx_array_push(clcf->gzip_disable);[m
[31m-        if (re == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc.pattern = value[i];[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-[m
[31m-        if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        re->regex = rc.regex;[m
[31m-        re->name = value[i].data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (ngx_strcmp(value[i].data, "msie6") == 0) {[m
[31m-            clcf->gzip_disable_msie6 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "degradation") == 0) {[m
[31m-            clcf->gzip_disable_degradation = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "without PCRE library \"gzip_disable\" supports "[m
[31m-                           "builtin \"msie6\" and \"degradation\" mask only");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_disable_symlinks(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (clcf->disable_symlinks != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_OFF;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "if_not_owner") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_NOTOWNER;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "on") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_ON;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "from=", 5) == 0) {[m
[31m-            value[i].len -= 5;[m
[31m-            value[i].data += 5;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &value[i];[m
[31m-            ccv.complex_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_complex_value_t));[m
[31m-            if (ccv.complex_value == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            clcf->disable_symlinks_from = ccv.complex_value;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks == NGX_CONF_UNSET_UINT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"off\", \"on\" "[m
[31m-                           "or \"if_not_owner\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        clcf->disable_symlinks_from = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks_from == NGX_CONF_UNSET_PTR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate parameters \"%V %V\"",[m
[31m-                           &value[1], &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"from=\" cannot be used with \"off\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_pool_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp < NGX_MIN_POOL_SIZE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be no less than %uz",[m
[31m-                           NGX_MIN_POOL_SIZE);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*sp % NGX_POOL_ALIGNMENT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be a multiple of %uz",[m
[31m-                           NGX_POOL_ALIGNMENT);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 0e1c34a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,5435 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    *name;[m
[31m-    uint32_t   method;[m
[31m-} ngx_http_method_name_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_OFF    0[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_ON     1[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_CLEAN  2[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_core_find_static_location(ngx_http_request_t *r,[m
[31m-    ngx_http_location_tree_node_t *node);[m
[31m-[m
[31m-static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_core_postconfiguration(ngx_conf_t *cf);[m
[31m-static void *ngx_http_core_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_core_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_merge_srv_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static void *ngx_http_core_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static char *ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static ngx_int_t ngx_http_core_regex_location(ngx_conf_t *cf,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *regex, ngx_uint_t caseless);[m
[31m-[m
[31m-static char *ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_core_limit_except(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_set_aio(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_internal(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae);[m
[31m-static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last);[m
[31m-static char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r,[m
[31m-    ngx_addr_t *addr, u_char *xff, size_t xfflen, ngx_array_t *proxies,[m
[31m-    int recursive);[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-static char *ngx_http_disable_symlinks(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_core_pool_size(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_core_lowat_post =[m
[31m-    { ngx_http_core_lowat_check };[m
[31m-[m
[31m-static ngx_conf_post_handler_pt  ngx_http_core_pool_size_p =[m
[31m-    ngx_http_core_pool_size;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_request_body_in_file[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_REQUEST_BODY_FILE_ON },[m
[31m-    { ngx_string("clean"), NGX_HTTP_REQUEST_BODY_FILE_CLEAN },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_satisfy[] = {[m
[31m-    { ngx_string("all"), NGX_HTTP_SATISFY_ALL },[m
[31m-    { ngx_string("any"), NGX_HTTP_SATISFY_ANY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_lingering_close[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_LINGERING_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_LINGERING_ON },[m
[31m-    { ngx_string("always"), NGX_HTTP_LINGERING_ALWAYS },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_if_modified_since[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_IMS_OFF },[m
[31m-    { ngx_string("exact"), NGX_HTTP_IMS_EXACT },[m
[31m-    { ngx_string("before"), NGX_HTTP_IMS_BEFORE },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_core_keepalive_disable[] = {[m
[31m-    { ngx_string("none"), NGX_HTTP_KEEPALIVE_DISABLE_NONE },[m
[31m-    { ngx_string("msie6"), NGX_HTTP_KEEPALIVE_DISABLE_MSIE6 },[m
[31m-    { ngx_string("safari"), NGX_HTTP_KEEPALIVE_DISABLE_SAFARI },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_client_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_CLIENT_TEMP_PATH), { 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_gzip_http_version[] = {[m
[31m-    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },[m
[31m-    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_gzip_proxied_mask[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_GZIP_PROXIED_OFF },[m
[31m-    { ngx_string("expired"), NGX_HTTP_GZIP_PROXIED_EXPIRED },[m
[31m-    { ngx_string("no-cache"), NGX_HTTP_GZIP_PROXIED_NO_CACHE },[m
[31m-    { ngx_string("no-store"), NGX_HTTP_GZIP_PROXIED_NO_STORE },[m
[31m-    { ngx_string("private"), NGX_HTTP_GZIP_PROXIED_PRIVATE },[m
[31m-    { ngx_string("no_last_modified"), NGX_HTTP_GZIP_PROXIED_NO_LM },[m
[31m-    { ngx_string("no_etag"), NGX_HTTP_GZIP_PROXIED_NO_ETAG },[m
[31m-    { ngx_string("auth"), NGX_HTTP_GZIP_PROXIED_AUTH },[m
[31m-    { ngx_string("any"), NGX_HTTP_GZIP_PROXIED_ANY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_gzip_no_cache = ngx_string("no-cache");[m
[31m-static ngx_str_t  ngx_http_gzip_no_store = ngx_string("no-store");[m
[31m-static ngx_str_t  ngx_http_gzip_private = ngx_string("private");[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("variables_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, variables_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("variables_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, variables_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_names_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, server_names_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_names_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, server_names_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_server,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("connection_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, connection_pool_size),[m
[31m-      &ngx_http_core_pool_size_p },[m
[31m-[m
[31m-    { ngx_string("request_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, request_pool_size),[m
[31m-      &ngx_http_core_pool_size_p },[m
[31m-[m
[31m-    { ngx_string("client_header_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, client_header_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_header_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, client_header_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("large_client_header_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, large_client_header_buffers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ignore_invalid_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, ignore_invalid_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("merge_slashes"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, merge_slashes),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("underscores_in_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, underscores_in_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("location"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_location,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("listen"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_listen,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_server_name,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, types_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, types_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                                          |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_types,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("default_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, default_type),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("root"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("alias"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_except"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_limit_except,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_max_body_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_max_body_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_in_file_only"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_in_file_only),[m
[31m-      &ngx_http_core_request_body_in_file },[m
[31m-[m
[31m-    { ngx_string("client_body_in_single_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_in_single_buffer),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sendfile"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, sendfile),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sendfile_max_chunk"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, sendfile_max_chunk),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("aio"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_set_aio,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("aio_write"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, aio_write),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("read_ahead"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, read_ahead),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("directio"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_directio,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("directio_alignment"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, directio_alignment),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nopush"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, tcp_nopush),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nodelay"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, tcp_nodelay),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, send_lowat),[m
[31m-      &ngx_http_core_lowat_post },[m
[31m-[m
[31m-    { ngx_string("postpone_output"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, postpone_output),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_rate_after"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, limit_rate_after),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_keepalive,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_requests"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, keepalive_requests),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_disable"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, keepalive_disable),[m
[31m-      &ngx_http_core_keepalive_disable },[m
[31m-[m
[31m-    { ngx_string("satisfy"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, satisfy),[m
[31m-      &ngx_http_core_satisfy },[m
[31m-[m
[31m-    { ngx_string("internal"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_internal,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lingering_close"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_close),[m
[31m-      &ngx_http_core_lingering_close },[m
[31m-[m
[31m-    { ngx_string("lingering_time"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_time),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lingering_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("reset_timedout_connection"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, reset_timedout_connection),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name_in_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, server_name_in_redirect),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("port_in_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, port_in_redirect),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("msie_padding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, msie_padding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("msie_refresh"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, msie_refresh),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_not_found"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, log_not_found),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_subrequest"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, log_subrequest),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("recursive_error_pages"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, recursive_error_pages),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_tokens"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, server_tokens),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("if_modified_since"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, if_modified_since),[m
[31m-      &ngx_http_core_if_modified_since },[m
[31m-[m
[31m-    { ngx_string("max_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, max_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("chunked_transfer_encoding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, chunked_transfer_encoding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("etag"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, etag),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_page"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_2MORE,[m
[31m-      ngx_http_core_error_page,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("no_error_pages"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_no_error_pages,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("try_files"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_core_try_files,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("post_action"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, post_action),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_error_log,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_open_file_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_events"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_events),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_resolver,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, resolver_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-    { ngx_string("gzip_vary"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_vary),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_http_version"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_http_version),[m
[31m-      &ngx_http_gzip_http_version },[m
[31m-[m
[31m-    { ngx_string("gzip_proxied"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_proxied),[m
[31m-      &ngx_http_gzip_proxied_mask },[m
[31m-[m
[31m-    { ngx_string("gzip_disable"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_gzip_disable,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-    { ngx_string("disable_symlinks"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_disable_symlinks,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_core_module_ctx = {[m
[31m-    ngx_http_core_preconfiguration,        /* preconfiguration */[m
[31m-    ngx_http_core_postconfiguration,       /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_core_create_main_conf,        /* create main configuration */[m
[31m-    ngx_http_core_init_main_conf,          /* init main configuration */[m
[31m-[m
[31m-    ngx_http_core_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_http_core_merge_srv_conf,          /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_core_create_loc_conf,         /* create location configuration */[m
[31m-    ngx_http_core_merge_loc_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_core_module_ctx,             /* module context */[m
[31m-    ngx_http_core_commands,                /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_core_get_method = { 3, (u_char *) "GET" };[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    r->connection->log->action = NULL;[m
[31m-[m
[31m-    r->connection->unexpected_eof = 0;[m
[31m-[m
[31m-    if (!r->internal) {[m
[31m-        switch (r->headers_in.connection_type) {[m
[31m-        case 0:[m
[31m-            r->keepalive = (r->http_version > NGX_HTTP_VERSION_10);[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_CONNECTION_CLOSE:[m
[31m-            r->keepalive = 0;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_CONNECTION_KEEP_ALIVE:[m
[31m-            r->keepalive = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        r->lingering_close = (r->headers_in.content_length_n > 0[m
[31m-                              || r->headers_in.chunked);[m
[31m-        r->phase_handler = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-        r->phase_handler = cmcf->phase_engine.server_rewrite_index;[m
[31m-    }[m
[31m-[m
[31m-    r->valid_location = 1;[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    r->gzip_tested = 0;[m
[31m-    r->gzip_ok = 0;[m
[31m-    r->gzip_vary = 0;[m
[31m-#endif[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    ngx_http_core_run_phases(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_core_run_phases(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_phase_handler_t   *ph;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ph = cmcf->phase_engine.handlers;[m
[31m-[m
[31m-    while (ph[r->phase_handler].checker) {[m
[31m-[m
[31m-        rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_generic_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    /*[m
[31m-     * generic phase checker,[m
[31m-     * used by the post read and pre-access phases[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "generic phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->phase_handler = ph->next;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_rewrite_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rewrite phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* NGX_OK, NGX_AGAIN, NGX_ERROR, NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_find_config_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     len;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->content_handler = NULL;[m
[31m-    r->uri_changed = 0;[m
[31m-[m
[31m-    rc = ngx_http_core_find_location(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->internal && clcf->internal) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "using configuration \"%s%V\"",[m
[31m-                   (clcf->noname ? "*" : (clcf->exact_match ? "=" : "")),[m
[31m-                   &clcf->name);[m
[31m-[m
[31m-    ngx_http_update_location_config(r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http cl:%O max:%O",[m
[31m-                   r->headers_in.content_length_n, clcf->client_max_body_size);[m
[31m-[m
[31m-    if (r->headers_in.content_length_n != -1[m
[31m-        && !r->discard_body[m
[31m-        && clcf->client_max_body_size[m
[31m-        && clcf->client_max_body_size < r->headers_in.content_length_n)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client intended to send too large body: %O bytes",[m
[31m-                      r->headers_in.content_length_n);[m
[31m-[m
[31m-        r->expect_tested = 1;[m
[31m-        (void) ngx_http_discard_request_body(r);[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_ENTITY_TOO_LARGE);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not need to set the r->headers_out.location->hash and[m
[31m-         * r->headers_out.location->key fields[m
[31m-         */[m
[31m-[m
[31m-        if (r->args.len == 0) {[m
[31m-            r->headers_out.location->value = clcf->name;[m
[31m-[m
[31m-        } else {[m
[31m-            len = clcf->name.len + 1 + r->args.len;[m
[31m-            p = ngx_pnalloc(r->pool, len);[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            r->headers_out.location->value.len = len;[m
[31m-            r->headers_out.location->value.data = p;[m
[31m-[m
[31m-            p = ngx_cpymem(p, clcf->name.data, clcf->name.len);[m
[31m-            *p++ = '?';[m
[31m-            ngx_memcpy(p, r->args.data, r->args.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_MOVED_PERMANENTLY);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler++;[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_post_rewrite_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post rewrite phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    if (!r->uri_changed) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uri changes: %d", r->uri_changes);[m
[31m-[m
[31m-    /*[m
[31m-     * gcc before 3.3 compiles the broken code for[m
[31m-     *     if (r->uri_changes-- == 0)[m
[31m-     * if the r->uri_changes is defined as[m
[31m-     *     unsigned  uri_changes:4[m
[31m-     */[m
[31m-[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while processing \"%V\"", &r->uri);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler = ph->next;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_access_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        r->phase_handler = ph->next;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "access phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) {[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->phase_handler++;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->access_code = 0;[m
[31m-[m
[31m-            if (r->headers_out.www_authenticate) {[m
[31m-                r->headers_out.www_authenticate->hash = 0;[m
[31m-            }[m
[31m-[m
[31m-            r->phase_handler = ph->next;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_FORBIDDEN || rc == NGX_HTTP_UNAUTHORIZED) {[m
[31m-            if (r->access_code != NGX_HTTP_UNAUTHORIZED) {[m
[31m-                r->access_code = rc;[m
[31m-            }[m
[31m-[m
[31m-            r->phase_handler++;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_post_access_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  access_code;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post access phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    access_code = r->access_code;[m
[31m-[m
[31m-    if (access_code) {[m
[31m-        if (access_code == NGX_HTTP_FORBIDDEN) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "access forbidden by rule");[m
[31m-        }[m
[31m-[m
[31m-        r->access_code = 0;[m
[31m-        ngx_http_finalize_request(r, access_code);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler++;[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_try_files_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    size_t                        len, root, alias, reserve, allocated;[m
[31m-    u_char                       *p, *name;[m
[31m-    ngx_str_t                     path, args;[m
[31m-    ngx_uint_t                    test_dir;[m
[31m-    ngx_http_try_file_t          *tf;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "try files phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->try_files == NULL) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    allocated = 0;[m
[31m-    root = 0;[m
[31m-    name = NULL;[m
[31m-    /* suppress MSVC warning */[m
[31m-    path.data = NULL;[m
[31m-[m
[31m-    tf = clcf->try_files;[m
[31m-[m
[31m-    alias = clcf->alias;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (tf->lengths) {[m
[31m-            ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-            e.ip = tf->lengths->elts;[m
[31m-            e.request = r;[m
[31m-[m
[31m-            /* 1 is for terminating '\0' as in static names */[m
[31m-            len = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-                len += lcode(&e);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            len = tf->name.len;[m
[31m-        }[m
[31m-[m
[31m-        if (!alias) {[m
[31m-            reserve = len > r->uri.len ? len - r->uri.len : 0;[m
[31m-[m
[31m-        } else if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            reserve = len;[m
[31m-[m
[31m-        } else {[m
[31m-            reserve = len > r->uri.len - alias ? len - (r->uri.len - alias) : 0;[m
[31m-        }[m
[31m-[m
[31m-        if (reserve > allocated || !allocated) {[m
[31m-[m
[31m-            /* 16 bytes are preallocation */[m
[31m-            allocated = reserve + 16;[m
[31m-[m
[31m-            if (ngx_http_map_uri_to_path(r, &path, &root, allocated) == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            name = path.data + root;[m
[31m-        }[m
[31m-[m
[31m-        if (tf->values == NULL) {[m
[31m-[m
[31m-            /* tf->name.len includes the terminating '\0' */[m
[31m-[m
[31m-            ngx_memcpy(name, tf->name.data, tf->name.len);[m
[31m-[m
[31m-            path.len = (name + tf->name.len - 1) - path.data;[m
[31m-[m
[31m-        } else {[m
[31m-            e.ip = tf->values->elts;[m
[31m-            e.pos = name;[m
[31m-            e.flushed = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-[m
[31m-            path.len = e.pos - path.data;[m
[31m-[m
[31m-            *e.pos = '\0';[m
[31m-[m
[31m-            if (alias && alias != NGX_MAX_SIZE_T_VALUE[m
[31m-                && ngx_strncmp(name, r->uri.data, alias) == 0)[m
[31m-            {[m
[31m-                ngx_memmove(name, name + alias, len - alias);[m
[31m-                path.len -= alias;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        test_dir = tf->test_dir;[m
[31m-[m
[31m-        tf++;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "trying to use %s: \"%s\" \"%s\"",[m
[31m-                       test_dir ? "dir" : "file", name, path.data);[m
[31m-[m
[31m-        if (tf->lengths == NULL && tf->name.len == 0) {[m
[31m-[m
[31m-            if (tf->code) {[m
[31m-                ngx_http_finalize_request(r, tf->code);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            path.len -= root;[m
[31m-            path.data += root;[m
[31m-[m
[31m-            if (path.data[0] == '@') {[m
[31m-                (void) ngx_http_named_location(r, &path);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_http_split_args(r, &path, &args);[m
[31m-[m
[31m-                (void) ngx_http_internal_redirect(r, &path, &args);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_DONE);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.read_ahead = clcf->read_ahead;[m
[31m-        of.directio = clcf->directio;[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            if (of.err != NGX_ENOENT[m
[31m-                && of.err != NGX_ENOTDIR[m
[31m-                && of.err != NGX_ENAMETOOLONG)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                              "%s \"%s\" failed", of.failed, path.data);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (of.is_dir != test_dir) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        path.len -= root;[m
[31m-        path.data += root;[m
[31m-[m
[31m-        if (!alias) {[m
[31m-            r->uri = path;[m
[31m-[m
[31m-        } else if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            if (!test_dir) {[m
[31m-                r->uri = path;[m
[31m-                r->add_uri_to_alias = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            name = r->uri.data;[m
[31m-[m
[31m-            r->uri.len = alias + path.len;[m
[31m-            r->uri.data = ngx_pnalloc(r->pool, r->uri.len);[m
[31m-            if (r->uri.data == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_copy(r->uri.data, name, alias);[m
[31m-            ngx_memcpy(p, path.data, path.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_exten(r);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "try file uri: \"%V\"", &r->uri);[m
[31m-[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* not reached */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_content_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    size_t     root;[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_str_t  path;[m
[31m-[m
[31m-    if (r->content_handler) {[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-        ngx_http_finalize_request(r, r->content_handler(r));[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "content phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc != NGX_DECLINED) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    ph++;[m
[31m-[m
[31m-    if (ph->checker) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* no content handler was found */[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) != NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "directory index of \"%s\" is forbidden", path.data);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_FORBIDDEN);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no handler found");[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_update_location_config(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->method & clcf->limit_except) {[m
[31m-        r->loc_conf = clcf->limit_except_loc_conf;[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_io.flags & NGX_IO_SENDFILE) && clcf->sendfile) {[m
[31m-        r->connection->sendfile = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        r->connection->sendfile = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->client_body_in_file_only) {[m
[31m-        r->request_body_in_file_only = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file =[m
[31m-            clcf->client_body_in_file_only == NGX_HTTP_REQUEST_BODY_FILE_CLEAN;[m
[31m-        r->request_body_file_log_level = NGX_LOG_NOTICE;[m
[31m-[m
[31m-    } else {[m
[31m-        r->request_body_file_log_level = NGX_LOG_WARN;[m
[31m-    }[m
[31m-[m
[31m-    r->request_body_in_single_buf = clcf->client_body_in_single_buffer;[m
[31m-[m
[31m-    if (r->keepalive) {[m
[31m-        if (clcf->keepalive_timeout == 0) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->connection->requests >= clcf->keepalive_requests) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->headers_in.msie6[m
[31m-                   && r->method == NGX_HTTP_POST[m
[31m-                   && (clcf->keepalive_disable[m
[31m-                       & NGX_HTTP_KEEPALIVE_DISABLE_MSIE6))[m
[31m-        {[m
[31m-            /*[m
[31m-             * MSIE may wait for some time if an response for[m
[31m-             * a POST request was sent over a keepalive connection[m
[31m-             */[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->headers_in.safari[m
[31m-                   && (clcf->keepalive_disable[m
[31m-                       & NGX_HTTP_KEEPALIVE_DISABLE_SAFARI))[m
[31m-        {[m
[31m-            /*[m
[31m-             * Safari may send a POST request to a closed keepalive[m
[31m-             * connection and may stall for some time, see[m
[31m-             *     https://bugs.webkit.org/show_bug.cgi?id=5760[m
[31m-             */[m
[31m-            r->keepalive = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!clcf->tcp_nopush) {[m
[31m-        /* disable TCP_NOPUSH/TCP_CORK use */[m
[31m-        r->connection->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->limit_rate == 0) {[m
[31m-        r->limit_rate = clcf->limit_rate;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->handler) {[m
[31m-        r->content_handler = clcf->handler;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_OK       - exact or regex match[m
[31m- * NGX_DONE     - auto redirect[m
[31m- * NGX_AGAIN    - inclusive match[m
[31m- * NGX_ERROR    - regex error[m
[31m- * NGX_DECLINED - no match[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_find_location(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *pclcf;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                  n;[m
[31m-    ngx_uint_t                 noregex;[m
[31m-    ngx_http_core_loc_conf_t  *clcf, **clcfp;[m
[31m-[m
[31m-    noregex = 0;[m
[31m-#endif[m
[31m-[m
[31m-    pclcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rc = ngx_http_core_find_static_location(r, pclcf->static_locations);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        noregex = clcf->noregex;[m
[31m-#endif[m
[31m-[m
[31m-        /* look up nested locations */[m
[31m-[m
[31m-        rc = ngx_http_core_find_location(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DONE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED or rc == NGX_AGAIN in nested location */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (noregex == 0 && pclcf->regex_locations) {[m
[31m-[m
[31m-        for (clcfp = pclcf->regex_locations; *clcfp; clcfp++) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "test location: ~ \"%V\"", &(*clcfp)->name);[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, (*clcfp)->regex, &r->uri);[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                r->loc_conf = (*clcfp)->loc_conf;[m
[31m-[m
[31m-                /* look up nested locations */[m
[31m-[m
[31m-                rc = ngx_http_core_find_location(r);[m
[31m-[m
[31m-                return (rc == NGX_ERROR) ? rc : NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_OK       - exact match[m
[31m- * NGX_DONE     - auto redirect[m
[31m- * NGX_AGAIN    - inclusive match[m
[31m- * NGX_DECLINED - no match[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_find_static_location(ngx_http_request_t *r,[m
[31m-    ngx_http_location_tree_node_t *node)[m
[31m-{[m
[31m-    u_char     *uri;[m
[31m-    size_t      len, n;[m
[31m-    ngx_int_t   rc, rv;[m
[31m-[m
[31m-    len = r->uri.len;[m
[31m-    uri = r->uri.data;[m
[31m-[m
[31m-    rv = NGX_DECLINED;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node == NULL) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "test location: \"%*s\"",[m
[31m-                       (size_t) node->len, node->name);[m
[31m-[m
[31m-        n = (len <= (size_t) node->len) ? len : node->len;[m
[31m-[m
[31m-        rc = ngx_filename_cmp(uri, node->name, n);[m
[31m-[m
[31m-        if (rc != 0) {[m
[31m-            node = (rc < 0) ? node->left : node->right;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len > (size_t) node->len) {[m
[31m-[m
[31m-            if (node->inclusive) {[m
[31m-[m
[31m-                r->loc_conf = node->inclusive->loc_conf;[m
[31m-                rv = NGX_AGAIN;[m
[31m-[m
[31m-                node = node->tree;[m
[31m-                uri += n;[m
[31m-                len -= n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* exact only */[m
[31m-[m
[31m-            node = node->right;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len == (size_t) node->len) {[m
[31m-[m
[31m-            if (node->exact) {[m
[31m-                r->loc_conf = node->exact->loc_conf;[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            } else {[m
[31m-                r->loc_conf = node->inclusive->loc_conf;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* len < node->len */[m
[31m-[m
[31m-        if (len + 1 == (size_t) node->len && node->auto_redirect) {[m
[31m-[m
[31m-            r->loc_conf = (node->exact) ? node->exact->loc_conf:[m
[31m-                                          node->inclusive->loc_conf;[m
[31m-            rv = NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        node = node->left;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash)[m
[31m-{[m
[31m-    u_char      c, *lowcase;[m
[31m-    size_t      len;[m
[31m-    ngx_uint_t  i, hash;[m
[31m-[m
[31m-    if (types_hash->size == 0) {[m
[31m-        return (void *) 4;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    len = r->headers_out.content_type_len;[m
[31m-[m
[31m-    if (r->headers_out.content_type_lowcase == NULL) {[m
[31m-[m
[31m-        lowcase = ngx_pnalloc(r->pool, len);[m
[31m-        if (lowcase == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_lowcase = lowcase;[m
[31m-[m
[31m-        hash = 0;[m
[31m-[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            c = ngx_tolower(r->headers_out.content_type.data[i]);[m
[31m-            hash = ngx_hash(hash, c);[m
[31m-            lowcase[i] = c;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_hash = hash;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_hash_find(types_hash, r->headers_out.content_type_hash,[m
[31m-                         r->headers_out.content_type_lowcase, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_content_type(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                     c, *exten;[m
[31m-    ngx_str_t                 *type;[m
[31m-    ngx_uint_t                 i, hash;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->exten.len) {[m
[31m-[m
[31m-        hash = 0;[m
[31m-[m
[31m-        for (i = 0; i < r->exten.len; i++) {[m
[31m-            c = r->exten.data[i];[m
[31m-[m
[31m-            if (c >= 'A' && c <= 'Z') {[m
[31m-[m
[31m-                exten = ngx_pnalloc(r->pool, r->exten.len);[m
[31m-                if (exten == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                hash = ngx_hash_strlow(exten, r->exten.data, r->exten.len);[m
[31m-[m
[31m-                r->exten.data = exten;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            hash = ngx_hash(hash, c);[m
[31m-        }[m
[31m-[m
[31m-        type = ngx_hash_find(&clcf->types_hash, hash,[m
[31m-                             r->exten.data, r->exten.len);[m
[31m-[m
[31m-        if (type) {[m
[31m-            r->headers_out.content_type_len = type->len;[m
[31m-            r->headers_out.content_type = *type;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_len = clcf->default_type.len;[m
[31m-    r->headers_out.content_type = clcf->default_type;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_set_exten(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    ngx_str_null(&r->exten);[m
[31m-[m
[31m-    for (i = r->uri.len - 1; i > 1; i--) {[m
[31m-        if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {[m
[31m-[m
[31m-            r->exten.len = r->uri.len - i - 1;[m
[31m-            r->exten.data = &r->uri.data[i + 1];[m
[31m-[m
[31m-            return;[m
[31m-[m
[31m-        } else if (r->uri.data[i] == '/') {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_etag(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t           *etag;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!clcf->etag) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    etag = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (etag == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    etag->hash = 1;[m
[31m-    ngx_str_set(&etag->key, "ETag");[m
[31m-[m
[31m-    etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);[m
[31m-    if (etag->value.data == NULL) {[m
[31m-        etag->hash = 0;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",[m
[31m-                                  r->headers_out.last_modified_time,[m
[31m-                                  r->headers_out.content_length_n)[m
[31m-                      - etag->value.data;[m
[31m-[m
[31m-    r->headers_out.etag = etag;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_weak_etag(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t            len;[m
[31m-    u_char           *p;[m
[31m-    ngx_table_elt_t  *etag;[m
[31m-[m
[31m-    etag = r->headers_out.etag;[m
[31m-[m
[31m-    if (etag == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (etag->value.len > 2[m
[31m-        && etag->value.data[0] == 'W'[m
[31m-        && etag->value.data[1] == '/')[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (etag->value.len < 1 || etag->value.data[0] != '"') {[m
[31m-        r->headers_out.etag->hash = 0;[m
[31m-        r->headers_out.etag = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, etag->value.len + 2);[m
[31m-    if (p == NULL) {[m
[31m-        r->headers_out.etag->hash = 0;[m
[31m-        r->headers_out.etag = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_sprintf(p, "W/%V", &etag->value) - p;[m
[31m-[m
[31m-    etag->value.data = p;[m
[31m-    etag->value.len = len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,[m
[31m-    ngx_str_t *ct, ngx_http_complex_value_t *cv)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_str_t     val;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = status;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, cv, &val) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (status == NGX_HTTP_MOVED_PERMANENTLY[m
[31m-        || status == NGX_HTTP_MOVED_TEMPORARILY[m
[31m-        || status == NGX_HTTP_SEE_OTHER[m
[31m-        || status == NGX_HTTP_TEMPORARY_REDIRECT)[m
[31m-    {[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.location->hash = 1;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-        r->headers_out.location->value = val;[m
[31m-[m
[31m-        return status;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = val.len;[m
[31m-[m
[31m-    if (ct) {[m
[31m-        r->headers_out.content_type_len = ct->len;[m
[31m-        r->headers_out.content_type = *ct;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD || (r != r->main && val.len == 0)) {[m
[31m-        return ngx_http_send_header(r);[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = val.data;[m
[31m-    b->last = val.data + val.len;[m
[31m-    b->memory = val.len ? 1 : 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->post_action) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "header already sent");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        r->headers_out.status = r->err_status;[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_top_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http output filter \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    rc = ngx_http_top_body_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        /* NGX_ERROR may be returned by any filter */[m
[31m-        c->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *path,[m
[31m-    size_t *root_length, size_t reserved)[m
[31m-{[m
[31m-    u_char                    *last;[m
[31m-    size_t                     alias;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    alias = clcf->alias;[m
[31m-[m
[31m-    if (alias && !r->valid_location) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "\"alias\" cannot be used in location \"%V\" "[m
[31m-                      "where URI was rewritten", &clcf->name);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->root_lengths == NULL) {[m
[31m-[m
[31m-        *root_length = clcf->root.len;[m
[31m-[m
[31m-        path->len = clcf->root.len + reserved + r->uri.len - alias + 1;[m
[31m-[m
[31m-        path->data = ngx_pnalloc(r->pool, path->len);[m
[31m-        if (path->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        last = ngx_copy(path->data, clcf->root.data, clcf->root.len);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            reserved += r->add_uri_to_alias ? r->uri.len + 1 : 1;[m
[31m-[m
[31m-        } else {[m
[31m-            reserved += r->uri.len - alias + 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_script_run(r, path, clcf->root_lengths->elts, reserved,[m
[31m-                                clcf->root_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, path)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        *root_length = path->len - reserved;[m
[31m-        last = path->data + *root_length;[m
[31m-[m
[31m-        if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            if (!r->add_uri_to_alias) {[m
[31m-                *last = '\0';[m
[31m-                return last;[m
[31m-            }[m
[31m-[m
[31m-            alias = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_cpystrn(last, r->uri.data + alias, r->uri.len - alias + 1);[m
[31m-[m
[31m-    return last;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_auth_basic_user(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t   auth, encoded;[m
[31m-    ngx_uint_t  len;[m
[31m-[m
[31m-    if (r->headers_in.user.len == 0 && r->headers_in.user.data != NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.authorization == NULL) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    encoded = r->headers_in.authorization->value;[m
[31m-[m
[31m-    if (encoded.len < sizeof("Basic ") - 1[m
[31m-        || ngx_strncasecmp(encoded.data, (u_char *) "Basic ",[m
[31m-                           sizeof("Basic ") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    encoded.len -= sizeof("Basic ") - 1;[m
[31m-    encoded.data += sizeof("Basic ") - 1;[m
[31m-[m
[31m-    while (encoded.len && encoded.data[0] == ' ') {[m
[31m-        encoded.len--;[m
[31m-        encoded.data++;[m
[31m-    }[m
[31m-[m
[31m-    if (encoded.len == 0) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    auth.len = ngx_base64_decoded_length(encoded.len);[m
[31m-    auth.data = ngx_pnalloc(r->pool, auth.len + 1);[m
[31m-    if (auth.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&auth, &encoded) != NGX_OK) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    auth.data[auth.len] = '\0';[m
[31m-[m
[31m-    for (len = 0; len < auth.len; len++) {[m
[31m-        if (auth.data[len] == ':') {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 || len == auth.len) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.user.len = len;[m
[31m-    r->headers_in.user.data = auth.data;[m
[31m-    r->headers_in.passwd.len = auth.len - len - 1;[m
[31m-    r->headers_in.passwd.data = &auth.data[len + 1];[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_gzip_ok(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                     date, expires;[m
[31m-    ngx_uint_t                 p;[m
[31m-    ngx_array_t               *cc;[m
[31m-    ngx_table_elt_t           *e, *d, *ae;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->gzip_tested = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ae = r->headers_in.accept_encoding;[m
[31m-    if (ae == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ae->value.len < sizeof("gzip") - 1) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * test first for the most common case "gzip,...":[m
[31m-     *   MSIE:    "gzip, deflate"[m
[31m-     *   Firefox: "gzip,deflate"[m
[31m-     *   Chrome:  "gzip,deflate,sdch"[m
[31m-     *   Safari:  "gzip, deflate"[m
[31m-     *   Opera:   "gzip, deflate"[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_memcmp(ae->value.data, "gzip,", 5) != 0[m
[31m-        && ngx_http_gzip_accept_encoding(&ae->value) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_in.msie6 && clcf->gzip_disable_msie6) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < clcf->gzip_http_version) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.via == NULL) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    p = clcf->gzip_proxied;[m
[31m-[m
[31m-    if (p & NGX_HTTP_GZIP_PROXIED_OFF) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (p & NGX_HTTP_GZIP_PROXIED_ANY) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.authorization && (p & NGX_HTTP_GZIP_PROXIED_AUTH)) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    e = r->headers_out.expires;[m
[31m-[m
[31m-    if (e) {[m
[31m-[m
[31m-        if (!(p & NGX_HTTP_GZIP_PROXIED_EXPIRED)) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        expires = ngx_parse_http_time(e->value.data, e->value.len);[m
[31m-        if (expires == NGX_ERROR) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        d = r->headers_out.date;[m
[31m-[m
[31m-        if (d) {[m
[31m-            date = ngx_parse_http_time(d->value.data, d->value.len);[m
[31m-            if (date == NGX_ERROR) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            date = ngx_time();[m
[31m-        }[m
[31m-[m
[31m-        if (expires < date) {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cc = &r->headers_out.cache_control;[m
[31m-[m
[31m-    if (cc->elts) {[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_NO_CACHE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_cache,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_NO_STORE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_store,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_PRIVATE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_private,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((p & NGX_HTTP_GZIP_PROXIED_NO_LM) && r->headers_out.last_modified) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((p & NGX_HTTP_GZIP_PROXIED_NO_ETAG) && r->headers_out.etag) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-ok:[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (clcf->gzip_disable && r->headers_in.user_agent) {[m
[31m-[m
[31m-        if (ngx_regex_exec_array(clcf->gzip_disable,[m
[31m-                                 &r->headers_in.user_agent->value,[m
[31m-                                 r->connection->log)[m
[31m-            != NGX_DECLINED)[m
[31m-        {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    r->gzip_ok = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * gzip is enabled for the following quantities:[m
[31m- *     "gzip; q=0.001" ... "gzip; q=1.000"[m
[31m- * gzip is disabled for the following quantities:[m
[31m- *     "gzip; q=0" ... "gzip; q=0.000", and for any invalid cases[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_accept_encoding(ngx_str_t *ae)[m
[31m-{[m
[31m-    u_char  *p, *start, *last;[m
[31m-[m
[31m-    start = ae->data;[m
[31m-    last = start + ae->len;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        p = ngx_strcasestrn(start, "gzip", 4 - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (p == start || (*(p - 1) == ',' || *(p - 1) == ' ')) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        start = p + 4;[m
[31m-    }[m
[31m-[m
[31m-    p += 4;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        switch (*p++) {[m
[31m-        case ',':[m
[31m-            return NGX_OK;[m
[31m-        case ';':[m
[31m-            goto quantity;[m
[31m-        case ' ':[m
[31m-            continue;[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-quantity:[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        switch (*p++) {[m
[31m-        case 'q':[m
[31m-        case 'Q':[m
[31m-            goto equal;[m
[31m-        case ' ':[m
[31m-            continue;[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-equal:[m
[31m-[m
[31m-    if (p + 2 > last || *p++ != '=') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_gzip_quantity(p, last) == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_gzip_quantity(u_char *p, u_char *last)[m
[31m-{[m
[31m-    u_char      c;[m
[31m-    ngx_uint_t  n, q;[m
[31m-[m
[31m-    c = *p++;[m
[31m-[m
[31m-    if (c != '0' && c != '1') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    q = (c - '0') * 100;[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        return q;[m
[31m-    }[m
[31m-[m
[31m-    c = *p++;[m
[31m-[m
[31m-    if (c == ',' || c == ' ') {[m
[31m-        return q;[m
[31m-    }[m
[31m-[m
[31m-    if (c != '.') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        c = *p++;[m
[31m-[m
[31m-        if (c == ',' || c == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            q += c - '0';[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (q > 100 || n > 3) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    return q;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,[m
[31m-    ngx_http_post_subrequest_t *ps, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_time_t                    *tp;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *sr;[m
[31m-    ngx_http_core_srv_conf_t      *cscf;[m
[31m-    ngx_http_postponed_request_t  *pr, *p;[m
[31m-[m
[31m-    if (r->subrequests == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "subrequests cycle while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * 1000 is reserved for other purposes.[m
[31m-     */[m
[31m-    if (r->main->count >= 65535 - 1000) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "request reference counter overflow "[m
[31m-                      "while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr = ngx_pcalloc(r->pool, sizeof(ngx_http_request_t));[m
[31m-    if (sr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr->signature = NGX_HTTP_MODULE;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    sr->connection = c;[m
[31m-[m
[31m-    sr->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (sr->ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&sr->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    sr->main_conf = cscf->ctx->main_conf;[m
[31m-    sr->srv_conf = cscf->ctx->srv_conf;[m
[31m-    sr->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    sr->pool = r->pool;[m
[31m-[m
[31m-    sr->headers_in = r->headers_in;[m
[31m-[m
[31m-    ngx_http_clear_content_length(sr);[m
[31m-    ngx_http_clear_accept_ranges(sr);[m
[31m-    ngx_http_clear_last_modified(sr);[m
[31m-[m
[31m-    sr->request_body = r->request_body;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    sr->stream = r->stream;[m
[31m-#endif[m
[31m-[m
[31m-    sr->method = NGX_HTTP_GET;[m
[31m-    sr->http_version = r->http_version;[m
[31m-[m
[31m-    sr->request_line = r->request_line;[m
[31m-    sr->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        sr->args = *args;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http subrequest \"%V?%V\"", uri, &sr->args);[m
[31m-[m
[31m-    sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;[m
[31m-    sr->waited = (flags & NGX_HTTP_SUBREQUEST_WAITED) != 0;[m
[31m-[m
[31m-    sr->unparsed_uri = r->unparsed_uri;[m
[31m-    sr->method_name = ngx_http_core_get_method;[m
[31m-    sr->http_protocol = r->http_protocol;[m
[31m-[m
[31m-    ngx_http_set_exten(sr);[m
[31m-[m
[31m-    sr->main = r->main;[m
[31m-    sr->parent = r;[m
[31m-    sr->post_subrequest = ps;[m
[31m-    sr->read_event_handler = ngx_http_request_empty_handler;[m
[31m-    sr->write_event_handler = ngx_http_handler;[m
[31m-[m
[31m-    if (c->data == r && r->postponed == NULL) {[m
[31m-        c->data = sr;[m
[31m-    }[m
[31m-[m
[31m-    sr->variables = r->variables;[m
[31m-[m
[31m-    sr->log_handler = r->log_handler;[m
[31m-[m
[31m-    pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->request = sr;[m
[31m-    pr->out = NULL;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-    if (r->postponed) {[m
[31m-        for (p = r->postponed; p->next; p = p->next) { /* void */ }[m
[31m-        p->next = pr;[m
[31m-[m
[31m-    } else {[m
[31m-        r->postponed = pr;[m
[31m-    }[m
[31m-[m
[31m-    sr->internal = 1;[m
[31m-[m
[31m-    sr->discard_body = r->discard_body;[m
[31m-    sr->expect_tested = 1;[m
[31m-    sr->main_filter_need_in_memory = r->main_filter_need_in_memory;[m
[31m-[m
[31m-    sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    sr->subrequests = r->subrequests - 1;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    sr->start_sec = tp->sec;[m
[31m-    sr->start_msec = tp->msec;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    *psr = sr;[m
[31m-[m
[31m-    return ngx_http_post_request(sr, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_internal_redirect(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while internally redirecting to \"%V\"", uri);[m
[31m-[m
[31m-        r->main->count++;[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    r->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        r->args = *args;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&r->args);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "internal redirect: \"%V?%V\"", uri, &r->args);[m
[31m-[m
[31m-    ngx_http_set_exten(r);[m
[31m-[m
[31m-    /* clear the modules contexts */[m
[31m-    ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    ngx_http_update_location_config(r);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    r->cache = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    r->internal = 1;[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-    r->add_uri_to_alias = 0;[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    ngx_http_handler(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t    *cscf;[m
[31m-    ngx_http_core_loc_conf_t   **clcfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while redirect to named location \"%V\"", name);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "empty URI in redirect to named location \"%V\"", name);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (cscf->named_locations) {[m
[31m-[m
[31m-        for (clcfp = cscf->named_locations; *clcfp; clcfp++) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "test location: \"%V\"", &(*clcfp)->name);[m
[31m-[m
[31m-            if (name->len != (*clcfp)->name.len[m
[31m-                || ngx_strncmp(name->data, (*clcfp)->name.data, name->len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "using location: %V \"%V?%V\"",[m
[31m-                           name, &r->uri, &r->args);[m
[31m-[m
[31m-            r->internal = 1;[m
[31m-            r->content_handler = NULL;[m
[31m-            r->uri_changed = 0;[m
[31m-            r->loc_conf = (*clcfp)->loc_conf;[m
[31m-[m
[31m-            /* clear the modules contexts */[m
[31m-            ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-            ngx_http_update_location_config(r);[m
[31m-[m
[31m-            cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            r->phase_handler = cmcf->phase_engine.location_rewrite_index;[m
[31m-[m
[31m-            r->write_event_handler = ngx_http_core_run_phases;[m
[31m-            ngx_http_core_run_phases(r);[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "could not find named location \"%V\"", name);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_cleanup_t *[m
[31m-ngx_http_cleanup_add(ngx_http_request_t *r, size_t size)[m
[31m-{[m
[31m-    ngx_http_cleanup_t  *cln;[m
[31m-[m
[31m-    r = r->main;[m
[31m-[m
[31m-    cln = ngx_palloc(r->pool, sizeof(ngx_http_cleanup_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        cln->data = ngx_palloc(r->pool, size);[m
[31m-        if (cln->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cln->data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = NULL;[m
[31m-    cln->next = r->cleanup;[m
[31m-[m
[31m-    r->cleanup = cln;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http cleanup add: %p", cln);[m
[31m-[m
[31m-    return cln;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_disable_symlinks(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *path, ngx_open_file_info_t *of)[m
[31m-{[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    u_char     *p;[m
[31m-    ngx_str_t   from;[m
[31m-[m
[31m-    of->disable_symlinks = clcf->disable_symlinks;[m
[31m-[m
[31m-    if (clcf->disable_symlinks_from == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, clcf->disable_symlinks_from, &from)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (from.len == 0[m
[31m-        || from.len > path->len[m
[31m-        || ngx_memcmp(path->data, from.data, from.len) != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (from.len == path->len) {[m
[31m-        of->disable_symlinks = NGX_DISABLE_SYMLINKS_OFF;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = path->data + from.len;[m
[31m-[m
[31m-    if (*p == '/') {[m
[31m-        of->disable_symlinks_from = from.len;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p--;[m
[31m-[m
[31m-    if (*p == '/') {[m
[31m-        of->disable_symlinks_from = from.len - 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    ngx_array_t *headers, ngx_str_t *value, ngx_array_t *proxies,[m
[31m-    int recursive)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_uint_t         i, found;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    if (headers == NULL) {[m
[31m-        return ngx_http_get_forwarded_addr_internal(r, addr, value->data,[m
[31m-                                                    value->len, proxies,[m
[31m-                                                    recursive);[m
[31m-    }[m
[31m-[m
[31m-    i = headers->nelts;[m
[31m-    h = headers->elts;[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-    while (i-- > 0) {[m
[31m-        rc = ngx_http_get_forwarded_addr_internal(r, addr, h[i]->value.data,[m
[31m-                                                  h[i]->value.len, proxies,[m
[31m-                                                  recursive);[m
[31m-[m
[31m-        if (!recursive) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED && found) {[m
[31m-            rc = NGX_DONE;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    u_char *xff, size_t xfflen, ngx_array_t *proxies, int recursive)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    in_addr_t         inaddr;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_addr_t        paddr;[m
[31m-    ngx_cidr_t       *cidr;[m
[31m-    ngx_uint_t        family, i;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t        n;[m
[31m-    struct in6_addr  *inaddr6;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    inaddr = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    inaddr6 = NULL;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    family = addr->sockaddr->sa_family;[m
[31m-[m
[31m-    if (family == AF_INET) {[m
[31m-        inaddr = ((struct sockaddr_in *) addr->sockaddr)->sin_addr.s_addr;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    else if (family == AF_INET6) {[m
[31m-        inaddr6 = &((struct sockaddr_in6 *) addr->sockaddr)->sin6_addr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-            family = AF_INET;[m
[31m-[m
[31m-            p = inaddr6->s6_addr;[m
[31m-[m
[31m-            inaddr = p[12] << 24;[m
[31m-            inaddr += p[13] << 16;[m
[31m-            inaddr += p[14] << 8;[m
[31m-            inaddr += p[15];[m
[31m-[m
[31m-            inaddr = htonl(inaddr);[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    for (cidr = proxies->elts, i = 0; i < proxies->nelts; i++) {[m
[31m-        if (cidr[i].family != family) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        switch (family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            for (n = 0; n < 16; n++) {[m
[31m-                if ((inaddr6->s6_addr[n] & cidr[i].u.in6.mask.s6_addr[n])[m
[31m-                    != cidr[i].u.in6.addr.s6_addr[n])[m
[31m-                {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            if ((inaddr & cidr[i].u.in.mask) != cidr[i].u.in.addr) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        for (p = xff + xfflen - 1; p > xff; p--, xfflen--) {[m
[31m-            if (*p != ' ' && *p != ',') {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; p > xff; p--) {[m
[31m-            if (*p == ' ' || *p == ',') {[m
[31m-                p++;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_parse_addr(r->pool, &paddr, p, xfflen - (p - xff)) != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        *addr = paddr;[m
[31m-[m
[31m-        if (recursive && p > xff) {[m
[31m-            rc = ngx_http_get_forwarded_addr_internal(r, addr, xff, p - 1 - xff,[m
[31m-                                                      proxies, 1);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_OK || rc == NGX_DONE  */[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    void                        *mconf;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_conf_t                   pcf;[m
[31m-    ngx_http_module_t           *module;[m
[31m-    struct sockaddr_in          *sin;[m
[31m-    ngx_http_conf_ctx_t         *ctx, *http_ctx;[m
[31m-    ngx_http_listen_opt_t        lsopt;[m
[31m-    ngx_http_core_srv_conf_t    *cscf, **cscfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx = cf->ctx;[m
[31m-    ctx->main_conf = http_ctx->main_conf;[m
[31m-[m
[31m-    /* the server{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* the server{}'s loc_conf */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the server configuration context */[m
[31m-[m
[31m-    cscf = ctx->srv_conf[ngx_http_core_module.ctx_index];[m
[31m-    cscf->ctx = ctx;[m
[31m-[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    cscfp = ngx_array_push(&cmcf->servers);[m
[31m-    if (cscfp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *cscfp = cscf;[m
[31m-[m
[31m-[m
[31m-    /* parse inside server{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_SRV_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv == NGX_CONF_OK && !cscf->listen) {[m
[31m-        ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));[m
[31m-[m
[31m-        sin = &lsopt.u.sockaddr_in;[m
[31m-[m
[31m-        sin->sin_family = AF_INET;[m
[31m-#if (NGX_WIN32)[m
[31m-        sin->sin_port = htons(80);[m
[31m-#else[m
[31m-        sin->sin_port = htons((getuid() == 0) ? 80 : 8000);[m
[31m-#endif[m
[31m-        sin->sin_addr.s_addr = INADDR_ANY;[m
[31m-[m
[31m-        lsopt.socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-        lsopt.backlog = NGX_LISTEN_BACKLOG;[m
[31m-        lsopt.rcvbuf = -1;[m
[31m-        lsopt.sndbuf = -1;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        lsopt.setfib = -1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        lsopt.fastopen = -1;[m
[31m-#endif[m
[31m-        lsopt.wildcard = 1;[m
[31m-[m
[31m-        (void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.socklen, lsopt.addr,[m
[31m-                             NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                      *rv;[m
[31m-    u_char                    *mod;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                 *value, *name;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_conf_t                 save;[m
[31m-    ngx_http_module_t         *module;[m
[31m-    ngx_http_conf_ctx_t       *ctx, *pctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf, *pclcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] =[m
[31m-                                                   module->create_loc_conf(cf);[m
[31m-            if (ctx->loc_conf[cf->cycle->modules[i]->ctx_index] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-[m
[31m-        len = value[1].len;[m
[31m-        mod = value[1].data;[m
[31m-        name = &value[2];[m
[31m-[m
[31m-        if (len == 1 && mod[0] == '=') {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-            clcf->exact_match = 1;[m
[31m-[m
[31m-        } else if (len == 2 && mod[0] == '^' && mod[1] == '~') {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-            clcf->noregex = 1;[m
[31m-[m
[31m-        } else if (len == 1 && mod[0] == '~') {[m
[31m-[m
[31m-            if (ngx_http_core_regex_location(cf, clcf, name, 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else if (len == 2 && mod[0] == '~' && mod[1] == '*') {[m
[31m-[m
[31m-            if (ngx_http_core_regex_location(cf, clcf, name, 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid location modifier \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        name = &value[1];[m
[31m-[m
[31m-        if (name->data[0] == '=') {[m
[31m-[m
[31m-            clcf->name.len = name->len - 1;[m
[31m-            clcf->name.data = name->data + 1;[m
[31m-            clcf->exact_match = 1;[m
[31m-[m
[31m-        } else if (name->data[0] == '^' && name->data[1] == '~') {[m
[31m-[m
[31m-            clcf->name.len = name->len - 2;[m
[31m-            clcf->name.data = name->data + 2;[m
[31m-            clcf->noregex = 1;[m
[31m-[m
[31m-        } else if (name->data[0] == '~') {[m
[31m-[m
[31m-            name->len--;[m
[31m-            name->data++;[m
[31m-[m
[31m-            if (name->data[0] == '*') {[m
[31m-[m
[31m-                name->len--;[m
[31m-                name->data++;[m
[31m-[m
[31m-                if (ngx_http_core_regex_location(cf, clcf, name, 1) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                if (ngx_http_core_regex_location(cf, clcf, name, 0) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-[m
[31m-            if (name->data[0] == '@') {[m
[31m-                clcf->named = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    if (cf->cmd_type == NGX_HTTP_LOC_CONF) {[m
[31m-[m
[31m-        /* nested location */[m
[31m-[m
[31m-#if 0[m
[31m-        clcf->prev_location = pclcf;[m
[31m-#endif[m
[31m-[m
[31m-        if (pclcf->exact_match) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" cannot be inside "[m
[31m-                               "the exact location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (pclcf->named) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" cannot be inside "[m
[31m-                               "the named location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->named) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "named location \"%V\" can be "[m
[31m-                               "on the server level only",[m
[31m-                               &clcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = pclcf->name.len;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        if (clcf->regex == NULL[m
[31m-            && ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)[m
[31m-#else[m
[31m-        if (ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)[m
[31m-#endif[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" is outside location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_LOC_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_regex_location(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf,[m
[31m-    ngx_str_t *regex, ngx_uint_t caseless)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_compile_t  rc;[m
[31m-    u_char               errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *regex;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-#if (NGX_HAVE_CASELESS_FILESYSTEM)[m
[31m-    rc.options = NGX_REGEX_CASELESS;[m
[31m-#else[m
[31m-    rc.options = caseless ? NGX_REGEX_CASELESS : 0;[m
[31m-#endif[m
[31m-[m
[31m-    clcf->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (clcf->regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->name = *regex;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "using regex \"%V\" requires PCRE library",[m
[31m-                       regex);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    if (clcf->types == NULL) {[m
[31m-        clcf->types = ngx_array_create(cf->pool, 64, sizeof(ngx_hash_key_t));[m
[31m-        if (clcf->types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_core_type;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t       *value, *content_type, *old;[m
[31m-    ngx_uint_t       i, n, hash;[m
[31m-    ngx_hash_key_t  *type;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "include") == 0) {[m
[31m-        if (cf->args->nelts != 2) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid number of arguments"[m
[31m-                               " in \"include\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_conf_include(cf, dummy, conf);[m
[31m-    }[m
[31m-[m
[31m-    content_type = ngx_palloc(cf->pool, sizeof(ngx_str_t));[m
[31m-    if (content_type == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *content_type = value[0];[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len);[m
[31m-[m
[31m-        type = clcf->types->elts;[m
[31m-        for (n = 0; n < clcf->types->nelts; n++) {[m
[31m-            if (ngx_strcmp(value[i].data, type[n].key.data) == 0) {[m
[31m-                old = type[n].value;[m
[31m-                type[n].value = content_type;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                                   "duplicate extension \"%V\", "[m
[31m-                                   "content type: \"%V\", "[m
[31m-                                   "previous content type: \"%V\"",[m
[31m-                                   &value[i], content_type, old);[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        type = ngx_array_push(clcf->types);[m
[31m-        if (type == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        type->key = value[i];[m
[31m-        type->key_hash = hash;[m
[31m-        type->value = content_type;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    return ngx_http_variables_add_core_vars(cf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_postconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_request_body_filter = ngx_http_request_body_save_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_main_conf_t));[m
[31m-    if (cmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->servers, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_core_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    cmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    cmcf->variables_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    cmcf->variables_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return cmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t *cmcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512);[m
[31m-    ngx_conf_init_uint_value(cmcf->server_names_hash_bucket_size,[m
[31m-                             ngx_cacheline_size);[m
[31m-[m
[31m-    cmcf->server_names_hash_bucket_size =[m
[31m-            ngx_align(cmcf->server_names_hash_bucket_size, ngx_cacheline_size);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_init_uint_value(cmcf->variables_hash_max_size, 1024);[m
[31m-    ngx_conf_init_uint_value(cmcf->variables_hash_bucket_size, 64);[m
[31m-[m
[31m-    cmcf->variables_hash_bucket_size =[m
[31m-               ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size);[m
[31m-[m
[31m-    if (cmcf->ncaptures) {[m
[31m-        cmcf->ncaptures = (cmcf->ncaptures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_srv_conf_t));[m
[31m-    if (cscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->client_large_buffers.num = 0;[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_array_init(&cscf->server_names, cf->temp_pool, 4,[m
[31m-                       sizeof(ngx_http_server_name_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cscf->connection_pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->request_pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->client_header_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    cscf->client_header_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->ignore_invalid_headers = NGX_CONF_UNSET;[m
[31m-    cscf->merge_slashes = NGX_CONF_UNSET;[m
[31m-    cscf->underscores_in_headers = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return cscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *prev = parent;[m
[31m-    ngx_http_core_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_str_t                name;[m
[31m-    ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-    /* TODO: it does not merge, it inits only */[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->connection_pool_size,[m
[31m-                              prev->connection_pool_size, 64 * sizeof(void *));[m
[31m-    ngx_conf_merge_size_value(conf->request_pool_size,[m
[31m-                              prev->request_pool_size, 4096);[m
[31m-    ngx_conf_merge_msec_value(conf->client_header_timeout,[m
[31m-                              prev->client_header_timeout, 60000);[m
[31m-    ngx_conf_merge_size_value(conf->client_header_buffer_size,[m
[31m-                              prev->client_header_buffer_size, 1024);[m
[31m-    ngx_conf_merge_bufs_value(conf->large_client_header_buffers,[m
[31m-                              prev->large_client_header_buffers,[m
[31m-                              4, 8192);[m
[31m-[m
[31m-    if (conf->large_client_header_buffers.size < conf->connection_pool_size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the \"large_client_header_buffers\" size must be "[m
[31m-                           "equal to or greater than \"connection_pool_size\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ignore_invalid_headers,[m
[31m-                              prev->ignore_invalid_headers, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->underscores_in_headers,[m
[31m-                              prev->underscores_in_headers, 0);[m
[31m-[m
[31m-    if (conf->server_names.nelts == 0) {[m
[31m-        /* the array has 4 empty preallocated elements, so push cannot fail */[m
[31m-        sn = ngx_array_push(&conf->server_names);[m
[31m-#if (NGX_PCRE)[m
[31m-        sn->regex = NULL;[m
[31m-#endif[m
[31m-        sn->server = conf;[m
[31m-        ngx_str_set(&sn->name, "");[m
[31m-    }[m
[31m-[m
[31m-    sn = conf->server_names.elts;[m
[31m-    name = sn[0].name;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (sn->regex) {[m
[31m-        name.len++;[m
[31m-        name.data--;[m
[31m-    } else[m
[31m-#endif[m
[31m-[m
[31m-    if (name.data[0] == '.') {[m
[31m-        name.len--;[m
[31m-        name.data++;[m
[31m-    }[m
[31m-[m
[31m-    conf->server_name.len = name.len;[m
[31m-    conf->server_name.data = ngx_pstrdup(cf->pool, &name);[m
[31m-    if (conf->server_name.data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_loc_conf_t));[m
[31m-    if (clcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     clcf->root = { 0, NULL };[m
[31m-     *     clcf->limit_except = 0;[m
[31m-     *     clcf->post_action = { 0, NULL };[m
[31m-     *     clcf->types = NULL;[m
[31m-     *     clcf->default_type = { 0, NULL };[m
[31m-     *     clcf->error_log = NULL;[m
[31m-     *     clcf->try_files = NULL;[m
[31m-     *     clcf->client_body_path = NULL;[m
[31m-     *     clcf->regex = NULL;[m
[31m-     *     clcf->exact_match = 0;[m
[31m-     *     clcf->auto_redirect = 0;[m
[31m-     *     clcf->alias = 0;[m
[31m-     *     clcf->gzip_proxied = 0;[m
[31m-     *     clcf->keepalive_disable = 0;[m
[31m-     */[m
[31m-[m
[31m-    clcf->error_pages = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->client_max_body_size = NGX_CONF_UNSET;[m
[31m-    clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->satisfy = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->if_modified_since = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->max_ranges = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->client_body_in_file_only = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->client_body_in_single_buffer = NGX_CONF_UNSET;[m
[31m-    clcf->internal = NGX_CONF_UNSET;[m
[31m-    clcf->sendfile = NGX_CONF_UNSET;[m
[31m-    clcf->sendfile_max_chunk = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->aio = NGX_CONF_UNSET;[m
[31m-    clcf->aio_write = NGX_CONF_UNSET;[m
[31m-#if (NGX_THREADS)[m
[31m-    clcf->thread_pool = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->thread_pool_value = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-    clcf->read_ahead = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->directio = NGX_CONF_UNSET;[m
[31m-    clcf->directio_alignment = NGX_CONF_UNSET;[m
[31m-    clcf->tcp_nopush = NGX_CONF_UNSET;[m
[31m-    clcf->tcp_nodelay = NGX_CONF_UNSET;[m
[31m-    clcf->send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->postpone_output = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->limit_rate_after = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->keepalive_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->keepalive_header = NGX_CONF_UNSET;[m
[31m-    clcf->keepalive_requests = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->lingering_close = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->lingering_time = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->lingering_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->resolver_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->reset_timedout_connection = NGX_CONF_UNSET;[m
[31m-    clcf->server_name_in_redirect = NGX_CONF_UNSET;[m
[31m-    clcf->port_in_redirect = NGX_CONF_UNSET;[m
[31m-    clcf->msie_padding = NGX_CONF_UNSET;[m
[31m-    clcf->msie_refresh = NGX_CONF_UNSET;[m
[31m-    clcf->log_not_found = NGX_CONF_UNSET;[m
[31m-    clcf->log_subrequest = NGX_CONF_UNSET;[m
[31m-    clcf->recursive_error_pages = NGX_CONF_UNSET;[m
[31m-    clcf->server_tokens = NGX_CONF_UNSET;[m
[31m-    clcf->chunked_transfer_encoding = NGX_CONF_UNSET;[m
[31m-    clcf->etag = NGX_CONF_UNSET;[m
[31m-    clcf->types_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->types_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    clcf->open_file_cache = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->open_file_cache_valid = NGX_CONF_UNSET;[m
[31m-    clcf->open_file_cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->open_file_cache_errors = NGX_CONF_UNSET;[m
[31m-    clcf->open_file_cache_events = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    clcf->gzip_vary = NGX_CONF_UNSET;[m
[31m-    clcf->gzip_http_version = NGX_CONF_UNSET_UINT;[m
[31m-#if (NGX_PCRE)[m
[31m-    clcf->gzip_disable = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-    clcf->gzip_disable_msie6 = 3;[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-    clcf->gzip_disable_degradation = 3;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    clcf->disable_symlinks = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->disable_symlinks_from = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    return clcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_core_text_html_type = ngx_string("text/html");[m
[31m-static ngx_str_t  ngx_http_core_image_gif_type = ngx_string("image/gif");[m
[31m-static ngx_str_t  ngx_http_core_image_jpeg_type = ngx_string("image/jpeg");[m
[31m-[m
[31m-static ngx_hash_key_t  ngx_http_core_default_types[] = {[m
[31m-    { ngx_string("html"), 0, &ngx_http_core_text_html_type },[m
[31m-    { ngx_string("gif"), 0, &ngx_http_core_image_gif_type },[m
[31m-    { ngx_string("jpg"), 0, &ngx_http_core_image_jpeg_type },[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *prev = parent;[m
[31m-    ngx_http_core_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_hash_key_t   *type;[m
[31m-    ngx_hash_init_t   types_hash;[m
[31m-[m
[31m-    if (conf->root.data == NULL) {[m
[31m-[m
[31m-        conf->alias = prev->alias;[m
[31m-        conf->root = prev->root;[m
[31m-        conf->root_lengths = prev->root_lengths;[m
[31m-        conf->root_values = prev->root_values;[m
[31m-[m
[31m-        if (prev->root.data == NULL) {[m
[31m-            ngx_str_set(&conf->root, "html");[m
[31m-[m
[31m-            if (ngx_conf_full_name(cf->cycle, &conf->root, 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->post_action.data == NULL) {[m
[31m-        conf->post_action = prev->post_action;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->types_hash_max_size,[m
[31m-                              prev->types_hash_max_size, 1024);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->types_hash_bucket_size,[m
[31m-                              prev->types_hash_bucket_size, 64);[m
[31m-[m
[31m-    conf->types_hash_bucket_size = ngx_align(conf->types_hash_bucket_size,[m
[31m-                                             ngx_cacheline_size);[m
[31m-[m
[31m-    /*[m
[31m-     * the special handling of the "types" directive in the "http" section[m
[31m-     * to inherit the http's conf->types_hash to all servers[m
[31m-     */[m
[31m-[m
[31m-    if (prev->types && prev->types_hash.buckets == NULL) {[m
[31m-[m
[31m-        types_hash.hash = &prev->types_hash;[m
[31m-        types_hash.key = ngx_hash_key_lc;[m
[31m-        types_hash.max_size = conf->types_hash_max_size;[m
[31m-        types_hash.bucket_size = conf->types_hash_bucket_size;[m
[31m-        types_hash.name = "types_hash";[m
[31m-        types_hash.pool = cf->pool;[m
[31m-        types_hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&types_hash, prev->types->elts, prev->types->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types == NULL) {[m
[31m-        conf->types = prev->types;[m
[31m-        conf->types_hash = prev->types_hash;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types == NULL) {[m
[31m-        conf->types = ngx_array_create(cf->pool, 3, sizeof(ngx_hash_key_t));[m
[31m-        if (conf->types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; ngx_http_core_default_types[i].key.len; i++) {[m
[31m-            type = ngx_array_push(conf->types);[m
[31m-            if (type == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            type->key = ngx_http_core_default_types[i].key;[m
[31m-            type->key_hash =[m
[31m-                       ngx_hash_key_lc(ngx_http_core_default_types[i].key.data,[m
[31m-                                       ngx_http_core_default_types[i].key.len);[m
[31m-            type->value = ngx_http_core_default_types[i].value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types_hash.buckets == NULL) {[m
[31m-[m
[31m-        types_hash.hash = &conf->types_hash;[m
[31m-        types_hash.key = ngx_hash_key_lc;[m
[31m-        types_hash.max_size = conf->types_hash_max_size;[m
[31m-        types_hash.bucket_size = conf->types_hash_bucket_size;[m
[31m-        types_hash.name = "types_hash";[m
[31m-        types_hash.pool = cf->pool;[m
[31m-        types_hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&types_hash, conf->types->elts, conf->types->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->error_log == NULL) {[m
[31m-        if (prev->error_log) {[m
[31m-            conf->error_log = prev->error_log;[m
[31m-        } else {[m
[31m-            conf->error_log = &cf->cycle->new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->default_type,[m
[31m-                              prev->default_type, "text/plain");[m
[31m-[m
[31m-    ngx_conf_merge_off_value(conf->client_max_body_size,[m
[31m-                              prev->client_max_body_size, 1 * 1024 * 1024);[m
[31m-    ngx_conf_merge_size_value(conf->client_body_buffer_size,[m
[31m-                              prev->client_body_buffer_size,[m
[31m-                              (size_t) 2 * ngx_pagesize);[m
[31m-    ngx_conf_merge_msec_value(conf->client_body_timeout,[m
[31m-                              prev->client_body_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->keepalive_disable,[m
[31m-                              prev->keepalive_disable,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_KEEPALIVE_DISABLE_MSIE6));[m
[31m-    ngx_conf_merge_uint_value(conf->satisfy, prev->satisfy,[m
[31m-                              NGX_HTTP_SATISFY_ALL);[m
[31m-    ngx_conf_merge_uint_value(conf->if_modified_since, prev->if_modified_since,[m
[31m-                              NGX_HTTP_IMS_EXACT);[m
[31m-    ngx_conf_merge_uint_value(conf->max_ranges, prev->max_ranges,[m
[31m-                              NGX_MAX_INT32_VALUE);[m
[31m-    ngx_conf_merge_uint_value(conf->client_body_in_file_only,[m
[31m-                              prev->client_body_in_file_only,[m
[31m-                              NGX_HTTP_REQUEST_BODY_FILE_OFF);[m
[31m-    ngx_conf_merge_value(conf->client_body_in_single_buffer,[m
[31m-                              prev->client_body_in_single_buffer, 0);[m
[31m-    ngx_conf_merge_value(conf->internal, prev->internal, 0);[m
[31m-    ngx_conf_merge_value(conf->sendfile, prev->sendfile, 0);[m
[31m-    ngx_conf_merge_size_value(conf->sendfile_max_chunk,[m
[31m-                              prev->sendfile_max_chunk, 0);[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    ngx_conf_merge_value(conf->aio, prev->aio, NGX_HTTP_AIO_OFF);[m
[31m-    ngx_conf_merge_value(conf->aio_write, prev->aio_write, 0);[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_conf_merge_ptr_value(conf->thread_pool, prev->thread_pool, NULL);[m
[31m-    ngx_conf_merge_ptr_value(conf->thread_pool_value, prev->thread_pool_value,[m
[31m-                             NULL);[m
[31m-#endif[m
[31m-    ngx_conf_merge_size_value(conf->read_ahead, prev->read_ahead, 0);[m
[31m-    ngx_conf_merge_off_value(conf->directio, prev->directio,[m
[31m-                              NGX_OPEN_FILE_DIRECTIO_OFF);[m
[31m-    ngx_conf_merge_off_value(conf->directio_alignment, prev->directio_alignment,[m
[31m-                              512);[m
[31m-    ngx_conf_merge_value(conf->tcp_nopush, prev->tcp_nopush, 0);[m
[31m-    ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->send_timeout, prev->send_timeout, 60000);[m
[31m-    ngx_conf_merge_size_value(conf->send_lowat, prev->send_lowat, 0);[m
[31m-    ngx_conf_merge_size_value(conf->postpone_output, prev->postpone_output,[m
[31m-                              1460);[m
[31m-    ngx_conf_merge_size_value(conf->limit_rate, prev->limit_rate, 0);[m
[31m-    ngx_conf_merge_size_value(conf->limit_rate_after, prev->limit_rate_after,[m
[31m-                              0);[m
[31m-    ngx_conf_merge_msec_value(conf->keepalive_timeout,[m
[31m-                              prev->keepalive_timeout, 75000);[m
[31m-    ngx_conf_merge_sec_value(conf->keepalive_header,[m
[31m-                              prev->keepalive_header, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->keepalive_requests,[m
[31m-                              prev->keepalive_requests, 100);[m
[31m-    ngx_conf_merge_uint_value(conf->lingering_close,[m
[31m-                              prev->lingering_close, NGX_HTTP_LINGERING_ON);[m
[31m-    ngx_conf_merge_msec_value(conf->lingering_time,[m
[31m-                              prev->lingering_time, 30000);[m
[31m-    ngx_conf_merge_msec_value(conf->lingering_timeout,[m
[31m-                              prev->lingering_timeout, 5000);[m
[31m-    ngx_conf_merge_msec_value(conf->resolver_timeout,[m
[31m-                              prev->resolver_timeout, 30000);[m
[31m-[m
[31m-    if (conf->resolver == NULL) {[m
[31m-[m
[31m-        if (prev->resolver == NULL) {[m
[31m-[m
[31m-            /*[m
[31m-             * create dummy resolver in http {} context[m
[31m-             * to inherit it in all servers[m
[31m-             */[m
[31m-[m
[31m-            prev->resolver = ngx_resolver_create(cf, NULL, 0);[m
[31m-            if (prev->resolver == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        conf->resolver = prev->resolver;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->client_body_temp_path,[m
[31m-                              prev->client_body_temp_path,[m
[31m-                              &ngx_http_client_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->reset_timedout_connection,[m
[31m-                              prev->reset_timedout_connection, 0);[m
[31m-    ngx_conf_merge_value(conf->server_name_in_redirect,[m
[31m-                              prev->server_name_in_redirect, 0);[m
[31m-    ngx_conf_merge_value(conf->port_in_redirect, prev->port_in_redirect, 1);[m
[31m-    ngx_conf_merge_value(conf->msie_padding, prev->msie_padding, 1);[m
[31m-    ngx_conf_merge_value(conf->msie_refresh, prev->msie_refresh, 0);[m
[31m-    ngx_conf_merge_value(conf->log_not_found, prev->log_not_found, 1);[m
[31m-    ngx_conf_merge_value(conf->log_subrequest, prev->log_subrequest, 0);[m
[31m-    ngx_conf_merge_value(conf->recursive_error_pages,[m
[31m-                              prev->recursive_error_pages, 0);[m
[31m-    ngx_conf_merge_value(conf->server_tokens, prev->server_tokens, 1);[m
[31m-    ngx_conf_merge_value(conf->chunked_transfer_encoding,[m
[31m-                              prev->chunked_transfer_encoding, 1);[m
[31m-    ngx_conf_merge_value(conf->etag, prev->etag, 1);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->open_file_cache,[m
[31m-                              prev->open_file_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_valid,[m
[31m-                              prev->open_file_cache_valid, 60);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->open_file_cache_min_uses,[m
[31m-                              prev->open_file_cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_errors,[m
[31m-                              prev->open_file_cache_errors, 0);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_events,[m
[31m-                              prev->open_file_cache_events, 0);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->gzip_vary, prev->gzip_vary, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->gzip_http_version, prev->gzip_http_version,[m
[31m-                              NGX_HTTP_VERSION_11);[m
[31m-    ngx_conf_merge_bitmask_value(conf->gzip_proxied, prev->gzip_proxied,[m
[31m-                              (NGX_CONF_BITMASK_SET|NGX_HTTP_GZIP_PROXIED_OFF));[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_conf_merge_ptr_value(conf->gzip_disable, prev->gzip_disable, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->gzip_disable_msie6 == 3) {[m
[31m-        conf->gzip_disable_msie6 =[m
[31m-            (prev->gzip_disable_msie6 == 3) ? 0 : prev->gzip_disable_msie6;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-    if (conf->gzip_disable_degradation == 3) {[m
[31m-        conf->gzip_disable_degradation =[m
[31m-            (prev->gzip_disable_degradation == 3) ?[m
[31m-                 0 : prev->gzip_disable_degradation;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    ngx_conf_merge_uint_value(conf->disable_symlinks, prev->disable_symlinks,[m
[31m-                              NGX_DISABLE_SYMLINKS_OFF);[m
[31m-    ngx_conf_merge_ptr_value(conf->disable_symlinks_from,[m
[31m-                             prev->disable_symlinks_from, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *cscf = conf;[m
[31m-[m
[31m-    ngx_str_t              *value, size;[m
[31m-    ngx_url_t               u;[m
[31m-    ngx_uint_t              n;[m
[31m-    ngx_http_listen_opt_t   lsopt;[m
[31m-[m
[31m-    cscf->listen = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.listen = 1;[m
[31m-    u.default_port = 80;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in \"%V\" of the \"listen\" directive",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));[m
[31m-[m
[31m-    ngx_memcpy(&lsopt.u.sockaddr, u.sockaddr, u.socklen);[m
[31m-[m
[31m-    lsopt.socklen = u.socklen;[m
[31m-    lsopt.backlog = NGX_LISTEN_BACKLOG;[m
[31m-    lsopt.rcvbuf = -1;[m
[31m-    lsopt.sndbuf = -1;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    lsopt.setfib = -1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    lsopt.fastopen = -1;[m
[31m-#endif[m
[31m-    lsopt.wildcard = u.wildcard;[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    lsopt.ipv6only = 1;[m
[31m-#endif[m
[31m-[m
[31m-    (void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.socklen, lsopt.addr,[m
[31m-                         NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-    for (n = 2; n < cf->args->nelts; n++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "default_server") == 0[m
[31m-            || ngx_strcmp(value[n].data, "default") == 0)[m
[31m-        {[m
[31m-            lsopt.default_server = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "bind") == 0) {[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        if (ngx_strncmp(value[n].data, "setfib=", 7) == 0) {[m
[31m-            lsopt.setfib = ngx_atoi(value[n].data + 7, value[n].len - 7);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.setfib == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid setfib \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        if (ngx_strncmp(value[n].data, "fastopen=", 9) == 0) {[m
[31m-            lsopt.fastopen = ngx_atoi(value[n].data + 9, value[n].len - 9);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.fastopen == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid fastopen \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "backlog=", 8) == 0) {[m
[31m-            lsopt.backlog = ngx_atoi(value[n].data + 8, value[n].len - 8);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.backlog == NGX_ERROR || lsopt.backlog == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid backlog \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "rcvbuf=", 7) == 0) {[m
[31m-            size.len = value[n].len - 7;[m
[31m-            size.data = value[n].data + 7;[m
[31m-[m
[31m-            lsopt.rcvbuf = ngx_parse_size(&size);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.rcvbuf == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid rcvbuf \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "sndbuf=", 7) == 0) {[m
[31m-            size.len = value[n].len - 7;[m
[31m-            size.data = value[n].data + 7;[m
[31m-[m
[31m-            lsopt.sndbuf = ngx_parse_size(&size);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.sndbuf == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid sndbuf \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "accept_filter=", 14) == 0) {[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-            lsopt.accept_filter = (char *) &value[n].data[14];[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "accept filters \"%V\" are not supported "[m
[31m-                               "on this platform, ignored",[m
[31m-                               &value[n]);[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "deferred") == 0) {[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-            lsopt.deferred_accept = 1;[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the deferred accept is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "ipv6only=o", 10) == 0) {[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            struct sockaddr  *sa;[m
[31m-[m
[31m-            sa = &lsopt.u.sockaddr;[m
[31m-[m
[31m-            if (sa->sa_family == AF_INET6) {[m
[31m-[m
[31m-                if (ngx_strcmp(&value[n].data[10], "n") == 0) {[m
[31m-                    lsopt.ipv6only = 1;[m
[31m-[m
[31m-                } else if (ngx_strcmp(&value[n].data[10], "ff") == 0) {[m
[31m-                    lsopt.ipv6only = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid ipv6only flags \"%s\"",[m
[31m-                                       &value[n].data[9]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                lsopt.set = 1;[m
[31m-                lsopt.bind = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "ipv6only is not supported "[m
[31m-                                   "on addr \"%s\", ignored", lsopt.addr);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "ipv6only is not supported "[m
[31m-                               "on this platform");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "reuseport") == 0) {[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            lsopt.reuseport = 1;[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "reuseport is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "ssl") == 0) {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            lsopt.ssl = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"ssl\" parameter requires "[m
[31m-                               "ngx_http_ssl_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "http2") == 0) {[m
[31m-#if (NGX_HTTP_V2)[m
[31m-            lsopt.http2 = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"http2\" parameter requires "[m
[31m-                               "ngx_http_v2_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "spdy") == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "invalid parameter \"spdy\": "[m
[31m-                               "ngx_http_spdy_module was superseded "[m
[31m-                               "by ngx_http_v2_module");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "so_keepalive=", 13) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[n].data[13], "on") == 0) {[m
[31m-                lsopt.so_keepalive = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[n].data[13], "off") == 0) {[m
[31m-                lsopt.so_keepalive = 2;[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-                u_char     *p, *end;[m
[31m-                ngx_str_t   s;[m
[31m-[m
[31m-                end = value[n].data + value[n].len;[m
[31m-                s.data = value[n].data + 13;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepidle = ngx_parse_time(&s, 1);[m
[31m-                    if (lsopt.tcp_keepidle == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepintvl = ngx_parse_time(&s, 1);[m
[31m-                    if (lsopt.tcp_keepintvl == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                if (s.data < end) {[m
[31m-                    s.len = end - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepcnt = ngx_atoi(s.data, s.len);[m
[31m-                    if (lsopt.tcp_keepcnt == NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (lsopt.tcp_keepidle == 0 && lsopt.tcp_keepintvl == 0[m
[31m-                    && lsopt.tcp_keepcnt == 0)[m
[31m-                {[m
[31m-                    goto invalid_so_keepalive;[m
[31m-                }[m
[31m-[m
[31m-                lsopt.so_keepalive = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"so_keepalive\" parameter accepts "[m
[31m-                                   "only \"on\" or \"off\" on this platform");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-        invalid_so_keepalive:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid so_keepalive value: \"%s\"",[m
[31m-                               &value[n].data[13]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "proxy_protocol") == 0) {[m
[31m-            lsopt.proxy_protocol = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[n]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_add_listen(cf, cscf, &lsopt) == NGX_OK) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *cscf = conf;[m
[31m-[m
[31m-    u_char                   ch;[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        ch = value[i].data[0];[m
[31m-[m
[31m-        if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.'))[m
[31m-            || (ch == '.' && value[i].len < 2))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "server name \"%V\" is invalid", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strchr(value[i].data, '/')) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "server name \"%V\" has suspicious symbols",[m
[31m-                               &value[i]);[m
[31m-        }[m
[31m-[m
[31m-        sn = ngx_array_push(&cscf->server_names);[m
[31m-        if (sn == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        sn->regex = NULL;[m
[31m-#endif[m
[31m-        sn->server = cscf;[m
[31m-[m
[31m-        if (ngx_strcasecmp(value[i].data, (u_char *) "$hostname") == 0) {[m
[31m-            sn->name = cf->cycle->hostname;[m
[31m-[m
[31m-        } else {[m
[31m-            sn->name = value[i];[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].data[0] != '~') {[m
[31m-            ngx_strlow(sn->name.data, sn->name.data, sn->name.len);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        {[m
[31m-        u_char               *p;[m
[31m-        ngx_regex_compile_t   rc;[m
[31m-        u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-        if (value[i].len == 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "empty regex in server name \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value[i].len--;[m
[31m-        value[i].data++;[m
[31m-[m
[31m-        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-        rc.pattern = value[i];[m
[31m-        rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-        rc.err.data = errstr;[m
[31m-[m
[31m-        for (p = value[i].data; p < value[i].data + value[i].len; p++) {[m
[31m-            if (*p >= 'A' && *p <= 'Z') {[m
[31m-                rc.options = NGX_REGEX_CASELESS;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        sn->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-        if (sn->regex == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sn->name = value[i];[m
[31m-        cscf->captures = (rc.captures > 0);[m
[31m-        }[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "using regex \"%V\" "[m
[31m-                           "requires PCRE library", &value[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_int_t                   alias;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    alias = (cmd->name.len == sizeof("alias") - 1) ? 1 : 0;[m
[31m-[m
[31m-    if (clcf->root.data) {[m
[31m-[m
[31m-        if ((clcf->alias != 0) == alias) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" directive is duplicate",[m
[31m-                               &cmd->name);[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" directive is duplicate, "[m
[31m-                               "\"%s\" directive was specified earlier",[m
[31m-                               &cmd->name, clcf->alias ? "alias" : "root");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->named && alias) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the \"alias\" directive cannot be used "[m
[31m-                           "inside the named location");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strstr(value[1].data, "$document_root")[m
[31m-        || ngx_strstr(value[1].data, "${document_root}"))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the $document_root variable cannot be used "[m
[31m-                           "in the \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstr(value[1].data, "$realpath_root")[m
[31m-        || ngx_strstr(value[1].data, "${realpath_root}"))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the $realpath_root variable cannot be used "[m
[31m-                           "in the \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->alias = alias ? clcf->name.len : 0;[m
[31m-    clcf->root = value[1];[m
[31m-[m
[31m-    if (!alias && clcf->root.len > 0[m
[31m-        && clcf->root.data[clcf->root.len - 1] == '/')[m
[31m-    {[m
[31m-        clcf->root.len--;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->root.data[0] != '$') {[m
[31m-        if (ngx_conf_full_name(cf->cycle, &clcf->root, 0) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&clcf->root);[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-    sc.variables = n;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (alias && clcf->regex) {[m
[31m-        clcf->alias = NGX_MAX_SIZE_T_VALUE;[m
[31m-        n = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (n) {[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &clcf->root;[m
[31m-        sc.lengths = &clcf->root_lengths;[m
[31m-        sc.values = &clcf->root_values;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_method_name_t  ngx_methods_names[] = {[m
[31m-    { (u_char *) "GET",       (uint32_t) ~NGX_HTTP_GET },[m
[31m-    { (u_char *) "HEAD",      (uint32_t) ~NGX_HTTP_HEAD },[m
[31m-    { (u_char *) "POST",      (uint32_t) ~NGX_HTTP_POST },[m
[31m-    { (u_char *) "PUT",       (uint32_t) ~NGX_HTTP_PUT },[m
[31m-    { (u_char *) "DELETE",    (uint32_t) ~NGX_HTTP_DELETE },[m
[31m-    { (u_char *) "MKCOL",     (uint32_t) ~NGX_HTTP_MKCOL },[m
[31m-    { (u_char *) "COPY",      (uint32_t) ~NGX_HTTP_COPY },[m
[31m-    { (u_char *) "MOVE",      (uint32_t) ~NGX_HTTP_MOVE },[m
[31m-    { (u_char *) "OPTIONS",   (uint32_t) ~NGX_HTTP_OPTIONS },[m
[31m-    { (u_char *) "PROPFIND",  (uint32_t) ~NGX_HTTP_PROPFIND },[m
[31m-    { (u_char *) "PROPPATCH", (uint32_t) ~NGX_HTTP_PROPPATCH },[m
[31m-    { (u_char *) "LOCK",      (uint32_t) ~NGX_HTTP_LOCK },[m
[31m-    { (u_char *) "UNLOCK",    (uint32_t) ~NGX_HTTP_UNLOCK },[m
[31m-    { (u_char *) "PATCH",     (uint32_t) ~NGX_HTTP_PATCH },[m
[31m-    { NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_limit_except(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *pclcf = conf;[m
[31m-[m
[31m-    char                      *rv;[m
[31m-    void                      *mconf;[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_conf_t                 save;[m
[31m-    ngx_http_module_t         *module;[m
[31m-    ngx_http_conf_ctx_t       *ctx, *pctx;[m
[31m-    ngx_http_method_name_t    *name;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (pclcf->limit_except) {[m
[31m-        return "duplicate";[m
[31m-    }[m
[31m-[m
[31m-    pclcf->limit_except = 0xffffffff;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        for (name = ngx_methods_names; name->name; name++) {[m
[31m-[m
[31m-            if (ngx_strcasecmp(value[i].data, name->name) == 0) {[m
[31m-                pclcf->limit_except &= name->method;[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid method \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    if (!(pclcf->limit_except & NGX_HTTP_GET)) {[m
[31m-        pclcf->limit_except &= (uint32_t) ~NGX_HTTP_HEAD;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    pclcf->limit_except_loc_conf = ctx->loc_conf;[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-    clcf->name = pclcf->name;[m
[31m-    clcf->noname = 1;[m
[31m-    clcf->lmt_excpt = 1;[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_LMT_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_set_aio(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->aio != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    clcf->thread_pool = NULL;[m
[31m-    clcf->thread_pool_value = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        clcf->aio = NGX_HTTP_AIO_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-        clcf->aio = NGX_HTTP_AIO_ON;[m
[31m-        return NGX_CONF_OK;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"aio on\" "[m
[31m-                           "is unsupported on this platform");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "sendfile") == 0) {[m
[31m-        clcf->aio = NGX_HTTP_AIO_ON;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "the \"sendfile\" parameter of "[m
[31m-                           "the \"aio\" directive is deprecated");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "threads", 7) == 0[m
[31m-        && (value[1].len == 7 || value[1].data[7] == '='))[m
[31m-    {[m
[31m-#if (NGX_THREADS)[m
[31m-        ngx_str_t                          name;[m
[31m-        ngx_thread_pool_t                 *tp;[m
[31m-        ngx_http_complex_value_t           cv;[m
[31m-        ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-        clcf->aio = NGX_HTTP_AIO_THREADS;[m
[31m-[m
[31m-        if (value[1].len >= 8) {[m
[31m-            name.len = value[1].len - 8;[m
[31m-            name.data = value[1].data + 8;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &name;[m
[31m-            ccv.complex_value = &cv;[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (cv.lengths != NULL) {[m
[31m-                clcf->thread_pool_value = ngx_palloc(cf->pool,[m
[31m-                                    sizeof(ngx_http_complex_value_t));[m
[31m-                if (clcf->thread_pool_value == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                *clcf->thread_pool_value = cv;[m
[31m-[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            tp = ngx_thread_pool_add(cf, &name);[m
[31m-[m
[31m-        } else {[m
[31m-            tp = ngx_thread_pool_add(cf, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf->thread_pool = tp;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"aio threads\" "[m
[31m-                           "is unsupported on this platform");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return "invalid value";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->directio != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        clcf->directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf->directio = ngx_parse_offset(&value[1]);[m
[31m-    if (clcf->directio == (off_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_int_t                          overwrite;[m
[31m-    ngx_str_t                         *value, uri, args;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_http_err_page_t               *err;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return "conflicts with \"no_error_pages\"";[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->error_pages == NGX_CONF_UNSET_PTR) {[m
[31m-        clcf->error_pages = ngx_array_create(cf->pool, 4,[m
[31m-                                             sizeof(ngx_http_err_page_t));[m
[31m-        if (clcf->error_pages == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    i = cf->args->nelts - 2;[m
[31m-[m
[31m-    if (value[i].data[0] == '=') {[m
[31m-        if (i == 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > 1) {[m
[31m-            overwrite = ngx_atoi(&value[i].data[1], value[i].len - 1);[m
[31m-[m
[31m-            if (overwrite == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            overwrite = 0;[m
[31m-        }[m
[31m-[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        overwrite = -1;[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    uri = value[cf->args->nelts - 1];[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &uri;[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_null(&args);[m
[31m-[m
[31m-    if (cv.lengths == NULL && uri.len && uri.data[0] == '/') {[m
[31m-        p = (u_char *) ngx_strchr(uri.data, '?');[m
[31m-[m
[31m-        if (p) {[m
[31m-            cv.value.len = p - uri.data;[m
[31m-            cv.value.data = uri.data;[m
[31m-            p++;[m
[31m-            args.len = (uri.data + uri.len) - p;[m
[31m-            args.data = p;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts - n; i++) {[m
[31m-        err = ngx_array_push(clcf->error_pages);[m
[31m-        if (err == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        err->status = ngx_atoi(value[i].data, value[i].len);[m
[31m-[m
[31m-        if (err->status == NGX_ERROR || err->status == 499) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (err->status < 300 || err->status > 599) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "value \"%V\" must be between 300 and 599",[m
[31m-                               &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        err->overwrite = overwrite;[m
[31m-[m
[31m-        if (overwrite == -1) {[m
[31m-            switch (err->status) {[m
[31m-                case NGX_HTTP_TO_HTTPS:[m
[31m-                case NGX_HTTPS_CERT_ERROR:[m
[31m-                case NGX_HTTPS_NO_CERT:[m
[31m-                    err->overwrite = NGX_HTTP_BAD_REQUEST;[m
[31m-                default:[m
[31m-                    break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        err->value = cv;[m
[31m-        err->args = args;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->error_pages != NGX_CONF_UNSET_PTR) {[m
[31m-        return "conflicts with \"error_page\"";[m
[31m-    }[m
[31m-[m
[31m-    clcf->error_pages = NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_int_t                   code;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_try_file_t        *tf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    if (clcf->try_files) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    cmcf->try_files = 1;[m
[31m-[m
[31m-    tf = ngx_pcalloc(cf->pool, cf->args->nelts * sizeof(ngx_http_try_file_t));[m
[31m-    if (tf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->try_files = tf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 0; i < cf->args->nelts - 1; i++) {[m
[31m-[m
[31m-        tf[i].name = value[i + 1];[m
[31m-[m
[31m-        if (tf[i].name.len > 0[m
[31m-            && tf[i].name.data[tf[i].name.len - 1] == '/'[m
[31m-            && i + 2 < cf->args->nelts)[m
[31m-        {[m
[31m-            tf[i].test_dir = 1;[m
[31m-            tf[i].name.len--;[m
[31m-            tf[i].name.data[tf[i].name.len] = '\0';[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_http_script_variables_count(&tf[i].name);[m
[31m-[m
[31m-        if (n) {[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &tf[i].name;[m
[31m-            sc.lengths = &tf[i].lengths;[m
[31m-            sc.values = &tf[i].values;[m
[31m-            sc.variables = n;[m
[31m-            sc.complete_lengths = 1;[m
[31m-            sc.complete_values = 1;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* add trailing '\0' to length */[m
[31m-            tf[i].name.len++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (tf[i - 1].name.data[0] == '=') {[m
[31m-[m
[31m-        code = ngx_atoi(tf[i - 1].name.data + 1, tf[i - 1].name.len - 2);[m
[31m-[m
[31m-        if (code == NGX_ERROR || code > 999) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid code \"%*s\"",[m
[31m-                               tf[i - 1].name.len - 1, tf[i - 1].name.data);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tf[i].code = code;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    time_t       inactive;[m
[31m-    ngx_str_t   *value, s;[m
[31m-    ngx_int_t    max;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (clcf->open_file_cache != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    max = 0;[m
[31m-    inactive = 60;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", 4) == 0) {[m
[31m-[m
[31m-            max = ngx_atoi(value[i].data + 4, value[i].len - 4);[m
[31m-            if (max <= 0) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-[m
[31m-            clcf->open_file_cache = NULL;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    failed:[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid \"open_file_cache\" parameter \"%V\"",[m
[31m-                           &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->open_file_cache == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (max == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "\"open_file_cache\" must have the \"max\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive);[m
[31m-    if (clcf->open_file_cache) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &clcf->error_log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->keepalive_timeout != NGX_CONF_UNSET_MSEC) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    clcf->keepalive_timeout = ngx_parse_time(&value[1], 0);[m
[31m-[m
[31m-    if (clcf->keepalive_timeout == (ngx_msec_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf->keepalive_header = ngx_parse_time(&value[2], 1);[m
[31m-[m
[31m-    if (clcf->keepalive_header == (time_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_internal(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    if (clcf->internal != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf->internal = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->resolver) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    clcf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);[m
[31m-    if (clcf->resolver == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf = conf;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_regex_elt_t      *re;[m
[31m-    ngx_regex_compile_t   rc;[m
[31m-    u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    if (clcf->gzip_disable == NGX_CONF_UNSET_PTR) {[m
[31m-        clcf->gzip_disable = ngx_array_create(cf->pool, 2,[m
[31m-                                              sizeof(ngx_regex_elt_t));[m
[31m-        if (clcf->gzip_disable == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "msie6") == 0) {[m
[31m-            clcf->gzip_disable_msie6 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "degradation") == 0) {[m
[31m-            clcf->gzip_disable_degradation = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        re = ngx_array_push(clcf->gzip_disable);[m
[31m-        if (re == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc.pattern = value[i];[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-[m
[31m-        if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        re->regex = rc.regex;[m
[31m-        re->name = value[i].data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (ngx_strcmp(value[i].data, "msie6") == 0) {[m
[31m-            clcf->gzip_disable_msie6 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "degradation") == 0) {[m
[31m-            clcf->gzip_disable_degradation = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "without PCRE library \"gzip_disable\" supports "[m
[31m-                           "builtin \"msie6\" and \"degradation\" mask only");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_disable_symlinks(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (clcf->disable_symlinks != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_OFF;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "if_not_owner") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_NOTOWNER;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "on") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_ON;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "from=", 5) == 0) {[m
[31m-            value[i].len -= 5;[m
[31m-            value[i].data += 5;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &value[i];[m
[31m-            ccv.complex_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_complex_value_t));[m
[31m-            if (ccv.complex_value == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            clcf->disable_symlinks_from = ccv.complex_value;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks == NGX_CONF_UNSET_UINT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"off\", \"on\" "[m
[31m-                           "or \"if_not_owner\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        clcf->disable_symlinks_from = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks_from == NGX_CONF_UNSET_PTR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate parameters \"%V %V\"",[m
[31m-                           &value[1], &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"from=\" cannot be used with \"off\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_pool_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp < NGX_MIN_POOL_SIZE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be no less than %uz",[m
[31m-                           NGX_MIN_POOL_SIZE);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*sp % NGX_POOL_ALIGNMENT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be a multiple of %uz",[m
[31m-                           NGX_POOL_ALIGNMENT);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.h[m
[1mdeleted file mode 100644[m
[1mindex 6c446a0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_core_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,604 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_CORE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_CORE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-#include <ngx_thread_pool.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_GZIP_PROXIED_OFF       0x0002[m
[31m-#define NGX_HTTP_GZIP_PROXIED_EXPIRED   0x0004[m
[31m-#define NGX_HTTP_GZIP_PROXIED_NO_CACHE  0x0008[m
[31m-#define NGX_HTTP_GZIP_PROXIED_NO_STORE  0x0010[m
[31m-#define NGX_HTTP_GZIP_PROXIED_PRIVATE   0x0020[m
[31m-#define NGX_HTTP_GZIP_PROXIED_NO_LM     0x0040[m
[31m-#define NGX_HTTP_GZIP_PROXIED_NO_ETAG   0x0080[m
[31m-#define NGX_HTTP_GZIP_PROXIED_AUTH      0x0100[m
[31m-#define NGX_HTTP_GZIP_PROXIED_ANY       0x0200[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_AIO_OFF                0[m
[31m-#define NGX_HTTP_AIO_ON                 1[m
[31m-#define NGX_HTTP_AIO_THREADS            2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_SATISFY_ALL            0[m
[31m-#define NGX_HTTP_SATISFY_ANY            1[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LINGERING_OFF          0[m
[31m-#define NGX_HTTP_LINGERING_ON           1[m
[31m-#define NGX_HTTP_LINGERING_ALWAYS       2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMS_OFF                0[m
[31m-#define NGX_HTTP_IMS_EXACT              1[m
[31m-#define NGX_HTTP_IMS_BEFORE             2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_KEEPALIVE_DISABLE_NONE    0x0002[m
[31m-#define NGX_HTTP_KEEPALIVE_DISABLE_MSIE6   0x0004[m
[31m-#define NGX_HTTP_KEEPALIVE_DISABLE_SAFARI  0x0008[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_location_tree_node_s  ngx_http_location_tree_node_t;[m
[31m-typedef struct ngx_http_core_loc_conf_s  ngx_http_core_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    union {[m
[31m-        struct sockaddr        sockaddr;[m
[31m-        struct sockaddr_in     sockaddr_in;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        struct sockaddr_in6    sockaddr_in6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        struct sockaddr_un     sockaddr_un;[m
[31m-#endif[m
[31m-        u_char                 sockaddr_data[NGX_SOCKADDRLEN];[m
[31m-    } u;[m
[31m-[m
[31m-    socklen_t                  socklen;[m
[31m-[m
[31m-    unsigned                   set:1;[m
[31m-    unsigned                   default_server:1;[m
[31m-    unsigned                   bind:1;[m
[31m-    unsigned                   wildcard:1;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    unsigned                   ssl:1;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    unsigned                   http2:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    unsigned                   ipv6only:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    unsigned                   reuseport:1;[m
[31m-#endif[m
[31m-    unsigned                   so_keepalive:2;[m
[31m-    unsigned                   proxy_protocol:1;[m
[31m-[m
[31m-    int                        backlog;[m
[31m-    int                        rcvbuf;[m
[31m-    int                        sndbuf;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    int                        setfib;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    int                        fastopen;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    int                        tcp_keepidle;[m
[31m-    int                        tcp_keepintvl;[m
[31m-    int                        tcp_keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-    char                      *accept_filter;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-    ngx_uint_t                 deferred_accept;[m
[31m-#endif[m
[31m-[m
[31m-    u_char                     addr[NGX_SOCKADDR_STRLEN + 1];[m
[31m-} ngx_http_listen_opt_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_POST_READ_PHASE = 0,[m
[31m-[m
[31m-    NGX_HTTP_SERVER_REWRITE_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_FIND_CONFIG_PHASE,[m
[31m-    NGX_HTTP_REWRITE_PHASE,[m
[31m-    NGX_HTTP_POST_REWRITE_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_PREACCESS_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_ACCESS_PHASE,[m
[31m-    NGX_HTTP_POST_ACCESS_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_TRY_FILES_PHASE,[m
[31m-    NGX_HTTP_CONTENT_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_LOG_PHASE[m
[31m-} ngx_http_phases;[m
[31m-[m
[31m-typedef struct ngx_http_phase_handler_s  ngx_http_phase_handler_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_phase_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-[m
[31m-struct ngx_http_phase_handler_s {[m
[31m-    ngx_http_phase_handler_pt  checker;[m
[31m-    ngx_http_handler_pt        handler;[m
[31m-    ngx_uint_t                 next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_phase_handler_t  *handlers;[m
[31m-    ngx_uint_t                 server_rewrite_index;[m
[31m-    ngx_uint_t                 location_rewrite_index;[m
[31m-} ngx_http_phase_engine_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                handlers;[m
[31m-} ngx_http_phase_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                servers;         /* ngx_http_core_srv_conf_t */[m
[31m-[m
[31m-    ngx_http_phase_engine_t    phase_engine;[m
[31m-[m
[31m-    ngx_hash_t                 headers_in_hash;[m
[31m-[m
[31m-    ngx_hash_t                 variables_hash;[m
[31m-[m
[31m-    ngx_array_t                variables;       /* ngx_http_variable_t */[m
[31m-    ngx_uint_t                 ncaptures;[m
[31m-[m
[31m-    ngx_uint_t                 server_names_hash_max_size;[m
[31m-    ngx_uint_t                 server_names_hash_bucket_size;[m
[31m-[m
[31m-    ngx_uint_t                 variables_hash_max_size;[m
[31m-    ngx_uint_t                 variables_hash_bucket_size;[m
[31m-[m
[31m-    ngx_hash_keys_arrays_t    *variables_keys;[m
[31m-[m
[31m-    ngx_array_t               *ports;[m
[31m-[m
[31m-    ngx_uint_t                 try_files;       /* unsigned  try_files:1 */[m
[31m-[m
[31m-    ngx_http_phase_t           phases[NGX_HTTP_LOG_PHASE + 1];[m
[31m-} ngx_http_core_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* array of the ngx_http_server_name_t, "server_name" directive */[m
[31m-    ngx_array_t                 server_names;[m
[31m-[m
[31m-    /* server ctx */[m
[31m-    ngx_http_conf_ctx_t        *ctx;[m
[31m-[m
[31m-    ngx_str_t                   server_name;[m
[31m-[m
[31m-    size_t                      connection_pool_size;[m
[31m-    size_t                      request_pool_size;[m
[31m-    size_t                      client_header_buffer_size;[m
[31m-[m
[31m-    ngx_bufs_t                  large_client_header_buffers;[m
[31m-[m
[31m-    ngx_msec_t                  client_header_timeout;[m
[31m-[m
[31m-    ngx_flag_t                  ignore_invalid_headers;[m
[31m-    ngx_flag_t                  merge_slashes;[m
[31m-    ngx_flag_t                  underscores_in_headers;[m
[31m-[m
[31m-    unsigned                    listen:1;[m
[31m-#if (NGX_PCRE)[m
[31m-    unsigned                    captures:1;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_core_loc_conf_t  **named_locations;[m
[31m-} ngx_http_core_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-/* list of structures to find core_srv_conf quickly at run time */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_regex_t          *regex;[m
[31m-#endif[m
[31m-    ngx_http_core_srv_conf_t  *server;   /* virtual name server conf */[m
[31m-    ngx_str_t                  name;[m
[31m-} ngx_http_server_name_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_combined_t        names;[m
[31m-[m
[31m-    ngx_uint_t                 nregex;[m
[31m-    ngx_http_server_name_t    *regex;[m
[31m-} ngx_http_virtual_names_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_addr_conf_s {[m
[31m-    /* the default server configuration for this address:port */[m
[31m-    ngx_http_core_srv_conf_t  *default_server;[m
[31m-[m
[31m-    ngx_http_virtual_names_t  *virtual_names;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    unsigned                   ssl:1;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    unsigned                   http2:1;[m
[31m-#endif[m
[31m-    unsigned                   proxy_protocol:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t                  addr;[m
[31m-    ngx_http_addr_conf_t       conf;[m
[31m-} ngx_http_in_addr_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr            addr6;[m
[31m-    ngx_http_addr_conf_t       conf;[m
[31m-} ngx_http_in6_addr_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* ngx_http_in_addr_t or ngx_http_in6_addr_t */[m
[31m-    void                      *addrs;[m
[31m-    ngx_uint_t                 naddrs;[m
[31m-} ngx_http_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                  family;[m
[31m-    in_port_t                  port;[m
[31m-    ngx_array_t                addrs;     /* array of ngx_http_conf_addr_t */[m
[31m-} ngx_http_conf_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_listen_opt_t      opt;[m
[31m-[m
[31m-    ngx_hash_t                 hash;[m
[31m-    ngx_hash_wildcard_t       *wc_head;[m
[31m-    ngx_hash_wildcard_t       *wc_tail;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                 nregex;[m
[31m-    ngx_http_server_name_t    *regex;[m
[31m-#endif[m
[31m-[m
[31m-    /* the default server configuration for this address:port */[m
[31m-    ngx_http_core_srv_conf_t  *default_server;[m
[31m-    ngx_array_t                servers;  /* array of ngx_http_core_srv_conf_t */[m
[31m-} ngx_http_conf_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                  status;[m
[31m-    ngx_int_t                  overwrite;[m
[31m-    ngx_http_complex_value_t   value;[m
[31m-    ngx_str_t                  args;[m
[31m-} ngx_http_err_page_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t               *lengths;[m
[31m-    ngx_array_t               *values;[m
[31m-    ngx_str_t                  name;[m
[31m-[m
[31m-    unsigned                   code:10;[m
[31m-    unsigned                   test_dir:1;[m
[31m-} ngx_http_try_file_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_core_loc_conf_s {[m
[31m-    ngx_str_t     name;          /* location name */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_regex_t  *regex;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned      noname:1;   /* "if () {}" block or limit_except */[m
[31m-    unsigned      lmt_excpt:1;[m
[31m-    unsigned      named:1;[m
[31m-[m
[31m-    unsigned      exact_match:1;[m
[31m-    unsigned      noregex:1;[m
[31m-[m
[31m-    unsigned      auto_redirect:1;[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    unsigned      gzip_disable_msie6:2;[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-    unsigned      gzip_disable_degradation:2;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_location_tree_node_t   *static_locations;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_core_loc_conf_t       **regex_locations;[m
[31m-#endif[m
[31m-[m
[31m-    /* pointer to the modules' loc_conf */[m
[31m-    void        **loc_conf;[m
[31m-[m
[31m-    uint32_t      limit_except;[m
[31m-    void        **limit_except_loc_conf;[m
[31m-[m
[31m-    ngx_http_handler_pt  handler;[m
[31m-[m
[31m-    /* location name length for inclusive location with inherited alias */[m
[31m-    size_t        alias;[m
[31m-    ngx_str_t     root;                    /* root, alias */[m
[31m-    ngx_str_t     post_action;[m
[31m-[m
[31m-    ngx_array_t  *root_lengths;[m
[31m-    ngx_array_t  *root_values;[m
[31m-[m
[31m-    ngx_array_t  *types;[m
[31m-    ngx_hash_t    types_hash;[m
[31m-    ngx_str_t     default_type;[m
[31m-[m
[31m-    off_t         client_max_body_size;    /* client_max_body_size */[m
[31m-    off_t         directio;                /* directio */[m
[31m-    off_t         directio_alignment;      /* directio_alignment */[m
[31m-[m
[31m-    size_t        client_body_buffer_size; /* client_body_buffer_size */[m
[31m-    size_t        send_lowat;              /* send_lowat */[m
[31m-    size_t        postpone_output;         /* postpone_output */[m
[31m-    size_t        limit_rate;              /* limit_rate */[m
[31m-    size_t        limit_rate_after;        /* limit_rate_after */[m
[31m-    size_t        sendfile_max_chunk;      /* sendfile_max_chunk */[m
[31m-    size_t        read_ahead;              /* read_ahead */[m
[31m-[m
[31m-    ngx_msec_t    client_body_timeout;     /* client_body_timeout */[m
[31m-    ngx_msec_t    send_timeout;            /* send_timeout */[m
[31m-    ngx_msec_t    keepalive_timeout;       /* keepalive_timeout */[m
[31m-    ngx_msec_t    lingering_time;          /* lingering_time */[m
[31m-    ngx_msec_t    lingering_timeout;       /* lingering_timeout */[m
[31m-    ngx_msec_t    resolver_timeout;        /* resolver_timeout */[m
[31m-[m
[31m-    ngx_resolver_t  *resolver;             /* resolver */[m
[31m-[m
[31m-    time_t        keepalive_header;        /* keepalive_timeout */[m
[31m-[m
[31m-    ngx_uint_t    keepalive_requests;      /* keepalive_requests */[m
[31m-    ngx_uint_t    keepalive_disable;       /* keepalive_disable */[m
[31m-    ngx_uint_t    satisfy;                 /* satisfy */[m
[31m-    ngx_uint_t    lingering_close;         /* lingering_close */[m
[31m-    ngx_uint_t    if_modified_since;       /* if_modified_since */[m
[31m-    ngx_uint_t    max_ranges;              /* max_ranges */[m
[31m-    ngx_uint_t    client_body_in_file_only; /* client_body_in_file_only */[m
[31m-[m
[31m-    ngx_flag_t    client_body_in_single_buffer;[m
[31m-                                           /* client_body_in_singe_buffer */[m
[31m-    ngx_flag_t    internal;                /* internal */[m
[31m-    ngx_flag_t    sendfile;                /* sendfile */[m
[31m-    ngx_flag_t    aio;                     /* aio */[m
[31m-    ngx_flag_t    aio_write;               /* aio_write */[m
[31m-    ngx_flag_t    tcp_nopush;              /* tcp_nopush */[m
[31m-    ngx_flag_t    tcp_nodelay;             /* tcp_nodelay */[m
[31m-    ngx_flag_t    reset_timedout_connection; /* reset_timedout_connection */[m
[31m-    ngx_flag_t    server_name_in_redirect; /* server_name_in_redirect */[m
[31m-    ngx_flag_t    port_in_redirect;        /* port_in_redirect */[m
[31m-    ngx_flag_t    msie_padding;            /* msie_padding */[m
[31m-    ngx_flag_t    msie_refresh;            /* msie_refresh */[m
[31m-    ngx_flag_t    log_not_found;           /* log_not_found */[m
[31m-    ngx_flag_t    log_subrequest;          /* log_subrequest */[m
[31m-    ngx_flag_t    recursive_error_pages;   /* recursive_error_pages */[m
[31m-    ngx_flag_t    server_tokens;           /* server_tokens */[m
[31m-    ngx_flag_t    chunked_transfer_encoding; /* chunked_transfer_encoding */[m
[31m-    ngx_flag_t    etag;                    /* etag */[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    ngx_flag_t    gzip_vary;               /* gzip_vary */[m
[31m-[m
[31m-    ngx_uint_t    gzip_http_version;       /* gzip_http_version */[m
[31m-    ngx_uint_t    gzip_proxied;            /* gzip_proxied */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_array_t  *gzip_disable;            /* gzip_disable */[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_thread_pool_t         *thread_pool;[m
[31m-    ngx_http_complex_value_t  *thread_pool_value;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    ngx_uint_t    disable_symlinks;        /* disable_symlinks */[m
[31m-    ngx_http_complex_value_t  *disable_symlinks_from;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t  *error_pages;             /* error_page */[m
[31m-    ngx_http_try_file_t    *try_files;     /* try_files */[m
[31m-[m
[31m-    ngx_path_t   *client_body_temp_path;   /* client_body_temp_path */[m
[31m-[m
[31m-    ngx_open_file_cache_t  *open_file_cache;[m
[31m-    time_t        open_file_cache_valid;[m
[31m-    ngx_uint_t    open_file_cache_min_uses;[m
[31m-    ngx_flag_t    open_file_cache_errors;[m
[31m-    ngx_flag_t    open_file_cache_events;[m
[31m-[m
[31m-    ngx_log_t    *error_log;[m
[31m-[m
[31m-    ngx_uint_t    types_hash_max_size;[m
[31m-    ngx_uint_t    types_hash_bucket_size;[m
[31m-[m
[31m-    ngx_queue_t  *locations;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_core_loc_conf_t  *prev_location;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_queue_t                      queue;[m
[31m-    ngx_http_core_loc_conf_t        *exact;[m
[31m-    ngx_http_core_loc_conf_t        *inclusive;[m
[31m-    ngx_str_t                       *name;[m
[31m-    u_char                          *file_name;[m
[31m-    ngx_uint_t                       line;[m
[31m-    ngx_queue_t                      list;[m
[31m-} ngx_http_location_queue_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_location_tree_node_s {[m
[31m-    ngx_http_location_tree_node_t   *left;[m
[31m-    ngx_http_location_tree_node_t   *right;[m
[31m-    ngx_http_location_tree_node_t   *tree;[m
[31m-[m
[31m-    ngx_http_core_loc_conf_t        *exact;[m
[31m-    ngx_http_core_loc_conf_t        *inclusive;[m
[31m-[m
[31m-    u_char                           auto_redirect;[m
[31m-    u_char                           len;[m
[31m-    u_char                           name[1];[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void ngx_http_core_run_phases(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_core_generic_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_rewrite_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_find_config_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_post_rewrite_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_access_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_post_access_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_try_files_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_content_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-[m
[31m-[m
[31m-void *ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash);[m
[31m-ngx_int_t ngx_http_set_content_type(ngx_http_request_t *r);[m
[31m-void ngx_http_set_exten(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_set_etag(ngx_http_request_t *r);[m
[31m-void ngx_http_weak_etag(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,[m
[31m-    ngx_str_t *ct, ngx_http_complex_value_t *cv);[m
[31m-u_char *ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *name,[m
[31m-    size_t *root_length, size_t reserved);[m
[31m-ngx_int_t ngx_http_auth_basic_user(ngx_http_request_t *r);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-ngx_int_t ngx_http_gzip_ok(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **sr,[m
[31m-    ngx_http_post_subrequest_t *psr, ngx_uint_t flags);[m
[31m-ngx_int_t ngx_http_internal_redirect(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args);[m
[31m-ngx_int_t ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name);[m
[31m-[m
[31m-[m
[31m-ngx_http_cleanup_t *ngx_http_cleanup_add(ngx_http_request_t *r, size_t size);[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_output_header_filter_pt)(ngx_http_request_t *r);[m
[31m-typedef ngx_int_t (*ngx_http_output_body_filter_pt)[m
[31m-    (ngx_http_request_t *r, ngx_chain_t *chain);[m
[31m-typedef ngx_int_t (*ngx_http_request_body_filter_pt)[m
[31m-    (ngx_http_request_t *r, ngx_chain_t *chain);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *chain);[m
[31m-ngx_int_t ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *chain);[m
[31m-ngx_int_t ngx_http_request_body_save_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *chain);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_set_disable_symlinks(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *path, ngx_open_file_info_t *of);[m
[31m-[m
[31m-ngx_int_t ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    ngx_array_t *headers, ngx_str_t *value, ngx_array_t *proxies,[m
[31m-    int recursive);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_core_module;[m
[31m-[m
[31m-extern ngx_uint_t ngx_http_max_module;[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_core_get_method;[m
[31m-[m
[31m-[m
[31m-#define ngx_http_clear_content_length(r)                                      \[m
[31m-                                                                              \[m
[31m-    r->headers_out.content_length_n = -1;                                     \[m
[31m-    if (r->headers_out.content_length) {                                      \[m
[31m-        r->headers_out.content_length->hash = 0;                              \[m
[31m-        r->headers_out.content_length = NULL;                                 \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_clear_accept_ranges(r)                                       \[m
[31m-                                                                              \[m
[31m-    r->allow_ranges = 0;                                                      \[m
[31m-    if (r->headers_out.accept_ranges) {                                       \[m
[31m-        r->headers_out.accept_ranges->hash = 0;                               \[m
[31m-        r->headers_out.accept_ranges = NULL;                                  \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_clear_last_modified(r)                                       \[m
[31m-                                                                              \[m
[31m-    r->headers_out.last_modified_time = -1;                                   \[m
[31m-    if (r->headers_out.last_modified) {                                       \[m
[31m-        r->headers_out.last_modified->hash = 0;                               \[m
[31m-        r->headers_out.last_modified = NULL;                                  \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_clear_location(r)                                            \[m
[31m-                                                                              \[m
[31m-    if (r->headers_out.location) {                                            \[m
[31m-        r->headers_out.location->hash = 0;                                    \[m
[31m-        r->headers_out.location = NULL;                                       \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_clear_etag(r)                                                \[m
[31m-                                                                              \[m
[31m-    if (r->headers_out.etag) {                                                \[m
[31m-        r->headers_out.etag->hash = 0;                                        \[m
[31m-        r->headers_out.etag = NULL;                                           \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_CORE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_file_cache.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_file_cache.c[m
[1mdeleted file mode 100644[m
[1mindex 37cd377..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_file_cache.c[m
[1m+++ /dev/null[m
[36m@@ -1,2567 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_md5.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_file_cache_lock(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static void ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_file_cache_lock_wait(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ngx_int_t ngx_http_file_cache_read(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ssize_t ngx_http_file_cache_aio_read(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-static void ngx_http_cache_aio_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-static ngx_int_t ngx_http_cache_thread_handler(ngx_thread_task_t *task,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_cache_thread_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_file_cache_exists(ngx_http_file_cache_t *cache,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ngx_int_t ngx_http_file_cache_name(ngx_http_request_t *r,[m
[31m-    ngx_path_t *path);[m
[31m-static ngx_http_file_cache_node_t *[m
[31m-    ngx_http_file_cache_lookup(ngx_http_file_cache_t *cache, u_char *key);[m
[31m-static void ngx_http_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-static void ngx_http_file_cache_vary(ngx_http_request_t *r, u_char *vary,[m
[31m-    size_t len, u_char *hash);[m
[31m-static void ngx_http_file_cache_vary_header(ngx_http_request_t *r,[m
[31m-    ngx_md5_t *md5, ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_file_cache_reopen(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ngx_int_t ngx_http_file_cache_update_variant(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static void ngx_http_file_cache_cleanup(void *data);[m
[31m-static time_t ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache);[m
[31m-static time_t ngx_http_file_cache_expire(ngx_http_file_cache_t *cache);[m
[31m-static void ngx_http_file_cache_delete(ngx_http_file_cache_t *cache,[m
[31m-    ngx_queue_t *q, u_char *name);[m
[31m-static void ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache);[m
[31m-static ngx_int_t ngx_http_file_cache_noop(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_file_cache_manage_file(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_file_cache_manage_directory(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_file_cache_add_file(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_file_cache_add(ngx_http_file_cache_t *cache,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ngx_int_t ngx_http_file_cache_delete_file(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static void ngx_http_file_cache_set_watermark(ngx_http_file_cache_t *cache);[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_cache_status[] = {[m
[31m-    ngx_string("MISS"),[m
[31m-    ngx_string("BYPASS"),[m
[31m-    ngx_string("EXPIRED"),[m
[31m-    ngx_string("STALE"),[m
[31m-    ngx_string("UPDATING"),[m
[31m-    ngx_string("REVALIDATED"),[m
[31m-    ngx_string("HIT")[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_char  ngx_http_file_cache_key[] = { LF, 'K', 'E', 'Y', ':', ' ' };[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *ocache = data;[m
[31m-[m
[31m-    size_t                  len;[m
[31m-    ngx_uint_t              n;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-    if (ocache) {[m
[31m-        if (ngx_strcmp(cache->path->name.data, ocache->path->name.data) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,[m
[31m-                          "cache \"%V\" uses the \"%V\" cache path "[m
[31m-                          "while previously it used the \"%V\" cache path",[m
[31m-                          &shm_zone->shm.name, &cache->path->name,[m
[31m-                          &ocache->path->name);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (n = 0; n < 3; n++) {[m
[31m-            if (cache->path->level[n] != ocache->path->level[n]) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,[m
[31m-                              "cache \"%V\" had previously different levels",[m
[31m-                              &shm_zone->shm.name);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        cache->sh = ocache->sh;[m
[31m-[m
[31m-        cache->shpool = ocache->shpool;[m
[31m-        cache->bsize = ocache->bsize;[m
[31m-[m
[31m-        cache->max_size /= cache->bsize;[m
[31m-[m
[31m-        if (!cache->sh->cold || cache->sh->loading) {[m
[31m-            cache->path->loader = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        cache->sh = cache->shpool->data;[m
[31m-        cache->bsize = ngx_fs_bsize(cache->path->name.data);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache->sh = ngx_slab_alloc(cache->shpool, sizeof(ngx_http_file_cache_sh_t));[m
[31m-    if (cache->sh == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cache->shpool->data = cache->sh;[m
[31m-[m
[31m-    ngx_rbtree_init(&cache->sh->rbtree, &cache->sh->sentinel,[m
[31m-                    ngx_http_file_cache_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&cache->sh->queue);[m
[31m-[m
[31m-    cache->sh->cold = 1;[m
[31m-    cache->sh->loading = 0;[m
[31m-    cache->sh->size = 0;[m
[31m-    cache->sh->count = 0;[m
[31m-    cache->sh->watermark = (ngx_uint_t) -1;[m
[31m-[m
[31m-    cache->bsize = ngx_fs_bsize(cache->path->name.data);[m
[31m-[m
[31m-    cache->max_size /= cache->bsize;[m
[31m-[m
[31m-    len = sizeof(" in cache keys zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    cache->shpool->log_ctx = ngx_slab_alloc(cache->shpool, len);[m
[31m-    if (cache->shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(cache->shpool->log_ctx, " in cache keys zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    cache->shpool->log_nomem = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_file_cache_new(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    c = ngx_pcalloc(r->pool, sizeof(ngx_http_cache_t));[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&c->keys, r->pool, 4, sizeof(ngx_str_t)) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->cache = c;[m
[31m-    c->file.log = r->connection->log;[m
[31m-    c->file.fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_file_cache_create(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_cache_t       *c;[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_file_cache_cleanup;[m
[31m-    cln->data = c;[m
[31m-[m
[31m-    if (ngx_http_file_cache_exists(cache, c) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_file_cache_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t             len;[m
[31m-    ngx_str_t         *key;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_md5_t          md5;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    ngx_crc32_init(c->crc32);[m
[31m-    ngx_md5_init(&md5);[m
[31m-[m
[31m-    key = c->keys.elts;[m
[31m-    for (i = 0; i < c->keys.nelts; i++) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http cache key: \"%V\"", &key[i]);[m
[31m-[m
[31m-        len += key[i].len;[m
[31m-[m
[31m-        ngx_crc32_update(&c->crc32, key[i].data, key[i].len);[m
[31m-        ngx_md5_update(&md5, key[i].data, key[i].len);[m
[31m-    }[m
[31m-[m
[31m-    c->header_start = sizeof(ngx_http_file_cache_header_t)[m
[31m-                      + sizeof(ngx_http_file_cache_key) + len + 1;[m
[31m-[m
[31m-    ngx_crc32_final(c->crc32);[m
[31m-    ngx_md5_final(c->key, &md5);[m
[31m-[m
[31m-    ngx_memcpy(c->main, c->key, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_file_cache_open(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc, rv;[m
[31m-    ngx_uint_t                 test;[m
[31m-    ngx_http_cache_t          *c;[m
[31m-    ngx_pool_cleanup_t        *cln;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_file_cache_t     *cache;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->waiting) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (c->reading) {[m
[31m-        return ngx_http_file_cache_read(r, c);[m
[31m-    }[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    if (c->node == NULL) {[m
[31m-        cln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_file_cache_cleanup;[m
[31m-        cln->data = c;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_file_cache_exists(cache, c);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache exists: %i e:%d", rc, c->exists);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return NGX_HTTP_CACHE_SCARCE;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        if (c->error) {[m
[31m-            return c->error;[m
[31m-        }[m
[31m-[m
[31m-        c->temp_file = 1;[m
[31m-        test = c->exists ? 1 : 0;[m
[31m-        rv = NGX_DECLINED;[m
[31m-[m
[31m-    } else { /* rc == NGX_DECLINED */[m
[31m-[m
[31m-        test = cache->sh->cold ? 1 : 0;[m
[31m-[m
[31m-        if (c->min_uses > 1) {[m
[31m-[m
[31m-            if (!test) {[m
[31m-                return NGX_HTTP_CACHE_SCARCE;[m
[31m-            }[m
[31m-[m
[31m-            rv = NGX_HTTP_CACHE_SCARCE;[m
[31m-[m
[31m-        } else {[m
[31m-            c->temp_file = 1;[m
[31m-            rv = NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!test) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.uniq = c->uniq;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-    of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &c->file.name, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-            goto done;[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                          ngx_open_file_n " \"%s\" failed", c->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache fd: %d", of.fd);[m
[31m-[m
[31m-    c->file.fd = of.fd;[m
[31m-    c->file.log = r->connection->log;[m
[31m-    c->uniq = of.uniq;[m
[31m-    c->length = of.size;[m
[31m-    c->fs_size = (of.fs_size + cache->bsize - 1) / cache->bsize;[m
[31m-[m
[31m-    c->buf = ngx_create_temp_buf(r->pool, c->body_start);[m
[31m-    if (c->buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_file_cache_read(r, c);[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (rv == NGX_DECLINED) {[m
[31m-        return ngx_http_file_cache_lock(r, c);[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_lock(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_msec_t                 now, timer;[m
[31m-    ngx_http_file_cache_t     *cache;[m
[31m-[m
[31m-    if (!c->lock) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_current_msec;[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    timer = c->node->lock_time - now;[m
[31m-[m
[31m-    if (!c->node->updating || (ngx_msec_int_t) timer <= 0) {[m
[31m-        c->node->updating = 1;[m
[31m-        c->node->lock_time = now + c->lock_age;[m
[31m-        c->updating = 1;[m
[31m-        c->lock_time = c->node->lock_time;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache lock u:%d wt:%M",[m
[31m-                   c->updating, c->wait_time);[m
[31m-[m
[31m-    if (c->updating) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (c->lock_timeout == 0) {[m
[31m-        return NGX_HTTP_CACHE_SCARCE;[m
[31m-    }[m
[31m-[m
[31m-    c->waiting = 1;[m
[31m-[m
[31m-    if (c->wait_time == 0) {[m
[31m-        c->wait_time = now + c->lock_timeout;[m
[31m-[m
[31m-        c->wait_event.handler = ngx_http_file_cache_lock_wait_handler;[m
[31m-        c->wait_event.data = r;[m
[31m-        c->wait_event.log = r->connection->log;[m
[31m-    }[m
[31m-[m
[31m-    timer = c->wait_time - now;[m
[31m-[m
[31m-    ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer);[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http file cache wait: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ngx_http_file_cache_lock_wait(r, r->cache);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_lock_wait(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_uint_t              wait;[m
[31m-    ngx_msec_t              now, timer;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    now = ngx_current_msec;[m
[31m-[m
[31m-    timer = c->wait_time - now;[m
[31m-[m
[31m-    if ((ngx_msec_int_t) timer <= 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "cache lock timeout");[m
[31m-        c->lock_timeout = 0;[m
[31m-        goto wakeup;[m
[31m-    }[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-    wait = 0;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    timer = c->node->lock_time - now;[m
[31m-[m
[31m-    if (c->node->updating && (ngx_msec_int_t) timer > 0) {[m
[31m-        wait = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    if (wait) {[m
[31m-        ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-wakeup:[m
[31m-[m
[31m-    c->waiting = 0;[m
[31m-    r->main->blocked--;[m
[31m-    r->write_event_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    u_char                        *p;[m
[31m-    time_t                         now;[m
[31m-    ssize_t                        n;[m
[31m-    ngx_str_t                     *key;[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_http_file_cache_t         *cache;[m
[31m-    ngx_http_file_cache_header_t  *h;[m
[31m-[m
[31m-    n = ngx_http_file_cache_aio_read(r, c);[m
[31m-[m
[31m-    if (n < 0) {[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n < c->header_start) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" is too small", c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    h = (ngx_http_file_cache_header_t *) c->buf->pos;[m
[31m-[m
[31m-    if (h->version != NGX_HTTP_CACHE_VERSION) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" version mismatch", c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (h->crc32 != c->crc32 || h->header_start != c->header_start) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" has md5 collision", c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    p = c->buf->pos + sizeof(ngx_http_file_cache_header_t)[m
[31m-        + sizeof(ngx_http_file_cache_key);[m
[31m-[m
[31m-    key = c->keys.elts;[m
[31m-    for (i = 0; i < c->keys.nelts; i++) {[m
[31m-        if (ngx_memcmp(p, key[i].data, key[i].len) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                          "cache file \"%s\" has md5 collision",[m
[31m-                          c->file.name.data);[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        p += key[i].len;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) h->body_start > c->body_start) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" has too long header",[m
[31m-                      c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (h->vary_len > NGX_HTTP_CACHE_VARY_LEN) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" has incorrect vary length",[m
[31m-                      c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (h->vary_len) {[m
[31m-        ngx_http_file_cache_vary(r, h->vary, h->vary_len, c->variant);[m
[31m-[m
[31m-        if (ngx_memcmp(c->variant, h->variant, NGX_HTTP_CACHE_KEY_LEN) != 0) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http file cache vary mismatch");[m
[31m-            return ngx_http_file_cache_reopen(r, c);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->buf->last += n;[m
[31m-[m
[31m-    c->valid_sec = h->valid_sec;[m
[31m-    c->last_modified = h->last_modified;[m
[31m-    c->date = h->date;[m
[31m-    c->valid_msec = h->valid_msec;[m
[31m-    c->body_start = h->body_start;[m
[31m-    c->etag.len = h->etag_len;[m
[31m-    c->etag.data = h->etag;[m
[31m-[m
[31m-    r->cached = 1;[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    if (cache->sh->cold) {[m
[31m-[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-        if (!c->node->exists) {[m
[31m-            c->node->uses = 1;[m
[31m-            c->node->body_start = c->body_start;[m
[31m-            c->node->exists = 1;[m
[31m-            c->node->uniq = c->uniq;[m
[31m-            c->node->fs_size = c->fs_size;[m
[31m-[m
[31m-            cache->sh->size += c->fs_size;[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    if (c->valid_sec < now) {[m
[31m-[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-        if (c->node->updating) {[m
[31m-            rc = NGX_HTTP_CACHE_UPDATING;[m
[31m-[m
[31m-        } else {[m
[31m-            c->node->updating = 1;[m
[31m-            c->updating = 1;[m
[31m-            c->lock_time = c->node->lock_time;[m
[31m-            rc = NGX_HTTP_CACHE_STALE;[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http file cache expired: %i %T %T",[m
[31m-                       rc, c->valid_sec, now);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_file_cache_aio_read(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    ssize_t                    n;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-    if (clcf->aio == NGX_HTTP_AIO_ON && ngx_file_aio) {[m
[31m-        n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);[m
[31m-[m
[31m-        if (n != NGX_AGAIN) {[m
[31m-            c->reading = 0;[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        c->reading = 1;[m
[31m-[m
[31m-        c->file.aio->data = r;[m
[31m-        c->file.aio->handler = ngx_http_cache_aio_event_handler;[m
[31m-[m
[31m-        r->main->blocked++;[m
[31m-        r->aio = 1;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-    if (clcf->aio == NGX_HTTP_AIO_THREADS) {[m
[31m-        c->file.thread_task = c->thread_task;[m
[31m-        c->file.thread_handler = ngx_http_cache_thread_handler;[m
[31m-        c->file.thread_ctx = r;[m
[31m-[m
[31m-        n = ngx_thread_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);[m
[31m-[m
[31m-        c->thread_task = c->file.thread_task;[m
[31m-        c->reading = (n == NGX_AGAIN);[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_cache_aio_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t     *aio;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-    r = aio->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http file cache aio: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_cache_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_thread_pool_t         *tp;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r = file->thread_ctx;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    tp = clcf->thread_pool;[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "thread pool \"%V\" not found", &name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    task->event.data = r;[m
[31m-    task->event.handler = ngx_http_cache_thread_event_handler;[m
[31m-[m
[31m-    if (ngx_thread_task_post(tp, task) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_cache_thread_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http file cache thread: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_exists(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    fcn = c->node;[m
[31m-[m
[31m-    if (fcn == NULL) {[m
[31m-        fcn = ngx_http_file_cache_lookup(cache, c->key);[m
[31m-    }[m
[31m-[m
[31m-    if (fcn) {[m
[31m-        ngx_queue_remove(&fcn->queue);[m
[31m-[m
[31m-        if (c->node == NULL) {[m
[31m-            fcn->uses++;[m
[31m-            fcn->count++;[m
[31m-        }[m
[31m-[m
[31m-        if (fcn->error) {[m
[31m-[m
[31m-            if (fcn->valid_sec < ngx_time()) {[m
[31m-                goto renew;[m
[31m-            }[m
[31m-[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (fcn->exists || fcn->uses >= c->min_uses) {[m
[31m-[m
[31m-            c->exists = fcn->exists;[m
[31m-            if (fcn->body_start) {[m
[31m-                c->body_start = fcn->body_start;[m
[31m-            }[m
[31m-[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        rc = NGX_AGAIN;[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    fcn = ngx_slab_calloc_locked(cache->shpool,[m
[31m-                                 sizeof(ngx_http_file_cache_node_t));[m
[31m-    if (fcn == NULL) {[m
[31m-        ngx_http_file_cache_set_watermark(cache);[m
[31m-[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-        (void) ngx_http_file_cache_forced_expire(cache);[m
[31m-[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-        fcn = ngx_slab_calloc_locked(cache->shpool,[m
[31m-                                     sizeof(ngx_http_file_cache_node_t));[m
[31m-        if (fcn == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "could not allocate node%s", cache->shpool->log_ctx);[m
[31m-            rc = NGX_ERROR;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cache->sh->count++;[m
[31m-[m
[31m-    ngx_memcpy((u_char *) &fcn->node.key, c->key, sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-    ngx_memcpy(fcn->key, &c->key[sizeof(ngx_rbtree_key_t)],[m
[31m-               NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-    ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);[m
[31m-[m
[31m-    fcn->uses = 1;[m
[31m-    fcn->count = 1;[m
[31m-[m
[31m-renew:[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-    fcn->valid_msec = 0;[m
[31m-    fcn->error = 0;[m
[31m-    fcn->exists = 0;[m
[31m-    fcn->valid_sec = 0;[m
[31m-    fcn->uniq = 0;[m
[31m-    fcn->body_start = 0;[m
[31m-    fcn->fs_size = 0;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    fcn->expire = ngx_time() + cache->inactive;[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);[m
[31m-[m
[31m-    c->uniq = fcn->uniq;[m
[31m-    c->error = fcn->error;[m
[31m-    c->node = fcn;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path)[m
[31m-{[m
[31m-    u_char            *p;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->file.name.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    c->file.name.len = path->name.len + 1 + path->len[m
[31m-                       + 2 * NGX_HTTP_CACHE_KEY_LEN;[m
[31m-[m
[31m-    c->file.name.data = ngx_pnalloc(r->pool, c->file.name.len + 1);[m
[31m-    if (c->file.name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(c->file.name.data, path->name.data, path->name.len);[m
[31m-[m
[31m-    p = c->file.name.data + path->name.len + 1 + path->len;[m
[31m-    p = ngx_hex_dump(p, c->key, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    ngx_create_hashed_filename(path, c->file.name.data, c->file.name.len);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cache file: \"%s\"", c->file.name.data);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_file_cache_node_t *[m
[31m-ngx_http_file_cache_lookup(ngx_http_file_cache_t *cache, u_char *key)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_rbtree_key_t             node_key;[m
[31m-    ngx_rbtree_node_t           *node, *sentinel;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    ngx_memcpy((u_char *) &node_key, key, sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-    node = cache->sh->rbtree.root;[m
[31m-    sentinel = cache->sh->rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (node_key < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (node_key > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* node_key == node->key */[m
[31m-[m
[31m-        fcn = (ngx_http_file_cache_node_t *) node;[m
[31m-[m
[31m-        rc = ngx_memcmp(&key[sizeof(ngx_rbtree_key_t)], fcn->key,[m
[31m-                        NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return fcn;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t           **p;[m
[31m-    ngx_http_file_cache_node_t   *cn, *cnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            cn = (ngx_http_file_cache_node_t *) node;[m
[31m-            cnt = (ngx_http_file_cache_node_t *) temp;[m
[31m-[m
[31m-            p = (ngx_memcmp(cn->key, cnt->key,[m
[31m-                            NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t))[m
[31m-                 < 0)[m
[31m-                    ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_vary(ngx_http_request_t *r, u_char *vary, size_t len,[m
[31m-    u_char *hash)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t   name;[m
[31m-    ngx_md5_t   md5;[m
[31m-    u_char      buf[NGX_HTTP_CACHE_VARY_LEN];[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache vary: \"%*s\"", len, vary);[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, r->cache->main, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-[m
[31m-    ngx_strlow(buf, vary, len);[m
[31m-[m
[31m-    p = buf;[m
[31m-    last = buf + len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        while (p < last && (*p == ' ' || *p == ',')) { p++; }[m
[31m-[m
[31m-        name.data = p;[m
[31m-[m
[31m-        while (p < last && *p != ',' && *p != ' ') { p++; }[m
[31m-[m
[31m-        name.len = p - name.data;[m
[31m-[m
[31m-        if (name.len == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http file cache vary: %V", &name);[m
[31m-[m
[31m-        ngx_md5_update(&md5, name.data, name.len);[m
[31m-        ngx_md5_update(&md5, (u_char *) ":", sizeof(":") - 1);[m
[31m-[m
[31m-        ngx_http_file_cache_vary_header(r, &md5, &name);[m
[31m-[m
[31m-        ngx_md5_update(&md5, (u_char *) CRLF, sizeof(CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_final(hash, &md5);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_vary_header(ngx_http_request_t *r, ngx_md5_t *md5,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    size_t            len;[m
[31m-    u_char           *p, *start, *last;[m
[31m-    ngx_uint_t        i, multiple, normalize;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_table_elt_t  *header;[m
[31m-[m
[31m-    multiple = 0;[m
[31m-    normalize = 0;[m
[31m-[m
[31m-    if (name->len == sizeof("Accept-Charset") - 1[m
[31m-        && ngx_strncasecmp(name->data, (u_char *) "Accept-Charset",[m
[31m-                           sizeof("Accept-Charset") - 1) == 0)[m
[31m-    {[m
[31m-        normalize = 1;[m
[31m-[m
[31m-    } else if (name->len == sizeof("Accept-Encoding") - 1[m
[31m-        && ngx_strncasecmp(name->data, (u_char *) "Accept-Encoding",[m
[31m-                           sizeof("Accept-Encoding") - 1) == 0)[m
[31m-    {[m
[31m-        normalize = 1;[m
[31m-[m
[31m-    } else if (name->len == sizeof("Accept-Language") - 1[m
[31m-        && ngx_strncasecmp(name->data, (u_char *) "Accept-Language",[m
[31m-                           sizeof("Accept-Language") - 1) == 0)[m
[31m-    {[m
[31m-        normalize = 1;[m
[31m-    }[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len != name->len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(header[i].key.data, name->data, name->len) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (!normalize) {[m
[31m-[m
[31m-            if (multiple) {[m
[31m-                ngx_md5_update(md5, (u_char *) ",", sizeof(",") - 1);[m
[31m-            }[m
[31m-[m
[31m-            ngx_md5_update(md5, header[i].value.data, header[i].value.len);[m
[31m-[m
[31m-            multiple = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* normalize spaces */[m
[31m-[m
[31m-        p = header[i].value.data;[m
[31m-        last = p + header[i].value.len;[m
[31m-[m
[31m-        while (p < last) {[m
[31m-[m
[31m-            while (p < last && (*p == ' ' || *p == ',')) { p++; }[m
[31m-[m
[31m-            start = p;[m
[31m-[m
[31m-            while (p < last && *p != ',' && *p != ' ') { p++; }[m
[31m-[m
[31m-            len = p - start;[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (multiple) {[m
[31m-                ngx_md5_update(md5, (u_char *) ",", sizeof(",") - 1);[m
[31m-            }[m
[31m-[m
[31m-            ngx_md5_update(md5, start, len);[m
[31m-[m
[31m-            multiple = 1;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_reopen(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->file.log, 0,[m
[31m-                   "http file cache reopen");[m
[31m-[m
[31m-    if (c->secondary) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" has incorrect vary hash",[m
[31m-                      c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->node->count--;[m
[31m-    c->node = NULL;[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->secondary = 1;[m
[31m-    c->file.name.len = 0;[m
[31m-    c->body_start = c->buf->end - c->buf->start;[m
[31m-[m
[31m-    ngx_memcpy(c->key, c->variant, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-[m
[31m-    return ngx_http_file_cache_open(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf)[m
[31m-{[m
[31m-    ngx_http_file_cache_header_t  *h = (ngx_http_file_cache_header_t *) buf;[m
[31m-[m
[31m-    u_char            *p;[m
[31m-    ngx_str_t         *key;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache set header");[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    ngx_memzero(h, sizeof(ngx_http_file_cache_header_t));[m
[31m-[m
[31m-    h->version = NGX_HTTP_CACHE_VERSION;[m
[31m-    h->valid_sec = c->valid_sec;[m
[31m-    h->last_modified = c->last_modified;[m
[31m-    h->date = c->date;[m
[31m-    h->crc32 = c->crc32;[m
[31m-    h->valid_msec = (u_short) c->valid_msec;[m
[31m-    h->header_start = (u_short) c->header_start;[m
[31m-    h->body_start = (u_short) c->body_start;[m
[31m-[m
[31m-    if (c->etag.len <= NGX_HTTP_CACHE_ETAG_LEN) {[m
[31m-        h->etag_len = (u_char) c->etag.len;[m
[31m-        ngx_memcpy(h->etag, c->etag.data, c->etag.len);[m
[31m-    }[m
[31m-[m
[31m-    if (c->vary.len) {[m
[31m-        if (c->vary.len > NGX_HTTP_CACHE_VARY_LEN) {[m
[31m-            /* should not happen */[m
[31m-            c->vary.len = NGX_HTTP_CACHE_VARY_LEN;[m
[31m-        }[m
[31m-[m
[31m-        h->vary_len = (u_char) c->vary.len;[m
[31m-        ngx_memcpy(h->vary, c->vary.data, c->vary.len);[m
[31m-[m
[31m-        ngx_http_file_cache_vary(r, c->vary.data, c->vary.len, c->variant);[m
[31m-        ngx_memcpy(h->variant, c->variant, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_file_cache_update_variant(r, c) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = buf + sizeof(ngx_http_file_cache_header_t);[m
[31m-[m
[31m-    p = ngx_cpymem(p, ngx_http_file_cache_key, sizeof(ngx_http_file_cache_key));[m
[31m-[m
[31m-    key = c->keys.elts;[m
[31m-    for (i = 0; i < c->keys.nelts; i++) {[m
[31m-        p = ngx_copy(p, key[i].data, key[i].len);[m
[31m-    }[m
[31m-[m
[31m-    *p = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_update_variant(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    if (!c->secondary) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c->vary.len[m
[31m-        && ngx_memcmp(c->variant, c->key, NGX_HTTP_CACHE_KEY_LEN) == 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * if the variant hash doesn't match one we used as a secondary[m
[31m-     * cache key, switch back to the original key[m
[31m-     */[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache main key");[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->node->count--;[m
[31m-    c->node->updating = 0;[m
[31m-    c->node = NULL;[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->file.name.len = 0;[m
[31m-[m
[31m-    ngx_memcpy(c->key, c->main, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-[m
[31m-    if (ngx_http_file_cache_exists(cache, c) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)[m
[31m-{[m
[31m-    off_t                   fs_size;[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_file_uniq_t         uniq;[m
[31m-    ngx_file_info_t         fi;[m
[31m-    ngx_http_cache_t        *c;[m
[31m-    ngx_ext_rename_file_t   ext;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->updated) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache update");[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    c->updated = 1;[m
[31m-    c->updating = 0;[m
[31m-[m
[31m-    uniq = 0;[m
[31m-    fs_size = 0;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache rename: \"%s\" to \"%s\"",[m
[31m-                   tf->file.name.data, c->file.name.data);[m
[31m-[m
[31m-    ext.access = NGX_FILE_OWNER_ACCESS;[m
[31m-    ext.path_access = NGX_FILE_OWNER_ACCESS;[m
[31m-    ext.time = -1;[m
[31m-    ext.create_path = 1;[m
[31m-    ext.delete_file = 1;[m
[31m-    ext.log = r->connection->log;[m
[31m-[m
[31m-    rc = ngx_ext_rename_file(&tf->file.name, &c->file.name, &ext);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        if (ngx_fd_info(tf->file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                          ngx_fd_info_n " \"%s\" failed", tf->file.name.data);[m
[31m-[m
[31m-            rc = NGX_ERROR;[m
[31m-[m
[31m-        } else {[m
[31m-            uniq = ngx_file_uniq(&fi);[m
[31m-            fs_size = (ngx_file_fs_size(&fi) + cache->bsize - 1) / cache->bsize;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->node->count--;[m
[31m-    c->node->uniq = uniq;[m
[31m-    c->node->body_start = c->body_start;[m
[31m-[m
[31m-    cache->sh->size += fs_size - c->node->fs_size;[m
[31m-    c->node->fs_size = fs_size;[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        c->node->exists = 1;[m
[31m-    }[m
[31m-[m
[31m-    c->node->updating = 0;[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_file_cache_update_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                        n;[m
[31m-    ngx_err_t                      err;[m
[31m-    ngx_file_t                     file;[m
[31m-    ngx_file_info_t                fi;[m
[31m-    ngx_http_cache_t              *c;[m
[31m-    ngx_http_file_cache_header_t   h;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache update header");[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-[m
[31m-    file.name = c->file.name;[m
[31m-    file.log = r->connection->log;[m
[31m-    file.fd = ngx_open_file(file.name.data, NGX_FILE_RDWR, NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    if (file.fd == NGX_INVALID_FILE) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        /* cache file may have been deleted */[m
[31m-[m
[31m-        if (err == NGX_ENOENT) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http file cache \"%s\" not found",[m
[31m-                           file.name.data);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                      ngx_open_file_n " \"%s\" failed", file.name.data);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * make sure cache file wasn't replaced;[m
[31m-     * if it was, do nothing[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      ngx_fd_info_n " \"%s\" failed", file.name.data);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (c->uniq != ngx_file_uniq(&fi)[m
[31m-        || c->length != ngx_file_size(&fi))[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http file cache \"%s\" changed",[m
[31m-                       file.name.data);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_file(&file, (u_char *) &h,[m
[31m-                      sizeof(ngx_http_file_cache_header_t), 0);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != sizeof(ngx_http_file_cache_header_t)) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      ngx_read_file_n " read only %z of %z from \"%s\"",[m
[31m-                      n, sizeof(ngx_http_file_cache_header_t), file.name.data);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (h.version != NGX_HTTP_CACHE_VERSION[m
[31m-        || h.last_modified != c->last_modified[m
[31m-        || h.crc32 != c->crc32[m
[31m-        || h.header_start != c->header_start[m
[31m-        || h.body_start != c->body_start)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http file cache \"%s\" content changed",[m
[31m-                       file.name.data);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * update cache file header with new data,[m
[31m-     * notably h.valid_sec and h.date[m
[31m-     */[m
[31m-[m
[31m-    ngx_memzero(&h, sizeof(ngx_http_file_cache_header_t));[m
[31m-[m
[31m-    h.version = NGX_HTTP_CACHE_VERSION;[m
[31m-    h.valid_sec = c->valid_sec;[m
[31m-    h.last_modified = c->last_modified;[m
[31m-    h.date = c->date;[m
[31m-    h.crc32 = c->crc32;[m
[31m-    h.valid_msec = (u_short) c->valid_msec;[m
[31m-    h.header_start = (u_short) c->header_start;[m
[31m-    h.body_start = (u_short) c->body_start;[m
[31m-[m
[31m-    if (c->etag.len <= NGX_HTTP_CACHE_ETAG_LEN) {[m
[31m-        h.etag_len = (u_char) c->etag.len;[m
[31m-        ngx_memcpy(h.etag, c->etag.data, c->etag.len);[m
[31m-    }[m
[31m-[m
[31m-    if (c->vary.len) {[m
[31m-        if (c->vary.len > NGX_HTTP_CACHE_VARY_LEN) {[m
[31m-            /* should not happen */[m
[31m-            c->vary.len = NGX_HTTP_CACHE_VARY_LEN;[m
[31m-        }[m
[31m-[m
[31m-        h.vary_len = (u_char) c->vary.len;[m
[31m-        ngx_memcpy(h.vary, c->vary.data, c->vary.len);[m
[31m-[m
[31m-        ngx_http_file_cache_vary(r, c->vary.data, c->vary.len, c->variant);[m
[31m-        ngx_memcpy(h.variant, c->variant, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_write_file(&file, (u_char *) &h,[m
[31m-                          sizeof(ngx_http_file_cache_header_t), 0);[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file.name.data);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_cache_send(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_chain_t        out;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache send: %s", c->file.name.data);[m
[31m-[m
[31m-    if (r != r->main && c->length - c->body_start == 0) {[m
[31m-        return ngx_http_send_header(r);[m
[31m-    }[m
[31m-[m
[31m-    /* we need to allocate all before the header would be sent */[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = c->body_start;[m
[31m-    b->file_last = c->length;[m
[31m-[m
[31m-    b->in_file = (c->length - c->body_start) ? 1: 0;[m
[31m-    b->last_buf = (r == r->main) ? 1: 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = c->file.fd;[m
[31m-    b->file->name = c->file.name;[m
[31m-    b->file->log = r->connection->log;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf)[m
[31m-{[m
[31m-    ngx_http_file_cache_t       *cache;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    if (c->updated || c->node == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->file.log, 0,[m
[31m-                   "http file cache free, fd: %d", c->file.fd);[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    fcn = c->node;[m
[31m-    fcn->count--;[m
[31m-[m
[31m-    if (c->updating && fcn->lock_time == c->lock_time) {[m
[31m-        fcn->updating = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        fcn->error = c->error;[m
[31m-[m
[31m-        if (c->valid_sec) {[m
[31m-            fcn->valid_sec = c->valid_sec;[m
[31m-            fcn->valid_msec = c->valid_msec;[m
[31m-        }[m
[31m-[m
[31m-    } else if (!fcn->exists && fcn->count == 0 && c->min_uses == 1) {[m
[31m-        ngx_queue_remove(&fcn->queue);[m
[31m-        ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);[m
[31m-        ngx_slab_free_locked(cache->shpool, fcn);[m
[31m-        cache->sh->count--;[m
[31m-        c->node = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->updated = 1;[m
[31m-    c->updating = 0;[m
[31m-[m
[31m-    if (c->temp_file) {[m
[31m-        if (tf && tf->file.fd != NGX_INVALID_FILE) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->file.log, 0,[m
[31m-                           "http file cache incomplete: \"%s\"",[m
[31m-                           tf->file.name.data);[m
[31m-[m
[31m-            if (ngx_delete_file(tf->file.name.data) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, c->file.log, ngx_errno,[m
[31m-                              ngx_delete_file_n " \"%s\" failed",[m
[31m-                              tf->file.name.data);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->wait_event.timer_set) {[m
[31m-        ngx_del_timer(&c->wait_event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_cache_t  *c = data;[m
[31m-[m
[31m-    if (c->updated) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->file.log, 0,[m
[31m-                   "http file cache cleanup");[m
[31m-[m
[31m-    if (c->updating) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->file.log, 0,[m
[31m-                      "stalled cache updating, error:%ui", c->error);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_file_cache_free(c, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache)[m
[31m-{[m
[31m-    u_char                      *name;[m
[31m-    size_t                       len;[m
[31m-    time_t                       wait;[m
[31m-    ngx_uint_t                   tries;[m
[31m-    ngx_path_t                  *path;[m
[31m-    ngx_queue_t                 *q;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http file cache forced expire");[m
[31m-[m
[31m-    path = cache->path;[m
[31m-    len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;[m
[31m-[m
[31m-    name = ngx_alloc(len + 1, ngx_cycle->log);[m
[31m-    if (name == NULL) {[m
[31m-        return 10;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name, path->name.data, path->name.len);[m
[31m-[m
[31m-    wait = 10;[m
[31m-    tries = 20;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    for (q = ngx_queue_last(&cache->sh->queue);[m
[31m-         q != ngx_queue_sentinel(&cache->sh->queue);[m
[31m-         q = ngx_queue_prev(q))[m
[31m-    {[m
[31m-        fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                  "http file cache forced expire: #%d %d %02xd%02xd%02xd%02xd",[m
[31m-                  fcn->count, fcn->exists,[m
[31m-                  fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]);[m
[31m-[m
[31m-        if (fcn->count == 0) {[m
[31m-            ngx_http_file_cache_delete(cache, q, name);[m
[31m-            wait = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            if (--tries) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            wait = 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    ngx_free(name);[m
[31m-[m
[31m-    return wait;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_http_file_cache_expire(ngx_http_file_cache_t *cache)[m
[31m-{[m
[31m-    u_char                      *name, *p;[m
[31m-    size_t                       len;[m
[31m-    time_t                       now, wait;[m
[31m-    ngx_path_t                  *path;[m
[31m-    ngx_queue_t                 *q;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-    u_char                       key[2 * NGX_HTTP_CACHE_KEY_LEN];[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http file cache expire");[m
[31m-[m
[31m-    path = cache->path;[m
[31m-    len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;[m
[31m-[m
[31m-    name = ngx_alloc(len + 1, ngx_cycle->log);[m
[31m-    if (name == NULL) {[m
[31m-        return 10;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name, path->name.data, path->name.len);[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_quit || ngx_terminate) {[m
[31m-            wait = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->sh->queue)) {[m
[31m-            wait = 10;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->sh->queue);[m
[31m-[m
[31m-        fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);[m
[31m-[m
[31m-        wait = fcn->expire - now;[m
[31m-[m
[31m-        if (wait > 0) {[m
[31m-            wait = wait > 10 ? 10 : wait;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "http file cache expire: #%d %d %02xd%02xd%02xd%02xd",[m
[31m-                       fcn->count, fcn->exists,[m
[31m-                       fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]);[m
[31m-[m
[31m-        if (fcn->count == 0) {[m
[31m-            ngx_http_file_cache_delete(cache, q, name);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (fcn->deleting) {[m
[31m-            wait = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_hex_dump(key, (u_char *) &fcn->node.key,[m
[31m-                         sizeof(ngx_rbtree_key_t));[m
[31m-        len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);[m
[31m-        (void) ngx_hex_dump(p, fcn->key, len);[m
[31m-[m
[31m-        /*[m
[31m-         * abnormally exited workers may leave locked cache entries,[m
[31m-         * and although it may be safe to remove them completely,[m
[31m-         * we prefer to just move them to the top of the inactive queue[m
[31m-         */[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-        fcn->expire = ngx_time() + cache->inactive;[m
[31m-        ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "ignore long locked inactive cache entry %*s, count:%d",[m
[31m-                      (size_t) 2 * NGX_HTTP_CACHE_KEY_LEN, key, fcn->count);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    ngx_free(name);[m
[31m-[m
[31m-    return wait;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_delete(ngx_http_file_cache_t *cache, ngx_queue_t *q,[m
[31m-    u_char *name)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_path_t                  *path;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);[m
[31m-[m
[31m-    if (fcn->exists) {[m
[31m-        cache->sh->size -= fcn->fs_size;[m
[31m-[m
[31m-        path = cache->path;[m
[31m-        p = name + path->name.len + 1 + path->len;[m
[31m-        p = ngx_hex_dump(p, (u_char *) &fcn->node.key,[m
[31m-                         sizeof(ngx_rbtree_key_t));[m
[31m-        len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);[m
[31m-        p = ngx_hex_dump(p, fcn->key, len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        fcn->count++;[m
[31m-        fcn->deleting = 1;[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-        len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;[m
[31m-        ngx_create_hashed_filename(path, name, len);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "http file cache expire: \"%s\"", name);[m
[31m-[m
[31m-        if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,[m
[31m-                          ngx_delete_file_n " \"%s\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-        fcn->count--;[m
[31m-        fcn->deleting = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (fcn->count == 0) {[m
[31m-        ngx_queue_remove(q);[m
[31m-        ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);[m
[31m-        ngx_slab_free_locked(cache->shpool, fcn);[m
[31m-        cache->sh->count--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_http_file_cache_manager(void *data)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *cache = data;[m
[31m-[m
[31m-    off_t       size;[m
[31m-    time_t      next, wait;[m
[31m-    ngx_uint_t  count, watermark;[m
[31m-[m
[31m-    next = ngx_http_file_cache_expire(cache);[m
[31m-[m
[31m-    cache->last = ngx_current_msec;[m
[31m-    cache->files = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-        size = cache->sh->size;[m
[31m-        count = cache->sh->count;[m
[31m-        watermark = cache->sh->watermark;[m
[31m-[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "http file cache size: %O c:%ui w:%i",[m
[31m-                       size, count, (ngx_int_t) watermark);[m
[31m-[m
[31m-        if (size < cache->max_size && count < watermark) {[m
[31m-            return next;[m
[31m-        }[m
[31m-[m
[31m-        wait = ngx_http_file_cache_forced_expire(cache);[m
[31m-[m
[31m-        if (wait > 0) {[m
[31m-            return wait;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit || ngx_terminate) {[m
[31m-            return next;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_loader(void *data)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *cache = data;[m
[31m-[m
[31m-    ngx_tree_ctx_t  tree;[m
[31m-[m
[31m-    if (!cache->sh->cold || cache->sh->loading) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http file cache loader");[m
[31m-[m
[31m-    tree.init_handler = NULL;[m
[31m-    tree.file_handler = ngx_http_file_cache_manage_file;[m
[31m-    tree.pre_tree_handler = ngx_http_file_cache_manage_directory;[m
[31m-    tree.post_tree_handler = ngx_http_file_cache_noop;[m
[31m-    tree.spec_handler = ngx_http_file_cache_delete_file;[m
[31m-    tree.data = cache;[m
[31m-    tree.alloc = 0;[m
[31m-    tree.log = ngx_cycle->log;[m
[31m-[m
[31m-    cache->last = ngx_current_msec;[m
[31m-    cache->files = 0;[m
[31m-[m
[31m-    if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) {[m
[31m-        cache->sh->loading = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cache->sh->cold = 0;[m
[31m-    cache->sh->loading = 0;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,[m
[31m-                  "http file cache: %V %.3fM, bsize: %uz",[m
[31m-                  &cache->path->name,[m
[31m-                  ((double) cache->sh->size * cache->bsize) / (1024 * 1024),[m
[31m-                  cache->bsize);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_manage_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_msec_t              elapsed;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    cache = ctx->data;[m
[31m-[m
[31m-    if (ngx_http_file_cache_add_file(ctx, path) != NGX_OK) {[m
[31m-        (void) ngx_http_file_cache_delete_file(ctx, path);[m
[31m-    }[m
[31m-[m
[31m-    if (++cache->files >= cache->loader_files) {[m
[31m-        ngx_http_file_cache_loader_sleep(cache);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "http file cache loader time elapsed: %M", elapsed);[m
[31m-[m
[31m-        if (elapsed >= cache->loader_threshold) {[m
[31m-            ngx_http_file_cache_loader_sleep(cache);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return (ngx_quit || ngx_terminate) ? NGX_ABORT : NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_manage_directory(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    if (path->len >= 5[m
[31m-        && ngx_strncmp(path->data + path->len - 5, "/temp", 5) == 0)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache)[m
[31m-{[m
[31m-    ngx_msleep(cache->loader_sleep);[m
[31m-[m
[31m-    ngx_time_update();[m
[31m-[m
[31m-    cache->last = ngx_current_msec;[m
[31m-    cache->files = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_add_file(ngx_tree_ctx_t *ctx, ngx_str_t *name)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    ngx_int_t               n;[m
[31m-    ngx_uint_t              i;[m
[31m-    ngx_http_cache_t        c;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    if (name->len < 2 * NGX_HTTP_CACHE_KEY_LEN) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->size < (off_t) sizeof(ngx_http_file_cache_header_t)) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "cache file \"%s\" is too small", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&c, sizeof(ngx_http_cache_t));[m
[31m-    cache = ctx->data;[m
[31m-[m
[31m-    c.length = ctx->size;[m
[31m-    c.fs_size = (ctx->fs_size + cache->bsize - 1) / cache->bsize;[m
[31m-[m
[31m-    p = &name->data[name->len - 2 * NGX_HTTP_CACHE_KEY_LEN];[m
[31m-[m
[31m-    for (i = 0; i < NGX_HTTP_CACHE_KEY_LEN; i++) {[m
[31m-        n = ngx_hextoi(p, 2);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p += 2;[m
[31m-[m
[31m-        c.key[i] = (u_char) n;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_file_cache_add(cache, &c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_add(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    fcn = ngx_http_file_cache_lookup(cache, c->key);[m
[31m-[m
[31m-    if (fcn == NULL) {[m
[31m-[m
[31m-        fcn = ngx_slab_calloc_locked(cache->shpool,[m
[31m-                                     sizeof(ngx_http_file_cache_node_t));[m
[31m-        if (fcn == NULL) {[m
[31m-            ngx_http_file_cache_set_watermark(cache);[m
[31m-[m
[31m-            if (cache->fail_time != ngx_time()) {[m
[31m-                cache->fail_time = ngx_time();[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                           "could not allocate node%s", cache->shpool->log_ctx);[m
[31m-            }[m
[31m-[m
[31m-            ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cache->sh->count++;[m
[31m-[m
[31m-        ngx_memcpy((u_char *) &fcn->node.key, c->key, sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-        ngx_memcpy(fcn->key, &c->key[sizeof(ngx_rbtree_key_t)],[m
[31m-                   NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-        ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);[m
[31m-[m
[31m-        fcn->uses = 1;[m
[31m-        fcn->exists = 1;[m
[31m-        fcn->fs_size = c->fs_size;[m
[31m-[m
[31m-        cache->sh->size += c->fs_size;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_queue_remove(&fcn->queue);[m
[31m-    }[m
[31m-[m
[31m-    fcn->expire = ngx_time() + cache->inactive;[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http file cache delete: \"%s\"", path->data);[m
[31m-[m
[31m-    if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,[m
[31m-                      ngx_delete_file_n " \"%s\" failed", path->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_set_watermark(ngx_http_file_cache_t *cache)[m
[31m-{[m
[31m-    cache->sh->watermark = cache->sh->count - cache->sh->count / 8;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http file cache watermark: %ui", cache->sh->watermark);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-time_t[m
[31m-ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_cache_valid_t  *valid;[m
[31m-[m
[31m-    if (cache_valid == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    valid = cache_valid->elts;[m
[31m-    for (i = 0; i < cache_valid->nelts; i++) {[m
[31m-[m
[31m-        if (valid[i].status == 0) {[m
[31m-            return valid[i].valid;[m
[31m-        }[m
[31m-[m
[31m-        if (valid[i].status == status) {[m
[31m-            return valid[i].valid;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *confp = conf;[m
[31m-[m
[31m-    off_t                   max_size;[m
[31m-    u_char                 *last, *p;[m
[31m-    time_t                  inactive;[m
[31m-    size_t                  len;[m
[31m-    ssize_t                 size;[m
[31m-    ngx_str_t               s, name, *value;[m
[31m-    ngx_int_t               loader_files;[m
[31m-    ngx_msec_t              loader_sleep, loader_threshold;[m
[31m-    ngx_uint_t              i, n, use_temp_path;[m
[31m-    ngx_array_t            *caches;[m
[31m-    ngx_http_file_cache_t  *cache, **ce;[m
[31m-[m
[31m-    cache = ngx_pcalloc(cf->pool, sizeof(ngx_http_file_cache_t));[m
[31m-    if (cache == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cache->path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));[m
[31m-    if (cache->path == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    use_temp_path = 1;[m
[31m-[m
[31m-    inactive = 600;[m
[31m-    loader_files = 100;[m
[31m-    loader_sleep = 50;[m
[31m-    loader_threshold = 200;[m
[31m-[m
[31m-    name.len = 0;[m
[31m-    size = 0;[m
[31m-    max_size = NGX_MAX_OFF_T_VALUE;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    cache->path->name = value[1];[m
[31m-[m
[31m-    if (cache->path->name.data[cache->path->name.len - 1] == '/') {[m
[31m-        cache->path->name.len--;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &cache->path->name, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "levels=", 7) == 0) {[m
[31m-[m
[31m-            p = value[i].data + 7;[m
[31m-            last = value[i].data + value[i].len;[m
[31m-[m
[31m-            for (n = 0; n < 3 && p < last; n++) {[m
[31m-[m
[31m-                if (*p > '0' && *p < '3') {[m
[31m-[m
[31m-                    cache->path->level[n] = *p++ - '0';[m
[31m-                    cache->path->len += cache->path->level[n] + 1;[m
[31m-[m
[31m-                    if (p == last) {[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (*p++ == ':' && n < 2 && p != last) {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    goto invalid_levels;[m
[31m-                }[m
[31m-[m
[31m-                goto invalid_levels;[m
[31m-            }[m
[31m-[m
[31m-            if (cache->path->len < 10 + 3) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-        invalid_levels:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid \"levels\" \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "use_temp_path=", 14) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[i].data[14], "on") == 0) {[m
[31m-                use_temp_path = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[i].data[14], "off") == 0) {[m
[31m-                use_temp_path = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid use_temp_path value \"%V\", "[m
[31m-                                   "it must be \"on\" or \"off\"",[m
[31m-                                   &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "keys_zone=", 10) == 0) {[m
[31m-[m
[31m-            name.data = value[i].data + 10;[m
[31m-[m
[31m-            p = (u_char *) ngx_strchr(name.data, ':');[m
[31m-[m
[31m-            if (p) {[m
[31m-                name.len = p - name.data;[m
[31m-[m
[31m-                p++;[m
[31m-[m
[31m-                s.len = value[i].data + value[i].len - p;[m
[31m-                s.data = p;[m
[31m-[m
[31m-                size = ngx_parse_size(&s);[m
[31m-                if (size > 8191) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid keys zone size \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid inactive value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_size=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            max_size = ngx_parse_offset(&s);[m
[31m-            if (max_size < 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid max_size value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "loader_files=", 13) == 0) {[m
[31m-[m
[31m-            loader_files = ngx_atoi(value[i].data + 13, value[i].len - 13);[m
[31m-            if (loader_files == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid loader_files value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "loader_sleep=", 13) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 13;[m
[31m-            s.data = value[i].data + 13;[m
[31m-[m
[31m-            loader_sleep = ngx_parse_time(&s, 0);[m
[31m-            if (loader_sleep == (ngx_msec_t) NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid loader_sleep value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "loader_threshold=", 17) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 17;[m
[31m-            s.data = value[i].data + 17;[m
[31m-[m
[31m-            loader_threshold = ngx_parse_time(&s, 0);[m
[31m-            if (loader_threshold == (ngx_msec_t) NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid loader_threshold value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0 || size == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"keys_zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cache->path->manager = ngx_http_file_cache_manager;[m
[31m-    cache->path->loader = ngx_http_file_cache_loader;[m
[31m-    cache->path->data = cache;[m
[31m-    cache->path->conf_file = cf->conf_file->file.name.data;[m
[31m-    cache->path->line = cf->conf_file->line;[m
[31m-    cache->loader_files = loader_files;[m
[31m-    cache->loader_sleep = loader_sleep;[m
[31m-    cache->loader_threshold = loader_threshold;[m
[31m-[m
[31m-    if (ngx_add_path(cf, &cache->path) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!use_temp_path) {[m
[31m-        cache->temp_path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));[m
[31m-        if (cache->temp_path == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = cache->path->name.len + sizeof("/temp") - 1;[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cache->temp_path->name.len = len;[m
[31m-        cache->temp_path->name.data = p;[m
[31m-[m
[31m-        p = ngx_cpymem(p, cache->path->name.data, cache->path->name.len);[m
[31m-        ngx_memcpy(p, "/temp", sizeof("/temp"));[m
[31m-[m
[31m-        ngx_memcpy(&cache->temp_path->level, &cache->path->level,[m
[31m-                   3 * sizeof(size_t));[m
[31m-[m
[31m-        cache->temp_path->len = cache->path->len;[m
[31m-        cache->temp_path->conf_file = cf->conf_file->file.name.data;[m
[31m-        cache->temp_path->line = cf->conf_file->line;[m
[31m-[m
[31m-        if (ngx_add_path(cf, &cache->temp_path) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cache->shm_zone = ngx_shared_memory_add(cf, &name, size, cmd->post);[m
[31m-    if (cache->shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cache->shm_zone->data) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate zone \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    cache->shm_zone->init = ngx_http_file_cache_init;[m
[31m-    cache->shm_zone->data = cache;[m
[31m-[m
[31m-    cache->inactive = inactive;[m
[31m-    cache->max_size = max_size;[m
[31m-[m
[31m-    caches = (ngx_array_t *) (confp + cmd->offset);[m
[31m-[m
[31m-    ce = ngx_array_push(caches);[m
[31m-    if (ce == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ce = cache;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    time_t                    valid;[m
[31m-    ngx_str_t                *value;[m
[31m-    ngx_uint_t                i, n, status;[m
[31m-    ngx_array_t             **a;[m
[31m-    ngx_http_cache_valid_t   *v;[m
[31m-    static ngx_uint_t         statuses[] = { 200, 301, 302 };[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NGX_CONF_UNSET_PTR) {[m
[31m-        *a = ngx_array_create(cf->pool, 1, sizeof(ngx_http_cache_valid_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    n = cf->args->nelts - 1;[m
[31m-[m
[31m-    valid = ngx_parse_time(&value[n], 1);[m
[31m-    if (valid == (time_t) NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid time value \"%V\"", &value[n]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-[m
[31m-        for (i = 0; i < 3; i++) {[m
[31m-            v = ngx_array_push(*a);[m
[31m-            if (v == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            v->status = statuses[i];[m
[31m-            v->valid = valid;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < n; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "any") == 0) {[m
[31m-[m
[31m-            status = 0;[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            status = ngx_atoi(value[i].data, value[i].len);[m
[31m-            if (status < 100) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid status \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        v = ngx_array_push(*a);[m
[31m-        if (v == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->status = status;[m
[31m-        v->valid = valid;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_header_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_header_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8107219..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_header_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,633 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_header_filter_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_header_filter(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_header_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_header_filter_init,           /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_header_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_header_filter_module_ctx,    /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char ngx_http_server_string[] = "Server: openresty" CRLF;[m
[31m-static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_status_lines[] = {[m
[31m-[m
[31m-    ngx_string("200 OK"),[m
[31m-    ngx_string("201 Created"),[m
[31m-    ngx_string("202 Accepted"),[m
[31m-    ngx_null_string,  /* "203 Non-Authoritative Information" */[m
[31m-    ngx_string("204 No Content"),[m
[31m-    ngx_null_string,  /* "205 Reset Content" */[m
[31m-    ngx_string("206 Partial Content"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "207 Multi-Status" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_2XX  207[m
[31m-#define NGX_HTTP_OFF_3XX   (NGX_HTTP_LAST_2XX - 200)[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "300 Multiple Choices" */[m
[31m-[m
[31m-    ngx_string("301 Moved Permanently"),[m
[31m-    ngx_string("302 Moved Temporarily"),[m
[31m-    ngx_string("303 See Other"),[m
[31m-    ngx_string("304 Not Modified"),[m
[31m-    ngx_null_string,  /* "305 Use Proxy" */[m
[31m-    ngx_null_string,  /* "306 unused" */[m
[31m-    ngx_string("307 Temporary Redirect"),[m
[31m-[m
[31m-#define NGX_HTTP_LAST_3XX  308[m
[31m-#define NGX_HTTP_OFF_4XX   (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX)[m
[31m-[m
[31m-    ngx_string("400 Bad Request"),[m
[31m-    ngx_string("401 Unauthorized"),[m
[31m-    ngx_string("402 Payment Required"),[m
[31m-    ngx_string("403 Forbidden"),[m
[31m-    ngx_string("404 Not Found"),[m
[31m-    ngx_string("405 Not Allowed"),[m
[31m-    ngx_string("406 Not Acceptable"),[m
[31m-    ngx_null_string,  /* "407 Proxy Authentication Required" */[m
[31m-    ngx_string("408 Request Time-out"),[m
[31m-    ngx_string("409 Conflict"),[m
[31m-    ngx_string("410 Gone"),[m
[31m-    ngx_string("411 Length Required"),[m
[31m-    ngx_string("412 Precondition Failed"),[m
[31m-    ngx_string("413 Request Entity Too Large"),[m
[31m-    ngx_string("414 Request-URI Too Large"),[m
[31m-    ngx_string("415 Unsupported Media Type"),[m
[31m-    ngx_string("416 Requested Range Not Satisfiable"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "417 Expectation Failed" */[m
[31m-    /* ngx_null_string, */  /* "418 unused" */[m
[31m-    /* ngx_null_string, */  /* "419 unused" */[m
[31m-    /* ngx_null_string, */  /* "420 unused" */[m
[31m-    /* ngx_null_string, */  /* "421 unused" */[m
[31m-    /* ngx_null_string, */  /* "422 Unprocessable Entity" */[m
[31m-    /* ngx_null_string, */  /* "423 Locked" */[m
[31m-    /* ngx_null_string, */  /* "424 Failed Dependency" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_4XX  417[m
[31m-#define NGX_HTTP_OFF_5XX   (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)[m
[31m-[m
[31m-    ngx_string("500 Internal Server Error"),[m
[31m-    ngx_string("501 Not Implemented"),[m
[31m-    ngx_string("502 Bad Gateway"),[m
[31m-    ngx_string("503 Service Temporarily Unavailable"),[m
[31m-    ngx_string("504 Gateway Time-out"),[m
[31m-[m
[31m-    ngx_null_string,        /* "505 HTTP Version Not Supported" */[m
[31m-    ngx_null_string,        /* "506 Variant Also Negotiates" */[m
[31m-    ngx_string("507 Insufficient Storage"),[m
[31m-    /* ngx_null_string, */  /* "508 unused" */[m
[31m-    /* ngx_null_string, */  /* "509 unused" */[m
[31m-    /* ngx_null_string, */  /* "510 Not Extended" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_5XX  508[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_header_out_t  ngx_http_headers_out[] = {[m
[31m-    { ngx_string("Server"), offsetof(ngx_http_headers_out_t, server) },[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_out_t, date) },[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_length) },[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding) },[m
[31m-    { ngx_string("Location"), offsetof(ngx_http_headers_out_t, location) },[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified) },[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges) },[m
[31m-    { ngx_string("Expires"), offsetof(ngx_http_headers_out_t, expires) },[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control) },[m
[31m-    { ngx_string("ETag"), offsetof(ngx_http_headers_out_t, etag) },[m
[31m-[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                  host, *status_line;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_uint_t                 status, i, port;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_list_part_t           *part;[m
[31m-    ngx_table_elt_t           *header;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-#endif[m
[31m-    u_char                     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->header_sent = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time != -1) {[m
[31m-        if (r->headers_out.status != NGX_HTTP_OK[m
[31m-            && r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT[m
[31m-            && r->headers_out.status != NGX_HTTP_NOT_MODIFIED)[m
[31m-        {[m
[31m-            r->headers_out.last_modified_time = -1;[m
[31m-            r->headers_out.last_modified = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("HTTP/1.x ") - 1 + sizeof(CRLF) - 1[m
[31m-          /* the end of the header */[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    /* status line */[m
[31m-[m
[31m-    if (r->headers_out.status_line.len) {[m
[31m-        len += r->headers_out.status_line.len;[m
[31m-        status_line = &r->headers_out.status_line;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        status = 0;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-        if (status >= NGX_HTTP_OK[m
[31m-            && status < NGX_HTTP_LAST_2XX)[m
[31m-        {[m
[31m-            /* 2XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NO_CONTENT) {[m
[31m-                r->header_only = 1;[m
[31m-                ngx_str_null(&r->headers_out.content_type);[m
[31m-                r->headers_out.last_modified_time = -1;[m
[31m-                r->headers_out.last_modified = NULL;[m
[31m-                r->headers_out.content_length = NULL;[m
[31m-                r->headers_out.content_length_n = -1;[m
[31m-            }[m
[31m-[m
[31m-            status -= NGX_HTTP_OK;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_MOVED_PERMANENTLY[m
[31m-                   && status < NGX_HTTP_LAST_3XX)[m
[31m-        {[m
[31m-            /* 3XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-                r->header_only = 1;[m
[31m-            }[m
[31m-[m
[31m-            status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_BAD_REQUEST[m
[31m-                   && status < NGX_HTTP_LAST_4XX)[m
[31m-        {[m
[31m-            /* 4XX */[m
[31m-            status = status - NGX_HTTP_BAD_REQUEST[m
[31m-                            + NGX_HTTP_OFF_4XX;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                   && status < NGX_HTTP_LAST_5XX)[m
[31m-        {[m
[31m-            /* 5XX */[m
[31m-            status = status - NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                            + NGX_HTTP_OFF_5XX;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else {[m
[31m-            len += NGX_INT_T_LEN + 1 /* SP */;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (status_line && status_line->len == 0) {[m
[31m-            status = r->headers_out.status;[m
[31m-            len += NGX_INT_T_LEN + 1 /* SP */;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        len += clcf->server_tokens ? sizeof(ngx_http_server_full_string) - 1:[m
[31m-                                     sizeof(ngx_http_server_string) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        len += sizeof("Date: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        len += sizeof("Content-Type: ") - 1[m
[31m-               + r->headers_out.content_type.len + 2;[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        len += sizeof("Content-Length: ") - 1 + NGX_OFF_T_LEN + 2;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        len += sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        r->headers_out.location->hash = 0;[m
[31m-[m
[31m-        if (clcf->server_name_in_redirect) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            host = cscf->server_name;[m
[31m-[m
[31m-        } else if (r->headers_in.server.len) {[m
[31m-            host = r->headers_in.server;[m
[31m-[m
[31m-        } else {[m
[31m-            host.len = NGX_SOCKADDR_STRLEN;[m
[31m-            host.data = addr;[m
[31m-[m
[31m-            if (ngx_connection_local_sockaddr(c, &host, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-            port = ntohs(sin6->sin6_port);[m
[31m-            break;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            port = 0;[m
[31m-            break;[m
[31m-#endif[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-            port = ntohs(sin->sin_port);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        len += sizeof("Location: https://") - 1[m
[31m-               + host.len[m
[31m-               + r->headers_out.location->value.len + 2;[m
[31m-[m
[31m-        if (clcf->port_in_redirect) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl)[m
[31m-                port = (port == 443) ? 0 : port;[m
[31m-            else[m
[31m-#endif[m
[31m-                port = (port == 80) ? 0 : port;[m
[31m-[m
[31m-        } else {[m
[31m-            port = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (port) {[m
[31m-            len += sizeof(":65535") - 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&host);[m
[31m-        port = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        len += sizeof("Transfer-Encoding: chunked" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        len += sizeof("Connection: upgrade" CRLF) - 1;[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        len += sizeof("Connection: keep-alive" CRLF) - 1;[m
[31m-[m
[31m-        /*[m
[31m-         * MSIE and Opera ignore the "Keep-Alive: timeout=<N>" header.[m
[31m-         * MSIE keeps the connection alive for about 60-65 seconds.[m
[31m-         * Opera keeps the connection alive very long.[m
[31m-         * Mozilla keeps the connection alive for N plus about 1-10 seconds.[m
[31m-         * Konqueror keeps the connection alive for about N seconds.[m
[31m-         */[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-            len += sizeof("Keep-Alive: timeout=") - 1 + NGX_TIME_T_LEN + 2;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        len += sizeof("Connection: close" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        if (clcf->gzip_vary) {[m
[31m-            len += sizeof("Vary: Accept-Encoding" CRLF) - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            r->gzip_vary = 0;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len += header[i].key.len + sizeof(": ") - 1 + header[i].value.len[m
[31m-               + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* "HTTP/1.x " */[m
[31m-    b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1);[m
[31m-[m
[31m-    /* status line */[m
[31m-    if (status_line) {[m
[31m-        b->last = ngx_copy(b->last, status_line->data, status_line->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_sprintf(b->last, "%03ui ", status);[m
[31m-    }[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        if (clcf->server_tokens) {[m
[31m-            p = (u_char *) ngx_http_server_full_string;[m
[31m-            len = sizeof(ngx_http_server_full_string) - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            p = (u_char *) ngx_http_server_string;[m
[31m-            len = sizeof(ngx_http_server_string) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, p, len);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        b->last = ngx_cpymem(b->last, "Date: ", sizeof("Date: ") - 1);[m
[31m-        b->last = ngx_cpymem(b->last, ngx_cached_http_time.data,[m
[31m-                             ngx_cached_http_time.len);[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Content-Type: ",[m
[31m-                             sizeof("Content-Type: ") - 1);[m
[31m-        p = b->last;[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.content_type.data,[m
[31m-                           r->headers_out.content_type.len);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            b->last = ngx_cpymem(b->last, "; charset=",[m
[31m-                                 sizeof("; charset=") - 1);[m
[31m-            b->last = ngx_copy(b->last, r->headers_out.charset.data,[m
[31m-                               r->headers_out.charset.len);[m
[31m-[m
[31m-            /* update r->headers_out.content_type for possible logging */[m
[31m-[m
[31m-            r->headers_out.content_type.len = b->last - p;[m
[31m-            r->headers_out.content_type.data = p;[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        b->last = ngx_sprintf(b->last, "Content-Length: %O" CRLF,[m
[31m-                              r->headers_out.content_length_n);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        b->last = ngx_cpymem(b->last, "Last-Modified: ",[m
[31m-                             sizeof("Last-Modified: ") - 1);[m
[31m-        b->last = ngx_http_time(b->last, r->headers_out.last_modified_time);[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (host.data) {[m
[31m-[m
[31m-        p = b->last + sizeof("Location: ") - 1;[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Location: http",[m
[31m-                             sizeof("Location: http") - 1);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        if (c->ssl) {[m
[31m-            *b->last++ ='s';[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        *b->last++ = ':'; *b->last++ = '/'; *b->last++ = '/';[m
[31m-        b->last = ngx_copy(b->last, host.data, host.len);[m
[31m-[m
[31m-        if (port) {[m
[31m-            b->last = ngx_sprintf(b->last, ":%ui", port);[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.location->value.data,[m
[31m-                           r->headers_out.location->value.len);[m
[31m-[m
[31m-        /* update r->headers_out.location->value for possible logging */[m
[31m-[m
[31m-        r->headers_out.location->value.len = b->last - p;[m
[31m-        r->headers_out.location->value.data = p;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        b->last = ngx_cpymem(b->last, "Transfer-Encoding: chunked" CRLF,[m
[31m-                             sizeof("Transfer-Encoding: chunked" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: upgrade" CRLF,[m
[31m-                             sizeof("Connection: upgrade" CRLF) - 1);[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF,[m
[31m-                             sizeof("Connection: keep-alive" CRLF) - 1);[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-            b->last = ngx_sprintf(b->last, "Keep-Alive: timeout=%T" CRLF,[m
[31m-                                  clcf->keepalive_header);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: close" CRLF,[m
[31m-                             sizeof("Connection: close" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        b->last = ngx_cpymem(b->last, "Vary: Accept-Encoding" CRLF,[m
[31m-                             sizeof("Vary: Accept-Encoding" CRLF) - 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-        *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].value.data, header[i].value.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "%*s", (size_t) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    /* the end of HTTP header */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    r->header_size = b->last - b->pos;[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_write_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_header_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_header_filter = ngx_http_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_header_filter_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_header_filter_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 507dc93..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_header_filter_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,633 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_header_filter_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_header_filter(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_header_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_header_filter_init,           /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_header_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_header_filter_module_ctx,    /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char ngx_http_server_string[] = "Server: nginx" CRLF;[m
[31m-static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_status_lines[] = {[m
[31m-[m
[31m-    ngx_string("200 OK"),[m
[31m-    ngx_string("201 Created"),[m
[31m-    ngx_string("202 Accepted"),[m
[31m-    ngx_null_string,  /* "203 Non-Authoritative Information" */[m
[31m-    ngx_string("204 No Content"),[m
[31m-    ngx_null_string,  /* "205 Reset Content" */[m
[31m-    ngx_string("206 Partial Content"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "207 Multi-Status" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_2XX  207[m
[31m-#define NGX_HTTP_OFF_3XX   (NGX_HTTP_LAST_2XX - 200)[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "300 Multiple Choices" */[m
[31m-[m
[31m-    ngx_string("301 Moved Permanently"),[m
[31m-    ngx_string("302 Moved Temporarily"),[m
[31m-    ngx_string("303 See Other"),[m
[31m-    ngx_string("304 Not Modified"),[m
[31m-    ngx_null_string,  /* "305 Use Proxy" */[m
[31m-    ngx_null_string,  /* "306 unused" */[m
[31m-    ngx_string("307 Temporary Redirect"),[m
[31m-[m
[31m-#define NGX_HTTP_LAST_3XX  308[m
[31m-#define NGX_HTTP_OFF_4XX   (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX)[m
[31m-[m
[31m-    ngx_string("400 Bad Request"),[m
[31m-    ngx_string("401 Unauthorized"),[m
[31m-    ngx_string("402 Payment Required"),[m
[31m-    ngx_string("403 Forbidden"),[m
[31m-    ngx_string("404 Not Found"),[m
[31m-    ngx_string("405 Not Allowed"),[m
[31m-    ngx_string("406 Not Acceptable"),[m
[31m-    ngx_null_string,  /* "407 Proxy Authentication Required" */[m
[31m-    ngx_string("408 Request Time-out"),[m
[31m-    ngx_string("409 Conflict"),[m
[31m-    ngx_string("410 Gone"),[m
[31m-    ngx_string("411 Length Required"),[m
[31m-    ngx_string("412 Precondition Failed"),[m
[31m-    ngx_string("413 Request Entity Too Large"),[m
[31m-    ngx_string("414 Request-URI Too Large"),[m
[31m-    ngx_string("415 Unsupported Media Type"),[m
[31m-    ngx_string("416 Requested Range Not Satisfiable"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "417 Expectation Failed" */[m
[31m-    /* ngx_null_string, */  /* "418 unused" */[m
[31m-    /* ngx_null_string, */  /* "419 unused" */[m
[31m-    /* ngx_null_string, */  /* "420 unused" */[m
[31m-    /* ngx_null_string, */  /* "421 unused" */[m
[31m-    /* ngx_null_string, */  /* "422 Unprocessable Entity" */[m
[31m-    /* ngx_null_string, */  /* "423 Locked" */[m
[31m-    /* ngx_null_string, */  /* "424 Failed Dependency" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_4XX  417[m
[31m-#define NGX_HTTP_OFF_5XX   (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)[m
[31m-[m
[31m-    ngx_string("500 Internal Server Error"),[m
[31m-    ngx_string("501 Not Implemented"),[m
[31m-    ngx_string("502 Bad Gateway"),[m
[31m-    ngx_string("503 Service Temporarily Unavailable"),[m
[31m-    ngx_string("504 Gateway Time-out"),[m
[31m-[m
[31m-    ngx_null_string,        /* "505 HTTP Version Not Supported" */[m
[31m-    ngx_null_string,        /* "506 Variant Also Negotiates" */[m
[31m-    ngx_string("507 Insufficient Storage"),[m
[31m-    /* ngx_null_string, */  /* "508 unused" */[m
[31m-    /* ngx_null_string, */  /* "509 unused" */[m
[31m-    /* ngx_null_string, */  /* "510 Not Extended" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_5XX  508[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_header_out_t  ngx_http_headers_out[] = {[m
[31m-    { ngx_string("Server"), offsetof(ngx_http_headers_out_t, server) },[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_out_t, date) },[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_length) },[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding) },[m
[31m-    { ngx_string("Location"), offsetof(ngx_http_headers_out_t, location) },[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified) },[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges) },[m
[31m-    { ngx_string("Expires"), offsetof(ngx_http_headers_out_t, expires) },[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control) },[m
[31m-    { ngx_string("ETag"), offsetof(ngx_http_headers_out_t, etag) },[m
[31m-[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                  host, *status_line;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_uint_t                 status, i, port;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_list_part_t           *part;[m
[31m-    ngx_table_elt_t           *header;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-#endif[m
[31m-    u_char                     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->header_sent = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time != -1) {[m
[31m-        if (r->headers_out.status != NGX_HTTP_OK[m
[31m-            && r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT[m
[31m-            && r->headers_out.status != NGX_HTTP_NOT_MODIFIED)[m
[31m-        {[m
[31m-            r->headers_out.last_modified_time = -1;[m
[31m-            r->headers_out.last_modified = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("HTTP/1.x ") - 1 + sizeof(CRLF) - 1[m
[31m-          /* the end of the header */[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    /* status line */[m
[31m-[m
[31m-    if (r->headers_out.status_line.len) {[m
[31m-        len += r->headers_out.status_line.len;[m
[31m-        status_line = &r->headers_out.status_line;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        status = 0;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-        if (status >= NGX_HTTP_OK[m
[31m-            && status < NGX_HTTP_LAST_2XX)[m
[31m-        {[m
[31m-            /* 2XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NO_CONTENT) {[m
[31m-                r->header_only = 1;[m
[31m-                ngx_str_null(&r->headers_out.content_type);[m
[31m-                r->headers_out.last_modified_time = -1;[m
[31m-                r->headers_out.last_modified = NULL;[m
[31m-                r->headers_out.content_length = NULL;[m
[31m-                r->headers_out.content_length_n = -1;[m
[31m-            }[m
[31m-[m
[31m-            status -= NGX_HTTP_OK;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_MOVED_PERMANENTLY[m
[31m-                   && status < NGX_HTTP_LAST_3XX)[m
[31m-        {[m
[31m-            /* 3XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-                r->header_only = 1;[m
[31m-            }[m
[31m-[m
[31m-            status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_BAD_REQUEST[m
[31m-                   && status < NGX_HTTP_LAST_4XX)[m
[31m-        {[m
[31m-            /* 4XX */[m
[31m-            status = status - NGX_HTTP_BAD_REQUEST[m
[31m-                            + NGX_HTTP_OFF_4XX;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                   && status < NGX_HTTP_LAST_5XX)[m
[31m-        {[m
[31m-            /* 5XX */[m
[31m-            status = status - NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                            + NGX_HTTP_OFF_5XX;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else {[m
[31m-            len += NGX_INT_T_LEN + 1 /* SP */;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (status_line && status_line->len == 0) {[m
[31m-            status = r->headers_out.status;[m
[31m-            len += NGX_INT_T_LEN + 1 /* SP */;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        len += clcf->server_tokens ? sizeof(ngx_http_server_full_string) - 1:[m
[31m-                                     sizeof(ngx_http_server_string) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        len += sizeof("Date: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        len += sizeof("Content-Type: ") - 1[m
[31m-               + r->headers_out.content_type.len + 2;[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        len += sizeof("Content-Length: ") - 1 + NGX_OFF_T_LEN + 2;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        len += sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        r->headers_out.location->hash = 0;[m
[31m-[m
[31m-        if (clcf->server_name_in_redirect) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            host = cscf->server_name;[m
[31m-[m
[31m-        } else if (r->headers_in.server.len) {[m
[31m-            host = r->headers_in.server;[m
[31m-[m
[31m-        } else {[m
[31m-            host.len = NGX_SOCKADDR_STRLEN;[m
[31m-            host.data = addr;[m
[31m-[m
[31m-            if (ngx_connection_local_sockaddr(c, &host, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-            port = ntohs(sin6->sin6_port);[m
[31m-            break;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            port = 0;[m
[31m-            break;[m
[31m-#endif[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-            port = ntohs(sin->sin_port);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        len += sizeof("Location: https://") - 1[m
[31m-               + host.len[m
[31m-               + r->headers_out.location->value.len + 2;[m
[31m-[m
[31m-        if (clcf->port_in_redirect) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl)[m
[31m-                port = (port == 443) ? 0 : port;[m
[31m-            else[m
[31m-#endif[m
[31m-                port = (port == 80) ? 0 : port;[m
[31m-[m
[31m-        } else {[m
[31m-            port = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (port) {[m
[31m-            len += sizeof(":65535") - 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&host);[m
[31m-        port = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        len += sizeof("Transfer-Encoding: chunked" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        len += sizeof("Connection: upgrade" CRLF) - 1;[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        len += sizeof("Connection: keep-alive" CRLF) - 1;[m
[31m-[m
[31m-        /*[m
[31m-         * MSIE and Opera ignore the "Keep-Alive: timeout=<N>" header.[m
[31m-         * MSIE keeps the connection alive for about 60-65 seconds.[m
[31m-         * Opera keeps the connection alive very long.[m
[31m-         * Mozilla keeps the connection alive for N plus about 1-10 seconds.[m
[31m-         * Konqueror keeps the connection alive for about N seconds.[m
[31m-         */[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-            len += sizeof("Keep-Alive: timeout=") - 1 + NGX_TIME_T_LEN + 2;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        len += sizeof("Connection: close" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        if (clcf->gzip_vary) {[m
[31m-            len += sizeof("Vary: Accept-Encoding" CRLF) - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            r->gzip_vary = 0;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len += header[i].key.len + sizeof(": ") - 1 + header[i].value.len[m
[31m-               + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* "HTTP/1.x " */[m
[31m-    b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1);[m
[31m-[m
[31m-    /* status line */[m
[31m-    if (status_line) {[m
[31m-        b->last = ngx_copy(b->last, status_line->data, status_line->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_sprintf(b->last, "%03ui ", status);[m
[31m-    }[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        if (clcf->server_tokens) {[m
[31m-            p = (u_char *) ngx_http_server_full_string;[m
[31m-            len = sizeof(ngx_http_server_full_string) - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            p = (u_char *) ngx_http_server_string;[m
[31m-            len = sizeof(ngx_http_server_string) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, p, len);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        b->last = ngx_cpymem(b->last, "Date: ", sizeof("Date: ") - 1);[m
[31m-        b->last = ngx_cpymem(b->last, ngx_cached_http_time.data,[m
[31m-                             ngx_cached_http_time.len);[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Content-Type: ",[m
[31m-                             sizeof("Content-Type: ") - 1);[m
[31m-        p = b->last;[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.content_type.data,[m
[31m-                           r->headers_out.content_type.len);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            b->last = ngx_cpymem(b->last, "; charset=",[m
[31m-                                 sizeof("; charset=") - 1);[m
[31m-            b->last = ngx_copy(b->last, r->headers_out.charset.data,[m
[31m-                               r->headers_out.charset.len);[m
[31m-[m
[31m-            /* update r->headers_out.content_type for possible logging */[m
[31m-[m
[31m-            r->headers_out.content_type.len = b->last - p;[m
[31m-            r->headers_out.content_type.data = p;[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        b->last = ngx_sprintf(b->last, "Content-Length: %O" CRLF,[m
[31m-                              r->headers_out.content_length_n);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        b->last = ngx_cpymem(b->last, "Last-Modified: ",[m
[31m-                             sizeof("Last-Modified: ") - 1);[m
[31m-        b->last = ngx_http_time(b->last, r->headers_out.last_modified_time);[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (host.data) {[m
[31m-[m
[31m-        p = b->last + sizeof("Location: ") - 1;[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Location: http",[m
[31m-                             sizeof("Location: http") - 1);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        if (c->ssl) {[m
[31m-            *b->last++ ='s';[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        *b->last++ = ':'; *b->last++ = '/'; *b->last++ = '/';[m
[31m-        b->last = ngx_copy(b->last, host.data, host.len);[m
[31m-[m
[31m-        if (port) {[m
[31m-            b->last = ngx_sprintf(b->last, ":%ui", port);[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.location->value.data,[m
[31m-                           r->headers_out.location->value.len);[m
[31m-[m
[31m-        /* update r->headers_out.location->value for possible logging */[m
[31m-[m
[31m-        r->headers_out.location->value.len = b->last - p;[m
[31m-        r->headers_out.location->value.data = p;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        b->last = ngx_cpymem(b->last, "Transfer-Encoding: chunked" CRLF,[m
[31m-                             sizeof("Transfer-Encoding: chunked" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: upgrade" CRLF,[m
[31m-                             sizeof("Connection: upgrade" CRLF) - 1);[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF,[m
[31m-                             sizeof("Connection: keep-alive" CRLF) - 1);[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-            b->last = ngx_sprintf(b->last, "Keep-Alive: timeout=%T" CRLF,[m
[31m-                                  clcf->keepalive_header);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: close" CRLF,[m
[31m-                             sizeof("Connection: close" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        b->last = ngx_cpymem(b->last, "Vary: Accept-Encoding" CRLF,[m
[31m-                             sizeof("Vary: Accept-Encoding" CRLF) - 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-        *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].value.data, header[i].value.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "%*s", (size_t) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    /* the end of HTTP header */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    r->header_size = b->last - b->pos;[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_write_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_header_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_header_filter = ngx_http_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_parse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_parse.c[m
[1mdeleted file mode 100644[m
[1mindex 0e0b3a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_parse.c[m
[1m+++ /dev/null[m
[36m@@ -1,2363 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static uint32_t  usual[] = {[m
[31m-    0xffffdbfe, /* 1111 1111 1111 1111  1101 1011 1111 1110 */[m
[31m-[m
[31m-                /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-    0x7fff37d6, /* 0111 1111 1111 1111  0011 0111 1101 0110 */[m
[31m-[m
[31m-                /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-#if (NGX_WIN32)[m
[31m-    0xefffffff, /* 1110 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-#else[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-#endif[m
[31m-[m
[31m-                /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define ngx_str3_cmp(m, c0, c1, c2, c3)                                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ngx_str3Ocmp(m, c0, c1, c2, c3)                                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ngx_str4cmp(m, c0, c1, c2, c3)                                        \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ngx_str5cmp(m, c0, c1, c2, c3, c4)                                    \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && m[4] == c4[m
[31m-[m
[31m-#define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5)                                \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4)[m
[31m-[m
[31m-#define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)[m
[31m-[m
[31m-#define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                        \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)[m
[31m-[m
[31m-#define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8)                    \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)  \[m
[31m-        && m[8] == c8[m
[31m-[m
[31m-#else /* !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) */[m
[31m-[m
[31m-#define ngx_str3_cmp(m, c0, c1, c2, c3)                                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2[m
[31m-[m
[31m-#define ngx_str3Ocmp(m, c0, c1, c2, c3)                                       \[m
[31m-    m[0] == c0 && m[2] == c2 && m[3] == c3[m
[31m-[m
[31m-#define ngx_str4cmp(m, c0, c1, c2, c3)                                        \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3[m
[31m-[m
[31m-#define ngx_str5cmp(m, c0, c1, c2, c3, c4)                                    \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4[m
[31m-[m
[31m-#define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5)                                \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5[m
[31m-[m
[31m-#define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6[m
[31m-[m
[31m-#define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                        \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7[m
[31m-[m
[31m-#define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8)                    \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7 && m[8] == c8[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* gcc, icc, msvc and others compile these switches as an jump table */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    u_char  c, ch, *p, *m;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_method,[m
[31m-        sw_spaces_before_uri,[m
[31m-        sw_schema,[m
[31m-        sw_schema_slash,[m
[31m-        sw_schema_slash_slash,[m
[31m-        sw_host_start,[m
[31m-        sw_host,[m
[31m-        sw_host_end,[m
[31m-        sw_host_ip_literal,[m
[31m-        sw_port,[m
[31m-        sw_host_http_09,[m
[31m-        sw_after_slash_in_uri,[m
[31m-        sw_check_uri,[m
[31m-        sw_check_uri_http_09,[m
[31m-        sw_uri,[m
[31m-        sw_http_09,[m
[31m-        sw_http_H,[m
[31m-        sw_http_HT,[m
[31m-        sw_http_HTT,[m
[31m-        sw_http_HTTP,[m
[31m-        sw_first_major_digit,[m
[31m-        sw_major_digit,[m
[31m-        sw_first_minor_digit,[m
[31m-        sw_minor_digit,[m
[31m-        sw_spaces_after_digit,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = r->state;[m
[31m-[m
[31m-    for (p = b->pos; p < b->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* HTTP methods: GET, HEAD, POST */[m
[31m-        case sw_start:[m
[31m-            r->request_start = p;[m
[31m-[m
[31m-            if (ch == CR || ch == LF) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && ch != '_') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_METHOD;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_method;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_method:[m
[31m-            if (ch == ' ') {[m
[31m-                r->method_end = p - 1;[m
[31m-                m = r->request_start;[m
[31m-[m
[31m-                switch (p - m) {[m
[31m-[m
[31m-                case 3:[m
[31m-                    if (ngx_str3_cmp(m, 'G', 'E', 'T', ' ')) {[m
[31m-                        r->method = NGX_HTTP_GET;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_str3_cmp(m, 'P', 'U', 'T', ' ')) {[m
[31m-                        r->method = NGX_HTTP_PUT;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 4:[m
[31m-                    if (m[1] == 'O') {[m
[31m-[m
[31m-                        if (ngx_str3Ocmp(m, 'P', 'O', 'S', 'T')) {[m
[31m-                            r->method = NGX_HTTP_POST;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_str3Ocmp(m, 'C', 'O', 'P', 'Y')) {[m
[31m-                            r->method = NGX_HTTP_COPY;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_str3Ocmp(m, 'M', 'O', 'V', 'E')) {[m
[31m-                            r->method = NGX_HTTP_MOVE;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_str3Ocmp(m, 'L', 'O', 'C', 'K')) {[m
[31m-                            r->method = NGX_HTTP_LOCK;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                    } else {[m
[31m-[m
[31m-                        if (ngx_str4cmp(m, 'H', 'E', 'A', 'D')) {[m
[31m-                            r->method = NGX_HTTP_HEAD;[m
[31m-                            break;[m
[31m-                        }[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 5:[m
[31m-                    if (ngx_str5cmp(m, 'M', 'K', 'C', 'O', 'L')) {[m
[31m-                        r->method = NGX_HTTP_MKCOL;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_str5cmp(m, 'P', 'A', 'T', 'C', 'H')) {[m
[31m-                        r->method = NGX_HTTP_PATCH;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_str5cmp(m, 'T', 'R', 'A', 'C', 'E')) {[m
[31m-                        r->method = NGX_HTTP_TRACE;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 6:[m
[31m-                    if (ngx_str6cmp(m, 'D', 'E', 'L', 'E', 'T', 'E')) {[m
[31m-                        r->method = NGX_HTTP_DELETE;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_str6cmp(m, 'U', 'N', 'L', 'O', 'C', 'K')) {[m
[31m-                        r->method = NGX_HTTP_UNLOCK;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 7:[m
[31m-                    if (ngx_str7_cmp(m, 'O', 'P', 'T', 'I', 'O', 'N', 'S', ' '))[m
[31m-                    {[m
[31m-                        r->method = NGX_HTTP_OPTIONS;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 8:[m
[31m-                    if (ngx_str8cmp(m, 'P', 'R', 'O', 'P', 'F', 'I', 'N', 'D'))[m
[31m-                    {[m
[31m-                        r->method = NGX_HTTP_PROPFIND;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 9:[m
[31m-                    if (ngx_str9cmp(m,[m
[31m-                            'P', 'R', 'O', 'P', 'P', 'A', 'T', 'C', 'H'))[m
[31m-                    {[m
[31m-                        r->method = NGX_HTTP_PROPPATCH;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                state = sw_spaces_before_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && ch != '_') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_METHOD;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before URI */[m
[31m-        case sw_spaces_before_uri:[m
[31m-[m
[31m-            if (ch == '/') {[m
[31m-                r->uri_start = p;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                r->schema_start = p;[m
[31m-                state = sw_schema;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_schema:[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ':':[m
[31m-                r->schema_end = p;[m
[31m-                state = sw_schema_slash;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_schema_slash:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_schema_slash_slash;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_schema_slash_slash:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_host_start;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_host_start:[m
[31m-[m
[31m-            r->host_start = p;[m
[31m-[m
[31m-            if (ch == '[') {[m
[31m-                state = sw_host_ip_literal;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_host;[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case sw_host:[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch >= '0' && ch <= '9') || ch == '.' || ch == '-') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case sw_host_end:[m
[31m-[m
[31m-            r->host_end = p;[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ':':[m
[31m-                state = sw_port;[m
[31m-                break;[m
[31m-            case '/':[m
[31m-                r->uri_start = p;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            case ' ':[m
[31m-                /*[m
[31m-                 * use single "/" from request line to preserve pointers,[m
[31m-                 * if request line will be copied to large client buffer[m
[31m-                 */[m
[31m-                r->uri_start = r->schema_end + 1;[m
[31m-                r->uri_end = r->schema_end + 2;[m
[31m-                state = sw_host_http_09;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_host_ip_literal:[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ':':[m
[31m-                break;[m
[31m-            case ']':[m
[31m-                state = sw_host_end;[m
[31m-                break;[m
[31m-            case '-':[m
[31m-            case '.':[m
[31m-            case '_':[m
[31m-            case '~':[m
[31m-                /* unreserved */[m
[31m-                break;[m
[31m-            case '!':[m
[31m-            case '$':[m
[31m-            case '&':[m
[31m-            case '\'':[m
[31m-            case '(':[m
[31m-            case ')':[m
[31m-            case '*':[m
[31m-            case '+':[m
[31m-            case ',':[m
[31m-            case ';':[m
[31m-            case '=':[m
[31m-                /* sub-delims */[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_port:[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                r->port_end = p;[m
[31m-                r->uri_start = p;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            case ' ':[m
[31m-                r->port_end = p;[m
[31m-                /*[m
[31m-                 * use single "/" from request line to preserve pointers,[m
[31m-                 * if request line will be copied to large client buffer[m
[31m-                 */[m
[31m-                r->uri_start = r->schema_end + 1;[m
[31m-                r->uri_end = r->schema_end + 2;[m
[31m-                state = sw_host_http_09;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space+ after "http://host[:port] " */[m
[31m-        case sw_host_http_09:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case 'H':[m
[31m-                r->http_protocol.data = p;[m
[31m-                state = sw_http_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-[m
[31m-        /* check "/.", "//", "%", and "\" (Win32) in URI */[m
[31m-        case sw_after_slash_in_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->uri_end = p;[m
[31m-                state = sw_check_uri_http_09;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case '.':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                r->quoted_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '/':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '?':[m
[31m-                r->args_start = p + 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                break;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            default:[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* check "/", "%" and "\" (Win32) in URI */[m
[31m-        case sw_check_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-#if (NGX_WIN32)[m
[31m-                if (r->uri_ext == p) {[m
[31m-                    r->complex_uri = 1;[m
[31m-                    state = sw_uri;[m
[31m-                    break;[m
[31m-                }[m
[31m-#endif[m
[31m-                r->uri_ext = NULL;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                r->uri_ext = p + 1;[m
[31m-                break;[m
[31m-            case ' ':[m
[31m-                r->uri_end = p;[m
[31m-                state = sw_check_uri_http_09;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '%':[m
[31m-                r->quoted_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p + 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                break;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space+ after URI */[m
[31m-        case sw_check_uri_http_09:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case 'H':[m
[31m-                r->http_protocol.data = p;[m
[31m-                state = sw_http_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                r->space_in_uri = 1;[m
[31m-                state = sw_check_uri;[m
[31m-                p--;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-[m
[31m-        /* URI */[m
[31m-        case sw_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->uri_end = p;[m
[31m-                state = sw_http_09;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                break;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space+ after URI */[m
[31m-        case sw_http_09:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case 'H':[m
[31m-                r->http_protocol.data = p;[m
[31m-                state = sw_http_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                r->space_in_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                p--;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_http_H:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_http_HT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_http_HT:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_http_HTT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_http_HTT:[m
[31m-            switch (ch) {[m
[31m-            case 'P':[m
[31m-                state = sw_http_HTTP;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_http_HTTP:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_first_major_digit;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* first digit of major HTTP version */[m
[31m-        case sw_first_major_digit:[m
[31m-            if (ch < '1' || ch > '9') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            r->http_major = ch - '0';[m
[31m-            state = sw_major_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* major HTTP version or dot */[m
[31m-        case sw_major_digit:[m
[31m-            if (ch == '.') {[m
[31m-                state = sw_first_minor_digit;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            r->http_major = r->http_major * 10 + ch - '0';[m
[31m-            break;[m
[31m-[m
[31m-        /* first digit of minor HTTP version */[m
[31m-        case sw_first_minor_digit:[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            r->http_minor = ch - '0';[m
[31m-            state = sw_minor_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* minor HTTP version or end of request line */[m
[31m-        case sw_minor_digit:[m
[31m-            if (ch == CR) {[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == LF) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ' ') {[m
[31m-                state = sw_spaces_after_digit;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            r->http_minor = r->http_minor * 10 + ch - '0';[m
[31m-            break;[m
[31m-[m
[31m-        case sw_spaces_after_digit:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of request line */[m
[31m-        case sw_almost_done:[m
[31m-            r->request_end = p - 1;[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = p;[m
[31m-    r->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-[m
[31m-    if (r->request_end == NULL) {[m
[31m-        r->request_end = p;[m
[31m-    }[m
[31m-[m
[31m-    r->http_version = r->http_major * 1000 + r->http_minor;[m
[31m-    r->state = sw_start;[m
[31m-[m
[31m-    if (r->http_version == 9 && r->method != NGX_HTTP_GET) {[m
[31m-        return NGX_HTTP_PARSE_INVALID_09_METHOD;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_uint_t allow_underscores)[m
[31m-{[m
[31m-    u_char      c, ch, *p;[m
[31m-    ngx_uint_t  hash, i;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_name,[m
[31m-        sw_space_before_value,[m
[31m-        sw_value,[m
[31m-        sw_space_after_value,[m
[31m-        sw_ignore_line,[m
[31m-        sw_almost_done,[m
[31m-        sw_header_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    /* the last '\0' is not needed because string is zero terminated */[m
[31m-[m
[31m-    static u_char  lowcase[] =[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0-\0\0" "0123456789\0\0\0\0\0\0"[m
[31m-        "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"[m
[31m-        "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";[m
[31m-[m
[31m-    state = r->state;[m
[31m-    hash = r->header_hash;[m
[31m-    i = r->lowcase_index;[m
[31m-[m
[31m-    for (p = b->pos; p < b->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* first char */[m
[31m-        case sw_start:[m
[31m-            r->header_name_start = p;[m
[31m-            r->invalid_header = 0;[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                r->header_end = p;[m
[31m-                state = sw_header_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->header_end = p;[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                state = sw_name;[m
[31m-[m
[31m-                c = lowcase[ch];[m
[31m-[m
[31m-                if (c) {[m
[31m-                    hash = ngx_hash(0, c);[m
[31m-                    r->lowcase_header[0] = c;[m
[31m-                    i = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (ch == '_') {[m
[31m-                    if (allow_underscores) {[m
[31m-                        hash = ngx_hash(0, ch);[m
[31m-                        r->lowcase_header[0] = ch;[m
[31m-                        i = 1;[m
[31m-[m
[31m-                    } else {[m
[31m-                        r->invalid_header = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (ch == '\0') {[m
[31m-                    return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-                }[m
[31m-[m
[31m-                r->invalid_header = 1;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header name */[m
[31m-        case sw_name:[m
[31m-            c = lowcase[ch];[m
[31m-[m
[31m-            if (c) {[m
[31m-                hash = ngx_hash(hash, c);[m
[31m-                r->lowcase_header[i++] = c;[m
[31m-                i &= (NGX_HTTP_LC_HEADER_LEN - 1);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '_') {[m
[31m-                if (allow_underscores) {[m
[31m-                    hash = ngx_hash(hash, ch);[m
[31m-                    r->lowcase_header[i++] = ch;[m
[31m-                    i &= (NGX_HTTP_LC_HEADER_LEN - 1);[m
[31m-[m
[31m-                } else {[m
[31m-                    r->invalid_header = 1;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                r->header_name_end = p;[m
[31m-                state = sw_space_before_value;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == CR) {[m
[31m-                r->header_name_end = p;[m
[31m-                r->header_start = p;[m
[31m-                r->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == LF) {[m
[31m-                r->header_name_end = p;[m
[31m-                r->header_start = p;[m
[31m-                r->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            /* IIS may send the duplicate "HTTP/1.1 ..." lines */[m
[31m-            if (ch == '/'[m
[31m-                && r->upstream[m
[31m-                && p - r->header_name_start == 4[m
[31m-                && ngx_strncmp(r->header_name_start, "HTTP", 4) == 0)[m
[31m-            {[m
[31m-                state = sw_ignore_line;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '\0') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            }[m
[31m-[m
[31m-            r->invalid_header = 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before header value */[m
[31m-        case sw_space_before_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->header_start = p;[m
[31m-                r->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->header_start = p;[m
[31m-                r->header_end = p;[m
[31m-                goto done;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            default:[m
[31m-                r->header_start = p;[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header value */[m
[31m-        case sw_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->header_end = p;[m
[31m-                state = sw_space_after_value;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->header_end = p;[m
[31m-                goto done;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before end of header line */[m
[31m-        case sw_space_after_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            default:[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* ignore header line */[m
[31m-        case sw_ignore_line:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                state = sw_start;[m
[31m-                break;[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of header line */[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            case CR:[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of header */[m
[31m-        case sw_header_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = p;[m
[31m-    r->state = state;[m
[31m-    r->header_hash = hash;[m
[31m-    r->lowcase_index = i;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-    r->state = sw_start;[m
[31m-    r->header_hash = hash;[m
[31m-    r->lowcase_index = i;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-header_done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-    r->state = sw_start;[m
[31m-[m
[31m-    return NGX_HTTP_PARSE_HEADER_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_uri(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char  *p, ch;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_after_slash_in_uri,[m
[31m-        sw_check_uri,[m
[31m-        sw_uri[m
[31m-    } state;[m
[31m-[m
[31m-    state = sw_start;[m
[31m-[m
[31m-    for (p = r->uri_start; p != r->uri_end; p++) {[m
[31m-[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case sw_start:[m
[31m-[m
[31m-            if (ch != '/') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_after_slash_in_uri;[m
[31m-            break;[m
[31m-[m
[31m-        /* check "/.", "//", "%", and "\" (Win32) in URI */[m
[31m-        case sw_after_slash_in_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->space_in_uri = 1;[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                r->quoted_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '/':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '?':[m
[31m-                r->args_start = p + 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                break;[m
[31m-            default:[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* check "/", "%" and "\" (Win32) in URI */[m
[31m-        case sw_check_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-#if (NGX_WIN32)[m
[31m-                if (r->uri_ext == p) {[m
[31m-                    r->complex_uri = 1;[m
[31m-                    state = sw_uri;[m
[31m-                    break;[m
[31m-                }[m
[31m-#endif[m
[31m-                r->uri_ext = NULL;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                r->uri_ext = p + 1;[m
[31m-                break;[m
[31m-            case ' ':[m
[31m-                r->space_in_uri = 1;[m
[31m-                break;[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '%':[m
[31m-                r->quoted_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p + 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* URI */[m
[31m-        case sw_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->space_in_uri = 1;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_complex_uri(ngx_http_request_t *r, ngx_uint_t merge_slashes)[m
[31m-{[m
[31m-    u_char  c, ch, decoded, *p, *u;[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_slash,[m
[31m-        sw_dot,[m
[31m-        sw_dot_dot,[m
[31m-        sw_quoted,[m
[31m-        sw_quoted_second[m
[31m-    } state, quoted_state;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    decoded = '\0';[m
[31m-    quoted_state = sw_usual;[m
[31m-#endif[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-    p = r->uri_start;[m
[31m-    u = r->uri.data;[m
[31m-    r->uri_ext = NULL;[m
[31m-    r->args_start = NULL;[m
[31m-[m
[31m-    ch = *p++;[m
[31m-[m
[31m-    while (p <= r->uri_end) {[m
[31m-[m
[31m-        /*[m
[31m-         * we use "ch = *p++" inside the cycle, but this operation is safe,[m
[31m-         * because after the URI there is always at least one character:[m
[31m-         * the line feed[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "s:%d in:'%Xd:%c'", state, ch, ch);[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case sw_usual:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                *u++ = ch;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                if (u - 2 >= r->uri.data[m
[31m-                    && *(u - 1) == '.' && *(u - 2) != '.')[m
[31m-                {[m
[31m-                    u--;[m
[31m-                }[m
[31m-[m
[31m-                r->uri_ext = NULL;[m
[31m-[m
[31m-                if (p == r->uri_start + r->uri.len) {[m
[31m-[m
[31m-                    /*[m
[31m-                     * we omit the last "\" to cause redirect because[m
[31m-                     * the browsers do not treat "\" as "/" in relative URL path[m
[31m-                     */[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                state = sw_slash;[m
[31m-                *u++ = '/';[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '/':[m
[31m-#if (NGX_WIN32)[m
[31m-                if (u - 2 >= r->uri.data[m
[31m-                    && *(u - 1) == '.' && *(u - 2) != '.')[m
[31m-                {[m
[31m-                    u--;[m
[31m-                }[m
[31m-#endif[m
[31m-                r->uri_ext = NULL;[m
[31m-                state = sw_slash;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                quoted_state = state;[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p;[m
[31m-                goto args;[m
[31m-            case '#':[m
[31m-                goto done;[m
[31m-            case '.':[m
[31m-                r->uri_ext = u + 1;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                /* fall through */[m
[31m-            default:[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ch = *p++;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_slash:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '/':[m
[31m-                if (!merge_slashes) {[m
[31m-                    *u++ = ch;[m
[31m-                }[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                state = sw_dot;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                quoted_state = state;[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p;[m
[31m-                goto args;[m
[31m-            case '#':[m
[31m-                goto done;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-            default:[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ch = *p++;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_dot:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-#endif[m
[31m-            case '/':[m
[31m-                state = sw_slash;[m
[31m-                u--;[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                state = sw_dot_dot;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                quoted_state = state;[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p;[m
[31m-                goto args;[m
[31m-            case '#':[m
[31m-                goto done;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-            default:[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ch = *p++;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_dot_dot:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-#endif[m
[31m-            case '/':[m
[31m-                state = sw_slash;[m
[31m-                u -= 5;[m
[31m-                for ( ;; ) {[m
[31m-                    if (u < r->uri.data) {[m
[31m-                        return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-                    }[m
[31m-                    if (*u == '/') {[m
[31m-                        u++;[m
[31m-                        break;[m
[31m-                    }[m
[31m-                    u--;[m
[31m-                }[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                quoted_state = state;[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p;[m
[31m-                goto args;[m
[31m-            case '#':[m
[31m-                goto done;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-            default:[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ch = *p++;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted:[m
[31m-            r->quoted_uri = 1;[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                decoded = (u_char) (ch - '0');[m
[31m-                state = sw_quoted_second;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                decoded = (u_char) (c - 'a' + 10);[m
[31m-                state = sw_quoted_second;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-[m
[31m-        case sw_quoted_second:[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ch = (u_char) ((decoded << 4) + ch - '0');[m
[31m-[m
[31m-                if (ch == '%' || ch == '#') {[m
[31m-                    state = sw_usual;[m
[31m-                    *u++ = ch;[m
[31m-                    ch = *p++;[m
[31m-                    break;[m
[31m-[m
[31m-                } else if (ch == '\0') {[m
[31m-                    return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-                }[m
[31m-[m
[31m-                state = quoted_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ch = (u_char) ((decoded << 4) + c - 'a' + 10);[m
[31m-[m
[31m-                if (ch == '?') {[m
[31m-                    state = sw_usual;[m
[31m-                    *u++ = ch;[m
[31m-                    ch = *p++;[m
[31m-                    break;[m
[31m-[m
[31m-                } else if (ch == '+') {[m
[31m-                    r->plus_in_uri = 1;[m
[31m-                }[m
[31m-[m
[31m-                state = quoted_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    r->uri.len = u - r->uri.data;[m
[31m-[m
[31m-    if (r->uri_ext) {[m
[31m-        r->exten.len = u - r->uri_ext;[m
[31m-        r->exten.data = r->uri_ext;[m
[31m-    }[m
[31m-[m
[31m-    r->uri_ext = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-args:[m
[31m-[m
[31m-    while (p < r->uri_end) {[m
[31m-        if (*p++ != '#') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        r->args.len = p - 1 - r->args_start;[m
[31m-        r->args.data = r->args_start;[m
[31m-        r->args_start = NULL;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    r->uri.len = u - r->uri.data;[m
[31m-[m
[31m-    if (r->uri_ext) {[m
[31m-        r->exten.len = u - r->uri_ext;[m
[31m-        r->exten.data = r->uri_ext;[m
[31m-    }[m
[31m-[m
[31m-    r->uri_ext = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_status_t *status)[m
[31m-{[m
[31m-    u_char   ch;[m
[31m-    u_char  *p;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_H,[m
[31m-        sw_HT,[m
[31m-        sw_HTT,[m
[31m-        sw_HTTP,[m
[31m-        sw_first_major_digit,[m
[31m-        sw_major_digit,[m
[31m-        sw_first_minor_digit,[m
[31m-        sw_minor_digit,[m
[31m-        sw_status,[m
[31m-        sw_space_after_status,[m
[31m-        sw_status_text,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = r->state;[m
[31m-[m
[31m-    for (p = b->pos; p < b->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* "HTTP/" */[m
[31m-        case sw_start:[m
[31m-            switch (ch) {[m
[31m-            case 'H':[m
[31m-                state = sw_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_H:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_HT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HT:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_HTT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HTT:[m
[31m-            switch (ch) {[m
[31m-            case 'P':[m
[31m-                state = sw_HTTP;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HTTP:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_first_major_digit;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* the first digit of major HTTP version */[m
[31m-        case sw_first_major_digit:[m
[31m-            if (ch < '1' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->http_major = ch - '0';[m
[31m-            state = sw_major_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* the major HTTP version or dot */[m
[31m-        case sw_major_digit:[m
[31m-            if (ch == '.') {[m
[31m-                state = sw_first_minor_digit;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->http_major = r->http_major * 10 + ch - '0';[m
[31m-            break;[m
[31m-[m
[31m-        /* the first digit of minor HTTP version */[m
[31m-        case sw_first_minor_digit:[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->http_minor = ch - '0';[m
[31m-            state = sw_minor_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* the minor HTTP version or the end of the request line */[m
[31m-        case sw_minor_digit:[m
[31m-            if (ch == ' ') {[m
[31m-                state = sw_status;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->http_minor = r->http_minor * 10 + ch - '0';[m
[31m-            break;[m
[31m-[m
[31m-        /* HTTP status code */[m
[31m-        case sw_status:[m
[31m-            if (ch == ' ') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            status->code = status->code * 10 + ch - '0';[m
[31m-[m
[31m-            if (++status->count == 3) {[m
[31m-                state = sw_space_after_status;[m
[31m-                status->start = p - 2;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* space or end of line */[m
[31m-        case sw_space_after_status:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                state = sw_status_text;[m
[31m-                break;[m
[31m-            case '.':                    /* IIS may send 403.1, 403.2, etc */[m
[31m-                state = sw_status_text;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* any text until end of line */[m
[31m-        case sw_status_text:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of status line */[m
[31m-        case sw_almost_done:[m
[31m-            status->end = p - 1;[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = p;[m
[31m-    r->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-[m
[31m-    if (status->end == NULL) {[m
[31m-        status->end = p;[m
[31m-    }[m
[31m-[m
[31m-    status->http_version = r->http_major * 1000 + r->http_minor;[m
[31m-    r->state = sw_start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_unsafe_uri(ngx_http_request_t *r, ngx_str_t *uri,[m
[31m-    ngx_str_t *args, ngx_uint_t *flags)[m
[31m-{[m
[31m-    u_char      ch, *p, *src, *dst;[m
[31m-    size_t      len;[m
[31m-    ngx_uint_t  quoted;[m
[31m-[m
[31m-    len = uri->len;[m
[31m-    p = uri->data;[m
[31m-    quoted = 0;[m
[31m-[m
[31m-    if (len == 0 || p[0] == '?') {[m
[31m-        goto unsafe;[m
[31m-    }[m
[31m-[m
[31m-    if (p[0] == '.' && len > 1 && p[1] == '.'[m
[31m-        && (len == 2 || ngx_path_separator(p[2])))[m
[31m-    {[m
[31m-        goto unsafe;[m
[31m-    }[m
[31m-[m
[31m-    for ( /* void */ ; len; len--) {[m
[31m-[m
[31m-        ch = *p++;[m
[31m-[m
[31m-        if (ch == '%') {[m
[31m-            quoted = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ch == '?') {[m
[31m-            args->len = len - 1;[m
[31m-            args->data = p;[m
[31m-            uri->len -= len;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ch == '\0') {[m
[31m-            goto unsafe;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_path_separator(ch) && len > 2) {[m
[31m-[m
[31m-            /* detect "/../" and "/.." */[m
[31m-[m
[31m-            if (p[0] == '.' && p[1] == '.'[m
[31m-                && (len == 3 || ngx_path_separator(p[2])))[m
[31m-            {[m
[31m-                goto unsafe;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (quoted) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "escaped URI: \"%V\"", uri);[m
[31m-[m
[31m-        src = uri->data;[m
[31m-[m
[31m-        dst = ngx_pnalloc(r->pool, uri->len);[m
[31m-        if (dst == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        uri->data = dst;[m
[31m-[m
[31m-        ngx_unescape_uri(&dst, &src, uri->len, 0);[m
[31m-[m
[31m-        uri->len = dst - uri->data;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "unescaped URI: \"%V\"", uri);[m
[31m-[m
[31m-        len = uri->len;[m
[31m-        p = uri->data;[m
[31m-[m
[31m-        if (p[0] == '.' && len > 1 && p[1] == '.'[m
[31m-            && (len == 2 || ngx_path_separator(p[2])))[m
[31m-        {[m
[31m-            goto unsafe;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; len; len--) {[m
[31m-[m
[31m-            ch = *p++;[m
[31m-[m
[31m-            if (ch == '\0') {[m
[31m-                goto unsafe;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_path_separator(ch) && len > 2) {[m
[31m-[m
[31m-                /* detect "/../" and "/.." */[m
[31m-[m
[31m-                if (p[0] == '.' && p[1] == '.'[m
[31m-                    && (len == 3 || ngx_path_separator(p[2])))[m
[31m-                {[m
[31m-                    goto unsafe;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-unsafe:[m
[31m-[m
[31m-    if (*flags & NGX_HTTP_LOG_UNSAFE) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unsafe URI \"%V\" was detected", uri);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_multi_header_lines(ngx_array_t *headers, ngx_str_t *name,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    u_char            *start, *last, *end, ch;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    h = headers->elts;[m
[31m-[m
[31m-    for (i = 0; i < headers->nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, headers->pool->log, 0,[m
[31m-                       "parse header: \"%V: %V\"", &h[i]->key, &h[i]->value);[m
[31m-[m
[31m-        if (name->len > h[i]->value.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        start = h[i]->value.data;[m
[31m-        end = h[i]->value.data + h[i]->value.len;[m
[31m-[m
[31m-        while (start < end) {[m
[31m-[m
[31m-            if (ngx_strncasecmp(start, name->data, name->len) != 0) {[m
[31m-                goto skip;[m
[31m-            }[m
[31m-[m
[31m-            for (start += name->len; start < end && *start == ' '; start++) {[m
[31m-                /* void */[m
[31m-            }[m
[31m-[m
[31m-            if (value == NULL) {[m
[31m-                if (start == end || *start == ',') {[m
[31m-                    return i;[m
[31m-                }[m
[31m-[m
[31m-                goto skip;[m
[31m-            }[m
[31m-[m
[31m-            if (start == end || *start++ != '=') {[m
[31m-                /* the invalid header value */[m
[31m-                goto skip;[m
[31m-            }[m
[31m-[m
[31m-            while (start < end && *start == ' ') { start++; }[m
[31m-[m
[31m-            for (last = start; last < end && *last != ';'; last++) {[m
[31m-                /* void */[m
[31m-            }[m
[31m-[m
[31m-            value->len = last - start;[m
[31m-            value->data = start;[m
[31m-[m
[31m-            return i;[m
[31m-[m
[31m-        skip:[m
[31m-[m
[31m-            while (start < end) {[m
[31m-                ch = *start++;[m
[31m-                if (ch == ';' || ch == ',') {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            while (start < end && *start == ' ') { start++; }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_set_cookie_lines(ngx_array_t *headers, ngx_str_t *name,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    u_char            *start, *last, *end;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    h = headers->elts;[m
[31m-[m
[31m-    for (i = 0; i < headers->nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, headers->pool->log, 0,[m
[31m-                       "parse header: \"%V: %V\"", &h[i]->key, &h[i]->value);[m
[31m-[m
[31m-        if (name->len >= h[i]->value.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        start = h[i]->value.data;[m
[31m-        end = h[i]->value.data + h[i]->value.len;[m
[31m-[m
[31m-        if (ngx_strncasecmp(start, name->data, name->len) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for (start += name->len; start < end && *start == ' '; start++) {[m
[31m-            /* void */[m
[31m-        }[m
[31m-[m
[31m-        if (start == end || *start++ != '=') {[m
[31m-            /* the invalid header value */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        while (start < end && *start == ' ') { start++; }[m
[31m-[m
[31m-        for (last = start; last < end && *last != ';'; last++) {[m
[31m-            /* void */[m
[31m-        }[m
[31m-[m
[31m-        value->len = last - start;[m
[31m-        value->data = start;[m
[31m-[m
[31m-        return i;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_arg(ngx_http_request_t *r, u_char *name, size_t len, ngx_str_t *value)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    if (r->args.len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    p = r->args.data;[m
[31m-    last = p + r->args.len;[m
[31m-[m
[31m-    for ( /* void */ ; p < last; p++) {[m
[31m-[m
[31m-        /* we need '=' after name, so drop one char from last */[m
[31m-[m
[31m-        p = ngx_strlcasestrn(p, last - 1, name, len - 1);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if ((p == r->args.data || *(p - 1) == '&') && *(p + len) == '=') {[m
[31m-[m
[31m-            value->data = p + len + 1;[m
[31m-[m
[31m-            p = ngx_strlchr(p, last, '&');[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                p = r->args.data + r->args.len;[m
[31m-            }[m
[31m-[m
[31m-            value->len = p - value->data;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_split_args(ngx_http_request_t *r, ngx_str_t *uri, ngx_str_t *args)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    last = uri->data + uri->len;[m
[31m-[m
[31m-    p = ngx_strlchr(uri->data, last, '?');[m
[31m-[m
[31m-    if (p) {[m
[31m-        uri->len = p - uri->data;[m
[31m-        p++;[m
[31m-        args->len = last - p;[m
[31m-        args->data = p;[m
[31m-[m
[31m-    } else {[m
[31m-        args->len = 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_chunked(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_chunked_t *ctx)[m
[31m-{[m
[31m-    u_char     *pos, ch, c;[m
[31m-    ngx_int_t   rc;[m
[31m-    enum {[m
[31m-        sw_chunk_start = 0,[m
[31m-        sw_chunk_size,[m
[31m-        sw_chunk_extension,[m
[31m-        sw_chunk_extension_almost_done,[m
[31m-        sw_chunk_data,[m
[31m-        sw_after_data,[m
[31m-        sw_after_data_almost_done,[m
[31m-        sw_last_chunk_extension,[m
[31m-        sw_last_chunk_extension_almost_done,[m
[31m-        sw_trailer,[m
[31m-        sw_trailer_almost_done,[m
[31m-        sw_trailer_header,[m
[31m-        sw_trailer_header_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-[m
[31m-    if (state == sw_chunk_data && ctx->size == 0) {[m
[31m-        state = sw_after_data;[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for (pos = b->pos; pos < b->last; pos++) {[m
[31m-[m
[31m-        ch = *pos;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http chunked byte: %02Xd s:%d", ch, state);[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case sw_chunk_start:[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                state = sw_chunk_size;[m
[31m-                ctx->size = ch - '0';[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                state = sw_chunk_size;[m
[31m-                ctx->size = c - 'a' + 10;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_chunk_size:[m
[31m-            if (ctx->size > NGX_MAX_OFF_T_VALUE / 16) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ctx->size = ctx->size * 16 + (ch - '0');[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ctx->size = ctx->size * 16 + (c - 'a' + 10);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->size == 0) {[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case CR:[m
[31m-                    state = sw_last_chunk_extension_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    state = sw_trailer;[m
[31m-                    break;[m
[31m-                case ';':[m
[31m-                case ' ':[m
[31m-                case '\t':[m
[31m-                    state = sw_last_chunk_extension;[m
[31m-                    break;[m
[31m-                default:[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_chunk_extension_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_chunk_data;[m
[31m-                break;[m
[31m-            case ';':[m
[31m-            case ' ':[m
[31m-            case '\t':[m
[31m-                state = sw_chunk_extension;[m
[31m-                break;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_chunk_extension:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_chunk_extension_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_chunk_data;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_chunk_extension_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                state = sw_chunk_data;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_chunk_data:[m
[31m-            rc = NGX_OK;[m
[31m-            goto data;[m
[31m-[m
[31m-        case sw_after_data:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_after_data_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_chunk_start;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_after_data_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                state = sw_chunk_start;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_last_chunk_extension:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_last_chunk_extension_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_trailer;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_last_chunk_extension_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                state = sw_trailer;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_trailer:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_trailer_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                state = sw_trailer_header;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_trailer_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_trailer_header:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_trailer_header_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_trailer;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_trailer_header_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                state = sw_trailer;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-data:[m
[31m-[m
[31m-    ctx->state = state;[m
[31m-    b->pos = pos;[m
[31m-[m
[31m-    if (ctx->size > NGX_MAX_OFF_T_VALUE - 5) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    switch (state) {[m
[31m-[m
[31m-    case sw_chunk_start:[m
[31m-        ctx->length = 3 /* "0" LF LF */;[m
[31m-        break;[m
[31m-    case sw_chunk_size:[m
[31m-        ctx->length = 1 /* LF */[m
[31m-                      + (ctx->size ? ctx->size + 4 /* LF "0" LF LF */[m
[31m-                                   : 1 /* LF */);[m
[31m-        break;[m
[31m-    case sw_chunk_extension:[m
[31m-    case sw_chunk_extension_almost_done:[m
[31m-        ctx->length = 1 /* LF */ + ctx->size + 4 /* LF "0" LF LF */;[m
[31m-        break;[m
[31m-    case sw_chunk_data:[m
[31m-        ctx->length = ctx->size + 4 /* LF "0" LF LF */;[m
[31m-        break;[m
[31m-    case sw_after_data:[m
[31m-    case sw_after_data_almost_done:[m
[31m-        ctx->length = 4 /* LF "0" LF LF */;[m
[31m-        break;[m
[31m-    case sw_last_chunk_extension:[m
[31m-    case sw_last_chunk_extension_almost_done:[m
[31m-        ctx->length = 2 /* LF LF */;[m
[31m-        break;[m
[31m-    case sw_trailer:[m
[31m-    case sw_trailer_almost_done:[m
[31m-        ctx->length = 1 /* LF */;[m
[31m-        break;[m
[31m-    case sw_trailer_header:[m
[31m-    case sw_trailer_header_almost_done:[m
[31m-        ctx->length = 2 /* LF LF */;[m
[31m-        break;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ctx->state = 0;[m
[31m-    b->pos = pos + 1;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_postpone_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_postpone_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex e893b83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_postpone_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,176 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_postpone_filter_add(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_postpone_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_postpone_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_postpone_filter_init,         /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_postpone_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_postpone_filter_module_ctx,  /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_postpone_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_postponed_request_t  *pr;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http postpone filter \"%V?%V\" %p", &r->uri, &r->args, in);[m
[31m-[m
[31m-    if (r != c->data) {[m
[31m-[m
[31m-        if (in) {[m
[31m-            ngx_http_postpone_filter_add(r, in);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        /* TODO: SSI may pass NULL */[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "http postpone filter NULL inactive request");[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->postponed == NULL) {[m
[31m-[m
[31m-        if (in || c->buffered) {[m
[31m-            return ngx_http_next_body_filter(r->main, in);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (in) {[m
[31m-        ngx_http_postpone_filter_add(r, in);[m
[31m-    }[m
[31m-[m
[31m-    do {[m
[31m-        pr = r->postponed;[m
[31m-[m
[31m-        if (pr->request) {[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http postpone filter wake \"%V?%V\"",[m
[31m-                           &pr->request->uri, &pr->request->args);[m
[31m-[m
[31m-            r->postponed = pr->next;[m
[31m-[m
[31m-            c->data = pr->request;[m
[31m-[m
[31m-            return ngx_http_post_request(pr->request, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (pr->out == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "http postpone filter NULL output");[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http postpone filter output \"%V?%V\"",[m
[31m-                           &r->uri, &r->args);[m
[31m-[m
[31m-            if (ngx_http_next_body_filter(r->main, pr->out) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        r->postponed = pr->next;[m
[31m-[m
[31m-    } while (r->postponed);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_postpone_filter_add(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_postponed_request_t  *pr, **ppr;[m
[31m-[m
[31m-    if (r->postponed) {[m
[31m-        for (pr = r->postponed; pr->next; pr = pr->next) { /* void */ }[m
[31m-[m
[31m-        if (pr->request == NULL) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        ppr = &pr->next;[m
[31m-[m
[31m-    } else {[m
[31m-        ppr = &r->postponed;[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ppr = pr;[m
[31m-[m
[31m-    pr->request = NULL;[m
[31m-    pr->out = NULL;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (ngx_chain_add_copy(r->pool, &pr->out, in) == NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_postpone_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_postpone_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_probe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_probe.h[m
[1mdeleted file mode 100644[m
[1mindex d7d2d45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_probe.h[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-#ifndef _NGX_HTTP_PROBE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_PROBE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-[m
[31m-#include <ngx_dtrace_provider.h>[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_cycle(pr, uri, args)                       \[m
[31m-    NGINX_HTTP_SUBREQUEST_CYCLE(pr, uri, args)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_start(r)                                   \[m
[31m-    NGINX_HTTP_SUBREQUEST_START(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_finalize_writing(r)                        \[m
[31m-    NGINX_HTTP_SUBREQUEST_FINALIZE_WRITING(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_finalize_nonactive(r)                      \[m
[31m-    NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_finalize_nonactive(r)                      \[m
[31m-    NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_wake_parent(r)                             \[m
[31m-    NGINX_HTTP_SUBREQUEST_WAKE_PARENT(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_done(r)                                    \[m
[31m-    NGINX_HTTP_SUBREQUEST_DONE(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_post_start(r, rc)                          \[m
[31m-    NGINX_HTTP_SUBREQUEST_POST_START(r, rc)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_post_done(r, rc)                           \[m
[31m-    NGINX_HTTP_SUBREQUEST_POST_DONE(r, rc)[m
[31m-[m
[31m-#define ngx_http_probe_module_post_config(m)                                 \[m
[31m-    NGINX_HTTP_MODULE_POST_CONFIG(m)[m
[31m-[m
[31m-#define ngx_http_probe_read_body_abort(r, reason)                            \[m
[31m-    NGINX_HTTP_READ_BODY_ABORT(r, reason)[m
[31m-[m
[31m-#define ngx_http_probe_read_body_done(r)                                     \[m
[31m-    NGINX_HTTP_READ_BODY_DONE(r)[m
[31m-[m
[31m-#define ngx_http_probe_read_req_line_done(r)                                 \[m
[31m-    NGINX_HTTP_READ_REQ_LINE_DONE(r)[m
[31m-[m
[31m-#define ngx_http_probe_read_req_header_done(r, h)                               \[m
[31m-    NGINX_HTTP_READ_REQ_HEADER_DONE(r, h)[m
[31m-[m
[31m-#else /* !(NGX_DTRACE) */[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_cycle(pr, uri, args)[m
[31m-#define ngx_http_probe_subrequest_start(r)[m
[31m-#define ngx_http_probe_subrequest_finalize_writing(r)[m
[31m-#define ngx_http_probe_subrequest_finalize_nonactive(r)[m
[31m-#define ngx_http_probe_subrequest_wake_parent(r)[m
[31m-#define ngx_http_probe_subrequest_done(r)[m
[31m-#define ngx_http_probe_subrequest_post_start(r, rc)[m
[31m-#define ngx_http_probe_subrequest_post_done(r, rc)[m
[31m-#define ngx_http_probe_module_post_config(m)[m
[31m-#define ngx_http_probe_read_body_abort(r, reason)[m
[31m-#define ngx_http_probe_read_body_done(r)[m
[31m-#define ngx_http_probe_read_req_line_done(r)[m
[31m-#define ngx_http_probe_read_req_header_done(r, h)[m
[31m-[m
[31m-#endif /* NGX_DTRACE */[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_PROBE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.c[m
[1mdeleted file mode 100644[m
[1mindex 88c8298..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.c[m
[1m+++ /dev/null[m
[36m@@ -1,3666 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_wait_request_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_process_request_line(ngx_event_t *rev);[m
[31m-static void ngx_http_process_request_headers(ngx_event_t *rev);[m
[31m-static ssize_t ngx_http_read_request_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,[m
[31m-    ngx_uint_t request_line);[m
[31m-[m
[31m-static ngx_int_t ngx_http_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_unique_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_host(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_connection(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_user_agent(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-static ngx_int_t ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool,[m
[31m-    ngx_uint_t alloc);[m
[31m-static ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r,[m
[31m-    ngx_str_t *host);[m
[31m-static ngx_int_t ngx_http_find_virtual_server(ngx_connection_t *c,[m
[31m-    ngx_http_virtual_names_t *virtual_names, ngx_str_t *host,[m
[31m-    ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp);[m
[31m-[m
[31m-static void ngx_http_request_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-static void ngx_http_terminate_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_finalize_connection(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_set_write_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_writer(ngx_http_request_t *r);[m
[31m-static void ngx_http_request_finalizer(ngx_http_request_t *r);[m
[31m-[m
[31m-static void ngx_http_set_keepalive(ngx_http_request_t *r);[m
[31m-static void ngx_http_keepalive_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_set_lingering_close(ngx_http_request_t *r);[m
[31m-static void ngx_http_lingering_close_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_http_post_action(ngx_http_request_t *r);[m
[31m-static void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error);[m
[31m-static void ngx_http_log_request(ngx_http_request_t *r);[m
[31m-[m
[31m-static u_char *ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-static u_char *ngx_http_log_error_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_request_t *sr, u_char *buf, size_t len);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static void ngx_http_ssl_handshake(ngx_event_t *rev);[m
[31m-static void ngx_http_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_client_errors[] = {[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_METHOD */[m
[31m-    "client sent invalid method",[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_REQUEST */[m
[31m-    "client sent invalid request",[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_09_METHOD */[m
[31m-    "client sent invalid method in HTTP/0.9 request"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_header_t  ngx_http_headers_in[] = {[m
[31m-    { ngx_string("Host"), offsetof(ngx_http_headers_in_t, host),[m
[31m-                 ngx_http_process_host },[m
[31m-[m
[31m-    { ngx_string("Connection"), offsetof(ngx_http_headers_in_t, connection),[m
[31m-                 ngx_http_process_connection },[m
[31m-[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_modified_since),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Unmodified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_unmodified_since),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_match),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-None-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_none_match),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("User-Agent"), offsetof(ngx_http_headers_in_t, user_agent),[m
[31m-                 ngx_http_process_user_agent },[m
[31m-[m
[31m-    { ngx_string("Referer"), offsetof(ngx_http_headers_in_t, referer),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_length),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_type),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Range"), offsetof(ngx_http_headers_in_t, range),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_range),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, transfer_encoding),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Expect"),[m
[31m-                 offsetof(ngx_http_headers_in_t, expect),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Upgrade"),[m
[31m-                 offsetof(ngx_http_headers_in_t, upgrade),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Accept-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_encoding),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Via"), offsetof(ngx_http_headers_in_t, via),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Authorization"),[m
[31m-                 offsetof(ngx_http_headers_in_t, authorization),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"), offsetof(ngx_http_headers_in_t, keep_alive),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("X-Forwarded-For"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_forwarded_for),[m
[31m-                 ngx_http_process_multi_header_lines },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    { ngx_string("X-Real-IP"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_real_ip),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_HEADERS)[m
[31m-    { ngx_string("Accept"), offsetof(ngx_http_headers_in_t, accept),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Accept-Language"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_language),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    { ngx_string("Depth"), offsetof(ngx_http_headers_in_t, depth),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Overwrite"), offsetof(ngx_http_headers_in_t, overwrite),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Cookie"), offsetof(ngx_http_headers_in_t, cookies),[m
[31m-                 ngx_http_process_multi_header_lines },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_init_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_uint_t              i;[m
[31m-    ngx_event_t            *rev;[m
[31m-    struct sockaddr_in     *sin;[m
[31m-    ngx_http_port_t        *port;[m
[31m-    ngx_http_in_addr_t     *addr;[m
[31m-    ngx_http_log_ctx_t     *ctx;[m
[31m-    ngx_http_connection_t  *hc;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6    *sin6;[m
[31m-    ngx_http_in6_addr_t    *addr6;[m
[31m-#endif[m
[31m-[m
[31m-    hc = ngx_pcalloc(c->pool, sizeof(ngx_http_connection_t));[m
[31m-    if (hc == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->data = hc;[m
[31m-[m
[31m-    /* find the server configuration for the address:port */[m
[31m-[m
[31m-    port = c->listening->servers;[m
[31m-[m
[31m-    if (port->naddrs > 1) {[m
[31m-[m
[31m-        /*[m
[31m-         * there are several addresses on this port and one of them[m
[31m-         * is an "*:port" wildcard so getsockname() in ngx_http_server_addr()[m
[31m-         * is required to determine a server address[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-[m
[31m-            addr6 = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hc->addr_conf = &addr6[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-[m
[31m-            addr = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (addr[i].addr == sin->sin_addr.s_addr) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hc->addr_conf = &addr[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            addr6 = port->addrs;[m
[31m-            hc->addr_conf = &addr6[0].conf;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            addr = port->addrs;[m
[31m-            hc->addr_conf = &addr[0].conf;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the default server configuration for the address:port */[m
[31m-    hc->conf_ctx = hc->addr_conf->default_server->ctx;[m
[31m-[m
[31m-    ctx = ngx_palloc(c->pool, sizeof(ngx_http_log_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->connection = c;[m
[31m-    ctx->request = NULL;[m
[31m-    ctx->current_request = NULL;[m
[31m-[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->handler = ngx_http_log_error;[m
[31m-    c->log->data = ctx;[m
[31m-    c->log->action = "waiting for request";[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    rev->handler = ngx_http_wait_request_handler;[m
[31m-    c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (hc->addr_conf->http2) {[m
[31m-        rev->handler = ngx_http_v2_init;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    {[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-    if (sscf->enable || hc->addr_conf->ssl) {[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (hc->addr_conf->ssl && sscf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined "[m
[31m-                          "in server listening on SSL port");[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        hc->ssl = 1;[m
[31m-[m
[31m-        rev->handler = ngx_http_ssl_handshake;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (hc->addr_conf->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 1;[m
[31m-        c->log->action = "reading PROXY protocol";[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        /* the deferred accept(), iocp */[m
[31m-[m
[31m-        if (ngx_use_accept_mutex) {[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rev->handler(rev);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_wait_request_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http wait request handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    hc = c->data;[m
[31m-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    size = cscf->client_header_buffer_size;[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        b = ngx_create_temp_buf(c->pool, size);[m
[31m-        if (b == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->buffer = b;[m
[31m-[m
[31m-    } else if (b->start == NULL) {[m
[31m-[m
[31m-        b->start = ngx_palloc(c->pool, size);[m
[31m-        if (b->start == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-        b->end = b->last + size;[m
[31m-    }[m
[31m-[m
[31m-    n = c->recv(c, b->last, size);[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!rev->timer_set) {[m
[31m-            ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-            ngx_reusable_connection(c, 1);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * We are trying to not hold c->buffer's memory for an idle connection.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-            b->start = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client closed connection");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    if (hc->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 0;[m
[31m-[m
[31m-        p = ngx_proxy_protocol_read(c, b->pos, b->last);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = p;[m
[31m-[m
[31m-        if (b->pos == b->last) {[m
[31m-            c->log->action = "waiting for request";[m
[31m-            b->pos = b->start;[m
[31m-            b->last = b->start;[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "reading client request line";[m
[31m-[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    c->data = ngx_http_create_request(c);[m
[31m-    if (c->data == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rev->handler = ngx_http_process_request_line;[m
[31m-    ngx_http_process_request_line(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *[m
[31m-ngx_http_create_request(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t                 *pool;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_log_ctx_t         *ctx;[m
[31m-    ngx_http_connection_t      *hc;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    c->requests++;[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    pool = ngx_create_pool(cscf->request_pool_size, c->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_pcalloc(pool, sizeof(ngx_http_request_t));[m
[31m-    if (r == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->pool = pool;[m
[31m-[m
[31m-    r->http_connection = hc;[m
[31m-    r->signature = NGX_HTTP_MODULE;[m
[31m-    r->connection = c;[m
[31m-[m
[31m-    r->main_conf = hc->conf_ctx->main_conf;[m
[31m-    r->srv_conf = hc->conf_ctx->srv_conf;[m
[31m-    r->loc_conf = hc->conf_ctx->loc_conf;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-    r->header_in = hc->nbusy ? hc->busy[0] : c->buffer;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (r->ctx == NULL) {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    r->variables = ngx_pcalloc(r->pool, cmcf->variables.nelts[m
[31m-                                        * sizeof(ngx_http_variable_value_t));[m
[31m-    if (r->variables == NULL) {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        r->main_filter_need_in_memory = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->main = r;[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    r->start_sec = tp->sec;[m
[31m-    r->start_msec = tp->msec;[m
[31m-[m
[31m-    r->method = NGX_HTTP_UNKNOWN;[m
[31m-    r->http_version = NGX_HTTP_VERSION_10;[m
[31m-[m
[31m-    r->headers_in.content_length_n = -1;[m
[31m-    r->headers_in.keep_alive_n = -1;[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-    r->headers_out.last_modified_time = -1;[m
[31m-[m
[31m-    r->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    r->subrequests = NGX_HTTP_MAX_SUBREQUESTS + 1;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_READING_REQUEST_STATE;[m
[31m-[m
[31m-    ctx = c->log->data;[m
[31m-    ctx->request = r;[m
[31m-    ctx->current_request = r;[m
[31m-    r->log_handler = ngx_http_log_error_handler;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_reading, 1);[m
[31m-    r->stat_reading = 1;[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_requests, 1);[m
[31m-#endif[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssl_handshake(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                   *p, buf[NGX_PROXY_PROTOCOL_MAX_HEADER + 1];[m
[31m-    size_t                    size;[m
[31m-    ssize_t                   n;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_connection_t         *c;[m
[31m-    ngx_http_connection_t    *hc;[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http check ssl handshake");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    size = hc->proxy_protocol ? sizeof(buf) : 1;[m
[31m-[m
[31m-    n = recv(c->fd, (char *) buf, size, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http recv(): %z", n);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            rev->ready = 0;[m
[31m-[m
[31m-            if (!rev->timer_set) {[m
[31m-                ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-                ngx_reusable_connection(c, 1);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_http_close_connection(c);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_connection_error(c, err, "recv() failed");[m
[31m-        ngx_http_close_connection(c);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (hc->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 0;[m
[31m-[m
[31m-        p = ngx_proxy_protocol_read(c, buf, buf + n);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        size = p - buf;[m
[31m-[m
[31m-        if (c->recv(c, buf, size) != (ssize_t) size) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (n == (ssize_t) size) {[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        n = 1;[m
[31m-        buf[0] = *p;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        if (buf[0] & 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                           "https ssl handshake: 0x%02Xd", buf[0]);[m
[31m-[m
[31m-            sscf = ngx_http_get_module_srv_conf(hc->conf_ctx,[m
[31m-                                                ngx_http_ssl_module);[m
[31m-[m
[31m-            if (ngx_ssl_create_connection(&sscf->ssl, c, NGX_SSL_BUFFER)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                if (!rev->timer_set) {[m
[31m-                    ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-                }[m
[31m-[m
[31m-                ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-                c->ssl->handler = ngx_http_ssl_handshake_handler;[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_ssl_handshake_handler(c);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "plain http");[m
[31m-[m
[31m-        c->log->action = "waiting for request";[m
[31m-[m
[31m-        rev->handler = ngx_http_wait_request_handler;[m
[31m-        ngx_http_wait_request_handler(rev);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, "client closed connection");[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        /*[m
[31m-         * The majority of browsers do not send the "close notify" alert.[m
[31m-         * Among them are MSIE, old Mozilla, Netscape 4, Konqueror,[m
[31m-         * and Links.  And what is more, MSIE ignores the server's alert.[m
[31m-         *[m
[31m-         * Opera and recent Mozilla send the alert.[m
[31m-         */[m
[31m-[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_V2                                                              \[m
[31m-     && (defined TLSEXT_TYPE_application_layer_protocol_negotiation           \[m
[31m-         || defined TLSEXT_TYPE_next_proto_neg))[m
[31m-        {[m
[31m-        unsigned int            len;[m
[31m-        const unsigned char    *data;[m
[31m-        ngx_http_connection_t  *hc;[m
[31m-[m
[31m-        hc = c->data;[m
[31m-[m
[31m-        if (hc->addr_conf->http2) {[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-            SSL_get0_alpn_selected(c->ssl->connection, &data, &len);[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-            if (len == 0) {[m
[31m-                SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#else /* TLSEXT_TYPE_next_proto_neg */[m
[31m-            SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);[m
[31m-#endif[m
[31m-[m
[31m-            if (len == 2 && data[0] == 'h' && data[1] == '2') {[m
[31m-                ngx_http_v2_init(c->read);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c->log->action = "waiting for request";[m
[31m-[m
[31m-        c->read->handler = ngx_http_wait_request_handler;[m
[31m-        /* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-        ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-        ngx_http_wait_request_handler(c->read);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-int[m
[31m-ngx_http_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg)[m
[31m-{[m
[31m-    ngx_str_t                  host;[m
[31m-    const char                *servername;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_ssl_srv_conf_t   *sscf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    servername = SSL_get_servername(ssl_conn, TLSEXT_NAMETYPE_host_name);[m
[31m-[m
[31m-    if (servername == NULL) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    if (c->ssl->renegotiation) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "SSL server name: \"%s\"", servername);[m
[31m-[m
[31m-    host.len = ngx_strlen(servername);[m
[31m-[m
[31m-    if (host.len == 0) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) servername;[m
[31m-[m
[31m-    if (ngx_http_validate_host(&host, c->pool, 1) != NGX_OK) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    if (ngx_http_find_virtual_server(c, hc->addr_conf->virtual_names, &host,[m
[31m-                                     NULL, &cscf)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    hc->ssl_servername = ngx_palloc(c->pool, sizeof(ngx_str_t));[m
[31m-    if (hc->ssl_servername == NULL) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    *hc->ssl_servername = host;[m
[31m-[m
[31m-    hc->conf_ctx = cscf->ctx;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(c, clcf->error_log);[m
[31m-[m
[31m-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-    if (sscf->ssl.ctx) {[m
[31m-        SSL_set_SSL_CTX(ssl_conn, sscf->ssl.ctx);[m
[31m-[m
[31m-        /*[m
[31m-         * SSL_set_SSL_CTX() only changes certs as of 1.0.0d[m
[31m-         * adjust other things we care about[m
[31m-         */[m
[31m-[m
[31m-        SSL_set_verify(ssl_conn, SSL_CTX_get_verify_mode(sscf->ssl.ctx),[m
[31m-                       SSL_CTX_get_verify_callback(sscf->ssl.ctx));[m
[31m-[m
[31m-        SSL_set_verify_depth(ssl_conn, SSL_CTX_get_verify_depth(sscf->ssl.ctx));[m
[31m-[m
[31m-#ifdef SSL_CTRL_CLEAR_OPTIONS[m
[31m-        /* only in 0.9.8m+ */[m
[31m-        SSL_clear_options(ssl_conn, SSL_get_options(ssl_conn) &[m
[31m-                                    ~SSL_CTX_get_options(sscf->ssl.ctx));[m
[31m-#endif[m
[31m-[m
[31m-        SSL_set_options(ssl_conn, SSL_CTX_get_options(sscf->ssl.ctx));[m
[31m-    }[m
[31m-[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_process_request_line(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t              n;[m
[31m-    ngx_int_t            rc, rv;[m
[31m-    ngx_str_t            host;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http process request line");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            n = ngx_http_read_request_header(r);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_parse_request_line(r, r->header_in);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* the request line has been parsed successfully */[m
[31m-[m
[31m-            r->request_line.len = r->request_end - r->request_start;[m
[31m-            r->request_line.data = r->request_start;[m
[31m-            r->request_length = r->header_in->pos - r->request_start;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http request line: \"%V\"", &r->request_line);[m
[31m-[m
[31m-            r->method_name.len = r->method_end - r->request_start + 1;[m
[31m-            r->method_name.data = r->request_line.data;[m
[31m-[m
[31m-            if (r->http_protocol.data) {[m
[31m-                r->http_protocol.len = r->request_end - r->http_protocol.data;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_process_request_uri(r) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (r->host_start && r->host_end) {[m
[31m-[m
[31m-                host.len = r->host_end - r->host_start;[m
[31m-                host.data = r->host_start;[m
[31m-[m
[31m-                rc = ngx_http_validate_host(&host, r->pool, 0);[m
[31m-[m
[31m-                if (rc == NGX_DECLINED) {[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                  "client sent invalid host in request line");[m
[31m-                    ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                r->headers_in.server = host;[m
[31m-            }[m
[31m-[m
[31m-            if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-[m
[31m-                if (r->headers_in.server.len == 0[m
[31m-                    && ngx_http_set_virtual_server(r, &r->headers_in.server)[m
[31m-                       == NGX_ERROR)[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_process_request(r);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                              sizeof(ngx_table_elt_t))[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "reading client request headers";[m
[31m-[m
[31m-            rev->handler = ngx_http_process_request_headers;[m
[31m-            ngx_http_process_request_headers(rev);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_AGAIN) {[m
[31m-[m
[31m-            /* there was error while a request line parsing */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          ngx_http_client_errors[rc - NGX_HTTP_CLIENT_ERROR]);[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_AGAIN: a request line parsing is still incomplete */[m
[31m-[m
[31m-        if (r->header_in->pos == r->header_in->end) {[m
[31m-[m
[31m-            rv = ngx_http_alloc_large_header_buffer(r, 1);[m
[31m-[m
[31m-            if (rv == NGX_ERROR) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (rv == NGX_DECLINED) {[m
[31m-                r->request_line.len = r->header_in->end - r->request_start;[m
[31m-                r->request_line.data = r->request_start;[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client sent too long URI");[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_process_request_uri(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (r->args_start) {[m
[31m-        r->uri.len = r->args_start - 1 - r->uri_start;[m
[31m-    } else {[m
[31m-        r->uri.len = r->uri_end - r->uri_start;[m
[31m-    }[m
[31m-[m
[31m-    if (r->complex_uri || r->quoted_uri) {[m
[31m-[m
[31m-        r->uri.data = ngx_pnalloc(r->pool, r->uri.len + 1);[m
[31m-        if (r->uri.data == NULL) {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (ngx_http_parse_complex_uri(r, cscf->merge_slashes) != NGX_OK) {[m
[31m-            r->uri.len = 0;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid request");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->uri.data = r->uri_start;[m
[31m-    }[m
[31m-[m
[31m-    r->unparsed_uri.len = r->uri_end - r->uri_start;[m
[31m-    r->unparsed_uri.data = r->uri_start;[m
[31m-[m
[31m-    r->valid_unparsed_uri = r->space_in_uri ? 0 : 1;[m
[31m-[m
[31m-    if (r->uri_ext) {[m
[31m-        if (r->args_start) {[m
[31m-            r->exten.len = r->args_start - 1 - r->uri_ext;[m
[31m-        } else {[m
[31m-            r->exten.len = r->uri_end - r->uri_ext;[m
[31m-        }[m
[31m-[m
[31m-        r->exten.data = r->uri_ext;[m
[31m-    }[m
[31m-[m
[31m-    if (r->args_start && r->uri_end > r->args_start) {[m
[31m-        r->args.len = r->uri_end - r->args_start;[m
[31m-        r->args.data = r->args_start;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    {[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    p = r->uri.data;[m
[31m-    last = r->uri.data + r->uri.len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        if (*p++ == ':') {[m
[31m-[m
[31m-            /*[m
[31m-             * this check covers "::$data", "::$index_allocation" and[m
[31m-             * ":$i30:$index_allocation"[m
[31m-             */[m
[31m-[m
[31m-            if (p < last && *p == '$') {[m
[31m-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                              "client sent unsafe win32 URI");[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = r->uri.data + r->uri.len - 1;[m
[31m-[m
[31m-    while (p > r->uri.data) {[m
[31m-[m
[31m-        if (*p == ' ') {[m
[31m-            p--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == '.') {[m
[31m-            p--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (p != r->uri.data + r->uri.len - 1) {[m
[31m-        r->uri.len = p + 1 - r->uri.data;[m
[31m-        ngx_http_set_exten(r);[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http uri: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http args: \"%V\"", &r->args);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http exten: \"%V\"", &r->exten);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_process_request_headers(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ssize_t                     n;[m
[31m-    ngx_int_t                   rc, rv;[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http process request header line");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            if (r->header_in->pos == r->header_in->end) {[m
[31m-[m
[31m-                rv = ngx_http_alloc_large_header_buffer(r, 0);[m
[31m-[m
[31m-                if (rv == NGX_ERROR) {[m
[31m-                    ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (rv == NGX_DECLINED) {[m
[31m-                    p = r->header_name_start;[m
[31m-[m
[31m-                    r->lingering_close = 1;[m
[31m-[m
[31m-                    if (p == NULL) {[m
[31m-                        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                      "client sent too large request");[m
[31m-                        ngx_http_finalize_request(r,[m
[31m-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    len = r->header_in->end - p;[m
[31m-[m
[31m-                    if (len > NGX_MAX_ERROR_STR - 300) {[m
[31m-                        len = NGX_MAX_ERROR_STR - 300;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                "client sent too long header line: \"%*s...\"",[m
[31m-                                len, r->header_name_start);[m
[31m-[m
[31m-                    ngx_http_finalize_request(r,[m
[31m-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_http_read_request_header(r);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* the host header could change the server configuration context */[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, r->header_in,[m
[31m-                                        cscf->underscores_in_headers);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            r->request_length += r->header_in->pos - r->header_name_start;[m
[31m-[m
[31m-            if (r->invalid_header && cscf->ignore_invalid_headers) {[m
[31m-[m
[31m-                /* there was error while a header line parsing */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client sent invalid header line: \"%*s\"",[m
[31m-                              r->header_end - r->header_name_start,[m
[31m-                              r->header_name_start);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->key.data = r->header_name_start;[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-            h->value.data = r->header_start;[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-            if (h->lowcase_key == NULL) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_probe_read_req_header_done(r, h);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http header: \"%V: %V\"",[m
[31m-                           &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http header done");[m
[31m-[m
[31m-            r->request_length += r->header_in->pos - r->header_name_start;[m
[31m-[m
[31m-            r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;[m
[31m-[m
[31m-            rc = ngx_http_process_request_header(r);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_process_request(r);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            /* a header line parsing is still not complete */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_HTTP_PARSE_INVALID_HEADER */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent invalid header line");[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_read_request_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    n = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        n = c->recv(c, r->header_in->last,[m
[31m-                    r->header_in->end - r->header_in->last);[m
[31m-    } else {[m
[31m-        n = NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (!rev->timer_set) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(rev, cscf->client_header_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client prematurely closed connection");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0 || n == NGX_ERROR) {[m
[31m-        c->error = 1;[m
[31m-        c->log->action = "reading client request headers";[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->header_in->last += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,[m
[31m-    ngx_uint_t request_line)[m
[31m-{[m
[31m-    u_char                    *old, *new;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http alloc large header buffer");[m
[31m-[m
[31m-    if (request_line && r->state == 0) {[m
[31m-[m
[31m-        /* the client fills up the buffer with "\r\n" */[m
[31m-[m
[31m-        r->header_in->pos = r->header_in->start;[m
[31m-        r->header_in->last = r->header_in->start;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    old = request_line ? r->request_start : r->header_name_start;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->state != 0[m
[31m-        && (size_t) (r->header_in->pos - old)[m
[31m-                                     >= cscf->large_client_header_buffers.size)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-[m
[31m-    if (hc->nfree) {[m
[31m-        b = hc->free[--hc->nfree];[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http large header free: %p %uz",[m
[31m-                       b->pos, b->end - b->last);[m
[31m-[m
[31m-    } else if (hc->nbusy < cscf->large_client_header_buffers.num) {[m
[31m-[m
[31m-        if (hc->busy == NULL) {[m
[31m-            hc->busy = ngx_palloc(r->connection->pool,[m
[31m-                  cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));[m
[31m-            if (hc->busy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->connection->pool,[m
[31m-                                cscf->large_client_header_buffers.size);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http large header alloc: %p %uz",[m
[31m-                       b->pos, b->end - b->last);[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hc->busy[hc->nbusy++] = b;[m
[31m-[m
[31m-    if (r->state == 0) {[m
[31m-        /*[m
[31m-         * r->state == 0 means that a header line was parsed successfully[m
[31m-         * and we do not need to copy incomplete header line and[m
[31m-         * to relocate the parser header pointers[m
[31m-         */[m
[31m-[m
[31m-        r->header_in = b;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http large header copy: %uz", r->header_in->pos - old);[m
[31m-[m
[31m-    new = b->start;[m
[31m-[m
[31m-    ngx_memcpy(new, old, r->header_in->pos - old);[m
[31m-[m
[31m-    b->pos = new + (r->header_in->pos - old);[m
[31m-    b->last = new + (r->header_in->pos - old);[m
[31m-[m
[31m-    if (request_line) {[m
[31m-        r->request_start = new;[m
[31m-[m
[31m-        if (r->request_end) {[m
[31m-            r->request_end = new + (r->request_end - old);[m
[31m-        }[m
[31m-[m
[31m-        r->method_end = new + (r->method_end - old);[m
[31m-[m
[31m-        r->uri_start = new + (r->uri_start - old);[m
[31m-        r->uri_end = new + (r->uri_end - old);[m
[31m-[m
[31m-        if (r->schema_start) {[m
[31m-            r->schema_start = new + (r->schema_start - old);[m
[31m-            r->schema_end = new + (r->schema_end - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->host_start) {[m
[31m-            r->host_start = new + (r->host_start - old);[m
[31m-            if (r->host_end) {[m
[31m-                r->host_end = new + (r->host_end - old);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (r->port_start) {[m
[31m-            r->port_start = new + (r->port_start - old);[m
[31m-            r->port_end = new + (r->port_end - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->uri_ext) {[m
[31m-            r->uri_ext = new + (r->uri_ext - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->args_start) {[m
[31m-            r->args_start = new + (r->args_start - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->http_protocol.data) {[m
[31m-            r->http_protocol.data = new + (r->http_protocol.data - old);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->header_name_start = new;[m
[31m-        r->header_name_end = new + (r->header_name_end - old);[m
[31m-        r->header_start = new + (r->header_start - old);[m
[31m-        r->header_end = new + (r->header_end - old);[m
[31m-    }[m
[31m-[m
[31m-    r->header_in = b;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_unique_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                  "client sent duplicate header line: \"%V: %V\", "[m
[31m-                  "previous value: \"%V: %V\"",[m
[31m-                  &h->key, &h->value, &(*ph)->key, &(*ph)->value);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_host(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_str_t  host;[m
[31m-[m
[31m-    if (r->headers_in.host == NULL) {[m
[31m-        r->headers_in.host = h;[m
[31m-    }[m
[31m-[m
[31m-    host = h->value;[m
[31m-[m
[31m-    rc = ngx_http_validate_host(&host, r->pool, 0);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent invalid host header");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.server.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.server = host;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    if (ngx_strcasestrn(h->value.data, "close", 5 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-[m
[31m-    } else if (ngx_strcasestrn(h->value.data, "keep-alive", 10 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_user_agent(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *user_agent, *msie;[m
[31m-[m
[31m-    if (r->headers_in.user_agent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.user_agent = h;[m
[31m-[m
[31m-    /* check some widespread browsers while the header is in CPU cache */[m
[31m-[m
[31m-    user_agent = h->value.data;[m
[31m-[m
[31m-    msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1);[m
[31m-[m
[31m-    if (msie && msie + 7 < user_agent + h->value.len) {[m
[31m-[m
[31m-        r->headers_in.msie = 1;[m
[31m-[m
[31m-        if (msie[6] == '.') {[m
[31m-[m
[31m-            switch (msie[5]) {[m
[31m-            case '4':[m
[31m-            case '5':[m
[31m-                r->headers_in.msie6 = 1;[m
[31m-                break;[m
[31m-            case '6':[m
[31m-                if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) {[m
[31m-                    r->headers_in.msie6 = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        /* MSIE ignores the SSL "close notify" alert */[m
[31m-        if (c->ssl) {[m
[31m-            c->ssl->no_send_shutdown = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstrn(user_agent, "Opera", 5 - 1)) {[m
[31m-        r->headers_in.opera = 1;[m
[31m-        r->headers_in.msie = 0;[m
[31m-        r->headers_in.msie6 = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->headers_in.msie && !r->headers_in.opera) {[m
[31m-[m
[31m-        if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {[m
[31m-            r->headers_in.gecko = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {[m
[31m-            r->headers_in.chrome = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)[m
[31m-                   && ngx_strstrn(user_agent, "Mac OS X", 8 - 1))[m
[31m-        {[m
[31m-            r->headers_in.safari = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {[m
[31m-            r->headers_in.konqueror = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_multi_header_lines(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t       *headers;[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    headers = (ngx_array_t *) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (headers->elts == NULL) {[m
[31m-        if (ngx_array_init(headers, r->pool, 1, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(headers);[m
[31m-    if (ph == NULL) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_process_request_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->headers_in.server.len == 0[m
[31m-        && ngx_http_set_virtual_server(r, &r->headers_in.server)[m
[31m-           == NGX_ERROR)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.host == NULL && r->http_version > NGX_HTTP_VERSION_10) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                   "client sent HTTP/1.1 request without \"Host\" header");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length_n =[m
[31m-                            ngx_atoof(r->headers_in.content_length->value.data,[m
[31m-                                      r->headers_in.content_length->value.len);[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid \"Content-Length\" header");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_TRACE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent TRACE method");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.transfer_encoding) {[m
[31m-        if (r->headers_in.transfer_encoding->value.len == 7[m
[31m-            && ngx_strncasecmp(r->headers_in.transfer_encoding->value.data,[m
[31m-                               (u_char *) "chunked", 7) == 0)[m
[31m-        {[m
[31m-            r->headers_in.content_length = NULL;[m
[31m-            r->headers_in.content_length_n = -1;[m
[31m-            r->headers_in.chunked = 1;[m
[31m-[m
[31m-        } else if (r->headers_in.transfer_encoding->value.len != 8[m
[31m-            || ngx_strncasecmp(r->headers_in.transfer_encoding->value.data,[m
[31m-                               (u_char *) "identity", 8) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent unknown \"Transfer-Encoding\": \"%V\"",[m
[31m-                          &r->headers_in.transfer_encoding->value);[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_NOT_IMPLEMENTED);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.connection_type == NGX_HTTP_CONNECTION_KEEP_ALIVE) {[m
[31m-        if (r->headers_in.keep_alive) {[m
[31m-            r->headers_in.keep_alive_n =[m
[31m-                            ngx_atotm(r->headers_in.keep_alive->value.data,[m
[31m-                                      r->headers_in.keep_alive->value.len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_process_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->http_connection->ssl) {[m
[31m-        long                      rc;[m
[31m-        X509                     *cert;[m
[31m-        ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-        if (c->ssl == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "client sent plain HTTP request to HTTPS port");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module);[m
[31m-[m
[31m-        if (sscf->verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK[m
[31m-                && (sscf->verify != 3 || !ngx_ssl_verify_error_optional(rc)))[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-[m
[31m-                ngx_ssl_remove_cached_session(sscf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-                ngx_http_finalize_request(r, NGX_HTTPS_CERT_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (sscf->verify == 1) {[m
[31m-                cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-                if (cert == NULL) {[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                  "client sent no required SSL certificate");[m
[31m-[m
[31m-                    ngx_ssl_remove_cached_session(sscf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-                    ngx_http_finalize_request(r, NGX_HTTPS_NO_CERT);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                X509_free(cert);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_reading, -1);[m
[31m-    r->stat_reading = 0;[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_writing, 1);[m
[31m-    r->stat_writing = 1;[m
[31m-#endif[m
[31m-[m
[31m-    c->read->handler = ngx_http_request_handler;[m
[31m-    c->write->handler = ngx_http_request_handler;[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    ngx_http_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc)[m
[31m-{[m
[31m-    u_char  *h, ch;[m
[31m-    size_t   i, dot_pos, host_len;[m
[31m-[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_literal,[m
[31m-        sw_rest[m
[31m-    } state;[m
[31m-[m
[31m-    dot_pos = host->len;[m
[31m-    host_len = host->len;[m
[31m-[m
[31m-    h = host->data;[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-[m
[31m-    for (i = 0; i < host->len; i++) {[m
[31m-        ch = h[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '.':[m
[31m-            if (dot_pos == i - 1) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-            dot_pos = i;[m
[31m-            break;[m
[31m-[m
[31m-        case ':':[m
[31m-            if (state == sw_usual) {[m
[31m-                host_len = i;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '[':[m
[31m-            if (i == 0) {[m
[31m-                state = sw_literal;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ']':[m
[31m-            if (state == sw_literal) {[m
[31m-                host_len = i + 1;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '\0':[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            if (ngx_path_separator(ch)) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                alloc = 1;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dot_pos == host_len - 1) {[m
[31m-        host_len--;[m
[31m-    }[m
[31m-[m
[31m-    if (host_len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc) {[m
[31m-        host->data = ngx_pnalloc(pool, host_len);[m
[31m-        if (host->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_strlow(host->data, h, host_len);[m
[31m-    }[m
[31m-[m
[31m-    host->len = host_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf = NULL;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    cscf = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-    if (hc->ssl_servername) {[m
[31m-        if (hc->ssl_servername->len == host->len[m
[31m-            && ngx_strncmp(hc->ssl_servername->data,[m
[31m-                           host->data, host->len) == 0)[m
[31m-        {[m
[31m-#if (NGX_PCRE)[m
[31m-            if (hc->ssl_servername_regex[m
[31m-                && ngx_http_regex_exec(r, hc->ssl_servername_regex,[m
[31m-                                          hc->ssl_servername) != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-#endif[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_find_virtual_server(r->connection,[m
[31m-                                      hc->addr_conf->virtual_names,[m
[31m-                                      host, r, &cscf);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-    if (hc->ssl_servername) {[m
[31m-        ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            cscf = hc->addr_conf->default_server;[m
[31m-            rc = NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_http_get_module_srv_conf(cscf->ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-        if (sscf->verify) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client attempted to request the server name "[m
[31m-                          "different from that one was negotiated");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->srv_conf = cscf->ctx->srv_conf;[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_find_virtual_server(ngx_connection_t *c,[m
[31m-    ngx_http_virtual_names_t *virtual_names, ngx_str_t *host,[m
[31m-    ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (virtual_names == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_hash_find_combined(&virtual_names->names,[m
[31m-                                  ngx_hash_key(host->data, host->len),[m
[31m-                                  host->data, host->len);[m
[31m-[m
[31m-    if (cscf) {[m
[31m-        *cscfp = cscf;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (host->len && virtual_names->nregex) {[m
[31m-        ngx_int_t                n;[m
[31m-        ngx_uint_t               i;[m
[31m-        ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-        sn = virtual_names->regex;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-        if (r == NULL) {[m
[31m-            ngx_http_connection_t  *hc;[m
[31m-[m
[31m-            for (i = 0; i < virtual_names->nregex; i++) {[m
[31m-[m
[31m-                n = ngx_regex_exec(sn[i].regex->regex, host, NULL, 0);[m
[31m-[m
[31m-                if (n == NGX_REGEX_NO_MATCHED) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (n >= 0) {[m
[31m-                    hc = c->data;[m
[31m-                    hc->ssl_servername_regex = sn[i].regex;[m
[31m-[m
[31m-                    *cscfp = sn[i].server;[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              ngx_regex_exec_n " failed: %i "[m
[31m-                              "on \"%V\" using \"%V\"",[m
[31m-                              n, host, &sn[i].regex->name);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-#endif /* NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME */[m
[31m-[m
[31m-        for (i = 0; i < virtual_names->nregex; i++) {[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, sn[i].regex, host);[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                *cscfp = sn[i].server;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif /* NGX_PCRE */[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_request_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http run request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        r->write_event_handler(r);[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_run_posted_requests(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_posted_request_t  *pr;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (c->destroyed) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r = c->data;[m
[31m-        pr = r->main->posted_requests;[m
[31m-[m
[31m-        if (pr == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->main->posted_requests = pr->next;[m
[31m-[m
[31m-        r = pr->request;[m
[31m-[m
[31m-        ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http posted request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_post_request(ngx_http_request_t *r, ngx_http_posted_request_t *pr)[m
[31m-{[m
[31m-    ngx_http_posted_request_t  **p;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-        if (pr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-    for (p = &r->main->posted_requests; *p; p = &(*p)->next) { /* void */ }[m
[31m-[m
[31m-    *p = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_t        *pr;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http finalize request: %i, \"%V?%V\" a:%d, c:%d",[m
[31m-                   rc, &r->uri, &r->args, r == c->data, r->main->count);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_finalize_connection(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK && r->filter_finalize) {[m
[31m-        c->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->content_handler = NULL;[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main && r->post_subrequest) {[m
[31m-        ngx_http_probe_subrequest_post_start(r, rc);[m
[31m-[m
[31m-        rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc);[m
[31m-[m
[31m-        ngx_http_probe_subrequest_post_done(r, rc);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc == NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        || c->error)[m
[31m-    {[m
[31m-        if (ngx_http_post_action(r) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (r->main->blocked) {[m
[31m-            r->write_event_handler = ngx_http_request_finalizer;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_terminate_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        || rc == NGX_HTTP_CREATED[m
[31m-        || rc == NGX_HTTP_NO_CONTENT)[m
[31m-    {[m
[31m-        if (rc == NGX_HTTP_CLOSE) {[m
[31m-            ngx_http_terminate_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (r == r->main) {[m
[31m-            if (c->read->timer_set) {[m
[31m-                ngx_del_timer(c->read);[m
[31m-            }[m
[31m-[m
[31m-            if (c->write->timer_set) {[m
[31m-                ngx_del_timer(c->write);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        c->read->handler = ngx_http_request_handler;[m
[31m-        c->write->handler = ngx_http_request_handler;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-[m
[31m-        if (r->buffered || r->postponed) {[m
[31m-[m
[31m-            ngx_http_probe_subrequest_finalize_writing(r);[m
[31m-[m
[31m-            if (ngx_http_set_write_handler(r) != NGX_OK) {[m
[31m-                ngx_http_terminate_request(r, 0);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        pr = r->parent;[m
[31m-[m
[31m-        if (r == c->data) {[m
[31m-[m
[31m-            r->main->count--;[m
[31m-[m
[31m-            if (!r->logged) {[m
[31m-[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                if (clcf->log_subrequest) {[m
[31m-                    ngx_http_log_request(r);[m
[31m-                }[m
[31m-[m
[31m-                r->logged = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              "subrequest: \"%V?%V\" logged again",[m
[31m-                              &r->uri, &r->args);[m
[31m-            }[m
[31m-[m
[31m-            r->done = 1;[m
[31m-[m
[31m-            if (pr->postponed && pr->postponed->request == r) {[m
[31m-                pr->postponed = pr->postponed->next;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_probe_subrequest_done(r);[m
[31m-[m
[31m-            c->data = pr;[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            ngx_http_probe_subrequest_finalize_nonactive(r);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http finalize non-active request: \"%V?%V\"",[m
[31m-                           &r->uri, &r->args);[m
[31m-[m
[31m-            r->write_event_handler = ngx_http_request_finalizer;[m
[31m-[m
[31m-            if (r->waited) {[m
[31m-                r->done = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_probe_subrequest_wake_parent(r);[m
[31m-[m
[31m-        if (ngx_http_post_request(pr, NULL) != NGX_OK) {[m
[31m-            r->main->count++;[m
[31m-            ngx_http_terminate_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http wake parent request: \"%V?%V\"",[m
[31m-                       &pr->uri, &pr->args);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered || c->buffered || r->postponed || r->blocked) {[m
[31m-[m
[31m-        if (ngx_http_set_write_handler(r) != NGX_OK) {[m
[31m-            ngx_http_terminate_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != c->data) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "http finalize non-active request: \"%V?%V\"",[m
[31m-                      &r->uri, &r->args);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->done = 1;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    if (!r->post_action) {[m
[31m-        r->request_complete = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_post_action(r) == NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        c->write->delayed = 0;[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->eof) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_connection(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_cleanup_t    *cln;[m
[31m-    ngx_http_request_t    *mr;[m
[31m-    ngx_http_ephemeral_t  *e;[m
[31m-[m
[31m-    mr = r->main;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate request count:%d", mr->count);[m
[31m-[m
[31m-    if (rc > 0 && (mr->headers_out.status == 0 || mr->connection->sent == 0)) {[m
[31m-        mr->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    cln = mr->cleanup;[m
[31m-    mr->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate cleanup count:%d blk:%d",[m
[31m-                   mr->count, mr->blocked);[m
[31m-[m
[31m-    if (mr->write_event_handler) {[m
[31m-[m
[31m-        if (mr->blocked) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        e = ngx_http_ephemeral(mr);[m
[31m-        mr->posted_requests = NULL;[m
[31m-        mr->write_event_handler = ngx_http_terminate_handler;[m
[31m-        (void) ngx_http_post_request(mr, &e->terminal_posted_request);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_request(mr, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_terminate_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate handler count:%d", r->count);[m
[31m-[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    ngx_http_close_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_finalize_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->main->count != 1) {[m
[31m-[m
[31m-        if (r->discard_body) {[m
[31m-            r->read_event_handler = ngx_http_discarded_request_body_handler;[m
[31m-            ngx_add_timer(r->connection->read, clcf->lingering_timeout);[m
[31m-[m
[31m-            if (r->lingering_time == 0) {[m
[31m-                r->lingering_time = ngx_time()[m
[31m-                                      + (time_t) (clcf->lingering_time / 1000);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->reading_body) {[m
[31m-        r->keepalive = 0;[m
[31m-        r->lingering_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_terminate[m
[31m-         && !ngx_exiting[m
[31m-         && r->keepalive[m
[31m-         && clcf->keepalive_timeout > 0)[m
[31m-    {[m
[31m-        ngx_http_set_keepalive(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lingering_close == NGX_HTTP_LINGERING_ALWAYS[m
[31m-        || (clcf->lingering_close == NGX_HTTP_LINGERING_ON[m
[31m-            && (r->lingering_close[m
[31m-                || r->header_in->pos < r->header_in->last[m
[31m-                || r->connection->read->ready)))[m
[31m-    {[m
[31m-        ngx_http_set_lingering_close(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_write_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_WRITING_REQUEST_STATE;[m
[31m-[m
[31m-    r->read_event_handler = r->discard_body ?[m
[31m-                                ngx_http_discarded_request_body_handler:[m
[31m-                                ngx_http_test_reading;[m
[31m-    r->write_event_handler = ngx_http_writer;[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wev->ready && wev->delayed) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    if (!wev->delayed) {[m
[31m-        ngx_add_timer(wev, clcf->send_timeout);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_writer(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                        rc;[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                   "http writer handler: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "client timed out");[m
[31m-            c->timedout = 1;[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        wev->timedout = 0;[m
[31m-        wev->delayed = 0;[m
[31m-[m
[31m-        if (!wev->ready) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-                ngx_http_close_request(r, 0);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    if (wev->delayed || r->aio) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                       "http writer delayed");[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, NULL);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http writer output filter: %d, \"%V?%V\"",[m
[31m-                   rc, &r->uri, &r->args);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered || r->postponed || (r == r->main && c->buffered)) {[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                   "http writer done: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_request_finalizer(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http finalizer done: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_block_reading(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http reading blocked");[m
[31m-[m
[31m-    /* aio does not call this handler */[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT)[m
[31m-        && r->connection->read->active)[m
[31m-    {[m
[31m-        if (ngx_del_event(r->connection->read, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_test_reading(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http test reading");[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-[m
[31m-    if (r->stream) {[m
[31m-        if (c->error) {[m
[31m-            err = 0;[m
[31m-            goto closed;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!rev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-        err = rev->kq_errno;[m
[31m-[m
[31m-        goto closed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && rev->pending_eof) {[m
[31m-        socklen_t  len;[m
[31m-[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        err = 0;[m
[31m-        len = sizeof(ngx_err_t);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        goto closed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-        err = 0;[m
[31m-[m
[31m-        goto closed;[m
[31m-[m
[31m-    } else if (n == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err != NGX_EAGAIN) {[m
[31m-            rev->eof = 1;[m
[31m-            c->error = 1;[m
[31m-[m
[31m-            goto closed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* aio does not call this handler */[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && rev->active) {[m
[31m-[m
[31m-        if (ngx_del_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-closed:[m
[31m-[m
[31m-    if (err) {[m
[31m-        rev->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_set_keepalive(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  i;[m
[31m-    ngx_buf_t                 *b, *f;[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler");[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-        r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);[m
[31m-        ngx_add_timer(rev, clcf->lingering_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "closing request";[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-    b = r->header_in;[m
[31m-[m
[31m-    if (b->pos < b->last) {[m
[31m-[m
[31m-        /* the pipelined request */[m
[31m-[m
[31m-        if (b != c->buffer) {[m
[31m-[m
[31m-            /*[m
[31m-             * If the large header buffers were allocated while the previous[m
[31m-             * request processing then we do not use c->buffer for[m
[31m-             * the pipelined request (see ngx_http_create_request()).[m
[31m-             *[m
[31m-             * Now we would move the large header buffers to the free list.[m
[31m-             */[m
[31m-[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            if (hc->free == NULL) {[m
[31m-                hc->free = ngx_palloc(c->pool,[m
[31m-                  cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));[m
[31m-[m
[31m-                if (hc->free == NULL) {[m
[31m-                    ngx_http_close_request(r, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; i < hc->nbusy - 1; i++) {[m
[31m-                f = hc->busy[i];[m
[31m-                hc->free[hc->nfree++] = f;[m
[31m-                f->pos = f->start;[m
[31m-                f->last = f->start;[m
[31m-            }[m
[31m-[m
[31m-            hc->busy[0] = b;[m
[31m-            hc->nbusy = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* guard against recursive call from ngx_http_finalize_connection() */[m
[31m-    r->keepalive = 0;[m
[31m-[m
[31m-    ngx_http_free_request(r, 0);[m
[31m-[m
[31m-    c->data = hc;[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-    wev->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    if (b->pos < b->last) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "pipelined request");[m
[31m-[m
[31m-        c->log->action = "reading client pipelined request line";[m
[31m-[m
[31m-        r = ngx_http_create_request(c);[m
[31m-        if (r == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->pipeline = 1;[m
[31m-[m
[31m-        c->data = r;[m
[31m-[m
[31m-        c->sent = 0;[m
[31m-        c->destroyed = 0;[m
[31m-[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        rev->handler = ngx_http_process_request_line;[m
[31m-        ngx_post_event(rev, &ngx_posted_events);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * To keep a memory footprint as small as possible for an idle keepalive[m
[31m-     * connection we try to free c->buffer's memory if it was allocated outside[m
[31m-     * the c->pool.  The large header buffers are always allocated outside the[m
[31m-     * c->pool and are freed too.[m
[31m-     */[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-[m
[31m-        /*[m
[31m-         * the special note for ngx_http_keepalive_handler() that[m
[31m-         * c->buffer's memory was freed[m
[31m-         */[m
[31m-[m
[31m-        b->pos = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc free: %p %i",[m
[31m-                   hc->free, hc->nfree);[m
[31m-[m
[31m-    if (hc->free) {[m
[31m-        for (i = 0; i < hc->nfree; i++) {[m
[31m-            ngx_pfree(c->pool, hc->free[i]->start);[m
[31m-            hc->free[i] = NULL;[m
[31m-        }[m
[31m-[m
[31m-        hc->nfree = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc busy: %p %i",[m
[31m-                   hc->busy, hc->nbusy);[m
[31m-[m
[31m-    if (hc->busy) {[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            ngx_pfree(c->pool, hc->busy[i]->start);[m
[31m-            hc->busy[i] = NULL;[m
[31m-        }[m
[31m-[m
[31m-        hc->nbusy = 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        ngx_ssl_free_buffer(c);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rev->handler = ngx_http_keepalive_handler;[m
[31m-[m
[31m-    if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "keepalive";[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == -1) {[m
[31m-            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-        tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;[m
[31m-[m
[31m-    } else {[m
[31m-        tcp_nodelay = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (tcp_nodelay[m
[31m-        && clcf->tcp_nodelay[m
[31m-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-            == -1)[m
[31m-        {[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris returns EINVAL if a socket has been shut down */[m
[31m-            c->log_error = NGX_ERROR_IGNORE_EINVAL;[m
[31m-#endif[m
[31m-[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-[m
[31m-            c->log_error = NGX_ERROR_INFO;[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    /* if ngx_http_request_t was freed then we need some other place */[m
[31m-    r->http_state = NGX_HTTP_KEEPALIVE_STATE;[m
[31m-#endif[m
[31m-[m
[31m-    c->idle = 1;[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    ngx_add_timer(rev, clcf->keepalive_timeout);[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_post_event(rev, &ngx_posted_events);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_keepalive_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ssize_t            n;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http keepalive handler");[m
[31m-[m
[31m-    if (rev->timedout || c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        if (rev->pending_eof) {[m
[31m-            c->log->handler = NULL;[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,[m
[31m-                          "kevent() reported that client %V closed "[m
[31m-                          "keepalive connection", &c->addr_text);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl) {[m
[31m-                c->ssl->no_send_shutdown = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-    size = b->end - b->start;[m
[31m-[m
[31m-    if (b->pos == NULL) {[m
[31m-[m
[31m-        /*[m
[31m-         * The c->buffer's memory was freed by ngx_http_set_keepalive().[m
[31m-         * However, the c->buffer->start and c->buffer->end were not changed[m
[31m-         * to keep the buffer size.[m
[31m-         */[m
[31m-[m
[31m-        b->pos = ngx_palloc(c->pool, size);[m
[31m-        if (b->pos == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->start = b->pos;[m
[31m-        b->last = b->pos;[m
[31m-        b->end = b->pos + size;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * MSIE closes a keepalive connection with RST flag[m
[31m-     * so we ignore ECONNRESET here.[m
[31m-     */[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_IGNORE_ECONNRESET;[m
[31m-    ngx_set_socket_errno(0);[m
[31m-[m
[31m-    n = c->recv(c, b->last, size);[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * Like ngx_http_set_keepalive() we are trying to not hold[m
[31m-         * c->buffer's memory for a keepalive connection.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-[m
[31m-            /*[m
[31m-             * the special note that c->buffer's memory was freed[m
[31m-             */[m
[31m-[m
[31m-            b->pos = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->handler = NULL;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno,[m
[31m-                      "client %V closed keepalive connection", &c->addr_text);[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    c->log->handler = ngx_http_log_error;[m
[31m-    c->log->action = "reading client request line";[m
[31m-[m
[31m-    c->idle = 0;[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    c->data = ngx_http_create_request(c);[m
[31m-    if (c->data == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->sent = 0;[m
[31m-    c->destroyed = 0;[m
[31m-[m
[31m-    ngx_del_timer(rev);[m
[31m-[m
[31m-    rev->handler = ngx_http_process_request_line;[m
[31m-    ngx_http_process_request_line(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_set_lingering_close(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    rev->handler = ngx_http_lingering_close_handler;[m
[31m-[m
[31m-    r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);[m
[31m-    ngx_add_timer(rev, clcf->lingering_timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-    wev->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {[m
[31m-        ngx_connection_error(c, ngx_socket_errno,[m
[31m-                             ngx_shutdown_socket_n " failed");[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_http_lingering_close_handler(rev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lingering_close_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_msec_t                 timer;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    u_char                     buffer[NGX_HTTP_LINGERING_BUFFER_SIZE];[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lingering close handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();[m
[31m-    if ((ngx_msec_int_t) timer <= 0) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    do {[m
[31m-        n = c->recv(c, buffer, NGX_HTTP_LINGERING_BUFFER_SIZE);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "lingering read: %z", n);[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } while (rev->ready);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    timer *= 1000;[m
[31m-[m
[31m-    if (timer > clcf->lingering_timeout) {[m
[31m-        timer = clcf->lingering_timeout;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(rev, timer);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_empty_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http empty handler");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_request_empty_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http request empty handler");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_special(ngx_http_request_t *r, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_LAST) {[m
[31m-[m
[31m-        if (r == r->main && !r->post_action) {[m
[31m-            b->last_buf = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            b->sync = 1;[m
[31m-            b->last_in_chain = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_FLUSH) {[m
[31m-        b->flush = 1;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_post_action(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->post_action.data == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->post_action && r->uri_changes == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post action: \"%V\"", &clcf->post_action);[m
[31m-[m
[31m-    r->main->count--;[m
[31m-[m
[31m-    r->http_version = NGX_HTTP_VERSION_9;[m
[31m-    r->header_only = 1;[m
[31m-    r->post_action = 1;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    if (clcf->post_action.data[0] == '/') {[m
[31m-        ngx_http_internal_redirect(r, &clcf->post_action, NULL);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_http_named_location(r, &clcf->post_action);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r = r->main;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http request count:%d blk:%d", r->count, r->blocked);[m
[31m-[m
[31m-    if (r->count == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http request count is zero");[m
[31m-    }[m
[31m-[m
[31m-    r->count--;[m
[31m-[m
[31m-    if (r->count || r->blocked) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_v2_close_stream(r->stream, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_free_request(r, rc);[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_pool_t                *pool;[m
[31m-    struct linger              linger;[m
[31m-    ngx_http_cleanup_t        *cln;[m
[31m-    ngx_http_log_ctx_t        *ctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http close request");[m
[31m-[m
[31m-    if (r->pool == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "http request already closed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln = r->cleanup;[m
[31m-    r->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-    if (r->stat_reading) {[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_reading, -1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->stat_writing) {[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_writing, -1);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (rc > 0 && (r->headers_out.status == 0 || r->connection->sent == 0)) {[m
[31m-        r->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    log->action = "logging request";[m
[31m-[m
[31m-    ngx_http_log_request(r);[m
[31m-[m
[31m-    log->action = "closing request";[m
[31m-[m
[31m-    if (r->connection->timedout) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->reset_timedout_connection) {[m
[31m-            linger.l_onoff = 1;[m
[31m-            linger.l_linger = 0;[m
[31m-[m
[31m-            if (setsockopt(r->connection->fd, SOL_SOCKET, SO_LINGER,[m
[31m-                           (const void *) &linger, sizeof(struct linger)) == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_LINGER) failed");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the various request strings were allocated from r->pool */[m
[31m-    ctx = log->data;[m
[31m-    ctx->request = NULL;[m
[31m-[m
[31m-    r->request_line.len = 0;[m
[31m-[m
[31m-    r->connection->destroyed = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * Setting r->pool to NULL will increase probability to catch double close[m
[31m-     * of request since the request object is allocated from its own pool.[m
[31m-     */[m
[31m-[m
[31m-    pool = r->pool;[m
[31m-    r->pool = NULL;[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_handler_pt        *log_handler;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    log_handler = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.elts;[m
[31m-    n = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.nelts;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        log_handler[i](r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "close http connection: %d", c->fd);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_http_close_connection;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_http_request_t  *r;[m
[31m-    ngx_http_log_ctx_t  *ctx;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    ctx = log->data;[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", client: %V", &ctx->connection->addr_text);[m
[31m-    len -= p - buf;[m
[31m-[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    if (r) {[m
[31m-        return r->log_handler(r, ctx->current_request, p, len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_snprintf(p, len, ", server: %V",[m
[31m-                         &ctx->connection->listening->addr_text);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_error_handler(ngx_http_request_t *r, ngx_http_request_t *sr,[m
[31m-    u_char *buf, size_t len)[m
[31m-{[m
[31m-    char                      *uri_separator;[m
[31m-    u_char                    *p;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", server: %V", &cscf->server_name);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (r->request_line.data == NULL && r->request_start) {[m
[31m-        for (p = r->request_start; p < r->header_in->last; p++) {[m
[31m-            if (*p == CR || *p == LF) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        r->request_line.len = p - r->request_start;[m
[31m-        r->request_line.data = r->request_start;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_line.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", request: \"%V\"", &r->request_line);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r != sr) {[m
[31m-        p = ngx_snprintf(buf, len, ", subrequest: \"%V\"", &sr->uri);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    u = sr->upstream;[m
[31m-[m
[31m-    if (u && u->peer.name) {[m
[31m-[m
[31m-        uri_separator = "";[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        if (u->peer.sockaddr && u->peer.sockaddr->sa_family == AF_UNIX) {[m
[31m-            uri_separator = ":";[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        p = ngx_snprintf(buf, len, ", upstream: \"%V%V%s%V\"",[m
[31m-                         &u->schema, u->peer.name,[m
[31m-                         uri_separator, &u->uri);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.host) {[m
[31m-        p = ngx_snprintf(buf, len, ", host: \"%V\"",[m
[31m-                         &r->headers_in.host->value);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.referer) {[m
[31m-        p = ngx_snprintf(buf, len, ", referrer: \"%V\"",[m
[31m-                         &r->headers_in.referer->value);[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.c.orig[m
[1mdeleted file mode 100644[m
[1mindex e958e94..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,3666 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_wait_request_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_process_request_line(ngx_event_t *rev);[m
[31m-static void ngx_http_process_request_headers(ngx_event_t *rev);[m
[31m-static ssize_t ngx_http_read_request_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,[m
[31m-    ngx_uint_t request_line);[m
[31m-[m
[31m-static ngx_int_t ngx_http_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_unique_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_host(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_connection(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_user_agent(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-static ngx_int_t ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool,[m
[31m-    ngx_uint_t alloc);[m
[31m-static ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r,[m
[31m-    ngx_str_t *host);[m
[31m-static ngx_int_t ngx_http_find_virtual_server(ngx_connection_t *c,[m
[31m-    ngx_http_virtual_names_t *virtual_names, ngx_str_t *host,[m
[31m-    ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp);[m
[31m-[m
[31m-static void ngx_http_request_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-static void ngx_http_terminate_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_finalize_connection(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_set_write_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_writer(ngx_http_request_t *r);[m
[31m-static void ngx_http_request_finalizer(ngx_http_request_t *r);[m
[31m-[m
[31m-static void ngx_http_set_keepalive(ngx_http_request_t *r);[m
[31m-static void ngx_http_keepalive_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_set_lingering_close(ngx_http_request_t *r);[m
[31m-static void ngx_http_lingering_close_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_http_post_action(ngx_http_request_t *r);[m
[31m-static void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error);[m
[31m-static void ngx_http_log_request(ngx_http_request_t *r);[m
[31m-[m
[31m-static u_char *ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-static u_char *ngx_http_log_error_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_request_t *sr, u_char *buf, size_t len);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static void ngx_http_ssl_handshake(ngx_event_t *rev);[m
[31m-static void ngx_http_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_client_errors[] = {[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_METHOD */[m
[31m-    "client sent invalid method",[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_REQUEST */[m
[31m-    "client sent invalid request",[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_09_METHOD */[m
[31m-    "client sent invalid method in HTTP/0.9 request"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_header_t  ngx_http_headers_in[] = {[m
[31m-    { ngx_string("Host"), offsetof(ngx_http_headers_in_t, host),[m
[31m-                 ngx_http_process_host },[m
[31m-[m
[31m-    { ngx_string("Connection"), offsetof(ngx_http_headers_in_t, connection),[m
[31m-                 ngx_http_process_connection },[m
[31m-[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_modified_since),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Unmodified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_unmodified_since),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_match),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-None-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_none_match),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("User-Agent"), offsetof(ngx_http_headers_in_t, user_agent),[m
[31m-                 ngx_http_process_user_agent },[m
[31m-[m
[31m-    { ngx_string("Referer"), offsetof(ngx_http_headers_in_t, referer),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_length),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_type),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Range"), offsetof(ngx_http_headers_in_t, range),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_range),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, transfer_encoding),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Expect"),[m
[31m-                 offsetof(ngx_http_headers_in_t, expect),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Upgrade"),[m
[31m-                 offsetof(ngx_http_headers_in_t, upgrade),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Accept-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_encoding),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Via"), offsetof(ngx_http_headers_in_t, via),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Authorization"),[m
[31m-                 offsetof(ngx_http_headers_in_t, authorization),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"), offsetof(ngx_http_headers_in_t, keep_alive),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("X-Forwarded-For"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_forwarded_for),[m
[31m-                 ngx_http_process_multi_header_lines },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    { ngx_string("X-Real-IP"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_real_ip),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_HEADERS)[m
[31m-    { ngx_string("Accept"), offsetof(ngx_http_headers_in_t, accept),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Accept-Language"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_language),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    { ngx_string("Depth"), offsetof(ngx_http_headers_in_t, depth),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Overwrite"), offsetof(ngx_http_headers_in_t, overwrite),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Cookie"), offsetof(ngx_http_headers_in_t, cookies),[m
[31m-                 ngx_http_process_multi_header_lines },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_init_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_uint_t              i;[m
[31m-    ngx_event_t            *rev;[m
[31m-    struct sockaddr_in     *sin;[m
[31m-    ngx_http_port_t        *port;[m
[31m-    ngx_http_in_addr_t     *addr;[m
[31m-    ngx_http_log_ctx_t     *ctx;[m
[31m-    ngx_http_connection_t  *hc;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6    *sin6;[m
[31m-    ngx_http_in6_addr_t    *addr6;[m
[31m-#endif[m
[31m-[m
[31m-    hc = ngx_pcalloc(c->pool, sizeof(ngx_http_connection_t));[m
[31m-    if (hc == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->data = hc;[m
[31m-[m
[31m-    /* find the server configuration for the address:port */[m
[31m-[m
[31m-    port = c->listening->servers;[m
[31m-[m
[31m-    if (port->naddrs > 1) {[m
[31m-[m
[31m-        /*[m
[31m-         * there are several addresses on this port and one of them[m
[31m-         * is an "*:port" wildcard so getsockname() in ngx_http_server_addr()[m
[31m-         * is required to determine a server address[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-[m
[31m-            addr6 = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hc->addr_conf = &addr6[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-[m
[31m-            addr = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (addr[i].addr == sin->sin_addr.s_addr) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hc->addr_conf = &addr[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            addr6 = port->addrs;[m
[31m-            hc->addr_conf = &addr6[0].conf;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            addr = port->addrs;[m
[31m-            hc->addr_conf = &addr[0].conf;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the default server configuration for the address:port */[m
[31m-    hc->conf_ctx = hc->addr_conf->default_server->ctx;[m
[31m-[m
[31m-    ctx = ngx_palloc(c->pool, sizeof(ngx_http_log_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->connection = c;[m
[31m-    ctx->request = NULL;[m
[31m-    ctx->current_request = NULL;[m
[31m-[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->handler = ngx_http_log_error;[m
[31m-    c->log->data = ctx;[m
[31m-    c->log->action = "waiting for request";[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    rev->handler = ngx_http_wait_request_handler;[m
[31m-    c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (hc->addr_conf->http2) {[m
[31m-        rev->handler = ngx_http_v2_init;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    {[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-    if (sscf->enable || hc->addr_conf->ssl) {[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (hc->addr_conf->ssl && sscf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined "[m
[31m-                          "in server listening on SSL port");[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        hc->ssl = 1;[m
[31m-[m
[31m-        rev->handler = ngx_http_ssl_handshake;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (hc->addr_conf->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 1;[m
[31m-        c->log->action = "reading PROXY protocol";[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        /* the deferred accept(), iocp */[m
[31m-[m
[31m-        if (ngx_use_accept_mutex) {[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rev->handler(rev);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_wait_request_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http wait request handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    hc = c->data;[m
[31m-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    size = cscf->client_header_buffer_size;[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        b = ngx_create_temp_buf(c->pool, size);[m
[31m-        if (b == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->buffer = b;[m
[31m-[m
[31m-    } else if (b->start == NULL) {[m
[31m-[m
[31m-        b->start = ngx_palloc(c->pool, size);[m
[31m-        if (b->start == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-        b->end = b->last + size;[m
[31m-    }[m
[31m-[m
[31m-    n = c->recv(c, b->last, size);[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!rev->timer_set) {[m
[31m-            ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-            ngx_reusable_connection(c, 1);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * We are trying to not hold c->buffer's memory for an idle connection.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-            b->start = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client closed connection");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    if (hc->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 0;[m
[31m-[m
[31m-        p = ngx_proxy_protocol_read(c, b->pos, b->last);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = p;[m
[31m-[m
[31m-        if (b->pos == b->last) {[m
[31m-            c->log->action = "waiting for request";[m
[31m-            b->pos = b->start;[m
[31m-            b->last = b->start;[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "reading client request line";[m
[31m-[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    c->data = ngx_http_create_request(c);[m
[31m-    if (c->data == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rev->handler = ngx_http_process_request_line;[m
[31m-    ngx_http_process_request_line(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *[m
[31m-ngx_http_create_request(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t                 *pool;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_log_ctx_t         *ctx;[m
[31m-    ngx_http_connection_t      *hc;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    c->requests++;[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    pool = ngx_create_pool(cscf->request_pool_size, c->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_pcalloc(pool, sizeof(ngx_http_request_t));[m
[31m-    if (r == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->pool = pool;[m
[31m-[m
[31m-    r->http_connection = hc;[m
[31m-    r->signature = NGX_HTTP_MODULE;[m
[31m-    r->connection = c;[m
[31m-[m
[31m-    r->main_conf = hc->conf_ctx->main_conf;[m
[31m-    r->srv_conf = hc->conf_ctx->srv_conf;[m
[31m-    r->loc_conf = hc->conf_ctx->loc_conf;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-    r->header_in = hc->nbusy ? hc->busy[0] : c->buffer;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (r->ctx == NULL) {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    r->variables = ngx_pcalloc(r->pool, cmcf->variables.nelts[m
[31m-                                        * sizeof(ngx_http_variable_value_t));[m
[31m-    if (r->variables == NULL) {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        r->main_filter_need_in_memory = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->main = r;[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    r->start_sec = tp->sec;[m
[31m-    r->start_msec = tp->msec;[m
[31m-[m
[31m-    r->method = NGX_HTTP_UNKNOWN;[m
[31m-    r->http_version = NGX_HTTP_VERSION_10;[m
[31m-[m
[31m-    r->headers_in.content_length_n = -1;[m
[31m-    r->headers_in.keep_alive_n = -1;[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-    r->headers_out.last_modified_time = -1;[m
[31m-[m
[31m-    r->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    r->subrequests = NGX_HTTP_MAX_SUBREQUESTS + 1;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_READING_REQUEST_STATE;[m
[31m-[m
[31m-    ctx = c->log->data;[m
[31m-    ctx->request = r;[m
[31m-    ctx->current_request = r;[m
[31m-    r->log_handler = ngx_http_log_error_handler;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_reading, 1);[m
[31m-    r->stat_reading = 1;[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_requests, 1);[m
[31m-#endif[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssl_handshake(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                   *p, buf[NGX_PROXY_PROTOCOL_MAX_HEADER + 1];[m
[31m-    size_t                    size;[m
[31m-    ssize_t                   n;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_connection_t         *c;[m
[31m-    ngx_http_connection_t    *hc;[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http check ssl handshake");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    size = hc->proxy_protocol ? sizeof(buf) : 1;[m
[31m-[m
[31m-    n = recv(c->fd, (char *) buf, size, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http recv(): %z", n);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            rev->ready = 0;[m
[31m-[m
[31m-            if (!rev->timer_set) {[m
[31m-                ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-                ngx_reusable_connection(c, 1);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_http_close_connection(c);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_connection_error(c, err, "recv() failed");[m
[31m-        ngx_http_close_connection(c);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (hc->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 0;[m
[31m-[m
[31m-        p = ngx_proxy_protocol_read(c, buf, buf + n);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        size = p - buf;[m
[31m-[m
[31m-        if (c->recv(c, buf, size) != (ssize_t) size) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (n == (ssize_t) size) {[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        n = 1;[m
[31m-        buf[0] = *p;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        if (buf[0] & 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                           "https ssl handshake: 0x%02Xd", buf[0]);[m
[31m-[m
[31m-            sscf = ngx_http_get_module_srv_conf(hc->conf_ctx,[m
[31m-                                                ngx_http_ssl_module);[m
[31m-[m
[31m-            if (ngx_ssl_create_connection(&sscf->ssl, c, NGX_SSL_BUFFER)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                if (!rev->timer_set) {[m
[31m-                    ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-                }[m
[31m-[m
[31m-                ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-                c->ssl->handler = ngx_http_ssl_handshake_handler;[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_ssl_handshake_handler(c);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "plain http");[m
[31m-[m
[31m-        c->log->action = "waiting for request";[m
[31m-[m
[31m-        rev->handler = ngx_http_wait_request_handler;[m
[31m-        ngx_http_wait_request_handler(rev);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, "client closed connection");[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        /*[m
[31m-         * The majority of browsers do not send the "close notify" alert.[m
[31m-         * Among them are MSIE, old Mozilla, Netscape 4, Konqueror,[m
[31m-         * and Links.  And what is more, MSIE ignores the server's alert.[m
[31m-         *[m
[31m-         * Opera and recent Mozilla send the alert.[m
[31m-         */[m
[31m-[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_V2                                                              \[m
[31m-     && (defined TLSEXT_TYPE_application_layer_protocol_negotiation           \[m
[31m-         || defined TLSEXT_TYPE_next_proto_neg))[m
[31m-        {[m
[31m-        unsigned int            len;[m
[31m-        const unsigned char    *data;[m
[31m-        ngx_http_connection_t  *hc;[m
[31m-[m
[31m-        hc = c->data;[m
[31m-[m
[31m-        if (hc->addr_conf->http2) {[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-            SSL_get0_alpn_selected(c->ssl->connection, &data, &len);[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-            if (len == 0) {[m
[31m-                SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#else /* TLSEXT_TYPE_next_proto_neg */[m
[31m-            SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);[m
[31m-#endif[m
[31m-[m
[31m-            if (len == 2 && data[0] == 'h' && data[1] == '2') {[m
[31m-                ngx_http_v2_init(c->read);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c->log->action = "waiting for request";[m
[31m-[m
[31m-        c->read->handler = ngx_http_wait_request_handler;[m
[31m-        /* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-        ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-        ngx_http_wait_request_handler(c->read);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-int[m
[31m-ngx_http_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg)[m
[31m-{[m
[31m-    ngx_str_t                  host;[m
[31m-    const char                *servername;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_ssl_srv_conf_t   *sscf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    servername = SSL_get_servername(ssl_conn, TLSEXT_NAMETYPE_host_name);[m
[31m-[m
[31m-    if (servername == NULL) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    if (c->ssl->renegotiation) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "SSL server name: \"%s\"", servername);[m
[31m-[m
[31m-    host.len = ngx_strlen(servername);[m
[31m-[m
[31m-    if (host.len == 0) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) servername;[m
[31m-[m
[31m-    if (ngx_http_validate_host(&host, c->pool, 1) != NGX_OK) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    if (ngx_http_find_virtual_server(c, hc->addr_conf->virtual_names, &host,[m
[31m-                                     NULL, &cscf)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    hc->ssl_servername = ngx_palloc(c->pool, sizeof(ngx_str_t));[m
[31m-    if (hc->ssl_servername == NULL) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    *hc->ssl_servername = host;[m
[31m-[m
[31m-    hc->conf_ctx = cscf->ctx;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(c, clcf->error_log);[m
[31m-[m
[31m-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-    if (sscf->ssl.ctx) {[m
[31m-        SSL_set_SSL_CTX(ssl_conn, sscf->ssl.ctx);[m
[31m-[m
[31m-        /*[m
[31m-         * SSL_set_SSL_CTX() only changes certs as of 1.0.0d[m
[31m-         * adjust other things we care about[m
[31m-         */[m
[31m-[m
[31m-        SSL_set_verify(ssl_conn, SSL_CTX_get_verify_mode(sscf->ssl.ctx),[m
[31m-                       SSL_CTX_get_verify_callback(sscf->ssl.ctx));[m
[31m-[m
[31m-        SSL_set_verify_depth(ssl_conn, SSL_CTX_get_verify_depth(sscf->ssl.ctx));[m
[31m-[m
[31m-#ifdef SSL_CTRL_CLEAR_OPTIONS[m
[31m-        /* only in 0.9.8m+ */[m
[31m-        SSL_clear_options(ssl_conn, SSL_get_options(ssl_conn) &[m
[31m-                                    ~SSL_CTX_get_options(sscf->ssl.ctx));[m
[31m-#endif[m
[31m-[m
[31m-        SSL_set_options(ssl_conn, SSL_CTX_get_options(sscf->ssl.ctx));[m
[31m-    }[m
[31m-[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_process_request_line(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t              n;[m
[31m-    ngx_int_t            rc, rv;[m
[31m-    ngx_str_t            host;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http process request line");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            n = ngx_http_read_request_header(r);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_parse_request_line(r, r->header_in);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* the request line has been parsed successfully */[m
[31m-[m
[31m-            r->request_line.len = r->request_end - r->request_start;[m
[31m-            r->request_line.data = r->request_start;[m
[31m-            r->request_length = r->header_in->pos - r->request_start;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http request line: \"%V\"", &r->request_line);[m
[31m-[m
[31m-            r->method_name.len = r->method_end - r->request_start + 1;[m
[31m-            r->method_name.data = r->request_line.data;[m
[31m-[m
[31m-            if (r->http_protocol.data) {[m
[31m-                r->http_protocol.len = r->request_end - r->http_protocol.data;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_process_request_uri(r) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (r->host_start && r->host_end) {[m
[31m-[m
[31m-                host.len = r->host_end - r->host_start;[m
[31m-                host.data = r->host_start;[m
[31m-[m
[31m-                rc = ngx_http_validate_host(&host, r->pool, 0);[m
[31m-[m
[31m-                if (rc == NGX_DECLINED) {[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                  "client sent invalid host in request line");[m
[31m-                    ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                r->headers_in.server = host;[m
[31m-            }[m
[31m-[m
[31m-            if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-[m
[31m-                if (r->headers_in.server.len == 0[m
[31m-                    && ngx_http_set_virtual_server(r, &r->headers_in.server)[m
[31m-                       == NGX_ERROR)[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_process_request(r);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                              sizeof(ngx_table_elt_t))[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "reading client request headers";[m
[31m-[m
[31m-            rev->handler = ngx_http_process_request_headers;[m
[31m-            ngx_http_process_request_headers(rev);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_AGAIN) {[m
[31m-[m
[31m-            /* there was error while a request line parsing */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          ngx_http_client_errors[rc - NGX_HTTP_CLIENT_ERROR]);[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_AGAIN: a request line parsing is still incomplete */[m
[31m-[m
[31m-        if (r->header_in->pos == r->header_in->end) {[m
[31m-[m
[31m-            rv = ngx_http_alloc_large_header_buffer(r, 1);[m
[31m-[m
[31m-            if (rv == NGX_ERROR) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (rv == NGX_DECLINED) {[m
[31m-                r->request_line.len = r->header_in->end - r->request_start;[m
[31m-                r->request_line.data = r->request_start;[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client sent too long URI");[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_process_request_uri(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (r->args_start) {[m
[31m-        r->uri.len = r->args_start - 1 - r->uri_start;[m
[31m-    } else {[m
[31m-        r->uri.len = r->uri_end - r->uri_start;[m
[31m-    }[m
[31m-[m
[31m-    if (r->complex_uri || r->quoted_uri) {[m
[31m-[m
[31m-        r->uri.data = ngx_pnalloc(r->pool, r->uri.len + 1);[m
[31m-        if (r->uri.data == NULL) {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (ngx_http_parse_complex_uri(r, cscf->merge_slashes) != NGX_OK) {[m
[31m-            r->uri.len = 0;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid request");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->uri.data = r->uri_start;[m
[31m-    }[m
[31m-[m
[31m-    r->unparsed_uri.len = r->uri_end - r->uri_start;[m
[31m-    r->unparsed_uri.data = r->uri_start;[m
[31m-[m
[31m-    r->valid_unparsed_uri = r->space_in_uri ? 0 : 1;[m
[31m-[m
[31m-    if (r->uri_ext) {[m
[31m-        if (r->args_start) {[m
[31m-            r->exten.len = r->args_start - 1 - r->uri_ext;[m
[31m-        } else {[m
[31m-            r->exten.len = r->uri_end - r->uri_ext;[m
[31m-        }[m
[31m-[m
[31m-        r->exten.data = r->uri_ext;[m
[31m-    }[m
[31m-[m
[31m-    if (r->args_start && r->uri_end > r->args_start) {[m
[31m-        r->args.len = r->uri_end - r->args_start;[m
[31m-        r->args.data = r->args_start;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    {[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    p = r->uri.data;[m
[31m-    last = r->uri.data + r->uri.len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        if (*p++ == ':') {[m
[31m-[m
[31m-            /*[m
[31m-             * this check covers "::$data", "::$index_allocation" and[m
[31m-             * ":$i30:$index_allocation"[m
[31m-             */[m
[31m-[m
[31m-            if (p < last && *p == '$') {[m
[31m-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                              "client sent unsafe win32 URI");[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = r->uri.data + r->uri.len - 1;[m
[31m-[m
[31m-    while (p > r->uri.data) {[m
[31m-[m
[31m-        if (*p == ' ') {[m
[31m-            p--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == '.') {[m
[31m-            p--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (p != r->uri.data + r->uri.len - 1) {[m
[31m-        r->uri.len = p + 1 - r->uri.data;[m
[31m-        ngx_http_set_exten(r);[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http uri: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http args: \"%V\"", &r->args);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http exten: \"%V\"", &r->exten);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_process_request_headers(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ssize_t                     n;[m
[31m-    ngx_int_t                   rc, rv;[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http process request header line");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            if (r->header_in->pos == r->header_in->end) {[m
[31m-[m
[31m-                rv = ngx_http_alloc_large_header_buffer(r, 0);[m
[31m-[m
[31m-                if (rv == NGX_ERROR) {[m
[31m-                    ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (rv == NGX_DECLINED) {[m
[31m-                    p = r->header_name_start;[m
[31m-[m
[31m-                    r->lingering_close = 1;[m
[31m-[m
[31m-                    if (p == NULL) {[m
[31m-                        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                      "client sent too large request");[m
[31m-                        ngx_http_finalize_request(r,[m
[31m-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    len = r->header_in->end - p;[m
[31m-[m
[31m-                    if (len > NGX_MAX_ERROR_STR - 300) {[m
[31m-                        len = NGX_MAX_ERROR_STR - 300;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                "client sent too long header line: \"%*s...\"",[m
[31m-                                len, r->header_name_start);[m
[31m-[m
[31m-                    ngx_http_finalize_request(r,[m
[31m-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_http_read_request_header(r);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* the host header could change the server configuration context */[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, r->header_in,[m
[31m-                                        cscf->underscores_in_headers);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            r->request_length += r->header_in->pos - r->header_name_start;[m
[31m-[m
[31m-            if (r->invalid_header && cscf->ignore_invalid_headers) {[m
[31m-[m
[31m-                /* there was error while a header line parsing */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client sent invalid header line: \"%*s\"",[m
[31m-                              r->header_end - r->header_name_start,[m
[31m-                              r->header_name_start);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->key.data = r->header_name_start;[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-            h->value.data = r->header_start;[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-            if (h->lowcase_key == NULL) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_probe_read_req_header_done(r, h);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http header: \"%V: %V\"",[m
[31m-                           &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http header done");[m
[31m-[m
[31m-            r->request_length += r->header_in->pos - r->header_name_start;[m
[31m-[m
[31m-            r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;[m
[31m-[m
[31m-            rc = ngx_http_process_request_header(r);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_process_request(r);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            /* a header line parsing is still not complete */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_HTTP_PARSE_INVALID_HEADER */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent invalid header line");[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_read_request_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    n = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        n = c->recv(c, r->header_in->last,[m
[31m-                    r->header_in->end - r->header_in->last);[m
[31m-    } else {[m
[31m-        n = NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (!rev->timer_set) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(rev, cscf->client_header_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client prematurely closed connection");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0 || n == NGX_ERROR) {[m
[31m-        c->error = 1;[m
[31m-        c->log->action = "reading client request headers";[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->header_in->last += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,[m
[31m-    ngx_uint_t request_line)[m
[31m-{[m
[31m-    u_char                    *old, *new;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http alloc large header buffer");[m
[31m-[m
[31m-    if (request_line && r->state == 0) {[m
[31m-[m
[31m-        /* the client fills up the buffer with "\r\n" */[m
[31m-[m
[31m-        r->header_in->pos = r->header_in->start;[m
[31m-        r->header_in->last = r->header_in->start;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    old = request_line ? r->request_start : r->header_name_start;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->state != 0[m
[31m-        && (size_t) (r->header_in->pos - old)[m
[31m-                                     >= cscf->large_client_header_buffers.size)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-[m
[31m-    if (hc->nfree) {[m
[31m-        b = hc->free[--hc->nfree];[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http large header free: %p %uz",[m
[31m-                       b->pos, b->end - b->last);[m
[31m-[m
[31m-    } else if (hc->nbusy < cscf->large_client_header_buffers.num) {[m
[31m-[m
[31m-        if (hc->busy == NULL) {[m
[31m-            hc->busy = ngx_palloc(r->connection->pool,[m
[31m-                  cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));[m
[31m-            if (hc->busy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->connection->pool,[m
[31m-                                cscf->large_client_header_buffers.size);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http large header alloc: %p %uz",[m
[31m-                       b->pos, b->end - b->last);[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hc->busy[hc->nbusy++] = b;[m
[31m-[m
[31m-    if (r->state == 0) {[m
[31m-        /*[m
[31m-         * r->state == 0 means that a header line was parsed successfully[m
[31m-         * and we do not need to copy incomplete header line and[m
[31m-         * to relocate the parser header pointers[m
[31m-         */[m
[31m-[m
[31m-        r->header_in = b;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http large header copy: %uz", r->header_in->pos - old);[m
[31m-[m
[31m-    new = b->start;[m
[31m-[m
[31m-    ngx_memcpy(new, old, r->header_in->pos - old);[m
[31m-[m
[31m-    b->pos = new + (r->header_in->pos - old);[m
[31m-    b->last = new + (r->header_in->pos - old);[m
[31m-[m
[31m-    if (request_line) {[m
[31m-        r->request_start = new;[m
[31m-[m
[31m-        if (r->request_end) {[m
[31m-            r->request_end = new + (r->request_end - old);[m
[31m-        }[m
[31m-[m
[31m-        r->method_end = new + (r->method_end - old);[m
[31m-[m
[31m-        r->uri_start = new + (r->uri_start - old);[m
[31m-        r->uri_end = new + (r->uri_end - old);[m
[31m-[m
[31m-        if (r->schema_start) {[m
[31m-            r->schema_start = new + (r->schema_start - old);[m
[31m-            r->schema_end = new + (r->schema_end - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->host_start) {[m
[31m-            r->host_start = new + (r->host_start - old);[m
[31m-            if (r->host_end) {[m
[31m-                r->host_end = new + (r->host_end - old);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (r->port_start) {[m
[31m-            r->port_start = new + (r->port_start - old);[m
[31m-            r->port_end = new + (r->port_end - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->uri_ext) {[m
[31m-            r->uri_ext = new + (r->uri_ext - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->args_start) {[m
[31m-            r->args_start = new + (r->args_start - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->http_protocol.data) {[m
[31m-            r->http_protocol.data = new + (r->http_protocol.data - old);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->header_name_start = new;[m
[31m-        r->header_name_end = new + (r->header_name_end - old);[m
[31m-        r->header_start = new + (r->header_start - old);[m
[31m-        r->header_end = new + (r->header_end - old);[m
[31m-    }[m
[31m-[m
[31m-    r->header_in = b;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_unique_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                  "client sent duplicate header line: \"%V: %V\", "[m
[31m-                  "previous value: \"%V: %V\"",[m
[31m-                  &h->key, &h->value, &(*ph)->key, &(*ph)->value);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_host(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_str_t  host;[m
[31m-[m
[31m-    if (r->headers_in.host == NULL) {[m
[31m-        r->headers_in.host = h;[m
[31m-    }[m
[31m-[m
[31m-    host = h->value;[m
[31m-[m
[31m-    rc = ngx_http_validate_host(&host, r->pool, 0);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent invalid host header");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.server.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.server = host;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    if (ngx_strcasestrn(h->value.data, "close", 5 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-[m
[31m-    } else if (ngx_strcasestrn(h->value.data, "keep-alive", 10 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_user_agent(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *user_agent, *msie;[m
[31m-[m
[31m-    if (r->headers_in.user_agent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.user_agent = h;[m
[31m-[m
[31m-    /* check some widespread browsers while the header is in CPU cache */[m
[31m-[m
[31m-    user_agent = h->value.data;[m
[31m-[m
[31m-    msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1);[m
[31m-[m
[31m-    if (msie && msie + 7 < user_agent + h->value.len) {[m
[31m-[m
[31m-        r->headers_in.msie = 1;[m
[31m-[m
[31m-        if (msie[6] == '.') {[m
[31m-[m
[31m-            switch (msie[5]) {[m
[31m-            case '4':[m
[31m-            case '5':[m
[31m-                r->headers_in.msie6 = 1;[m
[31m-                break;[m
[31m-            case '6':[m
[31m-                if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) {[m
[31m-                    r->headers_in.msie6 = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        /* MSIE ignores the SSL "close notify" alert */[m
[31m-        if (c->ssl) {[m
[31m-            c->ssl->no_send_shutdown = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstrn(user_agent, "Opera", 5 - 1)) {[m
[31m-        r->headers_in.opera = 1;[m
[31m-        r->headers_in.msie = 0;[m
[31m-        r->headers_in.msie6 = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->headers_in.msie && !r->headers_in.opera) {[m
[31m-[m
[31m-        if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {[m
[31m-            r->headers_in.gecko = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {[m
[31m-            r->headers_in.chrome = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)[m
[31m-                   && ngx_strstrn(user_agent, "Mac OS X", 8 - 1))[m
[31m-        {[m
[31m-            r->headers_in.safari = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {[m
[31m-            r->headers_in.konqueror = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_multi_header_lines(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t       *headers;[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    headers = (ngx_array_t *) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (headers->elts == NULL) {[m
[31m-        if (ngx_array_init(headers, r->pool, 1, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(headers);[m
[31m-    if (ph == NULL) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_process_request_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->headers_in.server.len == 0[m
[31m-        && ngx_http_set_virtual_server(r, &r->headers_in.server)[m
[31m-           == NGX_ERROR)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.host == NULL && r->http_version > NGX_HTTP_VERSION_10) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                   "client sent HTTP/1.1 request without \"Host\" header");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length_n =[m
[31m-                            ngx_atoof(r->headers_in.content_length->value.data,[m
[31m-                                      r->headers_in.content_length->value.len);[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid \"Content-Length\" header");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_TRACE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent TRACE method");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.transfer_encoding) {[m
[31m-        if (r->headers_in.transfer_encoding->value.len == 7[m
[31m-            && ngx_strncasecmp(r->headers_in.transfer_encoding->value.data,[m
[31m-                               (u_char *) "chunked", 7) == 0)[m
[31m-        {[m
[31m-            r->headers_in.content_length = NULL;[m
[31m-            r->headers_in.content_length_n = -1;[m
[31m-            r->headers_in.chunked = 1;[m
[31m-[m
[31m-        } else if (r->headers_in.transfer_encoding->value.len != 8[m
[31m-            || ngx_strncasecmp(r->headers_in.transfer_encoding->value.data,[m
[31m-                               (u_char *) "identity", 8) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent unknown \"Transfer-Encoding\": \"%V\"",[m
[31m-                          &r->headers_in.transfer_encoding->value);[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_NOT_IMPLEMENTED);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.connection_type == NGX_HTTP_CONNECTION_KEEP_ALIVE) {[m
[31m-        if (r->headers_in.keep_alive) {[m
[31m-            r->headers_in.keep_alive_n =[m
[31m-                            ngx_atotm(r->headers_in.keep_alive->value.data,[m
[31m-                                      r->headers_in.keep_alive->value.len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_process_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->http_connection->ssl) {[m
[31m-        long                      rc;[m
[31m-        X509                     *cert;[m
[31m-        ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-        if (c->ssl == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "client sent plain HTTP request to HTTPS port");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module);[m
[31m-[m
[31m-        if (sscf->verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK[m
[31m-                && (sscf->verify != 3 || !ngx_ssl_verify_error_optional(rc)))[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-[m
[31m-                ngx_ssl_remove_cached_session(sscf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-                ngx_http_finalize_request(r, NGX_HTTPS_CERT_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (sscf->verify == 1) {[m
[31m-                cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-                if (cert == NULL) {[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                  "client sent no required SSL certificate");[m
[31m-[m
[31m-                    ngx_ssl_remove_cached_session(sscf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-                    ngx_http_finalize_request(r, NGX_HTTPS_NO_CERT);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                X509_free(cert);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_reading, -1);[m
[31m-    r->stat_reading = 0;[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_writing, 1);[m
[31m-    r->stat_writing = 1;[m
[31m-#endif[m
[31m-[m
[31m-    c->read->handler = ngx_http_request_handler;[m
[31m-    c->write->handler = ngx_http_request_handler;[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    ngx_http_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc)[m
[31m-{[m
[31m-    u_char  *h, ch;[m
[31m-    size_t   i, dot_pos, host_len;[m
[31m-[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_literal,[m
[31m-        sw_rest[m
[31m-    } state;[m
[31m-[m
[31m-    dot_pos = host->len;[m
[31m-    host_len = host->len;[m
[31m-[m
[31m-    h = host->data;[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-[m
[31m-    for (i = 0; i < host->len; i++) {[m
[31m-        ch = h[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '.':[m
[31m-            if (dot_pos == i - 1) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-            dot_pos = i;[m
[31m-            break;[m
[31m-[m
[31m-        case ':':[m
[31m-            if (state == sw_usual) {[m
[31m-                host_len = i;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '[':[m
[31m-            if (i == 0) {[m
[31m-                state = sw_literal;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ']':[m
[31m-            if (state == sw_literal) {[m
[31m-                host_len = i + 1;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '\0':[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            if (ngx_path_separator(ch)) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                alloc = 1;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dot_pos == host_len - 1) {[m
[31m-        host_len--;[m
[31m-    }[m
[31m-[m
[31m-    if (host_len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc) {[m
[31m-        host->data = ngx_pnalloc(pool, host_len);[m
[31m-        if (host->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_strlow(host->data, h, host_len);[m
[31m-    }[m
[31m-[m
[31m-    host->len = host_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    cscf = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-    if (hc->ssl_servername) {[m
[31m-        if (hc->ssl_servername->len == host->len[m
[31m-            && ngx_strncmp(hc->ssl_servername->data,[m
[31m-                           host->data, host->len) == 0)[m
[31m-        {[m
[31m-#if (NGX_PCRE)[m
[31m-            if (hc->ssl_servername_regex[m
[31m-                && ngx_http_regex_exec(r, hc->ssl_servername_regex,[m
[31m-                                          hc->ssl_servername) != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-#endif[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_find_virtual_server(r->connection,[m
[31m-                                      hc->addr_conf->virtual_names,[m
[31m-                                      host, r, &cscf);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-    if (hc->ssl_servername) {[m
[31m-        ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            cscf = hc->addr_conf->default_server;[m
[31m-            rc = NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_http_get_module_srv_conf(cscf->ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-        if (sscf->verify) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client attempted to request the server name "[m
[31m-                          "different from that one was negotiated");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->srv_conf = cscf->ctx->srv_conf;[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_find_virtual_server(ngx_connection_t *c,[m
[31m-    ngx_http_virtual_names_t *virtual_names, ngx_str_t *host,[m
[31m-    ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (virtual_names == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_hash_find_combined(&virtual_names->names,[m
[31m-                                  ngx_hash_key(host->data, host->len),[m
[31m-                                  host->data, host->len);[m
[31m-[m
[31m-    if (cscf) {[m
[31m-        *cscfp = cscf;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (host->len && virtual_names->nregex) {[m
[31m-        ngx_int_t                n;[m
[31m-        ngx_uint_t               i;[m
[31m-        ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-        sn = virtual_names->regex;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-        if (r == NULL) {[m
[31m-            ngx_http_connection_t  *hc;[m
[31m-[m
[31m-            for (i = 0; i < virtual_names->nregex; i++) {[m
[31m-[m
[31m-                n = ngx_regex_exec(sn[i].regex->regex, host, NULL, 0);[m
[31m-[m
[31m-                if (n == NGX_REGEX_NO_MATCHED) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (n >= 0) {[m
[31m-                    hc = c->data;[m
[31m-                    hc->ssl_servername_regex = sn[i].regex;[m
[31m-[m
[31m-                    *cscfp = sn[i].server;[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              ngx_regex_exec_n " failed: %i "[m
[31m-                              "on \"%V\" using \"%V\"",[m
[31m-                              n, host, &sn[i].regex->name);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-#endif /* NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME */[m
[31m-[m
[31m-        for (i = 0; i < virtual_names->nregex; i++) {[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, sn[i].regex, host);[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                *cscfp = sn[i].server;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif /* NGX_PCRE */[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_request_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http run request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        r->write_event_handler(r);[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_run_posted_requests(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_posted_request_t  *pr;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (c->destroyed) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r = c->data;[m
[31m-        pr = r->main->posted_requests;[m
[31m-[m
[31m-        if (pr == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->main->posted_requests = pr->next;[m
[31m-[m
[31m-        r = pr->request;[m
[31m-[m
[31m-        ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http posted request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_post_request(ngx_http_request_t *r, ngx_http_posted_request_t *pr)[m
[31m-{[m
[31m-    ngx_http_posted_request_t  **p;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-        if (pr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-    for (p = &r->main->posted_requests; *p; p = &(*p)->next) { /* void */ }[m
[31m-[m
[31m-    *p = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_t        *pr;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http finalize request: %i, \"%V?%V\" a:%d, c:%d",[m
[31m-                   rc, &r->uri, &r->args, r == c->data, r->main->count);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_finalize_connection(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK && r->filter_finalize) {[m
[31m-        c->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->content_handler = NULL;[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main && r->post_subrequest) {[m
[31m-        ngx_http_probe_subrequest_post_start(r, rc);[m
[31m-[m
[31m-        rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc);[m
[31m-[m
[31m-        ngx_http_probe_subrequest_post_done(r, rc);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc == NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        || c->error)[m
[31m-    {[m
[31m-        if (ngx_http_post_action(r) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (r->main->blocked) {[m
[31m-            r->write_event_handler = ngx_http_request_finalizer;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_terminate_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        || rc == NGX_HTTP_CREATED[m
[31m-        || rc == NGX_HTTP_NO_CONTENT)[m
[31m-    {[m
[31m-        if (rc == NGX_HTTP_CLOSE) {[m
[31m-            ngx_http_terminate_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (r == r->main) {[m
[31m-            if (c->read->timer_set) {[m
[31m-                ngx_del_timer(c->read);[m
[31m-            }[m
[31m-[m
[31m-            if (c->write->timer_set) {[m
[31m-                ngx_del_timer(c->write);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        c->read->handler = ngx_http_request_handler;[m
[31m-        c->write->handler = ngx_http_request_handler;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-[m
[31m-        if (r->buffered || r->postponed) {[m
[31m-[m
[31m-            ngx_http_probe_subrequest_finalize_writing(r);[m
[31m-[m
[31m-            if (ngx_http_set_write_handler(r) != NGX_OK) {[m
[31m-                ngx_http_terminate_request(r, 0);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        pr = r->parent;[m
[31m-[m
[31m-        if (r == c->data) {[m
[31m-[m
[31m-            r->main->count--;[m
[31m-[m
[31m-            if (!r->logged) {[m
[31m-[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                if (clcf->log_subrequest) {[m
[31m-                    ngx_http_log_request(r);[m
[31m-                }[m
[31m-[m
[31m-                r->logged = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              "subrequest: \"%V?%V\" logged again",[m
[31m-                              &r->uri, &r->args);[m
[31m-            }[m
[31m-[m
[31m-            r->done = 1;[m
[31m-[m
[31m-            if (pr->postponed && pr->postponed->request == r) {[m
[31m-                pr->postponed = pr->postponed->next;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_probe_subrequest_done(r);[m
[31m-[m
[31m-            c->data = pr;[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            ngx_http_probe_subrequest_finalize_nonactive(r);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http finalize non-active request: \"%V?%V\"",[m
[31m-                           &r->uri, &r->args);[m
[31m-[m
[31m-            r->write_event_handler = ngx_http_request_finalizer;[m
[31m-[m
[31m-            if (r->waited) {[m
[31m-                r->done = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_probe_subrequest_wake_parent(r);[m
[31m-[m
[31m-        if (ngx_http_post_request(pr, NULL) != NGX_OK) {[m
[31m-            r->main->count++;[m
[31m-            ngx_http_terminate_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http wake parent request: \"%V?%V\"",[m
[31m-                       &pr->uri, &pr->args);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered || c->buffered || r->postponed || r->blocked) {[m
[31m-[m
[31m-        if (ngx_http_set_write_handler(r) != NGX_OK) {[m
[31m-            ngx_http_terminate_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != c->data) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "http finalize non-active request: \"%V?%V\"",[m
[31m-                      &r->uri, &r->args);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->done = 1;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    if (!r->post_action) {[m
[31m-        r->request_complete = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_post_action(r) == NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        c->write->delayed = 0;[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->eof) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_connection(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_cleanup_t    *cln;[m
[31m-    ngx_http_request_t    *mr;[m
[31m-    ngx_http_ephemeral_t  *e;[m
[31m-[m
[31m-    mr = r->main;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate request count:%d", mr->count);[m
[31m-[m
[31m-    if (rc > 0 && (mr->headers_out.status == 0 || mr->connection->sent == 0)) {[m
[31m-        mr->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    cln = mr->cleanup;[m
[31m-    mr->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate cleanup count:%d blk:%d",[m
[31m-                   mr->count, mr->blocked);[m
[31m-[m
[31m-    if (mr->write_event_handler) {[m
[31m-[m
[31m-        if (mr->blocked) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        e = ngx_http_ephemeral(mr);[m
[31m-        mr->posted_requests = NULL;[m
[31m-        mr->write_event_handler = ngx_http_terminate_handler;[m
[31m-        (void) ngx_http_post_request(mr, &e->terminal_posted_request);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_request(mr, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_terminate_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate handler count:%d", r->count);[m
[31m-[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    ngx_http_close_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_finalize_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->main->count != 1) {[m
[31m-[m
[31m-        if (r->discard_body) {[m
[31m-            r->read_event_handler = ngx_http_discarded_request_body_handler;[m
[31m-            ngx_add_timer(r->connection->read, clcf->lingering_timeout);[m
[31m-[m
[31m-            if (r->lingering_time == 0) {[m
[31m-                r->lingering_time = ngx_time()[m
[31m-                                      + (time_t) (clcf->lingering_time / 1000);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->reading_body) {[m
[31m-        r->keepalive = 0;[m
[31m-        r->lingering_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_terminate[m
[31m-         && !ngx_exiting[m
[31m-         && r->keepalive[m
[31m-         && clcf->keepalive_timeout > 0)[m
[31m-    {[m
[31m-        ngx_http_set_keepalive(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lingering_close == NGX_HTTP_LINGERING_ALWAYS[m
[31m-        || (clcf->lingering_close == NGX_HTTP_LINGERING_ON[m
[31m-            && (r->lingering_close[m
[31m-                || r->header_in->pos < r->header_in->last[m
[31m-                || r->connection->read->ready)))[m
[31m-    {[m
[31m-        ngx_http_set_lingering_close(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_write_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_WRITING_REQUEST_STATE;[m
[31m-[m
[31m-    r->read_event_handler = r->discard_body ?[m
[31m-                                ngx_http_discarded_request_body_handler:[m
[31m-                                ngx_http_test_reading;[m
[31m-    r->write_event_handler = ngx_http_writer;[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wev->ready && wev->delayed) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    if (!wev->delayed) {[m
[31m-        ngx_add_timer(wev, clcf->send_timeout);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_writer(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                        rc;[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                   "http writer handler: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "client timed out");[m
[31m-            c->timedout = 1;[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        wev->timedout = 0;[m
[31m-        wev->delayed = 0;[m
[31m-[m
[31m-        if (!wev->ready) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-                ngx_http_close_request(r, 0);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    if (wev->delayed || r->aio) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                       "http writer delayed");[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, NULL);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http writer output filter: %d, \"%V?%V\"",[m
[31m-                   rc, &r->uri, &r->args);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered || r->postponed || (r == r->main && c->buffered)) {[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                   "http writer done: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_request_finalizer(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http finalizer done: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_block_reading(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http reading blocked");[m
[31m-[m
[31m-    /* aio does not call this handler */[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT)[m
[31m-        && r->connection->read->active)[m
[31m-    {[m
[31m-        if (ngx_del_event(r->connection->read, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_test_reading(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http test reading");[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-[m
[31m-    if (r->stream) {[m
[31m-        if (c->error) {[m
[31m-            err = 0;[m
[31m-            goto closed;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!rev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-        err = rev->kq_errno;[m
[31m-[m
[31m-        goto closed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && rev->pending_eof) {[m
[31m-        socklen_t  len;[m
[31m-[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        err = 0;[m
[31m-        len = sizeof(ngx_err_t);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        goto closed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-        err = 0;[m
[31m-[m
[31m-        goto closed;[m
[31m-[m
[31m-    } else if (n == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err != NGX_EAGAIN) {[m
[31m-            rev->eof = 1;[m
[31m-            c->error = 1;[m
[31m-[m
[31m-            goto closed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* aio does not call this handler */[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && rev->active) {[m
[31m-[m
[31m-        if (ngx_del_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-closed:[m
[31m-[m
[31m-    if (err) {[m
[31m-        rev->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_set_keepalive(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  i;[m
[31m-    ngx_buf_t                 *b, *f;[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler");[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-        r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);[m
[31m-        ngx_add_timer(rev, clcf->lingering_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "closing request";[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-    b = r->header_in;[m
[31m-[m
[31m-    if (b->pos < b->last) {[m
[31m-[m
[31m-        /* the pipelined request */[m
[31m-[m
[31m-        if (b != c->buffer) {[m
[31m-[m
[31m-            /*[m
[31m-             * If the large header buffers were allocated while the previous[m
[31m-             * request processing then we do not use c->buffer for[m
[31m-             * the pipelined request (see ngx_http_create_request()).[m
[31m-             *[m
[31m-             * Now we would move the large header buffers to the free list.[m
[31m-             */[m
[31m-[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            if (hc->free == NULL) {[m
[31m-                hc->free = ngx_palloc(c->pool,[m
[31m-                  cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));[m
[31m-[m
[31m-                if (hc->free == NULL) {[m
[31m-                    ngx_http_close_request(r, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; i < hc->nbusy - 1; i++) {[m
[31m-                f = hc->busy[i];[m
[31m-                hc->free[hc->nfree++] = f;[m
[31m-                f->pos = f->start;[m
[31m-                f->last = f->start;[m
[31m-            }[m
[31m-[m
[31m-            hc->busy[0] = b;[m
[31m-            hc->nbusy = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* guard against recursive call from ngx_http_finalize_connection() */[m
[31m-    r->keepalive = 0;[m
[31m-[m
[31m-    ngx_http_free_request(r, 0);[m
[31m-[m
[31m-    c->data = hc;[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-    wev->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    if (b->pos < b->last) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "pipelined request");[m
[31m-[m
[31m-        c->log->action = "reading client pipelined request line";[m
[31m-[m
[31m-        r = ngx_http_create_request(c);[m
[31m-        if (r == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->pipeline = 1;[m
[31m-[m
[31m-        c->data = r;[m
[31m-[m
[31m-        c->sent = 0;[m
[31m-        c->destroyed = 0;[m
[31m-[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        rev->handler = ngx_http_process_request_line;[m
[31m-        ngx_post_event(rev, &ngx_posted_events);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * To keep a memory footprint as small as possible for an idle keepalive[m
[31m-     * connection we try to free c->buffer's memory if it was allocated outside[m
[31m-     * the c->pool.  The large header buffers are always allocated outside the[m
[31m-     * c->pool and are freed too.[m
[31m-     */[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-[m
[31m-        /*[m
[31m-         * the special note for ngx_http_keepalive_handler() that[m
[31m-         * c->buffer's memory was freed[m
[31m-         */[m
[31m-[m
[31m-        b->pos = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc free: %p %i",[m
[31m-                   hc->free, hc->nfree);[m
[31m-[m
[31m-    if (hc->free) {[m
[31m-        for (i = 0; i < hc->nfree; i++) {[m
[31m-            ngx_pfree(c->pool, hc->free[i]->start);[m
[31m-            hc->free[i] = NULL;[m
[31m-        }[m
[31m-[m
[31m-        hc->nfree = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc busy: %p %i",[m
[31m-                   hc->busy, hc->nbusy);[m
[31m-[m
[31m-    if (hc->busy) {[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            ngx_pfree(c->pool, hc->busy[i]->start);[m
[31m-            hc->busy[i] = NULL;[m
[31m-        }[m
[31m-[m
[31m-        hc->nbusy = 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        ngx_ssl_free_buffer(c);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rev->handler = ngx_http_keepalive_handler;[m
[31m-[m
[31m-    if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "keepalive";[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == -1) {[m
[31m-            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-        tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;[m
[31m-[m
[31m-    } else {[m
[31m-        tcp_nodelay = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (tcp_nodelay[m
[31m-        && clcf->tcp_nodelay[m
[31m-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-            == -1)[m
[31m-        {[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris returns EINVAL if a socket has been shut down */[m
[31m-            c->log_error = NGX_ERROR_IGNORE_EINVAL;[m
[31m-#endif[m
[31m-[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-[m
[31m-            c->log_error = NGX_ERROR_INFO;[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    /* if ngx_http_request_t was freed then we need some other place */[m
[31m-    r->http_state = NGX_HTTP_KEEPALIVE_STATE;[m
[31m-#endif[m
[31m-[m
[31m-    c->idle = 1;[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    ngx_add_timer(rev, clcf->keepalive_timeout);[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_post_event(rev, &ngx_posted_events);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_keepalive_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ssize_t            n;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http keepalive handler");[m
[31m-[m
[31m-    if (rev->timedout || c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        if (rev->pending_eof) {[m
[31m-            c->log->handler = NULL;[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,[m
[31m-                          "kevent() reported that client %V closed "[m
[31m-                          "keepalive connection", &c->addr_text);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl) {[m
[31m-                c->ssl->no_send_shutdown = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-    size = b->end - b->start;[m
[31m-[m
[31m-    if (b->pos == NULL) {[m
[31m-[m
[31m-        /*[m
[31m-         * The c->buffer's memory was freed by ngx_http_set_keepalive().[m
[31m-         * However, the c->buffer->start and c->buffer->end were not changed[m
[31m-         * to keep the buffer size.[m
[31m-         */[m
[31m-[m
[31m-        b->pos = ngx_palloc(c->pool, size);[m
[31m-        if (b->pos == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->start = b->pos;[m
[31m-        b->last = b->pos;[m
[31m-        b->end = b->pos + size;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * MSIE closes a keepalive connection with RST flag[m
[31m-     * so we ignore ECONNRESET here.[m
[31m-     */[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_IGNORE_ECONNRESET;[m
[31m-    ngx_set_socket_errno(0);[m
[31m-[m
[31m-    n = c->recv(c, b->last, size);[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * Like ngx_http_set_keepalive() we are trying to not hold[m
[31m-         * c->buffer's memory for a keepalive connection.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-[m
[31m-            /*[m
[31m-             * the special note that c->buffer's memory was freed[m
[31m-             */[m
[31m-[m
[31m-            b->pos = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->handler = NULL;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno,[m
[31m-                      "client %V closed keepalive connection", &c->addr_text);[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    c->log->handler = ngx_http_log_error;[m
[31m-    c->log->action = "reading client request line";[m
[31m-[m
[31m-    c->idle = 0;[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    c->data = ngx_http_create_request(c);[m
[31m-    if (c->data == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->sent = 0;[m
[31m-    c->destroyed = 0;[m
[31m-[m
[31m-    ngx_del_timer(rev);[m
[31m-[m
[31m-    rev->handler = ngx_http_process_request_line;[m
[31m-    ngx_http_process_request_line(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_set_lingering_close(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    rev->handler = ngx_http_lingering_close_handler;[m
[31m-[m
[31m-    r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);[m
[31m-    ngx_add_timer(rev, clcf->lingering_timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-    wev->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {[m
[31m-        ngx_connection_error(c, ngx_socket_errno,[m
[31m-                             ngx_shutdown_socket_n " failed");[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_http_lingering_close_handler(rev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lingering_close_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_msec_t                 timer;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    u_char                     buffer[NGX_HTTP_LINGERING_BUFFER_SIZE];[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lingering close handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();[m
[31m-    if ((ngx_msec_int_t) timer <= 0) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    do {[m
[31m-        n = c->recv(c, buffer, NGX_HTTP_LINGERING_BUFFER_SIZE);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "lingering read: %z", n);[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } while (rev->ready);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    timer *= 1000;[m
[31m-[m
[31m-    if (timer > clcf->lingering_timeout) {[m
[31m-        timer = clcf->lingering_timeout;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(rev, timer);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_empty_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http empty handler");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_request_empty_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http request empty handler");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_special(ngx_http_request_t *r, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_LAST) {[m
[31m-[m
[31m-        if (r == r->main && !r->post_action) {[m
[31m-            b->last_buf = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            b->sync = 1;[m
[31m-            b->last_in_chain = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_FLUSH) {[m
[31m-        b->flush = 1;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_post_action(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->post_action.data == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->post_action && r->uri_changes == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post action: \"%V\"", &clcf->post_action);[m
[31m-[m
[31m-    r->main->count--;[m
[31m-[m
[31m-    r->http_version = NGX_HTTP_VERSION_9;[m
[31m-    r->header_only = 1;[m
[31m-    r->post_action = 1;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    if (clcf->post_action.data[0] == '/') {[m
[31m-        ngx_http_internal_redirect(r, &clcf->post_action, NULL);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_http_named_location(r, &clcf->post_action);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r = r->main;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http request count:%d blk:%d", r->count, r->blocked);[m
[31m-[m
[31m-    if (r->count == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http request count is zero");[m
[31m-    }[m
[31m-[m
[31m-    r->count--;[m
[31m-[m
[31m-    if (r->count || r->blocked) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_v2_close_stream(r->stream, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_free_request(r, rc);[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_pool_t                *pool;[m
[31m-    struct linger              linger;[m
[31m-    ngx_http_cleanup_t        *cln;[m
[31m-    ngx_http_log_ctx_t        *ctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http close request");[m
[31m-[m
[31m-    if (r->pool == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "http request already closed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln = r->cleanup;[m
[31m-    r->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-    if (r->stat_reading) {[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_reading, -1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->stat_writing) {[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_writing, -1);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (rc > 0 && (r->headers_out.status == 0 || r->connection->sent == 0)) {[m
[31m-        r->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    log->action = "logging request";[m
[31m-[m
[31m-    ngx_http_log_request(r);[m
[31m-[m
[31m-    log->action = "closing request";[m
[31m-[m
[31m-    if (r->connection->timedout) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->reset_timedout_connection) {[m
[31m-            linger.l_onoff = 1;[m
[31m-            linger.l_linger = 0;[m
[31m-[m
[31m-            if (setsockopt(r->connection->fd, SOL_SOCKET, SO_LINGER,[m
[31m-                           (const void *) &linger, sizeof(struct linger)) == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_LINGER) failed");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the various request strings were allocated from r->pool */[m
[31m-    ctx = log->data;[m
[31m-    ctx->request = NULL;[m
[31m-[m
[31m-    r->request_line.len = 0;[m
[31m-[m
[31m-    r->connection->destroyed = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * Setting r->pool to NULL will increase probability to catch double close[m
[31m-     * of request since the request object is allocated from its own pool.[m
[31m-     */[m
[31m-[m
[31m-    pool = r->pool;[m
[31m-    r->pool = NULL;[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_handler_pt        *log_handler;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    log_handler = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.elts;[m
[31m-    n = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.nelts;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        log_handler[i](r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "close http connection: %d", c->fd);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_http_close_connection;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_http_request_t  *r;[m
[31m-    ngx_http_log_ctx_t  *ctx;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    ctx = log->data;[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", client: %V", &ctx->connection->addr_text);[m
[31m-    len -= p - buf;[m
[31m-[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    if (r) {[m
[31m-        return r->log_handler(r, ctx->current_request, p, len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_snprintf(p, len, ", server: %V",[m
[31m-                         &ctx->connection->listening->addr_text);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_error_handler(ngx_http_request_t *r, ngx_http_request_t *sr,[m
[31m-    u_char *buf, size_t len)[m
[31m-{[m
[31m-    char                      *uri_separator;[m
[31m-    u_char                    *p;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", server: %V", &cscf->server_name);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (r->request_line.data == NULL && r->request_start) {[m
[31m-        for (p = r->request_start; p < r->header_in->last; p++) {[m
[31m-            if (*p == CR || *p == LF) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        r->request_line.len = p - r->request_start;[m
[31m-        r->request_line.data = r->request_start;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_line.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", request: \"%V\"", &r->request_line);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r != sr) {[m
[31m-        p = ngx_snprintf(buf, len, ", subrequest: \"%V\"", &sr->uri);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    u = sr->upstream;[m
[31m-[m
[31m-    if (u && u->peer.name) {[m
[31m-[m
[31m-        uri_separator = "";[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        if (u->peer.sockaddr && u->peer.sockaddr->sa_family == AF_UNIX) {[m
[31m-            uri_separator = ":";[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        p = ngx_snprintf(buf, len, ", upstream: \"%V%V%s%V\"",[m
[31m-                         &u->schema, u->peer.name,[m
[31m-                         uri_separator, &u->uri);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.host) {[m
[31m-        p = ngx_snprintf(buf, len, ", host: \"%V\"",[m
[31m-                         &r->headers_in.host->value);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.referer) {[m
[31m-        p = ngx_snprintf(buf, len, ", referrer: \"%V\"",[m
[31m-                         &r->headers_in.referer->value);[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.h[m
[1mdeleted file mode 100644[m
[1mindex cfde7dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request.h[m
[1m+++ /dev/null[m
[36m@@ -1,599 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_REQUEST_H_INCLUDED_[m
[31m-#define _NGX_HTTP_REQUEST_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MAX_URI_CHANGES           10[m
[31m-#define NGX_HTTP_MAX_SUBREQUESTS           50[m
[31m-[m
[31m-/* must be 2^n */[m
[31m-#define NGX_HTTP_LC_HEADER_LEN             32[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_DISCARD_BUFFER_SIZE       4096[m
[31m-#define NGX_HTTP_LINGERING_BUFFER_SIZE     4096[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_VERSION_9                 9[m
[31m-#define NGX_HTTP_VERSION_10                1000[m
[31m-#define NGX_HTTP_VERSION_11                1001[m
[31m-#define NGX_HTTP_VERSION_20                2000[m
[31m-[m
[31m-#define NGX_HTTP_UNKNOWN                   0x0001[m
[31m-#define NGX_HTTP_GET                       0x0002[m
[31m-#define NGX_HTTP_HEAD                      0x0004[m
[31m-#define NGX_HTTP_POST                      0x0008[m
[31m-#define NGX_HTTP_PUT                       0x0010[m
[31m-#define NGX_HTTP_DELETE                    0x0020[m
[31m-#define NGX_HTTP_MKCOL                     0x0040[m
[31m-#define NGX_HTTP_COPY                      0x0080[m
[31m-#define NGX_HTTP_MOVE                      0x0100[m
[31m-#define NGX_HTTP_OPTIONS                   0x0200[m
[31m-#define NGX_HTTP_PROPFIND                  0x0400[m
[31m-#define NGX_HTTP_PROPPATCH                 0x0800[m
[31m-#define NGX_HTTP_LOCK                      0x1000[m
[31m-#define NGX_HTTP_UNLOCK                    0x2000[m
[31m-#define NGX_HTTP_PATCH                     0x4000[m
[31m-#define NGX_HTTP_TRACE                     0x8000[m
[31m-[m
[31m-#define NGX_HTTP_CONNECTION_CLOSE          1[m
[31m-#define NGX_HTTP_CONNECTION_KEEP_ALIVE     2[m
[31m-[m
[31m-[m
[31m-#define NGX_NONE                           1[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_PARSE_HEADER_DONE         1[m
[31m-[m
[31m-#define NGX_HTTP_CLIENT_ERROR              10[m
[31m-#define NGX_HTTP_PARSE_INVALID_METHOD      10[m
[31m-#define NGX_HTTP_PARSE_INVALID_REQUEST     11[m
[31m-#define NGX_HTTP_PARSE_INVALID_09_METHOD   12[m
[31m-[m
[31m-#define NGX_HTTP_PARSE_INVALID_HEADER      13[m
[31m-[m
[31m-[m
[31m-/* unused                                  1 */[m
[31m-#define NGX_HTTP_SUBREQUEST_IN_MEMORY      2[m
[31m-#define NGX_HTTP_SUBREQUEST_WAITED         4[m
[31m-#define NGX_HTTP_LOG_UNSAFE                8[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_CONTINUE                  100[m
[31m-#define NGX_HTTP_SWITCHING_PROTOCOLS       101[m
[31m-#define NGX_HTTP_PROCESSING                102[m
[31m-[m
[31m-#define NGX_HTTP_OK                        200[m
[31m-#define NGX_HTTP_CREATED                   201[m
[31m-#define NGX_HTTP_ACCEPTED                  202[m
[31m-#define NGX_HTTP_NO_CONTENT                204[m
[31m-#define NGX_HTTP_PARTIAL_CONTENT           206[m
[31m-[m
[31m-#define NGX_HTTP_SPECIAL_RESPONSE          300[m
[31m-#define NGX_HTTP_MOVED_PERMANENTLY         301[m
[31m-#define NGX_HTTP_MOVED_TEMPORARILY         302[m
[31m-#define NGX_HTTP_SEE_OTHER                 303[m
[31m-#define NGX_HTTP_NOT_MODIFIED              304[m
[31m-#define NGX_HTTP_TEMPORARY_REDIRECT        307[m
[31m-[m
[31m-#define NGX_HTTP_BAD_REQUEST               400[m
[31m-#define NGX_HTTP_UNAUTHORIZED              401[m
[31m-#define NGX_HTTP_FORBIDDEN                 403[m
[31m-#define NGX_HTTP_NOT_FOUND                 404[m
[31m-#define NGX_HTTP_NOT_ALLOWED               405[m
[31m-#define NGX_HTTP_REQUEST_TIME_OUT          408[m
[31m-#define NGX_HTTP_CONFLICT                  409[m
[31m-#define NGX_HTTP_LENGTH_REQUIRED           411[m
[31m-#define NGX_HTTP_PRECONDITION_FAILED       412[m
[31m-#define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE  413[m
[31m-#define NGX_HTTP_REQUEST_URI_TOO_LARGE     414[m
[31m-#define NGX_HTTP_UNSUPPORTED_MEDIA_TYPE    415[m
[31m-#define NGX_HTTP_RANGE_NOT_SATISFIABLE     416[m
[31m-[m
[31m-[m
[31m-/* Our own HTTP codes */[m
[31m-[m
[31m-/* The special code to close connection without any response */[m
[31m-#define NGX_HTTP_CLOSE                     444[m
[31m-[m
[31m-#define NGX_HTTP_NGINX_CODES               494[m
[31m-[m
[31m-#define NGX_HTTP_REQUEST_HEADER_TOO_LARGE  494[m
[31m-[m
[31m-#define NGX_HTTPS_CERT_ERROR               495[m
[31m-#define NGX_HTTPS_NO_CERT                  496[m
[31m-[m
[31m-/*[m
[31m- * We use the special code for the plain HTTP requests that are sent to[m
[31m- * HTTPS port to distinguish it from 4XX in an error page redirection[m
[31m- */[m
[31m-#define NGX_HTTP_TO_HTTPS                  497[m
[31m-[m
[31m-/* 498 is the canceled code for the requests with invalid host name */[m
[31m-[m
[31m-/*[m
[31m- * HTTP does not define the code for the case when a client closed[m
[31m- * the connection while we are processing its request so we introduce[m
[31m- * own code to log such situation when a client has closed the connection[m
[31m- * before we even try to send the HTTP header to it[m
[31m- */[m
[31m-#define NGX_HTTP_CLIENT_CLOSED_REQUEST     499[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_INTERNAL_SERVER_ERROR     500[m
[31m-#define NGX_HTTP_NOT_IMPLEMENTED           501[m
[31m-#define NGX_HTTP_BAD_GATEWAY               502[m
[31m-#define NGX_HTTP_SERVICE_UNAVAILABLE       503[m
[31m-#define NGX_HTTP_GATEWAY_TIME_OUT          504[m
[31m-#define NGX_HTTP_INSUFFICIENT_STORAGE      507[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LOWLEVEL_BUFFERED         0xf0[m
[31m-#define NGX_HTTP_WRITE_BUFFERED            0x10[m
[31m-#define NGX_HTTP_GZIP_BUFFERED             0x20[m
[31m-#define NGX_HTTP_SSI_BUFFERED              0x01[m
[31m-#define NGX_HTTP_SUB_BUFFERED              0x02[m
[31m-#define NGX_HTTP_COPY_BUFFERED             0x04[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_INITING_REQUEST_STATE = 0,[m
[31m-    NGX_HTTP_READING_REQUEST_STATE,[m
[31m-    NGX_HTTP_PROCESS_REQUEST_STATE,[m
[31m-[m
[31m-    NGX_HTTP_CONNECT_UPSTREAM_STATE,[m
[31m-    NGX_HTTP_WRITING_UPSTREAM_STATE,[m
[31m-    NGX_HTTP_READING_UPSTREAM_STATE,[m
[31m-[m
[31m-    NGX_HTTP_WRITING_REQUEST_STATE,[m
[31m-    NGX_HTTP_LINGERING_CLOSE_STATE,[m
[31m-    NGX_HTTP_KEEPALIVE_STATE[m
[31m-} ngx_http_state_e;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                         name;[m
[31m-    ngx_uint_t                        offset;[m
[31m-    ngx_http_header_handler_pt        handler;[m
[31m-} ngx_http_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                         name;[m
[31m-    ngx_uint_t                        offset;[m
[31m-} ngx_http_header_out_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_list_t                        headers;[m
[31m-[m
[31m-    ngx_table_elt_t                  *host;[m
[31m-    ngx_table_elt_t                  *connection;[m
[31m-    ngx_table_elt_t                  *if_modified_since;[m
[31m-    ngx_table_elt_t                  *if_unmodified_since;[m
[31m-    ngx_table_elt_t                  *if_match;[m
[31m-    ngx_table_elt_t                  *if_none_match;[m
[31m-    ngx_table_elt_t                  *user_agent;[m
[31m-    ngx_table_elt_t                  *referer;[m
[31m-    ngx_table_elt_t                  *content_length;[m
[31m-    ngx_table_elt_t                  *content_type;[m
[31m-[m
[31m-    ngx_table_elt_t                  *range;[m
[31m-    ngx_table_elt_t                  *if_range;[m
[31m-[m
[31m-    ngx_table_elt_t                  *transfer_encoding;[m
[31m-    ngx_table_elt_t                  *expect;[m
[31m-    ngx_table_elt_t                  *upgrade;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    ngx_table_elt_t                  *accept_encoding;[m
[31m-    ngx_table_elt_t                  *via;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_table_elt_t                  *authorization;[m
[31m-[m
[31m-    ngx_table_elt_t                  *keep_alive;[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    ngx_array_t                       x_forwarded_for;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    ngx_table_elt_t                  *x_real_ip;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_HEADERS)[m
[31m-    ngx_table_elt_t                  *accept;[m
[31m-    ngx_table_elt_t                  *accept_language;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    ngx_table_elt_t                  *depth;[m
[31m-    ngx_table_elt_t                  *destination;[m
[31m-    ngx_table_elt_t                  *overwrite;[m
[31m-    ngx_table_elt_t                  *date;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_str_t                         user;[m
[31m-    ngx_str_t                         passwd;[m
[31m-[m
[31m-    ngx_array_t                       cookies;[m
[31m-[m
[31m-    ngx_str_t                         server;[m
[31m-    off_t                             content_length_n;[m
[31m-    time_t                            keep_alive_n;[m
[31m-[m
[31m-    unsigned                          connection_type:2;[m
[31m-    unsigned                          chunked:1;[m
[31m-    unsigned                          msie:1;[m
[31m-    unsigned                          msie6:1;[m
[31m-    unsigned                          opera:1;[m
[31m-    unsigned                          gecko:1;[m
[31m-    unsigned                          chrome:1;[m
[31m-    unsigned                          safari:1;[m
[31m-    unsigned                          konqueror:1;[m
[31m-} ngx_http_headers_in_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_list_t                        headers;[m
[31m-[m
[31m-    ngx_uint_t                        status;[m
[31m-    ngx_str_t                         status_line;[m
[31m-[m
[31m-    ngx_table_elt_t                  *server;[m
[31m-    ngx_table_elt_t                  *date;[m
[31m-    ngx_table_elt_t                  *content_length;[m
[31m-    ngx_table_elt_t                  *content_encoding;[m
[31m-    ngx_table_elt_t                  *location;[m
[31m-    ngx_table_elt_t                  *refresh;[m
[31m-    ngx_table_elt_t                  *last_modified;[m
[31m-    ngx_table_elt_t                  *content_range;[m
[31m-    ngx_table_elt_t                  *accept_ranges;[m
[31m-    ngx_table_elt_t                  *www_authenticate;[m
[31m-    ngx_table_elt_t                  *expires;[m
[31m-    ngx_table_elt_t                  *etag;[m
[31m-[m
[31m-    ngx_str_t                        *override_charset;[m
[31m-[m
[31m-    size_t                            content_type_len;[m
[31m-    ngx_str_t                         content_type;[m
[31m-    ngx_str_t                         charset;[m
[31m-    u_char                           *content_type_lowcase;[m
[31m-    ngx_uint_t                        content_type_hash;[m
[31m-[m
[31m-    ngx_array_t                       cache_control;[m
[31m-[m
[31m-    off_t                             content_length_n;[m
[31m-    off_t                             content_offset;[m
[31m-    time_t                            date_time;[m
[31m-    time_t                            last_modified_time;[m
[31m-} ngx_http_headers_out_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_client_body_handler_pt)(ngx_http_request_t *r);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_temp_file_t                  *temp_file;[m
[31m-    ngx_chain_t                      *bufs;[m
[31m-    ngx_buf_t                        *buf;[m
[31m-    off_t                             rest;[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    off_t                             received;[m
[31m-#endif[m
[31m-    ngx_chain_t                      *free;[m
[31m-    ngx_chain_t                      *busy;[m
[31m-    ngx_http_chunked_t               *chunked;[m
[31m-    ngx_http_client_body_handler_pt   post_handler;[m
[31m-} ngx_http_request_body_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_addr_conf_s  ngx_http_addr_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_addr_conf_t             *addr_conf;[m
[31m-    ngx_http_conf_ctx_t              *conf_ctx;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-    ngx_str_t                        *ssl_servername;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_regex_t                 *ssl_servername_regex;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    ngx_buf_t                       **busy;[m
[31m-    ngx_int_t                         nbusy;[m
[31m-[m
[31m-    ngx_buf_t                       **free;[m
[31m-    ngx_int_t                         nfree;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    unsigned                          ssl:1;[m
[31m-#endif[m
[31m-    unsigned                          proxy_protocol:1;[m
[31m-} ngx_http_connection_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_cleanup_pt)(void *data);[m
[31m-[m
[31m-typedef struct ngx_http_cleanup_s  ngx_http_cleanup_t;[m
[31m-[m
[31m-struct ngx_http_cleanup_s {[m
[31m-    ngx_http_cleanup_pt               handler;[m
[31m-    void                             *data;[m
[31m-    ngx_http_cleanup_t               *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r,[m
[31m-    void *data, ngx_int_t rc);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_post_subrequest_pt       handler;[m
[31m-    void                             *data;[m
[31m-} ngx_http_post_subrequest_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_postponed_request_s  ngx_http_postponed_request_t;[m
[31m-[m
[31m-struct ngx_http_postponed_request_s {[m
[31m-    ngx_http_request_t               *request;[m
[31m-    ngx_chain_t                      *out;[m
[31m-    ngx_http_postponed_request_t     *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_posted_request_s  ngx_http_posted_request_t;[m
[31m-[m
[31m-struct ngx_http_posted_request_s {[m
[31m-    ngx_http_request_t               *request;[m
[31m-    ngx_http_posted_request_t        *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);[m
[31m-typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_request_s {[m
[31m-    uint32_t                          signature;         /* "HTTP" */[m
[31m-[m
[31m-    ngx_connection_t                 *connection;[m
[31m-[m
[31m-    void                            **ctx;[m
[31m-    void                            **main_conf;[m
[31m-    void                            **srv_conf;[m
[31m-    void                            **loc_conf;[m
[31m-[m
[31m-    ngx_http_event_handler_pt         read_event_handler;[m
[31m-    ngx_http_event_handler_pt         write_event_handler;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_cache_t                 *cache;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_t              *upstream;[m
[31m-    ngx_array_t                      *upstream_states;[m
[31m-                                         /* of ngx_http_upstream_state_t */[m
[31m-[m
[31m-    ngx_pool_t                       *pool;[m
[31m-    ngx_buf_t                        *header_in;[m
[31m-[m
[31m-    ngx_http_headers_in_t             headers_in;[m
[31m-    ngx_http_headers_out_t            headers_out;[m
[31m-[m
[31m-    ngx_http_request_body_t          *request_body;[m
[31m-[m
[31m-    time_t                            lingering_time;[m
[31m-    time_t                            start_sec;[m
[31m-    ngx_msec_t                        start_msec;[m
[31m-[m
[31m-    ngx_uint_t                        method;[m
[31m-    ngx_uint_t                        http_version;[m
[31m-[m
[31m-    ngx_str_t                         request_line;[m
[31m-    ngx_str_t                         uri;[m
[31m-    ngx_str_t                         args;[m
[31m-    ngx_str_t                         exten;[m
[31m-    ngx_str_t                         unparsed_uri;[m
[31m-[m
[31m-    ngx_str_t                         method_name;[m
[31m-    ngx_str_t                         http_protocol;[m
[31m-[m
[31m-    ngx_chain_t                      *out;[m
[31m-    ngx_http_request_t               *main;[m
[31m-    ngx_http_request_t               *parent;[m
[31m-    ngx_http_postponed_request_t     *postponed;[m
[31m-    ngx_http_post_subrequest_t       *post_subrequest;[m
[31m-    ngx_http_posted_request_t        *posted_requests;[m
[31m-[m
[31m-    ngx_int_t                         phase_handler;[m
[31m-    ngx_http_handler_pt               content_handler;[m
[31m-    ngx_uint_t                        access_code;[m
[31m-[m
[31m-    ngx_http_variable_value_t        *variables;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                        ncaptures;[m
[31m-    int                              *captures;[m
[31m-    u_char                           *captures_data;[m
[31m-#endif[m
[31m-[m
[31m-    size_t                            limit_rate;[m
[31m-    size_t                            limit_rate_after;[m
[31m-[m
[31m-    /* used to learn the Apache compatible response length without a header */[m
[31m-    size_t                            header_size;[m
[31m-[m
[31m-    off_t                             request_length;[m
[31m-[m
[31m-    ngx_uint_t                        err_status;[m
[31m-[m
[31m-    ngx_http_connection_t            *http_connection;[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    ngx_http_v2_stream_t             *stream;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_log_handler_pt           log_handler;[m
[31m-[m
[31m-    ngx_http_cleanup_t               *cleanup;[m
[31m-[m
[31m-    unsigned                          count:16;[m
[31m-    unsigned                          subrequests:8;[m
[31m-    unsigned                          blocked:8;[m
[31m-[m
[31m-    unsigned                          aio:1;[m
[31m-[m
[31m-    unsigned                          http_state:4;[m
[31m-[m
[31m-    /* URI with "/." and on Win32 with "//" */[m
[31m-    unsigned                          complex_uri:1;[m
[31m-[m
[31m-    /* URI with "%" */[m
[31m-    unsigned                          quoted_uri:1;[m
[31m-[m
[31m-    /* URI with "+" */[m
[31m-    unsigned                          plus_in_uri:1;[m
[31m-[m
[31m-    /* URI with " " */[m
[31m-    unsigned                          space_in_uri:1;[m
[31m-[m
[31m-    unsigned                          invalid_header:1;[m
[31m-[m
[31m-    unsigned                          add_uri_to_alias:1;[m
[31m-    unsigned                          valid_location:1;[m
[31m-    unsigned                          valid_unparsed_uri:1;[m
[31m-    unsigned                          uri_changed:1;[m
[31m-    unsigned                          uri_changes:4;[m
[31m-[m
[31m-    unsigned                          request_body_in_single_buf:1;[m
[31m-    unsigned                          request_body_in_file_only:1;[m
[31m-    unsigned                          request_body_in_persistent_file:1;[m
[31m-    unsigned                          request_body_in_clean_file:1;[m
[31m-    unsigned                          request_body_file_group_access:1;[m
[31m-    unsigned                          request_body_file_log_level:3;[m
[31m-    unsigned                          request_body_no_buffering:1;[m
[31m-[m
[31m-    unsigned                          subrequest_in_memory:1;[m
[31m-    unsigned                          waited:1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    unsigned                          cached:1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    unsigned                          gzip_tested:1;[m
[31m-    unsigned                          gzip_ok:1;[m
[31m-    unsigned                          gzip_vary:1;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                          proxy:1;[m
[31m-    unsigned                          bypass_cache:1;[m
[31m-    unsigned                          no_cache:1;[m
[31m-[m
[31m-    /*[m
[31m-     * instead of using the request context data in[m
[31m-     * ngx_http_limit_conn_module and ngx_http_limit_req_module[m
[31m-     * we use the single bits in the request structure[m
[31m-     */[m
[31m-    unsigned                          limit_conn_set:1;[m
[31m-    unsigned                          limit_req_set:1;[m
[31m-[m
[31m-#if 0[m
[31m-    unsigned                          cacheable:1;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                          pipeline:1;[m
[31m-    unsigned                          chunked:1;[m
[31m-    unsigned                          header_only:1;[m
[31m-    unsigned                          keepalive:1;[m
[31m-    unsigned                          lingering_close:1;[m
[31m-    unsigned                          discard_body:1;[m
[31m-    unsigned                          reading_body:1;[m
[31m-    unsigned                          internal:1;[m
[31m-    unsigned                          error_page:1;[m
[31m-    unsigned                          filter_finalize:1;[m
[31m-    unsigned                          post_action:1;[m
[31m-    unsigned                          request_complete:1;[m
[31m-    unsigned                          request_output:1;[m
[31m-    unsigned                          header_sent:1;[m
[31m-    unsigned                          expect_tested:1;[m
[31m-    unsigned                          root_tested:1;[m
[31m-    unsigned                          done:1;[m
[31m-    unsigned                          logged:1;[m
[31m-[m
[31m-    unsigned                          buffered:4;[m
[31m-[m
[31m-    unsigned                          main_filter_need_in_memory:1;[m
[31m-    unsigned                          filter_need_in_memory:1;[m
[31m-    unsigned                          filter_need_temporary:1;[m
[31m-    unsigned                          allow_ranges:1;[m
[31m-    unsigned                          subrequest_ranges:1;[m
[31m-    unsigned                          single_range:1;[m
[31m-    unsigned                          disable_not_modified:1;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    unsigned                          stat_reading:1;[m
[31m-    unsigned                          stat_writing:1;[m
[31m-#endif[m
[31m-[m
[31m-    /* used to parse HTTP headers */[m
[31m-[m
[31m-    ngx_uint_t                        state;[m
[31m-[m
[31m-    ngx_uint_t                        header_hash;[m
[31m-    ngx_uint_t                        lowcase_index;[m
[31m-    u_char                            lowcase_header[NGX_HTTP_LC_HEADER_LEN];[m
[31m-[m
[31m-    u_char                           *header_name_start;[m
[31m-    u_char                           *header_name_end;[m
[31m-    u_char                           *header_start;[m
[31m-    u_char                           *header_end;[m
[31m-[m
[31m-    /*[m
[31m-     * a memory that can be reused after parsing a request line[m
[31m-     * via ngx_http_ephemeral_t[m
[31m-     */[m
[31m-[m
[31m-    u_char                           *uri_start;[m
[31m-    u_char                           *uri_end;[m
[31m-    u_char                           *uri_ext;[m
[31m-    u_char                           *args_start;[m
[31m-    u_char                           *request_start;[m
[31m-    u_char                           *request_end;[m
[31m-    u_char                           *method_end;[m
[31m-    u_char                           *schema_start;[m
[31m-    u_char                           *schema_end;[m
[31m-    u_char                           *host_start;[m
[31m-    u_char                           *host_end;[m
[31m-    u_char                           *port_start;[m
[31m-    u_char                           *port_end;[m
[31m-[m
[31m-    unsigned                          http_minor:16;[m
[31m-    unsigned                          http_major:16;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_posted_request_t         terminal_posted_request;[m
[31m-} ngx_http_ephemeral_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_http_ephemeral(r)  (void *) (&r->uri_start)[m
[31m-[m
[31m-[m
[31m-extern ngx_http_header_t       ngx_http_headers_in[];[m
[31m-extern ngx_http_header_out_t   ngx_http_headers_out[];[m
[31m-[m
[31m-[m
[31m-#define ngx_http_set_log_request(log, r)                                      \[m
[31m-    ((ngx_http_log_ctx_t *) log->data)->current_request = r[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request_body.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request_body.c[m
[1mdeleted file mode 100644[m
[1mindex c032109..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request_body.c[m
[1m+++ /dev/null[m
[36m@@ -1,1164 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_write_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_read_discarded_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_discard_request_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_buf_t *b);[m
[31m-static ngx_int_t ngx_http_test_expect(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_request_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_request_body_length_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_request_body_chunked_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_read_client_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler)[m
[31m-{[m
[31m-    size_t                     preread;[m
[31m-    ssize_t                    size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    if (r != r->main || r->request_body || r->discard_body) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        rc = ngx_http_v2_read_request_body(r, post_handler);[m
[31m-        goto done;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_test_expect(r) != NGX_OK) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (rb == NULL) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     rb->bufs = NULL;[m
[31m-     *     rb->buf = NULL;[m
[31m-     *     rb->free = NULL;[m
[31m-     *     rb->busy = NULL;[m
[31m-     *     rb->chunked = NULL;[m
[31m-     */[m
[31m-[m
[31m-    rb->rest = -1;[m
[31m-    rb->post_handler = post_handler;[m
[31m-[m
[31m-    r->request_body = rb;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n < 0 && !r->headers_in.chunked) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    preread = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (preread) {[m
[31m-[m
[31m-        /* there is the pre-read part of the request body */[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http client request body preread %uz", preread);[m
[31m-[m
[31m-        out.buf = r->header_in;[m
[31m-        out.next = NULL;[m
[31m-[m
[31m-        rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        r->request_length += preread - (r->header_in->last - r->header_in->pos);[m
[31m-[m
[31m-        if (!r->headers_in.chunked[m
[31m-            && rb->rest > 0[m
[31m-            && rb->rest <= (off_t) (r->header_in->end - r->header_in->last))[m
[31m-        {[m
[31m-            /* the whole request body may be placed in r->header_in */[m
[31m-[m
[31m-            b = ngx_calloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            b->temporary = 1;[m
[31m-            b->start = r->header_in->pos;[m
[31m-            b->pos = r->header_in->pos;[m
[31m-            b->last = r->header_in->last;[m
[31m-            b->end = r->header_in->end;[m
[31m-[m
[31m-            rb->buf = b;[m
[31m-[m
[31m-            r->read_event_handler = ngx_http_read_client_request_body_handler;[m
[31m-            r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-            rc = ngx_http_do_read_client_request_body(r);[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* set rb->rest */[m
[31m-[m
[31m-        if (ngx_http_request_body_filter(r, NULL) != NGX_OK) {[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest == 0) {[m
[31m-        /* the whole request body was pre-read */[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest < 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "negative request body rest");[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    size = clcf->client_body_buffer_size;[m
[31m-    size += size >> 2;[m
[31m-[m
[31m-    /* TODO: honor r->request_body_in_single_buf */[m
[31m-[m
[31m-    if (!r->headers_in.chunked && rb->rest < size) {[m
[31m-        size = (ssize_t) rb->rest;[m
[31m-[m
[31m-        if (r->request_body_in_single_buf) {[m
[31m-            size += preread;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = clcf->client_body_buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    rb->buf = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (rb->buf == NULL) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_read_client_request_body_handler;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (r->request_body_no_buffering[m
[31m-        && (rc == NGX_OK || rc == NGX_AGAIN))[m
[31m-    {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->request_body_no_buffering = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-            r->reading_body = 1;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        post_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        r->main->count--;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_read_unbuffered_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        rc = ngx_http_v2_read_unbuffered_request_body(r);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->reading_body = 0;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (r->connection->read->timedout) {[m
[31m-        r->connection->timedout = 1;[m
[31m-        return NGX_HTTP_REQUEST_TIME_OUT;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->reading_body = 0;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_read_client_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (r->connection->read->timedout) {[m
[31m-        r->connection->timedout = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_do_read_client_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                      rest;[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http read client request body");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        for ( ;; ) {[m
[31m-            if (rb->buf->last == rb->buf->end) {[m
[31m-[m
[31m-                if (rb->buf->pos != rb->buf->last) {[m
[31m-[m
[31m-                    /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                    out.buf = rb->buf;[m
[31m-                    out.next = NULL;[m
[31m-[m
[31m-                    rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    /* update chains */[m
[31m-[m
[31m-                    rc = ngx_http_request_body_filter(r, NULL);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (rb->busy != NULL) {[m
[31m-                    if (r->request_body_no_buffering) {[m
[31m-                        if (c->read->timer_set) {[m
[31m-                            ngx_del_timer(c->read);[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rb->buf->pos = rb->buf->start;[m
[31m-                rb->buf->last = rb->buf->start;[m
[31m-            }[m
[31m-[m
[31m-            size = rb->buf->end - rb->buf->last;[m
[31m-            rest = rb->rest - (rb->buf->last - rb->buf->pos);[m
[31m-[m
[31m-            if ((off_t) size > rest) {[m
[31m-                size = (size_t) rest;[m
[31m-            }[m
[31m-[m
[31m-            n = c->recv(c, rb->buf->last, size);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http client request body recv %z", n);[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client prematurely closed connection");[m
[31m-            }[m
[31m-[m
[31m-            if (n == 0 || n == NGX_ERROR) {[m
[31m-                c->error = 1;[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            rb->buf->last += n;[m
[31m-            r->request_length += n;[m
[31m-[m
[31m-            if (n == rest) {[m
[31m-                /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                out.buf = rb->buf;[m
[31m-                out.next = NULL;[m
[31m-[m
[31m-                rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (rb->rest == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rb->buf->last < rb->buf->end) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http client request body rest %O", rb->rest);[m
[31m-[m
[31m-        if (rb->rest == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (!c->read->ready) {[m
[31m-[m
[31m-            if (r->request_body_no_buffering[m
[31m-                && rb->buf->pos != rb->buf->last)[m
[31m-            {[m
[31m-                /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                out.buf = rb->buf;[m
[31m-                out.next = NULL;[m
[31m-[m
[31m-                rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(c->read, clcf->client_body_timeout);[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        rb->post_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_probe_read_body_done(r);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_write_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_chain_t               *cl, *ln;[m
[31m-    ngx_temp_file_t           *tf;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http write client request body, bufs %p", rb->bufs);[m
[31m-[m
[31m-    if (rb->temp_file == NULL) {[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = clcf->client_body_temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->warn = "a client request body is buffered to a temporary file";[m
[31m-        tf->log_level = r->request_body_file_log_level;[m
[31m-        tf->persistent = r->request_body_in_persistent_file;[m
[31m-        tf->clean = r->request_body_in_clean_file;[m
[31m-[m
[31m-        if (r->request_body_file_group_access) {[m
[31m-            tf->access = 0660;[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = tf;[m
[31m-[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            /* empty body with r->request_body_in_file_only */[m
[31m-[m
[31m-            if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                     tf->persistent, tf->clean, tf->access)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->bufs == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_chain_to_temp_file(rb->temp_file, rb->bufs);[m
[31m-[m
[31m-    /* TODO: n == 0 or not complete and level event */[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rb->temp_file->offset += n;[m
[31m-[m
[31m-    /* mark all buffers as written */[m
[31m-[m
[31m-    for (cl = rb->bufs; cl; /* void */) {[m
[31m-[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-[m
[31m-        ln = cl;[m
[31m-        cl = cl->next;[m
[31m-        ngx_free_chain(r->pool, ln);[m
[31m-    }[m
[31m-[m
[31m-    rb->bufs = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_discard_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t       size;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    if (r != r->main || r->discard_body || r->request_body) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        r->stream->skip_data = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_test_expect(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rev = r->connection->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http set discard body");[m
[31m-[m
[31m-    if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    size = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (size || r->headers_in.chunked) {[m
[31m-        rc = ngx_http_discard_request_body_filter(r, r->header_in);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_discarded_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->lingering_close = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_discarded_request_body_handler;[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->count++;[m
[31m-    r->discard_body = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_discarded_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_msec_t                 timer;[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->lingering_time) {[m
[31m-        timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();[m
[31m-[m
[31m-        if ((ngx_msec_int_t) timer <= 0) {[m
[31m-            r->discard_body = 0;[m
[31m-            r->lingering_close = 0;[m
[31m-            ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        timer = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_discarded_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->discard_body = 0;[m
[31m-        r->lingering_close = 0;[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (timer) {[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        timer *= 1000;[m
[31m-[m
[31m-        if (timer > clcf->lingering_timeout) {[m
[31m-            timer = clcf->lingering_timeout;[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(rev, timer);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_read_discarded_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t     size;[m
[31m-    ssize_t    n;[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_buf_t  b;[m
[31m-    u_char     buffer[NGX_HTTP_DISCARD_BUFFER_SIZE];[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http read discarded body");[m
[31m-[m
[31m-    ngx_memzero(&b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    b.temporary = 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (r->headers_in.content_length_n == 0) {[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!r->connection->read->ready) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        size = (size_t) ngx_min(r->headers_in.content_length_n,[m
[31m-                                NGX_HTTP_DISCARD_BUFFER_SIZE);[m
[31m-[m
[31m-        n = r->connection->recv(r->connection, buffer, size);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            r->connection->error = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b.pos = buffer;[m
[31m-        b.last = buffer + n;[m
[31m-[m
[31m-        rc = ngx_http_discard_request_body_filter(r, &b);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_discard_request_body_filter(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    size_t                    size;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_http_request_body_t  *rb;[m
[31m-[m
[31m-    if (r->headers_in.chunked) {[m
[31m-[m
[31m-        rb = r->request_body;[m
[31m-[m
[31m-        if (rb == NULL) {[m
[31m-[m
[31m-            rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-            if (rb == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));[m
[31m-            if (rb->chunked == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->request_body = rb;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            rc = ngx_http_parse_chunked(r, b, rb->chunked);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a chunk has been parsed successfully */[m
[31m-[m
[31m-                size = b->last - b->pos;[m
[31m-[m
[31m-                if ((off_t) size > rb->chunked->size) {[m
[31m-                    b->pos += (size_t) rb->chunked->size;[m
[31m-                    rb->chunked->size = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    rb->chunked->size -= size;[m
[31m-                    b->pos = b->last;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-[m
[31m-                /* a whole response has been parsed successfully */[m
[31m-[m
[31m-                r->headers_in.content_length_n = 0;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                /* set amount of data we want to see next time */[m
[31m-[m
[31m-                r->headers_in.content_length_n = rb->chunked->length;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* invalid */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "client sent invalid chunked body");[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = b->last - b->pos;[m
[31m-[m
[31m-        if ((off_t) size > r->headers_in.content_length_n) {[m
[31m-            b->pos += (size_t) r->headers_in.content_length_n;[m
[31m-            r->headers_in.content_length_n = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            b->pos = b->last;[m
[31m-            r->headers_in.content_length_n -= size;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_test_expect(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_str_t  *expect;[m
[31m-[m
[31m-    if (r->expect_tested[m
[31m-        || r->headers_in.expect == NULL[m
[31m-        || r->http_version < NGX_HTTP_VERSION_11)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->expect_tested = 1;[m
[31m-[m
[31m-    expect = &r->headers_in.expect->value;[m
[31m-[m
[31m-    if (expect->len != sizeof("100-continue") - 1[m
[31m-        || ngx_strncasecmp(expect->data, (u_char *) "100-continue",[m
[31m-                           sizeof("100-continue") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "send 100 Continue");[m
[31m-[m
[31m-    n = r->connection->send(r->connection,[m
[31m-                            (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF,[m
[31m-                            sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1);[m
[31m-[m
[31m-    if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* we assume that such small packet should be send successfully */[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    if (r->headers_in.chunked) {[m
[31m-        return ngx_http_request_body_chunked_filter(r, in);[m
[31m-[m
[31m-    } else {[m
[31m-        return ngx_http_request_body_length_filter(r, in);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_length_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl, *tl, *out, **ll;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->rest == -1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http request body content length filter");[m
[31m-[m
[31m-        rb->rest = r->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        if (rb->rest == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;[m
[31m-        b->start = cl->buf->pos;[m
[31m-        b->pos = cl->buf->pos;[m
[31m-        b->last = cl->buf->last;[m
[31m-        b->end = cl->buf->end;[m
[31m-        b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-        size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-        if ((off_t) size < rb->rest) {[m
[31m-            cl->buf->pos = cl->buf->last;[m
[31m-            rb->rest -= size;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf->pos += (size_t) rb->rest;[m
[31m-            rb->rest = 0;[m
[31m-            b->last = cl->buf->pos;[m
[31m-            b->last_buf = 1;[m
[31m-        }[m
[31m-[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_read_client_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_chunked_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl, *out, *tl, **ll;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->rest == -1) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http request body chunked filter");[m
[31m-[m
[31m-        rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));[m
[31m-        if (rb->chunked == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.content_length_n = 0;[m
[31m-        rb->rest = 3;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                           "http body chunked buf "[m
[31m-                           "t:%d f:%d %p, pos %p, size: %z file: %O, size: %O",[m
[31m-                           cl->buf->temporary, cl->buf->in_file,[m
[31m-                           cl->buf->start, cl->buf->pos,[m
[31m-                           cl->buf->last - cl->buf->pos,[m
[31m-                           cl->buf->file_pos,[m
[31m-                           cl->buf->file_last - cl->buf->file_pos);[m
[31m-[m
[31m-            rc = ngx_http_parse_chunked(r, cl->buf, rb->chunked);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a chunk has been parsed successfully */[m
[31m-[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                if (clcf->client_max_body_size[m
[31m-                    && clcf->client_max_body_size[m
[31m-                       - r->headers_in.content_length_n < rb->chunked->size)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "client intended to send too large chunked "[m
[31m-                                  "body: %O+%O bytes",[m
[31m-                                  r->headers_in.content_length_n,[m
[31m-                                  rb->chunked->size);[m
[31m-[m
[31m-                    r->lingering_close = 1;[m
[31m-[m
[31m-                    return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;[m
[31m-                }[m
[31m-[m
[31m-                tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-                if (tl == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = tl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->temporary = 1;[m
[31m-                b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;[m
[31m-                b->start = cl->buf->pos;[m
[31m-                b->pos = cl->buf->pos;[m
[31m-                b->last = cl->buf->last;[m
[31m-                b->end = cl->buf->end;[m
[31m-                b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-                *ll = tl;[m
[31m-                ll = &tl->next;[m
[31m-[m
[31m-                size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-                if ((off_t) size > rb->chunked->size) {[m
[31m-                    cl->buf->pos += (size_t) rb->chunked->size;[m
[31m-                    r->headers_in.content_length_n += rb->chunked->size;[m
[31m-                    rb->chunked->size = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    rb->chunked->size -= size;[m
[31m-                    r->headers_in.content_length_n += size;[m
[31m-                    cl->buf->pos = cl->buf->last;[m
[31m-                }[m
[31m-[m
[31m-                b->last = cl->buf->pos;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-[m
[31m-                /* a whole response has been parsed successfully */[m
[31m-[m
[31m-                rb->rest = 0;[m
[31m-[m
[31m-                tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-                if (tl == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = tl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->last_buf = 1;[m
[31m-[m
[31m-                *ll = tl;[m
[31m-                ll = &tl->next;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                /* set rb->rest, amount of data we want to see next time */[m
[31m-[m
[31m-                rb->rest = rb->chunked->length;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* invalid */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "client sent invalid chunked body");[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_read_client_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_request_body_save_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "http body old buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "http body new buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: coalesce neighbouring buffers */[m
[31m-[m
[31m-    if (ngx_chain_add_copy(r->pool, &rb->bufs, in) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest > 0) {[m
[31m-[m
[31m-        if (rb->buf && rb->buf->last == rb->buf->end[m
[31m-            && ngx_http_write_request_body(r) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rb->rest == 0 */[m
[31m-[m
[31m-    if (rb->temp_file || r->request_body_in_file_only) {[m
[31m-[m
[31m-        if (ngx_http_write_request_body(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rb->temp_file->file.offset != 0) {[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->in_file = 1;[m
[31m-            b->file_last = rb->temp_file->file.offset;[m
[31m-            b->file = &rb->temp_file->file;[m
[31m-[m
[31m-            rb->bufs = cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request_body.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request_body.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 0641329..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_request_body.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,1161 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_write_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_read_discarded_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_discard_request_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_buf_t *b);[m
[31m-static ngx_int_t ngx_http_test_expect(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_request_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_request_body_length_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_request_body_chunked_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_read_client_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler)[m
[31m-{[m
[31m-    size_t                     preread;[m
[31m-    ssize_t                    size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    if (r != r->main || r->request_body || r->discard_body) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        rc = ngx_http_v2_read_request_body(r, post_handler);[m
[31m-        goto done;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_test_expect(r) != NGX_OK) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (rb == NULL) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     rb->bufs = NULL;[m
[31m-     *     rb->buf = NULL;[m
[31m-     *     rb->free = NULL;[m
[31m-     *     rb->busy = NULL;[m
[31m-     *     rb->chunked = NULL;[m
[31m-     */[m
[31m-[m
[31m-    rb->rest = -1;[m
[31m-    rb->post_handler = post_handler;[m
[31m-[m
[31m-    r->request_body = rb;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n < 0 && !r->headers_in.chunked) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    preread = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (preread) {[m
[31m-[m
[31m-        /* there is the pre-read part of the request body */[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http client request body preread %uz", preread);[m
[31m-[m
[31m-        out.buf = r->header_in;[m
[31m-        out.next = NULL;[m
[31m-[m
[31m-        rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        r->request_length += preread - (r->header_in->last - r->header_in->pos);[m
[31m-[m
[31m-        if (!r->headers_in.chunked[m
[31m-            && rb->rest > 0[m
[31m-            && rb->rest <= (off_t) (r->header_in->end - r->header_in->last))[m
[31m-        {[m
[31m-            /* the whole request body may be placed in r->header_in */[m
[31m-[m
[31m-            b = ngx_calloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            b->temporary = 1;[m
[31m-            b->start = r->header_in->pos;[m
[31m-            b->pos = r->header_in->pos;[m
[31m-            b->last = r->header_in->last;[m
[31m-            b->end = r->header_in->end;[m
[31m-[m
[31m-            rb->buf = b;[m
[31m-[m
[31m-            r->read_event_handler = ngx_http_read_client_request_body_handler;[m
[31m-            r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-            rc = ngx_http_do_read_client_request_body(r);[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* set rb->rest */[m
[31m-[m
[31m-        if (ngx_http_request_body_filter(r, NULL) != NGX_OK) {[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest == 0) {[m
[31m-        /* the whole request body was pre-read */[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest < 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "negative request body rest");[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    size = clcf->client_body_buffer_size;[m
[31m-    size += size >> 2;[m
[31m-[m
[31m-    /* TODO: honor r->request_body_in_single_buf */[m
[31m-[m
[31m-    if (!r->headers_in.chunked && rb->rest < size) {[m
[31m-        size = (ssize_t) rb->rest;[m
[31m-[m
[31m-        if (r->request_body_in_single_buf) {[m
[31m-            size += preread;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = clcf->client_body_buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    rb->buf = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (rb->buf == NULL) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_read_client_request_body_handler;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (r->request_body_no_buffering[m
[31m-        && (rc == NGX_OK || rc == NGX_AGAIN))[m
[31m-    {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->request_body_no_buffering = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-            r->reading_body = 1;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        post_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        r->main->count--;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_read_unbuffered_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        rc = ngx_http_v2_read_unbuffered_request_body(r);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->reading_body = 0;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (r->connection->read->timedout) {[m
[31m-        r->connection->timedout = 1;[m
[31m-        return NGX_HTTP_REQUEST_TIME_OUT;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->reading_body = 0;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_read_client_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (r->connection->read->timedout) {[m
[31m-        r->connection->timedout = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_do_read_client_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                      rest;[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http read client request body");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        for ( ;; ) {[m
[31m-            if (rb->buf->last == rb->buf->end) {[m
[31m-[m
[31m-                if (rb->buf->pos != rb->buf->last) {[m
[31m-[m
[31m-                    /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                    out.buf = rb->buf;[m
[31m-                    out.next = NULL;[m
[31m-[m
[31m-                    rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    /* update chains */[m
[31m-[m
[31m-                    rc = ngx_http_request_body_filter(r, NULL);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (rb->busy != NULL) {[m
[31m-                    if (r->request_body_no_buffering) {[m
[31m-                        if (c->read->timer_set) {[m
[31m-                            ngx_del_timer(c->read);[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rb->buf->pos = rb->buf->start;[m
[31m-                rb->buf->last = rb->buf->start;[m
[31m-            }[m
[31m-[m
[31m-            size = rb->buf->end - rb->buf->last;[m
[31m-            rest = rb->rest - (rb->buf->last - rb->buf->pos);[m
[31m-[m
[31m-            if ((off_t) size > rest) {[m
[31m-                size = (size_t) rest;[m
[31m-            }[m
[31m-[m
[31m-            n = c->recv(c, rb->buf->last, size);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http client request body recv %z", n);[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client prematurely closed connection");[m
[31m-            }[m
[31m-[m
[31m-            if (n == 0 || n == NGX_ERROR) {[m
[31m-                c->error = 1;[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            rb->buf->last += n;[m
[31m-            r->request_length += n;[m
[31m-[m
[31m-            if (n == rest) {[m
[31m-                /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                out.buf = rb->buf;[m
[31m-                out.next = NULL;[m
[31m-[m
[31m-                rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (rb->rest == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rb->buf->last < rb->buf->end) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http client request body rest %O", rb->rest);[m
[31m-[m
[31m-        if (rb->rest == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (!c->read->ready) {[m
[31m-[m
[31m-            if (r->request_body_no_buffering[m
[31m-                && rb->buf->pos != rb->buf->last)[m
[31m-            {[m
[31m-                /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                out.buf = rb->buf;[m
[31m-                out.next = NULL;[m
[31m-[m
[31m-                rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(c->read, clcf->client_body_timeout);[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        rb->post_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_write_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_chain_t               *cl, *ln;[m
[31m-    ngx_temp_file_t           *tf;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http write client request body, bufs %p", rb->bufs);[m
[31m-[m
[31m-    if (rb->temp_file == NULL) {[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = clcf->client_body_temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->warn = "a client request body is buffered to a temporary file";[m
[31m-        tf->log_level = r->request_body_file_log_level;[m
[31m-        tf->persistent = r->request_body_in_persistent_file;[m
[31m-        tf->clean = r->request_body_in_clean_file;[m
[31m-[m
[31m-        if (r->request_body_file_group_access) {[m
[31m-            tf->access = 0660;[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = tf;[m
[31m-[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            /* empty body with r->request_body_in_file_only */[m
[31m-[m
[31m-            if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                     tf->persistent, tf->clean, tf->access)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->bufs == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_chain_to_temp_file(rb->temp_file, rb->bufs);[m
[31m-[m
[31m-    /* TODO: n == 0 or not complete and level event */[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rb->temp_file->offset += n;[m
[31m-[m
[31m-    /* mark all buffers as written */[m
[31m-[m
[31m-    for (cl = rb->bufs; cl; /* void */) {[m
[31m-[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-[m
[31m-        ln = cl;[m
[31m-        cl = cl->next;[m
[31m-        ngx_free_chain(r->pool, ln);[m
[31m-    }[m
[31m-[m
[31m-    rb->bufs = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_discard_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t       size;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    if (r != r->main || r->discard_body || r->request_body) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        r->stream->skip_data = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_test_expect(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rev = r->connection->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http set discard body");[m
[31m-[m
[31m-    if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    size = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (size || r->headers_in.chunked) {[m
[31m-        rc = ngx_http_discard_request_body_filter(r, r->header_in);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_discarded_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->lingering_close = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_discarded_request_body_handler;[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->count++;[m
[31m-    r->discard_body = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_discarded_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_msec_t                 timer;[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->lingering_time) {[m
[31m-        timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();[m
[31m-[m
[31m-        if ((ngx_msec_int_t) timer <= 0) {[m
[31m-            r->discard_body = 0;[m
[31m-            r->lingering_close = 0;[m
[31m-            ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        timer = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_discarded_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->discard_body = 0;[m
[31m-        r->lingering_close = 0;[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (timer) {[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        timer *= 1000;[m
[31m-[m
[31m-        if (timer > clcf->lingering_timeout) {[m
[31m-            timer = clcf->lingering_timeout;[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(rev, timer);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_read_discarded_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t     size;[m
[31m-    ssize_t    n;[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_buf_t  b;[m
[31m-    u_char     buffer[NGX_HTTP_DISCARD_BUFFER_SIZE];[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http read discarded body");[m
[31m-[m
[31m-    ngx_memzero(&b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    b.temporary = 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (r->headers_in.content_length_n == 0) {[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!r->connection->read->ready) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        size = (size_t) ngx_min(r->headers_in.content_length_n,[m
[31m-                                NGX_HTTP_DISCARD_BUFFER_SIZE);[m
[31m-[m
[31m-        n = r->connection->recv(r->connection, buffer, size);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            r->connection->error = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b.pos = buffer;[m
[31m-        b.last = buffer + n;[m
[31m-[m
[31m-        rc = ngx_http_discard_request_body_filter(r, &b);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_discard_request_body_filter(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    size_t                    size;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_http_request_body_t  *rb;[m
[31m-[m
[31m-    if (r->headers_in.chunked) {[m
[31m-[m
[31m-        rb = r->request_body;[m
[31m-[m
[31m-        if (rb == NULL) {[m
[31m-[m
[31m-            rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-            if (rb == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));[m
[31m-            if (rb->chunked == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->request_body = rb;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            rc = ngx_http_parse_chunked(r, b, rb->chunked);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a chunk has been parsed successfully */[m
[31m-[m
[31m-                size = b->last - b->pos;[m
[31m-[m
[31m-                if ((off_t) size > rb->chunked->size) {[m
[31m-                    b->pos += (size_t) rb->chunked->size;[m
[31m-                    rb->chunked->size = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    rb->chunked->size -= size;[m
[31m-                    b->pos = b->last;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-[m
[31m-                /* a whole response has been parsed successfully */[m
[31m-[m
[31m-                r->headers_in.content_length_n = 0;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                /* set amount of data we want to see next time */[m
[31m-[m
[31m-                r->headers_in.content_length_n = rb->chunked->length;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* invalid */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "client sent invalid chunked body");[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = b->last - b->pos;[m
[31m-[m
[31m-        if ((off_t) size > r->headers_in.content_length_n) {[m
[31m-            b->pos += (size_t) r->headers_in.content_length_n;[m
[31m-            r->headers_in.content_length_n = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            b->pos = b->last;[m
[31m-            r->headers_in.content_length_n -= size;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_test_expect(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_str_t  *expect;[m
[31m-[m
[31m-    if (r->expect_tested[m
[31m-        || r->headers_in.expect == NULL[m
[31m-        || r->http_version < NGX_HTTP_VERSION_11)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->expect_tested = 1;[m
[31m-[m
[31m-    expect = &r->headers_in.expect->value;[m
[31m-[m
[31m-    if (expect->len != sizeof("100-continue") - 1[m
[31m-        || ngx_strncasecmp(expect->data, (u_char *) "100-continue",[m
[31m-                           sizeof("100-continue") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "send 100 Continue");[m
[31m-[m
[31m-    n = r->connection->send(r->connection,[m
[31m-                            (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF,[m
[31m-                            sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1);[m
[31m-[m
[31m-    if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* we assume that such small packet should be send successfully */[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    if (r->headers_in.chunked) {[m
[31m-        return ngx_http_request_body_chunked_filter(r, in);[m
[31m-[m
[31m-    } else {[m
[31m-        return ngx_http_request_body_length_filter(r, in);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_length_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl, *tl, *out, **ll;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->rest == -1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http request body content length filter");[m
[31m-[m
[31m-        rb->rest = r->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        if (rb->rest == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;[m
[31m-        b->start = cl->buf->pos;[m
[31m-        b->pos = cl->buf->pos;[m
[31m-        b->last = cl->buf->last;[m
[31m-        b->end = cl->buf->end;[m
[31m-        b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-        size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-        if ((off_t) size < rb->rest) {[m
[31m-            cl->buf->pos = cl->buf->last;[m
[31m-            rb->rest -= size;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf->pos += (size_t) rb->rest;[m
[31m-            rb->rest = 0;[m
[31m-            b->last = cl->buf->pos;[m
[31m-            b->last_buf = 1;[m
[31m-        }[m
[31m-[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_read_client_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_chunked_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl, *out, *tl, **ll;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->rest == -1) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http request body chunked filter");[m
[31m-[m
[31m-        rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));[m
[31m-        if (rb->chunked == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.content_length_n = 0;[m
[31m-        rb->rest = 3;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                           "http body chunked buf "[m
[31m-                           "t:%d f:%d %p, pos %p, size: %z file: %O, size: %O",[m
[31m-                           cl->buf->temporary, cl->buf->in_file,[m
[31m-                           cl->buf->start, cl->buf->pos,[m
[31m-                           cl->buf->last - cl->buf->pos,[m
[31m-                           cl->buf->file_pos,[m
[31m-                           cl->buf->file_last - cl->buf->file_pos);[m
[31m-[m
[31m-            rc = ngx_http_parse_chunked(r, cl->buf, rb->chunked);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a chunk has been parsed successfully */[m
[31m-[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                if (clcf->client_max_body_size[m
[31m-                    && clcf->client_max_body_size[m
[31m-                       - r->headers_in.content_length_n < rb->chunked->size)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "client intended to send too large chunked "[m
[31m-                                  "body: %O+%O bytes",[m
[31m-                                  r->headers_in.content_length_n,[m
[31m-                                  rb->chunked->size);[m
[31m-[m
[31m-                    r->lingering_close = 1;[m
[31m-[m
[31m-                    return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;[m
[31m-                }[m
[31m-[m
[31m-                tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-                if (tl == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = tl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->temporary = 1;[m
[31m-                b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;[m
[31m-                b->start = cl->buf->pos;[m
[31m-                b->pos = cl->buf->pos;[m
[31m-                b->last = cl->buf->last;[m
[31m-                b->end = cl->buf->end;[m
[31m-                b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-                *ll = tl;[m
[31m-                ll = &tl->next;[m
[31m-[m
[31m-                size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-                if ((off_t) size > rb->chunked->size) {[m
[31m-                    cl->buf->pos += (size_t) rb->chunked->size;[m
[31m-                    r->headers_in.content_length_n += rb->chunked->size;[m
[31m-                    rb->chunked->size = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    rb->chunked->size -= size;[m
[31m-                    r->headers_in.content_length_n += size;[m
[31m-                    cl->buf->pos = cl->buf->last;[m
[31m-                }[m
[31m-[m
[31m-                b->last = cl->buf->pos;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-[m
[31m-                /* a whole response has been parsed successfully */[m
[31m-[m
[31m-                rb->rest = 0;[m
[31m-[m
[31m-                tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-                if (tl == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = tl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->last_buf = 1;[m
[31m-[m
[31m-                *ll = tl;[m
[31m-                ll = &tl->next;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                /* set rb->rest, amount of data we want to see next time */[m
[31m-[m
[31m-                rb->rest = rb->chunked->length;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* invalid */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "client sent invalid chunked body");[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_read_client_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_request_body_save_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "http body old buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "http body new buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: coalesce neighbouring buffers */[m
[31m-[m
[31m-    if (ngx_chain_add_copy(r->pool, &rb->bufs, in) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest > 0) {[m
[31m-[m
[31m-        if (rb->buf && rb->buf->last == rb->buf->end[m
[31m-            && ngx_http_write_request_body(r) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rb->rest == 0 */[m
[31m-[m
[31m-    if (rb->temp_file || r->request_body_in_file_only) {[m
[31m-[m
[31m-        if (ngx_http_write_request_body(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rb->temp_file->file.offset != 0) {[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->in_file = 1;[m
[31m-            b->file_last = rb->temp_file->file.offset;[m
[31m-            b->file = &rb->temp_file->file;[m
[31m-[m
[31m-            rb->bufs = cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_script.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_script.c[m
[1mdeleted file mode 100644[m
[1mindex bff9525..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_script.c[m
[1m+++ /dev/null[m
[36m@@ -1,1754 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_script_init_arrays(ngx_http_script_compile_t *sc);[m
[31m-static ngx_int_t ngx_http_script_done(ngx_http_script_compile_t *sc);[m
[31m-static ngx_int_t ngx_http_script_add_copy_code(ngx_http_script_compile_t *sc,[m
[31m-    ngx_str_t *value, ngx_uint_t last);[m
[31m-static ngx_int_t ngx_http_script_add_var_code(ngx_http_script_compile_t *sc,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_script_add_args_code(ngx_http_script_compile_t *sc);[m
[31m-#if (NGX_PCRE)[m
[31m-static ngx_int_t ngx_http_script_add_capture_code(ngx_http_script_compile_t *sc,[m
[31m-    ngx_uint_t n);[m
[31m-#endif[m
[31m-static ngx_int_t[m
[31m-    ngx_http_script_add_full_name_code(ngx_http_script_compile_t *sc);[m
[31m-static size_t ngx_http_script_full_name_len_code(ngx_http_script_engine_t *e);[m
[31m-static void ngx_http_script_full_name_code(ngx_http_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_script_exit  (u_char *) &ngx_http_script_exit_code[m
[31m-[m
[31m-static uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_flush_complex_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *val)[m
[31m-{[m
[31m-    ngx_uint_t *index;[m
[31m-[m
[31m-    index = val->flushes;[m
[31m-[m
[31m-    if (index) {[m
[31m-        while (*index != (ngx_uint_t) -1) {[m
[31m-[m
[31m-            if (r->variables[*index].no_cacheable) {[m
[31m-                r->variables[*index].valid = 0;[m
[31m-                r->variables[*index].not_found = 0;[m
[31m-            }[m
[31m-[m
[31m-            index++;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_complex_value(ngx_http_request_t *r, ngx_http_complex_value_t *val,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    size_t                        len;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-[m
[31m-    if (val->lengths == NULL) {[m
[31m-        *value = val->value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_script_flush_complex_value(r, val);[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    e.ip = val->lengths;[m
[31m-    e.request = r;[m
[31m-    e.flushed = 1;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-        len += lcode(&e);[m
[31m-    }[m
[31m-[m
[31m-    value->len = len;[m
[31m-    value->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (value->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    e.ip = val->values;[m
[31m-    e.pos = value->data;[m
[31m-    e.buf = *value;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-        code((ngx_http_script_engine_t *) &e);[m
[31m-    }[m
[31m-[m
[31m-    *value = e.buf;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv)[m
[31m-{[m
[31m-    ngx_str_t                  *v;[m
[31m-    ngx_uint_t                  i, n, nv, nc;[m
[31m-    ngx_array_t                 flushes, lengths, values, *pf, *pl, *pv;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    v = ccv->value;[m
[31m-[m
[31m-    nv = 0;[m
[31m-    nc = 0;[m
[31m-[m
[31m-    for (i = 0; i < v->len; i++) {[m
[31m-        if (v->data[i] == '$') {[m
[31m-            if (v->data[i + 1] >= '1' && v->data[i + 1] <= '9') {[m
[31m-                nc++;[m
[31m-[m
[31m-            } else {[m
[31m-                nv++;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((v->len == 0 || v->data[0] != '$')[m
[31m-        && (ccv->conf_prefix || ccv->root_prefix))[m
[31m-    {[m
[31m-        if (ngx_conf_full_name(ccv->cf->cycle, v, ccv->conf_prefix) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccv->conf_prefix = 0;[m
[31m-        ccv->root_prefix = 0;[m
[31m-    }[m
[31m-[m
[31m-    ccv->complex_value->value = *v;[m
[31m-    ccv->complex_value->flushes = NULL;[m
[31m-    ccv->complex_value->lengths = NULL;[m
[31m-    ccv->complex_value->values = NULL;[m
[31m-[m
[31m-    if (nv == 0 && nc == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = nv + 1;[m
[31m-[m
[31m-    if (ngx_array_init(&flushes, ccv->cf->pool, n, sizeof(ngx_uint_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = nv * (2 * sizeof(ngx_http_script_copy_code_t)[m
[31m-                  + sizeof(ngx_http_script_var_code_t))[m
[31m-        + sizeof(uintptr_t);[m
[31m-[m
[31m-    if (ngx_array_init(&lengths, ccv->cf->pool, n, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = (nv * (2 * sizeof(ngx_http_script_copy_code_t)[m
[31m-                   + sizeof(ngx_http_script_var_code_t))[m
[31m-                + sizeof(uintptr_t)[m
[31m-                + v->len[m
[31m-                + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-    if (ngx_array_init(&values, ccv->cf->pool, n, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pf = &flushes;[m
[31m-    pl = &lengths;[m
[31m-    pv = &values;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = ccv->cf;[m
[31m-    sc.source = v;[m
[31m-    sc.flushes = &pf;[m
[31m-    sc.lengths = &pl;[m
[31m-    sc.values = &pv;[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-    sc.zero = ccv->zero;[m
[31m-    sc.conf_prefix = ccv->conf_prefix;[m
[31m-    sc.root_prefix = ccv->root_prefix;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flushes.nelts) {[m
[31m-        ccv->complex_value->flushes = flushes.elts;[m
[31m-        ccv->complex_value->flushes[flushes.nelts] = (ngx_uint_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    ccv->complex_value->lengths = lengths.elts;[m
[31m-    ccv->complex_value->values = values.elts;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_http_complex_value_t          **cv;[m
[31m-    ngx_http_compile_complex_value_t    ccv;[m
[31m-[m
[31m-    cv = (ngx_http_complex_value_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*cv != NULL) {[m
[31m-        return "duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *cv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-    if (*cv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = *cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_test_predicates(ngx_http_request_t *r, ngx_array_t *predicates)[m
[31m-{[m
[31m-    ngx_str_t                  val;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_complex_value_t  *cv;[m
[31m-[m
[31m-    if (predicates == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cv = predicates->elts;[m
[31m-[m
[31m-    for (i = 0; i < predicates->nelts; i++) {[m
[31m-        if (ngx_http_complex_value(r, &cv[i], &val) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (val.len && (val.len != 1 || val.data[0] != '0')) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_set_predicate_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_uint_t                          i;[m
[31m-    ngx_array_t                       **a;[m
[31m-    ngx_http_complex_value_t           *cv;[m
[31m-    ngx_http_compile_complex_value_t    ccv;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NGX_CONF_UNSET_PTR) {[m
[31m-        *a = ngx_array_create(cf->pool, 1, sizeof(ngx_http_complex_value_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        cv = ngx_array_push(*a);[m
[31m-        if (cv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[i];[m
[31m-        ccv.complex_value = cv;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_http_script_variables_count(ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_uint_t  i, n;[m
[31m-[m
[31m-    for (n = 0, i = 0; i < value->len; i++) {[m
[31m-        if (value->data[i] == '$') {[m
[31m-            n++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_script_compile(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    u_char       ch;[m
[31m-    ngx_str_t    name;[m
[31m-    ngx_uint_t   i, bracket;[m
[31m-[m
[31m-    if (ngx_http_script_init_arrays(sc) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < sc->source->len; /* void */ ) {[m
[31m-[m
[31m-        name.len = 0;[m
[31m-[m
[31m-        if (sc->source->data[i] == '$') {[m
[31m-[m
[31m-            if (++i == sc->source->len) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            {[m
[31m-            ngx_uint_t  n;[m
[31m-[m
[31m-            if (sc->source->data[i] >= '1' && sc->source->data[i] <= '9') {[m
[31m-[m
[31m-                n = sc->source->data[i] - '0';[m
[31m-[m
[31m-                if (sc->captures_mask & (1 << n)) {[m
[31m-                    sc->dup_capture = 1;[m
[31m-                }[m
[31m-[m
[31m-                sc->captures_mask |= 1 << n;[m
[31m-[m
[31m-                if (ngx_http_script_add_capture_code(sc, n) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                i++;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (sc->source->data[i] == '{') {[m
[31m-                bracket = 1;[m
[31m-[m
[31m-                if (++i == sc->source->len) {[m
[31m-                    goto invalid_variable;[m
[31m-                }[m
[31m-[m
[31m-                name.data = &sc->source->data[i];[m
[31m-[m
[31m-            } else {[m
[31m-                bracket = 0;[m
[31m-                name.data = &sc->source->data[i];[m
[31m-            }[m
[31m-[m
[31m-            for ( /* void */ ; i < sc->source->len; i++, name.len++) {[m
[31m-                ch = sc->source->data[i];[m
[31m-[m
[31m-                if (ch == '}' && bracket) {[m
[31m-                    i++;[m
[31m-                    bracket = 0;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if ((ch >= 'A' && ch <= 'Z')[m
[31m-                    || (ch >= 'a' && ch <= 'z')[m
[31m-                    || (ch >= '0' && ch <= '9')[m
[31m-                    || ch == '_')[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (bracket) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0,[m
[31m-                                   "the closing bracket in \"%V\" "[m
[31m-                                   "variable is missing", &name);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (name.len == 0) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            sc->variables++;[m
[31m-[m
[31m-            if (ngx_http_script_add_var_code(sc, &name) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (sc->source->data[i] == '?' && sc->compile_args) {[m
[31m-            sc->args = 1;[m
[31m-            sc->compile_args = 0;[m
[31m-[m
[31m-            if (ngx_http_script_add_args_code(sc) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        name.data = &sc->source->data[i];[m
[31m-[m
[31m-        while (i < sc->source->len) {[m
[31m-[m
[31m-            if (sc->source->data[i] == '$') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (sc->source->data[i] == '?') {[m
[31m-[m
[31m-                sc->args = 1;[m
[31m-[m
[31m-                if (sc->compile_args) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-            name.len++;[m
[31m-        }[m
[31m-[m
[31m-        sc->size += name.len;[m
[31m-[m
[31m-        if (ngx_http_script_add_copy_code(sc, &name, (i == sc->source->len))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_script_done(sc);[m
[31m-[m
[31m-invalid_variable:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, "invalid variable name");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value,[m
[31m-    void *code_lengths, size_t len, void *code_values)[m
[31m-{[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-    ngx_http_core_main_conf_t    *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    for (i = 0; i < cmcf->variables.nelts; i++) {[m
[31m-        if (r->variables[i].no_cacheable) {[m
[31m-            r->variables[i].valid = 0;[m
[31m-            r->variables[i].not_found = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    e.ip = code_lengths;[m
[31m-    e.request = r;[m
[31m-    e.flushed = 1;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-        len += lcode(&e);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    value->len = len;[m
[31m-    value->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (value->data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    e.ip = code_values;[m
[31m-    e.pos = value->data;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-        code((ngx_http_script_engine_t *) &e);[m
[31m-    }[m
[31m-[m
[31m-    return e.pos;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r,[m
[31m-    ngx_array_t *indices)[m
[31m-{[m
[31m-    ngx_uint_t  n, *index;[m
[31m-[m
[31m-    if (indices) {[m
[31m-        index = indices->elts;[m
[31m-        for (n = 0; n < indices->nelts; n++) {[m
[31m-            if (r->variables[index[n]].no_cacheable) {[m
[31m-                r->variables[index[n]].valid = 0;[m
[31m-                r->variables[index[n]].not_found = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_init_arrays(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    ngx_uint_t   n;[m
[31m-[m
[31m-    if (sc->flushes && *sc->flushes == NULL) {[m
[31m-        n = sc->variables ? sc->variables : 1;[m
[31m-        *sc->flushes = ngx_array_create(sc->cf->pool, n, sizeof(ngx_uint_t));[m
[31m-        if (*sc->flushes == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (*sc->lengths == NULL) {[m
[31m-        n = sc->variables * (2 * sizeof(ngx_http_script_copy_code_t)[m
[31m-                             + sizeof(ngx_http_script_var_code_t))[m
[31m-            + sizeof(uintptr_t);[m
[31m-[m
[31m-        *sc->lengths = ngx_array_create(sc->cf->pool, n, 1);[m
[31m-        if (*sc->lengths == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (*sc->values == NULL) {[m
[31m-        n = (sc->variables * (2 * sizeof(ngx_http_script_copy_code_t)[m
[31m-                              + sizeof(ngx_http_script_var_code_t))[m
[31m-                + sizeof(uintptr_t)[m
[31m-                + sc->source->len[m
[31m-                + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        *sc->values = ngx_array_create(sc->cf->pool, n, 1);[m
[31m-        if (*sc->values == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sc->variables = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_done(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    ngx_str_t    zero;[m
[31m-    uintptr_t   *code;[m
[31m-[m
[31m-    if (sc->zero) {[m
[31m-[m
[31m-        zero.len = 1;[m
[31m-        zero.data = (u_char *) "\0";[m
[31m-[m
[31m-        if (ngx_http_script_add_copy_code(sc, &zero, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (sc->conf_prefix || sc->root_prefix) {[m
[31m-        if (ngx_http_script_add_full_name_code(sc) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (sc->complete_lengths) {[m
[31m-        code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL);[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (sc->complete_values) {[m
[31m-        code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t),[m
[31m-                                        &sc->main);[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes, size_t size)[m
[31m-{[m
[31m-    if (*codes == NULL) {[m
[31m-        *codes = ngx_array_create(pool, 256, 1);[m
[31m-        if (*codes == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_array_push_n(*codes, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code)[m
[31m-{[m
[31m-    u_char  *elts, **p;[m
[31m-    void    *new;[m
[31m-[m
[31m-    elts = codes->elts;[m
[31m-[m
[31m-    new = ngx_array_push_n(codes, size);[m
[31m-    if (new == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (code) {[m
[31m-        if (elts != codes->elts) {[m
[31m-            p = code;[m
[31m-            *p += (u_char *) codes->elts - elts;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return new;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_copy_code(ngx_http_script_compile_t *sc, ngx_str_t *value,[m
[31m-    ngx_uint_t last)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size, len, zero;[m
[31m-    ngx_http_script_copy_code_t  *code;[m
[31m-[m
[31m-    zero = (sc->zero && last);[m
[31m-    len = value->len + zero;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t), NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-    code->len = len;[m
[31m-[m
[31m-    size = (sizeof(ngx_http_script_copy_code_t) + len + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values, size, &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_script_copy_code;[m
[31m-    code->len = len;[m
[31m-[m
[31m-    p = ngx_cpymem((u_char *) code + sizeof(ngx_http_script_copy_code_t),[m
[31m-                   value->data, value->len);[m
[31m-[m
[31m-    if (zero) {[m
[31m-        *p = '\0';[m
[31m-        sc->zero = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_script_copy_len_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_copy_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_copy_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_copy_code_t);[m
[31m-[m
[31m-    return code->len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_copy_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    ngx_http_script_copy_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_copy_code_t *) e->ip;[m
[31m-[m
[31m-    p = e->pos;[m
[31m-[m
[31m-    if (!e->skip) {[m
[31m-        e->pos = ngx_copy(p, e->ip + sizeof(ngx_http_script_copy_code_t),[m
[31m-                          code->len);[m
[31m-    }[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_copy_code_t)[m
[31m-          + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1));[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script copy: \"%*s\"", e->pos - p, p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_var_code(ngx_http_script_compile_t *sc, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_int_t                    index, *p;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(sc->cf, name);[m
[31m-[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sc->flushes) {[m
[31m-        p = ngx_array_push(*sc->flushes);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *p = index;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_script_var_code_t), NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_script_code_pt) ngx_http_script_copy_var_len_code;[m
[31m-    code->index = (uintptr_t) index;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values,[m
[31m-                                    sizeof(ngx_http_script_var_code_t),[m
[31m-                                    &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_script_copy_var_code;[m
[31m-    code->index = (uintptr_t) index;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_variable_value_t   *value;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_code_t);[m
[31m-[m
[31m-    if (e->flushed) {[m
[31m-        value = ngx_http_get_indexed_variable(e->request, code->index);[m
[31m-[m
[31m-    } else {[m
[31m-        value = ngx_http_get_flushed_variable(e->request, code->index);[m
[31m-    }[m
[31m-[m
[31m-    if (value && !value->not_found) {[m
[31m-        return value->len;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_copy_var_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_http_variable_value_t   *value;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_code_t);[m
[31m-[m
[31m-    if (!e->skip) {[m
[31m-[m
[31m-        if (e->flushed) {[m
[31m-            value = ngx_http_get_indexed_variable(e->request, code->index);[m
[31m-[m
[31m-        } else {[m
[31m-            value = ngx_http_get_flushed_variable(e->request, code->index);[m
[31m-        }[m
[31m-[m
[31m-        if (value && !value->not_found) {[m
[31m-            p = e->pos;[m
[31m-            e->pos = ngx_copy(p, value->data, value->len);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP,[m
[31m-                           e->request->connection->log, 0,[m
[31m-                           "http script var: \"%*s\"", e->pos - p, p);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_args_code(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    uintptr_t   *code;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) ngx_http_script_mark_args_code;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t), &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) ngx_http_script_start_args_code;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_script_mark_args_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    e->is_args = 1;[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_start_args_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script args");[m
[31m-[m
[31m-    e->is_args = 1;[m
[31m-    e->args = e->pos;[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    size_t                         len;[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_uint_t                     n;[m
[31m-    ngx_http_request_t            *r;[m
[31m-    ngx_http_script_engine_t       le;[m
[31m-    ngx_http_script_len_code_pt    lcode;[m
[31m-    ngx_http_script_regex_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_regex_code_t *) e->ip;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http script regex: \"%V\"", &code->name);[m
[31m-[m
[31m-    if (code->uri) {[m
[31m-        e->line = r->uri;[m
[31m-    } else {[m
[31m-        e->sp--;[m
[31m-        e->line.len = e->sp->len;[m
[31m-        e->line.data = e->sp->data;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_regex_exec(r, code->regex, &e->line);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                          "\"%V\" does not match \"%V\"",[m
[31m-                          &code->name, &e->line);[m
[31m-        }[m
[31m-[m
[31m-        r->ncaptures = 0;[m
[31m-[m
[31m-        if (code->test) {[m
[31m-            if (code->negative_test) {[m
[31m-                e->sp->len = 1;[m
[31m-                e->sp->data = (u_char *) "1";[m
[31m-[m
[31m-            } else {[m
[31m-                e->sp->len = 0;[m
[31m-                e->sp->data = (u_char *) "";[m
[31m-            }[m
[31m-[m
[31m-            e->sp++;[m
[31m-[m
[31m-            e->ip += sizeof(ngx_http_script_regex_code_t);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        e->ip += code->next;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                      "\"%V\" matches \"%V\"", &code->name, &e->line);[m
[31m-    }[m
[31m-[m
[31m-    if (code->test) {[m
[31m-        if (code->negative_test) {[m
[31m-            e->sp->len = 0;[m
[31m-            e->sp->data = (u_char *) "";[m
[31m-[m
[31m-        } else {[m
[31m-            e->sp->len = 1;[m
[31m-            e->sp->data = (u_char *) "1";[m
[31m-        }[m
[31m-[m
[31m-        e->sp++;[m
[31m-[m
[31m-        e->ip += sizeof(ngx_http_script_regex_code_t);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (code->status) {[m
[31m-        e->status = code->status;[m
[31m-[m
[31m-        if (!code->redirect) {[m
[31m-            e->ip = ngx_http_script_exit;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (code->uri) {[m
[31m-        r->internal = 1;[m
[31m-        r->valid_unparsed_uri = 0;[m
[31m-[m
[31m-        if (code->break_cycle) {[m
[31m-            r->valid_location = 0;[m
[31m-            r->uri_changed = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            r->uri_changed = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (code->lengths == NULL) {[m
[31m-        e->buf.len = code->size;[m
[31m-[m
[31m-        if (code->uri) {[m
[31m-            if (r->ncaptures && (r->quoted_uri || r->plus_in_uri)) {[m
[31m-                e->buf.len += 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len,[m
[31m-                                                 NGX_ESCAPE_ARGS);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for (n = 2; n < r->ncaptures; n += 2) {[m
[31m-            e->buf.len += r->captures[n + 1] - r->captures[n];[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        le.ip = code->lengths->elts;[m
[31m-        le.line = e->line;[m
[31m-        le.request = r;[m
[31m-        le.quote = code->redirect;[m
[31m-[m
[31m-        len = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            len += lcode(&le);[m
[31m-        }[m
[31m-[m
[31m-        e->buf.len = len;[m
[31m-    }[m
[31m-[m
[31m-    if (code->add_args && r->args.len) {[m
[31m-        e->buf.len += r->args.len + 1;[m
[31m-    }[m
[31m-[m
[31m-    e->buf.data = ngx_pnalloc(r->pool, e->buf.len);[m
[31m-    if (e->buf.data == NULL) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    e->quote = code->redirect;[m
[31m-[m
[31m-    e->pos = e->buf.data;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_regex_code_t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                            *dst, *src;[m
[31m-    ngx_http_request_t                *r;[m
[31m-    ngx_http_script_regex_end_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_regex_end_code_t *) e->ip;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    e->quote = 0;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http script regex end");[m
[31m-[m
[31m-    if (code->redirect) {[m
[31m-[m
[31m-        dst = e->buf.data;[m
[31m-        src = e->buf.data;[m
[31m-[m
[31m-        ngx_unescape_uri(&dst, &src, e->pos - e->buf.data,[m
[31m-                         NGX_UNESCAPE_REDIRECT);[m
[31m-[m
[31m-        if (src < e->pos) {[m
[31m-            dst = ngx_movemem(dst, src, e->pos - src);[m
[31m-        }[m
[31m-[m
[31m-        e->pos = dst;[m
[31m-[m
[31m-        if (code->add_args && r->args.len) {[m
[31m-            *e->pos++ = (u_char) (code->args ? '&' : '?');[m
[31m-            e->pos = ngx_copy(e->pos, r->args.data, r->args.len);[m
[31m-        }[m
[31m-[m
[31m-        e->buf.len = e->pos - e->buf.data;[m
[31m-[m
[31m-        if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                          "rewritten redirect: \"%V\"", &e->buf);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            e->ip = ngx_http_script_exit;[m
[31m-            e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.location->hash = 1;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-        r->headers_out.location->value = e->buf;[m
[31m-[m
[31m-        e->ip += sizeof(ngx_http_script_regex_end_code_t);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (e->args) {[m
[31m-        e->buf.len = e->args - e->buf.data;[m
[31m-[m
[31m-        if (code->add_args && r->args.len) {[m
[31m-            *e->pos++ = '&';[m
[31m-            e->pos = ngx_copy(e->pos, r->args.data, r->args.len);[m
[31m-        }[m
[31m-[m
[31m-        r->args.len = e->pos - e->args;[m
[31m-        r->args.data = e->args;[m
[31m-[m
[31m-        e->args = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        e->buf.len = e->pos - e->buf.data;[m
[31m-[m
[31m-        if (!code->add_args) {[m
[31m-            r->args.len = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                      "rewritten data: \"%V\", args: \"%V\"",[m
[31m-                      &e->buf, &r->args);[m
[31m-    }[m
[31m-[m
[31m-    if (code->uri) {[m
[31m-        r->uri = e->buf;[m
[31m-[m
[31m-        if (r->uri.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "the rewritten URI has a zero length");[m
[31m-            e->ip = ngx_http_script_exit;[m
[31m-            e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_exten(r);[m
[31m-    }[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_regex_end_code_t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_capture_code(ngx_http_script_compile_t *sc, ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_http_script_copy_capture_code_t  *code;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_capture_code_t),[m
[31m-                                    NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_script_code_pt)[m
[31m-                      ngx_http_script_copy_capture_len_code;[m
[31m-    code->n = 2 * n;[m
[31m-[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values,[m
[31m-                                    sizeof(ngx_http_script_copy_capture_code_t),[m
[31m-                                    &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_script_copy_capture_code;[m
[31m-    code->n = 2 * n;[m
[31m-[m
[31m-    if (sc->ncaptures < n) {[m
[31m-        sc->ncaptures = n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    int                                  *cap;[m
[31m-    u_char                               *p;[m
[31m-    ngx_uint_t                            n;[m
[31m-    ngx_http_request_t                   *r;[m
[31m-    ngx_http_script_copy_capture_code_t  *code;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    code = (ngx_http_script_copy_capture_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_copy_capture_code_t);[m
[31m-[m
[31m-    n = code->n;[m
[31m-[m
[31m-    if (n < r->ncaptures) {[m
[31m-[m
[31m-        cap = r->captures;[m
[31m-[m
[31m-        if ((e->is_args || e->quote)[m
[31m-            && (e->request->quoted_uri || e->request->plus_in_uri))[m
[31m-        {[m
[31m-            p = r->captures_data;[m
[31m-[m
[31m-            return cap[n + 1] - cap[n][m
[31m-                   + 2 * ngx_escape_uri(NULL, &p[cap[n]], cap[n + 1] - cap[n],[m
[31m-                                        NGX_ESCAPE_ARGS);[m
[31m-        } else {[m
[31m-            return cap[n + 1] - cap[n];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    int                                  *cap;[m
[31m-    u_char                               *p, *pos;[m
[31m-    ngx_uint_t                            n;[m
[31m-    ngx_http_request_t                   *r;[m
[31m-    ngx_http_script_copy_capture_code_t  *code;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    code = (ngx_http_script_copy_capture_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_copy_capture_code_t);[m
[31m-[m
[31m-    n = code->n;[m
[31m-[m
[31m-    pos = e->pos;[m
[31m-[m
[31m-    if (n < r->ncaptures) {[m
[31m-[m
[31m-        cap = r->captures;[m
[31m-        p = r->captures_data;[m
[31m-[m
[31m-        if ((e->is_args || e->quote)[m
[31m-            && (e->request->quoted_uri || e->request->plus_in_uri))[m
[31m-        {[m
[31m-            e->pos = (u_char *) ngx_escape_uri(pos, &p[cap[n]],[m
[31m-                                               cap[n + 1] - cap[n],[m
[31m-                                               NGX_ESCAPE_ARGS);[m
[31m-        } else {[m
[31m-            e->pos = ngx_copy(pos, &p[cap[n]], cap[n + 1] - cap[n]);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script capture: \"%*s\"", e->pos - pos, pos);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_full_name_code(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    ngx_http_script_full_name_code_t  *code;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_script_full_name_code_t),[m
[31m-                                    NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_script_code_pt) ngx_http_script_full_name_len_code;[m
[31m-    code->conf_prefix = sc->conf_prefix;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values,[m
[31m-                                    sizeof(ngx_http_script_full_name_code_t),[m
[31m-                                    &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_script_full_name_code;[m
[31m-    code->conf_prefix = sc->conf_prefix;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_script_full_name_len_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_full_name_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_full_name_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_full_name_code_t);[m
[31m-[m
[31m-    return code->conf_prefix ? ngx_cycle->conf_prefix.len:[m
[31m-                               ngx_cycle->prefix.len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_script_full_name_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_full_name_code_t  *code;[m
[31m-[m
[31m-    ngx_str_t  value, *prefix;[m
[31m-[m
[31m-    code = (ngx_http_script_full_name_code_t *) e->ip;[m
[31m-[m
[31m-    value.data = e->buf.data;[m
[31m-    value.len = e->pos - e->buf.data;[m
[31m-[m
[31m-    prefix = code->conf_prefix ? (ngx_str_t *) &ngx_cycle->conf_prefix:[m
[31m-                                 (ngx_str_t *) &ngx_cycle->prefix;[m
[31m-[m
[31m-    if (ngx_get_full_name(e->request->pool, prefix, &value) != NGX_OK) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    e->buf = value;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script fullname: \"%V\"", &value);[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_full_name_code_t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_return_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_return_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_return_code_t *) e->ip;[m
[31m-[m
[31m-    if (code->status < NGX_HTTP_BAD_REQUEST[m
[31m-        || code->text.value.len[m
[31m-        || code->text.lengths)[m
[31m-    {[m
[31m-        e->status = ngx_http_send_response(e->request, code->status, NULL,[m
[31m-                                           &code->text);[m
[31m-    } else {[m
[31m-        e->status = code->status;[m
[31m-    }[m
[31m-[m
[31m-    e->ip = ngx_http_script_exit;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_break_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    e->request->uri_changed = 0;[m
[31m-[m
[31m-    e->ip = ngx_http_script_exit;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_if_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_if_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_if_code_t *) e->ip;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script if");[m
[31m-[m
[31m-    e->sp--;[m
[31m-[m
[31m-    if (e->sp->len && (e->sp->len != 1 || e->sp->data[0] != '0')) {[m
[31m-        if (code->loc_conf) {[m
[31m-            e->request->loc_conf = code->loc_conf;[m
[31m-            ngx_http_update_location_config(e->request);[m
[31m-        }[m
[31m-[m
[31m-        e->ip += sizeof(ngx_http_script_if_code_t);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script if: false");[m
[31m-[m
[31m-    e->ip += code->next;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_equal_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *val, *res;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script equal");[m
[31m-[m
[31m-    e->sp--;[m
[31m-    val = e->sp;[m
[31m-    res = e->sp - 1;[m
[31m-[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-[m
[31m-    if (val->len == res->len[m
[31m-        && ngx_strncmp(val->data, res->data, res->len) == 0)[m
[31m-    {[m
[31m-        *res = ngx_http_variable_true_value;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script equal: no");[m
[31m-[m
[31m-    *res = ngx_http_variable_null_value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_not_equal_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *val, *res;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script not equal");[m
[31m-[m
[31m-    e->sp--;[m
[31m-    val = e->sp;[m
[31m-    res = e->sp - 1;[m
[31m-[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-[m
[31m-    if (val->len == res->len[m
[31m-        && ngx_strncmp(val->data, res->data, res->len) == 0)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                       "http script not equal: no");[m
[31m-[m
[31m-        *res = ngx_http_variable_null_value;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *res = ngx_http_variable_true_value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_file_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_str_t                     path;[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_variable_value_t    *value;[m
[31m-    ngx_http_script_file_code_t  *code;[m
[31m-[m
[31m-    value = e->sp - 1;[m
[31m-[m
[31m-    code = (ngx_http_script_file_code_t *) e->ip;[m
[31m-    e->ip += sizeof(ngx_http_script_file_code_t);[m
[31m-[m
[31m-    path.len = value->len - 1;[m
[31m-    path.data = value->data;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http script file op %p \"%V\"", (void *) code->op, &path);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.test_only = 1;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        if (of.err != NGX_ENOENT[m
[31m-            && of.err != NGX_ENOTDIR[m
[31m-            && of.err != NGX_ENAMETOOLONG)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, value->data);[m
[31m-        }[m
[31m-[m
[31m-        switch (code->op) {[m
[31m-[m
[31m-        case ngx_http_script_file_plain:[m
[31m-        case ngx_http_script_file_dir:[m
[31m-        case ngx_http_script_file_exists:[m
[31m-        case ngx_http_script_file_exec:[m
[31m-             goto false_value;[m
[31m-[m
[31m-        case ngx_http_script_file_not_plain:[m
[31m-        case ngx_http_script_file_not_dir:[m
[31m-        case ngx_http_script_file_not_exists:[m
[31m-        case ngx_http_script_file_not_exec:[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-[m
[31m-        goto false_value;[m
[31m-    }[m
[31m-[m
[31m-    switch (code->op) {[m
[31m-    case ngx_http_script_file_plain:[m
[31m-        if (of.is_file) {[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-        goto false_value;[m
[31m-[m
[31m-    case ngx_http_script_file_not_plain:[m
[31m-        if (of.is_file) {[m
[31m-            goto false_value;[m
[31m-        }[m
[31m-        goto true_value;[m
[31m-[m
[31m-    case ngx_http_script_file_dir:[m
[31m-        if (of.is_dir) {[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-        goto false_value;[m
[31m-[m
[31m-    case ngx_http_script_file_not_dir:[m
[31m-        if (of.is_dir) {[m
[31m-            goto false_value;[m
[31m-        }[m
[31m-        goto true_value;[m
[31m-[m
[31m-    case ngx_http_script_file_exists:[m
[31m-        if (of.is_file || of.is_dir || of.is_link) {[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-        goto false_value;[m
[31m-[m
[31m-    case ngx_http_script_file_not_exists:[m
[31m-        if (of.is_file || of.is_dir || of.is_link) {[m
[31m-            goto false_value;[m
[31m-        }[m
[31m-        goto true_value;[m
[31m-[m
[31m-    case ngx_http_script_file_exec:[m
[31m-        if (of.is_exec) {[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-        goto false_value;[m
[31m-[m
[31m-    case ngx_http_script_file_not_exec:[m
[31m-        if (of.is_exec) {[m
[31m-            goto false_value;[m
[31m-        }[m
[31m-        goto true_value;[m
[31m-    }[m
[31m-[m
[31m-false_value:[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http script file op false");[m
[31m-[m
[31m-    *value = ngx_http_variable_null_value;[m
[31m-    return;[m
[31m-[m
[31m-true_value:[m
[31m-[m
[31m-    *value = ngx_http_variable_true_value;[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    size_t                                 len;[m
[31m-    ngx_http_script_engine_t               le;[m
[31m-    ngx_http_script_len_code_pt            lcode;[m
[31m-    ngx_http_script_complex_value_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_complex_value_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_complex_value_code_t);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script complex value");[m
[31m-[m
[31m-    ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    le.ip = code->lengths->elts;[m
[31m-    le.line = e->line;[m
[31m-    le.request = e->request;[m
[31m-    le.quote = e->quote;[m
[31m-[m
[31m-    for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-    }[m
[31m-[m
[31m-    e->buf.len = len;[m
[31m-    e->buf.data = ngx_pnalloc(e->request->pool, len);[m
[31m-    if (e->buf.data == NULL) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    e->pos = e->buf.data;[m
[31m-[m
[31m-    e->sp->len = e->buf.len;[m
[31m-    e->sp->data = e->buf.data;[m
[31m-    e->sp++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_value_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_value_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_value_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_value_code_t);[m
[31m-[m
[31m-    e->sp->len = code->text_len;[m
[31m-    e->sp->data = (u_char *) code->text_data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script value: \"%v\"", e->sp);[m
[31m-[m
[31m-    e->sp++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_set_var_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_code_t);[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    e->sp--;[m
[31m-[m
[31m-    r->variables[code->index].len = e->sp->len;[m
[31m-    r->variables[code->index].valid = 1;[m
[31m-    r->variables[code->index].no_cacheable = 0;[m
[31m-    r->variables[code->index].not_found = 0;[m
[31m-    r->variables[code->index].data = e->sp->data;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v = cmcf->variables.elts;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script set $%V", &v[code->index].name);[m
[31m-    }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_var_handler_code_t  *code;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script set var handler");[m
[31m-[m
[31m-    code = (ngx_http_script_var_handler_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_handler_code_t);[m
[31m-[m
[31m-    e->sp--;[m
[31m-[m
[31m-    code->handler(e->request, e->sp, code->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_var_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_variable_value_t   *value;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script var");[m
[31m-[m
[31m-    code = (ngx_http_script_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_code_t);[m
[31m-[m
[31m-    value = ngx_http_get_flushed_variable(e->request, code->index);[m
[31m-[m
[31m-    if (value && !value->not_found) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                       "http script var: \"%v\"", value);[m
[31m-[m
[31m-        *e->sp = *value;[m
[31m-        e->sp++;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *e->sp = ngx_http_variable_null_value;[m
[31m-    e->sp++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_nop_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_script.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_script.h[m
[1mdeleted file mode 100644[m
[1mindex 46592ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_script.h[m
[1m+++ /dev/null[m
[36m@@ -1,257 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SCRIPT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SCRIPT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *ip;[m
[31m-    u_char                     *pos;[m
[31m-    ngx_http_variable_value_t  *sp;[m
[31m-[m
[31m-    ngx_str_t                   buf;[m
[31m-    ngx_str_t                   line;[m
[31m-[m
[31m-    /* the start of the rewritten arguments */[m
[31m-    u_char                     *args;[m
[31m-[m
[31m-    unsigned                    flushed:1;[m
[31m-    unsigned                    skip:1;[m
[31m-    unsigned                    quote:1;[m
[31m-    unsigned                    is_args:1;[m
[31m-    unsigned                    log:1;[m
[31m-[m
[31m-    ngx_int_t                   status;[m
[31m-    ngx_http_request_t         *request;[m
[31m-} ngx_http_script_engine_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_t                 *cf;[m
[31m-    ngx_str_t                  *source;[m
[31m-[m
[31m-    ngx_array_t               **flushes;[m
[31m-    ngx_array_t               **lengths;[m
[31m-    ngx_array_t               **values;[m
[31m-[m
[31m-    ngx_uint_t                  variables;[m
[31m-    ngx_uint_t                  ncaptures;[m
[31m-    ngx_uint_t                  captures_mask;[m
[31m-    ngx_uint_t                  size;[m
[31m-[m
[31m-    void                       *main;[m
[31m-[m
[31m-    unsigned                    compile_args:1;[m
[31m-    unsigned                    complete_lengths:1;[m
[31m-    unsigned                    complete_values:1;[m
[31m-    unsigned                    zero:1;[m
[31m-    unsigned                    conf_prefix:1;[m
[31m-    unsigned                    root_prefix:1;[m
[31m-[m
[31m-    unsigned                    dup_capture:1;[m
[31m-    unsigned                    args:1;[m
[31m-} ngx_http_script_compile_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   value;[m
[31m-    ngx_uint_t                 *flushes;[m
[31m-    void                       *lengths;[m
[31m-    void                       *values;[m
[31m-} ngx_http_complex_value_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_t                 *cf;[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_complex_value_t   *complex_value;[m
[31m-[m
[31m-    unsigned                    zero:1;[m
[31m-    unsigned                    conf_prefix:1;[m
[31m-    unsigned                    root_prefix:1;[m
[31m-} ngx_http_compile_complex_value_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_script_code_pt) (ngx_http_script_engine_t *e);[m
[31m-typedef size_t (*ngx_http_script_len_code_pt) (ngx_http_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   len;[m
[31m-} ngx_http_script_copy_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   index;[m
[31m-} ngx_http_script_var_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    ngx_http_set_variable_pt    handler;[m
[31m-    uintptr_t                   data;[m
[31m-} ngx_http_script_var_handler_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   n;[m
[31m-} ngx_http_script_copy_capture_code_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    ngx_http_regex_t           *regex;[m
[31m-    ngx_array_t                *lengths;[m
[31m-    uintptr_t                   size;[m
[31m-    uintptr_t                   status;[m
[31m-    uintptr_t                   next;[m
[31m-[m
[31m-    uintptr_t                   test:1;[m
[31m-    uintptr_t                   negative_test:1;[m
[31m-    uintptr_t                   uri:1;[m
[31m-    uintptr_t                   args:1;[m
[31m-[m
[31m-    /* add the r->args to the new arguments */[m
[31m-    uintptr_t                   add_args:1;[m
[31m-[m
[31m-    uintptr_t                   redirect:1;[m
[31m-    uintptr_t                   break_cycle:1;[m
[31m-[m
[31m-    ngx_str_t                   name;[m
[31m-} ngx_http_script_regex_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-[m
[31m-    uintptr_t                   uri:1;[m
[31m-    uintptr_t                   args:1;[m
[31m-[m
[31m-    /* add the r->args to the new arguments */[m
[31m-    uintptr_t                   add_args:1;[m
[31m-[m
[31m-    uintptr_t                   redirect:1;[m
[31m-} ngx_http_script_regex_end_code_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   conf_prefix;[m
[31m-} ngx_http_script_full_name_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   status;[m
[31m-    ngx_http_complex_value_t    text;[m
[31m-} ngx_http_script_return_code_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_script_file_plain = 0,[m
[31m-    ngx_http_script_file_not_plain,[m
[31m-    ngx_http_script_file_dir,[m
[31m-    ngx_http_script_file_not_dir,[m
[31m-    ngx_http_script_file_exists,[m
[31m-    ngx_http_script_file_not_exists,[m
[31m-    ngx_http_script_file_exec,[m
[31m-    ngx_http_script_file_not_exec[m
[31m-} ngx_http_script_file_op_e;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   op;[m
[31m-} ngx_http_script_file_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   next;[m
[31m-    void                      **loc_conf;[m
[31m-} ngx_http_script_if_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    ngx_array_t                *lengths;[m
[31m-} ngx_http_script_complex_value_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   value;[m
[31m-    uintptr_t                   text_len;[m
[31m-    uintptr_t                   text_data;[m
[31m-} ngx_http_script_value_code_t;[m
[31m-[m
[31m-[m
[31m-void ngx_http_script_flush_complex_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *val);[m
[31m-ngx_int_t ngx_http_complex_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *val, ngx_str_t *value);[m
[31m-ngx_int_t ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv);[m
[31m-char *ngx_http_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_test_predicates(ngx_http_request_t *r,[m
[31m-    ngx_array_t *predicates);[m
[31m-char *ngx_http_set_predicate_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-ngx_uint_t ngx_http_script_variables_count(ngx_str_t *value);[m
[31m-ngx_int_t ngx_http_script_compile(ngx_http_script_compile_t *sc);[m
[31m-u_char *ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value,[m
[31m-    void *code_lengths, size_t reserved, void *code_values);[m
[31m-void ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r,[m
[31m-    ngx_array_t *indices);[m
[31m-[m
[31m-void *ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes,[m
[31m-    size_t size);[m
[31m-void *ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code);[m
[31m-[m
[31m-size_t ngx_http_script_copy_len_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_copy_code(ngx_http_script_engine_t *e);[m
[31m-size_t ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_copy_var_code(ngx_http_script_engine_t *e);[m
[31m-size_t ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e);[m
[31m-size_t ngx_http_script_mark_args_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_start_args_code(ngx_http_script_engine_t *e);[m
[31m-#if (NGX_PCRE)[m
[31m-void ngx_http_script_regex_start_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_regex_end_code(ngx_http_script_engine_t *e);[m
[31m-#endif[m
[31m-void ngx_http_script_return_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_break_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_if_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_equal_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_not_equal_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_file_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_value_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_set_var_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_var_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_nop_code(ngx_http_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SCRIPT_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_special_response.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_special_response.c[m
[1mdeleted file mode 100644[m
[1mindex 2771e58..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_special_response.c[m
[1m+++ /dev/null[m
[36m@@ -1,789 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_send_error_page(ngx_http_request_t *r,[m
[31m-    ngx_http_err_page_t *err_page);[m
[31m-static ngx_int_t ngx_http_send_special_response(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_uint_t err);[m
[31m-static ngx_int_t ngx_http_send_refresh(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_error_full_tail[] =[m
[31m-"<hr><center>" NGINX_VER "</center>" CRLF[m
[31m-"</body>" CRLF[m
[31m-"</html>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_error_tail[] =[m
[31m-"<hr><center>nginx</center>" CRLF[m
[31m-"</body>" CRLF[m
[31m-"</html>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_msie_padding[] =[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_msie_refresh_head[] =[m
[31m-"<html><head><meta http-equiv=\"Refresh\" content=\"0; URL=";[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_msie_refresh_tail[] =[m
[31m-"\"></head><body></body></html>" CRLF;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_301_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>301 Moved Permanently</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>301 Moved Permanently</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_302_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>302 Found</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>302 Found</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_303_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>303 See Other</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>303 See Other</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_307_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>307 Temporary Redirect</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>307 Temporary Redirect</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_400_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 Bad Request</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_401_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>401 Authorization Required</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>401 Authorization Required</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_402_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>402 Payment Required</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>402 Payment Required</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_403_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>403 Forbidden</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>403 Forbidden</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_404_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>404 Not Found</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>404 Not Found</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_405_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>405 Not Allowed</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>405 Not Allowed</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_406_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>406 Not Acceptable</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>406 Not Acceptable</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_408_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>408 Request Time-out</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>408 Request Time-out</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_409_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>409 Conflict</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>409 Conflict</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_410_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>410 Gone</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>410 Gone</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_411_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>411 Length Required</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>411 Length Required</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_412_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>412 Precondition Failed</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>412 Precondition Failed</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_413_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>413 Request Entity Too Large</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>413 Request Entity Too Large</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_414_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>414 Request-URI Too Large</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>414 Request-URI Too Large</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_415_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>415 Unsupported Media Type</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>415 Unsupported Media Type</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_416_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>416 Requested Range Not Satisfiable</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>416 Requested Range Not Satisfiable</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_494_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 Request Header Or Cookie Too Large</title></head>"[m
[31m-CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-"<center>Request Header Or Cookie Too Large</center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_495_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 The SSL certificate error</title></head>"[m
[31m-CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-"<center>The SSL certificate error</center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_496_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 No required SSL certificate was sent</title></head>"[m
[31m-CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-"<center>No required SSL certificate was sent</center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_497_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>"[m
[31m-CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-"<center>The plain HTTP request was sent to HTTPS port</center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_500_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>500 Internal Server Error</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>500 Internal Server Error</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_501_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>501 Not Implemented</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>501 Not Implemented</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_502_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>502 Bad Gateway</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>502 Bad Gateway</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_503_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>503 Service Temporarily Unavailable</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>503 Service Temporarily Unavailable</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_504_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>504 Gateway Time-out</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>504 Gateway Time-out</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_507_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>507 Insufficient Storage</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>507 Insufficient Storage</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_error_pages[] = {[m
[31m-[m
[31m-    ngx_null_string,                     /* 201, 204 */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_2XX  202[m
[31m-#define NGX_HTTP_OFF_3XX   (NGX_HTTP_LAST_2XX - 201)[m
[31m-[m
[31m-    /* ngx_null_string, */               /* 300 */[m
[31m-    ngx_string(ngx_http_error_301_page),[m
[31m-    ngx_string(ngx_http_error_302_page),[m
[31m-    ngx_string(ngx_http_error_303_page),[m
[31m-    ngx_null_string,                     /* 304 */[m
[31m-    ngx_null_string,                     /* 305 */[m
[31m-    ngx_null_string,                     /* 306 */[m
[31m-    ngx_string(ngx_http_error_307_page),[m
[31m-[m
[31m-#define NGX_HTTP_LAST_3XX  308[m
[31m-#define NGX_HTTP_OFF_4XX   (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX)[m
[31m-[m
[31m-    ngx_string(ngx_http_error_400_page),[m
[31m-    ngx_string(ngx_http_error_401_page),[m
[31m-    ngx_string(ngx_http_error_402_page),[m
[31m-    ngx_string(ngx_http_error_403_page),[m
[31m-    ngx_string(ngx_http_error_404_page),[m
[31m-    ngx_string(ngx_http_error_405_page),[m
[31m-    ngx_string(ngx_http_error_406_page),[m
[31m-    ngx_null_string,                     /* 407 */[m
[31m-    ngx_string(ngx_http_error_408_page),[m
[31m-    ngx_string(ngx_http_error_409_page),[m
[31m-    ngx_string(ngx_http_error_410_page),[m
[31m-    ngx_string(ngx_http_error_411_page),[m
[31m-    ngx_string(ngx_http_error_412_page),[m
[31m-    ngx_string(ngx_http_error_413_page),[m
[31m-    ngx_string(ngx_http_error_414_page),[m
[31m-    ngx_string(ngx_http_error_415_page),[m
[31m-    ngx_string(ngx_http_error_416_page),[m
[31m-[m
[31m-#define NGX_HTTP_LAST_4XX  417[m
[31m-#define NGX_HTTP_OFF_5XX   (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)[m
[31m-[m
[31m-    ngx_string(ngx_http_error_494_page), /* 494, request header too large */[m
[31m-    ngx_string(ngx_http_error_495_page), /* 495, https certificate error */[m
[31m-    ngx_string(ngx_http_error_496_page), /* 496, https no certificate */[m
[31m-    ngx_string(ngx_http_error_497_page), /* 497, http to https */[m
[31m-    ngx_string(ngx_http_error_404_page), /* 498, canceled */[m
[31m-    ngx_null_string,                     /* 499, client has closed connection */[m
[31m-[m
[31m-    ngx_string(ngx_http_error_500_page),[m
[31m-    ngx_string(ngx_http_error_501_page),[m
[31m-    ngx_string(ngx_http_error_502_page),[m
[31m-    ngx_string(ngx_http_error_503_page),[m
[31m-    ngx_string(ngx_http_error_504_page),[m
[31m-    ngx_null_string,                     /* 505 */[m
[31m-    ngx_null_string,                     /* 506 */[m
[31m-    ngx_string(ngx_http_error_507_page)[m
[31m-[m
[31m-#define NGX_HTTP_LAST_5XX  508[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)[m
[31m-{[m
[31m-    ngx_uint_t                 i, err;[m
[31m-    ngx_http_err_page_t       *err_page;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http special response: %i, \"%V?%V\"",[m
[31m-                   error, &r->uri, &r->args);[m
[31m-[m
[31m-    r->err_status = error;[m
[31m-[m
[31m-    if (r->keepalive) {[m
[31m-        switch (error) {[m
[31m-            case NGX_HTTP_BAD_REQUEST:[m
[31m-            case NGX_HTTP_REQUEST_ENTITY_TOO_LARGE:[m
[31m-            case NGX_HTTP_REQUEST_URI_TOO_LARGE:[m
[31m-            case NGX_HTTP_TO_HTTPS:[m
[31m-            case NGX_HTTPS_CERT_ERROR:[m
[31m-            case NGX_HTTPS_NO_CERT:[m
[31m-            case NGX_HTTP_INTERNAL_SERVER_ERROR:[m
[31m-            case NGX_HTTP_NOT_IMPLEMENTED:[m
[31m-                r->keepalive = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->lingering_close) {[m
[31m-        switch (error) {[m
[31m-            case NGX_HTTP_BAD_REQUEST:[m
[31m-            case NGX_HTTP_TO_HTTPS:[m
[31m-            case NGX_HTTPS_CERT_ERROR:[m
[31m-            case NGX_HTTPS_NO_CERT:[m
[31m-                r->lingering_close = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type.len = 0;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->error_page && clcf->error_pages && r->uri_changes != 0) {[m
[31m-[m
[31m-        if (clcf->recursive_error_pages == 0) {[m
[31m-            r->error_page = 1;[m
[31m-        }[m
[31m-[m
[31m-        err_page = clcf->error_pages->elts;[m
[31m-[m
[31m-        for (i = 0; i < clcf->error_pages->nelts; i++) {[m
[31m-            if (err_page[i].status == error) {[m
[31m-                return ngx_http_send_error_page(r, &err_page[i]);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->expect_tested = 1;[m
[31m-[m
[31m-    if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-        r->keepalive = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->msie_refresh[m
[31m-        && r->headers_in.msie[m
[31m-        && (error == NGX_HTTP_MOVED_PERMANENTLY[m
[31m-            || error == NGX_HTTP_MOVED_TEMPORARILY))[m
[31m-    {[m
[31m-        return ngx_http_send_refresh(r);[m
[31m-    }[m
[31m-[m
[31m-    if (error == NGX_HTTP_CREATED) {[m
[31m-        /* 201 */[m
[31m-        err = 0;[m
[31m-[m
[31m-    } else if (error == NGX_HTTP_NO_CONTENT) {[m
[31m-        /* 204 */[m
[31m-        err = 0;[m
[31m-[m
[31m-    } else if (error >= NGX_HTTP_MOVED_PERMANENTLY[m
[31m-               && error < NGX_HTTP_LAST_3XX)[m
[31m-    {[m
[31m-        /* 3XX */[m
[31m-        err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;[m
[31m-[m
[31m-    } else if (error >= NGX_HTTP_BAD_REQUEST[m
[31m-               && error < NGX_HTTP_LAST_4XX)[m
[31m-    {[m
[31m-        /* 4XX */[m
[31m-        err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_OFF_4XX;[m
[31m-[m
[31m-    } else if (error >= NGX_HTTP_NGINX_CODES[m
[31m-               && error < NGX_HTTP_LAST_5XX)[m
[31m-    {[m
[31m-        /* 49X, 5XX */[m
[31m-        err = error - NGX_HTTP_NGINX_CODES + NGX_HTTP_OFF_5XX;[m
[31m-        switch (error) {[m
[31m-            case NGX_HTTP_TO_HTTPS:[m
[31m-            case NGX_HTTPS_CERT_ERROR:[m
[31m-            case NGX_HTTPS_NO_CERT:[m
[31m-            case NGX_HTTP_REQUEST_HEADER_TOO_LARGE:[m
[31m-                r->err_status = NGX_HTTP_BAD_REQUEST;[m
[31m-                break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* unknown code, zero body */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_send_special_response(r, clcf, err);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_filter_finalize_request(ngx_http_request_t *r, ngx_module_t *m,[m
[31m-    ngx_int_t error)[m
[31m-{[m
[31m-    void       *ctx;[m
[31m-    ngx_int_t   rc;[m
[31m-[m
[31m-    ngx_http_clean_header(r);[m
[31m-[m
[31m-    ctx = NULL;[m
[31m-[m
[31m-    if (m) {[m
[31m-        ctx = r->ctx[m->ctx_index];[m
[31m-    }[m
[31m-[m
[31m-    /* clear the modules contexts */[m
[31m-    ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-    if (m) {[m
[31m-        r->ctx[m->ctx_index] = ctx;[m
[31m-    }[m
[31m-[m
[31m-    r->filter_finalize = 1;[m
[31m-[m
[31m-    rc = ngx_http_special_response_handler(r, error);[m
[31m-[m
[31m-    /* NGX_ERROR resets any pending data */[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-    case NGX_DONE:[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    default:[m
[31m-        return rc;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_clean_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_memzero(&r->headers_out.status,[m
[31m-                sizeof(ngx_http_headers_out_t)[m
[31m-                    - offsetof(ngx_http_headers_out_t, status));[m
[31m-[m
[31m-    r->headers_out.headers.part.nelts = 0;[m
[31m-    r->headers_out.headers.part.next = NULL;[m
[31m-    r->headers_out.headers.last = &r->headers_out.headers.part;[m
[31m-[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-    r->headers_out.last_modified_time = -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)[m
[31m-{[m
[31m-    ngx_int_t                  overwrite;[m
[31m-    ngx_str_t                  uri, args;[m
[31m-    ngx_table_elt_t           *location;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    overwrite = err_page->overwrite;[m
[31m-[m
[31m-    if (overwrite && overwrite != NGX_HTTP_OK) {[m
[31m-        r->expect_tested = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (overwrite >= 0) {[m
[31m-        r->err_status = overwrite;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (uri.len && uri.data[0] == '/') {[m
[31m-[m
[31m-        if (err_page->value.lengths) {[m
[31m-            ngx_http_split_args(r, &uri, &args);[m
[31m-[m
[31m-        } else {[m
[31m-            args = err_page->args;[m
[31m-        }[m
[31m-[m
[31m-        if (r->method != NGX_HTTP_HEAD) {[m
[31m-            r->method = NGX_HTTP_GET;[m
[31m-            r->method_name = ngx_http_core_get_method;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_internal_redirect(r, &uri, &args);[m
[31m-    }[m
[31m-[m
[31m-    if (uri.len && uri.data[0] == '@') {[m
[31m-        return ngx_http_named_location(r, &uri);[m
[31m-    }[m
[31m-[m
[31m-    location = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-    if (location == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (overwrite != NGX_HTTP_MOVED_PERMANENTLY[m
[31m-        && overwrite != NGX_HTTP_MOVED_TEMPORARILY[m
[31m-        && overwrite != NGX_HTTP_SEE_OTHER[m
[31m-        && overwrite != NGX_HTTP_TEMPORARY_REDIRECT)[m
[31m-    {[m
[31m-        r->err_status = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-    }[m
[31m-[m
[31m-    location->hash = 1;[m
[31m-    ngx_str_set(&location->key, "Location");[m
[31m-    location->value = uri;[m
[31m-[m
[31m-    ngx_http_clear_location(r);[m
[31m-[m
[31m-    r->headers_out.location = location;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->msie_refresh && r->headers_in.msie) {[m
[31m-        return ngx_http_send_refresh(r);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_send_special_response(r, clcf, r->err_status[m
[31m-                                                   - NGX_HTTP_MOVED_PERMANENTLY[m
[31m-                                                   + NGX_HTTP_OFF_3XX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_send_special_response(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_uint_t err)[m
[31m-{[m
[31m-    u_char       *tail;[m
[31m-    size_t        len;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_uint_t    msie_padding;[m
[31m-    ngx_chain_t   out[3];[m
[31m-[m
[31m-    if (clcf->server_tokens) {[m
[31m-        len = sizeof(ngx_http_error_full_tail) - 1;[m
[31m-        tail = ngx_http_error_full_tail;[m
[31m-[m
[31m-    } else {[m
[31m-        len = sizeof(ngx_http_error_tail) - 1;[m
[31m-        tail = ngx_http_error_tail;[m
[31m-    }[m
[31m-[m
[31m-    msie_padding = 0;[m
[31m-[m
[31m-    if (ngx_http_error_pages[err].len) {[m
[31m-        r->headers_out.content_length_n = ngx_http_error_pages[err].len + len;[m
[31m-        if (clcf->msie_padding[m
[31m-            && (r->headers_in.msie || r->headers_in.chrome)[m
[31m-            && r->http_version >= NGX_HTTP_VERSION_10[m
[31m-            && err >= NGX_HTTP_OFF_4XX)[m
[31m-        {[m
[31m-            r->headers_out.content_length_n +=[m
[31m-                                         sizeof(ngx_http_msie_padding) - 1;[m
[31m-            msie_padding = 1;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_len = sizeof("text/html") - 1;[m
[31m-        ngx_str_set(&r->headers_out.content_type, "text/html");[m
[31m-        r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_out.content_length_n = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_clear_last_modified(r);[m
[31m-    ngx_http_clear_etag(r);[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_error_pages[err].len == 0) {[m
[31m-        return ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-    b->pos = ngx_http_error_pages[err].data;[m
[31m-    b->last = ngx_http_error_pages[err].data + ngx_http_error_pages[err].len;[m
[31m-[m
[31m-    out[0].buf = b;[m
[31m-    out[0].next = &out[1];[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-[m
[31m-    b->pos = tail;[m
[31m-    b->last = tail + len;[m
[31m-[m
[31m-    out[1].buf = b;[m
[31m-    out[1].next = NULL;[m
[31m-[m
[31m-    if (msie_padding) {[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->memory = 1;[m
[31m-        b->pos = ngx_http_msie_padding;[m
[31m-        b->last = ngx_http_msie_padding + sizeof(ngx_http_msie_padding) - 1;[m
[31m-[m
[31m-        out[1].next = &out[2];[m
[31m-        out[2].buf = b;[m
[31m-        out[2].next = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out[0]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_send_refresh(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char       *p, *location;[m
[31m-    size_t        len, size;[m
[31m-    uintptr_t     escape;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    len = r->headers_out.location->value.len;[m
[31m-    location = r->headers_out.location->value.data;[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, location, len, NGX_ESCAPE_REFRESH);[m
[31m-[m
[31m-    size = sizeof(ngx_http_msie_refresh_head) - 1[m
[31m-           + escape + len[m
[31m-           + sizeof(ngx_http_msie_refresh_tail) - 1;[m
[31m-[m
[31m-    r->err_status = NGX_HTTP_OK;[m
[31m-[m
[31m-    r->headers_out.content_type_len = sizeof("text/html") - 1;[m
[31m-    ngx_str_set(&r->headers_out.content_type, "text/html");[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    r->headers_out.location->hash = 0;[m
[31m-    r->headers_out.location = NULL;[m
[31m-[m
[31m-    r->headers_out.content_length_n = size;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_clear_last_modified(r);[m
[31m-    ngx_http_clear_etag(r);[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(b->pos, ngx_http_msie_refresh_head,[m
[31m-                   sizeof(ngx_http_msie_refresh_head) - 1);[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_cpymem(p, location, len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_escape_uri(p, location, len, NGX_ESCAPE_REFRESH);[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(p, ngx_http_msie_refresh_tail,[m
[31m-                         sizeof(ngx_http_msie_refresh_tail) - 1);[m
[31m-[m
[31m-    b->last_buf = 1;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex fcbb530..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,6126 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_cache_get(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_file_cache_t **cache);[m
[31m-static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_cache_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_cache_etag(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#endif[m
[31m-[m
[31m-static void ngx_http_upstream_init_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_connect(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_send_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write);[m
[31m-static ngx_int_t ngx_http_upstream_send_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write);[m
[31m-static void ngx_http_upstream_send_request_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_read_request_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_process_header(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_test_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_intercept_errors(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_http_upstream_process_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_send_response(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgrade(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_upgraded(ngx_http_request_t *r,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,[m
[31m-    ngx_uint_t do_write);[m
[31m-static ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_upstream_non_buffered_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-#if (NGX_THREADS)[m
[31m-static ngx_int_t ngx_http_upstream_thread_handler(ngx_thread_task_t *task,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_upstream_thread_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_upstream_output_filter(void *data,[m
[31m-    ngx_chain_t *chain);[m
[31m-static void ngx_http_upstream_process_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_process_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_store(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_upstream_cleanup(void *data);[m
[31m-static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_set_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_process_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_buffering(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_charset(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_connection(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_vary(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_upstream_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_response_length_variable([m
[31m-    ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static char *ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy);[m
[31m-static char *ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_addr_t *ngx_http_upstream_get_local(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_local_t *local);[m
[31m-[m
[31m-static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c);[m
[31m-static void ngx_http_upstream_ssl_handshake(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_http_upstream_ssl_name(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_header_t  ngx_http_upstream_headers_in[] = {[m
[31m-[m
[31m-    { ngx_string("Status"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, status),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, content_type),[m
[31m-                 ngx_http_upstream_copy_content_type, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 ngx_http_upstream_process_content_length, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, date),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, date), 0 },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 ngx_http_upstream_process_last_modified, 0,[m
[31m-                 ngx_http_upstream_copy_last_modified, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, etag),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, etag), 0 },[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, server),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, server), 0 },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, www_authenticate),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, location),[m
[31m-                 ngx_http_upstream_rewrite_location, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_rewrite_refresh, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Set-Cookie"),[m
[31m-                 ngx_http_upstream_process_set_cookie,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, cookies),[m
[31m-                 ngx_http_upstream_rewrite_set_cookie, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Disposition"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 ngx_http_upstream_process_cache_control, 0,[m
[31m-                 ngx_http_upstream_copy_multi_header_lines,[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control), 1 },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 ngx_http_upstream_process_expires, 0,[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, expires), 1 },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, accept_ranges),[m
[31m-                 ngx_http_upstream_copy_allow_ranges,[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges), 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Range"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, content_range), 0 },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 ngx_http_upstream_process_connection, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Vary"),[m
[31m-                 ngx_http_upstream_process_vary, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Powered-By"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Expires"),[m
[31m-                 ngx_http_upstream_process_accel_expires, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Redirect"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Limit-Rate"),[m
[31m-                 ngx_http_upstream_process_limit_rate, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Buffering"),[m
[31m-                 ngx_http_upstream_process_buffering, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Charset"),[m
[31m-                 ngx_http_upstream_process_charset, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 ngx_http_upstream_process_transfer_encoding, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, content_encoding),[m
[31m-                 ngx_http_upstream_copy_content_encoding, 0, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, 0, NULL, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_commands[] = {[m
[31m-[m
[31m-    { ngx_string("upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_upstream_server,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_module_ctx = {[m
[31m-    ngx_http_upstream_add_variables,       /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_upstream_create_main_conf,    /* create main configuration */[m
[31m-    ngx_http_upstream_init_main_conf,      /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_module_ctx,         /* module context */[m
[31m-    ngx_http_upstream_commands,            /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_upstream_vars[] = {[m
[31m-[m
[31m-    { ngx_string("upstream_addr"), NULL,[m
[31m-      ngx_http_upstream_addr_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_status"), NULL,[m
[31m-      ngx_http_upstream_status_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_connect_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 2,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_header_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 1,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_response_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_response_length"), NULL,[m
[31m-      ngx_http_upstream_response_length_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("upstream_cache_status"), NULL,[m
[31m-      ngx_http_upstream_cache_status, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_cache_last_modified"), NULL,[m
[31m-      ngx_http_upstream_cache_last_modified, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_cache_etag"), NULL,[m
[31m-      ngx_http_upstream_cache_etag, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_next_t  ngx_http_upstream_next_errors[] = {[m
[31m-    { 500, NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { 502, NGX_HTTP_UPSTREAM_FT_HTTP_502 },[m
[31m-    { 503, NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { 504, NGX_HTTP_UPSTREAM_FT_HTTP_504 },[m
[31m-    { 403, NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { 404, NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_conf_bitmask_t  ngx_http_upstream_cache_method_mask[] = {[m
[31m-    { ngx_string("GET"), NGX_HTTP_GET },[m
[31m-    { ngx_string("HEAD"), NGX_HTTP_HEAD },[m
[31m-    { ngx_string("POST"), NGX_HTTP_POST },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_conf_bitmask_t  ngx_http_upstream_ignore_headers_masks[] = {[m
[31m-    { ngx_string("X-Accel-Redirect"), NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT },[m
[31m-    { ngx_string("X-Accel-Expires"), NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES },[m
[31m-    { ngx_string("X-Accel-Limit-Rate"), NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE },[m
[31m-    { ngx_string("X-Accel-Buffering"), NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING },[m
[31m-    { ngx_string("X-Accel-Charset"), NGX_HTTP_UPSTREAM_IGN_XA_CHARSET },[m
[31m-    { ngx_string("Expires"), NGX_HTTP_UPSTREAM_IGN_EXPIRES },[m
[31m-    { ngx_string("Cache-Control"), NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL },[m
[31m-    { ngx_string("Set-Cookie"), NGX_HTTP_UPSTREAM_IGN_SET_COOKIE },[m
[31m-    { ngx_string("Vary"), NGX_HTTP_UPSTREAM_IGN_VARY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_create(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u && u->cleanup) {[m
[31m-        r->main->count++;[m
[31m-        ngx_http_upstream_cleanup(r);[m
[31m-    }[m
[31m-[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream = u;[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    r->cache = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_init(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http init upstream, client timer: %d", c->read->timer_set);[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_upstream_init_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        if (!c->write->active) {[m
[31m-            if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_init_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_init_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *host;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_resolver_ctx_t             *ctx, temp;[m
[31m-    ngx_http_cleanup_t             *cln;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (r->aio) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->cache) {[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache(r, u);[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            r->write_event_handler = ngx_http_upstream_init_request;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = ngx_http_upstream_cache_send(r, u);[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {[m
[31m-                rc = NGX_DECLINED;[m
[31m-                r->cached = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            ngx_http_finalize_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->store = u->conf->store;[m
[31m-[m
[31m-    if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;[m
[31m-        r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body) {[m
[31m-        u->request_bufs = r->request_body->bufs;[m
[31m-    }[m
[31m-[m
[31m-    if (u->create_request(r) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.local = ngx_http_upstream_get_local(r, u->conf->local);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    u->output.alignment = clcf->directio_alignment;[m
[31m-    u->output.pool = r->pool;[m
[31m-    u->output.bufs.num = 1;[m
[31m-    u->output.bufs.size = clcf->client_body_buffer_size;[m
[31m-[m
[31m-    if (u->output.output_filter == NULL) {[m
[31m-        u->output.output_filter = ngx_chain_writer;[m
[31m-        u->output.filter_ctx = &u->writer;[m
[31m-    }[m
[31m-[m
[31m-    u->writer.pool = r->pool;[m
[31m-[m
[31m-    if (r->upstream_states == NULL) {[m
[31m-[m
[31m-        r->upstream_states = ngx_array_create(r->pool, 1,[m
[31m-                                            sizeof(ngx_http_upstream_state_t));[m
[31m-        if (r->upstream_states == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        u->state = ngx_array_push(r->upstream_states);[m
[31m-        if (u->state == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_upstream_cleanup;[m
[31m-    cln->data = r;[m
[31m-    u->cleanup = &cln->handler;[m
[31m-[m
[31m-    if (u->resolved == NULL) {[m
[31m-[m
[31m-        uscf = u->conf->upstream;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl_name = u->resolved->host;[m
[31m-#endif[m
[31m-[m
[31m-        host = &u->resolved->host;[m
[31m-[m
[31m-        if (u->resolved->sockaddr) {[m
[31m-[m
[31m-            if (u->resolved->port == 0[m
[31m-                && u->resolved->sockaddr->sa_family != AF_UNIX)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "no port in upstream \"%V\"", host);[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_connect(r, u);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-        uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->host.len == host->len[m
[31m-                && ((uscf->port == 0 && u->resolved->no_port)[m
[31m-                     || uscf->port == u->resolved->port)[m
[31m-                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)[m
[31m-            {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (u->resolved->port == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no port in upstream \"%V\"", host);[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        temp.name = *host;[m
[31m-[m
[31m-        ctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-        if (ctx == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx == NGX_NO_RESOLVER) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no resolver defined to resolve %V", host);[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->name = *host;[m
[31m-        ctx->handler = ngx_http_upstream_resolve_handler;[m
[31m-        ctx->data = r;[m
[31m-        ctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-        u->resolved->ctx = ctx;[m
[31m-[m
[31m-        if (ngx_resolve_name(ctx) != NGX_OK) {[m
[31m-            u->resolved->ctx = NULL;[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (uscf == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "no upstream configuration");[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    u->ssl_name = uscf->host;[m
[31m-#endif[m
[31m-[m
[31m-    if (uscf->peer.init(r, uscf) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (u->conf->next_upstream_tries[m
[31m-        && u->peer.tries > u->conf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = u->conf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_http_cache_t       *c;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-[m
[31m-        if (!(r->method & u->conf->cache_methods)) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache_get(r, u, &cache);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_HEAD && u->conf->cache_convert_head) {[m
[31m-            u->method = ngx_http_core_get_method;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_file_cache_new(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (u->create_key(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* TODO: add keys */[m
[31m-[m
[31m-        ngx_http_file_cache_create_key(r);[m
[31m-[m
[31m-        if (r->cache->header_start + 256 >= u->conf->buffer_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%V_buffer_size %uz is not enough for cache key, "[m
[31m-                          "it should be increased to at least %uz",[m
[31m-                          &u->conf->module, u->conf->buffer_size,[m
[31m-                          ngx_align(r->cache->header_start + 256, 1024));[m
[31m-[m
[31m-            r->cache = NULL;[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        u->cacheable = 1;[m
[31m-[m
[31m-        c = r->cache;[m
[31m-[m
[31m-        c->body_start = u->conf->buffer_size;[m
[31m-        c->min_uses = u->conf->cache_min_uses;[m
[31m-        c->file_cache = cache;[m
[31m-[m
[31m-        switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) {[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        case NGX_DECLINED:[m
[31m-            u->cache_status = NGX_HTTP_CACHE_BYPASS;[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default: /* NGX_OK */[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        c->lock = u->conf->cache_lock;[m
[31m-        c->lock_timeout = u->conf->cache_lock_timeout;[m
[31m-        c->lock_age = u->conf->cache_lock_age;[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_MISS;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_file_cache_open(r);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream cache: %i", rc);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_UPDATING:[m
[31m-[m
[31m-        if (u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) {[m
[31m-            u->cache_status = rc;[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = NGX_HTTP_CACHE_STALE;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-        u->cache_status = NGX_HTTP_CACHE_HIT;[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_STALE:[m
[31m-[m
[31m-        c->valid_sec = 0;[m
[31m-        u->buffer.start = NULL;[m
[31m-        u->cache_status = NGX_HTTP_CACHE_EXPIRED;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-[m
[31m-        if ((size_t) (u->buffer.end - u->buffer.start) < u->conf->buffer_size) {[m
[31m-            u->buffer.start = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            u->buffer.pos = u->buffer.start + c->header_start;[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_SCARCE:[m
[31m-[m
[31m-        u->cacheable = 0;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_AGAIN:[m
[31m-[m
[31m-        return NGX_BUSY;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        /* cached NGX_HTTP_BAD_GATEWAY, NGX_HTTP_GATEWAY_TIME_OUT, etc. */[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_HIT;[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->cached = 0;[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_get(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_http_file_cache_t **cache)[m
[31m-{[m
[31m-    ngx_str_t               *name, val;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_file_cache_t  **caches;[m
[31m-[m
[31m-    if (u->conf->cache_zone) {[m
[31m-        *cache = u->conf->cache_zone->data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, u->conf->cache_value, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len == 0[m
[31m-        || (val.len == 3 && ngx_strncmp(val.data, "off", 3) == 0))[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    caches = u->caches->elts;[m
[31m-[m
[31m-    for (i = 0; i < u->caches->nelts; i++) {[m
[31m-        name = &caches[i]->shm_zone->shm.name;[m
[31m-[m
[31m-        if (name->len == val.len[m
[31m-            && ngx_strncmp(name->data, val.data, val.len) == 0)[m
[31m-        {[m
[31m-            *cache = caches[i];[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "cache \"%V\" not found", &val);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    r->cached = 1;[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->header_start == c->body_start) {[m
[31m-        r->http_version = NGX_HTTP_VERSION_9;[m
[31m-        return ngx_http_cache_send(r);[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: cache stack */[m
[31m-[m
[31m-    u->buffer = *c->buf;[m
[31m-    u->buffer.pos += c->header_start;[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = u->process_header(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_cache_send(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_HTTP_UPSTREAM_INVALID_HEADER */[m
[31m-[m
[31m-    /* TODO: delete file */[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *r;[m
[31m-    ngx_http_upstream_t           *u;[m
[31m-    ngx_http_upstream_resolved_t  *ur;[m
[31m-[m
[31m-    r = ctx->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream resolve: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "%V could not be resolved (%i: %s)",[m
[31m-                      &ctx->name, ctx->state,[m
[31m-                      ngx_resolver_strerror(ctx->state));[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ur->naddrs = ctx->naddrs;[m
[31m-    ur->addrs = ctx->addrs;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    u_char      text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t   addr;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-    ur->ctx = NULL;[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (u->conf->next_upstream_tries[m
[31m-        && u->peer.tries > u->conf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = u->conf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        u->write_event_handler(r, u);[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_check_broken_connection(r, r->connection->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_check_broken_connection(r, r->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    char                 buf[1];[m
[31m-    ngx_err_t            err;[m
[31m-    ngx_int_t            event;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "http upstream check client, write event:%d, \"%V\"",[m
[31m-                   ev->write, &r->uri);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-            event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-            if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!ev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        if (ev->kq_errno) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                          "kevent() reported that client prematurely closed "[m
[31m-                          "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                      "kevent() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ev->pending_eof) {[m
[31m-        socklen_t  len;[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        err = 0;[m
[31m-        len = sizeof(ngx_err_t);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                        "epoll_wait() reported that client prematurely closed "[m
[31m-                        "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "epoll_wait() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,[m
[31m-                   "http upstream recv(): %d", n);[m
[31m-[m
[31m-    if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-        event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-        if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->error = 1;[m
[31m-[m
[31m-    } else { /* n == 0 */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev->eof = 1;[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (!u->cacheable && u->peer.connection) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "client prematurely closed connection, "[m
[31m-                      "so upstream connection is closed too");[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    if (u->peer.connection == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r->connection->log->action = "connecting to upstream";[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-    u->state = ngx_array_push(r->upstream_states);[m
[31m-    if (u->state == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-[m
[31m-    u->state->response_time = ngx_current_msec;[m
[31m-    u->state->connect_time = (ngx_msec_t) -1;[m
[31m-    u->state->header_time = (ngx_msec_t) -1;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&u->peer);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->peer = u->peer.name;[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    c->data = r;[m
[31m-[m
[31m-    c->write->handler = ngx_http_upstream_handler;[m
[31m-    c->read->handler = ngx_http_upstream_handler;[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_upstream_send_request_handler;[m
[31m-    u->read_event_handler = ngx_http_upstream_process_header;[m
[31m-[m
[31m-    c->sendfile &= r->connection->sendfile;[m
[31m-    u->output.sendfile = c->sendfile;[m
[31m-[m
[31m-    if (c->pool == NULL) {[m
[31m-[m
[31m-        /* we need separate pool here to be able to cache SSL connections */[m
[31m-[m
[31m-        c->pool = ngx_create_pool(128, r->connection->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log = r->connection->log;[m
[31m-    c->pool->log = c->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */[m
[31m-[m
[31m-    u->writer.out = NULL;[m
[31m-    u->writer.last = &u->writer.out;[m
[31m-    u->writer.connection = c;[m
[31m-    u->writer.limit = 0;[m
[31m-[m
[31m-    if (u->request_sent) {[m
[31m-        if (ngx_http_upstream_reinit(r, u) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body[m
[31m-        && r->request_body->buf[m
[31m-        && r->request_body->temp_file[m
[31m-        && r == r->main)[m
[31m-    {[m
[31m-        /*[m
[31m-         * the r->request_body->buf can be reused for one request only,[m
[31m-         * the subrequests should allocate their own temporary bufs[m
[31m-         */[m
[31m-[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = r->request_body->buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-        u->output.allocated = 1;[m
[31m-[m
[31m-        r->request_body->buf->pos = r->request_body->buf->start;[m
[31m-        r->request_body->buf->last = r->request_body->buf->start;[m
[31m-        r->request_body->buf->tag = u->output.tag;[m
[31m-    }[m
[31m-[m
[31m-    u->request_sent = 0;[m
[31m-    u->request_body_sent = 0;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(u->conf->ssl, c,[m
[31m-                                  NGX_SSL_BUFFER|NGX_SSL_CLIENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->sendfile = 0;[m
[31m-    u->output.sendfile = 0;[m
[31m-[m
[31m-    if (u->conf->ssl_server_name || u->conf->ssl_verify) {[m
[31m-        if (ngx_http_upstream_ssl_name(r, u, c) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->ssl_session_reuse) {[m
[31m-        if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* abbreviated SSL handshake may interact badly with Nagle */[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "SSL handshaking to upstream";[m
[31m-[m
[31m-    rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!c->write->timer_set) {[m
[31m-            ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->handler = ngx_http_upstream_ssl_handshake;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_ssl_handshake(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_ssl_handshake(ngx_connection_t *c)[m
[31m-{[m
[31m-    long                  rc;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    r = c->data;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        if (u->conf->ssl_verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_ssl_check_host(c, &u->ssl_name) != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream SSL certificate does not match \"%V\"",[m
[31m-                              &u->ssl_name);[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (u->conf->ssl_session_reuse) {[m
[31m-            u->peer.save_session(&u->peer, u->peer.data);[m
[31m-        }[m
[31m-[m
[31m-        c->write->handler = ngx_http_upstream_handler;[m
[31m-        c->read->handler = ngx_http_upstream_handler;[m
[31m-[m
[31m-        c = r->connection;[m
[31m-[m
[31m-        ngx_http_upstream_send_request(r, u, 1);[m
[31m-[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_ssl_name(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_connection_t *c)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t   name;[m
[31m-[m
[31m-    if (u->conf->ssl_name) {[m
[31m-        if (ngx_http_complex_value(r, u->conf->ssl_name, &name) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        name = u->ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * ssl name here may contain port, notably if derived from $proxy_host[m
[31m-     * or $http_host; we have to strip it[m
[31m-     */[m
[31m-[m
[31m-    p = name.data;[m
[31m-    last = name.data + name.len;[m
[31m-[m
[31m-    if (*p == '[') {[m
[31m-        p = ngx_strlchr(p, last, ']');[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            p = name.data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlchr(p, last, ':');[m
[31m-[m
[31m-    if (p != NULL) {[m
[31m-        name.len = p - name.data;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->conf->ssl_server_name) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */[m
[31m-[m
[31m-    if (name.len == 0 || *name.data == '[') {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_set_tlsext_host_name() needs a null-terminated string,[m
[31m-     * hence we explicitly null-terminate name here[m
[31m-     */[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, name.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(p, name.data, name.len + 1);[m
[31m-[m
[31m-    name.data = p;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream SSL server name: \"%s\"", name.data);[m
[31m-[m
[31m-    if (SSL_set_tlsext_host_name(c->ssl->connection, name.data) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "SSL_set_tlsext_host_name(\"%s\") failed", name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    u->ssl_name = name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    off_t         file_pos;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (u->reinit_request(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->keepalive = 0;[m
[31m-    u->upgrade = 0;[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the request chain */[m
[31m-[m
[31m-    file_pos = 0;[m
[31m-[m
[31m-    for (cl = u->request_bufs; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->start;[m
[31m-[m
[31m-        /* there is at most one file */[m
[31m-[m
[31m-        if (cl->buf->in_file) {[m
[31m-            cl->buf->file_pos = file_pos;[m
[31m-            file_pos = cl->buf->file_last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the subrequest's ngx_output_chain() context */[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file[m
[31m-        && r != r->main && u->output.buf)[m
[31m-    {[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = u->output.buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-[m
[31m-        u->output.buf->pos = u->output.buf->start;[m
[31m-        u->output.buf->last = u->output.buf->start;[m
[31m-    }[m
[31m-[m
[31m-    u->output.buf = NULL;[m
[31m-    u->output.in = NULL;[m
[31m-    u->output.busy = NULL;[m
[31m-[m
[31m-    /* reinit u->buffer */[m
[31m-[m
[31m-    u->buffer.pos = u->buffer.start;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-        u->buffer.pos += r->cache->header_start;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream send request");[m
[31m-[m
[31m-    if (u->state->connect_time == (ngx_msec_t) -1) {[m
[31m-        u->state->connect_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "sending request to upstream";[m
[31m-[m
[31m-    rc = ngx_http_upstream_send_request_body(r, u, do_write);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        if (!c->write->ready) {[m
[31m-            ngx_add_timer(c->write, u->conf->send_timeout);[m
[31m-[m
[31m-        } else if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    u->request_body_sent = 1;[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,[m
[31m-                          ngx_tcp_push_n " failed");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-    }[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_upstream_dummy_handler;[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(c->read, u->conf->read_timeout);[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        ngx_http_upstream_process_header(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_send_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t               *out, *cl, *ln;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream send request body");[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-[m
[31m-        /* buffered request body */[m
[31m-[m
[31m-        if (!u->request_sent) {[m
[31m-            u->request_sent = 1;[m
[31m-            out = u->request_bufs;[m
[31m-[m
[31m-        } else {[m
[31m-            out = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_output_chain(&u->output, out);[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent) {[m
[31m-        u->request_sent = 1;[m
[31m-        out = u->request_bufs;[m
[31m-[m
[31m-        if (r->request_body->bufs) {[m
[31m-            for (cl = out; cl->next; cl = out->next) { /* void */ }[m
[31m-            cl->next = r->request_body->bufs;[m
[31m-            r->request_body->bufs = NULL;[m
[31m-        }[m
[31m-[m
[31m-        c = u->peer.connection;[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_upstream_read_request_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        out = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-            rc = ngx_output_chain(&u->output, out);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            while (out) {[m
[31m-                ln = out;[m
[31m-                out = out->next;[m
[31m-                ngx_free_chain(r->pool, ln);[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_OK && !r->reading_body) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (r->reading_body) {[m
[31m-            /* read client request body */[m
[31m-[m
[31m-            rc = ngx_http_read_unbuffered_request_body(r);[m
[31m-[m
[31m-            if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            out = r->request_body->bufs;[m
[31m-            r->request_body->bufs = NULL;[m
[31m-        }[m
[31m-[m
[31m-        /* stop if there is nothing to send */[m
[31m-[m
[31m-        if (out == NULL) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        do_write = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->reading_body) {[m
[31m-        if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-            r->read_event_handler =[m
[31m-                                  ngx_http_upstream_rd_check_broken_connection;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_request_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream send request handler");[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (u->request_body_sent) {[m
[31m-        u->write_event_handler = ngx_http_upstream_dummy_handler;[m
[31m-[m
[31m-        (void) ngx_handle_write_event(c->write, 0);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_read_request_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream read request handler");[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ssize_t            n;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process header");[m
[31m-[m
[31m-    c->log->action = "reading response header from upstream";[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->buffer.start == NULL) {[m
[31m-        u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size);[m
[31m-        if (u->buffer.start == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->buffer.pos = u->buffer.start;[m
[31m-        u->buffer.last = u->buffer.start;[m
[31m-        u->buffer.end = u->buffer.start + u->conf->buffer_size;[m
[31m-        u->buffer.temporary = 1;[m
[31m-[m
[31m-        u->buffer.tag = u->output.tag;[m
[31m-[m
[31m-        if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                          sizeof(ngx_table_elt_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (r->cache) {[m
[31m-            u->buffer.pos += r->cache->header_start;[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-#if 0[m
[31m-            ngx_add_timer(rev, u->read_timeout);[m
[31m-#endif[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "upstream prematurely closed connection");[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->buffer.last += n;[m
[31m-[m
[31m-#if 0[m
[31m-        u->valid_header_in = 0;[m
[31m-[m
[31m-        u->peer.cached = 0;[m
[31m-#endif[m
[31m-[m
[31m-        rc = u->process_header(r);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            if (u->buffer.last == u->buffer.end) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream sent too big header");[m
[31m-[m
[31m-                ngx_http_upstream_next(r, u,[m
[31m-                                       NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    u->state->header_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-    if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-[m
[31m-        if (ngx_http_upstream_test_next(r, u) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_upstream_intercept_errors(r, u) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->subrequest_in_memory) {[m
[31m-        ngx_http_upstream_send_response(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* subrequest content in memory */[m
[31m-[m
[31m-    if (u->input_filter == NULL) {[m
[31m-        u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;[m
[31m-        u->input_filter = ngx_http_upstream_non_buffered_filter;[m
[31m-        u->input_filter_ctx = r;[m
[31m-    }[m
[31m-[m
[31m-    if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    n = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-    if (n) {[m
[31m-        u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-        u->state->response_length += n;[m
[31m-[m
[31m-        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_process_body_in_memory;[m
[31m-[m
[31m-    ngx_http_upstream_process_body_in_memory(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_uint_t                 status;[m
[31m-    ngx_http_upstream_next_t  *un;[m
[31m-[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    for (un = ngx_http_upstream_next_errors; un->status; un++) {[m
[31m-[m
[31m-        if (status != un->status) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.tries > 1 && (u->conf->next_upstream & un->mask)) {[m
[31m-            ngx_http_upstream_next(r, u, un->mask);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-            && (u->conf->cache_use_stale & un->mask))[m
[31m-        {[m
[31m-            ngx_int_t  rc;[m
[31m-[m
[31m-            rc = u->reinit_request(r);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                u->cache_status = NGX_HTTP_CACHE_STALE;[m
[31m-                rc = ngx_http_upstream_cache_send(r, u);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (status == NGX_HTTP_NOT_MODIFIED[m
[31m-        && u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-        && u->conf->cache_revalidate)[m
[31m-    {[m
[31m-        time_t     now, valid;[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream not modified");[m
[31m-[m
[31m-        now = ngx_time();[m
[31m-        valid = r->cache->valid_sec;[m
[31m-[m
[31m-        rc = u->reinit_request(r);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_REVALIDATED;[m
[31m-        rc = ngx_http_upstream_cache_send(r, u);[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = r->cache->valid_sec;[m
[31m-        }[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = ngx_http_file_cache_valid(u->conf->cache_valid,[m
[31m-                                              u->headers_in.status_n);[m
[31m-            if (valid) {[m
[31m-                valid = now + valid;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (valid) {[m
[31m-            r->cache->valid_sec = valid;[m
[31m-            r->cache->date = now;[m
[31m-[m
[31m-            ngx_http_file_cache_update_header(r);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_intercept_errors(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                  status;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_table_elt_t           *h;[m
[31m-    ngx_http_err_page_t       *err_page;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->conf->intercept_errors) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    err_page = clcf->error_pages->elts;[m
[31m-    for (i = 0; i < clcf->error_pages->nelts; i++) {[m
[31m-[m
[31m-        if (err_page[i].status == status) {[m
[31m-[m
[31m-            if (status == NGX_HTTP_UNAUTHORIZED[m
[31m-                && u->headers_in.www_authenticate)[m
[31m-            {[m
[31m-                h = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-                if (h == NULL) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                *h = *u->headers_in.www_authenticate;[m
[31m-[m
[31m-                r->headers_out.www_authenticate = h;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-            if (r->cache) {[m
[31m-                time_t  valid;[m
[31m-[m
[31m-                valid = ngx_http_file_cache_valid(u->conf->cache_valid, status);[m
[31m-[m
[31m-                if (valid) {[m
[31m-                    r->cache->valid_sec = ngx_time() + valid;[m
[31m-                    r->cache->error = status;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_upstream_finalize_request(r, u, status);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        if (c->write->pending_eof || c->read->pending_eof) {[m
[31m-            if (c->write->pending_eof) {[m
[31m-                err = c->write->kq_errno;[m
[31m-[m
[31m-            } else {[m
[31m-                err = c->read->kq_errno;[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err,[m
[31m-                                    "kevent() reported that connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_str_t                       uri, args;[m
[31m-    ngx_uint_t                      i, flags;[m
[31m-    ngx_list_part_t                *part;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (u->headers_in.x_accel_redirect[m
[31m-        && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT))[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);[m
[31m-[m
[31m-        part = &u->headers_in.headers.part;[m
[31m-        h = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                h = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,[m
[31m-                               h[i].lowcase_key, h[i].key.len);[m
[31m-[m
[31m-            if (hh && hh->redirect) {[m
[31m-                if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {[m
[31m-                    ngx_http_finalize_request(r,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        uri = u->headers_in.x_accel_redirect->value;[m
[31m-[m
[31m-        if (uri.data[0] == '@') {[m
[31m-            ngx_http_named_location(r, &uri);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_null(&args);[m
[31m-            flags = NGX_HTTP_LOG_UNSAFE;[m
[31m-[m
[31m-            if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags) != NGX_OK) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            if (r->method != NGX_HTTP_HEAD) {[m
[31m-                r->method = NGX_HTTP_GET;[m
[31m-                r->method_name = ngx_http_core_get_method;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_internal_redirect(r, &uri, &args);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    part = &u->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash,[m
[31m-                          h[i].lowcase_key, h[i].key.len))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,[m
[31m-                           h[i].lowcase_key, h[i].key.len);[m
[31m-[m
[31m-        if (hh) {[m
[31m-            if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.server && r->headers_out.server->value.data == NULL) {[m
[31m-        r->headers_out.server->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date && r->headers_out.date->value.data == NULL) {[m
[31m-        r->headers_out.date->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = u->headers_in.status_n;[m
[31m-    r->headers_out.status_line = u->headers_in.status_line;[m
[31m-[m
[31m-    r->headers_out.content_length_n = u->headers_in.content_length_n;[m
[31m-[m
[31m-    r->disable_not_modified = !u->cacheable;[m
[31m-[m
[31m-    if (u->conf->force_ranges) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        r->single_range = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        if (r->cached) {[m
[31m-            r->single_range = 0;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    u->length = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ssize_t            n;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process body on memory");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "upstream buffer is too small to read response");[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        n = c->recv(c, b->last, size);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0 || n == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, n);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->state->response_length += n;[m
[31m-[m
[31m-        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!rev->ready) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        ngx_add_timer(rev, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_event_pipe_t          *p;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->header_sent = 1;[m
[31m-[m
[31m-    if (u->upgrade) {[m
[31m-        ngx_http_upstream_upgrade(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-[m
[31m-        if (!u->buffering) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && !u->store) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->pipe->downstream_error = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file) {[m
[31m-        ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd);[m
[31m-        r->request_body->temp_file->file.fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!u->buffering) {[m
[31m-[m
[31m-        if (u->input_filter == NULL) {[m
[31m-            u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;[m
[31m-            u->input_filter = ngx_http_upstream_non_buffered_filter;[m
[31m-            u->input_filter_ctx = r;[m
[31m-        }[m
[31m-[m
[31m-        u->read_event_handler = ngx_http_upstream_process_non_buffered_upstream;[m
[31m-        r->write_event_handler =[m
[31m-                             ngx_http_upstream_process_non_buffered_downstream;[m
[31m-[m
[31m-        r->limit_rate = 0;[m
[31m-[m
[31m-        if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                               (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        n = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-        if (n) {[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-            u->state->response_length += n;[m
[31m-[m
[31m-            if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_process_non_buffered_downstream(r);[m
[31m-[m
[31m-        } else {[m
[31m-            u->buffer.pos = u->buffer.start;[m
[31m-            u->buffer.last = u->buffer.start;[m
[31m-[m
[31m-            if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (u->peer.connection->read->ready || u->length == 0) {[m
[31m-                ngx_http_upstream_process_non_buffered_upstream(r, u);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: preallocate event_pipe bufs, look "Content-Length" */[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache && r->cache->file.fd != NGX_INVALID_FILE) {[m
[31m-        ngx_pool_run_cleanup_file(r->pool, r->cache->file.fd);[m
[31m-        r->cache->file.fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    switch (ngx_http_test_predicates(r, u->conf->no_cache)) {[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        u->cacheable = 0;[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_OK */[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_BYPASS) {[m
[31m-[m
[31m-            /* create cache if previously bypassed */[m
[31m-[m
[31m-            if (ngx_http_file_cache_create(r) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-        time_t  now, valid;[m
[31m-[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        valid = r->cache->valid_sec;[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = ngx_http_file_cache_valid(u->conf->cache_valid,[m
[31m-                                              u->headers_in.status_n);[m
[31m-            if (valid) {[m
[31m-                r->cache->valid_sec = now + valid;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (valid) {[m
[31m-            r->cache->date = now;[m
[31m-            r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start);[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_OK[m
[31m-                || u->headers_in.status_n == NGX_HTTP_PARTIAL_CONTENT)[m
[31m-            {[m
[31m-                r->cache->last_modified = u->headers_in.last_modified_time;[m
[31m-[m
[31m-                if (u->headers_in.etag) {[m
[31m-                    r->cache->etag = u->headers_in.etag->value;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_str_null(&r->cache->etag);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                r->cache->last_modified = -1;[m
[31m-                ngx_str_null(&r->cache->etag);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_file_cache_set_header(r, u->buffer.start) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            u->cacheable = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http cacheable: %d", u->cacheable);[m
[31m-[m
[31m-    if (u->cacheable == 0 && r->cache) {[m
[31m-        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only && !u->cacheable && !u->store) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    p = u->pipe;[m
[31m-[m
[31m-    p->output_filter = ngx_http_upstream_output_filter;[m
[31m-    p->output_ctx = r;[m
[31m-    p->tag = u->output.tag;[m
[31m-    p->bufs = u->conf->bufs;[m
[31m-    p->busy_size = u->conf->busy_buffers_size;[m
[31m-    p->upstream = u->peer.connection;[m
[31m-    p->downstream = c;[m
[31m-    p->pool = r->pool;[m
[31m-    p->log = c->log;[m
[31m-    p->limit_rate = u->conf->limit_rate;[m
[31m-    p->start_sec = ngx_time();[m
[31m-[m
[31m-    p->cacheable = u->cacheable || u->store;[m
[31m-[m
[31m-    p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-    if (p->temp_file == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p->temp_file->file.fd = NGX_INVALID_FILE;[m
[31m-    p->temp_file->file.log = c->log;[m
[31m-    p->temp_file->path = u->conf->temp_path;[m
[31m-    p->temp_file->pool = r->pool;[m
[31m-[m
[31m-    if (p->cacheable) {[m
[31m-        p->temp_file->persistent = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        if (r->cache && r->cache->file_cache->temp_path) {[m
[31m-            p->temp_file->path = r->cache->file_cache->temp_path;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        p->temp_file->log_level = NGX_LOG_WARN;[m
[31m-        p->temp_file->warn = "an upstream response is buffered "[m
[31m-                             "to a temporary file";[m
[31m-    }[m
[31m-[m
[31m-    p->max_temp_file_size = u->conf->max_temp_file_size;[m
[31m-    p->temp_file_write_size = u->conf->temp_file_write_size;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (clcf->aio == NGX_HTTP_AIO_THREADS && clcf->aio_write) {[m
[31m-        p->thread_handler = ngx_http_upstream_thread_handler;[m
[31m-        p->thread_ctx = r;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    p->preread_bufs = ngx_alloc_chain_link(r->pool);[m
[31m-    if (p->preread_bufs == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p->preread_bufs->buf = &u->buffer;[m
[31m-    p->preread_bufs->next = NULL;[m
[31m-    u->buffer.recycled = 1;[m
[31m-[m
[31m-    p->preread_size = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-[m
[31m-        p->buf_to_file = ngx_calloc_buf(r->pool);[m
[31m-        if (p->buf_to_file == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p->buf_to_file->start = u->buffer.start;[m
[31m-        p->buf_to_file->pos = u->buffer.start;[m
[31m-        p->buf_to_file->last = u->buffer.pos;[m
[31m-        p->buf_to_file->temporary = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-        /* the posted aio operation may corrupt a shadow buffer */[m
[31m-        p->single_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */[m
[31m-    p->free_bufs = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * event_pipe would do u->buffer.last += p->preread_size[m
[31m-     * as though these bytes were read[m
[31m-     */[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    if (u->conf->cyclic_temp_file) {[m
[31m-[m
[31m-        /*[m
[31m-         * we need to disable the use of sendfile() if we use cyclic temp file[m
[31m-         * because the writing a new data may interfere with sendfile()[m
[31m-         * that uses the same kernel file pages (at least on FreeBSD)[m
[31m-         */[m
[31m-[m
[31m-        p->cyclic_temp_file = 1;[m
[31m-        c->sendfile = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        p->cyclic_temp_file = 0;[m
[31m-    }[m
[31m-[m
[31m-    p->read_timeout = u->conf->read_timeout;[m
[31m-    p->send_timeout = clcf->send_timeout;[m
[31m-    p->send_lowat = clcf->send_lowat;[m
[31m-[m
[31m-    p->length = -1;[m
[31m-[m
[31m-    if (u->input_filter_init[m
[31m-        && u->input_filter_init(p->input_ctx) != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_process_upstream;[m
[31m-    r->write_event_handler = ngx_http_upstream_process_downstream;[m
[31m-[m
[31m-    ngx_http_upstream_process_upstream(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgrade(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    /* TODO: prevent upgrade if not requested or not possible */[m
[31m-[m
[31m-    r->keepalive = 0;[m
[31m-    c->log->action = "proxying upgraded connection";[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_upgraded_read_upstream;[m
[31m-    u->write_event_handler = ngx_http_upstream_upgraded_write_upstream;[m
[31m-    r->read_event_handler = ngx_http_upstream_upgraded_read_downstream;[m
[31m-    r->write_event_handler = ngx_http_upstream_upgraded_write_downstream;[m
[31m-[m
[31m-    if (clcf->tcp_nodelay) {[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.connection->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, u->peer.connection->log, 0,[m
[31m-                           "tcp_nodelay");[m
[31m-[m
[31m-            if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(u->peer.connection, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection->read->ready[m
[31m-        || u->buffer.pos != u->buffer.last)[m
[31m-    {[m
[31m-        ngx_post_event(c->read, &ngx_posted_events);[m
[31m-        ngx_http_upstream_process_upgraded(r, 1, 1);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 1, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 1, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_upgraded(ngx_http_request_t *r,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c, *downstream, *upstream, *dst, *src;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process upgraded, fu:%ui", from_upstream);[m
[31m-[m
[31m-    downstream = c;[m
[31m-    upstream = u->peer.connection;[m
[31m-[m
[31m-    if (downstream->write->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->timedout || upstream->write->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (from_upstream) {[m
[31m-        src = upstream;[m
[31m-        dst = downstream;[m
[31m-        b = &u->buffer;[m
[31m-[m
[31m-    } else {[m
[31m-        src = downstream;[m
[31m-        dst = upstream;[m
[31m-        b = &u->from_client;[m
[31m-[m
[31m-        if (r->header_in->last > r->header_in->pos) {[m
[31m-            b = r->header_in;[m
[31m-            b->end = b->last;[m
[31m-            do_write = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (b->start == NULL) {[m
[31m-            b->start = ngx_palloc(r->pool, u->conf->buffer_size);[m
[31m-            if (b->start == NULL) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start;[m
[31m-            b->last = b->start;[m
[31m-            b->end = b->start + u->conf->buffer_size;[m
[31m-            b->temporary = 1;[m
[31m-            b->tag = u->output.tag;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            size = b->last - b->pos;[m
[31m-[m
[31m-            if (size && dst->write->ready) {[m
[31m-[m
[31m-                n = dst->send(dst, b->pos, size);[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (n > 0) {[m
[31m-                    b->pos += n;[m
[31m-[m
[31m-                    if (b->pos == b->last) {[m
[31m-                        b->pos = b->start;[m
[31m-                        b->last = b->start;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && src->read->ready) {[m
[31m-[m
[31m-            n = src->recv(src, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                do_write = 1;[m
[31m-                b->last += n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                src->read->eof = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if ((upstream->read->eof && u->buffer.pos == u->buffer.last)[m
[31m-        || (downstream->read->eof && u->from_client.pos == u->from_client.last)[m
[31m-        || (downstream->read->eof && upstream->read->eof))[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http upstream upgraded done");[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (ngx_handle_write_event(upstream->write, u->conf->send_lowat)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->write->active && !upstream->write->ready) {[m
[31m-        ngx_add_timer(upstream->write, u->conf->send_timeout);[m
[31m-[m
[31m-    } else if (upstream->write->timer_set) {[m
[31m-        ngx_del_timer(upstream->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->active && !upstream->read->ready) {[m
[31m-        ngx_add_timer(upstream->read, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (upstream->read->timer_set) {[m
[31m-        ngx_del_timer(upstream->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(downstream->write, clcf->send_lowat)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (downstream->write->active && !downstream->write->ready) {[m
[31m-        ngx_add_timer(downstream->write, clcf->send_timeout);[m
[31m-[m
[31m-    } else if (downstream->write->timer_set) {[m
[31m-        ngx_del_timer(downstream->write);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t          *wev;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process non buffered downstream");[m
[31m-[m
[31m-    c->log->action = "sending to client";[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_non_buffered_request(r, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process non buffered upstream");[m
[31m-[m
[31m-    c->log->action = "reading upstream";[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_non_buffered_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_connection_t          *downstream, *upstream;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    downstream = r->connection;[m
[31m-    upstream = u->peer.connection;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    do_write = do_write || u->length == 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            if (u->out_bufs || u->busy_bufs) {[m
[31m-                rc = ngx_http_output_filter(r, u->out_bufs);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs,[m
[31m-                                        &u->out_bufs, u->output.tag);[m
[31m-            }[m
[31m-[m
[31m-            if (u->busy_bufs == NULL) {[m
[31m-[m
[31m-                if (u->length == 0[m
[31m-                    || (upstream->read->eof && u->length == -1))[m
[31m-                {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (upstream->read->eof) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, upstream->log, 0,[m
[31m-                                  "upstream prematurely closed connection");[m
[31m-[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                                       NGX_HTTP_BAD_GATEWAY);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (upstream->read->error) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                                       NGX_HTTP_BAD_GATEWAY);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                b->pos = b->start;[m
[31m-                b->last = b->start;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && upstream->read->ready) {[m
[31m-[m
[31m-            n = upstream->recv(upstream, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                u->state->response_length += n;[m
[31m-[m
[31m-                if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            do_write = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (downstream->data == r) {[m
[31m-        if (ngx_handle_write_event(downstream->write, clcf->send_lowat)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (downstream->write->active && !downstream->write->ready) {[m
[31m-        ngx_add_timer(downstream->write, clcf->send_timeout);[m
[31m-[m
[31m-    } else if (downstream->write->timer_set) {[m
[31m-        ngx_del_timer(downstream->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->active && !upstream->read->ready) {[m
[31m-        ngx_add_timer(upstream->read, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (upstream->read->timer_set) {[m
[31m-        ngx_del_timer(upstream->read);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_non_buffered_filter_init(void *data)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    cl->buf->pos = b->last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    if (u->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u->length -= bytes;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_event_pipe_t          *p;[m
[31m-    ngx_thread_pool_t         *tp;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r = file->thread_ctx;[m
[31m-    p = r->upstream->pipe;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    tp = clcf->thread_pool;[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "thread pool \"%V\" not found", &name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    task->event.data = r;[m
[31m-    task->event.handler = ngx_http_upstream_thread_event_handler;[m
[31m-[m
[31m-    if (ngx_thread_task_post(tp, task) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-    p->aio = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_thread_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream thread: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_output_filter(void *data, ngx_chain_t *chain)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_event_pipe_t    *p;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = data;[m
[31m-    p = r->upstream->pipe;[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, chain);[m
[31m-[m
[31m-    p->aio = r->aio;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t          *wev;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_event_pipe_t     *p;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-    p = u->pipe;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process downstream");[m
[31m-[m
[31m-    c->log->action = "sending to client";[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    p->aio = r->aio;[m
[31m-#endif[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-[m
[31m-        if (wev->delayed) {[m
[31m-[m
[31m-            wev->timedout = 0;[m
[31m-            wev->delayed = 0;[m
[31m-[m
[31m-            if (!wev->ready) {[m
[31m-                ngx_add_timer(wev, p->send_timeout);[m
[31m-[m
[31m-                if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_event_pipe(p, wev->write) == NGX_ABORT) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p->downstream_error = 1;[m
[31m-            c->timedout = 1;[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (wev->delayed) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http downstream delayed");[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_pipe(p, 1) == NGX_ABORT) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_request(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_event_pipe_t  *p;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    p = u->pipe;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process upstream");[m
[31m-[m
[31m-    c->log->action = "reading upstream";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-[m
[31m-        if (rev->delayed) {[m
[31m-[m
[31m-            rev->timedout = 0;[m
[31m-            rev->delayed = 0;[m
[31m-[m
[31m-            if (!rev->ready) {[m
[31m-                ngx_add_timer(rev, p->read_timeout);[m
[31m-[m
[31m-                if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_event_pipe(p, 0) == NGX_ABORT) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p->upstream_error = 1;[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (rev->delayed) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http upstream delayed");[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_pipe(p, 0) == NGX_ABORT) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_request(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_temp_file_t   *tf;[m
[31m-    ngx_event_pipe_t  *p;[m
[31m-[m
[31m-    p = u->pipe;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (p->writing) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-        if (u->store) {[m
[31m-[m
[31m-            if (p->upstream_eof || p->upstream_done) {[m
[31m-[m
[31m-                tf = p->temp_file;[m
[31m-[m
[31m-                if (u->headers_in.status_n == NGX_HTTP_OK[m
[31m-                    && (p->upstream_done || p->length == -1)[m
[31m-                    && (u->headers_in.content_length_n == -1[m
[31m-                        || u->headers_in.content_length_n == tf->offset))[m
[31m-                {[m
[31m-                    ngx_http_upstream_store(r, u);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cacheable) {[m
[31m-[m
[31m-            if (p->upstream_done) {[m
[31m-                ngx_http_file_cache_update(r, p->temp_file);[m
[31m-[m
[31m-            } else if (p->upstream_eof) {[m
[31m-[m
[31m-                tf = p->temp_file;[m
[31m-[m
[31m-                if (p->length == -1[m
[31m-                    && (u->headers_in.content_length_n == -1[m
[31m-                        || u->headers_in.content_length_n[m
[31m-                           == tf->offset - (off_t) r->cache->body_start))[m
[31m-                {[m
[31m-                    ngx_http_file_cache_update(r, tf);[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_http_file_cache_free(r->cache, tf);[m
[31m-                }[m
[31m-[m
[31m-            } else if (p->upstream_error) {[m
[31m-                ngx_http_file_cache_free(r->cache, p->temp_file);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (p->upstream_done || p->upstream_eof || p->upstream_error) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http upstream exit: %p", p->out);[m
[31m-[m
[31m-            if (p->upstream_done[m
[31m-                || (p->upstream_eof && p->length == -1))[m
[31m-            {[m
[31m-                ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (p->upstream_eof) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream prematurely closed connection");[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->downstream_error) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream downstream error");[m
[31m-[m
[31m-        if (!u->cacheable && !u->store && u->peer.connection) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    size_t                  root;[m
[31m-    time_t                  lm;[m
[31m-    ngx_str_t               path;[m
[31m-    ngx_temp_file_t        *tf;[m
[31m-    ngx_ext_rename_file_t   ext;[m
[31m-[m
[31m-    tf = u->pipe->temp_file;[m
[31m-[m
[31m-    if (tf->file.fd == NGX_INVALID_FILE) {[m
[31m-[m
[31m-        /* create file for empty 200 response */[m
[31m-[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = u->conf->temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->persistent = 1;[m
[31m-[m
[31m-        if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                 tf->persistent, tf->clean, tf->access)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->pipe->temp_file = tf;[m
[31m-    }[m
[31m-[m
[31m-    ext.access = u->conf->store_access;[m
[31m-    ext.path_access = u->conf->store_access;[m
[31m-    ext.time = -1;[m
[31m-    ext.create_path = 1;[m
[31m-    ext.delete_file = 1;[m
[31m-    ext.log = r->connection->log;[m
[31m-[m
[31m-    if (u->headers_in.last_modified) {[m
[31m-[m
[31m-        lm = ngx_parse_http_time(u->headers_in.last_modified->value.data,[m
[31m-                                 u->headers_in.last_modified->value.len);[m
[31m-[m
[31m-        if (lm != NGX_ERROR) {[m
[31m-            ext.time = lm;[m
[31m-            ext.fd = tf->file.fd;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->store_lengths == NULL) {[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_script_run(r, &path, u->conf->store_lengths->elts, 0,[m
[31m-                                u->conf->store_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    path.len--;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream stores \"%s\" to \"%s\"",[m
[31m-                   tf->file.name.data, path.data);[m
[31m-[m
[31m-    (void) ngx_ext_rename_file(&tf->file.name, &path, &ext);[m
[31m-[m
[31m-    u->store = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dummy_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_msec_t  timeout;[m
[31m-    ngx_uint_t  status, state;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http next upstream, %xi", ft_type);[m
[31m-[m
[31m-    if (u->peer.sockaddr) {[m
[31m-[m
[31m-        if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_403[m
[31m-            || ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404)[m
[31m-        {[m
[31m-            state = NGX_PEER_NEXT;[m
[31m-[m
[31m-        } else {[m
[31m-            state = NGX_PEER_FAILED;[m
[31m-        }[m
[31m-[m
[31m-        u->peer.free(&u->peer, u->peer.data, state);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        /* TODO: inform balancer instead */[m
[31m-        u->peer.tries++;[m
[31m-    }[m
[31m-[m
[31m-    switch (ft_type) {[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_TIMEOUT:[m
[31m-        status = NGX_HTTP_GATEWAY_TIME_OUT;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_500:[m
[31m-        status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_403:[m
[31m-        status = NGX_HTTP_FORBIDDEN;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_404:[m
[31m-        status = NGX_HTTP_NOT_FOUND;[m
[31m-        break;[m
[31m-[m
[31m-    /*[m
[31m-     * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING[m
[31m-     * never reach here[m
[31m-     */[m
[31m-[m
[31m-    default:[m
[31m-        status = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->error) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->status = status;[m
[31m-[m
[31m-    timeout = u->conf->next_upstream_timeout;[m
[31m-[m
[31m-    if (u->request_sent[m
[31m-        && (r->method & (NGX_HTTP_POST|NGX_HTTP_LOCK|NGX_HTTP_PATCH)))[m
[31m-    {[m
[31m-        ft_type |= NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.tries == 0[m
[31m-        || ((u->conf->next_upstream & ft_type) != ft_type)[m
[31m-        || (u->request_sent && r->request_body_no_buffering)[m
[31m-        || (timeout && ngx_current_msec - u->peer.start_time >= timeout))[m
[31m-    {[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-            && (u->conf->cache_use_stale & ft_type))[m
[31m-        {[m
[31m-            ngx_int_t  rc;[m
[31m-[m
[31m-            rc = u->reinit_request(r);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                u->cache_status = NGX_HTTP_CACHE_STALE;[m
[31m-                rc = ngx_http_upstream_cache_send(r, u);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, status);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-            u->peer.connection->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-        u->peer.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t *r = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup http upstream request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_http_upstream_finalize_request(r, r->upstream, NGX_DONE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_uint_t  flush;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http upstream request: %i", rc);[m
[31m-[m
[31m-    if (u->cleanup == NULL) {[m
[31m-        /* the request was already finalized */[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *u->cleanup = NULL;[m
[31m-    u->cleanup = NULL;[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-        if (u->pipe && u->pipe->read_length) {[m
[31m-            u->state->response_length = u->pipe->read_length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->finalize_request(r, rc);[m
[31m-[m
[31m-    if (u->peer.free && u->peer.sockaddr) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        /* TODO: do not shutdown persistent connection */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-[m
[31m-            /*[m
[31m-             * We send the "close notify" shutdown alert to the upstream only[m
[31m-             * and do not wait its "close notify" shutdown alert.[m
[31m-             * It is acceptable according to the TLS standard.[m
[31m-             */[m
[31m-[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    u->peer.connection = NULL;[m
[31m-[m
[31m-    if (u->pipe && u->pipe->temp_file) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream temp fd: %d",[m
[31m-                       u->pipe->temp_file->file.fd);[m
[31m-    }[m
[31m-[m
[31m-    if (u->store && u->pipe && u->pipe->temp_file[m
[31m-        && u->pipe->temp_file->file.fd != NGX_INVALID_FILE)[m
[31m-    {[m
[31m-        if (ngx_delete_file(u->pipe->temp_file->file.name.data)[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                          ngx_delete_file_n " \"%s\" failed",[m
[31m-                          u->pipe->temp_file->file.name.data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-[m
[31m-        if (u->cacheable) {[m
[31m-[m
[31m-            if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT) {[m
[31m-                time_t  valid;[m
[31m-[m
[31m-                valid = ngx_http_file_cache_valid(u->conf->cache_valid, rc);[m
[31m-[m
[31m-                if (valid) {[m
[31m-                    r->cache->valid_sec = ngx_time() + valid;[m
[31m-                    r->cache->error = rc;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (r->subrequest_in_memory[m
[31m-        && u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-    {[m
[31m-        u->buffer.last = u->buffer.pos;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "sending to client";[m
[31m-[m
[31m-    if (!u->header_sent[m
[31m-        || rc == NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        || (u->pipe && u->pipe->downstream_error))[m
[31m-    {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    flush = 0;[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        rc = NGX_ERROR;[m
[31m-        flush = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-    } else if (flush) {[m
[31m-        r->keepalive = 0;[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_FLUSH);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->headers_in.content_length = h;[m
[31m-    u->headers_in.content_length_n = ngx_atoof(h->value.data, h->value.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->headers_in.last_modified = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-        u->headers_in.last_modified_time = ngx_parse_http_time(h->value.data,[m
[31m-                                                               h->value.len);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t           *pa;[m
[31m-    ngx_table_elt_t      **ph;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pa = &u->headers_in.cookies;[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 1, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (!(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE)) {[m
[31m-        u->cacheable = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t          *pa;[m
[31m-    ngx_table_elt_t     **ph;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pa = &u->headers_in.cache_control;[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    u_char     *p, *start, *last;[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache->valid_sec != 0 && u->headers_in.x_accel_expires != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    start = h->value.data;[m
[31m-    last = start + h->value.len;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(start, last, (u_char *) "no-cache", 8 - 1) != NULL[m
[31m-        || ngx_strlcasestrn(start, last, (u_char *) "no-store", 8 - 1) != NULL[m
[31m-        || ngx_strlcasestrn(start, last, (u_char *) "private", 7 - 1) != NULL)[m
[31m-    {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlcasestrn(start, last, (u_char *) "s-maxage=", 9 - 1);[m
[31m-    offset = 9;[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        p = ngx_strlcasestrn(start, last, (u_char *) "max-age=", 8 - 1);[m
[31m-        offset = 8;[m
[31m-    }[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (p += offset; p < last; p++) {[m
[31m-        if (*p == ',' || *p == ';' || *p == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (*p >= '0' && *p <= '9') {[m
[31m-            n = n * 10 + *p - '0';[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->valid_sec = ngx_time() + n;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_expires(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.expires = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    time_t  expires;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_EXPIRES) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache->valid_sec != 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    expires = ngx_parse_http_time(h->value.data, h->value.len);[m
[31m-[m
[31m-    if (expires == NGX_ERROR || expires < ngx_time()) {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->valid_sec = expires;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.x_accel_expires = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    u_char     *p;[m
[31m-    size_t      len;[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = h->value.len;[m
[31m-    p = h->value.data;[m
[31m-[m
[31m-    if (p[0] != '@') {[m
[31m-        n = ngx_atoi(p, len);[m
[31m-[m
[31m-        switch (n) {[m
[31m-        case 0:[m
[31m-            u->cacheable = 0;[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        default:[m
[31m-            r->cache->valid_sec = ngx_time() + n;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p++;[m
[31m-    len--;[m
[31m-[m
[31m-    n = ngx_atoi(p, len);[m
[31m-[m
[31m-    if (n != NGX_ERROR) {[m
[31m-        r->cache->valid_sec = n;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.x_accel_limit_rate = h;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(h->value.data, h->value.len);[m
[31m-[m
[31m-    if (n != NGX_ERROR) {[m
[31m-        r->limit_rate = (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_buffering(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char                c0, c1, c2;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->change_buffering) {[m
[31m-[m
[31m-        if (h->value.len == 2) {[m
[31m-            c0 = ngx_tolower(h->value.data[0]);[m
[31m-            c1 = ngx_tolower(h->value.data[1]);[m
[31m-[m
[31m-            if (c0 == 'n' && c1 == 'o') {[m
[31m-                u->buffering = 0;[m
[31m-            }[m
[31m-[m
[31m-        } else if (h->value.len == 3) {[m
[31m-            c0 = ngx_tolower(h->value.data[0]);[m
[31m-            c1 = ngx_tolower(h->value.data[1]);[m
[31m-            c2 = ngx_tolower(h->value.data[2]);[m
[31m-[m
[31m-            if (c0 == 'y' && c1 == 'e' && c2 == 's') {[m
[31m-                u->buffering = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_charset(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    if (r->upstream->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_CHARSET) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.override_charset = &h->value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    r->upstream->headers_in.connection = h;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,[m
[31m-                         (u_char *) "close", 5 - 1)[m
[31m-        != NULL)[m
[31m-    {[m
[31m-        r->upstream->headers_in.connection_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    r->upstream->headers_in.transfer_encoding = h;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,[m
[31m-                         (u_char *) "chunked", 7 - 1)[m
[31m-        != NULL)[m
[31m-    {[m
[31m-        r->upstream->headers_in.chunked = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_vary(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.vary = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_VARY) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (h->value.len > NGX_HTTP_CACHE_VARY_LEN[m
[31m-        || (h->value.len == 1 && h->value.data[0] == '*'))[m
[31m-    {[m
[31m-        u->cacheable = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->vary = h->value;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (offset) {[m
[31m-        ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);[m
[31m-        *ph = ho;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    r->headers_out.content_type_len = h->value.len;[m
[31m-    r->headers_out.content_type = h->value;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    for (p = h->value.data; *p; p++) {[m
[31m-[m
[31m-        if (*p != ';') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        last = p;[m
[31m-[m
[31m-        while (*++p == ' ') { /* void */ }[m
[31m-[m
[31m-        if (*p == '\0') {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p += 8;[m
[31m-[m
[31m-        r->headers_out.content_type_len = last - h->value.data;[m
[31m-[m
[31m-        if (*p == '"') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        last = h->value.data + h->value.len;[m
[31m-[m
[31m-        if (*(last - 1) == '"') {[m
[31m-            last--;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.charset.len = last - p;[m
[31m-        r->headers_out.charset.data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.last_modified = ho;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->upstream->cacheable) {[m
[31m-        r->headers_out.last_modified_time =[m
[31m-                                    r->upstream->headers_in.last_modified_time;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_redirect) {[m
[31m-        rc = r->upstream->rewrite_redirect(r, ho, 0);[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->headers_out.location = ho;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten location: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ho->value.data[0] != '/') {[m
[31m-        r->headers_out.location = ho;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_redirect) {[m
[31m-[m
[31m-        p = ngx_strcasestrn(ho->value.data, "url=", 4 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data);[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->headers_out.refresh = ho;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten refresh: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.refresh = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_cookie) {[m
[31m-        rc = r->upstream->rewrite_cookie(r, ho);[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        if (rc == NGX_OK) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten cookie: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    if (r->upstream->conf->force_ranges) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cached) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->upstream->cacheable) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        r->single_range = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.accept_ranges = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.content_encoding = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_upstream_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for (i = 0; i < r->upstream_states->nelts; i++) {[m
[31m-        if (state[i].peer) {[m
[31m-            len += state[i].peer->len + 2;[m
[31m-[m
[31m-        } else {[m
[31m-            len += 3;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].peer) {[m
[31m-            p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len);[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (3 + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].status) {[m
[31m-            p = ngx_sprintf(p, "%ui", state[i].status);[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = '-';[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_response_time_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].status) {[m
[31m-[m
[31m-            if (data == 1 && state[i].header_time != (ngx_msec_t) -1) {[m
[31m-                ms = state[i].header_time;[m
[31m-[m
[31m-            } else if (data == 2 && state[i].connect_time != (ngx_msec_t) -1) {[m
[31m-                ms = state[i].connect_time;[m
[31m-[m
[31m-            } else {[m
[31m-                ms = state[i].response_time;[m
[31m-            }[m
[31m-[m
[31m-            ms = ngx_max(ms, 0);[m
[31m-            p = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000);[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = '-';[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_response_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (NGX_OFF_T_LEN + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        p = ngx_sprintf(p, "%O", state[i].response_length);[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_header_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->upstream == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,[m
[31m-                                         &r->upstream->headers_in.headers.part,[m
[31m-                                         sizeof("upstream_http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_cookie_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  *name = (ngx_str_t *) data;[m
[31m-[m
[31m-    ngx_str_t   cookie, s;[m
[31m-[m
[31m-    if (r->upstream == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    s.len = name->len - (sizeof("upstream_cookie_") - 1);[m
[31m-    s.data = name->data + sizeof("upstream_cookie_") - 1;[m
[31m-[m
[31m-    if (ngx_http_parse_set_cookie_lines(&r->upstream->headers_in.cookies,[m
[31m-                                        &s, &cookie)[m
[31m-        == NGX_DECLINED)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = cookie.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = cookie.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_cache_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t  n;[m
[31m-[m
[31m-    if (r->upstream == NULL || r->upstream->cache_status == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = r->upstream->cache_status - 1;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = ngx_http_cache_status[n].len;[m
[31m-    v->data = ngx_http_cache_status[n].data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->upstream == NULL[m
[31m-        || !r->upstream->conf->cache_revalidate[m
[31m-        || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED[m
[31m-        || r->cache->last_modified == -1)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_http_time(p, r->cache->last_modified) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_etag(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->upstream == NULL[m
[31m-        || !r->upstream->conf->cache_revalidate[m
[31m-        || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED[m
[31m-        || r->cache->etag.len == 0)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = r->cache->etag.len;[m
[31m-    v->data = r->cache->etag.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                          *rv;[m
[31m-    void                          *mconf;[m
[31m-    ngx_str_t                     *value;[m
[31m-    ngx_url_t                      u;[m
[31m-    ngx_uint_t                     m;[m
[31m-    ngx_conf_t                     pcf;[m
[31m-    ngx_http_module_t             *module;[m
[31m-    ngx_http_conf_ctx_t           *ctx, *http_ctx;[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    u.host = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-    u.no_port = 1;[m
[31m-[m
[31m-    uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE[m
[31m-                                         |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                                         |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                                         |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                                         |NGX_HTTP_UPSTREAM_DOWN[m
[31m-                                         |NGX_HTTP_UPSTREAM_BACKUP);[m
[31m-    if (uscf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx = cf->ctx;[m
[31m-    ctx->main_conf = http_ctx->main_conf;[m
[31m-[m
[31m-    /* the upstream{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->srv_conf[ngx_http_upstream_module.ctx_index] = uscf;[m
[31m-[m
[31m-    uscf->srv_conf = ctx->srv_conf;[m
[31m-[m
[31m-[m
[31m-    /* the upstream{}'s loc_conf */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    uscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                                     sizeof(ngx_http_upstream_server_t));[m
[31m-    if (uscf->servers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside upstream{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_UPS_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (uscf->servers->nelts == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no servers are inside upstream");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf = conf;[m
[31m-[m
[31m-    time_t                       fail_timeout;[m
[31m-    ngx_str_t                   *value, s;[m
[31m-    ngx_url_t                    u;[m
[31m-    ngx_int_t                    weight, max_fails;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_http_upstream_server_t  *us;[m
[31m-[m
[31m-    us = ngx_array_push(uscf->servers);[m
[31m-    if (us == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(us, sizeof(ngx_http_upstream_server_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    weight = 1;[m
[31m-    max_fails = 1;[m
[31m-    fail_timeout = 10;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            weight = ngx_atoi(&value[i].data[7], value[i].len - 7);[m
[31m-[m
[31m-            if (weight == NGX_ERROR || weight == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);[m
[31m-[m
[31m-            if (max_fails == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 13;[m
[31m-            s.data = &value[i].data[13];[m
[31m-[m
[31m-            fail_timeout = ngx_parse_time(&s, 1);[m
[31m-[m
[31m-            if (fail_timeout == (time_t) NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "backup") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->backup = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "down") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->down = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = 80;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in upstream \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->name = u.url;[m
[31m-    us->addrs = u.addrs;[m
[31m-    us->naddrs = u.naddrs;[m
[31m-    us->weight = weight;[m
[31m-    us->max_fails = max_fails;[m
[31m-    us->fail_timeout = fail_timeout;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid parameter \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-not_supported:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "balancing method does not support parameter \"%V\"",[m
[31m-                       &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_http_upstream_server_t     *us;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) {[m
[31m-[m
[31m-        if (ngx_parse_url(cf->pool, u) != NGX_OK) {[m
[31m-            if (u->err) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "%s in upstream \"%V\"", u->err, &u->url);[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != u->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_UPSTREAM_CREATE)[m
[31m-             && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate upstream \"%V\"", &u->host);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && !u->no_port) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "upstream \"%V\" may not have port %d",[m
[31m-                               &u->host, u->port);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_UPSTREAM_CREATE) && !uscfp[i]->no_port) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                          "upstream \"%V\" may not have port %d in %s:%ui",[m
[31m-                          &u->host, uscfp[i]->port,[m
[31m-                          uscfp[i]->file_name, uscfp[i]->line);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port && u->port[m
[31m-            && uscfp[i]->port != u->port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && u->default_port[m
[31m-            && uscfp[i]->default_port != u->default_port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_HTTP_UPSTREAM_CREATE) {[m
[31m-            uscfp[i]->flags = flags;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_srv_conf_t));[m
[31m-    if (uscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = flags;[m
[31m-    uscf->host = u->host;[m
[31m-    uscf->file_name = cf->conf_file->file.name.data;[m
[31m-    uscf->line = cf->conf_file->line;[m
[31m-    uscf->port = u->port;[m
[31m-    uscf->default_port = u->default_port;[m
[31m-    uscf->no_port = u->no_port;[m
[31m-[m
[31m-    if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) {[m
[31m-        uscf->servers = ngx_array_create(cf->pool, 1,[m
[31m-                                         sizeof(ngx_http_upstream_server_t));[m
[31m-        if (uscf->servers == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        us = ngx_array_push(uscf->servers);[m
[31m-        if (us == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(us, sizeof(ngx_http_upstream_server_t));[m
[31m-[m
[31m-        us->addrs = u->addrs;[m
[31m-        us->naddrs = 1;[m
[31m-    }[m
[31m-[m
[31m-    uscfp = ngx_array_push(&umcf->upstreams);[m
[31m-    if (uscfp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *uscfp = uscf;[m
[31m-[m
[31m-    return uscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t                           rc;[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_http_complex_value_t            cv;[m
[31m-    ngx_http_upstream_local_t         **plocal, *local;[m
[31m-    ngx_http_compile_complex_value_t    ccv;[m
[31m-[m
[31m-    plocal = (ngx_http_upstream_local_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*plocal != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        *plocal = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    local = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_local_t));[m
[31m-    if (local == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *plocal = local;[m
[31m-[m
[31m-    if (cv.lengths) {[m
[31m-        local->value = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (local->value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *local->value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));[m
[31m-    if (local->addr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(cf->pool, local->addr, value[1].data, value[1].len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        local->addr->name = value[1];[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid address \"%V\"", &value[1]);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_addr_t *[m
[31m-ngx_http_upstream_get_local(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_local_t *local)[m
[31m-{[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_str_t    val;[m
[31m-    ngx_addr_t  *addr;[m
[31m-[m
[31m-    if (local == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (local->value == NULL) {[m
[31m-        return local->addr;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, local->value, &val) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    addr = ngx_palloc(r->pool, sizeof(ngx_addr_t));[m
[31m-    if (addr == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(r->pool, addr, val.data, val.len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        addr->name = val;[m
[31m-        return addr;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid local address \"%V\"", &val);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_array_t                **a;[m
[31m-    ngx_http_upstream_param_t   *param;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_http_upstream_param_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    param = ngx_array_push(*a);[m
[31m-    if (param == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    param->key = value[1];[m
[31m-    param->value = value[2];[m
[31m-    param->skip_empty = 0;[m
[31m-[m
[31m-    if (cf->args->nelts == 4) {[m
[31m-        if (ngx_strcmp(value[3].data, "if_not_empty") != 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[3]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        param->skip_empty = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,[m
[31m-    ngx_str_t *default_hide_headers, ngx_hash_init_t *hash)[m
[31m-{[m
[31m-    ngx_str_t       *h;[m
[31m-    ngx_uint_t       i, j;[m
[31m-    ngx_array_t      hide_headers;[m
[31m-    ngx_hash_key_t  *hk;[m
[31m-[m
[31m-    if (conf->hide_headers == NGX_CONF_UNSET_PTR[m
[31m-        && conf->pass_headers == NGX_CONF_UNSET_PTR)[m
[31m-    {[m
[31m-        conf->hide_headers = prev->hide_headers;[m
[31m-        conf->pass_headers = prev->pass_headers;[m
[31m-[m
[31m-        conf->hide_headers_hash = prev->hide_headers_hash;[m
[31m-[m
[31m-        if (conf->hide_headers_hash.buckets[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-            && ((conf->cache == 0) == (prev->cache == 0))[m
[31m-#endif[m
[31m-           )[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (conf->hide_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->hide_headers = prev->hide_headers;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->pass_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->pass_headers = prev->pass_headers;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (h = default_hide_headers; h->len; h++) {[m
[31m-        hk = ngx_array_push(&hide_headers);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = *h;[m
[31m-        hk->key_hash = ngx_hash_key_lc(h->data, h->len);[m
[31m-        hk->value = (void *) 1;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->hide_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->hide_headers->elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->hide_headers->nelts; i++) {[m
[31m-[m
[31m-            hk = hide_headers.elts;[m
[31m-[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    goto exist;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hk = ngx_array_push(&hide_headers);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key = h[i];[m
[31m-            hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-        exist:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pass_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->pass_headers->elts;[m
[31m-        hk = hide_headers.elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->pass_headers->nelts; i++) {[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-[m
[31m-                if (hk[j].key.data == NULL) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    hk[j].key.data = NULL;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hash->hash = &conf->hide_headers_hash;[m
[31m-    hash->key = ngx_hash_key_lc;[m
[31m-    hash->pool = cf->pool;[m
[31m-    hash->temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_upstream_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t));[m
[31m-    if (umcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&umcf->upstreams, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_upstream_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return umcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_array_t                     headers_in;[m
[31m-    ngx_hash_key_t                 *hk;[m
[31m-    ngx_hash_init_t                 hash;[m
[31m-    ngx_http_upstream_init_pt       init;[m
[31m-    ngx_http_upstream_header_t     *header;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream:[m
[31m-                                            ngx_http_upstream_init_round_robin;[m
[31m-[m
[31m-        if (init(cf, uscfp[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* upstream_headers_in_hash */[m
[31m-[m
[31m-    if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (header = ngx_http_upstream_headers_in; header->name.len; header++) {[m
[31m-        hk = ngx_array_push(&headers_in);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = header->name;[m
[31m-        hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);[m
[31m-        hk->value = header;[m
[31m-    }[m
[31m-[m
[31m-    hash.hash = &umcf->headers_in_hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "upstream_headers_in_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 1386bdb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,6126 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_cache_get(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_file_cache_t **cache);[m
[31m-static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_cache_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_cache_etag(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#endif[m
[31m-[m
[31m-static void ngx_http_upstream_init_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_connect(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_send_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write);[m
[31m-static ngx_int_t ngx_http_upstream_send_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write);[m
[31m-static void ngx_http_upstream_send_request_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_read_request_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_process_header(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_test_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_intercept_errors(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_http_upstream_process_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_send_response(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgrade(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_upgraded(ngx_http_request_t *r,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,[m
[31m-    ngx_uint_t do_write);[m
[31m-static ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_upstream_non_buffered_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-#if (NGX_THREADS)[m
[31m-static ngx_int_t ngx_http_upstream_thread_handler(ngx_thread_task_t *task,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_upstream_thread_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_upstream_output_filter(void *data,[m
[31m-    ngx_chain_t *chain);[m
[31m-static void ngx_http_upstream_process_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_process_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_store(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_upstream_cleanup(void *data);[m
[31m-static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_set_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_process_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_buffering(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_charset(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_connection(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_vary(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_upstream_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_response_length_variable([m
[31m-    ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static char *ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy);[m
[31m-static char *ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_addr_t *ngx_http_upstream_get_local(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_local_t *local);[m
[31m-[m
[31m-static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c);[m
[31m-static void ngx_http_upstream_ssl_handshake(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_http_upstream_ssl_name(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_header_t  ngx_http_upstream_headers_in[] = {[m
[31m-[m
[31m-    { ngx_string("Status"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, status),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, content_type),[m
[31m-                 ngx_http_upstream_copy_content_type, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 ngx_http_upstream_process_content_length, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, date),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, date), 0 },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 ngx_http_upstream_process_last_modified, 0,[m
[31m-                 ngx_http_upstream_copy_last_modified, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, etag),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, etag), 0 },[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, server),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, server), 0 },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, www_authenticate),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, location),[m
[31m-                 ngx_http_upstream_rewrite_location, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_rewrite_refresh, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Set-Cookie"),[m
[31m-                 ngx_http_upstream_process_set_cookie,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, cookies),[m
[31m-                 ngx_http_upstream_rewrite_set_cookie, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Disposition"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 ngx_http_upstream_process_cache_control, 0,[m
[31m-                 ngx_http_upstream_copy_multi_header_lines,[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control), 1 },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 ngx_http_upstream_process_expires, 0,[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, expires), 1 },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, accept_ranges),[m
[31m-                 ngx_http_upstream_copy_allow_ranges,[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges), 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Range"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, content_range), 0 },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 ngx_http_upstream_process_connection, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Vary"),[m
[31m-                 ngx_http_upstream_process_vary, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Powered-By"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Expires"),[m
[31m-                 ngx_http_upstream_process_accel_expires, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Redirect"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Limit-Rate"),[m
[31m-                 ngx_http_upstream_process_limit_rate, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Buffering"),[m
[31m-                 ngx_http_upstream_process_buffering, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Charset"),[m
[31m-                 ngx_http_upstream_process_charset, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 ngx_http_upstream_process_transfer_encoding, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, content_encoding),[m
[31m-                 ngx_http_upstream_copy_content_encoding, 0, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, 0, NULL, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_commands[] = {[m
[31m-[m
[31m-    { ngx_string("upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_upstream_server,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_module_ctx = {[m
[31m-    ngx_http_upstream_add_variables,       /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_upstream_create_main_conf,    /* create main configuration */[m
[31m-    ngx_http_upstream_init_main_conf,      /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_module_ctx,         /* module context */[m
[31m-    ngx_http_upstream_commands,            /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_upstream_vars[] = {[m
[31m-[m
[31m-    { ngx_string("upstream_addr"), NULL,[m
[31m-      ngx_http_upstream_addr_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_status"), NULL,[m
[31m-      ngx_http_upstream_status_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_connect_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 2,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_header_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 1,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_response_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_response_length"), NULL,[m
[31m-      ngx_http_upstream_response_length_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("upstream_cache_status"), NULL,[m
[31m-      ngx_http_upstream_cache_status, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_cache_last_modified"), NULL,[m
[31m-      ngx_http_upstream_cache_last_modified, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_cache_etag"), NULL,[m
[31m-      ngx_http_upstream_cache_etag, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_next_t  ngx_http_upstream_next_errors[] = {[m
[31m-    { 500, NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { 502, NGX_HTTP_UPSTREAM_FT_HTTP_502 },[m
[31m-    { 503, NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { 504, NGX_HTTP_UPSTREAM_FT_HTTP_504 },[m
[31m-    { 403, NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { 404, NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_conf_bitmask_t  ngx_http_upstream_cache_method_mask[] = {[m
[31m-    { ngx_string("GET"), NGX_HTTP_GET },[m
[31m-    { ngx_string("HEAD"), NGX_HTTP_HEAD },[m
[31m-    { ngx_string("POST"), NGX_HTTP_POST },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_conf_bitmask_t  ngx_http_upstream_ignore_headers_masks[] = {[m
[31m-    { ngx_string("X-Accel-Redirect"), NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT },[m
[31m-    { ngx_string("X-Accel-Expires"), NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES },[m
[31m-    { ngx_string("X-Accel-Limit-Rate"), NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE },[m
[31m-    { ngx_string("X-Accel-Buffering"), NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING },[m
[31m-    { ngx_string("X-Accel-Charset"), NGX_HTTP_UPSTREAM_IGN_XA_CHARSET },[m
[31m-    { ngx_string("Expires"), NGX_HTTP_UPSTREAM_IGN_EXPIRES },[m
[31m-    { ngx_string("Cache-Control"), NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL },[m
[31m-    { ngx_string("Set-Cookie"), NGX_HTTP_UPSTREAM_IGN_SET_COOKIE },[m
[31m-    { ngx_string("Vary"), NGX_HTTP_UPSTREAM_IGN_VARY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_create(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u && u->cleanup) {[m
[31m-        r->main->count++;[m
[31m-        ngx_http_upstream_cleanup(r);[m
[31m-    }[m
[31m-[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream = u;[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    r->cache = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_init(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http init upstream, client timer: %d", c->read->timer_set);[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_upstream_init_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        if (!c->write->active) {[m
[31m-            if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_init_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_init_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *host;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_resolver_ctx_t             *ctx, temp;[m
[31m-    ngx_http_cleanup_t             *cln;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (r->aio) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->cache) {[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache(r, u);[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            r->write_event_handler = ngx_http_upstream_init_request;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = ngx_http_upstream_cache_send(r, u);[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {[m
[31m-                rc = NGX_DECLINED;[m
[31m-                r->cached = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            ngx_http_finalize_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->store = u->conf->store;[m
[31m-[m
[31m-    if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;[m
[31m-        r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body) {[m
[31m-        u->request_bufs = r->request_body->bufs;[m
[31m-    }[m
[31m-[m
[31m-    if (u->create_request(r) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.local = ngx_http_upstream_get_local(r, u->conf->local);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    u->output.alignment = clcf->directio_alignment;[m
[31m-    u->output.pool = r->pool;[m
[31m-    u->output.bufs.num = 1;[m
[31m-    u->output.bufs.size = clcf->client_body_buffer_size;[m
[31m-[m
[31m-    if (u->output.output_filter == NULL) {[m
[31m-        u->output.output_filter = ngx_chain_writer;[m
[31m-        u->output.filter_ctx = &u->writer;[m
[31m-    }[m
[31m-[m
[31m-    u->writer.pool = r->pool;[m
[31m-[m
[31m-    if (r->upstream_states == NULL) {[m
[31m-[m
[31m-        r->upstream_states = ngx_array_create(r->pool, 1,[m
[31m-                                            sizeof(ngx_http_upstream_state_t));[m
[31m-        if (r->upstream_states == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        u->state = ngx_array_push(r->upstream_states);[m
[31m-        if (u->state == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_upstream_cleanup;[m
[31m-    cln->data = r;[m
[31m-    u->cleanup = &cln->handler;[m
[31m-[m
[31m-    if (u->resolved == NULL) {[m
[31m-[m
[31m-        uscf = u->conf->upstream;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl_name = u->resolved->host;[m
[31m-#endif[m
[31m-[m
[31m-        host = &u->resolved->host;[m
[31m-[m
[31m-        if (u->resolved->sockaddr) {[m
[31m-[m
[31m-            if (u->resolved->port == 0[m
[31m-                && u->resolved->sockaddr->sa_family != AF_UNIX)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "no port in upstream \"%V\"", host);[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_connect(r, u);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-        uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->host.len == host->len[m
[31m-                && ((uscf->port == 0 && u->resolved->no_port)[m
[31m-                     || uscf->port == u->resolved->port)[m
[31m-                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)[m
[31m-            {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (u->resolved->port == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no port in upstream \"%V\"", host);[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        temp.name = *host;[m
[31m-[m
[31m-        ctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-        if (ctx == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx == NGX_NO_RESOLVER) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no resolver defined to resolve %V", host);[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->name = *host;[m
[31m-        ctx->handler = ngx_http_upstream_resolve_handler;[m
[31m-        ctx->data = r;[m
[31m-        ctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-        u->resolved->ctx = ctx;[m
[31m-[m
[31m-        if (ngx_resolve_name(ctx) != NGX_OK) {[m
[31m-            u->resolved->ctx = NULL;[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (uscf == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "no upstream configuration");[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    u->ssl_name = uscf->host;[m
[31m-#endif[m
[31m-[m
[31m-    if (uscf->peer.init(r, uscf) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (u->conf->next_upstream_tries[m
[31m-        && u->peer.tries > u->conf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = u->conf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_http_cache_t       *c;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-[m
[31m-        if (!(r->method & u->conf->cache_methods)) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache_get(r, u, &cache);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_HEAD && u->conf->cache_convert_head) {[m
[31m-            u->method = ngx_http_core_get_method;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_file_cache_new(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (u->create_key(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* TODO: add keys */[m
[31m-[m
[31m-        ngx_http_file_cache_create_key(r);[m
[31m-[m
[31m-        if (r->cache->header_start + 256 >= u->conf->buffer_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%V_buffer_size %uz is not enough for cache key, "[m
[31m-                          "it should be increased to at least %uz",[m
[31m-                          &u->conf->module, u->conf->buffer_size,[m
[31m-                          ngx_align(r->cache->header_start + 256, 1024));[m
[31m-[m
[31m-            r->cache = NULL;[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        u->cacheable = 1;[m
[31m-[m
[31m-        c = r->cache;[m
[31m-[m
[31m-        c->body_start = u->conf->buffer_size;[m
[31m-        c->min_uses = u->conf->cache_min_uses;[m
[31m-        c->file_cache = cache;[m
[31m-[m
[31m-        switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) {[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        case NGX_DECLINED:[m
[31m-            u->cache_status = NGX_HTTP_CACHE_BYPASS;[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default: /* NGX_OK */[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        c->lock = u->conf->cache_lock;[m
[31m-        c->lock_timeout = u->conf->cache_lock_timeout;[m
[31m-        c->lock_age = u->conf->cache_lock_age;[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_MISS;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_file_cache_open(r);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream cache: %i", rc);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_UPDATING:[m
[31m-[m
[31m-        if (u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) {[m
[31m-            u->cache_status = rc;[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = NGX_HTTP_CACHE_STALE;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-        u->cache_status = NGX_HTTP_CACHE_HIT;[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_STALE:[m
[31m-[m
[31m-        c->valid_sec = 0;[m
[31m-        u->buffer.start = NULL;[m
[31m-        u->cache_status = NGX_HTTP_CACHE_EXPIRED;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-[m
[31m-        if ((size_t) (u->buffer.end - u->buffer.start) < u->conf->buffer_size) {[m
[31m-            u->buffer.start = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            u->buffer.pos = u->buffer.start + c->header_start;[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_SCARCE:[m
[31m-[m
[31m-        u->cacheable = 0;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_AGAIN:[m
[31m-[m
[31m-        return NGX_BUSY;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        /* cached NGX_HTTP_BAD_GATEWAY, NGX_HTTP_GATEWAY_TIME_OUT, etc. */[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_HIT;[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->cached = 0;[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_get(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_http_file_cache_t **cache)[m
[31m-{[m
[31m-    ngx_str_t               *name, val;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_file_cache_t  **caches;[m
[31m-[m
[31m-    if (u->conf->cache_zone) {[m
[31m-        *cache = u->conf->cache_zone->data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, u->conf->cache_value, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len == 0[m
[31m-        || (val.len == 3 && ngx_strncmp(val.data, "off", 3) == 0))[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    caches = u->caches->elts;[m
[31m-[m
[31m-    for (i = 0; i < u->caches->nelts; i++) {[m
[31m-        name = &caches[i]->shm_zone->shm.name;[m
[31m-[m
[31m-        if (name->len == val.len[m
[31m-            && ngx_strncmp(name->data, val.data, val.len) == 0)[m
[31m-        {[m
[31m-            *cache = caches[i];[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "cache \"%V\" not found", &val);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    r->cached = 1;[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->header_start == c->body_start) {[m
[31m-        r->http_version = NGX_HTTP_VERSION_9;[m
[31m-        return ngx_http_cache_send(r);[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: cache stack */[m
[31m-[m
[31m-    u->buffer = *c->buf;[m
[31m-    u->buffer.pos += c->header_start;[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = u->process_header(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_cache_send(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_HTTP_UPSTREAM_INVALID_HEADER */[m
[31m-[m
[31m-    /* TODO: delete file */[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *r;[m
[31m-    ngx_http_upstream_t           *u;[m
[31m-    ngx_http_upstream_resolved_t  *ur;[m
[31m-[m
[31m-    r = ctx->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream resolve: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "%V could not be resolved (%i: %s)",[m
[31m-                      &ctx->name, ctx->state,[m
[31m-                      ngx_resolver_strerror(ctx->state));[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ur->naddrs = ctx->naddrs;[m
[31m-    ur->addrs = ctx->addrs;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    u_char      text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t   addr;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-    ur->ctx = NULL;[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (u->conf->next_upstream_tries[m
[31m-        && u->peer.tries > u->conf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = u->conf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        u->write_event_handler(r, u);[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_check_broken_connection(r, r->connection->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_check_broken_connection(r, r->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    char                 buf[1];[m
[31m-    ngx_err_t            err;[m
[31m-    ngx_int_t            event;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "http upstream check client, write event:%d, \"%V\"",[m
[31m-                   ev->write, &r->uri);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-            event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-            if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!ev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        if (ev->kq_errno) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                          "kevent() reported that client prematurely closed "[m
[31m-                          "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                      "kevent() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ev->pending_eof) {[m
[31m-        socklen_t  len;[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        err = 0;[m
[31m-        len = sizeof(ngx_err_t);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                        "epoll_wait() reported that client prematurely closed "[m
[31m-                        "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "epoll_wait() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,[m
[31m-                   "http upstream recv(): %d", n);[m
[31m-[m
[31m-    if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-        event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-        if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->error = 1;[m
[31m-[m
[31m-    } else { /* n == 0 */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev->eof = 1;[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (!u->cacheable && u->peer.connection) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "client prematurely closed connection, "[m
[31m-                      "so upstream connection is closed too");[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    if (u->peer.connection == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r->connection->log->action = "connecting to upstream";[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-    u->state = ngx_array_push(r->upstream_states);[m
[31m-    if (u->state == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-[m
[31m-    u->state->response_time = ngx_current_msec;[m
[31m-    u->state->connect_time = (ngx_msec_t) -1;[m
[31m-    u->state->header_time = (ngx_msec_t) -1;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&u->peer);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->peer = u->peer.name;[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    c->data = r;[m
[31m-[m
[31m-    c->write->handler = ngx_http_upstream_handler;[m
[31m-    c->read->handler = ngx_http_upstream_handler;[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_upstream_send_request_handler;[m
[31m-    u->read_event_handler = ngx_http_upstream_process_header;[m
[31m-[m
[31m-    c->sendfile &= r->connection->sendfile;[m
[31m-    u->output.sendfile = c->sendfile;[m
[31m-[m
[31m-    if (c->pool == NULL) {[m
[31m-[m
[31m-        /* we need separate pool here to be able to cache SSL connections */[m
[31m-[m
[31m-        c->pool = ngx_create_pool(128, r->connection->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log = r->connection->log;[m
[31m-    c->pool->log = c->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */[m
[31m-[m
[31m-    u->writer.out = NULL;[m
[31m-    u->writer.last = &u->writer.out;[m
[31m-    u->writer.connection = c;[m
[31m-    u->writer.limit = 0;[m
[31m-[m
[31m-    if (u->request_sent) {[m
[31m-        if (ngx_http_upstream_reinit(r, u) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body[m
[31m-        && r->request_body->buf[m
[31m-        && r->request_body->temp_file[m
[31m-        && r == r->main)[m
[31m-    {[m
[31m-        /*[m
[31m-         * the r->request_body->buf can be reused for one request only,[m
[31m-         * the subrequests should allocate their own temporary bufs[m
[31m-         */[m
[31m-[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = r->request_body->buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-        u->output.allocated = 1;[m
[31m-[m
[31m-        r->request_body->buf->pos = r->request_body->buf->start;[m
[31m-        r->request_body->buf->last = r->request_body->buf->start;[m
[31m-        r->request_body->buf->tag = u->output.tag;[m
[31m-    }[m
[31m-[m
[31m-    u->request_sent = 0;[m
[31m-    u->request_body_sent = 0;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(u->conf->ssl, c,[m
[31m-                                  NGX_SSL_BUFFER|NGX_SSL_CLIENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->sendfile = 0;[m
[31m-    u->output.sendfile = 0;[m
[31m-[m
[31m-    if (u->conf->ssl_server_name || u->conf->ssl_verify) {[m
[31m-        if (ngx_http_upstream_ssl_name(r, u, c) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->ssl_session_reuse) {[m
[31m-        if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* abbreviated SSL handshake may interact badly with Nagle */[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "SSL handshaking to upstream";[m
[31m-[m
[31m-    rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!c->write->timer_set) {[m
[31m-            ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->handler = ngx_http_upstream_ssl_handshake;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_ssl_handshake(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_ssl_handshake(ngx_connection_t *c)[m
[31m-{[m
[31m-    long                  rc;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    r = c->data;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        if (u->conf->ssl_verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_ssl_check_host(c, &u->ssl_name) != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream SSL certificate does not match \"%V\"",[m
[31m-                              &u->ssl_name);[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (u->conf->ssl_session_reuse) {[m
[31m-            u->peer.save_session(&u->peer, u->peer.data);[m
[31m-        }[m
[31m-[m
[31m-        c->write->handler = ngx_http_upstream_handler;[m
[31m-        c->read->handler = ngx_http_upstream_handler;[m
[31m-[m
[31m-        c = r->connection;[m
[31m-[m
[31m-        ngx_http_upstream_send_request(r, u, 1);[m
[31m-[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_ssl_name(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_connection_t *c)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t   name;[m
[31m-[m
[31m-    if (u->conf->ssl_name) {[m
[31m-        if (ngx_http_complex_value(r, u->conf->ssl_name, &name) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        name = u->ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * ssl name here may contain port, notably if derived from $proxy_host[m
[31m-     * or $http_host; we have to strip it[m
[31m-     */[m
[31m-[m
[31m-    p = name.data;[m
[31m-    last = name.data + name.len;[m
[31m-[m
[31m-    if (*p == '[') {[m
[31m-        p = ngx_strlchr(p, last, ']');[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            p = name.data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlchr(p, last, ':');[m
[31m-[m
[31m-    if (p != NULL) {[m
[31m-        name.len = p - name.data;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->conf->ssl_server_name) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */[m
[31m-[m
[31m-    if (name.len == 0 || *name.data == '[') {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_set_tlsext_host_name() needs a null-terminated string,[m
[31m-     * hence we explicitly null-terminate name here[m
[31m-     */[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, name.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(p, name.data, name.len + 1);[m
[31m-[m
[31m-    name.data = p;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream SSL server name: \"%s\"", name.data);[m
[31m-[m
[31m-    if (SSL_set_tlsext_host_name(c->ssl->connection, name.data) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "SSL_set_tlsext_host_name(\"%s\") failed", name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    u->ssl_name = name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    off_t         file_pos;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (u->reinit_request(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->keepalive = 0;[m
[31m-    u->upgrade = 0;[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the request chain */[m
[31m-[m
[31m-    file_pos = 0;[m
[31m-[m
[31m-    for (cl = u->request_bufs; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->start;[m
[31m-[m
[31m-        /* there is at most one file */[m
[31m-[m
[31m-        if (cl->buf->in_file) {[m
[31m-            cl->buf->file_pos = file_pos;[m
[31m-            file_pos = cl->buf->file_last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the subrequest's ngx_output_chain() context */[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file[m
[31m-        && r != r->main && u->output.buf)[m
[31m-    {[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = u->output.buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-[m
[31m-        u->output.buf->pos = u->output.buf->start;[m
[31m-        u->output.buf->last = u->output.buf->start;[m
[31m-    }[m
[31m-[m
[31m-    u->output.buf = NULL;[m
[31m-    u->output.in = NULL;[m
[31m-    u->output.busy = NULL;[m
[31m-[m
[31m-    /* reinit u->buffer */[m
[31m-[m
[31m-    u->buffer.pos = u->buffer.start;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-        u->buffer.pos += r->cache->header_start;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream send request");[m
[31m-[m
[31m-    if (u->state->connect_time == (ngx_msec_t) -1) {[m
[31m-        u->state->connect_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "sending request to upstream";[m
[31m-[m
[31m-    rc = ngx_http_upstream_send_request_body(r, u, do_write);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        if (!c->write->ready) {[m
[31m-            ngx_add_timer(c->write, u->conf->send_timeout);[m
[31m-[m
[31m-        } else if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    u->request_body_sent = 1;[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,[m
[31m-                          ngx_tcp_push_n " failed");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-    }[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_upstream_dummy_handler;[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(c->read, u->conf->read_timeout);[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        ngx_http_upstream_process_header(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_send_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t               *out, *cl, *ln;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream send request body");[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-[m
[31m-        /* buffered request body */[m
[31m-[m
[31m-        if (!u->request_sent) {[m
[31m-            u->request_sent = 1;[m
[31m-            out = u->request_bufs;[m
[31m-[m
[31m-        } else {[m
[31m-            out = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_output_chain(&u->output, out);[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent) {[m
[31m-        u->request_sent = 1;[m
[31m-        out = u->request_bufs;[m
[31m-[m
[31m-        if (r->request_body->bufs) {[m
[31m-            for (cl = out; cl->next; cl = out->next) { /* void */ }[m
[31m-            cl->next = r->request_body->bufs;[m
[31m-            r->request_body->bufs = NULL;[m
[31m-        }[m
[31m-[m
[31m-        c = u->peer.connection;[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_upstream_read_request_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        out = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-            rc = ngx_output_chain(&u->output, out);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            while (out) {[m
[31m-                ln = out;[m
[31m-                out = out->next;[m
[31m-                ngx_free_chain(r->pool, ln);[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_OK && !r->reading_body) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (r->reading_body) {[m
[31m-            /* read client request body */[m
[31m-[m
[31m-            rc = ngx_http_read_unbuffered_request_body(r);[m
[31m-[m
[31m-            if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            out = r->request_body->bufs;[m
[31m-            r->request_body->bufs = NULL;[m
[31m-        }[m
[31m-[m
[31m-        /* stop if there is nothing to send */[m
[31m-[m
[31m-        if (out == NULL) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        do_write = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->reading_body) {[m
[31m-        if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-            r->read_event_handler =[m
[31m-                                  ngx_http_upstream_rd_check_broken_connection;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_request_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream send request handler");[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (u->header_sent) {[m
[31m-        u->write_event_handler = ngx_http_upstream_dummy_handler;[m
[31m-[m
[31m-        (void) ngx_handle_write_event(c->write, 0);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_read_request_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream read request handler");[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ssize_t            n;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process header");[m
[31m-[m
[31m-    c->log->action = "reading response header from upstream";[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->buffer.start == NULL) {[m
[31m-        u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size);[m
[31m-        if (u->buffer.start == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->buffer.pos = u->buffer.start;[m
[31m-        u->buffer.last = u->buffer.start;[m
[31m-        u->buffer.end = u->buffer.start + u->conf->buffer_size;[m
[31m-        u->buffer.temporary = 1;[m
[31m-[m
[31m-        u->buffer.tag = u->output.tag;[m
[31m-[m
[31m-        if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                          sizeof(ngx_table_elt_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (r->cache) {[m
[31m-            u->buffer.pos += r->cache->header_start;[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-#if 0[m
[31m-            ngx_add_timer(rev, u->read_timeout);[m
[31m-#endif[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "upstream prematurely closed connection");[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->buffer.last += n;[m
[31m-[m
[31m-#if 0[m
[31m-        u->valid_header_in = 0;[m
[31m-[m
[31m-        u->peer.cached = 0;[m
[31m-#endif[m
[31m-[m
[31m-        rc = u->process_header(r);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            if (u->buffer.last == u->buffer.end) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream sent too big header");[m
[31m-[m
[31m-                ngx_http_upstream_next(r, u,[m
[31m-                                       NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    u->state->header_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-    if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-[m
[31m-        if (ngx_http_upstream_test_next(r, u) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_upstream_intercept_errors(r, u) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->subrequest_in_memory) {[m
[31m-        ngx_http_upstream_send_response(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* subrequest content in memory */[m
[31m-[m
[31m-    if (u->input_filter == NULL) {[m
[31m-        u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;[m
[31m-        u->input_filter = ngx_http_upstream_non_buffered_filter;[m
[31m-        u->input_filter_ctx = r;[m
[31m-    }[m
[31m-[m
[31m-    if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    n = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-    if (n) {[m
[31m-        u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-        u->state->response_length += n;[m
[31m-[m
[31m-        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_process_body_in_memory;[m
[31m-[m
[31m-    ngx_http_upstream_process_body_in_memory(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_uint_t                 status;[m
[31m-    ngx_http_upstream_next_t  *un;[m
[31m-[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    for (un = ngx_http_upstream_next_errors; un->status; un++) {[m
[31m-[m
[31m-        if (status != un->status) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.tries > 1 && (u->conf->next_upstream & un->mask)) {[m
[31m-            ngx_http_upstream_next(r, u, un->mask);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-            && (u->conf->cache_use_stale & un->mask))[m
[31m-        {[m
[31m-            ngx_int_t  rc;[m
[31m-[m
[31m-            rc = u->reinit_request(r);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                u->cache_status = NGX_HTTP_CACHE_STALE;[m
[31m-                rc = ngx_http_upstream_cache_send(r, u);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (status == NGX_HTTP_NOT_MODIFIED[m
[31m-        && u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-        && u->conf->cache_revalidate)[m
[31m-    {[m
[31m-        time_t     now, valid;[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream not modified");[m
[31m-[m
[31m-        now = ngx_time();[m
[31m-        valid = r->cache->valid_sec;[m
[31m-[m
[31m-        rc = u->reinit_request(r);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_REVALIDATED;[m
[31m-        rc = ngx_http_upstream_cache_send(r, u);[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = r->cache->valid_sec;[m
[31m-        }[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = ngx_http_file_cache_valid(u->conf->cache_valid,[m
[31m-                                              u->headers_in.status_n);[m
[31m-            if (valid) {[m
[31m-                valid = now + valid;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (valid) {[m
[31m-            r->cache->valid_sec = valid;[m
[31m-            r->cache->date = now;[m
[31m-[m
[31m-            ngx_http_file_cache_update_header(r);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_intercept_errors(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                  status;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_table_elt_t           *h;[m
[31m-    ngx_http_err_page_t       *err_page;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->conf->intercept_errors) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    err_page = clcf->error_pages->elts;[m
[31m-    for (i = 0; i < clcf->error_pages->nelts; i++) {[m
[31m-[m
[31m-        if (err_page[i].status == status) {[m
[31m-[m
[31m-            if (status == NGX_HTTP_UNAUTHORIZED[m
[31m-                && u->headers_in.www_authenticate)[m
[31m-            {[m
[31m-                h = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-                if (h == NULL) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                *h = *u->headers_in.www_authenticate;[m
[31m-[m
[31m-                r->headers_out.www_authenticate = h;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-            if (r->cache) {[m
[31m-                time_t  valid;[m
[31m-[m
[31m-                valid = ngx_http_file_cache_valid(u->conf->cache_valid, status);[m
[31m-[m
[31m-                if (valid) {[m
[31m-                    r->cache->valid_sec = ngx_time() + valid;[m
[31m-                    r->cache->error = status;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_upstream_finalize_request(r, u, status);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        if (c->write->pending_eof || c->read->pending_eof) {[m
[31m-            if (c->write->pending_eof) {[m
[31m-                err = c->write->kq_errno;[m
[31m-[m
[31m-            } else {[m
[31m-                err = c->read->kq_errno;[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err,[m
[31m-                                    "kevent() reported that connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_str_t                       uri, args;[m
[31m-    ngx_uint_t                      i, flags;[m
[31m-    ngx_list_part_t                *part;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (u->headers_in.x_accel_redirect[m
[31m-        && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT))[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);[m
[31m-[m
[31m-        part = &u->headers_in.headers.part;[m
[31m-        h = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                h = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,[m
[31m-                               h[i].lowcase_key, h[i].key.len);[m
[31m-[m
[31m-            if (hh && hh->redirect) {[m
[31m-                if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {[m
[31m-                    ngx_http_finalize_request(r,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        uri = u->headers_in.x_accel_redirect->value;[m
[31m-[m
[31m-        if (uri.data[0] == '@') {[m
[31m-            ngx_http_named_location(r, &uri);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_null(&args);[m
[31m-            flags = NGX_HTTP_LOG_UNSAFE;[m
[31m-[m
[31m-            if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags) != NGX_OK) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            if (r->method != NGX_HTTP_HEAD) {[m
[31m-                r->method = NGX_HTTP_GET;[m
[31m-                r->method_name = ngx_http_core_get_method;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_internal_redirect(r, &uri, &args);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    part = &u->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash,[m
[31m-                          h[i].lowcase_key, h[i].key.len))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,[m
[31m-                           h[i].lowcase_key, h[i].key.len);[m
[31m-[m
[31m-        if (hh) {[m
[31m-            if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.server && r->headers_out.server->value.data == NULL) {[m
[31m-        r->headers_out.server->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date && r->headers_out.date->value.data == NULL) {[m
[31m-        r->headers_out.date->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = u->headers_in.status_n;[m
[31m-    r->headers_out.status_line = u->headers_in.status_line;[m
[31m-[m
[31m-    r->headers_out.content_length_n = u->headers_in.content_length_n;[m
[31m-[m
[31m-    r->disable_not_modified = !u->cacheable;[m
[31m-[m
[31m-    if (u->conf->force_ranges) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        r->single_range = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        if (r->cached) {[m
[31m-            r->single_range = 0;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    u->length = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ssize_t            n;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process body on memory");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "upstream buffer is too small to read response");[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        n = c->recv(c, b->last, size);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0 || n == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, n);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->state->response_length += n;[m
[31m-[m
[31m-        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!rev->ready) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        ngx_add_timer(rev, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_event_pipe_t          *p;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->header_sent = 1;[m
[31m-[m
[31m-    if (u->upgrade) {[m
[31m-        ngx_http_upstream_upgrade(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-[m
[31m-        if (!u->buffering) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && !u->store) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->pipe->downstream_error = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file) {[m
[31m-        ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd);[m
[31m-        r->request_body->temp_file->file.fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!u->buffering) {[m
[31m-[m
[31m-        if (u->input_filter == NULL) {[m
[31m-            u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;[m
[31m-            u->input_filter = ngx_http_upstream_non_buffered_filter;[m
[31m-            u->input_filter_ctx = r;[m
[31m-        }[m
[31m-[m
[31m-        u->read_event_handler = ngx_http_upstream_process_non_buffered_upstream;[m
[31m-        r->write_event_handler =[m
[31m-                             ngx_http_upstream_process_non_buffered_downstream;[m
[31m-[m
[31m-        r->limit_rate = 0;[m
[31m-[m
[31m-        if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                               (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        n = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-        if (n) {[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-            u->state->response_length += n;[m
[31m-[m
[31m-            if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_process_non_buffered_downstream(r);[m
[31m-[m
[31m-        } else {[m
[31m-            u->buffer.pos = u->buffer.start;[m
[31m-            u->buffer.last = u->buffer.start;[m
[31m-[m
[31m-            if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (u->peer.connection->read->ready || u->length == 0) {[m
[31m-                ngx_http_upstream_process_non_buffered_upstream(r, u);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: preallocate event_pipe bufs, look "Content-Length" */[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache && r->cache->file.fd != NGX_INVALID_FILE) {[m
[31m-        ngx_pool_run_cleanup_file(r->pool, r->cache->file.fd);[m
[31m-        r->cache->file.fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    switch (ngx_http_test_predicates(r, u->conf->no_cache)) {[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        u->cacheable = 0;[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_OK */[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_BYPASS) {[m
[31m-[m
[31m-            /* create cache if previously bypassed */[m
[31m-[m
[31m-            if (ngx_http_file_cache_create(r) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-        time_t  now, valid;[m
[31m-[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        valid = r->cache->valid_sec;[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = ngx_http_file_cache_valid(u->conf->cache_valid,[m
[31m-                                              u->headers_in.status_n);[m
[31m-            if (valid) {[m
[31m-                r->cache->valid_sec = now + valid;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (valid) {[m
[31m-            r->cache->date = now;[m
[31m-            r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start);[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_OK[m
[31m-                || u->headers_in.status_n == NGX_HTTP_PARTIAL_CONTENT)[m
[31m-            {[m
[31m-                r->cache->last_modified = u->headers_in.last_modified_time;[m
[31m-[m
[31m-                if (u->headers_in.etag) {[m
[31m-                    r->cache->etag = u->headers_in.etag->value;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_str_null(&r->cache->etag);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                r->cache->last_modified = -1;[m
[31m-                ngx_str_null(&r->cache->etag);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_file_cache_set_header(r, u->buffer.start) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            u->cacheable = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http cacheable: %d", u->cacheable);[m
[31m-[m
[31m-    if (u->cacheable == 0 && r->cache) {[m
[31m-        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only && !u->cacheable && !u->store) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    p = u->pipe;[m
[31m-[m
[31m-    p->output_filter = ngx_http_upstream_output_filter;[m
[31m-    p->output_ctx = r;[m
[31m-    p->tag = u->output.tag;[m
[31m-    p->bufs = u->conf->bufs;[m
[31m-    p->busy_size = u->conf->busy_buffers_size;[m
[31m-    p->upstream = u->peer.connection;[m
[31m-    p->downstream = c;[m
[31m-    p->pool = r->pool;[m
[31m-    p->log = c->log;[m
[31m-    p->limit_rate = u->conf->limit_rate;[m
[31m-    p->start_sec = ngx_time();[m
[31m-[m
[31m-    p->cacheable = u->cacheable || u->store;[m
[31m-[m
[31m-    p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-    if (p->temp_file == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p->temp_file->file.fd = NGX_INVALID_FILE;[m
[31m-    p->temp_file->file.log = c->log;[m
[31m-    p->temp_file->path = u->conf->temp_path;[m
[31m-    p->temp_file->pool = r->pool;[m
[31m-[m
[31m-    if (p->cacheable) {[m
[31m-        p->temp_file->persistent = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        if (r->cache && r->cache->file_cache->temp_path) {[m
[31m-            p->temp_file->path = r->cache->file_cache->temp_path;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        p->temp_file->log_level = NGX_LOG_WARN;[m
[31m-        p->temp_file->warn = "an upstream response is buffered "[m
[31m-                             "to a temporary file";[m
[31m-    }[m
[31m-[m
[31m-    p->max_temp_file_size = u->conf->max_temp_file_size;[m
[31m-    p->temp_file_write_size = u->conf->temp_file_write_size;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (clcf->aio == NGX_HTTP_AIO_THREADS && clcf->aio_write) {[m
[31m-        p->thread_handler = ngx_http_upstream_thread_handler;[m
[31m-        p->thread_ctx = r;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    p->preread_bufs = ngx_alloc_chain_link(r->pool);[m
[31m-    if (p->preread_bufs == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p->preread_bufs->buf = &u->buffer;[m
[31m-    p->preread_bufs->next = NULL;[m
[31m-    u->buffer.recycled = 1;[m
[31m-[m
[31m-    p->preread_size = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-[m
[31m-        p->buf_to_file = ngx_calloc_buf(r->pool);[m
[31m-        if (p->buf_to_file == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p->buf_to_file->start = u->buffer.start;[m
[31m-        p->buf_to_file->pos = u->buffer.start;[m
[31m-        p->buf_to_file->last = u->buffer.pos;[m
[31m-        p->buf_to_file->temporary = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-        /* the posted aio operation may corrupt a shadow buffer */[m
[31m-        p->single_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */[m
[31m-    p->free_bufs = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * event_pipe would do u->buffer.last += p->preread_size[m
[31m-     * as though these bytes were read[m
[31m-     */[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    if (u->conf->cyclic_temp_file) {[m
[31m-[m
[31m-        /*[m
[31m-         * we need to disable the use of sendfile() if we use cyclic temp file[m
[31m-         * because the writing a new data may interfere with sendfile()[m
[31m-         * that uses the same kernel file pages (at least on FreeBSD)[m
[31m-         */[m
[31m-[m
[31m-        p->cyclic_temp_file = 1;[m
[31m-        c->sendfile = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        p->cyclic_temp_file = 0;[m
[31m-    }[m
[31m-[m
[31m-    p->read_timeout = u->conf->read_timeout;[m
[31m-    p->send_timeout = clcf->send_timeout;[m
[31m-    p->send_lowat = clcf->send_lowat;[m
[31m-[m
[31m-    p->length = -1;[m
[31m-[m
[31m-    if (u->input_filter_init[m
[31m-        && u->input_filter_init(p->input_ctx) != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_process_upstream;[m
[31m-    r->write_event_handler = ngx_http_upstream_process_downstream;[m
[31m-[m
[31m-    ngx_http_upstream_process_upstream(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgrade(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    /* TODO: prevent upgrade if not requested or not possible */[m
[31m-[m
[31m-    r->keepalive = 0;[m
[31m-    c->log->action = "proxying upgraded connection";[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_upgraded_read_upstream;[m
[31m-    u->write_event_handler = ngx_http_upstream_upgraded_write_upstream;[m
[31m-    r->read_event_handler = ngx_http_upstream_upgraded_read_downstream;[m
[31m-    r->write_event_handler = ngx_http_upstream_upgraded_write_downstream;[m
[31m-[m
[31m-    if (clcf->tcp_nodelay) {[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.connection->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, u->peer.connection->log, 0,[m
[31m-                           "tcp_nodelay");[m
[31m-[m
[31m-            if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(u->peer.connection, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection->read->ready[m
[31m-        || u->buffer.pos != u->buffer.last)[m
[31m-    {[m
[31m-        ngx_post_event(c->read, &ngx_posted_events);[m
[31m-        ngx_http_upstream_process_upgraded(r, 1, 1);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 1, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 1, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_upgraded(ngx_http_request_t *r,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c, *downstream, *upstream, *dst, *src;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process upgraded, fu:%ui", from_upstream);[m
[31m-[m
[31m-    downstream = c;[m
[31m-    upstream = u->peer.connection;[m
[31m-[m
[31m-    if (downstream->write->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->timedout || upstream->write->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (from_upstream) {[m
[31m-        src = upstream;[m
[31m-        dst = downstream;[m
[31m-        b = &u->buffer;[m
[31m-[m
[31m-    } else {[m
[31m-        src = downstream;[m
[31m-        dst = upstream;[m
[31m-        b = &u->from_client;[m
[31m-[m
[31m-        if (r->header_in->last > r->header_in->pos) {[m
[31m-            b = r->header_in;[m
[31m-            b->end = b->last;[m
[31m-            do_write = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (b->start == NULL) {[m
[31m-            b->start = ngx_palloc(r->pool, u->conf->buffer_size);[m
[31m-            if (b->start == NULL) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start;[m
[31m-            b->last = b->start;[m
[31m-            b->end = b->start + u->conf->buffer_size;[m
[31m-            b->temporary = 1;[m
[31m-            b->tag = u->output.tag;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            size = b->last - b->pos;[m
[31m-[m
[31m-            if (size && dst->write->ready) {[m
[31m-[m
[31m-                n = dst->send(dst, b->pos, size);[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (n > 0) {[m
[31m-                    b->pos += n;[m
[31m-[m
[31m-                    if (b->pos == b->last) {[m
[31m-                        b->pos = b->start;[m
[31m-                        b->last = b->start;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && src->read->ready) {[m
[31m-[m
[31m-            n = src->recv(src, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                do_write = 1;[m
[31m-                b->last += n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                src->read->eof = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if ((upstream->read->eof && u->buffer.pos == u->buffer.last)[m
[31m-        || (downstream->read->eof && u->from_client.pos == u->from_client.last)[m
[31m-        || (downstream->read->eof && upstream->read->eof))[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http upstream upgraded done");[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (ngx_handle_write_event(upstream->write, u->conf->send_lowat)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->write->active && !upstream->write->ready) {[m
[31m-        ngx_add_timer(upstream->write, u->conf->send_timeout);[m
[31m-[m
[31m-    } else if (upstream->write->timer_set) {[m
[31m-        ngx_del_timer(upstream->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->active && !upstream->read->ready) {[m
[31m-        ngx_add_timer(upstream->read, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (upstream->read->timer_set) {[m
[31m-        ngx_del_timer(upstream->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(downstream->write, clcf->send_lowat)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (downstream->write->active && !downstream->write->ready) {[m
[31m-        ngx_add_timer(downstream->write, clcf->send_timeout);[m
[31m-[m
[31m-    } else if (downstream->write->timer_set) {[m
[31m-        ngx_del_timer(downstream->write);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t          *wev;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process non buffered downstream");[m
[31m-[m
[31m-    c->log->action = "sending to client";[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_non_buffered_request(r, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process non buffered upstream");[m
[31m-[m
[31m-    c->log->action = "reading upstream";[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_non_buffered_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_connection_t          *downstream, *upstream;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    downstream = r->connection;[m
[31m-    upstream = u->peer.connection;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    do_write = do_write || u->length == 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            if (u->out_bufs || u->busy_bufs) {[m
[31m-                rc = ngx_http_output_filter(r, u->out_bufs);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs,[m
[31m-                                        &u->out_bufs, u->output.tag);[m
[31m-            }[m
[31m-[m
[31m-            if (u->busy_bufs == NULL) {[m
[31m-[m
[31m-                if (u->length == 0[m
[31m-                    || (upstream->read->eof && u->length == -1))[m
[31m-                {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (upstream->read->eof) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, upstream->log, 0,[m
[31m-                                  "upstream prematurely closed connection");[m
[31m-[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                                       NGX_HTTP_BAD_GATEWAY);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (upstream->read->error) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                                       NGX_HTTP_BAD_GATEWAY);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                b->pos = b->start;[m
[31m-                b->last = b->start;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && upstream->read->ready) {[m
[31m-[m
[31m-            n = upstream->recv(upstream, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                u->state->response_length += n;[m
[31m-[m
[31m-                if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            do_write = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (downstream->data == r) {[m
[31m-        if (ngx_handle_write_event(downstream->write, clcf->send_lowat)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (downstream->write->active && !downstream->write->ready) {[m
[31m-        ngx_add_timer(downstream->write, clcf->send_timeout);[m
[31m-[m
[31m-    } else if (downstream->write->timer_set) {[m
[31m-        ngx_del_timer(downstream->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->active && !upstream->read->ready) {[m
[31m-        ngx_add_timer(upstream->read, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (upstream->read->timer_set) {[m
[31m-        ngx_del_timer(upstream->read);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_non_buffered_filter_init(void *data)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    cl->buf->pos = b->last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    if (u->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u->length -= bytes;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_event_pipe_t          *p;[m
[31m-    ngx_thread_pool_t         *tp;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r = file->thread_ctx;[m
[31m-    p = r->upstream->pipe;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    tp = clcf->thread_pool;[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "thread pool \"%V\" not found", &name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    task->event.data = r;[m
[31m-    task->event.handler = ngx_http_upstream_thread_event_handler;[m
[31m-[m
[31m-    if (ngx_thread_task_post(tp, task) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-    p->aio = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_thread_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream thread: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_output_filter(void *data, ngx_chain_t *chain)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_event_pipe_t    *p;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = data;[m
[31m-    p = r->upstream->pipe;[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, chain);[m
[31m-[m
[31m-    p->aio = r->aio;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t          *wev;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_event_pipe_t     *p;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-    p = u->pipe;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process downstream");[m
[31m-[m
[31m-    c->log->action = "sending to client";[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    p->aio = r->aio;[m
[31m-#endif[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-[m
[31m-        if (wev->delayed) {[m
[31m-[m
[31m-            wev->timedout = 0;[m
[31m-            wev->delayed = 0;[m
[31m-[m
[31m-            if (!wev->ready) {[m
[31m-                ngx_add_timer(wev, p->send_timeout);[m
[31m-[m
[31m-                if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_event_pipe(p, wev->write) == NGX_ABORT) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p->downstream_error = 1;[m
[31m-            c->timedout = 1;[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (wev->delayed) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http downstream delayed");[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_pipe(p, 1) == NGX_ABORT) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_request(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_event_pipe_t  *p;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    p = u->pipe;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process upstream");[m
[31m-[m
[31m-    c->log->action = "reading upstream";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-[m
[31m-        if (rev->delayed) {[m
[31m-[m
[31m-            rev->timedout = 0;[m
[31m-            rev->delayed = 0;[m
[31m-[m
[31m-            if (!rev->ready) {[m
[31m-                ngx_add_timer(rev, p->read_timeout);[m
[31m-[m
[31m-                if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_event_pipe(p, 0) == NGX_ABORT) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p->upstream_error = 1;[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (rev->delayed) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http upstream delayed");[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_pipe(p, 0) == NGX_ABORT) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_request(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_temp_file_t   *tf;[m
[31m-    ngx_event_pipe_t  *p;[m
[31m-[m
[31m-    p = u->pipe;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (p->writing) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-        if (u->store) {[m
[31m-[m
[31m-            if (p->upstream_eof || p->upstream_done) {[m
[31m-[m
[31m-                tf = p->temp_file;[m
[31m-[m
[31m-                if (u->headers_in.status_n == NGX_HTTP_OK[m
[31m-                    && (p->upstream_done || p->length == -1)[m
[31m-                    && (u->headers_in.content_length_n == -1[m
[31m-                        || u->headers_in.content_length_n == tf->offset))[m
[31m-                {[m
[31m-                    ngx_http_upstream_store(r, u);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cacheable) {[m
[31m-[m
[31m-            if (p->upstream_done) {[m
[31m-                ngx_http_file_cache_update(r, p->temp_file);[m
[31m-[m
[31m-            } else if (p->upstream_eof) {[m
[31m-[m
[31m-                tf = p->temp_file;[m
[31m-[m
[31m-                if (p->length == -1[m
[31m-                    && (u->headers_in.content_length_n == -1[m
[31m-                        || u->headers_in.content_length_n[m
[31m-                           == tf->offset - (off_t) r->cache->body_start))[m
[31m-                {[m
[31m-                    ngx_http_file_cache_update(r, tf);[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_http_file_cache_free(r->cache, tf);[m
[31m-                }[m
[31m-[m
[31m-            } else if (p->upstream_error) {[m
[31m-                ngx_http_file_cache_free(r->cache, p->temp_file);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (p->upstream_done || p->upstream_eof || p->upstream_error) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http upstream exit: %p", p->out);[m
[31m-[m
[31m-            if (p->upstream_done[m
[31m-                || (p->upstream_eof && p->length == -1))[m
[31m-            {[m
[31m-                ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (p->upstream_eof) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream prematurely closed connection");[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->downstream_error) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream downstream error");[m
[31m-[m
[31m-        if (!u->cacheable && !u->store && u->peer.connection) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    size_t                  root;[m
[31m-    time_t                  lm;[m
[31m-    ngx_str_t               path;[m
[31m-    ngx_temp_file_t        *tf;[m
[31m-    ngx_ext_rename_file_t   ext;[m
[31m-[m
[31m-    tf = u->pipe->temp_file;[m
[31m-[m
[31m-    if (tf->file.fd == NGX_INVALID_FILE) {[m
[31m-[m
[31m-        /* create file for empty 200 response */[m
[31m-[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = u->conf->temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->persistent = 1;[m
[31m-[m
[31m-        if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                 tf->persistent, tf->clean, tf->access)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->pipe->temp_file = tf;[m
[31m-    }[m
[31m-[m
[31m-    ext.access = u->conf->store_access;[m
[31m-    ext.path_access = u->conf->store_access;[m
[31m-    ext.time = -1;[m
[31m-    ext.create_path = 1;[m
[31m-    ext.delete_file = 1;[m
[31m-    ext.log = r->connection->log;[m
[31m-[m
[31m-    if (u->headers_in.last_modified) {[m
[31m-[m
[31m-        lm = ngx_parse_http_time(u->headers_in.last_modified->value.data,[m
[31m-                                 u->headers_in.last_modified->value.len);[m
[31m-[m
[31m-        if (lm != NGX_ERROR) {[m
[31m-            ext.time = lm;[m
[31m-            ext.fd = tf->file.fd;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->store_lengths == NULL) {[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_script_run(r, &path, u->conf->store_lengths->elts, 0,[m
[31m-                                u->conf->store_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    path.len--;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream stores \"%s\" to \"%s\"",[m
[31m-                   tf->file.name.data, path.data);[m
[31m-[m
[31m-    (void) ngx_ext_rename_file(&tf->file.name, &path, &ext);[m
[31m-[m
[31m-    u->store = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dummy_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_msec_t  timeout;[m
[31m-    ngx_uint_t  status, state;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http next upstream, %xi", ft_type);[m
[31m-[m
[31m-    if (u->peer.sockaddr) {[m
[31m-[m
[31m-        if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_403[m
[31m-            || ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404)[m
[31m-        {[m
[31m-            state = NGX_PEER_NEXT;[m
[31m-[m
[31m-        } else {[m
[31m-            state = NGX_PEER_FAILED;[m
[31m-        }[m
[31m-[m
[31m-        u->peer.free(&u->peer, u->peer.data, state);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        /* TODO: inform balancer instead */[m
[31m-        u->peer.tries++;[m
[31m-    }[m
[31m-[m
[31m-    switch (ft_type) {[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_TIMEOUT:[m
[31m-        status = NGX_HTTP_GATEWAY_TIME_OUT;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_500:[m
[31m-        status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_403:[m
[31m-        status = NGX_HTTP_FORBIDDEN;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_404:[m
[31m-        status = NGX_HTTP_NOT_FOUND;[m
[31m-        break;[m
[31m-[m
[31m-    /*[m
[31m-     * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING[m
[31m-     * never reach here[m
[31m-     */[m
[31m-[m
[31m-    default:[m
[31m-        status = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->error) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->status = status;[m
[31m-[m
[31m-    timeout = u->conf->next_upstream_timeout;[m
[31m-[m
[31m-    if (u->request_sent[m
[31m-        && (r->method & (NGX_HTTP_POST|NGX_HTTP_LOCK|NGX_HTTP_PATCH)))[m
[31m-    {[m
[31m-        ft_type |= NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.tries == 0[m
[31m-        || ((u->conf->next_upstream & ft_type) != ft_type)[m
[31m-        || (u->request_sent && r->request_body_no_buffering)[m
[31m-        || (timeout && ngx_current_msec - u->peer.start_time >= timeout))[m
[31m-    {[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-            && (u->conf->cache_use_stale & ft_type))[m
[31m-        {[m
[31m-            ngx_int_t  rc;[m
[31m-[m
[31m-            rc = u->reinit_request(r);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                u->cache_status = NGX_HTTP_CACHE_STALE;[m
[31m-                rc = ngx_http_upstream_cache_send(r, u);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, status);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-            u->peer.connection->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-        u->peer.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t *r = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup http upstream request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_http_upstream_finalize_request(r, r->upstream, NGX_DONE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_uint_t  flush;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http upstream request: %i", rc);[m
[31m-[m
[31m-    if (u->cleanup == NULL) {[m
[31m-        /* the request was already finalized */[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *u->cleanup = NULL;[m
[31m-    u->cleanup = NULL;[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-        if (u->pipe && u->pipe->read_length) {[m
[31m-            u->state->response_length = u->pipe->read_length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->finalize_request(r, rc);[m
[31m-[m
[31m-    if (u->peer.free && u->peer.sockaddr) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        /* TODO: do not shutdown persistent connection */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-[m
[31m-            /*[m
[31m-             * We send the "close notify" shutdown alert to the upstream only[m
[31m-             * and do not wait its "close notify" shutdown alert.[m
[31m-             * It is acceptable according to the TLS standard.[m
[31m-             */[m
[31m-[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    u->peer.connection = NULL;[m
[31m-[m
[31m-    if (u->pipe && u->pipe->temp_file) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream temp fd: %d",[m
[31m-                       u->pipe->temp_file->file.fd);[m
[31m-    }[m
[31m-[m
[31m-    if (u->store && u->pipe && u->pipe->temp_file[m
[31m-        && u->pipe->temp_file->file.fd != NGX_INVALID_FILE)[m
[31m-    {[m
[31m-        if (ngx_delete_file(u->pipe->temp_file->file.name.data)[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                          ngx_delete_file_n " \"%s\" failed",[m
[31m-                          u->pipe->temp_file->file.name.data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-[m
[31m-        if (u->cacheable) {[m
[31m-[m
[31m-            if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT) {[m
[31m-                time_t  valid;[m
[31m-[m
[31m-                valid = ngx_http_file_cache_valid(u->conf->cache_valid, rc);[m
[31m-[m
[31m-                if (valid) {[m
[31m-                    r->cache->valid_sec = ngx_time() + valid;[m
[31m-                    r->cache->error = rc;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (r->subrequest_in_memory[m
[31m-        && u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-    {[m
[31m-        u->buffer.last = u->buffer.pos;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "sending to client";[m
[31m-[m
[31m-    if (!u->header_sent[m
[31m-        || rc == NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        || (u->pipe && u->pipe->downstream_error))[m
[31m-    {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    flush = 0;[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        rc = NGX_ERROR;[m
[31m-        flush = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-    } else if (flush) {[m
[31m-        r->keepalive = 0;[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_FLUSH);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->headers_in.content_length = h;[m
[31m-    u->headers_in.content_length_n = ngx_atoof(h->value.data, h->value.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->headers_in.last_modified = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-        u->headers_in.last_modified_time = ngx_parse_http_time(h->value.data,[m
[31m-                                                               h->value.len);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t           *pa;[m
[31m-    ngx_table_elt_t      **ph;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pa = &u->headers_in.cookies;[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 1, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (!(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE)) {[m
[31m-        u->cacheable = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t          *pa;[m
[31m-    ngx_table_elt_t     **ph;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pa = &u->headers_in.cache_control;[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    u_char     *p, *start, *last;[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache->valid_sec != 0 && u->headers_in.x_accel_expires != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    start = h->value.data;[m
[31m-    last = start + h->value.len;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(start, last, (u_char *) "no-cache", 8 - 1) != NULL[m
[31m-        || ngx_strlcasestrn(start, last, (u_char *) "no-store", 8 - 1) != NULL[m
[31m-        || ngx_strlcasestrn(start, last, (u_char *) "private", 7 - 1) != NULL)[m
[31m-    {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlcasestrn(start, last, (u_char *) "s-maxage=", 9 - 1);[m
[31m-    offset = 9;[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        p = ngx_strlcasestrn(start, last, (u_char *) "max-age=", 8 - 1);[m
[31m-        offset = 8;[m
[31m-    }[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (p += offset; p < last; p++) {[m
[31m-        if (*p == ',' || *p == ';' || *p == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (*p >= '0' && *p <= '9') {[m
[31m-            n = n * 10 + *p - '0';[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->valid_sec = ngx_time() + n;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_expires(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.expires = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    time_t  expires;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_EXPIRES) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache->valid_sec != 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    expires = ngx_parse_http_time(h->value.data, h->value.len);[m
[31m-[m
[31m-    if (expires == NGX_ERROR || expires < ngx_time()) {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->valid_sec = expires;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.x_accel_expires = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    u_char     *p;[m
[31m-    size_t      len;[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = h->value.len;[m
[31m-    p = h->value.data;[m
[31m-[m
[31m-    if (p[0] != '@') {[m
[31m-        n = ngx_atoi(p, len);[m
[31m-[m
[31m-        switch (n) {[m
[31m-        case 0:[m
[31m-            u->cacheable = 0;[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        default:[m
[31m-            r->cache->valid_sec = ngx_time() + n;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p++;[m
[31m-    len--;[m
[31m-[m
[31m-    n = ngx_atoi(p, len);[m
[31m-[m
[31m-    if (n != NGX_ERROR) {[m
[31m-        r->cache->valid_sec = n;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.x_accel_limit_rate = h;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(h->value.data, h->value.len);[m
[31m-[m
[31m-    if (n != NGX_ERROR) {[m
[31m-        r->limit_rate = (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_buffering(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char                c0, c1, c2;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->change_buffering) {[m
[31m-[m
[31m-        if (h->value.len == 2) {[m
[31m-            c0 = ngx_tolower(h->value.data[0]);[m
[31m-            c1 = ngx_tolower(h->value.data[1]);[m
[31m-[m
[31m-            if (c0 == 'n' && c1 == 'o') {[m
[31m-                u->buffering = 0;[m
[31m-            }[m
[31m-[m
[31m-        } else if (h->value.len == 3) {[m
[31m-            c0 = ngx_tolower(h->value.data[0]);[m
[31m-            c1 = ngx_tolower(h->value.data[1]);[m
[31m-            c2 = ngx_tolower(h->value.data[2]);[m
[31m-[m
[31m-            if (c0 == 'y' && c1 == 'e' && c2 == 's') {[m
[31m-                u->buffering = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_charset(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    if (r->upstream->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_CHARSET) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.override_charset = &h->value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    r->upstream->headers_in.connection = h;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,[m
[31m-                         (u_char *) "close", 5 - 1)[m
[31m-        != NULL)[m
[31m-    {[m
[31m-        r->upstream->headers_in.connection_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    r->upstream->headers_in.transfer_encoding = h;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,[m
[31m-                         (u_char *) "chunked", 7 - 1)[m
[31m-        != NULL)[m
[31m-    {[m
[31m-        r->upstream->headers_in.chunked = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_vary(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.vary = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_VARY) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (h->value.len > NGX_HTTP_CACHE_VARY_LEN[m
[31m-        || (h->value.len == 1 && h->value.data[0] == '*'))[m
[31m-    {[m
[31m-        u->cacheable = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->vary = h->value;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (offset) {[m
[31m-        ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);[m
[31m-        *ph = ho;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    r->headers_out.content_type_len = h->value.len;[m
[31m-    r->headers_out.content_type = h->value;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    for (p = h->value.data; *p; p++) {[m
[31m-[m
[31m-        if (*p != ';') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        last = p;[m
[31m-[m
[31m-        while (*++p == ' ') { /* void */ }[m
[31m-[m
[31m-        if (*p == '\0') {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p += 8;[m
[31m-[m
[31m-        r->headers_out.content_type_len = last - h->value.data;[m
[31m-[m
[31m-        if (*p == '"') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        last = h->value.data + h->value.len;[m
[31m-[m
[31m-        if (*(last - 1) == '"') {[m
[31m-            last--;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.charset.len = last - p;[m
[31m-        r->headers_out.charset.data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.last_modified = ho;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->upstream->cacheable) {[m
[31m-        r->headers_out.last_modified_time =[m
[31m-                                    r->upstream->headers_in.last_modified_time;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_redirect) {[m
[31m-        rc = r->upstream->rewrite_redirect(r, ho, 0);[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->headers_out.location = ho;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten location: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ho->value.data[0] != '/') {[m
[31m-        r->headers_out.location = ho;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_redirect) {[m
[31m-[m
[31m-        p = ngx_strcasestrn(ho->value.data, "url=", 4 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data);[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->headers_out.refresh = ho;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten refresh: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.refresh = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_cookie) {[m
[31m-        rc = r->upstream->rewrite_cookie(r, ho);[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        if (rc == NGX_OK) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten cookie: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    if (r->upstream->conf->force_ranges) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cached) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->upstream->cacheable) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        r->single_range = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.accept_ranges = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.content_encoding = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_upstream_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for (i = 0; i < r->upstream_states->nelts; i++) {[m
[31m-        if (state[i].peer) {[m
[31m-            len += state[i].peer->len + 2;[m
[31m-[m
[31m-        } else {[m
[31m-            len += 3;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].peer) {[m
[31m-            p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len);[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (3 + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].status) {[m
[31m-            p = ngx_sprintf(p, "%ui", state[i].status);[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = '-';[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_response_time_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].status) {[m
[31m-[m
[31m-            if (data == 1 && state[i].header_time != (ngx_msec_t) -1) {[m
[31m-                ms = state[i].header_time;[m
[31m-[m
[31m-            } else if (data == 2 && state[i].connect_time != (ngx_msec_t) -1) {[m
[31m-                ms = state[i].connect_time;[m
[31m-[m
[31m-            } else {[m
[31m-                ms = state[i].response_time;[m
[31m-            }[m
[31m-[m
[31m-            ms = ngx_max(ms, 0);[m
[31m-            p = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000);[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = '-';[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_response_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (NGX_OFF_T_LEN + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        p = ngx_sprintf(p, "%O", state[i].response_length);[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_header_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->upstream == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,[m
[31m-                                         &r->upstream->headers_in.headers.part,[m
[31m-                                         sizeof("upstream_http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_cookie_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  *name = (ngx_str_t *) data;[m
[31m-[m
[31m-    ngx_str_t   cookie, s;[m
[31m-[m
[31m-    if (r->upstream == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    s.len = name->len - (sizeof("upstream_cookie_") - 1);[m
[31m-    s.data = name->data + sizeof("upstream_cookie_") - 1;[m
[31m-[m
[31m-    if (ngx_http_parse_set_cookie_lines(&r->upstream->headers_in.cookies,[m
[31m-                                        &s, &cookie)[m
[31m-        == NGX_DECLINED)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = cookie.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = cookie.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_cache_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t  n;[m
[31m-[m
[31m-    if (r->upstream == NULL || r->upstream->cache_status == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = r->upstream->cache_status - 1;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = ngx_http_cache_status[n].len;[m
[31m-    v->data = ngx_http_cache_status[n].data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->upstream == NULL[m
[31m-        || !r->upstream->conf->cache_revalidate[m
[31m-        || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED[m
[31m-        || r->cache->last_modified == -1)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_http_time(p, r->cache->last_modified) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_etag(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->upstream == NULL[m
[31m-        || !r->upstream->conf->cache_revalidate[m
[31m-        || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED[m
[31m-        || r->cache->etag.len == 0)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = r->cache->etag.len;[m
[31m-    v->data = r->cache->etag.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                          *rv;[m
[31m-    void                          *mconf;[m
[31m-    ngx_str_t                     *value;[m
[31m-    ngx_url_t                      u;[m
[31m-    ngx_uint_t                     m;[m
[31m-    ngx_conf_t                     pcf;[m
[31m-    ngx_http_module_t             *module;[m
[31m-    ngx_http_conf_ctx_t           *ctx, *http_ctx;[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    u.host = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-    u.no_port = 1;[m
[31m-[m
[31m-    uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE[m
[31m-                                         |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                                         |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                                         |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                                         |NGX_HTTP_UPSTREAM_DOWN[m
[31m-                                         |NGX_HTTP_UPSTREAM_BACKUP);[m
[31m-    if (uscf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx = cf->ctx;[m
[31m-    ctx->main_conf = http_ctx->main_conf;[m
[31m-[m
[31m-    /* the upstream{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->srv_conf[ngx_http_upstream_module.ctx_index] = uscf;[m
[31m-[m
[31m-    uscf->srv_conf = ctx->srv_conf;[m
[31m-[m
[31m-[m
[31m-    /* the upstream{}'s loc_conf */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    uscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                                     sizeof(ngx_http_upstream_server_t));[m
[31m-    if (uscf->servers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside upstream{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_UPS_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (uscf->servers->nelts == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no servers are inside upstream");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf = conf;[m
[31m-[m
[31m-    time_t                       fail_timeout;[m
[31m-    ngx_str_t                   *value, s;[m
[31m-    ngx_url_t                    u;[m
[31m-    ngx_int_t                    weight, max_fails;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_http_upstream_server_t  *us;[m
[31m-[m
[31m-    us = ngx_array_push(uscf->servers);[m
[31m-    if (us == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(us, sizeof(ngx_http_upstream_server_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    weight = 1;[m
[31m-    max_fails = 1;[m
[31m-    fail_timeout = 10;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            weight = ngx_atoi(&value[i].data[7], value[i].len - 7);[m
[31m-[m
[31m-            if (weight == NGX_ERROR || weight == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);[m
[31m-[m
[31m-            if (max_fails == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 13;[m
[31m-            s.data = &value[i].data[13];[m
[31m-[m
[31m-            fail_timeout = ngx_parse_time(&s, 1);[m
[31m-[m
[31m-            if (fail_timeout == (time_t) NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "backup") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->backup = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "down") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->down = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = 80;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in upstream \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->name = u.url;[m
[31m-    us->addrs = u.addrs;[m
[31m-    us->naddrs = u.naddrs;[m
[31m-    us->weight = weight;[m
[31m-    us->max_fails = max_fails;[m
[31m-    us->fail_timeout = fail_timeout;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid parameter \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-not_supported:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "balancing method does not support parameter \"%V\"",[m
[31m-                       &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_http_upstream_server_t     *us;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) {[m
[31m-[m
[31m-        if (ngx_parse_url(cf->pool, u) != NGX_OK) {[m
[31m-            if (u->err) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "%s in upstream \"%V\"", u->err, &u->url);[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != u->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_UPSTREAM_CREATE)[m
[31m-             && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate upstream \"%V\"", &u->host);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && !u->no_port) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "upstream \"%V\" may not have port %d",[m
[31m-                               &u->host, u->port);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_UPSTREAM_CREATE) && !uscfp[i]->no_port) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                          "upstream \"%V\" may not have port %d in %s:%ui",[m
[31m-                          &u->host, uscfp[i]->port,[m
[31m-                          uscfp[i]->file_name, uscfp[i]->line);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port && u->port[m
[31m-            && uscfp[i]->port != u->port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && u->default_port[m
[31m-            && uscfp[i]->default_port != u->default_port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_HTTP_UPSTREAM_CREATE) {[m
[31m-            uscfp[i]->flags = flags;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_srv_conf_t));[m
[31m-    if (uscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = flags;[m
[31m-    uscf->host = u->host;[m
[31m-    uscf->file_name = cf->conf_file->file.name.data;[m
[31m-    uscf->line = cf->conf_file->line;[m
[31m-    uscf->port = u->port;[m
[31m-    uscf->default_port = u->default_port;[m
[31m-    uscf->no_port = u->no_port;[m
[31m-[m
[31m-    if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) {[m
[31m-        uscf->servers = ngx_array_create(cf->pool, 1,[m
[31m-                                         sizeof(ngx_http_upstream_server_t));[m
[31m-        if (uscf->servers == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        us = ngx_array_push(uscf->servers);[m
[31m-        if (us == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(us, sizeof(ngx_http_upstream_server_t));[m
[31m-[m
[31m-        us->addrs = u->addrs;[m
[31m-        us->naddrs = 1;[m
[31m-    }[m
[31m-[m
[31m-    uscfp = ngx_array_push(&umcf->upstreams);[m
[31m-    if (uscfp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *uscfp = uscf;[m
[31m-[m
[31m-    return uscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t                           rc;[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_http_complex_value_t            cv;[m
[31m-    ngx_http_upstream_local_t         **plocal, *local;[m
[31m-    ngx_http_compile_complex_value_t    ccv;[m
[31m-[m
[31m-    plocal = (ngx_http_upstream_local_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*plocal != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        *plocal = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    local = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_local_t));[m
[31m-    if (local == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *plocal = local;[m
[31m-[m
[31m-    if (cv.lengths) {[m
[31m-        local->value = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (local->value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *local->value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));[m
[31m-    if (local->addr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(cf->pool, local->addr, value[1].data, value[1].len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        local->addr->name = value[1];[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid address \"%V\"", &value[1]);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_addr_t *[m
[31m-ngx_http_upstream_get_local(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_local_t *local)[m
[31m-{[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_str_t    val;[m
[31m-    ngx_addr_t  *addr;[m
[31m-[m
[31m-    if (local == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (local->value == NULL) {[m
[31m-        return local->addr;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, local->value, &val) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    addr = ngx_palloc(r->pool, sizeof(ngx_addr_t));[m
[31m-    if (addr == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(r->pool, addr, val.data, val.len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        addr->name = val;[m
[31m-        return addr;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid local address \"%V\"", &val);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_array_t                **a;[m
[31m-    ngx_http_upstream_param_t   *param;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_http_upstream_param_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    param = ngx_array_push(*a);[m
[31m-    if (param == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    param->key = value[1];[m
[31m-    param->value = value[2];[m
[31m-    param->skip_empty = 0;[m
[31m-[m
[31m-    if (cf->args->nelts == 4) {[m
[31m-        if (ngx_strcmp(value[3].data, "if_not_empty") != 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[3]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        param->skip_empty = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,[m
[31m-    ngx_str_t *default_hide_headers, ngx_hash_init_t *hash)[m
[31m-{[m
[31m-    ngx_str_t       *h;[m
[31m-    ngx_uint_t       i, j;[m
[31m-    ngx_array_t      hide_headers;[m
[31m-    ngx_hash_key_t  *hk;[m
[31m-[m
[31m-    if (conf->hide_headers == NGX_CONF_UNSET_PTR[m
[31m-        && conf->pass_headers == NGX_CONF_UNSET_PTR)[m
[31m-    {[m
[31m-        conf->hide_headers = prev->hide_headers;[m
[31m-        conf->pass_headers = prev->pass_headers;[m
[31m-[m
[31m-        conf->hide_headers_hash = prev->hide_headers_hash;[m
[31m-[m
[31m-        if (conf->hide_headers_hash.buckets[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-            && ((conf->cache == 0) == (prev->cache == 0))[m
[31m-#endif[m
[31m-           )[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (conf->hide_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->hide_headers = prev->hide_headers;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->pass_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->pass_headers = prev->pass_headers;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (h = default_hide_headers; h->len; h++) {[m
[31m-        hk = ngx_array_push(&hide_headers);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = *h;[m
[31m-        hk->key_hash = ngx_hash_key_lc(h->data, h->len);[m
[31m-        hk->value = (void *) 1;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->hide_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->hide_headers->elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->hide_headers->nelts; i++) {[m
[31m-[m
[31m-            hk = hide_headers.elts;[m
[31m-[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    goto exist;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hk = ngx_array_push(&hide_headers);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key = h[i];[m
[31m-            hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-        exist:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pass_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->pass_headers->elts;[m
[31m-        hk = hide_headers.elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->pass_headers->nelts; i++) {[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-[m
[31m-                if (hk[j].key.data == NULL) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    hk[j].key.data = NULL;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hash->hash = &conf->hide_headers_hash;[m
[31m-    hash->key = ngx_hash_key_lc;[m
[31m-    hash->pool = cf->pool;[m
[31m-    hash->temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_upstream_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t));[m
[31m-    if (umcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&umcf->upstreams, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_upstream_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return umcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_array_t                     headers_in;[m
[31m-    ngx_hash_key_t                 *hk;[m
[31m-    ngx_hash_init_t                 hash;[m
[31m-    ngx_http_upstream_init_pt       init;[m
[31m-    ngx_http_upstream_header_t     *header;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream:[m
[31m-                                            ngx_http_upstream_init_round_robin;[m
[31m-[m
[31m-        if (init(cf, uscfp[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* upstream_headers_in_hash */[m
[31m-[m
[31m-    if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (header = ngx_http_upstream_headers_in; header->name.len; header++) {[m
[31m-        hk = ngx_array_push(&headers_in);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = header->name;[m
[31m-        hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);[m
[31m-        hk->value = header;[m
[31m-    }[m
[31m-[m
[31m-    hash.hash = &umcf->headers_in_hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "upstream_headers_in_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex 7595dcf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,419 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_[m
[31m-#define _NGX_HTTP_UPSTREAM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-#include <ngx_event_pipe.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_FT_ERROR           0x00000002[m
[31m-#define NGX_HTTP_UPSTREAM_FT_TIMEOUT         0x00000004[m
[31m-#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER  0x00000008[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_500        0x00000010[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_502        0x00000020[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_503        0x00000040[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_504        0x00000080[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_403        0x00000100[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_404        0x00000200[m
[31m-#define NGX_HTTP_UPSTREAM_FT_UPDATING        0x00000400[m
[31m-#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK       0x00000800[m
[31m-#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING     0x00001000[m
[31m-#define NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT  0x00002000[m
[31m-#define NGX_HTTP_UPSTREAM_FT_NOLIVE          0x40000000[m
[31m-#define NGX_HTTP_UPSTREAM_FT_OFF             0x80000000[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_FT_STATUS          (NGX_HTTP_UPSTREAM_FT_HTTP_500  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_502  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_503  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_504  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_403  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_404)[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_INVALID_HEADER     40[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT    0x00000002[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES     0x00000004[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_EXPIRES        0x00000008[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL  0x00000010[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE     0x00000020[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE  0x00000040[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING   0x00000080[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET     0x00000100[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_VARY           0x00000200[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_msec_t                       bl_time;[m
[31m-    ngx_uint_t                       bl_state;[m
[31m-[m
[31m-    ngx_uint_t                       status;[m
[31m-    ngx_msec_t                       response_time;[m
[31m-    ngx_msec_t                       connect_time;[m
[31m-    ngx_msec_t                       header_time;[m
[31m-    off_t                            response_length;[m
[31m-[m
[31m-    ngx_str_t                       *peer;[m
[31m-} ngx_http_upstream_state_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t                       headers_in_hash;[m
[31m-    ngx_array_t                      upstreams;[m
[31m-                                             /* ngx_http_upstream_srv_conf_t */[m
[31m-} ngx_http_upstream_main_conf_t;[m
[31m-[m
[31m-typedef struct ngx_http_upstream_srv_conf_s  ngx_http_upstream_srv_conf_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_upstream_init_pt)(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-typedef ngx_int_t (*ngx_http_upstream_init_peer_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_init_pt        init_upstream;[m
[31m-    ngx_http_upstream_init_peer_pt   init;[m
[31m-    void                            *data;[m
[31m-} ngx_http_upstream_peer_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_addr_t                      *addrs;[m
[31m-    ngx_uint_t                       naddrs;[m
[31m-    ngx_uint_t                       weight;[m
[31m-    ngx_uint_t                       max_fails;[m
[31m-    time_t                           fail_timeout;[m
[31m-[m
[31m-    unsigned                         down:1;[m
[31m-    unsigned                         backup:1;[m
[31m-} ngx_http_upstream_server_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_CREATE        0x0001[m
[31m-#define NGX_HTTP_UPSTREAM_WEIGHT        0x0002[m
[31m-#define NGX_HTTP_UPSTREAM_MAX_FAILS     0x0004[m
[31m-#define NGX_HTTP_UPSTREAM_FAIL_TIMEOUT  0x0008[m
[31m-#define NGX_HTTP_UPSTREAM_DOWN          0x0010[m
[31m-#define NGX_HTTP_UPSTREAM_BACKUP        0x0020[m
[31m-[m
[31m-[m
[31m-struct ngx_http_upstream_srv_conf_s {[m
[31m-    ngx_http_upstream_peer_t         peer;[m
[31m-    void                           **srv_conf;[m
[31m-[m
[31m-    ngx_array_t                     *servers;  /* ngx_http_upstream_server_t */[m
[31m-[m
[31m-    ngx_uint_t                       flags;[m
[31m-    ngx_str_t                        host;[m
[31m-    u_char                          *file_name;[m
[31m-    ngx_uint_t                       line;[m
[31m-    in_port_t                        port;[m
[31m-    in_port_t                        default_port;[m
[31m-    ngx_uint_t                       no_port;  /* unsigned no_port:1 */[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    ngx_shm_zone_t                  *shm_zone;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_addr_t                      *addr;[m
[31m-    ngx_http_complex_value_t        *value;[m
[31m-} ngx_http_upstream_local_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_srv_conf_t    *upstream;[m
[31m-[m
[31m-    ngx_msec_t                       connect_timeout;[m
[31m-    ngx_msec_t                       send_timeout;[m
[31m-    ngx_msec_t                       read_timeout;[m
[31m-    ngx_msec_t                       timeout;[m
[31m-    ngx_msec_t                       next_upstream_timeout;[m
[31m-[m
[31m-    size_t                           send_lowat;[m
[31m-    size_t                           buffer_size;[m
[31m-    size_t                           limit_rate;[m
[31m-[m
[31m-    size_t                           busy_buffers_size;[m
[31m-    size_t                           max_temp_file_size;[m
[31m-    size_t                           temp_file_write_size;[m
[31m-[m
[31m-    size_t                           busy_buffers_size_conf;[m
[31m-    size_t                           max_temp_file_size_conf;[m
[31m-    size_t                           temp_file_write_size_conf;[m
[31m-[m
[31m-    ngx_bufs_t                       bufs;[m
[31m-[m
[31m-    ngx_uint_t                       ignore_headers;[m
[31m-    ngx_uint_t                       next_upstream;[m
[31m-    ngx_uint_t                       store_access;[m
[31m-    ngx_uint_t                       next_upstream_tries;[m
[31m-    ngx_flag_t                       buffering;[m
[31m-    ngx_flag_t                       request_buffering;[m
[31m-    ngx_flag_t                       pass_request_headers;[m
[31m-    ngx_flag_t                       pass_request_body;[m
[31m-[m
[31m-    ngx_flag_t                       ignore_client_abort;[m
[31m-    ngx_flag_t                       intercept_errors;[m
[31m-    ngx_flag_t                       cyclic_temp_file;[m
[31m-    ngx_flag_t                       force_ranges;[m
[31m-[m
[31m-    ngx_path_t                      *temp_path;[m
[31m-[m
[31m-    ngx_hash_t                       hide_headers_hash;[m
[31m-    ngx_array_t                     *hide_headers;[m
[31m-    ngx_array_t                     *pass_headers;[m
[31m-[m
[31m-    ngx_http_upstream_local_t       *local;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_shm_zone_t                  *cache_zone;[m
[31m-    ngx_http_complex_value_t        *cache_value;[m
[31m-[m
[31m-    ngx_uint_t                       cache_min_uses;[m
[31m-    ngx_uint_t                       cache_use_stale;[m
[31m-    ngx_uint_t                       cache_methods;[m
[31m-[m
[31m-    ngx_flag_t                       cache_lock;[m
[31m-    ngx_msec_t                       cache_lock_timeout;[m
[31m-    ngx_msec_t                       cache_lock_age;[m
[31m-[m
[31m-    ngx_flag_t                       cache_revalidate;[m
[31m-    ngx_flag_t                       cache_convert_head;[m
[31m-[m
[31m-    ngx_array_t                     *cache_valid;[m
[31m-    ngx_array_t                     *cache_bypass;[m
[31m-    ngx_array_t                     *no_cache;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t                     *store_lengths;[m
[31m-    ngx_array_t                     *store_values;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    signed                           cache:2;[m
[31m-#endif[m
[31m-    signed                           store:2;[m
[31m-    unsigned                         intercept_404:1;[m
[31m-    unsigned                         change_buffering:1;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_ssl_t                       *ssl;[m
[31m-    ngx_flag_t                       ssl_session_reuse;[m
[31m-[m
[31m-    ngx_http_complex_value_t        *ssl_name;[m
[31m-    ngx_flag_t                       ssl_server_name;[m
[31m-    ngx_flag_t                       ssl_verify;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_str_t                        module;[m
[31m-} ngx_http_upstream_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_http_header_handler_pt       handler;[m
[31m-    ngx_uint_t                       offset;[m
[31m-    ngx_http_header_handler_pt       copy_handler;[m
[31m-    ngx_uint_t                       conf;[m
[31m-    ngx_uint_t                       redirect;  /* unsigned   redirect:1; */[m
[31m-} ngx_http_upstream_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_list_t                       headers;[m
[31m-[m
[31m-    ngx_uint_t                       status_n;[m
[31m-    ngx_str_t                        status_line;[m
[31m-[m
[31m-    ngx_table_elt_t                 *status;[m
[31m-    ngx_table_elt_t                 *date;[m
[31m-    ngx_table_elt_t                 *server;[m
[31m-    ngx_table_elt_t                 *connection;[m
[31m-[m
[31m-    ngx_table_elt_t                 *expires;[m
[31m-    ngx_table_elt_t                 *etag;[m
[31m-    ngx_table_elt_t                 *x_accel_expires;[m
[31m-    ngx_table_elt_t                 *x_accel_redirect;[m
[31m-    ngx_table_elt_t                 *x_accel_limit_rate;[m
[31m-[m
[31m-    ngx_table_elt_t                 *content_type;[m
[31m-    ngx_table_elt_t                 *content_length;[m
[31m-[m
[31m-    ngx_table_elt_t                 *last_modified;[m
[31m-    ngx_table_elt_t                 *location;[m
[31m-    ngx_table_elt_t                 *accept_ranges;[m
[31m-    ngx_table_elt_t                 *www_authenticate;[m
[31m-    ngx_table_elt_t                 *transfer_encoding;[m
[31m-    ngx_table_elt_t                 *vary;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    ngx_table_elt_t                 *content_encoding;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t                      cache_control;[m
[31m-    ngx_array_t                      cookies;[m
[31m-[m
[31m-    off_t                            content_length_n;[m
[31m-    time_t                           last_modified_time;[m
[31m-[m
[31m-    unsigned                         connection_close:1;[m
[31m-    unsigned                         chunked:1;[m
[31m-} ngx_http_upstream_headers_in_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        host;[m
[31m-    in_port_t                        port;[m
[31m-    ngx_uint_t                       no_port; /* unsigned no_port:1 */[m
[31m-[m
[31m-    ngx_uint_t                       naddrs;[m
[31m-    ngx_resolver_addr_t             *addrs;[m
[31m-[m
[31m-    struct sockaddr                 *sockaddr;[m
[31m-    socklen_t                        socklen;[m
[31m-[m
[31m-    ngx_resolver_ctx_t              *ctx;[m
[31m-} ngx_http_upstream_resolved_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_upstream_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_upstream_s {[m
[31m-    ngx_http_upstream_handler_pt     read_event_handler;[m
[31m-    ngx_http_upstream_handler_pt     write_event_handler;[m
[31m-[m
[31m-    ngx_peer_connection_t            peer;[m
[31m-[m
[31m-    ngx_event_pipe_t                *pipe;[m
[31m-[m
[31m-    ngx_chain_t                     *request_bufs;[m
[31m-[m
[31m-    ngx_output_chain_ctx_t           output;[m
[31m-    ngx_chain_writer_ctx_t           writer;[m
[31m-[m
[31m-    ngx_http_upstream_conf_t        *conf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_array_t                     *caches;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_headers_in_t   headers_in;[m
[31m-[m
[31m-    ngx_http_upstream_resolved_t    *resolved;[m
[31m-[m
[31m-    ngx_buf_t                        from_client;[m
[31m-[m
[31m-    ngx_buf_t                        buffer;[m
[31m-    off_t                            length;[m
[31m-[m
[31m-    ngx_chain_t                     *out_bufs;[m
[31m-    ngx_chain_t                     *busy_bufs;[m
[31m-    ngx_chain_t                     *free_bufs;[m
[31m-[m
[31m-    ngx_int_t                      (*input_filter_init)(void *data);[m
[31m-    ngx_int_t                      (*input_filter)(void *data, ssize_t bytes);[m
[31m-    void                            *input_filter_ctx;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_int_t                      (*create_key)(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-    ngx_int_t                      (*create_request)(ngx_http_request_t *r);[m
[31m-    ngx_int_t                      (*reinit_request)(ngx_http_request_t *r);[m
[31m-    ngx_int_t                      (*process_header)(ngx_http_request_t *r);[m
[31m-    void                           (*abort_request)(ngx_http_request_t *r);[m
[31m-    void                           (*finalize_request)(ngx_http_request_t *r,[m
[31m-                                         ngx_int_t rc);[m
[31m-    ngx_int_t                      (*rewrite_redirect)(ngx_http_request_t *r,[m
[31m-                                         ngx_table_elt_t *h, size_t prefix);[m
[31m-    ngx_int_t                      (*rewrite_cookie)(ngx_http_request_t *r,[m
[31m-                                         ngx_table_elt_t *h);[m
[31m-[m
[31m-    ngx_msec_t                       timeout;[m
[31m-[m
[31m-    ngx_http_upstream_state_t       *state;[m
[31m-[m
[31m-    ngx_str_t                        method;[m
[31m-    ngx_str_t                        schema;[m
[31m-    ngx_str_t                        uri;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_str_t                        ssl_name;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_cleanup_pt             *cleanup;[m
[31m-[m
[31m-    unsigned                         store:1;[m
[31m-    unsigned                         cacheable:1;[m
[31m-    unsigned                         accel:1;[m
[31m-    unsigned                         ssl:1;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    unsigned                         cache_status:3;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                         buffering:1;[m
[31m-    unsigned                         keepalive:1;[m
[31m-    unsigned                         upgrade:1;[m
[31m-[m
[31m-    unsigned                         request_sent:1;[m
[31m-    unsigned                         request_body_sent:1;[m
[31m-    unsigned                         header_sent:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                      status;[m
[31m-    ngx_uint_t                      mask;[m
[31m-} ngx_http_upstream_next_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t   key;[m
[31m-    ngx_str_t   value;[m
[31m-    ngx_uint_t  skip_empty;[m
[31m-} ngx_http_upstream_param_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_upstream_cookie_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-ngx_int_t ngx_http_upstream_header_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_upstream_create(ngx_http_request_t *r);[m
[31m-void ngx_http_upstream_init(ngx_http_request_t *r);[m
[31m-ngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf,[m
[31m-    ngx_url_t *u, ngx_uint_t flags);[m
[31m-char *ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-ngx_int_t ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,[m
[31m-    ngx_str_t *default_hide_headers, ngx_hash_init_t *hash);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_conf_upstream_srv_conf(uscf, module)                         \[m
[31m-    uscf->srv_conf[module.ctx_index][m
[31m-[m
[31m-[m
[31m-extern ngx_module_t        ngx_http_upstream_module;[m
[31m-extern ngx_conf_bitmask_t  ngx_http_upstream_cache_method_mask[];[m
[31m-extern ngx_conf_bitmask_t  ngx_http_upstream_ignore_headers_masks[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.c[m
[1mdeleted file mode 100644[m
[1mindex 8342dc8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.c[m
[1m+++ /dev/null[m
[36m@@ -1,843 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_upstream_tries(p) ((p)->number                               \[m
[31m-                                    + ((p)->next ? (p)->next->number : 0))[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer([m
[31m-    ngx_http_upstream_rr_peer_data_t *rrp);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static void ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_init_round_robin(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_url_t                      u;[m
[31m-    ngx_uint_t                     i, j, n, w;[m
[31m-    ngx_http_upstream_server_t    *server;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer, **peerp;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers, *backup;[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_round_robin_peer;[m
[31m-[m
[31m-    if (us->servers) {[m
[31m-        server = us->servers->elts;[m
[31m-[m
[31m-        n = 0;[m
[31m-        w = 0;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n += server[i].naddrs;[m
[31m-            w += server[i].naddrs * server[i].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no servers in upstream \"%V\" in %s:%ui",[m
[31m-                          &us->host, us->file_name, us->line);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-        if (peers == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers->single = (n == 1);[m
[31m-        peers->number = n;[m
[31m-        peers->weighted = (w != n);[m
[31m-        peers->total_weight = w;[m
[31m-        peers->name = &us->host;[m
[31m-[m
[31m-        n = 0;[m
[31m-        peerp = &peers->peer;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-                peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-                peer[n].name = server[i].addrs[j].name;[m
[31m-                peer[n].weight = server[i].weight;[m
[31m-                peer[n].effective_weight = server[i].weight;[m
[31m-                peer[n].current_weight = 0;[m
[31m-                peer[n].max_fails = server[i].max_fails;[m
[31m-                peer[n].fail_timeout = server[i].fail_timeout;[m
[31m-                peer[n].down = server[i].down;[m
[31m-                peer[n].server = server[i].name;[m
[31m-[m
[31m-                *peerp = &peer[n];[m
[31m-                peerp = &peer[n].next;[m
[31m-                n++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        us->peer.data = peers;[m
[31m-[m
[31m-        /* backup servers */[m
[31m-[m
[31m-        n = 0;[m
[31m-        w = 0;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (!server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n += server[i].naddrs;[m
[31m-            w += server[i].naddrs * server[i].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        backup = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-        if (backup == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers->single = 0;[m
[31m-        backup->single = 0;[m
[31m-        backup->number = n;[m
[31m-        backup->weighted = (w != n);[m
[31m-        backup->total_weight = w;[m
[31m-        backup->name = &us->host;[m
[31m-[m
[31m-        n = 0;[m
[31m-        peerp = &backup->peer;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (!server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-                peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-                peer[n].name = server[i].addrs[j].name;[m
[31m-                peer[n].weight = server[i].weight;[m
[31m-                peer[n].effective_weight = server[i].weight;[m
[31m-                peer[n].current_weight = 0;[m
[31m-                peer[n].max_fails = server[i].max_fails;[m
[31m-                peer[n].fail_timeout = server[i].fail_timeout;[m
[31m-                peer[n].down = server[i].down;[m
[31m-                peer[n].server = server[i].name;[m
[31m-[m
[31m-                *peerp = &peer[n];[m
[31m-                peerp = &peer[n].next;[m
[31m-                n++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        peers->next = backup;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* an upstream implicitly defined by proxy_pass, etc. */[m
[31m-[m
[31m-    if (us->port == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no port in upstream \"%V\" in %s:%ui",[m
[31m-                      &us->host, us->file_name, us->line);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.host = us->host;[m
[31m-    u.port = us->port;[m
[31m-[m
[31m-    if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "%s in upstream \"%V\" in %s:%ui",[m
[31m-                          u.err, &us->host, us->file_name, us->line);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = u.naddrs;[m
[31m-[m
[31m-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);[m
[31m-    if (peer == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (n == 1);[m
[31m-    peers->number = n;[m
[31m-    peers->weighted = 0;[m
[31m-    peers->total_weight = n;[m
[31m-    peers->name = &us->host;[m
[31m-[m
[31m-    peerp = &peers->peer;[m
[31m-[m
[31m-    for (i = 0; i < u.naddrs; i++) {[m
[31m-        peer[i].sockaddr = u.addrs[i].sockaddr;[m
[31m-        peer[i].socklen = u.addrs[i].socklen;[m
[31m-        peer[i].name = u.addrs[i].name;[m
[31m-        peer[i].weight = 1;[m
[31m-        peer[i].effective_weight = 1;[m
[31m-        peer[i].current_weight = 0;[m
[31m-        peer[i].max_fails = 1;[m
[31m-        peer[i].fail_timeout = 10;[m
[31m-        *peerp = &peer[i];[m
[31m-        peerp = &peer[i].next;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.data = peers;[m
[31m-[m
[31m-    /* implicitly defined upstream has no backup servers */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_uint_t                         n;[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp;[m
[31m-[m
[31m-    rrp = r->upstream->peer.data;[m
[31m-[m
[31m-    if (rrp == NULL) {[m
[31m-        rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t));[m
[31m-        if (rrp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->upstream->peer.data = rrp;[m
[31m-    }[m
[31m-[m
[31m-    rrp->peers = us->peer.data;[m
[31m-    rrp->current = NULL;[m
[31m-[m
[31m-    n = rrp->peers->number;[m
[31m-[m
[31m-    if (rrp->peers->next && rrp->peers->next->number > n) {[m
[31m-        n = rrp->peers->next->number;[m
[31m-    }[m
[31m-[m
[31m-    if (n <= 8 * sizeof(uintptr_t)) {[m
[31m-        rrp->tried = &rrp->data;[m
[31m-        rrp->data = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t));[m
[31m-        if (rrp->tried == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;[m
[31m-    r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;[m
[31m-    r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    r->upstream->peer.set_session =[m
[31m-                               ngx_http_upstream_set_round_robin_peer_session;[m
[31m-    r->upstream->peer.save_session =[m
[31m-                               ngx_http_upstream_save_round_robin_peer_session;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_resolved_t *ur)[m
[31m-{[m
[31m-    u_char                            *p;[m
[31m-    size_t                             len;[m
[31m-    socklen_t                          socklen;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    struct sockaddr                   *sockaddr;[m
[31m-    ngx_http_upstream_rr_peer_t       *peer, **peerp;[m
[31m-    ngx_http_upstream_rr_peers_t      *peers;[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp;[m
[31m-[m
[31m-    rrp = r->upstream->peer.data;[m
[31m-[m
[31m-    if (rrp == NULL) {[m
[31m-        rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t));[m
[31m-        if (rrp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->upstream->peer.data = rrp;[m
[31m-    }[m
[31m-[m
[31m-    peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peer = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peer_t)[m
[31m-                                * ur->naddrs);[m
[31m-    if (peer == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (ur->naddrs == 1);[m
[31m-    peers->number = ur->naddrs;[m
[31m-    peers->name = &ur->host;[m
[31m-[m
[31m-    if (ur->sockaddr) {[m
[31m-        peer[0].sockaddr = ur->sockaddr;[m
[31m-        peer[0].socklen = ur->socklen;[m
[31m-        peer[0].name = ur->host;[m
[31m-        peer[0].weight = 1;[m
[31m-        peer[0].effective_weight = 1;[m
[31m-        peer[0].current_weight = 0;[m
[31m-        peer[0].max_fails = 1;[m
[31m-        peer[0].fail_timeout = 10;[m
[31m-        peers->peer = peer;[m
[31m-[m
[31m-    } else {[m
[31m-        peerp = &peers->peer;[m
[31m-[m
[31m-        for (i = 0; i < ur->naddrs; i++) {[m
[31m-[m
[31m-            socklen = ur->addrs[i].socklen;[m
[31m-[m
[31m-            sockaddr = ngx_palloc(r->pool, socklen);[m
[31m-            if (sockaddr == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);[m
[31m-[m
[31m-            switch (sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                ((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                ((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-            peer[i].sockaddr = sockaddr;[m
[31m-            peer[i].socklen = socklen;[m
[31m-            peer[i].name.len = len;[m
[31m-            peer[i].name.data = p;[m
[31m-            peer[i].weight = 1;[m
[31m-            peer[i].effective_weight = 1;[m
[31m-            peer[i].current_weight = 0;[m
[31m-            peer[i].max_fails = 1;[m
[31m-            peer[i].fail_timeout = 10;[m
[31m-            *peerp = &peer[i];[m
[31m-            peerp = &peer[i].next;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rrp->peers = peers;[m
[31m-    rrp->current = NULL;[m
[31m-[m
[31m-    if (rrp->peers->number <= 8 * sizeof(uintptr_t)) {[m
[31m-        rrp->tried = &rrp->data;[m
[31m-        rrp->data = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t));[m
[31m-        if (rrp->tried == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;[m
[31m-    r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;[m
[31m-    r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    r->upstream->peer.set_session = ngx_http_upstream_empty_set_session;[m
[31m-    r->upstream->peer.save_session = ngx_http_upstream_empty_save_session;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_uint_t                     i, n;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get rr peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    peers = rrp->peers;[m
[31m-    ngx_http_upstream_rr_peers_wlock(peers);[m
[31m-[m
[31m-    if (peers->single) {[m
[31m-        peer = peers->peer;[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        rrp->current = peer;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* there are several peers */[m
[31m-[m
[31m-        peer = ngx_http_upstream_get_peer(rrp);[m
[31m-[m
[31m-        if (peer == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get rr peer, current: %p %i",[m
[31m-                       peer, peer->current_weight);[m
[31m-    }[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (peers->next) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");[m
[31m-[m
[31m-        rrp->peers = peers->next;[m
[31m-[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            rrp->tried[i] = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);[m
[31m-[m
[31m-        if (rc != NGX_BUSY) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_wlock(peers);[m
[31m-    }[m
[31m-[m
[31m-    /* all peers failed, mark them as live for quick recovery */[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        peer->fails = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    pc->name = peers->name;[m
[31m-[m
[31m-    return NGX_BUSY;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_rr_peer_t *[m
[31m-ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)[m
[31m-{[m
[31m-    time_t                        now;[m
[31m-    uintptr_t                     m;[m
[31m-    ngx_int_t                     total;[m
[31m-    ngx_uint_t                    i, n, p;[m
[31m-    ngx_http_upstream_rr_peer_t  *peer, *best;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    best = NULL;[m
[31m-    total = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    p = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (peer = rrp->peers->peer, i = 0;[m
[31m-         peer;[m
[31m-         peer = peer->next, i++)[m
[31m-    {[m
[31m-[m
[31m-        n = i / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (rrp->tried[n] & m) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        peer->current_weight += peer->effective_weight;[m
[31m-        total += peer->effective_weight;[m
[31m-[m
[31m-        if (peer->effective_weight < peer->weight) {[m
[31m-            peer->effective_weight++;[m
[31m-        }[m
[31m-[m
[31m-        if (best == NULL || peer->current_weight > best->current_weight) {[m
[31m-            best = peer;[m
[31m-            p = i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (best == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rrp->current = best;[m
[31m-[m
[31m-    n = p / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    rrp->tried[n] |= m;[m
[31m-[m
[31m-    best->current_weight -= total;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    return best;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    time_t                       now;[m
[31m-    ngx_http_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "free rr peer %ui %ui", pc->tries, state);[m
[31m-[m
[31m-    /* TODO: NGX_PEER_KEEPALIVE */[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_rlock(rrp->peers);[m
[31m-    ngx_http_upstream_rr_peer_lock(rrp->peers, peer);[m
[31m-[m
[31m-    if (rrp->peers->single) {[m
[31m-[m
[31m-        peer->conns--;[m
[31m-[m
[31m-        ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);[m
[31m-        ngx_http_upstream_rr_peers_unlock(rrp->peers);[m
[31m-[m
[31m-        pc->tries = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED) {[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        peer->fails++;[m
[31m-        peer->accessed = now;[m
[31m-        peer->checked = now;[m
[31m-[m
[31m-        if (peer->max_fails) {[m
[31m-            peer->effective_weight -= peer->weight / peer->max_fails;[m
[31m-[m
[31m-            if (peer->fails >= peer->max_fails) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, pc->log, 0,[m
[31m-                              "upstream server temporarily disabled");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "free rr peer failed: %p %i",[m
[31m-                       peer, peer->effective_weight);[m
[31m-[m
[31m-        if (peer->effective_weight < 0) {[m
[31m-            peer->effective_weight = 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* mark peer live if check passed */[m
[31m-[m
[31m-        if (peer->accessed < peer->checked) {[m
[31m-            peer->fails = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    peer->conns--;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);[m
[31m-    ngx_http_upstream_rr_peers_unlock(rrp->peers);[m
[31m-[m
[31m-    if (pc->tries) {[m
[31m-        pc->tries--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_ssl_session_t             *ssl_session;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer;[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    int                            len;[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                        *p;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers;[m
[31m-    u_char                         buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-#endif[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    if (peers->shpool) {[m
[31m-        ngx_http_upstream_rr_peers_rlock(peers);[m
[31m-        ngx_http_upstream_rr_peer_lock(peers, peer);[m
[31m-[m
[31m-        if (peer->ssl_session == NULL) {[m
[31m-            ngx_http_upstream_rr_peer_unlock(peers, peer);[m
[31m-            ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        len = peer->ssl_session_len;[m
[31m-[m
[31m-        ngx_memcpy(buf, peer->ssl_session, len);[m
[31m-[m
[31m-        ngx_http_upstream_rr_peer_unlock(peers, peer);[m
[31m-        ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        p = buf;[m
[31m-        ssl_session = d2i_SSL_SESSION(NULL, &p, len);[m
[31m-[m
[31m-        rc = ngx_ssl_set_session(pc->connection, ssl_session);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "set session: %p", ssl_session);[m
[31m-[m
[31m-        ngx_ssl_free_session(ssl_session);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ssl_session = peer->ssl_session;[m
[31m-[m
[31m-    rc = ngx_ssl_set_session(pc->connection, ssl_session);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "set session: %p", ssl_session);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_ssl_session_t             *old_ssl_session, *ssl_session;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer;[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    int                            len;[m
[31m-    u_char                        *p;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers;[m
[31m-    u_char                         buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    if (peers->shpool) {[m
[31m-[m
[31m-        ssl_session = SSL_get0_session(pc->connection->ssl->connection);[m
[31m-[m
[31m-        if (ssl_session == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "save session: %p", ssl_session);[m
[31m-[m
[31m-        len = i2d_SSL_SESSION(ssl_session, NULL);[m
[31m-[m
[31m-        /* do not cache too big session */[m
[31m-[m
[31m-        if (len > NGX_SSL_MAX_SESSION_SIZE) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-        (void) i2d_SSL_SESSION(ssl_session, &p);[m
[31m-[m
[31m-        peer = rrp->current;[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_rlock(peers);[m
[31m-        ngx_http_upstream_rr_peer_lock(peers, peer);[m
[31m-[m
[31m-        if (len > peer->ssl_session_len) {[m
[31m-            ngx_shmtx_lock(&peers->shpool->mutex);[m
[31m-[m
[31m-            if (peer->ssl_session) {[m
[31m-                ngx_slab_free_locked(peers->shpool, peer->ssl_session);[m
[31m-            }[m
[31m-[m
[31m-            peer->ssl_session = ngx_slab_alloc_locked(peers->shpool, len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&peers->shpool->mutex);[m
[31m-[m
[31m-            if (peer->ssl_session == NULL) {[m
[31m-                peer->ssl_session_len = 0;[m
[31m-[m
[31m-                ngx_http_upstream_rr_peer_unlock(peers, peer);[m
[31m-                ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            peer->ssl_session_len = len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer->ssl_session, buf, len);[m
[31m-[m
[31m-        ngx_http_upstream_rr_peer_unlock(peers, peer);[m
[31m-        ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ssl_session = ngx_ssl_get_session(pc->connection);[m
[31m-[m
[31m-    if (ssl_session == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "save session: %p", ssl_session);[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-    old_ssl_session = peer->ssl_session;[m
[31m-    peer->ssl_session = ssl_session;[m
[31m-[m
[31m-    if (old_ssl_session) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "old session: %p", old_ssl_session);[m
[31m-[m
[31m-        /* TODO: may block */[m
[31m-[m
[31m-        ngx_ssl_free_session(old_ssl_session);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.h[m
[1mdeleted file mode 100644[m
[1mindex f2c573f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.h[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_[m
[31m-#define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_upstream_rr_peer_s   ngx_http_upstream_rr_peer_t;[m
[31m-[m
[31m-struct ngx_http_upstream_rr_peer_s {[m
[31m-    struct sockaddr                *sockaddr;[m
[31m-    socklen_t                       socklen;[m
[31m-    ngx_str_t                       name;[m
[31m-    ngx_str_t                       server;[m
[31m-[m
[31m-    ngx_int_t                       current_weight;[m
[31m-    ngx_int_t                       effective_weight;[m
[31m-    ngx_int_t                       weight;[m
[31m-[m
[31m-    ngx_uint_t                      conns;[m
[31m-[m
[31m-    ngx_uint_t                      fails;[m
[31m-    time_t                          accessed;[m
[31m-    time_t                          checked;[m
[31m-[m
[31m-    ngx_uint_t                      max_fails;[m
[31m-    time_t                          fail_timeout;[m
[31m-[m
[31m-    ngx_uint_t                      down;          /* unsigned  down:1; */[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    void                           *ssl_session;[m
[31m-    int                             ssl_session_len;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_rr_peer_t    *next;[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    ngx_atomic_t                    lock;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_upstream_rr_peers_s  ngx_http_upstream_rr_peers_t;[m
[31m-[m
[31m-struct ngx_http_upstream_rr_peers_s {[m
[31m-    ngx_uint_t                      number;[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    ngx_slab_pool_t                *shpool;[m
[31m-    ngx_atomic_t                    rwlock;[m
[31m-    ngx_http_upstream_rr_peers_t   *zone_next;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t                      total_weight;[m
[31m-[m
[31m-    unsigned                        single:1;[m
[31m-    unsigned                        weighted:1;[m
[31m-[m
[31m-    ngx_str_t                      *name;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_t   *next;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peer_t    *peer;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peers_rlock(peers)                               \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_rlock(&peers->rwlock);                                     \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peers_wlock(peers)                               \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_wlock(&peers->rwlock);                                     \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peers_unlock(peers)                              \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_unlock(&peers->rwlock);                                    \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peer_lock(peers, peer)                           \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_wlock(&peer->lock);                                        \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peer_unlock(peers, peer)                         \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_unlock(&peer->lock);                                       \[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peers_rlock(peers)[m
[31m-#define ngx_http_upstream_rr_peers_wlock(peers)[m
[31m-#define ngx_http_upstream_rr_peers_unlock(peers)[m
[31m-#define ngx_http_upstream_rr_peer_lock(peers, peer)[m
[31m-#define ngx_http_upstream_rr_peer_unlock(peers, peer)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_rr_peers_t   *peers;[m
[31m-    ngx_http_upstream_rr_peer_t    *current;[m
[31m-    uintptr_t                      *tried;[m
[31m-    uintptr_t                       data;[m
[31m-} ngx_http_upstream_rr_peer_data_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_resolved_t *ur);[m
[31m-ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-ngx_int_t[m
[31m-    ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_variables.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_variables.c[m
[1mdeleted file mode 100644[m
[1mindex f8271ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_variables.c[m
[1m+++ /dev/null[m
[36m@@ -1,2633 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#if 0[m
[31m-static void ngx_http_variable_request_set(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static void ngx_http_variable_request_set_size(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_cookies(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_headers_internal(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data, u_char sep);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_line(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#if (NGX_HAVE_TCP_INFO)[m
[31m-static ngx_int_t ngx_http_variable_tcpinfo(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_content_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_remote_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_proxy_protocol_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_server_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_https(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static void ngx_http_variable_set_args(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_realpath_root(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_server_name(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_method(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_remote_user(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_bytes_sent(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_body_bytes_sent(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_pipe(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_completion(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_time(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_sent_content_type(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_content_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_location(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_keep_alive(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_connection_requests(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_nginx_version(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_hostname(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_pid(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_msec(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_time_iso8601(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_time_local(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-/*[m
[31m- * TODO:[m
[31m- *     Apache CGI: AUTH_TYPE, PATH_INFO (null), PATH_TRANSLATED[m
[31m- *                 REMOTE_HOST (null), REMOTE_IDENT (null),[m
[31m- *                 SERVER_SOFTWARE[m
[31m- *[m
[31m- *     Apache SSI: DOCUMENT_NAME, LAST_MODIFIED, USER_NAME (file owner)[m
[31m- */[m
[31m-[m
[31m-/*[m
[31m- * the $http_host, $http_user_agent, $http_referer, and $http_via[m
[31m- * variables may be handled by generic[m
[31m- * ngx_http_variable_unknown_header_in(), but for performance reasons[m
[31m- * they are handled using dedicated entries[m
[31m- */[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_core_variables[] = {[m
[31m-[m
[31m-    { ngx_string("http_host"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.host), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("http_user_agent"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.user_agent), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("http_referer"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.referer), 0, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("http_via"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.via), 0, 0 },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_headers,[m
[31m-      offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("http_cookie"), NULL, ngx_http_variable_cookies,[m
[31m-      offsetof(ngx_http_request_t, headers_in.cookies), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("content_length"), NULL, ngx_http_variable_content_length,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("content_type"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.content_type), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("host"), NULL, ngx_http_variable_host, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("binary_remote_addr"), NULL,[m
[31m-      ngx_http_variable_binary_remote_addr, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("remote_addr"), NULL, ngx_http_variable_remote_addr, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("remote_port"), NULL, ngx_http_variable_remote_port, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_protocol_addr"), NULL,[m
[31m-      ngx_http_variable_proxy_protocol_addr, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("server_addr"), NULL, ngx_http_variable_server_addr, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("server_port"), NULL, ngx_http_variable_server_port, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("server_protocol"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, http_protocol), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("scheme"), NULL, ngx_http_variable_scheme, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("https"), NULL, ngx_http_variable_https, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_uri"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, unparsed_uri), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("uri"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, uri),[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("document_uri"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, uri),[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("request"), NULL, ngx_http_variable_request_line, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("document_root"), NULL,[m
[31m-      ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("realpath_root"), NULL,[m
[31m-      ngx_http_variable_realpath_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("query_string"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, args),[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("args"),[m
[31m-      ngx_http_variable_set_args,[m
[31m-      ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, args),[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("is_args"), NULL, ngx_http_variable_is_args,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("request_filename"), NULL,[m
[31m-      ngx_http_variable_request_filename, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("server_name"), NULL, ngx_http_variable_server_name, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_method"), NULL,[m
[31m-      ngx_http_variable_request_method, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("remote_user"), NULL, ngx_http_variable_remote_user, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("bytes_sent"), NULL, ngx_http_variable_bytes_sent,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("body_bytes_sent"), NULL, ngx_http_variable_body_bytes_sent,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("pipe"), NULL, ngx_http_variable_pipe,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_completion"), NULL,[m
[31m-      ngx_http_variable_request_completion,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_body"), NULL,[m
[31m-      ngx_http_variable_request_body,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_body_file"), NULL,[m
[31m-      ngx_http_variable_request_body_file,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_length"), NULL, ngx_http_variable_request_length,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("request_time"), NULL, ngx_http_variable_request_time,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("status"), NULL,[m
[31m-      ngx_http_variable_status, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_content_type"), NULL,[m
[31m-      ngx_http_variable_sent_content_type, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_content_length"), NULL,[m
[31m-      ngx_http_variable_sent_content_length, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_location"), NULL,[m
[31m-      ngx_http_variable_sent_location, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_last_modified"), NULL,[m
[31m-      ngx_http_variable_sent_last_modified, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_connection"), NULL,[m
[31m-      ngx_http_variable_sent_connection, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_keep_alive"), NULL,[m
[31m-      ngx_http_variable_sent_keep_alive, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_transfer_encoding"), NULL,[m
[31m-      ngx_http_variable_sent_transfer_encoding, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers,[m
[31m-      offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("limit_rate"), ngx_http_variable_request_set_size,[m
[31m-      ngx_http_variable_request_get_size,[m
[31m-      offsetof(ngx_http_request_t, limit_rate),[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("connection"), NULL,[m
[31m-      ngx_http_variable_connection, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("connection_requests"), NULL,[m
[31m-      ngx_http_variable_connection_requests, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("hostname"), NULL, ngx_http_variable_hostname,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("pid"), NULL, ngx_http_variable_pid,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("msec"), NULL, ngx_http_variable_msec,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("time_iso8601"), NULL, ngx_http_variable_time_iso8601,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("time_local"), NULL, ngx_http_variable_time_local,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_INFO)[m
[31m-    { ngx_string("tcpinfo_rtt"), NULL, ngx_http_variable_tcpinfo,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("tcpinfo_rttvar"), NULL, ngx_http_variable_tcpinfo,[m
[31m-      1, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("tcpinfo_snd_cwnd"), NULL, ngx_http_variable_tcpinfo,[m
[31m-      2, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("tcpinfo_rcv_space"), NULL, ngx_http_variable_tcpinfo,[m
[31m-      3, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_value_t  ngx_http_variable_null_value =[m
[31m-    ngx_http_variable("");[m
[31m-ngx_http_variable_value_t  ngx_http_variable_true_value =[m
[31m-    ngx_http_variable("1");[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_t *[m
[31m-ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_hash_key_t             *key;[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    if (name->len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"$\"");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    key = cmcf->variables_keys->keys.elts;[m
[31m-    for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) {[m
[31m-        if (name->len != key[i].key.len[m
[31m-            || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        v = key[i].value;[m
[31m-[m
[31m-        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the duplicate \"%V\" variable", name);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        return v;[m
[31m-    }[m
[31m-[m
[31m-    v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t));[m
[31m-    if (v == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    v->name.len = name->len;[m
[31m-    v->name.data = ngx_pnalloc(cf->pool, name->len);[m
[31m-    if (v->name.data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(v->name.data, name->data, name->len);[m
[31m-[m
[31m-    v->set_handler = NULL;[m
[31m-    v->get_handler = NULL;[m
[31m-    v->data = 0;[m
[31m-    v->flags = flags;[m
[31m-    v->index = 0;[m
[31m-[m
[31m-    rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "conflicting variable name \"%V\"", name);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return v;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    if (name->len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"$\"");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    v = cmcf->variables.elts;[m
[31m-[m
[31m-    if (v == NULL) {[m
[31m-        if (ngx_array_init(&cmcf->variables, cf->pool, 4,[m
[31m-                           sizeof(ngx_http_variable_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        for (i = 0; i < cmcf->variables.nelts; i++) {[m
[31m-            if (name->len != v[i].name.len[m
[31m-                || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v = ngx_array_push(&cmcf->variables);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->name.len = name->len;[m
[31m-    v->name.data = ngx_pnalloc(cf->pool, name->len);[m
[31m-    if (v->name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(v->name.data, name->data, name->len);[m
[31m-[m
[31m-    v->set_handler = NULL;[m
[31m-    v->get_handler = NULL;[m
[31m-    v->data = 0;[m
[31m-    v->flags = 0;[m
[31m-    v->index = cmcf->variables.nelts - 1;[m
[31m-[m
[31m-    return v->index;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_value_t *[m
[31m-ngx_http_get_indexed_variable(ngx_http_request_t *r, ngx_uint_t index)[m
[31m-{[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (cmcf->variables.nelts <= index) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "unknown variable index: %ui", index);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (r->variables[index].not_found || r->variables[index].valid) {[m
[31m-        return &r->variables[index];[m
[31m-    }[m
[31m-[m
[31m-    v = cmcf->variables.elts;[m
[31m-[m
[31m-    if (v[index].get_handler(r, &r->variables[index], v[index].data)[m
[31m-        == NGX_OK)[m
[31m-    {[m
[31m-        if (v[index].flags & NGX_HTTP_VAR_NOCACHEABLE) {[m
[31m-            r->variables[index].no_cacheable = 1;[m
[31m-        }[m
[31m-[m
[31m-        return &r->variables[index];[m
[31m-    }[m
[31m-[m
[31m-    r->variables[index].valid = 0;[m
[31m-    r->variables[index].not_found = 1;[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_value_t *[m
[31m-ngx_http_get_flushed_variable(ngx_http_request_t *r, ngx_uint_t index)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *v;[m
[31m-[m
[31m-    v = &r->variables[index];[m
[31m-[m
[31m-    if (v->valid || v->not_found) {[m
[31m-        if (!v->no_cacheable) {[m
[31m-            return v;[m
[31m-        }[m
[31m-[m
[31m-        v->valid = 0;[m
[31m-        v->not_found = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_get_indexed_variable(r, index);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_value_t *[m
[31m-ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key)[m
[31m-{[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len);[m
[31m-[m
[31m-    if (v) {[m
[31m-        if (v->flags & NGX_HTTP_VAR_INDEXED) {[m
[31m-            return ngx_http_get_flushed_variable(r, v->index);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-            if (vv && v->get_handler(r, vv, v->data) == NGX_OK) {[m
[31m-                return vv;[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));[m
[31m-    if (vv == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 5 && ngx_strncmp(name->data, "http_", 5) == 0) {[m
[31m-[m
[31m-        if (ngx_http_variable_unknown_header_in(r, vv, (uintptr_t) name)[m
[31m-            == NGX_OK)[m
[31m-        {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 10 && ngx_strncmp(name->data, "sent_http_", 10) == 0) {[m
[31m-[m
[31m-        if (ngx_http_variable_unknown_header_out(r, vv, (uintptr_t) name)[m
[31m-            == NGX_OK)[m
[31m-        {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 14 && ngx_strncmp(name->data, "upstream_http_", 14) == 0) {[m
[31m-[m
[31m-        if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name)[m
[31m-            == NGX_OK)[m
[31m-        {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 7 && ngx_strncmp(name->data, "cookie_", 7) == 0) {[m
[31m-[m
[31m-        if (ngx_http_variable_cookie(r, vv, (uintptr_t) name) == NGX_OK) {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 16[m
[31m-        && ngx_strncmp(name->data, "upstream_cookie_", 16) == 0)[m
[31m-    {[m
[31m-[m
[31m-        if (ngx_http_upstream_cookie_variable(r, vv, (uintptr_t) name)[m
[31m-            == NGX_OK)[m
[31m-        {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 4 && ngx_strncmp(name->data, "arg_", 4) == 0) {[m
[31m-[m
[31m-        if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    vv->not_found = 1;[m
[31m-[m
[31m-    return vv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  *s;[m
[31m-[m
[31m-    s = (ngx_str_t *) ((char *) r + data);[m
[31m-[m
[31m-    if (s->data) {[m
[31m-        v->len = s->len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = s->data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-static void[m
[31m-ngx_http_variable_request_set(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  *s;[m
[31m-[m
[31m-    s = (ngx_str_t *) ((char *) r + data);[m
[31m-[m
[31m-    s->len = v->len;[m
[31m-    s->data = v->data;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_get_size(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t  *sp;[m
[31m-[m
[31m-    sp = (size_t *) ((char *) r + data);[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_SIZE_T_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%uz", *sp) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_variable_request_set_size(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ssize_t    s, *sp;[m
[31m-    ngx_str_t  val;[m
[31m-[m
[31m-    val.len = v->len;[m
[31m-    val.data = v->data;[m
[31m-[m
[31m-    s = ngx_parse_size(&val);[m
[31m-[m
[31m-    if (s == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid size \"%V\"", &val);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    sp = (ssize_t *) ((char *) r + data);[m
[31m-[m
[31m-    *sp = s;[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    h = *(ngx_table_elt_t **) ((char *) r + data);[m
[31m-[m
[31m-    if (h) {[m
[31m-        v->len = h->value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = h->value.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_cookies(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    return ngx_http_variable_headers_internal(r, v, data, ';');[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    return ngx_http_variable_headers_internal(r, v, data, ',');[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_headers_internal(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data, u_char sep)[m
[31m-{[m
[31m-    size_t             len;[m
[31m-    u_char            *p, *end;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_array_t       *a;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    a = (ngx_array_t *) ((char *) r + data);[m
[31m-[m
[31m-    n = a->nelts;[m
[31m-    h = a->elts;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        if (h[i]->hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len += h[i]->value.len + 2;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len -= 2;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        v->len = (*h)->value.len;[m
[31m-        v->data = (*h)->value.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    end = p + len;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (h[i]->hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(p, h[i]->value.data, h[i]->value.len);[m
[31m-[m
[31m-        if (p == end) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        *p++ = sep; *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_unknown_header_in(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,[m
[31m-                                            &r->headers_in.headers.part,[m
[31m-                                            sizeof("http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_unknown_header_out(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,[m
[31m-                                            &r->headers_out.headers.part,[m
[31m-                                            sizeof("sent_http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var,[m
[31m-    ngx_list_part_t *part, size_t prefix)[m
[31m-{[m
[31m-    u_char            ch;[m
[31m-    ngx_uint_t        i, n;[m
[31m-    ngx_table_elt_t  *header;[m
[31m-[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {[m
[31m-            ch = header[i].key.data[n];[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                ch |= 0x20;[m
[31m-[m
[31m-            } else if (ch == '-') {[m
[31m-                ch = '_';[m
[31m-            }[m
[31m-[m
[31m-            if (var->data[n + prefix] != ch) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n + prefix == var->len && n == header[i].key.len) {[m
[31m-            v->len = header[i].value.len;[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 0;[m
[31m-            v->not_found = 0;[m
[31m-            v->data = header[i].value.data;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_line(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p, *s;[m
[31m-[m
[31m-    s = r->request_line.data;[m
[31m-[m
[31m-    if (s == NULL) {[m
[31m-        s = r->request_start;[m
[31m-[m
[31m-        if (s == NULL) {[m
[31m-            v->not_found = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        for (p = s; p < r->header_in->last; p++) {[m
[31m-            if (*p == CR || *p == LF) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        r->request_line.len = p - s;[m
[31m-        r->request_line.data = s;[m
[31m-    }[m
[31m-[m
[31m-    v->len = r->request_line.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = s;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_cookie(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t *name = (ngx_str_t *) data;[m
[31m-[m
[31m-    ngx_str_t  cookie, s;[m
[31m-[m
[31m-    s.len = name->len - (sizeof("cookie_") - 1);[m
[31m-    s.data = name->data + sizeof("cookie_") - 1;[m
[31m-[m
[31m-    if (ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &s, &cookie)[m
[31m-        == NGX_DECLINED)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = cookie.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = cookie.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t *name = (ngx_str_t *) data;[m
[31m-[m
[31m-    u_char     *arg;[m
[31m-    size_t      len;[m
[31m-    ngx_str_t   value;[m
[31m-[m
[31m-    len = name->len - (sizeof("arg_") - 1);[m
[31m-    arg = name->data + sizeof("arg_") - 1;[m
[31m-[m
[31m-    if (ngx_http_arg(r, arg, len, &value) != NGX_OK) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = value.data;[m
[31m-    v->len = value.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_INFO)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_tcpinfo(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    struct tcp_info  ti;[m
[31m-    socklen_t        len;[m
[31m-    uint32_t         value;[m
[31m-[m
[31m-    len = sizeof(struct tcp_info);[m
[31m-    if (getsockopt(r->connection->fd, IPPROTO_TCP, TCP_INFO, &ti, &len) == -1) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (data) {[m
[31m-    case 0:[m
[31m-        value = ti.tcpi_rtt;[m
[31m-        break;[m
[31m-[m
[31m-    case 1:[m
[31m-        value = ti.tcpi_rttvar;[m
[31m-        break;[m
[31m-[m
[31m-    case 2:[m
[31m-        value = ti.tcpi_snd_cwnd;[m
[31m-        break;[m
[31m-[m
[31m-    case 3:[m
[31m-        value = ti.tcpi_rcv_space;[m
[31m-        break;[m
[31m-[m
[31m-    /* suppress warning */[m
[31m-    default:[m
[31m-        value = 0;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%uD", value) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_content_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        v->len = r->headers_in.content_length->value.len;[m
[31m-        v->data = r->headers_in.content_length->value.data;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-    } else if (r->reading_body) {[m
[31m-        v->not_found = 1;[m
[31m-        v->no_cacheable = 1;[m
[31m-[m
[31m-    } else if (r->headers_in.content_length_n >= 0) {[m
[31m-        p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_sprintf(p, "%O", r->headers_in.content_length_n) - p;[m
[31m-        v->data = p;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_host(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (r->headers_in.server.len) {[m
[31m-        v->len = r->headers_in.server.len;[m
[31m-        v->data = r->headers_in.server.data;[m
[31m-[m
[31m-    } else {[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        v->len = cscf->server_name.len;[m
[31m-        v->data = cscf->server_name.data;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_binary_remote_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    switch (r->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;[m
[31m-[m
[31m-        v->len = sizeof(struct in6_addr);[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = sin6->sin6_addr.s6_addr;[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) r->connection->sockaddr;[m
[31m-[m
[31m-        v->len = sizeof(in_addr_t);[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) &sin->sin_addr;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_remote_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->len = r->connection->addr_text.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->connection->addr_text.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_remote_port(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t            port;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (r->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;[m
[31m-        port = ntohs(sin6->sin6_port);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        port = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) r->connection->sockaddr;[m
[31m-        port = ntohs(sin->sin_port);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (port > 0 && port < 65536) {[m
[31m-        v->len = ngx_sprintf(v->data, "%ui", port) - v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_proxy_protocol_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->len = r->connection->proxy_protocol_addr.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->connection->proxy_protocol_addr.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_server_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  s;[m
[31m-    u_char     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    s.len = NGX_SOCKADDR_STRLEN;[m
[31m-    s.data = addr;[m
[31m-[m
[31m-    if (ngx_connection_local_sockaddr(r->connection, &s, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s.data = ngx_pnalloc(r->pool, s.len);[m
[31m-    if (s.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s.data, addr, s.len);[m
[31m-[m
[31m-    v->len = s.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = s.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_server_port(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t            port;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (ngx_connection_local_sockaddr(r->connection, NULL, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (r->connection->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->local_sockaddr;[m
[31m-        port = ntohs(sin6->sin6_port);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        port = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) r->connection->local_sockaddr;[m
[31m-        port = ntohs(sin->sin_port);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (port > 0 && port < 65536) {[m
[31m-        v->len = ngx_sprintf(v->data, "%ui", port) - v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_scheme(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-        v->len = sizeof("https") - 1;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "https";[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    v->len = sizeof("http") - 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) "http";[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_https(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-        v->len = sizeof("on") - 1;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "on";[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_variable_set_args(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    r->args.len = v->len;[m
[31m-    r->args.data = v->data;[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_is_args(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->args.len == 0) {[m
[31m-        v->len = 0;[m
[31m-        v->data = NULL;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = 1;[m
[31m-    v->data = (u_char *) "?";[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_document_root(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t                  path;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->root_lengths == NULL) {[m
[31m-        v->len = clcf->root.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = clcf->root.data;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 0,[m
[31m-                                clcf->root_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, &path)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = path.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = path.data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_realpath_root(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                    *real;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                  path;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-#if (NGX_HAVE_MAX_PATH)[m
[31m-    u_char                     buffer[NGX_MAX_PATH];[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->root_lengths == NULL) {[m
[31m-        path = clcf->root;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 1,[m
[31m-                                clcf->root_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        path.data[path.len - 1] = '\0';[m
[31m-[m
[31m-        if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, &path)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_MAX_PATH)[m
[31m-    real = buffer;[m
[31m-#else[m
[31m-    real = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    real = ngx_realpath(path.data, real);[m
[31m-[m
[31m-    if (real == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      ngx_realpath_n " \"%s\" failed", path.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(real);[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (v->data == NULL) {[m
[31m-#if !(NGX_HAVE_MAX_PATH)[m
[31m-        ngx_free(real);[m
[31m-#endif[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ngx_memcpy(v->data, real, len);[m
[31m-[m
[31m-#if !(NGX_HAVE_MAX_PATH)[m
[31m-    ngx_free(real);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_filename(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t     root;[m
[31m-    ngx_str_t  path;[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* ngx_http_map_uri_to_path() allocates memory for terminating '\0' */[m
[31m-[m
[31m-    v->len = path.len - 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = path.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_server_name(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v->len = cscf->server_name.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = cscf->server_name.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_method(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->main->method_name.data) {[m
[31m-        v->len = r->main->method_name.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->main->method_name.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_remote_user(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    rc = ngx_http_auth_basic_user(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = r->headers_in.user.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->headers_in.user.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_bytes_sent(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%O", r->connection->sent) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_body_bytes_sent(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    off_t    sent;[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    sent = r->connection->sent - r->header_size;[m
[31m-[m
[31m-    if (sent < 0) {[m
[31m-        sent = 0;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%O", sent) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_pipe(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->data = (u_char *) (r->pipeline ? "p" : ".");[m
[31m-    v->len = 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t  status;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT_T_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        status = r->err_status;[m
[31m-[m
[31m-    } else if (r->headers_out.status) {[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-    } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-        status = 9;[m
[31m-[m
[31m-    } else {[m
[31m-        status = 0;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%03ui", status) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_content_type(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        v->len = r->headers_out.content_type.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->headers_out.content_type.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_content_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        v->len = r->headers_out.content_length->value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->headers_out.content_length->value.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length_n >= 0) {[m
[31m-        p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_sprintf(p, "%O", r->headers_out.content_length_n) - p;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_location(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  name;[m
[31m-[m
[31m-    if (r->headers_out.location) {[m
[31m-        v->len = r->headers_out.location->value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->headers_out.location->value.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&name, "sent_http_location");[m
[31m-[m
[31m-    return ngx_http_variable_unknown_header(v, &name,[m
[31m-                                            &r->headers_out.headers.part,[m
[31m-                                            sizeof("sent_http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->headers_out.last_modified) {[m
[31m-        v->len = r->headers_out.last_modified->value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->headers_out.last_modified->value.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time >= 0) {[m
[31m-        p = ngx_pnalloc(r->pool, sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_http_time(p, r->headers_out.last_modified_time) - p;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    char    *p;[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        len = sizeof("upgrade") - 1;[m
[31m-        p = "upgrade";[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        len = sizeof("keep-alive") - 1;[m
[31m-        p = "keep-alive";[m
[31m-[m
[31m-    } else {[m
[31m-        len = sizeof("close") - 1;[m
[31m-        p = "close";[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_keep_alive(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r->keepalive) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-[m
[31m-            p = ngx_pnalloc(r->pool, sizeof("timeout=") - 1 + NGX_TIME_T_LEN);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            v->len = ngx_sprintf(p, "timeout=%T", clcf->keepalive_header) - p;[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 0;[m
[31m-            v->not_found = 0;[m
[31m-            v->data = p;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->chunked) {[m
[31m-        v->len = sizeof("chunked") - 1;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "chunked";[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_completion(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->request_complete) {[m
[31m-        v->len = 2;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "OK";[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) "";[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char       *p;[m
[31m-    size_t        len;[m
[31m-    ngx_buf_t    *buf;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->bufs == NULL[m
[31m-        || r->request_body->temp_file)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = r->request_body->bufs;[m
[31m-    buf = cl->buf;[m
[31m-[m
[31m-    if (cl->next == NULL) {[m
[31m-        v->len = buf->last - buf->pos;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = buf->pos;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = buf->last - buf->pos;[m
[31m-    cl = cl->next;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        len += buf->last - buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-    cl = r->request_body->bufs;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_body_file(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->request_body == NULL || r->request_body->temp_file == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = r->request_body->temp_file->file.name.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->request_body->temp_file->file.name.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%O", r->request_length) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_time(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char          *p;[m
[31m-    ngx_time_t      *tp;[m
[31m-    ngx_msec_int_t   ms;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ms = (ngx_msec_int_t)[m
[31m-             ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec));[m
[31m-    ms = ngx_max(ms, 0);[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_ATOMIC_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%uA", r->connection->number) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_connection_requests(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_INT_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%ui", r->connection->requests) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_nginx_version(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->len = sizeof(NGINX_VERSION) - 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) NGINX_VERSION;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_hostname(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->len = ngx_cycle->hostname.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ngx_cycle->hostname.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_pid(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_INT64_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%P", ngx_pid) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_msec(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    ngx_time_t  *tp;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%T.%03M", tp->sec, tp->msec) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_time_iso8601(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, ngx_cached_http_log_iso8601.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, ngx_cached_http_log_iso8601.data,[m
[31m-               ngx_cached_http_log_iso8601.len);[m
[31m-[m
[31m-    v->len = ngx_cached_http_log_iso8601.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_time_local(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, ngx_cached_http_log_time.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, ngx_cached_http_log_time.data, ngx_cached_http_log_time.len);[m
[31m-[m
[31m-    v->len = ngx_cached_http_log_time.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, ngx_str_t *match)[m
[31m-{[m
[31m-    void        *value;[m
[31m-    u_char      *low;[m
[31m-    size_t       len;[m
[31m-    ngx_uint_t   key;[m
[31m-[m
[31m-    len = match->len;[m
[31m-[m
[31m-    if (len) {[m
[31m-        low = ngx_pnalloc(r->pool, len);[m
[31m-        if (low == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        low = NULL;[m
[31m-    }[m
[31m-[m
[31m-    key = ngx_hash_strlow(low, match->data, len);[m
[31m-[m
[31m-    value = ngx_hash_find_combined(&map->hash, key, low, len);[m
[31m-    if (value) {[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (len && map->nregex) {[m
[31m-        ngx_int_t              n;[m
[31m-        ngx_uint_t             i;[m
[31m-        ngx_http_map_regex_t  *reg;[m
[31m-[m
[31m-        reg = map->regex;[m
[31m-[m
[31m-        for (i = 0; i < map->nregex; i++) {[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, reg[i].regex, match);[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                return reg[i].value;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* NGX_ERROR */[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_not_found(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    v->not_found = 1;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_regex_t *[m
[31m-ngx_http_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      size;[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_regex_t           *re;[m
[31m-    ngx_http_regex_variable_t  *rv;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    rc->pool = cf->pool;[m
[31m-[m
[31m-    if (ngx_regex_compile(rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    re = ngx_pcalloc(cf->pool, sizeof(ngx_http_regex_t));[m
[31m-    if (re == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = rc->regex;[m
[31m-    re->ncaptures = rc->captures;[m
[31m-    re->name = rc->pattern;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-    cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures);[m
[31m-[m
[31m-    n = (ngx_uint_t) rc->named_captures;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return re;[m
[31m-    }[m
[31m-[m
[31m-    rv = ngx_palloc(rc->pool, n * sizeof(ngx_http_regex_variable_t));[m
[31m-    if (rv == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    re->variables = rv;[m
[31m-    re->nvariables = n;[m
[31m-[m
[31m-    size = rc->name_size;[m
[31m-    p = rc->names;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        rv[i].capture = 2 * ((p[0] << 8) + p[1]);[m
[31m-[m
[31m-        name.data = &p[2];[m
[31m-        name.len = ngx_strlen(name.data);[m
[31m-[m
[31m-        v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-        if (v == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        rv[i].index = ngx_http_get_variable_index(cf, &name);[m
[31m-        if (rv[i].index == NGX_ERROR) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        v->get_handler = ngx_http_variable_not_found;[m
[31m-[m
[31m-        p += size;[m
[31m-    }[m
[31m-[m
[31m-    return re;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, ngx_str_t *s)[m
[31m-{[m
[31m-    ngx_int_t                   rc, index;[m
[31m-    ngx_uint_t                  i, n, len;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (re->ncaptures) {[m
[31m-        len = cmcf->ncaptures;[m
[31m-[m
[31m-        if (r->captures == NULL) {[m
[31m-            r->captures = ngx_palloc(r->pool, len * sizeof(int));[m
[31m-            if (r->captures == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        len = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_regex_exec(re->regex, s, r->captures, len);[m
[31m-[m
[31m-    if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (rc < 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"",[m
[31m-                      rc, s, &re->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < re->nvariables; i++) {[m
[31m-[m
[31m-        n = re->variables[i].capture;[m
[31m-        index = re->variables[i].index;[m
[31m-        vv = &r->variables[index];[m
[31m-[m
[31m-        vv->len = r->captures[n + 1] - r->captures[n];[m
[31m-        vv->valid = 1;[m
[31m-        vv->no_cacheable = 0;[m
[31m-        vv->not_found = 0;[m
[31m-        vv->data = &s->data[r->captures[n]];[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        ngx_http_variable_t  *v;[m
[31m-[m
[31m-        v = cmcf->variables.elts;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http regex set $%V to \"%v\"", &v[index].name, vv);[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    r->ncaptures = rc * 2;[m
[31m-    r->captures_data = s->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_variables_add_core_vars(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_variable_t        *cv, *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    cmcf->variables_keys = ngx_pcalloc(cf->temp_pool,[m
[31m-                                       sizeof(ngx_hash_keys_arrays_t));[m
[31m-    if (cmcf->variables_keys == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->variables_keys->pool = cf->pool;[m
[31m-    cmcf->variables_keys->temp_pool = cf->pool;[m
[31m-[m
[31m-    if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (cv = ngx_http_core_variables; cv->name.len; cv++) {[m
[31m-        v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t));[m
[31m-        if (v == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *v = *cv;[m
[31m-[m
[31m-        rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v,[m
[31m-                              NGX_HASH_READONLY_KEY);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "conflicting variable name \"%V\"", &v->name);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_variables_init_vars(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_hash_key_t             *key;[m
[31m-    ngx_hash_init_t             hash;[m
[31m-    ngx_http_variable_t        *v, *av;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    /* set the handlers for the indexed http variables */[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    v = cmcf->variables.elts;[m
[31m-    key = cmcf->variables_keys->keys.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->variables.nelts; i++) {[m
[31m-[m
[31m-        for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {[m
[31m-[m
[31m-            av = key[n].value;[m
[31m-[m
[31m-            if (v[i].name.len == key[n].key.len[m
[31m-                && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                v[i].get_handler = av->get_handler;[m
[31m-                v[i].data = av->data;[m
[31m-[m
[31m-                av->flags |= NGX_HTTP_VAR_INDEXED;[m
[31m-                v[i].flags = av->flags;[m
[31m-[m
[31m-                av->index = i;[m
[31m-[m
[31m-                if (av->get_handler == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 5[m
[31m-            && ngx_strncmp(v[i].name.data, "http_", 5) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_variable_unknown_header_in;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 10[m
[31m-            && ngx_strncmp(v[i].name.data, "sent_http_", 10) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_variable_unknown_header_out;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 14[m
[31m-            && ngx_strncmp(v[i].name.data, "upstream_http_", 14) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_upstream_header_variable;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-            v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 7[m
[31m-            && ngx_strncmp(v[i].name.data, "cookie_", 7) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_variable_cookie;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 16[m
[31m-            && ngx_strncmp(v[i].name.data, "upstream_cookie_", 16) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_upstream_cookie_variable;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-            v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 4[m
[31m-            && ngx_strncmp(v[i].name.data, "arg_", 4) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_variable_argument;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-            v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "unknown \"%V\" variable", &v[i].name);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {[m
[31m-        av = key[n].value;[m
[31m-[m
[31m-        if (av->flags & NGX_HTTP_VAR_NOHASH) {[m
[31m-            key[n].key.data = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    hash.hash = &cmcf->variables_hash;[m
[31m-    hash.key = ngx_hash_key;[m
[31m-    hash.max_size = cmcf->variables_hash_max_size;[m
[31m-    hash.bucket_size = cmcf->variables_hash_bucket_size;[m
[31m-    hash.name = "variables_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts,[m
[31m-                      cmcf->variables_keys->keys.nelts)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->variables_keys = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_variables.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_variables.h[m
[1mdeleted file mode 100644[m
[1mindex 829fab3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_variables.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_VARIABLES_H_INCLUDED_[m
[31m-#define _NGX_HTTP_VARIABLES_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_variable_value_t  ngx_http_variable_value_t;[m
[31m-[m
[31m-#define ngx_http_variable(v)     { sizeof(v) - 1, 1, 0, 0, 0, (u_char *) v }[m
[31m-[m
[31m-typedef struct ngx_http_variable_s  ngx_http_variable_t;[m
[31m-[m
[31m-typedef void (*ngx_http_set_variable_pt) (ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-typedef ngx_int_t (*ngx_http_get_variable_pt) (ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_VAR_CHANGEABLE   1[m
[31m-#define NGX_HTTP_VAR_NOCACHEABLE  2[m
[31m-#define NGX_HTTP_VAR_INDEXED      4[m
[31m-#define NGX_HTTP_VAR_NOHASH       8[m
[31m-[m
[31m-[m
[31m-struct ngx_http_variable_s {[m
[31m-    ngx_str_t                     name;   /* must be first to build the hash */[m
[31m-    ngx_http_set_variable_pt      set_handler;[m
[31m-    ngx_http_get_variable_pt      get_handler;[m
[31m-    uintptr_t                     data;[m
[31m-    ngx_uint_t                    flags;[m
[31m-    ngx_uint_t                    index;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_t *ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name,[m
[31m-    ngx_uint_t flags);[m
[31m-ngx_int_t ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name);[m
[31m-ngx_http_variable_value_t *ngx_http_get_indexed_variable(ngx_http_request_t *r,[m
[31m-    ngx_uint_t index);[m
[31m-ngx_http_variable_value_t *ngx_http_get_flushed_variable(ngx_http_request_t *r,[m
[31m-    ngx_uint_t index);[m
[31m-[m
[31m-ngx_http_variable_value_t *ngx_http_get_variable(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name, ngx_uint_t key);[m
[31m-[m
[31m-ngx_int_t ngx_http_variable_unknown_header(ngx_http_variable_value_t *v,[m
[31m-    ngx_str_t *var, ngx_list_part_t *part, size_t prefix);[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                    capture;[m
[31m-    ngx_int_t                     index;[m
[31m-} ngx_http_regex_variable_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_regex_t                  *regex;[m
[31m-    ngx_uint_t                    ncaptures;[m
[31m-    ngx_http_regex_variable_t    *variables;[m
[31m-    ngx_uint_t                    nvariables;[m
[31m-    ngx_str_t                     name;[m
[31m-} ngx_http_regex_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_regex_t             *regex;[m
[31m-    void                         *value;[m
[31m-} ngx_http_map_regex_t;[m
[31m-[m
[31m-[m
[31m-ngx_http_regex_t *ngx_http_regex_compile(ngx_conf_t *cf,[m
[31m-    ngx_regex_compile_t *rc);[m
[31m-ngx_int_t ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re,[m
[31m-    ngx_str_t *s);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_combined_t           hash;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_map_regex_t         *regex;[m
[31m-    ngx_uint_t                    nregex;[m
[31m-#endif[m
[31m-} ngx_http_map_t;[m
[31m-[m
[31m-[m
[31m-void *ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map,[m
[31m-    ngx_str_t *match);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_variables_add_core_vars(ngx_conf_t *cf);[m
[31m-ngx_int_t ngx_http_variables_init_vars(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-extern ngx_http_variable_value_t  ngx_http_variable_null_value;[m
[31m-extern ngx_http_variable_value_t  ngx_http_variable_true_value;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_VARIABLES_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_write_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_write_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 0036231..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/ngx_http_write_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,327 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_write_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_write_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_write_filter_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_write_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_write_filter_module_ctx,     /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    off_t                      size, sent, nsent, limit;[m
[31m-    ngx_uint_t                 last, flush, sync;[m
[31m-    ngx_msec_t                 delay;[m
[31m-    ngx_chain_t               *cl, *ln, **ll, *chain;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    flush = 0;[m
[31m-    sync = 0;[m
[31m-    last = 0;[m
[31m-    ll = &r->out;[m
[31m-[m
[31m-    /* find the size, the flush point and the last link of the saved chain */[m
[31m-[m
[31m-    for (cl = r->out; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "write old buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "zero size buf in writer "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          cl->buf->temporary,[m
[31m-                          cl->buf->recycled,[m
[31m-                          cl->buf->in_file,[m
[31m-                          cl->buf->start,[m
[31m-                          cl->buf->pos,[m
[31m-                          cl->buf->last,[m
[31m-                          cl->buf->file,[m
[31m-                          cl->buf->file_pos,[m
[31m-                          cl->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush || cl->buf->recycled) {[m
[31m-            flush = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->sync) {[m
[31m-            sync = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* add the new chain to the existent one */[m
[31m-[m
[31m-    for (ln = in; ln; ln = ln->next) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ln->buf;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "write new buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "zero size buf in writer "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          cl->buf->temporary,[m
[31m-                          cl->buf->recycled,[m
[31m-                          cl->buf->in_file,[m
[31m-                          cl->buf->start,[m
[31m-                          cl->buf->pos,[m
[31m-                          cl->buf->last,[m
[31m-                          cl->buf->file,[m
[31m-                          cl->buf->file_pos,[m
[31m-                          cl->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush || cl->buf->recycled) {[m
[31m-            flush = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->sync) {[m
[31m-            sync = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http write filter: l:%ui f:%ui s:%O", last, flush, size);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    /*[m
[31m-     * avoid the output if there are no last buf, no flush point,[m
[31m-     * there are the incoming bufs and the size of all bufs[m
[31m-     * is smaller than "postpone_output" directive[m
[31m-     */[m
[31m-[m
[31m-    if (!last && !flush && in && size < (off_t) clcf->postpone_output) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->delayed) {[m
[31m-        c->buffered |= NGX_HTTP_WRITE_BUFFERED;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0[m
[31m-        && !(c->buffered & NGX_LOWLEVEL_BUFFERED)[m
[31m-        && !(last && c->need_last_buf))[m
[31m-    {[m
[31m-        if (last || flush || sync) {[m
[31m-            for (cl = r->out; cl; /* void */) {[m
[31m-                ln = cl;[m
[31m-                cl = cl->next;[m
[31m-                ngx_free_chain(r->pool, ln);[m
[31m-            }[m
[31m-[m
[31m-            r->out = NULL;[m
[31m-            c->buffered &= ~NGX_HTTP_WRITE_BUFFERED;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "the http output chain is empty");[m
[31m-[m
[31m-        ngx_debug_point();[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->limit_rate) {[m
[31m-        if (r->limit_rate_after == 0) {[m
[31m-            r->limit_rate_after = clcf->limit_rate_after;[m
[31m-        }[m
[31m-[m
[31m-        limit = (off_t) r->limit_rate * (ngx_time() - r->start_sec + 1)[m
[31m-                - (c->sent - r->limit_rate_after);[m
[31m-[m
[31m-        if (limit <= 0) {[m
[31m-            c->write->delayed = 1;[m
[31m-            delay = (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1);[m
[31m-            ngx_add_timer(c->write, delay);[m
[31m-[m
[31m-            c->buffered |= NGX_HTTP_WRITE_BUFFERED;[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->sendfile_max_chunk[m
[31m-            && (off_t) clcf->sendfile_max_chunk < limit)[m
[31m-        {[m
[31m-            limit = clcf->sendfile_max_chunk;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        limit = clcf->sendfile_max_chunk;[m
[31m-    }[m
[31m-[m
[31m-    sent = c->sent;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http write filter limit %O", limit);[m
[31m-[m
[31m-    chain = c->send_chain(c, r->out, limit);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http write filter %p", chain);[m
[31m-[m
[31m-    if (chain == NGX_CHAIN_ERROR) {[m
[31m-        c->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->limit_rate) {[m
[31m-[m
[31m-        nsent = c->sent;[m
[31m-[m
[31m-        if (r->limit_rate_after) {[m
[31m-[m
[31m-            sent -= r->limit_rate_after;[m
[31m-            if (sent < 0) {[m
[31m-                sent = 0;[m
[31m-            }[m
[31m-[m
[31m-            nsent -= r->limit_rate_after;[m
[31m-            if (nsent < 0) {[m
[31m-                nsent = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        delay = (ngx_msec_t) ((nsent - sent) * 1000 / r->limit_rate);[m
[31m-[m
[31m-        if (delay > 0) {[m
[31m-            limit = 0;[m
[31m-            c->write->delayed = 1;[m
[31m-            ngx_add_timer(c->write, delay);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (limit[m
[31m-        && c->write->ready[m
[31m-        && c->sent - sent >= limit - (off_t) (2 * ngx_pagesize))[m
[31m-    {[m
[31m-        c->write->delayed = 1;[m
[31m-        ngx_add_timer(c->write, 1);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = r->out; cl && cl != chain; /* void */) {[m
[31m-        ln = cl;[m
[31m-        cl = cl->next;[m
[31m-        ngx_free_chain(r->pool, ln);[m
[31m-    }[m
[31m-[m
[31m-    r->out = chain;[m
[31m-[m
[31m-    if (chain) {[m
[31m-        c->buffered |= NGX_HTTP_WRITE_BUFFERED;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->buffered &= ~NGX_HTTP_WRITE_BUFFERED;[m
[31m-[m
[31m-    if ((c->buffered & NGX_LOWLEVEL_BUFFERED) && r->postponed == NULL) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_write_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_body_filter = ngx_http_write_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2.c[m
[1mdeleted file mode 100644[m
[1mindex 278c9ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2.c[m
[1m+++ /dev/null[m
[36m@@ -1,4349 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_v2_module.h>[m
[31m-[m
[31m-[m
[31m-/* errors */[m
[31m-#define NGX_HTTP_V2_NO_ERROR                     0x0[m
[31m-#define NGX_HTTP_V2_PROTOCOL_ERROR               0x1[m
[31m-#define NGX_HTTP_V2_INTERNAL_ERROR               0x2[m
[31m-#define NGX_HTTP_V2_FLOW_CTRL_ERROR              0x3[m
[31m-#define NGX_HTTP_V2_SETTINGS_TIMEOUT             0x4[m
[31m-#define NGX_HTTP_V2_STREAM_CLOSED                0x5[m
[31m-#define NGX_HTTP_V2_SIZE_ERROR                   0x6[m
[31m-#define NGX_HTTP_V2_REFUSED_STREAM               0x7[m
[31m-#define NGX_HTTP_V2_CANCEL                       0x8[m
[31m-#define NGX_HTTP_V2_COMP_ERROR                   0x9[m
[31m-#define NGX_HTTP_V2_CONNECT_ERROR                0xa[m
[31m-#define NGX_HTTP_V2_ENHANCE_YOUR_CALM            0xb[m
[31m-#define NGX_HTTP_V2_INADEQUATE_SECURITY          0xc[m
[31m-#define NGX_HTTP_V2_HTTP_1_1_REQUIRED            0xd[m
[31m-[m
[31m-/* frame sizes */[m
[31m-#define NGX_HTTP_V2_RST_STREAM_SIZE              4[m
[31m-#define NGX_HTTP_V2_PRIORITY_SIZE                5[m
[31m-#define NGX_HTTP_V2_PING_SIZE                    8[m
[31m-#define NGX_HTTP_V2_GOAWAY_SIZE                  8[m
[31m-#define NGX_HTTP_V2_WINDOW_UPDATE_SIZE           4[m
[31m-[m
[31m-#define NGX_HTTP_V2_STREAM_ID_SIZE               4[m
[31m-[m
[31m-#define NGX_HTTP_V2_SETTINGS_PARAM_SIZE          6[m
[31m-[m
[31m-/* settings fields */[m
[31m-#define NGX_HTTP_V2_HEADER_TABLE_SIZE_SETTING    0x1[m
[31m-#define NGX_HTTP_V2_MAX_STREAMS_SETTING          0x3[m
[31m-#define NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING     0x4[m
[31m-#define NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING       0x5[m
[31m-[m
[31m-#define NGX_HTTP_V2_FRAME_BUFFER_SIZE            24[m
[31m-[m
[31m-#define NGX_HTTP_V2_DEFAULT_FRAME_SIZE           (1 << 14)[m
[31m-[m
[31m-#define NGX_HTTP_V2_MAX_WINDOW                   ((1U << 31) - 1)[m
[31m-#define NGX_HTTP_V2_DEFAULT_WINDOW               65535[m
[31m-[m
[31m-#define NGX_HTTP_V2_INITIAL_WINDOW               0[m
[31m-[m
[31m-#define NGX_HTTP_V2_ROOT                         (void *) -1[m
[31m-[m
[31m-[m
[31m-static void ngx_http_v2_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_http_v2_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c);[m
[31m-[m
[31m-static u_char *ngx_http_v2_state_proxy_protocol(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_head(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_data(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_header_block(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_field_len(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_field_huff(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_field_raw(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_field_skip(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_header_complete(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_handle_continuation(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end, ngx_http_v2_handler_pt handler);[m
[31m-static u_char *ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_rst_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_push_promise(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_ping(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_goaway(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_continuation(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_complete(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_skip_padded(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_skip(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_save(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end, ngx_http_v2_handler_pt handler);[m
[31m-static u_char *ngx_http_v2_state_headers_save(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end, ngx_http_v2_handler_pt handler);[m
[31m-static u_char *ngx_http_v2_connection_error(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t err);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_parse_int(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char **pos, u_char *end, ngx_uint_t prefix);[m
[31m-[m
[31m-static ngx_http_v2_stream_t *ngx_http_v2_create_stream([m
[31m-    ngx_http_v2_connection_t *h2c);[m
[31m-static ngx_http_v2_node_t *ngx_http_v2_get_node_by_id([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_uint_t sid, ngx_uint_t alloc);[m
[31m-static ngx_http_v2_node_t *ngx_http_v2_get_closed_node([m
[31m-    ngx_http_v2_connection_t *h2c);[m
[31m-#define ngx_http_v2_index_size(h2scf)  (h2scf->streams_index_mask + 1)[m
[31m-#define ngx_http_v2_index(h2scf, sid)  ((sid >> 1) & h2scf->streams_index_mask)[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_send_settings(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t ack);[m
[31m-static ngx_int_t ngx_http_v2_settings_frame_handler([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);[m
[31m-static ngx_int_t ngx_http_v2_send_window_update(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t sid, size_t window);[m
[31m-static ngx_int_t ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t sid, ngx_uint_t status);[m
[31m-[m
[31m-static ngx_http_v2_out_frame_t *ngx_http_v2_get_frame([m
[31m-    ngx_http_v2_connection_t *h2c, size_t length, ngx_uint_t type,[m
[31m-    u_char flags, ngx_uint_t sid);[m
[31m-static ngx_int_t ngx_http_v2_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_validate_header(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_pseudo_header(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_parse_path(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_parse_method(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_parse_scheme(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_parse_authority(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_construct_request_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_v2_cookie(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_construct_cookie_header(ngx_http_request_t *r);[m
[31m-static void ngx_http_v2_run_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_v2_process_request_body(ngx_http_request_t *r,[m
[31m-    u_char *pos, size_t size, ngx_uint_t last);[m
[31m-static ngx_int_t ngx_http_v2_filter_request_body(ngx_http_request_t *r);[m
[31m-static void ngx_http_v2_read_client_request_body_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream, ngx_uint_t status);[m
[31m-static void ngx_http_v2_close_stream_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_v2_handle_connection_handler(ngx_event_t *rev);[m
[31m-static void ngx_http_v2_idle_handler(ngx_event_t *rev);[m
[31m-static void ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t status);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_adjust_windows(ngx_http_v2_connection_t *h2c,[m
[31m-    ssize_t delta);[m
[31m-static void ngx_http_v2_set_dependency(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_node_t *node, ngx_uint_t depend, ngx_uint_t exclusive);[m
[31m-static void ngx_http_v2_node_children_update(ngx_http_v2_node_t *node);[m
[31m-[m
[31m-static void ngx_http_v2_pool_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_handler_pt ngx_http_v2_frame_states[] = {[m
[31m-    ngx_http_v2_state_data,[m
[31m-    ngx_http_v2_state_headers,[m
[31m-    ngx_http_v2_state_priority,[m
[31m-    ngx_http_v2_state_rst_stream,[m
[31m-    ngx_http_v2_state_settings,[m
[31m-    ngx_http_v2_state_push_promise,[m
[31m-    ngx_http_v2_state_ping,[m
[31m-    ngx_http_v2_state_goaway,[m
[31m-    ngx_http_v2_state_window_update,[m
[31m-    ngx_http_v2_state_continuation[m
[31m-};[m
[31m-[m
[31m-#define NGX_HTTP_V2_FRAME_STATES                                              \[m
[31m-    (sizeof(ngx_http_v2_frame_states) / sizeof(ngx_http_v2_handler_pt))[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_v2_init(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_pool_cleanup_t        *cln;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_v2_srv_conf_t    *h2scf;[m
[31m-    ngx_http_v2_main_conf_t   *h2mcf;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "init http2 connection");[m
[31m-[m
[31m-    c->log->action = "processing HTTP/2 connection";[m
[31m-[m
[31m-    h2mcf = ngx_http_get_module_main_conf(hc->conf_ctx, ngx_http_v2_module);[m
[31m-[m
[31m-    if (h2mcf->recv_buffer == NULL) {[m
[31m-        h2mcf->recv_buffer = ngx_palloc(ngx_cycle->pool,[m
[31m-                                        h2mcf->recv_buffer_size);[m
[31m-        if (h2mcf->recv_buffer == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    h2c = ngx_pcalloc(c->pool, sizeof(ngx_http_v2_connection_t));[m
[31m-    if (h2c == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    h2c->connection = c;[m
[31m-    h2c->http_connection = hc;[m
[31m-[m
[31m-    h2c->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;[m
[31m-    h2c->recv_window = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-[m
[31m-    h2c->init_window = NGX_HTTP_V2_DEFAULT_WINDOW;[m
[31m-[m
[31m-    h2c->frame_size = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v2_module);[m
[31m-[m
[31m-    h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log);[m
[31m-    if (h2c->pool == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(c->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_v2_pool_cleanup;[m
[31m-    cln->data = h2c;[m
[31m-[m
[31m-    h2c->streams_index = ngx_pcalloc(c->pool, ngx_http_v2_index_size(h2scf)[m
[31m-                                              * sizeof(ngx_http_v2_node_t *));[m
[31m-    if (h2c->streams_index == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_send_settings(h2c, 0) == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_send_window_update(h2c, 0, NGX_HTTP_V2_MAX_WINDOW[m
[31m-                                               - NGX_HTTP_V2_DEFAULT_WINDOW)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.handler = hc->proxy_protocol ? ngx_http_v2_state_proxy_protocol[m
[31m-                                            : ngx_http_v2_state_preface;[m
[31m-[m
[31m-    ngx_queue_init(&h2c->waiting);[m
[31m-    ngx_queue_init(&h2c->posted);[m
[31m-    ngx_queue_init(&h2c->dependencies);[m
[31m-    ngx_queue_init(&h2c->closed);[m
[31m-[m
[31m-    c->data = h2c;[m
[31m-[m
[31m-    rev->handler = ngx_http_v2_read_handler;[m
[31m-    c->write->handler = ngx_http_v2_write_handler;[m
[31m-[m
[31m-    ngx_http_v2_read_handler(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                    *p, *end;[m
[31m-    size_t                     available;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_main_conf_t   *h2mcf;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    h2c = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 read handler");[m
[31m-[m
[31m-    h2c->blocked = 1;[m
[31m-[m
[31m-    h2mcf = ngx_http_get_module_main_conf(h2c->http_connection->conf_ctx,[m
[31m-                                          ngx_http_v2_module);[m
[31m-[m
[31m-    available = h2mcf->recv_buffer_size - 2 * NGX_HTTP_V2_STATE_BUFFER_SIZE;[m
[31m-[m
[31m-    do {[m
[31m-        p = h2mcf->recv_buffer;[m
[31m-[m
[31m-        ngx_memcpy(p, h2c->state.buffer, NGX_HTTP_V2_STATE_BUFFER_SIZE);[m
[31m-        end = p + h2c->state.buffer_used;[m
[31m-[m
[31m-        n = c->recv(c, end, available);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0 && (h2c->state.incomplete || h2c->processing)) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "client prematurely closed connection");[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0 || n == NGX_ERROR) {[m
[31m-            c->error = 1;[m
[31m-            ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        end += n;[m
[31m-[m
[31m-        h2c->state.buffer_used = 0;[m
[31m-        h2c->state.incomplete = 0;[m
[31m-[m
[31m-        do {[m
[31m-            p = h2c->state.handler(h2c, p, end);[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } while (p != end);[m
[31m-[m
[31m-    } while (rev->ready);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->last_out && ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    h2c->blocked = 0;[m
[31m-[m
[31m-    if (h2c->processing) {[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_handle_connection(h2c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_queue_t               *q;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    h2c = c->data;[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http2 write event timed out");[m
[31m-        c->error = 1;[m
[31m-        ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 write handler");[m
[31m-[m
[31m-    h2c->blocked = 1;[m
[31m-[m
[31m-    rc = ngx_http_v2_send_output_queue(h2c);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    while (!ngx_queue_empty(&h2c->posted)) {[m
[31m-        q = ngx_queue_head(&h2c->posted);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);[m
[31m-[m
[31m-        stream->handled = 0;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "run http2 stream %ui", stream->node->id);[m
[31m-[m
[31m-        wev = stream->request->connection->write;[m
[31m-[m
[31m-        wev->active = 0;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        wev->handler(wev);[m
[31m-    }[m
[31m-[m
[31m-    h2c->blocked = 0;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_handle_connection(h2c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_send_output_queue(ngx_http_v2_connection_t *h2c)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_out_frame_t   *out, *frame, *fn;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = h2c->connection;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = NULL;[m
[31m-    out = NULL;[m
[31m-[m
[31m-    for (frame = h2c->last_out; frame; frame = fn) {[m
[31m-        frame->last->next = cl;[m
[31m-        cl = frame->first;[m
[31m-[m
[31m-        fn = frame->next;[m
[31m-        frame->next = out;[m
[31m-        out = frame;[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http2 frame out: %p sid:%ui bl:%d len:%uz",[m
[31m-                       out, out->stream ? out->stream->node->id : 0,[m
[31m-                       out->blocked, out->length);[m
[31m-    }[m
[31m-[m
[31m-    cl = c->send_chain(c, cl, 0);[m
[31m-[m
[31m-    if (cl == NGX_CHAIN_ERROR) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx,[m
[31m-                                        ngx_http_core_module);[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == -1) {[m
[31m-            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-        tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;[m
[31m-[m
[31m-    } else {[m
[31m-        tcp_nodelay = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (tcp_nodelay[m
[31m-        && clcf->tcp_nodelay[m
[31m-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-            == -1)[m
[31m-        {[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris returns EINVAL if a socket has been shut down */[m
[31m-            c->log_error = NGX_ERROR_IGNORE_EINVAL;[m
[31m-#endif[m
[31m-[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-[m
[31m-            c->log_error = NGX_ERROR_INFO;[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-    if (cl) {[m
[31m-        ngx_add_timer(wev, clcf->send_timeout);[m
[31m-[m
[31m-    } else {[m
[31m-        if (wev->timer_set) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( /* void */ ; out; out = fn) {[m
[31m-        fn = out->next;[m
[31m-[m
[31m-        if (out->handler(h2c, out) != NGX_OK) {[m
[31m-            out->blocked = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http2 frame sent: %p sid:%ui bl:%d len:%uz",[m
[31m-                       out, out->stream ? out->stream->node->id : 0,[m
[31m-                       out->blocked, out->length);[m
[31m-    }[m
[31m-[m
[31m-    frame = NULL;[m
[31m-[m
[31m-    for ( /* void */ ; out; out = fn) {[m
[31m-        fn = out->next;[m
[31m-        out->next = frame;[m
[31m-        frame = out;[m
[31m-    }[m
[31m-[m
[31m-    h2c->last_out = frame;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (!h2c->blocked) {[m
[31m-        ngx_post_event(wev, &ngx_posted_events);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    if (h2c->last_out || h2c->processing) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = h2c->connection;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->buffered) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-    if (h2c->state.incomplete) {[m
[31m-        ngx_add_timer(c->read, h2scf->recv_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_terminate || ngx_exiting) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(h2c->pool);[m
[31m-[m
[31m-    h2c->pool = NULL;[m
[31m-    h2c->free_frames = NULL;[m
[31m-    h2c->free_fake_connections = NULL;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        ngx_ssl_free_buffer(c);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-    c->idle = 1;[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    c->write->handler = ngx_http_empty_handler;[m
[31m-    c->read->handler = ngx_http_v2_idle_handler;[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(c->read, h2scf->idle_timeout);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_proxy_protocol(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_log_t  *log;[m
[31m-[m
[31m-    log = h2c->connection->log;[m
[31m-    log->action = "reading PROXY protocol";[m
[31m-[m
[31m-    pos = ngx_proxy_protocol_read(h2c->connection, pos, end);[m
[31m-[m
[31m-    log->action = "processing HTTP/2 connection";[m
[31m-[m
[31m-    if (pos == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_preface(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    static const u_char preface[] = "PRI * HTTP/2.0\r\n";[m
[31m-[m
[31m-    if ((size_t) (end - pos) < sizeof(preface) - 1) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_preface);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "invalid http2 connection preface \"%*s\"",[m
[31m-                       sizeof(preface) - 1, pos);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_preface_end(h2c, pos + sizeof(preface) - 1, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    static const u_char preface[] = "\r\nSM\r\n\r\n";[m
[31m-[m
[31m-    if ((size_t) (end - pos) < sizeof(preface) - 1) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_preface_end);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "invalid http2 connection preface \"%*s\"",[m
[31m-                       sizeof(preface) - 1, pos);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 preface verified");[m
[31m-[m
[31m-    return ngx_http_v2_state_head(h2c, pos + sizeof(preface) - 1, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_head(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)[m
[31m-{[m
[31m-    uint32_t    head;[m
[31m-    ngx_uint_t  type;[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_FRAME_HEADER_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_head);[m
[31m-    }[m
[31m-[m
[31m-    head = ngx_http_v2_parse_uint32(pos);[m
[31m-[m
[31m-    h2c->state.length = ngx_http_v2_parse_length(head);[m
[31m-    h2c->state.flags = pos[4];[m
[31m-[m
[31m-    h2c->state.sid = ngx_http_v2_parse_sid(&pos[5]);[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_FRAME_HEADER_SIZE;[m
[31m-[m
[31m-    type = ngx_http_v2_parse_type(head);[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "process http2 frame type:%ui f:%Xd l:%uz sid:%ui",[m
[31m-                   type, h2c->state.flags, h2c->state.length, h2c->state.sid);[m
[31m-[m
[31m-    if (type >= NGX_HTTP_V2_FRAME_STATES) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "http2 frame with unknown type %ui", type);[m
[31m-        return ngx_http_v2_state_skip(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_frame_states[type](h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_data(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)[m
[31m-{[m
[31m-    ngx_http_v2_node_t    *node;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_PADDED_FLAG) {[m
[31m-[m
[31m-        if (h2c->state.length == 0) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent padded DATA frame "[m
[31m-                          "with incorrect length: 0");[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        if (end - pos == 0) {[m
[31m-            return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                          ngx_http_v2_state_data);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.padding = *pos++;[m
[31m-        h2c->state.length--;[m
[31m-[m
[31m-        if (h2c->state.padding > h2c->state.length) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent padded DATA frame "[m
[31m-                          "with incorrect length: %uz, padding: %uz",[m
[31m-                          h2c->state.length, h2c->state.padding);[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.length -= h2c->state.padding;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 DATA frame");[m
[31m-[m
[31m-    if (h2c->state.length > h2c->recv_window) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client violated connection flow control: "[m
[31m-                      "received DATA frame length %uz, available window %uz",[m
[31m-                      h2c->state.length, h2c->recv_window);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_FLOW_CTRL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->recv_window -= h2c->state.length;[m
[31m-[m
[31m-    if (h2c->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4) {[m
[31m-[m
[31m-        if (ngx_http_v2_send_window_update(h2c, 0, NGX_HTTP_V2_MAX_WINDOW[m
[31m-                                                   - h2c->recv_window)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->recv_window = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-    }[m
[31m-[m
[31m-    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);[m
[31m-[m
[31m-    if (node == NULL || node->stream == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "unknown http2 stream");[m
[31m-[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    stream = node->stream;[m
[31m-[m
[31m-    if (h2c->state.length > stream->recv_window) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client violated flow control for stream %ui: "[m
[31m-                      "received DATA frame length %uz, available window %uz",[m
[31m-                      node->id, h2c->state.length, stream->recv_window);[m
[31m-[m
[31m-        if (ngx_http_v2_terminate_stream(h2c, stream,[m
[31m-                                         NGX_HTTP_V2_FLOW_CTRL_ERROR)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    stream->recv_window -= h2c->state.length;[m
[31m-[m
[31m-    if (stream->no_flow_control[m
[31m-        && stream->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4)[m
[31m-    {[m
[31m-        if (ngx_http_v2_send_window_update(h2c, node->id,[m
[31m-                                           NGX_HTTP_V2_MAX_WINDOW[m
[31m-                                           - stream->recv_window)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        stream->recv_window = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-    }[m
[31m-[m
[31m-    if (stream->in_closed) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent DATA frame for half-closed stream %ui",[m
[31m-                      node->id);[m
[31m-[m
[31m-        if (ngx_http_v2_terminate_stream(h2c, stream,[m
[31m-                                         NGX_HTTP_V2_STREAM_CLOSED)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG;[m
[31m-[m
[31m-    h2c->state.stream = stream;[m
[31m-[m
[31m-    return ngx_http_v2_state_read_data(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                 size;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_uint_t             last;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    stream = h2c->state.stream;[m
[31m-[m
[31m-    if (stream == NULL) {[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (stream->skip_data) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "skipping http2 DATA frame");[m
[31m-[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size >= h2c->state.length) {[m
[31m-        size = h2c->state.length;[m
[31m-        last = stream->in_closed;[m
[31m-[m
[31m-    } else {[m
[31m-        last = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_v2_process_request_body(stream->request, pos, size, last);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        stream->skip_data = 1;[m
[31m-        ngx_http_finalize_request(stream->request, rc);[m
[31m-    }[m
[31m-[m
[31m-    pos += size;[m
[31m-    h2c->state.length -= size;[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_read_data);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.padding) {[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                   size;[m
[31m-    ngx_uint_t               padded, priority, depend, dependency, excl, weight;[m
[31m-    ngx_uint_t               status;[m
[31m-    ngx_http_v2_node_t      *node;[m
[31m-    ngx_http_v2_stream_t    *stream;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    padded = h2c->state.flags & NGX_HTTP_V2_PADDED_FLAG;[m
[31m-    priority = h2c->state.flags & NGX_HTTP_V2_PRIORITY_FLAG;[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    if (padded) {[m
[31m-        size++;[m
[31m-    }[m
[31m-[m
[31m-    if (priority) {[m
[31m-        size += sizeof(uint32_t) + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length < size) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent HEADERS frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length == size) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent HEADERS frame with empty header block");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (end - pos) < size) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_headers);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.length -= size;[m
[31m-[m
[31m-    if (padded) {[m
[31m-        h2c->state.padding = *pos++;[m
[31m-[m
[31m-        if (h2c->state.padding > h2c->state.length) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent padded HEADERS frame "[m
[31m-                          "with incorrect length: %uz, padding: %uz",[m
[31m-                          h2c->state.length, h2c->state.padding);[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.length -= h2c->state.padding;[m
[31m-    }[m
[31m-[m
[31m-    depend = 0;[m
[31m-    excl = 0;[m
[31m-    weight = 16;[m
[31m-[m
[31m-    if (priority) {[m
[31m-        dependency = ngx_http_v2_parse_uint32(pos);[m
[31m-[m
[31m-        depend = dependency & 0x7fffffff;[m
[31m-        excl = dependency >> 31;[m
[31m-        weight = pos[4] + 1;[m
[31m-[m
[31m-        pos += sizeof(uint32_t) + 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 HEADERS frame sid:%ui on %ui excl:%ui weight:%ui",[m
[31m-                   h2c->state.sid, depend, excl, weight);[m
[31m-[m
[31m-    if (h2c->state.sid % 2 == 0 || h2c->state.sid <= h2c->last_sid) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent HEADERS frame with incorrect identifier "[m
[31m-                      "%ui, the last was %ui", h2c->state.sid, h2c->last_sid);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->last_sid = h2c->state.sid;[m
[31m-[m
[31m-    h2c->state.pool = ngx_create_pool(1024, h2c->connection->log);[m
[31m-    if (h2c->state.pool == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (depend == h2c->state.sid) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent HEADERS frame for stream %ui "[m
[31m-                      "with incorrect dependency", h2c->state.sid);[m
[31m-[m
[31m-        status = NGX_HTTP_V2_PROTOCOL_ERROR;[m
[31m-        goto rst_stream;[m
[31m-    }[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    h2c->state.header_limit = h2scf->max_header_size;[m
[31m-[m
[31m-    if (h2c->processing >= h2scf->concurrent_streams) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "concurrent streams exceeded %ui", h2c->processing);[m
[31m-[m
[31m-        status = NGX_HTTP_V2_REFUSED_STREAM;[m
[31m-        goto rst_stream;[m
[31m-    }[m
[31m-[m
[31m-    if (!h2c->settings_ack && !(h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent stream with data "[m
[31m-                      "before settings were acknowledged");[m
[31m-[m
[31m-        status = NGX_HTTP_V2_REFUSED_STREAM;[m
[31m-        goto rst_stream;[m
[31m-    }[m
[31m-[m
[31m-    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 1);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (node->parent) {[m
[31m-        ngx_queue_remove(&node->reuse);[m
[31m-        h2c->closed_nodes--;[m
[31m-    }[m
[31m-[m
[31m-    stream = ngx_http_v2_create_stream(h2c);[m
[31m-    if (stream == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.stream = stream;[m
[31m-[m
[31m-    stream->pool = h2c->state.pool;[m
[31m-    h2c->state.keep_pool = 1;[m
[31m-[m
[31m-    stream->request->request_length = h2c->state.length;[m
[31m-[m
[31m-    stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG;[m
[31m-    stream->node = node;[m
[31m-[m
[31m-    node->stream = stream;[m
[31m-[m
[31m-    if (priority || node->parent == NULL) {[m
[31m-        node->weight = weight;[m
[31m-        ngx_http_v2_set_dependency(h2c, node, depend, excl);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_header_block(h2c, pos, end);[m
[31m-[m
[31m-rst_stream:[m
[31m-[m
[31m-    if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid, status) != NGX_OK) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_header_block(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_header_block(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    ngx_int_t   value;[m
[31m-    ngx_uint_t  indexed, size_update, prefix;[m
[31m-[m
[31m-    if (end - pos < 1) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                              ngx_http_v2_state_header_block);[m
[31m-    }[m
[31m-[m
[31m-    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)[m
[31m-        && h2c->state.length < NGX_HTTP_V2_INT_OCTETS)[m
[31m-    {[m
[31m-        return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                               ngx_http_v2_state_header_block);[m
[31m-    }[m
[31m-[m
[31m-    size_update = 0;[m
[31m-    indexed = 0;[m
[31m-[m
[31m-    ch = *pos;[m
[31m-[m
[31m-    if (ch >= (1 << 7)) {[m
[31m-        /* indexed header field */[m
[31m-        indexed = 1;[m
[31m-        prefix = ngx_http_v2_prefix(7);[m
[31m-[m
[31m-    } else if (ch >= (1 << 6)) {[m
[31m-        /* literal header field with incremental indexing */[m
[31m-        h2c->state.index = 1;[m
[31m-        prefix = ngx_http_v2_prefix(6);[m
[31m-[m
[31m-    } else if (ch >= (1 << 5)) {[m
[31m-        /* dynamic table size update */[m
[31m-        size_update = 1;[m
[31m-        prefix = ngx_http_v2_prefix(5);[m
[31m-[m
[31m-    } else if (ch >= (1 << 4)) {[m
[31m-        /* literal header field never indexed */[m
[31m-        prefix = ngx_http_v2_prefix(4);[m
[31m-[m
[31m-    } else {[m
[31m-        /* literal header field without indexing */[m
[31m-        prefix = ngx_http_v2_prefix(4);[m
[31m-    }[m
[31m-[m
[31m-    value = ngx_http_v2_parse_int(h2c, &pos, end, prefix);[m
[31m-[m
[31m-    if (value < 0) {[m
[31m-        if (value == NGX_AGAIN) {[m
[31m-            return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                               ngx_http_v2_state_header_block);[m
[31m-        }[m
[31m-[m
[31m-        if (value == NGX_DECLINED) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent header block with too long %s value",[m
[31m-                          size_update ? "size update" : "header index");[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header block with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (indexed) {[m
[31m-        if (ngx_http_v2_get_indexed_header(h2c, value, 0) != NGX_OK) {[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_process_header(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (size_update) {[m
[31m-        if (ngx_http_v2_table_size(h2c, value) != NGX_OK) {[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (value == 0) {[m
[31m-        h2c->state.parse_name = 1;[m
[31m-[m
[31m-    } else if (ngx_http_v2_get_indexed_header(h2c, value, 1) != NGX_OK) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.parse_value = 1;[m
[31m-[m
[31m-    return ngx_http_v2_state_field_len(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_field_len(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                   alloc;[m
[31m-    ngx_int_t                len;[m
[31m-    ngx_uint_t               huff;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)[m
[31m-        && h2c->state.length < NGX_HTTP_V2_INT_OCTETS)[m
[31m-    {[m
[31m-        return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                               ngx_http_v2_state_field_len);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length < 1) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header block with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < 1) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                              ngx_http_v2_state_field_len);[m
[31m-    }[m
[31m-[m
[31m-    huff = *pos >> 7;[m
[31m-    len = ngx_http_v2_parse_int(h2c, &pos, end, ngx_http_v2_prefix(7));[m
[31m-[m
[31m-    if (len < 0) {[m
[31m-        if (len == NGX_AGAIN) {[m
[31m-            return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                                  ngx_http_v2_state_field_len);[m
[31m-        }[m
[31m-[m
[31m-        if (len == NGX_DECLINED) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                        "client sent header field with too long length value");[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header block with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 hpack %s string length: %i",[m
[31m-                   huff ? "encoded" : "raw", len);[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    if ((size_t) len > h2scf->max_field_size) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client exceeded http2_max_field_size limit");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.field_rest = len;[m
[31m-[m
[31m-    if (h2c->state.stream == NULL && !h2c->state.index) {[m
[31m-        return ngx_http_v2_state_field_skip(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    alloc = (huff ? len * 8 / 5 : len) + 1;[m
[31m-[m
[31m-    h2c->state.field_start = ngx_pnalloc(h2c->state.pool, alloc);[m
[31m-    if (h2c->state.field_start == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.field_end = h2c->state.field_start;[m
[31m-[m
[31m-    if (huff) {[m
[31m-        return ngx_http_v2_state_field_huff(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_field_raw(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_field_huff(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size > h2c->state.field_rest) {[m
[31m-        size = h2c->state.field_rest;[m
[31m-    }[m
[31m-[m
[31m-    if (size > h2c->state.length) {[m
[31m-        size = h2c->state.length;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.length -= size;[m
[31m-    h2c->state.field_rest -= size;[m
[31m-[m
[31m-    if (ngx_http_v2_huff_decode(&h2c->state.field_state, pos, size,[m
[31m-                                &h2c->state.field_end,[m
[31m-                                h2c->state.field_rest == 0,[m
[31m-                                h2c->connection->log)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent invalid encoded header field");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    pos += size;[m
[31m-[m
[31m-    if (h2c->state.field_rest == 0) {[m
[31m-        *h2c->state.field_end = '\0';[m
[31m-        return ngx_http_v2_state_process_header(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                              ngx_http_v2_state_field_huff);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header field with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                           ngx_http_v2_state_field_huff);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_field_raw(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size > h2c->state.field_rest) {[m
[31m-        size = h2c->state.field_rest;[m
[31m-    }[m
[31m-[m
[31m-    if (size > h2c->state.length) {[m
[31m-        size = h2c->state.length;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.length -= size;[m
[31m-    h2c->state.field_rest -= size;[m
[31m-[m
[31m-    h2c->state.field_end = ngx_cpymem(h2c->state.field_end, pos, size);[m
[31m-[m
[31m-    pos += size;[m
[31m-[m
[31m-    if (h2c->state.field_rest == 0) {[m
[31m-        *h2c->state.field_end = '\0';[m
[31m-        return ngx_http_v2_state_process_header(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                              ngx_http_v2_state_field_raw);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header field with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                           ngx_http_v2_state_field_raw);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_field_skip(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size > h2c->state.field_rest) {[m
[31m-        size = h2c->state.field_rest;[m
[31m-    }[m
[31m-[m
[31m-    if (size > h2c->state.length) {[m
[31m-        size = h2c->state.length;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.length -= size;[m
[31m-    h2c->state.field_rest -= size;[m
[31m-[m
[31m-    pos += size;[m
[31m-[m
[31m-    if (h2c->state.field_rest == 0) {[m
[31m-        return ngx_http_v2_state_process_header(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_field_skip);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header field with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                           ngx_http_v2_state_field_skip);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_v2_header_t       *header;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    static ngx_str_t cookie = ngx_string("cookie");[m
[31m-[m
[31m-    header = &h2c->state.header;[m
[31m-[m
[31m-    if (h2c->state.parse_name) {[m
[31m-        h2c->state.parse_name = 0;[m
[31m-[m
[31m-        header->name.len = h2c->state.field_end - h2c->state.field_start;[m
[31m-        header->name.data = h2c->state.field_start;[m
[31m-[m
[31m-        return ngx_http_v2_state_field_len(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.parse_value) {[m
[31m-        h2c->state.parse_value = 0;[m
[31m-[m
[31m-        header->value.len = h2c->state.field_end - h2c->state.field_start;[m
[31m-        header->value.data = h2c->state.field_start;[m
[31m-    }[m
[31m-[m
[31m-    len = header->name.len + header->value.len;[m
[31m-[m
[31m-    if (len > h2c->state.header_limit) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client exceeded http2_max_header_size limit");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.header_limit -= len;[m
[31m-[m
[31m-    if (h2c->state.index) {[m
[31m-        if (ngx_http_v2_add_header(h2c, header) != NGX_OK) {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.index = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.stream == NULL) {[m
[31m-        return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    r = h2c->state.stream->request;[m
[31m-[m
[31m-    /* TODO Optimization: validate headers while parsing. */[m
[31m-    if (ngx_http_v2_validate_header(r, header) != NGX_OK) {[m
[31m-        if (ngx_http_v2_terminate_stream(h2c, h2c->state.stream,[m
[31m-                                         NGX_HTTP_V2_PROTOCOL_ERROR)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (header->name.data[0] == ':') {[m
[31m-        rc = ngx_http_v2_pseudo_header(r, header);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ABORT) {[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            if (ngx_http_v2_terminate_stream(h2c, h2c->state.stream,[m
[31m-                                             NGX_HTTP_V2_PROTOCOL_ERROR)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (r->invalid_header) {[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (cscf->ignore_invalid_headers) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid header: \"%V\"", &header->name);[m
[31m-[m
[31m-            return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (header->name.len == cookie.len[m
[31m-        && ngx_memcmp(header->name.data, cookie.data, cookie.len) == 0)[m
[31m-    {[m
[31m-        if (ngx_http_v2_cookie(r, header) != NGX_OK) {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h->key.len = header->name.len;[m
[31m-    h->key.data = header->name.data;[m
[31m-[m
[31m-    /* TODO Optimization: precalculate hash and handler for indexed headers. */[m
[31m-    h->hash = ngx_hash_key(h->key.data, h->key.len);[m
[31m-[m
[31m-    h->value.len = header->value.len;[m
[31m-    h->value.data = header->value.data;[m
[31m-[m
[31m-    h->lowcase_key = h->key.data;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                       h->lowcase_key, h->key.len);[m
[31m-[m
[31m-    if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http2 http header: \"%V: %V\"", &h->key, &h->value);[m
[31m-[m
[31m-    return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    h2c->state.stream = NULL;[m
[31m-[m
[31m-    return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_header_complete(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        h2c->state.handler = ngx_http_v2_state_header_block;[m
[31m-        return pos;[m
[31m-    }[m
[31m-[m
[31m-    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)) {[m
[31m-        return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                             ngx_http_v2_state_header_complete);[m
[31m-    }[m
[31m-[m
[31m-    stream = h2c->state.stream;[m
[31m-[m
[31m-    if (stream) {[m
[31m-        ngx_http_v2_run_request(stream->request);[m
[31m-    }[m
[31m-[m
[31m-    if (!h2c->state.keep_pool) {[m
[31m-        ngx_destroy_pool(h2c->state.pool);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.pool = NULL;[m
[31m-    h2c->state.keep_pool = 0;[m
[31m-[m
[31m-    if (h2c->state.padding) {[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_handle_continuation(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end, ngx_http_v2_handler_pt handler)[m
[31m-{[m
[31m-    u_char    *p;[m
[31m-    size_t     len, skip;[m
[31m-    uint32_t   head;[m
[31m-[m
[31m-    len = h2c->state.length;[m
[31m-[m
[31m-    if (h2c->state.padding && (size_t) (end - pos) > len) {[m
[31m-        skip = ngx_min(h2c->state.padding, (end - pos) - len);[m
[31m-[m
[31m-        h2c->state.padding -= skip;[m
[31m-[m
[31m-        p = pos;[m
[31m-        pos += skip;[m
[31m-        ngx_memmove(pos, p, len);[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (end - pos) < len + NGX_HTTP_V2_FRAME_HEADER_SIZE) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end, handler);[m
[31m-    }[m
[31m-[m
[31m-    p = pos + len;[m
[31m-[m
[31m-    head = ngx_http_v2_parse_uint32(p);[m
[31m-[m
[31m-    if (ngx_http_v2_parse_type(head) != NGX_HTTP_V2_CONTINUATION_FRAME) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-             "client sent inappropriate frame while CONTINUATION was expected");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.flags |= p[4];[m
[31m-[m
[31m-    if (h2c->state.sid != ngx_http_v2_parse_sid(&p[5])) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                    "client sent CONTINUATION frame with incorrect identifier");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    p = pos;[m
[31m-    pos += NGX_HTTP_V2_FRAME_HEADER_SIZE;[m
[31m-[m
[31m-    ngx_memcpy(pos, p, len);[m
[31m-[m
[31m-    len = ngx_http_v2_parse_length(head);[m
[31m-[m
[31m-    h2c->state.length += len;[m
[31m-[m
[31m-    if (h2c->state.stream) {[m
[31m-        h2c->state.stream->request->request_length += len;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.handler = handler;[m
[31m-    return pos;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_uint_t           depend, dependency, excl, weight;[m
[31m-    ngx_http_v2_node_t  *node;[m
[31m-[m
[31m-    if (h2c->state.length != NGX_HTTP_V2_PRIORITY_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent PRIORITY frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_PRIORITY_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_priority);[m
[31m-    }[m
[31m-[m
[31m-    dependency = ngx_http_v2_parse_uint32(pos);[m
[31m-[m
[31m-    depend = dependency & 0x7fffffff;[m
[31m-    excl = dependency >> 31;[m
[31m-    weight = pos[4] + 1;[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_PRIORITY_SIZE;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 PRIORITY frame sid:%ui on %ui excl:%ui weight:%ui",[m
[31m-                   h2c->state.sid, depend, excl, weight);[m
[31m-[m
[31m-    if (h2c->state.sid == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent PRIORITY frame with incorrect identifier");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (depend == h2c->state.sid) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent PRIORITY frame for stream %ui "[m
[31m-                      "with incorrect dependency", h2c->state.sid);[m
[31m-[m
[31m-        node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);[m
[31m-[m
[31m-        if (node && node->stream) {[m
[31m-            if (ngx_http_v2_terminate_stream(h2c, node->stream,[m
[31m-                                             NGX_HTTP_V2_PROTOCOL_ERROR)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid,[m
[31m-                                            NGX_HTTP_V2_PROTOCOL_ERROR)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 1);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    node->weight = weight;[m
[31m-[m
[31m-    if (node->stream == NULL) {[m
[31m-        if (node->parent == NULL) {[m
[31m-            h2c->closed_nodes++;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_queue_remove(&node->reuse);[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_insert_tail(&h2c->closed, &node->reuse);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_set_dependency(h2c, node, depend, excl);[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_rst_stream(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_uint_t             status;[m
[31m-    ngx_event_t           *ev;[m
[31m-    ngx_connection_t      *fc;[m
[31m-    ngx_http_v2_node_t    *node;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    if (h2c->state.length != NGX_HTTP_V2_RST_STREAM_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent RST_STREAM frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_RST_STREAM_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_rst_stream);[m
[31m-    }[m
[31m-[m
[31m-    status = ngx_http_v2_parse_uint32(pos);[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_RST_STREAM_SIZE;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 RST_STREAM frame, sid:%ui status:%ui",[m
[31m-                   h2c->state.sid, status);[m
[31m-[m
[31m-    if (h2c->state.sid == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent RST_STREAM frame with incorrect identifier");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);[m
[31m-[m
[31m-    if (node == NULL || node->stream == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                        "unknown http2 stream");[m
[31m-[m
[31m-        return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    stream = node->stream;[m
[31m-[m
[31m-    stream->in_closed = 1;[m
[31m-    stream->out_closed = 1;[m
[31m-[m
[31m-    fc = stream->request->connection;[m
[31m-    fc->error = 1;[m
[31m-[m
[31m-    switch (status) {[m
[31m-[m
[31m-    case NGX_HTTP_V2_CANCEL:[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                      "client canceled stream %ui", h2c->state.sid);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_V2_INTERNAL_ERROR:[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                      "client terminated stream %ui due to internal error",[m
[31m-                      h2c->state.sid);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                      "client terminated stream %ui with status %ui",[m
[31m-                      h2c->state.sid, status);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ev = fc->read;[m
[31m-    ev->handler(ev);[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    if (h2c->state.flags == NGX_HTTP_V2_ACK_FLAG) {[m
[31m-[m
[31m-        if (h2c->state.length != 0) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent SETTINGS frame with the ACK flag "[m
[31m-                          "and nonzero length");[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->settings_ack = 1;[m
[31m-[m
[31m-        return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length % NGX_HTTP_V2_SETTINGS_PARAM_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent SETTINGS frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_send_settings(h2c, 1);[m
[31m-[m
[31m-    return ngx_http_v2_state_settings_params(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_uint_t  id, value;[m
[31m-[m
[31m-    while (h2c->state.length) {[m
[31m-        if (end - pos < NGX_HTTP_V2_SETTINGS_PARAM_SIZE) {[m
[31m-            return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                          ngx_http_v2_state_settings_params);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.length -= NGX_HTTP_V2_SETTINGS_PARAM_SIZE;[m
[31m-[m
[31m-        id = ngx_http_v2_parse_uint16(pos);[m
[31m-        value = ngx_http_v2_parse_uint32(&pos[2]);[m
[31m-[m
[31m-        switch (id) {[m
[31m-[m
[31m-        case NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING:[m
[31m-[m
[31m-            if (value > NGX_HTTP_V2_MAX_WINDOW) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                              "client sent SETTINGS frame with incorrect "[m
[31m-                              "INITIAL_WINDOW_SIZE value %ui", value);[m
[31m-[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                  NGX_HTTP_V2_FLOW_CTRL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_v2_adjust_windows(h2c, value - h2c->init_window)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            h2c->init_window = value;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING:[m
[31m-            if (value > NGX_HTTP_V2_MAX_FRAME_SIZE[m
[31m-                || value < NGX_HTTP_V2_DEFAULT_FRAME_SIZE)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                              "client sent SETTINGS frame with incorrect "[m
[31m-                              "MAX_FRAME_SIZE value %ui", value);[m
[31m-[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            h2c->frame_size = value;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        pos += NGX_HTTP_V2_SETTINGS_PARAM_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_push_promise(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                  "client sent PUSH_PROMISE frame");[m
[31m-[m
[31m-    return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_ping(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    if (h2c->state.length != NGX_HTTP_V2_PING_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent PING frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_PING_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_ping);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 PING frame, flags: %ud", h2c->state.flags);[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_ACK_FLAG) {[m
[31m-        return ngx_http_v2_state_skip(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_PING_SIZE,[m
[31m-                                  NGX_HTTP_V2_PING_FRAME,[m
[31m-                                  NGX_HTTP_V2_ACK_FLAG, 0);[m
[31m-    if (frame == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    buf->last = ngx_cpymem(buf->last, pos, NGX_HTTP_V2_PING_SIZE);[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos + NGX_HTTP_V2_PING_SIZE, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_goaway(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_uint_t  last_sid, error;[m
[31m-#endif[m
[31m-[m
[31m-    if (h2c->state.length < NGX_HTTP_V2_GOAWAY_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent GOAWAY frame "[m
[31m-                      "with incorrect length %uz", h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_GOAWAY_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_goaway);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    h2c->state.length -= NGX_HTTP_V2_GOAWAY_SIZE;[m
[31m-[m
[31m-    last_sid = ngx_http_v2_parse_sid(pos);[m
[31m-    error = ngx_http_v2_parse_uint32(&pos[4]);[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_GOAWAY_SIZE;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 GOAWAY frame: last sid %ui, error %ui",[m
[31m-                   last_sid, error);[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_http_v2_state_skip(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                 window;[m
[31m-    ngx_event_t           *wev;[m
[31m-    ngx_queue_t           *q;[m
[31m-    ngx_http_v2_node_t    *node;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    if (h2c->state.length != NGX_HTTP_V2_WINDOW_UPDATE_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent WINDOW_UPDATE frame "[m
[31m-                      "with incorrect length %uz", h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_WINDOW_UPDATE_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_window_update);[m
[31m-    }[m
[31m-[m
[31m-    window = ngx_http_v2_parse_window(pos);[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_WINDOW_UPDATE_SIZE;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 WINDOW_UPDATE frame sid:%ui window:%uz",[m
[31m-                   h2c->state.sid, window);[m
[31m-[m
[31m-    if (h2c->state.sid) {[m
[31m-        node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);[m
[31m-[m
[31m-        if (node == NULL || node->stream == NULL) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "unknown http2 stream");[m
[31m-[m
[31m-            return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-        }[m
[31m-[m
[31m-        stream = node->stream;[m
[31m-[m
[31m-        if (window > (size_t) (NGX_HTTP_V2_MAX_WINDOW - stream->send_window)) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client violated flow control for stream %ui: "[m
[31m-                          "received WINDOW_UPDATE frame "[m
[31m-                          "with window increment %uz "[m
[31m-                          "not allowed for window %z",[m
[31m-                          h2c->state.sid, window, stream->send_window);[m
[31m-[m
[31m-            if (ngx_http_v2_terminate_stream(h2c, stream,[m
[31m-                                             NGX_HTTP_V2_FLOW_CTRL_ERROR)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-        }[m
[31m-[m
[31m-        stream->send_window += window;[m
[31m-[m
[31m-        if (stream->exhausted) {[m
[31m-            stream->exhausted = 0;[m
[31m-[m
[31m-            wev = stream->request->connection->write;[m
[31m-[m
[31m-            wev->active = 0;[m
[31m-            wev->ready = 1;[m
[31m-[m
[31m-            if (!wev->delayed) {[m
[31m-                wev->handler(wev);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (window > NGX_HTTP_V2_MAX_WINDOW - h2c->send_window) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client violated connection flow control: "[m
[31m-                      "received WINDOW_UPDATE frame "[m
[31m-                      "with window increment %uz "[m
[31m-                      "not allowed for window %uz",[m
[31m-                      window, h2c->send_window);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_FLOW_CTRL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->send_window += window;[m
[31m-[m
[31m-    while (!ngx_queue_empty(&h2c->waiting)) {[m
[31m-        q = ngx_queue_head(&h2c->waiting);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);[m
[31m-[m
[31m-        stream->handled = 0;[m
[31m-[m
[31m-        wev = stream->request->connection->write;[m
[31m-[m
[31m-        wev->active = 0;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            wev->handler(wev);[m
[31m-[m
[31m-            if (h2c->send_window == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_continuation(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                  "client sent unexpected CONTINUATION frame");[m
[31m-[m
[31m-    return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_complete(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 frame complete pos:%p end:%p", pos, end);[m
[31m-[m
[31m-    if (pos > end) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,[m
[31m-                      "receive buffer overrun");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.stream = NULL;[m
[31m-    h2c->state.handler = ngx_http_v2_state_head;[m
[31m-[m
[31m-    return pos;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_skip_padded(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    h2c->state.length += h2c->state.padding;[m
[31m-    h2c->state.padding = 0;[m
[31m-[m
[31m-    return ngx_http_v2_state_skip(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_skip(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size < h2c->state.length) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "http2 frame skip %uz of %uz", size, h2c->state.length);[m
[31m-[m
[31m-        h2c->state.length -= size;[m
[31m-        return ngx_http_v2_state_save(h2c, end, end, ngx_http_v2_state_skip);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 frame skip %uz", h2c->state.length);[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos + h2c->state.length, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_save(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end,[m
[31m-    ngx_http_v2_handler_pt handler)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 frame state save pos:%p end:%p handler:%p",[m
[31m-                   pos, end, handler);[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size > NGX_HTTP_V2_STATE_BUFFER_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,[m
[31m-                      "state buffer overflow: %uz bytes required", size);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(h2c->state.buffer, pos, NGX_HTTP_V2_STATE_BUFFER_SIZE);[m
[31m-[m
[31m-    h2c->state.buffer_used = size;[m
[31m-    h2c->state.handler = handler;[m
[31m-    h2c->state.incomplete = 1;[m
[31m-[m
[31m-    return end;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_headers_save(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end, ngx_http_v2_handler_pt handler)[m
[31m-{[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (h2c->state.stream) {[m
[31m-        r = h2c->state.stream->request;[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if (!rev->timer_set) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(rev, cscf->client_header_timeout);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_save(h2c, pos, end, handler);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_connection_error(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t err)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 state connection error");[m
[31m-[m
[31m-    if (err == NGX_HTTP_V2_INTERNAL_ERROR) {[m
[31m-        ngx_debug_point();[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_finalize_connection(h2c, err);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_int(ngx_http_v2_connection_t *h2c, u_char **pos, u_char *end,[m
[31m-    ngx_uint_t prefix)[m
[31m-{[m
[31m-    u_char      *start, *p;[m
[31m-    ngx_uint_t   value, octet, shift;[m
[31m-[m
[31m-    start = *pos;[m
[31m-    p = start;[m
[31m-[m
[31m-    value = *p++ & prefix;[m
[31m-[m
[31m-    if (value != prefix) {[m
[31m-        if (h2c->state.length == 0) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.length--;[m
[31m-[m
[31m-        *pos = p;[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    if (end - start > NGX_HTTP_V2_INT_OCTETS) {[m
[31m-        end = start + NGX_HTTP_V2_INT_OCTETS;[m
[31m-    }[m
[31m-[m
[31m-    for (shift = 0; p != end; shift += 7) {[m
[31m-        octet = *p++;[m
[31m-[m
[31m-        value += (octet & 0x7f) << shift;[m
[31m-[m
[31m-        if (octet < 128) {[m
[31m-            if ((size_t) (p - start) > h2c->state.length) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h2c->state.length -= p - start;[m
[31m-[m
[31m-            *pos = p;[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (end - start) >= h2c->state.length) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (end == start + NGX_HTTP_V2_INT_OCTETS) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_send_settings(ngx_http_v2_connection_t *h2c, ngx_uint_t ack)[m
[31m-{[m
[31m-    size_t                    len;[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_chain_t              *cl;[m
[31m-    ngx_http_v2_srv_conf_t   *h2scf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 send SETTINGS frame ack:%ui", ack);[m
[31m-[m
[31m-    frame = ngx_palloc(h2c->pool, sizeof(ngx_http_v2_out_frame_t));[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(h2c->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = ack ? 0 : (sizeof(uint16_t) + sizeof(uint32_t)) * 3;[m
[31m-[m
[31m-    buf = ngx_create_temp_buf(h2c->pool, NGX_HTTP_V2_FRAME_HEADER_SIZE + len);[m
[31m-    if (buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf->last_buf = 1;[m
[31m-[m
[31m-    cl->buf = buf;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    frame->first = cl;[m
[31m-    frame->last = cl;[m
[31m-    frame->handler = ngx_http_v2_settings_frame_handler;[m
[31m-    frame->stream = NULL;[m
[31m-#if (NGX_DEBUG)[m
[31m-    frame->length = len;[m
[31m-#endif[m
[31m-    frame->blocked = 0;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_len_and_type(buf->last, len,[m
[31m-                                               NGX_HTTP_V2_SETTINGS_FRAME);[m
[31m-[m
[31m-    *buf->last++ = ack ? NGX_HTTP_V2_ACK_FLAG : NGX_HTTP_V2_NO_FLAG;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_sid(buf->last, 0);[m
[31m-[m
[31m-    if (!ack) {[m
[31m-        h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                             ngx_http_v2_module);[m
[31m-[m
[31m-        buf->last = ngx_http_v2_write_uint16(buf->last,[m
[31m-                                             NGX_HTTP_V2_MAX_STREAMS_SETTING);[m
[31m-        buf->last = ngx_http_v2_write_uint32(buf->last,[m
[31m-                                             h2scf->concurrent_streams);[m
[31m-[m
[31m-        buf->last = ngx_http_v2_write_uint16(buf->last,[m
[31m-                                         NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING);[m
[31m-        buf->last = ngx_http_v2_write_uint32(buf->last,[m
[31m-                                             NGX_HTTP_V2_INITIAL_WINDOW);[m
[31m-[m
[31m-        buf->last = ngx_http_v2_write_uint16(buf->last,[m
[31m-                                           NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING);[m
[31m-        buf->last = ngx_http_v2_write_uint32(buf->last,[m
[31m-                                             NGX_HTTP_V2_MAX_FRAME_SIZE);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_settings_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_buf_t  *buf;[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    if (buf->pos != buf->last) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free_chain(h2c->pool, frame->first);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_send_window_update(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,[m
[31m-    size_t window)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 send WINDOW_UPDATE frame sid:%ui, window:%uz",[m
[31m-                   sid, window);[m
[31m-[m
[31m-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_WINDOW_UPDATE_SIZE,[m
[31m-                                  NGX_HTTP_V2_WINDOW_UPDATE_FRAME,[m
[31m-                                  NGX_HTTP_V2_NO_FLAG, sid);[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_uint32(buf->last, window);[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,[m
[31m-    ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 send RST_STREAM frame sid:%ui, status:%uz",[m
[31m-                   sid, status);[m
[31m-[m
[31m-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_RST_STREAM_SIZE,[m
[31m-                                  NGX_HTTP_V2_RST_STREAM_FRAME,[m
[31m-                                  NGX_HTTP_V2_NO_FLAG, sid);[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_uint32(buf->last, status);[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_send_goaway(ngx_http_v2_connection_t *h2c, ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 send GOAWAY frame, status:%uz", status);[m
[31m-[m
[31m-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_GOAWAY_SIZE,[m
[31m-                                  NGX_HTTP_V2_GOAWAY_FRAME,[m
[31m-                                  NGX_HTTP_V2_NO_FLAG, 0);[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_sid(buf->last, h2c->last_sid);[m
[31m-    buf->last = ngx_http_v2_write_uint32(buf->last, status);[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_out_frame_t *[m
[31m-ngx_http_v2_get_frame(ngx_http_v2_connection_t *h2c, size_t length,[m
[31m-    ngx_uint_t type, u_char flags, ngx_uint_t sid)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_pool_t               *pool;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    frame = h2c->free_frames;[m
[31m-[m
[31m-    if (frame) {[m
[31m-        h2c->free_frames = frame->next;[m
[31m-[m
[31m-        buf = frame->first->buf;[m
[31m-        buf->pos = buf->start;[m
[31m-[m
[31m-        frame->blocked = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        pool = h2c->pool ? h2c->pool : h2c->connection->pool;[m
[31m-[m
[31m-        frame = ngx_pcalloc(pool, sizeof(ngx_http_v2_out_frame_t));[m
[31m-        if (frame == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        frame->first = ngx_alloc_chain_link(pool);[m
[31m-        if (frame->first == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        buf = ngx_create_temp_buf(pool, NGX_HTTP_V2_FRAME_BUFFER_SIZE);[m
[31m-        if (buf == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        buf->last_buf = 1;[m
[31m-[m
[31m-        frame->first->buf = buf;[m
[31m-        frame->last = frame->first;[m
[31m-[m
[31m-        frame->handler = ngx_http_v2_frame_handler;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    if (length > NGX_HTTP_V2_FRAME_BUFFER_SIZE - NGX_HTTP_V2_FRAME_HEADER_SIZE)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,[m
[31m-                      "requested control frame is too large: %uz", length);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    frame->length = length;[m
[31m-#endif[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_len_and_type(buf->pos, length, type);[m
[31m-[m
[31m-    *buf->last++ = flags;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_sid(buf->last, sid);[m
[31m-[m
[31m-    return frame;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_buf_t  *buf;[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    if (buf->pos != buf->last) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    frame->next = h2c->free_frames;[m
[31m-    h2c->free_frames = frame;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_stream_t *[m
[31m-ngx_http_v2_create_stream(ngx_http_v2_connection_t *h2c)[m
[31m-{[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_log_ctx_t        *ctx;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    fc = h2c->free_fake_connections;[m
[31m-[m
[31m-    if (fc) {[m
[31m-        h2c->free_fake_connections = fc->data;[m
[31m-[m
[31m-        rev = fc->read;[m
[31m-        wev = fc->write;[m
[31m-        log = fc->log;[m
[31m-        ctx = log->data;[m
[31m-[m
[31m-    } else {[m
[31m-        fc = ngx_palloc(h2c->pool, sizeof(ngx_connection_t));[m
[31m-        if (fc == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        rev = ngx_palloc(h2c->pool, sizeof(ngx_event_t));[m
[31m-        if (rev == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        wev = ngx_palloc(h2c->pool, sizeof(ngx_event_t));[m
[31m-        if (wev == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        log = ngx_palloc(h2c->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ctx = ngx_palloc(h2c->pool, sizeof(ngx_http_log_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ctx->connection = fc;[m
[31m-        ctx->request = NULL;[m
[31m-        ctx->current_request = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(log, h2c->connection->log, sizeof(ngx_log_t));[m
[31m-[m
[31m-    log->data = ctx;[m
[31m-    log->action = "reading client request headers";[m
[31m-[m
[31m-    ngx_memzero(rev, sizeof(ngx_event_t));[m
[31m-[m
[31m-    rev->data = fc;[m
[31m-    rev->ready = 1;[m
[31m-    rev->handler = ngx_http_v2_close_stream_handler;[m
[31m-    rev->log = log;[m
[31m-[m
[31m-    ngx_memcpy(wev, rev, sizeof(ngx_event_t));[m
[31m-[m
[31m-    wev->write = 1;[m
[31m-[m
[31m-    ngx_memcpy(fc, h2c->connection, sizeof(ngx_connection_t));[m
[31m-[m
[31m-    fc->data = h2c->http_connection;[m
[31m-    fc->read = rev;[m
[31m-    fc->write = wev;[m
[31m-    fc->sent = 0;[m
[31m-    fc->log = log;[m
[31m-    fc->buffered = 0;[m
[31m-    fc->sndlowat = 1;[m
[31m-    fc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;[m
[31m-[m
[31m-    r = ngx_http_create_request(fc);[m
[31m-    if (r == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&r->http_protocol, "HTTP/2.0");[m
[31m-[m
[31m-    r->http_version = NGX_HTTP_VERSION_20;[m
[31m-    r->valid_location = 1;[m
[31m-[m
[31m-    fc->data = r;[m
[31m-    h2c->connection->requests++;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    r->header_in = ngx_create_temp_buf(r->pool,[m
[31m-                                       cscf->client_header_buffer_size);[m
[31m-    if (r->header_in == NULL) {[m
[31m-        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-[m
[31m-    stream = ngx_pcalloc(r->pool, sizeof(ngx_http_v2_stream_t));[m
[31m-    if (stream == NULL) {[m
[31m-        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->stream = stream;[m
[31m-[m
[31m-    stream->request = r;[m
[31m-    stream->connection = h2c;[m
[31m-[m
[31m-    stream->send_window = h2c->init_window;[m
[31m-    stream->recv_window = NGX_HTTP_V2_INITIAL_WINDOW;[m
[31m-[m
[31m-    h2c->processing++;[m
[31m-[m
[31m-    return stream;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_node_t *[m
[31m-ngx_http_v2_get_node_by_id(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,[m
[31m-    ngx_uint_t alloc)[m
[31m-{[m
[31m-    ngx_uint_t               index;[m
[31m-    ngx_http_v2_node_t      *node;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    index = ngx_http_v2_index(h2scf, sid);[m
[31m-[m
[31m-    for (node = h2c->streams_index[index]; node; node = node->index) {[m
[31m-[m
[31m-        if (node->id == sid) {[m
[31m-            return node;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!alloc) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->closed_nodes < 32) {[m
[31m-        node = ngx_pcalloc(h2c->connection->pool, sizeof(ngx_http_v2_node_t));[m
[31m-        if (node == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        node = ngx_http_v2_get_closed_node(h2c);[m
[31m-    }[m
[31m-[m
[31m-    node->id = sid;[m
[31m-[m
[31m-    ngx_queue_init(&node->children);[m
[31m-[m
[31m-    node->index = h2c->streams_index[index];[m
[31m-    h2c->streams_index[index] = node;[m
[31m-[m
[31m-    return node;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_node_t *[m
[31m-ngx_http_v2_get_closed_node(ngx_http_v2_connection_t *h2c)[m
[31m-{[m
[31m-    ngx_uint_t               weight;[m
[31m-    ngx_queue_t             *q, *children;[m
[31m-    ngx_http_v2_node_t      *node, **next, *n, *parent, *child;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    h2c->closed_nodes--;[m
[31m-[m
[31m-    q = ngx_queue_head(&h2c->closed);[m
[31m-[m
[31m-    ngx_queue_remove(q);[m
[31m-[m
[31m-    node = ngx_queue_data(q, ngx_http_v2_node_t, reuse);[m
[31m-[m
[31m-    next = &h2c->streams_index[ngx_http_v2_index(h2scf, node->id)];[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = *next;[m
[31m-[m
[31m-        if (n == node) {[m
[31m-            *next = n->index;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        next = &n->index;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(&node->queue);[m
[31m-[m
[31m-    weight = 0;[m
[31m-[m
[31m-    for (q = ngx_queue_head(&node->children);[m
[31m-         q != ngx_queue_sentinel(&node->children);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);[m
[31m-        weight += child->weight;[m
[31m-    }[m
[31m-[m
[31m-    parent = node->parent;[m
[31m-[m
[31m-    for (q = ngx_queue_head(&node->children);[m
[31m-         q != ngx_queue_sentinel(&node->children);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);[m
[31m-        child->parent = parent;[m
[31m-        child->weight = node->weight * child->weight / weight;[m
[31m-[m
[31m-        if (child->weight == 0) {[m
[31m-            child->weight = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (parent == NGX_HTTP_V2_ROOT) {[m
[31m-        node->rank = 0;[m
[31m-        node->rel_weight = 1.0;[m
[31m-[m
[31m-        children = &h2c->dependencies;[m
[31m-[m
[31m-    } else {[m
[31m-        node->rank = parent->rank;[m
[31m-        node->rel_weight = parent->rel_weight;[m
[31m-[m
[31m-        children = &parent->children;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_node_children_update(node);[m
[31m-    ngx_queue_add(children, &node->children);[m
[31m-[m
[31m-    ngx_memzero(node, sizeof(ngx_http_v2_node_t));[m
[31m-[m
[31m-    return node;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_validate_header(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    u_char                     ch;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (header->name.len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->invalid_header = 0;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    for (i = (header->name.data[0] == ':'); i != header->name.len; i++) {[m
[31m-        ch = header->name.data[i];[m
[31m-[m
[31m-        if ((ch >= 'a' && ch <= 'z')[m
[31m-            || (ch == '-')[m
[31m-            || (ch >= '0' && ch <= '9')[m
[31m-            || (ch == '_' && cscf->underscores_in_headers))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (ch) {[m
[31m-        case '\0':[m
[31m-        case LF:[m
[31m-        case CR:[m
[31m-        case ':':[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid header name: \"%V\"",[m
[31m-                          &header->name);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ch >= 'A' && ch <= 'Z') {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid header name: \"%V\"",[m
[31m-                          &header->name);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->invalid_header = 1;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i != header->value.len; i++) {[m
[31m-        ch = header->value.data[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-        case '\0':[m
[31m-        case LF:[m
[31m-        case CR:[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent header \"%V\" with "[m
[31m-                          "invalid value: \"%V\"",[m
[31m-                          &header->name, &header->value);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_pseudo_header(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    header->name.len--;[m
[31m-    header->name.data++;[m
[31m-[m
[31m-    switch (header->name.len) {[m
[31m-    case 4:[m
[31m-        if (ngx_memcmp(header->name.data, "path", sizeof("path") - 1)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            return ngx_http_v2_parse_path(r, header);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case 6:[m
[31m-        if (ngx_memcmp(header->name.data, "method", sizeof("method") - 1)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            return ngx_http_v2_parse_method(r, header);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_memcmp(header->name.data, "scheme", sizeof("scheme") - 1)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            return ngx_http_v2_parse_scheme(r, header);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case 9:[m
[31m-        if (ngx_memcmp(header->name.data, "authority", sizeof("authority") - 1)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            return ngx_http_v2_parse_authority(r, header);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                  "client sent unknown pseudo header \"%V\"",[m
[31m-                  &header->name);[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_path(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    if (r->unparsed_uri.len) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent duplicate :path header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (header->value.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent empty :path header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->uri_start = header->value.data;[m
[31m-    r->uri_end = header->value.data + header->value.len;[m
[31m-[m
[31m-    if (ngx_http_parse_uri(r) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent invalid :path header: \"%V\"",[m
[31m-                      &header->value);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_process_request_uri(r) != NGX_OK) {[m
[31m-        /*[m
[31m-         * request has been finalized already[m
[31m-         * in ngx_http_process_request_uri()[m
[31m-         */[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_method(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    size_t         k, len;[m
[31m-    ngx_uint_t     n;[m
[31m-    const u_char  *p, *m;[m
[31m-[m
[31m-    /*[m
[31m-     * This array takes less than 256 sequential bytes,[m
[31m-     * and if typical CPU cache line size is 64 bytes,[m
[31m-     * it is prefetched for 4 load operations.[m
[31m-     */[m
[31m-    static const struct {[m
[31m-        u_char            len;[m
[31m-        const u_char      method[11];[m
[31m-        uint32_t          value;[m
[31m-    } tests[] = {[m
[31m-        { 3, "GET",       NGX_HTTP_GET },[m
[31m-        { 4, "POST",      NGX_HTTP_POST },[m
[31m-        { 4, "HEAD",      NGX_HTTP_HEAD },[m
[31m-        { 7, "OPTIONS",   NGX_HTTP_OPTIONS },[m
[31m-        { 8, "PROPFIND",  NGX_HTTP_PROPFIND },[m
[31m-        { 3, "PUT",       NGX_HTTP_PUT },[m
[31m-        { 5, "MKCOL",     NGX_HTTP_MKCOL },[m
[31m-        { 6, "DELETE",    NGX_HTTP_DELETE },[m
[31m-        { 4, "COPY",      NGX_HTTP_COPY },[m
[31m-        { 4, "MOVE",      NGX_HTTP_MOVE },[m
[31m-        { 9, "PROPPATCH", NGX_HTTP_PROPPATCH },[m
[31m-        { 4, "LOCK",      NGX_HTTP_LOCK },[m
[31m-        { 6, "UNLOCK",    NGX_HTTP_UNLOCK },[m
[31m-        { 5, "PATCH",     NGX_HTTP_PATCH },[m
[31m-        { 5, "TRACE",     NGX_HTTP_TRACE }[m
[31m-    }, *test;[m
[31m-[m
[31m-    if (r->method_name.len) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent duplicate :method header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (header->value.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent empty :method header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->method_name.len = header->value.len;[m
[31m-    r->method_name.data = header->value.data;[m
[31m-[m
[31m-    len = r->method_name.len;[m
[31m-    n = sizeof(tests) / sizeof(tests[0]);[m
[31m-    test = tests;[m
[31m-[m
[31m-    do {[m
[31m-        if (len == test->len) {[m
[31m-            p = r->method_name.data;[m
[31m-            m = test->method;[m
[31m-            k = len;[m
[31m-[m
[31m-            do {[m
[31m-                if (*p++ != *m++) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            } while (--k);[m
[31m-[m
[31m-            r->method = test->value;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-        test++;[m
[31m-[m
[31m-    } while (--n);[m
[31m-[m
[31m-    p = r->method_name.data;[m
[31m-[m
[31m-    do {[m
[31m-        if ((*p < 'A' || *p > 'Z') && *p != '_') {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid method: \"%V\"",[m
[31m-                          &r->method_name);[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-[m
[31m-    } while (--len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_scheme(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    if (r->schema_start) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent duplicate :schema header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (header->value.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent empty :schema header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->schema_start = header->value.data;[m
[31m-    r->schema_end = header->value.data + header->value.len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_authority(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    static ngx_str_t host = ngx_string("host");[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = ngx_hash_key(host.data, host.len);[m
[31m-[m
[31m-    h->key.len = host.len;[m
[31m-    h->key.data = host.data;[m
[31m-[m
[31m-    h->value.len = header->value.len;[m
[31m-    h->value.data = header->value.data;[m
[31m-[m
[31m-    h->lowcase_key = host.data;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                       h->lowcase_key, h->key.len);[m
[31m-[m
[31m-    if (hh == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-        /*[m
[31m-         * request has been finalized already[m
[31m-         * in ngx_http_process_host()[m
[31m-         */[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_construct_request_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    static const u_char ending[] = " HTTP/2.0";[m
[31m-[m
[31m-    if (r->method_name.len == 0[m
[31m-        || r->unparsed_uri.len == 0)[m
[31m-    {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->request_line.len = r->method_name.len + 1[m
[31m-                          + r->unparsed_uri.len[m
[31m-                          + sizeof(ending) - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, r->request_line.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->request_line.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, r->method_name.data, r->method_name.len);[m
[31m-[m
[31m-    *p++ = ' ';[m
[31m-[m
[31m-    p = ngx_cpymem(p, r->unparsed_uri.data, r->unparsed_uri.len);[m
[31m-[m
[31m-    ngx_memcpy(p, ending, sizeof(ending));[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http2 http request line: \"%V\"", &r->request_line);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_cookie(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    ngx_str_t    *val;[m
[31m-    ngx_array_t  *cookies;[m
[31m-[m
[31m-    cookies = r->stream->cookies;[m
[31m-[m
[31m-    if (cookies == NULL) {[m
[31m-        cookies = ngx_array_create(r->pool, 2, sizeof(ngx_str_t));[m
[31m-        if (cookies == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->stream->cookies = cookies;[m
[31m-    }[m
[31m-[m
[31m-    val = ngx_array_push(cookies);[m
[31m-    if (val == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    val->len = header->value.len;[m
[31m-    val->data = header->value.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_construct_cookie_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                     *buf, *p, *end;[m
[31m-    size_t                      len;[m
[31m-    ngx_str_t                  *vals;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_array_t                *cookies;[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    static ngx_str_t cookie = ngx_string("cookie");[m
[31m-[m
[31m-    cookies = r->stream->cookies;[m
[31m-[m
[31m-    if (cookies == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    vals = cookies->elts;[m
[31m-[m
[31m-    i = 0;[m
[31m-    len = 0;[m
[31m-[m
[31m-    do {[m
[31m-        len += vals[i].len + 2;[m
[31m-    } while (++i != cookies->nelts);[m
[31m-[m
[31m-    len -= 2;[m
[31m-[m
[31m-    buf = ngx_pnalloc(r->pool, len + 1);[m
[31m-    if (buf == NULL) {[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = buf;[m
[31m-    end = buf + len;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        p = ngx_cpymem(p, vals[i].data, vals[i].len);[m
[31m-[m
[31m-        if (p == end) {[m
[31m-            *p = '\0';[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        *p++ = ';'; *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = ngx_hash_key(cookie.data, cookie.len);[m
[31m-[m
[31m-    h->key.len = cookie.len;[m
[31m-    h->key.data = cookie.data;[m
[31m-[m
[31m-    h->value.len = len;[m
[31m-    h->value.data = buf;[m
[31m-[m
[31m-    h->lowcase_key = cookie.data;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                       h->lowcase_key, h->key.len);[m
[31m-[m
[31m-    if (hh == NULL) {[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-        /*[m
[31m-         * request has been finalized already[m
[31m-         * in ngx_http_process_multi_header_lines()[m
[31m-         */[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_run_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (ngx_http_v2_construct_request_line(r) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_construct_cookie_header(r) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;[m
[31m-[m
[31m-    if (ngx_http_process_request_header(r) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length_n > 0 && r->stream->in_closed) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client prematurely closed stream");[m
[31m-[m
[31m-        r->stream->skip_data = 1;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.chunked = (r->headers_in.content_length_n == -1);[m
[31m-[m
[31m-    ngx_http_process_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_read_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler)[m
[31m-{[m
[31m-    off_t                      len;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    stream = r->stream;[m
[31m-[m
[31m-    if (stream->skip_data) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (rb == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     rb->bufs = NULL;[m
[31m-     *     rb->buf = NULL;[m
[31m-     *     rb->received = 0;[m
[31m-     *     rb->free = NULL;[m
[31m-     *     rb->busy = NULL;[m
[31m-     */[m
[31m-[m
[31m-    rb->rest = 1;[m
[31m-    rb->post_handler = post_handler;[m
[31m-[m
[31m-    r->request_body = rb;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    len = r->headers_in.content_length_n;[m
[31m-[m
[31m-    if (r->request_body_no_buffering && !stream->in_closed) {[m
[31m-        r->request_body_in_file_only = 0;[m
[31m-[m
[31m-        if (len < 0 || len > (off_t) clcf->client_body_buffer_size) {[m
[31m-            len = clcf->client_body_buffer_size;[m
[31m-        }[m
[31m-[m
[31m-        if (len > NGX_HTTP_V2_MAX_WINDOW) {[m
[31m-            len = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len >= 0 && len <= (off_t) clcf->client_body_buffer_size[m
[31m-        && !r->request_body_in_file_only)[m
[31m-    {[m
[31m-        rb->buf = ngx_create_temp_buf(r->pool, (size_t) len);[m
[31m-[m
[31m-    } else {[m
[31m-        rb->buf = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-        if (rb->buf != NULL) {[m
[31m-            rb->buf->sync = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->buf == NULL) {[m
[31m-        stream->skip_data = 1;[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (stream->in_closed) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        return ngx_http_v2_process_request_body(r, NULL, 0, 1);[m
[31m-    }[m
[31m-[m
[31m-    if (len) {[m
[31m-        if (r->request_body_no_buffering) {[m
[31m-            stream->recv_window = (size_t) len;[m
[31m-[m
[31m-        } else {[m
[31m-            stream->no_flow_control = 1;[m
[31m-            stream->recv_window = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_v2_send_window_update(stream->connection, stream->node->id,[m
[31m-                                           stream->recv_window)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            stream->skip_data = 1;[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c = stream->connection;[m
[31m-[m
[31m-        if (!h2c->blocked) {[m
[31m-            if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {[m
[31m-                stream->skip_data = 1;[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(r->connection->read, clcf->client_body_timeout);[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_v2_read_client_request_body_handler;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_process_request_body(ngx_http_request_t *r, u_char *pos,[m
[31m-    size_t size, ngx_uint_t last)[m
[31m-{[m
[31m-    ngx_buf_t                 *buf;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    fc = r->connection;[m
[31m-    buf = rb->buf;[m
[31m-[m
[31m-    if (size) {[m
[31m-        if (buf->sync) {[m
[31m-            buf->pos = buf->start = pos;[m
[31m-            buf->last = buf->end = pos + size;[m
[31m-[m
[31m-        } else {[m
[31m-            if (size > (size_t) (buf->end - buf->last)) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                                "client intended to send body data "[m
[31m-                                "larger than declared");[m
[31m-[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_cpymem(buf->last, pos, size);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        rb->rest = 0;[m
[31m-[m
[31m-        if (fc->read->timer_set) {[m
[31m-            ngx_del_timer(fc->read);[m
[31m-        }[m
[31m-[m
[31m-        if (r->request_body_no_buffering) {[m
[31m-            ngx_post_event(fc->read, &ngx_posted_events);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_v2_filter_request_body(r);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (buf->sync) {[m
[31m-            /* prevent reusing this buffer in the upstream module */[m
[31m-            rb->buf = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == -1) {[m
[31m-            r->headers_in.content_length_n = rb->received;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        rb->post_handler(r);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    ngx_add_timer(fc->read, clcf->client_body_timeout);[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        ngx_post_event(fc->read, &ngx_posted_events);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (buf->sync) {[m
[31m-        return ngx_http_v2_filter_request_body(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_filter_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_buf_t                 *b, *buf;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-    buf = rb->buf;[m
[31m-[m
[31m-    if (buf->pos == buf->last && rb->rest) {[m
[31m-        cl = NULL;[m
[31m-        goto update;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    if (buf->pos != buf->last) {[m
[31m-        r->request_length += buf->last - buf->pos;[m
[31m-        rb->received += buf->last - buf->pos;[m
[31m-[m
[31m-        if (r->headers_in.content_length_n != -1) {[m
[31m-            if (rb->received > r->headers_in.content_length_n) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                              "client intended to send body data "[m
[31m-                              "larger than declared");[m
[31m-[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            if (clcf->client_max_body_size[m
[31m-                && rb->received > clcf->client_max_body_size)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "client intended to send too large chunked body: "[m
[31m-                              "%O bytes", rb->received);[m
[31m-[m
[31m-                return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = buf->pos;[m
[31m-        b->last = buf->last;[m
[31m-        b->start = b->pos;[m
[31m-        b->end = b->last;[m
[31m-[m
[31m-        buf->pos = buf->last;[m
[31m-    }[m
[31m-[m
[31m-    if (!rb->rest) {[m
[31m-        if (r->headers_in.content_length_n != -1[m
[31m-            && r->headers_in.content_length_n != rb->received)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client prematurely closed stream: "[m
[31m-                          "only %O out of %O bytes of request body received",[m
[31m-                          rb->received, r->headers_in.content_length_n);[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    b->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_request_body;[m
[31m-    b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-update:[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, cl);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &cl,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_v2_filter_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_read_client_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t  *fc;[m
[31m-[m
[31m-    fc = r->connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                   "http2 read client request body handler");[m
[31m-[m
[31m-    if (fc->read->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-[m
[31m-        fc->timedout = 1;[m
[31m-        r->stream->skip_data = 1;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (fc->error) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                      "client prematurely closed stream");[m
[31m-[m
[31m-        r->stream->skip_data = 1;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_read_unbuffered_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                     window;[m
[31m-    ngx_buf_t                 *buf;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    stream = r->stream;[m
[31m-    fc = r->connection;[m
[31m-[m
[31m-    if (fc->read->timedout) {[m
[31m-        if (stream->recv_window) {[m
[31m-            stream->skip_data = 1;[m
[31m-            fc->timedout = 1;[m
[31m-[m
[31m-            return NGX_HTTP_REQUEST_TIME_OUT;[m
[31m-        }[m
[31m-[m
[31m-        fc->read->timedout = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (fc->error) {[m
[31m-        stream->skip_data = 1;[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_v2_filter_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        stream->skip_data = 1;[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body->rest) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body->busy != NULL) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    buf = r->request_body->buf;[m
[31m-[m
[31m-    buf->pos = buf->start;[m
[31m-    buf->last = buf->start;[m
[31m-[m
[31m-    window = buf->end - buf->start;[m
[31m-    h2c = stream->connection;[m
[31m-[m
[31m-    if (h2c->state.stream == stream) {[m
[31m-        window -= h2c->state.length;[m
[31m-    }[m
[31m-[m
[31m-    if (window == stream->recv_window) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_send_window_update(h2c, stream->node->id,[m
[31m-                                       window - stream->recv_window)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        stream->skip_data = 1;[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {[m
[31m-        stream->skip_data = 1;[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (stream->recv_window == 0) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-        ngx_add_timer(fc->read, clcf->client_body_timeout);[m
[31m-    }[m
[31m-[m
[31m-    stream->recv_window = window;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream, ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *fc;[m
[31m-[m
[31m-    if (ngx_http_v2_send_rst_stream(h2c, stream->node->id, status)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    stream->rst_sent = 1;[m
[31m-[m
[31m-    fc = stream->request->connection;[m
[31m-    fc->error = 1;[m
[31m-[m
[31m-    rev = fc->read;[m
[31m-    rev->handler(rev);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_pool_t                *pool;[m
[31m-    ngx_event_t               *ev;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_v2_node_t        *node;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    h2c = stream->connection;[m
[31m-    node = stream->node;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 close stream %ui, queued %ui, processing %ui",[m
[31m-                   node->id, stream->queued, h2c->processing);[m
[31m-[m
[31m-    fc = stream->request->connection;[m
[31m-[m
[31m-    if (stream->queued) {[m
[31m-        fc->write->handler = ngx_http_v2_close_stream_handler;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!stream->rst_sent && !h2c->connection->error) {[m
[31m-[m
[31m-        if (!stream->out_closed) {[m
[31m-            if (ngx_http_v2_send_rst_stream(h2c, node->id,[m
[31m-                                      fc->timedout ? NGX_HTTP_V2_PROTOCOL_ERROR[m
[31m-                                                   : NGX_HTTP_V2_INTERNAL_ERROR)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                h2c->connection->error = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else if (!stream->in_closed) {[m
[31m-#if 0[m
[31m-            if (ngx_http_v2_send_rst_stream(h2c, node->id, NGX_HTTP_V2_NO_ERROR)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                h2c->connection->error = 1;[m
[31m-            }[m
[31m-#else[m
[31m-            /*[m
[31m-             * At the time of writing at least the latest versions of Chrome[m
[31m-             * do not properly handle RST_STREAM with NO_ERROR status.[m
[31m-             *[m
[31m-             * See: https://bugs.chromium.org/p/chromium/issues/detail?id=603182[m
[31m-             *[m
[31m-             * As a workaround, the stream window is maximized before closing[m
[31m-             * the stream.  This allows a client to send up to 2 GB of data[m
[31m-             * before getting blocked on flow control.[m
[31m-             */[m
[31m-[m
[31m-            if (stream->recv_window < NGX_HTTP_V2_MAX_WINDOW[m
[31m-                && ngx_http_v2_send_window_update(h2c, node->id,[m
[31m-                                                  NGX_HTTP_V2_MAX_WINDOW[m
[31m-                                                  - stream->recv_window)[m
[31m-                   != NGX_OK)[m
[31m-            {[m
[31m-                h2c->connection->error = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.stream == stream) {[m
[31m-        h2c->state.stream = NULL;[m
[31m-    }[m
[31m-[m
[31m-    node->stream = NULL;[m
[31m-[m
[31m-    ngx_queue_insert_tail(&h2c->closed, &node->reuse);[m
[31m-    h2c->closed_nodes++;[m
[31m-[m
[31m-    /*[m
[31m-     * This pool keeps decoded request headers which can be used by log phase[m
[31m-     * handlers in ngx_http_free_request().[m
[31m-     *[m
[31m-     * The pointer is stored into local variable because the stream object[m
[31m-     * will be destroyed after a call to ngx_http_free_request().[m
[31m-     */[m
[31m-    pool = stream->pool;[m
[31m-[m
[31m-    ngx_http_free_request(stream->request, rc);[m
[31m-[m
[31m-    if (pool != h2c->state.pool) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-    } else {[m
[31m-        /* pool will be destroyed when the complete header is parsed */[m
[31m-        h2c->state.keep_pool = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev = fc->read;[m
[31m-[m
[31m-    if (ev->timer_set) {[m
[31m-        ngx_del_timer(ev);[m
[31m-    }[m
[31m-[m
[31m-    if (ev->posted) {[m
[31m-        ngx_delete_posted_event(ev);[m
[31m-    }[m
[31m-[m
[31m-    ev = fc->write;[m
[31m-[m
[31m-    if (ev->timer_set) {[m
[31m-        ngx_del_timer(ev);[m
[31m-    }[m
[31m-[m
[31m-    if (ev->posted) {[m
[31m-        ngx_delete_posted_event(ev);[m
[31m-    }[m
[31m-[m
[31m-    fc->data = h2c->free_fake_connections;[m
[31m-    h2c->free_fake_connections = fc;[m
[31m-[m
[31m-    h2c->processing--;[m
[31m-[m
[31m-    if (h2c->processing || h2c->blocked) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ev = h2c->connection->read;[m
[31m-[m
[31m-    ev->handler = ngx_http_v2_handle_connection_handler;[m
[31m-    ngx_post_event(ev, &ngx_posted_events);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_close_stream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *fc;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    fc = ev->data;[m
[31m-    r = fc->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                   "http2 close stream handler");[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-[m
[31m-        fc->timedout = 1;[m
[31m-[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_close_stream(r->stream, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_handle_connection_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http2 handle connection handler");[m
[31m-[m
[31m-    rev->handler = ngx_http_v2_read_handler;[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_http_v2_read_handler(rev);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    h2c = c->data;[m
[31m-[m
[31m-    if (h2c->last_out && ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_handle_connection(c->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_idle_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_srv_conf_t    *h2scf;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    h2c = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 idle handler");[m
[31m-[m
[31m-    if (rev->timedout || c->close) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        if (rev->pending_eof) {[m
[31m-            c->log->handler = NULL;[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,[m
[31m-                          "kevent() reported that client %V closed "[m
[31m-                          "idle connection", &c->addr_text);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl) {[m
[31m-                c->ssl->no_send_shutdown = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 0;[m
[31m-    c->idle = 0;[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log);[m
[31m-    if (h2c->pool == NULL) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_http_v2_write_handler;[m
[31m-[m
[31m-    rev->handler = ngx_http_v2_read_handler;[m
[31m-    ngx_http_v2_read_handler(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_uint_t               i, size;[m
[31m-    ngx_event_t             *ev;[m
[31m-    ngx_connection_t        *c, *fc;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_v2_node_t      *node;[m
[31m-    ngx_http_v2_stream_t    *stream;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    c = h2c->connection;[m
[31m-[m
[31m-    h2c->blocked = 1;[m
[31m-[m
[31m-    if (!c->error && ngx_http_v2_send_goaway(h2c, status) != NGX_ERROR) {[m
[31m-        (void) ngx_http_v2_send_output_queue(h2c);[m
[31m-    }[m
[31m-[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (h2c->state.stream) {[m
[31m-        ngx_http_v2_close_stream(h2c->state.stream, NGX_HTTP_BAD_REQUEST);[m
[31m-    }[m
[31m-[m
[31m-    if (!h2c->processing) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->read->handler = ngx_http_empty_handler;[m
[31m-    c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    h2c->last_out = NULL;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    size = ngx_http_v2_index_size(h2scf);[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-[m
[31m-        for (node = h2c->streams_index[i]; node; node = node->index) {[m
[31m-            stream = node->stream;[m
[31m-[m
[31m-            if (stream == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            stream->handled = 0;[m
[31m-[m
[31m-            r = stream->request;[m
[31m-            fc = r->connection;[m
[31m-[m
[31m-            fc->error = 1;[m
[31m-[m
[31m-            if (stream->queued) {[m
[31m-                stream->queued = 0;[m
[31m-                ev = fc->write;[m
[31m-[m
[31m-            } else {[m
[31m-                ev = fc->read;[m
[31m-            }[m
[31m-[m
[31m-            ev->eof = 1;[m
[31m-            ev->handler(ev);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    h2c->blocked = 0;[m
[31m-[m
[31m-    if (h2c->processing) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_adjust_windows(ngx_http_v2_connection_t *h2c, ssize_t delta)[m
[31m-{[m
[31m-    ngx_uint_t               i, size;[m
[31m-    ngx_event_t             *wev;[m
[31m-    ngx_http_v2_node_t      *node;[m
[31m-    ngx_http_v2_stream_t    *stream;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    size = ngx_http_v2_index_size(h2scf);[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-[m
[31m-        for (node = h2c->streams_index[i]; node; node = node->index) {[m
[31m-            stream = node->stream;[m
[31m-[m
[31m-            if (stream == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (delta > 0[m
[31m-                && stream->send_window[m
[31m-                      > (ssize_t) (NGX_HTTP_V2_MAX_WINDOW - delta))[m
[31m-            {[m
[31m-                if (ngx_http_v2_terminate_stream(h2c, stream,[m
[31m-                                                 NGX_HTTP_V2_FLOW_CTRL_ERROR)[m
[31m-                    == NGX_ERROR)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            stream->send_window += delta;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "http2:%ui adjusted window: %z",[m
[31m-                           node->id, stream->send_window);[m
[31m-[m
[31m-            if (stream->send_window > 0 && stream->exhausted) {[m
[31m-                stream->exhausted = 0;[m
[31m-[m
[31m-                wev = stream->request->connection->write;[m
[31m-[m
[31m-                wev->active = 0;[m
[31m-                wev->ready = 1;[m
[31m-[m
[31m-                if (!wev->delayed) {[m
[31m-                    wev->handler(wev);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_set_dependency(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_node_t *node, ngx_uint_t depend, ngx_uint_t exclusive)[m
[31m-{[m
[31m-    ngx_queue_t         *children, *q;[m
[31m-    ngx_http_v2_node_t  *parent, *child, *next;[m
[31m-[m
[31m-    parent = depend ? ngx_http_v2_get_node_by_id(h2c, depend, 0) : NULL;[m
[31m-[m
[31m-    if (parent == NULL) {[m
[31m-        parent = NGX_HTTP_V2_ROOT;[m
[31m-[m
[31m-        if (depend != 0) {[m
[31m-            exclusive = 0;[m
[31m-        }[m
[31m-[m
[31m-        node->rank = 1;[m
[31m-        node->rel_weight = (1.0 / 256) * node->weight;[m
[31m-[m
[31m-        children = &h2c->dependencies;[m
[31m-[m
[31m-    } else {[m
[31m-        if (node->parent != NULL) {[m
[31m-[m
[31m-            for (next = parent->parent;[m
[31m-                 next != NGX_HTTP_V2_ROOT && next->rank >= node->rank;[m
[31m-                 next = next->parent)[m
[31m-            {[m
[31m-                if (next != node) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                ngx_queue_remove(&parent->queue);[m
[31m-                ngx_queue_insert_after(&node->queue, &parent->queue);[m
[31m-[m
[31m-                parent->parent = node->parent;[m
[31m-[m
[31m-                if (node->parent == NGX_HTTP_V2_ROOT) {[m
[31m-                    parent->rank = 1;[m
[31m-                    parent->rel_weight = (1.0 / 256) * parent->weight;[m
[31m-[m
[31m-                } else {[m
[31m-                    parent->rank = node->parent->rank + 1;[m
[31m-                    parent->rel_weight = (node->parent->rel_weight / 256)[m
[31m-                                         * parent->weight;[m
[31m-                }[m
[31m-[m
[31m-                if (!exclusive) {[m
[31m-                    ngx_http_v2_node_children_update(parent);[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        node->rank = parent->rank + 1;[m
[31m-        node->rel_weight = (parent->rel_weight / 256) * node->weight;[m
[31m-[m
[31m-        if (parent->stream == NULL) {[m
[31m-            ngx_queue_remove(&parent->reuse);[m
[31m-            ngx_queue_insert_tail(&h2c->closed, &parent->reuse);[m
[31m-        }[m
[31m-[m
[31m-        children = &parent->children;[m
[31m-    }[m
[31m-[m
[31m-    if (exclusive) {[m
[31m-        for (q = ngx_queue_head(children);[m
[31m-             q != ngx_queue_sentinel(children);[m
[31m-             q = ngx_queue_next(q))[m
[31m-        {[m
[31m-            child = ngx_queue_data(q, ngx_http_v2_node_t, queue);[m
[31m-            child->parent = node;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_add(&node->children, children);[m
[31m-        ngx_queue_init(children);[m
[31m-    }[m
[31m-[m
[31m-    if (node->parent != NULL) {[m
[31m-        ngx_queue_remove(&node->queue);[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_insert_tail(children, &node->queue);[m
[31m-[m
[31m-    node->parent = parent;[m
[31m-[m
[31m-    ngx_http_v2_node_children_update(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_node_children_update(ngx_http_v2_node_t *node)[m
[31m-{[m
[31m-    ngx_queue_t         *q;[m
[31m-    ngx_http_v2_node_t  *child;[m
[31m-[m
[31m-    for (q = ngx_queue_head(&node->children);[m
[31m-         q != ngx_queue_sentinel(&node->children);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);[m
[31m-[m
[31m-        child->rank = node->rank + 1;[m
[31m-        child->rel_weight = (node->rel_weight / 256) * child->weight;[m
[31m-[m
[31m-        ngx_http_v2_node_children_update(child);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_pool_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_v2_connection_t  *h2c = data;[m
[31m-[m
[31m-    if (h2c->state.pool) {[m
[31m-        ngx_destroy_pool(h2c->state.pool);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->pool) {[m
[31m-        ngx_destroy_pool(h2c->pool);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2.h[m
[1mdeleted file mode 100644[m
[1mindex 1adf8de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2.h[m
[1m+++ /dev/null[m
[36m@@ -1,337 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_V2_H_INCLUDED_[m
[31m-#define _NGX_HTTP_V2_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_V2_ALPN_ADVERTISE       "\x02h2"[m
[31m-#define NGX_HTTP_V2_NPN_ADVERTISE        NGX_HTTP_V2_ALPN_ADVERTISE[m
[31m-[m
[31m-#define NGX_HTTP_V2_STATE_BUFFER_SIZE    16[m
[31m-[m
[31m-#define NGX_HTTP_V2_MAX_FRAME_SIZE       ((1 << 24) - 1)[m
[31m-[m
[31m-#define NGX_HTTP_V2_INT_OCTETS           4[m
[31m-#define NGX_HTTP_V2_MAX_FIELD                                                 \[m
[31m-    (127 + (1 << (NGX_HTTP_V2_INT_OCTETS - 1) * 7) - 1)[m
[31m-[m
[31m-#define NGX_HTTP_V2_FRAME_HEADER_SIZE    9[m
[31m-[m
[31m-/* frame types */[m
[31m-#define NGX_HTTP_V2_DATA_FRAME           0x0[m
[31m-#define NGX_HTTP_V2_HEADERS_FRAME        0x1[m
[31m-#define NGX_HTTP_V2_PRIORITY_FRAME       0x2[m
[31m-#define NGX_HTTP_V2_RST_STREAM_FRAME     0x3[m
[31m-#define NGX_HTTP_V2_SETTINGS_FRAME       0x4[m
[31m-#define NGX_HTTP_V2_PUSH_PROMISE_FRAME   0x5[m
[31m-#define NGX_HTTP_V2_PING_FRAME           0x6[m
[31m-#define NGX_HTTP_V2_GOAWAY_FRAME         0x7[m
[31m-#define NGX_HTTP_V2_WINDOW_UPDATE_FRAME  0x8[m
[31m-#define NGX_HTTP_V2_CONTINUATION_FRAME   0x9[m
[31m-[m
[31m-/* frame flags */[m
[31m-#define NGX_HTTP_V2_NO_FLAG              0x00[m
[31m-#define NGX_HTTP_V2_ACK_FLAG             0x01[m
[31m-#define NGX_HTTP_V2_END_STREAM_FLAG      0x01[m
[31m-#define NGX_HTTP_V2_END_HEADERS_FLAG     0x04[m
[31m-#define NGX_HTTP_V2_PADDED_FLAG          0x08[m
[31m-#define NGX_HTTP_V2_PRIORITY_FLAG        0x20[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_v2_connection_s   ngx_http_v2_connection_t;[m
[31m-typedef struct ngx_http_v2_node_s         ngx_http_v2_node_t;[m
[31m-typedef struct ngx_http_v2_out_frame_s    ngx_http_v2_out_frame_t;[m
[31m-[m
[31m-[m
[31m-typedef u_char *(*ngx_http_v2_handler_pt) (ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_str_t                        value;[m
[31m-} ngx_http_v2_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                       sid;[m
[31m-    size_t                           length;[m
[31m-    size_t                           padding;[m
[31m-    unsigned                         flags:8;[m
[31m-[m
[31m-    unsigned                         incomplete:1;[m
[31m-    unsigned                         keep_pool:1;[m
[31m-[m
[31m-    /* HPACK */[m
[31m-    unsigned                         parse_name:1;[m
[31m-    unsigned                         parse_value:1;[m
[31m-    unsigned                         index:1;[m
[31m-    ngx_http_v2_header_t             header;[m
[31m-    size_t                           header_limit;[m
[31m-    u_char                           field_state;[m
[31m-    u_char                          *field_start;[m
[31m-    u_char                          *field_end;[m
[31m-    size_t                           field_rest;[m
[31m-    ngx_pool_t                      *pool;[m
[31m-[m
[31m-    ngx_http_v2_stream_t            *stream;[m
[31m-[m
[31m-    u_char                           buffer[NGX_HTTP_V2_STATE_BUFFER_SIZE];[m
[31m-    size_t                           buffer_used;[m
[31m-    ngx_http_v2_handler_pt           handler;[m
[31m-} ngx_http_v2_state_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_v2_header_t           **entries;[m
[31m-[m
[31m-    ngx_uint_t                       added;[m
[31m-    ngx_uint_t                       deleted;[m
[31m-    ngx_uint_t                       reused;[m
[31m-    ngx_uint_t                       allocated;[m
[31m-[m
[31m-    size_t                           size;[m
[31m-    size_t                           free;[m
[31m-    u_char                          *storage;[m
[31m-    u_char                          *pos;[m
[31m-} ngx_http_v2_hpack_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_v2_connection_s {[m
[31m-    ngx_connection_t                *connection;[m
[31m-    ngx_http_connection_t           *http_connection;[m
[31m-[m
[31m-    ngx_uint_t                       processing;[m
[31m-[m
[31m-    size_t                           send_window;[m
[31m-    size_t                           recv_window;[m
[31m-    size_t                           init_window;[m
[31m-[m
[31m-    size_t                           frame_size;[m
[31m-[m
[31m-    ngx_queue_t                      waiting;[m
[31m-[m
[31m-    ngx_http_v2_state_t              state;[m
[31m-[m
[31m-    ngx_http_v2_hpack_t              hpack;[m
[31m-[m
[31m-    ngx_pool_t                      *pool;[m
[31m-[m
[31m-    ngx_http_v2_out_frame_t         *free_frames;[m
[31m-    ngx_connection_t                *free_fake_connections;[m
[31m-[m
[31m-    ngx_http_v2_node_t             **streams_index;[m
[31m-[m
[31m-    ngx_http_v2_out_frame_t         *last_out;[m
[31m-[m
[31m-    ngx_queue_t                      posted;[m
[31m-    ngx_queue_t                      dependencies;[m
[31m-    ngx_queue_t                      closed;[m
[31m-[m
[31m-    ngx_uint_t                       last_sid;[m
[31m-[m
[31m-    unsigned                         closed_nodes:8;[m
[31m-    unsigned                         settings_ack:1;[m
[31m-    unsigned                         blocked:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_v2_node_s {[m
[31m-    ngx_uint_t                       id;[m
[31m-    ngx_http_v2_node_t              *index;[m
[31m-    ngx_http_v2_node_t              *parent;[m
[31m-    ngx_queue_t                      queue;[m
[31m-    ngx_queue_t                      children;[m
[31m-    ngx_queue_t                      reuse;[m
[31m-    ngx_uint_t                       rank;[m
[31m-    ngx_uint_t                       weight;[m
[31m-    double                           rel_weight;[m
[31m-    ngx_http_v2_stream_t            *stream;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_v2_stream_s {[m
[31m-    ngx_http_request_t              *request;[m
[31m-    ngx_http_v2_connection_t        *connection;[m
[31m-    ngx_http_v2_node_t              *node;[m
[31m-[m
[31m-    ngx_uint_t                       queued;[m
[31m-[m
[31m-    /*[m
[31m-     * A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the[m
[31m-     * send_window to become negative, hence it's signed.[m
[31m-     */[m
[31m-    ssize_t                          send_window;[m
[31m-    size_t                           recv_window;[m
[31m-[m
[31m-    ngx_http_v2_out_frame_t         *free_frames;[m
[31m-    ngx_chain_t                     *free_frame_headers;[m
[31m-    ngx_chain_t                     *free_bufs;[m
[31m-[m
[31m-    ngx_queue_t                      queue;[m
[31m-[m
[31m-    ngx_array_t                     *cookies;[m
[31m-[m
[31m-    size_t                           header_limit;[m
[31m-[m
[31m-    ngx_pool_t                      *pool;[m
[31m-[m
[31m-    unsigned                         handled:1;[m
[31m-    unsigned                         blocked:1;[m
[31m-    unsigned                         exhausted:1;[m
[31m-    unsigned                         in_closed:1;[m
[31m-    unsigned                         out_closed:1;[m
[31m-    unsigned                         rst_sent:1;[m
[31m-    unsigned                         no_flow_control:1;[m
[31m-    unsigned                         skip_data:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_v2_out_frame_s {[m
[31m-    ngx_http_v2_out_frame_t         *next;[m
[31m-    ngx_chain_t                     *first;[m
[31m-    ngx_chain_t                     *last;[m
[31m-    ngx_int_t                      (*handler)(ngx_http_v2_connection_t *h2c,[m
[31m-                                        ngx_http_v2_out_frame_t *frame);[m
[31m-[m
[31m-    ngx_http_v2_stream_t            *stream;[m
[31m-    size_t                           length;[m
[31m-[m
[31m-    unsigned                         blocked:1;[m
[31m-    unsigned                         fin:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_v2_queue_frame(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_http_v2_out_frame_t  **out;[m
[31m-[m
[31m-    for (out = &h2c->last_out; *out; out = &(*out)->next) {[m
[31m-[m
[31m-        if ((*out)->blocked || (*out)->stream == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if ((*out)->stream->node->rank < frame->stream->node->rank[m
[31m-            || ((*out)->stream->node->rank == frame->stream->node->rank[m
[31m-                && (*out)->stream->node->rel_weight[m
[31m-                   >= frame->stream->node->rel_weight))[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    frame->next = *out;[m
[31m-    *out = frame;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_v2_queue_blocked_frame(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_http_v2_out_frame_t  **out;[m
[31m-[m
[31m-    for (out = &h2c->last_out; *out; out = &(*out)->next)[m
[31m-    {[m
[31m-        if ((*out)->blocked || (*out)->stream == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    frame->next = *out;[m
[31m-    *out = frame;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_http_v2_init(ngx_event_t *rev);[m
[31m-void ngx_http_v2_request_headers_init(void);[m
[31m-[m
[31m-ngx_int_t ngx_http_v2_read_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler);[m
[31m-ngx_int_t ngx_http_v2_read_unbuffered_request_body(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc);[m
[31m-[m
[31m-ngx_int_t ngx_http_v2_send_output_queue(ngx_http_v2_connection_t *h2c);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_v2_get_indexed_header(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t index, ngx_uint_t name_only);[m
[31m-ngx_int_t ngx_http_v2_add_header(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-ngx_int_t ngx_http_v2_table_size(ngx_http_v2_connection_t *h2c, size_t size);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_v2_huff_decode(u_char *state, u_char *src, size_t len,[m
[31m-    u_char **dst, ngx_uint_t last, ngx_log_t *log);[m
[31m-size_t ngx_http_v2_huff_encode(u_char *src, size_t len, u_char *dst,[m
[31m-    ngx_uint_t lower);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_v2_prefix(bits)  ((1 << (bits)) - 1)[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define ngx_http_v2_parse_uint16(p)  ntohs(*(uint16_t *) (p))[m
[31m-#define ngx_http_v2_parse_uint32(p)  ntohl(*(uint32_t *) (p))[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_http_v2_parse_uint16(p)  ((p)[0] << 8 | (p)[1])[m
[31m-#define ngx_http_v2_parse_uint32(p)                                           \[m
[31m-    ((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_http_v2_parse_length(p)  ((p) >> 8)[m
[31m-#define ngx_http_v2_parse_type(p)    ((p) & 0xff)[m
[31m-#define ngx_http_v2_parse_sid(p)     (ngx_http_v2_parse_uint32(p) & 0x7fffffff)[m
[31m-#define ngx_http_v2_parse_window(p)  (ngx_http_v2_parse_uint32(p) & 0x7fffffff)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_v2_write_uint16_aligned(p, s)                                \[m
[31m-    (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t))[m
[31m-#define ngx_http_v2_write_uint32_aligned(p, s)                                \[m
[31m-    (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t))[m
[31m-[m
[31m-#if (NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define ngx_http_v2_write_uint16  ngx_http_v2_write_uint16_aligned[m
[31m-#define ngx_http_v2_write_uint32  ngx_http_v2_write_uint32_aligned[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_http_v2_write_uint16(p, s)                                        \[m
[31m-    ((p)[0] = (u_char) ((s) >> 8),                                            \[m
[31m-     (p)[1] = (u_char)  (s),                                                  \[m
[31m-     (p) + sizeof(uint16_t))[m
[31m-[m
[31m-#define ngx_http_v2_write_uint32(p, s)                                        \[m
[31m-    ((p)[0] = (u_char) ((s) >> 24),                                           \[m
[31m-     (p)[1] = (u_char) ((s) >> 16),                                           \[m
[31m-     (p)[2] = (u_char) ((s) >> 8),                                            \[m
[31m-     (p)[3] = (u_char)  (s),                                                  \[m
[31m-     (p) + sizeof(uint32_t))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_http_v2_write_len_and_type(p, l, t)                               \[m
[31m-    ngx_http_v2_write_uint32_aligned(p, (l) << 8 | (t))[m
[31m-[m
[31m-#define ngx_http_v2_write_sid  ngx_http_v2_write_uint32[m
[31m-[m
[31m-#endif /* _NGX_HTTP_V2_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex caa835d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1391 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_http_v2_module.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * This returns precise number of octets for values in range 0..253[m
[31m- * and estimate number for the rest, but not smaller than required.[m
[31m- */[m
[31m-[m
[31m-#define ngx_http_v2_integer_octets(v)  (1 + (v) / 127)[m
[31m-[m
[31m-#define ngx_http_v2_literal_size(h)                                           \[m
[31m-    (ngx_http_v2_integer_octets(sizeof(h) - 1) + sizeof(h) - 1)[m
[31m-[m
[31m-#define ngx_http_v2_indexed(i)      (128 + (i))[m
[31m-#define ngx_http_v2_inc_indexed(i)  (64 + (i))[m
[31m-[m
[31m-#define ngx_http_v2_write_name(dst, src, len, tmp)                            \[m
[31m-    ngx_http_v2_string_encode(dst, src, len, tmp, 1)[m
[31m-#define ngx_http_v2_write_value(dst, src, len, tmp)                           \[m
[31m-    ngx_http_v2_string_encode(dst, src, len, tmp, 0)[m
[31m-[m
[31m-#define NGX_HTTP_V2_ENCODE_RAW            0[m
[31m-#define NGX_HTTP_V2_ENCODE_HUFF           0x80[m
[31m-[m
[31m-#define NGX_HTTP_V2_STATUS_INDEX          8[m
[31m-#define NGX_HTTP_V2_STATUS_200_INDEX      8[m
[31m-#define NGX_HTTP_V2_STATUS_204_INDEX      9[m
[31m-#define NGX_HTTP_V2_STATUS_206_INDEX      10[m
[31m-#define NGX_HTTP_V2_STATUS_304_INDEX      11[m
[31m-#define NGX_HTTP_V2_STATUS_400_INDEX      12[m
[31m-#define NGX_HTTP_V2_STATUS_404_INDEX      13[m
[31m-#define NGX_HTTP_V2_STATUS_500_INDEX      14[m
[31m-[m
[31m-#define NGX_HTTP_V2_CONTENT_LENGTH_INDEX  28[m
[31m-#define NGX_HTTP_V2_CONTENT_TYPE_INDEX    31[m
[31m-#define NGX_HTTP_V2_DATE_INDEX            33[m
[31m-#define NGX_HTTP_V2_LAST_MODIFIED_INDEX   44[m
[31m-#define NGX_HTTP_V2_LOCATION_INDEX        46[m
[31m-#define NGX_HTTP_V2_SERVER_INDEX          54[m
[31m-#define NGX_HTTP_V2_VARY_INDEX            59[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_http_v2_string_encode(u_char *dst, u_char *src, size_t len,[m
[31m-    u_char *tmp, ngx_uint_t lower);[m
[31m-static u_char *ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix,[m
[31m-    ngx_uint_t value);[m
[31m-static ngx_http_v2_out_frame_t *ngx_http_v2_create_headers_frame([m
[31m-    ngx_http_request_t *r, u_char *pos, u_char *end);[m
[31m-[m
[31m-static ngx_chain_t *ngx_http_v2_send_chain(ngx_connection_t *fc,[m
[31m-    ngx_chain_t *in, off_t limit);[m
[31m-[m
[31m-static ngx_chain_t *ngx_http_v2_filter_get_shadow([m
[31m-    ngx_http_v2_stream_t *stream, ngx_buf_t *buf, off_t offset, off_t size);[m
[31m-static ngx_http_v2_out_frame_t *ngx_http_v2_filter_get_data_frame([m
[31m-    ngx_http_v2_stream_t *stream, size_t len, ngx_chain_t *first,[m
[31m-    ngx_chain_t *last);[m
[31m-[m
[31m-static ngx_inline ngx_int_t ngx_http_v2_flow_control([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream);[m
[31m-static void ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream);[m
[31m-[m
[31m-static ngx_inline ngx_int_t ngx_http_v2_filter_send([m
[31m-    ngx_connection_t *fc, ngx_http_v2_stream_t *stream);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_headers_frame_handler([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);[m
[31m-static ngx_int_t ngx_http_v2_data_frame_handler([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);[m
[31m-static ngx_inline void ngx_http_v2_handle_frame([m
[31m-    ngx_http_v2_stream_t *stream, ngx_http_v2_out_frame_t *frame);[m
[31m-static ngx_inline void ngx_http_v2_handle_stream([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream);[m
[31m-[m
[31m-static void ngx_http_v2_filter_cleanup(void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_v2_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_v2_filter_init,               /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_v2_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_v2_filter_module_ctx,        /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                     status, *pos, *start, *p, *tmp;[m
[31m-    size_t                     len, tmp_len;[m
[31m-    ngx_str_t                  host, location;[m
[31m-    ngx_uint_t                 i, port;[m
[31m-    ngx_list_part_t           *part;[m
[31m-    ngx_table_elt_t           *header;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_cleanup_t        *cln;[m
[31m-    ngx_http_v2_out_frame_t   *frame;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-#endif[m
[31m-    u_char                     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    static const u_char nginx[5] = "\x84\xaa\x63\x55\xe7";[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    static const u_char accept_encoding[12] =[m
[31m-        "\x8b\x84\x84\x2d\x69\x5b\x05\x44\x3c\x86\xaa\x6f";[m
[31m-#endif[m
[31m-[m
[31m-    static size_t nginx_ver_len = ngx_http_v2_literal_size(NGINX_VER);[m
[31m-    static u_char nginx_ver[ngx_http_v2_literal_size(NGINX_VER)];[m
[31m-[m
[31m-    if (!r->stream) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http2 header filter");[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->header_sent = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    switch (r->headers_out.status) {[m
[31m-[m
[31m-    case NGX_HTTP_OK:[m
[31m-        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_200_INDEX);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_NO_CONTENT:[m
[31m-        r->header_only = 1;[m
[31m-[m
[31m-        ngx_str_null(&r->headers_out.content_type);[m
[31m-[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-        r->headers_out.content_length_n = -1;[m
[31m-[m
[31m-        r->headers_out.last_modified_time = -1;[m
[31m-        r->headers_out.last_modified = NULL;[m
[31m-[m
[31m-        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_204_INDEX);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_PARTIAL_CONTENT:[m
[31m-        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_206_INDEX);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_NOT_MODIFIED:[m
[31m-        r->header_only = 1;[m
[31m-        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_304_INDEX);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        r->headers_out.last_modified_time = -1;[m
[31m-        r->headers_out.last_modified = NULL;[m
[31m-[m
[31m-        switch (r->headers_out.status) {[m
[31m-[m
[31m-        case NGX_HTTP_BAD_REQUEST:[m
[31m-            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_400_INDEX);[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_NOT_FOUND:[m
[31m-            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_404_INDEX);[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_INTERNAL_SERVER_ERROR:[m
[31m-            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_500_INDEX);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            status = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = status ? 1 : 1 + ngx_http_v2_literal_size("418");[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        len += 1 + (clcf->server_tokens ? nginx_ver_len : sizeof(nginx));[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT");[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        len += 1 + NGX_HTTP_V2_INT_OCTETS + r->headers_out.content_type.len;[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        len += 1 + ngx_http_v2_integer_octets(NGX_OFF_T_LEN) + NGX_OFF_T_LEN;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT");[m
[31m-    }[m
[31m-[m
[31m-    fc = r->connection;[m
[31m-[m
[31m-    if (r->headers_out.location && r->headers_out.location->value.len) {[m
[31m-[m
[31m-        if (r->headers_out.location->value.data[0] == '/') {[m
[31m-            if (clcf->server_name_in_redirect) {[m
[31m-                cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-                host = cscf->server_name;[m
[31m-[m
[31m-            } else if (r->headers_in.server.len) {[m
[31m-                host = r->headers_in.server;[m
[31m-[m
[31m-            } else {[m
[31m-                host.len = NGX_SOCKADDR_STRLEN;[m
[31m-                host.data = addr;[m
[31m-[m
[31m-                if (ngx_connection_local_sockaddr(fc, &host, 0) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            switch (fc->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                sin6 = (struct sockaddr_in6 *) fc->local_sockaddr;[m
[31m-                port = ntohs(sin6->sin6_port);[m
[31m-                break;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-            case AF_UNIX:[m
[31m-                port = 0;[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                sin = (struct sockaddr_in *) fc->local_sockaddr;[m
[31m-                port = ntohs(sin->sin_port);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            location.len = sizeof("https://") - 1 + host.len[m
[31m-                           + r->headers_out.location->value.len;[m
[31m-[m
[31m-            if (clcf->port_in_redirect) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-                if (fc->ssl)[m
[31m-                    port = (port == 443) ? 0 : port;[m
[31m-                else[m
[31m-#endif[m
[31m-                    port = (port == 80) ? 0 : port;[m
[31m-[m
[31m-            } else {[m
[31m-                port = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (port) {[m
[31m-                location.len += sizeof(":65535") - 1;[m
[31m-            }[m
[31m-[m
[31m-            location.data = ngx_pnalloc(r->pool, location.len);[m
[31m-            if (location.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_cpymem(location.data, "http", sizeof("http") - 1);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (fc->ssl) {[m
[31m-                *p++ = 's';[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            *p++ = ':'; *p++ = '/'; *p++ = '/';[m
[31m-            p = ngx_cpymem(p, host.data, host.len);[m
[31m-[m
[31m-            if (port) {[m
[31m-                p = ngx_sprintf(p, ":%ui", port);[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_cpymem(p, r->headers_out.location->value.data,[m
[31m-                              r->headers_out.location->value.len);[m
[31m-[m
[31m-            /* update r->headers_out.location->value for possible logging */[m
[31m-[m
[31m-            r->headers_out.location->value.len = p - location.data;[m
[31m-            r->headers_out.location->value.data = location.data;[m
[31m-            ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.location->hash = 0;[m
[31m-[m
[31m-        len += 1 + NGX_HTTP_V2_INT_OCTETS + r->headers_out.location->value.len;[m
[31m-    }[m
[31m-[m
[31m-    tmp_len = len;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        if (clcf->gzip_vary) {[m
[31m-            len += 1 + sizeof(accept_encoding);[m
[31m-[m
[31m-        } else {[m
[31m-            r->gzip_vary = 0;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, fc->log, 0,[m
[31m-                          "too long response header name: \"%V\"",[m
[31m-                          &header[i].key);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, fc->log, 0,[m
[31m-                          "too long response header value: \"%V: %V\"",[m
[31m-                          &header[i].key, &header[i].value);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len[m
[31m-                 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;[m
[31m-[m
[31m-        if (header[i].key.len > tmp_len) {[m
[31m-            tmp_len = header[i].key.len;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].value.len > tmp_len) {[m
[31m-            tmp_len = header[i].value.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    tmp = ngx_palloc(r->pool, tmp_len);[m
[31m-    pos = ngx_pnalloc(r->pool, len);[m
[31m-[m
[31m-    if (pos == NULL || tmp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    start = pos;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                   "http2 output header: \":status: %03ui\"",[m
[31m-                   r->headers_out.status);[m
[31m-[m
[31m-    if (status) {[m
[31m-        *pos++ = status;[m
[31m-[m
[31m-    } else {[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_STATUS_INDEX);[m
[31m-        *pos++ = NGX_HTTP_V2_ENCODE_RAW | 3;[m
[31m-        pos = ngx_sprintf(pos, "%03ui", r->headers_out.status);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"server: %s\"",[m
[31m-                       clcf->server_tokens ? NGINX_VER : "nginx");[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_SERVER_INDEX);[m
[31m-[m
[31m-        if (clcf->server_tokens) {[m
[31m-            if (nginx_ver[0] == '\0') {[m
[31m-                p = ngx_http_v2_write_value(nginx_ver, (u_char *) NGINX_VER,[m
[31m-                                            sizeof(NGINX_VER) - 1, tmp);[m
[31m-                nginx_ver_len = p - nginx_ver;[m
[31m-            }[m
[31m-[m
[31m-            pos = ngx_cpymem(pos, nginx_ver, nginx_ver_len);[m
[31m-[m
[31m-        } else {[m
[31m-            pos = ngx_cpymem(pos, nginx, sizeof(nginx));[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"date: %V\"",[m
[31m-                       &ngx_cached_http_time);[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_DATE_INDEX);[m
[31m-        pos = ngx_http_v2_write_value(pos, ngx_cached_http_time.data,[m
[31m-                                      ngx_cached_http_time.len, tmp);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_CONTENT_TYPE_INDEX);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len = r->headers_out.content_type.len + sizeof("; charset=") - 1[m
[31m-                  + r->headers_out.charset.len;[m
[31m-[m
[31m-            p = ngx_pnalloc(r->pool, len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_cpymem(p, r->headers_out.content_type.data,[m
[31m-                           r->headers_out.content_type.len);[m
[31m-[m
[31m-            p = ngx_cpymem(p, "; charset=", sizeof("; charset=") - 1);[m
[31m-[m
[31m-            p = ngx_cpymem(p, r->headers_out.charset.data,[m
[31m-                           r->headers_out.charset.len);[m
[31m-[m
[31m-            /* updated r->headers_out.content_type is also needed for logging */[m
[31m-[m
[31m-            r->headers_out.content_type.len = len;[m
[31m-            r->headers_out.content_type.data = p - len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"content-type: %V\"",[m
[31m-                       &r->headers_out.content_type);[m
[31m-[m
[31m-        pos = ngx_http_v2_write_value(pos, r->headers_out.content_type.data,[m
[31m-                                      r->headers_out.content_type.len, tmp);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"content-length: %O\"",[m
[31m-                       r->headers_out.content_length_n);[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_CONTENT_LENGTH_INDEX);[m
[31m-[m
[31m-        p = pos;[m
[31m-        pos = ngx_sprintf(pos + 1, "%O", r->headers_out.content_length_n);[m
[31m-        *p = NGX_HTTP_V2_ENCODE_RAW | (u_char) (pos - p - 1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_LAST_MODIFIED_INDEX);[m
[31m-[m
[31m-        ngx_http_time(pos, r->headers_out.last_modified_time);[m
[31m-        len = sizeof("Wed, 31 Dec 1986 18:00:00 GMT") - 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"last-modified: %*s\"",[m
[31m-                       len, pos);[m
[31m-[m
[31m-        /*[m
[31m-         * Date will always be encoded using huffman in the temporary buffer,[m
[31m-         * so it's safe here to use src and dst pointing to the same address.[m
[31m-         */[m
[31m-        pos = ngx_http_v2_write_value(pos, pos, len, tmp);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.location && r->headers_out.location->value.len) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"location: %V\"",[m
[31m-                       &r->headers_out.location->value);[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_LOCATION_INDEX);[m
[31m-        pos = ngx_http_v2_write_value(pos, r->headers_out.location->value.data,[m
[31m-                                      r->headers_out.location->value.len, tmp);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"vary: Accept-Encoding\"");[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_VARY_INDEX);[m
[31m-        pos = ngx_cpymem(pos, accept_encoding, sizeof(accept_encoding));[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        if (fc->log->log_level & NGX_LOG_DEBUG_HTTP) {[m
[31m-            ngx_strlow(tmp, header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                           "http2 output header: \"%*s: %V\"",[m
[31m-                           header[i].key.len, tmp, &header[i].value);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        *pos++ = 0;[m
[31m-[m
[31m-        pos = ngx_http_v2_write_name(pos, header[i].key.data,[m
[31m-                                     header[i].key.len, tmp);[m
[31m-[m
[31m-        pos = ngx_http_v2_write_value(pos, header[i].value.data,[m
[31m-                                      header[i].value.len, tmp);[m
[31m-    }[m
[31m-[m
[31m-    frame = ngx_http_v2_create_headers_frame(r, start, pos);[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(r->stream->connection, frame);[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_v2_filter_cleanup;[m
[31m-    cln->data = r->stream;[m
[31m-[m
[31m-    r->stream->queued = 1;[m
[31m-[m
[31m-    fc->send_chain = ngx_http_v2_send_chain;[m
[31m-    fc->need_last_buf = 1;[m
[31m-[m
[31m-    return ngx_http_v2_filter_send(fc, r->stream);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_string_encode(u_char *dst, u_char *src, size_t len, u_char *tmp,[m
[31m-    ngx_uint_t lower)[m
[31m-{[m
[31m-    size_t  hlen;[m
[31m-[m
[31m-    hlen = ngx_http_v2_huff_encode(src, len, tmp, lower);[m
[31m-[m
[31m-    if (hlen > 0) {[m
[31m-        *dst = NGX_HTTP_V2_ENCODE_HUFF;[m
[31m-        dst = ngx_http_v2_write_int(dst, ngx_http_v2_prefix(7), hlen);[m
[31m-        return ngx_cpymem(dst, tmp, hlen);[m
[31m-    }[m
[31m-[m
[31m-    *dst = NGX_HTTP_V2_ENCODE_RAW;[m
[31m-    dst = ngx_http_v2_write_int(dst, ngx_http_v2_prefix(7), len);[m
[31m-[m
[31m-    if (lower) {[m
[31m-        ngx_strlow(dst, src, len);[m
[31m-        return dst + len;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_cpymem(dst, src, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix, ngx_uint_t value)[m
[31m-{[m
[31m-    if (value < prefix) {[m
[31m-        *pos++ |= value;[m
[31m-        return pos;[m
[31m-    }[m
[31m-[m
[31m-    *pos++ |= prefix;[m
[31m-    value -= prefix;[m
[31m-[m
[31m-    while (value >= 128) {[m
[31m-        *pos++ = value % 128 + 128;[m
[31m-        value /= 128;[m
[31m-    }[m
[31m-[m
[31m-    *pos++ = (u_char) value;[m
[31m-[m
[31m-    return pos;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_out_frame_t *[m
[31m-ngx_http_v2_create_headers_frame(ngx_http_request_t *r, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    u_char                    type, flags;[m
[31m-    size_t                    rest, frame_size;[m
[31m-    ngx_buf_t                *b;[m
[31m-    ngx_chain_t              *cl, **ll;[m
[31m-    ngx_http_v2_stream_t     *stream;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    stream = r->stream;[m
[31m-    rest = end - pos;[m
[31m-[m
[31m-    frame = ngx_palloc(r->pool, sizeof(ngx_http_v2_out_frame_t));[m
[31m-    if (frame == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    frame->handler = ngx_http_v2_headers_frame_handler;[m
[31m-    frame->stream = stream;[m
[31m-    frame->length = rest;[m
[31m-    frame->blocked = 1;[m
[31m-    frame->fin = r->header_only;[m
[31m-[m
[31m-    ll = &frame->first;[m
[31m-[m
[31m-    type = NGX_HTTP_V2_HEADERS_FRAME;[m
[31m-    flags = r->header_only ? NGX_HTTP_V2_END_STREAM_FLAG : NGX_HTTP_V2_NO_FLAG;[m
[31m-    frame_size = stream->connection->frame_size;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (rest <= frame_size) {[m
[31m-            frame_size = rest;[m
[31m-            flags |= NGX_HTTP_V2_END_HEADERS_FLAG;[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->pool, NGX_HTTP_V2_FRAME_HEADER_SIZE);[m
[31m-        if (b == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_http_v2_write_len_and_type(b->last, frame_size, type);[m
[31m-        *b->last++ = flags;[m
[31m-        b->last = ngx_http_v2_write_sid(b->last, stream->node->id);[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_v2_module;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = pos;[m
[31m-[m
[31m-        pos += frame_size;[m
[31m-[m
[31m-        b->last = pos;[m
[31m-        b->start = b->pos;[m
[31m-        b->end = b->last;[m
[31m-        b->temporary = 1;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        rest -= frame_size;[m
[31m-[m
[31m-        if (rest) {[m
[31m-            type = NGX_HTTP_V2_CONTINUATION_FRAME;[m
[31m-            flags = NGX_HTTP_V2_NO_FLAG;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        b->last_buf = r->header_only;[m
[31m-        cl->next = NULL;[m
[31m-        frame->last = cl;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http2:%ui create HEADERS frame %p: len:%uz",[m
[31m-                       stream->node->id, frame, frame->length);[m
[31m-[m
[31m-        return frame;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_v2_send_chain(ngx_connection_t *fc, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    off_t                      size, offset;[m
[31m-    size_t                     rest, frame_size;[m
[31m-    ngx_chain_t               *cl, *out, **ln;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_v2_loc_conf_t    *h2lcf;[m
[31m-    ngx_http_v2_out_frame_t   *frame;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    r = fc->data;[m
[31m-    stream = r->stream;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    size = 0;[m
[31m-#endif[m
[31m-[m
[31m-    while (in) {[m
[31m-        size = ngx_buf_size(in->buf);[m
[31m-[m
[31m-        if (size || in->buf->last_buf) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-[m
[31m-        if (stream->queued) {[m
[31m-            fc->write->active = 1;[m
[31m-            fc->write->ready = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            fc->buffered &= ~NGX_HTTP_V2_BUFFERED;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    h2c = stream->connection;[m
[31m-[m
[31m-    if (size && ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) {[m
[31m-        fc->write->active = 1;[m
[31m-        fc->write->ready = 0;[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-    if (in->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = in->buf;[m
[31m-        in->buf = cl->buf->shadow;[m
[31m-[m
[31m-        offset = ngx_buf_in_memory(in->buf)[m
[31m-                 ? (cl->buf->pos - in->buf->pos)[m
[31m-                 : (cl->buf->file_pos - in->buf->file_pos);[m
[31m-[m
[31m-        cl->next = stream->free_bufs;[m
[31m-        stream->free_bufs = cl;[m
[31m-[m
[31m-    } else {[m
[31m-        offset = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) h2c->send_window) {[m
[31m-        limit = h2c->send_window;[m
[31m-    }[m
[31m-[m
[31m-    if (limit > stream->send_window) {[m
[31m-        limit = (stream->send_window > 0) ? stream->send_window : 0;[m
[31m-    }[m
[31m-[m
[31m-    h2lcf = ngx_http_get_module_loc_conf(r, ngx_http_v2_module);[m
[31m-[m
[31m-    frame_size = (h2lcf->chunk_size < h2c->frame_size)[m
[31m-                 ? h2lcf->chunk_size : h2c->frame_size;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    cl = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if ((off_t) frame_size > limit) {[m
[31m-            frame_size = (size_t) limit;[m
[31m-        }[m
[31m-[m
[31m-        ln = &out;[m
[31m-        rest = frame_size;[m
[31m-[m
[31m-        while ((off_t) rest >= size) {[m
[31m-[m
[31m-            if (offset) {[m
[31m-                cl = ngx_http_v2_filter_get_shadow(stream, in->buf,[m
[31m-                                                   offset, size);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                offset = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                cl = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf = in->buf;[m
[31m-            }[m
[31m-[m
[31m-            *ln = cl;[m
[31m-            ln = &cl->next;[m
[31m-[m
[31m-            rest -= (size_t) size;[m
[31m-            in = in->next;[m
[31m-[m
[31m-            if (in == NULL) {[m
[31m-                frame_size -= rest;[m
[31m-                rest = 0;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            size = ngx_buf_size(in->buf);[m
[31m-        }[m
[31m-[m
[31m-        if (rest) {[m
[31m-            cl = ngx_http_v2_filter_get_shadow(stream, in->buf, offset, rest);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->flush = 0;[m
[31m-            cl->buf->last_buf = 0;[m
[31m-[m
[31m-            *ln = cl;[m
[31m-[m
[31m-            offset += rest;[m
[31m-            size -= rest;[m
[31m-        }[m
[31m-[m
[31m-        frame = ngx_http_v2_filter_get_data_frame(stream, frame_size, out, cl);[m
[31m-        if (frame == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_v2_queue_frame(h2c, frame);[m
[31m-[m
[31m-        h2c->send_window -= frame_size;[m
[31m-[m
[31m-        stream->send_window -= frame_size;[m
[31m-        stream->queued++;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        limit -= frame_size;[m
[31m-[m
[31m-        if (limit == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (offset) {[m
[31m-        cl = ngx_http_v2_filter_get_shadow(stream, in->buf, offset, size);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        in->buf = cl->buf;[m
[31m-        ngx_free_chain(r->pool, cl);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_filter_send(fc, stream) == NGX_ERROR) {[m
[31m-        return NGX_CHAIN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (in && ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) {[m
[31m-        fc->write->active = 1;[m
[31m-        fc->write->ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_v2_filter_get_shadow(ngx_http_v2_stream_t *stream, ngx_buf_t *buf,[m
[31m-    off_t offset, off_t size)[m
[31m-{[m
[31m-    ngx_buf_t    *chunk;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(stream->request->pool, &stream->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    chunk = cl->buf;[m
[31m-[m
[31m-    ngx_memcpy(chunk, buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    chunk->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow;[m
[31m-    chunk->shadow = buf;[m
[31m-[m
[31m-    if (ngx_buf_in_memory(chunk)) {[m
[31m-        chunk->pos += offset;[m
[31m-        chunk->last = chunk->pos + size;[m
[31m-    }[m
[31m-[m
[31m-    if (chunk->in_file) {[m
[31m-        chunk->file_pos += offset;[m
[31m-        chunk->file_last = chunk->file_pos + size;[m
[31m-    }[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_out_frame_t *[m
[31m-ngx_http_v2_filter_get_data_frame(ngx_http_v2_stream_t *stream,[m
[31m-    size_t len, ngx_chain_t *first, ngx_chain_t *last)[m
[31m-{[m
[31m-    u_char                      flags;[m
[31m-    ngx_buf_t                  *buf;[m
[31m-    ngx_chain_t                *cl;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-[m
[31m-    frame = stream->free_frames;[m
[31m-[m
[31m-    if (frame) {[m
[31m-        stream->free_frames = frame->next;[m
[31m-[m
[31m-    } else {[m
[31m-        frame = ngx_palloc(stream->request->pool,[m
[31m-                           sizeof(ngx_http_v2_out_frame_t));[m
[31m-        if (frame == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    flags = last->buf->last_buf ? NGX_HTTP_V2_END_STREAM_FLAG : 0;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, stream->request->connection->log, 0,[m
[31m-                   "http2:%ui create DATA frame %p: len:%uz flags:%ui",[m
[31m-                   stream->node->id, frame, len, (ngx_uint_t) flags);[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(stream->request->pool,[m
[31m-                                &stream->free_frame_headers);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    buf = cl->buf;[m
[31m-[m
[31m-    if (!buf->start) {[m
[31m-        buf->start = ngx_palloc(stream->request->pool,[m
[31m-                                NGX_HTTP_V2_FRAME_HEADER_SIZE);[m
[31m-        if (buf->start == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        buf->end = buf->start + NGX_HTTP_V2_FRAME_HEADER_SIZE;[m
[31m-        buf->last = buf->end;[m
[31m-[m
[31m-        buf->tag = (ngx_buf_tag_t) &ngx_http_v2_module;[m
[31m-        buf->memory = 1;[m
[31m-    }[m
[31m-[m
[31m-    buf->pos = buf->start;[m
[31m-    buf->last = buf->pos;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_len_and_type(buf->last, len,[m
[31m-                                               NGX_HTTP_V2_DATA_FRAME);[m
[31m-    *buf->last++ = flags;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_sid(buf->last, stream->node->id);[m
[31m-[m
[31m-    cl->next = first;[m
[31m-    first = cl;[m
[31m-[m
[31m-    last->buf->flush = 1;[m
[31m-[m
[31m-    frame->first = first;[m
[31m-    frame->last = last;[m
[31m-    frame->handler = ngx_http_v2_data_frame_handler;[m
[31m-    frame->stream = stream;[m
[31m-    frame->length = len;[m
[31m-    frame->blocked = 0;[m
[31m-    frame->fin = last->buf->last_buf;[m
[31m-[m
[31m-    return frame;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_v2_filter_send(ngx_connection_t *fc, ngx_http_v2_stream_t *stream)[m
[31m-{[m
[31m-    stream->blocked = 1;[m
[31m-[m
[31m-    if (ngx_http_v2_send_output_queue(stream->connection) == NGX_ERROR) {[m
[31m-        fc->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    stream->blocked = 0;[m
[31m-[m
[31m-    if (stream->queued) {[m
[31m-        fc->buffered |= NGX_HTTP_V2_BUFFERED;[m
[31m-        fc->write->active = 1;[m
[31m-        fc->write->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    fc->buffered &= ~NGX_HTTP_V2_BUFFERED;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_v2_flow_control(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream)[m
[31m-{[m
[31m-    if (stream->send_window <= 0) {[m
[31m-        stream->exhausted = 1;[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->send_window == 0) {[m
[31m-        ngx_http_v2_waiting_queue(h2c, stream);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream)[m
[31m-{[m
[31m-    ngx_queue_t           *q;[m
[31m-    ngx_http_v2_stream_t  *s;[m
[31m-[m
[31m-    if (stream->handled) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    stream->handled = 1;[m
[31m-[m
[31m-    for (q = ngx_queue_last(&h2c->waiting);[m
[31m-         q != ngx_queue_sentinel(&h2c->waiting);[m
[31m-         q = ngx_queue_prev(q))[m
[31m-    {[m
[31m-        s = ngx_queue_data(q, ngx_http_v2_stream_t, queue);[m
[31m-[m
[31m-        if (s->node->rank < stream->node->rank[m
[31m-            || (s->node->rank == stream->node->rank[m
[31m-                && s->node->rel_weight >= stream->node->rel_weight))[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_insert_after(q, &stream->queue);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_chain_t           *cl, *ln;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    stream = frame->stream;[m
[31m-    cl = frame->first;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (cl->buf->pos != cl->buf->last) {[m
[31m-            frame->first = cl;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "http2:%ui HEADERS frame %p was sent partially",[m
[31m-                           stream->node->id, frame);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ln = cl->next;[m
[31m-[m
[31m-        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_module) {[m
[31m-            cl->next = stream->free_frame_headers;[m
[31m-            stream->free_frame_headers = cl;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->next = stream->free_bufs;[m
[31m-            stream->free_bufs = cl;[m
[31m-        }[m
[31m-[m
[31m-        if (cl == frame->last) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = ln;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2:%ui HEADERS frame %p was sent",[m
[31m-                   stream->node->id, frame);[m
[31m-[m
[31m-    ngx_http_v2_handle_frame(stream, frame);[m
[31m-[m
[31m-    ngx_http_v2_handle_stream(h2c, stream);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_data_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_buf_t             *buf;[m
[31m-    ngx_chain_t           *cl, *ln;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    stream = frame->stream;[m
[31m-[m
[31m-    cl = frame->first;[m
[31m-[m
[31m-    if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_module) {[m
[31m-[m
[31m-        if (cl->buf->pos != cl->buf->last) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "http2:%ui DATA frame %p was sent partially",[m
[31m-                           stream->node->id, frame);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ln = cl->next;[m
[31m-[m
[31m-        cl->next = stream->free_frame_headers;[m
[31m-        stream->free_frame_headers = cl;[m
[31m-[m
[31m-        if (cl == frame->last) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        cl = ln;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {[m
[31m-            buf = cl->buf->shadow;[m
[31m-[m
[31m-            if (ngx_buf_in_memory(buf)) {[m
[31m-                buf->pos = cl->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            if (buf->in_file) {[m
[31m-                buf->file_pos = cl->buf->file_pos;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_size(cl->buf) != 0) {[m
[31m-[m
[31m-            if (cl != frame->first) {[m
[31m-                frame->first = cl;[m
[31m-                ngx_http_v2_handle_stream(h2c, stream);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "http2:%ui DATA frame %p was sent partially",[m
[31m-                           stream->node->id, frame);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ln = cl->next;[m
[31m-[m
[31m-        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {[m
[31m-            cl->next = stream->free_bufs;[m
[31m-            stream->free_bufs = cl;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_free_chain(stream->request->pool, cl);[m
[31m-        }[m
[31m-[m
[31m-        if (cl == frame->last) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        cl = ln;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2:%ui DATA frame %p was sent",[m
[31m-                   stream->node->id, frame);[m
[31m-[m
[31m-    stream->request->header_size += NGX_HTTP_V2_FRAME_HEADER_SIZE;[m
[31m-[m
[31m-    ngx_http_v2_handle_frame(stream, frame);[m
[31m-[m
[31m-    ngx_http_v2_handle_stream(h2c, stream);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_v2_handle_frame(ngx_http_v2_stream_t *stream,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = stream->request;[m
[31m-[m
[31m-    r->connection->sent += NGX_HTTP_V2_FRAME_HEADER_SIZE + frame->length;[m
[31m-[m
[31m-    if (frame->fin) {[m
[31m-        stream->out_closed = 1;[m
[31m-    }[m
[31m-[m
[31m-    frame->next = stream->free_frames;[m
[31m-    stream->free_frames = frame;[m
[31m-[m
[31m-    stream->queued--;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_v2_handle_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream)[m
[31m-{[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    if (stream->handled || stream->blocked || stream->exhausted) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = stream->request->connection->write;[m
[31m-[m
[31m-    if (!wev->delayed) {[m
[31m-        stream->handled = 1;[m
[31m-        ngx_queue_insert_tail(&h2c->posted, &stream->queue);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_filter_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_v2_stream_t *stream = data;[m
[31m-[m
[31m-    size_t                     window;[m
[31m-    ngx_http_v2_out_frame_t   *frame, **fn;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    if (stream->handled) {[m
[31m-        stream->handled = 0;[m
[31m-        ngx_queue_remove(&stream->queue);[m
[31m-    }[m
[31m-[m
[31m-    if (stream->queued == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    window = 0;[m
[31m-    h2c = stream->connection;[m
[31m-    fn = &h2c->last_out;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        frame = *fn;[m
[31m-[m
[31m-        if (frame == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (frame->stream == stream && !frame->blocked) {[m
[31m-            *fn = frame->next;[m
[31m-[m
[31m-            window += frame->length;[m
[31m-[m
[31m-            if (--stream->queued == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        fn = &frame->next;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->send_window == 0 && window && !ngx_queue_empty(&h2c->waiting)) {[m
[31m-        ngx_queue_add(&h2c->posted, &h2c->waiting);[m
[31m-        ngx_queue_init(&h2c->waiting);[m
[31m-    }[m
[31m-[m
[31m-    h2c->send_window += window;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_v2_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_decode.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_decode.c[m
[1mdeleted file mode 100644[m
[1mindex 49ca576..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_decode.c[m
[1m+++ /dev/null[m
[36m@@ -1,2714 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  next;[m
[31m-    u_char  emit;[m
[31m-    u_char  sym;[m
[31m-    u_char  ending;[m
[31m-} ngx_http_v2_huff_decode_code_t;[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t ngx_http_v2_huff_decode_bits(u_char *state,[m
[31m-    u_char *ending, ngx_uint_t bits, u_char **dst);[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_huff_decode_code_t  ngx_http_v2_huff_decode_codes[256][16] =[m
[31m-{[m
[31m-    /* 0 */[m
[31m-    {[m
[31m-        {0x04, 0x00, 0x00, 0x00}, {0x05, 0x00, 0x00, 0x00},[m
[31m-        {0x07, 0x00, 0x00, 0x00}, {0x08, 0x00, 0x00, 0x00},[m
[31m-        {0x0b, 0x00, 0x00, 0x00}, {0x0c, 0x00, 0x00, 0x00},[m
[31m-        {0x10, 0x00, 0x00, 0x00}, {0x13, 0x00, 0x00, 0x00},[m
[31m-        {0x19, 0x00, 0x00, 0x00}, {0x1c, 0x00, 0x00, 0x00},[m
[31m-        {0x20, 0x00, 0x00, 0x00}, {0x23, 0x00, 0x00, 0x00},[m
[31m-        {0x2a, 0x00, 0x00, 0x00}, {0x31, 0x00, 0x00, 0x00},[m
[31m-        {0x39, 0x00, 0x00, 0x00}, {0x40, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x30, 0x01}, {0x00, 0x01, 0x31, 0x01},[m
[31m-        {0x00, 0x01, 0x32, 0x01}, {0x00, 0x01, 0x61, 0x01},[m
[31m-        {0x00, 0x01, 0x63, 0x01}, {0x00, 0x01, 0x65, 0x01},[m
[31m-        {0x00, 0x01, 0x69, 0x01}, {0x00, 0x01, 0x6f, 0x01},[m
[31m-        {0x00, 0x01, 0x73, 0x01}, {0x00, 0x01, 0x74, 0x01},[m
[31m-        {0x0d, 0x00, 0x00, 0x00}, {0x0e, 0x00, 0x00, 0x00},[m
[31m-        {0x11, 0x00, 0x00, 0x00}, {0x12, 0x00, 0x00, 0x00},[m
[31m-        {0x14, 0x00, 0x00, 0x00}, {0x15, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x30, 0x00}, {0x16, 0x01, 0x30, 0x01},[m
[31m-        {0x01, 0x01, 0x31, 0x00}, {0x16, 0x01, 0x31, 0x01},[m
[31m-        {0x01, 0x01, 0x32, 0x00}, {0x16, 0x01, 0x32, 0x01},[m
[31m-        {0x01, 0x01, 0x61, 0x00}, {0x16, 0x01, 0x61, 0x01},[m
[31m-        {0x01, 0x01, 0x63, 0x00}, {0x16, 0x01, 0x63, 0x01},[m
[31m-        {0x01, 0x01, 0x65, 0x00}, {0x16, 0x01, 0x65, 0x01},[m
[31m-        {0x01, 0x01, 0x69, 0x00}, {0x16, 0x01, 0x69, 0x01},[m
[31m-        {0x01, 0x01, 0x6f, 0x00}, {0x16, 0x01, 0x6f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x30, 0x00}, {0x09, 0x01, 0x30, 0x00},[m
[31m-        {0x17, 0x01, 0x30, 0x00}, {0x28, 0x01, 0x30, 0x01},[m
[31m-        {0x02, 0x01, 0x31, 0x00}, {0x09, 0x01, 0x31, 0x00},[m
[31m-        {0x17, 0x01, 0x31, 0x00}, {0x28, 0x01, 0x31, 0x01},[m
[31m-        {0x02, 0x01, 0x32, 0x00}, {0x09, 0x01, 0x32, 0x00},[m
[31m-        {0x17, 0x01, 0x32, 0x00}, {0x28, 0x01, 0x32, 0x01},[m
[31m-        {0x02, 0x01, 0x61, 0x00}, {0x09, 0x01, 0x61, 0x00},[m
[31m-        {0x17, 0x01, 0x61, 0x00}, {0x28, 0x01, 0x61, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x30, 0x00}, {0x06, 0x01, 0x30, 0x00},[m
[31m-        {0x0a, 0x01, 0x30, 0x00}, {0x0f, 0x01, 0x30, 0x00},[m
[31m-        {0x18, 0x01, 0x30, 0x00}, {0x1f, 0x01, 0x30, 0x00},[m
[31m-        {0x29, 0x01, 0x30, 0x00}, {0x38, 0x01, 0x30, 0x01},[m
[31m-        {0x03, 0x01, 0x31, 0x00}, {0x06, 0x01, 0x31, 0x00},[m
[31m-        {0x0a, 0x01, 0x31, 0x00}, {0x0f, 0x01, 0x31, 0x00},[m
[31m-        {0x18, 0x01, 0x31, 0x00}, {0x1f, 0x01, 0x31, 0x00},[m
[31m-        {0x29, 0x01, 0x31, 0x00}, {0x38, 0x01, 0x31, 0x01}[m
[31m-    },[m
[31m-    /* 5 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x32, 0x00}, {0x06, 0x01, 0x32, 0x00},[m
[31m-        {0x0a, 0x01, 0x32, 0x00}, {0x0f, 0x01, 0x32, 0x00},[m
[31m-        {0x18, 0x01, 0x32, 0x00}, {0x1f, 0x01, 0x32, 0x00},[m
[31m-        {0x29, 0x01, 0x32, 0x00}, {0x38, 0x01, 0x32, 0x01},[m
[31m-        {0x03, 0x01, 0x61, 0x00}, {0x06, 0x01, 0x61, 0x00},[m
[31m-        {0x0a, 0x01, 0x61, 0x00}, {0x0f, 0x01, 0x61, 0x00},[m
[31m-        {0x18, 0x01, 0x61, 0x00}, {0x1f, 0x01, 0x61, 0x00},[m
[31m-        {0x29, 0x01, 0x61, 0x00}, {0x38, 0x01, 0x61, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x63, 0x00}, {0x09, 0x01, 0x63, 0x00},[m
[31m-        {0x17, 0x01, 0x63, 0x00}, {0x28, 0x01, 0x63, 0x01},[m
[31m-        {0x02, 0x01, 0x65, 0x00}, {0x09, 0x01, 0x65, 0x00},[m
[31m-        {0x17, 0x01, 0x65, 0x00}, {0x28, 0x01, 0x65, 0x01},[m
[31m-        {0x02, 0x01, 0x69, 0x00}, {0x09, 0x01, 0x69, 0x00},[m
[31m-        {0x17, 0x01, 0x69, 0x00}, {0x28, 0x01, 0x69, 0x01},[m
[31m-        {0x02, 0x01, 0x6f, 0x00}, {0x09, 0x01, 0x6f, 0x00},[m
[31m-        {0x17, 0x01, 0x6f, 0x00}, {0x28, 0x01, 0x6f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x63, 0x00}, {0x06, 0x01, 0x63, 0x00},[m
[31m-        {0x0a, 0x01, 0x63, 0x00}, {0x0f, 0x01, 0x63, 0x00},[m
[31m-        {0x18, 0x01, 0x63, 0x00}, {0x1f, 0x01, 0x63, 0x00},[m
[31m-        {0x29, 0x01, 0x63, 0x00}, {0x38, 0x01, 0x63, 0x01},[m
[31m-        {0x03, 0x01, 0x65, 0x00}, {0x06, 0x01, 0x65, 0x00},[m
[31m-        {0x0a, 0x01, 0x65, 0x00}, {0x0f, 0x01, 0x65, 0x00},[m
[31m-        {0x18, 0x01, 0x65, 0x00}, {0x1f, 0x01, 0x65, 0x00},[m
[31m-        {0x29, 0x01, 0x65, 0x00}, {0x38, 0x01, 0x65, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x69, 0x00}, {0x06, 0x01, 0x69, 0x00},[m
[31m-        {0x0a, 0x01, 0x69, 0x00}, {0x0f, 0x01, 0x69, 0x00},[m
[31m-        {0x18, 0x01, 0x69, 0x00}, {0x1f, 0x01, 0x69, 0x00},[m
[31m-        {0x29, 0x01, 0x69, 0x00}, {0x38, 0x01, 0x69, 0x01},[m
[31m-        {0x03, 0x01, 0x6f, 0x00}, {0x06, 0x01, 0x6f, 0x00},[m
[31m-        {0x0a, 0x01, 0x6f, 0x00}, {0x0f, 0x01, 0x6f, 0x00},[m
[31m-        {0x18, 0x01, 0x6f, 0x00}, {0x1f, 0x01, 0x6f, 0x00},[m
[31m-        {0x29, 0x01, 0x6f, 0x00}, {0x38, 0x01, 0x6f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x73, 0x00}, {0x16, 0x01, 0x73, 0x01},[m
[31m-        {0x01, 0x01, 0x74, 0x00}, {0x16, 0x01, 0x74, 0x01},[m
[31m-        {0x00, 0x01, 0x20, 0x01}, {0x00, 0x01, 0x25, 0x01},[m
[31m-        {0x00, 0x01, 0x2d, 0x01}, {0x00, 0x01, 0x2e, 0x01},[m
[31m-        {0x00, 0x01, 0x2f, 0x01}, {0x00, 0x01, 0x33, 0x01},[m
[31m-        {0x00, 0x01, 0x34, 0x01}, {0x00, 0x01, 0x35, 0x01},[m
[31m-        {0x00, 0x01, 0x36, 0x01}, {0x00, 0x01, 0x37, 0x01},[m
[31m-        {0x00, 0x01, 0x38, 0x01}, {0x00, 0x01, 0x39, 0x01}[m
[31m-    },[m
[31m-    /* 10 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x73, 0x00}, {0x09, 0x01, 0x73, 0x00},[m
[31m-        {0x17, 0x01, 0x73, 0x00}, {0x28, 0x01, 0x73, 0x01},[m
[31m-        {0x02, 0x01, 0x74, 0x00}, {0x09, 0x01, 0x74, 0x00},[m
[31m-        {0x17, 0x01, 0x74, 0x00}, {0x28, 0x01, 0x74, 0x01},[m
[31m-        {0x01, 0x01, 0x20, 0x00}, {0x16, 0x01, 0x20, 0x01},[m
[31m-        {0x01, 0x01, 0x25, 0x00}, {0x16, 0x01, 0x25, 0x01},[m
[31m-        {0x01, 0x01, 0x2d, 0x00}, {0x16, 0x01, 0x2d, 0x01},[m
[31m-        {0x01, 0x01, 0x2e, 0x00}, {0x16, 0x01, 0x2e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x73, 0x00}, {0x06, 0x01, 0x73, 0x00},[m
[31m-        {0x0a, 0x01, 0x73, 0x00}, {0x0f, 0x01, 0x73, 0x00},[m
[31m-        {0x18, 0x01, 0x73, 0x00}, {0x1f, 0x01, 0x73, 0x00},[m
[31m-        {0x29, 0x01, 0x73, 0x00}, {0x38, 0x01, 0x73, 0x01},[m
[31m-        {0x03, 0x01, 0x74, 0x00}, {0x06, 0x01, 0x74, 0x00},[m
[31m-        {0x0a, 0x01, 0x74, 0x00}, {0x0f, 0x01, 0x74, 0x00},[m
[31m-        {0x18, 0x01, 0x74, 0x00}, {0x1f, 0x01, 0x74, 0x00},[m
[31m-        {0x29, 0x01, 0x74, 0x00}, {0x38, 0x01, 0x74, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x20, 0x00}, {0x09, 0x01, 0x20, 0x00},[m
[31m-        {0x17, 0x01, 0x20, 0x00}, {0x28, 0x01, 0x20, 0x01},[m
[31m-        {0x02, 0x01, 0x25, 0x00}, {0x09, 0x01, 0x25, 0x00},[m
[31m-        {0x17, 0x01, 0x25, 0x00}, {0x28, 0x01, 0x25, 0x01},[m
[31m-        {0x02, 0x01, 0x2d, 0x00}, {0x09, 0x01, 0x2d, 0x00},[m
[31m-        {0x17, 0x01, 0x2d, 0x00}, {0x28, 0x01, 0x2d, 0x01},[m
[31m-        {0x02, 0x01, 0x2e, 0x00}, {0x09, 0x01, 0x2e, 0x00},[m
[31m-        {0x17, 0x01, 0x2e, 0x00}, {0x28, 0x01, 0x2e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x20, 0x00}, {0x06, 0x01, 0x20, 0x00},[m
[31m-        {0x0a, 0x01, 0x20, 0x00}, {0x0f, 0x01, 0x20, 0x00},[m
[31m-        {0x18, 0x01, 0x20, 0x00}, {0x1f, 0x01, 0x20, 0x00},[m
[31m-        {0x29, 0x01, 0x20, 0x00}, {0x38, 0x01, 0x20, 0x01},[m
[31m-        {0x03, 0x01, 0x25, 0x00}, {0x06, 0x01, 0x25, 0x00},[m
[31m-        {0x0a, 0x01, 0x25, 0x00}, {0x0f, 0x01, 0x25, 0x00},[m
[31m-        {0x18, 0x01, 0x25, 0x00}, {0x1f, 0x01, 0x25, 0x00},[m
[31m-        {0x29, 0x01, 0x25, 0x00}, {0x38, 0x01, 0x25, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x2d, 0x00}, {0x06, 0x01, 0x2d, 0x00},[m
[31m-        {0x0a, 0x01, 0x2d, 0x00}, {0x0f, 0x01, 0x2d, 0x00},[m
[31m-        {0x18, 0x01, 0x2d, 0x00}, {0x1f, 0x01, 0x2d, 0x00},[m
[31m-        {0x29, 0x01, 0x2d, 0x00}, {0x38, 0x01, 0x2d, 0x01},[m
[31m-        {0x03, 0x01, 0x2e, 0x00}, {0x06, 0x01, 0x2e, 0x00},[m
[31m-        {0x0a, 0x01, 0x2e, 0x00}, {0x0f, 0x01, 0x2e, 0x00},[m
[31m-        {0x18, 0x01, 0x2e, 0x00}, {0x1f, 0x01, 0x2e, 0x00},[m
[31m-        {0x29, 0x01, 0x2e, 0x00}, {0x38, 0x01, 0x2e, 0x01}[m
[31m-    },[m
[31m-    /* 15 */[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x2f, 0x00}, {0x16, 0x01, 0x2f, 0x01},[m
[31m-        {0x01, 0x01, 0x33, 0x00}, {0x16, 0x01, 0x33, 0x01},[m
[31m-        {0x01, 0x01, 0x34, 0x00}, {0x16, 0x01, 0x34, 0x01},[m
[31m-        {0x01, 0x01, 0x35, 0x00}, {0x16, 0x01, 0x35, 0x01},[m
[31m-        {0x01, 0x01, 0x36, 0x00}, {0x16, 0x01, 0x36, 0x01},[m
[31m-        {0x01, 0x01, 0x37, 0x00}, {0x16, 0x01, 0x37, 0x01},[m
[31m-        {0x01, 0x01, 0x38, 0x00}, {0x16, 0x01, 0x38, 0x01},[m
[31m-        {0x01, 0x01, 0x39, 0x00}, {0x16, 0x01, 0x39, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x2f, 0x00}, {0x09, 0x01, 0x2f, 0x00},[m
[31m-        {0x17, 0x01, 0x2f, 0x00}, {0x28, 0x01, 0x2f, 0x01},[m
[31m-        {0x02, 0x01, 0x33, 0x00}, {0x09, 0x01, 0x33, 0x00},[m
[31m-        {0x17, 0x01, 0x33, 0x00}, {0x28, 0x01, 0x33, 0x01},[m
[31m-        {0x02, 0x01, 0x34, 0x00}, {0x09, 0x01, 0x34, 0x00},[m
[31m-        {0x17, 0x01, 0x34, 0x00}, {0x28, 0x01, 0x34, 0x01},[m
[31m-        {0x02, 0x01, 0x35, 0x00}, {0x09, 0x01, 0x35, 0x00},[m
[31m-        {0x17, 0x01, 0x35, 0x00}, {0x28, 0x01, 0x35, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x2f, 0x00}, {0x06, 0x01, 0x2f, 0x00},[m
[31m-        {0x0a, 0x01, 0x2f, 0x00}, {0x0f, 0x01, 0x2f, 0x00},[m
[31m-        {0x18, 0x01, 0x2f, 0x00}, {0x1f, 0x01, 0x2f, 0x00},[m
[31m-        {0x29, 0x01, 0x2f, 0x00}, {0x38, 0x01, 0x2f, 0x01},[m
[31m-        {0x03, 0x01, 0x33, 0x00}, {0x06, 0x01, 0x33, 0x00},[m
[31m-        {0x0a, 0x01, 0x33, 0x00}, {0x0f, 0x01, 0x33, 0x00},[m
[31m-        {0x18, 0x01, 0x33, 0x00}, {0x1f, 0x01, 0x33, 0x00},[m
[31m-        {0x29, 0x01, 0x33, 0x00}, {0x38, 0x01, 0x33, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x34, 0x00}, {0x06, 0x01, 0x34, 0x00},[m
[31m-        {0x0a, 0x01, 0x34, 0x00}, {0x0f, 0x01, 0x34, 0x00},[m
[31m-        {0x18, 0x01, 0x34, 0x00}, {0x1f, 0x01, 0x34, 0x00},[m
[31m-        {0x29, 0x01, 0x34, 0x00}, {0x38, 0x01, 0x34, 0x01},[m
[31m-        {0x03, 0x01, 0x35, 0x00}, {0x06, 0x01, 0x35, 0x00},[m
[31m-        {0x0a, 0x01, 0x35, 0x00}, {0x0f, 0x01, 0x35, 0x00},[m
[31m-        {0x18, 0x01, 0x35, 0x00}, {0x1f, 0x01, 0x35, 0x00},[m
[31m-        {0x29, 0x01, 0x35, 0x00}, {0x38, 0x01, 0x35, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x36, 0x00}, {0x09, 0x01, 0x36, 0x00},[m
[31m-        {0x17, 0x01, 0x36, 0x00}, {0x28, 0x01, 0x36, 0x01},[m
[31m-        {0x02, 0x01, 0x37, 0x00}, {0x09, 0x01, 0x37, 0x00},[m
[31m-        {0x17, 0x01, 0x37, 0x00}, {0x28, 0x01, 0x37, 0x01},[m
[31m-        {0x02, 0x01, 0x38, 0x00}, {0x09, 0x01, 0x38, 0x00},[m
[31m-        {0x17, 0x01, 0x38, 0x00}, {0x28, 0x01, 0x38, 0x01},[m
[31m-        {0x02, 0x01, 0x39, 0x00}, {0x09, 0x01, 0x39, 0x00},[m
[31m-        {0x17, 0x01, 0x39, 0x00}, {0x28, 0x01, 0x39, 0x01}[m
[31m-    },[m
[31m-    /* 20 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x36, 0x00}, {0x06, 0x01, 0x36, 0x00},[m
[31m-        {0x0a, 0x01, 0x36, 0x00}, {0x0f, 0x01, 0x36, 0x00},[m
[31m-        {0x18, 0x01, 0x36, 0x00}, {0x1f, 0x01, 0x36, 0x00},[m
[31m-        {0x29, 0x01, 0x36, 0x00}, {0x38, 0x01, 0x36, 0x01},[m
[31m-        {0x03, 0x01, 0x37, 0x00}, {0x06, 0x01, 0x37, 0x00},[m
[31m-        {0x0a, 0x01, 0x37, 0x00}, {0x0f, 0x01, 0x37, 0x00},[m
[31m-        {0x18, 0x01, 0x37, 0x00}, {0x1f, 0x01, 0x37, 0x00},[m
[31m-        {0x29, 0x01, 0x37, 0x00}, {0x38, 0x01, 0x37, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x38, 0x00}, {0x06, 0x01, 0x38, 0x00},[m
[31m-        {0x0a, 0x01, 0x38, 0x00}, {0x0f, 0x01, 0x38, 0x00},[m
[31m-        {0x18, 0x01, 0x38, 0x00}, {0x1f, 0x01, 0x38, 0x00},[m
[31m-        {0x29, 0x01, 0x38, 0x00}, {0x38, 0x01, 0x38, 0x01},[m
[31m-        {0x03, 0x01, 0x39, 0x00}, {0x06, 0x01, 0x39, 0x00},[m
[31m-        {0x0a, 0x01, 0x39, 0x00}, {0x0f, 0x01, 0x39, 0x00},[m
[31m-        {0x18, 0x01, 0x39, 0x00}, {0x1f, 0x01, 0x39, 0x00},[m
[31m-        {0x29, 0x01, 0x39, 0x00}, {0x38, 0x01, 0x39, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x1a, 0x00, 0x00, 0x00}, {0x1b, 0x00, 0x00, 0x00},[m
[31m-        {0x1d, 0x00, 0x00, 0x00}, {0x1e, 0x00, 0x00, 0x00},[m
[31m-        {0x21, 0x00, 0x00, 0x00}, {0x22, 0x00, 0x00, 0x00},[m
[31m-        {0x24, 0x00, 0x00, 0x00}, {0x25, 0x00, 0x00, 0x00},[m
[31m-        {0x2b, 0x00, 0x00, 0x00}, {0x2e, 0x00, 0x00, 0x00},[m
[31m-        {0x32, 0x00, 0x00, 0x00}, {0x35, 0x00, 0x00, 0x00},[m
[31m-        {0x3a, 0x00, 0x00, 0x00}, {0x3d, 0x00, 0x00, 0x00},[m
[31m-        {0x41, 0x00, 0x00, 0x00}, {0x44, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x3d, 0x01}, {0x00, 0x01, 0x41, 0x01},[m
[31m-        {0x00, 0x01, 0x5f, 0x01}, {0x00, 0x01, 0x62, 0x01},[m
[31m-        {0x00, 0x01, 0x64, 0x01}, {0x00, 0x01, 0x66, 0x01},[m
[31m-        {0x00, 0x01, 0x67, 0x01}, {0x00, 0x01, 0x68, 0x01},[m
[31m-        {0x00, 0x01, 0x6c, 0x01}, {0x00, 0x01, 0x6d, 0x01},[m
[31m-        {0x00, 0x01, 0x6e, 0x01}, {0x00, 0x01, 0x70, 0x01},[m
[31m-        {0x00, 0x01, 0x72, 0x01}, {0x00, 0x01, 0x75, 0x01},[m
[31m-        {0x26, 0x00, 0x00, 0x00}, {0x27, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x3d, 0x00}, {0x16, 0x01, 0x3d, 0x01},[m
[31m-        {0x01, 0x01, 0x41, 0x00}, {0x16, 0x01, 0x41, 0x01},[m
[31m-        {0x01, 0x01, 0x5f, 0x00}, {0x16, 0x01, 0x5f, 0x01},[m
[31m-        {0x01, 0x01, 0x62, 0x00}, {0x16, 0x01, 0x62, 0x01},[m
[31m-        {0x01, 0x01, 0x64, 0x00}, {0x16, 0x01, 0x64, 0x01},[m
[31m-        {0x01, 0x01, 0x66, 0x00}, {0x16, 0x01, 0x66, 0x01},[m
[31m-        {0x01, 0x01, 0x67, 0x00}, {0x16, 0x01, 0x67, 0x01},[m
[31m-        {0x01, 0x01, 0x68, 0x00}, {0x16, 0x01, 0x68, 0x01}[m
[31m-    },[m
[31m-    /* 25 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x3d, 0x00}, {0x09, 0x01, 0x3d, 0x00},[m
[31m-        {0x17, 0x01, 0x3d, 0x00}, {0x28, 0x01, 0x3d, 0x01},[m
[31m-        {0x02, 0x01, 0x41, 0x00}, {0x09, 0x01, 0x41, 0x00},[m
[31m-        {0x17, 0x01, 0x41, 0x00}, {0x28, 0x01, 0x41, 0x01},[m
[31m-        {0x02, 0x01, 0x5f, 0x00}, {0x09, 0x01, 0x5f, 0x00},[m
[31m-        {0x17, 0x01, 0x5f, 0x00}, {0x28, 0x01, 0x5f, 0x01},[m
[31m-        {0x02, 0x01, 0x62, 0x00}, {0x09, 0x01, 0x62, 0x00},[m
[31m-        {0x17, 0x01, 0x62, 0x00}, {0x28, 0x01, 0x62, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x3d, 0x00}, {0x06, 0x01, 0x3d, 0x00},[m
[31m-        {0x0a, 0x01, 0x3d, 0x00}, {0x0f, 0x01, 0x3d, 0x00},[m
[31m-        {0x18, 0x01, 0x3d, 0x00}, {0x1f, 0x01, 0x3d, 0x00},[m
[31m-        {0x29, 0x01, 0x3d, 0x00}, {0x38, 0x01, 0x3d, 0x01},[m
[31m-        {0x03, 0x01, 0x41, 0x00}, {0x06, 0x01, 0x41, 0x00},[m
[31m-        {0x0a, 0x01, 0x41, 0x00}, {0x0f, 0x01, 0x41, 0x00},[m
[31m-        {0x18, 0x01, 0x41, 0x00}, {0x1f, 0x01, 0x41, 0x00},[m
[31m-        {0x29, 0x01, 0x41, 0x00}, {0x38, 0x01, 0x41, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x5f, 0x00}, {0x06, 0x01, 0x5f, 0x00},[m
[31m-        {0x0a, 0x01, 0x5f, 0x00}, {0x0f, 0x01, 0x5f, 0x00},[m
[31m-        {0x18, 0x01, 0x5f, 0x00}, {0x1f, 0x01, 0x5f, 0x00},[m
[31m-        {0x29, 0x01, 0x5f, 0x00}, {0x38, 0x01, 0x5f, 0x01},[m
[31m-        {0x03, 0x01, 0x62, 0x00}, {0x06, 0x01, 0x62, 0x00},[m
[31m-        {0x0a, 0x01, 0x62, 0x00}, {0x0f, 0x01, 0x62, 0x00},[m
[31m-        {0x18, 0x01, 0x62, 0x00}, {0x1f, 0x01, 0x62, 0x00},[m
[31m-        {0x29, 0x01, 0x62, 0x00}, {0x38, 0x01, 0x62, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x64, 0x00}, {0x09, 0x01, 0x64, 0x00},[m
[31m-        {0x17, 0x01, 0x64, 0x00}, {0x28, 0x01, 0x64, 0x01},[m
[31m-        {0x02, 0x01, 0x66, 0x00}, {0x09, 0x01, 0x66, 0x00},[m
[31m-        {0x17, 0x01, 0x66, 0x00}, {0x28, 0x01, 0x66, 0x01},[m
[31m-        {0x02, 0x01, 0x67, 0x00}, {0x09, 0x01, 0x67, 0x00},[m
[31m-        {0x17, 0x01, 0x67, 0x00}, {0x28, 0x01, 0x67, 0x01},[m
[31m-        {0x02, 0x01, 0x68, 0x00}, {0x09, 0x01, 0x68, 0x00},[m
[31m-        {0x17, 0x01, 0x68, 0x00}, {0x28, 0x01, 0x68, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x64, 0x00}, {0x06, 0x01, 0x64, 0x00},[m
[31m-        {0x0a, 0x01, 0x64, 0x00}, {0x0f, 0x01, 0x64, 0x00},[m
[31m-        {0x18, 0x01, 0x64, 0x00}, {0x1f, 0x01, 0x64, 0x00},[m
[31m-        {0x29, 0x01, 0x64, 0x00}, {0x38, 0x01, 0x64, 0x01},[m
[31m-        {0x03, 0x01, 0x66, 0x00}, {0x06, 0x01, 0x66, 0x00},[m
[31m-        {0x0a, 0x01, 0x66, 0x00}, {0x0f, 0x01, 0x66, 0x00},[m
[31m-        {0x18, 0x01, 0x66, 0x00}, {0x1f, 0x01, 0x66, 0x00},[m
[31m-        {0x29, 0x01, 0x66, 0x00}, {0x38, 0x01, 0x66, 0x01}[m
[31m-    },[m
[31m-    /* 30 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x67, 0x00}, {0x06, 0x01, 0x67, 0x00},[m
[31m-        {0x0a, 0x01, 0x67, 0x00}, {0x0f, 0x01, 0x67, 0x00},[m
[31m-        {0x18, 0x01, 0x67, 0x00}, {0x1f, 0x01, 0x67, 0x00},[m
[31m-        {0x29, 0x01, 0x67, 0x00}, {0x38, 0x01, 0x67, 0x01},[m
[31m-        {0x03, 0x01, 0x68, 0x00}, {0x06, 0x01, 0x68, 0x00},[m
[31m-        {0x0a, 0x01, 0x68, 0x00}, {0x0f, 0x01, 0x68, 0x00},[m
[31m-        {0x18, 0x01, 0x68, 0x00}, {0x1f, 0x01, 0x68, 0x00},[m
[31m-        {0x29, 0x01, 0x68, 0x00}, {0x38, 0x01, 0x68, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x6c, 0x00}, {0x16, 0x01, 0x6c, 0x01},[m
[31m-        {0x01, 0x01, 0x6d, 0x00}, {0x16, 0x01, 0x6d, 0x01},[m
[31m-        {0x01, 0x01, 0x6e, 0x00}, {0x16, 0x01, 0x6e, 0x01},[m
[31m-        {0x01, 0x01, 0x70, 0x00}, {0x16, 0x01, 0x70, 0x01},[m
[31m-        {0x01, 0x01, 0x72, 0x00}, {0x16, 0x01, 0x72, 0x01},[m
[31m-        {0x01, 0x01, 0x75, 0x00}, {0x16, 0x01, 0x75, 0x01},[m
[31m-        {0x00, 0x01, 0x3a, 0x01}, {0x00, 0x01, 0x42, 0x01},[m
[31m-        {0x00, 0x01, 0x43, 0x01}, {0x00, 0x01, 0x44, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x6c, 0x00}, {0x09, 0x01, 0x6c, 0x00},[m
[31m-        {0x17, 0x01, 0x6c, 0x00}, {0x28, 0x01, 0x6c, 0x01},[m
[31m-        {0x02, 0x01, 0x6d, 0x00}, {0x09, 0x01, 0x6d, 0x00},[m
[31m-        {0x17, 0x01, 0x6d, 0x00}, {0x28, 0x01, 0x6d, 0x01},[m
[31m-        {0x02, 0x01, 0x6e, 0x00}, {0x09, 0x01, 0x6e, 0x00},[m
[31m-        {0x17, 0x01, 0x6e, 0x00}, {0x28, 0x01, 0x6e, 0x01},[m
[31m-        {0x02, 0x01, 0x70, 0x00}, {0x09, 0x01, 0x70, 0x00},[m
[31m-        {0x17, 0x01, 0x70, 0x00}, {0x28, 0x01, 0x70, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x6c, 0x00}, {0x06, 0x01, 0x6c, 0x00},[m
[31m-        {0x0a, 0x01, 0x6c, 0x00}, {0x0f, 0x01, 0x6c, 0x00},[m
[31m-        {0x18, 0x01, 0x6c, 0x00}, {0x1f, 0x01, 0x6c, 0x00},[m
[31m-        {0x29, 0x01, 0x6c, 0x00}, {0x38, 0x01, 0x6c, 0x01},[m
[31m-        {0x03, 0x01, 0x6d, 0x00}, {0x06, 0x01, 0x6d, 0x00},[m
[31m-        {0x0a, 0x01, 0x6d, 0x00}, {0x0f, 0x01, 0x6d, 0x00},[m
[31m-        {0x18, 0x01, 0x6d, 0x00}, {0x1f, 0x01, 0x6d, 0x00},[m
[31m-        {0x29, 0x01, 0x6d, 0x00}, {0x38, 0x01, 0x6d, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x6e, 0x00}, {0x06, 0x01, 0x6e, 0x00},[m
[31m-        {0x0a, 0x01, 0x6e, 0x00}, {0x0f, 0x01, 0x6e, 0x00},[m
[31m-        {0x18, 0x01, 0x6e, 0x00}, {0x1f, 0x01, 0x6e, 0x00},[m
[31m-        {0x29, 0x01, 0x6e, 0x00}, {0x38, 0x01, 0x6e, 0x01},[m
[31m-        {0x03, 0x01, 0x70, 0x00}, {0x06, 0x01, 0x70, 0x00},[m
[31m-        {0x0a, 0x01, 0x70, 0x00}, {0x0f, 0x01, 0x70, 0x00},[m
[31m-        {0x18, 0x01, 0x70, 0x00}, {0x1f, 0x01, 0x70, 0x00},[m
[31m-        {0x29, 0x01, 0x70, 0x00}, {0x38, 0x01, 0x70, 0x01}[m
[31m-    },[m
[31m-    /* 35 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x72, 0x00}, {0x09, 0x01, 0x72, 0x00},[m
[31m-        {0x17, 0x01, 0x72, 0x00}, {0x28, 0x01, 0x72, 0x01},[m
[31m-        {0x02, 0x01, 0x75, 0x00}, {0x09, 0x01, 0x75, 0x00},[m
[31m-        {0x17, 0x01, 0x75, 0x00}, {0x28, 0x01, 0x75, 0x01},[m
[31m-        {0x01, 0x01, 0x3a, 0x00}, {0x16, 0x01, 0x3a, 0x01},[m
[31m-        {0x01, 0x01, 0x42, 0x00}, {0x16, 0x01, 0x42, 0x01},[m
[31m-        {0x01, 0x01, 0x43, 0x00}, {0x16, 0x01, 0x43, 0x01},[m
[31m-        {0x01, 0x01, 0x44, 0x00}, {0x16, 0x01, 0x44, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x72, 0x00}, {0x06, 0x01, 0x72, 0x00},[m
[31m-        {0x0a, 0x01, 0x72, 0x00}, {0x0f, 0x01, 0x72, 0x00},[m
[31m-        {0x18, 0x01, 0x72, 0x00}, {0x1f, 0x01, 0x72, 0x00},[m
[31m-        {0x29, 0x01, 0x72, 0x00}, {0x38, 0x01, 0x72, 0x01},[m
[31m-        {0x03, 0x01, 0x75, 0x00}, {0x06, 0x01, 0x75, 0x00},[m
[31m-        {0x0a, 0x01, 0x75, 0x00}, {0x0f, 0x01, 0x75, 0x00},[m
[31m-        {0x18, 0x01, 0x75, 0x00}, {0x1f, 0x01, 0x75, 0x00},[m
[31m-        {0x29, 0x01, 0x75, 0x00}, {0x38, 0x01, 0x75, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x3a, 0x00}, {0x09, 0x01, 0x3a, 0x00},[m
[31m-        {0x17, 0x01, 0x3a, 0x00}, {0x28, 0x01, 0x3a, 0x01},[m
[31m-        {0x02, 0x01, 0x42, 0x00}, {0x09, 0x01, 0x42, 0x00},[m
[31m-        {0x17, 0x01, 0x42, 0x00}, {0x28, 0x01, 0x42, 0x01},[m
[31m-        {0x02, 0x01, 0x43, 0x00}, {0x09, 0x01, 0x43, 0x00},[m
[31m-        {0x17, 0x01, 0x43, 0x00}, {0x28, 0x01, 0x43, 0x01},[m
[31m-        {0x02, 0x01, 0x44, 0x00}, {0x09, 0x01, 0x44, 0x00},[m
[31m-        {0x17, 0x01, 0x44, 0x00}, {0x28, 0x01, 0x44, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x3a, 0x00}, {0x06, 0x01, 0x3a, 0x00},[m
[31m-        {0x0a, 0x01, 0x3a, 0x00}, {0x0f, 0x01, 0x3a, 0x00},[m
[31m-        {0x18, 0x01, 0x3a, 0x00}, {0x1f, 0x01, 0x3a, 0x00},[m
[31m-        {0x29, 0x01, 0x3a, 0x00}, {0x38, 0x01, 0x3a, 0x01},[m
[31m-        {0x03, 0x01, 0x42, 0x00}, {0x06, 0x01, 0x42, 0x00},[m
[31m-        {0x0a, 0x01, 0x42, 0x00}, {0x0f, 0x01, 0x42, 0x00},[m
[31m-        {0x18, 0x01, 0x42, 0x00}, {0x1f, 0x01, 0x42, 0x00},[m
[31m-        {0x29, 0x01, 0x42, 0x00}, {0x38, 0x01, 0x42, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x43, 0x00}, {0x06, 0x01, 0x43, 0x00},[m
[31m-        {0x0a, 0x01, 0x43, 0x00}, {0x0f, 0x01, 0x43, 0x00},[m
[31m-        {0x18, 0x01, 0x43, 0x00}, {0x1f, 0x01, 0x43, 0x00},[m
[31m-        {0x29, 0x01, 0x43, 0x00}, {0x38, 0x01, 0x43, 0x01},[m
[31m-        {0x03, 0x01, 0x44, 0x00}, {0x06, 0x01, 0x44, 0x00},[m
[31m-        {0x0a, 0x01, 0x44, 0x00}, {0x0f, 0x01, 0x44, 0x00},[m
[31m-        {0x18, 0x01, 0x44, 0x00}, {0x1f, 0x01, 0x44, 0x00},[m
[31m-        {0x29, 0x01, 0x44, 0x00}, {0x38, 0x01, 0x44, 0x01}[m
[31m-    },[m
[31m-    /* 40 */[m
[31m-    {[m
[31m-        {0x2c, 0x00, 0x00, 0x00}, {0x2d, 0x00, 0x00, 0x00},[m
[31m-        {0x2f, 0x00, 0x00, 0x00}, {0x30, 0x00, 0x00, 0x00},[m
[31m-        {0x33, 0x00, 0x00, 0x00}, {0x34, 0x00, 0x00, 0x00},[m
[31m-        {0x36, 0x00, 0x00, 0x00}, {0x37, 0x00, 0x00, 0x00},[m
[31m-        {0x3b, 0x00, 0x00, 0x00}, {0x3c, 0x00, 0x00, 0x00},[m
[31m-        {0x3e, 0x00, 0x00, 0x00}, {0x3f, 0x00, 0x00, 0x00},[m
[31m-        {0x42, 0x00, 0x00, 0x00}, {0x43, 0x00, 0x00, 0x00},[m
[31m-        {0x45, 0x00, 0x00, 0x00}, {0x48, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x45, 0x01}, {0x00, 0x01, 0x46, 0x01},[m
[31m-        {0x00, 0x01, 0x47, 0x01}, {0x00, 0x01, 0x48, 0x01},[m
[31m-        {0x00, 0x01, 0x49, 0x01}, {0x00, 0x01, 0x4a, 0x01},[m
[31m-        {0x00, 0x01, 0x4b, 0x01}, {0x00, 0x01, 0x4c, 0x01},[m
[31m-        {0x00, 0x01, 0x4d, 0x01}, {0x00, 0x01, 0x4e, 0x01},[m
[31m-        {0x00, 0x01, 0x4f, 0x01}, {0x00, 0x01, 0x50, 0x01},[m
[31m-        {0x00, 0x01, 0x51, 0x01}, {0x00, 0x01, 0x52, 0x01},[m
[31m-        {0x00, 0x01, 0x53, 0x01}, {0x00, 0x01, 0x54, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x45, 0x00}, {0x16, 0x01, 0x45, 0x01},[m
[31m-        {0x01, 0x01, 0x46, 0x00}, {0x16, 0x01, 0x46, 0x01},[m
[31m-        {0x01, 0x01, 0x47, 0x00}, {0x16, 0x01, 0x47, 0x01},[m
[31m-        {0x01, 0x01, 0x48, 0x00}, {0x16, 0x01, 0x48, 0x01},[m
[31m-        {0x01, 0x01, 0x49, 0x00}, {0x16, 0x01, 0x49, 0x01},[m
[31m-        {0x01, 0x01, 0x4a, 0x00}, {0x16, 0x01, 0x4a, 0x01},[m
[31m-        {0x01, 0x01, 0x4b, 0x00}, {0x16, 0x01, 0x4b, 0x01},[m
[31m-        {0x01, 0x01, 0x4c, 0x00}, {0x16, 0x01, 0x4c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x45, 0x00}, {0x09, 0x01, 0x45, 0x00},[m
[31m-        {0x17, 0x01, 0x45, 0x00}, {0x28, 0x01, 0x45, 0x01},[m
[31m-        {0x02, 0x01, 0x46, 0x00}, {0x09, 0x01, 0x46, 0x00},[m
[31m-        {0x17, 0x01, 0x46, 0x00}, {0x28, 0x01, 0x46, 0x01},[m
[31m-        {0x02, 0x01, 0x47, 0x00}, {0x09, 0x01, 0x47, 0x00},[m
[31m-        {0x17, 0x01, 0x47, 0x00}, {0x28, 0x01, 0x47, 0x01},[m
[31m-        {0x02, 0x01, 0x48, 0x00}, {0x09, 0x01, 0x48, 0x00},[m
[31m-        {0x17, 0x01, 0x48, 0x00}, {0x28, 0x01, 0x48, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x45, 0x00}, {0x06, 0x01, 0x45, 0x00},[m
[31m-        {0x0a, 0x01, 0x45, 0x00}, {0x0f, 0x01, 0x45, 0x00},[m
[31m-        {0x18, 0x01, 0x45, 0x00}, {0x1f, 0x01, 0x45, 0x00},[m
[31m-        {0x29, 0x01, 0x45, 0x00}, {0x38, 0x01, 0x45, 0x01},[m
[31m-        {0x03, 0x01, 0x46, 0x00}, {0x06, 0x01, 0x46, 0x00},[m
[31m-        {0x0a, 0x01, 0x46, 0x00}, {0x0f, 0x01, 0x46, 0x00},[m
[31m-        {0x18, 0x01, 0x46, 0x00}, {0x1f, 0x01, 0x46, 0x00},[m
[31m-        {0x29, 0x01, 0x46, 0x00}, {0x38, 0x01, 0x46, 0x01}[m
[31m-    },[m
[31m-    /* 45 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x47, 0x00}, {0x06, 0x01, 0x47, 0x00},[m
[31m-        {0x0a, 0x01, 0x47, 0x00}, {0x0f, 0x01, 0x47, 0x00},[m
[31m-        {0x18, 0x01, 0x47, 0x00}, {0x1f, 0x01, 0x47, 0x00},[m
[31m-        {0x29, 0x01, 0x47, 0x00}, {0x38, 0x01, 0x47, 0x01},[m
[31m-        {0x03, 0x01, 0x48, 0x00}, {0x06, 0x01, 0x48, 0x00},[m
[31m-        {0x0a, 0x01, 0x48, 0x00}, {0x0f, 0x01, 0x48, 0x00},[m
[31m-        {0x18, 0x01, 0x48, 0x00}, {0x1f, 0x01, 0x48, 0x00},[m
[31m-        {0x29, 0x01, 0x48, 0x00}, {0x38, 0x01, 0x48, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x49, 0x00}, {0x09, 0x01, 0x49, 0x00},[m
[31m-        {0x17, 0x01, 0x49, 0x00}, {0x28, 0x01, 0x49, 0x01},[m
[31m-        {0x02, 0x01, 0x4a, 0x00}, {0x09, 0x01, 0x4a, 0x00},[m
[31m-        {0x17, 0x01, 0x4a, 0x00}, {0x28, 0x01, 0x4a, 0x01},[m
[31m-        {0x02, 0x01, 0x4b, 0x00}, {0x09, 0x01, 0x4b, 0x00},[m
[31m-        {0x17, 0x01, 0x4b, 0x00}, {0x28, 0x01, 0x4b, 0x01},[m
[31m-        {0x02, 0x01, 0x4c, 0x00}, {0x09, 0x01, 0x4c, 0x00},[m
[31m-        {0x17, 0x01, 0x4c, 0x00}, {0x28, 0x01, 0x4c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x49, 0x00}, {0x06, 0x01, 0x49, 0x00},[m
[31m-        {0x0a, 0x01, 0x49, 0x00}, {0x0f, 0x01, 0x49, 0x00},[m
[31m-        {0x18, 0x01, 0x49, 0x00}, {0x1f, 0x01, 0x49, 0x00},[m
[31m-        {0x29, 0x01, 0x49, 0x00}, {0x38, 0x01, 0x49, 0x01},[m
[31m-        {0x03, 0x01, 0x4a, 0x00}, {0x06, 0x01, 0x4a, 0x00},[m
[31m-        {0x0a, 0x01, 0x4a, 0x00}, {0x0f, 0x01, 0x4a, 0x00},[m
[31m-        {0x18, 0x01, 0x4a, 0x00}, {0x1f, 0x01, 0x4a, 0x00},[m
[31m-        {0x29, 0x01, 0x4a, 0x00}, {0x38, 0x01, 0x4a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x4b, 0x00}, {0x06, 0x01, 0x4b, 0x00},[m
[31m-        {0x0a, 0x01, 0x4b, 0x00}, {0x0f, 0x01, 0x4b, 0x00},[m
[31m-        {0x18, 0x01, 0x4b, 0x00}, {0x1f, 0x01, 0x4b, 0x00},[m
[31m-        {0x29, 0x01, 0x4b, 0x00}, {0x38, 0x01, 0x4b, 0x01},[m
[31m-        {0x03, 0x01, 0x4c, 0x00}, {0x06, 0x01, 0x4c, 0x00},[m
[31m-        {0x0a, 0x01, 0x4c, 0x00}, {0x0f, 0x01, 0x4c, 0x00},[m
[31m-        {0x18, 0x01, 0x4c, 0x00}, {0x1f, 0x01, 0x4c, 0x00},[m
[31m-        {0x29, 0x01, 0x4c, 0x00}, {0x38, 0x01, 0x4c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x4d, 0x00}, {0x16, 0x01, 0x4d, 0x01},[m
[31m-        {0x01, 0x01, 0x4e, 0x00}, {0x16, 0x01, 0x4e, 0x01},[m
[31m-        {0x01, 0x01, 0x4f, 0x00}, {0x16, 0x01, 0x4f, 0x01},[m
[31m-        {0x01, 0x01, 0x50, 0x00}, {0x16, 0x01, 0x50, 0x01},[m
[31m-        {0x01, 0x01, 0x51, 0x00}, {0x16, 0x01, 0x51, 0x01},[m
[31m-        {0x01, 0x01, 0x52, 0x00}, {0x16, 0x01, 0x52, 0x01},[m
[31m-        {0x01, 0x01, 0x53, 0x00}, {0x16, 0x01, 0x53, 0x01},[m
[31m-        {0x01, 0x01, 0x54, 0x00}, {0x16, 0x01, 0x54, 0x01}[m
[31m-    },[m
[31m-    /* 50 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x4d, 0x00}, {0x09, 0x01, 0x4d, 0x00},[m
[31m-        {0x17, 0x01, 0x4d, 0x00}, {0x28, 0x01, 0x4d, 0x01},[m
[31m-        {0x02, 0x01, 0x4e, 0x00}, {0x09, 0x01, 0x4e, 0x00},[m
[31m-        {0x17, 0x01, 0x4e, 0x00}, {0x28, 0x01, 0x4e, 0x01},[m
[31m-        {0x02, 0x01, 0x4f, 0x00}, {0x09, 0x01, 0x4f, 0x00},[m
[31m-        {0x17, 0x01, 0x4f, 0x00}, {0x28, 0x01, 0x4f, 0x01},[m
[31m-        {0x02, 0x01, 0x50, 0x00}, {0x09, 0x01, 0x50, 0x00},[m
[31m-        {0x17, 0x01, 0x50, 0x00}, {0x28, 0x01, 0x50, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x4d, 0x00}, {0x06, 0x01, 0x4d, 0x00},[m
[31m-        {0x0a, 0x01, 0x4d, 0x00}, {0x0f, 0x01, 0x4d, 0x00},[m
[31m-        {0x18, 0x01, 0x4d, 0x00}, {0x1f, 0x01, 0x4d, 0x00},[m
[31m-        {0x29, 0x01, 0x4d, 0x00}, {0x38, 0x01, 0x4d, 0x01},[m
[31m-        {0x03, 0x01, 0x4e, 0x00}, {0x06, 0x01, 0x4e, 0x00},[m
[31m-        {0x0a, 0x01, 0x4e, 0x00}, {0x0f, 0x01, 0x4e, 0x00},[m
[31m-        {0x18, 0x01, 0x4e, 0x00}, {0x1f, 0x01, 0x4e, 0x00},[m
[31m-        {0x29, 0x01, 0x4e, 0x00}, {0x38, 0x01, 0x4e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x4f, 0x00}, {0x06, 0x01, 0x4f, 0x00},[m
[31m-        {0x0a, 0x01, 0x4f, 0x00}, {0x0f, 0x01, 0x4f, 0x00},[m
[31m-        {0x18, 0x01, 0x4f, 0x00}, {0x1f, 0x01, 0x4f, 0x00},[m
[31m-        {0x29, 0x01, 0x4f, 0x00}, {0x38, 0x01, 0x4f, 0x01},[m
[31m-        {0x03, 0x01, 0x50, 0x00}, {0x06, 0x01, 0x50, 0x00},[m
[31m-        {0x0a, 0x01, 0x50, 0x00}, {0x0f, 0x01, 0x50, 0x00},[m
[31m-        {0x18, 0x01, 0x50, 0x00}, {0x1f, 0x01, 0x50, 0x00},[m
[31m-        {0x29, 0x01, 0x50, 0x00}, {0x38, 0x01, 0x50, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x51, 0x00}, {0x09, 0x01, 0x51, 0x00},[m
[31m-        {0x17, 0x01, 0x51, 0x00}, {0x28, 0x01, 0x51, 0x01},[m
[31m-        {0x02, 0x01, 0x52, 0x00}, {0x09, 0x01, 0x52, 0x00},[m
[31m-        {0x17, 0x01, 0x52, 0x00}, {0x28, 0x01, 0x52, 0x01},[m
[31m-        {0x02, 0x01, 0x53, 0x00}, {0x09, 0x01, 0x53, 0x00},[m
[31m-        {0x17, 0x01, 0x53, 0x00}, {0x28, 0x01, 0x53, 0x01},[m
[31m-        {0x02, 0x01, 0x54, 0x00}, {0x09, 0x01, 0x54, 0x00},[m
[31m-        {0x17, 0x01, 0x54, 0x00}, {0x28, 0x01, 0x54, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x51, 0x00}, {0x06, 0x01, 0x51, 0x00},[m
[31m-        {0x0a, 0x01, 0x51, 0x00}, {0x0f, 0x01, 0x51, 0x00},[m
[31m-        {0x18, 0x01, 0x51, 0x00}, {0x1f, 0x01, 0x51, 0x00},[m
[31m-        {0x29, 0x01, 0x51, 0x00}, {0x38, 0x01, 0x51, 0x01},[m
[31m-        {0x03, 0x01, 0x52, 0x00}, {0x06, 0x01, 0x52, 0x00},[m
[31m-        {0x0a, 0x01, 0x52, 0x00}, {0x0f, 0x01, 0x52, 0x00},[m
[31m-        {0x18, 0x01, 0x52, 0x00}, {0x1f, 0x01, 0x52, 0x00},[m
[31m-        {0x29, 0x01, 0x52, 0x00}, {0x38, 0x01, 0x52, 0x01}[m
[31m-    },[m
[31m-    /* 55 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x53, 0x00}, {0x06, 0x01, 0x53, 0x00},[m
[31m-        {0x0a, 0x01, 0x53, 0x00}, {0x0f, 0x01, 0x53, 0x00},[m
[31m-        {0x18, 0x01, 0x53, 0x00}, {0x1f, 0x01, 0x53, 0x00},[m
[31m-        {0x29, 0x01, 0x53, 0x00}, {0x38, 0x01, 0x53, 0x01},[m
[31m-        {0x03, 0x01, 0x54, 0x00}, {0x06, 0x01, 0x54, 0x00},[m
[31m-        {0x0a, 0x01, 0x54, 0x00}, {0x0f, 0x01, 0x54, 0x00},[m
[31m-        {0x18, 0x01, 0x54, 0x00}, {0x1f, 0x01, 0x54, 0x00},[m
[31m-        {0x29, 0x01, 0x54, 0x00}, {0x38, 0x01, 0x54, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x55, 0x01}, {0x00, 0x01, 0x56, 0x01},[m
[31m-        {0x00, 0x01, 0x57, 0x01}, {0x00, 0x01, 0x59, 0x01},[m
[31m-        {0x00, 0x01, 0x6a, 0x01}, {0x00, 0x01, 0x6b, 0x01},[m
[31m-        {0x00, 0x01, 0x71, 0x01}, {0x00, 0x01, 0x76, 0x01},[m
[31m-        {0x00, 0x01, 0x77, 0x01}, {0x00, 0x01, 0x78, 0x01},[m
[31m-        {0x00, 0x01, 0x79, 0x01}, {0x00, 0x01, 0x7a, 0x01},[m
[31m-        {0x46, 0x00, 0x00, 0x00}, {0x47, 0x00, 0x00, 0x00},[m
[31m-        {0x49, 0x00, 0x00, 0x00}, {0x4a, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x55, 0x00}, {0x16, 0x01, 0x55, 0x01},[m
[31m-        {0x01, 0x01, 0x56, 0x00}, {0x16, 0x01, 0x56, 0x01},[m
[31m-        {0x01, 0x01, 0x57, 0x00}, {0x16, 0x01, 0x57, 0x01},[m
[31m-        {0x01, 0x01, 0x59, 0x00}, {0x16, 0x01, 0x59, 0x01},[m
[31m-        {0x01, 0x01, 0x6a, 0x00}, {0x16, 0x01, 0x6a, 0x01},[m
[31m-        {0x01, 0x01, 0x6b, 0x00}, {0x16, 0x01, 0x6b, 0x01},[m
[31m-        {0x01, 0x01, 0x71, 0x00}, {0x16, 0x01, 0x71, 0x01},[m
[31m-        {0x01, 0x01, 0x76, 0x00}, {0x16, 0x01, 0x76, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x55, 0x00}, {0x09, 0x01, 0x55, 0x00},[m
[31m-        {0x17, 0x01, 0x55, 0x00}, {0x28, 0x01, 0x55, 0x01},[m
[31m-        {0x02, 0x01, 0x56, 0x00}, {0x09, 0x01, 0x56, 0x00},[m
[31m-        {0x17, 0x01, 0x56, 0x00}, {0x28, 0x01, 0x56, 0x01},[m
[31m-        {0x02, 0x01, 0x57, 0x00}, {0x09, 0x01, 0x57, 0x00},[m
[31m-        {0x17, 0x01, 0x57, 0x00}, {0x28, 0x01, 0x57, 0x01},[m
[31m-        {0x02, 0x01, 0x59, 0x00}, {0x09, 0x01, 0x59, 0x00},[m
[31m-        {0x17, 0x01, 0x59, 0x00}, {0x28, 0x01, 0x59, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x55, 0x00}, {0x06, 0x01, 0x55, 0x00},[m
[31m-        {0x0a, 0x01, 0x55, 0x00}, {0x0f, 0x01, 0x55, 0x00},[m
[31m-        {0x18, 0x01, 0x55, 0x00}, {0x1f, 0x01, 0x55, 0x00},[m
[31m-        {0x29, 0x01, 0x55, 0x00}, {0x38, 0x01, 0x55, 0x01},[m
[31m-        {0x03, 0x01, 0x56, 0x00}, {0x06, 0x01, 0x56, 0x00},[m
[31m-        {0x0a, 0x01, 0x56, 0x00}, {0x0f, 0x01, 0x56, 0x00},[m
[31m-        {0x18, 0x01, 0x56, 0x00}, {0x1f, 0x01, 0x56, 0x00},[m
[31m-        {0x29, 0x01, 0x56, 0x00}, {0x38, 0x01, 0x56, 0x01}[m
[31m-    },[m
[31m-    /* 60 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x57, 0x00}, {0x06, 0x01, 0x57, 0x00},[m
[31m-        {0x0a, 0x01, 0x57, 0x00}, {0x0f, 0x01, 0x57, 0x00},[m
[31m-        {0x18, 0x01, 0x57, 0x00}, {0x1f, 0x01, 0x57, 0x00},[m
[31m-        {0x29, 0x01, 0x57, 0x00}, {0x38, 0x01, 0x57, 0x01},[m
[31m-        {0x03, 0x01, 0x59, 0x00}, {0x06, 0x01, 0x59, 0x00},[m
[31m-        {0x0a, 0x01, 0x59, 0x00}, {0x0f, 0x01, 0x59, 0x00},[m
[31m-        {0x18, 0x01, 0x59, 0x00}, {0x1f, 0x01, 0x59, 0x00},[m
[31m-        {0x29, 0x01, 0x59, 0x00}, {0x38, 0x01, 0x59, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x6a, 0x00}, {0x09, 0x01, 0x6a, 0x00},[m
[31m-        {0x17, 0x01, 0x6a, 0x00}, {0x28, 0x01, 0x6a, 0x01},[m
[31m-        {0x02, 0x01, 0x6b, 0x00}, {0x09, 0x01, 0x6b, 0x00},[m
[31m-        {0x17, 0x01, 0x6b, 0x00}, {0x28, 0x01, 0x6b, 0x01},[m
[31m-        {0x02, 0x01, 0x71, 0x00}, {0x09, 0x01, 0x71, 0x00},[m
[31m-        {0x17, 0x01, 0x71, 0x00}, {0x28, 0x01, 0x71, 0x01},[m
[31m-        {0x02, 0x01, 0x76, 0x00}, {0x09, 0x01, 0x76, 0x00},[m
[31m-        {0x17, 0x01, 0x76, 0x00}, {0x28, 0x01, 0x76, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x6a, 0x00}, {0x06, 0x01, 0x6a, 0x00},[m
[31m-        {0x0a, 0x01, 0x6a, 0x00}, {0x0f, 0x01, 0x6a, 0x00},[m
[31m-        {0x18, 0x01, 0x6a, 0x00}, {0x1f, 0x01, 0x6a, 0x00},[m
[31m-        {0x29, 0x01, 0x6a, 0x00}, {0x38, 0x01, 0x6a, 0x01},[m
[31m-        {0x03, 0x01, 0x6b, 0x00}, {0x06, 0x01, 0x6b, 0x00},[m
[31m-        {0x0a, 0x01, 0x6b, 0x00}, {0x0f, 0x01, 0x6b, 0x00},[m
[31m-        {0x18, 0x01, 0x6b, 0x00}, {0x1f, 0x01, 0x6b, 0x00},[m
[31m-        {0x29, 0x01, 0x6b, 0x00}, {0x38, 0x01, 0x6b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x71, 0x00}, {0x06, 0x01, 0x71, 0x00},[m
[31m-        {0x0a, 0x01, 0x71, 0x00}, {0x0f, 0x01, 0x71, 0x00},[m
[31m-        {0x18, 0x01, 0x71, 0x00}, {0x1f, 0x01, 0x71, 0x00},[m
[31m-        {0x29, 0x01, 0x71, 0x00}, {0x38, 0x01, 0x71, 0x01},[m
[31m-        {0x03, 0x01, 0x76, 0x00}, {0x06, 0x01, 0x76, 0x00},[m
[31m-        {0x0a, 0x01, 0x76, 0x00}, {0x0f, 0x01, 0x76, 0x00},[m
[31m-        {0x18, 0x01, 0x76, 0x00}, {0x1f, 0x01, 0x76, 0x00},[m
[31m-        {0x29, 0x01, 0x76, 0x00}, {0x38, 0x01, 0x76, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x77, 0x00}, {0x16, 0x01, 0x77, 0x01},[m
[31m-        {0x01, 0x01, 0x78, 0x00}, {0x16, 0x01, 0x78, 0x01},[m
[31m-        {0x01, 0x01, 0x79, 0x00}, {0x16, 0x01, 0x79, 0x01},[m
[31m-        {0x01, 0x01, 0x7a, 0x00}, {0x16, 0x01, 0x7a, 0x01},[m
[31m-        {0x00, 0x01, 0x26, 0x01}, {0x00, 0x01, 0x2a, 0x01},[m
[31m-        {0x00, 0x01, 0x2c, 0x01}, {0x00, 0x01, 0x3b, 0x01},[m
[31m-        {0x00, 0x01, 0x58, 0x01}, {0x00, 0x01, 0x5a, 0x01},[m
[31m-        {0x4b, 0x00, 0x00, 0x00}, {0x4e, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 65 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x77, 0x00}, {0x09, 0x01, 0x77, 0x00},[m
[31m-        {0x17, 0x01, 0x77, 0x00}, {0x28, 0x01, 0x77, 0x01},[m
[31m-        {0x02, 0x01, 0x78, 0x00}, {0x09, 0x01, 0x78, 0x00},[m
[31m-        {0x17, 0x01, 0x78, 0x00}, {0x28, 0x01, 0x78, 0x01},[m
[31m-        {0x02, 0x01, 0x79, 0x00}, {0x09, 0x01, 0x79, 0x00},[m
[31m-        {0x17, 0x01, 0x79, 0x00}, {0x28, 0x01, 0x79, 0x01},[m
[31m-        {0x02, 0x01, 0x7a, 0x00}, {0x09, 0x01, 0x7a, 0x00},[m
[31m-        {0x17, 0x01, 0x7a, 0x00}, {0x28, 0x01, 0x7a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x77, 0x00}, {0x06, 0x01, 0x77, 0x00},[m
[31m-        {0x0a, 0x01, 0x77, 0x00}, {0x0f, 0x01, 0x77, 0x00},[m
[31m-        {0x18, 0x01, 0x77, 0x00}, {0x1f, 0x01, 0x77, 0x00},[m
[31m-        {0x29, 0x01, 0x77, 0x00}, {0x38, 0x01, 0x77, 0x01},[m
[31m-        {0x03, 0x01, 0x78, 0x00}, {0x06, 0x01, 0x78, 0x00},[m
[31m-        {0x0a, 0x01, 0x78, 0x00}, {0x0f, 0x01, 0x78, 0x00},[m
[31m-        {0x18, 0x01, 0x78, 0x00}, {0x1f, 0x01, 0x78, 0x00},[m
[31m-        {0x29, 0x01, 0x78, 0x00}, {0x38, 0x01, 0x78, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x79, 0x00}, {0x06, 0x01, 0x79, 0x00},[m
[31m-        {0x0a, 0x01, 0x79, 0x00}, {0x0f, 0x01, 0x79, 0x00},[m
[31m-        {0x18, 0x01, 0x79, 0x00}, {0x1f, 0x01, 0x79, 0x00},[m
[31m-        {0x29, 0x01, 0x79, 0x00}, {0x38, 0x01, 0x79, 0x01},[m
[31m-        {0x03, 0x01, 0x7a, 0x00}, {0x06, 0x01, 0x7a, 0x00},[m
[31m-        {0x0a, 0x01, 0x7a, 0x00}, {0x0f, 0x01, 0x7a, 0x00},[m
[31m-        {0x18, 0x01, 0x7a, 0x00}, {0x1f, 0x01, 0x7a, 0x00},[m
[31m-        {0x29, 0x01, 0x7a, 0x00}, {0x38, 0x01, 0x7a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x26, 0x00}, {0x16, 0x01, 0x26, 0x01},[m
[31m-        {0x01, 0x01, 0x2a, 0x00}, {0x16, 0x01, 0x2a, 0x01},[m
[31m-        {0x01, 0x01, 0x2c, 0x00}, {0x16, 0x01, 0x2c, 0x01},[m
[31m-        {0x01, 0x01, 0x3b, 0x00}, {0x16, 0x01, 0x3b, 0x01},[m
[31m-        {0x01, 0x01, 0x58, 0x00}, {0x16, 0x01, 0x58, 0x01},[m
[31m-        {0x01, 0x01, 0x5a, 0x00}, {0x16, 0x01, 0x5a, 0x01},[m
[31m-        {0x4c, 0x00, 0x00, 0x00}, {0x4d, 0x00, 0x00, 0x00},[m
[31m-        {0x4f, 0x00, 0x00, 0x00}, {0x51, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x26, 0x00}, {0x09, 0x01, 0x26, 0x00},[m
[31m-        {0x17, 0x01, 0x26, 0x00}, {0x28, 0x01, 0x26, 0x01},[m
[31m-        {0x02, 0x01, 0x2a, 0x00}, {0x09, 0x01, 0x2a, 0x00},[m
[31m-        {0x17, 0x01, 0x2a, 0x00}, {0x28, 0x01, 0x2a, 0x01},[m
[31m-        {0x02, 0x01, 0x2c, 0x00}, {0x09, 0x01, 0x2c, 0x00},[m
[31m-        {0x17, 0x01, 0x2c, 0x00}, {0x28, 0x01, 0x2c, 0x01},[m
[31m-        {0x02, 0x01, 0x3b, 0x00}, {0x09, 0x01, 0x3b, 0x00},[m
[31m-        {0x17, 0x01, 0x3b, 0x00}, {0x28, 0x01, 0x3b, 0x01}[m
[31m-    },[m
[31m-    /* 70 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x26, 0x00}, {0x06, 0x01, 0x26, 0x00},[m
[31m-        {0x0a, 0x01, 0x26, 0x00}, {0x0f, 0x01, 0x26, 0x00},[m
[31m-        {0x18, 0x01, 0x26, 0x00}, {0x1f, 0x01, 0x26, 0x00},[m
[31m-        {0x29, 0x01, 0x26, 0x00}, {0x38, 0x01, 0x26, 0x01},[m
[31m-        {0x03, 0x01, 0x2a, 0x00}, {0x06, 0x01, 0x2a, 0x00},[m
[31m-        {0x0a, 0x01, 0x2a, 0x00}, {0x0f, 0x01, 0x2a, 0x00},[m
[31m-        {0x18, 0x01, 0x2a, 0x00}, {0x1f, 0x01, 0x2a, 0x00},[m
[31m-        {0x29, 0x01, 0x2a, 0x00}, {0x38, 0x01, 0x2a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x2c, 0x00}, {0x06, 0x01, 0x2c, 0x00},[m
[31m-        {0x0a, 0x01, 0x2c, 0x00}, {0x0f, 0x01, 0x2c, 0x00},[m
[31m-        {0x18, 0x01, 0x2c, 0x00}, {0x1f, 0x01, 0x2c, 0x00},[m
[31m-        {0x29, 0x01, 0x2c, 0x00}, {0x38, 0x01, 0x2c, 0x01},[m
[31m-        {0x03, 0x01, 0x3b, 0x00}, {0x06, 0x01, 0x3b, 0x00},[m
[31m-        {0x0a, 0x01, 0x3b, 0x00}, {0x0f, 0x01, 0x3b, 0x00},[m
[31m-        {0x18, 0x01, 0x3b, 0x00}, {0x1f, 0x01, 0x3b, 0x00},[m
[31m-        {0x29, 0x01, 0x3b, 0x00}, {0x38, 0x01, 0x3b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x58, 0x00}, {0x09, 0x01, 0x58, 0x00},[m
[31m-        {0x17, 0x01, 0x58, 0x00}, {0x28, 0x01, 0x58, 0x01},[m
[31m-        {0x02, 0x01, 0x5a, 0x00}, {0x09, 0x01, 0x5a, 0x00},[m
[31m-        {0x17, 0x01, 0x5a, 0x00}, {0x28, 0x01, 0x5a, 0x01},[m
[31m-        {0x00, 0x01, 0x21, 0x01}, {0x00, 0x01, 0x22, 0x01},[m
[31m-        {0x00, 0x01, 0x28, 0x01}, {0x00, 0x01, 0x29, 0x01},[m
[31m-        {0x00, 0x01, 0x3f, 0x01}, {0x50, 0x00, 0x00, 0x00},[m
[31m-        {0x52, 0x00, 0x00, 0x00}, {0x54, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x58, 0x00}, {0x06, 0x01, 0x58, 0x00},[m
[31m-        {0x0a, 0x01, 0x58, 0x00}, {0x0f, 0x01, 0x58, 0x00},[m
[31m-        {0x18, 0x01, 0x58, 0x00}, {0x1f, 0x01, 0x58, 0x00},[m
[31m-        {0x29, 0x01, 0x58, 0x00}, {0x38, 0x01, 0x58, 0x01},[m
[31m-        {0x03, 0x01, 0x5a, 0x00}, {0x06, 0x01, 0x5a, 0x00},[m
[31m-        {0x0a, 0x01, 0x5a, 0x00}, {0x0f, 0x01, 0x5a, 0x00},[m
[31m-        {0x18, 0x01, 0x5a, 0x00}, {0x1f, 0x01, 0x5a, 0x00},[m
[31m-        {0x29, 0x01, 0x5a, 0x00}, {0x38, 0x01, 0x5a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x21, 0x00}, {0x16, 0x01, 0x21, 0x01},[m
[31m-        {0x01, 0x01, 0x22, 0x00}, {0x16, 0x01, 0x22, 0x01},[m
[31m-        {0x01, 0x01, 0x28, 0x00}, {0x16, 0x01, 0x28, 0x01},[m
[31m-        {0x01, 0x01, 0x29, 0x00}, {0x16, 0x01, 0x29, 0x01},[m
[31m-        {0x01, 0x01, 0x3f, 0x00}, {0x16, 0x01, 0x3f, 0x01},[m
[31m-        {0x00, 0x01, 0x27, 0x01}, {0x00, 0x01, 0x2b, 0x01},[m
[31m-        {0x00, 0x01, 0x7c, 0x01}, {0x53, 0x00, 0x00, 0x00},[m
[31m-        {0x55, 0x00, 0x00, 0x00}, {0x58, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 75 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x21, 0x00}, {0x09, 0x01, 0x21, 0x00},[m
[31m-        {0x17, 0x01, 0x21, 0x00}, {0x28, 0x01, 0x21, 0x01},[m
[31m-        {0x02, 0x01, 0x22, 0x00}, {0x09, 0x01, 0x22, 0x00},[m
[31m-        {0x17, 0x01, 0x22, 0x00}, {0x28, 0x01, 0x22, 0x01},[m
[31m-        {0x02, 0x01, 0x28, 0x00}, {0x09, 0x01, 0x28, 0x00},[m
[31m-        {0x17, 0x01, 0x28, 0x00}, {0x28, 0x01, 0x28, 0x01},[m
[31m-        {0x02, 0x01, 0x29, 0x00}, {0x09, 0x01, 0x29, 0x00},[m
[31m-        {0x17, 0x01, 0x29, 0x00}, {0x28, 0x01, 0x29, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x21, 0x00}, {0x06, 0x01, 0x21, 0x00},[m
[31m-        {0x0a, 0x01, 0x21, 0x00}, {0x0f, 0x01, 0x21, 0x00},[m
[31m-        {0x18, 0x01, 0x21, 0x00}, {0x1f, 0x01, 0x21, 0x00},[m
[31m-        {0x29, 0x01, 0x21, 0x00}, {0x38, 0x01, 0x21, 0x01},[m
[31m-        {0x03, 0x01, 0x22, 0x00}, {0x06, 0x01, 0x22, 0x00},[m
[31m-        {0x0a, 0x01, 0x22, 0x00}, {0x0f, 0x01, 0x22, 0x00},[m
[31m-        {0x18, 0x01, 0x22, 0x00}, {0x1f, 0x01, 0x22, 0x00},[m
[31m-        {0x29, 0x01, 0x22, 0x00}, {0x38, 0x01, 0x22, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x28, 0x00}, {0x06, 0x01, 0x28, 0x00},[m
[31m-        {0x0a, 0x01, 0x28, 0x00}, {0x0f, 0x01, 0x28, 0x00},[m
[31m-        {0x18, 0x01, 0x28, 0x00}, {0x1f, 0x01, 0x28, 0x00},[m
[31m-        {0x29, 0x01, 0x28, 0x00}, {0x38, 0x01, 0x28, 0x01},[m
[31m-        {0x03, 0x01, 0x29, 0x00}, {0x06, 0x01, 0x29, 0x00},[m
[31m-        {0x0a, 0x01, 0x29, 0x00}, {0x0f, 0x01, 0x29, 0x00},[m
[31m-        {0x18, 0x01, 0x29, 0x00}, {0x1f, 0x01, 0x29, 0x00},[m
[31m-        {0x29, 0x01, 0x29, 0x00}, {0x38, 0x01, 0x29, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x3f, 0x00}, {0x09, 0x01, 0x3f, 0x00},[m
[31m-        {0x17, 0x01, 0x3f, 0x00}, {0x28, 0x01, 0x3f, 0x01},[m
[31m-        {0x01, 0x01, 0x27, 0x00}, {0x16, 0x01, 0x27, 0x01},[m
[31m-        {0x01, 0x01, 0x2b, 0x00}, {0x16, 0x01, 0x2b, 0x01},[m
[31m-        {0x01, 0x01, 0x7c, 0x00}, {0x16, 0x01, 0x7c, 0x01},[m
[31m-        {0x00, 0x01, 0x23, 0x01}, {0x00, 0x01, 0x3e, 0x01},[m
[31m-        {0x56, 0x00, 0x00, 0x00}, {0x57, 0x00, 0x00, 0x00},[m
[31m-        {0x59, 0x00, 0x00, 0x00}, {0x5a, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x3f, 0x00}, {0x06, 0x01, 0x3f, 0x00},[m
[31m-        {0x0a, 0x01, 0x3f, 0x00}, {0x0f, 0x01, 0x3f, 0x00},[m
[31m-        {0x18, 0x01, 0x3f, 0x00}, {0x1f, 0x01, 0x3f, 0x00},[m
[31m-        {0x29, 0x01, 0x3f, 0x00}, {0x38, 0x01, 0x3f, 0x01},[m
[31m-        {0x02, 0x01, 0x27, 0x00}, {0x09, 0x01, 0x27, 0x00},[m
[31m-        {0x17, 0x01, 0x27, 0x00}, {0x28, 0x01, 0x27, 0x01},[m
[31m-        {0x02, 0x01, 0x2b, 0x00}, {0x09, 0x01, 0x2b, 0x00},[m
[31m-        {0x17, 0x01, 0x2b, 0x00}, {0x28, 0x01, 0x2b, 0x01}[m
[31m-    },[m
[31m-    /* 80 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x27, 0x00}, {0x06, 0x01, 0x27, 0x00},[m
[31m-        {0x0a, 0x01, 0x27, 0x00}, {0x0f, 0x01, 0x27, 0x00},[m
[31m-        {0x18, 0x01, 0x27, 0x00}, {0x1f, 0x01, 0x27, 0x00},[m
[31m-        {0x29, 0x01, 0x27, 0x00}, {0x38, 0x01, 0x27, 0x01},[m
[31m-        {0x03, 0x01, 0x2b, 0x00}, {0x06, 0x01, 0x2b, 0x00},[m
[31m-        {0x0a, 0x01, 0x2b, 0x00}, {0x0f, 0x01, 0x2b, 0x00},[m
[31m-        {0x18, 0x01, 0x2b, 0x00}, {0x1f, 0x01, 0x2b, 0x00},[m
[31m-        {0x29, 0x01, 0x2b, 0x00}, {0x38, 0x01, 0x2b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x7c, 0x00}, {0x09, 0x01, 0x7c, 0x00},[m
[31m-        {0x17, 0x01, 0x7c, 0x00}, {0x28, 0x01, 0x7c, 0x01},[m
[31m-        {0x01, 0x01, 0x23, 0x00}, {0x16, 0x01, 0x23, 0x01},[m
[31m-        {0x01, 0x01, 0x3e, 0x00}, {0x16, 0x01, 0x3e, 0x01},[m
[31m-        {0x00, 0x01, 0x00, 0x01}, {0x00, 0x01, 0x24, 0x01},[m
[31m-        {0x00, 0x01, 0x40, 0x01}, {0x00, 0x01, 0x5b, 0x01},[m
[31m-        {0x00, 0x01, 0x5d, 0x01}, {0x00, 0x01, 0x7e, 0x01},[m
[31m-        {0x5b, 0x00, 0x00, 0x00}, {0x5c, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x7c, 0x00}, {0x06, 0x01, 0x7c, 0x00},[m
[31m-        {0x0a, 0x01, 0x7c, 0x00}, {0x0f, 0x01, 0x7c, 0x00},[m
[31m-        {0x18, 0x01, 0x7c, 0x00}, {0x1f, 0x01, 0x7c, 0x00},[m
[31m-        {0x29, 0x01, 0x7c, 0x00}, {0x38, 0x01, 0x7c, 0x01},[m
[31m-        {0x02, 0x01, 0x23, 0x00}, {0x09, 0x01, 0x23, 0x00},[m
[31m-        {0x17, 0x01, 0x23, 0x00}, {0x28, 0x01, 0x23, 0x01},[m
[31m-        {0x02, 0x01, 0x3e, 0x00}, {0x09, 0x01, 0x3e, 0x00},[m
[31m-        {0x17, 0x01, 0x3e, 0x00}, {0x28, 0x01, 0x3e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x23, 0x00}, {0x06, 0x01, 0x23, 0x00},[m
[31m-        {0x0a, 0x01, 0x23, 0x00}, {0x0f, 0x01, 0x23, 0x00},[m
[31m-        {0x18, 0x01, 0x23, 0x00}, {0x1f, 0x01, 0x23, 0x00},[m
[31m-        {0x29, 0x01, 0x23, 0x00}, {0x38, 0x01, 0x23, 0x01},[m
[31m-        {0x03, 0x01, 0x3e, 0x00}, {0x06, 0x01, 0x3e, 0x00},[m
[31m-        {0x0a, 0x01, 0x3e, 0x00}, {0x0f, 0x01, 0x3e, 0x00},[m
[31m-        {0x18, 0x01, 0x3e, 0x00}, {0x1f, 0x01, 0x3e, 0x00},[m
[31m-        {0x29, 0x01, 0x3e, 0x00}, {0x38, 0x01, 0x3e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x00, 0x00}, {0x16, 0x01, 0x00, 0x01},[m
[31m-        {0x01, 0x01, 0x24, 0x00}, {0x16, 0x01, 0x24, 0x01},[m
[31m-        {0x01, 0x01, 0x40, 0x00}, {0x16, 0x01, 0x40, 0x01},[m
[31m-        {0x01, 0x01, 0x5b, 0x00}, {0x16, 0x01, 0x5b, 0x01},[m
[31m-        {0x01, 0x01, 0x5d, 0x00}, {0x16, 0x01, 0x5d, 0x01},[m
[31m-        {0x01, 0x01, 0x7e, 0x00}, {0x16, 0x01, 0x7e, 0x01},[m
[31m-        {0x00, 0x01, 0x5e, 0x01}, {0x00, 0x01, 0x7d, 0x01},[m
[31m-        {0x5d, 0x00, 0x00, 0x00}, {0x5e, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 85 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x00, 0x00}, {0x09, 0x01, 0x00, 0x00},[m
[31m-        {0x17, 0x01, 0x00, 0x00}, {0x28, 0x01, 0x00, 0x01},[m
[31m-        {0x02, 0x01, 0x24, 0x00}, {0x09, 0x01, 0x24, 0x00},[m
[31m-        {0x17, 0x01, 0x24, 0x00}, {0x28, 0x01, 0x24, 0x01},[m
[31m-        {0x02, 0x01, 0x40, 0x00}, {0x09, 0x01, 0x40, 0x00},[m
[31m-        {0x17, 0x01, 0x40, 0x00}, {0x28, 0x01, 0x40, 0x01},[m
[31m-        {0x02, 0x01, 0x5b, 0x00}, {0x09, 0x01, 0x5b, 0x00},[m
[31m-        {0x17, 0x01, 0x5b, 0x00}, {0x28, 0x01, 0x5b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x00, 0x00}, {0x06, 0x01, 0x00, 0x00},[m
[31m-        {0x0a, 0x01, 0x00, 0x00}, {0x0f, 0x01, 0x00, 0x00},[m
[31m-        {0x18, 0x01, 0x00, 0x00}, {0x1f, 0x01, 0x00, 0x00},[m
[31m-        {0x29, 0x01, 0x00, 0x00}, {0x38, 0x01, 0x00, 0x01},[m
[31m-        {0x03, 0x01, 0x24, 0x00}, {0x06, 0x01, 0x24, 0x00},[m
[31m-        {0x0a, 0x01, 0x24, 0x00}, {0x0f, 0x01, 0x24, 0x00},[m
[31m-        {0x18, 0x01, 0x24, 0x00}, {0x1f, 0x01, 0x24, 0x00},[m
[31m-        {0x29, 0x01, 0x24, 0x00}, {0x38, 0x01, 0x24, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x40, 0x00}, {0x06, 0x01, 0x40, 0x00},[m
[31m-        {0x0a, 0x01, 0x40, 0x00}, {0x0f, 0x01, 0x40, 0x00},[m
[31m-        {0x18, 0x01, 0x40, 0x00}, {0x1f, 0x01, 0x40, 0x00},[m
[31m-        {0x29, 0x01, 0x40, 0x00}, {0x38, 0x01, 0x40, 0x01},[m
[31m-        {0x03, 0x01, 0x5b, 0x00}, {0x06, 0x01, 0x5b, 0x00},[m
[31m-        {0x0a, 0x01, 0x5b, 0x00}, {0x0f, 0x01, 0x5b, 0x00},[m
[31m-        {0x18, 0x01, 0x5b, 0x00}, {0x1f, 0x01, 0x5b, 0x00},[m
[31m-        {0x29, 0x01, 0x5b, 0x00}, {0x38, 0x01, 0x5b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x5d, 0x00}, {0x09, 0x01, 0x5d, 0x00},[m
[31m-        {0x17, 0x01, 0x5d, 0x00}, {0x28, 0x01, 0x5d, 0x01},[m
[31m-        {0x02, 0x01, 0x7e, 0x00}, {0x09, 0x01, 0x7e, 0x00},[m
[31m-        {0x17, 0x01, 0x7e, 0x00}, {0x28, 0x01, 0x7e, 0x01},[m
[31m-        {0x01, 0x01, 0x5e, 0x00}, {0x16, 0x01, 0x5e, 0x01},[m
[31m-        {0x01, 0x01, 0x7d, 0x00}, {0x16, 0x01, 0x7d, 0x01},[m
[31m-        {0x00, 0x01, 0x3c, 0x01}, {0x00, 0x01, 0x60, 0x01},[m
[31m-        {0x00, 0x01, 0x7b, 0x01}, {0x5f, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x5d, 0x00}, {0x06, 0x01, 0x5d, 0x00},[m
[31m-        {0x0a, 0x01, 0x5d, 0x00}, {0x0f, 0x01, 0x5d, 0x00},[m
[31m-        {0x18, 0x01, 0x5d, 0x00}, {0x1f, 0x01, 0x5d, 0x00},[m
[31m-        {0x29, 0x01, 0x5d, 0x00}, {0x38, 0x01, 0x5d, 0x01},[m
[31m-        {0x03, 0x01, 0x7e, 0x00}, {0x06, 0x01, 0x7e, 0x00},[m
[31m-        {0x0a, 0x01, 0x7e, 0x00}, {0x0f, 0x01, 0x7e, 0x00},[m
[31m-        {0x18, 0x01, 0x7e, 0x00}, {0x1f, 0x01, 0x7e, 0x00},[m
[31m-        {0x29, 0x01, 0x7e, 0x00}, {0x38, 0x01, 0x7e, 0x01}[m
[31m-    },[m
[31m-    /* 90 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x5e, 0x00}, {0x09, 0x01, 0x5e, 0x00},[m
[31m-        {0x17, 0x01, 0x5e, 0x00}, {0x28, 0x01, 0x5e, 0x01},[m
[31m-        {0x02, 0x01, 0x7d, 0x00}, {0x09, 0x01, 0x7d, 0x00},[m
[31m-        {0x17, 0x01, 0x7d, 0x00}, {0x28, 0x01, 0x7d, 0x01},[m
[31m-        {0x01, 0x01, 0x3c, 0x00}, {0x16, 0x01, 0x3c, 0x01},[m
[31m-        {0x01, 0x01, 0x60, 0x00}, {0x16, 0x01, 0x60, 0x01},[m
[31m-        {0x01, 0x01, 0x7b, 0x00}, {0x16, 0x01, 0x7b, 0x01},[m
[31m-        {0x60, 0x00, 0x00, 0x00}, {0x6e, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x5e, 0x00}, {0x06, 0x01, 0x5e, 0x00},[m
[31m-        {0x0a, 0x01, 0x5e, 0x00}, {0x0f, 0x01, 0x5e, 0x00},[m
[31m-        {0x18, 0x01, 0x5e, 0x00}, {0x1f, 0x01, 0x5e, 0x00},[m
[31m-        {0x29, 0x01, 0x5e, 0x00}, {0x38, 0x01, 0x5e, 0x01},[m
[31m-        {0x03, 0x01, 0x7d, 0x00}, {0x06, 0x01, 0x7d, 0x00},[m
[31m-        {0x0a, 0x01, 0x7d, 0x00}, {0x0f, 0x01, 0x7d, 0x00},[m
[31m-        {0x18, 0x01, 0x7d, 0x00}, {0x1f, 0x01, 0x7d, 0x00},[m
[31m-        {0x29, 0x01, 0x7d, 0x00}, {0x38, 0x01, 0x7d, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x3c, 0x00}, {0x09, 0x01, 0x3c, 0x00},[m
[31m-        {0x17, 0x01, 0x3c, 0x00}, {0x28, 0x01, 0x3c, 0x01},[m
[31m-        {0x02, 0x01, 0x60, 0x00}, {0x09, 0x01, 0x60, 0x00},[m
[31m-        {0x17, 0x01, 0x60, 0x00}, {0x28, 0x01, 0x60, 0x01},[m
[31m-        {0x02, 0x01, 0x7b, 0x00}, {0x09, 0x01, 0x7b, 0x00},[m
[31m-        {0x17, 0x01, 0x7b, 0x00}, {0x28, 0x01, 0x7b, 0x01},[m
[31m-        {0x61, 0x00, 0x00, 0x00}, {0x65, 0x00, 0x00, 0x00},[m
[31m-        {0x6f, 0x00, 0x00, 0x00}, {0x85, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x3c, 0x00}, {0x06, 0x01, 0x3c, 0x00},[m
[31m-        {0x0a, 0x01, 0x3c, 0x00}, {0x0f, 0x01, 0x3c, 0x00},[m
[31m-        {0x18, 0x01, 0x3c, 0x00}, {0x1f, 0x01, 0x3c, 0x00},[m
[31m-        {0x29, 0x01, 0x3c, 0x00}, {0x38, 0x01, 0x3c, 0x01},[m
[31m-        {0x03, 0x01, 0x60, 0x00}, {0x06, 0x01, 0x60, 0x00},[m
[31m-        {0x0a, 0x01, 0x60, 0x00}, {0x0f, 0x01, 0x60, 0x00},[m
[31m-        {0x18, 0x01, 0x60, 0x00}, {0x1f, 0x01, 0x60, 0x00},[m
[31m-        {0x29, 0x01, 0x60, 0x00}, {0x38, 0x01, 0x60, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x7b, 0x00}, {0x06, 0x01, 0x7b, 0x00},[m
[31m-        {0x0a, 0x01, 0x7b, 0x00}, {0x0f, 0x01, 0x7b, 0x00},[m
[31m-        {0x18, 0x01, 0x7b, 0x00}, {0x1f, 0x01, 0x7b, 0x00},[m
[31m-        {0x29, 0x01, 0x7b, 0x00}, {0x38, 0x01, 0x7b, 0x01},[m
[31m-        {0x62, 0x00, 0x00, 0x00}, {0x63, 0x00, 0x00, 0x00},[m
[31m-        {0x66, 0x00, 0x00, 0x00}, {0x69, 0x00, 0x00, 0x00},[m
[31m-        {0x70, 0x00, 0x00, 0x00}, {0x77, 0x00, 0x00, 0x00},[m
[31m-        {0x86, 0x00, 0x00, 0x00}, {0x99, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 95 */[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x5c, 0x01}, {0x00, 0x01, 0xc3, 0x01},[m
[31m-        {0x00, 0x01, 0xd0, 0x01}, {0x64, 0x00, 0x00, 0x00},[m
[31m-        {0x67, 0x00, 0x00, 0x00}, {0x68, 0x00, 0x00, 0x00},[m
[31m-        {0x6a, 0x00, 0x00, 0x00}, {0x6b, 0x00, 0x00, 0x00},[m
[31m-        {0x71, 0x00, 0x00, 0x00}, {0x74, 0x00, 0x00, 0x00},[m
[31m-        {0x78, 0x00, 0x00, 0x00}, {0x7e, 0x00, 0x00, 0x00},[m
[31m-        {0x87, 0x00, 0x00, 0x00}, {0x8e, 0x00, 0x00, 0x00},[m
[31m-        {0x9a, 0x00, 0x00, 0x00}, {0xa9, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x5c, 0x00}, {0x16, 0x01, 0x5c, 0x01},[m
[31m-        {0x01, 0x01, 0xc3, 0x00}, {0x16, 0x01, 0xc3, 0x01},[m
[31m-        {0x01, 0x01, 0xd0, 0x00}, {0x16, 0x01, 0xd0, 0x01},[m
[31m-        {0x00, 0x01, 0x80, 0x01}, {0x00, 0x01, 0x82, 0x01},[m
[31m-        {0x00, 0x01, 0x83, 0x01}, {0x00, 0x01, 0xa2, 0x01},[m
[31m-        {0x00, 0x01, 0xb8, 0x01}, {0x00, 0x01, 0xc2, 0x01},[m
[31m-        {0x00, 0x01, 0xe0, 0x01}, {0x00, 0x01, 0xe2, 0x01},[m
[31m-        {0x6c, 0x00, 0x00, 0x00}, {0x6d, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x5c, 0x00}, {0x09, 0x01, 0x5c, 0x00},[m
[31m-        {0x17, 0x01, 0x5c, 0x00}, {0x28, 0x01, 0x5c, 0x01},[m
[31m-        {0x02, 0x01, 0xc3, 0x00}, {0x09, 0x01, 0xc3, 0x00},[m
[31m-        {0x17, 0x01, 0xc3, 0x00}, {0x28, 0x01, 0xc3, 0x01},[m
[31m-        {0x02, 0x01, 0xd0, 0x00}, {0x09, 0x01, 0xd0, 0x00},[m
[31m-        {0x17, 0x01, 0xd0, 0x00}, {0x28, 0x01, 0xd0, 0x01},[m
[31m-        {0x01, 0x01, 0x80, 0x00}, {0x16, 0x01, 0x80, 0x01},[m
[31m-        {0x01, 0x01, 0x82, 0x00}, {0x16, 0x01, 0x82, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x5c, 0x00}, {0x06, 0x01, 0x5c, 0x00},[m
[31m-        {0x0a, 0x01, 0x5c, 0x00}, {0x0f, 0x01, 0x5c, 0x00},[m
[31m-        {0x18, 0x01, 0x5c, 0x00}, {0x1f, 0x01, 0x5c, 0x00},[m
[31m-        {0x29, 0x01, 0x5c, 0x00}, {0x38, 0x01, 0x5c, 0x01},[m
[31m-        {0x03, 0x01, 0xc3, 0x00}, {0x06, 0x01, 0xc3, 0x00},[m
[31m-        {0x0a, 0x01, 0xc3, 0x00}, {0x0f, 0x01, 0xc3, 0x00},[m
[31m-        {0x18, 0x01, 0xc3, 0x00}, {0x1f, 0x01, 0xc3, 0x00},[m
[31m-        {0x29, 0x01, 0xc3, 0x00}, {0x38, 0x01, 0xc3, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd0, 0x00}, {0x06, 0x01, 0xd0, 0x00},[m
[31m-        {0x0a, 0x01, 0xd0, 0x00}, {0x0f, 0x01, 0xd0, 0x00},[m
[31m-        {0x18, 0x01, 0xd0, 0x00}, {0x1f, 0x01, 0xd0, 0x00},[m
[31m-        {0x29, 0x01, 0xd0, 0x00}, {0x38, 0x01, 0xd0, 0x01},[m
[31m-        {0x02, 0x01, 0x80, 0x00}, {0x09, 0x01, 0x80, 0x00},[m
[31m-        {0x17, 0x01, 0x80, 0x00}, {0x28, 0x01, 0x80, 0x01},[m
[31m-        {0x02, 0x01, 0x82, 0x00}, {0x09, 0x01, 0x82, 0x00},[m
[31m-        {0x17, 0x01, 0x82, 0x00}, {0x28, 0x01, 0x82, 0x01}[m
[31m-    },[m
[31m-    /* 100 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x80, 0x00}, {0x06, 0x01, 0x80, 0x00},[m
[31m-        {0x0a, 0x01, 0x80, 0x00}, {0x0f, 0x01, 0x80, 0x00},[m
[31m-        {0x18, 0x01, 0x80, 0x00}, {0x1f, 0x01, 0x80, 0x00},[m
[31m-        {0x29, 0x01, 0x80, 0x00}, {0x38, 0x01, 0x80, 0x01},[m
[31m-        {0x03, 0x01, 0x82, 0x00}, {0x06, 0x01, 0x82, 0x00},[m
[31m-        {0x0a, 0x01, 0x82, 0x00}, {0x0f, 0x01, 0x82, 0x00},[m
[31m-        {0x18, 0x01, 0x82, 0x00}, {0x1f, 0x01, 0x82, 0x00},[m
[31m-        {0x29, 0x01, 0x82, 0x00}, {0x38, 0x01, 0x82, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x83, 0x00}, {0x16, 0x01, 0x83, 0x01},[m
[31m-        {0x01, 0x01, 0xa2, 0x00}, {0x16, 0x01, 0xa2, 0x01},[m
[31m-        {0x01, 0x01, 0xb8, 0x00}, {0x16, 0x01, 0xb8, 0x01},[m
[31m-        {0x01, 0x01, 0xc2, 0x00}, {0x16, 0x01, 0xc2, 0x01},[m
[31m-        {0x01, 0x01, 0xe0, 0x00}, {0x16, 0x01, 0xe0, 0x01},[m
[31m-        {0x01, 0x01, 0xe2, 0x00}, {0x16, 0x01, 0xe2, 0x01},[m
[31m-        {0x00, 0x01, 0x99, 0x01}, {0x00, 0x01, 0xa1, 0x01},[m
[31m-        {0x00, 0x01, 0xa7, 0x01}, {0x00, 0x01, 0xac, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x83, 0x00}, {0x09, 0x01, 0x83, 0x00},[m
[31m-        {0x17, 0x01, 0x83, 0x00}, {0x28, 0x01, 0x83, 0x01},[m
[31m-        {0x02, 0x01, 0xa2, 0x00}, {0x09, 0x01, 0xa2, 0x00},[m
[31m-        {0x17, 0x01, 0xa2, 0x00}, {0x28, 0x01, 0xa2, 0x01},[m
[31m-        {0x02, 0x01, 0xb8, 0x00}, {0x09, 0x01, 0xb8, 0x00},[m
[31m-        {0x17, 0x01, 0xb8, 0x00}, {0x28, 0x01, 0xb8, 0x01},[m
[31m-        {0x02, 0x01, 0xc2, 0x00}, {0x09, 0x01, 0xc2, 0x00},[m
[31m-        {0x17, 0x01, 0xc2, 0x00}, {0x28, 0x01, 0xc2, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x83, 0x00}, {0x06, 0x01, 0x83, 0x00},[m
[31m-        {0x0a, 0x01, 0x83, 0x00}, {0x0f, 0x01, 0x83, 0x00},[m
[31m-        {0x18, 0x01, 0x83, 0x00}, {0x1f, 0x01, 0x83, 0x00},[m
[31m-        {0x29, 0x01, 0x83, 0x00}, {0x38, 0x01, 0x83, 0x01},[m
[31m-        {0x03, 0x01, 0xa2, 0x00}, {0x06, 0x01, 0xa2, 0x00},[m
[31m-        {0x0a, 0x01, 0xa2, 0x00}, {0x0f, 0x01, 0xa2, 0x00},[m
[31m-        {0x18, 0x01, 0xa2, 0x00}, {0x1f, 0x01, 0xa2, 0x00},[m
[31m-        {0x29, 0x01, 0xa2, 0x00}, {0x38, 0x01, 0xa2, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb8, 0x00}, {0x06, 0x01, 0xb8, 0x00},[m
[31m-        {0x0a, 0x01, 0xb8, 0x00}, {0x0f, 0x01, 0xb8, 0x00},[m
[31m-        {0x18, 0x01, 0xb8, 0x00}, {0x1f, 0x01, 0xb8, 0x00},[m
[31m-        {0x29, 0x01, 0xb8, 0x00}, {0x38, 0x01, 0xb8, 0x01},[m
[31m-        {0x03, 0x01, 0xc2, 0x00}, {0x06, 0x01, 0xc2, 0x00},[m
[31m-        {0x0a, 0x01, 0xc2, 0x00}, {0x0f, 0x01, 0xc2, 0x00},[m
[31m-        {0x18, 0x01, 0xc2, 0x00}, {0x1f, 0x01, 0xc2, 0x00},[m
[31m-        {0x29, 0x01, 0xc2, 0x00}, {0x38, 0x01, 0xc2, 0x01}[m
[31m-    },[m
[31m-    /* 105 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xe0, 0x00}, {0x09, 0x01, 0xe0, 0x00},[m
[31m-        {0x17, 0x01, 0xe0, 0x00}, {0x28, 0x01, 0xe0, 0x01},[m
[31m-        {0x02, 0x01, 0xe2, 0x00}, {0x09, 0x01, 0xe2, 0x00},[m
[31m-        {0x17, 0x01, 0xe2, 0x00}, {0x28, 0x01, 0xe2, 0x01},[m
[31m-        {0x01, 0x01, 0x99, 0x00}, {0x16, 0x01, 0x99, 0x01},[m
[31m-        {0x01, 0x01, 0xa1, 0x00}, {0x16, 0x01, 0xa1, 0x01},[m
[31m-        {0x01, 0x01, 0xa7, 0x00}, {0x16, 0x01, 0xa7, 0x01},[m
[31m-        {0x01, 0x01, 0xac, 0x00}, {0x16, 0x01, 0xac, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xe0, 0x00}, {0x06, 0x01, 0xe0, 0x00},[m
[31m-        {0x0a, 0x01, 0xe0, 0x00}, {0x0f, 0x01, 0xe0, 0x00},[m
[31m-        {0x18, 0x01, 0xe0, 0x00}, {0x1f, 0x01, 0xe0, 0x00},[m
[31m-        {0x29, 0x01, 0xe0, 0x00}, {0x38, 0x01, 0xe0, 0x01},[m
[31m-        {0x03, 0x01, 0xe2, 0x00}, {0x06, 0x01, 0xe2, 0x00},[m
[31m-        {0x0a, 0x01, 0xe2, 0x00}, {0x0f, 0x01, 0xe2, 0x00},[m
[31m-        {0x18, 0x01, 0xe2, 0x00}, {0x1f, 0x01, 0xe2, 0x00},[m
[31m-        {0x29, 0x01, 0xe2, 0x00}, {0x38, 0x01, 0xe2, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x99, 0x00}, {0x09, 0x01, 0x99, 0x00},[m
[31m-        {0x17, 0x01, 0x99, 0x00}, {0x28, 0x01, 0x99, 0x01},[m
[31m-        {0x02, 0x01, 0xa1, 0x00}, {0x09, 0x01, 0xa1, 0x00},[m
[31m-        {0x17, 0x01, 0xa1, 0x00}, {0x28, 0x01, 0xa1, 0x01},[m
[31m-        {0x02, 0x01, 0xa7, 0x00}, {0x09, 0x01, 0xa7, 0x00},[m
[31m-        {0x17, 0x01, 0xa7, 0x00}, {0x28, 0x01, 0xa7, 0x01},[m
[31m-        {0x02, 0x01, 0xac, 0x00}, {0x09, 0x01, 0xac, 0x00},[m
[31m-        {0x17, 0x01, 0xac, 0x00}, {0x28, 0x01, 0xac, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x99, 0x00}, {0x06, 0x01, 0x99, 0x00},[m
[31m-        {0x0a, 0x01, 0x99, 0x00}, {0x0f, 0x01, 0x99, 0x00},[m
[31m-        {0x18, 0x01, 0x99, 0x00}, {0x1f, 0x01, 0x99, 0x00},[m
[31m-        {0x29, 0x01, 0x99, 0x00}, {0x38, 0x01, 0x99, 0x01},[m
[31m-        {0x03, 0x01, 0xa1, 0x00}, {0x06, 0x01, 0xa1, 0x00},[m
[31m-        {0x0a, 0x01, 0xa1, 0x00}, {0x0f, 0x01, 0xa1, 0x00},[m
[31m-        {0x18, 0x01, 0xa1, 0x00}, {0x1f, 0x01, 0xa1, 0x00},[m
[31m-        {0x29, 0x01, 0xa1, 0x00}, {0x38, 0x01, 0xa1, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa7, 0x00}, {0x06, 0x01, 0xa7, 0x00},[m
[31m-        {0x0a, 0x01, 0xa7, 0x00}, {0x0f, 0x01, 0xa7, 0x00},[m
[31m-        {0x18, 0x01, 0xa7, 0x00}, {0x1f, 0x01, 0xa7, 0x00},[m
[31m-        {0x29, 0x01, 0xa7, 0x00}, {0x38, 0x01, 0xa7, 0x01},[m
[31m-        {0x03, 0x01, 0xac, 0x00}, {0x06, 0x01, 0xac, 0x00},[m
[31m-        {0x0a, 0x01, 0xac, 0x00}, {0x0f, 0x01, 0xac, 0x00},[m
[31m-        {0x18, 0x01, 0xac, 0x00}, {0x1f, 0x01, 0xac, 0x00},[m
[31m-        {0x29, 0x01, 0xac, 0x00}, {0x38, 0x01, 0xac, 0x01}[m
[31m-    },[m
[31m-    /* 110 */[m
[31m-    {[m
[31m-        {0x72, 0x00, 0x00, 0x00}, {0x73, 0x00, 0x00, 0x00},[m
[31m-        {0x75, 0x00, 0x00, 0x00}, {0x76, 0x00, 0x00, 0x00},[m
[31m-        {0x79, 0x00, 0x00, 0x00}, {0x7b, 0x00, 0x00, 0x00},[m
[31m-        {0x7f, 0x00, 0x00, 0x00}, {0x82, 0x00, 0x00, 0x00},[m
[31m-        {0x88, 0x00, 0x00, 0x00}, {0x8b, 0x00, 0x00, 0x00},[m
[31m-        {0x8f, 0x00, 0x00, 0x00}, {0x92, 0x00, 0x00, 0x00},[m
[31m-        {0x9b, 0x00, 0x00, 0x00}, {0xa2, 0x00, 0x00, 0x00},[m
[31m-        {0xaa, 0x00, 0x00, 0x00}, {0xb4, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xb0, 0x01}, {0x00, 0x01, 0xb1, 0x01},[m
[31m-        {0x00, 0x01, 0xb3, 0x01}, {0x00, 0x01, 0xd1, 0x01},[m
[31m-        {0x00, 0x01, 0xd8, 0x01}, {0x00, 0x01, 0xd9, 0x01},[m
[31m-        {0x00, 0x01, 0xe3, 0x01}, {0x00, 0x01, 0xe5, 0x01},[m
[31m-        {0x00, 0x01, 0xe6, 0x01}, {0x7a, 0x00, 0x00, 0x00},[m
[31m-        {0x7c, 0x00, 0x00, 0x00}, {0x7d, 0x00, 0x00, 0x00},[m
[31m-        {0x80, 0x00, 0x00, 0x00}, {0x81, 0x00, 0x00, 0x00},[m
[31m-        {0x83, 0x00, 0x00, 0x00}, {0x84, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xb0, 0x00}, {0x16, 0x01, 0xb0, 0x01},[m
[31m-        {0x01, 0x01, 0xb1, 0x00}, {0x16, 0x01, 0xb1, 0x01},[m
[31m-        {0x01, 0x01, 0xb3, 0x00}, {0x16, 0x01, 0xb3, 0x01},[m
[31m-        {0x01, 0x01, 0xd1, 0x00}, {0x16, 0x01, 0xd1, 0x01},[m
[31m-        {0x01, 0x01, 0xd8, 0x00}, {0x16, 0x01, 0xd8, 0x01},[m
[31m-        {0x01, 0x01, 0xd9, 0x00}, {0x16, 0x01, 0xd9, 0x01},[m
[31m-        {0x01, 0x01, 0xe3, 0x00}, {0x16, 0x01, 0xe3, 0x01},[m
[31m-        {0x01, 0x01, 0xe5, 0x00}, {0x16, 0x01, 0xe5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xb0, 0x00}, {0x09, 0x01, 0xb0, 0x00},[m
[31m-        {0x17, 0x01, 0xb0, 0x00}, {0x28, 0x01, 0xb0, 0x01},[m
[31m-        {0x02, 0x01, 0xb1, 0x00}, {0x09, 0x01, 0xb1, 0x00},[m
[31m-        {0x17, 0x01, 0xb1, 0x00}, {0x28, 0x01, 0xb1, 0x01},[m
[31m-        {0x02, 0x01, 0xb3, 0x00}, {0x09, 0x01, 0xb3, 0x00},[m
[31m-        {0x17, 0x01, 0xb3, 0x00}, {0x28, 0x01, 0xb3, 0x01},[m
[31m-        {0x02, 0x01, 0xd1, 0x00}, {0x09, 0x01, 0xd1, 0x00},[m
[31m-        {0x17, 0x01, 0xd1, 0x00}, {0x28, 0x01, 0xd1, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb0, 0x00}, {0x06, 0x01, 0xb0, 0x00},[m
[31m-        {0x0a, 0x01, 0xb0, 0x00}, {0x0f, 0x01, 0xb0, 0x00},[m
[31m-        {0x18, 0x01, 0xb0, 0x00}, {0x1f, 0x01, 0xb0, 0x00},[m
[31m-        {0x29, 0x01, 0xb0, 0x00}, {0x38, 0x01, 0xb0, 0x01},[m
[31m-        {0x03, 0x01, 0xb1, 0x00}, {0x06, 0x01, 0xb1, 0x00},[m
[31m-        {0x0a, 0x01, 0xb1, 0x00}, {0x0f, 0x01, 0xb1, 0x00},[m
[31m-        {0x18, 0x01, 0xb1, 0x00}, {0x1f, 0x01, 0xb1, 0x00},[m
[31m-        {0x29, 0x01, 0xb1, 0x00}, {0x38, 0x01, 0xb1, 0x01}[m
[31m-    },[m
[31m-    /* 115 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb3, 0x00}, {0x06, 0x01, 0xb3, 0x00},[m
[31m-        {0x0a, 0x01, 0xb3, 0x00}, {0x0f, 0x01, 0xb3, 0x00},[m
[31m-        {0x18, 0x01, 0xb3, 0x00}, {0x1f, 0x01, 0xb3, 0x00},[m
[31m-        {0x29, 0x01, 0xb3, 0x00}, {0x38, 0x01, 0xb3, 0x01},[m
[31m-        {0x03, 0x01, 0xd1, 0x00}, {0x06, 0x01, 0xd1, 0x00},[m
[31m-        {0x0a, 0x01, 0xd1, 0x00}, {0x0f, 0x01, 0xd1, 0x00},[m
[31m-        {0x18, 0x01, 0xd1, 0x00}, {0x1f, 0x01, 0xd1, 0x00},[m
[31m-        {0x29, 0x01, 0xd1, 0x00}, {0x38, 0x01, 0xd1, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xd8, 0x00}, {0x09, 0x01, 0xd8, 0x00},[m
[31m-        {0x17, 0x01, 0xd8, 0x00}, {0x28, 0x01, 0xd8, 0x01},[m
[31m-        {0x02, 0x01, 0xd9, 0x00}, {0x09, 0x01, 0xd9, 0x00},[m
[31m-        {0x17, 0x01, 0xd9, 0x00}, {0x28, 0x01, 0xd9, 0x01},[m
[31m-        {0x02, 0x01, 0xe3, 0x00}, {0x09, 0x01, 0xe3, 0x00},[m
[31m-        {0x17, 0x01, 0xe3, 0x00}, {0x28, 0x01, 0xe3, 0x01},[m
[31m-        {0x02, 0x01, 0xe5, 0x00}, {0x09, 0x01, 0xe5, 0x00},[m
[31m-        {0x17, 0x01, 0xe5, 0x00}, {0x28, 0x01, 0xe5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd8, 0x00}, {0x06, 0x01, 0xd8, 0x00},[m
[31m-        {0x0a, 0x01, 0xd8, 0x00}, {0x0f, 0x01, 0xd8, 0x00},[m
[31m-        {0x18, 0x01, 0xd8, 0x00}, {0x1f, 0x01, 0xd8, 0x00},[m
[31m-        {0x29, 0x01, 0xd8, 0x00}, {0x38, 0x01, 0xd8, 0x01},[m
[31m-        {0x03, 0x01, 0xd9, 0x00}, {0x06, 0x01, 0xd9, 0x00},[m
[31m-        {0x0a, 0x01, 0xd9, 0x00}, {0x0f, 0x01, 0xd9, 0x00},[m
[31m-        {0x18, 0x01, 0xd9, 0x00}, {0x1f, 0x01, 0xd9, 0x00},[m
[31m-        {0x29, 0x01, 0xd9, 0x00}, {0x38, 0x01, 0xd9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xe3, 0x00}, {0x06, 0x01, 0xe3, 0x00},[m
[31m-        {0x0a, 0x01, 0xe3, 0x00}, {0x0f, 0x01, 0xe3, 0x00},[m
[31m-        {0x18, 0x01, 0xe3, 0x00}, {0x1f, 0x01, 0xe3, 0x00},[m
[31m-        {0x29, 0x01, 0xe3, 0x00}, {0x38, 0x01, 0xe3, 0x01},[m
[31m-        {0x03, 0x01, 0xe5, 0x00}, {0x06, 0x01, 0xe5, 0x00},[m
[31m-        {0x0a, 0x01, 0xe5, 0x00}, {0x0f, 0x01, 0xe5, 0x00},[m
[31m-        {0x18, 0x01, 0xe5, 0x00}, {0x1f, 0x01, 0xe5, 0x00},[m
[31m-        {0x29, 0x01, 0xe5, 0x00}, {0x38, 0x01, 0xe5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xe6, 0x00}, {0x16, 0x01, 0xe6, 0x01},[m
[31m-        {0x00, 0x01, 0x81, 0x01}, {0x00, 0x01, 0x84, 0x01},[m
[31m-        {0x00, 0x01, 0x85, 0x01}, {0x00, 0x01, 0x86, 0x01},[m
[31m-        {0x00, 0x01, 0x88, 0x01}, {0x00, 0x01, 0x92, 0x01},[m
[31m-        {0x00, 0x01, 0x9a, 0x01}, {0x00, 0x01, 0x9c, 0x01},[m
[31m-        {0x00, 0x01, 0xa0, 0x01}, {0x00, 0x01, 0xa3, 0x01},[m
[31m-        {0x00, 0x01, 0xa4, 0x01}, {0x00, 0x01, 0xa9, 0x01},[m
[31m-        {0x00, 0x01, 0xaa, 0x01}, {0x00, 0x01, 0xad, 0x01}[m
[31m-    },[m
[31m-    /* 120 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xe6, 0x00}, {0x09, 0x01, 0xe6, 0x00},[m
[31m-        {0x17, 0x01, 0xe6, 0x00}, {0x28, 0x01, 0xe6, 0x01},[m
[31m-        {0x01, 0x01, 0x81, 0x00}, {0x16, 0x01, 0x81, 0x01},[m
[31m-        {0x01, 0x01, 0x84, 0x00}, {0x16, 0x01, 0x84, 0x01},[m
[31m-        {0x01, 0x01, 0x85, 0x00}, {0x16, 0x01, 0x85, 0x01},[m
[31m-        {0x01, 0x01, 0x86, 0x00}, {0x16, 0x01, 0x86, 0x01},[m
[31m-        {0x01, 0x01, 0x88, 0x00}, {0x16, 0x01, 0x88, 0x01},[m
[31m-        {0x01, 0x01, 0x92, 0x00}, {0x16, 0x01, 0x92, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xe6, 0x00}, {0x06, 0x01, 0xe6, 0x00},[m
[31m-        {0x0a, 0x01, 0xe6, 0x00}, {0x0f, 0x01, 0xe6, 0x00},[m
[31m-        {0x18, 0x01, 0xe6, 0x00}, {0x1f, 0x01, 0xe6, 0x00},[m
[31m-        {0x29, 0x01, 0xe6, 0x00}, {0x38, 0x01, 0xe6, 0x01},[m
[31m-        {0x02, 0x01, 0x81, 0x00}, {0x09, 0x01, 0x81, 0x00},[m
[31m-        {0x17, 0x01, 0x81, 0x00}, {0x28, 0x01, 0x81, 0x01},[m
[31m-        {0x02, 0x01, 0x84, 0x00}, {0x09, 0x01, 0x84, 0x00},[m
[31m-        {0x17, 0x01, 0x84, 0x00}, {0x28, 0x01, 0x84, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x81, 0x00}, {0x06, 0x01, 0x81, 0x00},[m
[31m-        {0x0a, 0x01, 0x81, 0x00}, {0x0f, 0x01, 0x81, 0x00},[m
[31m-        {0x18, 0x01, 0x81, 0x00}, {0x1f, 0x01, 0x81, 0x00},[m
[31m-        {0x29, 0x01, 0x81, 0x00}, {0x38, 0x01, 0x81, 0x01},[m
[31m-        {0x03, 0x01, 0x84, 0x00}, {0x06, 0x01, 0x84, 0x00},[m
[31m-        {0x0a, 0x01, 0x84, 0x00}, {0x0f, 0x01, 0x84, 0x00},[m
[31m-        {0x18, 0x01, 0x84, 0x00}, {0x1f, 0x01, 0x84, 0x00},[m
[31m-        {0x29, 0x01, 0x84, 0x00}, {0x38, 0x01, 0x84, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x85, 0x00}, {0x09, 0x01, 0x85, 0x00},[m
[31m-        {0x17, 0x01, 0x85, 0x00}, {0x28, 0x01, 0x85, 0x01},[m
[31m-        {0x02, 0x01, 0x86, 0x00}, {0x09, 0x01, 0x86, 0x00},[m
[31m-        {0x17, 0x01, 0x86, 0x00}, {0x28, 0x01, 0x86, 0x01},[m
[31m-        {0x02, 0x01, 0x88, 0x00}, {0x09, 0x01, 0x88, 0x00},[m
[31m-        {0x17, 0x01, 0x88, 0x00}, {0x28, 0x01, 0x88, 0x01},[m
[31m-        {0x02, 0x01, 0x92, 0x00}, {0x09, 0x01, 0x92, 0x00},[m
[31m-        {0x17, 0x01, 0x92, 0x00}, {0x28, 0x01, 0x92, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x85, 0x00}, {0x06, 0x01, 0x85, 0x00},[m
[31m-        {0x0a, 0x01, 0x85, 0x00}, {0x0f, 0x01, 0x85, 0x00},[m
[31m-        {0x18, 0x01, 0x85, 0x00}, {0x1f, 0x01, 0x85, 0x00},[m
[31m-        {0x29, 0x01, 0x85, 0x00}, {0x38, 0x01, 0x85, 0x01},[m
[31m-        {0x03, 0x01, 0x86, 0x00}, {0x06, 0x01, 0x86, 0x00},[m
[31m-        {0x0a, 0x01, 0x86, 0x00}, {0x0f, 0x01, 0x86, 0x00},[m
[31m-        {0x18, 0x01, 0x86, 0x00}, {0x1f, 0x01, 0x86, 0x00},[m
[31m-        {0x29, 0x01, 0x86, 0x00}, {0x38, 0x01, 0x86, 0x01}[m
[31m-    },[m
[31m-    /* 125 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x88, 0x00}, {0x06, 0x01, 0x88, 0x00},[m
[31m-        {0x0a, 0x01, 0x88, 0x00}, {0x0f, 0x01, 0x88, 0x00},[m
[31m-        {0x18, 0x01, 0x88, 0x00}, {0x1f, 0x01, 0x88, 0x00},[m
[31m-        {0x29, 0x01, 0x88, 0x00}, {0x38, 0x01, 0x88, 0x01},[m
[31m-        {0x03, 0x01, 0x92, 0x00}, {0x06, 0x01, 0x92, 0x00},[m
[31m-        {0x0a, 0x01, 0x92, 0x00}, {0x0f, 0x01, 0x92, 0x00},[m
[31m-        {0x18, 0x01, 0x92, 0x00}, {0x1f, 0x01, 0x92, 0x00},[m
[31m-        {0x29, 0x01, 0x92, 0x00}, {0x38, 0x01, 0x92, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x9a, 0x00}, {0x16, 0x01, 0x9a, 0x01},[m
[31m-        {0x01, 0x01, 0x9c, 0x00}, {0x16, 0x01, 0x9c, 0x01},[m
[31m-        {0x01, 0x01, 0xa0, 0x00}, {0x16, 0x01, 0xa0, 0x01},[m
[31m-        {0x01, 0x01, 0xa3, 0x00}, {0x16, 0x01, 0xa3, 0x01},[m
[31m-        {0x01, 0x01, 0xa4, 0x00}, {0x16, 0x01, 0xa4, 0x01},[m
[31m-        {0x01, 0x01, 0xa9, 0x00}, {0x16, 0x01, 0xa9, 0x01},[m
[31m-        {0x01, 0x01, 0xaa, 0x00}, {0x16, 0x01, 0xaa, 0x01},[m
[31m-        {0x01, 0x01, 0xad, 0x00}, {0x16, 0x01, 0xad, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x9a, 0x00}, {0x09, 0x01, 0x9a, 0x00},[m
[31m-        {0x17, 0x01, 0x9a, 0x00}, {0x28, 0x01, 0x9a, 0x01},[m
[31m-        {0x02, 0x01, 0x9c, 0x00}, {0x09, 0x01, 0x9c, 0x00},[m
[31m-        {0x17, 0x01, 0x9c, 0x00}, {0x28, 0x01, 0x9c, 0x01},[m
[31m-        {0x02, 0x01, 0xa0, 0x00}, {0x09, 0x01, 0xa0, 0x00},[m
[31m-        {0x17, 0x01, 0xa0, 0x00}, {0x28, 0x01, 0xa0, 0x01},[m
[31m-        {0x02, 0x01, 0xa3, 0x00}, {0x09, 0x01, 0xa3, 0x00},[m
[31m-        {0x17, 0x01, 0xa3, 0x00}, {0x28, 0x01, 0xa3, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x9a, 0x00}, {0x06, 0x01, 0x9a, 0x00},[m
[31m-        {0x0a, 0x01, 0x9a, 0x00}, {0x0f, 0x01, 0x9a, 0x00},[m
[31m-        {0x18, 0x01, 0x9a, 0x00}, {0x1f, 0x01, 0x9a, 0x00},[m
[31m-        {0x29, 0x01, 0x9a, 0x00}, {0x38, 0x01, 0x9a, 0x01},[m
[31m-        {0x03, 0x01, 0x9c, 0x00}, {0x06, 0x01, 0x9c, 0x00},[m
[31m-        {0x0a, 0x01, 0x9c, 0x00}, {0x0f, 0x01, 0x9c, 0x00},[m
[31m-        {0x18, 0x01, 0x9c, 0x00}, {0x1f, 0x01, 0x9c, 0x00},[m
[31m-        {0x29, 0x01, 0x9c, 0x00}, {0x38, 0x01, 0x9c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa0, 0x00}, {0x06, 0x01, 0xa0, 0x00},[m
[31m-        {0x0a, 0x01, 0xa0, 0x00}, {0x0f, 0x01, 0xa0, 0x00},[m
[31m-        {0x18, 0x01, 0xa0, 0x00}, {0x1f, 0x01, 0xa0, 0x00},[m
[31m-        {0x29, 0x01, 0xa0, 0x00}, {0x38, 0x01, 0xa0, 0x01},[m
[31m-        {0x03, 0x01, 0xa3, 0x00}, {0x06, 0x01, 0xa3, 0x00},[m
[31m-        {0x0a, 0x01, 0xa3, 0x00}, {0x0f, 0x01, 0xa3, 0x00},[m
[31m-        {0x18, 0x01, 0xa3, 0x00}, {0x1f, 0x01, 0xa3, 0x00},[m
[31m-        {0x29, 0x01, 0xa3, 0x00}, {0x38, 0x01, 0xa3, 0x01}[m
[31m-    },[m
[31m-    /* 130 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xa4, 0x00}, {0x09, 0x01, 0xa4, 0x00},[m
[31m-        {0x17, 0x01, 0xa4, 0x00}, {0x28, 0x01, 0xa4, 0x01},[m
[31m-        {0x02, 0x01, 0xa9, 0x00}, {0x09, 0x01, 0xa9, 0x00},[m
[31m-        {0x17, 0x01, 0xa9, 0x00}, {0x28, 0x01, 0xa9, 0x01},[m
[31m-        {0x02, 0x01, 0xaa, 0x00}, {0x09, 0x01, 0xaa, 0x00},[m
[31m-        {0x17, 0x01, 0xaa, 0x00}, {0x28, 0x01, 0xaa, 0x01},[m
[31m-        {0x02, 0x01, 0xad, 0x00}, {0x09, 0x01, 0xad, 0x00},[m
[31m-        {0x17, 0x01, 0xad, 0x00}, {0x28, 0x01, 0xad, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa4, 0x00}, {0x06, 0x01, 0xa4, 0x00},[m
[31m-        {0x0a, 0x01, 0xa4, 0x00}, {0x0f, 0x01, 0xa4, 0x00},[m
[31m-        {0x18, 0x01, 0xa4, 0x00}, {0x1f, 0x01, 0xa4, 0x00},[m
[31m-        {0x29, 0x01, 0xa4, 0x00}, {0x38, 0x01, 0xa4, 0x01},[m
[31m-        {0x03, 0x01, 0xa9, 0x00}, {0x06, 0x01, 0xa9, 0x00},[m
[31m-        {0x0a, 0x01, 0xa9, 0x00}, {0x0f, 0x01, 0xa9, 0x00},[m
[31m-        {0x18, 0x01, 0xa9, 0x00}, {0x1f, 0x01, 0xa9, 0x00},[m
[31m-        {0x29, 0x01, 0xa9, 0x00}, {0x38, 0x01, 0xa9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xaa, 0x00}, {0x06, 0x01, 0xaa, 0x00},[m
[31m-        {0x0a, 0x01, 0xaa, 0x00}, {0x0f, 0x01, 0xaa, 0x00},[m
[31m-        {0x18, 0x01, 0xaa, 0x00}, {0x1f, 0x01, 0xaa, 0x00},[m
[31m-        {0x29, 0x01, 0xaa, 0x00}, {0x38, 0x01, 0xaa, 0x01},[m
[31m-        {0x03, 0x01, 0xad, 0x00}, {0x06, 0x01, 0xad, 0x00},[m
[31m-        {0x0a, 0x01, 0xad, 0x00}, {0x0f, 0x01, 0xad, 0x00},[m
[31m-        {0x18, 0x01, 0xad, 0x00}, {0x1f, 0x01, 0xad, 0x00},[m
[31m-        {0x29, 0x01, 0xad, 0x00}, {0x38, 0x01, 0xad, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x89, 0x00, 0x00, 0x00}, {0x8a, 0x00, 0x00, 0x00},[m
[31m-        {0x8c, 0x00, 0x00, 0x00}, {0x8d, 0x00, 0x00, 0x00},[m
[31m-        {0x90, 0x00, 0x00, 0x00}, {0x91, 0x00, 0x00, 0x00},[m
[31m-        {0x93, 0x00, 0x00, 0x00}, {0x96, 0x00, 0x00, 0x00},[m
[31m-        {0x9c, 0x00, 0x00, 0x00}, {0x9f, 0x00, 0x00, 0x00},[m
[31m-        {0xa3, 0x00, 0x00, 0x00}, {0xa6, 0x00, 0x00, 0x00},[m
[31m-        {0xab, 0x00, 0x00, 0x00}, {0xae, 0x00, 0x00, 0x00},[m
[31m-        {0xb5, 0x00, 0x00, 0x00}, {0xbe, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xb2, 0x01}, {0x00, 0x01, 0xb5, 0x01},[m
[31m-        {0x00, 0x01, 0xb9, 0x01}, {0x00, 0x01, 0xba, 0x01},[m
[31m-        {0x00, 0x01, 0xbb, 0x01}, {0x00, 0x01, 0xbd, 0x01},[m
[31m-        {0x00, 0x01, 0xbe, 0x01}, {0x00, 0x01, 0xc4, 0x01},[m
[31m-        {0x00, 0x01, 0xc6, 0x01}, {0x00, 0x01, 0xe4, 0x01},[m
[31m-        {0x00, 0x01, 0xe8, 0x01}, {0x00, 0x01, 0xe9, 0x01},[m
[31m-        {0x94, 0x00, 0x00, 0x00}, {0x95, 0x00, 0x00, 0x00},[m
[31m-        {0x97, 0x00, 0x00, 0x00}, {0x98, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    /* 135 */[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xb2, 0x00}, {0x16, 0x01, 0xb2, 0x01},[m
[31m-        {0x01, 0x01, 0xb5, 0x00}, {0x16, 0x01, 0xb5, 0x01},[m
[31m-        {0x01, 0x01, 0xb9, 0x00}, {0x16, 0x01, 0xb9, 0x01},[m
[31m-        {0x01, 0x01, 0xba, 0x00}, {0x16, 0x01, 0xba, 0x01},[m
[31m-        {0x01, 0x01, 0xbb, 0x00}, {0x16, 0x01, 0xbb, 0x01},[m
[31m-        {0x01, 0x01, 0xbd, 0x00}, {0x16, 0x01, 0xbd, 0x01},[m
[31m-        {0x01, 0x01, 0xbe, 0x00}, {0x16, 0x01, 0xbe, 0x01},[m
[31m-        {0x01, 0x01, 0xc4, 0x00}, {0x16, 0x01, 0xc4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xb2, 0x00}, {0x09, 0x01, 0xb2, 0x00},[m
[31m-        {0x17, 0x01, 0xb2, 0x00}, {0x28, 0x01, 0xb2, 0x01},[m
[31m-        {0x02, 0x01, 0xb5, 0x00}, {0x09, 0x01, 0xb5, 0x00},[m
[31m-        {0x17, 0x01, 0xb5, 0x00}, {0x28, 0x01, 0xb5, 0x01},[m
[31m-        {0x02, 0x01, 0xb9, 0x00}, {0x09, 0x01, 0xb9, 0x00},[m
[31m-        {0x17, 0x01, 0xb9, 0x00}, {0x28, 0x01, 0xb9, 0x01},[m
[31m-        {0x02, 0x01, 0xba, 0x00}, {0x09, 0x01, 0xba, 0x00},[m
[31m-        {0x17, 0x01, 0xba, 0x00}, {0x28, 0x01, 0xba, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb2, 0x00}, {0x06, 0x01, 0xb2, 0x00},[m
[31m-        {0x0a, 0x01, 0xb2, 0x00}, {0x0f, 0x01, 0xb2, 0x00},[m
[31m-        {0x18, 0x01, 0xb2, 0x00}, {0x1f, 0x01, 0xb2, 0x00},[m
[31m-        {0x29, 0x01, 0xb2, 0x00}, {0x38, 0x01, 0xb2, 0x01},[m
[31m-        {0x03, 0x01, 0xb5, 0x00}, {0x06, 0x01, 0xb5, 0x00},[m
[31m-        {0x0a, 0x01, 0xb5, 0x00}, {0x0f, 0x01, 0xb5, 0x00},[m
[31m-        {0x18, 0x01, 0xb5, 0x00}, {0x1f, 0x01, 0xb5, 0x00},[m
[31m-        {0x29, 0x01, 0xb5, 0x00}, {0x38, 0x01, 0xb5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb9, 0x00}, {0x06, 0x01, 0xb9, 0x00},[m
[31m-        {0x0a, 0x01, 0xb9, 0x00}, {0x0f, 0x01, 0xb9, 0x00},[m
[31m-        {0x18, 0x01, 0xb9, 0x00}, {0x1f, 0x01, 0xb9, 0x00},[m
[31m-        {0x29, 0x01, 0xb9, 0x00}, {0x38, 0x01, 0xb9, 0x01},[m
[31m-        {0x03, 0x01, 0xba, 0x00}, {0x06, 0x01, 0xba, 0x00},[m
[31m-        {0x0a, 0x01, 0xba, 0x00}, {0x0f, 0x01, 0xba, 0x00},[m
[31m-        {0x18, 0x01, 0xba, 0x00}, {0x1f, 0x01, 0xba, 0x00},[m
[31m-        {0x29, 0x01, 0xba, 0x00}, {0x38, 0x01, 0xba, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xbb, 0x00}, {0x09, 0x01, 0xbb, 0x00},[m
[31m-        {0x17, 0x01, 0xbb, 0x00}, {0x28, 0x01, 0xbb, 0x01},[m
[31m-        {0x02, 0x01, 0xbd, 0x00}, {0x09, 0x01, 0xbd, 0x00},[m
[31m-        {0x17, 0x01, 0xbd, 0x00}, {0x28, 0x01, 0xbd, 0x01},[m
[31m-        {0x02, 0x01, 0xbe, 0x00}, {0x09, 0x01, 0xbe, 0x00},[m
[31m-        {0x17, 0x01, 0xbe, 0x00}, {0x28, 0x01, 0xbe, 0x01},[m
[31m-        {0x02, 0x01, 0xc4, 0x00}, {0x09, 0x01, 0xc4, 0x00},[m
[31m-        {0x17, 0x01, 0xc4, 0x00}, {0x28, 0x01, 0xc4, 0x01}[m
[31m-    },[m
[31m-    /* 140 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xbb, 0x00}, {0x06, 0x01, 0xbb, 0x00},[m
[31m-        {0x0a, 0x01, 0xbb, 0x00}, {0x0f, 0x01, 0xbb, 0x00},[m
[31m-        {0x18, 0x01, 0xbb, 0x00}, {0x1f, 0x01, 0xbb, 0x00},[m
[31m-        {0x29, 0x01, 0xbb, 0x00}, {0x38, 0x01, 0xbb, 0x01},[m
[31m-        {0x03, 0x01, 0xbd, 0x00}, {0x06, 0x01, 0xbd, 0x00},[m
[31m-        {0x0a, 0x01, 0xbd, 0x00}, {0x0f, 0x01, 0xbd, 0x00},[m
[31m-        {0x18, 0x01, 0xbd, 0x00}, {0x1f, 0x01, 0xbd, 0x00},[m
[31m-        {0x29, 0x01, 0xbd, 0x00}, {0x38, 0x01, 0xbd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xbe, 0x00}, {0x06, 0x01, 0xbe, 0x00},[m
[31m-        {0x0a, 0x01, 0xbe, 0x00}, {0x0f, 0x01, 0xbe, 0x00},[m
[31m-        {0x18, 0x01, 0xbe, 0x00}, {0x1f, 0x01, 0xbe, 0x00},[m
[31m-        {0x29, 0x01, 0xbe, 0x00}, {0x38, 0x01, 0xbe, 0x01},[m
[31m-        {0x03, 0x01, 0xc4, 0x00}, {0x06, 0x01, 0xc4, 0x00},[m
[31m-        {0x0a, 0x01, 0xc4, 0x00}, {0x0f, 0x01, 0xc4, 0x00},[m
[31m-        {0x18, 0x01, 0xc4, 0x00}, {0x1f, 0x01, 0xc4, 0x00},[m
[31m-        {0x29, 0x01, 0xc4, 0x00}, {0x38, 0x01, 0xc4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xc6, 0x00}, {0x16, 0x01, 0xc6, 0x01},[m
[31m-        {0x01, 0x01, 0xe4, 0x00}, {0x16, 0x01, 0xe4, 0x01},[m
[31m-        {0x01, 0x01, 0xe8, 0x00}, {0x16, 0x01, 0xe8, 0x01},[m
[31m-        {0x01, 0x01, 0xe9, 0x00}, {0x16, 0x01, 0xe9, 0x01},[m
[31m-        {0x00, 0x01, 0x01, 0x01}, {0x00, 0x01, 0x87, 0x01},[m
[31m-        {0x00, 0x01, 0x89, 0x01}, {0x00, 0x01, 0x8a, 0x01},[m
[31m-        {0x00, 0x01, 0x8b, 0x01}, {0x00, 0x01, 0x8c, 0x01},[m
[31m-        {0x00, 0x01, 0x8d, 0x01}, {0x00, 0x01, 0x8f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xc6, 0x00}, {0x09, 0x01, 0xc6, 0x00},[m
[31m-        {0x17, 0x01, 0xc6, 0x00}, {0x28, 0x01, 0xc6, 0x01},[m
[31m-        {0x02, 0x01, 0xe4, 0x00}, {0x09, 0x01, 0xe4, 0x00},[m
[31m-        {0x17, 0x01, 0xe4, 0x00}, {0x28, 0x01, 0xe4, 0x01},[m
[31m-        {0x02, 0x01, 0xe8, 0x00}, {0x09, 0x01, 0xe8, 0x00},[m
[31m-        {0x17, 0x01, 0xe8, 0x00}, {0x28, 0x01, 0xe8, 0x01},[m
[31m-        {0x02, 0x01, 0xe9, 0x00}, {0x09, 0x01, 0xe9, 0x00},[m
[31m-        {0x17, 0x01, 0xe9, 0x00}, {0x28, 0x01, 0xe9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc6, 0x00}, {0x06, 0x01, 0xc6, 0x00},[m
[31m-        {0x0a, 0x01, 0xc6, 0x00}, {0x0f, 0x01, 0xc6, 0x00},[m
[31m-        {0x18, 0x01, 0xc6, 0x00}, {0x1f, 0x01, 0xc6, 0x00},[m
[31m-        {0x29, 0x01, 0xc6, 0x00}, {0x38, 0x01, 0xc6, 0x01},[m
[31m-        {0x03, 0x01, 0xe4, 0x00}, {0x06, 0x01, 0xe4, 0x00},[m
[31m-        {0x0a, 0x01, 0xe4, 0x00}, {0x0f, 0x01, 0xe4, 0x00},[m
[31m-        {0x18, 0x01, 0xe4, 0x00}, {0x1f, 0x01, 0xe4, 0x00},[m
[31m-        {0x29, 0x01, 0xe4, 0x00}, {0x38, 0x01, 0xe4, 0x01}[m
[31m-    },[m
[31m-    /* 145 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xe8, 0x00}, {0x06, 0x01, 0xe8, 0x00},[m
[31m-        {0x0a, 0x01, 0xe8, 0x00}, {0x0f, 0x01, 0xe8, 0x00},[m
[31m-        {0x18, 0x01, 0xe8, 0x00}, {0x1f, 0x01, 0xe8, 0x00},[m
[31m-        {0x29, 0x01, 0xe8, 0x00}, {0x38, 0x01, 0xe8, 0x01},[m
[31m-        {0x03, 0x01, 0xe9, 0x00}, {0x06, 0x01, 0xe9, 0x00},[m
[31m-        {0x0a, 0x01, 0xe9, 0x00}, {0x0f, 0x01, 0xe9, 0x00},[m
[31m-        {0x18, 0x01, 0xe9, 0x00}, {0x1f, 0x01, 0xe9, 0x00},[m
[31m-        {0x29, 0x01, 0xe9, 0x00}, {0x38, 0x01, 0xe9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x01, 0x00}, {0x16, 0x01, 0x01, 0x01},[m
[31m-        {0x01, 0x01, 0x87, 0x00}, {0x16, 0x01, 0x87, 0x01},[m
[31m-        {0x01, 0x01, 0x89, 0x00}, {0x16, 0x01, 0x89, 0x01},[m
[31m-        {0x01, 0x01, 0x8a, 0x00}, {0x16, 0x01, 0x8a, 0x01},[m
[31m-        {0x01, 0x01, 0x8b, 0x00}, {0x16, 0x01, 0x8b, 0x01},[m
[31m-        {0x01, 0x01, 0x8c, 0x00}, {0x16, 0x01, 0x8c, 0x01},[m
[31m-        {0x01, 0x01, 0x8d, 0x00}, {0x16, 0x01, 0x8d, 0x01},[m
[31m-        {0x01, 0x01, 0x8f, 0x00}, {0x16, 0x01, 0x8f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x01, 0x00}, {0x09, 0x01, 0x01, 0x00},[m
[31m-        {0x17, 0x01, 0x01, 0x00}, {0x28, 0x01, 0x01, 0x01},[m
[31m-        {0x02, 0x01, 0x87, 0x00}, {0x09, 0x01, 0x87, 0x00},[m
[31m-        {0x17, 0x01, 0x87, 0x00}, {0x28, 0x01, 0x87, 0x01},[m
[31m-        {0x02, 0x01, 0x89, 0x00}, {0x09, 0x01, 0x89, 0x00},[m
[31m-        {0x17, 0x01, 0x89, 0x00}, {0x28, 0x01, 0x89, 0x01},[m
[31m-        {0x02, 0x01, 0x8a, 0x00}, {0x09, 0x01, 0x8a, 0x00},[m
[31m-        {0x17, 0x01, 0x8a, 0x00}, {0x28, 0x01, 0x8a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x01, 0x00}, {0x06, 0x01, 0x01, 0x00},[m
[31m-        {0x0a, 0x01, 0x01, 0x00}, {0x0f, 0x01, 0x01, 0x00},[m
[31m-        {0x18, 0x01, 0x01, 0x00}, {0x1f, 0x01, 0x01, 0x00},[m
[31m-        {0x29, 0x01, 0x01, 0x00}, {0x38, 0x01, 0x01, 0x01},[m
[31m-        {0x03, 0x01, 0x87, 0x00}, {0x06, 0x01, 0x87, 0x00},[m
[31m-        {0x0a, 0x01, 0x87, 0x00}, {0x0f, 0x01, 0x87, 0x00},[m
[31m-        {0x18, 0x01, 0x87, 0x00}, {0x1f, 0x01, 0x87, 0x00},[m
[31m-        {0x29, 0x01, 0x87, 0x00}, {0x38, 0x01, 0x87, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x89, 0x00}, {0x06, 0x01, 0x89, 0x00},[m
[31m-        {0x0a, 0x01, 0x89, 0x00}, {0x0f, 0x01, 0x89, 0x00},[m
[31m-        {0x18, 0x01, 0x89, 0x00}, {0x1f, 0x01, 0x89, 0x00},[m
[31m-        {0x29, 0x01, 0x89, 0x00}, {0x38, 0x01, 0x89, 0x01},[m
[31m-        {0x03, 0x01, 0x8a, 0x00}, {0x06, 0x01, 0x8a, 0x00},[m
[31m-        {0x0a, 0x01, 0x8a, 0x00}, {0x0f, 0x01, 0x8a, 0x00},[m
[31m-        {0x18, 0x01, 0x8a, 0x00}, {0x1f, 0x01, 0x8a, 0x00},[m
[31m-        {0x29, 0x01, 0x8a, 0x00}, {0x38, 0x01, 0x8a, 0x01}[m
[31m-    },[m
[31m-    /* 150 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x8b, 0x00}, {0x09, 0x01, 0x8b, 0x00},[m
[31m-        {0x17, 0x01, 0x8b, 0x00}, {0x28, 0x01, 0x8b, 0x01},[m
[31m-        {0x02, 0x01, 0x8c, 0x00}, {0x09, 0x01, 0x8c, 0x00},[m
[31m-        {0x17, 0x01, 0x8c, 0x00}, {0x28, 0x01, 0x8c, 0x01},[m
[31m-        {0x02, 0x01, 0x8d, 0x00}, {0x09, 0x01, 0x8d, 0x00},[m
[31m-        {0x17, 0x01, 0x8d, 0x00}, {0x28, 0x01, 0x8d, 0x01},[m
[31m-        {0x02, 0x01, 0x8f, 0x00}, {0x09, 0x01, 0x8f, 0x00},[m
[31m-        {0x17, 0x01, 0x8f, 0x00}, {0x28, 0x01, 0x8f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x8b, 0x00}, {0x06, 0x01, 0x8b, 0x00},[m
[31m-        {0x0a, 0x01, 0x8b, 0x00}, {0x0f, 0x01, 0x8b, 0x00},[m
[31m-        {0x18, 0x01, 0x8b, 0x00}, {0x1f, 0x01, 0x8b, 0x00},[m
[31m-        {0x29, 0x01, 0x8b, 0x00}, {0x38, 0x01, 0x8b, 0x01},[m
[31m-        {0x03, 0x01, 0x8c, 0x00}, {0x06, 0x01, 0x8c, 0x00},[m
[31m-        {0x0a, 0x01, 0x8c, 0x00}, {0x0f, 0x01, 0x8c, 0x00},[m
[31m-        {0x18, 0x01, 0x8c, 0x00}, {0x1f, 0x01, 0x8c, 0x00},[m
[31m-        {0x29, 0x01, 0x8c, 0x00}, {0x38, 0x01, 0x8c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x8d, 0x00}, {0x06, 0x01, 0x8d, 0x00},[m
[31m-        {0x0a, 0x01, 0x8d, 0x00}, {0x0f, 0x01, 0x8d, 0x00},[m
[31m-        {0x18, 0x01, 0x8d, 0x00}, {0x1f, 0x01, 0x8d, 0x00},[m
[31m-        {0x29, 0x01, 0x8d, 0x00}, {0x38, 0x01, 0x8d, 0x01},[m
[31m-        {0x03, 0x01, 0x8f, 0x00}, {0x06, 0x01, 0x8f, 0x00},[m
[31m-        {0x0a, 0x01, 0x8f, 0x00}, {0x0f, 0x01, 0x8f, 0x00},[m
[31m-        {0x18, 0x01, 0x8f, 0x00}, {0x1f, 0x01, 0x8f, 0x00},[m
[31m-        {0x29, 0x01, 0x8f, 0x00}, {0x38, 0x01, 0x8f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x9d, 0x00, 0x00, 0x00}, {0x9e, 0x00, 0x00, 0x00},[m
[31m-        {0xa0, 0x00, 0x00, 0x00}, {0xa1, 0x00, 0x00, 0x00},[m
[31m-        {0xa4, 0x00, 0x00, 0x00}, {0xa5, 0x00, 0x00, 0x00},[m
[31m-        {0xa7, 0x00, 0x00, 0x00}, {0xa8, 0x00, 0x00, 0x00},[m
[31m-        {0xac, 0x00, 0x00, 0x00}, {0xad, 0x00, 0x00, 0x00},[m
[31m-        {0xaf, 0x00, 0x00, 0x00}, {0xb1, 0x00, 0x00, 0x00},[m
[31m-        {0xb6, 0x00, 0x00, 0x00}, {0xb9, 0x00, 0x00, 0x00},[m
[31m-        {0xbf, 0x00, 0x00, 0x00}, {0xcf, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x93, 0x01}, {0x00, 0x01, 0x95, 0x01},[m
[31m-        {0x00, 0x01, 0x96, 0x01}, {0x00, 0x01, 0x97, 0x01},[m
[31m-        {0x00, 0x01, 0x98, 0x01}, {0x00, 0x01, 0x9b, 0x01},[m
[31m-        {0x00, 0x01, 0x9d, 0x01}, {0x00, 0x01, 0x9e, 0x01},[m
[31m-        {0x00, 0x01, 0xa5, 0x01}, {0x00, 0x01, 0xa6, 0x01},[m
[31m-        {0x00, 0x01, 0xa8, 0x01}, {0x00, 0x01, 0xae, 0x01},[m
[31m-        {0x00, 0x01, 0xaf, 0x01}, {0x00, 0x01, 0xb4, 0x01},[m
[31m-        {0x00, 0x01, 0xb6, 0x01}, {0x00, 0x01, 0xb7, 0x01}[m
[31m-    },[m
[31m-    /* 155 */[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x93, 0x00}, {0x16, 0x01, 0x93, 0x01},[m
[31m-        {0x01, 0x01, 0x95, 0x00}, {0x16, 0x01, 0x95, 0x01},[m
[31m-        {0x01, 0x01, 0x96, 0x00}, {0x16, 0x01, 0x96, 0x01},[m
[31m-        {0x01, 0x01, 0x97, 0x00}, {0x16, 0x01, 0x97, 0x01},[m
[31m-        {0x01, 0x01, 0x98, 0x00}, {0x16, 0x01, 0x98, 0x01},[m
[31m-        {0x01, 0x01, 0x9b, 0x00}, {0x16, 0x01, 0x9b, 0x01},[m
[31m-        {0x01, 0x01, 0x9d, 0x00}, {0x16, 0x01, 0x9d, 0x01},[m
[31m-        {0x01, 0x01, 0x9e, 0x00}, {0x16, 0x01, 0x9e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x93, 0x00}, {0x09, 0x01, 0x93, 0x00},[m
[31m-        {0x17, 0x01, 0x93, 0x00}, {0x28, 0x01, 0x93, 0x01},[m
[31m-        {0x02, 0x01, 0x95, 0x00}, {0x09, 0x01, 0x95, 0x00},[m
[31m-        {0x17, 0x01, 0x95, 0x00}, {0x28, 0x01, 0x95, 0x01},[m
[31m-        {0x02, 0x01, 0x96, 0x00}, {0x09, 0x01, 0x96, 0x00},[m
[31m-        {0x17, 0x01, 0x96, 0x00}, {0x28, 0x01, 0x96, 0x01},[m
[31m-        {0x02, 0x01, 0x97, 0x00}, {0x09, 0x01, 0x97, 0x00},[m
[31m-        {0x17, 0x01, 0x97, 0x00}, {0x28, 0x01, 0x97, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x93, 0x00}, {0x06, 0x01, 0x93, 0x00},[m
[31m-        {0x0a, 0x01, 0x93, 0x00}, {0x0f, 0x01, 0x93, 0x00},[m
[31m-        {0x18, 0x01, 0x93, 0x00}, {0x1f, 0x01, 0x93, 0x00},[m
[31m-        {0x29, 0x01, 0x93, 0x00}, {0x38, 0x01, 0x93, 0x01},[m
[31m-        {0x03, 0x01, 0x95, 0x00}, {0x06, 0x01, 0x95, 0x00},[m
[31m-        {0x0a, 0x01, 0x95, 0x00}, {0x0f, 0x01, 0x95, 0x00},[m
[31m-        {0x18, 0x01, 0x95, 0x00}, {0x1f, 0x01, 0x95, 0x00},[m
[31m-        {0x29, 0x01, 0x95, 0x00}, {0x38, 0x01, 0x95, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x96, 0x00}, {0x06, 0x01, 0x96, 0x00},[m
[31m-        {0x0a, 0x01, 0x96, 0x00}, {0x0f, 0x01, 0x96, 0x00},[m
[31m-        {0x18, 0x01, 0x96, 0x00}, {0x1f, 0x01, 0x96, 0x00},[m
[31m-        {0x29, 0x01, 0x96, 0x00}, {0x38, 0x01, 0x96, 0x01},[m
[31m-        {0x03, 0x01, 0x97, 0x00}, {0x06, 0x01, 0x97, 0x00},[m
[31m-        {0x0a, 0x01, 0x97, 0x00}, {0x0f, 0x01, 0x97, 0x00},[m
[31m-        {0x18, 0x01, 0x97, 0x00}, {0x1f, 0x01, 0x97, 0x00},[m
[31m-        {0x29, 0x01, 0x97, 0x00}, {0x38, 0x01, 0x97, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x98, 0x00}, {0x09, 0x01, 0x98, 0x00},[m
[31m-        {0x17, 0x01, 0x98, 0x00}, {0x28, 0x01, 0x98, 0x01},[m
[31m-        {0x02, 0x01, 0x9b, 0x00}, {0x09, 0x01, 0x9b, 0x00},[m
[31m-        {0x17, 0x01, 0x9b, 0x00}, {0x28, 0x01, 0x9b, 0x01},[m
[31m-        {0x02, 0x01, 0x9d, 0x00}, {0x09, 0x01, 0x9d, 0x00},[m
[31m-        {0x17, 0x01, 0x9d, 0x00}, {0x28, 0x01, 0x9d, 0x01},[m
[31m-        {0x02, 0x01, 0x9e, 0x00}, {0x09, 0x01, 0x9e, 0x00},[m
[31m-        {0x17, 0x01, 0x9e, 0x00}, {0x28, 0x01, 0x9e, 0x01}[m
[31m-    },[m
[31m-    /* 160 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x98, 0x00}, {0x06, 0x01, 0x98, 0x00},[m
[31m-        {0x0a, 0x01, 0x98, 0x00}, {0x0f, 0x01, 0x98, 0x00},[m
[31m-        {0x18, 0x01, 0x98, 0x00}, {0x1f, 0x01, 0x98, 0x00},[m
[31m-        {0x29, 0x01, 0x98, 0x00}, {0x38, 0x01, 0x98, 0x01},[m
[31m-        {0x03, 0x01, 0x9b, 0x00}, {0x06, 0x01, 0x9b, 0x00},[m
[31m-        {0x0a, 0x01, 0x9b, 0x00}, {0x0f, 0x01, 0x9b, 0x00},[m
[31m-        {0x18, 0x01, 0x9b, 0x00}, {0x1f, 0x01, 0x9b, 0x00},[m
[31m-        {0x29, 0x01, 0x9b, 0x00}, {0x38, 0x01, 0x9b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x9d, 0x00}, {0x06, 0x01, 0x9d, 0x00},[m
[31m-        {0x0a, 0x01, 0x9d, 0x00}, {0x0f, 0x01, 0x9d, 0x00},[m
[31m-        {0x18, 0x01, 0x9d, 0x00}, {0x1f, 0x01, 0x9d, 0x00},[m
[31m-        {0x29, 0x01, 0x9d, 0x00}, {0x38, 0x01, 0x9d, 0x01},[m
[31m-        {0x03, 0x01, 0x9e, 0x00}, {0x06, 0x01, 0x9e, 0x00},[m
[31m-        {0x0a, 0x01, 0x9e, 0x00}, {0x0f, 0x01, 0x9e, 0x00},[m
[31m-        {0x18, 0x01, 0x9e, 0x00}, {0x1f, 0x01, 0x9e, 0x00},[m
[31m-        {0x29, 0x01, 0x9e, 0x00}, {0x38, 0x01, 0x9e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xa5, 0x00}, {0x16, 0x01, 0xa5, 0x01},[m
[31m-        {0x01, 0x01, 0xa6, 0x00}, {0x16, 0x01, 0xa6, 0x01},[m
[31m-        {0x01, 0x01, 0xa8, 0x00}, {0x16, 0x01, 0xa8, 0x01},[m
[31m-        {0x01, 0x01, 0xae, 0x00}, {0x16, 0x01, 0xae, 0x01},[m
[31m-        {0x01, 0x01, 0xaf, 0x00}, {0x16, 0x01, 0xaf, 0x01},[m
[31m-        {0x01, 0x01, 0xb4, 0x00}, {0x16, 0x01, 0xb4, 0x01},[m
[31m-        {0x01, 0x01, 0xb6, 0x00}, {0x16, 0x01, 0xb6, 0x01},[m
[31m-        {0x01, 0x01, 0xb7, 0x00}, {0x16, 0x01, 0xb7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xa5, 0x00}, {0x09, 0x01, 0xa5, 0x00},[m
[31m-        {0x17, 0x01, 0xa5, 0x00}, {0x28, 0x01, 0xa5, 0x01},[m
[31m-        {0x02, 0x01, 0xa6, 0x00}, {0x09, 0x01, 0xa6, 0x00},[m
[31m-        {0x17, 0x01, 0xa6, 0x00}, {0x28, 0x01, 0xa6, 0x01},[m
[31m-        {0x02, 0x01, 0xa8, 0x00}, {0x09, 0x01, 0xa8, 0x00},[m
[31m-        {0x17, 0x01, 0xa8, 0x00}, {0x28, 0x01, 0xa8, 0x01},[m
[31m-        {0x02, 0x01, 0xae, 0x00}, {0x09, 0x01, 0xae, 0x00},[m
[31m-        {0x17, 0x01, 0xae, 0x00}, {0x28, 0x01, 0xae, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa5, 0x00}, {0x06, 0x01, 0xa5, 0x00},[m
[31m-        {0x0a, 0x01, 0xa5, 0x00}, {0x0f, 0x01, 0xa5, 0x00},[m
[31m-        {0x18, 0x01, 0xa5, 0x00}, {0x1f, 0x01, 0xa5, 0x00},[m
[31m-        {0x29, 0x01, 0xa5, 0x00}, {0x38, 0x01, 0xa5, 0x01},[m
[31m-        {0x03, 0x01, 0xa6, 0x00}, {0x06, 0x01, 0xa6, 0x00},[m
[31m-        {0x0a, 0x01, 0xa6, 0x00}, {0x0f, 0x01, 0xa6, 0x00},[m
[31m-        {0x18, 0x01, 0xa6, 0x00}, {0x1f, 0x01, 0xa6, 0x00},[m
[31m-        {0x29, 0x01, 0xa6, 0x00}, {0x38, 0x01, 0xa6, 0x01}[m
[31m-    },[m
[31m-    /* 165 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa8, 0x00}, {0x06, 0x01, 0xa8, 0x00},[m
[31m-        {0x0a, 0x01, 0xa8, 0x00}, {0x0f, 0x01, 0xa8, 0x00},[m
[31m-        {0x18, 0x01, 0xa8, 0x00}, {0x1f, 0x01, 0xa8, 0x00},[m
[31m-        {0x29, 0x01, 0xa8, 0x00}, {0x38, 0x01, 0xa8, 0x01},[m
[31m-        {0x03, 0x01, 0xae, 0x00}, {0x06, 0x01, 0xae, 0x00},[m
[31m-        {0x0a, 0x01, 0xae, 0x00}, {0x0f, 0x01, 0xae, 0x00},[m
[31m-        {0x18, 0x01, 0xae, 0x00}, {0x1f, 0x01, 0xae, 0x00},[m
[31m-        {0x29, 0x01, 0xae, 0x00}, {0x38, 0x01, 0xae, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xaf, 0x00}, {0x09, 0x01, 0xaf, 0x00},[m
[31m-        {0x17, 0x01, 0xaf, 0x00}, {0x28, 0x01, 0xaf, 0x01},[m
[31m-        {0x02, 0x01, 0xb4, 0x00}, {0x09, 0x01, 0xb4, 0x00},[m
[31m-        {0x17, 0x01, 0xb4, 0x00}, {0x28, 0x01, 0xb4, 0x01},[m
[31m-        {0x02, 0x01, 0xb6, 0x00}, {0x09, 0x01, 0xb6, 0x00},[m
[31m-        {0x17, 0x01, 0xb6, 0x00}, {0x28, 0x01, 0xb6, 0x01},[m
[31m-        {0x02, 0x01, 0xb7, 0x00}, {0x09, 0x01, 0xb7, 0x00},[m
[31m-        {0x17, 0x01, 0xb7, 0x00}, {0x28, 0x01, 0xb7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xaf, 0x00}, {0x06, 0x01, 0xaf, 0x00},[m
[31m-        {0x0a, 0x01, 0xaf, 0x00}, {0x0f, 0x01, 0xaf, 0x00},[m
[31m-        {0x18, 0x01, 0xaf, 0x00}, {0x1f, 0x01, 0xaf, 0x00},[m
[31m-        {0x29, 0x01, 0xaf, 0x00}, {0x38, 0x01, 0xaf, 0x01},[m
[31m-        {0x03, 0x01, 0xb4, 0x00}, {0x06, 0x01, 0xb4, 0x00},[m
[31m-        {0x0a, 0x01, 0xb4, 0x00}, {0x0f, 0x01, 0xb4, 0x00},[m
[31m-        {0x18, 0x01, 0xb4, 0x00}, {0x1f, 0x01, 0xb4, 0x00},[m
[31m-        {0x29, 0x01, 0xb4, 0x00}, {0x38, 0x01, 0xb4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb6, 0x00}, {0x06, 0x01, 0xb6, 0x00},[m
[31m-        {0x0a, 0x01, 0xb6, 0x00}, {0x0f, 0x01, 0xb6, 0x00},[m
[31m-        {0x18, 0x01, 0xb6, 0x00}, {0x1f, 0x01, 0xb6, 0x00},[m
[31m-        {0x29, 0x01, 0xb6, 0x00}, {0x38, 0x01, 0xb6, 0x01},[m
[31m-        {0x03, 0x01, 0xb7, 0x00}, {0x06, 0x01, 0xb7, 0x00},[m
[31m-        {0x0a, 0x01, 0xb7, 0x00}, {0x0f, 0x01, 0xb7, 0x00},[m
[31m-        {0x18, 0x01, 0xb7, 0x00}, {0x1f, 0x01, 0xb7, 0x00},[m
[31m-        {0x29, 0x01, 0xb7, 0x00}, {0x38, 0x01, 0xb7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xbc, 0x01}, {0x00, 0x01, 0xbf, 0x01},[m
[31m-        {0x00, 0x01, 0xc5, 0x01}, {0x00, 0x01, 0xe7, 0x01},[m
[31m-        {0x00, 0x01, 0xef, 0x01}, {0xb0, 0x00, 0x00, 0x00},[m
[31m-        {0xb2, 0x00, 0x00, 0x00}, {0xb3, 0x00, 0x00, 0x00},[m
[31m-        {0xb7, 0x00, 0x00, 0x00}, {0xb8, 0x00, 0x00, 0x00},[m
[31m-        {0xba, 0x00, 0x00, 0x00}, {0xbb, 0x00, 0x00, 0x00},[m
[31m-        {0xc0, 0x00, 0x00, 0x00}, {0xc7, 0x00, 0x00, 0x00},[m
[31m-        {0xd0, 0x00, 0x00, 0x00}, {0xdf, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 170 */[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xbc, 0x00}, {0x16, 0x01, 0xbc, 0x01},[m
[31m-        {0x01, 0x01, 0xbf, 0x00}, {0x16, 0x01, 0xbf, 0x01},[m
[31m-        {0x01, 0x01, 0xc5, 0x00}, {0x16, 0x01, 0xc5, 0x01},[m
[31m-        {0x01, 0x01, 0xe7, 0x00}, {0x16, 0x01, 0xe7, 0x01},[m
[31m-        {0x01, 0x01, 0xef, 0x00}, {0x16, 0x01, 0xef, 0x01},[m
[31m-        {0x00, 0x01, 0x09, 0x01}, {0x00, 0x01, 0x8e, 0x01},[m
[31m-        {0x00, 0x01, 0x90, 0x01}, {0x00, 0x01, 0x91, 0x01},[m
[31m-        {0x00, 0x01, 0x94, 0x01}, {0x00, 0x01, 0x9f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xbc, 0x00}, {0x09, 0x01, 0xbc, 0x00},[m
[31m-        {0x17, 0x01, 0xbc, 0x00}, {0x28, 0x01, 0xbc, 0x01},[m
[31m-        {0x02, 0x01, 0xbf, 0x00}, {0x09, 0x01, 0xbf, 0x00},[m
[31m-        {0x17, 0x01, 0xbf, 0x00}, {0x28, 0x01, 0xbf, 0x01},[m
[31m-        {0x02, 0x01, 0xc5, 0x00}, {0x09, 0x01, 0xc5, 0x00},[m
[31m-        {0x17, 0x01, 0xc5, 0x00}, {0x28, 0x01, 0xc5, 0x01},[m
[31m-        {0x02, 0x01, 0xe7, 0x00}, {0x09, 0x01, 0xe7, 0x00},[m
[31m-        {0x17, 0x01, 0xe7, 0x00}, {0x28, 0x01, 0xe7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xbc, 0x00}, {0x06, 0x01, 0xbc, 0x00},[m
[31m-        {0x0a, 0x01, 0xbc, 0x00}, {0x0f, 0x01, 0xbc, 0x00},[m
[31m-        {0x18, 0x01, 0xbc, 0x00}, {0x1f, 0x01, 0xbc, 0x00},[m
[31m-        {0x29, 0x01, 0xbc, 0x00}, {0x38, 0x01, 0xbc, 0x01},[m
[31m-        {0x03, 0x01, 0xbf, 0x00}, {0x06, 0x01, 0xbf, 0x00},[m
[31m-        {0x0a, 0x01, 0xbf, 0x00}, {0x0f, 0x01, 0xbf, 0x00},[m
[31m-        {0x18, 0x01, 0xbf, 0x00}, {0x1f, 0x01, 0xbf, 0x00},[m
[31m-        {0x29, 0x01, 0xbf, 0x00}, {0x38, 0x01, 0xbf, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc5, 0x00}, {0x06, 0x01, 0xc5, 0x00},[m
[31m-        {0x0a, 0x01, 0xc5, 0x00}, {0x0f, 0x01, 0xc5, 0x00},[m
[31m-        {0x18, 0x01, 0xc5, 0x00}, {0x1f, 0x01, 0xc5, 0x00},[m
[31m-        {0x29, 0x01, 0xc5, 0x00}, {0x38, 0x01, 0xc5, 0x01},[m
[31m-        {0x03, 0x01, 0xe7, 0x00}, {0x06, 0x01, 0xe7, 0x00},[m
[31m-        {0x0a, 0x01, 0xe7, 0x00}, {0x0f, 0x01, 0xe7, 0x00},[m
[31m-        {0x18, 0x01, 0xe7, 0x00}, {0x1f, 0x01, 0xe7, 0x00},[m
[31m-        {0x29, 0x01, 0xe7, 0x00}, {0x38, 0x01, 0xe7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xef, 0x00}, {0x09, 0x01, 0xef, 0x00},[m
[31m-        {0x17, 0x01, 0xef, 0x00}, {0x28, 0x01, 0xef, 0x01},[m
[31m-        {0x01, 0x01, 0x09, 0x00}, {0x16, 0x01, 0x09, 0x01},[m
[31m-        {0x01, 0x01, 0x8e, 0x00}, {0x16, 0x01, 0x8e, 0x01},[m
[31m-        {0x01, 0x01, 0x90, 0x00}, {0x16, 0x01, 0x90, 0x01},[m
[31m-        {0x01, 0x01, 0x91, 0x00}, {0x16, 0x01, 0x91, 0x01},[m
[31m-        {0x01, 0x01, 0x94, 0x00}, {0x16, 0x01, 0x94, 0x01},[m
[31m-        {0x01, 0x01, 0x9f, 0x00}, {0x16, 0x01, 0x9f, 0x01}[m
[31m-    },[m
[31m-    /* 175 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xef, 0x00}, {0x06, 0x01, 0xef, 0x00},[m
[31m-        {0x0a, 0x01, 0xef, 0x00}, {0x0f, 0x01, 0xef, 0x00},[m
[31m-        {0x18, 0x01, 0xef, 0x00}, {0x1f, 0x01, 0xef, 0x00},[m
[31m-        {0x29, 0x01, 0xef, 0x00}, {0x38, 0x01, 0xef, 0x01},[m
[31m-        {0x02, 0x01, 0x09, 0x00}, {0x09, 0x01, 0x09, 0x00},[m
[31m-        {0x17, 0x01, 0x09, 0x00}, {0x28, 0x01, 0x09, 0x01},[m
[31m-        {0x02, 0x01, 0x8e, 0x00}, {0x09, 0x01, 0x8e, 0x00},[m
[31m-        {0x17, 0x01, 0x8e, 0x00}, {0x28, 0x01, 0x8e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x09, 0x00}, {0x06, 0x01, 0x09, 0x00},[m
[31m-        {0x0a, 0x01, 0x09, 0x00}, {0x0f, 0x01, 0x09, 0x00},[m
[31m-        {0x18, 0x01, 0x09, 0x00}, {0x1f, 0x01, 0x09, 0x00},[m
[31m-        {0x29, 0x01, 0x09, 0x00}, {0x38, 0x01, 0x09, 0x01},[m
[31m-        {0x03, 0x01, 0x8e, 0x00}, {0x06, 0x01, 0x8e, 0x00},[m
[31m-        {0x0a, 0x01, 0x8e, 0x00}, {0x0f, 0x01, 0x8e, 0x00},[m
[31m-        {0x18, 0x01, 0x8e, 0x00}, {0x1f, 0x01, 0x8e, 0x00},[m
[31m-        {0x29, 0x01, 0x8e, 0x00}, {0x38, 0x01, 0x8e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x90, 0x00}, {0x09, 0x01, 0x90, 0x00},[m
[31m-        {0x17, 0x01, 0x90, 0x00}, {0x28, 0x01, 0x90, 0x01},[m
[31m-        {0x02, 0x01, 0x91, 0x00}, {0x09, 0x01, 0x91, 0x00},[m
[31m-        {0x17, 0x01, 0x91, 0x00}, {0x28, 0x01, 0x91, 0x01},[m
[31m-        {0x02, 0x01, 0x94, 0x00}, {0x09, 0x01, 0x94, 0x00},[m
[31m-        {0x17, 0x01, 0x94, 0x00}, {0x28, 0x01, 0x94, 0x01},[m
[31m-        {0x02, 0x01, 0x9f, 0x00}, {0x09, 0x01, 0x9f, 0x00},[m
[31m-        {0x17, 0x01, 0x9f, 0x00}, {0x28, 0x01, 0x9f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x90, 0x00}, {0x06, 0x01, 0x90, 0x00},[m
[31m-        {0x0a, 0x01, 0x90, 0x00}, {0x0f, 0x01, 0x90, 0x00},[m
[31m-        {0x18, 0x01, 0x90, 0x00}, {0x1f, 0x01, 0x90, 0x00},[m
[31m-        {0x29, 0x01, 0x90, 0x00}, {0x38, 0x01, 0x90, 0x01},[m
[31m-        {0x03, 0x01, 0x91, 0x00}, {0x06, 0x01, 0x91, 0x00},[m
[31m-        {0x0a, 0x01, 0x91, 0x00}, {0x0f, 0x01, 0x91, 0x00},[m
[31m-        {0x18, 0x01, 0x91, 0x00}, {0x1f, 0x01, 0x91, 0x00},[m
[31m-        {0x29, 0x01, 0x91, 0x00}, {0x38, 0x01, 0x91, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x94, 0x00}, {0x06, 0x01, 0x94, 0x00},[m
[31m-        {0x0a, 0x01, 0x94, 0x00}, {0x0f, 0x01, 0x94, 0x00},[m
[31m-        {0x18, 0x01, 0x94, 0x00}, {0x1f, 0x01, 0x94, 0x00},[m
[31m-        {0x29, 0x01, 0x94, 0x00}, {0x38, 0x01, 0x94, 0x01},[m
[31m-        {0x03, 0x01, 0x9f, 0x00}, {0x06, 0x01, 0x9f, 0x00},[m
[31m-        {0x0a, 0x01, 0x9f, 0x00}, {0x0f, 0x01, 0x9f, 0x00},[m
[31m-        {0x18, 0x01, 0x9f, 0x00}, {0x1f, 0x01, 0x9f, 0x00},[m
[31m-        {0x29, 0x01, 0x9f, 0x00}, {0x38, 0x01, 0x9f, 0x01}[m
[31m-    },[m
[31m-    /* 180 */[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xab, 0x01}, {0x00, 0x01, 0xce, 0x01},[m
[31m-        {0x00, 0x01, 0xd7, 0x01}, {0x00, 0x01, 0xe1, 0x01},[m
[31m-        {0x00, 0x01, 0xec, 0x01}, {0x00, 0x01, 0xed, 0x01},[m
[31m-        {0xbc, 0x00, 0x00, 0x00}, {0xbd, 0x00, 0x00, 0x00},[m
[31m-        {0xc1, 0x00, 0x00, 0x00}, {0xc4, 0x00, 0x00, 0x00},[m
[31m-        {0xc8, 0x00, 0x00, 0x00}, {0xcb, 0x00, 0x00, 0x00},[m
[31m-        {0xd1, 0x00, 0x00, 0x00}, {0xd8, 0x00, 0x00, 0x00},[m
[31m-        {0xe0, 0x00, 0x00, 0x00}, {0xee, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xab, 0x00}, {0x16, 0x01, 0xab, 0x01},[m
[31m-        {0x01, 0x01, 0xce, 0x00}, {0x16, 0x01, 0xce, 0x01},[m
[31m-        {0x01, 0x01, 0xd7, 0x00}, {0x16, 0x01, 0xd7, 0x01},[m
[31m-        {0x01, 0x01, 0xe1, 0x00}, {0x16, 0x01, 0xe1, 0x01},[m
[31m-        {0x01, 0x01, 0xec, 0x00}, {0x16, 0x01, 0xec, 0x01},[m
[31m-        {0x01, 0x01, 0xed, 0x00}, {0x16, 0x01, 0xed, 0x01},[m
[31m-        {0x00, 0x01, 0xc7, 0x01}, {0x00, 0x01, 0xcf, 0x01},[m
[31m-        {0x00, 0x01, 0xea, 0x01}, {0x00, 0x01, 0xeb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xab, 0x00}, {0x09, 0x01, 0xab, 0x00},[m
[31m-        {0x17, 0x01, 0xab, 0x00}, {0x28, 0x01, 0xab, 0x01},[m
[31m-        {0x02, 0x01, 0xce, 0x00}, {0x09, 0x01, 0xce, 0x00},[m
[31m-        {0x17, 0x01, 0xce, 0x00}, {0x28, 0x01, 0xce, 0x01},[m
[31m-        {0x02, 0x01, 0xd7, 0x00}, {0x09, 0x01, 0xd7, 0x00},[m
[31m-        {0x17, 0x01, 0xd7, 0x00}, {0x28, 0x01, 0xd7, 0x01},[m
[31m-        {0x02, 0x01, 0xe1, 0x00}, {0x09, 0x01, 0xe1, 0x00},[m
[31m-        {0x17, 0x01, 0xe1, 0x00}, {0x28, 0x01, 0xe1, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xab, 0x00}, {0x06, 0x01, 0xab, 0x00},[m
[31m-        {0x0a, 0x01, 0xab, 0x00}, {0x0f, 0x01, 0xab, 0x00},[m
[31m-        {0x18, 0x01, 0xab, 0x00}, {0x1f, 0x01, 0xab, 0x00},[m
[31m-        {0x29, 0x01, 0xab, 0x00}, {0x38, 0x01, 0xab, 0x01},[m
[31m-        {0x03, 0x01, 0xce, 0x00}, {0x06, 0x01, 0xce, 0x00},[m
[31m-        {0x0a, 0x01, 0xce, 0x00}, {0x0f, 0x01, 0xce, 0x00},[m
[31m-        {0x18, 0x01, 0xce, 0x00}, {0x1f, 0x01, 0xce, 0x00},[m
[31m-        {0x29, 0x01, 0xce, 0x00}, {0x38, 0x01, 0xce, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd7, 0x00}, {0x06, 0x01, 0xd7, 0x00},[m
[31m-        {0x0a, 0x01, 0xd7, 0x00}, {0x0f, 0x01, 0xd7, 0x00},[m
[31m-        {0x18, 0x01, 0xd7, 0x00}, {0x1f, 0x01, 0xd7, 0x00},[m
[31m-        {0x29, 0x01, 0xd7, 0x00}, {0x38, 0x01, 0xd7, 0x01},[m
[31m-        {0x03, 0x01, 0xe1, 0x00}, {0x06, 0x01, 0xe1, 0x00},[m
[31m-        {0x0a, 0x01, 0xe1, 0x00}, {0x0f, 0x01, 0xe1, 0x00},[m
[31m-        {0x18, 0x01, 0xe1, 0x00}, {0x1f, 0x01, 0xe1, 0x00},[m
[31m-        {0x29, 0x01, 0xe1, 0x00}, {0x38, 0x01, 0xe1, 0x01}[m
[31m-    },[m
[31m-    /* 185 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xec, 0x00}, {0x09, 0x01, 0xec, 0x00},[m
[31m-        {0x17, 0x01, 0xec, 0x00}, {0x28, 0x01, 0xec, 0x01},[m
[31m-        {0x02, 0x01, 0xed, 0x00}, {0x09, 0x01, 0xed, 0x00},[m
[31m-        {0x17, 0x01, 0xed, 0x00}, {0x28, 0x01, 0xed, 0x01},[m
[31m-        {0x01, 0x01, 0xc7, 0x00}, {0x16, 0x01, 0xc7, 0x01},[m
[31m-        {0x01, 0x01, 0xcf, 0x00}, {0x16, 0x01, 0xcf, 0x01},[m
[31m-        {0x01, 0x01, 0xea, 0x00}, {0x16, 0x01, 0xea, 0x01},[m
[31m-        {0x01, 0x01, 0xeb, 0x00}, {0x16, 0x01, 0xeb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xec, 0x00}, {0x06, 0x01, 0xec, 0x00},[m
[31m-        {0x0a, 0x01, 0xec, 0x00}, {0x0f, 0x01, 0xec, 0x00},[m
[31m-        {0x18, 0x01, 0xec, 0x00}, {0x1f, 0x01, 0xec, 0x00},[m
[31m-        {0x29, 0x01, 0xec, 0x00}, {0x38, 0x01, 0xec, 0x01},[m
[31m-        {0x03, 0x01, 0xed, 0x00}, {0x06, 0x01, 0xed, 0x00},[m
[31m-        {0x0a, 0x01, 0xed, 0x00}, {0x0f, 0x01, 0xed, 0x00},[m
[31m-        {0x18, 0x01, 0xed, 0x00}, {0x1f, 0x01, 0xed, 0x00},[m
[31m-        {0x29, 0x01, 0xed, 0x00}, {0x38, 0x01, 0xed, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xc7, 0x00}, {0x09, 0x01, 0xc7, 0x00},[m
[31m-        {0x17, 0x01, 0xc7, 0x00}, {0x28, 0x01, 0xc7, 0x01},[m
[31m-        {0x02, 0x01, 0xcf, 0x00}, {0x09, 0x01, 0xcf, 0x00},[m
[31m-        {0x17, 0x01, 0xcf, 0x00}, {0x28, 0x01, 0xcf, 0x01},[m
[31m-        {0x02, 0x01, 0xea, 0x00}, {0x09, 0x01, 0xea, 0x00},[m
[31m-        {0x17, 0x01, 0xea, 0x00}, {0x28, 0x01, 0xea, 0x01},[m
[31m-        {0x02, 0x01, 0xeb, 0x00}, {0x09, 0x01, 0xeb, 0x00},[m
[31m-        {0x17, 0x01, 0xeb, 0x00}, {0x28, 0x01, 0xeb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc7, 0x00}, {0x06, 0x01, 0xc7, 0x00},[m
[31m-        {0x0a, 0x01, 0xc7, 0x00}, {0x0f, 0x01, 0xc7, 0x00},[m
[31m-        {0x18, 0x01, 0xc7, 0x00}, {0x1f, 0x01, 0xc7, 0x00},[m
[31m-        {0x29, 0x01, 0xc7, 0x00}, {0x38, 0x01, 0xc7, 0x01},[m
[31m-        {0x03, 0x01, 0xcf, 0x00}, {0x06, 0x01, 0xcf, 0x00},[m
[31m-        {0x0a, 0x01, 0xcf, 0x00}, {0x0f, 0x01, 0xcf, 0x00},[m
[31m-        {0x18, 0x01, 0xcf, 0x00}, {0x1f, 0x01, 0xcf, 0x00},[m
[31m-        {0x29, 0x01, 0xcf, 0x00}, {0x38, 0x01, 0xcf, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xea, 0x00}, {0x06, 0x01, 0xea, 0x00},[m
[31m-        {0x0a, 0x01, 0xea, 0x00}, {0x0f, 0x01, 0xea, 0x00},[m
[31m-        {0x18, 0x01, 0xea, 0x00}, {0x1f, 0x01, 0xea, 0x00},[m
[31m-        {0x29, 0x01, 0xea, 0x00}, {0x38, 0x01, 0xea, 0x01},[m
[31m-        {0x03, 0x01, 0xeb, 0x00}, {0x06, 0x01, 0xeb, 0x00},[m
[31m-        {0x0a, 0x01, 0xeb, 0x00}, {0x0f, 0x01, 0xeb, 0x00},[m
[31m-        {0x18, 0x01, 0xeb, 0x00}, {0x1f, 0x01, 0xeb, 0x00},[m
[31m-        {0x29, 0x01, 0xeb, 0x00}, {0x38, 0x01, 0xeb, 0x01}[m
[31m-    },[m
[31m-    /* 190 */[m
[31m-    {[m
[31m-        {0xc2, 0x00, 0x00, 0x00}, {0xc3, 0x00, 0x00, 0x00},[m
[31m-        {0xc5, 0x00, 0x00, 0x00}, {0xc6, 0x00, 0x00, 0x00},[m
[31m-        {0xc9, 0x00, 0x00, 0x00}, {0xca, 0x00, 0x00, 0x00},[m
[31m-        {0xcc, 0x00, 0x00, 0x00}, {0xcd, 0x00, 0x00, 0x00},[m
[31m-        {0xd2, 0x00, 0x00, 0x00}, {0xd5, 0x00, 0x00, 0x00},[m
[31m-        {0xd9, 0x00, 0x00, 0x00}, {0xdc, 0x00, 0x00, 0x00},[m
[31m-        {0xe1, 0x00, 0x00, 0x00}, {0xe7, 0x00, 0x00, 0x00},[m
[31m-        {0xef, 0x00, 0x00, 0x00}, {0xf6, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xc0, 0x01}, {0x00, 0x01, 0xc1, 0x01},[m
[31m-        {0x00, 0x01, 0xc8, 0x01}, {0x00, 0x01, 0xc9, 0x01},[m
[31m-        {0x00, 0x01, 0xca, 0x01}, {0x00, 0x01, 0xcd, 0x01},[m
[31m-        {0x00, 0x01, 0xd2, 0x01}, {0x00, 0x01, 0xd5, 0x01},[m
[31m-        {0x00, 0x01, 0xda, 0x01}, {0x00, 0x01, 0xdb, 0x01},[m
[31m-        {0x00, 0x01, 0xee, 0x01}, {0x00, 0x01, 0xf0, 0x01},[m
[31m-        {0x00, 0x01, 0xf2, 0x01}, {0x00, 0x01, 0xf3, 0x01},[m
[31m-        {0x00, 0x01, 0xff, 0x01}, {0xce, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xc0, 0x00}, {0x16, 0x01, 0xc0, 0x01},[m
[31m-        {0x01, 0x01, 0xc1, 0x00}, {0x16, 0x01, 0xc1, 0x01},[m
[31m-        {0x01, 0x01, 0xc8, 0x00}, {0x16, 0x01, 0xc8, 0x01},[m
[31m-        {0x01, 0x01, 0xc9, 0x00}, {0x16, 0x01, 0xc9, 0x01},[m
[31m-        {0x01, 0x01, 0xca, 0x00}, {0x16, 0x01, 0xca, 0x01},[m
[31m-        {0x01, 0x01, 0xcd, 0x00}, {0x16, 0x01, 0xcd, 0x01},[m
[31m-        {0x01, 0x01, 0xd2, 0x00}, {0x16, 0x01, 0xd2, 0x01},[m
[31m-        {0x01, 0x01, 0xd5, 0x00}, {0x16, 0x01, 0xd5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xc0, 0x00}, {0x09, 0x01, 0xc0, 0x00},[m
[31m-        {0x17, 0x01, 0xc0, 0x00}, {0x28, 0x01, 0xc0, 0x01},[m
[31m-        {0x02, 0x01, 0xc1, 0x00}, {0x09, 0x01, 0xc1, 0x00},[m
[31m-        {0x17, 0x01, 0xc1, 0x00}, {0x28, 0x01, 0xc1, 0x01},[m
[31m-        {0x02, 0x01, 0xc8, 0x00}, {0x09, 0x01, 0xc8, 0x00},[m
[31m-        {0x17, 0x01, 0xc8, 0x00}, {0x28, 0x01, 0xc8, 0x01},[m
[31m-        {0x02, 0x01, 0xc9, 0x00}, {0x09, 0x01, 0xc9, 0x00},[m
[31m-        {0x17, 0x01, 0xc9, 0x00}, {0x28, 0x01, 0xc9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc0, 0x00}, {0x06, 0x01, 0xc0, 0x00},[m
[31m-        {0x0a, 0x01, 0xc0, 0x00}, {0x0f, 0x01, 0xc0, 0x00},[m
[31m-        {0x18, 0x01, 0xc0, 0x00}, {0x1f, 0x01, 0xc0, 0x00},[m
[31m-        {0x29, 0x01, 0xc0, 0x00}, {0x38, 0x01, 0xc0, 0x01},[m
[31m-        {0x03, 0x01, 0xc1, 0x00}, {0x06, 0x01, 0xc1, 0x00},[m
[31m-        {0x0a, 0x01, 0xc1, 0x00}, {0x0f, 0x01, 0xc1, 0x00},[m
[31m-        {0x18, 0x01, 0xc1, 0x00}, {0x1f, 0x01, 0xc1, 0x00},[m
[31m-        {0x29, 0x01, 0xc1, 0x00}, {0x38, 0x01, 0xc1, 0x01}[m
[31m-    },[m
[31m-    /* 195 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc8, 0x00}, {0x06, 0x01, 0xc8, 0x00},[m
[31m-        {0x0a, 0x01, 0xc8, 0x00}, {0x0f, 0x01, 0xc8, 0x00},[m
[31m-        {0x18, 0x01, 0xc8, 0x00}, {0x1f, 0x01, 0xc8, 0x00},[m
[31m-        {0x29, 0x01, 0xc8, 0x00}, {0x38, 0x01, 0xc8, 0x01},[m
[31m-        {0x03, 0x01, 0xc9, 0x00}, {0x06, 0x01, 0xc9, 0x00},[m
[31m-        {0x0a, 0x01, 0xc9, 0x00}, {0x0f, 0x01, 0xc9, 0x00},[m
[31m-        {0x18, 0x01, 0xc9, 0x00}, {0x1f, 0x01, 0xc9, 0x00},[m
[31m-        {0x29, 0x01, 0xc9, 0x00}, {0x38, 0x01, 0xc9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xca, 0x00}, {0x09, 0x01, 0xca, 0x00},[m
[31m-        {0x17, 0x01, 0xca, 0x00}, {0x28, 0x01, 0xca, 0x01},[m
[31m-        {0x02, 0x01, 0xcd, 0x00}, {0x09, 0x01, 0xcd, 0x00},[m
[31m-        {0x17, 0x01, 0xcd, 0x00}, {0x28, 0x01, 0xcd, 0x01},[m
[31m-        {0x02, 0x01, 0xd2, 0x00}, {0x09, 0x01, 0xd2, 0x00},[m
[31m-        {0x17, 0x01, 0xd2, 0x00}, {0x28, 0x01, 0xd2, 0x01},[m
[31m-        {0x02, 0x01, 0xd5, 0x00}, {0x09, 0x01, 0xd5, 0x00},[m
[31m-        {0x17, 0x01, 0xd5, 0x00}, {0x28, 0x01, 0xd5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xca, 0x00}, {0x06, 0x01, 0xca, 0x00},[m
[31m-        {0x0a, 0x01, 0xca, 0x00}, {0x0f, 0x01, 0xca, 0x00},[m
[31m-        {0x18, 0x01, 0xca, 0x00}, {0x1f, 0x01, 0xca, 0x00},[m
[31m-        {0x29, 0x01, 0xca, 0x00}, {0x38, 0x01, 0xca, 0x01},[m
[31m-        {0x03, 0x01, 0xcd, 0x00}, {0x06, 0x01, 0xcd, 0x00},[m
[31m-        {0x0a, 0x01, 0xcd, 0x00}, {0x0f, 0x01, 0xcd, 0x00},[m
[31m-        {0x18, 0x01, 0xcd, 0x00}, {0x1f, 0x01, 0xcd, 0x00},[m
[31m-        {0x29, 0x01, 0xcd, 0x00}, {0x38, 0x01, 0xcd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd2, 0x00}, {0x06, 0x01, 0xd2, 0x00},[m
[31m-        {0x0a, 0x01, 0xd2, 0x00}, {0x0f, 0x01, 0xd2, 0x00},[m
[31m-        {0x18, 0x01, 0xd2, 0x00}, {0x1f, 0x01, 0xd2, 0x00},[m
[31m-        {0x29, 0x01, 0xd2, 0x00}, {0x38, 0x01, 0xd2, 0x01},[m
[31m-        {0x03, 0x01, 0xd5, 0x00}, {0x06, 0x01, 0xd5, 0x00},[m
[31m-        {0x0a, 0x01, 0xd5, 0x00}, {0x0f, 0x01, 0xd5, 0x00},[m
[31m-        {0x18, 0x01, 0xd5, 0x00}, {0x1f, 0x01, 0xd5, 0x00},[m
[31m-        {0x29, 0x01, 0xd5, 0x00}, {0x38, 0x01, 0xd5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xda, 0x00}, {0x16, 0x01, 0xda, 0x01},[m
[31m-        {0x01, 0x01, 0xdb, 0x00}, {0x16, 0x01, 0xdb, 0x01},[m
[31m-        {0x01, 0x01, 0xee, 0x00}, {0x16, 0x01, 0xee, 0x01},[m
[31m-        {0x01, 0x01, 0xf0, 0x00}, {0x16, 0x01, 0xf0, 0x01},[m
[31m-        {0x01, 0x01, 0xf2, 0x00}, {0x16, 0x01, 0xf2, 0x01},[m
[31m-        {0x01, 0x01, 0xf3, 0x00}, {0x16, 0x01, 0xf3, 0x01},[m
[31m-        {0x01, 0x01, 0xff, 0x00}, {0x16, 0x01, 0xff, 0x01},[m
[31m-        {0x00, 0x01, 0xcb, 0x01}, {0x00, 0x01, 0xcc, 0x01}[m
[31m-    },[m
[31m-    /* 200 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xda, 0x00}, {0x09, 0x01, 0xda, 0x00},[m
[31m-        {0x17, 0x01, 0xda, 0x00}, {0x28, 0x01, 0xda, 0x01},[m
[31m-        {0x02, 0x01, 0xdb, 0x00}, {0x09, 0x01, 0xdb, 0x00},[m
[31m-        {0x17, 0x01, 0xdb, 0x00}, {0x28, 0x01, 0xdb, 0x01},[m
[31m-        {0x02, 0x01, 0xee, 0x00}, {0x09, 0x01, 0xee, 0x00},[m
[31m-        {0x17, 0x01, 0xee, 0x00}, {0x28, 0x01, 0xee, 0x01},[m
[31m-        {0x02, 0x01, 0xf0, 0x00}, {0x09, 0x01, 0xf0, 0x00},[m
[31m-        {0x17, 0x01, 0xf0, 0x00}, {0x28, 0x01, 0xf0, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xda, 0x00}, {0x06, 0x01, 0xda, 0x00},[m
[31m-        {0x0a, 0x01, 0xda, 0x00}, {0x0f, 0x01, 0xda, 0x00},[m
[31m-        {0x18, 0x01, 0xda, 0x00}, {0x1f, 0x01, 0xda, 0x00},[m
[31m-        {0x29, 0x01, 0xda, 0x00}, {0x38, 0x01, 0xda, 0x01},[m
[31m-        {0x03, 0x01, 0xdb, 0x00}, {0x06, 0x01, 0xdb, 0x00},[m
[31m-        {0x0a, 0x01, 0xdb, 0x00}, {0x0f, 0x01, 0xdb, 0x00},[m
[31m-        {0x18, 0x01, 0xdb, 0x00}, {0x1f, 0x01, 0xdb, 0x00},[m
[31m-        {0x29, 0x01, 0xdb, 0x00}, {0x38, 0x01, 0xdb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xee, 0x00}, {0x06, 0x01, 0xee, 0x00},[m
[31m-        {0x0a, 0x01, 0xee, 0x00}, {0x0f, 0x01, 0xee, 0x00},[m
[31m-        {0x18, 0x01, 0xee, 0x00}, {0x1f, 0x01, 0xee, 0x00},[m
[31m-        {0x29, 0x01, 0xee, 0x00}, {0x38, 0x01, 0xee, 0x01},[m
[31m-        {0x03, 0x01, 0xf0, 0x00}, {0x06, 0x01, 0xf0, 0x00},[m
[31m-        {0x0a, 0x01, 0xf0, 0x00}, {0x0f, 0x01, 0xf0, 0x00},[m
[31m-        {0x18, 0x01, 0xf0, 0x00}, {0x1f, 0x01, 0xf0, 0x00},[m
[31m-        {0x29, 0x01, 0xf0, 0x00}, {0x38, 0x01, 0xf0, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xf2, 0x00}, {0x09, 0x01, 0xf2, 0x00},[m
[31m-        {0x17, 0x01, 0xf2, 0x00}, {0x28, 0x01, 0xf2, 0x01},[m
[31m-        {0x02, 0x01, 0xf3, 0x00}, {0x09, 0x01, 0xf3, 0x00},[m
[31m-        {0x17, 0x01, 0xf3, 0x00}, {0x28, 0x01, 0xf3, 0x01},[m
[31m-        {0x02, 0x01, 0xff, 0x00}, {0x09, 0x01, 0xff, 0x00},[m
[31m-        {0x17, 0x01, 0xff, 0x00}, {0x28, 0x01, 0xff, 0x01},[m
[31m-        {0x01, 0x01, 0xcb, 0x00}, {0x16, 0x01, 0xcb, 0x01},[m
[31m-        {0x01, 0x01, 0xcc, 0x00}, {0x16, 0x01, 0xcc, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf2, 0x00}, {0x06, 0x01, 0xf2, 0x00},[m
[31m-        {0x0a, 0x01, 0xf2, 0x00}, {0x0f, 0x01, 0xf2, 0x00},[m
[31m-        {0x18, 0x01, 0xf2, 0x00}, {0x1f, 0x01, 0xf2, 0x00},[m
[31m-        {0x29, 0x01, 0xf2, 0x00}, {0x38, 0x01, 0xf2, 0x01},[m
[31m-        {0x03, 0x01, 0xf3, 0x00}, {0x06, 0x01, 0xf3, 0x00},[m
[31m-        {0x0a, 0x01, 0xf3, 0x00}, {0x0f, 0x01, 0xf3, 0x00},[m
[31m-        {0x18, 0x01, 0xf3, 0x00}, {0x1f, 0x01, 0xf3, 0x00},[m
[31m-        {0x29, 0x01, 0xf3, 0x00}, {0x38, 0x01, 0xf3, 0x01}[m
[31m-    },[m
[31m-    /* 205 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xff, 0x00}, {0x06, 0x01, 0xff, 0x00},[m
[31m-        {0x0a, 0x01, 0xff, 0x00}, {0x0f, 0x01, 0xff, 0x00},[m
[31m-        {0x18, 0x01, 0xff, 0x00}, {0x1f, 0x01, 0xff, 0x00},[m
[31m-        {0x29, 0x01, 0xff, 0x00}, {0x38, 0x01, 0xff, 0x01},[m
[31m-        {0x02, 0x01, 0xcb, 0x00}, {0x09, 0x01, 0xcb, 0x00},[m
[31m-        {0x17, 0x01, 0xcb, 0x00}, {0x28, 0x01, 0xcb, 0x01},[m
[31m-        {0x02, 0x01, 0xcc, 0x00}, {0x09, 0x01, 0xcc, 0x00},[m
[31m-        {0x17, 0x01, 0xcc, 0x00}, {0x28, 0x01, 0xcc, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xcb, 0x00}, {0x06, 0x01, 0xcb, 0x00},[m
[31m-        {0x0a, 0x01, 0xcb, 0x00}, {0x0f, 0x01, 0xcb, 0x00},[m
[31m-        {0x18, 0x01, 0xcb, 0x00}, {0x1f, 0x01, 0xcb, 0x00},[m
[31m-        {0x29, 0x01, 0xcb, 0x00}, {0x38, 0x01, 0xcb, 0x01},[m
[31m-        {0x03, 0x01, 0xcc, 0x00}, {0x06, 0x01, 0xcc, 0x00},[m
[31m-        {0x0a, 0x01, 0xcc, 0x00}, {0x0f, 0x01, 0xcc, 0x00},[m
[31m-        {0x18, 0x01, 0xcc, 0x00}, {0x1f, 0x01, 0xcc, 0x00},[m
[31m-        {0x29, 0x01, 0xcc, 0x00}, {0x38, 0x01, 0xcc, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0xd3, 0x00, 0x00, 0x00}, {0xd4, 0x00, 0x00, 0x00},[m
[31m-        {0xd6, 0x00, 0x00, 0x00}, {0xd7, 0x00, 0x00, 0x00},[m
[31m-        {0xda, 0x00, 0x00, 0x00}, {0xdb, 0x00, 0x00, 0x00},[m
[31m-        {0xdd, 0x00, 0x00, 0x00}, {0xde, 0x00, 0x00, 0x00},[m
[31m-        {0xe2, 0x00, 0x00, 0x00}, {0xe4, 0x00, 0x00, 0x00},[m
[31m-        {0xe8, 0x00, 0x00, 0x00}, {0xeb, 0x00, 0x00, 0x00},[m
[31m-        {0xf0, 0x00, 0x00, 0x00}, {0xf3, 0x00, 0x00, 0x00},[m
[31m-        {0xf7, 0x00, 0x00, 0x00}, {0xfa, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xd3, 0x01}, {0x00, 0x01, 0xd4, 0x01},[m
[31m-        {0x00, 0x01, 0xd6, 0x01}, {0x00, 0x01, 0xdd, 0x01},[m
[31m-        {0x00, 0x01, 0xde, 0x01}, {0x00, 0x01, 0xdf, 0x01},[m
[31m-        {0x00, 0x01, 0xf1, 0x01}, {0x00, 0x01, 0xf4, 0x01},[m
[31m-        {0x00, 0x01, 0xf5, 0x01}, {0x00, 0x01, 0xf6, 0x01},[m
[31m-        {0x00, 0x01, 0xf7, 0x01}, {0x00, 0x01, 0xf8, 0x01},[m
[31m-        {0x00, 0x01, 0xfa, 0x01}, {0x00, 0x01, 0xfb, 0x01},[m
[31m-        {0x00, 0x01, 0xfc, 0x01}, {0x00, 0x01, 0xfd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xd3, 0x00}, {0x16, 0x01, 0xd3, 0x01},[m
[31m-        {0x01, 0x01, 0xd4, 0x00}, {0x16, 0x01, 0xd4, 0x01},[m
[31m-        {0x01, 0x01, 0xd6, 0x00}, {0x16, 0x01, 0xd6, 0x01},[m
[31m-        {0x01, 0x01, 0xdd, 0x00}, {0x16, 0x01, 0xdd, 0x01},[m
[31m-        {0x01, 0x01, 0xde, 0x00}, {0x16, 0x01, 0xde, 0x01},[m
[31m-        {0x01, 0x01, 0xdf, 0x00}, {0x16, 0x01, 0xdf, 0x01},[m
[31m-        {0x01, 0x01, 0xf1, 0x00}, {0x16, 0x01, 0xf1, 0x01},[m
[31m-        {0x01, 0x01, 0xf4, 0x00}, {0x16, 0x01, 0xf4, 0x01}[m
[31m-    },[m
[31m-    /* 210 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xd3, 0x00}, {0x09, 0x01, 0xd3, 0x00},[m
[31m-        {0x17, 0x01, 0xd3, 0x00}, {0x28, 0x01, 0xd3, 0x01},[m
[31m-        {0x02, 0x01, 0xd4, 0x00}, {0x09, 0x01, 0xd4, 0x00},[m
[31m-        {0x17, 0x01, 0xd4, 0x00}, {0x28, 0x01, 0xd4, 0x01},[m
[31m-        {0x02, 0x01, 0xd6, 0x00}, {0x09, 0x01, 0xd6, 0x00},[m
[31m-        {0x17, 0x01, 0xd6, 0x00}, {0x28, 0x01, 0xd6, 0x01},[m
[31m-        {0x02, 0x01, 0xdd, 0x00}, {0x09, 0x01, 0xdd, 0x00},[m
[31m-        {0x17, 0x01, 0xdd, 0x00}, {0x28, 0x01, 0xdd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd3, 0x00}, {0x06, 0x01, 0xd3, 0x00},[m
[31m-        {0x0a, 0x01, 0xd3, 0x00}, {0x0f, 0x01, 0xd3, 0x00},[m
[31m-        {0x18, 0x01, 0xd3, 0x00}, {0x1f, 0x01, 0xd3, 0x00},[m
[31m-        {0x29, 0x01, 0xd3, 0x00}, {0x38, 0x01, 0xd3, 0x01},[m
[31m-        {0x03, 0x01, 0xd4, 0x00}, {0x06, 0x01, 0xd4, 0x00},[m
[31m-        {0x0a, 0x01, 0xd4, 0x00}, {0x0f, 0x01, 0xd4, 0x00},[m
[31m-        {0x18, 0x01, 0xd4, 0x00}, {0x1f, 0x01, 0xd4, 0x00},[m
[31m-        {0x29, 0x01, 0xd4, 0x00}, {0x38, 0x01, 0xd4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd6, 0x00}, {0x06, 0x01, 0xd6, 0x00},[m
[31m-        {0x0a, 0x01, 0xd6, 0x00}, {0x0f, 0x01, 0xd6, 0x00},[m
[31m-        {0x18, 0x01, 0xd6, 0x00}, {0x1f, 0x01, 0xd6, 0x00},[m
[31m-        {0x29, 0x01, 0xd6, 0x00}, {0x38, 0x01, 0xd6, 0x01},[m
[31m-        {0x03, 0x01, 0xdd, 0x00}, {0x06, 0x01, 0xdd, 0x00},[m
[31m-        {0x0a, 0x01, 0xdd, 0x00}, {0x0f, 0x01, 0xdd, 0x00},[m
[31m-        {0x18, 0x01, 0xdd, 0x00}, {0x1f, 0x01, 0xdd, 0x00},[m
[31m-        {0x29, 0x01, 0xdd, 0x00}, {0x38, 0x01, 0xdd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xde, 0x00}, {0x09, 0x01, 0xde, 0x00},[m
[31m-        {0x17, 0x01, 0xde, 0x00}, {0x28, 0x01, 0xde, 0x01},[m
[31m-        {0x02, 0x01, 0xdf, 0x00}, {0x09, 0x01, 0xdf, 0x00},[m
[31m-        {0x17, 0x01, 0xdf, 0x00}, {0x28, 0x01, 0xdf, 0x01},[m
[31m-        {0x02, 0x01, 0xf1, 0x00}, {0x09, 0x01, 0xf1, 0x00},[m
[31m-        {0x17, 0x01, 0xf1, 0x00}, {0x28, 0x01, 0xf1, 0x01},[m
[31m-        {0x02, 0x01, 0xf4, 0x00}, {0x09, 0x01, 0xf4, 0x00},[m
[31m-        {0x17, 0x01, 0xf4, 0x00}, {0x28, 0x01, 0xf4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xde, 0x00}, {0x06, 0x01, 0xde, 0x00},[m
[31m-        {0x0a, 0x01, 0xde, 0x00}, {0x0f, 0x01, 0xde, 0x00},[m
[31m-        {0x18, 0x01, 0xde, 0x00}, {0x1f, 0x01, 0xde, 0x00},[m
[31m-        {0x29, 0x01, 0xde, 0x00}, {0x38, 0x01, 0xde, 0x01},[m
[31m-        {0x03, 0x01, 0xdf, 0x00}, {0x06, 0x01, 0xdf, 0x00},[m
[31m-        {0x0a, 0x01, 0xdf, 0x00}, {0x0f, 0x01, 0xdf, 0x00},[m
[31m-        {0x18, 0x01, 0xdf, 0x00}, {0x1f, 0x01, 0xdf, 0x00},[m
[31m-        {0x29, 0x01, 0xdf, 0x00}, {0x38, 0x01, 0xdf, 0x01}[m
[31m-    },[m
[31m-    /* 215 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf1, 0x00}, {0x06, 0x01, 0xf1, 0x00},[m
[31m-        {0x0a, 0x01, 0xf1, 0x00}, {0x0f, 0x01, 0xf1, 0x00},[m
[31m-        {0x18, 0x01, 0xf1, 0x00}, {0x1f, 0x01, 0xf1, 0x00},[m
[31m-        {0x29, 0x01, 0xf1, 0x00}, {0x38, 0x01, 0xf1, 0x01},[m
[31m-        {0x03, 0x01, 0xf4, 0x00}, {0x06, 0x01, 0xf4, 0x00},[m
[31m-        {0x0a, 0x01, 0xf4, 0x00}, {0x0f, 0x01, 0xf4, 0x00},[m
[31m-        {0x18, 0x01, 0xf4, 0x00}, {0x1f, 0x01, 0xf4, 0x00},[m
[31m-        {0x29, 0x01, 0xf4, 0x00}, {0x38, 0x01, 0xf4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xf5, 0x00}, {0x16, 0x01, 0xf5, 0x01},[m
[31m-        {0x01, 0x01, 0xf6, 0x00}, {0x16, 0x01, 0xf6, 0x01},[m
[31m-        {0x01, 0x01, 0xf7, 0x00}, {0x16, 0x01, 0xf7, 0x01},[m
[31m-        {0x01, 0x01, 0xf8, 0x00}, {0x16, 0x01, 0xf8, 0x01},[m
[31m-        {0x01, 0x01, 0xfa, 0x00}, {0x16, 0x01, 0xfa, 0x01},[m
[31m-        {0x01, 0x01, 0xfb, 0x00}, {0x16, 0x01, 0xfb, 0x01},[m
[31m-        {0x01, 0x01, 0xfc, 0x00}, {0x16, 0x01, 0xfc, 0x01},[m
[31m-        {0x01, 0x01, 0xfd, 0x00}, {0x16, 0x01, 0xfd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xf5, 0x00}, {0x09, 0x01, 0xf5, 0x00},[m
[31m-        {0x17, 0x01, 0xf5, 0x00}, {0x28, 0x01, 0xf5, 0x01},[m
[31m-        {0x02, 0x01, 0xf6, 0x00}, {0x09, 0x01, 0xf6, 0x00},[m
[31m-        {0x17, 0x01, 0xf6, 0x00}, {0x28, 0x01, 0xf6, 0x01},[m
[31m-        {0x02, 0x01, 0xf7, 0x00}, {0x09, 0x01, 0xf7, 0x00},[m
[31m-        {0x17, 0x01, 0xf7, 0x00}, {0x28, 0x01, 0xf7, 0x01},[m
[31m-        {0x02, 0x01, 0xf8, 0x00}, {0x09, 0x01, 0xf8, 0x00},[m
[31m-        {0x17, 0x01, 0xf8, 0x00}, {0x28, 0x01, 0xf8, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf5, 0x00}, {0x06, 0x01, 0xf5, 0x00},[m
[31m-        {0x0a, 0x01, 0xf5, 0x00}, {0x0f, 0x01, 0xf5, 0x00},[m
[31m-        {0x18, 0x01, 0xf5, 0x00}, {0x1f, 0x01, 0xf5, 0x00},[m
[31m-        {0x29, 0x01, 0xf5, 0x00}, {0x38, 0x01, 0xf5, 0x01},[m
[31m-        {0x03, 0x01, 0xf6, 0x00}, {0x06, 0x01, 0xf6, 0x00},[m
[31m-        {0x0a, 0x01, 0xf6, 0x00}, {0x0f, 0x01, 0xf6, 0x00},[m
[31m-        {0x18, 0x01, 0xf6, 0x00}, {0x1f, 0x01, 0xf6, 0x00},[m
[31m-        {0x29, 0x01, 0xf6, 0x00}, {0x38, 0x01, 0xf6, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf7, 0x00}, {0x06, 0x01, 0xf7, 0x00},[m
[31m-        {0x0a, 0x01, 0xf7, 0x00}, {0x0f, 0x01, 0xf7, 0x00},[m
[31m-        {0x18, 0x01, 0xf7, 0x00}, {0x1f, 0x01, 0xf7, 0x00},[m
[31m-        {0x29, 0x01, 0xf7, 0x00}, {0x38, 0x01, 0xf7, 0x01},[m
[31m-        {0x03, 0x01, 0xf8, 0x00}, {0x06, 0x01, 0xf8, 0x00},[m
[31m-        {0x0a, 0x01, 0xf8, 0x00}, {0x0f, 0x01, 0xf8, 0x00},[m
[31m-        {0x18, 0x01, 0xf8, 0x00}, {0x1f, 0x01, 0xf8, 0x00},[m
[31m-        {0x29, 0x01, 0xf8, 0x00}, {0x38, 0x01, 0xf8, 0x01}[m
[31m-    },[m
[31m-    /* 220 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xfa, 0x00}, {0x09, 0x01, 0xfa, 0x00},[m
[31m-        {0x17, 0x01, 0xfa, 0x00}, {0x28, 0x01, 0xfa, 0x01},[m
[31m-        {0x02, 0x01, 0xfb, 0x00}, {0x09, 0x01, 0xfb, 0x00},[m
[31m-        {0x17, 0x01, 0xfb, 0x00}, {0x28, 0x01, 0xfb, 0x01},[m
[31m-        {0x02, 0x01, 0xfc, 0x00}, {0x09, 0x01, 0xfc, 0x00},[m
[31m-        {0x17, 0x01, 0xfc, 0x00}, {0x28, 0x01, 0xfc, 0x01},[m
[31m-        {0x02, 0x01, 0xfd, 0x00}, {0x09, 0x01, 0xfd, 0x00},[m
[31m-        {0x17, 0x01, 0xfd, 0x00}, {0x28, 0x01, 0xfd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xfa, 0x00}, {0x06, 0x01, 0xfa, 0x00},[m
[31m-        {0x0a, 0x01, 0xfa, 0x00}, {0x0f, 0x01, 0xfa, 0x00},[m
[31m-        {0x18, 0x01, 0xfa, 0x00}, {0x1f, 0x01, 0xfa, 0x00},[m
[31m-        {0x29, 0x01, 0xfa, 0x00}, {0x38, 0x01, 0xfa, 0x01},[m
[31m-        {0x03, 0x01, 0xfb, 0x00}, {0x06, 0x01, 0xfb, 0x00},[m
[31m-        {0x0a, 0x01, 0xfb, 0x00}, {0x0f, 0x01, 0xfb, 0x00},[m
[31m-        {0x18, 0x01, 0xfb, 0x00}, {0x1f, 0x01, 0xfb, 0x00},[m
[31m-        {0x29, 0x01, 0xfb, 0x00}, {0x38, 0x01, 0xfb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xfc, 0x00}, {0x06, 0x01, 0xfc, 0x00},[m
[31m-        {0x0a, 0x01, 0xfc, 0x00}, {0x0f, 0x01, 0xfc, 0x00},[m
[31m-        {0x18, 0x01, 0xfc, 0x00}, {0x1f, 0x01, 0xfc, 0x00},[m
[31m-        {0x29, 0x01, 0xfc, 0x00}, {0x38, 0x01, 0xfc, 0x01},[m
[31m-        {0x03, 0x01, 0xfd, 0x00}, {0x06, 0x01, 0xfd, 0x00},[m
[31m-        {0x0a, 0x01, 0xfd, 0x00}, {0x0f, 0x01, 0xfd, 0x00},[m
[31m-        {0x18, 0x01, 0xfd, 0x00}, {0x1f, 0x01, 0xfd, 0x00},[m
[31m-        {0x29, 0x01, 0xfd, 0x00}, {0x38, 0x01, 0xfd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xfe, 0x01}, {0xe3, 0x00, 0x00, 0x00},[m
[31m-        {0xe5, 0x00, 0x00, 0x00}, {0xe6, 0x00, 0x00, 0x00},[m
[31m-        {0xe9, 0x00, 0x00, 0x00}, {0xea, 0x00, 0x00, 0x00},[m
[31m-        {0xec, 0x00, 0x00, 0x00}, {0xed, 0x00, 0x00, 0x00},[m
[31m-        {0xf1, 0x00, 0x00, 0x00}, {0xf2, 0x00, 0x00, 0x00},[m
[31m-        {0xf4, 0x00, 0x00, 0x00}, {0xf5, 0x00, 0x00, 0x00},[m
[31m-        {0xf8, 0x00, 0x00, 0x00}, {0xf9, 0x00, 0x00, 0x00},[m
[31m-        {0xfb, 0x00, 0x00, 0x00}, {0xfc, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xfe, 0x00}, {0x16, 0x01, 0xfe, 0x01},[m
[31m-        {0x00, 0x01, 0x02, 0x01}, {0x00, 0x01, 0x03, 0x01},[m
[31m-        {0x00, 0x01, 0x04, 0x01}, {0x00, 0x01, 0x05, 0x01},[m
[31m-        {0x00, 0x01, 0x06, 0x01}, {0x00, 0x01, 0x07, 0x01},[m
[31m-        {0x00, 0x01, 0x08, 0x01}, {0x00, 0x01, 0x0b, 0x01},[m
[31m-        {0x00, 0x01, 0x0c, 0x01}, {0x00, 0x01, 0x0e, 0x01},[m
[31m-        {0x00, 0x01, 0x0f, 0x01}, {0x00, 0x01, 0x10, 0x01},[m
[31m-        {0x00, 0x01, 0x11, 0x01}, {0x00, 0x01, 0x12, 0x01}[m
[31m-    },[m
[31m-    /* 225 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xfe, 0x00}, {0x09, 0x01, 0xfe, 0x00},[m
[31m-        {0x17, 0x01, 0xfe, 0x00}, {0x28, 0x01, 0xfe, 0x01},[m
[31m-        {0x01, 0x01, 0x02, 0x00}, {0x16, 0x01, 0x02, 0x01},[m
[31m-        {0x01, 0x01, 0x03, 0x00}, {0x16, 0x01, 0x03, 0x01},[m
[31m-        {0x01, 0x01, 0x04, 0x00}, {0x16, 0x01, 0x04, 0x01},[m
[31m-        {0x01, 0x01, 0x05, 0x00}, {0x16, 0x01, 0x05, 0x01},[m
[31m-        {0x01, 0x01, 0x06, 0x00}, {0x16, 0x01, 0x06, 0x01},[m
[31m-        {0x01, 0x01, 0x07, 0x00}, {0x16, 0x01, 0x07, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xfe, 0x00}, {0x06, 0x01, 0xfe, 0x00},[m
[31m-        {0x0a, 0x01, 0xfe, 0x00}, {0x0f, 0x01, 0xfe, 0x00},[m
[31m-        {0x18, 0x01, 0xfe, 0x00}, {0x1f, 0x01, 0xfe, 0x00},[m
[31m-        {0x29, 0x01, 0xfe, 0x00}, {0x38, 0x01, 0xfe, 0x01},[m
[31m-        {0x02, 0x01, 0x02, 0x00}, {0x09, 0x01, 0x02, 0x00},[m
[31m-        {0x17, 0x01, 0x02, 0x00}, {0x28, 0x01, 0x02, 0x01},[m
[31m-        {0x02, 0x01, 0x03, 0x00}, {0x09, 0x01, 0x03, 0x00},[m
[31m-        {0x17, 0x01, 0x03, 0x00}, {0x28, 0x01, 0x03, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x02, 0x00}, {0x06, 0x01, 0x02, 0x00},[m
[31m-        {0x0a, 0x01, 0x02, 0x00}, {0x0f, 0x01, 0x02, 0x00},[m
[31m-        {0x18, 0x01, 0x02, 0x00}, {0x1f, 0x01, 0x02, 0x00},[m
[31m-        {0x29, 0x01, 0x02, 0x00}, {0x38, 0x01, 0x02, 0x01},[m
[31m-        {0x03, 0x01, 0x03, 0x00}, {0x06, 0x01, 0x03, 0x00},[m
[31m-        {0x0a, 0x01, 0x03, 0x00}, {0x0f, 0x01, 0x03, 0x00},[m
[31m-        {0x18, 0x01, 0x03, 0x00}, {0x1f, 0x01, 0x03, 0x00},[m
[31m-        {0x29, 0x01, 0x03, 0x00}, {0x38, 0x01, 0x03, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x04, 0x00}, {0x09, 0x01, 0x04, 0x00},[m
[31m-        {0x17, 0x01, 0x04, 0x00}, {0x28, 0x01, 0x04, 0x01},[m
[31m-        {0x02, 0x01, 0x05, 0x00}, {0x09, 0x01, 0x05, 0x00},[m
[31m-        {0x17, 0x01, 0x05, 0x00}, {0x28, 0x01, 0x05, 0x01},[m
[31m-        {0x02, 0x01, 0x06, 0x00}, {0x09, 0x01, 0x06, 0x00},[m
[31m-        {0x17, 0x01, 0x06, 0x00}, {0x28, 0x01, 0x06, 0x01},[m
[31m-        {0x02, 0x01, 0x07, 0x00}, {0x09, 0x01, 0x07, 0x00},[m
[31m-        {0x17, 0x01, 0x07, 0x00}, {0x28, 0x01, 0x07, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x04, 0x00}, {0x06, 0x01, 0x04, 0x00},[m
[31m-        {0x0a, 0x01, 0x04, 0x00}, {0x0f, 0x01, 0x04, 0x00},[m
[31m-        {0x18, 0x01, 0x04, 0x00}, {0x1f, 0x01, 0x04, 0x00},[m
[31m-        {0x29, 0x01, 0x04, 0x00}, {0x38, 0x01, 0x04, 0x01},[m
[31m-        {0x03, 0x01, 0x05, 0x00}, {0x06, 0x01, 0x05, 0x00},[m
[31m-        {0x0a, 0x01, 0x05, 0x00}, {0x0f, 0x01, 0x05, 0x00},[m
[31m-        {0x18, 0x01, 0x05, 0x00}, {0x1f, 0x01, 0x05, 0x00},[m
[31m-        {0x29, 0x01, 0x05, 0x00}, {0x38, 0x01, 0x05, 0x01}[m
[31m-    },[m
[31m-    /* 230 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x06, 0x00}, {0x06, 0x01, 0x06, 0x00},[m
[31m-        {0x0a, 0x01, 0x06, 0x00}, {0x0f, 0x01, 0x06, 0x00},[m
[31m-        {0x18, 0x01, 0x06, 0x00}, {0x1f, 0x01, 0x06, 0x00},[m
[31m-        {0x29, 0x01, 0x06, 0x00}, {0x38, 0x01, 0x06, 0x01},[m
[31m-        {0x03, 0x01, 0x07, 0x00}, {0x06, 0x01, 0x07, 0x00},[m
[31m-        {0x0a, 0x01, 0x07, 0x00}, {0x0f, 0x01, 0x07, 0x00},[m
[31m-        {0x18, 0x01, 0x07, 0x00}, {0x1f, 0x01, 0x07, 0x00},[m
[31m-        {0x29, 0x01, 0x07, 0x00}, {0x38, 0x01, 0x07, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x08, 0x00}, {0x16, 0x01, 0x08, 0x01},[m
[31m-        {0x01, 0x01, 0x0b, 0x00}, {0x16, 0x01, 0x0b, 0x01},[m
[31m-        {0x01, 0x01, 0x0c, 0x00}, {0x16, 0x01, 0x0c, 0x01},[m
[31m-        {0x01, 0x01, 0x0e, 0x00}, {0x16, 0x01, 0x0e, 0x01},[m
[31m-        {0x01, 0x01, 0x0f, 0x00}, {0x16, 0x01, 0x0f, 0x01},[m
[31m-        {0x01, 0x01, 0x10, 0x00}, {0x16, 0x01, 0x10, 0x01},[m
[31m-        {0x01, 0x01, 0x11, 0x00}, {0x16, 0x01, 0x11, 0x01},[m
[31m-        {0x01, 0x01, 0x12, 0x00}, {0x16, 0x01, 0x12, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x08, 0x00}, {0x09, 0x01, 0x08, 0x00},[m
[31m-        {0x17, 0x01, 0x08, 0x00}, {0x28, 0x01, 0x08, 0x01},[m
[31m-        {0x02, 0x01, 0x0b, 0x00}, {0x09, 0x01, 0x0b, 0x00},[m
[31m-        {0x17, 0x01, 0x0b, 0x00}, {0x28, 0x01, 0x0b, 0x01},[m
[31m-        {0x02, 0x01, 0x0c, 0x00}, {0x09, 0x01, 0x0c, 0x00},[m
[31m-        {0x17, 0x01, 0x0c, 0x00}, {0x28, 0x01, 0x0c, 0x01},[m
[31m-        {0x02, 0x01, 0x0e, 0x00}, {0x09, 0x01, 0x0e, 0x00},[m
[31m-        {0x17, 0x01, 0x0e, 0x00}, {0x28, 0x01, 0x0e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x08, 0x00}, {0x06, 0x01, 0x08, 0x00},[m
[31m-        {0x0a, 0x01, 0x08, 0x00}, {0x0f, 0x01, 0x08, 0x00},[m
[31m-        {0x18, 0x01, 0x08, 0x00}, {0x1f, 0x01, 0x08, 0x00},[m
[31m-        {0x29, 0x01, 0x08, 0x00}, {0x38, 0x01, 0x08, 0x01},[m
[31m-        {0x03, 0x01, 0x0b, 0x00}, {0x06, 0x01, 0x0b, 0x00},[m
[31m-        {0x0a, 0x01, 0x0b, 0x00}, {0x0f, 0x01, 0x0b, 0x00},[m
[31m-        {0x18, 0x01, 0x0b, 0x00}, {0x1f, 0x01, 0x0b, 0x00},[m
[31m-        {0x29, 0x01, 0x0b, 0x00}, {0x38, 0x01, 0x0b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x0c, 0x00}, {0x06, 0x01, 0x0c, 0x00},[m
[31m-        {0x0a, 0x01, 0x0c, 0x00}, {0x0f, 0x01, 0x0c, 0x00},[m
[31m-        {0x18, 0x01, 0x0c, 0x00}, {0x1f, 0x01, 0x0c, 0x00},[m
[31m-        {0x29, 0x01, 0x0c, 0x00}, {0x38, 0x01, 0x0c, 0x01},[m
[31m-        {0x03, 0x01, 0x0e, 0x00}, {0x06, 0x01, 0x0e, 0x00},[m
[31m-        {0x0a, 0x01, 0x0e, 0x00}, {0x0f, 0x01, 0x0e, 0x00},[m
[31m-        {0x18, 0x01, 0x0e, 0x00}, {0x1f, 0x01, 0x0e, 0x00},[m
[31m-        {0x29, 0x01, 0x0e, 0x00}, {0x38, 0x01, 0x0e, 0x01}[m
[31m-    },[m
[31m-    /* 235 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x0f, 0x00}, {0x09, 0x01, 0x0f, 0x00},[m
[31m-        {0x17, 0x01, 0x0f, 0x00}, {0x28, 0x01, 0x0f, 0x01},[m
[31m-        {0x02, 0x01, 0x10, 0x00}, {0x09, 0x01, 0x10, 0x00},[m
[31m-        {0x17, 0x01, 0x10, 0x00}, {0x28, 0x01, 0x10, 0x01},[m
[31m-        {0x02, 0x01, 0x11, 0x00}, {0x09, 0x01, 0x11, 0x00},[m
[31m-        {0x17, 0x01, 0x11, 0x00}, {0x28, 0x01, 0x11, 0x01},[m
[31m-        {0x02, 0x01, 0x12, 0x00}, {0x09, 0x01, 0x12, 0x00},[m
[31m-        {0x17, 0x01, 0x12, 0x00}, {0x28, 0x01, 0x12, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x0f, 0x00}, {0x06, 0x01, 0x0f, 0x00},[m
[31m-        {0x0a, 0x01, 0x0f, 0x00}, {0x0f, 0x01, 0x0f, 0x00},[m
[31m-        {0x18, 0x01, 0x0f, 0x00}, {0x1f, 0x01, 0x0f, 0x00},[m
[31m-        {0x29, 0x01, 0x0f, 0x00}, {0x38, 0x01, 0x0f, 0x01},[m
[31m-        {0x03, 0x01, 0x10, 0x00}, {0x06, 0x01, 0x10, 0x00},[m
[31m-        {0x0a, 0x01, 0x10, 0x00}, {0x0f, 0x01, 0x10, 0x00},[m
[31m-        {0x18, 0x01, 0x10, 0x00}, {0x1f, 0x01, 0x10, 0x00},[m
[31m-        {0x29, 0x01, 0x10, 0x00}, {0x38, 0x01, 0x10, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x11, 0x00}, {0x06, 0x01, 0x11, 0x00},[m
[31m-        {0x0a, 0x01, 0x11, 0x00}, {0x0f, 0x01, 0x11, 0x00},[m
[31m-        {0x18, 0x01, 0x11, 0x00}, {0x1f, 0x01, 0x11, 0x00},[m
[31m-        {0x29, 0x01, 0x11, 0x00}, {0x38, 0x01, 0x11, 0x01},[m
[31m-        {0x03, 0x01, 0x12, 0x00}, {0x06, 0x01, 0x12, 0x00},[m
[31m-        {0x0a, 0x01, 0x12, 0x00}, {0x0f, 0x01, 0x12, 0x00},[m
[31m-        {0x18, 0x01, 0x12, 0x00}, {0x1f, 0x01, 0x12, 0x00},[m
[31m-        {0x29, 0x01, 0x12, 0x00}, {0x38, 0x01, 0x12, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x13, 0x01}, {0x00, 0x01, 0x14, 0x01},[m
[31m-        {0x00, 0x01, 0x15, 0x01}, {0x00, 0x01, 0x17, 0x01},[m
[31m-        {0x00, 0x01, 0x18, 0x01}, {0x00, 0x01, 0x19, 0x01},[m
[31m-        {0x00, 0x01, 0x1a, 0x01}, {0x00, 0x01, 0x1b, 0x01},[m
[31m-        {0x00, 0x01, 0x1c, 0x01}, {0x00, 0x01, 0x1d, 0x01},[m
[31m-        {0x00, 0x01, 0x1e, 0x01}, {0x00, 0x01, 0x1f, 0x01},[m
[31m-        {0x00, 0x01, 0x7f, 0x01}, {0x00, 0x01, 0xdc, 0x01},[m
[31m-        {0x00, 0x01, 0xf9, 0x01}, {0xfd, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x13, 0x00}, {0x16, 0x01, 0x13, 0x01},[m
[31m-        {0x01, 0x01, 0x14, 0x00}, {0x16, 0x01, 0x14, 0x01},[m
[31m-        {0x01, 0x01, 0x15, 0x00}, {0x16, 0x01, 0x15, 0x01},[m
[31m-        {0x01, 0x01, 0x17, 0x00}, {0x16, 0x01, 0x17, 0x01},[m
[31m-        {0x01, 0x01, 0x18, 0x00}, {0x16, 0x01, 0x18, 0x01},[m
[31m-        {0x01, 0x01, 0x19, 0x00}, {0x16, 0x01, 0x19, 0x01},[m
[31m-        {0x01, 0x01, 0x1a, 0x00}, {0x16, 0x01, 0x1a, 0x01},[m
[31m-        {0x01, 0x01, 0x1b, 0x00}, {0x16, 0x01, 0x1b, 0x01}[m
[31m-    },[m
[31m-    /* 240 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x13, 0x00}, {0x09, 0x01, 0x13, 0x00},[m
[31m-        {0x17, 0x01, 0x13, 0x00}, {0x28, 0x01, 0x13, 0x01},[m
[31m-        {0x02, 0x01, 0x14, 0x00}, {0x09, 0x01, 0x14, 0x00},[m
[31m-        {0x17, 0x01, 0x14, 0x00}, {0x28, 0x01, 0x14, 0x01},[m
[31m-        {0x02, 0x01, 0x15, 0x00}, {0x09, 0x01, 0x15, 0x00},[m
[31m-        {0x17, 0x01, 0x15, 0x00}, {0x28, 0x01, 0x15, 0x01},[m
[31m-        {0x02, 0x01, 0x17, 0x00}, {0x09, 0x01, 0x17, 0x00},[m
[31m-        {0x17, 0x01, 0x17, 0x00}, {0x28, 0x01, 0x17, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x13, 0x00}, {0x06, 0x01, 0x13, 0x00},[m
[31m-        {0x0a, 0x01, 0x13, 0x00}, {0x0f, 0x01, 0x13, 0x00},[m
[31m-        {0x18, 0x01, 0x13, 0x00}, {0x1f, 0x01, 0x13, 0x00},[m
[31m-        {0x29, 0x01, 0x13, 0x00}, {0x38, 0x01, 0x13, 0x01},[m
[31m-        {0x03, 0x01, 0x14, 0x00}, {0x06, 0x01, 0x14, 0x00},[m
[31m-        {0x0a, 0x01, 0x14, 0x00}, {0x0f, 0x01, 0x14, 0x00},[m
[31m-        {0x18, 0x01, 0x14, 0x00}, {0x1f, 0x01, 0x14, 0x00},[m
[31m-        {0x29, 0x01, 0x14, 0x00}, {0x38, 0x01, 0x14, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x15, 0x00}, {0x06, 0x01, 0x15, 0x00},[m
[31m-        {0x0a, 0x01, 0x15, 0x00}, {0x0f, 0x01, 0x15, 0x00},[m
[31m-        {0x18, 0x01, 0x15, 0x00}, {0x1f, 0x01, 0x15, 0x00},[m
[31m-        {0x29, 0x01, 0x15, 0x00}, {0x38, 0x01, 0x15, 0x01},[m
[31m-        {0x03, 0x01, 0x17, 0x00}, {0x06, 0x01, 0x17, 0x00},[m
[31m-        {0x0a, 0x01, 0x17, 0x00}, {0x0f, 0x01, 0x17, 0x00},[m
[31m-        {0x18, 0x01, 0x17, 0x00}, {0x1f, 0x01, 0x17, 0x00},[m
[31m-        {0x29, 0x01, 0x17, 0x00}, {0x38, 0x01, 0x17, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x18, 0x00}, {0x09, 0x01, 0x18, 0x00},[m
[31m-        {0x17, 0x01, 0x18, 0x00}, {0x28, 0x01, 0x18, 0x01},[m
[31m-        {0x02, 0x01, 0x19, 0x00}, {0x09, 0x01, 0x19, 0x00},[m
[31m-        {0x17, 0x01, 0x19, 0x00}, {0x28, 0x01, 0x19, 0x01},[m
[31m-        {0x02, 0x01, 0x1a, 0x00}, {0x09, 0x01, 0x1a, 0x00},[m
[31m-        {0x17, 0x01, 0x1a, 0x00}, {0x28, 0x01, 0x1a, 0x01},[m
[31m-        {0x02, 0x01, 0x1b, 0x00}, {0x09, 0x01, 0x1b, 0x00},[m
[31m-        {0x17, 0x01, 0x1b, 0x00}, {0x28, 0x01, 0x1b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x18, 0x00}, {0x06, 0x01, 0x18, 0x00},[m
[31m-        {0x0a, 0x01, 0x18, 0x00}, {0x0f, 0x01, 0x18, 0x00},[m
[31m-        {0x18, 0x01, 0x18, 0x00}, {0x1f, 0x01, 0x18, 0x00},[m
[31m-        {0x29, 0x01, 0x18, 0x00}, {0x38, 0x01, 0x18, 0x01},[m
[31m-        {0x03, 0x01, 0x19, 0x00}, {0x06, 0x01, 0x19, 0x00},[m
[31m-        {0x0a, 0x01, 0x19, 0x00}, {0x0f, 0x01, 0x19, 0x00},[m
[31m-        {0x18, 0x01, 0x19, 0x00}, {0x1f, 0x01, 0x19, 0x00},[m
[31m-        {0x29, 0x01, 0x19, 0x00}, {0x38, 0x01, 0x19, 0x01}[m
[31m-    },[m
[31m-    /* 245 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x1a, 0x00}, {0x06, 0x01, 0x1a, 0x00},[m
[31m-        {0x0a, 0x01, 0x1a, 0x00}, {0x0f, 0x01, 0x1a, 0x00},[m
[31m-        {0x18, 0x01, 0x1a, 0x00}, {0x1f, 0x01, 0x1a, 0x00},[m
[31m-        {0x29, 0x01, 0x1a, 0x00}, {0x38, 0x01, 0x1a, 0x01},[m
[31m-        {0x03, 0x01, 0x1b, 0x00}, {0x06, 0x01, 0x1b, 0x00},[m
[31m-        {0x0a, 0x01, 0x1b, 0x00}, {0x0f, 0x01, 0x1b, 0x00},[m
[31m-        {0x18, 0x01, 0x1b, 0x00}, {0x1f, 0x01, 0x1b, 0x00},[m
[31m-        {0x29, 0x01, 0x1b, 0x00}, {0x38, 0x01, 0x1b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x1c, 0x00}, {0x16, 0x01, 0x1c, 0x01},[m
[31m-        {0x01, 0x01, 0x1d, 0x00}, {0x16, 0x01, 0x1d, 0x01},[m
[31m-        {0x01, 0x01, 0x1e, 0x00}, {0x16, 0x01, 0x1e, 0x01},[m
[31m-        {0x01, 0x01, 0x1f, 0x00}, {0x16, 0x01, 0x1f, 0x01},[m
[31m-        {0x01, 0x01, 0x7f, 0x00}, {0x16, 0x01, 0x7f, 0x01},[m
[31m-        {0x01, 0x01, 0xdc, 0x00}, {0x16, 0x01, 0xdc, 0x01},[m
[31m-        {0x01, 0x01, 0xf9, 0x00}, {0x16, 0x01, 0xf9, 0x01},[m
[31m-        {0xfe, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x1c, 0x00}, {0x09, 0x01, 0x1c, 0x00},[m
[31m-        {0x17, 0x01, 0x1c, 0x00}, {0x28, 0x01, 0x1c, 0x01},[m
[31m-        {0x02, 0x01, 0x1d, 0x00}, {0x09, 0x01, 0x1d, 0x00},[m
[31m-        {0x17, 0x01, 0x1d, 0x00}, {0x28, 0x01, 0x1d, 0x01},[m
[31m-        {0x02, 0x01, 0x1e, 0x00}, {0x09, 0x01, 0x1e, 0x00},[m
[31m-        {0x17, 0x01, 0x1e, 0x00}, {0x28, 0x01, 0x1e, 0x01},[m
[31m-        {0x02, 0x01, 0x1f, 0x00}, {0x09, 0x01, 0x1f, 0x00},[m
[31m-        {0x17, 0x01, 0x1f, 0x00}, {0x28, 0x01, 0x1f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x1c, 0x00}, {0x06, 0x01, 0x1c, 0x00},[m
[31m-        {0x0a, 0x01, 0x1c, 0x00}, {0x0f, 0x01, 0x1c, 0x00},[m
[31m-        {0x18, 0x01, 0x1c, 0x00}, {0x1f, 0x01, 0x1c, 0x00},[m
[31m-        {0x29, 0x01, 0x1c, 0x00}, {0x38, 0x01, 0x1c, 0x01},[m
[31m-        {0x03, 0x01, 0x1d, 0x00}, {0x06, 0x01, 0x1d, 0x00},[m
[31m-        {0x0a, 0x01, 0x1d, 0x00}, {0x0f, 0x01, 0x1d, 0x00},[m
[31m-        {0x18, 0x01, 0x1d, 0x00}, {0x1f, 0x01, 0x1d, 0x00},[m
[31m-        {0x29, 0x01, 0x1d, 0x00}, {0x38, 0x01, 0x1d, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x1e, 0x00}, {0x06, 0x01, 0x1e, 0x00},[m
[31m-        {0x0a, 0x01, 0x1e, 0x00}, {0x0f, 0x01, 0x1e, 0x00},[m
[31m-        {0x18, 0x01, 0x1e, 0x00}, {0x1f, 0x01, 0x1e, 0x00},[m
[31m-        {0x29, 0x01, 0x1e, 0x00}, {0x38, 0x01, 0x1e, 0x01},[m
[31m-        {0x03, 0x01, 0x1f, 0x00}, {0x06, 0x01, 0x1f, 0x00},[m
[31m-        {0x0a, 0x01, 0x1f, 0x00}, {0x0f, 0x01, 0x1f, 0x00},[m
[31m-        {0x18, 0x01, 0x1f, 0x00}, {0x1f, 0x01, 0x1f, 0x00},[m
[31m-        {0x29, 0x01, 0x1f, 0x00}, {0x38, 0x01, 0x1f, 0x01}[m
[31m-    },[m
[31m-    /* 250 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x7f, 0x00}, {0x09, 0x01, 0x7f, 0x00},[m
[31m-        {0x17, 0x01, 0x7f, 0x00}, {0x28, 0x01, 0x7f, 0x01},[m
[31m-        {0x02, 0x01, 0xdc, 0x00}, {0x09, 0x01, 0xdc, 0x00},[m
[31m-        {0x17, 0x01, 0xdc, 0x00}, {0x28, 0x01, 0xdc, 0x01},[m
[31m-        {0x02, 0x01, 0xf9, 0x00}, {0x09, 0x01, 0xf9, 0x00},[m
[31m-        {0x17, 0x01, 0xf9, 0x00}, {0x28, 0x01, 0xf9, 0x01},[m
[31m-        {0x00, 0x01, 0x0a, 0x01}, {0x00, 0x01, 0x0d, 0x01},[m
[31m-        {0x00, 0x01, 0x16, 0x01}, {0xfa, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x7f, 0x00}, {0x06, 0x01, 0x7f, 0x00},[m
[31m-        {0x0a, 0x01, 0x7f, 0x00}, {0x0f, 0x01, 0x7f, 0x00},[m
[31m-        {0x18, 0x01, 0x7f, 0x00}, {0x1f, 0x01, 0x7f, 0x00},[m
[31m-        {0x29, 0x01, 0x7f, 0x00}, {0x38, 0x01, 0x7f, 0x01},[m
[31m-        {0x03, 0x01, 0xdc, 0x00}, {0x06, 0x01, 0xdc, 0x00},[m
[31m-        {0x0a, 0x01, 0xdc, 0x00}, {0x0f, 0x01, 0xdc, 0x00},[m
[31m-        {0x18, 0x01, 0xdc, 0x00}, {0x1f, 0x01, 0xdc, 0x00},[m
[31m-        {0x29, 0x01, 0xdc, 0x00}, {0x38, 0x01, 0xdc, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf9, 0x00}, {0x06, 0x01, 0xf9, 0x00},[m
[31m-        {0x0a, 0x01, 0xf9, 0x00}, {0x0f, 0x01, 0xf9, 0x00},[m
[31m-        {0x18, 0x01, 0xf9, 0x00}, {0x1f, 0x01, 0xf9, 0x00},[m
[31m-        {0x29, 0x01, 0xf9, 0x00}, {0x38, 0x01, 0xf9, 0x01},[m
[31m-        {0x01, 0x01, 0x0a, 0x00}, {0x16, 0x01, 0x0a, 0x01},[m
[31m-        {0x01, 0x01, 0x0d, 0x00}, {0x16, 0x01, 0x0d, 0x01},[m
[31m-        {0x01, 0x01, 0x16, 0x00}, {0x16, 0x01, 0x16, 0x01},[m
[31m-        {0xfc, 0x00, 0x00, 0x00}, {0xfc, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x0a, 0x00}, {0x09, 0x01, 0x0a, 0x00},[m
[31m-        {0x17, 0x01, 0x0a, 0x00}, {0x28, 0x01, 0x0a, 0x01},[m
[31m-        {0x02, 0x01, 0x0d, 0x00}, {0x09, 0x01, 0x0d, 0x00},[m
[31m-        {0x17, 0x01, 0x0d, 0x00}, {0x28, 0x01, 0x0d, 0x01},[m
[31m-        {0x02, 0x01, 0x16, 0x00}, {0x09, 0x01, 0x16, 0x00},[m
[31m-        {0x17, 0x01, 0x16, 0x00}, {0x28, 0x01, 0x16, 0x01},[m
[31m-        {0xfd, 0x00, 0x00, 0x00}, {0xfd, 0x00, 0x00, 0x00},[m
[31m-        {0xfd, 0x00, 0x00, 0x00}, {0xfd, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x0a, 0x00}, {0x06, 0x01, 0x0a, 0x00},[m
[31m-        {0x0a, 0x01, 0x0a, 0x00}, {0x0f, 0x01, 0x0a, 0x00},[m
[31m-        {0x18, 0x01, 0x0a, 0x00}, {0x1f, 0x01, 0x0a, 0x00},[m
[31m-        {0x29, 0x01, 0x0a, 0x00}, {0x38, 0x01, 0x0a, 0x01},[m
[31m-        {0x03, 0x01, 0x0d, 0x00}, {0x06, 0x01, 0x0d, 0x00},[m
[31m-        {0x0a, 0x01, 0x0d, 0x00}, {0x0f, 0x01, 0x0d, 0x00},[m
[31m-        {0x18, 0x01, 0x0d, 0x00}, {0x1f, 0x01, 0x0d, 0x00},[m
[31m-        {0x29, 0x01, 0x0d, 0x00}, {0x38, 0x01, 0x0d, 0x01}[m
[31m-    },[m
[31m-    /* 255 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x16, 0x00}, {0x06, 0x01, 0x16, 0x00},[m
[31m-        {0x0a, 0x01, 0x16, 0x00}, {0x0f, 0x01, 0x16, 0x00},[m
[31m-        {0x18, 0x01, 0x16, 0x00}, {0x1f, 0x01, 0x16, 0x00},[m
[31m-        {0x29, 0x01, 0x16, 0x00}, {0x38, 0x01, 0x16, 0x01},[m
[31m-        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},[m
[31m-        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},[m
[31m-        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},[m
[31m-        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00}[m
[31m-    }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_huff_decode(u_char *state, u_char *src, size_t len, u_char **dst,[m
[31m-    ngx_uint_t last, ngx_log_t *log)[m
[31m-{[m
[31m-    u_char  *end, ch, ending;[m
[31m-[m
[31m-    ch = 0;[m
[31m-    ending = 1;[m
[31m-[m
[31m-    end = src + len;[m
[31m-[m
[31m-    while (src != end) {[m
[31m-        ch = *src++;[m
[31m-[m
[31m-        if (ngx_http_v2_huff_decode_bits(state, &ending, ch >> 4, dst)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                           "http2 huffman decoding error at state %d: "[m
[31m-                           "bad code 0x%Xd", *state, ch >> 4);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_v2_huff_decode_bits(state, &ending, ch & 0xf, dst)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                           "http2 huffman decoding error at state %d: "[m
[31m-                           "bad code 0x%Xd", *state, ch & 0xf);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        if (!ending) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                           "http2 huffman decoding error: "[m
[31m-                           "incomplete code 0x%Xd", ch);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *state = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_v2_huff_decode_bits(u_char *state, u_char *ending, ngx_uint_t bits,[m
[31m-    u_char **dst)[m
[31m-{[m
[31m-    ngx_http_v2_huff_decode_code_t  code;[m
[31m-[m
[31m-    code = ngx_http_v2_huff_decode_codes[*state][bits];[m
[31m-[m
[31m-    if (code.next == *state) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (code.emit) {[m
[31m-        *(*dst)++ = code.sym;[m
[31m-    }[m
[31m-[m
[31m-    *ending = code.ending;[m
[31m-    *state = code.next;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_encode.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_encode.c[m
[1mdeleted file mode 100644[m
[1mindex 3f822cd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_encode.c[m
[1m+++ /dev/null[m
[36m@@ -1,254 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- * Copyright (C) 2015 Vlad Krasnov[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t  code;[m
[31m-    uint32_t  len;[m
[31m-} ngx_http_v2_huff_encode_code_t;[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_huff_encode_code_t  ngx_http_v2_huff_encode_table[256] =[m
[31m-{[m
[31m-    {0x00001ff8, 13}, {0x007fffd8, 23}, {0x0fffffe2, 28}, {0x0fffffe3, 28},[m
[31m-    {0x0fffffe4, 28}, {0x0fffffe5, 28}, {0x0fffffe6, 28}, {0x0fffffe7, 28},[m
[31m-    {0x0fffffe8, 28}, {0x00ffffea, 24}, {0x3ffffffc, 30}, {0x0fffffe9, 28},[m
[31m-    {0x0fffffea, 28}, {0x3ffffffd, 30}, {0x0fffffeb, 28}, {0x0fffffec, 28},[m
[31m-    {0x0fffffed, 28}, {0x0fffffee, 28}, {0x0fffffef, 28}, {0x0ffffff0, 28},[m
[31m-    {0x0ffffff1, 28}, {0x0ffffff2, 28}, {0x3ffffffe, 30}, {0x0ffffff3, 28},[m
[31m-    {0x0ffffff4, 28}, {0x0ffffff5, 28}, {0x0ffffff6, 28}, {0x0ffffff7, 28},[m
[31m-    {0x0ffffff8, 28}, {0x0ffffff9, 28}, {0x0ffffffa, 28}, {0x0ffffffb, 28},[m
[31m-    {0x00000014,  6}, {0x000003f8, 10}, {0x000003f9, 10}, {0x00000ffa, 12},[m
[31m-    {0x00001ff9, 13}, {0x00000015,  6}, {0x000000f8,  8}, {0x000007fa, 11},[m
[31m-    {0x000003fa, 10}, {0x000003fb, 10}, {0x000000f9,  8}, {0x000007fb, 11},[m
[31m-    {0x000000fa,  8}, {0x00000016,  6}, {0x00000017,  6}, {0x00000018,  6},[m
[31m-    {0x00000000,  5}, {0x00000001,  5}, {0x00000002,  5}, {0x00000019,  6},[m
[31m-    {0x0000001a,  6}, {0x0000001b,  6}, {0x0000001c,  6}, {0x0000001d,  6},[m
[31m-    {0x0000001e,  6}, {0x0000001f,  6}, {0x0000005c,  7}, {0x000000fb,  8},[m
[31m-    {0x00007ffc, 15}, {0x00000020,  6}, {0x00000ffb, 12}, {0x000003fc, 10},[m
[31m-    {0x00001ffa, 13}, {0x00000021,  6}, {0x0000005d,  7}, {0x0000005e,  7},[m
[31m-    {0x0000005f,  7}, {0x00000060,  7}, {0x00000061,  7}, {0x00000062,  7},[m
[31m-    {0x00000063,  7}, {0x00000064,  7}, {0x00000065,  7}, {0x00000066,  7},[m
[31m-    {0x00000067,  7}, {0x00000068,  7}, {0x00000069,  7}, {0x0000006a,  7},[m
[31m-    {0x0000006b,  7}, {0x0000006c,  7}, {0x0000006d,  7}, {0x0000006e,  7},[m
[31m-    {0x0000006f,  7}, {0x00000070,  7}, {0x00000071,  7}, {0x00000072,  7},[m
[31m-    {0x000000fc,  8}, {0x00000073,  7}, {0x000000fd,  8}, {0x00001ffb, 13},[m
[31m-    {0x0007fff0, 19}, {0x00001ffc, 13}, {0x00003ffc, 14}, {0x00000022,  6},[m
[31m-    {0x00007ffd, 15}, {0x00000003,  5}, {0x00000023,  6}, {0x00000004,  5},[m
[31m-    {0x00000024,  6}, {0x00000005,  5}, {0x00000025,  6}, {0x00000026,  6},[m
[31m-    {0x00000027,  6}, {0x00000006,  5}, {0x00000074,  7}, {0x00000075,  7},[m
[31m-    {0x00000028,  6}, {0x00000029,  6}, {0x0000002a,  6}, {0x00000007,  5},[m
[31m-    {0x0000002b,  6}, {0x00000076,  7}, {0x0000002c,  6}, {0x00000008,  5},[m
[31m-    {0x00000009,  5}, {0x0000002d,  6}, {0x00000077,  7}, {0x00000078,  7},[m
[31m-    {0x00000079,  7}, {0x0000007a,  7}, {0x0000007b,  7}, {0x00007ffe, 15},[m
[31m-    {0x000007fc, 11}, {0x00003ffd, 14}, {0x00001ffd, 13}, {0x0ffffffc, 28},[m
[31m-    {0x000fffe6, 20}, {0x003fffd2, 22}, {0x000fffe7, 20}, {0x000fffe8, 20},[m
[31m-    {0x003fffd3, 22}, {0x003fffd4, 22}, {0x003fffd5, 22}, {0x007fffd9, 23},[m
[31m-    {0x003fffd6, 22}, {0x007fffda, 23}, {0x007fffdb, 23}, {0x007fffdc, 23},[m
[31m-    {0x007fffdd, 23}, {0x007fffde, 23}, {0x00ffffeb, 24}, {0x007fffdf, 23},[m
[31m-    {0x00ffffec, 24}, {0x00ffffed, 24}, {0x003fffd7, 22}, {0x007fffe0, 23},[m
[31m-    {0x00ffffee, 24}, {0x007fffe1, 23}, {0x007fffe2, 23}, {0x007fffe3, 23},[m
[31m-    {0x007fffe4, 23}, {0x001fffdc, 21}, {0x003fffd8, 22}, {0x007fffe5, 23},[m
[31m-    {0x003fffd9, 22}, {0x007fffe6, 23}, {0x007fffe7, 23}, {0x00ffffef, 24},[m
[31m-    {0x003fffda, 22}, {0x001fffdd, 21}, {0x000fffe9, 20}, {0x003fffdb, 22},[m
[31m-    {0x003fffdc, 22}, {0x007fffe8, 23}, {0x007fffe9, 23}, {0x001fffde, 21},[m
[31m-    {0x007fffea, 23}, {0x003fffdd, 22}, {0x003fffde, 22}, {0x00fffff0, 24},[m
[31m-    {0x001fffdf, 21}, {0x003fffdf, 22}, {0x007fffeb, 23}, {0x007fffec, 23},[m
[31m-    {0x001fffe0, 21}, {0x001fffe1, 21}, {0x003fffe0, 22}, {0x001fffe2, 21},[m
[31m-    {0x007fffed, 23}, {0x003fffe1, 22}, {0x007fffee, 23}, {0x007fffef, 23},[m
[31m-    {0x000fffea, 20}, {0x003fffe2, 22}, {0x003fffe3, 22}, {0x003fffe4, 22},[m
[31m-    {0x007ffff0, 23}, {0x003fffe5, 22}, {0x003fffe6, 22}, {0x007ffff1, 23},[m
[31m-    {0x03ffffe0, 26}, {0x03ffffe1, 26}, {0x000fffeb, 20}, {0x0007fff1, 19},[m
[31m-    {0x003fffe7, 22}, {0x007ffff2, 23}, {0x003fffe8, 22}, {0x01ffffec, 25},[m
[31m-    {0x03ffffe2, 26}, {0x03ffffe3, 26}, {0x03ffffe4, 26}, {0x07ffffde, 27},[m
[31m-    {0x07ffffdf, 27}, {0x03ffffe5, 26}, {0x00fffff1, 24}, {0x01ffffed, 25},[m
[31m-    {0x0007fff2, 19}, {0x001fffe3, 21}, {0x03ffffe6, 26}, {0x07ffffe0, 27},[m
[31m-    {0x07ffffe1, 27}, {0x03ffffe7, 26}, {0x07ffffe2, 27}, {0x00fffff2, 24},[m
[31m-    {0x001fffe4, 21}, {0x001fffe5, 21}, {0x03ffffe8, 26}, {0x03ffffe9, 26},[m
[31m-    {0x0ffffffd, 28}, {0x07ffffe3, 27}, {0x07ffffe4, 27}, {0x07ffffe5, 27},[m
[31m-    {0x000fffec, 20}, {0x00fffff3, 24}, {0x000fffed, 20}, {0x001fffe6, 21},[m
[31m-    {0x003fffe9, 22}, {0x001fffe7, 21}, {0x001fffe8, 21}, {0x007ffff3, 23},[m
[31m-    {0x003fffea, 22}, {0x003fffeb, 22}, {0x01ffffee, 25}, {0x01ffffef, 25},[m
[31m-    {0x00fffff4, 24}, {0x00fffff5, 24}, {0x03ffffea, 26}, {0x007ffff4, 23},[m
[31m-    {0x03ffffeb, 26}, {0x07ffffe6, 27}, {0x03ffffec, 26}, {0x03ffffed, 26},[m
[31m-    {0x07ffffe7, 27}, {0x07ffffe8, 27}, {0x07ffffe9, 27}, {0x07ffffea, 27},[m
[31m-    {0x07ffffeb, 27}, {0x0ffffffe, 28}, {0x07ffffec, 27}, {0x07ffffed, 27},[m
[31m-    {0x07ffffee, 27}, {0x07ffffef, 27}, {0x07fffff0, 27}, {0x03ffffee, 26}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* same as above, but embeds lowercase transformation */[m
[31m-static ngx_http_v2_huff_encode_code_t  ngx_http_v2_huff_encode_table_lc[256] =[m
[31m-{[m
[31m-    {0x00001ff8, 13}, {0x007fffd8, 23}, {0x0fffffe2, 28}, {0x0fffffe3, 28},[m
[31m-    {0x0fffffe4, 28}, {0x0fffffe5, 28}, {0x0fffffe6, 28}, {0x0fffffe7, 28},[m
[31m-    {0x0fffffe8, 28}, {0x00ffffea, 24}, {0x3ffffffc, 30}, {0x0fffffe9, 28},[m
[31m-    {0x0fffffea, 28}, {0x3ffffffd, 30}, {0x0fffffeb, 28}, {0x0fffffec, 28},[m
[31m-    {0x0fffffed, 28}, {0x0fffffee, 28}, {0x0fffffef, 28}, {0x0ffffff0, 28},[m
[31m-    {0x0ffffff1, 28}, {0x0ffffff2, 28}, {0x3ffffffe, 30}, {0x0ffffff3, 28},[m
[31m-    {0x0ffffff4, 28}, {0x0ffffff5, 28}, {0x0ffffff6, 28}, {0x0ffffff7, 28},[m
[31m-    {0x0ffffff8, 28}, {0x0ffffff9, 28}, {0x0ffffffa, 28}, {0x0ffffffb, 28},[m
[31m-    {0x00000014,  6}, {0x000003f8, 10}, {0x000003f9, 10}, {0x00000ffa, 12},[m
[31m-    {0x00001ff9, 13}, {0x00000015,  6}, {0x000000f8,  8}, {0x000007fa, 11},[m
[31m-    {0x000003fa, 10}, {0x000003fb, 10}, {0x000000f9,  8}, {0x000007fb, 11},[m
[31m-    {0x000000fa,  8}, {0x00000016,  6}, {0x00000017,  6}, {0x00000018,  6},[m
[31m-    {0x00000000,  5}, {0x00000001,  5}, {0x00000002,  5}, {0x00000019,  6},[m
[31m-    {0x0000001a,  6}, {0x0000001b,  6}, {0x0000001c,  6}, {0x0000001d,  6},[m
[31m-    {0x0000001e,  6}, {0x0000001f,  6}, {0x0000005c,  7}, {0x000000fb,  8},[m
[31m-    {0x00007ffc, 15}, {0x00000020,  6}, {0x00000ffb, 12}, {0x000003fc, 10},[m
[31m-    {0x00001ffa, 13}, {0x00000003,  5}, {0x00000023,  6}, {0x00000004,  5},[m
[31m-    {0x00000024,  6}, {0x00000005,  5}, {0x00000025,  6}, {0x00000026,  6},[m
[31m-    {0x00000027,  6}, {0x00000006,  5}, {0x00000074,  7}, {0x00000075,  7},[m
[31m-    {0x00000028,  6}, {0x00000029,  6}, {0x0000002a,  6}, {0x00000007,  5},[m
[31m-    {0x0000002b,  6}, {0x00000076,  7}, {0x0000002c,  6}, {0x00000008,  5},[m
[31m-    {0x00000009,  5}, {0x0000002d,  6}, {0x00000077,  7}, {0x00000078,  7},[m
[31m-    {0x00000079,  7}, {0x0000007a,  7}, {0x0000007b,  7}, {0x00001ffb, 13},[m
[31m-    {0x0007fff0, 19}, {0x00001ffc, 13}, {0x00003ffc, 14}, {0x00000022,  6},[m
[31m-    {0x00007ffd, 15}, {0x00000003,  5}, {0x00000023,  6}, {0x00000004,  5},[m
[31m-    {0x00000024,  6}, {0x00000005,  5}, {0x00000025,  6}, {0x00000026,  6},[m
[31m-    {0x00000027,  6}, {0x00000006,  5}, {0x00000074,  7}, {0x00000075,  7},[m
[31m-    {0x00000028,  6}, {0x00000029,  6}, {0x0000002a,  6}, {0x00000007,  5},[m
[31m-    {0x0000002b,  6}, {0x00000076,  7}, {0x0000002c,  6}, {0x00000008,  5},[m
[31m-    {0x00000009,  5}, {0x0000002d,  6}, {0x00000077,  7}, {0x00000078,  7},[m
[31m-    {0x00000079,  7}, {0x0000007a,  7}, {0x0000007b,  7}, {0x00007ffe, 15},[m
[31m-    {0x000007fc, 11}, {0x00003ffd, 14}, {0x00001ffd, 13}, {0x0ffffffc, 28},[m
[31m-    {0x000fffe6, 20}, {0x003fffd2, 22}, {0x000fffe7, 20}, {0x000fffe8, 20},[m
[31m-    {0x003fffd3, 22}, {0x003fffd4, 22}, {0x003fffd5, 22}, {0x007fffd9, 23},[m
[31m-    {0x003fffd6, 22}, {0x007fffda, 23}, {0x007fffdb, 23}, {0x007fffdc, 23},[m
[31m-    {0x007fffdd, 23}, {0x007fffde, 23}, {0x00ffffeb, 24}, {0x007fffdf, 23},[m
[31m-    {0x00ffffec, 24}, {0x00ffffed, 24}, {0x003fffd7, 22}, {0x007fffe0, 23},[m
[31m-    {0x00ffffee, 24}, {0x007fffe1, 23}, {0x007fffe2, 23}, {0x007fffe3, 23},[m
[31m-    {0x007fffe4, 23}, {0x001fffdc, 21}, {0x003fffd8, 22}, {0x007fffe5, 23},[m
[31m-    {0x003fffd9, 22}, {0x007fffe6, 23}, {0x007fffe7, 23}, {0x00ffffef, 24},[m
[31m-    {0x003fffda, 22}, {0x001fffdd, 21}, {0x000fffe9, 20}, {0x003fffdb, 22},[m
[31m-    {0x003fffdc, 22}, {0x007fffe8, 23}, {0x007fffe9, 23}, {0x001fffde, 21},[m
[31m-    {0x007fffea, 23}, {0x003fffdd, 22}, {0x003fffde, 22}, {0x00fffff0, 24},[m
[31m-    {0x001fffdf, 21}, {0x003fffdf, 22}, {0x007fffeb, 23}, {0x007fffec, 23},[m
[31m-    {0x001fffe0, 21}, {0x001fffe1, 21}, {0x003fffe0, 22}, {0x001fffe2, 21},[m
[31m-    {0x007fffed, 23}, {0x003fffe1, 22}, {0x007fffee, 23}, {0x007fffef, 23},[m
[31m-    {0x000fffea, 20}, {0x003fffe2, 22}, {0x003fffe3, 22}, {0x003fffe4, 22},[m
[31m-    {0x007ffff0, 23}, {0x003fffe5, 22}, {0x003fffe6, 22}, {0x007ffff1, 23},[m
[31m-    {0x03ffffe0, 26}, {0x03ffffe1, 26}, {0x000fffeb, 20}, {0x0007fff1, 19},[m
[31m-    {0x003fffe7, 22}, {0x007ffff2, 23}, {0x003fffe8, 22}, {0x01ffffec, 25},[m
[31m-    {0x03ffffe2, 26}, {0x03ffffe3, 26}, {0x03ffffe4, 26}, {0x07ffffde, 27},[m
[31m-    {0x07ffffdf, 27}, {0x03ffffe5, 26}, {0x00fffff1, 24}, {0x01ffffed, 25},[m
[31m-    {0x0007fff2, 19}, {0x001fffe3, 21}, {0x03ffffe6, 26}, {0x07ffffe0, 27},[m
[31m-    {0x07ffffe1, 27}, {0x03ffffe7, 26}, {0x07ffffe2, 27}, {0x00fffff2, 24},[m
[31m-    {0x001fffe4, 21}, {0x001fffe5, 21}, {0x03ffffe8, 26}, {0x03ffffe9, 26},[m
[31m-    {0x0ffffffd, 28}, {0x07ffffe3, 27}, {0x07ffffe4, 27}, {0x07ffffe5, 27},[m
[31m-    {0x000fffec, 20}, {0x00fffff3, 24}, {0x000fffed, 20}, {0x001fffe6, 21},[m
[31m-    {0x003fffe9, 22}, {0x001fffe7, 21}, {0x001fffe8, 21}, {0x007ffff3, 23},[m
[31m-    {0x003fffea, 22}, {0x003fffeb, 22}, {0x01ffffee, 25}, {0x01ffffef, 25},[m
[31m-    {0x00fffff4, 24}, {0x00fffff5, 24}, {0x03ffffea, 26}, {0x007ffff4, 23},[m
[31m-    {0x03ffffeb, 26}, {0x07ffffe6, 27}, {0x03ffffec, 26}, {0x03ffffed, 26},[m
[31m-    {0x07ffffe7, 27}, {0x07ffffe8, 27}, {0x07ffffe9, 27}, {0x07ffffea, 27},[m
[31m-    {0x07ffffeb, 27}, {0x0ffffffe, 28}, {0x07ffffec, 27}, {0x07ffffed, 27},[m
[31m-    {0x07ffffee, 27}, {0x07ffffef, 27}, {0x07fffff0, 27}, {0x03ffffee, 26}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN)[m
[31m-[m
[31m-#if (NGX_HAVE_GCC_BSWAP64)[m
[31m-#define ngx_http_v2_huff_encode_buf(dst, buf)                                 \[m
[31m-    (*(uint64_t *) (dst) = __builtin_bswap64(buf))[m
[31m-#else[m
[31m-#define ngx_http_v2_huff_encode_buf(dst, buf)                                 \[m
[31m-    ((dst)[0] = (u_char) ((buf) >> 56),                                       \[m
[31m-     (dst)[1] = (u_char) ((buf) >> 48),                                       \[m
[31m-     (dst)[2] = (u_char) ((buf) >> 40),                                       \[m
[31m-     (dst)[3] = (u_char) ((buf) >> 32),                                       \[m
[31m-     (dst)[4] = (u_char) ((buf) >> 24),                                       \[m
[31m-     (dst)[5] = (u_char) ((buf) >> 16),                                       \[m
[31m-     (dst)[6] = (u_char) ((buf) >> 8),                                        \[m
[31m-     (dst)[7] = (u_char)  (buf))[m
[31m-#endif[m
[31m-[m
[31m-#else /* !NGX_HAVE_LITTLE_ENDIAN */[m
[31m-#define ngx_http_v2_huff_encode_buf(dst, buf)                                 \[m
[31m-    (*(uint64_t *) (dst) = (buf))[m
[31m-#endif[m
[31m-[m
[31m-#else /* NGX_PTR_SIZE == 4 */[m
[31m-[m
[31m-#define ngx_http_v2_huff_encode_buf(dst, buf)                                 \[m
[31m-    (*(uint32_t *) (dst) = htonl(buf))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_v2_huff_encode(u_char *src, size_t len, u_char *dst, ngx_uint_t lower)[m
[31m-{[m
[31m-    u_char                          *end;[m
[31m-    size_t                           hlen;[m
[31m-    ngx_uint_t                       buf, pending, code;[m
[31m-    ngx_http_v2_huff_encode_code_t  *table, *next;[m
[31m-[m
[31m-    table = lower ? ngx_http_v2_huff_encode_table_lc[m
[31m-                  : ngx_http_v2_huff_encode_table;[m
[31m-    hlen = 0;[m
[31m-    buf = 0;[m
[31m-    pending = 0;[m
[31m-[m
[31m-    end = src + len;[m
[31m-[m
[31m-    while (src != end) {[m
[31m-        next = &table[*src++];[m
[31m-[m
[31m-        code = next->code;[m
[31m-        pending += next->len;[m
[31m-[m
[31m-        /* accumulate bits */[m
[31m-        if (pending < sizeof(buf) * 8) {[m
[31m-            buf |= code << (sizeof(buf) * 8 - pending);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hlen + sizeof(buf) >= len) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        pending -= sizeof(buf) * 8;[m
[31m-[m
[31m-        buf |= code >> pending;[m
[31m-[m
[31m-        ngx_http_v2_huff_encode_buf(&dst[hlen], buf);[m
[31m-[m
[31m-        hlen += sizeof(buf);[m
[31m-[m
[31m-        buf = pending ? code << (sizeof(buf) * 8 - pending) : 0;[m
[31m-    }[m
[31m-[m
[31m-    if (pending == 0) {[m
[31m-        return hlen;[m
[31m-    }[m
[31m-[m
[31m-    buf |= (ngx_uint_t) -1 >> pending;[m
[31m-[m
[31m-    pending = ngx_align(pending, 8);[m
[31m-[m
[31m-    if (hlen + pending / 8 >= len) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    buf >>= sizeof(buf) * 8 - pending;[m
[31m-[m
[31m-    do {[m
[31m-        pending -= 8;[m
[31m-        dst[hlen++] = (u_char) (buf >> pending);[m
[31m-    } while (pending);[m
[31m-[m
[31m-    return hlen;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_module.c[m
[1mdeleted file mode 100644[m
[1mindex 5a4561c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,469 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_v2_module.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_add_variables(ngx_conf_t *cf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_module_init(ngx_cycle_t *cycle);[m
[31m-[m
[31m-static void *ngx_http_v2_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_v2_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static void *ngx_http_v2_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-static char *ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post,[m
[31m-    void *data);[m
[31m-static char *ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post,[m
[31m-    void *data);[m
[31m-static char *ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_v2_spdy_deprecated(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_v2_recv_buffer_size_post =[m
[31m-    { ngx_http_v2_recv_buffer_size };[m
[31m-static ngx_conf_post_t  ngx_http_v2_pool_size_post =[m
[31m-    { ngx_http_v2_pool_size };[m
[31m-static ngx_conf_post_t  ngx_http_v2_streams_index_mask_post =[m
[31m-    { ngx_http_v2_streams_index_mask };[m
[31m-static ngx_conf_post_t  ngx_http_v2_chunk_size_post =[m
[31m-    { ngx_http_v2_chunk_size };[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_v2_commands[] = {[m
[31m-[m
[31m-    { ngx_string("http2_recv_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_main_conf_t, recv_buffer_size),[m
[31m-      &ngx_http_v2_recv_buffer_size_post },[m
[31m-[m
[31m-    { ngx_string("http2_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, pool_size),[m
[31m-      &ngx_http_v2_pool_size_post },[m
[31m-[m
[31m-    { ngx_string("http2_max_concurrent_streams"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, concurrent_streams),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_max_field_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, max_field_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_max_header_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, max_header_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_streams_index_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, streams_index_mask),[m
[31m-      &ngx_http_v2_streams_index_mask_post },[m
[31m-[m
[31m-    { ngx_string("http2_recv_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, recv_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_idle_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, idle_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_chunk_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_loc_conf_t, chunk_size),[m
[31m-      &ngx_http_v2_chunk_size_post },[m
[31m-[m
[31m-    { ngx_string("spdy_recv_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_max_concurrent_streams"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_streams_index_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_recv_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_keepalive_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_headers_comp"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_chunk_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_v2_module_ctx = {[m
[31m-    ngx_http_v2_add_variables,             /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_v2_create_main_conf,          /* create main configuration */[m
[31m-    ngx_http_v2_init_main_conf,            /* init main configuration */[m
[31m-[m
[31m-    ngx_http_v2_create_srv_conf,           /* create server configuration */[m
[31m-    ngx_http_v2_merge_srv_conf,            /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_v2_create_loc_conf,           /* create location configuration */[m
[31m-    ngx_http_v2_merge_loc_conf             /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_v2_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_v2_module_ctx,               /* module context */[m
[31m-    ngx_http_v2_commands,                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    ngx_http_v2_module_init,               /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_v2_vars[] = {[m
[31m-[m
[31m-    { ngx_string("http2"), NULL,[m
[31m-      ngx_http_v2_variable, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_v2_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-[m
[31m-    if (r->stream) {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        if (r->connection->ssl) {[m
[31m-            v->len = sizeof("h2") - 1;[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 0;[m
[31m-            v->not_found = 0;[m
[31m-            v->data = (u_char *) "h2";[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-        v->len = sizeof("h2c") - 1;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "h2c";[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_module_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_v2_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_v2_main_conf_t  *h2mcf;[m
[31m-[m
[31m-    h2mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_main_conf_t));[m
[31m-    if (h2mcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    h2mcf->recv_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return h2mcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_v2_main_conf_t *h2mcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_size_value(h2mcf->recv_buffer_size, 256 * 1024);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_v2_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    h2scf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_srv_conf_t));[m
[31m-    if (h2scf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    h2scf->pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    h2scf->concurrent_streams = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    h2scf->max_field_size = NGX_CONF_UNSET_SIZE;[m
[31m-    h2scf->max_header_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    h2scf->streams_index_mask = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    h2scf->recv_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    h2scf->idle_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    return h2scf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_v2_srv_conf_t *prev = parent;[m
[31m-    ngx_http_v2_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->pool_size, prev->pool_size, 4096);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->concurrent_streams,[m
[31m-                              prev->concurrent_streams, 128);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->max_field_size, prev->max_field_size,[m
[31m-                              4096);[m
[31m-    ngx_conf_merge_size_value(conf->max_header_size, prev->max_header_size,[m
[31m-                              16384);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->streams_index_mask,[m
[31m-                              prev->streams_index_mask, 32 - 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->recv_timeout,[m
[31m-                              prev->recv_timeout, 30000);[m
[31m-    ngx_conf_merge_msec_value(conf->idle_timeout,[m
[31m-                              prev->idle_timeout, 180000);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_v2_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_v2_loc_conf_t  *h2lcf;[m
[31m-[m
[31m-    h2lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_loc_conf_t));[m
[31m-    if (h2lcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    h2lcf->chunk_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return h2lcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_v2_loc_conf_t *prev = parent;[m
[31m-    ngx_http_v2_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->chunk_size, prev->chunk_size, 8 * 1024);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp <= 2 * NGX_HTTP_V2_STATE_BUFFER_SIZE) {[m
[31m-        return "value is too small";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp < NGX_MIN_POOL_SIZE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be no less than %uz",[m
[31m-                           NGX_MIN_POOL_SIZE);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*sp % NGX_POOL_ALIGNMENT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be a multiple of %uz",[m
[31m-                           NGX_POOL_ALIGNMENT);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_uint_t *np = data;[m
[31m-[m
[31m-    ngx_uint_t  mask;[m
[31m-[m
[31m-    mask = *np - 1;[m
[31m-[m
[31m-    if (*np == 0 || (*np & mask)) {[m
[31m-        return "must be a power of two";[m
[31m-    }[m
[31m-[m
[31m-    *np = mask;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the http2 chunk size cannot be zero");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*sp > NGX_HTTP_V2_MAX_FRAME_SIZE) {[m
[31m-        *sp = NGX_HTTP_V2_MAX_FRAME_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_spdy_deprecated(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "invalid directive \"%V\": ngx_http_spdy_module "[m
[31m-                       "was superseded by ngx_http_v2_module", &cmd->name);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_module.h[m
[1mdeleted file mode 100644[m
[1mindex 95cc7d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_V2_MODULE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_V2_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                          recv_buffer_size;[m
[31m-    u_char                         *recv_buffer;[m
[31m-} ngx_http_v2_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                          pool_size;[m
[31m-    ngx_uint_t                      concurrent_streams;[m
[31m-    size_t                          max_field_size;[m
[31m-    size_t                          max_header_size;[m
[31m-    ngx_uint_t                      streams_index_mask;[m
[31m-    ngx_msec_t                      recv_timeout;[m
[31m-    ngx_msec_t                      idle_timeout;[m
[31m-} ngx_http_v2_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                          chunk_size;[m
[31m-} ngx_http_v2_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_v2_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_V2_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_table.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_table.c[m
[1mdeleted file mode 100644[m
[1mindex a73748a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/http/v2/ngx_http_v2_table.c[m
[1m+++ /dev/null[m
[36m@@ -1,349 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_V2_TABLE_SIZE  4096[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_table_account(ngx_http_v2_connection_t *h2c,[m
[31m-    size_t size);[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_header_t  ngx_http_v2_static_table[] = {[m
[31m-    { ngx_string(":authority"), ngx_string("") },[m
[31m-    { ngx_string(":method"), ngx_string("GET") },[m
[31m-    { ngx_string(":method"), ngx_string("POST") },[m
[31m-    { ngx_string(":path"), ngx_string("/") },[m
[31m-    { ngx_string(":path"), ngx_string("/index.html") },[m
[31m-    { ngx_string(":scheme"), ngx_string("http") },[m
[31m-    { ngx_string(":scheme"), ngx_string("https") },[m
[31m-    { ngx_string(":status"), ngx_string("200") },[m
[31m-    { ngx_string(":status"), ngx_string("204") },[m
[31m-    { ngx_string(":status"), ngx_string("206") },[m
[31m-    { ngx_string(":status"), ngx_string("304") },[m
[31m-    { ngx_string(":status"), ngx_string("400") },[m
[31m-    { ngx_string(":status"), ngx_string("404") },[m
[31m-    { ngx_string(":status"), ngx_string("500") },[m
[31m-    { ngx_string("accept-charset"), ngx_string("") },[m
[31m-    { ngx_string("accept-encoding"), ngx_string("gzip, deflate") },[m
[31m-    { ngx_string("accept-language"), ngx_string("") },[m
[31m-    { ngx_string("accept-ranges"), ngx_string("") },[m
[31m-    { ngx_string("accept"), ngx_string("") },[m
[31m-    { ngx_string("access-control-allow-origin"), ngx_string("") },[m
[31m-    { ngx_string("age"), ngx_string("") },[m
[31m-    { ngx_string("allow"), ngx_string("") },[m
[31m-    { ngx_string("authorization"), ngx_string("") },[m
[31m-    { ngx_string("cache-control"), ngx_string("") },[m
[31m-    { ngx_string("content-disposition"), ngx_string("") },[m
[31m-    { ngx_string("content-encoding"), ngx_string("") },[m
[31m-    { ngx_string("content-language"), ngx_string("") },[m
[31m-    { ngx_string("content-length"), ngx_string("") },[m
[31m-    { ngx_string("content-location"), ngx_string("") },[m
[31m-    { ngx_string("content-range"), ngx_string("") },[m
[31m-    { ngx_string("content-type"), ngx_string("") },[m
[31m-    { ngx_string("cookie"), ngx_string("") },[m
[31m-    { ngx_string("date"), ngx_string("") },[m
[31m-    { ngx_string("etag"), ngx_string("") },[m
[31m-    { ngx_string("expect"), ngx_string("") },[m
[31m-    { ngx_string("expires"), ngx_string("") },[m
[31m-    { ngx_string("from"), ngx_string("") },[m
[31m-    { ngx_string("host"), ngx_string("") },[m
[31m-    { ngx_string("if-match"), ngx_string("") },[m
[31m-    { ngx_string("if-modified-since"), ngx_string("") },[m
[31m-    { ngx_string("if-none-match"), ngx_string("") },[m
[31m-    { ngx_string("if-range"), ngx_string("") },[m
[31m-    { ngx_string("if-unmodified-since"), ngx_string("") },[m
[31m-    { ngx_string("last-modified"), ngx_string("") },[m
[31m-    { ngx_string("link"), ngx_string("") },[m
[31m-    { ngx_string("location"), ngx_string("") },[m
[31m-    { ngx_string("max-forwards"), ngx_string("") },[m
[31m-    { ngx_string("proxy-authenticate"), ngx_string("") },[m
[31m-    { ngx_string("proxy-authorization"), ngx_string("") },[m
[31m-    { ngx_string("range"), ngx_string("") },[m
[31m-    { ngx_string("referer"), ngx_string("") },[m
[31m-    { ngx_string("refresh"), ngx_string("") },[m
[31m-    { ngx_string("retry-after"), ngx_string("") },[m
[31m-    { ngx_string("server"), ngx_string("") },[m
[31m-    { ngx_string("set-cookie"), ngx_string("") },[m
[31m-    { ngx_string("strict-transport-security"), ngx_string("") },[m
[31m-    { ngx_string("transfer-encoding"), ngx_string("") },[m
[31m-    { ngx_string("user-agent"), ngx_string("") },[m
[31m-    { ngx_string("vary"), ngx_string("") },[m
[31m-    { ngx_string("via"), ngx_string("") },[m
[31m-    { ngx_string("www-authenticate"), ngx_string("") },[m
[31m-};[m
[31m-[m
[31m-#define NGX_HTTP_V2_STATIC_TABLE_ENTRIES                                      \[m
[31m-    (sizeof(ngx_http_v2_static_table)                                         \[m
[31m-     / sizeof(ngx_http_v2_header_t))[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_get_indexed_header(ngx_http_v2_connection_t *h2c, ngx_uint_t index,[m
[31m-    ngx_uint_t name_only)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    size_t                 rest;[m
[31m-    ngx_http_v2_header_t  *entry;[m
[31m-[m
[31m-    if (index == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent invalid hpack table index 0");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 get indexed %s: %ui",[m
[31m-                   name_only ? "header" : "header name", index);[m
[31m-[m
[31m-    index--;[m
[31m-[m
[31m-    if (index < NGX_HTTP_V2_STATIC_TABLE_ENTRIES) {[m
[31m-        h2c->state.header = ngx_http_v2_static_table[index];[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    index -= NGX_HTTP_V2_STATIC_TABLE_ENTRIES;[m
[31m-[m
[31m-    if (index < h2c->hpack.added - h2c->hpack.deleted) {[m
[31m-        index = (h2c->hpack.added - index - 1) % h2c->hpack.allocated;[m
[31m-        entry = h2c->hpack.entries[index];[m
[31m-[m
[31m-        p = ngx_pnalloc(h2c->state.pool, entry->name.len + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.header.name.len = entry->name.len;[m
[31m-        h2c->state.header.name.data = p;[m
[31m-[m
[31m-        rest = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - entry->name.data;[m
[31m-[m
[31m-        if (entry->name.len > rest) {[m
[31m-            p = ngx_cpymem(p, entry->name.data, rest);[m
[31m-            p = ngx_cpymem(p, h2c->hpack.storage, entry->name.len - rest);[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_cpymem(p, entry->name.data, entry->name.len);[m
[31m-        }[m
[31m-[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        if (name_only) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_pnalloc(h2c->state.pool, entry->value.len + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.header.value.len = entry->value.len;[m
[31m-        h2c->state.header.value.data = p;[m
[31m-[m
[31m-        rest = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - entry->value.data;[m
[31m-[m
[31m-        if (entry->value.len > rest) {[m
[31m-            p = ngx_cpymem(p, entry->value.data, rest);[m
[31m-            p = ngx_cpymem(p, h2c->hpack.storage, entry->value.len - rest);[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_cpymem(p, entry->value.data, entry->value.len);[m
[31m-        }[m
[31m-[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                  "client sent out of bound hpack table index: %ui", index);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_add_header(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    size_t                 avail;[m
[31m-    ngx_uint_t             index;[m
[31m-    ngx_http_v2_header_t  *entry, **entries;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 add header to hpack table: \"%V: %V\"",[m
[31m-                   &header->name, &header->value);[m
[31m-[m
[31m-    if (h2c->hpack.entries == NULL) {[m
[31m-        h2c->hpack.allocated = 64;[m
[31m-        h2c->hpack.size = NGX_HTTP_V2_TABLE_SIZE;[m
[31m-        h2c->hpack.free = NGX_HTTP_V2_TABLE_SIZE;[m
[31m-[m
[31m-        h2c->hpack.entries = ngx_palloc(h2c->connection->pool,[m
[31m-                                        sizeof(ngx_http_v2_header_t *)[m
[31m-                                        * h2c->hpack.allocated);[m
[31m-        if (h2c->hpack.entries == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->hpack.storage = ngx_palloc(h2c->connection->pool,[m
[31m-                                        h2c->hpack.free);[m
[31m-        if (h2c->hpack.storage == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->hpack.pos = h2c->hpack.storage;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_table_account(h2c, header->name.len + header->value.len)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->hpack.reused == h2c->hpack.deleted) {[m
[31m-        entry = ngx_palloc(h2c->connection->pool, sizeof(ngx_http_v2_header_t));[m
[31m-        if (entry == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        entry = h2c->hpack.entries[h2c->hpack.reused++ % h2c->hpack.allocated];[m
[31m-    }[m
[31m-[m
[31m-    avail = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - h2c->hpack.pos;[m
[31m-[m
[31m-    entry->name.len = header->name.len;[m
[31m-    entry->name.data = h2c->hpack.pos;[m
[31m-[m
[31m-    if (avail >= header->name.len) {[m
[31m-        h2c->hpack.pos = ngx_cpymem(h2c->hpack.pos, header->name.data,[m
[31m-                                    header->name.len);[m
[31m-    } else {[m
[31m-        ngx_memcpy(h2c->hpack.pos, header->name.data, avail);[m
[31m-        h2c->hpack.pos = ngx_cpymem(h2c->hpack.storage,[m
[31m-                                    header->name.data + avail,[m
[31m-                                    header->name.len - avail);[m
[31m-        avail = NGX_HTTP_V2_TABLE_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    avail -= header->name.len;[m
[31m-[m
[31m-    entry->value.len = header->value.len;[m
[31m-    entry->value.data = h2c->hpack.pos;[m
[31m-[m
[31m-    if (avail >= header->value.len) {[m
[31m-        h2c->hpack.pos = ngx_cpymem(h2c->hpack.pos, header->value.data,[m
[31m-                                    header->value.len);[m
[31m-    } else {[m
[31m-        ngx_memcpy(h2c->hpack.pos, header->value.data, avail);[m
[31m-        h2c->hpack.pos = ngx_cpymem(h2c->hpack.storage,[m
[31m-                                    header->value.data + avail,[m
[31m-                                    header->value.len - avail);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->hpack.allocated == h2c->hpack.added - h2c->hpack.deleted) {[m
[31m-[m
[31m-        entries = ngx_palloc(h2c->connection->pool,[m
[31m-                             sizeof(ngx_http_v2_header_t *)[m
[31m-                             * (h2c->hpack.allocated + 64));[m
[31m-        if (entries == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index = h2c->hpack.deleted % h2c->hpack.allocated;[m
[31m-[m
[31m-        ngx_memcpy(entries, &h2c->hpack.entries[index],[m
[31m-                   (h2c->hpack.allocated - index)[m
[31m-                   * sizeof(ngx_http_v2_header_t *));[m
[31m-[m
[31m-        ngx_memcpy(&entries[h2c->hpack.allocated - index], h2c->hpack.entries,[m
[31m-                   index * sizeof(ngx_http_v2_header_t *));[m
[31m-[m
[31m-        (void) ngx_pfree(h2c->connection->pool, h2c->hpack.entries);[m
[31m-[m
[31m-        h2c->hpack.entries = entries;[m
[31m-[m
[31m-        h2c->hpack.added = h2c->hpack.allocated;[m
[31m-        h2c->hpack.deleted = 0;[m
[31m-        h2c->hpack.reused = 0;[m
[31m-        h2c->hpack.allocated += 64;[m
[31m-    }[m
[31m-[m
[31m-    h2c->hpack.entries[h2c->hpack.added++ % h2c->hpack.allocated] = entry;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_table_account(ngx_http_v2_connection_t *h2c, size_t size)[m
[31m-{[m
[31m-    ngx_http_v2_header_t  *entry;[m
[31m-[m
[31m-    size += 32;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 hpack table account: %uz free:%uz",[m
[31m-                   size, h2c->hpack.free);[m
[31m-[m
[31m-    if (size <= h2c->hpack.free) {[m
[31m-        h2c->hpack.free -= size;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (size > h2c->hpack.size) {[m
[31m-        h2c->hpack.deleted = h2c->hpack.added;[m
[31m-        h2c->hpack.free = h2c->hpack.size;[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    do {[m
[31m-        entry = h2c->hpack.entries[h2c->hpack.deleted++ % h2c->hpack.allocated];[m
[31m-        h2c->hpack.free += 32 + entry->name.len + entry->value.len;[m
[31m-    } while (size > h2c->hpack.free);[m
[31m-[m
[31m-    h2c->hpack.free -= size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_table_size(ngx_http_v2_connection_t *h2c, size_t size)[m
[31m-{[m
[31m-    ssize_t                needed;[m
[31m-    ngx_http_v2_header_t  *entry;[m
[31m-[m
[31m-    if (size > NGX_HTTP_V2_TABLE_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent invalid table size update: %uz", size);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 new hpack table size: %uz was:%uz",[m
[31m-                   size, h2c->hpack.size);[m
[31m-[m
[31m-    needed = h2c->hpack.size - size;[m
[31m-[m
[31m-    while (needed > (ssize_t) h2c->hpack.free) {[m
[31m-        entry = h2c->hpack.entries[h2c->hpack.deleted++ % h2c->hpack.allocated];[m
[31m-        h2c->hpack.free += 32 + entry->name.len + entry->value.len;[m
[31m-    }[m
[31m-[m
[31m-    h2c->hpack.size = size;[m
[31m-    h2c->hpack.free -= needed;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail.c[m
[1mdeleted file mode 100644[m
[1mindex 6ad5a67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail.c[m
[1m+++ /dev/null[m
[36m@@ -1,534 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports,[m
[31m-    ngx_mail_listen_t *listen);[m
[31m-static char *ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports);[m
[31m-static ngx_int_t ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,[m
[31m-    ngx_mail_conf_addr_t *addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,[m
[31m-    ngx_mail_conf_addr_t *addr);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_mail_cmp_conf_addrs(const void *one, const void *two);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_mail_max_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_commands[] = {[m
[31m-[m
[31m-    { ngx_string("mail"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_mail_block,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_mail_module_ctx = {[m
[31m-    ngx_string("mail"),[m
[31m-    NULL,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_module_ctx,                  /* module context */[m
[31m-    ngx_mail_commands,                     /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    ngx_uint_t                   i, m, mi, s;[m
[31m-    ngx_conf_t                   pcf;[m
[31m-    ngx_array_t                  ports;[m
[31m-    ngx_mail_listen_t           *listen;[m
[31m-    ngx_mail_module_t           *module;[m
[31m-    ngx_mail_conf_ctx_t         *ctx;[m
[31m-    ngx_mail_core_srv_conf_t   **cscfp;[m
[31m-    ngx_mail_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    if (*(ngx_mail_conf_ctx_t **) conf) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* the main mail context */[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(ngx_mail_conf_ctx_t **) conf = ctx;[m
[31m-[m
[31m-    /* count the number of the mail modules and set up their indices */[m
[31m-[m
[31m-    ngx_mail_max_module = ngx_count_modules(cf->cycle, NGX_MAIL_MODULE);[m
[31m-[m
[31m-[m
[31m-    /* the mail main_conf context, it is the same in the all mail contexts */[m
[31m-[m
[31m-    ctx->main_conf = ngx_pcalloc(cf->pool,[m
[31m-                                 sizeof(void *) * ngx_mail_max_module);[m
[31m-    if (ctx->main_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * the mail null srv_conf context, it is used to merge[m
[31m-     * the server{}s' srv_conf's[m
[31m-     */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * create the main_conf's and the null srv_conf's of the all mail modules[m
[31m-     */[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        if (module->create_main_conf) {[m
[31m-            ctx->main_conf[mi] = module->create_main_conf(cf);[m
[31m-            if (ctx->main_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            ctx->srv_conf[mi] = module->create_srv_conf(cf);[m
[31m-            if (ctx->srv_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside the mail{} block */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-[m
[31m-    cf->module_type = NGX_MAIL_MODULE;[m
[31m-    cf->cmd_type = NGX_MAIL_MAIN_CONF;[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        *cf = pcf;[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* init mail{} main_conf's, merge the server{}s' srv_conf's */[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index];[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        /* init mail{} main_conf's */[m
[31m-[m
[31m-        cf->ctx = ctx;[m
[31m-[m
[31m-        if (module->init_main_conf) {[m
[31m-            rv = module->init_main_conf(cf, ctx->main_conf[mi]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                *cf = pcf;[m
[31m-                return rv;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-            /* merge the server{}s' srv_conf's */[m
[31m-[m
[31m-            cf->ctx = cscfp[s]->ctx;[m
[31m-[m
[31m-            if (module->merge_srv_conf) {[m
[31m-                rv = module->merge_srv_conf(cf,[m
[31m-                                            ctx->srv_conf[mi],[m
[31m-                                            cscfp[s]->ctx->srv_conf[mi]);[m
[31m-                if (rv != NGX_CONF_OK) {[m
[31m-                    *cf = pcf;[m
[31m-                    return rv;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-[m
[31m-    if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_mail_conf_port_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    listen = cmcf->listen.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->listen.nelts; i++) {[m
[31m-        if (ngx_mail_add_ports(cf, &ports, &listen[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_mail_optimize_servers(cf, &ports);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports,[m
[31m-    ngx_mail_listen_t *listen)[m
[31m-{[m
[31m-    in_port_t              p;[m
[31m-    ngx_uint_t             i;[m
[31m-    struct sockaddr       *sa;[m
[31m-    struct sockaddr_in    *sin;[m
[31m-    ngx_mail_conf_port_t  *port;[m
[31m-    ngx_mail_conf_addr_t  *addr;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6   *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    sa = &listen->u.sockaddr;[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = &listen->u.sockaddr_in6;[m
[31m-        p = sin6->sin6_port;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        p = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = &listen->u.sockaddr_in;[m
[31m-        p = sin->sin_port;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (i = 0; i < ports->nelts; i++) {[m
[31m-        if (p == port[i].port && sa->sa_family == port[i].family) {[m
[31m-[m
[31m-            /* a port is already in the port list */[m
[31m-[m
[31m-            port = &port[i];[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* add a port to the port list */[m
[31m-[m
[31m-    port = ngx_array_push(ports);[m
[31m-    if (port == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    port->family = sa->sa_family;[m
[31m-    port->port = p;[m
[31m-[m
[31m-    if (ngx_array_init(&port->addrs, cf->temp_pool, 2,[m
[31m-                       sizeof(ngx_mail_conf_addr_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    addr = ngx_array_push(&port->addrs);[m
[31m-    if (addr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addr->opt = *listen;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)[m
[31m-{[m
[31m-    ngx_uint_t                 i, p, last, bind_wildcard;[m
[31m-    ngx_listening_t           *ls;[m
[31m-    ngx_mail_port_t           *mport;[m
[31m-    ngx_mail_conf_port_t      *port;[m
[31m-    ngx_mail_conf_addr_t      *addr;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (p = 0; p < ports->nelts; p++) {[m
[31m-[m
[31m-        ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,[m
[31m-                 sizeof(ngx_mail_conf_addr_t), ngx_mail_cmp_conf_addrs);[m
[31m-[m
[31m-        addr = port[p].addrs.elts;[m
[31m-        last = port[p].addrs.nelts;[m
[31m-[m
[31m-        /*[m
[31m-         * if there is the binding to the "*:port" then we need to bind()[m
[31m-         * to the "*:port" only and ignore the other bindings[m
[31m-         */[m
[31m-[m
[31m-        if (addr[last - 1].opt.wildcard) {[m
[31m-            addr[last - 1].opt.bind = 1;[m
[31m-            bind_wildcard = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            bind_wildcard = 0;[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-[m
[31m-        while (i < last) {[m
[31m-[m
[31m-            if (bind_wildcard && !addr[i].opt.bind) {[m
[31m-                i++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls = ngx_create_listening(cf, &addr[i].opt.u.sockaddr,[m
[31m-                                      addr[i].opt.socklen);[m
[31m-            if (ls == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls->addr_ntop = 1;[m
[31m-            ls->handler = ngx_mail_init_connection;[m
[31m-            ls->pool_size = 256;[m
[31m-[m
[31m-            cscf = addr->opt.ctx->srv_conf[ngx_mail_core_module.ctx_index];[m
[31m-[m
[31m-            ls->logp = cscf->error_log;[m
[31m-            ls->log.data = &ls->addr_text;[m
[31m-            ls->log.handler = ngx_accept_log_error;[m
[31m-[m
[31m-            ls->backlog = addr[i].opt.backlog;[m
[31m-[m
[31m-            ls->keepalive = addr[i].opt.so_keepalive;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-            ls->keepidle = addr[i].opt.tcp_keepidle;[m
[31m-            ls->keepintvl = addr[i].opt.tcp_keepintvl;[m
[31m-            ls->keepcnt = addr[i].opt.tcp_keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            ls->ipv6only = addr[i].opt.ipv6only;[m
[31m-#endif[m
[31m-[m
[31m-            mport = ngx_palloc(cf->pool, sizeof(ngx_mail_port_t));[m
[31m-            if (mport == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls->servers = mport;[m
[31m-[m
[31m-            mport->naddrs = i + 1;[m
[31m-[m
[31m-            switch (ls->sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                if (ngx_mail_add_addrs6(cf, mport, addr) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                if (ngx_mail_add_addrs(cf, mport, addr) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            addr++;[m
[31m-            last--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,[m
[31m-    ngx_mail_conf_addr_t *addr)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    size_t               len;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_mail_in_addr_t  *addrs;[m
[31m-    struct sockaddr_in  *sin;[m
[31m-    u_char               buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    mport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                               mport->naddrs * sizeof(ngx_mail_in_addr_t));[m
[31m-    if (mport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs = mport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < mport->naddrs; i++) {[m
[31m-[m
[31m-        sin = &addr[i].opt.u.sockaddr_in;[m
[31m-        addrs[i].addr = sin->sin_addr.s_addr;[m
[31m-[m
[31m-        addrs[i].conf.ctx = addr[i].opt.ctx;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-        addrs[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-[m
[31m-        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,[m
[31m-                            NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-        addrs[i].conf.addr_text.len = len;[m
[31m-        addrs[i].conf.addr_text.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,[m
[31m-    ngx_mail_conf_addr_t *addr)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    size_t                len;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_mail_in6_addr_t  *addrs6;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-    u_char                buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    mport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                               mport->naddrs * sizeof(ngx_mail_in6_addr_t));[m
[31m-    if (mport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs6 = mport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < mport->naddrs; i++) {[m
[31m-[m
[31m-        sin6 = &addr[i].opt.u.sockaddr_in6;[m
[31m-        addrs6[i].addr6 = sin6->sin6_addr;[m
[31m-[m
[31m-        addrs6[i].conf.ctx = addr[i].opt.ctx;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-        addrs6[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-[m
[31m-        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,[m
[31m-                            NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-        addrs6[i].conf.addr_text.len = len;[m
[31m-        addrs6[i].conf.addr_text.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_cmp_conf_addrs(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_mail_conf_addr_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_mail_conf_addr_t *) one;[m
[31m-    second = (ngx_mail_conf_addr_t *) two;[m
[31m-[m
[31m-    if (first->opt.wildcard) {[m
[31m-        /* a wildcard must be the last resort, shift it to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (second->opt.wildcard) {[m
[31m-        /* a wildcard must be the last resort, shift it to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->opt.bind && !second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->opt.bind && second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* do not sort by default */[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail.h[m
[1mdeleted file mode 100644[m
[1mindex bfbf768..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail.h[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_H_INCLUDED_[m
[31m-#define _NGX_MAIL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-#include <ngx_mail_ssl_module.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void                  **main_conf;[m
[31m-    void                  **srv_conf;[m
[31m-} ngx_mail_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    union {[m
[31m-        struct sockaddr     sockaddr;[m
[31m-        struct sockaddr_in  sockaddr_in;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        struct sockaddr_in6 sockaddr_in6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        struct sockaddr_un  sockaddr_un;[m
[31m-#endif[m
[31m-        u_char              sockaddr_data[NGX_SOCKADDRLEN];[m
[31m-    } u;[m
[31m-[m
[31m-    socklen_t               socklen;[m
[31m-[m
[31m-    /* server ctx */[m
[31m-    ngx_mail_conf_ctx_t    *ctx;[m
[31m-[m
[31m-    unsigned                bind:1;[m
[31m-    unsigned                wildcard:1;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    unsigned                ssl:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    unsigned                ipv6only:1;[m
[31m-#endif[m
[31m-    unsigned                so_keepalive:2;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    int                     tcp_keepidle;[m
[31m-    int                     tcp_keepintvl;[m
[31m-    int                     tcp_keepcnt;[m
[31m-#endif[m
[31m-    int                     backlog;[m
[31m-} ngx_mail_listen_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_mail_conf_ctx_t    *ctx;[m
[31m-    ngx_str_t               addr_text;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_uint_t              ssl;    /* unsigned   ssl:1; */[m
[31m-#endif[m
[31m-} ngx_mail_addr_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t               addr;[m
[31m-    ngx_mail_addr_conf_t    conf;[m
[31m-} ngx_mail_in_addr_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr         addr6;[m
[31m-    ngx_mail_addr_conf_t    conf;[m
[31m-} ngx_mail_in6_addr_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* ngx_mail_in_addr_t or ngx_mail_in6_addr_t */[m
[31m-    void                   *addrs;[m
[31m-    ngx_uint_t              naddrs;[m
[31m-} ngx_mail_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int                     family;[m
[31m-    in_port_t               port;[m
[31m-    ngx_array_t             addrs;       /* array of ngx_mail_conf_addr_t */[m
[31m-} ngx_mail_conf_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_mail_listen_t       opt;[m
[31m-} ngx_mail_conf_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t             servers;     /* ngx_mail_core_srv_conf_t */[m
[31m-    ngx_array_t             listen;      /* ngx_mail_listen_t */[m
[31m-} ngx_mail_core_main_conf_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_POP3_PROTOCOL  0[m
[31m-#define NGX_MAIL_IMAP_PROTOCOL  1[m
[31m-#define NGX_MAIL_SMTP_PROTOCOL  2[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_mail_protocol_s  ngx_mail_protocol_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_mail_protocol_t    *protocol;[m
[31m-[m
[31m-    ngx_msec_t              timeout;[m
[31m-    ngx_msec_t              resolver_timeout;[m
[31m-[m
[31m-    ngx_str_t               server_name;[m
[31m-[m
[31m-    u_char                 *file_name;[m
[31m-    ngx_int_t               line;[m
[31m-[m
[31m-    ngx_resolver_t         *resolver;[m
[31m-    ngx_log_t              *error_log;[m
[31m-[m
[31m-    /* server ctx */[m
[31m-    ngx_mail_conf_ctx_t    *ctx;[m
[31m-} ngx_mail_core_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_pop3_start = 0,[m
[31m-    ngx_pop3_user,[m
[31m-    ngx_pop3_passwd,[m
[31m-    ngx_pop3_auth_login_username,[m
[31m-    ngx_pop3_auth_login_password,[m
[31m-    ngx_pop3_auth_plain,[m
[31m-    ngx_pop3_auth_cram_md5[m
[31m-} ngx_pop3_state_e;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_imap_start = 0,[m
[31m-    ngx_imap_auth_login_username,[m
[31m-    ngx_imap_auth_login_password,[m
[31m-    ngx_imap_auth_plain,[m
[31m-    ngx_imap_auth_cram_md5,[m
[31m-    ngx_imap_login,[m
[31m-    ngx_imap_user,[m
[31m-    ngx_imap_passwd[m
[31m-} ngx_imap_state_e;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_smtp_start = 0,[m
[31m-    ngx_smtp_auth_login_username,[m
[31m-    ngx_smtp_auth_login_password,[m
[31m-    ngx_smtp_auth_plain,[m
[31m-    ngx_smtp_auth_cram_md5,[m
[31m-    ngx_smtp_helo,[m
[31m-    ngx_smtp_helo_xclient,[m
[31m-    ngx_smtp_helo_from,[m
[31m-    ngx_smtp_xclient,[m
[31m-    ngx_smtp_xclient_from,[m
[31m-    ngx_smtp_xclient_helo,[m
[31m-    ngx_smtp_from,[m
[31m-    ngx_smtp_to[m
[31m-} ngx_smtp_state_e;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_peer_connection_t   upstream;[m
[31m-    ngx_buf_t              *buffer;[m
[31m-} ngx_mail_proxy_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t                signature;         /* "MAIL" */[m
[31m-[m
[31m-    ngx_connection_t       *connection;[m
[31m-[m
[31m-    ngx_str_t               out;[m
[31m-    ngx_buf_t              *buffer;[m
[31m-[m
[31m-    void                  **ctx;[m
[31m-    void                  **main_conf;[m
[31m-    void                  **srv_conf;[m
[31m-[m
[31m-    ngx_resolver_ctx_t     *resolver_ctx;[m
[31m-[m
[31m-    ngx_mail_proxy_ctx_t   *proxy;[m
[31m-[m
[31m-    ngx_uint_t              mail_state;[m
[31m-[m
[31m-    unsigned                protocol:3;[m
[31m-    unsigned                blocked:1;[m
[31m-    unsigned                quit:1;[m
[31m-    unsigned                quoted:1;[m
[31m-    unsigned                backslash:1;[m
[31m-    unsigned                no_sync_literal:1;[m
[31m-    unsigned                starttls:1;[m
[31m-    unsigned                esmtp:1;[m
[31m-    unsigned                auth_method:3;[m
[31m-    unsigned                auth_wait:1;[m
[31m-[m
[31m-    ngx_str_t               login;[m
[31m-    ngx_str_t               passwd;[m
[31m-[m
[31m-    ngx_str_t               salt;[m
[31m-    ngx_str_t               tag;[m
[31m-    ngx_str_t               tagged_line;[m
[31m-    ngx_str_t               text;[m
[31m-[m
[31m-    ngx_str_t              *addr_text;[m
[31m-    ngx_str_t               host;[m
[31m-    ngx_str_t               smtp_helo;[m
[31m-    ngx_str_t               smtp_from;[m
[31m-    ngx_str_t               smtp_to;[m
[31m-[m
[31m-    ngx_str_t               cmd;[m
[31m-[m
[31m-    ngx_uint_t              command;[m
[31m-    ngx_array_t             args;[m
[31m-[m
[31m-    ngx_uint_t              login_attempt;[m
[31m-[m
[31m-    /* used to parse POP3/IMAP/SMTP command */[m
[31m-[m
[31m-    ngx_uint_t              state;[m
[31m-    u_char                 *cmd_start;[m
[31m-    u_char                 *arg_start;[m
[31m-    u_char                 *arg_end;[m
[31m-    ngx_uint_t              literal_len;[m
[31m-} ngx_mail_session_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t              *client;[m
[31m-    ngx_mail_session_t     *session;[m
[31m-} ngx_mail_log_ctx_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_POP3_USER          1[m
[31m-#define NGX_POP3_PASS          2[m
[31m-#define NGX_POP3_CAPA          3[m
[31m-#define NGX_POP3_QUIT          4[m
[31m-#define NGX_POP3_NOOP          5[m
[31m-#define NGX_POP3_STLS          6[m
[31m-#define NGX_POP3_APOP          7[m
[31m-#define NGX_POP3_AUTH          8[m
[31m-#define NGX_POP3_STAT          9[m
[31m-#define NGX_POP3_LIST          10[m
[31m-#define NGX_POP3_RETR          11[m
[31m-#define NGX_POP3_DELE          12[m
[31m-#define NGX_POP3_RSET          13[m
[31m-#define NGX_POP3_TOP           14[m
[31m-#define NGX_POP3_UIDL          15[m
[31m-[m
[31m-[m
[31m-#define NGX_IMAP_LOGIN         1[m
[31m-#define NGX_IMAP_LOGOUT        2[m
[31m-#define NGX_IMAP_CAPABILITY    3[m
[31m-#define NGX_IMAP_NOOP          4[m
[31m-#define NGX_IMAP_STARTTLS      5[m
[31m-[m
[31m-#define NGX_IMAP_NEXT          6[m
[31m-[m
[31m-#define NGX_IMAP_AUTHENTICATE  7[m
[31m-[m
[31m-[m
[31m-#define NGX_SMTP_HELO          1[m
[31m-#define NGX_SMTP_EHLO          2[m
[31m-#define NGX_SMTP_AUTH          3[m
[31m-#define NGX_SMTP_QUIT          4[m
[31m-#define NGX_SMTP_NOOP          5[m
[31m-#define NGX_SMTP_MAIL          6[m
[31m-#define NGX_SMTP_RSET          7[m
[31m-#define NGX_SMTP_RCPT          8[m
[31m-#define NGX_SMTP_DATA          9[m
[31m-#define NGX_SMTP_VRFY          10[m
[31m-#define NGX_SMTP_EXPN          11[m
[31m-#define NGX_SMTP_HELP          12[m
[31m-#define NGX_SMTP_STARTTLS      13[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_AUTH_PLAIN             0[m
[31m-#define NGX_MAIL_AUTH_LOGIN             1[m
[31m-#define NGX_MAIL_AUTH_LOGIN_USERNAME    2[m
[31m-#define NGX_MAIL_AUTH_APOP              3[m
[31m-#define NGX_MAIL_AUTH_CRAM_MD5          4[m
[31m-#define NGX_MAIL_AUTH_NONE              5[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_AUTH_PLAIN_ENABLED     0x0002[m
[31m-#define NGX_MAIL_AUTH_LOGIN_ENABLED     0x0004[m
[31m-#define NGX_MAIL_AUTH_APOP_ENABLED      0x0008[m
[31m-#define NGX_MAIL_AUTH_CRAM_MD5_ENABLED  0x0010[m
[31m-#define NGX_MAIL_AUTH_NONE_ENABLED      0x0020[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_PARSE_INVALID_COMMAND  20[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_mail_init_session_pt)(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-typedef void (*ngx_mail_init_protocol_pt)(ngx_event_t *rev);[m
[31m-typedef void (*ngx_mail_auth_state_pt)(ngx_event_t *rev);[m
[31m-typedef ngx_int_t (*ngx_mail_parse_command_pt)(ngx_mail_session_t *s);[m
[31m-[m
[31m-[m
[31m-struct ngx_mail_protocol_s {[m
[31m-    ngx_str_t                   name;[m
[31m-    in_port_t                   port[4];[m
[31m-    ngx_uint_t                  type;[m
[31m-[m
[31m-    ngx_mail_init_session_pt    init_session;[m
[31m-    ngx_mail_init_protocol_pt   init_protocol;[m
[31m-    ngx_mail_parse_command_pt   parse_command;[m
[31m-    ngx_mail_auth_state_pt      auth_state;[m
[31m-[m
[31m-    ngx_str_t                   internal_server_error;[m
[31m-    ngx_str_t                   cert_error;[m
[31m-    ngx_str_t                   no_cert;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_mail_protocol_t        *protocol;[m
[31m-[m
[31m-    void                       *(*create_main_conf)(ngx_conf_t *cf);[m
[31m-    char                       *(*init_main_conf)(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-    void                       *(*create_srv_conf)(ngx_conf_t *cf);[m
[31m-    char                       *(*merge_srv_conf)(ngx_conf_t *cf, void *prev,[m
[31m-                                                  void *conf);[m
[31m-} ngx_mail_module_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_MODULE         0x4C49414D     /* "MAIL" */[m
[31m-[m
[31m-#define NGX_MAIL_MAIN_CONF      0x02000000[m
[31m-#define NGX_MAIL_SRV_CONF       0x04000000[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_MAIN_CONF_OFFSET  offsetof(ngx_mail_conf_ctx_t, main_conf)[m
[31m-#define NGX_MAIL_SRV_CONF_OFFSET   offsetof(ngx_mail_conf_ctx_t, srv_conf)[m
[31m-[m
[31m-[m
[31m-#define ngx_mail_get_module_ctx(s, module)     (s)->ctx[module.ctx_index][m
[31m-#define ngx_mail_set_ctx(s, c, module)         s->ctx[module.ctx_index] = c;[m
[31m-#define ngx_mail_delete_ctx(s, module)         s->ctx[module.ctx_index] = NULL;[m
[31m-[m
[31m-[m
[31m-#define ngx_mail_get_module_main_conf(s, module)                             \[m
[31m-    (s)->main_conf[module.ctx_index][m
[31m-#define ngx_mail_get_module_srv_conf(s, module)  (s)->srv_conf[module.ctx_index][m
[31m-[m
[31m-#define ngx_mail_conf_get_module_main_conf(cf, module)                       \[m
[31m-    ((ngx_mail_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index][m
[31m-#define ngx_mail_conf_get_module_srv_conf(cf, module)                        \[m
[31m-    ((ngx_mail_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index][m
[31m-[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-void ngx_mail_starttls_handler(ngx_event_t *rev);[m
[31m-ngx_int_t ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_mail_init_connection(ngx_connection_t *c);[m
[31m-[m
[31m-ngx_int_t ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_mail_core_srv_conf_t *cscf);[m
[31m-ngx_int_t ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_uint_t n);[m
[31m-ngx_int_t ngx_mail_auth_login_username(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c, ngx_uint_t n);[m
[31m-ngx_int_t ngx_mail_auth_login_password(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-ngx_int_t ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c, char *prefix, size_t len);[m
[31m-ngx_int_t ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-ngx_int_t ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-[m
[31m-void ngx_mail_send(ngx_event_t *wev);[m
[31m-ngx_int_t ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_close_connection(ngx_connection_t *c);[m
[31m-void ngx_mail_session_internal_server_error(ngx_mail_session_t *s);[m
[31m-u_char *ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-char *ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-/* STUB */[m
[31m-void ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer);[m
[31m-void ngx_mail_auth_http_init(ngx_mail_session_t *s);[m
[31m-/**/[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t    ngx_mail_max_module;[m
[31m-extern ngx_module_t  ngx_mail_core_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_auth_http_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_auth_http_module.c[m
[1mdeleted file mode 100644[m
[1mindex 39f9b17..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_auth_http_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1590 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_addr_t                     *peer;[m
[31m-[m
[31m-    ngx_msec_t                      timeout;[m
[31m-    ngx_flag_t                      pass_client_cert;[m
[31m-[m
[31m-    ngx_str_t                       host_header;[m
[31m-    ngx_str_t                       uri;[m
[31m-    ngx_str_t                       header;[m
[31m-[m
[31m-    ngx_array_t                    *headers;[m
[31m-[m
[31m-    u_char                         *file;[m
[31m-    ngx_uint_t                      line;[m
[31m-} ngx_mail_auth_http_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_mail_auth_http_ctx_s  ngx_mail_auth_http_ctx_t;[m
[31m-[m
[31m-typedef void (*ngx_mail_auth_http_handler_pt)(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx);[m
[31m-[m
[31m-struct ngx_mail_auth_http_ctx_s {[m
[31m-    ngx_buf_t                      *request;[m
[31m-    ngx_buf_t                      *response;[m
[31m-    ngx_peer_connection_t           peer;[m
[31m-[m
[31m-    ngx_mail_auth_http_handler_pt   handler;[m
[31m-[m
[31m-    ngx_uint_t                      state;[m
[31m-[m
[31m-    u_char                         *header_name_start;[m
[31m-    u_char                         *header_name_end;[m
[31m-    u_char                         *header_start;[m
[31m-    u_char                         *header_end;[m
[31m-[m
[31m-    ngx_str_t                       addr;[m
[31m-    ngx_str_t                       port;[m
[31m-    ngx_str_t                       err;[m
[31m-    ngx_str_t                       errmsg;[m
[31m-    ngx_str_t                       errcode;[m
[31m-[m
[31m-    time_t                          sleep;[m
[31m-[m
[31m-    ngx_pool_t                     *pool;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void ngx_mail_auth_http_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_mail_auth_http_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_mail_auth_http_ignore_status_line(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx);[m
[31m-static void ngx_mail_auth_http_process_headers(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx);[m
[31m-static void ngx_mail_auth_sleep_handler(ngx_event_t *rev);[m
[31m-static ngx_int_t ngx_mail_auth_http_parse_header_line(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx);[m
[31m-static void ngx_mail_auth_http_block_read(ngx_event_t *rev);[m
[31m-static void ngx_mail_auth_http_dummy_handler(ngx_event_t *ev);[m
[31m-static ngx_buf_t *ngx_mail_auth_http_create_request(ngx_mail_session_t *s,[m
[31m-    ngx_pool_t *pool, ngx_mail_auth_http_conf_t *ahcf);[m
[31m-static ngx_int_t ngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text,[m
[31m-    ngx_str_t *escaped);[m
[31m-[m
[31m-static void *ngx_mail_auth_http_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_auth_http_commands[] = {[m
[31m-[m
[31m-    { ngx_string("auth_http"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_mail_auth_http,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_http_timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_auth_http_conf_t, timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_http_header"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_mail_auth_http_header,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_http_pass_client_cert"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_auth_http_conf_t, pass_client_cert),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_auth_http_module_ctx = {[m
[31m-    NULL,                                  /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_auth_http_create_conf,        /* create server configuration */[m
[31m-    ngx_mail_auth_http_merge_conf          /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_auth_http_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_auth_http_module_ctx,        /* module context */[m
[31m-    ngx_mail_auth_http_commands,           /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t   ngx_mail_auth_http_method[] = {[m
[31m-    ngx_string("plain"),[m
[31m-    ngx_string("plain"),[m
[31m-    ngx_string("plain"),[m
[31m-    ngx_string("apop"),[m
[31m-    ngx_string("cram-md5"),[m
[31m-    ngx_string("none")[m
[31m-};[m
[31m-[m
[31m-static ngx_str_t   ngx_mail_smtp_errcode = ngx_string("535 5.7.0");[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_auth_http_init(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_pool_t                 *pool;[m
[31m-    ngx_mail_auth_http_ctx_t   *ctx;[m
[31m-    ngx_mail_auth_http_conf_t  *ahcf;[m
[31m-[m
[31m-    s->connection->log->action = "in http auth state";[m
[31m-[m
[31m-    pool = ngx_create_pool(2048, s->connection->log);[m
[31m-    if (pool == NULL) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(pool, sizeof(ngx_mail_auth_http_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->pool = pool;[m
[31m-[m
[31m-    ahcf = ngx_mail_get_module_srv_conf(s, ngx_mail_auth_http_module);[m
[31m-[m
[31m-    ctx->request = ngx_mail_auth_http_create_request(s, pool, ahcf);[m
[31m-    if (ctx->request == NULL) {[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_set_ctx(s, ctx, ngx_mail_auth_http_module);[m
[31m-[m
[31m-    ctx->peer.sockaddr = ahcf->peer->sockaddr;[m
[31m-    ctx->peer.socklen = ahcf->peer->socklen;[m
[31m-    ctx->peer.name = &ahcf->peer->name;[m
[31m-    ctx->peer.get = ngx_event_get_peer;[m
[31m-    ctx->peer.log = s->connection->log;[m
[31m-    ctx->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&ctx->peer);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {[m
[31m-        if (ctx->peer.connection) {[m
[31m-            ngx_close_connection(ctx->peer.connection);[m
[31m-        }[m
[31m-[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->peer.connection->data = s;[m
[31m-    ctx->peer.connection->pool = s->connection->pool;[m
[31m-[m
[31m-    s->connection->read->handler = ngx_mail_auth_http_block_read;[m
[31m-    ctx->peer.connection->read->handler = ngx_mail_auth_http_read_handler;[m
[31m-    ctx->peer.connection->write->handler = ngx_mail_auth_http_write_handler;[m
[31m-[m
[31m-    ctx->handler = ngx_mail_auth_http_ignore_status_line;[m
[31m-[m
[31m-    ngx_add_timer(ctx->peer.connection->read, ahcf->timeout);[m
[31m-    ngx_add_timer(ctx->peer.connection->write, ahcf->timeout);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        ngx_mail_auth_http_write_handler(ctx->peer.connection->write);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ssize_t                     n, size;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_mail_session_t         *s;[m
[31m-    ngx_mail_auth_http_ctx_t   *ctx;[m
[31m-    ngx_mail_auth_http_conf_t  *ahcf;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0,[m
[31m-                   "mail auth http write handler");[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT,[m
[31m-                      "auth http server %V timed out", ctx->peer.name);[m
[31m-        ngx_close_connection(c);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    size = ctx->request->last - ctx->request->pos;[m
[31m-[m
[31m-    n = ngx_send(c, ctx->request->pos, size);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_close_connection(c);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        ctx->request->pos += n;[m
[31m-[m
[31m-        if (n == size) {[m
[31m-            wev->handler = ngx_mail_auth_http_dummy_handler;[m
[31m-[m
[31m-            if (wev->timer_set) {[m
[31m-                ngx_del_timer(wev);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-                ngx_close_connection(c);[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!wev->timer_set) {[m
[31m-        ahcf = ngx_mail_get_module_srv_conf(s, ngx_mail_auth_http_module);[m
[31m-        ngx_add_timer(wev, ahcf->timeout);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t                     n, size;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_auth_http_ctx_t  *ctx;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail auth http read handler");[m
[31m-[m
[31m-    ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module);[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT,[m
[31m-                      "auth http server %V timed out", ctx->peer.name);[m
[31m-        ngx_close_connection(c);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->response == NULL) {[m
[31m-        ctx->response = ngx_create_temp_buf(ctx->pool, 1024);[m
[31m-        if (ctx->response == NULL) {[m
[31m-            ngx_close_connection(c);[m
[31m-            ngx_destroy_pool(ctx->pool);[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = ctx->response->end - ctx->response->last;[m
[31m-[m
[31m-    n = ngx_recv(c, ctx->response->pos, size);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        ctx->response->last += n;[m
[31m-[m
[31m-        ctx->handler(s, ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    ngx_destroy_pool(ctx->pool);[m
[31m-    ngx_mail_session_internal_server_error(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_ignore_status_line(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char  *p, ch;[m
[31m-    enum  {[m
[31m-        sw_start = 0,[m
[31m-        sw_H,[m
[31m-        sw_HT,[m
[31m-        sw_HTT,[m
[31m-        sw_HTTP,[m
[31m-        sw_skip,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                   "mail auth http process status line");[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-[m
[31m-    for (p = ctx->response->pos; p < ctx->response->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* "HTTP/" */[m
[31m-        case sw_start:[m
[31m-            if (ch == 'H') {[m
[31m-                state = sw_H;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        case sw_H:[m
[31m-            if (ch == 'T') {[m
[31m-                state = sw_HT;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        case sw_HT:[m
[31m-            if (ch == 'T') {[m
[31m-                state = sw_HTT;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        case sw_HTT:[m
[31m-            if (ch == 'P') {[m
[31m-                state = sw_HTTP;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        case sw_HTTP:[m
[31m-            if (ch == '/') {[m
[31m-                state = sw_skip;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        /* any text until end of line */[m
[31m-        case sw_skip:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of status line */[m
[31m-        case sw_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                          "auth http server %V sent invalid response",[m
[31m-                          ctx->peer.name);[m
[31m-            ngx_close_connection(ctx->peer.connection);[m
[31m-            ngx_destroy_pool(ctx->pool);[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->response->pos = p;[m
[31m-    ctx->state = state;[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-next:[m
[31m-[m
[31m-    p = ctx->response->start - 1;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = 0;[m
[31m-    ctx->handler = ngx_mail_auth_http_process_headers;[m
[31m-    ctx->handler(s, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_process_headers(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    time_t                timer;[m
[31m-    size_t                len, size;[m
[31m-    ngx_int_t             rc, port, n;[m
[31m-    ngx_addr_t           *peer;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                   "mail auth http process headers");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        rc = ngx_mail_auth_http_parse_header_line(s, ctx);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-            {[m
[31m-            ngx_str_t  key, value;[m
[31m-[m
[31m-            key.len = ctx->header_name_end - ctx->header_name_start;[m
[31m-            key.data = ctx->header_name_start;[m
[31m-            value.len = ctx->header_end - ctx->header_start;[m
[31m-            value.data = ctx->header_start;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                           "mail auth http header: \"%V: %V\"",[m
[31m-                           &key, &value);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            len = ctx->header_name_end - ctx->header_name_start;[m
[31m-[m
[31m-            if (len == sizeof("Auth-Status") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Status",[m
[31m-                                   sizeof("Auth-Status") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                if (len == 2[m
[31m-                    && ctx->header_start[0] == 'O'[m
[31m-                    && ctx->header_start[1] == 'K')[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (len == 4[m
[31m-                    && ctx->header_start[0] == 'W'[m
[31m-                    && ctx->header_start[1] == 'A'[m
[31m-                    && ctx->header_start[2] == 'I'[m
[31m-                    && ctx->header_start[3] == 'T')[m
[31m-                {[m
[31m-                    s->auth_wait = 1;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                ctx->errmsg.len = len;[m
[31m-                ctx->errmsg.data = ctx->header_start;[m
[31m-[m
[31m-                switch (s->protocol) {[m
[31m-[m
[31m-                case NGX_MAIL_POP3_PROTOCOL:[m
[31m-                    size = sizeof("-ERR ") - 1 + len + sizeof(CRLF) - 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_MAIL_IMAP_PROTOCOL:[m
[31m-                    size = s->tag.len + sizeof("NO ") - 1 + len[m
[31m-                           + sizeof(CRLF) - 1;[m
[31m-                    break;[m
[31m-[m
[31m-                default: /* NGX_MAIL_SMTP_PROTOCOL */[m
[31m-                    ctx->err = ctx->errmsg;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                p = ngx_pnalloc(s->connection->pool, size);[m
[31m-                if (p == NULL) {[m
[31m-                    ngx_close_connection(ctx->peer.connection);[m
[31m-                    ngx_destroy_pool(ctx->pool);[m
[31m-                    ngx_mail_session_internal_server_error(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ctx->err.data = p;[m
[31m-[m
[31m-                switch (s->protocol) {[m
[31m-[m
[31m-                case NGX_MAIL_POP3_PROTOCOL:[m
[31m-                    *p++ = '-'; *p++ = 'E'; *p++ = 'R'; *p++ = 'R'; *p++ = ' ';[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_MAIL_IMAP_PROTOCOL:[m
[31m-                    p = ngx_cpymem(p, s->tag.data, s->tag.len);[m
[31m-                    *p++ = 'N'; *p++ = 'O'; *p++ = ' ';[m
[31m-                    break;[m
[31m-[m
[31m-                default: /* NGX_MAIL_SMTP_PROTOCOL */[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                p = ngx_cpymem(p, ctx->header_start, len);[m
[31m-                *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-                ctx->err.len = p - ctx->err.data;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Server") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Server",[m
[31m-                                   sizeof("Auth-Server") - 1)[m
[31m-                    == 0)[m
[31m-            {[m
[31m-                ctx->addr.len = ctx->header_end - ctx->header_start;[m
[31m-                ctx->addr.data = ctx->header_start;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Port") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Port",[m
[31m-                                   sizeof("Auth-Port") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                ctx->port.len = ctx->header_end - ctx->header_start;[m
[31m-                ctx->port.data = ctx->header_start;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-User") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-User",[m
[31m-                                   sizeof("Auth-User") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                s->login.len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                s->login.data = ngx_pnalloc(s->connection->pool, s->login.len);[m
[31m-                if (s->login.data == NULL) {[m
[31m-                    ngx_close_connection(ctx->peer.connection);[m
[31m-                    ngx_destroy_pool(ctx->pool);[m
[31m-                    ngx_mail_session_internal_server_error(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(s->login.data, ctx->header_start, s->login.len);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Pass") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Pass",[m
[31m-                                   sizeof("Auth-Pass") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                s->passwd.len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                s->passwd.data = ngx_pnalloc(s->connection->pool,[m
[31m-                                             s->passwd.len);[m
[31m-                if (s->passwd.data == NULL) {[m
[31m-                    ngx_close_connection(ctx->peer.connection);[m
[31m-                    ngx_destroy_pool(ctx->pool);[m
[31m-                    ngx_mail_session_internal_server_error(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(s->passwd.data, ctx->header_start, s->passwd.len);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Wait") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Wait",[m
[31m-                                   sizeof("Auth-Wait") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                n = ngx_atoi(ctx->header_start,[m
[31m-                             ctx->header_end - ctx->header_start);[m
[31m-[m
[31m-                if (n != NGX_ERROR) {[m
[31m-                    ctx->sleep = n;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Error-Code") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Error-Code",[m
[31m-                                   sizeof("Auth-Error-Code") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                ctx->errcode.len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                ctx->errcode.data = ngx_pnalloc(s->connection->pool,[m
[31m-                                                ctx->errcode.len);[m
[31m-                if (ctx->errcode.data == NULL) {[m
[31m-                    ngx_close_connection(ctx->peer.connection);[m
[31m-                    ngx_destroy_pool(ctx->pool);[m
[31m-                    ngx_mail_session_internal_server_error(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(ctx->errcode.data, ctx->header_start,[m
[31m-                           ctx->errcode.len);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* ignore other headers */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                           "mail auth http header done");[m
[31m-[m
[31m-            ngx_close_connection(ctx->peer.connection);[m
[31m-[m
[31m-            if (ctx->err.len) {[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, s->connection->log, 0,[m
[31m-                              "client login failed: \"%V\"", &ctx->errmsg);[m
[31m-[m
[31m-                if (s->protocol == NGX_MAIL_SMTP_PROTOCOL) {[m
[31m-[m
[31m-                    if (ctx->errcode.len == 0) {[m
[31m-                        ctx->errcode = ngx_mail_smtp_errcode;[m
[31m-                    }[m
[31m-[m
[31m-                    ctx->err.len = ctx->errcode.len + ctx->errmsg.len[m
[31m-                                   + sizeof(" " CRLF) - 1;[m
[31m-[m
[31m-                    p = ngx_pnalloc(s->connection->pool, ctx->err.len);[m
[31m-                    if (p == NULL) {[m
[31m-                        ngx_destroy_pool(ctx->pool);[m
[31m-                        ngx_mail_session_internal_server_error(s);[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    ctx->err.data = p;[m
[31m-[m
[31m-                    p = ngx_cpymem(p, ctx->errcode.data, ctx->errcode.len);[m
[31m-                    *p++ = ' ';[m
[31m-                    p = ngx_cpymem(p, ctx->errmsg.data, ctx->errmsg.len);[m
[31m-                    *p++ = CR; *p = LF;[m
[31m-                }[m
[31m-[m
[31m-                s->out = ctx->err;[m
[31m-                timer = ctx->sleep;[m
[31m-[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-[m
[31m-                if (timer == 0) {[m
[31m-                    s->quit = 1;[m
[31m-                    ngx_mail_send(s->connection->write);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_add_timer(s->connection->read, (ngx_msec_t) (timer * 1000));[m
[31m-[m
[31m-                s->connection->read->handler = ngx_mail_auth_sleep_handler;[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (s->auth_wait) {[m
[31m-                timer = ctx->sleep;[m
[31m-[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-[m
[31m-                if (timer == 0) {[m
[31m-                    ngx_mail_auth_http_init(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_add_timer(s->connection->read, (ngx_msec_t) (timer * 1000));[m
[31m-[m
[31m-                s->connection->read->handler = ngx_mail_auth_sleep_handler;[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->addr.len == 0 || ctx->port.len == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                              "auth http server %V did not send server or port",[m
[31m-                              ctx->peer.name);[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (s->passwd.data == NULL[m
[31m-                && s->protocol != NGX_MAIL_SMTP_PROTOCOL)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                              "auth http server %V did not send password",[m
[31m-                              ctx->peer.name);[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            peer = ngx_pcalloc(s->connection->pool, sizeof(ngx_addr_t));[m
[31m-            if (peer == NULL) {[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_parse_addr(s->connection->pool, peer,[m
[31m-                                ctx->addr.data, ctx->addr.len);[m
[31m-[m
[31m-            switch (rc) {[m
[31m-            case NGX_OK:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_DECLINED:[m
[31m-                ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                              "auth http server %V sent invalid server "[m
[31m-                              "address:\"%V\"",[m
[31m-                              ctx->peer.name, &ctx->addr);[m
[31m-                /* fall through */[m
[31m-[m
[31m-            default:[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            port = ngx_atoi(ctx->port.data, ctx->port.len);[m
[31m-            if (port == NGX_ERROR || port < 1 || port > 65535) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                              "auth http server %V sent invalid server "[m
[31m-                              "port:\"%V\"",[m
[31m-                              ctx->peer.name, &ctx->port);[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            switch (peer->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                sin6 = (struct sockaddr_in6 *) peer->sockaddr;[m
[31m-                sin6->sin6_port = htons((in_port_t) port);[m
[31m-                break;[m
[31m-#endif[m
[31m-[m
[31m-            default: /* AF_INET */[m
[31m-                sin = (struct sockaddr_in *) peer->sockaddr;[m
[31m-                sin->sin_port = htons((in_port_t) port);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            len = ctx->addr.len + 1 + ctx->port.len;[m
[31m-[m
[31m-            peer->name.len = len;[m
[31m-[m
[31m-            peer->name.data = ngx_pnalloc(s->connection->pool, len);[m
[31m-            if (peer->name.data == NULL) {[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            len = ctx->addr.len;[m
[31m-[m
[31m-            ngx_memcpy(peer->name.data, ctx->addr.data, len);[m
[31m-[m
[31m-            peer->name.data[len++] = ':';[m
[31m-[m
[31m-            ngx_memcpy(peer->name.data + len, ctx->port.data, ctx->port.len);[m
[31m-[m
[31m-            ngx_destroy_pool(ctx->pool);[m
[31m-            ngx_mail_proxy_init(s, peer);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN ) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_ERROR */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                      "auth http server %V sent invalid header in response",[m
[31m-                      ctx->peer.name);[m
[31m-        ngx_close_connection(ctx->peer.connection);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_sleep_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail auth sleep handler");[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-[m
[31m-        rev->timedout = 0;[m
[31m-[m
[31m-        if (s->auth_wait) {[m
[31m-            s->auth_wait = 0;[m
[31m-            ngx_mail_auth_http_init(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        rev->handler = cscf->protocol->auth_state;[m
[31m-[m
[31m-        s->mail_state = 0;[m
[31m-        s->auth_method = NGX_MAIL_AUTH_PLAIN;[m
[31m-[m
[31m-        c->log->action = "in auth state";[m
[31m-[m
[31m-        ngx_mail_send(c->write);[m
[31m-[m
[31m-        if (c->destroyed) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(rev, cscf->timeout);[m
[31m-[m
[31m-        if (rev->ready) {[m
[31m-            rev->handler(rev);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_auth_http_parse_header_line(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char      c, ch, *p;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_name,[m
[31m-        sw_space_before_value,[m
[31m-        sw_value,[m
[31m-        sw_space_after_value,[m
[31m-        sw_almost_done,[m
[31m-        sw_header_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-[m
[31m-    for (p = ctx->response->pos; p < ctx->response->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* first char */[m
[31m-        case sw_start:[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_header_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_end = p;[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                state = sw_name;[m
[31m-                ctx->header_name_start = p;[m
[31m-[m
[31m-                c = (u_char) (ch | 0x20);[m
[31m-                if (c >= 'a' && c <= 'z') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (ch >= '0' && ch <= '9') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header name */[m
[31m-        case sw_name:[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                ctx->header_name_end = p;[m
[31m-                state = sw_space_before_value;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '-') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == CR) {[m
[31m-                ctx->header_name_end = p;[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == LF) {[m
[31m-                ctx->header_name_end = p;[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        /* space* before header value */[m
[31m-        case sw_space_before_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                ctx->header_start = p;[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header value */[m
[31m-        case sw_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_space_after_value;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before end of header line */[m
[31m-        case sw_space_after_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of header line */[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        /* end of header */[m
[31m-        case sw_header_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->response->pos = p;[m
[31m-    ctx->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-header_done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_block_read(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_auth_http_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail auth http block read");[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        c = rev->data;[m
[31m-        s = c->data;[m
[31m-[m
[31m-        ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module);[m
[31m-[m
[31m-        ngx_close_connection(ctx->peer.connection);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, ev->log, 0,[m
[31m-                   "mail auth http dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_mail_auth_http_create_request(ngx_mail_session_t *s, ngx_pool_t *pool,[m
[31m-    ngx_mail_auth_http_conf_t *ahcf)[m
[31m-{[m
[31m-    size_t                     len;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_str_t                  login, passwd;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_str_t                  verify, subject, issuer, serial, fingerprint,[m
[31m-                               raw_cert, cert;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_ssl_conf_t       *sslcf;[m
[31m-#endif[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (ngx_mail_auth_http_escape(pool, &s->login, &login) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_mail_auth_http_escape(pool, &s->passwd, &passwd) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    c = s->connection;[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    if (c->ssl && sslcf->verify) {[m
[31m-[m
[31m-        /* certificate details */[m
[31m-[m
[31m-        if (ngx_ssl_get_client_verify(c, pool, &verify) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_get_subject_dn(c, pool, &subject) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_get_issuer_dn(c, pool, &issuer) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_get_serial_number(c, pool, &serial) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_get_fingerprint(c, pool, &fingerprint) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ahcf->pass_client_cert) {[m
[31m-[m
[31m-            /* certificate itself, if configured */[m
[31m-[m
[31m-            if (ngx_ssl_get_raw_certificate(c, pool, &raw_cert) != NGX_OK) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_mail_auth_http_escape(pool, &raw_cert, &cert) != NGX_OK) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_null(&cert);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&verify);[m
[31m-        ngx_str_null(&subject);[m
[31m-        ngx_str_null(&issuer);[m
[31m-        ngx_str_null(&serial);[m
[31m-        ngx_str_null(&fingerprint);[m
[31m-        ngx_str_null(&cert);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    len = sizeof("GET ") - 1 + ahcf->uri.len + sizeof(" HTTP/1.0" CRLF) - 1[m
[31m-          + sizeof("Host: ") - 1 + ahcf->host_header.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-Method: ") - 1[m
[31m-                + ngx_mail_auth_http_method[s->auth_method].len[m
[31m-                + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-User: ") - 1 + login.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-Pass: ") - 1 + passwd.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-Salt: ") - 1 + s->salt.len[m
[31m-          + sizeof("Auth-Protocol: ") - 1 + cscf->protocol->name.len[m
[31m-                + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-Login-Attempt: ") - 1 + NGX_INT_T_LEN[m
[31m-                + sizeof(CRLF) - 1[m
[31m-          + sizeof("Client-IP: ") - 1 + s->connection->addr_text.len[m
[31m-                + sizeof(CRLF) - 1[m
[31m-          + sizeof("Client-Host: ") - 1 + s->host.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SMTP-Helo: ") - 1 + s->smtp_helo.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SMTP-From: ") - 1 + s->smtp_from.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SMTP-To: ") - 1 + s->smtp_to.len + sizeof(CRLF) - 1[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-          + sizeof("Auth-SSL: on" CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Verify: ") - 1 + verify.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Subject: ") - 1 + subject.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Issuer: ") - 1 + issuer.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Serial: ") - 1 + serial.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Fingerprint: ") - 1 + fingerprint.len[m
[31m-              + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Cert: ") - 1 + cert.len + sizeof(CRLF) - 1[m
[31m-#endif[m
[31m-          + ahcf->header.len[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "GET ", sizeof("GET ") - 1);[m
[31m-    b->last = ngx_copy(b->last, ahcf->uri.data, ahcf->uri.len);[m
[31m-    b->last = ngx_cpymem(b->last, " HTTP/1.0" CRLF,[m
[31m-                         sizeof(" HTTP/1.0" CRLF) - 1);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Host: ", sizeof("Host: ") - 1);[m
[31m-    b->last = ngx_copy(b->last, ahcf->host_header.data,[m
[31m-                         ahcf->host_header.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Auth-Method: ",[m
[31m-                         sizeof("Auth-Method: ") - 1);[m
[31m-    b->last = ngx_cpymem(b->last,[m
[31m-                         ngx_mail_auth_http_method[s->auth_method].data,[m
[31m-                         ngx_mail_auth_http_method[s->auth_method].len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Auth-User: ", sizeof("Auth-User: ") - 1);[m
[31m-    b->last = ngx_copy(b->last, login.data, login.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Auth-Pass: ", sizeof("Auth-Pass: ") - 1);[m
[31m-    b->last = ngx_copy(b->last, passwd.data, passwd.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (s->auth_method != NGX_MAIL_AUTH_PLAIN && s->salt.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-Salt: ", sizeof("Auth-Salt: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->salt.data, s->salt.len);[m
[31m-[m
[31m-        s->passwd.data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Auth-Protocol: ",[m
[31m-                         sizeof("Auth-Protocol: ") - 1);[m
[31m-    b->last = ngx_cpymem(b->last, cscf->protocol->name.data,[m
[31m-                         cscf->protocol->name.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, "Auth-Login-Attempt: %ui" CRLF,[m
[31m-                          s->login_attempt);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Client-IP: ", sizeof("Client-IP: ") - 1);[m
[31m-    b->last = ngx_copy(b->last, s->connection->addr_text.data,[m
[31m-                       s->connection->addr_text.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (s->host.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Client-Host: ",[m
[31m-                             sizeof("Client-Host: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->host.data, s->host.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (s->auth_method == NGX_MAIL_AUTH_NONE) {[m
[31m-[m
[31m-        /* HELO, MAIL FROM, and RCPT TO can't contain CRLF, no need to escape */[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-SMTP-Helo: ",[m
[31m-                             sizeof("Auth-SMTP-Helo: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->smtp_helo.data, s->smtp_helo.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-SMTP-From: ",[m
[31m-                             sizeof("Auth-SMTP-From: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->smtp_from.data, s->smtp_from.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-SMTP-To: ",[m
[31m-                             sizeof("Auth-SMTP-To: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->smtp_to.data, s->smtp_to.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-SSL: on" CRLF,[m
[31m-                             sizeof("Auth-SSL: on" CRLF) - 1);[m
[31m-[m
[31m-        if (verify.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Verify: ",[m
[31m-                                 sizeof("Auth-SSL-Verify: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, verify.data, verify.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (subject.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Subject: ",[m
[31m-                                 sizeof("Auth-SSL-Subject: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, subject.data, subject.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (issuer.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Issuer: ",[m
[31m-                                 sizeof("Auth-SSL-Issuer: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, issuer.data, issuer.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (serial.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Serial: ",[m
[31m-                                 sizeof("Auth-SSL-Serial: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, serial.data, serial.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (fingerprint.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Fingerprint: ",[m
[31m-                                 sizeof("Auth-SSL-Fingerprint: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, fingerprint.data, fingerprint.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (cert.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Cert: ",[m
[31m-                                 sizeof("Auth-SSL-Cert: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, cert.data, cert.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ahcf->header.len) {[m
[31m-        b->last = ngx_copy(b->last, ahcf->header.data, ahcf->header.len);[m
[31m-    }[m
[31m-[m
[31m-    /* add "\r\n" at the header end */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                   "mail auth http header:%N\"%*s\"",[m
[31m-                   (size_t) (b->last - b->pos), b->pos);[m
[31m-#endif[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text, ngx_str_t *escaped)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    uintptr_t   n;[m
[31m-[m
[31m-    n = ngx_escape_uri(NULL, text->data, text->len, NGX_ESCAPE_MAIL_AUTH);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        *escaped = *text;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    escaped->len = text->len + n * 2;[m
[31m-[m
[31m-    p = ngx_pnalloc(pool, escaped->len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_escape_uri(p, text->data, text->len, NGX_ESCAPE_MAIL_AUTH);[m
[31m-[m
[31m-    escaped->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_auth_http_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_auth_http_conf_t  *ahcf;[m
[31m-[m
[31m-    ahcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_auth_http_conf_t));[m
[31m-    if (ahcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ahcf->timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    ahcf->pass_client_cert = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ahcf->file = cf->conf_file->file.name.data;[m
[31m-    ahcf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return ahcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_auth_http_conf_t *prev = parent;[m
[31m-    ngx_mail_auth_http_conf_t *conf = child;[m
[31m-[m
[31m-    u_char           *p;[m
[31m-    size_t            len;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_table_elt_t  *header;[m
[31m-[m
[31m-    if (conf->peer == NULL) {[m
[31m-        conf->peer = prev->peer;[m
[31m-        conf->host_header = prev->host_header;[m
[31m-        conf->uri = prev->uri;[m
[31m-[m
[31m-        if (conf->peer == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"auth_http\" is defined for server in %s:%ui",[m
[31m-                          conf->file, conf->line);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->pass_client_cert, prev->pass_client_cert, 0);[m
[31m-[m
[31m-    if (conf->headers == NULL) {[m
[31m-        conf->headers = prev->headers;[m
[31m-        conf->header = prev->header;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers && conf->header.len == 0) {[m
[31m-        len = 0;[m
[31m-        header = conf->headers->elts;[m
[31m-        for (i = 0; i < conf->headers->nelts; i++) {[m
[31m-            len += header[i].key.len + 2 + header[i].value.len + 2;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf->header.len = len;[m
[31m-        conf->header.data = p;[m
[31m-[m
[31m-        for (i = 0; i < conf->headers->nelts; i++) {[m
[31m-            p = ngx_cpymem(p, header[i].key.data, header[i].key.len);[m
[31m-            *p++ = ':'; *p++ = ' ';[m
[31m-            p = ngx_cpymem(p, header[i].value.data, header[i].value.len);[m
[31m-            *p++ = CR; *p++ = LF;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_auth_http_conf_t *ahcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-    ngx_url_t   u;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = 80;[m
[31m-    u.uri_part = 1;[m
[31m-[m
[31m-    if (ngx_strncmp(u.url.data, "http://", 7) == 0) {[m
[31m-        u.url.len -= 7;[m
[31m-        u.url.data += 7;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in auth_http \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ahcf->peer = u.addrs;[m
[31m-[m
[31m-    if (u.family != AF_UNIX) {[m
[31m-        ahcf->host_header = u.host;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&ahcf->host_header, "localhost");[m
[31m-    }[m
[31m-[m
[31m-    ahcf->uri = u.uri;[m
[31m-[m
[31m-    if (ahcf->uri.len == 0) {[m
[31m-        ngx_str_set(&ahcf->uri, "/");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_auth_http_conf_t *ahcf = conf;[m
[31m-[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_table_elt_t  *header;[m
[31m-[m
[31m-    if (ahcf->headers == NULL) {[m
[31m-        ahcf->headers = ngx_array_create(cf->pool, 1, sizeof(ngx_table_elt_t));[m
[31m-        if (ahcf->headers == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    header = ngx_array_push(ahcf->headers);[m
[31m-    if (header == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    header->key = value[1];[m
[31m-    header->value = value[2];[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_core_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_core_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8ea8ea9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_core_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,679 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_core_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_mail_core_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_mail_core_server,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("listen"),[m
[31m-      NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_core_listen,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("protocol"),[m
[31m-      NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_mail_core_protocol,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_core_srv_conf_t, timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_core_srv_conf_t, server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_core_error_log,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_core_resolver,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver_timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_core_srv_conf_t, resolver_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_core_module_ctx = {[m
[31m-    NULL,                                  /* protocol */[m
[31m-[m
[31m-    ngx_mail_core_create_main_conf,        /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_core_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_mail_core_merge_srv_conf           /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_core_module_ctx,             /* module context */[m
[31m-    ngx_mail_core_commands,                /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_core_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_main_conf_t));[m
[31m-    if (cmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->servers, cf->pool, 4,[m
[31m-                       sizeof(ngx_mail_core_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_mail_listen_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return cmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_core_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_srv_conf_t));[m
[31m-    if (cscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     cscf->protocol = NULL;[m
[31m-     *     cscf->error_log = NULL;[m
[31m-     */[m
[31m-[m
[31m-    cscf->timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    cscf->resolver_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    cscf->resolver = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    cscf->file_name = cf->conf_file->file.name.data;[m
[31m-    cscf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return cscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t *prev = parent;[m
[31m-    ngx_mail_core_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000);[m
[31m-    ngx_conf_merge_msec_value(conf->resolver_timeout, prev->resolver_timeout,[m
[31m-                              30000);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->server_name, prev->server_name, "");[m
[31m-[m
[31m-    if (conf->server_name.len == 0) {[m
[31m-        conf->server_name = cf->cycle->hostname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->protocol == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "unknown mail protocol for server in %s:%ui",[m
[31m-                      conf->file_name, conf->line);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->error_log == NULL) {[m
[31m-        if (prev->error_log) {[m
[31m-            conf->error_log = prev->error_log;[m
[31m-        } else {[m
[31m-            conf->error_log = &cf->cycle->new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->resolver, prev->resolver, NULL);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                       *rv;[m
[31m-    void                       *mconf;[m
[31m-    ngx_uint_t                  m;[m
[31m-    ngx_conf_t                  pcf;[m
[31m-    ngx_mail_module_t          *module;[m
[31m-    ngx_mail_conf_ctx_t        *ctx, *mail_ctx;[m
[31m-    ngx_mail_core_srv_conf_t   *cscf, **cscfp;[m
[31m-    ngx_mail_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mail_ctx = cf->ctx;[m
[31m-    ctx->main_conf = mail_ctx->main_conf;[m
[31m-[m
[31m-    /* the server{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the server configuration context */[m
[31m-[m
[31m-    cscf = ctx->srv_conf[ngx_mail_core_module.ctx_index];[m
[31m-    cscf->ctx = ctx;[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index];[m
[31m-[m
[31m-    cscfp = ngx_array_push(&cmcf->servers);[m
[31m-    if (cscfp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *cscfp = cscf;[m
[31m-[m
[31m-[m
[31m-    /* parse inside server{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_MAIL_SRV_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    size_t                      len, off;[m
[31m-    in_port_t                   port;[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_uint_t                  i, m;[m
[31m-    struct sockaddr            *sa;[m
[31m-    ngx_mail_listen_t          *ls;[m
[31m-    ngx_mail_module_t          *module;[m
[31m-    struct sockaddr_in         *sin;[m
[31m-    ngx_mail_core_main_conf_t  *cmcf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6        *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.listen = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in \"%V\" of the \"listen\" directive",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_mail_conf_get_module_main_conf(cf, ngx_mail_core_module);[m
[31m-[m
[31m-    ls = cmcf->listen.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->listen.nelts; i++) {[m
[31m-[m
[31m-        sa = &ls[i].u.sockaddr;[m
[31m-[m
[31m-        if (sa->sa_family != u.family) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            off = offsetof(struct sockaddr_in6, sin6_addr);[m
[31m-            len = 16;[m
[31m-            sin6 = &ls[i].u.sockaddr_in6;[m
[31m-            port = ntohs(sin6->sin6_port);[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            off = offsetof(struct sockaddr_un, sun_path);[m
[31m-            len = sizeof(((struct sockaddr_un *) sa)->sun_path);[m
[31m-            port = 0;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            off = offsetof(struct sockaddr_in, sin_addr);[m
[31m-            len = 4;[m
[31m-            sin = &ls[i].u.sockaddr_in;[m
[31m-            port = ntohs(sin->sin_port);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_memcmp(ls[i].u.sockaddr_data + off, u.sockaddr + off, len)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (port != u.port) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate \"%V\" address and port pair", &u.url);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ls = ngx_array_push(&cmcf->listen);[m
[31m-    if (ls == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(ls, sizeof(ngx_mail_listen_t));[m
[31m-[m
[31m-    ngx_memcpy(&ls->u.sockaddr, u.sockaddr, u.socklen);[m
[31m-[m
[31m-    ls->socklen = u.socklen;[m
[31m-    ls->backlog = NGX_LISTEN_BACKLOG;[m
[31m-    ls->wildcard = u.wildcard;[m
[31m-    ls->ctx = cf->ctx;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    ls->ipv6only = 1;[m
[31m-#endif[m
[31m-[m
[31m-    if (cscf->protocol == NULL) {[m
[31m-        for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-            if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-            if (module->protocol == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; module->protocol->port[i]; i++) {[m
[31m-                if (module->protocol->port[i] == u.port) {[m
[31m-                    cscf->protocol = module->protocol;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "bind") == 0) {[m
[31m-            ls->bind = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) {[m
[31m-            ls->backlog = ngx_atoi(value[i].data + 8, value[i].len - 8);[m
[31m-            ls->bind = 1;[m
[31m-[m
[31m-            if (ls->backlog == NGX_ERROR || ls->backlog == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid backlog \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) {[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            u_char  buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-            sa = &ls->u.sockaddr;[m
[31m-[m
[31m-            if (sa->sa_family == AF_INET6) {[m
[31m-[m
[31m-                if (ngx_strcmp(&value[i].data[10], "n") == 0) {[m
[31m-                    ls->ipv6only = 1;[m
[31m-[m
[31m-                } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) {[m
[31m-                    ls->ipv6only = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid ipv6only flags \"%s\"",[m
[31m-                                       &value[i].data[9]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ls->bind = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                len = ngx_sock_ntop(sa, ls->socklen, buf,[m
[31m-                                    NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "ipv6only is not supported "[m
[31m-                                   "on addr \"%*s\", ignored", len, buf);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "bind ipv6only is not supported "[m
[31m-                               "on this platform");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "ssl") == 0) {[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-            ls->ssl = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"ssl\" parameter requires "[m
[31m-                               "ngx_mail_ssl_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[i].data[13], "on") == 0) {[m
[31m-                ls->so_keepalive = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[i].data[13], "off") == 0) {[m
[31m-                ls->so_keepalive = 2;[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-                u_char     *p, *end;[m
[31m-                ngx_str_t   s;[m
[31m-[m
[31m-                end = value[i].data + value[i].len;[m
[31m-                s.data = value[i].data + 13;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepidle = ngx_parse_time(&s, 1);[m
[31m-                    if (ls->tcp_keepidle == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepintvl = ngx_parse_time(&s, 1);[m
[31m-                    if (ls->tcp_keepintvl == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                if (s.data < end) {[m
[31m-                    s.len = end - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepcnt = ngx_atoi(s.data, s.len);[m
[31m-                    if (ls->tcp_keepcnt == NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0[m
[31m-                    && ls->tcp_keepcnt == 0)[m
[31m-                {[m
[31m-                    goto invalid_so_keepalive;[m
[31m-                }[m
[31m-[m
[31m-                ls->so_keepalive = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"so_keepalive\" parameter accepts "[m
[31m-                                   "only \"on\" or \"off\" on this platform");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            ls->bind = 1;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-        invalid_so_keepalive:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid so_keepalive value: \"%s\"",[m
[31m-                               &value[i].data[13]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the invalid \"%V\" parameter", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    ngx_str_t          *value;[m
[31m-    ngx_uint_t          m;[m
[31m-    ngx_mail_module_t  *module;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->protocol[m
[31m-            && ngx_strcmp(module->protocol->name.data, value[1].data) == 0)[m
[31m-        {[m
[31m-            cscf->protocol = module->protocol;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "unknown protocol \"%V\"", &value[1]);[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &cscf->error_log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cscf->resolver != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        cscf->resolver = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    cscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);[m
[31m-    if (cscf->resolver == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t    *c, *value;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_array_t  *a;[m
[31m-[m
[31m-    a = (ngx_array_t *) (p + cmd->offset);[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        c = ngx_array_push(a);[m
[31m-        if (c == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *c = value[i];[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 901bb8f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,866 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_mail_init_session(ngx_connection_t *c);[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-static void ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c);[m
[31m-static void ngx_mail_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_verify_cert(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_init_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    size_t                     len;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_mail_port_t           *port;[m
[31m-    struct sockaddr           *sa;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-    ngx_mail_log_ctx_t        *ctx;[m
[31m-    ngx_mail_in_addr_t        *addr;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_addr_conf_t      *addr_conf;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    u_char                     text[NGX_SOCKADDR_STRLEN];[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-    ngx_mail_in6_addr_t       *addr6;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-    /* find the server configuration for the address:port */[m
[31m-[m
[31m-    port = c->listening->servers;[m
[31m-[m
[31m-    if (port->naddrs > 1) {[m
[31m-[m
[31m-        /*[m
[31m-         * There are several addresses on this port and one of them[m
[31m-         * is the "*:port" wildcard so getsockname() is needed to determine[m
[31m-         * the server address.[m
[31m-         *[m
[31m-         * AcceptEx() already gave this address.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sa = c->local_sockaddr;[m
[31m-[m
[31m-        switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) sa;[m
[31m-[m
[31m-            addr6 = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            addr_conf = &addr6[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) sa;[m
[31m-[m
[31m-            addr = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (addr[i].addr == sin->sin_addr.s_addr) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            addr_conf = &addr[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            addr6 = port->addrs;[m
[31m-            addr_conf = &addr6[0].conf;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            addr = port->addrs;[m
[31m-            addr_conf = &addr[0].conf;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = ngx_pcalloc(c->pool, sizeof(ngx_mail_session_t));[m
[31m-    if (s == NULL) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->signature = NGX_MAIL_MODULE;[m
[31m-[m
[31m-    s->main_conf = addr_conf->ctx->main_conf;[m
[31m-    s->srv_conf = addr_conf->ctx->srv_conf;[m
[31m-[m
[31m-    s->addr_text = &addr_conf->addr_text;[m
[31m-[m
[31m-    c->data = s;[m
[31m-    s->connection = c;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(c, cscf->error_log);[m
[31m-[m
[31m-    len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA client %*s connected to %V",[m
[31m-                  c->number, len, text, s->addr_text);[m
[31m-[m
[31m-    ctx = ngx_palloc(c->pool, sizeof(ngx_mail_log_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->client = &c->addr_text;[m
[31m-    ctx->session = s;[m
[31m-[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->handler = ngx_mail_log_error;[m
[31m-    c->log->data = ctx;[m
[31m-    c->log->action = "sending client greeting line";[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    {[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    if (sslcf->enable) {[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        ngx_mail_ssl_init_connection(&sslcf->ssl, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (addr_conf->ssl) {[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (sslcf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined "[m
[31m-                          "in server listening on SSL port");[m
[31m-            ngx_mail_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_mail_ssl_init_connection(&sslcf->ssl, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_mail_init_session(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-void[m
[31m-ngx_mail_starttls_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_mail_session_t   *s;[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-    s->starttls = 1;[m
[31m-[m
[31m-    c->log->action = "in starttls state";[m
[31m-[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    ngx_mail_ssl_init_connection(&sslcf->ssl, c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(ssl, c, 0) == NGX_ERROR) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_handshake(c) == NGX_AGAIN) {[m
[31m-[m
[31m-        s = c->data;[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        ngx_add_timer(c->read, cscf->timeout);[m
[31m-[m
[31m-        c->ssl->handler = ngx_mail_ssl_handshake_handler;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_ssl_handshake_handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        s = c->data;[m
[31m-[m
[31m-        if (ngx_mail_verify_cert(s, c) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (s->starttls) {[m
[31m-            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-            c->read->handler = cscf->protocol->init_protocol;[m
[31m-            c->write->handler = ngx_mail_send;[m
[31m-[m
[31m-            cscf->protocol->init_protocol(c->read);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->read->ready = 0;[m
[31m-[m
[31m-        ngx_mail_init_session(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_verify_cert(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    long                       rc;[m
[31m-    X509                      *cert;[m
[31m-    ngx_mail_ssl_conf_t       *sslcf;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    if (!sslcf->verify) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-    if (rc != X509_V_OK[m
[31m-        && (sslcf->verify != 3 || !ngx_ssl_verify_error_optional(rc)))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client SSL certificate verify error: (%l:%s)",[m
[31m-                      rc, X509_verify_cert_error_string(rc));[m
[31m-[m
[31m-        ngx_ssl_remove_cached_session(sslcf->ssl.ctx,[m
[31m-                                      (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        s->out = cscf->protocol->cert_error;[m
[31m-        s->quit = 1;[m
[31m-[m
[31m-        c->write->handler = ngx_mail_send;[m
[31m-[m
[31m-        ngx_mail_send(s->connection->write);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sslcf->verify == 1) {[m
[31m-        cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-        if (cert == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "client sent no required SSL certificate");[m
[31m-[m
[31m-            ngx_ssl_remove_cached_session(sslcf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-            s->out = cscf->protocol->no_cert;[m
[31m-            s->quit = 1;[m
[31m-[m
[31m-            c->write->handler = ngx_mail_send;[m
[31m-[m
[31m-            ngx_mail_send(s->connection->write);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        X509_free(cert);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_init_session(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    s = c->data;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    s->protocol = cscf->protocol->type;[m
[31m-[m
[31m-    s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_mail_max_module);[m
[31m-    if (s->ctx == NULL) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_mail_send;[m
[31m-[m
[31m-    cscf->protocol->init_session(s, c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_mail_core_srv_conf_t *cscf)[m
[31m-{[m
[31m-    s->salt.data = ngx_pnalloc(c->pool,[m
[31m-                               sizeof(" <18446744073709551616.@>" CRLF) - 1[m
[31m-                               + NGX_TIME_T_LEN[m
[31m-                               + cscf->server_name.len);[m
[31m-    if (s->salt.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->salt.len = ngx_sprintf(s->salt.data, "<%ul.%T@%V>" CRLF,[m
[31m-                              ngx_random(), ngx_time(), &cscf->server_name)[m
[31m-                  - s->salt.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, ngx_uint_t n)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t  *arg, plain;[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth plain: \"%V\"", &arg[n]);[m
[31m-#endif[m
[31m-[m
[31m-    plain.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len));[m
[31m-    if (plain.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&plain, &arg[n]) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid base64 encoding in AUTH PLAIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    p = plain.data;[m
[31m-    last = p + plain.len;[m
[31m-[m
[31m-    while (p < last && *p++) { /* void */ }[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent invalid login in AUTH PLAIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    s->login.data = p;[m
[31m-[m
[31m-    while (p < last && *p) { p++; }[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent invalid password in AUTH PLAIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    s->login.len = p++ - s->login.data;[m
[31m-[m
[31m-    s->passwd.len = last - p;[m
[31m-    s->passwd.data = p;[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth plain: \"%V\" \"%V\"", &s->login, &s->passwd);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_login_username(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth login username: \"%V\"", &arg[n]);[m
[31m-[m
[31m-    s->login.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len));[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&s->login, &arg[n]) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid base64 encoding in AUTH LOGIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth login username: \"%V\"", &s->login);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_login_password(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth login password: \"%V\"", &arg[0]);[m
[31m-#endif[m
[31m-[m
[31m-    s->passwd.data = ngx_pnalloc(c->pool,[m
[31m-                                 ngx_base64_decoded_length(arg[0].len));[m
[31m-    if (s->passwd.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&s->passwd, &arg[0]) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid base64 encoding in AUTH LOGIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth login password: \"%V\"", &s->passwd);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    char *prefix, size_t len)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    ngx_str_t    salt;[m
[31m-    ngx_uint_t   n;[m
[31m-[m
[31m-    p = ngx_pnalloc(c->pool, len + ngx_base64_encoded_length(s->salt.len) + 2);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    salt.data = ngx_cpymem(p, prefix, len);[m
[31m-    s->salt.len -= 2;[m
[31m-[m
[31m-    ngx_encode_base64(&salt, &s->salt);[m
[31m-[m
[31m-    s->salt.len += 2;[m
[31m-    n = len + salt.len;[m
[31m-    p[n++] = CR; p[n++] = LF;[m
[31m-[m
[31m-    s->out.len = n;[m
[31m-    s->out.data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth cram-md5: \"%V\"", &arg[0]);[m
[31m-[m
[31m-    s->login.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[0].len));[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid base64 encoding in AUTH CRAM-MD5 command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    p = s->login.data;[m
[31m-    last = p + s->login.len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        if (*p++ == ' ') {[m
[31m-            s->login.len = p - s->login.data - 1;[m
[31m-            s->passwd.len = last - p;[m
[31m-            s->passwd.data = p;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (s->passwd.len != 32) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid CRAM-MD5 hash in AUTH CRAM-MD5 command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth cram-md5: \"%V\" \"%V\"", &s->login, &s->passwd);[m
[31m-[m
[31m-    s->auth_method = NGX_MAIL_AUTH_CRAM_MD5;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_send(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_int_t                  n;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len == 0) {[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    n = c->send(c, s->out.data, s->out.len);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        s->out.data += n;[m
[31m-        s->out.len -= n;[m
[31m-[m
[31m-        if (s->out.len != 0) {[m
[31m-            goto again;[m
[31m-        }[m
[31m-[m
[31m-        if (wev->timer_set) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-[m
[31m-        if (s->quit) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (s->blocked) {[m
[31m-            c->read->handler(c->read);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* n == NGX_AGAIN */[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    ngx_add_timer(c->write, cscf->timeout);[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_str_t                  l;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == 0) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        s->buffer->last += n;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (s->buffer->pos == s->buffer->last) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    rc = cscf->protocol->parse_command(s);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-        if (s->buffer->last < s->buffer->end) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        l.len = s->buffer->last - s->buffer->start;[m
[31m-        l.data = s->buffer->start;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent too long command \"%V\"", &l);[m
[31m-[m
[31m-        s->quit = 1;[m
[31m-[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_IMAP_NEXT || rc == NGX_MAIL_PARSE_INVALID_COMMAND) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    s->args.nelts = 0;[m
[31m-[m
[31m-    if (s->buffer->pos == s->buffer->last) {[m
[31m-        s->buffer->pos = s->buffer->start;[m
[31m-        s->buffer->last = s->buffer->start;[m
[31m-    }[m
[31m-[m
[31m-    s->state = 0;[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    s->login_attempt++;[m
[31m-[m
[31m-    ngx_mail_auth_http_init(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_session_internal_server_error(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    s->out = cscf->protocol->internal_server_error;[m
[31m-    s->quit = 1;[m
[31m-[m
[31m-    ngx_mail_send(s->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "close mail connection: %d", c->fd);[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_mail_close_connection;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-    ngx_mail_log_ctx_t  *ctx;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    ctx = log->data;[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", client: %V", ctx->client);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    s = ctx->session;[m
[31m-[m
[31m-    if (s == NULL) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, "%s, server: %V",[m
[31m-                     s->starttls ? " using starttls" : "",[m
[31m-                     s->addr_text);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (s->login.len == 0) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", login: \"%V\"", &s->login);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (s->proxy == NULL) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", upstream: %V", s->proxy->upstream.name);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 57e2fb7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,457 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_imap_module.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_mail_imap_login(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_imap_authenticate(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_imap_capability(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_imap_starttls(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-static u_char  imap_greeting[] = "* OK IMAP4 ready" CRLF;[m
[31m-static u_char  imap_star[] = "* ";[m
[31m-static u_char  imap_ok[] = "OK completed" CRLF;[m
[31m-static u_char  imap_next[] = "+ OK" CRLF;[m
[31m-static u_char  imap_plain_next[] = "+ " CRLF;[m
[31m-static u_char  imap_username[] = "+ VXNlcm5hbWU6" CRLF;[m
[31m-static u_char  imap_password[] = "+ UGFzc3dvcmQ6" CRLF;[m
[31m-static u_char  imap_bye[] = "* BYE" CRLF;[m
[31m-static u_char  imap_invalid_command[] = "BAD invalid command" CRLF;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    ngx_str_set(&s->out, imap_greeting);[m
[31m-[m
[31m-    c->read->handler = ngx_mail_imap_init_protocol;[m
[31m-[m
[31m-    ngx_add_timer(c->read, cscf->timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_imap_init_protocol(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_imap_srv_conf_t  *iscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->log->action = "in auth state";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (s->buffer == NULL) {[m
[31m-        if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t))[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);[m
[31m-[m
[31m-        s->buffer = ngx_create_temp_buf(c->pool, iscf->client_buffer_size);[m
[31m-        if (s->buffer == NULL) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->mail_state = ngx_imap_start;[m
[31m-    c->read->handler = ngx_mail_imap_auth_state;[m
[31m-[m
[31m-    ngx_mail_imap_auth_state(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_imap_auth_state(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char              *p, *dst, *src, *end;[m
[31m-    ngx_str_t           *arg;[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_uint_t           tag, i;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth state");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap send handler busy");[m
[31m-        s->blocked = 1;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->blocked = 0;[m
[31m-[m
[31m-    rc = ngx_mail_read_command(s, c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    tag = 1;[m
[31m-    s->text.len = 0;[m
[31m-    ngx_str_set(&s->out, imap_ok);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth command: %i",[m
[31m-                       s->command);[m
[31m-[m
[31m-        if (s->backslash) {[m
[31m-[m
[31m-            arg = s->args.elts;[m
[31m-[m
[31m-            for (i = 0; i < s->args.nelts; i++) {[m
[31m-                dst = arg[i].data;[m
[31m-                end = dst + arg[i].len;[m
[31m-[m
[31m-                for (src = dst; src < end; dst++) {[m
[31m-                    *dst = *src;[m
[31m-                    if (*src++ == '\\') {[m
[31m-                        *dst = *src++;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                arg[i].len = dst - arg[i].data;[m
[31m-            }[m
[31m-[m
[31m-            s->backslash = 0;[m
[31m-        }[m
[31m-[m
[31m-        switch (s->mail_state) {[m
[31m-[m
[31m-        case ngx_imap_start:[m
[31m-[m
[31m-            switch (s->command) {[m
[31m-[m
[31m-            case NGX_IMAP_LOGIN:[m
[31m-                rc = ngx_mail_imap_login(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_AUTHENTICATE:[m
[31m-                rc = ngx_mail_imap_authenticate(s, c);[m
[31m-                tag = (rc != NGX_OK);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_CAPABILITY:[m
[31m-                rc = ngx_mail_imap_capability(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_LOGOUT:[m
[31m-                s->quit = 1;[m
[31m-                ngx_str_set(&s->text, imap_bye);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_NOOP:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_STARTTLS:[m
[31m-                rc = ngx_mail_imap_starttls(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                rc = NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_auth_login_username:[m
[31m-            rc = ngx_mail_auth_login_username(s, c, 0);[m
[31m-[m
[31m-            tag = 0;[m
[31m-            ngx_str_set(&s->out, imap_password);[m
[31m-            s->mail_state = ngx_imap_auth_login_password;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_auth_login_password:[m
[31m-            rc = ngx_mail_auth_login_password(s, c);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_auth_plain:[m
[31m-            rc = ngx_mail_auth_plain(s, c, 0);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_auth_cram_md5:[m
[31m-            rc = ngx_mail_auth_cram_md5(s, c);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else if (rc == NGX_IMAP_NEXT) {[m
[31m-        tag = 0;[m
[31m-        ngx_str_set(&s->out, imap_next);[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_DONE:[m
[31m-        ngx_mail_auth(s, c);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_MAIL_PARSE_INVALID_COMMAND:[m
[31m-        s->state = 0;[m
[31m-        ngx_str_set(&s->out, imap_invalid_command);[m
[31m-        s->mail_state = ngx_imap_start;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (tag) {[m
[31m-        if (s->tag.len == 0) {[m
[31m-            ngx_str_set(&s->tag, imap_star);[m
[31m-        }[m
[31m-[m
[31m-        if (s->tagged_line.len < s->tag.len + s->text.len + s->out.len) {[m
[31m-            s->tagged_line.len = s->tag.len + s->text.len + s->out.len;[m
[31m-            s->tagged_line.data = ngx_pnalloc(c->pool, s->tagged_line.len);[m
[31m-            if (s->tagged_line.data == NULL) {[m
[31m-                ngx_mail_close_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        p = s->tagged_line.data;[m
[31m-[m
[31m-        if (s->text.len) {[m
[31m-            p = ngx_cpymem(p, s->text.data, s->text.len);[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, s->tag.data, s->tag.len);[m
[31m-        ngx_memcpy(p, s->out.data, s->out.len);[m
[31m-[m
[31m-        s->out.len = s->text.len + s->tag.len + s->out.len;[m
[31m-        s->out.data = s->tagged_line.data;[m
[31m-    }[m
[31m-[m
[31m-    if (rc != NGX_IMAP_NEXT) {[m
[31m-        s->args.nelts = 0;[m
[31m-[m
[31m-        if (s->state) {[m
[31m-            /* preserve tag */[m
[31m-            s->arg_start = s->buffer->start + s->tag.len;[m
[31m-            s->buffer->pos = s->arg_start;[m
[31m-            s->buffer->last = s->arg_start;[m
[31m-[m
[31m-        } else {[m
[31m-            s->buffer->pos = s->buffer->start;[m
[31m-            s->buffer->last = s->buffer->start;[m
[31m-            s->tag.len = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    if (s->args.nelts != 2 || arg[0].len == 0) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    s->login.len = arg[0].len;[m
[31m-    s->login.data = ngx_pnalloc(c->pool, s->login.len);[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->login.data, arg[0].data, s->login.len);[m
[31m-[m
[31m-    s->passwd.len = arg[1].len;[m
[31m-    s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);[m
[31m-    if (s->passwd.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "imap login:\"%V\" passwd:\"%V\"",[m
[31m-                   &s->login, &s->passwd);[m
[31m-#else[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "imap login:\"%V\"", &s->login);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_imap_srv_conf_t  *iscf;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_mail_auth_parse(s, c);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, imap_username);[m
[31m-        s->mail_state = ngx_imap_auth_login_username;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN_USERNAME:[m
[31m-[m
[31m-        ngx_str_set(&s->out, imap_password);[m
[31m-        s->mail_state = ngx_imap_auth_login_password;[m
[31m-[m
[31m-        return ngx_mail_auth_login_username(s, c, 1);[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_PLAIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, imap_plain_next);[m
[31m-        s->mail_state = ngx_imap_auth_plain;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_CRAM_MD5:[m
[31m-[m
[31m-        iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);[m
[31m-[m
[31m-        if (!(iscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (s->salt.data == NULL) {[m
[31m-            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-            if (ngx_mail_salt(s, c, cscf) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) {[m
[31m-            s->mail_state = ngx_imap_auth_cram_md5;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_imap_srv_conf_t  *iscf;[m
[31m-[m
[31m-    iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    if (c->ssl == NULL) {[m
[31m-        ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-        if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {[m
[31m-            s->text = iscf->starttls_capability;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {[m
[31m-            s->text = iscf->starttls_only_capability;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    s->text = iscf->capability;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_imap_starttls(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (c->ssl == NULL) {[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-        if (sslcf->starttls) {[m
[31m-            c->read->handler = ngx_mail_starttls_handler;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_module.c[m
[1mdeleted file mode 100644[m
[1mindex d281070..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,255 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_imap_module.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_imap_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_imap_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_imap_default_capabilities[] = {[m
[31m-    ngx_string("IMAP4"),[m
[31m-    ngx_string("IMAP4rev1"),[m
[31m-    ngx_string("UIDPLUS"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_mail_imap_auth_methods[] = {[m
[31m-    { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },[m
[31m-    { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },[m
[31m-    { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_imap_auth_methods_names[] = {[m
[31m-    ngx_string("AUTH=PLAIN"),[m
[31m-    ngx_string("AUTH=LOGIN"),[m
[31m-    ngx_null_string,  /* APOP */[m
[31m-    ngx_string("AUTH=CRAM-MD5"),[m
[31m-    ngx_null_string   /* NONE */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_protocol_t  ngx_mail_imap_protocol = {[m
[31m-    ngx_string("imap"),[m
[31m-    { 143, 993, 0, 0 },[m
[31m-    NGX_MAIL_IMAP_PROTOCOL,[m
[31m-[m
[31m-    ngx_mail_imap_init_session,[m
[31m-    ngx_mail_imap_init_protocol,[m
[31m-    ngx_mail_imap_parse_command,[m
[31m-    ngx_mail_imap_auth_state,[m
[31m-[m
[31m-    ngx_string("* BAD internal server error" CRLF),[m
[31m-    ngx_string("* BYE SSL certificate error" CRLF),[m
[31m-    ngx_string("* BYE No required SSL certificate" CRLF)[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_imap_commands[] = {[m
[31m-[m
[31m-    { ngx_string("imap_client_buffer"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_imap_srv_conf_t, client_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("imap_capabilities"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_capabilities,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_imap_srv_conf_t, capabilities),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("imap_auth"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_imap_srv_conf_t, auth_methods),[m
[31m-      &ngx_mail_imap_auth_methods },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_imap_module_ctx = {[m
[31m-    &ngx_mail_imap_protocol,               /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_imap_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_mail_imap_merge_srv_conf           /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_imap_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_imap_module_ctx,             /* module context */[m
[31m-    ngx_mail_imap_commands,                /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_imap_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_imap_srv_conf_t  *iscf;[m
[31m-[m
[31m-    iscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_imap_srv_conf_t));[m
[31m-    if (iscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    iscf->client_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    if (ngx_array_init(&iscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return iscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_imap_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_imap_srv_conf_t *prev = parent;[m
[31m-    ngx_mail_imap_srv_conf_t *conf = child;[m
[31m-[m
[31m-    u_char      *p, *auth;[m
[31m-    size_t       size;[m
[31m-    ngx_str_t   *c, *d;[m
[31m-    ngx_uint_t   i, m;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->client_buffer_size,[m
[31m-                              prev->client_buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->auth_methods,[m
[31m-                              prev->auth_methods,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_MAIL_AUTH_PLAIN_ENABLED));[m
[31m-[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-        conf->capabilities = prev->capabilities;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-[m
[31m-        for (d = ngx_mail_imap_default_capabilities; d->len; d++) {[m
[31m-            c = ngx_array_push(&conf->capabilities);[m
[31m-            if (c == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *c = *d;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof("* CAPABILITY" CRLF) - 1;[m
[31m-[m
[31m-    c = conf->capabilities.elts;[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        size += 1 + c[i].len;[m
[31m-    }[m
[31m-[m
[31m-    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;[m
[31m-         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;[m
[31m-         m <<= 1, i++)[m
[31m-    {[m
[31m-        if (m & conf->auth_methods) {[m
[31m-            size += 1 + ngx_mail_imap_auth_methods_names[i].len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->capability.len = size;[m
[31m-    conf->capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, "* CAPABILITY", sizeof("* CAPABILITY") - 1);[m
[31m-[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        *p++ = ' ';[m
[31m-        p = ngx_cpymem(p, c[i].data, c[i].len);[m
[31m-    }[m
[31m-[m
[31m-    auth = p;[m
[31m-[m
[31m-    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;[m
[31m-         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;[m
[31m-         m <<= 1, i++)[m
[31m-    {[m
[31m-        if (m & conf->auth_methods) {[m
[31m-            *p++ = ' ';[m
[31m-            p = ngx_cpymem(p, ngx_mail_imap_auth_methods_names[i].data,[m
[31m-                           ngx_mail_imap_auth_methods_names[i].len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    size += sizeof(" STARTTLS") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_capability.len = size;[m
[31m-    conf->starttls_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data,[m
[31m-                   conf->capability.len - (sizeof(CRLF) - 1));[m
[31m-    p = ngx_cpymem(p, " STARTTLS", sizeof(" STARTTLS") - 1);[m
[31m-    *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    size = (auth - conf->capability.data) + sizeof(CRLF) - 1[m
[31m-            + sizeof(" STARTTLS LOGINDISABLED") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_only_capability.len = size;[m
[31m-    conf->starttls_only_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data,[m
[31m-                   auth - conf->capability.data);[m
[31m-    p = ngx_cpymem(p, " STARTTLS LOGINDISABLED",[m
[31m-                   sizeof(" STARTTLS LOGINDISABLED") - 1);[m
[31m-    *p++ = CR; *p = LF;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_module.h[m
[1mdeleted file mode 100644[m
[1mindex 131b445..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_imap_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_IMAP_MODULE_H_INCLUDED_[m
[31m-#define _NGX_MAIL_IMAP_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t       client_buffer_size;[m
[31m-[m
[31m-    ngx_str_t    capability;[m
[31m-    ngx_str_t    starttls_capability;[m
[31m-    ngx_str_t    starttls_only_capability;[m
[31m-[m
[31m-    ngx_uint_t   auth_methods;[m
[31m-[m
[31m-    ngx_array_t  capabilities;[m
[31m-} ngx_mail_imap_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-void ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_imap_init_protocol(ngx_event_t *rev);[m
[31m-void ngx_mail_imap_auth_state(ngx_event_t *rev);[m
[31m-ngx_int_t ngx_mail_imap_parse_command(ngx_mail_session_t *s);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_mail_imap_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_parse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_parse.c[m
[1mdeleted file mode 100644[m
[1mindex b158f5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_parse.c[m
[1m+++ /dev/null[m
[36m@@ -1,918 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_pop3_module.h>[m
[31m-#include <ngx_mail_imap_module.h>[m
[31m-#include <ngx_mail_smtp_module.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_pop3_parse_command(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    u_char      ch, *p, *c, c0, c1, c2, c3;[m
[31m-    ngx_str_t  *arg;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_spaces_before_argument,[m
[31m-        sw_argument,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = s->state;[m
[31m-[m
[31m-    for (p = s->buffer->pos; p < s->buffer->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* POP3 command */[m
[31m-        case sw_start:[m
[31m-            if (ch == ' ' || ch == CR || ch == LF) {[m
[31m-                c = s->buffer->start;[m
[31m-[m
[31m-                if (p - c == 4) {[m
[31m-[m
[31m-                    c0 = ngx_toupper(c[0]);[m
[31m-                    c1 = ngx_toupper(c[1]);[m
[31m-                    c2 = ngx_toupper(c[2]);[m
[31m-                    c3 = ngx_toupper(c[3]);[m
[31m-[m
[31m-                    if (c0 == 'U' && c1 == 'S' && c2 == 'E' && c3 == 'R')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_USER;[m
[31m-[m
[31m-                    } else if (c0 == 'P' && c1 == 'A' && c2 == 'S' && c3 == 'S')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_PASS;[m
[31m-[m
[31m-                    } else if (c0 == 'A' && c1 == 'P' && c2 == 'O' && c3 == 'P')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_APOP;[m
[31m-[m
[31m-                    } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_QUIT;[m
[31m-[m
[31m-                    } else if (c0 == 'C' && c1 == 'A' && c2 == 'P' && c3 == 'A')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_CAPA;[m
[31m-[m
[31m-                    } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_AUTH;[m
[31m-[m
[31m-                    } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_NOOP;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-                    } else if (c0 == 'S' && c1 == 'T' && c2 == 'L' && c3 == 'S')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_STLS;[m
[31m-#endif[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_spaces_before_argument:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                s->arg_end = p;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                s->arg_end = p;[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    state = sw_argument;[m
[31m-                    s->arg_start = p;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_argument:[m
[31m-            switch (ch) {[m
[31m-[m
[31m-            case ' ':[m
[31m-[m
[31m-                /*[m
[31m-                 * the space should be considered as part of the at username[m
[31m-                 * or password, but not of argument in other commands[m
[31m-                 */[m
[31m-[m
[31m-                if (s->command == NGX_POP3_USER[m
[31m-                    || s->command == NGX_POP3_PASS)[m
[31m-                {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                /* fall through */[m
[31m-[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-                arg = ngx_array_push(&s->args);[m
[31m-                if (arg == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                arg->len = p - s->arg_start;[m
[31m-                arg->data = s->arg_start;[m
[31m-                s->arg_start = NULL;[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->buffer->pos = p;[m
[31m-    s->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    s->buffer->pos = p + 1;[m
[31m-[m
[31m-    if (s->arg_start) {[m
[31m-        arg = ngx_array_push(&s->args);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        arg->len = s->arg_end - s->arg_start;[m
[31m-        arg->data = s->arg_start;[m
[31m-        s->arg_start = NULL;[m
[31m-    }[m
[31m-[m
[31m-    s->state = (s->command != NGX_POP3_AUTH) ? sw_start : sw_argument;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    s->state = sw_start;[m
[31m-    s->arg_start = NULL;[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_imap_parse_command(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    u_char      ch, *p, *c;[m
[31m-    ngx_str_t  *arg;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_spaces_before_command,[m
[31m-        sw_command,[m
[31m-        sw_spaces_before_argument,[m
[31m-        sw_argument,[m
[31m-        sw_backslash,[m
[31m-        sw_literal,[m
[31m-        sw_no_sync_literal_argument,[m
[31m-        sw_start_literal_argument,[m
[31m-        sw_literal_argument,[m
[31m-        sw_end_literal_argument,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = s->state;[m
[31m-[m
[31m-    for (p = s->buffer->pos; p < s->buffer->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* IMAP tag */[m
[31m-        case sw_start:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                s->tag.len = p - s->buffer->start + 1;[m
[31m-                s->tag.data = s->buffer->start;[m
[31m-                state = sw_spaces_before_command;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                s->state = sw_start;[m
[31m-                return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-            case LF:[m
[31m-                s->state = sw_start;[m
[31m-                return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_spaces_before_command:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                s->state = sw_start;[m
[31m-                return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-            case LF:[m
[31m-                s->state = sw_start;[m
[31m-                return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-            default:[m
[31m-                s->cmd_start = p;[m
[31m-                state = sw_command;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_command:[m
[31m-            if (ch == ' ' || ch == CR || ch == LF) {[m
[31m-[m
[31m-                c = s->cmd_start;[m
[31m-[m
[31m-                switch (p - c) {[m
[31m-[m
[31m-                case 4:[m
[31m-                    if ((c[0] == 'N' || c[0] == 'n')[m
[31m-                        && (c[1] == 'O'|| c[1] == 'o')[m
[31m-                        && (c[2] == 'O'|| c[2] == 'o')[m
[31m-                        && (c[3] == 'P'|| c[3] == 'p'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_NOOP;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-                case 5:[m
[31m-                    if ((c[0] == 'L'|| c[0] == 'l')[m
[31m-                        && (c[1] == 'O'|| c[1] == 'o')[m
[31m-                        && (c[2] == 'G'|| c[2] == 'g')[m
[31m-                        && (c[3] == 'I'|| c[3] == 'i')[m
[31m-                        && (c[4] == 'N'|| c[4] == 'n'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_LOGIN;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-                case 6:[m
[31m-                    if ((c[0] == 'L'|| c[0] == 'l')[m
[31m-                        && (c[1] == 'O'|| c[1] == 'o')[m
[31m-                        && (c[2] == 'G'|| c[2] == 'g')[m
[31m-                        && (c[3] == 'O'|| c[3] == 'o')[m
[31m-                        && (c[4] == 'U'|| c[4] == 'u')[m
[31m-                        && (c[5] == 'T'|| c[5] == 't'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_LOGOUT;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-                case 8:[m
[31m-                    if ((c[0] == 'S'|| c[0] == 's')[m
[31m-                        && (c[1] == 'T'|| c[1] == 't')[m
[31m-                        && (c[2] == 'A'|| c[2] == 'a')[m
[31m-                        && (c[3] == 'R'|| c[3] == 'r')[m
[31m-                        && (c[4] == 'T'|| c[4] == 't')[m
[31m-                        && (c[5] == 'T'|| c[5] == 't')[m
[31m-                        && (c[6] == 'L'|| c[6] == 'l')[m
[31m-                        && (c[7] == 'S'|| c[7] == 's'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_STARTTLS;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-#endif[m
[31m-[m
[31m-                case 10:[m
[31m-                    if ((c[0] == 'C'|| c[0] == 'c')[m
[31m-                        && (c[1] == 'A'|| c[1] == 'a')[m
[31m-                        && (c[2] == 'P'|| c[2] == 'p')[m
[31m-                        && (c[3] == 'A'|| c[3] == 'a')[m
[31m-                        && (c[4] == 'B'|| c[4] == 'b')[m
[31m-                        && (c[5] == 'I'|| c[5] == 'i')[m
[31m-                        && (c[6] == 'L'|| c[6] == 'l')[m
[31m-                        && (c[7] == 'I'|| c[7] == 'i')[m
[31m-                        && (c[8] == 'T'|| c[8] == 't')[m
[31m-                        && (c[9] == 'Y'|| c[9] == 'y'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_CAPABILITY;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-                case 12:[m
[31m-                    if ((c[0] == 'A'|| c[0] == 'a')[m
[31m-                        && (c[1] == 'U'|| c[1] == 'u')[m
[31m-                        && (c[2] == 'T'|| c[2] == 't')[m
[31m-                        && (c[3] == 'H'|| c[3] == 'h')[m
[31m-                        && (c[4] == 'E'|| c[4] == 'e')[m
[31m-                        && (c[5] == 'N'|| c[5] == 'n')[m
[31m-                        && (c[6] == 'T'|| c[6] == 't')[m
[31m-                        && (c[7] == 'I'|| c[7] == 'i')[m
[31m-                        && (c[8] == 'C'|| c[8] == 'c')[m
[31m-                        && (c[9] == 'A'|| c[9] == 'a')[m
[31m-                        && (c[10] == 'T'|| c[10] == 't')[m
[31m-                        && (c[11] == 'E'|| c[11] == 'e'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_AUTHENTICATE;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_spaces_before_argument:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                s->arg_end = p;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                s->arg_end = p;[m
[31m-                goto done;[m
[31m-            case '"':[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    s->quoted = 1;[m
[31m-                    s->arg_start = p + 1;[m
[31m-                    state = sw_argument;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            case '{':[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    state = sw_literal;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            default:[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    s->arg_start = p;[m
[31m-                    state = sw_argument;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_argument:[m
[31m-            if (ch == ' ' && s->quoted) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case '"':[m
[31m-                if (!s->quoted) {[m
[31m-                    break;[m
[31m-                }[m
[31m-                s->quoted = 0;[m
[31m-                /* fall through */[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-                arg = ngx_array_push(&s->args);[m
[31m-                if (arg == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                arg->len = p - s->arg_start;[m
[31m-                arg->data = s->arg_start;[m
[31m-                s->arg_start = NULL;[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case '"':[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-            case '\\':[m
[31m-                if (s->quoted) {[m
[31m-                    s->backslash = 1;[m
[31m-                    state = sw_backslash;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_backslash:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-                goto invalid;[m
[31m-            default:[m
[31m-                state = sw_argument;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_literal:[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                s->literal_len = s->literal_len * 10 + (ch - '0');[m
[31m-                break;[m
[31m-            }[m
[31m-            if (ch == '}') {[m
[31m-                state = sw_start_literal_argument;[m
[31m-                break;[m
[31m-            }[m
[31m-            if (ch == '+') {[m
[31m-                state = sw_no_sync_literal_argument;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_no_sync_literal_argument:[m
[31m-            if (ch == '}') {[m
[31m-                s->no_sync_literal = 1;[m
[31m-                state = sw_start_literal_argument;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_start_literal_argument:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                s->buffer->pos = p + 1;[m
[31m-                s->arg_start = p + 1;[m
[31m-                if (s->no_sync_literal == 0) {[m
[31m-                    s->state = sw_literal_argument;[m
[31m-                    return NGX_IMAP_NEXT;[m
[31m-                }[m
[31m-                state = sw_literal_argument;[m
[31m-                s->no_sync_literal = 0;[m
[31m-                break;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_literal_argument:[m
[31m-            if (s->literal_len && --s->literal_len) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            arg = ngx_array_push(&s->args);[m
[31m-            if (arg == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            arg->len = p + 1 - s->arg_start;[m
[31m-            arg->data = s->arg_start;[m
[31m-            s->arg_start = NULL;[m
[31m-            state = sw_end_literal_argument;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_end_literal_argument:[m
[31m-            switch (ch) {[m
[31m-            case '{':[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    state = sw_literal;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                state = sw_spaces_before_argument;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->buffer->pos = p;[m
[31m-    s->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    s->buffer->pos = p + 1;[m
[31m-[m
[31m-    if (s->arg_start) {[m
[31m-        arg = ngx_array_push(&s->args);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        arg->len = s->arg_end - s->arg_start;[m
[31m-        arg->data = s->arg_start;[m
[31m-[m
[31m-        s->arg_start = NULL;[m
[31m-        s->cmd_start = NULL;[m
[31m-        s->quoted = 0;[m
[31m-        s->no_sync_literal = 0;[m
[31m-        s->literal_len = 0;[m
[31m-    }[m
[31m-[m
[31m-    s->state = (s->command != NGX_IMAP_AUTHENTICATE) ? sw_start : sw_argument;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    s->state = sw_start;[m
[31m-    s->quoted = 0;[m
[31m-    s->no_sync_literal = 0;[m
[31m-    s->literal_len = 0;[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_smtp_parse_command(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    u_char      ch, *p, *c, c0, c1, c2, c3;[m
[31m-    ngx_str_t  *arg;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_command,[m
[31m-        sw_invalid,[m
[31m-        sw_spaces_before_argument,[m
[31m-        sw_argument,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = s->state;[m
[31m-[m
[31m-    for (p = s->buffer->pos; p < s->buffer->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* SMTP command */[m
[31m-        case sw_start:[m
[31m-            s->cmd_start = p;[m
[31m-            state = sw_command;[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case sw_command:[m
[31m-            if (ch == ' ' || ch == CR || ch == LF) {[m
[31m-                c = s->cmd_start;[m
[31m-[m
[31m-                if (p - c == 4) {[m
[31m-[m
[31m-                    c0 = ngx_toupper(c[0]);[m
[31m-                    c1 = ngx_toupper(c[1]);[m
[31m-                    c2 = ngx_toupper(c[2]);[m
[31m-                    c3 = ngx_toupper(c[3]);[m
[31m-[m
[31m-                    if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'O')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_HELO;[m
[31m-[m
[31m-                    } else if (c0 == 'E' && c1 == 'H' && c2 == 'L' && c3 == 'O')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_EHLO;[m
[31m-[m
[31m-                    } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_QUIT;[m
[31m-[m
[31m-                    } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_AUTH;[m
[31m-[m
[31m-                    } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_NOOP;[m
[31m-[m
[31m-                    } else if (c0 == 'M' && c1 == 'A' && c2 == 'I' && c3 == 'L')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_MAIL;[m
[31m-[m
[31m-                    } else if (c0 == 'R' && c1 == 'S' && c2 == 'E' && c3 == 'T')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_RSET;[m
[31m-[m
[31m-                    } else if (c0 == 'R' && c1 == 'C' && c2 == 'P' && c3 == 'T')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_RCPT;[m
[31m-[m
[31m-                    } else if (c0 == 'V' && c1 == 'R' && c2 == 'F' && c3 == 'Y')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_VRFY;[m
[31m-[m
[31m-                    } else if (c0 == 'E' && c1 == 'X' && c2 == 'P' && c3 == 'N')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_EXPN;[m
[31m-[m
[31m-                    } else if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'P')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_HELP;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-                } else if (p - c == 8) {[m
[31m-[m
[31m-                    if ((c[0] == 'S'|| c[0] == 's')[m
[31m-                        && (c[1] == 'T'|| c[1] == 't')[m
[31m-                        && (c[2] == 'A'|| c[2] == 'a')[m
[31m-                        && (c[3] == 'R'|| c[3] == 'r')[m
[31m-                        && (c[4] == 'T'|| c[4] == 't')[m
[31m-                        && (c[5] == 'T'|| c[5] == 't')[m
[31m-                        && (c[6] == 'L'|| c[6] == 'l')[m
[31m-                        && (c[7] == 'S'|| c[7] == 's'))[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_STARTTLS;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-#endif[m
[31m-                } else {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                s->cmd.data = s->cmd_start;[m
[31m-                s->cmd.len = p - s->cmd_start;[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_invalid:[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_spaces_before_argument:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                s->arg_end = p;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                s->arg_end = p;[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                if (s->args.nelts <= 10) {[m
[31m-                    state = sw_argument;[m
[31m-                    s->arg_start = p;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_argument:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-                arg = ngx_array_push(&s->args);[m
[31m-                if (arg == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                arg->len = p - s->arg_start;[m
[31m-                arg->data = s->arg_start;[m
[31m-                s->arg_start = NULL;[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->buffer->pos = p;[m
[31m-    s->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    s->buffer->pos = p + 1;[m
[31m-[m
[31m-    if (s->arg_start) {[m
[31m-        arg = ngx_array_push(&s->args);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        arg->len = s->arg_end - s->arg_start;[m
[31m-        arg->data = s->arg_start;[m
[31m-        s->arg_start = NULL;[m
[31m-    }[m
[31m-[m
[31m-    s->state = (s->command != NGX_SMTP_AUTH) ? sw_start : sw_argument;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    s->state = sw_invalid;[m
[31m-    s->arg_start = NULL;[m
[31m-[m
[31m-    /* skip invalid command till LF */[m
[31m-[m
[31m-    for (p = s->buffer->pos; p < s->buffer->last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            s->state = sw_start;[m
[31m-            p++;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->buffer->pos = p;[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t                 *arg;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    if (arg[0].len == 5) {[m
[31m-[m
[31m-        if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) {[m
[31m-[m
[31m-            if (s->args.nelts == 1) {[m
[31m-                return NGX_MAIL_AUTH_LOGIN;[m
[31m-            }[m
[31m-[m
[31m-            if (s->args.nelts == 2) {[m
[31m-                return NGX_MAIL_AUTH_LOGIN_USERNAME;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) {[m
[31m-[m
[31m-            if (s->args.nelts == 1) {[m
[31m-                return NGX_MAIL_AUTH_PLAIN;[m
[31m-            }[m
[31m-[m
[31m-            if (s->args.nelts == 2) {[m
[31m-                return ngx_mail_auth_plain(s, c, 1);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    if (arg[0].len == 8) {[m
[31m-[m
[31m-        if (s->args.nelts != 1) {[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) {[m
[31m-            return NGX_MAIL_AUTH_CRAM_MD5;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 51bc257..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,500 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_pop3_module.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_int_t stls);[m
[31m-static ngx_int_t ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-static u_char  pop3_greeting[] = "+OK POP3 ready" CRLF;[m
[31m-static u_char  pop3_ok[] = "+OK" CRLF;[m
[31m-static u_char  pop3_next[] = "+ " CRLF;[m
[31m-static u_char  pop3_username[] = "+ VXNlcm5hbWU6" CRLF;[m
[31m-static u_char  pop3_password[] = "+ UGFzc3dvcmQ6" CRLF;[m
[31m-static u_char  pop3_invalid_command[] = "-ERR invalid command" CRLF;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-    pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    if (pscf->auth_methods[m
[31m-        & (NGX_MAIL_AUTH_APOP_ENABLED|NGX_MAIL_AUTH_CRAM_MD5_ENABLED))[m
[31m-    {[m
[31m-        if (ngx_mail_salt(s, c, cscf) != NGX_OK) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        s->out.data = ngx_pnalloc(c->pool, sizeof(pop3_greeting) + s->salt.len);[m
[31m-        if (s->out.data == NULL) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(s->out.data, pop3_greeting, sizeof(pop3_greeting) - 3);[m
[31m-        *p++ = ' ';[m
[31m-        p = ngx_cpymem(p, s->salt.data, s->salt.len);[m
[31m-[m
[31m-        s->out.len = p - s->out.data;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&s->out, pop3_greeting);[m
[31m-    }[m
[31m-[m
[31m-    c->read->handler = ngx_mail_pop3_init_protocol;[m
[31m-[m
[31m-    ngx_add_timer(c->read, cscf->timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_pop3_init_protocol(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->log->action = "in auth state";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (s->buffer == NULL) {[m
[31m-        if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t))[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        s->buffer = ngx_create_temp_buf(c->pool, 128);[m
[31m-        if (s->buffer == NULL) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->mail_state = ngx_pop3_start;[m
[31m-    c->read->handler = ngx_mail_pop3_auth_state;[m
[31m-[m
[31m-    ngx_mail_pop3_auth_state(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_pop3_auth_state(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 auth state");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 send handler busy");[m
[31m-        s->blocked = 1;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->blocked = 0;[m
[31m-[m
[31m-    rc = ngx_mail_read_command(s, c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&s->out, pop3_ok);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        switch (s->mail_state) {[m
[31m-[m
[31m-        case ngx_pop3_start:[m
[31m-[m
[31m-            switch (s->command) {[m
[31m-[m
[31m-            case NGX_POP3_USER:[m
[31m-                rc = ngx_mail_pop3_user(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_CAPA:[m
[31m-                rc = ngx_mail_pop3_capa(s, c, 1);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_APOP:[m
[31m-                rc = ngx_mail_pop3_apop(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_AUTH:[m
[31m-                rc = ngx_mail_pop3_auth(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_QUIT:[m
[31m-                s->quit = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_NOOP:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_STLS:[m
[31m-                rc = ngx_mail_pop3_stls(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                rc = NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_user:[m
[31m-[m
[31m-            switch (s->command) {[m
[31m-[m
[31m-            case NGX_POP3_PASS:[m
[31m-                rc = ngx_mail_pop3_pass(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_CAPA:[m
[31m-                rc = ngx_mail_pop3_capa(s, c, 0);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_QUIT:[m
[31m-                s->quit = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_NOOP:[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                rc = NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* suppress warnings */[m
[31m-        case ngx_pop3_passwd:[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_auth_login_username:[m
[31m-            rc = ngx_mail_auth_login_username(s, c, 0);[m
[31m-[m
[31m-            ngx_str_set(&s->out, pop3_password);[m
[31m-            s->mail_state = ngx_pop3_auth_login_password;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_auth_login_password:[m
[31m-            rc = ngx_mail_auth_login_password(s, c);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_auth_plain:[m
[31m-            rc = ngx_mail_auth_plain(s, c, 0);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_auth_cram_md5:[m
[31m-            rc = ngx_mail_auth_cram_md5(s, c);[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_DONE:[m
[31m-        ngx_mail_auth(s, c);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_MAIL_PARSE_INVALID_COMMAND:[m
[31m-        s->mail_state = ngx_pop3_start;[m
[31m-        s->state = 0;[m
[31m-[m
[31m-        ngx_str_set(&s->out, pop3_invalid_command);[m
[31m-[m
[31m-        /* fall through */[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-[m
[31m-        s->args.nelts = 0;[m
[31m-        s->buffer->pos = s->buffer->start;[m
[31m-        s->buffer->last = s->buffer->start;[m
[31m-[m
[31m-        if (s->state) {[m
[31m-            s->arg_start = s->buffer->start;[m
[31m-        }[m
[31m-[m
[31m-        ngx_mail_send(c->write);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (s->args.nelts != 1) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-    s->login.len = arg[0].len;[m
[31m-    s->login.data = ngx_pnalloc(c->pool, s->login.len);[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->login.data, arg[0].data, s->login.len);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "pop3 login: \"%V\"", &s->login);[m
[31m-[m
[31m-    s->mail_state = ngx_pop3_user;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-    if (s->args.nelts != 1) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-    s->passwd.len = arg[0].len;[m
[31m-    s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);[m
[31m-    if (s->passwd.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->passwd.data, arg[0].data, s->passwd.len);[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "pop3 passwd: \"%V\"", &s->passwd);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c, ngx_int_t stls)[m
[31m-{[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-    pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    if (stls && c->ssl == NULL) {[m
[31m-        ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-        if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {[m
[31m-            s->out = pscf->starttls_capability;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {[m
[31m-            s->out = pscf->starttls_only_capability;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->out = pscf->capability;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (c->ssl == NULL) {[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-        if (sslcf->starttls) {[m
[31m-            c->read->handler = ngx_mail_starttls_handler;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t                 *arg;[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (s->args.nelts != 2) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);[m
[31m-[m
[31m-    if (!(pscf->auth_methods & NGX_MAIL_AUTH_APOP_ENABLED)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    s->login.len = arg[0].len;[m
[31m-    s->login.data = ngx_pnalloc(c->pool, s->login.len);[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->login.data, arg[0].data, s->login.len);[m
[31m-[m
[31m-    s->passwd.len = arg[1].len;[m
[31m-    s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);[m
[31m-    if (s->passwd.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "pop3 apop: \"%V\" \"%V\"", &s->login, &s->passwd);[m
[31m-[m
[31m-    s->auth_method = NGX_MAIL_AUTH_APOP;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        s->out = pscf->auth_capability;[m
[31m-        s->state = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_auth_parse(s, c);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, pop3_username);[m
[31m-        s->mail_state = ngx_pop3_auth_login_username;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN_USERNAME:[m
[31m-[m
[31m-        ngx_str_set(&s->out, pop3_password);[m
[31m-        s->mail_state = ngx_pop3_auth_login_password;[m
[31m-[m
[31m-        return ngx_mail_auth_login_username(s, c, 1);[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_PLAIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, pop3_next);[m
[31m-        s->mail_state = ngx_pop3_auth_plain;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_CRAM_MD5:[m
[31m-[m
[31m-        if (!(pscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) {[m
[31m-            s->mail_state = ngx_pop3_auth_cram_md5;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_module.c[m
[1mdeleted file mode 100644[m
[1mindex 73f8531..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,266 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_pop3_module.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_pop3_default_capabilities[] = {[m
[31m-    ngx_string("TOP"),[m
[31m-    ngx_string("USER"),[m
[31m-    ngx_string("UIDL"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_mail_pop3_auth_methods[] = {[m
[31m-    { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },[m
[31m-    { ngx_string("apop"), NGX_MAIL_AUTH_APOP_ENABLED },[m
[31m-    { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_pop3_auth_plain_capability =[m
[31m-    ngx_string("+OK methods supported:" CRLF[m
[31m-               "LOGIN" CRLF[m
[31m-               "PLAIN" CRLF[m
[31m-               "." CRLF);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_pop3_auth_cram_md5_capability =[m
[31m-    ngx_string("+OK methods supported:" CRLF[m
[31m-               "LOGIN" CRLF[m
[31m-               "PLAIN" CRLF[m
[31m-               "CRAM-MD5" CRLF[m
[31m-               "." CRLF);[m
[31m-[m
[31m-[m
[31m-static ngx_mail_protocol_t  ngx_mail_pop3_protocol = {[m
[31m-    ngx_string("pop3"),[m
[31m-    { 110, 995, 0, 0 },[m
[31m-    NGX_MAIL_POP3_PROTOCOL,[m
[31m-[m
[31m-    ngx_mail_pop3_init_session,[m
[31m-    ngx_mail_pop3_init_protocol,[m
[31m-    ngx_mail_pop3_parse_command,[m
[31m-    ngx_mail_pop3_auth_state,[m
[31m-[m
[31m-    ngx_string("-ERR internal server error" CRLF),[m
[31m-    ngx_string("-ERR SSL certificate error" CRLF),[m
[31m-    ngx_string("-ERR No required SSL certificate" CRLF)[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_pop3_commands[] = {[m
[31m-[m
[31m-    { ngx_string("pop3_capabilities"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_capabilities,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_pop3_srv_conf_t, capabilities),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("pop3_auth"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_pop3_srv_conf_t, auth_methods),[m
[31m-      &ngx_mail_pop3_auth_methods },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_pop3_module_ctx = {[m
[31m-    &ngx_mail_pop3_protocol,               /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_pop3_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_mail_pop3_merge_srv_conf           /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_pop3_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_pop3_module_ctx,             /* module context */[m
[31m-    ngx_mail_pop3_commands,                /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-    pscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_pop3_srv_conf_t));[m
[31m-    if (pscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&pscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return pscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_pop3_srv_conf_t *prev = parent;[m
[31m-    ngx_mail_pop3_srv_conf_t *conf = child;[m
[31m-[m
[31m-    u_char      *p;[m
[31m-    size_t       size, stls_only_size;[m
[31m-    ngx_str_t   *c, *d;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->auth_methods,[m
[31m-                                 prev->auth_methods,[m
[31m-                                 (NGX_CONF_BITMASK_SET[m
[31m-                                  |NGX_MAIL_AUTH_PLAIN_ENABLED));[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-        conf->capabilities = prev->capabilities;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-[m
[31m-        for (d = ngx_mail_pop3_default_capabilities; d->len; d++) {[m
[31m-            c = ngx_array_push(&conf->capabilities);[m
[31m-            if (c == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *c = *d;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof("+OK Capability list follows" CRLF) - 1[m
[31m-           + sizeof("." CRLF) - 1;[m
[31m-[m
[31m-    stls_only_size = size + sizeof("STLS" CRLF) - 1;[m
[31m-[m
[31m-    c = conf->capabilities.elts;[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        size += c[i].len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-        if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        stls_only_size += c[i].len + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {[m
[31m-        size += sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        size += sizeof("SASL LOGIN PLAIN" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->capability.len = size;[m
[31m-    conf->capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, "+OK Capability list follows" CRLF,[m
[31m-                   sizeof("+OK Capability list follows" CRLF) - 1);[m
[31m-[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        p = ngx_cpymem(p, c[i].data, c[i].len);[m
[31m-        *p++ = CR; *p++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {[m
[31m-        p = ngx_cpymem(p, "SASL LOGIN PLAIN CRAM-MD5" CRLF,[m
[31m-                       sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1);[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_cpymem(p, "SASL LOGIN PLAIN" CRLF,[m
[31m-                       sizeof("SASL LOGIN PLAIN" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '.'; *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    size += sizeof("STLS" CRLF) - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_capability.len = size;[m
[31m-    conf->starttls_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data,[m
[31m-                   conf->capability.len - (sizeof("." CRLF) - 1));[m
[31m-[m
[31m-    p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1);[m
[31m-    *p++ = '.'; *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {[m
[31m-        conf->auth_capability = ngx_mail_pop3_auth_cram_md5_capability;[m
[31m-[m
[31m-    } else {[m
[31m-        conf->auth_capability = ngx_mail_pop3_auth_plain_capability;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, stls_only_size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_only_capability.len = stls_only_size;[m
[31m-    conf->starttls_only_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, "+OK Capability list follows" CRLF,[m
[31m-                   sizeof("+OK Capability list follows" CRLF) - 1);[m
[31m-[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, c[i].data, c[i].len);[m
[31m-        *p++ = CR; *p++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1);[m
[31m-    *p++ = '.'; *p++ = CR; *p = LF;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_module.h[m
[1mdeleted file mode 100644[m
[1mindex 86947a7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_pop3_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_POP3_MODULE_H_INCLUDED_[m
[31m-#define _NGX_MAIL_POP3_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t    capability;[m
[31m-    ngx_str_t    starttls_capability;[m
[31m-    ngx_str_t    starttls_only_capability;[m
[31m-    ngx_str_t    auth_capability;[m
[31m-[m
[31m-    ngx_uint_t   auth_methods;[m
[31m-[m
[31m-    ngx_array_t  capabilities;[m
[31m-} ngx_mail_pop3_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-void ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_pop3_init_protocol(ngx_event_t *rev);[m
[31m-void ngx_mail_pop3_auth_state(ngx_event_t *rev);[m
[31m-ngx_int_t ngx_mail_pop3_parse_command(ngx_mail_session_t *s);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_mail_pop3_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_POP3_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_proxy_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_proxy_module.c[m
[1mdeleted file mode 100644[m
[1mindex 007284b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_proxy_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1123 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t  enable;[m
[31m-    ngx_flag_t  pass_error_message;[m
[31m-    ngx_flag_t  xclient;[m
[31m-    size_t      buffer_size;[m
[31m-    ngx_msec_t  timeout;[m
[31m-} ngx_mail_proxy_conf_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_mail_proxy_block_read(ngx_event_t *rev);[m
[31m-static void ngx_mail_proxy_pop3_handler(ngx_event_t *rev);[m
[31m-static void ngx_mail_proxy_imap_handler(ngx_event_t *rev);[m
[31m-static void ngx_mail_proxy_smtp_handler(ngx_event_t *rev);[m
[31m-static void ngx_mail_proxy_dummy_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_mail_proxy_read_response(ngx_mail_session_t *s,[m
[31m-    ngx_uint_t state);[m
[31m-static void ngx_mail_proxy_handler(ngx_event_t *ev);[m
[31m-static void ngx_mail_proxy_upstream_error(ngx_mail_session_t *s);[m
[31m-static void ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s);[m
[31m-static void ngx_mail_proxy_close_session(ngx_mail_session_t *s);[m
[31m-static void *ngx_mail_proxy_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_proxy_commands[] = {[m
[31m-[m
[31m-    { ngx_string("proxy"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffer"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_error_message"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, pass_error_message),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xclient"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, xclient),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_proxy_module_ctx = {[m
[31m-    NULL,                                  /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_proxy_create_conf,            /* create server configuration */[m
[31m-    ngx_mail_proxy_merge_conf              /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_proxy_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_proxy_module_ctx,            /* module context */[m
[31m-    ngx_mail_proxy_commands,               /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_char  smtp_auth_ok[] = "235 2.0.0 OK" CRLF;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_mail_proxy_ctx_t      *p;[m
[31m-    ngx_mail_proxy_conf_t     *pcf;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    s->connection->log->action = "connecting to upstream";[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    p = ngx_pcalloc(s->connection->pool, sizeof(ngx_mail_proxy_ctx_t));[m
[31m-    if (p == NULL) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->proxy = p;[m
[31m-[m
[31m-    p->upstream.sockaddr = peer->sockaddr;[m
[31m-    p->upstream.socklen = peer->socklen;[m
[31m-    p->upstream.name = &peer->name;[m
[31m-    p->upstream.get = ngx_event_get_peer;[m
[31m-    p->upstream.log = s->connection->log;[m
[31m-    p->upstream.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&p->upstream);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(p->upstream.connection->read, cscf->timeout);[m
[31m-[m
[31m-    p->upstream.connection->data = s;[m
[31m-    p->upstream.connection->pool = s->connection->pool;[m
[31m-[m
[31m-    s->connection->read->handler = ngx_mail_proxy_block_read;[m
[31m-    p->upstream.connection->write->handler = ngx_mail_proxy_dummy_handler;[m
[31m-[m
[31m-    pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-[m
[31m-    s->proxy->buffer = ngx_create_temp_buf(s->connection->pool,[m
[31m-                                           pcf->buffer_size);[m
[31m-    if (s->proxy->buffer == NULL) {[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->out.len = 0;[m
[31m-[m
[31m-    switch (s->protocol) {[m
[31m-[m
[31m-    case NGX_MAIL_POP3_PROTOCOL:[m
[31m-        p->upstream.connection->read->handler = ngx_mail_proxy_pop3_handler;[m
[31m-        s->mail_state = ngx_pop3_start;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_MAIL_IMAP_PROTOCOL:[m
[31m-        p->upstream.connection->read->handler = ngx_mail_proxy_imap_handler;[m
[31m-        s->mail_state = ngx_imap_start;[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_MAIL_SMTP_PROTOCOL */[m
[31m-        p->upstream.connection->read->handler = ngx_mail_proxy_smtp_handler;[m
[31m-        s->mail_state = ngx_smtp_start;[m
[31m-        break;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_block_read(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy block read");[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        c = rev->data;[m
[31m-        s = c->data;[m
[31m-[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_pop3_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_str_t               line;[m
[31m-    ngx_connection_t       *c;[m
[31m-    ngx_mail_session_t     *s;[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail proxy pop3 auth handler");[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_proxy_read_response(s, 0);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_mail_proxy_upstream_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    switch (s->mail_state) {[m
[31m-[m
[31m-    case ngx_pop3_start:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user");[m
[31m-[m
[31m-        s->connection->log->action = "sending user name to upstream";[m
[31m-[m
[31m-        line.len = sizeof("USER ")  - 1 + s->login.len + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, "USER ", sizeof("USER ") - 1);[m
[31m-        p = ngx_cpymem(p, s->login.data, s->login.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_pop3_user;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_pop3_user:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send pass");[m
[31m-[m
[31m-        s->connection->log->action = "sending password to upstream";[m
[31m-[m
[31m-        line.len = sizeof("PASS ")  - 1 + s->passwd.len + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, "PASS ", sizeof("PASS ") - 1);[m
[31m-        p = ngx_cpymem(p, s->passwd.data, s->passwd.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_pop3_passwd;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_pop3_passwd:[m
[31m-        s->connection->read->handler = ngx_mail_proxy_handler;[m
[31m-        s->connection->write->handler = ngx_mail_proxy_handler;[m
[31m-        rev->handler = ngx_mail_proxy_handler;[m
[31m-        c->write->handler = ngx_mail_proxy_handler;[m
[31m-[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-        ngx_add_timer(s->connection->read, pcf->timeout);[m
[31m-        ngx_del_timer(c->read);[m
[31m-[m
[31m-        c->log->action = NULL;[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");[m
[31m-[m
[31m-        ngx_mail_proxy_handler(s->connection->write);[m
[31m-[m
[31m-        return;[m
[31m-[m
[31m-    default:[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        ngx_str_null(&line);[m
[31m-#endif[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (c->send(c, line.data, line.len) < (ssize_t) line.len) {[m
[31m-        /*[m
[31m-         * we treat the incomplete sending as NGX_ERROR[m
[31m-         * because it is very strange here[m
[31m-         */[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->proxy->buffer->pos = s->proxy->buffer->start;[m
[31m-    s->proxy->buffer->last = s->proxy->buffer->start;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_imap_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_str_t               line;[m
[31m-    ngx_connection_t       *c;[m
[31m-    ngx_mail_session_t     *s;[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail proxy imap auth handler");[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_proxy_read_response(s, s->mail_state);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_mail_proxy_upstream_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    switch (s->mail_state) {[m
[31m-[m
[31m-    case ngx_imap_start:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send login");[m
[31m-[m
[31m-        s->connection->log->action = "sending LOGIN command to upstream";[m
[31m-[m
[31m-        line.len = s->tag.len + sizeof("LOGIN ") - 1[m
[31m-                   + 1 + NGX_SIZE_T_LEN + 1 + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        line.len = ngx_sprintf(line.data, "%VLOGIN {%uz}" CRLF,[m
[31m-                               &s->tag, s->login.len)[m
[31m-                   - line.data;[m
[31m-[m
[31m-        s->mail_state = ngx_imap_login;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_imap_login:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user");[m
[31m-[m
[31m-        s->connection->log->action = "sending user name to upstream";[m
[31m-[m
[31m-        line.len = s->login.len + 1 + 1 + NGX_SIZE_T_LEN + 1 + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        line.len = ngx_sprintf(line.data, "%V {%uz}" CRLF,[m
[31m-                               &s->login, s->passwd.len)[m
[31m-                   - line.data;[m
[31m-[m
[31m-        s->mail_state = ngx_imap_user;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_imap_user:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send passwd");[m
[31m-[m
[31m-        s->connection->log->action = "sending password to upstream";[m
[31m-[m
[31m-        line.len = s->passwd.len + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, s->passwd.data, s->passwd.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_imap_passwd;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_imap_passwd:[m
[31m-        s->connection->read->handler = ngx_mail_proxy_handler;[m
[31m-        s->connection->write->handler = ngx_mail_proxy_handler;[m
[31m-        rev->handler = ngx_mail_proxy_handler;[m
[31m-        c->write->handler = ngx_mail_proxy_handler;[m
[31m-[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-        ngx_add_timer(s->connection->read, pcf->timeout);[m
[31m-        ngx_del_timer(c->read);[m
[31m-[m
[31m-        c->log->action = NULL;[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");[m
[31m-[m
[31m-        ngx_mail_proxy_handler(s->connection->write);[m
[31m-[m
[31m-        return;[m
[31m-[m
[31m-    default:[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        ngx_str_null(&line);[m
[31m-#endif[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (c->send(c, line.data, line.len) < (ssize_t) line.len) {[m
[31m-        /*[m
[31m-         * we treat the incomplete sending as NGX_ERROR[m
[31m-         * because it is very strange here[m
[31m-         */[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->proxy->buffer->pos = s->proxy->buffer->start;[m
[31m-    s->proxy->buffer->last = s->proxy->buffer->start;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_smtp_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_str_t                  line;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_proxy_conf_t     *pcf;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail proxy smtp auth handler");[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_proxy_read_response(s, s->mail_state);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_mail_proxy_upstream_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    switch (s->mail_state) {[m
[31m-[m
[31m-    case ngx_smtp_start:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send ehlo");[m
[31m-[m
[31m-        s->connection->log->action = "sending HELO/EHLO to upstream";[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        line.len = sizeof("HELO ")  - 1 + cscf->server_name.len + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-[m
[31m-        p = ngx_cpymem(line.data,[m
[31m-                       ((s->esmtp || pcf->xclient) ? "EHLO " : "HELO "),[m
[31m-                       sizeof("HELO ") - 1);[m
[31m-[m
[31m-        p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        if (pcf->xclient) {[m
[31m-            s->mail_state = ngx_smtp_helo_xclient;[m
[31m-[m
[31m-        } else if (s->auth_method == NGX_MAIL_AUTH_NONE) {[m
[31m-            s->mail_state = ngx_smtp_helo_from;[m
[31m-[m
[31m-        } else {[m
[31m-            s->mail_state = ngx_smtp_helo;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_helo_xclient:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send xclient");[m
[31m-[m
[31m-        s->connection->log->action = "sending XCLIENT to upstream";[m
[31m-[m
[31m-        line.len = sizeof("XCLIENT ADDR= LOGIN= NAME="[m
[31m-                          CRLF) - 1[m
[31m-                   + s->connection->addr_text.len + s->login.len + s->host.len;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (s->connection->sockaddr->sa_family == AF_INET6) {[m
[31m-            line.len += sizeof("IPV6:") - 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, "XCLIENT ADDR=", sizeof("XCLIENT ADDR=") - 1);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (s->connection->sockaddr->sa_family == AF_INET6) {[m
[31m-            p = ngx_cpymem(p, "IPV6:", sizeof("IPV6:") - 1);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        p = ngx_copy(p, s->connection->addr_text.data,[m
[31m-                     s->connection->addr_text.len);[m
[31m-[m
[31m-        if (s->login.len) {[m
[31m-            p = ngx_cpymem(p, " LOGIN=", sizeof(" LOGIN=") - 1);[m
[31m-            p = ngx_copy(p, s->login.data, s->login.len);[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, " NAME=", sizeof(" NAME=") - 1);[m
[31m-        p = ngx_copy(p, s->host.data, s->host.len);[m
[31m-[m
[31m-        *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-        line.len = p - line.data;[m
[31m-[m
[31m-        if (s->smtp_helo.len) {[m
[31m-            s->mail_state = ngx_smtp_xclient_helo;[m
[31m-[m
[31m-        } else if (s->auth_method == NGX_MAIL_AUTH_NONE) {[m
[31m-            s->mail_state = ngx_smtp_xclient_from;[m
[31m-[m
[31m-        } else {[m
[31m-            s->mail_state = ngx_smtp_xclient;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_xclient_helo:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send client ehlo");[m
[31m-[m
[31m-        s->connection->log->action = "sending client HELO/EHLO to upstream";[m
[31m-[m
[31m-        line.len = sizeof("HELO " CRLF) - 1 + s->smtp_helo.len;[m
[31m-[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        line.len = ngx_sprintf(line.data,[m
[31m-                       ((s->esmtp) ? "EHLO %V" CRLF : "HELO %V" CRLF),[m
[31m-                       &s->smtp_helo)[m
[31m-                   - line.data;[m
[31m-[m
[31m-        s->mail_state = (s->auth_method == NGX_MAIL_AUTH_NONE) ?[m
[31m-                            ngx_smtp_helo_from : ngx_smtp_helo;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_helo_from:[m
[31m-    case ngx_smtp_xclient_from:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send mail from");[m
[31m-[m
[31m-        s->connection->log->action = "sending MAIL FROM to upstream";[m
[31m-[m
[31m-        line.len = s->smtp_from.len + sizeof(CRLF) - 1;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, s->smtp_from.data, s->smtp_from.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_smtp_from;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_from:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send rcpt to");[m
[31m-[m
[31m-        s->connection->log->action = "sending RCPT TO to upstream";[m
[31m-[m
[31m-        line.len = s->smtp_to.len + sizeof(CRLF) - 1;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, s->smtp_to.data, s->smtp_to.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_smtp_to;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_helo:[m
[31m-    case ngx_smtp_xclient:[m
[31m-    case ngx_smtp_to:[m
[31m-[m
[31m-        b = s->proxy->buffer;[m
[31m-[m
[31m-        if (s->auth_method == NGX_MAIL_AUTH_NONE) {[m
[31m-            b->pos = b->start;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_memcpy(b->start, smtp_auth_ok, sizeof(smtp_auth_ok) - 1);[m
[31m-            b->last = b->start + sizeof(smtp_auth_ok) - 1;[m
[31m-        }[m
[31m-[m
[31m-        s->connection->read->handler = ngx_mail_proxy_handler;[m
[31m-        s->connection->write->handler = ngx_mail_proxy_handler;[m
[31m-        rev->handler = ngx_mail_proxy_handler;[m
[31m-        c->write->handler = ngx_mail_proxy_handler;[m
[31m-[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-        ngx_add_timer(s->connection->read, pcf->timeout);[m
[31m-        ngx_del_timer(c->read);[m
[31m-[m
[31m-        c->log->action = NULL;[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");[m
[31m-[m
[31m-        if (s->buffer->pos == s->buffer->last) {[m
[31m-            ngx_mail_proxy_handler(s->connection->write);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_mail_proxy_handler(c->write);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-[m
[31m-    default:[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        ngx_str_null(&line);[m
[31m-#endif[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (c->send(c, line.data, line.len) < (ssize_t) line.len) {[m
[31m-        /*[m
[31m-         * we treat the incomplete sending as NGX_ERROR[m
[31m-         * because it is very strange here[m
[31m-         */[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->proxy->buffer->pos = s->proxy->buffer->start;[m
[31m-    s->proxy->buffer->last = s->proxy->buffer->start;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_dummy_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0, "mail proxy dummy handler");[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-        c = wev->data;[m
[31m-        s = c->data;[m
[31m-[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_proxy_read_response(ngx_mail_session_t *s, ngx_uint_t state)[m
[31m-{[m
[31m-    u_char                 *p, *m;[m
[31m-    ssize_t                 n;[m
[31m-    ngx_buf_t              *b;[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    s->connection->log->action = "reading response from upstream";[m
[31m-[m
[31m-    b = s->proxy->buffer;[m
[31m-[m
[31m-    n = s->proxy->upstream.connection->recv(s->proxy->upstream.connection,[m
[31m-                                            b->last, b->end - b->last);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    if (b->last - b->pos < 4) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (*(b->last - 2) != CR || *(b->last - 1) != LF) {[m
[31m-        if (b->last == b->end) {[m
[31m-            *(b->last - 1) = '\0';[m
[31m-            ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                          "upstream sent too long response line: \"%s\"",[m
[31m-                          b->pos);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    p = b->pos;[m
[31m-[m
[31m-    switch (s->protocol) {[m
[31m-[m
[31m-    case NGX_MAIL_POP3_PROTOCOL:[m
[31m-        if (p[0] == '+' && p[1] == 'O' && p[2] == 'K') {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_MAIL_IMAP_PROTOCOL:[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case ngx_imap_start:[m
[31m-            if (p[0] == '*' && p[1] == ' ' && p[2] == 'O' && p[3] == 'K') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_login:[m
[31m-        case ngx_imap_user:[m
[31m-            if (p[0] == '+') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_passwd:[m
[31m-            if (ngx_strncmp(p, s->tag.data, s->tag.len) == 0) {[m
[31m-                p += s->tag.len;[m
[31m-                if (p[0] == 'O' && p[1] == 'K') {[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_MAIL_SMTP_PROTOCOL */[m
[31m-[m
[31m-        if (p[3] == '-') {[m
[31m-            /* multiline reply, check if we got last line */[m
[31m-[m
[31m-            m = b->last - (sizeof(CRLF "200" CRLF) - 1);[m
[31m-[m
[31m-            while (m > p) {[m
[31m-                if (m[0] == CR && m[1] == LF) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                m--;[m
[31m-            }[m
[31m-[m
[31m-            if (m <= p || m[5] == '-') {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case ngx_smtp_start:[m
[31m-            if (p[0] == '2' && p[1] == '2' && p[2] == '0') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_helo:[m
[31m-        case ngx_smtp_helo_xclient:[m
[31m-        case ngx_smtp_helo_from:[m
[31m-        case ngx_smtp_from:[m
[31m-            if (p[0] == '2' && p[1] == '5' && p[2] == '0') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_xclient:[m
[31m-        case ngx_smtp_xclient_from:[m
[31m-        case ngx_smtp_xclient_helo:[m
[31m-            if (p[0] == '2' && (p[1] == '2' || p[1] == '5') && p[2] == '0') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_to:[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-[m
[31m-    if (pcf->pass_error_message == 0) {[m
[31m-        *(b->last - 2) = '\0';[m
[31m-        ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                      "upstream sent invalid response: \"%s\"", p);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->out.len = b->last - p - 2;[m
[31m-    s->out.data = p;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, s->connection->log, 0,[m
[31m-                  "upstream sent invalid response: \"%V\"", &s->out);[m
[31m-[m
[31m-    s->out.len = b->last - b->pos;[m
[31m-    s->out.data = b->pos;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    char                   *action, *recv_action, *send_action;[m
[31m-    size_t                  size;[m
[31m-    ssize_t                 n;[m
[31m-    ngx_buf_t              *b;[m
[31m-    ngx_uint_t              do_write;[m
[31m-    ngx_connection_t       *c, *src, *dst;[m
[31m-    ngx_mail_session_t     *s;[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->log->action = "proxying";[m
[31m-[m
[31m-        if (c == s->connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "client timed out");[m
[31m-            c->timedout = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "upstream timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c == s->connection) {[m
[31m-        if (ev->write) {[m
[31m-            recv_action = "proxying and reading from upstream";[m
[31m-            send_action = "proxying and sending to client";[m
[31m-            src = s->proxy->upstream.connection;[m
[31m-            dst = c;[m
[31m-            b = s->proxy->buffer;[m
[31m-[m
[31m-        } else {[m
[31m-            recv_action = "proxying and reading from client";[m
[31m-            send_action = "proxying and sending to upstream";[m
[31m-            src = c;[m
[31m-            dst = s->proxy->upstream.connection;[m
[31m-            b = s->buffer;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ev->write) {[m
[31m-            recv_action = "proxying and reading from client";[m
[31m-            send_action = "proxying and sending to upstream";[m
[31m-            src = s->connection;[m
[31m-            dst = c;[m
[31m-            b = s->buffer;[m
[31m-[m
[31m-        } else {[m
[31m-            recv_action = "proxying and reading from upstream";[m
[31m-            send_action = "proxying and sending to client";[m
[31m-            src = c;[m
[31m-            dst = s->connection;[m
[31m-            b = s->proxy->buffer;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    do_write = ev->write ? 1 : 0;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_MAIL, ev->log, 0,[m
[31m-                   "mail proxy handler: %ui, #%d > #%d",[m
[31m-                   do_write, src->fd, dst->fd);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            size = b->last - b->pos;[m
[31m-[m
[31m-            if (size && dst->write->ready) {[m
[31m-                c->log->action = send_action;[m
[31m-[m
[31m-                n = dst->send(dst, b->pos, size);[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    ngx_mail_proxy_close_session(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (n > 0) {[m
[31m-                    b->pos += n;[m
[31m-[m
[31m-                    if (b->pos == b->last) {[m
[31m-                        b->pos = b->start;[m
[31m-                        b->last = b->start;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && src->read->ready) {[m
[31m-            c->log->action = recv_action;[m
[31m-[m
[31m-            n = src->recv(src, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                do_write = 1;[m
[31m-                b->last += n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                src->read->eof = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "proxying";[m
[31m-[m
[31m-    if ((s->connection->read->eof && s->buffer->pos == s->buffer->last)[m
[31m-        || (s->proxy->upstream.connection->read->eof[m
[31m-            && s->proxy->buffer->pos == s->proxy->buffer->last)[m
[31m-        || (s->connection->read->eof[m
[31m-            && s->proxy->upstream.connection->read->eof))[m
[31m-    {[m
[31m-        action = c->log->action;[m
[31m-        c->log->action = NULL;[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "proxied session done");[m
[31m-        c->log->action = action;[m
[31m-[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(dst->write, 0) != NGX_OK) {[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(dst->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(src->write, 0) != NGX_OK) {[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(src->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c == s->connection) {[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-        ngx_add_timer(c->read, pcf->timeout);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_upstream_error(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    if (s->proxy->upstream.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                       "close mail proxy connection: %d",[m
[31m-                       s->proxy->upstream.connection->fd);[m
[31m-[m
[31m-        ngx_close_connection(s->proxy->upstream.connection);[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len == 0) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->quit = 1;[m
[31m-    ngx_mail_send(s->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    if (s->proxy->upstream.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                       "close mail proxy connection: %d",[m
[31m-                       s->proxy->upstream.connection->fd);[m
[31m-[m
[31m-        ngx_close_connection(s->proxy->upstream.connection);[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_session_internal_server_error(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_close_session(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    if (s->proxy->upstream.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                       "close mail proxy connection: %d",[m
[31m-                       s->proxy->upstream.connection->fd);[m
[31m-[m
[31m-        ngx_close_connection(s->proxy->upstream.connection);[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_close_connection(s->connection);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_proxy_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    pcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_proxy_conf_t));[m
[31m-    if (pcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    pcf->enable = NGX_CONF_UNSET;[m
[31m-    pcf->pass_error_message = NGX_CONF_UNSET;[m
[31m-    pcf->xclient = NGX_CONF_UNSET;[m
[31m-    pcf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    pcf->timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    return pcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_proxy_conf_t *prev = parent;[m
[31m-    ngx_mail_proxy_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_value(conf->pass_error_message, prev->pass_error_message, 0);[m
[31m-    ngx_conf_merge_value(conf->xclient, prev->xclient, 1);[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 24 * 60 * 60000);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 81cc75f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,857 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_smtp_module.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static void ngx_mail_smtp_resolve_name(ngx_event_t *rev);[m
[31m-static void ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static void ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static void ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev);[m
[31m-static ngx_int_t ngx_mail_smtp_create_buffer(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-[m
[31m-static ngx_int_t ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_starttls(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-[m
[31m-static ngx_int_t ngx_mail_smtp_discard_command(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c, char *err);[m
[31m-static void ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c, char *err);[m
[31m-[m
[31m-[m
[31m-static u_char  smtp_ok[] = "250 2.0.0 OK" CRLF;[m
[31m-static u_char  smtp_bye[] = "221 2.0.0 Bye" CRLF;[m
[31m-static u_char  smtp_starttls[] = "220 2.0.0 Start TLS" CRLF;[m
[31m-static u_char  smtp_next[] = "334 " CRLF;[m
[31m-static u_char  smtp_username[] = "334 VXNlcm5hbWU6" CRLF;[m
[31m-static u_char  smtp_password[] = "334 UGFzc3dvcmQ6" CRLF;[m
[31m-static u_char  smtp_invalid_command[] = "500 5.5.1 Invalid command" CRLF;[m
[31m-static u_char  smtp_invalid_pipelining[] =[m
[31m-    "503 5.5.0 Improper use of SMTP command pipelining" CRLF;[m
[31m-static u_char  smtp_invalid_argument[] = "501 5.5.4 Invalid argument" CRLF;[m
[31m-static u_char  smtp_auth_required[] = "530 5.7.1 Authentication required" CRLF;[m
[31m-static u_char  smtp_bad_sequence[] = "503 5.5.1 Bad sequence of commands" CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  smtp_unavailable = ngx_string("[UNAVAILABLE]");[m
[31m-static ngx_str_t  smtp_tempunavail = ngx_string("[TEMPUNAVAIL]");[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t        *ctx;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    if (cscf->resolver == NULL) {[m
[31m-        s->host = smtp_unavailable;[m
[31m-        ngx_mail_smtp_greeting(s, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    if (c->sockaddr->sa_family == AF_UNIX) {[m
[31m-        s->host = smtp_tempunavail;[m
[31m-        ngx_mail_smtp_greeting(s, c);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    c->log->action = "in resolving client address";[m
[31m-[m
[31m-    ctx = ngx_resolve_start(cscf->resolver, NULL);[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->addr.sockaddr = c->sockaddr;[m
[31m-    ctx->addr.socklen = c->socklen;[m
[31m-    ctx->handler = ngx_mail_smtp_resolve_addr_handler;[m
[31m-    ctx->data = s;[m
[31m-    ctx->timeout = cscf->resolver_timeout;[m
[31m-[m
[31m-    if (ngx_resolve_addr(ctx) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    s = ctx->data;[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "%V could not be resolved (%i: %s)",[m
[31m-                      &c->addr_text, ctx->state,[m
[31m-                      ngx_resolver_strerror(ctx->state));[m
[31m-[m
[31m-        if (ctx->state == NGX_RESOLVE_NXDOMAIN) {[m
[31m-            s->host = smtp_unavailable;[m
[31m-[m
[31m-        } else {[m
[31m-            s->host = smtp_tempunavail;[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolve_addr_done(ctx);[m
[31m-[m
[31m-        ngx_mail_smtp_greeting(s, s->connection);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "in resolving client hostname";[m
[31m-[m
[31m-    s->host.data = ngx_pstrdup(c->pool, &ctx->name);[m
[31m-    if (s->host.data == NULL) {[m
[31m-        ngx_resolve_addr_done(ctx);[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->host.len = ctx->name.len;[m
[31m-[m
[31m-    ngx_resolve_addr_done(ctx);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "address resolved: %V", &s->host);[m
[31m-[m
[31m-    c->read->handler = ngx_mail_smtp_resolve_name;[m
[31m-[m
[31m-    ngx_post_event(c->read, &ngx_posted_events);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_resolve_name(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_resolver_ctx_t        *ctx;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    ctx = ngx_resolve_start(cscf->resolver, NULL);[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->name = s->host;[m
[31m-    ctx->handler = ngx_mail_smtp_resolve_name_handler;[m
[31m-    ctx->data = s;[m
[31m-    ctx->timeout = cscf->resolver_timeout;[m
[31m-[m
[31m-    if (ngx_resolve_name(ctx) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    s = ctx->data;[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "\"%V\" could not be resolved (%i: %s)",[m
[31m-                      &ctx->name, ctx->state,[m
[31m-                      ngx_resolver_strerror(ctx->state));[m
[31m-[m
[31m-        if (ctx->state == NGX_RESOLVE_NXDOMAIN) {[m
[31m-            s->host = smtp_unavailable;[m
[31m-[m
[31m-        } else {[m
[31m-            s->host = smtp_tempunavail;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-        ngx_str_t  addr;[m
[31m-[m
[31m-        addr.data = text;[m
[31m-[m
[31m-        for (i = 0; i < ctx->naddrs; i++) {[m
[31m-            addr.len = ngx_sock_ntop(ctx->addrs[i].sockaddr,[m
[31m-                                     ctx->addrs[i].socklen,[m
[31m-                                     text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                           "name was resolved to %V", &addr);[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        for (i = 0; i < ctx->naddrs; i++) {[m
[31m-            if (ngx_cmp_sockaddr(ctx->addrs[i].sockaddr, ctx->addrs[i].socklen,[m
[31m-                                 c->sockaddr, c->socklen, 0)[m
[31m-                == NGX_OK)[m
[31m-            {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        s->host = smtp_unavailable;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-[m
[31m-    ngx_mail_smtp_greeting(s, c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_msec_t                 timeout;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "smtp greeting for \"%V\"", &s->host);[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-    sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-    timeout = sscf->greeting_delay ? sscf->greeting_delay : cscf->timeout;[m
[31m-    ngx_add_timer(c->read, timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-[m
[31m-    if (sscf->greeting_delay) {[m
[31m-         c->read->handler = ngx_mail_smtp_invalid_pipelining;[m
[31m-         return;[m
[31m-    }[m
[31m-[m
[31m-    c->read->handler = ngx_mail_smtp_init_protocol;[m
[31m-[m
[31m-    s->out = sscf->greeting;[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    c->log->action = "in delay pipelining state";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "delay greeting");[m
[31m-[m
[31m-        rev->timedout = 0;[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        c->read->handler = ngx_mail_smtp_init_protocol;[m
[31m-[m
[31m-        ngx_add_timer(c->read, cscf->timeout);[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-        s->out = sscf->greeting;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "invalid pipelining");[m
[31m-[m
[31m-        if (s->buffer == NULL) {[m
[31m-            if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_mail_smtp_discard_command(s, c,[m
[31m-                                "client was rejected before greeting: \"%V\"")[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_str_set(&s->out, smtp_invalid_pipelining);[m
[31m-        s->quit = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_smtp_init_protocol(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->log->action = "in auth state";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (s->buffer == NULL) {[m
[31m-        if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->mail_state = ngx_smtp_start;[m
[31m-    c->read->handler = ngx_mail_smtp_auth_state;[m
[31m-[m
[31m-    ngx_mail_smtp_auth_state(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) == NGX_ERROR) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-    s->buffer = ngx_create_temp_buf(c->pool, sscf->client_buffer_size);[m
[31m-    if (s->buffer == NULL) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_smtp_auth_state(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp auth state");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp send handler busy");[m
[31m-        s->blocked = 1;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->blocked = 0;[m
[31m-[m
[31m-    rc = ngx_mail_read_command(s, c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&s->out, smtp_ok);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        switch (s->mail_state) {[m
[31m-[m
[31m-        case ngx_smtp_start:[m
[31m-[m
[31m-            switch (s->command) {[m
[31m-[m
[31m-            case NGX_SMTP_HELO:[m
[31m-            case NGX_SMTP_EHLO:[m
[31m-                rc = ngx_mail_smtp_helo(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_AUTH:[m
[31m-                rc = ngx_mail_smtp_auth(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_QUIT:[m
[31m-                s->quit = 1;[m
[31m-                ngx_str_set(&s->out, smtp_bye);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_MAIL:[m
[31m-                rc = ngx_mail_smtp_mail(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_RCPT:[m
[31m-                rc = ngx_mail_smtp_rcpt(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_RSET:[m
[31m-                rc = ngx_mail_smtp_rset(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_NOOP:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_STARTTLS:[m
[31m-                rc = ngx_mail_smtp_starttls(s, c);[m
[31m-                ngx_str_set(&s->out, smtp_starttls);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                rc = NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_auth_login_username:[m
[31m-            rc = ngx_mail_auth_login_username(s, c, 0);[m
[31m-[m
[31m-            ngx_str_set(&s->out, smtp_password);[m
[31m-            s->mail_state = ngx_smtp_auth_login_password;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_auth_login_password:[m
[31m-            rc = ngx_mail_auth_login_password(s, c);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_auth_plain:[m
[31m-            rc = ngx_mail_auth_plain(s, c, 0);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_auth_cram_md5:[m
[31m-            rc = ngx_mail_auth_cram_md5(s, c);[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (s->buffer->pos < s->buffer->last) {[m
[31m-        s->blocked = 1;[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_DONE:[m
[31m-        ngx_mail_auth(s, c);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_MAIL_PARSE_INVALID_COMMAND:[m
[31m-        s->mail_state = ngx_smtp_start;[m
[31m-        s->state = 0;[m
[31m-        ngx_str_set(&s->out, smtp_invalid_command);[m
[31m-[m
[31m-        /* fall through */[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-        s->args.nelts = 0;[m
[31m-[m
[31m-        if (s->buffer->pos == s->buffer->last) {[m
[31m-            s->buffer->pos = s->buffer->start;[m
[31m-            s->buffer->last = s->buffer->start;[m
[31m-        }[m
[31m-[m
[31m-        if (s->state) {[m
[31m-            s->arg_start = s->buffer->pos;[m
[31m-        }[m
[31m-[m
[31m-        ngx_mail_send(c->write);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t                 *arg;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    if (s->args.nelts != 1) {[m
[31m-        ngx_str_set(&s->out, smtp_invalid_argument);[m
[31m-        s->state = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    s->smtp_helo.len = arg[0].len;[m
[31m-[m
[31m-    s->smtp_helo.data = ngx_pnalloc(c->pool, arg[0].len);[m
[31m-    if (s->smtp_helo.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->smtp_helo.data, arg[0].data, arg[0].len);[m
[31m-[m
[31m-    ngx_str_null(&s->smtp_from);[m
[31m-    ngx_str_null(&s->smtp_to);[m
[31m-[m
[31m-    sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-    if (s->command == NGX_SMTP_HELO) {[m
[31m-        s->out = sscf->server_name;[m
[31m-[m
[31m-    } else {[m
[31m-        s->esmtp = 1;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-        if (c->ssl == NULL) {[m
[31m-            ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-            sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-            if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {[m
[31m-                s->out = sscf->starttls_capability;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {[m
[31m-                s->out = sscf->starttls_only_capability;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        s->out = sscf->capability;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        ngx_str_set(&s->out, smtp_invalid_argument);[m
[31m-        s->state = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_auth_parse(s, c);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, smtp_username);[m
[31m-        s->mail_state = ngx_smtp_auth_login_username;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN_USERNAME:[m
[31m-[m
[31m-        ngx_str_set(&s->out, smtp_password);[m
[31m-        s->mail_state = ngx_smtp_auth_login_password;[m
[31m-[m
[31m-        return ngx_mail_auth_login_username(s, c, 1);[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_PLAIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, smtp_next);[m
[31m-        s->mail_state = ngx_smtp_auth_plain;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_CRAM_MD5:[m
[31m-[m
[31m-        sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-        if (!(sscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (s->salt.data == NULL) {[m
[31m-            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-            if (ngx_mail_salt(s, c, cscf) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_mail_auth_cram_md5_salt(s, c, "334 ", 4) == NGX_OK) {[m
[31m-            s->mail_state = ngx_smtp_auth_cram_md5;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t                 *arg, cmd;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-    if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) {[m
[31m-        ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\"");[m
[31m-        ngx_str_set(&s->out, smtp_auth_required);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* auth none */[m
[31m-[m
[31m-    if (s->smtp_from.len) {[m
[31m-        ngx_str_set(&s->out, smtp_bad_sequence);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        ngx_str_set(&s->out, smtp_invalid_argument);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-    arg += s->args.nelts - 1;[m
[31m-[m
[31m-    cmd.len = arg->data + arg->len - s->cmd.data;[m
[31m-    cmd.data = s->cmd.data;[m
[31m-[m
[31m-    s->smtp_from.len = cmd.len;[m
[31m-[m
[31m-    s->smtp_from.data = ngx_pnalloc(c->pool, cmd.len);[m
[31m-    if (s->smtp_from.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->smtp_from.data, cmd.data, cmd.len);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "smtp mail from:\"%V\"", &s->smtp_from);[m
[31m-[m
[31m-    ngx_str_set(&s->out, smtp_ok);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg, cmd;[m
[31m-[m
[31m-    if (s->smtp_from.len == 0) {[m
[31m-        ngx_str_set(&s->out, smtp_bad_sequence);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        ngx_str_set(&s->out, smtp_invalid_argument);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-    arg += s->args.nelts - 1;[m
[31m-[m
[31m-    cmd.len = arg->data + arg->len - s->cmd.data;[m
[31m-    cmd.data = s->cmd.data;[m
[31m-[m
[31m-    s->smtp_to.len = cmd.len;[m
[31m-[m
[31m-    s->smtp_to.data = ngx_pnalloc(c->pool, cmd.len);[m
[31m-    if (s->smtp_to.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->smtp_to.data, cmd.data, cmd.len);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "smtp rcpt to:\"%V\"", &s->smtp_to);[m
[31m-[m
[31m-    s->auth_method = NGX_MAIL_AUTH_NONE;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_null(&s->smtp_from);[m
[31m-    ngx_str_null(&s->smtp_to);[m
[31m-    ngx_str_set(&s->out, smtp_ok);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_starttls(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (c->ssl == NULL) {[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-        if (sslcf->starttls) {[m
[31m-[m
[31m-            /*[m
[31m-             * RFC3207 requires us to discard any knowledge[m
[31m-             * obtained from client before STARTTLS.[m
[31m-             */[m
[31m-[m
[31m-            ngx_str_null(&s->smtp_helo);[m
[31m-            ngx_str_null(&s->smtp_from);[m
[31m-            ngx_str_null(&s->smtp_to);[m
[31m-[m
[31m-            s->buffer->pos = s->buffer->start;[m
[31m-            s->buffer->last = s->buffer->start;[m
[31m-[m
[31m-            c->read->handler = ngx_mail_starttls_handler;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_discard_command(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    char *err)[m
[31m-{[m
[31m-    ssize_t    n;[m
[31m-[m
[31m-    n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == 0) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        s->buffer->last += n;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_smtp_log_rejected_command(s, c, err);[m
[31m-[m
[31m-    s->buffer->pos = s->buffer->start;[m
[31m-    s->buffer->last = s->buffer->start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    char *err)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    ngx_str_t   cmd;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    if (c->log->log_level < NGX_LOG_INFO) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cmd.len = s->buffer->last - s->buffer->start;[m
[31m-    cmd.data = s->buffer->start;[m
[31m-[m
[31m-    for (i = 0; i < cmd.len; i++) {[m
[31m-        ch = cmd.data[i];[m
[31m-[m
[31m-        if (ch != CR && ch != LF) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cmd.data[i] = '_';[m
[31m-    }[m
[31m-[m
[31m-    cmd.len = i;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, err, &cmd);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_module.c[m
[1mdeleted file mode 100644[m
[1mindex d5bb51c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,309 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_smtp_module.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_mail_smtp_auth_methods[] = {[m
[31m-    { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },[m
[31m-    { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },[m
[31m-    { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },[m
[31m-    { ngx_string("none"), NGX_MAIL_AUTH_NONE_ENABLED },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_smtp_auth_methods_names[] = {[m
[31m-    ngx_string("PLAIN"),[m
[31m-    ngx_string("LOGIN"),[m
[31m-    ngx_null_string,  /* APOP */[m
[31m-    ngx_string("CRAM-MD5"),[m
[31m-    ngx_null_string   /* NONE */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_protocol_t  ngx_mail_smtp_protocol = {[m
[31m-    ngx_string("smtp"),[m
[31m-    { 25, 465, 587, 0 },[m
[31m-    NGX_MAIL_SMTP_PROTOCOL,[m
[31m-[m
[31m-    ngx_mail_smtp_init_session,[m
[31m-    ngx_mail_smtp_init_protocol,[m
[31m-    ngx_mail_smtp_parse_command,[m
[31m-    ngx_mail_smtp_auth_state,[m
[31m-[m
[31m-    ngx_string("451 4.3.2 Internal server error" CRLF),[m
[31m-    ngx_string("421 4.7.1 SSL certificate error" CRLF),[m
[31m-    ngx_string("421 4.7.1 No required SSL certificate" CRLF)[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_smtp_commands[] = {[m
[31m-[m
[31m-    { ngx_string("smtp_client_buffer"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_smtp_srv_conf_t, client_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("smtp_greeting_delay"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_smtp_srv_conf_t, greeting_delay),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("smtp_capabilities"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_capabilities,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_smtp_srv_conf_t, capabilities),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("smtp_auth"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_smtp_srv_conf_t, auth_methods),[m
[31m-      &ngx_mail_smtp_auth_methods },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_smtp_module_ctx = {[m
[31m-    &ngx_mail_smtp_protocol,               /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_smtp_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_mail_smtp_merge_srv_conf           /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_smtp_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_smtp_module_ctx,             /* module context */[m
[31m-    ngx_mail_smtp_commands,                /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_smtp_srv_conf_t));[m
[31m-    if (sscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    sscf->client_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    sscf->greeting_delay = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    if (ngx_array_init(&sscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return sscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_smtp_srv_conf_t *prev = parent;[m
[31m-    ngx_mail_smtp_srv_conf_t *conf = child;[m
[31m-[m
[31m-    u_char                    *p, *auth, *last;[m
[31m-    size_t                     size;[m
[31m-    ngx_str_t                 *c;[m
[31m-    ngx_uint_t                 i, m, auth_enabled;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->client_buffer_size,[m
[31m-                              prev->client_buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->greeting_delay,[m
[31m-                              prev->greeting_delay, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->auth_methods,[m
[31m-                              prev->auth_methods,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_MAIL_AUTH_PLAIN_ENABLED[m
[31m-                               |NGX_MAIL_AUTH_LOGIN_ENABLED));[m
[31m-[m
[31m-[m
[31m-    cscf = ngx_mail_conf_get_module_srv_conf(cf, ngx_mail_core_module);[m
[31m-[m
[31m-    size = sizeof("220  ESMTP ready" CRLF) - 1 + cscf->server_name.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->greeting.len = size;[m
[31m-    conf->greeting.data = p;[m
[31m-[m
[31m-    *p++ = '2'; *p++ = '2'; *p++ = '0'; *p++ = ' ';[m
[31m-    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);[m
[31m-    ngx_memcpy(p, " ESMTP ready" CRLF, sizeof(" ESMTP ready" CRLF) - 1);[m
[31m-[m
[31m-[m
[31m-    size = sizeof("250 " CRLF) - 1 + cscf->server_name.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->server_name.len = size;[m
[31m-    conf->server_name.data = p;[m
[31m-[m
[31m-    *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' ';[m
[31m-    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);[m
[31m-    *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-        conf->capabilities = prev->capabilities;[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof("250-") - 1 + cscf->server_name.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    c = conf->capabilities.elts;[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        size += sizeof("250 ") - 1 + c[i].len + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    auth_enabled = 0;[m
[31m-[m
[31m-    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;[m
[31m-         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;[m
[31m-         m <<= 1, i++)[m
[31m-    {[m
[31m-        if (m & conf->auth_methods) {[m
[31m-            size += 1 + ngx_mail_smtp_auth_methods_names[i].len;[m
[31m-            auth_enabled = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (auth_enabled) {[m
[31m-        size += sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->capability.len = size;[m
[31m-    conf->capability.data = p;[m
[31m-[m
[31m-    last = p;[m
[31m-[m
[31m-    *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-';[m
[31m-    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);[m
[31m-    *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        last = p;[m
[31m-        *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-';[m
[31m-        p = ngx_cpymem(p, c[i].data, c[i].len);[m
[31m-        *p++ = CR; *p++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    auth = p;[m
[31m-[m
[31m-    if (auth_enabled) {[m
[31m-        last = p;[m
[31m-[m
[31m-        *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' ';[m
[31m-        *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H';[m
[31m-[m
[31m-        for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;[m
[31m-             m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;[m
[31m-             m <<= 1, i++)[m
[31m-        {[m
[31m-            if (m & conf->auth_methods) {[m
[31m-                *p++ = ' ';[m
[31m-                p = ngx_cpymem(p, ngx_mail_smtp_auth_methods_names[i].data,[m
[31m-                               ngx_mail_smtp_auth_methods_names[i].len);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-    } else {[m
[31m-        last[3] = ' ';[m
[31m-    }[m
[31m-[m
[31m-    size += sizeof("250 STARTTLS" CRLF) - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_capability.len = size;[m
[31m-    conf->starttls_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data, conf->capability.len);[m
[31m-[m
[31m-    p = ngx_cpymem(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);[m
[31m-[m
[31m-    p = conf->starttls_capability.data[m
[31m-        + (last - conf->capability.data) + 3;[m
[31m-    *p = '-';[m
[31m-[m
[31m-    size = (auth - conf->capability.data)[m
[31m-            + sizeof("250 STARTTLS" CRLF) - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_only_capability.len = size;[m
[31m-    conf->starttls_only_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data, auth - conf->capability.data);[m
[31m-[m
[31m-    ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);[m
[31m-[m
[31m-    if (last < auth) {[m
[31m-        p = conf->starttls_only_capability.data[m
[31m-            + (last - conf->capability.data) + 3;[m
[31m-        *p = '-';[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_module.h[m
[1mdeleted file mode 100644[m
[1mindex 04ffab6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_smtp_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_SMTP_MODULE_H_INCLUDED_[m
[31m-#define _NGX_MAIL_SMTP_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_smtp_module.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_msec_t   greeting_delay;[m
[31m-[m
[31m-    size_t       client_buffer_size;[m
[31m-[m
[31m-    ngx_str_t    capability;[m
[31m-    ngx_str_t    starttls_capability;[m
[31m-    ngx_str_t    starttls_only_capability;[m
[31m-[m
[31m-    ngx_str_t    server_name;[m
[31m-    ngx_str_t    greeting;[m
[31m-[m
[31m-    ngx_uint_t   auth_methods;[m
[31m-[m
[31m-    ngx_array_t  capabilities;[m
[31m-} ngx_mail_smtp_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-void ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_smtp_init_protocol(ngx_event_t *rev);[m
[31m-void ngx_mail_smtp_auth_state(ngx_event_t *rev);[m
[31m-ngx_int_t ngx_mail_smtp_parse_command(ngx_mail_session_t *s);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_mail_smtp_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_ssl_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_ssl_module.c[m
[1mdeleted file mode 100644[m
[1mindex ff5c141..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_ssl_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,657 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_DEFAULT_CIPHERS     "HIGH:!aNULL:!MD5"[m
[31m-#define NGX_DEFAULT_ECDH_CURVE  "prime256v1"[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_ssl_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_mail_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_ssl_starttls(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_mail_starttls_state[] = {[m
[31m-    { ngx_string("off"), NGX_MAIL_STARTTLS_OFF },[m
[31m-    { ngx_string("on"), NGX_MAIL_STARTTLS_ON },[m
[31m-    { ngx_string("only"), NGX_MAIL_STARTTLS_ONLY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_mail_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_mail_ssl_verify[] = {[m
[31m-    { ngx_string("off"), 0 },[m
[31m-    { ngx_string("on"), 1 },[m
[31m-    { ngx_string("optional"), 2 },[m
[31m-    { ngx_string("optional_no_ca"), 3 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_ssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_mail_ssl_enable,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("starttls"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_mail_ssl_starttls,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, starttls),[m
[31m-      ngx_mail_starttls_state },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_key"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_password_file"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_mail_ssl_password_file,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_dhparam"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, dhparam),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_ecdh_curve"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, ecdh_curve),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_protocols"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, protocols),[m
[31m-      &ngx_mail_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("ssl_ciphers"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_prefer_server_ciphers"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, prefer_server_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_cache"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_mail_ssl_session_cache,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_tickets"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, session_tickets),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_ticket_key"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, session_ticket_keys),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, session_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_verify_client"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, verify),[m
[31m-      &ngx_mail_ssl_verify },[m
[31m-[m
[31m-    { ngx_string("ssl_verify_depth"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_client_certificate"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, client_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_trusted_certificate"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_crl"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, crl),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_ssl_module_ctx = {[m
[31m-    NULL,                                  /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_ssl_create_conf,              /* create server configuration */[m
[31m-    ngx_mail_ssl_merge_conf                /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_ssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_ssl_module_ctx,              /* module context */[m
[31m-    ngx_mail_ssl_commands,                 /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_mail_ssl_sess_id_ctx = ngx_string("MAIL");[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_ssl_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf;[m
[31m-[m
[31m-    scf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_ssl_conf_t));[m
[31m-    if (scf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     scf->protocols = 0;[m
[31m-     *     scf->certificate = { 0, NULL };[m
[31m-     *     scf->certificate_key = { 0, NULL };[m
[31m-     *     scf->dhparam = { 0, NULL };[m
[31m-     *     scf->ecdh_curve = { 0, NULL };[m
[31m-     *     scf->client_certificate = { 0, NULL };[m
[31m-     *     scf->trusted_certificate = { 0, NULL };[m
[31m-     *     scf->crl = { 0, NULL };[m
[31m-     *     scf->ciphers = { 0, NULL };[m
[31m-     *     scf->shm_zone = NULL;[m
[31m-     */[m
[31m-[m
[31m-    scf->enable = NGX_CONF_UNSET;[m
[31m-    scf->starttls = NGX_CONF_UNSET_UINT;[m
[31m-    scf->passwords = NGX_CONF_UNSET_PTR;[m
[31m-    scf->prefer_server_ciphers = NGX_CONF_UNSET;[m
[31m-    scf->verify = NGX_CONF_UNSET_UINT;[m
[31m-    scf->verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    scf->builtin_session_cache = NGX_CONF_UNSET;[m
[31m-    scf->session_timeout = NGX_CONF_UNSET;[m
[31m-    scf->session_tickets = NGX_CONF_UNSET;[m
[31m-    scf->session_ticket_keys = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return scf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t *prev = parent;[m
[31m-    ngx_mail_ssl_conf_t *conf = child;[m
[31m-[m
[31m-    char                *mode;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->starttls, prev->starttls,[m
[31m-                         NGX_MAIL_STARTTLS_OFF);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_timeout,[m
[31m-                         prev->session_timeout, 300);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->prefer_server_ciphers,[m
[31m-                         prev->prefer_server_ciphers, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,[m
[31m-                         (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                          |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->verify, prev->verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->verify_depth, prev->verify_depth, 1);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->certificate, prev->certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->certificate_key, prev->certificate_key, "");[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve,[m
[31m-                         NGX_DEFAULT_ECDH_CURVE);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->client_certificate,[m
[31m-                         prev->client_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->trusted_certificate,[m
[31m-                         prev->trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->crl, prev->crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);[m
[31m-[m
[31m-[m
[31m-    conf->ssl.log = cf->log;[m
[31m-[m
[31m-    if (conf->enable) {[m
[31m-        mode = "ssl";[m
[31m-[m
[31m-    } else if (conf->starttls != NGX_MAIL_STARTTLS_OFF) {[m
[31m-        mode = "starttls";[m
[31m-[m
[31m-    } else {[m
[31m-        mode = "";[m
[31m-    }[m
[31m-[m
[31m-    if (conf->file == NULL) {[m
[31m-        conf->file = prev->file;[m
[31m-        conf->line = prev->line;[m
[31m-    }[m
[31m-[m
[31m-    if (*mode) {[m
[31m-[m
[31m-        if (conf->certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined for "[m
[31m-                          "the \"%s\" directive in %s:%ui",[m
[31m-                          mode, conf->file, conf->line);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate_key\" is defined for "[m
[31m-                          "the \"%s\" directive in %s:%ui",[m
[31m-                          mode, conf->file, conf->line);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (conf->certificate.len == 0) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"",[m
[31m-                          &conf->certificate);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create(&conf->ssl, conf->protocols, NULL) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = &conf->ssl;[m
[31m-[m
[31m-    if (ngx_ssl_certificate(cf, &conf->ssl, &conf->certificate,[m
[31m-                            &conf->certificate_key, conf->passwords)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->verify) {[m
[31m-[m
[31m-        if (conf->client_certificate.len == 0 && conf->verify != 3) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no ssl_client_certificate for ssl_client_verify");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_client_certificate(cf, &conf->ssl,[m
[31m-                                       &conf->client_certificate,[m
[31m-                                       conf->verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, &conf->ssl,[m
[31m-                                        &conf->trusted_certificate,[m
[31m-                                        conf->verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, &conf->ssl, &conf->crl) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(conf->ssl.ctx,[m
[31m-                                (const char *) conf->ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &conf->ciphers);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->prefer_server_ciphers) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100001L && !defined LIBRESSL_VERSION_NUMBER)[m
[31m-    SSL_CTX_set_tmp_rsa_callback(conf->ssl.ctx, ngx_ssl_rsa512_key_callback);[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->builtin_session_cache,[m
[31m-                         prev->builtin_session_cache, NGX_SSL_NONE_SCACHE);[m
[31m-[m
[31m-    if (conf->shm_zone == NULL) {[m
[31m-        conf->shm_zone = prev->shm_zone;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_session_cache(&conf->ssl, &ngx_mail_ssl_sess_id_ctx,[m
[31m-                              conf->builtin_session_cache,[m
[31m-                              conf->shm_zone, conf->session_timeout)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_tickets,[m
[31m-                         prev->session_tickets, 1);[m
[31m-[m
[31m-#ifdef SSL_OP_NO_TICKET[m
[31m-    if (!conf->session_tickets) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->session_ticket_keys,[m
[31m-                         prev->session_ticket_keys, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    char  *rv;[m
[31m-[m
[31m-    rv = ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->enable && (ngx_int_t) scf->starttls > NGX_MAIL_STARTTLS_OFF) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "\"starttls\" directive conflicts with \"ssl on\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    scf->file = cf->conf_file->file.name.data;[m
[31m-    scf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_starttls(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    char  *rv;[m
[31m-[m
[31m-    rv = ngx_conf_set_enum_slot(cf, cmd, conf);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->enable == 1 && (ngx_int_t) scf->starttls > NGX_MAIL_STARTTLS_OFF) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "\"ssl\" directive conflicts with \"starttls\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    scf->file = cf->conf_file->file.name.data;[m
[31m-    scf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (scf->passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    scf->passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (scf->passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    size_t       len;[m
[31m-    ngx_str_t   *value, name, size;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i, j;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_NO_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "none") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_NONE_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "builtin") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("builtin:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            n = ngx_atoi(value[i].data + sizeof("builtin:") - 1,[m
[31m-                         value[i].len - (sizeof("builtin:") - 1));[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            scf->builtin_session_cache = n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("shared:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            len = 0;[m
[31m-[m
[31m-            for (j = sizeof("shared:") - 1; j < value[i].len; j++) {[m
[31m-                if (value[i].data[j] == ':') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                len++;[m
[31m-            }[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            name.len = len;[m
[31m-            name.data = value[i].data + sizeof("shared:") - 1;[m
[31m-[m
[31m-            size.len = value[i].len - j - 1;[m
[31m-            size.data = name.data + len + 1;[m
[31m-[m
[31m-            n = ngx_parse_size(&size);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (n < (ngx_int_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "session cache \"%V\" is too small",[m
[31m-                                   &value[i]);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            scf->shm_zone = ngx_shared_memory_add(cf, &name, n,[m
[31m-                                                   &ngx_mail_ssl_module);[m
[31m-            if (scf->shm_zone == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            scf->shm_zone->init = ngx_ssl_session_cache_init;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->shm_zone && scf->builtin_session_cache == NGX_CONF_UNSET) {[m
[31m-        scf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid session cache \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_ssl_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_ssl_module.h[m
[1mdeleted file mode 100644[m
[1mindex 296a6a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/mail/ngx_mail_ssl_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_SSL_H_INCLUDED_[m
[31m-#define _NGX_MAIL_SSL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_STARTTLS_OFF   0[m
[31m-#define NGX_MAIL_STARTTLS_ON    1[m
[31m-#define NGX_MAIL_STARTTLS_ONLY  2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t       enable;[m
[31m-    ngx_flag_t       prefer_server_ciphers;[m
[31m-[m
[31m-    ngx_ssl_t        ssl;[m
[31m-[m
[31m-    ngx_uint_t       starttls;[m
[31m-    ngx_uint_t       protocols;[m
[31m-[m
[31m-    ngx_uint_t       verify;[m
[31m-    ngx_uint_t       verify_depth;[m
[31m-[m
[31m-    ssize_t          builtin_session_cache;[m
[31m-[m
[31m-    time_t           session_timeout;[m
[31m-[m
[31m-    ngx_str_t        certificate;[m
[31m-    ngx_str_t        certificate_key;[m
[31m-    ngx_str_t        dhparam;[m
[31m-    ngx_str_t        ecdh_curve;[m
[31m-    ngx_str_t        client_certificate;[m
[31m-    ngx_str_t        trusted_certificate;[m
[31m-    ngx_str_t        crl;[m
[31m-[m
[31m-    ngx_str_t        ciphers;[m
[31m-[m
[31m-    ngx_array_t     *passwords;[m
[31m-[m
[31m-    ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-    ngx_flag_t       session_tickets;[m
[31m-    ngx_array_t     *session_ticket_keys;[m
[31m-[m
[31m-    u_char          *file;[m
[31m-    ngx_uint_t       line;[m
[31m-} ngx_mail_ssl_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_mail_ssl_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_SSL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/misc/ngx_cpp_test_module.cpp b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/misc/ngx_cpp_test_module.cpp[m
[1mdeleted file mode 100644[m
[1mindex 5d2f08d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/misc/ngx_cpp_test_module.cpp[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-[m
[31m-// stub module to test header files' C++ compatibility[m
[31m-[m
[31m-extern "C" {[m
[31m-  #include <ngx_config.h>[m
[31m-  #include <ngx_core.h>[m
[31m-  #include <ngx_event.h>[m
[31m-  #include <ngx_event_connect.h>[m
[31m-  #include <ngx_event_pipe.h>[m
[31m-[m
[31m-  #include <ngx_http.h>[m
[31m-[m
[31m-  #include <ngx_mail.h>[m
[31m-  #include <ngx_mail_pop3_module.h>[m
[31m-  #include <ngx_mail_imap_module.h>[m
[31m-  #include <ngx_mail_smtp_module.h>[m
[31m-}[m
[31m-[m
[31m-// nginx header files should go before other, because they define 64-bit off_t[m
[31m-// #include <string>[m
[31m-[m
[31m-[m
[31m-void ngx_cpp_test_handler(void *data);[m
[31m-[m
[31m-void[m
[31m-ngx_cpp_test_handler(void *data)[m
[31m-{[m
[31m-    return;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/misc/ngx_google_perftools_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/misc/ngx_google_perftools_module.c[m
[1mdeleted file mode 100644[m
[1mindex f2f8221..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/misc/ngx_google_perftools_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,126 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-/*[m
[31m- * declare Profiler interface here because[m
[31m- * <google/profiler.h> is C++ header file[m
[31m- */[m
[31m-[m
[31m-int ProfilerStart(u_char* fname);[m
[31m-void ProfilerStop(void);[m
[31m-void ProfilerRegisterThread(void);[m
[31m-[m
[31m-[m
[31m-static void *ngx_google_perftools_create_conf(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_google_perftools_worker(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t  profiles;[m
[31m-} ngx_google_perftools_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_google_perftools_commands[] = {[m
[31m-[m
[31m-    { ngx_string("google_perftools_profiles"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_google_perftools_conf_t, profiles),[m
[31m-      NULL },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_google_perftools_module_ctx = {[m
[31m-    ngx_string("google_perftools"),[m
[31m-    ngx_google_perftools_create_conf,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_google_perftools_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_google_perftools_module_ctx,      /* module context */[m
[31m-    ngx_google_perftools_commands,         /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    ngx_google_perftools_worker,           /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_google_perftools_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_google_perftools_conf_t  *gptcf;[m
[31m-[m
[31m-    gptcf = ngx_pcalloc(cycle->pool, sizeof(ngx_google_perftools_conf_t));[m
[31m-    if (gptcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc()[m
[31m-     *[m
[31m-     *     gptcf->profiles = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    return gptcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_google_perftools_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_char                       *profile;[m
[31m-    ngx_google_perftools_conf_t  *gptcf;[m
[31m-[m
[31m-    gptcf = (ngx_google_perftools_conf_t *)[m
[31m-                ngx_get_conf(cycle->conf_ctx, ngx_google_perftools_module);[m
[31m-[m
[31m-    if (gptcf->profiles.len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    profile = ngx_alloc(gptcf->profiles.len + NGX_INT_T_LEN + 2, cycle->log);[m
[31m-    if (profile == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (getenv("CPUPROFILE")) {[m
[31m-        /* disable inherited Profiler enabled in master process */[m
[31m-        ProfilerStop();[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(profile, "%V.%d%Z", &gptcf->profiles, ngx_pid);[m
[31m-[m
[31m-    if (ProfilerStart(profile)) {[m
[31m-        /* start ITIMER_PROF timer */[m
[31m-        ProfilerRegisterThread();[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,[m
[31m-                      "ProfilerStart(%s) failed", profile);[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(profile);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* ProfilerStop() is called on Profiler destruction */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_alloc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_alloc.c[m
[1mdeleted file mode 100644[m
[1mindex 5c2f787..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_alloc.c[m
[1m+++ /dev/null[m
[36m@@ -1,90 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_pagesize;[m
[31m-ngx_uint_t  ngx_pagesize_shift;[m
[31m-ngx_uint_t  ngx_cacheline_size;[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_alloc(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = malloc(size);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "malloc(%uz) failed", size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_calloc(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = ngx_alloc(size, log);[m
[31m-[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_MEMALIGN)[m
[31m-[m
[31m-void *[m
[31m-ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-    int    err;[m
[31m-[m
[31m-    err = posix_memalign(&p, alignment, size);[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                      "posix_memalign(%uz, %uz) failed", alignment, size);[m
[31m-        p = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,[m
[31m-                   "posix_memalign: %p:%uz @%uz", p, size, alignment);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_MEMALIGN)[m
[31m-[m
[31m-void *[m
[31m-ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = memalign(alignment, size);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "memalign(%uz, %uz) failed", alignment, size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,[m
[31m-                   "memalign: %p:%uz @%uz", p, size, alignment);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_alloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_alloc.h[m
[1mdeleted file mode 100644[m
[1mindex 655db25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_alloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ALLOC_H_INCLUDED_[m
[31m-#define _NGX_ALLOC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void *ngx_alloc(size_t size, ngx_log_t *log);[m
[31m-void *ngx_calloc(size_t size, ngx_log_t *log);[m
[31m-[m
[31m-#define ngx_free          free[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Linux has memalign() or posix_memalign()[m
[31m- * Solaris has memalign()[m
[31m- * FreeBSD 7.0 has posix_memalign(), besides, early version's malloc()[m
[31m- * aligns allocations bigger than page size at the page boundary[m
[31m- */[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_MEMALIGN || NGX_HAVE_MEMALIGN)[m
[31m-[m
[31m-void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_memalign(alignment, size, log)  ngx_alloc(size, log)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t  ngx_pagesize;[m
[31m-extern ngx_uint_t  ngx_pagesize_shift;[m
[31m-extern ngx_uint_t  ngx_cacheline_size;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ALLOC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_atomic.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_atomic.h[m
[1mdeleted file mode 100644[m
[1mindex 74b8b7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_atomic.h[m
[1m+++ /dev/null[m
[36m@@ -1,313 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ATOMIC_H_INCLUDED_[m
[31m-#define _NGX_ATOMIC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_LIBATOMIC)[m
[31m-[m
[31m-#define AO_REQUIRE_CAS[m
[31m-#include <atomic_ops.h>[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-typedef long                        ngx_atomic_int_t;[m
[31m-typedef AO_t                        ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-#else[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, new)                                    \[m
[31m-    AO_compare_and_swap(lock, old, new)[m
[31m-#define ngx_atomic_fetch_add(value, add)                                      \[m
[31m-    AO_fetch_and_add(value, add)[m
[31m-#define ngx_memory_barrier()        AO_nop()[m
[31m-#define ngx_cpu_pause()[m
[31m-[m
[31m-[m
[31m-#elif (NGX_DARWIN_ATOMIC)[m
[31m-[m
[31m-/*[m
[31m- * use Darwin 8 atomic(3) and barrier(3) operations[m
[31m- * optimized at run-time for UP and SMP[m
[31m- */[m
[31m-[m
[31m-#include <libkern/OSAtomic.h>[m
[31m-[m
[31m-/* "bool" conflicts with perl's CORE/handy.h */[m
[31m-#if 0[m
[31m-#undef bool[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-typedef int64_t                     ngx_atomic_int_t;[m
[31m-typedef uint64_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, new)                                    \[m
[31m-    OSAtomicCompareAndSwap64Barrier(old, new, (int64_t *) lock)[m
[31m-[m
[31m-#define ngx_atomic_fetch_add(value, add)                                      \[m
[31m-    (OSAtomicAdd64(add, (int64_t *) value) - add)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, new)                                    \[m
[31m-    OSAtomicCompareAndSwap32Barrier(old, new, (int32_t *) lock)[m
[31m-[m
[31m-#define ngx_atomic_fetch_add(value, add)                                      \[m
[31m-    (OSAtomicAdd32(add, (int32_t *) value) - add)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_memory_barrier()        OSMemoryBarrier()[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[31m-[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-[m
[31m-#elif (NGX_HAVE_GCC_ATOMIC)[m
[31m-[m
[31m-/* GCC 4.1 builtin atomic operations */[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-typedef long                        ngx_atomic_int_t;[m
[31m-typedef unsigned long               ngx_atomic_uint_t;[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-#else[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-#endif[m
[31m-[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, set)                                    \[m
[31m-    __sync_bool_compare_and_swap(lock, old, set)[m
[31m-[m
[31m-#define ngx_atomic_fetch_add(value, add)                                      \[m
[31m-    __sync_fetch_and_add(value, add)[m
[31m-[m
[31m-#define ngx_memory_barrier()        __sync_synchronize()[m
[31m-[m
[31m-#if ( __i386__ || __i386 || __amd64__ || __amd64 )[m
[31m-#define ngx_cpu_pause()             __asm__ ("pause")[m
[31m-#else[m
[31m-#define ngx_cpu_pause()[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif ( __i386__ || __i386 )[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-[m
[31m-#if ( __SUNPRO_C )[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set);[m
[31m-[m
[31m-ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add);[m
[31m-[m
[31m-/*[m
[31m- * Sun Studio 12 exits with segmentation fault on '__asm ("pause")',[m
[31m- * so ngx_cpu_pause is declared in src/os/unix/ngx_sunpro_x86.il[m
[31m- */[m
[31m-[m
[31m-void[m
[31m-ngx_cpu_pause(void);[m
[31m-[m
[31m-/* the code in src/os/unix/ngx_sunpro_x86.il */[m
[31m-[m
[31m-#define ngx_memory_barrier()        __asm (".volatile"); __asm (".nonvolatile")[m
[31m-[m
[31m-[m
[31m-#else /* ( __GNUC__ || __INTEL_COMPILER ) */[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#include "ngx_gcc_atomic_x86.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif ( __amd64__ || __amd64 )[m
[31m-[m
[31m-typedef int64_t                     ngx_atomic_int_t;[m
[31m-typedef uint64_t                    ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-[m
[31m-#if ( __SUNPRO_C )[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set);[m
[31m-[m
[31m-ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add);[m
[31m-[m
[31m-/*[m
[31m- * Sun Studio 12 exits with segmentation fault on '__asm ("pause")',[m
[31m- * so ngx_cpu_pause is declared in src/os/unix/ngx_sunpro_amd64.il[m
[31m- */[m
[31m-[m
[31m-void[m
[31m-ngx_cpu_pause(void);[m
[31m-[m
[31m-/* the code in src/os/unix/ngx_sunpro_amd64.il */[m
[31m-[m
[31m-#define ngx_memory_barrier()        __asm (".volatile"); __asm (".nonvolatile")[m
[31m-[m
[31m-[m
[31m-#else /* ( __GNUC__ || __INTEL_COMPILER ) */[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#include "ngx_gcc_atomic_amd64.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif ( __sparc__ || __sparc || __sparcv9 )[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-typedef int64_t                     ngx_atomic_int_t;[m
[31m-typedef uint64_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-[m
[31m-#if ( __SUNPRO_C )[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#include "ngx_sunpro_atomic_sparc64.h"[m
[31m-[m
[31m-[m
[31m-#else /* ( __GNUC__ || __INTEL_COMPILER ) */[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#include "ngx_gcc_atomic_sparc64.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif ( __powerpc__ || __POWERPC__ )[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-typedef int64_t                     ngx_atomic_int_t;[m
[31m-typedef uint64_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-[m
[31m-#include "ngx_gcc_atomic_ppc.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if !(NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  0[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    if (*lock == old) {[m
[31m-        *lock = set;[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_int_t  old;[m
[31m-[m
[31m-    old = *value;[m
[31m-    *value += add;[m
[31m-[m
[31m-    return old;[m
[31m-}[m
[31m-[m
[31m-#define ngx_memory_barrier()[m
[31m-#define ngx_cpu_pause()[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin);[m
[31m-[m
[31m-#define ngx_trylock(lock)  (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))[m
[31m-#define ngx_unlock(lock)    *(lock) = 0[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ATOMIC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_channel.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_channel.c[m
[1mdeleted file mode 100644[m
[1mindex 1efa066..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_channel.c[m
[1m+++ /dev/null[m
[36m@@ -1,253 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_channel.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    ssize_t             n;[m
[31m-    ngx_err_t           err;[m
[31m-    struct iovec        iov[1];[m
[31m-    struct msghdr       msg;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-    union {[m
[31m-        struct cmsghdr  cm;[m
[31m-        char            space[CMSG_SPACE(sizeof(int))];[m
[31m-    } cmsg;[m
[31m-[m
[31m-    if (ch->fd == -1) {[m
[31m-        msg.msg_control = NULL;[m
[31m-        msg.msg_controllen = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        msg.msg_control = (caddr_t) &cmsg;[m
[31m-        msg.msg_controllen = sizeof(cmsg);[m
[31m-[m
[31m-        ngx_memzero(&cmsg, sizeof(cmsg));[m
[31m-[m
[31m-        cmsg.cm.cmsg_len = CMSG_LEN(sizeof(int));[m
[31m-        cmsg.cm.cmsg_level = SOL_SOCKET;[m
[31m-        cmsg.cm.cmsg_type = SCM_RIGHTS;[m
[31m-[m
[31m-        /*[m
[31m-         * We have to use ngx_memcpy() instead of simple[m
[31m-         *   *(int *) CMSG_DATA(&cmsg.cm) = ch->fd;[m
[31m-         * because some gcc 4.4 with -O2/3/s optimization issues the warning:[m
[31m-         *   dereferencing type-punned pointer will break strict-aliasing rules[m
[31m-         *[m
[31m-         * Fortunately, gcc with -O1 compiles this ngx_memcpy()[m
[31m-         * in the same simple assignment as in the code above[m
[31m-         */[m
[31m-[m
[31m-        ngx_memcpy(CMSG_DATA(&cmsg.cm), &ch->fd, sizeof(int));[m
[31m-    }[m
[31m-[m
[31m-    msg.msg_flags = 0;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (ch->fd == -1) {[m
[31m-        msg.msg_accrights = NULL;[m
[31m-        msg.msg_accrightslen = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        msg.msg_accrights = (caddr_t) &ch->fd;[m
[31m-        msg.msg_accrightslen = sizeof(int);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    iov[0].iov_base = (char *) ch;[m
[31m-    iov[0].iov_len = size;[m
[31m-[m
[31m-    msg.msg_name = NULL;[m
[31m-    msg.msg_namelen = 0;[m
[31m-    msg.msg_iov = iov;[m
[31m-    msg.msg_iovlen = 1;[m
[31m-[m
[31m-    n = sendmsg(s, &msg, 0);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err, "sendmsg() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    ssize_t             n;[m
[31m-    ngx_err_t           err;[m
[31m-    struct iovec        iov[1];[m
[31m-    struct msghdr       msg;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-    union {[m
[31m-        struct cmsghdr  cm;[m
[31m-        char            space[CMSG_SPACE(sizeof(int))];[m
[31m-    } cmsg;[m
[31m-#else[m
[31m-    int                 fd;[m
[31m-#endif[m
[31m-[m
[31m-    iov[0].iov_base = (char *) ch;[m
[31m-    iov[0].iov_len = size;[m
[31m-[m
[31m-    msg.msg_name = NULL;[m
[31m-    msg.msg_namelen = 0;[m
[31m-    msg.msg_iov = iov;[m
[31m-    msg.msg_iovlen = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-    msg.msg_control = (caddr_t) &cmsg;[m
[31m-    msg.msg_controllen = sizeof(cmsg);[m
[31m-#else[m
[31m-    msg.msg_accrights = (caddr_t) &fd;[m
[31m-    msg.msg_accrightslen = sizeof(int);[m
[31m-#endif[m
[31m-[m
[31m-    n = recvmsg(s, &msg, 0);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err, "recvmsg() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "recvmsg() returned zero");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n < sizeof(ngx_channel_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "recvmsg() returned not enough data: %z", n);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-    if (ch->command == NGX_CMD_OPEN_CHANNEL) {[m
[31m-[m
[31m-        if (cmsg.cm.cmsg_len < (socklen_t) CMSG_LEN(sizeof(int))) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "recvmsg() returned too small ancillary data");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cmsg.cm.cmsg_level != SOL_SOCKET || cmsg.cm.cmsg_type != SCM_RIGHTS)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "recvmsg() returned invalid ancillary data "[m
[31m-                          "level %d or type %d",[m
[31m-                          cmsg.cm.cmsg_level, cmsg.cm.cmsg_type);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* ch->fd = *(int *) CMSG_DATA(&cmsg.cm); */[m
[31m-[m
[31m-        ngx_memcpy(&ch->fd, CMSG_DATA(&cmsg.cm), sizeof(int));[m
[31m-    }[m
[31m-[m
[31m-    if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "recvmsg() truncated data");[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (ch->command == NGX_CMD_OPEN_CHANNEL) {[m
[31m-        if (msg.msg_accrightslen != sizeof(int)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "recvmsg() returned no ancillary data");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ch->fd = fd;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, ngx_int_t event,[m
[31m-    ngx_event_handler_pt handler)[m
[31m-{[m
[31m-    ngx_event_t       *ev, *rev, *wev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ngx_get_connection(fd, cycle->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->pool = cycle->pool;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = cycle->log;[m
[31m-    wev->log = cycle->log;[m
[31m-[m
[31m-    rev->channel = 1;[m
[31m-    wev->channel = 1;[m
[31m-[m
[31m-    ev = (event == NGX_READ_EVENT) ? rev : wev;[m
[31m-[m
[31m-    ev->handler = handler;[m
[31m-[m
[31m-    if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            ngx_free_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_add_event(ev, event, 0) == NGX_ERROR) {[m
[31m-            ngx_free_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log)[m
[31m-{[m
[31m-    if (close(fd[0]) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() channel failed");[m
[31m-    }[m
[31m-[m
[31m-    if (close(fd[1]) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() channel failed");[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_channel.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_channel.h[m
[1mdeleted file mode 100644[m
[1mindex 362cc64..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_channel.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CHANNEL_H_INCLUDED_[m
[31m-#define _NGX_CHANNEL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  command;[m
[31m-    ngx_pid_t   pid;[m
[31m-    ngx_int_t   slot;[m
[31m-    ngx_fd_t    fd;[m
[31m-} ngx_channel_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size,[m
[31m-    ngx_log_t *log);[m
[31m-ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size,[m
[31m-    ngx_log_t *log);[m
[31m-ngx_int_t ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd,[m
[31m-    ngx_int_t event, ngx_event_handler_pt handler);[m
[31m-void ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CHANNEL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_daemon.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_daemon.c[m
[1mdeleted file mode 100644[m
[1mindex ab67211..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_daemon.c[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_daemon(ngx_log_t *log)[m
[31m-{[m
[31m-    int  fd;[m
[31m-[m
[31m-    switch (fork()) {[m
[31m-    case -1:[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    case 0:[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        exit(0);[m
[31m-    }[m
[31m-[m
[31m-    ngx_pid = ngx_getpid();[m
[31m-[m
[31m-    if (setsid() == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    umask(0);[m
[31m-[m
[31m-    fd = open("/dev/null", O_RDWR);[m
[31m-    if (fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "open(\"/dev/null\") failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (dup2(fd, STDIN_FILENO) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (dup2(fd, STDOUT_FILENO) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (dup2(fd, STDERR_FILENO) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (fd > STDERR_FILENO) {[m
[31m-        if (close(fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin.h[m
[1mdeleted file mode 100644[m
[1mindex 4d01b26..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_DARWIN_H_INCLUDED_[m
[31m-#define _NGX_DARWIN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-void ngx_debug_init(void);[m
[31m-ngx_chain_t *ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-extern int       ngx_darwin_kern_osreldate;[m
[31m-extern int       ngx_darwin_hw_ncpu;[m
[31m-extern u_long    ngx_darwin_net_inet_tcp_sendspace;[m
[31m-[m
[31m-extern ngx_uint_t  ngx_debug_malloc;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_DARWIN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_config.h[m
[1mdeleted file mode 100644[m
[1mindex cfe3ce2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_DARWIN_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_DARWIN_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <unistd.h>[m
[31m-#include <inttypes.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <sys/mount.h>          /* statfs() */[m
[31m-[m
[31m-#include <sys/filio.h>          /* FIONBIO */[m
[31m-#include <sys/ioctl.h>[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#include <sys/sysctl.h>[m
[31m-#include <xlocale.h>[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-[m
[31m-#ifndef IOV_MAX[m
[31m-#define IOV_MAX   64[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-#include <sys/event.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG  -1[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_CASELESS_FILESYSTEM[m
[31m-#define NGX_HAVE_CASELESS_FILESYSTEM  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_OS_SPECIFIC_INIT    1[m
[31m-#define NGX_HAVE_DEBUG_MALLOC        1[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_DARWIN_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_init.c[m
[1mdeleted file mode 100644[m
[1mindex a9d12a8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,197 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-char    ngx_darwin_kern_ostype[16];[m
[31m-char    ngx_darwin_kern_osrelease[128];[m
[31m-int     ngx_darwin_hw_ncpu;[m
[31m-int     ngx_darwin_kern_ipc_somaxconn;[m
[31m-u_long  ngx_darwin_net_inet_tcp_sendspace;[m
[31m-[m
[31m-ngx_uint_t  ngx_debug_malloc;[m
[31m-[m
[31m-[m
[31m-static ngx_os_io_t ngx_darwin_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-    ngx_darwin_sendfile_chain,[m
[31m-    NGX_IO_SENDFILE[m
[31m-#else[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char        *name;[m
[31m-    void        *value;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   exists;[m
[31m-} sysctl_t;[m
[31m-[m
[31m-[m
[31m-sysctl_t sysctls[] = {[m
[31m-    { "hw.ncpu",[m
[31m-      &ngx_darwin_hw_ncpu,[m
[31m-      sizeof(ngx_darwin_hw_ncpu), 0 },[m
[31m-[m
[31m-    { "net.inet.tcp.sendspace",[m
[31m-      &ngx_darwin_net_inet_tcp_sendspace,[m
[31m-      sizeof(ngx_darwin_net_inet_tcp_sendspace), 0 },[m
[31m-[m
[31m-    { "kern.ipc.somaxconn",[m
[31m-      &ngx_darwin_kern_ipc_somaxconn,[m
[31m-      sizeof(ngx_darwin_kern_ipc_somaxconn), 0 },[m
[31m-[m
[31m-    { NULL, NULL, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_debug_init(void)[m
[31m-{[m
[31m-#if (NGX_DEBUG_MALLOC)[m
[31m-[m
[31m-    /*[m
[31m-     * MacOSX 10.6, 10.7:  MallocScribble fills freed memory with 0x55[m
[31m-     *                     and fills allocated memory with 0xAA.[m
[31m-     * MacOSX 10.4, 10.5:  MallocScribble fills freed memory with 0x55,[m
[31m-     *                     MallocPreScribble fills allocated memory with 0xAA.[m
[31m-     * MacOSX 10.3:        MallocScribble fills freed memory with 0x55,[m
[31m-     *                     and no way to fill allocated memory.[m
[31m-     */[m
[31m-[m
[31m-    setenv("MallocScribble", "1", 0);[m
[31m-[m
[31m-    ngx_debug_malloc = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (getenv("MallocScribble")) {[m
[31m-        ngx_debug_malloc = 1;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_specific_init(ngx_log_t *log)[m
[31m-{[m
[31m-    size_t      size;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    size = sizeof(ngx_darwin_kern_ostype);[m
[31m-    if (sysctlbyname("kern.ostype", ngx_darwin_kern_ostype, &size, NULL, 0)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "sysctlbyname(kern.ostype) failed");[m
[31m-[m
[31m-            if (err != NGX_ENOMEM) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_darwin_kern_ostype[size - 1] = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof(ngx_darwin_kern_osrelease);[m
[31m-    if (sysctlbyname("kern.osrelease", ngx_darwin_kern_osrelease, &size,[m
[31m-                     NULL, 0)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "sysctlbyname(kern.osrelease) failed");[m
[31m-[m
[31m-            if (err != NGX_ENOMEM) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_darwin_kern_osrelease[size - 1] = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; sysctls[i].name; i++) {[m
[31m-        size = sysctls[i].size;[m
[31m-[m
[31m-        if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            sysctls[i].exists = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "sysctlbyname(%s) failed", sysctls[i].name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ncpu = ngx_darwin_hw_ncpu;[m
[31m-[m
[31m-    if (ngx_darwin_kern_ipc_somaxconn > 32767) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "sysctl kern.ipc.somaxconn must be less than 32768");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_tcp_nodelay_and_tcp_nopush = 1;[m
[31m-[m
[31m-    ngx_os_io = ngx_darwin_io;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_specific_status(ngx_log_t *log)[m
[31m-{[m
[31m-    u_long      value;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    if (ngx_darwin_kern_ostype[0]) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",[m
[31m-                      ngx_darwin_kern_ostype, ngx_darwin_kern_osrelease);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; sysctls[i].name; i++) {[m
[31m-        if (sysctls[i].exists) {[m
[31m-            if (sysctls[i].size == sizeof(long)) {[m
[31m-                value = *(long *) sysctls[i].value;[m
[31m-[m
[31m-            } else {[m
[31m-                value = *(int *) sysctls[i].value;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",[m
[31m-                          sysctls[i].name, value);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_sendfile_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_sendfile_chain.c[m
[1mdeleted file mode 100644[m
[1mindex c802e9f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_darwin_sendfile_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * It seems that Darwin 9.4 (Mac OS X 1.5) sendfile() has the same[m
[31m- * old bug as early FreeBSD sendfile() syscall:[m
[31m- * http://bugs.freebsd.org/33771[m
[31m- *[m
[31m- * Besides sendfile() has another bug: if one calls sendfile()[m
[31m- * with both a header and a trailer, then sendfile() ignores a file part[m
[31m- * at all and sends only the header and the trailer together.[m
[31m- * For this reason we send a trailer only if there is no a header.[m
[31m- *[m
[31m- * Although sendfile() allows to pass a header or a trailer,[m
[31m- * it may send the header or the trailer and a part of the file[m
[31m- * in different packets.  And FreeBSD workaround (TCP_NOPUSH option)[m
[31m- * does not help.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int              rc;[m
[31m-    off_t            send, prev_send, sent;[m
[31m-    off_t            file_size;[m
[31m-    ssize_t          n;[m
[31m-    ngx_uint_t       eintr;[m
[31m-    ngx_err_t        err;[m
[31m-    ngx_buf_t       *file;[m
[31m-    ngx_event_t     *wev;[m
[31m-    ngx_chain_t     *cl;[m
[31m-    ngx_iovec_t      header, trailer;[m
[31m-    struct sf_hdtr   hdtr;[m
[31m-    struct iovec     headers[NGX_IOVS_PREALLOCATE];[m
[31m-    struct iovec     trailers[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {[m
[31m-        (void) ngx_connection_error(c, wev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-        wev->error = 1;[m
[31m-        return NGX_CHAIN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* the maximum limit size is the maximum size_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    header.iovs = headers;[m
[31m-    header.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    trailer.iovs = trailers;[m
[31m-    trailer.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        eintr = 0;[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        /* create the header iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log);[m
[31m-[m
[31m-        if (cl == NGX_CHAIN_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        send += header.size;[m
[31m-[m
[31m-        if (cl && cl->buf->in_file && send < limit) {[m
[31m-            file = cl->buf;[m
[31m-[m
[31m-            /* coalesce the neighbouring file bufs */[m
[31m-[m
[31m-            file_size = ngx_chain_coalesce_file(&cl, limit - send);[m
[31m-[m
[31m-            send += file_size;[m
[31m-[m
[31m-            if (header.count == 0) {[m
[31m-[m
[31m-                /*[m
[31m-                 * create the trailer iovec and coalesce the neighbouring bufs[m
[31m-                 */[m
[31m-[m
[31m-                cl = ngx_output_chain_to_iovec(&trailer, cl, limit - send,[m
[31m-                                               c->log);[m
[31m-                if (cl == NGX_CHAIN_ERROR) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                send += trailer.size;[m
[31m-[m
[31m-            } else {[m
[31m-                trailer.count = 0;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * sendfile() returns EINVAL if sf_hdtr's count is 0,[m
[31m-             * but corresponding pointer is not NULL[m
[31m-             */[m
[31m-[m
[31m-            hdtr.headers = header.count ? header.iovs : NULL;[m
[31m-            hdtr.hdr_cnt = header.count;[m
[31m-            hdtr.trailers = trailer.count ? trailer.iovs : NULL;[m
[31m-            hdtr.trl_cnt = trailer.count;[m
[31m-[m
[31m-            sent = header.size + file_size;[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "sendfile: @%O %O h:%uz",[m
[31m-                           file->file_pos, sent, header.size);[m
[31m-[m
[31m-            rc = sendfile(file->file->fd, c->fd, file->file_pos,[m
[31m-                          &sent, &hdtr, 0);[m
[31m-[m
[31m-            if (rc == -1) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                switch (err) {[m
[31m-                case NGX_EAGAIN:[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_EINTR:[m
[31m-                    eintr = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    wev->error = 1;[m
[31m-                    (void) ngx_connection_error(c, err, "sendfile() failed");[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                               "sendfile() sent only %O bytes", sent);[m
[31m-            }[m
[31m-[m
[31m-            if (rc == 0 && sent == 0) {[m
[31m-[m
[31m-                /*[m
[31m-                 * if rc and sent equal to zero, then someone[m
[31m-                 * has truncated the file, so the offset became beyond[m
[31m-                 * the end of the file[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              "sendfile() reported that \"%s\" was truncated",[m
[31m-                              file->file->name.data);[m
[31m-[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "sendfile: %d, @%O %O:%O",[m
[31m-                           rc, file->file_pos, sent, file_size + header.size);[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_writev(c, &header);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-        }[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if (eintr) {[m
[31m-            send = prev_send + sent;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (send - prev_send != sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_dlopen.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_dlopen.c[m
[1mdeleted file mode 100644[m
[1mindex a0efc69..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_dlopen.c[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-[m
[31m-char *[m
[31m-ngx_dlerror(void)[m
[31m-{[m
[31m-    char  *err;[m
[31m-[m
[31m-    err = (char *) dlerror();[m
[31m-[m
[31m-    if (err == NULL) {[m
[31m-        return "";[m
[31m-    }[m
[31m-[m
[31m-    return err;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_dlopen.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_dlopen.h[m
[1mdeleted file mode 100644[m
[1mindex 7a3159f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_dlopen.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_DLOPEN_H_INCLUDED_[m
[31m-#define _NGX_DLOPEN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_dlopen(path)           dlopen((char *) path, RTLD_NOW | RTLD_GLOBAL)[m
[31m-#define ngx_dlopen_n               "dlopen()"[m
[31m-[m
[31m-#define ngx_dlsym(handle, symbol)  dlsym(handle, symbol)[m
[31m-#define ngx_dlsym_n                "dlsym()"[m
[31m-[m
[31m-#define ngx_dlclose(handle)        dlclose(handle)[m
[31m-#define ngx_dlclose_n              "dlclose()"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-char *ngx_dlerror(void);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_DLOPEN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_errno.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_errno.c[m
[1mdeleted file mode 100644[m
[1mindex e787b23..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_errno.c[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The strerror() messages are copied because:[m
[31m- *[m
[31m- * 1) strerror() and strerror_r() functions are not Async-Signal-Safe,[m
[31m- *    therefore, they cannot be used in signal handlers;[m
[31m- *[m
[31m- * 2) a direct sys_errlist[] array may be used instead of these functions,[m
[31m- *    but Linux linker warns about its usage:[m
[31m- *[m
[31m- * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead[m
[31m- * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead[m
[31m- *[m
[31m- *    causing false bug reports.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  *ngx_sys_errlist;[m
[31m-static ngx_str_t   ngx_unknown_error = ngx_string("Unknown error");[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)[m
[31m-{[m
[31m-    ngx_str_t  *msg;[m
[31m-[m
[31m-    msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]:[m
[31m-                                              &ngx_unknown_error;[m
[31m-    size = ngx_min(size, msg->len);[m
[31m-[m
[31m-    return ngx_cpymem(errstr, msg->data, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_strerror_init(void)[m
[31m-{[m
[31m-    char       *msg;[m
[31m-    u_char     *p;[m
[31m-    size_t      len;[m
[31m-    ngx_err_t   err;[m
[31m-[m
[31m-    /*[m
[31m-     * ngx_strerror() is not ready to work at this stage, therefore,[m
[31m-     * malloc() is used and possible errors are logged using strerror().[m
[31m-     */[m
[31m-[m
[31m-    len = NGX_SYS_NERR * sizeof(ngx_str_t);[m
[31m-[m
[31m-    ngx_sys_errlist = malloc(len);[m
[31m-    if (ngx_sys_errlist == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    for (err = 0; err < NGX_SYS_NERR; err++) {[m
[31m-        msg = strerror(err);[m
[31m-        len = ngx_strlen(msg);[m
[31m-[m
[31m-        p = malloc(len);[m
[31m-        if (p == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, msg, len);[m
[31m-        ngx_sys_errlist[err].len = len;[m
[31m-        ngx_sys_errlist[err].data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    err = errno;[m
[31m-    ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err));[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_errno.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_errno.h[m
[1mdeleted file mode 100644[m
[1mindex 7d6ca76..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_errno.h[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ERRNO_H_INCLUDED_[m
[31m-#define _NGX_ERRNO_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef int               ngx_err_t;[m
[31m-[m
[31m-#define NGX_EPERM         EPERM[m
[31m-#define NGX_ENOENT        ENOENT[m
[31m-#define NGX_ENOPATH       ENOENT[m
[31m-#define NGX_ESRCH         ESRCH[m
[31m-#define NGX_EINTR         EINTR[m
[31m-#define NGX_ECHILD        ECHILD[m
[31m-#define NGX_ENOMEM        ENOMEM[m
[31m-#define NGX_EACCES        EACCES[m
[31m-#define NGX_EBUSY         EBUSY[m
[31m-#define NGX_EEXIST        EEXIST[m
[31m-#define NGX_EEXIST_FILE   EEXIST[m
[31m-#define NGX_EXDEV         EXDEV[m
[31m-#define NGX_ENOTDIR       ENOTDIR[m
[31m-#define NGX_EISDIR        EISDIR[m
[31m-#define NGX_EINVAL        EINVAL[m
[31m-#define NGX_ENFILE        ENFILE[m
[31m-#define NGX_EMFILE        EMFILE[m
[31m-#define NGX_ENOSPC        ENOSPC[m
[31m-#define NGX_EPIPE         EPIPE[m
[31m-#define NGX_EINPROGRESS   EINPROGRESS[m
[31m-#define NGX_ENOPROTOOPT   ENOPROTOOPT[m
[31m-#define NGX_EOPNOTSUPP    EOPNOTSUPP[m
[31m-#define NGX_EADDRINUSE    EADDRINUSE[m
[31m-#define NGX_ECONNABORTED  ECONNABORTED[m
[31m-#define NGX_ECONNRESET    ECONNRESET[m
[31m-#define NGX_ENOTCONN      ENOTCONN[m
[31m-#define NGX_ETIMEDOUT     ETIMEDOUT[m
[31m-#define NGX_ECONNREFUSED  ECONNREFUSED[m
[31m-#define NGX_ENAMETOOLONG  ENAMETOOLONG[m
[31m-#define NGX_ENETDOWN      ENETDOWN[m
[31m-#define NGX_ENETUNREACH   ENETUNREACH[m
[31m-#define NGX_EHOSTDOWN     EHOSTDOWN[m
[31m-#define NGX_EHOSTUNREACH  EHOSTUNREACH[m
[31m-#define NGX_ENOSYS        ENOSYS[m
[31m-#define NGX_ECANCELED     ECANCELED[m
[31m-#define NGX_EILSEQ        EILSEQ[m
[31m-#define NGX_ENOMOREFILES  0[m
[31m-#define NGX_ELOOP         ELOOP[m
[31m-#define NGX_EBADF         EBADF[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-#define NGX_EMLINK        EMLINK[m
[31m-#endif[m
[31m-[m
[31m-#if (__hpux__)[m
[31m-#define NGX_EAGAIN        EWOULDBLOCK[m
[31m-#else[m
[31m-#define NGX_EAGAIN        EAGAIN[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_errno                  errno[m
[31m-#define ngx_socket_errno           errno[m
[31m-#define ngx_set_errno(err)         errno = err[m
[31m-#define ngx_set_socket_errno(err)  errno = err[m
[31m-[m
[31m-[m
[31m-u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size);[m
[31m-ngx_int_t ngx_strerror_init(void);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ERRNO_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_file_aio_read.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_file_aio_read.c[m
[1mdeleted file mode 100644[m
[1mindex aedc3c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_file_aio_read.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * FreeBSD file AIO features and quirks:[m
[31m- *[m
[31m- *    if an asked data are already in VM cache, then aio_error() returns 0,[m
[31m- *    and the data are already copied in buffer;[m
[31m- *[m
[31m- *    aio_read() preread in VM cache as minimum 16K (probably BKVASIZE);[m
[31m- *    the first AIO preload may be up to 128K;[m
[31m- *[m
[31m- *    aio_read/aio_error() may return EINPROGRESS for just written data;[m
[31m- *[m
[31m- *    kqueue EVFILT_AIO filter is level triggered only: an event repeats[m
[31m- *    until aio_return() will be called;[m
[31m- *[m
[31m- *    aio_cancel() cannot cancel file AIO: it returns AIO_NOTCANCELED always.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-extern int  ngx_kqueue;[m
[31m-[m
[31m-[m
[31m-static ssize_t ngx_file_aio_result(ngx_file_t *file, ngx_event_aio_t *aio,[m
[31m-    ngx_event_t *ev);[m
[31m-static void ngx_file_aio_event_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    aio = ngx_pcalloc(pool, sizeof(ngx_event_aio_t));[m
[31m-    if (aio == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio->file = file;[m
[31m-    aio->fd = file->fd;[m
[31m-    aio->event.data = aio;[m
[31m-    aio->event.ready = 1;[m
[31m-    aio->event.log = file->log;[m
[31m-[m
[31m-    file->aio = aio;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    int               n;[m
[31m-    ngx_event_t      *ev;[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    if (!ngx_file_aio) {[m
[31m-        return ngx_read_file(file, buf, size, offset);[m
[31m-    }[m
[31m-[m
[31m-    if (file->aio == NULL && ngx_file_aio_init(file, pool) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio = file->aio;[m
[31m-    ev = &aio->event;[m
[31m-[m
[31m-    if (!ev->ready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, file->log, 0,[m
[31m-                      "second aio post for \"%V\"", &file->name);[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio complete:%d @%O:%uz %V",[m
[31m-                   ev->complete, offset, size, &file->name);[m
[31m-[m
[31m-    if (ev->complete) {[m
[31m-        ev->complete = 0;[m
[31m-        ngx_set_errno(aio->err);[m
[31m-[m
[31m-        if (aio->err == 0) {[m
[31m-            return aio->nbytes;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                      "aio read \"%s\" failed", file->name.data);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&aio->aiocb, sizeof(struct aiocb));[m
[31m-[m
[31m-    aio->aiocb.aio_fildes = file->fd;[m
[31m-    aio->aiocb.aio_offset = offset;[m
[31m-    aio->aiocb.aio_buf = buf;[m
[31m-    aio->aiocb.aio_nbytes = size;[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-    aio->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;[m
[31m-    aio->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;[m
[31m-    aio->aiocb.aio_sigevent.sigev_value.sigval_ptr = ev;[m
[31m-#endif[m
[31m-    ev->handler = ngx_file_aio_event_handler;[m
[31m-[m
[31m-    n = aio_read(&aio->aiocb);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        n = ngx_errno;[m
[31m-[m
[31m-        if (n == NGX_EAGAIN) {[m
[31m-            return ngx_read_file(file, buf, size, offset);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, n,[m
[31m-                      "aio_read(\"%V\") failed", &file->name);[m
[31m-[m
[31m-        if (n == NGX_ENOSYS) {[m
[31m-            ngx_file_aio = 0;[m
[31m-            return ngx_read_file(file, buf, size, offset);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio_read: fd:%d %d", file->fd, n);[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-    ev->ready = 0;[m
[31m-    ev->complete = 0;[m
[31m-[m
[31m-    return ngx_file_aio_result(aio->file, aio, ev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_file_aio_result(ngx_file_t *file, ngx_event_aio_t *aio, ngx_event_t *ev)[m
[31m-{[m
[31m-    int        n;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    n = aio_error(&aio->aiocb);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio_error: fd:%d %d", file->fd, n);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-        aio->err = err;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, file->log, err,[m
[31m-                      "aio_error(\"%V\") failed", &file->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_EINPROGRESS) {[m
[31m-        if (ev->ready) {[m
[31m-            ev->ready = 0;[m
[31m-            ngx_log_error(NGX_LOG_ALERT, file->log, n,[m
[31m-                          "aio_read(\"%V\") still in progress",[m
[31m-                          &file->name);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    n = aio_return(&aio->aiocb);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-        aio->err = err;[m
[31m-        ev->ready = 1;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                      "aio_return(\"%V\") failed", &file->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio->err = 0;[m
[31m-    aio->nbytes = n;[m
[31m-    ev->ready = 1;[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio_return: fd:%d %d", file->fd, n);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_file_aio_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                   "aio event handler fd:%d %V", aio->fd, &aio->file->name);[m
[31m-[m
[31m-    if (ngx_file_aio_result(aio->file, aio, ev) != NGX_AGAIN) {[m
[31m-        aio->handler(ev);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_files.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_files.c[m
[1mdeleted file mode 100644[m
[1mindex 7fbb7c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_files.c[m
[1m+++ /dev/null[m
[36m@@ -1,906 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-#include <ngx_thread_pool.h>[m
[31m-static void ngx_thread_read_handler(void *data, ngx_log_t *log);[m
[31m-static void ngx_thread_write_chain_to_file_handler(void *data, ngx_log_t *log);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_chain_t *ngx_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *cl);[m
[31m-static ssize_t ngx_writev_file(ngx_file_t *file, ngx_iovec_t *vec,[m
[31m-    off_t offset);[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-ngx_uint_t  ngx_file_aio = 1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)[m
[31m-{[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "read: %d, %p, %uz, %O", file->fd, buf, size, offset);[m
[31m-[m
[31m-#if (NGX_HAVE_PREAD)[m
[31m-[m
[31m-    n = pread(file->fd, buf, size, offset);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                      "pread() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (file->sys_offset != offset) {[m
[31m-        if (lseek(file->fd, offset, SEEK_SET) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                          "lseek() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->sys_offset = offset;[m
[31m-    }[m
[31m-[m
[31m-    n = read(file->fd, buf, size);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                      "read() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->sys_offset += n;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    file->offset += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_fd_t       fd;[m
[31m-    ngx_uint_t     write;   /* unsigned  write:1; */[m
[31m-[m
[31m-    u_char        *buf;[m
[31m-    size_t         size;[m
[31m-    ngx_chain_t   *chain;[m
[31m-    off_t          offset;[m
[31m-[m
[31m-    size_t         nbytes;[m
[31m-    ngx_err_t      err;[m
[31m-} ngx_thread_file_ctx_t;[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_thread_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_thread_task_t      *task;[m
[31m-    ngx_thread_file_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "thread read: %d, %p, %uz, %O",[m
[31m-                   file->fd, buf, size, offset);[m
[31m-[m
[31m-    task = file->thread_task;[m
[31m-[m
[31m-    if (task == NULL) {[m
[31m-        task = ngx_thread_task_alloc(pool, sizeof(ngx_thread_file_ctx_t));[m
[31m-        if (task == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->thread_task = task;[m
[31m-    }[m
[31m-[m
[31m-    ctx = task->ctx;[m
[31m-[m
[31m-    if (task->event.complete) {[m
[31m-        task->event.complete = 0;[m
[31m-[m
[31m-        if (ctx->write) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, file->log, 0,[m
[31m-                          "invalid thread call, read instead of write");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->err) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ctx->err,[m
[31m-                          "pread() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return ctx->nbytes;[m
[31m-    }[m
[31m-[m
[31m-    task->handler = ngx_thread_read_handler;[m
[31m-[m
[31m-    ctx->write = 0;[m
[31m-[m
[31m-    ctx->fd = file->fd;[m
[31m-    ctx->buf = buf;[m
[31m-    ctx->size = size;[m
[31m-    ctx->offset = offset;[m
[31m-[m
[31m-    if (file->thread_handler(task, file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_PREAD)[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_read_handler(void *data, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_thread_file_ctx_t *ctx = data;[m
[31m-[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "thread read handler");[m
[31m-[m
[31m-    n = pread(ctx->fd, ctx->buf, ctx->size, ctx->offset);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ctx->err = ngx_errno;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->nbytes = n;[m
[31m-        ctx->err = 0;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pread: %z (err: %d) of %uz @%O",[m
[31m-                   n, ctx->err, ctx->size, ctx->offset);[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#error pread() is required![m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_THREADS */[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)[m
[31m-{[m
[31m-    ssize_t    n, written;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "write: %d, %p, %uz, %O", file->fd, buf, size, offset);[m
[31m-[m
[31m-    written = 0;[m
[31m-[m
[31m-#if (NGX_HAVE_PWRITE)[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = pwrite(file->fd, buf + written, size, offset);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_EINTR) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,[m
[31m-                               "pwrite() was interrupted");[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                          "pwrite() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->offset += n;[m
[31m-        written += n;[m
[31m-[m
[31m-        if ((size_t) n == size) {[m
[31m-            return written;[m
[31m-        }[m
[31m-[m
[31m-        offset += n;[m
[31m-        size -= n;[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (file->sys_offset != offset) {[m
[31m-        if (lseek(file->fd, offset, SEEK_SET) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                          "lseek() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->sys_offset = offset;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = write(file->fd, buf + written, size);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_EINTR) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,[m
[31m-                               "write() was interrupted");[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                          "write() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->sys_offset += n;[m
[31m-        file->offset += n;[m
[31m-        written += n;[m
[31m-[m
[31m-        if ((size_t) n == size) {[m
[31m-            return written;[m
[31m-        }[m
[31m-[m
[31m-        size -= n;[m
[31m-    }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_fd_t[m
[31m-ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access)[m
[31m-{[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR,[m
[31m-              access ? access : 0600);[m
[31m-[m
[31m-    if (fd != -1 && !persistent) {[m
[31m-        (void) unlink((const char *) name);[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    ssize_t        total, n;[m
[31m-    ngx_iovec_t    vec;[m
[31m-    struct iovec   iovs[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    /* use pwrite() if there is the only buf in a chain */[m
[31m-[m
[31m-    if (cl->next == NULL) {[m
[31m-        return ngx_write_file(file, cl->buf->pos,[m
[31m-                              (size_t) (cl->buf->last - cl->buf->pos),[m
[31m-                              offset);[m
[31m-    }[m
[31m-[m
[31m-    total = 0;[m
[31m-[m
[31m-    vec.iovs = iovs;[m
[31m-    vec.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    do {[m
[31m-        /* create the iovec and coalesce the neighbouring bufs */[m
[31m-        cl = ngx_chain_to_iovec(&vec, cl);[m
[31m-[m
[31m-        /* use pwrite() if there is the only iovec buffer */[m
[31m-[m
[31m-        if (vec.count == 1) {[m
[31m-            n = ngx_write_file(file, (u_char *) iovs[0].iov_base,[m
[31m-                               iovs[0].iov_len, offset);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return n;[m
[31m-            }[m
[31m-[m
[31m-            return total + n;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_writev_file(file, &vec, offset);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        offset += n;[m
[31m-        total += n;[m
[31m-[m
[31m-    } while (cl);[m
[31m-[m
[31m-    return total;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *cl)[m
[31m-{[m
[31m-    size_t         total, size;[m
[31m-    u_char        *prev;[m
[31m-    ngx_uint_t     n;[m
[31m-    struct iovec  *iov;[m
[31m-[m
[31m-    iov = NULL;[m
[31m-    prev = NULL;[m
[31m-    total = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-[m
[31m-        if (ngx_buf_special(cl->buf)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-        if (prev == cl->buf->pos) {[m
[31m-            iov->iov_len += size;[m
[31m-[m
[31m-        } else {[m
[31m-            if (n == vec->nalloc) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            iov = &vec->iovs[n++];[m
[31m-[m
[31m-            iov->iov_base = (void *) cl->buf->pos;[m
[31m-            iov->iov_len = size;[m
[31m-        }[m
[31m-[m
[31m-        prev = cl->buf->pos + size;[m
[31m-        total += size;[m
[31m-    }[m
[31m-[m
[31m-    vec->count = n;[m
[31m-    vec->size = total;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_writev_file(ngx_file_t *file, ngx_iovec_t *vec, off_t offset)[m
[31m-{[m
[31m-    ssize_t    n;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "writev: %d, %uz, %O", file->fd, vec->size, offset);[m
[31m-[m
[31m-#if (NGX_HAVE_PWRITEV)[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-    n = pwritev(file->fd, vec->iovs, vec->count, offset);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,[m
[31m-                           "pwritev() was interrupted");[m
[31m-            goto eintr;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                      "pwritev() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != vec->size) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, 0,[m
[31m-                      "pwritev() \"%s\" has written only %z of %uz",[m
[31m-                      file->name.data, n, vec->size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (file->sys_offset != offset) {[m
[31m-        if (lseek(file->fd, offset, SEEK_SET) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                          "lseek() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->sys_offset = offset;[m
[31m-    }[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-    n = writev(file->fd, vec->iovs, vec->count);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,[m
[31m-                           "writev() was interrupted");[m
[31m-            goto eintr;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                      "writev() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != vec->size) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, 0,[m
[31m-                      "writev() \"%s\" has written only %z of %uz",[m
[31m-                      file->name.data, n, vec->size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->sys_offset += n;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    file->offset += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_thread_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_thread_task_t      *task;[m
[31m-    ngx_thread_file_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "thread write chain: %d, %p, %O",[m
[31m-                   file->fd, cl, offset);[m
[31m-[m
[31m-    task = file->thread_task;[m
[31m-[m
[31m-    if (task == NULL) {[m
[31m-        task = ngx_thread_task_alloc(pool,[m
[31m-                                     sizeof(ngx_thread_file_ctx_t));[m
[31m-        if (task == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->thread_task = task;[m
[31m-    }[m
[31m-[m
[31m-    ctx = task->ctx;[m
[31m-[m
[31m-    if (task->event.complete) {[m
[31m-        task->event.complete = 0;[m
[31m-[m
[31m-        if (!ctx->write) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, file->log, 0,[m
[31m-                          "invalid thread call, write instead of read");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->err || ctx->nbytes == 0) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ctx->err,[m
[31m-                          "pwritev() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->offset += ctx->nbytes;[m
[31m-        return ctx->nbytes;[m
[31m-    }[m
[31m-[m
[31m-    task->handler = ngx_thread_write_chain_to_file_handler;[m
[31m-[m
[31m-    ctx->write = 1;[m
[31m-[m
[31m-    ctx->fd = file->fd;[m
[31m-    ctx->chain = cl;[m
[31m-    ctx->offset = offset;[m
[31m-[m
[31m-    if (file->thread_handler(task, file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_write_chain_to_file_handler(void *data, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_thread_file_ctx_t *ctx = data;[m
[31m-[m
[31m-#if (NGX_HAVE_PWRITEV)[m
[31m-[m
[31m-    off_t          offset;[m
[31m-    ssize_t        n;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_chain_t   *cl;[m
[31m-    ngx_iovec_t    vec;[m
[31m-    struct iovec   iovs[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    vec.iovs = iovs;[m
[31m-    vec.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    cl = ctx->chain;[m
[31m-    offset = ctx->offset;[m
[31m-[m
[31m-    ctx->nbytes = 0;[m
[31m-    ctx->err = 0;[m
[31m-[m
[31m-    do {[m
[31m-        /* create the iovec and coalesce the neighbouring bufs */[m
[31m-        cl = ngx_chain_to_iovec(&vec, cl);[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-        n = pwritev(ctx->fd, iovs, vec.count, offset);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_EINTR) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, err,[m
[31m-                               "pwritev() was interrupted");[m
[31m-                goto eintr;[m
[31m-            }[m
[31m-[m
[31m-            ctx->err = err;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) n != vec.size) {[m
[31m-            ctx->nbytes = 0;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->nbytes += n;[m
[31m-        offset += n;[m
[31m-    } while (cl);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ctx->err = NGX_ENOSYS;[m
[31m-    return;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_THREADS */[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s)[m
[31m-{[m
[31m-    struct timeval  tv[2];[m
[31m-[m
[31m-    tv[0].tv_sec = ngx_time();[m
[31m-    tv[0].tv_usec = 0;[m
[31m-    tv[1].tv_sec = s;[m
[31m-    tv[1].tv_usec = 0;[m
[31m-[m
[31m-    if (utimes((char *) name, tv) != -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_file_mapping(ngx_file_mapping_t *fm)[m
[31m-{[m
[31m-    fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE,[m
[31m-                           NGX_FILE_DEFAULT_ACCESS);[m
[31m-    if (fm->fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", fm->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ftruncate(fm->fd, fm->size) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "ftruncate() \"%s\" failed", fm->name);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fm->addr = mmap(NULL, fm->size, PROT_READ|PROT_WRITE, MAP_SHARED,[m
[31m-                    fm->fd, 0);[m
[31m-    if (fm->addr != MAP_FAILED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                  "mmap(%uz) \"%s\" failed", fm->size, fm->name);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", fm->name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_file_mapping(ngx_file_mapping_t *fm)[m
[31m-{[m
[31m-    if (munmap(fm->addr, fm->size) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "munmap(%uz) \"%s\" failed", fm->size, fm->name);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", fm->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    dir->dir = opendir((const char *) name->data);[m
[31m-[m
[31m-    if (dir->dir == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dir->valid_info = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_dir(ngx_dir_t *dir)[m
[31m-{[m
[31m-    dir->de = readdir(dir->dir);[m
[31m-[m
[31m-    if (dir->de) {[m
[31m-#if (NGX_HAVE_D_TYPE)[m
[31m-        dir->type = dir->de->d_type;[m
[31m-#else[m
[31m-        dir->type = 0;[m
[31m-#endif[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_glob(ngx_glob_t *gl)[m
[31m-{[m
[31m-    int  n;[m
[31m-[m
[31m-    n = glob((char *) gl->pattern, 0, NULL, &gl->pglob);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#ifdef GLOB_NOMATCH[m
[31m-[m
[31m-    if (n == GLOB_NOMATCH && gl->test) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)[m
[31m-{[m
[31m-    size_t  count;[m
[31m-[m
[31m-#ifdef GLOB_NOMATCH[m
[31m-    count = (size_t) gl->pglob.gl_pathc;[m
[31m-#else[m
[31m-    count = (size_t) gl->pglob.gl_matchc;[m
[31m-#endif[m
[31m-[m
[31m-    if (gl->n < count) {[m
[31m-[m
[31m-        name->len = (size_t) ngx_strlen(gl->pglob.gl_pathv[gl->n]);[m
[31m-        name->data = (u_char *) gl->pglob.gl_pathv[gl->n];[m
[31m-        gl->n++;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_glob(ngx_glob_t *gl)[m
[31m-{[m
[31m-    globfree(&gl->pglob);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_trylock_fd(ngx_fd_t fd)[m
[31m-{[m
[31m-    struct flock  fl;[m
[31m-[m
[31m-    ngx_memzero(&fl, sizeof(struct flock));[m
[31m-    fl.l_type = F_WRLCK;[m
[31m-    fl.l_whence = SEEK_SET;[m
[31m-[m
[31m-    if (fcntl(fd, F_SETLK, &fl) == -1) {[m
[31m-        return ngx_errno;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_lock_fd(ngx_fd_t fd)[m
[31m-{[m
[31m-    struct flock  fl;[m
[31m-[m
[31m-    ngx_memzero(&fl, sizeof(struct flock));[m
[31m-    fl.l_type = F_WRLCK;[m
[31m-    fl.l_whence = SEEK_SET;[m
[31m-[m
[31m-    if (fcntl(fd, F_SETLKW, &fl) == -1) {[m
[31m-        return ngx_errno;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_unlock_fd(ngx_fd_t fd)[m
[31m-{[m
[31m-    struct flock  fl;[m
[31m-[m
[31m-    ngx_memzero(&fl, sizeof(struct flock));[m
[31m-    fl.l_type = F_UNLCK;[m
[31m-    fl.l_whence = SEEK_SET;[m
[31m-[m
[31m-    if (fcntl(fd, F_SETLK, &fl) == -1) {[m
[31m-        return  ngx_errno;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_FADVISE) && !(NGX_HAVE_F_READAHEAD)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_ahead(ngx_fd_t fd, size_t n)[m
[31m-{[m
[31m-    int  err;[m
[31m-[m
[31m-    err = posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_set_errno(err);[m
[31m-    return NGX_FILE_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_O_DIRECT)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_directio_on(ngx_fd_t fd)[m
[31m-{[m
[31m-    int  flags;[m
[31m-[m
[31m-    flags = fcntl(fd, F_GETFL);[m
[31m-[m
[31m-    if (flags == -1) {[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return fcntl(fd, F_SETFL, flags | O_DIRECT);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_directio_off(ngx_fd_t fd)[m
[31m-{[m
[31m-    int  flags;[m
[31m-[m
[31m-    flags = fcntl(fd, F_GETFL);[m
[31m-[m
[31m-    if (flags == -1) {[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return fcntl(fd, F_SETFL, flags & ~O_DIRECT);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_STATFS)[m
[31m-[m
[31m-size_t[m
[31m-ngx_fs_bsize(u_char *name)[m
[31m-{[m
[31m-    struct statfs  fs;[m
[31m-[m
[31m-    if (statfs((char *) name, &fs) == -1) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    if ((fs.f_bsize % 512) != 0) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    return (size_t) fs.f_bsize;[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_STATVFS)[m
[31m-[m
[31m-size_t[m
[31m-ngx_fs_bsize(u_char *name)[m
[31m-{[m
[31m-    struct statvfs  fs;[m
[31m-[m
[31m-    if (statvfs((char *) name, &fs) == -1) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    if ((fs.f_frsize % 512) != 0) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    return (size_t) fs.f_frsize;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-size_t[m
[31m-ngx_fs_bsize(u_char *name)[m
[31m-{[m
[31m-    return 512;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_files.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_files.h[m
[1mdeleted file mode 100644[m
[1mindex 07872b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_files.h[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FILES_H_INCLUDED_[m
[31m-#define _NGX_FILES_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef int                      ngx_fd_t;[m
[31m-typedef struct stat              ngx_file_info_t;[m
[31m-typedef ino_t                    ngx_file_uniq_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                      *name;[m
[31m-    size_t                       size;[m
[31m-    void                        *addr;[m
[31m-    ngx_fd_t                     fd;[m
[31m-    ngx_log_t                   *log;[m
[31m-} ngx_file_mapping_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    DIR                         *dir;[m
[31m-    struct dirent               *de;[m
[31m-    struct stat                  info;[m
[31m-[m
[31m-    unsigned                     type:8;[m
[31m-    unsigned                     valid_info:1;[m
[31m-} ngx_dir_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                       n;[m
[31m-    glob_t                       pglob;[m
[31m-    u_char                      *pattern;[m
[31m-    ngx_log_t                   *log;[m
[31m-    ngx_uint_t                   test;[m
[31m-} ngx_glob_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_INVALID_FILE         -1[m
[31m-#define NGX_FILE_ERROR           -1[m
[31m-[m
[31m-[m
[31m-[m
[31m-#ifdef __CYGWIN__[m
[31m-[m
[31m-#ifndef NGX_HAVE_CASELESS_FILESYSTEM[m
[31m-#define NGX_HAVE_CASELESS_FILESYSTEM  1[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_open_file(name, mode, create, access)                            \[m
[31m-    open((const char *) name, mode|create|O_BINARY, access)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_open_file(name, mode, create, access)                            \[m
[31m-    open((const char *) name, mode|create, access)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_open_file_n          "open()"[m
[31m-[m
[31m-#define NGX_FILE_RDONLY          O_RDONLY[m
[31m-#define NGX_FILE_WRONLY          O_WRONLY[m
[31m-#define NGX_FILE_RDWR            O_RDWR[m
[31m-#define NGX_FILE_CREATE_OR_OPEN  O_CREAT[m
[31m-#define NGX_FILE_OPEN            0[m
[31m-#define NGX_FILE_TRUNCATE        (O_CREAT|O_TRUNC)[m
[31m-#define NGX_FILE_APPEND          (O_WRONLY|O_APPEND)[m
[31m-#define NGX_FILE_NONBLOCK        O_NONBLOCK[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-#define NGX_FILE_NOFOLLOW        O_NOFOLLOW[m
[31m-[m
[31m-#if defined(O_DIRECTORY)[m
[31m-#define NGX_FILE_DIRECTORY       O_DIRECTORY[m
[31m-#else[m
[31m-#define NGX_FILE_DIRECTORY       0[m
[31m-#endif[m
[31m-[m
[31m-#if defined(O_SEARCH)[m
[31m-#define NGX_FILE_SEARCH          (O_SEARCH|NGX_FILE_DIRECTORY)[m
[31m-[m
[31m-#elif defined(O_EXEC)[m
[31m-#define NGX_FILE_SEARCH          (O_EXEC|NGX_FILE_DIRECTORY)[m
[31m-[m
[31m-#elif (NGX_HAVE_O_PATH)[m
[31m-#define NGX_FILE_SEARCH          (O_PATH|O_RDONLY|NGX_FILE_DIRECTORY)[m
[31m-[m
[31m-#else[m
[31m-#define NGX_FILE_SEARCH          (O_RDONLY|NGX_FILE_DIRECTORY)[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_HAVE_OPENAT */[m
[31m-[m
[31m-#define NGX_FILE_DEFAULT_ACCESS  0644[m
[31m-#define NGX_FILE_OWNER_ACCESS    0600[m
[31m-[m
[31m-[m
[31m-#define ngx_close_file           close[m
[31m-#define ngx_close_file_n         "close()"[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_file(name)    unlink((const char *) name)[m
[31m-#define ngx_delete_file_n        "unlink()"[m
[31m-[m
[31m-[m
[31m-ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent,[m
[31m-    ngx_uint_t access);[m
[31m-#define ngx_open_tempfile_n      "open()"[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset);[m
[31m-#if (NGX_HAVE_PREAD)[m
[31m-#define ngx_read_file_n          "pread()"[m
[31m-#else[m
[31m-#define ngx_read_file_n          "read()"[m
[31m-#endif[m
[31m-[m
[31m-ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size,[m
[31m-    off_t offset);[m
[31m-[m
[31m-ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-[m
[31m-[m
[31m-#define ngx_read_fd              read[m
[31m-#define ngx_read_fd_n            "read()"[m
[31m-[m
[31m-/*[m
[31m- * we use inlined function instead of simple #define[m
[31m- * because glibc 2.3 sets warn_unused_result attribute for write()[m
[31m- * and in this case gcc 4.3 ignores (void) cast[m
[31m- */[m
[31m-static ngx_inline ssize_t[m
[31m-ngx_write_fd(ngx_fd_t fd, void *buf, size_t n)[m
[31m-{[m
[31m-    return write(fd, buf, n);[m
[31m-}[m
[31m-[m
[31m-#define ngx_write_fd_n           "write()"[m
[31m-[m
[31m-[m
[31m-#define ngx_write_console        ngx_write_fd[m
[31m-[m
[31m-[m
[31m-#define ngx_linefeed(p)          *p++ = LF;[m
[31m-#define NGX_LINEFEED_SIZE        1[m
[31m-#define NGX_LINEFEED             "\x0a"[m
[31m-[m
[31m-[m
[31m-#define ngx_rename_file(o, n)    rename((const char *) o, (const char *) n)[m
[31m-#define ngx_rename_file_n        "rename()"[m
[31m-[m
[31m-[m
[31m-#define ngx_change_file_access(n, a) chmod((const char *) n, a)[m
[31m-#define ngx_change_file_access_n "chmod()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s);[m
[31m-#define ngx_set_file_time_n      "utimes()"[m
[31m-[m
[31m-[m
[31m-#define ngx_file_info(file, sb)  stat((const char *) file, sb)[m
[31m-#define ngx_file_info_n          "stat()"[m
[31m-[m
[31m-#define ngx_fd_info(fd, sb)      fstat(fd, sb)[m
[31m-#define ngx_fd_info_n            "fstat()"[m
[31m-[m
[31m-#define ngx_link_info(file, sb)  lstat((const char *) file, sb)[m
[31m-#define ngx_link_info_n          "lstat()"[m
[31m-[m
[31m-#define ngx_is_dir(sb)           (S_ISDIR((sb)->st_mode))[m
[31m-#define ngx_is_file(sb)          (S_ISREG((sb)->st_mode))[m
[31m-#define ngx_is_link(sb)          (S_ISLNK((sb)->st_mode))[m
[31m-#define ngx_is_exec(sb)          (((sb)->st_mode & S_IXUSR) == S_IXUSR)[m
[31m-#define ngx_file_access(sb)      ((sb)->st_mode & 0777)[m
[31m-#define ngx_file_size(sb)        (sb)->st_size[m
[31m-#define ngx_file_fs_size(sb)     ngx_max((sb)->st_size, (sb)->st_blocks * 512)[m
[31m-#define ngx_file_mtime(sb)       (sb)->st_mtime[m
[31m-#define ngx_file_uniq(sb)        (sb)->st_ino[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_create_file_mapping(ngx_file_mapping_t *fm);[m
[31m-void ngx_close_file_mapping(ngx_file_mapping_t *fm);[m
[31m-[m
[31m-[m
[31m-#define ngx_realpath(p, r)       (u_char *) realpath((char *) p, (char *) r)[m
[31m-#define ngx_realpath_n           "realpath()"[m
[31m-#define ngx_getcwd(buf, size)    (getcwd((char *) buf, size) != NULL)[m
[31m-#define ngx_getcwd_n             "getcwd()"[m
[31m-#define ngx_path_separator(c)    ((c) == '/')[m
[31m-[m
[31m-[m
[31m-#if defined(PATH_MAX)[m
[31m-[m
[31m-#define NGX_HAVE_MAX_PATH        1[m
[31m-#define NGX_MAX_PATH             PATH_MAX[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define NGX_MAX_PATH             4096[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_DIR_MASK_LEN         0[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir);[m
[31m-#define ngx_open_dir_n           "opendir()"[m
[31m-[m
[31m-[m
[31m-#define ngx_close_dir(d)         closedir((d)->dir)[m
[31m-#define ngx_close_dir_n          "closedir()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_read_dir(ngx_dir_t *dir);[m
[31m-#define ngx_read_dir_n           "readdir()"[m
[31m-[m
[31m-[m
[31m-#define ngx_create_dir(name, access) mkdir((const char *) name, access)[m
[31m-#define ngx_create_dir_n         "mkdir()"[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_dir(name)     rmdir((const char *) name)[m
[31m-#define ngx_delete_dir_n         "rmdir()"[m
[31m-[m
[31m-[m
[31m-#define ngx_dir_access(a)        (a | (a & 0444) >> 2)[m
[31m-[m
[31m-[m
[31m-#define ngx_de_name(dir)         ((u_char *) (dir)->de->d_name)[m
[31m-#if (NGX_HAVE_D_NAMLEN)[m
[31m-#define ngx_de_namelen(dir)      (dir)->de->d_namlen[m
[31m-#else[m
[31m-#define ngx_de_namelen(dir)      ngx_strlen((dir)->de->d_name)[m
[31m-#endif[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_de_info(u_char *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    dir->type = 0;[m
[31m-    return stat((const char *) name, &dir->info);[m
[31m-}[m
[31m-[m
[31m-#define ngx_de_info_n            "stat()"[m
[31m-#define ngx_de_link_info(name, dir)  lstat((const char *) name, &(dir)->info)[m
[31m-#define ngx_de_link_info_n       "lstat()"[m
[31m-[m
[31m-#if (NGX_HAVE_D_TYPE)[m
[31m-[m
[31m-/*[m
[31m- * some file systems (e.g. XFS on Linux and CD9660 on FreeBSD)[m
[31m- * do not set dirent.d_type[m
[31m- */[m
[31m-[m
[31m-#define ngx_de_is_dir(dir)                                                   \[m
[31m-    (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode)))[m
[31m-#define ngx_de_is_file(dir)                                                  \[m
[31m-    (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode)))[m
[31m-#define ngx_de_is_link(dir)                                                  \[m
[31m-    (((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode)))[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_de_is_dir(dir)       (S_ISDIR((dir)->info.st_mode))[m
[31m-#define ngx_de_is_file(dir)      (S_ISREG((dir)->info.st_mode))[m
[31m-#define ngx_de_is_link(dir)      (S_ISLNK((dir)->info.st_mode))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_de_access(dir)       (((dir)->info.st_mode) & 0777)[m
[31m-#define ngx_de_size(dir)         (dir)->info.st_size[m
[31m-#define ngx_de_fs_size(dir)                                                  \[m
[31m-    ngx_max((dir)->info.st_size, (dir)->info.st_blocks * 512)[m
[31m-#define ngx_de_mtime(dir)        (dir)->info.st_mtime[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_open_glob(ngx_glob_t *gl);[m
[31m-#define ngx_open_glob_n          "glob()"[m
[31m-ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name);[m
[31m-void ngx_close_glob(ngx_glob_t *gl);[m
[31m-[m
[31m-[m
[31m-ngx_err_t ngx_trylock_fd(ngx_fd_t fd);[m
[31m-ngx_err_t ngx_lock_fd(ngx_fd_t fd);[m
[31m-ngx_err_t ngx_unlock_fd(ngx_fd_t fd);[m
[31m-[m
[31m-#define ngx_trylock_fd_n         "fcntl(F_SETLK, F_WRLCK)"[m
[31m-#define ngx_lock_fd_n            "fcntl(F_SETLKW, F_WRLCK)"[m
[31m-#define ngx_unlock_fd_n          "fcntl(F_SETLK, F_UNLCK)"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_F_READAHEAD)[m
[31m-[m
[31m-#define NGX_HAVE_READ_AHEAD      1[m
[31m-[m
[31m-#define ngx_read_ahead(fd, n)    fcntl(fd, F_READAHEAD, (int) n)[m
[31m-#define ngx_read_ahead_n         "fcntl(fd, F_READAHEAD)"[m
[31m-[m
[31m-#elif (NGX_HAVE_POSIX_FADVISE)[m
[31m-[m
[31m-#define NGX_HAVE_READ_AHEAD      1[m
[31m-[m
[31m-ngx_int_t ngx_read_ahead(ngx_fd_t fd, size_t n);[m
[31m-#define ngx_read_ahead_n         "posix_fadvise(POSIX_FADV_SEQUENTIAL)"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_read_ahead(fd, n)    0[m
[31m-#define ngx_read_ahead_n         "ngx_read_ahead_n"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_O_DIRECT)[m
[31m-[m
[31m-ngx_int_t ngx_directio_on(ngx_fd_t fd);[m
[31m-#define ngx_directio_on_n        "fcntl(O_DIRECT)"[m
[31m-[m
[31m-ngx_int_t ngx_directio_off(ngx_fd_t fd);[m
[31m-#define ngx_directio_off_n       "fcntl(!O_DIRECT)"[m
[31m-[m
[31m-#elif (NGX_HAVE_F_NOCACHE)[m
[31m-[m
[31m-#define ngx_directio_on(fd)      fcntl(fd, F_NOCACHE, 1)[m
[31m-#define ngx_directio_on_n        "fcntl(F_NOCACHE, 1)"[m
[31m-[m
[31m-#elif (NGX_HAVE_DIRECTIO)[m
[31m-[m
[31m-#define ngx_directio_on(fd)      directio(fd, DIRECTIO_ON)[m
[31m-#define ngx_directio_on_n        "directio(DIRECTIO_ON)"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_directio_on(fd)      0[m
[31m-#define ngx_directio_on_n        "ngx_directio_on_n"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-size_t ngx_fs_bsize(u_char *name);[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-#define ngx_openat_file(fd, name, mode, create, access)                      \[m
[31m-    openat(fd, (const char *) name, mode|create, access)[m
[31m-[m
[31m-#define ngx_openat_file_n        "openat()"[m
[31m-[m
[31m-#define ngx_file_at_info(fd, name, sb, flag)                                 \[m
[31m-    fstatat(fd, (const char *) name, sb, flag)[m
[31m-[m
[31m-#define ngx_file_at_info_n       "fstatat()"[m
[31m-[m
[31m-#define NGX_AT_FDCWD             (ngx_fd_t) AT_FDCWD[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_stdout               STDOUT_FILENO[m
[31m-#define ngx_stderr               STDERR_FILENO[m
[31m-#define ngx_set_stderr(fd)       dup2(fd, STDERR_FILENO)[m
[31m-#define ngx_set_stderr_n         "dup2(STDERR_FILENO)"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-ngx_int_t ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool);[m
[31m-ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-[m
[31m-extern ngx_uint_t  ngx_file_aio;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-ssize_t ngx_thread_read(ngx_file_t *file, u_char *buf, size_t size,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-ssize_t ngx_thread_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FILES_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd.h[m
[1mdeleted file mode 100644[m
[1mindex 4f93da5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FREEBSD_H_INCLUDED_[m
[31m-#define _NGX_FREEBSD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-void ngx_debug_init(void);[m
[31m-ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-extern int         ngx_freebsd_kern_osreldate;[m
[31m-extern int         ngx_freebsd_hw_ncpu;[m
[31m-extern u_long      ngx_freebsd_net_inet_tcp_sendspace;[m
[31m-[m
[31m-extern ngx_uint_t  ngx_freebsd_sendfile_nbytes_bug;[m
[31m-extern ngx_uint_t  ngx_freebsd_use_tcp_nopush;[m
[31m-extern ngx_uint_t  ngx_debug_malloc;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FREEBSD_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_config.h[m
[1mdeleted file mode 100644[m
[1mindex b7da48c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,123 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FREEBSD_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_FREEBSD_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <unistd.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <time.h>[m
[31m-#include <sys/param.h>          /* ALIGN() */[m
[31m-#include <sys/mount.h>          /* statfs() */[m
[31m-[m
[31m-#include <sys/filio.h>          /* FIONBIO */[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY, TCP_NOPUSH */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#include <libutil.h>            /* setproctitle() before 4.1 */[m
[31m-#include <osreldate.h>[m
[31m-#include <sys/sysctl.h>[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-[m
[31m-#if __FreeBSD_version < 400017[m
[31m-[m
[31m-/*[m
[31m- * FreeBSD 3.x has no CMSG_SPACE() and CMSG_LEN() and has the broken CMSG_DATA()[m
[31m- */[m
[31m-[m
[31m-#undef  CMSG_SPACE[m
[31m-#define CMSG_SPACE(l)       (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l))[m
[31m-[m
[31m-#undef  CMSG_LEN[m
[31m-#define CMSG_LEN(l)         (ALIGN(sizeof(struct cmsghdr)) + (l))[m
[31m-[m
[31m-#undef  CMSG_DATA[m
[31m-#define CMSG_DATA(cmsg)     ((u_char *)(cmsg) + ALIGN(sizeof(struct cmsghdr)))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-#include <sys/event.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-#include <aio.h>[m
[31m-typedef struct aiocb  ngx_aiocb_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG        -1[m
[31m-[m
[31m-[m
[31m-#ifdef __DragonFly__[m
[31m-#define NGX_KEEPALIVE_FACTOR      1000[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef IOV_MAX[m
[31m-#define IOV_MAX   1024[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_OS_SPECIFIC_INIT    1[m
[31m-#define NGX_HAVE_DEBUG_MALLOC        1[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-extern char  *malloc_options;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_init.c[m
[1mdeleted file mode 100644[m
[1mindex 71672c7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/* FreeBSD 3.0 at least */[m
[31m-char    ngx_freebsd_kern_ostype[16];[m
[31m-char    ngx_freebsd_kern_osrelease[128];[m
[31m-int     ngx_freebsd_kern_osreldate;[m
[31m-int     ngx_freebsd_hw_ncpu;[m
[31m-int     ngx_freebsd_kern_ipc_somaxconn;[m
[31m-u_long  ngx_freebsd_net_inet_tcp_sendspace;[m
[31m-[m
[31m-/* FreeBSD 4.9 */[m
[31m-int     ngx_freebsd_machdep_hlt_logical_cpus;[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_freebsd_sendfile_nbytes_bug;[m
[31m-ngx_uint_t  ngx_freebsd_use_tcp_nopush;[m
[31m-[m
[31m-ngx_uint_t  ngx_debug_malloc;[m
[31m-[m
[31m-[m
[31m-static ngx_os_io_t ngx_freebsd_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-    ngx_freebsd_sendfile_chain,[m
[31m-    NGX_IO_SENDFILE[m
[31m-#else[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char        *name;[m
[31m-    void        *value;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   exists;[m
[31m-} sysctl_t;[m
[31m-[m
[31m-[m
[31m-sysctl_t sysctls[] = {[m
[31m-    { "hw.ncpu",[m
[31m-      &ngx_freebsd_hw_ncpu,[m
[31m-      sizeof(ngx_freebsd_hw_ncpu), 0 },[m
[31m-[m
[31m-    { "machdep.hlt_logical_cpus",[m
[31m-      &ngx_freebsd_machdep_hlt_logical_cpus,[m
[31m-      sizeof(ngx_freebsd_machdep_hlt_logical_cpus), 0 },[m
[31m-[m
[31m-    { "net.inet.tcp.sendspace",[m
[31m-      &ngx_freebsd_net_inet_tcp_sendspace,[m
[31m-      sizeof(ngx_freebsd_net_inet_tcp_sendspace), 0 },[m
[31m-[m
[31m-    { "kern.ipc.somaxconn",[m
[31m-      &ngx_freebsd_kern_ipc_somaxconn,[m
[31m-      sizeof(ngx_freebsd_kern_ipc_somaxconn), 0 },[m
[31m-[m
[31m-    { NULL, NULL, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_debug_init(void)[m
[31m-{[m
[31m-#if (NGX_DEBUG_MALLOC)[m
[31m-[m
[31m-#if __FreeBSD_version >= 500014 && __FreeBSD_version < 1000011[m
[31m-    _malloc_options = "J";[m
[31m-#elif __FreeBSD_version < 500014[m
[31m-    malloc_options = "J";[m
[31m-#endif[m
[31m-[m
[31m-    ngx_debug_malloc = 1;[m
[31m-[m
[31m-#else[m
[31m-    char  *mo;[m
[31m-[m
[31m-    mo = getenv("MALLOC_OPTIONS");[m
[31m-[m
[31m-    if (mo && ngx_strchr(mo, 'J')) {[m
[31m-        ngx_debug_malloc = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_specific_init(ngx_log_t *log)[m
[31m-{[m
[31m-    int         version;[m
[31m-    size_t      size;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    size = sizeof(ngx_freebsd_kern_ostype);[m
[31m-    if (sysctlbyname("kern.ostype",[m
[31m-                     ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysctlbyname(kern.ostype) failed");[m
[31m-[m
[31m-        if (ngx_errno != NGX_ENOMEM) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_freebsd_kern_ostype[size - 1] = '\0';[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof(ngx_freebsd_kern_osrelease);[m
[31m-    if (sysctlbyname("kern.osrelease",[m
[31m-                     ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysctlbyname(kern.osrelease) failed");[m
[31m-[m
[31m-        if (ngx_errno != NGX_ENOMEM) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_freebsd_kern_osrelease[size - 1] = '\0';[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = sizeof(int);[m
[31m-    if (sysctlbyname("kern.osreldate",[m
[31m-                     &ngx_freebsd_kern_osreldate, &size, NULL, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysctlbyname(kern.osreldate) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    version = ngx_freebsd_kern_osreldate;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-[m
[31m-    /*[m
[31m-     * The determination of the sendfile() "nbytes bug" is complex enough.[m
[31m-     * There are two sendfile() syscalls: a new #393 has no bug while[m
[31m-     * an old #336 has the bug in some versions and has not in others.[m
[31m-     * Besides libc_r wrapper also emulates the bug in some versions.[m
[31m-     * There is no way to say exactly if syscall #336 in FreeBSD circa 4.6[m
[31m-     * has the bug.  We use the algorithm that is correct at least for[m
[31m-     * RELEASEs and for syscalls only (not libc_r wrapper).[m
[31m-     *[m
[31m-     * 4.6.1-RELEASE and below have the bug[m
[31m-     * 4.6.2-RELEASE and above have the new syscall[m
[31m-     *[m
[31m-     * We detect the new sendfile() syscall available at the compile time[m
[31m-     * to allow an old binary to run correctly on an updated FreeBSD system.[m
[31m-     */[m
[31m-[m
[31m-#if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \[m
[31m-    || __FreeBSD_version == 460002 || __FreeBSD_version >= 500039[m
[31m-[m
[31m-    /* a new syscall without the bug */[m
[31m-[m
[31m-    ngx_freebsd_sendfile_nbytes_bug = 0;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    /* an old syscall that may have the bug */[m
[31m-[m
[31m-    ngx_freebsd_sendfile_nbytes_bug = 1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_HAVE_SENDFILE */[m
[31m-[m
[31m-[m
[31m-    if ((version < 500000 && version >= 440003) || version >= 500017) {[m
[31m-        ngx_freebsd_use_tcp_nopush = 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (i = 0; sysctls[i].name; i++) {[m
[31m-        size = sysctls[i].size;[m
[31m-[m
[31m-        if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            sysctls[i].exists = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "sysctlbyname(%s) failed", sysctls[i].name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_freebsd_machdep_hlt_logical_cpus) {[m
[31m-        ngx_ncpu = ngx_freebsd_hw_ncpu / 2;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_ncpu = ngx_freebsd_hw_ncpu;[m
[31m-    }[m
[31m-[m
[31m-    if (version < 600008 && ngx_freebsd_kern_ipc_somaxconn > 32767) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "sysctl kern.ipc.somaxconn must be less than 32768");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_tcp_nodelay_and_tcp_nopush = 1;[m
[31m-[m
[31m-    ngx_os_io = ngx_freebsd_io;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_specific_status(ngx_log_t *log)[m
[31m-{[m
[31m-    u_long      value;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",[m
[31m-                  ngx_freebsd_kern_ostype, ngx_freebsd_kern_osrelease);[m
[31m-[m
[31m-#ifdef __DragonFly_version[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                  "kern.osreldate: %d, built on %d",[m
[31m-                  ngx_freebsd_kern_osreldate, __DragonFly_version);[m
[31m-#else[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                  "kern.osreldate: %d, built on %d",[m
[31m-                  ngx_freebsd_kern_osreldate, __FreeBSD_version);[m
[31m-#endif[m
[31m-[m
[31m-    for (i = 0; sysctls[i].name; i++) {[m
[31m-        if (sysctls[i].exists) {[m
[31m-            if (sysctls[i].size == sizeof(long)) {[m
[31m-                value = *(long *) sysctls[i].value;[m
[31m-[m
[31m-            } else {[m
[31m-                value = *(int *) sysctls[i].value;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",[m
[31m-                          sysctls[i].name, value);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_sendfile_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_sendfile_chain.c[m
[1mdeleted file mode 100644[m
[1mindex d0299f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_freebsd_sendfile_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,325 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Although FreeBSD sendfile() allows to pass a header and a trailer,[m
[31m- * it cannot send a header with a part of the file in one packet until[m
[31m- * FreeBSD 5.3.  Besides, over the fast ethernet connection sendfile()[m
[31m- * may send the partially filled packets, i.e. the 8 file pages may be sent[m
[31m- * as the 11 full 1460-bytes packets, then one incomplete 324-bytes packet,[m
[31m- * and then again the 11 full 1460-bytes packets.[m
[31m- *[m
[31m- * Therefore we use the TCP_NOPUSH option (similar to Linux's TCP_CORK)[m
[31m- * to postpone the sending - it not only sends a header and the first part of[m
[31m- * the file in one packet, but also sends the file pages in the full packets.[m
[31m- *[m
[31m- * But until FreeBSD 4.5 turning TCP_NOPUSH off does not flush a pending[m
[31m- * data that less than MSS, so that data may be sent with 5 second delay.[m
[31m- * So we do not use TCP_NOPUSH on FreeBSD prior to 4.5, although it can be used[m
[31m- * for non-keepalive HTTP connections.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int               rc, flags;[m
[31m-    off_t             send, prev_send, sent;[m
[31m-    size_t            file_size;[m
[31m-    ssize_t           n;[m
[31m-    ngx_uint_t        eintr, eagain;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_buf_t        *file;[m
[31m-    ngx_event_t      *wev;[m
[31m-    ngx_chain_t      *cl;[m
[31m-    ngx_iovec_t       header, trailer;[m
[31m-    struct sf_hdtr    hdtr;[m
[31m-    struct iovec      headers[NGX_IOVS_PREALLOCATE];[m
[31m-    struct iovec      trailers[NGX_IOVS_PREALLOCATE];[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    ngx_uint_t        ebusy;[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-#endif[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {[m
[31m-        (void) ngx_connection_error(c, wev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-        wev->error = 1;[m
[31m-        return NGX_CHAIN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* the maximum limit size is the maximum size_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    send = 0;[m
[31m-    eagain = 0;[m
[31m-    flags = 0;[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE && NGX_SUPPRESS_WARN)[m
[31m-    aio = NULL;[m
[31m-    file = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    header.iovs = headers;[m
[31m-    header.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    trailer.iovs = trailers;[m
[31m-    trailer.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        eintr = 0;[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-        ebusy = 0;[m
[31m-#endif[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        /* create the header iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log);[m
[31m-[m
[31m-        if (cl == NGX_CHAIN_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        send += header.size;[m
[31m-[m
[31m-        if (cl && cl->buf->in_file && send < limit) {[m
[31m-            file = cl->buf;[m
[31m-[m
[31m-            /* coalesce the neighbouring file bufs */[m
[31m-[m
[31m-            file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);[m
[31m-[m
[31m-            send += file_size;[m
[31m-[m
[31m-            /* create the trailer iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-            cl = ngx_output_chain_to_iovec(&trailer, cl, limit - send, c->log);[m
[31m-[m
[31m-            if (cl == NGX_CHAIN_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            send += trailer.size;[m
[31m-[m
[31m-            if (ngx_freebsd_use_tcp_nopush[m
[31m-                && c->tcp_nopush == NGX_TCP_NOPUSH_UNSET)[m
[31m-            {[m
[31m-                if (ngx_tcp_nopush(c->fd) == NGX_ERROR) {[m
[31m-                    err = ngx_socket_errno;[m
[31m-[m
[31m-                    /*[m
[31m-                     * there is a tiny chance to be interrupted, however,[m
[31m-                     * we continue a processing without the TCP_NOPUSH[m
[31m-                     */[m
[31m-[m
[31m-                    if (err != NGX_EINTR) {[m
[31m-                        wev->error = 1;[m
[31m-                        (void) ngx_connection_error(c, err,[m
[31m-                                                    ngx_tcp_nopush_n " failed");[m
[31m-                        return NGX_CHAIN_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    c->tcp_nopush = NGX_TCP_NOPUSH_SET;[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                                   "tcp_nopush");[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * sendfile() does unneeded work if sf_hdtr's count is 0,[m
[31m-             * but corresponding pointer is not NULL[m
[31m-             */[m
[31m-[m
[31m-            hdtr.headers = header.count ? header.iovs : NULL;[m
[31m-            hdtr.hdr_cnt = header.count;[m
[31m-            hdtr.trailers = trailer.count ? trailer.iovs : NULL;[m
[31m-            hdtr.trl_cnt = trailer.count;[m
[31m-[m
[31m-            /*[m
[31m-             * the "nbytes bug" of the old sendfile() syscall:[m
[31m-             * http://bugs.freebsd.org/33771[m
[31m-             */[m
[31m-[m
[31m-            if (!ngx_freebsd_sendfile_nbytes_bug) {[m
[31m-                header.size = 0;[m
[31m-            }[m
[31m-[m
[31m-            sent = 0;[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-            aio = file->file->aio;[m
[31m-            flags = (aio && aio->preload_handler) ? SF_NODISKIO : 0;[m
[31m-#endif[m
[31m-[m
[31m-            rc = sendfile(file->file->fd, c->fd, file->file_pos,[m
[31m-                          file_size + header.size, &hdtr, &sent, flags);[m
[31m-[m
[31m-            if (rc == -1) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                switch (err) {[m
[31m-                case NGX_EAGAIN:[m
[31m-                    eagain = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_EINTR:[m
[31m-                    eintr = 1;[m
[31m-                    break;[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-                case NGX_EBUSY:[m
[31m-                    ebusy = 1;[m
[31m-                    break;[m
[31m-#endif[m
[31m-[m
[31m-                default:[m
[31m-                    wev->error = 1;[m
[31m-                    (void) ngx_connection_error(c, err, "sendfile() failed");[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                               "sendfile() sent only %O bytes", sent);[m
[31m-[m
[31m-            /*[m
[31m-             * sendfile() in FreeBSD 3.x-4.x may return value >= 0[m
[31m-             * on success, although only 0 is documented[m
[31m-             */[m
[31m-[m
[31m-            } else if (rc >= 0 && sent == 0) {[m
[31m-[m
[31m-                /*[m
[31m-                 * if rc is OK and sent equal to zero, then someone[m
[31m-                 * has truncated the file, so the offset became beyond[m
[31m-                 * the end of the file[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                         "sendfile() reported that \"%s\" was truncated at %O",[m
[31m-                         file->file->name.data, file->file_pos);[m
[31m-[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "sendfile: %d, @%O %O:%uz",[m
[31m-                           rc, file->file_pos, sent, file_size + header.size);[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_writev(c, &header);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-        }[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-        if (ebusy) {[m
[31m-            if (aio->event.active) {[m
[31m-                /*[m
[31m-                 * tolerate duplicate calls; they can happen due to subrequests[m
[31m-                 * or multiple calls of the next body filter from a filter[m
[31m-                 */[m
[31m-[m
[31m-                if (sent) {[m
[31m-                    c->busy_count = 0;[m
[31m-                }[m
[31m-[m
[31m-                return in;[m
[31m-            }[m
[31m-[m
[31m-            if (sent == 0) {[m
[31m-                c->busy_count++;[m
[31m-[m
[31m-                if (c->busy_count > 2) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                                  "sendfile(%V) returned busy again",[m
[31m-                                  &file->file->name);[m
[31m-[m
[31m-                    c->busy_count = 0;[m
[31m-                    aio->preload_handler = NULL;[m
[31m-[m
[31m-                    send = prev_send;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                c->busy_count = 0;[m
[31m-            }[m
[31m-[m
[31m-            n = aio->preload_handler(file);[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                send = prev_send + sent;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (flags == SF_NODISKIO) {[m
[31m-            c->busy_count = 0;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (eagain) {[m
[31m-[m
[31m-            /*[m
[31m-             * sendfile() may return EAGAIN, even if it has sent a whole file[m
[31m-             * part, it indicates that the successive sendfile() call would[m
[31m-             * return EAGAIN right away and would not send anything.[m
[31m-             * We use it as a hint.[m
[31m-             */[m
[31m-[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (eintr) {[m
[31m-            send = prev_send + sent;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (send - prev_send != sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_amd64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_amd64.h[m
[1mdeleted file mode 100644[m
[1mindex 159a297..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_amd64.h[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define NGX_SMP_LOCK  "lock;"[m
[31m-#else[m
[31m-#define NGX_SMP_LOCK[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "cmpxchgq  r, [m]":[m
[31m- *[m
[31m- *     if (rax == [m]) {[m
[31m- *         zf = 1;[m
[31m- *         [m] = r;[m
[31m- *     } else {[m
[31m- *         zf = 0;[m
[31m- *         rax = [m];[m
[31m- *     }[m
[31m- *[m
[31m- *[m
[31m- * The "r" is any register, %rax (%r0) - %r16.[m
[31m- * The "=a" and "a" are the %rax register.[m
[31m- * Although we can return result in any register, we use "a" because it is[m
[31m- * used in cmpxchgq anyway.  The result is actually in %al but not in $rax,[m
[31m- * however as the code is inlined gcc can test %al as well as %rax.[m
[31m- *[m
[31m- * The "cc" means that flags were changed.[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    u_char  res;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    cmpxchgq  %3, %1;   "[m
[31m-    "    sete      %0;       "[m
[31m-[m
[31m-    : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "xaddq  r, [m]":[m
[31m- *[m
[31m- *     temp = [m];[m
[31m- *     [m] += r;[m
[31m- *     r = temp;[m
[31m- *[m
[31m- *[m
[31m- * The "+r" is any register, %rax (%r0) - %r16.[m
[31m- * The "cc" means that flags were changed.[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    xaddq  %0, %1;   "[m
[31m-[m
[31m-    : "+r" (add) : "m" (*value) : "cc", "memory");[m
[31m-[m
[31m-    return add;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_memory_barrier()    __asm__ volatile ("" ::: "memory")[m
[31m-[m
[31m-#define ngx_cpu_pause()         __asm__ ("pause")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex 45afc4b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The ppc assembler treats ";" as comment, so we have to use "\n".[m
[31m- * The minus in "bne-" is a hint for the branch prediction unit that[m
[31m- * this branch is unlikely to be taken.[m
[31m- * The "1b" means the nearest backward label "1" and the "1f" means[m
[31m- * the nearest forward label "1".[m
[31m- *[m
[31m- * The "b" means that the base registers can be used only, i.e.[m
[31m- * any register except r0.  The r0 register always has a zero value and[m
[31m- * could not be used in "addi  r0, r0, 1".[m
[31m- * The "=&b" means that no input registers can be used.[m
[31m- *[m
[31m- * "sync"    read and write barriers[m
[31m- * "isync"   read barrier, is faster than "sync"[m
[31m- * "eieio"   write barrier, is faster than "sync"[m
[31m- * "lwsync"  write barrier, is faster than "eieio" on ppc64[m
[31m- */[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  res, temp;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    "    li      %0, 0       \n" /* preset "0" to "res"                      */[m
[31m-    "    lwsync              \n" /* write barrier                            */[m
[31m-    "1:                      \n"[m
[31m-    "    ldarx   %1, 0, %2   \n" /* load from [lock] into "temp"             */[m
[31m-                                 /*   and store reservation                  */[m
[31m-    "    cmpd    %1, %3      \n" /* compare "temp" and "old"                 */[m
[31m-    "    bne-    2f          \n" /* not equal                                */[m
[31m-    "    stdcx.  %4, 0, %2   \n" /* store "set" into [lock] if reservation   */[m
[31m-                                 /*   is not cleared                         */[m
[31m-    "    bne-    1b          \n" /* the reservation was cleared              */[m
[31m-    "    isync               \n" /* read barrier                             */[m
[31m-    "    li      %0, 1       \n" /* set "1" to "res"                         */[m
[31m-    "2:                      \n"[m
[31m-[m
[31m-    : "=&b" (res), "=&b" (temp)[m
[31m-    : "b" (lock), "b" (old), "b" (set)[m
[31m-    : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  res, temp;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    "    lwsync              \n" /* write barrier                            */[m
[31m-    "1:  ldarx   %0, 0, %2   \n" /* load from [value] into "res"             */[m
[31m-                                 /*   and store reservation                  */[m
[31m-    "    add     %1, %0, %3  \n" /* "res" + "add" store in "temp"            */[m
[31m-    "    stdcx.  %1, 0, %2   \n" /* store "temp" into [value] if reservation */[m
[31m-                                 /*   is not cleared                         */[m
[31m-    "    bne-    1b          \n" /* try again if reservation was cleared     */[m
[31m-    "    isync               \n" /* read barrier                             */[m
[31m-[m
[31m-    : "=&b" (res), "=&b" (temp)[m
[31m-    : "b" (value), "b" (add)[m
[31m-    : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define ngx_memory_barrier()                                                  \[m
[31m-    __asm__ volatile ("isync  \n  lwsync  \n" ::: "memory")[m
[31m-#else[m
[31m-#define ngx_memory_barrier()   __asm__ volatile ("" ::: "memory")[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  res, temp;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    "    li      %0, 0       \n" /* preset "0" to "res"                      */[m
[31m-    "    eieio               \n" /* write barrier                            */[m
[31m-    "1:                      \n"[m
[31m-    "    lwarx   %1, 0, %2   \n" /* load from [lock] into "temp"             */[m
[31m-                                 /*   and store reservation                  */[m
[31m-    "    cmpw    %1, %3      \n" /* compare "temp" and "old"                 */[m
[31m-    "    bne-    2f          \n" /* not equal                                */[m
[31m-    "    stwcx.  %4, 0, %2   \n" /* store "set" into [lock] if reservation   */[m
[31m-                                 /*   is not cleared                         */[m
[31m-    "    bne-    1b          \n" /* the reservation was cleared              */[m
[31m-    "    isync               \n" /* read barrier                             */[m
[31m-    "    li      %0, 1       \n" /* set "1" to "res"                         */[m
[31m-    "2:                      \n"[m
[31m-[m
[31m-    : "=&b" (res), "=&b" (temp)[m
[31m-    : "b" (lock), "b" (old), "b" (set)[m
[31m-    : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  res, temp;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    "    eieio               \n" /* write barrier                            */[m
[31m-    "1:  lwarx   %0, 0, %2   \n" /* load from [value] into "res"             */[m
[31m-                                 /*   and store reservation                  */[m
[31m-    "    add     %1, %0, %3  \n" /* "res" + "add" store in "temp"            */[m
[31m-    "    stwcx.  %1, 0, %2   \n" /* store "temp" into [value] if reservation */[m
[31m-                                 /*   is not cleared                         */[m
[31m-    "    bne-    1b          \n" /* try again if reservation was cleared     */[m
[31m-    "    isync               \n" /* read barrier                             */[m
[31m-[m
[31m-    : "=&b" (res), "=&b" (temp)[m
[31m-    : "b" (value), "b" (add)[m
[31m-    : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define ngx_memory_barrier()                                                  \[m
[31m-    __asm__ volatile ("isync  \n  eieio  \n" ::: "memory")[m
[31m-#else[m
[31m-#define ngx_memory_barrier()   __asm__ volatile ("" ::: "memory")[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_sparc64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_sparc64.h[m
[1mdeleted file mode 100644[m
[1mindex a84db35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_sparc64.h[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "casa   [r1] 0x80, r2, r0"  and[m
[31m- * "casxa  [r1] 0x80, r2, r0"  do the following:[m
[31m- *[m
[31m- *     if ([r1] == r2) {[m
[31m- *         swap(r0, [r1]);[m
[31m- *     } else {[m
[31m- *         r0 = [r1];[m
[31m- *     }[m
[31m- *[m
[31m- * so "r0 == r2" means that the operation was successful.[m
[31m- *[m
[31m- *[m
[31m- * The "r" means the general register.[m
[31m- * The "+r" means the general register used for both input and output.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-#define NGX_CASA  "casa"[m
[31m-#else[m
[31m-#define NGX_CASA  "casxa"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    NGX_CASA " [%1] 0x80, %2, %0"[m
[31m-[m
[31m-    : "+r" (set) : "r" (lock), "r" (old) : "memory");[m
[31m-[m
[31m-    return (set == old);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  old, res;[m
[31m-[m
[31m-    old = *value;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        res = old + add;[m
[31m-[m
[31m-        __asm__ volatile ([m
[31m-[m
[31m-        NGX_CASA " [%1] 0x80, %2, %0"[m
[31m-[m
[31m-        : "+r" (res) : "r" (value), "r" (old) : "memory");[m
[31m-[m
[31m-        if (res == old) {[m
[31m-            return res;[m
[31m-        }[m
[31m-[m
[31m-        old = res;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define ngx_memory_barrier()                                                  \[m
[31m-            __asm__ volatile (                                                \[m
[31m-            "membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad"        \[m
[31m-            ::: "memory")[m
[31m-#else[m
[31m-#define ngx_memory_barrier()   __asm__ volatile ("" ::: "memory")[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_x86.h[m
[1mdeleted file mode 100644[m
[1mindex 54e01ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,127 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define NGX_SMP_LOCK  "lock;"[m
[31m-#else[m
[31m-#define NGX_SMP_LOCK[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "cmpxchgl  r, [m]":[m
[31m- *[m
[31m- *     if (eax == [m]) {[m
[31m- *         zf = 1;[m
[31m- *         [m] = r;[m
[31m- *     } else {[m
[31m- *         zf = 0;[m
[31m- *         eax = [m];[m
[31m- *     }[m
[31m- *[m
[31m- *[m
[31m- * The "r" means the general register.[m
[31m- * The "=a" and "a" are the %eax register.[m
[31m- * Although we can return result in any register, we use "a" because it is[m
[31m- * used in cmpxchgl anyway.  The result is actually in %al but not in %eax,[m
[31m- * however, as the code is inlined gcc can test %al as well as %eax,[m
[31m- * and icc adds "movzbl %al, %eax" by itself.[m
[31m- *[m
[31m- * The "cc" means that flags were changed.[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    u_char  res;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    cmpxchgl  %3, %1;   "[m
[31m-    "    sete      %0;       "[m
[31m-[m
[31m-    : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "xaddl  r, [m]":[m
[31m- *[m
[31m- *     temp = [m];[m
[31m- *     [m] += r;[m
[31m- *     r = temp;[m
[31m- *[m
[31m- *[m
[31m- * The "+r" means the general register.[m
[31m- * The "cc" means that flags were changed.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if !(( __GNUC__ == 2 && __GNUC_MINOR__ <= 7 ) || ( __INTEL_COMPILER >= 800 ))[m
[31m-[m
[31m-/*[m
[31m- * icc 8.1 and 9.0 compile broken code with -march=pentium4 option:[m
[31m- * ngx_atomic_fetch_add() always return the input "add" value,[m
[31m- * so we use the gcc 2.7 version.[m
[31m- *[m
[31m- * icc 8.1 and 9.0 with -march=pentiumpro option or icc 7.1 compile[m
[31m- * correct code.[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    xaddl  %0, %1;   "[m
[31m-[m
[31m-    : "+r" (add) : "m" (*value) : "cc", "memory");[m
[31m-[m
[31m-    return add;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/*[m
[31m- * gcc 2.7 does not support "+r", so we have to use the fixed[m
[31m- * %eax ("=a" and "a") and this adds two superfluous instructions in the end[m
[31m- * of code, something like this: "mov %eax, %edx / mov %edx, %eax".[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  old;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    xaddl  %2, %1;   "[m
[31m-[m
[31m-    : "=a" (old) : "m" (*value), "a" (add) : "cc", "memory");[m
[31m-[m
[31m-    return old;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * on x86 the write operations go in a program order, so we need only[m
[31m- * to disable the gcc reorder optimizations[m
[31m- */[m
[31m-[m
[31m-#define ngx_memory_barrier()    __asm__ volatile ("" ::: "memory")[m
[31m-[m
[31m-/* old "as" does not support "pause" opcode */[m
[31m-#define ngx_cpu_pause()         __asm__ (".byte 0xf3, 0x90")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux.h[m
[1mdeleted file mode 100644[m
[1mindex 13d654e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LINUX_H_INCLUDED_[m
[31m-#define _NGX_LINUX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LINUX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_aio_read.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_aio_read.c[m
[1mdeleted file mode 100644[m
[1mindex 9f0a6c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_aio_read.c[m
[1m+++ /dev/null[m
[36m@@ -1,148 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-extern int            ngx_eventfd;[m
[31m-extern aio_context_t  ngx_aio_ctx;[m
[31m-[m
[31m-[m
[31m-static void ngx_file_aio_event_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-io_submit(aio_context_t ctx, long n, struct iocb **paiocb)[m
[31m-{[m
[31m-    return syscall(SYS_io_submit, ctx, n, paiocb);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    aio = ngx_pcalloc(pool, sizeof(ngx_event_aio_t));[m
[31m-    if (aio == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio->file = file;[m
[31m-    aio->fd = file->fd;[m
[31m-    aio->event.data = aio;[m
[31m-    aio->event.ready = 1;[m
[31m-    aio->event.log = file->log;[m
[31m-[m
[31m-    file->aio = aio;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_err_t         err;[m
[31m-    struct iocb      *piocb[1];[m
[31m-    ngx_event_t      *ev;[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    if (!ngx_file_aio) {[m
[31m-        return ngx_read_file(file, buf, size, offset);[m
[31m-    }[m
[31m-[m
[31m-    if (file->aio == NULL && ngx_file_aio_init(file, pool) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio = file->aio;[m
[31m-    ev = &aio->event;[m
[31m-[m
[31m-    if (!ev->ready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, file->log, 0,[m
[31m-                      "second aio post for \"%V\"", &file->name);[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio complete:%d @%O:%uz %V",[m
[31m-                   ev->complete, offset, size, &file->name);[m
[31m-[m
[31m-    if (ev->complete) {[m
[31m-        ev->active = 0;[m
[31m-        ev->complete = 0;[m
[31m-[m
[31m-        if (aio->res >= 0) {[m
[31m-            ngx_set_errno(0);[m
[31m-            return aio->res;[m
[31m-        }[m
[31m-[m
[31m-        ngx_set_errno(-aio->res);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                      "aio read \"%s\" failed", file->name.data);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&aio->aiocb, sizeof(struct iocb));[m
[31m-[m
[31m-    aio->aiocb.aio_data = (uint64_t) (uintptr_t) ev;[m
[31m-    aio->aiocb.aio_lio_opcode = IOCB_CMD_PREAD;[m
[31m-    aio->aiocb.aio_fildes = file->fd;[m
[31m-    aio->aiocb.aio_buf = (uint64_t) (uintptr_t) buf;[m
[31m-    aio->aiocb.aio_nbytes = size;[m
[31m-    aio->aiocb.aio_offset = offset;[m
[31m-    aio->aiocb.aio_flags = IOCB_FLAG_RESFD;[m
[31m-    aio->aiocb.aio_resfd = ngx_eventfd;[m
[31m-[m
[31m-    ev->handler = ngx_file_aio_event_handler;[m
[31m-[m
[31m-    piocb[0] = &aio->aiocb;[m
[31m-[m
[31m-    if (io_submit(ngx_aio_ctx, 1, piocb) == 1) {[m
[31m-        ev->active = 1;[m
[31m-        ev->ready = 0;[m
[31m-        ev->complete = 0;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    if (err == NGX_EAGAIN) {[m
[31m-        return ngx_read_file(file, buf, size, offset);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                  "io_submit(\"%V\") failed", &file->name);[m
[31m-[m
[31m-    if (err == NGX_ENOSYS) {[m
[31m-        ngx_file_aio = 0;[m
[31m-        return ngx_read_file(file, buf, size, offset);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_file_aio_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                   "aio event handler fd:%d %V", aio->fd, &aio->file->name);[m
[31m-[m
[31m-    aio->handler(ev);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_config.h[m
[1mdeleted file mode 100644[m
[1mindex 2f6129d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,123 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LINUX_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_LINUX_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#ifndef _GNU_SOURCE[m
[31m-#define _GNU_SOURCE             /* pread(), pwrite(), gethostname() */[m
[31m-#endif[m
[31m-[m
[31m-#define _FILE_OFFSET_BITS  64[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <unistd.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <sys/vfs.h>            /* statfs() */[m
[31m-[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY, TCP_CORK */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#include <time.h>               /* tzset() */[m
[31m-#include <malloc.h>             /* memalign() */[m
[31m-#include <limits.h>             /* IOV_MAX */[m
[31m-#include <sys/ioctl.h>[m
[31m-#include <crypt.h>[m
[31m-#include <sys/utsname.h>        /* uname() */[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_PRCTL_H)[m
[31m-#include <sys/prctl.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SENDFILE64)[m
[31m-#include <sys/sendfile.h>[m
[31m-#else[m
[31m-extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size);[m
[31m-#define NGX_SENDFILE_LIMIT  0x80000000[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL)[m
[31m-#include <sys/epoll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_EVENTFD_H)[m
[31m-#include <sys/eventfd.h>[m
[31m-#endif[m
[31m-#include <sys/syscall.h>[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-#include <linux/aio_abi.h>[m
[31m-typedef struct iocb  ngx_aiocb_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG        511[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SO_SNDLOWAT[m
[31m-/* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */[m
[31m-#define NGX_HAVE_SO_SNDLOWAT         0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_OS_SPECIFIC_INIT    1[m
[31m-#define ngx_debug_init()[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_init.c[m
[1mdeleted file mode 100644[m
[1mindex a1372e9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-u_char  ngx_linux_kern_ostype[50];[m
[31m-u_char  ngx_linux_kern_osrelease[50];[m
[31m-[m
[31m-[m
[31m-static ngx_os_io_t ngx_linux_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-    ngx_linux_sendfile_chain,[m
[31m-    NGX_IO_SENDFILE[m
[31m-#else[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_specific_init(ngx_log_t *log)[m
[31m-{[m
[31m-    struct utsname  u;[m
[31m-[m
[31m-    if (uname(&u) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname,[m
[31m-                       sizeof(ngx_linux_kern_ostype));[m
[31m-[m
[31m-    (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release,[m
[31m-                       sizeof(ngx_linux_kern_osrelease));[m
[31m-[m
[31m-    ngx_os_io = ngx_linux_io;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_specific_status(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",[m
[31m-                  ngx_linux_kern_ostype, ngx_linux_kern_osrelease);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_sendfile_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_sendfile_chain.c[m
[1mdeleted file mode 100644[m
[1mindex 3c0696a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_linux_sendfile_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,462 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ssize_t ngx_linux_sendfile(ngx_connection_t *c, ngx_buf_t *file,[m
[31m-    size_t size);[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-#include <ngx_thread_pool.h>[m
[31m-[m
[31m-#if !(NGX_HAVE_SENDFILE64)[m
[31m-#error sendfile64() is required![m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_linux_sendfile_thread(ngx_connection_t *c, ngx_buf_t *file,[m
[31m-    size_t size, size_t *sent);[m
[31m-static void ngx_linux_sendfile_thread_handler(void *data, ngx_log_t *log);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * On Linux up to 2.4.21 sendfile() (syscall #187) works with 32-bit[m
[31m- * offsets only, and the including <sys/sendfile.h> breaks the compiling,[m
[31m- * if off_t is 64 bit wide.  So we use own sendfile() definition, where offset[m
[31m- * parameter is int32_t, and use sendfile() for the file parts below 2G only,[m
[31m- * see src/os/unix/ngx_linux_config.h[m
[31m- *[m
[31m- * Linux 2.4.21 has the new sendfile64() syscall #239.[m
[31m- *[m
[31m- * On Linux up to 2.6.16 sendfile() does not allow to pass the count parameter[m
[31m- * more than 2G-1 bytes even on 64-bit platforms: it returns EINVAL,[m
[31m- * so we limit it to 2G-1 bytes.[m
[31m- */[m
[31m-[m
[31m-#define NGX_SENDFILE_MAXSIZE  2147483647L[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int            tcp_nodelay;[m
[31m-    off_t          send, prev_send;[m
[31m-    size_t         file_size, sent;[m
[31m-    ssize_t        n;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_buf_t     *file;[m
[31m-    ngx_event_t   *wev;[m
[31m-    ngx_chain_t   *cl;[m
[31m-    ngx_iovec_t    header;[m
[31m-    struct iovec   headers[NGX_IOVS_PREALLOCATE];[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_int_t      rc;[m
[31m-    ngx_uint_t     thread_handled, thread_complete;[m
[31m-#endif[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the maximum limit size is 2G-1 - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_SENDFILE_MAXSIZE - ngx_pagesize)) {[m
[31m-        limit = NGX_SENDFILE_MAXSIZE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    header.iovs = headers;[m
[31m-    header.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        prev_send = send;[m
[31m-#if (NGX_THREADS)[m
[31m-        thread_handled = 0;[m
[31m-        thread_complete = 0;[m
[31m-#endif[m
[31m-[m
[31m-        /* create the iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log);[m
[31m-[m
[31m-        if (cl == NGX_CHAIN_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        send += header.size;[m
[31m-[m
[31m-        /* set TCP_CORK if there is a header before a file */[m
[31m-[m
[31m-        if (c->tcp_nopush == NGX_TCP_NOPUSH_UNSET[m
[31m-            && header.count != 0[m
[31m-            && cl[m
[31m-            && cl->buf->in_file)[m
[31m-        {[m
[31m-            /* the TCP_CORK and TCP_NODELAY are mutually exclusive */[m
[31m-[m
[31m-            if (c->tcp_nodelay == NGX_TCP_NODELAY_SET) {[m
[31m-[m
[31m-                tcp_nodelay = 0;[m
[31m-[m
[31m-                if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                               (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-                {[m
[31m-                    err = ngx_socket_errno;[m
[31m-[m
[31m-                    /*[m
[31m-                     * there is a tiny chance to be interrupted, however,[m
[31m-                     * we continue a processing with the TCP_NODELAY[m
[31m-                     * and without the TCP_CORK[m
[31m-                     */[m
[31m-[m
[31m-                    if (err != NGX_EINTR) {[m
[31m-                        wev->error = 1;[m
[31m-                        ngx_connection_error(c, err,[m
[31m-                                             "setsockopt(TCP_NODELAY) failed");[m
[31m-                        return NGX_CHAIN_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    c->tcp_nodelay = NGX_TCP_NODELAY_UNSET;[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                                   "no tcp_nodelay");[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-[m
[31m-                if (ngx_tcp_nopush(c->fd) == NGX_ERROR) {[m
[31m-                    err = ngx_socket_errno;[m
[31m-[m
[31m-                    /*[m
[31m-                     * there is a tiny chance to be interrupted, however,[m
[31m-                     * we continue a processing without the TCP_CORK[m
[31m-                     */[m
[31m-[m
[31m-                    if (err != NGX_EINTR) {[m
[31m-                        wev->error = 1;[m
[31m-                        ngx_connection_error(c, err,[m
[31m-                                             ngx_tcp_nopush_n " failed");[m
[31m-                        return NGX_CHAIN_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    c->tcp_nopush = NGX_TCP_NOPUSH_SET;[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                                   "tcp_nopush");[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* get the file buf */[m
[31m-[m
[31m-        if (header.count == 0 && cl && cl->buf->in_file && send < limit) {[m
[31m-            file = cl->buf;[m
[31m-[m
[31m-            /* coalesce the neighbouring file bufs */[m
[31m-[m
[31m-            file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);[m
[31m-[m
[31m-            send += file_size;[m
[31m-#if 1[m
[31m-            if (file_size == 0) {[m
[31m-                ngx_debug_point();[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-            if (file->file->thread_handler) {[m
[31m-                rc = ngx_linux_sendfile_thread(c, file, file_size, &sent);[m
[31m-[m
[31m-                switch (rc) {[m
[31m-                case NGX_OK:[m
[31m-                    thread_handled = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_DONE:[m
[31m-                    thread_complete = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_AGAIN:[m
[31m-                    break;[m
[31m-[m
[31m-                default: /* NGX_ERROR */[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-            } else[m
[31m-#endif[m
[31m-            {[m
[31m-                n = ngx_linux_sendfile(c, file, file_size);[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_writev(c, &header);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-        }[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if ((size_t) (send - prev_send) != sent) {[m
[31m-#if (NGX_THREADS)[m
[31m-            if (thread_handled) {[m
[31m-                return in;[m
[31m-            }[m
[31m-[m
[31m-            if (thread_complete) {[m
[31m-                send = prev_send + sent;[m
[31m-                continue;[m
[31m-            }[m
[31m-#endif[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_linux_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size)[m
[31m-{[m
[31m-#if (NGX_HAVE_SENDFILE64)[m
[31m-    off_t      offset;[m
[31m-#else[m
[31m-    int32_t    offset;[m
[31m-#endif[m
[31m-    ssize_t    n;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-#if (NGX_HAVE_SENDFILE64)[m
[31m-    offset = file->file_pos;[m
[31m-#else[m
[31m-    offset = (int32_t) file->file_pos;[m
[31m-#endif[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "sendfile: @%O %uz", file->file_pos, size);[m
[31m-[m
[31m-    n = sendfile(c->fd, file->file->fd, &offset, size);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        switch (err) {[m
[31m-        case NGX_EAGAIN:[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "sendfile() is not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-[m
[31m-        case NGX_EINTR:[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "sendfile() was interrupted");[m
[31m-            goto eintr;[m
[31m-[m
[31m-        default:[m
[31m-            c->write->error = 1;[m
[31m-            ngx_connection_error(c, err, "sendfile() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        /*[m
[31m-         * if sendfile returns zero, then someone has truncated the file,[m
[31m-         * so the offset became beyond the end of the file[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "sendfile() reported that \"%s\" was truncated at %O",[m
[31m-                      file->file->name.data, file->file_pos);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, "sendfile: %z of %uz @%O",[m
[31m-                   n, size, file->file_pos);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_buf_t     *file;[m
[31m-    ngx_socket_t   socket;[m
[31m-    size_t         size;[m
[31m-[m
[31m-    size_t         sent;[m
[31m-    ngx_err_t      err;[m
[31m-} ngx_linux_sendfile_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_linux_sendfile_thread(ngx_connection_t *c, ngx_buf_t *file, size_t size,[m
[31m-    size_t *sent)[m
[31m-{[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_thread_task_t         *task;[m
[31m-    ngx_linux_sendfile_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "linux sendfile thread: %d, %uz, %O",[m
[31m-                   file->file->fd, size, file->file_pos);[m
[31m-[m
[31m-    task = c->sendfile_task;[m
[31m-[m
[31m-    if (task == NULL) {[m
[31m-        task = ngx_thread_task_alloc(c->pool, sizeof(ngx_linux_sendfile_ctx_t));[m
[31m-        if (task == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        task->handler = ngx_linux_sendfile_thread_handler;[m
[31m-[m
[31m-        c->sendfile_task = task;[m
[31m-    }[m
[31m-[m
[31m-    ctx = task->ctx;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (task->event.complete) {[m
[31m-        task->event.complete = 0;[m
[31m-[m
[31m-        if (ctx->err == NGX_EAGAIN) {[m
[31m-            *sent = 0;[m
[31m-[m
[31m-            if (wev->complete) {[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->err) {[m
[31m-            wev->error = 1;[m
[31m-            ngx_connection_error(c, ctx->err, "sendfile() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->sent == 0) {[m
[31m-            /*[m
[31m-             * if sendfile returns zero, then someone has truncated the file,[m
[31m-             * so the offset became beyond the end of the file[m
[31m-             */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "sendfile() reported that \"%s\" was truncated at %O",[m
[31m-                          file->file->name.data, file->file_pos);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *sent = ctx->sent;[m
[31m-[m
[31m-        if (ctx->sent == ctx->size || wev->complete) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (task->event.active && ctx->file == file) {[m
[31m-        /*[m
[31m-         * tolerate duplicate calls; they can happen due to subrequests[m
[31m-         * or multiple calls of the next body filter from a filter[m
[31m-         */[m
[31m-[m
[31m-        *sent = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->file = file;[m
[31m-    ctx->socket = c->fd;[m
[31m-    ctx->size = size;[m
[31m-[m
[31m-    wev->complete = 0;[m
[31m-[m
[31m-    if (file->file->thread_handler(task, file->file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *sent = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_linux_sendfile_thread_handler(void *data, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_linux_sendfile_ctx_t *ctx = data;[m
[31m-[m
[31m-    off_t       offset;[m
[31m-    ssize_t     n;[m
[31m-    ngx_buf_t  *file;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "linux sendfile thread handler");[m
[31m-[m
[31m-    file = ctx->file;[m
[31m-    offset = file->file_pos;[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    n = sendfile(ctx->socket, file->file->fd, &offset, ctx->size);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ctx->err = ngx_errno;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->sent = n;[m
[31m-        ctx->err = 0;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                   "sendfile: %z (err: %d) of %uz @%O",[m
[31m-                   n, ctx->err, ctx->size, file->file_pos);[m
[31m-[m
[31m-    if (ctx->err == NGX_EINTR) {[m
[31m-        goto again;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_THREADS */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_os.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_os.h[m
[1mdeleted file mode 100644[m
[1mindex e22f07c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_os.h[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_OS_H_INCLUDED_[m
[31m-#define _NGX_OS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_IO_SENDFILE    1[m
[31m-[m
[31m-[m
[31m-typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_recv_pt        recv;[m
[31m-    ngx_recv_chain_pt  recv_chain;[m
[31m-    ngx_recv_pt        udp_recv;[m
[31m-    ngx_send_pt        send;[m
[31m-    ngx_send_pt        udp_send;[m
[31m-    ngx_send_chain_pt  send_chain;[m
[31m-    ngx_uint_t         flags;[m
[31m-} ngx_os_io_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_os_init(ngx_log_t *log);[m
[31m-void ngx_os_status(ngx_log_t *log);[m
[31m-ngx_int_t ngx_os_specific_init(ngx_log_t *log);[m
[31m-void ngx_os_specific_status(ngx_log_t *log);[m
[31m-ngx_int_t ngx_daemon(ngx_log_t *log);[m
[31m-ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid);[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *entry, off_t limit);[m
[31m-ssize_t ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-ssize_t ngx_udp_unix_send(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-[m
[31m-[m
[31m-#if (IOV_MAX > 64)[m
[31m-#define NGX_IOVS_PREALLOCATE  64[m
[31m-#else[m
[31m-#define NGX_IOVS_PREALLOCATE  IOV_MAX[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct iovec  *iovs;[m
[31m-    ngx_uint_t     count;[m
[31m-    size_t         size;[m
[31m-    ngx_uint_t     nalloc;[m
[31m-} ngx_iovec_t;[m
[31m-[m
[31m-ngx_chain_t *ngx_output_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *in,[m
[31m-    size_t limit, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_writev(ngx_connection_t *c, ngx_iovec_t *vec);[m
[31m-[m
[31m-[m
[31m-extern ngx_os_io_t  ngx_os_io;[m
[31m-extern ngx_int_t    ngx_ncpu;[m
[31m-extern ngx_int_t    ngx_max_sockets;[m
[31m-extern ngx_uint_t   ngx_inherited_nonblocking;[m
[31m-extern ngx_uint_t   ngx_tcp_nodelay_and_tcp_nopush;[m
[31m-[m
[31m-[m
[31m-#if (NGX_FREEBSD)[m
[31m-#include <ngx_freebsd.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_LINUX)[m
[31m-#include <ngx_linux.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_SOLARIS)[m
[31m-#include <ngx_solaris.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_DARWIN)[m
[31m-#include <ngx_darwin.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_OS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_posix_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_posix_config.h[m
[1mdeleted file mode 100644[m
[1mindex 5d1358e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_posix_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,171 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_POSIX_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_POSIX_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#if (NGX_HPUX)[m
[31m-#define _XOPEN_SOURCE[m
[31m-#define _XOPEN_SOURCE_EXTENDED  1[m
[31m-#define _HPUX_ALT_XOPEN_SOCKET_API[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_TRU64)[m
[31m-#define _REENTRANT[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_GNU_HURD)[m
[31m-#ifndef _GNU_SOURCE[m
[31m-#define _GNU_SOURCE             /* accept4() */[m
[31m-#endif[m
[31m-#define _FILE_OFFSET_BITS       64[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef __CYGWIN__[m
[31m-#define timezonevar             /* timezone is variable */[m
[31m-#define NGX_BROKEN_SCM_RIGHTS   1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#if (NGX_HAVE_UNISTD_H)[m
[31m-#include <unistd.h>[m
[31m-#endif[m
[31m-#if (NGX_HAVE_INTTYPES_H)[m
[31m-#include <inttypes.h>[m
[31m-#endif[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <time.h>[m
[31m-#if (NGX_HAVE_SYS_PARAM_H)[m
[31m-#include <sys/param.h>          /* statfs() */[m
[31m-#endif[m
[31m-#if (NGX_HAVE_SYS_MOUNT_H)[m
[31m-#include <sys/mount.h>          /* statfs() */[m
[31m-#endif[m
[31m-#if (NGX_HAVE_SYS_STATVFS_H)[m
[31m-#include <sys/statvfs.h>        /* statvfs() */[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_FILIO_H)[m
[31m-#include <sys/filio.h>          /* FIONBIO */[m
[31m-#endif[m
[31m-#include <sys/ioctl.h>          /* FIONBIO */[m
[31m-[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#if (NGX_HAVE_LIMITS_H)[m
[31m-#include <limits.h>             /* IOV_MAX */[m
[31m-#endif[m
[31m-[m
[31m-#ifdef __CYGWIN__[m
[31m-#include <malloc.h>             /* memalign() */[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_CRYPT_H)[m
[31m-#include <crypt.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef IOV_MAX[m
[31m-#define IOV_MAX   16[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-#include <dlfcn.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-#include <sys/event.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DEVPOLL) && !(NGX_TEST_BUILD_DEVPOLL)[m
[31m-#include <sys/ioctl.h>[m
[31m-#include <sys/devpoll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-#include <aio.h>[m
[31m-typedef struct aiocb  ngx_aiocb_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG  511[m
[31m-[m
[31m-#define ngx_debug_init()[m
[31m-[m
[31m-[m
[31m-#if (__FreeBSD__) && (__FreeBSD_version < 400017)[m
[31m-[m
[31m-#include <sys/param.h>          /* ALIGN() */[m
[31m-[m
[31m-/*[m
[31m- * FreeBSD 3.x has no CMSG_SPACE() and CMSG_LEN() and has the broken CMSG_DATA()[m
[31m- */[m
[31m-[m
[31m-#undef  CMSG_SPACE[m
[31m-#define CMSG_SPACE(l)       (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l))[m
[31m-[m
[31m-#undef  CMSG_LEN[m
[31m-#define CMSG_LEN(l)         (ALIGN(sizeof(struct cmsghdr)) + (l))[m
[31m-[m
[31m-#undef  CMSG_DATA[m
[31m-#define CMSG_DATA(cmsg)     ((u_char *)(cmsg) + ALIGN(sizeof(struct cmsghdr)))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_posix_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_posix_init.c[m
[1mdeleted file mode 100644[m
[1mindex 76ed94e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_posix_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_ncpu;[m
[31m-ngx_int_t   ngx_max_sockets;[m
[31m-ngx_uint_t  ngx_inherited_nonblocking;[m
[31m-ngx_uint_t  ngx_tcp_nodelay_and_tcp_nopush;[m
[31m-[m
[31m-[m
[31m-struct rlimit  rlmt;[m
[31m-[m
[31m-[m
[31m-ngx_os_io_t ngx_os_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_init(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t  n;[m
[31m-[m
[31m-#if (NGX_HAVE_OS_SPECIFIC_INIT)[m
[31m-    if (ngx_os_specific_init(log) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_init_setproctitle(log) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_pagesize = getpagesize();[m
[31m-    ngx_cacheline_size = NGX_CPU_CACHE_LINE;[m
[31m-[m
[31m-    for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }[m
[31m-[m
[31m-#if (NGX_HAVE_SC_NPROCESSORS_ONLN)[m
[31m-    if (ngx_ncpu == 0) {[m
[31m-        ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_ncpu < 1) {[m
[31m-        ngx_ncpu = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cpuinfo();[m
[31m-[m
[31m-    if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, errno,[m
[31m-                      "getrlimit(RLIMIT_NOFILE) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur;[m
[31m-[m
[31m-#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4)[m
[31m-    ngx_inherited_nonblocking = 1;[m
[31m-#else[m
[31m-    ngx_inherited_nonblocking = 0;[m
[31m-#endif[m
[31m-[m
[31m-    srandom(ngx_time());[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_status(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER_BUILD);[m
[31m-[m
[31m-#ifdef NGX_COMPILER[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "built by " NGX_COMPILER);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OS_SPECIFIC_INIT)[m
[31m-    ngx_os_specific_status(log);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                  "getrlimit(RLIMIT_NOFILE): %r:%r",[m
[31m-                  rlmt.rlim_cur, rlmt.rlim_max);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_posix_post_conf_init(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t  pp[2];[m
[31m-[m
[31m-    if (pipe(pp) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "pipe() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (dup2(pp[1], STDERR_FILENO) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pp[1] > STDERR_FILENO) {[m
[31m-        if (close(pp[1]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process.c[m
[1mdeleted file mode 100644[m
[1mindex 24a63fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process.c[m
[1m+++ /dev/null[m
[36m@@ -1,630 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_channel.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int     signo;[m
[31m-    char   *signame;[m
[31m-    char   *name;[m
[31m-    void  (*handler)(int signo);[m
[31m-} ngx_signal_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void ngx_execute_proc(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_signal_handler(int signo);[m
[31m-static void ngx_process_get_status(void);[m
[31m-static void ngx_unlock_mutexes(ngx_pid_t pid);[m
[31m-[m
[31m-[m
[31m-int              ngx_argc;[m
[31m-char           **ngx_argv;[m
[31m-char           **ngx_os_argv;[m
[31m-[m
[31m-ngx_int_t        ngx_process_slot;[m
[31m-ngx_socket_t     ngx_channel;[m
[31m-ngx_int_t        ngx_last_process;[m
[31m-ngx_process_t    ngx_processes[NGX_MAX_PROCESSES];[m
[31m-[m
[31m-[m
[31m-ngx_signal_t  signals[] = {[m
[31m-    { ngx_signal_value(NGX_RECONFIGURE_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),[m
[31m-      "reload",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_REOPEN_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_REOPEN_SIGNAL),[m
[31m-      "reopen",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_NOACCEPT_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_NOACCEPT_SIGNAL),[m
[31m-      "",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_TERMINATE_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_TERMINATE_SIGNAL),[m
[31m-      "stop",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_SHUTDOWN_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_SHUTDOWN_SIGNAL),[m
[31m-      "quit",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_CHANGEBIN_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_CHANGEBIN_SIGNAL),[m
[31m-      "",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { SIGALRM, "SIGALRM", "", ngx_signal_handler },[m
[31m-[m
[31m-    { SIGINT, "SIGINT", "", ngx_signal_handler },[m
[31m-[m
[31m-    { SIGIO, "SIGIO", "", ngx_signal_handler },[m
[31m-[m
[31m-    { SIGCHLD, "SIGCHLD", "", ngx_signal_handler },[m
[31m-[m
[31m-    { SIGSYS, "SIGSYS, SIG_IGN", "", SIG_IGN },[m
[31m-[m
[31m-    { SIGPIPE, "SIGPIPE, SIG_IGN", "", SIG_IGN },[m
[31m-[m
[31m-    { 0, NULL, "", NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,[m
[31m-    char *name, ngx_int_t respawn)[m
[31m-{[m
[31m-    u_long     on;[m
[31m-    ngx_pid_t  pid;[m
[31m-    ngx_int_t  s;[m
[31m-[m
[31m-    if (respawn >= 0) {[m
[31m-        s = respawn;[m
[31m-[m
[31m-    } else {[m
[31m-        for (s = 0; s < ngx_last_process; s++) {[m
[31m-            if (ngx_processes[s].pid == -1) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (s == NGX_MAX_PROCESSES) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "no more than %d processes can be spawned",[m
[31m-                          NGX_MAX_PROCESSES);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (respawn != NGX_PROCESS_DETACHED) {[m
[31m-[m
[31m-        /* Solaris 9 still has no AF_LOCAL */[m
[31m-[m
[31m-        if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "socketpair() failed while spawning \"%s\"", name);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "channel %d:%d",[m
[31m-                       ngx_processes[s].channel[0],[m
[31m-                       ngx_processes[s].channel[1]);[m
[31m-[m
[31m-        if (ngx_nonblocking(ngx_processes[s].channel[0]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_nonblocking_n " failed while spawning \"%s\"",[m
[31m-                          name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_nonblocking(ngx_processes[s].channel[1]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_nonblocking_n " failed while spawning \"%s\"",[m
[31m-                          name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        on = 1;[m
[31m-        if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "ioctl(FIOASYNC) failed while spawning \"%s\"", name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "fcntl(F_SETOWN) failed while spawning \"%s\"", name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        if (fcntl(ngx_processes[s].channel[0], F_SETFD, FD_CLOEXEC) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "fcntl(FD_CLOEXEC) failed while spawning \"%s\"",[m
[31m-                           name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        if (fcntl(ngx_processes[s].channel[1], F_SETFD, FD_CLOEXEC) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "fcntl(FD_CLOEXEC) failed while spawning \"%s\"",[m
[31m-                           name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        ngx_channel = ngx_processes[s].channel[1];[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_processes[s].channel[0] = -1;[m
[31m-        ngx_processes[s].channel[1] = -1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_process_slot = s;[m
[31m-[m
[31m-[m
[31m-    pid = fork();[m
[31m-[m
[31m-    switch (pid) {[m
[31m-[m
[31m-    case -1:[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "fork() failed while spawning \"%s\"", name);[m
[31m-        ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-        return NGX_INVALID_PID;[m
[31m-[m
[31m-    case 0:[m
[31m-        ngx_pid = ngx_getpid();[m
[31m-        proc(cycle, data);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start %s %P", name, pid);[m
[31m-[m
[31m-    ngx_processes[s].pid = pid;[m
[31m-    ngx_processes[s].exited = 0;[m
[31m-[m
[31m-    if (respawn >= 0) {[m
[31m-        return pid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_processes[s].proc = proc;[m
[31m-    ngx_processes[s].data = data;[m
[31m-    ngx_processes[s].name = name;[m
[31m-    ngx_processes[s].exiting = 0;[m
[31m-[m
[31m-    switch (respawn) {[m
[31m-[m
[31m-    case NGX_PROCESS_NORESPAWN:[m
[31m-        ngx_processes[s].respawn = 0;[m
[31m-        ngx_processes[s].just_spawn = 0;[m
[31m-        ngx_processes[s].detached = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_JUST_SPAWN:[m
[31m-        ngx_processes[s].respawn = 0;[m
[31m-        ngx_processes[s].just_spawn = 1;[m
[31m-        ngx_processes[s].detached = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_RESPAWN:[m
[31m-        ngx_processes[s].respawn = 1;[m
[31m-        ngx_processes[s].just_spawn = 0;[m
[31m-        ngx_processes[s].detached = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_JUST_RESPAWN:[m
[31m-        ngx_processes[s].respawn = 1;[m
[31m-        ngx_processes[s].just_spawn = 1;[m
[31m-        ngx_processes[s].detached = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_DETACHED:[m
[31m-        ngx_processes[s].respawn = 0;[m
[31m-        ngx_processes[s].just_spawn = 0;[m
[31m-        ngx_processes[s].detached = 1;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (s == ngx_last_process) {[m
[31m-        ngx_last_process++;[m
[31m-    }[m
[31m-[m
[31m-    return pid;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)[m
[31m-{[m
[31m-    return ngx_spawn_process(cycle, ngx_execute_proc, ctx, ctx->name,[m
[31m-                             NGX_PROCESS_DETACHED);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_execute_proc(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_exec_ctx_t  *ctx = data;[m
[31m-[m
[31m-    if (execve(ctx->path, ctx->argv, ctx->envp) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "execve() failed while executing %s \"%s\"",[m
[31m-                      ctx->name, ctx->path);[m
[31m-    }[m
[31m-[m
[31m-    exit(1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_init_signals(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_signal_t      *sig;[m
[31m-    struct sigaction   sa;[m
[31m-[m
[31m-    for (sig = signals; sig->signo != 0; sig++) {[m
[31m-        ngx_memzero(&sa, sizeof(struct sigaction));[m
[31m-        sa.sa_handler = sig->handler;[m
[31m-        sigemptyset(&sa.sa_mask);[m
[31m-        if (sigaction(sig->signo, &sa, NULL) == -1) {[m
[31m-#if (NGX_VALGRIND)[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          "sigaction(%s) failed, ignored", sig->signame);[m
[31m-#else[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          "sigaction(%s) failed", sig->signame);[m
[31m-            return NGX_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_signal_handler(int signo)[m
[31m-{[m
[31m-    char            *action;[m
[31m-    ngx_int_t        ignore;[m
[31m-    ngx_err_t        err;[m
[31m-    ngx_signal_t    *sig;[m
[31m-[m
[31m-    ignore = 0;[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    for (sig = signals; sig->signo != 0; sig++) {[m
[31m-        if (sig->signo == signo) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_time_sigsafe_update();[m
[31m-[m
[31m-    action = "";[m
[31m-[m
[31m-    switch (ngx_process) {[m
[31m-[m
[31m-    case NGX_PROCESS_MASTER:[m
[31m-    case NGX_PROCESS_SINGLE:[m
[31m-        switch (signo) {[m
[31m-[m
[31m-        case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):[m
[31m-            ngx_quit = 1;[m
[31m-            action = ", shutting down";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_TERMINATE_SIGNAL):[m
[31m-        case SIGINT:[m
[31m-            ngx_terminate = 1;[m
[31m-            action = ", exiting";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_NOACCEPT_SIGNAL):[m
[31m-            if (ngx_daemonized) {[m
[31m-                ngx_noaccept = 1;[m
[31m-                action = ", stop accepting connections";[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_RECONFIGURE_SIGNAL):[m
[31m-            ngx_reconfigure = 1;[m
[31m-            action = ", reconfiguring";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_REOPEN_SIGNAL):[m
[31m-            ngx_reopen = 1;[m
[31m-            action = ", reopening logs";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):[m
[31m-            if (getppid() > 1 || ngx_new_binary > 0) {[m
[31m-[m
[31m-                /*[m
[31m-                 * Ignore the signal in the new binary if its parent is[m
[31m-                 * not the init process, i.e. the old binary's process[m
[31m-                 * is still running.  Or ignore the signal in the old binary's[m
[31m-                 * process if the new binary's process is already running.[m
[31m-                 */[m
[31m-[m
[31m-                action = ", ignoring";[m
[31m-                ignore = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ngx_change_binary = 1;[m
[31m-            action = ", changing binary";[m
[31m-            break;[m
[31m-[m
[31m-        case SIGALRM:[m
[31m-            ngx_sigalrm = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case SIGIO:[m
[31m-            ngx_sigio = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case SIGCHLD:[m
[31m-            ngx_reap = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_WORKER:[m
[31m-    case NGX_PROCESS_HELPER:[m
[31m-        switch (signo) {[m
[31m-[m
[31m-        case ngx_signal_value(NGX_NOACCEPT_SIGNAL):[m
[31m-            if (!ngx_daemonized) {[m
[31m-                break;[m
[31m-            }[m
[31m-            ngx_debug_quit = 1;[m
[31m-        case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):[m
[31m-            ngx_quit = 1;[m
[31m-            action = ", shutting down";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_TERMINATE_SIGNAL):[m
[31m-        case SIGINT:[m
[31m-            ngx_terminate = 1;[m
[31m-            action = ", exiting";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_REOPEN_SIGNAL):[m
[31m-            ngx_reopen = 1;[m
[31m-            action = ", reopening logs";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_RECONFIGURE_SIGNAL):[m
[31m-        case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):[m
[31m-        case SIGIO:[m
[31m-            action = ", ignoring";[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,[m
[31m-                  "signal %d (%s) received%s", signo, sig->signame, action);[m
[31m-[m
[31m-    if (ignore) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, 0,[m
[31m-                      "the changing binary signal is ignored: "[m
[31m-                      "you should shutdown or terminate "[m
[31m-                      "before either old or new binary's process");[m
[31m-    }[m
[31m-[m
[31m-    if (signo == SIGCHLD) {[m
[31m-        ngx_process_get_status();[m
[31m-    }[m
[31m-[m
[31m-    ngx_set_errno(err);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_process_get_status(void)[m
[31m-{[m
[31m-    int              status;[m
[31m-    char            *process;[m
[31m-    ngx_pid_t        pid;[m
[31m-    ngx_err_t        err;[m
[31m-    ngx_int_t        i;[m
[31m-    ngx_uint_t       one;[m
[31m-[m
[31m-    one = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        pid = waitpid(-1, &status, WNOHANG);[m
[31m-[m
[31m-        if (pid == 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (pid == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_EINTR) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (err == NGX_ECHILD && one) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * Solaris always calls the signal handler for each exited process[m
[31m-             * despite waitpid() may be already called for this process.[m
[31m-             *[m
[31m-             * When several processes exit at the same time FreeBSD may[m
[31m-             * erroneously call the signal handler for exited process[m
[31m-             * despite waitpid() may be already called for this process.[m
[31m-             */[m
[31m-[m
[31m-            if (err == NGX_ECHILD) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, err,[m
[31m-                              "waitpid() failed");[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,[m
[31m-                          "waitpid() failed");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        one = 1;[m
[31m-        process = "unknown process";[m
[31m-[m
[31m-        for (i = 0; i < ngx_last_process; i++) {[m
[31m-            if (ngx_processes[i].pid == pid) {[m
[31m-                ngx_processes[i].status = status;[m
[31m-                ngx_processes[i].exited = 1;[m
[31m-                process = ngx_processes[i].name;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (WTERMSIG(status)) {[m
[31m-#ifdef WCOREDUMP[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "%s %P exited on signal %d%s",[m
[31m-                          process, pid, WTERMSIG(status),[m
[31m-                          WCOREDUMP(status) ? " (core dumped)" : "");[m
[31m-#else[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "%s %P exited on signal %d",[m
[31m-                          process, pid, WTERMSIG(status));[m
[31m-#endif[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,[m
[31m-                          "%s %P exited with code %d",[m
[31m-                          process, pid, WEXITSTATUS(status));[m
[31m-        }[m
[31m-[m
[31m-        if (WEXITSTATUS(status) == 2 && ngx_processes[i].respawn) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "%s %P exited with fatal code %d "[m
[31m-                          "and cannot be respawned",[m
[31m-                          process, pid, WEXITSTATUS(status));[m
[31m-            ngx_processes[i].respawn = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_unlock_mutexes(pid);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_unlock_mutexes(ngx_pid_t pid)[m
[31m-{[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_shm_zone_t   *shm_zone;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_slab_pool_t  *sp;[m
[31m-[m
[31m-    /*[m
[31m-     * unlock the accept mutex if the abnormally exited process[m
[31m-     * held it[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_accept_mutex_ptr) {[m
[31m-        (void) ngx_shmtx_force_unlock(&ngx_accept_mutex, pid);[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * unlock shared memory mutexes if held by the abnormally exited[m
[31m-     * process[m
[31m-     */[m
[31m-[m
[31m-    part = (ngx_list_part_t *) &ngx_cycle->shared_memory.part;[m
[31m-    shm_zone = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            shm_zone = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        sp = (ngx_slab_pool_t *) shm_zone[i].shm.addr;[m
[31m-[m
[31m-        if (ngx_shmtx_force_unlock(&sp->mutex, pid)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "shared memory zone \"%V\" was locked by %P",[m
[31m-                          &shm_zone[i].shm.name, pid);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_debug_point(void)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    switch (ccf->debug_points) {[m
[31m-[m
[31m-    case NGX_DEBUG_POINTS_STOP:[m
[31m-        raise(SIGSTOP);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_DEBUG_POINTS_ABORT:[m
[31m-        ngx_abort();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_signal_process(ngx_cycle_t *cycle, char *name, ngx_pid_t pid)[m
[31m-{[m
[31m-    ngx_signal_t  *sig;[m
[31m-[m
[31m-    for (sig = signals; sig->signo != 0; sig++) {[m
[31m-        if (ngx_strcmp(name, sig->name) == 0) {[m
[31m-            if (kill(pid, sig->signo) != -1) {[m
[31m-                return 0;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "kill(%P, %d) failed", pid, sig->signo);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process.h[m
[1mdeleted file mode 100644[m
[1mindex 7b5e8c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process.h[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROCESS_H_INCLUDED_[m
[31m-#define _NGX_PROCESS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_setaffinity.h>[m
[31m-#include <ngx_setproctitle.h>[m
[31m-[m
[31m-[m
[31m-typedef pid_t       ngx_pid_t;[m
[31m-[m
[31m-#define NGX_INVALID_PID  -1[m
[31m-[m
[31m-typedef void (*ngx_spawn_proc_pt) (ngx_cycle_t *cycle, void *data);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_pid_t           pid;[m
[31m-    int                 status;[m
[31m-    ngx_socket_t        channel[2];[m
[31m-[m
[31m-    ngx_spawn_proc_pt   proc;[m
[31m-    void               *data;[m
[31m-    char               *name;[m
[31m-[m
[31m-    unsigned            respawn:1;[m
[31m-    unsigned            just_spawn:1;[m
[31m-    unsigned            detached:1;[m
[31m-    unsigned            exiting:1;[m
[31m-    unsigned            exited:1;[m
[31m-} ngx_process_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char         *path;[m
[31m-    char         *name;[m
[31m-    char *const  *argv;[m
[31m-    char *const  *envp;[m
[31m-} ngx_exec_ctx_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_PROCESSES         1024[m
[31m-[m
[31m-#define NGX_PROCESS_NORESPAWN     -1[m
[31m-#define NGX_PROCESS_JUST_SPAWN    -2[m
[31m-#define NGX_PROCESS_RESPAWN       -3[m
[31m-#define NGX_PROCESS_JUST_RESPAWN  -4[m
[31m-#define NGX_PROCESS_DETACHED      -5[m
[31m-[m
[31m-[m
[31m-#define ngx_getpid   getpid[m
[31m-[m
[31m-#ifndef ngx_log_pid[m
[31m-#define ngx_log_pid  ngx_pid[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle,[m
[31m-    ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn);[m
[31m-ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx);[m
[31m-ngx_int_t ngx_init_signals(ngx_log_t *log);[m
[31m-void ngx_debug_point(void);[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SCHED_YIELD)[m
[31m-#define ngx_sched_yield()  sched_yield()[m
[31m-#else[m
[31m-#define ngx_sched_yield()  usleep(1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern int            ngx_argc;[m
[31m-extern char         **ngx_argv;[m
[31m-extern char         **ngx_os_argv;[m
[31m-[m
[31m-extern ngx_pid_t      ngx_pid;[m
[31m-extern ngx_socket_t   ngx_channel;[m
[31m-extern ngx_int_t      ngx_process_slot;[m
[31m-extern ngx_int_t      ngx_last_process;[m
[31m-extern ngx_process_t  ngx_processes[NGX_MAX_PROCESSES];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROCESS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.c[m
[1mdeleted file mode 100644[m
[1mindex 3ead164..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.c[m
[1m+++ /dev/null[m
[36m@@ -1,1198 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_channel.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n,[m
[31m-    ngx_int_t type);[m
[31m-static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle,[m
[31m-    ngx_uint_t respawn);[m
[31m-static void ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch);[m
[31m-static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo);[m
[31m-static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle);[m
[31m-static void ngx_master_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker);[m
[31m-static void ngx_worker_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_channel_handler(ngx_event_t *ev);[m
[31m-static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_cache_manager_process_handler(ngx_event_t *ev);[m
[31m-static void ngx_cache_loader_process_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t    ngx_process;[m
[31m-ngx_uint_t    ngx_worker;[m
[31m-ngx_pid_t     ngx_pid;[m
[31m-[m
[31m-sig_atomic_t  ngx_reap;[m
[31m-sig_atomic_t  ngx_sigio;[m
[31m-sig_atomic_t  ngx_sigalrm;[m
[31m-sig_atomic_t  ngx_terminate;[m
[31m-sig_atomic_t  ngx_quit;[m
[31m-sig_atomic_t  ngx_debug_quit;[m
[31m-ngx_uint_t    ngx_exiting;[m
[31m-sig_atomic_t  ngx_reconfigure;[m
[31m-sig_atomic_t  ngx_reopen;[m
[31m-[m
[31m-sig_atomic_t  ngx_change_binary;[m
[31m-ngx_pid_t     ngx_new_binary;[m
[31m-ngx_uint_t    ngx_inherited;[m
[31m-ngx_uint_t    ngx_daemonized;[m
[31m-[m
[31m-sig_atomic_t  ngx_noaccept;[m
[31m-ngx_uint_t    ngx_noaccepting;[m
[31m-ngx_uint_t    ngx_restart;[m
[31m-[m
[31m-[m
[31m-static u_char  master_process[] = "master process";[m
[31m-[m
[31m-[m
[31m-static ngx_cache_manager_ctx_t  ngx_cache_manager_ctx = {[m
[31m-    ngx_cache_manager_process_handler, "cache manager process", 0[m
[31m-};[m
[31m-[m
[31m-static ngx_cache_manager_ctx_t  ngx_cache_loader_ctx = {[m
[31m-    ngx_cache_loader_process_handler, "cache loader process", 60000[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_cycle_t      ngx_exit_cycle;[m
[31m-static ngx_log_t        ngx_exit_log;[m
[31m-static ngx_open_file_t  ngx_exit_log_file;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_master_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    char              *title;[m
[31m-    u_char            *p;[m
[31m-    size_t             size;[m
[31m-    ngx_int_t          i;[m
[31m-    ngx_uint_t         n, sigio;[m
[31m-    sigset_t           set;[m
[31m-    struct itimerval   itv;[m
[31m-    ngx_uint_t         live;[m
[31m-    ngx_msec_t         delay;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-    sigaddset(&set, SIGCHLD);[m
[31m-    sigaddset(&set, SIGALRM);[m
[31m-    sigaddset(&set, SIGIO);[m
[31m-    sigaddset(&set, SIGINT);[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));[m
[31m-[m
[31m-    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "sigprocmask() failed");[m
[31m-    }[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-[m
[31m-[m
[31m-    size = sizeof(master_process);[m
[31m-[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        size += ngx_strlen(ngx_argv[i]) + 1;[m
[31m-    }[m
[31m-[m
[31m-    title = ngx_pnalloc(cycle->pool, size);[m
[31m-    if (title == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(title, master_process, sizeof(master_process) - 1);[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        *p++ = ' ';[m
[31m-        p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_setproctitle(title);[m
[31m-[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                               NGX_PROCESS_RESPAWN);[m
[31m-    ngx_start_cache_manager_processes(cycle, 0);[m
[31m-[m
[31m-    ngx_new_binary = 0;[m
[31m-    delay = 0;[m
[31m-    sigio = 0;[m
[31m-    live = 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (delay) {[m
[31m-            if (ngx_sigalrm) {[m
[31m-                sigio = 0;[m
[31m-                delay *= 2;[m
[31m-                ngx_sigalrm = 0;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "termination cycle: %M", delay);[m
[31m-[m
[31m-            itv.it_interval.tv_sec = 0;[m
[31m-            itv.it_interval.tv_usec = 0;[m
[31m-            itv.it_value.tv_sec = delay / 1000;[m
[31m-            itv.it_value.tv_usec = (delay % 1000 ) * 1000;[m
[31m-[m
[31m-            if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                              "setitimer() failed");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend");[m
[31m-[m
[31m-        sigsuspend(&set);[m
[31m-[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "wake up, sigio %i", sigio);[m
[31m-[m
[31m-        if (ngx_reap) {[m
[31m-            ngx_reap = 0;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");[m
[31m-[m
[31m-            live = ngx_reap_children(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (!live && (ngx_terminate || ngx_quit)) {[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            if (delay == 0) {[m
[31m-                delay = 50;[m
[31m-            }[m
[31m-[m
[31m-            if (sigio) {[m
[31m-                sigio--;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            sigio = ccf->worker_processes + 2 /* cache processes */;[m
[31m-[m
[31m-            if (delay > 1000) {[m
[31m-                ngx_signal_worker_processes(cycle, SIGKILL);[m
[31m-            } else {[m
[31m-                ngx_signal_worker_processes(cycle,[m
[31m-                                       ngx_signal_value(NGX_TERMINATE_SIGNAL));[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-[m
[31m-            ls = cycle->listening.elts;[m
[31m-            for (n = 0; n < cycle->listening.nelts; n++) {[m
[31m-                if (ngx_close_socket(ls[n].fd) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[n].addr_text);[m
[31m-                }[m
[31m-            }[m
[31m-            cycle->listening.nelts = 0;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reconfigure) {[m
[31m-            ngx_reconfigure = 0;[m
[31m-[m
[31m-            if (ngx_new_binary) {[m
[31m-                ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                           NGX_PROCESS_RESPAWN);[m
[31m-                ngx_start_cache_manager_processes(cycle, 0);[m
[31m-                ngx_noaccepting = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-            ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                   ngx_core_module);[m
[31m-            ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                       NGX_PROCESS_JUST_RESPAWN);[m
[31m-            ngx_start_cache_manager_processes(cycle, 1);[m
[31m-[m
[31m-            /* allow new processes to start */[m
[31m-            ngx_msleep(100);[m
[31m-[m
[31m-            live = 1;[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_restart) {[m
[31m-            ngx_restart = 0;[m
[31m-            ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                       NGX_PROCESS_RESPAWN);[m
[31m-            ngx_start_cache_manager_processes(cycle, 0);[m
[31m-            live = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, ccf->user);[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_REOPEN_SIGNAL));[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_change_binary) {[m
[31m-            ngx_change_binary = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "changing binary");[m
[31m-            ngx_new_binary = ngx_exec_new_binary(cycle, ngx_argv);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_noaccept) {[m
[31m-            ngx_noaccept = 0;[m
[31m-            ngx_noaccepting = 1;[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_single_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    if (ngx_set_environment(cycle, NULL) == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_process) {[m
[31m-            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-[m
[31m-            for (i = 0; cycle->modules[i]; i++) {[m
[31m-                if (cycle->modules[i]->exit_process) {[m
[31m-                    cycle->modules[i]->exit_process(cycle);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reconfigure) {[m
[31m-            ngx_reconfigure = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, (ngx_uid_t) -1);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)[m
[31m-{[m
[31m-    ngx_int_t      i;[m
[31m-    ngx_channel_t  ch;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        ngx_spawn_process(cycle, ngx_worker_process_cycle,[m
[31m-                          (void *) (intptr_t) i, "worker process", type);[m
[31m-[m
[31m-        ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-        ch.slot = ngx_process_slot;[m
[31m-        ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-        ngx_pass_open_channel(cycle, &ch);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn)[m
[31m-{[m
[31m-    ngx_uint_t       i, manager, loader;[m
[31m-    ngx_path_t     **path;[m
[31m-    ngx_channel_t    ch;[m
[31m-[m
[31m-    manager = 0;[m
[31m-    loader = 0;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            manager = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            loader = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (manager == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,[m
[31m-                      &ngx_cache_manager_ctx, "cache manager process",[m
[31m-                      respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN);[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-    ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-    ch.slot = ngx_process_slot;[m
[31m-    ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-    ngx_pass_open_channel(cycle, &ch);[m
[31m-[m
[31m-    if (loader == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,[m
[31m-                      &ngx_cache_loader_ctx, "cache loader process",[m
[31m-                      respawn ? NGX_PROCESS_JUST_SPAWN : NGX_PROCESS_NORESPAWN);[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-    ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-    ch.slot = ngx_process_slot;[m
[31m-    ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-    ngx_pass_open_channel(cycle, &ch);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch)[m
[31m-{[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        if (i == ngx_process_slot[m
[31m-            || ngx_processes[i].pid == -1[m
[31m-            || ngx_processes[i].channel[0] == -1)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                      "pass channel s:%i pid:%P fd:%d to s:%i pid:%P fd:%d",[m
[31m-                      ch->slot, ch->pid, ch->fd,[m
[31m-                      i, ngx_processes[i].pid,[m
[31m-                      ngx_processes[i].channel[0]);[m
[31m-[m
[31m-        /* TODO: NGX_AGAIN */[m
[31m-[m
[31m-        ngx_write_channel(ngx_processes[i].channel[0],[m
[31m-                          ch, sizeof(ngx_channel_t), cycle->log);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo)[m
[31m-{[m
[31m-    ngx_int_t      i;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_channel_t  ch;[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-#if (NGX_BROKEN_SCM_RIGHTS)[m
[31m-[m
[31m-    ch.command = 0;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    switch (signo) {[m
[31m-[m
[31m-    case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):[m
[31m-        ch.command = NGX_CMD_QUIT;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_signal_value(NGX_TERMINATE_SIGNAL):[m
[31m-        ch.command = NGX_CMD_TERMINATE;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_signal_value(NGX_REOPEN_SIGNAL):[m
[31m-        ch.command = NGX_CMD_REOPEN;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ch.command = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ch.fd = -1;[m
[31m-[m
[31m-[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "child: %i %P e:%d t:%d d:%d r:%d j:%d",[m
[31m-                       i,[m
[31m-                       ngx_processes[i].pid,[m
[31m-                       ngx_processes[i].exiting,[m
[31m-                       ngx_processes[i].exited,[m
[31m-                       ngx_processes[i].detached,[m
[31m-                       ngx_processes[i].respawn,[m
[31m-                       ngx_processes[i].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[i].detached || ngx_processes[i].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].just_spawn) {[m
[31m-            ngx_processes[i].just_spawn = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].exiting[m
[31m-            && signo == ngx_signal_value(NGX_SHUTDOWN_SIGNAL))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ch.command) {[m
[31m-            if (ngx_write_channel(ngx_processes[i].channel[0],[m
[31m-                                  &ch, sizeof(ngx_channel_t), cycle->log)[m
[31m-                == NGX_OK)[m
[31m-            {[m
[31m-                if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {[m
[31m-                    ngx_processes[i].exiting = 1;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "kill (%P, %d)", ngx_processes[i].pid, signo);[m
[31m-[m
[31m-        if (kill(ngx_processes[i].pid, signo) == -1) {[m
[31m-            err = ngx_errno;[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "kill(%P, %d) failed", ngx_processes[i].pid, signo);[m
[31m-[m
[31m-            if (err == NGX_ESRCH) {[m
[31m-                ngx_processes[i].exited = 1;[m
[31m-                ngx_processes[i].exiting = 0;[m
[31m-                ngx_reap = 1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {[m
[31m-            ngx_processes[i].exiting = 1;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_reap_children(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_int_t         i, n;[m
[31m-    ngx_uint_t        live;[m
[31m-    ngx_channel_t     ch;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_CLOSE_CHANNEL;[m
[31m-    ch.fd = -1;[m
[31m-[m
[31m-    live = 0;[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "child: %i %P e:%d t:%d d:%d r:%d j:%d",[m
[31m-                       i,[m
[31m-                       ngx_processes[i].pid,[m
[31m-                       ngx_processes[i].exiting,[m
[31m-                       ngx_processes[i].exited,[m
[31m-                       ngx_processes[i].detached,[m
[31m-                       ngx_processes[i].respawn,[m
[31m-                       ngx_processes[i].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[i].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].exited) {[m
[31m-[m
[31m-            if (!ngx_processes[i].detached) {[m
[31m-                ngx_close_channel(ngx_processes[i].channel, cycle->log);[m
[31m-[m
[31m-                ngx_processes[i].channel[0] = -1;[m
[31m-                ngx_processes[i].channel[1] = -1;[m
[31m-[m
[31m-                ch.pid = ngx_processes[i].pid;[m
[31m-                ch.slot = i;[m
[31m-[m
[31m-                for (n = 0; n < ngx_last_process; n++) {[m
[31m-                    if (ngx_processes[n].exited[m
[31m-                        || ngx_processes[n].pid == -1[m
[31m-                        || ngx_processes[n].channel[0] == -1)[m
[31m-                    {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                                   "pass close channel s:%i pid:%P to:%P",[m
[31m-                                   ch.slot, ch.pid, ngx_processes[n].pid);[m
[31m-[m
[31m-                    /* TODO: NGX_AGAIN */[m
[31m-[m
[31m-                    ngx_write_channel(ngx_processes[n].channel[0],[m
[31m-                                      &ch, sizeof(ngx_channel_t), cycle->log);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_processes[i].respawn[m
[31m-                && !ngx_processes[i].exiting[m
[31m-                && !ngx_terminate[m
[31m-                && !ngx_quit)[m
[31m-            {[m
[31m-                if (ngx_spawn_process(cycle, ngx_processes[i].proc,[m
[31m-                                      ngx_processes[i].data,[m
[31m-                                      ngx_processes[i].name, i)[m
[31m-                    == NGX_INVALID_PID)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                                  "could not respawn %s",[m
[31m-                                  ngx_processes[i].name);[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-[m
[31m-                ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-                ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-                ch.slot = ngx_process_slot;[m
[31m-                ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-                ngx_pass_open_channel(cycle, &ch);[m
[31m-[m
[31m-                live = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_processes[i].pid == ngx_new_binary) {[m
[31m-[m
[31m-                ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                       ngx_core_module);[m
[31m-[m
[31m-                if (ngx_rename_file((char *) ccf->oldpid.data,[m
[31m-                                    (char *) ccf->pid.data)[m
[31m-                    == NGX_FILE_ERROR)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                                  ngx_rename_file_n " %s back to %s failed "[m
[31m-                                  "after the new binary process \"%s\" exited",[m
[31m-                                  ccf->oldpid.data, ccf->pid.data, ngx_argv[0]);[m
[31m-                }[m
[31m-[m
[31m-                ngx_new_binary = 0;[m
[31m-                if (ngx_noaccepting) {[m
[31m-                    ngx_restart = 1;[m
[31m-                    ngx_noaccepting = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (i == ngx_last_process - 1) {[m
[31m-                ngx_last_process--;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_processes[i].pid = -1;[m
[31m-            }[m
[31m-[m
[31m-        } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) {[m
[31m-            live = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return live;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_master_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    ngx_delete_pidfile(cycle);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_master) {[m
[31m-            cycle->modules[i]->exit_master(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    /*[m
[31m-     * Copy ngx_cycle->log related data to the special static exit cycle,[m
[31m-     * log, and log file structures enough to allow a signal handler to log.[m
[31m-     * The handler may be called when standard ngx_cycle->log allocated from[m
[31m-     * ngx_cycle->pool is already destroyed.[m
[31m-     */[m
[31m-[m
[31m-[m
[31m-    ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log);[m
[31m-[m
[31m-    ngx_exit_log_file.fd = ngx_exit_log.file->fd;[m
[31m-    ngx_exit_log.file = &ngx_exit_log_file;[m
[31m-    ngx_exit_log.next = NULL;[m
[31m-    ngx_exit_log.writer = NULL;[m
[31m-[m
[31m-    ngx_exit_cycle.log = &ngx_exit_log;[m
[31m-    ngx_exit_cycle.files = ngx_cycle->files;[m
[31m-    ngx_exit_cycle.files_n = ngx_cycle->files_n;[m
[31m-    ngx_cycle = &ngx_exit_cycle;[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_int_t worker = (intptr_t) data;[m
[31m-[m
[31m-    ngx_process = NGX_PROCESS_WORKER;[m
[31m-    ngx_worker = worker;[m
[31m-[m
[31m-    ngx_worker_process_init(cycle, worker);[m
[31m-[m
[31m-    ngx_setproctitle("worker process");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_exiting) {[m
[31m-            ngx_event_cancel_timers();[m
[31m-[m
[31m-            if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-                ngx_worker_process_exit(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-            ngx_worker_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_quit = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                          "gracefully shutting down");[m
[31m-            ngx_setproctitle("worker process is shutting down");[m
[31m-[m
[31m-            if (!ngx_exiting) {[m
[31m-                ngx_exiting = 1;[m
[31m-                ngx_close_listening_sockets(cycle);[m
[31m-                ngx_close_idle_connections(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)[m
[31m-{[m
[31m-    sigset_t          set;[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_cpuset_t     *cpu_affinity;[m
[31m-    struct rlimit     rlmt;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-    ngx_listening_t  *ls;[m
[31m-[m
[31m-    if (ngx_set_environment(cycle, NULL) == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (worker >= 0 && ccf->priority != 0) {[m
[31m-        if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setpriority(%d) failed", ccf->priority);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->rlimit_nofile != NGX_CONF_UNSET) {[m
[31m-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;[m
[31m-        rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile;[m
[31m-[m
[31m-        if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setrlimit(RLIMIT_NOFILE, %i) failed",[m
[31m-                          ccf->rlimit_nofile);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->rlimit_core != NGX_CONF_UNSET) {[m
[31m-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;[m
[31m-        rlmt.rlim_max = (rlim_t) ccf->rlimit_core;[m
[31m-[m
[31m-        if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setrlimit(RLIMIT_CORE, %O) failed",[m
[31m-                          ccf->rlimit_core);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (geteuid() == 0) {[m
[31m-        if (setgid(ccf->group) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "setgid(%d) failed", ccf->group);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-[m
[31m-        if (initgroups(ccf->username, ccf->group) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "initgroups(%s, %d) failed",[m
[31m-                          ccf->username, ccf->group);[m
[31m-        }[m
[31m-[m
[31m-        if (setuid(ccf->user) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "setuid(%d) failed", ccf->user);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (worker >= 0) {[m
[31m-        cpu_affinity = ngx_get_cpu_affinity(worker);[m
[31m-[m
[31m-        if (cpu_affinity) {[m
[31m-            ngx_setaffinity(cpu_affinity, cycle->log);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_PR_SET_DUMPABLE)[m
[31m-[m
[31m-    /* allow coredump after setuid() in Linux 2.4.x */[m
[31m-[m
[31m-    if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "prctl(PR_SET_DUMPABLE) failed");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ccf->working_directory.len) {[m
[31m-        if (chdir((char *) ccf->working_directory.data) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "chdir(\"%s\") failed", ccf->working_directory.data);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-[m
[31m-    if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "sigprocmask() failed");[m
[31m-    }[m
[31m-[m
[31m-    srandom((ngx_pid << 16) ^ ngx_time());[m
[31m-[m
[31m-    /*[m
[31m-     * disable deleting previous events for the listening sockets because[m
[31m-     * in the worker processes there are no events at all at this point[m
[31m-     */[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-        ls[i].previous = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_process) {[m
[31m-            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == ngx_process_slot) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[n].channel[1] == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (close(ngx_processes[n].channel[1]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "close() channel failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "close() channel failed");[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_last_process = 0;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,[m
[31m-                              ngx_channel_handler)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_process) {[m
[31m-            cycle->modules[i]->exit_process(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_exiting) {[m
[31m-        c = cycle->connections;[m
[31m-        for (i = 0; i < cycle->connection_n; i++) {[m
[31m-            if (c[i].fd != -1[m
[31m-                && c[i].read[m
[31m-                && !c[i].read->accept[m
[31m-                && !c[i].read->channel[m
[31m-                && !c[i].read->resolver)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "*%uA open socket #%d left in connection %ui",[m
[31m-                              c[i].number, c[i].fd, i);[m
[31m-                ngx_debug_quit = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_debug_quit) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "aborting");[m
[31m-            ngx_debug_point();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Copy ngx_cycle->log related data to the special static exit cycle,[m
[31m-     * log, and log file structures enough to allow a signal handler to log.[m
[31m-     * The handler may be called when standard ngx_cycle->log allocated from[m
[31m-     * ngx_cycle->pool is already destroyed.[m
[31m-     */[m
[31m-[m
[31m-    ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log);[m
[31m-[m
[31m-    ngx_exit_log_file.fd = ngx_exit_log.file->fd;[m
[31m-    ngx_exit_log.file = &ngx_exit_log_file;[m
[31m-    ngx_exit_log.next = NULL;[m
[31m-    ngx_exit_log.writer = NULL;[m
[31m-[m
[31m-    ngx_exit_cycle.log = &ngx_exit_log;[m
[31m-    ngx_exit_cycle.files = ngx_cycle->files;[m
[31m-    ngx_exit_cycle.files_n = ngx_cycle->files_n;[m
[31m-    ngx_cycle = &ngx_exit_cycle;[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, "exit");[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_channel_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_int_t          n;[m
[31m-    ngx_channel_t      ch;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ev->timedout = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {[m
[31m-                ngx_del_conn(c, 0);[m
[31m-            }[m
[31m-[m
[31m-            ngx_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {[m
[31m-            if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                       "channel command: %ui", ch.command);[m
[31m-[m
[31m-        switch (ch.command) {[m
[31m-[m
[31m-        case NGX_CMD_QUIT:[m
[31m-            ngx_quit = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_TERMINATE:[m
[31m-            ngx_terminate = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_REOPEN:[m
[31m-            ngx_reopen = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_OPEN_CHANNEL:[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                           "get channel s:%i pid:%P fd:%d",[m
[31m-                           ch.slot, ch.pid, ch.fd);[m
[31m-[m
[31m-            ngx_processes[ch.slot].pid = ch.pid;[m
[31m-            ngx_processes[ch.slot].channel[0] = ch.fd;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_CLOSE_CHANNEL:[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                           "close channel s:%i pid:%P our:%P fd:%d",[m
[31m-                           ch.slot, ch.pid, ngx_processes[ch.slot].pid,[m
[31m-                           ngx_processes[ch.slot].channel[0]);[m
[31m-[m
[31m-            if (close(ngx_processes[ch.slot].channel[0]) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                              "close() channel failed");[m
[31m-            }[m
[31m-[m
[31m-            ngx_processes[ch.slot].channel[0] = -1;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_cache_manager_ctx_t *ctx = data;[m
[31m-[m
[31m-    void         *ident[4];[m
[31m-    ngx_event_t   ev;[m
[31m-[m
[31m-    /*[m
[31m-     * Set correct process type since closing listening Unix domain socket[m
[31m-     * in a master process also removes the Unix domain socket file.[m
[31m-     */[m
[31m-    ngx_process = NGX_PROCESS_HELPER;[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    /* Set a moderate number of connections for a helper process. */[m
[31m-    cycle->connection_n = 512;[m
[31m-[m
[31m-    ngx_worker_process_init(cycle, -1);[m
[31m-[m
[31m-    ngx_memzero(&ev, sizeof(ngx_event_t));[m
[31m-    ev.handler = ctx->handler;[m
[31m-    ev.data = ident;[m
[31m-    ev.log = cycle->log;[m
[31m-    ident[3] = (void *) -1;[m
[31m-[m
[31m-    ngx_use_accept_mutex = 0;[m
[31m-[m
[31m-    ngx_setproctitle(ctx->name);[m
[31m-[m
[31m-    ngx_add_timer(&ev, ctx->delay);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-            ngx_worker_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    time_t        next, n;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_path_t  **path;[m
[31m-[m
[31m-    next = 60 * 60;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            n = path[i]->manager(path[i]->data);[m
[31m-[m
[31m-            next = (n <= next) ? n : next;[m
[31m-[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (next == 0) {[m
[31m-        next = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(ev, next * 1000);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_loader_process_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_uint_t     i;[m
[31m-    ngx_path_t   **path;[m
[31m-    ngx_cycle_t   *cycle;[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    path = cycle->paths.elts;[m
[31m-    for (i = 0; i < cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            path[i]->loader(path[i]->data);[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 7cee1c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,1198 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_channel.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n,[m
[31m-    ngx_int_t type);[m
[31m-static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle,[m
[31m-    ngx_uint_t respawn);[m
[31m-static void ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch);[m
[31m-static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo);[m
[31m-static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle);[m
[31m-static void ngx_master_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker);[m
[31m-static void ngx_worker_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_channel_handler(ngx_event_t *ev);[m
[31m-static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_cache_manager_process_handler(ngx_event_t *ev);[m
[31m-static void ngx_cache_loader_process_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t    ngx_process;[m
[31m-ngx_uint_t    ngx_worker;[m
[31m-ngx_pid_t     ngx_pid;[m
[31m-[m
[31m-sig_atomic_t  ngx_reap;[m
[31m-sig_atomic_t  ngx_sigio;[m
[31m-sig_atomic_t  ngx_sigalrm;[m
[31m-sig_atomic_t  ngx_terminate;[m
[31m-sig_atomic_t  ngx_quit;[m
[31m-sig_atomic_t  ngx_debug_quit;[m
[31m-ngx_uint_t    ngx_exiting;[m
[31m-sig_atomic_t  ngx_reconfigure;[m
[31m-sig_atomic_t  ngx_reopen;[m
[31m-[m
[31m-sig_atomic_t  ngx_change_binary;[m
[31m-ngx_pid_t     ngx_new_binary;[m
[31m-ngx_uint_t    ngx_inherited;[m
[31m-ngx_uint_t    ngx_daemonized;[m
[31m-[m
[31m-sig_atomic_t  ngx_noaccept;[m
[31m-ngx_uint_t    ngx_noaccepting;[m
[31m-ngx_uint_t    ngx_restart;[m
[31m-[m
[31m-[m
[31m-static u_char  master_process[] = "master process";[m
[31m-[m
[31m-[m
[31m-static ngx_cache_manager_ctx_t  ngx_cache_manager_ctx = {[m
[31m-    ngx_cache_manager_process_handler, "cache manager process", 0[m
[31m-};[m
[31m-[m
[31m-static ngx_cache_manager_ctx_t  ngx_cache_loader_ctx = {[m
[31m-    ngx_cache_loader_process_handler, "cache loader process", 60000[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_cycle_t      ngx_exit_cycle;[m
[31m-static ngx_log_t        ngx_exit_log;[m
[31m-static ngx_open_file_t  ngx_exit_log_file;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_master_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    char              *title;[m
[31m-    u_char            *p;[m
[31m-    size_t             size;[m
[31m-    ngx_int_t          i;[m
[31m-    ngx_uint_t         n, sigio;[m
[31m-    sigset_t           set;[m
[31m-    struct itimerval   itv;[m
[31m-    ngx_uint_t         live;[m
[31m-    ngx_msec_t         delay;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-    sigaddset(&set, SIGCHLD);[m
[31m-    sigaddset(&set, SIGALRM);[m
[31m-    sigaddset(&set, SIGIO);[m
[31m-    sigaddset(&set, SIGINT);[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));[m
[31m-[m
[31m-    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "sigprocmask() failed");[m
[31m-    }[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-[m
[31m-[m
[31m-    size = sizeof(master_process);[m
[31m-[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        size += ngx_strlen(ngx_argv[i]) + 1;[m
[31m-    }[m
[31m-[m
[31m-    title = ngx_pnalloc(cycle->pool, size);[m
[31m-    if (title == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(title, master_process, sizeof(master_process) - 1);[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        *p++ = ' ';[m
[31m-        p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_setproctitle(title);[m
[31m-[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                               NGX_PROCESS_RESPAWN);[m
[31m-    ngx_start_cache_manager_processes(cycle, 0);[m
[31m-[m
[31m-    ngx_new_binary = 0;[m
[31m-    delay = 0;[m
[31m-    sigio = 0;[m
[31m-    live = 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (delay) {[m
[31m-            if (ngx_sigalrm) {[m
[31m-                sigio = 0;[m
[31m-                delay *= 2;[m
[31m-                ngx_sigalrm = 0;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "termination cycle: %M", delay);[m
[31m-[m
[31m-            itv.it_interval.tv_sec = 0;[m
[31m-            itv.it_interval.tv_usec = 0;[m
[31m-            itv.it_value.tv_sec = delay / 1000;[m
[31m-            itv.it_value.tv_usec = (delay % 1000 ) * 1000;[m
[31m-[m
[31m-            if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                              "setitimer() failed");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend");[m
[31m-[m
[31m-        sigsuspend(&set);[m
[31m-[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "wake up, sigio %i", sigio);[m
[31m-[m
[31m-        if (ngx_reap) {[m
[31m-            ngx_reap = 0;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");[m
[31m-[m
[31m-            live = ngx_reap_children(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (!live && (ngx_terminate || ngx_quit)) {[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            if (delay == 0) {[m
[31m-                delay = 50;[m
[31m-            }[m
[31m-[m
[31m-            if (sigio) {[m
[31m-                sigio--;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            sigio = ccf->worker_processes + 2 /* cache processes */;[m
[31m-[m
[31m-            if (delay > 1000) {[m
[31m-                ngx_signal_worker_processes(cycle, SIGKILL);[m
[31m-            } else {[m
[31m-                ngx_signal_worker_processes(cycle,[m
[31m-                                       ngx_signal_value(NGX_TERMINATE_SIGNAL));[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-[m
[31m-            ls = cycle->listening.elts;[m
[31m-            for (n = 0; n < cycle->listening.nelts; n++) {[m
[31m-                if (ngx_close_socket(ls[n].fd) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[n].addr_text);[m
[31m-                }[m
[31m-            }[m
[31m-            cycle->listening.nelts = 0;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reconfigure) {[m
[31m-            ngx_reconfigure = 0;[m
[31m-[m
[31m-            if (ngx_new_binary) {[m
[31m-                ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                           NGX_PROCESS_RESPAWN);[m
[31m-                ngx_start_cache_manager_processes(cycle, 0);[m
[31m-                ngx_noaccepting = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-            ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                   ngx_core_module);[m
[31m-            ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                       NGX_PROCESS_JUST_RESPAWN);[m
[31m-            ngx_start_cache_manager_processes(cycle, 1);[m
[31m-[m
[31m-            /* allow new processes to start */[m
[31m-            ngx_msleep(100);[m
[31m-[m
[31m-            live = 1;[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_restart) {[m
[31m-            ngx_restart = 0;[m
[31m-            ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                       NGX_PROCESS_RESPAWN);[m
[31m-            ngx_start_cache_manager_processes(cycle, 0);[m
[31m-            live = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, ccf->user);[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_REOPEN_SIGNAL));[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_change_binary) {[m
[31m-            ngx_change_binary = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "changing binary");[m
[31m-            ngx_new_binary = ngx_exec_new_binary(cycle, ngx_argv);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_noaccept) {[m
[31m-            ngx_noaccept = 0;[m
[31m-            ngx_noaccepting = 1;[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_single_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    if (ngx_set_environment(cycle, NULL) == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_process) {[m
[31m-            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-[m
[31m-            for (i = 0; cycle->modules[i]; i++) {[m
[31m-                if (cycle->modules[i]->exit_process) {[m
[31m-                    cycle->modules[i]->exit_process(cycle);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reconfigure) {[m
[31m-            ngx_reconfigure = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, (ngx_uid_t) -1);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)[m
[31m-{[m
[31m-    ngx_int_t      i;[m
[31m-    ngx_channel_t  ch;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        ngx_spawn_process(cycle, ngx_worker_process_cycle,[m
[31m-                          (void *) (intptr_t) i, "worker process", type);[m
[31m-[m
[31m-        ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-        ch.slot = ngx_process_slot;[m
[31m-        ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-        ngx_pass_open_channel(cycle, &ch);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn)[m
[31m-{[m
[31m-    ngx_uint_t       i, manager, loader;[m
[31m-    ngx_path_t     **path;[m
[31m-    ngx_channel_t    ch;[m
[31m-[m
[31m-    manager = 0;[m
[31m-    loader = 0;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            manager = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            loader = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (manager == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,[m
[31m-                      &ngx_cache_manager_ctx, "cache manager process",[m
[31m-                      respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN);[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-    ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-    ch.slot = ngx_process_slot;[m
[31m-    ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-    ngx_pass_open_channel(cycle, &ch);[m
[31m-[m
[31m-    if (loader == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,[m
[31m-                      &ngx_cache_loader_ctx, "cache loader process",[m
[31m-                      respawn ? NGX_PROCESS_JUST_SPAWN : NGX_PROCESS_NORESPAWN);[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-    ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-    ch.slot = ngx_process_slot;[m
[31m-    ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-    ngx_pass_open_channel(cycle, &ch);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch)[m
[31m-{[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        if (i == ngx_process_slot[m
[31m-            || ngx_processes[i].pid == -1[m
[31m-            || ngx_processes[i].channel[0] == -1)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                      "pass channel s:%i pid:%P fd:%d to s:%i pid:%P fd:%d",[m
[31m-                      ch->slot, ch->pid, ch->fd,[m
[31m-                      i, ngx_processes[i].pid,[m
[31m-                      ngx_processes[i].channel[0]);[m
[31m-[m
[31m-        /* TODO: NGX_AGAIN */[m
[31m-[m
[31m-        ngx_write_channel(ngx_processes[i].channel[0],[m
[31m-                          ch, sizeof(ngx_channel_t), cycle->log);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo)[m
[31m-{[m
[31m-    ngx_int_t      i;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_channel_t  ch;[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-#if (NGX_BROKEN_SCM_RIGHTS)[m
[31m-[m
[31m-    ch.command = 0;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    switch (signo) {[m
[31m-[m
[31m-    case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):[m
[31m-        ch.command = NGX_CMD_QUIT;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_signal_value(NGX_TERMINATE_SIGNAL):[m
[31m-        ch.command = NGX_CMD_TERMINATE;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_signal_value(NGX_REOPEN_SIGNAL):[m
[31m-        ch.command = NGX_CMD_REOPEN;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ch.command = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ch.fd = -1;[m
[31m-[m
[31m-[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "child: %i %P e:%d t:%d d:%d r:%d j:%d",[m
[31m-                       i,[m
[31m-                       ngx_processes[i].pid,[m
[31m-                       ngx_processes[i].exiting,[m
[31m-                       ngx_processes[i].exited,[m
[31m-                       ngx_processes[i].detached,[m
[31m-                       ngx_processes[i].respawn,[m
[31m-                       ngx_processes[i].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[i].detached || ngx_processes[i].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].just_spawn) {[m
[31m-            ngx_processes[i].just_spawn = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].exiting[m
[31m-            && signo == ngx_signal_value(NGX_SHUTDOWN_SIGNAL))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ch.command) {[m
[31m-            if (ngx_write_channel(ngx_processes[i].channel[0],[m
[31m-                                  &ch, sizeof(ngx_channel_t), cycle->log)[m
[31m-                == NGX_OK)[m
[31m-            {[m
[31m-                if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {[m
[31m-                    ngx_processes[i].exiting = 1;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "kill (%P, %d)", ngx_processes[i].pid, signo);[m
[31m-[m
[31m-        if (kill(ngx_processes[i].pid, signo) == -1) {[m
[31m-            err = ngx_errno;[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "kill(%P, %d) failed", ngx_processes[i].pid, signo);[m
[31m-[m
[31m-            if (err == NGX_ESRCH) {[m
[31m-                ngx_processes[i].exited = 1;[m
[31m-                ngx_processes[i].exiting = 0;[m
[31m-                ngx_reap = 1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {[m
[31m-            ngx_processes[i].exiting = 1;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_reap_children(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_int_t         i, n;[m
[31m-    ngx_uint_t        live;[m
[31m-    ngx_channel_t     ch;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_CLOSE_CHANNEL;[m
[31m-    ch.fd = -1;[m
[31m-[m
[31m-    live = 0;[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "child: %i %P e:%d t:%d d:%d r:%d j:%d",[m
[31m-                       i,[m
[31m-                       ngx_processes[i].pid,[m
[31m-                       ngx_processes[i].exiting,[m
[31m-                       ngx_processes[i].exited,[m
[31m-                       ngx_processes[i].detached,[m
[31m-                       ngx_processes[i].respawn,[m
[31m-                       ngx_processes[i].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[i].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].exited) {[m
[31m-[m
[31m-            if (!ngx_processes[i].detached) {[m
[31m-                ngx_close_channel(ngx_processes[i].channel, cycle->log);[m
[31m-[m
[31m-                ngx_processes[i].channel[0] = -1;[m
[31m-                ngx_processes[i].channel[1] = -1;[m
[31m-[m
[31m-                ch.pid = ngx_processes[i].pid;[m
[31m-                ch.slot = i;[m
[31m-[m
[31m-                for (n = 0; n < ngx_last_process; n++) {[m
[31m-                    if (ngx_processes[n].exited[m
[31m-                        || ngx_processes[n].pid == -1[m
[31m-                        || ngx_processes[n].channel[0] == -1)[m
[31m-                    {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                                   "pass close channel s:%i pid:%P to:%P",[m
[31m-                                   ch.slot, ch.pid, ngx_processes[n].pid);[m
[31m-[m
[31m-                    /* TODO: NGX_AGAIN */[m
[31m-[m
[31m-                    ngx_write_channel(ngx_processes[n].channel[0],[m
[31m-                                      &ch, sizeof(ngx_channel_t), cycle->log);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_processes[i].respawn[m
[31m-                && !ngx_processes[i].exiting[m
[31m-                && !ngx_terminate[m
[31m-                && !ngx_quit)[m
[31m-            {[m
[31m-                if (ngx_spawn_process(cycle, ngx_processes[i].proc,[m
[31m-                                      ngx_processes[i].data,[m
[31m-                                      ngx_processes[i].name, i)[m
[31m-                    == NGX_INVALID_PID)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                                  "could not respawn %s",[m
[31m-                                  ngx_processes[i].name);[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-[m
[31m-                ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-                ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-                ch.slot = ngx_process_slot;[m
[31m-                ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-                ngx_pass_open_channel(cycle, &ch);[m
[31m-[m
[31m-                live = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_processes[i].pid == ngx_new_binary) {[m
[31m-[m
[31m-                ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                       ngx_core_module);[m
[31m-[m
[31m-                if (ngx_rename_file((char *) ccf->oldpid.data,[m
[31m-                                    (char *) ccf->pid.data)[m
[31m-                    == NGX_FILE_ERROR)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                                  ngx_rename_file_n " %s back to %s failed "[m
[31m-                                  "after the new binary process \"%s\" exited",[m
[31m-                                  ccf->oldpid.data, ccf->pid.data, ngx_argv[0]);[m
[31m-                }[m
[31m-[m
[31m-                ngx_new_binary = 0;[m
[31m-                if (ngx_noaccepting) {[m
[31m-                    ngx_restart = 1;[m
[31m-                    ngx_noaccepting = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (i == ngx_last_process - 1) {[m
[31m-                ngx_last_process--;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_processes[i].pid = -1;[m
[31m-            }[m
[31m-[m
[31m-        } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) {[m
[31m-            live = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return live;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_master_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    ngx_delete_pidfile(cycle);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_master) {[m
[31m-            cycle->modules[i]->exit_master(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    /*[m
[31m-     * Copy ngx_cycle->log related data to the special static exit cycle,[m
[31m-     * log, and log file structures enough to allow a signal handler to log.[m
[31m-     * The handler may be called when standard ngx_cycle->log allocated from[m
[31m-     * ngx_cycle->pool is already destroyed.[m
[31m-     */[m
[31m-[m
[31m-[m
[31m-    ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log);[m
[31m-[m
[31m-    ngx_exit_log_file.fd = ngx_exit_log.file->fd;[m
[31m-    ngx_exit_log.file = &ngx_exit_log_file;[m
[31m-    ngx_exit_log.next = NULL;[m
[31m-    ngx_exit_log.writer = NULL;[m
[31m-[m
[31m-    ngx_exit_cycle.log = &ngx_exit_log;[m
[31m-    ngx_exit_cycle.files = ngx_cycle->files;[m
[31m-    ngx_exit_cycle.files_n = ngx_cycle->files_n;[m
[31m-    ngx_cycle = &ngx_exit_cycle;[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_int_t worker = (intptr_t) data;[m
[31m-[m
[31m-    ngx_process = NGX_PROCESS_WORKER;[m
[31m-    ngx_worker = worker;[m
[31m-[m
[31m-    ngx_worker_process_init(cycle, worker);[m
[31m-[m
[31m-    ngx_setproctitle("worker process");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_exiting) {[m
[31m-            ngx_event_cancel_timers();[m
[31m-[m
[31m-            if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-                ngx_worker_process_exit(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-            ngx_worker_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_quit = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                          "gracefully shutting down");[m
[31m-            ngx_setproctitle("worker process is shutting down");[m
[31m-[m
[31m-            if (!ngx_exiting) {[m
[31m-                ngx_exiting = 1;[m
[31m-                ngx_close_listening_sockets(cycle);[m
[31m-                ngx_close_idle_connections(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)[m
[31m-{[m
[31m-    sigset_t          set;[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_cpuset_t     *cpu_affinity;[m
[31m-    struct rlimit     rlmt;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-    ngx_listening_t  *ls;[m
[31m-[m
[31m-    if (ngx_set_environment(cycle, NULL) == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (worker >= 0 && ccf->priority != 0) {[m
[31m-        if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setpriority(%d) failed", ccf->priority);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->rlimit_nofile != NGX_CONF_UNSET) {[m
[31m-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;[m
[31m-        rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile;[m
[31m-[m
[31m-        if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setrlimit(RLIMIT_NOFILE, %i) failed",[m
[31m-                          ccf->rlimit_nofile);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->rlimit_core != NGX_CONF_UNSET) {[m
[31m-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;[m
[31m-        rlmt.rlim_max = (rlim_t) ccf->rlimit_core;[m
[31m-[m
[31m-        if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setrlimit(RLIMIT_CORE, %O) failed",[m
[31m-                          ccf->rlimit_core);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (geteuid() == 0) {[m
[31m-        if (setgid(ccf->group) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "setgid(%d) failed", ccf->group);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-[m
[31m-        if (initgroups(ccf->username, ccf->group) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "initgroups(%s, %d) failed",[m
[31m-                          ccf->username, ccf->group);[m
[31m-        }[m
[31m-[m
[31m-        if (setuid(ccf->user) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "setuid(%d) failed", ccf->user);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (worker >= 0) {[m
[31m-        cpu_affinity = ngx_get_cpu_affinity(worker);[m
[31m-[m
[31m-        if (cpu_affinity) {[m
[31m-            ngx_setaffinity(cpu_affinity, cycle->log);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_PR_SET_DUMPABLE)[m
[31m-[m
[31m-    /* allow coredump after setuid() in Linux 2.4.x */[m
[31m-[m
[31m-    if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "prctl(PR_SET_DUMPABLE) failed");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ccf->working_directory.len) {[m
[31m-        if (chdir((char *) ccf->working_directory.data) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "chdir(\"%s\") failed", ccf->working_directory.data);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-[m
[31m-    if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "sigprocmask() failed");[m
[31m-    }[m
[31m-[m
[31m-    srandom((ngx_pid << 16) ^ ngx_time());[m
[31m-[m
[31m-    /*[m
[31m-     * disable deleting previous events for the listening sockets because[m
[31m-     * in the worker processes there are no events at all at this point[m
[31m-     */[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-        ls[i].previous = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_process) {[m
[31m-            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == ngx_process_slot) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[n].channel[1] == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (close(ngx_processes[n].channel[1]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "close() channel failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "close() channel failed");[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_last_process = 0;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,[m
[31m-                              ngx_channel_handler)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_process) {[m
[31m-            cycle->modules[i]->exit_process(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_exiting) {[m
[31m-        c = cycle->connections;[m
[31m-        for (i = 0; i < cycle->connection_n; i++) {[m
[31m-            if (c[i].fd != -1[m
[31m-                && c[i].read[m
[31m-                && !c[i].read->accept[m
[31m-                && !c[i].read->channel[m
[31m-                && !c[i].read->resolver)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "*%uA open socket #%d left in connection %ui",[m
[31m-                              c[i].number, c[i].fd, i);[m
[31m-                ngx_debug_quit = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_debug_quit) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "aborting");[m
[31m-            ngx_debug_point();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Copy ngx_cycle->log related data to the special static exit cycle,[m
[31m-     * log, and log file structures enough to allow a signal handler to log.[m
[31m-     * The handler may be called when standard ngx_cycle->log allocated from[m
[31m-     * ngx_cycle->pool is already destroyed.[m
[31m-     */[m
[31m-[m
[31m-    ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log);[m
[31m-[m
[31m-    ngx_exit_log_file.fd = ngx_exit_log.file->fd;[m
[31m-    ngx_exit_log.file = &ngx_exit_log_file;[m
[31m-    ngx_exit_log.next = NULL;[m
[31m-    ngx_exit_log.writer = NULL;[m
[31m-[m
[31m-    ngx_exit_cycle.log = &ngx_exit_log;[m
[31m-    ngx_exit_cycle.files = ngx_cycle->files;[m
[31m-    ngx_exit_cycle.files_n = ngx_cycle->files_n;[m
[31m-    ngx_cycle = &ngx_exit_cycle;[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, "exit");[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_channel_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_int_t          n;[m
[31m-    ngx_channel_t      ch;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ev->timedout = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {[m
[31m-                ngx_del_conn(c, 0);[m
[31m-            }[m
[31m-[m
[31m-            ngx_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {[m
[31m-            if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                       "channel command: %ui", ch.command);[m
[31m-[m
[31m-        switch (ch.command) {[m
[31m-[m
[31m-        case NGX_CMD_QUIT:[m
[31m-            ngx_quit = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_TERMINATE:[m
[31m-            ngx_terminate = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_REOPEN:[m
[31m-            ngx_reopen = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_OPEN_CHANNEL:[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                           "get channel s:%i pid:%P fd:%d",[m
[31m-                           ch.slot, ch.pid, ch.fd);[m
[31m-[m
[31m-            ngx_processes[ch.slot].pid = ch.pid;[m
[31m-            ngx_processes[ch.slot].channel[0] = ch.fd;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_CLOSE_CHANNEL:[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                           "close channel s:%i pid:%P our:%P fd:%d",[m
[31m-                           ch.slot, ch.pid, ngx_processes[ch.slot].pid,[m
[31m-                           ngx_processes[ch.slot].channel[0]);[m
[31m-[m
[31m-            if (close(ngx_processes[ch.slot].channel[0]) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                              "close() channel failed");[m
[31m-            }[m
[31m-[m
[31m-            ngx_processes[ch.slot].channel[0] = -1;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_cache_manager_ctx_t *ctx = data;[m
[31m-[m
[31m-    void         *ident[4];[m
[31m-    ngx_event_t   ev;[m
[31m-[m
[31m-    /*[m
[31m-     * Set correct process type since closing listening Unix domain socket[m
[31m-     * in a master process also removes the Unix domain socket file.[m
[31m-     */[m
[31m-    ngx_process = NGX_PROCESS_HELPER;[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    /* Set a moderate number of connections for a helper process. */[m
[31m-    cycle->connection_n = 512;[m
[31m-[m
[31m-    ngx_worker_process_init(cycle, -1);[m
[31m-[m
[31m-    ngx_memzero(&ev, sizeof(ngx_event_t));[m
[31m-    ev.handler = ctx->handler;[m
[31m-    ev.data = ident;[m
[31m-    ev.log = cycle->log;[m
[31m-    ident[3] = (void *) -1;[m
[31m-[m
[31m-    ngx_use_accept_mutex = 0;[m
[31m-[m
[31m-    ngx_setproctitle(ctx->name);[m
[31m-[m
[31m-    ngx_add_timer(&ev, ctx->delay);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-            exit(0);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    time_t        next, n;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_path_t  **path;[m
[31m-[m
[31m-    next = 60 * 60;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            n = path[i]->manager(path[i]->data);[m
[31m-[m
[31m-            next = (n <= next) ? n : next;[m
[31m-[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (next == 0) {[m
[31m-        next = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(ev, next * 1000);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_loader_process_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_uint_t     i;[m
[31m-    ngx_path_t   **path;[m
[31m-    ngx_cycle_t   *cycle;[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    path = cycle->paths.elts;[m
[31m-    for (i = 0; i < cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            path[i]->loader(path[i]->data);[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.h[m
[1mdeleted file mode 100644[m
[1mindex 69495d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_process_cycle.h[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_[m
[31m-#define _NGX_PROCESS_CYCLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_CMD_OPEN_CHANNEL   1[m
[31m-#define NGX_CMD_CLOSE_CHANNEL  2[m
[31m-#define NGX_CMD_QUIT           3[m
[31m-#define NGX_CMD_TERMINATE      4[m
[31m-#define NGX_CMD_REOPEN         5[m
[31m-[m
[31m-[m
[31m-#define NGX_PROCESS_SINGLE     0[m
[31m-#define NGX_PROCESS_MASTER     1[m
[31m-#define NGX_PROCESS_SIGNALLER  2[m
[31m-#define NGX_PROCESS_WORKER     3[m
[31m-#define NGX_PROCESS_HELPER     4[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_event_handler_pt       handler;[m
[31m-    char                      *name;[m
[31m-    ngx_msec_t                 delay;[m
[31m-} ngx_cache_manager_ctx_t;[m
[31m-[m
[31m-[m
[31m-void ngx_master_process_cycle(ngx_cycle_t *cycle);[m
[31m-void ngx_single_process_cycle(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t      ngx_process;[m
[31m-extern ngx_uint_t      ngx_worker;[m
[31m-extern ngx_pid_t       ngx_pid;[m
[31m-extern ngx_pid_t       ngx_new_binary;[m
[31m-extern ngx_uint_t      ngx_inherited;[m
[31m-extern ngx_uint_t      ngx_daemonized;[m
[31m-extern ngx_uint_t      ngx_exiting;[m
[31m-[m
[31m-extern sig_atomic_t    ngx_reap;[m
[31m-extern sig_atomic_t    ngx_sigio;[m
[31m-extern sig_atomic_t    ngx_sigalrm;[m
[31m-extern sig_atomic_t    ngx_quit;[m
[31m-extern sig_atomic_t    ngx_debug_quit;[m
[31m-extern sig_atomic_t    ngx_terminate;[m
[31m-extern sig_atomic_t    ngx_noaccept;[m
[31m-extern sig_atomic_t    ngx_reconfigure;[m
[31m-extern sig_atomic_t    ngx_reopen;[m
[31m-extern sig_atomic_t    ngx_change_binary;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_readv_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_readv_chain.c[m
[1mdeleted file mode 100644[m
[1mindex d23508e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_readv_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,182 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)[m
[31m-{[m
[31m-    u_char        *prev;[m
[31m-    ssize_t        n, size;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_array_t    vec;[m
[31m-    ngx_event_t   *rev;[m
[31m-    struct iovec  *iov, iovs[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "readv: eof:%d, avail:%d, err:%d",[m
[31m-                       rev->pending_eof, rev->available, rev->kq_errno);[m
[31m-[m
[31m-        if (rev->available == 0) {[m
[31m-            if (rev->pending_eof) {[m
[31m-                rev->ready = 0;[m
[31m-                rev->eof = 1;[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,[m
[31m-                              "kevent() reported about an closed connection");[m
[31m-[m
[31m-                if (rev->kq_errno) {[m
[31m-                    rev->error = 1;[m
[31m-                    ngx_set_socket_errno(rev->kq_errno);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return 0;[m
[31m-[m
[31m-            } else {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    prev = NULL;[m
[31m-    iov = NULL;[m
[31m-    size = 0;[m
[31m-[m
[31m-    vec.elts = iovs;[m
[31m-    vec.nelts = 0;[m
[31m-    vec.size = sizeof(struct iovec);[m
[31m-    vec.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-    vec.pool = c->pool;[m
[31m-[m
[31m-    /* coalesce the neighbouring bufs */[m
[31m-[m
[31m-    while (chain) {[m
[31m-        n = chain->buf->end - chain->buf->last;[m
[31m-[m
[31m-        if (limit) {[m
[31m-            if (size >= limit) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (size + n > limit) {[m
[31m-                n = (ssize_t) (limit - size);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (prev == chain->buf->last) {[m
[31m-            iov->iov_len += n;[m
[31m-[m
[31m-        } else {[m
[31m-            if (vec.nelts >= IOV_MAX) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            iov = ngx_array_push(&vec);[m
[31m-            if (iov == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            iov->iov_base = (void *) chain->buf->last;[m
[31m-            iov->iov_len = n;[m
[31m-        }[m
[31m-[m
[31m-        size += n;[m
[31m-        prev = chain->buf->end;[m
[31m-        chain = chain->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "readv: %ui, last:%uz", vec.nelts, iov->iov_len);[m
[31m-[m
[31m-    do {[m
[31m-        n = readv(c->fd, (struct iovec *) vec.elts, vec.nelts);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            rev->ready = 0;[m
[31m-            rev->eof = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD readv() may return 0 on closed socket[m
[31m-             * even if kqueue reported about available data[m
[31m-             */[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available = 0;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available -= n;[m
[31m-[m
[31m-                /*[m
[31m-                 * rev->available may be negative here because some additional[m
[31m-                 * bytes may be received between kevent() and readv()[m
[31m-                 */[m
[31m-[m
[31m-                if (rev->available <= 0) {[m
[31m-                    if (!rev->pending_eof) {[m
[31m-                        rev->ready = 0;[m
[31m-                    }[m
[31m-[m
[31m-                    rev->available = 0;[m
[31m-                }[m
[31m-[m
[31m-                return n;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            if (n < size && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) {[m
[31m-                rev->ready = 0;[m
[31m-            }[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_EAGAIN || err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "readv() not ready");[m
[31m-            n = NGX_AGAIN;[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_connection_error(c, err, "readv() failed");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } while (err == NGX_EINTR);[m
[31m-[m
[31m-    rev->ready = 0;[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        c->read->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_recv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_recv.c[m
[1mdeleted file mode 100644[m
[1mindex 5013ae3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_recv.c[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    ssize_t       n;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "recv: eof:%d, avail:%d, err:%d",[m
[31m-                       rev->pending_eof, rev->available, rev->kq_errno);[m
[31m-[m
[31m-        if (rev->available == 0) {[m
[31m-            if (rev->pending_eof) {[m
[31m-                rev->ready = 0;[m
[31m-                rev->eof = 1;[m
[31m-[m
[31m-                if (rev->kq_errno) {[m
[31m-                    rev->error = 1;[m
[31m-                    ngx_set_socket_errno(rev->kq_errno);[m
[31m-[m
[31m-                    return ngx_connection_error(c, rev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-                }[m
[31m-[m
[31m-                return 0;[m
[31m-[m
[31m-            } else {[m
[31m-                rev->ready = 0;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    do {[m
[31m-        n = recv(c->fd, buf, size, 0);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "recv: fd:%d %z of %uz", c->fd, n, size);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            rev->ready = 0;[m
[31m-            rev->eof = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD recv() may return 0 on closed socket[m
[31m-             * even if kqueue reported about available data[m
[31m-             */[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available = 0;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available -= n;[m
[31m-[m
[31m-                /*[m
[31m-                 * rev->available may be negative here because some additional[m
[31m-                 * bytes may be received between kevent() and recv()[m
[31m-                 */[m
[31m-[m
[31m-                if (rev->available <= 0) {[m
[31m-                    if (!rev->pending_eof) {[m
[31m-                        rev->ready = 0;[m
[31m-                    }[m
[31m-[m
[31m-                    rev->available = 0;[m
[31m-                }[m
[31m-[m
[31m-                return n;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            if ((size_t) n < size[m
[31m-                && !(ngx_event_flags & NGX_USE_GREEDY_EVENT))[m
[31m-            {[m
[31m-                rev->ready = 0;[m
[31m-            }[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_EAGAIN || err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "recv() not ready");[m
[31m-            n = NGX_AGAIN;[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_connection_error(c, err, "recv() failed");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } while (err == NGX_EINTR);[m
[31m-[m
[31m-    rev->ready = 0;[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        rev->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_send.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_send.c[m
[1mdeleted file mode 100644[m
[1mindex 61ea202..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_send.c[m
[1m+++ /dev/null[m
[36m@@ -1,73 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    ssize_t       n;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {[m
[31m-        (void) ngx_connection_error(c, wev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-        wev->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = send(c->fd, buf, size, 0);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "send: fd:%d %z of %uz", c->fd, n, size);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            if (n < (ssize_t) size) {[m
[31m-                wev->ready = 0;[m
[31m-            }[m
[31m-[m
[31m-            c->sent += n;[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, err, "send() returned zero");[m
[31m-            wev->ready = 0;[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        if (err == NGX_EAGAIN || err == NGX_EINTR) {[m
[31m-            wev->ready = 0;[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "send() not ready");[m
[31m-[m
[31m-            if (err == NGX_EAGAIN) {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            wev->error = 1;[m
[31m-            (void) ngx_connection_error(c, err, "send() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setaffinity.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setaffinity.c[m
[1mdeleted file mode 100644[m
[1mindex 34ec390..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setaffinity.c[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_CPUSET_SETAFFINITY)[m
[31m-[m
[31m-void[m
[31m-ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    for (i = 0; i < CPU_SETSIZE; i++) {[m
[31m-        if (CPU_ISSET(i, cpu_affinity)) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                          "cpuset_setaffinity(): using cpu #%ui", i);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1,[m
[31m-                           sizeof(cpuset_t), cpu_affinity) == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "cpuset_setaffinity() failed");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_SCHED_SETAFFINITY)[m
[31m-[m
[31m-void[m
[31m-ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    for (i = 0; i < CPU_SETSIZE; i++) {[m
[31m-        if (CPU_ISSET(i, cpu_affinity)) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                          "sched_setaffinity(): using cpu #%ui", i);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (sched_setaffinity(0, sizeof(cpu_set_t), cpu_affinity) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sched_setaffinity() failed");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setaffinity.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setaffinity.h[m
[1mdeleted file mode 100644[m
[1mindex a4139ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setaffinity.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_SETAFFINITY_H_INCLUDED_[m
[31m-#define _NGX_SETAFFINITY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SCHED_SETAFFINITY || NGX_HAVE_CPUSET_SETAFFINITY)[m
[31m-[m
[31m-#define NGX_HAVE_CPU_AFFINITY 1[m
[31m-[m
[31m-#if (NGX_HAVE_SCHED_SETAFFINITY)[m
[31m-[m
[31m-typedef cpu_set_t  ngx_cpuset_t;[m
[31m-[m
[31m-#elif (NGX_HAVE_CPUSET_SETAFFINITY)[m
[31m-[m
[31m-#include <sys/cpuset.h>[m
[31m-[m
[31m-typedef cpuset_t  ngx_cpuset_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-void ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_setaffinity(cpu_affinity, log)[m
[31m-[m
[31m-typedef uint64_t  ngx_cpuset_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SETAFFINITY_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setproctitle.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setproctitle.c[m
[1mdeleted file mode 100644[m
[1mindex 91afa51..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setproctitle.c[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_SETPROCTITLE_USES_ENV)[m
[31m-[m
[31m-/*[m
[31m- * To change the process title in Linux and Solaris we have to set argv[1][m
[31m- * to NULL and to copy the title to the same place where the argv[0] points to.[m
[31m- * However, argv[0] may be too small to hold a new title.  Fortunately, Linux[m
[31m- * and Solaris store argv[] and environ[] one after another.  So we should[m
[31m- * ensure that is the continuous memory and then we allocate the new memory[m
[31m- * for environ[] and copy it.  After this we could use the memory starting[m
[31m- * from argv[0] for our process title.[m
[31m- *[m
[31m- * The Solaris's standard /bin/ps does not show the changed process title.[m
[31m- * You have to use "/usr/ucb/ps -w" instead.  Besides, the UCB ps does not[m
[31m- * show a new title if its length less than the origin command line length.[m
[31m- * To avoid it we append to a new title the origin command line in the[m
[31m- * parenthesis.[m
[31m- */[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-static char *ngx_os_argv_last;[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_init_setproctitle(ngx_log_t *log)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 0; environ[i]; i++) {[m
[31m-        size += ngx_strlen(environ[i]) + 1;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_alloc(size, log);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_os_argv_last = ngx_os_argv[0];[m
[31m-[m
[31m-    for (i = 0; ngx_os_argv[i]; i++) {[m
[31m-        if (ngx_os_argv_last == ngx_os_argv[i]) {[m
[31m-            ngx_os_argv_last = ngx_os_argv[i] + ngx_strlen(ngx_os_argv[i]) + 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; environ[i]; i++) {[m
[31m-        if (ngx_os_argv_last == environ[i]) {[m
[31m-[m
[31m-            size = ngx_strlen(environ[i]) + 1;[m
[31m-            ngx_os_argv_last = environ[i] + size;[m
[31m-[m
[31m-            ngx_cpystrn(p, (u_char *) environ[i], size);[m
[31m-            environ[i] = (char *) p;[m
[31m-            p += size;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_os_argv_last--;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_setproctitle(char *title)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-[m
[31m-    ngx_int_t   i;[m
[31m-    size_t      size;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_os_argv[1] = NULL;[m
[31m-[m
[31m-    p = ngx_cpystrn((u_char *) ngx_os_argv[0], (u_char *) "nginx: ",[m
[31m-                    ngx_os_argv_last - ngx_os_argv[0]);[m
[31m-[m
[31m-    p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char *) p);[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        size += ngx_strlen(ngx_argv[i]) + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (size > (size_t) ((char *) p - ngx_os_argv[0])) {[m
[31m-[m
[31m-        /*[m
[31m-         * ngx_setproctitle() is too rare operation so we use[m
[31m-         * the non-optimized copies[m
[31m-         */[m
[31m-[m
[31m-        p = ngx_cpystrn(p, (u_char *) " (", ngx_os_argv_last - (char *) p);[m
[31m-[m
[31m-        for (i = 0; i < ngx_argc; i++) {[m
[31m-            p = ngx_cpystrn(p, (u_char *) ngx_argv[i],[m
[31m-                            ngx_os_argv_last - (char *) p);[m
[31m-            p = ngx_cpystrn(p, (u_char *) " ", ngx_os_argv_last - (char *) p);[m
[31m-        }[m
[31m-[m
[31m-        if (*(p - 1) == ' ') {[m
[31m-            *(p - 1) = ')';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_os_argv_last - (char *) p) {[m
[31m-        ngx_memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                   "setproctitle: \"%s\"", ngx_os_argv[0]);[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_SETPROCTITLE_USES_ENV */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setproctitle.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setproctitle.h[m
[1mdeleted file mode 100644[m
[1mindex c363662..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_setproctitle.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SETPROCTITLE_H_INCLUDED_[m
[31m-#define _NGX_SETPROCTITLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SETPROCTITLE)[m
[31m-[m
[31m-/* FreeBSD, NetBSD, OpenBSD */[m
[31m-[m
[31m-#define ngx_init_setproctitle(log) NGX_OK[m
[31m-#define ngx_setproctitle(title)    setproctitle("%s", title)[m
[31m-[m
[31m-[m
[31m-#else /* !NGX_HAVE_SETPROCTITLE */[m
[31m-[m
[31m-#if !defined NGX_SETPROCTITLE_USES_ENV[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-[m
[31m-#define NGX_SETPROCTITLE_USES_ENV  1[m
[31m-#define NGX_SETPROCTITLE_PAD       ' '[m
[31m-[m
[31m-ngx_int_t ngx_init_setproctitle(ngx_log_t *log);[m
[31m-void ngx_setproctitle(char *title);[m
[31m-[m
[31m-#elif (NGX_LINUX) || (NGX_DARWIN)[m
[31m-[m
[31m-#define NGX_SETPROCTITLE_USES_ENV  1[m
[31m-#define NGX_SETPROCTITLE_PAD       '\0'[m
[31m-[m
[31m-ngx_int_t ngx_init_setproctitle(ngx_log_t *log);[m
[31m-void ngx_setproctitle(char *title);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_init_setproctitle(log) NGX_OK[m
[31m-#define ngx_setproctitle(title)[m
[31m-[m
[31m-#endif /* OSes */[m
[31m-[m
[31m-#endif /* NGX_SETPROCTITLE_USES_ENV */[m
[31m-[m
[31m-#endif /* NGX_HAVE_SETPROCTITLE */[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SETPROCTITLE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_shmem.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_shmem.c[m
[1mdeleted file mode 100644[m
[1mindex 3ec7cbf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_shmem.c[m
[1m+++ /dev/null[m
[36m@@ -1,126 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_MAP_ANON)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_alloc(ngx_shm_t *shm)[m
[31m-{[m
[31m-    shm->addr = (u_char *) mmap(NULL, shm->size,[m
[31m-                                PROT_READ|PROT_WRITE,[m
[31m-                                MAP_ANON|MAP_SHARED, -1, 0);[m
[31m-[m
[31m-    if (shm->addr == MAP_FAILED) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shm_free(ngx_shm_t *shm)[m
[31m-{[m
[31m-    if (munmap((void *) shm->addr, shm->size) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "munmap(%p, %uz) failed", shm->addr, shm->size);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_MAP_DEVZERO)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_alloc(ngx_shm_t *shm)[m
[31m-{[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    fd = open("/dev/zero", O_RDWR);[m
[31m-[m
[31m-    if (fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "open(\"/dev/zero\") failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm->addr = (u_char *) mmap(NULL, shm->size, PROT_READ|PROT_WRITE,[m
[31m-                                MAP_SHARED, fd, 0);[m
[31m-[m
[31m-    if (shm->addr == MAP_FAILED) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "mmap(/dev/zero, MAP_SHARED, %uz) failed", shm->size);[m
[31m-    }[m
[31m-[m
[31m-    if (close(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "close(\"/dev/zero\") failed");[m
[31m-    }[m
[31m-[m
[31m-    return (shm->addr == MAP_FAILED) ? NGX_ERROR : NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shm_free(ngx_shm_t *shm)[m
[31m-{[m
[31m-    if (munmap((void *) shm->addr, shm->size) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "munmap(%p, %uz) failed", shm->addr, shm->size);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_SYSVSHM)[m
[31m-[m
[31m-#include <sys/ipc.h>[m
[31m-#include <sys/shm.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_alloc(ngx_shm_t *shm)[m
[31m-{[m
[31m-    int  id;[m
[31m-[m
[31m-    id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT));[m
[31m-[m
[31m-    if (id == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "shmget(%uz) failed", shm->size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, shm->log, 0, "shmget id: %d", id);[m
[31m-[m
[31m-    shm->addr = shmat(id, NULL, 0);[m
[31m-[m
[31m-    if (shm->addr == (void *) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, "shmat() failed");[m
[31m-    }[m
[31m-[m
[31m-    if (shmctl(id, IPC_RMID, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "shmctl(IPC_RMID) failed");[m
[31m-    }[m
[31m-[m
[31m-    return (shm->addr == (void *) -1) ? NGX_ERROR : NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shm_free(ngx_shm_t *shm)[m
[31m-{[m
[31m-    if (shmdt(shm->addr) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "shmdt(%p) failed", shm->addr);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_shmem.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_shmem.h[m
[1mdeleted file mode 100644[m
[1mindex 566a7d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_shmem.h[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SHMEM_H_INCLUDED_[m
[31m-#define _NGX_SHMEM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char      *addr;[m
[31m-    size_t       size;[m
[31m-    ngx_str_t    name;[m
[31m-    ngx_log_t   *log;[m
[31m-    ngx_uint_t   exists;   /* unsigned  exists:1;  */[m
[31m-} ngx_shm_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);[m
[31m-void ngx_shm_free(ngx_shm_t *shm);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SHMEM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_socket.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_socket.c[m
[1mdeleted file mode 100644[m
[1mindex 3978f65..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_socket.c[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ioctl(FIONBIO) sets a non-blocking mode with the single syscall[m
[31m- * while fcntl(F_SETFL, O_NONBLOCK) needs to learn the current state[m
[31m- * using fcntl(F_GETFL).[m
[31m- *[m
[31m- * ioctl() and fcntl() are syscalls at least in FreeBSD 2.x, Linux 2.2[m
[31m- * and Solaris 7.[m
[31m- *[m
[31m- * ioctl() in Linux 2.4 and 2.6 uses BKL, however, fcntl(F_SETFL) uses it too.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FIONBIO)[m
[31m-[m
[31m-int[m
[31m-ngx_nonblocking(ngx_socket_t s)[m
[31m-{[m
[31m-    int  nb;[m
[31m-[m
[31m-    nb = 1;[m
[31m-[m
[31m-    return ioctl(s, FIONBIO, &nb);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_blocking(ngx_socket_t s)[m
[31m-{[m
[31m-    int  nb;[m
[31m-[m
[31m-    nb = 0;[m
[31m-[m
[31m-    return ioctl(s, FIONBIO, &nb);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_FREEBSD)[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_nopush(ngx_socket_t s)[m
[31m-{[m
[31m-    int  tcp_nopush;[m
[31m-[m
[31m-    tcp_nopush = 1;[m
[31m-[m
[31m-    return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,[m
[31m-                      (const void *) &tcp_nopush, sizeof(int));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_push(ngx_socket_t s)[m
[31m-{[m
[31m-    int  tcp_nopush;[m
[31m-[m
[31m-    tcp_nopush = 0;[m
[31m-[m
[31m-    return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,[m
[31m-                      (const void *) &tcp_nopush, sizeof(int));[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_LINUX)[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_nopush(ngx_socket_t s)[m
[31m-{[m
[31m-    int  cork;[m
[31m-[m
[31m-    cork = 1;[m
[31m-[m
[31m-    return setsockopt(s, IPPROTO_TCP, TCP_CORK,[m
[31m-                      (const void *) &cork, sizeof(int));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_push(ngx_socket_t s)[m
[31m-{[m
[31m-    int  cork;[m
[31m-[m
[31m-    cork = 0;[m
[31m-[m
[31m-    return setsockopt(s, IPPROTO_TCP, TCP_CORK,[m
[31m-                      (const void *) &cork, sizeof(int));[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_nopush(ngx_socket_t s)[m
[31m-{[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_push(ngx_socket_t s)[m
[31m-{[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_socket.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_socket.h[m
[1mdeleted file mode 100644[m
[1mindex fcc5153..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_socket.h[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SOCKET_H_INCLUDED_[m
[31m-#define _NGX_SOCKET_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_WRITE_SHUTDOWN SHUT_WR[m
[31m-[m
[31m-typedef int  ngx_socket_t;[m
[31m-[m
[31m-#define ngx_socket          socket[m
[31m-#define ngx_socket_n        "socket()"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FIONBIO)[m
[31m-[m
[31m-int ngx_nonblocking(ngx_socket_t s);[m
[31m-int ngx_blocking(ngx_socket_t s);[m
[31m-[m
[31m-#define ngx_nonblocking_n   "ioctl(FIONBIO)"[m
[31m-#define ngx_blocking_n      "ioctl(!FIONBIO)"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_nonblocking(s)  fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)[m
[31m-#define ngx_nonblocking_n   "fcntl(O_NONBLOCK)"[m
[31m-[m
[31m-#define ngx_blocking(s)     fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK)[m
[31m-#define ngx_blocking_n      "fcntl(!O_NONBLOCK)"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-int ngx_tcp_nopush(ngx_socket_t s);[m
[31m-int ngx_tcp_push(ngx_socket_t s);[m
[31m-[m
[31m-#if (NGX_LINUX)[m
[31m-[m
[31m-#define ngx_tcp_nopush_n   "setsockopt(TCP_CORK)"[m
[31m-#define ngx_tcp_push_n     "setsockopt(!TCP_CORK)"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_tcp_nopush_n   "setsockopt(TCP_NOPUSH)"[m
[31m-#define ngx_tcp_push_n     "setsockopt(!TCP_NOPUSH)"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_shutdown_socket    shutdown[m
[31m-#define ngx_shutdown_socket_n  "shutdown()"[m
[31m-[m
[31m-#define ngx_close_socket    close[m
[31m-#define ngx_close_socket_n  "close() socket"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SOCKET_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris.h[m
[1mdeleted file mode 100644[m
[1mindex 7b167d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SOLARIS_H_INCLUDED_[m
[31m-#define _NGX_SOLARIS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SOLARIS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_config.h[m
[1mdeleted file mode 100644[m
[1mindex ffa01c8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SOLARIS_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_SOLARIS_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#ifndef _REENTRANT[m
[31m-#define _REENTRANT[m
[31m-#endif[m
[31m-[m
[31m-#define _FILE_OFFSET_BITS  64   /* must be before <sys/types.h> */[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <unistd.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <time.h>[m
[31m-#include <sys/statvfs.h>        /* statvfs() */[m
[31m-[m
[31m-#include <sys/filio.h>          /* FIONBIO */[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#include <sys/systeminfo.h>[m
[31m-#include <limits.h>             /* IOV_MAX */[m
[31m-#include <inttypes.h>[m
[31m-#include <crypt.h>[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-#define NGX_ALIGNMENT  _MAX_ALIGNMENT[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DEVPOLL)[m
[31m-#include <sys/ioctl.h>[m
[31m-#include <sys/devpoll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTPORT)[m
[31m-#include <port.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-#include <sys/sendfile.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG           511[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SO_SNDLOWAT[m
[31m-/* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */[m
[31m-#define NGX_HAVE_SO_SNDLOWAT         0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_OS_SPECIFIC_INIT    1[m
[31m-#define ngx_debug_init()[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SOLARIS_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_init.c[m
[1mdeleted file mode 100644[m
[1mindex 83acae1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-char ngx_solaris_sysname[20];[m
[31m-char ngx_solaris_release[10];[m
[31m-char ngx_solaris_version[50];[m
[31m-[m
[31m-[m
[31m-static ngx_os_io_t ngx_solaris_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-    ngx_solaris_sendfilev_chain,[m
[31m-    NGX_IO_SENDFILE[m
[31m-#else[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_specific_init(ngx_log_t *log)[m
[31m-{[m
[31m-    if (sysinfo(SI_SYSNAME, ngx_solaris_sysname, sizeof(ngx_solaris_sysname))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysinfo(SI_SYSNAME) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sysinfo(SI_RELEASE, ngx_solaris_release, sizeof(ngx_solaris_release))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysinfo(SI_RELEASE) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sysinfo(SI_VERSION, ngx_solaris_version, sizeof(ngx_solaris_version))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysinfo(SI_SYSNAME) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_os_io = ngx_solaris_io;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_specific_status(ngx_log_t *log)[m
[31m-{[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",[m
[31m-                  ngx_solaris_sysname, ngx_solaris_release);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "version: %s",[m
[31m-                  ngx_solaris_version);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_sendfilev_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_sendfilev_chain.c[m
[1mdeleted file mode 100644[m
[1mindex 39bcafa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_solaris_sendfilev_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,228 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_TEST_BUILD_SOLARIS_SENDFILEV)[m
[31m-[m
[31m-/* Solaris declarations */[m
[31m-[m
[31m-typedef struct sendfilevec {[m
[31m-    int     sfv_fd;[m
[31m-    u_int   sfv_flag;[m
[31m-    off_t   sfv_off;[m
[31m-    size_t  sfv_len;[m
[31m-} sendfilevec_t;[m
[31m-[m
[31m-#define SFV_FD_SELF  -2[m
[31m-[m
[31m-static ssize_t sendfilev(int fd, const struct sendfilevec *vec,[m
[31m-    int sfvcnt, size_t *xferred)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_SENDFILEVECS  NGX_IOVS_PREALLOCATE[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int             fd;[m
[31m-    u_char         *prev;[m
[31m-    off_t           size, send, prev_send, aligned, fprev;[m
[31m-    size_t          sent;[m
[31m-    ssize_t         n;[m
[31m-    ngx_int_t       eintr;[m
[31m-    ngx_err_t       err;[m
[31m-    ngx_buf_t      *file;[m
[31m-    ngx_uint_t      nsfv;[m
[31m-    sendfilevec_t  *sfv, sfvs[NGX_SENDFILEVECS];[m
[31m-    ngx_event_t    *wev;[m
[31m-    ngx_chain_t    *cl;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-    if (!c->sendfile) {[m
[31m-        return ngx_writev_chain(c, in, limit);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the maximum limit size is the maximum size_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        fd = SFV_FD_SELF;[m
[31m-        prev = NULL;[m
[31m-        fprev = 0;[m
[31m-        file = NULL;[m
[31m-        sfv = NULL;[m
[31m-        eintr = 0;[m
[31m-        sent = 0;[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        nsfv = 0;[m
[31m-[m
[31m-        /* create the sendfilevec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        for (cl = in; cl && send < limit; cl = cl->next) {[m
[31m-[m
[31m-            if (ngx_buf_special(cl->buf)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_in_memory_only(cl->buf)) {[m
[31m-                fd = SFV_FD_SELF;[m
[31m-[m
[31m-                size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-                if (send + size > limit) {[m
[31m-                    size = limit - send;[m
[31m-                }[m
[31m-[m
[31m-                if (prev == cl->buf->pos) {[m
[31m-                    sfv->sfv_len += (size_t) size;[m
[31m-[m
[31m-                } else {[m
[31m-                    if (nsfv == NGX_SENDFILEVECS) {[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    sfv = &sfvs[nsfv++];[m
[31m-[m
[31m-                    sfv->sfv_fd = SFV_FD_SELF;[m
[31m-                    sfv->sfv_flag = 0;[m
[31m-                    sfv->sfv_off = (off_t) (uintptr_t) cl->buf->pos;[m
[31m-                    sfv->sfv_len = (size_t) size;[m
[31m-                }[m
[31m-[m
[31m-                prev = cl->buf->pos + (size_t) size;[m
[31m-                send += size;[m
[31m-[m
[31m-            } else {[m
[31m-                prev = NULL;[m
[31m-[m
[31m-                size = cl->buf->file_last - cl->buf->file_pos;[m
[31m-[m
[31m-                if (send + size > limit) {[m
[31m-                    size = limit - send;[m
[31m-[m
[31m-                    aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)[m
[31m-                               & ~((off_t) ngx_pagesize - 1);[m
[31m-[m
[31m-                    if (aligned <= cl->buf->file_last) {[m
[31m-                        size = aligned - cl->buf->file_pos;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) {[m
[31m-                    sfv->sfv_len += (size_t) size;[m
[31m-[m
[31m-                } else {[m
[31m-                    if (nsfv == NGX_SENDFILEVECS) {[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    sfv = &sfvs[nsfv++];[m
[31m-[m
[31m-                    fd = cl->buf->file->fd;[m
[31m-                    sfv->sfv_fd = fd;[m
[31m-                    sfv->sfv_flag = 0;[m
[31m-                    sfv->sfv_off = cl->buf->file_pos;[m
[31m-                    sfv->sfv_len = (size_t) size;[m
[31m-                }[m
[31m-[m
[31m-                file = cl->buf;[m
[31m-                fprev = cl->buf->file_pos + size;[m
[31m-                send += size;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        n = sendfilev(c->fd, sfvs, nsfv, &sent);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            switch (err) {[m
[31m-            case NGX_EAGAIN:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_EINTR:[m
[31m-                eintr = 1;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                wev->error = 1;[m
[31m-                ngx_connection_error(c, err, "sendfilev() failed");[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                          "sendfilev() sent only %uz bytes", sent);[m
[31m-[m
[31m-        } else if (n == 0 && sent == 0) {[m
[31m-[m
[31m-            /*[m
[31m-             * sendfilev() is documented to return -1 with errno[m
[31m-             * set to EINVAL if svf_len is greater than the file size,[m
[31m-             * but at least Solaris 11 returns 0 instead[m
[31m-             */[m
[31m-[m
[31m-            if (file) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                        "sendfilev() reported that \"%s\" was truncated at %O",[m
[31m-                        file->file->name.data, file->file_pos);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              "sendfilev() returned 0 with memory buffers");[m
[31m-            }[m
[31m-[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "sendfilev: %z %z", n, sent);[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if (eintr) {[m
[31m-            send = prev_send + sent;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (send - prev_send != (off_t) sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_amd64.il b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_amd64.il[m
[1mdeleted file mode 100644[m
[1mindex 07f3210..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_amd64.il[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/[m
[31m-/ Copyright (C) Igor Sysoev[m
[31m-/ Copyright (C) Nginx, Inc.[m
[31m-/[m
[31m-[m
[31m-/ ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock,[m
[31m-/     ngx_atomic_uint_t old, ngx_atomic_uint_t set);[m
[31m-/[m
[31m-/ the arguments are passed in %rdi, %rsi, %rdx[m
[31m-/ the result is returned in the %rax[m
[31m-[m
[31m-        .inline ngx_atomic_cmp_set,0[m
[31m-        movq      %rsi, %rax[m
[31m-        lock[m
[31m-        cmpxchgq  %rdx, (%rdi)[m
[31m-        setz      %al[m
[31m-        movzbq    %al, %rax[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value,[m
[31m-/     ngx_atomic_int_t add);[m
[31m-/[m
[31m-/ the arguments are passed in %rdi, %rsi[m
[31m-/ the result is returned in the %rax[m
[31m-[m
[31m-        .inline ngx_atomic_fetch_add,0[m
[31m-        movq      %rsi, %rax[m
[31m-        lock[m
[31m-        xaddq     %rax, (%rdi)[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_cpu_pause()[m
[31m-/[m
[31m-/ the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware[m
[31m-/ capability added by linker because Solaris/amd64 does not know about it:[m
[31m-/[m
[31m-/ ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000 [ PAUSE ][m
[31m-[m
[31m-        .inline ngx_cpu_pause,0[m
[31m-        rep; nop[m
[31m-        .end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_atomic_sparc64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_atomic_sparc64.h[m
[1mdeleted file mode 100644[m
[1mindex 5f28055..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_atomic_sparc64.h[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-#define NGX_CASA  ngx_casa[m
[31m-#else[m
[31m-#define NGX_CASA  ngx_casxa[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock);[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock);[m
[31m-[m
[31m-/* the code in src/os/unix/ngx_sunpro_sparc64.il */[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    set = NGX_CASA(set, old, lock);[m
[31m-[m
[31m-    return (set == old);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  old, res;[m
[31m-[m
[31m-    old = *value;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        res = old + add;[m
[31m-[m
[31m-        res = NGX_CASA(res, old, value);[m
[31m-[m
[31m-        if (res == old) {[m
[31m-            return res;[m
[31m-        }[m
[31m-[m
[31m-        old = res;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_memory_barrier()                                                  \[m
[31m-        __asm (".volatile");                                                  \[m
[31m-        __asm ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad");   \[m
[31m-        __asm (".nonvolatile")[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_sparc64.il b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_sparc64.il[m
[1mdeleted file mode 100644[m
[1mindex bdeef61..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_sparc64.il[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-/[m
[31m-/ Copyright (C) Igor Sysoev[m
[31m-/ Copyright (C) Nginx, Inc.[m
[31m-/[m
[31m-[m
[31m-[m
[31m-/  "casa   [%o2] 0x80, %o1, %o0"  and[m
[31m-/  "casxa  [%o2] 0x80, %o1, %o0"  do the following:[m
[31m-/[m
[31m-/       if ([%o2] == %o1) {[m
[31m-/           swap(%o0, [%o2]);[m
[31m-/       } else {[m
[31m-/           %o0 = [%o2];[m
[31m-/       }[m
[31m-[m
[31m-[m
[31m-/ ngx_atomic_uint_t ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old,[m
[31m-/      ngx_atomic_t *lock);[m
[31m-/[m
[31m-/ the arguments are passed in the %o0, %o1, %o2[m
[31m-/ the result is returned in the %o0[m
[31m-[m
[31m-        .inline ngx_casa,0[m
[31m-        casa    [%o2] 0x80, %o1, %o0[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_atomic_uint_t ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old,[m
[31m-/      ngx_atomic_t *lock);[m
[31m-/[m
[31m-/ the arguments are passed in the %o0, %o1, %o2[m
[31m-/ the result is returned in the %o0[m
[31m-[m
[31m-        .inline ngx_casxa,0[m
[31m-        casxa   [%o2] 0x80, %o1, %o0[m
[31m-        .end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_x86.il b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_x86.il[m
[1mdeleted file mode 100644[m
[1mindex d7e127c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_sunpro_x86.il[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-/[m
[31m-/ Copyright (C) Igor Sysoev[m
[31m-/ Copyright (C) Nginx, Inc.[m
[31m-/[m
[31m-[m
[31m-/ ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock,[m
[31m-/     ngx_atomic_uint_t old, ngx_atomic_uint_t set);[m
[31m-/[m
[31m-/ the arguments are passed on stack (%esp), 4(%esp), 8(%esp)[m
[31m-[m
[31m-        .inline ngx_atomic_cmp_set,0[m
[31m-        movl      (%esp), %ecx[m
[31m-        movl      4(%esp), %eax[m
[31m-        movl      8(%esp), %edx[m
[31m-        lock[m
[31m-        cmpxchgl  %edx, (%ecx)[m
[31m-        setz      %al[m
[31m-        movzbl    %al, %eax[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value,[m
[31m-/     ngx_atomic_int_t add);[m
[31m-/[m
[31m-/ the arguments are passed on stack (%esp), 4(%esp)[m
[31m-[m
[31m-        .inline ngx_atomic_fetch_add,0[m
[31m-        movl      (%esp), %ecx[m
[31m-        movl      4(%esp), %eax[m
[31m-        lock[m
[31m-        xaddl     %eax, (%ecx)[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_cpu_pause()[m
[31m-/[m
[31m-/ the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware[m
[31m-/ capability added by linker because Solaris/i386 does not know about it:[m
[31m-/[m
[31m-/ ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000  [ PAUSE ][m
[31m-[m
[31m-        .inline ngx_cpu_pause,0[m
[31m-        rep; nop[m
[31m-        .end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread.h[m
[1mdeleted file mode 100644[m
[1mindex 1b52dd7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread.h[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_THREAD_H_INCLUDED_[m
[31m-#define _NGX_THREAD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-#include <pthread.h>[m
[31m-[m
[31m-[m
[31m-typedef pthread_mutex_t  ngx_thread_mutex_t;[m
[31m-[m
[31m-ngx_int_t ngx_thread_mutex_create(ngx_thread_mutex_t *mtx, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_mutex_destroy(ngx_thread_mutex_t *mtx, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_mutex_lock(ngx_thread_mutex_t *mtx, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_mutex_unlock(ngx_thread_mutex_t *mtx, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-typedef pthread_cond_t  ngx_thread_cond_t;[m
[31m-[m
[31m-ngx_int_t ngx_thread_cond_create(ngx_thread_cond_t *cond, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_cond_destroy(ngx_thread_cond_t *cond, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_cond_signal(ngx_thread_cond_t *cond, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_cond_wait(ngx_thread_cond_t *cond, ngx_thread_mutex_t *mtx,[m
[31m-    ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-#if (NGX_LINUX)[m
[31m-[m
[31m-typedef pid_t      ngx_tid_t;[m
[31m-#define NGX_TID_T_FMT         "%P"[m
[31m-[m
[31m-#elif (NGX_FREEBSD)[m
[31m-[m
[31m-typedef uint32_t   ngx_tid_t;[m
[31m-#define NGX_TID_T_FMT         "%uD"[m
[31m-[m
[31m-#elif (NGX_DARWIN)[m
[31m-[m
[31m-typedef uint64_t   ngx_tid_t;[m
[31m-#define NGX_TID_T_FMT         "%uA"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef uint64_t   ngx_tid_t;[m
[31m-#define NGX_TID_T_FMT         "%uA"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-ngx_tid_t ngx_thread_tid(void);[m
[31m-[m
[31m-#define ngx_log_tid           ngx_thread_tid()[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_log_tid           0[m
[31m-#define NGX_TID_T_FMT         "%d"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_THREAD_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_cond.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_cond.c[m
[1mdeleted file mode 100644[m
[1mindex f524696..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_cond.c[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_cond_create(ngx_thread_cond_t *cond, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_cond_init(cond, NULL);[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_cond_init(%p)", cond);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_init() failed");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_cond_destroy(ngx_thread_cond_t *cond, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_cond_destroy(cond);[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_cond_destroy(%p)", cond);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_destroy() failed");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_cond_signal(ngx_thread_cond_t *cond, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_cond_signal(cond);[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_cond_signal(%p)", cond);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_signal() failed");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_cond_wait(ngx_thread_cond_t *cond, ngx_thread_mutex_t *mtx,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pthread_cond_wait(%p) enter", cond);[m
[31m-[m
[31m-    err = pthread_cond_wait(cond, mtx);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_cond_wait(%p) exit", cond);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_cond_wait() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_id.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_id.c[m
[1mdeleted file mode 100644[m
[1mindex 5174f1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_id.c[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_thread_pool.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_LINUX)[m
[31m-[m
[31m-/*[m
[31m- * Linux thread id is a pid of thread created by clone(2),[m
[31m- * glibc does not provide a wrapper for gettid().[m
[31m- */[m
[31m-[m
[31m-ngx_tid_t[m
[31m-ngx_thread_tid(void)[m
[31m-{[m
[31m-    return syscall(SYS_gettid);[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_FREEBSD) && (__FreeBSD_version >= 900031)[m
[31m-[m
[31m-#include <pthread_np.h>[m
[31m-[m
[31m-ngx_tid_t[m
[31m-ngx_thread_tid(void)[m
[31m-{[m
[31m-    return pthread_getthreadid_np();[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_DARWIN)[m
[31m-[m
[31m-/*[m
[31m- * MacOSX thread has two thread ids:[m
[31m- *[m
[31m- * 1) MacOSX 10.6 (Snow Leoprad) has pthread_threadid_np() returning[m
[31m- *    an uint64_t value, which is obtained using the __thread_selfid()[m
[31m- *    syscall.  It is a number above 300,000.[m
[31m- */[m
[31m-[m
[31m-ngx_tid_t[m
[31m-ngx_thread_tid(void)[m
[31m-{[m
[31m-    uint64_t  tid;[m
[31m-[m
[31m-    (void) pthread_threadid_np(NULL, &tid);[m
[31m-    return tid;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m- * 2) Kernel thread mach_port_t returned by pthread_mach_thread_np().[m
[31m- *    It is a number in range 100-100,000.[m
[31m- *[m
[31m- * return pthread_mach_thread_np(pthread_self());[m
[31m- */[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-ngx_tid_t[m
[31m-ngx_thread_tid(void)[m
[31m-{[m
[31m-    return (uint64_t) (uintptr_t) pthread_self();[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_mutex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_mutex.c[m
[1mdeleted file mode 100644[m
[1mindex 6e8385e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_thread_mutex.c[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * All modern pthread mutex implementations try to acquire a lock[m
[31m- * atomically in userland before going to sleep in kernel.  Some[m
[31m- * spins before the sleeping.[m
[31m- *[m
[31m- * In Solaris since version 8 all mutex types spin before sleeping.[m
[31m- * The default spin count is 1000.  It can be overridden using[m
[31m- * _THREAD_ADAPTIVE_SPIN=100 environment variable.[m
[31m- *[m
[31m- * In MacOSX all mutex types spin to acquire a lock protecting a mutex's[m
[31m- * internals.  If the mutex is busy, thread calls Mach semaphore_wait().[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_NORMAL lacks deadlock detection and is the fastest[m
[31m- * mutex type.[m
[31m- *[m
[31m- *   Linux:    No spinning.  The internal name PTHREAD_MUTEX_TIMED_NP[m
[31m- *             remains from the times when pthread_mutex_timedlock() was[m
[31m- *             non-standard extension.  Alias name: PTHREAD_MUTEX_FAST_NP.[m
[31m- *   FreeBSD:  No spinning.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_ERRORCHECK is usually as fast as PTHREAD_MUTEX_NORMAL[m
[31m- * yet has lightweight deadlock detection.[m
[31m- *[m
[31m- *   Linux:    No spinning.  The internal name: PTHREAD_MUTEX_ERRORCHECK_NP.[m
[31m- *   FreeBSD:  No spinning.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_RECURSIVE allows recursive locking.[m
[31m- *[m
[31m- *   Linux:    No spinning.  The internal name: PTHREAD_MUTEX_RECURSIVE_NP.[m
[31m- *   FreeBSD:  No spinning.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_ADAPTIVE_NP spins on SMP systems before sleeping.[m
[31m- *[m
[31m- *   Linux:    No deadlock detection.  Dynamically changes a spin count[m
[31m- *             for each mutex from 10 to 100 based on spin count taken[m
[31m- *             previously.[m
[31m- *   FreeBSD:  Deadlock detection.  The default spin count is 2000.[m
[31m- *             It can be overriden using LIBPTHREAD_SPINLOOPS environment[m
[31m- *             variable or by pthread_mutex_setspinloops_np().  If a lock[m
[31m- *             is still busy, sched_yield() can be called on both UP and[m
[31m- *             SMP systems.  The default yield loop count is zero, but[m
[31m- *             it can be set by LIBPTHREAD_YIELDLOOPS environment[m
[31m- *             variable or by pthread_mutex_setyieldloops_np().[m
[31m- *   Solaris:  No PTHREAD_MUTEX_ADAPTIVE_NP.[m
[31m- *   MacOSX:   No PTHREAD_MUTEX_ADAPTIVE_NP.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_ELISION_NP is a Linux extension to elide locks using[m
[31m- * Intel Restricted Transactional Memory.  It is the most suitable for[m
[31m- * rwlock pattern access because it allows simultaneous reads without lock.[m
[31m- * Supported since glibc 2.18.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_DEFAULT is default mutex type.[m
[31m- *[m
[31m- *   Linux:    PTHREAD_MUTEX_NORMAL.[m
[31m- *   FreeBSD:  PTHREAD_MUTEX_ERRORCHECK.[m
[31m- *   Solaris:  PTHREAD_MUTEX_NORMAL.[m
[31m- *   MacOSX:   PTHREAD_MUTEX_NORMAL.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_mutex_create(ngx_thread_mutex_t *mtx, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t            err;[m
[31m-    pthread_mutexattr_t  attr;[m
[31m-[m
[31m-    err = pthread_mutexattr_init(&attr);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                      "pthread_mutexattr_init() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    err = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                      "pthread_mutexattr_settype"[m
[31m-                      "(PTHREAD_MUTEX_ERRORCHECK) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    err = pthread_mutex_init(mtx, &attr);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                      "pthread_mutex_init() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    err = pthread_mutexattr_destroy(&attr);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "pthread_mutexattr_destroy() failed");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pthread_mutex_init(%p)", mtx);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_mutex_destroy(ngx_thread_mutex_t *mtx, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_mutex_destroy(mtx);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "pthread_mutex_destroy() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pthread_mutex_destroy(%p)", mtx);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_mutex_lock(ngx_thread_mutex_t *mtx, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pthread_mutex_lock(%p) enter", mtx);[m
[31m-[m
[31m-    err = pthread_mutex_lock(mtx);[m
[31m-    if (err == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_mutex_lock() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_mutex_unlock(ngx_thread_mutex_t *mtx, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_mutex_unlock(mtx);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_mutex_unlock(%p) exit", mtx);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_mutex_unlock() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_time.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_time.c[m
[1mdeleted file mode 100644[m
[1mindex cc760b2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_time.c[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * FreeBSD does not test /etc/localtime change, however, we can workaround it[m
[31m- * by calling tzset() with TZ and then without TZ to update timezone.[m
[31m- * The trick should work since FreeBSD 2.1.0.[m
[31m- *[m
[31m- * Linux does not test /etc/localtime change in localtime(),[m
[31m- * but may stat("/etc/localtime") several times in every strftime(),[m
[31m- * therefore we use it to update timezone.[m
[31m- *[m
[31m- * Solaris does not test /etc/TIMEZONE change too and no workaround available.[m
[31m- */[m
[31m-[m
[31m-void[m
[31m-ngx_timezone_update(void)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-[m
[31m-    if (getenv("TZ")) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    putenv("TZ=UTC");[m
[31m-[m
[31m-    tzset();[m
[31m-[m
[31m-    unsetenv("TZ");[m
[31m-[m
[31m-    tzset();[m
[31m-[m
[31m-#elif (NGX_LINUX)[m
[31m-    time_t      s;[m
[31m-    struct tm  *t;[m
[31m-    char        buf[4];[m
[31m-[m
[31m-    s = time(0);[m
[31m-[m
[31m-    t = localtime(&s);[m
[31m-[m
[31m-    strftime(buf, 4, "%H", t);[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_localtime(time_t s, ngx_tm_t *tm)[m
[31m-{[m
[31m-#if (NGX_HAVE_LOCALTIME_R)[m
[31m-    (void) localtime_r(&s, tm);[m
[31m-[m
[31m-#else[m
[31m-    ngx_tm_t  *t;[m
[31m-[m
[31m-    t = localtime(&s);[m
[31m-    *tm = *t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    tm->ngx_tm_mon++;[m
[31m-    tm->ngx_tm_year += 1900;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_libc_localtime(time_t s, struct tm *tm)[m
[31m-{[m
[31m-#if (NGX_HAVE_LOCALTIME_R)[m
[31m-    (void) localtime_r(&s, tm);[m
[31m-[m
[31m-#else[m
[31m-    struct tm  *t;[m
[31m-[m
[31m-    t = localtime(&s);[m
[31m-    *tm = *t;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_libc_gmtime(time_t s, struct tm *tm)[m
[31m-{[m
[31m-#if (NGX_HAVE_LOCALTIME_R)[m
[31m-    (void) gmtime_r(&s, tm);[m
[31m-[m
[31m-#else[m
[31m-    struct tm  *t;[m
[31m-[m
[31m-    t = gmtime(&s);[m
[31m-    *tm = *t;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_time.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_time.h[m
[1mdeleted file mode 100644[m
[1mindex c128c9a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_time.h[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_TIME_H_INCLUDED_[m
[31m-#define _NGX_TIME_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_rbtree_key_t      ngx_msec_t;[m
[31m-typedef ngx_rbtree_key_int_t  ngx_msec_int_t;[m
[31m-[m
[31m-typedef struct tm             ngx_tm_t;[m
[31m-[m
[31m-#define ngx_tm_sec            tm_sec[m
[31m-#define ngx_tm_min            tm_min[m
[31m-#define ngx_tm_hour           tm_hour[m
[31m-#define ngx_tm_mday           tm_mday[m
[31m-#define ngx_tm_mon            tm_mon[m
[31m-#define ngx_tm_year           tm_year[m
[31m-#define ngx_tm_wday           tm_wday[m
[31m-#define ngx_tm_isdst          tm_isdst[m
[31m-[m
[31m-#define ngx_tm_sec_t          int[m
[31m-#define ngx_tm_min_t          int[m
[31m-#define ngx_tm_hour_t         int[m
[31m-#define ngx_tm_mday_t         int[m
[31m-#define ngx_tm_mon_t          int[m
[31m-#define ngx_tm_year_t         int[m
[31m-#define ngx_tm_wday_t         int[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_GMTOFF)[m
[31m-#define ngx_tm_gmtoff         tm_gmtoff[m
[31m-#define ngx_tm_zone           tm_zone[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-[m
[31m-#define ngx_timezone(isdst) (- (isdst ? altzone : timezone) / 60)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_timezone(isdst) (- (isdst ? timezone + 3600 : timezone) / 60)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_timezone_update(void);[m
[31m-void ngx_localtime(time_t s, ngx_tm_t *tm);[m
[31m-void ngx_libc_localtime(time_t s, struct tm *tm);[m
[31m-void ngx_libc_gmtime(time_t s, struct tm *tm);[m
[31m-[m
[31m-#define ngx_gettimeofday(tp)  (void) gettimeofday(tp, NULL);[m
[31m-#define ngx_msleep(ms)        (void) usleep(ms * 1000)[m
[31m-#define ngx_sleep(s)          (void) sleep(s)[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_TIME_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_udp_recv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_udp_recv.c[m
[1mdeleted file mode 100644[m
[1mindex 6d544c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_udp_recv.c[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    ssize_t       n;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    do {[m
[31m-        n = recv(c->fd, buf, size, 0);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "recv: fd:%d %z of %uz", c->fd, n, size);[m
[31m-[m
[31m-        if (n >= 0) {[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available -= n;[m
[31m-[m
[31m-                /*[m
[31m-                 * rev->available may be negative here because some additional[m
[31m-                 * bytes may be received between kevent() and recv()[m
[31m-                 */[m
[31m-[m
[31m-                if (rev->available <= 0) {[m
[31m-                    rev->ready = 0;[m
[31m-                    rev->available = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_EAGAIN || err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "recv() not ready");[m
[31m-            n = NGX_AGAIN;[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_connection_error(c, err, "recv() failed");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } while (err == NGX_EINTR);[m
[31m-[m
[31m-    rev->ready = 0;[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        rev->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_udp_send.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_udp_send.c[m
[1mdeleted file mode 100644[m
[1mindex aabbc8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_udp_send.c[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_udp_unix_send(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    ssize_t       n;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = sendto(c->fd, buf, size, 0, c->sockaddr, c->socklen);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "sendto: fd:%d %z of %uz to \"%V\"",[m
[31m-                       c->fd, n, size, &c->addr_text);[m
[31m-[m
[31m-        if (n >= 0) {[m
[31m-            if ((size_t) n != size) {[m
[31m-                wev->error = 1;[m
[31m-                (void) ngx_connection_error(c, 0, "sendto() incomplete");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            c->sent += n;[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            wev->ready = 0;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, NGX_EAGAIN,[m
[31m-                           "sendto() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (err != NGX_EINTR) {[m
[31m-            wev->error = 1;[m
[31m-            (void) ngx_connection_error(c, err, "sendto() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_user.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_user.c[m
[1mdeleted file mode 100644[m
[1mindex 27c76ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_user.c[m
[1m+++ /dev/null[m
[36m@@ -1,90 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Solaris has thread-safe crypt()[m
[31m- * Linux has crypt_r(); "struct crypt_data" is more than 128K[m
[31m- * FreeBSD needs the mutex to protect crypt()[m
[31m- *[m
[31m- * TODO:[m
[31m- *     ngx_crypt_init() to init mutex[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_CRYPT)[m
[31m-[m
[31m-#if (NGX_HAVE_GNU_CRYPT_R)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    char               *value;[m
[31m-    size_t              len;[m
[31m-    struct crypt_data   cd;[m
[31m-[m
[31m-    cd.initialized = 0;[m
[31m-#ifdef __GLIBC__[m
[31m-    /* work around the glibc bug */[m
[31m-    cd.current_salt[0] = ~salt[0];[m
[31m-#endif[m
[31m-[m
[31m-    value = crypt_r((char *) key, (char *) salt, &cd);[m
[31m-[m
[31m-    if (value) {[m
[31m-        len = ngx_strlen(value) + 1;[m
[31m-[m
[31m-        *encrypted = ngx_pnalloc(pool, len);[m
[31m-        if (*encrypted == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(*encrypted, value, len);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, pool->log, ngx_errno, "crypt_r() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    char       *value;[m
[31m-    size_t      len;[m
[31m-    ngx_err_t   err;[m
[31m-[m
[31m-    value = crypt((char *) key, (char *) salt);[m
[31m-[m
[31m-    if (value) {[m
[31m-        len = ngx_strlen(value) + 1;[m
[31m-[m
[31m-        *encrypted = ngx_pnalloc(pool, len);[m
[31m-        if (*encrypted == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(*encrypted, value, len);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_CRYPT */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_user.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_user.h[m
[1mdeleted file mode 100644[m
[1mindex 6e82204..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_user.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_USER_H_INCLUDED_[m
[31m-#define _NGX_USER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef uid_t  ngx_uid_t;[m
[31m-typedef gid_t  ngx_gid_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_USER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_writev_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_writev_chain.c[m
[1mdeleted file mode 100644[m
[1mindex e38a3aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/unix/ngx_writev_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    ssize_t        n, sent;[m
[31m-    off_t          send, prev_send;[m
[31m-    ngx_chain_t   *cl;[m
[31m-    ngx_event_t   *wev;[m
[31m-    ngx_iovec_t    vec;[m
[31m-    struct iovec   iovs[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {[m
[31m-        (void) ngx_connection_error(c, wev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-        wev->error = 1;[m
[31m-        return NGX_CHAIN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* the maximum limit size is the maximum size_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    vec.iovs = iovs;[m
[31m-    vec.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        /* create the iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        cl = ngx_output_chain_to_iovec(&vec, in, limit - send, c->log);[m
[31m-[m
[31m-        if (cl == NGX_CHAIN_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cl && cl->buf->in_file) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "file buf in writev "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          cl->buf->temporary,[m
[31m-                          cl->buf->recycled,[m
[31m-                          cl->buf->in_file,[m
[31m-                          cl->buf->start,[m
[31m-                          cl->buf->pos,[m
[31m-                          cl->buf->last,[m
[31m-                          cl->buf->file,[m
[31m-                          cl->buf->file_pos,[m
[31m-                          cl->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        send += vec.size;[m
[31m-[m
[31m-        n = ngx_writev(c, &vec);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if (send - prev_send != sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_output_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *in, size_t limit,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    size_t         total, size;[m
[31m-    u_char        *prev;[m
[31m-    ngx_uint_t     n;[m
[31m-    struct iovec  *iov;[m
[31m-[m
[31m-    iov = NULL;[m
[31m-    prev = NULL;[m
[31m-    total = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for ( /* void */ ; in && total < limit; in = in->next) {[m
[31m-[m
[31m-        if (ngx_buf_special(in->buf)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->in_file) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(in->buf)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "bad buf in output chain "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          in->buf->temporary,[m
[31m-                          in->buf->recycled,[m
[31m-                          in->buf->in_file,[m
[31m-                          in->buf->start,[m
[31m-                          in->buf->pos,[m
[31m-                          in->buf->last,[m
[31m-                          in->buf->file,[m
[31m-                          in->buf->file_pos,[m
[31m-                          in->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        size = in->buf->last - in->buf->pos;[m
[31m-[m
[31m-        if (size > limit - total) {[m
[31m-            size = limit - total;[m
[31m-        }[m
[31m-[m
[31m-        if (prev == in->buf->pos) {[m
[31m-            iov->iov_len += size;[m
[31m-[m
[31m-        } else {[m
[31m-            if (n == vec->nalloc) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            iov = &vec->iovs[n++];[m
[31m-[m
[31m-            iov->iov_base = (void *) in->buf->pos;[m
[31m-            iov->iov_len = size;[m
[31m-        }[m
[31m-[m
[31m-        prev = in->buf->pos + size;[m
[31m-        total += size;[m
[31m-    }[m
[31m-[m
[31m-    vec->count = n;[m
[31m-    vec->size = total;[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_writev(ngx_connection_t *c, ngx_iovec_t *vec)[m
[31m-{[m
[31m-    ssize_t    n;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-    n = writev(c->fd, vec->iovs, vec->count);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "writev: %z of %uz", n, vec->size);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        switch (err) {[m
[31m-        case NGX_EAGAIN:[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "writev() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-[m
[31m-        case NGX_EINTR:[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "writev() was interrupted");[m
[31m-            goto eintr;[m
[31m-[m
[31m-        default:[m
[31m-            c->write->error = 1;[m
[31m-            ngx_connection_error(c, err, "writev() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx.ico b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx.ico[m
[1mdeleted file mode 100644[m
[1mindex 70f79db..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx.ico and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx.rc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx.rc[m
[1mdeleted file mode 100644[m
[1mindex dc8b7ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx.rc[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-[m
[31m-// Copyright (C) Igor Sysoev[m
[31m-// Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-nginx   icon  discardable  "src\\os\\win32\\nginx.ico"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon16.xpm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon16.xpm[m
[1mdeleted file mode 100644[m
[1mindex 45e4bad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon16.xpm[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-/* XPM */[m
[31m-static char * nginx_xpm[] = {[m
[31m-"16 16 2 2",[m
[31m-/* colors */[m
[31m-"   c none",[m
[31m-"GG c #009900",[m
[31m-/* pixels */[m
[31m-"                                ",[m
[31m-"        GGGGGGGGGGGGGGGG        ",[m
[31m-"        GGGGGGGGGGGGGGGG        ",[m
[31m-"      GGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"      GGGGGG        GGGGGG      ",[m
[31m-"    GGGGGG            GGGGGG    ",[m
[31m-"    GGGGGG                      ",[m
[31m-"  GGGGGG      GGGGGGGGGGGGGGGG  ",[m
[31m-"  GGGGGG    GGGGGGGGGGGGGGGGGG  ",[m
[31m-"    GGGGGG    GGGGGGGGGGGGGG    ",[m
[31m-"    GGGGGG            GGGGGG    ",[m
[31m-"      GGGGGG        GGGGGG      ",[m
[31m-"      GGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"        GGGGGGGGGGGGGGGG        ",[m
[31m-"        GGGGGGGGGGGGGGGG        ",[m
[31m-"                                "[m
[31m-};[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon32.xpm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon32.xpm[m
[1mdeleted file mode 100644[m
[1mindex eb26638..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon32.xpm[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-/* XPM */[m
[31m-static char * nginx_xpm[] = {[m
[31m-"32 32 2 2",[m
[31m-/* colors */[m
[31m-"   c none",[m
[31m-"GG c #009900",[m
[31m-/* pixels */[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                  GGGGGGGGGGGGGGGGGGGGGGGGGGGG                  ",[m
[31m-"                GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                ",[m
[31m-"                GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                ",[m
[31m-"              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG              ",[m
[31m-"              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG              ",[m
[31m-"            GGGGGGGGGG                    GGGGGGGGGG            ",[m
[31m-"            GGGGGGGGGG                    GGGGGGGGGG            ",[m
[31m-"          GGGGGGGGGG                        GGGGGGGGGG          ",[m
[31m-"          GGGGGGGGGG                        GGGGGGGGGG          ",[m
[31m-"        GGGGGGGGGG                                              ",[m
[31m-"        GGGGGGGGGG                                              ",[m
[31m-"      GGGGGGGGGG            GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"      GGGGGGGGGG          GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"        GGGGGGGGGG        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG        ",[m
[31m-"        GGGGGGGGGG        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG        ",[m
[31m-"          GGGGGGGGGG        GGGGGGGGGGGGGGGGGGGGGGGGGG          ",[m
[31m-"          GGGGGGGGGG                        GGGGGGGGGG          ",[m
[31m-"            GGGGGGGGGG                    GGGGGGGGGG            ",[m
[31m-"            GGGGGGGGGG                    GGGGGGGGGG            ",[m
[31m-"              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG              ",[m
[31m-"              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG              ",[m
[31m-"                GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                ",[m
[31m-"                GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                ",[m
[31m-"                  GGGGGGGGGGGGGGGGGGGGGGGGGGGG                  ",[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                                                                "[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon48.xpm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon48.xpm[m
[1mdeleted file mode 100644[m
[1mindex c25ba0f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/nginx_icon48.xpm[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-/* XPM */[m
[31m-static char * nginx_xpm[] = {[m
[31m-"48 48 2 2",[m
[31m-/* colors */[m
[31m-"   c none",[m
[31m-"GG c #009900",[m
[31m-/* pixels */[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                        ",[m
[31m-"                        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                        ",[m
[31m-"                      GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                      ",[m
[31m-"                      GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                      ",[m
[31m-"                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                    ",[m
[31m-"                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                    ",[m
[31m-"                  GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                  ",[m
[31m-"                  GGGGGGGGGGGGGGGG                            GGGGGGGGGGGGGGGG                  ",[m
[31m-"                GGGGGGGGGGGGGGGG                                GGGGGGGGGGGGGGGG                ",[m
[31m-"                GGGGGGGGGGGGGGGG                                GGGGGGGGGGGGGGGG                ",[m
[31m-"              GGGGGGGGGGGGGGGG                                    GGGGGGGGGGGGGGGG              ",[m
[31m-"              GGGGGGGGGGGGGGGG                                    GGGGGGGGGGGGGGGG              ",[m
[31m-"            GGGGGGGGGGGGGGGG                                        GGGGGGGGGGGGGGGG            ",[m
[31m-"            GGGGGGGGGGGGGGGG                                        GGGGGGGGGGGGGGGG            ",[m
[31m-"          GGGGGGGGGGGGGGGG                                            GGGGGGGGGGGGGGGG          ",[m
[31m-"          GGGGGGGGGGGGGGGG                                                                      ",[m
[31m-"        GGGGGGGGGGGGGGGG                                                                        ",[m
[31m-"        GGGGGGGGGGGGGGGG                                                                        ",[m
[31m-"      GGGGGGGGGGGGGGGG                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"      GGGGGGGGGGGGGGGG                  GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"        GGGGGGGGGGGGGGGG              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG        ",[m
[31m-"        GGGGGGGGGGGGGGGG              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG        ",[m
[31m-"          GGGGGGGGGGGGGGGG            GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG          ",[m
[31m-"          GGGGGGGGGGGGGGGG              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG          ",[m
[31m-"            GGGGGGGGGGGGGGGG              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG            ",[m
[31m-"            GGGGGGGGGGGGGGGG                                        GGGGGGGGGGGGGGGG            ",[m
[31m-"              GGGGGGGGGGGGGGGG                                    GGGGGGGGGGGGGGGG              ",[m
[31m-"              GGGGGGGGGGGGGGGG                                    GGGGGGGGGGGGGGGG              ",[m
[31m-"                GGGGGGGGGGGGGGGG                                GGGGGGGGGGGGGGGG                ",[m
[31m-"                GGGGGGGGGGGGGGGG                                GGGGGGGGGGGGGGGG                ",[m
[31m-"                  GGGGGGGGGGGGGGGG                            GGGGGGGGGGGGGGGG                  ",[m
[31m-"                  GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                  ",[m
[31m-"                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                    ",[m
[31m-"                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                    ",[m
[31m-"                      GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                      ",[m
[31m-"                      GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                      ",[m
[31m-"                        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                        ",[m
[31m-"                        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                        ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_alloc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_alloc.c[m
[1mdeleted file mode 100644[m
[1mindex 0c0ef30..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_alloc.c[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_pagesize;[m
[31m-ngx_uint_t  ngx_pagesize_shift;[m
[31m-ngx_uint_t  ngx_cacheline_size;[m
[31m-[m
[31m-[m
[31m-void *ngx_alloc(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = malloc(size);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "malloc(%uz) failed", size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *ngx_calloc(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = ngx_alloc(size, log);[m
[31m-[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_alloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_alloc.h[m
[1mdeleted file mode 100644[m
[1mindex 5a0fa3f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_alloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ALLOC_H_INCLUDED_[m
[31m-#define _NGX_ALLOC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void *ngx_alloc(size_t size, ngx_log_t *log);[m
[31m-void *ngx_calloc(size_t size, ngx_log_t *log);[m
[31m-[m
[31m-#define ngx_free          free[m
[31m-#define ngx_memalign(alignment, size, log)  ngx_alloc(size, log)[m
[31m-[m
[31m-extern ngx_uint_t  ngx_pagesize;[m
[31m-extern ngx_uint_t  ngx_pagesize_shift;[m
[31m-extern ngx_uint_t  ngx_cacheline_size;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ALLOC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_atomic.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_atomic.h[m
[1mdeleted file mode 100644[m
[1mindex 113f561..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_atomic.h[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ATOMIC_H_INCLUDED_[m
[31m-#define _NGX_ATOMIC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS   1[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-[m
[31m-#if defined( __WATCOMC__ ) || defined( __BORLANDC__ ) || defined(__GNUC__)    \[m
[31m-    || ( _MSC_VER >= 1300 )[m
[31m-[m
[31m-/* the new SDK headers */[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, set)                                    \[m
[31m-    ((ngx_atomic_uint_t) InterlockedCompareExchange((long *) lock, set, old)  \[m
[31m-                         == old)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* the old MS VC6.0SP2 SDK headers */[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, set)                                    \[m
[31m-    (InterlockedCompareExchange((void **) lock, (void *) set, (void *) old)   \[m
[31m-     == (void *) old)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_atomic_fetch_add(p, add) InterlockedExchangeAdd((long *) p, add)[m
[31m-[m
[31m-[m
[31m-#define ngx_memory_barrier()[m
[31m-[m
[31m-[m
[31m-#if defined( __BORLANDC__ ) || ( __WATCOMC__ < 1230 )[m
[31m-[m
[31m-/*[m
[31m- * Borland C++ 5.5 (tasm32) and Open Watcom C prior to 1.3[m
[31m- * do not understand the "pause" instruction[m
[31m- */[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[31m-#else[m
[31m-#define ngx_cpu_pause()       __asm { pause }[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin);[m
[31m-[m
[31m-#define ngx_trylock(lock)  (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))[m
[31m-#define ngx_unlock(lock)    *(lock) = 0[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ATOMIC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_dlopen.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_dlopen.c[m
[1mdeleted file mode 100644[m
[1mindex 804f49d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_dlopen.c[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_dlerror(void)[m
[31m-{[m
[31m-    u_char         *p;[m
[31m-    static u_char   errstr[NGX_MAX_ERROR_STR];[m
[31m-[m
[31m-    p = ngx_strerror(ngx_errno, errstr, NGX_MAX_ERROR_STR);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return (char *) errstr;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_dlopen.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_dlopen.h[m
[1mdeleted file mode 100644[m
[1mindex 0d6b405..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_dlopen.h[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_DLOPEN_H_INCLUDED_[m
[31m-#define _NGX_DLOPEN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_DLOPEN  1[m
[31m-[m
[31m-[m
[31m-#define ngx_dlopen(path)           LoadLibrary((char *) path)[m
[31m-#define ngx_dlopen_n               "LoadLibrary()"[m
[31m-[m
[31m-#define ngx_dlsym(handle, symbol)  (void *) GetProcAddress(handle, symbol)[m
[31m-#define ngx_dlsym_n                "GetProcAddress()"[m
[31m-[m
[31m-#define ngx_dlclose(handle)        (FreeLibrary(handle) ? 0 : -1)[m
[31m-#define ngx_dlclose_n              "FreeLibrary()"[m
[31m-[m
[31m-[m
[31m-char *ngx_dlerror(void);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_DLOPEN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_errno.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_errno.c[m
[1mdeleted file mode 100644[m
[1mindex b732bf4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_errno.c[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)[m
[31m-{[m
[31m-    u_int          len;[m
[31m-    static u_long  lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        return errstr;[m
[31m-    }[m
[31m-[m
[31m-    len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-                        NULL, err, lang, (char *) errstr, size, NULL);[m
[31m-[m
[31m-    if (len == 0 && lang && GetLastError() == ERROR_RESOURCE_LANG_NOT_FOUND) {[m
[31m-[m
[31m-        /*[m
[31m-         * Try to use English messages first and fallback to a language,[m
[31m-         * based on locale: non-English Windows have no English messages[m
[31m-         * at all.  This way allows to use English messages at least on[m
[31m-         * Windows with MUI.[m
[31m-         */[m
[31m-[m
[31m-        lang = 0;[m
[31m-[m
[31m-        len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-                            NULL, err, lang, (char *) errstr, size, NULL);[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return ngx_snprintf(errstr, size,[m
[31m-                            "FormatMessage() error:(%d)", GetLastError());[m
[31m-    }[m
[31m-[m
[31m-    /* remove ".\r\n\0" */[m
[31m-    while (errstr[len] == '\0' || errstr[len] == CR[m
[31m-           || errstr[len] == LF || errstr[len] == '.')[m
[31m-    {[m
[31m-        --len;[m
[31m-    }[m
[31m-[m
[31m-    return &errstr[++len];[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_strerror_init(void)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_errno.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_errno.h[m
[1mdeleted file mode 100644[m
[1mindex 255a39d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_errno.h[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ERRNO_H_INCLUDED_[m
[31m-#define _NGX_ERRNO_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef DWORD                      ngx_err_t;[m
[31m-[m
[31m-#define ngx_errno                  GetLastError()[m
[31m-#define ngx_set_errno(err)         SetLastError(err)[m
[31m-#define ngx_socket_errno           WSAGetLastError()[m
[31m-#define ngx_set_socket_errno(err)  WSASetLastError(err)[m
[31m-[m
[31m-#define NGX_EPERM                  ERROR_ACCESS_DENIED[m
[31m-#define NGX_ENOENT                 ERROR_FILE_NOT_FOUND[m
[31m-#define NGX_ENOPATH                ERROR_PATH_NOT_FOUND[m
[31m-#define NGX_ENOMEM                 ERROR_NOT_ENOUGH_MEMORY[m
[31m-#define NGX_EACCES                 ERROR_ACCESS_DENIED[m
[31m-/*[m
[31m- * there are two EEXIST error codes:[m
[31m- * ERROR_FILE_EXISTS used by CreateFile(CREATE_NEW),[m
[31m- * and ERROR_ALREADY_EXISTS used by CreateDirectory();[m
[31m- * MoveFile() uses both[m
[31m- */[m
[31m-#define NGX_EEXIST                 ERROR_ALREADY_EXISTS[m
[31m-#define NGX_EEXIST_FILE            ERROR_FILE_EXISTS[m
[31m-#define NGX_EXDEV                  ERROR_NOT_SAME_DEVICE[m
[31m-#define NGX_ENOTDIR                ERROR_PATH_NOT_FOUND[m
[31m-#define NGX_EISDIR                 ERROR_CANNOT_MAKE[m
[31m-#define NGX_ENOSPC                 ERROR_DISK_FULL[m
[31m-#define NGX_EPIPE                  EPIPE[m
[31m-#define NGX_EAGAIN                 WSAEWOULDBLOCK[m
[31m-#define NGX_EINPROGRESS            WSAEINPROGRESS[m
[31m-#define NGX_ENOPROTOOPT            WSAENOPROTOOPT[m
[31m-#define NGX_EOPNOTSUPP             WSAEOPNOTSUPP[m
[31m-#define NGX_EADDRINUSE             WSAEADDRINUSE[m
[31m-#define NGX_ECONNABORTED           WSAECONNABORTED[m
[31m-#define NGX_ECONNRESET             WSAECONNRESET[m
[31m-#define NGX_ENOTCONN               WSAENOTCONN[m
[31m-#define NGX_ETIMEDOUT              WSAETIMEDOUT[m
[31m-#define NGX_ECONNREFUSED           WSAECONNREFUSED[m
[31m-#define NGX_ENAMETOOLONG           ERROR_BAD_PATHNAME[m
[31m-#define NGX_ENETDOWN               WSAENETDOWN[m
[31m-#define NGX_ENETUNREACH            WSAENETUNREACH[m
[31m-#define NGX_EHOSTDOWN              WSAEHOSTDOWN[m
[31m-#define NGX_EHOSTUNREACH           WSAEHOSTUNREACH[m
[31m-#define NGX_ENOMOREFILES           ERROR_NO_MORE_FILES[m
[31m-#define NGX_EILSEQ                 ERROR_NO_UNICODE_TRANSLATION[m
[31m-#define NGX_ELOOP                  0[m
[31m-#define NGX_EBADF                  WSAEBADF[m
[31m-[m
[31m-#define NGX_EALREADY               WSAEALREADY[m
[31m-#define NGX_EINVAL                 WSAEINVAL[m
[31m-#define NGX_EMFILE                 WSAEMFILE[m
[31m-#define NGX_ENFILE                 WSAEMFILE[m
[31m-[m
[31m-[m
[31m-u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size);[m
[31m-ngx_int_t ngx_strerror_init(void);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ERRNO_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_event_log.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_event_log.c[m
[1mdeleted file mode 100644[m
[1mindex e11ed1e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_event_log.c[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_ERROR_STR   2048[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_event_log(ngx_err_t err, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char         *p, *last;[m
[31m-    long            types;[m
[31m-    HKEY            key;[m
[31m-    HANDLE          ev;[m
[31m-    va_list         args;[m
[31m-    u_char          text[NGX_MAX_ERROR_STR];[m
[31m-    const char     *msgarg[9];[m
[31m-    static u_char   netmsg[] = "%SystemRoot%\\System32\\netmsg.dll";[m
[31m-[m
[31m-    last = text + NGX_MAX_ERROR_STR;[m
[31m-    p = text + GetModuleFileName(NULL, (char *) text, NGX_MAX_ERROR_STR - 50);[m
[31m-[m
[31m-    *p++ = ':';[m
[31m-    ngx_linefeed(p);[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(p, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    if (err) {[m
[31m-        p = ngx_log_errno(p, last, err);[m
[31m-    }[m
[31m-[m
[31m-    if (p > last - NGX_LINEFEED_SIZE - 1) {[m
[31m-        p = last - NGX_LINEFEED_SIZE - 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_linefeed(p);[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    /*[m
[31m-     * we do not log errors here since we use[m
[31m-     * Event Log only to log our own logs open errors[m
[31m-     */[m
[31m-[m
[31m-    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,[m
[31m-           "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\nginx",[m
[31m-           0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &key, NULL)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (RegSetValueEx(key, "EventMessageFile", 0, REG_EXPAND_SZ,[m
[31m-                      netmsg, sizeof(netmsg) - 1)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    types = EVENTLOG_ERROR_TYPE;[m
[31m-[m
[31m-    if (RegSetValueEx(key, "TypesSupported", 0, REG_DWORD,[m
[31m-                      (u_char *) &types, sizeof(long))[m
[31m-        != 0)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    RegCloseKey(key);[m
[31m-[m
[31m-    ev = RegisterEventSource(NULL, "nginx");[m
[31m-[m
[31m-    msgarg[0] = (char *) text;[m
[31m-    msgarg[1] = NULL;[m
[31m-    msgarg[2] = NULL;[m
[31m-    msgarg[3] = NULL;[m
[31m-    msgarg[4] = NULL;[m
[31m-    msgarg[5] = NULL;[m
[31m-    msgarg[6] = NULL;[m
[31m-    msgarg[7] = NULL;[m
[31m-    msgarg[8] = NULL;[m
[31m-[m
[31m-    /*[m
[31m-     * the 3299 event id in netmsg.dll has the generic message format:[m
[31m-     *     "%1 %2 %3 %4 %5 %6 %7 %8 %9"[m
[31m-     */[m
[31m-[m
[31m-    ReportEvent(ev, EVENTLOG_ERROR_TYPE, 0, 3299, NULL, 9, 0, msgarg, NULL);[m
[31m-[m
[31m-    DeregisterEventSource(ev);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_files.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_files.c[m
[1mdeleted file mode 100644[m
[1mindex 9ef22a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_files.c[m
[1m+++ /dev/null[m
[36m@@ -1,883 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_UTF16_BUFLEN  256[m
[31m-[m
[31m-static ngx_int_t ngx_win32_check_filename(u_char *name, u_short *u,[m
[31m-    size_t len);[m
[31m-static u_short *ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len);[m
[31m-[m
[31m-[m
[31m-/* FILE_FLAG_BACKUP_SEMANTICS allows to obtain a handle to a directory */[m
[31m-[m
[31m-ngx_fd_t[m
[31m-ngx_open_file(u_char *name, u_long mode, u_long create, u_long access)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    u_short    *u;[m
[31m-    ngx_fd_t    fd;[m
[31m-    ngx_err_t   err;[m
[31m-    u_short     utf16[NGX_UTF16_BUFLEN];[m
[31m-[m
[31m-    len = NGX_UTF16_BUFLEN;[m
[31m-    u = ngx_utf8_to_utf16(utf16, name, &len);[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        return INVALID_HANDLE_VALUE;[m
[31m-    }[m
[31m-[m
[31m-    fd = INVALID_HANDLE_VALUE;[m
[31m-[m
[31m-    if (create == NGX_FILE_OPEN[m
[31m-        && ngx_win32_check_filename(name, u, len) != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fd = CreateFileW(u, mode,[m
[31m-                     FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,[m
[31m-                     NULL, create, FILE_FLAG_BACKUP_SEMANTICS, NULL);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (u != utf16) {[m
[31m-        err = ngx_errno;[m
[31m-        ngx_free(u);[m
[31m-        ngx_set_errno(err);[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)[m
[31m-{[m
[31m-    u_long      n;[m
[31m-    ngx_err_t   err;[m
[31m-    OVERLAPPED  ovlp, *povlp;[m
[31m-[m
[31m-    ovlp.Internal = 0;[m
[31m-    ovlp.InternalHigh = 0;[m
[31m-    ovlp.Offset = (u_long) offset;[m
[31m-    ovlp.OffsetHigh = (u_long) (offset >> 32);[m
[31m-    ovlp.hEvent = NULL;[m
[31m-[m
[31m-    povlp = &ovlp;[m
[31m-[m
[31m-    if (ReadFile(file->fd, buf, size, &n, povlp) == 0) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == ERROR_HANDLE_EOF) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, file->log, err,[m
[31m-                      "ReadFile() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->offset += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)[m
[31m-{[m
[31m-    u_long      n;[m
[31m-    OVERLAPPED  ovlp, *povlp;[m
[31m-[m
[31m-    ovlp.Internal = 0;[m
[31m-    ovlp.InternalHigh = 0;[m
[31m-    ovlp.Offset = (u_long) offset;[m
[31m-    ovlp.OffsetHigh = (u_long) (offset >> 32);[m
[31m-    ovlp.hEvent = NULL;[m
[31m-[m
[31m-    povlp = &ovlp;[m
[31m-[m
[31m-    if (WriteFile(file->fd, buf, size, &n, povlp) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno,[m
[31m-                      "WriteFile() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n != size) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, 0,[m
[31m-                      "WriteFile() \"%s\" has written only %ul of %uz",[m
[31m-                      file->name.data, n, size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->offset += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    u_char   *buf, *prev;[m
[31m-    size_t    size;[m
[31m-    ssize_t   total, n;[m
[31m-[m
[31m-    total = 0;[m
[31m-[m
[31m-    while (cl) {[m
[31m-        buf = cl->buf->pos;[m
[31m-        prev = buf;[m
[31m-        size = 0;[m
[31m-[m
[31m-        /* coalesce the neighbouring bufs */[m
[31m-[m
[31m-        while (cl && prev == cl->buf->pos) {[m
[31m-            size += cl->buf->last - cl->buf->pos;[m
[31m-            prev = cl->buf->last;[m
[31m-            cl = cl->next;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_write_file(file, buf, size, offset);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        total += n;[m
[31m-        offset += n;[m
[31m-    }[m
[31m-[m
[31m-    return total;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_read_fd(ngx_fd_t fd, void *buf, size_t size)[m
[31m-{[m
[31m-    u_long  n;[m
[31m-[m
[31m-    if (ReadFile(fd, buf, size, &n, NULL) != 0) {[m
[31m-        return (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_fd(ngx_fd_t fd, void *buf, size_t size)[m
[31m-{[m
[31m-    u_long  n;[m
[31m-[m
[31m-    if (WriteFile(fd, buf, size, &n, NULL) != 0) {[m
[31m-        return (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_console(ngx_fd_t fd, void *buf, size_t size)[m
[31m-{[m
[31m-    u_long  n;[m
[31m-[m
[31m-    (void) CharToOemBuff(buf, buf, size);[m
[31m-[m
[31m-    if (WriteFile(fd, buf, size, &n, NULL) != 0) {[m
[31m-        return (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)[m
[31m-{[m
[31m-    u_char             *name;[m
[31m-    ngx_err_t           err;[m
[31m-    ngx_uint_t          collision;[m
[31m-    ngx_atomic_uint_t   num;[m
[31m-[m
[31m-    name = ngx_alloc(to->len + 1 + NGX_ATOMIC_T_LEN + 1 + sizeof("DELETE"),[m
[31m-                     log);[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_ENOMEM;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name, to->data, to->len);[m
[31m-[m
[31m-    collision = 0;[m
[31m-[m
[31m-    /* mutex_lock() (per cache or single ?) */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        num = ngx_next_temp_number(collision);[m
[31m-[m
[31m-        ngx_sprintf(name + to->len, ".%0muA.DELETE%Z", num);[m
[31m-[m
[31m-        if (MoveFile((const char *) to->data, (const char *) name) != 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        collision = 1;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,[m
[31m-                      "MoveFile() \"%s\" to \"%s\" failed", to->data, name);[m
[31m-    }[m
[31m-[m
[31m-    if (MoveFile((const char *) from->data, (const char *) to->data) == 0) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-    } else {[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (DeleteFile((const char *) name) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,[m
[31m-                      "DeleteFile() \"%s\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    /* mutex_unlock() */[m
[31m-[m
[31m-    ngx_free(name);[m
[31m-[m
[31m-    return err;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_file_info(u_char *file, ngx_file_info_t *sb)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    long                        rc;[m
[31m-    u_short                    *u;[m
[31m-    ngx_err_t                   err;[m
[31m-    WIN32_FILE_ATTRIBUTE_DATA   fa;[m
[31m-    u_short                     utf16[NGX_UTF16_BUFLEN];[m
[31m-[m
[31m-    len = NGX_UTF16_BUFLEN;[m
[31m-[m
[31m-    u = ngx_utf8_to_utf16(utf16, file, &len);[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_FILE_ERROR;[m
[31m-[m
[31m-    if (ngx_win32_check_filename(file, u, len) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    rc = GetFileAttributesExW(u, GetFileExInfoStandard, &fa);[m
[31m-[m
[31m-    sb->dwFileAttributes = fa.dwFileAttributes;[m
[31m-    sb->ftCreationTime = fa.ftCreationTime;[m
[31m-    sb->ftLastAccessTime = fa.ftLastAccessTime;[m
[31m-    sb->ftLastWriteTime = fa.ftLastWriteTime;[m
[31m-    sb->nFileSizeHigh = fa.nFileSizeHigh;[m
[31m-    sb->nFileSizeLow = fa.nFileSizeLow;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (u != utf16) {[m
[31m-        err = ngx_errno;[m
[31m-        ngx_free(u);[m
[31m-        ngx_set_errno(err);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s)[m
[31m-{[m
[31m-    uint64_t  intervals;[m
[31m-    FILETIME  ft;[m
[31m-[m
[31m-    /* 116444736000000000 is commented in src/os/win32/ngx_time.c */[m
[31m-[m
[31m-    intervals = s * 10000000 + 116444736000000000;[m
[31m-[m
[31m-    ft.dwLowDateTime = (DWORD) intervals;[m
[31m-    ft.dwHighDateTime = (DWORD) (intervals >> 32);[m
[31m-[m
[31m-    if (SetFileTime(fd, NULL, NULL, &ft) != 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_file_mapping(ngx_file_mapping_t *fm)[m
[31m-{[m
[31m-    LARGE_INTEGER  size;[m
[31m-[m
[31m-    fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE,[m
[31m-                           NGX_FILE_DEFAULT_ACCESS);[m
[31m-    if (fm->fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", fm->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fm->handle = NULL;[m
[31m-[m
[31m-    size.QuadPart = fm->size;[m
[31m-[m
[31m-    if (SetFilePointerEx(fm->fd, size, NULL, FILE_BEGIN) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "SetFilePointerEx(\"%s\", %uz) failed",[m
[31m-                      fm->name, fm->size);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (SetEndOfFile(fm->fd) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "SetEndOfFile() \"%s\" failed", fm->name);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fm->handle = CreateFileMapping(fm->fd, NULL, PAGE_READWRITE,[m
[31m-                                   (u_long) ((off_t) fm->size >> 32),[m
[31m-                                   (u_long) ((off_t) fm->size & 0xffffffff),[m
[31m-                                   NULL);[m
[31m-    if (fm->handle == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "CreateFileMapping(%s, %uz) failed",[m
[31m-                      fm->name, fm->size);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fm->addr = MapViewOfFile(fm->handle, FILE_MAP_WRITE, 0, 0, 0);[m
[31m-[m
[31m-    if (fm->addr != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                  "MapViewOfFile(%uz) of file mapping \"%s\" failed",[m
[31m-                  fm->size, fm->name);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (fm->handle) {[m
[31m-        if (CloseHandle(fm->handle) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                          "CloseHandle() of file mapping \"%s\" failed",[m
[31m-                          fm->name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", fm->name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_file_mapping(ngx_file_mapping_t *fm)[m
[31m-{[m
[31m-    if (UnmapViewOfFile(fm->addr) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      "UnmapViewOfFile(%p) of file mapping \"%s\" failed",[m
[31m-                      fm->addr, &fm->name);[m
[31m-    }[m
[31m-[m
[31m-    if (CloseHandle(fm->handle) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      "CloseHandle() of file mapping \"%s\" failed",[m
[31m-                      &fm->name);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", fm->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_realpath(u_char *path, u_char *resolved)[m
[31m-{[m
[31m-    /* STUB */[m
[31m-    return path;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    ngx_cpystrn(name->data + name->len, NGX_DIR_MASK, NGX_DIR_MASK_LEN + 1);[m
[31m-[m
[31m-    dir->dir = FindFirstFile((const char *) name->data, &dir->finddata);[m
[31m-[m
[31m-    name->data[name->len] = '\0';[m
[31m-[m
[31m-    if (dir->dir == INVALID_HANDLE_VALUE) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dir->valid_info = 1;[m
[31m-    dir->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_dir(ngx_dir_t *dir)[m
[31m-{[m
[31m-    if (dir->ready) {[m
[31m-        dir->ready = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (FindNextFile(dir->dir, &dir->finddata) != 0) {[m
[31m-        dir->type = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_close_dir(ngx_dir_t *dir)[m
[31m-{[m
[31m-    if (FindClose(dir->dir) == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_glob(ngx_glob_t *gl)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    size_t      len;[m
[31m-    ngx_err_t   err;[m
[31m-[m
[31m-    gl->dir = FindFirstFile((const char *) gl->pattern, &gl->finddata);[m
[31m-[m
[31m-    if (gl->dir == INVALID_HANDLE_VALUE) {[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if ((err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND)[m
[31m-             && gl->test)[m
[31m-        {[m
[31m-            gl->no_match = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (p = gl->pattern; *p; p++) {[m
[31m-        if (*p == '/') {[m
[31m-            gl->last = p + 1 - gl->pattern;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(gl->finddata.cFileName);[m
[31m-    gl->name.len = gl->last + len;[m
[31m-[m
[31m-    gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);[m
[31m-    if (gl->name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(gl->name.data, gl->pattern, gl->last);[m
[31m-    ngx_cpystrn(gl->name.data + gl->last, (u_char *) gl->finddata.cFileName,[m
[31m-                len + 1);[m
[31m-[m
[31m-    gl->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)[m
[31m-{[m
[31m-    size_t     len;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (gl->no_match) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (gl->ready) {[m
[31m-        *name = gl->name;[m
[31m-[m
[31m-        gl->ready = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(gl->name.data);[m
[31m-    gl->name.data = NULL;[m
[31m-[m
[31m-    if (FindNextFile(gl->dir, &gl->finddata) != 0) {[m
[31m-[m
[31m-        len = ngx_strlen(gl->finddata.cFileName);[m
[31m-        gl->name.len = gl->last + len;[m
[31m-[m
[31m-        gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);[m
[31m-        if (gl->name.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(gl->name.data, gl->pattern, gl->last);[m
[31m-        ngx_cpystrn(gl->name.data + gl->last, (u_char *) gl->finddata.cFileName,[m
[31m-                    len + 1);[m
[31m-[m
[31m-        *name = gl->name;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    if (err == NGX_ENOMOREFILES) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, gl->log, err,[m
[31m-                  "FindNextFile(%s) failed", gl->pattern);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_glob(ngx_glob_t *gl)[m
[31m-{[m
[31m-    if (gl->name.data) {[m
[31m-        ngx_free(gl->name.data);[m
[31m-    }[m
[31m-[m
[31m-    if (gl->dir == INVALID_HANDLE_VALUE) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (FindClose(gl->dir) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, gl->log, ngx_errno,[m
[31m-                      "FindClose(%s) failed", gl->pattern);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_de_info(u_char *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_de_link_info(u_char *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_ahead(ngx_fd_t fd, size_t n)[m
[31m-{[m
[31m-    return ~NGX_FILE_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_directio_on(ngx_fd_t fd)[m
[31m-{[m
[31m-    return ~NGX_FILE_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_directio_off(ngx_fd_t fd)[m
[31m-{[m
[31m-    return ~NGX_FILE_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_fs_bsize(u_char *name)[m
[31m-{[m
[31m-    u_char  root[4];[m
[31m-    u_long  sc, bs, nfree, ncl;[m
[31m-[m
[31m-    if (name[2] == ':') {[m
[31m-        ngx_cpystrn(root, name, 4);[m
[31m-        name = root;[m
[31m-    }[m
[31m-[m
[31m-    if (GetDiskFreeSpace((const char *) name, &sc, &bs, &nfree, &ncl) == 0) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    return sc * bs;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_win32_check_filename(u_char *name, u_short *u, size_t len)[m
[31m-{[m
[31m-    u_char     *p, ch;[m
[31m-    u_long      n;[m
[31m-    u_short    *lu;[m
[31m-    ngx_err_t   err;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_normal,[m
[31m-        sw_after_slash,[m
[31m-        sw_after_colon,[m
[31m-        sw_after_dot[m
[31m-    } state;[m
[31m-[m
[31m-    /* check for NTFS streams (":"), trailing dots and spaces */[m
[31m-[m
[31m-    lu = NULL;[m
[31m-    state = sw_start;[m
[31m-[m
[31m-    for (p = name; *p; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case sw_start:[m
[31m-[m
[31m-            /*[m
[31m-             * skip till first "/" to allow paths starting with drive and[m
[31m-             * relative path, like "c:html/"[m
[31m-             */[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                state = sw_after_slash;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_normal:[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                state = sw_after_colon;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '.' || ch == ' ') {[m
[31m-                state = sw_after_dot;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                state = sw_after_slash;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_after_slash:[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '.') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                state = sw_after_colon;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_normal;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_after_colon:[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                state = sw_after_slash;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_after_dot:[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '.' || ch == ' ') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_normal;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (state == sw_after_dot) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    /* check if long name match */[m
[31m-[m
[31m-    lu = malloc(len * 2);[m
[31m-    if (lu == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = GetLongPathNameW(u, lu, len);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (n != len - 1 || _wcsicmp(u, lu) != 0) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(lu);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_set_errno(NGX_ENOENT);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (lu) {[m
[31m-        err = ngx_errno;[m
[31m-        ngx_free(lu);[m
[31m-        ngx_set_errno(err);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_short *[m
[31m-ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len)[m
[31m-{[m
[31m-    u_char    *p;[m
[31m-    u_short   *u, *last;[m
[31m-    uint32_t   n;[m
[31m-[m
[31m-    p = utf8;[m
[31m-    u = utf16;[m
[31m-    last = utf16 + *len;[m
[31m-[m
[31m-    while (u < last) {[m
[31m-[m
[31m-        if (*p < 0x80) {[m
[31m-            *u++ = (u_short) *p;[m
[31m-[m
[31m-            if (*p == 0) {[m
[31m-                *len = u - utf16;[m
[31m-                return utf16;[m
[31m-            }[m
[31m-[m
[31m-            p++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (u + 1 == last) {[m
[31m-            *len = u - utf16;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_utf8_decode(&p, 4);[m
[31m-[m
[31m-        if (n > 0x10ffff) {[m
[31m-            ngx_set_errno(NGX_EILSEQ);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0xffff) {[m
[31m-            n -= 0x10000;[m
[31m-            *u++ = (u_short) (0xd800 + (n >> 10));[m
[31m-            *u++ = (u_short) (0xdc00 + (n & 0x03ff));[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *u++ = (u_short) n;[m
[31m-    }[m
[31m-[m
[31m-    /* the given buffer is not enough, allocate a new one */[m
[31m-[m
[31m-    u = malloc(((p - utf8) + ngx_strlen(p) + 1) * sizeof(u_short));[m
[31m-    if (u == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u, utf16, *len * 2);[m
[31m-[m
[31m-    utf16 = u;[m
[31m-    u += *len;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (*p < 0x80) {[m
[31m-            *u++ = (u_short) *p;[m
[31m-[m
[31m-            if (*p == 0) {[m
[31m-                *len = u - utf16;[m
[31m-                return utf16;[m
[31m-            }[m
[31m-[m
[31m-            p++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_utf8_decode(&p, 4);[m
[31m-[m
[31m-        if (n > 0x10ffff) {[m
[31m-            ngx_free(utf16);[m
[31m-            ngx_set_errno(NGX_EILSEQ);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0xffff) {[m
[31m-            n -= 0x10000;[m
[31m-            *u++ = (u_short) (0xd800 + (n >> 10));[m
[31m-            *u++ = (u_short) (0xdc00 + (n & 0x03ff));[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *u++ = (u_short) n;[m
[31m-    }[m
[31m-[m
[31m-    /* unreachable */[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_files.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_files.h[m
[1mdeleted file mode 100644[m
[1mindex 895daea..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_files.h[m
[1m+++ /dev/null[m
[36m@@ -1,273 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FILES_H_INCLUDED_[m
[31m-#define _NGX_FILES_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef HANDLE                      ngx_fd_t;[m
[31m-typedef BY_HANDLE_FILE_INFORMATION  ngx_file_info_t;[m
[31m-typedef uint64_t                    ngx_file_uniq_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                         *name;[m
[31m-    size_t                          size;[m
[31m-    void                           *addr;[m
[31m-    ngx_fd_t                        fd;[m
[31m-    HANDLE                          handle;[m
[31m-    ngx_log_t                      *log;[m
[31m-} ngx_file_mapping_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    HANDLE                          dir;[m
[31m-    WIN32_FIND_DATA                 finddata;[m
[31m-[m
[31m-    unsigned                        valid_info:1;[m
[31m-    unsigned                        type:1;[m
[31m-    unsigned                        ready:1;[m
[31m-} ngx_dir_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    HANDLE                          dir;[m
[31m-    WIN32_FIND_DATA                 finddata;[m
[31m-[m
[31m-    unsigned                        ready:1;[m
[31m-    unsigned                        test:1;[m
[31m-    unsigned                        no_match:1;[m
[31m-[m
[31m-    u_char                         *pattern;[m
[31m-    ngx_str_t                       name;[m
[31m-    size_t                          last;[m
[31m-    ngx_log_t                      *log;[m
[31m-} ngx_glob_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* INVALID_FILE_ATTRIBUTES is specified but not defined at least in MSVC6SP2 */[m
[31m-#ifndef INVALID_FILE_ATTRIBUTES[m
[31m-#define INVALID_FILE_ATTRIBUTES     0xffffffff[m
[31m-#endif[m
[31m-[m
[31m-/* INVALID_SET_FILE_POINTER is not defined at least in MSVC6SP2 */[m
[31m-#ifndef INVALID_SET_FILE_POINTER[m
[31m-#define INVALID_SET_FILE_POINTER    0xffffffff[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_INVALID_FILE            INVALID_HANDLE_VALUE[m
[31m-#define NGX_FILE_ERROR              0[m
[31m-[m
[31m-[m
[31m-ngx_fd_t ngx_open_file(u_char *name, u_long mode, u_long create, u_long access);[m
[31m-#define ngx_open_file_n             "CreateFile()"[m
[31m-[m
[31m-#define NGX_FILE_RDONLY             GENERIC_READ[m
[31m-#define NGX_FILE_WRONLY             GENERIC_WRITE[m
[31m-#define NGX_FILE_RDWR               GENERIC_READ|GENERIC_WRITE[m
[31m-#define NGX_FILE_APPEND             FILE_APPEND_DATA|SYNCHRONIZE[m
[31m-#define NGX_FILE_NONBLOCK           0[m
[31m-[m
[31m-#define NGX_FILE_CREATE_OR_OPEN     OPEN_ALWAYS[m
[31m-#define NGX_FILE_OPEN               OPEN_EXISTING[m
[31m-#define NGX_FILE_TRUNCATE           CREATE_ALWAYS[m
[31m-[m
[31m-#define NGX_FILE_DEFAULT_ACCESS     0[m
[31m-#define NGX_FILE_OWNER_ACCESS       0[m
[31m-[m
[31m-[m
[31m-#define ngx_open_tempfile(name, persistent, access)                          \[m
[31m-    CreateFile((const char *) name,                                          \[m
[31m-               GENERIC_READ|GENERIC_WRITE,                                   \[m
[31m-               FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,           \[m
[31m-               NULL,                                                         \[m
[31m-               CREATE_NEW,                                                   \[m
[31m-               persistent ? 0:                                               \[m
[31m-                   FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE,       \[m
[31m-               NULL);[m
[31m-[m
[31m-#define ngx_open_tempfile_n         "CreateFile()"[m
[31m-[m
[31m-[m
[31m-#define ngx_close_file              CloseHandle[m
[31m-#define ngx_close_file_n            "CloseHandle()"[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_read_fd(ngx_fd_t fd, void *buf, size_t size);[m
[31m-#define ngx_read_fd_n               "ReadFile()"[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_write_fd(ngx_fd_t fd, void *buf, size_t size);[m
[31m-#define ngx_write_fd_n              "WriteFile()"[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_write_console(ngx_fd_t fd, void *buf, size_t size);[m
[31m-[m
[31m-[m
[31m-#define ngx_linefeed(p)             *p++ = CR; *p++ = LF;[m
[31m-#define NGX_LINEFEED_SIZE           2[m
[31m-#define NGX_LINEFEED                CRLF[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_file(name)       DeleteFile((const char *) name)[m
[31m-#define ngx_delete_file_n           "DeleteFile()"[m
[31m-[m
[31m-[m
[31m-#define ngx_rename_file(o, n)       MoveFile((const char *) o, (const char *) n)[m
[31m-#define ngx_rename_file_n           "MoveFile()"[m
[31m-ngx_err_t ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s);[m
[31m-#define ngx_set_file_time_n         "SetFileTime()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_file_info(u_char *filename, ngx_file_info_t *fi);[m
[31m-#define ngx_file_info_n             "GetFileAttributesEx()"[m
[31m-[m
[31m-[m
[31m-#define ngx_fd_info(fd, fi)         GetFileInformationByHandle(fd, fi)[m
[31m-#define ngx_fd_info_n               "GetFileInformationByHandle()"[m
[31m-[m
[31m-[m
[31m-#define ngx_link_info(name, fi)     ngx_file_info(name, fi)[m
[31m-#define ngx_link_info_n             "GetFileAttributesEx()"[m
[31m-[m
[31m-[m
[31m-#define ngx_is_dir(fi)                                                       \[m
[31m-    (((fi)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)[m
[31m-#define ngx_is_file(fi)                                                      \[m
[31m-    (((fi)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)[m
[31m-#define ngx_is_link(fi)     0[m
[31m-#define ngx_is_exec(fi)     0[m
[31m-[m
[31m-#define ngx_file_access(fi) 0[m
[31m-[m
[31m-#define ngx_file_size(fi)                                                    \[m
[31m-    (((off_t) (fi)->nFileSizeHigh << 32) | (fi)->nFileSizeLow)[m
[31m-#define ngx_file_fs_size(fi)        ngx_file_size(fi)[m
[31m-[m
[31m-#define ngx_file_uniq(fi)   (*(ngx_file_uniq_t *) &(fi)->nFileIndexHigh)[m
[31m-[m
[31m-[m
[31m-/* 116444736000000000 is commented in src/os/win32/ngx_time.c */[m
[31m-[m
[31m-#define ngx_file_mtime(fi)                                                   \[m
[31m- (time_t) (((((unsigned __int64) (fi)->ftLastWriteTime.dwHighDateTime << 32) \[m
[31m-                               | (fi)->ftLastWriteTime.dwLowDateTime)        \[m
[31m-                                          - 116444736000000000) / 10000000)[m
[31m-[m
[31m-ngx_int_t ngx_create_file_mapping(ngx_file_mapping_t *fm);[m
[31m-void ngx_close_file_mapping(ngx_file_mapping_t *fm);[m
[31m-[m
[31m-[m
[31m-u_char *ngx_realpath(u_char *path, u_char *resolved);[m
[31m-#define ngx_realpath_n              ""[m
[31m-#define ngx_getcwd(buf, size)       GetCurrentDirectory(size, (char *) buf)[m
[31m-#define ngx_getcwd_n                "GetCurrentDirectory()"[m
[31m-#define ngx_path_separator(c)       ((c) == '/' || (c) == '\\')[m
[31m-[m
[31m-#define NGX_HAVE_MAX_PATH           1[m
[31m-#define NGX_MAX_PATH                MAX_PATH[m
[31m-[m
[31m-#define NGX_DIR_MASK                (u_char *) "/*"[m
[31m-#define NGX_DIR_MASK_LEN            2[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir);[m
[31m-#define ngx_open_dir_n              "FindFirstFile()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_read_dir(ngx_dir_t *dir);[m
[31m-#define ngx_read_dir_n              "FindNextFile()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_close_dir(ngx_dir_t *dir);[m
[31m-#define ngx_close_dir_n             "FindClose()"[m
[31m-[m
[31m-[m
[31m-#define ngx_create_dir(name, access) CreateDirectory((const char *) name, NULL)[m
[31m-#define ngx_create_dir_n            "CreateDirectory()"[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_dir(name)        RemoveDirectory((const char *) name)[m
[31m-#define ngx_delete_dir_n            "RemoveDirectory()"[m
[31m-[m
[31m-[m
[31m-#define ngx_dir_access(a)           (a)[m
[31m-[m
[31m-[m
[31m-#define ngx_de_name(dir)            ((u_char *) (dir)->finddata.cFileName)[m
[31m-#define ngx_de_namelen(dir)         ngx_strlen((dir)->finddata.cFileName)[m
[31m-[m
[31m-ngx_int_t ngx_de_info(u_char *name, ngx_dir_t *dir);[m
[31m-#define ngx_de_info_n               "dummy()"[m
[31m-[m
[31m-ngx_int_t ngx_de_link_info(u_char *name, ngx_dir_t *dir);[m
[31m-#define ngx_de_link_info_n          "dummy()"[m
[31m-[m
[31m-#define ngx_de_is_dir(dir)                                                   \[m
[31m-    (((dir)->finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)[m
[31m-#define ngx_de_is_file(dir)                                                  \[m
[31m-    (((dir)->finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)[m
[31m-#define ngx_de_is_link(dir)         0[m
[31m-#define ngx_de_access(dir)          0[m
[31m-#define ngx_de_size(dir)                                                     \[m
[31m-  (((off_t) (dir)->finddata.nFileSizeHigh << 32) | (dir)->finddata.nFileSizeLow)[m
[31m-#define ngx_de_fs_size(dir)         ngx_de_size(dir)[m
[31m-[m
[31m-/* 116444736000000000 is commented in src/os/win32/ngx_time.c */[m
[31m-[m
[31m-#define ngx_de_mtime(dir)                                                    \[m
[31m-    (time_t) (((((unsigned __int64)                                          \[m
[31m-                     (dir)->finddata.ftLastWriteTime.dwHighDateTime << 32)   \[m
[31m-                      | (dir)->finddata.ftLastWriteTime.dwLowDateTime)       \[m
[31m-                                          - 116444736000000000) / 10000000)[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_open_glob(ngx_glob_t *gl);[m
[31m-#define ngx_open_glob_n             "FindFirstFile()"[m
[31m-[m
[31m-ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name);[m
[31m-void ngx_close_glob(ngx_glob_t *gl);[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset);[m
[31m-#define ngx_read_file_n             "ReadFile()"[m
[31m-[m
[31m-ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size,[m
[31m-    off_t offset);[m
[31m-[m
[31m-ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-[m
[31m-ngx_int_t ngx_read_ahead(ngx_fd_t fd, size_t n);[m
[31m-#define ngx_read_ahead_n            "ngx_read_ahead_n"[m
[31m-[m
[31m-ngx_int_t ngx_directio_on(ngx_fd_t fd);[m
[31m-#define ngx_directio_on_n           "ngx_directio_on_n"[m
[31m-[m
[31m-ngx_int_t ngx_directio_off(ngx_fd_t fd);[m
[31m-#define ngx_directio_off_n          "ngx_directio_off_n"[m
[31m-[m
[31m-size_t ngx_fs_bsize(u_char *name);[m
[31m-[m
[31m-[m
[31m-#define ngx_stdout               GetStdHandle(STD_OUTPUT_HANDLE)[m
[31m-#define ngx_stderr               GetStdHandle(STD_ERROR_HANDLE)[m
[31m-#define ngx_set_stderr(fd)       SetStdHandle(STD_ERROR_HANDLE, fd)[m
[31m-#define ngx_set_stderr_n         "SetStdHandle(STD_ERROR_HANDLE)"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FILES_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_os.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_os.h[m
[1mdeleted file mode 100644[m
[1mindex 98210a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_os.h[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_OS_H_INCLUDED_[m
[31m-#define _NGX_OS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_IO_SENDFILE    1[m
[31m-[m
[31m-[m
[31m-typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_recv_pt        recv;[m
[31m-    ngx_recv_chain_pt  recv_chain;[m
[31m-    ngx_recv_pt        udp_recv;[m
[31m-    ngx_send_pt        send;[m
[31m-    ngx_send_chain_pt  send_chain;[m
[31m-    ngx_uint_t         flags;[m
[31m-} ngx_os_io_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_os_init(ngx_log_t *log);[m
[31m-void ngx_os_status(ngx_log_t *log);[m
[31m-ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid);[m
[31m-[m
[31m-ssize_t ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf,[m
[31m-    size_t size);[m
[31m-ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit);[m
[31m-ssize_t ngx_wsasend(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_overlapped_wsasend(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ngx_chain_t *ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-void ngx_cdecl ngx_event_log(ngx_err_t err, const char *fmt, ...);[m
[31m-[m
[31m-[m
[31m-extern ngx_os_io_t  ngx_os_io;[m
[31m-extern ngx_uint_t   ngx_ncpu;[m
[31m-extern ngx_uint_t   ngx_max_wsabufs;[m
[31m-extern ngx_int_t    ngx_max_sockets;[m
[31m-extern ngx_uint_t   ngx_inherited_nonblocking;[m
[31m-extern ngx_uint_t   ngx_tcp_nodelay_and_tcp_nopush;[m
[31m-extern ngx_uint_t   ngx_win32_version;[m
[31m-extern char         ngx_unique[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_OS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process.c[m
[1mdeleted file mode 100644[m
[1mindex 57b1ae9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process.c[m
[1m+++ /dev/null[m
[36m@@ -1,238 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-int              ngx_argc;[m
[31m-char           **ngx_argv;[m
[31m-char           **ngx_os_argv;[m
[31m-[m
[31m-ngx_int_t        ngx_last_process;[m
[31m-ngx_process_t    ngx_processes[NGX_MAX_PROCESSES];[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)[m
[31m-{[m
[31m-    u_long          rc, n, code;[m
[31m-    ngx_int_t       s;[m
[31m-    ngx_pid_t       pid;[m
[31m-    ngx_exec_ctx_t  ctx;[m
[31m-    HANDLE          events[2];[m
[31m-    char            file[MAX_PATH + 1];[m
[31m-[m
[31m-    if (respawn >= 0) {[m
[31m-        s = respawn;[m
[31m-[m
[31m-    } else {[m
[31m-        for (s = 0; s < ngx_last_process; s++) {[m
[31m-            if (ngx_processes[s].handle == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (s == NGX_MAX_PROCESSES) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "no more than %d processes can be spawned",[m
[31m-                          NGX_MAX_PROCESSES);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = GetModuleFileName(NULL, file, MAX_PATH);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "GetModuleFileName() failed");[m
[31m-        return NGX_INVALID_PID;[m
[31m-    }[m
[31m-[m
[31m-    file[n] = '\0';[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                   "GetModuleFileName: \"%s\"", file);[m
[31m-[m
[31m-    ctx.path = file;[m
[31m-    ctx.name = name;[m
[31m-    ctx.args = GetCommandLine();[m
[31m-    ctx.argv = NULL;[m
[31m-    ctx.envp = NULL;[m
[31m-[m
[31m-    pid = ngx_execute(cycle, &ctx);[m
[31m-[m
[31m-    if (pid == NGX_INVALID_PID) {[m
[31m-        return pid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t));[m
[31m-[m
[31m-    ngx_processes[s].handle = ctx.child;[m
[31m-    ngx_processes[s].pid = pid;[m
[31m-    ngx_processes[s].name = name;[m
[31m-[m
[31m-    ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%P%Z", name, pid);[m
[31m-    ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%P%Z", name, pid);[m
[31m-    ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%P%Z",[m
[31m-                name, pid);[m
[31m-[m
[31m-    events[0] = ngx_master_process_event;[m
[31m-    events[1] = ctx.child;[m
[31m-[m
[31m-    rc = WaitForMultipleObjects(2, events, 0, 5000);[m
[31m-[m
[31m-    ngx_time_update();[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                   "WaitForMultipleObjects: %ul", rc);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case WAIT_OBJECT_0:[m
[31m-[m
[31m-        ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0,[m
[31m-                                          (char *) ngx_processes[s].term_event);[m
[31m-        if (ngx_processes[s].term == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "OpenEvent(\"%s\") failed",[m
[31m-                          ngx_processes[s].term_event);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0,[m
[31m-                                          (char *) ngx_processes[s].quit_event);[m
[31m-        if (ngx_processes[s].quit == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "OpenEvent(\"%s\") failed",[m
[31m-                          ngx_processes[s].quit_event);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0,[m
[31m-                                       (char *) ngx_processes[s].reopen_event);[m
[31m-        if (ngx_processes[s].reopen == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "OpenEvent(\"%s\") failed",[m
[31m-                          ngx_processes[s].reopen_event);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ResetEvent(ngx_master_process_event) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "ResetEvent(\"%s\") failed",[m
[31m-                          ngx_master_process_event_name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case WAIT_OBJECT_0 + 1:[m
[31m-        if (GetExitCodeProcess(ctx.child, &code) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "GetExitCodeProcess(%P) failed", pid);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "%s process %P exited with code %Xl",[m
[31m-                      name, pid, code);[m
[31m-[m
[31m-        goto failed;[m
[31m-[m
[31m-    case WAIT_TIMEOUT:[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "the event \"%s\" was not signaled for 5s",[m
[31m-                      ngx_master_process_event_name);[m
[31m-        goto failed;[m
[31m-[m
[31m-    case WAIT_FAILED:[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "WaitForSingleObject(\"%s\") failed",[m
[31m-                      ngx_master_process_event_name);[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (respawn >= 0) {[m
[31m-        return pid;[m
[31m-    }[m
[31m-[m
[31m-    switch (respawn) {[m
[31m-[m
[31m-    case NGX_PROCESS_RESPAWN:[m
[31m-        ngx_processes[s].just_spawn = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_JUST_RESPAWN:[m
[31m-        ngx_processes[s].just_spawn = 1;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (s == ngx_last_process) {[m
[31m-        ngx_last_process++;[m
[31m-    }[m
[31m-[m
[31m-    return pid;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_processes[s].reopen) {[m
[31m-        ngx_close_handle(ngx_processes[s].reopen);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_processes[s].quit) {[m
[31m-        ngx_close_handle(ngx_processes[s].quit);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_processes[s].term) {[m
[31m-        ngx_close_handle(ngx_processes[s].term);[m
[31m-    }[m
[31m-[m
[31m-    TerminateProcess(ngx_processes[s].handle, 2);[m
[31m-[m
[31m-    if (ngx_processes[s].handle) {[m
[31m-        ngx_close_handle(ngx_processes[s].handle);[m
[31m-        ngx_processes[s].handle = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_INVALID_PID;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)[m
[31m-{[m
[31m-    STARTUPINFO          si;[m
[31m-    PROCESS_INFORMATION  pi;[m
[31m-[m
[31m-    ngx_memzero(&si, sizeof(STARTUPINFO));[m
[31m-    si.cb = sizeof(STARTUPINFO);[m
[31m-[m
[31m-    ngx_memzero(&pi, sizeof(PROCESS_INFORMATION));[m
[31m-[m
[31m-    if (CreateProcess(ctx->path, ctx->args,[m
[31m-                      NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,[m
[31m-                      "CreateProcess(\"%s\") failed", ngx_argv[0]);[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx->child = pi.hProcess;[m
[31m-[m
[31m-    if (CloseHandle(pi.hThread) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CloseHandle(pi.hThread) failed");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                  "start %s process %P", ctx->name, pi.dwProcessId);[m
[31m-[m
[31m-    return pi.dwProcessId;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process.h[m
[1mdeleted file mode 100644[m
[1mindex a6a5aa2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process.h[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROCESS_H_INCLUDED_[m
[31m-#define _NGX_PROCESS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef DWORD               ngx_pid_t;[m
[31m-#define NGX_INVALID_PID     0[m
[31m-[m
[31m-[m
[31m-#define ngx_getpid          GetCurrentProcessId[m
[31m-#define ngx_log_pid         ngx_pid[m
[31m-[m
[31m-[m
[31m-#define NGX_PROCESS_SYNC_NAME                                                 \[m
[31m-    (sizeof("ngx_cache_manager_mutex_") + NGX_INT32_LEN)[m
[31m-[m
[31m-[m
[31m-typedef uint64_t            ngx_cpuset_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    HANDLE                  handle;[m
[31m-    ngx_pid_t               pid;[m
[31m-    char                   *name;[m
[31m-[m
[31m-    HANDLE                  term;[m
[31m-    HANDLE                  quit;[m
[31m-    HANDLE                  reopen;[m
[31m-[m
[31m-    u_char                  term_event[NGX_PROCESS_SYNC_NAME];[m
[31m-    u_char                  quit_event[NGX_PROCESS_SYNC_NAME];[m
[31m-    u_char                  reopen_event[NGX_PROCESS_SYNC_NAME];[m
[31m-[m
[31m-    unsigned                just_spawn:1;[m
[31m-    unsigned                exiting:1;[m
[31m-} ngx_process_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char                   *path;[m
[31m-    char                   *name;[m
[31m-    char                   *args;[m
[31m-    char *const            *argv;[m
[31m-    char *const            *envp;[m
[31m-    HANDLE                  child;[m
[31m-} ngx_exec_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn);[m
[31m-ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx);[m
[31m-[m
[31m-#define ngx_debug_point()[m
[31m-#define ngx_sched_yield()   SwitchToThread()[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_PROCESSES         (MAXIMUM_WAIT_OBJECTS - 4)[m
[31m-[m
[31m-#define NGX_PROCESS_RESPAWN       -2[m
[31m-#define NGX_PROCESS_JUST_RESPAWN  -3[m
[31m-[m
[31m-[m
[31m-extern int                  ngx_argc;[m
[31m-extern char               **ngx_argv;[m
[31m-extern char               **ngx_os_argv;[m
[31m-[m
[31m-extern ngx_int_t            ngx_last_process;[m
[31m-extern ngx_process_t        ngx_processes[NGX_MAX_PROCESSES];[m
[31m-[m
[31m-extern ngx_pid_t            ngx_pid;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROCESS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process_cycle.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process_cycle.c[m
[1mdeleted file mode 100644[m
[1mindex 795e41e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process_cycle.c[m
[1m+++ /dev/null[m
[36m@@ -1,1041 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_console_init(ngx_cycle_t *cycle);[m
[31m-static int __stdcall ngx_console_handler(u_long type);[m
[31m-static ngx_int_t ngx_create_signal_events(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t type);[m
[31m-static void ngx_reopen_worker_processes(ngx_cycle_t *cycle);[m
[31m-static void ngx_quit_worker_processes(ngx_cycle_t *cycle, ngx_uint_t old);[m
[31m-static void ngx_terminate_worker_processes(ngx_cycle_t *cycle);[m
[31m-static ngx_uint_t ngx_reap_worker(ngx_cycle_t *cycle, HANDLE h);[m
[31m-static void ngx_master_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn);[m
[31m-static void ngx_worker_process_exit(ngx_cycle_t *cycle);[m
[31m-static ngx_thread_value_t __stdcall ngx_worker_thread(void *data);[m
[31m-static ngx_thread_value_t __stdcall ngx_cache_manager_thread(void *data);[m
[31m-static void ngx_cache_manager_process_handler(void);[m
[31m-static ngx_thread_value_t __stdcall ngx_cache_loader_thread(void *data);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t     ngx_process;[m
[31m-ngx_uint_t     ngx_worker;[m
[31m-ngx_pid_t      ngx_pid;[m
[31m-[m
[31m-ngx_uint_t     ngx_inherited;[m
[31m-ngx_pid_t      ngx_new_binary;[m
[31m-[m
[31m-sig_atomic_t   ngx_terminate;[m
[31m-sig_atomic_t   ngx_quit;[m
[31m-sig_atomic_t   ngx_reopen;[m
[31m-sig_atomic_t   ngx_reconfigure;[m
[31m-ngx_uint_t     ngx_exiting;[m
[31m-[m
[31m-[m
[31m-HANDLE         ngx_master_process_event;[m
[31m-char           ngx_master_process_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-[m
[31m-static HANDLE  ngx_stop_event;[m
[31m-static char    ngx_stop_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-static HANDLE  ngx_quit_event;[m
[31m-static char    ngx_quit_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-static HANDLE  ngx_reopen_event;[m
[31m-static char    ngx_reopen_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-static HANDLE  ngx_reload_event;[m
[31m-static char    ngx_reload_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-[m
[31m-HANDLE         ngx_cache_manager_mutex;[m
[31m-char           ngx_cache_manager_mutex_name[NGX_PROCESS_SYNC_NAME];[m
[31m-HANDLE         ngx_cache_manager_event;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_master_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_long      nev, ev, timeout;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_msec_t  timer;[m
[31m-    ngx_uint_t  live;[m
[31m-    HANDLE      events[MAXIMUM_WAIT_OBJECTS];[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_master_process_event_name,[m
[31m-                "ngx_master_%s%Z", ngx_unique);[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_WORKER) {[m
[31m-        ngx_worker_process_cycle(cycle, ngx_master_process_event_name);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "master started");[m
[31m-[m
[31m-    ngx_console_init(cycle);[m
[31m-[m
[31m-    SetEnvironmentVariable("ngx_unique", ngx_unique);[m
[31m-[m
[31m-    ngx_master_process_event = CreateEvent(NULL, 1, 0,[m
[31m-                                           ngx_master_process_event_name);[m
[31m-    if (ngx_master_process_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed",[m
[31m-                      ngx_master_process_event_name);[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_create_signal_events(cycle) != NGX_OK) {[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_cache_manager_mutex_name,[m
[31m-                "ngx_cache_manager_mutex_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_cache_manager_mutex = CreateMutex(NULL, 0,[m
[31m-                                          ngx_cache_manager_mutex_name);[m
[31m-    if (ngx_cache_manager_mutex == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                   "CreateMutex(\"%s\") failed", ngx_cache_manager_mutex_name);[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    events[0] = ngx_stop_event;[m
[31m-    events[1] = ngx_quit_event;[m
[31m-    events[2] = ngx_reopen_event;[m
[31m-    events[3] = ngx_reload_event;[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    if (ngx_start_worker_processes(cycle, NGX_PROCESS_RESPAWN) == 0) {[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    timer = 0;[m
[31m-    timeout = INFINITE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        nev = 4;[m
[31m-        for (n = 0; n < ngx_last_process; n++) {[m
[31m-            if (ngx_processes[n].handle) {[m
[31m-                events[nev++] = ngx_processes[n].handle;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (timer) {[m
[31m-            timeout = timer > ngx_current_msec ? timer - ngx_current_msec : 0;[m
[31m-        }[m
[31m-[m
[31m-        ev = WaitForMultipleObjects(nev, events, 0, timeout);[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "master WaitForMultipleObjects: %ul", ev);[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-            if (ResetEvent(ngx_stop_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed", ngx_stop_event_name);[m
[31m-            }[m
[31m-[m
[31m-            if (timer == 0) {[m
[31m-                timer = ngx_current_msec + 5000;[m
[31m-            }[m
[31m-[m
[31m-            ngx_terminate = 1;[m
[31m-            ngx_quit_worker_processes(cycle, 0);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 1) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "shutting down");[m
[31m-[m
[31m-            if (ResetEvent(ngx_quit_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed", ngx_quit_event_name);[m
[31m-            }[m
[31m-[m
[31m-            ngx_quit = 1;[m
[31m-            ngx_quit_worker_processes(cycle, 0);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 2) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-[m
[31m-            if (ResetEvent(ngx_reopen_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed",[m
[31m-                              ngx_reopen_event_name);[m
[31m-            }[m
[31m-[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-            ngx_reopen_worker_processes(cycle);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 3) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            if (ResetEvent(ngx_reload_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed",[m
[31m-                              ngx_reload_event_name);[m
[31m-            }[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-[m
[31m-            ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-            if (ngx_start_worker_processes(cycle, NGX_PROCESS_JUST_RESPAWN)) {[m
[31m-                ngx_quit_worker_processes(cycle, 1);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev > WAIT_OBJECT_0 + 3 && ev < WAIT_OBJECT_0 + nev) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "reap worker");[m
[31m-[m
[31m-            live = ngx_reap_worker(cycle, events[ev]);[m
[31m-[m
[31m-            if (!live && (ngx_terminate || ngx_quit)) {[m
[31m-                ngx_master_process_exit(cycle);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_TIMEOUT) {[m
[31m-            ngx_terminate_worker_processes(cycle);[m
[31m-[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "WaitForMultipleObjects() failed");[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-            "WaitForMultipleObjects() returned unexpected value %ul", ev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_console_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (ccf->daemon) {[m
[31m-        if (FreeConsole() == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "FreeConsole() failed");[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (SetConsoleCtrlHandler(ngx_console_handler, 1) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "SetConsoleCtrlHandler() failed");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int __stdcall[m
[31m-ngx_console_handler(u_long type)[m
[31m-{[m
[31m-    char  *msg;[m
[31m-[m
[31m-    switch (type) {[m
[31m-[m
[31m-    case CTRL_C_EVENT:[m
[31m-        msg = "Ctrl-C pressed, exiting";[m
[31m-        break;[m
[31m-[m
[31m-    case CTRL_BREAK_EVENT:[m
[31m-        msg = "Ctrl-Break pressed, exiting";[m
[31m-        break;[m
[31m-[m
[31m-    case CTRL_CLOSE_EVENT:[m
[31m-        msg = "console closing, exiting";[m
[31m-        break;[m
[31m-[m
[31m-    case CTRL_LOGOFF_EVENT:[m
[31m-        msg = "user logs off, exiting";[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, msg);[m
[31m-[m
[31m-    if (ngx_stop_event == NULL) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (SetEvent(ngx_stop_event) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "SetEvent(\"%s\") failed", ngx_stop_event_name);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_create_signal_events(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_sprintf((u_char *) ngx_stop_event_name,[m
[31m-                "Global\\ngx_stop_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_stop_event = CreateEvent(NULL, 1, 0, ngx_stop_event_name);[m
[31m-    if (ngx_stop_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", ngx_stop_event_name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_quit_event_name,[m
[31m-                "Global\\ngx_quit_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_quit_event = CreateEvent(NULL, 1, 0, ngx_quit_event_name);[m
[31m-    if (ngx_quit_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", ngx_quit_event_name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_reopen_event_name,[m
[31m-                "Global\\ngx_reopen_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_reopen_event = CreateEvent(NULL, 1, 0, ngx_reopen_event_name);[m
[31m-    if (ngx_reopen_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", ngx_reopen_event_name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_reload_event_name,[m
[31m-                "Global\\ngx_reload_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_reload_event = CreateEvent(NULL, 1, 0, ngx_reload_event_name);[m
[31m-    if (ngx_reload_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", ngx_reload_event_name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t type)[m
[31m-{[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    for (n = 0; n < ccf->worker_processes; n++) {[m
[31m-        if (ngx_spawn_process(cycle, "worker", type) == NGX_INVALID_PID) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_reopen_worker_processes(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].handle == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (SetEvent(ngx_processes[n].reopen) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "SetEvent(\"%s\") failed",[m
[31m-                          ngx_processes[n].reopen_event);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_quit_worker_processes(ngx_cycle_t *cycle, ngx_uint_t old)[m
[31m-{[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        ngx_log_debug5(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "process: %d %P %p e:%d j:%d",[m
[31m-                       n,[m
[31m-                       ngx_processes[n].pid,[m
[31m-                       ngx_processes[n].handle,[m
[31m-                       ngx_processes[n].exiting,[m
[31m-                       ngx_processes[n].just_spawn);[m
[31m-[m
[31m-        if (old && ngx_processes[n].just_spawn) {[m
[31m-            ngx_processes[n].just_spawn = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[n].handle == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (SetEvent(ngx_processes[n].quit) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "SetEvent(\"%s\") failed",[m
[31m-                          ngx_processes[n].quit_event);[m
[31m-        }[m
[31m-[m
[31m-        ngx_processes[n].exiting = 1;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_terminate_worker_processes(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].handle == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (TerminateProcess(ngx_processes[n].handle, 0) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "TerminateProcess(\"%p\") failed",[m
[31m-                          ngx_processes[n].handle);[m
[31m-        }[m
[31m-[m
[31m-        ngx_processes[n].exiting = 1;[m
[31m-[m
[31m-        ngx_close_handle(ngx_processes[n].reopen);[m
[31m-        ngx_close_handle(ngx_processes[n].quit);[m
[31m-        ngx_close_handle(ngx_processes[n].term);[m
[31m-        ngx_close_handle(ngx_processes[n].handle);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_reap_worker(ngx_cycle_t *cycle, HANDLE h)[m
[31m-{[m
[31m-    u_long     code;[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].handle != h) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (GetExitCodeProcess(h, &code) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "GetExitCodeProcess(%P) failed",[m
[31m-                          ngx_processes[n].pid);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                      "%s process %P exited with code %Xl",[m
[31m-                      ngx_processes[n].name, ngx_processes[n].pid, code);[m
[31m-[m
[31m-        ngx_close_handle(ngx_processes[n].reopen);[m
[31m-        ngx_close_handle(ngx_processes[n].quit);[m
[31m-        ngx_close_handle(ngx_processes[n].term);[m
[31m-        ngx_close_handle(h);[m
[31m-[m
[31m-        ngx_processes[n].handle = NULL;[m
[31m-        ngx_processes[n].term = NULL;[m
[31m-        ngx_processes[n].quit = NULL;[m
[31m-        ngx_processes[n].reopen = NULL;[m
[31m-[m
[31m-        if (!ngx_processes[n].exiting && !ngx_terminate && !ngx_quit) {[m
[31m-[m
[31m-            if (ngx_spawn_process(cycle, ngx_processes[n].name, n)[m
[31m-                == NGX_INVALID_PID)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "could not respawn %s", ngx_processes[n].name);[m
[31m-[m
[31m-                if (n == ngx_last_process - 1) {[m
[31m-                    ngx_last_process--;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto found;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unknown process handle %p", h);[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        ngx_log_debug5(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "process: %d %P %p e:%d j:%d",[m
[31m-                       n,[m
[31m-                       ngx_processes[n].pid,[m
[31m-                       ngx_processes[n].handle,[m
[31m-                       ngx_processes[n].exiting,[m
[31m-                       ngx_processes[n].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[n].handle) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_master_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    ngx_delete_pidfile(cycle);[m
[31m-[m
[31m-    ngx_close_handle(ngx_cache_manager_mutex);[m
[31m-    ngx_close_handle(ngx_stop_event);[m
[31m-    ngx_close_handle(ngx_quit_event);[m
[31m-    ngx_close_handle(ngx_reopen_event);[m
[31m-    ngx_close_handle(ngx_reload_event);[m
[31m-    ngx_close_handle(ngx_master_process_event);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_master) {[m
[31m-            cycle->modules[i]->exit_master(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn)[m
[31m-{[m
[31m-    char        wtevn[NGX_PROCESS_SYNC_NAME];[m
[31m-    char        wqevn[NGX_PROCESS_SYNC_NAME];[m
[31m-    char        wroevn[NGX_PROCESS_SYNC_NAME];[m
[31m-    HANDLE      mev, events[3];[m
[31m-    u_long      nev, ev;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_tid_t   wtid, cmtid, cltid;[m
[31m-    ngx_log_t  *log;[m
[31m-[m
[31m-    log = cycle->log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "worker started");[m
[31m-[m
[31m-    ngx_sprintf((u_char *) wtevn, "ngx_worker_term_%P%Z", ngx_pid);[m
[31m-    events[0] = CreateEvent(NULL, 1, 0, wtevn);[m
[31m-    if (events[0] == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", wtevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf((u_char *) wqevn, "ngx_worker_quit_%P%Z", ngx_pid);[m
[31m-    events[1] = CreateEvent(NULL, 1, 0, wqevn);[m
[31m-    if (events[1] == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", wqevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf((u_char *) wroevn, "ngx_worker_reopen_%P%Z", ngx_pid);[m
[31m-    events[2] = CreateEvent(NULL, 1, 0, wroevn);[m
[31m-    if (events[2] == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", wroevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    mev = OpenEvent(EVENT_MODIFY_STATE, 0, mevn);[m
[31m-    if (mev == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "OpenEvent(\"%s\") failed", mevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (SetEvent(mev) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "SetEvent(\"%s\") failed", mevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_cache_manager_mutex_name,[m
[31m-                "ngx_cache_manager_mutex_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_cache_manager_mutex = OpenMutex(SYNCHRONIZE, 0,[m
[31m-                                        ngx_cache_manager_mutex_name);[m
[31m-    if (ngx_cache_manager_mutex == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "OpenMutex(\"%s\") failed", ngx_cache_manager_mutex_name);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cache_manager_event = CreateEvent(NULL, 1, 0, NULL);[m
[31m-    if (ngx_cache_manager_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"ngx_cache_manager_event\") failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_create_thread(&wtid, ngx_worker_thread, NULL, log) != 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_create_thread(&cmtid, ngx_cache_manager_thread, NULL, log) != 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_create_thread(&cltid, ngx_cache_loader_thread, NULL, log) != 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ev = WaitForMultipleObjects(3, events, 0, INFINITE);[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "worker WaitForMultipleObjects: %ul", ev);[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0) {[m
[31m-            ngx_terminate = 1;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "exiting");[m
[31m-[m
[31m-            if (ResetEvent(events[0]) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed", wtevn);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 1) {[m
[31m-            ngx_quit = 1;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "gracefully shutting down");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 2) {[m
[31m-            ngx_reopen = 1;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "reopening logs");[m
[31m-[m
[31m-            if (ResetEvent(events[2]) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed", wroevn);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "WaitForMultipleObjects() failed");[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* wait threads */[m
[31m-[m
[31m-    if (SetEvent(ngx_cache_manager_event) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "SetEvent(\"ngx_cache_manager_event\") failed");[m
[31m-    }[m
[31m-[m
[31m-    events[1] = wtid;[m
[31m-    events[2] = cmtid;[m
[31m-[m
[31m-    nev = 3;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ev = WaitForMultipleObjects(nev, events, 0, INFINITE);[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "worker exit WaitForMultipleObjects: %ul", ev);[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 1) {[m
[31m-            if (nev == 2) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            events[1] = events[2];[m
[31m-            nev = 2;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 2) {[m
[31m-            nev = 2;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "WaitForMultipleObjects() failed");[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_handle(ngx_cache_manager_event);[m
[31m-    ngx_close_handle(events[0]);[m
[31m-    ngx_close_handle(events[1]);[m
[31m-    ngx_close_handle(events[2]);[m
[31m-    ngx_close_handle(mev);[m
[31m-[m
[31m-    ngx_worker_process_exit(cycle);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    exit(2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_thread_value_t __stdcall[m
[31m-ngx_worker_thread(void *data)[m
[31m-{[m
[31m-    ngx_int_t     n;[m
[31m-    ngx_cycle_t  *cycle;[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    for (n = 0; cycle->modules[n]; n++) {[m
[31m-        if (cycle->modules[n]->init_process) {[m
[31m-            if (cycle->modules[n]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    while (!ngx_quit) {[m
[31m-[m
[31m-        if (ngx_exiting) {[m
[31m-            ngx_event_cancel_timers();[m
[31m-[m
[31m-            if (ngx_event_timer_rbtree.root[m
[31m-                == ngx_event_timer_rbtree.sentinel)[m
[31m-            {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_quit = 0;[m
[31m-[m
[31m-            if (!ngx_exiting) {[m
[31m-                ngx_exiting = 1;[m
[31m-                ngx_close_listening_sockets(cycle);[m
[31m-                ngx_close_idle_connections(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_process) {[m
[31m-            cycle->modules[i]->exit_process(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_exiting) {[m
[31m-        c = cycle->connections;[m
[31m-        for (i = 0; i < cycle->connection_n; i++) {[m
[31m-            if (c[i].fd != (ngx_socket_t) -1[m
[31m-                && c[i].read[m
[31m-                && !c[i].read->accept[m
[31m-                && !c[i].read->channel[m
[31m-                && !c[i].read->resolver)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "*%uA open socket #%d left in connection %ui",[m
[31m-                              c[i].number, c[i].fd, i);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_thread_value_t __stdcall[m
[31m-ngx_cache_manager_thread(void *data)[m
[31m-{[m
[31m-    u_long        ev;[m
[31m-    HANDLE        events[2];[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_cycle_t  *cycle;[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    events[0] = ngx_cache_manager_event;[m
[31m-    events[1] = ngx_cache_manager_mutex;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ev = WaitForMultipleObjects(2, events, 0, INFINITE);[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "cache manager WaitForMultipleObjects: %ul", ev);[m
[31m-[m
[31m-        if (ev == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "WaitForMultipleObjects() failed");[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * ev == WAIT_OBJECT_0[m
[31m-         * ev == WAIT_OBJECT_0 + 1[m
[31m-         * ev == WAIT_ABANDONED_0 + 1[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit || ngx_exiting) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit || ngx_exiting) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_cache_manager_process_handler();[m
[31m-    }[m
[31m-[m
[31m-    if (ReleaseMutex(ngx_cache_manager_mutex) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "ReleaseMutex() failed");[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_handler(void)[m
[31m-{[m
[31m-    u_long        ev;[m
[31m-    time_t        next, n;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_path_t  **path;[m
[31m-[m
[31m-    next = 60 * 60;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            n = path[i]->manager(path[i]->data);[m
[31m-[m
[31m-            next = (n <= next) ? n : next;[m
[31m-[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (next == 0) {[m
[31m-        next = 1;[m
[31m-    }[m
[31m-[m
[31m-    ev = WaitForSingleObject(ngx_cache_manager_event, (u_long) next * 1000);[m
[31m-[m
[31m-    if (ev != WAIT_TIMEOUT) {[m
[31m-[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                       "cache manager WaitForSingleObject: %ul", ev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_thread_value_t __stdcall[m
[31m-ngx_cache_loader_thread(void *data)[m
[31m-{[m
[31m-    ngx_uint_t     i;[m
[31m-    ngx_path_t   **path;[m
[31m-    ngx_cycle_t   *cycle;[m
[31m-[m
[31m-    ngx_msleep(60000);[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    path = cycle->paths.elts;[m
[31m-    for (i = 0; i < cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit || ngx_exiting) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            path[i]->loader(path[i]->data);[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_single_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_tid_t  tid;[m
[31m-[m
[31m-    ngx_console_init(cycle);[m
[31m-[m
[31m-    if (ngx_create_signal_events(cycle) != NGX_OK) {[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_create_thread(&tid, ngx_worker_thread, NULL, cycle->log) != 0) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    /* STUB */[m
[31m-    WaitForSingleObject(ngx_stop_event, INFINITE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid)[m
[31m-{[m
[31m-    HANDLE     ev;[m
[31m-    ngx_int_t  rc;[m
[31m-    char       evn[NGX_PROCESS_SYNC_NAME];[m
[31m-[m
[31m-    ngx_sprintf((u_char *) evn, "Global\\ngx_%s_%P%Z", sig, pid);[m
[31m-[m
[31m-    ev = OpenEvent(EVENT_MODIFY_STATE, 0, evn);[m
[31m-    if (ev == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno,[m
[31m-                      "OpenEvent(\"%s\") failed", evn);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (SetEvent(ev) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "SetEvent(\"%s\") failed", evn);[m
[31m-        rc = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        rc = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_handle(ev);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_handle(HANDLE h)[m
[31m-{[m
[31m-    if (CloseHandle(h) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      "CloseHandle(%p) failed", h);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process_cycle.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process_cycle.h[m
[1mdeleted file mode 100644[m
[1mindex 95d2743..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_process_cycle.h[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_[m
[31m-#define _NGX_PROCESS_CYCLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_PROCESS_SINGLE     0[m
[31m-#define NGX_PROCESS_MASTER     1[m
[31m-#define NGX_PROCESS_SIGNALLER  2[m
[31m-#define NGX_PROCESS_WORKER     3[m
[31m-[m
[31m-[m
[31m-void ngx_master_process_cycle(ngx_cycle_t *cycle);[m
[31m-void ngx_single_process_cycle(ngx_cycle_t *cycle);[m
[31m-void ngx_close_handle(HANDLE h);[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t      ngx_process;[m
[31m-extern ngx_uint_t      ngx_worker;[m
[31m-extern ngx_pid_t       ngx_pid;[m
[31m-extern ngx_uint_t      ngx_exiting;[m
[31m-[m
[31m-extern sig_atomic_t    ngx_quit;[m
[31m-extern sig_atomic_t    ngx_terminate;[m
[31m-extern sig_atomic_t    ngx_reopen;[m
[31m-[m
[31m-extern ngx_uint_t      ngx_inherited;[m
[31m-extern ngx_pid_t       ngx_new_binary;[m
[31m-[m
[31m-[m
[31m-extern HANDLE          ngx_master_process_event;[m
[31m-extern char            ngx_master_process_event_name[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_service.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_service.c[m
[1mdeleted file mode 100644[m
[1mindex 835d9cf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_service.c[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define NGX_SERVICE_CONTROL_SHUTDOWN   128[m
[31m-#define NGX_SERVICE_CONTROL_REOPEN     129[m
[31m-[m
[31m-[m
[31m-SERVICE_TABLE_ENTRY st[] = {[m
[31m-    { "nginx", service_main },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_service(ngx_log_t *log)[m
[31m-{[m
[31m-    /* primary thread */[m
[31m-[m
[31m-    /* StartServiceCtrlDispatcher() should be called within 30 seconds */[m
[31m-[m
[31m-    if (StartServiceCtrlDispatcher(st) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "StartServiceCtrlDispatcher() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-service_main(u_int argc, char **argv)[m
[31m-{[m
[31m-    SERVICE_STATUS         status;[m
[31m-    SERVICE_STATUS_HANDLE  service;[m
[31m-[m
[31m-    /* thread spawned by SCM */[m
[31m-[m
[31m-    service = RegisterServiceCtrlHandlerEx("nginx", service_handler, ctx);[m
[31m-    if (service == INVALID_HANDLE_VALUE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "RegisterServiceCtrlHandlerEx() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;[m
[31m-    status.dwCurrentState = SERVICE_START_PENDING;[m
[31m-    status.dwControlsAccepted = SERVICE_ACCEPT_STOP[m
[31m-                                |SERVICE_ACCEPT_PARAMCHANGE;[m
[31m-    status.dwWin32ExitCode = NO_ERROR;[m
[31m-    status.dwServiceSpecificExitCode = 0;[m
[31m-    status.dwCheckPoint = 1;[m
[31m-    status.dwWaitHint = 2000;[m
[31m-[m
[31m-    /* SetServiceStatus() should be called within 80 seconds */[m
[31m-[m
[31m-    if (SetServiceStatus(service, &status) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "SetServiceStatus() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* init */[m
[31m-[m
[31m-    status.dwCurrentState = SERVICE_RUNNING;[m
[31m-    status.dwCheckPoint = 0;[m
[31m-    status.dwWaitHint = 0;[m
[31m-[m
[31m-    if (SetServiceStatus(service, &status) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "SetServiceStatus() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* call master or worker loop */[m
[31m-[m
[31m-    /*[m
[31m-     * master should use event notification and look status[m
[31m-     * single should use iocp to get notifications from service handler[m
[31m-     */[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_int[m
[31m-service_handler(u_int control, u_int type, void *data, void *ctx)[m
[31m-{[m
[31m-    /* primary thread */[m
[31m-[m
[31m-    switch (control) {[m
[31m-[m
[31m-    case SERVICE_CONTROL_INTERROGATE:[m
[31m-        status = NGX_IOCP_INTERROGATE;[m
[31m-        break;[m
[31m-[m
[31m-    case SERVICE_CONTROL_STOP:[m
[31m-        status = NGX_IOCP_STOP;[m
[31m-        break;[m
[31m-[m
[31m-    case SERVICE_CONTROL_PARAMCHANGE:[m
[31m-        status = NGX_IOCP_RECONFIGURE;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_SERVICE_CONTROL_SHUTDOWN:[m
[31m-        status = NGX_IOCP_REOPEN;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_SERVICE_CONTROL_REOPEN:[m
[31m-        status = NGX_IOCP_REOPEN;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return ERROR_CALL_NOT_IMPLEMENTED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_single) {[m
[31m-        if (PostQueuedCompletionStatus(iocp, ... status, ...) == 0) {[m
[31m-            err = ngx_errno;[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "PostQueuedCompletionStatus() failed");[m
[31m-            return err;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        Event[m
[31m-    }[m
[31m-[m
[31m-    return NO_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_shmem.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_shmem.c[m
[1mdeleted file mode 100644[m
[1mindex c3ed699..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_shmem.c[m
[1m+++ /dev/null[m
[36m@@ -1,161 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Base addresses selected by system for shared memory mappings are likely[m
[31m- * to be different on Windows Vista and later versions due to address space[m
[31m- * layout randomization.  This is however incompatible with storing absolute[m
[31m- * addresses within the shared memory.[m
[31m- *[m
[31m- * To make it possible to store absolute addresses we create mappings[m
[31m- * at the same address in all processes by starting mappings at predefined[m
[31m- * addresses.  The addresses were selected somewhat randomly in order to[m
[31m- * minimize the probability that some other library doing something similar[m
[31m- * conflicts with us.  The addresses are from the following typically free[m
[31m- * blocks:[m
[31m- *[m
[31m- * - 0x10000000 .. 0x70000000 (about 1.5 GB in total) on 32-bit platforms[m
[31m- * - 0x000000007fff0000 .. 0x000007f68e8b0000 (about 8 TB) on 64-bit platforms[m
[31m- *[m
[31m- * Additionally, we allow to change the mapping address once it was detected[m
[31m- * to be different from one originally used.  This is needed to support[m
[31m- * reconfiguration.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifdef _WIN64[m
[31m-#define NGX_SHMEM_BASE  0x0000047047e00000[m
[31m-#else[m
[31m-#define NGX_SHMEM_BASE  0x2efe0000[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_allocation_granularity;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_alloc(ngx_shm_t *shm)[m
[31m-{[m
[31m-    u_char         *name;[m
[31m-    uint64_t        size;[m
[31m-    static u_char  *base = (u_char *) NGX_SHMEM_BASE;[m
[31m-[m
[31m-    name = ngx_alloc(shm->name.len + 2 + NGX_INT32_LEN, shm->log);[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_sprintf(name, "%V_%s%Z", &shm->name, ngx_unique);[m
[31m-[m
[31m-    ngx_set_errno(0);[m
[31m-[m
[31m-    size = shm->size;[m
[31m-[m
[31m-    shm->handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,[m
[31m-                                    (u_long) (size >> 32),[m
[31m-                                    (u_long) (size & 0xffffffff),[m
[31m-                                    (char *) name);[m
[31m-[m
[31m-    if (shm->handle == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "CreateFileMapping(%uz, %s) failed",[m
[31m-                      shm->size, name);[m
[31m-        ngx_free(name);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(name);[m
[31m-[m
[31m-    if (ngx_errno == ERROR_ALREADY_EXISTS) {[m
[31m-        shm->exists = 1;[m
[31m-    }[m
[31m-[m
[31m-    shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, base);[m
[31m-[m
[31m-    if (shm->addr != NULL) {[m
[31m-        base += ngx_align(size, ngx_allocation_granularity);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, shm->log, ngx_errno,[m
[31m-                   "MapViewOfFileEx(%uz, %p) of file mapping \"%V\" failed, "[m
[31m-                   "retry without a base address",[m
[31m-                   shm->size, base, &shm->name);[m
[31m-[m
[31m-    /*[m
[31m-     * Order of shared memory zones may be different in the master process[m
[31m-     * and worker processes after reconfiguration.  As a result, the above[m
[31m-     * may fail due to a conflict with a previously created mapping remapped[m
[31m-     * to a different address.  Additionally, there may be a conflict with[m
[31m-     * some other uses of the memory.  In this case we retry without a base[m
[31m-     * address to let the system assign the address itself.[m
[31m-     */[m
[31m-[m
[31m-    shm->addr = MapViewOfFile(shm->handle, FILE_MAP_WRITE, 0, 0, 0);[m
[31m-[m
[31m-    if (shm->addr != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                  "MapViewOfFile(%uz) of file mapping \"%V\" failed",[m
[31m-                  shm->size, &shm->name);[m
[31m-[m
[31m-    if (CloseHandle(shm->handle) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "CloseHandle() of file mapping \"%V\" failed",[m
[31m-                      &shm->name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_remap(ngx_shm_t *shm, u_char *addr)[m
[31m-{[m
[31m-    if (UnmapViewOfFile(shm->addr) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "UnmapViewOfFile(%p) of file mapping \"%V\" failed",[m
[31m-                      shm->addr, &shm->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, addr);[m
[31m-[m
[31m-    if (shm->addr != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                  "MapViewOfFileEx(%uz, %p) of file mapping \"%V\" failed",[m
[31m-                  shm->size, addr, &shm->name);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shm_free(ngx_shm_t *shm)[m
[31m-{[m
[31m-    if (UnmapViewOfFile(shm->addr) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "UnmapViewOfFile(%p) of file mapping \"%V\" failed",[m
[31m-                      shm->addr, &shm->name);[m
[31m-    }[m
[31m-[m
[31m-    if (CloseHandle(shm->handle) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "CloseHandle() of file mapping \"%V\" failed",[m
[31m-                      &shm->name);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_shmem.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_shmem.h[m
[1mdeleted file mode 100644[m
[1mindex ee47429..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_shmem.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SHMEM_H_INCLUDED_[m
[31m-#define _NGX_SHMEM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char      *addr;[m
[31m-    size_t       size;[m
[31m-    ngx_str_t    name;[m
[31m-    HANDLE       handle;[m
[31m-    ngx_log_t   *log;[m
[31m-    ngx_uint_t   exists;   /* unsigned  exists:1;  */[m
[31m-} ngx_shm_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);[m
[31m-ngx_int_t ngx_shm_remap(ngx_shm_t *shm, u_char *addr);[m
[31m-void ngx_shm_free(ngx_shm_t *shm);[m
[31m-[m
[31m-extern ngx_uint_t  ngx_allocation_granularity;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SHMEM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_socket.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_socket.c[m
[1mdeleted file mode 100644[m
[1mindex 05a39f4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_socket.c[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_nonblocking(ngx_socket_t s)[m
[31m-{[m
[31m-    unsigned long  nb = 1;[m
[31m-[m
[31m-    return ioctlsocket(s, FIONBIO, &nb);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_blocking(ngx_socket_t s)[m
[31m-{[m
[31m-    unsigned long  nb = 0;[m
[31m-[m
[31m-    return ioctlsocket(s, FIONBIO, &nb);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_push(ngx_socket_t s)[m
[31m-{[m
[31m-    return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_socket.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_socket.h[m
[1mdeleted file mode 100644[m
[1mindex a9e26c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_socket.h[m
[1m+++ /dev/null[m
[36m@@ -1,207 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SOCKET_H_INCLUDED_[m
[31m-#define _NGX_SOCKET_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_WRITE_SHUTDOWN SD_SEND[m
[31m-[m
[31m-[m
[31m-typedef SOCKET  ngx_socket_t;[m
[31m-typedef int     socklen_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_socket(af, type, proto)                                          \[m
[31m-    WSASocketW(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED)[m
[31m-[m
[31m-#define ngx_socket_n        "WSASocketW()"[m
[31m-[m
[31m-int ngx_nonblocking(ngx_socket_t s);[m
[31m-int ngx_blocking(ngx_socket_t s);[m
[31m-[m
[31m-#define ngx_nonblocking_n   "ioctlsocket(FIONBIO)"[m
[31m-#define ngx_blocking_n      "ioctlsocket(!FIONBIO)"[m
[31m-[m
[31m-#define ngx_shutdown_socket    shutdown[m
[31m-#define ngx_shutdown_socket_n  "shutdown()"[m
[31m-[m
[31m-#define ngx_close_socket    closesocket[m
[31m-#define ngx_close_socket_n  "closesocket()"[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_ACCEPTEX[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_ACCEPTEX)([m
[31m-    IN SOCKET sListenSocket,[m
[31m-    IN SOCKET sAcceptSocket,[m
[31m-    IN PVOID lpOutputBuffer,[m
[31m-    IN DWORD dwReceiveDataLength,[m
[31m-    IN DWORD dwLocalAddressLength,[m
[31m-    IN DWORD dwRemoteAddressLength,[m
[31m-    OUT LPDWORD lpdwBytesReceived,[m
[31m-    IN LPOVERLAPPED lpOverlapped[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_ACCEPTEX                                                       \[m
[31m-    {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_GETACCEPTEXSOCKADDRS[m
[31m-[m
[31m-typedef VOID (PASCAL FAR * LPFN_GETACCEPTEXSOCKADDRS)([m
[31m-    IN PVOID lpOutputBuffer,[m
[31m-    IN DWORD dwReceiveDataLength,[m
[31m-    IN DWORD dwLocalAddressLength,[m
[31m-    IN DWORD dwRemoteAddressLength,[m
[31m-    OUT struct sockaddr **LocalSockaddr,[m
[31m-    OUT LPINT LocalSockaddrLength,[m
[31m-    OUT struct sockaddr **RemoteSockaddr,[m
[31m-    OUT LPINT RemoteSockaddrLength[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_GETACCEPTEXSOCKADDRS                                           \[m
[31m-        {0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_TRANSMITFILE[m
[31m-[m
[31m-#ifndef TF_DISCONNECT[m
[31m-[m
[31m-#define TF_DISCONNECT           1[m
[31m-#define TF_REUSE_SOCKET         2[m
[31m-#define TF_WRITE_BEHIND         4[m
[31m-#define TF_USE_DEFAULT_WORKER   0[m
[31m-#define TF_USE_SYSTEM_THREAD    16[m
[31m-#define TF_USE_KERNEL_APC       32[m
[31m-[m
[31m-typedef struct _TRANSMIT_FILE_BUFFERS {[m
[31m-    LPVOID Head;[m
[31m-    DWORD HeadLength;[m
[31m-    LPVOID Tail;[m
[31m-    DWORD TailLength;[m
[31m-} TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, FAR *LPTRANSMIT_FILE_BUFFERS;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_TRANSMITFILE)([m
[31m-    IN SOCKET hSocket,[m
[31m-    IN HANDLE hFile,[m
[31m-    IN DWORD nNumberOfBytesToWrite,[m
[31m-    IN DWORD nNumberOfBytesPerSend,[m
[31m-    IN LPOVERLAPPED lpOverlapped,[m
[31m-    IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,[m
[31m-    IN DWORD dwReserved[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_TRANSMITFILE                                                   \[m
[31m-    {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_TRANSMITPACKETS[m
[31m-[m
[31m-/* OpenWatcom has a swapped TP_ELEMENT_FILE and TP_ELEMENT_MEMORY definition */[m
[31m-[m
[31m-#ifndef TP_ELEMENT_FILE[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(disable:4201) /* Nonstandard extension, nameless struct/union */[m
[31m-#endif[m
[31m-[m
[31m-typedef struct _TRANSMIT_PACKETS_ELEMENT {[m
[31m-    ULONG dwElFlags;[m
[31m-#define TP_ELEMENT_MEMORY   1[m
[31m-#define TP_ELEMENT_FILE     2[m
[31m-#define TP_ELEMENT_EOP      4[m
[31m-    ULONG cLength;[m
[31m-    union {[m
[31m-        struct {[m
[31m-            LARGE_INTEGER nFileOffset;[m
[31m-            HANDLE        hFile;[m
[31m-        };[m
[31m-        PVOID             pBuffer;[m
[31m-    };[m
[31m-} TRANSMIT_PACKETS_ELEMENT, *PTRANSMIT_PACKETS_ELEMENT,[m
[31m-    FAR *LPTRANSMIT_PACKETS_ELEMENT;[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(default:4201)[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_TRANSMITPACKETS) ([m
[31m-    SOCKET hSocket,[m
[31m-    TRANSMIT_PACKETS_ELEMENT *lpPacketArray,[m
[31m-    DWORD nElementCount,[m
[31m-    DWORD nSendSize,[m
[31m-    LPOVERLAPPED lpOverlapped,[m
[31m-    DWORD dwFlags[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_TRANSMITPACKETS                                                \[m
[31m-    {0xd9689da0,0x1f90,0x11d3,{0x99,0x71,0x00,0xc0,0x4f,0x68,0xc8,0x76}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_CONNECTEX[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_CONNECTEX) ([m
[31m-    IN SOCKET s,[m
[31m-    IN const struct sockaddr FAR *name,[m
[31m-    IN int namelen,[m
[31m-    IN PVOID lpSendBuffer OPTIONAL,[m
[31m-    IN DWORD dwSendDataLength,[m
[31m-    OUT LPDWORD lpdwBytesSent,[m
[31m-    IN LPOVERLAPPED lpOverlapped[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_CONNECTEX \[m
[31m-    {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_DISCONNECTEX[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_DISCONNECTEX) ([m
[31m-    IN SOCKET s,[m
[31m-    IN LPOVERLAPPED lpOverlapped,[m
[31m-    IN DWORD  dwFlags,[m
[31m-    IN DWORD  dwReserved[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_DISCONNECTEX                                                   \[m
[31m-    {0x7fda2e11,0x8630,0x436f,{0xa0,0x31,0xf5,0x36,0xa6,0xee,0xc1,0x57}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern LPFN_ACCEPTEX              ngx_acceptex;[m
[31m-extern LPFN_GETACCEPTEXSOCKADDRS  ngx_getacceptexsockaddrs;[m
[31m-extern LPFN_TRANSMITFILE          ngx_transmitfile;[m
[31m-extern LPFN_TRANSMITPACKETS       ngx_transmitpackets;[m
[31m-extern LPFN_CONNECTEX             ngx_connectex;[m
[31m-extern LPFN_DISCONNECTEX          ngx_disconnectex;[m
[31m-[m
[31m-[m
[31m-int ngx_tcp_push(ngx_socket_t s);[m
[31m-#define ngx_tcp_push_n            "tcp_push()"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SOCKET_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_stat.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_stat.c[m
[1mdeleted file mode 100644[m
[1mindex 51bcd96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_stat.c[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-int ngx_file_type(char *file, ngx_file_info_t *sb)[m
[31m-{[m
[31m-    sb->dwFileAttributes = GetFileAttributes(file);[m
[31m-[m
[31m-    if (sb->dwFileAttributes == INVALID_FILE_ATTRIBUTES) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-int ngx_stat(char *file, ngx_stat_t *sb)[m
[31m-{[m
[31m-    *sb = GetFileAttributes(file);[m
[31m-[m
[31m-    if (*sb == INVALID_FILE_ATTRIBUTES) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-*/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_thread.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_thread.c[m
[1mdeleted file mode 100644[m
[1mindex a13de2d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_thread.c[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_create_thread(ngx_tid_t *tid,[m
[31m-    ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log)[m
[31m-{[m
[31m-    u_long     id;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    *tid = CreateThread(NULL, 0, func, arg, 0, &id);[m
[31m-[m
[31m-    if (*tid != NULL) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                      "create thread " NGX_TID_T_FMT, id);[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-    ngx_log_error(NGX_LOG_ALERT, log, err, "CreateThread() failed");[m
[31m-    return err;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_thread.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_thread.h[m
[1mdeleted file mode 100644[m
[1mindex 4012276..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_thread.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_THREAD_H_INCLUDED_[m
[31m-#define _NGX_THREAD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef HANDLE  ngx_tid_t;[m
[31m-typedef DWORD   ngx_thread_value_t;[m
[31m-[m
[31m-[m
[31m-ngx_err_t ngx_create_thread(ngx_tid_t *tid,[m
[31m-    ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log);[m
[31m-[m
[31m-#define ngx_log_tid                 GetCurrentThreadId()[m
[31m-#define NGX_TID_T_FMT               "%ud"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_THREAD_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_time.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_time.c[m
[1mdeleted file mode 100644[m
[1mindex bd6d287..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_time.c[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_gettimeofday(struct timeval *tp)[m
[31m-{[m
[31m-    uint64_t  intervals;[m
[31m-    FILETIME  ft;[m
[31m-[m
[31m-    GetSystemTimeAsFileTime(&ft);[m
[31m-[m
[31m-    /*[m
[31m-     * A file time is a 64-bit value that represents the number[m
[31m-     * of 100-nanosecond intervals that have elapsed since[m
[31m-     * January 1, 1601 12:00 A.M. UTC.[m
[31m-     *[m
[31m-     * Between January 1, 1970 (Epoch) and January 1, 1601 there were[m
[31m-     * 134744 days,[m
[31m-     * 11644473600 seconds or[m
[31m-     * 11644473600,000,000,0 100-nanosecond intervals.[m
[31m-     *[m
[31m-     * See also MSKB Q167296.[m
[31m-     */[m
[31m-[m
[31m-    intervals = ((uint64_t) ft.dwHighDateTime << 32) | ft.dwLowDateTime;[m
[31m-    intervals -= 116444736000000000;[m
[31m-[m
[31m-    tp->tv_sec = (long) (intervals / 10000000);[m
[31m-    tp->tv_usec = (long) ((intervals % 10000000) / 10);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_libc_localtime(time_t s, struct tm *tm)[m
[31m-{[m
[31m-    struct tm  *t;[m
[31m-[m
[31m-    t = localtime(&s);[m
[31m-    *tm = *t;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_libc_gmtime(time_t s, struct tm *tm)[m
[31m-{[m
[31m-    struct tm  *t;[m
[31m-[m
[31m-    t = gmtime(&s);[m
[31m-    *tm = *t;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_gettimezone(void)[m
[31m-{[m
[31m-    u_long                 n;[m
[31m-    TIME_ZONE_INFORMATION  tz;[m
[31m-[m
[31m-    n = GetTimeZoneInformation(&tz);[m
[31m-[m
[31m-    switch (n) {[m
[31m-[m
[31m-    case TIME_ZONE_ID_UNKNOWN:[m
[31m-        return -tz.Bias;[m
[31m-[m
[31m-    case TIME_ZONE_ID_STANDARD:[m
[31m-        return -(tz.Bias + tz.StandardBias);[m
[31m-[m
[31m-    case TIME_ZONE_ID_DAYLIGHT:[m
[31m-        return -(tz.Bias + tz.DaylightBias);[m
[31m-[m
[31m-    default: /* TIME_ZONE_ID_INVALID */[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_time.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_time.h[m
[1mdeleted file mode 100644[m
[1mindex 6c2f806..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_time.h[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_TIME_H_INCLUDED_[m
[31m-#define _NGX_TIME_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_rbtree_key_t      ngx_msec_t;[m
[31m-typedef ngx_rbtree_key_int_t  ngx_msec_int_t;[m
[31m-[m
[31m-typedef SYSTEMTIME            ngx_tm_t;[m
[31m-typedef FILETIME              ngx_mtime_t;[m
[31m-[m
[31m-#define ngx_tm_sec            wSecond[m
[31m-#define ngx_tm_min            wMinute[m
[31m-#define ngx_tm_hour           wHour[m
[31m-#define ngx_tm_mday           wDay[m
[31m-#define ngx_tm_mon            wMonth[m
[31m-#define ngx_tm_year           wYear[m
[31m-#define ngx_tm_wday           wDayOfWeek[m
[31m-[m
[31m-#define ngx_tm_sec_t          u_short[m
[31m-#define ngx_tm_min_t          u_short[m
[31m-#define ngx_tm_hour_t         u_short[m
[31m-#define ngx_tm_mday_t         u_short[m
[31m-#define ngx_tm_mon_t          u_short[m
[31m-#define ngx_tm_year_t         u_short[m
[31m-#define ngx_tm_wday_t         u_short[m
[31m-[m
[31m-[m
[31m-#define ngx_msleep            Sleep[m
[31m-[m
[31m-#define NGX_HAVE_GETTIMEZONE  1[m
[31m-[m
[31m-#define  ngx_timezone_update()[m
[31m-[m
[31m-ngx_int_t ngx_gettimezone(void);[m
[31m-void ngx_libc_localtime(time_t s, struct tm *tm);[m
[31m-void ngx_libc_gmtime(time_t s, struct tm *tm);[m
[31m-void ngx_gettimeofday(struct timeval *tp);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_TIME_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_udp_wsarecv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_udp_wsarecv.c[m
[1mdeleted file mode 100644[m
[1mindex 5424375..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_udp_wsarecv.c[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    u_long        bytes, flags;[m
[31m-    WSABUF        wsabuf[1];[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    wsabuf[0].buf = (char *) buf;[m
[31m-    wsabuf[0].len = size;[m
[31m-    flags = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        rev->ready = 0;[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == WSAEWOULDBLOCK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        rev->error = 1;[m
[31m-        ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int               rc;[m
[31m-    u_long            bytes, flags;[m
[31m-    WSABUF            wsabuf[1];[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *rev;[m
[31m-    LPWSAOVERLAPPED   ovlp;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (!rev->ready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second wsa post");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "rev->complete: %d", rev->complete);[m
[31m-[m
[31m-    if (rev->complete) {[m
[31m-        rev->complete = 0;[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            if (rev->ovlp.error) {[m
[31m-                ngx_connection_error(c, rev->ovlp.error, "WSARecv() failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "WSARecv ovlp: fd:%d %ul of %z",[m
[31m-                           c->fd, rev->available, size);[m
[31m-[m
[31m-            return rev->available;[m
[31m-        }[m
[31m-[m
[31m-        if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp,[m
[31m-                                   &bytes, 0, NULL)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                               "WSARecv() or WSAGetOverlappedResult() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSARecv: fd:%d %ul of %z", c->fd, bytes, size);[m
[31m-[m
[31m-        return bytes;[m
[31m-    }[m
[31m-[m
[31m-    ovlp = (LPWSAOVERLAPPED) &rev->ovlp;[m
[31m-    ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));[m
[31m-    wsabuf[0].buf = (char *) buf;[m
[31m-    wsabuf[0].len = size;[m
[31m-    flags = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL);[m
[31m-[m
[31m-    rev->complete = 0;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv ovlp: fd:%d rc:%d %ul of %z",[m
[31m-                   c->fd, rc, bytes, size);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-        if (err == WSA_IO_PENDING) {[m
[31m-            rev->active = 1;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() posted");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        rev->error = 1;[m
[31m-        ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        /*[m
[31m-         * if a socket was bound with I/O completion port[m
[31m-         * then GetQueuedCompletionStatus() would anyway return its status[m
[31m-         * despite that WSARecv() was already complete[m
[31m-         */[m
[31m-[m
[31m-        rev->active = 1;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    rev->active = 0;[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_user.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_user.c[m
[1mdeleted file mode 100644[m
[1mindex ea6da5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_user.c[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_CRYPT)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    /* STUB: a plain text password */[m
[31m-[m
[31m-    *encrypted = key;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_CRYPT */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_user.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_user.h[m
[1mdeleted file mode 100644[m
[1mindex 61408e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_user.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_USER_H_INCLUDED_[m
[31m-#define _NGX_USER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/* STUB */[m
[31m-#define ngx_uid_t  ngx_int_t[m
[31m-#define ngx_gid_t  ngx_int_t[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_USER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_win32_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_win32_config.h[m
[1mdeleted file mode 100644[m
[1mindex f5b5950..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_win32_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,265 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_WIN32_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_WIN32_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#undef  WIN32[m
[31m-#define WIN32         0x0400[m
[31m-#define _WIN32_WINNT  0x0501[m
[31m-[m
[31m-[m
[31m-#define STRICT[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-[m
[31m-/* enable getenv() and gmtime() in msvc8 */[m
[31m-#define _CRT_SECURE_NO_WARNINGS[m
[31m-#define _CRT_SECURE_NO_DEPRECATE[m
[31m-[m
[31m-/* enable gethostbyname() in msvc2015 */[m
[31m-#if !(NGX_HAVE_INET6)[m
[31m-#define _WINSOCK_DEPRECATED_NO_WARNINGS[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m- * we need to include <windows.h> explicitly before <winsock2.h> because[m
[31m- * the warning 4201 is enabled in <windows.h>[m
[31m- */[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(disable:4201)[m
[31m-#endif[m
[31m-[m
[31m-#include <winsock2.h>[m
[31m-#include <ws2tcpip.h>  /* ipv6 */[m
[31m-#include <mswsock.h>[m
[31m-#include <shellapi.h>[m
[31m-#include <stddef.h>    /* offsetof() */[m
[31m-[m
[31m-#ifdef __MINGW64_VERSION_MAJOR[m
[31m-[m
[31m-/* GCC MinGW-w64 supports _FILE_OFFSET_BITS */[m
[31m-#define _FILE_OFFSET_BITS 64[m
[31m-[m
[31m-#elif defined __GNUC__[m
[31m-[m
[31m-/* GCC MinGW's stdio.h includes sys/types.h */[m
[31m-#define _OFF_T_[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdarg.h>[m
[31m-#ifdef __MINGW64_VERSION_MAJOR[m
[31m-#include <stdint.h>[m
[31m-#endif[m
[31m-#include <ctype.h>[m
[31m-#include <locale.h>[m
[31m-[m
[31m-#ifdef __WATCOMC__[m
[31m-#define _TIME_T_DEFINED[m
[31m-typedef long  time_t;[m
[31m-/* OpenWatcom defines time_t as "unsigned long" */[m
[31m-#endif[m
[31m-[m
[31m-#include <time.h>      /* localtime(), strftime() */[m
[31m-[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-[m
[31m-/* the end of the precompiled headers */[m
[31m-#pragma hdrstop[m
[31m-[m
[31m-#pragma warning(default:4201)[m
[31m-[m
[31m-/* disable some "-W4" level warnings */[m
[31m-[m
[31m-/* 'type cast': from function pointer to data pointer */[m
[31m-#pragma warning(disable:4054)[m
[31m-[m
[31m-/* 'type cast': from data pointer to function pointer */[m
[31m-#pragma warning(disable:4055)[m
[31m-[m
[31m-/* unreferenced formal parameter */[m
[31m-#pragma warning(disable:4100)[m
[31m-[m
[31m-/* FD_SET() and FD_CLR(): conditional expression is constant */[m
[31m-#pragma warning(disable:4127)[m
[31m-[m
[31m-/* array is too small to include a terminating null character */[m
[31m-#pragma warning(disable:4295)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef __WATCOMC__[m
[31m-[m
[31m-/* symbol 'ngx_rbtree_min' has been defined, but not referenced */[m
[31m-#pragma disable_message(202)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef __BORLANDC__[m
[31m-[m
[31m-/* the end of the precompiled headers */[m
[31m-#pragma hdrstop[m
[31m-[m
[31m-/* functions containing (for|while|some if) are not expanded inline */[m
[31m-#pragma warn -8027[m
[31m-[m
[31m-/* unreferenced formal parameter */[m
[31m-#pragma warn -8057[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_inline          __inline[m
[31m-#define ngx_cdecl           __cdecl[m
[31m-[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-typedef unsigned __int32    uint32_t;[m
[31m-typedef __int32             int32_t;[m
[31m-typedef unsigned __int16    uint16_t;[m
[31m-#define ngx_libc_cdecl      __cdecl[m
[31m-[m
[31m-#elif defined __BORLANDC__[m
[31m-typedef unsigned __int32    uint32_t;[m
[31m-typedef __int32             int32_t;[m
[31m-typedef unsigned __int16    uint16_t;[m
[31m-#define ngx_libc_cdecl      __cdecl[m
[31m-[m
[31m-#else /* __WATCOMC__ */[m
[31m-typedef unsigned int        uint32_t;[m
[31m-typedef int                 int32_t;[m
[31m-typedef unsigned short int  uint16_t;[m
[31m-#define ngx_libc_cdecl[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef __int64             int64_t;[m
[31m-typedef unsigned __int64    uint64_t;[m
[31m-[m
[31m-#if !defined(__WATCOMC__) && !defined(__MINGW64_VERSION_MAJOR)[m
[31m-typedef int                 intptr_t;[m
[31m-typedef u_int               uintptr_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef __MINGW64_VERSION_MAJOR[m
[31m-[m
[31m-/* Windows defines off_t as long, which is 32-bit */[m
[31m-typedef __int64             off_t;[m
[31m-#define _OFF_T_DEFINED[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef __WATCOMC__[m
[31m-[m
[31m-/* off_t is redefined by sys/types.h used by zlib.h */[m
[31m-#define __TYPES_H_INCLUDED[m
[31m-typedef int                 dev_t;[m
[31m-typedef unsigned int        ino_t;[m
[31m-[m
[31m-#elif __BORLANDC__[m
[31m-[m
[31m-/* off_t is redefined by sys/types.h used by zlib.h */[m
[31m-#define __TYPES_H[m
[31m-[m
[31m-typedef int                 dev_t;[m
[31m-typedef unsigned int        ino_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef __MINGW64_VERSION_MAJOR[m
[31m-typedef int                 ssize_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef uint32_t            in_addr_t;[m
[31m-typedef u_short             in_port_t;[m
[31m-typedef int                 sig_atomic_t;[m
[31m-[m
[31m-[m
[31m-#ifdef _WIN64[m
[31m-[m
[31m-#define NGX_PTR_SIZE            8[m
[31m-#define NGX_SIZE_T_LEN          (sizeof("-9223372036854775808") - 1)[m
[31m-#define NGX_MAX_SIZE_T_VALUE    9223372036854775807[m
[31m-#define NGX_TIME_T_LEN          (sizeof("-9223372036854775808") - 1)[m
[31m-#define NGX_TIME_T_SIZE         8[m
[31m-#define NGX_MAX_TIME_T_VALUE    9223372036854775807[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define NGX_PTR_SIZE            4[m
[31m-#define NGX_SIZE_T_LEN          (sizeof("-2147483648") - 1)[m
[31m-#define NGX_MAX_SIZE_T_VALUE    2147483647[m
[31m-#define NGX_TIME_T_LEN          (sizeof("-2147483648") - 1)[m
[31m-#define NGX_TIME_T_SIZE         4[m
[31m-#define NGX_MAX_TIME_T_VALUE    2147483647[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_OFF_T_LEN           (sizeof("-9223372036854775807") - 1)[m
[31m-#define NGX_MAX_OFF_T_VALUE     9223372036854775807[m
[31m-#define NGX_SIG_ATOMIC_T_SIZE   4[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_LITTLE_ENDIAN  1[m
[31m-#define NGX_HAVE_NONALIGNED     1[m
[31m-[m
[31m-[m
[31m-#define NGX_WIN_NT        200000[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG           511[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  1[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_HAVE_CASELESS_FILESYSTEM[m
[31m-#define NGX_HAVE_CASELESS_FILESYSTEM  1[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_HAVE_WIN32_TRANSMITPACKETS[m
[31m-#define NGX_HAVE_WIN32_TRANSMITPACKETS  1[m
[31m-#define NGX_HAVE_WIN32_TRANSMITFILE     0[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_HAVE_WIN32_TRANSMITFILE[m
[31m-#define NGX_HAVE_WIN32_TRANSMITFILE  1[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_WIN32_TRANSMITPACKETS) || (NGX_HAVE_WIN32_TRANSMITFILE)[m
[31m-#define NGX_HAVE_SENDFILE  1[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_HAVE_SO_SNDLOWAT[m
[31m-/* setsockopt(SO_SNDLOWAT) returns error WSAENOPROTOOPT */[m
[31m-#define NGX_HAVE_SO_SNDLOWAT         0[m
[31m-#endif[m
[31m-[m
[31m-#define NGX_HAVE_GETADDRINFO         1[m
[31m-[m
[31m-#define ngx_random               rand[m
[31m-#define ngx_debug_init()[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_WIN32_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_win32_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_win32_init.c[m
[1mdeleted file mode 100644[m
[1mindex 9b26db5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_win32_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,293 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_win32_version;[m
[31m-ngx_uint_t  ngx_ncpu;[m
[31m-ngx_uint_t  ngx_max_wsabufs;[m
[31m-ngx_int_t   ngx_max_sockets;[m
[31m-ngx_uint_t  ngx_inherited_nonblocking = 1;[m
[31m-ngx_uint_t  ngx_tcp_nodelay_and_tcp_nopush;[m
[31m-[m
[31m-char        ngx_unique[NGX_INT32_LEN + 1];[m
[31m-[m
[31m-[m
[31m-ngx_os_io_t ngx_os_io = {[m
[31m-    ngx_wsarecv,[m
[31m-    ngx_wsarecv_chain,[m
[31m-    ngx_udp_wsarecv,[m
[31m-    ngx_wsasend,[m
[31m-    ngx_wsasend_chain,[m
[31m-    0[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    WORD  wServicePackMinor;[m
[31m-    WORD  wSuiteMask;[m
[31m-    BYTE  wProductType;[m
[31m-} ngx_osviex_stub_t;[m
[31m-[m
[31m-[m
[31m-static u_int               osviex;[m
[31m-static OSVERSIONINFOEX     osvi;[m
[31m-[m
[31m-/* Should these pointers be per protocol ? */[m
[31m-LPFN_ACCEPTEX              ngx_acceptex;[m
[31m-LPFN_GETACCEPTEXSOCKADDRS  ngx_getacceptexsockaddrs;[m
[31m-LPFN_TRANSMITFILE          ngx_transmitfile;[m
[31m-LPFN_TRANSMITPACKETS       ngx_transmitpackets;[m
[31m-LPFN_CONNECTEX             ngx_connectex;[m
[31m-LPFN_DISCONNECTEX          ngx_disconnectex;[m
[31m-[m
[31m-static GUID ax_guid = WSAID_ACCEPTEX;[m
[31m-static GUID as_guid = WSAID_GETACCEPTEXSOCKADDRS;[m
[31m-static GUID tf_guid = WSAID_TRANSMITFILE;[m
[31m-static GUID tp_guid = WSAID_TRANSMITPACKETS;[m
[31m-static GUID cx_guid = WSAID_CONNECTEX;[m
[31m-static GUID dx_guid = WSAID_DISCONNECTEX;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_init(ngx_log_t *log)[m
[31m-{[m
[31m-    DWORD        bytes;[m
[31m-    SOCKET       s;[m
[31m-    WSADATA      wsd;[m
[31m-    ngx_err_t    err;[m
[31m-    ngx_uint_t   n;[m
[31m-    SYSTEM_INFO  si;[m
[31m-[m
[31m-    /* get Windows version */[m
[31m-[m
[31m-    ngx_memzero(&osvi, sizeof(OSVERSIONINFOEX));[m
[31m-    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(disable:4996)[m
[31m-#endif[m
[31m-[m
[31m-    osviex = GetVersionEx((OSVERSIONINFO *) &osvi);[m
[31m-[m
[31m-    if (osviex == 0) {[m
[31m-        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);[m
[31m-        if (GetVersionEx((OSVERSIONINFO *) &osvi) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          "GetVersionEx() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(default:4996)[m
[31m-#endif[m
[31m-[m
[31m-    /*[m
[31m-     *  Windows 3.1 Win32s   0xxxxx[m
[31m-     *[m
[31m-     *  Windows 95           140000[m
[31m-     *  Windows 98           141000[m
[31m-     *  Windows ME           149000[m
[31m-     *  Windows NT 3.51      235100[m
[31m-     *  Windows NT 4.0       240000[m
[31m-     *  Windows NT 4.0 SP5   240050[m
[31m-     *  Windows 2000         250000[m
[31m-     *  Windows XP           250100[m
[31m-     *  Windows 2003         250200[m
[31m-     *  Windows Vista/2008   260000[m
[31m-     *[m
[31m-     *  Windows CE x.x       3xxxxx[m
[31m-     */[m
[31m-[m
[31m-    ngx_win32_version = osvi.dwPlatformId * 100000[m
[31m-                        + osvi.dwMajorVersion * 10000[m
[31m-                        + osvi.dwMinorVersion * 100;[m
[31m-[m
[31m-    if (osviex) {[m
[31m-        ngx_win32_version += osvi.wServicePackMajor * 10[m
[31m-                             + osvi.wServicePackMinor;[m
[31m-    }[m
[31m-[m
[31m-    GetSystemInfo(&si);[m
[31m-    ngx_pagesize = si.dwPageSize;[m
[31m-    ngx_allocation_granularity = si.dwAllocationGranularity;[m
[31m-    ngx_ncpu = si.dwNumberOfProcessors;[m
[31m-    ngx_cacheline_size = NGX_CPU_CACHE_LINE;[m
[31m-[m
[31m-    for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }[m
[31m-[m
[31m-    /* delete default "C" locale for _wcsicmp() */[m
[31m-    setlocale(LC_ALL, "");[m
[31m-[m
[31m-[m
[31m-    /* init Winsock */[m
[31m-[m
[31m-    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                      "WSAStartup() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_win32_version < NGX_WIN_NT) {[m
[31m-        ngx_max_wsabufs = 16;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* STUB: ngx_uint_t max */[m
[31m-    ngx_max_wsabufs = 1024 * 1024;[m
[31m-[m
[31m-    /*[m
[31m-     * get AcceptEx(), GetAcceptExSockAddrs(), TransmitFile(),[m
[31m-     * TransmitPackets(), ConnectEx(), and DisconnectEx() addresses[m
[31m-     */[m
[31m-[m
[31m-    s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP);[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &ax_guid, sizeof(GUID),[m
[31m-                 &ngx_acceptex, sizeof(LPFN_ACCEPTEX), &bytes, NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_ACCEPTEX) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &as_guid, sizeof(GUID),[m
[31m-                 &ngx_getacceptexsockaddrs, sizeof(LPFN_GETACCEPTEXSOCKADDRS),[m
[31m-                 &bytes, NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_GETACCEPTEXSOCKADDRS) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tf_guid, sizeof(GUID),[m
[31m-                 &ngx_transmitfile, sizeof(LPFN_TRANSMITFILE), &bytes,[m
[31m-                 NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_TRANSMITFILE) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tp_guid, sizeof(GUID),[m
[31m-                 &ngx_transmitpackets, sizeof(LPFN_TRANSMITPACKETS), &bytes,[m
[31m-                 NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_TRANSMITPACKETS) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &cx_guid, sizeof(GUID),[m
[31m-                 &ngx_connectex, sizeof(LPFN_CONNECTEX), &bytes,[m
[31m-                 NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_CONNECTEX) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &dx_guid, sizeof(GUID),[m
[31m-                 &ngx_disconnectex, sizeof(LPFN_DISCONNECTEX), &bytes,[m
[31m-                 NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_DISCONNECTEX) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_socket(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-[m
[31m-    if (GetEnvironmentVariable("ngx_unique", ngx_unique, NGX_INT32_LEN + 1)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        ngx_process = NGX_PROCESS_WORKER;[m
[31m-[m
[31m-    } else {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != ERROR_ENVVAR_NOT_FOUND) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                          "GetEnvironmentVariable(\"ngx_unique\") failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_sprintf((u_char *) ngx_unique, "%P%Z", ngx_pid);[m
[31m-    }[m
[31m-[m
[31m-    srand((ngx_pid << 16) ^ (unsigned) ngx_time());[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_status(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_osviex_stub_t  *osviex_stub;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER_BUILD);[m
[31m-[m
[31m-    if (osviex) {[m
[31m-[m
[31m-        /*[m
[31m-         * the MSVC 6.0 SP2 defines wSuiteMask and wProductType[m
[31m-         * as WORD wReserved[2][m
[31m-         */[m
[31m-        osviex_stub = (ngx_osviex_stub_t *) &osvi.wServicePackMinor;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, log, 0,[m
[31m-                      "OS: %ud build:%ud, \"%s\", suite:%Xd, type:%ud",[m
[31m-                      ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion,[m
[31m-                      osviex_stub->wSuiteMask, osviex_stub->wProductType);[m
[31m-[m
[31m-    } else {[m
[31m-        if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {[m
[31m-[m
[31m-            /* Win9x build */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, log, 0,[m
[31m-                          "OS: %u build:%ud.%ud.%ud, \"%s\"",[m
[31m-                          ngx_win32_version,[m
[31m-                          osvi.dwBuildNumber >> 24,[m
[31m-                          (osvi.dwBuildNumber >> 16) & 0xff,[m
[31m-                          osvi.dwBuildNumber & 0xffff,[m
[31m-                          osvi.szCSDVersion);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            /*[m
[31m-             * VER_PLATFORM_WIN32_NT[m
[31m-             *[m
[31m-             * we do not currently support VER_PLATFORM_WIN32_CE[m
[31m-             * and we do not support VER_PLATFORM_WIN32s at all[m
[31m-             */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %ud build:%ud, \"%s\"",[m
[31m-                          ngx_win32_version, osvi.dwBuildNumber,[m
[31m-                          osvi.szCSDVersion);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsarecv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsarecv.c[m
[1mdeleted file mode 100644[m
[1mindex 1925f0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsarecv.c[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    u_long        bytes, flags;[m
[31m-    WSABUF        wsabuf[1];[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_int_t     n;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    wsabuf[0].buf = (char *) buf;[m
[31m-    wsabuf[0].len = size;[m
[31m-    flags = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        rev->ready = 0;[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == WSAEWOULDBLOCK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            rev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes < size) {[m
[31m-        rev->ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        rev->eof = 1;[m
[31m-    }[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int               rc;[m
[31m-    u_long            bytes, flags;[m
[31m-    WSABUF            wsabuf[1];[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_event_t      *rev;[m
[31m-    LPWSAOVERLAPPED   ovlp;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (!rev->ready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second wsa post");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "rev->complete: %d", rev->complete);[m
[31m-[m
[31m-    if (rev->complete) {[m
[31m-        rev->complete = 0;[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            if (rev->ovlp.error) {[m
[31m-                ngx_connection_error(c, rev->ovlp.error, "WSARecv() failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "WSARecv ovlp: fd:%d %ul of %z",[m
[31m-                           c->fd, rev->available, size);[m
[31m-[m
[31m-            return rev->available;[m
[31m-        }[m
[31m-[m
[31m-        if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp,[m
[31m-                                   &bytes, 0, NULL)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                               "WSARecv() or WSAGetOverlappedResult() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSARecv: fd:%d %ul of %z", c->fd, bytes, size);[m
[31m-[m
[31m-        return bytes;[m
[31m-    }[m
[31m-[m
[31m-    ovlp = (LPWSAOVERLAPPED) &rev->ovlp;[m
[31m-    ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));[m
[31m-    wsabuf[0].buf = (char *) buf;[m
[31m-    wsabuf[0].len = size;[m
[31m-    flags = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL);[m
[31m-[m
[31m-    rev->complete = 0;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv ovlp: fd:%d rc:%d %ul of %z",[m
[31m-                   c->fd, rc, bytes, size);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-        if (err == WSA_IO_PENDING) {[m
[31m-            rev->active = 1;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() posted");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            rev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        /*[m
[31m-         * if a socket was bound with I/O completion port[m
[31m-         * then GetQueuedCompletionStatus() would anyway return its status[m
[31m-         * despite that WSARecv() was already complete[m
[31m-         */[m
[31m-[m
[31m-        rev->active = 1;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        rev->eof = 1;[m
[31m-        rev->ready = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        rev->ready = 1;[m
[31m-    }[m
[31m-[m
[31m-    rev->active = 0;[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsarecv_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsarecv_chain.c[m
[1mdeleted file mode 100644[m
[1mindex 2598e09..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsarecv_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,106 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_WSABUFS  8[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    u_char       *prev;[m
[31m-    u_long        bytes, flags;[m
[31m-    size_t        n, size;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_array_t   vec;[m
[31m-    ngx_event_t  *rev;[m
[31m-    LPWSABUF      wsabuf;[m
[31m-    WSABUF        wsabufs[NGX_WSABUFS];[m
[31m-[m
[31m-    prev = NULL;[m
[31m-    wsabuf = NULL;[m
[31m-    flags = 0;[m
[31m-    size = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    vec.elts = wsabufs;[m
[31m-    vec.nelts = 0;[m
[31m-    vec.size = sizeof(WSABUF);[m
[31m-    vec.nalloc = NGX_WSABUFS;[m
[31m-    vec.pool = c->pool;[m
[31m-[m
[31m-    /* coalesce the neighbouring bufs */[m
[31m-[m
[31m-    while (chain) {[m
[31m-        n = chain->buf->end - chain->buf->last;[m
[31m-[m
[31m-        if (limit) {[m
[31m-            if (size >= (size_t) limit) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (size + n > (size_t) limit) {[m
[31m-                n = (size_t) limit - size;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (prev == chain->buf->last) {[m
[31m-            wsabuf->len += n;[m
[31m-[m
[31m-        } else {[m
[31m-            wsabuf = ngx_array_push(&vec);[m
[31m-            if (wsabuf == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            wsabuf->buf = (char *) chain->buf->last;[m
[31m-            wsabuf->len = n;[m
[31m-        }[m
[31m-[m
[31m-        size += n;[m
[31m-        prev = chain->buf->end;[m
[31m-        chain = chain->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv: %d:%d", vec.nelts, wsabuf->len);[m
[31m-[m
[31m-[m
[31m-    rc = WSARecv(c->fd, vec.elts, vec.nelts, &bytes, &flags, NULL, NULL);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        rev->ready = 0;[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == WSAEWOULDBLOCK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        rev->error = 1;[m
[31m-        ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes < size) {[m
[31m-        rev->ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        rev->eof = 1;[m
[31m-    }[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsasend.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsasend.c[m
[1mdeleted file mode 100644[m
[1mindex d6a23d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsasend.c[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_wsasend(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int           n;[m
[31m-    u_long        sent;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *wev;[m
[31m-    WSABUF        wsabuf;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * WSABUF must be 4-byte aligned otherwise[m
[31m-     * WSASend() will return undocumented WSAEINVAL error.[m
[31m-     */[m
[31m-[m
[31m-    wsabuf.buf = (char *) buf;[m
[31m-    wsabuf.len = size;[m
[31m-[m
[31m-    sent = 0;[m
[31m-[m
[31m-    n = WSASend(c->fd, &wsabuf, 1, &sent, 0, NULL, NULL);[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        if (sent < size) {[m
[31m-            wev->ready = 0;[m
[31m-        }[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        return sent;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    if (err == WSAEWOULDBLOCK) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, "WSASend() not ready");[m
[31m-        wev->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    wev->error = 1;[m
[31m-    ngx_connection_error(c, err, "WSASend() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_overlapped_wsasend(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int               n;[m
[31m-    u_long            sent;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *wev;[m
[31m-    LPWSAOVERLAPPED   ovlp;[m
[31m-    WSABUF            wsabuf;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "wev->complete: %d", wev->complete);[m
[31m-[m
[31m-    if (!wev->complete) {[m
[31m-[m
[31m-        /* post the overlapped WSASend() */[m
[31m-[m
[31m-        /*[m
[31m-         * WSABUFs must be 4-byte aligned otherwise[m
[31m-         * WSASend() will return undocumented WSAEINVAL error.[m
[31m-         */[m
[31m-[m
[31m-        wsabuf.buf = (char *) buf;[m
[31m-        wsabuf.len = size;[m
[31m-[m
[31m-        sent = 0;[m
[31m-[m
[31m-        ovlp = (LPWSAOVERLAPPED) &c->write->ovlp;[m
[31m-        ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));[m
[31m-[m
[31m-        n = WSASend(c->fd, &wsabuf, 1, &sent, 0, ovlp, NULL);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size);[m
[31m-[m
[31m-        wev->complete = 0;[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-                /*[m
[31m-                 * if a socket was bound with I/O completion port then[m
[31m-                 * GetQueuedCompletionStatus() would anyway return its status[m
[31m-                 * despite that WSASend() was already complete[m
[31m-                 */[m
[31m-[m
[31m-                wev->active = 1;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            if (sent < size) {[m
[31m-                wev->ready = 0;[m
[31m-            }[m
[31m-[m
[31m-            c->sent += sent;[m
[31m-[m
[31m-            return sent;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == WSA_IO_PENDING) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSASend() posted");[m
[31m-            wev->active = 1;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        wev->error = 1;[m
[31m-        ngx_connection_error(c, err, "WSASend() failed");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* the overlapped WSASend() complete */[m
[31m-[m
[31m-    wev->complete = 0;[m
[31m-    wev->active = 0;[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        if (wev->ovlp.error) {[m
[31m-            ngx_connection_error(c, wev->ovlp.error, "WSASend() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sent = wev->available;[m
[31m-[m
[31m-    } else {[m
[31m-        if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &wev->ovlp,[m
[31m-                                   &sent, 0, NULL)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                           "WSASend() or WSAGetOverlappedResult() failed");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSAGetOverlappedResult: fd:%d, %ul of %uz",[m
[31m-                   c->fd, sent, size);[m
[31m-[m
[31m-    if (sent < size) {[m
[31m-        wev->ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    c->sent += sent;[m
[31m-[m
[31m-    return sent;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsasend_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsasend_chain.c[m
[1mdeleted file mode 100644[m
[1mindex e2dde22..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/os/win32/ngx_wsasend_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_WSABUFS  8[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    u_char       *prev;[m
[31m-    u_long        size, sent, send, prev_send;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *wev;[m
[31m-    ngx_array_t   vec;[m
[31m-    ngx_chain_t  *cl;[m
[31m-    LPWSABUF      wsabuf;[m
[31m-    WSABUF        wsabufs[NGX_WSABUFS];[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-    /* the maximum limit size is the maximum u_long value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_UINT32_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_UINT32_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    /*[m
[31m-     * WSABUFs must be 4-byte aligned otherwise[m
[31m-     * WSASend() will return undocumented WSAEINVAL error.[m
[31m-     */[m
[31m-[m
[31m-    vec.elts = wsabufs;[m
[31m-    vec.size = sizeof(WSABUF);[m
[31m-    vec.nalloc = NGX_WSABUFS;[m
[31m-    vec.pool = c->pool;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        prev = NULL;[m
[31m-        wsabuf = NULL;[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        vec.nelts = 0;[m
[31m-[m
[31m-        /* create the WSABUF and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        for (cl = in;[m
[31m-             cl && vec.nelts < ngx_max_wsabufs && send < limit;[m
[31m-             cl = cl->next)[m
[31m-        {[m
[31m-            if (ngx_buf_special(cl->buf)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            if (send + size > limit) {[m
[31m-                size = (u_long) (limit - send);[m
[31m-            }[m
[31m-[m
[31m-            if (prev == cl->buf->pos) {[m
[31m-                wsabuf->len += cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            } else {[m
[31m-                wsabuf = ngx_array_push(&vec);[m
[31m-                if (wsabuf == NULL) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                wsabuf->buf = (char *) cl->buf->pos;[m
[31m-                wsabuf->len = cl->buf->last - cl->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            prev = cl->buf->last;[m
[31m-            send += size;[m
[31m-        }[m
[31m-[m
[31m-        sent = 0;[m
[31m-[m
[31m-        rc = WSASend(c->fd, vec.elts, vec.nelts, &sent, 0, NULL, NULL);[m
[31m-[m
[31m-        if (rc == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == WSAEWOULDBLOCK) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                               "WSASend() not ready");[m
[31m-[m
[31m-            } else {[m
[31m-                wev->error = 1;[m
[31m-                ngx_connection_error(c, err, "WSASend() failed");[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSASend: fd:%d, s:%ul", c->fd, sent);[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if (send - prev_send != sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int               rc;[m
[31m-    u_char           *prev;[m
[31m-    u_long            size, send, sent;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *wev;[m
[31m-    ngx_array_t       vec;[m
[31m-    ngx_chain_t      *cl;[m
[31m-    LPWSAOVERLAPPED   ovlp;[m
[31m-    LPWSABUF          wsabuf;[m
[31m-    WSABUF            wsabufs[NGX_WSABUFS];[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "wev->complete: %d", wev->complete);[m
[31m-[m
[31m-    if (!wev->complete) {[m
[31m-[m
[31m-        /* post the overlapped WSASend() */[m
[31m-[m
[31m-        /* the maximum limit size is the maximum u_long value - the page size */[m
[31m-[m
[31m-        if (limit == 0 || limit > (off_t) (NGX_MAX_UINT32_VALUE - ngx_pagesize))[m
[31m-        {[m
[31m-            limit = NGX_MAX_UINT32_VALUE - ngx_pagesize;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * WSABUFs must be 4-byte aligned otherwise[m
[31m-         * WSASend() will return undocumented WSAEINVAL error.[m
[31m-         */[m
[31m-[m
[31m-        vec.elts = wsabufs;[m
[31m-        vec.nelts = 0;[m
[31m-        vec.size = sizeof(WSABUF);[m
[31m-        vec.nalloc = NGX_WSABUFS;[m
[31m-        vec.pool = c->pool;[m
[31m-[m
[31m-        send = 0;[m
[31m-        prev = NULL;[m
[31m-        wsabuf = NULL;[m
[31m-[m
[31m-        /* create the WSABUF and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        for (cl = in;[m
[31m-             cl && vec.nelts < ngx_max_wsabufs && send < limit;[m
[31m-             cl = cl->next)[m
[31m-        {[m
[31m-            if (ngx_buf_special(cl->buf)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            if (send + size > limit) {[m
[31m-                size = (u_long) (limit - send);[m
[31m-            }[m
[31m-[m
[31m-            if (prev == cl->buf->pos) {[m
[31m-                wsabuf->len += cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            } else {[m
[31m-                wsabuf = ngx_array_push(&vec);[m
[31m-                if (wsabuf == NULL) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                wsabuf->buf = (char *) cl->buf->pos;[m
[31m-                wsabuf->len = cl->buf->last - cl->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            prev = cl->buf->last;[m
[31m-            send += size;[m
[31m-        }[m
[31m-[m
[31m-        ovlp = (LPWSAOVERLAPPED) &c->write->ovlp;[m
[31m-        ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));[m
[31m-[m
[31m-        rc = WSASend(c->fd, vec.elts, vec.nelts, &sent, 0, ovlp, NULL);[m
[31m-[m
[31m-        wev->complete = 0;[m
[31m-[m
[31m-        if (rc == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == WSA_IO_PENDING) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                               "WSASend() posted");[m
[31m-                wev->active = 1;[m
[31m-                return in;[m
[31m-[m
[31m-            } else {[m
[31m-                wev->error = 1;[m
[31m-                ngx_connection_error(c, err, "WSASend() failed");[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-            /*[m
[31m-             * if a socket was bound with I/O completion port then[m
[31m-             * GetQueuedCompletionStatus() would anyway return its status[m
[31m-             * despite that WSASend() was already complete[m
[31m-             */[m
[31m-[m
[31m-            wev->active = 1;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSASend: fd:%d, s:%ul", c->fd, sent);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* the overlapped WSASend() complete */[m
[31m-[m
[31m-        wev->complete = 0;[m
[31m-        wev->active = 0;[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            if (wev->ovlp.error) {[m
[31m-                ngx_connection_error(c, wev->ovlp.error, "WSASend() failed");[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sent = wev->available;[m
[31m-[m
[31m-        } else {[m
[31m-            if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &wev->ovlp,[m
[31m-                                       &sent, 0, NULL)[m
[31m-                == 0)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                               "WSASend() or WSAGetOverlappedResult() failed");[m
[31m-[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSASend ovlp: fd:%d, s:%ul", c->fd, sent);[m
[31m-[m
[31m-    c->sent += sent;[m
[31m-[m
[31m-    in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-    if (in) {[m
[31m-        wev->ready = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        wev->ready = 1;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream.c[m
[1mdeleted file mode 100644[m
[1mindex 3bd8f6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream.c[m
[1m+++ /dev/null[m
[36m@@ -1,564 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_stream_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_stream_add_ports(ngx_conf_t *cf, ngx_array_t *ports,[m
[31m-    ngx_stream_listen_t *listen);[m
[31m-static char *ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports);[m
[31m-static ngx_int_t ngx_stream_add_addrs(ngx_conf_t *cf, ngx_stream_port_t *stport,[m
[31m-    ngx_stream_conf_addr_t *addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_stream_add_addrs6(ngx_conf_t *cf,[m
[31m-    ngx_stream_port_t *stport, ngx_stream_conf_addr_t *addr);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_stream_cmp_conf_addrs(const void *one, const void *two);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_stream_max_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_commands[] = {[m
[31m-[m
[31m-    { ngx_string("stream"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_stream_block,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_stream_module_ctx = {[m
[31m-    ngx_string("stream"),[m
[31m-    NULL,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_module_ctx,                /* module context */[m
[31m-    ngx_stream_commands,                   /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                          *rv;[m
[31m-    ngx_uint_t                     i, m, mi, s;[m
[31m-    ngx_conf_t                     pcf;[m
[31m-    ngx_array_t                    ports;[m
[31m-    ngx_stream_listen_t           *listen;[m
[31m-    ngx_stream_module_t           *module;[m
[31m-    ngx_stream_conf_ctx_t         *ctx;[m
[31m-    ngx_stream_core_srv_conf_t   **cscfp;[m
[31m-    ngx_stream_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    if (*(ngx_stream_conf_ctx_t **) conf) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* the main stream context */[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(ngx_stream_conf_ctx_t **) conf = ctx;[m
[31m-[m
[31m-    /* count the number of the stream modules and set up their indices */[m
[31m-[m
[31m-    ngx_stream_max_module = ngx_count_modules(cf->cycle, NGX_STREAM_MODULE);[m
[31m-[m
[31m-[m
[31m-    /* the stream main_conf context, it's the same in the all stream contexts */[m
[31m-[m
[31m-    ctx->main_conf = ngx_pcalloc(cf->pool,[m
[31m-                                 sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (ctx->main_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * the stream null srv_conf context, it is used to merge[m
[31m-     * the server{}s' srv_conf's[m
[31m-     */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool,[m
[31m-                                sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * create the main_conf's and the null srv_conf's of the all stream modules[m
[31m-     */[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        if (module->create_main_conf) {[m
[31m-            ctx->main_conf[mi] = module->create_main_conf(cf);[m
[31m-            if (ctx->main_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            ctx->srv_conf[mi] = module->create_srv_conf(cf);[m
[31m-            if (ctx->srv_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside the stream{} block */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-[m
[31m-    cf->module_type = NGX_STREAM_MODULE;[m
[31m-    cf->cmd_type = NGX_STREAM_MAIN_CONF;[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        *cf = pcf;[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* init stream{} main_conf's, merge the server{}s' srv_conf's */[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index];[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        /* init stream{} main_conf's */[m
[31m-[m
[31m-        cf->ctx = ctx;[m
[31m-[m
[31m-        if (module->init_main_conf) {[m
[31m-            rv = module->init_main_conf(cf, ctx->main_conf[mi]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                *cf = pcf;[m
[31m-                return rv;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-            /* merge the server{}s' srv_conf's */[m
[31m-[m
[31m-            cf->ctx = cscfp[s]->ctx;[m
[31m-[m
[31m-            if (module->merge_srv_conf) {[m
[31m-                rv = module->merge_srv_conf(cf,[m
[31m-                                            ctx->srv_conf[mi],[m
[31m-                                            cscfp[s]->ctx->srv_conf[mi]);[m
[31m-                if (rv != NGX_CONF_OK) {[m
[31m-                    *cf = pcf;[m
[31m-                    return rv;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->postconfiguration) {[m
[31m-            if (module->postconfiguration(cf) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-[m
[31m-    if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_stream_conf_port_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    listen = cmcf->listen.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->listen.nelts; i++) {[m
[31m-        if (ngx_stream_add_ports(cf, &ports, &listen[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_stream_optimize_servers(cf, &ports);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_add_ports(ngx_conf_t *cf, ngx_array_t *ports,[m
[31m-    ngx_stream_listen_t *listen)[m
[31m-{[m
[31m-    in_port_t                p;[m
[31m-    ngx_uint_t               i;[m
[31m-    struct sockaddr         *sa;[m
[31m-    struct sockaddr_in      *sin;[m
[31m-    ngx_stream_conf_port_t  *port;[m
[31m-    ngx_stream_conf_addr_t  *addr;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6     *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    sa = &listen->u.sockaddr;[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = &listen->u.sockaddr_in6;[m
[31m-        p = sin6->sin6_port;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        p = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = &listen->u.sockaddr_in;[m
[31m-        p = sin->sin_port;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (i = 0; i < ports->nelts; i++) {[m
[31m-[m
[31m-        if (p == port[i].port[m
[31m-            && listen->type == port[i].type[m
[31m-            && sa->sa_family == port[i].family)[m
[31m-        {[m
[31m-            /* a port is already in the port list */[m
[31m-[m
[31m-            port = &port[i];[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* add a port to the port list */[m
[31m-[m
[31m-    port = ngx_array_push(ports);[m
[31m-    if (port == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    port->family = sa->sa_family;[m
[31m-    port->type = listen->type;[m
[31m-    port->port = p;[m
[31m-[m
[31m-    if (ngx_array_init(&port->addrs, cf->temp_pool, 2,[m
[31m-                       sizeof(ngx_stream_conf_addr_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    addr = ngx_array_push(&port->addrs);[m
[31m-    if (addr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addr->opt = *listen;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)[m
[31m-{[m
[31m-    ngx_uint_t                   i, p, last, bind_wildcard;[m
[31m-    ngx_listening_t             *ls;[m
[31m-    ngx_stream_port_t           *stport;[m
[31m-    ngx_stream_conf_port_t      *port;[m
[31m-    ngx_stream_conf_addr_t      *addr;[m
[31m-    ngx_stream_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (p = 0; p < ports->nelts; p++) {[m
[31m-[m
[31m-        ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,[m
[31m-                 sizeof(ngx_stream_conf_addr_t), ngx_stream_cmp_conf_addrs);[m
[31m-[m
[31m-        addr = port[p].addrs.elts;[m
[31m-        last = port[p].addrs.nelts;[m
[31m-[m
[31m-        /*[m
[31m-         * if there is the binding to the "*:port" then we need to bind()[m
[31m-         * to the "*:port" only and ignore the other bindings[m
[31m-         */[m
[31m-[m
[31m-        if (addr[last - 1].opt.wildcard) {[m
[31m-            addr[last - 1].opt.bind = 1;[m
[31m-            bind_wildcard = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            bind_wildcard = 0;[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-[m
[31m-        while (i < last) {[m
[31m-[m
[31m-            if (bind_wildcard && !addr[i].opt.bind) {[m
[31m-                i++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls = ngx_create_listening(cf, &addr[i].opt.u.sockaddr,[m
[31m-                                      addr[i].opt.socklen);[m
[31m-            if (ls == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls->addr_ntop = 1;[m
[31m-            ls->handler = ngx_stream_init_connection;[m
[31m-            ls->pool_size = 256;[m
[31m-            ls->type = addr[i].opt.type;[m
[31m-[m
[31m-            cscf = addr->opt.ctx->srv_conf[ngx_stream_core_module.ctx_index];[m
[31m-[m
[31m-            ls->logp = cscf->error_log;[m
[31m-            ls->log.data = &ls->addr_text;[m
[31m-            ls->log.handler = ngx_accept_log_error;[m
[31m-[m
[31m-            ls->backlog = addr[i].opt.backlog;[m
[31m-[m
[31m-            ls->wildcard = addr[i].opt.wildcard;[m
[31m-[m
[31m-            ls->keepalive = addr[i].opt.so_keepalive;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-            ls->keepidle = addr[i].opt.tcp_keepidle;[m
[31m-            ls->keepintvl = addr[i].opt.tcp_keepintvl;[m
[31m-            ls->keepcnt = addr[i].opt.tcp_keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            ls->ipv6only = addr[i].opt.ipv6only;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            ls->reuseport = addr[i].opt.reuseport;[m
[31m-#endif[m
[31m-[m
[31m-            stport = ngx_palloc(cf->pool, sizeof(ngx_stream_port_t));[m
[31m-            if (stport == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls->servers = stport;[m
[31m-[m
[31m-            stport->naddrs = i + 1;[m
[31m-[m
[31m-            switch (ls->sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                if (ngx_stream_add_addrs6(cf, stport, addr) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                if (ngx_stream_add_addrs(cf, stport, addr) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_clone_listening(cf, ls) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            addr++;[m
[31m-            last--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_add_addrs(ngx_conf_t *cf, ngx_stream_port_t *stport,[m
[31m-    ngx_stream_conf_addr_t *addr)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    size_t                 len;[m
[31m-    ngx_uint_t             i;[m
[31m-    struct sockaddr_in    *sin;[m
[31m-    ngx_stream_in_addr_t  *addrs;[m
[31m-    u_char                 buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    stport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                                stport->naddrs * sizeof(ngx_stream_in_addr_t));[m
[31m-    if (stport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs = stport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < stport->naddrs; i++) {[m
[31m-[m
[31m-        sin = &addr[i].opt.u.sockaddr_in;[m
[31m-        addrs[i].addr = sin->sin_addr.s_addr;[m
[31m-[m
[31m-        addrs[i].conf.ctx = addr[i].opt.ctx;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        addrs[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-[m
[31m-        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,[m
[31m-                            NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-        addrs[i].conf.addr_text.len = len;[m
[31m-        addrs[i].conf.addr_text.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_add_addrs6(ngx_conf_t *cf, ngx_stream_port_t *stport,[m
[31m-    ngx_stream_conf_addr_t *addr)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    size_t                  len;[m
[31m-    ngx_uint_t              i;[m
[31m-    struct sockaddr_in6    *sin6;[m
[31m-    ngx_stream_in6_addr_t  *addrs6;[m
[31m-    u_char                  buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    stport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                                stport->naddrs * sizeof(ngx_stream_in6_addr_t));[m
[31m-    if (stport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs6 = stport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < stport->naddrs; i++) {[m
[31m-[m
[31m-        sin6 = &addr[i].opt.u.sockaddr_in6;[m
[31m-        addrs6[i].addr6 = sin6->sin6_addr;[m
[31m-[m
[31m-        addrs6[i].conf.ctx = addr[i].opt.ctx;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        addrs6[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-[m
[31m-        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,[m
[31m-                            NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-        addrs6[i].conf.addr_text.len = len;[m
[31m-        addrs6[i].conf.addr_text.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_cmp_conf_addrs(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_stream_conf_addr_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_stream_conf_addr_t *) one;[m
[31m-    second = (ngx_stream_conf_addr_t *) two;[m
[31m-[m
[31m-    if (first->opt.wildcard) {[m
[31m-        /* a wildcard must be the last resort, shift it to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (second->opt.wildcard) {[m
[31m-        /* a wildcard must be the last resort, shift it to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->opt.bind && !second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->opt.bind && second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* do not sort by default */[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream.h[m
[1mdeleted file mode 100644[m
[1mindex 49efa45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,212 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STREAM_H_INCLUDED_[m
[31m-#define _NGX_STREAM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-#include <ngx_stream_ssl_module.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_stream_session_s  ngx_stream_session_t;[m
[31m-[m
[31m-[m
[31m-#include <ngx_stream_upstream.h>[m
[31m-#include <ngx_stream_upstream_round_robin.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void                  **main_conf;[m
[31m-    void                  **srv_conf;[m
[31m-} ngx_stream_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    union {[m
[31m-        struct sockaddr     sockaddr;[m
[31m-        struct sockaddr_in  sockaddr_in;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        struct sockaddr_in6 sockaddr_in6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        struct sockaddr_un  sockaddr_un;[m
[31m-#endif[m
[31m-        u_char              sockaddr_data[NGX_SOCKADDRLEN];[m
[31m-    } u;[m
[31m-[m
[31m-    socklen_t               socklen;[m
[31m-[m
[31m-    /* server ctx */[m
[31m-    ngx_stream_conf_ctx_t  *ctx;[m
[31m-[m
[31m-    unsigned                bind:1;[m
[31m-    unsigned                wildcard:1;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    unsigned                ssl:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    unsigned                ipv6only:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    unsigned                reuseport:1;[m
[31m-#endif[m
[31m-    unsigned                so_keepalive:2;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    int                     tcp_keepidle;[m
[31m-    int                     tcp_keepintvl;[m
[31m-    int                     tcp_keepcnt;[m
[31m-#endif[m
[31m-    int                     backlog;[m
[31m-    int                     type;[m
[31m-} ngx_stream_listen_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_conf_ctx_t  *ctx;[m
[31m-    ngx_str_t               addr_text;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    ngx_uint_t              ssl;    /* unsigned   ssl:1; */[m
[31m-#endif[m
[31m-} ngx_stream_addr_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t               addr;[m
[31m-    ngx_stream_addr_conf_t  conf;[m
[31m-} ngx_stream_in_addr_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr         addr6;[m
[31m-    ngx_stream_addr_conf_t  conf;[m
[31m-} ngx_stream_in6_addr_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* ngx_stream_in_addr_t or ngx_stream_in6_addr_t */[m
[31m-    void                   *addrs;[m
[31m-    ngx_uint_t              naddrs;[m
[31m-} ngx_stream_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int                     family;[m
[31m-    int                     type;[m
[31m-    in_port_t               port;[m
[31m-    ngx_array_t             addrs;       /* array of ngx_stream_conf_addr_t */[m
[31m-} ngx_stream_conf_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_listen_t     opt;[m
[31m-} ngx_stream_conf_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_stream_access_pt)(ngx_stream_session_t *s);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t             servers;     /* ngx_stream_core_srv_conf_t */[m
[31m-    ngx_array_t             listen;      /* ngx_stream_listen_t */[m
[31m-    ngx_stream_access_pt    limit_conn_handler;[m
[31m-    ngx_stream_access_pt    access_handler;[m
[31m-} ngx_stream_core_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_stream_handler_pt)(ngx_stream_session_t *s);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_handler_pt   handler;[m
[31m-    ngx_stream_conf_ctx_t  *ctx;[m
[31m-    u_char                 *file_name;[m
[31m-    ngx_int_t               line;[m
[31m-    ngx_log_t              *error_log;[m
[31m-    ngx_flag_t              tcp_nodelay;[m
[31m-} ngx_stream_core_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_stream_session_s {[m
[31m-    uint32_t                signature;         /* "STRM" */[m
[31m-[m
[31m-    ngx_connection_t       *connection;[m
[31m-[m
[31m-    off_t                   received;[m
[31m-[m
[31m-    ngx_log_handler_pt      log_handler;[m
[31m-[m
[31m-    void                  **ctx;[m
[31m-    void                  **main_conf;[m
[31m-    void                  **srv_conf;[m
[31m-[m
[31m-    ngx_stream_upstream_t  *upstream;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t             (*postconfiguration)(ngx_conf_t *cf);[m
[31m-[m
[31m-    void                 *(*create_main_conf)(ngx_conf_t *cf);[m
[31m-    char                 *(*init_main_conf)(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-    void                 *(*create_srv_conf)(ngx_conf_t *cf);[m
[31m-    char                 *(*merge_srv_conf)(ngx_conf_t *cf, void *prev,[m
[31m-                                            void *conf);[m
[31m-} ngx_stream_module_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_STREAM_MODULE       0x4d525453     /* "STRM" */[m
[31m-[m
[31m-#define NGX_STREAM_MAIN_CONF    0x02000000[m
[31m-#define NGX_STREAM_SRV_CONF     0x04000000[m
[31m-#define NGX_STREAM_UPS_CONF     0x08000000[m
[31m-[m
[31m-[m
[31m-#define NGX_STREAM_MAIN_CONF_OFFSET  offsetof(ngx_stream_conf_ctx_t, main_conf)[m
[31m-#define NGX_STREAM_SRV_CONF_OFFSET   offsetof(ngx_stream_conf_ctx_t, srv_conf)[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_get_module_ctx(s, module)   (s)->ctx[module.ctx_index][m
[31m-#define ngx_stream_set_ctx(s, c, module)       s->ctx[module.ctx_index] = c;[m
[31m-#define ngx_stream_delete_ctx(s, module)       s->ctx[module.ctx_index] = NULL;[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_get_module_main_conf(s, module)                             \[m
[31m-    (s)->main_conf[module.ctx_index][m
[31m-#define ngx_stream_get_module_srv_conf(s, module)                              \[m
[31m-    (s)->srv_conf[module.ctx_index][m
[31m-[m
[31m-#define ngx_stream_conf_get_module_main_conf(cf, module)                       \[m
[31m-    ((ngx_stream_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index][m
[31m-#define ngx_stream_conf_get_module_srv_conf(cf, module)                        \[m
[31m-    ((ngx_stream_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index][m
[31m-[m
[31m-#define ngx_stream_cycle_get_module_main_conf(cycle, module)                   \[m
[31m-    (cycle->conf_ctx[ngx_stream_module.index] ?                                \[m
[31m-        ((ngx_stream_conf_ctx_t *) cycle->conf_ctx[ngx_stream_module.index])   \[m
[31m-            ->main_conf[module.ctx_index]:                                     \[m
[31m-        NULL)[m
[31m-[m
[31m-[m
[31m-void ngx_stream_init_connection(ngx_connection_t *c);[m
[31m-void ngx_stream_close_connection(ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_stream_module;[m
[31m-extern ngx_uint_t    ngx_stream_max_module;[m
[31m-extern ngx_module_t  ngx_stream_core_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STREAM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_access_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_access_module.c[m
[1mdeleted file mode 100644[m
[1mindex 64869d2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_access_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,451 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t         mask;[m
[31m-    in_addr_t         addr;[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_stream_access_rule_t;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr   addr;[m
[31m-    struct in6_addr   mask;[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_stream_access_rule6_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_stream_access_rule_un_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t      *rules;     /* array of ngx_stream_access_rule_t */[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_array_t      *rules6;    /* array of ngx_stream_access_rule6_t */[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    ngx_array_t      *rules_un;  /* array of ngx_stream_access_rule_un_t */[m
[31m-#endif[m
[31m-} ngx_stream_access_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_stream_access_handler(ngx_stream_session_t *s);[m
[31m-static ngx_int_t ngx_stream_access_inet(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf, in_addr_t addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_stream_access_inet6(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf, u_char *p);[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-static ngx_int_t ngx_stream_access_unix(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_stream_access_found(ngx_stream_session_t *s,[m
[31m-    ngx_uint_t deny);[m
[31m-static char *ngx_stream_access_rule(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_stream_access_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_access_merge_srv_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_stream_access_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_access_commands[] = {[m
[31m-[m
[31m-    { ngx_string("allow"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_access_rule,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("deny"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_access_rule,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_access_module_ctx = {[m
[31m-    ngx_stream_access_init,                /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_access_create_srv_conf,     /* create server configuration */[m
[31m-    ngx_stream_access_merge_srv_conf       /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_access_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_access_module_ctx,         /* module context */[m
[31m-    ngx_stream_access_commands,            /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_handler(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    struct sockaddr_in            *sin;[m
[31m-    ngx_stream_access_srv_conf_t  *ascf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                        *p;[m
[31m-    in_addr_t                      addr;[m
[31m-    struct sockaddr_in6           *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    ascf = ngx_stream_get_module_srv_conf(s, ngx_stream_access_module);[m
[31m-[m
[31m-    switch (s->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        if (ascf->rules) {[m
[31m-            sin = (struct sockaddr_in *) s->connection->sockaddr;[m
[31m-            return ngx_stream_access_inet(s, ascf, sin->sin_addr.s_addr);[m
[31m-        }[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;[m
[31m-        p = sin6->sin6_addr.s6_addr;[m
[31m-[m
[31m-        if (ascf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {[m
[31m-            addr = p[12] << 24;[m
[31m-            addr += p[13] << 16;[m
[31m-            addr += p[14] << 8;[m
[31m-            addr += p[15];[m
[31m-            return ngx_stream_access_inet(s, ascf, htonl(addr));[m
[31m-        }[m
[31m-[m
[31m-        if (ascf->rules6) {[m
[31m-            return ngx_stream_access_inet6(s, ascf, p);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    case AF_UNIX:[m
[31m-        if (ascf->rules_un) {[m
[31m-            return ngx_stream_access_unix(s, ascf);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_inet(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf, in_addr_t addr)[m
[31m-{[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_stream_access_rule_t  *rule;[m
[31m-[m
[31m-    rule = ascf->rules->elts;[m
[31m-    for (i = 0; i < ascf->rules->nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "access: %08XD %08XD %08XD",[m
[31m-                       addr, rule[i].mask, rule[i].addr);[m
[31m-[m
[31m-        if ((addr & rule[i].mask) == rule[i].addr) {[m
[31m-            return ngx_stream_access_found(s, rule[i].deny);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_inet6(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf, u_char *p)[m
[31m-{[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_stream_access_rule6_t  *rule6;[m
[31m-[m
[31m-    rule6 = ascf->rules6->elts;[m
[31m-    for (i = 0; i < ascf->rules6->nelts; i++) {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        size_t  cl, ml, al;[m
[31m-        u_char  ct[NGX_INET6_ADDRSTRLEN];[m
[31m-        u_char  mt[NGX_INET6_ADDRSTRLEN];[m
[31m-        u_char  at[NGX_INET6_ADDRSTRLEN];[m
[31m-[m
[31m-        cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN);[m
[31m-        ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN);[m
[31m-        al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN);[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "access: %*s %*s %*s", cl, ct, ml, mt, al, at);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        for (n = 0; n < 16; n++) {[m
[31m-            if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_stream_access_found(s, rule6[i].deny);[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_unix(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf)[m
[31m-{[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_stream_access_rule_un_t  *rule_un;[m
[31m-[m
[31m-    rule_un = ascf->rules_un->elts;[m
[31m-    for (i = 0; i < ascf->rules_un->nelts; i++) {[m
[31m-[m
[31m-        /* TODO: check path */[m
[31m-        if (1) {[m
[31m-            return ngx_stream_access_found(s, rule_un[i].deny);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_found(ngx_stream_session_t *s, ngx_uint_t deny)[m
[31m-{[m
[31m-    if (deny) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                      "access forbidden by rule");[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_access_srv_conf_t *ascf = conf;[m
[31m-[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_uint_t                    all;[m
[31m-    ngx_str_t                    *value;[m
[31m-    ngx_cidr_t                    cidr;[m
[31m-    ngx_stream_access_rule_t     *rule;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_stream_access_rule6_t    *rule6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    ngx_stream_access_rule_un_t  *rule_un;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memzero(&cidr, sizeof(ngx_cidr_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    all = (value[1].len == 3 && ngx_strcmp(value[1].data, "all") == 0);[m
[31m-[m
[31m-    if (!all) {[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-        if (value[1].len == 5 && ngx_strcmp(value[1].data, "unix:") == 0) {[m
[31m-            cidr.family = AF_UNIX;[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_ptocidr(&value[1], &cidr);[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-        rc = ngx_ptocidr(&value[1], &cidr);[m
[31m-#endif[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                         "invalid parameter \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                         "low address bits of %V are meaningless", &value[1]);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cidr.family == AF_INET || all) {[m
[31m-[m
[31m-        if (ascf->rules == NULL) {[m
[31m-            ascf->rules = ngx_array_create(cf->pool, 4,[m
[31m-                                           sizeof(ngx_stream_access_rule_t));[m
[31m-            if (ascf->rules == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule = ngx_array_push(ascf->rules);[m
[31m-        if (rule == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule->mask = cidr.u.in.mask;[m
[31m-        rule->addr = cidr.u.in.addr;[m
[31m-        rule->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (cidr.family == AF_INET6 || all) {[m
[31m-[m
[31m-        if (ascf->rules6 == NULL) {[m
[31m-            ascf->rules6 = ngx_array_create(cf->pool, 4,[m
[31m-                                            sizeof(ngx_stream_access_rule6_t));[m
[31m-            if (ascf->rules6 == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule6 = ngx_array_push(ascf->rules6);[m
[31m-        if (rule6 == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule6->mask = cidr.u.in6.mask;[m
[31m-        rule6->addr = cidr.u.in6.addr;[m
[31m-        rule6->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    if (cidr.family == AF_UNIX || all) {[m
[31m-[m
[31m-        if (ascf->rules_un == NULL) {[m
[31m-            ascf->rules_un = ngx_array_create(cf->pool, 1,[m
[31m-                                          sizeof(ngx_stream_access_rule_un_t));[m
[31m-            if (ascf->rules_un == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule_un = ngx_array_push(ascf->rules_un);[m
[31m-        if (rule_un == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule_un->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_access_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_access_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_access_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_access_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_access_srv_conf_t  *prev = parent;[m
[31m-    ngx_stream_access_srv_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->rules == NULL[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        && conf->rules6 == NULL[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        && conf->rules_un == NULL[m
[31m-#endif[m
[31m-    ) {[m
[31m-        conf->rules = prev->rules;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        conf->rules6 = prev->rules6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        conf->rules_un = prev->rules_un;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);[m
[31m-    cmcf->access_handler = ngx_stream_access_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_core_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_core_module.c[m
[1mdeleted file mode 100644[m
[1mindex ebc2b1c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_core_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,562 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_stream_core_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_stream_core_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_stream_core_server,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("listen"),[m
[31m-      NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_stream_core_listen,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_stream_core_error_log,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nodelay"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_core_srv_conf_t, tcp_nodelay),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_core_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_stream_core_create_main_conf,      /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_core_create_srv_conf,       /* create server configuration */[m
[31m-    ngx_stream_core_merge_srv_conf         /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_core_module_ctx,           /* module context */[m
[31m-    ngx_stream_core_commands,              /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_core_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_main_conf_t));[m
[31m-    if (cmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->servers, cf->pool, 4,[m
[31m-                       sizeof(ngx_stream_core_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_stream_listen_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return cmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_core_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_srv_conf_t));[m
[31m-    if (cscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     cscf->handler = NULL;[m
[31m-     *     cscf->error_log = NULL;[m
[31m-     */[m
[31m-[m
[31m-    cscf->file_name = cf->conf_file->file.name.data;[m
[31m-    cscf->line = cf->conf_file->line;[m
[31m-    cscf->tcp_nodelay = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return cscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_core_srv_conf_t *prev = parent;[m
[31m-    ngx_stream_core_srv_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->handler == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no handler for server in %s:%ui",[m
[31m-                      conf->file_name, conf->line);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->error_log == NULL) {[m
[31m-        if (prev->error_log) {[m
[31m-            conf->error_log = prev->error_log;[m
[31m-        } else {[m
[31m-            conf->error_log = &cf->cycle->new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &cscf->error_log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                         *rv;[m
[31m-    void                         *mconf;[m
[31m-    ngx_uint_t                    m;[m
[31m-    ngx_conf_t                    pcf;[m
[31m-    ngx_stream_module_t          *module;[m
[31m-    ngx_stream_conf_ctx_t        *ctx, *stream_ctx;[m
[31m-    ngx_stream_core_srv_conf_t   *cscf, **cscfp;[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    stream_ctx = cf->ctx;[m
[31m-    ctx->main_conf = stream_ctx->main_conf;[m
[31m-[m
[31m-    /* the server{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool,[m
[31m-                                sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the server configuration context */[m
[31m-[m
[31m-    cscf = ctx->srv_conf[ngx_stream_core_module.ctx_index];[m
[31m-    cscf->ctx = ctx;[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index];[m
[31m-[m
[31m-    cscfp = ngx_array_push(&cmcf->servers);[m
[31m-    if (cscfp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *cscfp = cscf;[m
[31m-[m
[31m-[m
[31m-    /* parse inside server{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_STREAM_SRV_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    size_t                        len, off;[m
[31m-    in_port_t                     port;[m
[31m-    ngx_str_t                    *value;[m
[31m-    ngx_url_t                     u;[m
[31m-    ngx_uint_t                    i, backlog;[m
[31m-    struct sockaddr              *sa;[m
[31m-    struct sockaddr_in           *sin;[m
[31m-    ngx_stream_listen_t          *ls;[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6          *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.listen = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in \"%V\" of the \"listen\" directive",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);[m
[31m-[m
[31m-    ls = cmcf->listen.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->listen.nelts; i++) {[m
[31m-[m
[31m-        sa = &ls[i].u.sockaddr;[m
[31m-[m
[31m-        if (sa->sa_family != u.family) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            off = offsetof(struct sockaddr_in6, sin6_addr);[m
[31m-            len = 16;[m
[31m-            sin6 = &ls[i].u.sockaddr_in6;[m
[31m-            port = sin6->sin6_port;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            off = offsetof(struct sockaddr_un, sun_path);[m
[31m-            len = sizeof(((struct sockaddr_un *) sa)->sun_path);[m
[31m-            port = 0;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            off = offsetof(struct sockaddr_in, sin_addr);[m
[31m-            len = 4;[m
[31m-            sin = &ls[i].u.sockaddr_in;[m
[31m-            port = sin->sin_port;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_memcmp(ls[i].u.sockaddr_data + off, u.sockaddr + off, len)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (port != u.port) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate \"%V\" address and port pair", &u.url);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ls = ngx_array_push(&cmcf->listen);[m
[31m-    if (ls == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(ls, sizeof(ngx_stream_listen_t));[m
[31m-[m
[31m-    ngx_memcpy(&ls->u.sockaddr, u.sockaddr, u.socklen);[m
[31m-[m
[31m-    ls->socklen = u.socklen;[m
[31m-    ls->backlog = NGX_LISTEN_BACKLOG;[m
[31m-    ls->type = SOCK_STREAM;[m
[31m-    ls->wildcard = u.wildcard;[m
[31m-    ls->ctx = cf->ctx;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    ls->ipv6only = 1;[m
[31m-#endif[m
[31m-[m
[31m-    backlog = 0;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-        if (ngx_strcmp(value[i].data, "udp") == 0) {[m
[31m-            ls->type = SOCK_DGRAM;[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "bind") == 0) {[m
[31m-            ls->bind = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) {[m
[31m-            ls->backlog = ngx_atoi(value[i].data + 8, value[i].len - 8);[m
[31m-            ls->bind = 1;[m
[31m-[m
[31m-            if (ls->backlog == NGX_ERROR || ls->backlog == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid backlog \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            backlog = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) {[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            u_char  buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-            sa = &ls->u.sockaddr;[m
[31m-[m
[31m-            if (sa->sa_family == AF_INET6) {[m
[31m-[m
[31m-                if (ngx_strcmp(&value[i].data[10], "n") == 0) {[m
[31m-                    ls->ipv6only = 1;[m
[31m-[m
[31m-                } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) {[m
[31m-                    ls->ipv6only = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid ipv6only flags \"%s\"",[m
[31m-                                       &value[i].data[9]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ls->bind = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                len = ngx_sock_ntop(sa, ls->socklen, buf,[m
[31m-                                    NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "ipv6only is not supported "[m
[31m-                                   "on addr \"%*s\", ignored", len, buf);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "bind ipv6only is not supported "[m
[31m-                               "on this platform");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "reuseport") == 0) {[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            ls->reuseport = 1;[m
[31m-            ls->bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "reuseport is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "ssl") == 0) {[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-            ls->ssl = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"ssl\" parameter requires "[m
[31m-                               "ngx_stream_ssl_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[i].data[13], "on") == 0) {[m
[31m-                ls->so_keepalive = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[i].data[13], "off") == 0) {[m
[31m-                ls->so_keepalive = 2;[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-                u_char     *p, *end;[m
[31m-                ngx_str_t   s;[m
[31m-[m
[31m-                end = value[i].data + value[i].len;[m
[31m-                s.data = value[i].data + 13;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepidle = ngx_parse_time(&s, 1);[m
[31m-                    if (ls->tcp_keepidle == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepintvl = ngx_parse_time(&s, 1);[m
[31m-                    if (ls->tcp_keepintvl == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                if (s.data < end) {[m
[31m-                    s.len = end - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepcnt = ngx_atoi(s.data, s.len);[m
[31m-                    if (ls->tcp_keepcnt == NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0[m
[31m-                    && ls->tcp_keepcnt == 0)[m
[31m-                {[m
[31m-                    goto invalid_so_keepalive;[m
[31m-                }[m
[31m-[m
[31m-                ls->so_keepalive = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"so_keepalive\" parameter accepts "[m
[31m-                                   "only \"on\" or \"off\" on this platform");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            ls->bind = 1;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-        invalid_so_keepalive:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid so_keepalive value: \"%s\"",[m
[31m-                               &value[i].data[13]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the invalid \"%V\" parameter", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ls->type == SOCK_DGRAM) {[m
[31m-        if (backlog) {[m
[31m-            return "\"backlog\" parameter is incompatible with \"udp\"";[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        if (ls->ssl) {[m
[31m-            return "\"ssl\" parameter is incompatible with \"udp\"";[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ls->so_keepalive) {[m
[31m-            return "\"so_keepalive\" parameter is incompatible with \"udp\"";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_handler.c[m
[1mdeleted file mode 100644[m
[1mindex aa69e44..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,344 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-static void ngx_stream_init_session(ngx_connection_t *c);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-static void ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c);[m
[31m-static void ngx_stream_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_stream_init_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    int                           tcp_nodelay;[m
[31m-    u_char                        text[NGX_SOCKADDR_STRLEN];[m
[31m-    size_t                        len;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_uint_t                    i;[m
[31m-    struct sockaddr              *sa;[m
[31m-    ngx_stream_port_t            *port;[m
[31m-    struct sockaddr_in           *sin;[m
[31m-    ngx_stream_in_addr_t         *addr;[m
[31m-    ngx_stream_session_t         *s;[m
[31m-    ngx_stream_addr_conf_t       *addr_conf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6          *sin6;[m
[31m-    ngx_stream_in6_addr_t        *addr6;[m
[31m-#endif[m
[31m-    ngx_stream_core_srv_conf_t   *cscf;[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    /* find the server configuration for the address:port */[m
[31m-[m
[31m-    port = c->listening->servers;[m
[31m-[m
[31m-    if (port->naddrs > 1) {[m
[31m-[m
[31m-        /*[m
[31m-         * There are several addresses on this port and one of them[m
[31m-         * is the "*:port" wildcard so getsockname() is needed to determine[m
[31m-         * the server address.[m
[31m-         *[m
[31m-         * AcceptEx() and recvmsg() already gave this address.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sa = c->local_sockaddr;[m
[31m-[m
[31m-        switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) sa;[m
[31m-[m
[31m-            addr6 = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            addr_conf = &addr6[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) sa;[m
[31m-[m
[31m-            addr = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (addr[i].addr == sin->sin_addr.s_addr) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            addr_conf = &addr[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            addr6 = port->addrs;[m
[31m-            addr_conf = &addr6[0].conf;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            addr = port->addrs;[m
[31m-            addr_conf = &addr[0].conf;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = ngx_pcalloc(c->pool, sizeof(ngx_stream_session_t));[m
[31m-    if (s == NULL) {[m
[31m-        ngx_stream_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->signature = NGX_STREAM_MODULE;[m
[31m-    s->main_conf = addr_conf->ctx->main_conf;[m
[31m-    s->srv_conf = addr_conf->ctx->srv_conf;[m
[31m-[m
[31m-    s->connection = c;[m
[31m-    c->data = s;[m
[31m-[m
[31m-    cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(c, cscf->error_log);[m
[31m-[m
[31m-    len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA %sclient %*s connected to %V",[m
[31m-                  c->number, c->type == SOCK_DGRAM ? "udp " : "",[m
[31m-                  len, text, &addr_conf->addr_text);[m
[31m-[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->handler = ngx_stream_log_error;[m
[31m-    c->log->data = s;[m
[31m-    c->log->action = "initializing connection";[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);[m
[31m-[m
[31m-    if (cmcf->limit_conn_handler) {[m
[31m-        rc = cmcf->limit_conn_handler(s);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cmcf->access_handler) {[m
[31m-        rc = cmcf->access_handler(s);[m
[31m-[m
[31m-        if (rc != NGX_OK && rc != NGX_DECLINED) {[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->type == SOCK_STREAM[m
[31m-        && cscf->tcp_nodelay[m
[31m-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-        {[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    {[m
[31m-    ngx_stream_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    sslcf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module);[m
[31m-[m
[31m-    if (addr_conf->ssl) {[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (sslcf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined "[m
[31m-                          "in server listening on SSL port");[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_ssl_init_connection(&sslcf->ssl, c);[m
[31m-        return;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_stream_init_session(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_init_session(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_stream_session_t        *s;[m
[31m-    ngx_stream_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    s = c->data;[m
[31m-    c->log->action = "handling client connection";[m
[31m-[m
[31m-    cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);[m
[31m-[m
[31m-    s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (s->ctx == NULL) {[m
[31m-        ngx_stream_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cscf->handler(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_stream_session_t   *s;[m
[31m-    ngx_stream_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(ssl, c, 0) == NGX_ERROR) {[m
[31m-        ngx_stream_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_handshake(c) == NGX_AGAIN) {[m
[31m-[m
[31m-        s = c->data;[m
[31m-[m
[31m-        sslcf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module);[m
[31m-[m
[31m-        ngx_add_timer(c->read, sslcf->handshake_timeout);[m
[31m-[m
[31m-        c->ssl->handler = ngx_stream_ssl_handshake_handler;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_ssl_handshake_handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (!c->ssl->handshaked) {[m
[31m-        ngx_stream_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_init_session(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_stream_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                   "close stream connection: %d", c->fd);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_stream_close_connection;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    ngx_stream_session_t  *s;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    s = log->data;[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", %sclient: %V, server: %V",[m
[31m-                     s->connection->type == SOCK_DGRAM ? "udp " : "",[m
[31m-                     &s->connection->addr_text,[m
[31m-                     &s->connection->listening->addr_text);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (s->log_handler) {[m
[31m-        p = s->log_handler(log, buf, len);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_limit_conn_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_limit_conn_module.c[m
[1mdeleted file mode 100644[m
[1mindex f1d8a37..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_limit_conn_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,632 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     color;[m
[31m-    u_char                     len;[m
[31m-    u_short                    conn;[m
[31m-    u_char                     data[1];[m
[31m-} ngx_stream_limit_conn_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t            *shm_zone;[m
[31m-    ngx_rbtree_node_t         *node;[m
[31m-} ngx_stream_limit_conn_cleanup_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t              *rbtree;[m
[31m-} ngx_stream_limit_conn_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t            *shm_zone;[m
[31m-    ngx_uint_t                 conn;[m
[31m-} ngx_stream_limit_conn_limit_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                limits;[m
[31m-    ngx_uint_t                 log_level;[m
[31m-} ngx_stream_limit_conn_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_rbtree_node_t *ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree,[m
[31m-    ngx_str_t *key, uint32_t hash);[m
[31m-static void ngx_stream_limit_conn_cleanup(void *data);[m
[31m-static ngx_inline void ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool);[m
[31m-[m
[31m-static void *ngx_stream_limit_conn_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_stream_limit_conn_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_stream_limit_conn_log_levels[] = {[m
[31m-    { ngx_string("info"), NGX_LOG_INFO },[m
[31m-    { ngx_string("notice"), NGX_LOG_NOTICE },[m
[31m-    { ngx_string("warn"), NGX_LOG_WARN },[m
[31m-    { ngx_string("error"), NGX_LOG_ERR },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_limit_conn_commands[] = {[m
[31m-[m
[31m-    { ngx_string("limit_conn_zone"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_stream_limit_conn_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_conn"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_stream_limit_conn,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_conn_log_level"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_limit_conn_conf_t, log_level),[m
[31m-      &ngx_stream_limit_conn_log_levels },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_limit_conn_module_ctx = {[m
[31m-    ngx_stream_limit_conn_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_limit_conn_create_conf,     /* create server configuration */[m
[31m-    ngx_stream_limit_conn_merge_conf,      /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_limit_conn_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_limit_conn_module_ctx,       /* module context */[m
[31m-    ngx_stream_limit_conn_commands,          /* module directives */[m
[31m-    NGX_STREAM_MODULE,                       /* module type */[m
[31m-    NULL,                                    /* init master */[m
[31m-    NULL,                                    /* init module */[m
[31m-    NULL,                                    /* init process */[m
[31m-    NULL,                                    /* init thread */[m
[31m-    NULL,                                    /* exit thread */[m
[31m-    NULL,                                    /* exit process */[m
[31m-    NULL,                                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_limit_conn_handler(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    size_t                            n;[m
[31m-    uint32_t                          hash;[m
[31m-    ngx_str_t                         key;[m
[31m-    ngx_uint_t                        i;[m
[31m-    ngx_slab_pool_t                  *shpool;[m
[31m-    ngx_rbtree_node_t                *node;[m
[31m-    ngx_pool_cleanup_t               *cln;[m
[31m-    struct sockaddr_in               *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6              *sin6;[m
[31m-#endif[m
[31m-    ngx_stream_limit_conn_ctx_t      *ctx;[m
[31m-    ngx_stream_limit_conn_node_t     *lc;[m
[31m-    ngx_stream_limit_conn_conf_t     *lccf;[m
[31m-    ngx_stream_limit_conn_limit_t    *limits;[m
[31m-    ngx_stream_limit_conn_cleanup_t  *lccln;[m
[31m-[m
[31m-    switch (s->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        sin = (struct sockaddr_in *) s->connection->sockaddr;[m
[31m-[m
[31m-        key.len = sizeof(in_addr_t);[m
[31m-        key.data = (u_char *) &sin->sin_addr;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;[m
[31m-[m
[31m-        key.len = sizeof(struct in6_addr);[m
[31m-        key.data = sin6->sin6_addr.s6_addr;[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-    lccf = ngx_stream_get_module_srv_conf(s, ngx_stream_limit_conn_module);[m
[31m-    limits = lccf->limits.elts;[m
[31m-[m
[31m-    for (i = 0; i < lccf->limits.nelts; i++) {[m
[31m-        ctx = limits[i].shm_zone->data;[m
[31m-[m
[31m-        shpool = (ngx_slab_pool_t *) limits[i].shm_zone->shm.addr;[m
[31m-[m
[31m-        ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-        node = ngx_stream_limit_conn_lookup(ctx->rbtree, &key, hash);[m
[31m-[m
[31m-        if (node == NULL) {[m
[31m-[m
[31m-            n = offsetof(ngx_rbtree_node_t, color)[m
[31m-                + offsetof(ngx_stream_limit_conn_node_t, data)[m
[31m-                + key.len;[m
[31m-[m
[31m-            node = ngx_slab_alloc_locked(shpool, n);[m
[31m-[m
[31m-            if (node == NULL) {[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-                ngx_stream_limit_conn_cleanup_all(s->connection->pool);[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            lc = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-            node->key = hash;[m
[31m-            lc->len = (u_char) key.len;[m
[31m-            lc->conn = 1;[m
[31m-            ngx_memcpy(lc->data, key.data, key.len);[m
[31m-[m
[31m-            ngx_rbtree_insert(ctx->rbtree, node);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            lc = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-            if ((ngx_uint_t) lc->conn >= limits[i].conn) {[m
[31m-[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-                ngx_log_error(lccf->log_level, s->connection->log, 0,[m
[31m-                              "limiting connections by zone \"%V\"",[m
[31m-                              &limits[i].shm_zone->shm.name);[m
[31m-[m
[31m-                ngx_stream_limit_conn_cleanup_all(s->connection->pool);[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            lc->conn++;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "limit conn: %08Xi %d", node->key, lc->conn);[m
[31m-[m
[31m-        ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(s->connection->pool,[m
[31m-                                   sizeof(ngx_stream_limit_conn_cleanup_t));[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_stream_limit_conn_cleanup;[m
[31m-        lccln = cln->data;[m
[31m-[m
[31m-        lccln->shm_zone = limits[i].shm_zone;[m
[31m-        lccln->node = node;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t             **p;[m
[31m-    ngx_stream_limit_conn_node_t   *lcn, *lcnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            lcn = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-            lcnt = (ngx_stream_limit_conn_node_t *) &temp->color;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0)[m
[31m-                ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_rbtree_node_t *[m
[31m-ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_rbtree_node_t             *node, *sentinel;[m
[31m-    ngx_stream_limit_conn_node_t  *lcn;[m
[31m-[m
[31m-    node = rbtree->root;[m
[31m-    sentinel = rbtree->sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        lcn = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return node;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_limit_conn_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_stream_limit_conn_cleanup_t  *lccln = data;[m
[31m-[m
[31m-    ngx_slab_pool_t               *shpool;[m
[31m-    ngx_rbtree_node_t             *node;[m
[31m-    ngx_stream_limit_conn_ctx_t   *ctx;[m
[31m-    ngx_stream_limit_conn_node_t  *lc;[m
[31m-[m
[31m-    ctx = lccln->shm_zone->data;[m
[31m-    shpool = (ngx_slab_pool_t *) lccln->shm_zone->shm.addr;[m
[31m-    node = lccln->node;[m
[31m-    lc = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_STREAM, lccln->shm_zone->shm.log, 0,[m
[31m-                   "limit conn cleanup: %08Xi %d", node->key, lc->conn);[m
[31m-[m
[31m-    lc->conn--;[m
[31m-[m
[31m-    if (lc->conn == 0) {[m
[31m-        ngx_rbtree_delete(ctx->rbtree, node);[m
[31m-        ngx_slab_free_locked(shpool, node);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    cln = pool->cleanup;[m
[31m-[m
[31m-    while (cln && cln->handler == ngx_stream_limit_conn_cleanup) {[m
[31m-        ngx_stream_limit_conn_cleanup(cln->data);[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    pool->cleanup = cln;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_stream_limit_conn_ctx_t  *octx = data;[m
[31m-[m
[31m-    size_t                        len;[m
[31m-    ngx_slab_pool_t              *shpool;[m
[31m-    ngx_rbtree_node_t            *sentinel;[m
[31m-    ngx_stream_limit_conn_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    if (octx) {[m
[31m-        ctx->rbtree = octx->rbtree;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        ctx->rbtree = shpool->data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rbtree = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_t));[m
[31m-    if (ctx->rbtree == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shpool->data = ctx->rbtree;[m
[31m-[m
[31m-    sentinel = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_node_t));[m
[31m-    if (sentinel == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(ctx->rbtree, sentinel,[m
[31m-                    ngx_stream_limit_conn_rbtree_insert_value);[m
[31m-[m
[31m-    len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in limit_conn_zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_limit_conn_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_limit_conn_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->limits.elts = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->log_level = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_limit_conn_conf_t *prev = parent;[m
[31m-    ngx_stream_limit_conn_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->limits.elts == NULL) {[m
[31m-        conf->limits = prev->limits;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    ssize_t                       size;[m
[31m-    ngx_str_t                    *value, name, s;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_shm_zone_t               *shm_zone;[m
[31m-    ngx_stream_limit_conn_ctx_t  *ctx;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    name.len = 0;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {[m
[31m-[m
[31m-            name.data = value[i].data + 5;[m
[31m-[m
[31m-            p = (u_char *) ngx_strchr(name.data, ':');[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            name.len = p - name.data;[m
[31m-[m
[31m-            s.data = p + 1;[m
[31m-            s.len = value[i].data + value[i].len - s.data;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "zone \"%V\" is too small", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &name, size,[m
[31m-                                     &ngx_stream_limit_conn_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone->data) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "%V \"%V\" is already bound to key "[m
[31m-                           "\"$binary_remote_addr\"",[m
[31m-                           &cmd->name, &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "$binary_remote_addr") != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unsupported key \"%V\", use "[m
[31m-                           "$binary_remote_addr", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone->init = ngx_stream_limit_conn_init_zone;[m
[31m-    shm_zone->data = ctx;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_shm_zone_t                 *shm_zone;[m
[31m-    ngx_stream_limit_conn_conf_t   *lccf = conf;[m
[31m-    ngx_stream_limit_conn_limit_t  *limit, *limits;[m
[31m-[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                     &ngx_stream_limit_conn_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limits = lccf->limits.elts;[m
[31m-[m
[31m-    if (limits == NULL) {[m
[31m-        if (ngx_array_init(&lccf->limits, cf->pool, 1,[m
[31m-                           sizeof(ngx_stream_limit_conn_limit_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < lccf->limits.nelts; i++) {[m
[31m-        if (shm_zone == limits[i].shm_zone) {[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(value[2].data, value[2].len);[m
[31m-    if (n <= 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number of connections \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 65535) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "connection limit must be less 65536");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit = ngx_array_push(&lccf->limits);[m
[31m-    if (limit == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit->conn = n;[m
[31m-    limit->shm_zone = shm_zone;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_limit_conn_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);[m
[31m-[m
[31m-    cmcf->limit_conn_handler = ngx_stream_limit_conn_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_proxy_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_proxy_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6c535fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_proxy_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1674 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_msec_t                       connect_timeout;[m
[31m-    ngx_msec_t                       timeout;[m
[31m-    ngx_msec_t                       next_upstream_timeout;[m
[31m-    size_t                           buffer_size;[m
[31m-    size_t                           upload_rate;[m
[31m-    size_t                           download_rate;[m
[31m-    ngx_uint_t                       responses;[m
[31m-    ngx_uint_t                       next_upstream_tries;[m
[31m-    ngx_flag_t                       next_upstream;[m
[31m-    ngx_flag_t                       proxy_protocol;[m
[31m-    ngx_addr_t                      *local;[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    ngx_flag_t                       ssl_enable;[m
[31m-    ngx_flag_t                       ssl_session_reuse;[m
[31m-    ngx_uint_t                       ssl_protocols;[m
[31m-    ngx_str_t                        ssl_ciphers;[m
[31m-    ngx_str_t                        ssl_name;[m
[31m-    ngx_flag_t                       ssl_server_name;[m
[31m-[m
[31m-    ngx_flag_t                       ssl_verify;[m
[31m-    ngx_uint_t                       ssl_verify_depth;[m
[31m-    ngx_str_t                        ssl_trusted_certificate;[m
[31m-    ngx_str_t                        ssl_crl;[m
[31m-    ngx_str_t                        ssl_certificate;[m
[31m-    ngx_str_t                        ssl_certificate_key;[m
[31m-    ngx_array_t                     *ssl_passwords;[m
[31m-[m
[31m-    ngx_ssl_t                       *ssl;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_stream_upstream_srv_conf_t  *upstream;[m
[31m-} ngx_stream_proxy_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_stream_proxy_handler(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_connect(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_init_upstream(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_upstream_handler(ngx_event_t *ev);[m
[31m-static void ngx_stream_proxy_downstream_handler(ngx_event_t *ev);[m
[31m-static void ngx_stream_proxy_process_connection(ngx_event_t *ev,[m
[31m-    ngx_uint_t from_upstream);[m
[31m-static void ngx_stream_proxy_connect_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);[m
[31m-static void ngx_stream_proxy_process(ngx_stream_session_t *s,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write);[m
[31m-static void ngx_stream_proxy_next_upstream(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_int_t rc);[m
[31m-static u_char *ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf,[m
[31m-    size_t len);[m
[31m-[m
[31m-static void *ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static char *ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static void ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc);[m
[31m-static ngx_int_t ngx_stream_proxy_ssl_name(ngx_stream_session_t *s);[m
[31m-static ngx_int_t ngx_stream_proxy_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_stream_proxy_srv_conf_t *pscf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_stream_proxy_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_deprecated_t  ngx_conf_deprecated_proxy_downstream_buffer = {[m
[31m-    ngx_conf_deprecated, "proxy_downstream_buffer", "proxy_buffer_size"[m
[31m-};[m
[31m-[m
[31m-static ngx_conf_deprecated_t  ngx_conf_deprecated_proxy_upstream_buffer = {[m
[31m-    ngx_conf_deprecated, "proxy_upstream_buffer", "proxy_buffer_size"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_proxy_commands[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_pass"),[m
[31m-      NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_proxy_pass,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_bind"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_proxy_bind,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_connect_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffer_size"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_downstream_buffer"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),[m
[31m-      &ngx_conf_deprecated_proxy_downstream_buffer },[m
[31m-[m
[31m-    { ngx_string("proxy_upstream_buffer"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),[m
[31m-      &ngx_conf_deprecated_proxy_upstream_buffer },[m
[31m-[m
[31m-    { ngx_string("proxy_upload_rate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, upload_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_download_rate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, download_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_responses"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, responses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, next_upstream),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_tries"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_protocol"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, proxy_protocol),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-    { ngx_string("proxy_ssl"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_session_reuse"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_session_reuse),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_protocols"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_protocols),[m
[31m-      &ngx_stream_proxy_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_ciphers"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_name"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_server_name"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify_depth"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_trusted_certificate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_crl"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate_key"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_password_file"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_proxy_ssl_password_file,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_proxy_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_proxy_create_srv_conf,      /* create server configuration */[m
[31m-    ngx_stream_proxy_merge_srv_conf        /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_proxy_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_proxy_module_ctx,          /* module context */[m
[31m-    ngx_stream_proxy_commands,             /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_handler(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    u_char                          *p;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_stream_upstream_t           *u;[m
[31m-    ngx_stream_proxy_srv_conf_t     *pscf;[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                   "proxy connection handler");[m
[31m-[m
[31m-    u = ngx_pcalloc(c->pool, sizeof(ngx_stream_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream = u;[m
[31m-[m
[31m-    s->log_handler = ngx_stream_proxy_log_error;[m
[31m-[m
[31m-    u->peer.log = c->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    u->peer.local = pscf->local;[m
[31m-    u->peer.type = c->type;[m
[31m-[m
[31m-    uscf = pscf->upstream;[m
[31m-[m
[31m-    if (uscf->peer.init(s, uscf) != NGX_OK) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (pscf->next_upstream_tries[m
[31m-        && u->peer.tries > pscf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = pscf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    u->proxy_protocol = pscf->proxy_protocol;[m
[31m-    u->start_sec = ngx_time();[m
[31m-[m
[31m-    c->write->handler = ngx_stream_proxy_downstream_handler;[m
[31m-    c->read->handler = ngx_stream_proxy_downstream_handler;[m
[31m-[m
[31m-    if (c->type == SOCK_DGRAM) {[m
[31m-        ngx_stream_proxy_connect(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(c->pool, pscf->buffer_size);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->downstream_buf.start = p;[m
[31m-    u->downstream_buf.end = p + pscf->buffer_size;[m
[31m-    u->downstream_buf.pos = p;[m
[31m-    u->downstream_buf.last = p;[m
[31m-[m
[31m-    if (u->proxy_protocol[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        && pscf->ssl == NULL[m
[31m-#endif[m
[31m-        && pscf->buffer_size >= NGX_PROXY_PROTOCOL_MAX_HEADER)[m
[31m-    {[m
[31m-        /* optimization for a typical case */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                       "stream proxy send PROXY protocol header");[m
[31m-[m
[31m-        p = ngx_proxy_protocol_write(c, u->downstream_buf.last,[m
[31m-                                     u->downstream_buf.end);[m
[31m-        if (p == NULL) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->downstream_buf.last = p;[m
[31m-        u->proxy_protocol = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        ngx_post_event(c->read, &ngx_posted_events);[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_connect(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_connect(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_connection_t             *c, *pc;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    c->log->action = "connecting to upstream";[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&u->peer);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "proxy connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0, "no live upstreams");[m
[31m-        ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_stream_proxy_next_upstream(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    pc->data = s;[m
[31m-    pc->log = c->log;[m
[31m-    pc->pool = c->pool;[m
[31m-    pc->read->log = c->log;[m
[31m-    pc->write->log = c->log;[m
[31m-[m
[31m-    if (rc != NGX_AGAIN) {[m
[31m-        ngx_stream_proxy_init_upstream(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    pc->read->handler = ngx_stream_proxy_connect_handler;[m
[31m-    pc->write->handler = ngx_stream_proxy_connect_handler;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    ngx_add_timer(pc->write, pscf->connect_timeout);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_init_upstream(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    int                           tcp_nodelay;[m
[31m-    u_char                       *p;[m
[31m-    ngx_connection_t             *c, *pc;[m
[31m-    ngx_log_handler_pt            handler;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_core_srv_conf_t   *cscf;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);[m
[31m-[m
[31m-    if (pc->type == SOCK_STREAM[m
[31m-        && cscf->tcp_nodelay[m
[31m-        && pc->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (setsockopt(pc->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-        {[m
[31m-            ngx_connection_error(pc, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-            ngx_stream_proxy_next_upstream(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        pc->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-    if (u->proxy_protocol) {[m
[31m-        if (ngx_stream_proxy_send_proxy_protocol(s) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->proxy_protocol = 0;[m
[31m-    }[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    if (pc->type == SOCK_STREAM && pscf->ssl && pc->ssl == NULL) {[m
[31m-        ngx_stream_proxy_ssl_init_connection(s);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    if (c->log->log_level >= NGX_LOG_INFO) {[m
[31m-        ngx_str_t  str;[m
[31m-        u_char     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-        str.len = NGX_SOCKADDR_STRLEN;[m
[31m-        str.data = addr;[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(pc, &str, 1) == NGX_OK) {[m
[31m-            handler = c->log->handler;[m
[31m-            c->log->handler = NULL;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "%sproxy %V connected to %V",[m
[31m-                          pc->type == SOCK_DGRAM ? "udp " : "",[m
[31m-                          &str, u->peer.name);[m
[31m-[m
[31m-            c->log->handler = handler;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "proxying connection";[m
[31m-[m
[31m-    if (u->upstream_buf.start == NULL) {[m
[31m-        p = ngx_pnalloc(c->pool, pscf->buffer_size);[m
[31m-        if (p == NULL) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->upstream_buf.start = p;[m
[31m-        u->upstream_buf.end = p + pscf->buffer_size;[m
[31m-        u->upstream_buf.pos = p;[m
[31m-        u->upstream_buf.last = p;[m
[31m-    }[m
[31m-[m
[31m-    if (c->type == SOCK_DGRAM) {[m
[31m-        s->received = c->buffer->last - c->buffer->pos;[m
[31m-        u->downstream_buf = *c->buffer;[m
[31m-[m
[31m-        if (pscf->responses == 0) {[m
[31m-            pc->read->ready = 0;[m
[31m-            pc->read->eof = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->connected = 1;[m
[31m-[m
[31m-    pc->read->handler = ngx_stream_proxy_upstream_handler;[m
[31m-    pc->write->handler = ngx_stream_proxy_upstream_handler;[m
[31m-[m
[31m-    if (pc->read->ready || pc->read->eof) {[m
[31m-        ngx_post_event(pc->read, &ngx_posted_events);[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_process(s, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    ssize_t                       n, size;[m
[31m-    ngx_connection_t             *c, *pc;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-    u_char                        buf[NGX_PROXY_PROTOCOL_MAX_HEADER];[m
[31m-[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                   "stream proxy send PROXY protocol header");[m
[31m-[m
[31m-    p = ngx_proxy_protocol_write(c, buf, buf + NGX_PROXY_PROTOCOL_MAX_HEADER);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    size = p - buf;[m
[31m-[m
[31m-    n = pc->send(pc, buf, size);[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_write_event(pc->write, 0) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-        ngx_add_timer(pc->write, pscf->timeout);[m
[31m-[m
[31m-        pc->write->handler = ngx_stream_proxy_connect_handler;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n != size) {[m
[31m-[m
[31m-        /*[m
[31m-         * PROXY protocol specification:[m
[31m-         * The sender must always ensure that the header[m
[31m-         * is sent at once, so that the transport layer[m
[31m-         * maintains atomicity along the path to the receiver.[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "could not send PROXY protocol header at once");[m
[31m-[m
[31m-        ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t *pscf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (pscf->ssl_passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    pscf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (pscf->ssl_passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_connection_t             *pc;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(pscf->ssl, pc, NGX_SSL_BUFFER|NGX_SSL_CLIENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (pscf->ssl_server_name || pscf->ssl_verify) {[m
[31m-        if (ngx_stream_proxy_ssl_name(s) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pscf->ssl_session_reuse) {[m
[31m-        if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->connection->log->action = "SSL handshaking to upstream";[m
[31m-[m
[31m-    rc = ngx_ssl_handshake(pc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!pc->write->timer_set) {[m
[31m-            ngx_add_timer(pc->write, pscf->connect_timeout);[m
[31m-        }[m
[31m-[m
[31m-        pc->ssl->handler = ngx_stream_proxy_ssl_handshake;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_ssl_handshake(pc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc)[m
[31m-{[m
[31m-    long                          rc;[m
[31m-    ngx_stream_session_t         *s;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    s = pc->data;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    if (pc->ssl->handshaked) {[m
[31m-[m
[31m-        if (pscf->ssl_verify) {[m
[31m-            rc = SSL_get_verify_result(pc->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                              "upstream SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            u = s->upstream;[m
[31m-[m
[31m-            if (ngx_ssl_check_host(pc, &u->ssl_name) != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                              "upstream SSL certificate does not match \"%V\"",[m
[31m-                              &u->ssl_name);[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (pscf->ssl_session_reuse) {[m
[31m-            u = s->upstream;[m
[31m-            u->peer.save_session(&u->peer, u->peer.data);[m
[31m-        }[m
[31m-[m
[31m-        if (pc->write->timer_set) {[m
[31m-            ngx_del_timer(pc->write);[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_proxy_init_upstream(s);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_stream_proxy_next_upstream(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_proxy_ssl_name(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    u_char                       *p, *last;[m
[31m-    ngx_str_t                     name;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    name = pscf->ssl_name;[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        name = pscf->upstream->host;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * ssl name here may contain port, strip it for compatibility[m
[31m-     * with the http module[m
[31m-     */[m
[31m-[m
[31m-    p = name.data;[m
[31m-    last = name.data + name.len;[m
[31m-[m
[31m-    if (*p == '[') {[m
[31m-        p = ngx_strlchr(p, last, ']');[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            p = name.data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlchr(p, last, ':');[m
[31m-[m
[31m-    if (p != NULL) {[m
[31m-        name.len = p - name.data;[m
[31m-    }[m
[31m-[m
[31m-    if (!pscf->ssl_server_name) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */[m
[31m-[m
[31m-    if (name.len == 0 || *name.data == '[') {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_set_tlsext_host_name() needs a null-terminated string,[m
[31m-     * hence we explicitly null-terminate name here[m
[31m-     */[m
[31m-[m
[31m-    p = ngx_pnalloc(s->connection->pool, name.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(p, name.data, name.len + 1);[m
[31m-[m
[31m-    name.data = p;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "upstream SSL server name: \"%s\"", name.data);[m
[31m-[m
[31m-    if (SSL_set_tlsext_host_name(u->peer.connection->ssl->connection, name.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                      "SSL_set_tlsext_host_name(\"%s\") failed", name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    u->ssl_name = name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_downstream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_stream_proxy_process_connection(ev, ev->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_upstream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_stream_proxy_process_connection(ev, !ev->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_process_connection(ngx_event_t *ev, ngx_uint_t from_upstream)[m
[31m-{[m
[31m-    ngx_connection_t             *c, *pc;[m
[31m-    ngx_stream_session_t         *s;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    s = c->data;[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    c = s->connection;[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ev->timedout = 0;[m
[31m-[m
[31m-        if (ev->delayed) {[m
[31m-            ev->delayed = 0;[m
[31m-[m
[31m-            if (!ev->ready) {[m
[31m-                if (ngx_handle_read_event(ev, 0) != NGX_OK) {[m
[31m-                    ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (u->connected && !c->read->delayed && !pc->read->delayed) {[m
[31m-                    ngx_add_timer(c->write, pscf->timeout);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (s->connection->type == SOCK_DGRAM) {[m
[31m-                if (pscf->responses == NGX_MAX_INT32_VALUE) {[m
[31m-[m
[31m-                    /*[m
[31m-                     * successfully terminate timed out UDP session[m
[31m-                     * with unspecified number of responses[m
[31m-                     */[m
[31m-[m
[31m-                    pc->read->ready = 0;[m
[31m-                    pc->read->eof = 1;[m
[31m-[m
[31m-                    ngx_stream_proxy_process(s, 1, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (u->received == 0) {[m
[31m-                    ngx_stream_proxy_next_upstream(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "connection timed out");[m
[31m-            ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ev->delayed) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                       "stream connection delayed");[m
[31m-[m
[31m-        if (ngx_handle_read_event(ev, 0) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (from_upstream && !u->connected) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_process(s, from_upstream, ev->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_connect_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t      *c;[m
[31m-    ngx_stream_session_t  *s;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_stream_proxy_next_upstream(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_del_timer(c->write);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                   "stream proxy connect upstream");[m
[31m-[m
[31m-    if (ngx_stream_proxy_test_connect(c) != NGX_OK) {[m
[31m-        ngx_stream_proxy_next_upstream(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_init_upstream(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_proxy_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        err = c->write->kq_errno ? c->write->kq_errno : c->read->kq_errno;[m
[31m-[m
[31m-        if (err) {[m
[31m-            (void) ngx_connection_error(c, err,[m
[31m-                                    "kevent() reported that connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    off_t                        *received, limit;[m
[31m-    size_t                        size, limit_rate;[m
[31m-    ssize_t                       n;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_uint_t                    flags;[m
[31m-    ngx_msec_t                    delay;[m
[31m-    ngx_connection_t             *c, *pc, *src, *dst;[m
[31m-    ngx_log_handler_pt            handler;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    c = s->connection;[m
[31m-    pc = u->connected ? u->peer.connection : NULL;[m
[31m-[m
[31m-    if (c->type == SOCK_DGRAM && (ngx_terminate || ngx_exiting)) {[m
[31m-[m
[31m-        /* socket is already closed on worker shutdown */[m
[31m-[m
[31m-        handler = c->log->handler;[m
[31m-        c->log->handler = NULL;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "disconnected on shutdown");[m
[31m-[m
[31m-        c->log->handler = handler;[m
[31m-[m
[31m-        ngx_stream_proxy_finalize(s, NGX_OK);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    if (from_upstream) {[m
[31m-        src = pc;[m
[31m-        dst = c;[m
[31m-        b = &u->upstream_buf;[m
[31m-        limit_rate = pscf->download_rate;[m
[31m-        received = &u->received;[m
[31m-[m
[31m-    } else {[m
[31m-        src = c;[m
[31m-        dst = pc;[m
[31m-        b = &u->downstream_buf;[m
[31m-        limit_rate = pscf->upload_rate;[m
[31m-        received = &s->received;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            size = b->last - b->pos;[m
[31m-[m
[31m-            if (size && dst && dst->write->ready) {[m
[31m-[m
[31m-                n = dst->send(dst, b->pos, size);[m
[31m-[m
[31m-                if (n == NGX_AGAIN && dst->shared) {[m
[31m-                    /* cannot wait on a shared socket */[m
[31m-                    n = NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    if (c->type == SOCK_DGRAM && !from_upstream) {[m
[31m-                        ngx_stream_proxy_next_upstream(s);[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (n > 0) {[m
[31m-                    b->pos += n;[m
[31m-[m
[31m-                    if (b->pos == b->last) {[m
[31m-                        b->pos = b->start;[m
[31m-                        b->last = b->start;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && src->read->ready && !src->read->delayed) {[m
[31m-[m
[31m-            if (limit_rate) {[m
[31m-                limit = (off_t) limit_rate * (ngx_time() - u->start_sec + 1)[m
[31m-                        - *received;[m
[31m-[m
[31m-                if (limit <= 0) {[m
[31m-                    src->read->delayed = 1;[m
[31m-                    delay = (ngx_msec_t) (- limit * 1000 / limit_rate + 1);[m
[31m-                    ngx_add_timer(src->read, delay);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if ((off_t) size > limit) {[m
[31m-                    size = (size_t) limit;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            n = src->recv(src, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                if (limit_rate) {[m
[31m-                    delay = (ngx_msec_t) (n * 1000 / limit_rate);[m
[31m-[m
[31m-                    if (delay > 0) {[m
[31m-                        src->read->delayed = 1;[m
[31m-                        ngx_add_timer(src->read, delay);[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (c->type == SOCK_DGRAM && ++u->responses == pscf->responses)[m
[31m-                {[m
[31m-                    src->read->ready = 0;[m
[31m-                    src->read->eof = 1;[m
[31m-                }[m
[31m-[m
[31m-                *received += n;[m
[31m-                b->last += n;[m
[31m-                do_write = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                if (c->type == SOCK_DGRAM && u->received == 0) {[m
[31m-                    ngx_stream_proxy_next_upstream(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                src->read->eof = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (src->read->eof && (b->pos == b->last || (dst && dst->read->eof))) {[m
[31m-        handler = c->log->handler;[m
[31m-        c->log->handler = NULL;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "%s%s disconnected"[m
[31m-                      ", bytes from/to client:%O/%O"[m
[31m-                      ", bytes from/to upstream:%O/%O",[m
[31m-                      src->type == SOCK_DGRAM ? "udp " : "",[m
[31m-                      from_upstream ? "upstream" : "client",[m
[31m-                      s->received, c->sent, u->received, pc ? pc->sent : 0);[m
[31m-[m
[31m-        c->log->handler = handler;[m
[31m-[m
[31m-        ngx_stream_proxy_finalize(s, NGX_OK);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    flags = src->read->eof ? NGX_CLOSE_EVENT : 0;[m
[31m-[m
[31m-    if (!src->shared && ngx_handle_read_event(src->read, flags) != NGX_OK) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (dst) {[m
[31m-        if (!dst->shared && ngx_handle_write_event(dst->write, 0) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!c->read->delayed && !pc->read->delayed) {[m
[31m-            ngx_add_timer(c->write, pscf->timeout);[m
[31m-[m
[31m-        } else if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_next_upstream(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    ngx_msec_t                    timeout;[m
[31m-    ngx_connection_t             *pc;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "stream proxy next upstream");[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    if (u->peer.sockaddr) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, NGX_PEER_FAILED);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    timeout = pscf->next_upstream_timeout;[m
[31m-[m
[31m-    if (u->peer.tries == 0[m
[31m-        || !pscf->next_upstream[m
[31m-        || (timeout && ngx_current_msec - u->peer.start_time >= timeout))[m
[31m-    {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    if (pc) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "close proxy upstream connection: %d", pc->fd);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        if (pc->ssl) {[m
[31m-            pc->ssl->no_wait_shutdown = 1;[m
[31m-            pc->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(pc);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_close_connection(pc);[m
[31m-        u->peer.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_connect(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t       *pc;[m
[31m-    ngx_stream_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "finalize stream proxy: %i", rc);[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        goto noupstream;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.free && u->peer.sockaddr) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    if (pc) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "close stream proxy upstream connection: %d", pc->fd);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        if (pc->ssl) {[m
[31m-            pc->ssl->no_wait_shutdown = 1;[m
[31m-            (void) ngx_ssl_shutdown(pc);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_close_connection(pc);[m
[31m-        u->peer.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-noupstream:[m
[31m-[m
[31m-    ngx_stream_close_connection(s->connection);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    ngx_connection_t       *pc;[m
[31m-    ngx_stream_session_t   *s;[m
[31m-    ngx_stream_upstream_t  *u;[m
[31m-[m
[31m-    s = log->data;[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    p = buf;[m
[31m-[m
[31m-    if (u->peer.name) {[m
[31m-        p = ngx_snprintf(p, len, ", upstream: \"%V\"", u->peer.name);[m
[31m-        len -= p - buf;[m
[31m-    }[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    p = ngx_snprintf(p, len,[m
[31m-                     ", bytes from/to client:%O/%O"[m
[31m-                     ", bytes from/to upstream:%O/%O",[m
[31m-                     s->received, s->connection->sent,[m
[31m-                     u->received, pc ? pc->sent : 0);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_proxy_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->ssl_protocols = 0;[m
[31m-     *     conf->ssl_ciphers = { 0, NULL };[m
[31m-     *     conf->ssl_name = { 0, NULL };[m
[31m-     *     conf->ssl_trusted_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_crl = { 0, NULL };[m
[31m-     *     conf->ssl_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_certificate_key = { 0, NULL };[m
[31m-     *[m
[31m-     *     conf->ssl = NULL;[m
[31m-     *     conf->upstream = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upload_rate = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->download_rate = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->responses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->next_upstream = NGX_CONF_UNSET;[m
[31m-    conf->proxy_protocol = NGX_CONF_UNSET;[m
[31m-    conf->local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    conf->ssl_enable = NGX_CONF_UNSET;[m
[31m-    conf->ssl_session_reuse = NGX_CONF_UNSET;[m
[31m-    conf->ssl_server_name = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->ssl_passwords = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t *prev = parent;[m
[31m-    ngx_stream_proxy_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->connect_timeout,[m
[31m-                              prev->connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->timeout,[m
[31m-                              prev->timeout, 10 * 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->next_upstream_timeout,[m
[31m-                              prev->next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size,[m
[31m-                              prev->buffer_size, 16384);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upload_rate,[m
[31m-                              prev->upload_rate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->download_rate,[m
[31m-                              prev->download_rate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->responses,[m
[31m-                              prev->responses, NGX_MAX_INT32_VALUE);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->next_upstream_tries,[m
[31m-                              prev->next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->next_upstream, prev->next_upstream, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->proxy_protocol, prev->proxy_protocol, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->local, prev->local, NULL);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ssl_enable, prev->ssl_enable, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ssl_session_reuse,[m
[31m-                              prev->ssl_session_reuse, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                              (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                               |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers, "DEFAULT");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_name, prev->ssl_name, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ssl_server_name, prev->ssl_server_name, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ssl_verify, prev->ssl_verify, 0);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                              prev->ssl_trusted_certificate, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate,[m
[31m-                              prev->ssl_certificate, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate_key,[m
[31m-                              prev->ssl_certificate_key, "");[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);[m
[31m-[m
[31m-    if (conf->ssl_enable && ngx_stream_proxy_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_proxy_set_ssl(ngx_conf_t *cf, ngx_stream_proxy_srv_conf_t *pscf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    pscf->ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (pscf->ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pscf->ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(pscf->ssl, pscf->ssl_protocols, NULL) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = pscf->ssl;[m
[31m-[m
[31m-    if (pscf->ssl_certificate.len) {[m
[31m-[m
[31m-        if (pscf->ssl_certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"proxy_ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &pscf->ssl_certificate);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_certificate(cf, pscf->ssl, &pscf->ssl_certificate,[m
[31m-                                &pscf->ssl_certificate_key, pscf->ssl_passwords)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(pscf->ssl->ctx,[m
[31m-                                (const char *) pscf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &pscf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pscf->ssl_verify) {[m
[31m-        if (pscf->ssl_trusted_certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no proxy_ssl_trusted_certificate for proxy_ssl_verify");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, pscf->ssl,[m
[31m-                                        &pscf->ssl_trusted_certificate,[m
[31m-                                        pscf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, pscf->ssl, &pscf->ssl_crl) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t *pscf = conf;[m
[31m-[m
[31m-    ngx_url_t                    u;[m
[31m-    ngx_str_t                   *value, *url;[m
[31m-    ngx_stream_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (pscf->upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module);[m
[31m-[m
[31m-    cscf->handler = ngx_stream_proxy_handler;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = *url;[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    pscf->upstream = ngx_stream_upstream_add(cf, &u, 0);[m
[31m-    if (pscf->upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t *pscf = conf;[m
[31m-[m
[31m-    ngx_int_t   rc;[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (pscf->local != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        pscf->local = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    pscf->local = ngx_palloc(cf->pool, sizeof(ngx_addr_t));[m
[31m-    if (pscf->local == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(cf->pool, pscf->local, value[1].data, value[1].len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        pscf->local->name = value[1];[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid address \"%V\"", &value[1]);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_ssl_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_ssl_module.c[m
[1mdeleted file mode 100644[m
[1mindex e12da1b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_ssl_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,460 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_DEFAULT_CIPHERS     "HIGH:!aNULL:!MD5"[m
[31m-#define NGX_DEFAULT_ECDH_CURVE  "prime256v1"[m
[31m-[m
[31m-[m
[31m-static void *ngx_stream_ssl_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_ssl_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-static char *ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_stream_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_ssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl_handshake_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, handshake_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_key"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_password_file"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_ssl_password_file,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_dhparam"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, dhparam),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_ecdh_curve"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, ecdh_curve),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_protocols"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, protocols),[m
[31m-      &ngx_stream_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("ssl_ciphers"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_prefer_server_ciphers"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, prefer_server_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_cache"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_stream_ssl_session_cache,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_tickets"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, session_tickets),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_ticket_key"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, session_ticket_keys),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, session_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_ssl_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_ssl_create_conf,            /* create server configuration */[m
[31m-    ngx_stream_ssl_merge_conf              /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_ssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_ssl_module_ctx,            /* module context */[m
[31m-    ngx_stream_ssl_commands,               /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_stream_ssl_sess_id_ctx = ngx_string("STREAM");[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_ssl_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_ssl_conf_t  *scf;[m
[31m-[m
[31m-    scf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_ssl_conf_t));[m
[31m-    if (scf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     scf->protocols = 0;[m
[31m-     *     scf->certificate = { 0, NULL };[m
[31m-     *     scf->certificate_key = { 0, NULL };[m
[31m-     *     scf->dhparam = { 0, NULL };[m
[31m-     *     scf->ecdh_curve = { 0, NULL };[m
[31m-     *     scf->ciphers = { 0, NULL };[m
[31m-     *     scf->shm_zone = NULL;[m
[31m-     */[m
[31m-[m
[31m-    scf->handshake_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    scf->passwords = NGX_CONF_UNSET_PTR;[m
[31m-    scf->prefer_server_ciphers = NGX_CONF_UNSET;[m
[31m-    scf->builtin_session_cache = NGX_CONF_UNSET;[m
[31m-    scf->session_timeout = NGX_CONF_UNSET;[m
[31m-    scf->session_tickets = NGX_CONF_UNSET;[m
[31m-    scf->session_ticket_keys = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return scf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_ssl_conf_t *prev = parent;[m
[31m-    ngx_stream_ssl_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->handshake_timeout,[m
[31m-                         prev->handshake_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_timeout,[m
[31m-                         prev->session_timeout, 300);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->prefer_server_ciphers,[m
[31m-                         prev->prefer_server_ciphers, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,[m
[31m-                         (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                          |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->certificate, prev->certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->certificate_key, prev->certificate_key, "");[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve,[m
[31m-                         NGX_DEFAULT_ECDH_CURVE);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);[m
[31m-[m
[31m-[m
[31m-    conf->ssl.log = cf->log;[m
[31m-[m
[31m-    if (conf->certificate.len == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->certificate_key.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no \"ssl_certificate_key\" is defined "[m
[31m-                      "for certificate \"%V\"",[m
[31m-                      &conf->certificate);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create(&conf->ssl, conf->protocols, NULL) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = &conf->ssl;[m
[31m-[m
[31m-    if (ngx_ssl_certificate(cf, &conf->ssl, &conf->certificate,[m
[31m-                            &conf->certificate_key, conf->passwords)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(conf->ssl.ctx,[m
[31m-                                (const char *) conf->ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &conf->ciphers);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->prefer_server_ciphers) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100001L && !defined LIBRESSL_VERSION_NUMBER)[m
[31m-    SSL_CTX_set_tmp_rsa_callback(conf->ssl.ctx, ngx_ssl_rsa512_key_callback);[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->builtin_session_cache,[m
[31m-                         prev->builtin_session_cache, NGX_SSL_NONE_SCACHE);[m
[31m-[m
[31m-    if (conf->shm_zone == NULL) {[m
[31m-        conf->shm_zone = prev->shm_zone;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_session_cache(&conf->ssl, &ngx_stream_ssl_sess_id_ctx,[m
[31m-                              conf->builtin_session_cache,[m
[31m-                              conf->shm_zone, conf->session_timeout)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_tickets,[m
[31m-                         prev->session_tickets, 1);[m
[31m-[m
[31m-#ifdef SSL_OP_NO_TICKET[m
[31m-    if (!conf->session_tickets) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->session_ticket_keys,[m
[31m-                         prev->session_ticket_keys, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (scf->passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    scf->passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (scf->passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    size_t       len;[m
[31m-    ngx_str_t   *value, name, size;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i, j;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_NO_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "none") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_NONE_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "builtin") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("builtin:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            n = ngx_atoi(value[i].data + sizeof("builtin:") - 1,[m
[31m-                         value[i].len - (sizeof("builtin:") - 1));[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            scf->builtin_session_cache = n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("shared:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            len = 0;[m
[31m-[m
[31m-            for (j = sizeof("shared:") - 1; j < value[i].len; j++) {[m
[31m-                if (value[i].data[j] == ':') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                len++;[m
[31m-            }[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            name.len = len;[m
[31m-            name.data = value[i].data + sizeof("shared:") - 1;[m
[31m-[m
[31m-            size.len = value[i].len - j - 1;[m
[31m-            size.data = name.data + len + 1;[m
[31m-[m
[31m-            n = ngx_parse_size(&size);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (n < (ngx_int_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "session cache \"%V\" is too small",[m
[31m-                                   &value[i]);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            scf->shm_zone = ngx_shared_memory_add(cf, &name, n,[m
[31m-                                                   &ngx_stream_ssl_module);[m
[31m-            if (scf->shm_zone == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            scf->shm_zone->init = ngx_ssl_session_cache_init;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->shm_zone && scf->builtin_session_cache == NGX_CONF_UNSET) {[m
[31m-        scf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid session cache \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_ssl_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_ssl_module.h[m
[1mdeleted file mode 100644[m
[1mindex 85e8b6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_ssl_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STREAM_SSL_H_INCLUDED_[m
[31m-#define _NGX_STREAM_SSL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_msec_t       handshake_timeout;[m
[31m-[m
[31m-    ngx_flag_t       prefer_server_ciphers;[m
[31m-[m
[31m-    ngx_ssl_t        ssl;[m
[31m-[m
[31m-    ngx_uint_t       protocols;[m
[31m-[m
[31m-    ssize_t          builtin_session_cache;[m
[31m-[m
[31m-    time_t           session_timeout;[m
[31m-[m
[31m-    ngx_str_t        certificate;[m
[31m-    ngx_str_t        certificate_key;[m
[31m-    ngx_str_t        dhparam;[m
[31m-    ngx_str_t        ecdh_curve;[m
[31m-[m
[31m-    ngx_str_t        ciphers;[m
[31m-[m
[31m-    ngx_array_t     *passwords;[m
[31m-[m
[31m-    ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-    ngx_flag_t       session_tickets;[m
[31m-    ngx_array_t     *session_ticket_keys;[m
[31m-} ngx_stream_ssl_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_stream_ssl_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STREAM_SSL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex 69dddc5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,464 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_stream_upstream(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static char *ngx_stream_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_stream_upstream_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_upstream_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_upstream_commands[] = {[m
[31m-[m
[31m-    { ngx_string("upstream"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_upstream,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_STREAM_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_stream_upstream_server,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_upstream_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_stream_upstream_create_main_conf,  /* create main configuration */[m
[31m-    ngx_stream_upstream_init_main_conf,    /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_upstream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_upstream_module_ctx,       /* module context */[m
[31m-    ngx_stream_upstream_commands,          /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                            *rv;[m
[31m-    void                            *mconf;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_url_t                        u;[m
[31m-    ngx_uint_t                       m;[m
[31m-    ngx_conf_t                       pcf;[m
[31m-    ngx_stream_module_t             *module;[m
[31m-    ngx_stream_conf_ctx_t           *ctx, *stream_ctx;[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    u.host = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-    u.no_port = 1;[m
[31m-[m
[31m-    uscf = ngx_stream_upstream_add(cf, &u, NGX_STREAM_UPSTREAM_CREATE[m
[31m-                                           |NGX_STREAM_UPSTREAM_WEIGHT[m
[31m-                                           |NGX_STREAM_UPSTREAM_MAX_FAILS[m
[31m-                                           |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT[m
[31m-                                           |NGX_STREAM_UPSTREAM_DOWN[m
[31m-                                           |NGX_STREAM_UPSTREAM_BACKUP);[m
[31m-    if (uscf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    stream_ctx = cf->ctx;[m
[31m-    ctx->main_conf = stream_ctx->main_conf;[m
[31m-[m
[31m-    /* the upstream{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool,[m
[31m-                                sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->srv_conf[ngx_stream_upstream_module.ctx_index] = uscf;[m
[31m-[m
[31m-    uscf->srv_conf = ctx->srv_conf;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    uscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                                     sizeof(ngx_stream_upstream_server_t));[m
[31m-    if (uscf->servers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside upstream{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_STREAM_UPS_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (uscf->servers->nelts == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no servers are inside upstream");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf = conf;[m
[31m-[m
[31m-    time_t                         fail_timeout;[m
[31m-    ngx_str_t                     *value, s;[m
[31m-    ngx_url_t                      u;[m
[31m-    ngx_int_t                      weight, max_fails;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_stream_upstream_server_t  *us;[m
[31m-[m
[31m-    us = ngx_array_push(uscf->servers);[m
[31m-    if (us == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(us, sizeof(ngx_stream_upstream_server_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    weight = 1;[m
[31m-    max_fails = 1;[m
[31m-    fail_timeout = 10;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_WEIGHT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            weight = ngx_atoi(&value[i].data[7], value[i].len - 7);[m
[31m-[m
[31m-            if (weight == NGX_ERROR || weight == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_MAX_FAILS)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);[m
[31m-[m
[31m-            if (max_fails == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_FAIL_TIMEOUT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 13;[m
[31m-            s.data = &value[i].data[13];[m
[31m-[m
[31m-            fail_timeout = ngx_parse_time(&s, 1);[m
[31m-[m
[31m-            if (fail_timeout == (time_t) NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "backup") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_BACKUP)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->backup = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "down") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_DOWN)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->down = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in upstream \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (u.no_port) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no port in upstream \"%V\"", &u.url);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->name = u.url;[m
[31m-    us->addrs = u.addrs;[m
[31m-    us->naddrs = u.naddrs;[m
[31m-    us->weight = weight;[m
[31m-    us->max_fails = max_fails;[m
[31m-    us->fail_timeout = fail_timeout;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid parameter \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-not_supported:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "balancing method does not support parameter \"%V\"",[m
[31m-                       &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_stream_upstream_srv_conf_t *[m
[31m-ngx_stream_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_uint_t                        i;[m
[31m-    ngx_stream_upstream_server_t     *us;[m
[31m-    ngx_stream_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_stream_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (!(flags & NGX_STREAM_UPSTREAM_CREATE)) {[m
[31m-[m
[31m-        if (ngx_parse_url(cf->pool, u) != NGX_OK) {[m
[31m-            if (u->err) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "%s in upstream \"%V\"", u->err, &u->url);[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    umcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != u->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_STREAM_UPSTREAM_CREATE)[m
[31m-             && (uscfp[i]->flags & NGX_STREAM_UPSTREAM_CREATE))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate upstream \"%V\"", &u->host);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((uscfp[i]->flags & NGX_STREAM_UPSTREAM_CREATE) && !u->no_port) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "upstream \"%V\" may not have port %d",[m
[31m-                               &u->host, u->port);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_STREAM_UPSTREAM_CREATE) && !uscfp[i]->no_port) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                          "upstream \"%V\" may not have port %d in %s:%ui",[m
[31m-                          &u->host, uscfp[i]->port,[m
[31m-                          uscfp[i]->file_name, uscfp[i]->line);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != u->port) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_STREAM_UPSTREAM_CREATE) {[m
[31m-            uscfp[i]->flags = flags;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_srv_conf_t));[m
[31m-    if (uscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = flags;[m
[31m-    uscf->host = u->host;[m
[31m-    uscf->file_name = cf->conf_file->file.name.data;[m
[31m-    uscf->line = cf->conf_file->line;[m
[31m-    uscf->port = u->port;[m
[31m-    uscf->no_port = u->no_port;[m
[31m-[m
[31m-    if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) {[m
[31m-        uscf->servers = ngx_array_create(cf->pool, 1,[m
[31m-                                         sizeof(ngx_stream_upstream_server_t));[m
[31m-        if (uscf->servers == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        us = ngx_array_push(uscf->servers);[m
[31m-        if (us == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(us, sizeof(ngx_stream_upstream_server_t));[m
[31m-[m
[31m-        us->addrs = u->addrs;[m
[31m-        us->naddrs = 1;[m
[31m-    }[m
[31m-[m
[31m-    uscfp = ngx_array_push(&umcf->upstreams);[m
[31m-    if (uscfp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *uscfp = uscf;[m
[31m-[m
[31m-    return uscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_upstream_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_main_conf_t));[m
[31m-    if (umcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&umcf->upstreams, cf->pool, 4,[m
[31m-                       sizeof(ngx_stream_upstream_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return umcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_stream_upstream_main_conf_t *umcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                        i;[m
[31m-    ngx_stream_upstream_init_pt       init;[m
[31m-    ngx_stream_upstream_srv_conf_t  **uscfp;[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        init = uscfp[i]->peer.init_upstream[m
[31m-                                         ? uscfp[i]->peer.init_upstream[m
[31m-                                         : ngx_stream_upstream_init_round_robin;[m
[31m-[m
[31m-        if (init(cf, uscfp[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex 1f4810c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,107 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STREAM_UPSTREAM_H_INCLUDED_[m
[31m-#define _NGX_STREAM_UPSTREAM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_STREAM_UPSTREAM_CREATE        0x0001[m
[31m-#define NGX_STREAM_UPSTREAM_WEIGHT        0x0002[m
[31m-#define NGX_STREAM_UPSTREAM_MAX_FAILS     0x0004[m
[31m-#define NGX_STREAM_UPSTREAM_FAIL_TIMEOUT  0x0008[m
[31m-#define NGX_STREAM_UPSTREAM_DOWN          0x0010[m
[31m-#define NGX_STREAM_UPSTREAM_BACKUP        0x0020[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                        upstreams;[m
[31m-                                           /* ngx_stream_upstream_srv_conf_t */[m
[31m-} ngx_stream_upstream_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_stream_upstream_srv_conf_s  ngx_stream_upstream_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_stream_upstream_init_pt)(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-typedef ngx_int_t (*ngx_stream_upstream_init_peer_pt)(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_upstream_init_pt        init_upstream;[m
[31m-    ngx_stream_upstream_init_peer_pt   init;[m
[31m-    void                              *data;[m
[31m-} ngx_stream_upstream_peer_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                          name;[m
[31m-    ngx_addr_t                        *addrs;[m
[31m-    ngx_uint_t                         naddrs;[m
[31m-    ngx_uint_t                         weight;[m
[31m-    ngx_uint_t                         max_fails;[m
[31m-    time_t                             fail_timeout;[m
[31m-[m
[31m-    unsigned                           down:1;[m
[31m-    unsigned                           backup:1;[m
[31m-} ngx_stream_upstream_server_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_stream_upstream_srv_conf_s {[m
[31m-    ngx_stream_upstream_peer_t         peer;[m
[31m-    void                             **srv_conf;[m
[31m-[m
[31m-    ngx_array_t                       *servers;[m
[31m-                                              /* ngx_stream_upstream_server_t */[m
[31m-[m
[31m-    ngx_uint_t                         flags;[m
[31m-    ngx_str_t                          host;[m
[31m-    u_char                            *file_name;[m
[31m-    ngx_uint_t                         line;[m
[31m-    in_port_t                          port;[m
[31m-    ngx_uint_t                         no_port;  /* unsigned no_port:1 */[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    ngx_shm_zone_t                    *shm_zone;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_peer_connection_t              peer;[m
[31m-    ngx_buf_t                          downstream_buf;[m
[31m-    ngx_buf_t                          upstream_buf;[m
[31m-    off_t                              received;[m
[31m-    time_t                             start_sec;[m
[31m-    ngx_uint_t                         responses;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    ngx_str_t                          ssl_name;[m
[31m-#endif[m
[31m-    unsigned                           connected:1;[m
[31m-    unsigned                           proxy_protocol:1;[m
[31m-} ngx_stream_upstream_t;[m
[31m-[m
[31m-[m
[31m-ngx_stream_upstream_srv_conf_t *ngx_stream_upstream_add(ngx_conf_t *cf,[m
[31m-    ngx_url_t *u, ngx_uint_t flags);[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_conf_upstream_srv_conf(uscf, module)                       \[m
[31m-    uscf->srv_conf[module.ctx_index][m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_stream_upstream_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STREAM_UPSTREAM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_hash_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_hash_module.c[m
[1mdeleted file mode 100644[m
[1mindex 56ff7d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_hash_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,656 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t                              hash;[m
[31m-    ngx_str_t                            *server;[m
[31m-} ngx_stream_upstream_chash_point_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                            number;[m
[31m-    ngx_stream_upstream_chash_point_t     point[1];[m
[31m-} ngx_stream_upstream_chash_points_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_upstream_chash_points_t   *points;[m
[31m-} ngx_stream_upstream_hash_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* the round robin data must be first */[m
[31m-    ngx_stream_upstream_rr_peer_data_t    rrp;[m
[31m-    ngx_stream_upstream_hash_srv_conf_t  *conf;[m
[31m-    ngx_str_t                             key;[m
[31m-    ngx_uint_t                            tries;[m
[31m-    ngx_uint_t                            rehash;[m
[31m-    uint32_t                              hash;[m
[31m-    ngx_event_get_peer_pt                 get_rr_peer;[m
[31m-} ngx_stream_upstream_hash_peer_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_stream_upstream_init_hash(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_stream_upstream_init_hash_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_stream_upstream_get_hash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_stream_upstream_init_chash(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-static int ngx_libc_cdecl[m
[31m-    ngx_stream_upstream_chash_cmp_points(const void *one, const void *two);[m
[31m-static ngx_uint_t ngx_stream_upstream_find_chash_point([m
[31m-    ngx_stream_upstream_chash_points_t *points, uint32_t hash);[m
[31m-static ngx_int_t ngx_stream_upstream_init_chash_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_stream_upstream_get_chash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-static void *ngx_stream_upstream_hash_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_upstream_hash_commands[] = {[m
[31m-[m
[31m-    { ngx_string("hash"),[m
[31m-      NGX_STREAM_UPS_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_stream_upstream_hash,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_upstream_hash_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_upstream_hash_create_conf,  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_upstream_hash_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_upstream_hash_module_ctx,  /* module context */[m
[31m-    ngx_stream_upstream_hash_commands,     /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_hash(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_stream_upstream_init_hash_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_hash_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_stream_upstream_hash_srv_conf_t   *hcf;[m
[31m-    ngx_stream_upstream_hash_peer_data_t  *hp;[m
[31m-[m
[31m-    hp = ngx_palloc(s->connection->pool,[m
[31m-                    sizeof(ngx_stream_upstream_hash_peer_data_t));[m
[31m-    if (hp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.data = &hp->rrp;[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_round_robin_peer(s, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.get = ngx_stream_upstream_get_hash_peer;[m
[31m-[m
[31m-    hcf = ngx_stream_conf_upstream_srv_conf(us,[m
[31m-                                            ngx_stream_upstream_hash_module);[m
[31m-[m
[31m-    hp->key = s->connection->addr_text;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "upstream hash key:\"%V\"", &hp->key);[m
[31m-[m
[31m-    hp->conf = hcf;[m
[31m-    hp->tries = 0;[m
[31m-    hp->rehash = 0;[m
[31m-    hp->hash = 0;[m
[31m-    hp->get_rr_peer = ngx_stream_upstream_get_round_robin_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_hash_peer_data_t *hp = data;[m
[31m-[m
[31m-    time_t                          now;[m
[31m-    u_char                          buf[NGX_INT_T_LEN];[m
[31m-    size_t                          size;[m
[31m-    uint32_t                        hash;[m
[31m-    ngx_int_t                       w;[m
[31m-    uintptr_t                       m;[m
[31m-    ngx_uint_t                      n, p;[m
[31m-    ngx_stream_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "get hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_wlock(hp->rrp.peers);[m
[31m-[m
[31m-    if (hp->tries > 20 || hp->rrp.peers->single) {[m
[31m-        ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-        return hp->get_rr_peer(pc, &hp->rrp);[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /*[m
[31m-         * Hash expression is compatible with Cache::Memcached:[m
[31m-         * ((crc32([REHASH] KEY) >> 16) & 0x7fff) + PREV_HASH[m
[31m-         * with REHASH omitted at the first iteration.[m
[31m-         */[m
[31m-[m
[31m-        ngx_crc32_init(hash);[m
[31m-[m
[31m-        if (hp->rehash > 0) {[m
[31m-            size = ngx_sprintf(buf, "%ui", hp->rehash) - buf;[m
[31m-            ngx_crc32_update(&hash, buf, size);[m
[31m-        }[m
[31m-[m
[31m-        ngx_crc32_update(&hash, hp->key.data, hp->key.len);[m
[31m-        ngx_crc32_final(hash);[m
[31m-[m
[31m-        hash = (hash >> 16) & 0x7fff;[m
[31m-[m
[31m-        hp->hash += hash;[m
[31m-        hp->rehash++;[m
[31m-[m
[31m-        w = hp->hash % hp->rrp.peers->total_weight;[m
[31m-        peer = hp->rrp.peers->peer;[m
[31m-        p = 0;[m
[31m-[m
[31m-        while (w >= peer->weight) {[m
[31m-            w -= peer->weight;[m
[31m-            peer = peer->next;[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        n = p / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (hp->rrp.tried[n] & m) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get hash peer, value:%uD, peer:%ui", hp->hash, p);[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        if (++hp->tries > 20) {[m
[31m-            ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-            return hp->get_rr_peer(pc, &hp->rrp);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hp->rrp.current = peer;[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    if (now - peer->checked > peer->fail_timeout) {[m
[31m-        peer->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    hp->rrp.tried[n] |= m;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_chash(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    u_char                               *host, *port, c;[m
[31m-    size_t                                host_len, port_len, size;[m
[31m-    uint32_t                              hash, base_hash;[m
[31m-    ngx_str_t                            *server;[m
[31m-    ngx_uint_t                            npoints, i, j;[m
[31m-    ngx_stream_upstream_rr_peer_t        *peer;[m
[31m-    ngx_stream_upstream_rr_peers_t       *peers;[m
[31m-    ngx_stream_upstream_chash_points_t   *points;[m
[31m-    ngx_stream_upstream_hash_srv_conf_t  *hcf;[m
[31m-    union {[m
[31m-        uint32_t                          value;[m
[31m-        u_char                            byte[4];[m
[31m-    } prev_hash;[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_stream_upstream_init_chash_peer;[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-    npoints = peers->total_weight * 160;[m
[31m-[m
[31m-    size = sizeof(ngx_stream_upstream_chash_points_t)[m
[31m-           + sizeof(ngx_stream_upstream_chash_point_t) * (npoints - 1);[m
[31m-[m
[31m-    points = ngx_palloc(cf->pool, size);[m
[31m-    if (points == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    points->number = 0;[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        server = &peer->server;[m
[31m-[m
[31m-        /*[m
[31m-         * Hash expression is compatible with Cache::Memcached::Fast:[m
[31m-         * crc32(HOST \0 PORT PREV_HASH).[m
[31m-         */[m
[31m-[m
[31m-        if (server->len >= 5[m
[31m-            && ngx_strncasecmp(server->data, (u_char *) "unix:", 5) == 0)[m
[31m-        {[m
[31m-            host = server->data + 5;[m
[31m-            host_len = server->len - 5;[m
[31m-            port = NULL;[m
[31m-            port_len = 0;[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        for (j = 0; j < server->len; j++) {[m
[31m-            c = server->data[server->len - j - 1];[m
[31m-[m
[31m-            if (c == ':') {[m
[31m-                host = server->data;[m
[31m-                host_len = server->len - j - 1;[m
[31m-                port = server->data + server->len - j;[m
[31m-                port_len = j;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (c < '0' || c > '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        host = server->data;[m
[31m-        host_len = server->len;[m
[31m-        port = NULL;[m
[31m-        port_len = 0;[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-        ngx_crc32_init(base_hash);[m
[31m-        ngx_crc32_update(&base_hash, host, host_len);[m
[31m-        ngx_crc32_update(&base_hash, (u_char *) "", 1);[m
[31m-        ngx_crc32_update(&base_hash, port, port_len);[m
[31m-[m
[31m-        prev_hash.value = 0;[m
[31m-        npoints = peer->weight * 160;[m
[31m-[m
[31m-        for (j = 0; j < npoints; j++) {[m
[31m-            hash = base_hash;[m
[31m-[m
[31m-            ngx_crc32_update(&hash, prev_hash.byte, 4);[m
[31m-            ngx_crc32_final(hash);[m
[31m-[m
[31m-            points->point[points->number].hash = hash;[m
[31m-            points->point[points->number].server = server;[m
[31m-            points->number++;[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN)[m
[31m-            prev_hash.value = hash;[m
[31m-#else[m
[31m-            prev_hash.byte[0] = (u_char) (hash & 0xff);[m
[31m-            prev_hash.byte[1] = (u_char) ((hash >> 8) & 0xff);[m
[31m-            prev_hash.byte[2] = (u_char) ((hash >> 16) & 0xff);[m
[31m-            prev_hash.byte[3] = (u_char) ((hash >> 24) & 0xff);[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_qsort(points->point,[m
[31m-              points->number,[m
[31m-              sizeof(ngx_stream_upstream_chash_point_t),[m
[31m-              ngx_stream_upstream_chash_cmp_points);[m
[31m-[m
[31m-    for (i = 0, j = 1; j < points->number; j++) {[m
[31m-        if (points->point[i].hash != points->point[j].hash) {[m
[31m-            points->point[++i] = points->point[j];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    points->number = i + 1;[m
[31m-[m
[31m-    hcf = ngx_stream_conf_upstream_srv_conf(us,[m
[31m-                                            ngx_stream_upstream_hash_module);[m
[31m-    hcf->points = points;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_stream_upstream_chash_cmp_points(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_stream_upstream_chash_point_t *first =[m
[31m-                                     (ngx_stream_upstream_chash_point_t *) one;[m
[31m-    ngx_stream_upstream_chash_point_t *second =[m
[31m-                                     (ngx_stream_upstream_chash_point_t *) two;[m
[31m-[m
[31m-    if (first->hash < second->hash) {[m
[31m-        return -1;[m
[31m-[m
[31m-    } else if (first->hash > second->hash) {[m
[31m-        return 1;[m
[31m-[m
[31m-    } else {[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_stream_upstream_find_chash_point(ngx_stream_upstream_chash_points_t *points,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_uint_t                          i, j, k;[m
[31m-    ngx_stream_upstream_chash_point_t  *point;[m
[31m-[m
[31m-    /* find first point >= hash */[m
[31m-[m
[31m-    point = &points->point[0];[m
[31m-[m
[31m-    i = 0;[m
[31m-    j = points->number;[m
[31m-[m
[31m-    while (i < j) {[m
[31m-        k = (i + j) / 2;[m
[31m-[m
[31m-        if (hash > point[k].hash) {[m
[31m-            i = k + 1;[m
[31m-[m
[31m-        } else if (hash < point[k].hash) {[m
[31m-            j = k;[m
[31m-[m
[31m-        } else {[m
[31m-            return k;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_chash_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    uint32_t                               hash;[m
[31m-    ngx_stream_upstream_hash_srv_conf_t   *hcf;[m
[31m-    ngx_stream_upstream_hash_peer_data_t  *hp;[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_hash_peer(s, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.get = ngx_stream_upstream_get_chash_peer;[m
[31m-[m
[31m-    hp = s->upstream->peer.data;[m
[31m-    hcf = ngx_stream_conf_upstream_srv_conf(us,[m
[31m-                                            ngx_stream_upstream_hash_module);[m
[31m-[m
[31m-    hash = ngx_crc32_long(hp->key.data, hp->key.len);[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_rlock(hp->rrp.peers);[m
[31m-[m
[31m-    hp->hash = ngx_stream_upstream_find_chash_point(hcf->points, hash);[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_hash_peer_data_t *hp = data;[m
[31m-[m
[31m-    time_t                                now;[m
[31m-    intptr_t                              m;[m
[31m-    ngx_str_t                            *server;[m
[31m-    ngx_int_t                             total;[m
[31m-    ngx_uint_t                            i, n, best_i;[m
[31m-    ngx_stream_upstream_rr_peer_t        *peer, *best;[m
[31m-    ngx_stream_upstream_chash_point_t    *point;[m
[31m-    ngx_stream_upstream_chash_points_t   *points;[m
[31m-    ngx_stream_upstream_hash_srv_conf_t  *hcf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "get consistent hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_wlock(hp->rrp.peers);[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-    hcf = hp->conf;[m
[31m-[m
[31m-    points = hcf->points;[m
[31m-    point = &points->point[0];[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        server = point[hp->hash % points->number].server;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "consistent hash peer:%uD, server:\"%V\"",[m
[31m-                       hp->hash, server);[m
[31m-[m
[31m-        best = NULL;[m
[31m-        best_i = 0;[m
[31m-        total = 0;[m
[31m-[m
[31m-        for (peer = hp->rrp.peers->peer, i = 0;[m
[31m-             peer;[m
[31m-             peer = peer->next, i++)[m
[31m-        {[m
[31m-[m
[31m-            n = i / (8 * sizeof(uintptr_t));[m
[31m-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-            if (hp->rrp.tried[n] & m) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->down) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->server.len != server->len[m
[31m-                || ngx_strncmp(peer->server.data, server->data, server->len)[m
[31m-                   != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->max_fails[m
[31m-                && peer->fails >= peer->max_fails[m
[31m-                && now - peer->checked <= peer->fail_timeout)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            peer->current_weight += peer->effective_weight;[m
[31m-            total += peer->effective_weight;[m
[31m-[m
[31m-            if (peer->effective_weight < peer->weight) {[m
[31m-                peer->effective_weight++;[m
[31m-            }[m
[31m-[m
[31m-            if (best == NULL || peer->current_weight > best->current_weight) {[m
[31m-                best = peer;[m
[31m-                best_i = i;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (best) {[m
[31m-            best->current_weight -= total;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        hp->hash++;[m
[31m-        hp->tries++;[m
[31m-[m
[31m-        if (hp->tries >= points->number) {[m
[31m-            ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hp->rrp.current = best;[m
[31m-[m
[31m-    pc->sockaddr = best->sockaddr;[m
[31m-    pc->socklen = best->socklen;[m
[31m-    pc->name = &best->name;[m
[31m-[m
[31m-    best->conns++;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    n = best_i / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    hp->rrp.tried[n] |= m;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_upstream_hash_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_upstream_hash_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_stream_upstream_hash_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->points = NULL;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "$remote_addr")) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unsupported hash key \"%V\", use $remote_addr",[m
[31m-                           &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = NGX_STREAM_UPSTREAM_CREATE[m
[31m-                  |NGX_STREAM_UPSTREAM_WEIGHT[m
[31m-                  |NGX_STREAM_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_STREAM_UPSTREAM_DOWN;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        uscf->peer.init_upstream = ngx_stream_upstream_init_hash;[m
[31m-[m
[31m-    } else if (ngx_strcmp(value[2].data, "consistent") == 0) {[m
[31m-        uscf->peer.init_upstream = ngx_stream_upstream_init_chash;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_least_conn_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_least_conn_module.c[m
[1mdeleted file mode 100644[m
[1mindex c9719f9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_least_conn_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,307 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_stream_upstream_init_least_conn_peer([m
[31m-    ngx_stream_session_t *s, ngx_stream_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_stream_upstream_get_least_conn_peer([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-static char *ngx_stream_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_upstream_least_conn_commands[] = {[m
[31m-[m
[31m-    { ngx_string("least_conn"),[m
[31m-      NGX_STREAM_UPS_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_stream_upstream_least_conn,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_upstream_least_conn_module_ctx = {[m
[31m-    NULL,                                    /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                    /* create main configuration */[m
[31m-    NULL,                                    /* init main configuration */[m
[31m-[m
[31m-    NULL,                                    /* create server configuration */[m
[31m-    NULL,                                    /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_upstream_least_conn_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_upstream_least_conn_module_ctx, /* module context */[m
[31m-    ngx_stream_upstream_least_conn_commands, /* module directives */[m
[31m-    NGX_STREAM_MODULE,                       /* module type */[m
[31m-    NULL,                                    /* init master */[m
[31m-    NULL,                                    /* init module */[m
[31m-    NULL,                                    /* init process */[m
[31m-    NULL,                                    /* init thread */[m
[31m-    NULL,                                    /* exit thread */[m
[31m-    NULL,                                    /* exit process */[m
[31m-    NULL,                                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_least_conn(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, cf->log, 0,[m
[31m-                   "init least conn");[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_stream_upstream_init_least_conn_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_least_conn_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "init least conn peer");[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_round_robin_peer(s, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.get = ngx_stream_upstream_get_least_conn_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t *rrp = data;[m
[31m-[m
[31m-    time_t                           now;[m
[31m-    uintptr_t                        m;[m
[31m-    ngx_int_t                        rc, total;[m
[31m-    ngx_uint_t                       i, n, p, many;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer, *best;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "get least conn peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    if (rrp->peers->single) {[m
[31m-        return ngx_stream_upstream_get_round_robin_peer(pc, rrp);[m
[31m-    }[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_wlock(peers);[m
[31m-[m
[31m-    best = NULL;[m
[31m-    total = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    many = 0;[m
[31m-    p = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (peer = peers->peer, i = 0;[m
[31m-         peer;[m
[31m-         peer = peer->next, i++)[m
[31m-    {[m
[31m-[m
[31m-        n = i / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (rrp->tried[n] & m) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * select peer with least number of connections; if there are[m
[31m-         * multiple peers with the same number of connections, select[m
[31m-         * based on round-robin[m
[31m-         */[m
[31m-[m
[31m-        if (best == NULL[m
[31m-            || peer->conns * best->weight < best->conns * peer->weight)[m
[31m-        {[m
[31m-            best = peer;[m
[31m-            many = 0;[m
[31m-            p = i;[m
[31m-[m
[31m-        } else if (peer->conns * best->weight == best->conns * peer->weight) {[m
[31m-            many = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (best == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get least conn peer, no peer found");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (many) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get least conn peer, many");[m
[31m-[m
[31m-        for (peer = best, i = p;[m
[31m-             peer;[m
[31m-             peer = peer->next, i++)[m
[31m-        {[m
[31m-            n = i / (8 * sizeof(uintptr_t));[m
[31m-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-            if (rrp->tried[n] & m) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->down) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->conns * best->weight != best->conns * peer->weight) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->max_fails[m
[31m-                && peer->fails >= peer->max_fails[m
[31m-                && now - peer->checked <= peer->fail_timeout)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            peer->current_weight += peer->effective_weight;[m
[31m-            total += peer->effective_weight;[m
[31m-[m
[31m-            if (peer->effective_weight < peer->weight) {[m
[31m-                peer->effective_weight++;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->current_weight > best->current_weight) {[m
[31m-                best = peer;[m
[31m-                p = i;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    best->current_weight -= total;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    pc->sockaddr = best->sockaddr;[m
[31m-    pc->socklen = best->socklen;[m
[31m-    pc->name = &best->name;[m
[31m-[m
[31m-    best->conns++;[m
[31m-[m
[31m-    rrp->current = best;[m
[31m-[m
[31m-    n = p / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    rrp->tried[n] |= m;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (peers->next) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get least conn peer, backup servers");[m
[31m-[m
[31m-        rrp->peers = peers->next;[m
[31m-[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            rrp->tried[i] = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        rc = ngx_stream_upstream_get_least_conn_peer(pc, rrp);[m
[31m-[m
[31m-        if (rc != NGX_BUSY) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_wlock(peers);[m
[31m-    }[m
[31m-[m
[31m-    /* all peers failed, mark them as live for quick recovery */[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        peer->fails = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    pc->name = peers->name;[m
[31m-[m
[31m-    return NGX_BUSY;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_stream_upstream_init_least_conn;[m
[31m-[m
[31m-    uscf->flags = NGX_STREAM_UPSTREAM_CREATE[m
[31m-                  |NGX_STREAM_UPSTREAM_WEIGHT[m
[31m-                  |NGX_STREAM_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_STREAM_UPSTREAM_DOWN[m
[31m-                  |NGX_STREAM_UPSTREAM_BACKUP;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.c[m
[1mdeleted file mode 100644[m
[1mindex e1ab592..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.c[m
[1m+++ /dev/null[m
[36m@@ -1,702 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_upstream_tries(p) ((p)->number                             \[m
[31m-                                      + ((p)->next ? (p)->next->number : 0))[m
[31m-[m
[31m-[m
[31m-static ngx_stream_upstream_rr_peer_t *ngx_stream_upstream_get_peer([m
[31m-    ngx_stream_upstream_rr_peer_data_t *rrp);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static ngx_int_t ngx_stream_upstream_set_round_robin_peer_session([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-static void ngx_stream_upstream_save_round_robin_peer_session([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_url_t                        u;[m
[31m-    ngx_uint_t                       i, j, n, w;[m
[31m-    ngx_stream_upstream_server_t    *server;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer, **peerp;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers, *backup;[m
[31m-[m
[31m-    us->peer.init = ngx_stream_upstream_init_round_robin_peer;[m
[31m-[m
[31m-    if (us->servers) {[m
[31m-        server = us->servers->elts;[m
[31m-[m
[31m-        n = 0;[m
[31m-        w = 0;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n += server[i].naddrs;[m
[31m-            w += server[i].naddrs * server[i].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no servers in upstream \"%V\" in %s:%ui",[m
[31m-                          &us->host, us->file_name, us->line);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-        if (peers == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) * n);[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers->single = (n == 1);[m
[31m-        peers->number = n;[m
[31m-        peers->weighted = (w != n);[m
[31m-        peers->total_weight = w;[m
[31m-        peers->name = &us->host;[m
[31m-[m
[31m-        n = 0;[m
[31m-        peerp = &peers->peer;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-                peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-                peer[n].name = server[i].addrs[j].name;[m
[31m-                peer[n].weight = server[i].weight;[m
[31m-                peer[n].effective_weight = server[i].weight;[m
[31m-                peer[n].current_weight = 0;[m
[31m-                peer[n].max_fails = server[i].max_fails;[m
[31m-                peer[n].fail_timeout = server[i].fail_timeout;[m
[31m-                peer[n].down = server[i].down;[m
[31m-                peer[n].server = server[i].name;[m
[31m-[m
[31m-                *peerp = &peer[n];[m
[31m-                peerp = &peer[n].next;[m
[31m-                n++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        us->peer.data = peers;[m
[31m-[m
[31m-        /* backup servers */[m
[31m-[m
[31m-        n = 0;[m
[31m-        w = 0;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (!server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n += server[i].naddrs;[m
[31m-            w += server[i].naddrs * server[i].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        backup = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-        if (backup == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) * n);[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers->single = 0;[m
[31m-        backup->single = 0;[m
[31m-        backup->number = n;[m
[31m-        backup->weighted = (w != n);[m
[31m-        backup->total_weight = w;[m
[31m-        backup->name = &us->host;[m
[31m-[m
[31m-        n = 0;[m
[31m-        peerp = &backup->peer;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (!server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-                peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-                peer[n].name = server[i].addrs[j].name;[m
[31m-                peer[n].weight = server[i].weight;[m
[31m-                peer[n].effective_weight = server[i].weight;[m
[31m-                peer[n].current_weight = 0;[m
[31m-                peer[n].max_fails = server[i].max_fails;[m
[31m-                peer[n].fail_timeout = server[i].fail_timeout;[m
[31m-                peer[n].down = server[i].down;[m
[31m-                peer[n].server = server[i].name;[m
[31m-[m
[31m-                *peerp = &peer[n];[m
[31m-                peerp = &peer[n].next;[m
[31m-                n++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        peers->next = backup;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* an upstream implicitly defined by proxy_pass, etc. */[m
[31m-[m
[31m-    if (us->port == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no port in upstream \"%V\" in %s:%ui",[m
[31m-                      &us->host, us->file_name, us->line);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.host = us->host;[m
[31m-    u.port = us->port;[m
[31m-[m
[31m-    if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "%s in upstream \"%V\" in %s:%ui",[m
[31m-                          u.err, &us->host, us->file_name, us->line);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = u.naddrs;[m
[31m-[m
[31m-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) * n);[m
[31m-    if (peer == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (n == 1);[m
[31m-    peers->number = n;[m
[31m-    peers->weighted = 0;[m
[31m-    peers->total_weight = n;[m
[31m-    peers->name = &us->host;[m
[31m-[m
[31m-    peerp = &peers->peer;[m
[31m-[m
[31m-    for (i = 0; i < u.naddrs; i++) {[m
[31m-        peer[i].sockaddr = u.addrs[i].sockaddr;[m
[31m-        peer[i].socklen = u.addrs[i].socklen;[m
[31m-        peer[i].name = u.addrs[i].name;[m
[31m-        peer[i].weight = 1;[m
[31m-        peer[i].effective_weight = 1;[m
[31m-        peer[i].current_weight = 0;[m
[31m-        peer[i].max_fails = 1;[m
[31m-        peer[i].fail_timeout = 10;[m
[31m-        *peerp = &peer[i];[m
[31m-        peerp = &peer[i].next;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.data = peers;[m
[31m-[m
[31m-    /* implicitly defined upstream has no backup servers */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_uint_t                           n;[m
[31m-    ngx_stream_upstream_rr_peer_data_t  *rrp;[m
[31m-[m
[31m-    rrp = s->upstream->peer.data;[m
[31m-[m
[31m-    if (rrp == NULL) {[m
[31m-        rrp = ngx_palloc(s->connection->pool,[m
[31m-                         sizeof(ngx_stream_upstream_rr_peer_data_t));[m
[31m-        if (rrp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        s->upstream->peer.data = rrp;[m
[31m-    }[m
[31m-[m
[31m-    rrp->peers = us->peer.data;[m
[31m-    rrp->current = NULL;[m
[31m-[m
[31m-    n = rrp->peers->number;[m
[31m-[m
[31m-    if (rrp->peers->next && rrp->peers->next->number > n) {[m
[31m-        n = rrp->peers->next->number;[m
[31m-    }[m
[31m-[m
[31m-    if (n <= 8 * sizeof(uintptr_t)) {[m
[31m-        rrp->tried = &rrp->data;[m
[31m-        rrp->data = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        rrp->tried = ngx_pcalloc(s->connection->pool, n * sizeof(uintptr_t));[m
[31m-        if (rrp->tried == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.get = ngx_stream_upstream_get_round_robin_peer;[m
[31m-    s->upstream->peer.free = ngx_stream_upstream_free_round_robin_peer;[m
[31m-    s->upstream->peer.tries = ngx_stream_upstream_tries(rrp->peers);[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    s->upstream->peer.set_session =[m
[31m-                             ngx_stream_upstream_set_round_robin_peer_session;[m
[31m-    s->upstream->peer.save_session =[m
[31m-                             ngx_stream_upstream_save_round_robin_peer_session;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t *rrp = data;[m
[31m-[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_uint_t                       i, n;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "get rr peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    peers = rrp->peers;[m
[31m-    ngx_stream_upstream_rr_peers_wlock(peers);[m
[31m-[m
[31m-    if (peers->single) {[m
[31m-        peer = peers->peer;[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        rrp->current = peer;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* there are several peers */[m
[31m-[m
[31m-        peer = ngx_stream_upstream_get_peer(rrp);[m
[31m-[m
[31m-        if (peer == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get rr peer, current: %p %i",[m
[31m-                       peer, peer->current_weight);[m
[31m-    }[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (peers->next) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, "backup servers");[m
[31m-[m
[31m-        rrp->peers = peers->next;[m
[31m-[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            rrp->tried[i] = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        rc = ngx_stream_upstream_get_round_robin_peer(pc, rrp);[m
[31m-[m
[31m-        if (rc != NGX_BUSY) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_wlock(peers);[m
[31m-    }[m
[31m-[m
[31m-    /* all peers failed, mark them as live for quick recovery */[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        peer->fails = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    pc->name = peers->name;[m
[31m-[m
[31m-    return NGX_BUSY;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_stream_upstream_rr_peer_t *[m
[31m-ngx_stream_upstream_get_peer(ngx_stream_upstream_rr_peer_data_t *rrp)[m
[31m-{[m
[31m-    time_t                          now;[m
[31m-    uintptr_t                       m;[m
[31m-    ngx_int_t                       total;[m
[31m-    ngx_uint_t                      i, n, p;[m
[31m-    ngx_stream_upstream_rr_peer_t  *peer, *best;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    best = NULL;[m
[31m-    total = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    p = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (peer = rrp->peers->peer, i = 0;[m
[31m-         peer;[m
[31m-         peer = peer->next, i++)[m
[31m-    {[m
[31m-[m
[31m-        n = i / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (rrp->tried[n] & m) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        peer->current_weight += peer->effective_weight;[m
[31m-        total += peer->effective_weight;[m
[31m-[m
[31m-        if (peer->effective_weight < peer->weight) {[m
[31m-            peer->effective_weight++;[m
[31m-        }[m
[31m-[m
[31m-        if (best == NULL || peer->current_weight > best->current_weight) {[m
[31m-            best = peer;[m
[31m-            p = i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (best == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rrp->current = best;[m
[31m-[m
[31m-    n = p / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    rrp->tried[n] |= m;[m
[31m-[m
[31m-    best->current_weight -= total;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    return best;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    time_t                          now;[m
[31m-    ngx_stream_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "free rr peer %ui %ui", pc->tries, state);[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_rlock(rrp->peers);[m
[31m-    ngx_stream_upstream_rr_peer_lock(rrp->peers, peer);[m
[31m-[m
[31m-    if (rrp->peers->single) {[m
[31m-        peer->conns--;[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peer_unlock(rrp->peers, peer);[m
[31m-        ngx_stream_upstream_rr_peers_unlock(rrp->peers);[m
[31m-[m
[31m-        pc->tries = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED) {[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        peer->fails++;[m
[31m-        peer->accessed = now;[m
[31m-        peer->checked = now;[m
[31m-[m
[31m-        if (peer->max_fails) {[m
[31m-            peer->effective_weight -= peer->weight / peer->max_fails;[m
[31m-[m
[31m-            if (peer->fails >= peer->max_fails) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, pc->log, 0,[m
[31m-                              "upstream server temporarily disabled");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "free rr peer failed: %p %i",[m
[31m-                       peer, peer->effective_weight);[m
[31m-[m
[31m-        if (peer->effective_weight < 0) {[m
[31m-            peer->effective_weight = 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* mark peer live if check passed */[m
[31m-[m
[31m-        if (peer->accessed < peer->checked) {[m
[31m-            peer->fails = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    peer->conns--;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peer_unlock(rrp->peers, peer);[m
[31m-    ngx_stream_upstream_rr_peers_unlock(rrp->peers);[m
[31m-[m
[31m-    if (pc->tries) {[m
[31m-        pc->tries--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_ssl_session_t               *ssl_session;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer;[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    int                              len;[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                          *p;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-    u_char                           buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-#endif[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    if (peers->shpool) {[m
[31m-        ngx_stream_upstream_rr_peers_rlock(peers);[m
[31m-        ngx_stream_upstream_rr_peer_lock(peers, peer);[m
[31m-[m
[31m-        if (peer->ssl_session == NULL) {[m
[31m-            ngx_stream_upstream_rr_peer_unlock(peers, peer);[m
[31m-            ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        len = peer->ssl_session_len;[m
[31m-[m
[31m-        ngx_memcpy(buf, peer->ssl_session, len);[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peer_unlock(peers, peer);[m
[31m-        ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        p = buf;[m
[31m-        ssl_session = d2i_SSL_SESSION(NULL, &p, len);[m
[31m-[m
[31m-        rc = ngx_ssl_set_session(pc->connection, ssl_session);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "set session: %p", ssl_session);[m
[31m-[m
[31m-        ngx_ssl_free_session(ssl_session);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ssl_session = peer->ssl_session;[m
[31m-[m
[31m-    rc = ngx_ssl_set_session(pc->connection, ssl_session);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "set session: %p", ssl_session);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_ssl_session_t               *old_ssl_session, *ssl_session;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer;[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    int                              len;[m
[31m-    u_char                          *p;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-    u_char                           buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    if (peers->shpool) {[m
[31m-[m
[31m-        ssl_session = SSL_get0_session(pc->connection->ssl->connection);[m
[31m-[m
[31m-        if (ssl_session == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "save session: %p", ssl_session);[m
[31m-[m
[31m-        len = i2d_SSL_SESSION(ssl_session, NULL);[m
[31m-[m
[31m-        /* do not cache too big session */[m
[31m-[m
[31m-        if (len > NGX_SSL_MAX_SESSION_SIZE) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-        (void) i2d_SSL_SESSION(ssl_session, &p);[m
[31m-[m
[31m-        peer = rrp->current;[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_rlock(peers);[m
[31m-        ngx_stream_upstream_rr_peer_lock(peers, peer);[m
[31m-[m
[31m-        if (len > peer->ssl_session_len) {[m
[31m-            ngx_shmtx_lock(&peers->shpool->mutex);[m
[31m-[m
[31m-            if (peer->ssl_session) {[m
[31m-                ngx_slab_free_locked(peers->shpool, peer->ssl_session);[m
[31m-            }[m
[31m-[m
[31m-            peer->ssl_session = ngx_slab_alloc_locked(peers->shpool, len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&peers->shpool->mutex);[m
[31m-[m
[31m-            if (peer->ssl_session == NULL) {[m
[31m-                peer->ssl_session_len = 0;[m
[31m-[m
[31m-                ngx_stream_upstream_rr_peer_unlock(peers, peer);[m
[31m-                ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            peer->ssl_session_len = len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer->ssl_session, buf, len);[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peer_unlock(peers, peer);[m
[31m-        ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ssl_session = ngx_ssl_get_session(pc->connection);[m
[31m-[m
[31m-    if (ssl_session == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "save session: %p", ssl_session);[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-    old_ssl_session = peer->ssl_session;[m
[31m-    peer->ssl_session = ssl_session;[m
[31m-[m
[31m-    if (old_ssl_session) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "old session: %p", old_ssl_session);[m
[31m-[m
[31m-        /* TODO: may block */[m
[31m-[m
[31m-        ngx_ssl_free_session(old_ssl_session);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.h[m
[1mdeleted file mode 100644[m
[1mindex 77ee0ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.h[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_[m
[31m-#define _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_stream_upstream_rr_peer_s   ngx_stream_upstream_rr_peer_t;[m
[31m-[m
[31m-struct ngx_stream_upstream_rr_peer_s {[m
[31m-    struct sockaddr                 *sockaddr;[m
[31m-    socklen_t                        socklen;[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_str_t                        server;[m
[31m-[m
[31m-    ngx_int_t                        current_weight;[m
[31m-    ngx_int_t                        effective_weight;[m
[31m-    ngx_int_t                        weight;[m
[31m-[m
[31m-    ngx_uint_t                       conns;[m
[31m-[m
[31m-    ngx_uint_t                       fails;[m
[31m-    time_t                           accessed;[m
[31m-    time_t                           checked;[m
[31m-[m
[31m-    ngx_uint_t                       max_fails;[m
[31m-    time_t                           fail_timeout;[m
[31m-[m
[31m-    ngx_uint_t                       down;         /* unsigned  down:1; */[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    void                            *ssl_session;[m
[31m-    int                              ssl_session_len;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peer_t   *next;[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    ngx_atomic_t                     lock;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_stream_upstream_rr_peers_s  ngx_stream_upstream_rr_peers_t;[m
[31m-[m
[31m-struct ngx_stream_upstream_rr_peers_s {[m
[31m-    ngx_uint_t                       number;[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    ngx_slab_pool_t                 *shpool;[m
[31m-    ngx_atomic_t                     rwlock;[m
[31m-    ngx_stream_upstream_rr_peers_t  *zone_next;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t                       total_weight;[m
[31m-[m
[31m-    unsigned                         single:1;[m
[31m-    unsigned                         weighted:1;[m
[31m-[m
[31m-    ngx_str_t                       *name;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_t  *next;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peers_rlock(peers)                             \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_rlock(&peers->rwlock);                                     \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peers_wlock(peers)                             \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_wlock(&peers->rwlock);                                     \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peers_unlock(peers)                            \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_unlock(&peers->rwlock);                                    \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peer_lock(peers, peer)                         \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_wlock(&peer->lock);                                        \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peer_unlock(peers, peer)                       \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_unlock(&peer->lock);                                       \[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peers_rlock(peers)[m
[31m-#define ngx_stream_upstream_rr_peers_wlock(peers)[m
[31m-#define ngx_stream_upstream_rr_peers_unlock(peers)[m
[31m-#define ngx_stream_upstream_rr_peer_lock(peers, peer)[m
[31m-#define ngx_stream_upstream_rr_peer_unlock(peers, peer)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-    ngx_stream_upstream_rr_peer_t   *current;[m
[31m-    uintptr_t                       *tried;[m
[31m-    uintptr_t                        data;[m
[31m-} ngx_stream_upstream_rr_peer_data_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-ngx_int_t ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-ngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-void ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_zone_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_zone_module.c[m
[1mdeleted file mode 100644[m
[1mindex ffc9e8a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-1.9.15/src/stream/ngx_stream_upstream_zone_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,242 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone,[m
[31m-    void *data);[m
[31m-static ngx_stream_upstream_rr_peers_t *ngx_stream_upstream_zone_copy_peers([m
[31m-    ngx_slab_pool_t *shpool, ngx_stream_upstream_srv_conf_t *uscf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_upstream_zone_commands[] = {[m
[31m-[m
[31m-    { ngx_string("zone"),[m
[31m-      NGX_STREAM_UPS_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_stream_upstream_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_upstream_zone_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_upstream_zone_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_upstream_zone_module_ctx,  /* module context */[m
[31m-    ngx_stream_upstream_zone_commands,     /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ssize_t                           size;[m
[31m-    ngx_str_t                        *value;[m
[31m-    ngx_stream_upstream_srv_conf_t   *uscf;[m
[31m-    ngx_stream_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module);[m
[31m-    umcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_upstream_module);[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (!value[1].len) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid zone name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        size = ngx_parse_size(&value[2]);[m
[31m-[m
[31m-        if (size == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid zone size \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "zone \"%V\" is too small", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = 0;[m
[31m-    }[m
[31m-[m
[31m-    uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size,[m
[31m-                                           &ngx_stream_upstream_module);[m
[31m-    if (uscf->shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf->shm_zone->init = ngx_stream_upstream_init_zone;[m
[31m-    uscf->shm_zone->data = umcf;[m
[31m-[m
[31m-    uscf->shm_zone->noreuse = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    size_t                            len;[m
[31m-    ngx_uint_t                        i;[m
[31m-    ngx_slab_pool_t                  *shpool;[m
[31m-    ngx_stream_upstream_rr_peers_t   *peers, **peersp;[m
[31m-    ngx_stream_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_stream_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-    umcf = shm_zone->data;[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        peers = shpool->data;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->shm_zone != shm_zone) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            uscf->peer.data = peers;[m
[31m-            peers = peers->zone_next;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-[m
[31m-    /* copy peers to shared memory */[m
[31m-[m
[31m-    peersp = (ngx_stream_upstream_rr_peers_t **) (void *) &shpool->data;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->shm_zone != shm_zone) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        peers = ngx_stream_upstream_zone_copy_peers(shpool, uscf);[m
[31m-        if (peers == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *peersp = peers;[m
[31m-        peersp = &peers->zone_next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_stream_upstream_rr_peers_t *[m
[31m-ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,[m
[31m-    ngx_stream_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer, **peerp;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers, *backup;[m
[31m-[m
[31m-    peers = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-[m
[31m-    peers->shpool = shpool;[m
[31m-[m
[31m-    for (peerp = &peers->peer; *peerp; peerp = &peer->next) {[m
[31m-        /* pool is unlocked */[m
[31m-        peer = ngx_slab_calloc_locked(shpool,[m
[31m-                                      sizeof(ngx_stream_upstream_rr_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));[m
[31m-[m
[31m-        *peerp = peer;[m
[31m-    }[m
[31m-[m
[31m-    if (peers->next == NULL) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    backup = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-    if (backup == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-[m
[31m-    backup->shpool = shpool;[m
[31m-[m
[31m-    for (peerp = &backup->peer; *peerp; peerp = &peer->next) {[m
[31m-        /* pool is unlocked */[m
[31m-        peer = ngx_slab_calloc_locked(shpool,[m
[31m-                                      sizeof(ngx_stream_upstream_rr_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));[m
[31m-[m
[31m-        *peerp = peer;[m
[31m-    }[m
[31m-[m
[31m-    peers->next = backup;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    uscf->peer.data = peers;[m
[31m-[m
[31m-    return peers;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-no_pool.patch b/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-no_pool.patch[m
[1mdeleted file mode 100644[m
[1mindex 5077f5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/nginx-no_pool.patch[m
[1m+++ /dev/null[m
[36m@@ -1,587 +0,0 @@[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/nginx.h nginx-1.9.15-patched/src/core/nginx.h[m
[31m---- nginx-1.9.15/src/core/nginx.h	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/nginx.h	2016-04-21 16:25:07.452944624 -0700[m
[31m-@@ -10,7 +10,7 @@[m
[31m- [m
[31m- [m
[31m- #define nginx_version      1009015[m
[31m- #define NGINX_VERSION      "1.9.15"[m
[31m--#define NGINX_VER          "openresty/" NGINX_VERSION ".1"[m
[31m-+#define NGINX_VER          "openresty/" NGINX_VERSION ".1 (no pool)"[m
[31m- [m
[31m- #ifdef NGX_BUILD[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/ngx_array.c nginx-1.9.15-patched/src/core/ngx_array.c[m
[31m---- nginx-1.9.15/src/core/ngx_array.c	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/ngx_array.c	2016-04-21 16:25:07.453947190 -0700[m
[31m-@@ -30,26 +30,30 @@ ngx_array_create(ngx_pool_t *p, ngx_uint[m
[31m- void[m
[31m- ngx_array_destroy(ngx_array_t *a)[m
[31m- {[m
[31m--    ngx_pool_t  *p;[m
[31m-+    ngx_pool_t          *p;[m
[31m-+    ngx_array_link_t    *link;[m
[31m- [m
[31m-     p = a->pool;[m
[31m- [m
[31m--    if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {[m
[31m--        p->d.last -= a->size * a->nalloc;[m
[31m-+    if (a->elts) {[m
[31m-+        ngx_pfree(p, a->elts);[m
[31m-     }[m
[31m- [m
[31m--    if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {[m
[31m--        p->d.last = (u_char *) a;[m
[31m-+    for (link = a->old_elts; link; link = link->next) {[m
[31m-+        ngx_pfree(p, link->elts);[m
[31m-     }[m
[31m-+[m
[31m-+    ngx_pfree(p, a);[m
[31m- }[m
[31m- [m
[31m- [m
[31m- void *[m
[31m- ngx_array_push(ngx_array_t *a)[m
[31m- {[m
[31m--    void        *elt, *new;[m
[31m--    size_t       size;[m
[31m--    ngx_pool_t  *p;[m
[31m-+    void                *elt, *new;[m
[31m-+    size_t               size;[m
[31m-+    ngx_pool_t          *p;[m
[31m-+    ngx_array_link_t    *link;[m
[31m- [m
[31m-     if (a->nelts == a->nalloc) {[m
[31m- [m
[31m-@@ -59,29 +63,27 @@ ngx_array_push(ngx_array_t *a)[m
[31m- [m
[31m-         p = a->pool;[m
[31m- [m
[31m--        if ((u_char *) a->elts + size == p->d.last[m
[31m--            && p->d.last + a->size <= p->d.end)[m
[31m--        {[m
[31m--            /*[m
[31m--             * the array allocation is the last in the pool[m
[31m--             * and there is space for new allocation[m
[31m--             */[m
[31m--[m
[31m--            p->d.last += a->size;[m
[31m--            a->nalloc++;[m
[31m-+        /* allocate a new array */[m
[31m- [m
[31m--        } else {[m
[31m--            /* allocate a new array */[m
[31m-+        new = ngx_palloc(p, 2 * size);[m
[31m-+        if (new == NULL) {[m
[31m-+            return NULL;[m
[31m-+        }[m
[31m- [m
[31m--            new = ngx_palloc(p, 2 * size);[m
[31m--            if (new == NULL) {[m
[31m--                return NULL;[m
[31m--            }[m
[31m-+        ngx_memcpy(new, a->elts, size);[m
[31m- [m
[31m--            ngx_memcpy(new, a->elts, size);[m
[31m--            a->elts = new;[m
[31m--            a->nalloc *= 2;[m
[31m-+        link = ngx_palloc(p, sizeof(ngx_array_link_t));[m
[31m-+        if (link == NULL) {[m
[31m-+            ngx_pfree(p, new);[m
[31m-+            return NULL;[m
[31m-         }[m
[31m-+[m
[31m-+        link->next = a->old_elts;[m
[31m-+        link->elts = a->elts;[m
[31m-+        a->old_elts = link;[m
[31m-+[m
[31m-+        a->elts = new;[m
[31m-+        a->nalloc *= 2;[m
[31m-     }[m
[31m- [m
[31m-     elt = (u_char *) a->elts + a->size * a->nelts;[m
[31m-@@ -95,11 +97,10 @@ void *[m
[31m- ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)[m
[31m- {[m
[31m-     void        *elt, *new;[m
[31m--    size_t       size;[m
[31m-     ngx_uint_t   nalloc;[m
[31m-     ngx_pool_t  *p;[m
[31m- [m
[31m--    size = n * a->size;[m
[31m-+    ngx_array_link_t    *link;[m
[31m- [m
[31m-     if (a->nelts + n > a->nalloc) {[m
[31m- [m
[31m-@@ -107,31 +108,27 @@ ngx_array_push_n(ngx_array_t *a, ngx_uin[m
[31m- [m
[31m-         p = a->pool;[m
[31m- [m
[31m--        if ((u_char *) a->elts + a->size * a->nalloc == p->d.last[m
[31m--            && p->d.last + size <= p->d.end)[m
[31m--        {[m
[31m--            /*[m
[31m--             * the array allocation is the last in the pool[m
[31m--             * and there is space for new allocation[m
[31m--             */[m
[31m-+        nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);[m
[31m- [m
[31m--            p->d.last += size;[m
[31m--            a->nalloc += n;[m
[31m-+        new = ngx_palloc(p, nalloc * a->size);[m
[31m-+        if (new == NULL) {[m
[31m-+            return NULL;[m
[31m-+        }[m
[31m- [m
[31m--        } else {[m
[31m--            /* allocate a new array */[m
[31m-+        ngx_memcpy(new, a->elts, a->nelts * a->size);[m
[31m- [m
[31m--            nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);[m
[31m-+        link = ngx_palloc(p, sizeof(ngx_array_link_t));[m
[31m-+        if (link == NULL) {[m
[31m-+            ngx_pfree(p, new);[m
[31m-+            return NULL;[m
[31m-+        }[m
[31m- [m
[31m--            new = ngx_palloc(p, nalloc * a->size);[m
[31m--            if (new == NULL) {[m
[31m--                return NULL;[m
[31m--            }[m
[31m-+        link->next = a->old_elts;[m
[31m-+        link->elts = a->elts;[m
[31m-+        a->old_elts = link;[m
[31m- [m
[31m--            ngx_memcpy(new, a->elts, a->nelts * a->size);[m
[31m--            a->elts = new;[m
[31m--            a->nalloc = nalloc;[m
[31m--        }[m
[31m-+        a->elts = new;[m
[31m-+        a->nalloc = nalloc;[m
[31m-     }[m
[31m- [m
[31m-     elt = (u_char *) a->elts + a->size * a->nelts;[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/ngx_array.h nginx-1.9.15-patched/src/core/ngx_array.h[m
[31m---- nginx-1.9.15/src/core/ngx_array.h	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/ngx_array.h	2016-04-21 16:25:07.453947190 -0700[m
[31m-@@ -13,12 +13,23 @@[m
[31m- #include <ngx_core.h>[m
[31m- [m
[31m- [m
[31m-+typedef struct ngx_array_link_s ngx_array_link_t;[m
[31m-+[m
[31m-+[m
[31m-+struct ngx_array_link_s {[m
[31m-+    void                    *elts;[m
[31m-+    ngx_array_link_t        *next;[m
[31m-+};[m
[31m-+[m
[31m-+[m
[31m- typedef struct {[m
[31m-     void        *elts;[m
[31m-     ngx_uint_t   nelts;[m
[31m-     size_t       size;[m
[31m-     ngx_uint_t   nalloc;[m
[31m-     ngx_pool_t  *pool;[m
[31m-+[m
[31m-+    ngx_array_link_t *old_elts;[m
[31m- } ngx_array_t;[m
[31m- [m
[31m- [m
[31m-@@ -40,6 +51,7 @@ ngx_array_init(ngx_array_t *array, ngx_p[m
[31m-     array->size = size;[m
[31m-     array->nalloc = n;[m
[31m-     array->pool = pool;[m
[31m-+    array->old_elts = NULL;[m
[31m- [m
[31m-     array->elts = ngx_palloc(pool, n * size);[m
[31m-     if (array->elts == NULL) {[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/ngx_palloc.c nginx-1.9.15-patched/src/core/ngx_palloc.c[m
[31m---- nginx-1.9.15/src/core/ngx_palloc.c	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/ngx_palloc.c	2016-04-21 16:25:45.912282685 -0700[m
[31m-@@ -9,34 +9,26 @@[m
[31m- #include <ngx_core.h>[m
[31m- [m
[31m- [m
[31m--static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size,[m
[31m--    ngx_uint_t align);[m
[31m--static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);[m
[31m--static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);[m
[31m-+static void * ngx_malloc(ngx_pool_t *pool, size_t size);[m
[31m- [m
[31m- [m
[31m- ngx_pool_t *[m
[31m- ngx_create_pool(size_t size, ngx_log_t *log)[m
[31m- {[m
[31m--    ngx_pool_t  *p;[m
[31m-+    ngx_pool_t        *p;[m
[31m- [m
[31m--    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);[m
[31m-+    size = sizeof(ngx_pool_t);[m
[31m-+    p = ngx_alloc(size, log);[m
[31m-     if (p == NULL) {[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m--    p->d.end = (u_char *) p + size;[m
[31m--    p->d.next = NULL;[m
[31m--    p->d.failed = 0;[m
[31m-+    ngx_memzero(p, size);[m
[31m- [m
[31m-     size = size - sizeof(ngx_pool_t);[m
[31m-     p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;[m
[31m- [m
[31m-     p->current = p;[m
[31m--    p->chain = NULL;[m
[31m--    p->large = NULL;[m
[31m--    p->cleanup = NULL;[m
[31m-     p->log = log;[m
[31m- [m
[31m-     return p;[m
[31m-@@ -46,8 +38,7 @@ ngx_create_pool(size_t size, ngx_log_t *[m
[31m- void[m
[31m- ngx_destroy_pool(ngx_pool_t *pool)[m
[31m- {[m
[31m--    ngx_pool_t          *p, *n;[m
[31m--    ngx_pool_large_t    *l;[m
[31m-+    ngx_pool_data_t     *d, *n;[m
[31m-     ngx_pool_cleanup_t  *c;[m
[31m- [m
[31m-     for (c = pool->cleanup; c; c = c->next) {[m
[31m-@@ -58,6 +49,11 @@ ngx_destroy_pool(ngx_pool_t *pool)[m
[31m-         }[m
[31m-     }[m
[31m- [m
[31m-+    if (pool->d == NULL) {[m
[31m-+        ngx_free(pool);[m
[31m-+        return;[m
[31m-+    }[m
[31m-+[m
[31m- #if (NGX_DEBUG)[m
[31m- [m
[31m-     /*[m
[31m-@@ -65,13 +61,9 @@ ngx_destroy_pool(ngx_pool_t *pool)[m
[31m-      * so we cannot use this log while free()ing the pool[m
[31m-      */[m
[31m- [m
[31m--    for (l = pool->large; l; l = l->next) {[m
[31m--        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);[m
[31m--    }[m
[31m--[m
[31m--    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-+    for (d = pool->d, n = d->next; ; d = n, n = n->next) {[m
[31m-         ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m--                       "free: %p, unused: %uz", p, p->d.end - p->d.last);[m
[31m-+                       "free: %p, unused: %d", d, 0);[m
[31m- [m
[31m-         if (n == NULL) {[m
[31m-             break;[m
[31m-@@ -80,171 +72,82 @@ ngx_destroy_pool(ngx_pool_t *pool)[m
[31m- [m
[31m- #endif[m
[31m- [m
[31m--    for (l = pool->large; l; l = l->next) {[m
[31m--        if (l->alloc) {[m
[31m--            ngx_free(l->alloc);[m
[31m--        }[m
[31m--    }[m
[31m--[m
[31m--    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m--        ngx_free(p);[m
[31m-+    for (d = pool->d, n = d->next; ; d = n, n = n->next) {[m
[31m-+        ngx_free(d->alloc);[m
[31m-+        ngx_free(d);[m
[31m- [m
[31m-         if (n == NULL) {[m
[31m-             break;[m
[31m-         }[m
[31m-     }[m
[31m-+[m
[31m-+    pool->d = NULL;[m
[31m-+    ngx_free(pool);[m
[31m- }[m
[31m- [m
[31m- [m
[31m- void[m
[31m- ngx_reset_pool(ngx_pool_t *pool)[m
[31m- {[m
[31m--    ngx_pool_t        *p;[m
[31m--    ngx_pool_large_t  *l;[m
[31m-+    ngx_pool_data_t     *d, *n;[m
[31m-+    ngx_pool_data_t     *saved = NULL;[m
[31m- [m
[31m--    for (l = pool->large; l; l = l->next) {[m
[31m--        if (l->alloc) {[m
[31m--            ngx_free(l->alloc);[m
[31m-+    if (pool->d) {[m
[31m-+        for (d = pool->d, n = d->next; ; d = n, n = n->next) {[m
[31m-+            if (d->alloc == pool->log) {[m
[31m-+                saved = d;[m
[31m-+                continue;[m
[31m-+            }[m
[31m-+[m
[31m-+            ngx_free(d->alloc);[m
[31m-+            ngx_free(d);[m
[31m-+[m
[31m-+            if (n == NULL) {[m
[31m-+                break;[m
[31m-+            }[m
[31m-         }[m
[31m--    }[m
[31m- [m
[31m--    for (p = pool; p; p = p->d.next) {[m
[31m--        p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m--        p->d.failed = 0;[m
[31m-+        pool->d = saved;[m
[31m-+        pool->current = pool;[m
[31m-+        pool->chain = NULL;[m
[31m-     }[m
[31m--[m
[31m--    pool->current = pool;[m
[31m--    pool->chain = NULL;[m
[31m--    pool->large = NULL;[m
[31m- }[m
[31m- [m
[31m- [m
[31m- void *[m
[31m- ngx_palloc(ngx_pool_t *pool, size_t size)[m
[31m- {[m
[31m--#if !(NGX_DEBUG_PALLOC)[m
[31m--    if (size <= pool->max) {[m
[31m--        return ngx_palloc_small(pool, size, 1);[m
[31m--    }[m
[31m--#endif[m
[31m--[m
[31m--    return ngx_palloc_large(pool, size);[m
[31m-+    return ngx_malloc(pool, size);[m
[31m- }[m
[31m- [m
[31m- [m
[31m- void *[m
[31m- ngx_pnalloc(ngx_pool_t *pool, size_t size)[m
[31m- {[m
[31m--#if !(NGX_DEBUG_PALLOC)[m
[31m--    if (size <= pool->max) {[m
[31m--        return ngx_palloc_small(pool, size, 0);[m
[31m--    }[m
[31m--#endif[m
[31m--[m
[31m--    return ngx_palloc_large(pool, size);[m
[31m--}[m
[31m--[m
[31m--[m
[31m--static ngx_inline void *[m
[31m--ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)[m
[31m--{[m
[31m--    u_char      *m;[m
[31m--    ngx_pool_t  *p;[m
[31m--[m
[31m--    p = pool->current;[m
[31m--[m
[31m--    do {[m
[31m--        m = p->d.last;[m
[31m--[m
[31m--        if (align) {[m
[31m--            m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m--        }[m
[31m--[m
[31m--        if ((size_t) (p->d.end - m) >= size) {[m
[31m--            p->d.last = m + size;[m
[31m--[m
[31m--            return m;[m
[31m--        }[m
[31m--[m
[31m--        p = p->d.next;[m
[31m--[m
[31m--    } while (p);[m
[31m--[m
[31m--    return ngx_palloc_block(pool, size);[m
[31m--}[m
[31m--[m
[31m--[m
[31m--static void *[m
[31m--ngx_palloc_block(ngx_pool_t *pool, size_t size)[m
[31m--{[m
[31m--    u_char      *m;[m
[31m--    size_t       psize;[m
[31m--    ngx_pool_t  *p, *new;[m
[31m--[m
[31m--    psize = (size_t) (pool->d.end - (u_char *) pool);[m
[31m--[m
[31m--    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);[m
[31m--    if (m == NULL) {[m
[31m--        return NULL;[m
[31m--    }[m
[31m--[m
[31m--    new = (ngx_pool_t *) m;[m
[31m--[m
[31m--    new->d.end = m + psize;[m
[31m--    new->d.next = NULL;[m
[31m--    new->d.failed = 0;[m
[31m--[m
[31m--    m += sizeof(ngx_pool_data_t);[m
[31m--    m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m--    new->d.last = m + size;[m
[31m--[m
[31m--    for (p = pool->current; p->d.next; p = p->d.next) {[m
[31m--        if (p->d.failed++ > 4) {[m
[31m--            pool->current = p->d.next;[m
[31m--        }[m
[31m--    }[m
[31m--[m
[31m--    p->d.next = new;[m
[31m--[m
[31m--    return m;[m
[31m-+    return ngx_malloc(pool, size);[m
[31m- }[m
[31m- [m
[31m- [m
[31m- static void *[m
[31m--ngx_palloc_large(ngx_pool_t *pool, size_t size)[m
[31m-+ngx_malloc(ngx_pool_t *pool, size_t size)[m
[31m- {[m
[31m--    void              *p;[m
[31m--    ngx_uint_t         n;[m
[31m--    ngx_pool_large_t  *large;[m
[31m-+    void                *p;[m
[31m-+    ngx_pool_data_t     *d;[m
[31m- [m
[31m-     p = ngx_alloc(size, pool->log);[m
[31m-     if (p == NULL) {[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    n = 0;[m
[31m--[m
[31m--    for (large = pool->large; large; large = large->next) {[m
[31m--        if (large->alloc == NULL) {[m
[31m--            large->alloc = p;[m
[31m--            return p;[m
[31m--        }[m
[31m--[m
[31m--        if (n++ > 3) {[m
[31m--            break;[m
[31m--        }[m
[31m--    }[m
[31m--[m
[31m--    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m--    if (large == NULL) {[m
[31m-+    d = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);[m
[31m-+    if (d == NULL){[m
[31m-         ngx_free(p);[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    large->alloc = p;[m
[31m--    large->next = pool->large;[m
[31m--    pool->large = large;[m
[31m--[m
[31m-+    d->alloc = p;[m
[31m-+    d->next = pool->d;[m
[31m-+    pool->d = d;[m
[31m-     return p;[m
[31m- }[m
[31m- [m
[31m-@@ -253,38 +156,48 @@ void *[m
[31m- ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)[m
[31m- {[m
[31m-     void              *p;[m
[31m--    ngx_pool_large_t  *large;[m
[31m-+    ngx_pool_data_t   *d;[m
[31m- [m
[31m-     p = ngx_memalign(alignment, size, pool->log);[m
[31m-     if (p == NULL) {[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m--    if (large == NULL) {[m
[31m-+    d = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);[m
[31m-+    if (d == NULL){[m
[31m-         ngx_free(p);[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    large->alloc = p;[m
[31m--    large->next = pool->large;[m
[31m--    pool->large = large;[m
[31m--[m
[31m-+    d->alloc = p;[m
[31m-+    d->next = pool->d;[m
[31m-+    pool->d = d;[m
[31m-     return p;[m
[31m- }[m
[31m- [m
[31m- [m
[31m- ngx_int_t[m
[31m--ngx_pfree(ngx_pool_t *pool, void *p)[m
[31m-+ngx_pfree(ngx_pool_t *pool, void *data)[m
[31m- {[m
[31m--    ngx_pool_large_t  *l;[m
[31m-+    ngx_pool_data_t     *p, *d;[m
[31m- [m
[31m--    for (l = pool->large; l; l = l->next) {[m
[31m--        if (p == l->alloc) {[m
[31m--            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m--                           "free: %p", l->alloc);[m
[31m--            ngx_free(l->alloc);[m
[31m--            l->alloc = NULL;[m
[31m-+    p = NULL;[m
[31m-+    for (d = pool->d; d; p = d, d = d->next) {[m
[31m-+        if (data == d->alloc) {[m
[31m-+[m
[31m-+            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);[m
[31m-+[m
[31m-+            ngx_free(d->alloc);[m
[31m-+            d->alloc = NULL;[m
[31m-+[m
[31m-+            if (p) {[m
[31m-+                p->next = d->next;[m
[31m-+[m
[31m-+            } else {[m
[31m-+                pool->d = d->next;[m
[31m-+            }[m
[31m-+[m
[31m-+            ngx_free(d);[m
[31m- [m
[31m-             return NGX_OK;[m
[31m-         }[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/ngx_palloc.h nginx-1.9.15-patched/src/core/ngx_palloc.h[m
[31m---- nginx-1.9.15/src/core/ngx_palloc.h	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/ngx_palloc.h	2016-04-21 16:25:07.454949755 -0700[m
[31m-@@ -38,28 +38,21 @@ struct ngx_pool_cleanup_s {[m
[31m- };[m
[31m- [m
[31m- [m
[31m--typedef struct ngx_pool_large_s  ngx_pool_large_t;[m
[31m--[m
[31m--struct ngx_pool_large_s {[m
[31m--    ngx_pool_large_t     *next;[m
[31m--    void                 *alloc;[m
[31m--};[m
[31m-+typedef struct ngx_pool_data_s   ngx_pool_large_t;[m
[31m-+typedef struct ngx_pool_data_s   ngx_pool_data_t;[m
[31m- [m
[31m- [m
[31m--typedef struct {[m
[31m--    u_char               *last;[m
[31m--    u_char               *end;[m
[31m--    ngx_pool_t           *next;[m
[31m--    ngx_uint_t            failed;[m
[31m--} ngx_pool_data_t;[m
[31m-+struct ngx_pool_data_s {[m
[31m-+    ngx_pool_data_t        *next;[m
[31m-+    void                   *alloc;[m
[31m-+};[m
[31m- [m
[31m- [m
[31m- struct ngx_pool_s {[m
[31m--    ngx_pool_data_t       d;[m
[31m-+    ngx_pool_data_t      *d;[m
[31m-     size_t                max;[m
[31m-     ngx_pool_t           *current;[m
[31m-     ngx_chain_t          *chain;[m
[31m--    ngx_pool_large_t     *large;[m
[31m-     ngx_pool_cleanup_t   *cleanup;[m
[31m-     ngx_log_t            *log;[m
[31m- };[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex c6af6c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-.svn[m
[31m-t/servroot/[m
[31m-*~[m
[31m-*.swp[m
[31m-work/[m
[31m-buildroot/[m
[31m-util/[m
[31m-reindex[m
[31m-go[m
[31m-build1*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/CHANGES b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/CHANGES[m
[1mdeleted file mode 100644[m
[1mindex a76ce50..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/CHANGES[m
[1m+++ /dev/null[m
[36m@@ -1,2 +0,0 @@[m
[31m-2010-07-01    VERSION 1.0[m
[31m-    * Initial release.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex e5d57c8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-1. Redistributions of source code must retain the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer.[m
[31m-2. Redistributions in binary form must reproduce the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer in the[m
[31m-   documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/README[m
[1mdeleted file mode 100644[m
[1mindex 4391030..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/README[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-ABOUT:[m
[31m-------[m
[31m-ngx_coolkit is collection of small and useful nginx add-ons.[m
[31m-[m
[31m-[m
[31m-CONFIGURATION DIRECTIVES:[m
[31m--------------------------[m
[31m-[m
[31m-  override_method off | [methods] source (context: http, server, location)[m
[31m-  ------------------------------------------------------------------------[m
[31m-  Override HTTP method.[m
[31m-[m
[31m-  default: none[m
[31m-[m
[31m-[m
[31m-CONFIGURATION VARIABLES:[m
[31m-------------------------[m
[31m-[m
[31m-  $remote_passwd[m
[31m-  -----------------[m
[31m-  Decoded password from "Authorization" header (Basic HTTP Authentication).[m
[31m-[m
[31m-[m
[31m-  $location[m
[31m-  ---------[m
[31m-  Name of the matched location block.[m
[31m-[m
[31m-[m
[31m-EXAMPLE CONFIGURATION #1:[m
[31m--------------------------[m
[31m-http {[m
[31m-    server {[m
[31m-        location / {[m
[31m-            override_method  $arg_method;[m
[31m-            proxy_pass       http://127.0.0.1:8100;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-Pass request with changed HTTP method (based on "?method=XXX") to the backend.[m
[31m-[m
[31m-[m
[31m-EXAMPLE CONFIGURATION #2:[m
[31m--------------------------[m
[31m-http {[m
[31m-    upstream database {[m
[31m-        postgres_server        127.0.0.1 dbname=test[m
[31m-                               user=monty password=some_pass;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        location = /auth {[m
[31m-            internal;[m
[31m-[m
[31m-            set_quote_sql_str  $user $remote_user;[m
[31m-            set_quote_sql_str  $pass $remote_passwd;[m
[31m-[m
[31m-            postgres_pass      database;[m
[31m-            postgres_query     "SELECT login FROM users WHERE login=$user AND pass=$pass";[m
[31m-            postgres_rewrite   no_rows 403;[m
[31m-            postgres_output    none;[m
[31m-        }[m
[31m-[m
[31m-        location / {[m
[31m-            auth_request       /auth;[m
[31m-            root               /files;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-Restrict access to local files by authenticating against SQL database.[m
[31m-[m
[31m-Required modules (other than ngx_coolkit):[m
[31m-- ngx_http_auth_request_module,[m
[31m-- ngx_postgres (PostgreSQL) or ngx_drizzle (MySQL, Drizzle, SQLite),[m
[31m-- ngx_set_misc.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/config[m
[1mdeleted file mode 100644[m
[1mindex 6f27634..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/config[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-ngx_addon_name=ngx_coolkit_module[m
[31m-[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_coolkit_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_coolkit_handlers.c $ngx_addon_dir/src/ngx_coolkit_module.c $ngx_addon_dir/src/ngx_coolkit_variables.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ngx_coolkit_handlers.h $ngx_addon_dir/src/ngx_coolkit_module.h $ngx_addon_dir/src/ngx_coolkit_variables.h"[m
[31m-[m
[31m-have=NGX_COOLKIT_MODULE . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.c[m
[1mdeleted file mode 100644[m
[1mindex bae192c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.c[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#include "ngx_coolkit_handlers.h"[m
[31m-#include "ngx_coolkit_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_override_method_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_coolkit_loc_conf_t  *cklcf;[m
[31m-    ngx_coolkit_ctx_t       *ckctx;[m
[31m-    ngx_str_t                method;[m
[31m-    ngx_conf_bitmask_t      *b;[m
[31m-    ngx_uint_t               original, j;[m
[31m-[m
[31m-    cklcf = ngx_http_get_module_loc_conf(r, ngx_coolkit_module);[m
[31m-    ckctx = ngx_http_get_module_ctx(r, ngx_coolkit_module);[m
[31m-[m
[31m-    /* always test against original request method */[m
[31m-    if ((ckctx != NULL) && (ckctx->overridden_method != 0)) {[m
[31m-        original = ckctx->overridden_method;[m
[31m-    } else {[m
[31m-        original = r->method;[m
[31m-    }[m
[31m-[m
[31m-    if ((cklcf->override_source) && (cklcf->override_methods & original)) {[m
[31m-        if (ngx_http_complex_value(r, cklcf->override_source, &method)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (method.len == 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_coolkit_http_methods;[m
[31m-        for (j = 0; b[j].name.len; j++) {[m
[31m-            if ((b[j].name.len - 1 == method.len)[m
[31m-                && (ngx_strncasecmp(b[j].name.data, method.data, method.len)[m
[31m-                     == 0))[m
[31m-            {[m
[31m-                if (ckctx == NULL) {[m
[31m-                    ckctx = ngx_pcalloc(r->pool, sizeof(ngx_coolkit_ctx_t));[m
[31m-                    if (ckctx == NULL) {[m
[31m-                        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    /*[m
[31m-                     * set by ngx_pcalloc():[m
[31m-                     *[m
[31m-                     *     ckctx->overridden_method = 0[m
[31m-                     *     ckctx->overridden_method_name = { 0, NULL }[m
[31m-                     */[m
[31m-[m
[31m-                    ngx_http_set_ctx(r, ckctx, ngx_coolkit_module);[m
[31m-                }[m
[31m-[m
[31m-                if (ckctx->overridden_method == 0) {[m
[31m-                    ckctx->overridden_method = r->method;[m
[31m-                    ckctx->overridden_method_name = r->method_name;[m
[31m-                }[m
[31m-[m
[31m-                r->method = b[j].mask;[m
[31m-                r->method_name = b[j].name;[m
[31m-                r->method_name.len--; /* "hidden" space */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "coolkit override method: %V", &method);[m
[31m-[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((ckctx != NULL) && (ckctx->overridden_method != 0)[m
[31m-        && (cklcf->override_source == NULL))[m
[31m-    {[m
[31m-        /*[m
[31m-         * Bring back original method in location with[m
[31m-         * "override_method off".[m
[31m-         * This mess happens because this handlers runs twice:[m
[31m-         * in server rewrite and (location) rewrite phases.[m
[31m-         */[m
[31m-[m
[31m-        r->method = ckctx->overridden_method;[m
[31m-        r->method_name = ckctx->overridden_method_name;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.h[m
[1mdeleted file mode 100644[m
[1mindex f58c334..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_COOLKIT_HANDLERS_H_[m
[31m-#define _NGX_COOLKIT_HANDLERS_H_[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_coolkit_override_method_handler(ngx_http_request_t *);[m
[31m-[m
[31m-#endif /* _NGX_COOLKIT_HANDLERS_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.c[m
[1mdeleted file mode 100644[m
[1mindex 423eba1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,270 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#include "ngx_coolkit_handlers.h"[m
[31m-#include "ngx_coolkit_module.h"[m
[31m-#include "ngx_coolkit_variables.h"[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_coolkit_module_commands[] = {[m
[31m-[m
[31m-    { ngx_string("override_method"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_coolkit_conf_override_method,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-static ngx_http_variable_t ngx_coolkit_module_variables[] = {[m
[31m-[m
[31m-    { ngx_string("remote_passwd"), NULL,[m
[31m-      ngx_coolkit_variable_remote_passwd, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("location"), NULL,[m
[31m-      ngx_coolkit_variable_location, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_module_t ngx_coolkit_module_ctx = {[m
[31m-    ngx_coolkit_add_variables,    /* preconfiguration */[m
[31m-    ngx_coolkit_init,             /* postconfiguration */[m
[31m-[m
[31m-    NULL,                         /* create main configuration */[m
[31m-    NULL,                         /* init main configuration */[m
[31m-[m
[31m-    NULL,                         /* create server configuration */[m
[31m-    NULL,                         /* merge server configuration */[m
[31m-[m
[31m-    ngx_coolkit_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_coolkit_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-ngx_module_t ngx_coolkit_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_coolkit_module_ctx,      /* module context */[m
[31m-    ngx_coolkit_module_commands,  /* module directives */[m
[31m-    NGX_HTTP_MODULE,              /* module type */[m
[31m-    NULL,                         /* init master */[m
[31m-    NULL,                         /* init module */[m
[31m-    NULL,                         /* init process */[m
[31m-    NULL,                         /* init thread */[m
[31m-    NULL,                         /* exit thread */[m
[31m-    NULL,                         /* exit process */[m
[31m-    NULL,                         /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-/*[m
[31m- * nginx assumes that HTTP method name is followed by space, so add it here[m
[31m- * instead of allocating memory for copy with added space for each request.[m
[31m- */[m
[31m-ngx_conf_bitmask_t ngx_coolkit_http_methods[] = {[m
[31m-   { ngx_string("GET "),       NGX_HTTP_GET },[m
[31m-   { ngx_string("HEAD "),      NGX_HTTP_HEAD },[m
[31m-   { ngx_string("POST "),      NGX_HTTP_POST },[m
[31m-   { ngx_string("PUT "),       NGX_HTTP_PUT },[m
[31m-   { ngx_string("DELETE "),    NGX_HTTP_DELETE },[m
[31m-   { ngx_string("MKCOL "),     NGX_HTTP_MKCOL },[m
[31m-   { ngx_string("COPY "),      NGX_HTTP_COPY },[m
[31m-   { ngx_string("MOVE "),      NGX_HTTP_MOVE },[m
[31m-   { ngx_string("OPTIONS "),   NGX_HTTP_OPTIONS },[m
[31m-   { ngx_string("PROPFIND "),  NGX_HTTP_PROPFIND },[m
[31m-   { ngx_string("PROPPATCH "), NGX_HTTP_PROPPATCH },[m
[31m-   { ngx_string("LOCK "),      NGX_HTTP_LOCK },[m
[31m-   { ngx_string("UNLOCK "),    NGX_HTTP_UNLOCK },[m
[31m-#if defined(nginx_version) && (nginx_version >= 8041)[m
[31m-   { ngx_string("PATCH "),     NGX_HTTP_PATCH },[m
[31m-#endif[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_coolkit_module_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_coolkit_override_method_handler;[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_coolkit_override_method_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-void *[m
[31m-ngx_coolkit_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_coolkit_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_coolkit_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->override_methods = 0[m
[31m-     */[m
[31m-[m
[31m-    conf->override_source = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_coolkit_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_coolkit_loc_conf_t  *prev = parent;[m
[31m-    ngx_coolkit_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->override_source == NGX_CONF_UNSET_PTR) {[m
[31m-       if (prev->override_source == NGX_CONF_UNSET_PTR) {[m
[31m-           /* default */[m
[31m-           conf->override_methods = 0;[m
[31m-           conf->override_source = NULL;[m
[31m-       } else {[m
[31m-           /* merge */[m
[31m-           conf->override_methods = prev->override_methods;[m
[31m-           conf->override_source = prev->override_source;[m
[31m-       }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_coolkit_conf_override_method(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_str_t                          source = value[cf->args->nelts - 1];[m
[31m-    ngx_coolkit_loc_conf_t            *cklcf = conf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_conf_bitmask_t                *b;[m
[31m-    ngx_uint_t                         i, j;[m
[31m-[m
[31m-    if (cklcf->override_source != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        cklcf->override_source = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (source.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "coolkit: empty source in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        /* override method for all methods */[m
[31m-        cklcf->override_methods = 0xFFFF;[m
[31m-    } else {[m
[31m-        /* override method only for specified methods */[m
[31m-        cklcf->override_methods = 0;[m
[31m-[m
[31m-        for (i = 1; i < cf->args->nelts - 1; i++) {[m
[31m-            b = ngx_coolkit_http_methods;[m
[31m-            for (j = 0; b[j].name.len; j++) {[m
[31m-                if ((b[j].name.len - 1 == value[i].len)[m
[31m-                    && (ngx_strncasecmp(b[j].name.data,[m
[31m-                                        value[i].data, value[i].len) == 0))[m
[31m-                {[m
[31m-                    cklcf->override_methods |= b[j].mask;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "coolkit: invalid method \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cklcf->override_source = ngx_palloc(cf->pool,[m
[31m-                                        sizeof(ngx_http_complex_value_t));[m
[31m-    if (cklcf->override_source == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &source;[m
[31m-    ccv.complex_value = cklcf->override_source;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.h[m
[1mdeleted file mode 100644[m
[1mindex 7419f21..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_COOLKIT_MODULE_H_[m
[31m-#define _NGX_COOLKIT_MODULE_H_[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t        ngx_coolkit_module;[m
[31m-extern ngx_conf_bitmask_t  ngx_coolkit_http_methods[];[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* override_method */[m
[31m-    ngx_uint_t                 override_methods;[m
[31m-    ngx_http_complex_value_t  *override_source;[m
[31m-} ngx_coolkit_loc_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* override_method */[m
[31m-    ngx_uint_t                 overridden_method;[m
[31m-    ngx_str_t                  overridden_method_name;[m
[31m-} ngx_coolkit_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_coolkit_add_variables(ngx_conf_t *);[m
[31m-ngx_int_t   ngx_coolkit_init(ngx_conf_t *);[m
[31m-void       *ngx_coolkit_create_loc_conf(ngx_conf_t *);[m
[31m-char       *ngx_coolkit_merge_loc_conf(ngx_conf_t *, void *, void *);[m
[31m-char       *ngx_coolkit_conf_override_method(ngx_conf_t *, ngx_command_t *,[m
[31m-                void *);[m
[31m-[m
[31m-#endif /* _NGX_COOLKIT_MODULE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.c[m
[1mdeleted file mode 100644[m
[1mindex 6a0d026..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.c[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#include "ngx_coolkit_module.h"[m
[31m-#include "ngx_coolkit_variables.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * source: ngx_http_variables.c/ngx_http_variable_remote_user[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- */[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_variable_remote_passwd(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    rc = ngx_http_auth_basic_user(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = r->headers_in.passwd.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->headers_in.passwd.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_variable_location(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                  rc;[m
[31m-    int                        captures[3];[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (clcf->regex) {[m
[31m-        rc = ngx_regex_exec(clcf->regex->regex, &r->uri, captures, 3);[m
[31m-[m
[31m-        if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->data = r->uri.data + captures[0];[m
[31m-        v->len = captures[1] - captures[0];[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        v->data = clcf->name.data;[m
[31m-        v->len = clcf->name.len;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.h[m
[1mdeleted file mode 100644[m
[1mindex d83e639..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.h[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_COOLKIT_VARIABLES_H_[m
[31m-#define _NGX_COOLKIT_VARIABLES_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_coolkit_variable_remote_passwd(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_coolkit_variable_location(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-[m
[31m-#endif /* _NGX_COOLKIT_VARIABLES_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/location.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/location.t[m
[1mdeleted file mode 100644[m
[1mindex d6c5f4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/location.t[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n  $location;[m
[31m-    }[m
[31m---- request[m
[31m-GET /echo[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-/echo[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: regex[m
[31m---- config[m
[31m-    location ~/echo {[m
[31m-        echo -n  $location;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test/echo/regex[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-/echo[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/override_method.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/override_method.t[m
[1mdeleted file mode 100644[m
[1mindex 009df3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/override_method.t[m
[1m+++ /dev/null[m
[36m@@ -1,279 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: not changed[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: changed[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: inherited[m
[31m---- config[m
[31m-    override_method  $arg_method;[m
[31m-[m
[31m-    location /test {[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not inherited[m
[31m---- config[m
[31m-    override_method  $arg_method;[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  PUT;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-PUT[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: restored[m
[31m---- config[m
[31m-    override_method  $arg_method;[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  off;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: method-specific (changed)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  GET $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: method-specific (not changed)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  PUT $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: method-specific (multiple methods)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  GET HEAD PUT $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: double dance (blocked)[m
[31m---- config[m
[31m-    override_method  GET $arg_method;[m
[31m-    if ($request_method = GET) {[m
[31m-        return 400;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  GET PUT;[m
[31m-        if ($request_method = GET) {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 400[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: double dance (passed)[m
[31m---- config[m
[31m-    override_method  GET $arg_method;[m
[31m-    if ($request_method = GET) {[m
[31m-        return 400;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  GET PUT;[m
[31m-        if ($request_method = GET) {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-PUT[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.34[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: double dance with "off"[m
[31m---- config[m
[31m-    override_method  GET $arg_method;[m
[31m-    if ($request_method = GET) {[m
[31m-        return 400;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  off;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.34[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: changed method passed to upstream[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen  8100;[m
[31m-        location / {[m
[31m-            echo -n      $request_method;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  $arg_method;[m
[31m-        proxy_pass       http://127.0.0.1:8100;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: restored method passed to upstream[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen  8100;[m
[31m-        location / {[m
[31m-            echo -n      $request_method;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    override_method  $arg_method;[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  off;[m
[31m-        proxy_pass       http://127.0.0.1:8100;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/remote_passwd.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/remote_passwd.t[m
[1mdeleted file mode 100644[m
[1mindex 0f5a176..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/t/remote_passwd.t[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n  $remote_passwd;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Authorization: Basic bW9udHk6c29tZV9wYXNz[m
[31m---- request[m
[31m-GET /echo[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-some_pass[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (without Authorization header)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n  $remote_passwd;[m
[31m-    }[m
[31m---- request[m
[31m-GET /echo[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body:[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: accessible from within lua[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.remote_passwd)[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Authorization: Basic bW9udHk6c29tZV9wYXNz[m
[31m---- request[m
[31m-GET /echo[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-some_pass[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex d1f6eb8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_coolkit-0.2rc3/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,612 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr1[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:sendmsg[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_pass_open_channel[m
[31m-fun:ngx_start_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.sendmsg(msg.msg_iov[i])[m
[31m-   fun:__sendmsg_nocancel[m
[31m-   fun:ngx_write_channel[m
[31m-   fun:ngx_signal_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 0fd79d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-tags[m
[31m-cscope.*[m
[31m-*~[m
[31m-*.swp[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex ee54448..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-Copyright (c) 2010-2015, Marcus Clyne[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/README_AUTO_LIB b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/README_AUTO_LIB[m
[1mdeleted file mode 100644[m
[1mindex fd2776f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/README_AUTO_LIB[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-Nginx Auto Lib Core[m
[31m-===================[m
[31m-[m
[31m-Nginx Auto Lib Core is a generic external library-handler that has been designed to[m
[31m-facilitate the inclusion of external libraries in modules for the Nginx web server.[m
[31m-It has been written both for the benefit of Nginx module developers and for the end[m
[31m-users of those Nginx modules, and can provide a consistent, intelligent, flexible[m
[31m-cross-platform way to include external libraries.[m
[31m-[m
[31m-Any developers of Nginx modules are encouraged to use Auto Lib Core to handle library[m
[31m-dependencies for their modules rather than writing their own custom handler from scratch.[m
[31m-[m
[31m-Note : the latest version can be found at github.com/simpl/ngx_auto_lib[m
[31m-[m
[31m-[m
[31m-Information for end users[m
[31m-=========================[m
[31m-[m
[31m-To include external libraries using Auto Lib to you may need or wish to export some[m
[31m-variables before you run configure. e.g.[m
[31m-[m
[31m-$ export MOZJS=/path/to/mozjs[m
[31m-$ export MOZJS_SHARED=NO[m
[31m-$ ./configure ...[m
[31m-[m
[31m-In all cases below [PFX] should be replaced with the name of the library (e.g. MOZJS). The[m
[31m-specific value for [PFX] should be mentioned in the README file for the module that[m
[31m-uses Auto Lib Core.[m
[31m-[m
[31m-[m
[31m-Search order for paths[m
[31m-----------------------[m
[31m-[m
[31m-(1) [PFX]_INC and [PFX]_LIB[m
[31m-(2) [PFX] (source or install dir)[m
[31m-(3) any dirs under [PFX]_BASE (see below)[m
[31m-(4) any dirs under the parent directory of the Nginx source dir beginning with '[pfx]-'[m
[31m-(5) standard system paths (including /usr/local, /usr, /opt/local, /opt, /usr/pkg)[m
[31m-[m
[31m-If any of 1-3 are specified, then any set values will be searched, and the the Nginx[m
[31m-source's parent directory and system paths are not searched unless [PFX]_SEARCH_[PLACE][m
[31m-variable is set to YES, where PLACE ::= PARENT | SYSTEM. e.g.[m
[31m-[m
[31m-$ export OPENSSL_LIB=/path/to/openssl/lib[m
[31m-$ export OPENSSL_INC=/path/to/openssl/inc[m
[31m-$ ./configure[m
[31m-[m
[31m-will search only in the lib and include paths specified, and[m
[31m-[m
[31m-$ export OPENSSL_LIB=/path/to/openssl/lib[m
[31m-$ export OPENSSL_INC=/path/to/openssl/inc[m
[31m-$ export OPENSSL_BASE=/path/to/openssl/base[m
[31m-$ export OPENSSL_SEARCH_PARENT=YES[m
[31m-$ ./configure --with-openssl=/path/to/openssl[m
[31m-[m
[31m-will search first in the lib & inc dirs specified, then in /path/to/openssl, then will[m
[31m-look for directories in /path/to/openssl/base and then in the Nginx source parent[m
[31m-directory, but will skip checking the system paths.[m
[31m-[m
[31m-Note : apart from system paths, all dirs are checked as both source and install directories,[m
[31m-so static versions of installed OpenSSL, PCRE, Zlib etc libraries can be used with Nginx[m
[31m-if desired.[m
[31m-[m
[31m-[m
[31m-Specifying a path to find a library[m
[31m------------------------------------[m
[31m-[m
[31m-If the version of a library you wish to include is in any of the standard paths (e.g.[m
[31m-/usr/local, /usr ...), you will not need to specify a path to include the library.[m
[31m-[m
[31m-If you do wish to specify a specific path, in most cases just specifying [m
[31m-[PFX]=/path/to/library will be sufficient. e.g.[m
[31m-[m
[31m-$ export MOZJS=/path/to/mozjs[m
[31m-$ ./configure ...[m
[31m-[m
[31m-The path can be either a source directory or an install directory. Auto Lib will search[m
[31m-[m
[31m-[m
[31m-Searching under base paths[m
[31m---------------------------[m
[31m-[m
[31m-Rather than specifying a specific path to find new libraries in non-standard locations,[m
[31m-you may wish to specify a base path (or just let Auto Lib search the directory that the[m
[31m-Nginx source is located in). This will then automatically find the most recent versions[m
[31m-of libraries and check them before older versions.[m
[31m-[m
[31m-e.g.[m
[31m-[m
[31m-You have installations[m
[31m-[m
[31m-/openssl/version/0.9.8m[m
[31m-/openssl/version/1.0.0a[m
[31m-...[m
[31m-[m
[31m-$ export OPENSSL_BASE=/openssl/version[m
[31m-$ ./configure ...[m
[31m-[m
[31m-Any directories under /openssl/version will be searched IN REVERSE ORDER, i.e. most recent[m
[31m-version first. Here /openssl/version/1.0.0a would be searched before /openssl/version/0.9.8m.[m
[31m-[m
[31m-If [PFX]_BASE_SEARCH_PREFIX=YES, then only directories beginning with '[pfx]-' are searched.[m
[31m-If [PFX]_BASE_SEARCH_PREFIX=something, then only directories beginning with 'something' are[m
[31m-searched.[m
[31m-[m
[31m-When searching under [PFX]_BASE no prefix is added to the search, but when searching under[m
[31m-the directory that the Nginx source is located in, the prefix [pfx]- is automatically added.[m
[31m-[m
[31m-Note : there is currently a minor bug (due to the implementation of the 'sort' command) [m
[31m-means versions that include hyphens (e.g. 1.0.0-beta5) are checked before versions like [m
[31m-1.0.0a. This will be fixed soon, and searching of -build folders before normal source ones[m
[31m-will be added too.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Shared or static?[m
[31m------------------[m
[31m-[m
[31m-The default for most libraries is to look for shared libraries, though this can be overridden[m
[31m-by the user by setting [PFX]_SHARED=NO.[m
[31m-[m
[31m-In the near future the default action will be to look for shared libraries then to look [m
[31m-for static libraries in each directory searched unless one of [PFX]_SHARED and/or[m
[31m-[PFX]_STATIC = NO. If both are set to NO, then Auto Lib will not be used at all.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Variables that users can set to help find libraries[m
[31m----------------------------------------------------[m
[31m-[m
[31m-[PFX]                   Location of dir where the library can be found      (PATH, see below)[m
[31m-[PFX]_INC               Include dir for library headers                     (PATH)[m
[31m-[PFX]_LIB               Lib dir for library archive/shared objects          (PATH)[m
[31m-[PFX]_BASE              Base dir under which to search for other dirs       (PATH)[m
[31m-[PFX]_SEARCH_LIB_INC    Search in [PFX]_INC and [PFX]_LIB if set            (YES|NO, def=YES)[m
[31m-[PFX]_SEARCH_DIR        Search [PFX] if set                                 (YES|NO, def=YES)[m
[31m-[PFX]_SEARCH_BASE       Search under [PFX]_BASE if set                      (YES|NO, def=YES)[m
[31m-[PFX]_SEARCH_PARENT     Search under the dir that the Nginx source is in    (YES|NO, see above)[m
[31m-[PFX]_SEARCH_SYSTEM     Search in standard system paths                     (YES|NO, see above)[m
[31m-[PFX]_SHARED            Use shared library rather than static               (YES|NO, def=YES)[m
[31m-[PFX]_SYSTEM_DIRS       System dirs to search in (PATHS, space-separated, overrides the defaults)[m
[31m-USE_[PFX]               Whether or not to install the library               (YES|NO, def=YES)[m
[31m-[m
[31m-[m
[31m-Note : for libraries that have configure options (e.g. --with-openssl=/path), the [PFX][m
[31m-variable is set automatically by configure, so will not be used if exported.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Information for module developers[m
[31m-=================================[m
[31m-[m
[31m-How Auto Lib Core works[m
[31m------------------------[m
[31m-[m
[31m-Auto Lib Core works as an interface layer between the module and the auto/feature part of[m
[31m-the Nginx source. This is the file that results in the 'checking for ...' lines that you [m
[31m-see when you call ./configure.[m
[31m-[m
[31m-auto/feature works by using a few key variables (see below) to generate some C code, trying[m
[31m-to compile it to see if it works and optionally running the code. This output file is called[m
[31m-autotest.c (located under the objs/ directory whilst configure is running, but is deleted[m
[31m-after each call to auto/feature).[m
[31m-[m
[31m-Normally, whenever an external library is required, a module developer will write a number [m
[31m-of calls to auto/feature manually in their config files - e.g. to check under a range of [m
[31m-different possible locations to find a library. Apart from being tedious, this is obviously[m
[31m-potentially error-prone.[m
[31m-[m
[31m-Auto Lib Core will automatically generate all the calls to auto/feature for you, and will[m
[31m-take into account different operating systems etc in a consistent way, 'intelligent' way.[m
[31m-[m
[31m-[m
[31m-Including Nginx Auto Lib Core with custom modules[m
[31m--------------------------------------------------[m
[31m-[m
[31m-Option 1 :[m
[31m-[m
[31m-- include ngx_auto_lib_core in the same directory that your module config file is[m
[31m-  located[m
[31m-- add the following line to your config file[m
[31m-[m
[31m-  . $ngx_addon_dir/ngx_auto_lib_core [m
[31m-[m
[31m-NOTE : if you want to include the file in a different directory to your config[m
[31m-file, you will need to change both the include line in your config file AND[m
[31m-the line in the ngx_auto_lib_core file that points to the file (it's the line that[m
[31m-has $ngx_addon_dir/ngx_auto_lib_core in it)[m
[31m-[m
[31m-Option 2 :[m
[31m-[m
[31m-- make the Nginx Development Kit (github.com/simpl-it/ngx_devel_kit) a dependency [m
[31m-  for your module (Auto Lib Core is included automatically with it)[m
[31m-[m
[31m-[m
[31m-Recommended way of including Auto Lib Core[m
[31m-------------------------------------------[m
[31m-[m
[31m-If the Nginx Development Kit (NDK) is already a dependency for your module, then you do[m
[31m-not need to do anything - just follow the 'using Auto Lib Core' instructions below.[m
[31m-[m
[31m-If the NDK is not a dependency for your module, then it is recommended to include a[m
[31m-copy of ngx_auto_lib_core with your module, but to recommend to users of your module[m
[31m-to include the NDK when compiling. If the module is not required for anything else, this[m
[31m-will not make any difference to the Nginx binary that they compile, but will mean they[m
[31m-will get the latest version of Auto Lib Core (which probably won't change much anyway,[m
[31m-but you never know).[m
[31m-[m
[31m-You will also probably want to include a copy of this readme file for Auto Lib Core[m
[31m-(at least the user section), and mention what the relevant [PFX] you use for your module[m
[31m-is in your module's readme file so that users will know what to write for any variables[m
[31m-that they might use to control the search paths for libraries (see above user section).[m
[31m-[m
[31m-[m
[31m-Using Auto Lib Core[m
[31m--------------------[m
[31m-[m
[31m-To use Auto Lib Core, you should do the following in your config file for each[m
[31m-external library that you want to include :[m
[31m-[m
[31m-1 - Call ngx_auto_lib_init[m
[31m-2 - Define any variables used for testing[m
[31m-3 - Define any hooks (custom functions)[m
[31m-4 - Call ngx_auto_lib_run[m
[31m-[m
[31m-[m
[31m-Calling ngx_auto_lib_init() and ngx_auto_lib_run()[m
[31m---------------------------------------------------[m
[31m-[m
[31m-You can pass either one or two variables to ngx_auto_lib_init(). The first is the name of[m
[31m-the library as it will appear when running ./configure, the second is the prefix that is[m
[31m-used for internal variables and looking for directory prefixes. If the second is not [m
[31m-specified, it defaults to the first.[m
[31m-[m
[31m-The init function resets all key variables and functions, so it must be called before [m
[31m-setting any other variables or functions that are to be used as hooks (see the notes below).[m
[31m-[m
[31m-ngx_auto_lib_run() should be called in the config files after all the variables and hooks[m
[31m-have been defined. This will then run through all the tests to try to find the external[m
[31m-library.[m
[31m-[m
[31m-[m
[31m-Variables you can set in your config files[m
[31m-------------------------------------------[m
[31m-[m
[31m-All the variables that you set in Auto Lib Core are similar to the ones you set for[m
[31m-including libraries in the normal way.[m
[31m-[m
[31m-       name                           description[m
[31m-----------------------------------------------------------------------------------------[m
[31m-[m
[31m-core variables (i.e. the ones in the core Nginx source)[m
[31m-[m
[31m-ngx_feature_inc_path                CFLAGS and include path info (including -I)[m
[31m-ngx_feature_incs                    Include/define code inserted before main() in autotest.c[m
[31m-ngx_feature_libs                    External libraries to add (see below)[m
[31m-ngx_feature_path                    Space-separated include path[m
[31m-ngx_feature_run                     Whether to run the autotest binary (default = no)[m
[31m-ngx_feature_test                    C-code inserted inside main() in autotest.c[m
[31m-[m
[31m-extended variables (only work in NALC) :[m
[31m-[m
[31m-ngx_feature_add_libs                Add libraries (but do not add include files)[m
[31m-ngx_feature_add_path                Add extra directories to include path[m
[31m-ngx_feature_build_dirs              Sub dirs that builds might be found[m
[31m-ngx_feature_build_inc_dirs          Sub dirs that include files might be found[m
[31m-ngx_feature_build_lib_dirs          Sub dirs that lib files might be found[m
[31m-ngx_feature_check_macros_defined    Lib required only if one of these macros is defined[m
[31m-ngx_feature_check_macros_non_zero   Lib required only if one of these macros is non-zero[m
[31m-ngx_feature_defines                 Define these macros if the library is found[m
[31m-ngx_feature_deps                    Deps to add (e.g. to CORE_DEPS) if the library is found[m
[31m-ngx_feature_exit_if_not_found       Quit configure if the library is not found[m
[31m-ngx_feature_haves                   Set these macros to 1 if the library is found[m
[31m-ngx_feature_inc_names               Names for include files (not including the .h)[m
[31m-ngx_feature_lib_files               Add these files under the lib dir for static inclusions[m
[31m-ngx_feature_lib_names               Names for lib files (not including -l or .a)[m
[31m-ngx_feature_modules                 Modules to add if the library is found[m
[31m-ngx_feature_srcs                    Sources to add (e.g. to ADDON_SRCS) if the lib is found[m
[31m-ngx_feature_shared                  If set to 'no', then only use static lib versions[m
[31m-ngx_feature_test_libs               Add these libs when testing, but not to the final binary[m
[31m-ngx_feature_variables               Set these variables if the library is found[m
[31m-[m
[31m-standard variables that are completely over-written (i.e. they won't work with NALC) :[m
[31m-[m
[31m-ngx_feature_name                    Message that is displayed after 'checking for' in configure[m
[31m-[m
[31m-[m
[31m-Using these variables[m
[31m----------------------[m
[31m-[m
[31m-You do not need to set most of these variables, since 'intelligent' guesses are made that[m
[31m-will work for most cases. With the exception of ngx_feature_test, you should generally use[m
[31m-the extended variables rather than the core ones, since sensible core variables will be[m
[31m-automatically generated from them, and will work for both static and shared libraries.[m
[31m-[m
[31m-[m
[31m-Variable defaults[m
[31m------------------[m
[31m-[m
[31m-ngx_feature_incs            for i in $ngx_feature_inc_names { #include <$i.h> }[m
[31m-ngx_feature_libs            for l in $ngx_feature_lib_names { -l$l or $LIB/lib$l.a }[m
[31m-                            + $ngx_feature_add_libs[m
[31m-ngx_feature_inc_names       $ngx_feature_lib_names[m
[31m-ngx_feature_lib_names       $pfx[m
[31m-pfx                         str_to_lower (if two variables are passed to ngx_auto_lib_init, then[m
[31m-                            then $2, otherwise, $1)[m
[31m-[m
[31m-The easiest way to understand how all the defaults work is probably to look at the source code[m
[31m-of ngx_auto_lib_test_setup() and to look at the examples in the standard Nginx Auto Lib module[m
[31m-which has code for OpenSSL, PCRE, Zlib, MD5 and SHA1.[m
[31m-[m
[31m-[m
[31m-Hooks[m
[31m------[m
[31m-[m
[31m-To facilitate using Auto Lib Core in a flexible way, a number of 'hooks' have been[m
[31m-placed in the testing cycle. These hooks are implemented as functions that you define[m
[31m-in your config file which are called if required by the core library. In the core [m
[31m-library they are left as empty functions that return either 0 or 1. Any functions[m
[31m-you write will [m
[31m-[m
[31m-Note : ngx_auto_lib_init() resets the variables and functions each time it is called, so[m
[31m-you must DEFINE HOOKS AFTER YOU CALL ngx_auto_lib_init.[m
[31m-[m
[31m-Note : an update on what hooks are available will be added later. To see what hooks are[m
[31m-available, just look in the source code of ngx_auto_lib_core for any functions that just[m
[31m-return 0 or 1.[m
[31m-[m
[31m-See the MD5 and SHA1 libraries of Nginx Auto Lib module for examples.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Checking that a library is required[m
[31m------------------------------------[m
[31m-[m
[31m-Although in most cases Auto Lib Core will be used where external libraries are[m
[31m-definitely required (for a module to work), this may not always be the case. In the[m
[31m-standard Nginx Auto Lib module (github.com/simpl-it/ngx_auto_lib) - which is designed[m
[31m-to improve the inclusion of OpenSSL, PCRE and Zlib libraries and increase compilation[m
[31m-speed where possible - the libraries are not always required, so checks are made to [m
[31m-see if it is necessary.[m
[31m-[m
[31m-[m
[31m-[m
[31m-How Auto Lib Core checks if a library is required - ngx_auto_lib_check_require()[m
[31m-------------------------------------------------------------------------------------[m
[31m-[m
[31m-- search for USE_[PFX]=YES (it is set to YES by default for most modules)[m
[31m-- search for any external libraries that have been included in the CORE_LIBS or ADDON_LIBS[m
[31m-  variables that use the same lib name as any set in ngx_feature_lib_names[m
[31m-- search for any macros that have been defined either in the CFLAGS variable or using [m
[31m-  auto/have or auto/define as set in the ngx_feature_check_macros_defined and [m
[31m-  ngx_feature_ngx_macros_non_zero variables[m
[31m-- any custom checks implemented by creating an ngx_auto_lib_check hook function (which[m
[31m-  should return 0 if the library is required and return 1 at the end if the module is [m
[31m-  not required)[m
[31m-[m
[31m-[m
[31m-[m
[31m-Guaranteeing that the correct version of a shared library is linked at run time[m
[31m--------------------------------------------------------------------------------[m
[31m-[m
[31m-Sometimes users will want to use shared libraries that are in non-standard locations[m
[31m-that the linker may have a problem in locating at run time - even if the correct[m
[31m-linker path (-L/path/to/lib) is supplied when checking. To make sure that the linker[m
[31m-can find the library at run time, and to make sure that the linker will use the correct[m
[31m-version of a library if the library is also located in a standard directory, a run path[m
[31m-is added to the linker flags (using -Wl,--rpath -Wl,/path/to/lib/dir). In most cases this[m
[31m-will guarantee that the correct library is used when linking - though care should be taken[m
[31m-by any users specifying specific paths for libraries that the correct version of the[m
[31m-library has been linked at run time (e.g. using ldd etc).[m
[31m-[m
[31m-As an additional check when running auto/feature, as well as the compilation of the[m
[31m-autotest.c file, a check is made by ldd to see that the path of the shared library[m
[31m-that the linker links to is the same as the one specified. This is done because[m
[31m-[m
[31m-[m
[31m-To do[m
[31m------[m
[31m-[m
[31m-- change how library paths are searched to include both shared and static libraries[m
[31m-- touch up documentation[m
[31m-[m
[31m-[m
[31m-License[m
[31m--------[m
[31m-[m
[31m-    BSD[m
[31m-[m
[31m-[m
[31m-Copyright[m
[31m----------[m
[31m-[m
[31m-    Marcus Clyne (c) 2010  (http://simpl.it)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/TODO b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/TODO[m
[1mdeleted file mode 100644[m
[1mindex 0acf8bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/TODO[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-- for backward compatability, add the ndk_macros [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/actions/array b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/actions/array[m
[1mdeleted file mode 100644[m
[1mindex 04cd889..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/actions/array[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-[m
[31m-array_create        (a,pl,n,sz)     a = %1%_array_create (pl,n,sz); if (a == NULL) %A%[m
[31m-array_init          (a,pl,n,sz)     if (%1%_array_init (a,pl,n,sz) == %E%) %A%[m
[31m-array_push          (p,a)           p = %1%_array_push (a);     if (p == NULL) %A%[m
[31m-array_push_clean    (p,a)           p = %1%_array_push (a);     if (p == NULL) %A%; %2%_zerop (p)[m
[31m-array_push_n        (p,a,n)         p = %1%_array_push_n (a,n); if (p == NULL) %A%[m
[31m-array_push_n_clean  (p,a,n)         p = %1%_array_push_n (a,n); if (p == NULL) %A%; %2%_zeropn (p,n)[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/actions/palloc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/actions/palloc[m
[1mdeleted file mode 100644[m
[1mindex 6d430bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/actions/palloc[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-[m
[31m-palloc              (p,pl,sz)       p = %1%_palloc (pl,sz);    if (p == NULL) %A%[m
[31m-pallocp             (p,pl)          %2%_pallocp (p,pl);        if (p == NULL) %A%[m
[31m-pallocpn            (p,pl,n)        %2%_pallocpn (p,pl,n);     if (p == NULL) %A%[m
[31m-pcalloc             (p,pl,sz)       p = %1%_pcalloc (pl,sz);   if (p == NULL) %A%[m
[31m-pcallocp            (p,pl)          %2%_pcallocp (p,pl);       if (p == NULL) %A%[m
[31m-pcallocpn           (p,pl,n)        %2%_pcallocpn (p,pl,n);    if (p == NULL) %A%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/build b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/build[m
[1mdeleted file mode 100644[m
[1mindex feb84b3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/build[m
[1m+++ /dev/null[m
[36m@@ -1,597 +0,0 @@[m
[31m-#! /bin/bash[m
[31m-[m
[31m-cd `dirname $0`[m
[31m-[m
[31m-if [ $# -eq 2 ];[m
[31m-then[m
[31m-  if [ `expr $2 : /` -eq 1 ];[m
[31m-  then[m
[31m-    output_dir=$2[m
[31m-  else[m
[31m-    output_dir=$1/$2[m
[31m-  fi[m
[31m-else[m
[31m-    output_dir=../objs[m
[31m-fi[m
[31m-[m
[31m-list_file=data/action_list[m
[31m-types_file=data/action_types[m
[31m-reps_file=data/action_replacements[m
[31m-prefix_file=data/prefixes [m
[31m-header_file=data/header_files[m
[31m-optional_modules_file=data/modules_optional[m
[31m-headers_file=data/headers[m
[31m-module_dependencies_file=data/module_dependencies[m
[31m-conf_macros_file=data/conf_macros[m
[31m-conf_locs_file=data/conf_locs[m
[31m-conf_args_file=data/conf_args[m
[31m-[m
[31m-autogen_notice=text/autogen[m
[31m-[m
[31m-actions_dir=actions[m
[31m-srcs_dir=src[m
[31m-include_prefix=[m
[31m-file_prefix=ndk_[m
[31m-auto_file_name=config[m
[31m-auto_includes_name=includes[m
[31m-[m
[31m-conf_merge_filename=conf_merge.h[m
[31m-conf_cmd_basic_filename=conf_cmd_basic.h[m
[31m-conf_cmd_extra_filename=conf_cmd_extra.h[m
[31m-[m
[31m-[m
[31m-spacer=¬[m
[31m-[m
[31m-sed_delete_empty_lines='t_NEL;d;:_NEL'[m
[31m-[m
[31m-[m
[31m-function trim_lines {[m
[31m-    sed -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}'[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function strtoupper {[m
[31m-    [ $# -eq 1 ] || return 1[m
[31m-    local _str _cu _cl _x[m
[31m-    _cu=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)[m
[31m-    _cl=(a b c d e f g h i j k l m n o p q r s t u v w x y z)[m
[31m-    _str=$1[m
[31m-    for ((_x=0;_x<${#_cl[*]};_x++)); do[m
[31m-        _str=${_str//${_cl[$_x]}/${_cu[$_x]}}[m
[31m-    done[m
[31m-    echo $_str[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function sed_pad_right {[m
[31m-    len=$1[m
[31m-    spacer=$2[m
[31m-    prefix=_PR$3[m
[31m-[m
[31m-    # returns a SED script that pads out (spaces) to the right to alignment $len[m
[31m-    # this script should be used inside a call to sed[m
[31m-    # NOTE : a spacer character $spacer should have already been written into the parsed string[m
[31m-[m
[31m-    echo "t${prefix}a;:${prefix}a;s/^[^$spacer]{$len}/&/;\[m
[31m-t${prefix}b;s/^[^$spacer]*/& /;t${prefix}a;:${prefix}b;s/$spacer/ /"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function sed_pad_left {[m
[31m-[m
[31m-    len=$1[m
[31m-    spacer=$2[m
[31m-    prefix=_PL$3[m
[31m-[m
[31m-   # echo "t${prefix}a;:${prefix}a;s/^[^$spacer]{$len}/& /;t${prefix}a"     # NOT CORRECT?[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_notice {[m
[31m-[m
[31m-    echo > $1[m
[31m-    cat $autogen_notice | trim_lines >> $1[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-function add_non_generated_content {[m
[31m-[m
[31m-    file=src/$1.h[m
[31m-    [ ! -f $file ] && return[m
[31m-[m
[31m-    echo "/* Non-generated macros */" >> $2[m
[31m-    echo >> $2[m
[31m-[m
[31m-    cat $file | trim_lines >> $2[m
[31m-[m
[31m-    echo >> $2[m
[31m-    echo >> $2[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_action_macros {[m
[31m-[m
[31m-    list_file=$actions_dir/$1[m
[31m-[m
[31m-    [ ! -f $list_file ] && return[m
[31m-[m
[31m-    out=$2[m
[31m-[m
[31m-[m
[31m-    # alignment settings[m
[31m-[m
[31m-    align1=20[m
[31m-    align2=35[m
[31m-    align3=62[m
[31m-    base_shrink=12[m
[31m-    define="#define     "[m
[31m-[m
[31m-[m
[31m-[m
[31m-    # base macros[m
[31m-[m
[31m-    echo "/* base action macro macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    cat $list_file | trim_lines | sed -r \[m
[31m-    -e "s/^[ ]*([a-zA-Z0-9_]+)([ ]*)\(([a-zA-Z0-9_,]+)\)([ ]*)(.*)/$define%2%_\1_ac(\3,ac)\2\4  {\5;}/" \[m
[31m-    -e "s/[ ]{$base_shrink}\{/\{/" \[m
[31m-    -e 's/%A%/ac/g' \[m
[31m-    >> $out[m
[31m-[m
[31m-    echo >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-[m
[31m-    # generated macros[m
[31m-[m
[31m-    echo "/* generated action macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    cat -s $list_file | while read list_line; do[m
[31m-[m
[31m-        [ "x`echo $list_line`" = 'x' ] && continue[m
[31m-[m
[31m-        cat $types_file | while read type_line; do[m
[31m-[m
[31m-            [ "x`echo $type_line`" = 'x' ] && continue  [m
[31m-[m
[31m-            #ext=`echo $type_line | grep -E '^[a-zA-Z0-9_]+' | cut -d " " -f1`[m
[31m-            ext=`echo $type_line | sed -r 's/^([a-zA-Z0-9_]+).*/\1/'`[m
[31m-            params=`echo $type_line | sed -r 's/^[a-zA-Z0-9_]+[ ]*\((.*)\).*/\1/;ta;d;:a'`[m
[31m-            act=`echo $type_line | sed -r 's/^[a-zA-Z0-9_]+[ ]*(\(.*\))?(.*)/\2/'`[m
[31m-            [ "x$params" != "x" ] && params=",$params"[m
[31m-[m
[31m-            echo $list_line | sed -r \[m
[31m-            -e "s/^([a-zA-Z0-9_]+)[ ]*\(([a-zA-Z0-9_,]+)\).*/%2%_\1_$ext(\2$params)$spacer%2%_\1_ac$spacer(\2,$act)/" \[m
[31m-            -e 's/[ ]*,[ ]*/,/g' \[m
[31m-            -e "`sed_pad_right $align2 $spacer 1`" \[m
[31m-            -e "`sed_pad_right $align3 $spacer 2`" \[m
[31m-            -e "s/.*/$define&/" \[m
[31m-            >> $out[m
[31m-        done[m
[31m-        echo >> $out[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function replace_prefixes {[m
[31m-[m
[31m-    temp=.temp[m
[31m-[m
[31m-    file=`cat $prefix_file`[m
[31m-[m
[31m-    prefix1=[m
[31m-    prefix2=[m
[31m-[m
[31m-    for prefix in $file ; do[m
[31m-        [ "x$prefix2" != "x" ] && echo "Too many prefixes in prefix file $prefix_file" && exit 1[m
[31m-        [ "x$prefix1" != "x" ] && prefix2=$prefix && continue[m
[31m-        prefix1=$prefix[m
[31m-    done[m
[31m-[m
[31m-    sed -r "s/%1%/$prefix1/g;s/%2%/$prefix2/g" < $1 > $temp[m
[31m-[m
[31m-    mv -f $temp $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function replace_other_strings {[m
[31m-[m
[31m-    temp=.temp[m
[31m-[m
[31m-    cat $reps_file | while read line; do[m
[31m-[m
[31m-        rep1=[m
[31m-        rep2=[m
[31m-[m
[31m-        for rep in $line ; do[m
[31m-            [ "x$rep2" != "x" ] && echo "Too many replacments in replacements file $reps_file" && exit 1[m
[31m-            [ "x$rep1" != "x" ] && rep2=$rep && continue[m
[31m-            rep1=$rep[m
[31m-        done[m
[31m-[m
[31m-        sed -r "s/%$rep1%/$rep2/g" < $1 > $temp[m
[31m-        mv -f $temp $1[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_header_file {[m
[31m-[m
[31m-    name=$1[m
[31m-    out=$output_dir/$file_prefix$name.h[m
[31m-[m
[31m-    add_notice $out[m
[31m-    add_non_generated_content $name $out[m
[31m-    add_action_macros $name $out[m
[31m-    replace_prefixes $out[m
[31m-    replace_other_strings $out[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_auto_include {[m
[31m-    echo "#include  <${file_prefix}$2>" >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_include {[m
[31m-    echo "#include  <${include_prefix}${file_prefix}$2>" >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_non_optional_h_includes {[m
[31m-[m
[31m-    # TODO : split into auto-generated and non-auto-generated ones[m
[31m-[m
[31m-    echo "/* non-optional includes */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    for mod in `cat $headers_file | sort`; do[m
[31m-[m
[31m-        add_auto_include  $1  $mod.h[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_include_all_includes {[m
[31m-[m
[31m-    echo "/* include all optional modules */" >> $1[m
[31m-    echo >> $1[m
[31m-    echo "#ifdef NDK_ALL" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    modules=`cat $optional_modules_file | sed 's/*//g' | sort`[m
[31m-[m
[31m-    for mod in $modules; do[m
[31m-        def="NDK_`strtoupper $mod`"[m
[31m-        echo "#ifndef $def" >> $1[m
[31m-        echo "#define $def 1" >> $1[m
[31m-        echo "#endif" >> $1[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo "#endif" >> $1[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_dependent_includes {[m
[31m-[m
[31m-    echo "/* module dependencies */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    cat $module_dependencies_file | while read line; do[m
[31m-[m
[31m-        first=1[m
[31m-[m
[31m-        for mod in $line; do[m
[31m-[m
[31m-            def="NDK_`strtoupper $mod`"[m
[31m-[m
[31m-            if [ $first = 1 ] ; then[m
[31m-[m
[31m-                echo "#ifdef  $def" >> $1[m
[31m-                first=0[m
[31m-            else[m
[31m-                echo "#ifndef $def" >> $1[m
[31m-                echo "#define $def 1" >> $1[m
[31m-                echo "#endif" >> $1[m
[31m-            fi[m
[31m-        done[m
[31m-[m
[31m-        [ $first = 0 ] && echo "#endif" >> $1[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_optional_h_includes {[m
[31m-[m
[31m-    echo "/* optional includes */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    for mod in $modules; do[m
[31m-        def="NDK_`strtoupper $mod`"[m
[31m-        echo "#if ($def)" >> $1[m
[31m-        add_include  $1  $mod.h[m
[31m-        echo "#endif" >> $1[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_conf_merge_macros_file {[m
[31m-[m
[31m-    file=$conf_merge_filename[m
[31m-    out_file=${file_prefix}$file[m
[31m-    out=$output_dir/$out_file[m
[31m-[m
[31m-    add_notice $out[m
[31m-[m
[31m-    echo "/* conf-merge-value macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    cat $srcs_dir/$file | trim_lines >> $out[m
[31m-    echo >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    echo "/* conf-merge-prop macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    echo "#define     ndk_conf_merge_prop(prop,default)\\" >> $out[m
[31m-    echo "            ndk_conf_merge_value\\" >> $out[m
[31m-    echo "                (conf->prop, prev->prop, default)" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    # loads macros, removes empty elements, sorts and translates to merge-prop macros[m
[31m-[m
[31m-    cat $conf_macros_file | sed -r 's/^[A-Z0-9_]+[ ]*[A-Z0-9_]+[ ]*([a-z0-9_]+).*$/\1/;ta;d;:a' \[m
[31m-        | sort | sed -r \[m
[31m-        's/(.*)/#define     ndk_conf_merge_\1_prop(prop,default,...)\\\[m
[31m-            ndk_conf_merge_\1_value\\\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)\[m
[31m-    /' \[m
[31m-    >> $out[m
[31m-[m
[31m-    add_auto_include $1 $file[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_conf_cmd_basic_file {[m
[31m-[m
[31m-    temp=.rep[m
[31m-    file=$conf_cmd_basic_filename[m
[31m-    out_file=${file_prefix}$file[m
[31m-    out=$output_dir/$out_file[m
[31m-[m
[31m-    align1=35[m
[31m-[m
[31m-    # initial text[m
[31m-[m
[31m-    add_notice $out[m
[31m-[m
[31m-[m
[31m-    # add ndk bitmasks[m
[31m-[m
[31m-    echo "/* conf cmd core values/bitmasks */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-    cat $conf_args_file | sort | trim_lines | sed -r \[m
[31m-    -e "s/^([A-Z0-9_]+)/${define}NDK_\1${spacer}NGX_\1/" \[m
[31m-    -e $sed_delete_empty_lines \[m
[31m-    -e  "`sed_pad_right $align1 $spacer`" \[m
[31m-    >> $out[m
[31m-[m
[31m-    echo >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-    # add additional bitmasks stored in file[m
[31m-[m
[31m-    echo "/* conf cmd bitmasks */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    cat $srcs_dir/$conf_cmd_basic_filename | trim_lines >> $out[m
[31m-[m
[31m-    echo >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    echo "/* conf cmd basic macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-    # build replacement string[m
[31m-[m
[31m-    echo -n "s/^([A-Z0-9_]+)$/" > $temp[m
[31m-[m
[31m-    cat $conf_locs_file | sed \[m
[31m-    -r -e 's/^([A-Z0-9_]+) *([A-Z0-9_]+).*/#define     NDK_\1_CONF_\\1\(name,func,off1,off2,post)\\\\\\\[m
[31m-                                    {ngx_string (name),\\\\\\\[m
[31m-                                    NGX_CONF_\\1|NDK_\1_CONF,\\\\\\\[m
[31m-                                    func, off1, off2, post},\\\[m
[31m-\\/' -e $sed_delete_empty_lines \[m
[31m-    >> $temp[m
[31m-[m
[31m-    echo -n "/;$sed_delete_empty_lines" >> $temp[m
[31m-[m
[31m-[m
[31m-    # apply the replacement string to the [m
[31m-[m
[31m-    cat $conf_args_file | sort | trim_lines | sed -rf $temp >> $out[m
[31m-    rm -f $temp[m
[31m-[m
[31m-    add_auto_include $1 $file[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_conf_cmd_extra_file {[m
[31m-[m
[31m-    temp=.rep[m
[31m-    file=$conf_cmd_extra_filename[m
[31m-    out=$output_dir/${file_prefix}$file[m
[31m-[m
[31m-    align1=35[m
[31m-[m
[31m-    # initial text[m
[31m-[m
[31m-    add_notice $out[m
[31m-[m
[31m-    echo "/* conf command macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-    # build replacement string[m
[31m-[m
[31m-    echo -n 's/^([A-Z0-9_]+)[ ]*([A-Z0-9_]+)[ ]*([a-z0-9_]+).*$/' > $temp[m
[31m-[m
[31m-    cat $conf_locs_file | sed \[m
[31m-    -r -e 's/^([A-Z0-9_]+)[ ]*([A-Z0-9_]+)[ ]*([a-zA-Z0-9_]+)/#define     NDK_\1_CONF_\\1(name,p,post\)\\\\\\\[m
[31m-            NDK_\1_CONF_\\2\\\\\\\[m
[31m-                (name,\\\\\\\[m
[31m-                ndk_conf_set_\\3_slot,\\\\\\\[m
[31m-                NGX_\2_CONF_OFFSET,\\\\\\\[m
[31m-                offsetof (ndk_module_\3_conf_t, p),\\\\\\\[m
[31m-                post)\\\[m
[31m-\\/' -e $sed_delete_empty_lines \[m
[31m-    >> $temp[m
[31m-[m
[31m-    echo -n "/;$sed_delete_empty_lines" >> $temp[m
[31m-    #echo -n ";`sed_pad_right 60 $spacer`" >> $temp[m
[31m-[m
[31m-[m
[31m-    # apply the replacement string to the [m
[31m-[m
[31m-    cat $conf_macros_file | sort | trim_lines | sed -rf $temp -e "`sed_pad_right 60 $spacer`" >> $out[m
[31m-    rm -f $temp[m
[31m-[m
[31m-    add_auto_include $1 $file[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_auto_generated_h_includes {[m
[31m-[m
[31m-    echo "/* auto-generated headers */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    for name in `cat $header_file | sort` ; do[m
[31m-[m
[31m-        generate_header_file $name[m
[31m-        add_auto_include $1 $name.h[m
[31m-    done[m
[31m-[m
[31m-    generate_conf_merge_macros_file $1[m
[31m-    generate_conf_cmd_basic_file $1[m
[31m-    generate_conf_cmd_extra_file $1[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_optional_c_includes {[m
[31m-[m
[31m-    echo "/* optional includes */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    modules=`cat $optional_modules_file | sed 's/*//g' | sort`[m
[31m-[m
[31m-    for mod in $modules; do[m
[31m-        def="NDK_`strtoupper "$mod"`"[m
[31m-        echo "#if ($def)" >> $1[m
[31m-        add_include $1 $mod.c[m
[31m-        echo "#endif" >> $1[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_commands {[m
[31m-[m
[31m-    echo "/* module commands */" >> $1[m
[31m-    echo >> $1[m
[31m-    echo "static ngx_command_t  ndk_http_commands[] = {" >> $1[m
[31m-[m
[31m-    cat $optional_modules_file | sort | while read line; do[m
[31m-[m
[31m-        cmds=`echo "$line" | grep -E '\*'`[m
[31m-[m
[31m-        [ "x$cmds" = "x" ] && continue[m
[31m-[m
[31m-        mod=`echo "$line" | grep -E '^[a-zA-Z0-9_]+' | cut -d " " -f1`[m
[31m-        up=`strtoupper $mod`[m
[31m-        def="NDK_$up"[m
[31m-        defcmd="NDK_${up}_CMDS"[m
[31m-[m
[31m-        echo "#if ($def)"                   >> $1[m
[31m-        echo "#define $defcmd 1"            >> $1[m
[31m-        add_include  $1  $mod.h[m
[31m-        echo "#undef  $defcmd"              >> $1[m
[31m-        echo "#endif"                       >> $1[m
[31m-[m
[31m-    done[m
[31m-[m
[31m-    echo -e "    ngx_null_command\n};"      >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_all_h_files {[m
[31m-[m
[31m-    out=$output_dir/${file_prefix}$auto_file_name.h[m
[31m-[m
[31m-    add_notice $out[m
[31m-[m
[31m-    generate_include_all_includes $out[m
[31m-    generate_dependent_includes $out[m
[31m-[m
[31m-    out=$output_dir/${file_prefix}$auto_includes_name.h[m
[31m-[m
[31m-    generate_optional_h_includes $out[m
[31m-    generate_non_optional_h_includes $out[m
[31m-    generate_auto_generated_h_includes $out $list[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_all_c_files {[m
[31m-[m
[31m-    out=$output_dir/${file_prefix}$auto_file_name.c[m
[31m-[m
[31m-    add_notice $out[m
[31m-    generate_optional_c_includes $out[m
[31m-    generate_commands $out[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_all_files {[m
[31m-[m
[31m-    mkdir -p $output_dir[m
[31m-    rm -f $output_dir/*[m
[31m-[m
[31m-    generate_all_h_files[m
[31m-    generate_all_c_files[m
[31m-}[m
[31m-[m
[31m-generate_all_files[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/action_replacements b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/action_replacements[m
[1mdeleted file mode 100644[m
[1mindex f419bc3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/action_replacements[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-[m
[31m-OK      NGX_OK[m
[31m-E       NGX_ERROR[m
[31m-CE      NGX_CONF_ERROR[m
[31m-COK     NGX_CONF_OK[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/action_types b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/action_types[m
[1mdeleted file mode 100644[m
[1mindex 284a5cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/action_types[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-r0          return 0[m
[31m-r1          return 1[m
[31m-r_1         return -1[m
[31m-rok         return %OK%[m
[31m-rce         return %CE%[m
[31m-rcok        return %COK%[m
[31m-re          return %E%[m
[31m-rn          return NULL[m
[31m-rse         {ngx_script_error (e); return;}[m
[31m-sce         {ngx_script_configure_error (c); return;}[m
[31m-g(_lb)      goto _lb[m
[31m-ge          goto error[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_args b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_args[m
[1mdeleted file mode 100644[m
[1mindex 752b533..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_args[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m- [m
[31m-TAKE1[m
[31m-TAKE2[m
[31m-TAKE3[m
[31m-TAKE4[m
[31m-TAKE5[m
[31m-TAKE6[m
[31m-TAKE7[m
[31m-TAKE8[m
[31m-TAKE12[m
[31m-TAKE13[m
[31m-TAKE23[m
[31m-TAKE123[m
[31m-TAKE1234[m
[31m-1MORE[m
[31m-2MORE[m
[31m-ANY[m
[31m-FLAG[m
[31m-BLOCK[m
[31m-MULTI[m
[31m-ARGS_NUMBER[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_locs b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_locs[m
[1mdeleted file mode 100644[m
[1mindex f5352c3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_locs[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-HTTP_MAIN                   HTTP_MAIN       main[m
[31m-HTTP_SRV                    HTTP_SRV        srv[m
[31m-HTTP_SIF                    HTTP_SRV        srv[m
[31m-HTTP_LOC                    HTTP_LOC        loc[m
[31m-HTTP_LIF                    HTTP_LOC        loc[m
[31m-[m
[31m-HTTP_MAIN_SRV               HTTP_SRV        srv[m
[31m-HTTP_MAIN_SIF               HTTP_SRV        srv[m
[31m-HTTP_MAIN_LOC               HTTP_LOC        loc[m
[31m-HTTP_MAIN_LIF               HTTP_LOC        loc[m
[31m-[m
[31m-HTTP_SRV_LOC                HTTP_LOC        loc[m
[31m-HTTP_SRV_LIF                HTTP_LOC        loc[m
[31m-HTTP_SIF_LOC                HTTP_LOC        loc[m
[31m-HTTP_SIF_LIF                HTTP_LOC        loc[m
[31m-[m
[31m-HTTP_MAIN_SRV_LOC           HTTP_LOC        loc[m
[31m-HTTP_MAIN_SRV_LIF           HTTP_LOC        loc[m
[31m-HTTP_MAIN_SIF_LOC           HTTP_LOC        loc[m
[31m-HTTP_MAIN_SRV_SIF_LOC       HTTP_LOC        loc[m
[31m-HTTP                        HTTP_LOC        loc[m
[31m-HTTP_UPS                    HTTP_LOC        loc[m
[31m-HTTP_ANY                    HTTP_LOC        loc[m
[31m-ANY                         HTTP_LOC        loc[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_macros b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_macros[m
[1mdeleted file mode 100644[m
[1mindex f42206a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/conf_macros[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-[m
[31m-BITMASK             1MORE       bitmask[m
[31m-BUFS                TAKE1       bufs[m
[31m-COMPLEX_KEYVAL      TAKE2       http_complex_keyval[m
[31m-COMPLEX_PATH        TAKE1       http_complex_path[m
[31m-COMPLEX_VALUE       TAKE1       http_complex_value[m
[31m-COMPLEX_VALUE_ARRAY 1MORE       http_complex_value_array[m
[31m-ENCODING            TAKE1       encoding[m
[31m-ENUM                TAKE1       enum[m
[31m-FALSE               NOARGS      false[m
[31m-FULL_PATH           TAKE1       full_path[m
[31m-KEYVAL              TAKE2       keyval[m
[31m-KEYVAL1             TAKE2       keyval1[m
[31m-MSEC                TAKE1       msec[m
[31m-NULL                NOARGS      null[m
[31m-NUM                 TAKE1       num[m
[31m-NUM64               TAKE1       num64[m
[31m-NUM_FLAG            TAKE1       num_flag[m
[31m-ONOFF               FLAG        flag[m
[31m-OFF                 TAKE1       off[m
[31m-PATH                TAKE1       split_path[m
[31m-REXEX               TAKE1       regex[m
[31m-REGEX_CL            TAKE1       regex_caseless[m
[31m-REGEX_ARRAY         1MORE       regex_array[m
[31m-REGEX_ARRAY_CL      1MORE       regex_array_caseless[m
[31m-PTR                 NOARGS      ptr[m
[31m-SEC                 TAKE1       sec[m
[31m-SEC_FLAG            TAKE2       sec_flag[m
[31m-SIZE                TAKE1       size[m
[31m-STR                 TAKE1       str[m
[31m-STR_ARRAY           1MORE       str_array_multi[m
[31m-STR_ARRAY1          TAKE1       str_array[m
[31m-TRUE                NOARGS      true[m
[31m-[m
[31m- [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/contexts b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/contexts[m
[1mdeleted file mode 100644[m
[1mindex e7e8ff0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/contexts[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m- [m
[31m-MAIN[m
[31m-SRV[m
[31m-SIF[m
[31m-LOC[m
[31m-LIF[m
[31m-[m
[31m-MAIN_SRV[m
[31m-MAIN_SIF[m
[31m-MAIN_LOC[m
[31m-MAIN_LIF[m
[31m-SRV_LOC[m
[31m-SRV_LIF[m
[31m-SIF_LOC[m
[31m-SIF_LIF[m
[31m-[m
[31m-MAIN_SRV_LOC[m
[31m-MAIN_SRV_LIF[m
[31m-MAIN_SIF_LOC[m
[31m-MAIN_SIF_LIF[m
[31m-ANY_MAIN[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/header_files b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/header_files[m
[1mdeleted file mode 100644[m
[1mindex aa0f11c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/header_files[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-array[m
[31m-palloc[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/headers b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/headers[m
[1mdeleted file mode 100644[m
[1mindex 7583cb9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/headers[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-http_headers[m
[31m-log[m
[31m-parse[m
[31m-string_util[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/module_dependencies b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/module_dependencies[m
[1mdeleted file mode 100644[m
[1mindex a179316..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/module_dependencies[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-complex_path    complex_value   path[m
[31m-conf_file       string[m
[31m-hash            string[m
[31m-set_var         rewrite[m
[31m-upstream_list   http_create_main_conf[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/modules_optional b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/modules_optional[m
[1mdeleted file mode 100644[m
[1mindex bbd6ec5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/modules_optional[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-buf[m
[31m-complex_path[m
[31m-complex_value[m
[31m-conf_file[m
[31m-encoding[m
[31m-hash[m
[31m-http[m
[31m-path[m
[31m-process[m
[31m-regex[m
[31m-rewrite[m
[31m-set_var[m
[31m-string[m
[31m-upstream_list   *[m
[31m-uri[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/prefixes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/prefixes[m
[1mdeleted file mode 100644[m
[1mindex ee53474..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/data/prefixes[m
[1m+++ /dev/null[m
[36m@@ -1,2 +0,0 @@[m
[31m-ngx[m
[31m-ndk [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/array.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/array.h[m
[1mdeleted file mode 100644[m
[1mindex a583759..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/array.h[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-[m
[31m-#define     %2%_array_count(a)                  ((a)->nelts)[m
[31m-#define     %2%_array_get_first(a)              ((a)->elts)[m
[31m-#define     %2%_array_get_index(a,n)            ((void*) ((char*) (a)->elts + (a)->size * n))[m
[31m-#define     %2%_array_get_last(a)               ((void*) ((char*) (a)->elts + (a)->size * ((a)->nelts - 1)))[m
[31m-#define     %2%_array_get_reverse_index(a,n)    ((void*) ((char*) (a)->elts + (a)->size * ((a)->nelts - 1 - n)))[m
[31m-#define     %2%_array_push_clean(p,a)           {p = %1%_array_push (a); %2%_zerop (p);}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/conf_cmd_basic.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/conf_cmd_basic.h[m
[1mdeleted file mode 100644[m
[1mindex 38743a6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/conf_cmd_basic.h[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-[m
[31m-/* TODO : finish this */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF              NGX_HTTP_MAIN_CONF[m
[31m-#define     NDK_HTTP_SRV_CONF               NGX_HTTP_SRV_CONF[m
[31m-#define     NDK_HTTP_SIF_CONF               NGX_HTTP_SIF_CONF[m
[31m-#define     NDK_HTTP_LOC_CONF               NGX_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_LIF_CONF               NGX_HTTP_LIF_CONF[m
[31m-#define     NDK_HTTP_UPS_CONF               NGX_HTTP_UPS_CONF[m
[31m-#define     NDK_MAIN_CONF                   NGX_MAIN_CONF[m
[31m-#define     NDK_ANY_CONF                    NGX_ANY_CONF[m
[31m-[m
[31m-[m
[31m-/* compound locations */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_CONF[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_SIF_CONF[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_SIF_CONF                   NDK_HTTP_SRV_CONF|NDK_HTTP_SIF_CONF[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF                   NDK_HTTP_SRV_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_SRV_LOC_LIF_CONF               NDK_HTTP_SRV_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-#define     NDK_HTTP_SRV_SIF_LOC_CONF               NDK_HTTP_SRV_SIF_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_SRV_SIF_LOC_LIF_CONF           NDK_HTTP_SRV_SIF_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_LIF_CONF                   NDK_HTTP_LOC_CONF|NDK_HTTP_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_LIF_CONF[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SIF_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_LIF_CONF      NDK_HTTP_SRV_SIF_LOC_LIF_CONF|NDK_MAIN_CONF[m
[31m-#define     NDK_HTTP_CONF                           NDK_HTTP_MAIN_SRV_SIF_LOC_LIF_CONF[m
[31m-#define     NDK_HTTP_ANY_CONF                       NDK_HTTP_CONF|NDK_HTTP_UPS_CONF[m
[31m-[m
[31m-[m
[31m-/* property offsets     NOTE : ngx_module_main_conf_t etc should be defined in the module's .c file before the commands */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_PROP(p)      NGX_HTTP_MAIN_CONF_OFFSET, offsetof (ndk_module_main_conf_t, p)[m
[31m-#define     NDK_HTTP_SRV_CONF_PROP(p)       NGX_HTTP_SRV_CONF_OFFSET, offsetof (ndk_module_srv_conf_t, p)[m
[31m-#define     NDK_HTTP_LOC_CONF_PROP(p)       NGX_HTTP_LOC_CONF_OFFSET, offsetof (ndk_module_loc_conf_t, p)[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/conf_merge.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/conf_merge.h[m
[1mdeleted file mode 100644[m
[1mindex 1e3ba70..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/conf_merge.h[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-[m
[31m-/* TODO : check that all the main types have a corresponding merge function */[m
[31m-[m
[31m-#define     ndk_conf_merge_value            ngx_conf_merge_value[m
[31m-#define     ndk_conf_merge_off_value        ngx_conf_merge_off_value [m
[31m-#define     ndk_conf_merge_ptr_value        ngx_conf_merge_ptr_value[m
[31m-#define     ndk_conf_merge_str_value        ngx_conf_merge_str_value[m
[31m-#define     ndk_conf_merge_size_value       ngx_conf_merge_size_value [m
[31m-[m
[31m-[m
[31m-#define     ndk_conf_merge_keyval_value(conf,prev,default)                                  \[m
[31m-                                                                                            \[m
[31m-                conf = prev ? prev : default;[m
[31m-[m
[31m-#define     ndk_conf_merge_str_array_value(conf,prev,val1,...)                              \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR) {                                           \[m
[31m-                    if (prev == NGX_CONF_UNSET_PTR) {                                       \[m
[31m-                        if (val1 == NULL) {                                                 \[m
[31m-                            conf = NULL;                                                    \[m
[31m-                        } else {                                                            \[m
[31m-                            char * elts[] = {val1,##__VA_ARGS__};                           \[m
[31m-                            int    n = sizeof(elts)/sizeof(char*);                          \[m
[31m-                                                                                            \[m
[31m-                            conf = ndk_str_array_create (cf->pool, elts, n);                \[m
[31m-                                                                                            \[m
[31m-                            if (conf == NULL)                                               \[m
[31m-                                return  NGX_CONF_ERROR;                                     \[m
[31m-                        }                                                                   \[m
[31m-                    } else {                                                                \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_value_value(conf,prev,default)                      \[m
[31m-                                                                                            \[m
[31m-                if (!conf.str.len) {                                                        \[m
[31m-                    if (prev.str.len) {                                                     \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    } else {                                                                \[m
[31m-                        conf.str.data = (u_char *) default;                                 \[m
[31m-                        conf.str.len = sizeof (default) - 1;                                \[m
[31m-                                                                                            \[m
[31m-                        if (ndk_http_complex_value_compile (cf, &conf))                     \[m
[31m-                            return  NGX_CONF_ERROR;                                         \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_value_array_value(conf,prev,val1,...)               \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR) {                                           \[m
[31m-                    if (prev == NGX_CONF_UNSET_PTR) {                                       \[m
[31m-                        if (val1 == NULL)                                                   \[m
[31m-                            conf = NULL;                                                    \[m
[31m-                        else {                                                              \[m
[31m-                            char * elts[] = {val1,##__VA_ARGS__};                           \[m
[31m-                            int    n = sizeof(elts)/sizeof(char*);                          \[m
[31m-                                                                                            \[m
[31m-                            conf = ndk_http_complex_value_array_create (cf, elts, n);       \[m
[31m-                                                                                            \[m
[31m-                            if (conf == NULL)                                               \[m
[31m-                                return  NGX_CONF_ERROR;                                     \[m
[31m-                        }                                                                   \[m
[31m-                    } else {                                                                \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_path_value(conf,prev,...)                           \[m
[31m-                ndk_conf_merge_http_complex_value_array_value (conf.a, prev.a, __VA_ARGS__)[m
[31m-[m
[31m-#define     ndk_conf_merge_split_path_value(conf,prev,path)                                 \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR)  {                                          \[m
[31m-                    conf = (prev == NGX_CONF_UNSET_PTR ?                                    \[m
[31m-                        ndk_split_path_create_raw (cf, path) : prev);                       \[m
[31m-                }[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/palloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/palloc.h[m
[1mdeleted file mode 100644[m
[1mindex 798e360..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/src/palloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-[m
[31m-#define     %2%_pallocp(p,pl)                   p = %1%_palloc (pl,sizeof(*p))[m
[31m-#define     %2%_pallocpn(p,pl,n)                p = %1%_palloc (pl,sizeof(*p)*(n))[m
[31m-[m
[31m-#define     %2%_pcallocp(p,pl)                  p = %1%_pcalloc (pl,sizeof(*p))[m
[31m-#define     %2%_pcallocpn(p,pl,n)               p = %1%_pcalloc (pl,sizeof(*p)*(n))[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/text/autogen b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/text/autogen[m
[1mdeleted file mode 100644[m
[1mindex 6a244c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/auto/text/autogen[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/config[m
[1mdeleted file mode 100644[m
[1mindex 8cb7ad0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/config[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-[m
[31m-###############[m
[31m-## FUNCTIONS ##[m
[31m-###############[m
[31m-[m
[31m-# TODO : provide information about checking versions of sed etc[m
[31m-# TODO : an optional patch function[m
[31m-[m
[31m-ndk_generate_files() {[m
[31m-    echo "building Nginx Development Kit utility functions and macros ..."[m
[31m-[m
[31m-    autobuild="$ngx_addon_dir/auto/build"[m
[31m-    chmod +x $autobuild[m
[31m-    $autobuild `pwd` $NGX_OBJS/addon/ndk || exit 1[m
[31m-}[m
[31m-[m
[31m-ndk_get_nginx_version() {[m
[31m-    # We get the Nginx version number from the string form rather than[m
[31m-    # nginx_version because it is available in more (every?) version[m
[31m-[m
[31m-    cat src/core/nginx.h                                |[m
[31m-    grep  '#define NGINX_VERSION'                       |[m
[31m-    sed -r                                              \[m
[31m-        -e 's/[^0-9.]*([0-9.]+).*/\1/'                  \[m
[31m-        -e 's/([0-9]+\.[0-9]+\.)([0-9]{1})$/\100\2/'    \[m
[31m-        -e 's/([0-9]+\.[0-9]+\.)([0-9]{2})$/\10\2/'     \[m
[31m-        -e 's/\.//g'                                    \[m
[31m-        -e 's/^0+(.*)/\1/'[m
[31m-}[m
[31m-[m
[31m-#####################[m
[31m-## CONFIG SETTINGS ##[m
[31m-#####################[m
[31m-[m
[31m-ngx_addon_name=ngx_devel_kit[m
[31m-ngx_objs_dirs="$ngx_addon_dir/objs $NGX_OBJS/addon/ndk"[m
[31m-[m
[31m-NDK_SRCS="$ngx_addon_dir/src/ndk.c"[m
[31m-NDK_DEPS="$ngx_addon_dir/src/ndk.h"[m
[31m-NDK_INCS="$ngx_addon_dir/src $ngx_objs_dirs"[m
[31m-[m
[31m-CORE_INCS="$CORE_INCS $ngx_objs_dirs"[m
[31m-HTTP_INCS="$HTTP_INCS $ngx_addon_dir/src $ngx_objs_dir"[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name="ndk_http_module"[m
[31m-    ngx_module_srcs="$NDK_SRCS"[m
[31m-    ngx_module_deps="$NDK_DEPS"[m
[31m-    ngx_module_incs="$NDK_INCS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES ndk_http_module"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $NDK_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_SRCS $NDK_DEPS"[m
[31m-fi[m
[31m-[m
[31m-have=NDK . auto/have[m
[31m-[m
[31m-##############[m
[31m-## INCLUDES ##[m
[31m-##############[m
[31m-[m
[31m-. $ngx_addon_dir/ngx_auto_lib_core[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/core/action_macros b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/core/action_macros[m
[1mdeleted file mode 100644[m
[1mindex 802eb1f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/core/action_macros[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-[m
[31m-    GENERAL NOTES[m
[31m-    -------------[m
[31m-[m
[31m-    These functions and macros have been provided as a tool for Nginx module developers.  They have[m
[31m-    been created with four main purposes:[m
[31m-[m
[31m-        - to speed up code-writing[m
[31m-        - to reduce the code you have to read on file[m
[31m-        - to add additional generic functionality similar to exising Nginx functions [m
[31m-        - to reduce code errors[m
[31m-[m
[31m-    Most of the utility macros are just wrappers around commonly used code, especially checking for[m
[31m-    NULL and returning a value, zeroing data etc.  The functions add things like extra conf_set_X_slot[m
[31m-    functions that don't exist in the standard Nginx distribution, but which might be useful in more[m
[31m-    than one module.[m
[31m-[m
[31m-    A consistent approach has been taken to creating the macros, so that in theory you should be able[m
[31m-    to 'know' the macro name from using the few rules below and your knowledge of the existing Nginx[m
[31m-    functions.  As much as possible, the ordering of variables used within the underlying functions[m
[31m-    remain the same, to reduce the learning time.  Also, a constent naming pattern has been used to[m
[31m-    make it easier to read the macros above.[m
[31m-[m
[31m-    Obviously not all programmers will want to use all or any of these macros, but they are provided[m
[31m-    as a tool for those who wish to use them.[m
[31m-[m
[31m-    If you have any comments about them, including any additions or errors please let me know at [m
[31m-    'eugaia at gmail dot com'.  I don't promise to include all additions people send, but if they seem[m
[31m-    like they could be of use to multiple developers, I will.[m
[31m-[m
[31m-[m
[31m-    UTILITY MACRO PARAMS[m
[31m-    --------------------[m
[31m-    p       pointer                 - used to set the result of a function to a pointer[m
[31m-    a       array[m
[31m-    pl      pool[m
[31m-    n       multiplication factor   - for allocating multiple pointers & pushing 'n' elts in arrays etc[m
[31m-    sz      size[m
[31m-    l       log[m
[31m-    rv      return value[m
[31m-[m
[31m-[m
[31m-[m
[31m-    UTILITY MACRO FUNCTION SUFFIXES[m
[31m-    -------------------------------[m
[31m-[m
[31m- - general[m
[31m-[m
[31m-    p       p = [FUNCTION] ()[m
[31m-    _r      [ if result of function is NULL | NGX_ERROR (as appropriate) ] return rv[m
[31m-    _rce    rv = NGX_CONF_ERROR[m
[31m-    _re     rv = NGX_ERROR[m
[31m-    _rn     rv = NULL[m
[31m-[m
[31m- - (p)(c)alloc functions[m
[31m-[m
[31m-    p       p = [function] (pool, sizeof (*p))[m
[31m-    pn      p = [function] (pool, sizeof (*p) * n)[m
[31m-[m
[31m-[m
[31m-    UTILITY MACRO PARAMS ORDER[m
[31m-    --------------------------[m
[31m-    p, pl|a, sz|n, l, rv [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/core/conf_cmds b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/core/conf_cmds[m
[1mdeleted file mode 100644[m
[1mindex 70978b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/core/conf_cmds[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-[m
[31m-Conf command macros[m
[31m--------------------[m
[31m-[m
[31m-The build script generates a large number of macros for reducing the code required for command[m
[31m-definitions.[m
[31m-[m
[31m-There are basically three types of macros :[m
[31m-[m
[31m-- combination bitmasks[m
[31m-[m
[31m-    e.g. NDK_HTTP_MAIN_SRV_CONF  =  (NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF)[m
[31m-[m
[31m-- base command structures[m
[31m-[m
[31m-    e.g. NDK_HTTP_MAIN_CONF_TAKE1[m
[31m-[m
[31m-- conf-set command structures[m
[31m-[m
[31m-    e.g. NDK_HTTP_CONF_STR[m
[31m-[m
[31m-[m
[31m-Combination bitmasks[m
[31m---------------------[m
[31m-[m
[31m-Basically combinations of existing bitmasks for locations, with general > specific order[m
[31m-[m
[31m-NDK_HTTP_CONF = (NGX_HTTP_MAIN_CONF | NGX_HTTP_SVR_CONF | NGX_HTTP_SIF_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF)[m
[31m-[m
[31m-[m
[31m-Base command structures[m
[31m------------------------[m
[31m-[m
[31m-These macros are basically there as wrappers for the conf-set command structures, and but incorporate [m
[31m-the bitmask element into the name of the macro.[m
[31m-[m
[31m-[m
[31m-Conf-set command structures[m
[31m----------------------------[m
[31m-[m
[31m-These macros simplify creating commands that use any of the build-in conf-set functions or any of those[m
[31m-added by the NDK.[m
[31m-[m
[31m-e.g.  NGX_HTTP_MAIN_SRV_STR ("name", prop, NULL)[m
[31m-[m
[31m-where prop is the name of the property that is a ngx_str_t.  Whether this is in the loc conf, main conf[m
[31m-or svr conf is generated automatically in by the macro.[m
[31m-[m
[31m-NOTE : you need to set the following if they will be used (using macro definitions) :[m
[31m-[m
[31m-ndk_module_main_conf_t[m
[31m-ndk_module_srv_conf_t[m
[31m-ndk_module_loc_conf_t[m
[31m-[m
[31m-e.g[m
[31m-[m
[31m-#define     ndk_module_loc_conf_t       ngx_http_my_module_loc_conf_t[m
[31m-[m
[31m-[m
[31m-TODO[m
[31m-----[m
[31m-Much better documentation for this[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/modules/set_var b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/modules/set_var[m
[1mdeleted file mode 100644[m
[1mindex 6be5c0f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/modules/set_var[m
[1m+++ /dev/null[m
[36m@@ -1,124 +0,0 @@[m
[31m-[m
[31m-set var tools[m
[31m-=============[m
[31m-[m
[31m-OVERVIEW[m
[31m---------[m
[31m-This collection of tools is designed to make it easier to set Nginx variables[m
[31m-using a common interface.  It works by plugging into and extending the features[m
[31m-of the internal rewrite module, and operations performed by this module are[m
[31m-therefore done at the rewrite phase of handling.[m
[31m-[m
[31m-[m
[31m-ADVANTAGES OF USING THIS MODULE[m
[31m--------------------------------[m
[31m-[m
[31m-- simple interface - you don't have to worry about lots of http script compiling[m
[31m-- it plugs into the rewrite module, so setting (and getting) vars will happen[m
[31m-  in the order you expect based on how they appear in the configuration file[m
[31m-- you do not have to worry about overriding the v->get_handler (useful if[m
[31m-  a variable of a specific name could be set in multiple different ways)[m
[31m-[m
[31m-[m
[31m-WHEN TO USE THIS AND WHEN TO USE v->get_handler = my_func[m
[31m----------------------------------------------------------[m
[31m-[m
[31m-- if you want a variable to always be generated using a specific function,[m
[31m-    and should not be over-ridden by 'set' functions (e.g. $request_uri, [m
[31m-    $document_root), then you should use v->get_handler[m
[31m-[m
[31m-- if you want to allow a variable to be set using many possible methods,[m
[31m-    including using the 'set' directive, then this module provides an easy way[m
[31m-    for you to do so (if you use the v->get_handler method in this case, you may[m
[31m-    run into problems because the get_handler may over-ride previous uses of the[m
[31m-    set directive)[m
[31m-[m
[31m-[m
[31m-USAGE[m
[31m------[m
[31m-[m
[31m-- decide on the type of function you'll need to write[m
[31m-[m
[31m-    type                                use when there are these requirements[m
[31m-    ----                                -------------------------------------[m
[31m-    NDK_SET_VAR_BASIC                   0 variable values, no extra data[m
[31m-    NDK_SET_VAR_DATA                    0 variable values, extra data[m
[31m-    NDK_SET_VAR_VALUE                   1 variable value, no extra data[m
[31m-    NDK_SET_VAR_VALUE_DATA              1 variable value, extra data[m
[31m-    NDK_SET_VAR_MULTI_VALUE             2+ variable values, no extra data[m
[31m-    NDK_SET_VAR_MULTI_VALUE_DATA        2+ variable values, extra data[m
[31m-    NDK_SET_VAR_HASH                    the space needed for the result string [m
[31m-                                        value is known in advance (usually [m
[31m-                                        used in a hash function)[m
[31m-[m
[31m-    NOTE : if none of these generic calling types suit your needs, it is[m
[31m-    easy to extend the list of types in the .c file (and you if you let me know[m
[31m-    I'll add them to the list[m
[31m-[m
[31m-[m
[31m-- define the filter function with the respective prototype[m
[31m-[m
[31m-    type                                prototype[m
[31m-    ----                                ---------[m
[31m-    NDK_SET_VAR_BASIC                   ndk_set_var_pt[m
[31m-    NDK_SET_VAR_DATA                    ndk_set_var_data_pt[m
[31m-    NDK_SET_VAR_VALUE                   ndk_set_var_value_pt[m
[31m-    NDK_SET_VAR_DATA_VALUE              ndk_set_var_value_data_pt[m
[31m-    NDK_SET_VAR_MULTI_VALUE             ndk_set_var_value_pt[m
[31m-    NDK_SET_VAR_MULTI_VALUE_DATA        ndk_set_var_value_data_pt[m
[31m-    NDK_SET_VAR_HASH                    ndk_set_var_hash_pt[m
[31m-[m
[31m-    (See ngx_tools_module.h for the prototype definitions.)[m
[31m-[m
[31m-    Note : For the multi_value functions, the variable value pointer is to the[m
[31m-    first value (with the others being in an array following it)[m
[31m-[m
[31m-[m
[31m-to use one of the default setup functions[m
[31m------------------------------------------[m
[31m-[m
[31m-- define one or multiple ngx_http_var_filter_t's at the global scope, setting :[m
[31m-[m
[31m-    type = (one of types above)[m
[31m-    func = function to call[m
[31m-    size = (for multi value)        the number of variable values[m
[31m-           (for hash)               length of buffer to allocate[m
[31m-    data = (for data functions)     additional data (see note below)[m
[31m-[m
[31m-- define a configuration directive (see in the .c file for examples), where the[m
[31m-    function is 'ngx_http_set_var' and the 'post' is a pointer your filter definition[m
[31m-[m
[31m-[m
[31m-to setup in a customized way[m
[31m-----------------------------[m
[31m-[m
[31m-- define a configuration directive which has your own specific configuration function[m
[31m-[m
[31m-- inside your config function, define one or several ngx_http_var_filter_t's like[m
[31m-    above, and call one of the ngx_http_set_var_..._core functions, passing the [m
[31m-    variable name and value pointers as appropriate - see examples section[m
[31m-[m
[31m-Note : if you're passing extra data to the function, then you will probably want[m
[31m-to use this second method and store the data either in the loc conf, or just[m
[31m-allocate the space for it using one of the ngx_palloc functions.[m
[31m-[m
[31m-If the values that will be used for processing are in the same order as in the[m
[31m-config file and there aren't any additional values that are input, then you can[m
[31m-just use the (ngx_str_t *) (cf->args->elts) + 1 as your base for the values or [m
[31m-possibly not use the _core versions of the functions.[m
[31m-[m
[31m-[m
[31m-That's it![m
[31m-[m
[31m-[m
[31m-FEEDBACK[m
[31m---------[m
[31m-[m
[31m-If you have any comments (good/bad), or have found any bugs, please let me know at:[m
[31m-ngx.eugaia AT gmail DOT com[m
[31m-[m
[31m-[m
[31m-TODO[m
[31m-----[m
[31m-- add more documentation/examples[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/patches/more_logging_info b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/patches/more_logging_info[m
[1mdeleted file mode 100644[m
[1mindex 3685916..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/patches/more_logging_info[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-When tracking down some potential issues in the nginx constellation,[m
[31m-we've found it useful to understand where particular error messages[m
[31m-are coming from, since many of the same messages are repeated in[m
[31m-various places. This patch will write the source file from which the[m
[31m-message originated, the function name, and the line number if you're[m
[31m-using GCC to compile nginx. Here's an example:[m
[31m-[m
[31m-Old Output:[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: nginx/0.7.64[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: built by gcc 4.0.1 (Apple Inc. build 5490)[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: OS: Darwin 9.8.0[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: hw.ncpu: 2[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: net.inet.tcp.sendspace: 65536[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: kern.ipc.somaxconn: 128[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: getrlimit(RLIMIT_NOFILE):[m
[31m-256:9223372036854775807[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: start worker processes[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: start worker process 67785[m
[31m-2010/01/12 14:43:16 [notice] 67772#0: signal 20 (SIGCHLD) received[m
[31m-[m
[31m-New Output:[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_posix_init.c[m
[31m-ngx_os_status(   80) nginx/0.7.64[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_posix_init.c[m
[31m-ngx_os_status(   83) built by gcc 4.0.1 (Apple Inc. build 5490)[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_darwin_init.c[m
[31m-ngx_os_specific_status(  153) OS: Darwin 9.8.0[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_darwin_init.c[m
[31m-ngx_os_specific_status(  166) hw.ncpu: 2[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_darwin_init.c[m
[31m-ngx_os_specific_status(  166) net.inet.tcp.sendspace: 65536[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_darwin_init.c[m
[31m-ngx_os_specific_status(  166) kern.ipc.somaxconn: 128[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_posix_init.c[m
[31m-ngx_os_status(   92) getrlimit(RLIMIT_NOFILE):[m
[31m-2560:9223372036854775807[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_process_cycle.c[m
[31m-ngx_start_worker_processes(  337) start worker processes[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_process.c[m
[31m-ngx_spawn_process(  201) start worker process 27254[m
[31m-2010/01/14 16:35:14 [notice] 27241#0: src/os/unix/ngx_process.c[m
[31m-ngx_signal_handler(  420) signal 20 (SIGCHLD) received[m
[31m-[m
[31m-Formatting the filename and function name fields into fixed-width[m
[31m-fields would be nicer, however that would require further changes in[m
[31m-src/core/ngx_string.c[m
[31m-[m
[31m-(C) Brian Moran - bmoran@onehub.com  (posted to nginx-devel mailing list on 15/01/10)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/upstream/list b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/upstream/list[m
[1mdeleted file mode 100644[m
[1mindex 3ad485d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/docs/upstream/list[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-NDK_UPSTREAM_LIST[m
[31m------------------[m
[31m-[m
[31m-This submodule provides a directive that creates a list of upstreams, with[m
[31m-optional weighting. This list can then be used by other modules to hash over[m
[31m-the upstreams however they choose.[m
[31m-[m
[31m-[m
[31m-USAGE IN CONF FILE[m
[31m-------------------[m
[31m-[m
[31m-e.g. upstream_list   name    backend1  4:backend2    3:backend3;[m
[31m-[m
[31m-[m
[31m-[m
[31m-USAGE WITH OTHER MODULES[m
[31m-------------------------[m
[31m-[m
[31m-Add a line like[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_UPSTREAM_LIST"[m
[31m-[m
[31m-to the config file of your module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-INTEGRATING WITH YOUR MODULE[m
[31m-----------------------------[m
[31m-[m
[31m-The upstream lists are stored in the array given in the lists.h file, which is[m
[31m-an array of ndk_upstream_list_t elts.  The elts are currently all pointers to [m
[31m-strings which have been distributed according to the weight - so if there are[m
[31m-two backends, with weight 3 and 4 respectively, there will be 7 pointers in[m
[31m-total with the first 3 pointing to the first backend and the last 4 to the [m
[31m-second.[m
[31m-[m
[31m-[m
[31m-[m
[31m-TODO[m
[31m-----[m
[31m--   replace strings with pointers to upstreams if they are available (and if [m
[31m-    this is possible)[m
[31m--   add additional 'http://' to strings if necessary[m
[31m--   improve this documentation[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/README[m
[1mdeleted file mode 100644[m
[1mindex 22e2417..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/README[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-2010 (C) Marcus Clyne[m
[31m-[m
[31m-[m
[31m-Examples[m
[31m---------[m
[31m-[m
[31m-In this section there are a number of examples of the various features of the tools[m
[31m-module.  These have been given in the form of dummy modules, to make it easier to[m
[31m-use as templates for your own module should you choose to do so.[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/http/set_var/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/http/set_var/config[m
[1mdeleted file mode 100644[m
[1mindex aa58f77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/http/set_var/config[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_set_var_examples_module[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_http_set_var_examples_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_set_var_examples_module.c"[m
[31m-have=NDK_SET_VAR . auto/have[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/http/set_var/ngx_http_set_var_examples_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/http/set_var/ngx_http_set_var_examples_module.c[m
[1mdeleted file mode 100644[m
[1mindex 7a4daae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/examples/http/set_var/ngx_http_set_var_examples_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,136 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- */[m
[31m- [m
[31m-[m
[31m-#include    <ndk.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t    ngx_http_set_var_concat2    (ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v);[m
[31m-static char *       ngx_http_set_prepend_hello   (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static  ndk_set_var_t      ngx_http_var_set_concat2 = {[m
[31m-    NDK_SET_VAR_MULTI_VALUE,[m
[31m-    ngx_http_set_var_concat2,[m
[31m-    2,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_set_var_examples_commands[] = {[m
[31m-    {[m
[31m-        ngx_string ("set_concat2"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE3,[m
[31m-        ndk_set_var_multi_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_var_set_concat2[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("set_prepend_hello"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_set_prepend_hello,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t     ngx_http_set_var_examples_module_ctx = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};[m
[31m-ngx_module_t          ngx_http_set_var_examples_module = {[m
[31m-[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_set_var_examples_module_ctx,  // module context[m
[31m-    ngx_http_set_var_examples_commands,     // module directives[m
[31m-    NGX_HTTP_MODULE,                        // module type[m
[31m-    NULL,                                   // init master[m
[31m-    NULL,                                   // init module[m
[31m-    NULL,                                   // init process[m
[31m-    NULL,                                   // init thread[m
[31m-    NULL,                                   // exit thread[m
[31m-    NULL,                                   // exit process[m
[31m-    NULL,                                   // exit master[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-    This function is called by both examples, takes two variable values and concatenates them[m
[31m-    to give a third string.[m
[31m-*/[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_var_concat2 (ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    ngx_http_variable_value_t   *v2;[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    v2 = v + 1;[m
[31m-[m
[31m-    len = v->len + v2->len;[m
[31m-[m
[31m-	/*[m
[31m-	 * NDK provided abbreviation for the following code:[m
[31m-	 *[m
[31m-	 * p = ngx_palloc (r->pool, len);[m
[31m-	 * if (p == NULL)[m
[31m-	 * 		return  NGX_ERROR;[m
[31m-	 *[m
[31m-	 * */[m
[31m-	ndk_palloc_re(p, r->pool, len);[m
[31m-[m
[31m-    val->data = p;[m
[31m-    val->len = len;[m
[31m-[m
[31m-    ngx_memzero (p, len);[m
[31m-[m
[31m-    p = ngx_cpymem (p, v->data, v->len);[m
[31m-    ngx_memcpy (p, v2->data, v2->len);[m
[31m-[m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*  [m
[31m-    This function demonstrates using the 'core' function in a function that appends the word[m
[31m-    'hello_' to the beginning of a variable.[m
[31m-[m
[31m-    set                 $var      world;[m
[31m-    set_prepend_hello    $var      $var;[m
[31m-[m
[31m-    If the arguments used in the variable value filter do not all come directly from the conf[m
[31m-    file, or are not given in the order[m
[31m-[m
[31m-    direcive    $var_name   val1 "val2 string $var" ...[m
[31m-[m
[31m-    then the _core functions should be used inside the function that is called when the directive[m
[31m-    is read.[m
[31m-*/[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_prepend_hello (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               s[2], *var_name;[m
[31m-    ndk_set_var_t      filter;[m
[31m-[m
[31m-    var_name = cf->args->elts;[m
[31m-    var_name++;[m
[31m-[m
[31m-    s[0].data = (u_char*) "hello_";[m
[31m-    s[0].len = 6;[m
[31m-[m
[31m-    s[1] = *(var_name + 1);[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.func = ngx_http_set_var_concat2;[m
[31m-    filter.size = 2;[m
[31m-[m
[31m-    return  ndk_set_var_multi_value_core (cf, var_name, (ngx_str_t *) s, &filter);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/ngx_auto_lib_core b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/ngx_auto_lib_core[m
[1mdeleted file mode 100644[m
[1mindex d5441fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/ngx_auto_lib_core[m
[1m+++ /dev/null[m
[36m@@ -1,797 +0,0 @@[m
[31m-[m
[31m-## Directories to search for usable builds:[m
[31m-##[m
[31m-## - [$PFX]_INC and [$PFX]_LIB[m
[31m-## - the dir specified by --with-[$pfx]=*[m
[31m-## - each dir named [$pfx]-* under [$PFX]_BASE (descending order)[m
[31m-## - each dir named [$pfx]-* under $ngx_src_dir/.. (descending order)[m
[31m-## - system_paths (see below)[m
[31m-##[m
[31m-## Note : specifying [$PFX]_INC or [$PFX]_LIB prevents other dirs being tried[m
[31m-##        specifying --with-[$pfx]= prevents autodiscovery of dirs[m
[31m-##[m
[31m-## Note : if this file is not in the same directory as the config file, the value[m
[31m-##        for ngx_auto_lib_file should be changed to a relative path from that file[m
[31m-## e.g. : $ngx_addon_dir/libs/ngx_auto_lib[m
[31m-##[m
[31m-## TODO : explain hooks[m
[31m-[m
[31m-#############[m
[31m-## VERSION ##[m
[31m-#############[m
[31m-[m
[31m-ngx_auto_lib_version=1001[m
[31m-[m
[31m-if [ ! $ngx_auto_lib_file_version ] || [ $ngx_auto_lib_file_version -lt $ngx_auto_lib_version ]; then[m
[31m-[m
[31m-    if [ ! $ngx_addon_dir ]; then[m
[31m-        ngx_addon_dir=`cd $(dirname $0); pwd`[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_file="$ngx_addon_dir/ngx_auto_lib_core"[m
[31m-    ngx_auto_lib_file_version="$ngx_auto_lib_version"[m
[31m-fi[m
[31m-[m
[31m-###############[m
[31m-## VARIABLES ##[m
[31m-###############[m
[31m-[m
[31m-v=[m
[31m-v="$v       inc_path"[m
[31m-v="$v       incs"[m
[31m-v="$v       libs"[m
[31m-v="$v       name"[m
[31m-v="$v       path"[m
[31m-v="$v       run"[m
[31m-v="$v       test"[m
[31m-ev=[m
[31m-ev="$ev     add_libs"[m
[31m-ev="$ev     add_path"[m
[31m-ev="$ev     build_dirs"[m
[31m-ev="$ev     build_inc_dirs"[m
[31m-ev="$ev     build_lib_dirs"[m
[31m-ev="$ev     check_macros_defined"[m
[31m-ev="$ev     check_macros_non_zero"[m
[31m-ev="$ev     defines"[m
[31m-ev="$ev     deps"[m
[31m-ev="$ev     exit_if_not_found"[m
[31m-ev="$ev     haves"[m
[31m-ev="$ev     inc_names"[m
[31m-ev="$ev     lib_files"[m
[31m-ev="$ev     lib_names"[m
[31m-ev="$ev     libs_to_add"[m
[31m-ev="$ev     modules"[m
[31m-ev="$ev     srcs"[m
[31m-ev="$ev     shared"[m
[31m-ev="$ev     test_libs"[m
[31m-ev="$ev     variables"[m
[31m-[m
[31m-ngx_feature_vars="$v"[m
[31m-ngx_feature_extra_vars="$ev"[m
[31m-ngx_feature_all_vars="$v $ev"[m
[31m-[m
[31m-NGX_AUTO_LIB_DEFAULT_SYSTEM_DIRS='/usr/local /usr /opt/local /opt /usr/pkg'[m
[31m-[m
[31m-####################[m
[31m-## UTIL FUNCTIONS ##[m
[31m-####################[m
[31m-[m
[31m-to_upper() {[m
[31m-    echo "$@" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[m
[31m-}[m
[31m-[m
[31m-to_lower() {[m
[31m-    echo "$@" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'[m
[31m-}[m
[31m-[m
[31m-####################[m
[31m-## INIT FUNCTIONS ##[m
[31m-####################[m
[31m-[m
[31m-ngx_auto_lib_init() {[m
[31m-[m
[31m-    . $ngx_auto_lib_file[m
[31m-[m
[31m-    ngx_auto_lib_init_latest  $@[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_init_latest() {[m
[31m-[m
[31m-    # set name and prefixes[m
[31m-[m
[31m-    if [ ! $1 ]; then[m
[31m-        echo "ngx_auto_lib_init() requires that a name be passed"[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_name=$1[m
[31m-    ngx_auto_lib_module_name=$2[m
[31m-[m
[31m-    if [ $2 ]; then[m
[31m-        NGX_AUTO_LIB_PFX=`to_upper $2`[m
[31m-    else[m
[31m-        NGX_AUTO_LIB_PFX=`to_upper $1`[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_pfx=`to_lower $NGX_AUTO_LIB_PFX`[m
[31m-[m
[31m-    ngx_auto_lib_clean_feature_vars[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_clean_feature_vars() {[m
[31m-    for var in $ngx_feature_all_vars; do[m
[31m-        eval ngx_feature_$var=[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_get_variables() {[m
[31m-[m
[31m-    local pfx=$ngx_auto_lib_pfx[m
[31m-    local PFX=$NGX_AUTO_LIB_PFX[m
[31m-[m
[31m-    eval NGX_AUTO_LIB_INC=\"\$${PFX}_INC\"[m
[31m-    eval NGX_AUTO_LIB_LIB=\"\$${PFX}_LIB\"[m
[31m-    eval NGX_AUTO_LIB_DIR=\"\$${PFX}\"[m
[31m-    eval NGX_AUTO_LIB_BASE=\"\$${PFX}_BASE\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_LIB_INC=\"\$${PFX}_SEARCH_LIB_INC\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_DIR=\"\$${PFX}_SEARCH_DIR\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_BASE=\"\$${PFX}_SEARCH_BASE\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_BASE_PREFIX=\"\$${PFX}_SEARCH_BASE_PREFIX\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_PARENT=\"\$${PFX}_SEARCH_PARENT\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_SYSTEM=\"\$${PFX}_SEARCH_SYSTEM\"[m
[31m-    eval NGX_AUTO_LIB_SHARED=\"\$${PFX}_SHARED\"[m
[31m-    eval NGX_AUTO_LIB_SYSTEM_DIRS=\"\$${PFX}_SYSTEM_DIR\"[m
[31m-    eval USE_NGX_AUTO_LIB=\"\$USE_${LIB}\"[m
[31m-[m
[31m-    if [ ! "$NGX_AUTO_LIB_DIR" ]; then[m
[31m-        NGX_AUTO_LIB_DIR=NONE[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! "$USE_NGX_AUTO_LIB" ]; then[m
[31m-        if [ $ngx_feature_check_macros_defined -o $ngx_feature_check_macros_non_zero ]; then[m
[31m-            USE_NGX_AUTO_LIB=MAYBE[m
[31m-        elif [ "$ngx_feature_required" = no ]; then[m
[31m-            USE_NGX_AUTO_LIB=MAYBE[m
[31m-        else[m
[31m-            USE_NGX_AUTO_LIB=YES[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! "$NGX_AUTO_LIB_SYSTEM_DIRS" ]; then[m
[31m-        NGX_AUTO_LIB_SYSTEM_DIRS=$NGX_AUTO_LIB_DEFAULT_SYSTEM_DIRS[m
[31m-    fi[m
[31m-[m
[31m-    # TODO : add _STATIC, and do searches for both static and shared libs[m
[31m-[m
[31m-    if [ ! "$NGX_AUTO_LIB_SHARED" ]; then[m
[31m-        if [ "$ngx_feature_shared" = no ]; then[m
[31m-            NGX_AUTO_LIB_SHARED=NO[m
[31m-        else[m
[31m-            NGX_AUTO_LIB_SHARED=YES[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    NGX_AUTO_LIB_SEARCH_DEP=NO[m
[31m-[m
[31m-    # set default search methods[m
[31m-    # Note : these can be over-ridden by setting NGX_AUTO_LIB_SEARCH_[type]=YES|NO[m
[31m-[m
[31m-    local auto=y[m
[31m-[m
[31m-    if [ "$NGX_AUTO_LIB_INC" ] || [ "$NGX_AUTO_LIB_LIB" ]; then[m
[31m-        ngx_auto_lib_search  LIB_INC    YES[m
[31m-        auto=n[m
[31m-    fi[m
[31m-[m
[31m-    if [ "$NGX_AUTO_LIB_DIR" != NONE ]; then[m
[31m-        ngx_auto_lib_search  DIR        YES[m
[31m-        auto=n[m
[31m-    fi[m
[31m-[m
[31m-    if [ "$NGX_AUTO_LIB_BASE" ]; then[m
[31m-        ngx_auto_lib_search  BASE       YES[m
[31m-        auto=n[m
[31m-    fi[m
[31m-[m
[31m-    if [ $auto = y ]; then[m
[31m-        ngx_auto_lib_search  PARENT     YES[m
[31m-        ngx_auto_lib_search  SYSTEM     YES[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_search  LIB_INC    NO[m
[31m-    ngx_auto_lib_search  DIR        NO[m
[31m-    ngx_auto_lib_search  BASE       NO[m
[31m-    ngx_auto_lib_search  PARENT     NO[m
[31m-    ngx_auto_lib_search  SYSTEM     NO[m
[31m-[m
[31m-    if [ ! "$ngx_feature_lib_names" ]; then[m
[31m-        ngx_feature_lib_names=$pfx[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! "$ngx_feature_inc_names" ]; then[m
[31m-        ngx_feature_inc_names=$ngx_feature_lib_names[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! "$ngx_feature_exit_if_not_found" ]; then[m
[31m-        ngx_feature_exit_if_not_found=yes[m
[31m-    fi[m
[31m-}[m
[31m-[m
[31m-#######################[m
[31m-## DEFAULT FUNCTIONS ##[m
[31m-#######################[m
[31m-[m
[31m-ngx_auto_lib_set_default() {[m
[31m-[m
[31m-    local suffix=[m
[31m-    if [ $1 ]; then[m
[31m-        suffix="_$1"[m
[31m-    fi[m
[31m-[m
[31m-    local def=$2[m
[31m-    local var="NGX_AUTO_LIB$suffix"[m
[31m-[m
[31m-    val=[m
[31m-    if [ ! `eval echo '$'$var` ]; then[m
[31m-        eval $var=\"$def\"[m
[31m-    fi[m
[31m-[m
[31m-    #eval echo "$var = \$$var"[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_search() {[m
[31m-    ngx_auto_lib_set_default "SEARCH_$1" $2[m
[31m-}[m
[31m-[m
[31m-####################[m
[31m-## SAVE FUNCTIONS ##[m
[31m-####################[m
[31m-[m
[31m-ngx_auto_lib_save_vars() {[m
[31m-    OLD_CORE_DEPS=$CORE_DEPS[m
[31m-    OLD_CORE_INCS=$CORE_INCS[m
[31m-    OLD_CORE_LIBS=$CORE_LIBS[m
[31m-    OLD_CORE_SRCS=$CORE_SRCS[m
[31m-    OLD_LINK_DEPS=$LINK_DEPS[m
[31m-[m
[31m-    CORE_DEPS=[m
[31m-    CORE_INCS=[m
[31m-    CORE_LIBS=[m
[31m-    CORE_SRCS=[m
[31m-    LINK_DEPS=[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_reset_vars() {[m
[31m-    CORE_DEPS=$OLD_CORE_DEPS[m
[31m-    CORE_INCS=$OLD_CORE_INCS[m
[31m-    CORE_LIBS=$OLD_CORE_LIBS[m
[31m-    CORE_SRCS=$OLD_CORE_SRCS[m
[31m-    LINK_DEPS=$OLD_LINK_DEPS[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_save_feature_vars() {[m
[31m-    for var in $ngx_feature_all_vars; do[m
[31m-        eval main_ngx_feature_$var=\"\$ngx_feature_$var\"[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_reset_feature_vars() {[m
[31m-    for var in $ngx_feature_all_vars; do[m
[31m-        eval ngx_feature_$var=\"\$main_ngx_feature_$var\"[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-########################[m
[31m-## CHECKING FUNCTIONS ##[m
[31m-########################[m
[31m-[m
[31m-ngx_auto_lib_check_auto_config() {[m
[31m-[m
[31m-    ngx_auto_lib_save_feature_vars[m
[31m-    ngx_auto_lib_clean_feature_vars[m
[31m-[m
[31m-    ngx_feature=$1[m
[31m-    ngx_feature_inc_path="`echo $CFLAGS | tr ' ' '\n' | grep -- -D | tr '\n' ' '`"[m
[31m-    ngx_feature_incs="#include <$NGX_AUTO_CONFIG_H>"[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_path=`pwd`[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_test=$2[m
[31m-[m
[31m-    #ngx_auto_lib_print_feature_vars[m
[31m-[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        rv=0[m
[31m-    else[m
[31m-        rv=1[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_reset_feature_vars[m
[31m-[m
[31m-    return $rv[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_check_macro_defined() {[m
[31m-[m
[31m-    for m in $@; do[m
[31m-        ngx_auto_lib_check_auto_config  "$m"  "[m
[31m-    #ifndef $m[m
[31m-        rubbish[m
[31m-    #endif"  && return 0[m
[31m-    done[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_check_macro_non_zero() {[m
[31m-[m
[31m-    for m in $@; do[m
[31m-        ngx_auto_lib_check_auto_config  "$m" "[m
[31m-    #if !($m)[m
[31m-        rubbish[m
[31m-    #endif"  && return 0[m
[31m-    done[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_check_require() {[m
[31m-[m
[31m-    if [ $USE_NGX_AUTO_LIB = YES ]; then[m
[31m-        return 0[m
[31m-    elif [ $USE_NGX_AUTO_LIB = NO ]; then[m
[31m-        return 1[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # check if the libraries are required elsewhere[m
[31m-[m
[31m-    for l in $ngx_feature_lib_names; do[m
[31m-        [ ! "`echo $CORE_LIBS $ADDON_LIBS | grep -w -- -l$l`" ] && return 0[m
[31m-    done[m
[31m-[m
[31m-[m
[31m-[m
[31m-    # check that any required macros are set[m
[31m-[m
[31m-    local d=$ngx_feature_check_macros_defined[m
[31m-    local nz=$ngx_feature_check_macros_non_zero[m
[31m-[m
[31m-    if [ "$d" ] || [ "$nz" ]; then[m
[31m-[m
[31m-        ngx_auto_lib_check_macro_defined   $d  && return 0[m
[31m-        ngx_auto_lib_check_macro_non_zero  $nz  && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_auto_lib_check[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_check() {[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-##################################[m
[31m-## TEST PHASE HANDLER FUNCTIONS ##[m
[31m-##################################[m
[31m-[m
[31m-ngx_auto_lib_test() {[m
[31m-    ngx_auto_lib_test_pre_setup "$@"[m
[31m-    ngx_auto_lib_test_setup "$@"[m
[31m-    ngx_auto_lib_test_post_setup "$@"[m
[31m-    ngx_auto_lib_test_feature[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_pre_setup() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_setup() {[m
[31m-[m
[31m-    local INC=$1[m
[31m-    local LIB=$2[m
[31m-[m
[31m-    ngx_auto_lib_inc_dir=$INC[m
[31m-    ngx_auto_lib_lib_dir=$LIB[m
[31m-[m
[31m-    ngx_auto_lib_reset_feature_vars[m
[31m-[m
[31m-    if [ ! "$ngx_feature_path" ]; then[m
[31m-        ngx_feature_path="$INC"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_feature_path="$ngx_feature_path $ngx_feature_add_path"[m
[31m-[m
[31m-    for sfx in $ngx_feature_path_suffixes; do[m
[31m-        ngx_feature_path="$ngx_feature_path $INC/$sfx"[m
[31m-    done[m
[31m-[m
[31m-[m
[31m-    local inc=[m
[31m-    local lib=[m
[31m-    local incs="$ngx_feature_inc_names"[m
[31m-    local libs="$ngx_feature_lib_names"[m
[31m-    local lib_files="$ngx_feature_lib_files"[m
[31m-[m
[31m-    for inc in $incs; do[m
[31m-        ngx_feature_incs="$ngx_feature_incs[m
[31m-#include <$inc.h>"[m
[31m-    done[m
[31m-[m
[31m-[m
[31m-    if [ ! "$ngx_feature_libs" ]; then[m
[31m-[m
[31m-        if [ $NGX_AUTO_LIB_SHARED = YES ]; then[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R$LIB"[m
[31m-            fi[m
[31m-            ngx_feature_libs="$ngx_feature_libs -L$LIB"[m
[31m-[m
[31m-            for lib in $libs; do[m
[31m-                ngx_feature_libs="$ngx_feature_libs -l$lib"[m
[31m-            done[m
[31m-[m
[31m-            # TODO : only add --rpath when the path is not a standard system path - warn if /usr[m
[31m-[m
[31m-            ngx_feature_libs="$ngx_feature_libs -Wl,--rpath -Wl,$LIB"[m
[31m-[m
[31m-        else[m
[31m-[m
[31m-            for lib in $lib_files; do[m
[31m-                ngx_feature_libs="$ngx_feature_libs $LIB/$lib"      [m
[31m-            done[m
[31m-[m
[31m-            for lib in $libs; do[m
[31m-                ngx_feature_libs="$ngx_feature_libs $LIB/lib$lib.a"[m
[31m-            done[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! $ngx_feature_run ]; then[m
[31m-        ngx_feature_run=no[m
[31m-    fi[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SHARED = YES ]; then[m
[31m-[m
[31m-        # Add a test to be called in auto/feature after compilation that will check [m
[31m-        # whether any libraries that are linked are in fact using the path provided to[m
[31m-        # link libraries rather than a standard path. Note : this test will work on [m
[31m-        # all linked shared objects, even if supplied directly by setting [m
[31m-        # $ngx_feature_libs instead of usign $ngx_feature_lib_names[m
[31m-[m
[31m-        # TODO : allow for some libraries to not be checked here if desired - if part of system paths[m
[31m-[m
[31m-        libs="`echo $ngx_feature_libs | tr ' ' '\n' | grep -- -l | sed 's|-l||g'`"[m
[31m-[m
[31m-        local test="[m
[31m-            for l in $libs; do[m
[31m-                o="'\`ldd '$NGX_AUTOTEST' | grep '$LIB'/lib\$l\\.so\`;[m
[31m-                if [ ! \"\$o\" ]; then[m
[31m-                    chmod -x $NGX_AUTOTEST;[m
[31m-                    echo Linker does not link to correct version[m
[31m-                else[m
[31m-                    chmod +x $NGX_AUTOTEST;[m
[31m-                fi[m
[31m-            done'[m
[31m-        test="`echo "$test" | tr '\n' ' '`"[m
[31m-[m
[31m-        ngx_feature_test_libs="$ngx_feature_test_libs; $test"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_feature_libs="$ngx_feature_libs $ngx_feature_add_libs"[m
[31m-    ngx_feature_libs_to_add="$ngx_feature_libs"[m
[31m-    ngx_feature_libs="$ngx_feature_libs $ngx_feature_test_libs"[m
[31m-    ngx_feature="$ngx_auto_lib_name library $ngx_feature"[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_post_setup() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_feature() {[m
[31m-    #ngx_auto_lib_print_feature_vars[m
[31m-    . auto/feature[m
[31m-    [ $ngx_found = yes ] && return 0[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-########################[m
[31m-## TEST DIR FUNCTIONS ##[m
[31m-########################[m
[31m-[m
[31m-ngx_auto_lib_test_dir_pair() {[m
[31m-    ngx_auto_lib_test_inc_dir=$1[m
[31m-    ngx_auto_lib_test_lib_dir=$2[m
[31m-[m
[31m-    if [ $1 = $2 ]; then[m
[31m-        ngx_feature="in $1$3"[m
[31m-    else[m
[31m-        ngx_feature="in $1 and $2$3"[m
[31m-    fi[m
[31m-    ngx_auto_lib_test "$1" "$2" "$3"[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_dir_pairs() {[m
[31m-    ngx_auto_lib_test_dir_pair  "$1/include"  "$2/lib"  "$3"   && return 0[m
[31m-    ngx_auto_lib_test_dir_pair  "$1"          "$2"      "$3"   && return 0[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_dirs() {[m
[31m-[m
[31m-    local msg="$1"[m
[31m-    local bdir idir ldir[m
[31m-[m
[31m-    local bdirs=$ngx_feature_build_dirs[m
[31m-    local idirs=$ngx_feature_build_inc_dirs[m
[31m-    local ldirs=$ngx_feature_build_lib_dirs[m
[31m-[m
[31m-    shift[m
[31m-[m
[31m-    for dir in "$@"; do[m
[31m-        ngx_auto_lib_test_dir=$dir[m
[31m-[m
[31m-        for ldir in $ldirs; do[m
[31m-            for idir in $idirs; do[m
[31m-                ngx_auto_lib_test_dir_pair   "$dir/$idir"  "$dir/$ldir"  "$msg"  && return 0[m
[31m-            done[m
[31m-        done[m
[31m-[m
[31m-        for ldir in $ldirs; do[m
[31m-            ngx_auto_lib_test_dir_pair       "$dir"        "$dir/$ldir"  "$msg"  && return 0[m
[31m-        done[m
[31m-[m
[31m-        for idir in $idirs; do[m
[31m-            ngx_auto_lib_test_dir_pair       "$dir/$idir"  "$dir"        "$msg"  && return 0[m
[31m-        done[m
[31m-[m
[31m-        for bdir in $bdirs; do[m
[31m-            ngx_auto_lib_test_dir_pairs      "$dir/$bdir"  "$dir/$bdir"  "$msg"  && return 0[m
[31m-        done[m
[31m-[m
[31m-        ngx_auto_lib_test_dir_pairs          "$dir"        "$dir"        "$msg"  && return 0[m
[31m-        ngx_auto_lib_test_dir=[m
[31m-    done[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_install_dirs() {[m
[31m-[m
[31m-    local msg="$1"[m
[31m-    local dir=[m
[31m-[m
[31m-    shift[m
[31m-[m
[31m-    for dir in "$@"; do[m
[31m-        ngx_auto_lib_test_dir=$dir[m
[31m-        ngx_auto_lib_test_dir_pair  "$dir/include"  "$dir/lib"  "$msg"   && return 0[m
[31m-        ngx_auto_lib_test_dir=[m
[31m-    done[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_run_tests() {[m
[31m-[m
[31m-    local name="$ngx_auto_lib_name"[m
[31m-    local pfx="$ngx_auto_lib_pfx"[m
[31m-    local PFX="$NGX_AUTO_LIB_PFX"[m
[31m-    local INC="$NGX_AUTO_LIB_INC"[m
[31m-    local LIB="$NGX_AUTO_LIB_LIB"[m
[31m-    local DIR="$NGX_AUTO_LIB_DIR"[m
[31m-    local BASE="$NGX_AUTO_LIB_BASE"[m
[31m-    local MSG="$NGX_AUTO_LIB_MSG"[m
[31m-[m
[31m-[m
[31m-    ngx_found=no[m
[31m-[m
[31m-[m
[31m-    # dependency[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_DEP = YES ]; then[m
[31m-        ngx_auto_lib_test_dir_pair  "$INC"  "$LIB"  "$MSG"[m
[31m-        return $?[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # lib and include dirs set explicitly (e.g. $OPENSSL_INC, $OPENSSL_LIB)[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_LIB_INC = YES ]; then[m
[31m-        ngx_auto_lib_test_dir_pair  "$INC"  "$LIB"  " (specified by \$${PFX}_INC and \$${PFX}_LIB)"  && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # path specified by ${PFX} (e.g. $OPENSSL, $PCRE)[m
[31m-    # Note : these will be set automatically by configure for OpenSSL, PCRE, Zlib etc[m
[31m-    # TODO : change to searching more than one path[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_DIR = YES ] && [ $DIR != NONE ]; then[m
[31m-        ngx_auto_lib_test_dirs  " (specified by \$${PFX})"  $DIR  && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # directories beginning with '$pfx-' that are in $NGX_AUTO_LIB_BASE (e.g. $OPENSSL_BASE)[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_BASE = YES ] && [ $BASE ]; then[m
[31m-[m
[31m-        p=$NGX_AUTO_LIB_SEARCH_BASE_PREFIX[m
[31m-[m
[31m-        if [ "$p" = YES ]; then[m
[31m-            p="!ame $pfx-*"[m
[31m-        elif [ "$p" ]; then[m
[31m-            p="!ame $p*"[m
[31m-        fi[m
[31m-[m
[31m-        ngx_auto_lib_test_dirs " (found under \$${PFX}_BASE)" \[m
[31m-                `find $BASE/* -maxdepth 0 -type d $p 2> /dev/null | sort -r`  && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # directories beginning with '$pfx-' that are in the same directory as the Nginx source[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_PARENT = YES ]; then[m
[31m-        local src_dir=`cd ..; pwd`[m
[31m-        ngx_auto_lib_test_dirs " (found under Nginx source parent dir)" \[m
[31m-                `find $src_dir/* -maxdepth 0 -type d !ame $pfx-* 2> /dev/null | sort -r` && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # system folders[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_SYSTEM = YES ]; then[m
[31m-        ngx_auto_lib_test_install_dirs  ""  $NGX_AUTO_LIB_SYSTEM_DIRS  && return 0[m
[31m-    fi[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-#######################[m
[31m-## HANDLER FUNCTIONS ##[m
[31m-#######################[m
[31m-[m
[31m-ngx_auto_lib_run() {[m
[31m-    ngx_auto_lib_get_variables[m
[31m-    eval AUTO_$NGX_AUTO_LIB_PFX=NO[m
[31m-[m
[31m-    ngx_auto_lib_check_require  || return[m
[31m-    ngx_auto_lib_setup          || return[m
[31m-    ngx_auto_lib_save_feature_vars[m
[31m-    ngx_auto_lib_run_tests[m
[31m-    ngx_auto_lib_post_tests     || return[m
[31m-    ngx_auto_lib_finalize[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_print_feature_vars() {[m
[31m-    echo ----------------------------[m
[31m-    for var in $ngx_feature_vars; do[m
[31m-        eval "echo ngx_feature_$var = \$ngx_feature_$var"[m
[31m-    done[m
[31m-    echo ----------------------------[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_setup() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_post_tests() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-#############################[m
[31m-## SET VARIABLES FUNCTIONS ##[m
[31m-#############################[m
[31m-[m
[31m-# TODO : add HTTP/ADDON settings too[m
[31m-[m
[31m-ngx_auto_lib_set_core_variables() {[m
[31m-    # TODO : don't add includes / libs more than once[m
[31m-[m
[31m-    eval CORE_DEPS=\"$CORE_DEPS $ngx_feature_deps\"[m
[31m-    eval CORE_INCS=\"$CORE_INCS $ngx_feature_path\"[m
[31m-    eval CORE_LIBS=\"$CORE_LIBS $ngx_feature_libs_to_add\"[m
[31m-    eval CORE_SRCS=\"$CORE_SRCS $ngx_feature_srcs\"[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_set_generic_variables() {[m
[31m-    local INC=$ngx_auto_lib_test_inc_dir[m
[31m-    local LIB=$ngx_auto_lib_test_lib_dir[m
[31m-[m
[31m-    modules="$modules $ngx_feature_modules"[m
[31m-[m
[31m-    for have in $ngx_feature_haves; do[m
[31m-        . auto/have[m
[31m-    done[m
[31m-[m
[31m-    set - $ngx_feature_defines[m
[31m-[m
[31m-    while [ $1 ]; do[m
[31m-        have=$1[m
[31m-        value=$2[m
[31m-        . auto/define[m
[31m-    done[m
[31m-[m
[31m-    local PFX=$NGX_AUTO_LIB_PFX[m
[31m-[m
[31m-    eval USE_$PFX=NO[m
[31m-[m
[31m-    if [ $ngx_auto_lib_test_dir ]; then[m
[31m-        eval $PFX=$ngx_auto_lib_test_dir[m
[31m-    else[m
[31m-        eval $PFX=$ngx_auto_lib_lib_dir[m
[31m-    fi[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SHARED != YES ]; then[m
[31m-        for l in $ngx_feature_lib_names; do[m
[31m-            CORE_LIBS=`echo $CORE_LIBS | sed 's|-\<l$l\>||g'`[m
[31m-            ADDON_LIBS=`echo $ADDON_LIBS | sed 's|-\<l$l\>||g'`[m
[31m-        done[m
[31m-    fi[m
[31m-[m
[31m-    eval ${PFX}_INC=$INC[m
[31m-    eval ${PFX}_LIB=$LIB[m
[31m-    eval ${PFX}_SHARED=$NGX_AUTO_LIB_SHARED[m
[31m-    eval AUTO_$PFX=YES[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_set_custom_variables() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-########################[m
[31m-## FINALIZE FUNCTIONS ##[m
[31m-########################[m
[31m-[m
[31m-ngx_auto_lib_finalize() {[m
[31m-    ngx_auto_lib_finalize_core[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_finalize_core() {[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-        ngx_auto_lib_set_core_variables[m
[31m-        ngx_auto_lib_set_generic_variables[m
[31m-[m
[31m-        if [ "$ngx_feature_variables" ]; then[m
[31m-            eval $ngx_feature_variables[m
[31m-        fi[m
[31m-[m
[31m-        ngx_auto_lib_set_custom_variables[m
[31m-[m
[31m-    elif [ $ngx_feature_exit_if_not_found = yes ]; then[m
[31m-[m
[31m-        if [ $ngx_auto_lib_module_name ]; then[m
[31m-            module_txt=" by the $ngx_auto_lib_module_name module" [m
[31m-        else[m
[31m-            module_text=[m
[31m-        fi        [m
[31m-[m
[31m-        lib=$ngx_auto_lib_name[m
[31m-        pfx=$ngx_auto_lib_pfx[m
[31m-        PFX=$NGX_AUTO_LIB_PFX[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the $lib library is required$module_txt, but cannot[m
[31m-be found using the current configuration. In order for the compilation to succeed,[m
[31m-you will need to install the library using your system's package installer or point[m
[31m-the configure script to the library using one of the following variables :[m
[31m-[m
[31m-to define a dir to find $pfx library (source or install dir)    $PFX[m
[31m-to define $pfx lib and include dirs separately                  ${PFX}_LIB & ${PFX}_INC[m
[31m-to define a base dir to search for dirs beginning with $pfx-    ${PFX}_BASE[m
[31m-[m
[31m-e.g.[m
[31m-[m
[31m-$ export ${PFX}_LIB=/path/to/library/lib[m
[31m-$ export ${PFX}_LIB=/path/to/library/include[m
[31m-$ $0 ...[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/notes/CHANGES b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/notes/CHANGES[m
[1mdeleted file mode 100644[m
[1mindex eaaef0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/notes/CHANGES[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-Changelog[m
[31m----------[m
[31m-[m
[31m-0.1         feature : set_var functions[m
[31m-0.1.1       feature : upstream_list directive and functions[m
[31m-0.2         feature : conf merge functions[m
[31m-            feature : conf command macros[m
[31m-            feature : 'action' macros[m
[31m-0.2.1       bugfix  : ndk_map_uri_to_path_add_suffix[m
[31m-0.2.2       feature : regex conf functions[m
[31m-0.2.3       feature : version number[m
[31m-0.2.4       change  : the auto/build script is now executed automatically on compilation[m
[31m-0.2.9       feature : ngx_auto_lib included with source[m
[31m-0.2.11      bugfix  : hash functions did not display properly[m
[31m-0.2.12      feature : patches for rewrite functions and rewrite phase handler[m
[31m-0.2.13      change  : revert to old behaviour rewrite functions[m
[31m-            change  : pre-generated config and macro files now provided[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/notes/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/notes/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 7074f57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/notes/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-Copyright (c) 2010, Marcus Clyne, Simpl (simpl.it)[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are met:[m
[31m-    * Redistributions of source code must retain the above copyright[m
[31m-      notice, this list of conditions and the following disclaimer.[m
[31m-    * Redistributions in binary form must reproduce the above copyright[m
[31m-      notice, this list of conditions and the following disclaimer in the[m
[31m-      documentation and/or other materials provided with the distribution.[m
[31m-    * Neither the name of the organization (Simpl) nor the[m
[31m-      names of its contributors may be used to endorse or promote products[m
[31m-      derived from this software without specific prior written permission.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND[m
[31m-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED[m
[31m-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE[m
[31m-DISCLAIMED. IN NO EVENT SHALL MARCUS CLYNE OR SIMPL BE LIABLE FOR ANY[m
[31m-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES[m
[31m-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;[m
[31m-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND[m
[31m-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_array.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_array.h[m
[1mdeleted file mode 100644[m
[1mindex 4e0d518..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_array.h[m
[1m+++ /dev/null[m
[36m@@ -1,113 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* Non-generated macros */[m
[31m-[m
[31m-#define     ndk_array_count(a)                  ((a)->nelts)[m
[31m-#define     ndk_array_get_first(a)              ((a)->elts)[m
[31m-#define     ndk_array_get_index(a,n)            ((void*) ((char*) (a)->elts + (a)->size * n))[m
[31m-#define     ndk_array_get_last(a)               ((void*) ((char*) (a)->elts + (a)->size * ((a)->nelts - 1)))[m
[31m-#define     ndk_array_get_reverse_index(a,n)    ((void*) ((char*) (a)->elts + (a)->size * ((a)->nelts - 1 - n)))[m
[31m-#define     ndk_array_push_clean(p,a)           {p = ngx_array_push (a); ndk_zerop (p);}[m
[31m-[m
[31m-[m
[31m-/* base action macro macros */[m
[31m-[m
[31m-#define     ndk_array_create_ac(a,pl,n,sz,ac)   {a = ngx_array_create (pl,n,sz); if (a == NULL) ac;}[m
[31m-#define     ndk_array_init_ac(a,pl,n,sz,ac)     {if (ngx_array_init (a,pl,n,sz) == NGX_ERROR) ac;}[m
[31m-#define     ndk_array_push_ac(p,a,ac)           {p = ngx_array_push (a);     if (p == NULL) ac;}[m
[31m-#define     ndk_array_push_clean_ac(p,a,ac)     {p = ngx_array_push (a);     if (p == NULL) ac; ndk_zerop (p);}[m
[31m-#define     ndk_array_push_n_ac(p,a,n,ac)       {p = ngx_array_push_n (a,n); if (p == NULL) ac;}[m
[31m-#define     ndk_array_push_n_clean_ac(p,a,n,ac) {p = ngx_array_push_n (a,n); if (p == NULL) ac; ndk_zeropn (p,n);}[m
[31m-[m
[31m-[m
[31m-/* generated action macros */[m
[31m-[m
[31m-#define     ndk_array_create_r0(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,return 0)[m
[31m-#define     ndk_array_create_r1(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,return 1)[m
[31m-#define     ndk_array_create_r_1(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,return -1)[m
[31m-#define     ndk_array_create_rok(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,return NGX_OK)[m
[31m-#define     ndk_array_create_rce(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_create_rcok(a,pl,n,sz)    ndk_array_create_ac        (a,pl,n,sz,return NGX_CONF_OK)[m
[31m-#define     ndk_array_create_re(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,return NGX_ERROR)[m
[31m-#define     ndk_array_create_rn(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,return NULL)[m
[31m-#define     ndk_array_create_rse(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_create_sce(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_create_g(a,pl,n,sz,_lb)   ndk_array_create_ac        (a,pl,n,sz,goto _lb)[m
[31m-#define     ndk_array_create_ge(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,goto error)[m
[31m-[m
[31m-#define     ndk_array_init_r0(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,return 0)[m
[31m-#define     ndk_array_init_r1(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,return 1)[m
[31m-#define     ndk_array_init_r_1(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,return -1)[m
[31m-#define     ndk_array_init_rok(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,return NGX_OK)[m
[31m-#define     ndk_array_init_rce(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_init_rcok(a,pl,n,sz)      ndk_array_init_ac          (a,pl,n,sz,return NGX_CONF_OK)[m
[31m-#define     ndk_array_init_re(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,return NGX_ERROR)[m
[31m-#define     ndk_array_init_rn(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,return NULL)[m
[31m-#define     ndk_array_init_rse(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_init_sce(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_init_g(a,pl,n,sz,_lb)     ndk_array_init_ac          (a,pl,n,sz,goto _lb)[m
[31m-#define     ndk_array_init_ge(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,goto error)[m
[31m-[m
[31m-#define     ndk_array_push_r0(p,a)              ndk_array_push_ac          (p,a,return 0)[m
[31m-#define     ndk_array_push_r1(p,a)              ndk_array_push_ac          (p,a,return 1)[m
[31m-#define     ndk_array_push_r_1(p,a)             ndk_array_push_ac          (p,a,return -1)[m
[31m-#define     ndk_array_push_rok(p,a)             ndk_array_push_ac          (p,a,return NGX_OK)[m
[31m-#define     ndk_array_push_rce(p,a)             ndk_array_push_ac          (p,a,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_push_rcok(p,a)            ndk_array_push_ac          (p,a,return NGX_CONF_OK)[m
[31m-#define     ndk_array_push_re(p,a)              ndk_array_push_ac          (p,a,return NGX_ERROR)[m
[31m-#define     ndk_array_push_rn(p,a)              ndk_array_push_ac          (p,a,return NULL)[m
[31m-#define     ndk_array_push_rse(p,a)             ndk_array_push_ac          (p,a,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_push_sce(p,a)             ndk_array_push_ac          (p,a,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_push_g(p,a,_lb)           ndk_array_push_ac          (p,a,goto _lb)[m
[31m-#define     ndk_array_push_ge(p,a)              ndk_array_push_ac          (p,a,goto error)[m
[31m-[m
[31m-#define     ndk_array_push_clean_r0(p,a)        ndk_array_push_clean_ac    (p,a,return 0)[m
[31m-#define     ndk_array_push_clean_r1(p,a)        ndk_array_push_clean_ac    (p,a,return 1)[m
[31m-#define     ndk_array_push_clean_r_1(p,a)       ndk_array_push_clean_ac    (p,a,return -1)[m
[31m-#define     ndk_array_push_clean_rok(p,a)       ndk_array_push_clean_ac    (p,a,return NGX_OK)[m
[31m-#define     ndk_array_push_clean_rce(p,a)       ndk_array_push_clean_ac    (p,a,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_push_clean_rcok(p,a)      ndk_array_push_clean_ac    (p,a,return NGX_CONF_OK)[m
[31m-#define     ndk_array_push_clean_re(p,a)        ndk_array_push_clean_ac    (p,a,return NGX_ERROR)[m
[31m-#define     ndk_array_push_clean_rn(p,a)        ndk_array_push_clean_ac    (p,a,return NULL)[m
[31m-#define     ndk_array_push_clean_rse(p,a)       ndk_array_push_clean_ac    (p,a,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_push_clean_sce(p,a)       ndk_array_push_clean_ac    (p,a,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_push_clean_g(p,a,_lb)     ndk_array_push_clean_ac    (p,a,goto _lb)[m
[31m-#define     ndk_array_push_clean_ge(p,a)        ndk_array_push_clean_ac    (p,a,goto error)[m
[31m-[m
[31m-#define     ndk_array_push_n_r0(p,a,n)          ndk_array_push_n_ac        (p,a,n,return 0)[m
[31m-#define     ndk_array_push_n_r1(p,a,n)          ndk_array_push_n_ac        (p,a,n,return 1)[m
[31m-#define     ndk_array_push_n_r_1(p,a,n)         ndk_array_push_n_ac        (p,a,n,return -1)[m
[31m-#define     ndk_array_push_n_rok(p,a,n)         ndk_array_push_n_ac        (p,a,n,return NGX_OK)[m
[31m-#define     ndk_array_push_n_rce(p,a,n)         ndk_array_push_n_ac        (p,a,n,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_push_n_rcok(p,a,n)        ndk_array_push_n_ac        (p,a,n,return NGX_CONF_OK)[m
[31m-#define     ndk_array_push_n_re(p,a,n)          ndk_array_push_n_ac        (p,a,n,return NGX_ERROR)[m
[31m-#define     ndk_array_push_n_rn(p,a,n)          ndk_array_push_n_ac        (p,a,n,return NULL)[m
[31m-#define     ndk_array_push_n_rse(p,a,n)         ndk_array_push_n_ac        (p,a,n,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_push_n_sce(p,a,n)         ndk_array_push_n_ac        (p,a,n,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_push_n_g(p,a,n,_lb)       ndk_array_push_n_ac        (p,a,n,goto _lb)[m
[31m-#define     ndk_array_push_n_ge(p,a,n)          ndk_array_push_n_ac        (p,a,n,goto error)[m
[31m-[m
[31m-#define     ndk_array_push_n_clean_r0(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,return 0)[m
[31m-#define     ndk_array_push_n_clean_r1(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,return 1)[m
[31m-#define     ndk_array_push_n_clean_r_1(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,return -1)[m
[31m-#define     ndk_array_push_n_clean_rok(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,return NGX_OK)[m
[31m-#define     ndk_array_push_n_clean_rce(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_push_n_clean_rcok(p,a,n)  ndk_array_push_n_clean_ac  (p,a,n,return NGX_CONF_OK)[m
[31m-#define     ndk_array_push_n_clean_re(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,return NGX_ERROR)[m
[31m-#define     ndk_array_push_n_clean_rn(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,return NULL)[m
[31m-#define     ndk_array_push_n_clean_rse(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_push_n_clean_sce(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_push_n_clean_g(p,a,n,_lb) ndk_array_push_n_clean_ac  (p,a,n,goto _lb)[m
[31m-#define     ndk_array_push_n_clean_ge(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,goto error)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_basic.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_basic.h[m
[1mdeleted file mode 100644[m
[1mindex c2db894..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_basic.h[m
[1m+++ /dev/null[m
[36m@@ -1,2203 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* conf cmd core values/bitmasks */[m
[31m-[m
[31m-#define     NDK_1MORE               NGX_1MORE[m
[31m-#define     NDK_2MORE               NGX_2MORE[m
[31m-#define     NDK_ANY                 NGX_ANY[m
[31m-#define     NDK_ARGS_NUMBER         NGX_ARGS_NUMBER[m
[31m-#define     NDK_BLOCK               NGX_BLOCK[m
[31m-#define     NDK_FLAG                NGX_FLAG[m
[31m-#define     NDK_MULTI               NGX_MULTI[m
[31m-#define     NDK_TAKE1               NGX_TAKE1[m
[31m-#define     NDK_TAKE12              NGX_TAKE12[m
[31m-#define     NDK_TAKE123             NGX_TAKE123[m
[31m-#define     NDK_TAKE1234            NGX_TAKE1234[m
[31m-#define     NDK_TAKE13              NGX_TAKE13[m
[31m-#define     NDK_TAKE2               NGX_TAKE2[m
[31m-#define     NDK_TAKE23              NGX_TAKE23[m
[31m-#define     NDK_TAKE3               NGX_TAKE3[m
[31m-#define     NDK_TAKE4               NGX_TAKE4[m
[31m-#define     NDK_TAKE5               NGX_TAKE5[m
[31m-#define     NDK_TAKE6               NGX_TAKE6[m
[31m-#define     NDK_TAKE7               NGX_TAKE7[m
[31m-#define     NDK_TAKE8               NGX_TAKE8[m
[31m-[m
[31m-[m
[31m-/* conf cmd bitmasks */[m
[31m-[m
[31m-/* TODO : finish this */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF              NGX_HTTP_MAIN_CONF[m
[31m-#define     NDK_HTTP_SRV_CONF               NGX_HTTP_SRV_CONF[m
[31m-#define     NDK_HTTP_SIF_CONF               NGX_HTTP_SIF_CONF[m
[31m-#define     NDK_HTTP_LOC_CONF               NGX_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_LIF_CONF               NGX_HTTP_LIF_CONF[m
[31m-#define     NDK_HTTP_UPS_CONF               NGX_HTTP_UPS_CONF[m
[31m-#define     NDK_MAIN_CONF                   NGX_MAIN_CONF[m
[31m-#define     NDK_ANY_CONF                    NGX_ANY_CONF[m
[31m-[m
[31m-[m
[31m-/* compound locations */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_CONF[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_SIF_CONF[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_SIF_CONF                   NDK_HTTP_SRV_CONF|NDK_HTTP_SIF_CONF[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF                   NDK_HTTP_SRV_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_SRV_LOC_LIF_CONF               NDK_HTTP_SRV_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-#define     NDK_HTTP_SRV_SIF_LOC_CONF               NDK_HTTP_SRV_SIF_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_SRV_SIF_LOC_LIF_CONF           NDK_HTTP_SRV_SIF_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_LIF_CONF                   NDK_HTTP_LOC_CONF|NDK_HTTP_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_LIF_CONF[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SIF_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_LIF_CONF      NDK_HTTP_SRV_SIF_LOC_LIF_CONF|NDK_MAIN_CONF[m
[31m-#define     NDK_HTTP_CONF                           NDK_HTTP_MAIN_SRV_SIF_LOC_LIF_CONF[m
[31m-#define     NDK_HTTP_ANY_CONF                       NDK_HTTP_CONF|NDK_HTTP_UPS_CONF[m
[31m-[m
[31m-[m
[31m-/* property offsets     NOTE : ngx_module_main_conf_t etc should be defined in the module's .c file before the commands */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_PROP(p)      NGX_HTTP_MAIN_CONF_OFFSET, offsetof (ndk_module_main_conf_t, p)[m
[31m-#define     NDK_HTTP_SRV_CONF_PROP(p)       NGX_HTTP_SRV_CONF_OFFSET, offsetof (ndk_module_srv_conf_t, p)[m
[31m-#define     NDK_HTTP_LOC_CONF_PROP(p)       NGX_HTTP_LOC_CONF_OFFSET, offsetof (ndk_module_loc_conf_t, p)[m
[31m-[m
[31m-[m
[31m-/* conf cmd basic macros */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_extra.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_extra.h[m
[1mdeleted file mode 100644[m
[1mindex 68e276f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_extra.h[m
[1m+++ /dev/null[m
[36m@@ -1,5423 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* conf command macros */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_BUFS(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ENUM(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_FALSE(name,p,post)\[m
[31m-            NDK_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_MSEC(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_NULL(name,p,post)\[m
[31m-            NDK_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_NUM64(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_NUM(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_OFF(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_ANY_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_PATH(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_PTR(name,p,post)\[m
[31m-            NDK_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_REXEX(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_SEC(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_SIZE(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_STR(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TRUE(name,p,post)\[m
[31m-            NDK_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_merge.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_merge.h[m
[1mdeleted file mode 100644[m
[1mindex 4f7855f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_conf_merge.h[m
[1m+++ /dev/null[m
[36m@@ -1,227 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* conf-merge-value macros */[m
[31m-[m
[31m-/* TODO : check that all the main types have a corresponding merge function */[m
[31m-[m
[31m-#define     ndk_conf_merge_value            ngx_conf_merge_value[m
[31m-#define     ndk_conf_merge_off_value        ngx_conf_merge_off_value [m
[31m-#define     ndk_conf_merge_ptr_value        ngx_conf_merge_ptr_value[m
[31m-#define     ndk_conf_merge_str_value        ngx_conf_merge_str_value[m
[31m-#define     ndk_conf_merge_size_value       ngx_conf_merge_size_value [m
[31m-[m
[31m-[m
[31m-#define     ndk_conf_merge_keyval_value(conf,prev,default)                                  \[m
[31m-                                                                                            \[m
[31m-                conf = prev ? prev : default;[m
[31m-[m
[31m-#define     ndk_conf_merge_str_array_value(conf,prev,val1,...)                              \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR) {                                           \[m
[31m-                    if (prev == NGX_CONF_UNSET_PTR) {                                       \[m
[31m-                        if (val1 == NULL) {                                                 \[m
[31m-                            conf = NULL;                                                    \[m
[31m-                        } else {                                                            \[m
[31m-                            char * elts[] = {val1,##__VA_ARGS__};                           \[m
[31m-                            int    n = sizeof(elts)/sizeof(char*);                          \[m
[31m-                                                                                            \[m
[31m-                            conf = ndk_str_array_create (cf->pool, elts, n);                \[m
[31m-                                                                                            \[m
[31m-                            if (conf == NULL)                                               \[m
[31m-                                return  NGX_CONF_ERROR;                                     \[m
[31m-                        }                                                                   \[m
[31m-                    } else {                                                                \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_value_value(conf,prev,default)                      \[m
[31m-                                                                                            \[m
[31m-                if (!conf.str.len) {                                                        \[m
[31m-                    if (prev.str.len) {                                                     \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    } else {                                                                \[m
[31m-                        conf.str.data = (u_char *) default;                                 \[m
[31m-                        conf.str.len = sizeof (default) - 1;                                \[m
[31m-                                                                                            \[m
[31m-                        if (ndk_http_complex_value_compile (cf, &conf))                     \[m
[31m-                            return  NGX_CONF_ERROR;                                         \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_value_array_value(conf,prev,val1,...)               \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR) {                                           \[m
[31m-                    if (prev == NGX_CONF_UNSET_PTR) {                                       \[m
[31m-                        if (val1 == NULL)                                                   \[m
[31m-                            conf = NULL;                                                    \[m
[31m-                        else {                                                              \[m
[31m-                            char * elts[] = {val1,##__VA_ARGS__};                           \[m
[31m-                            int    n = sizeof(elts)/sizeof(char*);                          \[m
[31m-                                                                                            \[m
[31m-                            conf = ndk_http_complex_value_array_create (cf, elts, n);       \[m
[31m-                                                                                            \[m
[31m-                            if (conf == NULL)                                               \[m
[31m-                                return  NGX_CONF_ERROR;                                     \[m
[31m-                        }                                                                   \[m
[31m-                    } else {                                                                \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_path_value(conf,prev,...)                           \[m
[31m-                ndk_conf_merge_http_complex_value_array_value (conf.a, prev.a, __VA_ARGS__)[m
[31m-[m
[31m-#define     ndk_conf_merge_split_path_value(conf,prev,path)                                 \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR)  {                                          \[m
[31m-                    conf = (prev == NGX_CONF_UNSET_PTR ?                                    \[m
[31m-                        ndk_split_path_create_raw (cf, path) : prev);                       \[m
[31m-                }[m
[31m-[m
[31m-[m
[31m-/* conf-merge-prop macros */[m
[31m-[m
[31m-#define     ndk_conf_merge_prop(prop,default)\[m
[31m-            ndk_conf_merge_value\[m
[31m-                (conf->prop, prev->prop, default)[m
[31m-[m
[31m-#define     ndk_conf_merge_bitmask_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_bitmask_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_bufs_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_bufs_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_encoding_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_encoding_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_enum_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_enum_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_false_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_false_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_flag_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_flag_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_full_path_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_full_path_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_http_complex_keyval_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_http_complex_keyval_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_http_complex_path_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_http_complex_path_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_http_complex_value_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_http_complex_value_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_http_complex_value_array_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_http_complex_value_array_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_keyval_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_keyval_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_keyval1_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_keyval1_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_msec_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_msec_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_null_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_null_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_num_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_num_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_num64_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_num64_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_num_flag_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_num_flag_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_off_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_off_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_ptr_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_ptr_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_regex_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_regex_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_regex_array_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_regex_array_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_regex_array_caseless_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_regex_array_caseless_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_regex_caseless_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_regex_caseless_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_sec_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_sec_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_sec_flag_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_sec_flag_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_size_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_size_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_split_path_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_split_path_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_str_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_str_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_str_array_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_str_array_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_str_array_multi_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_str_array_multi_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_true_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_true_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_config.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_config.c[m
[1mdeleted file mode 100644[m
[1mindex d2e572f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_config.c[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* optional includes */[m
[31m-[m
[31m-#if (NDK_BUF)[m
[31m-#include  <ndk_buf.c>[m
[31m-#endif[m
[31m-#if (NDK_COMPLEX_PATH)[m
[31m-#include  <ndk_complex_path.c>[m
[31m-#endif[m
[31m-#if (NDK_COMPLEX_VALUE)[m
[31m-#include  <ndk_complex_value.c>[m
[31m-#endif[m
[31m-#if (NDK_CONF_FILE)[m
[31m-#include  <ndk_conf_file.c>[m
[31m-#endif[m
[31m-#if (NDK_ENCODING)[m
[31m-#include  <ndk_encoding.c>[m
[31m-#endif[m
[31m-#if (NDK_HASH)[m
[31m-#include  <ndk_hash.c>[m
[31m-#endif[m
[31m-#if (NDK_HTTP)[m
[31m-#include  <ndk_http.c>[m
[31m-#endif[m
[31m-#if (NDK_PATH)[m
[31m-#include  <ndk_path.c>[m
[31m-#endif[m
[31m-#if (NDK_PROCESS)[m
[31m-#include  <ndk_process.c>[m
[31m-#endif[m
[31m-#if (NDK_REGEX)[m
[31m-#include  <ndk_regex.c>[m
[31m-#endif[m
[31m-#if (NDK_REWRITE)[m
[31m-#include  <ndk_rewrite.c>[m
[31m-#endif[m
[31m-#if (NDK_SET_VAR)[m
[31m-#include  <ndk_set_var.c>[m
[31m-#endif[m
[31m-#if (NDK_STRING)[m
[31m-#include  <ndk_string.c>[m
[31m-#endif[m
[31m-#if (NDK_UPSTREAM_LIST)[m
[31m-#include  <ndk_upstream_list.c>[m
[31m-#endif[m
[31m-#if (NDK_URI)[m
[31m-#include  <ndk_uri.c>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* module commands */[m
[31m-[m
[31m-static ngx_command_t  ndk_http_commands[] = {[m
[31m-#if (NDK_UPSTREAM_LIST)[m
[31m-#define NDK_UPSTREAM_LIST_CMDS 1[m
[31m-#include  <ndk_upstream_list.h>[m
[31m-#undef  NDK_UPSTREAM_LIST_CMDS[m
[31m-#endif[m
[31m-    ngx_null_command[m
[31m-};[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_config.h[m
[1mdeleted file mode 100644[m
[1mindex 7223950..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,98 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* include all optional modules */[m
[31m-[m
[31m-#ifdef NDK_ALL[m
[31m-[m
[31m-#ifndef NDK_BUF[m
[31m-#define NDK_BUF 1[m
[31m-#endif[m
[31m-#ifndef NDK_COMPLEX_PATH[m
[31m-#define NDK_COMPLEX_PATH 1[m
[31m-#endif[m
[31m-#ifndef NDK_COMPLEX_VALUE[m
[31m-#define NDK_COMPLEX_VALUE 1[m
[31m-#endif[m
[31m-#ifndef NDK_CONF_FILE[m
[31m-#define NDK_CONF_FILE 1[m
[31m-#endif[m
[31m-#ifndef NDK_ENCODING[m
[31m-#define NDK_ENCODING 1[m
[31m-#endif[m
[31m-#ifndef NDK_HASH[m
[31m-#define NDK_HASH 1[m
[31m-#endif[m
[31m-#ifndef NDK_HTTP[m
[31m-#define NDK_HTTP 1[m
[31m-#endif[m
[31m-#ifndef NDK_PATH[m
[31m-#define NDK_PATH 1[m
[31m-#endif[m
[31m-#ifndef NDK_PROCESS[m
[31m-#define NDK_PROCESS 1[m
[31m-#endif[m
[31m-#ifndef NDK_REGEX[m
[31m-#define NDK_REGEX 1[m
[31m-#endif[m
[31m-#ifndef NDK_REWRITE[m
[31m-#define NDK_REWRITE 1[m
[31m-#endif[m
[31m-#ifndef NDK_SET_VAR[m
[31m-#define NDK_SET_VAR 1[m
[31m-#endif[m
[31m-#ifndef NDK_STRING[m
[31m-#define NDK_STRING 1[m
[31m-#endif[m
[31m-#ifndef NDK_UPSTREAM_LIST[m
[31m-#define NDK_UPSTREAM_LIST 1[m
[31m-#endif[m
[31m-#ifndef NDK_URI[m
[31m-#define NDK_URI 1[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* module dependencies */[m
[31m-[m
[31m-#ifdef  NDK_COMPLEX_PATH[m
[31m-#ifndef NDK_COMPLEX_VALUE[m
[31m-#define NDK_COMPLEX_VALUE 1[m
[31m-#endif[m
[31m-#ifndef NDK_PATH[m
[31m-#define NDK_PATH 1[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef  NDK_CONF_FILE[m
[31m-#ifndef NDK_STRING[m
[31m-#define NDK_STRING 1[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef  NDK_HASH[m
[31m-#ifndef NDK_STRING[m
[31m-#define NDK_STRING 1[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef  NDK_SET_VAR[m
[31m-#ifndef NDK_REWRITE[m
[31m-#define NDK_REWRITE 1[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef  NDK_UPSTREAM_LIST[m
[31m-#ifndef NDK_HTTP_CREATE_MAIN_CONF[m
[31m-#define NDK_HTTP_CREATE_MAIN_CONF 1[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_includes.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_includes.h[m
[1mdeleted file mode 100644[m
[1mindex cbbf60a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_includes.h[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-/* optional includes */[m
[31m-[m
[31m-#if (NDK_BUF)[m
[31m-#include  <ndk_buf.h>[m
[31m-#endif[m
[31m-#if (NDK_COMPLEX_PATH)[m
[31m-#include  <ndk_complex_path.h>[m
[31m-#endif[m
[31m-#if (NDK_COMPLEX_VALUE)[m
[31m-#include  <ndk_complex_value.h>[m
[31m-#endif[m
[31m-#if (NDK_CONF_FILE)[m
[31m-#include  <ndk_conf_file.h>[m
[31m-#endif[m
[31m-#if (NDK_ENCODING)[m
[31m-#include  <ndk_encoding.h>[m
[31m-#endif[m
[31m-#if (NDK_HASH)[m
[31m-#include  <ndk_hash.h>[m
[31m-#endif[m
[31m-#if (NDK_HTTP)[m
[31m-#include  <ndk_http.h>[m
[31m-#endif[m
[31m-#if (NDK_PATH)[m
[31m-#include  <ndk_path.h>[m
[31m-#endif[m
[31m-#if (NDK_PROCESS)[m
[31m-#include  <ndk_process.h>[m
[31m-#endif[m
[31m-#if (NDK_REGEX)[m
[31m-#include  <ndk_regex.h>[m
[31m-#endif[m
[31m-#if (NDK_REWRITE)[m
[31m-#include  <ndk_rewrite.h>[m
[31m-#endif[m
[31m-#if (NDK_SET_VAR)[m
[31m-#include  <ndk_set_var.h>[m
[31m-#endif[m
[31m-#if (NDK_STRING)[m
[31m-#include  <ndk_string.h>[m
[31m-#endif[m
[31m-#if (NDK_UPSTREAM_LIST)[m
[31m-#include  <ndk_upstream_list.h>[m
[31m-#endif[m
[31m-#if (NDK_URI)[m
[31m-#include  <ndk_uri.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* non-optional includes */[m
[31m-[m
[31m-#include  <ndk_http_headers.h>[m
[31m-#include  <ndk_log.h>[m
[31m-#include  <ndk_parse.h>[m
[31m-#include  <ndk_string_util.h>[m
[31m-[m
[31m-[m
[31m-/* auto-generated headers */[m
[31m-[m
[31m-#include  <ndk_array.h>[m
[31m-#include  <ndk_palloc.h>[m
[31m-#include  <ndk_conf_merge.h>[m
[31m-#include  <ndk_conf_cmd_basic.h>[m
[31m-#include  <ndk_conf_cmd_extra.h>[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_palloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_palloc.h[m
[1mdeleted file mode 100644[m
[1mindex db8aaf1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/objs/ndk_palloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* Non-generated macros */[m
[31m-[m
[31m-#define     ndk_pallocp(p,pl)                   p = ngx_palloc (pl,sizeof(*p))[m
[31m-#define     ndk_pallocpn(p,pl,n)                p = ngx_palloc (pl,sizeof(*p)*(n))[m
[31m-[m
[31m-#define     ndk_pcallocp(p,pl)                  p = ngx_pcalloc (pl,sizeof(*p))[m
[31m-#define     ndk_pcallocpn(p,pl,n)               p = ngx_pcalloc (pl,sizeof(*p)*(n))[m
[31m-[m
[31m-[m
[31m-/* base action macro macros */[m
[31m-[m
[31m-#define     ndk_palloc_ac(p,pl,sz,ac)           {p = ngx_palloc (pl,sz);    if (p == NULL) ac;}[m
[31m-#define     ndk_pallocp_ac(p,pl,ac)             {ndk_pallocp (p,pl);        if (p == NULL) ac;}[m
[31m-#define     ndk_pallocpn_ac(p,pl,n,ac)          {ndk_pallocpn (p,pl,n);     if (p == NULL) ac;}[m
[31m-#define     ndk_pcalloc_ac(p,pl,sz,ac)          {p = ngx_pcalloc (pl,sz);   if (p == NULL) ac;}[m
[31m-#define     ndk_pcallocp_ac(p,pl,ac)            {ndk_pcallocp (p,pl);       if (p == NULL) ac;}[m
[31m-#define     ndk_pcallocpn_ac(p,pl,n,ac)         {ndk_pcallocpn (p,pl,n);    if (p == NULL) ac;}[m
[31m-[m
[31m-[m
[31m-/* generated action macros */[m
[31m-[m
[31m-#define     ndk_palloc_r0(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,return 0)[m
[31m-#define     ndk_palloc_r1(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,return 1)[m
[31m-#define     ndk_palloc_r_1(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,return -1)[m
[31m-#define     ndk_palloc_rok(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,return NGX_OK)[m
[31m-#define     ndk_palloc_rce(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,return NGX_CONF_ERROR)[m
[31m-#define     ndk_palloc_rcok(p,pl,sz)            ndk_palloc_ac              (p,pl,sz,return NGX_CONF_OK)[m
[31m-#define     ndk_palloc_re(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,return NGX_ERROR)[m
[31m-#define     ndk_palloc_rn(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,return NULL)[m
[31m-#define     ndk_palloc_rse(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,{ngx_script_error (e); return;})[m
[31m-#define     ndk_palloc_sce(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_palloc_g(p,pl,sz,_lb)           ndk_palloc_ac              (p,pl,sz,goto _lb)[m
[31m-#define     ndk_palloc_ge(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,goto error)[m
[31m-[m
[31m-#define     ndk_pallocp_r0(p,pl)                ndk_pallocp_ac             (p,pl,return 0)[m
[31m-#define     ndk_pallocp_r1(p,pl)                ndk_pallocp_ac             (p,pl,return 1)[m
[31m-#define     ndk_pallocp_r_1(p,pl)               ndk_pallocp_ac             (p,pl,return -1)[m
[31m-#define     ndk_pallocp_rok(p,pl)               ndk_pallocp_ac             (p,pl,return NGX_OK)[m
[31m-#define     ndk_pallocp_rce(p,pl)               ndk_pallocp_ac             (p,pl,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pallocp_rcok(p,pl)              ndk_pallocp_ac             (p,pl,return NGX_CONF_OK)[m
[31m-#define     ndk_pallocp_re(p,pl)                ndk_pallocp_ac             (p,pl,return NGX_ERROR)[m
[31m-#define     ndk_pallocp_rn(p,pl)                ndk_pallocp_ac             (p,pl,return NULL)[m
[31m-#define     ndk_pallocp_rse(p,pl)               ndk_pallocp_ac             (p,pl,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pallocp_sce(p,pl)               ndk_pallocp_ac             (p,pl,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pallocp_g(p,pl,_lb)             ndk_pallocp_ac             (p,pl,goto _lb)[m
[31m-#define     ndk_pallocp_ge(p,pl)                ndk_pallocp_ac             (p,pl,goto error)[m
[31m-[m
[31m-#define     ndk_pallocpn_r0(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,return 0)[m
[31m-#define     ndk_pallocpn_r1(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,return 1)[m
[31m-#define     ndk_pallocpn_r_1(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,return -1)[m
[31m-#define     ndk_pallocpn_rok(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,return NGX_OK)[m
[31m-#define     ndk_pallocpn_rce(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pallocpn_rcok(p,pl,n)           ndk_pallocpn_ac            (p,pl,n,return NGX_CONF_OK)[m
[31m-#define     ndk_pallocpn_re(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,return NGX_ERROR)[m
[31m-#define     ndk_pallocpn_rn(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,return NULL)[m
[31m-#define     ndk_pallocpn_rse(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pallocpn_sce(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pallocpn_g(p,pl,n,_lb)          ndk_pallocpn_ac            (p,pl,n,goto _lb)[m
[31m-#define     ndk_pallocpn_ge(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,goto error)[m
[31m-[m
[31m-#define     ndk_pcalloc_r0(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,return 0)[m
[31m-#define     ndk_pcalloc_r1(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,return 1)[m
[31m-#define     ndk_pcalloc_r_1(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,return -1)[m
[31m-#define     ndk_pcalloc_rok(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,return NGX_OK)[m
[31m-#define     ndk_pcalloc_rce(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pcalloc_rcok(p,pl,sz)           ndk_pcalloc_ac             (p,pl,sz,return NGX_CONF_OK)[m
[31m-#define     ndk_pcalloc_re(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,return NGX_ERROR)[m
[31m-#define     ndk_pcalloc_rn(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,return NULL)[m
[31m-#define     ndk_pcalloc_rse(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pcalloc_sce(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pcalloc_g(p,pl,sz,_lb)          ndk_pcalloc_ac             (p,pl,sz,goto _lb)[m
[31m-#define     ndk_pcalloc_ge(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,goto error)[m
[31m-[m
[31m-#define     ndk_pcallocp_r0(p,pl)               ndk_pcallocp_ac            (p,pl,return 0)[m
[31m-#define     ndk_pcallocp_r1(p,pl)               ndk_pcallocp_ac            (p,pl,return 1)[m
[31m-#define     ndk_pcallocp_r_1(p,pl)              ndk_pcallocp_ac            (p,pl,return -1)[m
[31m-#define     ndk_pcallocp_rok(p,pl)              ndk_pcallocp_ac            (p,pl,return NGX_OK)[m
[31m-#define     ndk_pcallocp_rce(p,pl)              ndk_pcallocp_ac            (p,pl,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pcallocp_rcok(p,pl)             ndk_pcallocp_ac            (p,pl,return NGX_CONF_OK)[m
[31m-#define     ndk_pcallocp_re(p,pl)               ndk_pcallocp_ac            (p,pl,return NGX_ERROR)[m
[31m-#define     ndk_pcallocp_rn(p,pl)               ndk_pcallocp_ac            (p,pl,return NULL)[m
[31m-#define     ndk_pcallocp_rse(p,pl)              ndk_pcallocp_ac            (p,pl,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pcallocp_sce(p,pl)              ndk_pcallocp_ac            (p,pl,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pcallocp_g(p,pl,_lb)            ndk_pcallocp_ac            (p,pl,goto _lb)[m
[31m-#define     ndk_pcallocp_ge(p,pl)               ndk_pcallocp_ac            (p,pl,goto error)[m
[31m-[m
[31m-#define     ndk_pcallocpn_r0(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,return 0)[m
[31m-#define     ndk_pcallocpn_r1(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,return 1)[m
[31m-#define     ndk_pcallocpn_r_1(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,return -1)[m
[31m-#define     ndk_pcallocpn_rok(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,return NGX_OK)[m
[31m-#define     ndk_pcallocpn_rce(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pcallocpn_rcok(p,pl,n)          ndk_pcallocpn_ac           (p,pl,n,return NGX_CONF_OK)[m
[31m-#define     ndk_pcallocpn_re(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,return NGX_ERROR)[m
[31m-#define     ndk_pcallocpn_rn(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,return NULL)[m
[31m-#define     ndk_pcallocpn_rse(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pcallocpn_sce(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pcallocpn_g(p,pl,n,_lb)         ndk_pcallocpn_ac           (p,pl,n,goto _lb)[m
[31m-#define     ndk_pcallocpn_ge(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,goto error)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/auto_config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/auto_config[m
[1mdeleted file mode 100644[m
[1mindex ba4fdd4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/auto_config[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-diff -pNr a/src/core/ngx_config.h b/src/core/ngx_config.h[m
[31m-*** a/src/core/ngx_config.h	2008-09-19 13:47:13.000000000 +0100[m
[31m---- b/src/core/ngx_config.h	2010-10-09 17:14:13.000000000 +0100[m
[31m-*************** typedef intptr_t        ngx_flag_t;[m
[31m-*** 127,131 ****[m
[31m-  #define NGX_MAX_UINT32_VALUE  (uint32_t) 0xffffffff[m
[31m-  #endif[m
[31m-  [m
[31m-! [m
[31m-  #endif /* _NGX_CONFIG_H_INCLUDED_ */[m
[31m---- 127,131 ----[m
[31m-  #define NGX_MAX_UINT32_VALUE  (uint32_t) 0xffffffff[m
[31m-  #endif[m
[31m-  [m
[31m-! #include <ndk_config.h>[m
[31m-  #endif /* _NGX_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/expose_rewrite_functions b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/expose_rewrite_functions[m
[1mdeleted file mode 100644[m
[1mindex ec1d6d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/expose_rewrite_functions[m
[1m+++ /dev/null[m
[36m@@ -1,291 +0,0 @@[m
[31m-diff -rNp a/src/http/modules/ngx_http_rewrite_module.c b/src/http/modules/ngx_http_rewrite_module.c[m
[31m-*** a/src/http/modules/ngx_http_rewrite_module.c	2010-06-18 16:15:20.000000000 +0100[m
[31m---- b/src/http/modules/ngx_http_rewrite_module.c	2010-10-09 14:47:10.000000000 +0100[m
[31m-***************[m
[31m-*** 8,14 ****[m
[31m-  #include <ngx_core.h>[m
[31m-  #include <ngx_http.h>[m
[31m-  [m
[31m-! [m
[31m-  typedef struct {[m
[31m-      ngx_array_t  *codes;        /* uintptr_t */[m
[31m-  [m
[31m---- 8,14 ----[m
[31m-  #include <ngx_core.h>[m
[31m-  #include <ngx_http.h>[m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-  typedef struct {[m
[31m-      ngx_array_t  *codes;        /* uintptr_t */[m
[31m-  [m
[31m-*************** typedef struct {[m
[31m-*** 17,23 ****[m
[31m-      ngx_flag_t    log;[m
[31m-      ngx_flag_t    uninitialized_variable_warn;[m
[31m-  } ngx_http_rewrite_loc_conf_t;[m
[31m-! [m
[31m-  [m
[31m-  static void *ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf);[m
[31m-  static char *ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf,[m
[31m---- 17,23 ----[m
[31m-      ngx_flag_t    log;[m
[31m-      ngx_flag_t    uninitialized_variable_warn;[m
[31m-  } ngx_http_rewrite_loc_conf_t;[m
[31m-! #endif[m
[31m-  [m
[31m-  static void *ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf);[m
[31m-  static char *ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf,[m
[31m-*************** static char *ngx_http_rewrite_return(ngx[m
[31m-*** 28,44 ****[m
[31m-      void *conf);[m
[31m-  static char *ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-  static char *ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-  static char * ngx_http_rewrite_if_condition(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf);[m
[31m-  static char *ngx_http_rewrite_variable(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-  static char *ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-  static char * ngx_http_rewrite_value(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-! [m
[31m-  [m
[31m-  static ngx_command_t  ngx_http_rewrite_commands[] = {[m
[31m-  [m
[31m---- 28,47 ----[m
[31m-      void *conf);[m
[31m-  static char *ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-+ #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-  static char *ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-  static char * ngx_http_rewrite_if_condition(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf);[m
[31m-  static char *ngx_http_rewrite_variable(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-+ #endif[m
[31m-  static char *ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-+ #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-  static char * ngx_http_rewrite_value(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-! #endif[m
[31m-  [m
[31m-  static ngx_command_t  ngx_http_rewrite_commands[] = {[m
[31m-  [m
[31m-*************** ngx_http_rewrite_handler(ngx_http_reques[m
[31m-*** 178,185 ****[m
[31m-      return r->err_status;[m
[31m-  }[m
[31m-  [m
[31m-! [m
[31m-! static ngx_int_t[m
[31m-  ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-      uintptr_t data)[m
[31m-  {[m
[31m---- 181,190 ----[m
[31m-      return r->err_status;[m
[31m-  }[m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! ngx_int_t[m
[31m-  ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-      uintptr_t data)[m
[31m-  {[m
[31m-*************** ngx_http_rewrite_break(ngx_conf_t *cf, n[m
[31m-*** 511,517 ****[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! static char *[m
[31m-  ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-  {[m
[31m-      ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m---- 516,525 ----[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! char *[m
[31m-  ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-  {[m
[31m-      ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-*************** ngx_http_rewrite_if(ngx_conf_t *cf, ngx_[m
[31m-*** 627,633 ****[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! static char *[m
[31m-  ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf)[m
[31m-  {[m
[31m-      u_char                        *p;[m
[31m---- 635,644 ----[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! char *[m
[31m-  ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf)[m
[31m-  {[m
[31m-      u_char                        *p;[m
[31m-*************** ngx_http_rewrite_if_condition(ngx_conf_t[m
[31m-*** 847,853 ****[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! static char *[m
[31m-  ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-      ngx_str_t *value)[m
[31m-  {[m
[31m---- 858,867 ----[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! char *[m
[31m-  ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-      ngx_str_t *value)[m
[31m-  {[m
[31m-*************** ngx_http_rewrite_set(ngx_conf_t *cf, ngx[m
[31m-*** 948,954 ****[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! static char *[m
[31m-  ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-      ngx_str_t *value)[m
[31m-  {[m
[31m---- 962,971 ----[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! char *[m
[31m-  ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-      ngx_str_t *value)[m
[31m-  {[m
[31m-diff -rNp a/src/http/modules/ngx_http_rewrite_module.h b/src/http/modules/ngx_http_rewrite_module.h[m
[31m-*** a/src/http/modules/ngx_http_rewrite_module.h	1970-01-01 01:00:00.000000000 +0100[m
[31m---- b/src/http/modules/ngx_http_rewrite_module.h	2010-10-09 14:38:04.000000000 +0100[m
[31m-***************[m
[31m-*** 0 ****[m
[31m---- 1,47 ----[m
[31m-+ [m
[31m-+ /*[m
[31m-+  * Copyright (C) Marcus Clyne[m
[31m-+  *[m
[31m-+  * Note : this file has been created by the Nginx Development Kit using[m
[31m-+  * some code from ngx_http_rewrite_module.c[m
[31m-+  */[m
[31m-+ [m
[31m-+ #if (NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-+ [m
[31m-+ #ifndef _NGX_HTTP_REWRITE_H_INCLUDED_[m
[31m-+ #define _NGX_HTTP_REWRITE_H_INCLUDED_[m
[31m-+ [m
[31m-+ #include <ngx_config.h>[m
[31m-+ #include <ngx_core.h>[m
[31m-+ #include <ngx_http.h>[m
[31m-+ [m
[31m-+ [m
[31m-+ extern  ngx_module_t  ngx_http_rewrite_module;[m
[31m-+ [m
[31m-+ [m
[31m-+ typedef struct {[m
[31m-+     ngx_array_t  *codes;        /* uintptr_t */[m
[31m-+ [m
[31m-+     ngx_uint_t    stack_size;[m
[31m-+ [m
[31m-+     ngx_flag_t    log;[m
[31m-+     ngx_flag_t    uninitialized_variable_warn;[m
[31m-+ } ngx_http_rewrite_loc_conf_t;[m
[31m-+ [m
[31m-+ [m
[31m-+ char *[m
[31m-+ ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-+ char *[m
[31m-+ ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf);[m
[31m-+ char *[m
[31m-+ ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-+     ngx_str_t *value);[m
[31m-+ char *[m
[31m-+ ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-+     ngx_str_t *value);[m
[31m-+ ngx_int_t[m
[31m-+ ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-+     uintptr_t data);[m
[31m-+ [m
[31m-+ #endif[m
[31m-+ #endif[m
[31m-diff -rNp a/src/http/ngx_http.h b/src/http/ngx_http.h[m
[31m-*** a/src/http/ngx_http.h	2010-06-15 16:13:34.000000000 +0100[m
[31m---- b/src/http/ngx_http.h	2010-10-09 14:25:56.000000000 +0100[m
[31m-*************** typedef u_char *(*ngx_http_log_handler_p[m
[31m-*** 43,48 ****[m
[31m---- 43,52 ----[m
[31m-  #include <ngx_http_ssl_module.h>[m
[31m-  #endif[m
[31m-  [m
[31m-+ #if (NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-+ #include <ngx_http_rewrite_module.h>[m
[31m-+ #endif[m
[31m-+ [m
[31m-  [m
[31m-  struct ngx_http_log_ctx_s {[m
[31m-      ngx_connection_t    *connection;[m
[31m-diff -rNp a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c[m
[31m-*** a/src/http/ngx_http_script.c	2010-09-13 13:44:43.000000000 +0100[m
[31m---- b/src/http/ngx_http_script.c	2010-10-09 14:36:10.000000000 +0100[m
[31m-*************** static size_t ngx_http_script_full_name_[m
[31m-*** 26,35 ****[m
[31m---- 26,43 ----[m
[31m-  static void ngx_http_script_full_name_code(ngx_http_script_engine_t *e);[m
[31m-  [m
[31m-  [m
[31m-+ #if (NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-+ [m
[31m-+ uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL;[m
[31m-+ [m
[31m-+ #else[m
[31m-+ [m
[31m-  #define ngx_http_script_exit  (u_char *) &ngx_http_script_exit_code[m
[31m-  [m
[31m-  static uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL;[m
[31m-  [m
[31m-+ #endif[m
[31m-+ [m
[31m-  [m
[31m-  void[m
[31m-  ngx_http_script_flush_complex_value(ngx_http_request_t *r,[m
[31m-diff -rNp a/src/http/ngx_http_script.h b/src/http/ngx_http_script.h[m
[31m-*** a/src/http/ngx_http_script.h	2010-09-13 13:44:43.000000000 +0100[m
[31m---- b/src/http/ngx_http_script.h	2010-10-09 14:33:40.000000000 +0100[m
[31m-***************[m
[31m-*** 12,17 ****[m
[31m---- 12,25 ----[m
[31m-  #include <ngx_core.h>[m
[31m-  #include <ngx_http.h>[m
[31m-  [m
[31m-+ #if (NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-+ [m
[31m-+ #define ngx_http_script_exit  (u_char *) &ngx_http_script_exit_code[m
[31m-+ [m
[31m-+ extern uintptr_t ngx_http_script_exit_code;[m
[31m-+ [m
[31m-+ #endif[m
[31m-+ [m
[31m-  [m
[31m-  typedef struct {[m
[31m-      u_char                     *ip;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/rewrite_phase_handler b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/rewrite_phase_handler[m
[1mdeleted file mode 100644[m
[1mindex bd5161f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/patches/rewrite_phase_handler[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-diff -p -r a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c[m
[31m-*** a/src/http/ngx_http_core_module.c	2010-09-27 12:48:12.000000000 +0100[m
[31m---- b/src/http/ngx_http_core_module.c	2010-10-09 13:44:09.000000000 +0100[m
[31m-*************** ngx_http_core_rewrite_phase(ngx_http_req[m
[31m-*** 910,915 ****[m
[31m---- 910,922 ----[m
[31m-          return NGX_AGAIN;[m
[31m-      }[m
[31m-  [m
[31m-+ #if defined(nginx_version) && nginx_version >= 8042 && (NDK_REWRITE_PHASE)[m
[31m-+ [m
[31m-+     if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-+         return NGX_OK;[m
[31m-+     }[m
[31m-+     [m
[31m-+ #endif[m
[31m-      /* rc == NGX_OK || rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-  [m
[31m-      ngx_http_finalize_request(r, rc);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/md5.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/md5.h[m
[1mdeleted file mode 100644[m
[1mindex 4cbf843..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/md5.h[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-/* crypto/md5/md5.h */[m
[31m-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * This package is an SSL implementation written[m
[31m- * by Eric Young (eay@cryptsoft.com).[m
[31m- * The implementation was written so as to conform with Netscapes SSL.[m
[31m- * [m
[31m- * This library is free for commercial and non-commercial use as long as[m
[31m- * the following conditions are aheared to.  The following conditions[m
[31m- * apply to all code found in this distribution, be it the RC4, RSA,[m
[31m- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation[m
[31m- * included with this distribution is covered by the same copyright terms[m
[31m- * except that the holder is Tim Hudson (tjh@cryptsoft.com).[m
[31m- * [m
[31m- * Copyright remains Eric Young's, and as such any Copyright notices in[m
[31m- * the code are not to be removed.[m
[31m- * If this package is used in a product, Eric Young should be given attribution[m
[31m- * as the author of the parts of the library used.[m
[31m- * This can be in the form of a textual message at program startup or[m
[31m- * in documentation (online or textual) provided with the package.[m
[31m- * [m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- * 3. All advertising materials mentioning features or use of this software[m
[31m- *    must display the following acknowledgement:[m
[31m- *    "This product includes cryptographic software written by[m
[31m- *     Eric Young (eay@cryptsoft.com)"[m
[31m- *    The word 'cryptographic' can be left out if the rouines from the library[m
[31m- *    being used are not cryptographic related :-).[m
[31m- * 4. If you include any Windows specific code (or a derivative thereof) from [m
[31m- *    the apps directory (application code) you must include an acknowledgement:[m
[31m- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"[m
[31m- * [m
[31m- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- * [m
[31m- * The licence and distribution terms for any publically available version or[m
[31m- * derivative of this code cannot be changed.  i.e. this code cannot simply be[m
[31m- * copied and put under another distribution licence[m
[31m- * [including the GNU Public Licence.][m
[31m- */[m
[31m-[m
[31m-#ifndef HEADER_MD5_H[m
[31m-#define HEADER_MD5_H[m
[31m-[m
[31m-#include <openssl/e_os2.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#ifdef  __cplusplus[m
[31m-extern "C" {[m
[31m-#endif[m
[31m-[m
[31m-#ifdef OPENSSL_NO_MD5[m
[31m-#error MD5 is disabled.[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![m
[31m- * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then ![m
[31m- * ! MD5_LONG_LOG2 has to be defined along.			   ![m
[31m- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![m
[31m- */[m
[31m-[m
[31m-#if defined(__LP32__)[m
[31m-#define MD5_LONG unsigned long[m
[31m-#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)[m
[31m-#define MD5_LONG unsigned long[m
[31m-#define MD5_LONG_LOG2 3[m
[31m-/*[m
[31m- * _CRAY note. I could declare short, but I have no idea what impact[m
[31m- * does it have on performance on none-T3E machines. I could declare[m
[31m- * int, but at least on C90 sizeof(int) can be chosen at compile time.[m
[31m- * So I've chosen long...[m
[31m- *					<appro@fy.chalmers.se>[m
[31m- */[m
[31m-#else[m
[31m-#define MD5_LONG unsigned int[m
[31m-#endif[m
[31m-[m
[31m-#define MD5_CBLOCK	64[m
[31m-#define MD5_LBLOCK	(MD5_CBLOCK/4)[m
[31m-#define MD5_DIGEST_LENGTH 16[m
[31m-[m
[31m-typedef struct MD5state_st[m
[31m-	{[m
[31m-	MD5_LONG A,B,C,D;[m
[31m-	MD5_LONG Nl,Nh;[m
[31m-	MD5_LONG data[MD5_LBLOCK];[m
[31m-	unsigned int num;[m
[31m-	} MD5_CTX;[m
[31m-[m
[31m-int MD5_Init(MD5_CTX *c);[m
[31m-int MD5_Update(MD5_CTX *c, const void *data, size_t len);[m
[31m-int MD5_Final(unsigned char *md, MD5_CTX *c);[m
[31m-unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);[m
[31m-void MD5_Transform(MD5_CTX *c, const unsigned char *b);[m
[31m-#ifdef  __cplusplus[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/murmurhash2.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/murmurhash2.c[m
[1mdeleted file mode 100644[m
[1mindex ac899b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/murmurhash2.c[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#ifndef MURMURHASH2_C[m
[31m-#define MURMURHASH2_C[m
[31m-[m
[31m-#define     MURMURHASH2_DIGEST_LENGTH   4[m
[31m-[m
[31m-/*[m
[31m- * -----------------------------------------------------------------------------[m
[31m- * MurmurHash2, by Austin Appleby[m
[31m-[m
[31m- * Note - This code makes a few assumptions about how your machine behaves -[m
[31m-[m
[31m- * 1. We can read a 4-byte value from any address without crashing[m
[31m- * 2. sizeof(int) == 4[m
[31m-[m
[31m- * And it has a few limitations -[m
[31m-[m
[31m- * 1. It will not work incrementally.[m
[31m- * 2. It will not produce the same results on little-endian and big-endian[m
[31m- *    machines.[m
[31m- */[m
[31m-[m
[31m-unsigned int MurmurHash2 ( const void * key, int len, unsigned int seed )[m
[31m-{[m
[31m-	/*[m
[31m-         * 'm' and 'r' are mixing constants generated offline.[m
[31m-	 * They're not really 'magic', they just happen to work well.[m
[31m-         */[m
[31m-[m
[31m-	const unsigned int m = 0x5bd1e995;[m
[31m-	const int r = 24;[m
[31m-[m
[31m-	/* Initialize the hash to a 'random' value */[m
[31m-[m
[31m-	unsigned int h = seed ^ len;[m
[31m-[m
[31m-	/* Mix 4 bytes at a time into the hash */[m
[31m-[m
[31m-	const unsigned char * data = (const unsigned char *)key;[m
[31m-[m
[31m-	while(len >= 4)[m
[31m-	{[m
[31m-		unsigned int k = *(unsigned int *)data;[m
[31m-[m
[31m-		k *= m;[m
[31m-		k ^= k >> r;[m
[31m-		k *= m;[m
[31m-[m
[31m-		h *= m;[m
[31m-		h ^= k;[m
[31m-[m
[31m-		data += 4;[m
[31m-		len -= 4;[m
[31m-	}[m
[31m-[m
[31m-	/* Handle the last few bytes of the input array */[m
[31m-[m
[31m-	switch(len)[m
[31m-	{[m
[31m-	case 3: h ^= data[2] << 16;[m
[31m-	case 2: h ^= data[1] << 8;[m
[31m-	case 1: h ^= data[0];[m
[31m-	        h *= m;[m
[31m-	};[m
[31m-[m
[31m-	/* Do a few final mixes of the hash to ensure the last few[m
[31m-	 * bytes are well-incorporated. */[m
[31m-[m
[31m-	h ^= h >> 13;[m
[31m-	h *= m;[m
[31m-	h ^= h >> 15;[m
[31m-[m
[31m-	return h;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/sha.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/sha.h[m
[1mdeleted file mode 100644[m
[1mindex 16cacf9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/hash/sha.h[m
[1m+++ /dev/null[m
[36m@@ -1,200 +0,0 @@[m
[31m-/* crypto/sha/sha.h */[m
[31m-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * This package is an SSL implementation written[m
[31m- * by Eric Young (eay@cryptsoft.com).[m
[31m- * The implementation was written so as to conform with Netscapes SSL.[m
[31m- * [m
[31m- * This library is free for commercial and non-commercial use as long as[m
[31m- * the following conditions are aheared to.  The following conditions[m
[31m- * apply to all code found in this distribution, be it the RC4, RSA,[m
[31m- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation[m
[31m- * included with this distribution is covered by the same copyright terms[m
[31m- * except that the holder is Tim Hudson (tjh@cryptsoft.com).[m
[31m- * [m
[31m- * Copyright remains Eric Young's, and as such any Copyright notices in[m
[31m- * the code are not to be removed.[m
[31m- * If this package is used in a product, Eric Young should be given attribution[m
[31m- * as the author of the parts of the library used.[m
[31m- * This can be in the form of a textual message at program startup or[m
[31m- * in documentation (online or textual) provided with the package.[m
[31m- * [m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- * 3. All advertising materials mentioning features or use of this software[m
[31m- *    must display the following acknowledgement:[m
[31m- *    "This product includes cryptographic software written by[m
[31m- *     Eric Young (eay@cryptsoft.com)"[m
[31m- *    The word 'cryptographic' can be left out if the rouines from the library[m
[31m- *    being used are not cryptographic related :-).[m
[31m- * 4. If you include any Windows specific code (or a derivative thereof) from [m
[31m- *    the apps directory (application code) you must include an acknowledgement:[m
[31m- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"[m
[31m- * [m
[31m- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- * [m
[31m- * The licence and distribution terms for any publically available version or[m
[31m- * derivative of this code cannot be changed.  i.e. this code cannot simply be[m
[31m- * copied and put under another distribution licence[m
[31m- * [including the GNU Public Licence.][m
[31m- */[m
[31m-[m
[31m-#ifndef HEADER_SHA_H[m
[31m-#define HEADER_SHA_H[m
[31m-[m
[31m-#include <openssl/e_os2.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#ifdef  __cplusplus[m
[31m-extern "C" {[m
[31m-#endif[m
[31m-[m
[31m-#if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1))[m
[31m-#error SHA is disabled.[m
[31m-#endif[m
[31m-[m
[31m-#if defined(OPENSSL_FIPS)[m
[31m-#define FIPS_SHA_SIZE_T size_t[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![m
[31m- * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ![m
[31m- * ! SHA_LONG_LOG2 has to be defined along.                        ![m
[31m- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![m
[31m- */[m
[31m-[m
[31m-#if defined(__LP32__)[m
[31m-#define SHA_LONG unsigned long[m
[31m-#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)[m
[31m-#define SHA_LONG unsigned long[m
[31m-#define SHA_LONG_LOG2 3[m
[31m-#else[m
[31m-#define SHA_LONG unsigned int[m
[31m-#endif[m
[31m-[m
[31m-#define SHA_LBLOCK	16[m
[31m-#define SHA_CBLOCK	(SHA_LBLOCK*4)	/* SHA treats input data as a[m
[31m-					 * contiguous array of 32 bit[m
[31m-					 * wide big-endian values. */[m
[31m-#define SHA_LAST_BLOCK  (SHA_CBLOCK-8)[m
[31m-#define SHA_DIGEST_LENGTH 20[m
[31m-[m
[31m-typedef struct SHAstate_st[m
[31m-	{[m
[31m-	SHA_LONG h0,h1,h2,h3,h4;[m
[31m-	SHA_LONG Nl,Nh;[m
[31m-	SHA_LONG data[SHA_LBLOCK];[m
[31m-	unsigned int num;[m
[31m-	} SHA_CTX;[m
[31m-[m
[31m-#ifndef OPENSSL_NO_SHA0[m
[31m-int SHA_Init(SHA_CTX *c);[m
[31m-int SHA_Update(SHA_CTX *c, const void *data, size_t len);[m
[31m-int SHA_Final(unsigned char *md, SHA_CTX *c);[m
[31m-unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md);[m
[31m-void SHA_Transform(SHA_CTX *c, const unsigned char *data);[m
[31m-#endif[m
[31m-#ifndef OPENSSL_NO_SHA1[m
[31m-int SHA1_Init(SHA_CTX *c);[m
[31m-int SHA1_Update(SHA_CTX *c, const void *data, size_t len);[m
[31m-int SHA1_Final(unsigned char *md, SHA_CTX *c);[m
[31m-unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md);[m
[31m-void SHA1_Transform(SHA_CTX *c, const unsigned char *data);[m
[31m-#endif[m
[31m-[m
[31m-#define SHA256_CBLOCK	(SHA_LBLOCK*4)	/* SHA-256 treats input data as a[m
[31m-					 * contiguous array of 32 bit[m
[31m-					 * wide big-endian values. */[m
[31m-#define SHA224_DIGEST_LENGTH	28[m
[31m-#define SHA256_DIGEST_LENGTH	32[m
[31m-[m
[31m-typedef struct SHA256state_st[m
[31m-	{[m
[31m-	SHA_LONG h[8];[m
[31m-	SHA_LONG Nl,Nh;[m
[31m-	SHA_LONG data[SHA_LBLOCK];[m
[31m-	unsigned int num,md_len;[m
[31m-	} SHA256_CTX;[m
[31m-[m
[31m-#ifndef OPENSSL_NO_SHA256[m
[31m-int SHA224_Init(SHA256_CTX *c);[m
[31m-int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);[m
[31m-int SHA224_Final(unsigned char *md, SHA256_CTX *c);[m
[31m-unsigned char *SHA224(const unsigned char *d, size_t n,unsigned char *md);[m
[31m-int SHA256_Init(SHA256_CTX *c);[m
[31m-int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);[m
[31m-int SHA256_Final(unsigned char *md, SHA256_CTX *c);[m
[31m-unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md);[m
[31m-void SHA256_Transform(SHA256_CTX *c, const unsigned char *data);[m
[31m-#endif[m
[31m-[m
[31m-#define SHA384_DIGEST_LENGTH	48[m
[31m-#define SHA512_DIGEST_LENGTH	64[m
[31m-[m
[31m-#ifndef OPENSSL_NO_SHA512[m
[31m-/*[m
[31m- * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64[m
[31m- * being exactly 64-bit wide. See Implementation Notes in sha512.c[m
[31m- * for further details.[m
[31m- */[m
[31m-#define SHA512_CBLOCK	(SHA_LBLOCK*8)	/* SHA-512 treats input data as a[m
[31m-					 * contiguous array of 64 bit[m
[31m-					 * wide big-endian values. */[m
[31m-#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)[m
[31m-#define SHA_LONG64 unsigned __int64[m
[31m-#define U64(C)     C##UI64[m
[31m-#elif defined(__arch64__)[m
[31m-#define SHA_LONG64 unsigned long[m
[31m-#define U64(C)     C##UL[m
[31m-#else[m
[31m-#define SHA_LONG64 unsigned long long[m
[31m-#define U64(C)     C##ULL[m
[31m-#endif[m
[31m-[m
[31m-typedef struct SHA512state_st[m
[31m-	{[m
[31m-	SHA_LONG64 h[8];[m
[31m-	SHA_LONG64 Nl,Nh;[m
[31m-	union {[m
[31m-		SHA_LONG64	d[SHA_LBLOCK];[m
[31m-		unsigned char	p[SHA512_CBLOCK];[m
[31m-	} u;[m
[31m-	unsigned int num,md_len;[m
[31m-	} SHA512_CTX;[m
[31m-#endif[m
[31m-[m
[31m-#ifndef OPENSSL_NO_SHA512[m
[31m-int SHA384_Init(SHA512_CTX *c);[m
[31m-int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);[m
[31m-int SHA384_Final(unsigned char *md, SHA512_CTX *c);[m
[31m-unsigned char *SHA384(const unsigned char *d, size_t n,unsigned char *md);[m
[31m-int SHA512_Init(SHA512_CTX *c);[m
[31m-int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);[m
[31m-int SHA512_Final(unsigned char *md, SHA512_CTX *c);[m
[31m-unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md);[m
[31m-void SHA512_Transform(SHA512_CTX *c, const unsigned char *data);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef  __cplusplus[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk.c[m
[1mdeleted file mode 100644[m
[1mindex d57040a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk.c[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- */[m
[31m-[m
[31m-#include    <ndk.h>[m
[31m-[m
[31m-#include    <ndk_config.c>[m
[31m-[m
[31m-[m
[31m-#if (NDK_HTTP_PRE_CONFIG)[m
[31m-static  ngx_int_t   ndk_http_preconfiguration    (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_POST_CONFIG)[m
[31m-static  ngx_int_t   ndk_http_postconfiguration   (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_CREATE_MAIN_CONF)[m
[31m-static void *       ndk_http_create_main_conf    (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_MAIN_CONF)[m
[31m-static char *       ndk_http_init_main_conf      (ngx_conf_t *cf, void *conf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_CREATE_SRV_CONF)[m
[31m-static void *       ndk_http_create_srv_conf     (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_MERGE_SRV_CONF)[m
[31m-static char *       ndk_http_merge_srv_conf      (ngx_conf_t *cf, void *parent, void *child);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_CREATE_LOC_CONF)[m
[31m-static void *       ndk_http_create_loc_conf     (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_MERGE_LOC_CONF)[m
[31m-static char *       ndk_http_merge_loc_conf      (ngx_conf_t *cf, void *parent, void *child);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NDK_HTTP_INIT_MASTER)[m
[31m-static ngx_int_t    ndk_http_init_master         (ngx_log_t *log);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_MODULE)[m
[31m-static ngx_int_t    ndk_http_init_module         (ngx_cycle_t *cycle);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_PROCESS)[m
[31m-static ngx_int_t    ndk_http_init_process        (ngx_cycle_t *cycle);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_EXIT_PROCESS)[m
[31m-static void         ndk_http_exit_process        (ngx_cycle_t *cycle);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_EXIT_MASTER)[m
[31m-static void         ndk_http_exit_master         (ngx_cycle_t *cycle);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t   ndk_http_module_ctx = {[m
[31m-[m
[31m-#if (NDK_HTTP_PRE_CONFIG)[m
[31m-    ndk_http_preconfiguration,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_POST_CONFIG)[m
[31m-    ndk_http_postconfiguration,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_MAIN_CONF)[m
[31m-    ndk_http_create_main_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_MAIN_CONF)[m
[31m-    ndk_http_merge_main_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_SVR_CONF)[m
[31m-    ndk_http_create_srv_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_MERGE_SVR_CONF)[m
[31m-    ndk_http_merge_srv_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_LOC_CONF)[m
[31m-    ndk_http_create_loc_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_MERGE_LOC_CONF)[m
[31m-    ndk_http_merge_loc_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t          ndk_http_module = {[m
[31m-[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ndk_http_module_ctx,          /* module context */[m
[31m-    ndk_http_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-[m
[31m-#if (NDK_HTTP_INIT_MASTER)[m
[31m-    ndk_http_init_master,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_HTTP_INIT_MODULE)[m
[31m-    ndk_http_init_module,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_PROCESS)[m
[31m-    ndk_http_init_process,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-    NULL,                                   /* init thread */[m
[31m-    NULL,                                   /* exit thread */[m
[31m-[m
[31m-#if (NDK_HTTP_EXIT_PROCESS)[m
[31m-    ndk_http_exit_process,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_EXIT_MASTER)[m
[31m-    ndk_http_exit_master,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_MAIN_CONF)[m
[31m-static void *[m
[31m-ndk_http_create_main_conf (ngx_conf_t *cf)[m
[31m-{[m
[31m-    ndk_http_main_conf_t    *mcf;[m
[31m-[m
[31m-    ndk_pcallocp_rce (mcf, cf->pool);[m
[31m-[m
[31m-    return  mcf;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk.h[m
[1mdeleted file mode 100644[m
[1mindex febcc32..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk.h[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m- [m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef NDK_H[m
[31m-#define NDK_H[m
[31m-[m
[31m-[m
[31m-#include    <ngx_config.h>[m
[31m-#include    <ngx_core.h>[m
[31m-#include    <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define     ndk_version     2015[m
[31m-#define     NDK_VERSION     "0.2.15"[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-#ifndef     NDK_DEBUG[m
[31m-#define     NDK_DEBUG 1[m
[31m-#endif[m
[31m-#else[m
[31m-#ifndef     NDK_DEBUG[m
[31m-#define     NDK_DEBUG 0[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if !(NDK)[m
[31m-#error At least one module requires the Nginx Development Kit to be compiled with \[m
[31m-the source (add --with-module=/path/to/devel/kit/src to configure command)[m
[31m-#endif[m
[31m-[m
[31m-#include    <ndk_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_MAIN_CONF)[m
[31m-[m
[31m-#define     ndk_http_conf_get_main_conf(cf)   ngx_http_conf_get_module_main_conf (cf, ndk_http_module)[m
[31m-#define     ndk_http_get_main_conf(r)         ngx_http_get_module_main_conf (r, ndk_http_module)[m
[31m-[m
[31m-typedef struct {[m
[31m-#if (NDK_UPSTREAM_LIST)[m
[31m-    ngx_array_t         *upstreams;[m
[31m-#endif[m
[31m-} ndk_http_main_conf_t;[m
[31m-[m
[31m-#endif /* NDK_HTTP_CREATE_MAIN_CONF */[m
[31m-[m
[31m-#include    <ndk_includes.h>[m
[31m-[m
[31m-[m
[31m-extern  ngx_module_t    ndk_http_module;[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_buf.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_buf.c[m
[1mdeleted file mode 100644[m
[1mindex c491f72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_buf.c[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_copy_chain_to_str (ngx_pool_t *pool, ngx_chain_t *in, ngx_str_t *str)[m
[31m-{[m
[31m-    ngx_chain_t     *cl;[m
[31m-    size_t           len;[m
[31m-    u_char          *p;[m
[31m-    ngx_buf_t       *b;[m
[31m-    [m
[31m-    len = 0;[m
[31m-    for (cl = in; cl; cl = cl->next)[m
[31m-        len += ngx_buf_size (cl->buf);[m
[31m-    [m
[31m-    ndk_palloc_re (p, pool, len + 1);[m
[31m-    [m
[31m-    str->data = p;[m
[31m-    str->len = len;[m
[31m-    [m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        [m
[31m-        b = cl->buf;[m
[31m-        [m
[31m-        if (ngx_buf_in_memory (b)) {[m
[31m-            p = ngx_cpymem (p, b->pos, b->last - b->pos);[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-    *p = '\0';[m
[31m-    [m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_copy_chain_to_charp (ngx_pool_t *pool, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_str_t   str;[m
[31m-    [m
[31m-    if (ndk_copy_chain_to_str (pool, in, &str) != NGX_OK)[m
[31m-        return  NULL;[m
[31m-    [m
[31m-    return  (char *) str.data;[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_buf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_buf.h[m
[1mdeleted file mode 100644[m
[1mindex e6334ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_buf.h[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ndk_copy_chain_to_str   (ngx_pool_t *pool, ngx_chain_t *in, ngx_str_t *str);[m
[31m-char *      ndk_copy_chain_to_charp (ngx_pool_t *pool, ngx_chain_t *in);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_path.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_path.c[m
[1mdeleted file mode 100644[m
[1mindex a66a808..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_path.c[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-[m
[31m-[m
[31m-ndk_http_complex_path_value_t     ndk_empty_http_complex_path_value = {{0,NULL},0};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_http_complex_path_value_compile (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value, ngx_uint_t prefix)[m
[31m-{[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    ngx_memzero (&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = value;[m
[31m-    ccv.complex_value = cv;[m
[31m-[m
[31m-    switch (prefix) {[m
[31m-[m
[31m-    case    1 :[m
[31m-        ccv.root_prefix = 1;[m
[31m-        break;[m
[31m-[m
[31m-    case    2 :[m
[31m-        ccv.conf_prefix = 1;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ndk_path_to_dir_safe (value, 1, 0);[m
[31m-[m
[31m-    if (!value->len)[m
[31m-        return  NGX_OK;[m
[31m-[m
[31m-    return  ngx_http_compile_complex_value (&ccv);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_http_complex_path_create_compile (ngx_conf_t *cf, ngx_str_t *path, ngx_uint_t prefix)[m
[31m-{[m
[31m-    ndk_http_complex_path_elt_t     *cpe;[m
[31m-    ngx_array_t                     *a;[m
[31m-    ngx_int_t                        n;[m
[31m-    u_char                          *m, *s, *e;[m
[31m-    ngx_str_t                        value;[m
[31m-[m
[31m-    n = ndk_strcntc (path, ':') + 1;[m
[31m-[m
[31m-    a = ngx_array_create (cf->pool, n, sizeof (ndk_http_complex_path_elt_t));[m
[31m-    if (a == NULL) {[m
[31m-        return  NULL;[m
[31m-    }[m
[31m-[m
[31m-    s = path->data;[m
[31m-    e = s + path->len;[m
[31m-[m
[31m-[m
[31m-    while (s < e) {[m
[31m-[m
[31m-        m = s;[m
[31m-[m
[31m-        while (m < e && *m != ':') m++;[m
[31m-[m
[31m-        if (m == s) {[m
[31m-            s = m+1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cpe = ngx_array_push (a);[m
[31m-        if (cpe == NULL) {[m
[31m-            return  NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (*s == '#') {[m
[31m-            s++;[m
[31m-            cpe->dynamic = 1;[m
[31m-        } else {[m
[31m-            cpe->dynamic = 0;[m
[31m-        }[m
[31m-[m
[31m-        value.data = s;[m
[31m-        value.len = m - s;[m
[31m-[m
[31m-        if (ndk_http_complex_path_value_compile (cf, &cpe->val, &value, prefix) == NGX_ERROR)[m
[31m-            return  NULL;[m
[31m-[m
[31m-        s = m+1;[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_http_complex_path_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *path;[m
[31m-    ngx_array_t                 *a;[m
[31m-    ngx_conf_post_t             *post;[m
[31m-    ndk_http_complex_path_t     *cp;[m
[31m-[m
[31m-    cp = (ndk_http_complex_path_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (cp->a != NGX_CONF_UNSET_PTR) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    path = cf->args->elts;[m
[31m-    path++;[m
[31m-[m
[31m-    cp->a = ndk_http_complex_path_create_compile (cf, path, cp->prefix);[m
[31m-    if (cp->a == NULL)[m
[31m-        /* TODO : log */[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_path.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_path.h[m
[1mdeleted file mode 100644[m
[1mindex eb93d1f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_path.h[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                    *a;[m
[31m-    ngx_uint_t                      prefix;[m
[31m-} ndk_http_complex_path_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t        val;[m
[31m-    ngx_flag_t                      dynamic;[m
[31m-} ndk_http_complex_path_elt_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                       val;[m
[31m-    ngx_flag_t                      dynamic;[m
[31m-} ndk_http_complex_path_value_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ndk_http_complex_path_value_t  *elts;[m
[31m-    ngx_uint_t                      nelts;[m
[31m-} ndk_http_complex_path_values_t;[m
[31m-[m
[31m-[m
[31m-extern  ndk_http_complex_path_value_t     ndk_empty_http_complex_path_value;[m
[31m-[m
[31m-[m
[31m-ngx_array_t *   ndk_http_complex_path_create_compile     (ngx_conf_t *cf, ngx_str_t *path, ngx_uint_t prefix);[m
[31m-ngx_int_t       ndk_http_complex_path_value_compile      (ngx_conf_t *cf, ngx_http_complex_value_t *cv, [m
[31m-                                                                    ngx_str_t *value, ngx_uint_t prefix);[m
[31m-char *          ndk_conf_set_http_complex_path_slot      (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_value.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_value.c[m
[1mdeleted file mode 100644[m
[1mindex 97681ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_value.c[m
[1m+++ /dev/null[m
[36m@@ -1,192 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_http_complex_value_compile (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    ngx_memzero (&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = value;[m
[31m-    ccv.complex_value = cv;[m
[31m-[m
[31m-    return  ngx_http_compile_complex_value (&ccv);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_http_complex_value_array_create (ngx_conf_t *cf, char **s, ngx_int_t n)[m
[31m-{[m
[31m-    ngx_int_t                    i;[m
[31m-    ngx_http_complex_value_t    *cv;[m
[31m-    ngx_array_t                 *a;[m
[31m-    ngx_str_t                    value;[m
[31m-[m
[31m-    a = ngx_array_create (cf->pool, n, sizeof (ngx_http_complex_value_t));[m
[31m-    if (a == NULL)[m
[31m-        return  NULL;[m
[31m-[m
[31m-[m
[31m-    for (i=0; i<n; i++, s++) {[m
[31m-[m
[31m-        cv = ngx_array_push (a);[m
[31m-[m
[31m-        value.data = (u_char *) *s;[m
[31m-        value.len = strlen (*s);[m
[31m-[m
[31m-        if (ndk_http_complex_value_compile (cf, cv, &value))[m
[31m-            return  NULL;[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_http_complex_value_array_compile (ngx_conf_t *cf, ngx_array_t *a)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_complex_value_t   *cv;[m
[31m-[m
[31m-    if (a == NULL || a == NGX_CONF_UNSET_PTR) {[m
[31m-        return  NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cv = a->elts;[m
[31m-[m
[31m-    for (i=0; i<a->nelts; i++, cv++) {[m
[31m-[m
[31m-        if (ndk_http_complex_value_compile (cf, cv, &cv->value))[m
[31m-            return  NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_http_complex_value_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_http_complex_value_t    *cv;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_conf_post_t             *post;[m
[31m-[m
[31m-    cv = (ngx_http_complex_value_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (cv->value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ndk_http_complex_value_compile (cf, cv, value + 1))[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, cv);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_http_complex_value_array_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_complex_value_t    *cv;[m
[31m-    ngx_array_t                **a;[m
[31m-    ngx_conf_post_t             *post;[m
[31m-    ngx_uint_t                   i, alloc;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL || *a == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        alloc = cf->args->nelts > 4 ? cf->args->nelts : 4;[m
[31m-[m
[31m-        *a = ngx_array_create (cf->pool, alloc, sizeof (ngx_http_complex_value_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i=1; i<cf->args->nelts; i++) {[m
[31m-[m
[31m-        cv = ngx_array_push (*a);[m
[31m-        if (cv == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ndk_http_complex_value_compile (cf, cv, &value[i]) == NGX_ERROR)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_http_complex_keyval_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *value;[m
[31m-    ndk_http_complex_keyval_t   *ckv;[m
[31m-    ngx_array_t                **a;[m
[31m-    ngx_conf_post_t             *post;[m
[31m-    ngx_int_t                    alloc;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL || *a == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        alloc = cf->args->nelts > 4 ? cf->args->nelts : 4;[m
[31m-[m
[31m-        *a = ngx_array_create (cf->pool, alloc, sizeof (ndk_http_complex_keyval_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ckv = ngx_array_push (*a);[m
[31m-    if (ckv == NULL) {[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ckv->key = value[1];[m
[31m-[m
[31m-    if (ndk_http_complex_value_compile (cf, &ckv->value, &value[2]) == NGX_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-/* TODO : complex keyval1 */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_value.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_value.h[m
[1mdeleted file mode 100644[m
[1mindex 4178d62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_complex_value.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   key;[m
[31m-    ngx_http_complex_value_t    value;[m
[31m-} ndk_http_complex_keyval_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* create/compile functions */[m
[31m-[m
[31m-ngx_int_t      ndk_http_complex_value_compile        (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value);[m
[31m-ngx_array_t *  ndk_http_complex_value_array_create   (ngx_conf_t *cf, char **s, ngx_int_t n);[m
[31m-ngx_int_t      ndk_http_complex_value_array_compile  (ngx_conf_t *cf, ngx_array_t *a);[m
[31m-[m
[31m-[m
[31m-/* conf set slot functions */[m
[31m-[m
[31m-char *  ndk_conf_set_http_complex_keyval_slot        (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_http_complex_value_slot         (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_http_complex_value_array_slot   (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_conf_file.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_conf_file.c[m
[1mdeleted file mode 100644[m
[1mindex 980641c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_conf_file.c[m
[1m+++ /dev/null[m
[36m@@ -1,396 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* NOTE : you will find other conf_set functions in the following files :[m
[31m- *[m
[31m- * complex_value.c[m
[31m- * encoding.c[m
[31m- * path.c[m
[31m- *[m
[31m- */[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_true_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_flag_t       *fp;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    fp = (ngx_flag_t*) (p + cmd->offset);[m
[31m-[m
[31m-    if (*fp != NGX_CONF_UNSET) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *fp = 1;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, fp);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_false_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_flag_t       *fp;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    fp = (ngx_flag_t*) (p + cmd->offset);[m
[31m-[m
[31m-    if (*fp != NGX_CONF_UNSET) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *fp = 0;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, fp);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_ptr_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    void  **ptr;[m
[31m-[m
[31m-    ptr = (void**) (p + cmd->offset);[m
[31m-[m
[31m-    if (*ptr != NGX_CONF_UNSET_PTR) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *ptr = cmd->post;[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_null_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    void            **pp;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    pp = (void **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*pp != NGX_CONF_UNSET_PTR) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *pp = NULL;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, pp);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_num64_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    int64_t          *np;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    np = (int64_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*np != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    *np = ndk_atoi64 (value[1].data, value[1].len);[m
[31m-    if (*np == NGX_ERROR) {[m
[31m-        return "invalid number";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, np);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_str_array_multi_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t         *value, *s;[m
[31m-    ngx_array_t      **a;[m
[31m-    ngx_conf_post_t   *post;[m
[31m-    ngx_uint_t         i;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NGX_CONF_UNSET_PTR) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = NULL;[m
[31m-[m
[31m-    for (i=cf->args->nelts-1; i; i--) {[m
[31m-[m
[31m-        s = ngx_array_push(*a);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = cf->args->elts;[m
[31m-[m
[31m-        *s = value[i];[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler(cf, post, s);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_keyval1_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_keyval_t        *kv;[m
[31m-    ngx_conf_post_t     *post;[m
[31m-[m
[31m-    kv = (ngx_keyval_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (kv->key.data)[m
[31m-        return  "is duplicate";[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    kv->key = value[1];[m
[31m-    kv->value = value[2];[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, kv);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_num_flag_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t        *np;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    np = (ngx_int_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*np != NGX_CONF_UNSET) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcasecmp (value[1].data, (u_char *) "on") == 0) {[m
[31m-        *np = NDK_CONF_SET_TRUE;[m
[31m-[m
[31m-    } else if (ngx_strcasecmp (value[1].data, (u_char *) "off") == 0) {[m
[31m-        *np = NDK_CONF_SET_FALSE;[m
[31m-[m
[31m-    } else {[m
[31m-        *np = ngx_atoi (value[1].data, value[1].len);[m
[31m-        if (*np == NGX_ERROR) {[m
[31m-            return  "invalid number and not 'on'/'off'";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, np);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_sec_flag_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    time_t              *tp;[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_conf_post_t     *post;[m
[31m-[m
[31m-    tp = (time_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*tp != NGX_CONF_UNSET) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcasecmp (value[1].data, (u_char *) "on") == 0) {[m
[31m-        *tp = NDK_CONF_SET_TRUE;[m
[31m-[m
[31m-    } else if (ngx_strcasecmp (value[1].data, (u_char *) "off") == 0) {[m
[31m-        *tp = NDK_CONF_SET_FALSE;[m
[31m-[m
[31m-    } else {[m
[31m-        *tp = ngx_parse_time (&value[1], 1);[m
[31m-        if (*tp == NGX_ERROR) {[m
[31m-            return  "has an invalid time and not 'on'/'off'";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, tp);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_http_conf_ctx_t *[m
[31m-ndk_conf_create_http_location (ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_conf_ctx_t          *ctx, *pctx;[m
[31m-    void                         *mconf;[m
[31m-    ngx_http_core_loc_conf_t     *clcf, *pclcf;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_http_module_t            *module;[m
[31m-[m
[31m-    ndk_pcallocp_rce (ctx, cf->pool);[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ndk_pcalloc_rce (ctx->loc_conf, cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-[m
[31m-    for (i = 0; ngx_modules[i]; i++) {[m
[31m-        if (ngx_modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = ngx_modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                 return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[ngx_modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-    clcf->name = pclcf->name;[m
[31m-    clcf->noname = 1;[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return  ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_conf_ctx_t *[m
[31m-ngx_conf_create_http_named_location (ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_conf_ctx_t          *ctx;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-[m
[31m-    ctx = ndk_conf_create_http_location (cf);[m
[31m-    if (ctx == NGX_CONF_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    /* in case the developer forgets to add '@' at the beginning of the named location */[m
[31m-[m
[31m-    if (name->data[0] != '@' && ndk_catstrf (cf->pool, name, "sS", "@", name) == NULL)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    clcf->name = *name;     /* TODO : copy? */[m
[31m-    clcf->noname = 0;[m
[31m-    clcf->named = 1;[m
[31m-[m
[31m-    return  ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_replace_command (ngx_command_t *new_cmd, ngx_uint_t module_type)[m
[31m-{[m
[31m-    ngx_uint_t       i;[m
[31m-    ngx_command_t   *cmd;[m
[31m-[m
[31m-    for (i = 0; ngx_modules[i]; i++) {[m
[31m-[m
[31m-        if (ngx_modules[i]->type != module_type)[m
[31m-            continue;[m
[31m-[m
[31m-        cmd = ngx_modules[i]->commands;[m
[31m-        if (cmd == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; cmd->name.len; cmd++) {[m
[31m-[m
[31m-            if (ndk_cmpstr (&new_cmd->name, &cmd->name) == 0) {[m
[31m-[m
[31m-                ndk_memcpyp (cmd, new_cmd);[m
[31m-                return  NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_DECLINED;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_conf_file.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_conf_file.h[m
[1mdeleted file mode 100644[m
[1mindex 6956b17..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_conf_file.h[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* conf set functions */[m
[31m-[m
[31m-char *  ndk_conf_set_true_slot              (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_false_slot             (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_full_path_slot         (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_ptr_slot               (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_null_slot              (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_str_array_multi_slot   (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_keyval1_slot           (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_num_flag               (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_num64_slot             (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_sec_flag_slot          (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-ngx_http_conf_ctx_t *   ndk_conf_create_http_location           (ngx_conf_t *cf);[m
[31m-ngx_http_conf_ctx_t *   ngx_conf_create_http_named_location     (ngx_conf_t *cf, ngx_str_t *name);[m
[31m-[m
[31m-ngx_int_t               ndk_replace_command     (ngx_command_t *new_cmd, ngx_uint_t module_type);[m
[31m-[m
[31m-[m
[31m-/* values for conf_set_xxx_flag */[m
[31m-[m
[31m-#define     NDK_CONF_SET_TRUE       -2[m
[31m-#define     NDK_CONF_SET_FALSE      -3[m
[31m-[m
[31m-[m
[31m-/* wrappers for utility macros */[m
[31m-[m
[31m-#define     ndk_conf_set_bitmask_slot       ngx_conf_set_bitmask_slot[m
[31m-#define     ndk_conf_set_bufs_slot          ngx_conf_set_bufs_slot[m
[31m-#define     ndk_conf_set_enum_slot          ngx_conf_set_enum_slot[m
[31m-#define     ndk_conf_set_flag_slot          ngx_conf_set_flag_slot[m
[31m-#define     ndk_conf_set_keyval_slot        ngx_conf_set_keyval_slot[m
[31m-#define     ndk_conf_set_msec_slot          ngx_conf_set_msec_slot[m
[31m-#define     ndk_conf_set_num_slot           ngx_conf_set_num_slot[m
[31m-#define     ndk_conf_set_off_slot           ngx_conf_set_off_slot[m
[31m-#define     ndk_conf_set_sec_slot           ngx_conf_set_sec_slot[m
[31m-#define     ndk_conf_set_size_slot          ngx_conf_set_size_slot[m
[31m-#define     ndk_conf_set_str_slot           ngx_conf_set_str_slot[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_debug.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_debug.c[m
[1mdeleted file mode 100644[m
[1mindex e0251cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_debug.c[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-void[m
[31m-ndk_debug_helper (const char *func, const char *fmt, ...)[m
[31m-{[m
[31m-    size_t   len, flen, tlen;[m
[31m-    char    *s, *p, *e;[m
[31m-[m
[31m-    /* check to see if the format is empty */[m
[31m-[m
[31m-    flen = strlen (fmt);[m
[31m-[m
[31m-    /* build func name */[m
[31m-[m
[31m-    len = strlen (func);[m
[31m-[m
[31m-    if (flen == 0)[m
[31m-        tlen = len + 1;[m
[31m-    else[m
[31m-[m
[31m-    char    func_name [len + flen + 1];[m
[31m-[m
[31m-    s = func_name;[m
[31m-    e = s + len;[m
[31m-[m
[31m-    memcpy (s, func, len);[m
[31m-[m
[31m-    /* remove initial ngx_ */[m
[31m-[m
[31m-    if (strncmp (s, "ngx_", 4) == 0)[m
[31m-        s += 4;[m
[31m-[m
[31m-    /* replace '_' with ' ' */[m
[31m-[m
[31m-    for (p=s; p<e; p++) {[m
[31m-        if (*p == '_')[m
[31m-            *p = ' ';[m
[31m-    }[m
[31m-[m
[31m-    vfprintf (stderr, const char *format, va_list ap)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ndk_debug_request_helper (const char *func, ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    /* TODO : improve the format */[m
[31m-[m
[31m-    fprintf (stderr, "%s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            0/*(int) r->main->count*/, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf (stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf (stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_debug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_debug.h[m
[1mdeleted file mode 100644[m
[1mindex 883a6eb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_debug.h[m
[1m+++ /dev/null[m
[36m@@ -1,171 +0,0 @@[m
[31m-#ifndef NDK_DEBUG_H[m
[31m-#define NDK_DEBUG_H[m
[31m-[m
[31m-[m
[31m-/* TODO : use the Nginx printf function */[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-/* TODO[m
[31m-- andk_debug variety of debugging formats[m
[31m-- global include file for all debugging - can pass declaration to cflags for the option[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#if (NDK_DEBUG)[m
[31m-[m
[31m-    #if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-        #define ndk_debug(...)  ndk_debug_helper (__func__,__VA_ARGS__)[m
[31m-[m
[31m-        #define ndk_debug_helper(func,...) \[m
[31m-            fprintf(stderr, "%-60s", func); \[m
[31m-            fprintf(stderr, (const char *)__VA_ARGS__); \[m
[31m-            fprintf(stderr,"\n");[m
[31m-            /*fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)*/[m
[31m-[m
[31m-    #else[m
[31m-[m
[31m-        /* NOTE : these includes might not be necessary since they're probably included with the core */[m
[31m-[m
[31m-        #include <stdarg.h>[m
[31m-        #include <stdio.h>[m
[31m-        #include <stdarg.h>[m
[31m-[m
[31m-        static void ndk_debug (const char * fmt, ...) {[m
[31m-        }[m
[31m-[m
[31m-    #endif[m
[31m-[m
[31m-    #if NDK_DEBUG > 1[m
[31m-[m
[31m-        #define ndk_debug_request()  ndk_debug_request_helper(r, __func__)[m
[31m-[m
[31m-        static ngx_inline void[m
[31m-        ndk_debug_request_helper (ngx_http_request_t *r, const char *func)[m
[31m-        {[m
[31m-            ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-            /* TODO : improve the format */[m
[31m-[m
[31m-            fprintf (stderr, "%s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-                    func,[m
[31m-                    (int) r->method_name.len, r->method_name.data,[m
[31m-                    (int) r->uri.len, r->uri.data,[m
[31m-                    (int) r->args.len, r->args.data,[m
[31m-                    0/*(int) r->main->count*/, r->main,[m
[31m-                    r, r->connection->data, r->parent);[m
[31m-[m
[31m-            if (r->posted_requests) {[m
[31m-                fprintf(stderr, " posted:");[m
[31m-[m
[31m-                for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-                    fprintf (stderr, "%p,", pr);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            fprintf (stderr, "\n");[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-    #else[m
[31m-[m
[31m-        #define ndk_debug_request()[m
[31m-[m
[31m-    #endif[m
[31m-[m
[31m-[m
[31m-    static ngx_inline void[m
[31m-    ndk_debug_print_posted_requests (ngx_http_request_t *r)[m
[31m-    {[m
[31m-        ngx_http_posted_request_t   *pr;[m
[31m-[m
[31m-        ndk_request_log_debug_http (r, "ndk debug - http posted requests");[m
[31m-[m
[31m-        for (pr = r->main->posted_requests; pr; pr = pr->next) {[m
[31m-[m
[31m-            if (!pr->request)[m
[31m-                continue;[m
[31m-[m
[31m-            ndk_request_log_debug_http (r, "ndk debug - http posted request:%V", &pr->request->uri);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    #define ndk_debug_http_conf_location(cf)    ndk_debug_http_conf_location_helper (cf, __func__)[m
[31m-[m
[31m-    static ngx_inline void[m
[31m-    ndk_debug_http_conf_location_helper (ngx_conf_t *cf, const char *func)[m
[31m-    {[m
[31m-        ngx_http_core_loc_conf_t        *lcf;[m
[31m-[m
[31m-        lcf = ngx_http_conf_get_module_loc_conf (cf, ngx_http_core_module);[m
[31m-[m
[31m-        ndk_debug_helper (func, "[%s]", lcf->name.data);[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-    static void[m
[31m-    ndk_debug_log_chain (ngx_log_t *log, ngx_chain_t *cl)[m
[31m-    {[m
[31m-[m
[31m-[m
[31m-    }[m
[31m-    */[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    #if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-        #define     ndk_debug(...)[m
[31m-        #define     ndk_debug_request()[m
[31m-[m
[31m-    #else[m
[31m-[m
[31m-        #include <stdarg.h>[m
[31m-[m
[31m-        static void ndk_debug (const char * fmt, ...) {[m
[31m-        }[m
[31m-[m
[31m-        static void ndk_debug_request() {[m
[31m-        }[m
[31m-[m
[31m-    #endif[m
[31m-[m
[31m-    #define     ndk_debug_http_conf_location(cf)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_DEBUG)[m
[31m-[m
[31m-    #define     ndk_debug_check_read_event_handler(r)                               \[m
[31m-                                                                                    \[m
[31m-                    ndk_debug("r->read_event_handler = %s",                         \[m
[31m-                        r->read_event_handler == ngx_http_block_reading ?           \[m
[31m-                            "ngx_http_block_reading" :                              \[m
[31m-                        r->read_event_handler == ngx_http_test_reading ?            \[m
[31m-                            "ngx_http_test_reading" :                               \[m
[31m-                        r->read_event_handler == ngx_http_request_empty_handler ?   \[m
[31m-                            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-    #define     ndk_debug_check_write_event_handler(r)                              \[m
[31m-                                                                                    \[m
[31m-                    ndk_debug ("r->write_event_handler = %s",                       \[m
[31m-                        r->write_event_handler == ngx_http_handler ?                \[m
[31m-                            "ngx_http_handler" :                                    \[m
[31m-                        r->write_event_handler == ngx_http_core_run_phases ?        \[m
[31m-                            "ngx_http_core_run_phases" :                            \[m
[31m-                        r->write_event_handler == ngx_http_request_empty_handler ?  \[m
[31m-                            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    #define     ndk_debug_check_read_event_handler(r)[m
[31m-    #define     ndk_debug_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NDK_DEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_encoding.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_encoding.c[m
[1mdeleted file mode 100644[m
[1mindex 4a07872..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_encoding.c[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_encoding_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char    *p = conf;[m
[31m-[m
[31m-    ndk_encoding_t  *ep;[m
[31m-    ngx_str_t       *value;[m
[31m-    size_t           len;[m
[31m-    iconv_t          ic;[m
[31m-[m
[31m-    ep = (ndk_encoding_t *) (p + cmd->offset);[m
[31m-    if (ep->from && ep->to)[m
[31m-        return  "is duplicate";[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-[m
[31m-    if (ep->from) {[m
[31m-[m
[31m-        ep->to = (char *) value[1].data;[m
[31m-        len = strlen (ep->from);[m
[31m-[m
[31m-    } else if (ep->to) {[m
[31m-[m
[31m-        ep->from = (char *) value[1].data;[m
[31m-        len = strlen (ep->to);[m
[31m-[m
[31m-    } else {[m
[31m-        return  "has no base encoding";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (len == value[1].len && !strncasecmp (ep->to, ep->from, len)) {[m
[31m-[m
[31m-        ngx_log_error (NGX_LOG_WARN, cf->log, 0, [m
[31m-            "\"%V\" '%V' encoding is ignored (no conversion)", &value[0], &value[1]);[m
[31m-[m
[31m-        return  NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ic = iconv_open (ep->to, ep->from);[m
[31m-    if (ic == (iconv_t)-1)[m
[31m-        return  "has an invalid encoding";[m
[31m-[m
[31m-[m
[31m-    if (iconv_close (ic)) {[m
[31m-        ngx_log_error (NGX_LOG_EMERG, cf->log, errno, "iconv_close()");[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_encoding.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_encoding.h[m
[1mdeleted file mode 100644[m
[1mindex b295b18..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_encoding.h[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#include    <iconv.h>[m
[31m-[m
[31m-typedef struct {[m
[31m-    char        *from;[m
[31m-    char        *to;[m
[31m-} ndk_encoding_t;[m
[31m-[m
[31m-[m
[31m-char *  ndk_conf_set_encoding_slot  (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_hash.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_hash.c[m
[1mdeleted file mode 100644[m
[1mindex dec3d41..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_hash.c[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-#include <ndk_hash.h>[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* openssl hashes */[m
[31m-[m
[31m-#define     NDK_OPENSSL_HASH(type,ctxt_type,upper)                  \[m
[31m-    u_char              md [ctxt_type ## _DIGEST_LENGTH];           \[m
[31m-    ctxt_type ##_CTX    c;                                          \[m
[31m-                                                                    \[m
[31m-    type ## _Init (&c);                                             \[m
[31m-    type ## _Update (&c, data, len);                                \[m
[31m-    type ## _Final (md, &c);                                        \[m
[31m-                                                                    \[m
[31m-    ndk_hex_dump (p, (u_char *) md, ctxt_type ## _DIGEST_LENGTH);   \[m
[31m-    if (upper) {                                                    \[m
[31m-        ndk_strtoupper (p, (ctxt_type ## _DIGEST_LENGTH) *2);       \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#ifdef NDK_MD5[m
[31m-[m
[31m-void[m
[31m-ndk_md5_hash (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    NDK_OPENSSL_HASH (MD5, MD5, 0);[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ndk_md5_hash_upper (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    NDK_OPENSSL_HASH (MD5, MD5, 1);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-#ifdef NDK_SHA1[m
[31m-[m
[31m-void[m
[31m-ndk_sha1_hash (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    NDK_OPENSSL_HASH (SHA1, SHA, 0);[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ndk_sha1_hash_upper (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    NDK_OPENSSL_HASH (SHA1, SHA, 1);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* non-openssl hashes */[m
[31m-[m
[31m-#ifdef NDK_MURMUR2[m
[31m-[m
[31m-#include    "hash/murmurhash2.c"[m
[31m-[m
[31m-void[m
[31m-ndk_murmur2_hash (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    uint32_t    hash;[m
[31m-[m
[31m-    hash = MurmurHash2 (data, len, 47);[m
[31m-[m
[31m-    ndk_hex_dump (p, (u_char*) &hash, 4);[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ndk_murmur2_hash_upper (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    uint32_t    hash;[m
[31m-[m
[31m-    hash = MurmurHash2 (data, len, 47);[m
[31m-[m
[31m-    ndk_hex_dump (p, (u_char*) &hash, 4);[m
[31m-    ndk_strtoupper (p, 8);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_hash.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_hash.h[m
[1mdeleted file mode 100644[m
[1mindex a15e923..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_hash.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-#ifndef NDK_HASH_H[m
[31m-#define NDK_HASH_H[m
[31m-[m
[31m-#ifdef NDK_HASH_ALL[m
[31m-[m
[31m-#ifndef NDK_MD5[m
[31m-#define NDK_MD5[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NDK_MURMUR2[m
[31m-#define NDK_MURMUR2[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NDK_SHA1[m
[31m-#define NDK_SHA1[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-typedef void (*ndk_hash_pt) (u_char *p, char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-#ifdef NDK_MD5[m
[31m-#include <ngx_md5.h>[m
[31m-void    ndk_md5_hash            (u_char *p, char *data, size_t len);[m
[31m-void    ndk_md5_hash_upper      (u_char *p, char *data, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef NDK_MURMUR2[m
[31m-#define MURMURHASH2_DIGEST_LENGTH   4[m
[31m-void    ndk_murmur2_hash        (u_char *p, char *data, size_t len);[m
[31m-void    ndk_murmur2_hash_upper  (u_char *p, char *data, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef NDK_SHA1[m
[31m-#include <ngx_sha1.h>[m
[31m-void    ndk_sha1_hash           (u_char *p, char *data, size_t len);[m
[31m-void    ndk_sha1_hash_upper     (u_char *p, char *data, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NDK_HASH_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http.c[m
[1mdeleted file mode 100644[m
[1mindex 60728bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http.c[m
[1m+++ /dev/null[m
[36m@@ -1,138 +0,0 @@[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ndk_http_count_phase_handlers (ngx_http_core_main_conf_t *cmcf)[m
[31m-{[m
[31m-    ngx_http_phase_handler_t    *ph;[m
[31m-    ngx_uint_t                   i;[m
[31m-    [m
[31m-    ph = cmcf->phase_engine.handlers;[m
[31m-    [m
[31m-    for (i=0; ph[i].checker; i++) /* void */;[m
[31m-        [m
[31m-    return  i;        [m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ndk_http_parse_request_method (ngx_str_t *m)[m
[31m-{[m
[31m-    switch (m->len) {[m
[31m-[m
[31m-        case 3:[m
[31m-            [m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-        {[m
[31m-            u_char    t[4];[m
[31m-            [m
[31m-            ngx_memcpy (t, m->data, 3);[m
[31m-            t[3] = ' ';[m
[31m-            [m
[31m-            if (ndk_str3_cmp (t, 'G', 'E', 'T', ' ')) {[m
[31m-                return  NGX_HTTP_GET;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str3_cmp (t, 'P', 'U', 'T', ' ')) {[m
[31m-                return  NGX_HTTP_PUT;[m
[31m-            }[m
[31m-        }[m
[31m-            [m
[31m-#else[m
[31m-[m
[31m-            if (ndk_str3_cmp (m->data, 'G', 'E', 'T', ' ')) {[m
[31m-                return  NGX_HTTP_GET;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str3_cmp (m->data, 'P', 'U', 'T', ' ')) {[m
[31m-                return  NGX_HTTP_PUT;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-            break;[m
[31m-[m
[31m-        case 4:[m
[31m-            [m
[31m-            if  (m->data[1] == 'O') {[m
[31m-[m
[31m-                if (ndk_str3Ocmp (m->data, 'P', 'O', 'S', 'T')) {[m
[31m-                    return  NGX_HTTP_POST;[m
[31m-                }[m
[31m-[m
[31m-                if (ndk_str3Ocmp (m->data, 'C', 'O', 'P', 'Y')) {[m
[31m-                    return  NGX_HTTP_COPY;[m
[31m-                }[m
[31m-[m
[31m-                if (ndk_str3Ocmp (m->data, 'M', 'O', 'V', 'E')) {[m
[31m-                    return  NGX_HTTP_MOVE;[m
[31m-                }[m
[31m-[m
[31m-                if (ndk_str3Ocmp (m->data, 'L', 'O', 'C', 'K')) {[m
[31m-                    return  NGX_HTTP_LOCK;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                if (ndk_str4cmp (m->data, 'H', 'E', 'A', 'D')) {[m
[31m-                    return  NGX_HTTP_HEAD;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 5:[m
[31m-            [m
[31m-            if (ndk_str5cmp (m->data, 'M', 'K', 'C', 'O', 'L')) {[m
[31m-                return  NGX_HTTP_MKCOL;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str5cmp (m->data, 'P', 'A', 'T', 'C', 'H')) {[m
[31m-                return  NGX_HTTP_PATCH;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str5cmp (m->data, 'T', 'R', 'A', 'C', 'E')) {[m
[31m-                return  NGX_HTTP_TRACE;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 6:[m
[31m-            [m
[31m-            if (ndk_str6cmp (m->data, 'D', 'E', 'L', 'E', 'T', 'E')) {[m
[31m-                return  NGX_HTTP_DELETE;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str6cmp (m->data, 'U', 'N', 'L', 'O', 'C', 'K')) {[m
[31m-                return  NGX_HTTP_UNLOCK;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 7:[m
[31m-            [m
[31m-            if (ndk_str7_cmp (m->data, 'O', 'P', 'T', 'I', 'O', 'N', 'S', ' '))[m
[31m-            {[m
[31m-                return  NGX_HTTP_OPTIONS;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 8:[m
[31m-            [m
[31m-            if (ndk_str8cmp (m->data, 'P', 'R', 'O', 'P', 'F', 'I', 'N', 'D'))[m
[31m-            {[m
[31m-                return  NGX_HTTP_PROPFIND;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 9:[m
[31m-            [m
[31m-            if (ndk_str9cmp (m->data, 'P', 'R', 'O', 'P', 'P', 'A', 'T', 'C', 'H'))[m
[31m-            {[m
[31m-                return  NGX_HTTP_PROPPATCH;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-    }[m
[31m-[m
[31m-    return  0;[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http.h[m
[1mdeleted file mode 100644[m
[1mindex 6a9d1c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http.h[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-[m
[31m-ngx_uint_t  ndk_http_count_phase_handlers       (ngx_http_core_main_conf_t *cmcf);[m
[31m-ngx_uint_t  ndk_http_parse_request_method       (ngx_str_t *m);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http_headers.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http_headers.h[m
[1mdeleted file mode 100644[m
[1mindex e71c70e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_http_headers.h[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : organize and add */[m
[31m-/* TODO : check - should it be r->main? */[m
[31m-[m
[31m-#define     ndk_http_uri(r)                         (r)->uri[m
[31m-#define     ndk_http_request_uri(r)                 (r)->unparsed_uri[m
[31m-[m
[31m-#define     ndk_http_header_in(r,name)              ((r)->headers_in.name ? &(r)->headers_in.name->value : NULL)[m
[31m-#define     ndk_http_header_out(r,name)             ((r)->headers_out.name ? &(r)->headers_out.name->value : NULL)[m
[31m-[m
[31m-#define     ndk_http_host_header(r)                 ndk_http_header_in (r, host)[m
[31m-#define     ndk_http_connection_header(r)           ndk_http_header_in (r, connection)[m
[31m-#define     ndk_http_if_modified_since_header(r)    ndk_http_header_in (r, if_modified_since)[m
[31m-#define     ndk_http_user_agent_header(r)           ndk_http_header_in (r, user_agent)[m
[31m-#define     ndk_http_referer_header(r)              ndk_http_header_in (r, referer)[m
[31m-#define     ndk_http_content_length_header(r)       ndk_http_header_in (r, content_length)[m
[31m-#define     ndk_http_content_type_header(r)         ndk_http_header_in (r, content_type)[m
[31m-#define     ndk_http_range_header(r)                ndk_http_header_in (r, range)[m
[31m-#define     ndk_http_if_range_header(r)             ndk_http_header_in (r, if_range)[m
[31m-#define     ndk_http_transfer_encoding_header(r)    ndk_http_header_in (r, transfer_encoding)[m
[31m-#define     ndk_http_expect_header(r)               ndk_http_header_in (r, expect)[m
[31m-#define     ndk_http_accept_encoding_header(r)      ndk_http_header_in (r, accept_encoding)[m
[31m-#define     ndk_http_via_header(r)                  ndk_http_header_in (r, via)[m
[31m-#define     ndk_http_authorization_header(r)        ndk_http_header_in (r, authorization)[m
[31m-#define     ndk_http_keep_alive_header(r)           ndk_http_header_in (r, keep_alive)[m
[31m-#define     ndk_http_x_forwarded_for_header(r)      ndk_http_header_in (r, x_forwarded_for)[m
[31m-#define     ndk_http_x_real_ip_header(r)            ndk_http_header_in (r, x_real_ip)[m
[31m-#define     ndk_http_accept_header(r)               ndk_http_header_in (r, accept)[m
[31m-#define     ndk_http_accept_language_header(r)      ndk_http_header_in (r, accept_language)[m
[31m-#define     ndk_http_depth_header(r)                ndk_http_header_in (r, depth)[m
[31m-#define     ndk_http_destination_header(r)          ndk_http_header_in (r, destination)[m
[31m-#define     ndk_http_overwrite_header(r)            ndk_http_header_in (r, overwrite)[m
[31m-#define     ndk_http_date_header(r)                 ndk_http_header_in (r, date)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_log.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_log.c[m
[1mdeleted file mode 100644[m
[1mindex 36dca15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_log.c[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : the required functions if the compiler does not have variadic macros */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_log.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_log.h[m
[1mdeleted file mode 100644[m
[1mindex 1dd9c22..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_log.h[m
[1m+++ /dev/null[m
[36m@@ -1,165 +0,0 @@[m
[31m-[m
[31m-/* TODO : fix the conf_log macros */[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_SCRIPT        NGX_LOG_DEBUG_HTTP      /* TODO : add new section to log/conf directives */[m
[31m-[m
[31m-#define ndk_conf_to_log(cf)         ((cf)->log)[m
[31m-[m
[31m-#ifndef ndk_request_to_log[m
[31m-#define ndk_request_to_log(r)       ((r)->connection->log)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_HAVE_C99_VARIADIC_MACROS)[m
[31m-[m
[31m-#define ndk_log_stderr(log,...)                     ngx_log_error (NGX_LOG_STDERR, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_emerg(log,...)                      ngx_log_error (NGX_LOG_EMERG, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_alert(log,...)                      ngx_log_error (NGX_LOG_ALERT, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_crit(log,...)                       ngx_log_error (NGX_LOG_CRIT, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_err(log,...)                        ngx_log_error (NGX_LOG_ERR, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_warning(log,...)                    ngx_log_error (NGX_LOG_WARN, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_notice(log,...)                     ngx_log_error (NGX_LOG_NOTICE, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_info(log,...)                       ngx_log_error (NGX_LOG_INFO, log, 0, __VA_ARGS__)[m
[31m-[m
[31m-#define ndk_conf_log_stderr(cf,...)                 ngx_conf_log_error (NGX_LOG_STDERR, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_emerg(cf,...)                  ngx_conf_log_error (NGX_LOG_EMERG, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_alert(cf,...)                  ngx_conf_log_error (NGX_LOG_ALERT, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_crit(cf,...)                   ngx_conf_log_error (NGX_LOG_CRIT, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_err(cf,...)                    ngx_conf_log_error (NGX_LOG_ERR, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_warning(cf,...)                ngx_conf_log_error (NGX_LOG_WARN, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_notice(cf,...)                 ngx_conf_log_error (NGX_LOG_NOTICE, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_info(cf,...)                   ngx_conf_log_error (NGX_LOG_INFO, cf, 0, __VA_ARGS__)[m
[31m-[m
[31m-#define ndk_request_log_stderr(r,...)               ndk_log_stderr (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_emerg(r,...)                ndk_log_emerg (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_alert(r,...)                ndk_log_alert (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_crit(r,...)                 ndk_log_crit (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_err(r,...)                  ndk_log_err (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_warning(r,...)              ndk_log_warning (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_notice(r,...)               ndk_log_notice (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_info(r,...)                 ndk_log_info (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-#define ndk_log_debug_core(log,...)                 ngx_log_debug (NGX_LOG_DEBUG_CORE, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_alloc(log,...)                ngx_log_debug (NGX_LOG_DEBUG_ALLOC, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_mutex(log,...)                ngx_log_debug (NGX_LOG_DEBUG_MUTEX, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_event(log,...)                ngx_log_debug (NGX_LOG_DEBUG_EVENT, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_http(log,...)                 ngx_log_debug (NGX_LOG_DEBUG_HTTP, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_mail(log,...)                 ngx_log_debug (NGX_LOG_DEBUG_MAIL, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_mysql(log,...)                ngx_log_debug (NGX_LOG_DEBUG_MYSQL, log, 0, __VA_ARGS__)[m
[31m-[m
[31m-#define ndk_conf_log_debug_core(r,...)              ndk_log_debug_core (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_alloc(r,...)             ndk_log_debug_alloc (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_mutex(r,...)             ndk_log_debug_mutex (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_event(r,...)             ndk_log_debug_event (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_http(r,...)              ndk_log_debug_http (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_mail(r,...)              ndk_log_debug_mail (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_mysql(r,...)             ndk_log_debug_mysql (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-[m
[31m-#define ndk_request_log_debug_core(r,...)           ndk_log_debug_core (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_alloc(r,...)          ndk_log_debug_alloc (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_mutex(r,...)          ndk_log_debug_mutex (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_event(r,...)          ndk_log_debug_event (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_http(r,...)           ndk_log_debug_http (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_mail(r,...)           ndk_log_debug_mail (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_mysql(r,...)          ndk_log_debug_mysql (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-[m
[31m-#else [m
[31m-[m
[31m-#define ndk_log_debug_core(log,...)[m
[31m-#define ndk_log_debug_alloc(log,...)[m
[31m-#define ndk_log_debug_mutex(log,...)[m
[31m-#define ndk_log_debug_event(log,...)[m
[31m-#define ndk_log_debug_http(log,...)[m
[31m-#define ndk_log_debug_mail(log,...)[m
[31m-#define ndk_log_debug_mysql(log,...)[m
[31m-[m
[31m-#define ndk_conf_log_debug_core(r,...)[m
[31m-#define ndk_conf_log_debug_alloc(r,...)[m
[31m-#define ndk_conf_log_debug_mutex(r,...)[m
[31m-#define ndk_conf_log_debug_event(r,...)[m
[31m-#define ndk_conf_log_debug_http(r,...)[m
[31m-#define ndk_conf_log_debug_mail(r,...)[m
[31m-#define ndk_conf_log_debug_mysql(r,...)[m
[31m-[m
[31m-#define ndk_request_log_debug_core(r,...)[m
[31m-#define ndk_request_log_debug_alloc(r,...)[m
[31m-#define ndk_request_log_debug_mutex(r,...)[m
[31m-#define ndk_request_log_debug_event(r,...)[m
[31m-#define ndk_request_log_debug_http(r,...)[m
[31m-#define ndk_request_log_debug_mail(r,...)[m
[31m-#define ndk_request_log_debug_mysql(r,...)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#elif (NGX_HAVE_GCC_VARIADIC_MACROS)[m
[31m-[m
[31m-#define ndk_log_stderr(log,args...)                 ngx_log_error (NGX_LOG_STDERR, log, 0, args)[m
[31m-#define ndk_log_emerg(log,args...)                  ngx_log_error (NGX_LOG_EMERG, log, 0, args)[m
[31m-#define ndk_log_alert(log,args...)                  ngx_log_error (NGX_LOG_ALERT, log, 0, args)[m
[31m-#define ndk_log_crit(log,args...)                   ngx_log_error (NGX_LOG_CRIT, log, 0, args)[m
[31m-#define ndk_log_err(log,args...)                    ngx_log_error (NGX_LOG_ERR, log, 0, args)[m
[31m-#define ndk_log_warning(log,args...)                ngx_log_error (NGX_LOG_WARN, log, 0, args)[m
[31m-#define ndk_log_notice(log,args...)                 ngx_log_error (NGX_LOG_NOTICE, log, 0, args)[m
[31m-#define ndk_log_info(log,args...)                   ngx_log_error (NGX_LOG_INFO, log, 0, args)[m
[31m-[m
[31m-#define ndk_log_debug_core(log,args...)             ngx_log_debug (NGX_LOG_DEBUG_CORE, log, 0, args)[m
[31m-#define ndk_log_debug_alloc(log,args...)            ngx_log_debug (NGX_LOG_DEBUG_ALLOC, log, 0, args)[m
[31m-#define ndk_log_debug_mutex(log,args...)            ngx_log_debug (NGX_LOG_DEBUG_MUTEX, log, 0, args)[m
[31m-#define ndk_log_debug_event(log,args...)            ngx_log_debug (NGX_LOG_DEBUG_EVENT, log, 0, args)[m
[31m-#define ndk_log_debug_http(log,args...)             ngx_log_debug (NGX_LOG_DEBUG_HTTP, log, 0, args)[m
[31m-#define ndk_log_debug_mail(log,args...)             ngx_log_debug (NGX_LOG_DEBUG_MAIL, log, 0, args)[m
[31m-#define ndk_log_debug_mysql(log,args...)            ngx_log_debug (NGX_LOG_DEBUG_MYSQL, log, 0, args)[m
[31m-#define ndk_log_debug_script(log,args...)           ngx_log_debug (NGX_LOG_DEBUG_SCRIPT, log, 0, args)[m
[31m-[m
[31m-#define ndk_conf_log_stderr(cf,args...)             ngx_conf_log_error (NGX_LOG_STDERR, cf, 0, args)[m
[31m-#define ndk_conf_log_emerg(cf,args...)              ngx_conf_log_error (NGX_LOG_EMERG, cf, 0, args)[m
[31m-#define ndk_conf_log_alert(cf,args...)              ngx_conf_log_error (NGX_LOG_ALERT, cf, 0, args)[m
[31m-#define ndk_conf_log_crit(cf,args...)               ngx_conf_log_error (NGX_LOG_CRIT, cf, 0, args)[m
[31m-#define ndk_conf_log_err(cf,args...)                ngx_conf_log_error (NGX_LOG_ERR, cf, 0, args)[m
[31m-#define ndk_conf_log_warning(cf,args...)            ngx_conf_log_error (NGX_LOG_WARN, cf, 0, args)[m
[31m-#define ndk_conf_log_notice(cf,args...)             ngx_conf_log_error (NGX_LOG_NOTICE, cf, 0, args)[m
[31m-#define ndk_conf_log_info(cf,args...)               ngx_conf_log_error (NGX_LOG_INFO, cf, 0, args)[m
[31m-[m
[31m-#define ndk_conf_log_debug_core(r,args...)          ndk_log_debug_core (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_alloc(r,args...)         ndk_log_debug_alloc (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_mutex(r,args...)         ndk_log_debug_mutex (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_event(r,args...)         ndk_log_debug_event (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_http(r,args...)          ndk_log_debug_http (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_mail(r,args...)          ndk_log_debug_mail (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_mysql(r,args...)         ndk_log_debug_mysql (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_script(r,args...)        ndk_log_debug_script (ndk_conf_to_log(r), args)[m
[31m-[m
[31m-#define ndk_request_log_stderr(r,args...)           ndk_log_stderr (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_emerg(r,args...)            ndk_log_emerg (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_alert(r,args...)            ndk_log_alert (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_crit(r,args...)             ndk_log_crit (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_err(r,args...)              ndk_log_err (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_warning(r,args...)          ndk_log_warning (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_notice(r,args...)           ndk_log_notice (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_info(r,args...)             ndk_log_info (ndk_request_to_log(r), args)[m
[31m-[m
[31m-#define ndk_request_log_debug_core(r,args...)       ndk_log_debug_core (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_alloc(r,args...)      ndk_log_debug_alloc (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_mutex(r,args...)      ndk_log_debug_mutex (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_event(r,args...)      ndk_log_debug_event (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_http(r,args...)       ndk_log_debug_http (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_mail(r,args...)       ndk_log_debug_mail (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_mysql(r,args...)      ndk_log_debug_mysql (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_script(r,args...)     ndk_log_debug_script (ndk_request_to_log(r), args)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#else /* NO VARIADIC MACROS */[m
[31m-[m
[31m-/* #warning does not work on Windows */[m
[31m-#pragma message("Nginx Devel Kit logging without variadic macros not yet implemented")[m
[31m-[m
[31m-#endif /* VARIADIC MACROS */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_parse.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_parse.h[m
[1mdeleted file mode 100644[m
[1mindex 7c43e14..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_parse.h[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define ndk_str3_cmp(m, c0, c1, c2, c3)                                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ndk_str3Ocmp(m, c0, c1, c2, c3)                                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ndk_str4cmp(m, c0, c1, c2, c3)                                        \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ndk_str5cmp(m, c0, c1, c2, c3, c4)                                    \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && m[4] == c4[m
[31m-[m
[31m-#define ndk_str6cmp(m, c0, c1, c2, c3, c4, c5)                                \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4)[m
[31m-[m
[31m-#define ndk_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)[m
[31m-[m
[31m-#define ndk_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                        \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)[m
[31m-[m
[31m-#define ndk_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8)                    \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)  \[m
[31m-        && m[8] == c8[m
[31m-[m
[31m-#else /* !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) */[m
[31m-[m
[31m-#define ndk_str3_cmp(m, c0, c1, c2, c3)                                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2[m
[31m-[m
[31m-#define ndk_str3Ocmp(m, c0, c1, c2, c3)                                       \[m
[31m-    m[0] == c0 && m[2] == c2 && m[3] == c3[m
[31m-[m
[31m-#define ndk_str4cmp(m, c0, c1, c2, c3)                                        \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3[m
[31m-[m
[31m-#define ndk_str5cmp(m, c0, c1, c2, c3, c4)                                    \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4[m
[31m-[m
[31m-#define ndk_str6cmp(m, c0, c1, c2, c3, c4, c5)                                \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5[m
[31m-[m
[31m-#define ndk_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6[m
[31m-[m
[31m-#define ndk_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                        \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7[m
[31m-[m
[31m-#define ndk_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8)                    \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7 && m[8] == c8[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_path.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_path.c[m
[1mdeleted file mode 100644[m
[1mindex 0b7c266..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_path.c[m
[1m+++ /dev/null[m
[36m@@ -1,583 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* This function cleans a path to its most basic form, performing the following transformations :[m
[31m- *[m
[31m- *  - ./ -> [empty][m
[31m- *  - // -> /[m
[31m- *  - /base/parent/../ -> /base/[m
[31m- *[m
[31m- * If possible, it leaves the original string in place and does not copy characters, otherwise[m
[31m- * characters are copied.[m
[31m-*/[m
[31m-[m
[31m-void[m
[31m-ndk_clean_path (ngx_str_t *path, ngx_uint_t complex, size_t off)[m
[31m-{[m
[31m-    u_char         *s, *p, *m, *e, c, *l;[m
[31m-    ngx_uint_t      root;[m
[31m-[m
[31m-    if (path->len == 1) {[m
[31m-[m
[31m-        if (path->data[0] == '.') {[m
[31m-            path->len = 0;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* strip initial './' */[m
[31m-[m
[31m-    s = path->data;[m
[31m-    e = s + path->len;[m
[31m-[m
[31m-    if (off) {[m
[31m-        p = s + off;[m
[31m-        goto check_basic;[m
[31m-    }[m
[31m-[m
[31m-    if (*s == '/')[m
[31m-        root = 1;[m
[31m-    else[m
[31m-        root = 0;[m
[31m-[m
[31m-    while (s < e) {[m
[31m-[m
[31m-        switch (*s) {[m
[31m-[m
[31m-        case    '/' :[m
[31m-[m
[31m-            /* '//' => '/' */[m
[31m-[m
[31m-            s++;[m
[31m-            continue;[m
[31m-[m
[31m-        case    '.' :[m
[31m-[m
[31m-            if (s == e-1) {[m
[31m-[m
[31m-                if (root) {[m
[31m-                    path->data[0] = '/';[m
[31m-                    path->len = 1;[m
[31m-                } else {[m
[31m-                    path->len = 0;[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            /* './' => '' */[m
[31m-[m
[31m-            if (s[1] == '/') {[m
[31m-[m
[31m-                s += 2;[m
[31m-[m
[31m-                if (s == e) {[m
[31m-[m
[31m-                    path->len = 0;[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (root && *s != '/') {[m
[31m-        s--;[m
[31m-    }[m
[31m-[m
[31m-    p = s;[m
[31m-[m
[31m-check_basic :[m
[31m-[m
[31m-    for ( ; p<e; p++) {[m
[31m-[m
[31m-        if (*p == '/') {[m
[31m-[m
[31m-        new_dir_first :[m
[31m-[m
[31m-            if (e - p == 1)[m
[31m-                break;[m
[31m-[m
[31m-            switch (p[1]) {[m
[31m-[m
[31m-            case    '/' :[m
[31m-[m
[31m-                /* '//' => '/' */[m
[31m-[m
[31m-                m = p + 2;[m
[31m-                goto copy;[m
[31m-[m
[31m-            case    '.' :[m
[31m-[m
[31m-                if (e - p == 2)[m
[31m-                    break;[m
[31m-[m
[31m-                switch (p[2]) {[m
[31m-[m
[31m-                case    '/' :[m
[31m-[m
[31m-                    /* './' => '' */[m
[31m-[m
[31m-                    m = p + 2;[m
[31m-                    goto copy;[m
[31m-[m
[31m-                case    '.' :[m
[31m-[m
[31m-                    if (e - p == 3 || p[3] == '/') {[m
[31m-[m
[31m-                        if (p == s) {[m
[31m-[m
[31m-                            s += 3;[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                        if (p - s >= 2) {[m
[31m-[m
[31m-                            if (p[-1] == '.' && p[-2] == '.') {[m
[31m-[m
[31m-                                if (p - s == 2 || p[-3] == '/') {    /* = '../../' */[m
[31m-[m
[31m-                                    p += 2;     /* 3? */[m
[31m-                                    continue;[m
[31m-                                }[m
[31m-                            }[m
[31m-                        }[m
[31m-[m
[31m-                        m = p + 4;[m
[31m-[m
[31m-                        if (complex) {[m
[31m-[m
[31m-                            for (p--; p >= s; p--) {[m
[31m-[m
[31m-                                switch (*p) {[m
[31m-[m
[31m-                                case    '/' :[m
[31m-                                    goto copy;[m
[31m-[m
[31m-                                case    '$' :[m
[31m-[m
[31m-                                    p = m - 1;[m
[31m-[m
[31m-                                    if (m == e)[m
[31m-                                        goto end_basic;[m
[31m-[m
[31m-                                    goto new_dir_first;[m
[31m-                                }[m
[31m-                            }[m
[31m-[m
[31m-                        } else {[m
[31m-[m
[31m-                           for (p--; p > s; p--) {[m
[31m-[m
[31m-                                /* '/path/folder/../' => '/path/' */[m
[31m-[m
[31m-                                if (*p == '/')[m
[31m-                                    break;[m
[31m-                            }[m
[31m-                        }[m
[31m-[m
[31m-                        goto copy;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-end_basic :[m
[31m-[m
[31m-    path->data = s;[m
[31m-    path->len = p - s;[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-copy :[m
[31m-[m
[31m-    p++;[m
[31m-[m
[31m-    if (m < e)[m
[31m-        goto new_dir;[m
[31m-[m
[31m-    while (m < e) {       [m
[31m-[m
[31m-        c = *m;[m
[31m-        *p = c;[m
[31m-        p++;[m
[31m-[m
[31m-        if (c == '/') {[m
[31m-[m
[31m-            m++;[m
[31m-[m
[31m-        new_dir :[m
[31m-[m
[31m-            for ( ; m<e; m++) {[m
[31m-[m
[31m-                c = *m;[m
[31m-                if (c != '/')[m
[31m-                    break;[m
[31m-            }[m
[31m-[m
[31m-            if (m == e)[m
[31m-                break;[m
[31m-[m
[31m-            if (c == '.') {[m
[31m-[m
[31m-                if (e - m == 1)[m
[31m-                    break;[m
[31m-[m
[31m-                switch (m[1]) {[m
[31m-[m
[31m-                case    '/' :[m
[31m-[m
[31m-                    /* './' => '' */[m
[31m-[m
[31m-                    m += 2;[m
[31m-                    if (m == e)[m
[31m-                        break;[m
[31m-[m
[31m-                    goto new_dir;[m
[31m-[m
[31m-                case    '.' :[m
[31m-[m
[31m-                    if (e - m == 2 || m[2] == '/') {[m
[31m-[m
[31m-                        if (m - s >= 3) {   /* NOTE : this is one higher than above because m has moved on 1 */[m
[31m-[m
[31m-                            if (p[-2] == '.' && p[-3] == '.') {[m
[31m-[m
[31m-                                if (m - s == 3 || p[-4] == '/') {    /* = '../../' */[m
[31m-[m
[31m-                                    p[0] = '.';[m
[31m-                                    p[1] = '.';[m
[31m-                                    p[2] = '/';[m
[31m-                                    p += 3;[m
[31m-                                    m += 3;[m
[31m-                                    goto new_dir;[m
[31m-                                }[m
[31m-                            }[m
[31m-                        }[m
[31m-[m
[31m-                        if (complex) {[m
[31m-[m
[31m-                            l = p;[m
[31m-[m
[31m-                            for (p -= 2; p >= s; p--) {[m
[31m-[m
[31m-                                switch (*p) {[m
[31m-[m
[31m-                                case    '/' :[m
[31m-                                    break;[m
[31m-[m
[31m-                                case    '$' :[m
[31m-[m
[31m-                                    l[0] = '.';[m
[31m-                                    l[1] = '.';[m
[31m-                                    l[2] = '/';[m
[31m-                                    p = l + 4;[m
[31m-                                    break;[m
[31m-[m
[31m-                                default :[m
[31m-                                    continue;[m
[31m-                                }[m
[31m-[m
[31m-                                break;[m
[31m-                            }[m
[31m-[m
[31m-                            m += 3;[m
[31m-                            if (m == e)[m
[31m-                                goto end;[m
[31m-[m
[31m-                            goto new_dir;[m
[31m-[m
[31m-                        } else {[m
[31m-[m
[31m-                            for (p -= 2; p > s; p--) {[m
[31m-[m
[31m-                                /* '/path/folder/../' => '/path/' */[m
[31m-[m
[31m-                                if (*p == '/')[m
[31m-                                    break;[m
[31m-                            }[m
[31m-[m
[31m-                            m += 3;[m
[31m-                            if (m == e)[m
[31m-                                goto end;[m
[31m-[m
[31m-                            goto new_dir;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            m++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-end :[m
[31m-[m
[31m-    path->data = s;[m
[31m-    path->len = p - s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* This function converts a path to its directory version, and assumes that there is always space[m
[31m- * to allocatate an extra character on the end (which is only true if the provided strings always[m
[31m- * have NULL's at the end (hence the 'safe').[m
[31m-*/[m
[31m-[m
[31m-void[m
[31m-ndk_path_to_dir_safe (ngx_str_t *path, ngx_uint_t complex, size_t off)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    u_char  *p, *m;[m
[31m-[m
[31m-    ndk_clean_path (path, complex, off);[m
[31m-[m
[31m-    len = path->len;[m
[31m-    if (!len)[m
[31m-        return;[m
[31m-[m
[31m-    p = path->data;[m
[31m-    m = p + len - 1;[m
[31m-[m
[31m-    if (*m != '/') {[m
[31m-[m
[31m-        p [len] = '/';[m
[31m-        path->len++;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Divides a path given by path/to/path1:path/to/path2 into separate strings and returns an[m
[31m- * array of these strings.[m
[31m-*/[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_split_path_create (ngx_conf_t *cf, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_str_t         *str;[m
[31m-    int                n;[m
[31m-    u_char            *m, *s, *e;[m
[31m-    ngx_array_t       *a; [m
[31m-[m
[31m-    if (path == NULL)[m
[31m-        return  NULL;[m
[31m-[m
[31m-    n = ndk_strcntc (path, ':');[m
[31m-[m
[31m-    a = ngx_array_create (cf->pool, n + 1, sizeof (ngx_str_t));[m
[31m-    if (a == NULL) {[m
[31m-        return  NULL;[m
[31m-    }[m
[31m-[m
[31m-    s = path->data;[m
[31m-    e = s + path->len;[m
[31m-[m
[31m-    while (s < e) {[m
[31m-[m
[31m-        m = s;[m
[31m-[m
[31m-        while (m < e && *m != ':') m++;[m
[31m-[m
[31m-        if (m == s) {[m
[31m-            s = m+1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        str = ngx_array_push (a);[m
[31m-        if (str == NULL) {[m
[31m-            return  NULL;[m
[31m-        }[m
[31m-[m
[31m-        str->data = s;[m
[31m-        str->len = m - s;[m
[31m-[m
[31m-        if (ngx_conf_full_name (cf->cycle, str, 0) == NGX_ERROR)[m
[31m-            return  NULL;[m
[31m-[m
[31m-        s = m+1;[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_split_path_create_raw (ngx_conf_t *cf, char *path)[m
[31m-{[m
[31m-    ngx_str_t         *str;[m
[31m-    int                n;[m
[31m-    char              *m, *s;[m
[31m-    ngx_array_t       *a; [m
[31m-[m
[31m-    if (path == NULL)[m
[31m-        return  NULL;[m
[31m-[m
[31m-    n = ndk_strccnt (path, ':');[m
[31m-[m
[31m-    a = ngx_array_create (cf->pool, n + 1, sizeof (ngx_str_t));[m
[31m-    if (a == NULL) {[m
[31m-        return  NULL;[m
[31m-    }[m
[31m-[m
[31m-    s = path;[m
[31m-[m
[31m-[m
[31m-    while (*s != '\0') {[m
[31m-[m
[31m-        m = s;[m
[31m-[m
[31m-        while (*m != '\0' && *m != ':') m++;[m
[31m-[m
[31m-        if (m == s) {[m
[31m-            s = m+1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        str = ngx_array_push (a);[m
[31m-        if (str == NULL) {[m
[31m-            return  NULL;[m
[31m-        }[m
[31m-[m
[31m-        str->data = (u_char *) s;[m
[31m-        str->len = m - s;[m
[31m-[m
[31m-        if (ngx_conf_full_name (cf->cycle, str, 0) == NGX_ERROR)[m
[31m-            return  NULL;[m
[31m-[m
[31m-        if (*m == '\0')[m
[31m-            break;[m
[31m-[m
[31m-        s = m+1;[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_full_path_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t        *path, *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    path = (ngx_str_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (path->data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *path = value[1];[m
[31m-[m
[31m-    if (ngx_conf_full_name (cf->cycle, path, 0) == NGX_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, path);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_split_path_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)     [m
[31m-{[m
[31m-    /* TODO : change to use the path func above */[m
[31m-[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t         *value, *str;[m
[31m-    ngx_array_t      **a;[m
[31m-    ngx_conf_post_t   *post;[m
[31m-    int                n;[m
[31m-    u_char            *m, *s, *e;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a != NGX_CONF_UNSET_PTR) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    n = ndk_strcntc (value, ':') + 1;[m
[31m-[m
[31m-    *a = ngx_array_create (cf->pool, n, sizeof (ngx_str_t));[m
[31m-    if (*a == NULL) {[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s = value->data;[m
[31m-    e = s + value->len;[m
[31m-[m
[31m-    while (s < e) {[m
[31m-[m
[31m-        m = s;[m
[31m-[m
[31m-        while (m < e && *m != ':') m++;[m
[31m-[m
[31m-        if (m == s) {[m
[31m-            s = m+1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        str = ngx_array_push (*a);[m
[31m-        if (str == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        str->data = s;[m
[31m-        str->len = m - s;[m
[31m-[m
[31m-        if (ngx_conf_full_name (cf->cycle, str, 0) == NGX_ERROR)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        s = m+1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_full_path (ngx_conf_t *cf, void *data, ngx_str_t *path)[m
[31m-{[m
[31m-    if (ngx_conf_full_name (cf->cycle, path, 0) == NGX_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_full_conf_path (ngx_conf_t *cf, void *data, ngx_str_t *path)[m
[31m-{[m
[31m-    if (ngx_conf_full_name (cf->cycle, path, 1) == NGX_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_path.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_path.h[m
[1mdeleted file mode 100644[m
[1mindex 22ba945..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_path.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* path conversion functions */[m
[31m-[m
[31m-void            ndk_clean_path                  (ngx_str_t *path, ngx_uint_t complex, size_t off);[m
[31m-void            ndk_path_to_dir_safe            (ngx_str_t *path, ngx_uint_t complex, size_t off);[m
[31m-[m
[31m-/* path create functions */[m
[31m-[m
[31m-ngx_array_t *   ndk_split_path_create           (ngx_conf_t *cf, ngx_str_t *path);[m
[31m-ngx_array_t *   ndk_split_path_create_raw       (ngx_conf_t *cf, char *path);[m
[31m-[m
[31m-/* conf set functions */[m
[31m-[m
[31m-char *          ndk_conf_set_full_path_slot     (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *          ndk_conf_set_split_path_slot    (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-/* conf set post functions */[m
[31m-[m
[31m-char *          ndk_conf_set_full_path          (ngx_conf_t *cf, void *data, ngx_str_t *path);[m
[31m-char *          ndk_conf_set_full_conf_path     (ngx_conf_t *cf, void *data, ngx_str_t *path);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_process.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_process.c[m
[1mdeleted file mode 100644[m
[1mindex fbc789c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_process.c[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_init_signals (ngx_signal_t *sig, ngx_log_t *log)[m
[31m-{[m
[31m-    struct sigaction   sa;[m
[31m-[m
[31m-    for ( ; sig->signo != 0; sig++) {[m
[31m-        ndk_zerov (sa);[m
[31m-        sa.sa_handler = sig->handler;[m
[31m-        sigemptyset (&sa.sa_mask);[m
[31m-        [m
[31m-        if (sigaction (sig->signo, &sa, NULL) == -1) {[m
[31m-            ngx_log_error (NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          "sigaction(%s) failed", sig->signame);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_process.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_process.h[m
[1mdeleted file mode 100644[m
[1mindex 7ac1d99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_process.h[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int     signo;[m
[31m-    char   *signame;[m
[31m-    char   *name;[m
[31m-    void  (*handler)(int signo);[m
[31m-} ngx_signal_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ndk_init_signals    (ngx_signal_t *sig, ngx_log_t *log);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_regex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_regex.c[m
[1mdeleted file mode 100644[m
[1mindex d5893df..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_regex.c[m
[1m+++ /dev/null[m
[36m@@ -1,215 +0,0 @@[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_regex_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_conf_post_t         *post;[m
[31m-    ngx_regex_elt_t         *re;   [m
[31m-    ngx_regex_compile_t      rc;[m
[31m-    u_char                   errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    re = (ngx_regex_elt_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (re->name) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    ndk_zerov (rc);[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-    rc.pattern = *value;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = rc.regex;[m
[31m-    re->name = value->data;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, re);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m- [m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_regex_caseless_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_conf_post_t         *post;[m
[31m-    ngx_regex_elt_t         *re;   [m
[31m-    ngx_regex_compile_t      rc;[m
[31m-    u_char                   errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    re = (ngx_regex_elt_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (re->name) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    ndk_zerov (rc);[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-    rc.pattern = *value;[m
[31m-    rc.options = NGX_REGEX_CASELESS;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = rc.regex;[m
[31m-    re->name = value->data;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, re);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_regex_array_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_conf_post_t         *post;[m
[31m-    ngx_array_t            **a;[m
[31m-    ngx_regex_elt_t         *re;   [m
[31m-    ngx_regex_compile_t      rc;[m
[31m-    ngx_uint_t               i, n;[m
[31m-    u_char                   errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        n = cf->args->nelts > 4 ? cf->args->nelts : 4;[m
[31m-[m
[31m-        *a = ngx_array_create (cf->pool, n, sizeof (ngx_regex_elt_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ndk_zerov (rc);[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    for (i=0; i<n; i++, value++) {[m
[31m-[m
[31m-        re = ngx_array_push (*a);[m
[31m-        if (re == NULL)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        rc.pattern = *value;[m
[31m-[m
[31m-        if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        re->regex = rc.regex;[m
[31m-        re->name = value->data;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_regex_array_caseless_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_conf_post_t         *post;[m
[31m-    ngx_array_t            **a;[m
[31m-    ngx_regex_elt_t         *re;   [m
[31m-    ngx_regex_compile_t      rc;[m
[31m-    ngx_uint_t               i, n;[m
[31m-    u_char                   errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        n = cf->args->nelts > 4 ? cf->args->nelts : 4;[m
[31m-[m
[31m-        *a = ngx_array_create (cf->pool, n, sizeof (ngx_regex_elt_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ndk_zerov (rc);[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    for (i=0; i<n; i++, value++) {[m
[31m-[m
[31m-        re = ngx_array_push (*a);[m
[31m-        if (re == NULL)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        rc.pattern = *value;[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-[m
[31m-        if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        re->regex = rc.regex;[m
[31m-        re->name = value->data;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_regex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_regex.h[m
[1mdeleted file mode 100644[m
[1mindex 4319b04..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_regex.h[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-[m
[31m-[m
[31m-char *  ndk_conf_set_regex_slot                 (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_regex_caseless_slot        (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_regex_array_slot           (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_regex_array_caseless_slot  (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_rewrite.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_rewrite.c[m
[1mdeleted file mode 100644[m
[1mindex 77ce9f8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_rewrite.c[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* these have been taken from the rewrite module and http_script file[m
[31m- * because those functions are defined as being static - a patch will[m
[31m- * be provided later to un-define them as being static[m
[31m- */[m
[31m-[m
[31m-[m
[31m-uintptr_t ndk_http_script_exit_code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_http_rewrite_value (ngx_conf_t *cf, ndk_http_rewrite_loc_conf_t *lcf,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t                              n;[m
[31m-    ngx_http_script_compile_t              sc;[m
[31m-    ngx_http_script_value_code_t          *val;[m
[31m-    ngx_http_script_complex_value_code_t  *complex;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(value);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        val = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                         sizeof(ngx_http_script_value_code_t));[m
[31m-        if (val == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_atoi(value->data, value->len);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            n = 0;[m
[31m-        }[m
[31m-[m
[31m-        val->code = ngx_http_script_value_code;[m
[31m-        val->value = (uintptr_t) n;[m
[31m-        val->text_len = (uintptr_t) value->len;[m
[31m-        val->text_data = (uintptr_t) value->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    complex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                 sizeof(ngx_http_script_complex_value_code_t));[m
[31m-    if (complex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    complex->code = ngx_http_script_complex_value_code;[m
[31m-    complex->lengths = NULL;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = value;[m
[31m-    sc.lengths = &complex->lengths;[m
[31m-    sc.values = &lcf->codes;[m
[31m-    sc.variables = n;[m
[31m-    sc.complete_lengths = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_http_rewrite_var (ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_variable_t          *var;[m
[31m-    ngx_http_core_main_conf_t    *cmcf;[m
[31m-    ndk_http_rewrite_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (rlcf->uninitialized_variable_warn == 0) {[m
[31m-        *v = ngx_http_variable_null_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    var = cmcf->variables.elts;[m
[31m-[m
[31m-    /*[m
[31m-     * the ngx_http_rewrite_module sets variables directly in r->variables,[m
[31m-     * and they should be handled by ngx_http_get_indexed_variable(),[m
[31m-     * so the handler is called only if the variable is not initialized[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                  "using uninitialized \"%V\" variable", &var[data].name);[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_rewrite.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_rewrite.h[m
[1mdeleted file mode 100644[m
[1mindex 2479aa2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_rewrite.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : should remove this when not needed */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* used for plugging into the rewrite module (taken from the rewrite module) */[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t  *codes;        /* uintptr_t */[m
[31m-    ngx_uint_t    stack_size;[m
[31m-    ngx_flag_t    log;[m
[31m-    ngx_flag_t    uninitialized_variable_warn;[m
[31m-} ndk_http_rewrite_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-extern  ngx_module_t    ngx_http_rewrite_module;[m
[31m-extern  uintptr_t       ndk_http_script_exit_code;[m
[31m-[m
[31m-char *      ndk_http_rewrite_value      (ngx_conf_t *cf, ndk_http_rewrite_loc_conf_t *lcf,[m
[31m-                                            ngx_str_t *value);[m
[31m-ngx_int_t   ndk_http_rewrite_var        (ngx_http_request_t *r, [m
[31m-                                            ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-#define     ndk_http_script_exit  (u_char *) &ndk_http_script_exit_code[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_set_var.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_set_var.c[m
[1mdeleted file mode 100644[m
[1mindex 388f873..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_set_var.c[m
[1m+++ /dev/null[m
[36m@@ -1,602 +0,0 @@[m
[31m-#include    <ndk.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    void                       *func;[m
[31m-} ndk_set_var_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    void                       *func;[m
[31m-    size_t                      size;[m
[31m-} ndk_set_var_size_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    void                       *func;[m
[31m-    void                       *data;[m
[31m-} ndk_set_var_data_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    void                       *func;[m
[31m-    size_t                      size;[m
[31m-    void                       *data;[m
[31m-} ndk_set_var_size_data_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                        index;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_http_variable_t             *v;[m
[31m-    ngx_conf_t                      *cf;[m
[31m-    ndk_http_rewrite_loc_conf_t     *rlcf;[m
[31m-} ndk_set_var_info_t;[m
[31m-[m
[31m-[m
[31m-static void     ndk_set_var_code           (ngx_http_script_engine_t *e);[m
[31m-static void     ndk_set_var_hash_code      (ngx_http_script_engine_t *e);[m
[31m-static void     ndk_set_var_value_code     (ngx_http_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ndk_set_var_code_finalize(ngx_http_script_engine_t *e, ngx_int_t rc,[m
[31m-                                ngx_http_variable_value_t *v, ngx_str_t *str)[m
[31m-{[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-[m
[31m-        v->data = str->data;[m
[31m-        v->len = str->len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                        "http script value (post filter): \"%v\"", v);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-[m
[31m-        v->valid = 0;[m
[31m-        v->not_found = 1;[m
[31m-        v->no_cacheable = 1;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-[m
[31m-        e->ip = ndk_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        break;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_code_t          *sv;[m
[31m-    ndk_set_var_pt               func;[m
[31m-[m
[31m-    sv = (ndk_set_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_code_t);[m
[31m-[m
[31m-    v = e->sp++;[m
[31m-[m
[31m-    func = (ndk_set_var_pt) sv->func;[m
[31m-[m
[31m-    rc = func(e->request, &str);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_data_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_data_code_t     *svd;[m
[31m-    ndk_set_var_data_pt          func;[m
[31m-[m
[31m-    svd = (ndk_set_var_data_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_data_code_t);[m
[31m-[m
[31m-    v = e->sp++;[m
[31m-[m
[31m-    func = (ndk_set_var_data_pt) svd->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, svd->data);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_value_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_code_t          *sv;[m
[31m-    ndk_set_var_value_pt         func;[m
[31m-[m
[31m-    sv = (ndk_set_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_code_t);[m
[31m-[m
[31m-    v = e->sp - 1;[m
[31m-[m
[31m-    func = (ndk_set_var_value_pt) sv->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, v);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_value_data_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_data_code_t     *svd;[m
[31m-    ndk_set_var_value_data_pt    func;[m
[31m-[m
[31m-    svd = (ndk_set_var_data_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_data_code_t);[m
[31m-[m
[31m-    v = e->sp - 1;[m
[31m-[m
[31m-    func = (ndk_set_var_value_data_pt) svd->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, v, svd->data);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_multi_value_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_size_code_t     *svs;[m
[31m-    ndk_set_var_value_pt         func;[m
[31m-[m
[31m-    svs = (ndk_set_var_size_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_size_code_t);[m
[31m-[m
[31m-    v = e->sp - svs->size;[m
[31m-    e->sp = v + 1;[m
[31m-[m
[31m-    func = (ndk_set_var_value_pt) svs->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, v);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_multi_value_data_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_str_t                        str;[m
[31m-    ngx_http_variable_value_t       *v;[m
[31m-    ndk_set_var_size_data_code_t    *svsd;[m
[31m-    ndk_set_var_value_data_pt        func;[m
[31m-[m
[31m-    svsd = (ndk_set_var_size_data_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_size_data_code_t);[m
[31m-[m
[31m-    v = e->sp - svsd->size;[m
[31m-    e->sp = v + 1;[m
[31m-[m
[31m-    func = (ndk_set_var_value_data_pt) svsd->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, v, svsd->data);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_hash_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_size_code_t     *svs;[m
[31m-    ndk_set_var_hash_pt          func;[m
[31m-[m
[31m-    svs = (ndk_set_var_size_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_size_code_t);[m
[31m-[m
[31m-    p = ngx_palloc(e->request->pool, svs->size);[m
[31m-    if (p == NULL) {[m
[31m-        e->ip = ndk_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    v = e->sp - 1;[m
[31m-[m
[31m-    func = (ndk_set_var_hash_pt) svs->func;[m
[31m-[m
[31m-    func(p, (char *) v->data, v->len);[m
[31m-[m
[31m-    v->data = (u_char *) p;[m
[31m-    v->len = svs->size;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script hashed value: \"%v\"", v);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ndk_set_var_name(ndk_set_var_info_t *info, ngx_str_t *varname)[m
[31m-{[m
[31m-    ngx_int_t                        index;[m
[31m-    ngx_http_variable_t             *v;[m
[31m-    ngx_conf_t                      *cf;[m
[31m-    ndk_http_rewrite_loc_conf_t     *rlcf;[m
[31m-    ngx_str_t                        name;[m
[31m-[m
[31m-    name = *varname;[m
[31m-[m
[31m-    cf = info->cf;[m
[31m-    rlcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (name.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name.len--;[m
[31m-    name.data++;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, &name);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->get_handler == NULL[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "arg_", 4) != 0[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "cookie_", 7) != 0[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "http_", 5) != 0[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "sent_http_", 10) != 0[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "upstream_http_", 14) != 0)[m
[31m-    {[m
[31m-        v->get_handler = ndk_http_rewrite_var;[m
[31m-        v->data = index;[m
[31m-    }[m
[31m-[m
[31m-    info->v = v;[m
[31m-    info->index = index;[m
[31m-    info->rlcf = rlcf;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_variable_value_space(ndk_http_rewrite_loc_conf_t *rlcf, ngx_uint_t count)[m
[31m-{[m
[31m-    /* if the number of variable values that will be used is greater than 10,[m
[31m-     * make sure there is enough space allocated on the rewrite value stack[m
[31m-     */[m
[31m-[m
[31m-    if (count <= 10)[m
[31m-        return;[m
[31m-[m
[31m-    if (rlcf->stack_size == NGX_CONF_UNSET_UINT) {[m
[31m-        rlcf->stack_size = count;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->stack_size < count)[m
[31m-        rlcf->stack_size = count;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ndk_set_var_filter(ngx_conf_t *cf, ndk_http_rewrite_loc_conf_t *rlcf,[m
[31m-    ndk_set_var_t *filter)[m
[31m-{[m
[31m-    ndk_set_var_code_t             *sv;[m
[31m-    ndk_set_var_size_code_t        *svs;[m
[31m-    ndk_set_var_data_code_t        *svd;[m
[31m-    ndk_set_var_size_data_code_t   *svsd;[m
[31m-[m
[31m-    if (filter == NULL) {[m
[31m-        return "no filter set";[m
[31m-    }[m
[31m-[m
[31m-    switch (filter->type) {[m
[31m-    case NDK_SET_VAR_BASIC:[m
[31m-[m
[31m-        sv = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                         sizeof(ndk_set_var_code_t));[m
[31m-        if (sv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sv->code = ndk_set_var_code;[m
[31m-        sv->func = filter->func;[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_DATA:[m
[31m-[m
[31m-        svd = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                         sizeof(ndk_set_var_data_code_t));[m
[31m-        if (svd == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svd->code = ndk_set_var_data_code;[m
[31m-        svd->func = filter->func;[m
[31m-        svd->data = filter->data;[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_VALUE:[m
[31m-[m
[31m-        sv = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                         sizeof(ndk_set_var_code_t));[m
[31m-        if (sv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sv->code = ndk_set_var_value_code;[m
[31m-        sv->func = filter->func;[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_VALUE_DATA:[m
[31m-[m
[31m-        svd = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                         sizeof(ndk_set_var_data_code_t));[m
[31m-        if (svd == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svd->code = ndk_set_var_value_data_code;[m
[31m-        svd->func = filter->func;[m
[31m-        svd->data = filter->data;[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_MULTI_VALUE:[m
[31m-[m
[31m-        svs = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                          sizeof(ndk_set_var_size_code_t));[m
[31m-        if (svs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svs->code = ndk_set_var_multi_value_code;[m
[31m-        svs->func = filter->func;[m
[31m-        svs->size = filter->size;[m
[31m-[m
[31m-        ndk_set_variable_value_space(rlcf, svs->size);[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_MULTI_VALUE_DATA:[m
[31m-[m
[31m-        svsd = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                          sizeof(ndk_set_var_size_data_code_t));[m
[31m-        if (svsd == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svsd->code = ndk_set_var_multi_value_data_code;[m
[31m-        svsd->func = filter->func;[m
[31m-        svsd->size = filter->size;[m
[31m-        svsd->data = filter->data;[m
[31m-[m
[31m-        ndk_set_variable_value_space(rlcf, svsd->size);[m
[31m-        break;[m
[31m-[m
[31m-[m
[31m-    case NDK_SET_VAR_HASH:[m
[31m-[m
[31m-        svs = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                          sizeof(ndk_set_var_size_code_t));[m
[31m-        if (svs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svs->code = ndk_set_var_hash_code;[m
[31m-        svs->func = filter->func;[m
[31m-        svs->size = filter->size;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid filter type \"%ul\"", filter->type);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ndk_set_var_filter_value(ndk_set_var_info_t *info, ndk_set_var_t *filter)[m
[31m-{[m
[31m-    ngx_conf_t                          *cf;[m
[31m-    ngx_http_variable_t                 *v;[m
[31m-    ndk_http_rewrite_loc_conf_t         *rlcf;[m
[31m-    ngx_http_script_var_code_t          *vcode;[m
[31m-    ngx_http_script_var_handler_code_t  *vhcode;[m
[31m-[m
[31m-    v = info->v;[m
[31m-    cf = info->cf;[m
[31m-    rlcf = info->rlcf;[m
[31m-[m
[31m-    if (ndk_set_var_filter(cf, rlcf, filter) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->set_handler) {[m
[31m-        vhcode = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                   sizeof(ngx_http_script_var_handler_code_t));[m
[31m-        if (vhcode == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        vhcode->code = ngx_http_script_var_set_handler_code;[m
[31m-        vhcode->handler = v->set_handler;[m
[31m-        vhcode->data = v->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    vcode = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                       sizeof(ngx_http_script_var_code_t));[m
[31m-    if (vcode == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vcode->code = ngx_http_script_set_var_code;[m
[31m-    vcode->index = (uintptr_t) info->index;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_core(ngx_conf_t *cf, ngx_str_t *name, ndk_set_var_t *filter)[m
[31m-{[m
[31m-    char                    *p;[m
[31m-    ndk_set_var_info_t       info;[m
[31m-[m
[31m-    info.cf = cf;[m
[31m-[m
[31m-    p = ndk_set_var_name(&info, name);[m
[31m-    if (p != NGX_CONF_OK) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_filter_value(&info, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_value_core(ngx_conf_t *cf, ngx_str_t *name, ngx_str_t *value, ndk_set_var_t *filter)[m
[31m-{[m
[31m-    char                    *p;[m
[31m-    ndk_set_var_info_t       info;[m
[31m-[m
[31m-    info.cf = cf;[m
[31m-[m
[31m-    p = ndk_set_var_name(&info, name);[m
[31m-    if (p != NGX_CONF_OK) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    p = ndk_http_rewrite_value(cf, info.rlcf, value);[m
[31m-    if (p != NGX_CONF_OK) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_filter_value(&info, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_multi_value_core(ngx_conf_t *cf, ngx_str_t *name,[m
[31m-        ngx_str_t *value, ndk_set_var_t *filter)[m
[31m-{[m
[31m-    char                    *p;[m
[31m-    ndk_set_var_info_t       info;[m
[31m-    ngx_int_t                i;[m
[31m-[m
[31m-    info.cf = cf;[m
[31m-[m
[31m-    p = ndk_set_var_name(&info, name);[m
[31m-    if (p != NGX_CONF_OK) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    for (i = filter->size; i; i--, value++) {[m
[31m-[m
[31m-        p = ndk_http_rewrite_value(cf, info.rlcf, value);[m
[31m-        if (p != NGX_CONF_OK) {[m
[31m-            return p;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_filter_value(&info, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t      *filter;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    filter = (ndk_set_var_t *) cmd->post;[m
[31m-[m
[31m-    return ndk_set_var_core(cf, value, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t           *filter;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    filter = (ndk_set_var_t *) cmd->post;[m
[31m-[m
[31m-    return ndk_set_var_value_core(cf, value,[m
[31m-            cf->args->nelts == 1 + 1 ? value : value + 1, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_multi_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t      *filter;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    filter = (ndk_set_var_t *) cmd->post;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, value, value + 1, filter);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_set_var.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_set_var.h[m
[1mdeleted file mode 100644[m
[1mindex 5dcba97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_set_var.h[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- */[m
[31m-[m
[31m-#ifndef _NDK_SET_VAR_H_INCLUDED_[m
[31m-#define _NDK_SET_VAR_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t   (*ndk_set_var_pt)              (ngx_http_request_t *r, ngx_str_t *val);[m
[31m-typedef ngx_int_t   (*ndk_set_var_data_pt)         (ngx_http_request_t *r, ngx_str_t *val, void *data);[m
[31m-typedef ngx_int_t   (*ndk_set_var_value_pt)        (ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v);[m
[31m-typedef ngx_int_t   (*ndk_set_var_value_data_pt)   (ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v, void *data);[m
[31m-typedef void        (*ndk_set_var_hash_pt)         (u_char *p, char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t      type;[m
[31m-    void           *func;[m
[31m-    size_t          size;[m
[31m-    void           *data;[m
[31m-} ndk_set_var_t;[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NDK_SET_VAR_BASIC = 0,[m
[31m-    NDK_SET_VAR_DATA,[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    NDK_SET_VAR_VALUE_DATA,[m
[31m-    NDK_SET_VAR_MULTI_VALUE,[m
[31m-    NDK_SET_VAR_MULTI_VALUE_DATA,[m
[31m-    NDK_SET_VAR_HASH[m
[31m-};[m
[31m-[m
[31m-[m
[31m-char *  ndk_set_var                    (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_set_var_value              (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_set_var_multi_value        (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-char *  ndk_set_var_core               (ngx_conf_t *cf, ngx_str_t *name, ndk_set_var_t *filter);[m
[31m-char *  ndk_set_var_value_core         (ngx_conf_t *cf, ngx_str_t *name, ngx_str_t *value, ndk_set_var_t *filter);[m
[31m-char *  ndk_set_var_multi_value_core   (ngx_conf_t *cf, ngx_str_t *name, ngx_str_t *value, ndk_set_var_t *filter);[m
[31m-[m
[31m-#endif /* _NDK_SET_VAR_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string.c[m
[1mdeleted file mode 100644[m
[1mindex 7c2a965..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string.c[m
[1m+++ /dev/null[m
[36m@@ -1,434 +0,0 @@[m
[31m-[m
[31m-[m
[31m-int64_t[m
[31m-ndk_atoi64 (u_char *line, size_t n)[m
[31m-{[m
[31m-    int64_t  value;[m
[31m-[m
[31m-    if (n == 0ll) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (value = 0ll; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10ll + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    if (value < 0ll) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_strcntc (ngx_str_t *s, char c)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-    size_t      i;[m
[31m-    u_char     *p;[m
[31m-[m
[31m-    i = s->len;[m
[31m-    p = s->data;[m
[31m-[m
[31m-    for (n=0; i; i--, p++) {[m
[31m-[m
[31m-        if (*p == (u_char) c)[m
[31m-            n++;[m
[31m-    }[m
[31m-[m
[31m-    return  n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_strccnt (char *s, char c)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    while (*s != '\0') {[m
[31m-[m
[31m-        if (*s == 'c')[m
[31m-            n++;[m
[31m-[m
[31m-        s++;[m
[31m-    }[m
[31m-[m
[31m-    return  n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_str_array_create (ngx_pool_t *pool, char **s, ngx_int_t n)[m
[31m-{[m
[31m-    ngx_int_t        i;[m
[31m-    ngx_str_t       *str;[m
[31m-    ngx_array_t     *a;[m
[31m-[m
[31m-    a = ngx_array_create (pool, n, sizeof (ngx_str_t));[m
[31m-    if (a == NULL)[m
[31m-        return  NULL;[m
[31m-[m
[31m-[m
[31m-    for (i=0; i<n; i++, s++) {[m
[31m-[m
[31m-        str = ngx_array_push (a);[m
[31m-[m
[31m-        str->data = (u_char *) *s;[m
[31m-        str->len = strlen (*s);[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ndk_vcatstrf (ngx_pool_t *pool, ngx_str_t *dest, const char *fmt, va_list args)[m
[31m-{[m
[31m-    size_t          len, l, el;[m
[31m-    int             argc;[m
[31m-    u_char         *p, *m, *e, c, c1, *cp;[m
[31m-[m
[31m-    argc = strlen (fmt);[m
[31m-[m
[31m-    ngx_str_t      *s;[m
[31m-    ndk_estr_t     *sp, *sp2, ss [argc];[m
[31m-    u_char        cs [argc];[m
[31m-[m
[31m-    sp = sp2 = ss;[m
[31m-    cp = cs;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    /* TODO : maybe have 'e' at the beginning? */[m
[31m-[m
[31m-    /* parse format to get strings */[m
[31m-[m
[31m-    while (*fmt) {[m
[31m-[m
[31m-        switch (*fmt) {[m
[31m-[m
[31m-        case    'S'     :[m
[31m-[m
[31m-            s = va_arg (args, ngx_str_t *);[m
[31m-[m
[31m-            sp->data = s->data;[m
[31m-            sp->len = s->len;[m
[31m-            sp->escaped = 0;[m
[31m-[m
[31m-            len += sp->len;[m
[31m-            break;[m
[31m-[m
[31m-        case    's'     :[m
[31m-[m
[31m-            sp->data = va_arg (args, u_char *);[m
[31m-            sp->len = (size_t) ngx_strlen (sp->data);[m
[31m-            sp->escaped = 0;[m
[31m-[m
[31m-            len += sp->len;[m
[31m-            break;[m
[31m-[m
[31m-        case    'l'     :[m
[31m-[m
[31m-            sp->data = va_arg (args, u_char *);[m
[31m-            sp->len = (size_t) va_arg (args, int);[m
[31m-            sp->escaped = 0;[m
[31m-[m
[31m-            len += sp->len;[m
[31m-            break;[m
[31m-[m
[31m-        case    'L'     :[m
[31m-[m
[31m-            sp->data = va_arg (args, u_char *);[m
[31m-            sp->len = va_arg (args, size_t);[m
[31m-            sp->escaped = 0;[m
[31m-[m
[31m-            len += sp->len;[m
[31m-            break;[m
[31m-[m
[31m-        case    'e' :[m
[31m-[m
[31m-            p = va_arg (args, u_char *);[m
[31m-[m
[31m-            sp->data = p;[m
[31m-[m
[31m-            l = 0;[m
[31m-            el = 0;[m
[31m-            c = *p;[m
[31m-[m
[31m-            while (c != '\0') {[m
[31m-[m
[31m-                if (c == '\\') {[m
[31m-                    l += 2;[m
[31m-                    p += 2;[m
[31m-                } else {[m
[31m-                    l++;[m
[31m-                    p++;[m
[31m-                }[m
[31m-[m
[31m-                el++; [m
[31m-                c = *p;[m
[31m-            }[m
[31m-[m
[31m-            sp->len = l;[m
[31m-            sp->escaped = 1;[m
[31m-[m
[31m-            len += el;[m
[31m-            break;[m
[31m-[m
[31m-        case    'E' :[m
[31m-[m
[31m-            s = va_arg (args, ngx_str_t *);[m
[31m-[m
[31m-            sp->data = s->data;[m
[31m-            sp->len = s->len;[m
[31m-[m
[31m-            p = sp->data;[m
[31m-[m
[31m-            el = 0;[m
[31m-            e = p + sp->len;[m
[31m-[m
[31m-            while (p < e) {[m
[31m-[m
[31m-                c = *p;[m
[31m-[m
[31m-                if (c == '\\') {[m
[31m-                    p += 2;[m
[31m-                } else {[m
[31m-                    p++;[m
[31m-                }[m
[31m-[m
[31m-                el++;                    [m
[31m-            }[m
[31m-[m
[31m-            sp->escaped = 1;[m
[31m-[m
[31m-            len += el;[m
[31m-            break;[m
[31m-[m
[31m-        case    'n' :[m
[31m-[m
[31m-            sp->data = va_arg (args, u_char *);[m
[31m-            sp->len = (size_t) va_arg (args, int);[m
[31m-[m
[31m-            p = sp->data;[m
[31m-[m
[31m-            el = 0;[m
[31m-            e = p + sp->len;[m
[31m-[m
[31m-            while (p < e) {[m
[31m-[m
[31m-                c = *p;[m
[31m-[m
[31m-                if (c == '\\') {[m
[31m-                    p += 2;[m
[31m-                } else {[m
[31m-                    p++;[m
[31m-                }[m
[31m-[m
[31m-                el++;                    [m
[31m-            }[m
[31m-[m
[31m-            sp->escaped = 1;[m
[31m-[m
[31m-            len += el;[m
[31m-            break;[m
[31m-[m
[31m-        case    'c' :[m
[31m-[m
[31m-            *cp = (u_char) va_arg (args, int);[m
[31m-[m
[31m-            sp->data = cp;[m
[31m-            sp->len = (size_t) 1;[m
[31m-[m
[31m-            len++;[m
[31m-            cp++;[m
[31m-[m
[31m-            break; [m
[31m-[m
[31m-        default         :[m
[31m-[m
[31m-            ndk_log_alert (pool->log, 0, "catstrf () : format [%s] incorrect", fmt);[m
[31m-[m
[31m-            return  NULL;[m
[31m-[m
[31m-        }[m
[31m-[m
[31m-        sp++;[m
[31m-        fmt++;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-    /* create space for string (assumes no NULL's in strings) */[m
[31m-[m
[31m-    ndk_palloc_rn (p, pool, len + 1);[m
[31m-[m
[31m-    dest->data = p;[m
[31m-    dest->len = len;[m
[31m-[m
[31m-    /* copy other strings */[m
[31m-[m
[31m-    if (len) {[m
[31m-[m
[31m-        while (sp2 < sp) {[m
[31m-[m
[31m-            if (sp2->escaped) {[m
[31m-[m
[31m-                m = sp2->data;[m
[31m-                e = m + sp2->len;[m
[31m-[m
[31m-                while (m < e) {[m
[31m-[m
[31m-                    c = *m;[m
[31m-[m
[31m-                    if (c == '\\') {[m
[31m-[m
[31m-                        if (m == e - 1) {[m
[31m-                            *p = '\\';[m
[31m-                            p++;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        c1 = m[1];[m
[31m-[m
[31m-                        switch (c1) {[m
[31m-[m
[31m-                        case    'n' :[m
[31m-                            *p = '\n';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    't' :[m
[31m-                            *p = '\t';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    '0' :[m
[31m-                            *p = '\0';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    '\\' :[m
[31m-                            *p = '\\';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    's' :[m
[31m-                            *p = ' ';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    'b' :[m
[31m-                            *p = '\b';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    'r' :[m
[31m-                            *p = '\r';[m
[31m-                            break;[m
[31m-[m
[31m-                        default :[m
[31m-[m
[31m-                            *p = c1;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        m += 2;[m
[31m-[m
[31m-                    } else {[m
[31m-[m
[31m-                        *p = c;[m
[31m-                        m++;[m
[31m-                    }[m
[31m-[m
[31m-                    p++;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                p = ngx_cpymem (p, sp2->data, sp2->len);[m
[31m-            }[m
[31m-[m
[31m-            sp2++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return  dest->data;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ndk_catstrf (ngx_pool_t *pool, ngx_str_t *dest, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char       *p;[m
[31m-    va_list         args;[m
[31m-[m
[31m-    va_start (args, fmt);[m
[31m-    p = ndk_vcatstrf (pool, dest, fmt, args);[m
[31m-    va_end (args);[m
[31m-[m
[31m-    return  p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_cmpstr (ngx_str_t *s1, ngx_str_t *s2)[m
[31m-{[m
[31m-    ngx_int_t   rv;[m
[31m-    size_t      len1, len2;[m
[31m-[m
[31m-    len1 = s1->len;[m
[31m-    len2 = s2->len;[m
[31m-[m
[31m-    if (len1 == len2) {[m
[31m-        return  ngx_strncmp (s1->data, s2->data, len1);[m
[31m-    }[m
[31m-[m
[31m-    if (len1 > len2) {[m
[31m-[m
[31m-        rv = ngx_strncmp (s1->data, s2->data, len2);[m
[31m-        if (rv == 0)[m
[31m-            return  1;[m
[31m-[m
[31m-        return  rv;[m
[31m-    }[m
[31m-[m
[31m-    rv = ngx_strncmp (s1->data, s2->data, len1);[m
[31m-    if (rv == 0)[m
[31m-        return  -1;[m
[31m-[m
[31m-    return  rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ndk_dupstr (ngx_pool_t *pool, ngx_str_t *dest, ngx_str_t *src)[m
[31m-{[m
[31m-    u_char       *d;[m
[31m-    size_t       n;[m
[31m-[m
[31m-    n = src->len;[m
[31m-[m
[31m-    ndk_palloc_rn (d, pool, n + 1);[m
[31m-    ndk_strncpy (d, src->data, n);[m
[31m-[m
[31m-    dest->data = d;[m
[31m-    dest->len = n;[m
[31m-[m
[31m-    return  d;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-ngx_keyval_t *[m
[31m-ndk_url_args_to_keyval_list (ngx_pool_t *pool, ngx_str_t *str)[m
[31m-{[m
[31m-    ngx_keyval_t    *kv;[m
[31m-    ngx_st[m
[31m-    [m
[31m-}[m
[31m-*/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string.h[m
[1mdeleted file mode 100644[m
[1mindex ecd21c4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#if 1[m
[31m-/* TODO : set ndk_hex_dump for older versions of Nginx */[m
[31m-#define     ndk_hex_dump                    ngx_hex_dump[m
[31m-#endif[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t          len;[m
[31m-    u_char         *data;[m
[31m-    ngx_flag_t      escaped;[m
[31m-} ndk_estr_t;[m
[31m-[m
[31m-int64_t         ndk_atoi64                  (u_char *line, size_t n);[m
[31m-[m
[31m-ngx_int_t       ndk_strcntc                 (ngx_str_t *s, char c);[m
[31m-ngx_int_t       ndk_strccnt                 (char *s, char c);[m
[31m-ngx_array_t *   ndk_str_array_create        (ngx_pool_t *pool, char **s, ngx_int_t n);[m
[31m-u_char *        ndk_catstrf                 (ngx_pool_t *pool, ngx_str_t *dest, const char *fmt, ...);[m
[31m-ngx_int_t       ndk_cmpstr                  (ngx_str_t *s1, ngx_str_t *s2);[m
[31m-u_char *        ndk_dupstr                  (ngx_pool_t *pool, ngx_str_t *dest, ngx_str_t *src);[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ndk_strtoupper (u_char *p, size_t len)[m
[31m-{[m
[31m-    u_char *e = p + len;[m
[31m-    for ( ; p<e; p++) {[m
[31m-        *p = ngx_toupper(*p);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline u_char *[m
[31m-ndk_strncpy (u_char *d, u_char *s, size_t n)[m
[31m-{[m
[31m-    return  (u_char *) strncpy ((char *) d, (char *) s, n);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string_util.h[m
[1mdeleted file mode 100644[m
[1mindex d23b8e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_string_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#define     ndk_str_init(ns,s)              {(ns).data = (u_char*) s; (ns).len = sizeof (s) - 1;}[m
[31m-#define     ndk_strp_init(ns,s)             {(ns)->data = (u_char*) s; (ns)->len = sizeof (s) - 1;}[m
[31m-[m
[31m-#define     ndk_zero(p,sz)                  memset (p,'\0',sz)[m
[31m-#define     ndk_zerop(p)                    ndk_zero (p,sizeof(*p))[m
[31m-#define     ndk_zeropn(p,n)                 ndk_zero (p,sizeof(*p)*(n))[m
[31m-#define     ndk_zerov(v)                    ndk_zero (&v,sizeof(v))[m
[31m-[m
[31m-#define     ngx_null_enum   { ngx_null_string, 0 }[m
[31m-[m
[31m-#define     ndk_memcpyp(d,s)                ngx_memcpy(d,s,sizeof(s))[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_upstream_list.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_upstream_list.c[m
[1mdeleted file mode 100644[m
[1mindex 7381777..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_upstream_list.c[m
[1m+++ /dev/null[m
[36m@@ -1,205 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : generalize this into a generic list module, with weight */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t      weight;[m
[31m-    ngx_str_t       s;[m
[31m-    ngx_conf_t     *cf;[m
[31m-} ndk_upstream_list_parse_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ndk_upstream_list_parse_weight (ndk_upstream_list_parse_t *ulp)[m
[31m-{[m
[31m-    size_t      i;[m
[31m-    ngx_str_t   *s;[m
[31m-[m
[31m-    s = &ulp->s;[m
[31m-[m
[31m-    for (i=0; i<s->len; i++) {[m
[31m-[m
[31m-        if (s->data[i] < '0' || s->data[i] > '9')[m
[31m-            break;[m
[31m-    }[m
[31m-[m
[31m-    if (!i) {[m
[31m-        ulp->weight = 1;[m
[31m-        return  NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (i == s->len) {[m
[31m-        ngx_conf_log_error (NGX_LOG_EMERG, ulp->cf, 0,[m
[31m-            "upstream list just consists of number \"%V\"", s);[m
[31m-[m
[31m-        return  NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (s->data[i] != ':') {[m
[31m-        ngx_conf_log_error (NGX_LOG_EMERG, ulp->cf, 0,[m
[31m-            "upstream list not correct format \"%V\"", s);[m
[31m-[m
[31m-        return  NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ulp->weight = ngx_atoi (s->data, i);[m
[31m-[m
[31m-    s->data += (i + 1);[m
[31m-    s->len -= (i + 1);[m
[31m-[m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ndk_upstream_list (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    /* TODO : change this for getting upstream pointer if available */[m
[31m-[m
[31m-    ngx_uint_t                   buckets, count, i, j;[m
[31m-    ngx_str_t                   *value, **bucket, *us;[m
[31m-    ngx_array_t                 *ula;[m
[31m-    ndk_upstream_list_t         *ul, *ule;[m
[31m-    ndk_upstream_list_parse_t    ulp;[m
[31m-[m
[31m-    ndk_http_main_conf_t        *mcf;[m
[31m-[m
[31m-    mcf = ngx_http_conf_get_module_main_conf (cf, ndk_http_module);[m
[31m-[m
[31m-    ula = mcf->upstreams;[m
[31m-[m
[31m-    /* create array of upstream lists it doesn't already exist */[m
[31m-[m
[31m-    if (ula == NULL) {[m
[31m-[m
[31m-        ula = ngx_array_create (cf->pool, 4, sizeof (ndk_upstream_list_t));[m
[31m-        if (ula == NULL)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        mcf->upstreams = ula;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* check to see if the list already exists */[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    ul = ula->elts;[m
[31m-    ule = ul + ula->nelts;[m
[31m-[m
[31m-    for ( ; ul<ule; ul++) {[m
[31m-[m
[31m-        if (ul->name.len == value->len &&[m
[31m-            ngx_strncasecmp (ul->name.data, value->data, value->len) == 0) {[m
[31m-[m
[31m-            ngx_conf_log_error (NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate upstream list name \"%V\"", value);[m
[31m-[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* create a new list */[m
[31m-[m
[31m-    ul = ngx_array_push (ula);[m
[31m-    if (ul == NULL)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    ul->name = *value;[m
[31m-[m
[31m-[m
[31m-[m
[31m-    /* copy all the upstream names */[m
[31m-[m
[31m-    count = cf->args->nelts - 2;[m
[31m-[m
[31m-    us = ngx_palloc (cf->pool, count * sizeof (ngx_str_t));[m
[31m-    if (us == NULL)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    ngx_memcpy (us, value + 1, count * sizeof (ngx_str_t));[m
[31m-[m
[31m-[m
[31m-    /* calculate the total number of buckets */[m
[31m-[m
[31m-    buckets = 0;[m
[31m-[m
[31m-    ulp.cf = cf;[m
[31m-[m
[31m-    for (i=0; i<count; i++, us++) {[m
[31m-[m
[31m-        ulp.s = *us;[m
[31m-[m
[31m-        if (ndk_upstream_list_parse_weight (&ulp) != NGX_OK)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        buckets += ulp.weight;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* allocate space for all buckets */[m
[31m-[m
[31m-    bucket = ngx_palloc (cf->pool, buckets * sizeof (ngx_str_t **));[m
[31m-    if (bucket == NULL)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    ul->elts = bucket;[m
[31m-    ul->nelts = buckets;[m
[31m-[m
[31m-[m
[31m-    /* set values for each bucket */[m
[31m-[m
[31m-    us -= count;[m
[31m-[m
[31m-    for (i=0; i<count; i++, us++) {[m
[31m-[m
[31m-        ulp.s = *us;[m
[31m-[m
[31m-        if (ndk_upstream_list_parse_weight (&ulp) != NGX_OK)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        us->data = ulp.s.data;[m
[31m-        us->len = ulp.s.len;[m
[31m-[m
[31m-        /* TODO : check format of upstream */[m
[31m-        /* TODO : add automatic adding of http:// in upstreams? */[m
[31m-[m
[31m-        for (j=0; j<ulp.weight; j++, bucket++) {[m
[31m-[m
[31m-            *bucket = us;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ndk_upstream_list_t *[m
[31m-ndk_get_upstream_list (ndk_http_main_conf_t *mcf, u_char *data, size_t len)[m
[31m-{[m
[31m-    ndk_upstream_list_t         *ul, *ule;[m
[31m-    ngx_array_t                 *ua = mcf->upstreams;[m
[31m-[m
[31m-    if (ua == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ul = ua->elts;[m
[31m-    ule = ul + ua->nelts;[m
[31m-[m
[31m-    for (; ul < ule; ul++) {[m
[31m-        if (ul->name.len == len && ngx_strncasecmp(ul->name.data, data, len) == 0)[m
[31m-        {[m
[31m-            return ul;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_upstream_list.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_upstream_list.h[m
[1mdeleted file mode 100644[m
[1mindex 3786456..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_upstream_list.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-#if (NDK_UPSTREAM_LIST_CMDS)[m
[31m-[m
[31m-/* TODO : use the generated commands */[m
[31m-[m
[31m-{[m
[31m-    ngx_string ("upstream_list"),[m
[31m-    NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_2MORE,[m
[31m-    ndk_upstream_list,[m
[31m-    0,[m
[31m-    0,[m
[31m-    NULL[m
[31m-},[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t       **elts;[m
[31m-    ngx_uint_t        nelts;[m
[31m-    ngx_str_t         name;[m
[31m-} ndk_upstream_list_t;[m
[31m-[m
[31m-[m
[31m-ndk_upstream_list_t *[m
[31m-ndk_get_upstream_list (ndk_http_main_conf_t *mcf, u_char *data, size_t len);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_uri.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_uri.c[m
[1mdeleted file mode 100644[m
[1mindex 19e90e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_uri.c[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : check that this is correct */[m
[31m-[m
[31m-u_char *[m
[31m-ndk_map_uri_to_path_add_suffix (ngx_http_request_t *r, ngx_str_t *path, ngx_str_t *suffix, ngx_int_t dot)[m
[31m-{[m
[31m-    size_t      root_size;[m
[31m-    u_char     *p;[m
[31m-[m
[31m-    if (suffix->len) {[m
[31m-[m
[31m-        if (dot) {[m
[31m-[m
[31m-            p = ngx_http_map_uri_to_path (r, path, &root_size, suffix->len + 1);[m
[31m-[m
[31m-            if (p == NULL)[m
[31m-                return  NULL;[m
[31m-[m
[31m-            *p = '.';[m
[31m-            p++;[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            p = ngx_http_map_uri_to_path (r, path, &root_size, suffix->len);[m
[31m-[m
[31m-            if (p == NULL)[m
[31m-                return  NULL;[m
[31m-        }       [m
[31m-[m
[31m-        path->len--;[m
[31m-[m
[31m-        p = ngx_cpymem (p, suffix->data, suffix->len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        return  p;  [m
[31m-    }[m
[31m-[m
[31m-    p = ngx_http_map_uri_to_path (r, path, &root_size, 0);[m
[31m-[m
[31m-    path->len--;[m
[31m-[m
[31m-    return  p;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_uri.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_uri.h[m
[1mdeleted file mode 100644[m
[1mindex dac3880..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_devel_kit-0.3.0/src/ndk_uri.h[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-u_char *  ndk_map_uri_to_path_add_suffix  (ngx_http_request_t *r, ngx_str_t *path, ngx_str_t *suffix, ngx_int_t dot);[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex e5cbc8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,169 +0,0 @@[m
[31m-build/[m
[31m-work/[m
[31m-tags[m
[31m-cscope.*[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/util.h[m
[31m-src/util.c[m
[31m-src/processor.h[m
[31m-src/processor.c[m
[31m-src/rds.h[m
[31m-src/utils.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-util/bench[m
[31m-*.html[m
[31m-trace.out*[m
[31m-try.sh[m
[31m-src/cache.c[m
[31m-src/cache.h[m
[31m-src/common.h[m
[31m-src/directive.c[m
[31m-src/directive.h[m
[31m-src/consts.[ch][m
[31m-src/contentby.[ch][m
[31m-src/pcrefix.[ch][m
[31m-src/util.c[m
[31m-src/clfactory.c[m
[31m-src/directive.c[m
[31m-src/conf.h[m
[31m-src/setby.h[m
[31m-src/cache.h[m
[31m-src/hook.c[m
[31m-src/util.h[m
[31m-src/hook.h[m
[31m-src/common.h[m
[31m-src/directive.h[m
[31m-src/conf.c[m
[31m-src/setby.c[m
[31m-src/cache.c[m
[31m-src/module.c[m
[31m-src/clfactory.h[m
[31m-src/capturefilter.[ch][m
[31m-src/contentby.c[m
[31m-pack[m
[31m-b.sh[m
[31m-src/in.[ch][m
[31m-src/out.[ch][m
[31m-go[m
[31m-all.sh[m
[31m-src/accessby.[ch][m
[31m-src/rewriteby.[ch][m
[31m-src/patch.[ch][m
[31m-src/ndk.[ch][m
[31m-src/control.[ch][m
[31m-src/output.[ch][m
[31m-src/variable.[ch][m
[31m-src/string.[ch][m
[31m-src/misc.[ch][m
[31m-src/log.[ch][m
[31m-src/exception.[ch][m
[31m-src/subrequest.[ch][m
[31m-src/time.[ch][m
[31m-src/regex.[ch][m
[31m-src/ctx.[ch][m
[31m-src/args.[ch][m
[31m-src/headers.[ch][m
[31m-src/script.[ch][m
[31m-src/filter.[ch][m
[31m-src/shdict.[ch][m
[31m-src/body.[ch][m
[31m-src/uri.[ch][m
[31m-src/api.[ch][m
[31m-src/coroutine.[ch][m
[31m-src/logby.[ch][m
[31m-src/sleep.[ch][m
[31m-a.patch[m
[31m-all[m
[31m-build1[0-9][m
[31m-g[m
[31m-buildroot/[m
[31m-src/headerfilterby.[ch][m
[31m-*.patch[m
[31m-analyze[m
[31m-tsock[m
[31m-a.c[m
[31m-test.lua[m
[31m-build12[m
[31m-ERRORS[m
[31m-src/bodyfilterby.[ch][m
[31m-src/tcp.[ch][m
[31m-src/initby.[ch][m
[31m-src/initworkerby.[ch][m
[31m-src/socket.[ch][m
[31m-src/udp.[ch][m
[31m-src/method.[ch][m
[31m-tre[m
[31m-src/phase.[ch][m
[31m-src/probe.h[m
[31m-src/uthread.[ch][m
[31m-src/timer.[ch][m
[31m-src/config.[ch][m
[31m-src/worker.[ch][m
[31m-src/certby.[ch][m
[31m-src/ocsp.c[m
[31m-src/lex.[ch][m
[31m-src/balancer.[ch][m
[31m-src/semaphore.[ch][m
[31m-*.plist[m
[31m-lua[m
[31m-ttimer[m
[31m-Makefile[m
[31m-tsubreq[m
[31m-tthread[m
[31m-addr2line[m
[31m-hup[m
[31m-theaders[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 10bb9ca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-addons:[m
[31m-  apt:[m
[31m-    packages:[m
[31m-    - mysql-server[m
[31m-[m
[31m-cache:[m
[31m-  directories:[m
[31m-  - download-cache[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - JOBS=3[m
[31m-    - NGX_BUILD_JOBS=$JOBS[m
[31m-    - LUAJIT_PREFIX=/opt/luajit21[m
[31m-    - LUAJIT_LIB=$LUAJIT_PREFIX/lib[m
[31m-    - LUAJIT_INC=$LUAJIT_PREFIX/include/luajit-2.1[m
[31m-    - LUA_INCLUDE_DIR=$LUAJIT_INC[m
[31m-    - LUA_CMODULE_DIR=/lib[m
[31m-    - PCRE_VER=8.33[m
[31m-    - PCRE_PREFIX=/opt/pcre[m
[31m-    - PCRE_LIB=$PCRE_PREFIX/lib[m
[31m-    - PCRE_INC=$PCRE_PREFIX/include[m
[31m-    - OPENSSL_PREFIX=/opt/ssl[m
[31m-    - OPENSSL_LIB=$OPENSSL_PREFIX/lib[m
[31m-    - OPENSSL_INC=$OPENSSL_PREFIX/include[m
[31m-    - OPENSSL_VER=1.0.2h[m
[31m-    - LIBDRIZZLE_PREFIX=/opt/drizzle[m
[31m-    - LIBDRIZZLE_INC=$LIBDRIZZLE_PREFIX/include/libdrizzle-1.0[m
[31m-    - LIBDRIZZLE_LIB=$LIBDRIZZLE_PREFIX/lib[m
[31m-    - LD_LIBRARY_PATH=$LUAJIT_LIB:$LD_LIBRARY_PATH[m
[31m-    - DRIZZLE_VER=2011.07.21[m
[31m-    - TEST_NGINX_SLEEP=0.006[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-#    - NGINX_VERSION=1.10.0[m
[31m-[m
[31m-services:[m
[31m- - memcache[m
[31m- - redis-server[m
[31m-[m
[31m-before_install:[m
[31m-  - sudo apt-get install -y axel cpanminus libtest-base-perl libtext-diff-perl liburi-perl libwww-perl libtest-longstring-perl liblist-moreutils-perl libgd-dev[m
[31m-[m
[31m-install:[m
[31m-  - if [ ! -d download-cache ]; then mkdir download-cache; fi[m
[31m-  - if [ ! -f download-cache/drizzle7-$DRIZZLE_VER.tar.gz ]; then wget -O download-cache/drizzle7-$DRIZZLE_VER.tar.gz http://openresty.org/download/drizzle7-$DRIZZLE_VER.tar.gz; fi[m
[31m-  - if [ ! -f download-cache/pcre-$PCRE_VER.tar.gz ]; then wget -O download-cache/pcre-$PCRE_VER.tar.gz http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-$PCRE_VER.tar.gz; fi[m
[31m-  - if [ ! -f download-cache/openssl-$OPENSSL_VER.tar.gz ]; then wget -O download-cache/openssl-$OPENSSL_VER.tar.gz https://www.openssl.org/source/openssl-$OPENSSL_VER.tar.gz; fi[m
[31m-  - git clone https://github.com/openresty/test-nginx.git[m
[31m-  - git clone https://github.com/openresty/openresty.git ../openresty[m
[31m-  - git clone https://github.com/openresty/no-pool-nginx.git ../no-pool-nginx[m
[31m-  - git clone https://github.com/openresty/nginx-devel-utils.git[m
[31m-  - git clone https://github.com/openresty/mockeagain.git[m
[31m-  - git clone https://github.com/openresty/lua-cjson.git[m
[31m-  - git clone https://github.com/openresty/lua-upstream-nginx-module.git ../lua-upstream-nginx-module[m
[31m-  - git clone https://github.com/openresty/echo-nginx-module.git ../echo-nginx-module[m
[31m-  - git clone https://github.com/openresty/nginx-eval-module.git ../nginx-eval-module[m
[31m-  - git clone https://github.com/simpl/ngx_devel_kit.git ../ndk-nginx-module[m
[31m-  - git clone https://github.com/FRiCKLE/ngx_coolkit.git ../coolkit-nginx-module[m
[31m-  - git clone https://github.com/openresty/headers-more-nginx-module.git ../headers-more-nginx-module[m
[31m-  - git clone https://github.com/openresty/drizzle-nginx-module.git ../drizzle-nginx-module[m
[31m-  - git clone https://github.com/openresty/set-misc-nginx-module.git ../set-misc-nginx-module[m
[31m-  - git clone https://github.com/openresty/memc-nginx-module.git ../memc-nginx-module[m
[31m-  - git clone https://github.com/openresty/rds-json-nginx-module.git ../rds-json-nginx-module[m
[31m-  - git clone https://github.com/openresty/srcache-nginx-module.git ../srcache-nginx-module[m
[31m-  - git clone https://github.com/openresty/redis2-nginx-module.git ../redis2-nginx-module[m
[31m-  - git clone -b v2.1-agentzh https://github.com/openresty/luajit2.git[m
[31m-[m
[31m-before_script:[m
[31m-  - mysql -uroot -e 'create database ngx_test; grant all on ngx_test.* to "ngx_test"@"%" identified by "ngx_test"; flush privileges;'[m
[31m-[m
[31m-script:[m
[31m-  - cd luajit2/[m
[31m-  - make -j$JOBS CCDEBUG=-g Q= PREFIX=$LUAJIT_PREFIX CC=$CC XCFLAGS='-DLUA_USE_APICHECK -DLUA_USE_ASSERT' > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make install PREFIX=$LUAJIT_PREFIX > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - tar xzf download-cache/drizzle7-$DRIZZLE_VER.tar.gz && cd drizzle7-$DRIZZLE_VER[m
[31m-  - ./configure --prefix=$LIBDRIZZLE_PREFIX --without-server > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make libdrizzle-1.0 -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make install-libdrizzle-1.0 > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - cd mockeagain/ && make CC=$CC -j$JOBS && cd ..[m
[31m-  - cd test-nginx/ && sudo cpanm . && cd ..[m
[31m-  - cd lua-cjson/ && make -j$JOBS && sudo make install && cd ..[m
[31m-  - tar zxf download-cache/pcre-$PCRE_VER.tar.gz[m
[31m-  - cd pcre-$PCRE_VER/[m
[31m-  - ./configure --prefix=$PCRE_PREFIX --enable-jit --enable-utf --enable-unicode-properties > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo PATH=$PATH make install > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - tar zxf download-cache/openssl-$OPENSSL_VER.tar.gz[m
[31m-  - cd openssl-$OPENSSL_VER/[m
[31m-  - ./config shared --prefix=$OPENSSL_PREFIX -DPURIFY > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make PATH=$PATH install_sw > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - export PATH=$PWD/work/nginx/sbin:$PWD/nginx-devel-utils:$PATH[m
[31m-  - export NGX_BUILD_CC=$CC[m
[31m-  - sh util/build.sh $NGINX_VERSION > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - nginx -V[m
[31m-  - ldd `which nginx`|grep -E 'luajit|ssl|pcre'[m
[31m-  - export LD_PRELOAD=$PWD/mockeagain/mockeagain.so[m
[31m-  - export LD_LIBRARY_PATH=$PWD/mockeagain:$LD_LIBRARY_PATH[m
[31m-  - export TEST_NGINX_RESOLVER=8.8.4.4[m
[31m-  - dig +short @$TEST_NGINX_RESOLVER openresty.org || exit 0[m
[31m-  - dig +short @$TEST_NGINX_RESOLVER agentzh.org || exit 0[m
[31m-  - prove -r t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/Changes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/Changes[m
[1mdeleted file mode 100644[m
[1mindex 703f73d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/Changes[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-0.2.0 - 5 July 2011[m
[31m-* now we support ngx.var[1], ngx.var[2], and etc to refer to the nginx regex capturing variables \$1, \$2, and etc in Lua. this resolved github issue #43. thanks Tobia Conforto for reporting it.[m
[31m-[m
[31m-* now we use the same value overriding mechanism as ngx_rewrite's set command for ngx.var.VAR = new_value. Assigning values to special variables like $limit_rate and $args should now work; also writing to built-in variables that are not changeable (like $arg_PARAMETER) will result in a 500 error page, as expected, now. thanks Richard Kearsley for reporting it.[m
[31m-[m
[31m-* fixed the lua_code_cache off warning when the lua_code_cache is explicitly on. thanks Feng Xingguo.[m
[31m-[m
[31m-* applied the patch from cyberty to add ngx.http_time() function to expose the nginx core function ngx_http_time to the Lua land.[m
[31m-[m
[31m-* fixed an issue on i386: we now use off_t consistently. mixing it with size_t on 32-bit systems can cause Bad Things. this fixed github issue #42. thanks moodydeath.[m
[31m-[m
[31m-* fixed an issue on i386: fixed a formatter mismatch issue in ngx_http_echo_adjust_subrequest. thanks Wang Bin. This caused incorrect subrequest Content-Length header when a body is specified.[m
[31m-[m
[31m-* now in the subrequest capturing processor, we worked around an issue in ngx_http_static_module that when it issues 301 redirect for directory access w/o a trailing slash, it does not inject r->headers_out.location into the r->headers_out.headers list. thanks moodydeath for reporting it in the discussion of github issue #41.[m
[31m-[m
[31m-* fixed a bug in ngx.location.capture() and ngx.location.capture_multi() that we could not capture locations with internal redirections in them. thanks moodydeath for reporting it in github issue #41.[m
[31m-[m
[31m-* fixed redundant last chunk issue for ngx.exec() invocation at rewrite and access phases: we should quit the current core_run_phases cycle; this also fixed github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location.[m
[31m-[m
[31m-* fixed ngx.exit(status) where status >= 200 and status < 300 for access_by_lua* and rewrite_by_lua*: it should quit the whole request altegother and skip all those subsequent phase handlers (if any). thanks moodydeath for reporting it.[m
[31m-[m
[31m-* fixed github issue #39: setting differnt response headers in Lua with common prefix might interfere with each other. thanks moodydeath.[m
[31m-[m
[31m-* fixed GitHub issue #38: request headers did not forward to subrequests when the "method" or "body" option is explicitly specified by a non-nil value for ngx.location.capture(). thanks Richard Kearsley.[m
[31m-[m
[31m-* fixed a bug in output header set; we should always set the header->hash to 1. thanks moodydeath for reporting it.[m
[31m-[m
[31m-* fixed spots that trigger the "variable set but not used" warning issued by gcc 4.6.0.[m
[31m-[m
[31m-* now we turn the ngx.req.header table into an ngx.req.get_headers() function; we also added ngx.req.set_header(name, value) and ngx.req.clear_header(name). thanks moodydeath.[m
[31m-[m
[31m-* now we make ngx_devel_kit (NDK) optional. thanks Kirill A. Korinskiy.[m
[31m-[m
[31m-* removed a duplicate definition of the ngx_str_set macro caught by ctags; also fixed a warning thrown by gcc -O3 on Mac OS X 10.6.[m
[31m-[m
[31m-* added patch to use PCRE related Lua extensions in ngx_lua (chaoslawful)[m
[31m-[m
[31m-* now we change the way we process HTTP 1.0 requests by automatically buffering all the user outputs generated by ngx.print()/ngx.say() calls, which is much more natural than the old broken way.[m
[31m-[m
[31m-* fixed the "ngx.exec() after ngx.location.capture() hanging" bug for rewrite_by_lua* and access_by_lua* as well. thanks Wendal Chen.[m
[31m-[m
[31m-* applied a patch from moodydeath to introduce the "ngx.is_subrequest" attribute.[m
[31m-[m
[31m-* now we encourage use of the client_body_in_single_buffer directive instead of big client_body_buffer_size when lua_need_request_body is turned on.[m
[31m-[m
[31m-* fixed the config script and added extra linking options needed by LuaJIT in 64-bit Mac OS X.[m
[31m-[m
[31m-* fixed the zero size alert caused by ngx.print("") in Lua.[m
[31m-[m
[31m-* now we always allocate r->request_body for subrequests when the method option is specified for ngx.location.capture*. this prevents accidental inheritance of parent request's request body when client_body_buffer_size < client_max_body_size.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/config[m
[1mdeleted file mode 100644[m
[1mindex 6f6733f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/config[m
[1m+++ /dev/null[m
[36m@@ -1,537 +0,0 @@[m
[31m-ngx_feature="Lua library"[m
[31m-ngx_feature_libs="-llua -lm"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <lauxlib.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_test="#if LUA_VERSION_NUM != 501[m
[31m-#   error unsupported Lua language version[m
[31m-#endif[m
[31m-(void) luaL_newstate();"[m
[31m-ngx_lua_opt_I=[m
[31m-ngx_lua_opt_L=[m
[31m-[m
[31m-if [ -n "$LUAJIT_INC" -o -n "$LUAJIT_LIB" ]; then[m
[31m-    # explicitly set LuaJIT paths[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-        ngx_feature="LuaJIT library in $LUAJIT_LIB and $LUAJIT_INC (win32)"[m
[31m-        ngx_feature_path="$LUAJIT_INC"[m
[31m-        ngx_lua_opt_I="-I$LUAJIT_INC"[m
[31m-        ngx_lua_opt_L="-L$LUAJIT_LIB"[m
[31m-[m
[31m-        # ensure that our -I$LUAJIT_INC and -L$LUAJIT_LIB is at the first.[m
[31m-        SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-        CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-        SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-        NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        # LuaJIT's win32 build uses the library file name lua51.dll.[m
[31m-        ngx_feature_libs="$ngx_lua_opt_L -llua51"[m
[31m-[m
[31m-        . auto/feature[m
[31m-[m
[31m-        # clean up[m
[31m-        CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-        NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-    else[m
[31m-[m
[31m-        # attempt to link with -ldl, static linking on Linux requires it.[m
[31m-        ngx_feature="LuaJIT library in $LUAJIT_LIB and $LUAJIT_INC (specified by the LUAJIT_LIB and LUAJIT_INC env, with -ldl)"[m
[31m-        ngx_feature_path="$LUAJIT_INC"[m
[31m-        ngx_lua_opt_I="-I$LUAJIT_INC"[m
[31m-        ngx_lua_opt_L="-L$LUAJIT_LIB"[m
[31m-[m
[31m-        # ensure that our -I$LUAJIT_INC and -L$LUAJIT_LIB is at the first.[m
[31m-        SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-        CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-        SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-        NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R$LUAJIT_LIB $ngx_lua_opt_L -lluajit-5.1 -lm -ldl"[m
[31m-        else[m
[31m-            ngx_feature_libs="$ngx_lua_opt_L -lluajit-5.1 -lm -ldl"[m
[31m-        fi[m
[31m-[m
[31m-        . auto/feature[m
[31m-[m
[31m-        # clean up[m
[31m-        CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-        NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # retry without -ldl[m
[31m-            ngx_feature="LuaJIT library in $LUAJIT_LIB and $LUAJIT_INC (specified by the LUAJIT_LIB and LUAJIT_INC env)"[m
[31m-            ngx_feature_path="$LUAJIT_INC"[m
[31m-            ngx_lua_opt_I="-I$LUAJIT_INC"[m
[31m-            ngx_lua_opt_L="-L$LUAJIT_LIB"[m
[31m-[m
[31m-            # ensure that our -I$LUAJIT_INC and -L$LUAJIT_LIB is at the first.[m
[31m-            SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-            CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-            SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-            NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R$LUAJIT_LIB $ngx_lua_opt_L -lluajit-5.1 -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="$ngx_lua_opt_L -lluajit-5.1 -lm"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-[m
[31m-            # clean up[m
[31m-            CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-            NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        cat << END[m
[31m-        $0: error: ngx_http_lua_module requires the Lua or LuaJIT library and LUAJIT_LIB is defined as $LUAJIT_LIB and LUAJIT_INC (path for lua.h) $LUAJIT_INC, but we cannot find LuaJIT there.[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-    case "$NGX_PLATFORM" in[m
[31m-        Darwin:*)[m
[31m-            case "$NGX_MACHINE" in[m
[31m-                amd64 | x86_64 | i386)[m
[31m-                    echo "adding extra linking options needed by LuaJIT"[m
[31m-                    ngx_feature_libs="$ngx_feature_libs -pagezero_size 10000 -image_base 100000000"[m
[31m-                ;;[m
[31m-[m
[31m-                *)[m
[31m-                ;;[m
[31m-            esac[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-        ;;[m
[31m-    esac[m
[31m-else[m
[31m-    if [ -n "$LUA_INC" -o -n "$LUA_LIB" ]; then[m
[31m-        # explicitly set Lua paths[m
[31m-        ngx_feature="Lua library in $LUA_LIB and $LUA_INC (specified by the LUA_LIB and LUA_INC env)"[m
[31m-        ngx_feature_path="$LUA_INC"[m
[31m-        ngx_lua_opt_I="-I$LUA_INC"[m
[31m-        ngx_lua_opt_L="-L$LUA_LIB"[m
[31m-[m
[31m-        # ensure that our -I$LUA_INC and -L$LUA_LIB is at the first.[m
[31m-        SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-        CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-        SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-        NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R$LUA_LIB $ngx_lua_opt_L -llua -lm -ldl"[m
[31m-        else[m
[31m-            ngx_feature_libs="$ngx_lua_opt_L -llua -lm -ldl"[m
[31m-        fi[m
[31m-[m
[31m-        . auto/feature[m
[31m-[m
[31m-        # clean up[m
[31m-        CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-        NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # retry without -ldl[m
[31m-[m
[31m-            ngx_feature_path="$LUA_INC"[m
[31m-            ngx_lua_opt_I="-I$LUA_INC"[m
[31m-            ngx_lua_opt_L="-L$LUA_LIB"[m
[31m-[m
[31m-            # ensure that our -I$LUA_INC and -L$LUA_LIB is at the first.[m
[31m-            SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-            CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-            SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-            NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R$LUA_LIB $ngx_lua_opt_L -llua -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="$ngx_lua_opt_L -llua -lm"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-[m
[31m-            # clean up[m
[31m-            CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-            NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            cat << END[m
[31m-            $0: error: ngx_http_lua_module requires the Lua or LuaJIT library and LUA_LIB is defined as $LUA_LIB and LUA_INC (path for lua.h) is $LUA_INC, but we cannot find standard Lua there.[m
[31m-END[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    else[m
[31m-        # auto-discovery[m
[31m-        ngx_feature="Lua library"[m
[31m-        ngx_feature_libs="-llua -lm"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # OpenBSD-5.2[m
[31m-            ngx_feature="Lua library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include/lua-5.1"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -llua -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -llua5.1 -lm"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # OpenBSD < 5.2[m
[31m-            ngx_feature="Lua library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -llua -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -llua -lm"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # NetBSD[m
[31m-            ngx_feature="Lua library in /usr/pkg/"[m
[31m-            ngx_feature_path="/usr/pkg/include/"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lm -llua"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/pkg/lib -lm -llua"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # MacPorts[m
[31m-            ngx_feature="Lua library in /opt/local/"[m
[31m-            ngx_feature_path="/opt/local/include"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lm -llua"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/opt/local/lib -lm -llua"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # FreeBSD[m
[31m-            ngx_feature="Lua library in /usr/local/*/lua51/"[m
[31m-            ngx_feature_path="/usr/local/include/lua51"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib/lua51 -L/usr/local/lib/lua51 -llua -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib/lua51 -llua -lm"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # Debian[m
[31m-            ngx_feature="Lua library in /usr/"[m
[31m-            ngx_feature_path="/usr/include/lua5.1"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/lib -L/usr/lib -lm -llua5.1"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/lib -lm -llua5.1"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # FreeBSD with luajit-2.0 from ports collection[m
[31m-            ngx_feature="LuaJIT library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include/luajit-2.0"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lluajit-5.1 -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -lluajit-5.1 -lm"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # Gentoo with LuaJIT-2.0, try with -ldl[m
[31m-            ngx_feature="LuaJIT library in /usr/"[m
[31m-            ngx_feature_path="/usr/include/luajit-2.0"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/lib -L/usr/lib -lm -lluajit-5.1 -ldl"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/lib -lm -lluajit-5.1 -ldl"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # Gentoo with LuaJIT 2.0[m
[31m-            ngx_feature="LuaJIT library in /usr/"[m
[31m-            ngx_feature_path="/usr/include/luajit-2.0"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/lib -L/usr/lib -lm -lluajit-5.1"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/lib -lm -lluajit-5.1"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-ngx_module_incs=[m
[31m-ngx_module_libs=[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    # this is a hack to persuade nginx's build system to favor[m
[31m-    # the paths set by our user environments:[m
[31m-    CFLAGS="$ngx_lua_opt_I $CFLAGS"[m
[31m-    NGX_LD_OPT="$ngx_lua_opt_L $NGX_LD_OPT"[m
[31m-[m
[31m-    ngx_module_incs="$ngx_module_incs $ngx_feature_path"[m
[31m-    ngx_module_libs="$ngx_module_libs $ngx_feature_libs"[m
[31m-else[m
[31m- cat << END[m
[31m- $0: error: ngx_http_lua_module requires the Lua library.[m
[31m-END[m
[31m- exit 1[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_lua_module[m
[31m-HTTP_LUA_SRCS=" \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_script.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_log.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_subrequest.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ndk.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_control.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_time.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_misc.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_variable.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_string.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_output.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_req_body.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_uri.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_args.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ctx.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_regex.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_module.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers_out.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers_in.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_directive.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_consts.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_exception.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_util.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_cache.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_contentby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_rewriteby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_accessby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_setby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_capturefilter.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_clfactory.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_pcrefix.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headerfilterby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_shdict.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_socket_tcp.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_api.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_logby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_sleep.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_semaphore.c\[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_coroutine.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_bodyfilterby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_initby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_initworkerby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_socket_udp.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_req_method.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_phase.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_uthread.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_timer.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_config.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_worker.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ssl_certby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ssl_ocsp.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_lex.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_balancer.c \[m
[31m-            "[m
[31m-[m
[31m-HTTP_LUA_DEPS=" \[m
[31m-            $ngx_addon_dir/src/ddebug.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_script.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_log.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_subrequest.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ndk.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_control.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_time.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_string.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_misc.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_variable.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_output.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_uri.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_req_body.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_args.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ctx.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_regex.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_common.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_directive.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers_out.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers_in.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_consts.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_exception.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_util.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_cache.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_contentby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_rewriteby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_accessby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_setby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_capturefilter.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_clfactory.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_pcrefix.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headerfilterby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_shdict.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_socket_tcp.h \[m
[31m-            $ngx_addon_dir/src/api/ngx_http_lua_api.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_logby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_sleep.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_semaphore.h\[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_coroutine.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_bodyfilterby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_initby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_initworkerby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_socket_udp.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_req_method.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_phase.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_probe.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_uthread.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_timer.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_config.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_worker.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ssl_certby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_lex.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_balancer.h \[m
[31m-            "[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[31m-[m
[31m-ngx_feature="export symbols by default (-E)"[m
[31m-ngx_feature_libs="-Wl,-E"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_test='printf("hello");'[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_LIBS="-Wl,-E $CORE_LIBS"[m
[31m-fi[m
[31m-[m
[31m-# for Cygwin[m
[31m-ngx_feature="export symbols by default (--export-all-symbols)"[m
[31m-ngx_feature_libs="-Wl,--export-all-symbols"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_test='printf("hello");'[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_LIBS="-Wl,--export-all-symbols $CORE_LIBS"[m
[31m-fi[m
[31m-[m
[31m-NGX_DTRACE_PROVIDERS="$NGX_DTRACE_PROVIDERS $ngx_addon_dir/dtrace/ngx_lua_provider.d"[m
[31m-NGX_TAPSET_SRCS="$NGX_TAPSET_SRCS $ngx_addon_dir/tapset/ngx_lua.stp"[m
[31m-[m
[31m-USE_MD5=YES[m
[31m-USE_SHA1=YES[m
[31m-[m
[31m-CORE_INCS="$CORE_INCS $ngx_addon_dir/src/api"[m
[31m-[m
[31m-ngx_feature="SO_PASSCRED"[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_name="NGX_HTTP_LUA_HAVE_SO_PASSCRED"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_test='setsockopt(1, SOL_SOCKET, SO_PASSCRED, NULL, 0);'[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-ngx_feature="mmap(sbrk(0))"[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_name="NGX_HTTP_LUA_HAVE_MMAP_SBRK"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <unistd.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdint.h>[m
[31m-#include <sys/mman.h>[m
[31m-#define align_ptr(p, a)                                                   \[m
[31m-    (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))[m
[31m-"[m
[31m-ngx_feature_test="[m
[31m-#if defined(__x86_64__)[m
[31m-exit(mmap(align_ptr(sbrk(0), getpagesize()), 1, PROT_READ,[m
[31m-          MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0) < (void *) 0x40000000LL[m
[31m-          ? 0 : 1);[m
[31m-#else[m
[31m-exit(1);[m
[31m-#endif[m
[31m-"[m
[31m-SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-CC_TEST_FLAGS="-Werror -Wall $CC_TEST_FLAGS"[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-[m
[31m-ngx_feature="__attribute__(constructor)"[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_name="NGX_HTTP_LUA_HAVE_CONSTRUCTOR"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <stdlib.h>[m
[31m-int a = 2;[m
[31m-__attribute__((constructor))[m
[31m-static void foo(void)[m
[31m-{[m
[31m-    a = 0;[m
[31m-}[m
[31m-"[m
[31m-ngx_feature_test="exit(a);"[m
[31m-SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-CC_TEST_FLAGS="-Werror -Wall $CC_TEST_FLAGS"[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_deps="$HTTP_LUA_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_LUA_SRCS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_LUA_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_LUA_DEPS"[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_module_incs"[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_module_libs"[m
[31m-fi[m
[31m-[m
[31m-#CFLAGS=$"$CFLAGS -DLUA_DEFAULT_PATH='\"/usr/local/openresty/lualib/?.lua\"'"[m
[31m-#CFLAGS=$"$CFLAGS -DLUA_DEFAULT_CPATH='\"/usr/local/openresty/lualib/?.so\"'"[m
[31m-[m
[31m-ngx_lua_dquote='"'[m
[31m-CFLAGS="$CFLAGS -DLUA_DEFAULT_PATH='${ngx_lua_dquote}/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua$ngx_lua_dquote'"[m
[31m-CFLAGS="$CFLAGS -DLUA_DEFAULT_CPATH='${ngx_lua_dquote}/usr/local/openresty/lualib/?.so$ngx_lua_dquote'"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/dtrace/ngx_lua_provider.d b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/dtrace/ngx_lua_provider.d[m
[1mdeleted file mode 100644[m
[1mindex 394484c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/dtrace/ngx_lua_provider.d[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-provider nginx_lua {[m
[31m-    probe http__lua__info(char *s);[m
[31m-[m
[31m-    /* lua_State *L */[m
[31m-    probe http__lua__register__preload__package(void *L, u_char *pkg);[m
[31m-[m
[31m-    probe http__lua__req__socket__consume__preread(void *r,[m
[31m-            u_char *data, size_t len);[m
[31m-[m
[31m-    /* lua_State *parent, lua_State *child */[m
[31m-    probe http__lua__user__coroutine__create(void *r,[m
[31m-            void *parent, void *child);[m
[31m-[m
[31m-    /* lua_State *parent, lua_State *child */[m
[31m-    probe http__lua__user__coroutine__resume(void *r,[m
[31m-                                             void *parent, void *child);[m
[31m-[m
[31m-    /* lua_State *parent, lua_State *child */[m
[31m-    probe http__lua__user__coroutine__yield(void *r,[m
[31m-                                            void *parent, void *child);[m
[31m-[m
[31m-    /* lua_State *L */[m
[31m-    probe http__lua__thread__yield(void *r, void *L);[m
[31m-[m
[31m-    /* ngx_http_lua_socket_tcp_upstream_t *u */[m
[31m-    probe http__lua__socket__tcp__send__start(void *r,[m
[31m-            void *u, u_char *data, size_t len);[m
[31m-[m
[31m-    /* ngx_http_lua_socket_tcp_upstream_t *u */[m
[31m-    probe http__lua__socket__tcp__receive__done(void *r,[m
[31m-            void *u, u_char *data, size_t len);[m
[31m-[m
[31m-    /* ngx_http_lua_socket_tcp_upstream_t *u */[m
[31m-    probe http__lua__socket__tcp__setkeepalive__buf__unread([m
[31m-            void *r, void *u, u_char *data, size_t len);[m
[31m-[m
[31m-    /* lua_State *creator, lua_State *newthread */[m
[31m-    probe http__lua__user__thread__spawn(void *r,[m
[31m-            void *creator, void *newthread);[m
[31m-[m
[31m-    /* lua_State *thread, ngx_http_lua_ctx_t *ctx */[m
[31m-    probe http__lua__thread__delete(void *r, void *thread, void *ctx);[m
[31m-[m
[31m-    /* lua_State *thread */[m
[31m-    probe http__lua__run__posted__thread(void *r, void *thread,[m
[31m-            int status);[m
[31m-[m
[31m-    probe http__lua__coroutine__done(void *r, void *co,[m
[31m-            int success);[m
[31m-[m
[31m-    /* lua_State *parent, lua_State *child */[m
[31m-    probe http__lua__user__thread__wait(void *parent, void *child);[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#pragma D attributes Evolving/Evolving/Common      provider nginx_lua provider[m
[31m-#pragma D attributes Private/Private/Unknown       provider nginx_lua module[m
[31m-#pragma D attributes Private/Private/Unknown       provider nginx_lua function[m
[31m-#pragma D attributes Private/Private/Common        provider nginx_lua name[m
[31m-#pragma D attributes Evolving/Evolving/Common      provider nginx_lua args[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/lib/RecvUntil.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/lib/RecvUntil.pm[m
[1mdeleted file mode 100755[m
[1mindex 54fdc54..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/lib/RecvUntil.pm[m
[1m+++ /dev/null[m
[36m@@ -1,138 +0,0 @@[m
[31m-package RecvUntil;[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-sub recv_until {[m
[31m-    my ($pat) = @_;[m
[31m-[m
[31m-    my $len = length $pat;[m
[31m-    my @backtracks;[m
[31m-[m
[31m-    for (my $i = 1; $i <= $len - 1; $i++) {[m
[31m-        my $matched_prefix_len = 1;[m
[31m-        while ($matched_prefix_len <= $len - $i - 1) {[m
[31m-            #while (1) {[m
[31m-            #my $left = $len - $i;[m
[31m-            #warn "left: $i: $len: ", $len - 1 - $i, "\n";[m
[31m-            #warn "matched_prefix_len: $matched_prefix_len\n";[m
[31m-[m
[31m-            #while (1) {[m
[31m-            my $prefix = substr($pat, 0, $matched_prefix_len);[m
[31m-            my $next = substr($pat, $matched_prefix_len, 1);[m
[31m-[m
[31m-            my $prefix2 = substr($pat, $i, $matched_prefix_len);[m
[31m-            my $next2 = substr($pat, $i + $matched_prefix_len, 1);[m
[31m-[m
[31m-            #warn "$i: global prefix $prefix $next\n";[m
[31m-            #warn "$i: local prefix $prefix2 $next2\n";[m
[31m-[m
[31m-            if ($prefix2 eq $prefix) {[m
[31m-                if ($next2 eq $next) {[m
[31m-                    $matched_prefix_len++;[m
[31m-                    next;[m
[31m-                }[m
[31m-[m
[31m-                #warn "$matched_prefix_len: $prefix: found match at $i (next $next, next2 $next2)\n";[m
[31m-                my $cur_state = $i + $matched_prefix_len;[m
[31m-                my $new_state = $matched_prefix_len + 1;[m
[31m-[m
[31m-                my $matched = substr($pat, 0, $cur_state);[m
[31m-[m
[31m-                my $chain = $backtracks[$cur_state - 2];[m
[31m-                if (!$chain) {[m
[31m-                    $chain = [];[m
[31m-                    $backtracks[$cur_state - 2] = $chain;[m
[31m-                }[m
[31m-[m
[31m-                my $found = 0;[m
[31m-                for my $rec (@$chain) {[m
[31m-                    if ($rec->{char} eq $next) {[m
[31m-                        $found = 1;[m
[31m-[m
[31m-                        if ($rec->{new_state} < $new_state) {[m
[31m-                            warn "overriding...\n";[m
[31m-                            $rec->{new_state} = $new_state;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (!$found) {[m
[31m-                    warn "on state $cur_state ($matched), if next is '$next', ",[m
[31m-                        "then backtrack to state $new_state ($prefix$next)\n";[m
[31m-[m
[31m-                    push @$chain, { char => $next, new_state => $new_state };[m
[31m-                }[m
[31m-[m
[31m-                #if ($matched_prefix_len > 1) {[m
[31m-                #$i += $matched_prefix_len - 1;[m
[31m-                #}[m
[31m-[m
[31m-                last;[m
[31m-            }[m
[31m-[m
[31m-            last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return sub {[m
[31m-        my ($txt) = @_;[m
[31m-[m
[31m-        my $max_state = length $pat;[m
[31m-        my $len = length $txt;[m
[31m-        my $state = 0;[m
[31m-        my $ret = '';[m
[31m-[m
[31m-        for (my $i = 0; $i < $len; $i++) {[m
[31m-            # read the char[m
[31m-            my $c = substr($txt, $i, 1);[m
[31m-[m
[31m-            #warn "$state: read char at $i: $c\n";[m
[31m-            #warn "matched: $ret\n";[m
[31m-[m
[31m-            my $expected = substr($pat, $state, 1);[m
[31m-            if ($expected eq $c) {[m
[31m-                #warn "matched the char in pattern.\n";[m
[31m-                $state++;[m
[31m-[m
[31m-                if ($state == $max_state) {[m
[31m-                    last;[m
[31m-                }[m
[31m-[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if ($state == 0) {[m
[31m-                #warn "did not match the first char in pattern\n";[m
[31m-                $ret .= $c;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            my $old_state;[m
[31m-            my $matched;[m
[31m-            my $chain = $backtracks[$state - 2];[m
[31m-            for my $rec (@$chain) {[m
[31m-                if ($rec->{char} eq $c) {[m
[31m-                    $old_state = $state;[m
[31m-                    $state = $rec->{new_state};[m
[31m-                    #warn "matched the char for backtracking to state $state\n";[m
[31m-                    $matched = 1;[m
[31m-                    last;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (!$matched) {[m
[31m-                $ret .= substr($pat, 0, $state);[m
[31m-                $state = 0;[m
[31m-                redo;[m
[31m-            }[m
[31m-[m
[31m-            $ret .= substr($pat, 0, $old_state + 1 - $state);[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        return $ret;[m
[31m-    };[m
[31m-}[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 5783ee6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/misc/recv-until-pm/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use 5.10.1;[m
[31m-use Test::Base;[m
[31m-use RecvUntil;[m
[31m-[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-run {[m
[31m-    my $block = shift;[m
[31m-    my $name = $block->name;[m
[31m-    my $pat = $block->pat // die "$name: No --- pat found";[m
[31m-    my $txt = $block->txt // die "$name: No --- txt found";[m
[31m-[m
[31m-    my $expected = $block->out // die "$name: No --- out found";[m
[31m-[m
[31m-    my $it = RecvUntil::recv_until($pat);[m
[31m-    is $it->($txt), $expected, "$name: output ok";[m
[31m-};[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1:[m
[31m---- pat: abcabd[m
[31m---- txt: abcabcabd[m
[31m---- out: abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2:[m
[31m---- pat: aa[m
[31m---- txt: abcabcaad[m
[31m---- out: abcabc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3:[m
[31m---- pat: ab[m
[31m---- txt: bbcabcaad[m
[31m---- out: bbc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4:[m
[31m---- pat: aaa[m
[31m---- txt: abaabcaaaef[m
[31m---- out: abaabc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5:[m
[31m---- pat: aaaaad[m
[31m---- txt: baaaaaaaaeaaaaaaadf[m
[31m---- out: baaaaaaaaeaa[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6:[m
[31m---- pat: abacadae[m
[31m---- txt: a[m
[31m---- out:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7:[m
[31m---- pat: abacadae[m
[31m---- txt: ababacadae[m
[31m---- out: ab[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8:[m
[31m---- pat: abacadae[m
[31m---- txt: abacabacadae[m
[31m---- out: abac[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9:[m
[31m---- pat: abacadae[m
[31m---- txt: abaabacadae[m
[31m---- out: aba[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10:[m
[31m---- pat: abacadae[m
[31m---- txt: abacadabacadae[m
[31m---- out: abacad[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11:[m
[31m---- pat: abcabdabcabe[m
[31m---- txt: abcabdabcabdabcabe[m
[31m---- out: abcabd[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12:[m
[31m---- pat: abcabdabcabe[m
[31m---- txt: abcabdabcabcabdabcabe[m
[31m---- out: abcabdabc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13:[m
[31m---- pat: abcabdabcabe[m
[31m---- txt: abcabcabdabcabe[m
[31m---- out: abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14:[m
[31m---- pat: abcabdabcabe[m
[31m---- txt: ababcabdabcabe[m
[31m---- out: ab[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15:[m
[31m---- pat: abcdef[m
[31m---- txt: abcabcdef[m
[31m---- out: abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16:[m
[31m---- pat: -- abc[m
[31m---- txt: ---- abc[m
[31m---- out: --[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17:[m
[31m---- pat: yz--ababyz[m
[31m---- txt: [m
[31m---- out: --[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/api/ngx_http_lua_api.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/api/ngx_http_lua_api.h[m
[1mdeleted file mode 100644[m
[1mindex 4bac0f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/api/ngx_http_lua_api.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_API_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_API_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <lua.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-/* Public API for other Nginx modules */[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_version  10005[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint8_t         type;[m
[31m-[m
[31m-    union {[m
[31m-        int         b; /* boolean */[m
[31m-        lua_Number  n; /* number */[m
[31m-        ngx_str_t   s; /* string */[m
[31m-    } value;[m
[31m-[m
[31m-} ngx_http_lua_value_t;[m
[31m-[m
[31m-[m
[31m-lua_State *ngx_http_lua_get_global_state(ngx_conf_t *cf);[m
[31m-[m
[31m-ngx_http_request_t *ngx_http_lua_get_request(lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_add_package_preload(ngx_conf_t *cf, const char *package,[m
[31m-    lua_CFunction func);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_shared_dict_get(ngx_shm_zone_t *shm_zone,[m
[31m-    u_char *key_data, size_t key_len, ngx_http_lua_value_t *value);[m
[31m-[m
[31m-ngx_shm_zone_t *ngx_http_lua_find_zone(u_char *name_data, size_t name_len);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_API_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex f2d4b73..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _DDEBUG_H_INCLUDED_[m
[31m-#define _DDEBUG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "lua *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char *fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char *fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _DDEBUG_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_accessby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_accessby.c[m
[1mdeleted file mode 100644[m
[1mindex bd09def..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_accessby.c[m
[1m+++ /dev/null[m
[36m@@ -1,388 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_accessby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_access_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_access_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_lua_ctx_t         *ctx;[m
[31m-    ngx_http_lua_loc_conf_t    *llcf;[m
[31m-    ngx_http_lua_main_conf_t   *lmcf;[m
[31m-    ngx_http_phase_handler_t    tmp, *ph, *cur_ph, *last_ph;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua access handler, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (!lmcf->postponed_to_access_phase_end) {[m
[31m-[m
[31m-        lmcf->postponed_to_access_phase_end = 1;[m
[31m-[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ph = cmcf->phase_engine.handlers;[m
[31m-        cur_ph = &ph[r->phase_handler];[m
[31m-[m
[31m-        /* we should skip the post_access phase handler here too */[m
[31m-        last_ph = &ph[cur_ph->next - 2];[m
[31m-[m
[31m-        dd("ph cur: %d, ph next: %d", (int) r->phase_handler,[m
[31m-           (int) (cur_ph->next - 2));[m
[31m-[m
[31m-#if 0[m
[31m-        if (cur_ph == last_ph) {[m
[31m-            dd("XXX our handler is already the last access phase handler");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (cur_ph < last_ph) {[m
[31m-            dd("swaping the contents of cur_ph and last_ph...");[m
[31m-[m
[31m-            tmp = *cur_ph;[m
[31m-[m
[31m-            memmove(cur_ph, cur_ph + 1,[m
[31m-                    (last_ph - cur_ph) * sizeof (ngx_http_phase_handler_t));[m
[31m-[m
[31m-            *last_ph = tmp;[m
[31m-[m
[31m-            r->phase_handler--; /* redo the current ph */[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->access_handler == NULL) {[m
[31m-        dd("no access handler found");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("entered? %d", (int) ctx->entered_access_phase);[m
[31m-[m
[31m-    if (ctx->entered_access_phase) {[m
[31m-        dd("calling wev handler");[m
[31m-        rc = ctx->resume_handler(r);[m
[31m-        dd("wev handler returns %d", (int) rc);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc == NGX_DONE || rc > NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            if (r->header_sent) {[m
[31m-                dd("header already sent");[m
[31m-[m
[31m-                /* response header was already generated in access_by_lua*,[m
[31m-                 * so it is no longer safe to proceed to later phases[m
[31m-                 * which may generate responses again */[m
[31m-[m
[31m-                if (!ctx->eof) {[m
[31m-                    dd("eof not yet sent");[m
[31m-[m
[31m-                    rc = ngx_http_lua_send_chain_link(r, ctx, NULL[m
[31m-                                                     /* indicate last_buf */);[m
[31m-                    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                return NGX_HTTP_OK;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        dd("WAITING MORE BODY");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->force_read_body && !ctx->read_body_done) {[m
[31m-        r->request_body_in_single_buf = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r,[m
[31m-                                       ngx_http_lua_generic_phase_post_read);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            ctx->waiting_more_body = 1;[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("calling access handler");[m
[31m-    return llcf->access_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_access_handler_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    lua_State                 *L;[m
[31m-    ngx_http_lua_loc_conf_t   *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->access_src.value.data,[m
[31m-                                       llcf->access_src.value.len,[m
[31m-                                       llcf->access_src_key,[m
[31m-                                       (const char *) llcf->access_chunkname);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_access_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_access_handler_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *script_path;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_str_t                  eval_src;[m
[31m-    lua_State                 *L;[m
[31m-    ngx_http_lua_loc_conf_t   *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* Eval nginx variables in code path string first */[m
[31m-    if (ngx_http_complex_value(r, &llcf->access_src, &eval_src) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->access_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc < NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_access_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_access_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                  co_ref;[m
[31m-    ngx_int_t            rc;[m
[31m-    lua_State           *co;[m
[31m-    ngx_event_t         *rev;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-    ngx_http_cleanup_t  *cln;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    /*  {{{ new coroutine to handle request */[m
[31m-    co = ngx_http_lua_new_thread(r, L, &co_ref);[m
[31m-[m
[31m-    if (co == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua: failed to create new coroutine "[m
[31m-                      "to handle request");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  move code closure to new coroutine */[m
[31m-    lua_xmove(L, co, 1);[m
[31m-[m
[31m-    /*  set closure's env table to new coroutine's globals table */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /*  save nginx request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(co, r);[m
[31m-[m
[31m-    /*  {{{ initialize request context */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-[m
[31m-    ctx->entered_access_phase = 1;[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-    ctx->cur_co_ctx->co = co;[m
[31m-    ctx->cur_co_ctx->co_ref = co_ref;[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    /*  {{{ register request cleanup hooks */[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_ACCESS;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->check_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if (!rev->active) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-    dd("returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        rc = ngx_http_lua_run_posted_threads(c, L, r, ctx);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc == NGX_DONE || rc > NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-    } else if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-[m
[31m-        rc = ngx_http_lua_run_posted_threads(c, L, r, ctx);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc == NGX_DONE || rc > NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (rc == NGX_OK) {[m
[31m-        if (r->header_sent) {[m
[31m-            dd("header already sent");[m
[31m-[m
[31m-            /* response header was already generated in access_by_lua*,[m
[31m-             * so it is no longer safe to proceed to later phases[m
[31m-             * which may generate responses again */[m
[31m-[m
[31m-            if (!ctx->eof) {[m
[31m-                dd("eof not yet sent");[m
[31m-[m
[31m-                rc = ngx_http_lua_send_chain_link(r, ctx, NULL[m
[31m-                                                  /* indicate last_buf */);[m
[31m-                if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_accessby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_accessby.h[m
[1mdeleted file mode 100644[m
[1mindex 28c9eb2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_accessby.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_ACCESSBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_ACCESSBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_access_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_access_handler_inline(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_access_handler_file(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_ACCESSBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_api.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_api.c[m
[1mdeleted file mode 100644[m
[1mindex fcf07ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_api.c[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-#include "api/ngx_http_lua_api.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-lua_State *[m
[31m-ngx_http_lua_get_global_state(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t *lmcf;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    return lmcf->lua;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *[m
[31m-ngx_http_lua_get_request(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_get_req(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_add_package_preload(ngx_conf_t *cf, const char *package,[m
[31m-    lua_CFunction func)[m
[31m-{[m
[31m-    lua_State                     *L;[m
[31m-    ngx_http_lua_main_conf_t      *lmcf;[m
[31m-    ngx_http_lua_preload_hook_t   *hook;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    L = lmcf->lua;[m
[31m-[m
[31m-    if (L) {[m
[31m-        lua_getglobal(L, "package");[m
[31m-        lua_getfield(L, -1, "preload");[m
[31m-        lua_pushcfunction(L, func);[m
[31m-        lua_setfield(L, -2, package);[m
[31m-        lua_pop(L, 2);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* L == NULL */[m
[31m-[m
[31m-    if (lmcf->preload_hooks == NULL) {[m
[31m-        lmcf->preload_hooks =[m
[31m-            ngx_array_create(cf->pool, 4,[m
[31m-                             sizeof(ngx_http_lua_preload_hook_t));[m
[31m-[m
[31m-        if (lmcf->preload_hooks == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hook = ngx_array_push(lmcf->preload_hooks);[m
[31m-    if (hook == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hook->package = (u_char *) package;[m
[31m-    hook->loader = func;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_args.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_args.c[m
[1mdeleted file mode 100644[m
[1mindex 0c307d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_args.c[m
[1m+++ /dev/null[m
[36m@@ -1,550 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_args.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_set_uri_args(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_uri_args(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_post_args(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_uri_args(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_str_t                    args;[m
[31m-    const char                  *msg;[m
[31m-    size_t                       len;[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    switch (lua_type(L, 1)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-    case LUA_TSTRING:[m
[31m-        p = (u_char *) lua_tolstring(L, 1, &len);[m
[31m-[m
[31m-        args.data = ngx_palloc(r->pool, len);[m
[31m-        if (args.data == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(args.data, p, len);[m
[31m-[m
[31m-        args.len = len;[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TTABLE:[m
[31m-        ngx_http_lua_process_args_option(r, L, 1, &args);[m
[31m-[m
[31m-        dd("args: %.*s", (int) args.len, args.data);[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        msg = lua_pushfstring(L, "string, number, or table expected, "[m
[31m-                              "but got %s", luaL_typename(L, 2));[m
[31m-        return luaL_argerror(L, 1, msg);[m
[31m-    }[m
[31m-[m
[31m-    dd("args: %.*s", (int) args.len, args.data);[m
[31m-[m
[31m-    r->args.data = args.data;[m
[31m-    r->args.len = args.len;[m
[31m-[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_uri_args(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *buf;[m
[31m-    u_char                      *last;[m
[31m-    int                          retval;[m
[31m-    int                          n;[m
[31m-    int                          max;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0 && n != 1) {[m
[31m-        return luaL_error(L, "expecting 0 or 1 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        max = luaL_checkinteger(L, 1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_ARGS;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->args.len == 0) {[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* we copy r->args over to buf to simplify[m
[31m-     * unescaping query arg keys and values */[m
[31m-[m
[31m-    buf = ngx_palloc(r->pool, r->args.len);[m
[31m-    if (buf == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, 4);[m
[31m-[m
[31m-    ngx_memcpy(buf, r->args.data, r->args.len);[m
[31m-[m
[31m-    last = buf + r->args.len;[m
[31m-[m
[31m-    retval = ngx_http_lua_parse_args(L, buf, last, max);[m
[31m-[m
[31m-    ngx_pfree(r->pool, buf);[m
[31m-[m
[31m-    return retval;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_post_args(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *buf;[m
[31m-    int                          retval;[m
[31m-    size_t                       len;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *last;[m
[31m-    int                          n;[m
[31m-    int                          max;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0 && n != 1) {[m
[31m-        return luaL_error(L, "expecting 0 or 1 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        max = luaL_checkinteger(L, 1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_ARGS;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body == NULL) {[m
[31m-        return luaL_error(L, "no request body found; "[m
[31m-                          "maybe you should turn on lua_need_request_body?");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body->temp_file) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "requesty body in temp file not supported");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body->bufs == NULL) {[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* we copy r->request_body->bufs over to buf to simplify[m
[31m-     * unescaping query arg keys and values */[m
[31m-[m
[31m-    len = 0;[m
[31m-    for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-        len += cl->buf->last - cl->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    dd("post body length: %d", (int) len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_palloc(r->pool, len);[m
[31m-    if (buf == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, 4);[m
[31m-[m
[31m-    p = buf;[m
[31m-    for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-        p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    dd("post body: %.*s", (int) len, buf);[m
[31m-[m
[31m-    last = buf + len;[m
[31m-[m
[31m-    retval = ngx_http_lua_parse_args(L, buf, last, max);[m
[31m-[m
[31m-    ngx_pfree(r->pool, buf);[m
[31m-[m
[31m-    return retval;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_parse_args(lua_State *L, u_char *buf, u_char *last, int max)[m
[31m-{[m
[31m-    u_char                      *p, *q;[m
[31m-    u_char                      *src, *dst;[m
[31m-    unsigned                     parsing_value;[m
[31m-    size_t                       len;[m
[31m-    int                          count = 0;[m
[31m-    int                          top;[m
[31m-[m
[31m-    top = lua_gettop(L);[m
[31m-[m
[31m-    p = buf;[m
[31m-[m
[31m-    parsing_value = 0;[m
[31m-    q = p;[m
[31m-[m
[31m-    while (p != last) {[m
[31m-        if (*p == '=' && ! parsing_value) {[m
[31m-            /* key data is between p and q */[m
[31m-[m
[31m-            src = q; dst = q;[m
[31m-[m
[31m-            ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                      NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            dd("pushing key %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-            /* push the key */[m
[31m-            lua_pushlstring(L, (char *) q, dst - q);[m
[31m-[m
[31m-            /* skip the current '=' char */[m
[31m-            p++;[m
[31m-[m
[31m-            q = p;[m
[31m-            parsing_value = 1;[m
[31m-[m
[31m-        } else if (*p == '&') {[m
[31m-            /* reached the end of a key or a value, just save it */[m
[31m-            src = q; dst = q;[m
[31m-[m
[31m-            ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                      NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            dd("pushing key or value %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-            /* push the value or key */[m
[31m-            lua_pushlstring(L, (char *) q, dst - q);[m
[31m-[m
[31m-            /* skip the current '&' char */[m
[31m-            p++;[m
[31m-[m
[31m-            q = p;[m
[31m-[m
[31m-            if (parsing_value) {[m
[31m-                /* end of the current pair's value */[m
[31m-                parsing_value = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                /* the current parsing pair takes no value,[m
[31m-                 * just push the value "true" */[m
[31m-                dd("pushing boolean true");[m
[31m-[m
[31m-                lua_pushboolean(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            (void) lua_tolstring(L, -2, &len);[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                /* ignore empty string key pairs */[m
[31m-                dd("popping key and value...");[m
[31m-                lua_pop(L, 2);[m
[31m-[m
[31m-            } else {[m
[31m-                dd("setting table...");[m
[31m-                ngx_http_lua_set_multi_value_table(L, top);[m
[31m-            }[m
[31m-[m
[31m-            if (max > 0 && ++count == max) {[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                               "lua hit query args limit %d", max);[m
[31m-[m
[31m-                return 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p != q || parsing_value) {[m
[31m-        src = q; dst = q;[m
[31m-[m
[31m-        ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                  NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-        dd("pushing key or value %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) q, dst - q);[m
[31m-[m
[31m-        if (!parsing_value) {[m
[31m-            dd("pushing boolean true...");[m
[31m-            lua_pushboolean(L, 1);[m
[31m-        }[m
[31m-[m
[31m-        (void) lua_tolstring(L, -2, &len);[m
[31m-[m
[31m-        if (len == 0) {[m
[31m-            /* ignore empty string key pairs */[m
[31m-            dd("popping key and value...");[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-        } else {[m
[31m-            dd("setting table...");[m
[31m-            ngx_http_lua_set_multi_value_table(L, top);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("gettop: %d", lua_gettop(L));[m
[31m-    dd("type: %s", lua_typename(L, lua_type(L, 1)));[m
[31m-[m
[31m-    if (lua_gettop(L) != top) {[m
[31m-        return luaL_error(L, "internal error: stack in bad state");[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_args_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_uri_args);[m
[31m-    lua_setfield(L, -2, "set_uri_args");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_uri_args);[m
[31m-    lua_setfield(L, -2, "get_uri_args");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_uri_args);[m
[31m-    lua_setfield(L, -2, "get_query_args"); /* deprecated */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_post_args);[m
[31m-    lua_setfield(L, -2, "get_post_args");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_req_get_querystring_len(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return r->args.len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_uri_args_count(ngx_http_request_t *r, int max)[m
[31m-{[m
[31m-    int                      count;[m
[31m-    u_char                  *p, *last;[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (max < 0) {[m
[31m-        max = NGX_HTTP_LUA_MAX_ARGS;[m
[31m-    }[m
[31m-[m
[31m-    last = r->args.data + r->args.len;[m
[31m-    count = 0;[m
[31m-[m
[31m-    for (p = r->args.data; p != last; p++) {[m
[31m-        if (*p == '&') {[m
[31m-            if (count == 0) {[m
[31m-                count += 2;[m
[31m-[m
[31m-            } else {[m
[31m-                count++;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (count) {[m
[31m-        if (max > 0 && count > max) {[m
[31m-            count = max;[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua hit query args limit %d", max);[m
[31m-        }[m
[31m-[m
[31m-        return count;[m
[31m-    }[m
[31m-[m
[31m-    if (r->args.len) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_uri_args(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_lua_ffi_table_elt_t *out, int count)[m
[31m-{[m
[31m-    int                          i, parsing_value = 0;[m
[31m-    u_char                      *last, *p, *q;[m
[31m-    u_char                      *src, *dst;[m
[31m-[m
[31m-    if (count <= 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(buf, r->args.data, r->args.len);[m
[31m-[m
[31m-    i = 0;[m
[31m-    last = buf + r->args.len;[m
[31m-    p = buf;[m
[31m-    q = p;[m
[31m-[m
[31m-    while (p != last) {[m
[31m-        if (*p == '=' && !parsing_value) {[m
[31m-            /* key data is between p and q */[m
[31m-[m
[31m-            src = q; dst = q;[m
[31m-[m
[31m-            ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                      NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            dd("saving key %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-            out[i].key.data = q;[m
[31m-            out[i].key.len = (int) (dst - q);[m
[31m-[m
[31m-            /* skip the current '=' char */[m
[31m-            p++;[m
[31m-[m
[31m-            q = p;[m
[31m-            parsing_value = 1;[m
[31m-[m
[31m-        } else if (*p == '&') {[m
[31m-            /* reached the end of a key or a value, just save it */[m
[31m-            src = q; dst = q;[m
[31m-[m
[31m-            ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                      NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            dd("pushing key or value %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-            if (parsing_value) {[m
[31m-                /* end of the current pair's value */[m
[31m-                parsing_value = 0;[m
[31m-[m
[31m-                if (out[i].key.len) {[m
[31m-                    out[i].value.data = q;[m
[31m-                    out[i].value.len = (int) (dst - q);[m
[31m-                    i++;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                /* the current parsing pair takes no value,[m
[31m-                 * just push the value "true" */[m
[31m-                dd("pushing boolean true");[m
[31m-[m
[31m-                if (dst - q) {[m
[31m-                    out[i].key.data = q;[m
[31m-                    out[i].key.len = (int) (dst - q);[m
[31m-                    out[i].value.len = -1;[m
[31m-                    i++;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (i == count) {[m
[31m-                return i;[m
[31m-            }[m
[31m-[m
[31m-            /* skip the current '&' char */[m
[31m-            p++;[m
[31m-[m
[31m-            q = p;[m
[31m-[m
[31m-        } else {[m
[31m-            p++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p != q || parsing_value) {[m
[31m-        src = q; dst = q;[m
[31m-[m
[31m-        ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                  NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-        dd("pushing key or value %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-        if (parsing_value) {[m
[31m-            if (out[i].key.len) {[m
[31m-                out[i].value.data = q;[m
[31m-                out[i].value.len = (int) (dst - q);[m
[31m-                i++;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (dst - q) {[m
[31m-                out[i].key.data = q;[m
[31m-                out[i].key.len = (int) (dst - q);[m
[31m-                out[i].value.len = (int) -1;[m
[31m-                i++;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return i;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_args.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_args.h[m
[1mdeleted file mode 100644[m
[1mindex d89889f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_args.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_ARGS_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_ARGS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_req_args_api(lua_State *L);[m
[31m-int ngx_http_lua_parse_args(lua_State *L, u_char *buf, u_char *last, int max);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_ARGS_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_balancer.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_balancer.c[m
[1mdeleted file mode 100644[m
[1mindex 5fa289b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_balancer.c[m
[1m+++ /dev/null[m
[36m@@ -1,655 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_balancer.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_balancer_peer_data_s {[m
[31m-    /* the round robin data must be first */[m
[31m-    ngx_http_upstream_rr_peer_data_t    rrp;[m
[31m-[m
[31m-    ngx_http_lua_srv_conf_t            *conf;[m
[31m-    ngx_http_request_t                 *request;[m
[31m-[m
[31m-    ngx_uint_t                          more_tries;[m
[31m-    ngx_uint_t                          total_tries;[m
[31m-[m
[31m-    struct sockaddr                    *sockaddr;[m
[31m-    socklen_t                           socklen;[m
[31m-[m
[31m-    ngx_str_t                          *host;[m
[31m-    in_port_t                           port;[m
[31m-[m
[31m-    int                                 last_peer_state;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_lua_balancer_set_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static void ngx_http_lua_balancer_save_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_lua_balancer_init(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_lua_balancer_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_lua_balancer_get_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static ngx_int_t ngx_http_lua_balancer_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r);[m
[31m-void ngx_http_lua_balancer_free_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_balancer_handler_file(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L,[m
[31m-                                     lscf->balancer.src.data,[m
[31m-                                     lscf->balancer.src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_balancer_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_balancer_handler_inline(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       lscf->balancer.src.data,[m
[31m-                                       lscf->balancer.src.len,[m
[31m-                                       lscf->balancer.src_key,[m
[31m-                                       "=balancer_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_balancer_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_balancer_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_balancer_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_balancer_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *name;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_srv_conf_t     *lscf = conf;[m
[31m-[m
[31m-    ngx_http_upstream_srv_conf_t      *uscf;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (lscf->balancer.handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lscf->balancer.handler = (ngx_http_lua_srv_conf_handler_pt) cmd->post;[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_balancer_handler_file) {[m
[31m-        /* Lua code in an external file */[m
[31m-[m
[31m-        name = ngx_http_lua_rebase_path(cf->pool, value[1].data,[m
[31m-                                        value[1].len);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->balancer.src.data = name;[m
[31m-        lscf->balancer.src.len = ngx_strlen(name);[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->balancer.src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        /* inlined Lua code */[m
[31m-[m
[31m-        lscf->balancer.src = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->balancer.src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_lua_balancer_init;[m
[31m-[m
[31m-    uscf->flags = NGX_HTTP_UPSTREAM_CREATE[m
[31m-                  |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                  |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_HTTP_UPSTREAM_DOWN;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_init(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* this callback is called upon individual requests */[m
[31m-    us->peer.init = ngx_http_lua_balancer_init_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_http_lua_srv_conf_t            *bcf;[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp;[m
[31m-[m
[31m-    bp = ngx_pcalloc(r->pool, sizeof(ngx_http_lua_balancer_peer_data_t));[m
[31m-    if (bp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.data = &bp->rrp;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_lua_balancer_get_peer;[m
[31m-    r->upstream->peer.free = ngx_http_lua_balancer_free_peer;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    r->upstream->peer.set_session = ngx_http_lua_balancer_set_session;[m
[31m-    r->upstream->peer.save_session = ngx_http_lua_balancer_save_session;[m
[31m-#endif[m
[31m-[m
[31m-    bcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_lua_module);[m
[31m-[m
[31m-    bp->conf = bcf;[m
[31m-    bp->request = r;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    lua_State                          *L;[m
[31m-    ngx_int_t                           rc;[m
[31m-    ngx_http_request_t                 *r;[m
[31m-    ngx_http_lua_ctx_t                 *ctx;[m
[31m-    ngx_http_lua_srv_conf_t            *lscf;[m
[31m-    ngx_http_lua_main_conf_t           *lmcf;[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua balancer peer, tries: %ui", pc->tries);[m
[31m-[m
[31m-    lscf = bp->conf;[m
[31m-[m
[31m-    r = bp->request;[m
[31m-[m
[31m-    ngx_http_lua_assert(lscf->balancer.handler && r);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    } else {[m
[31m-        L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-        dd("reset ctx");[m
[31m-        ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_BALANCER;[m
[31m-[m
[31m-    bp->sockaddr = NULL;[m
[31m-    bp->socklen = 0;[m
[31m-    bp->more_tries = 0;[m
[31m-    bp->total_tries++;[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* balancer_by_lua does not support yielding and[m
[31m-     * there cannot be any conflicts among concurrent requests,[m
[31m-     * thus it is safe to store the peer data in the main conf.[m
[31m-     */[m
[31m-    lmcf->balancer_peer_data = bp;[m
[31m-[m
[31m-    rc = lscf->balancer.handler(r, lscf, L);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->exited && ctx->exit_code != NGX_OK) {[m
[31m-        rc = ctx->exit_code;[m
[31m-        if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc > NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (bp->sockaddr && bp->socklen) {[m
[31m-        pc->sockaddr = bp->sockaddr;[m
[31m-        pc->socklen = bp->socklen;[m
[31m-        pc->cached = 0;[m
[31m-        pc->connection = NULL;[m
[31m-        pc->name = bp->host;[m
[31m-[m
[31m-        bp->rrp.peers->single = 0;[m
[31m-[m
[31m-        if (bp->more_tries) {[m
[31m-            r->upstream->peer.tries += bp->more_tries;[m
[31m-        }[m
[31m-[m
[31m-        dd("tries: %d", (int) r->upstream->peer.tries);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_upstream_get_round_robin_peer(pc, &bp->rrp);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                  *err_msg;[m
[31m-    size_t                   len;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    /* init nginx context in Lua VM */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    lua_createtable(L, 0, 1 /* nrec */);   /* the metatable for the new env */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable({}, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-    lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-    /*  protected call user code */[m
[31m-    rc = lua_pcall(L, 0, 1, 1);[m
[31m-[m
[31m-    lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-    dd("rc == %d", (int) rc);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        /*  error occured when running loaded code */[m
[31m-        err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-        if (err_msg == NULL) {[m
[31m-            err_msg = (u_char *) "unknown reason";[m
[31m-            len = sizeof("unknown reason") - 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "failed to run balancer_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-        lua_settop(L, 0); /*  clear remaining elems on stack */[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lua_settop(L, 0); /*  clear remaining elems on stack */[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_balancer_free_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua balancer free peer, tries: %ui", pc->tries);[m
[31m-[m
[31m-    if (bp->sockaddr && bp->socklen) {[m
[31m-        bp->last_peer_state = (int) state;[m
[31m-[m
[31m-        if (pc->tries) {[m
[31m-            pc->tries--;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* fallback */[m
[31m-[m
[31m-    ngx_http_upstream_free_round_robin_peer(pc, data, state);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_set_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp = data;[m
[31m-[m
[31m-    if (bp->sockaddr && bp->socklen) {[m
[31m-        /* TODO */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_upstream_set_round_robin_peer_session(pc, &bp->rrp);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_balancer_save_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp = data;[m
[31m-[m
[31m-    if (bp->sockaddr && bp->socklen) {[m
[31m-        /* TODO */[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_save_round_robin_peer_session(pc, &bp->rrp);[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_balancer_set_current_peer(ngx_http_request_t *r,[m
[31m-    const u_char *addr, size_t addr_len, int port, char **err)[m
[31m-{[m
[31m-    ngx_url_t              url;[m
[31m-    ngx_http_lua_ctx_t    *ctx;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t           *lmcf;[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp;[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        *err = "no request found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        *err = "no upstream found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *err = "no ctx found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->context & NGX_HTTP_LUA_CONTEXT_BALANCER) == 0) {[m
[31m-        *err = "API disabled in the current context";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* we cannot read r->upstream->peer.data here directly because[m
[31m-     * it could be overridden by other modules like[m
[31m-     * ngx_http_upstream_keepalive_module.[m
[31m-     */[m
[31m-    bp = lmcf->balancer_peer_data;[m
[31m-    if (bp == NULL) {[m
[31m-        *err = "no upstream peer data found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.data = ngx_palloc(r->pool, addr_len);[m
[31m-    if (url.url.data == NULL) {[m
[31m-        *err = "no memory";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(url.url.data, addr, addr_len);[m
[31m-[m
[31m-    url.url.len = addr_len;[m
[31m-    url.default_port = (in_port_t) port;[m
[31m-    url.uri_part = 0;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            *err = url.err;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        bp->sockaddr = url.addrs[0].sockaddr;[m
[31m-        bp->socklen = url.addrs[0].socklen;[m
[31m-        bp->host = &url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        *err = "no host allowed";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_balancer_set_more_tries(ngx_http_request_t *r,[m
[31m-    int count, char **err)[m
[31m-{[m
[31m-#if (nginx_version >= 1007005)[m
[31m-    ngx_uint_t             max_tries;[m
[31m-#endif[m
[31m-    ngx_http_lua_ctx_t    *ctx;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t           *lmcf;[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp;[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        *err = "no request found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        *err = "no upstream found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *err = "no ctx found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->context & NGX_HTTP_LUA_CONTEXT_BALANCER) == 0) {[m
[31m-        *err = "API disabled in the current context";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    bp = lmcf->balancer_peer_data;[m
[31m-    if (bp == NULL) {[m
[31m-        *err = "no upstream peer data found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (nginx_version >= 1007005)[m
[31m-    max_tries = r->upstream->conf->next_upstream_tries;[m
[31m-[m
[31m-    if (bp->total_tries + count > max_tries) {[m
[31m-        count = max_tries - bp->total_tries;[m
[31m-        *err = "reduced tries due to limit";[m
[31m-[m
[31m-    } else {[m
[31m-        *err = NULL;[m
[31m-    }[m
[31m-#else[m
[31m-    *err = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    bp->more_tries = count;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_balancer_get_last_failure(ngx_http_request_t *r,[m
[31m-    int *status, char **err)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t         *ctx;[m
[31m-    ngx_http_upstream_t        *u;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp;[m
[31m-    ngx_http_lua_main_conf_t           *lmcf;[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        *err = "no request found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        *err = "no upstream found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *err = "no ctx found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->context & NGX_HTTP_LUA_CONTEXT_BALANCER) == 0) {[m
[31m-        *err = "API disabled in the current context";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    bp = lmcf->balancer_peer_data;[m
[31m-    if (bp == NULL) {[m
[31m-        *err = "no upstream peer data found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->upstream_states && r->upstream_states->nelts > 1) {[m
[31m-        state = r->upstream_states->elts;[m
[31m-        *status = (int) state[r->upstream_states->nelts - 2].status;[m
[31m-[m
[31m-    } else {[m
[31m-        *status = 0;[m
[31m-    }[m
[31m-[m
[31m-    return bp->last_peer_state;[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_LUA_NO_FFI_API */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_balancer.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_balancer.h[m
[1mdeleted file mode 100644[m
[1mindex bb49dc0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_balancer.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_BALANCER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_BALANCER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_balancer_handler_inline(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_balancer_handler_file(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L);[m
[31m-[m
[31m-char *ngx_http_lua_balancer_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-char *ngx_http_lua_balancer_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_BALANCER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.c[m
[1mdeleted file mode 100644[m
[1mindex 86e347e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.c[m
[1m+++ /dev/null[m
[36m@@ -1,633 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_bodyfilterby.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-[m
[31m-[m
[31m-static void ngx_http_lua_body_filter_by_lua_env(lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_chain_t *in);[m
[31m-static ngx_http_output_body_filter_pt ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-/* key for the ngx_chain_t *in pointer in the Lua thread */[m
[31m-#define ngx_http_lua_chain_key  "__ngx_cl"[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Set environment table for the given code closure.[m
[31m- *[m
[31m- * Before:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- *[m
[31m- * After:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- * */[m
[31m-static void[m
[31m-ngx_http_lua_body_filter_by_lua_env(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    /*  set nginx request pointer to current lua thread's globals table */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, in);[m
[31m-    lua_setglobal(L, ngx_http_lua_chain_key);[m
[31m-[m
[31m-    /**[m
[31m-     * we want to create empty environment for current script[m
[31m-     *[m
[31m-     * setmetatable({}, {__index = _G})[m
[31m-     *[m
[31m-     * if a function or symbol is not defined in our env, __index will lookup[m
[31m-     * in the global env.[m
[31m-     *[m
[31m-     * all variables created in the script-env will be thrown away at the end[m
[31m-     * of the script run.[m
[31m-     * */[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    lua_createtable(L, 0, 1 /* nrec */);    /*  the metatable for the new[m
[31m-                                                env */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable({}, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_body_filter_by_chunk(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t        rc;[m
[31m-    u_char          *err_msg;[m
[31m-    size_t           len;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t      *old_pool;[m
[31m-#endif[m
[31m-[m
[31m-    dd("initialize nginx context in Lua VM, code chunk at stack top  sp = 1");[m
[31m-    ngx_http_lua_body_filter_by_lua_env(L, r, in);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* XXX: work-around to nginx regex subsystem */[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-    lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-    dd("protected call user code");[m
[31m-    rc = lua_pcall(L, 0, 1, 1);[m
[31m-[m
[31m-    lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* XXX: work-around to nginx regex subsystem */[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-[m
[31m-        /*  error occured */[m
[31m-        err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-        if (err_msg == NULL) {[m
[31m-            err_msg = (u_char *) "unknown reason";[m
[31m-            len = sizeof("unknown reason") - 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "failed to run body_filter_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-        lua_settop(L, 0);    /*  clear remaining elems on stack */[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == 0 */[m
[31m-[m
[31m-    rc = (ngx_int_t) lua_tointeger(L, -1);[m
[31m-[m
[31m-    dd("got return value: %d", (int) rc);[m
[31m-[m
[31m-    lua_settop(L, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_body_filter_inline(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->body_filter_src.value.data,[m
[31m-                                       llcf->body_filter_src.value.len,[m
[31m-                                       llcf->body_filter_src_key,[m
[31m-                                       "=body_filter_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_body_filter_by_chunk(L, r, in);[m
[31m-[m
[31m-    dd("body filter by chunk returns %d", (int) rc);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_body_filter_file(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* Eval nginx variables in code path string first */[m
[31m-    if (ngx_http_complex_value(r, &llcf->body_filter_src, &eval_src)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->body_filter_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    rc = ngx_http_lua_body_filter_by_chunk(L, r, in);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    uint16_t                     old_context;[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-    lua_State                   *L;[m
[31m-    ngx_chain_t                 *out;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua body filter for user lua code, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->body_filter_handler == NULL) {[m
[31m-        dd("no body filter handler found");[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->seen_last_in_filter) {[m
[31m-        for (/* void */; in; in = in->next) {[m
[31m-            dd("mark the buf as consumed: %d", (int) ngx_buf_size(in->buf));[m
[31m-            in->buf->pos = in->buf->last;[m
[31m-            in->buf->file_pos = in->buf->file_last;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    old_context = ctx->context;[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_BODY_FILTER;[m
[31m-[m
[31m-    dd("calling body filter handler");[m
[31m-    rc = llcf->body_filter_handler(r, in);[m
[31m-[m
[31m-    dd("calling body filter handler returned %d", (int) rc);[m
[31m-[m
[31m-    ctx->context = old_context;[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    lua_getglobal(L, ngx_http_lua_chain_key);[m
[31m-    out = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (in == out) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        /* do not forward NULL to the next filters because the input is[m
[31m-         * not NULL */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* in != out */[m
[31m-    rc = ngx_http_next_body_filter(r, out);[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if nginx_version >= 1001004[m
[31m-    ngx_chain_update_chains(r->pool,[m
[31m-#else[m
[31m-    ngx_chain_update_chains([m
[31m-#endif[m
[31m-                            &ctx->free_bufs, &ctx->busy_bufs, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_lua_module);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_body_filter_init(void)[m
[31m-{[m
[31m-    dd("calling body filter init");[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_lua_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_body_filter_param_get(lua_State *L)[m
[31m-{[m
[31m-    u_char              *data, *p;[m
[31m-    size_t               size;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    ngx_buf_t           *b;[m
[31m-    int                  idx;[m
[31m-    ngx_chain_t         *in;[m
[31m-[m
[31m-    idx = luaL_checkint(L, 2);[m
[31m-[m
[31m-    dd("index: %d", idx);[m
[31m-[m
[31m-    if (idx != 1 && idx != 2) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_getglobal(L, ngx_http_lua_chain_key);[m
[31m-    in = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (idx == 2) {[m
[31m-        /* asking for the eof argument */[m
[31m-[m
[31m-        for (cl = in; cl; cl = cl->next) {[m
[31m-            if (cl->buf->last_buf || cl->buf->last_in_chain) {[m
[31m-                lua_pushboolean(L, 1);[m
[31m-                return 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        lua_pushboolean(L, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* idx == 1 */[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        /* being a cleared chain on the Lua land */[m
[31m-        lua_pushliteral(L, "");[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (in->next == NULL) {[m
[31m-[m
[31m-        dd("seen only single buffer");[m
[31m-[m
[31m-        b = in->buf;[m
[31m-        lua_pushlstring(L, (char *) b->pos, b->last - b->pos);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("seen multiple buffers");[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        size += b->last - b->pos;[m
[31m-[m
[31m-        if (b->last_buf || b->last_in_chain) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    data = (u_char *) lua_newuserdata(L, size);[m
[31m-[m
[31m-    for (p = data, cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-        p = ngx_copy(p, b->pos, b->last - b->pos);[m
[31m-[m
[31m-        if (b->last_buf || b->last_in_chain) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) data, size);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_body_filter_param_set(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    int                      type;[m
[31m-    int                      idx;[m
[31m-    int                      found;[m
[31m-    u_char                  *data;[m
[31m-    size_t                   size;[m
[31m-    unsigned                 last;[m
[31m-    unsigned                 flush = 0;[m
[31m-    ngx_buf_t               *b;[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_chain_t             *in;[m
[31m-[m
[31m-    idx = luaL_checkint(L, 2);[m
[31m-[m
[31m-    dd("index: %d", idx);[m
[31m-[m
[31m-    if (idx != 1 && idx != 2) {[m
[31m-        return luaL_error(L, "bad index: %d", idx);[m
[31m-    }[m
[31m-[m
[31m-    if (idx == 2) {[m
[31m-        /* overwriting the eof flag */[m
[31m-        last = lua_toboolean(L, 3);[m
[31m-[m
[31m-        lua_getglobal(L, ngx_http_lua_chain_key);[m
[31m-        in = lua_touserdata(L, -1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (last) {[m
[31m-            ctx->seen_last_in_filter = 1;[m
[31m-[m
[31m-            /* the "in" chain cannot be NULL and we set the "last_buf" or[m
[31m-             * "last_in_chain" flag in the last buf of "in" */[m
[31m-[m
[31m-            for (cl = in; cl; cl = cl->next) {[m
[31m-                if (cl->next == NULL) {[m
[31m-                    if (r == r->main) {[m
[31m-                        cl->buf->last_buf = 1;[m
[31m-[m
[31m-                    } else {[m
[31m-                        cl->buf->last_in_chain = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* last == 0 */[m
[31m-[m
[31m-            found = 0;[m
[31m-[m
[31m-            for (cl = in; cl; cl = cl->next) {[m
[31m-                b = cl->buf;[m
[31m-[m
[31m-                if (b->last_buf) {[m
[31m-                    b->last_buf = 0;[m
[31m-                    found = 1;[m
[31m-                }[m
[31m-[m
[31m-                if (b->last_in_chain) {[m
[31m-                    b->last_in_chain = 0;[m
[31m-                    found = 1;[m
[31m-                }[m
[31m-[m
[31m-                if (found && b->last == b->pos && !ngx_buf_in_memory(b)) {[m
[31m-                    /* make it a special sync buf to make[m
[31m-                     * ngx_http_write_filter_module happy. */[m
[31m-                    b->sync = 1;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ctx->seen_last_in_filter = 0;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    /* idx == 1, overwriting the chunk data */[m
[31m-[m
[31m-    type = lua_type(L, 3);[m
[31m-[m
[31m-    switch (type) {[m
[31m-    case LUA_TSTRING:[m
[31m-    case LUA_TNUMBER:[m
[31m-        data = (u_char *) lua_tolstring(L, 3, &size);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNIL:[m
[31m-        /* discard the buffers */[m
[31m-[m
[31m-        lua_getglobal(L, ngx_http_lua_chain_key); /* key val */[m
[31m-        in = lua_touserdata(L, -1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        last = 0;[m
[31m-[m
[31m-        for (cl = in; cl; cl = cl->next) {[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (b->flush) {[m
[31m-                flush = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (b->last_in_chain || b->last_buf) {[m
[31m-                last = 1;[m
[31m-            }[m
[31m-[m
[31m-            dd("mark the buf as consumed: %d", (int) ngx_buf_size(b));[m
[31m-            b->pos = b->last;[m
[31m-        }[m
[31m-[m
[31m-        /* cl == NULL */[m
[31m-[m
[31m-        goto done;[m
[31m-[m
[31m-    case LUA_TTABLE:[m
[31m-        size = ngx_http_lua_calc_strlen_in_table(L, 3 /* index */, 3 /* arg */,[m
[31m-                                                 1 /* strict */);[m
[31m-        data = NULL;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return luaL_error(L, "bad chunk data type: %s",[m
[31m-                          lua_typename(L, type));[m
[31m-    }[m
[31m-[m
[31m-    lua_getglobal(L, ngx_http_lua_chain_key);[m
[31m-    in = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (b->flush) {[m
[31m-            flush = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (b->last_buf || b->last_in_chain) {[m
[31m-            last = 1;[m
[31m-        }[m
[31m-[m
[31m-        dd("mark the buf as consumed: %d", (int) ngx_buf_size(cl->buf));[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-    }[m
[31m-[m
[31m-    /* cl == NULL */[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, size);[m
[31m-    if (cl == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    if (type == LUA_TTABLE) {[m
[31m-        cl->buf->last = ngx_http_lua_copy_str_in_table(L, 3, cl->buf->last);[m
[31m-[m
[31m-    } else {[m
[31m-        cl->buf->last = ngx_copy(cl->buf->pos, data, size);[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (last || flush) {[m
[31m-        if (cl == NULL) {[m
[31m-            cl = ngx_http_lua_chain_get_free_buf(r->connection->log,[m
[31m-                                                 r->pool,[m
[31m-                                                 &ctx->free_bufs, 0);[m
[31m-            if (cl == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (last) {[m
[31m-            ctx->seen_last_in_filter = 1;[m
[31m-[m
[31m-            if (r == r->main) {[m
[31m-                cl->buf->last_buf = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                cl->buf->last_in_chain = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (flush) {[m
[31m-            cl->buf->flush = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlightuserdata(L, cl);[m
[31m-    lua_setglobal(L, ngx_http_lua_chain_key);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.h[m
[1mdeleted file mode 100644[m
[1mindex 6a4b306..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_BODYFILTERBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_BODYFILTERBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_body_filter_pt ngx_http_lua_next_filter_body_filter;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_body_filter_init(void);[m
[31m-ngx_int_t ngx_http_lua_body_filter_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_chain_t *in);[m
[31m-ngx_int_t ngx_http_lua_body_filter_inline(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-ngx_int_t ngx_http_lua_body_filter_file(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-int ngx_http_lua_body_filter_param_get(lua_State *L);[m
[31m-int ngx_http_lua_body_filter_param_set(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_BODYFILTERBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_cache.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_cache.c[m
[1mdeleted file mode 100644[m
[1mindex e8a132e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_cache.c[m
[1m+++ /dev/null[m
[36m@@ -1,296 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_md5.h>[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_clfactory.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Find code chunk associated with the given key in code cache,[m
[31m- * and push it to the top of Lua stack if found.[m
[31m- *[m
[31m- * Stack layout before call:[m
[31m- *         |     ...    | <- top[m
[31m- *[m
[31m- * Stack layout after call:[m
[31m- *         | code chunk | <- top[m
[31m- *         |     ...    |[m
[31m- *[m
[31m- * */[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_cache_load_code(ngx_log_t *log, lua_State *L,[m
[31m-    const char *key)[m
[31m-{[m
[31m-    int          rc;[m
[31m-    u_char      *err;[m
[31m-[m
[31m-    /*  get code cache table */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_code_cache_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);    /*  sp++ */[m
[31m-[m
[31m-    dd("Code cache table to load: %p", lua_topointer(L, -1));[m
[31m-[m
[31m-    if (!lua_istable(L, -1)) {[m
[31m-        dd("Error: code cache table to load did not exist!!");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lua_getfield(L, -1, key);    /*  sp++ */[m
[31m-[m
[31m-    if (lua_isfunction(L, -1)) {[m
[31m-        /*  call closure factory to gen new closure */[m
[31m-        rc = lua_pcall(L, 0, 1, 0);[m
[31m-        if (rc == 0) {[m
[31m-            /*  remove cache table from stack, leave code chunk at[m
[31m-             *  top of stack */[m
[31m-            lua_remove(L, -2);   /*  sp-- */[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (lua_isstring(L, -1)) {[m
[31m-            err = (u_char *) lua_tostring(L, -1);[m
[31m-[m
[31m-        } else {[m
[31m-            err = (u_char *) "unknown error";[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "lua: failed to run factory at key \"%s\": %s",[m
[31m-                      key, err);[m
[31m-        lua_pop(L, 2);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("Value associated with given key in code cache table is not code "[m
[31m-       "chunk: stack top=%d, top value type=%s\n",[m
[31m-       lua_gettop(L), lua_typename(L, -1));[m
[31m-[m
[31m-    /*  remove cache table and value from stack */[m
[31m-    lua_pop(L, 2);                                /*  sp-=2 */[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Store the closure factory at the top of Lua stack to code cache, and[m
[31m- * associate it with the given key. Then generate new closure.[m
[31m- *[m
[31m- * Stack layout before call:[m
[31m- *         | code factory | <- top[m
[31m- *         |     ...      |[m
[31m- *[m
[31m- * Stack layout after call:[m
[31m- *         | code chunk | <- top[m
[31m- *         |     ...    |[m
[31m- *[m
[31m- * */[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_cache_store_code(lua_State *L, const char *key)[m
[31m-{[m
[31m-    int rc;[m
[31m-[m
[31m-    /*  get code cache table */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_code_cache_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    dd("Code cache table to store: %p", lua_topointer(L, -1));[m
[31m-[m
[31m-    if (!lua_istable(L, -1)) {[m
[31m-        dd("Error: code cache table to load did not exist!!");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushvalue(L, -2); /* closure cache closure */[m
[31m-    lua_setfield(L, -2, key); /* closure cache */[m
[31m-[m
[31m-    /*  remove cache table, leave closure factory at top of stack */[m
[31m-    lua_pop(L, 1); /* closure */[m
[31m-[m
[31m-    /*  call closure factory to generate new closure */[m
[31m-    rc = lua_pcall(L, 0, 1, 0);[m
[31m-    if (rc != 0) {[m
[31m-        dd("Error: failed to call closure factory!!");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_cache_loadbuffer(ngx_log_t *log, lua_State *L,[m
[31m-    const u_char *src, size_t src_len, const u_char *cache_key,[m
[31m-    const char *name)[m
[31m-{[m
[31m-    int          n;[m
[31m-    ngx_int_t    rc;[m
[31m-    const char  *err = NULL;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    dd("XXX cache key: [%s]", cache_key);[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_load_code(log, L, (char *) cache_key);[m
[31m-    if (rc == NGX_OK) {[m
[31m-        /*  code chunk loaded from cache, sp++ */[m
[31m-        dd("Code cache hit! cache key='%s', stack top=%d, script='%.*s'",[m
[31m-           cache_key, lua_gettop(L), (int) src_len, src);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    dd("Code cache missed! cache key='%s', stack top=%d, script='%.*s'",[m
[31m-       cache_key, lua_gettop(L), (int) src_len, src);[m
[31m-[m
[31m-    /* load closure factory of inline script to the top of lua stack, sp++ */[m
[31m-    rc = ngx_http_lua_clfactory_loadbuffer(L, (char *) src, src_len, name);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        /*  Oops! error occured when loading Lua script */[m
[31m-        if (rc == LUA_ERRMEM) {[m
[31m-            err = "memory allocation error";[m
[31m-[m
[31m-        } else {[m
[31m-            if (lua_isstring(L, -1)) {[m
[31m-                err = lua_tostring(L, -1);[m
[31m-[m
[31m-            } else {[m
[31m-                err = "unknown error";[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    /*  store closure factory and gen new closure at the top of lua stack to[m
[31m-     *  code cache */[m
[31m-    rc = ngx_http_lua_cache_store_code(L, (char *) cache_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        err = "fail to generate new closure from the closure factory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                  "failed to load inlined Lua code: %s", err);[m
[31m-    lua_settop(L, n);[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_cache_loadfile(ngx_log_t *log, lua_State *L,[m
[31m-    const u_char *script, const u_char *cache_key)[m
[31m-{[m
[31m-    int              n;[m
[31m-    ngx_int_t        rc, errcode = NGX_ERROR;[m
[31m-    u_char          *p;[m
[31m-    u_char           buf[NGX_HTTP_LUA_FILE_KEY_LEN + 1];[m
[31m-    const char      *err = NULL;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    /*  calculate digest of script file path */[m
[31m-    if (cache_key == NULL) {[m
[31m-        dd("CACHE file key not pre-calculated...calculating");[m
[31m-        p = ngx_copy(buf, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-[m
[31m-        p = ngx_http_lua_digest_hex(p, script, ngx_strlen(script));[m
[31m-[m
[31m-        *p = '\0';[m
[31m-        cache_key = buf;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("CACHE file key already pre-calculated");[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX cache key for file: [%s]", cache_key);[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_load_code(log, L, (char *) cache_key);[m
[31m-    if (rc == NGX_OK) {[m
[31m-        /*  code chunk loaded from cache, sp++ */[m
[31m-        dd("Code cache hit! cache key='%s', stack top=%d, file path='%s'",[m
[31m-           cache_key, lua_gettop(L), script);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    dd("Code cache missed! cache key='%s', stack top=%d, file path='%s'",[m
[31m-       cache_key, lua_gettop(L), script);[m
[31m-[m
[31m-    /*  load closure factory of script file to the top of lua stack, sp++ */[m
[31m-    rc = ngx_http_lua_clfactory_loadfile(L, (char *) script);[m
[31m-[m
[31m-    dd("loadfile returns %d (%d)", (int) rc, LUA_ERRFILE);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        /*  Oops! error occured when loading Lua script */[m
[31m-        switch (rc) {[m
[31m-        case LUA_ERRMEM:[m
[31m-            err = "memory allocation error";[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_ERRFILE:[m
[31m-            errcode = NGX_HTTP_NOT_FOUND;[m
[31m-            /* fall through */[m
[31m-[m
[31m-        default:[m
[31m-            if (lua_isstring(L, -1)) {[m
[31m-                err = lua_tostring(L, -1);[m
[31m-[m
[31m-            } else {[m
[31m-                err = "unknown error";[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    /*  store closure factory and gen new closure at the top of lua stack[m
[31m-     *  to code cache */[m
[31m-    rc = ngx_http_lua_cache_store_code(L, (char *) cache_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        err = "fail to generate new closure from the closure factory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                  "failed to load external Lua file \"%s\": %s", script, err);[m
[31m-[m
[31m-    lua_settop(L, n);[m
[31m-    return errcode;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_cache.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_cache.h[m
[1mdeleted file mode 100644[m
[1mindex 52e6d2c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_cache.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CACHE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CACHE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_cache_loadbuffer(ngx_log_t *log, lua_State *L,[m
[31m-    const u_char *src, size_t src_len, const u_char *cache_key,[m
[31m-    const char *name);[m
[31m-ngx_int_t ngx_http_lua_cache_loadfile(ngx_log_t *log, lua_State *L,[m
[31m-    const u_char *script, const u_char *cache_key);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CACHE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.c[m
[1mdeleted file mode 100644[m
[1mindex 5fe5f60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.c[m
[1m+++ /dev/null[m
[36m@@ -1,176 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_capturefilter.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_subrequest.h"[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt ngx_http_lua_next_header_filter;[m
[31m-ngx_http_output_body_filter_pt ngx_http_lua_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_capture_header_filter(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_capture_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_capture_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    /* setting up output filters to intercept subrequest responses */[m
[31m-    ngx_http_lua_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_lua_capture_header_filter;[m
[31m-[m
[31m-    ngx_http_lua_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_lua_capture_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_capture_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_post_subrequest_t      *psr;[m
[31m-    ngx_http_lua_ctx_t              *old_ctx;[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-[m
[31m-    ngx_http_lua_post_subrequest_data_t      *psr_data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua capture header filter, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("old ctx: %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL || ! ctx->capture) {[m
[31m-[m
[31m-        psr = r->post_subrequest;[m
[31m-[m
[31m-        if (psr != NULL[m
[31m-            && psr->handler == ngx_http_lua_post_subrequest[m
[31m-            && psr->data != NULL)[m
[31m-        {[m
[31m-            /* the lua ctx has been cleared by ngx_http_internal_redirect,[m
[31m-             * resume it from the post_subrequest data[m
[31m-             */[m
[31m-            psr_data = psr->data;[m
[31m-[m
[31m-            old_ctx = psr_data->ctx;[m
[31m-[m
[31m-            if (ctx == NULL) {[m
[31m-                ctx = old_ctx;[m
[31m-                ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua restoring ctx with capture %d, index %d",[m
[31m-                               old_ctx->capture, old_ctx->index);[m
[31m-[m
[31m-                ctx->capture = old_ctx->capture;[m
[31m-                ctx->index = old_ctx->index;[m
[31m-                ctx->body = NULL;[m
[31m-                ctx->last_body = &ctx->body;[m
[31m-                psr_data->ctx = ctx;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx && ctx->capture) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua capturing response body");[m
[31m-[m
[31m-        /* force subrequest response body buffer in memory */[m
[31m-        r->filter_need_in_memory = 1;[m
[31m-        r->header_sent = 1;[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_HEAD) {[m
[31m-            r->header_only = 1;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_capture_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    int                              rc;[m
[31m-    ngx_int_t                        eof;[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_http_lua_ctx_t              *pr_ctx;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua capture body filter, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_lua_next_body_filter(r, NULL);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (!ctx || !ctx->capture) {[m
[31m-        dd("no ctx or no capture %.*s", (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-        return ngx_http_lua_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->run_post_subrequest) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua body filter skipped because post subrequest "[m
[31m-                       "already run");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->parent == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua body filter skipped because no parent request "[m
[31m-                       "found");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr_ctx = ngx_http_get_module_ctx(r->parent, ngx_http_lua_module);[m
[31m-    if (pr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua capture body filter capturing response body, uri "[m
[31m-                   "\"%V\"", &r->uri);[m
[31m-[m
[31m-    rc = ngx_http_lua_add_copy_chain(r, pr_ctx, &ctx->last_body, in, &eof);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("add copy chain eof: %d, sr: %d", (int) eof, r != r->main);[m
[31m-[m
[31m-    if (eof) {[m
[31m-        ctx->seen_last_for_subreq = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_discard_bufs(r->pool, in);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.h[m
[1mdeleted file mode 100644[m
[1mindex 1e9d529..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CAPTUREFILTER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CAPTUREFILTER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_capture_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_LUA_CAPTUREFILTER_H */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.c[m
[1mdeleted file mode 100644[m
[1mindex 86885bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.c[m
[1m+++ /dev/null[m
[36m@@ -1,887 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_clfactory.h"[m
[31m-[m
[31m-[m
[31m-#define CLFACTORY_BEGIN_CODE "return function() "[m
[31m-#define CLFACTORY_BEGIN_SIZE (sizeof(CLFACTORY_BEGIN_CODE) - 1)[m
[31m-[m
[31m-#define CLFACTORY_END_CODE "\nend"[m
[31m-#define CLFACTORY_END_SIZE (sizeof(CLFACTORY_END_CODE) - 1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * taken from chaoslawful:[m
[31m- * Lua bytecode header        Luajit bytecode header[m
[31m- * --------------              --------------[m
[31m- * |  \033Lua   | 0-3          |  \033LJ    | 0-2[m
[31m- * --------------              --------------[m
[31m- * |    LuaC    | 4            |  bytecode  | 3[m
[31m- * |   Version  |              |   version  |[m
[31m- * --------------              --------------[m
[31m- * |    LuaC    | 5            |  misc flag | 4 [F|S|B][m
[31m- * |   Format   |              --------------[m
[31m- * --------------              |  chunkname | ULEB128 var-len[m
[31m- * |   Endian   | 6            |     len    | encoded uint32[m
[31m- * --------------              --------------[m
[31m- * |   size of  | 7            |  chunkname |[m
[31m- * |     int    |              |  str no \0 |[m
[31m- * --------------              --------------[m
[31m- * |   size of  | 8[m
[31m- * |    size_t  |[m
[31m- * --------------[m
[31m- * |   size of  | 9[m
[31m- * | instruction|[m
[31m- * --------------[m
[31m- * |   size of  | 10[m
[31m- * |   number   |[m
[31m- * --------------[m
[31m- * |   number   | 11[m
[31m- * |   is int?  |[m
[31m- * --------------[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * CLOSURE 0 0 RETURN 0 2 RETURN 0 1[m
[31m- * length(Instruction) = 4 or 8[m
[31m- * little endian or big endian[m
[31m-*/[m
[31m-#define    LUA_LITTLE_ENDIAN_4BYTES_CODE                                \[m
[31m-    "\x24\x00\x00\x00\x1e\x00\x00\x01\x1e\x00\x80\x00"[m
[31m-#define    LUA_LITTLE_ENDIAN_8BYTES_CODE                                \[m
[31m-    "\x24\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x01"                  \[m
[31m-    "\x00\x00\x00\x00\x1e\x00\x80\x00\x00\x00\x00\x00"[m
[31m-#define    LUA_BIG_ENDIAN_4BYTES_CODE                                   \[m
[31m-    "\x00\x00\x00\x24\x01\x00\x00\x1e\x00\x08\x00\x1e"[m
[31m-#define    LUA_BIG_ENDIAN_8BYTES_CODE                                   \[m
[31m-    "\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00"                  \[m
[31m-    "\x01\x00\x00\x1e\x00\x00\x00\x00\x00\x08\x00\x1e"[m
[31m-#define    LUA_LITTLE_ENDIAN_4BYTES_CODE_LEN        (4 + 4 + 4)[m
[31m-#define    LUA_LITTLE_ENDIAN_8BYTES_CODE_LEN        (8 + 8 + 8)[m
[31m-#define    LUA_BIG_ENDIAN_4BYTES_CODE_LEN           (4 + 4 + 4)[m
[31m-#define    LUA_BIG_ENDIAN_8BYTES_CODE_LEN           (8 + 8 + 8)[m
[31m-#define    LUAC_HEADERSIZE         12[m
[31m-#define    LUAC_VERSION            0x51[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * taken from chaoslawful:[m
[31m- *  Lua Proto[m
[31m- * ---------------------[m
[31m- * | String            | Can be empty string[m
[31m- * | [source]          | (stripped or internal function)[m
[31m- * ---------------------[m
[31m- * | Int               | At which line this function is defined[m
[31m- * | [linedefined]     |[m
[31m- * ---------------------[m
[31m- * | Int               | At while line this function definition ended[m
[31m- * | [lastlinedefined] |[m
[31m- * ---------------------[m
[31m- * | Char              | Number of upvalues referenced by this function[m
[31m- * | [nups]            |[m
[31m- * ---------------------[m
[31m- * | Char              | Number of paramters of this function[m
[31m- * | [numparams]       |[m
[31m- * ---------------------[m
[31m- * | Char              | Does this function has variable number of arguments?[m
[31m- * | [is_var_arg]      | main function always set to VARARG_ISVARARG (2)[m
[31m- * ---------------------[m
[31m- * | Char              | Maximum stack size this function used[m
[31m- * | [maxstacksize]    | Intially set to 2[m
[31m- * ---------------------[m
[31m- * | Vector(instr)     | Code instructions of this function[m
[31m- * | [code]            |[m
[31m- * ---------------------[m
[31m- * | Int               | Number of constants referenced by this function[m
[31m- * | [sizek]           |[m
[31m- * ---------------------[m
[31m- * | Char              | ------------------------------------[m
[31m- * | type of [k[i]]    |  The type and content of constants |[m
[31m- * ---------------------                                    |-> repeat for i in[m
[31m- * | Char if boolean   |  No content part if type is NIL    |   [1..sizek][m
[31m- * | Number if number  | ------------------------------------[m
[31m- * | String if string  |[m
[31m- * ---------------------[m
[31m- * | Int               | Number of internal functions[m
[31m- * | [sizep]           |[m
[31m- * ---------------------[m
[31m- * | Function          | -> repeat for i in [1..sizep][m
[31m- * | at [p[i]]         |[m
[31m- * ---------------------[m
[31m- * | Vector            | Debug lineinfo vector[m
[31m- * | [lineinfo]        | Empty vector here if dubug info is stripped[m
[31m- * ---------------------[m
[31m- * | Int               | Number of local variable in this function[m
[31m- * | [sizelocvars]     | 0 if debug info is stripped[m
[31m- * ---------------------[m
[31m- * | String            | ------------------------------------[m
[31m- * | [locvars[i]]      |  Name of local var i               |[m
[31m- * |  .varname]        |                                    |[m
[31m- * ---------------------                                    |[m
[31m- * | Int               |  instruction counter               |[m
[31m- * | [locvars[i]]      |  where lcoal var i start to be     |-> repeat for i in[m
[31m- * |  .startpc]        |  referenced                        |  [0..sizelocvars][m
[31m- * ---------------------                                    |[m
[31m- * | Int               |  instruction counter, where local  |[m
[31m- * | [locvars[i]]      |  var i ceased to be referenced     |[m
[31m- * |  .endpc]          | ------------------------------------[m
[31m- * ---------------------[m
[31m- * | Int               | Number of upvalues referenced by this function,[m
[31m- * | [sizeupvalues]    | 0 if stripped[m
[31m- * ---------------------[m
[31m- * | String            | -> repeat for i in[0..sizeupvalues][m
[31m- * | [upvalues[i]]     |[m
[31m- * ---------------------[m
[31m-*/[m
[31m-[m
[31m-#define    POS_SOURCE_STR_LEN      LUAC_HEADERSIZE[m
[31m-#define    POS_START_LINE          (POS_SOURCE_STR_LEN + sizeof(size_t))[m
[31m-#define    POS_LAST_LINE           (POS_START_LINE + sizeof(int))[m
[31m-#define    POS_NUM_OF_UPVS         (POS_LAST_LINE + sizeof(int))[m
[31m-#define    POS_NUM_OF_PARA         (POS_NUM_OF_UPVS + sizeof(char))[m
[31m-#define    POS_IS_VAR_ARG          (POS_NUM_OF_PARA + sizeof(char))[m
[31m-#define    POS_MAX_STACK_SIZE      (POS_IS_VAR_ARG + sizeof(char))[m
[31m-#define    POS_NUM_OF_INST         (POS_MAX_STACK_SIZE +sizeof(char))[m
[31m-#define    POS_BYTECODE            (POS_NUM_OF_INST + sizeof(int))[m
[31m-#define    MAX_BEGIN_CODE_SIZE                                              \[m
[31m-    (POS_BYTECODE + LUA_LITTLE_ENDIAN_8BYTES_CODE_LEN                       \[m
[31m-    + sizeof(int) + sizeof(int))[m
[31m-#define    MAX_END_CODE_SIZE       (sizeof(int) + sizeof(int) + sizeof(int))[m
[31m-[m
[31m-/*[m
[31m- * taken from chaoslawful:[m
[31m- * Luajit bytecode format[m
[31m- * ---------------------[m
[31m- * | HEAD              | Luajit bytecode head[m
[31m- * ---------------------[m
[31m- * | Internal          | All internal functions[m
[31m- * | functions         |[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Rest data total length of this function[m
[31m- * | [Date len of      | (not include itself)[m
[31m- * |  this function]   |[m
[31m- * ---------------------[m
[31m- * | Char              | F(ffi) | V(vararg)| C(has internal funcs)[m
[31m- * | [func flag]       |[m
[31m- * ---------------------[m
[31m- * | Char              | Number of paramters of this function[m
[31m- * | [numparams]       |[m
[31m- * ---------------------[m
[31m- * | Char              |[m
[31m- * | [framesize]       |[m
[31m- * ---------------------[m
[31m- * | Char              | Number of upvalues referenced by this function[m
[31m- * | [sizeupvalues]    |[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Number of collectable constants referenced[m
[31m- * | [sizekgc]         | by this function[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Number of lua number constants referenced[m
[31m- * | [sizekn]          | by this function[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Number of bytecode instructions of this function[m
[31m- * | [sizebc]m1        | minus 1 to omit the BC_FUNCV/BC_FUNCF header bytecode[m
[31m- * ---------------------[m
[31m- * | ULEB128           |[m
[31m- * | [size of dbg      | Size of debug lineinfo map, available when not stripped[m
[31m- * |  lineinfo]        |[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Available when not stripped[m
[31m- * | [firstline]       | The first line of this function's definition[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Available when not stripped[m
[31m- * | [numline]         | The number of lines of this function's definition[m
[31m- * ---------------------[m
[31m- * | [bytecode]        | Bytecode instructions of this function[m
[31m- * ---------------------[m
[31m- * |[upvalue ref slots]| [sizeupvalues] * 2[m
[31m- * ---------------------[m
[31m- * | [collectable      | [sizekgc] elems, variable length[m
[31m- * |  constants]       |[m
[31m- * ---------------------[m
[31m- * | [lua number       | [sizekn] elems, variable length[m
[31m- * |  constants]       |[m
[31m- * ---------------------[m
[31m- * | [debug lineinfo   | Length is the calculated size of debug lineinfo above[m
[31m- * |                   | Only available if not stripped[m
[31m- * ---------------------[m
[31m- * | Char              |[m
[31m- * | [\x00]            | Footer[m
[31m- * ---------------------[m
[31m-*/[m
[31m-[m
[31m-/* bytecode for luajit 2.0 */[m
[31m-[m
[31m-#define    LJ20_LITTLE_ENDIAN_CODE_STRIPPED                             \[m
[31m-    "\x14\x03\x00\x01\x00\x01\x00\x03"                                  \[m
[31m-    "\x31\x00\x00\x00\x30\x00\x00\x80\x48\x00\x02\x00"                  \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ20_BIG_ENDIAN_CODE_STRIPPED                                \[m
[31m-    "\x14\x03\x00\x01\x00\x01\x00\x03"                                  \[m
[31m-    "\x00\x00\x00\x31\x80\x00\x00\x30\x00\x02\x00\x48"                  \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ20_LITTLE_ENDIAN_CODE                                      \[m
[31m-    "\x15\x03\x00\x01\x00\x01\x00\x03\x00"                              \[m
[31m-    "\x31\x00\x00\x00\x30\x00\x00\x80\x48\x00\x02\x00"                  \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ20_BIG_ENDIAN_CODE                                         \[m
[31m-    "\x15\x03\x00\x01\x00\x01\x00\x03\x00"                              \[m
[31m-    "\x00\x00\x00\x31\x80\x00\x00\x30\x00\x02\x00\x48"                  \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-/* bytecode for luajit 2.1 */[m
[31m-[m
[31m-#define    LJ21_LITTLE_ENDIAN_CODE_STRIPPED                                  \[m
[31m-    "\x14\x03\x00\x01\x00\x01\x00\x03"                                       \[m
[31m-    "\x33\x00\x00\x00\x32\x00\x00\x80\x4c\x00\x02\x00"                       \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ21_BIG_ENDIAN_CODE_STRIPPED                                     \[m
[31m-    "\x14\x03\x00\x01\x00\x01\x00\x03"                                       \[m
[31m-    "\x00\x00\x00\x33\x80\x00\x00\x32\x00\x02\x00\x4c"                       \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ21_LITTLE_ENDIAN_CODE                                           \[m
[31m-    "\x15\x03\x00\x01\x00\x01\x00\x03\x00"                                   \[m
[31m-    "\x33\x00\x00\x00\x32\x00\x00\x80\x4c\x00\x02\x00"                       \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ21_BIG_ENDIAN_CODE                                              \[m
[31m-    "\x15\x03\x00\x01\x00\x01\x00\x03\x00"                                   \[m
[31m-    "\x00\x00\x00\x33\x80\x00\x00\x32\x00\x02\x00\x4c"                       \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ_CODE_LEN              23[m
[31m-#define    LJ_CODE_LEN_STRIPPED     22[m
[31m-#define    LJ_HEADERSIZE            5[m
[31m-#define    LJ_BCDUMP_F_BE           0x01[m
[31m-#define    LJ_BCDUMP_F_STRIP        0x02[m
[31m-#define    LJ21_BCDUMP_VERSION        2[m
[31m-#define    LJ20_BCDUMP_VERSION        1[m
[31m-#define    LJ_SIGNATURE             "\x1b\x4c\x4a"[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_LUA_TEXT_FILE,[m
[31m-    NGX_LUA_BT_LUA,[m
[31m-    NGX_LUA_BT_LJ[m
[31m-} ngx_http_lua_clfactory_file_type_e;[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NGX_LUA_READER_BUFSIZE = 4096[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_clfactory_file_type_e file_type;[m
[31m-[m
[31m-    int         sent_begin;[m
[31m-    int         sent_end;[m
[31m-    int         extraline;[m
[31m-    FILE       *f;[m
[31m-    size_t      begin_code_len;[m
[31m-    size_t      end_code_len;[m
[31m-    size_t      rest_len;[m
[31m-    union {[m
[31m-        char   *ptr;[m
[31m-        char    str[MAX_BEGIN_CODE_SIZE];[m
[31m-    }           begin_code;[m
[31m-    union {[m
[31m-        char   *ptr;[m
[31m-        char    str[MAX_END_CODE_SIZE];[m
[31m-    }           end_code;[m
[31m-    char        buff[NGX_LUA_READER_BUFSIZE];[m
[31m-} ngx_http_lua_clfactory_file_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int         sent_begin;[m
[31m-    int         sent_end;[m
[31m-    const char *s;[m
[31m-    size_t      size;[m
[31m-} ngx_http_lua_clfactory_buffer_ctx_t;[m
[31m-[m
[31m-[m
[31m-static const char *ngx_http_lua_clfactory_getF(lua_State *L, void *ud,[m
[31m-    size_t *size);[m
[31m-static int ngx_http_lua_clfactory_errfile(lua_State *L, const char *what,[m
[31m-    int fname_index);[m
[31m-static const char *ngx_http_lua_clfactory_getS(lua_State *L, void *ud,[m
[31m-    size_t *size);[m
[31m-static long ngx_http_lua_clfactory_file_size(FILE *f);[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_clfactory_bytecode_prepare(lua_State *L,[m
[31m-    ngx_http_lua_clfactory_file_ctx_t *lf, int fname_index)[m
[31m-{[m
[31m-    int                 x = 1, size_of_int, size_of_size_t, little_endian,[m
[31m-                        size_of_inst, version, stripped;[m
[31m-    static int          num_of_inst = 3, num_of_inter_func = 1;[m
[31m-    const char         *emsg, *serr, *bytecode;[m
[31m-    size_t              size, bytecode_len;[m
[31m-    long                fsize;[m
[31m-[m
[31m-    serr = NULL;[m
[31m-[m
[31m-    *lf->begin_code.str = LUA_SIGNATURE[0];[m
[31m-[m
[31m-    if (lf->file_type == NGX_LUA_BT_LJ) {[m
[31m-        size = fread(lf->begin_code.str + 1, 1, LJ_HEADERSIZE - 1, lf->f);[m
[31m-[m
[31m-        if (size != LJ_HEADERSIZE - 1) {[m
[31m-            serr = strerror(errno);[m
[31m-            emsg = "cannot read header";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        version = *(lf->begin_code.str + 3);[m
[31m-[m
[31m-        dd("version: %d", (int) version);[m
[31m-[m
[31m-        if (ngx_memcmp(lf->begin_code.str, LJ_SIGNATURE,[m
[31m-                       sizeof(LJ_SIGNATURE) - 1))[m
[31m-        {[m
[31m-            emsg = "bad byte-code header";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        dd("==LJ_BT_HEADER==");[m
[31m-        size_t i;[m
[31m-        for (i = 0; i < LJ_HEADERSIZE; i++) {[m
[31m-            dd("%ld: 0x%02X", i, (unsigned)(u_char) lf->begin_code.str[i]);[m
[31m-        }[m
[31m-        dd("==LJ_BT_HEADER_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        lf->begin_code_len = LJ_HEADERSIZE;[m
[31m-        little_endian = !((*(lf->begin_code.str + 4)) & LJ_BCDUMP_F_BE);[m
[31m-        stripped = (*(lf->begin_code.str + 4)) & LJ_BCDUMP_F_STRIP;[m
[31m-[m
[31m-        dd("stripped: %d", (int) stripped);[m
[31m-[m
[31m-        if (version == LJ21_BCDUMP_VERSION) {[m
[31m-            if (stripped) {[m
[31m-                if (little_endian) {[m
[31m-                    lf->end_code.ptr = LJ21_LITTLE_ENDIAN_CODE_STRIPPED;[m
[31m-[m
[31m-                } else {[m
[31m-                    lf->end_code.ptr = LJ21_BIG_ENDIAN_CODE_STRIPPED;[m
[31m-                }[m
[31m-[m
[31m-                lf->end_code_len = LJ_CODE_LEN_STRIPPED;[m
[31m-[m
[31m-            } else {[m
[31m-                if (little_endian) {[m
[31m-                    lf->end_code.ptr = LJ21_LITTLE_ENDIAN_CODE;[m
[31m-[m
[31m-                } else {[m
[31m-                    lf->end_code.ptr = LJ21_BIG_ENDIAN_CODE;[m
[31m-                }[m
[31m-[m
[31m-                lf->end_code_len = LJ_CODE_LEN;[m
[31m-            }[m
[31m-[m
[31m-        } else if (version == LJ20_BCDUMP_VERSION) {[m
[31m-            if (stripped) {[m
[31m-                if (little_endian) {[m
[31m-                    lf->end_code.ptr = LJ20_LITTLE_ENDIAN_CODE_STRIPPED;[m
[31m-[m
[31m-                } else {[m
[31m-                    lf->end_code.ptr = LJ20_BIG_ENDIAN_CODE_STRIPPED;[m
[31m-                }[m
[31m-[m
[31m-                lf->end_code_len = LJ_CODE_LEN_STRIPPED;[m
[31m-[m
[31m-            } else {[m
[31m-                if (little_endian) {[m
[31m-                    lf->end_code.ptr = LJ20_LITTLE_ENDIAN_CODE;[m
[31m-[m
[31m-                } else {[m
[31m-                    lf->end_code.ptr = LJ20_BIG_ENDIAN_CODE;[m
[31m-                }[m
[31m-[m
[31m-                lf->end_code_len = LJ_CODE_LEN;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            emsg = "bytecode format version unsupported";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        fsize = ngx_http_lua_clfactory_file_size(lf->f);[m
[31m-        if (fsize < 0) {[m
[31m-            serr = strerror(errno);[m
[31m-            emsg = "cannot fseek/ftell";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        lf->rest_len = fsize - LJ_HEADERSIZE;[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        size_t i = 0;[m
[31m-        dd("==LJ_END_CODE: %ld rest_len: %ld==", lf->end_code_len,[m
[31m-           lf->rest_len);[m
[31m-[m
[31m-        for (i = 0; i < lf->end_code_len; i++) {[m
[31m-            dd("%ld: 0x%02X", i, (unsigned) ((u_char) lf->end_code.ptr[i]));[m
[31m-        }[m
[31m-        dd("==LJ_END_CODE_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        size = fread(lf->begin_code.str + 1, 1, LUAC_HEADERSIZE - 1, lf->f);[m
[31m-[m
[31m-        if (size != LUAC_HEADERSIZE - 1) {[m
[31m-            serr = strerror(errno);[m
[31m-            emsg = "cannot read header";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        version = *(lf->begin_code.str + 4);[m
[31m-        little_endian = *(lf->begin_code.str + 6);[m
[31m-        size_of_int = *(lf->begin_code.str + 7);[m
[31m-        size_of_size_t = *(lf->begin_code.str + 8);[m
[31m-        size_of_inst = *(lf->begin_code.str + 9);[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        dd("==LUA_BT_HEADER==");[m
[31m-        size_t i;[m
[31m-        for (i = 0; i < LUAC_HEADERSIZE; i++) {[m
[31m-            dd("%ld, 0x%02X", i, (unsigned)(u_char) lf->begin_code.str[i]);[m
[31m-        }[m
[31m-        dd("==LUA_BT_HEADER_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_memcmp(lf->begin_code.str, LUA_SIGNATURE,[m
[31m-                       sizeof(LUA_SIGNATURE) -1)[m
[31m-            || version != LUAC_VERSION[m
[31m-            || little_endian != (int) (*(char *) &x)[m
[31m-            || size_of_int != sizeof(int)[m
[31m-            || size_of_size_t != sizeof(size_t)[m
[31m-            || (size_of_inst != 4 && size_of_inst != 8))[m
[31m-        {[m
[31m-            emsg = "bad byte-code header";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        /* clear the following fields to zero:[m
[31m-         * - source string length[m
[31m-         * - start line[m
[31m-         * - last line[m
[31m-         */[m
[31m-        ngx_memzero(lf->begin_code.str + POS_SOURCE_STR_LEN,[m
[31m-                    sizeof(size_t) + sizeof(int) * 2);[m
[31m-        /* number of upvalues */[m
[31m-        *(lf->begin_code.str + POS_NUM_OF_UPVS) = 0;[m
[31m-        /* number of paramters */[m
[31m-        *(lf->begin_code.str + POS_NUM_OF_PARA) = 0;[m
[31m-        /* is var-argument function? */[m
[31m-        *(lf->begin_code.str + POS_IS_VAR_ARG) = 2;[m
[31m-        /* max stack size */[m
[31m-        *(lf->begin_code.str + POS_MAX_STACK_SIZE) = 2;[m
[31m-        /* number of bytecode instructions */[m
[31m-        ngx_memcpy(lf->begin_code.str + POS_NUM_OF_INST, &num_of_inst,[m
[31m-                   sizeof(int));[m
[31m-[m
[31m-        lf->begin_code_len = POS_BYTECODE;[m
[31m-[m
[31m-        if (little_endian) {[m
[31m-            if (size_of_inst == 4) {[m
[31m-                bytecode = LUA_LITTLE_ENDIAN_4BYTES_CODE;[m
[31m-                bytecode_len = LUA_LITTLE_ENDIAN_4BYTES_CODE_LEN;[m
[31m-[m
[31m-            } else {[m
[31m-                bytecode = LUA_LITTLE_ENDIAN_8BYTES_CODE;[m
[31m-                bytecode_len = LUA_LITTLE_ENDIAN_8BYTES_CODE_LEN;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (size_of_inst == 4) {[m
[31m-                bytecode = LUA_BIG_ENDIAN_4BYTES_CODE;[m
[31m-                bytecode_len = LUA_BIG_ENDIAN_4BYTES_CODE_LEN;[m
[31m-[m
[31m-            } else {[m
[31m-                bytecode = LUA_BIG_ENDIAN_8BYTES_CODE;[m
[31m-                bytecode_len = LUA_BIG_ENDIAN_8BYTES_CODE_LEN;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* bytecode */[m
[31m-        ngx_memcpy(lf->begin_code.str + POS_BYTECODE, bytecode, bytecode_len);[m
[31m-[m
[31m-        /* number of consts */[m
[31m-        ngx_memzero(lf->begin_code.str + POS_BYTECODE + bytecode_len,[m
[31m-                    sizeof(int));[m
[31m-        /* number of internal functions */[m
[31m-        ngx_memcpy(lf->begin_code.str + POS_BYTECODE + bytecode_len[m
[31m-                   + sizeof(int), &num_of_inter_func, sizeof(int));[m
[31m-[m
[31m-        lf->begin_code_len += bytecode_len + sizeof(int) + sizeof(int);[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        size_t i = 0;[m
[31m-        dd("==LUA_BEGIN_CODE: %ld==", lf->begin_code_len);[m
[31m-        for (i = 0; i < lf->begin_code_len; i++) {[m
[31m-            dd("%ld: 0x%02X", i, (unsigned) ((u_char) lf->begin_code.str[i]));[m
[31m-        }[m
[31m-        dd("==LUA_BEGIN_CODE_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        /* clear the following fields to zero:[m
[31m-         * - lineinfo vector size[m
[31m-         * - number of local vars[m
[31m-         * - number of upvalues[m
[31m-         */[m
[31m-        ngx_memzero(lf->end_code.str, sizeof(int) * 3);[m
[31m-[m
[31m-        lf->end_code_len = sizeof(int) + sizeof(int) + sizeof(int);[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        size_t i = 0;[m
[31m-        dd("==LUA_END_CODE: %ld==", lf->end_code_len);[m
[31m-        for (i = 0; i < lf->end_code_len; i++) {[m
[31m-            dd("%ld: 0x%02X", i, (unsigned) ((u_char) lf->end_code.str[i]));[m
[31m-        }[m
[31m-        dd("==LUA_END_CODE_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    fclose(lf->f);  /* close file (even in case of errors) */[m
[31m-[m
[31m-    if (serr) {[m
[31m-        lua_pushfstring(L, "%s: %s", emsg, serr);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushstring(L, emsg);[m
[31m-    }[m
[31m-[m
[31m-    lua_remove(L, fname_index);[m
[31m-[m
[31m-    return LUA_ERRFILE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_clfactory_loadfile(lua_State *L, const char *filename)[m
[31m-{[m
[31m-    int                         c, status, readstatus;[m
[31m-    ngx_flag_t                  sharp;[m
[31m-[m
[31m-    ngx_http_lua_clfactory_file_ctx_t        lf;[m
[31m-[m
[31m-    /* index of filename on the stack */[m
[31m-    int                         fname_index;[m
[31m-[m
[31m-    sharp = 0;[m
[31m-    fname_index = lua_gettop(L) + 1;[m
[31m-[m
[31m-    lf.extraline = 0;[m
[31m-    lf.file_type = NGX_LUA_TEXT_FILE;[m
[31m-[m
[31m-    lf.begin_code.ptr = CLFACTORY_BEGIN_CODE;[m
[31m-    lf.begin_code_len = CLFACTORY_BEGIN_SIZE;[m
[31m-    lf.end_code.ptr = CLFACTORY_END_CODE;[m
[31m-    lf.end_code_len = CLFACTORY_END_SIZE;[m
[31m-[m
[31m-    lua_pushfstring(L, "@%s", filename);[m
[31m-[m
[31m-    lf.f = fopen(filename, "r");[m
[31m-    if (lf.f == NULL) {[m
[31m-        return ngx_http_lua_clfactory_errfile(L, "open", fname_index);[m
[31m-    }[m
[31m-[m
[31m-    c = getc(lf.f);[m
[31m-[m
[31m-    if (c == '#') {  /* Unix exec. file? */[m
[31m-        lf.extraline = 1;[m
[31m-[m
[31m-        while ((c = getc(lf.f)) != EOF && c != '\n') {[m
[31m-            /* skip first line */[m
[31m-        }[m
[31m-[m
[31m-        if (c == '\n') {[m
[31m-            c = getc(lf.f);[m
[31m-        }[m
[31m-[m
[31m-        sharp = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */[m
[31m-        lf.f = freopen(filename, "rb", lf.f);  /* reopen in binary mode */[m
[31m-[m
[31m-        if (lf.f == NULL) {[m
[31m-            return ngx_http_lua_clfactory_errfile(L, "reopen", fname_index);[m
[31m-        }[m
[31m-[m
[31m-        /* check whether lib jit exists */[m
[31m-        luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);[m
[31m-        lua_getfield(L, -1, "jit");  /* get _LOADED["jit"] */[m
[31m-[m
[31m-        if (lua_istable(L, -1)) {[m
[31m-            lf.file_type = NGX_LUA_BT_LJ;[m
[31m-[m
[31m-        } else {[m
[31m-            lf.file_type = NGX_LUA_BT_LUA;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 2);[m
[31m-[m
[31m-        /*[m
[31m-         * Loading bytecode with an extra header is disabled for security[m
[31m-         * reasons. This may circumvent the usual check for bytecode vs.[m
[31m-         * Lua code by looking at the first char. Since this is a potential[m
[31m-         * security violation no attempt is made to echo the chunkname either.[m
[31m-         */[m
[31m-        if (lf.file_type == NGX_LUA_BT_LJ && sharp) {[m
[31m-[m
[31m-            if (filename) {[m
[31m-                fclose(lf.f);  /* close file (even in case of errors) */[m
[31m-            }[m
[31m-[m
[31m-            filename = lua_tostring(L, fname_index) + 1;[m
[31m-            lua_pushfstring(L, "bad byte-code header in %s", filename);[m
[31m-            lua_remove(L, fname_index);[m
[31m-[m
[31m-            return LUA_ERRFILE;[m
[31m-        }[m
[31m-[m
[31m-        while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) {[m
[31m-            /* skip eventual `#!...' */[m
[31m-        }[m
[31m-[m
[31m-        status = ngx_http_lua_clfactory_bytecode_prepare(L, &lf, fname_index);[m
[31m-[m
[31m-        if (status != 0) {[m
[31m-            return status;[m
[31m-        }[m
[31m-[m
[31m-        lf.extraline = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (lf.file_type == NGX_LUA_TEXT_FILE) {[m
[31m-        ungetc(c, lf.f);[m
[31m-    }[m
[31m-[m
[31m-    lf.sent_begin = lf.sent_end = 0;[m
[31m-    status = lua_load(L, ngx_http_lua_clfactory_getF, &lf,[m
[31m-                      lua_tostring(L, -1));[m
[31m-[m
[31m-    readstatus = ferror(lf.f);[m
[31m-[m
[31m-    if (filename) {[m
[31m-        fclose(lf.f);  /* close file (even in case of errors) */[m
[31m-    }[m
[31m-[m
[31m-    if (readstatus) {[m
[31m-        lua_settop(L, fname_index);  /* ignore results from `lua_load' */[m
[31m-        return ngx_http_lua_clfactory_errfile(L, "read", fname_index);[m
[31m-    }[m
[31m-[m
[31m-    lua_remove(L, fname_index);[m
[31m-[m
[31m-    return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_clfactory_loadbuffer(lua_State *L, const char *buff,[m
[31m-    size_t size, const char *name)[m
[31m-{[m
[31m-    ngx_http_lua_clfactory_buffer_ctx_t     ls;[m
[31m-[m
[31m-    ls.s = buff;[m
[31m-    ls.size = size;[m
[31m-    ls.sent_begin = 0;[m
[31m-    ls.sent_end = 0;[m
[31m-[m
[31m-    return lua_load(L, ngx_http_lua_clfactory_getS, &ls, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *[m
[31m-ngx_http_lua_clfactory_getF(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-    char                        *buf;[m
[31m-    size_t                       num;[m
[31m-[m
[31m-    ngx_http_lua_clfactory_file_ctx_t        *lf;[m
[31m-[m
[31m-    lf = (ngx_http_lua_clfactory_file_ctx_t *) ud;[m
[31m-[m
[31m-    if (lf->extraline) {[m
[31m-        lf->extraline = 0;[m
[31m-        *size = 1;[m
[31m-        return "\n";[m
[31m-    }[m
[31m-[m
[31m-    if (lf->sent_begin == 0) {[m
[31m-        lf->sent_begin = 1;[m
[31m-        *size = lf->begin_code_len;[m
[31m-[m
[31m-        if (lf->file_type == NGX_LUA_TEXT_FILE) {[m
[31m-            buf = lf->begin_code.ptr;[m
[31m-[m
[31m-        } else {[m
[31m-            buf = lf->begin_code.str;[m
[31m-        }[m
[31m-[m
[31m-        return buf;[m
[31m-    }[m
[31m-[m
[31m-    num = fread(lf->buff, 1, sizeof(lf->buff), lf->f);[m
[31m-[m
[31m-    dd("fread returned %d", (int) num);[m
[31m-[m
[31m-    if (num == 0) {[m
[31m-        if (lf->sent_end == 0) {[m
[31m-            lf->sent_end = 1;[m
[31m-            *size = lf->end_code_len;[m
[31m-[m
[31m-            if (lf->file_type == NGX_LUA_BT_LUA) {[m
[31m-                buf = lf->end_code.str;[m
[31m-[m
[31m-            } else {[m
[31m-                buf = lf->end_code.ptr;[m
[31m-            }[m
[31m-[m
[31m-            return buf;[m
[31m-        }[m
[31m-[m
[31m-        *size = 0;[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (lf->file_type == NGX_LUA_BT_LJ) {[m
[31m-        /* skip the footer(\x00) in luajit */[m
[31m-[m
[31m-        lf->rest_len -= num;[m
[31m-[m
[31m-        if (lf->rest_len == 0) {[m
[31m-            if (--num == 0 && lf->sent_end == 0) {[m
[31m-                lf->sent_end = 1;[m
[31m-                buf = lf->end_code.ptr;[m
[31m-                *size = lf->end_code_len;[m
[31m-[m
[31m-                return buf;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *size = num;[m
[31m-    return lf->buff;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_clfactory_errfile(lua_State *L, const char *what, int fname_index)[m
[31m-{[m
[31m-    const char      *serr;[m
[31m-    const char      *filename;[m
[31m-[m
[31m-    filename = lua_tostring(L, fname_index) + 1;[m
[31m-[m
[31m-    if (errno) {[m
[31m-        serr = strerror(errno);[m
[31m-        lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushfstring(L, "cannot %s %s", what, filename);[m
[31m-    }[m
[31m-[m
[31m-    lua_remove(L, fname_index);[m
[31m-[m
[31m-    return LUA_ERRFILE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *[m
[31m-ngx_http_lua_clfactory_getS(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-    ngx_http_lua_clfactory_buffer_ctx_t      *ls = ud;[m
[31m-[m
[31m-    if (ls->sent_begin == 0) {[m
[31m-        ls->sent_begin = 1;[m
[31m-        *size = CLFACTORY_BEGIN_SIZE;[m
[31m-[m
[31m-        return CLFACTORY_BEGIN_CODE;[m
[31m-    }[m
[31m-[m
[31m-    if (ls->size == 0) {[m
[31m-        if (ls->sent_end == 0) {[m
[31m-            ls->sent_end = 1;[m
[31m-            *size = CLFACTORY_END_SIZE;[m
[31m-            return CLFACTORY_END_CODE;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *size = ls->size;[m
[31m-    ls->size = 0;[m
[31m-[m
[31m-    return ls->s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static long[m
[31m-ngx_http_lua_clfactory_file_size(FILE *f)[m
[31m-{[m
[31m-    long              cur_pos, len;[m
[31m-[m
[31m-    cur_pos = ftell(f);[m
[31m-    if (cur_pos == -1) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (fseek(f, 0, SEEK_END) != 0) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    len = ftell(f);[m
[31m-    if (len == -1) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (fseek(f, cur_pos, SEEK_SET) != 0) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.h[m
[1mdeleted file mode 100644[m
[1mindex 806d8af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CLFACTORY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CLFACTORY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_clfactory_loadfile(lua_State *L, const char *filename);[m
[31m-ngx_int_t ngx_http_lua_clfactory_loadbuffer(lua_State *L, const char *buff,[m
[31m-    size_t size, const char *name);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CLFACTORY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_common.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_common.h[m
[1mdeleted file mode 100644[m
[1mindex 758c42a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_common.h[m
[1m+++ /dev/null[m
[36m@@ -1,541 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_COMMON_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_COMMON_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_md5.h>[m
[31m-[m
[31m-#include <setjmp.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-#include <lua.h>[m
[31m-#include <lualib.h>[m
[31m-#include <lauxlib.h>[m
[31m-[m
[31m-[m
[31m-#if !defined(nginx_version) || (nginx_version < 1006000)[m
[31m-#error at least nginx 1.6.0 is required but found an older version[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-#include <ndk.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if LUA_VERSION_NUM != 501[m
[31m-#   error unsupported Lua language version[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (!defined OPENSSL_NO_OCSP && defined SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB)[m
[31m-#   define NGX_HTTP_LUA_USE_OCSP 1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef MD5_DIGEST_LENGTH[m
[31m-#define MD5_DIGEST_LENGTH 16[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-#   include <assert.h>[m
[31m-#   define ngx_http_lua_assert(a)  assert(a)[m
[31m-#else[m
[31m-#   define ngx_http_lua_assert(a)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* Nginx HTTP Lua Inline tag prefix */[m
[31m-[m
[31m-#define NGX_HTTP_LUA_INLINE_TAG "nhli_"[m
[31m-[m
[31m-#define NGX_HTTP_LUA_INLINE_TAG_LEN \[m
[31m-    (sizeof(NGX_HTTP_LUA_INLINE_TAG) - 1)[m
[31m-[m
[31m-#define NGX_HTTP_LUA_INLINE_KEY_LEN \[m
[31m-    (NGX_HTTP_LUA_INLINE_TAG_LEN + 2 * MD5_DIGEST_LENGTH)[m
[31m-[m
[31m-/* Nginx HTTP Lua File tag prefix */[m
[31m-[m
[31m-#define NGX_HTTP_LUA_FILE_TAG "nhlf_"[m
[31m-[m
[31m-#define NGX_HTTP_LUA_FILE_TAG_LEN \[m
[31m-    (sizeof(NGX_HTTP_LUA_FILE_TAG) - 1)[m
[31m-[m
[31m-#define NGX_HTTP_LUA_FILE_KEY_LEN \[m
[31m-    (NGX_HTTP_LUA_FILE_TAG_LEN + 2 * MD5_DIGEST_LENGTH)[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-typedef struct {[m
[31m-    size_t       size;[m
[31m-    u_char      *key;[m
[31m-    ngx_str_t    script;[m
[31m-} ngx_http_lua_set_var_data_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_MAX_ARGS[m
[31m-#define NGX_HTTP_LUA_MAX_ARGS 100[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_MAX_HEADERS[m
[31m-#define NGX_HTTP_LUA_MAX_HEADERS 100[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* must be within 16 bit */[m
[31m-#define NGX_HTTP_LUA_CONTEXT_SET            0x001[m
[31m-#define NGX_HTTP_LUA_CONTEXT_REWRITE        0x002[m
[31m-#define NGX_HTTP_LUA_CONTEXT_ACCESS         0x004[m
[31m-#define NGX_HTTP_LUA_CONTEXT_CONTENT        0x008[m
[31m-#define NGX_HTTP_LUA_CONTEXT_LOG            0x010[m
[31m-#define NGX_HTTP_LUA_CONTEXT_HEADER_FILTER  0x020[m
[31m-#define NGX_HTTP_LUA_CONTEXT_BODY_FILTER    0x040[m
[31m-#define NGX_HTTP_LUA_CONTEXT_TIMER          0x080[m
[31m-#define NGX_HTTP_LUA_CONTEXT_INIT_WORKER    0x100[m
[31m-#define NGX_HTTP_LUA_CONTEXT_BALANCER       0x200[m
[31m-#define NGX_HTTP_LUA_CONTEXT_SSL_CERT       0x400[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-#define NGX_HTTP_LUA_FFI_NO_REQ_CTX         -100[m
[31m-#define NGX_HTTP_LUA_FFI_BAD_CONTEXT        -101[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_main_conf_s  ngx_http_lua_main_conf_t;[m
[31m-typedef union ngx_http_lua_srv_conf_u  ngx_http_lua_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_balancer_peer_data_s[m
[31m-    ngx_http_lua_balancer_peer_data_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_sema_mm_s  ngx_http_lua_sema_mm_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_lua_main_conf_handler_pt)(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-typedef ngx_int_t (*ngx_http_lua_srv_conf_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char              *package;[m
[31m-    lua_CFunction        loader;[m
[31m-} ngx_http_lua_preload_hook_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_main_conf_s {[m
[31m-    lua_State           *lua;[m
[31m-[m
[31m-    ngx_str_t            lua_path;[m
[31m-    ngx_str_t            lua_cpath;[m
[31m-[m
[31m-    ngx_cycle_t         *cycle;[m
[31m-    ngx_pool_t          *pool;[m
[31m-[m
[31m-    ngx_int_t            max_pending_timers;[m
[31m-    ngx_int_t            pending_timers;[m
[31m-[m
[31m-    ngx_int_t            max_running_timers;[m
[31m-    ngx_int_t            running_timers;[m
[31m-[m
[31m-    ngx_connection_t    *watcher;  /* for watching the process exit event */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t            regex_cache_entries;[m
[31m-    ngx_int_t            regex_cache_max_entries;[m
[31m-    ngx_int_t            regex_match_limit;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t         *shm_zones;  /* of ngx_shm_zone_t* */[m
[31m-[m
[31m-    ngx_array_t         *preload_hooks; /* of ngx_http_lua_preload_hook_t */[m
[31m-[m
[31m-    ngx_flag_t           postponed_to_rewrite_phase_end;[m
[31m-    ngx_flag_t           postponed_to_access_phase_end;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_handler_pt    init_handler;[m
[31m-    ngx_str_t                            init_src;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_handler_pt    init_worker_handler;[m
[31m-    ngx_str_t                            init_worker_src;[m
[31m-[m
[31m-    ngx_http_lua_balancer_peer_data_t      *balancer_peer_data;[m
[31m-                    /* balancer_by_lua does not support yielding and[m
[31m-                     * there cannot be any conflicts among concurrent requests,[m
[31m-                     * thus it is safe to store the peer data in the main conf.[m
[31m-                     */[m
[31m-[m
[31m-    ngx_uint_t                      shm_zones_inited;[m
[31m-[m
[31m-    ngx_http_lua_sema_mm_t         *sema_mm;[m
[31m-[m
[31m-    unsigned             requires_header_filter:1;[m
[31m-    unsigned             requires_body_filter:1;[m
[31m-    unsigned             requires_capture_filter:1;[m
[31m-    unsigned             requires_rewrite:1;[m
[31m-    unsigned             requires_access:1;[m
[31m-    unsigned             requires_log:1;[m
[31m-    unsigned             requires_shm:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-union ngx_http_lua_srv_conf_u {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    struct {[m
[31m-        ngx_http_lua_srv_conf_handler_pt     cert_handler;[m
[31m-        ngx_str_t                            cert_src;[m
[31m-        u_char                              *cert_src_key;[m
[31m-    } ssl;[m
[31m-#endif[m
[31m-[m
[31m-    struct {[m
[31m-        ngx_str_t           src;[m
[31m-        u_char             *src_key;[m
[31m-[m
[31m-        ngx_http_lua_srv_conf_handler_pt  handler;[m
[31m-    } balancer;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_ssl_t              *ssl;  /* shared by SSL cosockets */[m
[31m-    ngx_uint_t              ssl_protocols;[m
[31m-    ngx_str_t               ssl_ciphers;[m
[31m-    ngx_uint_t              ssl_verify_depth;[m
[31m-    ngx_str_t               ssl_trusted_certificate;[m
[31m-    ngx_str_t               ssl_crl;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_flag_t              force_read_body; /* whether force request body to[m
[31m-                                                be read */[m
[31m-[m
[31m-    ngx_flag_t              enable_code_cache; /* whether to enable[m
[31m-                                                  code cache */[m
[31m-[m
[31m-    ngx_flag_t              http10_buffering;[m
[31m-[m
[31m-    ngx_http_handler_pt     rewrite_handler;[m
[31m-    ngx_http_handler_pt     access_handler;[m
[31m-    ngx_http_handler_pt     content_handler;[m
[31m-    ngx_http_handler_pt     log_handler;[m
[31m-    ngx_http_handler_pt     header_filter_handler;[m
[31m-[m
[31m-    ngx_http_output_body_filter_pt         body_filter_handler;[m
[31m-[m
[31m-    u_char                  *rewrite_chunkname;[m
[31m-    ngx_http_complex_value_t rewrite_src;    /*  rewrite_by_lua[m
[31m-                                                inline script/script[m
[31m-                                                file path */[m
[31m-[m
[31m-    u_char                  *rewrite_src_key; /* cached key for rewrite_src */[m
[31m-[m
[31m-    u_char                  *access_chunkname;[m
[31m-    ngx_http_complex_value_t access_src;     /*  access_by_lua[m
[31m-                                                inline script/script[m
[31m-                                                file path */[m
[31m-[m
[31m-    u_char                  *access_src_key; /* cached key for access_src */[m
[31m-[m
[31m-    u_char                  *content_chunkname;[m
[31m-    ngx_http_complex_value_t content_src;    /*  content_by_lua[m
[31m-                                                inline script/script[m
[31m-                                                file path */[m
[31m-[m
[31m-    u_char                 *content_src_key; /* cached key for content_src */[m
[31m-[m
[31m-[m
[31m-    u_char                      *log_chunkname;[m
[31m-    ngx_http_complex_value_t     log_src;     /* log_by_lua inline script/script[m
[31m-                                                 file path */[m
[31m-[m
[31m-    u_char                      *log_src_key; /* cached key for log_src */[m
[31m-[m
[31m-    ngx_http_complex_value_t header_filter_src;  /*  header_filter_by_lua[m
[31m-                                                     inline script/script[m
[31m-                                                     file path */[m
[31m-[m
[31m-    u_char                 *header_filter_src_key;[m
[31m-                                    /* cached key for header_filter_src */[m
[31m-[m
[31m-[m
[31m-    ngx_http_complex_value_t         body_filter_src;[m
[31m-    u_char                          *body_filter_src_key;[m
[31m-[m
[31m-    ngx_msec_t                       keepalive_timeout;[m
[31m-    ngx_msec_t                       connect_timeout;[m
[31m-    ngx_msec_t                       send_timeout;[m
[31m-    ngx_msec_t                       read_timeout;[m
[31m-[m
[31m-    size_t                           send_lowat;[m
[31m-    size_t                           buffer_size;[m
[31m-[m
[31m-    ngx_uint_t                       pool_size;[m
[31m-[m
[31m-    ngx_flag_t                       transform_underscores_in_resp_headers;[m
[31m-    ngx_flag_t                       log_socket_errors;[m
[31m-    ngx_flag_t                       check_client_abort;[m
[31m-    ngx_flag_t                       use_default_type;[m
[31m-} ngx_http_lua_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_LUA_USER_CORO_NOP      = 0,[m
[31m-    NGX_HTTP_LUA_USER_CORO_RESUME   = 1,[m
[31m-    NGX_HTTP_LUA_USER_CORO_YIELD    = 2,[m
[31m-    NGX_HTTP_LUA_USER_THREAD_RESUME = 3[m
[31m-} ngx_http_lua_user_coro_op_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_LUA_CO_RUNNING   = 0, /* coroutine running */[m
[31m-    NGX_HTTP_LUA_CO_SUSPENDED = 1, /* coroutine suspended */[m
[31m-    NGX_HTTP_LUA_CO_NORMAL    = 2, /* coroutine normal */[m
[31m-    NGX_HTTP_LUA_CO_DEAD      = 3, /* coroutine dead */[m
[31m-    NGX_HTTP_LUA_CO_ZOMBIE    = 4, /* coroutine zombie */[m
[31m-} ngx_http_lua_co_status_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_co_ctx_s  ngx_http_lua_co_ctx_t;[m
[31m-[m
[31m-typedef struct ngx_http_lua_posted_thread_s  ngx_http_lua_posted_thread_t;[m
[31m-[m
[31m-struct ngx_http_lua_posted_thread_s {[m
[31m-    ngx_http_lua_co_ctx_t               *co_ctx;[m
[31m-    ngx_http_lua_posted_thread_t        *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NGX_HTTP_LUA_SUBREQ_TRUNCATED = 1[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_co_ctx_s {[m
[31m-    void                    *data;      /* user state for cosockets */[m
[31m-[m
[31m-    lua_State               *co;[m
[31m-    ngx_http_lua_co_ctx_t   *parent_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_posted_thread_t    *zombie_child_threads;[m
[31m-[m
[31m-    ngx_http_cleanup_pt      cleanup;[m
[31m-[m
[31m-    ngx_int_t               *sr_statuses; /* all capture subrequest statuses */[m
[31m-[m
[31m-    ngx_http_headers_out_t **sr_headers;[m
[31m-[m
[31m-    ngx_str_t               *sr_bodies;   /* all captured subrequest bodies */[m
[31m-[m
[31m-    uint8_t                 *sr_flags;[m
[31m-[m
[31m-    unsigned                 nsubreqs;  /* number of subrequests of the[m
[31m-                                         * current request */[m
[31m-[m
[31m-    unsigned                 pending_subreqs; /* number of subrequests being[m
[31m-                                                 waited */[m
[31m-[m
[31m-    ngx_event_t              sleep;  /* used for ngx.sleep */[m
[31m-[m
[31m-    ngx_queue_t              sem_wait_queue;[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    int                      co_top; /* stack top after yielding/creation,[m
[31m-                                        only for sanity checks */[m
[31m-#endif[m
[31m-[m
[31m-    int                      co_ref; /*  reference to anchor the thread[m
[31m-                                         coroutines (entry coroutine and user[m
[31m-                                         threads) in the Lua registry,[m
[31m-                                         preventing the thread coroutine[m
[31m-                                         from beging collected by the[m
[31m-                                         Lua GC */[m
[31m-[m
[31m-    unsigned                 waited_by_parent:1;  /* whether being waited by[m
[31m-                                                     a parent coroutine */[m
[31m-[m
[31m-    unsigned                 co_status:3;  /* the current coroutine's status */[m
[31m-[m
[31m-    unsigned                 flushing:1; /* indicates whether the current[m
[31m-                                            coroutine is waiting for[m
[31m-                                            ngx.flush(true) */[m
[31m-[m
[31m-    unsigned                 is_uthread:1; /* whether the current coroutine is[m
[31m-                                              a user thread */[m
[31m-[m
[31m-    unsigned                 thread_spawn_yielded:1; /* yielded from[m
[31m-                                                        the ngx.thread.spawn()[m
[31m-                                                        call */[m
[31m-    unsigned                 sem_resume_status:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    lua_State       *vm;[m
[31m-    ngx_int_t        count;[m
[31m-} ngx_http_lua_vm_state_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_ctx_s {[m
[31m-    /* for lua_coce_cache off: */[m
[31m-    ngx_http_lua_vm_state_t  *vm_state;[m
[31m-[m
[31m-    ngx_http_request_t      *request;[m
[31m-    ngx_http_handler_pt      resume_handler;[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t   *cur_co_ctx; /* co ctx for the current coroutine */[m
[31m-[m
[31m-    /* FIXME: we should use rbtree here to prevent O(n) lookup overhead */[m
[31m-    ngx_list_t              *user_co_ctx; /* coroutine contexts for user[m
[31m-                                             coroutines */[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t    entry_co_ctx; /* coroutine context for the[m
[31m-                                              entry coroutine */[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t   *on_abort_co_ctx; /* coroutine context for the[m
[31m-                                                 on_abort thread */[m
[31m-[m
[31m-    int                      ctx_ref;  /*  reference to anchor[m
[31m-                                           request ctx data in lua[m
[31m-                                           registry */[m
[31m-[m
[31m-    unsigned                 flushing_coros; /* number of coroutines waiting on[m
[31m-                                                ngx.flush(true) */[m
[31m-[m
[31m-    ngx_chain_t             *out;  /* buffered output chain for HTTP 1.0 */[m
[31m-    ngx_chain_t             *free_bufs;[m
[31m-    ngx_chain_t             *busy_bufs;[m
[31m-    ngx_chain_t             *free_recv_bufs;[m
[31m-[m
[31m-    ngx_http_cleanup_pt     *cleanup;[m
[31m-[m
[31m-    ngx_http_cleanup_t      *free_cleanup; /* free list of cleanup records */[m
[31m-[m
[31m-    ngx_chain_t             *body; /* buffered subrequest response body[m
[31m-                                      chains */[m
[31m-[m
[31m-    ngx_chain_t            **last_body; /* for the "body" field */[m
[31m-[m
[31m-    ngx_str_t                exec_uri;[m
[31m-    ngx_str_t                exec_args;[m
[31m-[m
[31m-    ngx_int_t                exit_code;[m
[31m-[m
[31m-    void                    *downstream;  /* can be either[m
[31m-                                             ngx_http_lua_socket_tcp_upstream_t[m
[31m-                                             or ngx_http_lua_co_ctx_t */[m
[31m-[m
[31m-    ngx_uint_t               index;              /* index of the current[m
[31m-                                                    subrequest in its parent[m
[31m-                                                    request */[m
[31m-[m
[31m-    ngx_http_lua_posted_thread_t   *posted_threads;[m
[31m-[m
[31m-    int                      uthreads; /* number of active user threads */[m
[31m-[m
[31m-    uint16_t                 context;   /* the current running directive context[m
[31m-                                           (or running phase) for the current[m
[31m-                                           Lua chunk */[m
[31m-[m
[31m-    unsigned                 run_post_subrequest:1; /* whether it has run[m
[31m-                                                       post_subrequest[m
[31m-                                                       (for subrequests only) */[m
[31m-[m
[31m-    unsigned                 waiting_more_body:1;   /* 1: waiting for more[m
[31m-                                                       request body data;[m
[31m-                                                       0: no need to wait */[m
[31m-[m
[31m-    unsigned         co_op:2; /*  coroutine API operation */[m
[31m-[m
[31m-    unsigned         exited:1;[m
[31m-[m
[31m-    unsigned         eof:1;             /*  1: last_buf has been sent;[m
[31m-                                            0: last_buf not sent yet */[m
[31m-[m
[31m-    unsigned         capture:1;  /*  1: response body of current request[m
[31m-                                        is to be captured by the lua[m
[31m-                                        capture filter,[m
[31m-                                     0: not to be captured */[m
[31m-[m
[31m-[m
[31m-    unsigned         read_body_done:1;      /* 1: request body has been all[m
[31m-                                               read; 0: body has not been[m
[31m-                                               all read */[m
[31m-[m
[31m-    unsigned         headers_set:1; /* whether the user has set custom[m
[31m-                                       response headers */[m
[31m-[m
[31m-    unsigned         entered_rewrite_phase:1;[m
[31m-    unsigned         entered_access_phase:1;[m
[31m-    unsigned         entered_content_phase:1;[m
[31m-[m
[31m-    unsigned         buffering:1; /* HTTP 1.0 response body buffering flag */[m
[31m-[m
[31m-    unsigned         no_abort:1; /* prohibit "world abortion" via ngx.exit()[m
[31m-                                    and etc */[m
[31m-[m
[31m-    unsigned         header_sent:1; /* r->header_sent is not sufficient for[m
[31m-                                     * this because special header filters[m
[31m-                                     * like ngx_image_filter may intercept[m
[31m-                                     * the header. so we should always test[m
[31m-                                     * both flags. see the test case in[m
[31m-                                     * t/020-subrequest.t */[m
[31m-[m
[31m-    unsigned         seen_last_in_filter:1;  /* used by body_filter_by_lua* */[m
[31m-    unsigned         seen_last_for_subreq:1; /* used by body capture filter */[m
[31m-    unsigned         writing_raw_req_socket:1; /* used by raw downstream[m
[31m-                                                  socket */[m
[31m-    unsigned         acquired_raw_req_socket:1;  /* whether a raw req socket[m
[31m-                                                    is acquired */[m
[31m-    unsigned         seen_body_data:1;[m
[31m-} ngx_http_lua_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_header_val_s  ngx_http_lua_header_val_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_lua_set_header_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_header_val_s {[m
[31m-    ngx_http_complex_value_t                value;[m
[31m-    ngx_uint_t                              hash;[m
[31m-    ngx_str_t                               key;[m
[31m-    ngx_http_lua_set_header_pt              handler;[m
[31m-    ngx_uint_t                              offset;[m
[31m-    unsigned                                no_override;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                               name;[m
[31m-    ngx_uint_t                              offset;[m
[31m-    ngx_http_lua_set_header_pt              handler;[m
[31m-[m
[31m-} ngx_http_lua_set_header_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t ngx_http_lua_module;[m
[31m-extern ngx_http_output_header_filter_pt ngx_http_lua_next_header_filter;[m
[31m-extern ngx_http_output_body_filter_pt ngx_http_lua_next_body_filter;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_COMMON_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_config.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_config.c[m
[1mdeleted file mode 100644[m
[1mindex 3323175..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_config.c[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_config.h"[m
[31m-#include "api/ngx_http_lua_api.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_config_prefix(lua_State *L);[m
[31m-static int ngx_http_lua_config_configure(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_config_api(lua_State *L)[m
[31m-{[m
[31m-    /* ngx.config */[m
[31m-[m
[31m-    lua_createtable(L, 0, 6 /* nrec */);    /* .config */[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    lua_pushboolean(L, 1);[m
[31m-#else[m
[31m-    lua_pushboolean(L, 0);[m
[31m-#endif[m
[31m-    lua_setfield(L, -2, "debug");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_config_prefix);[m
[31m-    lua_setfield(L, -2, "prefix");[m
[31m-[m
[31m-    lua_pushinteger(L, nginx_version);[m
[31m-    lua_setfield(L, -2, "nginx_version");[m
[31m-[m
[31m-    lua_pushinteger(L, ngx_http_lua_version);[m
[31m-    lua_setfield(L, -2, "ngx_lua_version");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_config_configure);[m
[31m-    lua_setfield(L, -2, "nginx_configure");[m
[31m-[m
[31m-    lua_pushliteral(L, "http");[m
[31m-    lua_setfield(L, -2, "subsystem");[m
[31m-[m
[31m-    lua_setfield(L, -2, "config");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_config_prefix(lua_State *L)[m
[31m-{[m
[31m-    lua_pushlstring(L, (char *) ngx_cycle->prefix.data,[m
[31m-                    ngx_cycle->prefix.len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_config_configure(lua_State *L)[m
[31m-{[m
[31m-    lua_pushliteral(L, NGX_CONFIGURE);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_config.h[m
[1mdeleted file mode 100644[m
[1mindex 9f85f31..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_config_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CONFIG_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_consts.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_consts.c[m
[1mdeleted file mode 100644[m
[1mindex 30a86f1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_consts.c[m
[1m+++ /dev/null[m
[36m@@ -1,199 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_core_consts(lua_State *L)[m
[31m-{[m
[31m-    /* {{{ core constants */[m
[31m-    lua_pushinteger(L, NGX_OK);[m
[31m-    lua_setfield(L, -2, "OK");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_AGAIN);[m
[31m-    lua_setfield(L, -2, "AGAIN");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_DONE);[m
[31m-    lua_setfield(L, -2, "DONE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_DECLINED);[m
[31m-    lua_setfield(L, -2, "DECLINED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_ERROR);[m
[31m-    lua_setfield(L, -2, "ERROR");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, NULL);[m
[31m-    lua_setfield(L, -2, "null");[m
[31m-    /* }}} */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_http_consts(lua_State *L)[m
[31m-{[m
[31m-    /* {{{ HTTP status constants */[m
[31m-    lua_pushinteger(L, NGX_HTTP_GET);[m
[31m-    lua_setfield(L, -2, "HTTP_GET");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_POST);[m
[31m-    lua_setfield(L, -2, "HTTP_POST");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PUT);[m
[31m-    lua_setfield(L, -2, "HTTP_PUT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_HEAD);[m
[31m-    lua_setfield(L, -2, "HTTP_HEAD");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_DELETE);[m
[31m-    lua_setfield(L, -2, "HTTP_DELETE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_OPTIONS);[m
[31m-    lua_setfield(L, -2, "HTTP_OPTIONS");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_MKCOL);[m
[31m-    lua_setfield(L, -2, "HTTP_MKCOL");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_COPY);[m
[31m-    lua_setfield(L, -2, "HTTP_COPY");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_MOVE);[m
[31m-    lua_setfield(L, -2, "HTTP_MOVE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PROPFIND);[m
[31m-    lua_setfield(L, -2, "HTTP_PROPFIND");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PROPPATCH);[m
[31m-    lua_setfield(L, -2, "HTTP_PROPPATCH");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_LOCK);[m
[31m-    lua_setfield(L, -2, "HTTP_LOCK");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_UNLOCK);[m
[31m-    lua_setfield(L, -2, "HTTP_UNLOCK");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PATCH);[m
[31m-    lua_setfield(L, -2, "HTTP_PATCH");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_TRACE);[m
[31m-    lua_setfield(L, -2, "HTTP_TRACE");[m
[31m-    /* }}} */[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_CONTINUE);[m
[31m-    lua_setfield(L, -2, "HTTP_CONTINUE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_SWITCHING_PROTOCOLS);[m
[31m-    lua_setfield(L, -2, "HTTP_SWITCHING_PROTOCOLS");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_OK);[m
[31m-    lua_setfield(L, -2, "HTTP_OK");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_CREATED);[m
[31m-    lua_setfield(L, -2, "HTTP_CREATED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_ACCEPTED);[m
[31m-    lua_setfield(L, -2, "HTTP_ACCEPTED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NO_CONTENT);[m
[31m-    lua_setfield(L, -2, "HTTP_NO_CONTENT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PARTIAL_CONTENT);[m
[31m-    lua_setfield(L, -2, "HTTP_PARTIAL_CONTENT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_SPECIAL_RESPONSE);[m
[31m-    lua_setfield(L, -2, "HTTP_SPECIAL_RESPONSE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_MOVED_PERMANENTLY);[m
[31m-    lua_setfield(L, -2, "HTTP_MOVED_PERMANENTLY");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_MOVED_TEMPORARILY);[m
[31m-    lua_setfield(L, -2, "HTTP_MOVED_TEMPORARILY");[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8042[m
[31m-    lua_pushinteger(L, NGX_HTTP_SEE_OTHER);[m
[31m-    lua_setfield(L, -2, "HTTP_SEE_OTHER");[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NOT_MODIFIED);[m
[31m-    lua_setfield(L, -2, "HTTP_NOT_MODIFIED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_TEMPORARY_REDIRECT);[m
[31m-    lua_setfield(L, -2, "HTTP_TEMPORARY_REDIRECT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_BAD_REQUEST);[m
[31m-    lua_setfield(L, -2, "HTTP_BAD_REQUEST");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_UNAUTHORIZED);[m
[31m-    lua_setfield(L, -2, "HTTP_UNAUTHORIZED");[m
[31m-[m
[31m-    lua_pushinteger(L, 402);[m
[31m-    lua_setfield(L, -2, "HTTP_PAYMENT_REQUIRED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_FORBIDDEN);[m
[31m-    lua_setfield(L, -2, "HTTP_FORBIDDEN");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NOT_FOUND);[m
[31m-    lua_setfield(L, -2, "HTTP_NOT_FOUND");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NOT_ALLOWED);[m
[31m-    lua_setfield(L, -2, "HTTP_NOT_ALLOWED");[m
[31m-[m
[31m-    lua_pushinteger(L, 406);[m
[31m-    lua_setfield(L, -2, "HTTP_NOT_ACCEPTABLE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-    lua_setfield(L, -2, "HTTP_REQUEST_TIMEOUT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_CONFLICT);[m
[31m-    lua_setfield(L, -2, "HTTP_CONFLICT");[m
[31m-[m
[31m-    lua_pushinteger(L, 410);[m
[31m-    lua_setfield(L, -2, "HTTP_GONE");[m
[31m-[m
[31m-    lua_pushinteger(L, 426);[m
[31m-    lua_setfield(L, -2, "HTTP_UPGRADE_REQUIRED");[m
[31m-[m
[31m-    lua_pushinteger(L, 429);[m
[31m-    lua_setfield(L, -2, "HTTP_TOO_MANY_REQUESTS");[m
[31m-[m
[31m-    lua_pushinteger(L, 451);[m
[31m-    lua_setfield(L, -2, "HTTP_ILLEGAL");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_CLOSE);[m
[31m-    lua_setfield(L, -2, "HTTP_CLOSE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-    lua_setfield(L, -2, "HTTP_INTERNAL_SERVER_ERROR");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NOT_IMPLEMENTED);[m
[31m-    lua_setfield(L, -2, "HTTP_METHOD_NOT_IMPLEMENTED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_BAD_GATEWAY);[m
[31m-    lua_setfield(L, -2, "HTTP_BAD_GATEWAY");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-    lua_setfield(L, -2, "HTTP_SERVICE_UNAVAILABLE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-    lua_setfield(L, -2, "HTTP_GATEWAY_TIMEOUT");[m
[31m-[m
[31m-    lua_pushinteger(L, 505);[m
[31m-    lua_setfield(L, -2, "HTTP_VERSION_NOT_SUPPORTED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_INSUFFICIENT_STORAGE);[m
[31m-    lua_setfield(L, -2, "HTTP_INSUFFICIENT_STORAGE");[m
[31m-[m
[31m-    /* }}} */[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_consts.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_consts.h[m
[1mdeleted file mode 100644[m
[1mindex c403f81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_consts.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CONSTS_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CONSTS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_http_consts(lua_State *L);[m
[31m-void ngx_http_lua_inject_core_consts(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CONSTS_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_contentby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_contentby.c[m
[1mdeleted file mode 100644[m
[1mindex 6718885..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_contentby.c[m
[1m+++ /dev/null[m
[36m@@ -1,379 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-static void ngx_http_lua_content_phase_post_read(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                      co_ref;[m
[31m-    ngx_int_t                rc;[m
[31m-    lua_State               *co;[m
[31m-    ngx_event_t             *rev;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_cleanup_t      *cln;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t      *llcf;[m
[31m-[m
[31m-    dd("content by chunk");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        dd("reset ctx");[m
[31m-        ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-    }[m
[31m-[m
[31m-    ctx->entered_content_phase = 1;[m
[31m-[m
[31m-    /*  {{{ new coroutine to handle request */[m
[31m-    co = ngx_http_lua_new_thread(r, L, &co_ref);[m
[31m-[m
[31m-    if (co == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua: failed to create new coroutine to handle request");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  move code closure to new coroutine */[m
[31m-    lua_xmove(L, co, 1);[m
[31m-[m
[31m-    /*  set closure's env table to new coroutine's globals table */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /*  save nginx request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(co, r);[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-    ctx->cur_co_ctx->co = co;[m
[31m-    ctx->cur_co_ctx->co_ref = co_ref;[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /*  {{{ register request cleanup hooks */[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_CONTENT;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->check_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if (!rev->active) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_content_run_posted_threads(L, r, ctx, 0);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        return ngx_http_lua_content_run_posted_threads(L, r, ctx, 1);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_content_wev_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    (void) ctx->resume_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua content handler, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->content_handler == NULL) {[m
[31m-        dd("no content handler found");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("entered? %d", (int) ctx->entered_content_phase);[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        dd("calling wev handler");[m
[31m-        rc = ctx->resume_handler(r);[m
[31m-        dd("wev handler returns %d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->force_read_body && !ctx->read_body_done) {[m
[31m-        r->request_body_in_single_buf = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r,[m
[31m-                                        ngx_http_lua_content_phase_post_read);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            ctx->waiting_more_body = 1;[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("setting entered");[m
[31m-[m
[31m-    ctx->entered_content_phase = 1;[m
[31m-[m
[31m-    dd("calling content handler");[m
[31m-    return llcf->content_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* post read callback for the content phase */[m
[31m-static void[m
[31m-ngx_http_lua_content_phase_post_read(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    ctx->read_body_done = 1;[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        ctx->waiting_more_body = 0;[m
[31m-        ngx_http_lua_finalize_request(r, ngx_http_lua_content_handler(r));[m
[31m-[m
[31m-    } else {[m
[31m-        r->main->count--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_handler_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &llcf->content_src, &eval_src) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->content_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc < NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_content_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_handler_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->content_src.value.data,[m
[31m-                                       llcf->content_src.value.len,[m
[31m-                                       llcf->content_src_key,[m
[31m-                                       (const char *)[m
[31m-                                       llcf->content_chunkname);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_content_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_run_posted_threads(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, int n)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_lua_posted_thread_t    *pt;[m
[31m-[m
[31m-    dd("run posted threads: %p", ctx->posted_threads);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        pt = ctx->posted_threads;[m
[31m-        if (pt == NULL) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        ctx->posted_threads = pt->next;[m
[31m-[m
[31m-        ngx_http_lua_probe_run_posted_thread(r, pt->co_ctx->co,[m
[31m-                                             (int) pt->co_ctx->co_status);[m
[31m-[m
[31m-        dd("posted thread status: %d", pt->co_ctx->co_status);[m
[31m-[m
[31m-        if (pt->co_ctx->co_status != NGX_HTTP_LUA_CO_RUNNING) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ctx->cur_co_ctx = pt->co_ctx;[m
[31m-[m
[31m-        rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            while (n > 0) {[m
[31m-                ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-                n--;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_ERROR || rc > NGX_OK */[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        r->main->count++;[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    /* n > 1 */[m
[31m-[m
[31m-    do {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-    } while (--n > 1);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_contentby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_contentby.h[m
[1mdeleted file mode 100644[m
[1mindex 58ba8e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_contentby.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CONTENT_BY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CONTENT_BY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_content_by_chunk(lua_State *L, ngx_http_request_t *r);[m
[31m-void ngx_http_lua_content_wev_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_content_handler_file(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_content_handler_inline(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_content_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_content_run_posted_threads(lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx, int n);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CONTENT_BY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_control.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_control.c[m
[1mdeleted file mode 100644[m
[1mindex 4c5f65e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_control.c[m
[1m+++ /dev/null[m
[36m@@ -1,533 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_control.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_coroutine.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_exec(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_redirect(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_exit(lua_State *L);[m
[31m-static int ngx_http_lua_on_abort(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_control_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    /* ngx.redirect */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_redirect);[m
[31m-    lua_setfield(L, -2, "redirect");[m
[31m-[m
[31m-    /* ngx.exec */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_exec);[m
[31m-    lua_setfield(L, -2, "exec");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_exit);[m
[31m-    lua_setfield(L, -2, "throw_error"); /* deprecated */[m
[31m-[m
[31m-    /* ngx.exit */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_exit);[m
[31m-    lua_setfield(L, -2, "exit");[m
[31m-[m
[31m-    /* ngx.on_abort */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_on_abort);[m
[31m-    lua_setfield(L, -2, "on_abort");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_exec(lua_State *L)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_str_t                    uri;[m
[31m-    ngx_str_t                    args, user_args;[m
[31m-    ngx_uint_t                   flags;[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *q;[m
[31m-    size_t                       len;[m
[31m-    const char                  *msg;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting one or two arguments, but got %d",[m
[31m-                          n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_null(&args);[m
[31m-[m
[31m-    /* read the 1st argument (uri) */[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return luaL_error(L, "The uri argument is empty");[m
[31m-    }[m
[31m-[m
[31m-    uri.data = ngx_palloc(r->pool, len);[m
[31m-    if (uri.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(uri.data, p, len);[m
[31m-[m
[31m-    uri.len = len;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    ngx_http_lua_check_if_abortable(L, ctx);[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        /* read the 2nd argument (args) */[m
[31m-        dd("args type: %s", luaL_typename(L, 2));[m
[31m-[m
[31m-        switch (lua_type(L, 2)) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            p = (u_char *) lua_tolstring(L, 2, &len);[m
[31m-[m
[31m-            user_args.data = ngx_palloc(r->pool, len);[m
[31m-            if (user_args.data == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(user_args.data, p, len);[m
[31m-[m
[31m-            user_args.len = len;[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            ngx_http_lua_process_args_option(r, L, 2, &user_args);[m
[31m-[m
[31m-            dd("user_args: %.*s", (int) user_args.len, user_args.data);[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TNIL:[m
[31m-            ngx_str_null(&user_args);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "string, number, or table expected, "[m
[31m-                                  "but got %s", luaL_typename(L, 2));[m
[31m-            return luaL_argerror(L, 2, msg);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        user_args.data = NULL;[m
[31m-        user_args.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (user_args.len) {[m
[31m-        if (args.len == 0) {[m
[31m-            args = user_args;[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_palloc(r->pool, args.len + user_args.len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-[m
[31m-            q = ngx_copy(p, args.data, args.len);[m
[31m-            *q++ = '&';[m
[31m-            ngx_memcpy(q, user_args.data, user_args.len);[m
[31m-[m
[31m-            args.data = p;[m
[31m-            args.len += user_args.len + 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        return luaL_error(L, "attempt to call ngx.exec after "[m
[31m-                          "sending out response headers");[m
[31m-    }[m
[31m-[m
[31m-    ctx->exec_uri = uri;[m
[31m-    ctx->exec_args = args;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua exec \"%V?%V\"",[m
[31m-                   &ctx->exec_uri, &ctx->exec_args);[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_redirect(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          n;[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *uri;[m
[31m-    size_t                       len;[m
[31m-    ngx_table_elt_t             *h;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting one or two arguments");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        rc = (ngx_int_t) luaL_checknumber(L, 2);[m
[31m-[m
[31m-        if (rc != NGX_HTTP_MOVED_TEMPORARILY[m
[31m-            && rc != NGX_HTTP_MOVED_PERMANENTLY[m
[31m-            && rc != NGX_HTTP_TEMPORARY_REDIRECT)[m
[31m-        {[m
[31m-            return luaL_error(L, "only ngx.HTTP_MOVED_TEMPORARILY, "[m
[31m-                              "ngx.HTTP_MOVED_PERMANENTLY, and "[m
[31m-                              "ngx.HTTP_TEMPORARY_REDIRECT are allowed");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        rc = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    ngx_http_lua_check_if_abortable(L, ctx);[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        return luaL_error(L, "attempt to call ngx.redirect after sending out "[m
[31m-                          "the headers");[m
[31m-    }[m
[31m-[m
[31m-    uri = ngx_palloc(r->pool, len);[m
[31m-    if (uri == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(uri, p, len);[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    h->hash = ngx_http_lua_location_hash;[m
[31m-[m
[31m-#if 0[m
[31m-    dd("location hash: %lu == %lu",[m
[31m-       (unsigned long) h->hash,[m
[31m-       (unsigned long) ngx_hash_key_lc((u_char *) "Location",[m
[31m-                                       sizeof("Location") - 1));[m
[31m-#endif[m
[31m-[m
[31m-    h->value.len = len;[m
[31m-    h->value.data = uri;[m
[31m-    ngx_str_set(&h->key, "Location");[m
[31m-[m
[31m-    r->headers_out.status = rc;[m
[31m-[m
[31m-    ctx->exit_code = rc;[m
[31m-    ctx->exited = 1;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua redirect to \"%V\" with code %i",[m
[31m-                   &h->value, ctx->exit_code);[m
[31m-[m
[31m-    if (len && uri[0] != '/') {[m
[31m-        r->headers_out.location = h;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_exit(lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_HEADER_FILTER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_BALANCER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    rc = (ngx_int_t) luaL_checkinteger(L, 1);[m
[31m-[m
[31m-    if (ctx->context == NGX_HTTP_LUA_CONTEXT_SSL_CERT) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        ctx->exit_code = rc;[m
[31m-        ctx->exited = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exit with code %i", rc);[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        return luaL_error(L, "no SSL support");[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->no_abort[m
[31m-        && rc != NGX_ERROR[m
[31m-        && rc != NGX_HTTP_CLOSE[m
[31m-        && rc != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && rc != NGX_HTTP_CLIENT_CLOSED_REQUEST)[m
[31m-    {[m
[31m-        return luaL_error(L, "attempt to abort with pending subrequests");[m
[31m-    }[m
[31m-[m
[31m-    if ((r->header_sent || ctx->header_sent)[m
[31m-        && rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        && rc != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && rc != NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        && rc != NGX_HTTP_CLOSE)[m
[31m-    {[m
[31m-        if (rc != (ngx_int_t) r->headers_out.status) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "[m
[31m-                          "set status %i via ngx.exit after sending out the "[m
[31m-                          "response status %ui", rc, r->headers_out.status);[m
[31m-        }[m
[31m-[m
[31m-        rc = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("setting exit code: %d", (int) rc);[m
[31m-[m
[31m-    ctx->exit_code = rc;[m
[31m-    ctx->exited = 1;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua exit with code %i", ctx->exit_code);[m
[31m-[m
[31m-    if (ctx->context & (NGX_HTTP_LUA_CONTEXT_HEADER_FILTER[m
[31m-                        | NGX_HTTP_LUA_CONTEXT_BALANCER))[m
[31m-    {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("calling yield");[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_on_abort(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_http_lua_ctx_t           *ctx;[m
[31m-    ngx_http_lua_co_ctx_t        *coctx = NULL;[m
[31m-    ngx_http_lua_loc_conf_t      *llcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request2(L, r, ctx);[m
[31m-[m
[31m-    if (ctx->on_abort_co_ctx) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "duplicate call");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (!llcf->check_client_abort) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "lua_check_client_abort is off");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_coroutine_create_helper(L, r, ctx, &coctx);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-[m
[31m-    dd("on_wait thread 1: %p", lua_tothread(L, -1));[m
[31m-[m
[31m-    coctx->co_ref = luaL_ref(L, -2);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    coctx->is_uthread = 1;[m
[31m-    ctx->on_abort_co_ctx = coctx;[m
[31m-[m
[31m-    dd("on_wait thread 2: %p", coctx->co);[m
[31m-[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_SUSPENDED;[m
[31m-    coctx->parent_co_ctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_exit(ngx_http_request_t *r, int status, u_char *err,[m
[31m-    size_t *errlen)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t       *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *errlen = ngx_snprintf(err, *errlen, "no request ctx found") - err;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_lua_ffi_check_context(ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_HEADER_FILTER[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_BALANCER[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_SSL_CERT,[m
[31m-                                       err, errlen)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->context == NGX_HTTP_LUA_CONTEXT_SSL_CERT) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        ctx->exit_code = status;[m
[31m-        ctx->exited = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exit with code %d", status);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->no_abort[m
[31m-        && status != NGX_ERROR[m
[31m-        && status != NGX_HTTP_CLOSE[m
[31m-        && status != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && status != NGX_HTTP_CLIENT_CLOSED_REQUEST)[m
[31m-    {[m
[31m-        *errlen = ngx_snprintf(err, *errlen,[m
[31m-                               "attempt to abort with pending subrequests")[m
[31m-                  - err;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((r->header_sent || ctx->header_sent)[m
[31m-        && status >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        && status != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && status != NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        && status != NGX_HTTP_CLOSE)[m
[31m-    {[m
[31m-        if (status != (ngx_int_t) r->headers_out.status) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "[m
[31m-                          "set status %d via ngx.exit after sending out the "[m
[31m-                          "response status %ui", status,[m
[31m-                          r->headers_out.status);[m
[31m-        }[m
[31m-[m
[31m-        status = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->exit_code = status;[m
[31m-    ctx->exited = 1;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua exit with code %i", ctx->exit_code);[m
[31m-[m
[31m-    if (ctx->context & (NGX_HTTP_LUA_CONTEXT_HEADER_FILTER[m
[31m-                        | NGX_HTTP_LUA_CONTEXT_BALANCER))[m
[31m-    {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif  /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_control.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_control.h[m
[1mdeleted file mode 100644[m
[1mindex 2c13615..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_control.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CONTROL_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CONTROL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_control_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CONTROL_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.c[m
[1mdeleted file mode 100644[m
[1mindex cb819c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.c[m
[1m+++ /dev/null[m
[36m@@ -1,383 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_coroutine.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Design:[m
[31m- *[m
[31m- * In order to support using ngx.* API in Lua coroutines, we have to create[m
[31m- * new coroutine in the main coroutine instead of the calling coroutine[m
[31m- */[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_coroutine_create(lua_State *L);[m
[31m-static int ngx_http_lua_coroutine_resume(lua_State *L);[m
[31m-static int ngx_http_lua_coroutine_yield(lua_State *L);[m
[31m-static int ngx_http_lua_coroutine_status(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static const ngx_str_t[m
[31m-    ngx_http_lua_co_status_names[] =[m
[31m-    {[m
[31m-        ngx_string("running"),[m
[31m-        ngx_string("suspended"),[m
[31m-        ngx_string("normal"),[m
[31m-        ngx_string("dead"),[m
[31m-        ngx_string("zombie")[m
[31m-    };[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_coroutine_create(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_coroutine_create_helper(L, r, ctx, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_coroutine_create_helper(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t **pcoctx)[m
[31m-{[m
[31m-    lua_State                     *vm;  /* the Lua VM */[m
[31m-    lua_State                     *co;  /* new coroutine to be created */[m
[31m-    ngx_http_lua_co_ctx_t         *coctx; /* co ctx for the new coroutine */[m
[31m-[m
[31m-    luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,[m
[31m-                  "Lua function expected");[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    /* create new coroutine on root Lua state, so it always yields[m
[31m-     * to main Lua thread[m
[31m-     */[m
[31m-    co = lua_newthread(vm);[m
[31m-[m
[31m-    ngx_http_lua_probe_user_coroutine_create(r, L, co);[m
[31m-[m
[31m-    coctx = ngx_http_lua_get_co_ctx(co, ctx);[m
[31m-    if (coctx == NULL) {[m
[31m-        coctx = ngx_http_lua_create_co_ctx(r, ctx);[m
[31m-        if (coctx == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(coctx, sizeof(ngx_http_lua_co_ctx_t));[m
[31m-        coctx->co_ref = LUA_NOREF;[m
[31m-    }[m
[31m-[m
[31m-    coctx->co = co;[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_SUSPENDED;[m
[31m-[m
[31m-    /* make new coroutine share globals of the parent coroutine.[m
[31m-     * NOTE: globals don't have to be separated! */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_xmove(L, co, 1);[m
[31m-    ngx_http_lua_set_globals_table(co);[m
[31m-[m
[31m-    lua_xmove(vm, L, 1);    /* move coroutine from main thread to L */[m
[31m-[m
[31m-    lua_pushvalue(L, 1);    /* copy entry function to top of L*/[m
[31m-    lua_xmove(L, co, 1);    /* move entry function from L to co */[m
[31m-[m
[31m-    if (pcoctx) {[m
[31m-        *pcoctx = coctx;[m
[31m-    }[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    coctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    return 1;    /* return new coroutine to Lua */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_coroutine_resume(lua_State *L)[m
[31m-{[m
[31m-    lua_State                   *co;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-    ngx_http_lua_co_ctx_t       *p_coctx; /* parent co ctx */[m
[31m-[m
[31m-    co = lua_tothread(L, 1);[m
[31m-[m
[31m-    luaL_argcheck(L, co, 1, "coroutine expected");[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    p_coctx = ctx->cur_co_ctx;[m
[31m-    if (p_coctx == NULL) {[m
[31m-        return luaL_error(L, "no parent co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    coctx = ngx_http_lua_get_co_ctx(co, ctx);[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_probe_user_coroutine_resume(r, L, co);[m
[31m-[m
[31m-    if (coctx->co_status != NGX_HTTP_LUA_CO_SUSPENDED) {[m
[31m-        dd("coroutine resume: %d", coctx->co_status);[m
[31m-[m
[31m-        lua_pushboolean(L, 0);[m
[31m-        lua_pushfstring(L, "cannot resume %s coroutine",[m
[31m-                        ngx_http_lua_co_status_names[coctx->co_status].data);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    p_coctx->co_status = NGX_HTTP_LUA_CO_NORMAL;[m
[31m-[m
[31m-    coctx->parent_co_ctx = p_coctx;[m
[31m-[m
[31m-    dd("set coroutine to running");[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-    ctx->co_op = NGX_HTTP_LUA_USER_CORO_RESUME;[m
[31m-    ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-    /* yield and pass args to main thread, and resume target coroutine from[m
[31m-     * there */[m
[31m-    return lua_yield(L, lua_gettop(L) - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_coroutine_yield(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_SUSPENDED;[m
[31m-[m
[31m-    ctx->co_op = NGX_HTTP_LUA_USER_CORO_YIELD;[m
[31m-[m
[31m-    if (!coctx->is_uthread && coctx->parent_co_ctx) {[m
[31m-        dd("set coroutine to running");[m
[31m-        coctx->parent_co_ctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-        ngx_http_lua_probe_user_coroutine_yield(r, coctx->parent_co_ctx->co, L);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_http_lua_probe_user_coroutine_yield(r, NULL, L);[m
[31m-    }[m
[31m-[m
[31m-    /* yield and pass retvals to main thread,[m
[31m-     * and resume parent coroutine there */[m
[31m-    return lua_yield(L, lua_gettop(L));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_coroutine_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    int         rc;[m
[31m-[m
[31m-    /* new coroutine table */[m
[31m-    lua_createtable(L, 0 /* narr */, 14 /* nrec */);[m
[31m-[m
[31m-    /* get old coroutine table */[m
[31m-    lua_getglobal(L, "coroutine");[m
[31m-[m
[31m-    /* set running to the old one */[m
[31m-    lua_getfield(L, -1, "running");[m
[31m-    lua_setfield(L, -3, "running");[m
[31m-[m
[31m-    lua_getfield(L, -1, "create");[m
[31m-    lua_setfield(L, -3, "_create");[m
[31m-[m
[31m-    lua_getfield(L, -1, "resume");[m
[31m-    lua_setfield(L, -3, "_resume");[m
[31m-[m
[31m-    lua_getfield(L, -1, "yield");[m
[31m-    lua_setfield(L, -3, "_yield");[m
[31m-[m
[31m-    lua_getfield(L, -1, "status");[m
[31m-    lua_setfield(L, -3, "_status");[m
[31m-[m
[31m-    /* pop the old coroutine */[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_coroutine_create);[m
[31m-    lua_setfield(L, -2, "__create");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_coroutine_resume);[m
[31m-    lua_setfield(L, -2, "__resume");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_coroutine_yield);[m
[31m-    lua_setfield(L, -2, "__yield");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_coroutine_status);[m
[31m-    lua_setfield(L, -2, "__status");[m
[31m-[m
[31m-    lua_setglobal(L, "coroutine");[m
[31m-[m
[31m-    /* inject coroutine APIs */[m
[31m-    {[m
[31m-        const char buf[] =[m
[31m-            "local keys = {'create', 'yield', 'resume', 'status'}\n"[m
[31m-            "local getfenv = getfenv\n"[m
[31m-            "for _, key in ipairs(keys) do\n"[m
[31m-               "local std = coroutine['_' .. key]\n"[m
[31m-               "local ours = coroutine['__' .. key]\n"[m
[31m-               "local raw_ctx = ngx._phase_ctx\n"[m
[31m-               "coroutine[key] = function (...)\n"[m
[31m-                    "local r = getfenv(0).__ngx_req\n"[m
[31m-                    "if r then\n"[m
[31m-                        "local ctx = raw_ctx(r)\n"[m
[31m-                        /* ignore header and body filters */[m
[31m-                        "if ctx ~= 0x020 and ctx ~= 0x040 then\n"[m
[31m-                            "return ours(...)\n"[m
[31m-                        "end\n"[m
[31m-                    "end\n"[m
[31m-                    "return std(...)\n"[m
[31m-                "end\n"[m
[31m-            "end\n"[m
[31m-            "local create, resume = coroutine.create, coroutine.resume\n"[m
[31m-            "coroutine.wrap = function(f)\n"[m
[31m-               "local co = create(f)\n"[m
[31m-               "return function(...) return select(2, resume(co, ...)) end\n"[m
[31m-            "end\n"[m
[31m-            "package.loaded.coroutine = coroutine";[m
[31m-[m
[31m-#if 0[m
[31m-            "debug.sethook(function () collectgarbage() end, 'rl', 1)"[m
[31m-#endif[m
[31m-            ;[m
[31m-[m
[31m-        rc = luaL_loadbuffer(L, buf, sizeof(buf) - 1, "=coroutine.wrap");[m
[31m-    }[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "failed to load Lua code for coroutine.wrap(): %i: %s",[m
[31m-                      rc, lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = lua_pcall(L, 0, 0, 0);[m
[31m-    if (rc != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "failed to run the Lua code for coroutine.wrap(): %i: %s",[m
[31m-                      rc, lua_tostring(L, -1));[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_coroutine_status(lua_State *L)[m
[31m-{[m
[31m-    lua_State                     *co;  /* new coroutine to be created */[m
[31m-    ngx_http_request_t            *r;[m
[31m-    ngx_http_lua_ctx_t            *ctx;[m
[31m-    ngx_http_lua_co_ctx_t         *coctx; /* co ctx for the new coroutine */[m
[31m-[m
[31m-    co = lua_tothread(L, 1);[m
[31m-[m
[31m-    luaL_argcheck(L, co, 1, "coroutine expected");[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ngx_http_lua_get_co_ctx(co, ctx);[m
[31m-    if (coctx == NULL) {[m
[31m-        lua_pushlstring(L, (const char *)[m
[31m-                        ngx_http_lua_co_status_names[NGX_HTTP_LUA_CO_DEAD].data,[m
[31m-                        ngx_http_lua_co_status_names[NGX_HTTP_LUA_CO_DEAD].len);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("co status: %d", coctx->co_status);[m
[31m-[m
[31m-    lua_pushlstring(L, (const char *)[m
[31m-                    ngx_http_lua_co_status_names[coctx->co_status].data,[m
[31m-                    ngx_http_lua_co_status_names[coctx->co_status].len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.h[m
[1mdeleted file mode 100644[m
[1mindex 8b7bc90..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_COROUTINE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_COROUTINE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_coroutine_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-int ngx_http_lua_coroutine_create_helper(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t **pcoctx);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_COROUTINE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ctx.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ctx.c[m
[1mdeleted file mode 100644[m
[1mindex a14bb4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ctx.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_ctx.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int              ref;[m
[31m-    lua_State       *vm;[m
[31m-} ngx_http_lua_ngx_ctx_cleanup_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_ngx_ctx_add_cleanup(ngx_http_request_t *r,[m
[31m-    int ref);[m
[31m-static void ngx_http_lua_ngx_ctx_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ngx_get_ctx(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ctx_ref == LUA_NOREF) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua create ngx.ctx table for the current request");[m
[31m-[m
[31m-        lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_createtable(L, 0 /* narr */, 4 /* nrec */);[m
[31m-        lua_pushvalue(L, -1);[m
[31m-        ctx->ctx_ref = luaL_ref(L, -3);[m
[31m-[m
[31m-        if (ngx_http_lua_ngx_ctx_add_cleanup(r, ctx->ctx_ref) != NGX_OK) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua fetching existing ngx.ctx table for the current "[m
[31m-                   "request");[m
[31m-[m
[31m-    lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_rawgeti(L, -1, ctx->ctx_ref);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ngx_set_ctx(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_ngx_set_ctx_helper(L, r, ctx, 3);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ngx_set_ctx_helper(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, int index)[m
[31m-{[m
[31m-    if (index < 0) {[m
[31m-        index = lua_gettop(L) + index + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ctx_ref == LUA_NOREF) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua create ngx.ctx table for the current request");[m
[31m-[m
[31m-        lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_pushvalue(L, index);[m
[31m-        ctx->ctx_ref = luaL_ref(L, -2);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (ngx_http_lua_ngx_ctx_add_cleanup(r, ctx->ctx_ref) != NGX_OK) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua fetching existing ngx.ctx table for the current "[m
[31m-                   "request");[m
[31m-[m
[31m-    lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    luaL_unref(L, -1, ctx->ctx_ref);[m
[31m-    lua_pushvalue(L, index);[m
[31m-    ctx->ctx_ref = luaL_ref(L, -2);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_get_ctx_ref(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_LUA_FFI_NO_REQ_CTX;[m
[31m-    }[m
[31m-[m
[31m-    return ctx->ctx_ref;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_set_ctx_ref(ngx_http_request_t *r, int ref)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_LUA_FFI_NO_REQ_CTX;[m
[31m-    }[m
[31m-[m
[31m-    ctx->ctx_ref = ref;[m
[31m-[m
[31m-    if (ngx_http_lua_ngx_ctx_add_cleanup(r, ref) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_ngx_ctx_add_cleanup(ngx_http_request_t *r, int ref)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_pool_cleanup_t          *cln;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ngx_http_lua_ngx_ctx_cleanup_data_t    *data;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool,[m
[31m-                               sizeof(ngx_http_lua_ngx_ctx_cleanup_data_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_ngx_ctx_cleanup;[m
[31m-[m
[31m-    data = cln->data;[m
[31m-    data->vm = L;[m
[31m-    data->ref = ref;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ngx_ctx_cleanup(void *data)[m
[31m-{[m
[31m-    lua_State       *L;[m
[31m-[m
[31m-    ngx_http_lua_ngx_ctx_cleanup_data_t    *clndata = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua release ngx.ctx at ref %d", clndata->ref);[m
[31m-[m
[31m-    L = clndata->vm;[m
[31m-[m
[31m-    lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    luaL_unref(L, -1, clndata->ref);[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ctx.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ctx.h[m
[1mdeleted file mode 100644[m
[1mindex f73f73e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ctx.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CTX_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CTX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-int ngx_http_lua_ngx_get_ctx(lua_State *L);[m
[31m-int ngx_http_lua_ngx_set_ctx(lua_State *L);[m
[31m-int ngx_http_lua_ngx_set_ctx_helper(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, int index);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CTX_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_directive.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_directive.c[m
[1mdeleted file mode 100644[m
[1mindex e6bc339..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_directive.c[m
[1m+++ /dev/null[m
[36m@@ -1,1737 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_accessby.h"[m
[31m-#include "ngx_http_lua_rewriteby.h"[m
[31m-#include "ngx_http_lua_logby.h"[m
[31m-#include "ngx_http_lua_headerfilterby.h"[m
[31m-#include "ngx_http_lua_bodyfilterby.h"[m
[31m-#include "ngx_http_lua_initby.h"[m
[31m-#include "ngx_http_lua_initworkerby.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_ssl_certby.h"[m
[31m-#include "ngx_http_lua_lex.h"[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_block_parser_ctx_s[m
[31m-    ngx_http_lua_block_parser_ctx_t;[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-#include "ngx_http_lua_setby.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_set_by_lua_init(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-[m
[31m-static u_char *ngx_http_lua_gen_chunk_name(ngx_conf_t *cf, const char *tag,[m
[31m-    size_t tag_len);[m
[31m-static ngx_int_t ngx_http_lua_conf_read_lua_token(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_block_parser_ctx_t *ctx);[m
[31m-static u_char *ngx_http_lua_strlstrn(u_char *s1, u_char *last, u_char *s2,[m
[31m-    size_t n);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_block_parser_ctx_s {[m
[31m-    ngx_uint_t  start_line;[m
[31m-    int         token_len;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    FOUND_LEFT_CURLY = 0,[m
[31m-    FOUND_RIGHT_CURLY,[m
[31m-    FOUND_LEFT_LBRACKET_STR,[m
[31m-    FOUND_LBRACKET_STR = FOUND_LEFT_LBRACKET_STR,[m
[31m-    FOUND_LEFT_LBRACKET_CMT,[m
[31m-    FOUND_LBRACKET_CMT = FOUND_LEFT_LBRACKET_CMT,[m
[31m-    FOUND_RIGHT_LBRACKET,[m
[31m-    FOUND_COMMENT_LINE,[m
[31m-    FOUND_DOUBLE_QUOTED,[m
[31m-    FOUND_SINGLE_QUOTED[m
[31m-};[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_shared_dict(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t   *lmcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value, name;[m
[31m-    ngx_shm_zone_t             *zone;[m
[31m-    ngx_shm_zone_t            **zp;[m
[31m-    ngx_http_lua_shdict_ctx_t  *ctx;[m
[31m-    ssize_t                     size;[m
[31m-[m
[31m-    if (lmcf->shm_zones == NULL) {[m
[31m-        lmcf->shm_zones = ngx_palloc(cf->pool, sizeof(ngx_array_t));[m
[31m-        if (lmcf->shm_zones == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_array_init(lmcf->shm_zones, cf->pool, 2,[m
[31m-                           sizeof(ngx_shm_zone_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ctx = NULL;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid lua shared dict name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name = value[1];[m
[31m-[m
[31m-    size = ngx_parse_size(&value[2]);[m
[31m-[m
[31m-    if (size <= 8191) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid lua shared dict size \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_shdict_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->name = name;[m
[31m-    ctx->main_conf = lmcf;[m
[31m-    ctx->log = &cf->cycle->new_log;[m
[31m-    ctx->cycle = cf->cycle;[m
[31m-[m
[31m-    zone = ngx_shared_memory_add(cf, &name, (size_t) size,[m
[31m-                                 &ngx_http_lua_module);[m
[31m-    if (zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (zone->data) {[m
[31m-        ctx = zone->data;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "lua_shared_dict \"%V\" is already defined as "[m
[31m-                           "\"%V\"", &name, &ctx->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    zone->init = ngx_http_lua_shdict_init_zone;[m
[31m-    zone->data = ctx;[m
[31m-[m
[31m-    zp = ngx_array_push(lmcf->shm_zones);[m
[31m-    if (zp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *zp = zone;[m
[31m-[m
[31m-    lmcf->requires_shm = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_code_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char             *p = conf;[m
[31m-    ngx_flag_t       *fp;[m
[31m-    char             *ret;[m
[31m-[m
[31m-    ret = ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-    if (ret != NGX_CONF_OK) {[m
[31m-        return ret;[m
[31m-    }[m
[31m-[m
[31m-    fp = (ngx_flag_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (!*fp) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, 0,[m
[31m-                           "lua_code_cache is off; this will hurt "[m
[31m-                           "performance");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_package_cpath(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t *lmcf = conf;[m
[31m-    ngx_str_t                *value;[m
[31m-[m
[31m-    if (lmcf->lua_cpath.len != 0) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lmcf->lua_cpath.len = value[1].len;[m
[31m-    lmcf->lua_cpath.data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_package_path(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t *lmcf = conf;[m
[31m-    ngx_str_t                *value;[m
[31m-[m
[31m-    if (lmcf->lua_path.len != 0) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lmcf->lua_path.len = value[1].len;[m
[31m-    lmcf->lua_path.data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-char *[m
[31m-ngx_http_lua_set_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_set_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_set_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_str_t            target;[m
[31m-    ndk_set_var_t        filter;[m
[31m-[m
[31m-    ngx_http_lua_set_var_data_t     *filter_data;[m
[31m-[m
[31m-    /*[m
[31m-     * value[0] = "set_by_lua"[m
[31m-     * value[1] = target variable name[m
[31m-     * value[2] = lua script source to be executed[m
[31m-     * value[3..] = real params[m
[31m-     * */[m
[31m-    value = cf->args->elts;[m
[31m-    target = value[1];[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-    filter.func = cmd->post;[m
[31m-    filter.size = cf->args->nelts - 3;    /*  get number of real params */[m
[31m-[m
[31m-    filter_data = ngx_palloc(cf->pool, sizeof(ngx_http_lua_set_var_data_t));[m
[31m-    if (filter_data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->size = filter.size;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->key = p;[m
[31m-[m
[31m-    p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-    p = ngx_http_lua_digest_hex(p, value[2].data, value[2].len);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    filter_data->script = value[2];[m
[31m-[m
[31m-    filter.data = filter_data;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, &target, &value[3], &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_set_by_lua_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_str_t            target;[m
[31m-    ndk_set_var_t        filter;[m
[31m-[m
[31m-    ngx_http_lua_set_var_data_t     *filter_data;[m
[31m-[m
[31m-    /*[m
[31m-     * value[0] = "set_by_lua_file"[m
[31m-     * value[1] = target variable name[m
[31m-     * value[2] = lua script file path to be executed[m
[31m-     * value[3..] = real params[m
[31m-     * */[m
[31m-    value = cf->args->elts;[m
[31m-    target = value[1];[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-    filter.func = cmd->post;[m
[31m-    filter.size = cf->args->nelts - 2;    /*  get number of real params and[m
[31m-                                              lua script */[m
[31m-[m
[31m-    filter_data = ngx_palloc(cf->pool, sizeof(ngx_http_lua_set_var_data_t));[m
[31m-    if (filter_data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->size = filter.size;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->key = p;[m
[31m-[m
[31m-    p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-    p = ngx_http_lua_digest_hex(p, value[2].data, value[2].len);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    ngx_str_null(&filter_data->script);[m
[31m-[m
[31m-    filter.data = filter_data;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, &target, &value[2], &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_filter_set_by_lua_inline(ngx_http_request_t *r, ngx_str_t *val,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    ngx_http_lua_set_var_data_t     *filter_data = data;[m
[31m-[m
[31m-    if (ngx_http_lua_set_by_lua_init(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       filter_data->script.data,[m
[31m-                                       filter_data->script.len,[m
[31m-                                       filter_data->key, "=set_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_set_by_chunk(L, r, val, v, filter_data->size,[m
[31m-                                   &filter_data->script);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_filter_set_by_lua_file(ngx_http_request_t *r, ngx_str_t *val,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    u_char                      *script_path;[m
[31m-    size_t                       nargs;[m
[31m-[m
[31m-    ngx_http_lua_set_var_data_t     *filter_data = data;[m
[31m-[m
[31m-    dd("set by lua file");[m
[31m-[m
[31m-    if (ngx_http_lua_set_by_lua_init(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->script.data = v[0].data;[m
[31m-    filter_data->script.len = v[0].len;[m
[31m-[m
[31m-    /* skip the lua file path argument */[m
[31m-    v++;[m
[31m-    nargs = filter_data->size - 1;[m
[31m-[m
[31m-    dd("script: %.*s", (int) filter_data->script.len, filter_data->script.data);[m
[31m-    dd("nargs: %d", (int) nargs);[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, filter_data->script.data,[m
[31m-                                           filter_data->script.len);[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     filter_data->key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_set_by_chunk(L, r, val, v, nargs, &filter_data->script);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif /* defined(NDK) && NDK */[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_rewrite_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_rewrite_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_rewrite_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                      *p, *chunkname;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8042 && nginx_version <= 8053[m
[31m-    return "does not work with " NGINX_VER;[m
[31m-#endif[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->rewrite_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_rewrite_handler_inline) {[m
[31m-        chunkname = ngx_http_lua_gen_chunk_name(cf, "rewrite_by_lua",[m
[31m-                                                sizeof("rewrite_by_lua") - 1);[m
[31m-        if (chunkname == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->rewrite_chunkname = chunkname;[m
[31m-[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-[m
[31m-        llcf->rewrite_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->rewrite_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->rewrite_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->rewrite_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->rewrite_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->rewrite_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_rewrite = 1;[m
[31m-    lmcf->requires_capture_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_access_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_access_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_access_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                      *p, *chunkname;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->access_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_access_handler_inline) {[m
[31m-        chunkname = ngx_http_lua_gen_chunk_name(cf, "access_by_lua",[m
[31m-                                                sizeof("access_by_lua") - 1);[m
[31m-        if (chunkname == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->access_chunkname = chunkname;[m
[31m-[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-[m
[31m-        llcf->access_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->access_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->access_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->access_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->access_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->access_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_access = 1;[m
[31m-    lmcf->requires_capture_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_content_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_content_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_content_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *chunkname;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->content_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    dd("value[0]: %.*s", (int) value[0].len, value[0].data);[m
[31m-    dd("value[1]: %.*s", (int) value[1].len, value[1].data);[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_content_handler_inline) {[m
[31m-        chunkname = ngx_http_lua_gen_chunk_name(cf, "content_by_lua",[m
[31m-                                                sizeof("content_by_lua") - 1);[m
[31m-        if (chunkname == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->content_chunkname = chunkname;[m
[31m-[m
[31m-        dd("chunkname: %s", chunkname);[m
[31m-[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-[m
[31m-        llcf->content_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->content_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->content_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->content_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->content_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->content_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_capture_filter = 1;[m
[31m-[m
[31m-    /*  register location content handler */[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    if (clcf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->handler = ngx_http_lua_content_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_log_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_log_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_log_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                      *p, *chunkname;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->log_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_log_handler_inline) {[m
[31m-        chunkname = ngx_http_lua_gen_chunk_name(cf, "log_by_lua",[m
[31m-                                                sizeof("log_by_lua") - 1);[m
[31m-        if (chunkname == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->log_chunkname = chunkname;[m
[31m-[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-[m
[31m-        llcf->log_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->log_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->log_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->log_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->log_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->log_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_log = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_header_filter_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_header_filter_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_header_filter_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->header_filter_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_header_filter_inline) {[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-        llcf->header_filter_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->header_filter_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->header_filter_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->header_filter_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->header_filter_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->header_filter_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_header_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_body_filter_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_body_filter_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_body_filter_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->body_filter_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_body_filter_inline) {[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-        llcf->body_filter_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->body_filter_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->body_filter_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->body_filter_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->body_filter_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->body_filter_handler = (ngx_http_output_body_filter_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_body_filter = 1;[m
[31m-    lmcf->requires_header_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_init_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_init_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_init_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *name;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf = conf;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->init_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf->init_handler = (ngx_http_lua_main_conf_handler_pt) cmd->post;[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_init_by_file) {[m
[31m-        name = ngx_http_lua_rebase_path(cf->pool, value[1].data,[m
[31m-                                        value[1].len);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lmcf->init_src.data = name;[m
[31m-        lmcf->init_src.len = ngx_strlen(name);[m
[31m-[m
[31m-    } else {[m
[31m-        lmcf->init_src = value[1];[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_init_worker_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_init_worker_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_init_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *name;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf = conf;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->init_worker_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lmcf->init_worker_handler = (ngx_http_lua_main_conf_handler_pt) cmd->post;[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_init_worker_by_file) {[m
[31m-        name = ngx_http_lua_rebase_path(cf->pool, value[1].data,[m
[31m-                                        value[1].len);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lmcf->init_worker_src.data = name;[m
[31m-        lmcf->init_worker_src.len = ngx_strlen(name);[m
[31m-[m
[31m-    } else {[m
[31m-        lmcf->init_worker_src = value[1];[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_set_by_lua_init(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-        ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_SET;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_gen_chunk_name(ngx_conf_t *cf, const char *tag, size_t tag_len)[m
[31m-{[m
[31m-    u_char      *p, *out;[m
[31m-    size_t       len;[m
[31m-[m
[31m-    len = sizeof("=(:)") - 1 + tag_len + cf->conf_file->file.name.len[m
[31m-          + NGX_INT64_LEN + 1;[m
[31m-[m
[31m-    out = ngx_palloc(cf->pool, len);[m
[31m-    if (out == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->conf_file->file.name.len) {[m
[31m-        p = cf->conf_file->file.name.data + cf->conf_file->file.name.len;[m
[31m-        while (--p >= cf->conf_file->file.name.data) {[m
[31m-            if (*p == '/' || *p == '\\') {[m
[31m-                p++;[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-[m
[31m-    } else {[m
[31m-        p = cf->conf_file->file.name.data;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    ngx_snprintf(out, len, "=%*s(%*s:%d)%Z",[m
[31m-                 tag_len, tag, cf->conf_file->file.name.data[m
[31m-                               + cf->conf_file->file.name.len - p,[m
[31m-                 p, cf->conf_file->line);[m
[31m-[m
[31m-    return out;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* a specialized version of the standard ngx_conf_parse() function */[m
[31m-char *[m
[31m-ngx_http_lua_conf_lua_block_parse(ngx_conf_t *cf, ngx_command_t *cmd)[m
[31m-{[m
[31m-    ngx_http_lua_block_parser_ctx_t     ctx;[m
[31m-[m
[31m-    int               level = 1;[m
[31m-    char             *rv;[m
[31m-    u_char           *p;[m
[31m-    size_t            len;[m
[31m-    ngx_str_t        *src, *dst;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_uint_t        i, start_line;[m
[31m-    ngx_array_t      *saved;[m
[31m-    enum {[m
[31m-        parse_block = 0,[m
[31m-        parse_param[m
[31m-    } type;[m
[31m-[m
[31m-    if (cf->conf_file->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        type = parse_block;[m
[31m-[m
[31m-    } else {[m
[31m-        type = parse_param;[m
[31m-    }[m
[31m-[m
[31m-    saved = cf->args;[m
[31m-[m
[31m-    cf->args = ngx_array_create(cf->temp_pool, 4, sizeof(ngx_str_t));[m
[31m-    if (cf->args == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx.token_len = 0;[m
[31m-    start_line = cf->conf_file->line;[m
[31m-[m
[31m-    dd("init start line: %d", (int) start_line);[m
[31m-[m
[31m-    ctx.start_line = start_line;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        rc = ngx_http_lua_conf_read_lua_token(cf, &ctx);[m
[31m-[m
[31m-        dd("parser start line: %d", (int) start_line);[m
[31m-[m
[31m-        switch (rc) {[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            goto done;[m
[31m-[m
[31m-        case FOUND_LEFT_CURLY:[m
[31m-[m
[31m-            ctx.start_line = cf->conf_file->line;[m
[31m-[m
[31m-            if (type == parse_param) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "block directives are not supported "[m
[31m-                                   "in -g option");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            level++;[m
[31m-            dd("seen block start: level=%d", (int) level);[m
[31m-            break;[m
[31m-[m
[31m-        case FOUND_RIGHT_CURLY:[m
[31m-[m
[31m-            level--;[m
[31m-            dd("seen block done: level=%d", (int) level);[m
[31m-[m
[31m-            if (type != parse_block || level < 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected \"}\": level %d, "[m
[31m-                                   "starting at line %ui", level,[m
[31m-                                   start_line);[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (level == 0) {[m
[31m-                ngx_http_lua_assert(cf->handler);[m
[31m-[m
[31m-                src = cf->args->elts;[m
[31m-[m
[31m-                for (len = 0, i = 0; i < cf->args->nelts; i++) {[m
[31m-                    len += src[i].len;[m
[31m-                }[m
[31m-[m
[31m-                dd("saved nelts: %d", (int) saved->nelts);[m
[31m-                dd("temp nelts: %d", (int) cf->args->nelts);[m
[31m-#if 0[m
[31m-                ngx_http_lua_assert(saved->nelts == 1);[m
[31m-#endif[m
[31m-[m
[31m-                dst = ngx_array_push(saved);[m
[31m-                if (dst == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                dst->len = len;[m
[31m-                dst->len--;  /* skip the trailing '}' block terminator */[m
[31m-[m
[31m-                p = ngx_palloc(cf->pool, len);[m
[31m-                if (p == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                dst->data = p;[m
[31m-[m
[31m-                for (i = 0; i < cf->args->nelts; i++) {[m
[31m-                    p = ngx_copy(p, src[i].data, src[i].len);[m
[31m-                }[m
[31m-[m
[31m-                p[-1] = '\0';  /* override the last '}' char to null */[m
[31m-[m
[31m-                cf->args = saved;[m
[31m-[m
[31m-                rv = (*cf->handler)(cf, cmd, cf->handler_conf);[m
[31m-                if (rv == NGX_CONF_OK) {[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                if (rv == NGX_CONF_ERROR) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, rv);[m
[31m-[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case FOUND_LBRACKET_STR:[m
[31m-        case FOUND_LBRACKET_CMT:[m
[31m-        case FOUND_RIGHT_LBRACKET:[m
[31m-        case FOUND_COMMENT_LINE:[m
[31m-        case FOUND_DOUBLE_QUOTED:[m
[31m-        case FOUND_SINGLE_QUOTED:[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "unknown return value from the lexer: %i", rc);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc = NGX_ERROR;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_conf_read_lua_token(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_block_parser_ctx_t *ctx)[m
[31m-{[m
[31m-    enum {[m
[31m-        OVEC_SIZE = 2[m
[31m-    };[m
[31m-    int          i, rc;[m
[31m-    int          ovec[OVEC_SIZE];[m
[31m-    u_char      *start, *p, *q, ch;[m
[31m-    off_t        file_size;[m
[31m-    size_t       len, buf_size;[m
[31m-    ssize_t      n, size;[m
[31m-    ngx_uint_t   start_line;[m
[31m-    ngx_str_t   *word;[m
[31m-    ngx_buf_t   *b;[m
[31m-#if nginx_version >= 1009002[m
[31m-    ngx_buf_t   *dump;[m
[31m-#endif[m
[31m-[m
[31m-    b = cf->conf_file->buffer;[m
[31m-#if nginx_version >= 1009002[m
[31m-    dump = cf->conf_file->dump;[m
[31m-#endif[m
[31m-    start = b->pos;[m
[31m-    start_line = cf->conf_file->line;[m
[31m-    buf_size = b->end - b->start;[m
[31m-[m
[31m-    dd("lexer start line: %d", (int) start_line);[m
[31m-[m
[31m-    file_size = ngx_file_size(&cf->conf_file->file.info);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (b->pos >= b->last[m
[31m-            || (b->last - b->pos < (b->end - b->start) / 3[m
[31m-                && cf->conf_file->file.offset < file_size))[m
[31m-        {[m
[31m-[m
[31m-            if (cf->conf_file->file.offset >= file_size) {[m
[31m-[m
[31m-                cf->conf_file->line = ctx->start_line;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected end of file, expecting "[m
[31m-                                   "terminating characters for lua code "[m
[31m-                                   "block");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = b->last - start;[m
[31m-[m
[31m-            if (len == buf_size) {[m
[31m-[m
[31m-                cf->conf_file->line = start_line;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "too long lua code block, probably "[m
[31m-                                   "missing terminating characters");[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                ngx_memmove(b->start, start, len);[m
[31m-            }[m
[31m-[m
[31m-            size = (ssize_t) (file_size - cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (size > b->end - (b->start + len)) {[m
[31m-                size = b->end - (b->start + len);[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_read_file(&cf->conf_file->file, b->start + len, size,[m
[31m-                              cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n != size) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   ngx_read_file_n " returned "[m
[31m-                                   "only %z bytes instead of %z",[m
[31m-                                   n, size);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start + (b->pos - start);[m
[31m-            b->last = b->start + len + n;[m
[31m-            start = b->start;[m
[31m-[m
[31m-#if nginx_version >= 1009002[m
[31m-            if (dump) {[m
[31m-                dump->last = ngx_cpymem(dump->last, b->pos, size);[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_lua_lex(b->pos, b->last - b->pos, ovec);[m
[31m-[m
[31m-        if (rc < 0) {  /* no match */[m
[31m-            /* alas. the lexer does not yet support streaming processing. need[m
[31m-             * more work below */[m
[31m-[m
[31m-            if (cf->conf_file->file.offset >= file_size) {[m
[31m-[m
[31m-                cf->conf_file->line = ctx->start_line;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected end of file, expecting "[m
[31m-                                   "terminating characters for lua code "[m
[31m-                                   "block");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = b->last - b->pos;[m
[31m-[m
[31m-            if (len == buf_size) {[m
[31m-[m
[31m-                cf->conf_file->line = start_line;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "too long lua code block, probably "[m
[31m-                                   "missing terminating characters");[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                ngx_memcpy(b->start, b->pos, len);[m
[31m-            }[m
[31m-[m
[31m-            size = (ssize_t) (file_size - cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (size > b->end - (b->start + len)) {[m
[31m-                size = b->end - (b->start + len);[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_read_file(&cf->conf_file->file, b->start + len, size,[m
[31m-                              cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n != size) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   ngx_read_file_n " returned "[m
[31m-                                   "only %z bytes instead of %z",[m
[31m-                                   n, size);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start + len;[m
[31m-            b->last = b->pos + n;[m
[31m-            start = b->start;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == FOUND_LEFT_LBRACKET_STR || rc == FOUND_LEFT_LBRACKET_CMT) {[m
[31m-[m
[31m-            /* we update the line numbers for best error messages when the[m
[31m-             * closing long bracket is missing */[m
[31m-[m
[31m-            for (i = 0; i < ovec[0]; i++) {[m
[31m-                ch = b->pos[i];[m
[31m-                if (ch == LF) {[m
[31m-                    cf->conf_file->line++;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            b->pos += ovec[0];[m
[31m-            ovec[1] -= ovec[0];[m
[31m-            ovec[0] = 0;[m
[31m-[m
[31m-            if (rc == FOUND_LEFT_LBRACKET_CMT) {[m
[31m-                p = &b->pos[2];     /* we skip the leading "--" prefix */[m
[31m-                rc = FOUND_LBRACKET_CMT;[m
[31m-[m
[31m-            } else {[m
[31m-                p = b->pos;[m
[31m-                rc = FOUND_LBRACKET_STR;[m
[31m-            }[m
[31m-[m
[31m-            /* we temporarily rewrite [=*[ in the input buffer to ]=*] to[m
[31m-             * construct the pattern for the corresponding closing long[m
[31m-             * bracket without additional buffers. */[m
[31m-[m
[31m-            ngx_http_lua_assert(p[0] == '[');[m
[31m-            p[0] = ']';[m
[31m-[m
[31m-            ngx_http_lua_assert(b->pos[ovec[1] - 1] == '[');[m
[31m-            b->pos[ovec[1] - 1] = ']';[m
[31m-[m
[31m-            /* search for the corresponding closing bracket */[m
[31m-[m
[31m-            dd("search pattern for the closing long bracket: \"%.*s\" (len=%d)",[m
[31m-               (int) (b->pos + ovec[1] - p), p, (int) (b->pos + ovec[1] - p));[m
[31m-[m
[31m-            q = ngx_http_lua_strlstrn(b->pos + ovec[1], b->last, p,[m
[31m-                                      b->pos + ovec[1] - p - 1);[m
[31m-[m
[31m-            if (q == NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "Lua code block missing the closing "[m
[31m-                                   "long bracket \"%*s\"",[m
[31m-                                   b->pos + ovec[1] - p, p);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* restore the original opening long bracket */[m
[31m-[m
[31m-            p[0] = '[';[m
[31m-            b->pos[ovec[1] - 1] = '[';[m
[31m-[m
[31m-            ovec[1] = q - b->pos + b->pos + ovec[1] - p;[m
[31m-[m
[31m-            dd("found long bracket token: \"%.*s\"",[m
[31m-               (int) (ovec[1] - ovec[0]), b->pos + ovec[0]);[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < ovec[1]; i++) {[m
[31m-            ch = b->pos[i];[m
[31m-            if (ch == LF) {[m
[31m-                cf->conf_file->line++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        b->pos += ovec[1];[m
[31m-        ctx->token_len = ovec[1] - ovec[0];[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    word = ngx_array_push(cf->args);[m
[31m-    if (word == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    word->data = ngx_pnalloc(cf->temp_pool, b->pos - start);[m
[31m-    if (word->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = b->pos - start;[m
[31m-    ngx_memcpy(word->data, start, len);[m
[31m-    word->len = len;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_http_lua_strlstrn() is intended to search for static substring[m
[31m- * with known length in string until the argument last. The argument n[m
[31m- * must be length of the second substring - 1.[m
[31m- */[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    last -= n;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (s1 >= last) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-            dd("testing char '%c' vs '%c'", (int) c1, (int) c2);[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-        dd("testing against pattern \"%.*s\"", (int) n, s2);[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_directive.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_directive.h[m
[1mdeleted file mode 100644[m
[1mindex be591f3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_directive.h[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_DIRECTIVE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_DIRECTIVE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-char *ngx_http_lua_shared_dict(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_package_cpath(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_package_path(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_content_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_content_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_rewrite_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_rewrite_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_access_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_access_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_log_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_log_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_header_filter_by_lua_block(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_header_filter_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_body_filter_by_lua_block(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_body_filter_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_init_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_init_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_init_worker_by_lua_block(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_init_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_code_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-[m
[31m-char *ngx_http_lua_set_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_set_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_set_by_lua_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-ngx_int_t ngx_http_lua_filter_set_by_lua_inline(ngx_http_request_t *r,[m
[31m-    ngx_str_t *val, ngx_http_variable_value_t *v, void *data);[m
[31m-ngx_int_t ngx_http_lua_filter_set_by_lua_file(ngx_http_request_t *r,[m
[31m-    ngx_str_t *val, ngx_http_variable_value_t *v, void *data);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-char *ngx_http_lua_rewrite_no_postpone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-char *ngx_http_lua_conf_lua_block_parse(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_DIRECTIVE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_exception.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_exception.c[m
[1mdeleted file mode 100644[m
[1mindex 752cbc9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_exception.c[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-/*  longjmp mark for restoring nginx execution after Lua VM crashing */[m
[31m-jmp_buf ngx_http_lua_exception;[m
[31m-[m
[31m-/**[m
[31m- * Override default Lua panic handler, output VM crash reason to nginx error[m
[31m- * log, and restore execution to the nearest jmp-mark.[m
[31m- *[m
[31m- * @param L Lua state pointer[m
[31m- * @retval Long jump to the nearest jmp-mark, never returns.[m
[31m- * @note nginx request pointer should be stored in Lua thread's globals table[m
[31m- * in order to make logging working.[m
[31m- * */[m
[31m-int[m
[31m-ngx_http_lua_atpanic(lua_State *L)[m
[31m-{[m
[31m-#ifdef NGX_LUA_ABORT_AT_PANIC[m
[31m-    abort();[m
[31m-#else[m
[31m-    u_char                  *s = NULL;[m
[31m-    size_t                   len = 0;[m
[31m-[m
[31m-    if (lua_type(L, -1) == LUA_TSTRING) {[m
[31m-        s = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-    }[m
[31m-[m
[31m-    if (s == NULL) {[m
[31m-        s = (u_char *) "unknown reason";[m
[31m-        len = sizeof("unknown reason") - 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_stderr(0, "lua atpanic: Lua VM crashed, reason: %*s", len, s);[m
[31m-    ngx_quit = 1;[m
[31m-[m
[31m-    /*  restore nginx execution */[m
[31m-    NGX_LUA_EXCEPTION_THROW(1);[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_exception.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_exception.h[m
[1mdeleted file mode 100644[m
[1mindex a70708a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_exception.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_EXCEPTION_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_EXCEPTION_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#define NGX_LUA_EXCEPTION_TRY                                               \[m
[31m-    if (setjmp(ngx_http_lua_exception) == 0)[m
[31m-[m
[31m-#define NGX_LUA_EXCEPTION_CATCH                                             \[m
[31m-    else[m
[31m-[m
[31m-#define NGX_LUA_EXCEPTION_THROW(x)                                          \[m
[31m-    longjmp(ngx_http_lua_exception, (x))[m
[31m-[m
[31m-[m
[31m-extern jmp_buf ngx_http_lua_exception;[m
[31m-[m
[31m-[m
[31m-int ngx_http_lua_atpanic(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_EXCEPTION_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.c[m
[1mdeleted file mode 100644[m
[1mindex 75ce324..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.c[m
[1m+++ /dev/null[m
[36m@@ -1,302 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_lua_headerfilterby.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Set environment table for the given code closure.[m
[31m- *[m
[31m- * Before:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- *[m
[31m- * After:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- * */[m
[31m-static void[m
[31m-ngx_http_lua_header_filter_by_lua_env(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    /*  set nginx request pointer to current lua thread's globals table */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-[m
[31m-    /**[m
[31m-     * we want to create empty environment for current script[m
[31m-     *[m
[31m-     * newt = {}[m
[31m-     * newt["_G"] = newt[m
[31m-     * setmetatable(newt, {__index = _G})[m
[31m-     *[m
[31m-     * if a function or symbol is not defined in our env, __index will lookup[m
[31m-     * in the global env.[m
[31m-     *[m
[31m-     * all variables created in the script-env will be thrown away at the end[m
[31m-     * of the script run.[m
[31m-     * */[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    lua_createtable(L, 0, 1 /* nrec */);   /* the metatable for the new env */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable({}, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_header_filter_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int              old_exit_code = 0;[m
[31m-    ngx_int_t        rc;[m
[31m-    u_char          *err_msg;[m
[31m-    size_t           len;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t      *old_pool;[m
[31m-#endif[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx->exited) {[m
[31m-        old_exit_code = ctx->exit_code;[m
[31m-    }[m
[31m-[m
[31m-    /*  initialize nginx context in Lua VM, code chunk at stack top    sp = 1 */[m
[31m-    ngx_http_lua_header_filter_by_lua_env(L, r);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* XXX: work-around to nginx regex subsystem */[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-    lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-    /*  protected call user code */[m
[31m-    rc = lua_pcall(L, 0, 1, 1);[m
[31m-[m
[31m-    lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* XXX: work-around to nginx regex subsystem */[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-    dd("rc == %d", (int) rc);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        /*  error occured when running loaded code */[m
[31m-        err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-        if (err_msg == NULL) {[m
[31m-            err_msg = (u_char *) "unknown reason";[m
[31m-            len = sizeof("unknown reason") - 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "failed to run header_filter_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-        lua_settop(L, 0); /*  clear remaining elems on stack */[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("exited: %d, exit code: %d, old exit code: %d",[m
[31m-       (int) ctx->exited, (int) ctx->exit_code, (int) old_exit_code);[m
[31m-[m
[31m-#if 1[m
[31m-    /*  clear Lua stack */[m
[31m-    lua_settop(L, 0);[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->exited && ctx->exit_code != old_exit_code) {[m
[31m-        if (ctx->exit_code == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("finalize request with %d", (int) ctx->exit_code);[m
[31m-[m
[31m-        rc = ngx_http_filter_finalize_request(r, &ngx_http_lua_module,[m
[31m-                                              ctx->exit_code);[m
[31m-        if (rc == NGX_ERROR || rc == NGX_AGAIN) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_header_filter_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->header_filter_src.value.data,[m
[31m-                                       llcf->header_filter_src.value.len,[m
[31m-                                       llcf->header_filter_src_key,[m
[31m-                                       "=header_filter_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("calling header filter by chunk");[m
[31m-[m
[31m-    return ngx_http_lua_header_filter_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_header_filter_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* Eval nginx variables in code path string first */[m
[31m-    if (ngx_http_complex_value(r, &llcf->header_filter_src, &eval_src)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->header_filter_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_header_filter_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-    uint16_t                     old_context;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua header filter for user lua code, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->body_filter_handler) {[m
[31m-        r->filter_need_in_memory = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->header_filter_handler == NULL) {[m
[31m-        dd("no header filter handler found");[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    old_context = ctx->context;[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_HEADER_FILTER;[m
[31m-[m
[31m-    dd("calling header filter handler");[m
[31m-    rc = llcf->header_filter_handler(r);[m
[31m-[m
[31m-    ctx->context = old_context;[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_header_filter_init(void)[m
[31m-{[m
[31m-    dd("calling header filter init");[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_lua_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.h[m
[1mdeleted file mode 100644[m
[1mindex 822baf7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.h[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_HEADERFILTERBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_HEADERFILTERBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt ngx_http_lua_next_filter_header_filter;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_header_filter_init(void);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_header_filter_by_chunk(lua_State *L,[m
[31m-        ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_header_filter_inline(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_header_filter_file(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_HEADERFILTERBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers.c[m
[1mdeleted file mode 100644[m
[1mindex 45be168..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers.c[m
[1m+++ /dev/null[m
[36m@@ -1,1376 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_headers_out.h"[m
[31m-#include "ngx_http_lua_headers_in.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_http_version(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_raw_header(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_header_set_helper(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_header_get(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_header_set(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_headers(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_header_clear(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_header_set(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_resp_get_headers(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_http_version(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    switch (r->http_version) {[m
[31m-    case NGX_HTTP_VERSION_9:[m
[31m-        lua_pushnumber(L, 0.9);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_VERSION_10:[m
[31m-        lua_pushnumber(L, 1.0);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_VERSION_11:[m
[31m-        lua_pushnumber(L, 1.1);[m
[31m-        break;[m
[31m-[m
[31m-#ifdef NGX_HTTP_VERSION_20[m
[31m-    case NGX_HTTP_VERSION_20:[m
[31m-        lua_pushnumber(L, 2.0);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        lua_pushnil(L);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_raw_header(lua_State *L)[m
[31m-{[m
[31m-    int                          n, line_break_len;[m
[31m-    u_char                      *data, *p, *last, *pos;[m
[31m-    unsigned                     no_req_line = 0, found;[m
[31m-    size_t                       size;[m
[31m-    ngx_buf_t                   *b, *first = NULL;[m
[31m-    ngx_int_t                    i, j;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_request_t          *r, *mr;[m
[31m-    ngx_http_connection_t       *hc;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n > 0) {[m
[31m-        no_req_line = lua_toboolean(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    dd("no req line: %d", (int) no_req_line);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    mr = r->main;[m
[31m-    hc = mr->http_connection;[m
[31m-    c = mr->connection;[m
[31m-[m
[31m-#if 1[m
[31m-    dd("hc->nbusy: %d", (int) hc->nbusy);[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        dd("hc->busy: %p %p %p %p", hc->busy[0]->start, hc->busy[0]->pos,[m
[31m-           hc->busy[0]->last, hc->busy[0]->end);[m
[31m-    }[m
[31m-[m
[31m-    dd("request line: %p %p", mr->request_line.data,[m
[31m-       mr->request_line.data + mr->request_line.len);[m
[31m-[m
[31m-    dd("header in: %p %p %p %p", mr->header_in->start,[m
[31m-       mr->header_in->pos, mr->header_in->last,[m
[31m-       mr->header_in->end);[m
[31m-[m
[31m-    dd("c->buffer: %p %p %p %p", c->buffer->start,[m
[31m-       c->buffer->pos, c->buffer->last,[m
[31m-       c->buffer->end);[m
[31m-#endif[m
[31m-[m
[31m-    size = 0;[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (mr->request_line.data[mr->request_line.len] == CR) {[m
[31m-        line_break_len = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        line_break_len = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (mr->request_line.data >= b->start[m
[31m-        && mr->request_line.data + mr->request_line.len[m
[31m-           + line_break_len <= b->pos)[m
[31m-    {[m
[31m-        first = b;[m
[31m-        size += b->pos - mr->request_line.data;[m
[31m-    }[m
[31m-[m
[31m-    dd("size: %d", (int) size);[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        b = NULL;[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            b = hc->busy[i];[m
[31m-[m
[31m-            dd("busy buf: %d: [%.*s]", (int) i, (int) (b->pos - b->start),[m
[31m-               b->start);[m
[31m-[m
[31m-            if (first == NULL) {[m
[31m-                if (mr->request_line.data >= b->pos[m
[31m-                    || mr->request_line.data[m
[31m-                       + mr->request_line.len + line_break_len[m
[31m-                       <= b->start)[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                dd("found first at %d", (int) i);[m
[31m-                first = b;[m
[31m-            }[m
[31m-[m
[31m-            dd("adding size %d", (int) (b->pos - b->start));[m
[31m-            size += b->pos - b->start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size++;  /* plus the null terminator, as required by the later[m
[31m-                ngx_strstr() call */[m
[31m-[m
[31m-    dd("header size: %d", (int) size);[m
[31m-[m
[31m-    data = lua_newuserdata(L, size);[m
[31m-    last = data;[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-    found = 0;[m
[31m-[m
[31m-    if (first == b) {[m
[31m-        found = 1;[m
[31m-        pos = b->pos;[m
[31m-[m
[31m-        if (no_req_line) {[m
[31m-            last = ngx_copy(data,[m
[31m-                            mr->request_line.data[m
[31m-                            + mr->request_line.len + line_break_len,[m
[31m-                            pos - mr->request_line.data[m
[31m-                            - mr->request_line.len - line_break_len);[m
[31m-[m
[31m-        } else {[m
[31m-            last = ngx_copy(data, mr->request_line.data,[m
[31m-                            pos - mr->request_line.data);[m
[31m-        }[m
[31m-[m
[31m-        if (b != mr->header_in) {[m
[31m-            /* skip truncated header entries (if any) */[m
[31m-            while (last > data && last[-1] != LF) {[m
[31m-                last--;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-        for (p = data; p != last; p++) {[m
[31m-            if (*p == '\0') {[m
[31m-                i++;[m
[31m-                if (p + 1 != last && *(p + 1) == LF) {[m
[31m-                    *p = CR;[m
[31m-[m
[31m-                } else if (i % 2 == 1) {[m
[31m-                    *p = ':';[m
[31m-[m
[31m-                } else {[m
[31m-                    *p = LF;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            b = hc->busy[i];[m
[31m-[m
[31m-            if (!found) {[m
[31m-                if (b != first) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                dd("found first");[m
[31m-                found = 1;[m
[31m-            }[m
[31m-[m
[31m-            p = last;[m
[31m-[m
[31m-            pos = b->pos;[m
[31m-[m
[31m-            if (b == first) {[m
[31m-                dd("request line: %.*s", (int) mr->request_line.len,[m
[31m-                   mr->request_line.data);[m
[31m-[m
[31m-                if (no_req_line) {[m
[31m-                    last = ngx_copy(last,[m
[31m-                                    mr->request_line.data[m
[31m-                                    + mr->request_line.len + line_break_len,[m
[31m-                                    pos - mr->request_line.data[m
[31m-                                    - mr->request_line.len - line_break_len);[m
[31m-[m
[31m-                } else {[m
[31m-                    last = ngx_copy(last,[m
[31m-                                    mr->request_line.data,[m
[31m-                                    pos - mr->request_line.data);[m
[31m-[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                last = ngx_copy(last, b->start, pos - b->start);[m
[31m-            }[m
[31m-[m
[31m-#if 1[m
[31m-            /* skip truncated header entries (if any) */[m
[31m-            while (last > p && last[-1] != LF) {[m
[31m-                last--;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            j = 0;[m
[31m-            for (; p != last; p++) {[m
[31m-                if (*p == '\0') {[m
[31m-                    j++;[m
[31m-                    if (p + 1 == last) {[m
[31m-                        /* XXX this should not happen */[m
[31m-                        dd("found string end!!");[m
[31m-[m
[31m-                    } else if (*(p + 1) == LF) {[m
[31m-                        *p = CR;[m
[31m-[m
[31m-                    } else if (j % 2 == 1) {[m
[31m-                        *p = ':';[m
[31m-[m
[31m-                    } else {[m
[31m-                        *p = LF;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b == mr->header_in) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *last++ = '\0';[m
[31m-[m
[31m-    if (last - data > (ssize_t) size) {[m
[31m-        return luaL_error(L, "buffer error: %d", (int) (last - data - size));[m
[31m-    }[m
[31m-[m
[31m-    /* strip the leading part (if any) of the request body in our header.[m
[31m-     * the first part of the request body could slip in because nginx core's[m
[31m-     * ngx_http_request_body_length_filter and etc can move r->header_in->pos[m
[31m-     * in case that some of the body data has been preread into r->header_in.[m
[31m-     */[m
[31m-[m
[31m-    if ((p = (u_char *) ngx_strstr(data, CRLF CRLF)) != NULL) {[m
[31m-        last = p + sizeof(CRLF CRLF) - 1;[m
[31m-[m
[31m-    } else if ((p = (u_char *) ngx_strstr(data, CRLF "\n")) != NULL) {[m
[31m-        last = p + sizeof(CRLF "\n") - 1;[m
[31m-[m
[31m-    } else if ((p = (u_char *) ngx_strstr(data, "\n" CRLF)) != NULL) {[m
[31m-        last = p + sizeof("\n" CRLF) - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        for (p = last - 1; p - data >= 2; p--) {[m
[31m-            if (p[0] == LF && p[-1] == CR) {[m
[31m-                p[-1] = LF;[m
[31m-                last = p + 1;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (p[0] == LF && p[-1] == LF) {[m
[31m-                last = p + 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) data, last - data);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_headers(lua_State *L)[m
[31m-{[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header;[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_uint_t                    i;[m
[31m-    int                           n;[m
[31m-    int                           max;[m
[31m-    int                           raw = 0;[m
[31m-    int                           count = 0;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n >= 1) {[m
[31m-        if (lua_isnil(L, 1)) {[m
[31m-            max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-[m
[31m-        } else {[m
[31m-            max = luaL_checkinteger(L, 1);[m
[31m-        }[m
[31m-[m
[31m-        if (n >= 2) {[m
[31m-            raw = lua_toboolean(L, 2);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    count = part->nelts;[m
[31m-    while (part->next) {[m
[31m-        part = part->next;[m
[31m-        count += part->nelts;[m
[31m-    }[m
[31m-[m
[31m-    if (max > 0 && count > max) {[m
[31m-        count = max;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exceeding request header limit %d", max);[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, count);[m
[31m-[m
[31m-    if (!raw) {[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_headers_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-    }[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        dd("stack top: %d", lua_gettop(L));[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (raw) {[m
[31m-            lua_pushlstring(L, (char *) header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushlstring(L, (char *) header[i].lowcase_key,[m
[31m-                            header[i].key.len);[m
[31m-        }[m
[31m-[m
[31m-        /* stack: table key */[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) header[i].value.data,[m
[31m-                        header[i].value.len); /* stack: table key value */[m
[31m-[m
[31m-        ngx_http_lua_set_multi_value_table(L, -3);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua request header: \"%V: %V\"",[m
[31m-                       &header[i].key, &header[i].value);[m
[31m-[m
[31m-        if (--count == 0) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_resp_get_headers(lua_State *L)[m
[31m-{[m
[31m-    ngx_list_part_t    *part;[m
[31m-    ngx_table_elt_t    *header;[m
[31m-    ngx_http_request_t *r;[m
[31m-    u_char             *lowcase_key = NULL;[m
[31m-    size_t              lowcase_key_sz = 0;[m
[31m-    ngx_uint_t          i;[m
[31m-    int                 n;[m
[31m-    int                 max;[m
[31m-    int                 raw = 0;[m
[31m-    int                 count = 0;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n >= 1) {[m
[31m-        if (lua_isnil(L, 1)) {[m
[31m-            max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-[m
[31m-        } else {[m
[31m-            max = luaL_checkinteger(L, 1);[m
[31m-        }[m
[31m-[m
[31m-        if (n >= 2) {[m
[31m-            raw = lua_toboolean(L, 2);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    count = part->nelts;[m
[31m-    while (part->next) {[m
[31m-        part = part->next;[m
[31m-        count += part->nelts;[m
[31m-    }[m
[31m-[m
[31m-    if (max > 0 && count > max) {[m
[31m-        count = max;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exceeding request header limit %d", max);[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, count);[m
[31m-[m
[31m-    if (!raw) {[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_headers_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        lua_pushliteral(L, "content-type");[m
[31m-        lua_pushlstring(L, (char *) r->headers_out.content_type.data,[m
[31m-                        r->headers_out.content_type.len);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        lua_pushliteral(L, "content-length");[m
[31m-        lua_pushfstring(L, "%d", (int) r->headers_out.content_length_n);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushliteral(L, "connection");[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        lua_pushliteral(L, "upgrade");[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        lua_pushliteral(L, "keep-alive");[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushliteral(L, "close");[m
[31m-    }[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        lua_pushliteral(L, "transfer-encoding");[m
[31m-        lua_pushliteral(L, "chunked");[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        dd("stack top: %d", lua_gettop(L));[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (raw) {[m
[31m-            lua_pushlstring(L, (char *) header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-        } else {[m
[31m-            /* nginx does not even bother initializing output header entry's[m
[31m-             * "lowcase_key" field. so we cannot count on that at all. */[m
[31m-            if (header[i].key.len > lowcase_key_sz) {[m
[31m-                lowcase_key_sz = header[i].key.len * 2;[m
[31m-[m
[31m-                /* we allocate via Lua's GC to prevent in-request[m
[31m-                 * leaks in the nginx request memory pools */[m
[31m-                lowcase_key = lua_newuserdata(L, lowcase_key_sz);[m
[31m-                lua_insert(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            ngx_strlow(lowcase_key, header[i].key.data, header[i].key.len);[m
[31m-            lua_pushlstring(L, (char *) lowcase_key, header[i].key.len);[m
[31m-        }[m
[31m-[m
[31m-        /* stack: [udata] table key */[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) header[i].value.data,[m
[31m-                        header[i].value.len); /* stack: [udata] table key[m
[31m-                                                 value */[m
[31m-[m
[31m-        ngx_http_lua_set_multi_value_table(L, -3);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua response header: \"%V: %V\"",[m
[31m-                       &header[i].key, &header[i].value);[m
[31m-[m
[31m-        if (--count == 0) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_header_get(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p, c;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_uint_t                   i;[m
[31m-    size_t                       len;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    /* we skip the first argument that is the table */[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    dd("key: %.*s, len %d", (int) len, p, (int) len);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (llcf->transform_underscores_in_resp_headers[m
[31m-        && memchr(p, '_', len) != NULL)[m
[31m-    {[m
[31m-        key.data = (u_char *) lua_newuserdata(L, len);[m
[31m-        if (key.data == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        /* replace "_" with "-" */[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            c = p[i];[m
[31m-            if (c == '_') {[m
[31m-                c = '-';[m
[31m-            }[m
[31m-            key.data[i] = c;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        key.data = p;[m
[31m-    }[m
[31m-[m
[31m-    key.len = len;[m
[31m-[m
[31m-    return ngx_http_lua_get_output_header(L, r, &key);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_header_set(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_str_t                    value;[m
[31m-    ngx_uint_t                   i;[m
[31m-    size_t                       len;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "[m
[31m-                      "set ngx.header.HEADER after sending out "[m
[31m-                      "response headers");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    /* we skip the first argument that is the table */[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    dd("key: %.*s, len %d", (int) len, p, (int) len);[m
[31m-[m
[31m-    key.data = ngx_palloc(r->pool, len + 1);[m
[31m-    if (key.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(key.data, p, len);[m
[31m-    key.data[len] = '\0';[m
[31m-    key.len = len;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->transform_underscores_in_resp_headers) {[m
[31m-        /* replace "_" with "-" */[m
[31m-        p = key.data;[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            if (p[i] == '_') {[m
[31m-                p[i] = '-';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->headers_set) {[m
[31m-        rc = ngx_http_lua_set_content_type(r);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L,[m
[31m-                              "failed to set default content type: %d",[m
[31m-                              (int) rc);[m
[31m-        }[m
[31m-[m
[31m-        ctx->headers_set = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 3) == LUA_TNIL) {[m
[31m-        ngx_str_null(&value);[m
[31m-[m
[31m-    } else if (lua_type(L, 3) == LUA_TTABLE) {[m
[31m-        n = luaL_getn(L, 3);[m
[31m-        if (n == 0) {[m
[31m-            ngx_str_null(&value);[m
[31m-[m
[31m-        } else {[m
[31m-            for (i = 1; i <= n; i++) {[m
[31m-                dd("header value table index %d", (int) i);[m
[31m-[m
[31m-                lua_rawgeti(L, 3, i);[m
[31m-                p = (u_char *) luaL_checklstring(L, -1, &len);[m
[31m-[m
[31m-                value.data = ngx_palloc(r->pool, len);[m
[31m-                if (value.data == NULL) {[m
[31m-                    return luaL_error(L, "no memory");[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(value.data, p, len);[m
[31m-                value.len = len;[m
[31m-[m
[31m-                rc = ngx_http_lua_set_output_header(r, key, value,[m
[31m-                                                    i == 1 /* override */);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    return luaL_error(L,[m
[31m-                                      "failed to set header %s (error: %d)",[m
[31m-                                      key.data, (int) rc);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) luaL_checklstring(L, 3, &len);[m
[31m-        value.data = ngx_palloc(r->pool, len);[m
[31m-        if (value.data == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(value.data, p, len);[m
[31m-        value.len = len;[m
[31m-    }[m
[31m-[m
[31m-    dd("key: %.*s, value: %.*s",[m
[31m-       (int) key.len, key.data, (int) value.len, value.data);[m
[31m-[m
[31m-    rc = ngx_http_lua_set_output_header(r, key, value, 1 /* override */);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return luaL_error(L, "failed to set header %s (error: %d)",[m
[31m-                          key.data, (int) rc);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_header_clear(lua_State *L)[m
[31m-{[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one arguments, but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-[m
[31m-    return ngx_http_lua_ngx_req_header_set_helper(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_header_set(lua_State *L)[m
[31m-{[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expecting two arguments, but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_ngx_req_header_set_helper(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_header_set_helper(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_str_t                    value;[m
[31m-    ngx_uint_t                   i;[m
[31m-    size_t                       len;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    dd("key: %.*s, len %d", (int) len, p, (int) len);[m
[31m-[m
[31m-#if 0[m
[31m-    /* replace "_" with "-" */[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        if (p[i] == '_') {[m
[31m-            p[i] = '-';[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    key.data = ngx_palloc(r->pool, len + 1);[m
[31m-    if (key.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(key.data, p, len);[m
[31m-[m
[31m-    key.data[len] = '\0';[m
[31m-[m
[31m-    key.len = len;[m
[31m-[m
[31m-    if (lua_type(L, 2) == LUA_TNIL) {[m
[31m-        ngx_str_null(&value);[m
[31m-[m
[31m-    } else if (lua_type(L, 2) == LUA_TTABLE) {[m
[31m-        n = luaL_getn(L, 2);[m
[31m-        if (n == 0) {[m
[31m-            ngx_str_null(&value);[m
[31m-[m
[31m-        } else {[m
[31m-            for (i = 1; i <= n; i++) {[m
[31m-                dd("header value table index %d, top: %d", (int) i,[m
[31m-                   lua_gettop(L));[m
[31m-[m
[31m-                lua_rawgeti(L, 2, i);[m
[31m-                p = (u_char *) luaL_checklstring(L, -1, &len);[m
[31m-[m
[31m-                /*[m
[31m-                 * we also copy the trailling '\0' char here because nginx[m
[31m-                 * header values must be null-terminated[m
[31m-                 * */[m
[31m-[m
[31m-                value.data = ngx_palloc(r->pool, len + 1);[m
[31m-                if (value.data == NULL) {[m
[31m-                    return luaL_error(L, "no memory");[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(value.data, p, len + 1);[m
[31m-                value.len = len;[m
[31m-[m
[31m-                rc = ngx_http_lua_set_input_header(r, key, value,[m
[31m-                                                   i == 1 /* override */);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    return luaL_error(L,[m
[31m-                                      "failed to set header %s (error: %d)",[m
[31m-                                      key.data, (int) rc);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /*[m
[31m-         * we also copy the trailling '\0' char here because nginx[m
[31m-         * header values must be null-terminated[m
[31m-         * */[m
[31m-[m
[31m-        p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-        value.data = ngx_palloc(r->pool, len + 1);[m
[31m-        if (value.data == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(value.data, p, len + 1);[m
[31m-        value.len = len;[m
[31m-    }[m
[31m-[m
[31m-    dd("key: %.*s, value: %.*s",[m
[31m-       (int) key.len, key.data, (int) value.len, value.data);[m
[31m-[m
[31m-    rc = ngx_http_lua_set_input_header(r, key, value, 1 /* override */);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return luaL_error(L, "failed to set header %s (error: %d)",[m
[31m-                          key.data, (int) rc);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_resp_header_api(lua_State *L)[m
[31m-{[m
[31m-    lua_newtable(L);    /* .header */[m
[31m-[m
[31m-    lua_createtable(L, 0, 2); /* metatable for .header */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_header_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_header_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    lua_setfield(L, -2, "header");[m
[31m-[m
[31m-    lua_createtable(L, 0, 1); /* .resp */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_resp_get_headers);[m
[31m-    lua_setfield(L, -2, "get_headers");[m
[31m-[m
[31m-    lua_setfield(L, -2, "resp");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_header_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_http_version);[m
[31m-    lua_setfield(L, -2, "http_version");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_raw_header);[m
[31m-    lua_setfield(L, -2, "raw_header");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_header_clear);[m
[31m-    lua_setfield(L, -2, "clear_header");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_header_set);[m
[31m-    lua_setfield(L, -2, "set_header");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_headers);[m
[31m-    lua_setfield(L, -2, "get_headers");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_create_headers_metatable(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    int rc;[m
[31m-    const char buf[] =[m
[31m-        "local tb, key = ...\n"[m
[31m-        "local new_key = string.gsub(string.lower(key), '_', '-')\n"[m
[31m-        "if new_key ~= key then return tb[new_key] else return nil end";[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_headers_metatable_key);[m
[31m-[m
[31m-    /* metatable for ngx.req.get_headers(_, true) and[m
[31m-     * ngx.resp.get_headers(_, true) */[m
[31m-    lua_createtable(L, 0, 1);[m
[31m-[m
[31m-    rc = luaL_loadbuffer(L, buf, sizeof(buf) - 1, "=headers metatable");[m
[31m-    if (rc != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "failed to load Lua code for the metamethod for "[m
[31m-                      "headers: %i: %s", rc, lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_pop(L, 3);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_headers_count(ngx_http_request_t *r, int max)[m
[31m-{[m
[31m-    int                           count;[m
[31m-    ngx_list_part_t              *part;[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (max < 0) {[m
[31m-        max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-    }[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    count = part->nelts;[m
[31m-    while (part->next) {[m
[31m-        part = part->next;[m
[31m-        count += part->nelts;[m
[31m-    }[m
[31m-[m
[31m-    if (max > 0 && count > max) {[m
[31m-        count = max;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exceeding request header limit %d", max);[m
[31m-    }[m
[31m-[m
[31m-    return count;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ffi_table_elt_t *out, int count, int raw)[m
[31m-{[m
[31m-    int                           n;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header;[m
[31m-[m
[31m-    if (count <= 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (raw) {[m
[31m-            out[n].key.data = header[i].key.data;[m
[31m-            out[n].key.len = (int) header[i].key.len;[m
[31m-[m
[31m-        } else {[m
[31m-            out[n].key.data = header[i].lowcase_key;[m
[31m-            out[n].key.len = (int) header[i].key.len;[m
[31m-        }[m
[31m-[m
[31m-        out[n].value.data = header[i].value.data;[m
[31m-        out[n].value.len = (int) header[i].value.len;[m
[31m-[m
[31m-        if (++n == count) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r, const u_char *key_data,[m
[31m-    size_t key_len, int is_nil, const u_char *sval, size_t sval_len,[m
[31m-    ngx_http_lua_ffi_str_t *mvals, size_t mvals_len, char **errmsg)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                    value, key;[m
[31m-    ngx_uint_t                   i;[m
[31m-    size_t                       len;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_LUA_FFI_NO_REQ_CTX;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "[m
[31m-                      "set ngx.header.HEADER after sending out "[m
[31m-                      "response headers");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    key.data = ngx_palloc(r->pool, key_len + 1);[m
[31m-    if (key.data == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(key.data, key_data, key_len);[m
[31m-    key.data[key_len] = '\0';[m
[31m-    key.len = key_len;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->transform_underscores_in_resp_headers) {[m
[31m-        /* replace "_" with "-" */[m
[31m-        p = key.data;[m
[31m-        for (i = 0; i < key_len; i++) {[m
[31m-            if (p[i] == '_') {[m
[31m-                p[i] = '-';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->headers_set) {[m
[31m-        rc = ngx_http_lua_set_content_type(r);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            *errmsg = "failed to set default content type";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->headers_set = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (is_nil) {[m
[31m-        value.data = NULL;[m
[31m-        value.len = 0;[m
[31m-[m
[31m-    } else if (mvals) {[m
[31m-[m
[31m-        if (mvals_len == 0) {[m
[31m-            value.data = NULL;[m
[31m-            value.len = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            for (i = 0; i < mvals_len; i++) {[m
[31m-                dd("header value table index %d", (int) i);[m
[31m-[m
[31m-                p = mvals[i].data;[m
[31m-                len = mvals[i].len;[m
[31m-[m
[31m-                value.data = ngx_palloc(r->pool, len);[m
[31m-                if (value.data == NULL) {[m
[31m-                    goto nomem;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(value.data, p, len);[m
[31m-                value.len = len;[m
[31m-[m
[31m-                rc = ngx_http_lua_set_output_header(r, key, value,[m
[31m-                                                    i == 0 /* override */);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    *errmsg = "failed to set header";[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) sval;[m
[31m-        value.data = ngx_palloc(r->pool, sval_len);[m
[31m-        if (value.data == NULL) {[m
[31m-            goto nomem;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(value.data, p, sval_len);[m
[31m-        value.len = sval_len;[m
[31m-    }[m
[31m-[m
[31m-    dd("key: %.*s, value: %.*s",[m
[31m-       (int) key.len, key.data, (int) value.len, value.data);[m
[31m-[m
[31m-    rc = ngx_http_lua_set_output_header(r, key, value, 1 /* override */);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        *errmsg = "failed to set header";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    *errmsg = "no memory";[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_header_set_single_value(ngx_http_request_t *r,[m
[31m-    const u_char *key, size_t key_len, const u_char *value, size_t value_len)[m
[31m-{[m
[31m-    ngx_str_t                    k;[m
[31m-    ngx_str_t                    v;[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {  /* fake request */[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    k.data = ngx_palloc(r->pool, key_len + 1);[m
[31m-    if (k.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-    ngx_memcpy(k.data, key, key_len);[m
[31m-    k.data[key_len] = '\0';[m
[31m-[m
[31m-    k.len = key_len;[m
[31m-[m
[31m-    if (value_len == 0) {[m
[31m-        v.data = NULL;[m
[31m-        v.len = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        v.data = ngx_palloc(r->pool, value_len + 1);[m
[31m-        if (v.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        ngx_memcpy(v.data, value, value_len);[m
[31m-        v.data[value_len] = '\0';[m
[31m-    }[m
[31m-[m
[31m-    v.len = value_len;[m
[31m-[m
[31m-    if (ngx_http_lua_set_input_header(r, k, v, 1 /* override */)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_get_resp_header(ngx_http_request_t *r,[m
[31m-    const u_char *key, size_t key_len,[m
[31m-    u_char *key_buf, ngx_http_lua_ffi_str_t *values, int max_nvalues)[m
[31m-{[m
[31m-    int                  found;[m
[31m-    u_char               c, *p;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_table_elt_t     *h;[m
[31m-    ngx_list_part_t     *part;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (llcf->transform_underscores_in_resp_headers[m
[31m-        && memchr(key, '_', key_len) != NULL)[m
[31m-    {[m
[31m-        for (i = 0; i < key_len; i++) {[m
[31m-            c = key[i];[m
[31m-            if (c == '_') {[m
[31m-                c = '-';[m
[31m-            }[m
[31m-[m
[31m-            key_buf[i] = c;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        key_buf = (u_char *) key;[m
[31m-    }[m
[31m-[m
[31m-    switch (key_len) {[m
[31m-    case 14:[m
[31m-        if (r->headers_out.content_length == NULL[m
[31m-            && r->headers_out.content_length_n >= 0[m
[31m-            && ngx_strncasecmp(key_buf, (u_char *) "Content-Length", 14) == 0)[m
[31m-        {[m
[31m-            p = ngx_palloc(r->pool, NGX_OFF_T_LEN);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            values[0].data = p;[m
[31m-            values[0].len = (int) (ngx_snprintf(p, NGX_OFF_T_LEN, "%O",[m
[31m-                                              r->headers_out.content_length_n)[m
[31m-                            - p);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case 12:[m
[31m-        if (r->headers_out.content_type.len[m
[31m-            && ngx_strncasecmp(key_buf, (u_char *) "Content-Type", 12) == 0)[m
[31m-        {[m
[31m-            values[0].data = r->headers_out.content_type.data;[m
[31m-            values[0].len = r->headers_out.content_type.len;[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    dd("not a built-in output header");[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        /* XXX ngx_http_core_find_config_phase, for example,[m
[31m-         * may not initialize the "key" and "hash" fields[m
[31m-         * for a nasty optimization purpose, and[m
[31m-         * we have to work-around it here */[m
[31m-[m
[31m-        r->headers_out.location->hash = ngx_http_lua_location_hash;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("checking (%d) \"%.*s\"", (int) h[i].key.len, (int) h[i].key.len,[m
[31m-           h[i].key.data);[m
[31m-[m
[31m-        if (h[i].key.len == key_len[m
[31m-            && ngx_strncasecmp(key_buf, h[i].key.data, key_len) == 0)[m
[31m-        {[m
[31m-            values[found].data = h[i].value.data;[m
[31m-            values[found].len = (int) h[i].value.len;[m
[31m-[m
[31m-            if (++found >= max_nvalues) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return found;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers.h[m
[1mdeleted file mode 100644[m
[1mindex 39f1114..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_HEADERS_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_HEADERS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_resp_header_api(lua_State *L);[m
[31m-void ngx_http_lua_inject_req_header_api(lua_State *L);[m
[31m-void ngx_http_lua_create_headers_metatable(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_HEADERS_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.c[m
[1mdeleted file mode 100644[m
[1mindex 82b4331..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.c[m
[1m+++ /dev/null[m
[36m@@ -1,830 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_headers_in.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header);[m
[31m-static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_user_agent_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_connection_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_lua_validate_host(ngx_str_t *host, ngx_pool_t *pool,[m
[31m-    ngx_uint_t alloc);[m
[31m-static ngx_int_t ngx_http_set_host_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_lua_rm_header_helper(ngx_list_t *l,[m
[31m-    ngx_list_part_t *cur, ngx_uint_t i);[m
[31m-[m
[31m-[m
[31m-static ngx_http_lua_set_header_t  ngx_http_lua_set_handlers[] = {[m
[31m-    { ngx_string("Host"),[m
[31m-                 offsetof(ngx_http_headers_in_t, host),[m
[31m-                 ngx_http_set_host_header },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 offsetof(ngx_http_headers_in_t, connection),[m
[31m-                 ngx_http_set_connection_header },[m
[31m-[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_modified_since),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 9002[m
[31m-    { ngx_string("If-Unmodified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_unmodified_since),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003003[m
[31m-    { ngx_string("If-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_match),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("If-None-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_none_match),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("User-Agent"),[m
[31m-                 offsetof(ngx_http_headers_in_t, user_agent),[m
[31m-                 ngx_http_set_user_agent_header },[m
[31m-[m
[31m-    { ngx_string("Referer"),[m
[31m-                 offsetof(ngx_http_headers_in_t, referer),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_length),[m
[31m-                 ngx_http_set_content_length_header },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_type),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("If-Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, transfer_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Expect"),[m
[31m-                 offsetof(ngx_http_headers_in_t, expect),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003013[m
[31m-    { ngx_string("Upgrade"),[m
[31m-                 offsetof(ngx_http_headers_in_t, upgrade),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Accept-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Via"),[m
[31m-                 offsetof(ngx_http_headers_in_t, via),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Authorization"),[m
[31m-                 offsetof(ngx_http_headers_in_t, authorization),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 offsetof(ngx_http_headers_in_t, keep_alive),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("X-Forwarded-For"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_forwarded_for),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    { ngx_string("X-Real-IP"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_real_ip),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    { ngx_string("Depth"),[m
[31m-                 offsetof(ngx_http_headers_in_t, depth),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Destination"),[m
[31m-                 offsetof(ngx_http_headers_in_t, destination),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Overwrite"),[m
[31m-                 offsetof(ngx_http_headers_in_t, overwrite),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Cookie"),[m
[31m-                 offsetof(ngx_http_headers_in_t, cookies),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, ngx_http_set_header }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* request time implementation */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header_helper(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value, ngx_table_elt_t **output_header)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h, *matched;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_uint_t                   rc;[m
[31m-[m
[31m-    if (hv->no_override) {[m
[31m-        goto new_header;[m
[31m-    }[m
[31m-[m
[31m-    matched = NULL;[m
[31m-[m
[31m-retry:[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        dd("i: %d, part: %p", (int) i, part);[m
[31m-[m
[31m-        if (h[i].key.len == hv->key.len[m
[31m-            && ngx_strncasecmp(h[i].key.data, hv->key.data, h[i].key.len)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            if (value->len == 0 || (matched && matched != &h[i])) {[m
[31m-                h[i].hash = 0;[m
[31m-[m
[31m-                dd("rm header %.*s: %.*s", (int) h[i].key.len, h[i].key.data,[m
[31m-                   (int) h[i].value.len, h[i].value.data);[m
[31m-[m
[31m-                rc = ngx_http_lua_rm_header_helper(&r->headers_in.headers,[m
[31m-                                                   part, i);[m
[31m-[m
[31m-                ngx_http_lua_assert(!(r->headers_in.headers.part.next == NULL[m
[31m-                                      && r->headers_in.headers.last[m
[31m-                                         != &r->headers_in.headers.part));[m
[31m-[m
[31m-                dd("rm header: rc=%d", (int) rc);[m
[31m-[m
[31m-                if (rc == NGX_OK) {[m
[31m-[m
[31m-                    if (output_header) {[m
[31m-                        *output_header = NULL;[m
[31m-                    }[m
[31m-[m
[31m-                    goto retry;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h[i].value = *value;[m
[31m-[m
[31m-            if (output_header) {[m
[31m-                *output_header = &h[i];[m
[31m-                dd("setting existing builtin input header");[m
[31m-            }[m
[31m-[m
[31m-            if (matched == NULL) {[m
[31m-                matched = &h[i];[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (matched){[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-new_header:[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("created new header for %.*s", (int) hv->key.len, hv->key.data);[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        h->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    if (output_header) {[m
[31m-        *output_header = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h, **old;[m
[31m-[m
[31m-    dd("entered set_builtin_header (input)");[m
[31m-[m
[31m-    if (hv->offset) {[m
[31m-        old = (ngx_table_elt_t **) ((char *) &r->headers_in + hv->offset);[m
[31m-[m
[31m-    } else {[m
[31m-        old = NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("old builtin ptr ptr: %p", old);[m
[31m-    if (old) {[m
[31m-        dd("old builtin ptr: %p", *old);[m
[31m-    }[m
[31m-[m
[31m-    if (old == NULL || *old == NULL) {[m
[31m-        dd("set normal header");[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old);[m
[31m-    }[m
[31m-[m
[31m-    h = *old;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-        h->value = *value;[m
[31m-[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old);[m
[31m-    }[m
[31m-[m
[31m-    h->hash = hv->hash;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc)[m
[31m-{[m
[31m-    u_char  *h, ch;[m
[31m-    size_t   i, dot_pos, host_len;[m
[31m-[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_literal,[m
[31m-        sw_rest[m
[31m-    } state;[m
[31m-[m
[31m-    dot_pos = host->len;[m
[31m-    host_len = host->len;[m
[31m-[m
[31m-    h = host->data;[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-[m
[31m-    for (i = 0; i < host->len; i++) {[m
[31m-        ch = h[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '.':[m
[31m-            if (dot_pos == i - 1) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-            dot_pos = i;[m
[31m-            break;[m
[31m-[m
[31m-        case ':':[m
[31m-            if (state == sw_usual) {[m
[31m-                host_len = i;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '[':[m
[31m-            if (i == 0) {[m
[31m-                state = sw_literal;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ']':[m
[31m-            if (state == sw_literal) {[m
[31m-                host_len = i + 1;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '\0':[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            if (ngx_path_separator(ch)) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                alloc = 1;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dot_pos == host_len - 1) {[m
[31m-        host_len--;[m
[31m-    }[m
[31m-[m
[31m-    if (host_len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc) {[m
[31m-        host->data = ngx_pnalloc(pool, host_len);[m
[31m-        if (host->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_strlow(host->data, h, host_len);[m
[31m-    }[m
[31m-[m
[31m-    host->len = host_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_host_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_str_t host;[m
[31m-[m
[31m-    dd("server new value len: %d", (int) value->len);[m
[31m-[m
[31m-    if (value->len) {[m
[31m-        host= *value;[m
[31m-[m
[31m-        if (ngx_http_lua_validate_host(&host, r->pool, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.server = host;[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_in.server = *value;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_connection_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_in.connection_type = 0;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_set_builtin_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcasestrn(value->data, "close", 5 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-        r->headers_in.keep_alive_n = -1;[m
[31m-[m
[31m-    } else if (ngx_strcasestrn(value->data, "keep-alive", 10 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* borrowed the code from ngx_http_request.c:ngx_http_process_user_agent */[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_user_agent_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    u_char  *user_agent, *msie;[m
[31m-[m
[31m-    /* clear existing settings */[m
[31m-[m
[31m-    r->headers_in.msie = 0;[m
[31m-    r->headers_in.msie6 = 0;[m
[31m-    r->headers_in.opera = 0;[m
[31m-    r->headers_in.gecko = 0;[m
[31m-    r->headers_in.chrome = 0;[m
[31m-    r->headers_in.safari = 0;[m
[31m-    r->headers_in.konqueror = 0;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_set_builtin_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    /* check some widespread browsers */[m
[31m-[m
[31m-    user_agent = value->data;[m
[31m-[m
[31m-    msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1);[m
[31m-[m
[31m-    if (msie && msie + 7 < user_agent + value->len) {[m
[31m-[m
[31m-        r->headers_in.msie = 1;[m
[31m-[m
[31m-        if (msie[6] == '.') {[m
[31m-[m
[31m-            switch (msie[5]) {[m
[31m-            case '4':[m
[31m-            case '5':[m
[31m-                r->headers_in.msie6 = 1;[m
[31m-                break;[m
[31m-            case '6':[m
[31m-                if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) {[m
[31m-                    r->headers_in.msie6 = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstrn(user_agent, "Opera", 5 - 1)) {[m
[31m-        r->headers_in.opera = 1;[m
[31m-        r->headers_in.msie = 0;[m
[31m-        r->headers_in.msie6 = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->headers_in.msie && !r->headers_in.opera) {[m
[31m-[m
[31m-        if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {[m
[31m-            r->headers_in.gecko = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {[m
[31m-            r->headers_in.chrome = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)[m
[31m-                   && ngx_strstrn(user_agent, "Mac OS X", 8 - 1))[m
[31m-        {[m
[31m-            r->headers_in.safari = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {[m
[31m-            r->headers_in.konqueror = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    off_t           len;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_content_length_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_atosz(value->data, value->len);[m
[31m-    if (len == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("reset headers_in.content_length_n to %d", (int) len);[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_array_t       *headers;[m
[31m-    ngx_table_elt_t  **v, *h;[m
[31m-[m
[31m-    headers = (ngx_array_t *) ((char *) &r->headers_in + hv->offset);[m
[31m-[m
[31m-    if (!hv->no_override && headers->nelts > 0) {[m
[31m-        ngx_array_destroy(headers);[m
[31m-[m
[31m-        if (ngx_array_init(headers, r->pool, 2,[m
[31m-                           sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("clear multi-value headers: %d", (int) headers->nelts);[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (headers->nalloc == 0) {[m
[31m-        if (ngx_array_init(headers, r->pool, 2,[m
[31m-                           sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_set_header_helper(r, hv, value, &h) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("new multi-value header: %p", h);[m
[31m-[m
[31m-    v = ngx_array_push(headers);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *v = h;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_in.content_length_n = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    value->len = 0;[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_set_input_header(ngx_http_request_t *r, ngx_str_t key,[m
[31m-    ngx_str_t value, unsigned override)[m
[31m-{[m
[31m-    ngx_http_lua_header_val_t         hv;[m
[31m-    ngx_http_lua_set_header_t        *handlers = ngx_http_lua_set_handlers;[m
[31m-[m
[31m-    ngx_uint_t                        i;[m
[31m-[m
[31m-    dd("set header value: %.*s", (int) value.len, value.data);[m
[31m-[m
[31m-    hv.hash = ngx_hash_key_lc(key.data, key.len);[m
[31m-    hv.key = key;[m
[31m-[m
[31m-    hv.offset = 0;[m
[31m-    hv.no_override = !override;[m
[31m-    hv.handler = NULL;[m
[31m-[m
[31m-    for (i = 0; handlers[i].name.len; i++) {[m
[31m-        if (hv.key.len != handlers[i].name.len[m
[31m-            || ngx_strncasecmp(hv.key.data, handlers[i].name.data,[m
[31m-                               handlers[i].name.len) != 0)[m
[31m-        {[m
[31m-            dd("hv key comparison: %s <> %s", handlers[i].name.data,[m
[31m-               hv.key.data);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("Matched handler: %s %s", handlers[i].name.data, hv.key.data);[m
[31m-[m
[31m-        hv.offset = handlers[i].offset;[m
[31m-        hv.handler = handlers[i].handler;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (handlers[i].name.len == 0 && handlers[i].handler) {[m
[31m-        hv.offset = handlers[i].offset;[m
[31m-        hv.handler = handlers[i].handler;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (hv.handler == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return hv.handler(r, &hv, &value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_rm_header_helper(ngx_list_t *l, ngx_list_part_t *cur,[m
[31m-    ngx_uint_t i)[m
[31m-{[m
[31m-    ngx_table_elt_t             *data;[m
[31m-    ngx_list_part_t             *new, *part;[m
[31m-[m
[31m-    dd("list rm item: part %p, i %d, nalloc %d", cur, (int) i,[m
[31m-       (int) l->nalloc);[m
[31m-[m
[31m-    data = cur->elts;[m
[31m-[m
[31m-    dd("cur: nelts %d, nalloc %d", (int) cur->nelts,[m
[31m-       (int) l->nalloc);[m
[31m-[m
[31m-    dd("removing: \"%.*s:%.*s\"", (int) data[i].key.len, data[i].key.data,[m
[31m-       (int) data[i].value.len, data[i].value.data);[m
[31m-[m
[31m-    if (i == 0) {[m
[31m-        dd("first entry in the part");[m
[31m-        cur->elts = (char *) cur->elts + l->size;[m
[31m-        cur->nelts--;[m
[31m-[m
[31m-        if (cur == l->last) {[m
[31m-            dd("being the last part");[m
[31m-            if (cur->nelts == 0) {[m
[31m-#if 1[m
[31m-                part = &l->part;[m
[31m-                dd("cur=%p, part=%p, part next=%p, last=%p",[m
[31m-                   cur, part, part->next, l->last);[m
[31m-[m
[31m-                if (part == cur) {[m
[31m-                    cur->elts = (char *) cur->elts - l->size;[m
[31m-                    /* do nothing */[m
[31m-[m
[31m-                } else {[m
[31m-                    while (part->next != cur) {[m
[31m-                        if (part->next == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-                        part = part->next;[m
[31m-                    }[m
[31m-[m
[31m-                    l->last = part;[m
[31m-                    part->next = NULL;[m
[31m-                    dd("part nelts: %d", (int) part->nelts);[m
[31m-                    l->nalloc = part->nelts;[m
[31m-                }[m
[31m-#endif[m
[31m-[m
[31m-            } else {[m
[31m-                l->nalloc--;[m
[31m-                dd("nalloc decreased: %d", (int) l->nalloc);[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (cur->nelts == 0) {[m
[31m-            dd("current part is empty");[m
[31m-            part = &l->part;[m
[31m-            if (part == cur) {[m
[31m-                ngx_http_lua_assert(cur->next != NULL);[m
[31m-[m
[31m-                dd("remove 'cur' from the list by rewriting 'cur': "[m
[31m-                   "l->last: %p, cur: %p, cur->next: %p, part: %p",[m
[31m-                   l->last, cur, cur->next, part);[m
[31m-[m
[31m-                if (l->last == cur->next) {[m
[31m-                    dd("last is cur->next");[m
[31m-                    l->part = *(cur->next);[m
[31m-                    l->last = part;[m
[31m-                    l->nalloc = part->nelts;[m
[31m-[m
[31m-                } else {[m
[31m-                    l->part = *(cur->next);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                dd("remove 'cur' from the list");[m
[31m-                while (part->next != cur) {[m
[31m-                    if (part->next == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                    part = part->next;[m
[31m-                }[m
[31m-[m
[31m-                part->next = cur->next;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (i == cur->nelts - 1) {[m
[31m-        dd("last entry in the part");[m
[31m-[m
[31m-        cur->nelts--;[m
[31m-[m
[31m-        if (cur == l->last) {[m
[31m-            l->nalloc--;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("the middle entry in the part");[m
[31m-[m
[31m-    new = ngx_palloc(l->pool, sizeof(ngx_list_part_t));[m
[31m-    if (new == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    new->elts = &data[i + 1];[m
[31m-    new->nelts = cur->nelts - i - 1;[m
[31m-    new->next = cur->next;[m
[31m-[m
[31m-    cur->nelts = i;[m
[31m-    cur->next = new;[m
[31m-[m
[31m-    if (cur == l->last) {[m
[31m-        l->last = new;[m
[31m-        l->nalloc = new->nelts;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.h[m
[1mdeleted file mode 100644[m
[1mindex 5397471..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_HEADERS_IN_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_HEADERS_IN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_set_input_header(ngx_http_request_t *r, ngx_str_t key,[m
[31m-    ngx_str_t value, unsigned override);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_HEADERS_IN_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.c[m
[1mdeleted file mode 100644[m
[1mindex b908eae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.c[m
[1m+++ /dev/null[m
[36m@@ -1,637 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_headers_out.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header, unsigned no_create);[m
[31m-static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_last_modified_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_type_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_last_modified_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_location_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-static ngx_http_lua_set_header_t  ngx_http_lua_set_handlers[] = {[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 offsetof(ngx_http_headers_out_t, server),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 offsetof(ngx_http_headers_out_t, date),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if 1[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 offsetof(ngx_http_headers_out_t, location),[m
[31m-                 ngx_http_set_location_header },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 offsetof(ngx_http_headers_out_t, refresh),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified),[m
[31m-                 ngx_http_set_last_modified_header },[m
[31m-[m
[31m-    { ngx_string("Content-Range"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 offsetof(ngx_http_headers_out_t, www_authenticate),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 offsetof(ngx_http_headers_out_t, expires),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("E-Tag"),[m
[31m-                 offsetof(ngx_http_headers_out_t, etag),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 offsetof(ngx_http_headers_out_t, etag),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_length),[m
[31m-                 ngx_http_set_content_length_header },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_type),[m
[31m-                 ngx_http_set_content_type_header },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, ngx_http_set_header }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* request time implementation */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header_helper(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value, ngx_table_elt_t **output_header,[m
[31m-    unsigned no_create)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                   i;[m
[31m-    unsigned                     matched = 0;[m
[31m-[m
[31m-    if (hv->no_override) {[m
[31m-        goto new_header;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        /* XXX ngx_http_core_find_config_phase, for example,[m
[31m-         * may not initialize the "key" and "hash" fields[m
[31m-         * for a nasty optimization purpose, and[m
[31m-         * we have to work-around it here */[m
[31m-[m
[31m-        r->headers_out.location->hash = ngx_http_lua_location_hash;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash != 0[m
[31m-            && h[i].key.len == hv->key.len[m
[31m-            && ngx_strncasecmp(hv->key.data, h[i].key.data, h[i].key.len) == 0)[m
[31m-        {[m
[31m-            dd("found out header %.*s", (int) h[i].key.len, h[i].key.data);[m
[31m-[m
[31m-            if (value->len == 0 || matched) {[m
[31m-                dd("clearing normal header for %.*s", (int) hv->key.len,[m
[31m-                   hv->key.data);[m
[31m-[m
[31m-                h[i].value.len = 0;[m
[31m-                h[i].hash = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                dd("setting header to value %.*s", (int) value->len,[m
[31m-                   value->data);[m
[31m-[m
[31m-                h[i].value = *value;[m
[31m-                h[i].hash = hv->hash;[m
[31m-            }[m
[31m-[m
[31m-            if (output_header) {[m
[31m-                *output_header = &h[i];[m
[31m-            }[m
[31m-[m
[31m-            /* return NGX_OK; */[m
[31m-            matched = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (matched){[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (no_create && value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-new_header:[m
[31m-[m
[31m-    /* XXX we still need to create header slot even if the value[m
[31m-     * is empty because some builtin headers like Last-Modified[m
[31m-     * relies on this to get cleared */[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        h->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    if (output_header) {[m
[31m-        *output_header = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_location_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    rc = ngx_http_set_builtin_header(r, hv, value);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    h = r->headers_out.location;[m
[31m-    if (h && h->value.len && h->value.data[0] == '/') {[m
[31m-        r->headers_out.location = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h, **old;[m
[31m-[m
[31m-    if (hv->offset) {[m
[31m-        old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    } else {[m
[31m-        old = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (old == NULL || *old == NULL) {[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old, 0);[m
[31m-    }[m
[31m-[m
[31m-    h = *old;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        dd("clearing the builtin header");[m
[31m-[m
[31m-        h->hash = 0;[m
[31m-        h->value = *value;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = hv->hash;[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-    ngx_uint_t        i;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (hv->no_override) {[m
[31m-        ph = pa->elts;[m
[31m-        for (i = 0; i < pa->nelts; i++) {[m
[31m-            if (!ph[i]->hash) {[m
[31m-                ph[i]->value = *value;[m
[31m-                ph[i]->hash = hv->hash;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto create;[m
[31m-    }[m
[31m-[m
[31m-    /* override old values (if any) */[m
[31m-[m
[31m-    if (pa->nelts > 0) {[m
[31m-        ph = pa->elts;[m
[31m-        for (i = 1; i < pa->nelts; i++) {[m
[31m-            ph[i]->hash = 0;[m
[31m-            ph[i]->value.len = 0;[m
[31m-        }[m
[31m-[m
[31m-        ph[0]->value = *value;[m
[31m-[m
[31m-        if (value->len == 0) {[m
[31m-            ph[0]->hash = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            ph[0]->hash = hv->hash;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-create:[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho->value = *value;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        ho->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ho->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    ho->key = hv->key;[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_type_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_uint_t          i;[m
[31m-[m
[31m-    r->headers_out.content_type_len = value->len;[m
[31m-[m
[31m-#if 1[m
[31m-    for (i = 0; i < value->len; i++) {[m
[31m-        if (value->data[i] == ';') {[m
[31m-            r->headers_out.content_type_len = i;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->headers_out.content_type = *value;[m
[31m-    r->headers_out.content_type_hash = hv->hash;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    value->len = 0;[m
[31m-[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_last_modified_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_last_modified_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.last_modified_time = ngx_http_parse_time(value->data,[m
[31m-                                                            value->len);[m
[31m-[m
[31m-    dd("last modified time: %d", (int) r->headers_out.last_modified_time);[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_last_modified_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_out.last_modified_time = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    off_t           len;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_content_length_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_atosz(value->data, value->len);[m
[31m-    if (len == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = len;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    value->len = 0;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_str_t key,[m
[31m-    ngx_str_t value, unsigned override)[m
[31m-{[m
[31m-    ngx_http_lua_header_val_t         hv;[m
[31m-    ngx_http_lua_set_header_t        *handlers = ngx_http_lua_set_handlers;[m
[31m-    ngx_uint_t                        i;[m
[31m-[m
[31m-    dd("set header value: %.*s", (int) value.len, value.data);[m
[31m-[m
[31m-    hv.hash = ngx_hash_key_lc(key.data, key.len);[m
[31m-    hv.key = key;[m
[31m-[m
[31m-    hv.offset = 0;[m
[31m-    hv.no_override = !override;[m
[31m-    hv.handler = NULL;[m
[31m-[m
[31m-    for (i = 0; handlers[i].name.len; i++) {[m
[31m-        if (hv.key.len != handlers[i].name.len[m
[31m-            || ngx_strncasecmp(hv.key.data, handlers[i].name.data,[m
[31m-                               handlers[i].name.len) != 0)[m
[31m-        {[m
[31m-            dd("hv key comparison: %s <> %s", handlers[i].name.data,[m
[31m-               hv.key.data);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("Matched handler: %s %s", handlers[i].name.data, hv.key.data);[m
[31m-[m
[31m-        hv.offset = handlers[i].offset;[m
[31m-        hv.handler = handlers[i].handler;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (handlers[i].name.len == 0 && handlers[i].handler) {[m
[31m-        hv.offset = handlers[i].offset;[m
[31m-        hv.handler = handlers[i].handler;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (hv.handler == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return hv.handler(r, &hv, &value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_get_output_header(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_str_t *key)[m
[31m-{[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_list_part_t            *part;[m
[31m-    ngx_uint_t                  i;[m
[31m-    unsigned                    found;[m
[31m-[m
[31m-    dd("looking for response header \"%.*s\"", (int) key->len, key->data);[m
[31m-[m
[31m-    switch (key->len) {[m
[31m-    case 14:[m
[31m-        if (r->headers_out.content_length == NULL[m
[31m-            && r->headers_out.content_length_n >= 0[m
[31m-            && ngx_strncasecmp(key->data, (u_char *) "Content-Length", 14) == 0)[m
[31m-        {[m
[31m-            lua_pushinteger(L, (lua_Integer) r->headers_out.content_length_n);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case 12:[m
[31m-        if (r->headers_out.content_type.len[m
[31m-            && ngx_strncasecmp(key->data, (u_char *) "Content-Type", 12) == 0)[m
[31m-        {[m
[31m-            lua_pushlstring(L, (char *) r->headers_out.content_type.data,[m
[31m-                            r->headers_out.content_type.len);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    dd("not a built-in output header");[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        /* XXX ngx_http_core_find_config_phase, for example,[m
[31m-         * may not initialize the "key" and "hash" fields[m
[31m-         * for a nasty optimization purpose, and[m
[31m-         * we have to work-around it here */[m
[31m-[m
[31m-        r->headers_out.location->hash = ngx_http_lua_location_hash;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash != 0[m
[31m-            && h[i].key.len == key->len[m
[31m-            && ngx_strncasecmp(key->data, h[i].key.data, h[i].key.len) == 0)[m
[31m-         {[m
[31m-             if (!found) {[m
[31m-                 found = 1;[m
[31m-[m
[31m-                 lua_pushlstring(L, (char *) h[i].value.data, h[i].value.len);[m
[31m-                 continue;[m
[31m-             }[m
[31m-[m
[31m-             if (found == 1) {[m
[31m-                 lua_createtable(L, 4 /* narr */, 0);[m
[31m-                 lua_insert(L, -2);[m
[31m-                 lua_rawseti(L, -2, found);[m
[31m-             }[m
[31m-[m
[31m-             found++;[m
[31m-[m
[31m-             lua_pushlstring(L, (char *) h[i].value.data, h[i].value.len);[m
[31m-             lua_rawseti(L, -2, found);[m
[31m-         }[m
[31m-    }[m
[31m-[m
[31m-    if (found) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.h[m
[1mdeleted file mode 100644[m
[1mindex ef5e6d4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_HEADERS_OUT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_HEADERS_OUT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_str_t key,[m
[31m-    ngx_str_t value, unsigned override);[m
[31m-int ngx_http_lua_get_output_header(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_str_t *key);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_HEADERS_OUT_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initby.c[m
[1mdeleted file mode 100644[m
[1mindex e8941da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initby.c[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-#include "ngx_http_lua_initby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_by_inline(ngx_log_t *log, ngx_http_lua_main_conf_t *lmcf,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    int         status;[m
[31m-[m
[31m-    status = luaL_loadbuffer(L, (char *) lmcf->init_src.data,[m
[31m-                             lmcf->init_src.len, "=init_by_lua")[m
[31m-             || ngx_http_lua_do_call(log, L);[m
[31m-[m
[31m-    return ngx_http_lua_report(log, L, status, "init_by_lua");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_by_file(ngx_log_t *log, ngx_http_lua_main_conf_t *lmcf,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    int         status;[m
[31m-[m
[31m-    status = luaL_loadfile(L, (char *) lmcf->init_src.data)[m
[31m-             || ngx_http_lua_do_call(log, L);[m
[31m-[m
[31m-    return ngx_http_lua_report(log, L, status, "init_by_lua_file");[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initby.h[m
[1mdeleted file mode 100644[m
[1mindex 67ac0b6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initby.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_INITBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_INITBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_by_inline(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_by_file(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_INITBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.c[m
[1mdeleted file mode 100644[m
[1mindex 6754b4b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.c[m
[1m+++ /dev/null[m
[36m@@ -1,334 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_initworkerby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_http_lua_log_init_worker_error(ngx_log_t *log,[m
[31m-    u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    void                        *cur, *prev;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_conf_t                   conf;[m
[31m-    ngx_cycle_t                 *fake_cycle;[m
[31m-    ngx_module_t               **modules;[m
[31m-    ngx_open_file_t             *file, *ofile;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_connection_t            *c = NULL;[m
[31m-    ngx_http_module_t           *module;[m
[31m-    ngx_http_request_t          *r = NULL;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_conf_ctx_t         *conf_ctx, http_ctx;[m
[31m-    ngx_http_lua_loc_conf_t     *top_llcf;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_core_loc_conf_t    *clcf, *top_clcf;[m
[31m-[m
[31m-    lmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_lua_module);[m
[31m-[m
[31m-    if (lmcf == NULL[m
[31m-        || lmcf->init_worker_handler == NULL[m
[31m-        || lmcf->lua == NULL)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf_ctx = (ngx_http_conf_ctx_t *) cycle->conf_ctx[ngx_http_module.index];[m
[31m-    http_ctx.main_conf = conf_ctx->main_conf;[m
[31m-[m
[31m-    top_clcf = conf_ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    top_llcf = conf_ctx->loc_conf[ngx_http_lua_module.ctx_index];[m
[31m-[m
[31m-    ngx_memzero(&conf, sizeof(ngx_conf_t));[m
[31m-[m
[31m-    conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, cycle->log);[m
[31m-    if (conf.temp_pool == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf.temp_pool->log = cycle->log;[m
[31m-[m
[31m-    /* we fake a temporary ngx_cycle_t here because some[m
[31m-     * modules' merge conf handler may produce side effects in[m
[31m-     * cf->cycle (like ngx_proxy vs cf->cycle->paths).[m
[31m-     * also, we cannot allocate our temp cycle on the stack[m
[31m-     * because some modules like ngx_http_core_module reference[m
[31m-     * addresses within cf->cycle (i.e., via "&cf->cycle->new_log")[m
[31m-     */[m
[31m-[m
[31m-    fake_cycle = ngx_palloc(cycle->pool, sizeof(ngx_cycle_t));[m
[31m-    if (fake_cycle == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(fake_cycle, cycle, sizeof(ngx_cycle_t));[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 9007[m
[31m-[m
[31m-    ngx_queue_init(&fake_cycle->reusable_connections_queue);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_array_init(&fake_cycle->listening, cycle->pool,[m
[31m-                       cycle->listening.nelts || 1,[m
[31m-                       sizeof(ngx_listening_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003007[m
[31m-[m
[31m-    if (ngx_array_init(&fake_cycle->paths, cycle->pool, cycle->paths.nelts || 1,[m
[31m-                       sizeof(ngx_path_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    ofile = part->elts;[m
[31m-[m
[31m-    if (ngx_list_init(&fake_cycle->open_files, cycle->pool, part->nelts || 1,[m
[31m-                      sizeof(ngx_open_file_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            ofile = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        file = ngx_list_push(&fake_cycle->open_files);[m
[31m-        if (file == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(file, ofile, sizeof(ngx_open_file_t));[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&fake_cycle->shared_memory, cycle->pool, 1,[m
[31m-                      sizeof(ngx_shm_zone_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    conf.ctx = &http_ctx;[m
[31m-    conf.cycle = fake_cycle;[m
[31m-    conf.pool = fake_cycle->pool;[m
[31m-    conf.log = cycle->log;[m
[31m-[m
[31m-    http_ctx.loc_conf = ngx_pcalloc(conf.pool,[m
[31m-                                    sizeof(void *) * ngx_http_max_module);[m
[31m-    if (http_ctx.loc_conf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx.srv_conf = ngx_pcalloc(conf.pool,[m
[31m-                                    sizeof(void *) * ngx_http_max_module);[m
[31m-    if (http_ctx.srv_conf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009011[m
[31m-    modules = cycle->modules;[m
[31m-#else[m
[31m-    modules = ngx_modules;[m
[31m-#endif[m
[31m-[m
[31m-    for (i = 0; modules[i]; i++) {[m
[31m-        if (modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            cur = module->create_srv_conf(&conf);[m
[31m-            if (cur == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            http_ctx.srv_conf[modules[i]->ctx_index] = cur;[m
[31m-[m
[31m-            if (module->merge_srv_conf) {[m
[31m-                prev = module->create_srv_conf(&conf);[m
[31m-                if (prev == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rv = module->merge_srv_conf(&conf, prev, cur);[m
[31m-                if (rv != NGX_CONF_OK) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            cur = module->create_loc_conf(&conf);[m
[31m-            if (cur == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            http_ctx.loc_conf[modules[i]->ctx_index] = cur;[m
[31m-[m
[31m-            if (module->merge_loc_conf) {[m
[31m-                if (modules[i] == &ngx_http_lua_module) {[m
[31m-                    prev = top_llcf;[m
[31m-[m
[31m-                } else if (modules[i] == &ngx_http_core_module) {[m
[31m-                    prev = top_clcf;[m
[31m-[m
[31m-                } else {[m
[31m-                    prev = module->create_loc_conf(&conf);[m
[31m-                    if (prev == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                rv = module->merge_loc_conf(&conf, prev, cur);[m
[31m-                if (rv != NGX_CONF_OK) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(conf.temp_pool);[m
[31m-    conf.temp_pool = NULL;[m
[31m-[m
[31m-    c = ngx_http_lua_create_fake_connection(NULL);[m
[31m-    if (c == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c->log->handler = ngx_http_lua_log_init_worker_error;[m
[31m-[m
[31m-    r = ngx_http_lua_create_fake_request(c);[m
[31m-    if (r == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    r->main_conf = http_ctx.main_conf;[m
[31m-    r->srv_conf = http_ctx.srv_conf;[m
[31m-    r->loc_conf = http_ctx.loc_conf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003014[m
[31m-[m
[31m-#   if nginx_version >= 1009000[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-    ngx_http_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    c->log->file = clcf->error_log->file;[m
[31m-[m
[31m-    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {[m
[31m-        c->log->log_level = clcf->error_log->log_level;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_http_lua_create_ctx(r);[m
[31m-    if (ctx == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_INIT_WORKER;[m
[31m-    ctx->cur_co_ctx = NULL;[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    ngx_http_lua_set_req(lmcf->lua, r);[m
[31m-[m
[31m-    (void) lmcf->init_worker_handler(cycle->log, lmcf, lmcf->lua);[m
[31m-[m
[31m-    ngx_destroy_pool(c->pool);[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (conf.temp_pool) {[m
[31m-        ngx_destroy_pool(conf.temp_pool);[m
[31m-    }[m
[31m-[m
[31m-    if (c) {[m
[31m-        ngx_http_lua_close_fake_connection(c);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_worker_by_inline(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L)[m
[31m-{[m
[31m-    int         status;[m
[31m-[m
[31m-    status = luaL_loadbuffer(L, (char *) lmcf->init_worker_src.data,[m
[31m-                             lmcf->init_worker_src.len, "=init_worker_by_lua")[m
[31m-             || ngx_http_lua_do_call(log, L);[m
[31m-[m
[31m-    return ngx_http_lua_report(log, L, status, "init_worker_by_lua");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_worker_by_file(ngx_log_t *log, ngx_http_lua_main_conf_t *lmcf,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    int         status;[m
[31m-[m
[31m-    status = luaL_loadfile(L, (char *) lmcf->init_worker_src.data)[m
[31m-             || ngx_http_lua_do_call(log, L);[m
[31m-[m
[31m-    return ngx_http_lua_report(log, L, status, "init_worker_by_lua_file");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_log_init_worker_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_snprintf(buf, len, ", context: init_worker_by_lua*");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.h[m
[1mdeleted file mode 100644[m
[1mindex 40b2db0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_INITWORKERBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_INITWORKERBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_worker_by_inline(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_worker_by_file(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_worker(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_INITWORKERBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_lex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_lex.c[m
[1mdeleted file mode 100644[m
[1mindex 45cf754..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_lex.c[m
[1m+++ /dev/null[m
[36m@@ -1,8251 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- *[m
[31m- * WARNING: DO NOT EVER EDIT THIS FILE!![m
[31m- *[m
[31m- * This file was automatically generated by the re.pl script of sregex's[m
[31m- * "dfa-multi-re" git branch.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_lex.h"[m
[31m-#include <stdlib.h>[m
[31m-#include <stdint.h>[m
[31m-#include <stdio.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#if __GNUC__ > 3[m
[31m-#    define likely(x)       __builtin_expect((x),1)[m
[31m-#    define unlikely(x)     __builtin_expect((x),0)[m
[31m-#else[m
[31m-#    define likely(x)      (x)[m
[31m-#    define unlikely(x)    (x)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef u_char[m
[31m-#define u_char          unsigned char[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NO_MATCH = -1,[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_http_lua_lex: the "ovec" array should be allocated by the caller with at[m
[31m- * least 2 elements.[m
[31m- */[m
[31m-int[m
[31m-ngx_http_lua_lex(const u_char *const s, size_t len, int *const ovec)[m
[31m-{[m
[31m-    unsigned i = 0;[m
[31m-    int matched_0 = -1;[m
[31m-    int matched_1 = -1;[m
[31m-    int matched_id = NO_MATCH;  /* (pending) matched regex ID */[m
[31m-    int c;[m
[31m-    int caps0_0 = -1;[m
[31m-    int caps0_10 = -1;[m
[31m-    int caps0_12 = -1;[m
[31m-    int caps0_14 = -1;[m
[31m-    int caps0_2 = -1;[m
[31m-    int caps0_4 = -1;[m
[31m-    int caps0_6 = -1;[m
[31m-    int caps0_8 = -1;[m
[31m-    int caps1_0 = -1;[m
[31m-    int caps1_10 = -1;[m
[31m-    int caps1_12 = -1;[m
[31m-    int caps1_14 = -1;[m
[31m-    int caps1_2 = -1;[m
[31m-    int caps1_4 = -1;[m
[31m-    int caps1_6 = -1;[m
[31m-    int caps1_8 = -1;[m
[31m-    int caps2_0 = -1;[m
[31m-    int caps2_10 = -1;[m
[31m-    int caps2_2 = -1;[m
[31m-    int caps2_4 = -1;[m
[31m-    int caps2_6 = -1;[m
[31m-    int caps2_8 = -1;[m
[31m-    int caps3_10 = -1;[m
[31m-[m
[31m-    {  /* DFA node {0} 0 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st0_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* transfer caps from row 0 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st0_error;[m
[31m-[m
[31m-st1: {  /* DFA node {1} 1 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st1_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* transfer caps from row 0 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st1_error;[m
[31m-[m
[31m-st2: {  /* DFA node {59,1} 2 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st2_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st2_error;[m
[31m-[m
[31m-st3: {  /* DFA node {72,1} 3 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st3_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st3_error;[m
[31m-[m
[31m-st4: {  /* DFA node {30,50,1} 4 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st4_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st27;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st4_error;[m
[31m-[m
[31m-st5: {  /* DFA node {21,1} 5 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st5_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st28;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st29;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 1 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st5_error;[m
[31m-[m
[31m-st6: {  /* DFA node {41,1} 6 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st6_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st30;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st31;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 1 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st6_error;[m
[31m-[m
[31m-st7: {  /* DFA node {11,1} 7 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st8: {  /* DFA node {16,1} 8 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st9: {  /* DFA node {65,1} 9 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st9_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st9_error;[m
[31m-[m
[31m-st10: {  /* DFA node {67,59,1} 10 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st11: {  /* DFA node {65,72,1} 11 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st11_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st11_error;[m
[31m-[m
[31m-st12: {  /* DFA node {65,30,50,1} 12 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st12_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* transfer caps from row 3 to row 5 */[m
[31m-        /* capture stores */[m
[31m-        goto st44;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st12_error;[m
[31m-[m
[31m-st13: {  /* DFA node {65,21,1} 13 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st13_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st45;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st46;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st13_error;[m
[31m-[m
[31m-st14: {  /* DFA node {62,1} 14 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st14_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st48;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st49;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st50;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st51;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st52;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st53;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st54;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st47;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st14_error;[m
[31m-[m
[31m-st15: {  /* DFA node {65,41,1} 15 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st15_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st55;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st56;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st15_error;[m
[31m-[m
[31m-st16: {  /* DFA node {65,11,1} 16 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st17: {  /* DFA node {65,16,1} 17 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st18: {  /* DFA node {78,1} 18 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st18_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st18_error;[m
[31m-[m
[31m-st19: {  /* DFA node {78,59,1} 19 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st19_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st19_error;[m
[31m-[m
[31m-st20: {  /* DFA node {80,72,1} 20 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st21: {  /* DFA node {78,30,50,1} 21 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st21_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* transfer caps from row 3 to row 5 */[m
[31m-        /* capture stores */[m
[31m-        goto st70;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st21_error;[m
[31m-[m
[31m-st22: {  /* DFA node {78,21,1} 22 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st22_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st71;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st72;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st22_error;[m
[31m-[m
[31m-st23: {  /* DFA node {75,1} 23 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st23_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st74;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st75;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st76;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st77;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st78;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st79;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st80;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st73;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st23_error;[m
[31m-[m
[31m-st24: {  /* DFA node {78,41,1} 24 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st24_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st81;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st82;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st24_error;[m
[31m-[m
[31m-st25: {  /* DFA node {78,11,1} 25 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st26: {  /* DFA node {78,16,1} 26 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st27: {  /* DFA node {31,51,30,50,1} 27 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 91) {[m
[31m-            goto st88;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 90)[m
[31m-            || (c >= 92 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 1 to row 0 */[m
[31m-            caps0_10 = caps1_10;[m
[31m-            goto st87;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st28: {  /* DFA node {23,1} 28 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st28_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st28;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st29;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 1 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st28_error;[m
[31m-[m
[31m-st29: {  /* DFA node {25,21,1} 29 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st30: {  /* DFA node {43,1} 30 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st30_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st30;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st31;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 1 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st30_error;[m
[31m-[m
[31m-st31: {  /* DFA node {45,41,1} 31 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st35: {  /* DFA node {65,78,1} 35 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st35_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st35_error;[m
[31m-[m
[31m-st36: {  /* DFA node {67,78,59,1} 36 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st37: {  /* DFA node {65,80,72,1} 37 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st38: {  /* DFA node {65,78,30,50,1} 38 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st38_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 4 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 4 to row 5 */[m
[31m-        /* transfer caps from row 4 to row 6 */[m
[31m-        /* capture stores */[m
[31m-        goto st91;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 4 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st38_error;[m
[31m-[m
[31m-st39: {  /* DFA node {65,78,21,1} 39 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st39_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st92;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st93;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st39_error;[m
[31m-[m
[31m-st40: {  /* DFA node {62,75,1} 40 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st40_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st95;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st96;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st97;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st98;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st99;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st100;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st101;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st94;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st40_error;[m
[31m-[m
[31m-st41: {  /* DFA node {65,78,41,1} 41 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st41_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st102;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st103;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st41_error;[m
[31m-[m
[31m-st42: {  /* DFA node {65,78,11,1} 42 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st43: {  /* DFA node {65,78,16,1} 43 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st44: {  /* DFA node {65,31,51,30,50,1} 44 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st110;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st45: {  /* DFA node {65,23,1} 45 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st45_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st45;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st46;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st45_error;[m
[31m-[m
[31m-st46: {  /* DFA node {65,25,21,1} 46 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st47: {  /* DFA node {63,1} 47 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st47_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st47_error;[m
[31m-[m
[31m-st48: {  /* DFA node {63,59,1} 48 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st48_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st48_error;[m
[31m-[m
[31m-st49: {  /* DFA node {63,72,1} 49 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st49_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st49_error;[m
[31m-[m
[31m-st50: {  /* DFA node {63,30,50,1} 50 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st50_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* transfer caps from row 3 to row 5 */[m
[31m-        /* capture stores */[m
[31m-        goto st44;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st50_error;[m
[31m-[m
[31m-st51: {  /* DFA node {63,21,1} 51 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st51_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st45;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st46;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st51_error;[m
[31m-[m
[31m-st52: {  /* DFA node {63,41,1} 52 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st52_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st55;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st56;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st52_error;[m
[31m-[m
[31m-st53: {  /* DFA node {63,11,1} 53 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st54: {  /* DFA node {63,16,1} 54 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st55: {  /* DFA node {65,43,1} 55 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st55_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st55;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st56;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st55_error;[m
[31m-[m
[31m-st56: {  /* DFA node {65,45,41,1} 56 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st57: {  /* DFA node {65} 57 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st57_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st58;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st59;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st57;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st57_error;[m
[31m-[m
[31m-st58: {  /* DFA node {67} 58 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st59: {  /* DFA node {62} 59 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st59_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-        goto st112;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st59_error;[m
[31m-[m
[31m-st60: {  /* DFA node {78,65,1} 60 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st60_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st60_error;[m
[31m-[m
[31m-st61: {  /* DFA node {78,67,59,1} 61 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st62: {  /* DFA node {80,65,72,1} 62 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st63: {  /* DFA node {78,65,30,50,1} 63 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st63_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 4 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 4 to row 5 */[m
[31m-        /* transfer caps from row 4 to row 6 */[m
[31m-        /* capture stores */[m
[31m-        goto st113;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 4 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st63_error;[m
[31m-[m
[31m-st64: {  /* DFA node {78,65,21,1} 64 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st64_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st114;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st115;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st64_error;[m
[31m-[m
[31m-st65: {  /* DFA node {75,62,1} 65 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st65_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st117;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st118;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st119;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st120;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st121;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st122;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st123;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st116;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st65_error;[m
[31m-[m
[31m-st66: {  /* DFA node {78,65,41,1} 66 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st66_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st124;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st125;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st66_error;[m
[31m-[m
[31m-st67: {  /* DFA node {78,65,11,1} 67 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st68: {  /* DFA node {78,65,16,1} 68 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st70: {  /* DFA node {78,31,51,30,50,1} 70 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st132;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st71: {  /* DFA node {78,23,1} 71 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st71_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st71;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st72;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st71_error;[m
[31m-[m
[31m-st72: {  /* DFA node {78,25,21,1} 72 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st73: {  /* DFA node {76,1} 73 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st73_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st73_error;[m
[31m-[m
[31m-st74: {  /* DFA node {76,59,1} 74 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st74_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st74_error;[m
[31m-[m
[31m-st75: {  /* DFA node {76,72,1} 75 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st75_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st75_error;[m
[31m-[m
[31m-st76: {  /* DFA node {76,30,50,1} 76 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st76_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* transfer caps from row 3 to row 5 */[m
[31m-        /* capture stores */[m
[31m-        goto st70;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st76_error;[m
[31m-[m
[31m-st77: {  /* DFA node {76,21,1} 77 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st77_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st71;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st72;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st77_error;[m
[31m-[m
[31m-st78: {  /* DFA node {76,41,1} 78 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st78_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st81;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st82;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st78_error;[m
[31m-[m
[31m-st79: {  /* DFA node {76,11,1} 79 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st80: {  /* DFA node {76,16,1} 80 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st81: {  /* DFA node {78,43,1} 81 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st81_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st81;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st82;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st81_error;[m
[31m-[m
[31m-st82: {  /* DFA node {78,45,41,1} 82 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st83: {  /* DFA node {78} 83 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st83_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 39: {[m
[31m-        goto st84;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st85;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st83;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st83_error;[m
[31m-[m
[31m-st84: {  /* DFA node {80} 84 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st85: {  /* DFA node {75} 85 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st85_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-        goto st134;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st85_error;[m
[31m-[m
[31m-st87: {  /* DFA node {53} 87 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st87;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st88: {  /* DFA node {32,53} 88 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 61) {[m
[31m-            goto st135;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st136;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 92 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 1 to row 0 */[m
[31m-            caps0_10 = caps1_10;[m
[31m-            goto st87;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st91: {  /* DFA node {65,78,31,51,30,50,1} 91 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st140;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st92: {  /* DFA node {65,78,23,1} 92 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st92_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st92;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st93;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st92_error;[m
[31m-[m
[31m-st93: {  /* DFA node {65,78,25,21,1} 93 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st94: {  /* DFA node {63,76,1} 94 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st94_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st94_error;[m
[31m-[m
[31m-st95: {  /* DFA node {63,76,59,1} 95 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st95_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st95_error;[m
[31m-[m
[31m-st96: {  /* DFA node {63,76,72,1} 96 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st96_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st96_error;[m
[31m-[m
[31m-st97: {  /* DFA node {63,76,30,50,1} 97 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st97_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 4 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 4 to row 5 */[m
[31m-        /* transfer caps from row 4 to row 6 */[m
[31m-        /* capture stores */[m
[31m-        goto st91;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 4 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st97_error;[m
[31m-[m
[31m-st98: {  /* DFA node {63,76,21,1} 98 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st98_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st92;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st93;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st98_error;[m
[31m-[m
[31m-st99: {  /* DFA node {63,76,41,1} 99 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st99_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st102;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st103;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st99_error;[m
[31m-[m
[31m-st100: {  /* DFA node {63,76,11,1} 100 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st101: {  /* DFA node {63,76,16,1} 101 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st102: {  /* DFA node {65,78,43,1} 102 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st102_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st102;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st103;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st102_error;[m
[31m-[m
[31m-st103: {  /* DFA node {65,78,45,41,1} 103 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st104: {  /* DFA node {65,78} 104 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st104_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st105;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        goto st106;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st107;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st104;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st104_error;[m
[31m-[m
[31m-st105: {  /* DFA node {67,78} 105 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st106: {  /* DFA node {65,80} 106 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st107: {  /* DFA node {62,75} 107 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st107_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-        goto st142;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st107_error;[m
[31m-[m
[31m-st108: {  /* DFA node {65,53} 108 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st109: {  /* DFA node {67,53} 109 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st110: {  /* DFA node {65,32,53} 110 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st143;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st144;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st111: {  /* DFA node {62,53} 111 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st145;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st112: {  /* DFA node {63} 112 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st112_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st58;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st59;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st57;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st112_error;[m
[31m-[m
[31m-st113: {  /* DFA node {78,65,31,51,30,50,1} 113 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st149;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st114: {  /* DFA node {78,65,23,1} 114 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st114_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st114;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st115;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st114_error;[m
[31m-[m
[31m-st115: {  /* DFA node {78,65,25,21,1} 115 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st116: {  /* DFA node {76,63,1} 116 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st116_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st116_error;[m
[31m-[m
[31m-st117: {  /* DFA node {76,63,59,1} 117 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st117_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st117_error;[m
[31m-[m
[31m-st118: {  /* DFA node {76,63,72,1} 118 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st118_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st118_error;[m
[31m-[m
[31m-st119: {  /* DFA node {76,63,30,50,1} 119 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st119_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 4 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 4 to row 5 */[m
[31m-        /* transfer caps from row 4 to row 6 */[m
[31m-        /* capture stores */[m
[31m-        goto st113;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 4 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st119_error;[m
[31m-[m
[31m-st120: {  /* DFA node {76,63,21,1} 120 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st120_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st114;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st115;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st120_error;[m
[31m-[m
[31m-st121: {  /* DFA node {76,63,41,1} 121 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st121_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st124;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st125;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st121_error;[m
[31m-[m
[31m-st122: {  /* DFA node {76,63,11,1} 122 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st123: {  /* DFA node {76,63,16,1} 123 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st124: {  /* DFA node {78,65,43,1} 124 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st124_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st124;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st125;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st124_error;[m
[31m-[m
[31m-st125: {  /* DFA node {78,65,45,41,1} 125 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st126: {  /* DFA node {78,65} 126 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st126_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st127;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        goto st128;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st129;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st126;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st126_error;[m
[31m-[m
[31m-st127: {  /* DFA node {78,67} 127 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st128: {  /* DFA node {80,65} 128 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st129: {  /* DFA node {75,62} 129 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st129_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-        goto st151;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st129_error;[m
[31m-[m
[31m-st130: {  /* DFA node {78,53} 130 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st131: {  /* DFA node {80,53} 131 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st132: {  /* DFA node {78,32,53} 132 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st152;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st153;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st133: {  /* DFA node {75,53} 133 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st154;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st134: {  /* DFA node {76} 134 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st134_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 39: {[m
[31m-        goto st84;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st85;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st83;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st134_error;[m
[31m-[m
[31m-st135: {  /* DFA node {34,53} 135 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 61) {[m
[31m-            goto st135;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st136;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 92 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 1 to row 0 */[m
[31m-            caps0_10 = caps1_10;[m
[31m-            goto st87;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st136: {  /* DFA node {36,53} 136 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st137: {  /* DFA node {65,78,53} 137 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st138: {  /* DFA node {67,78,53} 138 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st139: {  /* DFA node {65,80,53} 139 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st140: {  /* DFA node {65,78,32,53} 140 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st156;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st157;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st141: {  /* DFA node {62,75,53} 141 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st158;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st142: {  /* DFA node {63,76} 142 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st142_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st105;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        goto st106;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st107;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st104;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st142_error;[m
[31m-[m
[31m-st143: {  /* DFA node {65,34,53} 143 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st143;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st144;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st144: {  /* DFA node {65,36,53} 144 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st145: {  /* DFA node {63,53} 145 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st146: {  /* DFA node {78,65,53} 146 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st147: {  /* DFA node {78,67,53} 147 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st148: {  /* DFA node {80,65,53} 148 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st149: {  /* DFA node {78,65,32,53} 149 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st159;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st160;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st150: {  /* DFA node {75,62,53} 150 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st161;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st151: {  /* DFA node {76,63} 151 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st151_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st127;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        goto st128;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st129;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st126;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st151_error;[m
[31m-[m
[31m-st152: {  /* DFA node {78,34,53} 152 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st152;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st153;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st153: {  /* DFA node {78,36,53} 153 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st154: {  /* DFA node {76,53} 154 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st156: {  /* DFA node {65,78,34,53} 156 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st156;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st157;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st157: {  /* DFA node {65,78,36,53} 157 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st158: {  /* DFA node {63,76,53} 158 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st159: {  /* DFA node {78,65,34,53} 159 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st159;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st160;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st160: {  /* DFA node {78,65,36,53} 160 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st161: {  /* DFA node {76,63,53} 161 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st0_error:[m
[31m-st1_error:[m
[31m-st2_error:[m
[31m-st3_error:[m
[31m-st4_error:[m
[31m-st5_error:[m
[31m-st6_error:[m
[31m-st9_error:[m
[31m-st11_error:[m
[31m-st12_error:[m
[31m-st13_error:[m
[31m-st14_error:[m
[31m-st15_error:[m
[31m-st18_error:[m
[31m-st19_error:[m
[31m-st21_error:[m
[31m-st22_error:[m
[31m-st23_error:[m
[31m-st24_error:[m
[31m-st28_error:[m
[31m-st30_error:[m
[31m-st35_error:[m
[31m-st38_error:[m
[31m-st39_error:[m
[31m-st40_error:[m
[31m-st41_error:[m
[31m-st45_error:[m
[31m-st47_error:[m
[31m-st48_error:[m
[31m-st49_error:[m
[31m-st50_error:[m
[31m-st51_error:[m
[31m-st52_error:[m
[31m-st55_error:[m
[31m-st57_error:[m
[31m-st59_error:[m
[31m-st60_error:[m
[31m-st63_error:[m
[31m-st64_error:[m
[31m-st65_error:[m
[31m-st66_error:[m
[31m-st71_error:[m
[31m-st73_error:[m
[31m-st74_error:[m
[31m-st75_error:[m
[31m-st76_error:[m
[31m-st77_error:[m
[31m-st78_error:[m
[31m-st81_error:[m
[31m-st83_error:[m
[31m-st85_error:[m
[31m-st92_error:[m
[31m-st94_error:[m
[31m-st95_error:[m
[31m-st96_error:[m
[31m-st97_error:[m
[31m-st98_error:[m
[31m-st99_error:[m
[31m-st102_error:[m
[31m-st104_error:[m
[31m-st107_error:[m
[31m-st112_error:[m
[31m-st114_error:[m
[31m-st116_error:[m
[31m-st117_error:[m
[31m-st118_error:[m
[31m-st119_error:[m
[31m-st120_error:[m
[31m-st121_error:[m
[31m-st124_error:[m
[31m-st126_error:[m
[31m-st129_error:[m
[31m-st134_error:[m
[31m-st142_error:[m
[31m-st151_error:[m
[31m-[m
[31m-    if (matched_0 != -1) {[m
[31m-        ovec[0] = matched_0;[m
[31m-        ovec[1] = matched_1;[m
[31m-        return matched_id;  /* fallback */[m
[31m-    }[m
[31m-    return NO_MATCH;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_lex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_lex.h[m
[1mdeleted file mode 100644[m
[1mindex 11f102c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_lex.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_LEX_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_LEX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-int ngx_http_lua_lex(const u_char *const s, size_t len, int *const ovec);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_log.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_log.c[m
[1mdeleted file mode 100644[m
[1mindex c2b2269..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_log.c[m
[1m+++ /dev/null[m
[36m@@ -1,316 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_print(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_log(lua_State *L);[m
[31m-static int log_wrapper(ngx_log_t *log, const char *ident,[m
[31m-    ngx_uint_t level, lua_State *L);[m
[31m-static void ngx_http_lua_inject_log_consts(lua_State *L);[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Wrapper of nginx log functionality. Take a log level param and varargs of[m
[31m- * log message params.[m
[31m- *[m
[31m- * @param L Lua state pointer[m
[31m- * @retval always 0 (don't return values to Lua)[m
[31m- * */[m
[31m-int[m
[31m-ngx_http_lua_ngx_log(lua_State *L)[m
[31m-{[m
[31m-    ngx_log_t                   *log;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    const char                  *msg;[m
[31m-    int                          level;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    if (r && r->connection && r->connection->log) {[m
[31m-        log = r->connection->log;[m
[31m-[m
[31m-    } else {[m
[31m-        log = ngx_cycle->log;[m
[31m-    }[m
[31m-[m
[31m-    level = luaL_checkint(L, 1);[m
[31m-    if (level < NGX_LOG_STDERR || level > NGX_LOG_DEBUG) {[m
[31m-        msg = lua_pushfstring(L, "bad log level: %d", level);[m
[31m-        return luaL_argerror(L, 1, msg);[m
[31m-    }[m
[31m-[m
[31m-    /* remove log-level param from stack */[m
[31m-    lua_remove(L, 1);[m
[31m-[m
[31m-    return log_wrapper(log, "[lua] ", (ngx_uint_t) level, L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Override Lua print function, output message to nginx error logs. Equal to[m
[31m- * ngx.log(ngx.NOTICE, ...).[m
[31m- *[m
[31m- * @param L Lua state pointer[m
[31m- * @retval always 0 (don't return values to Lua)[m
[31m- * */[m
[31m-int[m
[31m-ngx_http_lua_print(lua_State *L)[m
[31m-{[m
[31m-    ngx_log_t                   *log;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    if (r && r->connection && r->connection->log) {[m
[31m-        log = r->connection->log;[m
[31m-[m
[31m-    } else {[m
[31m-        log = ngx_cycle->log;[m
[31m-    }[m
[31m-[m
[31m-    return log_wrapper(log, "[lua] ", NGX_LOG_NOTICE, L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-log_wrapper(ngx_log_t *log, const char *ident, ngx_uint_t level,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    u_char              *buf;[m
[31m-    u_char              *p, *q;[m
[31m-    ngx_str_t            name;[m
[31m-    int                  nargs, i;[m
[31m-    size_t               size, len;[m
[31m-    size_t               src_len = 0;[m
[31m-    int                  type;[m
[31m-    const char          *msg;[m
[31m-    lua_Debug            ar;[m
[31m-[m
[31m-    if (level > log->log_level) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    /* add debug info */[m
[31m-[m
[31m-    lua_getstack(L, 1, &ar);[m
[31m-    lua_getinfo(L, "Snl", &ar);[m
[31m-[m
[31m-    /* get the basename of the Lua source file path, stored in q */[m
[31m-    name.data = (u_char *) ar.short_src;[m
[31m-    if (name.data == NULL) {[m
[31m-        name.len = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        p = name.data;[m
[31m-        while (*p != '\0') {[m
[31m-            if (*p == '/' || *p == '\\') {[m
[31m-                name.data = p + 1;[m
[31m-            }[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        name.len = p - name.data;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    size = name.len + NGX_INT_T_LEN + sizeof(":: ") - 1;[m
[31m-[m
[31m-    if (*ar.namewhat != '\0' && *ar.what == 'L') {[m
[31m-        src_len = ngx_strlen(ar.name);[m
[31m-        size += src_len + sizeof("(): ") - 1;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-        type = lua_type(L, i);[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                lua_tolstring(L, i, &len);[m
[31m-                size += len;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                size += sizeof("nil") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, i)) {[m
[31m-                    size += sizeof("true") - 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    size += sizeof("false") - 1;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-                if (!luaL_callmeta(L, i, "__tostring")) {[m
[31m-                    return luaL_argerror(L, i, "expected table to have "[m
[31m-                                         "__tostring metamethod");[m
[31m-                }[m
[31m-[m
[31m-                lua_tolstring(L, -1, &len);[m
[31m-                size += len;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                if (lua_touserdata(L, i) == NULL) {[m
[31m-                    size += sizeof("null") - 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-                msg = lua_pushfstring(L, "string, number, boolean, or nil "[m
[31m-                                      "expected, got %s",[m
[31m-                                      lua_typename(L, type));[m
[31m-                return luaL_argerror(L, i, msg);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    buf = lua_newuserdata(L, size);[m
[31m-[m
[31m-    p = ngx_copy(buf, name.data, name.len);[m
[31m-[m
[31m-    *p++ = ':';[m
[31m-[m
[31m-    p = ngx_snprintf(p, NGX_INT_T_LEN, "%d",[m
[31m-                     ar.currentline ? ar.currentline : ar.linedefined);[m
[31m-[m
[31m-    *p++ = ':'; *p++ = ' ';[m
[31m-[m
[31m-    if (*ar.namewhat != '\0' && *ar.what == 'L') {[m
[31m-        p = ngx_copy(p, ar.name, src_len);[m
[31m-        *p++ = '(';[m
[31m-        *p++ = ')';[m
[31m-        *p++ = ':';[m
[31m-        *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-        type = lua_type(L, i);[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                q = (u_char *) lua_tolstring(L, i, &len);[m
[31m-                p = ngx_copy(p, q, len);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                *p++ = 'n';[m
[31m-                *p++ = 'i';[m
[31m-                *p++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, i)) {[m
[31m-                    *p++ = 't';[m
[31m-                    *p++ = 'r';[m
[31m-                    *p++ = 'u';[m
[31m-                    *p++ = 'e';[m
[31m-[m
[31m-                } else {[m
[31m-                    *p++ = 'f';[m
[31m-                    *p++ = 'a';[m
[31m-                    *p++ = 'l';[m
[31m-                    *p++ = 's';[m
[31m-                    *p++ = 'e';[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-                luaL_callmeta(L, i, "__tostring");[m
[31m-                q = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-                p = ngx_copy(p, q, len);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                *p++ = 'n';[m
[31m-                *p++ = 'u';[m
[31m-                *p++ = 'l';[m
[31m-                *p++ = 'l';[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "impossible to reach here");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p - buf > (off_t) size) {[m
[31m-        return luaL_error(L, "buffer error: %d > %d", (int) (p - buf),[m
[31m-                          (int) size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, log, 0, "%s%*s", ident, (size_t) (p - buf), buf);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_log_api(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_inject_log_consts(L);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_log);[m
[31m-    lua_setfield(L, -2, "log");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_print);[m
[31m-    lua_setglobal(L, "print");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_inject_log_consts(lua_State *L)[m
[31m-{[m
[31m-    /* {{{ nginx log level constants */[m
[31m-    lua_pushinteger(L, NGX_LOG_STDERR);[m
[31m-    lua_setfield(L, -2, "STDERR");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_EMERG);[m
[31m-    lua_setfield(L, -2, "EMERG");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_ALERT);[m
[31m-    lua_setfield(L, -2, "ALERT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_CRIT);[m
[31m-    lua_setfield(L, -2, "CRIT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_ERR);[m
[31m-    lua_setfield(L, -2, "ERR");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_WARN);[m
[31m-    lua_setfield(L, -2, "WARN");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_NOTICE);[m
[31m-    lua_setfield(L, -2, "NOTICE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_INFO);[m
[31m-    lua_setfield(L, -2, "INFO");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_DEBUG);[m
[31m-    lua_setfield(L, -2, "DEBUG");[m
[31m-    /* }}} */[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_log.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_log.h[m
[1mdeleted file mode 100644[m
[1mindex 42f1839..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_log.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_LOG_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_LOG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_log_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_LOG_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_logby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_logby.c[m
[1mdeleted file mode 100644[m
[1mindex 0a79acd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_logby.c[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-#include "ngx_http_lua_logby.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_log_by_chunk(lua_State *L, ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_log_by_lua_env(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    /*  set nginx request pointer to current lua thread's globals table */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-[m
[31m-    /**[m
[31m-     * we want to create empty environment for current script[m
[31m-     *[m
[31m-     * newt = {}[m
[31m-     * newt["_G"] = newt[m
[31m-     * setmetatable(newt, {__index = _G})[m
[31m-     *[m
[31m-     * if a function or symbol is not defined in our env, __index will lookup[m
[31m-     * in the global env.[m
[31m-     *[m
[31m-     * all variables created in the script-env will be thrown away at the end[m
[31m-     * of the script run.[m
[31m-     * */[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    lua_createtable(L, 0, 1);    /*  the metatable for the new env */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable({}, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_log_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua log handler, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->log_handler == NULL) {[m
[31m-        dd("no log handler found");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_LOG;[m
[31m-[m
[31m-    dd("calling log handler");[m
[31m-    return llcf->log_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_log_handler_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    dd("log by lua inline");[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->log_src.value.data,[m
[31m-                                       llcf->log_src.value.len,[m
[31m-                                       llcf->log_src_key,[m
[31m-                                       (const char *) llcf->log_chunkname);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_log_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_log_handler_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &llcf->log_src, &eval_src) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->log_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_log_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_log_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t        rc;[m
[31m-    u_char          *err_msg;[m
[31m-    size_t           len;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t      *old_pool;[m
[31m-#endif[m
[31m-[m
[31m-    /*  set Lua VM panic handler */[m
[31m-    lua_atpanic(L, ngx_http_lua_atpanic);[m
[31m-[m
[31m-    NGX_LUA_EXCEPTION_TRY {[m
[31m-[m
[31m-        /* initialize nginx context in Lua VM, code chunk at stack top sp = 1 */[m
[31m-        ngx_http_lua_log_by_lua_env(L, r);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        /* XXX: work-around to nginx regex subsystem */[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-        lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-        /*  protected call user code */[m
[31m-        rc = lua_pcall(L, 0, 1, 1);[m
[31m-[m
[31m-        lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        /* XXX: work-around to nginx regex subsystem */[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-        if (rc != 0) {[m
[31m-            /*  error occured when running loaded code */[m
[31m-            err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-            if (err_msg == NULL) {[m
[31m-                err_msg = (u_char *) "unknown reason";[m
[31m-                len = sizeof("unknown reason") - 1;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "failed to run log_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-            lua_settop(L, 0);    /*  clear remaining elems on stack */[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } NGX_LUA_EXCEPTION_CATCH {[m
[31m-[m
[31m-        dd("nginx execution restored");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  clear Lua stack */[m
[31m-    lua_settop(L, 0);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_logby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_logby.h[m
[1mdeleted file mode 100644[m
[1mindex af8aaaa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_logby.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_LOGBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_LOGBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_log_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_log_handler_inline(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_log_handler_file(ngx_http_request_t *r);[m
[31m-void ngx_http_lua_inject_logby_ngx_api(ngx_conf_t *cf, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_LOGBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_misc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_misc.c[m
[1mdeleted file mode 100644[m
[1mindex f96e2f2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_misc.c[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_ctx.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_get(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_set(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_is_internal(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_misc_api(lua_State *L)[m
[31m-{[m
[31m-    /* ngx. getter and setter */[m
[31m-    lua_createtable(L, 0, 2); /* metatable for .ngx */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_misc_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_is_internal);[m
[31m-    lua_setfield(L, -2, "is_internal");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_is_internal(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    lua_pushboolean(L, r->internal == 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_get(lua_State *L)[m
[31m-{[m
[31m-    int                          status;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, -1, &len);[m
[31m-[m
[31m-    dd("ngx get %s", p);[m
[31m-[m
[31m-    if (len == sizeof("status") - 1[m
[31m-        && ngx_strncmp(p, "status", sizeof("status") - 1) == 0)[m
[31m-    {[m
[31m-        ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-        if (r->err_status) {[m
[31m-            status = r->err_status;[m
[31m-[m
[31m-        } else if (r->headers_out.status) {[m
[31m-            status = r->headers_out.status;[m
[31m-[m
[31m-        } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-            status = 9;[m
[31m-[m
[31m-        } else {[m
[31m-            status = 0;[m
[31m-        }[m
[31m-[m
[31m-        lua_pushinteger(L, status);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (len == sizeof("ctx") - 1[m
[31m-        && ngx_strncmp(p, "ctx", sizeof("ctx") - 1) == 0)[m
[31m-    {[m
[31m-        return ngx_http_lua_ngx_get_ctx(L);[m
[31m-    }[m
[31m-[m
[31m-    if (len == sizeof("is_subrequest") - 1[m
[31m-        && ngx_strncmp(p, "is_subrequest", sizeof("is_subrequest") - 1) == 0)[m
[31m-    {[m
[31m-        lua_pushboolean(L, r != r->main);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (len == sizeof("headers_sent") - 1[m
[31m-        && ngx_strncmp(p, "headers_sent", sizeof("headers_sent") - 1) == 0)[m
[31m-    {[m
[31m-        ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-        dd("headers sent: %d", r->header_sent || ctx->header_sent);[m
[31m-[m
[31m-        lua_pushboolean(L, r->header_sent || ctx->header_sent);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("key %s not matched", p);[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_set(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-[m
[31m-    /* we skip the first argument that is the table */[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    if (len == sizeof("status") - 1[m
[31m-        && ngx_strncmp(p, "status", sizeof("status") - 1) == 0)[m
[31m-    {[m
[31m-        r = ngx_http_lua_get_req(L);[m
[31m-        if (r == NULL) {[m
[31m-            return luaL_error(L, "no request object found");[m
[31m-        }[m
[31m-[m
[31m-        if (r->header_sent) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to set ngx.status after sending out "[m
[31m-                          "response headers");[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (r->err_status) {[m
[31m-            r->err_status = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-        /* get the value */[m
[31m-        r->headers_out.status = (ngx_uint_t) luaL_checknumber(L, 3);[m
[31m-[m
[31m-        if (r->headers_out.status == 101) {[m
[31m-            /*[m
[31m-             * XXX work-around a bug in the Nginx core that 101 does[m
[31m-             * not have a default status line[m
[31m-             */[m
[31m-[m
[31m-            ngx_str_set(&r->headers_out.status_line, "101 Switching Protocols");[m
[31m-[m
[31m-        } else {[m
[31m-            r->headers_out.status_line.len = 0;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (len == sizeof("ctx") - 1[m
[31m-        && ngx_strncmp(p, "ctx", sizeof("ctx") - 1) == 0)[m
[31m-    {[m
[31m-        r = ngx_http_lua_get_req(L);[m
[31m-        if (r == NULL) {[m
[31m-            return luaL_error(L, "no request object found");[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_lua_ngx_set_ctx(L);[m
[31m-    }[m
[31m-[m
[31m-    lua_rawset(L, -3);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_get_resp_status(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        return r->err_status;[m
[31m-[m
[31m-    } else if (r->headers_out.status) {[m
[31m-        return r->headers_out.status;[m
[31m-[m
[31m-    } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-        return 9;[m
[31m-[m
[31m-    } else {[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_set_resp_status(ngx_http_request_t *r, int status)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "attempt to set ngx.status after sending out "[m
[31m-                      "response headers");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = status;[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        r->err_status = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (status == 101) {[m
[31m-        /*[m
[31m-         * XXX work-around a bug in the Nginx core older than 1.5.5[m
[31m-         * that 101 does not have a default status line[m
[31m-         */[m
[31m-[m
[31m-        ngx_str_set(&r->headers_out.status_line, "101 Switching Protocols");[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_is_subrequest(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    return r != r->main;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_headers_sent(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_LUA_FFI_NO_REQ_CTX;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    return r->header_sent ? 1 : 0;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_misc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_misc.h[m
[1mdeleted file mode 100644[m
[1mindex c26d869..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_misc.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_MISC_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_MISC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_misc_api(lua_State *L);[m
[31m-[m
[31m-void ngx_http_lua_inject_req_misc_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_MISC_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_module.c[m
[1mdeleted file mode 100644[m
[1mindex 867661c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1194 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-#include "ngx_http_lua_capturefilter.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_rewriteby.h"[m
[31m-#include "ngx_http_lua_accessby.h"[m
[31m-#include "ngx_http_lua_logby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_headerfilterby.h"[m
[31m-#include "ngx_http_lua_bodyfilterby.h"[m
[31m-#include "ngx_http_lua_initby.h"[m
[31m-#include "ngx_http_lua_initworkerby.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-#include "ngx_http_lua_semaphore.h"[m
[31m-#include "ngx_http_lua_balancer.h"[m
[31m-#include "ngx_http_lua_ssl_certby.h"[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_lua_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_lua_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_lua_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_lua_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static void *ngx_http_lua_create_loc_conf(ngx_conf_t *cf);[m
[31m-[m
[31m-static char *ngx_http_lua_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_lua_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_lua_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_lua_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_loc_conf_t *llcf);[m
[31m-#endif[m
[31m-#if (NGX_HTTP_LUA_HAVE_MMAP_SBRK) && (NGX_LINUX)[m
[31m-/* we cannot use "static" for this function since it may lead to compiler[m
[31m- * warnings */[m
[31m-void ngx_http_lua_limit_data_segment(void);[m
[31m-#   if !(NGX_HTTP_LUA_HAVE_CONSTRUCTOR)[m
[31m-static ngx_int_t ngx_http_lua_pre_config(ngx_conf_t *cf);[m
[31m-#   endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_lua_lowat_post =[m
[31m-    { ngx_http_lua_lowat_check };[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_lua_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL) && defined(nginx_version) && nginx_version >= 1001013[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_lua_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_lua_cmds[] = {[m
[31m-[m
[31m-    { ngx_string("lua_max_running_timers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, max_running_timers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_max_pending_timers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, max_pending_timers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_shared_dict"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_lua_shared_dict,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    { ngx_string("lua_regex_cache_max_entries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, regex_cache_max_entries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_regex_match_limit"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, regex_match_limit),[m
[31m-      NULL },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("lua_package_cpath"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_package_cpath,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_package_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_package_path,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_code_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_http_lua_code_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, enable_code_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_need_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, force_read_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_transform_underscores_in_response_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, transform_underscores_in_resp_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-     { ngx_string("lua_socket_log_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, log_socket_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("init_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_init_by_lua_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_by_inline },[m
[31m-[m
[31m-    { ngx_string("init_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_init_by_lua,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_by_inline },[m
[31m-[m
[31m-    { ngx_string("init_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_init_by_lua,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_by_file },[m
[31m-[m
[31m-    { ngx_string("init_worker_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_init_worker_by_lua_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_worker_by_inline },[m
[31m-[m
[31m-    { ngx_string("init_worker_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_init_worker_by_lua,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_worker_by_inline },[m
[31m-[m
[31m-    { ngx_string("init_worker_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_init_worker_by_lua,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_worker_by_file },[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-    /* set_by_lua $res { inline Lua code } [$arg1 [$arg2 [...]]] */[m
[31m-    { ngx_string("set_by_lua_block"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_1MORE|NGX_CONF_BLOCK,[m
[31m-      ngx_http_lua_set_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_filter_set_by_lua_inline },[m
[31m-[m
[31m-    /* set_by_lua $res <inline script> [$arg1 [$arg2 [...]]] */[m
[31m-    { ngx_string("set_by_lua"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_2MORE,[m
[31m-      ngx_http_lua_set_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_filter_set_by_lua_inline },[m
[31m-[m
[31m-    /* set_by_lua_file $res rel/or/abs/path/to/script [$arg1 [$arg2 [..]]] */[m
[31m-    { ngx_string("set_by_lua_file"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_2MORE,[m
[31m-      ngx_http_lua_set_by_lua_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_filter_set_by_lua_file },[m
[31m-#endif[m
[31m-[m
[31m-    /* rewrite_by_lua "<inline script>" */[m
[31m-    { ngx_string("rewrite_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_rewrite_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_rewrite_handler_inline },[m
[31m-[m
[31m-    /* rewrite_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("rewrite_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_rewrite_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_rewrite_handler_inline },[m
[31m-[m
[31m-    /* access_by_lua "<inline script>" */[m
[31m-    { ngx_string("access_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_access_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_access_handler_inline },[m
[31m-[m
[31m-    /* access_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("access_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_access_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_access_handler_inline },[m
[31m-[m
[31m-    /* content_by_lua "<inline script>" */[m
[31m-    { ngx_string("content_by_lua"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_content_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_content_handler_inline },[m
[31m-[m
[31m-    /* content_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("content_by_lua_block"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_content_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_content_handler_inline },[m
[31m-[m
[31m-    /* log_by_lua <inline script> */[m
[31m-    { ngx_string("log_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_log_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_log_handler_inline },[m
[31m-[m
[31m-    /* log_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("log_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_log_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_log_handler_inline },[m
[31m-[m
[31m-    { ngx_string("rewrite_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_rewrite_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_rewrite_handler_file },[m
[31m-[m
[31m-    { ngx_string("rewrite_by_lua_no_postpone"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, postponed_to_rewrite_phase_end),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("access_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_access_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_access_handler_file },[m
[31m-[m
[31m-    { ngx_string("access_by_lua_no_postpone"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, postponed_to_access_phase_end),[m
[31m-      NULL },[m
[31m-[m
[31m-    /* content_by_lua_file rel/or/abs/path/to/script */[m
[31m-    { ngx_string("content_by_lua_file"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_content_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_content_handler_file },[m
[31m-[m
[31m-    { ngx_string("log_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_log_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_log_handler_file },[m
[31m-[m
[31m-    /* header_filter_by_lua <inline script> */[m
[31m-    { ngx_string("header_filter_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_header_filter_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_header_filter_inline },[m
[31m-[m
[31m-    /* header_filter_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("header_filter_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_header_filter_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_header_filter_inline },[m
[31m-[m
[31m-    { ngx_string("header_filter_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_header_filter_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_header_filter_file },[m
[31m-[m
[31m-    { ngx_string("body_filter_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_body_filter_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_body_filter_inline },[m
[31m-[m
[31m-    /* body_filter_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("body_filter_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_body_filter_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_body_filter_inline },[m
[31m-[m
[31m-    { ngx_string("body_filter_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_body_filter_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_body_filter_file },[m
[31m-[m
[31m-    { ngx_string("balancer_by_lua_block"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_balancer_by_lua_block,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_balancer_handler_inline },[m
[31m-[m
[31m-    { ngx_string("balancer_by_lua_file"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_balancer_by_lua,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_balancer_handler_file },[m
[31m-[m
[31m-    { ngx_string("lua_socket_keepalive_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, keepalive_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, send_lowat),[m
[31m-      &ngx_http_lua_lowat_post },[m
[31m-[m
[31m-    { ngx_string("lua_socket_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, pool_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_http10_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, http10_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_check_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, check_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_use_default_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, use_default_type),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-#   if defined(nginx_version) && nginx_version >= 1001013[m
[31m-[m
[31m-    { ngx_string("lua_ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_protocols),[m
[31m-      &ngx_http_lua_ssl_protocols },[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-    { ngx_string("lua_ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_ssl_cert_by_lua_block,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_ssl_cert_handler_inline },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_ssl_cert_by_lua,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_ssl_cert_handler_file },[m
[31m-[m
[31m-    { ngx_string("lua_ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t ngx_http_lua_module_ctx = {[m
[31m-#if (NGX_HTTP_LUA_HAVE_MMAP_SBRK)                                            \[m
[31m-    && (NGX_LINUX)                                                           \[m
[31m-    && !(NGX_HTTP_LUA_HAVE_CONSTRUCTOR)[m
[31m-    ngx_http_lua_pre_config,          /*  preconfiguration */[m
[31m-#else[m
[31m-    NULL,                             /*  preconfiguration */[m
[31m-#endif[m
[31m-    ngx_http_lua_init,                /*  postconfiguration */[m
[31m-[m
[31m-    ngx_http_lua_create_main_conf,    /*  create main configuration */[m
[31m-    ngx_http_lua_init_main_conf,      /*  init main configuration */[m
[31m-[m
[31m-    ngx_http_lua_create_srv_conf,     /*  create server configuration */[m
[31m-    ngx_http_lua_merge_srv_conf,      /*  merge server configuration */[m
[31m-[m
[31m-    ngx_http_lua_create_loc_conf,     /*  create location configuration */[m
[31m-    ngx_http_lua_merge_loc_conf       /*  merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_lua_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_lua_module_ctx,   /*  module context */[m
[31m-    ngx_http_lua_cmds,          /*  module directives */[m
[31m-    NGX_HTTP_MODULE,            /*  module type */[m
[31m-    NULL,                       /*  init master */[m
[31m-    NULL,                       /*  init module */[m
[31m-    ngx_http_lua_init_worker,   /*  init process */[m
[31m-    NULL,                       /*  init thread */[m
[31m-    NULL,                       /*  exit thread */[m
[31m-    NULL,                       /*  exit process */[m
[31m-    NULL,                       /*  exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                         multi_http_blocks;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_array_t                *arr;[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    volatile ngx_cycle_t       *saved_cycle;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-    ngx_http_lua_main_conf_t   *lmcf;[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-    ngx_pool_cleanup_t         *cln;[m
[31m-#endif[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_http_lua_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_lua_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || lmcf->requires_capture_filter) {[m
[31m-        rc = ngx_http_lua_capture_filter_init(cf);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->postponed_to_rewrite_phase_end == NGX_CONF_UNSET) {[m
[31m-        lmcf->postponed_to_rewrite_phase_end = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->postponed_to_access_phase_end == NGX_CONF_UNSET) {[m
[31m-        lmcf->postponed_to_access_phase_end = 0;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (lmcf->requires_rewrite) {[m
[31m-        h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *h = ngx_http_lua_rewrite_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->requires_access) {[m
[31m-        h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *h = ngx_http_lua_access_handler;[m
[31m-    }[m
[31m-[m
[31m-    dd("requires log: %d", (int) lmcf->requires_log);[m
[31m-[m
[31m-    if (lmcf->requires_log) {[m
[31m-        arr = &cmcf->phases[NGX_HTTP_LOG_PHASE].handlers;[m
[31m-        h = ngx_array_push(arr);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (arr->nelts > 1) {[m
[31m-            h = arr->elts;[m
[31m-            ngx_memmove(&h[1], h,[m
[31m-                        (arr->nelts - 1) * sizeof(ngx_http_handler_pt));[m
[31m-        }[m
[31m-[m
[31m-        *h = ngx_http_lua_log_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || lmcf->requires_header_filter) {[m
[31m-        rc = ngx_http_lua_header_filter_init();[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || lmcf->requires_body_filter) {[m
[31m-        rc = ngx_http_lua_body_filter_init();[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-    /* add the cleanup of semaphores after the lua_close */[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->data = lmcf;[m
[31m-    cln->handler = ngx_http_lua_sema_mm_cleanup;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (lmcf->lua == NULL) {[m
[31m-        dd("initializing lua vm");[m
[31m-[m
[31m-        ngx_http_lua_content_length_hash =[m
[31m-                                  ngx_http_lua_hash_literal("content-length");[m
[31m-        ngx_http_lua_location_hash = ngx_http_lua_hash_literal("location");[m
[31m-[m
[31m-        lmcf->lua = ngx_http_lua_init_vm(NULL, cf->cycle, cf->pool, lmcf,[m
[31m-                                         cf->log, NULL);[m
[31m-        if (lmcf->lua == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                               "failed to initialize Lua VM");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (!lmcf->requires_shm && lmcf->init_handler) {[m
[31m-            saved_cycle = ngx_cycle;[m
[31m-            ngx_cycle = cf->cycle;[m
[31m-[m
[31m-            rc = lmcf->init_handler(cf->log, lmcf, lmcf->lua);[m
[31m-[m
[31m-            ngx_cycle = saved_cycle;[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                /* an error happened */[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("Lua VM initialized!");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_lua_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"lua_send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"lua_send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_lua_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t       rc;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    lmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_main_conf_t));[m
[31m-    if (lmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      lmcf->lua = NULL;[m
[31m-     *      lmcf->lua_path = { 0, NULL };[m
[31m-     *      lmcf->lua_cpath = { 0, NULL };[m
[31m-     *      lmcf->pending_timers = 0;[m
[31m-     *      lmcf->running_timers = 0;[m
[31m-     *      lmcf->watcher = NULL;[m
[31m-     *      lmcf->regex_cache_entries = 0;[m
[31m-     *      lmcf->shm_zones = NULL;[m
[31m-     *      lmcf->init_handler = NULL;[m
[31m-     *      lmcf->init_src = { 0, NULL };[m
[31m-     *      lmcf->shm_zones_inited = 0;[m
[31m-     *      lmcf->preload_hooks = NULL;[m
[31m-     *      lmcf->requires_header_filter = 0;[m
[31m-     *      lmcf->requires_body_filter = 0;[m
[31m-     *      lmcf->requires_capture_filter = 0;[m
[31m-     *      lmcf->requires_rewrite = 0;[m
[31m-     *      lmcf->requires_access = 0;[m
[31m-     *      lmcf->requires_log = 0;[m
[31m-     *      lmcf->requires_shm = 0;[m
[31m-     */[m
[31m-[m
[31m-    lmcf->pool = cf->pool;[m
[31m-    lmcf->max_pending_timers = NGX_CONF_UNSET;[m
[31m-    lmcf->max_running_timers = NGX_CONF_UNSET;[m
[31m-#if (NGX_PCRE)[m
[31m-    lmcf->regex_cache_max_entries = NGX_CONF_UNSET;[m
[31m-    lmcf->regex_match_limit = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-    lmcf->postponed_to_rewrite_phase_end = NGX_CONF_UNSET;[m
[31m-    lmcf->postponed_to_access_phase_end = NGX_CONF_UNSET;[m
[31m-[m
[31m-    rc = ngx_http_lua_sema_mm_init(cf, lmcf);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-    dd("nginx Lua module main config structure initialized!");[m
[31m-[m
[31m-    return lmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_lua_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t *lmcf = conf;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (lmcf->regex_cache_max_entries == NGX_CONF_UNSET) {[m
[31m-        lmcf->regex_cache_max_entries = 1024;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->regex_match_limit == NGX_CONF_UNSET) {[m
[31m-        lmcf->regex_match_limit = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (lmcf->max_pending_timers == NGX_CONF_UNSET) {[m
[31m-        lmcf->max_pending_timers = 1024;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->max_running_timers == NGX_CONF_UNSET) {[m
[31m-        lmcf->max_running_timers = 256;[m
[31m-    }[m
[31m-[m
[31m-    lmcf->cycle = cf->cycle;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_lua_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_lua_srv_conf_t     *lscf;[m
[31m-[m
[31m-    lscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_srv_conf_t));[m
[31m-    if (lscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      lscf->ssl.cert_handler = NULL;[m
[31m-     *      lscf->ssl.cert_src = { 0, NULL };[m
[31m-     *      lscf->ssl.cert_src_key = NULL;[m
[31m-     *      lscf->balancer.handler = NULL;[m
[31m-     *      lscf->balancer.src = { 0, NULL };[m
[31m-     *      lscf->balancer.src_key = NULL;[m
[31m-     */[m
[31m-[m
[31m-    return lscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_lua_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    ngx_http_lua_srv_conf_t *prev = parent;[m
[31m-    ngx_http_lua_srv_conf_t *conf = child;[m
[31m-    ngx_http_ssl_srv_conf_t *sscf;[m
[31m-[m
[31m-    dd("merge srv conf");[m
[31m-[m
[31m-    if (conf->ssl.cert_src.len == 0) {[m
[31m-        conf->ssl.cert_src = prev->ssl.cert_src;[m
[31m-        conf->ssl.cert_src_key = prev->ssl.cert_src_key;[m
[31m-        conf->ssl.cert_handler = prev->ssl.cert_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->ssl.cert_src.len) {[m
[31m-        sscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_ssl_module);[m
[31m-        if (sscf == NULL || sscf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no ssl configured for the server");[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#ifdef LIBRESSL_VERSION_NUMBER[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "LibreSSL does not support ssl_ceritificate_by_lua*");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if OPENSSL_VERSION_NUMBER >= 0x1000205fL[m
[31m-[m
[31m-        SSL_CTX_set_cert_cb(sscf->ssl.ctx, ngx_http_lua_ssl_cert_handler, NULL);[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "OpenSSL too old to support ssl_ceritificate_by_lua*");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_lua_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      conf->access_src  = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->access_src_key = NULL[m
[31m-     *      conf->rewrite_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->rewrite_src_key = NULL[m
[31m-     *      conf->rewrite_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->content_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->content_src_key = NULL[m
[31m-     *      conf->content_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->log_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->log_src_key = NULL[m
[31m-     *      conf->log_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->header_filter_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->header_filter_src_key = NULL[m
[31m-     *      conf->header_filter_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->body_filter_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->body_filter_src_key = NULL[m
[31m-     *      conf->body_filter_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->ssl = 0;[m
[31m-     *      conf->ssl_protocols = 0;[m
[31m-     *      conf->ssl_ciphers = { 0, NULL };[m
[31m-     *      conf->ssl_trusted_certificate = { 0, NULL };[m
[31m-     *      conf->ssl_crl = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->force_read_body    = NGX_CONF_UNSET;[m
[31m-    conf->enable_code_cache  = NGX_CONF_UNSET;[m
[31m-    conf->http10_buffering   = NGX_CONF_UNSET;[m
[31m-    conf->check_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->use_default_type   = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->keepalive_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->pool_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->transform_underscores_in_resp_headers = NGX_CONF_UNSET;[m
[31m-    conf->log_socket_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_lua_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t *prev = parent;[m
[31m-    ngx_http_lua_loc_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->rewrite_src.value.len == 0) {[m
[31m-        conf->rewrite_src = prev->rewrite_src;[m
[31m-        conf->rewrite_handler = prev->rewrite_handler;[m
[31m-        conf->rewrite_src_key = prev->rewrite_src_key;[m
[31m-        conf->rewrite_chunkname = prev->rewrite_chunkname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->access_src.value.len == 0) {[m
[31m-        conf->access_src = prev->access_src;[m
[31m-        conf->access_handler = prev->access_handler;[m
[31m-        conf->access_src_key = prev->access_src_key;[m
[31m-        conf->access_chunkname = prev->access_chunkname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->content_src.value.len == 0) {[m
[31m-        conf->content_src = prev->content_src;[m
[31m-        conf->content_handler = prev->content_handler;[m
[31m-        conf->content_src_key = prev->content_src_key;[m
[31m-        conf->content_chunkname = prev->content_chunkname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->log_src.value.len == 0) {[m
[31m-        conf->log_src = prev->log_src;[m
[31m-        conf->log_handler = prev->log_handler;[m
[31m-        conf->log_src_key = prev->log_src_key;[m
[31m-        conf->log_chunkname = prev->log_chunkname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->header_filter_src.value.len == 0) {[m
[31m-        conf->header_filter_src = prev->header_filter_src;[m
[31m-        conf->header_filter_handler = prev->header_filter_handler;[m
[31m-        conf->header_filter_src_key = prev->header_filter_src_key;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_filter_src.value.len == 0) {[m
[31m-        conf->body_filter_src = prev->body_filter_src;[m
[31m-        conf->body_filter_handler = prev->body_filter_handler;[m
[31m-        conf->body_filter_src_key = prev->body_filter_src_key;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-#   if defined(nginx_version) && nginx_version >= 1001013[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_SSLv3[m
[31m-                                  |NGX_SSL_TLSv1|NGX_SSL_TLSv1_1[m
[31m-                                  |NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,[m
[31m-                             "DEFAULT");[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                             prev->ssl_trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    if (ngx_http_lua_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->force_read_body, prev->force_read_body, 0);[m
[31m-    ngx_conf_merge_value(conf->enable_code_cache, prev->enable_code_cache, 1);[m
[31m-    ngx_conf_merge_value(conf->http10_buffering, prev->http10_buffering, 1);[m
[31m-    ngx_conf_merge_value(conf->check_client_abort, prev->check_client_abort, 0);[m
[31m-    ngx_conf_merge_value(conf->use_default_type, prev->use_default_type, 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->keepalive_timeout,[m
[31m-                              prev->keepalive_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->connect_timeout,[m
[31m-                              prev->connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->send_timeout,[m
[31m-                              prev->send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->read_timeout,[m
[31m-                              prev->read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->send_lowat,[m
[31m-                              prev->send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size,[m
[31m-                              prev->buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->pool_size, prev->pool_size, 30);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->transform_underscores_in_resp_headers,[m
[31m-                         prev->transform_underscores_in_resp_headers, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->log_socket_errors, prev->log_socket_errors, 1);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_set_ssl(ngx_conf_t *cf, ngx_http_lua_loc_conf_t *llcf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    llcf->ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (llcf->ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(llcf->ssl, llcf->ssl_protocols, NULL) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = llcf->ssl;[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(llcf->ssl->ctx,[m
[31m-                                (const char *) llcf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &llcf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->ssl_trusted_certificate.len) {[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003007[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, llcf->ssl,[m
[31m-                                        &llcf->ssl_trusted_certificate,[m
[31m-                                        llcf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cf->log, 0, "at least nginx 1.3.7 is "[m
[31m-                      "required for the \"lua_ssl_trusted_certificate\" "[m
[31m-                      "directive");[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dd("ssl crl: %.*s", (int) llcf->ssl_crl.len, llcf->ssl_crl.data);[m
[31m-[m
[31m-    if (ngx_ssl_crl(cf, llcf->ssl, &llcf->ssl_crl) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_LUA_HAVE_MMAP_SBRK)                                            \[m
[31m-    && (NGX_LINUX)                                                           \[m
[31m-    && !(NGX_HTTP_LUA_HAVE_CONSTRUCTOR)[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_pre_config(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_lua_limit_data_segment();[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * we simply assume that LuaJIT is used. it does little harm when the[m
[31m- * standard Lua 5.1 interpreter is used instead.[m
[31m- */[m
[31m-#if (NGX_HTTP_LUA_HAVE_MMAP_SBRK) && (NGX_LINUX)[m
[31m-#   if (NGX_HTTP_LUA_HAVE_CONSTRUCTOR)[m
[31m-__attribute__((constructor))[m
[31m-#   endif[m
[31m-void[m
[31m-ngx_http_lua_limit_data_segment(void)[m
[31m-{[m
[31m-    if (sbrk(0) < (void *) 0x40000000LL) {[m
[31m-        mmap(ngx_align_ptr(sbrk(0), getpagesize()), 1, PROT_READ,[m
[31m-             MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);[m
[31m-    }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ndk.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ndk.c[m
[1mdeleted file mode 100644[m
[1mindex 24b80b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ndk.c[m
[1m+++ /dev/null[m
[36m@@ -1,191 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_ndk.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_value_pt ngx_http_lookup_ndk_set_var_directive(u_char *name,[m
[31m-    size_t name_len);[m
[31m-static int ngx_http_lua_ndk_set_var_get(lua_State *L);[m
[31m-static int ngx_http_lua_ndk_set_var_set(lua_State *L);[m
[31m-static int ngx_http_lua_run_set_var_directive(lua_State *L);[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ndk_set_var_get(lua_State *L)[m
[31m-{[m
[31m-    ndk_set_var_value_pt                 func;[m
[31m-    size_t                               len;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    dd("ndk.set_var metatable __index: %s", p);[m
[31m-[m
[31m-    func = ngx_http_lookup_ndk_set_var_directive(p, len);[m
[31m-[m
[31m-    if (func == NULL) {[m
[31m-        return luaL_error(L, "ndk.set_var: directive \"%s\" not found "[m
[31m-                          "or does not use ndk_set_var_value", p);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushvalue(L, -1); /* table key key */[m
[31m-    lua_pushvalue(L, -1); /* table key key key */[m
[31m-    lua_pushlightuserdata(L, (void *) func); /* table key key key func */[m
[31m-    lua_pushcclosure(L, ngx_http_lua_run_set_var_directive, 2);[m
[31m-        /* table key key closure */[m
[31m-    lua_rawset(L, 1); /* table key */[m
[31m-    lua_rawget(L, 1); /* table closure */[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ndk_set_var_set(lua_State *L)[m
[31m-{[m
[31m-    return luaL_error(L, "Not allowed");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_run_set_var_directive(lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ndk_set_var_value_pt                 func;[m
[31m-    ngx_str_t                            res;[m
[31m-    ngx_http_variable_value_t            arg;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-    ngx_http_request_t                  *r;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_memzero(&arg, sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-    arg.valid = 1;[m
[31m-#endif[m
[31m-[m
[31m-    arg.data = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-    arg.len = len;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, lua_upvalueindex(1), &len);[m
[31m-[m
[31m-    dd("calling set_var func for %s", p);[m
[31m-[m
[31m-    func = (ndk_set_var_value_pt) lua_touserdata(L, lua_upvalueindex(2));[m
[31m-[m
[31m-    rc = func(r, &res, &arg);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return luaL_error(L, "calling directive %s failed with code %d",[m
[31m-                          p, (int) rc);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) res.data, res.len);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_value_pt[m
[31m-ngx_http_lookup_ndk_set_var_directive(u_char *name,[m
[31m-    size_t name_len)[m
[31m-{[m
[31m-    ndk_set_var_t           *filter;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_module_t            *module;[m
[31m-    ngx_module_t           **modules;[m
[31m-    ngx_command_t           *cmd;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009011[m
[31m-    modules = ngx_cycle->modules;[m
[31m-#else[m
[31m-    modules = ngx_modules;[m
[31m-#endif[m
[31m-[m
[31m-    for (i = 0; modules[i]; i++) {[m
[31m-        module = modules[i];[m
[31m-        if (module->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cmd = modules[i]->commands;[m
[31m-        if (cmd == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; cmd->name.len; cmd++) {[m
[31m-            if (cmd->set != ndk_set_var_value) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            filter = cmd->post;[m
[31m-            if (filter == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (cmd->name.len != name_len[m
[31m-                || ngx_strncmp(cmd->name.data, name, name_len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return (ndk_set_var_value_pt)(filter->func);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_ndk_api(lua_State *L)[m
[31m-{[m
[31m-    lua_createtable(L, 0, 1 /* nrec */);    /* ndk.* */[m
[31m-[m
[31m-    lua_newtable(L);    /* .set_var */[m
[31m-[m
[31m-    lua_createtable(L, 0, 2 /* nrec */); /* metatable for .set_var */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ndk_set_var_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ndk_set_var_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    lua_setfield(L, -2, "set_var");[m
[31m-[m
[31m-    lua_getglobal(L, "package"); /* ndk package */[m
[31m-    lua_getfield(L, -1, "loaded"); /* ndk package loaded */[m
[31m-    lua_pushvalue(L, -3); /* ndk package loaded ndk */[m
[31m-    lua_setfield(L, -2, "ndk"); /* ndk package loaded */[m
[31m-    lua_pop(L, 2);[m
[31m-[m
[31m-    lua_setglobal(L, "ndk");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* defined(NDK) && NDK */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ndk.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ndk.h[m
[1mdeleted file mode 100644[m
[1mindex 8015b5f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ndk.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_NDK_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_NDK_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-void ngx_http_lua_inject_ndk_api(lua_State *L);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_NDK_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_output.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_output.c[m
[1mdeleted file mode 100644[m
[1mindex b410ba4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_output.c[m
[1m+++ /dev/null[m
[36m@@ -1,805 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include <math.h>[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_say(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_print(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_flush(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_eof(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_send_headers(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_echo(lua_State *L, unsigned newline);[m
[31m-static void ngx_http_lua_flush_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_print(lua_State *L)[m
[31m-{[m
[31m-    dd("calling lua print");[m
[31m-    return ngx_http_lua_ngx_echo(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_say(lua_State *L)[m
[31m-{[m
[31m-    dd("calling");[m
[31m-    return ngx_http_lua_ngx_echo(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_echo(lua_State *L, unsigned newline)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    const char                  *p;[m
[31m-    size_t                       len;[m
[31m-    size_t                       size;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          i;[m
[31m-    int                          nargs;[m
[31m-    int                          type;[m
[31m-    const char                  *msg;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    if (ctx->acquired_raw_req_socket) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "raw request socket acquired");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "header only");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->eof) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "seen eof");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-[m
[31m-        type = lua_type(L, i);[m
[31m-[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-[m
[31m-                lua_tolstring(L, i, &len);[m
[31m-                size += len;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-[m
[31m-                size += sizeof("nil") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-[m
[31m-                if (lua_toboolean(L, i)) {[m
[31m-                    size += sizeof("true") - 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    size += sizeof("false") - 1;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-[m
[31m-                size += ngx_http_lua_calc_strlen_in_table(L, i, i,[m
[31m-                                                          0 /* strict */);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-[m
[31m-                dd("userdata: %p", lua_touserdata(L, i));[m
[31m-[m
[31m-                if (lua_touserdata(L, i) == NULL) {[m
[31m-                    size += sizeof("null") - 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-[m
[31m-                msg = lua_pushfstring(L, "string, number, boolean, nil, "[m
[31m-                                      "ngx.null, or array table expected, "[m
[31m-                                      "but got %s", lua_typename(L, type));[m
[31m-[m
[31m-                return luaL_argerror(L, i, msg);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (newline) {[m
[31m-        size += sizeof("\n") - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        rc = ngx_http_lua_send_header_if_needed(r, ctx);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "nginx output filter error");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        lua_pushinteger(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->seen_body_data = 1;[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, size);[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-        type = lua_type(L, i);[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                p = lua_tolstring(L, i, &len);[m
[31m-                b->last = ngx_copy(b->last, (u_char *) p, len);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                *b->last++ = 'n';[m
[31m-                *b->last++ = 'i';[m
[31m-                *b->last++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, i)) {[m
[31m-                    *b->last++ = 't';[m
[31m-                    *b->last++ = 'r';[m
[31m-                    *b->last++ = 'u';[m
[31m-                    *b->last++ = 'e';[m
[31m-[m
[31m-                } else {[m
[31m-                    *b->last++ = 'f';[m
[31m-                    *b->last++ = 'a';[m
[31m-                    *b->last++ = 'l';[m
[31m-                    *b->last++ = 's';[m
[31m-                    *b->last++ = 'e';[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-                b->last = ngx_http_lua_copy_str_in_table(L, i, b->last);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                *b->last++ = 'n';[m
[31m-                *b->last++ = 'u';[m
[31m-                *b->last++ = 'l';[m
[31m-                *b->last++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "impossible to reach here");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (newline) {[m
[31m-        *b->last++ = '\n';[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (b->last != b->end) {[m
[31m-        return luaL_error(L, "buffer error: %p != %p", b->last, b->end);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   newline ? "lua say response" : "lua print response");[m
[31m-[m
[31m-    rc = ngx_http_lua_send_chain_link(r, ctx, cl);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nginx output filter error");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    dd("downstream write: %d, buf len: %d", (int) rc,[m
[31m-       (int) (b->last - b->pos));[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_calc_strlen_in_table(lua_State *L, int index, int arg_i,[m
[31m-    unsigned strict)[m
[31m-{[m
[31m-    double              key;[m
[31m-    int                 max;[m
[31m-    int                 i;[m
[31m-    int                 type;[m
[31m-    size_t              size;[m
[31m-    size_t              len;[m
[31m-    const char         *msg;[m
[31m-[m
[31m-    if (index < 0) {[m
[31m-        index = lua_gettop(L) + index + 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("table index: %d", index);[m
[31m-[m
[31m-    max = 0;[m
[31m-[m
[31m-    lua_pushnil(L); /* stack: table key */[m
[31m-    while (lua_next(L, index) != 0) { /* stack: table key value */[m
[31m-        dd("key type: %s", luaL_typename(L, -2));[m
[31m-[m
[31m-        if (lua_type(L, -2) == LUA_TNUMBER) {[m
[31m-[m
[31m-            key = lua_tonumber(L, -2);[m
[31m-[m
[31m-            dd("key value: %d", (int) key);[m
[31m-[m
[31m-            if (floor(key) == key && key >= 1) {[m
[31m-                if (key > max) {[m
[31m-                    max = (int) key;[m
[31m-                }[m
[31m-[m
[31m-                lua_pop(L, 1); /* stack: table key */[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* not an array (non positive integer key) */[m
[31m-        lua_pop(L, 2); /* stack: table */[m
[31m-[m
[31m-        luaL_argerror(L, arg_i, "non-array table found");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 1; i <= max; i++) {[m
[31m-        lua_rawgeti(L, index, i); /* stack: table value */[m
[31m-        type = lua_type(L, -1);[m
[31m-[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-[m
[31m-                lua_tolstring(L, -1, &len);[m
[31m-                size += len;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-[m
[31m-                if (strict) {[m
[31m-                    goto bad_type;[m
[31m-                }[m
[31m-[m
[31m-                size += sizeof("nil") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-[m
[31m-                if (strict) {[m
[31m-                    goto bad_type;[m
[31m-                }[m
[31m-[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    size += sizeof("true") - 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    size += sizeof("false") - 1;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-[m
[31m-                size += ngx_http_lua_calc_strlen_in_table(L, -1, arg_i, strict);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-[m
[31m-                if (strict) {[m
[31m-                    goto bad_type;[m
[31m-                }[m
[31m-[m
[31m-                if (lua_touserdata(L, -1) == NULL) {[m
[31m-                    size += sizeof("null") - 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-[m
[31m-bad_type:[m
[31m-[m
[31m-                msg = lua_pushfstring(L, "bad data type %s found",[m
[31m-                                      lua_typename(L, type));[m
[31m-                return luaL_argerror(L, arg_i, msg);[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1); /* stack: table */[m
[31m-    }[m
[31m-[m
[31m-    return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_lua_copy_str_in_table(lua_State *L, int index, u_char *dst)[m
[31m-{[m
[31m-    double               key;[m
[31m-    int                  max;[m
[31m-    int                  i;[m
[31m-    int                  type;[m
[31m-    size_t               len;[m
[31m-    u_char              *p;[m
[31m-[m
[31m-    if (index < 0) {[m
[31m-        index = lua_gettop(L) + index + 1;[m
[31m-    }[m
[31m-[m
[31m-    max = 0;[m
[31m-[m
[31m-    lua_pushnil(L); /* stack: table key */[m
[31m-    while (lua_next(L, index) != 0) { /* stack: table key value */[m
[31m-        key = lua_tonumber(L, -2);[m
[31m-        if (key > max) {[m
[31m-            max = (int) key;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1); /* stack: table key */[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i <= max; i++) {[m
[31m-        lua_rawgeti(L, index, i); /* stack: table value */[m
[31m-        type = lua_type(L, -1);[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                p = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-                dst = ngx_copy(dst, p, len);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                *dst++ = 'n';[m
[31m-                *dst++ = 'i';[m
[31m-                *dst++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    *dst++ = 't';[m
[31m-                    *dst++ = 'r';[m
[31m-                    *dst++ = 'u';[m
[31m-                    *dst++ = 'e';[m
[31m-[m
[31m-                } else {[m
[31m-                    *dst++ = 'f';[m
[31m-                    *dst++ = 'a';[m
[31m-                    *dst++ = 'l';[m
[31m-                    *dst++ = 's';[m
[31m-                    *dst++ = 'e';[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-                dst = ngx_http_lua_copy_str_in_table(L, -1, dst);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-[m
[31m-                *dst++ = 'n';[m
[31m-                *dst++ = 'u';[m
[31m-                *dst++ = 'l';[m
[31m-                *dst++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                luaL_error(L, "impossible to reach here");[m
[31m-                return NULL;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1); /* stack: table */[m
[31m-    }[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Force flush out response content[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_ngx_flush(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          n;[m
[31m-    unsigned                     wait = 0;[m
[31m-    ngx_event_t                 *wev;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n > 1) {[m
[31m-        return luaL_error(L, "attempt to pass %d arguments, but accepted 0 "[m
[31m-                          "or 1", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    if (n == 1 && r == r->main) {[m
[31m-        luaL_checktype(L, 1, LUA_TBOOLEAN);[m
[31m-        wait = lua_toboolean(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    if (ctx->acquired_raw_req_socket) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "raw request socket acquired");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "header only");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->eof) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "seen eof");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->buffering) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua http 1.0 buffering makes ngx.flush() a no-op");[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "buffering");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if ((!r->header_sent && !ctx->header_sent)[m
[31m-        || (!ctx->seen_body_data && !wait))[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nothing to flush");[m
[31m-        return 2;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    cl = ngx_http_lua_get_flush_chain(r, ctx);[m
[31m-    if (cl == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_send_chain_link(r, ctx, cl);[m
[31m-[m
[31m-    dd("send chain: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nginx output filter error");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    dd("wait:%d, rc:%d, buffered:0x%x", wait, (int) rc,[m
[31m-       r->connection->buffered);[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wait && (r->connection->buffered & NGX_HTTP_LOWLEVEL_BUFFERED[m
[31m-                 || wev->delayed))[m
[31m-    {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua flush requires waiting: buffered 0x%uxd, "[m
[31m-                       "delayed:%d", (unsigned) r->connection->buffered,[m
[31m-                       wev->delayed);[m
[31m-[m
[31m-        coctx->flushing = 1;[m
[31m-        ctx->flushing_coros++;[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            /* mimic ngx_http_set_write_handler */[m
[31m-            r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-        } else {[m
[31m-            r->write_event_handler = ngx_http_core_run_phases;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            if (wev->timer_set) {[m
[31m-                wev->delayed = 0;[m
[31m-                ngx_del_timer(wev);[m
[31m-            }[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "connection broken");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-        coctx->cleanup = ngx_http_lua_flush_cleanup;[m
[31m-        coctx->data = r;[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua flush asynchronously");[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Send last_buf, terminate output stream[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_ngx_eof(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_gettop(L) != 0) {[m
[31m-        return luaL_error(L, "no argument is expected");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->acquired_raw_req_socket) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "raw request socket acquired");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->eof) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "seen eof");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua send eof");[m
[31m-[m
[31m-    rc = ngx_http_lua_send_chain_link(r, ctx, NULL /* indicate last_buf */);[m
[31m-[m
[31m-    dd("send chain: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nginx output filter error");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_output_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_send_headers);[m
[31m-    lua_setfield(L, -2, "send_headers");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_print);[m
[31m-    lua_setfield(L, -2, "print");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_say);[m
[31m-    lua_setfield(L, -2, "say");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_flush);[m
[31m-    lua_setfield(L, -2, "flush");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_eof);[m
[31m-    lua_setfield(L, -2, "eof");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Send out headers[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_ngx_send_headers(lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    if (!r->header_sent && !ctx->header_sent) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua send headers");[m
[31m-[m
[31m-        rc = ngx_http_lua_send_header_if_needed(r, ctx);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "nginx output filter error");[m
[31m-            return 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_flush_resume_helper(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ctx->cur_co_ctx->cleanup = NULL;[m
[31m-[m
[31m-    /* push the return values */[m
[31m-[m
[31m-    if (c->timedout) {[m
[31m-        lua_pushnil(ctx->cur_co_ctx->co);[m
[31m-        lua_pushliteral(ctx->cur_co_ctx->co, "timeout");[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else if (c->error) {[m
[31m-        lua_pushnil(ctx->cur_co_ctx->co);[m
[31m-        lua_pushliteral(ctx->cur_co_ctx->co, "client aborted");[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushinteger(ctx->cur_co_ctx->co, 1);[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, n);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc >= NGX_OK */[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_flush_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t                      *r;[m
[31m-    ngx_event_t                             *wev;[m
[31m-    ngx_http_lua_ctx_t                      *ctx;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    coctx->flushing = 0;[m
[31m-[m
[31m-    r = coctx->data;[m
[31m-    if (r == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wev && wev->timer_set) {[m
[31m-        ngx_del_timer(wev);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->flushing_coros--;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_output.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_output.h[m
[1mdeleted file mode 100644[m
[1mindex 109a4b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_output.h[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_OUTPUT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_OUTPUT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_output_api(lua_State *L);[m
[31m-[m
[31m-size_t ngx_http_lua_calc_strlen_in_table(lua_State *L, int index, int arg_i,[m
[31m-    unsigned strict);[m
[31m-[m
[31m-u_char *ngx_http_lua_copy_str_in_table(lua_State *L, int index, u_char *dst);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_flush_resume_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_OUTPUT_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.c[m
[1mdeleted file mode 100644[m
[1mindex 562847a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.c[m
[1m+++ /dev/null[m
[36m@@ -1,106 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "stdio.h"[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_pool_t *ngx_http_lua_pcre_pool = NULL;[m
[31m-[m
[31m-static void *(*old_pcre_malloc)(size_t);[m
[31m-static void (*old_pcre_free)(void *ptr);[m
[31m-[m
[31m-[m
[31m-/* XXX: work-around to nginx regex subsystem, must init a memory pool[m
[31m- * to use PCRE functions. As PCRE still has memory-leaking problems,[m
[31m- * and nginx overwrote pcre_malloc/free hooks with its own static[m
[31m- * functions, so nobody else can reuse nginx regex subsystem... */[m
[31m-static void *[m
[31m-ngx_http_lua_pcre_malloc(size_t size)[m
[31m-{[m
[31m-    dd("lua pcre pool is %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    if (ngx_http_lua_pcre_pool) {[m
[31m-        return ngx_palloc(ngx_http_lua_pcre_pool, size);[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "error: lua pcre malloc failed due to empty pcre pool");[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_pcre_free(void *ptr)[m
[31m-{[m
[31m-    dd("lua pcre pool is %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    if (ngx_http_lua_pcre_pool) {[m
[31m-        ngx_pfree(ngx_http_lua_pcre_pool, ptr);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "error: lua pcre free failed due to empty pcre pool");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pool_t *[m
[31m-ngx_http_lua_pcre_malloc_init(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t          *old_pool;[m
[31m-[m
[31m-    if (pcre_malloc != ngx_http_lua_pcre_malloc) {[m
[31m-[m
[31m-        dd("overriding nginx pcre malloc and free");[m
[31m-[m
[31m-        ngx_http_lua_pcre_pool = pool;[m
[31m-[m
[31m-        old_pcre_malloc = pcre_malloc;[m
[31m-        old_pcre_free = pcre_free;[m
[31m-[m
[31m-        pcre_malloc = ngx_http_lua_pcre_malloc;[m
[31m-        pcre_free = ngx_http_lua_pcre_free;[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("lua pcre pool was %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_pool;[m
[31m-    ngx_http_lua_pcre_pool = pool;[m
[31m-[m
[31m-    dd("lua pcre pool is %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    return old_pool;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_pcre_malloc_done(ngx_pool_t *old_pool)[m
[31m-{[m
[31m-    dd("lua pcre pool was %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    ngx_http_lua_pcre_pool = old_pool;[m
[31m-[m
[31m-    dd("lua pcre pool is %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    if (old_pool == NULL) {[m
[31m-        pcre_malloc = old_pcre_malloc;[m
[31m-        pcre_free = old_pcre_free;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_PCRE */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.h[m
[1mdeleted file mode 100644[m
[1mindex 80f29f9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_PCREFIX_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_PCREFIX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-ngx_pool_t *ngx_http_lua_pcre_malloc_init(ngx_pool_t *pool);[m
[31m-void ngx_http_lua_pcre_malloc_done(ngx_pool_t *old_pool);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_PCREFIX_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_phase.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_phase.c[m
[1mdeleted file mode 100644[m
[1mindex b8e936a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_phase.c[m
[1m+++ /dev/null[m
[36m@@ -1,102 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_phase.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_ctx.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_get_phase(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_get_phase(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    /* If we have no request object, assume we are called from the "init"[m
[31m-     * phase. */[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        lua_pushliteral(L, "init");[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    switch (ctx->context) {[m
[31m-    case NGX_HTTP_LUA_CONTEXT_INIT_WORKER:[m
[31m-        lua_pushliteral(L, "init_worker");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_SET:[m
[31m-        lua_pushliteral(L, "set");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_REWRITE:[m
[31m-        lua_pushliteral(L, "rewrite");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_ACCESS:[m
[31m-        lua_pushliteral(L, "access");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_CONTENT:[m
[31m-        lua_pushliteral(L, "content");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_LOG:[m
[31m-        lua_pushliteral(L, "log");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_HEADER_FILTER:[m
[31m-        lua_pushliteral(L, "header_filter");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_BODY_FILTER:[m
[31m-        lua_pushliteral(L, "body_filter");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_TIMER:[m
[31m-        lua_pushliteral(L, "timer");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_BALANCER:[m
[31m-        lua_pushliteral(L, "balancer");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_SSL_CERT:[m
[31m-        lua_pushliteral(L, "ssl_cert");[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return luaL_error(L, "unknown phase: %d", (int) ctx->context);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_phase_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_get_phase);[m
[31m-    lua_setfield(L, -2, "get_phase");[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_phase.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_phase.h[m
[1mdeleted file mode 100644[m
[1mindex dcb670f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_phase.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef _NGX_HTTP_LUA_PHASE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_PHASE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_phase_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_PHASE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_probe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_probe.h[m
[1mdeleted file mode 100644[m
[1mindex 37b2500..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_probe.h[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-/*[m
[31m- * automatically generated from the file dtrace/ngx_lua_provider.d by the[m
[31m- *  gen-dtrace-probe-header tool in the nginx-devel-utils project:[m
[31m- *  https://github.com/agentzh/nginx-devel-utils[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_PROBE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_PROBE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-[m
[31m-#include <ngx_dtrace_provider.h>[m
[31m-[m
[31m-#define ngx_http_lua_probe_info(s)                                           \[m
[31m-    NGINX_LUA_HTTP_LUA_INFO(s)[m
[31m-[m
[31m-#define ngx_http_lua_probe_register_preload_package(L, pkg)                  \[m
[31m-    NGINX_LUA_HTTP_LUA_REGISTER_PRELOAD_PACKAGE(L, pkg)[m
[31m-[m
[31m-#define ngx_http_lua_probe_req_socket_consume_preread(r, data, len)          \[m
[31m-    NGINX_LUA_HTTP_LUA_REQ_SOCKET_CONSUME_PREREAD(r, data, len)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_coroutine_create(r, parent, child)           \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_COROUTINE_CREATE(r, parent, child)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_coroutine_resume(r, parent, child)           \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_COROUTINE_RESUME(r, parent, child)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_coroutine_yield(r, parent, child)            \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_COROUTINE_YIELD(r, parent, child)[m
[31m-[m
[31m-#define ngx_http_lua_probe_thread_yield(r, L)                                \[m
[31m-    NGINX_LUA_HTTP_LUA_THREAD_YIELD(r, L)[m
[31m-[m
[31m-#define ngx_http_lua_probe_socket_tcp_send_start(r, u, data, len)            \[m
[31m-    NGINX_LUA_HTTP_LUA_SOCKET_TCP_SEND_START(r, u, data, len)[m
[31m-[m
[31m-#define ngx_http_lua_probe_socket_tcp_receive_done(r, u, data, len)          \[m
[31m-    NGINX_LUA_HTTP_LUA_SOCKET_TCP_RECEIVE_DONE(r, u, data, len)[m
[31m-[m
[31m-#define ngx_http_lua_probe_socket_tcp_setkeepalive_buf_unread(r, u, data, len)\[m
[31m-    NGINX_LUA_HTTP_LUA_SOCKET_TCP_SETKEEPALIVE_BUF_UNREAD(r, u, data, len)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_thread_spawn(r, creator, newthread)          \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_THREAD_SPAWN(r, creator, newthread)[m
[31m-[m
[31m-#define ngx_http_lua_probe_thread_delete(r, thread, ctx)                     \[m
[31m-    NGINX_LUA_HTTP_LUA_THREAD_DELETE(r, thread, ctx)[m
[31m-[m
[31m-#define ngx_http_lua_probe_run_posted_thread(r, thread, status)              \[m
[31m-    NGINX_LUA_HTTP_LUA_RUN_POSTED_THREAD(r, thread, status)[m
[31m-[m
[31m-#define ngx_http_lua_probe_coroutine_done(r, co, success)                    \[m
[31m-    NGINX_LUA_HTTP_LUA_COROUTINE_DONE(r, co, success)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_thread_wait(parent, child)                   \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_THREAD_WAIT(parent, child)[m
[31m-[m
[31m-#else /* !(NGX_DTRACE) */[m
[31m-[m
[31m-#define ngx_http_lua_probe_info(s)[m
[31m-#define ngx_http_lua_probe_register_preload_package(L, pkg)[m
[31m-#define ngx_http_lua_probe_req_socket_consume_preread(r, data, len)[m
[31m-#define ngx_http_lua_probe_user_coroutine_create(r, parent, child)[m
[31m-#define ngx_http_lua_probe_user_coroutine_resume(r, parent, child)[m
[31m-#define ngx_http_lua_probe_user_coroutine_yield(r, parent, child)[m
[31m-#define ngx_http_lua_probe_thread_yield(r, L)[m
[31m-#define ngx_http_lua_probe_socket_tcp_send_start(r, u, data, len)[m
[31m-#define ngx_http_lua_probe_socket_tcp_receive_done(r, u, data, len)[m
[31m-#define ngx_http_lua_probe_socket_tcp_setkeepalive_buf_unread(r, u, data, len)[m
[31m-#define ngx_http_lua_probe_user_thread_spawn(r, creator, newthread)[m
[31m-#define ngx_http_lua_probe_thread_delete(r, thread, ctx)[m
[31m-#define ngx_http_lua_probe_run_posted_thread(r, thread, status)[m
[31m-#define ngx_http_lua_probe_coroutine_done(r, co, success)[m
[31m-#define ngx_http_lua_probe_user_thread_wait(parent, child)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_PROBE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_regex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_regex.c[m
[1mdeleted file mode 100644[m
[1mindex d882061..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_regex.c[m
[1m+++ /dev/null[m
[36m@@ -1,2486 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_script.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include <pcre.h>[m
[31m-[m
[31m-[m
[31m-#if (PCRE_MAJOR > 8) || (PCRE_MAJOR == 8 && PCRE_MINOR >= 21)[m
[31m-#   define LUA_HAVE_PCRE_JIT 1[m
[31m-#else[m
[31m-#   define LUA_HAVE_PCRE_JIT 0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (PCRE_MAJOR >= 6)[m
[31m-#   define LUA_HAVE_PCRE_DFA 1[m
[31m-#else[m
[31m-#   define LUA_HAVE_PCRE_DFA 0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LUA_RE_COMPILE_ONCE      (1<<0)[m
[31m-#define NGX_LUA_RE_MODE_DFA          (1<<1)[m
[31m-#define NGX_LUA_RE_MODE_JIT          (1<<2)[m
[31m-#define NGX_LUA_RE_MODE_DUPNAMES     (1<<3)[m
[31m-#define NGX_LUA_RE_NO_UTF8_CHECK     (1<<4)[m
[31m-[m
[31m-#define NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT (100)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-    ngx_pool_t                   *pool;[m
[31m-    u_char                       *name_table;[m
[31m-    int                           name_count;[m
[31m-    int                           name_entry_size;[m
[31m-#endif[m
[31m-[m
[31m-    int                           ncaptures;[m
[31m-    int                          *captures;[m
[31m-[m
[31m-    pcre                         *regex;[m
[31m-    pcre_extra                   *regex_sd;[m
[31m-[m
[31m-    ngx_http_lua_complex_value_t    *replace;[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-    /* only for (stap) debugging, and may be an invalid pointer */[m
[31m-    const u_char                 *pattern;[m
[31m-#endif[m
[31m-} ngx_http_lua_regex_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     pattern;[m
[31m-    ngx_pool_t   *pool;[m
[31m-    ngx_int_t     options;[m
[31m-[m
[31m-    pcre         *regex;[m
[31m-    int           captures;[m
[31m-    ngx_str_t     err;[m
[31m-} ngx_http_lua_regex_compile_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_cleanup_pt     *cleanup;[m
[31m-    ngx_http_request_t      *request;[m
[31m-    pcre                    *regex;[m
[31m-    pcre_extra              *regex_sd;[m
[31m-    int                      ncaptures;[m
[31m-    int                     *captures;[m
[31m-    int                      captures_len;[m
[31m-    uint8_t                  flags;[m
[31m-} ngx_http_lua_regex_ctx_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_re_gmatch_iterator(lua_State *L);[m
[31m-static ngx_uint_t ngx_http_lua_ngx_re_parse_opts(lua_State *L,[m
[31m-    ngx_http_lua_regex_compile_t *re, ngx_str_t *opts, int narg);[m
[31m-static int ngx_http_lua_ngx_re_sub_helper(lua_State *L, unsigned global);[m
[31m-static int ngx_http_lua_ngx_re_match_helper(lua_State *L, int wantcaps);[m
[31m-static int ngx_http_lua_ngx_re_find(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_re_match(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_re_gmatch(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_re_sub(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_re_gsub(lua_State *L);[m
[31m-static void ngx_http_lua_regex_free_study_data(ngx_pool_t *pool,[m
[31m-    pcre_extra *sd);[m
[31m-static ngx_int_t ngx_http_lua_regex_compile(ngx_http_lua_regex_compile_t *rc);[m
[31m-static void ngx_http_lua_ngx_re_gmatch_cleanup(void *data);[m
[31m-static int ngx_http_lua_ngx_re_gmatch_gc(lua_State *L);[m
[31m-static void ngx_http_lua_re_collect_named_captures(lua_State *L,[m
[31m-    int res_tb_idx, u_char *name_table, int name_count, int name_entry_size,[m
[31m-    unsigned flags, ngx_str_t *subj);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_regex_exec(re, e, s, start, captures, size, opts)       \[m
[31m-    pcre_exec(re, e, (const char *) (s)->data, (s)->len, start, opts,        \[m
[31m-              captures, size)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_regex_dfa_exec(re, e, s, start, captures, size, ws,     \[m
[31m-                                    wscount, opts)                           \[m
[31m-    pcre_dfa_exec(re, e, (const char *) (s)->data, (s)->len, start, opts,    \[m
[31m-                  captures, size, ws, wscount)[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_match(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_ngx_re_match_helper(L, 1 /* want captures */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_find(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_ngx_re_match_helper(L, 0 /* want captures */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_match_helper(lua_State *L, int wantcaps)[m
[31m-{[m
[31m-    /* u_char                      *p; */[m
[31m-    int                          res_tb_idx = 0;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_str_t                    subj;[m
[31m-    ngx_str_t                    pat;[m
[31m-    ngx_str_t                    opts;[m
[31m-    ngx_http_lua_regex_t        *re;[m
[31m-    const char                  *msg;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-    int                          i;[m
[31m-    ngx_int_t                    pos = 0;[m
[31m-    int                          nargs;[m
[31m-    int                         *cap = NULL;[m
[31m-    int                          ovecsize;[m
[31m-    int                          has_ctx = 0;[m
[31m-    ngx_uint_t                   flags;[m
[31m-    ngx_pool_t                  *pool, *old_pool;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    u_char                       errstr[NGX_MAX_CONF_ERRSTR + 1];[m
[31m-    pcre_extra                  *sd = NULL;[m
[31m-    int                          name_entry_size = 0, name_count;[m
[31m-    u_char                      *name_table = NULL;[m
[31m-    int                          exec_opts;[m
[31m-    int                          group_id = 0;[m
[31m-[m
[31m-    ngx_http_lua_regex_compile_t      re_comp;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    if (nargs != 2 && nargs != 3 && nargs != 4 && nargs != 5) {[m
[31m-        return luaL_error(L, "expecting 2, 3, 4 or 5 arguments, "[m
[31m-                          "but got %d", nargs);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    subj.data = (u_char *) luaL_checklstring(L, 1, &subj.len);[m
[31m-    pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-[m
[31m-    ngx_memzero(&re_comp, sizeof(ngx_http_lua_regex_compile_t));[m
[31m-[m
[31m-    if (nargs >= 3) {[m
[31m-        opts.data = (u_char *) luaL_checklstring(L, 3, &opts.len);[m
[31m-[m
[31m-        if (nargs >= 4) {[m
[31m-            if (!lua_isnil(L, 4)) {[m
[31m-                luaL_checktype(L, 4, LUA_TTABLE);[m
[31m-                has_ctx = 1;[m
[31m-[m
[31m-                lua_getfield(L, 4, "pos");[m
[31m-                if (lua_isnumber(L, -1)) {[m
[31m-                    pos = (ngx_int_t) lua_tointeger(L, -1);[m
[31m-                    if (pos <= 0) {[m
[31m-                        pos = 0;[m
[31m-[m
[31m-                    } else {[m
[31m-                        pos--;  /* 1-based on the Lua land */[m
[31m-                    }[m
[31m-[m
[31m-                } else if (lua_isnil(L, -1)) {[m
[31m-                    pos = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    msg = lua_pushfstring(L, "bad pos field type in the ctx "[m
[31m-                                          "table argument: %s",[m
[31m-                                          luaL_typename(L, -1));[m
[31m-[m
[31m-                    return luaL_argerror(L, 4, msg);[m
[31m-                }[m
[31m-[m
[31m-                lua_pop(L, 1);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        opts.data = (u_char *) "";[m
[31m-        opts.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (nargs == 5) {[m
[31m-        if (wantcaps) {[m
[31m-            luaL_checktype(L, 5, LUA_TTABLE);[m
[31m-            res_tb_idx = 5;[m
[31m-[m
[31m-#if 0[m
[31m-            /* clear the Lua table */[m
[31m-            lua_pushnil(L);[m
[31m-            while (lua_next(L, res_tb_idx) != 0) {[m
[31m-                lua_pop(L, 1);[m
[31m-                lua_pushvalue(L, -1);[m
[31m-                lua_pushnil(L);[m
[31m-                lua_rawset(L, res_tb_idx);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-        } else {[m
[31m-            group_id =  luaL_checkint(L, 5);[m
[31m-            if (group_id < 0) {[m
[31m-                group_id = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    re_comp.options = 0;[m
[31m-[m
[31m-    flags = ngx_http_lua_ngx_re_parse_opts(L, &re_comp, &opts, 3);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-        pool = lmcf->pool;[m
[31m-[m
[31m-        dd("server pool %p", lmcf->pool);[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-[m
[31m-        lua_pushliteral(L, "m");[m
[31m-        lua_pushvalue(L, 2); /* table regex */[m
[31m-[m
[31m-        dd("options size: %d", (int) sizeof(re_comp.options));[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) &re_comp.options, sizeof(re_comp.options));[m
[31m-                /* table regex opts */[m
[31m-[m
[31m-        lua_concat(L, 3); /* table key */[m
[31m-        lua_pushvalue(L, -1); /* table key key */[m
[31m-[m
[31m-        dd("regex cache key: %.*s", (int) (pat.len + sizeof(re_comp.options)),[m
[31m-           lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_rawget(L, -3); /* table key re */[m
[31m-        re = lua_touserdata(L, -1);[m
[31m-[m
[31m-        lua_pop(L, 1); /* table key */[m
[31m-[m
[31m-        if (re) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua regex cache hit for match regex \"%s\" with "[m
[31m-                           "options \"%s\"", pat.data, opts.data);[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-            dd("restoring regex %p, ncaptures %d,  captures %p", re->regex,[m
[31m-               re->ncaptures, re->captures);[m
[31m-[m
[31m-            re_comp.regex = re->regex;[m
[31m-            sd = re->regex_sd;[m
[31m-            re_comp.captures = re->ncaptures;[m
[31m-            cap = re->captures;[m
[31m-[m
[31m-            if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-                ovecsize = 2;[m
[31m-[m
[31m-            } else {[m
[31m-                ovecsize = (re->ncaptures + 1) * 3;[m
[31m-            }[m
[31m-[m
[31m-            goto exec;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua regex cache miss for match regex \"%s\" "[m
[31m-                       "with options \"%s\"", pat.data, opts.data);[m
[31m-[m
[31m-        if (lmcf->regex_cache_entries >= lmcf->regex_cache_max_entries) {[m
[31m-[m
[31m-            if (lmcf->regex_cache_entries == lmcf->regex_cache_max_entries) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "lua exceeding regex cache max entries (%i)",[m
[31m-                              lmcf->regex_cache_max_entries);[m
[31m-[m
[31m-                lmcf->regex_cache_entries++;[m
[31m-            }[m
[31m-[m
[31m-            pool = r->pool;[m
[31m-            flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        pool = r->pool;[m
[31m-    }[m
[31m-[m
[31m-    dd("pool %p, r pool %p", pool, r->pool);[m
[31m-[m
[31m-    re_comp.pattern = pat;[m
[31m-    re_comp.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    re_comp.err.data = errstr;[m
[31m-    re_comp.pool = pool;[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua compiling match regex \"%s\" with options \"%s\" "[m
[31m-                   "(compile once: %d) (dfa mode: %d) (jit mode: %d)",[m
[31m-                   pat.data, opts.data,[m
[31m-                   (flags & NGX_LUA_RE_COMPILE_ONCE) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_DFA) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_JIT) != 0);[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-    rc = ngx_http_lua_regex_compile(&re_comp);[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dd("compile failed");[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        if (!wantcaps) {[m
[31m-            lua_pushnil(L);[m
[31m-        }[m
[31m-        lua_pushlstring(L, (char *) re_comp.err.data, re_comp.err.len);[m
[31m-        return wantcaps ? 2 : 3;[m
[31m-    }[m
[31m-[m
[31m-#if (LUA_HAVE_PCRE_JIT)[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (sd != NULL) {[m
[31m-            int         jitted;[m
[31m-[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-            pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);[m
[31m-[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre JIT compiling result: %d", jitted);[m
[31m-        }[m
[31m-#   endif /* !(NGX_DEBUG) */[m
[31m-[m
[31m-    } else {[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, 0, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre_study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-    }[m
[31m-[m
[31m-#else  /* !(LUA_HAVE_PCRE_JIT) */[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "your pcre build does not have JIT support and "[m
[31m-                       "the \"j\" regex option is ignored");[m
[31m-    }[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (sd && lmcf->regex_match_limit > 0) {[m
[31m-        sd->flags |= PCRE_EXTRA_MATCH_LIMIT;[m
[31m-        sd->match_limit = lmcf->regex_match_limit;[m
[31m-    }[m
[31m-[m
[31m-    dd("compile done, captures %d", (int) re_comp.captures);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re_comp.captures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re_comp.captures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    dd("allocating cap with size: %d", (int) ovecsize);[m
[31m-[m
[31m-    cap = ngx_palloc(pool, ovecsize * sizeof(int));[m
[31m-[m
[31m-    if (cap == NULL) {[m
[31m-        flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua saving compiled regex (%d captures) into the cache "[m
[31m-                       "(entries %i)", re_comp.captures,[m
[31m-                       lmcf->regex_cache_entries);[m
[31m-[m
[31m-        re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));[m
[31m-        if (re == NULL) {[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        dd("saving regex %p, ncaptures %d,  captures %p", re_comp.regex,[m
[31m-           re_comp.captures, cap);[m
[31m-[m
[31m-        re->regex = re_comp.regex;[m
[31m-        re->regex_sd = sd;[m
[31m-        re->ncaptures = re_comp.captures;[m
[31m-        re->captures = cap;[m
[31m-        re->replace = NULL;[m
[31m-[m
[31m-        lua_pushlightuserdata(L, re); /* table key value */[m
[31m-        lua_rawset(L, -3); /* table */[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (lmcf) {[m
[31m-            lmcf->regex_cache_entries++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-exec:[m
[31m-[m
[31m-    if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMECOUNT,[m
[31m-                      &name_count) != 0)[m
[31m-    {[m
[31m-        msg = "cannot acquire named subpattern count";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMEENTRYSIZE,[m
[31m-                          &name_entry_size) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern entry size";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMETABLE,[m
[31m-                          &name_table) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern table";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_NO_UTF8_CHECK) {[m
[31m-        exec_opts = PCRE_NO_UTF8_CHECK;[m
[31m-[m
[31m-    } else {[m
[31m-        exec_opts = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_DFA[m
[31m-[m
[31m-        int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];[m
[31m-        rc = ngx_http_lua_regex_dfa_exec(re_comp.regex, sd, &subj,[m
[31m-                                         (int) pos, cap, ovecsize, ws,[m
[31m-                                         sizeof(ws)/sizeof(ws[0]), exec_opts);[m
[31m-[m
[31m-#else /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-        msg = "at least pcre 6.0 is required for the DFA mode";[m
[31m-        goto error;[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-    } else {[m
[31m-        rc = ngx_http_lua_regex_exec(re_comp.regex, sd, &subj, (int) pos, cap,[m
[31m-                                     ovecsize, exec_opts);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "regex \"%V\" not matched on string \"%V\" starting "[m
[31m-                       "from %i", &pat, &subj, pos);[m
[31m-[m
[31m-        if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-            if (sd) {[m
[31m-                ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc < 0) {[m
[31m-        msg = lua_pushfstring(L, ngx_regex_exec_n " failed: %d", (int) rc);[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-            rc = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            msg = "capture size too small";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("rc = %d", (int) rc);[m
[31m-[m
[31m-    if (has_ctx) { /* having ctx table */[m
[31m-        pos = cap[1];[m
[31m-        lua_pushinteger(L, (lua_Integer) (pos + 1));[m
[31m-        lua_setfield(L, 4, "pos");[m
[31m-    }[m
[31m-[m
[31m-    if (!wantcaps) {[m
[31m-        if (group_id > re_comp.captures) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "nth out of bound");[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        if (group_id >= rc) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushnil(L);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        {[m
[31m-            int     from, to;[m
[31m-[m
[31m-            from = cap[group_id * 2] + 1;[m
[31m-            to = cap[group_id * 2 + 1];[m
[31m-            if (from < 0 || to < 0) {[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushnil(L);[m
[31m-                return 2;[m
[31m-            }[m
[31m-[m
[31m-            lua_pushinteger(L, from);[m
[31m-            lua_pushinteger(L, to);[m
[31m-            return 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (res_tb_idx == 0) {[m
[31m-        lua_createtable(L, re_comp.captures || 1 /* narr */,[m
[31m-                        name_count /* nrec */);[m
[31m-        res_tb_idx = lua_gettop(L);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0, n = 0; i <= re_comp.captures; i++, n += 2) {[m
[31m-        dd("capture %d: %d %d", i, cap[n], cap[n + 1]);[m
[31m-        if (i >= rc || cap[n] < 0) {[m
[31m-            lua_pushboolean(L, 0);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushlstring(L, (char *) &subj.data[cap[n]],[m
[31m-                            cap[n + 1] - cap[n]);[m
[31m-[m
[31m-            dd("pushing capture %s at %d", lua_tostring(L, -1), (int) i);[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, res_tb_idx, (int) i);[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        ngx_http_lua_re_collect_named_captures(L, res_tb_idx, name_table,[m
[31m-                                               name_count, name_entry_size,[m
[31m-                                               flags, &subj);[m
[31m-    }[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        ngx_pfree(pool, re_comp.regex);[m
[31m-        ngx_pfree(pool, cap);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (re_comp.regex) {[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-        }[m
[31m-[m
[31m-        if (cap) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    if (!wantcaps) {[m
[31m-        lua_pushnil(L);[m
[31m-    }[m
[31m-    lua_pushstring(L, msg);[m
[31m-    return wantcaps ? 2 : 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_gmatch(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_str_t                    subj;[m
[31m-    ngx_str_t                    pat;[m
[31m-    ngx_str_t                    opts;[m
[31m-    int                          ovecsize;[m
[31m-    ngx_http_lua_regex_t        *re;[m
[31m-    ngx_http_lua_regex_ctx_t    *ctx;[m
[31m-    const char                  *msg;[m
[31m-    int                          nargs;[m
[31m-    ngx_int_t                    flags;[m
[31m-    int                         *cap = NULL;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_pool_t                  *pool, *old_pool;[m
[31m-    u_char                       errstr[NGX_MAX_CONF_ERRSTR + 1];[m
[31m-    pcre_extra                  *sd = NULL;[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-[m
[31m-    ngx_http_lua_regex_compile_t      re_comp;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    if (nargs != 2 && nargs != 3) {[m
[31m-        return luaL_error(L, "expecting two or three arguments, but got %d",[m
[31m-                          nargs);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    subj.data = (u_char *) luaL_checklstring(L, 1, &subj.len);[m
[31m-    pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-[m
[31m-    if (nargs == 3) {[m
[31m-        opts.data = (u_char *) luaL_checklstring(L, 3, &opts.len);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        opts.data = (u_char *) "";[m
[31m-        opts.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* stack: subj regex */[m
[31m-[m
[31m-    re_comp.options = 0;[m
[31m-[m
[31m-    flags = ngx_http_lua_ngx_re_parse_opts(L, &re_comp, &opts, 3);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-        pool = lmcf->pool;[m
[31m-[m
[31m-        dd("server pool %p", lmcf->pool);[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-[m
[31m-        lua_pushliteral(L, "m");[m
[31m-        lua_pushvalue(L, 2); /* table regex */[m
[31m-[m
[31m-        dd("options size: %d", (int) sizeof(re_comp.options));[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) &re_comp.options,[m
[31m-                        sizeof(re_comp.options)); /* table regex opts */[m
[31m-[m
[31m-        lua_concat(L, 3); /* table key */[m
[31m-        lua_pushvalue(L, -1); /* table key key */[m
[31m-[m
[31m-        dd("regex cache key: %.*s", (int) (pat.len + sizeof(re_comp.options)),[m
[31m-           lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_rawget(L, -3); /* table key re */[m
[31m-        re = lua_touserdata(L, -1);[m
[31m-[m
[31m-        lua_pop(L, 1); /* table key */[m
[31m-[m
[31m-        if (re) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua regex cache hit for match regex \"%s\" "[m
[31m-                           "with options \"%s\"", pat.data, opts.data);[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-            dd("restoring regex %p, ncaptures %d,  captures %p", re->regex,[m
[31m-               re->ncaptures, re->captures);[m
[31m-[m
[31m-            re_comp.regex = re->regex;[m
[31m-            sd = re->regex_sd;[m
[31m-            re_comp.captures = re->ncaptures;[m
[31m-            cap = re->captures;[m
[31m-[m
[31m-            if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-                ovecsize = 2;[m
[31m-[m
[31m-            } else {[m
[31m-                ovecsize = (re->ncaptures + 1) * 3;[m
[31m-            }[m
[31m-[m
[31m-            goto compiled;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua regex cache miss for match regex \"%s\" "[m
[31m-                       "with options \"%s\"", pat.data, opts.data);[m
[31m-[m
[31m-        if (lmcf->regex_cache_entries >= lmcf->regex_cache_max_entries) {[m
[31m-[m
[31m-            if (lmcf->regex_cache_entries == lmcf->regex_cache_max_entries) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "lua exceeding regex cache max entries (%i)",[m
[31m-                              lmcf->regex_cache_max_entries);[m
[31m-[m
[31m-                lmcf->regex_cache_entries++;[m
[31m-            }[m
[31m-[m
[31m-            pool = r->pool;[m
[31m-            flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        pool = r->pool;[m
[31m-    }[m
[31m-[m
[31m-    re_comp.pattern = pat;[m
[31m-    re_comp.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    re_comp.err.data = errstr;[m
[31m-    re_comp.pool = pool;[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua compiling gmatch regex \"%s\" with options \"%s\" "[m
[31m-                   "(compile once: %d) (dfa mode: %d) (jit mode: %d)",[m
[31m-                   pat.data, opts.data,[m
[31m-                   (flags & NGX_LUA_RE_COMPILE_ONCE) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_DFA) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_JIT) != 0);[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-    rc = ngx_http_lua_regex_compile(&re_comp);[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dd("compile failed");[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushlstring(L, (char *) re_comp.err.data, re_comp.err.len);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_JIT[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre_study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (sd != NULL) {[m
[31m-            int         jitted;[m
[31m-[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-            pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);[m
[31m-[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre JIT compiling result: %d", jitted);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, 0, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-    }[m
[31m-[m
[31m-#else  /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "your pcre build does not have JIT support and "[m
[31m-                       "the \"j\" regex option is ignored");[m
[31m-    }[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (sd && lmcf->regex_match_limit > 0) {[m
[31m-        sd->flags |= PCRE_EXTRA_MATCH_LIMIT;[m
[31m-        sd->match_limit = lmcf->regex_match_limit;[m
[31m-    }[m
[31m-[m
[31m-    dd("compile done, captures %d", re_comp.captures);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re_comp.captures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re_comp.captures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    cap = ngx_palloc(pool, ovecsize * sizeof(int));[m
[31m-    if (cap == NULL) {[m
[31m-        flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua saving compiled regex (%d captures) into the cache "[m
[31m-                       "(entries %i)", re_comp.captures,[m
[31m-                       lmcf->regex_cache_entries);[m
[31m-[m
[31m-        re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));[m
[31m-        if (re == NULL) {[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        dd("saving regex %p, ncaptures %d,  captures %p", re_comp.regex,[m
[31m-           re_comp.captures, cap);[m
[31m-[m
[31m-        re->regex = re_comp.regex;[m
[31m-        re->regex_sd = sd;[m
[31m-        re->ncaptures = re_comp.captures;[m
[31m-        re->captures = cap;[m
[31m-        re->replace = NULL;[m
[31m-[m
[31m-        lua_pushlightuserdata(L, re); /* table key value */[m
[31m-        lua_rawset(L, -3); /* table */[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (lmcf) {[m
[31m-            lmcf->regex_cache_entries++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-compiled:[m
[31m-[m
[31m-    lua_settop(L, 1);[m
[31m-[m
[31m-    ctx = lua_newuserdata(L, sizeof(ngx_http_lua_regex_ctx_t));[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-    ctx->regex = re_comp.regex;[m
[31m-    ctx->regex_sd = sd;[m
[31m-    ctx->ncaptures = re_comp.captures;[m
[31m-    ctx->captures = cap;[m
[31m-    ctx->captures_len = ovecsize;[m
[31m-    ctx->flags = (uint8_t) flags;[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-        lua_pushcfunction(L, ngx_http_lua_ngx_re_gmatch_gc);[m
[31m-        lua_setfield(L, -2, "__gc");[m
[31m-        lua_setmetatable(L, -2);[m
[31m-[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_ngx_re_gmatch_cleanup;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, 0);[m
[31m-[m
[31m-    /* upvalues in order: subj ctx offset */[m
[31m-    lua_pushcclosure(L, ngx_http_lua_ngx_re_gmatch_iterator, 3);[m
[31m-[m
[31m-    return 1;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (re_comp.regex) {[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-        }[m
[31m-[m
[31m-        if (cap) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushstring(L, msg);[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_gmatch_iterator(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_regex_ctx_t    *ctx;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                         *cap;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-    int                          i;[m
[31m-    ngx_str_t                    subj;[m
[31m-    int                          offset;[m
[31m-    const char                  *msg = NULL;[m
[31m-    int                          name_entry_size = 0, name_count;[m
[31m-    u_char                      *name_table = NULL;[m
[31m-    int                          exec_opts;[m
[31m-[m
[31m-    /* upvalues in order: subj ctx offset */[m
[31m-[m
[31m-    subj.data = (u_char *) lua_tolstring(L, lua_upvalueindex(1), &subj.len);[m
[31m-    ctx = (ngx_http_lua_regex_ctx_t *) lua_touserdata(L, lua_upvalueindex(2));[m
[31m-    offset = (int) lua_tointeger(L, lua_upvalueindex(3));[m
[31m-[m
[31m-    if (offset < 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    cap = ctx->captures;[m
[31m-[m
[31m-    dd("offset %d, r %p, subj %s", (int) offset, ctx->request, subj.data);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    if (r != ctx->request || r->pool != ctx->request->pool) {[m
[31m-        return luaL_error(L, "attempt to use ngx.re.gmatch iterator in a "[m
[31m-                          "request that did not create it");[m
[31m-    }[m
[31m-[m
[31m-    dd("regex exec...");[m
[31m-[m
[31m-    if (pcre_fullinfo(ctx->regex, NULL, PCRE_INFO_NAMECOUNT,[m
[31m-                      &name_count) != 0)[m
[31m-    {[m
[31m-        msg = "cannot acquire named subpattern count";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        if (pcre_fullinfo(ctx->regex, NULL, PCRE_INFO_NAMEENTRYSIZE,[m
[31m-                          &name_entry_size) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern entry size";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (pcre_fullinfo(ctx->regex, NULL, PCRE_INFO_NAMETABLE,[m
[31m-                          &name_table) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern table";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->flags & NGX_LUA_RE_NO_UTF8_CHECK) {[m
[31m-        exec_opts = PCRE_NO_UTF8_CHECK;[m
[31m-[m
[31m-    } else {[m
[31m-        exec_opts = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_DFA[m
[31m-[m
[31m-        int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];[m
[31m-[m
[31m-        rc = ngx_http_lua_regex_dfa_exec(ctx->regex, ctx->regex_sd, &subj,[m
[31m-                                         offset, cap, ctx->captures_len, ws,[m
[31m-                                         sizeof(ws)/sizeof(ws[0]), exec_opts);[m
[31m-[m
[31m-#else /* LUA_HAVE_PCRE_DFA */[m
[31m-        msg = "at least pcre 6.0 is required for the DFA mode";[m
[31m-        goto error;[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-    } else {[m
[31m-        rc = ngx_http_lua_regex_exec(ctx->regex, ctx->regex_sd, &subj,[m
[31m-                                     offset, cap, ctx->captures_len,[m
[31m-                                     exec_opts);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-        /* set upvalue "offset" to -1 */[m
[31m-        lua_pushinteger(L, -1);[m
[31m-        lua_replace(L, lua_upvalueindex(3));[m
[31m-[m
[31m-        if (!(ctx->flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-            if (ctx->regex_sd) {[m
[31m-                ngx_http_lua_regex_free_study_data(r->pool, ctx->regex_sd);[m
[31m-                ctx->regex_sd = NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(r->pool, cap);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc < 0) {[m
[31m-        msg = lua_pushfstring(L, ngx_regex_exec_n " failed: %d", (int) rc);[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        if (ctx->flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-            rc = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("rc = %d", (int) rc);[m
[31m-[m
[31m-    lua_createtable(L, ctx->ncaptures || 1 /* narr */, name_count /* nrec */);[m
[31m-[m
[31m-    for (i = 0, n = 0; i <= ctx->ncaptures; i++, n += 2) {[m
[31m-        dd("capture %d: %d %d", i, cap[n], cap[n + 1]);[m
[31m-        if (i >= rc || cap[n] < 0) {[m
[31m-            lua_pushboolean(L, 0);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushlstring(L, (char *) &subj.data[cap[n]],[m
[31m-                            cap[n + 1] - cap[n]);[m
[31m-[m
[31m-            dd("pushing capture %s at %d", lua_tostring(L, -1), (int) i);[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, -2, (int) i);[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        ngx_http_lua_re_collect_named_captures(L, lua_gettop(L), name_table,[m
[31m-                                               name_count, name_entry_size,[m
[31m-                                               ctx->flags, &subj);[m
[31m-    }[m
[31m-[m
[31m-    offset = cap[1];[m
[31m-    if (offset == cap[0]) {[m
[31m-        offset++;[m
[31m-    }[m
[31m-[m
[31m-    if (offset > (ssize_t) subj.len) {[m
[31m-        offset = -1;[m
[31m-[m
[31m-        if (!(ctx->flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-            if (ctx->regex_sd) {[m
[31m-                ngx_http_lua_regex_free_study_data(r->pool, ctx->regex_sd);[m
[31m-                ctx->regex_sd = NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(r->pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, offset);[m
[31m-    lua_replace(L, lua_upvalueindex(3));[m
[31m-[m
[31m-    return 1;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    lua_pushinteger(L, -1);[m
[31m-    lua_replace(L, lua_upvalueindex(3));[m
[31m-[m
[31m-    if (!(ctx->flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (ctx->regex_sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(r->pool, ctx->regex_sd);[m
[31m-            ctx->regex_sd = NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_pfree(r->pool, cap);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushstring(L, msg);[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_lua_ngx_re_parse_opts(lua_State *L, ngx_http_lua_regex_compile_t *re,[m
[31m-    ngx_str_t *opts, int narg)[m
[31m-{[m
[31m-    u_char          *p;[m
[31m-    const char      *msg;[m
[31m-    ngx_uint_t       flags;[m
[31m-[m
[31m-    flags = 0;[m
[31m-    p = opts->data;[m
[31m-[m
[31m-    while (*p != '\0') {[m
[31m-        switch (*p) {[m
[31m-            case 'i':[m
[31m-                re->options |= NGX_REGEX_CASELESS;[m
[31m-                break;[m
[31m-[m
[31m-            case 's':[m
[31m-                re->options |= PCRE_DOTALL;[m
[31m-                break;[m
[31m-[m
[31m-            case 'm':[m
[31m-                re->options |= PCRE_MULTILINE;[m
[31m-                break;[m
[31m-[m
[31m-            case 'u':[m
[31m-                re->options |= PCRE_UTF8;[m
[31m-                break;[m
[31m-[m
[31m-            case 'U':[m
[31m-                re->options |= PCRE_UTF8;[m
[31m-                flags |= NGX_LUA_RE_NO_UTF8_CHECK;[m
[31m-                break;[m
[31m-[m
[31m-            case 'x':[m
[31m-                re->options |= PCRE_EXTENDED;[m
[31m-                break;[m
[31m-[m
[31m-            case 'o':[m
[31m-                flags |= NGX_LUA_RE_COMPILE_ONCE;[m
[31m-                break;[m
[31m-[m
[31m-            case 'j':[m
[31m-                flags |= NGX_LUA_RE_MODE_JIT;[m
[31m-                break;[m
[31m-[m
[31m-            case 'd':[m
[31m-                flags |= NGX_LUA_RE_MODE_DFA;[m
[31m-                break;[m
[31m-[m
[31m-            case 'a':[m
[31m-                re->options |= PCRE_ANCHORED;[m
[31m-                break;[m
[31m-[m
[31m-#if (PCRE_MAJOR > 8) || (PCRE_MAJOR == 8 && PCRE_MINOR >= 12)[m
[31m-            case 'D':[m
[31m-                re->options |= PCRE_DUPNAMES;[m
[31m-                flags |= NGX_LUA_RE_MODE_DUPNAMES;[m
[31m-                break;[m
[31m-[m
[31m-            case 'J':[m
[31m-                re->options |= PCRE_JAVASCRIPT_COMPAT;[m
[31m-                break;[m
[31m-#endif[m
[31m-[m
[31m-            default:[m
[31m-                msg = lua_pushfstring(L, "unknown flag \"%c\" (flags \"%s\")",[m
[31m-                                      *p, opts->data);[m
[31m-                return luaL_argerror(L, narg, msg);[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    /* pcre does not support JIT for DFA mode yet,[m
[31m-     * so if DFA mode is specified, we turn off JIT automatically[m
[31m-     * */[m
[31m-    if ((flags & NGX_LUA_RE_MODE_JIT) && (flags & NGX_LUA_RE_MODE_DFA)) {[m
[31m-        flags &= ~NGX_LUA_RE_MODE_JIT;[m
[31m-    }[m
[31m-[m
[31m-    return flags;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_sub(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_ngx_re_sub_helper(L, 0 /* global */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_gsub(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_ngx_re_sub_helper(L, 1 /* global */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_sub_helper(lua_State *L, unsigned global)[m
[31m-{[m
[31m-    ngx_http_lua_regex_t        *re;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_str_t                    subj;[m
[31m-    ngx_str_t                    pat;[m
[31m-    ngx_str_t                    opts;[m
[31m-    ngx_str_t                    tpl;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_pool_t                  *pool, *old_pool;[m
[31m-    const char                  *msg;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-    ngx_int_t                    i;[m
[31m-    int                          nargs;[m
[31m-    int                         *cap = NULL;[m
[31m-    int                          ovecsize;[m
[31m-    int                          type;[m
[31m-    unsigned                     func;[m
[31m-    int                          offset;[m
[31m-    int                          cp_offset;[m
[31m-    size_t                       count;[m
[31m-    luaL_Buffer                  luabuf;[m
[31m-    ngx_int_t                    flags;[m
[31m-    u_char                      *p;[m
[31m-    u_char                       errstr[NGX_MAX_CONF_ERRSTR + 1];[m
[31m-    pcre_extra                  *sd = NULL;[m
[31m-    int                          name_entry_size = 0, name_count;[m
[31m-    u_char                      *name_table = NULL;[m
[31m-    int                          exec_opts;[m
[31m-[m
[31m-    ngx_http_lua_regex_compile_t               re_comp;[m
[31m-    ngx_http_lua_complex_value_t              *ctpl = NULL;[m
[31m-    ngx_http_lua_compile_complex_value_t       ccv;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    if (nargs != 3 && nargs != 4) {[m
[31m-        return luaL_error(L, "expecting three or four arguments, but got %d",[m
[31m-                          nargs);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    subj.data = (u_char *) luaL_checklstring(L, 1, &subj.len);[m
[31m-    pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-[m
[31m-    func = 0;[m
[31m-[m
[31m-    type = lua_type(L, 3);[m
[31m-    switch (type) {[m
[31m-        case LUA_TFUNCTION:[m
[31m-            func = 1;[m
[31m-            tpl.len = 0;[m
[31m-            tpl.data = (u_char *) "";[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            tpl.data = (u_char *) lua_tolstring(L, 3, &tpl.len);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "string, number, or function expected, "[m
[31m-                                  "got %s", lua_typename(L, type));[m
[31m-            return luaL_argerror(L, 3, msg);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&re_comp, sizeof(ngx_http_lua_regex_compile_t));[m
[31m-[m
[31m-    if (nargs == 4) {[m
[31m-        opts.data = (u_char *) luaL_checklstring(L, 4, &opts.len);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else { /* nargs == 3 */[m
[31m-        opts.data = (u_char *) "";[m
[31m-        opts.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* stack: subj regex repl */[m
[31m-[m
[31m-    re_comp.options = 0;[m
[31m-[m
[31m-    flags = ngx_http_lua_ngx_re_parse_opts(L, &re_comp, &opts, 4);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-        pool = lmcf->pool;[m
[31m-[m
[31m-        dd("server pool %p", lmcf->pool);[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-[m
[31m-        lua_pushliteral(L, "s");[m
[31m-        lua_pushinteger(L, tpl.len);[m
[31m-        lua_pushliteral(L, ":");[m
[31m-        lua_pushvalue(L, 2);[m
[31m-[m
[31m-        if (tpl.len != 0) {[m
[31m-            lua_pushvalue(L, 3);[m
[31m-        }[m
[31m-[m
[31m-        dd("options size: %d", (int) sizeof(re_comp.options));[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) &re_comp.options, sizeof(re_comp.options));[m
[31m-                /* table regex opts */[m
[31m-[m
[31m-        if (tpl.len == 0) {[m
[31m-            lua_concat(L, 5); /* table key */[m
[31m-[m
[31m-        } else {[m
[31m-            lua_concat(L, 6); /* table key */[m
[31m-        }[m
[31m-[m
[31m-        lua_pushvalue(L, -1); /* table key key */[m
[31m-[m
[31m-        dd("regex cache key: %.*s", (int) (pat.len + sizeof(re_comp.options)),[m
[31m-           lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_rawget(L, -3); /* table key re */[m
[31m-        re = lua_touserdata(L, -1);[m
[31m-[m
[31m-        lua_pop(L, 1); /* table key */[m
[31m-[m
[31m-        if (re) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua regex cache hit for sub regex \"%s\" with "[m
[31m-                           "options \"%s\" and replace \"%s\"",[m
[31m-                           pat.data, opts.data,[m
[31m-                           func ? (u_char *) "<func>" : tpl.data);[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-            dd("restoring regex %p, ncaptures %d,  captures %p", re->regex,[m
[31m-               re->ncaptures, re->captures);[m
[31m-[m
[31m-            re_comp.regex = re->regex;[m
[31m-            sd = re->regex_sd;[m
[31m-            re_comp.captures = re->ncaptures;[m
[31m-            cap = re->captures;[m
[31m-            ctpl = re->replace;[m
[31m-[m
[31m-            if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-                ovecsize = 2;[m
[31m-[m
[31m-            } else {[m
[31m-                ovecsize = (re->ncaptures + 1) * 3;[m
[31m-            }[m
[31m-[m
[31m-            goto exec;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua regex cache miss for %ssub regex \"%s\" with "[m
[31m-                       "options \"%s\" and replace \"%s\"",[m
[31m-                       global ? "g" : "", pat.data, opts.data,[m
[31m-                       func ? (u_char *) "<func>" : tpl.data);[m
[31m-[m
[31m-        if (lmcf->regex_cache_entries >= lmcf->regex_cache_max_entries) {[m
[31m-[m
[31m-            if (lmcf->regex_cache_entries == lmcf->regex_cache_max_entries) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "lua exceeding regex cache max entries (%i)",[m
[31m-                              lmcf->regex_cache_max_entries);[m
[31m-[m
[31m-                lmcf->regex_cache_entries++;[m
[31m-            }[m
[31m-[m
[31m-            pool = r->pool;[m
[31m-            flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        pool = r->pool;[m
[31m-    }[m
[31m-[m
[31m-    re_comp.pattern = pat;[m
[31m-    re_comp.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    re_comp.err.data = errstr;[m
[31m-    re_comp.pool = pool;[m
[31m-[m
[31m-    dd("compiling regex");[m
[31m-[m
[31m-    ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua compiling %ssub regex \"%s\" with options \"%s\" "[m
[31m-                   "(compile once: %d) (dfa mode: %d) (jit mode: %d)",[m
[31m-                   global ? "g" : "", pat.data, opts.data,[m
[31m-                   (flags & NGX_LUA_RE_COMPILE_ONCE) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_DFA) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_JIT) != 0);[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-    rc = ngx_http_lua_regex_compile(&re_comp);[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dd("compile failed");[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushlstring(L, (char *) re_comp.err.data, re_comp.err.len);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_JIT[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (sd != NULL) {[m
[31m-            int         jitted;[m
[31m-[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-            pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);[m
[31m-[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre JIT compiling result: %d", jitted);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, 0, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre_study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-    }[m
[31m-[m
[31m-#else  /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "your pcre build does not have JIT support and "[m
[31m-                       "the \"j\" regex option is ignored");[m
[31m-    }[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (sd && lmcf->regex_match_limit > 0) {[m
[31m-        sd->flags |= PCRE_EXTRA_MATCH_LIMIT;[m
[31m-        sd->match_limit = lmcf->regex_match_limit;[m
[31m-    }[m
[31m-[m
[31m-    dd("compile done, captures %d", re_comp.captures);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re_comp.captures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re_comp.captures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    cap = ngx_palloc(pool, ovecsize * sizeof(int));[m
[31m-    if (cap == NULL) {[m
[31m-        flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (func) {[m
[31m-        ctpl = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        ctpl = ngx_palloc(pool, sizeof(ngx_http_lua_complex_value_t));[m
[31m-        if (ctpl == NULL) {[m
[31m-            flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_LUA_RE_COMPILE_ONCE) && tpl.len != 0) {[m
[31m-            /* copy the string buffer pointed to by tpl.data from Lua VM */[m
[31m-            p = ngx_palloc(pool, tpl.len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-                msg = "no memory";[m
[31m-                goto error;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(p, tpl.data, tpl.len);[m
[31m-            p[tpl.len] = '\0';[m
[31m-[m
[31m-            tpl.data = p;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_lua_compile_complex_value_t));[m
[31m-        ccv.pool = pool;[m
[31m-        ccv.log = r->connection->log;[m
[31m-        ccv.value = &tpl;[m
[31m-        ccv.complex_value = ctpl;[m
[31m-[m
[31m-        if (ngx_http_lua_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-            ngx_pfree(pool, ctpl);[m
[31m-[m
[31m-            if ((flags & NGX_LUA_RE_COMPILE_ONCE) && tpl.len != 0) {[m
[31m-                ngx_pfree(pool, tpl.data);[m
[31m-            }[m
[31m-[m
[31m-            if (sd) {[m
[31m-                ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "failed to compile the replacement template");[m
[31m-            return 3;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua saving compiled sub regex (%d captures) into "[m
[31m-                       "the cache (entries %i)", re_comp.captures,[m
[31m-                       lmcf->regex_cache_entries);[m
[31m-[m
[31m-        re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));[m
[31m-        if (re == NULL) {[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        dd("saving regex %p, ncaptures %d,  captures %p", re_comp.regex,[m
[31m-           re_comp.captures, cap);[m
[31m-[m
[31m-        re->regex = re_comp.regex;[m
[31m-        re->regex_sd = sd;[m
[31m-        re->ncaptures = re_comp.captures;[m
[31m-        re->captures = cap;[m
[31m-        re->replace = ctpl;[m
[31m-[m
[31m-        lua_pushlightuserdata(L, re); /* table key value */[m
[31m-        lua_rawset(L, -3); /* table */[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (lmcf) {[m
[31m-            lmcf->regex_cache_entries++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-exec:[m
[31m-[m
[31m-    count = 0;[m
[31m-    offset = 0;[m
[31m-    cp_offset = 0;[m
[31m-[m
[31m-    if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMECOUNT,[m
[31m-                      &name_count) != 0)[m
[31m-    {[m
[31m-        msg = "cannot acquire named subpattern count";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMEENTRYSIZE,[m
[31m-                          &name_entry_size) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern entry size";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMETABLE,[m
[31m-                          &name_table) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern table";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_NO_UTF8_CHECK) {[m
[31m-        exec_opts = PCRE_NO_UTF8_CHECK;[m
[31m-[m
[31m-    } else {[m
[31m-        exec_opts = 0;[m
[31m-    }[m
[31m-[m
[31m-    for (;;) {[m
[31m-        if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_DFA[m
[31m-[m
[31m-            int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];[m
[31m-            rc = ngx_http_lua_regex_dfa_exec(re_comp.regex, sd, &subj,[m
[31m-                                             offset, cap, ovecsize, ws,[m
[31m-                                             sizeof(ws)/sizeof(ws[0]),[m
[31m-                                             exec_opts);[m
[31m-[m
[31m-#else /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-            msg = "at least pcre 6.0 is required for the DFA mode";[m
[31m-            goto error;[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_http_lua_regex_exec(re_comp.regex, sd, &subj, offset, cap,[m
[31m-                                         ovecsize, exec_opts);[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc < 0) {[m
[31m-            msg = lua_pushfstring(L, ngx_regex_exec_n " failed: %d",[m
[31m-                                  (int) rc);[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-                rc = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                msg = "capture size too small";[m
[31m-                goto error;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("rc = %d", (int) rc);[m
[31m-[m
[31m-        count++;[m
[31m-[m
[31m-        if (count == 1) {[m
[31m-            luaL_buffinit(L, &luabuf);[m
[31m-        }[m
[31m-[m
[31m-        if (func) {[m
[31m-            lua_pushvalue(L, 3);[m
[31m-[m
[31m-            lua_createtable(L, re_comp.captures || 1 /* narr */,[m
[31m-                            name_count /* nrec */);[m
[31m-[m
[31m-            for (i = 0, n = 0; i <= re_comp.captures; i++, n += 2) {[m
[31m-                dd("capture %d: %d %d", (int) i, cap[n], cap[n + 1]);[m
[31m-                if (i >= rc || cap[n] < 0) {[m
[31m-                    lua_pushboolean(L, 0);[m
[31m-[m
[31m-                } else {[m
[31m-                    lua_pushlstring(L, (char *) &subj.data[cap[n]],[m
[31m-                                    cap[n + 1] - cap[n]);[m
[31m-[m
[31m-                    dd("pushing capture %s at %d", lua_tostring(L, -1),[m
[31m-                       (int) i);[m
[31m-                }[m
[31m-[m
[31m-                lua_rawseti(L, -2, (int) i);[m
[31m-            }[m
[31m-[m
[31m-            if (name_count > 0) {[m
[31m-                ngx_http_lua_re_collect_named_captures(L, lua_gettop(L),[m
[31m-                                                       name_table,[m
[31m-                                                       name_count,[m
[31m-                                                       name_entry_size,[m
[31m-                                                       flags, &subj);[m
[31m-            }[m
[31m-[m
[31m-            dd("stack size at call: %d", lua_gettop(L));[m
[31m-[m
[31m-            lua_call(L, 1 /* nargs */, 1 /* nresults */);[m
[31m-            type = lua_type(L, -1);[m
[31m-            switch (type) {[m
[31m-                case LUA_TNUMBER:[m
[31m-                case LUA_TSTRING:[m
[31m-                    tpl.data = (u_char *) lua_tolstring(L, -1, &tpl.len);[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    msg = lua_pushfstring(L, "string or number expected to be "[m
[31m-                                          "returned by the replace "[m
[31m-                                          "function, got %s",[m
[31m-                                          lua_typename(L, type));[m
[31m-                    return luaL_argerror(L, 3, msg);[m
[31m-            }[m
[31m-[m
[31m-            lua_insert(L, 1);[m
[31m-[m
[31m-            luaL_addlstring(&luabuf, (char *) &subj.data[cp_offset],[m
[31m-                            cap[0] - cp_offset);[m
[31m-[m
[31m-            luaL_addlstring(&luabuf, (char *) tpl.data, tpl.len);[m
[31m-[m
[31m-            lua_remove(L, 1);[m
[31m-[m
[31m-            cp_offset = cap[1];[m
[31m-            offset = cp_offset;[m
[31m-            if (offset == cap[0]) {[m
[31m-                offset++;[m
[31m-                if (offset > (ssize_t) subj.len) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (global) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_lua_complex_value(r, &subj, cp_offset, rc, cap, ctpl,[m
[31m-                                        &luabuf);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            msg = lua_pushfstring(L, "failed to eval the template for "[m
[31m-                                  "replacement: \"%s\"", tpl.data);[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        cp_offset = cap[1];[m
[31m-        offset = cp_offset;[m
[31m-        if (offset == cap[0]) {[m
[31m-            offset++;[m
[31m-            if (offset > (ssize_t) subj.len) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (global) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (count == 0) {[m
[31m-        dd("no match, just the original subject");[m
[31m-        lua_settop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        if (offset < (int) subj.len) {[m
[31m-            dd("adding trailer: %s (len %d)", &subj.data[cp_offset],[m
[31m-               (int) (subj.len - cp_offset));[m
[31m-[m
[31m-[m
[31m-            luaL_addlstring(&luabuf, (char *) &subj.data[cp_offset],[m
[31m-                            subj.len - cp_offset);[m
[31m-        }[m
[31m-[m
[31m-        luaL_pushresult(&luabuf);[m
[31m-[m
[31m-        dd("the dst string: %s", lua_tostring(L, -1));[m
[31m-    }[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (re_comp.regex) {[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-        }[m
[31m-[m
[31m-        if (ctpl) {[m
[31m-            ngx_pfree(pool, ctpl);[m
[31m-        }[m
[31m-[m
[31m-        if (cap) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, count);[m
[31m-    return 2;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (re_comp.regex) {[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-        }[m
[31m-[m
[31m-        if (ctpl) {[m
[31m-            ngx_pfree(pool, ctpl);[m
[31m-        }[m
[31m-[m
[31m-        if (cap) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushstring(L, msg);[m
[31m-    return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_regex_api(lua_State *L)[m
[31m-{[m
[31m-    /* ngx.re */[m
[31m-[m
[31m-    lua_createtable(L, 0, 5 /* nrec */);    /* .re */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_find);[m
[31m-    lua_setfield(L, -2, "find");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_match);[m
[31m-    lua_setfield(L, -2, "match");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_gmatch);[m
[31m-    lua_setfield(L, -2, "gmatch");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_sub);[m
[31m-    lua_setfield(L, -2, "sub");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_gsub);[m
[31m-    lua_setfield(L, -2, "gsub");[m
[31m-[m
[31m-    lua_setfield(L, -2, "re");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_regex_free_study_data(ngx_pool_t *pool, pcre_extra *sd)[m
[31m-{[m
[31m-    ngx_pool_t              *old_pool;[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_JIT[m
[31m-    pcre_free_study(sd);[m
[31m-#else[m
[31m-    pcre_free(sd);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_regex_compile(ngx_http_lua_regex_compile_t *rc)[m
[31m-{[m
[31m-    int           n, erroff;[m
[31m-    char         *p;[m
[31m-    const char   *errstr;[m
[31m-    pcre         *re;[m
[31m-    ngx_pool_t   *old_pool;[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(rc->pool);[m
[31m-[m
[31m-    re = pcre_compile((const char *) rc->pattern.data, (int) rc->options,[m
[31m-                      &errstr, &erroff, NULL);[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (re == NULL) {[m
[31m-        if ((size_t) erroff == rc->pattern.len) {[m
[31m-            rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                                       "pcre_compile() failed: %s in \"%V\"",[m
[31m-                                      errstr, &rc->pattern)[m
[31m-                         - rc->err.data;[m
[31m-[m
[31m-        } else {[m
[31m-            rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                                       "pcre_compile() failed: %s in \"%V\" "[m
[31m-                                       "at \"%s\"", errstr, &rc->pattern,[m
[31m-                                       rc->pattern.data + erroff)[m
[31m-                         - rc->err.data;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc->regex = re;[m
[31m-[m
[31m-#if 1[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &rc->captures);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_CAPTURECOUNT) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, p, &rc->pattern, n)[m
[31m-                  - rc->err.data;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ngx_re_gmatch_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_regex_ctx_t    *ctx = data;[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        if (ctx->regex_sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(ctx->request->pool,[m
[31m-                                               ctx->regex_sd);[m
[31m-            ctx->regex_sd = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->cleanup) {[m
[31m-            *ctx->cleanup = NULL;[m
[31m-            ctx->cleanup = NULL;[m
[31m-        }[m
[31m-[m
[31m-        ctx->request = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_gmatch_gc(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_regex_ctx_t    *ctx;[m
[31m-[m
[31m-    ctx = lua_touserdata(L, 1);[m
[31m-[m
[31m-    if (ctx && ctx->cleanup) {[m
[31m-        ngx_http_lua_ngx_re_gmatch_cleanup(ctx);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_re_collect_named_captures(lua_State *L, int res_tb_idx,[m
[31m-    u_char *name_table, int name_count, int name_entry_size, unsigned flags,[m
[31m-    ngx_str_t *subj)[m
[31m-{[m
[31m-    int              i, n;[m
[31m-    size_t           len;[m
[31m-    u_char          *name_entry;[m
[31m-    char            *name;[m
[31m-[m
[31m-    for (i = 0; i < name_count; i++) {[m
[31m-        dd("top: %d", lua_gettop(L));[m
[31m-[m
[31m-        name_entry = &name_table[i * name_entry_size];[m
[31m-        n = (name_entry[0] << 8) | name_entry[1];[m
[31m-        name = (char *) &name_entry[2];[m
[31m-[m
[31m-        lua_rawgeti(L, -1, n);[m
[31m-        if (lua_isnil(L, -1)) {[m
[31m-            lua_pop(L, 1);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_LUA_RE_MODE_DUPNAMES) {[m
[31m-            /* unmatched groups are not stored in tables in DUPNAMES mode */[m
[31m-            if (!lua_toboolean(L, -1)) {[m
[31m-                lua_pop(L, 1);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            lua_getfield(L, -2, name); /* big_tb cap small_tb */[m
[31m-[m
[31m-            if (lua_isnil(L, -1)) {[m
[31m-                lua_pop(L, 1);[m
[31m-[m
[31m-                /* assuming named submatches are usually unique */[m
[31m-                lua_createtable(L, 1 /* narr */, 0 /* nrec */);[m
[31m-                lua_pushstring(L, name);[m
[31m-                lua_pushvalue(L, -2); /* big_tb cap small_tb key small_tb */[m
[31m-                lua_rawset(L, res_tb_idx); /* big_tb cap small_tb */[m
[31m-                len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                len = lua_objlen(L, -1);[m
[31m-            }[m
[31m-[m
[31m-            lua_pushvalue(L, -2); /* big_tb cap small_tb cap */[m
[31m-            lua_rawseti(L, -2, (int) len + 1); /* big_tb cap small_tb */[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushstring(L, name); /* big_tb cap key */[m
[31m-            lua_pushvalue(L, -2); /* big_tb cap key cap */[m
[31m-            lua_rawset(L, res_tb_idx); /* big_tb cap */[m
[31m-            lua_pop(L, 1);[m
[31m-        }[m
[31m-[m
[31m-        dd("top 2: %d", lua_gettop(L));[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-ngx_http_lua_regex_t *[m
[31m-ngx_http_lua_ffi_compile_regex(const unsigned char *pat, size_t pat_len,[m
[31m-    int flags, int pcre_opts, u_char *errstr,[m
[31m-    size_t errstr_size)[m
[31m-{[m
[31m-    int                     *cap = NULL, ovecsize;[m
[31m-    u_char                  *p;[m
[31m-    ngx_int_t                rc;[m
[31m-    const char              *msg;[m
[31m-    ngx_pool_t              *pool, *old_pool;[m
[31m-    pcre_extra              *sd = NULL;[m
[31m-    ngx_http_lua_regex_t    *re;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t         *lmcf;[m
[31m-    ngx_http_lua_regex_compile_t      re_comp;[m
[31m-[m
[31m-    pool = ngx_create_pool(512, ngx_cycle->log);[m
[31m-    if (pool == NULL) {[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));[m
[31m-    if (re == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        pool = NULL;[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    re->pool = pool;[m
[31m-[m
[31m-    re_comp.options      = pcre_opts;[m
[31m-    re_comp.pattern.data = (u_char *) pat;[m
[31m-    re_comp.pattern.len  = pat_len;[m
[31m-    re_comp.err.len      = errstr_size - 1;[m
[31m-    re_comp.err.data     = errstr;[m
[31m-    re_comp.pool         = pool;[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-    rc = ngx_http_lua_regex_compile(&re_comp);[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        re_comp.err.data[re_comp.err.len] = '\0';[m
[31m-        msg = (char *) re_comp.err.data;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-#if (LUA_HAVE_PCRE_JIT)[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-        sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                           "pcre study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (sd != NULL) {[m
[31m-            int         jitted;[m
[31m-[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-            pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);[m
[31m-[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                           "pcre JIT compiling result: %d", jitted);[m
[31m-        }[m
[31m-#   endif /* !(NGX_DEBUG) */[m
[31m-[m
[31m-    } else {[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-        sd = pcre_study(re_comp.regex, 0, &msg);[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-    }[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    lmcf = ngx_http_cycle_get_module_main_conf(ngx_cycle,[m
[31m-                                               ngx_http_lua_module);[m
[31m-[m
[31m-    if (sd && lmcf && lmcf->regex_match_limit > 0) {[m
[31m-        sd->flags |= PCRE_EXTRA_MATCH_LIMIT;[m
[31m-        sd->match_limit = lmcf->regex_match_limit;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re_comp.captures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re_comp.captures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    dd("allocating cap with size: %d", (int) ovecsize);[m
[31m-[m
[31m-    cap = ngx_palloc(pool, ovecsize * sizeof(int));[m
[31m-    if (cap == NULL) {[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMECOUNT,[m
[31m-                      &re->name_count) != 0)[m
[31m-    {[m
[31m-        msg = "cannot acquire named subpattern count";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (re->name_count > 0) {[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMEENTRYSIZE,[m
[31m-                          &re->name_entry_size) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern entry size";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMETABLE,[m
[31m-                          &re->name_table) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern table";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    re->regex = re_comp.regex;[m
[31m-    re->regex_sd = sd;[m
[31m-    re->ncaptures = re_comp.captures;[m
[31m-    re->captures = cap;[m
[31m-    re->replace = NULL;[m
[31m-[m
[31m-    /* only for (stap) debugging, the pointer might be invalid when the[m
[31m-     * string is collected later on.... */[m
[31m-    re->pattern = pat;[m
[31m-[m
[31m-    return re;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    p = ngx_snprintf(errstr, errstr_size - 1, "%s", msg);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    if (sd) {[m
[31m-        ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-    }[m
[31m-[m
[31m-    if (pool) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_exec_regex(ngx_http_lua_regex_t *re, int flags,[m
[31m-    const u_char *s, size_t len, int pos)[m
[31m-{[m
[31m-    int             rc, ovecsize, exec_opts, *cap;[m
[31m-    ngx_str_t       subj;[m
[31m-    pcre_extra     *sd;[m
[31m-[m
[31m-    cap = re->captures;[m
[31m-    sd = re->regex_sd;[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re->ncaptures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re->ncaptures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_NO_UTF8_CHECK) {[m
[31m-        exec_opts = PCRE_NO_UTF8_CHECK;[m
[31m-[m
[31m-    } else {[m
[31m-        exec_opts = 0;[m
[31m-    }[m
[31m-[m
[31m-    subj.data = (u_char *) s;[m
[31m-    subj.len = len;[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_DFA[m
[31m-[m
[31m-        int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];[m
[31m-        rc = ngx_http_lua_regex_dfa_exec(re->regex, sd, &subj,[m
[31m-                                         (int) pos, cap, ovecsize, ws,[m
[31m-                                         sizeof(ws)/sizeof(ws[0]), exec_opts);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        return PCRE_ERROR_BADOPTION;[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-    } else {[m
[31m-        rc = ngx_http_lua_regex_exec(re->regex, sd, &subj, (int) pos, cap,[m
[31m-                                     ovecsize, exec_opts);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_destroy_regex(ngx_http_lua_regex_t *re)[m
[31m-{[m
[31m-    ngx_pool_t                  *old_pool;[m
[31m-[m
[31m-    dd("destroy regex called");[m
[31m-[m
[31m-    if (re == NULL || re->pool == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (re->regex_sd) {[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(re->pool);[m
[31m-#if LUA_HAVE_PCRE_JIT[m
[31m-        pcre_free_study(re->regex_sd);[m
[31m-#else[m
[31m-        pcre_free(re->regex_sd);[m
[31m-#endif[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-        re->regex_sd = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(re->pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_compile_replace_template(ngx_http_lua_regex_t *re,[m
[31m-    const u_char *replace_data, size_t replace_len)[m
[31m-{[m
[31m-    ngx_int_t                                rc;[m
[31m-    ngx_str_t                                tpl;[m
[31m-    ngx_http_lua_complex_value_t            *ctpl;[m
[31m-    ngx_http_lua_compile_complex_value_t     ccv;[m
[31m-[m
[31m-    ctpl = ngx_palloc(re->pool, sizeof(ngx_http_lua_complex_value_t));[m
[31m-    if (ctpl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (replace_len != 0) {[m
[31m-        /* copy the string buffer pointed to by tpl.data from Lua VM */[m
[31m-        tpl.data = ngx_palloc(re->pool, replace_len + 1);[m
[31m-        if (tpl.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(tpl.data, replace_data, replace_len);[m
[31m-        tpl.data[replace_len] = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        tpl.data = (u_char *) replace_data;[m
[31m-    }[m
[31m-[m
[31m-    tpl.len = replace_len;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_lua_compile_complex_value_t));[m
[31m-    ccv.pool = re->pool;[m
[31m-    ccv.log = ngx_cycle->log;[m
[31m-    ccv.value = &tpl;[m
[31m-    ccv.complex_value = ctpl;[m
[31m-[m
[31m-    rc = ngx_http_lua_compile_complex_value(&ccv);[m
[31m-[m
[31m-    re->replace = ctpl;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_lua_script_engine_t *[m
[31m-ngx_http_lua_ffi_create_script_engine(void)[m
[31m-{[m
[31m-    return ngx_calloc(sizeof(ngx_http_lua_script_engine_t), ngx_cycle->log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_init_script_engine(ngx_http_lua_script_engine_t *e,[m
[31m-    const unsigned char *subj, ngx_http_lua_regex_t *compiled, int count)[m
[31m-{[m
[31m-    e->log = ngx_cycle->log;[m
[31m-    e->ncaptures = count * 2;[m
[31m-    e->captures = compiled->captures;[m
[31m-    e->captures_data = (u_char *) subj;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_destroy_script_engine(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_free(e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_script_eval_len(ngx_http_lua_script_engine_t *e,[m
[31m-    ngx_http_lua_complex_value_t *val)[m
[31m-{[m
[31m-    size_t          len;[m
[31m-[m
[31m-    ngx_http_lua_script_len_code_pt   lcode;[m
[31m-[m
[31m-    e->ip = val->lengths;[m
[31m-    len = 0;[m
[31m-[m
[31m-    while (*(uintptr_t *) e->ip) {[m
[31m-        lcode = *(ngx_http_lua_script_len_code_pt *) e->ip;[m
[31m-        len += lcode(e);[m
[31m-    }[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_script_eval_data(ngx_http_lua_script_engine_t *e,[m
[31m-    ngx_http_lua_complex_value_t *val, u_char *dst)[m
[31m-{[m
[31m-    ngx_http_lua_script_code_pt       code;[m
[31m-[m
[31m-    e->ip = val->values;[m
[31m-    e->pos = dst;[m
[31m-[m
[31m-    while (*(uintptr_t *) e->ip) {[m
[31m-        code = *(ngx_http_lua_script_code_pt *) e->ip;[m
[31m-        code(e);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uint32_t[m
[31m-ngx_http_lua_ffi_max_regex_cache_size(void)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    lmcf = ngx_http_cycle_get_module_main_conf(ngx_cycle,[m
[31m-                                               ngx_http_lua_module);[m
[31m-    if (lmcf == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-    return (uint32_t) lmcf->regex_cache_max_entries;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_PCRE */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_regex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_regex.h[m
[1mdeleted file mode 100644[m
[1mindex f5f8e2f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_regex.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_REGEX_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_REGEX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-#include "ngx_http_lua_script.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-void ngx_http_lua_inject_regex_api(lua_State *L);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_REGEX_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_body.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_body.c[m
[1mdeleted file mode 100644[m
[1mindex 6f2ae38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_body.c[m
[1m+++ /dev/null[m
[36m@@ -1,1186 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_lua_req_body.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_headers_in.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_read_body(lua_State *L);[m
[31m-static void ngx_http_lua_req_body_post_read(ngx_http_request_t *r);[m
[31m-static int ngx_http_lua_ngx_req_discard_body(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_body_data(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_body_file(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_set_body_data(lua_State *L);[m
[31m-static void ngx_http_lua_pool_cleanup_file(ngx_pool_t *p, ngx_fd_t fd);[m
[31m-static int ngx_http_lua_ngx_req_set_body_file(lua_State *L);[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_init_body(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_append_body(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_body_finish(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_write_request_body(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *body);[m
[31m-static ngx_int_t ngx_http_lua_read_body_resume(ngx_http_request_t *r);[m
[31m-static void ngx_http_lua_req_body_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_body_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_read_body);[m
[31m-    lua_setfield(L, -2, "read_body");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_discard_body);[m
[31m-    lua_setfield(L, -2, "discard_body");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_body_data);[m
[31m-    lua_setfield(L, -2, "get_body_data");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_body_file);[m
[31m-    lua_setfield(L, -2, "get_body_file");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_body_data);[m
[31m-    lua_setfield(L, -2, "set_body_data");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_body_file);[m
[31m-    lua_setfield(L, -2, "set_body_file");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_init_body);[m
[31m-    lua_setfield(L, -2, "init_body");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_append_body);[m
[31m-    lua_setfield(L, -2, "append_body");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_body_finish);[m
[31m-    lua_setfield(L, -2, "finish_body");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_read_body(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    r->request_body_in_single_buf = 1;[m
[31m-    r->request_body_in_persistent_file = 1;[m
[31m-    r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->request_body_in_file_only) {[m
[31m-        r->request_body_file_log_level = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua start to read buffered request body");[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_lua_req_body_post_read);[m
[31m-[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-    r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ctx->exit_code = rc;[m
[31m-        ctx->exited = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http read client request body returned error code %i, "[m
[31m-                       "exitting now", rc);[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-#if (nginx_version >= 1002006 && nginx_version < 1003000) ||                 \[m
[31m-        nginx_version >= 1003009[m
[31m-    r->main->count--;[m
[31m-    dd("decrement r->main->count: %d", (int) r->main->count);[m
[31m-#endif[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua read buffered request body requires I/O "[m
[31m-                       "interruptions");[m
[31m-[m
[31m-        ctx->waiting_more_body = 1;[m
[31m-        ctx->downstream = coctx;[m
[31m-[m
[31m-        ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-        coctx->cleanup = ngx_http_lua_req_body_cleanup;[m
[31m-        coctx->data = r;[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua has read buffered request body in a single run");[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_req_body_post_read(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_lua_co_ctx_t   *coctx;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua req body post read, c:%ud", r->main->count);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        ctx->waiting_more_body = 0;[m
[31m-[m
[31m-        coctx = ctx->downstream;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        coctx->cleanup = NULL;[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->check_client_abort) {[m
[31m-            r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-        } else {[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            (void) ngx_http_lua_read_body_resume(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->resume_handler = ngx_http_lua_read_body_resume;[m
[31m-            ngx_http_core_run_phases(r);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_discard_body(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return luaL_error(L, "failed to discard request body");[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_body_data(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    size_t                       len;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *buf;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->temp_file[m
[31m-        || r->request_body->bufs == NULL)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    cl = r->request_body->bufs;[m
[31m-[m
[31m-    if (cl->next == NULL) {[m
[31m-        len = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-        if (len == 0) {[m
[31m-            lua_pushnil(L);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) cl->buf->pos, len);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* found multi-buffer body */[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (; cl; cl = cl->next) {[m
[31m-        dd("body chunk len: %d", (int) ngx_buf_size(cl->buf));[m
[31m-        len += cl->buf->last - cl->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    buf = (u_char *) lua_newuserdata(L, len);[m
[31m-[m
[31m-    p = buf;[m
[31m-    for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-        p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_body_file(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->request_body == NULL || r->request_body->temp_file == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX file directio: %u, f:%u, m:%u, t:%u, end - pos %d, size %d",[m
[31m-       r->request_body->temp_file->file.directio,[m
[31m-       r->request_body->bufs->buf->in_file,[m
[31m-       r->request_body->bufs->buf->memory,[m
[31m-       r->request_body->bufs->buf->temporary,[m
[31m-       (int) (r->request_body->bufs->buf->end -[m
[31m-              r->request_body->bufs->buf->pos),[m
[31m-       (int) ngx_buf_size(r->request_body->bufs->buf));[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) r->request_body->temp_file->file.name.data,[m
[31m-                    r->request_body->temp_file->file.name.len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_body_data(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    ngx_temp_file_t             *tf;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_str_t                    body, key, value;[m
[31m-#if 1[m
[31m-    ngx_int_t                    rc;[m
[31m-#endif[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_buf_tag_t                tag;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "expecting 1 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    body.data = (u_char *) luaL_checklstring(L, 1, &body.len);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        return luaL_error(L, "request body already discarded asynchronously");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body == NULL) {[m
[31m-        return luaL_error(L, "request body not read yet");[m
[31m-    }[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    tag = (ngx_buf_tag_t) &ngx_http_lua_module;[m
[31m-[m
[31m-    tf = rb->temp_file;[m
[31m-[m
[31m-    if (tf) {[m
[31m-        if (tf->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-            dd("cleaning temp file %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-[m
[31m-            ngx_http_lua_pool_cleanup_file(r->pool, tf->file.fd);[m
[31m-            tf->file.fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-            dd("temp file cleaned: %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (body.len == 0) {[m
[31m-[m
[31m-        if (rb->bufs) {[m
[31m-[m
[31m-            for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-                if (cl->buf->tag == tag && cl->buf->temporary) {[m
[31m-[m
[31m-                    dd("free old request body buffer: size:%d",[m
[31m-                       (int) ngx_buf_size(cl->buf));[m
[31m-[m
[31m-                    ngx_pfree(r->pool, cl->buf->start);[m
[31m-                    cl->buf->tag = (ngx_buf_tag_t) NULL;[m
[31m-                    cl->buf->temporary = 0;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs = NULL;[m
[31m-        rb->buf = NULL;[m
[31m-[m
[31m-        dd("request body is set to empty string");[m
[31m-        goto set_header;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->bufs) {[m
[31m-[m
[31m-        for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-            if (cl->buf->tag == tag && cl->buf->temporary) {[m
[31m-                dd("free old request body buffer: size:%d",[m
[31m-                   (int) ngx_buf_size(cl->buf));[m
[31m-[m
[31m-                ngx_pfree(r->pool, cl->buf->start);[m
[31m-                cl->buf->tag = (ngx_buf_tag_t) NULL;[m
[31m-                cl->buf->temporary = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs->next = NULL;[m
[31m-[m
[31m-        b = rb->bufs->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->tag = tag;[m
[31m-[m
[31m-        b->start = ngx_palloc(r->pool, body.len);[m
[31m-        if (b->start == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-        b->end = b->start + body.len;[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = ngx_copy(b->pos, body.data, body.len);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-        rb->bufs->next = NULL;[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->pool, body.len);[m
[31m-        if (b == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        b->tag = tag;[m
[31m-        b->last = ngx_copy(b->pos, body.data, body.len);[m
[31m-[m
[31m-        rb->bufs->buf = b;[m
[31m-        rb->buf = b;[m
[31m-    }[m
[31m-[m
[31m-set_header:[m
[31m-[m
[31m-    /* override input header Content-Length (value must be null terminated) */[m
[31m-[m
[31m-    value.data = ngx_palloc(r->pool, NGX_SIZE_T_LEN + 1);[m
[31m-    if (value.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    value.len = ngx_sprintf(value.data, "%uz", body.len) - value.data;[m
[31m-    value.data[value.len] = '\0';[m
[31m-[m
[31m-    dd("setting request Content-Length to %.*s (%d)",[m
[31m-       (int) value.len, value.data, (int) body.len);[m
[31m-[m
[31m-    r->headers_in.content_length_n = body.len;[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length->value.data = value.data;[m
[31m-        r->headers_in.content_length->value.len = value.len;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_str_set(&key, "Content-Length");[m
[31m-[m
[31m-        rc = ngx_http_lua_set_input_header(r, key, value, 1 /* override */);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L, "failed to reset the Content-Length "[m
[31m-                              "input header");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_init_body(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    size_t                       size;[m
[31m-    lua_Integer                  num;[m
[31m-#if 1[m
[31m-    ngx_temp_file_t             *tf;[m
[31m-#endif[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 or 1 argument but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        return luaL_error(L, "request body already discarded asynchronously");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body == NULL) {[m
[31m-        return luaL_error(L, "request body not read yet");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        num = luaL_checkinteger(L, 1);[m
[31m-        if (num < 0) {[m
[31m-            return luaL_error(L, "bad size argument: %d", (int) num);[m
[31m-        }[m
[31m-[m
[31m-        size = (size_t) num;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-        size = clcf->client_body_buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        r->request_body_in_file_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-#if 1[m
[31m-    tf = rb->temp_file;[m
[31m-[m
[31m-    if (tf) {[m
[31m-        if (tf->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-            dd("cleaning temp file %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-[m
[31m-            ngx_http_lua_pool_cleanup_file(r->pool, tf->file.fd);[m
[31m-[m
[31m-            ngx_memzero(tf, sizeof(ngx_temp_file_t));[m
[31m-[m
[31m-            tf->file.fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-            dd("temp file cleaned: %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-    r->headers_in.content_length_n = 0;[m
[31m-[m
[31m-    rb->buf = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (rb->buf == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-    if (rb->bufs == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    rb->bufs->buf = rb->buf;[m
[31m-    rb->bufs->next = NULL;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_append_body(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    ngx_str_t                    body;[m
[31m-    size_t                       size, rest;[m
[31m-    size_t                       offset = 0;[m
[31m-    ngx_chain_t                  chain;[m
[31m-    ngx_buf_t                    buf;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "expecting 1 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    body.data = (u_char *) luaL_checklstring(L, 1, &body.len);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->buf == NULL[m
[31m-        || r->request_body->bufs == NULL)[m
[31m-    {[m
[31m-        return luaL_error(L, "request_body not initialized");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body_in_file_only) {[m
[31m-        buf.start = body.data;[m
[31m-        buf.pos = buf.start;[m
[31m-        buf.last = buf.start + body.len;[m
[31m-        buf.end = buf.last;[m
[31m-        buf.temporary = 1;[m
[31m-[m
[31m-        chain.buf = &buf;[m
[31m-        chain.next = NULL;[m
[31m-[m
[31m-        if (ngx_http_lua_write_request_body(r, &chain) != NGX_OK) {[m
[31m-            return luaL_error(L, "fail to write file");[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.content_length_n += body.len;[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    rest = body.len;[m
[31m-[m
[31m-    while (rest > 0) {[m
[31m-        if (rb->buf->last == rb->buf->end) {[m
[31m-            if (ngx_http_lua_write_request_body(r, rb->bufs) != NGX_OK) {[m
[31m-                return luaL_error(L, "fail to write file");[m
[31m-            }[m
[31m-[m
[31m-            rb->buf->last = rb->buf->start;[m
[31m-        }[m
[31m-[m
[31m-        size = rb->buf->end - rb->buf->last;[m
[31m-[m
[31m-        if (size > rest) {[m
[31m-            size = rest;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(rb->buf->last, body.data + offset, size);[m
[31m-[m
[31m-        rb->buf->last += size;[m
[31m-        rest -= size;[m
[31m-        offset += size;[m
[31m-        r->headers_in.content_length_n += size;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_body_finish(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    size_t                       size;[m
[31m-    ngx_str_t                    value;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 argument but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->buf == NULL[m
[31m-        || r->request_body->bufs == NULL)[m
[31m-    {[m
[31m-        return luaL_error(L, "request_body not initialized");[m
[31m-    }[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->temp_file) {[m
[31m-[m
[31m-        /* save the last part */[m
[31m-[m
[31m-        if (ngx_http_lua_write_request_body(r, rb->bufs) != NGX_OK) {[m
[31m-            return luaL_error(L, "fail to write file");[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        b->in_file = 1;[m
[31m-        b->file_pos = 0;[m
[31m-        b->file_last = rb->temp_file->file.offset;[m
[31m-        b->file = &rb->temp_file->file;[m
[31m-[m
[31m-        if (rb->bufs->next) {[m
[31m-            rb->bufs->next->buf = b;[m
[31m-[m
[31m-        } else {[m
[31m-            rb->bufs->buf = b;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* override input header Content-Length (value must be null terminated) */[m
[31m-[m
[31m-    value.data = ngx_palloc(r->pool, NGX_SIZE_T_LEN + 1);[m
[31m-    if (value.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    size = (size_t) r->headers_in.content_length_n;[m
[31m-[m
[31m-    value.len = ngx_sprintf(value.data, "%uz", size) - value.data;[m
[31m-    value.data[value.len] = '\0';[m
[31m-[m
[31m-    dd("setting request Content-Length to %.*s (%d)", (int) value.len,[m
[31m-       value.data, (int) size);[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length->value.data = value.data;[m
[31m-        r->headers_in.content_length->value.len = value.len;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_str_set(&key, "Content-Length");[m
[31m-[m
[31m-        rc = ngx_http_lua_set_input_header(r, key, value, 1 /* override */);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L, "failed to reset the Content-Length "[m
[31m-                              "input header");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_pool_cleanup_file(ngx_pool_t *p, ngx_fd_t fd)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t       *c;[m
[31m-    ngx_pool_cleanup_file_t  *cf;[m
[31m-[m
[31m-    for (c = p->cleanup; c; c = c->next) {[m
[31m-        if (c->handler == ngx_pool_cleanup_file[m
[31m-            || c->handler == ngx_pool_delete_file)[m
[31m-        {[m
[31m-            cf = c->data;[m
[31m-[m
[31m-            if (cf->fd == fd) {[m
[31m-                c->handler(cf);[m
[31m-                c->handler = NULL;[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_body_file(lua_State *L)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    ngx_temp_file_t             *tf;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          clean;[m
[31m-    ngx_open_file_info_t         of;[m
[31m-    ngx_str_t                    key, value;[m
[31m-    ngx_pool_cleanup_t          *cln;[m
[31m-    ngx_pool_cleanup_file_t     *clnf;[m
[31m-    ngx_err_t                    err;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_buf_tag_t                tag;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &name.len);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        return luaL_error(L, "request body already discarded asynchronously");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body == NULL) {[m
[31m-        return luaL_error(L, "request body not read yet");[m
[31m-    }[m
[31m-[m
[31m-    name.data = ngx_palloc(r->pool, name.len + 1);[m
[31m-    if (name.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name.data, p, name.len);[m
[31m-    name.data[name.len] = '\0';[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        luaL_checktype(L, 2, LUA_TBOOLEAN);[m
[31m-        clean = lua_toboolean(L, 2);[m
[31m-[m
[31m-    } else {[m
[31m-        clean = 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("clean: %d", (int) clean);[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    /* clean up existing r->request_body->bufs (if any) */[m
[31m-[m
[31m-    tag = (ngx_buf_tag_t) &ngx_http_lua_module;[m
[31m-[m
[31m-    if (rb->bufs) {[m
[31m-        dd("XXX reusing buf");[m
[31m-[m
[31m-        for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-            if (cl->buf->tag == tag && cl->buf->temporary) {[m
[31m-                dd("free old request body buffer: size:%d",[m
[31m-                   (int) ngx_buf_size(cl->buf));[m
[31m-[m
[31m-                ngx_pfree(r->pool, cl->buf->start);[m
[31m-                cl->buf->tag = (ngx_buf_tag_t) NULL;[m
[31m-                cl->buf->temporary = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs->next = NULL;[m
[31m-        b = rb->bufs->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->tag = tag;[m
[31m-        rb->buf = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        dd("XXX creating new buf");[m
[31m-[m
[31m-        rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-        rb->bufs->next = NULL;[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        b->tag = tag;[m
[31m-[m
[31m-        rb->bufs->buf = b;[m
[31m-        rb->buf = NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    /* just make r->request_body->temp_file a bare stub */[m
[31m-[m
[31m-    tf = rb->temp_file;[m
[31m-[m
[31m-    if (tf) {[m
[31m-        if (tf->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-            dd("cleaning temp file %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-[m
[31m-            ngx_http_lua_pool_cleanup_file(r->pool, tf->file.fd);[m
[31m-[m
[31m-            ngx_memzero(tf, sizeof(ngx_temp_file_t));[m
[31m-[m
[31m-            tf->file.fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-            dd("temp file cleaned: %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        rb->temp_file = tf;[m
[31m-    }[m
[31m-[m
[31m-    /* read the file info and construct an in-file buf */[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-[m
[31m-    if (ngx_http_lua_open_and_stat_file(name.data, &of, r->connection->log)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return luaL_error(L, "%s \"%s\" failed", of.failed, name.data);[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX new body file fd: %d", of.fd);[m
[31m-[m
[31m-    tf->file.fd = of.fd;[m
[31m-    tf->file.name = name;[m
[31m-    tf->file.log = r->connection->log;[m
[31m-    tf->file.directio = 0;[m
[31m-[m
[31m-    if (of.size == 0) {[m
[31m-        if (clean) {[m
[31m-            if (ngx_delete_file(name.data) == NGX_FILE_ERROR) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                if (err != NGX_ENOENT) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                                  ngx_delete_file_n " \"%s\" failed",[m
[31m-                                  name.data);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", name.data);[m
[31m-        }[m
[31m-[m
[31m-        r->request_body->bufs = NULL;[m
[31m-        r->request_body->buf = NULL;[m
[31m-[m
[31m-        goto set_header;[m
[31m-    }[m
[31m-[m
[31m-    /* register file cleanup hook */[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool,[m
[31m-                               sizeof(ngx_pool_cleanup_file_t));[m
[31m-[m
[31m-    if (cln == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = clean ? ngx_pool_delete_file : ngx_pool_cleanup_file;[m
[31m-    clnf = cln->data;[m
[31m-[m
[31m-    clnf->fd = of.fd;[m
[31m-    clnf->name = name.data;[m
[31m-    clnf->log = r->pool->log;[m
[31m-[m
[31m-    b->file = &tf->file;[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX file size: %d", (int) of.size);[m
[31m-[m
[31m-    b->file_pos = 0;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = 1;[m
[31m-[m
[31m-    dd("buf file: %p, f:%u", b->file, b->in_file);[m
[31m-[m
[31m-set_header:[m
[31m-[m
[31m-    /* override input header Content-Length (value must be null terminated) */[m
[31m-[m
[31m-    value.data = ngx_palloc(r->pool, NGX_OFF_T_LEN + 1);[m
[31m-    if (value.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    value.len = ngx_sprintf(value.data, "%O", of.size) - value.data;[m
[31m-    value.data[value.len] = '\0';[m
[31m-[m
[31m-    r->headers_in.content_length_n = of.size;[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length->value.data = value.data;[m
[31m-        r->headers_in.content_length->value.len = value.len;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_str_set(&key, "Content-Length");[m
[31m-[m
[31m-        rc = ngx_http_lua_set_input_header(r, key, value, 1 /* override */);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L, "failed to reset the Content-Length "[m
[31m-                              "input header");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_write_request_body(ngx_http_request_t *r, ngx_chain_t *body)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_temp_file_t           *tf;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->temp_file == NULL) {[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = clcf->client_body_temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->warn = "a client request body is buffered to a temporary file";[m
[31m-        tf->log_level = r->request_body_file_log_level;[m
[31m-        tf->persistent = 1;[m
[31m-        tf->clean = 1;[m
[31m-[m
[31m-        if (r->request_body_file_group_access) {[m
[31m-            tf->access = 0660;[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = tf;[m
[31m-[m
[31m-        if (body == NULL) {[m
[31m-            /* empty body with r->request_body_in_file_only */[m
[31m-[m
[31m-            if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                     tf->persistent, tf->clean, tf->access)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_chain_to_temp_file(rb->temp_file, body);[m
[31m-[m
[31m-    /* TODO: n == 0 or not complete and level event */[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rb->temp_file->offset += n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_read_body_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_req_body_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx = data;[m
[31m-[m
[31m-    r = coctx->data;[m
[31m-    if (r == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->read->timer_set) {[m
[31m-        ngx_del_timer(r->connection->read);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->waiting_more_body = 0;[m
[31m-    r->keepalive = 0;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_body.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_body.h[m
[1mdeleted file mode 100644[m
[1mindex 38b0e72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_body.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_REQ_BODY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_REQ_BODY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_req_body_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_REQ_BODY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_method.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_method.c[m
[1mdeleted file mode 100644[m
[1mindex 0a2a154..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_method.c[m
[1m+++ /dev/null[m
[36m@@ -1,252 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-#include "ngx_http_lua_req_method.h"[m
[31m-#include "ngx_http_lua_subrequest.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_get_method(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_set_method(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_method_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_method);[m
[31m-    lua_setfield(L, -2, "get_method");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_method);[m
[31m-    lua_setfield(L, -2, "set_method");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_method(lua_State *L)[m
[31m-{[m
[31m-    int                      n;[m
[31m-    ngx_http_request_t      *r;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "only one argument expected but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) r->method_name.data, r->method_name.len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_method(lua_State *L)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    int                  method;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "only one argument expected but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    method = luaL_checkint(L, 1);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    switch (method) {[m
[31m-        case NGX_HTTP_GET:[m
[31m-            r->method_name = ngx_http_lua_get_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST:[m
[31m-            r->method_name = ngx_http_lua_post_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PUT:[m
[31m-            r->method_name = ngx_http_lua_put_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_HEAD:[m
[31m-            r->method_name = ngx_http_lua_head_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_DELETE:[m
[31m-            r->method_name = ngx_http_lua_delete_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_OPTIONS:[m
[31m-            r->method_name = ngx_http_lua_options_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MKCOL:[m
[31m-            r->method_name = ngx_http_lua_mkcol_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_COPY:[m
[31m-            r->method_name = ngx_http_lua_copy_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MOVE:[m
[31m-            r->method_name = ngx_http_lua_move_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPFIND:[m
[31m-            r->method_name = ngx_http_lua_propfind_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPPATCH:[m
[31m-            r->method_name = ngx_http_lua_proppatch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_LOCK:[m
[31m-            r->method_name = ngx_http_lua_lock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UNLOCK:[m
[31m-            r->method_name = ngx_http_lua_unlock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PATCH:[m
[31m-            r->method_name = ngx_http_lua_patch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_TRACE:[m
[31m-            r->method_name = ngx_http_lua_trace_method;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return luaL_error(L, "unsupported HTTP method: %d", method);[m
[31m-    }[m
[31m-[m
[31m-    r->method = method;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_method(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    return r->method;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_method_name(ngx_http_request_t *r, char *buf,[m
[31m-    size_t *len)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    *len = ngx_min(r->method_name.len, *len);[m
[31m-    ngx_memcpy(buf, r->method_name.data, *len);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_set_method(ngx_http_request_t *r, int method)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    switch (method) {[m
[31m-        case NGX_HTTP_GET:[m
[31m-            r->method_name = ngx_http_lua_get_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST:[m
[31m-            r->method_name = ngx_http_lua_post_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PUT:[m
[31m-            r->method_name = ngx_http_lua_put_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_HEAD:[m
[31m-            r->method_name = ngx_http_lua_head_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_DELETE:[m
[31m-            r->method_name = ngx_http_lua_delete_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_OPTIONS:[m
[31m-            r->method_name = ngx_http_lua_options_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MKCOL:[m
[31m-            r->method_name = ngx_http_lua_mkcol_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_COPY:[m
[31m-            r->method_name = ngx_http_lua_copy_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MOVE:[m
[31m-            r->method_name = ngx_http_lua_move_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPFIND:[m
[31m-            r->method_name = ngx_http_lua_propfind_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPPATCH:[m
[31m-            r->method_name = ngx_http_lua_proppatch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_LOCK:[m
[31m-            r->method_name = ngx_http_lua_lock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UNLOCK:[m
[31m-            r->method_name = ngx_http_lua_unlock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PATCH:[m
[31m-            r->method_name = ngx_http_lua_patch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_TRACE:[m
[31m-            r->method_name = ngx_http_lua_trace_method;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->method = method;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_method.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_method.h[m
[1mdeleted file mode 100644[m
[1mindex f8aa1af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_req_method.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_METHOD_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_METHOD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_req_method_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_METHOD_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.c[m
[1mdeleted file mode 100644[m
[1mindex 2ef59c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.c[m
[1m+++ /dev/null[m
[36m@@ -1,362 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_rewriteby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_rewrite_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_rewrite_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    /* XXX we need to take into account ngx_rewrite's location dump */[m
[31m-    if (r->uri_changed) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua rewrite handler, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (!lmcf->postponed_to_rewrite_phase_end) {[m
[31m-        ngx_http_core_main_conf_t       *cmcf;[m
[31m-        ngx_http_phase_handler_t        tmp;[m
[31m-        ngx_http_phase_handler_t        *ph;[m
[31m-        ngx_http_phase_handler_t        *cur_ph;[m
[31m-        ngx_http_phase_handler_t        *last_ph;[m
[31m-[m
[31m-        lmcf->postponed_to_rewrite_phase_end = 1;[m
[31m-[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ph = cmcf->phase_engine.handlers;[m
[31m-        cur_ph = &ph[r->phase_handler];[m
[31m-        last_ph = &ph[cur_ph->next - 1];[m
[31m-[m
[31m-#if 0[m
[31m-        if (cur_ph == last_ph) {[m
[31m-            dd("XXX our handler is already the last rewrite phase handler");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (cur_ph < last_ph) {[m
[31m-            dd("swaping the contents of cur_ph and last_ph...");[m
[31m-[m
[31m-            tmp      = *cur_ph;[m
[31m-[m
[31m-            memmove(cur_ph, cur_ph + 1,[m
[31m-                    (last_ph - cur_ph) * sizeof (ngx_http_phase_handler_t));[m
[31m-[m
[31m-            *last_ph = tmp;[m
[31m-[m
[31m-            r->phase_handler--; /* redo the current ph */[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->rewrite_handler == NULL) {[m
[31m-        dd("no rewrite handler found");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("entered? %d", (int) ctx->entered_rewrite_phase);[m
[31m-[m
[31m-    if (ctx->entered_rewrite_phase) {[m
[31m-        dd("rewriteby: calling wev handler");[m
[31m-        rc = ctx->resume_handler(r);[m
[31m-        dd("rewriteby: wev handler returns %d", (int) rc);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            if (r->header_sent) {[m
[31m-                dd("header already sent");[m
[31m-[m
[31m-                /* response header was already generated in access_by_lua*,[m
[31m-                 * so it is no longer safe to proceed to later phases[m
[31m-                 * which may generate responses again */[m
[31m-[m
[31m-                if (!ctx->eof) {[m
[31m-                    dd("eof not yet sent");[m
[31m-[m
[31m-                    rc = ngx_http_lua_send_chain_link(r, ctx, NULL[m
[31m-                                                     /* indicate last_buf */);[m
[31m-                    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                return NGX_HTTP_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->force_read_body && !ctx->read_body_done) {[m
[31m-        r->request_body_in_single_buf = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r,[m
[31m-                                       ngx_http_lua_generic_phase_post_read);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            ctx->waiting_more_body = 1;[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("calling rewrite handler");[m
[31m-    return llcf->rewrite_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_rewrite_handler_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    dd("rewrite by lua inline");[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->rewrite_src.value.data,[m
[31m-                                       llcf->rewrite_src.value.len,[m
[31m-                                       llcf->rewrite_src_key,[m
[31m-                                       (const char *)[m
[31m-                                       llcf->rewrite_chunkname);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_rewrite_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_rewrite_handler_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &llcf->rewrite_src, &eval_src) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->rewrite_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc < NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_rewrite_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_rewrite_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                      co_ref;[m
[31m-    lua_State               *co;[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_event_t             *rev;[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_cleanup_t      *cln;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    /*  {{{ new coroutine to handle request */[m
[31m-    co = ngx_http_lua_new_thread(r, L, &co_ref);[m
[31m-[m
[31m-    if (co == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua: failed to create new coroutine to handle request");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  move code closure to new coroutine */[m
[31m-    lua_xmove(L, co, 1);[m
[31m-[m
[31m-    /*  set closure's env table to new coroutine's globals table */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /*  save nginx request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(co, r);[m
[31m-[m
[31m-    /*  {{{ initialize request context */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-[m
[31m-    ctx->entered_rewrite_phase = 1;[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-    ctx->cur_co_ctx->co = co;[m
[31m-    ctx->cur_co_ctx->co_ref = co_ref;[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    /*  {{{ register request cleanup hooks */[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_REWRITE;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->check_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if (!rev->active) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        rc = ngx_http_lua_run_posted_threads(c, L, r, ctx);[m
[31m-[m
[31m-    } else if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        rc = ngx_http_lua_run_posted_threads(c, L, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DECLINED) {[m
[31m-        if (r->header_sent) {[m
[31m-            dd("header already sent");[m
[31m-[m
[31m-            /* response header was already generated in access_by_lua*,[m
[31m-             * so it is no longer safe to proceed to later phases[m
[31m-             * which may generate responses again */[m
[31m-[m
[31m-            if (!ctx->eof) {[m
[31m-                dd("eof not yet sent");[m
[31m-[m
[31m-                rc = ngx_http_lua_send_chain_link(r, ctx, NULL[m
[31m-                                                  /* indicate last_buf */);[m
[31m-                if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.h[m
[1mdeleted file mode 100644[m
[1mindex 172c295..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_REWRITEBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_REWRITEBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_rewrite_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_rewrite_handler_inline(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_rewrite_handler_file(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_REWRITEBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_script.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_script.c[m
[1mdeleted file mode 100644[m
[1mindex 95ebadf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_script.c[m
[1m+++ /dev/null[m
[36m@@ -1,538 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_script.h"[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_lua_script_add_code(ngx_array_t *codes, size_t size);[m
[31m-static size_t ngx_http_lua_script_copy_len_code([m
[31m-    ngx_http_lua_script_engine_t *e);[m
[31m-static void ngx_http_lua_script_copy_code(ngx_http_lua_script_engine_t *e);[m
[31m-static ngx_int_t ngx_http_lua_script_add_copy_code([m
[31m-    ngx_http_lua_script_compile_t *sc, ngx_str_t *value, ngx_uint_t last);[m
[31m-static ngx_int_t ngx_http_lua_script_compile(ngx_http_lua_script_compile_t *sc);[m
[31m-static ngx_int_t ngx_http_lua_script_add_capture_code([m
[31m-    ngx_http_lua_script_compile_t *sc, ngx_uint_t n);[m
[31m-static size_t ngx_http_lua_script_copy_capture_len_code([m
[31m-    ngx_http_lua_script_engine_t *e);[m
[31m-static void ngx_http_lua_script_copy_capture_code([m
[31m-    ngx_http_lua_script_engine_t *e);[m
[31m-static ngx_int_t ngx_http_lua_script_done(ngx_http_lua_script_compile_t *sc);[m
[31m-static ngx_int_t ngx_http_lua_script_init_arrays([m
[31m-    ngx_http_lua_script_compile_t *sc);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_compile_complex_value(ngx_http_lua_compile_complex_value_t *ccv)[m
[31m-{[m
[31m-    ngx_str_t                  *v;[m
[31m-    ngx_uint_t                  i, n, nv;[m
[31m-    ngx_array_t                 lengths, values, *pl, *pv;[m
[31m-[m
[31m-    ngx_http_lua_script_compile_t   sc;[m
[31m-[m
[31m-    v = ccv->value;[m
[31m-[m
[31m-    nv = 0;[m
[31m-[m
[31m-    for (i = 0; i < v->len; i++) {[m
[31m-        if (v->data[i] == '$') {[m
[31m-            nv++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ccv->complex_value->value = *v;[m
[31m-    ccv->complex_value->lengths = NULL;[m
[31m-    ccv->complex_value->values = NULL;[m
[31m-[m
[31m-    if (nv == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = nv * (2 * sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-              + sizeof(ngx_http_lua_script_capture_code_t))[m
[31m-        + sizeof(uintptr_t);[m
[31m-[m
[31m-    if (ngx_array_init(&lengths, ccv->pool, n, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = (nv * (2 * sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-                   + sizeof(ngx_http_lua_script_capture_code_t))[m
[31m-                + sizeof(uintptr_t)[m
[31m-                + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-    if (ngx_array_init(&values, ccv->pool, n, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pl = &lengths;[m
[31m-    pv = &values;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_lua_script_compile_t));[m
[31m-[m
[31m-    sc.pool = ccv->pool;[m
[31m-    sc.log = ccv->log;[m
[31m-    sc.source = v;[m
[31m-    sc.lengths = &pl;[m
[31m-    sc.values = &pv;[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_lua_script_compile(&sc) != NGX_OK) {[m
[31m-        ngx_array_destroy(&lengths);[m
[31m-        ngx_array_destroy(&values);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccv->complex_value->lengths = lengths.elts;[m
[31m-    ccv->complex_value->values = values.elts;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_complex_value(ngx_http_request_t *r, ngx_str_t *subj,[m
[31m-    size_t offset, ngx_int_t count, int *cap,[m
[31m-    ngx_http_lua_complex_value_t *val, luaL_Buffer *luabuf)[m
[31m-{[m
[31m-    size_t                            len;[m
[31m-    u_char                           *p;[m
[31m-    ngx_http_lua_script_code_pt       code;[m
[31m-    ngx_http_lua_script_len_code_pt   lcode;[m
[31m-    ngx_http_lua_script_engine_t      e;[m
[31m-[m
[31m-    if (val->lengths == NULL) {[m
[31m-        luaL_addlstring(luabuf, (char *) &subj->data[offset], cap[0] - offset);[m
[31m-        luaL_addlstring(luabuf, (char *) val->value.data, val->value.len);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_lua_script_engine_t));[m
[31m-[m
[31m-    e.log = r->connection->log;[m
[31m-    e.ncaptures = count * 2;[m
[31m-    e.captures = cap;[m
[31m-    e.captures_data = subj->data;[m
[31m-[m
[31m-    e.ip = val->lengths;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        lcode = *(ngx_http_lua_script_len_code_pt *) e.ip;[m
[31m-        len += lcode(&e);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    e.ip = val->values;[m
[31m-    e.pos = p;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        code = *(ngx_http_lua_script_code_pt *) e.ip;[m
[31m-        code((ngx_http_lua_script_engine_t *) &e);[m
[31m-    }[m
[31m-[m
[31m-    luaL_addlstring(luabuf, (char *) &subj->data[offset], cap[0] - offset);[m
[31m-    luaL_addlstring(luabuf, (char *) p, len);[m
[31m-[m
[31m-    ngx_pfree(r->pool, p);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_compile(ngx_http_lua_script_compile_t *sc)[m
[31m-{[m
[31m-    u_char       ch;[m
[31m-    ngx_str_t    name;[m
[31m-    ngx_uint_t   i, bracket;[m
[31m-    unsigned     num_var;[m
[31m-    ngx_uint_t   n = 0;[m
[31m-[m
[31m-    if (ngx_http_lua_script_init_arrays(sc) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < sc->source->len; /* void */ ) {[m
[31m-[m
[31m-        name.len = 0;[m
[31m-[m
[31m-        if (sc->source->data[i] == '$') {[m
[31m-[m
[31m-            if (++i == sc->source->len) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            if (sc->source->data[i] == '$') {[m
[31m-                name.data = &sc->source->data[i];[m
[31m-                i++;[m
[31m-                name.len++;[m
[31m-[m
[31m-                if (ngx_http_lua_script_add_copy_code(sc, &name,[m
[31m-                                                      (i == sc->source->len))[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (sc->source->data[i] >= '0' && sc->source->data[i] <= '9') {[m
[31m-                num_var = 1;[m
[31m-                n = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                num_var = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (sc->source->data[i] == '{') {[m
[31m-                bracket = 1;[m
[31m-[m
[31m-                if (++i == sc->source->len) {[m
[31m-                    goto invalid_variable;[m
[31m-                }[m
[31m-[m
[31m-                if (sc->source->data[i] >= '0' && sc->source->data[i] <= '9') {[m
[31m-                    num_var = 1;[m
[31m-                    n = 0;[m
[31m-                }[m
[31m-[m
[31m-                name.data = &sc->source->data[i];[m
[31m-[m
[31m-            } else {[m
[31m-                bracket = 0;[m
[31m-                name.data = &sc->source->data[i];[m
[31m-            }[m
[31m-[m
[31m-            for ( /* void */ ; i < sc->source->len; i++, name.len++) {[m
[31m-                ch = sc->source->data[i];[m
[31m-[m
[31m-                if (ch == '}' && bracket) {[m
[31m-                    i++;[m
[31m-                    bracket = 0;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (num_var) {[m
[31m-                    if (ch >= '0' && ch <= '9') {[m
[31m-                        n = n * 10 + (ch - '0');[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                /* not a number variable like $1, $2, etc */[m
[31m-[m
[31m-                if ((ch >= 'A' && ch <= 'Z')[m
[31m-                    || (ch >= 'a' && ch <= 'z')[m
[31m-                    || (ch >= '0' && ch <= '9')[m
[31m-                    || ch == '_')[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (bracket) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, sc->log, 0,[m
[31m-                              "the closing bracket in \"%V\" "[m
[31m-                              "variable is missing", &name);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (name.len == 0) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            if (!num_var) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, sc->log, 0,[m
[31m-                              "attempt to use named capturing variable "[m
[31m-                              "\"%V\" (named captures not supported yet)",[m
[31m-                              &name);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sc->variables++;[m
[31m-[m
[31m-            if (ngx_http_lua_script_add_capture_code(sc, n) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        name.data = &sc->source->data[i];[m
[31m-[m
[31m-        while (i < sc->source->len) {[m
[31m-[m
[31m-            if (sc->source->data[i] == '$') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-            name.len++;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_lua_script_add_copy_code(sc, &name, (i == sc->source->len))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_script_done(sc);[m
[31m-[m
[31m-invalid_variable:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, sc->log, 0,[m
[31m-                  "lua script: invalid capturing variable name found in \"%V\"",[m
[31m-                  sc->source);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_add_copy_code(ngx_http_lua_script_compile_t *sc,[m
[31m-    ngx_str_t *value, ngx_uint_t last)[m
[31m-{[m
[31m-    size_t                            size, len;[m
[31m-    ngx_http_lua_script_copy_code_t  *code;[m
[31m-[m
[31m-    len = value->len;[m
[31m-[m
[31m-    code = ngx_http_lua_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_lua_script_copy_code_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_lua_script_code_pt)[m
[31m-                 ngx_http_lua_script_copy_len_code;[m
[31m-    code->len = len;[m
[31m-[m
[31m-    size = (sizeof(ngx_http_lua_script_copy_code_t) + len +[m
[31m-            sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-    code = ngx_http_lua_script_add_code(*sc->values, size);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_lua_script_copy_code;[m
[31m-    code->len = len;[m
[31m-[m
[31m-    ngx_memcpy((u_char *) code + sizeof(ngx_http_lua_script_copy_code_t),[m
[31m-               value->data, value->len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_lua_script_copy_len_code(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_lua_script_copy_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_lua_script_copy_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_lua_script_copy_code_t);[m
[31m-[m
[31m-    return code->len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_script_copy_code(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                           *p;[m
[31m-    ngx_http_lua_script_copy_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_lua_script_copy_code_t *) e->ip;[m
[31m-[m
[31m-    p = e->pos;[m
[31m-[m
[31m-    if (!e->skip) {[m
[31m-        e->pos = ngx_copy(p, e->ip + sizeof(ngx_http_lua_script_copy_code_t),[m
[31m-                          code->len);[m
[31m-    }[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-          + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1));[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->log, 0,[m
[31m-                   "lua script copy: \"%*s\"", e->pos - p, p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_add_capture_code(ngx_http_lua_script_compile_t *sc,[m
[31m-    ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_http_lua_script_capture_code_t  *code;[m
[31m-[m
[31m-    code = ngx_http_lua_script_add_code(*sc->lengths,[m
[31m-                                  sizeof(ngx_http_lua_script_capture_code_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_lua_script_code_pt)[m
[31m-                 ngx_http_lua_script_copy_capture_len_code;[m
[31m-    code->n = 2 * n;[m
[31m-[m
[31m-    code = ngx_http_lua_script_add_code(*sc->values,[m
[31m-                                  sizeof(ngx_http_lua_script_capture_code_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_lua_script_copy_capture_code;[m
[31m-    code->n = 2 * n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_lua_script_copy_capture_len_code(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    int                                  *cap;[m
[31m-    ngx_uint_t                            n;[m
[31m-    ngx_http_lua_script_capture_code_t   *code;[m
[31m-[m
[31m-    code = (ngx_http_lua_script_capture_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_lua_script_capture_code_t);[m
[31m-[m
[31m-    n = code->n;[m
[31m-[m
[31m-    if (n < e->ncaptures) {[m
[31m-        cap = e->captures;[m
[31m-        return cap[n + 1] - cap[n];[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_script_copy_capture_code(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    int                                  *cap;[m
[31m-    u_char                               *p, *pos;[m
[31m-    ngx_uint_t                            n;[m
[31m-    ngx_http_lua_script_capture_code_t   *code;[m
[31m-[m
[31m-    code = (ngx_http_lua_script_capture_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_lua_script_capture_code_t);[m
[31m-[m
[31m-    n = code->n;[m
[31m-[m
[31m-    pos = e->pos;[m
[31m-[m
[31m-    if (n < e->ncaptures) {[m
[31m-[m
[31m-        cap = e->captures;[m
[31m-        p = e->captures_data;[m
[31m-[m
[31m-        e->pos = ngx_copy(pos, &p[cap[n]], cap[n + 1] - cap[n]);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->log, 0,[m
[31m-                   "lua script capture: \"%*s\"", e->pos - pos, pos);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_init_arrays(ngx_http_lua_script_compile_t *sc)[m
[31m-{[m
[31m-    ngx_uint_t   n;[m
[31m-[m
[31m-    if (*sc->lengths == NULL) {[m
[31m-        n = sc->variables * (2 * sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-                             + sizeof(ngx_http_lua_script_capture_code_t))[m
[31m-            + sizeof(uintptr_t);[m
[31m-[m
[31m-        *sc->lengths = ngx_array_create(sc->pool, n, 1);[m
[31m-        if (*sc->lengths == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (*sc->values == NULL) {[m
[31m-        n = (sc->variables * (2 * sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-                              + sizeof(ngx_http_lua_script_capture_code_t))[m
[31m-                + sizeof(uintptr_t)[m
[31m-                + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        *sc->values = ngx_array_create(sc->pool, n, 1);[m
[31m-        if (*sc->values == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sc->variables = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_done(ngx_http_lua_script_compile_t *sc)[m
[31m-{[m
[31m-    uintptr_t   *code;[m
[31m-[m
[31m-    if (sc->complete_lengths) {[m
[31m-        code = ngx_http_lua_script_add_code(*sc->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (sc->complete_values) {[m
[31m-        code = ngx_http_lua_script_add_code(*sc->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_lua_script_add_code(ngx_array_t *codes, size_t size)[m
[31m-{[m
[31m-    return ngx_array_push_n(codes, size);[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_script.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_script.h[m
[1mdeleted file mode 100644[m
[1mindex 9fdca96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_script.h[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_log_t                  *log;[m
[31m-    ngx_pool_t                 *pool;[m
[31m-    ngx_str_t                  *source;[m
[31m-[m
[31m-    ngx_array_t               **lengths;[m
[31m-    ngx_array_t               **values;[m
[31m-[m
[31m-    ngx_uint_t                  variables;[m
[31m-[m
[31m-    unsigned                    complete_lengths:1;[m
[31m-    unsigned                    complete_values:1;[m
[31m-} ngx_http_lua_script_compile_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   value;[m
[31m-    void                       *lengths;[m
[31m-    void                       *values;[m
[31m-} ngx_http_lua_complex_value_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_log_t                       *log;[m
[31m-    ngx_pool_t                      *pool;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_http_lua_complex_value_t    *complex_value;[m
[31m-} ngx_http_lua_compile_complex_value_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *ip;[m
[31m-    u_char                     *pos;[m
[31m-[m
[31m-    ngx_str_t                   buf;[m
[31m-[m
[31m-    int                        *captures;[m
[31m-    ngx_uint_t                  ncaptures;[m
[31m-    u_char                     *captures_data;[m
[31m-[m
[31m-    unsigned                    skip:1;[m
[31m-[m
[31m-    ngx_log_t                  *log;[m
[31m-} ngx_http_lua_script_engine_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_lua_script_code_pt) (ngx_http_lua_script_engine_t *e);[m
[31m-typedef size_t (*ngx_http_lua_script_len_code_pt)[m
[31m-    (ngx_http_lua_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_script_code_pt     code;[m
[31m-    uintptr_t                       len;[m
[31m-} ngx_http_lua_script_copy_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_script_code_pt     code;[m
[31m-    uintptr_t                       n;[m
[31m-} ngx_http_lua_script_capture_code_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_compile_complex_value([m
[31m-    ngx_http_lua_compile_complex_value_t *ccv);[m
[31m-ngx_int_t ngx_http_lua_complex_value(ngx_http_request_t *r, ngx_str_t *subj,[m
[31m-    size_t offset, ngx_int_t count, int *cap,[m
[31m-    ngx_http_lua_complex_value_t *val, luaL_Buffer *luabuf);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.c[m
[1mdeleted file mode 100644[m
[1mindex 8a3f832..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.c[m
[1m+++ /dev/null[m
[36m@@ -1,573 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- * Copyright (C) cuiweixie[m
[31m- * I hereby assign copyright in this code to the lua-nginx-module project,[m
[31m- * to be licensed under the same terms as the rest of the code.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_semaphore.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_sema_mm_init(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_main_conf_t *lmcf);[m
[31m-void ngx_http_lua_sema_mm_cleanup(void *data);[m
[31m-static ngx_http_lua_sema_t *ngx_http_lua_alloc_sema(void);[m
[31m-static void ngx_http_lua_free_sema(ngx_http_lua_sema_t *sem);[m
[31m-static ngx_int_t ngx_http_lua_sema_resume(ngx_http_request_t *r);[m
[31m-int ngx_http_lua_ffi_sema_new(ngx_http_lua_sema_t **psem,[m
[31m-    int n, char **errmsg);[m
[31m-int ngx_http_lua_ffi_sema_post(ngx_http_lua_sema_t *sem, int n);[m
[31m-int ngx_http_lua_ffi_sema_wait(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_sema_t *sem, int wait_ms, u_char *err, size_t *errlen);[m
[31m-static void ngx_http_lua_sema_cleanup(void *data);[m
[31m-static void ngx_http_lua_sema_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_sema_timeout_handler(ngx_event_t *ev);[m
[31m-void ngx_http_lua_ffi_sema_gc(ngx_http_lua_sema_t *sem);[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SEMAPHORE_WAIT_SUCC = 0,[m
[31m-    SEMAPHORE_WAIT_TIMEOUT = 1[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_sema_mm_init(ngx_conf_t *cf, ngx_http_lua_main_conf_t *lmcf)[m
[31m-{[m
[31m-    ngx_http_lua_sema_mm_t *mm;[m
[31m-[m
[31m-    mm = ngx_palloc(cf->pool, sizeof(ngx_http_lua_sema_mm_t));[m
[31m-    if (mm == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf->sema_mm = mm;[m
[31m-    mm->lmcf = lmcf;[m
[31m-[m
[31m-    ngx_queue_init(&mm->free_queue);[m
[31m-    mm->cur_epoch = 0;[m
[31m-    mm->total = 0;[m
[31m-    mm->used = 0;[m
[31m-[m
[31m-    /* it's better to be 4096, but it needs some space for[m
[31m-     * ngx_http_lua_sema_mm_block_t, one is enough, so it is 4095[m
[31m-     */[m
[31m-    mm->num_per_block = 4095;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_lua_sema_t *[m
[31m-ngx_http_lua_alloc_sema(void)[m
[31m-{[m
[31m-    ngx_uint_t                           i, n;[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_http_lua_sema_t                 *sem, *iter;[m
[31m-    ngx_http_lua_sema_mm_t              *mm;[m
[31m-    ngx_http_lua_main_conf_t            *lmcf;[m
[31m-    ngx_http_lua_sema_mm_block_t        *block;[m
[31m-[m
[31m-    ngx_http_lua_assert(ngx_cycle && ngx_cycle->conf_ctx);[m
[31m-[m
[31m-    lmcf = ngx_http_cycle_get_module_main_conf(ngx_cycle,[m
[31m-                                               ngx_http_lua_module);[m
[31m-[m
[31m-    mm = lmcf->sema_mm;[m
[31m-[m
[31m-    if (!ngx_queue_empty(&mm->free_queue)) {[m
[31m-        q = ngx_queue_head(&mm->free_queue);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        sem = ngx_queue_data(q, ngx_http_lua_sema_t, chain);[m
[31m-[m
[31m-        sem->block->used++;[m
[31m-[m
[31m-        ngx_memzero(&sem->sem_event, sizeof(ngx_event_t));[m
[31m-[m
[31m-        sem->sem_event.handler = ngx_http_lua_sema_handler;[m
[31m-        sem->sem_event.data = sem;[m
[31m-        sem->sem_event.log = ngx_cycle->log;[m
[31m-[m
[31m-        mm->used++;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "from head of free queue, alloc semaphore: %p", sem);[m
[31m-[m
[31m-        return sem;[m
[31m-    }[m
[31m-[m
[31m-    /* free_queue is empty */[m
[31m-[m
[31m-    n = sizeof(ngx_http_lua_sema_mm_block_t)[m
[31m-        + mm->num_per_block * sizeof(ngx_http_lua_sema_t);[m
[31m-[m
[31m-    dd("block size: %d, item size: %d",[m
[31m-       (int) sizeof(ngx_http_lua_sema_mm_block_t),[m
[31m-       (int) sizeof(ngx_http_lua_sema_t));[m
[31m-[m
[31m-    block = ngx_alloc(n, ngx_cycle->log);[m
[31m-    if (block == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    mm->cur_epoch++;[m
[31m-    mm->total += mm->num_per_block;[m
[31m-    mm->used++;[m
[31m-[m
[31m-    block->mm = mm;[m
[31m-    block->epoch = mm->cur_epoch;[m
[31m-[m
[31m-    sem = (ngx_http_lua_sema_t *) (block + 1);[m
[31m-    sem->block = block;[m
[31m-    sem->block->used = 1;[m
[31m-[m
[31m-    ngx_memzero(&sem->sem_event, sizeof(ngx_event_t));[m
[31m-[m
[31m-    sem->sem_event.handler = ngx_http_lua_sema_handler;[m
[31m-    sem->sem_event.data = sem;[m
[31m-    sem->sem_event.log = ngx_cycle->log;[m
[31m-[m
[31m-    for (iter = sem + 1, i = 1; i < mm->num_per_block; i++, iter++) {[m
[31m-        iter->block = block;[m
[31m-        ngx_queue_insert_tail(&mm->free_queue, &iter->chain);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "new block, alloc semaphore: %p block: %p", sem, block);[m
[31m-[m
[31m-    return sem;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_sema_mm_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_http_lua_sema_t                 *sem, *iter;[m
[31m-    ngx_http_lua_sema_mm_t              *mm;[m
[31m-    ngx_http_lua_main_conf_t            *lmcf;[m
[31m-    ngx_http_lua_sema_mm_block_t        *block;[m
[31m-[m
[31m-    lmcf = (ngx_http_lua_main_conf_t *) data;[m
[31m-    mm = lmcf->sema_mm;[m
[31m-[m
[31m-    while (!ngx_queue_empty(&mm->free_queue)) {[m
[31m-        q = ngx_queue_head(&mm->free_queue);[m
[31m-[m
[31m-        sem = ngx_queue_data(q, ngx_http_lua_sema_t, chain);[m
[31m-        block = sem->block;[m
[31m-[m
[31m-        if (block->used == 0) {[m
[31m-            iter = (ngx_http_lua_sema_t *) (block + 1);[m
[31m-[m
[31m-            for (i = 0; i < block->mm->num_per_block; i++, iter++) {[m
[31m-                ngx_queue_remove(&iter->chain);[m
[31m-            }[m
[31m-[m
[31m-            dd("free sema block: %p at final", block);[m
[31m-[m
[31m-            ngx_free(block);[m
[31m-[m
[31m-        } else {[m
[31m-            /* just return directly when some thing goes wrong */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "lua sema mm: freeing a block %p that is still "[m
[31m-                          " used by someone", block);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("lua sema mm cleanup done");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_free_sema(ngx_http_lua_sema_t *sem)[m
[31m-{[m
[31m-    ngx_http_lua_sema_t            *iter;[m
[31m-    ngx_uint_t                      i, mid_epoch;[m
[31m-    ngx_http_lua_sema_mm_block_t   *block;[m
[31m-    ngx_http_lua_sema_mm_t         *mm;[m
[31m-[m
[31m-    block = sem->block;[m
[31m-    block->used--;[m
[31m-[m
[31m-    mm = block->mm;[m
[31m-    mm->used--;[m
[31m-[m
[31m-    mid_epoch = mm->cur_epoch - ((mm->total / mm->num_per_block) >> 1);[m
[31m-[m
[31m-    if (block->epoch < mid_epoch) {[m
[31m-        ngx_queue_insert_tail(&mm->free_queue, &sem->chain);[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "add to free queue tail semaphore: %p epoch: %d"[m
[31m-                       "mid_epoch: %d cur_epoch: %d", sem, (int) block->epoch,[m
[31m-                       (int) mid_epoch, (int) mm->cur_epoch);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_queue_insert_head(&mm->free_queue, &sem->chain);[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "add to free queue head semaphore: %p epoch: %d"[m
[31m-                       "mid_epoch: %d cur_epoch: %d", sem, (int) block->epoch,[m
[31m-                       (int) mid_epoch, (int) mm->cur_epoch);[m
[31m-    }[m
[31m-[m
[31m-    dd("used: %d", (int) block->used);[m
[31m-[m
[31m-    if (block->used == 0[m
[31m-        && mm->used <= (mm->total >> 1)[m
[31m-        && block->epoch < mid_epoch)[m
[31m-    {[m
[31m-        /* load <= 50% and it's on the older side */[m
[31m-        iter = (ngx_http_lua_sema_t *) (block + 1);[m
[31m-[m
[31m-        for (i = 0; i < mm->num_per_block; i++, iter++) {[m
[31m-            ngx_queue_remove(&iter->chain);[m
[31m-        }[m
[31m-[m
[31m-        mm->total -= mm->num_per_block;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "free semaphore block: %p", block);[m
[31m-[m
[31m-        ngx_free(block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_sema_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    if (ctx->cur_co_ctx->sem_resume_status == SEMAPHORE_WAIT_SUCC) {[m
[31m-        lua_pushboolean(ctx->cur_co_ctx->co, 1);[m
[31m-        lua_pushnil(ctx->cur_co_ctx->co);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushboolean(ctx->cur_co_ctx->co, 0);[m
[31m-        lua_pushliteral(ctx->cur_co_ctx->co, "timeout");[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, 2);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc >= NGX_OK */[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sema_new(ngx_http_lua_sema_t **psem,[m
[31m-    int n, char **errmsg)[m
[31m-{[m
[31m-    ngx_http_lua_sema_t    *sem;[m
[31m-[m
[31m-    sem = ngx_http_lua_alloc_sema();[m
[31m-    if (sem == NULL) {[m
[31m-        *errmsg = "no memory";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_init(&sem->wait_queue);[m
[31m-[m
[31m-    sem->resource_count = n;[m
[31m-    sem->wait_count = 0;[m
[31m-    *psem = sem;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore new: %p, resources: %d",[m
[31m-                   sem, sem->resource_count);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sema_post(ngx_http_lua_sema_t *sem, int n)[m
[31m-{[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore post: %p, n: %d, resources: %d",[m
[31m-                   sem, n, sem->resource_count);[m
[31m-[m
[31m-    sem->resource_count += n;[m
[31m-[m
[31m-    if (!ngx_queue_empty(&sem->wait_queue)) {[m
[31m-        /* we need the extra paranthese around the first argument of[m
[31m-         * ngx_post_event() just to work around macro issues in nginx[m
[31m-         * cores older than nginx 1.7.12 (exclusive).[m
[31m-         */[m
[31m-        ngx_post_event((&sem->sem_event), &ngx_posted_events);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sema_wait(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_sema_t *sem, int wait_ms, u_char *err, size_t *errlen)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t           *ctx;[m
[31m-    ngx_http_lua_co_ctx_t        *wait_co_ctx;[m
[31m-    ngx_int_t                     rc;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore wait: %p, timeout: %d, "[m
[31m-                   "resources: %d, event posted: %d",[m
[31m-                   sem, wait_ms, sem->resource_count,[m
[31m-#if (nginx_version >= 1007005)[m
[31m-                   (int) sem->sem_event.posted[m
[31m-#else[m
[31m-                   sem->sem_event.prev ? 1 : 0[m
[31m-#endif[m
[31m-                   );[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *errlen = ngx_snprintf(err, *errlen, "no request ctx found") - err;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_ffi_check_context(ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                                        | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                                        | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                                        | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                                        | NGX_HTTP_LUA_CONTEXT_SSL_CERT,[m
[31m-                                        err, errlen);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* we keep the order, will resume the older waited firtly[m
[31m-     * in ngx_http_lua_sema_handler[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_queue_empty(&sem->wait_queue) && sem->resource_count > 0) {[m
[31m-        sem->resource_count--;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (wait_ms == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    sem->wait_count++;[m
[31m-    wait_co_ctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    wait_co_ctx->sleep.handler = ngx_http_lua_sema_timeout_handler;[m
[31m-    wait_co_ctx->sleep.data = ctx->cur_co_ctx;[m
[31m-    wait_co_ctx->sleep.log = r->connection->log;[m
[31m-[m
[31m-    ngx_add_timer(&wait_co_ctx->sleep, (ngx_msec_t) wait_ms);[m
[31m-[m
[31m-    dd("ngx_http_lua_ffi_sema_wait add timer coctx:%p wait: %d(ms)",[m
[31m-       wait_co_ctx, wait_ms);[m
[31m-[m
[31m-    ngx_queue_insert_tail(&sem->wait_queue, &wait_co_ctx->sem_wait_queue);[m
[31m-[m
[31m-    wait_co_ctx->data = sem;[m
[31m-    wait_co_ctx->cleanup = ngx_http_lua_sema_cleanup;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore wait yielding");[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sema_count(ngx_http_lua_sema_t *sem)[m
[31m-{[m
[31m-    return sem->resource_count - sem->wait_count;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_sema_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t          *coctx = data;[m
[31m-    ngx_queue_t                    *q;[m
[31m-    ngx_http_lua_sema_t            *sem;[m
[31m-[m
[31m-    sem = coctx->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore cleanup");[m
[31m-[m
[31m-    if (coctx->sleep.timer_set) {[m
[31m-        ngx_del_timer(&coctx->sleep);[m
[31m-    }[m
[31m-[m
[31m-    q = &coctx->sem_wait_queue;[m
[31m-[m
[31m-    ngx_queue_remove(q);[m
[31m-    sem->wait_count--;[m
[31m-    coctx->cleanup = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_sema_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_lua_sema_t         *sem;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *wait_co_ctx;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_queue_t                 *q;[m
[31m-[m
[31m-    sem = ev->data;[m
[31m-[m
[31m-    while (!ngx_queue_empty(&sem->wait_queue) && sem->resource_count > 0) {[m
[31m-[m
[31m-        q = ngx_queue_head(&sem->wait_queue);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        sem->wait_count--;[m
[31m-[m
[31m-        wait_co_ctx = ngx_queue_data(q, ngx_http_lua_co_ctx_t, sem_wait_queue);[m
[31m-        wait_co_ctx->cleanup = NULL;[m
[31m-[m
[31m-        if (wait_co_ctx->sleep.timer_set) {[m
[31m-            ngx_del_timer(&wait_co_ctx->sleep);[m
[31m-        }[m
[31m-[m
[31m-        r = ngx_http_lua_get_req(wait_co_ctx->co);[m
[31m-        c = r->connection;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        ngx_http_lua_assert(ctx != NULL);[m
[31m-[m
[31m-        sem->resource_count--;[m
[31m-[m
[31m-        ctx->cur_co_ctx = wait_co_ctx;[m
[31m-[m
[31m-        wait_co_ctx->sem_resume_status = SEMAPHORE_WAIT_SUCC;[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            (void) ngx_http_lua_sema_resume(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->resume_handler = ngx_http_lua_sema_resume;[m
[31m-            ngx_http_core_run_phases(r);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_sema_timeout_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t       *wait_co_ctx;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_sema_t         *sem;[m
[31m-[m
[31m-    wait_co_ctx = ev->data;[m
[31m-    wait_co_ctx->cleanup = NULL;[m
[31m-[m
[31m-    dd("ngx_http_lua_sema_timeout_handler timeout coctx:%p", wait_co_ctx);[m
[31m-[m
[31m-    sem = wait_co_ctx->data;[m
[31m-[m
[31m-    ngx_queue_remove(&wait_co_ctx->sem_wait_queue);[m
[31m-    sem->wait_count--;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(wait_co_ctx->co);[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    ngx_http_lua_assert(ctx != NULL);[m
[31m-[m
[31m-    ctx->cur_co_ctx = wait_co_ctx;[m
[31m-[m
[31m-    wait_co_ctx->sem_resume_status = SEMAPHORE_WAIT_TIMEOUT;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        (void) ngx_http_lua_sema_resume(r);[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->resume_handler = ngx_http_lua_sema_resume;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_sema_gc(ngx_http_lua_sema_t *sem)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "in lua gc, semaphore %p", sem);[m
[31m-[m
[31m-    if (sem == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_queue_empty(&sem->wait_queue)) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, 0,[m
[31m-                      "in lua semaphore gc wait queue is"[m
[31m-                      " not empty while the semaphore %p is being "[m
[31m-                      "destroyed", sem);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_free_sema(sem);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.h[m
[1mdeleted file mode 100644[m
[1mindex 65ba8ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.h[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- * Copyright (C) cuiweixie[m
[31m- * I hereby assign copyright in this code to the lua-nginx-module project,[m
[31m- * to be licensed under the same terms as the rest of the code.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SEMAPHORE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SEMAPHORE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_sema_mm_block_s {[m
[31m-    ngx_uint_t                       used;[m
[31m-    ngx_http_lua_sema_mm_t          *mm;[m
[31m-    ngx_uint_t                       epoch;[m
[31m-} ngx_http_lua_sema_mm_block_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_sema_mm_s {[m
[31m-    ngx_queue_t                  free_queue;[m
[31m-    ngx_uint_t                   total;[m
[31m-    ngx_uint_t                   used;[m
[31m-    ngx_uint_t                   num_per_block;[m
[31m-    ngx_uint_t                   cur_epoch;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_sema_s {[m
[31m-    ngx_queue_t                          wait_queue;[m
[31m-    ngx_queue_t                          chain;[m
[31m-    ngx_event_t                          sem_event;[m
[31m-    ngx_http_lua_sema_mm_block_t        *block;[m
[31m-    int                                  resource_count;[m
[31m-    unsigned                             wait_count;[m
[31m-} ngx_http_lua_sema_t;[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-void ngx_http_lua_sema_mm_cleanup(void *data);[m
[31m-ngx_int_t ngx_http_lua_sema_mm_init(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_main_conf_t *lmcf);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SEMAPHORE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_setby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_setby.c[m
[1mdeleted file mode 100644[m
[1mindex ed9ccc4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_setby.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_setby.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static void ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r,[m
[31m-    size_t nargs, ngx_http_variable_value_t *args);[m
[31m-[m
[31m-[m
[31m-/* keys in Lua thread for fetching args and nargs in set_by_lua* */[m
[31m-[m
[31m-#define ngx_http_lua_nargs_key  "__ngx_nargs"[m
[31m-[m
[31m-#define ngx_http_lua_args_key  "__ngx_args"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r, ngx_str_t *val,[m
[31m-    ngx_http_variable_value_t *args, size_t nargs, ngx_str_t *script)[m
[31m-{[m
[31m-    size_t           i;[m
[31m-    ngx_int_t        rc;[m
[31m-    u_char          *err_msg;[m
[31m-    size_t           len;[m
[31m-    u_char          *data;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t      *old_pool;[m
[31m-#endif[m
[31m-[m
[31m-    dd("nargs: %d", (int) nargs);[m
[31m-[m
[31m-    dd("set Lua VM panic handler");[m
[31m-[m
[31m-    lua_atpanic(L, ngx_http_lua_atpanic);[m
[31m-[m
[31m-    NGX_LUA_EXCEPTION_TRY {[m
[31m-        dd("initialize nginx context in Lua VM, code chunk at "[m
[31m-           "stack top    sp = 1");[m
[31m-        ngx_http_lua_set_by_lua_env(L, r, nargs, args);[m
[31m-[m
[31m-        /*  passing directive arguments to the user code */[m
[31m-        for (i = 0; i < nargs; i++) {[m
[31m-            lua_pushlstring(L, (const char *) args[i].data, args[i].len);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        /* XXX: work-around to nginx regex subsystem */[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-        lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-        dd("protected call user code");[m
[31m-[m
[31m-        rc = lua_pcall(L, nargs, 1, 1);[m
[31m-[m
[31m-        dd("after protected call user code");[m
[31m-[m
[31m-        lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        /* XXX: work-around to nginx regex subsystem */[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-        if (rc != 0) {[m
[31m-            /*  error occured when running loaded code */[m
[31m-            err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-            if (err_msg == NULL) {[m
[31m-                err_msg = (u_char *) "unknown reason";[m
[31m-                len = sizeof("unknown reason") - 1;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "failed to run set_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-            lua_settop(L, 0);    /*  clear remaining elems on stack */[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        data = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-        if (data) {[m
[31m-            val->data = ngx_palloc(r->pool, len);[m
[31m-            if (val->data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(val->data, data, len);[m
[31m-            val->len = len;[m
[31m-[m
[31m-        } else {[m
[31m-            val->data = NULL;[m
[31m-            val->len = 0;[m
[31m-        }[m
[31m-[m
[31m-    } NGX_LUA_EXCEPTION_CATCH {[m
[31m-[m
[31m-        dd("nginx execution restored");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  clear Lua stack */[m
[31m-    lua_settop(L, 0);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_setby_param_get(lua_State *L)[m
[31m-{[m
[31m-    int         idx;[m
[31m-    int         n;[m
[31m-[m
[31m-    ngx_http_variable_value_t       *v;[m
[31m-[m
[31m-    idx = luaL_checkint(L, 2);[m
[31m-    idx--;[m
[31m-[m
[31m-    /*  get number of args from globals */[m
[31m-    lua_getglobal(L, ngx_http_lua_nargs_key);[m
[31m-    n = (int) lua_tointeger(L, -1);[m
[31m-[m
[31m-    /*  get args from globals */[m
[31m-    lua_getglobal(L, ngx_http_lua_args_key);[m
[31m-    v = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (idx < 0 || idx > n - 1) {[m
[31m-        lua_pushnil(L);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushlstring(L, (const char *) (v[idx].data), v[idx].len);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Set environment table for the given code closure.[m
[31m- *[m
[31m- * Before:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- *[m
[31m- * After:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- * */[m
[31m-static void[m
[31m-ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r, size_t nargs,[m
[31m-    ngx_http_variable_value_t *args)[m
[31m-{[m
[31m-    /*  set nginx request pointer to current lua thread's globals table */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-[m
[31m-    lua_pushinteger(L, nargs);[m
[31m-    lua_setglobal(L, ngx_http_lua_nargs_key);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, args);[m
[31m-    lua_setglobal(L, ngx_http_lua_args_key);[m
[31m-[m
[31m-    /**[m
[31m-     * we want to create empty environment for current script[m
[31m-     *[m
[31m-     * newt = {}[m
[31m-     * newt["_G"] = newt[m
[31m-     * setmetatable(newt, {__index = _G})[m
[31m-     *[m
[31m-     * if a function or symbol is not defined in our env, __index will lookup[m
[31m-     * in the global env.[m
[31m-     *[m
[31m-     * all variables created in the script-env will be thrown away at the end[m
[31m-     * of the script run.[m
[31m-     * */[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    /* the metatable for the new env */[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */);[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable(newt, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_setby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_setby.h[m
[1mdeleted file mode 100644[m
[1mindex da71753..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_setby.h[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-#ifndef _NGX_HTTP_LUA_SET_BY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SET_BY_H_INCLUDED_[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_str_t *val, ngx_http_variable_value_t *args, size_t nargs,[m
[31m-    ngx_str_t *script);[m
[31m-int ngx_http_lua_setby_param_get(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SET_BY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_shdict.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_shdict.c[m
[1mdeleted file mode 100644[m
[1mindex 43f5f9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_shdict.c[m
[1m+++ /dev/null[m
[36m@@ -1,1886 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_api.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_shdict_set(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_safe_set(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_get(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_get_stale(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_get_helper(lua_State *L, int get_stale);[m
[31m-static int ngx_http_lua_shdict_expire(ngx_http_lua_shdict_ctx_t *ctx,[m
[31m-    ngx_uint_t n);[m
[31m-static ngx_int_t ngx_http_lua_shdict_lookup(ngx_shm_zone_t *shm_zone,[m
[31m-    ngx_uint_t hash, u_char *kdata, size_t klen,[m
[31m-    ngx_http_lua_shdict_node_t **sdp);[m
[31m-static int ngx_http_lua_shdict_set_helper(lua_State *L, int flags);[m
[31m-static int ngx_http_lua_shdict_add(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_safe_add(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_replace(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_incr(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_delete(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_flush_all(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_flush_expired(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_get_keys(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_shm_zone_t *ngx_http_lua_shdict_get_zone(lua_State *L,[m
[31m-                                                               int index);[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LUA_SHDICT_ADD         0x0001[m
[31m-#define NGX_HTTP_LUA_SHDICT_REPLACE     0x0002[m
[31m-#define NGX_HTTP_LUA_SHDICT_SAFE_STORE  0x0004[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SHDICT_USERDATA_INDEX = 1,[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_http_lua_shdict_ctx_t  *octx = data;[m
[31m-[m
[31m-    size_t                      len;[m
[31m-    ngx_int_t                   rc;[m
[31m-    volatile ngx_cycle_t       *saved_cycle;[m
[31m-    ngx_http_lua_shdict_ctx_t  *ctx;[m
[31m-    ngx_http_lua_main_conf_t   *lmcf;[m
[31m-[m
[31m-    dd("init zone");[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    if (octx) {[m
[31m-        ctx->sh = octx->sh;[m
[31m-        ctx->shpool = octx->shpool;[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        ctx->sh = ctx->shpool->data;[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_lua_shdict_shctx_t));[m
[31m-    if (ctx->sh == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->shpool->data = ctx->sh;[m
[31m-[m
[31m-    ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel,[m
[31m-                    ngx_http_lua_shdict_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&ctx->sh->queue);[m
[31m-[m
[31m-    len = sizeof(" in lua_shared_dict zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len);[m
[31m-    if (ctx->shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(ctx->shpool->log_ctx, " in lua_shared_dict zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1005013[m
[31m-    ctx->shpool->log_nomem = 0;[m
[31m-#endif[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    dd("get lmcf");[m
[31m-[m
[31m-    lmcf = ctx->main_conf;[m
[31m-[m
[31m-    dd("lmcf->lua: %p", lmcf->lua);[m
[31m-[m
[31m-    lmcf->shm_zones_inited++;[m
[31m-[m
[31m-    if (lmcf->shm_zones_inited == lmcf->shm_zones->nelts[m
[31m-        && lmcf->init_handler)[m
[31m-    {[m
[31m-        saved_cycle = ngx_cycle;[m
[31m-        ngx_cycle = ctx->cycle;[m
[31m-[m
[31m-        rc = lmcf->init_handler(ctx->log, lmcf, lmcf->lua);[m
[31m-[m
[31m-        ngx_cycle = saved_cycle;[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            /* an error happened */[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t           **p;[m
[31m-    ngx_http_lua_shdict_node_t   *sdn, *sdnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            sdn = (ngx_http_lua_shdict_node_t *) &node->color;[m
[31m-            sdnt = (ngx_http_lua_shdict_node_t *) &temp->color;[m
[31m-[m
[31m-            p = ngx_memn2cmp(sdn->data, sdnt->data, sdn->key_len,[m
[31m-                             sdnt->key_len) < 0 ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, ngx_uint_t hash,[m
[31m-    u_char *kdata, size_t klen, ngx_http_lua_shdict_node_t **sdp)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    uint64_t                     now;[m
[31m-    int64_t                      ms;[m
[31m-    ngx_rbtree_node_t           *node, *sentinel;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    node = ctx->sh->rbtree.root;[m
[31m-    sentinel = ctx->sh->rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sd = (ngx_http_lua_shdict_node_t *) &node->color;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(kdata, sd->data, klen, (size_t) sd->key_len);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            ngx_queue_remove(&sd->queue);[m
[31m-            ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-            *sdp = sd;[m
[31m-[m
[31m-            dd("node expires: %lld", (long long) sd->expires);[m
[31m-[m
[31m-            if (sd->expires != 0) {[m
[31m-                tp = ngx_timeofday();[m
[31m-[m
[31m-                now = (uint64_t) tp->sec * 1000 + tp->msec;[m
[31m-                ms = sd->expires - now;[m
[31m-[m
[31m-                dd("time to live: %lld", (long long) ms);[m
[31m-[m
[31m-                if (ms < 0) {[m
[31m-                    dd("node already expired");[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    *sdp = NULL;[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_expire(ngx_http_lua_shdict_ctx_t *ctx, ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_time_t                  *tp;[m
[31m-    uint64_t                     now;[m
[31m-    ngx_queue_t                 *q;[m
[31m-    int64_t                      ms;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    int                          freed = 0;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    now = (uint64_t) tp->sec * 1000 + tp->msec;[m
[31m-[m
[31m-    /*[m
[31m-     * n == 1 deletes one or two expired entries[m
[31m-     * n == 0 deletes oldest entry by force[m
[31m-     *        and one or two zero rate entries[m
[31m-     */[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&ctx->sh->queue)) {[m
[31m-            return freed;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-[m
[31m-        if (n++ != 0) {[m
[31m-[m
[31m-            if (sd->expires == 0) {[m
[31m-                return freed;[m
[31m-            }[m
[31m-[m
[31m-            ms = sd->expires - now;[m
[31m-            if (ms > 0) {[m
[31m-                return freed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        node = (ngx_rbtree_node_t *)[m
[31m-                   ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-        ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-        ngx_slab_free_locked(ctx->shpool, node);[m
[31m-[m
[31m-        freed++;[m
[31m-    }[m
[31m-[m
[31m-    return freed;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_shdict_api(ngx_http_lua_main_conf_t *lmcf, lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_shm_zone_t             **zone;[m
[31m-[m
[31m-    if (lmcf->shm_zones != NULL) {[m
[31m-        lua_createtable(L, 0, lmcf->shm_zones->nelts /* nrec */);[m
[31m-                /* ngx.shared */[m
[31m-[m
[31m-        lua_createtable(L, 0 /* narr */, 13 /* nrec */); /* shared mt */[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_get);[m
[31m-        lua_setfield(L, -2, "get");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_get_stale);[m
[31m-        lua_setfield(L, -2, "get_stale");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_set);[m
[31m-        lua_setfield(L, -2, "set");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_safe_set);[m
[31m-        lua_setfield(L, -2, "safe_set");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_add);[m
[31m-        lua_setfield(L, -2, "add");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_safe_add);[m
[31m-        lua_setfield(L, -2, "safe_add");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_replace);[m
[31m-        lua_setfield(L, -2, "replace");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_incr);[m
[31m-        lua_setfield(L, -2, "incr");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_delete);[m
[31m-        lua_setfield(L, -2, "delete");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_flush_all);[m
[31m-        lua_setfield(L, -2, "flush_all");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_flush_expired);[m
[31m-        lua_setfield(L, -2, "flush_expired");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_get_keys);[m
[31m-        lua_setfield(L, -2, "get_keys");[m
[31m-[m
[31m-        lua_pushvalue(L, -1); /* shared mt mt */[m
[31m-        lua_setfield(L, -2, "__index"); /* shared mt */[m
[31m-[m
[31m-        zone = lmcf->shm_zones->elts;[m
[31m-[m
[31m-        for (i = 0; i < lmcf->shm_zones->nelts; i++) {[m
[31m-            ctx = zone[i]->data;[m
[31m-[m
[31m-            lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len);[m
[31m-                /* shared mt key */[m
[31m-[m
[31m-            lua_createtable(L, 1 /* narr */, 0 /* nrec */);[m
[31m-                /* table of zone[i] */[m
[31m-            lua_pushlightuserdata(L, zone[i]); /* shared mt key ud */[m
[31m-            lua_rawseti(L, -2, SHDICT_USERDATA_INDEX); /* {zone[i]} */[m
[31m-            lua_pushvalue(L, -3); /* shared mt key ud mt */[m
[31m-            lua_setmetatable(L, -2); /* shared mt key ud */[m
[31m-            lua_rawset(L, -4); /* shared mt */[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1); /* shared */[m
[31m-[m
[31m-    } else {[m
[31m-        lua_newtable(L);    /* ngx.shared */[m
[31m-    }[m
[31m-[m
[31m-    lua_setfield(L, -2, "shared");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_get(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_get_helper(L, 0 /* stale */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_get_stale(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_get_helper(L, 1 /* stale */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_shm_zone_t *[m
[31m-ngx_http_lua_shdict_get_zone(lua_State *L, int index)[m
[31m-{[m
[31m-    ngx_shm_zone_t      *zone;[m
[31m-[m
[31m-    lua_rawgeti(L, index, SHDICT_USERDATA_INDEX);[m
[31m-    zone = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    return zone;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_get_helper(lua_State *L, int get_stale)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_str_t                    key;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_str_t                    value;[m
[31m-    int                          value_type;[m
[31m-    double                       num;[m
[31m-    u_char                       c;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    uint32_t                     user_flags = 0;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 2) {[m
[31m-        return luaL_error(L, "expecting exactly two arguments, "[m
[31m-                          "but only seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 1) != LUA_TTABLE) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-    name = ctx->name;[m
[31m-[m
[31m-    if (lua_isnil(L, 2)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nil key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    key.data = (u_char *) luaL_checklstring(L, 2, &key.len);[m
[31m-[m
[31m-    if (key.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "empty key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (key.len > 65535) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "key too long");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "fetching key \"%V\" in shared dict \"%V\"", &key, &name);[m
[31m-#endif /* NGX_DEBUG */[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    if (!get_stale) {[m
[31m-        ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returns %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || (rc == NGX_DONE && !get_stale)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || (rc == NGX_DONE && get_stale) */[m
[31m-[m
[31m-    value_type = sd->value_type;[m
[31m-[m
[31m-    dd("data: %p", sd->data);[m
[31m-    dd("key len: %d", (int) sd->key_len);[m
[31m-[m
[31m-    value.data = sd->data + sd->key_len;[m
[31m-    value.len = (size_t) sd->value_len;[m
[31m-[m
[31m-    switch (value_type) {[m
[31m-    case LUA_TSTRING:[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) value.data, value.len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-[m
[31m-        if (value.len != sizeof(double)) {[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            return luaL_error(L, "bad lua number value size found for key %s "[m
[31m-                              "in shared_dict %s: %lu", key.data, name.data,[m
[31m-                              (unsigned long) value.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(&num, value.data, sizeof(double));[m
[31m-[m
[31m-        lua_pushnumber(L, num);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-[m
[31m-        if (value.len != sizeof(u_char)) {[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            return luaL_error(L, "bad lua boolean value size found for key %s "[m
[31m-                              "in shared_dict %s: %lu", key.data, name.data,[m
[31m-                              (unsigned long) value.len);[m
[31m-        }[m
[31m-[m
[31m-        c = *value.data;[m
[31m-[m
[31m-        lua_pushboolean(L, c ? 1 : 0);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        return luaL_error(L, "bad value type found for key %s in "[m
[31m-                          "shared_dict %s: %d", key.data, name.data,[m
[31m-                          value_type);[m
[31m-    }[m
[31m-[m
[31m-    user_flags = sd->user_flags;[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    if (get_stale) {[m
[31m-[m
[31m-        /* always return value, flags, stale */[m
[31m-[m
[31m-        if (user_flags) {[m
[31m-            lua_pushinteger(L, (lua_Integer) user_flags);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushnil(L);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushboolean(L, rc == NGX_DONE);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-    if (user_flags) {[m
[31m-        lua_pushinteger(L, (lua_Integer) user_flags);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_delete(lua_State *L)[m
[31m-{[m
[31m-    int             n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 2) {[m
[31m-        return luaL_error(L, "expecting 2 arguments, "[m
[31m-                          "but only seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-[m
[31m-    return ngx_http_lua_shdict_set_helper(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_flush_all(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                 *q;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    int                          n;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument, but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    for (q = ngx_queue_head(&ctx->sh->queue);[m
[31m-         q != ngx_queue_sentinel(&ctx->sh->queue);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-        sd->expires = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_shdict_expire(ctx, 0);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_flush_expired(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                 *q, *prev;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    int                          freed = 0;[m
[31m-    int                          attempts = 0;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    uint64_t                     now;[m
[31m-    int                          n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 argument(s), but saw %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        attempts = luaL_checkint(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    if (ngx_queue_empty(&ctx->sh->queue)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        lua_pushnumber(L, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    now = (uint64_t) tp->sec * 1000 + tp->msec;[m
[31m-[m
[31m-    q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-    while (q != ngx_queue_sentinel(&ctx->sh->queue)) {[m
[31m-        prev = ngx_queue_prev(q);[m
[31m-[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-[m
[31m-        if (sd->expires != 0 && sd->expires <= now) {[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            node = (ngx_rbtree_node_t *)[m
[31m-                ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-            ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-            ngx_slab_free_locked(ctx->shpool, node);[m
[31m-            freed++;[m
[31m-[m
[31m-            if (attempts && freed == attempts) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        q = prev;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    lua_pushnumber(L, freed);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * This trades CPU for memory. This is potentially slow. O(2n)[m
[31m- */[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_get_keys(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                 *q, *prev;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    int                          total = 0;[m
[31m-    int                          attempts = 1024;[m
[31m-    uint64_t                     now;[m
[31m-    int                          n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 argument(s), "[m
[31m-                          "but saw %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        attempts = luaL_checkint(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    if (ngx_queue_empty(&ctx->sh->queue)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    now = (uint64_t) tp->sec * 1000 + tp->msec;[m
[31m-[m
[31m-    /* first run through: get total number of elements we need to allocate */[m
[31m-[m
[31m-    q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-    while (q != ngx_queue_sentinel(&ctx->sh->queue)) {[m
[31m-        prev = ngx_queue_prev(q);[m
[31m-[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-[m
[31m-        if (sd->expires == 0 || sd->expires > now) {[m
[31m-            total++;[m
[31m-            if (attempts && total == attempts) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        q = prev;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, total, 0);[m
[31m-[m
[31m-    /* second run through: add keys to table */[m
[31m-[m
[31m-    total = 0;[m
[31m-    q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-    while (q != ngx_queue_sentinel(&ctx->sh->queue)) {[m
[31m-        prev = ngx_queue_prev(q);[m
[31m-[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-[m
[31m-        if (sd->expires == 0 || sd->expires > now) {[m
[31m-            lua_pushlstring(L, (char *) sd->data, sd->key_len);[m
[31m-            lua_rawseti(L, -2, ++total);[m
[31m-            if (attempts && total == attempts) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        q = prev;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    /* table is at top of stack */[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_add(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_ADD);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_safe_add(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_ADD[m
[31m-                                          |NGX_HTTP_LUA_SHDICT_SAFE_STORE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_replace(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_REPLACE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_set(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_safe_set(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_SAFE_STORE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_set_helper(lua_State *L, int flags)[m
[31m-{[m
[31m-    int                          i, n;[m
[31m-    ngx_str_t                    key;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_str_t                    value;[m
[31m-    int                          value_type;[m
[31m-    double                       num;[m
[31m-    u_char                       c;[m
[31m-    lua_Number                   exptime = 0;[m
[31m-    u_char                      *p;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    int                          forcible = 0;[m
[31m-                         /* indicates whether to foricibly override other[m
[31m-                          * valid entries */[m
[31m-    int32_t                      user_flags = 0;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 3 && n != 4 && n != 5) {[m
[31m-        return luaL_error(L, "expecting 3, 4 or 5 arguments, "[m
[31m-                          "but only seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 1) != LUA_TTABLE) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    if (lua_isnil(L, 2)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nil key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    key.data = (u_char *) luaL_checklstring(L, 2, &key.len);[m
[31m-[m
[31m-    if (key.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "empty key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (key.len > 65535) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "key too long");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-    value_type = lua_type(L, 3);[m
[31m-[m
[31m-    switch (value_type) {[m
[31m-    case LUA_TSTRING:[m
[31m-        value.data = (u_char *) lua_tolstring(L, 3, &value.len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-        value.len = sizeof(double);[m
[31m-        num = lua_tonumber(L, 3);[m
[31m-        value.data = (u_char *) &num;[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-        value.len = sizeof(u_char);[m
[31m-        c = lua_toboolean(L, 3) ? 1 : 0;[m
[31m-        value.data = &c;[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNIL:[m
[31m-        if (flags & (NGX_HTTP_LUA_SHDICT_ADD|NGX_HTTP_LUA_SHDICT_REPLACE)) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "attempt to add or replace nil values");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ngx_str_null(&value);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "bad value type");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (n >= 4) {[m
[31m-        exptime = luaL_checknumber(L, 4);[m
[31m-        if (exptime < 0) {[m
[31m-            return luaL_error(L, "bad \"exptime\" argument");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n == 5) {[m
[31m-        user_flags = (uint32_t) luaL_checkinteger(L, 5);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returned %d", (int) rc);[m
[31m-[m
[31m-    if (flags & NGX_HTTP_LUA_SHDICT_REPLACE) {[m
[31m-[m
[31m-        if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            lua_pushboolean(L, 0);[m
[31m-            lua_pushliteral(L, "not found");[m
[31m-            lua_pushboolean(L, forcible);[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_OK */[m
[31m-[m
[31m-        goto replace;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_LUA_SHDICT_ADD) {[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            lua_pushboolean(L, 0);[m
[31m-            lua_pushliteral(L, "exists");[m
[31m-            lua_pushboolean(L, forcible);[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            /* exists but expired */[m
[31m-[m
[31m-            dd("go to replace");[m
[31m-            goto replace;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_DECLINED */[m
[31m-[m
[31m-        dd("go to insert");[m
[31m-        goto insert;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DONE) {[m
[31m-[m
[31m-        if (value_type == LUA_TNIL) {[m
[31m-            goto remove;[m
[31m-        }[m
[31m-[m
[31m-replace:[m
[31m-[m
[31m-        if (value.data && value.len == (size_t) sd->value_len) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                           "lua shared dict set: found old entry and value "[m
[31m-                           "size matched, reusing it");[m
[31m-[m
[31m-            ngx_queue_remove(&sd->queue);[m
[31m-            ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-            sd->key_len = (u_short) key.len;[m
[31m-[m
[31m-            if (exptime > 0) {[m
[31m-                tp = ngx_timeofday();[m
[31m-                sd->expires = (uint64_t) tp->sec * 1000 + tp->msec[m
[31m-                              + (uint64_t) (exptime * 1000);[m
[31m-[m
[31m-            } else {[m
[31m-                sd->expires = 0;[m
[31m-            }[m
[31m-[m
[31m-            sd->user_flags = user_flags;[m
[31m-[m
[31m-            sd->value_len = (uint32_t) value.len;[m
[31m-[m
[31m-            dd("setting value type to %d", value_type);[m
[31m-[m
[31m-            sd->value_type = (uint8_t) value_type;[m
[31m-[m
[31m-            p = ngx_copy(sd->data, key.data, key.len);[m
[31m-            ngx_memcpy(p, value.data, value.len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            lua_pushboolean(L, 1);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushboolean(L, forcible);[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                       "lua shared dict set: found old entry but value size "[m
[31m-                       "NOT matched, removing it first");[m
[31m-[m
[31m-remove:[m
[31m-[m
[31m-        ngx_queue_remove(&sd->queue);[m
[31m-[m
[31m-        node = (ngx_rbtree_node_t *)[m
[31m-                   ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-        ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-        ngx_slab_free_locked(ctx->shpool, node);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-insert:[m
[31m-[m
[31m-    /* rc == NGX_DECLINED or value size unmatch */[m
[31m-[m
[31m-    if (value.data == NULL) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        lua_pushboolean(L, 1);[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushboolean(L, 0);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "lua shared dict set: creating a new entry");[m
[31m-[m
[31m-    n = offsetof(ngx_rbtree_node_t, color)[m
[31m-        + offsetof(ngx_http_lua_shdict_node_t, data)[m
[31m-        + key.len[m
[31m-        + value.len;[m
[31m-[m
[31m-    node = ngx_slab_alloc_locked(ctx->shpool, n);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-[m
[31m-        if (flags & NGX_HTTP_LUA_SHDICT_SAFE_STORE) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            lua_pushboolean(L, 0);[m
[31m-            lua_pushliteral(L, "no memory");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                       "lua shared dict set: overriding non-expired items "[m
[31m-                       "due to memory shortage for entry \"%V\"", &key);[m
[31m-[m
[31m-        for (i = 0; i < 30; i++) {[m
[31m-            if (ngx_http_lua_shdict_expire(ctx, 0) == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            forcible = 1;[m
[31m-[m
[31m-            node = ngx_slab_alloc_locked(ctx->shpool, n);[m
[31m-            if (node != NULL) {[m
[31m-                goto allocated;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        lua_pushboolean(L, 0);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-        lua_pushboolean(L, forcible);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-allocated:[m
[31m-[m
[31m-    sd = (ngx_http_lua_shdict_node_t *) &node->color;[m
[31m-[m
[31m-    node->key = hash;[m
[31m-    sd->key_len = (u_short) key.len;[m
[31m-[m
[31m-    if (exptime > 0) {[m
[31m-        tp = ngx_timeofday();[m
[31m-        sd->expires = (uint64_t) tp->sec * 1000 + tp->msec[m
[31m-                      + (uint64_t) (exptime * 1000);[m
[31m-[m
[31m-    } else {[m
[31m-        sd->expires = 0;[m
[31m-    }[m
[31m-[m
[31m-    sd->user_flags = user_flags;[m
[31m-[m
[31m-    sd->value_len = (uint32_t) value.len;[m
[31m-[m
[31m-    dd("setting value type to %d", value_type);[m
[31m-[m
[31m-    sd->value_type = (uint8_t) value_type;[m
[31m-[m
[31m-    p = ngx_copy(sd->data, key.data, key.len);[m
[31m-    ngx_memcpy(p, value.data, value.len);[m
[31m-[m
[31m-    ngx_rbtree_insert(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushboolean(L, forcible);[m
[31m-    return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_incr(lua_State *L)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_str_t                    key;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    double                       num;[m
[31m-    u_char                      *p;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    double                       value;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 3) {[m
[31m-        return luaL_error(L, "expecting 3 arguments, but only seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 1) != LUA_TTABLE) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    if (lua_isnil(L, 2)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nil key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    key.data = (u_char *) luaL_checklstring(L, 2, &key.len);[m
[31m-[m
[31m-    if (key.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "empty key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (key.len > 65535) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "key too long");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-    value = luaL_checknumber(L, 3);[m
[31m-[m
[31m-    dd("looking up key %.*s in shared dict %.*s", (int) key.len, key.data,[m
[31m-       (int) ctx->name.len, ctx->name.data);[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    if (sd->value_type != LUA_TNUMBER || sd->value_len != sizeof(double)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "not a number");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(&sd->queue);[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-    dd("setting value type to %d", (int) sd->value_type);[m
[31m-[m
[31m-    p = sd->data + key.len;[m
[31m-[m
[31m-    ngx_memcpy(&num, p, sizeof(double));[m
[31m-    num += value;[m
[31m-[m
[31m-    ngx_memcpy(p, (double *) &num, sizeof(double));[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    lua_pushnumber(L, num);[m
[31m-    lua_pushnil(L);[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_shared_dict_get(ngx_shm_zone_t *zone, u_char *key_data,[m
[31m-    size_t key_len, ngx_http_lua_value_t *value)[m
[31m-{[m
[31m-    u_char                      *data;[m
[31m-    size_t                       len;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-[m
[31m-    if (zone == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key_data, key_len);[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key_data, key_len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    value->type = sd->value_type;[m
[31m-[m
[31m-    dd("type: %d", (int) value->type);[m
[31m-[m
[31m-    data = sd->data + sd->key_len;[m
[31m-    len = (size_t) sd->value_len;[m
[31m-[m
[31m-    switch (value->type) {[m
[31m-    case LUA_TSTRING:[m
[31m-[m
[31m-        if (value->value.s.data == NULL || value->value.s.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "no string buffer "[m
[31m-                          "initialized");[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (len > value->value.s.len) {[m
[31m-            len = value->value.s.len;[m
[31m-[m
[31m-        } else {[m
[31m-            value->value.s.len = len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(value->value.s.data, data, len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-[m
[31m-        if (len != sizeof(double)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua number "[m
[31m-                          "value size found for key %*s: %lu", key_len,[m
[31m-                          key_data, (unsigned long) len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(&value->value.b, data, len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-[m
[31m-        if (len != sizeof(u_char)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua boolean "[m
[31m-                          "value size found for key %*s: %lu", key_len,[m
[31m-                          key_data, (unsigned long) len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value->value.b = *data;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua value type "[m
[31m-                      "found for key %*s: %d", key_len, key_data,[m
[31m-                      (int) value->type);[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_shm_zone_t *[m
[31m-ngx_http_lua_find_zone(u_char *name_data, size_t name_len)[m
[31m-{[m
[31m-    ngx_str_t                       *name;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_shm_zone_t                  *zone;[m
[31m-    volatile ngx_list_part_t        *part;[m
[31m-[m
[31m-    part = &ngx_cycle->shared_memory.part;[m
[31m-    zone = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            zone = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        name = &zone[i].shm.name;[m
[31m-[m
[31m-        dd("name: [%.*s] %d", (int) name->len, name->data, (int) name->len);[m
[31m-        dd("name2: [%.*s] %d", (int) name_len, name_data, (int) name_len);[m
[31m-[m
[31m-        if (name->len == name_len[m
[31m-            && ngx_strncmp(name->data, name_data, name_len) == 0)[m
[31m-        {[m
[31m-            return &zone[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key,[m
[31m-    size_t key_len, int value_type, u_char *str_value_buf,[m
[31m-    size_t str_value_len, double num_value, int exptime, int user_flags,[m
[31m-    char **errmsg, int *forcible)[m
[31m-{[m
[31m-    int                          i, n;[m
[31m-    u_char                       c, *p;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-[m
[31m-    if (zone == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("exptime: %d", exptime);[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    *forcible = 0;[m
[31m-[m
[31m-    hash = ngx_crc32_short(key, key_len);[m
[31m-[m
[31m-    switch (value_type) {[m
[31m-    case LUA_TSTRING:[m
[31m-        /* do nothing */[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-        dd("num value: %lf", num_value);[m
[31m-        str_value_buf = (u_char *) &num_value;[m
[31m-        str_value_len = sizeof(double);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-        c = num_value ? 1 : 0;[m
[31m-        str_value_buf = &c;[m
[31m-        str_value_len = sizeof(u_char);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNIL:[m
[31m-        if (op & (NGX_HTTP_LUA_SHDICT_ADD|NGX_HTTP_LUA_SHDICT_REPLACE)) {[m
[31m-            *errmsg = "attempt to add or replace nil values";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        str_value_buf = NULL;[m
[31m-        str_value_len = 0;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        *errmsg = "unsupported value type";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);[m
[31m-[m
[31m-    dd("lookup returns %d", (int) rc);[m
[31m-[m
[31m-    if (op & NGX_HTTP_LUA_SHDICT_REPLACE) {[m
[31m-[m
[31m-        if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            *errmsg = "not found";[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-        /* rc == NGX_OK */[m
[31m-[m
[31m-        goto replace;[m
[31m-    }[m
[31m-[m
[31m-    if (op & NGX_HTTP_LUA_SHDICT_ADD) {[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            *errmsg = "exists";[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            /* exists but expired */[m
[31m-[m
[31m-            dd("go to replace");[m
[31m-            goto replace;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_DECLINED */[m
[31m-[m
[31m-        dd("go to insert");[m
[31m-        goto insert;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DONE) {[m
[31m-[m
[31m-        if (value_type == LUA_TNIL) {[m
[31m-            goto remove;[m
[31m-        }[m
[31m-[m
[31m-replace:[m
[31m-[m
[31m-        if (str_value_buf && str_value_len == (size_t) sd->value_len) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                           "lua shared dict set: found old entry and value "[m
[31m-                           "size matched, reusing it");[m
[31m-[m
[31m-            ngx_queue_remove(&sd->queue);[m
[31m-            ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-            sd->key_len = (u_short) key_len;[m
[31m-[m
[31m-            if (exptime > 0) {[m
[31m-                tp = ngx_timeofday();[m
[31m-                sd->expires = (uint64_t) tp->sec * 1000 + tp->msec[m
[31m-                              + (uint64_t) exptime;[m
[31m-[m
[31m-            } else {[m
[31m-                sd->expires = 0;[m
[31m-            }[m
[31m-[m
[31m-            sd->user_flags = user_flags;[m
[31m-[m
[31m-            sd->value_len = (uint32_t) str_value_len;[m
[31m-[m
[31m-            dd("setting value type to %d", value_type);[m
[31m-[m
[31m-            sd->value_type = (uint8_t) value_type;[m
[31m-[m
[31m-            p = ngx_copy(sd->data, key, key_len);[m
[31m-            ngx_memcpy(p, str_value_buf, str_value_len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                       "lua shared dict set: found old entry but value size "[m
[31m-                       "NOT matched, removing it first");[m
[31m-[m
[31m-remove:[m
[31m-[m
[31m-        ngx_queue_remove(&sd->queue);[m
[31m-[m
[31m-        node = (ngx_rbtree_node_t *)[m
[31m-                   ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-        ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-        ngx_slab_free_locked(ctx->shpool, node);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-insert:[m
[31m-[m
[31m-    /* rc == NGX_DECLINED or value size unmatch */[m
[31m-[m
[31m-    if (str_value_buf == NULL) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "lua shared dict set: creating a new entry");[m
[31m-[m
[31m-    n = offsetof(ngx_rbtree_node_t, color)[m
[31m-        + offsetof(ngx_http_lua_shdict_node_t, data)[m
[31m-        + key_len[m
[31m-        + str_value_len;[m
[31m-[m
[31m-    node = ngx_slab_alloc_locked(ctx->shpool, n);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-[m
[31m-        if (op & NGX_HTTP_LUA_SHDICT_SAFE_STORE) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            *errmsg = "no memory";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                       "lua shared dict set: overriding non-expired items "[m
[31m-                       "due to memory shortage for entry \"%*s\"", key_len,[m
[31m-                       key);[m
[31m-[m
[31m-        for (i = 0; i < 30; i++) {[m
[31m-            if (ngx_http_lua_shdict_expire(ctx, 0) == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *forcible = 1;[m
[31m-[m
[31m-            node = ngx_slab_alloc_locked(ctx->shpool, n);[m
[31m-            if (node != NULL) {[m
[31m-                goto allocated;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        *errmsg = "no memory";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-allocated:[m
[31m-[m
[31m-    sd = (ngx_http_lua_shdict_node_t *) &node->color;[m
[31m-[m
[31m-    node->key = hash;[m
[31m-    sd->key_len = (u_short) key_len;[m
[31m-[m
[31m-    if (exptime > 0) {[m
[31m-        tp = ngx_timeofday();[m
[31m-        sd->expires = (uint64_t) tp->sec * 1000 + tp->msec[m
[31m-                      + (uint64_t) exptime;[m
[31m-[m
[31m-    } else {[m
[31m-        sd->expires = 0;[m
[31m-    }[m
[31m-[m
[31m-    sd->user_flags = user_flags;[m
[31m-    sd->value_len = (uint32_t) str_value_len;[m
[31m-    dd("setting value type to %d", value_type);[m
[31m-    sd->value_type = (uint8_t) value_type;[m
[31m-[m
[31m-    p = ngx_copy(sd->data, key, key_len);[m
[31m-    ngx_memcpy(p, str_value_buf, str_value_len);[m
[31m-[m
[31m-    ngx_rbtree_insert(&ctx->sh->rbtree, node);[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_shdict_get(ngx_shm_zone_t *zone, u_char *key,[m
[31m-    size_t key_len, int *value_type, u_char **str_value_buf,[m
[31m-    size_t *str_value_len, double *num_value, int *user_flags,[m
[31m-    int get_stale, int *is_stale)[m
[31m-{[m
[31m-    ngx_str_t                    name;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_str_t                    value;[m
[31m-[m
[31m-    if (zone == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-    name = ctx->name;[m
[31m-[m
[31m-    hash = ngx_crc32_short(key, key_len);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "fetching key \"%*s\" in shared dict \"%V\"", key_len,[m
[31m-                   key, &name);[m
[31m-#endif /* NGX_DEBUG */[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    if (!get_stale) {[m
[31m-        ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returns %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || (rc == NGX_DONE && !get_stale)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        *value_type = LUA_TNIL;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || (rc == NGX_DONE && get_stale) */[m
[31m-[m
[31m-    *value_type = sd->value_type;[m
[31m-[m
[31m-    dd("data: %p", sd->data);[m
[31m-    dd("key len: %d", (int) sd->key_len);[m
[31m-[m
[31m-    value.data = sd->data + sd->key_len;[m
[31m-    value.len = (size_t) sd->value_len;[m
[31m-[m
[31m-    if (*str_value_len < (size_t) value.len) {[m
[31m-        if (*value_type == LUA_TBOOLEAN) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (*value_type == LUA_TSTRING) {[m
[31m-            *str_value_buf = malloc(value.len);[m
[31m-            if (*str_value_buf == NULL) {[m
[31m-                ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (*value_type) {[m
[31m-    case LUA_TSTRING:[m
[31m-        *str_value_len = value.len;[m
[31m-        ngx_memcpy(*str_value_buf, value.data, value.len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-[m
[31m-        if (value.len != sizeof(double)) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                          "bad lua number value size found for key %*s "[m
[31m-                          "in shared_dict %V: %z", key_len, key,[m
[31m-                          &name, value.len);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *str_value_len = value.len;[m
[31m-        ngx_memcpy(num_value, value.data, sizeof(double));[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-[m
[31m-        if (value.len != sizeof(u_char)) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                          "bad lua boolean value size found for key %*s "[m
[31m-                          "in shared_dict %V: %z", key_len, key, &name,[m
[31m-                          value.len);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(*str_value_buf, value.data, value.len);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                      "bad value type found for key %*s in "[m
[31m-                      "shared_dict %V: %d", key_len, key, &name,[m
[31m-                      *value_type);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *user_flags = sd->user_flags;[m
[31m-    dd("user flags: %d", *user_flags);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    if (get_stale) {[m
[31m-[m
[31m-        /* always return value, flags, stale */[m
[31m-[m
[31m-        *is_stale = (rc == NGX_DONE);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key,[m
[31m-    size_t key_len, double *value, char **err)[m
[31m-{[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    double                       num;[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-    hash = ngx_crc32_short(key, key_len);[m
[31m-[m
[31m-    dd("looking up key %.*s in shared dict %.*s", (int) key_len, key,[m
[31m-       (int) ctx->name.len, ctx->name.data);[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-#if 1[m
[31m-    ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-#endif[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        *err = "not found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    if (sd->value_type != LUA_TNUMBER || sd->value_len != sizeof(double)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        *err = "not a number";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(&sd->queue);[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-    dd("setting value type to %d", (int) sd->value_type);[m
[31m-[m
[31m-    p = sd->data + key_len;[m
[31m-[m
[31m-    ngx_memcpy(&num, p, sizeof(double));[m
[31m-    num += *value;[m
[31m-[m
[31m-    ngx_memcpy(p, (double *) &num, sizeof(double));[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    *value = num;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_shdict_flush_all(ngx_shm_zone_t *zone)[m
[31m-{[m
[31m-    ngx_queue_t                 *q;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    for (q = ngx_queue_head(&ctx->sh->queue);[m
[31m-         q != ngx_queue_sentinel(&ctx->sh->queue);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-        sd->expires = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_shdict_expire(ctx, 0);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_shdict.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_shdict.h[m
[1mdeleted file mode 100644[m
[1mindex aa1bb58..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_shdict.h[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SHDICT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SHDICT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                       color;[m
[31m-    u_char                       dummy;[m
[31m-    u_short                      key_len;[m
[31m-    ngx_queue_t                  queue;[m
[31m-    uint64_t                     expires;[m
[31m-    uint8_t                      value_type;[m
[31m-    uint32_t                     value_len;[m
[31m-    uint32_t                     user_flags;[m
[31m-    u_char                       data[1];[m
[31m-} ngx_http_lua_shdict_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t                  rbtree;[m
[31m-    ngx_rbtree_node_t             sentinel;[m
[31m-    ngx_queue_t                   queue;[m
[31m-} ngx_http_lua_shdict_shctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_shdict_shctx_t  *sh;[m
[31m-    ngx_slab_pool_t              *shpool;[m
[31m-    ngx_str_t                     name;[m
[31m-    ngx_http_lua_main_conf_t     *main_conf;[m
[31m-    ngx_log_t                    *log;[m
[31m-    ngx_cycle_t                  *cycle;[m
[31m-} ngx_http_lua_shdict_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data);[m
[31m-void ngx_http_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-void ngx_http_lua_inject_shdict_api(ngx_http_lua_main_conf_t *lmcf,[m
[31m-    lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SHDICT_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_sleep.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_sleep.c[m
[1mdeleted file mode 100644[m
[1mindex a887c3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_sleep.c[m
[1m+++ /dev/null[m
[36m@@ -1,192 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_sleep.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_sleep(lua_State *L);[m
[31m-static void ngx_http_lua_sleep_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_sleep_cleanup(void *data);[m
[31m-static ngx_int_t ngx_http_lua_sleep_resume(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_sleep(lua_State *L)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_int_t                    delay; /* in msec */[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "attempt to pass %d arguments, but accepted 1", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    delay = (ngx_int_t) (luaL_checknumber(L, 1) * 1000);[m
[31m-[m
[31m-    if (delay < 0) {[m
[31m-        return luaL_error(L, "invalid sleep duration \"%d\"", delay);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_sleep_cleanup;[m
[31m-    coctx->data = r;[m
[31m-[m
[31m-    coctx->sleep.handler = ngx_http_lua_sleep_handler;[m
[31m-    coctx->sleep.data = coctx;[m
[31m-    coctx->sleep.log = r->connection->log;[m
[31m-[m
[31m-    dd("adding timer with delay %lu ms, r:%.*s", (unsigned long) delay,[m
[31m-       (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    ngx_add_timer(&coctx->sleep, (ngx_msec_t) delay);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua ready to sleep for %d ms", delay);[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_sleep_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_log_ctx_t      *log_ctx;[m
[31m-    ngx_http_lua_co_ctx_t   *coctx;[m
[31m-[m
[31m-    coctx = ev->data;[m
[31m-[m
[31m-    r = coctx->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->fd != (ngx_socket_t) -1) {  /* not a fake connection */[m
[31m-        log_ctx = c->log->data;[m
[31m-        log_ctx->current_request = r;[m
[31m-    }[m
[31m-[m
[31m-    coctx->cleanup = NULL;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua sleep timer expired: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        (void) ngx_http_lua_sleep_resume(r);[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->resume_handler = ngx_http_lua_sleep_resume;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_sleep_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_sleep);[m
[31m-    lua_setfield(L, -2, "sleep");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_sleep_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t          *coctx = data;[m
[31m-[m
[31m-    if (coctx->sleep.timer_set) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "lua clean up the timer for pending ngx.sleep");[m
[31m-[m
[31m-        ngx_del_timer(&coctx->sleep);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_sleep_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_sleep.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_sleep.h[m
[1mdeleted file mode 100644[m
[1mindex 80c79b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_sleep.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SLEEP_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SLEEP_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_sleep_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SLEEP_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.c[m
[1mdeleted file mode 100644[m
[1mindex 2bfdbd3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.c[m
[1m+++ /dev/null[m
[36m@@ -1,5322 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_socket_tcp.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_uthread.h"[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_socket_tcp(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_connect(lua_State *L);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static int ngx_http_lua_socket_tcp_sslhandshake(lua_State *L);[m
[31m-#endif[m
[31m-static int ngx_http_lua_socket_tcp_receive(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_send(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_close(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_setoption(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_settimeout(lua_State *L);[m
[31m-static void ngx_http_lua_socket_tcp_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_get_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static void ngx_http_lua_socket_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_send_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_connected_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_tcp_cleanup(void *data);[m
[31m-static void ngx_http_lua_socket_tcp_finalize(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_tcp_finalize_read_part(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_tcp_finalize_write_part(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_socket_send(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_socket_test_connect(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c);[m
[31m-static void ngx_http_lua_socket_handle_conn_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_lua_socket_handle_read_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_lua_socket_handle_write_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_lua_socket_handle_conn_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_handle_read_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_handle_write_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static int ngx_http_lua_socket_tcp_send_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_conn_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static void ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_read(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static int ngx_http_lua_socket_tcp_receive_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_read_line(void *data, ssize_t bytes);[m
[31m-static void ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static int ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static int ngx_http_lua_socket_conn_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static int ngx_http_lua_socket_read_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static int ngx_http_lua_socket_write_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_read_all(void *data, ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_lua_socket_read_until(void *data, ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_lua_socket_read_chunk(void *data, ssize_t bytes);[m
[31m-static int ngx_http_lua_socket_tcp_receiveuntil(lua_State *L);[m
[31m-static int ngx_http_lua_socket_receiveuntil_iterator(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_compile_pattern(u_char *data, size_t len,[m
[31m-    ngx_http_lua_socket_compiled_pattern_t *cp, ngx_log_t *log);[m
[31m-static int ngx_http_lua_socket_cleanup_compiled_pattern(lua_State *L);[m
[31m-static int ngx_http_lua_req_socket(lua_State *L);[m
[31m-static void ngx_http_lua_req_socket_rev_handler(ngx_http_request_t *r);[m
[31m-static int ngx_http_lua_socket_tcp_getreusedtimes(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_setkeepalive(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_get_keepalive_peer(ngx_http_request_t *r,[m
[31m-    lua_State *L, int key_index,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_keepalive_dummy_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_http_lua_socket_keepalive_close_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_socket_keepalive_rev_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_socket_free_pool(ngx_log_t *log,[m
[31m-    ngx_http_lua_socket_pool_t *spool);[m
[31m-static int ngx_http_lua_socket_tcp_upstream_destroy(lua_State *L);[m
[31m-static int ngx_http_lua_socket_downstream_destroy(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_push_input_data(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_socket_tcp_upstream_t *u,[m
[31m-    lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_add_pending_data(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, u_char *pos, size_t len, u_char *pat,[m
[31m-    int prefix, int old_state);[m
[31m-static ngx_int_t ngx_http_lua_socket_add_input_buffer(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_socket_insert_buffer(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, u_char *pat, size_t prefix);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_conn_resume(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_read_resume(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_write_resume(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_resume_helper(ngx_http_request_t *r,[m
[31m-    int socket_op);[m
[31m-static void ngx_http_lua_tcp_resolve_cleanup(void *data);[m
[31m-static void ngx_http_lua_coctx_cleanup(void *data);[m
[31m-static int ngx_http_lua_socket_shutdown_pool(lua_State *L);[m
[31m-static void[m
[31m-    ngx_http_lua_socket_empty_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static int ngx_http_lua_socket_prepare_error_retvals(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L, ngx_uint_t ft_type);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static int ngx_http_lua_ssl_handshake_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static void ngx_http_lua_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-static int ngx_http_lua_ssl_free_session(lua_State *L);[m
[31m-#endif[m
[31m-static void ngx_http_lua_socket_tcp_close_connection(ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SOCKET_CTX_INDEX = 1,[m
[31m-    SOCKET_TIMEOUT_INDEX = 2,[m
[31m-    SOCKET_KEY_INDEX = 3[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SOCKET_OP_CONNECT,[m
[31m-    SOCKET_OP_READ,[m
[31m-    SOCKET_OP_WRITE[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_socket_check_busy_connecting(r, u, L)                   \[m
[31m-    if ((u)->conn_waiting) {                                                 \[m
[31m-        lua_pushnil(L);                                                      \[m
[31m-        lua_pushliteral(L, "socket busy connecting");                        \[m
[31m-        return 2;                                                            \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_socket_check_busy_reading(r, u, L)                      \[m
[31m-    if ((u)->read_waiting) {                                                 \[m
[31m-        lua_pushnil(L);                                                      \[m
[31m-        lua_pushliteral(L, "socket busy reading");                           \[m
[31m-        return 2;                                                            \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_socket_check_busy_writing(r, u, L)                      \[m
[31m-    if ((u)->write_waiting) {                                                \[m
[31m-        lua_pushnil(L);                                                      \[m
[31m-        lua_pushliteral(L, "socket busy writing");                           \[m
[31m-        return 2;                                                            \[m
[31m-    }                                                                        \[m
[31m-    if ((u)->raw_downstream                                                  \[m
[31m-        && ((r)->connection->buffered & NGX_HTTP_LOWLEVEL_BUFFERED))         \[m
[31m-    {                                                                        \[m
[31m-        lua_pushnil(L);                                                      \[m
[31m-        lua_pushliteral(L, "socket busy writing");                           \[m
[31m-        return 2;                                                            \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-static char ngx_http_lua_req_socket_metatable_key;[m
[31m-static char ngx_http_lua_raw_req_socket_metatable_key;[m
[31m-static char ngx_http_lua_tcp_socket_metatable_key;[m
[31m-static char ngx_http_lua_upstream_udata_metatable_key;[m
[31m-static char ngx_http_lua_downstream_udata_metatable_key;[m
[31m-static char ngx_http_lua_pool_udata_metatable_key;[m
[31m-static char ngx_http_lua_pattern_udata_metatable_key;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static char ngx_http_lua_ssl_session_metatable_key;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_socket_tcp_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-[m
[31m-    lua_createtable(L, 0, 4 /* nrec */);    /* ngx.socket */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -3, "tcp");[m
[31m-    lua_setfield(L, -2, "stream");[m
[31m-[m
[31m-    {[m
[31m-        const char  buf[] = "local sock = ngx.socket.tcp()"[m
[31m-                            " local ok, err = sock:connect(...)"[m
[31m-                            " if ok then return sock else return nil, err end";[m
[31m-[m
[31m-        rc = luaL_loadbuffer(L, buf, sizeof(buf) - 1, "=ngx.socket.connect");[m
[31m-    }[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, 0,[m
[31m-                      "failed to load Lua code for ngx.socket.connect(): %i",[m
[31m-                      rc);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_setfield(L, -2, "connect");[m
[31m-    }[m
[31m-[m
[31m-    lua_setfield(L, -2, "socket");[m
[31m-[m
[31m-    /* {{{req socket object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_req_socket_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 4 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receive);[m
[31m-    lua_setfield(L, -2, "receive");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receiveuntil);[m
[31m-    lua_setfield(L, -2, "receiveuntil");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_settimeout);[m
[31m-    lua_setfield(L, -2, "settimeout"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{raw req socket object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_raw_req_socket_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 5 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receive);[m
[31m-    lua_setfield(L, -2, "receive");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receiveuntil);[m
[31m-    lua_setfield(L, -2, "receiveuntil");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_send);[m
[31m-    lua_setfield(L, -2, "send");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_settimeout);[m
[31m-    lua_setfield(L, -2, "settimeout"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{tcp object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_tcp_socket_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 11 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_connect);[m
[31m-    lua_setfield(L, -2, "connect");[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_sslhandshake);[m
[31m-    lua_setfield(L, -2, "sslhandshake");[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receive);[m
[31m-    lua_setfield(L, -2, "receive");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receiveuntil);[m
[31m-    lua_setfield(L, -2, "receiveuntil");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_send);[m
[31m-    lua_setfield(L, -2, "send");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_close);[m
[31m-    lua_setfield(L, -2, "close");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_setoption);[m
[31m-    lua_setfield(L, -2, "setoption");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_settimeout);[m
[31m-    lua_setfield(L, -2, "settimeout"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_getreusedtimes);[m
[31m-    lua_setfield(L, -2, "getreusedtimes");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_setkeepalive);[m
[31m-    lua_setfield(L, -2, "setkeepalive");[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{upstream userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_upstream_udata_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_upstream_destroy);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{downstream userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_downstream_udata_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_downstream_destroy);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{socket pool userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_pool_udata_metatable_key);[m
[31m-    lua_createtable(L, 0, 1); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_shutdown_pool);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{socket compiled pattern userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_pattern_udata_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_cleanup_compiled_pattern);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    /* {{{ssl session userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_ssl_session_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ssl_free_session);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_socket_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_req_socket);[m
[31m-    lua_setfield(L, -2, "socket");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    if (lua_gettop(L) != 0) {[m
[31m-        return luaL_error(L, "expecting zero arguments, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    lua_createtable(L, 3 /* narr */, 1 /* nrec */);[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_tcp_socket_metatable_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    dd("top: %d", lua_gettop(L));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_connect(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_str_t                    host;[m
[31m-    int                          port;[m
[31m-    ngx_resolver_ctx_t          *rctx, temp;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    int                          saved_top;[m
[31m-    int                          n;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_url_t                    url;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_peer_connection_t       *pc;[m
[31m-    int                          timeout;[m
[31m-    unsigned                     custom_pool;[m
[31m-    int                          key_index;[m
[31m-    const char                  *msg;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 2 && n != 3 && n != 4) {[m
[31m-        return luaL_error(L, "ngx.socket connect: expecting 2, 3, or 4 "[m
[31m-                          "arguments (including the object), but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    key_index = 2;[m
[31m-    custom_pool = 0;[m
[31m-[m
[31m-    if (lua_type(L, n) == LUA_TTABLE) {[m
[31m-[m
[31m-        /* found the last optional option table */[m
[31m-[m
[31m-        lua_getfield(L, n, "pool");[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-        case LUA_TNUMBER:[m
[31m-            lua_tostring(L, -1);[m
[31m-[m
[31m-        case LUA_TSTRING:[m
[31m-            custom_pool = 1;[m
[31m-[m
[31m-            lua_pushvalue(L, -1);[m
[31m-            lua_rawseti(L, 1, SOCKET_KEY_INDEX);[m
[31m-[m
[31m-            key_index = n + 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TNIL:[m
[31m-            lua_pop(L, 2);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "bad \"pool\" option type: %s",[m
[31m-                                  luaL_typename(L, -1));[m
[31m-            luaL_argerror(L, n, msg);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        n--;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 3) {[m
[31m-        port = luaL_checkinteger(L, 3);[m
[31m-[m
[31m-        if (port < 0 || port > 65536) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "bad port number: %d", port);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (!custom_pool) {[m
[31m-            lua_pushliteral(L, ":");[m
[31m-            lua_insert(L, 3);[m
[31m-            lua_concat(L, 3);[m
[31m-        }[m
[31m-[m
[31m-        dd("socket key: %s", lua_tostring(L, -1));[m
[31m-[m
[31m-    } else { /* n == 2 */[m
[31m-        port = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!custom_pool) {[m
[31m-        /* the key's index is 2 */[m
[31m-[m
[31m-        lua_pushvalue(L, 2);[m
[31m-        lua_rawseti(L, 1, SOCKET_KEY_INDEX);[m
[31m-    }[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u) {[m
[31m-        if (u->request && u->request != r) {[m
[31m-            return luaL_error(L, "bad request");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-        ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-        ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-        if (u->body_downstream || u->raw_downstream) {[m
[31m-            return luaL_error(L, "attempt to re-connect a request socket");[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.connection) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua tcp socket reconnect without shutting down");[m
[31m-[m
[31m-            ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua reuse socket upstream ctx");[m
[31m-[m
[31m-    } else {[m
[31m-        u = lua_newuserdata(L, sizeof(ngx_http_lua_socket_tcp_upstream_t));[m
[31m-        if (u == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_upstream_udata_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-#endif[m
[31m-[m
[31m-        lua_rawseti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u, sizeof(ngx_http_lua_socket_tcp_upstream_t));[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    u->request = r; /* set the controlling request */[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    u->conf = llcf;[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-[m
[31m-    pc->log = r->connection->log;[m
[31m-    pc->log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    dd("lua peer connection log: %p", pc->log);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_TIMEOUT_INDEX);[m
[31m-    timeout = (ngx_int_t) lua_tointeger(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (timeout > 0) {[m
[31m-        u->send_timeout = (ngx_msec_t) timeout;[m
[31m-        u->read_timeout = (ngx_msec_t) timeout;[m
[31m-        u->connect_timeout = (ngx_msec_t) timeout;[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_timeout = u->conf->read_timeout;[m
[31m-        u->send_timeout = u->conf->send_timeout;[m
[31m-        u->connect_timeout = u->conf->connect_timeout;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_get_keepalive_peer(r, L, key_index, u);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        lua_pushinteger(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "error in get keepalive peer");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    /* TODO: we should avoid this in-pool allocation */[m
[31m-[m
[31m-    host.data = ngx_palloc(r->pool, len + 1);[m
[31m-    if (host.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    host.len = len;[m
[31m-[m
[31m-    ngx_memcpy(host.data, p, len);[m
[31m-    host.data[len] = '\0';[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.len = host.len;[m
[31m-    url.url.data = host.data;[m
[31m-    url.default_port = (in_port_t) port;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        lua_pushnil(L);[m
[31m-[m
[31m-        if (url.err) {[m
[31m-            lua_pushfstring(L, "failed to parse host name \"%s\": %s",[m
[31m-                            host.data, url.err);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushfstring(L, "failed to parse host name \"%s\"", host.data);[m
[31m-        }[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket connect timeout: %M", u->connect_timeout);[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket network address given directly");[m
[31m-[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = host;[m
[31m-        u->resolved->port = (in_port_t) port;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved->sockaddr) {[m
[31m-        rc = ngx_http_lua_socket_resolve_retval_handler(r, u, L);[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return lua_yield(L, 0);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    temp.name = host;[m
[31m-    rctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-    if (rctx == NULL) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to start the resolver");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (rctx == NGX_NO_RESOLVER) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "no resolver defined to resolve \"%s\"", host.data);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    rctx->name = host;[m
[31m-#if !defined(nginx_version) || nginx_version < 1005008[m
[31m-    rctx->type = NGX_RESOLVE_A;[m
[31m-#endif[m
[31m-    rctx->handler = ngx_http_lua_socket_resolve_handler;[m
[31m-    rctx->data = u;[m
[31m-    rctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-    u->resolved->ctx = rctx;[m
[31m-    u->write_co_ctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_tcp_resolve_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    saved_top = lua_gettop(L);[m
[31m-[m
[31m-    if (ngx_resolve_name(rctx) != NGX_OK) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket fail to run resolver immediately");[m
[31m-[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-[m
[31m-        u->resolved->ctx = NULL;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "%s could not be resolved", host.data);[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->conn_waiting) {[m
[31m-        dd("resolved and already connecting");[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    n = lua_gettop(L) - saved_top;[m
[31m-    if (n) {[m
[31m-        dd("errors occurred during resolving or connecting"[m
[31m-           "or already connected");[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    /* still resolving */[m
[31m-[m
[31m-    u->conn_waiting = 1;[m
[31m-    u->write_prepare_retvals = ngx_http_lua_socket_resolve_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_empty_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    /* do nothing */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_upstream_resolved_t        *ur;[m
[31m-    ngx_http_lua_ctx_t                  *lctx;[m
[31m-    lua_State                           *L;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-#if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    socklen_t                            socklen;[m
[31m-    struct sockaddr                     *sockaddr;[m
[31m-#else[m
[31m-    struct sockaddr_in                  *sin;[m
[31m-#endif[m
[31m-    ngx_uint_t                           i;[m
[31m-    unsigned                             waiting;[m
[31m-[m
[31m-    u = ctx->data;[m
[31m-    r = u->request;[m
[31m-    c = r->connection;[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua tcp socket resolve handler");[m
[31m-[m
[31m-    lctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (lctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lctx->cur_co_ctx = u->write_co_ctx;[m
[31m-[m
[31m-    u->write_co_ctx->cleanup = NULL;[m
[31m-[m
[31m-    L = lctx->cur_co_ctx->co;[m
[31m-[m
[31m-    waiting = u->conn_waiting;[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "lua tcp socket resolver error: %s "[m
[31m-                       "(connect waiting: %d)",[m
[31m-                       ngx_resolver_strerror(ctx->state), (int) waiting);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len);[m
[31m-        lua_pushfstring(L, " could not be resolved (%d: %s)",[m
[31m-                        (int) ctx->state,[m
[31m-                        ngx_resolver_strerror(ctx->state));[m
[31m-        lua_concat(L, 2);[m
[31m-[m
[31m-        u->write_prepare_retvals =[m
[31m-                                ngx_http_lua_socket_conn_error_retval_handler;[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_RESOLVER);[m
[31m-[m
[31m-        if (waiting) {[m
[31m-            ngx_http_run_posted_requests(c);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ur->naddrs = ctx->naddrs;[m
[31m-    ur->addrs = ctx->addrs;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-#   if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    u_char      text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t   addr;[m
[31m-#   else[m
[31m-    in_addr_t   addr;[m
[31m-#   endif[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-#   if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-    }[m
[31m-#   else[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        dd("addr i: %d %p", (int) i,  &ctx->addrs[i]);[m
[31m-[m
[31m-        addr = ntohl(ctx->addrs[i]);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "name was resolved to %ud.%ud.%ud.%ud",[m
[31m-                       (addr >> 24) & 0xff, (addr >> 16) & 0xff,[m
[31m-                       (addr >> 8) & 0xff, addr & 0xff);[m
[31m-    }[m
[31m-#   endif[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_assert(ur->naddrs > 0);[m
[31m-[m
[31m-    if (ur->naddrs == 1) {[m
[31m-        i = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        i = ngx_random() % ur->naddrs;[m
[31m-    }[m
[31m-[m
[31m-    dd("selected addr index: %d", (int) i);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    socklen = ur->addrs[i].socklen;[m
[31m-[m
[31m-    sockaddr = ngx_palloc(r->pool, socklen);[m
[31m-    if (sockaddr == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);[m
[31m-[m
[31m-    switch (sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        ((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);[m
[31m-        break;[m
[31m-#endif[m
[31m-    default: /* AF_INET */[m
[31m-        ((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);[m
[31m-    ur->sockaddr = sockaddr;[m
[31m-    ur->socklen = socklen;[m
[31m-[m
[31m-#else[m
[31m-    /* for nginx older than 1.5.8 */[m
[31m-[m
[31m-    len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    sin = (struct sockaddr_in *) &p[len];[m
[31m-    ngx_memzero(sin, sizeof(struct sockaddr_in));[m
[31m-[m
[31m-    len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);[m
[31m-    len = ngx_sprintf(&p[len], ":%d", ur->port) - p;[m
[31m-[m
[31m-    sin->sin_family = AF_INET;[m
[31m-    sin->sin_port = htons(ur->port);[m
[31m-    sin->sin_addr.s_addr = ur->addrs[i];[m
[31m-[m
[31m-    ur->sockaddr = (struct sockaddr *) sin;[m
[31m-    ur->socklen = sizeof(struct sockaddr_in);[m
[31m-#endif[m
[31m-[m
[31m-    ur->host.data = p;[m
[31m-    ur->host.len = len;[m
[31m-    ur->naddrs = 1;[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-    ur->ctx = NULL;[m
[31m-[m
[31m-    u->conn_waiting = 0;[m
[31m-    u->write_co_ctx = NULL;[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        lctx->resume_handler = ngx_http_lua_socket_tcp_conn_resume;[m
[31m-        r->write_event_handler(r);[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    } else {[m
[31m-        (void) ngx_http_lua_socket_resolve_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    if (ur->ctx) {[m
[31m-        ngx_resolve_name_done(ctx);[m
[31m-        ur->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    u->write_prepare_retvals = ngx_http_lua_socket_conn_error_retval_handler;[m
[31m-    ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                          NGX_HTTP_LUA_SOCKET_FT_NOMEM);[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        dd("run posted requests");[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_peer_connection_t           *pc;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_cleanup_t              *cln;[m
[31m-    ngx_http_upstream_resolved_t    *ur;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_lua_co_ctx_t           *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket resolve retval handler");[m
[31m-[m
[31m-    if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_RESOLVER) {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    if (ur->sockaddr) {[m
[31m-        pc->sockaddr = ur->sockaddr;[m
[31m-        pc->socklen = ur->socklen;[m
[31m-        pc->name = &ur->host;[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "resolver not working");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    pc->get = ngx_http_lua_socket_tcp_get_peer;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(pc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup == NULL) {[m
[31m-        cln = ngx_http_lua_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "no memory");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_socket_tcp_cleanup;[m
[31m-        cln->data = u;[m
[31m-        u->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return ngx_http_lua_socket_conn_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no live connection");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        dd("socket errno: %d", (int) ngx_socket_errno);[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-        return ngx_http_lua_socket_conn_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN */[m
[31m-[m
[31m-    c = pc->connection;[m
[31m-[m
[31m-    c->data = u;[m
[31m-[m
[31m-    c->write->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-    c->read->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_lua_socket_connected_handler;[m
[31m-    u->read_event_handler = ngx_http_lua_socket_connected_handler;[m
[31m-[m
[31m-    c->sendfile &= r->connection->sendfile;[m
[31m-[m
[31m-    if (c->pool == NULL) {[m
[31m-[m
[31m-        /* we need separate pool here to be able to cache SSL connections */[m
[31m-[m
[31m-        c->pool = ngx_create_pool(128, r->connection->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            return ngx_http_lua_socket_prepare_error_retvals(r, u, L,[m
[31m-                                                NGX_HTTP_LUA_SOCKET_FT_NOMEM);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log = r->connection->log;[m
[31m-    c->pool->log = c->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */[m
[31m-[m
[31m-#if 0[m
[31m-    u->writer.out = NULL;[m
[31m-    u->writer.last = &u->writer.out;[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket connected: fd:%d", (int) c->fd);[m
[31m-[m
[31m-        /* We should delete the current write/read event[m
[31m-         * here because the socket object may not be used immediately[m
[31m-         * on the Lua land, thus causing hot spin around level triggered[m
[31m-         * event poll and wasting CPU cycles. */[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                                  NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "failed to handle write event");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                                  NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "failed to handle read event");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-        u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-        lua_pushinteger(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    ngx_add_timer(c->write, u->connect_timeout);[m
[31m-[m
[31m-    u->write_co_ctx = ctx->cur_co_ctx;[m
[31m-    u->conn_waiting = 1;[m
[31m-    u->write_prepare_retvals = ngx_http_lua_socket_tcp_conn_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_conn_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_uint_t      ft_type;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket error retval handler");[m
[31m-[m
[31m-    if (u->write_co_ctx) {[m
[31m-        u->write_co_ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-[m
[31m-    ft_type = u->ft_type;[m
[31m-    u->ft_type = 0;[m
[31m-    return ngx_http_lua_socket_prepare_error_retvals(r, u, L, ft_type);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_sslhandshake(lua_State *L)[m
[31m-{[m
[31m-    int                      n, top;[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_str_t                name = ngx_null_string;[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_ssl_session_t      **psession;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_lua_co_ctx_t   *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    /* Lua function arguments: self [,session] [,host] [,verify] */[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n < 1 || n > 5) {[m
[31m-        return luaL_error(L, "ngx.socket connect: expecting 1 ~ 5 "[m
[31m-                          "arguments (including the object), but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket ssl handshake");[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u == NULL[m
[31m-        || u->peer.connection == NULL[m
[31m-        || u->read_closed[m
[31m-        || u->write_closed)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "not supported for downstream");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    u->ssl_session_reuse = 1;[m
[31m-[m
[31m-    if (c->ssl && c->ssl->handshaked) {[m
[31m-        switch (lua_type(L, 2)) {[m
[31m-        case LUA_TUSERDATA:[m
[31m-            lua_pushvalue(L, 2);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TBOOLEAN:[m
[31m-            if (!lua_toboolean(L, 2)) {[m
[31m-                /* avoid generating the ssl session */[m
[31m-                lua_pushboolean(L, 1);[m
[31m-                break;[m
[31m-            }[m
[31m-            /* fall through */[m
[31m-[m
[31m-        default:[m
[31m-            ngx_http_lua_ssl_handshake_retval_handler(r, u, L);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(u->conf->ssl, c,[m
[31m-                                  NGX_SSL_BUFFER|NGX_SSL_CLIENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to create ssl connection");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    c->sendfile = 0;[m
[31m-[m
[31m-    if (n >= 2) {[m
[31m-        if (lua_type(L, 2) == LUA_TBOOLEAN) {[m
[31m-            u->ssl_session_reuse = lua_toboolean(L, 2);[m
[31m-[m
[31m-        } else {[m
[31m-            psession = lua_touserdata(L, 2);[m
[31m-[m
[31m-            if (psession != NULL && *psession != NULL) {[m
[31m-                if (ngx_ssl_set_session(c, *psession) != NGX_OK) {[m
[31m-                    lua_pushnil(L);[m
[31m-                    lua_pushliteral(L, "lua ssl set session failed");[m
[31m-                    return 2;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                               "lua ssl set session: %p:%d",[m
[31m-                               *psession, (*psession)->references);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n >= 3) {[m
[31m-            name.data = (u_char *) lua_tolstring(L, 3, &name.len);[m
[31m-[m
[31m-            if (name.data) {[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua ssl server name: \"%*s\"", name.len,[m
[31m-                               name.data);[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-                if (SSL_set_tlsext_host_name(c->ssl->connection, name.data)[m
[31m-                    == 0)[m
[31m-                {[m
[31m-                    lua_pushnil(L);[m
[31m-                    lua_pushliteral(L, "SSL_set_tlsext_host_name failed");[m
[31m-                    return 2;[m
[31m-                }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-               ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                              "lua socket SNI disabled because the current "[m
[31m-                              "version of OpenSSL lacks the support");[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            if (n >= 4) {[m
[31m-                u->ssl_verify = lua_toboolean(L, 4);[m
[31m-[m
[31m-                if (n >= 5) {[m
[31m-                    if (lua_toboolean(L, 5)) {[m
[31m-#ifdef NGX_HTTP_LUA_USE_OCSP[m
[31m-                        SSL_set_tlsext_status_type(c->ssl->connection,[m
[31m-                                                   TLSEXT_STATUSTYPE_ocsp);[m
[31m-#else[m
[31m-                        return luaL_error(L, "no OCSP support");[m
[31m-#endif[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("found sni name: %.*s %p", (int) name.len, name.data, name.data);[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        u->ssl_name.len = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        if (u->ssl_name.data) {[m
[31m-            /* buffer already allocated */[m
[31m-[m
[31m-            if (u->ssl_name.len >= name.len) {[m
[31m-                /* reuse it */[m
[31m-                ngx_memcpy(u->ssl_name.data, name.data, name.len);[m
[31m-                u->ssl_name.len = name.len;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_free(u->ssl_name.data);[m
[31m-                goto new_ssl_name;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-new_ssl_name:[m
[31m-[m
[31m-            u->ssl_name.data = ngx_alloc(name.len, ngx_cycle->log);[m
[31m-            if (u->ssl_name.data == NULL) {[m
[31m-                u->ssl_name.len = 0;[m
[31m-[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushliteral(L, "no memory");[m
[31m-                return 2;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(u->ssl_name.data, name.data, name.len);[m
[31m-            u->ssl_name.len = name.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->write_co_ctx = coctx;[m
[31m-[m
[31m-#if 0[m
[31m-#ifdef NGX_HTTP_LUA_USE_OCSP[m
[31m-    SSL_set_tlsext_status_type(c->ssl->connection, TLSEXT_STATUSTYPE_ocsp);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-    dd("ngx_ssl_handshake returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(c->read, u->connect_timeout);[m
[31m-[m
[31m-        u->conn_waiting = 1;[m
[31m-        u->write_prepare_retvals = ngx_http_lua_ssl_handshake_retval_handler;[m
[31m-[m
[31m-        ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-        coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-        coctx->data = u;[m
[31m-[m
[31m-        c->ssl->handler = ngx_http_lua_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-        } else {[m
[31m-            r->write_event_handler = ngx_http_core_run_phases;[m
[31m-        }[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    top = lua_gettop(L);[m
[31m-    ngx_http_lua_ssl_handshake_handler(c);[m
[31m-    return lua_gettop(L) - top;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    const char                  *err;[m
[31m-    int                          waiting;[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *dc;  /* downstream connection */[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    u = c->data;[m
[31m-    r = u->request;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-    c->read->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-[m
[31m-    waiting = u->conn_waiting;[m
[31m-[m
[31m-    dc = r->connection;[m
[31m-    L = u->write_co_ctx->co;[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "timeout");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        if (u->ssl_verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK) {[m
[31m-                lua_pushnil(L);[m
[31m-                err = lua_pushfstring(L, "%d: %s", (int) rc,[m
[31m-                                      X509_verify_cert_error_string(rc));[m
[31m-[m
[31m-                llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-                if (llcf->log_socket_errors) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, dc->log, 0, "lua ssl "[m
[31m-                                  "certificate verify error: (%s)", err);[m
[31m-                }[m
[31m-[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007000[m
[31m-[m
[31m-            if (u->ssl_name.len[m
[31m-                && ngx_ssl_check_host(c, &u->ssl_name) != NGX_OK)[m
[31m-            {[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushliteral(L, "certificate host mismatch");[m
[31m-[m
[31m-                llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-                if (llcf->log_socket_errors) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, dc->log, 0, "lua ssl "[m
[31m-                                  "certificate does not match host \"%V\"",[m
[31m-                                  &u->ssl_name);[m
[31m-                }[m
[31m-[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (waiting) {[m
[31m-            ngx_http_lua_socket_handle_conn_success(r, u);[m
[31m-[m
[31m-        } else {[m
[31m-            (void) ngx_http_lua_ssl_handshake_retval_handler(r, u, L);[m
[31m-        }[m
[31m-[m
[31m-        if (waiting) {[m
[31m-            ngx_http_run_posted_requests(dc);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushliteral(L, "handshake failed");[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        u->write_prepare_retvals =[m
[31m-                                ngx_http_lua_socket_conn_error_retval_handler;[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_SSL);[m
[31m-        ngx_http_run_posted_requests(dc);[m
[31m-[m
[31m-    } else {[m
[31m-        (void) ngx_http_lua_socket_conn_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ssl_handshake_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_ssl_session_t           *ssl_session, **ud;[m
[31m-[m
[31m-    if (!u->ssl_session_reuse) {[m
[31m-        lua_pushboolean(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ud = lua_newuserdata(L, sizeof(ngx_ssl_session_t *));[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ssl_session = ngx_ssl_get_session(c);[m
[31m-    if (ssl_session == NULL) {[m
[31m-        *ud = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        *ud = ssl_session;[m
[31m-[m
[31m-       ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                      "lua ssl save session: %p:%d", ssl_session,[m
[31m-                      ssl_session->references);[m
[31m-[m
[31m-        /* set up the __gc metamethod */[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_ssl_session_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_read_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_uint_t          ft_type;[m
[31m-[m
[31m-    if (u->read_co_ctx) {[m
[31m-        u->read_co_ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ft_type = u->ft_type;[m
[31m-    u->ft_type = 0;[m
[31m-[m
[31m-    if (u->no_close) {[m
[31m-        u->no_close = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_http_lua_socket_tcp_finalize_read_part(r, u);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_socket_prepare_error_retvals(r, u, L, ft_type);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_write_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_uint_t          ft_type;[m
[31m-[m
[31m-    if (u->write_co_ctx) {[m
[31m-        u->write_co_ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize_write_part(r, u);[m
[31m-[m
[31m-    ft_type = u->ft_type;[m
[31m-    u->ft_type = 0;[m
[31m-    return ngx_http_lua_socket_prepare_error_retvals(r, u, L, ft_type);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_prepare_error_retvals(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    u_char           errstr[NGX_MAX_ERROR_STR];[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    if (ft_type & (NGX_HTTP_LUA_SOCKET_FT_RESOLVER[m
[31m-                   | NGX_HTTP_LUA_SOCKET_FT_SSL))[m
[31m-    {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-[m
[31m-    if (ft_type & NGX_HTTP_LUA_SOCKET_FT_TIMEOUT) {[m
[31m-        lua_pushliteral(L, "timeout");[m
[31m-[m
[31m-    } else if (ft_type & NGX_HTTP_LUA_SOCKET_FT_CLOSED) {[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-[m
[31m-    } else if (ft_type & NGX_HTTP_LUA_SOCKET_FT_BUFTOOSMALL) {[m
[31m-        lua_pushliteral(L, "buffer too small");[m
[31m-[m
[31m-    } else if (ft_type & NGX_HTTP_LUA_SOCKET_FT_NOMEM) {[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-[m
[31m-    } else if (ft_type & NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT) {[m
[31m-        lua_pushliteral(L, "client aborted");[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (u->socket_errno) {[m
[31m-#if defined(nginx_version) && nginx_version >= 9000[m
[31m-            p = ngx_strerror(u->socket_errno, errstr, sizeof(errstr));[m
[31m-#else[m
[31m-            p = ngx_strerror_r(u->socket_errno, errstr, sizeof(errstr));[m
[31m-#endif[m
[31m-            /* for compatibility with LuaSocket */[m
[31m-            ngx_strlow(errstr, errstr, p - errstr);[m
[31m-            lua_pushlstring(L, (char *) errstr, p - errstr);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushliteral(L, "error");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_conn_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    if (u->ft_type) {[m
[31m-        return ngx_http_lua_socket_conn_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_receive(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    int                                  n;[m
[31m-    ngx_str_t                            pat;[m
[31m-    lua_Integer                          bytes;[m
[31m-    char                                *p;[m
[31m-    int                                  typ;[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments "[m
[31m-                          "(including the object), but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket calling receive() method");[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u == NULL || u->peer.connection == NULL || u->read_closed) {[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to receive data on a closed socket: u:%p, "[m
[31m-                          "c:%p, ft:%d eof:%d",[m
[31m-                          u, u ? u->peer.connection : NULL,[m
[31m-                          u ? (int) u->ft_type : 0, u ? (int) u->eof : 0);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read timeout: %M", u->read_timeout);[m
[31m-[m
[31m-    if (n > 1) {[m
[31m-        if (lua_isnumber(L, 2)) {[m
[31m-            typ = LUA_TNUMBER;[m
[31m-[m
[31m-        } else {[m
[31m-            typ = lua_type(L, 2);[m
[31m-        }[m
[31m-[m
[31m-        switch (typ) {[m
[31m-        case LUA_TSTRING:[m
[31m-            pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-            if (pat.len != 2 || pat.data[0] != '*') {[m
[31m-                p = (char *) lua_pushfstring(L, "bad pattern argument: %s",[m
[31m-                                             (char *) pat.data);[m
[31m-[m
[31m-                return luaL_argerror(L, 2, p);[m
[31m-            }[m
[31m-[m
[31m-            switch (pat.data[1]) {[m
[31m-            case 'l':[m
[31m-                u->input_filter = ngx_http_lua_socket_read_line;[m
[31m-                break;[m
[31m-[m
[31m-            case 'a':[m
[31m-                u->input_filter = ngx_http_lua_socket_read_all;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_argerror(L, 2, "bad pattern argument");[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            u->rest = 0;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TNUMBER:[m
[31m-            bytes = lua_tointeger(L, 2);[m
[31m-            if (bytes < 0) {[m
[31m-                return luaL_argerror(L, 2, "bad pattern argument");[m
[31m-            }[m
[31m-[m
[31m-#if 1[m
[31m-            if (bytes == 0) {[m
[31m-                lua_pushliteral(L, "");[m
[31m-                return 1;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            u->input_filter = ngx_http_lua_socket_read_chunk;[m
[31m-            u->length = (size_t) bytes;[m
[31m-            u->rest = u->length;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return luaL_argerror(L, 2, "bad pattern argument");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        u->input_filter = ngx_http_lua_socket_read_line;[m
[31m-        u->length = 0;[m
[31m-        u->rest = 0;[m
[31m-    }[m
[31m-[m
[31m-    u->input_filter_ctx = u;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (u->bufs_in == NULL) {[m
[31m-        u->bufs_in =[m
[31m-            ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                            &ctx->free_recv_bufs,[m
[31m-                                            u->conf->buffer_size);[m
[31m-[m
[31m-        if (u->bufs_in == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        u->buf_in = u->bufs_in;[m
[31m-        u->buffer = *u->buf_in->buf;[m
[31m-    }[m
[31m-[m
[31m-    dd("tcp receive: buf_in: %p, bufs_in: %p", u->buf_in, u->bufs_in);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        r->read_event_handler = ngx_http_lua_req_socket_rev_handler;[m
[31m-    }[m
[31m-[m
[31m-    u->read_waiting = 0;[m
[31m-    u->read_co_ctx = NULL;[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_tcp_read(r, u);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("read failed: %d", (int) u->ft_type);[m
[31m-        rc = ngx_http_lua_socket_tcp_receive_retval_handler(r, u, L);[m
[31m-        dd("tcp receive retval returned: %d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket receive done in a single run");[m
[31m-[m
[31m-        return ngx_http_lua_socket_tcp_receive_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_read_handler;[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    u->read_co_ctx = coctx;[m
[31m-    u->read_waiting = 1;[m
[31m-    u->read_prepare_retvals = ngx_http_lua_socket_tcp_receive_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p, coctx:%p", u, coctx);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        ctx->downstream = u;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_read_chunk(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u = data;[m
[31m-[m
[31m-    ngx_buf_t                   *b;[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = u->request;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read chunk %z", bytes);[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_CLOSED;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (bytes >= (ssize_t) u->rest) {[m
[31m-[m
[31m-        u->buf_in->buf->last += u->rest;[m
[31m-        b->pos += u->rest;[m
[31m-        u->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* bytes < u->rest */[m
[31m-[m
[31m-    u->buf_in->buf->last += bytes;[m
[31m-    b->pos += bytes;[m
[31m-    u->rest -= bytes;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_read_all(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u = data;[m
[31m-[m
[31m-    ngx_buf_t                   *b;[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = u->request;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read all");[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    u->buf_in->buf->last += bytes;[m
[31m-    b->pos += bytes;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_read_line(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u = data;[m
[31m-[m
[31m-    ngx_buf_t                   *b;[m
[31m-    u_char                      *dst;[m
[31m-    u_char                       c;[m
[31m-#if (NGX_DEBUG)[m
[31m-    u_char                      *begin;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, u->request->connection->log, 0,[m
[31m-                   "lua tcp socket read line");[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_CLOSED;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    begin = b->pos;[m
[31m-#endif[m
[31m-[m
[31m-    dd("already read: %p: %.*s", u->buf_in,[m
[31m-       (int) (u->buf_in->buf->last - u->buf_in->buf->pos),[m
[31m-       u->buf_in->buf->pos);[m
[31m-[m
[31m-    dd("data read: %.*s", (int) bytes, b->pos);[m
[31m-[m
[31m-    dst = u->buf_in->buf->last;[m
[31m-[m
[31m-    while (bytes--) {[m
[31m-[m
[31m-        c = *b->pos++;[m
[31m-[m
[31m-        switch (c) {[m
[31m-        case '\n':[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, u->request->connection->log, 0,[m
[31m-                           "lua tcp socket read the final line part: \"%*s\"",[m
[31m-                           b->pos - 1 - begin, begin);[m
[31m-[m
[31m-            u->buf_in->buf->last = dst;[m
[31m-[m
[31m-            dd("read a line: %p: %.*s", u->buf_in,[m
[31m-               (int) (u->buf_in->buf->last - u->buf_in->buf->pos),[m
[31m-               u->buf_in->buf->pos);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        case '\r':[m
[31m-            /* ignore it */[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            *dst++ = c;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, u->request->connection->log, 0,[m
[31m-                   "lua tcp socket read partial line data: %*s",[m
[31m-                   dst - begin, begin);[m
[31m-#endif[m
[31m-[m
[31m-    u->buf_in->buf->last = dst;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_read(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_event_t                 *rev;[m
[31m-    size_t                       size;[m
[31m-    ssize_t                      n;[m
[31m-    unsigned                     read;[m
[31m-    off_t                        preread = 0;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua tcp socket read data: wait:%d",[m
[31m-                   (int) u->read_waiting);[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-    read = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        size = b->last - b->pos;[m
[31m-[m
[31m-        if (size || u->eof) {[m
[31m-[m
[31m-            rc = u->input_filter(u->input_filter_ctx, size);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua tcp socket receive done: wait:%d, eof:%d, "[m
[31m-                               "uri:\"%V?%V\"", (int) u->read_waiting,[m
[31m-                               (int) u->eof, &r->uri, &r->args);[m
[31m-[m
[31m-                if (u->body_downstream[m
[31m-                    && b->last == b->pos[m
[31m-                    && r->request_body->rest == 0)[m
[31m-                {[m
[31m-[m
[31m-                    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-                    if (llcf->check_client_abort) {[m
[31m-                        rc = ngx_http_lua_check_broken_connection(r, rev);[m
[31m-[m
[31m-                        if (rc == NGX_OK) {[m
[31m-                            goto success;[m
[31m-                        }[m
[31m-[m
[31m-                        if (rc == NGX_HTTP_CLIENT_CLOSED_REQUEST) {[m
[31m-                            ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                          NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT);[m
[31m-[m
[31m-                        } else {[m
[31m-                            ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-                        }[m
[31m-[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-#if 1[m
[31m-                if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                    ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                     NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-#endif[m
[31m-[m
[31m-success:[m
[31m-[m
[31m-                ngx_http_lua_socket_handle_read_success(r, u);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                dd("input filter error: ft_type:%d wait:%d",[m
[31m-                   (int) u->ft_type, (int) u->read_waiting);[m
[31m-[m
[31m-                ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                                NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-[m
[31m-            if (u->body_downstream && r->request_body->rest == 0) {[m
[31m-                u->eof = 1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (read && !rev->ready) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            rc = ngx_http_lua_socket_add_input_buffer(r, u);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                                NGX_HTTP_LUA_SOCKET_FT_NOMEM);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = &u->buffer;[m
[31m-            size = (size_t) (b->end - b->last);[m
[31m-        }[m
[31m-[m
[31m-        if (u->raw_downstream) {[m
[31m-            preread = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-            if (preread) {[m
[31m-[m
[31m-                if ((off_t) size > preread) {[m
[31m-                    size = (size_t) preread;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_probe_req_socket_consume_preread(r,[m
[31m-                                                              r->header_in->pos,[m
[31m-                                                              size);[m
[31m-[m
[31m-                b->last = ngx_copy(b->last, r->header_in->pos, size);[m
[31m-                r->header_in->pos += size;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-        } else if (u->body_downstream) {[m
[31m-[m
[31m-            if (r->request_body->rest == 0) {[m
[31m-[m
[31m-                dd("request body rest is zero");[m
[31m-[m
[31m-                u->eof = 1;[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua request body exhausted");[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* try to process the preread body */[m
[31m-[m
[31m-            preread = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-            if (preread) {[m
[31m-[m
[31m-                /* there is the pre-read part of the request body */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "http client request body preread %O", preread);[m
[31m-[m
[31m-                if (preread >= r->request_body->rest) {[m
[31m-                    preread = r->request_body->rest;[m
[31m-                }[m
[31m-[m
[31m-                if ((off_t) size > preread) {[m
[31m-                    size = (size_t) preread;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_probe_req_socket_consume_preread(r,[m
[31m-                                                              r->header_in->pos,[m
[31m-                                                              size);[m
[31m-[m
[31m-                b->last = ngx_copy(b->last, r->header_in->pos, size);[m
[31m-[m
[31m-                r->header_in->pos += size;[m
[31m-                r->request_length += size;[m
[31m-[m
[31m-                if (r->request_body->rest) {[m
[31m-                    r->request_body->rest -= size;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (size > (size_t) r->request_body->rest) {[m
[31m-                size = (size_t) r->request_body->rest;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        if (rev->active && !rev->ready) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            break;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket try to recv data %uz: \"%V?%V\"",[m
[31m-                       size, &r->uri, &r->args);[m
[31m-[m
[31m-        n = c->recv(c, b->last, size);[m
[31m-[m
[31m-        dd("read event ready: %d", (int) c->read->ready);[m
[31m-[m
[31m-        read = 1;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket recv returned %d: \"%V?%V\"",[m
[31m-                       (int) n, &r->uri, &r->args);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            dd("socket recv busy");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-[m
[31m-            if (u->raw_downstream || u->body_downstream) {[m
[31m-[m
[31m-                llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-                if (llcf->check_client_abort) {[m
[31m-[m
[31m-                    ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                          NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                /* llcf->check_client_abort == 0 */[m
[31m-[m
[31m-                if (u->body_downstream && r->request_body->rest) {[m
[31m-                    ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                          NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            u->eof = 1;[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua tcp socket closed");[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            u->socket_errno = ngx_socket_errno;[m
[31m-            ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                                  NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->last += n;[m
[31m-[m
[31m-        if (u->body_downstream) {[m
[31m-            r->request_length += n;[m
[31m-            r->request_body->rest -= n;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        ngx_add_timer(rev, u->read_timeout);[m
[31m-[m
[31m-    } else if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_send(lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-    ngx_chain_t                         *cl;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    int                                  type;[m
[31m-    int                                  tcp_nodelay;[m
[31m-    const char                          *msg;[m
[31m-    ngx_buf_t                           *b;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-    ngx_http_core_loc_conf_t            *clcf;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx;[m
[31m-[m
[31m-    /* TODO: add support for the optional "i" and "j" arguments */[m
[31m-[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expecting 2 arguments (including the object), "[m
[31m-                          "but got %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    dd("tcp send: u=%p, u->write_closed=%d", u, (unsigned) u->write_closed);[m
[31m-[m
[31m-    if (u == NULL || u->peer.connection == NULL || u->write_closed) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to send data on a closed socket: u:%p, "[m
[31m-                          "c:%p, ft:%d eof:%d",[m
[31m-                          u, u ? u->peer.connection : NULL,[m
[31m-                          u ? (int) u->ft_type : 0, u ? (int) u->eof : 0);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-    if (u->body_downstream) {[m
[31m-        return luaL_error(L, "attempt to write to request sockets");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket send timeout: %M", u->send_timeout);[m
[31m-[m
[31m-    type = lua_type(L, 2);[m
[31m-    switch (type) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            lua_tolstring(L, 2, &len);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            len = ngx_http_lua_calc_strlen_in_table(L, 2, 2, 1 /* strict */);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "string, number, boolean, nil, "[m
[31m-                                  "or array table expected, got %s",[m
[31m-                                  lua_typename(L, type));[m
[31m-[m
[31m-            return luaL_argerror(L, 2, msg);[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        lua_pushinteger(L, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, len);[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    switch (type) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            p = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-            b->last = ngx_copy(b->last, (u_char *) p, len);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            b->last = ngx_http_lua_copy_str_in_table(L, -1, b->last);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return luaL_error(L, "impossible to reach here");[m
[31m-    }[m
[31m-[m
[31m-    u->request_bufs = cl;[m
[31m-[m
[31m-    u->request_len = len;[m
[31m-[m
[31m-    /* mimic ngx_http_upstream_init_request here */[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "lua socket tcp_nodelay");[m
[31m-[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-            == -1)[m
[31m-        {[m
[31m-            llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-            if (llcf->log_socket_errors) {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) "[m
[31m-                                     "failed");[m
[31m-            }[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "setsocketopt tcp_nodelay failed");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    u->write_waiting = 0;[m
[31m-    u->write_co_ctx = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_probe_socket_tcp_send_start(r, u, b->pos, len);[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_send(r, u);[m
[31m-[m
[31m-    dd("socket send returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return ngx_http_lua_socket_write_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        lua_pushinteger(L, len);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (u->raw_downstream) {[m
[31m-        ctx->writing_raw_req_socket = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    u->write_co_ctx = coctx;[m
[31m-    u->write_waiting = 1;[m
[31m-    u->write_prepare_retvals = ngx_http_lua_socket_tcp_send_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_send_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket send return value handler");[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-        return ngx_http_lua_socket_write_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, u->request_len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_receive_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_event_t                 *ev;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket receive return value handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-#if 1[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->check_client_abort) {[m
[31m-[m
[31m-            r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-            ev = r->connection->read;[m
[31m-[m
[31m-            dd("rev active: %d", ev->active);[m
[31m-[m
[31m-            if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && !ev->active) {[m
[31m-                if (ngx_add_event(ev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                    lua_pushnil(L);[m
[31m-                    lua_pushliteral(L, "failed to add event");[m
[31m-                    return 2;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* llcf->check_client_abort == 0 */[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-[m
[31m-        if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_TIMEOUT) {[m
[31m-            u->no_close = 1;[m
[31m-        }[m
[31m-[m
[31m-        dd("u->bufs_in: %p", u->bufs_in);[m
[31m-[m
[31m-        if (u->bufs_in) {[m
[31m-            rc = ngx_http_lua_socket_push_input_data(r, ctx, u, L);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushliteral(L, "no memory");[m
[31m-                return 2;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_http_lua_socket_read_error_retval_handler(r, u, L);[m
[31m-[m
[31m-            lua_pushvalue(L, -3);[m
[31m-            lua_remove(L, -4);[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_http_lua_socket_read_error_retval_handler(r, u, L);[m
[31m-        lua_pushliteral(L, "");[m
[31m-        return n + 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_push_input_data(r, ctx, u, L);[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_close(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument "[m
[31m-                          "(including the object) but seen %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL[m
[31m-        || u->peer.connection == NULL[m
[31m-        || (u->read_closed && u->write_closed))[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "attempt to close a request socket");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_setoption(lua_State *L)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_settimeout(lua_State *L)[m
[31m-{[m
[31m-    int                     n;[m
[31m-    ngx_int_t               timeout;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 2) {[m
[31m-        return luaL_error(L, "ngx.socket settimout: expecting at least 2 "[m
[31m-                          "arguments (including the object) but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    timeout = (ngx_int_t) lua_tonumber(L, 2);[m
[31m-[m
[31m-    lua_rawseti(L, 1, SOCKET_TIMEOUT_INDEX);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u) {[m
[31m-        if (timeout > 0) {[m
[31m-            u->read_timeout = (ngx_msec_t) timeout;[m
[31m-            u->send_timeout = (ngx_msec_t) timeout;[m
[31m-            u->connect_timeout = (ngx_msec_t) timeout;[m
[31m-[m
[31m-        } else {[m
[31m-            u->read_timeout = u->conf->read_timeout;[m
[31m-            u->send_timeout = u->conf->send_timeout;[m
[31m-            u->connect_timeout = u->conf->connect_timeout;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_request_t              *r;[m
[31m-    ngx_http_log_ctx_t              *ctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    u = c->data;[m
[31m-    r = u->request;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->fd != (ngx_socket_t) -1) {  /* not a fake connection */[m
[31m-        ctx = c->log->data;[m
[31m-        ctx->current_request = r;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua tcp socket handler for \"%V?%V\", wev %d", &r->uri,[m
[31m-                   &r->args, (int) ev->write);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        u->write_event_handler(r, u);[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    /* empty */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read handler");[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        c->read->timedout = 0;[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua tcp socket read timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (u->buffer.start != NULL) {[m
[31m-        (void) ngx_http_lua_socket_tcp_read(r, u);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_send_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket send handler");[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua tcp socket write timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                               NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request_bufs) {[m
[31m-        (void) ngx_http_lua_socket_send(r, u);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_send(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                    n;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_buf_t                   *b;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket send data");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                               NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = u->request_bufs->buf;[m
[31m-[m
[31m-    for (;;) {[m
[31m-        n = c->send(c, b->pos, b->last - b->pos);[m
[31m-[m
[31m-        if (n >= 0) {[m
[31m-            b->pos += n;[m
[31m-[m
[31m-            if (b->pos == b->last) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                               "lua tcp socket sent all the data");[m
[31m-[m
[31m-                if (c->write->timer_set) {[m
[31m-                    ngx_del_timer(c->write);[m
[31m-                }[m
[31m-[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-                ngx_chain_update_chains(r->pool,[m
[31m-#else[m
[31m-                ngx_chain_update_chains([m
[31m-#endif[m
[31m-                                        &ctx->free_bufs, &ctx->busy_bufs,[m
[31m-                                        &u->request_bufs,[m
[31m-                                        (ngx_buf_tag_t) &ngx_http_lua_module);[m
[31m-[m
[31m-                u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-                if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-                    ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                                NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_socket_handle_write_success(r, u);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            /* keep sending more data */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_ERROR || NGX_AGAIN */[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        c->error = 1;[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-        ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                               NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* n == NGX_AGAIN */[m
[31m-[m
[31m-    if (u->raw_downstream) {[m
[31m-        ctx->writing_raw_req_socket = 1;[m
[31m-    }[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_lua_socket_send_handler;[m
[31m-[m
[31m-    ngx_add_timer(c->write, u->send_timeout);[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                               NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_conn_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-#if 1[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-    u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->conn_waiting) {[m
[31m-        u->conn_waiting = 0;[m
[31m-[m
[31m-        coctx = u->write_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->write_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_conn_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request (conn)");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_read_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-#if 1[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->read_waiting) {[m
[31m-        u->read_waiting = 0;[m
[31m-[m
[31m-        coctx = u->read_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->read_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_read_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request (read)");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_write_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-#if 1[m
[31m-    u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->write_waiting) {[m
[31m-        u->write_waiting = 0;[m
[31m-[m
[31m-        coctx = u->write_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->write_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_write_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request (read)");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_conn_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket handle connect error");[m
[31m-[m
[31m-    u->ft_type |= ft_type;[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-    u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    dd("connection waiting: %d", (int) u->conn_waiting);[m
[31m-[m
[31m-    coctx = u->write_co_ctx;[m
[31m-[m
[31m-    if (u->conn_waiting) {[m
[31m-        u->conn_waiting = 0;[m
[31m-[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->write_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_conn_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_read_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket handle read error");[m
[31m-[m
[31m-    u->ft_type |= ft_type;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    if (u->read_waiting) {[m
[31m-        u->read_waiting = 0;[m
[31m-[m
[31m-        coctx = u->read_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->read_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_read_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_write_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket handle write error");[m
[31m-[m
[31m-    u->ft_type |= ft_type;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    if (u->write_waiting) {[m
[31m-        u->write_waiting = 0;[m
[31m-[m
[31m-        coctx = u->write_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->write_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_write_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_connected_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua tcp socket connect timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_test_connect(r, c);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc > 0) {[m
[31m-            u->socket_errno = (ngx_err_t) rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket connected");[m
[31m-[m
[31m-    /* We should delete the current write/read event[m
[31m-     * here because the socket object may not be used immediately[m
[31m-     * on the Lua land, thus causing hot spin around level triggered[m
[31m-     * event poll and wasting CPU cycles. */[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_handle_conn_success(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u = data;[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = u->request;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup lua tcp socket request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_finalize_read_part(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_chain_t                         *cl;[m
[31m-    ngx_chain_t                        **ll;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-[m
[31m-    if (u->read_closed) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_closed = 1;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx && u->bufs_in) {[m
[31m-[m
[31m-        ll = &u->bufs_in;[m
[31m-        for (cl = u->bufs_in; cl; cl = cl->next) {[m
[31m-            dd("bufs_in chain: %p, next %p", cl, cl->next);[m
[31m-            cl->buf->pos = cl->buf->last;[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-        dd("ctx: %p", ctx);[m
[31m-        dd("free recv bufs: %p", ctx->free_recv_bufs);[m
[31m-        *ll = ctx->free_recv_bufs;[m
[31m-        ctx->free_recv_bufs = u->bufs_in;[m
[31m-        u->bufs_in = NULL;[m
[31m-        u->buf_in = NULL;[m
[31m-        ngx_memzero(&u->buffer, sizeof(ngx_buf_t));[m
[31m-    }[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        if (r->connection->read->timer_set) {[m
[31m-            ngx_del_timer(r->connection->read);[m
[31m-        }[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c) {[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        if (c->read->active || c->read->disabled) {[m
[31m-            ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (c->read->posted) {[m
[31m-#else[m
[31m-        if (c->read->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(c->read);[m
[31m-        }[m
[31m-[m
[31m-        c->read->closed = 1;[m
[31m-[m
[31m-        /* TODO: shutdown the reading part of the connection */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_finalize_write_part(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-[m
[31m-    if (u->write_closed) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->write_closed = 1;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        if (ctx && ctx->writing_raw_req_socket) {[m
[31m-            ctx->writing_raw_req_socket = 0;[m
[31m-            if (r->connection->write->timer_set) {[m
[31m-                ngx_del_timer(r->connection->write);[m
[31m-            }[m
[31m-[m
[31m-            r->connection->write->error = 1;[m
[31m-        }[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c) {[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        if (c->write->active || c->write->disabled) {[m
[31m-            ngx_del_event(c->write, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (c->write->posted) {[m
[31m-#else[m
[31m-        if (c->write->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(c->write);[m
[31m-        }[m
[31m-[m
[31m-        c->write->closed = 1;[m
[31m-[m
[31m-        /* TODO: shutdown the writing part of the connection */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_finalize(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t               *c;[m
[31m-    ngx_http_lua_socket_pool_t     *spool;[m
[31m-[m
[31m-    dd("request: %p, u: %p, u->cleanup: %p", r, u, u->cleanup);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua finalize socket");[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-        ngx_http_lua_cleanup_free(r, u->cleanup);[m
[31m-        u->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize_read_part(r, u);[m
[31m-    ngx_http_lua_socket_tcp_finalize_write_part(r, u);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        u->peer.connection = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.free) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (u->ssl_name.data) {[m
[31m-        ngx_free(u->ssl_name.data);[m
[31m-        u->ssl_name.data = NULL;[m
[31m-        u->ssl_name.len = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    if (c) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua close socket connection");[m
[31m-[m
[31m-        ngx_http_lua_socket_tcp_close_connection(c);[m
[31m-        u->peer.connection = NULL;[m
[31m-[m
[31m-        if (!u->reused) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        spool = u->socket_pool;[m
[31m-        if (spool == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        spool->active_connections--;[m
[31m-[m
[31m-        if (spool->active_connections == 0) {[m
[31m-            ngx_http_lua_socket_free_pool(r->connection->log, spool);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-        c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-        (void) ngx_ssl_shutdown(c);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (c->pool) {[m
[31m-        ngx_destroy_pool(c->pool);[m
[31m-        c->pool = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_test_connect(ngx_http_request_t *r, ngx_connection_t *c)[m
[31m-{[m
[31m-    int              err;[m
[31m-    socklen_t        len;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    ngx_event_t     *ev;[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        dd("pending eof: (%p)%d (%p)%d", c->write, c->write->pending_eof,[m
[31m-           c->read, c->read->pending_eof);[m
[31m-[m
[31m-        if (c->write->pending_eof) {[m
[31m-            ev = c->write;[m
[31m-[m
[31m-        } else if (c->read->pending_eof) {[m
[31m-            ev = c->read;[m
[31m-[m
[31m-        } else {[m
[31m-            ev = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ev) {[m
[31m-            llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-            if (llcf->log_socket_errors) {[m
[31m-                (void) ngx_connection_error(c, ev->kq_errno,[m
[31m-                                            "kevent() reported that "[m
[31m-                                            "connect() failed");[m
[31m-            }[m
[31m-            return ev->kq_errno;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-            if (llcf->log_socket_errors) {[m
[31m-                (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            }[m
[31m-            return err;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_receiveuntil(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    int                                  n;[m
[31m-    ngx_str_t                            pat;[m
[31m-    ngx_int_t                            rc;[m
[31m-    size_t                               size;[m
[31m-    unsigned                             inclusive = 0;[m
[31m-[m
[31m-    ngx_http_lua_socket_compiled_pattern_t     *cp;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 2 && n != 3) {[m
[31m-        return luaL_error(L, "expecting 2 or 3 arguments "[m
[31m-                          "(including the object), but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 3) {[m
[31m-        /* check out the options table */[m
[31m-[m
[31m-        luaL_checktype(L, 3, LUA_TTABLE);[m
[31m-[m
[31m-        lua_getfield(L, 3, "inclusive");[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    inclusive = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "bad \"inclusive\" option value type: %s",[m
[31m-                                  luaL_typename(L, -1));[m
[31m-[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket calling receiveuntil() method");[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-    if (pat.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "pattern is empty");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof(ngx_http_lua_socket_compiled_pattern_t);[m
[31m-[m
[31m-    cp = lua_newuserdata(L, size);[m
[31m-    if (cp == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_pattern_udata_metatable_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    ngx_memzero(cp, size);[m
[31m-[m
[31m-    cp->inclusive = inclusive;[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_compile_pattern(pat.data, pat.len, cp,[m
[31m-                                             r->connection->log);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to compile pattern");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushcclosure(L, ngx_http_lua_socket_receiveuntil_iterator, 3);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_receiveuntil_iterator(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    lua_Integer                          bytes;[m
[31m-    int                                  n;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_compiled_pattern_t     *cp;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n > 1) {[m
[31m-        return luaL_error(L, "expecting 0 or 1 arguments, "[m
[31m-                          "but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (n >= 1) {[m
[31m-        bytes = luaL_checkinteger(L, 1);[m
[31m-        if (bytes < 0) {[m
[31m-            bytes = 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        bytes = 0;[m
[31m-    }[m
[31m-[m
[31m-    lua_rawgeti(L, lua_upvalueindex(1), SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL || u->peer.connection == NULL || u->read_closed) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket receiveuntil iterator");[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read timeout: %M", u->read_timeout);[m
[31m-[m
[31m-    u->input_filter = ngx_http_lua_socket_read_until;[m
[31m-[m
[31m-    cp = lua_touserdata(L, lua_upvalueindex(3));[m
[31m-[m
[31m-    dd("checking existing state: %d", cp->state);[m
[31m-[m
[31m-    if (cp->state == -1) {[m
[31m-        cp->state = 0;[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushnil(L);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-    cp->upstream = u;[m
[31m-[m
[31m-    cp->pattern.data =[m
[31m-        (u_char *) lua_tolstring(L, lua_upvalueindex(2),[m
[31m-                                 &cp->pattern.len);[m
[31m-[m
[31m-    u->input_filter_ctx = cp;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (u->bufs_in == NULL) {[m
[31m-        u->bufs_in =[m
[31m-            ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                            &ctx->free_recv_bufs,[m
[31m-                                            u->conf->buffer_size);[m
[31m-[m
[31m-        if (u->bufs_in == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        u->buf_in = u->bufs_in;[m
[31m-        u->buffer = *u->buf_in->buf;[m
[31m-    }[m
[31m-[m
[31m-    u->length = (size_t) bytes;[m
[31m-    u->rest = u->length;[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        r->read_event_handler = ngx_http_lua_req_socket_rev_handler;[m
[31m-    }[m
[31m-[m
[31m-    u->read_waiting = 0;[m
[31m-    u->read_co_ctx = NULL;[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_tcp_read(r, u);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("read failed: %d", (int) u->ft_type);[m
[31m-        rc = ngx_http_lua_socket_tcp_receive_retval_handler(r, u, L);[m
[31m-        dd("tcp receive retval returned: %d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket receive done in a single run");[m
[31m-[m
[31m-        return ngx_http_lua_socket_tcp_receive_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_read_handler;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    u->read_co_ctx = coctx;[m
[31m-    u->read_waiting = 1;[m
[31m-    u->read_prepare_retvals = ngx_http_lua_socket_tcp_receive_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        ctx->downstream = u;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_compile_pattern(u_char *data, size_t len,[m
[31m-    ngx_http_lua_socket_compiled_pattern_t *cp, ngx_log_t *log)[m
[31m-{[m
[31m-    size_t              i;[m
[31m-    size_t              prefix_len;[m
[31m-    size_t              size;[m
[31m-    unsigned            found;[m
[31m-    int                 cur_state, new_state;[m
[31m-[m
[31m-    ngx_http_lua_dfa_edge_t         *edge;[m
[31m-    ngx_http_lua_dfa_edge_t        **last = NULL;[m
[31m-[m
[31m-    cp->pattern.len = len;[m
[31m-[m
[31m-    if (len <= 2) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < len; i++) {[m
[31m-        prefix_len = 1;[m
[31m-[m
[31m-        while (prefix_len <= len - i - 1) {[m
[31m-[m
[31m-            if (ngx_memcmp(data, &data[i], prefix_len) == 0) {[m
[31m-                if (data[prefix_len] == data[i + prefix_len]) {[m
[31m-                    prefix_len++;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                cur_state = i + prefix_len;[m
[31m-                new_state = prefix_len + 1;[m
[31m-[m
[31m-                if (cp->recovering == NULL) {[m
[31m-                    size = sizeof(void *) * (len - 2);[m
[31m-                    cp->recovering = ngx_alloc(size, log);[m
[31m-                    if (cp->recovering == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_memzero(cp->recovering, size);[m
[31m-                }[m
[31m-[m
[31m-                edge = cp->recovering[cur_state - 2];[m
[31m-[m
[31m-                found = 0;[m
[31m-[m
[31m-                if (edge == NULL) {[m
[31m-                    last = &cp->recovering[cur_state - 2];[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    for (; edge; edge = edge->next) {[m
[31m-                        last = &edge->next;[m
[31m-[m
[31m-                        if (edge->chr == data[prefix_len]) {[m
[31m-                            found = 1;[m
[31m-[m
[31m-                            if (edge->new_state < new_state) {[m
[31m-                                edge->new_state = new_state;[m
[31m-                            }[m
[31m-[m
[31m-                            break;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (!found) {[m
[31m-                    ngx_log_debug7(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                                   "lua tcp socket read until recovering point:"[m
[31m-                                   " on state %d (%*s), if next is '%c', then "[m
[31m-                                   "recover to state %d (%*s)", cur_state,[m
[31m-                                   (size_t) cur_state, data, data[prefix_len],[m
[31m-                                   new_state, (size_t) new_state, data);[m
[31m-[m
[31m-                    edge = ngx_alloc(sizeof(ngx_http_lua_dfa_edge_t), log);[m
[31m-                    if (edge == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    edge->chr = data[prefix_len];[m
[31m-                    edge->new_state = new_state;[m
[31m-                    edge->next = NULL;[m
[31m-[m
[31m-                    *last = edge;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_read_until(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_lua_socket_compiled_pattern_t     *cp = data;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-    ngx_http_request_t                      *r;[m
[31m-    ngx_buf_t                               *b;[m
[31m-    u_char                                   c;[m
[31m-    u_char                                  *pat;[m
[31m-    size_t                                   pat_len;[m
[31m-    int                                      i;[m
[31m-    int                                      state;[m
[31m-    int                                      old_state = 0; /* just to make old[m
[31m-                                                               gcc happy */[m
[31m-    ngx_http_lua_dfa_edge_t                 *edge;[m
[31m-    unsigned                                 matched;[m
[31m-    ngx_int_t                                rc;[m
[31m-[m
[31m-    u = cp->upstream;[m
[31m-    r = u->request;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read until");[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_CLOSED;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    pat = cp->pattern.data;[m
[31m-    pat_len = cp->pattern.len;[m
[31m-    state = cp->state;[m
[31m-[m
[31m-    i = 0;[m
[31m-    while (i < bytes) {[m
[31m-        c = b->pos[i];[m
[31m-[m
[31m-        dd("%d: read char %d, state: %d", i, c, state);[m
[31m-[m
[31m-        if (c == pat[state]) {[m
[31m-            i++;[m
[31m-            state++;[m
[31m-[m
[31m-            if (state == (int) pat_len) {[m
[31m-                /* already matched the whole pattern */[m
[31m-                dd("pat len: %d", (int) pat_len);[m
[31m-[m
[31m-                b->pos += i;[m
[31m-[m
[31m-                if (u->length) {[m
[31m-                    cp->state = -1;[m
[31m-[m
[31m-                } else {[m
[31m-                    cp->state = 0;[m
[31m-                }[m
[31m-[m
[31m-                if (cp->inclusive) {[m
[31m-                    rc = ngx_http_lua_socket_add_pending_data(r, u, b->pos, 0,[m
[31m-                                                              pat, state,[m
[31m-                                                              state);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (state == 0) {[m
[31m-            u->buf_in->buf->last++;[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            if (u->length && --u->rest == 0) {[m
[31m-                cp->state = state;[m
[31m-                b->pos += i;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        matched = 0;[m
[31m-[m
[31m-        if (cp->recovering && state >= 2) {[m
[31m-            dd("accessing state: %d, index: %d", state, state - 2);[m
[31m-            for (edge = cp->recovering[state - 2]; edge; edge = edge->next) {[m
[31m-[m
[31m-                if (edge->chr == c) {[m
[31m-                    dd("matched '%c' and jumping to state %d", c,[m
[31m-                       edge->new_state);[m
[31m-[m
[31m-                    old_state = state;[m
[31m-                    state = edge->new_state;[m
[31m-                    matched = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!matched) {[m
[31m-#if 1[m
[31m-            dd("adding pending data: %.*s", state, pat);[m
[31m-            rc = ngx_http_lua_socket_add_pending_data(r, u, b->pos, i, pat,[m
[31m-                                                      state, state);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            if (u->length) {[m
[31m-                if (u->rest <= (size_t) state) {[m
[31m-                    u->rest = 0;[m
[31m-                    cp->state = 0;[m
[31m-                    b->pos += i;[m
[31m-                    return NGX_OK;[m
[31m-[m
[31m-                } else {[m
[31m-                    u->rest -= state;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            state = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* matched */[m
[31m-[m
[31m-        dd("adding pending data: %.*s", (int) (old_state + 1 - state),[m
[31m-           (char *) pat);[m
[31m-[m
[31m-        rc = ngx_http_lua_socket_add_pending_data(r, u, b->pos, i, pat,[m
[31m-                                                  old_state + 1 - state,[m
[31m-                                                  old_state);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        i++;[m
[31m-[m
[31m-        if (u->length) {[m
[31m-            if (u->rest <= (size_t) state) {[m
[31m-                u->rest = 0;[m
[31m-                cp->state = state;[m
[31m-                b->pos += i;[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            } else {[m
[31m-                u->rest -= state;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    b->pos += i;[m
[31m-    cp->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_cleanup_compiled_pattern(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_compiled_pattern_t      *cp;[m
[31m-[m
[31m-    ngx_http_lua_dfa_edge_t         *edge, *p;[m
[31m-    unsigned                         i;[m
[31m-[m
[31m-    dd("cleanup compiled pattern");[m
[31m-[m
[31m-    cp = lua_touserdata(L, 1);[m
[31m-    if (cp == NULL || cp->recovering == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("pattern len: %d", (int) cp->pattern.len);[m
[31m-[m
[31m-    for (i = 0; i < cp->pattern.len - 2; i++) {[m
[31m-        edge = cp->recovering[i];[m
[31m-[m
[31m-        while (edge) {[m
[31m-            p = edge;[m
[31m-            edge = edge->next;[m
[31m-[m
[31m-            dd("freeing edge %p", p);[m
[31m-[m
[31m-            ngx_free(p);[m
[31m-[m
[31m-            dd("edge: %p", edge);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_free(cp->recovering);[m
[31m-    cp->recovering = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_req_socket(lua_State *L)[m
[31m-{[m
[31m-    int                              n, raw;[m
[31m-    ngx_peer_connection_t           *pc;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_request_t              *r;[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_http_request_body_t         *rb;[m
[31m-    ngx_http_cleanup_t              *cln;[m
[31m-    ngx_http_lua_co_ctx_t           *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n == 0) {[m
[31m-        raw = 0;[m
[31m-[m
[31m-    } else if (n == 1) {[m
[31m-        raw = lua_toboolean(L, 1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        return luaL_error(L, "expecting zero arguments, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return luaL_error(L, "attempt to read the request body in a "[m
[31m-                          "subrequest");[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SPDY)[m
[31m-    if (r->spdy_stream) {[m
[31m-        return luaL_error(L, "spdy not supported yet");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        return luaL_error(L, "http v2 not supported yet");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if nginx_version >= 1003009[m
[31m-    if (!raw && r->headers_in.chunked) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "chunked request bodies not supported yet");[m
[31m-        return 2;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (raw) {[m
[31m-#if !defined(nginx_version) || nginx_version < 1003013[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nginx version too old");[m
[31m-        return 2;[m
[31m-#else[m
[31m-        if (r->request_body) {[m
[31m-            if (r->request_body->rest > 0) {[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushliteral(L, "pending request body reading in some "[m
[31m-                                "other thread");[m
[31m-                return 2;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-            if (rb == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-            r->request_body = rb;[m
[31m-        }[m
[31m-[m
[31m-        if (c->buffered & NGX_HTTP_LOWLEVEL_BUFFERED) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "pending data to write");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->buffering) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "http 1.0 buffering");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (!r->header_sent) {[m
[31m-            /* prevent other parts of nginx from sending out[m
[31m-             * the response header */[m
[31m-            r->header_sent = 1;[m
[31m-        }[m
[31m-[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        dd("ctx acquired raw req socket: %d", ctx->acquired_raw_req_socket);[m
[31m-[m
[31m-        if (ctx->acquired_raw_req_socket) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "duplicate call");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ctx->acquired_raw_req_socket = 1;[m
[31m-        r->keepalive = 0;[m
[31m-        r->lingering_close = 1;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        /* request body reader */[m
[31m-[m
[31m-        if (r->request_body) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "request body already exists");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (r->discard_body) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "request body discarded");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        dd("req content length: %d", (int) r->headers_in.content_length_n);[m
[31m-[m
[31m-        if (r->headers_in.content_length_n <= 0) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "no body");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_lua_test_expect(r) != NGX_OK) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "test expect failed");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        /* prevent other request body reader from running */[m
[31m-[m
[31m-        rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-        if (rb == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        rb->rest = r->headers_in.content_length_n;[m
[31m-[m
[31m-        r->request_body = rb;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 3 /* narr */, 1 /* nrec */); /* the object */[m
[31m-[m
[31m-    if (raw) {[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_raw_req_socket_metatable_key);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_req_socket_metatable_key);[m
[31m-    }[m
[31m-[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    u = lua_newuserdata(L, sizeof(ngx_http_lua_socket_tcp_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_downstream_udata_metatable_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-#endif[m
[31m-[m
[31m-    lua_rawseti(L, 1, SOCKET_CTX_INDEX);[m
[31m-[m
[31m-    ngx_memzero(u, sizeof(ngx_http_lua_socket_tcp_upstream_t));[m
[31m-[m
[31m-    if (raw) {[m
[31m-        u->raw_downstream = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        u->body_downstream = 1;[m
[31m-    }[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    u->request = r;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    u->conf = llcf;[m
[31m-[m
[31m-    u->read_timeout = u->conf->read_timeout;[m
[31m-    u->connect_timeout = u->conf->connect_timeout;[m
[31m-    u->send_timeout = u->conf->send_timeout;[m
[31m-[m
[31m-    cln = ngx_http_lua_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_socket_tcp_cleanup;[m
[31m-    cln->data = u;[m
[31m-    u->cleanup = &cln->handler;[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-[m
[31m-    pc->log = c->log;[m
[31m-    pc->log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    pc->connection = c;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    coctx->data = u;[m
[31m-    ctx->downstream = u;[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (raw) {[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_settop(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_req_socket_rev_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua request socket read event handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u = ctx->downstream;[m
[31m-    if (u) {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_getreusedtimes(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t    *u;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument "[m
[31m-                          "(including the object), but got %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u == NULL[m
[31m-        || u->peer.connection == NULL[m
[31m-        || (u->read_closed && u->write_closed))[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, u->reused);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_setkeepalive(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-    size_t                               size, key_len;[m
[31m-    ngx_str_t                            key;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_peer_connection_t               *pc;[m
[31m-    u_char                              *p;[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_msec_t                           timeout;[m
[31m-    ngx_uint_t                           pool_size;[m
[31m-    int                                  n;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_buf_t                           *b;[m
[31m-[m
[31m-    ngx_http_lua_socket_pool_item_t     *items, *item;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n < 1 || n > 3) {[m
[31m-        return luaL_error(L, "expecting 1 to 3 arguments "[m
[31m-                          "(including the object), but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_KEY_INDEX);[m
[31m-    key.data = (u_char *) lua_tolstring(L, -1, &key.len);[m
[31m-    if (key.data == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "key not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* stack: obj cache key */[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-    c = pc->connection;[m
[31m-[m
[31m-    if (c == NULL || u->read_closed || u->write_closed) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (b->start && ngx_buf_size(b)) {[m
[31m-        ngx_http_lua_probe_socket_tcp_setkeepalive_buf_unread(r, u, b->pos,[m
[31m-                                                              b->last - b->pos);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "unread data in buffer");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->eof[m
[31m-        || c->read->error[m
[31m-        || c->read->timedout[m
[31m-        || c->write->error[m
[31m-        || c->write->timedout)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "invalid connection");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to handle read event");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua tcp socket set keepalive: saving connection %p", c);[m
[31m-[m
[31m-    dd("saving connection to key %s", lua_tostring(L, -1));[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_rawget(L, -3);[m
[31m-    spool = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    /* stack: obj timeout? size? cache key */[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (spool == NULL) {[m
[31m-        /* create a new socket pool for the current peer key */[m
[31m-[m
[31m-        if (n == 3) {[m
[31m-            pool_size = luaL_checkinteger(L, 3);[m
[31m-[m
[31m-        } else {[m
[31m-            pool_size = llcf->pool_size;[m
[31m-        }[m
[31m-[m
[31m-        if (pool_size == 0) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "zero pool size");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket connection pool size: %ui", pool_size);[m
[31m-[m
[31m-        key_len = ngx_align(key.len + 1, sizeof(void *));[m
[31m-[m
[31m-        size = sizeof(ngx_http_lua_socket_pool_t) + key_len - 1[m
[31m-               + sizeof(ngx_http_lua_socket_pool_item_t)[m
[31m-               * pool_size;[m
[31m-[m
[31m-        spool = lua_newuserdata(L, size);[m
[31m-        if (spool == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_pool_udata_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "lua tcp socket keepalive create connection pool for key"[m
[31m-                       " \"%s\"", lua_tostring(L, -2));[m
[31m-[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        spool->active_connections = 0;[m
[31m-        spool->lua_vm = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-        ngx_queue_init(&spool->cache);[m
[31m-        ngx_queue_init(&spool->free);[m
[31m-[m
[31m-        p = ngx_copy(spool->key, key.data, key.len);[m
[31m-        *p++ = '\0';[m
[31m-[m
[31m-        items = (ngx_http_lua_socket_pool_item_t *) (spool->key + key_len);[m
[31m-[m
[31m-        dd("items: %p", items);[m
[31m-[m
[31m-        ngx_http_lua_assert((void *) items == ngx_align_ptr(items,[m
[31m-                                                            sizeof(void *)));[m
[31m-[m
[31m-        for (i = 0; i < pool_size; i++) {[m
[31m-            ngx_queue_insert_head(&spool->free, &items[i].queue);[m
[31m-            items[i].socket_pool = spool;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_queue_empty(&spool->free)) {[m
[31m-[m
[31m-        q = ngx_queue_last(&spool->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-        spool->active_connections--;[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-[m
[31m-        ngx_http_lua_socket_tcp_close_connection(item->connection);[m
[31m-[m
[31m-    } else {[m
[31m-        q = ngx_queue_head(&spool->free);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-    }[m
[31m-[m
[31m-    item->connection = c;[m
[31m-    ngx_queue_insert_head(&spool->cache, q);[m
[31m-[m
[31m-    if (!u->reused) {[m
[31m-        spool->active_connections++;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua tcp socket clear current socket connection");[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-#if 0[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-        u->cleanup = NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (n >= 2) {[m
[31m-        timeout = (ngx_msec_t) luaL_checkinteger(L, 2);[m
[31m-[m
[31m-    } else {[m
[31m-        timeout = llcf->keepalive_timeout;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    if (timeout == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket keepalive timeout: unlimited");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (timeout) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket keepalive timeout: %M ms", timeout);[m
[31m-[m
[31m-        ngx_add_timer(c->read, timeout);[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_http_lua_socket_keepalive_dummy_handler;[m
[31m-    c->read->handler = ngx_http_lua_socket_keepalive_rev_handler;[m
[31m-[m
[31m-    c->data = item;[m
[31m-    c->idle = 1;[m
[31m-    c->log = ngx_cycle->log;[m
[31m-    c->pool->log = ngx_cycle->log;[m
[31m-    c->read->log = ngx_cycle->log;[m
[31m-    c->write->log = ngx_cycle->log;[m
[31m-[m
[31m-    item->socklen = pc->socklen;[m
[31m-    ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);[m
[31m-    item->reused = u->reused;[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        rc = ngx_http_lua_socket_keepalive_close_handler(c->read);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "connection in dubious state");[m
[31m-            return 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_get_keepalive_peer(ngx_http_request_t *r, lua_State *L,[m
[31m-    int key_index, ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_socket_pool_item_t     *item;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-    ngx_http_cleanup_t                  *cln;[m
[31m-    ngx_queue_t                         *q;[m
[31m-    int                                  top;[m
[31m-    ngx_peer_connection_t               *pc;[m
[31m-    ngx_connection_t                    *c;[m
[31m-[m
[31m-    top = lua_gettop(L);[m
[31m-[m
[31m-    if (key_index < 0) {[m
[31m-        key_index = top + key_index + 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket pool get keepalive peer");[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-    lua_pushvalue(L, key_index); /* key */[m
[31m-    lua_rawget(L, -2);[m
[31m-[m
[31m-    spool = lua_touserdata(L, -1);[m
[31m-    if (spool == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "lua tcp socket keepalive connection pool not found");[m
[31m-        lua_settop(L, top);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    u->socket_pool = spool;[m
[31m-[m
[31m-    if (!ngx_queue_empty(&spool->cache)) {[m
[31m-        q = ngx_queue_head(&spool->cache);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-        ngx_queue_insert_head(&spool->free, q);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "lua tcp socket get keepalive peer: using connection %p,"[m
[31m-                       " fd:%d", c, c->fd);[m
[31m-[m
[31m-        c->idle = 0;[m
[31m-        c->log = pc->log;[m
[31m-        c->pool->log = pc->log;[m
[31m-        c->read->log = pc->log;[m
[31m-        c->write->log = pc->log;[m
[31m-        c->data = u;[m
[31m-[m
[31m-#if 1[m
[31m-        c->write->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-        c->read->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-#endif[m
[31m-[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        pc->connection = c;[m
[31m-        pc->cached = 1;[m
[31m-[m
[31m-        u->reused = item->reused + 1;[m
[31m-[m
[31m-#if 1[m
[31m-        u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-        u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-#endif[m
[31m-[m
[31m-        if (u->cleanup == NULL) {[m
[31m-            cln = ngx_http_lua_cleanup_add(r, 0);[m
[31m-            if (cln == NULL) {[m
[31m-                u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-                lua_settop(L, top);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cln->handler = ngx_http_lua_socket_tcp_cleanup;[m
[31m-            cln->data = u;[m
[31m-            u->cleanup = &cln->handler;[m
[31m-        }[m
[31m-[m
[31m-        lua_settop(L, top);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua tcp socket keepalive: connection pool empty");[m
[31m-[m
[31m-    lua_settop(L, top);[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_keepalive_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "keepalive dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_keepalive_rev_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    (void) ngx_http_lua_socket_keepalive_close_handler(ev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_keepalive_close_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_lua_socket_pool_item_t     *item;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                       "lua tcp socket keepalive max idle timeout");[m
[31m-[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    dd("read event ready: %d", (int) c->read->ready);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "lua tcp socket keepalive close handler check stale events");[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {[m
[31m-        /* stale event */[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            goto close;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-close:[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "lua tcp socket keepalive close handler: fd:%d", c->fd);[m
[31m-[m
[31m-    item = c->data;[m
[31m-    spool = item->socket_pool;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_close_connection(c);[m
[31m-[m
[31m-    ngx_queue_remove(&item->queue);[m
[31m-    ngx_queue_insert_head(&spool->free, &item->queue);[m
[31m-    spool->active_connections--;[m
[31m-[m
[31m-    dd("keepalive: active connections: %u",[m
[31m-       (unsigned) spool->active_connections);[m
[31m-[m
[31m-    if (spool->active_connections == 0) {[m
[31m-        ngx_http_lua_socket_free_pool(ev->log, spool);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_free_pool(ngx_log_t *log, ngx_http_lua_socket_pool_t *spool)[m
[31m-{[m
[31m-    lua_State                           *L;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua tcp socket keepalive: free connection pool for \"%s\"",[m
[31m-                   spool->key);[m
[31m-[m
[31m-    L = spool->lua_vm;[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_pushstring(L, (char *) spool->key);[m
[31m-    lua_pushnil(L);[m
[31m-    lua_rawset(L, -3);[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_shutdown_pool(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-    ngx_http_lua_socket_pool_item_t     *item;[m
[31m-[m
[31m-    spool = lua_touserdata(L, 1);[m
[31m-    if (spool == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    while (!ngx_queue_empty(&spool->cache)) {[m
[31m-        q = ngx_queue_head(&spool->cache);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        ngx_http_lua_socket_tcp_close_connection(c);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-        ngx_queue_insert_head(&spool->free, q);[m
[31m-    }[m
[31m-[m
[31m-    spool->active_connections = 0;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_upstream_destroy(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-[m
[31m-    dd("upstream destroy triggered by Lua GC");[m
[31m-[m
[31m-    u = lua_touserdata(L, 1);[m
[31m-    if (u == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        ngx_http_lua_socket_tcp_cleanup(u); /* it will clear u->cleanup */[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_downstream_destroy(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t     *u;[m
[31m-[m
[31m-    dd("downstream destory");[m
[31m-[m
[31m-    u = lua_touserdata(L, 1);[m
[31m-    if (u == NULL) {[m
[31m-        dd("u is NULL");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        ngx_http_lua_socket_tcp_cleanup(u); /* it will clear u->cleanup */[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_push_input_data(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_socket_tcp_upstream_t *u,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_chain_t            **ll;[m
[31m-#if (DDEBUG) || (NGX_DTRACE)[m
[31m-    size_t                   size = 0;[m
[31m-#endif[m
[31m-    size_t                   chunk_size;[m
[31m-    ngx_buf_t               *b;[m
[31m-    size_t                   nbufs;[m
[31m-    luaL_Buffer              luabuf;[m
[31m-[m
[31m-    dd("bufs_in: %p, buf_in: %p", u->bufs_in, u->buf_in);[m
[31m-[m
[31m-    nbufs = 0;[m
[31m-    ll = NULL;[m
[31m-[m
[31m-    luaL_buffinit(L, &luabuf);[m
[31m-[m
[31m-    for (cl = u->bufs_in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-        chunk_size = b->last - b->pos;[m
[31m-[m
[31m-        dd("copying input data chunk from %p: \"%.*s\"", cl,[m
[31m-           (int) chunk_size, b->pos);[m
[31m-[m
[31m-        luaL_addlstring(&luabuf, (char *) b->pos, chunk_size);[m
[31m-[m
[31m-        if (cl->next) {[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-#if (DDEBUG) || (NGX_DTRACE)[m
[31m-        size += chunk_size;[m
[31m-#endif[m
[31m-[m
[31m-        nbufs++;[m
[31m-    }[m
[31m-[m
[31m-    luaL_pushresult(&luabuf);[m
[31m-[m
[31m-#if (DDEBUG)[m
[31m-    dd("size: %d, nbufs: %d", (int) size, (int) nbufs);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-    ngx_http_lua_probe_socket_tcp_receive_done(r, u,[m
[31m-                                               (u_char *) lua_tostring(L, -1),[m
[31m-                                               size);[m
[31m-#endif[m
[31m-[m
[31m-    if (nbufs > 1 && ll) {[m
[31m-        dd("recycle buffers: %d", (int) (nbufs - 1));[m
[31m-[m
[31m-        *ll = ctx->free_recv_bufs;[m
[31m-        ctx->free_recv_bufs = u->bufs_in;[m
[31m-        u->bufs_in = u->buf_in;[m
[31m-    }[m
[31m-[m
[31m-    if (u->buffer.pos == u->buffer.last) {[m
[31m-        dd("resetting u->buffer pos & last");[m
[31m-        u->buffer.pos = u->buffer.start;[m
[31m-        u->buffer.last = u->buffer.start;[m
[31m-    }[m
[31m-[m
[31m-    if (u->bufs_in) {[m
[31m-        u->buf_in->buf->last = u->buffer.pos;[m
[31m-        u->buf_in->buf->pos = u->buffer.pos;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_add_input_buffer(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_recv_bufs,[m
[31m-                                         u->conf->buffer_size);[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->buf_in->next = cl;[m
[31m-    u->buf_in = cl;[m
[31m-    u->buffer = *cl->buf;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_add_pending_data(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, u_char *pos, size_t len, u_char *pat,[m
[31m-    int prefix, int old_state)[m
[31m-{[m
[31m-    u_char          *last;[m
[31m-    ngx_buf_t       *b;[m
[31m-[m
[31m-    dd("resuming data: %d: [%.*s]", prefix, prefix, pat);[m
[31m-[m
[31m-    last = &pos[len];[m
[31m-[m
[31m-    b = u->buf_in->buf;[m
[31m-[m
[31m-    if (last - b->last == old_state) {[m
[31m-        b->last += prefix;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("need more buffers because %d != %d", (int) (last - b->last),[m
[31m-       (int) old_state);[m
[31m-[m
[31m-    if (ngx_http_lua_socket_insert_buffer(r, u, pat, prefix) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = last;[m
[31m-    b->last = last;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_socket_insert_buffer(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, u_char *pat, size_t prefix)[m
[31m-{[m
[31m-    ngx_chain_t             *cl, *new_cl, **ll;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    size_t                   size;[m
[31m-    ngx_buf_t               *b;[m
[31m-[m
[31m-    if (prefix <= u->conf->buffer_size) {[m
[31m-        size = u->conf->buffer_size;[m
[31m-[m
[31m-    } else {[m
[31m-        size = prefix;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    new_cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                             &ctx->free_recv_bufs,[m
[31m-                                             size);[m
[31m-[m
[31m-    if (new_cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = new_cl->buf;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, pat, prefix);[m
[31m-[m
[31m-    dd("copy resumed data to %p: %d: \"%.*s\"",[m
[31m-       new_cl, (int) (b->last - b->pos), (int) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    dd("before resuming data: bufs_in %p, buf_in %p, buf_in next %p",[m
[31m-       u->bufs_in, u->buf_in, u->buf_in->next);[m
[31m-[m
[31m-    ll = &u->bufs_in;[m
[31m-    for (cl = u->bufs_in; cl->next; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = new_cl;[m
[31m-    new_cl->next = u->buf_in;[m
[31m-[m
[31m-    dd("after resuming data: bufs_in %p, buf_in %p, buf_in next %p",[m
[31m-       u->bufs_in, u->buf_in, u->buf_in->next);[m
[31m-[m
[31m-#if (DDEBUG)[m
[31m-    for (cl = u->bufs_in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        dd("result buf after resuming data: %p: %.*s", cl,[m
[31m-           (int) ngx_buf_size(b), b->pos);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_conn_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return ngx_http_lua_socket_tcp_resume_helper(r, SOCKET_OP_CONNECT);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_read_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return ngx_http_lua_socket_tcp_resume_helper(r, SOCKET_OP_READ);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_write_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return ngx_http_lua_socket_tcp_resume_helper(r, SOCKET_OP_WRITE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_resume_helper(ngx_http_request_t *r, int socket_op)[m
[31m-{[m
[31m-    int                          nret;[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_retval_handler  prepare_retvals;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp operation done, resuming lua thread");[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    dd("coctx: %p", coctx);[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-[m
[31m-    switch (socket_op) {[m
[31m-    case SOCKET_OP_CONNECT:[m
[31m-    case SOCKET_OP_WRITE:[m
[31m-        prepare_retvals = u->write_prepare_retvals;[m
[31m-        break;[m
[31m-[m
[31m-    case SOCKET_OP_READ:[m
[31m-        prepare_retvals = u->read_prepare_retvals;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        /* impossible to reach here */[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket calling prepare retvals handler %p, "[m
[31m-                   "u:%p", prepare_retvals, u);[m
[31m-[m
[31m-    nret = prepare_retvals(r, u, ctx->cur_co_ctx->co);[m
[31m-    if (nret == NGX_AGAIN) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, nret);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_tcp_resolve_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t                      *rctx;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua tcp socket abort resolver");[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-    if (u == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rctx = u->resolved->ctx;[m
[31m-    if (rctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* just to be safer */[m
[31m-    rctx->handler = ngx_http_lua_socket_empty_resolve_handler;[m
[31m-[m
[31m-    ngx_resolve_name_done(rctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_coctx_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    dd("running coctx cleanup");[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-    if (u == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize(u->request, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ssl_free_session(lua_State *L)[m
[31m-{[m
[31m-    ngx_ssl_session_t      **psession;[m
[31m-[m
[31m-    psession = lua_touserdata(L, 1);[m
[31m-    if (psession && *psession != NULL) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "lua ssl free session: %p:%d", *psession,[m
[31m-                       (*psession)->references);[m
[31m-[m
[31m-        ngx_ssl_free_session(*psession);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_cleanup_conn_pools(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-    ngx_http_lua_socket_pool_item_t     *item;[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-[m
[31m-    lua_pushnil(L);  /* first key */[m
[31m-    while (lua_next(L, -2) != 0) {[m
[31m-        /* tb key val */[m
[31m-        spool = lua_touserdata(L, -1);[m
[31m-[m
[31m-        if (!ngx_queue_empty(&spool->cache)) {[m
[31m-            q = ngx_queue_head(&spool->cache);[m
[31m-            item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-            c = item->connection;[m
[31m-[m
[31m-            ngx_http_lua_socket_tcp_close_connection(c);[m
[31m-[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                           "lua tcp socket keepalive: free connection pool "[m
[31m-                           "for \"%s\"", spool->key);[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.h[m
[1mdeleted file mode 100644[m
[1mindex dbdee41..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.h[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_ERROR         0x0001[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_TIMEOUT       0x0002[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_CLOSED        0x0004[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_RESOLVER      0x0008[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_BUFTOOSMALL   0x0010[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_NOMEM         0x0020[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE  0x0040[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT   0x0080[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_SSL           0x0100[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_socket_tcp_upstream_s[m
[31m-        ngx_http_lua_socket_tcp_upstream_t;[m
[31m-[m
[31m-[m
[31m-typedef[m
[31m-    int (*ngx_http_lua_socket_tcp_retval_handler)(ngx_http_request_t *r,[m
[31m-        ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_lua_socket_tcp_upstream_handler_pt)[m
[31m-    (ngx_http_request_t *r, ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    lua_State                         *lua_vm;[m
[31m-[m
[31m-    /* active connections == out-of-pool reused connections[m
[31m-     *                       + in-pool connections */[m
[31m-    ngx_uint_t                         active_connections;[m
[31m-[m
[31m-    /* queues of ngx_http_lua_socket_pool_item_t: */[m
[31m-    ngx_queue_t                        cache;[m
[31m-    ngx_queue_t                        free;[m
[31m-[m
[31m-    u_char                             key[1];[m
[31m-[m
[31m-} ngx_http_lua_socket_pool_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_socket_tcp_upstream_s {[m
[31m-    ngx_http_lua_socket_tcp_retval_handler          read_prepare_retvals;[m
[31m-    ngx_http_lua_socket_tcp_retval_handler          write_prepare_retvals;[m
[31m-    ngx_http_lua_socket_tcp_upstream_handler_pt     read_event_handler;[m
[31m-    ngx_http_lua_socket_tcp_upstream_handler_pt     write_event_handler;[m
[31m-[m
[31m-    ngx_http_lua_socket_pool_t      *socket_pool;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t         *conf;[m
[31m-    ngx_http_cleanup_pt             *cleanup;[m
[31m-    ngx_http_request_t              *request;[m
[31m-    ngx_peer_connection_t            peer;[m
[31m-[m
[31m-    ngx_msec_t                       read_timeout;[m
[31m-    ngx_msec_t                       send_timeout;[m
[31m-    ngx_msec_t                       connect_timeout;[m
[31m-[m
[31m-    ngx_http_upstream_resolved_t    *resolved;[m
[31m-[m
[31m-    ngx_chain_t                     *bufs_in; /* input data buffers */[m
[31m-    ngx_chain_t                     *buf_in; /* last input data buffer */[m
[31m-    ngx_buf_t                        buffer; /* receive buffer */[m
[31m-[m
[31m-    size_t                           length;[m
[31m-    size_t                           rest;[m
[31m-[m
[31m-    ngx_err_t                        socket_errno;[m
[31m-[m
[31m-    ngx_int_t                      (*input_filter)(void *data, ssize_t bytes);[m
[31m-    void                            *input_filter_ctx;[m
[31m-[m
[31m-    size_t                           request_len;[m
[31m-    ngx_chain_t                     *request_bufs;[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t           *read_co_ctx;[m
[31m-    ngx_http_lua_co_ctx_t           *write_co_ctx;[m
[31m-[m
[31m-    ngx_uint_t                       reused;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_str_t                        ssl_name;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                         ft_type:16;[m
[31m-    unsigned                         no_close:1;[m
[31m-    unsigned                         conn_waiting:1;[m
[31m-    unsigned                         read_waiting:1;[m
[31m-    unsigned                         write_waiting:1;[m
[31m-    unsigned                         eof:1;[m
[31m-    unsigned                         body_downstream:1;[m
[31m-    unsigned                         raw_downstream:1;[m
[31m-    unsigned                         read_closed:1;[m
[31m-    unsigned                         write_closed:1;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    unsigned                         ssl_verify:1;[m
[31m-    unsigned                         ssl_session_reuse:1;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_dfa_edge_s  ngx_http_lua_dfa_edge_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_dfa_edge_s {[m
[31m-    u_char                           chr;[m
[31m-    int                              new_state;[m
[31m-    ngx_http_lua_dfa_edge_t         *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *upstream;[m
[31m-[m
[31m-    ngx_str_t                            pattern;[m
[31m-    int                                  state;[m
[31m-    ngx_http_lua_dfa_edge_t            **recovering;[m
[31m-[m
[31m-    unsigned                             inclusive:1;[m
[31m-} ngx_http_lua_socket_compiled_pattern_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_socket_pool_t      *socket_pool;[m
[31m-[m
[31m-    ngx_queue_t                      queue;[m
[31m-    ngx_connection_t                *connection;[m
[31m-[m
[31m-    socklen_t                        socklen;[m
[31m-    struct sockaddr_storage          sockaddr;[m
[31m-[m
[31m-    ngx_uint_t                       reused;[m
[31m-[m
[31m-} ngx_http_lua_socket_pool_item_t;[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_socket_tcp_api(ngx_log_t *log, lua_State *L);[m
[31m-void ngx_http_lua_inject_req_socket_api(lua_State *L);[m
[31m-void ngx_http_lua_cleanup_conn_pools(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.c[m
[1mdeleted file mode 100644[m
[1mindex 1ec0c00..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.c[m
[1m+++ /dev/null[m
[36m@@ -1,1615 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_socket_udp.h"[m
[31m-#include "ngx_http_lua_socket_tcp.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-#if 1[m
[31m-#undef ngx_http_lua_probe_info[m
[31m-#define ngx_http_lua_probe_info(msg)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define UDP_MAX_DATAGRAM_SIZE 8192[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_socket_udp(lua_State *L);[m
[31m-static int ngx_http_lua_socket_udp_setpeername(lua_State *L);[m
[31m-static int ngx_http_lua_socket_udp_send(lua_State *L);[m
[31m-static int ngx_http_lua_socket_udp_receive(lua_State *L);[m
[31m-static int ngx_http_lua_socket_udp_settimeout(lua_State *L);[m
[31m-static void ngx_http_lua_socket_udp_finalize(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static int ngx_http_lua_socket_udp_upstream_destroy(lua_State *L);[m
[31m-static int ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);[m
[31m-static void ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static int ngx_http_lua_socket_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);[m
[31m-static void ngx_http_lua_socket_udp_handle_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_lua_socket_udp_cleanup(void *data);[m
[31m-static void ngx_http_lua_socket_udp_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static int ngx_http_lua_socket_udp_receive_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_udp_read(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_udp_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_udp_handle_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_udp_connect(ngx_http_lua_udp_connection_t *uc);[m
[31m-static int ngx_http_lua_socket_udp_close(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_udp_resume(ngx_http_request_t *r);[m
[31m-static void ngx_http_lua_udp_resolve_cleanup(void *data);[m
[31m-static void ngx_http_lua_udp_socket_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SOCKET_CTX_INDEX = 1,[m
[31m-    SOCKET_TIMEOUT_INDEX = 2[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char ngx_http_lua_socket_udp_metatable_key;[m
[31m-static char ngx_http_lua_udp_udata_metatable_key;[m
[31m-static u_char ngx_http_lua_socket_udp_buffer[UDP_MAX_DATAGRAM_SIZE];[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_socket_udp_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    lua_getfield(L, -1, "socket"); /* ngx socket */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp);[m
[31m-    lua_setfield(L, -2, "udp"); /* ngx socket */[m
[31m-[m
[31m-    /* udp socket object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_udp_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 6 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_setpeername);[m
[31m-    lua_setfield(L, -2, "setpeername"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_send);[m
[31m-    lua_setfield(L, -2, "send");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_receive);[m
[31m-    lua_setfield(L, -2, "receive");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_settimeout);[m
[31m-    lua_setfield(L, -2, "settimeout"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_close);[m
[31m-    lua_setfield(L, -2, "close"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* udp socket object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_udp_udata_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_upstream_destroy);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    if (lua_gettop(L) != 0) {[m
[31m-        return luaL_error(L, "expecting zero arguments, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    lua_createtable(L, 3 /* narr */, 1 /* nrec */);[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_udp_metatable_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    dd("top: %d", lua_gettop(L));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_setpeername(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_str_t                    host;[m
[31m-    int                          port;[m
[31m-    ngx_resolver_ctx_t          *rctx, temp;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    int                          saved_top;[m
[31m-    int                          n;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_url_t                    url;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    int                          timeout;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_http_lua_udp_connection_t           *uc;[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-[m
[31m-    /*[m
[31m-     * TODO: we should probably accept an extra argument to setpeername()[m
[31m-     * to allow the user bind the datagram unix domain socket himself,[m
[31m-     * which is necessary for systems without autobind support.[m
[31m-     */[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 2 && n != 3) {[m
[31m-        return luaL_error(L, "ngx.socket.udp setpeername: expecting 2 or 3 "[m
[31m-                          "arguments (including the object), but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    host.data = ngx_palloc(r->pool, len + 1);[m
[31m-    if (host.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    host.len = len;[m
[31m-[m
[31m-    ngx_memcpy(host.data, p, len);[m
[31m-    host.data[len] = '\0';[m
[31m-[m
[31m-    if (n == 3) {[m
[31m-        port = luaL_checkinteger(L, 3);[m
[31m-[m
[31m-        if (port < 0 || port > 65536) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "bad port number: %d", port);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-    } else { /* n == 2 */[m
[31m-        port = 0;[m
[31m-    }[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u) {[m
[31m-        if (u->request && u->request != r) {[m
[31m-            return luaL_error(L, "bad request");[m
[31m-        }[m
[31m-[m
[31m-        if (u->waiting) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "socket busy");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (u->udp_connection.connection) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua udp socket reconnect without shutting down");[m
[31m-[m
[31m-            ngx_http_lua_socket_udp_finalize(r, u);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua reuse socket upstream ctx");[m
[31m-[m
[31m-    } else {[m
[31m-        u = lua_newuserdata(L, sizeof(ngx_http_lua_socket_udp_upstream_t));[m
[31m-        if (u == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_udp_udata_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-#endif[m
[31m-[m
[31m-        lua_rawseti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u, sizeof(ngx_http_lua_socket_udp_upstream_t));[m
[31m-[m
[31m-    u->request = r; /* set the controlling request */[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    u->conf = llcf;[m
[31m-[m
[31m-    uc = &u->udp_connection;[m
[31m-[m
[31m-    uc->log = *r->connection->log;[m
[31m-[m
[31m-    dd("lua peer connection log: %p", &uc->log);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_TIMEOUT_INDEX);[m
[31m-    timeout = (ngx_int_t) lua_tointeger(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (timeout > 0) {[m
[31m-        u->read_timeout = (ngx_msec_t) timeout;[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_timeout = u->conf->read_timeout;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.len = host.len;[m
[31m-    url.url.data = host.data;[m
[31m-    url.default_port = (in_port_t) port;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        lua_pushnil(L);[m
[31m-[m
[31m-        if (url.err) {[m
[31m-            lua_pushfstring(L, "failed to parse host name \"%s\": %s",[m
[31m-                            host.data, url.err);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushfstring(L, "failed to parse host name \"%s\"", host.data);[m
[31m-        }[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket network address given directly");[m
[31m-[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = host;[m
[31m-        u->resolved->port = (in_port_t) port;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved->sockaddr) {[m
[31m-        rc = ngx_http_lua_socket_resolve_retval_handler(r, u, L);[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return lua_yield(L, 0);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    temp.name = host;[m
[31m-    rctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-    if (rctx == NULL) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to start the resolver");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (rctx == NGX_NO_RESOLVER) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "no resolver defined to resolve \"%s\"", host.data);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    rctx->name = host;[m
[31m-#if !defined(nginx_version) || nginx_version < 1005008[m
[31m-    rctx->type = NGX_RESOLVE_A;[m
[31m-#endif[m
[31m-    rctx->handler = ngx_http_lua_socket_resolve_handler;[m
[31m-    rctx->data = u;[m
[31m-    rctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-    u->co_ctx = ctx->cur_co_ctx;[m
[31m-    u->resolved->ctx = rctx;[m
[31m-[m
[31m-    saved_top = lua_gettop(L);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_udp_resolve_cleanup;[m
[31m-[m
[31m-    if (ngx_resolve_name(rctx) != NGX_OK) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket fail to run resolver immediately");[m
[31m-[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-[m
[31m-        u->resolved->ctx = NULL;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "%s could not be resolved", host.data);[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting == 1) {[m
[31m-        /* resolved and already connecting */[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    n = lua_gettop(L) - saved_top;[m
[31m-    if (n) {[m
[31m-        /* errors occurred during resolving or connecting[m
[31m-         * or already connected */[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    /* still resolving */[m
[31m-[m
[31m-    u->waiting = 1;[m
[31m-    u->prepare_retvals = ngx_http_lua_socket_resolve_retval_handler;[m
[31m-[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_upstream_resolved_t        *ur;[m
[31m-    ngx_http_lua_ctx_t                  *lctx;[m
[31m-    lua_State                           *L;[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-#if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    socklen_t                            socklen;[m
[31m-    struct sockaddr                     *sockaddr;[m
[31m-#else[m
[31m-    struct sockaddr_in                  *sin;[m
[31m-#endif[m
[31m-    ngx_uint_t                           i;[m
[31m-    unsigned                             waiting;[m
[31m-[m
[31m-    u = ctx->data;[m
[31m-    r = u->request;[m
[31m-    c = r->connection;[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua udp socket resolve handler");[m
[31m-[m
[31m-    lctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (lctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lctx->cur_co_ctx = u->co_ctx;[m
[31m-[m
[31m-    u->co_ctx->cleanup = NULL;[m
[31m-[m
[31m-    L = lctx->cur_co_ctx->co;[m
[31m-[m
[31m-    dd("setting socket_ready to 1");[m
[31m-[m
[31m-    waiting = u->waiting;[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "lua udp socket resolver error: %s (waiting: %d)",[m
[31m-                       ngx_resolver_strerror(ctx->state), (int) u->waiting);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len);[m
[31m-        lua_pushfstring(L, " could not be resolved (%d: %s)",[m
[31m-                        (int) ctx->state,[m
[31m-                        ngx_resolver_strerror(ctx->state));[m
[31m-        lua_concat(L, 2);[m
[31m-[m
[31m-#if 1[m
[31m-        ngx_resolve_name_done(ctx);[m
[31m-        ur->ctx = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        u->prepare_retvals = ngx_http_lua_socket_error_retval_handler;[m
[31m-        ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_RESOLVER);[m
[31m-[m
[31m-        if (waiting) {[m
[31m-            ngx_http_run_posted_requests(c);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ur->naddrs = ctx->naddrs;[m
[31m-    ur->addrs = ctx->addrs;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-#   if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    u_char      text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t   addr;[m
[31m-#   else[m
[31m-    in_addr_t   addr;[m
[31m-#   endif[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-#   if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-    }[m
[31m-#   else[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        dd("addr i: %d %p", (int) i,  &ctx->addrs[i]);[m
[31m-[m
[31m-        addr = ntohl(ctx->addrs[i]);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "name was resolved to %ud.%ud.%ud.%ud",[m
[31m-                       (addr >> 24) & 0xff, (addr >> 16) & 0xff,[m
[31m-                       (addr >> 8) & 0xff, addr & 0xff);[m
[31m-    }[m
[31m-#   endif[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_assert(ur->naddrs > 0);[m
[31m-[m
[31m-    if (ur->naddrs == 1) {[m
[31m-        i = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        i = ngx_random() % ur->naddrs;[m
[31m-    }[m
[31m-[m
[31m-    dd("selected addr index: %d", (int) i);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    socklen = ur->addrs[i].socklen;[m
[31m-[m
[31m-    sockaddr = ngx_palloc(r->pool, socklen);[m
[31m-    if (sockaddr == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);[m
[31m-[m
[31m-    switch (sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        ((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);[m
[31m-        break;[m
[31m-#endif[m
[31m-    default: /* AF_INET */[m
[31m-        ((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);[m
[31m-    ur->sockaddr = sockaddr;[m
[31m-    ur->socklen = socklen;[m
[31m-[m
[31m-#else[m
[31m-    /* for nginx older than 1.5.8 */[m
[31m-[m
[31m-    len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    sin = (struct sockaddr_in *) &p[len];[m
[31m-    ngx_memzero(sin, sizeof(struct sockaddr_in));[m
[31m-[m
[31m-    len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);[m
[31m-    len = ngx_sprintf(&p[len], ":%d", ur->port) - p;[m
[31m-[m
[31m-    sin->sin_family = AF_INET;[m
[31m-    sin->sin_port = htons(ur->port);[m
[31m-    sin->sin_addr.s_addr = ur->addrs[i];[m
[31m-[m
[31m-    ur->sockaddr = (struct sockaddr *) sin;[m
[31m-    ur->socklen = sizeof(struct sockaddr_in);[m
[31m-#endif[m
[31m-[m
[31m-    ur->host.data = p;[m
[31m-    ur->host.len = len;[m
[31m-    ur->naddrs = 1;[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-    ur->ctx = NULL;[m
[31m-[m
[31m-    u->waiting = 0;[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        lctx->resume_handler = ngx_http_lua_socket_udp_resume;[m
[31m-        r->write_event_handler(r);[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    } else {[m
[31m-        (void) ngx_http_lua_socket_resolve_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    if (ur->ctx) {[m
[31m-        ngx_resolve_name_done(ctx);[m
[31m-        ur->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    u->prepare_retvals = ngx_http_lua_socket_error_retval_handler;[m
[31m-    ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                         NGX_HTTP_LUA_SOCKET_FT_NOMEM);[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_http_lua_co_ctx_t           *coctx;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_cleanup_t              *cln;[m
[31m-    ngx_http_upstream_resolved_t    *ur;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_lua_udp_connection_t   *uc;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket resolve retval handler");[m
[31m-[m
[31m-    if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_RESOLVER) {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    uc = &u->udp_connection;[m
[31m-[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    if (ur->sockaddr) {[m
[31m-        uc->sockaddr = ur->sockaddr;[m
[31m-        uc->socklen = ur->socklen;[m
[31m-        uc->server = ur->host;[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "resolver not working");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_udp_connect(uc);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "no memory");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_socket_udp_cleanup;[m
[31m-        cln->data = u;[m
[31m-        u->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket connect: %i", rc);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return ngx_http_lua_socket_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    c = uc->connection;[m
[31m-[m
[31m-    c->data = u;[m
[31m-[m
[31m-    c->write->handler = NULL;[m
[31m-    c->read->handler = ngx_http_lua_socket_udp_handler;[m
[31m-    c->read->resolver = 0;[m
[31m-[m
[31m-    c->pool = r->pool;[m
[31m-    c->log = r->connection->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    u_char           errstr[NGX_MAX_ERROR_STR];[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket error retval handler");[m
[31m-[m
[31m-    if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_RESOLVER) {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-[m
[31m-    if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE) {[m
[31m-        lua_pushliteral(L, "partial write");[m
[31m-[m
[31m-    } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_TIMEOUT) {[m
[31m-        lua_pushliteral(L, "timeout");[m
[31m-[m
[31m-    } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_CLOSED) {[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-[m
[31m-    } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_BUFTOOSMALL) {[m
[31m-        lua_pushliteral(L, "buffer too small");[m
[31m-[m
[31m-    } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_NOMEM) {[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (u->socket_errno) {[m
[31m-#if defined(nginx_version) && nginx_version >= 9000[m
[31m-            p = ngx_strerror(u->socket_errno, errstr, sizeof(errstr));[m
[31m-#else[m
[31m-            p = ngx_strerror_r(u->socket_errno, errstr, sizeof(errstr));[m
[31m-#endif[m
[31m-            /* for compatibility with LuaSocket */[m
[31m-            ngx_strlow(errstr, errstr, p - errstr);[m
[31m-            lua_pushlstring(L, (char *) errstr, p - errstr);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushliteral(L, "error");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_send(lua_State *L)[m
[31m-{[m
[31m-    ssize_t                              n;[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-    int                                  type;[m
[31m-    const char                          *msg;[m
[31m-    ngx_str_t                            query;[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expecting 2 arguments (including the object), "[m
[31m-                          "but got %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL || u->udp_connection.connection == NULL) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to send data on a closed socket: u:%p, c:%p",[m
[31m-                          u, u ? u->udp_connection.connection : NULL);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-        u->ft_type = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "socket busy");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    type = lua_type(L, 2);[m
[31m-    switch (type) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            lua_tolstring(L, 2, &len);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            len = ngx_http_lua_calc_strlen_in_table(L, 2, 2, 1 /* strict */);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "string, number, boolean, nil, "[m
[31m-                                  "or array table expected, got %s",[m
[31m-                                  lua_typename(L, type));[m
[31m-[m
[31m-            return luaL_argerror(L, 2, msg);[m
[31m-    }[m
[31m-[m
[31m-    query.data = lua_newuserdata(L, len);[m
[31m-    query.len = len;[m
[31m-[m
[31m-    switch (type) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            p = (u_char *) lua_tolstring(L, 2, &len);[m
[31m-            ngx_memcpy(query.data, (u_char *) p, len);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            (void) ngx_http_lua_copy_str_in_table(L, 2, query.data);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return luaL_error(L, "impossible to reach here");[m
[31m-    }[m
[31m-[m
[31m-    u->ft_type = 0;[m
[31m-[m
[31m-    /* mimic ngx_http_upstream_init_request here */[m
[31m-[m
[31m-#if 1[m
[31m-    u->waiting = 0;[m
[31m-#endif[m
[31m-[m
[31m-    dd("sending query %.*s", (int) query.len, query.data);[m
[31m-[m
[31m-    n = ngx_send(u->udp_connection.connection, query.data, query.len);[m
[31m-[m
[31m-    dd("ngx_send returns %d (query len %d)", (int) n, (int) query.len);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == NGX_AGAIN) {[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-[m
[31m-        return ngx_http_lua_socket_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    if (n != (ssize_t) query.len) {[m
[31m-        dd("not the while query was sent");[m
[31m-[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE;[m
[31m-        return ngx_http_lua_socket_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    dd("n == len");[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_receive(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx;[m
[31m-    size_t                               size;[m
[31m-    int                                  nargs;[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-    if (nargs != 1 && nargs != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments "[m
[31m-                          "(including the object), but got %d", nargs);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket calling receive() method");[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL || u->udp_connection.connection == NULL) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to receive data on a closed socket: u:%p, "[m
[31m-                          "c:%p", u, u ? u->udp_connection.connection : NULL);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-        u->ft_type = 0;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (u->waiting) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "socket busy");[m
[31m-        return 2;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket read timeout: %M", u->read_timeout);[m
[31m-[m
[31m-    size = (size_t) luaL_optnumber(L, 2, UDP_MAX_DATAGRAM_SIZE);[m
[31m-    size = ngx_min(size, UDP_MAX_DATAGRAM_SIZE);[m
[31m-[m
[31m-    u->recv_buf_size = size;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket receive buffer size: %uz", u->recv_buf_size);[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_udp_read(r, u);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("read failed: %d", (int) u->ft_type);[m
[31m-        rc = ngx_http_lua_socket_udp_receive_retval_handler(r, u, L);[m
[31m-        dd("udp receive retval returned: %d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket receive done in a single run");[m
[31m-[m
[31m-        return ngx_http_lua_socket_udp_receive_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* n == NGX_AGAIN */[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_udp_read_handler;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_udp_socket_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    u->co_ctx = coctx;[m
[31m-    u->waiting = 1;[m
[31m-    u->prepare_retvals = ngx_http_lua_socket_udp_receive_retval_handler;[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_receive_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket receive return value handler");[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-        return ngx_http_lua_socket_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) ngx_http_lua_socket_udp_buffer, u->received);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_settimeout(lua_State *L)[m
[31m-{[m
[31m-    int                     n;[m
[31m-    ngx_int_t               timeout;[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 2) {[m
[31m-        return luaL_error(L, "ngx.socket settimout: expecting at least 2 "[m
[31m-                          "arguments (including the object) but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    timeout = (ngx_int_t) lua_tonumber(L, 2);[m
[31m-[m
[31m-    lua_rawseti(L, 1, SOCKET_TIMEOUT_INDEX);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u) {[m
[31m-        if (timeout > 0) {[m
[31m-            u->read_timeout = (ngx_msec_t) timeout;[m
[31m-[m
[31m-        } else {[m
[31m-            u->read_timeout = u->conf->read_timeout;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_finalize(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua finalize socket");[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-        u->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->udp_connection.connection) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua close socket connection");[m
[31m-[m
[31m-        ngx_close_connection(u->udp_connection.connection);[m
[31m-        u->udp_connection.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        u->waiting = 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_upstream_destroy(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-[m
[31m-    dd("upstream destroy triggered by Lua GC");[m
[31m-[m
[31m-    u = lua_touserdata(L, 1);[m
[31m-    if (u == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        ngx_http_lua_socket_udp_cleanup(u); /* it will clear u->cleanup */[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_udp_read(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_event_t                 *rev;[m
[31m-    ssize_t                      n;[m
[31m-[m
[31m-    c = u->udp_connection.connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua udp socket read data: waiting: %d", (int) u->waiting);[m
[31m-[m
[31m-    n = ngx_udp_recv(u->udp_connection.connection,[m
[31m-                     ngx_http_lua_socket_udp_buffer, u->recv_buf_size);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua udp recv returned %z", n);[m
[31m-[m
[31m-    if (n >= 0) {[m
[31m-        u->received = n;[m
[31m-        ngx_http_lua_socket_udp_handle_success(r, u);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-        ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* n == NGX_AGAIN */[m
[31m-[m
[31m-#if 1[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        ngx_add_timer(rev, u->read_timeout);[m
[31m-[m
[31m-    } else if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->udp_connection.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket read handler");[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        c->read->timedout = 0;[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua udp socket read timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    (void) ngx_http_lua_socket_udp_read(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_handle_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket handle error");[m
[31m-[m
[31m-    u->ft_type |= ft_type;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_socket_udp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    coctx = u->co_ctx;[m
[31m-[m
[31m-    if (coctx) {[m
[31m-        coctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        u->waiting = 0;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_udp_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u = data;[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = u->request;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup lua udp socket upstream request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_finalize(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_request_t              *r;[m
[31m-    ngx_http_log_ctx_t              *ctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    u = c->data;[m
[31m-    r = u->request;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->fd != (ngx_socket_t) -1) {  /* not a fake connection */[m
[31m-        ctx = c->log->data;[m
[31m-        ctx->current_request = r;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua udp socket handler for \"%V?%V\", wev %d", &r->uri,[m
[31m-                   &r->args, (int) ev->write);[m
[31m-[m
[31m-    u->read_event_handler(r, u);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_handle_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    if (u->co_ctx) {[m
[31m-        u->co_ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        u->waiting = 0;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_udp_resume;[m
[31m-        ctx->cur_co_ctx = u->co_ctx;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_udp_connect(ngx_http_lua_udp_connection_t *uc)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    ngx_int_t          event;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    s = ngx_socket(uc->sockaddr->sa_family, SOCK_DGRAM, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "UDP socket %d", s);[m
[31m-[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(s, &uc->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n "failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = &uc->log;[m
[31m-    wev->log = &uc->log;[m
[31m-[m
[31m-    uc->connection = c;[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-#if (NGX_HTTP_LUA_HAVE_SO_PASSCRED)[m
[31m-    if (uc->sockaddr->sa_family == AF_UNIX) {[m
[31m-        struct sockaddr         addr;[m
[31m-[m
[31m-        addr.sa_family = AF_UNIX;[m
[31m-[m
[31m-        /* just to make valgrind happy */[m
[31m-        ngx_memzero(addr.sa_data, sizeof(addr.sa_data));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "datagram unix "[m
[31m-                       "domain socket autobind");[m
[31m-[m
[31m-        if (bind(uc->connection->fd, &addr, sizeof(sa_family_t)) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,[m
[31m-                          "bind() failed");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &uc->log, 0,[m
[31m-                   "connect to %V, fd:%d #%d", &uc->server, s, c->number);[m
[31m-[m
[31m-    rc = connect(s, uc->sockaddr, uc->socklen);[m
[31m-[m
[31m-    /* TODO: aio, iocp */[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,[m
[31m-                      "connect() failed");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* UDP sockets are always ready to write */[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    if (ngx_add_event) {[m
[31m-[m
[31m-        event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?[m
[31m-                    /* kqueue, epoll */                 NGX_CLEAR_EVENT:[m
[31m-                    /* select, poll, /dev/poll */       NGX_LEVEL_EVENT;[m
[31m-                    /* eventport event type has no meaning: oneshot only */[m
[31m-[m
[31m-        if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* rtsig */[m
[31m-[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_close(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument "[m
[31m-                          "(including the object) but seen %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL || u->udp_connection.connection == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "socket busy");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_finalize(r, u);[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_udp_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                          nret;[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp operation done, resuming lua thread");[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_probe_info("udp resume");[m
[31m-#endif[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket calling prepare retvals handler %p, "[m
[31m-                   "u:%p", u->prepare_retvals, u);[m
[31m-[m
[31m-    nret = u->prepare_retvals(r, u, ctx->cur_co_ctx->co);[m
[31m-    if (nret == NGX_AGAIN) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, nret);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_udp_resolve_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t                      *rctx;[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-    if (u == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rctx = u->resolved->ctx;[m
[31m-    if (rctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(rctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_udp_socket_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-    if (u == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_finalize(u->request, u);[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.h[m
[1mdeleted file mode 100644[m
[1mindex 8333346..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.h[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_socket_udp_upstream_s[m
[31m-    ngx_http_lua_socket_udp_upstream_t;[m
[31m-[m
[31m-[m
[31m-typedef[m
[31m-    int (*ngx_http_lua_socket_udp_retval_handler)(ngx_http_request_t *r,[m
[31m-        ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_lua_socket_udp_upstream_handler_pt)[m
[31m-    (ngx_http_request_t *r, ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_connection_t         *connection;[m
[31m-    struct sockaddr          *sockaddr;[m
[31m-    socklen_t                 socklen;[m
[31m-    ngx_str_t                 server;[m
[31m-    ngx_log_t                 log;[m
[31m-} ngx_http_lua_udp_connection_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_socket_udp_upstream_s {[m
[31m-    ngx_http_lua_socket_udp_retval_handler          prepare_retvals;[m
[31m-    ngx_http_lua_socket_udp_upstream_handler_pt     read_event_handler;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t         *conf;[m
[31m-    ngx_http_cleanup_pt             *cleanup;[m
[31m-    ngx_http_request_t              *request;[m
[31m-    ngx_http_lua_udp_connection_t    udp_connection;[m
[31m-[m
[31m-    ngx_msec_t                       read_timeout;[m
[31m-[m
[31m-    ngx_http_upstream_resolved_t    *resolved;[m
[31m-[m
[31m-    ngx_uint_t                       ft_type;[m
[31m-    ngx_err_t                        socket_errno;[m
[31m-    size_t                           received; /* for receive */[m
[31m-    size_t                           recv_buf_size;[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t           *co_ctx;[m
[31m-[m
[31m-    unsigned                         waiting; /* :1 */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_socket_udp_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.c[m
[1mdeleted file mode 100644[m
[1mindex c06bc8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.c[m
[1m+++ /dev/null[m
[36m@@ -1,958 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_initworkerby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_ssl_module.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_ssl_certby.h"[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NGX_HTTP_LUA_ADDR_TYPE_UNIX  = 0,[m
[31m-    NGX_HTTP_LUA_ADDR_TYPE_INET  = 1,[m
[31m-    NGX_HTTP_LUA_ADDR_TYPE_INET6 = 2[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void ngx_http_lua_ssl_cert_done(void *data);[m
[31m-static void ngx_http_lua_ssl_cert_aborted(void *data);[m
[31m-static u_char *ngx_http_lua_log_ssl_cert_error(ngx_log_t *log, u_char *buf,[m
[31m-    size_t len);[m
[31m-static ngx_int_t ngx_http_lua_ssl_cert_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-int  ngx_http_lua_ssl_ctx_index = -1;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_ssl_cert_handler_file(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L,[m
[31m-                                     lscf->ssl.cert_src.data,[m
[31m-                                     lscf->ssl.cert_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_ssl_cert_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_ssl_cert_handler_inline(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       lscf->ssl.cert_src.data,[m
[31m-                                       lscf->ssl.cert_src.len,[m
[31m-                                       lscf->ssl.cert_src_key,[m
[31m-                                       "=ssl_certificate_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_ssl_cert_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_ssl_cert_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_ssl_cert_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_ssl_cert_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x1000205fL[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                  "at least OpenSSL 1.0.2e required but found "[m
[31m-                  OPENSSL_VERSION_TEXT);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *name;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_srv_conf_t    *lscf = conf;[m
[31m-[m
[31m-    /*  must specifiy a concrete handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (lscf->ssl.cert_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_lua_ssl_ctx_index == -1) {[m
[31m-        ngx_http_lua_ssl_ctx_index = SSL_get_ex_new_index(0, NULL, NULL,[m
[31m-                                                          NULL, NULL);[m
[31m-[m
[31m-        if (ngx_ssl_connection_index == -1) {[m
[31m-            ngx_ssl_error(NGX_LOG_ALERT, cf->log, 0,[m
[31m-                          "lua: SSL_get_ex_new_index() failed");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lscf->ssl.cert_handler = (ngx_http_lua_srv_conf_handler_pt) cmd->post;[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_ssl_cert_handler_file) {[m
[31m-        /* Lua code in an external file */[m
[31m-[m
[31m-        name = ngx_http_lua_rebase_path(cf->pool, value[1].data,[m
[31m-                                        value[1].len);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->ssl.cert_src.data = name;[m
[31m-        lscf->ssl.cert_src.len = ngx_strlen(name);[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->ssl.cert_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        /* inlined Lua code */[m
[31m-[m
[31m-        lscf->ssl.cert_src = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->ssl.cert_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#endif  /* OPENSSL_VERSION_NUMBER < 0x1000205fL */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ssl_cert_handler(ngx_ssl_conn_t *ssl_conn, void *data)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_connection_t                *c, *fc;[m
[31m-    ngx_http_request_t              *r = NULL;[m
[31m-    ngx_pool_cleanup_t              *cln;[m
[31m-    ngx_http_connection_t           *hc;[m
[31m-    ngx_http_lua_srv_conf_t         *lscf;[m
[31m-    ngx_http_lua_ssl_cert_ctx_t     *cctx;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    dd("c = %p", c);[m
[31m-[m
[31m-    cctx = ngx_http_lua_ssl_get_ctx(c->ssl->connection);[m
[31m-[m
[31m-    dd("ssl cert handler, cert-ctx=%p", cctx);[m
[31m-[m
[31m-    if (cctx) {[m
[31m-        /* not the first time */[m
[31m-[m
[31m-        if (cctx->done) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "lua_certificate_by_lua: cert cb exit code: %d",[m
[31m-                           cctx->exit_code);[m
[31m-[m
[31m-            dd("lua ssl cert done, finally");[m
[31m-            return cctx->exit_code;[m
[31m-        }[m
[31m-[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    /* cctx == NULL */[m
[31m-[m
[31m-    dd("first time");[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    fc = ngx_http_lua_create_fake_connection(NULL);[m
[31m-    if (fc == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fc->log->handler = ngx_http_lua_log_ssl_cert_error;[m
[31m-    fc->log->data = fc;[m
[31m-[m
[31m-    fc->addr_text = c->addr_text;[m
[31m-    fc->listening = c->listening;[m
[31m-[m
[31m-    r = ngx_http_lua_create_fake_request(fc);[m
[31m-    if (r == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    r->main_conf = hc->conf_ctx->main_conf;[m
[31m-    r->srv_conf = hc->conf_ctx->srv_conf;[m
[31m-    r->loc_conf = hc->conf_ctx->loc_conf;[m
[31m-[m
[31m-    fc->log->file = c->log->file;[m
[31m-    fc->log->log_level = c->log->log_level;[m
[31m-    fc->ssl = c->ssl;[m
[31m-[m
[31m-    cctx = ngx_pcalloc(c->pool, sizeof(ngx_http_lua_ssl_cert_ctx_t));[m
[31m-    if (cctx == NULL) {[m
[31m-        goto failed;  /* error */[m
[31m-    }[m
[31m-[m
[31m-    cctx->exit_code = 1;  /* successful by default */[m
[31m-    cctx->connection = c;[m
[31m-    cctx->request = r;[m
[31m-[m
[31m-    dd("setting cctx");[m
[31m-[m
[31m-    if (SSL_set_ex_data(c->ssl->connection, ngx_http_lua_ssl_ctx_index, cctx)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_ex_data() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    lscf = ngx_http_get_module_srv_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* TODO honor lua_code_cache off */[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    c->log->action = "loading SSL certificate by lua";[m
[31m-[m
[31m-    rc = lscf->ssl.cert_handler(r, lscf, L);[m
[31m-[m
[31m-    if (rc >= NGX_OK || rc == NGX_ERROR) {[m
[31m-        cctx->done = 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "lua_certificate_by_lua: handler return value: %i, "[m
[31m-                       "cert cb exit code: %d", rc, cctx->exit_code);[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-        return cctx->exit_code;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DONE */[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(fc->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_ssl_cert_done;[m
[31m-    cln->data = cctx;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(c->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_ssl_cert_aborted;[m
[31m-    cln->data = cctx;[m
[31m-[m
[31m-    return -1;[m
[31m-[m
[31m-#if 1[m
[31m-failed:[m
[31m-[m
[31m-    if (r && r->pool) {[m
[31m-        ngx_http_lua_free_fake_request(r);[m
[31m-    }[m
[31m-[m
[31m-    if (fc) {[m
[31m-        ngx_http_lua_close_fake_connection(fc);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ssl_cert_done(void *data)[m
[31m-{[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_lua_ssl_cert_ctx_t     *cctx = data;[m
[31m-[m
[31m-    dd("lua ssl cert done");[m
[31m-[m
[31m-    if (cctx->aborted) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_assert(cctx->done == 0);[m
[31m-[m
[31m-    cctx->done = 1;[m
[31m-[m
[31m-    c = cctx->connection;[m
[31m-[m
[31m-    c->log->action = "SSL handshaking";[m
[31m-[m
[31m-    ngx_post_event(c->write, &ngx_posted_events);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ssl_cert_aborted(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_ssl_cert_ctx_t     *cctx = data;[m
[31m-[m
[31m-    dd("lua ssl cert done");[m
[31m-[m
[31m-    if (cctx->done) {[m
[31m-        /* completed successfully already */[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cctx->connection->log, 0,[m
[31m-                   "lua_certificate_by_lua: cert cb aborted");[m
[31m-[m
[31m-    cctx->aborted = 1;[m
[31m-    cctx->request->connection->ssl = NULL;[m
[31m-[m
[31m-    ngx_http_lua_finalize_fake_request(cctx->request, NGX_ERROR);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_log_ssl_cert_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_connection_t    *c;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", context: ssl_certificate_by_lua*");[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    c = log->data;[m
[31m-[m
[31m-    if (c->addr_text.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", client: %V", &c->addr_text);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (c && c->listening && c->listening->addr_text.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", server: %V", &c->listening->addr_text);[m
[31m-        /* len -= p - buf; */[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_ssl_cert_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                      co_ref;[m
[31m-    ngx_int_t                rc;[m
[31m-    lua_State               *co;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_cleanup_t      *cln;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        dd("reset ctx");[m
[31m-        ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-    }[m
[31m-[m
[31m-    ctx->entered_content_phase = 1;[m
[31m-[m
[31m-    /*  {{{ new coroutine to handle request */[m
[31m-    co = ngx_http_lua_new_thread(r, L, &co_ref);[m
[31m-[m
[31m-    if (co == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua: failed to create new coroutine to handle request");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  move code closure to new coroutine */[m
[31m-    lua_xmove(L, co, 1);[m
[31m-[m
[31m-    /*  set closure's env table to new coroutine's globals table */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /* save nginx request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(co, r);[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-    ctx->cur_co_ctx->co = co;[m
[31m-    ctx->cur_co_ctx->co_ref = co_ref;[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /* register request cleanup hooks */[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_SSL_CERT;[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-        /* do nothing */[m
[31m-[m
[31m-    } else if (rc == NGX_AGAIN) {[m
[31m-        rc = ngx_http_lua_content_run_posted_threads(L, r, ctx, 0);[m
[31m-[m
[31m-    } else if (rc == NGX_DONE) {[m
[31m-        rc = ngx_http_lua_content_run_posted_threads(L, r, ctx, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        rc = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_finalize_request(r, rc);[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_get_tls1_version(ngx_http_request_t *r, char **err)[m
[31m-{[m
[31m-#ifndef TLS1_get_version[m
[31m-[m
[31m-    *err = "no TLS1 support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("tls1 ver: %d", (int) TLS1_get_version(ssl_conn));[m
[31m-[m
[31m-    return (int) TLS1_get_version(ssl_conn);[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_clear_certs(ngx_http_request_t *r, char **err)[m
[31m-{[m
[31m-#ifdef LIBRESSL_VERSION_NUMBER[m
[31m-[m
[31m-    *err = "LibreSSL not supported";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if OPENSSL_VERSION_NUMBER < 0x1000205fL[m
[31m-[m
[31m-    *err = "at least OpenSSL 1.0.2e required but found " OPENSSL_VERSION_TEXT;[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_certs_clear(ssl_conn);[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#   endif  /* OPENSSL_VERSION_NUMBER < 0x1000205fL */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_set_der_certificate(ngx_http_request_t *r,[m
[31m-    const char *data, size_t len, char **err)[m
[31m-{[m
[31m-#ifdef LIBRESSL_VERSION_NUMBER[m
[31m-[m
[31m-    *err = "LibreSSL not supported";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if OPENSSL_VERSION_NUMBER < 0x1000205fL[m
[31m-[m
[31m-    *err = "at least OpenSSL 1.0.2e required but found " OPENSSL_VERSION_TEXT;[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-    BIO               *bio = NULL;[m
[31m-    X509              *x509 = NULL;[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) data, len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    x509 = d2i_X509_bio(bio, NULL);[m
[31m-    if (x509 == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_use_certificate(ssl_conn, x509) == 0) {[m
[31m-        *err = "SSL_use_certificate() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (SSL_set_ex_data(ssl_conn, ngx_ssl_certificate_index, x509) == 0) {[m
[31m-        *err = "SSL_set_ex_data() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    X509_free(x509);[m
[31m-    x509 = NULL;[m
[31m-[m
[31m-    /* read rest of the chain */[m
[31m-[m
[31m-    while (!BIO_eof(bio)) {[m
[31m-[m
[31m-        x509 = d2i_X509_bio(bio, NULL);[m
[31m-        if (x509 == NULL) {[m
[31m-            *err = "d2i_X509_bio() failed";[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (SSL_add0_chain_cert(ssl_conn, x509) == 0) {[m
[31m-            *err = "SSL_add0_chain_cert() failed";[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    *err = NULL;[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    if (x509) {[m
[31m-        X509_free(x509);[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#   endif  /* OPENSSL_VERSION_NUMBER < 0x1000205fL */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_set_der_private_key(ngx_http_request_t *r,[m
[31m-    const char *data, size_t len, char **err)[m
[31m-{[m
[31m-    BIO               *bio = NULL;[m
[31m-    EVP_PKEY          *pkey = NULL;[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) data, len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    pkey = d2i_PrivateKey_bio(bio, NULL);[m
[31m-    if (pkey == NULL) {[m
[31m-        *err = "d2i_PrivateKey_bio() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_use_PrivateKey(ssl_conn, pkey) == 0) {[m
[31m-        *err = "SSL_CTX_use_PrivateKey() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    EVP_PKEY_free(pkey);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (pkey) {[m
[31m-        EVP_PKEY_free(pkey);[m
[31m-    }[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_raw_server_addr(ngx_http_request_t *r, char **addr,[m
[31m-    size_t *addrlen, int *addrtype, char **err)[m
[31m-{[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    struct sockaddr_un   *saun;[m
[31m-#endif[m
[31m-    ngx_ssl_conn_t       *ssl_conn;[m
[31m-    ngx_connection_t     *c;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-        *addrlen = 16;[m
[31m-        *addr = (char *) &sin6->sin6_addr.s6_addr;[m
[31m-        *addrtype = NGX_HTTP_LUA_ADDR_TYPE_INET6;[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        saun = (struct sockaddr_un *) c->local_sockaddr;[m
[31m-[m
[31m-        /* on Linux sockaddr might not include sun_path at all */[m
[31m-        if (c->local_socklen <= (socklen_t)[m
[31m-            offsetof(struct sockaddr_un, sun_path))[m
[31m-        {[m
[31m-            *addr = "";[m
[31m-            *addrlen = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            *addr = saun->sun_path;[m
[31m-            *addrlen = ngx_strlen(saun->sun_path);[m
[31m-        }[m
[31m-[m
[31m-        *addrtype = NGX_HTTP_LUA_ADDR_TYPE_UNIX;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-        *addr = (char *) &sin->sin_addr.s_addr;[m
[31m-        *addrlen = 4;[m
[31m-        *addrtype = NGX_HTTP_LUA_ADDR_TYPE_INET;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_server_name(ngx_http_request_t *r, char **name,[m
[31m-    size_t *namelen, char **err)[m
[31m-{[m
[31m-    ngx_ssl_conn_t          *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    *name = (char *) SSL_get_servername(ssl_conn, TLSEXT_NAMETYPE_host_name);[m
[31m-[m
[31m-    if (*name) {[m
[31m-        *namelen = ngx_strlen(*name);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    *err = "no TLS extension support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_cert_pem_to_der(const u_char *pem, size_t pem_len, u_char *der,[m
[31m-    char **err)[m
[31m-{[m
[31m-    int       total, len;[m
[31m-    BIO      *bio;[m
[31m-    X509     *x509;[m
[31m-    u_long    n;[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) pem, (int) pem_len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL);[m
[31m-    if (x509 == NULL) {[m
[31m-        *err = "PEM_read_bio_X509_AUX() failed";[m
[31m-        BIO_free(bio);[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    total = i2d_X509(x509, &der);[m
[31m-    if (total < 0) {[m
[31m-        *err = "i2d_X509() failed";[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_free(x509);[m
[31m-[m
[31m-    /* read rest of the chain */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);[m
[31m-        if (x509 == NULL) {[m
[31m-            n = ERR_peek_last_error();[m
[31m-[m
[31m-            if (ERR_GET_LIB(n) == ERR_LIB_PEM[m
[31m-                && ERR_GET_REASON(n) == PEM_R_NO_START_LINE)[m
[31m-            {[m
[31m-                /* end of file */[m
[31m-                ERR_clear_error();[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* some real error */[m
[31m-[m
[31m-            *err = "PEM_read_bio_X509() failed";[m
[31m-            BIO_free(bio);[m
[31m-            ERR_clear_error();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = i2d_X509(x509, &der);[m
[31m-        if (len < 0) {[m
[31m-            *err = "i2d_X509() failed";[m
[31m-            X509_free(x509);[m
[31m-            BIO_free(bio);[m
[31m-            ERR_clear_error();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        total += len;[m
[31m-[m
[31m-        X509_free(x509);[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return total;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_priv_key_pem_to_der(const u_char *pem, size_t pem_len,[m
[31m-    u_char *der, char **err)[m
[31m-{[m
[31m-    int          len;[m
[31m-    BIO         *in;[m
[31m-    EVP_PKEY    *pkey;[m
[31m-[m
[31m-    in = BIO_new_mem_buf((char *) pem, (int) pem_len);[m
[31m-    if (in == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pkey = PEM_read_bio_PrivateKey(in, NULL, NULL, NULL);[m
[31m-    if (pkey == NULL) {[m
[31m-        BIO_free(in);[m
[31m-        *err = "PEM_read_bio_PrivateKey failed";[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(in);[m
[31m-[m
[31m-    len = i2d_PrivateKey(pkey, &der);[m
[31m-    if (len < 0) {[m
[31m-        EVP_PKEY_free(pkey);[m
[31m-        *err = "i2d_PrivateKey failed";[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    EVP_PKEY_free(pkey);[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif  /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SSL */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.h[m
[1mdeleted file mode 100644[m
[1mindex 11cb963..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.h[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SSL_CERTBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SSL_CERTBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_connection_t        *connection; /* original true connection */[m
[31m-    ngx_http_request_t      *request;    /* fake request */[m
[31m-    int                      exit_code;  /* exit code for openssl's[m
[31m-                                            set_cert_cb callback */[m
[31m-    unsigned                 done;       /* :1 */[m
[31m-    unsigned                 aborted;    /* :1 */[m
[31m-} ngx_http_lua_ssl_cert_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_ssl_cert_handler_inline(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_ssl_cert_handler_file(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L);[m
[31m-[m
[31m-char *ngx_http_lua_ssl_cert_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-char *ngx_http_lua_ssl_cert_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-int ngx_http_lua_ssl_cert_handler(ngx_ssl_conn_t *ssl_conn, void *data);[m
[31m-[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SSL_CERTBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_ocsp.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_ocsp.c[m
[1mdeleted file mode 100644[m
[1mindex 1bf4335..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_ssl_ocsp.c[m
[1m+++ /dev/null[m
[36m@@ -1,503 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-#ifdef NGX_HTTP_LUA_USE_OCSP[m
[31m-static int ngx_http_lua_ssl_empty_status_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_get_ocsp_responder_from_der_chain([m
[31m-    const char *chain_data, size_t chain_len, unsigned char *out,[m
[31m-    size_t *out_size, char **err)[m
[31m-{[m
[31m-#ifndef NGX_HTTP_LUA_USE_OCSP[m
[31m-[m
[31m-    *err = "no OCSP support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    int                        rc = NGX_OK;[m
[31m-    BIO                       *bio = NULL;[m
[31m-    char                      *s;[m
[31m-    X509                      *cert = NULL, *issuer = NULL;[m
[31m-    size_t                     len;[m
[31m-    STACK_OF(OPENSSL_STRING)  *aia = NULL;[m
[31m-[m
[31m-    /* certificate */[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) chain_data, chain_len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    cert = d2i_X509_bio(bio, NULL);[m
[31m-    if (cert == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /* responder */[m
[31m-[m
[31m-    aia = X509_get1_ocsp(cert);[m
[31m-    if (aia == NULL) {[m
[31m-        rc = NGX_DECLINED;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10000000L[m
[31m-    s = sk_OPENSSL_STRING_value(aia, 0);[m
[31m-#else[m
[31m-    s = sk_value(aia, 0);[m
[31m-#endif[m
[31m-    if (s == NULL) {[m
[31m-        rc = NGX_DECLINED;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(s);[m
[31m-    if (len > *out_size) {[m
[31m-        len = *out_size;[m
[31m-        rc = NGX_BUSY;[m
[31m-[m
[31m-    } else {[m
[31m-        rc = NGX_OK;[m
[31m-        *out_size = len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(out, s, len);[m
[31m-[m
[31m-    X509_email_free(aia);[m
[31m-    aia = NULL;[m
[31m-[m
[31m-    /* issuer */[m
[31m-[m
[31m-    if (BIO_eof(bio)) {[m
[31m-        *err = "no issuer certificate in chain";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    issuer = d2i_X509_bio(bio, NULL);[m
[31m-    if (issuer == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_check_issued(issuer, cert) != X509_V_OK) {[m
[31m-        *err = "issuer certificate not next to leaf";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    X509_free(issuer);[m
[31m-    X509_free(cert);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (aia) {[m
[31m-        X509_email_free(aia);[m
[31m-    }[m
[31m-[m
[31m-    if (issuer) {[m
[31m-        X509_free(issuer);[m
[31m-    }[m
[31m-[m
[31m-    if (cert) {[m
[31m-        X509_free(cert);[m
[31m-    }[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ERR_clear_error();[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-#endif  /* NGX_HTTP_LUA_USE_OCSP */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_create_ocsp_request(const char *chain_data,[m
[31m-    size_t chain_len, unsigned char *out, size_t *out_size, char **err)[m
[31m-{[m
[31m-#ifndef NGX_HTTP_LUA_USE_OCSP[m
[31m-[m
[31m-    *err = "no OCSP support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    int                        rc = NGX_ERROR;[m
[31m-    BIO                       *bio = NULL;[m
[31m-    X509                      *cert = NULL, *issuer = NULL;[m
[31m-    size_t                     len;[m
[31m-    OCSP_CERTID               *id;[m
[31m-    OCSP_REQUEST              *ocsp = NULL;[m
[31m-[m
[31m-    /* certificate */[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) chain_data, chain_len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cert = d2i_X509_bio(bio, NULL);[m
[31m-    if (cert == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (BIO_eof(bio)) {[m
[31m-        *err = "no issuer certificate in chain";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    issuer = d2i_X509_bio(bio, NULL);[m
[31m-    if (issuer == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ocsp = OCSP_REQUEST_new();[m
[31m-    if (ocsp == NULL) {[m
[31m-        *err = "OCSP_REQUEST_new() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    id = OCSP_cert_to_id(NULL, cert, issuer);[m
[31m-    if (id == NULL) {[m
[31m-        *err = "OCSP_cert_to_id() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_request_add0_id(ocsp, id) == NULL) {[m
[31m-        *err = "OCSP_request_add0_id() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = i2d_OCSP_REQUEST(ocsp, NULL);[m
[31m-    if (len <= 0) {[m
[31m-        *err = "i2d_OCSP_REQUEST() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (len > *out_size) {[m
[31m-        *err = "output buffer too small";[m
[31m-        *out_size = len;[m
[31m-        rc = NGX_BUSY;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = i2d_OCSP_REQUEST(ocsp, &out);[m
[31m-    if (len <=  0) {[m
[31m-        *err = "i2d_OCSP_REQUEST() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    *out_size = len;[m
[31m-[m
[31m-    OCSP_REQUEST_free(ocsp);[m
[31m-    X509_free(issuer);[m
[31m-    X509_free(cert);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ocsp) {[m
[31m-        OCSP_REQUEST_free(ocsp);[m
[31m-    }[m
[31m-[m
[31m-    if (issuer) {[m
[31m-        X509_free(issuer);[m
[31m-    }[m
[31m-[m
[31m-    if (cert) {[m
[31m-        X509_free(cert);[m
[31m-    }[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-#endif  /* NGX_HTTP_LUA_USE_OCSP */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_validate_ocsp_response(const u_char *resp,[m
[31m-    size_t resp_len, const char *chain_data, size_t chain_len,[m
[31m-    u_char *errbuf, size_t *errbuf_size)[m
[31m-{[m
[31m-#ifndef NGX_HTTP_LUA_USE_OCSP[m
[31m-[m
[31m-    *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                "no OCSP support") - errbuf;[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    int                    n;[m
[31m-    BIO                   *bio = NULL;[m
[31m-    X509                  *cert = NULL, *issuer = NULL;[m
[31m-    OCSP_CERTID           *id = NULL;[m
[31m-    OCSP_RESPONSE         *ocsp = NULL;[m
[31m-    OCSP_BASICRESP        *basic = NULL;[m
[31m-    STACK_OF(X509)        *chain = NULL;[m
[31m-    ASN1_GENERALIZEDTIME  *thisupdate, *nextupdate;[m
[31m-[m
[31m-    ocsp = d2i_OCSP_RESPONSE(NULL, &resp, resp_len);[m
[31m-    if (ocsp == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "d2i_OCSP_RESPONSE() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    n = OCSP_response_status(ocsp);[m
[31m-[m
[31m-    if (n != OCSP_RESPONSE_STATUS_SUCCESSFUL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP response not successful (%d: %s)",[m
[31m-                                    n, OCSP_response_status_str(n)) - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    basic = OCSP_response_get1_basic(ocsp);[m
[31m-    if (basic == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP_response_get1_basic() failed")[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    /* get issuer certificate from chain */[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) chain_data, chain_len);[m
[31m-    if (bio == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "BIO_new_mem_buf() failed")[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    cert = d2i_X509_bio(bio, NULL);[m
[31m-    if (cert == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "d2i_X509_bio() failed")[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (BIO_eof(bio)) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "no issuer certificate in chain")[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    issuer = d2i_X509_bio(bio, NULL);[m
[31m-    if (issuer == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "d2i_X509_bio() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    chain = sk_X509_new_null();[m
[31m-    if (chain == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "sk_X509_new_null() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    (void) sk_X509_push(chain, issuer);[m
[31m-[m
[31m-    if (OCSP_basic_verify(basic, chain, NULL, OCSP_NOVERIFY) != 1) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP_basic_verify() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    id = OCSP_cert_to_id(NULL, cert, issuer);[m
[31m-    if (id == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP_cert_to_id() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_resp_find_status(basic, id, &n, NULL, NULL,[m
[31m-                              &thisupdate, &nextupdate)[m
[31m-        != 1)[m
[31m-    {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "certificate status not found in the "[m
[31m-                                    "OCSP response") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (n != V_OCSP_CERTSTATUS_GOOD) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "certificate status \"%s\" in the OCSP "[m
[31m-                                    "response", OCSP_cert_status_str(n))[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_check_validity(thisupdate, nextupdate, 300, -1) != 1) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP_check_validity() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    sk_X509_free(chain);[m
[31m-    X509_free(cert);[m
[31m-    X509_free(issuer);[m
[31m-    BIO_free(bio);[m
[31m-    OCSP_CERTID_free(id);[m
[31m-    OCSP_BASICRESP_free(basic);[m
[31m-    OCSP_RESPONSE_free(ocsp);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    if (chain) {[m
[31m-        sk_X509_free(chain);[m
[31m-    }[m
[31m-[m
[31m-    if (id) {[m
[31m-        OCSP_CERTID_free(id);[m
[31m-    }[m
[31m-[m
[31m-    if (basic) {[m
[31m-        OCSP_BASICRESP_free(basic);[m
[31m-    }[m
[31m-[m
[31m-    if (ocsp) {[m
[31m-        OCSP_RESPONSE_free(ocsp);[m
[31m-    }[m
[31m-[m
[31m-    if (cert) {[m
[31m-        X509_free(cert);[m
[31m-    }[m
[31m-[m
[31m-    if (issuer) {[m
[31m-        X509_free(issuer);[m
[31m-    }[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif  /* NGX_HTTP_LUA_USE_OCSP */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef NGX_HTTP_LUA_USE_OCSP[m
[31m-static int[m
[31m-ngx_http_lua_ssl_empty_status_callback(ngx_ssl_conn_t *ssl_conn, void *data)[m
[31m-{[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_set_ocsp_status_resp(ngx_http_request_t *r,[m
[31m-    const u_char *resp, size_t resp_len, char **err)[m
[31m-{[m
[31m-#ifndef NGX_HTTP_LUA_USE_OCSP[m
[31m-[m
[31m-    *err = "no OCSP support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u_char                  *p;[m
[31m-    SSL_CTX                 *ctx;[m
[31m-    ngx_ssl_conn_t          *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ssl_conn->tlsext_status_type == -1) {[m
[31m-        dd("no ocsp status req from client");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    /* we have to register an empty status callback here otherwise[m
[31m-     * OpenSSL won't send the response staple. */[m
[31m-[m
[31m-    ctx = SSL_get_SSL_CTX(ssl_conn);[m
[31m-    SSL_CTX_set_tlsext_status_cb(ctx,[m
[31m-                                 ngx_http_lua_ssl_empty_status_callback);[m
[31m-[m
[31m-    p = OPENSSL_malloc(resp_len);[m
[31m-    if (p == NULL) {[m
[31m-        *err = "OPENSSL_malloc() failed";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, resp, resp_len);[m
[31m-[m
[31m-    dd("set ocsp resp: resp_len=%d", (int) resp_len);[m
[31m-    (void) SSL_set_tlsext_status_ocsp_resp(ssl_conn, p, resp_len);[m
[31m-    ssl_conn->tlsext_status_expected = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#endif  /* NGX_HTTP_LUA_USE_OCSP */[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_string.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_string.c[m
[1mdeleted file mode 100644[m
[1mindex 241b969..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_string.c[m
[1m+++ /dev/null[m
[36m@@ -1,766 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_args.h"[m
[31m-#include "ngx_crc32.h"[m
[31m-[m
[31m-#if NGX_HAVE_SHA1[m
[31m-#include "ngx_sha1.h"[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_md5.h"[m
[31m-[m
[31m-#if (NGX_OPENSSL)[m
[31m-#include <openssl/evp.h>[m
[31m-#include <openssl/hmac.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef SHA_DIGEST_LENGTH[m
[31m-#define SHA_DIGEST_LENGTH 20[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static uintptr_t ngx_http_lua_ngx_escape_sql_str(u_char *dst, u_char *src,[m
[31m-        size_t size);[m
[31m-static int ngx_http_lua_ngx_escape_uri(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_unescape_uri(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_quote_sql_str(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_md5(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_md5_bin(lua_State *L);[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-static int ngx_http_lua_ngx_sha1_bin(lua_State *L);[m
[31m-#endif[m
[31m-[m
[31m-static int ngx_http_lua_ngx_decode_base64(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_encode_base64(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_crc32_short(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_crc32_long(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_encode_args(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_decode_args(lua_State *L);[m
[31m-#if (NGX_OPENSSL)[m
[31m-static int ngx_http_lua_ngx_hmac_sha1(lua_State *L);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_string_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_escape_uri);[m
[31m-    lua_setfield(L, -2, "escape_uri");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_unescape_uri);[m
[31m-    lua_setfield(L, -2, "unescape_uri");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_encode_args);[m
[31m-    lua_setfield(L, -2, "encode_args");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_decode_args);[m
[31m-    lua_setfield(L, -2, "decode_args");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_quote_sql_str);[m
[31m-    lua_setfield(L, -2, "quote_sql_str");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_decode_base64);[m
[31m-    lua_setfield(L, -2, "decode_base64");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_encode_base64);[m
[31m-    lua_setfield(L, -2, "encode_base64");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_md5_bin);[m
[31m-    lua_setfield(L, -2, "md5_bin");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_md5);[m
[31m-    lua_setfield(L, -2, "md5");[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_sha1_bin);[m
[31m-    lua_setfield(L, -2, "sha1_bin");[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_crc32_short);[m
[31m-    lua_setfield(L, -2, "crc32_short");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_crc32_long);[m
[31m-    lua_setfield(L, -2, "crc32_long");[m
[31m-[m
[31m-#if (NGX_OPENSSL)[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_hmac_sha1);[m
[31m-    lua_setfield(L, -2, "hmac_sha1");[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_escape_uri(lua_State *L)[m
[31m-{[m
[31m-    size_t                   len, dlen;[m
[31m-    uintptr_t                escape;[m
[31m-    u_char                  *src, *dst;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        lua_pushliteral(L, "");[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    src = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_http_lua_escape_uri(NULL, src, len, NGX_ESCAPE_URI);[m
[31m-[m
[31m-    if (escape) {[m
[31m-        dlen = escape + len;[m
[31m-        dst = lua_newuserdata(L, dlen);[m
[31m-        ngx_http_lua_escape_uri(dst, src, len, NGX_ESCAPE_URI);[m
[31m-        lua_pushlstring(L, (char *) dst, dlen);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_unescape_uri(lua_State *L)[m
[31m-{[m
[31m-    size_t                   len, dlen;[m
[31m-    u_char                  *p;[m
[31m-    u_char                  *src, *dst;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        lua_pushliteral(L, "");[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    src = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    /* the unescaped string can only be smaller */[m
[31m-    dlen = len;[m
[31m-[m
[31m-    p = lua_newuserdata(L, dlen);[m
[31m-[m
[31m-    dst = p;[m
[31m-[m
[31m-    ngx_http_lua_unescape_uri(&dst, &src, len, NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) p, dst - p);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_quote_sql_str(lua_State *L)[m
[31m-{[m
[31m-    size_t                   len, dlen, escape;[m
[31m-    u_char                  *p;[m
[31m-    u_char                  *src, *dst;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    src = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        dst = (u_char *) "''";[m
[31m-        dlen = sizeof("''") - 1;[m
[31m-        lua_pushlstring(L, (char *) dst, dlen);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    escape = ngx_http_lua_ngx_escape_sql_str(NULL, src, len);[m
[31m-[m
[31m-    dlen = sizeof("''") - 1 + len + escape;[m
[31m-[m
[31m-    p = lua_newuserdata(L, dlen);[m
[31m-[m
[31m-    dst = p;[m
[31m-[m
[31m-    *p++ = '\'';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, src, len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_lua_ngx_escape_sql_str(p, src, len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '\'';[m
[31m-[m
[31m-    if (p != dst + dlen) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) dst, p - dst);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uintptr_t[m
[31m-ngx_http_lua_ngx_escape_sql_str(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    ngx_uint_t               n;[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        /* find the number of chars to be escaped */[m
[31m-        n = 0;[m
[31m-        while (size) {[m
[31m-            /* the highest bit of all the UTF-8 chars[m
[31m-             * is always 1 */[m
[31m-            if ((*src & 0x80) == 0) {[m
[31m-                switch (*src) {[m
[31m-                    case '\0':[m
[31m-                    case '\b':[m
[31m-                    case '\n':[m
[31m-                    case '\r':[m
[31m-                    case '\t':[m
[31m-                    case 26:  /* \Z */[m
[31m-                    case '\\':[m
[31m-                    case '\'':[m
[31m-                    case '"':[m
[31m-                        n++;[m
[31m-                        break;[m
[31m-                    default:[m
[31m-                        break;[m
[31m-                }[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if ((*src & 0x80) == 0) {[m
[31m-            switch (*src) {[m
[31m-                case '\0':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '0';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\b':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'b';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\n':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'n';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\r':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'r';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\t':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 't';[m
[31m-                    break;[m
[31m-[m
[31m-                case 26:[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'Z';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\\':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '\\';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\'':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '\'';[m
[31m-                    break;[m
[31m-[m
[31m-                case '"':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '"';[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    *dst++ = *src;[m
[31m-                    break;[m
[31m-            }[m
[31m-        } else {[m
[31m-            *dst++ = *src;[m
[31m-        }[m
[31m-        src++;[m
[31m-        size--;[m
[31m-    } /* while (size) */[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_md5(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *src;[m
[31m-    size_t                   slen;[m
[31m-[m
[31m-    ngx_md5_t                md5;[m
[31m-    u_char                   md5_buf[MD5_DIGEST_LENGTH];[m
[31m-    u_char                   hex_buf[2 * sizeof(md5_buf)];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        src = (u_char *) "";[m
[31m-        slen = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        src = (u_char *) luaL_checklstring(L, 1, &slen);[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, src, slen);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    ngx_hex_dump(hex_buf, md5_buf, sizeof(md5_buf));[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) hex_buf, sizeof(hex_buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_md5_bin(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *src;[m
[31m-    size_t                   slen;[m
[31m-[m
[31m-    ngx_md5_t                md5;[m
[31m-    u_char                   md5_buf[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        src     = (u_char *) "";[m
[31m-        slen    = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        src = (u_char *) luaL_checklstring(L, 1, &slen);[m
[31m-    }[m
[31m-[m
[31m-    dd("slen: %d", (int) slen);[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, src, slen);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) md5_buf, sizeof(md5_buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-static int[m
[31m-ngx_http_lua_ngx_sha1_bin(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *src;[m
[31m-    size_t                   slen;[m
[31m-[m
[31m-    ngx_sha1_t               sha;[m
[31m-    u_char                   sha_buf[SHA_DIGEST_LENGTH];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        src     = (u_char *) "";[m
[31m-        slen    = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        src = (u_char *) luaL_checklstring(L, 1, &slen);[m
[31m-    }[m
[31m-[m
[31m-    dd("slen: %d", (int) slen);[m
[31m-[m
[31m-    ngx_sha1_init(&sha);[m
[31m-    ngx_sha1_update(&sha, src, slen);[m
[31m-    ngx_sha1_final(sha_buf, &sha);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) sha_buf, sizeof(sha_buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_decode_base64(lua_State *L)[m
[31m-{[m
[31m-    ngx_str_t                p, src;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 1) != LUA_TSTRING) {[m
[31m-        return luaL_error(L, "string argument only");[m
[31m-    }[m
[31m-[m
[31m-    src.data = (u_char *) luaL_checklstring(L, 1, &src.len);[m
[31m-[m
[31m-    p.len = ngx_base64_decoded_length(src.len);[m
[31m-[m
[31m-    p.data = lua_newuserdata(L, p.len);[m
[31m-[m
[31m-    if (ngx_decode_base64(&p, &src) == NGX_OK) {[m
[31m-        lua_pushlstring(L, (char *) p.data, p.len);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_encode_base64(ngx_str_t *dst, ngx_str_t *src, int no_padding)[m
[31m-{[m
[31m-    u_char         *d, *s;[m
[31m-    size_t          len;[m
[31m-    static u_char   basis[] =[m
[31m-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";[m
[31m-[m
[31m-    len = src->len;[m
[31m-    s = src->data;[m
[31m-    d = dst->data;[m
[31m-[m
[31m-    while (len > 2) {[m
[31m-        *d++ = basis[(s[0] >> 2) & 0x3f];[m
[31m-        *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];[m
[31m-        *d++ = basis[((s[1] & 0x0f) << 2) | (s[2] >> 6)];[m
[31m-        *d++ = basis[s[2] & 0x3f];[m
[31m-[m
[31m-        s += 3;[m
[31m-        len -= 3;[m
[31m-    }[m
[31m-[m
[31m-    if (len) {[m
[31m-        *d++ = basis[(s[0] >> 2) & 0x3f];[m
[31m-[m
[31m-        if (len == 1) {[m
[31m-            *d++ = basis[(s[0] & 3) << 4];[m
[31m-            if (!no_padding) {[m
[31m-                *d++ = '=';[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];[m
[31m-            *d++ = basis[(s[1] & 0x0f) << 2];[m
[31m-        }[m
[31m-[m
[31m-        if (!no_padding) {[m
[31m-            *d++ = '=';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dst->len = d - dst->data;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_lua_base64_encoded_length(size_t n, int no_padding)[m
[31m-{[m
[31m-    return no_padding ? (n * 8 + 5) / 6 : ngx_base64_encoded_length(n);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_encode_base64(lua_State *L)[m
[31m-{[m
[31m-    int                      n;[m
[31m-    int                      no_padding = 0;[m
[31m-    ngx_str_t                p, src;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting one or two arguments");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        src.data = (u_char *) "";[m
[31m-        src.len = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        src.data = (u_char *) luaL_checklstring(L, 1, &src.len);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        /* get the 2nd optional argument */[m
[31m-        luaL_checktype(L, 2, LUA_TBOOLEAN);[m
[31m-        no_padding = lua_toboolean(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    p.len = ngx_http_lua_base64_encoded_length(src.len, no_padding);[m
[31m-[m
[31m-    p.data = lua_newuserdata(L, p.len);[m
[31m-[m
[31m-    ngx_http_lua_encode_base64(&p, &src, no_padding);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) p.data, p.len);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_crc32_short(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *p;[m
[31m-    size_t                   len;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) ngx_crc32_short(p, len));[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_crc32_long(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *p;[m
[31m-    size_t                   len;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) ngx_crc32_long(p, len));[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_encode_args(lua_State *L)[m
[31m-{[m
[31m-    ngx_str_t                    args;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-    ngx_http_lua_process_args_option(NULL, L, 1, &args);[m
[31m-    lua_pushlstring(L, (char *) args.data, args.len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_decode_args(lua_State *L)[m
[31m-{[m
[31m-    u_char                      *buf;[m
[31m-    u_char                      *tmp;[m
[31m-    size_t                       len = 0;[m
[31m-    int                          n;[m
[31m-    int                          max;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    buf = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        max = luaL_checkint(L, 2);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_ARGS;[m
[31m-    }[m
[31m-[m
[31m-    tmp = lua_newuserdata(L, len);[m
[31m-    ngx_memcpy(tmp, buf, len);[m
[31m-[m
[31m-    lua_createtable(L, 0, 4);[m
[31m-[m
[31m-    return ngx_http_lua_parse_args(L, tmp, tmp + len, max);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_OPENSSL)[m
[31m-static int[m
[31m-ngx_http_lua_ngx_hmac_sha1(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *sec, *sts;[m
[31m-    size_t                   lsec, lsts;[m
[31m-    unsigned int             md_len;[m
[31m-    unsigned char            md[EVP_MAX_MD_SIZE];[m
[31m-    const EVP_MD            *evp_md;[m
[31m-[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expecting 2 arguments, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    sec = (u_char *) luaL_checklstring(L, 1, &lsec);[m
[31m-    sts = (u_char *) luaL_checklstring(L, 2, &lsts);[m
[31m-[m
[31m-    evp_md = EVP_sha1();[m
[31m-[m
[31m-    HMAC(evp_md, sec, lsec, sts, lsts, md, &md_len);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) md, md_len);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-void[m
[31m-ngx_http_lua_ffi_md5_bin(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-    ngx_md5_t     md5;[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, src, len);[m
[31m-    ngx_md5_final(dst, &md5);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_md5(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-    ngx_md5_t           md5;[m
[31m-    u_char              md5_buf[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, src, len);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    ngx_hex_dump(dst, md5_buf, sizeof(md5_buf));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sha1_bin(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-#if NGX_HAVE_SHA1[m
[31m-    ngx_sha1_t               sha;[m
[31m-[m
[31m-    ngx_sha1_init(&sha);[m
[31m-    ngx_sha1_update(&sha, src, len);[m
[31m-    ngx_sha1_final(dst, &sha);[m
[31m-[m
[31m-    return 1;[m
[31m-#else[m
[31m-    return 0;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_encode_base64(const u_char *src, size_t slen, u_char *dst,[m
[31m-    int no_padding)[m
[31m-{[m
[31m-    ngx_str_t      in, out;[m
[31m-[m
[31m-    in.data = (u_char *) src;[m
[31m-    in.len = slen;[m
[31m-[m
[31m-    out.data = dst;[m
[31m-[m
[31m-    ngx_http_lua_encode_base64(&out, &in, no_padding);[m
[31m-[m
[31m-    return out.len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_decode_base64(const u_char *src, size_t slen, u_char *dst,[m
[31m-    size_t *dlen)[m
[31m-{[m
[31m-    ngx_int_t      rc;[m
[31m-    ngx_str_t      in, out;[m
[31m-[m
[31m-    in.data = (u_char *) src;[m
[31m-    in.len = slen;[m
[31m-[m
[31m-    out.data = dst;[m
[31m-[m
[31m-    rc = ngx_decode_base64(&out, &in);[m
[31m-[m
[31m-    *dlen = out.len;[m
[31m-[m
[31m-    return rc == NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_unescape_uri(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-    u_char      *p = dst;[m
[31m-[m
[31m-    ngx_http_lua_unescape_uri(&p, (u_char **) &src, len,[m
[31m-                              NGX_UNESCAPE_URI_COMPONENT);[m
[31m-    return p - dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_uri_escaped_length(const u_char *src, size_t len)[m
[31m-{[m
[31m-    return len + 2 * ngx_http_lua_escape_uri(NULL, (u_char *) src, len,[m
[31m-                                             NGX_ESCAPE_URI);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_escape_uri(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-    ngx_http_lua_escape_uri(dst, (u_char *) src, len, NGX_ESCAPE_URI);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_string.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_string.h[m
[1mdeleted file mode 100644[m
[1mindex b54cbdf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_string.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_STRING_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_STRING_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_string_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_STRING_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.c[m
[1mdeleted file mode 100644[m
[1mindex 4f8a753..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.c[m
[1m+++ /dev/null[m
[36m@@ -1,1774 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_subrequest.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_ctx.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_headers_in.h"[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-#include "ngx_http_probe.h"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LUA_SHARE_ALL_VARS     0x01[m
[31m-#define NGX_HTTP_LUA_COPY_ALL_VARS      0x02[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_method_name(m) { sizeof(m) - 1, (u_char *) m " " }[m
[31m-[m
[31m-ngx_str_t  ngx_http_lua_get_method = ngx_http_lua_method_name("GET");[m
[31m-ngx_str_t  ngx_http_lua_put_method = ngx_http_lua_method_name("PUT");[m
[31m-ngx_str_t  ngx_http_lua_post_method = ngx_http_lua_method_name("POST");[m
[31m-ngx_str_t  ngx_http_lua_head_method = ngx_http_lua_method_name("HEAD");[m
[31m-ngx_str_t  ngx_http_lua_delete_method =[m
[31m-        ngx_http_lua_method_name("DELETE");[m
[31m-ngx_str_t  ngx_http_lua_options_method =[m
[31m-        ngx_http_lua_method_name("OPTIONS");[m
[31m-ngx_str_t  ngx_http_lua_copy_method = ngx_http_lua_method_name("COPY");[m
[31m-ngx_str_t  ngx_http_lua_move_method = ngx_http_lua_method_name("MOVE");[m
[31m-ngx_str_t  ngx_http_lua_lock_method = ngx_http_lua_method_name("LOCK");[m
[31m-ngx_str_t  ngx_http_lua_mkcol_method =[m
[31m-        ngx_http_lua_method_name("MKCOL");[m
[31m-ngx_str_t  ngx_http_lua_propfind_method =[m
[31m-        ngx_http_lua_method_name("PROPFIND");[m
[31m-ngx_str_t  ngx_http_lua_proppatch_method =[m
[31m-        ngx_http_lua_method_name("PROPPATCH");[m
[31m-ngx_str_t  ngx_http_lua_unlock_method =[m
[31m-        ngx_http_lua_method_name("UNLOCK");[m
[31m-ngx_str_t  ngx_http_lua_patch_method =[m
[31m-        ngx_http_lua_method_name("PATCH");[m
[31m-ngx_str_t  ngx_http_lua_trace_method =[m
[31m-        ngx_http_lua_method_name("TRACE");[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_lua_content_length_header_key =[m
[31m-    ngx_string("Content-Length");[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_set_content_length_header(ngx_http_request_t *r,[m
[31m-    off_t len);[m
[31m-static ngx_int_t ngx_http_lua_adjust_subrequest(ngx_http_request_t *sr,[m
[31m-    ngx_uint_t method, int forward_body,[m
[31m-    ngx_http_request_body_t *body, unsigned vars_action,[m
[31m-    ngx_array_t *extra_vars);[m
[31m-static int ngx_http_lua_ngx_location_capture(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_location_capture_multi(lua_State *L);[m
[31m-static void ngx_http_lua_process_vars_option(ngx_http_request_t *r,[m
[31m-    lua_State *L, int table, ngx_array_t **varsp);[m
[31m-static ngx_int_t ngx_http_lua_subrequest_add_extra_vars(ngx_http_request_t *r,[m
[31m-    ngx_array_t *extra_vars);[m
[31m-static ngx_int_t ngx_http_lua_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,[m
[31m-    ngx_http_post_subrequest_t *ps, ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_http_lua_subrequest_resume(ngx_http_request_t *r);[m
[31m-static void ngx_http_lua_handle_subreq_responses(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static void ngx_http_lua_cancel_subreq(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_post_request_to_head(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_copy_in_file_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_copy_request_headers(ngx_http_request_t *sr,[m
[31m-    ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-/* ngx.location.capture is just a thin wrapper around[m
[31m- * ngx.location.capture_multi */[m
[31m-static int[m
[31m-ngx_http_lua_ngx_location_capture(lua_State *L)[m
[31m-{[m
[31m-    int                 n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting one or two arguments");[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, n, 0); /* uri opts? table  */[m
[31m-    lua_insert(L, 1); /* table uri opts? */[m
[31m-    if (n == 1) { /* table uri */[m
[31m-        lua_rawseti(L, 1, 1); /* table */[m
[31m-[m
[31m-    } else { /* table uri opts */[m
[31m-        lua_rawseti(L, 1, 2); /* table uri */[m
[31m-        lua_rawseti(L, 1, 1); /* table */[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 1, 0); /* table table' */[m
[31m-    lua_insert(L, 1);   /* table' table */[m
[31m-    lua_rawseti(L, 1, 1); /* table' */[m
[31m-[m
[31m-    return ngx_http_lua_ngx_location_capture_multi(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_location_capture_multi(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t              *r;[m
[31m-    ngx_http_request_t              *sr = NULL; /* subrequest object */[m
[31m-    ngx_http_post_subrequest_t      *psr;[m
[31m-    ngx_http_lua_ctx_t              *sr_ctx;[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_array_t                     *extra_vars;[m
[31m-    ngx_str_t                        uri;[m
[31m-    ngx_str_t                        args;[m
[31m-    ngx_str_t                        extra_args;[m
[31m-    ngx_uint_t                       flags;[m
[31m-    u_char                          *p;[m
[31m-    u_char                          *q;[m
[31m-    size_t                           len;[m
[31m-    size_t                           nargs;[m
[31m-    int                              rc;[m
[31m-    int                              n;[m
[31m-    int                              always_forward_body = 0;[m
[31m-    ngx_uint_t                       method;[m
[31m-    ngx_http_request_body_t         *body;[m
[31m-    int                              type;[m
[31m-    ngx_buf_t                       *b;[m
[31m-    unsigned                         vars_action;[m
[31m-    ngx_uint_t                       nsubreqs;[m
[31m-    ngx_uint_t                       index;[m
[31m-    size_t                           sr_statuses_len;[m
[31m-    size_t                           sr_headers_len;[m
[31m-    size_t                           sr_bodies_len;[m
[31m-    size_t                           sr_flags_len;[m
[31m-    size_t                           ofs1, ofs2;[m
[31m-    unsigned                         custom_ctx;[m
[31m-    ngx_http_lua_co_ctx_t           *coctx;[m
[31m-[m
[31m-    ngx_http_lua_post_subrequest_data_t      *psr_data;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "only one argument is expected, but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    nsubreqs = lua_objlen(L, 1);[m
[31m-    if (nsubreqs == 0) {[m
[31m-        return luaL_error(L, "at least one subrequest should be specified");[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua location capture, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    sr_statuses_len = nsubreqs * sizeof(ngx_int_t);[m
[31m-    sr_headers_len  = nsubreqs * sizeof(ngx_http_headers_out_t *);[m
[31m-    sr_bodies_len   = nsubreqs * sizeof(ngx_str_t);[m
[31m-    sr_flags_len    = nsubreqs * sizeof(uint8_t);[m
[31m-[m
[31m-    p = ngx_pcalloc(r->pool, sr_statuses_len + sr_headers_len +[m
[31m-                    sr_bodies_len + sr_flags_len);[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    coctx->sr_statuses = (void *) p;[m
[31m-    p += sr_statuses_len;[m
[31m-[m
[31m-    coctx->sr_headers = (void *) p;[m
[31m-    p += sr_headers_len;[m
[31m-[m
[31m-    coctx->sr_bodies = (void *) p;[m
[31m-    p += sr_bodies_len;[m
[31m-[m
[31m-    coctx->sr_flags = (void *) p;[m
[31m-[m
[31m-    coctx->nsubreqs = nsubreqs;[m
[31m-[m
[31m-    coctx->pending_subreqs = 0;[m
[31m-[m
[31m-    extra_vars = NULL;[m
[31m-[m
[31m-    for (index = 0; index < nsubreqs; index++) {[m
[31m-        coctx->pending_subreqs++;[m
[31m-[m
[31m-        lua_rawgeti(L, 1, index + 1);[m
[31m-        if (lua_isnil(L, -1)) {[m
[31m-            return luaL_error(L, "only array-like tables are allowed");[m
[31m-        }[m
[31m-[m
[31m-        dd("queries query: top %d", lua_gettop(L));[m
[31m-[m
[31m-        if (lua_type(L, -1) != LUA_TTABLE) {[m
[31m-            return luaL_error(L, "the query argument %d is not a table, "[m
[31m-                              "but a %s",[m
[31m-                              index, lua_typename(L, lua_type(L, -1)));[m
[31m-        }[m
[31m-[m
[31m-        nargs = lua_objlen(L, -1);[m
[31m-[m
[31m-        if (nargs != 1 && nargs != 2) {[m
[31m-            return luaL_error(L, "query argument %d expecting one or "[m
[31m-                              "two arguments", index);[m
[31m-        }[m
[31m-[m
[31m-        lua_rawgeti(L, 2, 1); /* queries query uri */[m
[31m-[m
[31m-        dd("queries query uri: %d", lua_gettop(L));[m
[31m-[m
[31m-        dd("first arg in first query: %s", lua_typename(L, lua_type(L, -1)));[m
[31m-[m
[31m-        body = NULL;[m
[31m-[m
[31m-        ngx_str_null(&extra_args);[m
[31m-[m
[31m-        if (extra_vars != NULL) {[m
[31m-            /* flush out existing elements in the array */[m
[31m-            extra_vars->nelts = 0;[m
[31m-        }[m
[31m-[m
[31m-        vars_action = 0;[m
[31m-[m
[31m-        custom_ctx = 0;[m
[31m-[m
[31m-        if (nargs == 2) {[m
[31m-            /* check out the options table */[m
[31m-[m
[31m-            lua_rawgeti(L, 2, 2); /* queries query uri opts */[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            if (lua_type(L, 4) != LUA_TTABLE) {[m
[31m-                return luaL_error(L, "expecting table as the 2nd argument for "[m
[31m-                                  "subrequest %d, but got %s", index,[m
[31m-                                  luaL_typename(L, 4));[m
[31m-            }[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the args option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "args");[m
[31m-[m
[31m-            type = lua_type(L, -1);[m
[31m-[m
[31m-            switch (type) {[m
[31m-            case LUA_TTABLE:[m
[31m-                ngx_http_lua_process_args_option(r, L, -1, &extra_args);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                extra_args.data = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-                extra_args.len = len;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "Bad args option value");[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the vars option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "vars");[m
[31m-[m
[31m-            switch (lua_type(L, -1)) {[m
[31m-            case LUA_TTABLE:[m
[31m-                ngx_http_lua_process_vars_option(r, L, -1, &extra_vars);[m
[31m-[m
[31m-                dd("post process vars top: %d", lua_gettop(L));[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "Bad vars option value");[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the share_all_vars option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "share_all_vars");[m
[31m-[m
[31m-            switch (lua_type(L, -1)) {[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    vars_action |= NGX_HTTP_LUA_SHARE_ALL_VARS;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "Bad share_all_vars option value");[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the copy_all_vars option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "copy_all_vars");[m
[31m-[m
[31m-            switch (lua_type(L, -1)) {[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    vars_action |= NGX_HTTP_LUA_COPY_ALL_VARS;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "Bad copy_all_vars option value");[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the "forward_body" option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "always_forward_body");[m
[31m-            always_forward_body = lua_toboolean(L, -1);[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("always foward body: %d", always_forward_body);[m
[31m-[m
[31m-            /* check the "method" option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "method");[m
[31m-[m
[31m-            type = lua_type(L, -1);[m
[31m-[m
[31m-            if (type == LUA_TNIL) {[m
[31m-                method = NGX_HTTP_GET;[m
[31m-[m
[31m-            } else {[m
[31m-                if (type != LUA_TNUMBER) {[m
[31m-                    return luaL_error(L, "Bad http request method");[m
[31m-                }[m
[31m-[m
[31m-                method = (ngx_uint_t) lua_tonumber(L, -1);[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the "ctx" option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "ctx");[m
[31m-[m
[31m-            type = lua_type(L, -1);[m
[31m-[m
[31m-            if (type != LUA_TNIL) {[m
[31m-                if (type != LUA_TTABLE) {[m
[31m-                    return luaL_error(L, "Bad ctx option value type %s, "[m
[31m-                                      "expected a Lua table",[m
[31m-                                      lua_typename(L, type));[m
[31m-                }[m
[31m-[m
[31m-                custom_ctx = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                lua_pop(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            dd("queries query uri opts ctx?: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the "body" option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "body");[m
[31m-[m
[31m-            type = lua_type(L, -1);[m
[31m-[m
[31m-            if (type != LUA_TNIL) {[m
[31m-                if (type != LUA_TSTRING && type != LUA_TNUMBER) {[m
[31m-                    return luaL_error(L, "Bad http request body");[m
[31m-                }[m
[31m-[m
[31m-                body = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-[m
[31m-                if (body == NULL) {[m
[31m-                    return luaL_error(L, "no memory");[m
[31m-                }[m
[31m-[m
[31m-                q = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-                dd("request body: [%.*s]", (int) len, q);[m
[31m-[m
[31m-                if (len) {[m
[31m-                    b = ngx_create_temp_buf(r->pool, len);[m
[31m-                    if (b == NULL) {[m
[31m-                        return luaL_error(L, "no memory");[m
[31m-                    }[m
[31m-[m
[31m-                    b->last = ngx_copy(b->last, q, len);[m
[31m-[m
[31m-                    body->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-                    if (body->bufs == NULL) {[m
[31m-                        return luaL_error(L, "no memory");[m
[31m-                    }[m
[31m-[m
[31m-                    body->bufs->buf = b;[m
[31m-                    body->bufs->next = NULL;[m
[31m-[m
[31m-                    body->buf = b;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1); /* pop the body */[m
[31m-[m
[31m-            /* stack: queries query uri opts ctx? */[m
[31m-[m
[31m-            lua_remove(L, 4);[m
[31m-[m
[31m-            /* stack: queries query uri ctx? */[m
[31m-[m
[31m-            dd("queries query uri ctx?: %d", lua_gettop(L));[m
[31m-[m
[31m-        } else {[m
[31m-            method = NGX_HTTP_GET;[m
[31m-        }[m
[31m-[m
[31m-        /* stack: queries query uri ctx? */[m
[31m-[m
[31m-        p = (u_char *) luaL_checklstring(L, 3, &len);[m
[31m-[m
[31m-        uri.data = ngx_palloc(r->pool, len);[m
[31m-        if (uri.data == NULL) {[m
[31m-            return luaL_error(L, "memory allocation error");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(uri.data, p, len);[m
[31m-[m
[31m-        uri.len = len;[m
[31m-[m
[31m-        ngx_str_null(&args);[m
[31m-[m
[31m-        flags = 0;[m
[31m-[m
[31m-        rc = ngx_http_parse_unsafe_uri(r, &uri, &args, &flags);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            dd("rc = %d", (int) rc);[m
[31m-[m
[31m-            return luaL_error(L, "unsafe uri in argument #1: %s", p);[m
[31m-        }[m
[31m-[m
[31m-        if (args.len == 0) {[m
[31m-            if (extra_args.len) {[m
[31m-                p = ngx_palloc(r->pool, extra_args.len);[m
[31m-                if (p == NULL) {[m
[31m-                    return luaL_error(L, "no memory");[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(p, extra_args.data, extra_args.len);[m
[31m-[m
[31m-                args.data = p;[m
[31m-                args.len = extra_args.len;[m
[31m-            }[m
[31m-[m
[31m-        } else if (extra_args.len) {[m
[31m-            /* concatenate the two parts of args together */[m
[31m-            len = args.len + (sizeof("&") - 1) + extra_args.len;[m
[31m-[m
[31m-            p = ngx_palloc(r->pool, len);[m
[31m-            if (p == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-[m
[31m-            q = ngx_copy(p, args.data, args.len);[m
[31m-            *q++ = '&';[m
[31m-            ngx_memcpy(q, extra_args.data, extra_args.len);[m
[31m-[m
[31m-            args.data = p;[m
[31m-            args.len = len;[m
[31m-        }[m
[31m-[m
[31m-        ofs1 = ngx_align(sizeof(ngx_http_post_subrequest_t), sizeof(void *));[m
[31m-        ofs2 = ngx_align(sizeof(ngx_http_lua_ctx_t), sizeof(void *));[m
[31m-[m
[31m-        p = ngx_palloc(r->pool, ofs1 + ofs2[m
[31m-                       + sizeof(ngx_http_lua_post_subrequest_data_t));[m
[31m-        if (p == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        psr = (ngx_http_post_subrequest_t *) p;[m
[31m-[m
[31m-        p += ofs1;[m
[31m-[m
[31m-        sr_ctx = (ngx_http_lua_ctx_t *) p;[m
[31m-[m
[31m-        ngx_http_lua_assert((void *) sr_ctx == ngx_align_ptr(sr_ctx,[m
[31m-                                                             sizeof(void *)));[m
[31m-[m
[31m-        p += ofs2;[m
[31m-[m
[31m-        psr_data = (ngx_http_lua_post_subrequest_data_t *) p;[m
[31m-[m
[31m-        ngx_http_lua_assert((void *) psr_data == ngx_align_ptr(psr_data,[m
[31m-                                                               sizeof(void *)));[m
[31m-[m
[31m-        ngx_memzero(sr_ctx, sizeof(ngx_http_lua_ctx_t));[m
[31m-[m
[31m-        /* set by ngx_memzero:[m
[31m-         *      sr_ctx->run_post_subrequest = 0[m
[31m-         *      sr_ctx->free = NULL[m
[31m-         *      sr_ctx->body = NULL[m
[31m-         */[m
[31m-[m
[31m-        psr_data->ctx = sr_ctx;[m
[31m-        psr_data->pr_co_ctx = coctx;[m
[31m-[m
[31m-        psr->handler = ngx_http_lua_post_subrequest;[m
[31m-        psr->data = psr_data;[m
[31m-[m
[31m-        rc = ngx_http_lua_subrequest(r, &uri, &args, &sr, psr, 0);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L, "failed to issue subrequest: %d", (int) rc);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_init_ctx(sr, sr_ctx);[m
[31m-[m
[31m-        sr_ctx->capture = 1;[m
[31m-        sr_ctx->index = index;[m
[31m-        sr_ctx->last_body = &sr_ctx->body;[m
[31m-        sr_ctx->vm_state = ctx->vm_state;[m
[31m-[m
[31m-        ngx_http_set_ctx(sr, sr_ctx, ngx_http_lua_module);[m
[31m-[m
[31m-        rc = ngx_http_lua_adjust_subrequest(sr, method, always_forward_body,[m
[31m-                                            body, vars_action, extra_vars);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_http_lua_cancel_subreq(sr);[m
[31m-            return luaL_error(L, "failed to adjust the subrequest: %d",[m
[31m-                              (int) rc);[m
[31m-        }[m
[31m-[m
[31m-        dd("queries query uri opts ctx? %d", lua_gettop(L));[m
[31m-[m
[31m-        /* stack: queries query uri ctx? */[m
[31m-[m
[31m-        if (custom_ctx) {[m
[31m-            ngx_http_lua_ngx_set_ctx_helper(L, sr, sr_ctx, -1);[m
[31m-            lua_pop(L, 3);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pop(L, 2);[m
[31m-        }[m
[31m-[m
[31m-        /* stack: queries */[m
[31m-    }[m
[31m-[m
[31m-    if (extra_vars) {[m
[31m-        ngx_array_destroy(extra_vars);[m
[31m-    }[m
[31m-[m
[31m-    ctx->no_abort = 1;[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_adjust_subrequest(ngx_http_request_t *sr, ngx_uint_t method,[m
[31m-    int always_forward_body, ngx_http_request_body_t *body,[m
[31m-    unsigned vars_action, ngx_array_t *extra_vars)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-    size_t                       size;[m
[31m-[m
[31m-    r = sr->parent;[m
[31m-[m
[31m-    sr->header_in = r->header_in;[m
[31m-[m
[31m-    if (body) {[m
[31m-        sr->request_body = body;[m
[31m-[m
[31m-        rc = ngx_http_lua_set_content_length_header(sr,[m
[31m-                                                    body->buf[m
[31m-                                                    ? ngx_buf_size(body->buf)[m
[31m-                                                    : 0);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else if (!always_forward_body[m
[31m-               && method != NGX_HTTP_PUT[m
[31m-               && method != NGX_HTTP_POST[m
[31m-               && r->headers_in.content_length_n > 0)[m
[31m-    {[m
[31m-        rc = ngx_http_lua_set_content_length_header(sr, 0);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        sr->request_body = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_lua_copy_request_headers(sr, r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (sr->request_body) {[m
[31m-[m
[31m-            /* deep-copy the request body */[m
[31m-[m
[31m-            if (sr->request_body->temp_file) {[m
[31m-                if (ngx_http_lua_copy_in_file_request_body(sr) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sr->method = method;[m
[31m-[m
[31m-    switch (method) {[m
[31m-        case NGX_HTTP_GET:[m
[31m-            sr->method_name = ngx_http_lua_get_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST:[m
[31m-            sr->method_name = ngx_http_lua_post_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PUT:[m
[31m-            sr->method_name = ngx_http_lua_put_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_HEAD:[m
[31m-            sr->method_name = ngx_http_lua_head_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_DELETE:[m
[31m-            sr->method_name = ngx_http_lua_delete_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_OPTIONS:[m
[31m-            sr->method_name = ngx_http_lua_options_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MKCOL:[m
[31m-            sr->method_name = ngx_http_lua_mkcol_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_COPY:[m
[31m-            sr->method_name = ngx_http_lua_copy_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MOVE:[m
[31m-            sr->method_name = ngx_http_lua_move_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPFIND:[m
[31m-            sr->method_name = ngx_http_lua_propfind_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPPATCH:[m
[31m-            sr->method_name = ngx_http_lua_proppatch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_LOCK:[m
[31m-            sr->method_name = ngx_http_lua_lock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UNLOCK:[m
[31m-            sr->method_name = ngx_http_lua_unlock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PATCH:[m
[31m-            sr->method_name = ngx_http_lua_patch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_TRACE:[m
[31m-            sr->method_name = ngx_http_lua_trace_method;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "unsupported HTTP method: %u", (unsigned) method);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!(vars_action & NGX_HTTP_LUA_SHARE_ALL_VARS)) {[m
[31m-        /* we do not inherit the parent request's variables */[m
[31m-        cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-[m
[31m-        size = cmcf->variables.nelts * sizeof(ngx_http_variable_value_t);[m
[31m-[m
[31m-        if (vars_action & NGX_HTTP_LUA_COPY_ALL_VARS) {[m
[31m-[m
[31m-            sr->variables = ngx_palloc(sr->pool, size);[m
[31m-            if (sr->variables == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(sr->variables, r->variables, size);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            /* we do not inherit the parent request's variables */[m
[31m-[m
[31m-            sr->variables = ngx_pcalloc(sr->pool, size);[m
[31m-            if (sr->variables == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_subrequest_add_extra_vars(sr, extra_vars);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_subrequest_add_extra_vars(ngx_http_request_t *sr,[m
[31m-    ngx_array_t *extra_vars)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-    ngx_http_variable_t         *v;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-    u_char                      *val;[m
[31m-    u_char                      *p;[m
[31m-    ngx_uint_t                   i, hash;[m
[31m-    ngx_str_t                    name;[m
[31m-    size_t                       len;[m
[31m-    ngx_hash_t                  *variables_hash;[m
[31m-    ngx_keyval_t                *var;[m
[31m-[m
[31m-    /* set any extra variables that were passed to the subrequest */[m
[31m-[m
[31m-    if (extra_vars == NULL || extra_vars->nelts == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-[m
[31m-    variables_hash = &cmcf->variables_hash;[m
[31m-[m
[31m-    var = extra_vars->elts;[m
[31m-[m
[31m-    for (i = 0; i < extra_vars->nelts; i++, var++) {[m
[31m-        /* copy the variable's name and value because they are allocated[m
[31m-         * by the lua VM */[m
[31m-[m
[31m-        len = var->key.len + var->value.len;[m
[31m-[m
[31m-        p = ngx_pnalloc(sr->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name.data = p;[m
[31m-        name.len = var->key.len;[m
[31m-[m
[31m-        p = ngx_copy(p, var->key.data, var->key.len);[m
[31m-[m
[31m-        hash = ngx_hash_strlow(name.data, name.data, name.len);[m
[31m-[m
[31m-        val = p;[m
[31m-        len = var->value.len;[m
[31m-[m
[31m-        ngx_memcpy(p, var->value.data, len);[m
[31m-[m
[31m-        v = ngx_hash_find(variables_hash, hash, name.data, name.len);[m
[31m-[m
[31m-        if (v) {[m
[31m-            if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, sr->connection->log, 0,[m
[31m-                              "variable \"%V\" not changeable", &name);[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (v->set_handler) {[m
[31m-                vv = ngx_palloc(sr->pool, sizeof(ngx_http_variable_value_t));[m
[31m-                if (vv == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = val;[m
[31m-                vv->len = len;[m
[31m-[m
[31m-                v->set_handler(sr, vv, v->data);[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sr->connection->log, 0,[m
[31m-                               "variable \"%V\" set to value \"%v\"", &name,[m
[31m-                               vv);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (v->flags & NGX_HTTP_VAR_INDEXED) {[m
[31m-                vv = &sr->variables[v->index];[m
[31m-[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = val;[m
[31m-                vv->len = len;[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sr->connection->log, 0,[m
[31m-                               "variable \"%V\" set to value \"%v\"",[m
[31m-                               &name, vv);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, sr->connection->log, 0,[m
[31m-                      "variable \"%V\" cannot be assigned a value (maybe you "[m
[31m-                      "forgot to define it first?) ", &name);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_process_vars_option(ngx_http_request_t *r, lua_State *L,[m
[31m-    int table, ngx_array_t **varsp)[m
[31m-{[m
[31m-    ngx_array_t         *vars;[m
[31m-    ngx_keyval_t        *var;[m
[31m-[m
[31m-    if (table < 0) {[m
[31m-        table = lua_gettop(L) + table + 1;[m
[31m-    }[m
[31m-[m
[31m-    vars = *varsp;[m
[31m-[m
[31m-    if (vars == NULL) {[m
[31m-[m
[31m-        vars = ngx_array_create(r->pool, 4, sizeof(ngx_keyval_t));[m
[31m-        if (vars == NULL) {[m
[31m-            dd("here");[m
[31m-            luaL_error(L, "no memory");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        *varsp = vars;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    while (lua_next(L, table) != 0) {[m
[31m-[m
[31m-        if (lua_type(L, -2) != LUA_TSTRING) {[m
[31m-            luaL_error(L, "attempt to use a non-string key in the "[m
[31m-                       "\"vars\" option table");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!lua_isstring(L, -1)) {[m
[31m-            luaL_error(L, "attempt to use bad variable value type %s",[m
[31m-                       luaL_typename(L, -1));[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        var = ngx_array_push(vars);[m
[31m-        if (var == NULL) {[m
[31m-            dd("here");[m
[31m-            luaL_error(L, "no memory");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        var->key.data = (u_char *) lua_tolstring(L, -2, &var->key.len);[m
[31m-        var->value.data = (u_char *) lua_tolstring(L, -1, &var->value.len);[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_post_subrequest(ngx_http_request_t *r, void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_request_t            *pr;[m
[31m-    ngx_http_lua_ctx_t            *pr_ctx;[m
[31m-    ngx_http_lua_ctx_t            *ctx; /* subrequest ctx */[m
[31m-    ngx_http_lua_co_ctx_t         *pr_coctx;[m
[31m-    size_t                         len;[m
[31m-    ngx_str_t                     *body_str;[m
[31m-    u_char                        *p;[m
[31m-    ngx_chain_t                   *cl;[m
[31m-[m
[31m-    ngx_http_lua_post_subrequest_data_t    *psr_data = data;[m
[31m-[m
[31m-    ctx = psr_data->ctx;[m
[31m-[m
[31m-    if (ctx->run_post_subrequest) {[m
[31m-        if (r != r->connection->data) {[m
[31m-            r->connection->data = r;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run post subrequest handler, rc:%i c:%ud", rc,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    ctx->run_post_subrequest = 1;[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    pr_ctx = ngx_http_get_module_ctx(pr, ngx_http_lua_module);[m
[31m-    if (pr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr_coctx = psr_data->pr_co_ctx;[m
[31m-    pr_coctx->pending_subreqs--;[m
[31m-[m
[31m-    if (pr_coctx->pending_subreqs == 0) {[m
[31m-        dd("all subrequests are done");[m
[31m-[m
[31m-        pr_ctx->no_abort = 0;[m
[31m-        pr_ctx->resume_handler = ngx_http_lua_subrequest_resume;[m
[31m-        pr_ctx->cur_co_ctx = pr_coctx;[m
[31m-    }[m
[31m-[m
[31m-    if (pr_ctx->entered_content_phase) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua restoring write event handler");[m
[31m-[m
[31m-        pr->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        pr->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    dd("status rc = %d", (int) rc);[m
[31m-    dd("status headers_out.status = %d", (int) r->headers_out.status);[m
[31m-    dd("uri: %.*s", (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    /*  capture subrequest response status */[m
[31m-[m
[31m-    pr_coctx->sr_statuses[ctx->index] = r->headers_out.status;[m
[31m-[m
[31m-    if (pr_coctx->sr_statuses[ctx->index] == 0) {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rc >= 100) {[m
[31m-            pr_coctx->sr_statuses[ctx->index] = rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->seen_last_for_subreq) {[m
[31m-        pr_coctx->sr_flags[ctx->index] |= NGX_HTTP_LUA_SUBREQ_TRUNCATED;[m
[31m-    }[m
[31m-[m
[31m-    dd("pr_coctx status: %d", (int) pr_coctx->sr_statuses[ctx->index]);[m
[31m-[m
[31m-    /* copy subrequest response headers */[m
[31m-[m
[31m-    pr_coctx->sr_headers[ctx->index] = &r->headers_out;[m
[31m-[m
[31m-    /* copy subrequest response body */[m
[31m-[m
[31m-    body_str = &pr_coctx->sr_bodies[ctx->index];[m
[31m-[m
[31m-    len = 0;[m
[31m-    for (cl = ctx->body; cl; cl = cl->next) {[m
[31m-        /*  ignore all non-memory buffers */[m
[31m-        len += cl->buf->last - cl->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    body_str->len = len;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        body_str->data = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_palloc(r->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        body_str->data = p;[m
[31m-[m
[31m-        /* copy from and then free the data buffers */[m
[31m-[m
[31m-        for (cl = ctx->body; cl; cl = cl->next) {[m
[31m-            p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-            cl->buf->last = cl->buf->pos;[m
[31m-[m
[31m-#if 0[m
[31m-            dd("free body chain link buf ASAP");[m
[31m-            ngx_pfree(r->pool, cl->buf->start);[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->body) {[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        ngx_chain_update_chains(r->pool,[m
[31m-#else[m
[31m-        ngx_chain_update_chains([m
[31m-#endif[m
[31m-                                &pr_ctx->free_bufs, &pr_ctx->busy_bufs,[m
[31m-                                &ctx->body,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_lua_module);[m
[31m-[m
[31m-        dd("free bufs: %p", pr_ctx->free_bufs);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_post_request_to_head(pr);[m
[31m-[m
[31m-    if (r != r->connection->data) {[m
[31m-        r->connection->data = r;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc == NGX_HTTP_CREATED[m
[31m-        || rc == NGX_HTTP_NO_CONTENT[m
[31m-        || (rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-            && rc != NGX_HTTP_CLOSE[m
[31m-            && rc != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-            && rc != NGX_HTTP_CLIENT_CLOSED_REQUEST))[m
[31m-    {[m
[31m-        /* emulate ngx_http_special_response_handler */[m
[31m-[m
[31m-        if (rc > NGX_OK) {[m
[31m-            r->err_status = rc;[m
[31m-[m
[31m-            r->expect_tested = 1;[m
[31m-            r->headers_out.content_type.len = 0;[m
[31m-            r->headers_out.content_length_n = 0;[m
[31m-[m
[31m-            ngx_http_clear_accept_ranges(r);[m
[31m-            ngx_http_clear_last_modified(r);[m
[31m-[m
[31m-            rc = ngx_http_lua_send_header_if_needed(r, ctx);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_set_content_length_header(ngx_http_request_t *r, off_t len)[m
[31m-{[m
[31m-    ngx_table_elt_t                 *h, *header;[m
[31m-    u_char                          *p;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_http_request_t              *pr;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t)) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->key = ngx_http_lua_content_length_header_key;[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    r->headers_in.content_length = h;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->value.data = p;[m
[31m-[m
[31m-    h->value.len = ngx_sprintf(h->value.data, "%O", len) - h->value.data;[m
[31m-[m
[31m-    h->hash = ngx_http_lua_content_length_hash;[m
[31m-[m
[31m-#if 0[m
[31m-    dd("content length hash: %lu == %lu", (unsigned long) h->hash,[m
[31m-       ngx_hash_key_lc((u_char *) "Content-Length",[m
[31m-                       sizeof("Content-Length") - 1));[m
[31m-#endif[m
[31m-[m
[31m-    dd("r content length: %.*s",[m
[31m-       (int) r->headers_in.content_length->value.len,[m
[31m-       r->headers_in.content_length->value.data);[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* forward the parent request's all other request headers */[m
[31m-[m
[31m-    part = &pr->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len == sizeof("Content-Length") - 1[m
[31m-            && ngx_strncasecmp(header[i].key.data, (u_char *) "Content-Length",[m
[31m-                               sizeof("Content-Length") - 1) == 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_lua_set_input_header(r, header[i].key,[m
[31m-                                          header[i].value, 0) == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_handle_subreq_responses(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t                   i, count;[m
[31m-    ngx_uint_t                   index;[m
[31m-    lua_State                   *co;[m
[31m-    ngx_str_t                   *body_str;[m
[31m-    ngx_table_elt_t             *header;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_http_headers_out_t      *sr_headers;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    u_char                  buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua handle subrequest responses");[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    co = coctx->co;[m
[31m-[m
[31m-    for (index = 0; index < coctx->nsubreqs; index++) {[m
[31m-        dd("summary: reqs %d, subquery %d, pending %d, req %.*s",[m
[31m-           (int) coctx->nsubreqs,[m
[31m-           (int) index,[m
[31m-           (int) coctx->pending_subreqs,[m
[31m-           (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-        /*  {{{ construct ret value */[m
[31m-        lua_createtable(co, 0 /* narr */, 4 /* nrec */);[m
[31m-[m
[31m-        /*  copy captured status */[m
[31m-        lua_pushinteger(co, coctx->sr_statuses[index]);[m
[31m-        lua_setfield(co, -2, "status");[m
[31m-[m
[31m-        dd("captured subrequest flags: %d", (int) coctx->sr_flags[index]);[m
[31m-[m
[31m-        /* set truncated flag if truncation happens */[m
[31m-        if (coctx->sr_flags[index] & NGX_HTTP_LUA_SUBREQ_TRUNCATED) {[m
[31m-            lua_pushboolean(co, 1);[m
[31m-            lua_setfield(co, -2, "truncated");[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushboolean(co, 0);[m
[31m-            lua_setfield(co, -2, "truncated");[m
[31m-        }[m
[31m-[m
[31m-        /*  copy captured body */[m
[31m-[m
[31m-        body_str = &coctx->sr_bodies[index];[m
[31m-[m
[31m-        lua_pushlstring(co, (char *) body_str->data, body_str->len);[m
[31m-        lua_setfield(co, -2, "body");[m
[31m-[m
[31m-        if (body_str->data) {[m
[31m-            dd("free body buffer ASAP");[m
[31m-            ngx_pfree(r->pool, body_str->data);[m
[31m-        }[m
[31m-[m
[31m-        /* copy captured headers */[m
[31m-[m
[31m-        sr_headers = coctx->sr_headers[index];[m
[31m-[m
[31m-        part = &sr_headers->headers.part;[m
[31m-        count = part->nelts;[m
[31m-        while (part->next) {[m
[31m-            part = part->next;[m
[31m-            count += part->nelts;[m
[31m-        }[m
[31m-[m
[31m-        lua_createtable(co, 0, count + 5); /* res.header */[m
[31m-[m
[31m-        dd("saving subrequest response headers");[m
[31m-[m
[31m-        part = &sr_headers->headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            dd("checking sr header %.*s", (int) header[i].key.len,[m
[31m-               header[i].key.data);[m
[31m-[m
[31m-#if 1[m
[31m-            if (header[i].hash == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            header[i].hash = 0;[m
[31m-[m
[31m-            dd("pushing sr header %.*s", (int) header[i].key.len,[m
[31m-               header[i].key.data);[m
[31m-[m
[31m-            lua_pushlstring(co, (char *) header[i].key.data,[m
[31m-                            header[i].key.len); /* header key */[m
[31m-            lua_pushvalue(co, -1); /* stack: table key key */[m
[31m-[m
[31m-            /* check if header already exists */[m
[31m-            lua_rawget(co, -3); /* stack: table key value */[m
[31m-[m
[31m-            if (lua_isnil(co, -1)) {[m
[31m-                lua_pop(co, 1); /* stack: table key */[m
[31m-[m
[31m-                lua_pushlstring(co, (char *) header[i].value.data,[m
[31m-                                header[i].value.len);[m
[31m-                    /* stack: table key value */[m
[31m-[m
[31m-                lua_rawset(co, -3); /* stack: table */[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                if (!lua_istable(co, -1)) { /* already inserted one value */[m
[31m-                    lua_createtable(co, 4, 0);[m
[31m-                        /* stack: table key value table */[m
[31m-[m
[31m-                    lua_insert(co, -2); /* stack: table key table value */[m
[31m-                    lua_rawseti(co, -2, 1); /* stack: table key table */[m
[31m-[m
[31m-                    lua_pushlstring(co, (char *) header[i].value.data,[m
[31m-                                    header[i].value.len);[m
[31m-                        /* stack: table key table value */[m
[31m-[m
[31m-                    lua_rawseti(co, -2, lua_objlen(co, -2) + 1);[m
[31m-                        /* stack: table key table */[m
[31m-[m
[31m-                    lua_rawset(co, -3); /* stack: table */[m
[31m-[m
[31m-                } else {[m
[31m-                    lua_pushlstring(co, (char *) header[i].value.data,[m
[31m-                                    header[i].value.len);[m
[31m-                        /* stack: table key table value */[m
[31m-[m
[31m-                    lua_rawseti(co, -2, lua_objlen(co, -2) + 1);[m
[31m-                        /* stack: table key table */[m
[31m-[m
[31m-                    lua_pop(co, 2); /* stack: table */[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (sr_headers->content_type.len) {[m
[31m-            lua_pushliteral(co, "Content-Type"); /* header key */[m
[31m-            lua_pushlstring(co, (char *) sr_headers->content_type.data,[m
[31m-                            sr_headers->content_type.len); /* head key value */[m
[31m-            lua_rawset(co, -3); /* head */[m
[31m-        }[m
[31m-[m
[31m-        if (sr_headers->content_length == NULL[m
[31m-            && sr_headers->content_length_n >= 0)[m
[31m-        {[m
[31m-            lua_pushliteral(co, "Content-Length"); /* header key */[m
[31m-[m
[31m-            lua_pushnumber(co, (lua_Number) sr_headers->content_length_n);[m
[31m-                /* head key value */[m
[31m-[m
[31m-            lua_rawset(co, -3); /* head */[m
[31m-        }[m
[31m-[m
[31m-        /* to work-around an issue in ngx_http_static_module[m
[31m-         * (github issue #41) */[m
[31m-        if (sr_headers->location && sr_headers->location->value.len) {[m
[31m-            lua_pushliteral(co, "Location"); /* header key */[m
[31m-            lua_pushlstring(co, (char *) sr_headers->location->value.data,[m
[31m-                            sr_headers->location->value.len);[m
[31m-            /* head key value */[m
[31m-            lua_rawset(co, -3); /* head */[m
[31m-        }[m
[31m-[m
[31m-        if (sr_headers->last_modified_time != -1) {[m
[31m-            if (sr_headers->status != NGX_HTTP_OK[m
[31m-                && sr_headers->status != NGX_HTTP_PARTIAL_CONTENT[m
[31m-                && sr_headers->status != NGX_HTTP_NOT_MODIFIED[m
[31m-                && sr_headers->status != NGX_HTTP_NO_CONTENT)[m
[31m-            {[m
[31m-                sr_headers->last_modified_time = -1;[m
[31m-                sr_headers->last_modified = NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (sr_headers->last_modified == NULL[m
[31m-            && sr_headers->last_modified_time != -1)[m
[31m-        {[m
[31m-            (void) ngx_http_time(buf, sr_headers->last_modified_time);[m
[31m-[m
[31m-            lua_pushliteral(co, "Last-Modified"); /* header key */[m
[31m-            lua_pushlstring(co, (char *) buf, sizeof(buf)); /* head key value */[m
[31m-            lua_rawset(co, -3); /* head */[m
[31m-        }[m
[31m-[m
[31m-        lua_setfield(co, -2, "header");[m
[31m-[m
[31m-        /*  }}} */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_subrequest_api(lua_State *L)[m
[31m-{[m
[31m-    lua_createtable(L, 0 /* narr */, 2 /* nrec */); /* .location */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_location_capture);[m
[31m-    lua_setfield(L, -2, "capture");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_location_capture_multi);[m
[31m-    lua_setfield(L, -2, "capture_multi");[m
[31m-[m
[31m-    lua_setfield(L, -2, "location");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,[m
[31m-    ngx_http_post_subrequest_t *ps, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_time_t                    *tp;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *sr;[m
[31m-    ngx_http_core_srv_conf_t      *cscf;[m
[31m-[m
[31m-#if nginx_version >= 1009005[m
[31m-[m
[31m-    if (r->subrequests == 0) {[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-        ngx_http_probe_subrequest_cycle(r, uri, args);[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua subrequests cycle while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#else  /* nginx_version <= 1009004 */[m
[31m-[m
[31m-    r->main->subrequests--;[m
[31m-[m
[31m-    if (r->main->subrequests == 0) {[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-        ngx_http_probe_subrequest_cycle(r, uri, args);[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua subrequests cycle while processing \"%V\"", uri);[m
[31m-        r->main->subrequests = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    sr = ngx_pcalloc(r->pool, sizeof(ngx_http_request_t));[m
[31m-    if (sr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr->signature = NGX_HTTP_MODULE;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    sr->connection = c;[m
[31m-[m
[31m-    sr->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (sr->ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&sr->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    sr->main_conf = cscf->ctx->main_conf;[m
[31m-    sr->srv_conf = cscf->ctx->srv_conf;[m
[31m-    sr->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    sr->pool = r->pool;[m
[31m-[m
[31m-    sr->headers_in.content_length_n = -1;[m
[31m-    sr->headers_in.keep_alive_n = -1;[m
[31m-[m
[31m-    ngx_http_clear_content_length(sr);[m
[31m-    ngx_http_clear_accept_ranges(sr);[m
[31m-    ngx_http_clear_last_modified(sr);[m
[31m-[m
[31m-    sr->request_body = r->request_body;[m
[31m-[m
[31m-#if (NGX_HTTP_SPDY)[m
[31m-    sr->spdy_stream = r->spdy_stream;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    sr->stream = r->stream;[m
[31m-#endif[m
[31m-[m
[31m-#ifdef HAVE_ALLOW_REQUEST_BODY_UPDATING_PATCH[m
[31m-    sr->content_length_n = -1;[m
[31m-#endif[m
[31m-[m
[31m-    sr->method = NGX_HTTP_GET;[m
[31m-    sr->http_version = r->http_version;[m
[31m-[m
[31m-    sr->request_line = r->request_line;[m
[31m-    sr->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        sr->args = *args;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua http subrequest \"%V?%V\"", uri, &sr->args);[m
[31m-[m
[31m-    sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;[m
[31m-    sr->waited = (flags & NGX_HTTP_SUBREQUEST_WAITED) != 0;[m
[31m-[m
[31m-    sr->unparsed_uri = r->unparsed_uri;[m
[31m-    sr->method_name = ngx_http_core_get_method;[m
[31m-    sr->http_protocol = r->http_protocol;[m
[31m-[m
[31m-    ngx_http_set_exten(sr);[m
[31m-[m
[31m-    sr->main = r->main;[m
[31m-    sr->parent = r;[m
[31m-    sr->post_subrequest = ps;[m
[31m-    sr->read_event_handler = ngx_http_request_empty_handler;[m
[31m-    sr->write_event_handler = ngx_http_handler;[m
[31m-[m
[31m-    sr->variables = r->variables;[m
[31m-[m
[31m-    sr->log_handler = r->log_handler;[m
[31m-[m
[31m-    sr->internal = 1;[m
[31m-[m
[31m-    sr->discard_body = r->discard_body;[m
[31m-    sr->expect_tested = 1;[m
[31m-    sr->main_filter_need_in_memory = r->main_filter_need_in_memory;[m
[31m-[m
[31m-    sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-[m
[31m-#if nginx_version >= 1009005[m
[31m-    sr->subrequests = r->subrequests - 1;[m
[31m-#endif[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    sr->start_sec = tp->sec;[m
[31m-    sr->start_msec = tp->msec;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    *psr = sr;[m
[31m-[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-    ngx_http_probe_subrequest_start(sr);[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_http_post_request(sr, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_subrequest_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run subrequests done, resuming lua thread");[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    dd("nsubreqs: %d", (int) coctx->nsubreqs);[m
[31m-[m
[31m-    ngx_http_lua_handle_subreq_responses(r, ctx);[m
[31m-[m
[31m-    dd("free sr_statues/headers/bodies memory ASAP");[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_pfree(r->pool, coctx->sr_statuses);[m
[31m-[m
[31m-    coctx->sr_statuses = NULL;[m
[31m-    coctx->sr_headers = NULL;[m
[31m-    coctx->sr_bodies = NULL;[m
[31m-    coctx->sr_flags = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, coctx->nsubreqs);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc >= NGX_OK */[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_cancel_subreq(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_posted_request_t   *pr;[m
[31m-    ngx_http_posted_request_t  **p;[m
[31m-[m
[31m-#if 1[m
[31m-    r->main->count--;[m
[31m-    r->main->subrequests++;[m
[31m-#endif[m
[31m-[m
[31m-    p = &r->main->posted_requests;[m
[31m-    for (pr = r->main->posted_requests; pr->next; pr = pr->next) {[m
[31m-        p = &pr->next;[m
[31m-    }[m
[31m-[m
[31m-    *p = NULL;[m
[31m-[m
[31m-    r->connection->data = r->parent;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_post_request_to_head(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_posted_request_t  *pr;[m
[31m-[m
[31m-    pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = r->main->posted_requests;[m
[31m-    r->main->posted_requests = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_copy_in_file_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_temp_file_t     *tf;[m
[31m-[m
[31m-    ngx_http_request_body_t   *body;[m
[31m-[m
[31m-    tf = r->request_body->temp_file;[m
[31m-[m
[31m-    if (!tf->persistent || !tf->clean) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the request body was not read by ngx_lua");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    body = ngx_palloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (body == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(body, r->request_body, sizeof(ngx_http_request_body_t));[m
[31m-[m
[31m-    body->temp_file = ngx_palloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-    if (body->temp_file == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(body->temp_file, tf, sizeof(ngx_temp_file_t));[m
[31m-    dd("file fd: %d", body->temp_file->file.fd);[m
[31m-[m
[31m-    r->request_body = body;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_copy_request_headers(ngx_http_request_t *sr, ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t                 *header;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    if (ngx_list_init(&sr->headers_in.headers, sr->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t)) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("before: parent req headers count: %d",[m
[31m-       (int) r->headers_in.headers.part.nelts);[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        dd("setting request header %.*s: %.*s", (int) header[i].key.len,[m
[31m-           header[i].key.data, (int) header[i].value.len,[m
[31m-           header[i].value.data);[m
[31m-[m
[31m-        if (ngx_http_lua_set_input_header(sr, header[i].key,[m
[31m-                                          header[i].value, 0) == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("after: parent req headers count: %d",[m
[31m-       (int) r->headers_in.headers.part.nelts);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.h[m
[1mdeleted file mode 100644[m
[1mindex aad4236..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.h[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SUBREQUEST_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SUBREQUEST_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_subrequest_api(lua_State *L);[m
[31m-ngx_int_t ngx_http_lua_post_subrequest(ngx_http_request_t *r, void *data,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_lua_get_method;[m
[31m-extern ngx_str_t  ngx_http_lua_put_method;[m
[31m-extern ngx_str_t  ngx_http_lua_post_method;[m
[31m-extern ngx_str_t  ngx_http_lua_head_method;[m
[31m-extern ngx_str_t  ngx_http_lua_delete_method;[m
[31m-extern ngx_str_t  ngx_http_lua_options_method;[m
[31m-extern ngx_str_t  ngx_http_lua_copy_method;[m
[31m-extern ngx_str_t  ngx_http_lua_move_method;[m
[31m-extern ngx_str_t  ngx_http_lua_lock_method;[m
[31m-extern ngx_str_t  ngx_http_lua_mkcol_method;[m
[31m-extern ngx_str_t  ngx_http_lua_propfind_method;[m
[31m-extern ngx_str_t  ngx_http_lua_proppatch_method;[m
[31m-extern ngx_str_t  ngx_http_lua_unlock_method;[m
[31m-extern ngx_str_t  ngx_http_lua_patch_method;[m
[31m-extern ngx_str_t  ngx_http_lua_trace_method;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_post_subrequest_data_s {[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *pr_co_ctx;[m
[31m-[m
[31m-} ngx_http_lua_post_subrequest_data_t;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SUBREQUEST_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_time.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_time.c[m
[1mdeleted file mode 100644[m
[1mindex 3272a75..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_time.c[m
[1m+++ /dev/null[m
[36m@@ -1,278 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_today(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_now(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_localtime(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_utctime(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_cookie_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_http_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_parse_http_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_update_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_start_time(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_today(lua_State *L)[m
[31m-{[m
[31m-    time_t                   now;[m
[31m-    ngx_tm_t                 tm;[m
[31m-    u_char                   buf[sizeof("2010-11-19") - 1];[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-    ngx_gmtime(now + ngx_cached_time->gmtoff * 60, &tm);[m
[31m-[m
[31m-    ngx_sprintf(buf, "%04d-%02d-%02d", tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                tm.ngx_tm_mday);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, sizeof(buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_localtime(lua_State *L)[m
[31m-{[m
[31m-    ngx_tm_t                 tm;[m
[31m-[m
[31m-    u_char buf[sizeof("2010-11-19 20:56:31") - 1];[m
[31m-[m
[31m-    ngx_gmtime(ngx_time() + ngx_cached_time->gmtoff * 60, &tm);[m
[31m-[m
[31m-    ngx_sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tm.ngx_tm_year,[m
[31m-                tm.ngx_tm_mon, tm.ngx_tm_mday, tm.ngx_tm_hour, tm.ngx_tm_min,[m
[31m-                tm.ngx_tm_sec);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, sizeof(buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_time(lua_State *L)[m
[31m-{[m
[31m-    lua_pushnumber(L, (lua_Number) ngx_time());[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_now(lua_State *L)[m
[31m-{[m
[31m-    ngx_time_t              *tp;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) (tp->sec + tp->msec / 1000.0L));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_update_time(lua_State *L)[m
[31m-{[m
[31m-    ngx_time_update();[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_utctime(lua_State *L)[m
[31m-{[m
[31m-    ngx_tm_t       tm;[m
[31m-    u_char         buf[sizeof("2010-11-19 20:56:31") - 1];[m
[31m-[m
[31m-    ngx_gmtime(ngx_time(), &tm);[m
[31m-[m
[31m-    ngx_sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tm.ngx_tm_year,[m
[31m-                tm.ngx_tm_mon, tm.ngx_tm_mday, tm.ngx_tm_hour, tm.ngx_tm_min,[m
[31m-                tm.ngx_tm_sec);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, sizeof(buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_cookie_time(lua_State *L)[m
[31m-{[m
[31m-    time_t                               t;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    u_char   buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    t = (time_t) luaL_checknumber(L, 1);[m
[31m-[m
[31m-    p = buf;[m
[31m-    p = ngx_http_cookie_time(p, t);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, p - buf);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_http_time(lua_State *L)[m
[31m-{[m
[31m-    time_t                               t;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    u_char   buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    t = (time_t) luaL_checknumber(L, 1);[m
[31m-[m
[31m-    p = buf;[m
[31m-    p = ngx_http_time(p, t);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, p - buf);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_parse_http_time(lua_State *L)[m
[31m-{[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-    time_t                               time;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    time = ngx_http_parse_time(p, len);[m
[31m-    if (time == NGX_ERROR) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) time);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_start_time(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) (r->start_sec + r->start_msec / 1000.0L));[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_time_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_utctime);[m
[31m-    lua_setfield(L, -2, "utctime");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_time);[m
[31m-    lua_setfield(L, -2, "get_now_ts"); /* deprecated */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_localtime);[m
[31m-    lua_setfield(L, -2, "get_now"); /* deprecated */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_localtime);[m
[31m-    lua_setfield(L, -2, "localtime");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_time);[m
[31m-    lua_setfield(L, -2, "time");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_now);[m
[31m-    lua_setfield(L, -2, "now");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_update_time);[m
[31m-    lua_setfield(L, -2, "update_time");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_today);[m
[31m-    lua_setfield(L, -2, "get_today"); /* deprecated */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_today);[m
[31m-    lua_setfield(L, -2, "today");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_cookie_time);[m
[31m-    lua_setfield(L, -2, "cookie_time");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_http_time);[m
[31m-    lua_setfield(L, -2, "http_time");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_parse_http_time);[m
[31m-    lua_setfield(L, -2, "parse_http_time");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_time_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_start_time);[m
[31m-    lua_setfield(L, -2, "start_time");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-double[m
[31m-ngx_http_lua_ffi_now(void)[m
[31m-{[m
[31m-    ngx_time_t              *tp;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    return tp->sec + tp->msec / 1000.0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-double[m
[31m-ngx_http_lua_ffi_req_start_time(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return r->start_sec + r->start_msec / 1000.0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-long[m
[31m-ngx_http_lua_ffi_time(void)[m
[31m-{[m
[31m-    return (long) ngx_time();[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_time.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_time.h[m
[1mdeleted file mode 100644[m
[1mindex 291f784..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_time.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_TIME_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_TIME_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_time_api(lua_State *L);[m
[31m-void ngx_http_lua_inject_req_time_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_TIME_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_timer.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_timer.c[m
[1mdeleted file mode 100644[m
[1mindex 96c0ace..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_timer.c[m
[1m+++ /dev/null[m
[36m@@ -1,714 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_timer.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void        **main_conf;[m
[31m-    void        **srv_conf;[m
[31m-    void        **loc_conf;[m
[31m-[m
[31m-    /* event ident must be after 3 words (i.e. 3 pointers' size) as in[m
[31m-     * ngx_connection_t. and we use the Lua coroutine reference number as[m
[31m-     * the event ident */[m
[31m-    int           co_ref;[m
[31m-    unsigned      premature;  /* :1 */[m
[31m-    lua_State    *co;[m
[31m-[m
[31m-    ngx_pool_t   *pool;[m
[31m-[m
[31m-    ngx_listening_t                   *listening;[m
[31m-    ngx_str_t                          client_addr_text;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t          *lmcf;[m
[31m-    ngx_http_lua_vm_state_t           *vm_state;[m
[31m-[m
[31m-} ngx_http_lua_timer_ctx_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_timer_at(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_timer_running_count(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_timer_pending_count(lua_State *L);[m
[31m-static void ngx_http_lua_timer_handler(ngx_event_t *ev);[m
[31m-static u_char *ngx_http_lua_log_timer_error(ngx_log_t *log, u_char *buf,[m
[31m-    size_t len);[m
[31m-static void ngx_http_lua_abort_pending_timers(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_timer_api(lua_State *L)[m
[31m-{[m
[31m-    lua_createtable(L, 0 /* narr */, 3 /* nrec */);    /* ngx.timer. */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_timer_at);[m
[31m-    lua_setfield(L, -2, "at");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_timer_running_count);[m
[31m-    lua_setfield(L, -2, "running_count");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_timer_pending_count);[m
[31m-    lua_setfield(L, -2, "pending_count");[m
[31m-[m
[31m-    lua_setfield(L, -2, "timer");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_timer_running_count(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request");[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    lua_pushnumber(L, lmcf->running_timers);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_timer_pending_count(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request");[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    lua_pushnumber(L, lmcf->pending_timers);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_timer_at(lua_State *L)[m
[31m-{[m
[31m-    int                      nargs, co_ref;[m
[31m-    u_char                  *p;[m
[31m-    lua_State               *vm;  /* the main thread */[m
[31m-    lua_State               *co;[m
[31m-    ngx_msec_t               delay;[m
[31m-    ngx_event_t             *ev = NULL;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_connection_t        *saved_c = NULL;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-#if 0[m
[31m-    ngx_http_connection_t   *hc;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_timer_ctx_t      *tctx = NULL;[m
[31m-    ngx_http_lua_main_conf_t      *lmcf;[m
[31m-#if 0[m
[31m-    ngx_http_core_main_conf_t     *cmcf;[m
[31m-#endif[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-    if (nargs < 2) {[m
[31m-        return luaL_error(L, "expecting at least 2 arguments but got %d",[m
[31m-                          nargs);[m
[31m-    }[m
[31m-[m
[31m-    delay = (ngx_msec_t) (luaL_checknumber(L, 1) * 1000);[m
[31m-[m
[31m-    luaL_argcheck(L, lua_isfunction(L, 2) && !lua_iscfunction(L, 2), 2,[m
[31m-                  "Lua function expected");[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_exiting && delay > 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "process exiting");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (lmcf->pending_timers >= lmcf->max_pending_timers) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "too many pending timers");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->watcher == NULL) {[m
[31m-        /* create the watcher fake connection */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "lua creating fake watcher connection");[m
[31m-[m
[31m-        if (ngx_cycle->files) {[m
[31m-            saved_c = ngx_cycle->files[0];[m
[31m-        }[m
[31m-[m
[31m-        lmcf->watcher = ngx_get_connection(0, ngx_cycle->log);[m
[31m-[m
[31m-        if (ngx_cycle->files) {[m
[31m-            ngx_cycle->files[0] = saved_c;[m
[31m-        }[m
[31m-[m
[31m-        if (lmcf->watcher == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        /* to work around the -1 check in ngx_worker_process_cycle: */[m
[31m-        lmcf->watcher->fd = (ngx_socket_t) -2;[m
[31m-[m
[31m-        lmcf->watcher->idle = 1;[m
[31m-        lmcf->watcher->read->handler = ngx_http_lua_abort_pending_timers;[m
[31m-        lmcf->watcher->data = lmcf;[m
[31m-    }[m
[31m-[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    co = lua_newthread(vm);[m
[31m-[m
[31m-    /* L stack: time func [args] thread */[m
[31m-[m
[31m-    ngx_http_lua_probe_user_coroutine_create(r, L, co);[m
[31m-[m
[31m-    lua_createtable(co, 0, 0);  /* the new globals table */[m
[31m-[m
[31m-    /* co stack: global_tb */[m
[31m-[m
[31m-    lua_createtable(co, 0, 1);  /* the metatable */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfield(co, -2, "__index");[m
[31m-    lua_setmetatable(co, -2);[m
[31m-[m
[31m-    /* co stack: global_tb */[m
[31m-[m
[31m-    ngx_http_lua_set_globals_table(co);[m
[31m-[m
[31m-    /* co stack: <empty> */[m
[31m-[m
[31m-    dd("stack top: %d", lua_gettop(L));[m
[31m-[m
[31m-    lua_xmove(vm, L, 1);    /* move coroutine from main thread to L */[m
[31m-[m
[31m-    /* L stack: time func [args] thread */[m
[31m-    /* vm stack: empty */[m
[31m-[m
[31m-    lua_pushvalue(L, 2);    /* copy entry function to top of L*/[m
[31m-[m
[31m-    /* L stack: time func [args] thread func */[m
[31m-[m
[31m-    lua_xmove(L, co, 1);    /* move entry function from L to co */[m
[31m-[m
[31m-    /* L stack: time func [args] thread */[m
[31m-    /* co stack: func */[m
[31m-[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /* co stack: func */[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    /* L stack: time func [args] thread corountines */[m
[31m-[m
[31m-    lua_pushvalue(L, -2);[m
[31m-[m
[31m-    /* L stack: time func [args] thread coroutines thread */[m
[31m-[m
[31m-    co_ref = luaL_ref(L, -2);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    /* L stack: time func [args] thread */[m
[31m-[m
[31m-    if (nargs > 2) {[m
[31m-        lua_pop(L, 1);  /* L stack: time func [args] */[m
[31m-        lua_xmove(L, co, nargs - 2);  /* L stack: time func */[m
[31m-[m
[31m-        /* co stack: func [args] */[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_alloc(sizeof(ngx_event_t) + sizeof(ngx_http_lua_timer_ctx_t),[m
[31m-                  r->connection->log);[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    ev = (ngx_event_t *) p;[m
[31m-[m
[31m-    ngx_memzero(ev, sizeof(ngx_event_t));[m
[31m-[m
[31m-    p += sizeof(ngx_event_t);[m
[31m-[m
[31m-    tctx = (ngx_http_lua_timer_ctx_t *) p;[m
[31m-[m
[31m-    tctx->premature = 0;[m
[31m-    tctx->co_ref = co_ref;[m
[31m-    tctx->co = co;[m
[31m-    tctx->main_conf = r->main_conf;[m
[31m-    tctx->srv_conf = r->srv_conf;[m
[31m-    tctx->loc_conf = r->loc_conf;[m
[31m-    tctx->lmcf = lmcf;[m
[31m-[m
[31m-    tctx->pool = ngx_create_pool(128, ngx_cycle->log);[m
[31m-    if (tctx->pool == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection) {[m
[31m-        tctx->listening = r->connection->listening;[m
[31m-[m
[31m-    } else {[m
[31m-        tctx->listening = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->addr_text.len) {[m
[31m-        tctx->client_addr_text.data = ngx_palloc(tctx->pool,[m
[31m-                                                 r->connection->addr_text.len);[m
[31m-        if (tctx->client_addr_text.data == NULL) {[m
[31m-            goto nomem;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(tctx->client_addr_text.data, r->connection->addr_text.data,[m
[31m-                   r->connection->addr_text.len);[m
[31m-        tctx->client_addr_text.len = r->connection->addr_text.len;[m
[31m-[m
[31m-    } else {[m
[31m-        tctx->client_addr_text.len = 0;[m
[31m-        tctx->client_addr_text.data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx && ctx->vm_state) {[m
[31m-        tctx->vm_state = ctx->vm_state;[m
[31m-        tctx->vm_state->count++;[m
[31m-[m
[31m-    } else {[m
[31m-        tctx->vm_state = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ev->handler = ngx_http_lua_timer_handler;[m
[31m-    ev->data = tctx;[m
[31m-    ev->log = ngx_cycle->log;[m
[31m-[m
[31m-    lmcf->pending_timers++;[m
[31m-[m
[31m-    ngx_add_timer(ev, delay);[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    if (tctx && tctx->pool) {[m
[31m-        ngx_destroy_pool(tctx->pool);[m
[31m-    }[m
[31m-[m
[31m-    if (ev) {[m
[31m-        ngx_free(ev);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    luaL_unref(L, -1, co_ref);[m
[31m-[m
[31m-    return luaL_error(L, "no memory");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_timer_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    int                      n;[m
[31m-    lua_State               *L;[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_connection_t        *c = NULL;[m
[31m-    ngx_http_request_t      *r = NULL;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_cleanup_t      *cln;[m
[31m-    ngx_pool_cleanup_t      *pcln;[m
[31m-[m
[31m-    ngx_http_lua_timer_ctx_t         tctx;[m
[31m-    ngx_http_lua_main_conf_t        *lmcf;[m
[31m-    ngx_http_core_loc_conf_t        *clcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua ngx.timer expired");[m
[31m-[m
[31m-    ngx_memcpy(&tctx, ev->data, sizeof(ngx_http_lua_timer_ctx_t));[m
[31m-    ngx_free(ev);[m
[31m-[m
[31m-    lmcf = tctx.lmcf;[m
[31m-[m
[31m-    lmcf->pending_timers--;[m
[31m-[m
[31m-    if (lmcf->running_timers >= lmcf->max_running_timers) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "%i lua_max_running_timers are not enough",[m
[31m-                      lmcf->max_running_timers);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_http_lua_create_fake_connection(tctx.pool);[m
[31m-    if (c == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c->log->handler = ngx_http_lua_log_timer_error;[m
[31m-    c->log->data = c;[m
[31m-[m
[31m-    c->listening = tctx.listening;[m
[31m-    c->addr_text = tctx.client_addr_text;[m
[31m-[m
[31m-    r = ngx_http_lua_create_fake_request(c);[m
[31m-    if (r == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    r->main_conf = tctx.main_conf;[m
[31m-    r->srv_conf = tctx.srv_conf;[m
[31m-    r->loc_conf = tctx.loc_conf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003014[m
[31m-[m
[31m-#   if nginx_version >= 1009000[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-    ngx_http_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    c->log->file = clcf->error_log->file;[m
[31m-[m
[31m-    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {[m
[31m-        c->log->log_level = clcf->error_log->log_level;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    dd("lmcf: %p", lmcf);[m
[31m-[m
[31m-    ctx = ngx_http_lua_create_ctx(r);[m
[31m-    if (ctx == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (tctx.vm_state) {[m
[31m-        ctx->vm_state = tctx.vm_state;[m
[31m-[m
[31m-        pcln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-        if (pcln == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        pcln->handler = ngx_http_lua_cleanup_vm;[m
[31m-        pcln->data = tctx.vm_state;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-    cln->data = ctx;[m
[31m-    ctx->cleanup = &cln->handler;[m
[31m-[m
[31m-    ctx->entered_content_phase = 1;[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_TIMER;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_ref = tctx.co_ref;[m
[31m-    ctx->cur_co_ctx->co = tctx.co;[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-    dd("r connection: %p, log %p", r->connection, r->connection->log);[m
[31m-[m
[31m-    /*  save the request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(tctx.co, r);[m
[31m-[m
[31m-    lmcf->running_timers++;[m
[31m-[m
[31m-    lua_pushboolean(tctx.co, tctx.premature);[m
[31m-[m
[31m-    n = lua_gettop(tctx.co);[m
[31m-    if (n > 2) {[m
[31m-        lua_insert(tctx.co, 2);[m
[31m-    }[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, n - 1);[m
[31m-[m
[31m-    dd("timer lua run thread: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-        /* do nothing */[m
[31m-[m
[31m-    } else if (rc == NGX_AGAIN) {[m
[31m-        rc = ngx_http_lua_content_run_posted_threads(L, r, ctx, 0);[m
[31m-[m
[31m-    } else if (rc == NGX_DONE) {[m
[31m-        rc = ngx_http_lua_content_run_posted_threads(L, r, ctx, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        rc = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_finalize_request(r, rc);[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (tctx.co_ref && tctx.co) {[m
[31m-        lua_pushlightuserdata(tctx.co, &ngx_http_lua_coroutines_key);[m
[31m-        lua_rawget(tctx.co, LUA_REGISTRYINDEX);[m
[31m-        luaL_unref(tctx.co, -1, tctx.co_ref);[m
[31m-        lua_settop(tctx.co, 0);[m
[31m-    }[m
[31m-[m
[31m-    if (tctx.vm_state) {[m
[31m-        ngx_http_lua_cleanup_vm(tctx.vm_state);[m
[31m-    }[m
[31m-[m
[31m-    if (c) {[m
[31m-        ngx_http_lua_close_fake_connection(c);[m
[31m-[m
[31m-    } else if (tctx.pool) {[m
[31m-        ngx_destroy_pool(tctx.pool);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_log_timer_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_connection_t    *c;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    c = log->data;[m
[31m-[m
[31m-    dd("ctx = %p", c);[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", context: ngx.timer");[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (c->addr_text.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", client: %V", &c->addr_text);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (c && c->listening && c->listening->addr_text.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", server: %V", &c->listening->addr_text);[m
[31m-        /* len -= p - buf; */[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_abort_pending_timers(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_int_t                    i, n;[m
[31m-    ngx_event_t                **events;[m
[31m-    ngx_connection_t            *c, *saved_c = NULL;[m
[31m-    ngx_rbtree_node_t           *cur, *prev, *next, *sentinel, *temp;[m
[31m-    ngx_http_lua_timer_ctx_t    *tctx;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua abort pending timers");[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    lmcf = c->data;[m
[31m-[m
[31m-    dd("lua connection fd: %d", (int) c->fd);[m
[31m-[m
[31m-    if (!c->close) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->read->closed = 1;[m
[31m-    c->write->closed = 1;[m
[31m-[m
[31m-    /* we temporarily use a valid fd (0) to make ngx_free_connection happy */[m
[31m-[m
[31m-    c->fd = 0;[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        saved_c = ngx_cycle->files[0];[m
[31m-    }[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        ngx_cycle->files[0] = saved_c;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->pending_timers == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* expire pending timers immediately */[m
[31m-[m
[31m-    sentinel = ngx_event_timer_rbtree.sentinel;[m
[31m-[m
[31m-    cur = ngx_event_timer_rbtree.root;[m
[31m-[m
[31m-    /* XXX nginx does not guarentee the parent of root is meaningful,[m
[31m-     * so we temporarily override it to simplify tree traversal. */[m
[31m-    temp = cur->parent;[m
[31m-    cur->parent = NULL;[m
[31m-[m
[31m-    prev = NULL;[m
[31m-[m
[31m-    events = ngx_pcalloc(ngx_cycle->pool,[m
[31m-                         lmcf->pending_timers * sizeof(ngx_event_t));[m
[31m-    if (events == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    dd("root: %p, root parent: %p, sentinel: %p", cur, cur->parent, sentinel);[m
[31m-[m
[31m-    while (n < lmcf->pending_timers) {[m
[31m-        if  (cur == sentinel || cur == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "lua pending timer counter got out of sync: %i",[m
[31m-                          lmcf->pending_timers);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        dd("prev: %p, cur: %p, cur parent: %p, cur left: %p, cur right: %p",[m
[31m-           prev, cur, cur->parent, cur->left, cur->right);[m
[31m-[m
[31m-        if (prev == cur->parent) {[m
[31m-            /* neither of the children has been accessed yet */[m
[31m-[m
[31m-            next = cur->left;[m
[31m-            if (next == sentinel) {[m
[31m-                ev = (ngx_event_t *)[m
[31m-                    ((char *) cur - offsetof(ngx_event_t, timer));[m
[31m-[m
[31m-                if (ev->handler == ngx_http_lua_timer_handler) {[m
[31m-                    dd("found node: %p", cur);[m
[31m-                    events[n++] = ev;[m
[31m-                }[m
[31m-[m
[31m-                next = (cur->right != sentinel) ? cur->right : cur->parent;[m
[31m-            }[m
[31m-[m
[31m-        } else if (prev == cur->left) {[m
[31m-            /* just accessed the left child */[m
[31m-[m
[31m-            ev = (ngx_event_t *)[m
[31m-                ((char *) cur - offsetof(ngx_event_t, timer));[m
[31m-[m
[31m-            if (ev->handler == ngx_http_lua_timer_handler) {[m
[31m-                dd("found node 2: %p", cur);[m
[31m-                events[n++] = ev;[m
[31m-            }[m
[31m-[m
[31m-            next = (cur->right != sentinel) ? cur->right : cur->parent;[m
[31m-[m
[31m-        } else if (prev == cur->right) {[m
[31m-            /* already accessed both children */[m
[31m-            next = cur->parent;[m
[31m-[m
[31m-        } else {[m
[31m-            /* not reacheable */[m
[31m-            next = NULL;[m
[31m-        }[m
[31m-[m
[31m-        prev = cur;[m
[31m-        cur = next;[m
[31m-    }[m
[31m-[m
[31m-    /* restore the old tree root's parent */[m
[31m-    ngx_event_timer_rbtree.root->parent = temp;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua found %i pending timers to be aborted prematurely",[m
[31m-                   n);[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        ev = events[i];[m
[31m-[m
[31m-        ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        ev->timer.left = NULL;[m
[31m-        ev->timer.right = NULL;[m
[31m-        ev->timer.parent = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ev->timer_set = 0;[m
[31m-[m
[31m-        ev->timedout = 1;[m
[31m-[m
[31m-        tctx = ev->data;[m
[31m-        tctx->premature = 1;[m
[31m-[m
[31m-        dd("calling timer handler prematurely");[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (pending_timers) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "lua pending timer counter got out of sync: %i",[m
[31m-                      pending_timers);[m
[31m-    }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_timer.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_timer.h[m
[1mdeleted file mode 100644[m
[1mindex 0addb18..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_timer.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_TIMER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_TIMER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_timer_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_TIMER_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uri.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uri.c[m
[1mdeleted file mode 100644[m
[1mindex 3559b5c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uri.c[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_uri.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_set_uri(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_uri_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_uri);[m
[31m-    lua_setfield(L, -2, "set_uri");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_uri(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    size_t                       len;[m
[31m-    u_char                      *p;[m
[31m-    int                          n;[m
[31m-    int                          jump = 0;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return luaL_error(L, "attempt to use zero-length uri");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-[m
[31m-        luaL_checktype(L, 2, LUA_TBOOLEAN);[m
[31m-        jump = lua_toboolean(L, 2);[m
[31m-[m
[31m-        if (jump) {[m
[31m-[m
[31m-            ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-            if (ctx == NULL) {[m
[31m-                return luaL_error(L, "no ctx found");[m
[31m-            }[m
[31m-[m
[31m-            dd("rewrite: %d, access: %d, content: %d",[m
[31m-               (int) ctx->entered_rewrite_phase,[m
[31m-               (int) ctx->entered_access_phase,[m
[31m-               (int) ctx->entered_content_phase);[m
[31m-[m
[31m-            ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua set uri jump to \"%*s\"", len, p);[m
[31m-[m
[31m-            ngx_http_lua_check_if_abortable(L, ctx);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->uri.data = ngx_palloc(r->pool, len);[m
[31m-    if (r->uri.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(r->uri.data, p, len);[m
[31m-[m
[31m-    r->uri.len = len;[m
[31m-[m
[31m-    r->internal = 1;[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-[m
[31m-    ngx_http_set_exten(r);[m
[31m-[m
[31m-    if (jump) {[m
[31m-        r->uri_changed = 1;[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    r->valid_location = 0;[m
[31m-    r->uri_changed = 0;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uri.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uri.h[m
[1mdeleted file mode 100644[m
[1mindex 9c6e066..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uri.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_URI_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_URI_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_req_uri_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_URI_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uthread.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uthread.c[m
[1mdeleted file mode 100644[m
[1mindex 8195ec0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uthread.c[m
[1m+++ /dev/null[m
[36m@@ -1,285 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_uthread.h"[m
[31m-#include "ngx_http_lua_coroutine.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-#if 1[m
[31m-#undef ngx_http_lua_probe_info[m
[31m-#define ngx_http_lua_probe_info(msg)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_uthread_spawn(lua_State *L);[m
[31m-static int ngx_http_lua_uthread_wait(lua_State *L);[m
[31m-static int ngx_http_lua_uthread_kill(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_uthread_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    /* new thread table */[m
[31m-    lua_createtable(L, 0 /* narr */, 3 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_uthread_spawn);[m
[31m-    lua_setfield(L, -2, "spawn");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_uthread_wait);[m
[31m-    lua_setfield(L, -2, "wait");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_uthread_kill);[m
[31m-    lua_setfield(L, -2, "kill");[m
[31m-[m
[31m-    lua_setfield(L, -2, "thread");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_uthread_spawn(lua_State *L)[m
[31m-{[m
[31m-    int                           n;[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_http_lua_ctx_t           *ctx;[m
[31m-    ngx_http_lua_co_ctx_t        *coctx = NULL;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_coroutine_create_helper(L, r, ctx, &coctx);[m
[31m-[m
[31m-    /* anchor the newly created coroutine into the Lua registry */[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    coctx->co_ref = luaL_ref(L, -2);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (n > 1) {[m
[31m-        lua_replace(L, 1);[m
[31m-        lua_xmove(L, coctx->co, n - 1);[m
[31m-    }[m
[31m-[m
[31m-    coctx->is_uthread = 1;[m
[31m-    ctx->uthreads++;[m
[31m-[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-    ctx->co_op = NGX_HTTP_LUA_USER_THREAD_RESUME;[m
[31m-[m
[31m-    ctx->cur_co_ctx->thread_spawn_yielded = 1;[m
[31m-[m
[31m-    if (ngx_http_lua_post_thread(r, ctx, ctx->cur_co_ctx) != NGX_OK) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    coctx->parent_co_ctx = ctx->cur_co_ctx;[m
[31m-    ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-    ngx_http_lua_probe_user_thread_spawn(r, L, coctx->co);[m
[31m-[m
[31m-    dd("yielding with arg %s, top=%d, index-1:%s", luaL_typename(L, -1),[m
[31m-       (int) lua_gettop(L), luaL_typename(L, 1));[m
[31m-    return lua_yield(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_uthread_wait(lua_State *L)[m
[31m-{[m
[31m-    int                          i, nargs, nrets;[m
[31m-    lua_State                   *sub_co;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx, *sub_coctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-        sub_co = lua_tothread(L, i);[m
[31m-[m
[31m-        luaL_argcheck(L, sub_co, i, "lua thread expected");[m
[31m-[m
[31m-        sub_coctx = ngx_http_lua_get_co_ctx(sub_co, ctx);[m
[31m-        if (sub_coctx == NULL) {[m
[31m-            return luaL_error(L, "no co ctx found");[m
[31m-        }[m
[31m-[m
[31m-        if (!sub_coctx->is_uthread) {[m
[31m-            return luaL_error(L, "attempt to wait on a coroutine that is "[m
[31m-                              "not a user thread");[m
[31m-        }[m
[31m-[m
[31m-        if (sub_coctx->parent_co_ctx != coctx) {[m
[31m-            return luaL_error(L, "only the parent coroutine can wait on the "[m
[31m-                              "thread");[m
[31m-        }[m
[31m-[m
[31m-        switch (sub_coctx->co_status) {[m
[31m-        case NGX_HTTP_LUA_CO_ZOMBIE:[m
[31m-[m
[31m-            ngx_http_lua_probe_info("found zombie child");[m
[31m-[m
[31m-            nrets = lua_gettop(sub_coctx->co);[m
[31m-[m
[31m-            dd("child retval count: %d, %s: %s", (int) nrets,[m
[31m-               luaL_typename(sub_coctx->co, -1),[m
[31m-               lua_tostring(sub_coctx->co, -1));[m
[31m-[m
[31m-            if (nrets) {[m
[31m-                lua_xmove(sub_coctx->co, L, nrets);[m
[31m-            }[m
[31m-[m
[31m-#if 1[m
[31m-            ngx_http_lua_del_thread(r, L, ctx, sub_coctx);[m
[31m-            ctx->uthreads--;[m
[31m-#endif[m
[31m-[m
[31m-            return nrets;[m
[31m-[m
[31m-        case NGX_HTTP_LUA_CO_DEAD:[m
[31m-            dd("uthread already waited: %p (parent %p)", sub_coctx,[m
[31m-               coctx);[m
[31m-[m
[31m-            if (i < nargs) {[m
[31m-                /* just ignore it if it is not the last one */[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* being the last one */[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "already waited or killed");[m
[31m-            return 2;[m
[31m-[m
[31m-        default:[m
[31m-            dd("uthread %p still alive, status: %d, parent %p", sub_coctx,[m
[31m-               sub_coctx->co_status, coctx);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_probe_user_thread_wait(L, sub_coctx->co);[m
[31m-        sub_coctx->waited_by_parent = 1;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_uthread_kill(lua_State *L)[m
[31m-{[m
[31m-    lua_State                   *sub_co;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx, *sub_coctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    sub_co = lua_tothread(L, 1);[m
[31m-    luaL_argcheck(L, sub_co, 1, "lua thread expected");[m
[31m-[m
[31m-    sub_coctx = ngx_http_lua_get_co_ctx(sub_co, ctx);[m
[31m-[m
[31m-    if (sub_coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    if (!sub_coctx->is_uthread) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "not user thread");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (sub_coctx->parent_co_ctx != coctx) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "killer not parent");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (sub_coctx->pending_subreqs > 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "pending subrequests");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    switch (sub_coctx->co_status) {[m
[31m-    case NGX_HTTP_LUA_CO_ZOMBIE:[m
[31m-        ngx_http_lua_del_thread(r, L, ctx, sub_coctx);[m
[31m-        ctx->uthreads--;[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "already terminated");[m
[31m-        return 2;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CO_DEAD:[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "already waited or killed");[m
[31m-        return 2;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_http_lua_cleanup_pending_operation(sub_coctx);[m
[31m-        ngx_http_lua_del_thread(r, L, ctx, sub_coctx);[m
[31m-        ctx->uthreads--;[m
[31m-[m
[31m-        lua_pushinteger(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* not reacheable */[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uthread.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uthread.h[m
[1mdeleted file mode 100644[m
[1mindex 9c3e2d4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_uthread.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_UTHREAD_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_UTHREAD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_is_thread(ctx)                                          \[m
[31m-    ((ctx)->cur_co_ctx->is_uthread || (ctx)->cur_co_ctx == &(ctx)->entry_co_ctx)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_is_entry_thread(ctx)                                    \[m
[31m-    ((ctx)->cur_co_ctx == &(ctx)->entry_co_ctx)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_entry_thread_alive(ctx)                                 \[m
[31m-    ((ctx)->entry_co_ctx.co_ref != LUA_NOREF)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_coroutine_alive(coctx)                                  \[m
[31m-    ((coctx)->co_status != NGX_HTTP_LUA_CO_DEAD                              \[m
[31m-     && (coctx)->co_status != NGX_HTTP_LUA_CO_ZOMBIE)[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_uthread_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_UTHREAD_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_util.c[m
[1mdeleted file mode 100644[m
[1mindex 1bd1388..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,4100 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "nginx.h"[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_args.h"[m
[31m-#include "ngx_http_lua_uri.h"[m
[31m-#include "ngx_http_lua_req_body.h"[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_control.h"[m
[31m-#include "ngx_http_lua_ndk.h"[m
[31m-#include "ngx_http_lua_subrequest.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_req_method.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_coroutine.h"[m
[31m-#include "ngx_http_lua_socket_tcp.h"[m
[31m-#include "ngx_http_lua_socket_udp.h"[m
[31m-#include "ngx_http_lua_sleep.h"[m
[31m-#include "ngx_http_lua_setby.h"[m
[31m-#include "ngx_http_lua_headerfilterby.h"[m
[31m-#include "ngx_http_lua_bodyfilterby.h"[m
[31m-#include "ngx_http_lua_logby.h"[m
[31m-#include "ngx_http_lua_phase.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-#include "ngx_http_lua_uthread.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_timer.h"[m
[31m-#include "ngx_http_lua_config.h"[m
[31m-#include "ngx_http_lua_worker.h"[m
[31m-#include "ngx_http_lua_socket_tcp.h"[m
[31m-#include "ngx_http_lua_ssl_certby.h"[m
[31m-[m
[31m-[m
[31m-#if 1[m
[31m-#undef ngx_http_lua_probe_info[m
[31m-#define ngx_http_lua_probe_info(msg)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_BT_DEPTH[m
[31m-#define NGX_HTTP_LUA_BT_DEPTH  22[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_BT_MAX_COROS[m
[31m-#define NGX_HTTP_LUA_BT_MAX_COROS  5[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-char ngx_http_lua_code_cache_key;[m
[31m-char ngx_http_lua_regex_cache_key;[m
[31m-char ngx_http_lua_socket_pool_key;[m
[31m-char ngx_http_lua_coroutines_key;[m
[31m-char ngx_http_lua_headers_metatable_key;[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_http_lua_location_hash = 0;[m
[31m-ngx_uint_t  ngx_http_lua_content_length_hash = 0;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_send_http10_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static void ngx_http_lua_init_registry(lua_State *L, ngx_log_t *log);[m
[31m-static void ngx_http_lua_init_globals(lua_State *L, ngx_cycle_t *cycle,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log);[m
[31m-static void ngx_http_lua_set_path(ngx_cycle_t *cycle, lua_State *L, int tab_idx,[m
[31m-    const char *fieldname, const char *path, const char *default_path,[m
[31m-    ngx_log_t *log);[m
[31m-static ngx_int_t ngx_http_lua_handle_exec(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_lua_handle_exit(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_lua_handle_rewrite_jump(lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx);[m
[31m-static int ngx_http_lua_thread_traceback(lua_State *L, lua_State *co,[m
[31m-    ngx_http_lua_co_ctx_t *coctx);[m
[31m-static void ngx_http_lua_inject_ngx_api(lua_State *L,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log);[m
[31m-static void ngx_http_lua_inject_arg_api(lua_State *L);[m
[31m-static int ngx_http_lua_param_get(lua_State *L);[m
[31m-static int ngx_http_lua_param_set(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_output_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_lua_send_special(ngx_http_request_t *r,[m
[31m-    ngx_uint_t flags);[m
[31m-static void ngx_http_lua_finalize_threads(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_post_zombie_thread(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_co_ctx_t *parent, ngx_http_lua_co_ctx_t *thread);[m
[31m-static void ngx_http_lua_cleanup_zombie_child_uthreads(ngx_http_request_t *r,[m
[31m-    lua_State *L, ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx);[m
[31m-static ngx_int_t ngx_http_lua_on_abort_resume(ngx_http_request_t *r);[m
[31m-static void ngx_http_lua_close_fake_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_flush_pending_output(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_lua_process_flushing_coroutines(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static lua_State *ngx_http_lua_new_state(lua_State *parent_vm,[m
[31m-    ngx_cycle_t *cycle, ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log);[m
[31m-static int ngx_http_lua_get_raw_phase_context(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#ifndef LUA_PATH_SEP[m
[31m-#define LUA_PATH_SEP ";"[m
[31m-#endif[m
[31m-[m
[31m-#define AUX_MARK "\1"[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_set_path(ngx_cycle_t *cycle, lua_State *L, int tab_idx,[m
[31m-    const char *fieldname, const char *path, const char *default_path,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    const char          *tmp_path;[m
[31m-    const char          *prefix;[m
[31m-[m
[31m-    /* XXX here we use some hack to simplify string manipulation */[m
[31m-    tmp_path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,[m
[31m-                         LUA_PATH_SEP AUX_MARK LUA_PATH_SEP);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) cycle->prefix.data, cycle->prefix.len);[m
[31m-    prefix = lua_tostring(L, -1);[m
[31m-    tmp_path = luaL_gsub(L, tmp_path, "$prefix", prefix);[m
[31m-    tmp_path = luaL_gsub(L, tmp_path, "${prefix}", prefix);[m
[31m-    lua_pop(L, 3);[m
[31m-[m
[31m-    dd("tmp_path path: %s", tmp_path);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    tmp_path =[m
[31m-#else[m
[31m-    (void)[m
[31m-#endif[m
[31m-        luaL_gsub(L, tmp_path, AUX_MARK, default_path);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua setting lua package.%s to \"%s\"", fieldname, tmp_path);[m
[31m-#endif[m
[31m-[m
[31m-    lua_remove(L, -2);[m
[31m-[m
[31m-    /* fix negative index as there's new data on stack */[m
[31m-    tab_idx = (tab_idx < 0) ? (tab_idx - 1) : tab_idx;[m
[31m-    lua_setfield(L, tab_idx, fieldname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Create new table and set _G field to itself.[m
[31m- *[m
[31m- * After:[m
[31m- *         | new table | <- top[m
[31m- *         |    ...    |[m
[31m- * */[m
[31m-void[m
[31m-ngx_http_lua_create_new_globals_table(lua_State *L, int narr, int nrec)[m
[31m-{[m
[31m-    lua_createtable(L, narr, nrec + 1);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "_G");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_State *[m
[31m-ngx_http_lua_new_state(lua_State *parent_vm, ngx_cycle_t *cycle,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log)[m
[31m-{[m
[31m-    lua_State       *L;[m
[31m-    const char      *old_path;[m
[31m-    const char      *new_path;[m
[31m-    size_t           old_path_len;[m
[31m-    const char      *old_cpath;[m
[31m-    const char      *new_cpath;[m
[31m-    size_t           old_cpath_len;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "lua creating new vm state");[m
[31m-[m
[31m-    L = luaL_newstate();[m
[31m-    if (L == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    luaL_openlibs(L);[m
[31m-[m
[31m-    lua_getglobal(L, "package");[m
[31m-[m
[31m-    if (!lua_istable(L, -1)) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, 0,[m
[31m-                      "the \"package\" table does not exist");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (parent_vm) {[m
[31m-        lua_getglobal(parent_vm, "package");[m
[31m-        lua_getfield(parent_vm, -1, "path");[m
[31m-        old_path = lua_tolstring(parent_vm, -1, &old_path_len);[m
[31m-        lua_pop(parent_vm, 1);[m
[31m-[m
[31m-        lua_pushlstring(L, old_path, old_path_len);[m
[31m-        lua_setfield(L, -2, "path");[m
[31m-[m
[31m-        lua_getfield(parent_vm, -1, "cpath");[m
[31m-        old_path = lua_tolstring(parent_vm, -1, &old_path_len);[m
[31m-        lua_pop(parent_vm, 2);[m
[31m-[m
[31m-        lua_pushlstring(L, old_path, old_path_len);[m
[31m-        lua_setfield(L, -2, "cpath");[m
[31m-[m
[31m-    } else {[m
[31m-#ifdef LUA_DEFAULT_PATH[m
[31m-#   define LUA_DEFAULT_PATH_LEN (sizeof(LUA_DEFAULT_PATH) - 1)[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "lua prepending default package.path with %s",[m
[31m-                       LUA_DEFAULT_PATH);[m
[31m-[m
[31m-        lua_pushliteral(L, LUA_DEFAULT_PATH ";"); /* package default */[m
[31m-        lua_getfield(L, -2, "path"); /* package default old */[m
[31m-        old_path = lua_tolstring(L, -1, &old_path_len);[m
[31m-        lua_concat(L, 2); /* package new */[m
[31m-        lua_setfield(L, -2, "path"); /* package */[m
[31m-#endif[m
[31m-[m
[31m-#ifdef LUA_DEFAULT_CPATH[m
[31m-#   define LUA_DEFAULT_CPATH_LEN (sizeof(LUA_DEFAULT_CPATH) - 1)[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "lua prepending default package.cpath with %s",[m
[31m-                       LUA_DEFAULT_CPATH);[m
[31m-[m
[31m-        lua_pushliteral(L, LUA_DEFAULT_CPATH ";"); /* package default */[m
[31m-        lua_getfield(L, -2, "cpath"); /* package default old */[m
[31m-        old_cpath = lua_tolstring(L, -1, &old_cpath_len);[m
[31m-        lua_concat(L, 2); /* package new */[m
[31m-        lua_setfield(L, -2, "cpath"); /* package */[m
[31m-#endif[m
[31m-[m
[31m-        if (lmcf->lua_path.len != 0) {[m
[31m-            lua_getfield(L, -1, "path"); /* get original package.path */[m
[31m-            old_path = lua_tolstring(L, -1, &old_path_len);[m
[31m-[m
[31m-            dd("old path: %s", old_path);[m
[31m-[m
[31m-            lua_pushlstring(L, (char *) lmcf->lua_path.data,[m
[31m-                            lmcf->lua_path.len);[m
[31m-            new_path = lua_tostring(L, -1);[m
[31m-[m
[31m-            ngx_http_lua_set_path(cycle, L, -3, "path", new_path, old_path,[m
[31m-                                  log);[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-        }[m
[31m-[m
[31m-        if (lmcf->lua_cpath.len != 0) {[m
[31m-            lua_getfield(L, -1, "cpath"); /* get original package.cpath */[m
[31m-            old_cpath = lua_tolstring(L, -1, &old_cpath_len);[m
[31m-[m
[31m-            dd("old cpath: %s", old_cpath);[m
[31m-[m
[31m-            lua_pushlstring(L, (char *) lmcf->lua_cpath.data,[m
[31m-                            lmcf->lua_cpath.len);[m
[31m-            new_cpath = lua_tostring(L, -1);[m
[31m-[m
[31m-            ngx_http_lua_set_path(cycle, L, -3, "cpath", new_cpath, old_cpath,[m
[31m-                                  log);[m
[31m-[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pop(L, 1); /* remove the "package" table */[m
[31m-[m
[31m-    ngx_http_lua_init_registry(L, log);[m
[31m-    ngx_http_lua_init_globals(L, cycle, lmcf, log);[m
[31m-[m
[31m-    return L;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-lua_State *[m
[31m-ngx_http_lua_new_thread(ngx_http_request_t *r, lua_State *L, int *ref)[m
[31m-{[m
[31m-    int              base;[m
[31m-    lua_State       *co;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua creating new thread");[m
[31m-[m
[31m-    base = lua_gettop(L);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    co = lua_newthread(L);[m
[31m-[m
[31m-    /*  {{{ inherit coroutine's globals to main thread's globals table[m
[31m-     *  for print() function will try to find tostring() in current[m
[31m-     *  globals table.[m
[31m-     */[m
[31m-    /*  new globals table for coroutine */[m
[31m-    ngx_http_lua_create_new_globals_table(co, 0, 0);[m
[31m-[m
[31m-    lua_createtable(co, 0, 1);[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfield(co, -2, "__index");[m
[31m-    lua_setmetatable(co, -2);[m
[31m-[m
[31m-    ngx_http_lua_set_globals_table(co);[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    *ref = luaL_ref(L, -2);[m
[31m-[m
[31m-    if (*ref == LUA_NOREF) {[m
[31m-        lua_settop(L, base);  /* restore main thread stack */[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    lua_settop(L, base);[m
[31m-    return co;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_del_thread(ngx_http_request_t *r, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    if (coctx->co_ref == LUA_NOREF) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua deleting light thread");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    ngx_http_lua_probe_thread_delete(r, coctx->co, ctx);[m
[31m-[m
[31m-    luaL_unref(L, -1, coctx->co_ref);[m
[31m-    coctx->co_ref = LUA_NOREF;[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_lua_rebase_path(ngx_pool_t *pool, u_char *src, size_t len)[m
[31m-{[m
[31m-    u_char            *p, *dst;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (src[0] == '/') {[m
[31m-        /* being an absolute path already */[m
[31m-        dst = ngx_palloc(pool, len + 1);[m
[31m-        if (dst == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(dst, src, len);[m
[31m-[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    dst = ngx_palloc(pool, ngx_cycle->prefix.len + len + 1);[m
[31m-    if (dst == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(dst, ngx_cycle->prefix.data, ngx_cycle->prefix.len);[m
[31m-    p = ngx_copy(p, src, len);[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_send_header_if_needed(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-[m
[31m-    dd("send header if needed: %d", r->header_sent || ctx->header_sent);[m
[31m-[m
[31m-    if (!r->header_sent && !ctx->header_sent) {[m
[31m-        if (r->headers_out.status == 0) {[m
[31m-            r->headers_out.status = NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!ctx->headers_set && ngx_http_lua_set_content_type(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (!ctx->headers_set) {[m
[31m-            ngx_http_clear_content_length(r);[m
[31m-            ngx_http_clear_accept_ranges(r);[m
[31m-        }[m
[31m-[m
[31m-        if (!ctx->buffering) {[m
[31m-            dd("sending headers");[m
[31m-            rc = ngx_http_send_header(r);[m
[31m-            ctx->header_sent = 1;[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_send_chain_link(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_chain_t                  *cl;[m
[31m-    ngx_chain_t                 **ll;[m
[31m-    ngx_http_lua_loc_conf_t      *llcf;[m
[31m-[m
[31m-#if 1[m
[31m-    if (ctx->acquired_raw_req_socket || ctx->eof) {[m
[31m-        dd("ctx->eof already set or raw req socket already acquired");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if ((r->method & NGX_HTTP_HEAD) && !r->header_only) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->http10_buffering[m
[31m-        && !ctx->buffering[m
[31m-        && !r->header_sent[m
[31m-        && !ctx->header_sent[m
[31m-        && r->http_version < NGX_HTTP_VERSION_11[m
[31m-        && r->headers_out.content_length_n < 0)[m
[31m-    {[m
[31m-        ctx->buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_send_header_if_needed(r, ctx);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        ctx->eof = 1;[m
[31m-[m
[31m-        if (ctx->buffering) {[m
[31m-            return ngx_http_lua_send_http10_headers(r, ctx);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        dd("last buf to be sent");[m
[31m-[m
[31m-#if 1[m
[31m-        if (!r->request_body && r == r->main) {[m
[31m-            if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ctx->buffering) {[m
[31m-            rc = ngx_http_lua_send_http10_headers(r, ctx);[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->out) {[m
[31m-[m
[31m-                rc = ngx_http_lua_output_filter(r, ctx->out);[m
[31m-[m
[31m-                if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                ctx->out = NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version <= 8004[m
[31m-[m
[31m-        /* earlier versions of nginx does not allow subrequests[m
[31m-           to send last_buf themselves */[m
[31m-        if (r != r->main) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ctx->eof = 1;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua sending last buf of the response body");[m
[31m-[m
[31m-        rc = ngx_http_lua_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* in != NULL */[m
[31m-[m
[31m-    if (ctx->buffering) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua buffering output bufs for the HTTP 1.0 request");[m
[31m-[m
[31m-        for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-        *ll = in;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_output_filter(r, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_send_special(ngx_http_request_t *r, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_http_request_t  *ar; /* active request */[m
[31m-[m
[31m-    ar = r->connection->data;[m
[31m-[m
[31m-    if (ar != r) {[m
[31m-[m
[31m-        /* bypass ngx_http_postpone_filter_module */[m
[31m-[m
[31m-        r->connection->data = r;[m
[31m-        rc = ngx_http_send_special(r, flags);[m
[31m-        r->connection->data = ar;[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_send_special(r, flags);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_output_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-    ngx_http_request_t  *ar; /* active request */[m
[31m-[m
[31m-    ar = r->connection->data;[m
[31m-[m
[31m-    if (ar != r) {[m
[31m-[m
[31m-        /* bypass ngx_http_postpone_filter_module */[m
[31m-[m
[31m-        r->connection->data = r;[m
[31m-        rc = ngx_http_output_filter(r, in);[m
[31m-        r->connection->data = ar;[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-#if nginx_version >= 1001004[m
[31m-    ngx_chain_update_chains(r->pool,[m
[31m-#else[m
[31m-    ngx_chain_update_chains([m
[31m-#endif[m
[31m-                            &ctx->free_bufs, &ctx->busy_bufs, &in,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_lua_module);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_send_http10_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    off_t                size;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    ngx_int_t            rc;[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua sending HTTP 1.0 response headers");[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        goto send;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL) {[m
[31m-        for (size = 0, cl = ctx->out; cl; cl = cl->next) {[m
[31m-            size += ngx_buf_size(cl->buf);[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_length_n = size;[m
[31m-[m
[31m-        if (r->headers_out.content_length) {[m
[31m-            r->headers_out.content_length->hash = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-send:[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-    ctx->header_sent = 1;[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_init_registry(lua_State *L, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua initializing lua registry");[m
[31m-[m
[31m-    /* {{{ register a table to anchor lua coroutines reliably:[m
[31m-     * {([int]ref) = [cort]} */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_createtable(L, 0, 32 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* create the registry entry for the Lua request ctx data table */[m
[31m-    lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-    lua_createtable(L, 0, 32 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    /* create the registry entry for the Lua socket connection pool table */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_createtable(L, 0, 8 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* create the registry entry for the Lua precompiled regex object cache */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);[m
[31m-    lua_createtable(L, 0, 16 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-#endif[m
[31m-[m
[31m-    /* {{{ register table to cache user code:[m
[31m-     * { [(string)cache_key] = <code closure> } */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_code_cache_key);[m
[31m-    lua_createtable(L, 0, 8 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_init_globals(lua_State *L, ngx_cycle_t *cycle,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua initializing lua globals");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, cycle);[m
[31m-    lua_setglobal(L, "__ngx_cycle");[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-    ngx_http_lua_inject_ndk_api(L);[m
[31m-#endif /* defined(NDK) && NDK */[m
[31m-[m
[31m-    ngx_http_lua_inject_ngx_api(L, lmcf, log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_inject_ngx_api(lua_State *L, ngx_http_lua_main_conf_t *lmcf,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    lua_createtable(L, 0 /* narr */, 116 /* nrec */);    /* ngx.* */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_get_raw_phase_context);[m
[31m-    lua_setfield(L, -2, "_phase_ctx");[m
[31m-[m
[31m-    ngx_http_lua_inject_arg_api(L);[m
[31m-[m
[31m-    ngx_http_lua_inject_http_consts(L);[m
[31m-    ngx_http_lua_inject_core_consts(L);[m
[31m-[m
[31m-    ngx_http_lua_inject_log_api(L);[m
[31m-    ngx_http_lua_inject_output_api(L);[m
[31m-    ngx_http_lua_inject_time_api(L);[m
[31m-    ngx_http_lua_inject_string_api(L);[m
[31m-    ngx_http_lua_inject_control_api(log, L);[m
[31m-    ngx_http_lua_inject_subrequest_api(L);[m
[31m-    ngx_http_lua_inject_sleep_api(L);[m
[31m-    ngx_http_lua_inject_phase_api(L);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_lua_inject_regex_api(L);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_inject_req_api(log, L);[m
[31m-    ngx_http_lua_inject_resp_header_api(L);[m
[31m-    ngx_http_lua_create_headers_metatable(log, L);[m
[31m-    ngx_http_lua_inject_variable_api(L);[m
[31m-    ngx_http_lua_inject_shdict_api(lmcf, L);[m
[31m-    ngx_http_lua_inject_socket_tcp_api(log, L);[m
[31m-    ngx_http_lua_inject_socket_udp_api(log, L);[m
[31m-    ngx_http_lua_inject_uthread_api(log, L);[m
[31m-    ngx_http_lua_inject_timer_api(L);[m
[31m-    ngx_http_lua_inject_config_api(L);[m
[31m-    ngx_http_lua_inject_worker_api(L);[m
[31m-[m
[31m-    ngx_http_lua_inject_misc_api(L);[m
[31m-[m
[31m-    lua_getglobal(L, "package"); /* ngx package */[m
[31m-    lua_getfield(L, -1, "loaded"); /* ngx package loaded */[m
[31m-    lua_pushvalue(L, -3); /* ngx package loaded ngx */[m
[31m-    lua_setfield(L, -2, "ngx"); /* ngx package loaded */[m
[31m-    lua_pop(L, 2);[m
[31m-[m
[31m-    lua_setglobal(L, "ngx");[m
[31m-[m
[31m-    ngx_http_lua_inject_coroutine_api(log, L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-        cl->buf->file_pos = cl->buf->file_last;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_add_copy_chain(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx,[m
[31m-    ngx_chain_t ***plast, ngx_chain_t *in, ngx_int_t *eof)[m
[31m-{[m
[31m-    ngx_chain_t     *cl;[m
[31m-    size_t           len;[m
[31m-    ngx_buf_t       *b;[m
[31m-[m
[31m-    len = 0;[m
[31m-    *eof = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        if (ngx_buf_in_memory(cl->buf)) {[m
[31m-            len += cl->buf->last - cl->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_in_chain || cl->buf->last_buf) {[m
[31m-            *eof = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, len);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("chains get free buf: %d == %d", (int) (cl->buf->end - cl->buf->start),[m
[31m-       (int) len);[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    while (in) {[m
[31m-        if (ngx_buf_in_memory(in->buf)) {[m
[31m-            b->last = ngx_copy(b->last, in->buf->pos,[m
[31m-                               in->buf->last - in->buf->pos);[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    **plast = cl;[m
[31m-    *plast = &cl->next;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_reset_ctx(ngx_http_request_t *r, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua reset ctx");[m
[31m-[m
[31m-    ngx_http_lua_finalize_threads(r, ctx, L);[m
[31m-[m
[31m-#if 0[m
[31m-    if (ctx->user_co_ctx) {[m
[31m-        /* no way to destroy a list but clean up the whole pool */[m
[31m-        ctx->user_co_ctx = NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memzero(&ctx->entry_co_ctx, sizeof(ngx_http_lua_co_ctx_t));[m
[31m-[m
[31m-    ctx->entry_co_ctx.co_ref = LUA_NOREF;[m
[31m-[m
[31m-    ctx->entered_rewrite_phase = 0;[m
[31m-    ctx->entered_access_phase = 0;[m
[31m-    ctx->entered_content_phase = 0;[m
[31m-[m
[31m-    ctx->exit_code = 0;[m
[31m-    ctx->exited = 0;[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_str_null(&ctx->exec_uri);[m
[31m-    ngx_str_null(&ctx->exec_args);[m
[31m-[m
[31m-    ctx->co_op = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* post read callback for rewrite and access phases */[m
[31m-void[m
[31m-ngx_http_lua_generic_phase_post_read(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua post read for rewrite/access phases");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    ctx->read_body_done = 1;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        ctx->waiting_more_body = 0;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_request_cleanup_handler(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx = data;[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 0 /* forcible */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_request_cleanup(ngx_http_lua_ctx_t *ctx, int forcible)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    /*  force coroutine handling the request quit */[m
[31m-    if (ctx == NULL) {[m
[31m-        dd("ctx is NULL");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua request cleanup: forcible=%d", forcible);[m
[31m-[m
[31m-    if (ctx->cleanup) {[m
[31m-        *ctx->cleanup = NULL;[m
[31m-        ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        /* being a fake request */[m
[31m-        lmcf->running_timers--;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    ngx_http_lua_finalize_threads(r, ctx, L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * description:[m
[31m- *  run a Lua coroutine specified by ctx->cur_co_ctx->co[m
[31m- * return value:[m
[31m- *  NGX_AGAIN:      I/O interruption: r->main->count intact[m
[31m- *  NGX_DONE:       I/O interruption: r->main->count already incremented by 1[m
[31m- *  NGX_ERROR:      error[m
[31m- *  >= 200          HTTP status code[m
[31m- */[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_run_thread(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, volatile int nrets)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t   *next_coctx, *parent_coctx, *orig_coctx;[m
[31m-    int                      rv, success = 1;[m
[31m-    lua_State               *next_co;[m
[31m-    lua_State               *old_co;[m
[31m-    const char              *err, *msg, *trace;[m
[31m-    ngx_int_t                rc;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t              *old_pool = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread, top:%d c:%ud", lua_gettop(L),[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    /* set Lua VM panic handler */[m
[31m-    lua_atpanic(L, ngx_http_lua_atpanic);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    NGX_LUA_EXCEPTION_TRY {[m
[31m-[m
[31m-        if (ctx->cur_co_ctx->thread_spawn_yielded) {[m
[31m-            ngx_http_lua_probe_info("thread spawn yielded");[m
[31m-[m
[31m-            ctx->cur_co_ctx->thread_spawn_yielded = 0;[m
[31m-            nrets = 1;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            dd("calling lua_resume: vm %p, nret %d", ctx->cur_co_ctx->co,[m
[31m-               (int) nrets);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            /* XXX: work-around to nginx regex subsystem */[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-            /*  run code */[m
[31m-            dd("ctx: %p", ctx);[m
[31m-            dd("cur co: %p", ctx->cur_co_ctx->co);[m
[31m-            dd("cur co status: %d", ctx->cur_co_ctx->co_status);[m
[31m-[m
[31m-            orig_coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-            dd("%p: saved co top: %d, nrets: %d, true top: %d",[m
[31m-               orig_coctx->co,[m
[31m-               (int) orig_coctx->co_top, (int) nrets,[m
[31m-               (int) lua_gettop(orig_coctx->co));[m
[31m-#endif[m
[31m-[m
[31m-#if DDEBUG[m
[31m-            if (lua_gettop(orig_coctx->co) > 0) {[m
[31m-                dd("top elem: %s", luaL_typename(orig_coctx->co, -1));[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            ngx_http_lua_assert(orig_coctx->co_top + nrets[m
[31m-                                == lua_gettop(orig_coctx->co));[m
[31m-[m
[31m-            rv = lua_resume(orig_coctx->co, nrets);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            /* XXX: work-around to nginx regex subsystem */[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-#if 0[m
[31m-            /* test the longjmp thing */[m
[31m-            if (rand() % 2 == 0) {[m
[31m-                NGX_LUA_EXCEPTION_THROW(1);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua resume returned %d", rv);[m
[31m-[m
[31m-            switch (rv) {[m
[31m-            case LUA_YIELD:[m
[31m-                /*  yielded, let event handler do the rest job */[m
[31m-                /*  FIXME: add io cmd dispatcher here */[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua thread yielded");[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                dd("%p: saving curr top after yield: %d (co-op: %d)",[m
[31m-                   orig_coctx->co,[m
[31m-                   (int) lua_gettop(orig_coctx->co), (int) ctx->co_op);[m
[31m-                orig_coctx->co_top = lua_gettop(orig_coctx->co);[m
[31m-#endif[m
[31m-[m
[31m-                if (r->uri_changed) {[m
[31m-                    return ngx_http_lua_handle_rewrite_jump(L, r, ctx);[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->exited) {[m
[31m-                    return ngx_http_lua_handle_exit(L, r, ctx);[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->exec_uri.len) {[m
[31m-                    return ngx_http_lua_handle_exec(L, r, ctx);[m
[31m-                }[m
[31m-[m
[31m-                /*[m
[31m-                 * check if coroutine.resume or coroutine.yield called[m
[31m-                 * lua_yield()[m
[31m-                 */[m
[31m-                switch(ctx->co_op) {[m
[31m-                case NGX_HTTP_LUA_USER_CORO_NOP:[m
[31m-                    dd("hit! it is the API yield");[m
[31m-[m
[31m-                    ngx_http_lua_assert(lua_gettop(ctx->cur_co_ctx->co) == 0);[m
[31m-[m
[31m-                    ctx->cur_co_ctx = NULL;[m
[31m-[m
[31m-                    return NGX_AGAIN;[m
[31m-[m
[31m-                case NGX_HTTP_LUA_USER_THREAD_RESUME:[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "lua user thread resume");[m
[31m-[m
[31m-                    ctx->co_op = NGX_HTTP_LUA_USER_CORO_NOP;[m
[31m-                    nrets = lua_gettop(ctx->cur_co_ctx->co) - 1;[m
[31m-                    dd("nrets = %d", nrets);[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                    /* ignore the return value (the thread) already pushed */[m
[31m-                    orig_coctx->co_top--;[m
[31m-#endif[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_HTTP_LUA_USER_CORO_RESUME:[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "lua coroutine: resume");[m
[31m-[m
[31m-                    /*[m
[31m-                     * the target coroutine lies at the base of the[m
[31m-                     * parent's stack[m
[31m-                     */[m
[31m-                    ctx->co_op = NGX_HTTP_LUA_USER_CORO_NOP;[m
[31m-[m
[31m-                    old_co = ctx->cur_co_ctx->parent_co_ctx->co;[m
[31m-[m
[31m-                    nrets = lua_gettop(old_co);[m
[31m-                    if (nrets) {[m
[31m-                        dd("moving %d return values to parent", nrets);[m
[31m-                        lua_xmove(old_co, ctx->cur_co_ctx->co, nrets);[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                        ctx->cur_co_ctx->parent_co_ctx->co_top -= nrets;[m
[31m-#endif[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    /* ctx->co_op == NGX_HTTP_LUA_USER_CORO_YIELD */[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "lua coroutine: yield");[m
[31m-[m
[31m-                    ctx->co_op = NGX_HTTP_LUA_USER_CORO_NOP;[m
[31m-[m
[31m-                    if (ngx_http_lua_is_thread(ctx)) {[m
[31m-                        ngx_http_lua_probe_thread_yield(r, ctx->cur_co_ctx->co);[m
[31m-[m
[31m-                        /* discard any return values from user[m
[31m-                         * coroutine.yield()'s arguments */[m
[31m-                        lua_settop(ctx->cur_co_ctx->co, 0);[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                        ctx->cur_co_ctx->co_top = 0;[m
[31m-#endif[m
[31m-[m
[31m-                        ngx_http_lua_probe_info("set co running");[m
[31m-                        ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-                        if (ctx->posted_threads) {[m
[31m-                            ngx_http_lua_post_thread(r, ctx, ctx->cur_co_ctx);[m
[31m-                            ctx->cur_co_ctx = NULL;[m
[31m-                            return NGX_AGAIN;[m
[31m-                        }[m
[31m-[m
[31m-                        /* no pending threads, so resume the thread[m
[31m-                         * immediately */[m
[31m-[m
[31m-                        nrets = 0;[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    /* being a user coroutine that has a parent */[m
[31m-[m
[31m-                    nrets = lua_gettop(ctx->cur_co_ctx->co);[m
[31m-[m
[31m-                    next_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-                    next_co = next_coctx->co;[m
[31m-[m
[31m-                    /*[m
[31m-                     * prepare return values for coroutine.resume[m
[31m-                     * (true plus any retvals)[m
[31m-                     */[m
[31m-                    lua_pushboolean(next_co, 1);[m
[31m-[m
[31m-                    if (nrets) {[m
[31m-                        dd("moving %d return values to next co", nrets);[m
[31m-                        lua_xmove(ctx->cur_co_ctx->co, next_co, nrets);[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                        ctx->cur_co_ctx->co_top -= nrets;[m
[31m-#endif[m
[31m-                    }[m
[31m-[m
[31m-                    nrets++;  /* add the true boolean value */[m
[31m-[m
[31m-                    ctx->cur_co_ctx = next_coctx;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                /* try resuming on the new coroutine again */[m
[31m-                continue;[m
[31m-[m
[31m-            case 0:[m
[31m-[m
[31m-                ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-                ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-                ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-                if (ctx->cur_co_ctx->zombie_child_threads) {[m
[31m-                    ngx_http_lua_cleanup_zombie_child_uthreads(r, L, ctx,[m
[31m-                                                               ctx->cur_co_ctx);[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua light thread ended normally");[m
[31m-[m
[31m-                if (ngx_http_lua_is_entry_thread(ctx)) {[m
[31m-[m
[31m-                    lua_settop(L, 0);[m
[31m-[m
[31m-                    ngx_http_lua_del_thread(r, L, ctx, ctx->cur_co_ctx);[m
[31m-[m
[31m-                    dd("uthreads: %d", (int) ctx->uthreads);[m
[31m-[m
[31m-                    if (ctx->uthreads) {[m
[31m-[m
[31m-                        ctx->cur_co_ctx = NULL;[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    /* all user threads terminated already */[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->cur_co_ctx->is_uthread) {[m
[31m-                    /* being a user thread */[m
[31m-[m
[31m-                    lua_settop(L, 0);[m
[31m-[m
[31m-                    parent_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-[m
[31m-                    if (ngx_http_lua_coroutine_alive(parent_coctx)) {[m
[31m-                        if (ctx->cur_co_ctx->waited_by_parent) {[m
[31m-                            ngx_http_lua_probe_info("parent already waiting");[m
[31m-                            ctx->cur_co_ctx->waited_by_parent = 0;[m
[31m-                            success = 1;[m
[31m-                            goto user_co_done;[m
[31m-                        }[m
[31m-[m
[31m-                        ngx_http_lua_probe_info("parent still alive");[m
[31m-[m
[31m-                        if (ngx_http_lua_post_zombie_thread(r, parent_coctx,[m
[31m-                                                            ctx->cur_co_ctx)[m
[31m-                            != NGX_OK)[m
[31m-                        {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        lua_pushboolean(ctx->cur_co_ctx->co, 1);[m
[31m-                        lua_insert(ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-                        ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_ZOMBIE;[m
[31m-                        ctx->cur_co_ctx = NULL;[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_http_lua_del_thread(r, L, ctx, ctx->cur_co_ctx);[m
[31m-                    ctx->uthreads--;[m
[31m-[m
[31m-                    if (ctx->uthreads == 0) {[m
[31m-                        if (ngx_http_lua_entry_thread_alive(ctx)) {[m
[31m-                            ctx->cur_co_ctx = NULL;[m
[31m-                            return NGX_AGAIN;[m
[31m-                        }[m
[31m-[m
[31m-                        /* all threads terminated already */[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    /* some other user threads still running */[m
[31m-                    ctx->cur_co_ctx = NULL;[m
[31m-                    return NGX_AGAIN;[m
[31m-                }[m
[31m-[m
[31m-                /* being a user coroutine that has a parent */[m
[31m-[m
[31m-                success = 1;[m
[31m-[m
[31m-user_co_done:[m
[31m-[m
[31m-                nrets = lua_gettop(ctx->cur_co_ctx->co);[m
[31m-[m
[31m-                next_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-[m
[31m-                if (next_coctx == NULL) {[m
[31m-                    /* being a light thread */[m
[31m-                    goto no_parent;[m
[31m-                }[m
[31m-[m
[31m-                next_co = next_coctx->co;[m
[31m-[m
[31m-                /*[m
[31m-                 * ended successful, coroutine.resume returns true plus[m
[31m-                 * any return values[m
[31m-                 */[m
[31m-                lua_pushboolean(next_co, success);[m
[31m-[m
[31m-                if (nrets) {[m
[31m-                    lua_xmove(ctx->cur_co_ctx->co, next_co, nrets);[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->cur_co_ctx->is_uthread) {[m
[31m-                    ngx_http_lua_del_thread(r, L, ctx, ctx->cur_co_ctx);[m
[31m-                    ctx->uthreads--;[m
[31m-                }[m
[31m-[m
[31m-                nrets++;[m
[31m-                ctx->cur_co_ctx = next_coctx;[m
[31m-[m
[31m-                ngx_http_lua_probe_info("set parent running");[m
[31m-[m
[31m-                next_coctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua coroutine: lua user thread ended normally");[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case LUA_ERRRUN:[m
[31m-                err = "runtime error";[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_ERRSYNTAX:[m
[31m-                err = "syntax error";[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_ERRMEM:[m
[31m-                err = "memory allocation error";[m
[31m-                ngx_quit = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_ERRERR:[m
[31m-                err = "error handler error";[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                err = "unknown error";[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->cur_co_ctx != orig_coctx) {[m
[31m-                ctx->cur_co_ctx = orig_coctx;[m
[31m-            }[m
[31m-[m
[31m-            if (lua_isstring(ctx->cur_co_ctx->co, -1)) {[m
[31m-                dd("user custom error msg");[m
[31m-                msg = lua_tostring(ctx->cur_co_ctx->co, -1);[m
[31m-[m
[31m-            } else {[m
[31m-                msg = "unknown reason";[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-            ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 0);[m
[31m-[m
[31m-            ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-            ngx_http_lua_thread_traceback(L, ctx->cur_co_ctx->co,[m
[31m-                                          ctx->cur_co_ctx);[m
[31m-            trace = lua_tostring(L, -1);[m
[31m-[m
[31m-            if (ctx->cur_co_ctx->is_uthread) {[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "lua user thread aborted: %s: %s\n%s",[m
[31m-                              err, msg, trace);[m
[31m-[m
[31m-                lua_settop(L, 0);[m
[31m-[m
[31m-                parent_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-[m
[31m-                if (ngx_http_lua_coroutine_alive(parent_coctx)) {[m
[31m-                    if (ctx->cur_co_ctx->waited_by_parent) {[m
[31m-                        ctx->cur_co_ctx->waited_by_parent = 0;[m
[31m-                        success = 0;[m
[31m-                        goto user_co_done;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_http_lua_post_zombie_thread(r, parent_coctx,[m
[31m-                                                        ctx->cur_co_ctx)[m
[31m-                        != NGX_OK)[m
[31m-                    {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    lua_pushboolean(ctx->cur_co_ctx->co, 0);[m
[31m-                    lua_insert(ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-                    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_ZOMBIE;[m
[31m-                    ctx->cur_co_ctx = NULL;[m
[31m-                    return NGX_AGAIN;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_del_thread(r, L, ctx, ctx->cur_co_ctx);[m
[31m-                ctx->uthreads--;[m
[31m-[m
[31m-                if (ctx->uthreads == 0) {[m
[31m-                    if (ngx_http_lua_entry_thread_alive(ctx)) {[m
[31m-                        ctx->cur_co_ctx = NULL;[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    /* all threads terminated already */[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                /* some other user threads still running */[m
[31m-                ctx->cur_co_ctx = NULL;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_lua_is_entry_thread(ctx)) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "lua entry thread aborted: %s: %s\n%s",[m
[31m-                              err, msg, trace);[m
[31m-[m
[31m-                lua_settop(L, 0);[m
[31m-[m
[31m-                /* being the entry thread aborted */[m
[31m-[m
[31m-                if (r->filter_finalize) {[m
[31m-                    ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-[m
[31m-                dd("headers sent? %d", r->header_sent || ctx->header_sent);[m
[31m-[m
[31m-                if (ctx->no_abort) {[m
[31m-                    ctx->no_abort = 0;[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return (r->header_sent || ctx->header_sent) ? NGX_ERROR :[m
[31m-                       NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* being a user coroutine that has a parent */[m
[31m-[m
[31m-            next_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-            if (next_coctx == NULL) {[m
[31m-                goto no_parent;[m
[31m-            }[m
[31m-[m
[31m-            next_co = next_coctx->co;[m
[31m-[m
[31m-            ngx_http_lua_probe_info("set parent running");[m
[31m-[m
[31m-            next_coctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-            /*[m
[31m-             * ended with error, coroutine.resume returns false plus[m
[31m-             * err msg[m
[31m-             */[m
[31m-            lua_pushboolean(next_co, 0);[m
[31m-            lua_xmove(ctx->cur_co_ctx->co, next_co, 1);[m
[31m-            nrets = 2;[m
[31m-[m
[31m-            ctx->cur_co_ctx = next_coctx;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua coroutine: %s: %s\n%s", err, msg, trace);[m
[31m-[m
[31m-            /* try resuming on the new coroutine again */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    } NGX_LUA_EXCEPTION_CATCH {[m
[31m-        dd("nginx execution restored");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-no_parent:[m
[31m-[m
[31m-    lua_settop(L, 0);[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    if (r->filter_finalize) {[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "lua handler aborted: "[m
[31m-                  "user coroutine has no parent");[m
[31m-[m
[31m-    return (r->header_sent || ctx->header_sent) ?[m
[31m-                NGX_ERROR : NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (ctx->entered_content_phase[m
[31m-        && r->connection->fd != (ngx_socket_t) -1)[m
[31m-    {[m
[31m-        rc = ngx_http_lua_send_chain_link(r, ctx,[m
[31m-                                          NULL /* last_buf */);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_wev_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_event_t                 *wev;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua run write event handler: timedout:%ud, ready:%ud, "[m
[31m-                   "writing_raw_req_socket:%ud",[m
[31m-                   wev->timedout, wev->ready, ctx->writing_raw_req_socket);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);[m
[31m-[m
[31m-    if (wev->timedout && !ctx->writing_raw_req_socket) {[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "client timed out");[m
[31m-            c->timedout = 1;[m
[31m-[m
[31m-            goto flush_coros;[m
[31m-        }[m
[31m-[m
[31m-        wev->timedout = 0;[m
[31m-        wev->delayed = 0;[m
[31m-[m
[31m-        if (!wev->ready) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-                if (ctx->entered_content_phase) {[m
[31m-                    ngx_http_lua_finalize_request(r, NGX_ERROR);[m
[31m-                }[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!wev->ready && !wev->timedout) {[m
[31m-        goto useless;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->writing_raw_req_socket) {[m
[31m-        ctx->writing_raw_req_socket = 0;[m
[31m-[m
[31m-        u = ctx->downstream;[m
[31m-        if (u == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->write_event_handler(r, u);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (c->buffered & NGX_HTTP_LOWLEVEL_BUFFERED) {[m
[31m-        rc = ngx_http_lua_flush_pending_output(r, ctx);[m
[31m-[m
[31m-        dd("flush pending output returned %d, c->error: %d", (int) rc,[m
[31m-           c->error);[m
[31m-[m
[31m-        if (rc != NGX_ERROR && rc != NGX_OK) {[m
[31m-            goto useless;[m
[31m-        }[m
[31m-[m
[31m-        /* when rc == NGX_ERROR, c->error must be set */[m
[31m-    }[m
[31m-[m
[31m-flush_coros:[m
[31m-[m
[31m-    dd("ctx->flushing_coros: %d", (int) ctx->flushing_coros);[m
[31m-[m
[31m-    if (ctx->flushing_coros) {[m
[31m-        return ngx_http_lua_process_flushing_coroutines(r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* ctx->flushing_coros == 0 */[m
[31m-[m
[31m-useless:[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "useless lua write event handler");[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_process_flushing_coroutines(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                    rc, n;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    dd("processing flushing coroutines");[m
[31m-[m
[31m-    coctx = &ctx->entry_co_ctx;[m
[31m-    n = ctx->flushing_coros;[m
[31m-[m
[31m-    if (coctx->flushing) {[m
[31m-        coctx->flushing = 0;[m
[31m-[m
[31m-        ctx->flushing_coros--;[m
[31m-        n--;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        rc = ngx_http_lua_flush_resume_helper(r, ctx);[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_DONE */[m
[31m-    }[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        if (ctx->user_co_ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        part = &ctx->user_co_ctx->part;[m
[31m-        coctx = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                coctx = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (coctx[i].flushing) {[m
[31m-                coctx[i].flushing = 0;[m
[31m-                ctx->flushing_coros--;[m
[31m-                n--;[m
[31m-                ctx->cur_co_ctx = &coctx[i];[m
[31m-[m
[31m-                rc = ngx_http_lua_flush_resume_helper(r, ctx);[m
[31m-                if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                /* rc == NGX_DONE */[m
[31m-[m
[31m-                if (n == 0) {[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_flush_pending_output(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-    ngx_chain_t        *cl;[m
[31m-    ngx_event_t        *wev;[m
[31m-    ngx_connection_t   *c;[m
[31m-[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua flushing output: buffered 0x%uxd",[m
[31m-                   c->buffered);[m
[31m-[m
[31m-    if (ctx->busy_bufs) {[m
[31m-        /* FIXME since cosockets also share this busy_bufs chain, this condition[m
[31m-         * might not be strong enough. better use separate busy_bufs chains. */[m
[31m-        rc = ngx_http_lua_output_filter(r, NULL);[m
[31m-[m
[31m-    } else {[m
[31m-        cl = ngx_http_lua_get_flush_chain(r, ctx);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_lua_output_filter(r, cl);[m
[31m-    }[m
[31m-[m
[31m-    dd("output filter returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (c->buffered & NGX_HTTP_LOWLEVEL_BUFFERED) {[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            if (ctx->entered_content_phase) {[m
[31m-                ngx_http_lua_finalize_request(r, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->flushing_coros) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "lua flush still waiting: buffered 0x%uxd",[m
[31m-                           c->buffered);[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-#if 1[m
[31m-        if (wev->timer_set && !wev->delayed) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_lua_digest_hex(u_char *dest, const u_char *buf, int buf_len)[m
[31m-{[m
[31m-    ngx_md5_t                     md5;[m
[31m-    u_char                        md5_buf[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, buf, buf_len);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    return ngx_hex_dump(dest, md5_buf, sizeof(md5_buf));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_set_multi_value_table(lua_State *L, int index)[m
[31m-{[m
[31m-    if (index < 0) {[m
[31m-        index = lua_gettop(L) + index + 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushvalue(L, -2); /* stack: table key value key */[m
[31m-    lua_rawget(L, index);[m
[31m-    if (lua_isnil(L, -1)) {[m
[31m-        lua_pop(L, 1); /* stack: table key value */[m
[31m-        lua_rawset(L, index); /* stack: table */[m
[31m-[m
[31m-    } else {[m
[31m-        if (!lua_istable(L, -1)) {[m
[31m-            /* just inserted one value */[m
[31m-            lua_createtable(L, 4, 0);[m
[31m-                /* stack: table key value value table */[m
[31m-            lua_insert(L, -2);[m
[31m-                /* stack: table key value table value */[m
[31m-            lua_rawseti(L, -2, 1);[m
[31m-                /* stack: table key value table */[m
[31m-            lua_insert(L, -2);[m
[31m-                /* stack: table key table value */[m
[31m-[m
[31m-            lua_rawseti(L, -2, 2); /* stack: table key table */[m
[31m-[m
[31m-            lua_rawset(L, index); /* stack: table */[m
[31m-[m
[31m-        } else {[m
[31m-            /* stack: table key value table */[m
[31m-            lua_insert(L, -2); /* stack: table key table value */[m
[31m-[m
[31m-            lua_rawseti(L, -2, lua_objlen(L, -2) + 1);[m
[31m-                /* stack: table key table  */[m
[31m-            lua_pop(L, 2); /* stack: table */[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_http_lua_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t      n;[m
[31m-    uint32_t       *escape;[m
[31m-    static u_char   hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-                    /* " ", "#", "%", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   uri[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0xfc00886d, /* 1111 1100 0000 0000  1000 1000 0110 1101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x78000000, /* 0111 1000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0xa8000000, /* 1010 1000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", "%", "+", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   args[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x80000829, /* 1000 0000 0000 0000  0000 1000 0010 1001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   html[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x000000ad, /* 0000 0000 0000 0000  0000 0000 1010 1101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   refresh[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000085, /* 0000 0000 0000 0000  0000 0000 1000 0101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "%", %00-%1F */[m
[31m-[m
[31m-    static uint32_t   memcached[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000021, /* 0000 0000 0000 0000  0000 0000 0010 0001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-    };[m
[31m-[m
[31m-                    /* mail_auth is the same as memcached */[m
[31m-[m
[31m-    static uint32_t  *map[] =[m
[31m-        { uri, args, html, refresh, memcached, memcached };[m
[31m-[m
[31m-[m
[31m-    escape = map[type];[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '%';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* XXX we also decode '+' to ' ' */[m
[31m-void[m
[31m-ngx_http_lua_unescape_uri(u_char **dst, u_char **src, size_t size,[m
[31m-    ngx_uint_t type)[m
[31m-{[m
[31m-    u_char  *d, *s, ch, c, decoded;[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_quoted,[m
[31m-        sw_quoted_second[m
[31m-    } state;[m
[31m-[m
[31m-    d = *dst;[m
[31m-    s = *src;[m
[31m-[m
[31m-    state = 0;[m
[31m-    decoded = 0;[m
[31m-[m
[31m-    while (size--) {[m
[31m-[m
[31m-        ch = *s++;[m
[31m-[m
[31m-        switch (state) {[m
[31m-        case sw_usual:[m
[31m-            if (ch == '?'[m
[31m-                && (type & (NGX_UNESCAPE_URI|NGX_UNESCAPE_REDIRECT)))[m
[31m-            {[m
[31m-                *d++ = ch;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '%') {[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '+') {[m
[31m-                *d++ = ' ';[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted:[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                decoded = (u_char) (ch - '0');[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                decoded = (u_char) (c - 'a' + 10);[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted_second:[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ch = (u_char) ((decoded << 4) + ch - '0');[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ch = (u_char) ((decoded << 4) + c - 'a' + 10);[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_URI) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = ch;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    *dst = d;[m
[31m-    *src = s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    /* ngx.req table */[m
[31m-[m
[31m-    lua_createtable(L, 0 /* narr */, 24 /* nrec */);    /* .req */[m
[31m-[m
[31m-    ngx_http_lua_inject_req_header_api(L);[m
[31m-    ngx_http_lua_inject_req_uri_api(log, L);[m
[31m-    ngx_http_lua_inject_req_args_api(L);[m
[31m-    ngx_http_lua_inject_req_body_api(L);[m
[31m-    ngx_http_lua_inject_req_socket_api(L);[m
[31m-    ngx_http_lua_inject_req_method_api(L);[m
[31m-    ngx_http_lua_inject_req_time_api(L);[m
[31m-    ngx_http_lua_inject_req_misc_api(L);[m
[31m-[m
[31m-    lua_setfield(L, -2, "req");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_handle_exec(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t               rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua thread initiated internal redirect to %V",[m
[31m-                   &ctx->exec_uri);[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-    ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    if (r->filter_finalize) {[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 1 /* forcible */);[m
[31m-[m
[31m-    if (ctx->exec_uri.data[0] == '@') {[m
[31m-        if (ctx->exec_args.len > 0) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                          "query strings %V ignored when exec'ing "[m
[31m-                          "named location %V",[m
[31m-                          &ctx->exec_args, &ctx->exec_uri);[m
[31m-        }[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-#if 1[m
[31m-        if (r->read_event_handler == ngx_http_lua_rd_check_broken_connection) {[m
[31m-            /* resume the read event handler */[m
[31m-[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if 1[m
[31m-        /* clear the modules contexts */[m
[31m-        ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-#endif[m
[31m-[m
[31m-        rc = ngx_http_named_location(r, &ctx->exec_uri);[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-        {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        if (!ctx->entered_content_phase) {[m
[31m-            /* XXX ensure the main request ref count[m
[31m-             * is decreased because the current[m
[31m-             * request will be quit */[m
[31m-            r->main->count--;[m
[31m-            dd("XXX decrement main count: c:%d", (int) r->main->count);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    dd("internal redirect to %.*s", (int) ctx->exec_uri.len,[m
[31m-       ctx->exec_uri.data);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    if (r->read_event_handler == ngx_http_lua_rd_check_broken_connection) {[m
[31m-        /* resume the read event handler */[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_internal_redirect(r, &ctx->exec_uri, &ctx->exec_args);[m
[31m-[m
[31m-    dd("internal redirect returned %d when in content phase? "[m
[31m-       "%d", (int) rc, ctx->entered_content_phase);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (!ctx->entered_content_phase) {[m
[31m-        /* XXX ensure the main request ref count[m
[31m-         * is decreased because the current[m
[31m-         * request will be quit */[m
[31m-        dd("XXX decrement main count");[m
[31m-        r->main->count--;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_handle_exit(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua thread aborting request with status %d",[m
[31m-                   ctx->exit_code);[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-    ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    if (r->filter_finalize) {[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {  /* fake request */[m
[31m-        return ctx->exit_code;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (!r->header_sent[m
[31m-        && !ctx->header_sent[m
[31m-        && r->headers_out.status == 0[m
[31m-        && ctx->exit_code >= NGX_HTTP_OK)[m
[31m-    {[m
[31m-        r->headers_out.status = ctx->exit_code;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->buffering[m
[31m-        && r->headers_out.status[m
[31m-        && ctx->exit_code != NGX_ERROR[m
[31m-        && ctx->exit_code != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && ctx->exit_code != NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        && ctx->exit_code != NGX_HTTP_CLOSE)[m
[31m-    {[m
[31m-        rc = ngx_http_lua_send_chain_link(r, ctx, NULL /* indicate last_buf */);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->exit_code >= NGX_HTTP_OK) {[m
[31m-            return NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        return ctx->exit_code;[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->exit_code == NGX_OK[m
[31m-         && ctx->entered_content_phase)[m
[31m-        || (ctx->exit_code >= NGX_HTTP_OK[m
[31m-            && ctx->exit_code < NGX_HTTP_SPECIAL_RESPONSE[m
[31m-            && ctx->exit_code != NGX_HTTP_NO_CONTENT))[m
[31m-    {[m
[31m-        rc = ngx_http_lua_send_chain_link(r, ctx, NULL /* indicate last_buf */);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if ((r->header_sent || ctx->header_sent)[m
[31m-        && ctx->exit_code > NGX_OK[m
[31m-        && ctx->exit_code != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && ctx->exit_code != NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        && ctx->exit_code != NGX_HTTP_CLOSE)[m
[31m-    {[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ctx->exit_code;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,[m
[31m-    int table, ngx_str_t *args)[m
[31m-{[m
[31m-    u_char              *key;[m
[31m-    size_t               key_len;[m
[31m-    u_char              *value;[m
[31m-    size_t               value_len;[m
[31m-    size_t               len = 0;[m
[31m-    size_t               key_escape = 0;[m
[31m-    uintptr_t            total_escape = 0;[m
[31m-    int                  n;[m
[31m-    int                  i;[m
[31m-    u_char              *p;[m
[31m-[m
[31m-    if (table < 0) {[m
[31m-        table = lua_gettop(L) + table + 1;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-    lua_pushnil(L);[m
[31m-    while (lua_next(L, table) != 0) {[m
[31m-        if (lua_type(L, -2) != LUA_TSTRING) {[m
[31m-            luaL_error(L, "attempt to use a non-string key in the "[m
[31m-                       "\"args\" option table");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        key = (u_char *) lua_tolstring(L, -2, &key_len);[m
[31m-[m
[31m-        key_escape = 2 * ngx_http_lua_escape_uri(NULL, key, key_len,[m
[31m-                                                 NGX_ESCAPE_URI);[m
[31m-        total_escape += key_escape;[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            value = (u_char *) lua_tolstring(L, -1, &value_len);[m
[31m-[m
[31m-            total_escape += 2 * ngx_http_lua_escape_uri(NULL, value, value_len,[m
[31m-                                                        NGX_ESCAPE_URI);[m
[31m-[m
[31m-            len += key_len + value_len + (sizeof("=") - 1);[m
[31m-            n++;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TBOOLEAN:[m
[31m-            if (lua_toboolean(L, -1)) {[m
[31m-                len += key_len;[m
[31m-                n++;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-[m
[31m-            i = 0;[m
[31m-            lua_pushnil(L);[m
[31m-            while (lua_next(L, -2) != 0) {[m
[31m-                if (lua_isboolean(L, -1)) {[m
[31m-                    if (lua_toboolean(L, -1)) {[m
[31m-                        len += key_len;[m
[31m-[m
[31m-                    } else {[m
[31m-                        lua_pop(L, 1);[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    value = (u_char *) lua_tolstring(L, -1, &value_len);[m
[31m-[m
[31m-                    if (value == NULL) {[m
[31m-                        luaL_error(L, "attempt to use %s as query arg value",[m
[31m-                                   luaL_typename(L, -1));[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    total_escape +=[m
[31m-                        2 * ngx_http_lua_escape_uri(NULL, value,[m
[31m-                                                    value_len,[m
[31m-                                                    NGX_ESCAPE_URI);[m
[31m-[m
[31m-                    len += key_len + value_len + (sizeof("=") - 1);[m
[31m-                }[m
[31m-[m
[31m-                if (i++ > 0) {[m
[31m-                    total_escape += key_escape;[m
[31m-                }[m
[31m-[m
[31m-                n++;[m
[31m-                lua_pop(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            luaL_error(L, "attempt to use %s as query arg value",[m
[31m-                       luaL_typename(L, -1));[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    len += (size_t) total_escape;[m
[31m-[m
[31m-    if (n > 1) {[m
[31m-        len += (n - 1) * (sizeof("&") - 1);[m
[31m-    }[m
[31m-[m
[31m-    dd("len 1: %d", (int) len);[m
[31m-[m
[31m-    if (r) {[m
[31m-        p = ngx_palloc(r->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            luaL_error(L, "no memory");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p = lua_newuserdata(L, len);[m
[31m-    }[m
[31m-[m
[31m-    args->data = p;[m
[31m-    args->len = len;[m
[31m-[m
[31m-    i = 0;[m
[31m-    lua_pushnil(L);[m
[31m-    while (lua_next(L, table) != 0) {[m
[31m-        key = (u_char *) lua_tolstring(L, -2, &key_len);[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-[m
[31m-            if (total_escape) {[m
[31m-                p = (u_char *) ngx_http_lua_escape_uri(p, key, key_len,[m
[31m-                                                       NGX_ESCAPE_URI);[m
[31m-[m
[31m-            } else {[m
[31m-                dd("shortcut: no escape required");[m
[31m-[m
[31m-                p = ngx_copy(p, key, key_len);[m
[31m-            }[m
[31m-[m
[31m-            *p++ = '=';[m
[31m-[m
[31m-            value = (u_char *) lua_tolstring(L, -1, &value_len);[m
[31m-[m
[31m-            if (total_escape) {[m
[31m-                p = (u_char *) ngx_http_lua_escape_uri(p, value, value_len,[m
[31m-                                                       NGX_ESCAPE_URI);[m
[31m-[m
[31m-            } else {[m
[31m-                p = ngx_copy(p, value, value_len);[m
[31m-            }[m
[31m-[m
[31m-            if (i != n - 1) {[m
[31m-                /* not the last pair */[m
[31m-                *p++ = '&';[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TBOOLEAN:[m
[31m-            if (lua_toboolean(L, -1)) {[m
[31m-                if (total_escape) {[m
[31m-                    p = (u_char *) ngx_http_lua_escape_uri(p, key, key_len,[m
[31m-                                                           NGX_ESCAPE_URI);[m
[31m-[m
[31m-                } else {[m
[31m-                    dd("shortcut: no escape required");[m
[31m-[m
[31m-                    p = ngx_copy(p, key, key_len);[m
[31m-                }[m
[31m-[m
[31m-                if (i != n - 1) {[m
[31m-                    /* not the last pair */[m
[31m-                    *p++ = '&';[m
[31m-                }[m
[31m-[m
[31m-                i++;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            while (lua_next(L, -2) != 0) {[m
[31m-[m
[31m-                if (lua_isboolean(L, -1)) {[m
[31m-                    if (lua_toboolean(L, -1)) {[m
[31m-                        if (total_escape) {[m
[31m-                            p = (u_char *) ngx_http_lua_escape_uri(p, key,[m
[31m-    key_len,[m
[31m-    NGX_ESCAPE_URI);[m
[31m-[m
[31m-                        } else {[m
[31m-                            dd("shortcut: no escape required");[m
[31m-[m
[31m-                            p = ngx_copy(p, key, key_len);[m
[31m-                        }[m
[31m-[m
[31m-                    } else {[m
[31m-                        lua_pop(L, 1);[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    if (total_escape) {[m
[31m-                        p = (u_char *)[m
[31m-                                ngx_http_lua_escape_uri(p, key,[m
[31m-                                                        key_len,[m
[31m-                                                        NGX_ESCAPE_URI);[m
[31m-[m
[31m-                    } else {[m
[31m-                        dd("shortcut: no escape required");[m
[31m-[m
[31m-                        p = ngx_copy(p, key, key_len);[m
[31m-                    }[m
[31m-[m
[31m-                    *p++ = '=';[m
[31m-[m
[31m-                    value = (u_char *) lua_tolstring(L, -1, &value_len);[m
[31m-[m
[31m-                    if (total_escape) {[m
[31m-                        p = (u_char *)[m
[31m-                                ngx_http_lua_escape_uri(p, value,[m
[31m-                                                        value_len,[m
[31m-                                                        NGX_ESCAPE_URI);[m
[31m-[m
[31m-                    } else {[m
[31m-                        p = ngx_copy(p, value, value_len);[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (i != n - 1) {[m
[31m-                    /* not the last pair */[m
[31m-                    *p++ = '&';[m
[31m-                }[m
[31m-[m
[31m-                i++;[m
[31m-                lua_pop(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            luaL_error(L, "should not reach here");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    if (p - args->data != (ssize_t) len) {[m
[31m-        luaL_error(L, "buffer error: %d != %d",[m
[31m-                   (int) (p - args->data), (int) len);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_handle_rewrite_jump(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua thread aborting request with URI rewrite jump: "[m
[31m-                   "\"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-    ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    if (r->filter_finalize) {[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 1 /* forcible */);[m
[31m-    ngx_http_lua_init_ctx(r, ctx);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* XXX ngx_open_and_stat_file is static in the core. sigh. */[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_open_and_stat_file(u_char *name, ngx_open_file_info_t *of,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t         fd;[m
[31m-    ngx_file_info_t  fi;[m
[31m-[m
[31m-    if (of->fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        if (ngx_file_info(name, &fi) == NGX_FILE_ERROR) {[m
[31m-            of->failed = ngx_file_info_n;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (of->uniq == ngx_file_uniq(&fi)) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-    } else if (of->test_dir) {[m
[31m-[m
[31m-        if (ngx_file_info(name, &fi) == NGX_FILE_ERROR) {[m
[31m-            of->failed = ngx_file_info_n;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_is_dir(&fi)) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!of->log) {[m
[31m-[m
[31m-        /*[m
[31m-         * Use non-blocking open() not to hang on FIFO files, etc.[m
[31m-         * This flag has no effect on a regular files.[m
[31m-         */[m
[31m-[m
[31m-        fd = ngx_open_file(name, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,[m
[31m-                           NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    } else {[m
[31m-        fd = ngx_open_file(name, NGX_FILE_APPEND, NGX_FILE_CREATE_OR_OPEN,[m
[31m-                           NGX_FILE_DEFAULT_ACCESS);[m
[31m-    }[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        of->failed = ngx_open_file_n;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,[m
[31m-                      ngx_fd_info_n " \"%s\" failed", name);[m
[31m-[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-    } else {[m
[31m-        of->fd = fd;[m
[31m-[m
[31m-        if (of->directio <= ngx_file_size(&fi)) {[m
[31m-            if (ngx_directio_on(fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                              ngx_directio_on_n " \"%s\" failed", name);[m
[31m-[m
[31m-            } else {[m
[31m-                of->is_directio = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    of->uniq = ngx_file_uniq(&fi);[m
[31m-    of->mtime = ngx_file_mtime(&fi);[m
[31m-    of->size = ngx_file_size(&fi);[m
[31m-#if defined(nginx_version) && nginx_version >= 1000001[m
[31m-    of->fs_size = ngx_file_fs_size(&fi);[m
[31m-#endif[m
[31m-    of->is_dir = ngx_is_dir(&fi);[m
[31m-    of->is_file = ngx_is_file(&fi);[m
[31m-    of->is_link = ngx_is_link(&fi);[m
[31m-    of->is_exec = ngx_is_exec(&fi);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    of->fd = NGX_INVALID_FILE;[m
[31m-    of->err = ngx_errno;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_http_lua_chain_get_free_buf(ngx_log_t *log, ngx_pool_t *p,[m
[31m-    ngx_chain_t **free, size_t len)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-    u_char       *start, *end;[m
[31m-[m
[31m-    const ngx_buf_tag_t  tag = (ngx_buf_tag_t) &ngx_http_lua_module;[m
[31m-[m
[31m-    if (*free) {[m
[31m-        cl = *free;[m
[31m-        *free = cl->next;[m
[31m-        cl->next = NULL;[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-        start = b->start;[m
[31m-        end = b->end;[m
[31m-        if (start && (size_t) (end - start) >= len) {[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                           "lua reuse free buf memory %O >= %uz, cl:%p, p:%p",[m
[31m-                           (off_t) (end - start), len, cl, start);[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->start = start;[m
[31m-            b->pos = start;[m
[31m-            b->last = start;[m
[31m-            b->end = end;[m
[31m-            b->tag = tag;[m
[31m-[m
[31m-            if (len) {[m
[31m-                b->temporary = 1;[m
[31m-            }[m
[31m-[m
[31m-            return cl;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "lua reuse free buf chain, but reallocate memory "[m
[31m-                       "because %uz >= %O, cl:%p, p:%p", len,[m
[31m-                       (off_t) (b->end - b->start), cl, b->start);[m
[31m-[m
[31m-        if (ngx_buf_in_memory(b) && b->start) {[m
[31m-            ngx_pfree(p, b->start);[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        if (len == 0) {[m
[31m-            return cl;[m
[31m-        }[m
[31m-[m
[31m-        b->start = ngx_palloc(p, len);[m
[31m-        if (b->start == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        b->end = b->start + len;[m
[31m-[m
[31m-        dd("buf start: %p", cl->buf->start);[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-        b->tag = tag;[m
[31m-        b->temporary = 1;[m
[31m-[m
[31m-        return cl;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(p);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua allocate new chainlink and new buf of size %uz, cl:%p",[m
[31m-                   len, cl);[m
[31m-[m
[31m-    cl->buf = len ? ngx_create_temp_buf(p, len) : ngx_calloc_buf(p);[m
[31m-    if (cl->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("buf start: %p", cl->buf->start);[m
[31m-[m
[31m-    cl->buf->tag = tag;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_thread_traceback(lua_State *L, lua_State *co,[m
[31m-    ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    int         base;[m
[31m-    int         level, coid;[m
[31m-    lua_Debug   ar;[m
[31m-[m
[31m-    base = lua_gettop(L);[m
[31m-    lua_checkstack(L, 3);[m
[31m-    lua_pushliteral(L, "stack traceback:");[m
[31m-    coid = 0;[m
[31m-[m
[31m-    while (co) {[m
[31m-[m
[31m-        if (coid >= NGX_HTTP_LUA_BT_MAX_COROS) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        lua_checkstack(L, 2);[m
[31m-        lua_pushfstring(L, "\ncoroutine %d:", coid++);[m
[31m-[m
[31m-        level = 0;[m
[31m-[m
[31m-        while (lua_getstack(co, level++, &ar)) {[m
[31m-[m
[31m-            lua_checkstack(L, 5);[m
[31m-[m
[31m-            if (level > NGX_HTTP_LUA_BT_DEPTH) {[m
[31m-                lua_pushliteral(L, "\n\t...");[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            lua_pushliteral(L, "\n\t");[m
[31m-            lua_getinfo(co, "Snl", &ar);[m
[31m-            lua_pushfstring(L, "%s:", ar.short_src);[m
[31m-[m
[31m-            if (ar.currentline > 0) {[m
[31m-                lua_pushfstring(L, "%d:", ar.currentline);[m
[31m-            }[m
[31m-[m
[31m-            if (*ar.namewhat != '\0') {  /* is there a name? */[m
[31m-                lua_pushfstring(L, " in function " LUA_QS, ar.name);[m
[31m-[m
[31m-            } else {[m
[31m-                if (*ar.what == 'm') {  /* main? */[m
[31m-                    lua_pushliteral(L, " in main chunk");[m
[31m-[m
[31m-                } else if (*ar.what == 'C' || *ar.what == 't') {[m
[31m-                    lua_pushliteral(L, " ?");  /* C function or tail call */[m
[31m-[m
[31m-                } else {[m
[31m-                    lua_pushfstring(L, " in function <%s:%d>",[m
[31m-                                    ar.short_src, ar.linedefined);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (lua_gettop(L) - base >= 15) {[m
[31m-            lua_concat(L, lua_gettop(L) - base);[m
[31m-        }[m
[31m-[m
[31m-        /* check if the coroutine has a parent coroutine*/[m
[31m-        coctx = coctx->parent_co_ctx;[m
[31m-        if (!coctx || coctx->co_status == NGX_HTTP_LUA_CO_DEAD) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        co = coctx->co;[m
[31m-    }[m
[31m-[m
[31m-    lua_concat(L, lua_gettop(L) - base);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_traceback(lua_State *L)[m
[31m-{[m
[31m-    if (!lua_isstring(L, 1)) { /* 'message' not a string? */[m
[31m-        return 1;  /* keep it intact */[m
[31m-    }[m
[31m-[m
[31m-    lua_getglobal(L, "debug");[m
[31m-    if (!lua_istable(L, -1)) {[m
[31m-        lua_pop(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_getfield(L, -1, "traceback");[m
[31m-    if (!lua_isfunction(L, -1)) {[m
[31m-        lua_pop(L, 2);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushvalue(L, 1);  /* pass error message */[m
[31m-    lua_pushinteger(L, 2);  /* skip this function and traceback */[m
[31m-    lua_call(L, 2, 1);  /* call debug.traceback */[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_inject_arg_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushliteral(L, "arg");[m
[31m-    lua_newtable(L);    /*  .arg table aka {} */[m
[31m-[m
[31m-    lua_createtable(L, 0 /* narr */, 2 /* nrec */);    /*  the metatable */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_param_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_param_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-[m
[31m-    lua_setmetatable(L, -2);    /*  tie the metatable to param table */[m
[31m-[m
[31m-    dd("top: %d, type -1: %s", lua_gettop(L), luaL_typename(L, -1));[m
[31m-[m
[31m-    lua_rawset(L, -3);    /*  set ngx.arg table */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_param_get(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "ctx not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_SET[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_BODY_FILTER);[m
[31m-[m
[31m-    if (ctx->context & (NGX_HTTP_LUA_CONTEXT_SET)) {[m
[31m-        return ngx_http_lua_setby_param_get(L);[m
[31m-    }[m
[31m-[m
[31m-    /* ctx->context & (NGX_HTTP_LUA_CONTEXT_BODY_FILTER) */[m
[31m-[m
[31m-    return ngx_http_lua_body_filter_param_get(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_param_set(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "ctx not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_BODY_FILTER);[m
[31m-[m
[31m-    return ngx_http_lua_body_filter_param_set(L, r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_lua_co_ctx_t *[m
[31m-ngx_http_lua_get_co_ctx(lua_State *L, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    if (L == ctx->entry_co_ctx.co) {[m
[31m-        return &ctx->entry_co_ctx;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->user_co_ctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    part = &ctx->user_co_ctx->part;[m
[31m-    coctx = part->elts;[m
[31m-[m
[31m-    /* FIXME: we should use rbtree here to prevent O(n) lookup overhead */[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            coctx = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (coctx[i].co == L) {[m
[31m-            return &coctx[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_lua_co_ctx_t *[m
[31m-ngx_http_lua_create_co_ctx(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    if (ctx->user_co_ctx == NULL) {[m
[31m-        ctx->user_co_ctx = ngx_list_create(r->pool, 4,[m
[31m-                                           sizeof(ngx_http_lua_co_ctx_t));[m
[31m-        if (ctx->user_co_ctx == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    coctx = ngx_list_push(ctx->user_co_ctx);[m
[31m-    if (coctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(coctx, sizeof(ngx_http_lua_co_ctx_t));[m
[31m-[m
[31m-    coctx->co_ref = LUA_NOREF;[m
[31m-[m
[31m-    return coctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this is for callers other than the content handler */[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_run_posted_threads(ngx_connection_t *c, lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_lua_posted_thread_t    *pt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (c->destroyed) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        pt = ctx->posted_threads;[m
[31m-        if (pt == NULL) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        ctx->posted_threads = pt->next;[m
[31m-[m
[31m-        ngx_http_lua_probe_run_posted_thread(r, pt->co_ctx->co,[m
[31m-                                             (int) pt->co_ctx->co_status);[m
[31m-[m
[31m-        if (pt->co_ctx->co_status != NGX_HTTP_LUA_CO_RUNNING) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ctx->cur_co_ctx = pt->co_ctx;[m
[31m-[m
[31m-        rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_ERROR || rc >= NGX_OK */[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            ngx_http_lua_finalize_request(r, rc);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_post_thread(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx,[m
[31m-    ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    ngx_http_lua_posted_thread_t  **p;[m
[31m-    ngx_http_lua_posted_thread_t   *pt;[m
[31m-[m
[31m-    pt = ngx_palloc(r->pool, sizeof(ngx_http_lua_posted_thread_t));[m
[31m-    if (pt == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pt->co_ctx = coctx;[m
[31m-    pt->next = NULL;[m
[31m-[m
[31m-    for (p = &ctx->posted_threads; *p; p = &(*p)->next) { /* void */ }[m
[31m-[m
[31m-    *p = pt;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_finalize_threads(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, lua_State *L)[m
[31m-{[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    int                              top;[m
[31m-#endif[m
[31m-    int                              inited = 0, ref;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_http_lua_co_ctx_t           *cc, *coctx;[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    top = lua_gettop(L);[m
[31m-#endif[m
[31m-[m
[31m-#if 1[m
[31m-    coctx = ctx->on_abort_co_ctx;[m
[31m-    if (coctx && coctx->co_ref != LUA_NOREF) {[m
[31m-        if (coctx->co_status != NGX_HTTP_LUA_CO_SUSPENDED) {[m
[31m-            /* the on_abort thread contributes to the coctx->uthreads[m
[31m-             * counter only when it actually starts running */[m
[31m-            ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-            ctx->uthreads--;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_probe_thread_delete(r, coctx->co, ctx);[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        inited = 1;[m
[31m-[m
[31m-        luaL_unref(L, -1, coctx->co_ref);[m
[31m-        coctx->co_ref = LUA_NOREF;[m
[31m-[m
[31m-        coctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-        ctx->on_abort_co_ctx = NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->user_co_ctx) {[m
[31m-        part = &ctx->user_co_ctx->part;[m
[31m-        cc = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                cc = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            coctx = &cc[i];[m
[31m-[m
[31m-            ref = coctx->co_ref;[m
[31m-[m
[31m-            if (ref != LUA_NOREF) {[m
[31m-                ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-[m
[31m-                ngx_http_lua_probe_thread_delete(r, coctx->co, ctx);[m
[31m-[m
[31m-                if (!inited) {[m
[31m-                    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-                    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-                    inited = 1;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_assert(lua_gettop(L) - top == 1);[m
[31m-[m
[31m-                luaL_unref(L, -1, ref);[m
[31m-                coctx->co_ref = LUA_NOREF;[m
[31m-[m
[31m-                coctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-                ctx->uthreads--;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ctx->user_co_ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_assert(ctx->uthreads == 0);[m
[31m-[m
[31m-    coctx = &ctx->entry_co_ctx;[m
[31m-[m
[31m-    ref = coctx->co_ref;[m
[31m-    if (ref != LUA_NOREF) {[m
[31m-        ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-[m
[31m-        ngx_http_lua_probe_thread_delete(r, coctx->co, ctx);[m
[31m-[m
[31m-        if (!inited) {[m
[31m-            lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-            lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-            inited = 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_assert(lua_gettop(L) - top == 1);[m
[31m-[m
[31m-        luaL_unref(L, -1, coctx->co_ref);[m
[31m-        coctx->co_ref = LUA_NOREF;[m
[31m-        coctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-    }[m
[31m-[m
[31m-    if (inited) {[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_post_zombie_thread(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_co_ctx_t *parent, ngx_http_lua_co_ctx_t *thread)[m
[31m-{[m
[31m-    ngx_http_lua_posted_thread_t  **p;[m
[31m-    ngx_http_lua_posted_thread_t   *pt;[m
[31m-[m
[31m-    pt = ngx_palloc(r->pool, sizeof(ngx_http_lua_posted_thread_t));[m
[31m-    if (pt == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pt->co_ctx = thread;[m
[31m-    pt->next = NULL;[m
[31m-[m
[31m-    for (p = &parent->zombie_child_threads; *p; p = &(*p)->next) { /* void */ }[m
[31m-[m
[31m-    *p = pt;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_cleanup_zombie_child_uthreads(ngx_http_request_t *r,[m
[31m-    lua_State *L, ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    ngx_http_lua_posted_thread_t   *pt;[m
[31m-[m
[31m-    for (pt = coctx->zombie_child_threads; pt; pt = pt->next) {[m
[31m-        if (pt->co_ctx->co_ref != LUA_NOREF) {[m
[31m-            ngx_http_lua_del_thread(r, L, ctx, pt->co_ctx);[m
[31m-            ctx->uthreads--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    coctx->zombie_child_threads = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_check_broken_connection(ngx_http_request_t *r, ngx_event_t *ev)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    char                 buf[1];[m
[31m-    ngx_err_t            err;[m
[31m-    ngx_int_t            event;[m
[31m-    ngx_connection_t     *c;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "http lua check client, write event:%d, \"%V\"",[m
[31m-                   ev->write, &r->uri);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-            event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-            if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_CLIENT_CLOSED_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!ev->pending_eof) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-[m
[31m-        if (ev->kq_errno) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                      "kevent() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        return NGX_HTTP_CLIENT_CLOSED_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,[m
[31m-                   "http lua recv(): %d", n);[m
[31m-[m
[31m-    if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-        dd("event is active");[m
[31m-[m
[31m-        event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dd("HERE %d", (int) n);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            dd("HERE");[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ev->error = 1;[m
[31m-[m
[31m-    } else { /* n == 0 */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev->eof = 1;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    return NGX_HTTP_CLIENT_CLOSED_REQUEST;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_rd_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_event_t                *rev;[m
[31m-    ngx_http_lua_ctx_t         *ctx;[m
[31m-[m
[31m-    if (r->done) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_check_broken_connection(r, r->connection->read);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc > NGX_OK */[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->on_abort_co_ctx == NULL) {[m
[31m-        r->connection->error = 1;[m
[31m-        ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->on_abort_co_ctx->co_status != NGX_HTTP_LUA_CO_SUSPENDED) {[m
[31m-[m
[31m-        /* on_abort already run for the current request handler */[m
[31m-[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && rev->active) {[m
[31m-            if (ngx_del_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-                ngx_http_lua_finalize_request(r,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->uthreads++;[m
[31m-    ctx->resume_handler = ngx_http_lua_on_abort_resume;[m
[31m-    ctx->on_abort_co_ctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-    ctx->cur_co_ctx = ctx->on_abort_co_ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua waking up the on_abort callback thread");[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_on_abort_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua resuming the on_abort callback thread");[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_probe_info("tcp resume");[m
[31m-#endif[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_test_expect(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_str_t  *expect;[m
[31m-[m
[31m-    if (r->expect_tested[m
[31m-        || r->headers_in.expect == NULL[m
[31m-        || r->http_version < NGX_HTTP_VERSION_11)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->expect_tested = 1;[m
[31m-[m
[31m-    expect = &r->headers_in.expect->value;[m
[31m-[m
[31m-    if (expect->len != sizeof("100-continue") - 1[m
[31m-        || ngx_strncasecmp(expect->data, (u_char *) "100-continue",[m
[31m-                           sizeof("100-continue") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "send 100 Continue");[m
[31m-[m
[31m-    n = r->connection->send(r->connection,[m
[31m-                            (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF,[m
[31m-                            sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1);[m
[31m-[m
[31m-    if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* we assume that such small packet should be send successfully */[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx && ctx->cur_co_ctx) {[m
[31m-        ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->fd != (ngx_socket_t) -1) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_finalize_fake_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_finalize_fake_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_ssl_conn_t            *ssl_conn;[m
[31m-[m
[31m-    ngx_http_lua_ssl_cert_ctx_t     *cctx;[m
[31m-#endif[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lua finalize fake request: %d, a:%d, c:%d",[m
[31m-                   rc, r == c->data, r->main->count);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_close_fake_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        if (r->connection->ssl) {[m
[31m-            ssl_conn = r->connection->ssl->connection;[m
[31m-            if (ssl_conn) {[m
[31m-                c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-                if (c && c->ssl) {[m
[31m-                    cctx = ngx_http_lua_ssl_get_ctx(c->ssl->connection);[m
[31m-                    if (cctx != NULL) {[m
[31m-                        cctx->exit_code = 0;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_http_lua_close_fake_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        c->write->delayed = 0;[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_close_fake_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_close_fake_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r = r->main;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lua fake request count:%d", r->count);[m
[31m-[m
[31m-    if (r->count == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http lua fake request "[m
[31m-                      "count is zero");[m
[31m-    }[m
[31m-[m
[31m-    r->count--;[m
[31m-[m
[31m-    if (r->count) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_free_fake_request(r);[m
[31m-    ngx_http_lua_close_fake_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_free_fake_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_http_cleanup_t        *cln;[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http lua close fake "[m
[31m-                   "request");[m
[31m-[m
[31m-    if (r->pool == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "http lua fake request "[m
[31m-                      "already closed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln = r->cleanup;[m
[31m-    r->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    r->request_line.len = 0;[m
[31m-[m
[31m-    r->connection->destroyed = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_close_fake_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t          *pool;[m
[31m-    ngx_connection_t    *saved_c = NULL;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lua close fake http connection %p", c);[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    c->read->closed = 1;[m
[31m-    c->write->closed = 1;[m
[31m-[m
[31m-    /* we temporarily use a valid fd (0) to make ngx_free_connection happy */[m
[31m-[m
[31m-    c->fd = 0;[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        saved_c = ngx_cycle->files[0];[m
[31m-    }[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        ngx_cycle->files[0] = saved_c;[m
[31m-    }[m
[31m-[m
[31m-    if (pool) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-lua_State *[m
[31m-ngx_http_lua_init_vm(lua_State *parent_vm, ngx_cycle_t *cycle,[m
[31m-    ngx_pool_t *pool, ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log,[m
[31m-    ngx_pool_cleanup_t **pcln)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_pool_cleanup_t              *cln;[m
[31m-    ngx_http_lua_preload_hook_t     *hook;[m
[31m-    ngx_http_lua_vm_state_t         *state;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* create new Lua VM instance */[m
[31m-    L = ngx_http_lua_new_state(parent_vm, cycle, lmcf, log);[m
[31m-    if (L == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "lua initialize the "[m
[31m-                   "global Lua VM %p", L);[m
[31m-[m
[31m-    /* register cleanup handler for Lua VM */[m
[31m-    cln->handler = ngx_http_lua_cleanup_vm;[m
[31m-[m
[31m-    state = ngx_alloc(sizeof(ngx_http_lua_vm_state_t), log);[m
[31m-    if (state == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-    state->vm = L;[m
[31m-    state->count = 1;[m
[31m-[m
[31m-    cln->data = state;[m
[31m-[m
[31m-    if (pcln) {[m
[31m-        *pcln = cln;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->preload_hooks) {[m
[31m-[m
[31m-        /* register the 3rd-party module's preload hooks */[m
[31m-[m
[31m-        lua_getglobal(L, "package");[m
[31m-        lua_getfield(L, -1, "preload");[m
[31m-[m
[31m-        hook = lmcf->preload_hooks->elts;[m
[31m-[m
[31m-        for (i = 0; i < lmcf->preload_hooks->nelts; i++) {[m
[31m-[m
[31m-            ngx_http_lua_probe_register_preload_package(L, hook[i].package);[m
[31m-[m
[31m-            lua_pushcfunction(L, hook[i].loader);[m
[31m-            lua_setfield(L, -2, (char *) hook[i].package);[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    return L;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_cleanup_vm(void *data)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_http_lua_vm_state_t         *state = data;[m
[31m-[m
[31m-#if (DDEBUG)[m
[31m-    if (state) {[m
[31m-        dd("cleanup VM: c:%d, s:%p", (int) state->count, state->vm);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (state) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "lua decrementing the reference count for Lua VM: %i",[m
[31m-                       state->count);[m
[31m-[m
[31m-        if (--state->count == 0) {[m
[31m-            L = state->vm;[m
[31m-            ngx_http_lua_cleanup_conn_pools(L);[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                           "lua close the global Lua VM %p", L);[m
[31m-            lua_close(L);[m
[31m-            ngx_free(state);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_connection_t *[m
[31m-ngx_http_lua_create_fake_connection(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_log_t               *log;[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_connection_t        *saved_c = NULL;[m
[31m-[m
[31m-    /* (we temporarily use a valid fd (0) to make ngx_get_connection happy) */[m
[31m-    if (ngx_cycle->files) {[m
[31m-        saved_c = ngx_cycle->files[0];[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(0, ngx_cycle->log);[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        ngx_cycle->files[0] = saved_c;[m
[31m-    }[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (pool) {[m
[31m-        c->pool = pool;[m
[31m-[m
[31m-    } else {[m
[31m-        c->pool = ngx_create_pool(128, c->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    log = ngx_pcalloc(c->pool, sizeof(ngx_log_t));[m
[31m-    if (log == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c->log = log;[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->action = NULL;[m
[31m-    c->log->data = NULL;[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-#if 0[m
[31m-    c->buffer = ngx_create_temp_buf(c->pool, 2);[m
[31m-    if (c->buffer == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c->buffer->start[0] = CR;[m
[31m-    c->buffer->start[1] = LF;[m
[31m-#endif[m
[31m-[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    dd("created fake connection: %p", c);[m
[31m-[m
[31m-    return c;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_http_lua_close_fake_connection(c);[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *[m
[31m-ngx_http_lua_create_fake_request(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-[m
[31m-    r = ngx_pcalloc(c->pool, sizeof(ngx_http_request_t));[m
[31m-    if (r == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    c->requests++;[m
[31m-[m
[31m-    r->pool = c->pool;[m
[31m-[m
[31m-    dd("r pool allocated: %d", (int) (sizeof(ngx_http_lua_ctx_t)[m
[31m-       + sizeof(void *) * ngx_http_max_module + sizeof(ngx_http_cleanup_t)));[m
[31m-[m
[31m-#if 0[m
[31m-    hc = ngx_pcalloc(c->pool, sizeof(ngx_http_connection_t));[m
[31m-    if (hc == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    r->header_in = c->buffer;[m
[31m-    r->header_end = c->buffer->start;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_out.headers, r->pool, 0,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 0,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (r->ctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    r->variables = ngx_pcalloc(r->pool, cmcf->variables.nelts[m
[31m-                               * sizeof(ngx_http_variable_value_t));[m
[31m-    if (r->variables == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->connection = c;[m
[31m-[m
[31m-    r->headers_in.content_length_n = 0;[m
[31m-    c->data = r;[m
[31m-#if 0[m
[31m-    hc->request = r;[m
[31m-    r->http_connection = hc;[m
[31m-#endif[m
[31m-    r->signature = NGX_HTTP_MODULE;[m
[31m-    r->main = r;[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    r->method = NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    r->headers_in.keep_alive_n = -1;[m
[31m-    r->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    r->subrequests = NGX_HTTP_MAX_SUBREQUESTS + 1;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;[m
[31m-    r->discard_body = 1;[m
[31m-[m
[31m-    dd("created fake request %p", r);[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_report(ngx_log_t *log, lua_State *L, int status,[m
[31m-    const char *prefix)[m
[31m-{[m
[31m-    const char      *msg;[m
[31m-[m
[31m-    if (status && !lua_isnil(L, -1)) {[m
[31m-        msg = lua_tostring(L, -1);[m
[31m-        if (msg == NULL) {[m
[31m-            msg = "unknown error";[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0, "%s error: %s", prefix, msg);[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    /* force a full garbage-collection cycle */[m
[31m-    lua_gc(L, LUA_GCCOLLECT, 0);[m
[31m-[m
[31m-    return status == 0 ? NGX_OK : NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_do_call(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    int                 status, base;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t         *old_pool;[m
[31m-#endif[m
[31m-[m
[31m-    base = lua_gettop(L);  /* function index */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_traceback);  /* push traceback function */[m
[31m-    lua_insert(L, base);  /* put it under chunk and args */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(ngx_cycle->pool);[m
[31m-#endif[m
[31m-[m
[31m-    status = lua_pcall(L, 0, 0, base);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-    lua_remove(L, base);[m
[31m-[m
[31m-    return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_get_raw_phase_context(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    r = lua_touserdata(L, 1);[m
[31m-    if (r == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, (int) ctx->context);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_cleanup_t *[m
[31m-ngx_http_lua_cleanup_add(ngx_http_request_t *r, size_t size)[m
[31m-{[m
[31m-    ngx_http_cleanup_t  *cln;[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-        r = r->main;[m
[31m-[m
[31m-        if (ctx != NULL && ctx->free_cleanup) {[m
[31m-            cln = ctx->free_cleanup;[m
[31m-            ctx->free_cleanup = cln->next;[m
[31m-[m
[31m-            dd("reuse cleanup: %p", cln);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua http cleanup reuse: %p", cln);[m
[31m-[m
[31m-            cln->handler = NULL;[m
[31m-            cln->next = r->cleanup;[m
[31m-[m
[31m-            r->cleanup = cln;[m
[31m-[m
[31m-            return cln;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_cleanup_add(r, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_cleanup_free(ngx_http_request_t *r, ngx_http_cleanup_pt *cleanup)[m
[31m-{[m
[31m-    ngx_http_cleanup_t  **last;[m
[31m-    ngx_http_cleanup_t   *cln;[m
[31m-    ngx_http_lua_ctx_t   *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r = r->main;[m
[31m-[m
[31m-    cln = (ngx_http_cleanup_t *)[m
[31m-              ((u_char *) cleanup - offsetof(ngx_http_cleanup_t, handler));[m
[31m-[m
[31m-    dd("cln: %p, cln->handler: %p, &cln->handler: %p",[m
[31m-       cln, cln->handler, &cln->handler);[m
[31m-[m
[31m-    last = &r->cleanup;[m
[31m-[m
[31m-    while (*last) {[m
[31m-        if (*last == cln) {[m
[31m-            *last = cln->next;[m
[31m-[m
[31m-            cln->next = ctx->free_cleanup;[m
[31m-            ctx->free_cleanup = cln;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua http cleanup free: %p", cln);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        last = &(*last)->next;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_util.h[m
[1mdeleted file mode 100644[m
[1mindex f0e8923..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,441 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_UTIL_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_UTIL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_UNESCAPE_URI_COMPONENT[m
[31m-#define NGX_UNESCAPE_URI_COMPONENT  0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-typedef struct {[m
[31m-    int          len;[m
[31m-    /* this padding hole on 64-bit systems is expected */[m
[31m-    u_char      *data;[m
[31m-} ngx_http_lua_ffi_str_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_ffi_str_t   key;[m
[31m-    ngx_http_lua_ffi_str_t   value;[m
[31m-} ngx_http_lua_ffi_table_elt_t;[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* char whose address we use as the key in Lua vm registry for[m
[31m- * user code cache table */[m
[31m-extern char ngx_http_lua_code_cache_key;[m
[31m-[m
[31m-[m
[31m-/* key in Lua vm registry for all the "ngx.ctx" tables */[m
[31m-#define ngx_http_lua_ctx_tables_key  "ngx_lua_ctx_tables"[m
[31m-[m
[31m-[m
[31m-/* char whose address we use as the key in Lua vm registry for[m
[31m- * regex cache table  */[m
[31m-extern char ngx_http_lua_regex_cache_key;[m
[31m-[m
[31m-/* char whose address we use as the key in Lua vm registry for[m
[31m- * socket connection pool table */[m
[31m-extern char ngx_http_lua_socket_pool_key;[m
[31m-[m
[31m-/* char whose address we use as the key for the coroutine parent relationship */[m
[31m-extern char ngx_http_lua_coroutine_parents_key;[m
[31m-[m
[31m-/* coroutine anchoring table key in Lua VM registry */[m
[31m-extern char ngx_http_lua_coroutines_key;[m
[31m-[m
[31m-/* key to the metatable for ngx.req.get_headers() and ngx.resp.get_headers() */[m
[31m-extern char ngx_http_lua_headers_metatable_key;[m
[31m-[m
[31m-[m
[31m-#ifndef ngx_str_set[m
[31m-#define ngx_str_set(str, text)                                               \[m
[31m-    (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_SWITCHING_PROTOCOLS[m
[31m-#define NGX_HTTP_SWITCHING_PROTOCOLS 101[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version < 1000000[m
[31m-#define ngx_memmove(dst, src, n)   (void) memmove(dst, src, n)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_context_name(c)                                         \[m
[31m-    ((c) == NGX_HTTP_LUA_CONTEXT_SET ? "set_by_lua*"                         \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_REWRITE ? "rewrite_by_lua*"               \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_ACCESS ? "access_by_lua*"                 \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_CONTENT ? "content_by_lua*"               \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_LOG ? "log_by_lua*"                       \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_HEADER_FILTER ? "header_filter_by_lua*"   \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_BODY_FILTER ? "body_filter_by_lua*"       \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_TIMER ? "ngx.timer"                       \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_INIT_WORKER ? "init_worker_by_lua*"       \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_BALANCER ? "balancer_by_lua*"             \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_SSL_CERT ? "ssl_certificate_by_lua*"      \[m
[31m-     : "(unknown)")[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_check_context(L, ctx, flags)                            \[m
[31m-    if (!((ctx)->context & (flags))) {                                       \[m
[31m-        return luaL_error(L, "API disabled in the context of %s",            \[m
[31m-                          ngx_http_lua_context_name((ctx)->context));        \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_lua_ffi_check_context(ngx_http_lua_ctx_t *ctx, unsigned flags,[m
[31m-    u_char *err, size_t *errlen)[m
[31m-{[m
[31m-    if (!(ctx->context & flags)) {[m
[31m-        *errlen = ngx_snprintf(err, *errlen,[m
[31m-                               "API disabled in the context of %s",[m
[31m-                               ngx_http_lua_context_name((ctx)->context))[m
[31m-                  - err;[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_check_fake_request(L, r)                                \[m
[31m-    if ((r)->connection->fd == (ngx_socket_t) -1) {                          \[m
[31m-        return luaL_error(L, "API disabled in the current context");         \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_check_fake_request2(L, r, ctx)                          \[m
[31m-    if ((r)->connection->fd == (ngx_socket_t) -1) {                          \[m
[31m-        return luaL_error(L, "API disabled in the context of %s",            \[m
[31m-                          ngx_http_lua_context_name((ctx)->context));        \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_ssl_get_ctx(ssl_conn)                                   \[m
[31m-    SSL_get_ex_data(ssl_conn, ngx_http_lua_ssl_ctx_index)[m
[31m-[m
[31m-[m
[31m-lua_State *ngx_http_lua_init_vm(lua_State *parent_vm, ngx_cycle_t *cycle,[m
[31m-    ngx_pool_t *pool, ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log,[m
[31m-    ngx_pool_cleanup_t **pcln);[m
[31m-[m
[31m-lua_State *ngx_http_lua_new_thread(ngx_http_request_t *r, lua_State *l,[m
[31m-    int *ref);[m
[31m-[m
[31m-u_char *ngx_http_lua_rebase_path(ngx_pool_t *pool, u_char *src, size_t len);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_send_header_if_needed(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_send_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_chain_t *cl);[m
[31m-[m
[31m-void ngx_http_lua_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_add_copy_chain(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_chain_t ***plast, ngx_chain_t *in,[m
[31m-    ngx_int_t *eof);[m
[31m-[m
[31m-void ngx_http_lua_reset_ctx(ngx_http_request_t *r, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-void ngx_http_lua_generic_phase_post_read(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_lua_request_cleanup(ngx_http_lua_ctx_t *ctx, int foricible);[m
[31m-[m
[31m-void ngx_http_lua_request_cleanup_handler(void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_run_thread(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, volatile int nret);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_wev_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-u_char *ngx_http_lua_digest_hex(u_char *dest, const u_char *buf,[m
[31m-    int buf_len);[m
[31m-[m
[31m-void ngx_http_lua_set_multi_value_table(lua_State *L, int index);[m
[31m-[m
[31m-void ngx_http_lua_unescape_uri(u_char **dst, u_char **src, size_t size,[m
[31m-    ngx_uint_t type);[m
[31m-[m
[31m-uintptr_t ngx_http_lua_escape_uri(u_char *dst, u_char *src,[m
[31m-    size_t size, ngx_uint_t type);[m
[31m-[m
[31m-void ngx_http_lua_inject_req_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-void ngx_http_lua_process_args_option(ngx_http_request_t *r,[m
[31m-    lua_State *L, int table, ngx_str_t *args);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_open_and_stat_file(u_char *name,[m
[31m-    ngx_open_file_info_t *of, ngx_log_t *log);[m
[31m-[m
[31m-ngx_chain_t *ngx_http_lua_chain_get_free_buf(ngx_log_t *log, ngx_pool_t *p,[m
[31m-    ngx_chain_t **free, size_t len);[m
[31m-[m
[31m-void ngx_http_lua_create_new_globals_table(lua_State *L, int narr, int nrec);[m
[31m-[m
[31m-int ngx_http_lua_traceback(lua_State *L);[m
[31m-[m
[31m-ngx_http_lua_co_ctx_t *ngx_http_lua_get_co_ctx(lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-ngx_http_lua_co_ctx_t *ngx_http_lua_create_co_ctx(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_run_posted_threads(ngx_connection_t *c, lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_post_thread(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx);[m
[31m-[m
[31m-void ngx_http_lua_del_thread(ngx_http_request_t *r, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx);[m
[31m-[m
[31m-void ngx_http_lua_rd_check_broken_connection(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_test_expect(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev);[m
[31m-[m
[31m-void ngx_http_lua_finalize_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-[m
[31m-void ngx_http_lua_finalize_fake_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-void ngx_http_lua_close_fake_connection(ngx_connection_t *c);[m
[31m-[m
[31m-void ngx_http_lua_free_fake_request(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_lua_release_ngx_ctx_table(ngx_log_t *log, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-void ngx_http_lua_cleanup_vm(void *data);[m
[31m-[m
[31m-ngx_connection_t *ngx_http_lua_create_fake_connection(ngx_pool_t *pool);[m
[31m-[m
[31m-ngx_http_request_t *ngx_http_lua_create_fake_request(ngx_connection_t *c);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_report(ngx_log_t *log, lua_State *L, int status,[m
[31m-    const char *prefix);[m
[31m-[m
[31m-int ngx_http_lua_do_call(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-ngx_http_cleanup_t *ngx_http_lua_cleanup_add(ngx_http_request_t *r,[m
[31m-    size_t size);[m
[31m-[m
[31m-void ngx_http_lua_cleanup_free(ngx_http_request_t *r,[m
[31m-    ngx_http_cleanup_pt *cleanup);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_check_if_abortable(L, ctx)                             \[m
[31m-    if ((ctx)->no_abort) {                                                  \[m
[31m-        return luaL_error(L, "attempt to abort with pending subrequests");  \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_init_ctx(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_memzero(ctx, sizeof(ngx_http_lua_ctx_t));[m
[31m-    ctx->ctx_ref = LUA_NOREF;[m
[31m-    ctx->entry_co_ctx.co_ref = LUA_NOREF;[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-    ctx->request = r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_http_lua_ctx_t *[m
[31m-ngx_http_lua_create_ctx(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_pool_cleanup_t          *cln;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    ctx = ngx_palloc(r->pool, sizeof(ngx_http_lua_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_init_ctx(r, ctx);[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (!llcf->enable_code_cache && r->connection->fd != (ngx_socket_t) -1) {[m
[31m-        lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        dd("lmcf: %p", lmcf);[m
[31m-[m
[31m-        L = ngx_http_lua_init_vm(lmcf->lua, lmcf->cycle, r->pool, lmcf,[m
[31m-                                 r->connection->log, &cln);[m
[31m-        if (L == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "failed to initialize Lua VM");[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (lmcf->init_handler) {[m
[31m-            if (lmcf->init_handler(r->connection->log, lmcf, L) != NGX_OK) {[m
[31m-                /* an error happened */[m
[31m-                return NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ctx->vm_state = cln->data;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->vm_state = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline lua_State *[m
[31m-ngx_http_lua_get_lua_vm(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx && ctx->vm_state) {[m
[31m-        return ctx->vm_state->vm;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-    dd("lmcf->lua: %p", lmcf->lua);[m
[31m-    return lmcf->lua;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_req_key  "__ngx_req"[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_http_request_t *[m
[31m-ngx_http_lua_get_req(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t    *r;[m
[31m-[m
[31m-    lua_getglobal(L, ngx_http_lua_req_key);[m
[31m-    r = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_set_req(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_pushlightuserdata(L, r);[m
[31m-    lua_setglobal(L, ngx_http_lua_req_key);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_get_globals_table(lua_State *L)[m
[31m-{[m
[31m-    lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_set_globals_table(lua_State *L)[m
[31m-{[m
[31m-    lua_replace(L, LUA_GLOBALSINDEX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_hash_literal(s)                                        \[m
[31m-    ngx_http_lua_hash_str((u_char *) s, sizeof(s) - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_uint_t[m
[31m-ngx_http_lua_hash_str(u_char *src, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    while (n--) {[m
[31m-        key = ngx_hash(key, *src);[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_lua_set_content_type(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (llcf->use_default_type[m
[31m-        && r->headers_out.status != NGX_HTTP_NOT_MODIFIED)[m
[31m-    {[m
[31m-        return ngx_http_set_content_type(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_cleanup_pending_operation(ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    if (coctx->cleanup) {[m
[31m-        coctx->cleanup(coctx);[m
[31m-        coctx->cleanup = NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_chain_t *[m
[31m-ngx_http_lua_get_flush_chain(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, 0);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t  ngx_http_lua_location_hash;[m
[31m-extern ngx_uint_t  ngx_http_lua_content_length_hash;[m
[31m-extern int         ngx_http_lua_ssl_ctx_index;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_UTIL_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_variable.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_variable.c[m
[1mdeleted file mode 100644[m
[1mindex b26c862..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_variable.c[m
[1m+++ /dev/null[m
[36m@@ -1,500 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_var_get(lua_State *L);[m
[31m-static int ngx_http_lua_var_set(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_variable_api(lua_State *L)[m
[31m-{[m
[31m-    /* {{{ register reference maps */[m
[31m-    lua_newtable(L);    /* ngx.var */[m
[31m-[m
[31m-    lua_createtable(L, 0, 2 /* nrec */); /* metatable for .var */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_var_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_pushcfunction(L, ngx_http_lua_var_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    lua_setfield(L, -2, "var");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Get nginx internal variables content[m
[31m- *[m
[31m- * @retval Always return a string or nil on Lua stack. Return nil when failed[m
[31m- * to get content, and actual content string when found the specified variable.[m
[31m- * @seealso ngx_http_lua_var_set[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_var_get(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p, *lowcase;[m
[31m-    size_t                       len;[m
[31m-    ngx_uint_t                   hash;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    u_char                      *val;[m
[31m-    ngx_uint_t                   n;[m
[31m-    LUA_NUMBER                   index;[m
[31m-    int                         *cap;[m
[31m-#endif[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (lua_type(L, -1) == LUA_TNUMBER) {[m
[31m-        /* it is a regex capturing variable */[m
[31m-[m
[31m-        index = lua_tonumber(L, -1);[m
[31m-[m
[31m-        if (index <= 0) {[m
[31m-            lua_pushnil(L);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        n = (ngx_uint_t) index * 2;[m
[31m-[m
[31m-        dd("n = %d, ncaptures = %d", (int) n, (int) r->ncaptures);[m
[31m-[m
[31m-        if (r->captures == NULL[m
[31m-            || r->captures_data == NULL[m
[31m-            || n >= r->ncaptures)[m
[31m-        {[m
[31m-            lua_pushnil(L);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        /* n >= 0 && n < r->ncaptures */[m
[31m-[m
[31m-        cap = r->captures;[m
[31m-[m
[31m-        p = r->captures_data;[m
[31m-[m
[31m-        val = &p[cap[n]];[m
[31m-[m
[31m-        lua_pushlstring(L, (const char *) val, (size_t) (cap[n + 1] - cap[n]));[m
[31m-[m
[31m-        return 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (lua_type(L, -1) != LUA_TSTRING) {[m
[31m-        return luaL_error(L, "bad variable name");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-    lowcase = lua_newuserdata(L, len);[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase, p, len);[m
[31m-[m
[31m-    name.len = len;[m
[31m-    name.data = lowcase;[m
[31m-[m
[31m-    vv = ngx_http_get_variable(r, &name, hash);[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (const char *) vv->data, (size_t) vv->len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Set nginx internal variable content[m
[31m- *[m
[31m- * @retval Always return a boolean on Lua stack. Return true when variable[m
[31m- * content was modified successfully, false otherwise.[m
[31m- * @seealso ngx_http_lua_var_get[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_var_set(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_variable_t         *v;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-    u_char                      *p, *lowcase, *val;[m
[31m-    size_t                       len;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_uint_t                   hash;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          value_type;[m
[31m-    const char                  *msg;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    /* we skip the first argument that is the table */[m
[31m-[m
[31m-    /* we read the variable name */[m
[31m-[m
[31m-    if (lua_type(L, 2) != LUA_TSTRING) {[m
[31m-        return luaL_error(L, "bad variable name");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) lua_tolstring(L, 2, &len);[m
[31m-[m
[31m-    lowcase = lua_newuserdata(L, len + 1);[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase, p, len);[m
[31m-    lowcase[len] = '\0';[m
[31m-[m
[31m-    name.len = len;[m
[31m-    name.data = lowcase;[m
[31m-[m
[31m-    /* we read the variable new value */[m
[31m-[m
[31m-    value_type = lua_type(L, 3);[m
[31m-    switch (value_type) {[m
[31m-    case LUA_TNUMBER:[m
[31m-    case LUA_TSTRING:[m
[31m-        p = (u_char *) luaL_checklstring(L, 3, &len);[m
[31m-[m
[31m-        val = ngx_palloc(r->pool, len);[m
[31m-        if (val == NULL) {[m
[31m-            return luaL_error(L, "memory allocation error");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(val, p, len);[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNIL:[m
[31m-        /* undef the variable */[m
[31m-[m
[31m-        val = NULL;[m
[31m-        len = 0;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        msg = lua_pushfstring(L, "string, number, or nil expected, "[m
[31m-                              "but got %s", lua_typename(L, value_type));[m
[31m-        return luaL_argerror(L, 1, msg);[m
[31m-    }[m
[31m-[m
[31m-    /* we fetch the variable itself */[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v = ngx_hash_find(&cmcf->variables_hash, hash, name.data, name.len);[m
[31m-[m
[31m-    if (v) {[m
[31m-        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {[m
[31m-            return luaL_error(L, "variable \"%s\" not changeable", lowcase);[m
[31m-        }[m
[31m-[m
[31m-        if (v->set_handler) {[m
[31m-[m
[31m-            dd("set variables with set_handler");[m
[31m-[m
[31m-            vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));[m
[31m-            if (vv == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-[m
[31m-            if (value_type == LUA_TNIL) {[m
[31m-                vv->valid = 0;[m
[31m-                vv->not_found = 1;[m
[31m-                vv->no_cacheable = 0;[m
[31m-                vv->data = NULL;[m
[31m-                vv->len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = val;[m
[31m-                vv->len = len;[m
[31m-            }[m
[31m-[m
[31m-            v->set_handler(r, vv, v->data);[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (v->flags & NGX_HTTP_VAR_INDEXED) {[m
[31m-            vv = &r->variables[v->index];[m
[31m-[m
[31m-            dd("set indexed variable");[m
[31m-[m
[31m-            if (value_type == LUA_TNIL) {[m
[31m-                vv->valid = 0;[m
[31m-                vv->not_found = 1;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = NULL;[m
[31m-                vv->len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = val;[m
[31m-                vv->len = len;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        return luaL_error(L, "variable \"%s\" cannot be assigned a value",[m
[31m-                          lowcase);[m
[31m-    }[m
[31m-[m
[31m-    /* variable not found */[m
[31m-[m
[31m-    return luaL_error(L, "variable \"%s\" not found for writing; "[m
[31m-                      "maybe it is a built-in variable that is not changeable "[m
[31m-                      "or you forgot to use \"set $%s '';\" "[m
[31m-                      "in the config file to define it first",[m
[31m-                      lowcase, lowcase);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_var_get(ngx_http_request_t *r, u_char *name_data,[m
[31m-    size_t name_len, u_char *lowcase_buf, int capture_id, u_char **value,[m
[31m-    size_t *value_len, char **err)[m
[31m-{[m
[31m-    ngx_uint_t                   hash;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    u_char                      *p;[m
[31m-    ngx_uint_t                   n;[m
[31m-    int                         *cap;[m
[31m-#endif[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        *err = "no request object found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((r)->connection->fd == (ngx_socket_t) -1) {[m
[31m-        *err = "API disabled in the current context";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (name_data == 0) {[m
[31m-        if (capture_id <= 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        /* it is a regex capturing variable */[m
[31m-[m
[31m-        n = (ngx_uint_t) capture_id * 2;[m
[31m-[m
[31m-        dd("n = %d, ncaptures = %d", (int) n, (int) r->ncaptures);[m
[31m-[m
[31m-        if (r->captures == NULL[m
[31m-            || r->captures_data == NULL[m
[31m-            || n >= r->ncaptures)[m
[31m-        {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        /* n >= 0 && n < r->ncaptures */[m
[31m-[m
[31m-        cap = r->captures;[m
[31m-        p = r->captures_data;[m
[31m-[m
[31m-        *value = &p[cap[n]];[m
[31m-        *value_len = (size_t) (cap[n + 1] - cap[n]);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase_buf, name_data, name_len);[m
[31m-[m
[31m-    name.data = lowcase_buf;[m
[31m-    name.len = name_len;[m
[31m-[m
[31m-    dd("variable name: %.*s", (int) name_len, lowcase_buf);[m
[31m-[m
[31m-    vv = ngx_http_get_variable(r, &name, hash);[m
[31m-    if (vv == NULL || vv->not_found) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    *value = vv->data;[m
[31m-    *value_len = vv->len;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_var_set(ngx_http_request_t *r, u_char *name_data,[m
[31m-    size_t name_len, u_char *lowcase_buf, u_char *value, size_t value_len,[m
[31m-    u_char *errbuf, size_t errlen)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_uint_t                   hash;[m
[31m-    ngx_http_variable_t         *v;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        ngx_snprintf(errbuf, errlen, "no request object found");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((r)->connection->fd == (ngx_socket_t) -1) {[m
[31m-        ngx_snprintf(errbuf, errlen, "API disabled in the current context");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase_buf, name_data, name_len);[m
[31m-[m
[31m-    dd("variable name: %.*s", (int) name_len, lowcase_buf);[m
[31m-[m
[31m-    /* we fetch the variable itself */[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v = ngx_hash_find(&cmcf->variables_hash, hash, lowcase_buf, name_len);[m
[31m-[m
[31m-    if (v) {[m
[31m-        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {[m
[31m-            dd("variable not changeable");[m
[31m-            ngx_snprintf(errbuf, errlen, "variable \"%*s\" not changeable",[m
[31m-                         name_len, lowcase_buf);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (v->set_handler) {[m
[31m-[m
[31m-            dd("set variables with set_handler");[m
[31m-[m
[31m-            if (value != NULL && value_len) {[m
[31m-                vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t)[m
[31m-                                + value_len);[m
[31m-                if (vv == NULL) {[m
[31m-                    goto nomem;[m
[31m-                }[m
[31m-[m
[31m-                p = (u_char *) vv + sizeof(ngx_http_variable_value_t);[m
[31m-                ngx_memcpy(p, value, value_len);[m
[31m-                value = p;[m
[31m-[m
[31m-            } else {[m
[31m-                vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));[m
[31m-                if (vv == NULL) {[m
[31m-                    goto nomem;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (value == NULL) {[m
[31m-                vv->valid = 0;[m
[31m-                vv->not_found = 1;[m
[31m-                vv->no_cacheable = 0;[m
[31m-                vv->data = NULL;[m
[31m-                vv->len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = value;[m
[31m-                vv->len = value_len;[m
[31m-            }[m
[31m-[m
[31m-            v->set_handler(r, vv, v->data);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (v->flags & NGX_HTTP_VAR_INDEXED) {[m
[31m-            vv = &r->variables[v->index];[m
[31m-[m
[31m-            dd("set indexed variable");[m
[31m-[m
[31m-            if (value == NULL) {[m
[31m-                vv->valid = 0;[m
[31m-                vv->not_found = 1;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = NULL;[m
[31m-                vv->len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                p = ngx_palloc(r->pool, value_len);[m
[31m-                if (p == NULL) {[m
[31m-                    goto nomem;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(p, value, value_len);[m
[31m-                value = p;[m
[31m-[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = value;[m
[31m-                vv->len = value_len;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_snprintf(errbuf, errlen, "variable \"%*s\" cannot be assigned "[m
[31m-                     "a value", name_len, lowcase_buf);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* variable not found */[m
[31m-[m
[31m-    ngx_snprintf(errbuf, errlen, "variable \"%*s\" not found for writing; "[m
[31m-                 "maybe it is a built-in variable that is not changeable "[m
[31m-                 "or you forgot to use \"set $%*s '';\" "[m
[31m-                 "in the config file to define it first",[m
[31m-                 name_len, lowcase_buf, name_len, lowcase_buf);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    ngx_snprintf(errbuf, errlen, "no memory");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_variable.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_variable.h[m
[1mdeleted file mode 100644[m
[1mindex 550e4d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_variable.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_VARIABLE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_VARIABLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_variable_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_VARIABLE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_worker.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_worker.c[m
[1mdeleted file mode 100644[m
[1mindex ff09b5b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_worker.c[m
[1m+++ /dev/null[m
[36m@@ -1,133 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_worker.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_worker_exiting(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_worker_pid(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_worker_id(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_worker_count(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_worker_api(lua_State *L)[m
[31m-{[m
[31m-    lua_createtable(L, 0 /* narr */, 4 /* nrec */);    /* ngx.worker. */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_worker_exiting);[m
[31m-    lua_setfield(L, -2, "exiting");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_worker_pid);[m
[31m-    lua_setfield(L, -2, "pid");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_worker_id);[m
[31m-    lua_setfield(L, -2, "id");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_worker_count);[m
[31m-    lua_setfield(L, -2, "count");[m
[31m-[m
[31m-    lua_setfield(L, -2, "worker");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_worker_exiting(lua_State *L)[m
[31m-{[m
[31m-    lua_pushboolean(L, ngx_exiting);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_worker_pid(lua_State *L)[m
[31m-{[m
[31m-    lua_pushinteger(L, (lua_Integer) ngx_pid);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_worker_id(lua_State *L)[m
[31m-{[m
[31m-#if (nginx_version >= 1009001)[m
[31m-    if (ngx_process != NGX_PROCESS_WORKER[m
[31m-        && ngx_process != NGX_PROCESS_SINGLE)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, (lua_Integer) ngx_worker);[m
[31m-#else[m
[31m-    lua_pushnil(L);[m
[31m-#endif[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_worker_count(lua_State *L)[m
[31m-{[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    lua_pushinteger(L, (lua_Integer) ccf->worker_processes);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_worker_pid(void)[m
[31m-{[m
[31m-    return (int) ngx_pid;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_worker_id(void)[m
[31m-{[m
[31m-#if (nginx_version >= 1009001)[m
[31m-    if (ngx_process != NGX_PROCESS_WORKER[m
[31m-        && ngx_process != NGX_PROCESS_SINGLE)[m
[31m-    {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return (int) ngx_worker;[m
[31m-#else[m
[31m-    return -1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_worker_exiting(void)[m
[31m-{[m
[31m-    return (int) ngx_exiting;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_worker_count(void)[m
[31m-{[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    return (int) ccf->worker_processes;[m
[31m-}[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_worker.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_worker.h[m
[1mdeleted file mode 100644[m
[1mindex 3080394..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/src/ngx_http_lua_worker.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_WORKER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_WORKER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_worker_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_WORKER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 3170741..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,2 +0,0 @@[m
[31m-servroot[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/000--init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/000--init.t[m
[1mdeleted file mode 100644[m
[1mindex 364334f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/000--init.t[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: conv_uid - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS conv_uid";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: conv_uid - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE conv_uid(id serial primary key, new_uid integer, old_uid integer)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: conv_uid - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO conv_uid(old_uid,new_uid) VALUES(32,56),(35,78)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush data from memcached[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- error_code: 200[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-"[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/000-sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/000-sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 3f66752..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/000-sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity (integer)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo "helloworld";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-helloworld[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/001-set.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/001-set.t[m
[1mdeleted file mode 100644[m
[1mindex 2295a2d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/001-set.t[m
[1m+++ /dev/null[m
[36m@@ -1,798 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 4);[m
[31m-[m
[31m-#log_level("warn");[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple set (integer)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "return 1+1";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple set (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "return 'hello' .. 'world'";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-helloworld[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: internal only[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "function fib(n) if n > 2 then return fib(n-1)+fib(n-2) else return 1 end end return fib(10)";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-55[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: inlined script with arguments[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "return ngx.arg[1] + ngx.arg[2]" $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: fib by arg[m
[31m---- config[m
[31m-    location /fib {[m
[31m-        set_by_lua $res "function fib(n) if n > 2 then return fib(n-1)+fib(n-2) else return 1 end end return fib(tonumber(ngx.arg[1]))" $arg_n;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /fib?n=10[m
[31m---- response_body[m
[31m-55[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: adder[m
[31m---- config[m
[31m-    location = /adder {[m
[31m-        set_by_lua $res[m
[31m-            "local a = tonumber(ngx.arg[1])[m
[31m-             local b = tonumber(ngx.arg[2])[m
[31m-             return a + b" $arg_a $arg_b;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /adder?a=25&b=75[m
[31m---- response_body[m
[31m-100[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read nginx variables directly from within Lua[m
[31m---- config[m
[31m-    location = /set-both {[m
[31m-        set $b 32;[m
[31m-        set_by_lua $a "return tonumber(ngx.var.b) + 1";[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m---- request[m
[31m-GET /set-both[m
[31m---- response_body[m
[31m-a = 33[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set nginx variables directly from within Lua[m
[31m---- config[m
[31m-    location = /set-both {[m
[31m-        set $b "";[m
[31m-        set_by_lua $a "ngx.var.b = 32; return 7";[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-        echo "b = $b";[m
[31m-    }[m
[31m---- request[m
[31m-GET /set-both[m
[31m---- response_body[m
[31m-a = 7[m
[31m-b = 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set non-existent nginx variables[m
[31m---- config[m
[31m-    location = /set-both {[m
[31m-        #set $b "";[m
[31m-        set_by_lua $a "ngx.var.b = 32; return 7";[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m---- request[m
[31m-GET /set-both[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-variable "b" not found for writing; maybe it is a built-in variable that is not changeable or you forgot to use "set $b '';" in the config file to define it first[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set quote sql str[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        set $a "";[m
[31m-        set_by_lua $a "return ngx.quote_sql_str(ngx.var.a)";[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-''[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set md5[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        set_by_lua $a 'return ngx.md5("hello")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: no ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.print(32) return 1";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.say(32) return 1";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: no ngx.flush[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.flush()";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: no ngx.eof[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.eof()";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: no ngx.send_headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.send_headers()";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: no ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.location.capture("/sub")';[m
[31m-        echo $res;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: no ngx.location.capture_multi[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.location.capture_multi{{"/sub"}}';[m
[31m-        echo $res;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: no ngx.exit[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.exit(0)';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: no ngx.redirect[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.redirect("/blah")';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: no ngx.exec[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.exec("/blah")';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: no ngx.req.set_uri(uri, true)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.req.set_uri("/blah", true)';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.req.set_uri(uri) exists[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.req.set_uri("/blah") return 1';[m
[31m-        echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/blah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: no ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.req.read_body()';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: no ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'return ngx.req.socket()';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: no ngx.socket.tcp()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'return ngx.socket.tcp()';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: no ngx.socket.connect()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'return ngx.socket.connect("127.0.0.1", 80)';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: set $limit_rate (variables with set_handler)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $limit_rate 1000;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.limit_rate = 180;[m
[31m-        ';[m
[31m-        echo "limit rate = $limit_rate";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-limit rate = 180[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: set $args and read $query_string[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.args = "world";[m
[31m-        ';[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: set $arg_xxx[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.arg_foo = "world";[m
[31m-        ';[m
[31m-        echo $arg_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua?foo=3[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-variable "arg_foo" not found for writing; maybe it is a built-in variable that is not changeable or you forgot to use "set $arg_foo '';" in the config file to define it first[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: symbol $ in lua code of set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'return "$unknown"';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-$unknown[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: symbol $ in lua code of set_by_lua_file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $res html/a.lua;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return "$unknown"[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-$unknown[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: external script files with arguments[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $res html/a.lua $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return ngx.arg[1] + ngx.arg[2][m
[31m---- request[m
[31m-GET /lua?a=5&b=2[m
[31m---- response_body[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: variables in set_by_lua_file's file path[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $path "html/a.lua";[m
[31m-        set_by_lua_file $res $path $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return ngx.arg[1] + ngx.arg[2][m
[31m---- request[m
[31m-GET /lua?a=5&b=2[m
[31m---- response_body[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: lua error (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'error("Bad")';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-failed to run set_by_lua*: set_by_lua:1: Bad[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: lua error (nil)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'error(nil)';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-failed to run set_by_lua*: unknown reason[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: globals get cleared for every single request[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res '[m
[31m-            if not foo then[m
[31m-                foo = 1[m
[31m-            else[m
[31m-                foo = foo + 1[m
[31m-            end[m
[31m-            return foo[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: user modules using ngx.arg[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'local foo = require "foo" return foo.go()' $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    return ngx.arg[1] + ngx.arg[2][m
[31m-end[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: server scope (inline)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $a "[$res]";[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    set_by_lua $res "return 1+1";[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: server if scope (inline)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $a "[$res]";[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    if ($arg_name = "jim") {[m
[31m-        set_by_lua $res "return 1+1";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?name=jim[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: location if scope (inline)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        if ($arg_name = "jim") {[m
[31m-            set_by_lua $res "return 1+1";[m
[31m-            set $a "[$res]";[m
[31m-            echo $a;[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?name=jim[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: server scope (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $a "[$res]";[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    set_by_lua_file $res html/a.lua;[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return 1+1[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: server if scope (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $a "[$res]";[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    if ($arg_name = "jim") {[m
[31m-        set_by_lua_file $res html/a.lua;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?name=jim[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return 1+1[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: location if scope (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        if ($arg_name = "jim") {[m
[31m-            set_by_lua_file $res html/a.lua;[m
[31m-            set $a "[$res]";[m
[31m-            echo $a;[m
[31m-        }[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return 1+1[m
[31m---- request[m
[31m-GET /lua?name=jim[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: backtrace[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set_by_lua $a '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                error("something bad happened")[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-        ';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-something bad happened[m
[31m-stack traceback:[m
[31m-in function 'error'[m
[31m-in function 'bar'[m
[31m-in function 'foo'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $a html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/002-content.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/002-content.t[m
[1mdeleted file mode 100644[m
[1mindex e6cb62d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/002-content.t[m
[1m+++ /dev/null[m
[36m@@ -1,839 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 19);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.print("Hello, Lua!\\n")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "print failed: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic say[m
[31m---- config[m
[31m-    location /say {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.say("Hello, Lua!")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "say failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.say("Yay! ", 123)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "say failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /say[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-Yay! 123[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no ngx.echo[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.echo("Hello, Lua!\\n")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/content_by_lua\(nginx\.conf:\d+\):1: attempt to call field 'echo' \(a nil value\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: variable[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua 'v = ngx.var["request_uri"] ngx.print("request_uri: ", v, "\\n")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variable (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: calc expression[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/calc.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> calc.lua[m
[31m-local function uri_unescape(uri)[m
[31m-    local function convert(hex)[m
[31m-        return string.char(tonumber("0x"..hex))[m
[31m-    end[m
[31m-    local s = string.gsub(uri, "%%([0-9a-fA-F][0-9a-fA-F])", convert)[m
[31m-    return s[m
[31m-end[m
[31m-[m
[31m-local function eval_exp(str)[m
[31m-    return loadstring("return "..str)()[m
[31m-end[m
[31m-[m
[31m-local exp_str = ngx.var["arg_exp"][m
[31m--- print("exp: '", exp_str, "'\n")[m
[31m-local status, res[m
[31m-status, res = pcall(uri_unescape, exp_str)[m
[31m-if not status then[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-    return[m
[31m-end[m
[31m-status, res = pcall(eval_exp, res)[m
[31m-if status then[m
[31m-    ngx.print("result: ", res, "\n")[m
[31m-else[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua?exp=1%2B2*math.sin(3)%2Fmath.exp(4)-math.sqrt(2)[m
[31m---- response_body[m
[31m-result: -0.4090441561579[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read $arg_xxx[m
[31m---- config[m
[31m-    location = /lua {[m
[31m-        content_by_lua 'who = ngx.var.arg_who[m
[31m-            ngx.print("Hello, ", who, "!")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?who=agentzh[m
[31m---- response_body chomp[m
[31m-Hello, agentzh![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: capture location[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua 'res = ngx.location.capture("/other"); ngx.print("status=", res.status, " "); ngx.print("body=", res.body)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-status=200 body=hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-ei= TEST 9: capture non-existed location[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'res = ngx.location.capture("/other"); ngx.print("status=", res.status)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body: status=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: invalid capture location (not as expected...)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'res = ngx.location.capture("*(#*"); ngx.say("res=", res.status)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-res=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nil is "nil"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say(nil)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: write boolean[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say(true, " ", false)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-true false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: bad argument type to ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.location.capture(nil)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: capture location (default 0);[m
[31m---- config[m
[31m- location /recur {[m
[31m-       content_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body, "\\n");[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur[m
[31m---- response_body[m
[31m-num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: capture location[m
[31m---- config[m
[31m- location /recur {[m
[31m-       content_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body);[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur?num=3[m
[31m---- response_body[m
[31m-num is: 3[m
[31m-status=200 body=num is: 2[m
[31m-status=200 body=num is: 1[m
[31m-status=200 body=num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: setting nginx variables from within Lua[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a "";[m
[31m-       content_by_lua 'ngx.var.a = 32; ngx.say(ngx.var.a)';[m
[31m-       add_header Foo $a;[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_headers[m
[31m-Foo: 32[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: nginx quote sql string 1[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a 'hello\n\r\'"\\';[m
[31m-       content_by_lua 'ngx.say(ngx.quote_sql_str(ngx.var.a))';[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: nginx quote sql string 2[m
[31m---- config[m
[31m-location /set {[m
[31m-    set $a "hello\n\r'\"\\";[m
[31m-    content_by_lua 'ngx.say(ngx.quote_sql_str(ngx.var.a))';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: use dollar[m
[31m---- config[m
[31m-location /set {[m
[31m-    content_by_lua '[m
[31m-        local s = "hello 112";[m
[31m-        ngx.say(string.find(s, "%d+$"))';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-79[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: subrequests do not share variables of main requests by default[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a 12;[m
[31m-    content_by_lua 'res = ngx.location.capture("/sub"); ngx.print(res.body)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: subrequests can share variables of main requests[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a 12;[m
[31m-    content_by_lua '[m
[31m-        res = ngx.location.capture([m
[31m-            "/sub",[m
[31m-            { share_all_vars = true }[m
[31m-        );[m
[31m-        ngx.print(res.body)[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: main requests use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-}[m
[31m-location /parent {[m
[31m-    content_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = true });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: main requests do NOT use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-}[m
[31m-location /parent {[m
[31m-    content_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = false });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body_like eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: capture location multi-value headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        #echo "hello, world";[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Set-Cookie"] = {"a", "hello, world", "foo"}[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", type(res.header["Set-Cookie"]));[m
[31m-            ngx.say("len: ", #res.header["Set-Cookie"]);[m
[31m-            ngx.say("value: ", table.concat(res.header["Set-Cookie"], "|"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: table[m
[31m-len: 3[m
[31m-value: a|hello, world|foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"]);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: Bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-            ngx.header.Bar = nil;[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"] or "nil");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: HTTP 1.0 response[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            data = "hello, world"[m
[31m-            -- ngx.header["Content-Length"] = #data[m
[31m-            -- ngx.header.content_length = #data[m
[31m-            ngx.print(data)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/lua;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_headers[m
[31m-Content-Length: 12[m
[31m---- response_body chop[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multiple eof[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Hi")[m
[31m-[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-eof failed: seen eof[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: nginx vars in script path[m
[31m---- config[m
[31m-    location ~ ^/lua/(.+)$ {[m
[31m-        content_by_lua_file html/$1.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> calc.lua[m
[31m-local a,b = ngx.var.arg_a, ngx.var.arg_b[m
[31m-ngx.say(a+b)[m
[31m---- request[m
[31m-GET /lua/calc?a=19&b=81[m
[31m---- response_body[m
[31m-100[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: nginx vars in script path[m
[31m---- config[m
[31m-    location ~ ^/lua/(.+)$ {[m
[31m-        content_by_lua_file html/$1.lua;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua/sum a=3&b=2;[m
[31m-        echo_location /lua/diff a=3&b=2;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> sum.lua[m
[31m-local a,b = ngx.var.arg_a, ngx.var.arg_b[m
[31m-ngx.say(a+b)[m
[31m->>> diff.lua[m
[31m-local a,b = ngx.var.arg_a, ngx.var.arg_b[m
[31m-ngx.say(a-b)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-5[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: basic print (HEAD + HTTP 1.1)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua 'ngx.print("Hello, Lua!\\n")';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: basic print (HEAD + HTTP 1.0)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua '[m
[31m-            ngx.print("Hello, Lua!\\n")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /lua HTTP/1.0[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: headers_sent & HEAD[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-            local ok, err = ngx.flush()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "failed to flush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /lua[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to flush: header only[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: HEAD & ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            local ok, err = ngx.say(ngx.headers_sent)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "failed to say: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /lua[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to say: header only[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: ngx.eof before ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = ngx.say(ngx.headers_sent)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "failed to say: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to say: seen eof[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: headers_sent + GET[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- print("headers sent: ", ngx.headers_sent)[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-            -- ngx.flush()[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-false[m
[31m-true[m
[31m-true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: HTTP 1.0 response with Content-Length[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            data = "hello,\\nworld\\n"[m
[31m-            ngx.header["Content-Length"] = #data[m
[31m-            ngx.say("hello,")[m
[31m-            ngx.flush()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.say("world")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        echo_sleep 2;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/lua;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_headers[m
[31m-Content-Length: 13[m
[31m---- response_body[m
[31m-hello,[m
[31m-world[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: ngx.print table arguments (github issue #54)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua 'ngx.print({10, {0, 5}, 15}, 32)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body chop[m
[31m-10051532[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: ngx.say table arguments (github issue #54)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua 'ngx.say({10, {0, "5"}, 15}, 32)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-10051532[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: .lua file with shebang[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-#!/bin/lua[m
[31m-[m
[31m-ngx.say("line ", debug.getinfo(1).currentline)[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-line 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: syntax error in inlined Lua code[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'for end';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/failed to load inlined Lua code: /[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/003-errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/003-errors.t[m
[1mdeleted file mode 100644[m
[1mindex 764300a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/003-errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: syntax error in lua code chunk[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "local a[m
[31m-            a = a+;[m
[31m-            return a";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: syntax error in lua file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $res 'html/test.lua';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local a[m
[31m-a = 3 +;[m
[31m-return a[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: syntax error in lua file (from Guang Feng)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $res '[{"a":32},{"b":64}]';[m
[31m-        #set $res '[{"friend_userid":1750146},{"friend_userid":1750150},{"friend_userid":1750153},{"friend_userid":1750166},{"friend_userid":1750181},{"friend_userid":1750186},{"friend_userid":1750195},{"friend_userid":1750232}]';[m
[31m-        set_by_lua_file $list 'html/test.lua' $res;[m
[31m-        #set_by_lua_file $list 'html/feed.lua' $res;[m
[31m-        echo $list;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m--- local j = require('json')[m
[31m-local p = ngx.arg[1][m
[31m-return p[m
[31m->>> feed.lua[m
[31m-local s = require("json")[m
[31m-local function explode(d,p)[m
[31m-   local t, ll[m
[31m-   t={}[m
[31m-   ll=0[m
[31m-   if(#p == 1) then return p end[m
[31m-       while true do[m
[31m-       l=string.find(p,d,ll+1,true) [m
[31m-           if l~=nil then [m
[31m-         table.insert(t, string.sub(p,ll,l-1)) [m
[31m-         ll=l+1 [m
[31m-           else[m
[31m-         table.insert(t, string.sub(p,ll)) [m
[31m-         break [m
[31m-         end[m
[31m-     end[m
[31m-return t[m
[31m- end[m
[31m-[m
[31m-local a = explode(',', string.sub(ngx.arg[1], 2, -1))[m
[31m-local x = {}[m
[31m-for i,v in ipairs(a) do table.insert(x,s.decode(v).friend_userid) end[m
[31m-return table.concat(x,',')[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[{"a":32},{"b":64}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: 500 in subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/err")[m
[31m-            ngx.say(res.status);[m
[31m-        ';[m
[31m-    }[m
[31m-    location /err {[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: drizzle_pass 500 in subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/err")[m
[31m-            ngx.say(res.status);[m
[31m-        ';[m
[31m-    }[m
[31m-    location /err {[m
[31m-        set $back 'blah-blah';[m
[31m-        drizzle_pass $back;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-500[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/004-require.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/004-require.t[m
[1mdeleted file mode 100644[m
[1mindex 3250b2f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/004-require.t[m
[1m+++ /dev/null[m
[36m@@ -1,211 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#master_on();[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-#warn $html_dir;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = "$html_dir/?.lua";[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /load;[m
[31m-        echo_location /check;[m
[31m-        echo_location /check;[m
[31m-    }[m
[31m-[m
[31m-    location /load {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.foo = nil;[m
[31m-            local foo = require "foo";[m
[31m-            foo.hi()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /check {[m
[31m-        content_by_lua '[m
[31m-            local foo = package.loaded.foo[m
[31m-            if foo then[m
[31m-                ngx.say("found")[m
[31m-                foo.hi()[m
[31m-            else[m
[31m-                ngx.say("not found")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall);[m
[31m-[m
[31m-ngx.say("loading");[m
[31m-[m
[31m-function hi ()[m
[31m-    ngx.say("hello, foo")[m
[31m-end;[m
[31m---- response_body[m
[31m-loading[m
[31m-hello, foo[m
[31m-found[m
[31m-hello, foo[m
[31m-found[m
[31m-hello, foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_cpath '$::HtmlDir/?.so';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.cpath);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- user_files[m
[31m---- response_body_like: ^[^;]+/servroot/html/\?.so$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: expand default path (after)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;;';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.path);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: ^[^;]+/servroot/html/\?.lua;.+\.lua;$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: expand default cpath (after)[m
[31m---- http_config eval[m
[31m-    "lua_package_cpath '$::HtmlDir/?.so;;';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.cpath);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: ^[^;]+/servroot/html/\?.so;.+\.so;$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: expand default path (before)[m
[31m---- http_config eval[m
[31m-    "lua_package_path ';;$::HtmlDir/?.lua';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.path);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: ^.+\.lua;[^;]+/servroot/html/\?.lua$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: expand default cpath (before)[m
[31m---- http_config eval[m
[31m-    "lua_package_cpath ';;$::HtmlDir/?.so';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.cpath);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: ^.+\.so;[^;]+/servroot/html/\?.so$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: require "ngx" (content_by_lua)[m
[31m---- config[m
[31m-    location /ngx {[m
[31m-        content_by_lua '[m
[31m-            local ngx = require "ngx"[m
[31m-            ngx.say("hello, world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ngx[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: require "ngx" (set_by_lua)[m
[31m---- config[m
[31m-    location /ngx {[m
[31m-        set_by_lua $res '[m
[31m-            local ngx = require "ngx"[m
[31m-            return ngx.escape_uri(" ")[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /ngx[m
[31m---- response_body[m
[31m-%20[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: require "ndk" (content_by_lua)[m
[31m---- config[m
[31m-    location /ndk {[m
[31m-        content_by_lua '[m
[31m-            local ndk = require "ndk"[m
[31m-            local res = ndk.set_var.set_escape_uri(" ")[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ndk[m
[31m---- response_body[m
[31m-%20[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: require "ndk" (set_by_lua)[m
[31m---- config[m
[31m-    location /ndk {[m
[31m-        set_by_lua $res '[m
[31m-            local ndk = require "ndk"[m
[31m-            return ndk.set_var.set_escape_uri(" ")[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /ndk[m
[31m---- response_body[m
[31m-%20[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/005-exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/005-exit.t[m
[1mdeleted file mode 100644[m
[1mindex 781531f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/005-exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,726 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#repeat_each(20000);[m
[31m-repeat_each(2);[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#log_level('debug');[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1024);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: throw 403[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "ngx.exit(403);ngx.say('hi')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: throw 404[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "ngx.exit(404);ngx.say('hi');";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 404[m
[31m---- response_body_like: 404 Not Found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: throw 404 after sending the header and partial body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "ngx.say('hi');ngx.exit(404);ngx.say(', you')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_log[m
[31m-attempt to set status 404 via ngx.exit after sending out the response status 200[m
[31m---- no_error_log[m
[31m-alert[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: working with ngx_auth_request (succeeded)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        content_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentzh[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Logged in[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: working with ngx_auth_request (failed)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        content_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentz[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: working with ngx_auth_request (simplest form, w/o ngx_memc)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m--- print('just have run sr: ' .. res.body)[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: working with ngx_auth_request (simplest form)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: working with ngx_auth_request[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_b {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream_list memc_cluster memc_a memc_b;[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: working with ngx_auth_request[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 300;[m
[31m-    }[m
[31m-[m
[31m-    #upstream_list memc_cluster memc_a memc_b;[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        #set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass memc_a;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uri-$query_string";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        set_quote_sql_str $seo_uri $query_string;[m
[31m-        drizzle_query "select url from my_url_map where seo_url=$seo_uri";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /baz {[m
[31m-        set $my_uri $uri;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo_exec /jump $my_uri;[m
[31m-    }[m
[31m-[m
[31m-    location /jump {[m
[31m-        internal;[m
[31m-        rewrite ^ $query_string? redirect;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local seo_uri = ngx.var.my_uri[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-mysql?' .. seo_uri)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].url) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.my_uri = res[1].url;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /baz[m
[31m---- response_body_like: 302[m
[31m---- error_code: 302[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/foo/bar[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: throw 0[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "ngx.say('Hi'); ngx.eof(); ngx.exit(0);ngx.say('world')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: pcall safe[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f ()[m
[31m-                ngx.say("hello")[m
[31m-                ngx.exit(200)[m
[31m-            end[m
[31m-[m
[31m-            pcall(f)[m
[31m-            ngx.say("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: 501 Method Not Implemented[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(501)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 501[m
[31m---- response_body_like: 501 (?:Method )?Not Implemented[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: 501 Method Not Implemented[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(ngx.HTTP_METHOD_NOT_IMPLEMENTED)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 501[m
[31m---- response_body_like: 501 (?:Method )?Not Implemented[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: throw 403 after sending out headers with 200[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("Hello World")[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello World[m
[31m---- error_log[m
[31m-attempt to set status 403 via ngx.exit after sending out the response status 200[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: throw 403 after sending out headers with 403[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.status = 403[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("Hello World")[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello World[m
[31m---- error_code: 403[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: throw 403 after sending out headers with 403 (HTTP 1.0 buffering)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.status = 403[m
[31m-            ngx.say("Hello World")[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-Hello World[m
[31m---- error_code: 403[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: throw 444 after sending out responses (HTTP 1.0)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "[m
[31m-            ngx.say('ok');[m
[31m-            return ngx.exit(444)[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua HTTP/1.0[m
[31m---- ignore_response[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua sending HTTP 1.0 response headers[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: throw 499 after sending out responses (HTTP 1.0)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "[m
[31m-            ngx.say('ok');[m
[31m-            return ngx.exit(499)[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua HTTP/1.0[m
[31m---- ignore_response[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua sending HTTP 1.0 response headers[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: throw 408 after sending out responses (HTTP 1.0)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "[m
[31m-            ngx.say('ok');[m
[31m-            return ngx.exit(408)[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua HTTP/1.0[m
[31m---- ignore_response[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua sending HTTP 1.0 response headers[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: exit(201) with custom response body[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "[m
[31m-            ngx.status = 201[m
[31m-            ngx.say('ok');[m
[31m-            return ngx.exit(201)[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua sending HTTP 1.0 response headers[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: exit 403 in header filter[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "ngx.say('hi');";[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exit 201 in header filter[m
[31m---- config[m
[31m-    lingering_close always;[m
[31m-    location = /t {[m
[31m-        content_by_lua "ngx.say('hi');";[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 201[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: exit both in header filter and content handler[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "ngx.status = 201 ngx.say('hi') ngx.exit(201)";[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 201[m
[31m---- stap2[m
[31m-/*[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("=== %d\n", $r->headers_out->status)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-*/[m
[31m-F(ngx_http_lua_header_filter_inline) {[m
[31m-    printf("=== %d\n", $r->headers_out->status)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_header_filter_by_chunk).return {[m
[31m-    if ($return == -1) {[m
[31m-        printf("====== header filter by chunk\n")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m---- stap_out[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: exit 444 in header filter[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "ngx.say('hello world');";[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(444)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 444[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/006-escape.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/006-escape.t[m
[1mdeleted file mode 100644[m
[1mindex 7b26bba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/006-escape.t[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: escape uri in set_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('a 你')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-a%20%E4%BD%A0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unescape uri in set_by_lua[m
[31m---- config[m
[31m-    location /unescape {[m
[31m-        set_by_lua $res "return ngx.unescape_uri('a%20%e4%bd%a0')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /unescape[m
[31m---- response_body[m
[31m-a 你[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: escape uri in content_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        content_by_lua "ngx.say(ngx.escape_uri('a 你'))";[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-a%20%E4%BD%A0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: unescape uri in content_by_lua[m
[31m---- config[m
[31m-    location /unescape {[m
[31m-        content_by_lua "ngx.say(ngx.unescape_uri('a%20%e4%bd%a0'))";[m
[31m-    }[m
[31m---- request[m
[31m-GET /unescape[m
[31m---- response_body[m
[31m-a 你[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: escape uri in set_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('a+b')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-a%2Bb[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: escape uri in set_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('\"a/b={}:<>;&[]\\\\^')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-%22a%2Fb%3D%7B%7D%3A%3C%3E%3B%26%5B%5D%5C%5E[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: escape uri in set_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.baz = ngx.escape_uri(" ")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_headers[m
[31m-baz: %20[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: escape a string that cannot be escaped[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('abc')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: escape an empty string that cannot be escaped[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: escape nil[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri(nil)";[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: escape numbers[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri(32)";[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-[32][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: unescape nil[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $res "return ngx.unescape_uri(nil)";[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: unescape numbers[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $res "return ngx.unescape_uri(32)";[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-[32][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/007-md5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/007-md5.t[m
[1mdeleted file mode 100644[m
[1mindex 501e3af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/007-md5.t[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set md5 hello[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua 'ngx.say(ngx.md5("hello"))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nil string to ngx.md5[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua 'ngx.say(ngx.md5(nil))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: null string to ngx.md5[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        content_by_lua 'ngx.say(ngx.md5(""))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: use ngx.md5 in set_by_lua[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        set_by_lua $a 'return ngx.md5("hello")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: use ngx.md5 in set_by_lua (nil)[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        set_by_lua $a 'return ngx.md5(nil)';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: use ngx.md5 in set_by_lua (null string)[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        set_by_lua $a 'return ngx.md5("")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: md5(number)[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua 'ngx.say(ngx.md5(45))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-6c8349cc7260ae62e3b1396831a8398f[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/008-today.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/008-today.t[m
[1mdeleted file mode 100644[m
[1mindex 54bd949..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/008-today.t[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: use ngx.today in content_by_lua[m
[31m---- config[m
[31m-    location = /today {[m
[31m-        content_by_lua 'ngx.say(ngx.today())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /today[m
[31m---- response_body_like: ^\d{4}-\d{2}-\d{2}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: use ngx.today in set_by_lua[m
[31m---- config[m
[31m-    location = /today {[m
[31m-        set_by_lua $a 'return ngx.today()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /today[m
[31m---- response_body_like: ^\d{4}-\d{2}-\d{2}$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/009-log.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/009-log.t[m
[1mdeleted file mode 100644[m
[1mindex 053dd45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/009-log.t[m
[1m+++ /dev/null[m
[36m@@ -1,545 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('debug'); # to ensure any log-level can be outputed[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 4);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test log-level STDERR[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.STDERR, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test log-level EMERG[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.EMERG, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test log-level ALERT[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.ALERT, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: test log-level CRIT[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.CRIT, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[crit\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test log-level ERR[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.ERR, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test log-level WARN[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.WARN, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[warn\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test log-level NOTICE[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.NOTICE, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[notice\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: test log-level INFO[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.INFO, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[info\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: test log-level DEBUG[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.DEBUG, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[debug\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: regression test print()[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            print("hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[notice\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: print(nil)[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            print()[m
[31m-            print(nil)[m
[31m-            print("nil: ", nil)[m
[31m-            ngx.say("hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):2: ,/,[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):3: nil,/,[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):4: nil: nil,/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.log in set_by_lua[m
[31m---- config[m
[31m-    location /log {[m
[31m-        set_by_lua $a '[m
[31m-            ngx.log(ngx.ERR, "HELLO")[m
[31m-            return 32;[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-32[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] set_by_lua:2: HELLO,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: test booleans and nil[m
[31m---- config[m
[31m-    location /log {[m
[31m-        set_by_lua $a '[m
[31m-            ngx.log(ngx.ERR, true, false, nil)[m
[31m-            return 32;[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-32[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] set_by_lua:2: truefalsenil,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: test table with metamethod[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("before log")[m
[31m-            local t = setmetatable({v = "value"}, {[m
[31m-                __tostring = function(self)[m
[31m-                    return "tostring "..self.v[m
[31m-                end[m
[31m-            })[m
[31m-            ngx.log(ngx.ERR, t)[m
[31m-            ngx.say("after log")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):8: tostring value,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: test table without metamethod[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.log(ngx.ERR, {})[m
[31m-            ngx.say("done")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'log' (expected table to have __tostring metamethod)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: test tables mixed with other types[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("before log")[m
[31m-            local t = setmetatable({v = "value"}, {[m
[31m-                __tostring = function(self)[m
[31m-                    return "tostring: "..self.v[m
[31m-                end[m
[31m-            })[m
[31m-            ngx.log(ngx.ERR, t, " hello ", t)[m
[31m-            ngx.say("after log")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):8: tostring: value hello tostring: value,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: test print with tables[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("before log")[m
[31m-            local t = setmetatable({v = "value"}, {[m
[31m-                __tostring = function(self)[m
[31m-                    return "tostring: "..self.v[m
[31m-                end[m
[31m-            })[m
[31m-            print(t, " hello ", t)[m
[31m-            ngx.say("after log")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[notice\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):8: tostring: value hello tostring: value,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: print() in header filter[m
[31m---- config[m
[31m-    location /log {[m
[31m-        header_filter_by_lua '[m
[31m-            print("hello world")[m
[31m-            ngx.header.foo = 32[m
[31m-        ';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_headers[m
[31m-foo: 32[m
[31m---- error_log eval[m
[31m-qr/\[notice\] .*? \[lua\] header_filter_by_lua:2: hello world/[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.log in header filter[m
[31m---- config[m
[31m-    location /log {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.log(ngx.ERR, "howdy, lua!")[m
[31m-            ngx.header.foo = 32[m
[31m-        ';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_headers[m
[31m-foo: 32[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? \[lua\] header_filter_by_lua:2: howdy, lua!/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.log big data[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.ERR, "a" .. string.rep("h", 1970) .. "b")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_headers[m
[31m---- error_log eval[m
[31m-[qr/ah{1970}b/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.log in Lua function calls & inlined lua[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                ngx.log(ngx.ERR, "hello, log", 1234, 3.14159)[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):7: bar\(\): hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx.log in Lua function tail-calls & inlined lua[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            function foo()[m
[31m-                return bar(5)[m
[31m-            end[m
[31m-[m
[31m-            function bar(n)[m
[31m-                if n < 1 then[m
[31m-                    ngx.log(ngx.ERR, "hello, log", 1234, 3.14159)[m
[31m-                    return n[m
[31m-                end[m
[31m-[m
[31m-                return bar(n - 1)[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):8:(?: foo\(\):)? hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.log in Lua files[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-function foo()[m
[31m-    bar()[m
[31m-end[m
[31m-[m
[31m-function bar()[m
[31m-    ngx.log(ngx.ERR, "hello, log", 1234, 3.14159)[m
[31m-end[m
[31m-[m
[31m-foo()[m
[31m-ngx.say("done")[m
[31m-[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] test.lua:6: bar\(\): hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx.log with bad levels (ngx.ERROR, -1)[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.ERROR, "hello lua")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad log level: -1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx.log with bad levels (9)[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(9, "hello lua")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad log level: 9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: \0 in the log message[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.WARN, "hello\\0world")[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-"2: hello\0world, client: "[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/010-request_body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/010-request_body.t[m
[1mdeleted file mode 100644[m
[1mindex d200495..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/010-request_body.t[m
[1m+++ /dev/null[m
[36m@@ -1,273 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('debug'); # to ensure any log-level can be outputed[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test not reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test default setting (not reading request body)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: test main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test override main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test override server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: test override server conf[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-            local res = ngx.location.capture([m
[31m-                "/proxy",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = ngx.var.request_body })[m
[31m-[m
[31m-            ngx.say(res.status)[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-"[m
[31m---- response_body[m
[31m-nil[m
[31m-200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: empty POST body[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-            local res = ngx.location.capture([m
[31m-                "/proxy",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = ngx.var.request_body })[m
[31m-[m
[31m-            ngx.say(res.status)[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-"[m
[31m---- response_body[m
[31m-nil[m
[31m-200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: on disk request body[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 1;[m
[31m-        sendfile on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture([m
[31m-                "/proxy",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = ngx.var.request_body })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-" . ('a' x 1024)[m
[31m---- response_body chomp[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: no modify main request content-length[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/other", {body = "hello"})[m
[31m-            ngx.say(ngx.req.get_headers()["Content-Length"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /other {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-POST /foo[m
[31m-hi[m
[31m---- response_body[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: Expect: 100-Continue[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo_body[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-http finalize request: 500, "/echo_body?" a:1, c:2[m
[31m-http finalize request: 500, "/echo_body?" a:1, c:0[m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/011-md5_bin.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/011-md5_bin.t[m
[1mdeleted file mode 100644[m
[1mindex ae7c974..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/011-md5_bin.t[m
[1m+++ /dev/null[m
[36m@@ -1,170 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-[m
[31m-#md5_bin_bin is hard to test, so convert it to hex mode[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set md5_bin hello ????xxoo[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua 'local a = string.gsub(ngx.md5_bin("hello"), ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end); ngx.say(a)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set md5_bin hello ????xxoo[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua 'ngx.say(string.len(ngx.md5_bin("hello")))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set md5_bin hello[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s = ngx.md5_bin("hello")[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: nil string to ngx.md5_bin[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s = ngx.md5_bin(nil)[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: null string to ngx.md5_bin[m
[31m---- config[m
[31m-    location /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s = ngx.md5_bin("")[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: use ngx.md5_bin in set_by_lua[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        set_by_lua $a 'return string.gsub(ngx.md5_bin("hello"), ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: use ngx.md5_bin in set_by_lua (nil)[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        set_by_lua $a '[m
[31m-            local s = ngx.md5_bin(nil)[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: use ngx.md5_bin in set_by_lua (null string)[m
[31m---- config[m
[31m-    location /md5_bin {[m
[31m-        set_by_lua $a '[m
[31m-            local s = ngx.md5_bin("")[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: md5_bin(number)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            s = ngx.md5_bin(45)[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            ngx.say(s)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-6c8349cc7260ae62e3b1396831a8398f[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/012-now.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/012-now.t[m
[1mdeleted file mode 100644[m
[1mindex abcb735..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/012-now.t[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: use ngx.localtime in content_by_lua[m
[31m---- config[m
[31m-    location = /now {[m
[31m-        content_by_lua 'ngx.say(ngx.localtime())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /now[m
[31m---- response_body_like: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: use ngx.localtime in set_by_lua[m
[31m---- config[m
[31m-    location = /now {[m
[31m-        set_by_lua $a 'return ngx.localtime()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /now[m
[31m---- response_body_like: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: use ngx.time in set_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        set_by_lua $a 'return ngx.time()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: use ngx.time in content_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        content_by_lua 'ngx.say(ngx.time())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: use ngx.time in content_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.time())[m
[31m-            ngx.say(ngx.localtime())[m
[31m-            ngx.say(ngx.utctime())[m
[31m-            ngx.say(ngx.cookie_time(ngx.time()))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like chomp[m
[31m-^\d{10,}[m
[31m-\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}[m
[31m-\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}[m
[31m-\w+, .*? GMT$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: use ngx.now in set_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        set_by_lua $a 'return ngx.now()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}(\.\d{1,3})?$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: use ngx.now in content_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        content_by_lua 'ngx.say(ngx.now())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}(\.\d{1,3})?$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: use ngx.update_time & ngx.now in content_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            ngx.say(ngx.now())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}(\.\d{1,3})?$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/013-base64.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/013-base64.t[m
[1mdeleted file mode 100644[m
[1mindex 1cc27de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/013-base64.t[m
[1m+++ /dev/null[m
[36m@@ -1,245 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: base64 encode hello[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("hello"))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-aGVsbG8=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nil string to ngx.encode_base64[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        content_by_lua 'ngx.say("left" .. ngx.encode_base64(nil) .. "right")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: null string to ngx.encode_base64[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        content_by_lua 'ngx.say("left" .. ngx.encode_base64("") .. "right")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: use ngx.encode_base64 in set_by_lua[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        set_by_lua $a 'return ngx.encode_base64("hello")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-aGVsbG8=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: use ngx.encode_base64 in set_by_lua (nil)[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        set_by_lua $a 'return "left" .. ngx.encode_base64(nil) .. "right"';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: use ngx.encode_base64 in set_by_lua (null string)[m
[31m---- config[m
[31m-    location /encode_base64 {[m
[31m-        set_by_lua $a 'return "left" .. ngx.encode_base64("") .. "right"';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: base64 encode hello[m
[31m---- config[m
[31m-    location = /decode_base64 {[m
[31m-        content_by_lua 'ngx.say(ngx.decode_base64("aGVsbG8="))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: null string to ngx.decode_base64[m
[31m---- config[m
[31m-    location = /decode_base64 {[m
[31m-        content_by_lua 'ngx.say("left" .. ngx.decode_base64("") .. "right")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: use ngx.decode_base64 in set_by_lua[m
[31m---- config[m
[31m-    location = /decode_base64 {[m
[31m-        set_by_lua $a 'return ngx.decode_base64("aGVsbG8=")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: use ngx.decode_base64 in set_by_lua (nil)[m
[31m---- config[m
[31m-    location = /decode_base64 {[m
[31m-        set_by_lua $a 'return "left" .. ngx.decode_base64(nil) .. "right"';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-string argument only[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: use ngx.decode_base64 in set_by_lua (null string)[m
[31m---- config[m
[31m-    location /decode_base64 {[m
[31m-        set_by_lua $a 'return "left" .. ngx.decode_base64("") .. "right"';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: base64 encode number[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(32))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-MzI=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: base64 decode number[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.decode_base64(32))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-string argument only[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: base64 decode error[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.decode_base64("^*~"))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: base64 encode without padding (explicit true to no_padding)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("hello", true))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-aGVsbG8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: base64 encode short string[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("w"))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dw==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: base64 encode short string with padding (explicit false to no_padding)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("w", false))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dw==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: base64 encode with wrong 2nd parameter[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("w", 0))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/bad argument \#2 to 'encode_base64' \(boolean expected, got number\)|\[error\] .*? boolean argument only/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/014-bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/014-bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 44337e3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/014-bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,1021 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 30);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-#warn $html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-[m
[31m-sub read_file {[m
[31m-    my $infile = shift;[m
[31m-    open my $in, $infile[m
[31m-        or die "cannot open $infile for reading: $!";[m
[31m-    my $cert = do { local $/; <$in> };[m
[31m-    close $in;[m
[31m-    $cert;[m
[31m-}[m
[31m-[m
[31m-our $TestCertificate = read_file("t/cert/test.crt");[m
[31m-our $TestCertificateKey = read_file("t/cert/test.key");[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /load {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.foo = nil;[m
[31m-            local foo = require "foo";[m
[31m-            foo.hi()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /load[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall);[m
[31m-[m
[31m-function foo ()[m
[31m-    return 1[m
[31m-    return 2[m
[31m-end[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config[m
[31m-lua_package_path '/home/agentz/rpm/BUILD/lua-yajl-1.1/build/?.so;/home/lz/luax/?.so;./?.so';[m
[31m---- config[m
[31m-    location = '/report/listBidwordPrices4lzExtra.htm' {[m
[31m-        content_by_lua '[m
[31m-            local yajl = require "yajl"[m
[31m-            local w = ngx.var.arg_words[m
[31m-            w = ngx.unescape_uri(w)[m
[31m-            local r = {}[m
[31m-            print("start for")[m
[31m-            for id in string.gmatch(w, "%d+") do[m
[31m-                 r[id] = -1[m
[31m-            end[m
[31m-            print("end for, start yajl")[m
[31m-            ngx.print(yajl.to_string(r))[m
[31m-            print("end yajl")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /report/listBidwordPrices4lzExtra.htm?words=123,156,2532[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity[m
[31m---- config[m
[31m-    location = /memc {[m
[31m-        #set $memc_value 'hello';[m
[31m-        set $memc_value $arg_v;[m
[31m-        set $memc_cmd $arg_c;[m
[31m-        set $memc_key $arg_k;[m
[31m-        #set $memc_value hello;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #echo $memc_value;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_location '/memc?c=get&k=foo';[m
[31m-        echo_location '/memc?c=set&k=foo&v=hello';[m
[31m-        echo_location '/memc?c=get&k=foo';[m
[31m-    }[m
[31m-    location = /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/memc?c=get&k=foo&v=")[m
[31m-            ngx.say("1: ", res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/memc?c=set&k=foo&v=bar");[m
[31m-            ngx.say("2: ", res.body);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc?c=get&k=foo")[m
[31m-            ngx.say("3: ", res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: 3: bar$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: capture works for subrequests with internal redirects[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/")[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body_like chop[m
[31m-200[m
[31m-.*It works[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: disk file bufs not working[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/test.lua")[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-print("Hello, world")[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-200[m
[31m-print("Hello, world")[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: print lua empty strings[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.print("") ngx.flush() ngx.print("Hi")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chop[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: say lua empty strings[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say("") ngx.flush() ngx.print("Hi")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval[m
[31m-"[m
[31m-Hi"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: github issue 37: header bug[m
[31m-https://github.com/chaoslawful/lua-nginx-module/issues/37[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Set-Cookie"] = {"TestCookie1=foo", "TestCookie2=bar"};[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local yajl = require "yajl"[m
[31m-            ngx.header["Set-Cookie"] = {}[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-[m
[31m-            for i,j in pairs(res.header) do[m
[31m-                ngx.header[i] = j[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.say("set-cookie: ", yajl.to_string(res.header["Set-Cookie"]))[m
[31m-[m
[31m-            ngx.send_headers()[m
[31m-            ngx.print("body: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- raw_response_headers_like eval[m
[31m-".*Set-Cookie: TestCookie1=foo\r[m
[31m-Set-Cookie: TestCookie2=bar.*"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: memory leak[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-res = {}[m
[31m-res = {'good 1', 'good 2', 'good 3'}[m
[31m-return ngx.redirect("/somedir/" .. ngx.escape_uri(res[math.random(1,#res)]))[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: capturing locations with internal redirects (no lua redirect)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo Bar;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #content_by_lua '[m
[31m-        #ngx.exec("/bar")[m
[31m-        #';[m
[31m-        echo_exec /bar;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: capturing locations with internal redirects (lua redirect)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        content_by_lua 'ngx.say("Bar")';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/bar")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: capturing locations with internal redirects (simple index)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: capturing locations with internal redirects (more lua statements)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.say("world")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #content_by_lua '[m
[31m-        #ngx.exec("/bar")[m
[31m-        #';[m
[31m-        echo_exec /bar;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: capturing locations with internal redirects (post subrequest with internal redirect)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        lua_need_request_body on;[m
[31m-        client_body_in_single_buffer on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #content_by_lua '[m
[31m-        #ngx.exec("/bar")[m
[31m-        #';[m
[31m-        echo_exec /bar;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo", { method = ngx.HTTP_POST, body = "hello" })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: nginx rewrite works in subrequests[m
[31m---- config[m
[31m-    rewrite /foo /foo/ permanent;[m
[31m-    location = /foo/ {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.say("status = ", res.status)[m
[31m-            ngx.say("Location: ", res.header["Location"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-status = 301[m
[31m-Location: /foo/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: nginx rewrite works in subrequests[m
[31m---- config[m
[31m-    access_by_lua '[m
[31m-        local res = ngx.location.capture(ngx.var.uri)[m
[31m-        ngx.say("status = ", res.status)[m
[31m-        ngx.say("Location: ", res.header["Location"] or "nil")[m
[31m-        ngx.exit(200)[m
[31m-    ';[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- user_files[m
[31m->>> foo/index.html[m
[31m-It works![m
[31m---- response_body[m
[31m-status = 301[m
[31m-Location: /foo/[m
[31m---- no_check_leak[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set content-type header with charset[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        charset GBK;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = "text/xml; charset=UTF-8"[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hi[m
[31m---- response_headers[m
[31m-Content-Type: text/xml; charset=UTF-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set response header content-type with charset[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        charset GBK;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = "text/xml"[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hi[m
[31m---- response_headers[m
[31m-Content-Type: text/xml; charset=GBK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: get by-position capturing variables[m
[31m---- config[m
[31m-    location ~ '^/lua/(.*)' {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var[1] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua/hello[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: get by-position capturing variables ($0)[m
[31m---- config[m
[31m-    location ~ '^/lua/(.*)' {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var[0] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua/hello[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: get by-position capturing variables (exceeding captures)[m
[31m---- config[m
[31m-    location ~ '^/lua/(.*)' {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var[2] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua/hello[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: get by-position capturing variables ($1, $2)[m
[31m---- config[m
[31m-    location ~ '^/lua/(.*)/(.*)' {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var[-1] or "nil")[m
[31m-            ngx.say(ngx.var[0] or "nil")[m
[31m-            ngx.say(ngx.var[1] or "nil")[m
[31m-            ngx.say(ngx.var[2] or "nil")[m
[31m-            ngx.say(ngx.var[3] or "nil")[m
[31m-            ngx.say(ngx.var[4] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua/hello/world[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-hello[m
[31m-world[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: set special variables[m
[31m---- config[m
[31m-    location /main {[m
[31m-        #set_unescape_uri $cookie_a "hello";[m
[31m-        set $http_a "hello";[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.http_a)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: set special variables[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            dofile(ngx.var.realpath_root .. "/a.lua")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.location.capture("/echo")[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: set 20+ headers[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Authorization")[m
[31m-        ';[m
[31m-        echo $http_a1;[m
[31m-        echo $http_authorization;[m
[31m-        echo $http_a2;[m
[31m-        echo $http_a3;[m
[31m-        echo $http_a23;[m
[31m-        echo $http_a24;[m
[31m-        echo $http_a25;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers eval[m
[31m-my $i = 1;[m
[31m-my $s;[m
[31m-while ($i <= 25) {[m
[31m-    $s .= "A$i: $i\n";[m
[31m-    if ($i == 22) {[m
[31m-        $s .= "Authorization: blah\n";[m
[31m-    }[m
[31m-    $i++;[m
[31m-}[m
[31m-#warn $s;[m
[31m-$s[m
[31m---- response_body[m
[31m-1[m
[31m-[m
[31m-2[m
[31m-3[m
[31m-23[m
[31m-24[m
[31m-25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: unexpected globals sharing by using _G[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            ngx.print(t)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-["0", "0", "0"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: unexpected globals sharing by using _G (set_by_lua*)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set_by_lua $a '[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            return t[m
[31m-        ';[m
[31m-        echo -n $a;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-["0", "0", "0"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: unexpected globals sharing by using _G (log_by_lua*)[m
[31m---- http_config[m
[31m-    lua_shared_dict log_dict 100k;[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local log_dict = ngx.shared.log_dict[m
[31m-            ngx.print(log_dict:get("cnt") or 0)[m
[31m-        ';[m
[31m-[m
[31m-        log_by_lua '[m
[31m-            local log_dict = ngx.shared.log_dict[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            log_dict:set("cnt", t)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-["0", "0", "0"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: unexpected globals sharing by using _G (header_filter_by_lua*)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        header_filter_by_lua '[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            ngx.ctx.cnt = tostring(t)[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.print(ngx.ctx.cnt or 0)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-["0", "0", "0"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: unexpected globals sharing by using _G (body_filter_by_lua*)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        body_filter_by_lua '[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            ngx.ctx.cnt = _G.t[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.print("a")[m
[31m-            ngx.say(ngx.ctx.cnt or 0)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-a0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: set content-type header with charset and default_type[m
[31m---- http_config[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        default_type application/json;[m
[31m-        charset utf-8;[m
[31m-        charset_types application/json;[m
[31m-        content_by_lua 'ngx.say("hi")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hi[m
[31m---- response_headers[m
[31m-Content-Type: application/json; charset=utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: hang on upstream_next (from kindy)[m
[31m---- no_check_leak[m
[31m---- http_config[m
[31m-    upstream xx {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT max_fails=5;[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT max_fails=5;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        server_name "xx";[m
[31m-        listen $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        return 444;[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_next_upstream off;[m
[31m-        proxy_pass http://xx;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- timeout: 1[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log[m
[31m-upstream prematurely closed connection while reading response header from upstream[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: last_in_chain is set properly in subrequests[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua '[m
[31m-            local eof = ngx.arg[2][m
[31m-            if eof then[m
[31m-                print("eof found in body stream")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m---- log_level: notice[m
[31m---- error_log[m
[31m-eof found in body stream[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: testing a segfault when using ngx_poll_module + ngx_resolver[m
[31m-See more details here: http://mailman.nginx.org/pipermail/nginx-devel/2013-January/003275.html[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $myserver nginx.org;[m
[31m-        proxy_pass http://$myserver/;[m
[31m-        resolver 127.0.0.1:6789;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- abort[m
[31m---- timeout: 0.3[m
[31m---- log_level: notice[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- error_log eval[m
[31m-qr/(?:send|recv)\(\) failed \(\d+: Connection refused\) while resolving/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: github issue #218: ngx.location.capture hangs when querying a remote host that does not exist or is really slow to respond[m
[31m---- config[m
[31m-    set $myurl "https://not-exist.agentzh.org";[m
[31m-    location /toto {[m
[31m-        content_by_lua '[m
[31m-                local proxyUrl = "/myproxy/entity"[m
[31m-                local res = ngx.location.capture( proxyUrl,  { method = ngx.HTTP_GET })[m
[31m-                ngx.say("Hello, ", res.status)[m
[31m-            ';[m
[31m-    }[m
[31m-    location ~ /myproxy {[m
[31m-[m
[31m-        rewrite    ^/myproxy/(.*)  /$1  break;[m
[31m-        resolver_timeout 3s;[m
[31m-        #resolver 172.16.0.23; #  AWS DNS resolver address is the same in all regions - 172.16.0.23[m
[31m-        resolver 8.8.8.8;[m
[31m-        proxy_read_timeout 1s;[m
[31m-        proxy_send_timeout 1s;[m
[31m-        proxy_connect_timeout 1s;[m
[31m-        proxy_pass $myurl:443;[m
[31m-        proxy_pass_request_body off;[m
[31m-        proxy_set_header Content-Length 0;[m
[31m-        proxy_set_header  Accept-Encoding  "";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /toto[m
[31m-[m
[31m---- stap2[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    println("lua post subrequest")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-Hello, 502[m
[31m-[m
[31m---- error_log[m
[31m-not-exist.agentzh.org could not be resolved[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: line comments in the last line of the inlined Lua code[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say("ok") -- blah';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: resolving names with a trailing dot[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        resolver $TEST_NGINX_RESOLVER;[m
[31m-        set $myhost 'agentzh.org.';[m
[31m-        proxy_pass http://$myhost/misc/.vimrc;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: An example for a vimrc file[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: resolving names with a trailing dot[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen 12354;[m
[31m-[m
[31m-        location = /t {[m
[31m-            echo 'args: \$args';[m
[31m-        }[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $args "foo=1&bar=2";[m
[31m-        proxy_pass http://127.0.0.1:12354;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-args: foo=1&bar=2[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- no_check_leak[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: lua_code_cache off + setkeepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        set $port $TEST_NGINX_REDIS_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local sock2 = ngx.socket.tcp()[m
[31m-[m
[31m-    sock:settimeout(1000)[m
[31m-    sock2:settimeout(6000000)[m
[31m-[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock2:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive(100, 100)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock2:setkeepalive(200, 100)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("done")[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_close_connection) {[m
[31m-    println("=== close connection")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- response_body[m
[31m-done[m
[31m---- wait: 0.5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: .lua file of exactly N*1024 bytes (github issue #385)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-my $s = "ngx.say('ok')\n";[m
[31m-">>> a.lua\n" . (" " x (8192 - length($s))) . $s;[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: https proxy has no timeout protection for ssl handshake[m
[31m---- http_config[m
[31m-    # to suppress a valgrind false positive in the nginx core:[m
[31m-    proxy_ssl_session_reuse off;[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        location /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    upstream local {[m
[31m-        server unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass https://local/foo;[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-probe process("nginx").function("ngx_http_upstream_ssl_handshake") {[m
[31m-    printf("read timer set: %d\n", $c->read->timer_set)[m
[31m-    printf("write timer set: %d\n", $c->write->timer_set)[m
[31m-}[m
[31m---- stap_out[m
[31m-read timer set: 0[m
[31m-write timer set: 1[m
[31m-[m
[31m---- response_body eval[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/015-status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/015-status.t[m
[1mdeleted file mode 100644[m
[1mindex 666dae7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/015-status.t[m
[1m+++ /dev/null[m
[36m@@ -1,293 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 9);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no key found[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.blah_blah == nil and "nil" or "not nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: .status found[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.status == nil and "nil" or "not nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body[m
[31m-not nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: default to 0[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.status);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: default to 0[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("blah");[m
[31m-            ngx.say(ngx.status);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body[m
[31m-blah[m
[31m-200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set 201[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 201;[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body[m
[31m-created[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set "201"[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = "201";[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body[m
[31m-created[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set "201.7"[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = "201.7";[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body[m
[31m-created[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set "abc"[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = "abc";[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set blah[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.blah = 201;[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body[m
[31m-created[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set ngx.status before headers are sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("ok")[m
[31m-            ngx.status = 201[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_code: 200[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? attempt to set ngx\.status after sending out response headers/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: http 1.0 and ngx.status[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = ngx.HTTP_UNAUTHORIZED[m
[31m-            ngx.say("invalid request")[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil HTTP/1.0[m
[31m---- response_body[m
[31m-invalid request[m
[31m---- error_code: 401[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #221: cannot modify ngx.status for responses from ngx_proxy[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/;[m
[31m-        header_filter_by_lua '[m
[31m-            if ngx.status == 206 then[m
[31m-                ngx.status = ngx.HTTP_OK[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-Range: bytes=0-4[m
[31m-[m
[31m---- response_body chop[m
[31m-<html[m
[31m-[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: 101 response has a complete status line[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- raw_response_headers_like: ^HTTP/1.1 101 Switching Protocols\r\n[m
[31m---- error_code: 101[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: reading error status code[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say("status = ", ngx.status)';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t\r\n"[m
[31m---- http09[m
[31m---- response_body[m
[31m-status = 9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: err status[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(502)[m
[31m-        ';[m
[31m-        body_filter_by_lua '[m
[31m-            if ngx.arg[2] then[m
[31m-                ngx.log(ngx.WARN, "ngx.status = ", ngx.status)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log[m
[31m-ngx.status = 502[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.status assignmnt should clear r->err_status[m
[31m---- config[m
[31m-location = /t {[m
[31m-    return 502;[m
[31m-    header_filter_by_lua_block {[m
[31m-        if ngx.status == 502 then[m
[31m-            ngx.status = 654[m
[31m-            ngx.log(ngx.WARN, "ngx.status: ", ngx.status)[m
[31m-        end[m
[31m-    }[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: Bad Gateway[m
[31m---- error_log[m
[31m-ngx.status: 654[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 654[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/016-resp-header.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/016-resp-header.t[m
[1mdeleted file mode 100644[m
[1mindex b1f5e2a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/016-resp-header.t[m
[1m+++ /dev/null[m
[36m@@ -1,1443 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 38);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = "text/my-plain";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = "text/my-plain";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 3[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Length: 3[m
[31m---- response_body chop[m
[31m-Hel[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 302;[m
[31m-            ngx.header["Location"] = "http://agentzh.org/foo";[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 3[m
[31m-            ngx.header.content_length = nil[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set multi response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["X-Foo"] = {"a", "bc"}[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like chomp[m
[31m-X-Foo: a\r\n.*?X-Foo: bc\r\n[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = {"a", "bc"}[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: bc[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set multi response content-type header and clears it[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["X-Foo"] = {"a", "bc"}[m
[31m-            ngx.header["X-Foo"] = {}[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!X-Foo[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set multi response content-type header and clears it[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["X-Foo"] = {"a", "bc"}[m
[31m-            ngx.header["X-Foo"] = nil[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!X-Foo[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set multi response content-type header (multiple times)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["X-Foo"] = {"a", "bc"}[m
[31m-            ngx.header["X-Foo"] = {"a", "abc"}[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like chomp[m
[31m-X-Foo: a\r\n.*?X-Foo: abc\r\n[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: clear first, then add[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = {}[m
[31m-            ngx.header["Foo"] = {"a", "b"}[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- raw_response_headers_like eval[m
[31m-".*Foo: a\r[m
[31m-Foo: b.*"[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: first add, then clear, then add again[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = {"c", "d"}[m
[31m-            ngx.header["Foo"] = {}[m
[31m-            ngx.header["Foo"] = {"a", "b"}[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- raw_response_headers_like eval[m
[31m-".*Foo: a\r[m
[31m-Foo: b.*"[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: names are the same in the beginning (one value per key)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foox"] = "barx"[m
[31m-            ngx.header["Fooy"] = "bary"[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Foox: barx[m
[31m-Fooy: bary[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: names are the same in the beginning (multiple values per key)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foox"] = {"conx1", "conx2" }[m
[31m-            ngx.header["Fooy"] = {"cony1", "cony2" }[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Foox: conx1, conx2[m
[31m-Fooy: cony1, cony2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set header after ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        default_type "text/plain";[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hello")[m
[31m-            ngx.header.content_type = "text/foo"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body chop[m
[31m-hello[m
[31m---- error_log[m
[31m-attempt to set ngx.header.HEADER after sending out response headers[m
[31m---- no_error_log eval[m
[31m-["alert", "warn"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: get content-type header after ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        default_type "text/my-plain";[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hello, ")[m
[31m-            ngx.say(ngx.header.content_type)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-hello, text/my-plain[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: get content-length header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 2;[m
[31m-            ngx.say(ngx.header.content_length);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Content-Length: 2[m
[31m---- response_body[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: get content-length header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo = "bar";[m
[31m-            ngx.say(ngx.header.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-foo: bar[m
[31m---- response_body[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: get content-length header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = ngx.header.content_length[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua 'ngx.print("Hello")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-Hello5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: set and get content-length header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_length = 27[m
[31m-            ngx.var.footer = ngx.header.content_length[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua 'ngx.print("Hello")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-Hello27[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: get content-type header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = ngx.header.content_type[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        default_type 'abc/foo';[m
[31m-        content_by_lua 'ngx.print("Hello")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-Content-Type: abc/foo[m
[31m---- response_body[m
[31m-Helloabc/foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: set and get content-type header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_type = "text/blah"[m
[31m-            ngx.var.footer = ngx.header.content_type[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        default_type 'abc/foo';[m
[31m-        content_by_lua 'ngx.print("Hello")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-Content-Type: text/blah[m
[31m---- response_body[m
[31m-Hellotext/blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: get user header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = ngx.header.baz[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.baz = "bah"[m
[31m-            ngx.print("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-baz: bah[m
[31m---- response_body[m
[31m-Hellobah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: set and get user header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.baz = "foo"[m
[31m-            ngx.var.footer = ngx.header.baz[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.baz = "bah"[m
[31m-            ngx.print("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-baz: foo[m
[31m---- response_body[m
[31m-Hellofoo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: get multiple user header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = table.concat(ngx.header.baz, ", ")[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.baz = {"bah", "blah"}[m
[31m-            ngx.print("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- raw_response_headers_like eval[m
[31m-"baz: bah\r[m
[31m-.*?baz: blah"[m
[31m---- response_body[m
[31m-Hellobah, blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: set and get multiple user header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.baz = {"foo", "baz"}[m
[31m-            ngx.var.footer = table.concat(ngx.header.baz, ", ")[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.baz = {"bah", "hah"}[m
[31m-            ngx.print("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- raw_response_headers_like eval[m
[31m-"baz: foo\r[m
[31m-.*?baz: baz"[m
[31m---- response_body[m
[31m-Hellofoo, baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: get non-existant header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.header.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-!foo[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: get non-existant header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo = {"bah", "baz", "blah"}[m
[31m-            ngx.header.foo = nil[m
[31m-            ngx.say(ngx.header.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-!foo[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: override domains in the cookie[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hello;[m
[31m-        add_header Set-Cookie 'foo=bar; Domain=backend.int';[m
[31m-        add_header Set-Cookie 'baz=bah; Domain=backend.int';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-        header_filter_by_lua '[m
[31m-            local cookies = ngx.header.set_cookie[m
[31m-            if not cookies then return end[m
[31m-            if type(cookies) ~= "table" then cookies = {cookies} end[m
[31m-            local newcookies = {}[m
[31m-            for i, val in ipairs(cookies) do[m
[31m-                local newval = string.gsub(val, "([dD]omain)=[%w_-\\\\.]+",[m
[31m-                          "%1=external.domain.com")[m
[31m-                table.insert(newcookies, newval)[m
[31m-            end[m
[31m-            ngx.header.set_cookie = newcookies[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-Set-Cookie: foo=bar; Domain=external.domain.com, baz=bah; Domain=external.domain.com[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: set single value to cache-control[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "private"[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: private[m
[31m---- response_body[m
[31m-Cache-Control: private[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: set multi values to cache-control[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store" }[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: private, no-store[m
[31m---- response_body_like chop[m
[31m-^Cache-Control: private[;,] no-store$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: set multi values to cache-control and override it with a single value[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store" }[m
[31m-            ngx.header.cache_control = { "no-cache" }[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-            ngx.say("Cache-Control: ", ngx.header.cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: no-cache[m
[31m---- response_body[m
[31m-Cache-Control: no-cache[m
[31m-Cache-Control: no-cache[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: set multi values to cache-control and override it with multiple values[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store" }[m
[31m-            ngx.header.cache_control = { "no-cache", "blah", "foo" }[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-            ngx.say("Cache-Control: ", table.concat(ngx.header.cache_control, ", "))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: no-cache, blah, foo[m
[31m---- response_body_like chop[m
[31m-^Cache-Control: no-cache[;,] blah[;,] foo[m
[31m-Cache-Control: no-cache[;,] blah[;,] foo$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: set the www-authenticate response header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.www_authenticate = "blah"[m
[31m-            ngx.say("WWW-Authenticate: ", ngx.var.sent_http_www_authenticate)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-WWW-Authenticate: blah[m
[31m---- response_body[m
[31m-WWW-Authenticate: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: set and clear the www-authenticate response header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo = "blah"[m
[31m-            ngx.header.foo = nil[m
[31m-            ngx.say("Foo: ", ngx.var.sent_http_foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-!Foo[m
[31m---- response_body[m
[31m-Foo: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: set multi values to cache-control and override it with multiple values (to reproduce a bug)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store", "foo", "bar", "baz" }[m
[31m-            ngx.header.cache_control = {}[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-        add_header Cache-Control "blah";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: blah[m
[31m---- response_body[m
[31m-Cache-Control: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: set last-modified and return 304[m
[31m---- config[m
[31m-  location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Last-Modified"] = ngx.http_time(1290079655)[m
[31m-            ngx.say(ngx.header["Last-Modified"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 18 Nov 2010 11:27:35 GMT[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 18 Nov 2010 11:27:35 GMT[m
[31m---- error_code: 304[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: set last-modified and return 200[m
[31m---- config[m
[31m-  location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Last-Modified"] = ngx.http_time(1290079655)[m
[31m-            ngx.say(ngx.header["Last-Modified"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 18 Nov 2010 11:27:34 GMTT[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 18 Nov 2010 11:27:35 GMT[m
[31m---- response_body[m
[31m-Thu, 18 Nov 2010 11:27:35 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: set response content-encoding header should bypass ngx_http_gzip_filter_module[m
[31m---- config[m
[31m-    default_type text/plain;[m
[31m-    gzip             on;[m
[31m-    gzip_min_length  1;[m
[31m-    gzip_types       text/plain;[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_encoding = "gzip";[m
[31m-            ngx.say("Hello, world, my dear friend!");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Hello, world, my dear friend![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: no transform underscores (write)[m
[31m---- config[m
[31m-    lua_transform_underscores_in_response_headers off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo_bar = "Hello"[m
[31m-            ngx.say(ngx.header.foo_bar)[m
[31m-            ngx.say(ngx.header["foo-bar"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- raw_response_headers_like eval[m
[31m-"\r\nfoo_bar: Hello\r\n"[m
[31m---- response_body[m
[31m-Hello[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: with transform underscores (write)[m
[31m---- config[m
[31m-    lua_transform_underscores_in_response_headers on;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo_bar = "Hello"[m
[31m-            ngx.say(ngx.header.foo_bar)[m
[31m-            ngx.say(ngx.header["foo-bar"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- raw_response_headers_like eval[m
[31m-"\r\nfoo-bar: Hello\r\n"[m
[31m---- response_body[m
[31m-Hello[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: github issue #199: underscores in lua variables[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-          ngx.header.content_type = "text/my-plain"[m
[31m-[m
[31m-          local results = {}[m
[31m-          results.something = "hello"[m
[31m-          results.content_type = "anything"[m
[31m-          results.somehing_else = "hi"[m
[31m-[m
[31m-          local arr = {}[m
[31m-          for k in pairs(results) do table.insert(arr, k) end[m
[31m-          table.sort(arr)[m
[31m-          for i, k in ipairs(arr) do[m
[31m-            ngx.say(k .. ": " .. results[k])[m
[31m-          end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m-[m
[31m---- response_body[m
[31m-content_type: anything[m
[31m-somehing_else: hi[m
[31m-something: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: set multiple response header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 50 do[m
[31m-                ngx.header["X-Direct-" .. i] = "text/my-plain-" .. i;[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(ngx.header["X-Direct-50"]);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-text/my-plain-50[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: set multiple response header and then reset and then clear[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 50 do[m
[31m-                ngx.header["X-Direct-" .. i] = "text/my-plain-" .. i;[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 50 do[m
[31m-                ngx.header["X-Direct-" .. i] = "text/my-plain"[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 50 do[m
[31m-                ngx.header["X-Direct-" .. i] = nil[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: set response content-type header for multiple times[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = "text/my-plain";[m
[31m-            ngx.header.content_type = "text/my-plain-2";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain-2[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: set Last-Modified response header for multiple times[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = ngx.http_time(1290079655)[m
[31m-            ngx.header.last_modified = ngx.http_time(1290079654)[m
[31m-            ngx.say("ok");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 18 Nov 2010 11:27:34 GMT[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: set Last-Modified response header and then clear[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = ngx.http_time(1290079655)[m
[31m-            ngx.header.last_modified = nil[m
[31m-            ngx.say("ok");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Last-Modified[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: github #20: segfault caused by the nasty optimization in the nginx core (write)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.foo = 1[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/t/[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: github #20: segfault caused by the nasty optimization in the nginx core (read)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        header_filter_by_lua '[m
[31m-            local v = ngx.header.foo[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/t/[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: github #20: segfault caused by the nasty optimization in the nginx core (read Location)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.Foo = ngx.header.location[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/t/[m
[31m-Foo: /t/[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: github #20: segfault caused by the nasty optimization in the nginx core (set Foo and read Location)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.Foo = 3[m
[31m-            ngx.header.Foo = ngx.header.location[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/t/[m
[31m-Foo: /t/[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: case sensitive cache-control header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["cache-Control"] = "private"[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- raw_response_headers_like chop[m
[31m-cache-Control: private[m
[31m---- response_body[m
[31m-Cache-Control: private[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: clear Cache-Control when there was no Cache-Control[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Cache-Control"] = nil[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- raw_response_headers_unlike eval[m
[31m-qr/Cache-Control/i[m
[31m---- response_body[m
[31m-Cache-Control: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            local s = "content_type"[m
[31m-            local v = ngx.header[s][m
[31m-            ngx.say("s = ", s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-s = content_type[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: set a number header name[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header[32] = "private"[m
[31m-            ngx.say("32: ", ngx.var.sent_http_32)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-32: private[m
[31m---- response_body[m
[31m-32: private[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: set a number header name (in a table value)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo = {32}[m
[31m-            ngx.say("foo: ", ngx.var.sent_http_foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-foo: 32[m
[31m---- response_body[m
[31m-foo: 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 57: random access resp headers[m
[31m---- config[m
[31m-    location /resp-header {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = "bar"[m
[31m-            ngx.header["Bar"] = "baz"[m
[31m-            ngx.say("Foo: ", ngx.resp.get_headers()["Foo"] or "nil")[m
[31m-            ngx.say("foo: ", ngx.resp.get_headers()["foo"] or "nil")[m
[31m-            ngx.say("Bar: ", ngx.resp.get_headers()["Bar"] or "nil")[m
[31m-            ngx.say("bar: ", ngx.resp.get_headers()["bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /resp-header[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: bar[m
[31m-foo: bar[m
[31m-Bar: baz[m
[31m-bar: baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 58: iterating through raw resp headers[m
[31m---- config[m
[31m-    location /resp-header {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = "bar"[m
[31m-            ngx.header["Bar"] = "baz"[m
[31m-            local h = {}[m
[31m-            for k, v in pairs(ngx.resp.get_headers(nil, true)) do[m
[31m-                h[k] = v[m
[31m-            end[m
[31m-            ngx.say("Foo: ", h["Foo"] or "nil")[m
[31m-            ngx.say("foo: ", h["foo"] or "nil")[m
[31m-            ngx.say("Bar: ", h["Bar"] or "nil")[m
[31m-            ngx.say("bar: ", h["bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /resp-header[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: bar[m
[31m-foo: nil[m
[31m-Bar: baz[m
[31m-bar: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 59: removed response headers[m
[31m---- config[m
[31m-    location /resp-header {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = "bar"[m
[31m-            ngx.header["Foo"] = nil[m
[31m-            ngx.header["Bar"] = "baz"[m
[31m-            ngx.say("Foo: ", ngx.resp.get_headers()["Foo"] or "nil")[m
[31m-            ngx.say("foo: ", ngx.resp.get_headers()["foo"] or "nil")[m
[31m-            ngx.say("Bar: ", ngx.resp.get_headers()["Bar"] or "nil")[m
[31m-            ngx.say("bar: ", ngx.resp.get_headers()["bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /resp-header[m
[31m---- response_headers[m
[31m-!Foo[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: nil[m
[31m-foo: nil[m
[31m-Bar: baz[m
[31m-bar: baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 60: built-in Content-Type header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Content-Type: ", hs["Content-Type"])[m
[31m-            print("my content-type: ", hs["content-type"])[m
[31m-            print("my content_type: ", hs["content_type"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Content-Type: text/plain[m
[31m-my content-type: text/plain[m
[31m-my content_type: text/plain[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 61: built-in Content-Length header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Content-Length: ", hs["Content-Length"])[m
[31m-            print("my content-length: ", hs["content-length"])[m
[31m-            print("my content_length: ", hs.content_length)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Content-Length: 3[m
[31m-my content-length: 3[m
[31m-my content_length: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 62: built-in Connection header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Connection: ", hs["Connection"])[m
[31m-            print("my connection: ", hs["connection"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Connection: close[m
[31m-my connection: close[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 63: built-in Transfer-Encoding header (chunked)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Transfer-Encoding: ", hs["Transfer-Encoding"])[m
[31m-            print("my transfer-encoding: ", hs["transfer-encoding"])[m
[31m-            print("my transfer_encoding: ", hs.transfer_encoding)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Transfer-Encoding: chunked[m
[31m-my transfer-encoding: chunked[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 64: built-in Transfer-Encoding header (none)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Transfer-Encoding: ", hs["Transfer-Encoding"])[m
[31m-            print("my transfer-encoding: ", hs["transfer-encoding"])[m
[31m-            print("my transfer_encoding: ", hs.transfer_encoding)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Transfer-Encoding: nil[m
[31m-my transfer-encoding: nil[m
[31m-my transfer_encoding: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 65: set Location (no host)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.location = "/foo/bar"[m
[31m-            return ngx.exit(301)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-Location: /foo/bar[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 66: set Location (with host)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.location = "http://test.com/foo/bar"[m
[31m-            return ngx.exit(301)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-Location: http://test.com/foo/bar[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 67: ngx.header["Content-Type"] with ngx_gzip[m
[31m---- config[m
[31m-    gzip             on;[m
[31m-    gzip_min_length  1;[m
[31m-    location = /test2 {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Content-Type"] = "text/html; charset=utf-8"[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test2[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m-Content-Type: text/html; charset=utf-8[m
[31m---- response_body_like chomp[m
[31m-[^[:ascii:]]+[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 68: ngx.header["Content-Type"] with "; blah"[m
[31m---- config[m
[31m-    location = /test2 {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Content-Type"] = "; blah"[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test2[m
[31m---- response_headers[m
[31m-!Content-Encoding[m
[31m-Content-Type: ; blah[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/017-exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/017-exec.t[m
[1mdeleted file mode 100644[m
[1mindex 4c7a918..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/017-exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,575 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_shuffle();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/hi");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty uri arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec();[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: too many args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec(1, 2, 3, 4);[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: null uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec(nil)[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/hi", "Yichun Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello Yichun Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: args in uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/hi?agentzh")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello agentzh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello a=Yichun&b=Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location @hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exec after location capture (simple echo)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('/b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exec after location capture (memc)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        set $memc_key 'hello world';[m
[31m-        set $memc_value 'hello hello hello world world world';[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        set $memc_key 'hello world';[m
[31m-        set $memc_cmd get;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('/b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body: hello hello hello world world world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exec after named location capture (simple echo)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location @b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('@b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exec after named location capture (memc)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        set $memc_key 'hello world';[m
[31m-        set $memc_value 'hello hello hello world world world';[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location @b {[m
[31m-        set $memc_key 'hello world';[m
[31m-        set $memc_cmd get;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('@b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body: hello hello hello world world world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (content)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-        #echo hello;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (content + named location)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-        #echo hello;[m
[31m-    }[m
[31m-    location @p {[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (content + post subrequest)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-        #echo hello;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/blah")[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: pcall safe[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f ()[m
[31m-                ngx.exec("/hi")[m
[31m-            end[m
[31m-[m
[31m-            pcall(f)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: lua table as "args" parameter[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = { foo = 3, bar = 4 }[m
[31m-            ngx.exec("/hi", args)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "foo = $arg_foo";[m
[31m-        echo "bar = $arg_bar";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-foo = 3[m
[31m-bar = 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: jump to internal locations requires ctx cleared[m
[31m---- config[m
[31m-    location @proxy {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: exec + rewrite + named locations[m
[31m---- config[m
[31m-    location @proxy {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: exec(named location) in subrequests[m
[31m---- config[m
[31m-    location /entry {[m
[31m-        echo_location /foo;[m
[31m-        echo_location /foo2;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      content_by_lua '[m
[31m-          ngx.exec("@bar")[m
[31m-      ';[m
[31m-  }[m
[31m-  location /foo2 {[m
[31m-      content_by_lua '[m
[31m-          ngx.exec("@bar")[m
[31m-      ';[m
[31m-  }[m
[31m-[m
[31m-  location @bar {[m
[31m-      proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-  }[m
[31m-  location /bar {[m
[31m-      echo hello;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /entry[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exec(normal location) in subrequests[m
[31m---- config[m
[31m-    location /entry {[m
[31m-        echo_location /foo;[m
[31m-        echo_location /foo2;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      content_by_lua '[m
[31m-          ngx.exec("/baz")[m
[31m-      ';[m
[31m-  }[m
[31m-  location /foo2 {[m
[31m-      content_by_lua '[m
[31m-          ngx.exec("/baz")[m
[31m-      ';[m
[31m-  }[m
[31m-[m
[31m-  location /baz {[m
[31m-      proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-  }[m
[31m-  location /bar {[m
[31m-      echo hello;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /entry[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: content_by_lua + ngx.exec + subrequest capture[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/test_loc");[m
[31m-            ngx.print("hello, ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /test_loc {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m-    location @proxy {[m
[31m-        #echo proxy;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #echo_status 201;[m
[31m-        echo bah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: jump to an internal location[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            return ngx.exec("/proxy", ngx.var.args)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/dummy;[m
[31m-    }[m
[31m-[m
[31m-    location = /dummy {[m
[31m-        echo -n dummy;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t?foo"][m
[31m---- response_body eval[m
[31m-["dummy", "dummy"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/018-ndk.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/018-ndk.t[m
[1mdeleted file mode 100644[m
[1mindex d68306b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/018-ndk.t[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            local s = ndk.set_var.set_escape_uri(" :")[m
[31m-            local r = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(r)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-%20%3A[m
[31m-a b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: directive not found[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            local s = ndk.set_var.set_escape_uri_blah_blah(" :")[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: directive not found[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            local s = ndk.set_var.content_by_lua(" :")[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: directive not found[m
[31m---- config[m
[31m-    location /read {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.Foo = ndk.set_var.set_escape_uri(" %")[m
[31m-        ';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Foo: %20%25[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bug: ndk.set_var not initialize ngx_http_variable_value_t variable properly[m
[31m---- config[m
[31m-   location /luaset {[m
[31m-     content_by_lua "[m
[31m-[m
[31m-       local version = '2011.10.13+0000'[m
[31m-       local e_version = ndk.set_var.set_encode_base32(version)[m
[31m-       local s_version= ndk.set_var.set_quote_sql_str(version)[m
[31m-       ngx.say(e_version)[m
[31m-       ngx.say(s_version)[m
[31m-     ";[m
[31m-   }[m
[31m---- request[m
[31m-GET /luaset[m
[31m---- response_body[m
[31m-68o32c9e64o2sc9j5co30c1g[m
[31m-'2011.10.13+0000'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set_by_lua[m
[31m---- config[m
[31m-    location /read {[m
[31m-        set_by_lua $r '[m
[31m-            return ndk.set_var.set_unescape_uri("a%20b")[m
[31m-        ';[m
[31m-        echo $r;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-a b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: header_filter_by_lua[m
[31m---- config[m
[31m-    location /read {[m
[31m-        set $foo '';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say(ngx.var.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.foo = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-a b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: log_by_lua[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            local foo = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-            ngx.log(ngx.WARN, "foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-ok[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-foo = a b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.timer.*[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            ngx.timer.at(0, function ()[m
[31m-                local foo = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-                ngx.log(ngx.WARN, "foo = ", foo)[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-ok[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-foo = a b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/019-const.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/019-const.t[m
[1mdeleted file mode 100644[m
[1mindex fe79bfb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/019-const.t[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.OK)[m
[31m-            ngx.say(ngx.AGAIN)[m
[31m-            ngx.say(ngx.DONE)[m
[31m-            ngx.say(ngx.ERROR)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-0[m
[31m--2[m
[31m--4[m
[31m--1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http constants[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.HTTP_GATEWAY_TIMEOUT)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-504[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/020-subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/020-subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 88ac1b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/020-subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,2875 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#worker_connections(1014);[m
[31m-#log_level('warn');[m
[31m-#master_process_enabled(1);[m
[31m-[m
[31m-no_root_location;[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 23);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: DELETE[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m---- error_log[m
[31m-lua http subrequest "/other?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: DELETE (proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: POST (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-POST[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: HEAD[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_HEAD });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: explicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: implicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: implicit GET (empty option table)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo", {})[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: PUT (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-        #echo "[$http_content_length]";[m
[31m-        echo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo $echo_request_method;[m
[31m-        echo -n "[$http_content_length]";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-            ngx.say(res.body)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-PUT[m
[31m-hello[m
[31m-GET[m
[31m-[][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: POST (with body, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-POST[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd "";[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush",[m
[31m-                { share_all_vars = true });[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { share_all_vars = true });[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello", share_all_vars = true });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc", { share_all_vars = true });[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: emtpy args option table[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = {} })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval: "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: non-empty args option table (1 pair)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-fo%3D=%3D%3E[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: non-empty args option table (2 pairs)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>",[m
[31m-                    ["="] = ":" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:fo%3D=%3D%3E\&%3D=%3A|%3D=%3A\&fo%3D=%3D%3E)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: non-empty args option table (2 pairs, no special chars)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { foo = 3,[m
[31m-                    bar = "hello" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:bar=hello\&foo=3|foo=3\&bar=hello)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: non-empty args option table (number key)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { [57] = "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-attempt to use a non-string key in the "args" option table[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: non-empty args option table (plain arrays)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-attempt to use a non-string key in the "args" option table[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = { b = 4 } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = "b=4" })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: is_subrequest in main request[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            if ngx.is_subrequest then[m
[31m-                ngx.say("sub req")[m
[31m-            else[m
[31m-                ngx.say("main req")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-main req[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: is_subrequest in sub request[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            if ngx.is_subrequest then[m
[31m-                ngx.say("sub req")[m
[31m-            else[m
[31m-                ngx.say("main req")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub req[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: is_subrequest in sub request in set_by_lua[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set_by_lua $a '[m
[31m-            if ngx.is_subrequest then[m
[31m-                return "sub req"[m
[31m-            else[m
[31m-                return "main req"[m
[31m-            end[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub req[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: header inheritance bug (without body) (github issue 38)[m
[31m-https://github.com/chaoslawful/lua-nginx-module/issues/38[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo -n $http_foo;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-            ngx.say("header foo: [", res.body, "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body[m
[31m-header foo: [bar][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: header inheritance bug (with body) (github issue 38)[m
[31m-https://github.com/chaoslawful/lua-nginx-module/issues/38[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo -n $http_foo;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { body = "abc" });[m
[31m-            ngx.say("header foo: [", res.body, "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body[m
[31m-header foo: [bar][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: lua calls lua via subrequests[m
[31m---- config[m
[31m-    location /a {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, a");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /b {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, b");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /c {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, c");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res1, res2 = ngx.location.capture_multi({{"/a"}, {"/b"}})[m
[31m-            res3 = ngx.location.capture("/c")[m
[31m-            ngx.print(res1.body, res2.body, res3.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, a[m
[31m-hello, b[m
[31m-hello, c[m
[31m---- error_log[m
[31m-lua reuse free buf memory[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: POST (with body, proxy method, main request is a POST too)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hi[m
[31m---- response_body chomp[m
[31m-POST[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: Last-Modified response header for static file subrequest[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo.html")[m
[31m-[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.say(res.header["Last-Modified"])[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- user_files[m
[31m->>> foo.html[m
[31m-hello, static file[m
[31m---- response_body_like chomp[m
[31m-^200[m
[31m-[A-Za-z]+, \d{1,2} [A-Za-z]+ \d{4} \d{2}:\d{2}:\d{2} GMT[m
[31m-hello, static file$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: custom ctx table for subrequest[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = "bar";[m
[31m-        ';[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            res = ngx.location.capture("/sub", { ctx = ctx })[m
[31m-[m
[31m-            ngx.say(ctx.foo);[m
[31m-            ngx.say(ngx.ctx.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-bar[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: share the ctx with the parent[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = "bar";[m
[31m-        ';[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub", { ctx = ngx.ctx })[m
[31m-            ngx.say(ngx.ctx.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: test memcached with subrequests[m
[31m---- http_config[m
[31m-    upstream memc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 100;[m
[31m-    }[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key some_key;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass memc;[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello 1234" });[m
[31m-            -- ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("some_key: " .. res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-some_key: hello 1234[m
[31m---- error_log[m
[31m-lua reuse free buf chain, but reallocate memory because[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: main POST, sub GET (main does not read the body)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_method)[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-        #proxy_pass http://127.0.0.1:8892/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello, world[m
[31m---- response_body[m
[31m-GET[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: main POST, sub GET (main has read the body)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_method)[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-        #proxy_pass http://127.0.0.1:8892/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello, world[m
[31m---- response_body[m
[31m-GET[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: main POST, sub POST (inherit bodies directly)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_method)[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-        #proxy_pass http://127.0.0.1:8892/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello, world[m
[31m---- response_body[m
[31m-POST[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: main POST, sub PUT (inherit bodies directly)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_method)[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-        #proxy_pass http://127.0.0.1:8892/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_PUT });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello, world[m
[31m---- response_body[m
[31m-PUT[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: recursive calls[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/t")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-lua subrequests cycle while processing "/t"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: OPTIONS[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_OPTIONS });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-OPTIONS[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: OPTIONS with a body[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_OPTIONS, body = "hello world" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chop[m
[31m-OPTIONS[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: encode args table with a multi-value arg.[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local res = ngx.location.capture("/sub", { args = args })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t?r[]=http%3A%2F%2Fajax.googleapis.com%3A80%2Fajax%2Flibs%2Fjquery%2F1.7.2%2Fjquery.min.js&r[]=http%3A%2F%2Fajax.googleapis.com%3A80%2Fajax%2Flibs%2Fdojo%2F1.7.2%2Fdojo%2Fdojo.js.uncompressed.js[m
[31m---- response_body[m
[31m-r%5B%5D=http%3A%2F%2Fajax.googleapis.com%3A80%2Fajax%2Flibs%2Fjquery%2F1.7.2%2Fjquery.min.js&r%5B%5D=http%3A%2F%2Fajax.googleapis.com%3A80%2Fajax%2Flibs%2Fdojo%2F1.7.2%2Fdojo%2Fdojo.js.uncompressed.js[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: subrequests finalized with NGX_ERROR[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-status: 500[m
[31m-body: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: subrequests finalized with 500[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-status: 500[m
[31m-body: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: subrequests with an output body filter returning NGX_ERROR[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        echo hello world;[m
[31m-        body_filter_by_lua '[m
[31m-            return ngx.ERROR[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- stap2[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m---- response_body[m
[31m---- error_code[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: subrequests truncated in its response body due to premature connection close (nonbuffered)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key 'foo';[m
[31m-        #set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:19112; #$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/memc")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19112[m
[31m---- tcp_query_len: 9[m
[31m---- tcp_reply eval[m
[31m-"VALUE foo 0 1024\r\nhello world"[m
[31m-[m
[31m---- stap2[m
[31m-F(ngx_http_lua_capture_body_filter) {[m
[31m-    if (pid() == target() && $r != $r->main) {[m
[31m-        printf("lua capture body output: %s\n", ngx_chain_dump($in))[m
[31m-        if ($in->buf->last_in_chain) {[m
[31m-            print_ubacktrace()[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: subrequests truncated in its response body due to upstream read timeout (nonbuffered)[m
[31m---- config[m
[31m-    memc_read_timeout 100ms;[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key 'foo';[m
[31m-        #set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:19112; #$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/memc")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19112[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"VALUE foo 0 1024\r\nhello world"[m
[31m-[m
[31m---- stap2[m
[31m-F(ngx_http_lua_capture_body_filter) {[m
[31m-    if (pid() == target() && $r != $r->main) {[m
[31m-        printf("lua capture body output: %s\n", ngx_chain_dump($in))[m
[31m-        //if ($in->buf->last_in_chain) {[m
[31m-            print_ubacktrace()[m
[31m-        //}[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=504[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^status: 200[m
[31m-body: [^\n]*[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: subrequests truncated in its response body due to premature connection close (buffered)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\nContent-Length: 1024\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: subrequests truncated in its response body due to read timeout (buffered)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\nContent-Length: 1024\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: [m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: subrequests truncated in its response body due to premature connection close (buffered, no content-length)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=0[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: false[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: subrequests truncated in its response body due to read timeout (buffered, no content-length)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: [m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: subrequests truncated in its response body due to premature connection close (nonbuffered, no content-length)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=0[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: false[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: subrequests truncated in its response body due to read timeout (nonbuffered, no content-length)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_read_timeout 500ms;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=504[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: forwarding in-memory request bodies to multiple subrequests[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res = ngx.location.capture("/other",[m
[31m-                    { method = ngx.HTTP_POST });[m
[31m-[m
[31m-                ngx.say(res.body)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request eval[m
[31m-"POST /lua[m
[31m-" . "hello world"[m
[31m-[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: forwarding in-file request bodies to multiple subrequests (client_body_in_file_only)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    client_body_in_file_only on;[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res = ngx.location.capture("/other",[m
[31m-                    { method = ngx.HTTP_POST });[m
[31m-[m
[31m-                ngx.say(res.body)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request eval[m
[31m-"POST /lua[m
[31m-" . "hello world"[m
[31m-[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: forwarding in-file request bodies to multiple subrequests (exceeding client_body_buffer_size)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        #client_body_in_file_only on;[m
[31m-        client_body_buffer_size 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res = ngx.location.capture("/other",[m
[31m-                    { method = ngx.HTTP_POST });[m
[31m-[m
[31m-                ngx.say(res.body)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /lua[m
[31m-" . ("hello world" x 100)[m
[31m-[m
[31m---- stap2[m
[31m-global valid = 0[m
[31m-global fds[m
[31m-[m
[31m-F(ngx_http_handler) { valid = 1  }[m
[31m-[m
[31m-probe syscall.open {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        print(name, "(", argstr, ")")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.close {[m
[31m-    if (valid && pid() == target() && fds[sprintf("%d", $fd)]) {[m
[31m-        println(name, "(", argstr, ")")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.unlink {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(name, "(", argstr, ")")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.open.return {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(" = ", retstr)[m
[31m-        fds[retstr] = 1[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_subrequest) {[m
[31m-    println("lua subrequest")[m
[31m-}[m
[31m-[m
[31m-F(ngx_output_chain) {[m
[31m-    printf("output chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_pool_run_cleanup_file) {[m
[31m-    println("clean up file: ", $fd)[m
[31m-}[m
[31m-[m
[31m---- response_body eval[m
[31m-("hello world" x 100) . "\n"[m
[31m-. ("hello world" x 100) . "\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: subrequests truncated in its response body due to premature connection close (buffered + chunked)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\nb\r\nhello world\r"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: subrequests truncated in its response body due to premature connection close (nonbuffered + chunked)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\nb\r\nhello world\r"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 57: subrequests truncated in its response body due to read timeout (buffered + chunked)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\nb\r\nhello world\r"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: [m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 58: good chunked response (buffered)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n0\r\n\r\n"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=0 rc=0[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello[m
[31m-truncated: false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 59: good chunked response (nonbuffered)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n0\r\n\r\n"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=0 rc=0[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello[m
[31m-truncated: false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 60: subrequests truncated in its response body due to premature connection close (nonbuffered + proxy)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\nContent-Length: 1024\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 61: WebDAV methods[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "method: $echo_request_method";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local methods = {[m
[31m-                ngx.HTTP_MKCOL,[m
[31m-                ngx.HTTP_COPY,[m
[31m-                ngx.HTTP_MOVE,[m
[31m-                ngx.HTTP_PROPFIND,[m
[31m-                ngx.HTTP_PROPPATCH,[m
[31m-                ngx.HTTP_LOCK,[m
[31m-                ngx.HTTP_UNLOCK,[m
[31m-                ngx.HTTP_PATCH,[m
[31m-                ngx.HTTP_TRACE,[m
[31m-            }[m
[31m-[m
[31m-            for i, method in ipairs(methods) do[m
[31m-                res = ngx.location.capture("/other",[m
[31m-                    { method = method })[m
[31m-                ngx.print(res.body)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-method: MKCOL[m
[31m-method: COPY[m
[31m-method: MOVE[m
[31m-method: PROPFIND[m
[31m-method: PROPPATCH[m
[31m-method: LOCK[m
[31m-method: UNLOCK[m
[31m-method: PATCH[m
[31m-method: TRACE[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 62: by default DELETE subrequests don't forward request bodies[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-DELETE /lua[m
[31m-hello world[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 63: DELETE subrequests do forward request bodies when always_forward_body == true[m
[31m---- config[m
[31m-    location = /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE, always_forward_body = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-DELETE /lua[m
[31m-hello world[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 64: DELETE subrequests do forward request bodies when always_forward_body == true (on disk)[m
[31m---- config[m
[31m-    location = /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE, always_forward_body = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-DELETE /lua[m
[31m-hello world[m
[31m---- stap2[m
[31m-global c[m
[31m-probe process("$LIBLUA_PATH").function("rehashtab") {[m
[31m-    c++[m
[31m-    //print_ubacktrace()[m
[31m-    printf("rehash: %d\n", c)[m
[31m-}[m
[31m---- stap_out2[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 65: DELETE[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sub {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- stap[m
[31m-F(ngx_http_lua_capture_header_filter) {[m
[31m-    println("capture header filter")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_capture_body_filter) {[m
[31m-    println("capture body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-capture header filter[m
[31m-capture body filter[m
[31m-capture body filter[m
[31m-capture body filter[m
[31m-capture header filter[m
[31m-capture body filter[m
[31m-capture body filter[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 66: leafo test case 1 for assertion failures[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-        rewrite_by_lua "[m
[31m-          local req = ngx.req[m
[31m-          print(ngx.var._url)[m
[31m-[m
[31m-          for k,v in pairs(req.get_headers()) do[m
[31m-            if k ~= 'content-length' then[m
[31m-              req.clear_header(k)[m
[31m-            end[m
[31m-          end[m
[31m-[m
[31m-          if ngx.ctx.headers then[m
[31m-            for k,v in pairs(ngx.ctx.headers) do[m
[31m-              req.set_header(k, v)[m
[31m-            end[m
[31m-          end[m
[31m-        ";[m
[31m-[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass $_url;[m
[31m-    }[m
[31m-[m
[31m-    location /first {[m
[31m-      set $_url "";[m
[31m-      content_by_lua '[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          ctx = {[m
[31m-            headers = {[m
[31m-              ["Content-type"] = "application/x-www-form-urlencoded"[m
[31m-            }[m
[31m-          },[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          ctx = {[m
[31m-            headers = {[m
[31m-              ["x-some-date"] = "Sun, 01 Dec 2013 11:47:41 GMT",[m
[31m-              ["x-hello-world-header"] = "123412341234",[m
[31m-              ["Authorization"] = "Hello"[m
[31m-            }[m
[31m-          },[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-      ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /first[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-qr/Assertion .*? failed/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 67: leafo test case 2 for assertion failures[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-        rewrite_by_lua "[m
[31m-          local req = ngx.req[m
[31m-          print(ngx.var._url)[m
[31m-[m
[31m-          for k,v in pairs(req.get_headers()) do[m
[31m-            if k ~= 'content-length' then[m
[31m-              req.clear_header(k)[m
[31m-            end[m
[31m-          end[m
[31m-[m
[31m-          if ngx.ctx.headers then[m
[31m-            for k,v in pairs(ngx.ctx.headers) do[m
[31m-              req.set_header(k, v)[m
[31m-            end[m
[31m-          end[m
[31m-        ";[m
[31m-[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass $_url;[m
[31m-    }[m
[31m-[m
[31m-    location /second {[m
[31m-      set $_url "";[m
[31m-      content_by_lua '[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          method = ngx.HTTP_POST,[m
[31m-          body = ("x"):rep(600),[m
[31m-          ctx = {[m
[31m-            headers = {[m
[31m-              ["Content-type"] = "application/x-www-form-urlencoded"[m
[31m-            }[m
[31m-          },[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          ctx = {[m
[31m-            headers = {[m
[31m-              ["x-some-date"] = "Sun, 01 Dec 2013 11:47:41 GMT",[m
[31m-              ["x-hello-world-header"] = "123412341234",[m
[31m-              ["Authorization"] = "Hello"[m
[31m-            }[m
[31m-          },[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-      ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /second[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-hello[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-qr/Assertion .*? failed/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 68: fetch subrequest's builtin request headers[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo "sr: User-Agent: $http_user_agent";[m
[31m-        echo "sr: Host: $http_host";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: User-Agent: ", ngx.var.http_user_agent)[m
[31m-            ngx.say("pr: Host: ", ngx.var.http_host)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-User-Agent: foo[m
[31m---- response_body[m
[31m-sr: User-Agent: foo[m
[31m-sr: Host: localhost[m
[31m-pr: User-Agent: foo[m
[31m-pr: Host: localhost[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 69: modify subrequest's builtin request headers[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "bar")[m
[31m-        ';[m
[31m-        echo "sr: User-Agent: $http_user_agent";[m
[31m-        echo "sr: Host: $http_host";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: User-Agent: ", ngx.var.http_user_agent)[m
[31m-            ngx.say("pr: Host: ", ngx.var.http_host)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-User-Agent: foo[m
[31m---- response_body[m
[31m-sr: User-Agent: bar[m
[31m-sr: Host: localhost[m
[31m-pr: User-Agent: foo[m
[31m-pr: Host: localhost[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 70: modify subrequest's builtin request headers (main req is POST)[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "bar")[m
[31m-        ';[m
[31m-        echo "sr: User-Agent: $http_user_agent";[m
[31m-        echo "sr: Host: $http_host";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: User-Agent: ", ngx.var.http_user_agent)[m
[31m-            ngx.say("pr: Host: ", ngx.var.http_host)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-User-Agent: foo[m
[31m---- response_body[m
[31m-sr: User-Agent: bar[m
[31m-sr: Host: localhost[m
[31m-pr: User-Agent: foo[m
[31m-pr: Host: localhost[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 71: duplicate request headers (main req is POST)[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo "sr: Cookie: $http_cookie";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: Cookie: ", ngx.var.http_cookie)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Cookie: foo[m
[31m-Cookie: bar[m
[31m---- response_body[m
[31m-sr: Cookie: foo; bar[m
[31m-pr: Cookie: foo; bar[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 72: duplicate request headers (main req is GET)[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo "sr: Cookie: $http_cookie";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: Cookie: ", ngx.var.http_cookie)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo[m
[31m-Cookie: bar[m
[31m---- response_body[m
[31m-sr: Cookie: foo; bar[m
[31m-pr: Cookie: foo; bar[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 73: HEAD subrequest (github #347)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/index.html",[m
[31m-                { method = ngx.HTTP_HEAD });[m
[31m-            ngx.say("content-length: ", res.header["Content-Length"])[m
[31m-            ngx.say("body: [", res.body, "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^content-length: \d+[m
[31m-body: \[\][m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 74: image_filter + ngx.location.capture[m
[31m-ngx_http_image_filter_module's header filter intercepts[m
[31m-the header filter chain so the r->header_sent flag won't[m
[31m-get set right after the header filter chain is first invoked.[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-location = /back {[m
[31m-    empty_gif;[m
[31m-}[m
[31m-[m
[31m-location = /t {[m
[31m-    image_filter rotate 90;[m
[31m-[m
[31m-    content_by_lua '[m
[31m-        local res = ngx.location.capture("/back")[m
[31m-        for k, v in pairs(res.header) do[m
[31m-            ngx.header[k] = v[m
[31m-        end[m
[31m-        ngx.status = res.status[m
[31m-        ngx.print(res.body)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: .[m
[31m---- stap[m
[31m-F(ngx_http_image_header_filter) {[m
[31m-    println("image header filter")[m
[31m-}[m
[31m---- stap_out[m
[31m-image header filter[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 75: WebDAV + MOVE[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local file1 = "/file1.txt"[m
[31m-            local file2 = "/file2.txt"[m
[31m-            ngx.req.set_header( "Destination", file2 )[m
[31m-            local res = ngx.location.capture([m
[31m-                file1, { method = ngx.HTTP_MOVE }[m
[31m-            )[m
[31m-[m
[31m-            ngx.say([m
[31m-                "MOVE ", file1, " -> ", file2,[m
[31m-                ", response status: ", res.status[m
[31m-            )[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location / {[m
[31m-        dav_methods MOVE;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> file1.txt[m
[31m-hello, world![m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-MOVE /file1.txt -> /file2.txt, response status: 204[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 76: WebDAV + DELETE[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local file = "/file.txt"[m
[31m-            local res = ngx.location.capture([m
[31m-                file, { method = ngx.HTTP_DELETE }[m
[31m-            )[m
[31m-[m
[31m-            ngx.say([m
[31m-                "DELETE ", file,[m
[31m-                ", response status: ", res.status[m
[31m-            )[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location / {[m
[31m-        dav_methods DELETE;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> file.txt[m
[31m-hello, world![m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-DELETE /file.txt, response status: 204[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 200[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/021-cookie-time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/021-cookie-time.t[m
[1mdeleted file mode 100644[m
[1mindex c00bbea..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/021-cookie-time.t[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cookie_time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.cookie_time(1290079655))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Thu, 18-Nov-10 11:27:35 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cookie_time in set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $a '[m
[31m-            return ngx.cookie_time(1290079655)[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Thu, 18-Nov-10 11:27:35 GMT[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/022-redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/022-redirect.t[m
[1mdeleted file mode 100644[m
[1mindex 57c7add..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/022-redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,220 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo");[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: explicit 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo", ngx.HTTP_MOVED_TEMPORARILY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: explicit 301[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo", ngx.HTTP_MOVED_PERMANENTLY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad rc[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo", 404);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-only ngx.HTTP_MOVED_TEMPORARILY, ngx.HTTP_MOVED_PERMANENTLY, and ngx.HTTP_TEMPORARY_REDIRECT are allowed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: no args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect()[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: relative uri[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello, world;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT/echo;[m
[31m-    }[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/proxy")[m
[31m-            ngx.redirect("/echo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like: Location: /echo\r\n[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: default 302 (with uri args)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo?bar=3");[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo?bar=3[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: location.capture + ngx.redirect[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello, world;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT/echo;[m
[31m-    }[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/proxy")[m
[31m-            ngx.location.capture("/proxy")[m
[31m-            ngx.redirect("/echo")[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /read/1", "GET /read/2"][m
[31m---- error_code eval[m
[31m-[302, 302][m
[31m---- response_body eval[m
[31m-[qr/302 Found/, qr/302 Found/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: explicit 307[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo", ngx.HTTP_TEMPORARY_REDIRECT);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body_like: 307 Temporary Redirect[m
[31m---- error_code: 307[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: explicit 307 with args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo?a=b&c=d", ngx.HTTP_TEMPORARY_REDIRECT);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo?a=b&c=d[m
[31m---- response_body_like: 307 Temporary Redirect[m
[31m---- error_code: 307[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: explicit 307[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo?a=b&c=d", 307);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo?a=b&c=d[m
[31m---- response_body_like: 307 Temporary Redirect[m
[31m---- error_code: 307[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/client-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/client-abort.t[m
[1mdeleted file mode 100644[m
[1mindex e970802..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/client-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,851 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: subrequest + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: subrequest + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: fail[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad things happen[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: subrequest + stop (proxy, ignore client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: subrequest + stop (proxy, check client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort off;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: need body on + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        lua_need_request_body on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.req.socket + receive() + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.req.socket + receive(N) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(5)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.req.socket + receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:lua check broken conn[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup|lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.req.socket + m * receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(1)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.req.socket + receiveuntil + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.req.socket + receiveuntil + it(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it(2)[m
[31m-            it(3)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: cosocket + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "failed to get socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("blpop nonexist 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.log(ngx.ERR, "about to receive")[m
[31m-[m
[31m-            local res, err = sock:receive()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to receive query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "res: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.req.socket + receive n < content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 100\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to receive: client aborted[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.req.socket + receive n == content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.sleep(1)[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.req.socket + receive n == content-length + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: exec to lua + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exec to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: exec (named location) to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location @t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/exec.t[m
[1mdeleted file mode 100644[m
[1mindex a063b5b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,379 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/hi");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty uri arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec();[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: too many args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec(1, 2, 3, 4);[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: null uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec(nil)[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/hi", "Yichun Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello Yichun Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: args in uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/hi?agentzh")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello agentzh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello a=Yichun&b=Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location @hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exec after location capture[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua_file 'html/test.lua';[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('/b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exec after (named) location capture[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location @b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('@b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (rewrite)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-        #local res = ngx.location.capture("/sub")[m
[31m-        #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (rewrite + named location)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location @p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (rewrite + post subrequest)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/blah")[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: rewrite_by_lua + ngx.exec + subrequest capture[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/test_loc");[m
[31m-            ngx.print("hello, ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /test_loc {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m-    location @proxy {[m
[31m-        #echo proxy;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo bah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: rewrite_by_lua_file + ngx.exec + subrequest capture[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/test_loc");[m
[31m-            ngx.print("hello, ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /test_loc {[m
[31m-        rewrite_by_lua_file html/jump.lua;[m
[31m-    }[m
[31m-    location @proxy {[m
[31m-        #echo proxy;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo bah;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> jump.lua[m
[31m-ngx.exec("@proxy")[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, bah[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/exit.t[m
[1mdeleted file mode 100644[m
[1mindex 9d292f7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,598 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#repeat_each(20000);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#log_level('debug');[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1024);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: throw 403[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.exit(403);ngx.say('hi')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: throw 404[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.exit(404);ngx.say('hi');";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 404[m
[31m---- response_body_like: 404 Not Found[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: throw 404 after sending the header and partial body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.say('hi');ngx.exit(404);ngx.say(', you')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_log[m
[31m-attempt to set status 404 via ngx.exit after sending out the response status 200[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: working with ngx_auth_request (succeeded)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        rewrite_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentzh[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Logged in[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: working with ngx_auth_request (failed)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        rewrite_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentz[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: working with ngx_auth_request (simplest form, w/o ngx_memc)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        rewrite_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m-print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m-print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    -- ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: working with ngx_auth_request (simplest form)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        rewrite_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: working with ngx_auth_request[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_b {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream_list memc_cluster memc_a memc_b;[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        rewrite_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: working with ngx_auth_request[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 300;[m
[31m-    }[m
[31m-[m
[31m-    #upstream_list memc_cluster memc_a memc_b;[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        #set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass memc_a;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uri-$query_string";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        set_quote_sql_str $seo_uri $query_string;[m
[31m-        drizzle_query "select url from my_url_map where seo_url=$seo_uri";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        rewrite_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /baz {[m
[31m-        set $my_uri $uri;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo_exec /jump $my_uri;[m
[31m-    }[m
[31m-[m
[31m-    location /jump {[m
[31m-        internal;[m
[31m-        rewrite ^ $query_string? redirect;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local seo_uri = ngx.var.my_uri[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-mysql?' .. seo_uri)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].url) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.my_uri = res[1].url;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /baz[m
[31m---- response_body_like: 302[m
[31m---- error_code: 302[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/foo/bar[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: throw 0[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.say('Hi'); ngx.eof(); ngx.exit(0);ngx.say('world')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: throw ngx.OK does *not* skip other rewrite phase handlers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.exit(ngx.OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by inlined code)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.exit(ngx.HTTP_OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by inlined code + partial output)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.say('hiya') ngx.exit(ngx.HTTP_OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/foo.lua;[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by file + partial output)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/foo.lua;[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.say("morning")[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-morning[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: error page with custom body[m
[31m---- config[m
[31m-    error_page 410 @err;[m
[31m-    location @err {[m
[31m-        echo blah blah;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.status = ngx.HTTP_GONE[m
[31m-            ngx.say("This is our own content")[m
[31m-            -- to cause quit the whole request rather than the current phase handler[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-        echo Hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-This is our own content[m
[31m---- error_code: 410[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exit with 204 (HTTP 1.1)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exit(204)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/blah;[m
[31m-    }[m
[31m-[m
[31m-    location = /blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers2[m
[31m---- stap2[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("send header\n")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- response_body[m
[31m---- error_code: 204[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: exit with 204 (HTTP 1.0)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exit(204)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/blah;[m
[31m-    }[m
[31m-[m
[31m-    location = /blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t HTTP/1.0[m
[31m---- more_headers2[m
[31m---- stap2[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("send header\n")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- response_body[m
[31m---- error_code: 204[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/mixed.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/mixed.t[m
[1mdeleted file mode 100644[m
[1mindex 1156567..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/mixed.t[m
[1m+++ /dev/null[m
[36m@@ -1,170 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rewrite I/O with content I/O[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("rewrite GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            print("rewrite PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("rewrite cached: " .. res.body);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("content PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content cached: " .. res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-content GET: 404[m
[31m-content PUT: 201[m
[31m-content cached: hello[m
[31m---- grep_error_log eval: qr/rewrite .+?(?= while )/[m
[31m---- grep_error_log_out[m
[31m-rewrite GET: 404[m
[31m-rewrite PUT: 201[m
[31m-rewrite cached: hello[m
[31m-[m
[31m---- log_level: info[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: share data via nginx variables[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.foo = 32[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say(tonumber(ngx.var.foo) * 2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-64[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: share the request body (need request body explicitly off)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        set $res '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: share the request body (need request body off by default)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        #lua_need_request_body off;[m
[31m-        set $res '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: share the request body (need request body on)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        set $res '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/multi-capture.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/multi-capture.t[m
[1mdeleted file mode 100644[m
[1mindex 44629b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/multi-capture.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(10);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/([a-d])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = c[m
[31m-res4.status = 200[m
[31m-res4.body = d[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: capture multi in series[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("2 res1.status = " .. res1.status)[m
[31m-            ngx.say("2 res1.body = " .. res1.body)[m
[31m-            ngx.say("2 res2.status = " .. res2.status)[m
[31m-            ngx.say("2 res2.body = " .. res2.body)[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-2 res1.status = 200[m
[31m-2 res1.body = a[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: capture multi in subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo?n=1")[m
[31m-            ngx.say("top res.status = " .. res.status)[m
[31m-            ngx.say("top res.body = [" .. res.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res.status = 200[m
[31m-top res.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: capture multi in parallel[m
[31m---- config[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("top res1.status = " .. res1.status)[m
[31m-            ngx.say("top res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("top res2.status = " .. res2.status)[m
[31m-            ngx.say("top res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([abcd])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res1.status = 200[m
[31m-top res1.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-top res2.status = 200[m
[31m-top res2.body = [2 res1.status = 200[m
[31m-2 res1.body = c[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = d[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: memc sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[ab]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: memc muti + multi[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-            print("args: " .. ngx.var.args)[m
[31m-            local n = ngx.var.arg_n[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[abcd]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = [1 res1.status = 201[m
[31m-1 res1.body = STORED\r[m
[31m-[m
[31m-1 res2.status = 201[m
[31m-1 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-res2.status = 200[m
[31m-res2.body = [2 res1.status = 201[m
[31m-2 res1.body = STORED\r[m
[31m-[m
[31m-2 res2.status = 201[m
[31m-2 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: memc 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[a-d]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-res3.status = 201[m
[31m-res3.body = STORED\r[m
[31m-[m
[31m-res4.status = 201[m
[31m-res4.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/on-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/on-abort.t[m
[1mdeleted file mode 100644[m
[1mindex aca2ab6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/on-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,657 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 15);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ignore the client abort event in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: abort in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.exit(499) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exit(408) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(408)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(-1) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(-1)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(0) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(0)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.log(ngx.ERR, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.7;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like eval[m
[31m-qr/^create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: fail[m
[31m-(?:lua check broken conn[m
[31m-)?terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-$/[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.6[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-'client prematurely closed connection',[m
[31m-'on abort called',[m
[31m-qr/lua user thread aborted: runtime error: rewrite_by_lua\(nginx\.conf:\d+\):4: attempt to abort with pending subrequests/,[m
[31m-'main handler done',[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: accessing cosocket in callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flushall\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive()[m
[31m-                if not res then[m
[31m-                    ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                ngx.log(ngx.NOTICE, "callback done: ", res)[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.5[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-callback done: +OK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ignore the client abort event in the user callback (no check)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("cannot set on_abort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- response_body[m
[31m-cannot set on_abort: lua_check_client_abort is off[m
[31m---- no_error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: regsiter on_abort callback but no client abortion[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ignore the client abort event in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abort in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: regsiter on_abort callback but no client abortion (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.5[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: regsiter on_abort callback multiple times[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("1: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("2: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-2: cannot set on_abort: duplicate call[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/redirect.t[m
[1mdeleted file mode 100644[m
[1mindex 8843f1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,125 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 3;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo");[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: explicit 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", ngx.HTTP_MOVED_TEMPORARILY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: explicit 301[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", ngx.HTTP_MOVED_PERMANENTLY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad rc[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", 404);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: no args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect()[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: relative uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like: Location: /foo\r\n[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/req-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/req-body.t[m
[1mdeleted file mode 100644[m
[1mindex 2f42e0a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/req-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,224 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 5);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read buffered body[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read buffered body (timed out)[m
[31m---- config[m
[31m-    client_body_timeout 1ms;[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /test HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 100\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-hello, world"[m
[31m---- response_body:[m
[31m---- error_code_like: ^(?:500)?$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read buffered body and then subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: first subrequest and then read buffered body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: failed to write 100 continue[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-http finalize request: 500, "/test?" a:1, c:0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: not discard body (exit 200)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not discard body (exit 201)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: not discard body (exit 302)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            -- ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.redirect("/blah")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-[qr/302 Found/,[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[302, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/req-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/req-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 34aedaa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/req-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,535 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-received: hello[m
[31m-received:  worl[m
[31m-failed to receive: closed [d][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multipart rfc sample (just partial streaming)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local boundary[m
[31m-            local header = ngx.var.http_content_type[m
[31m-            local m = ngx.re.match(header, [[; +boundary=(?:"(.*?)"|(\\w+))]], "jo")[m
[31m-            if m then[m
[31m-                boundary = m[1] or m[2][m
[31m-[m
[31m-            else[m
[31m-                ngx.say("invalid content-type header")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local read_to_boundary = sock:receiveuntil("\\r\\n--" .. boundary)[m
[31m-            local read_line = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-            local data, err, part = read_to_boundary()[m
[31m-            if data then[m
[31m-                ngx.say("preamble: [" .. data .. "]")[m
[31m-            else[m
[31m-                ngx.say("failed to read the first boundary: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local i = 1[m
[31m-            while true do[m
[31m-                local line, err = read_line()[m
[31m-[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to read post-boundary line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                m = ngx.re.match(line, "--$", "jo")[m
[31m-                if m then[m
[31m-                    ngx.say("found the end of the stream")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = read_line()[m
[31m-                    if not line then[m
[31m-                        ngx.say("failed to read part ", i, " header: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if line == "" then[m
[31m-                        -- the header part completes[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("part ", i, " header: [", line, "]")[m
[31m-                end[m
[31m-[m
[31m-                local data, err, part = read_to_boundary()[m
[31m-                if data then[m
[31m-                    ngx.say("part ", i, " body: [" .. data .. "]")[m
[31m-                else[m
[31m-                    ngx.say("failed to read part ", i + 1, " boundary: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.\r[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-"[m
[31m---- more_headers[m
[31m-Content-Type: multipart/mixed; boundary="simple boundary"[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-preamble: [This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.][m
[31m-part 1 body: [This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.][m
[31m-part 2 header: [Content-type: text/plain; charset=us-ascii][m
[31m-part 2 body: [This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-][m
[31m-found the end of the stream[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multipart rfc sample (completely streaming)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local boundary[m
[31m-            local header = ngx.var.http_content_type[m
[31m-            local m = ngx.re.match(header, [[; +boundary=(?:"(.*?)"|(\\w+))]], "jo")[m
[31m-            if m then[m
[31m-                boundary = m[1] or m[2][m
[31m-[m
[31m-            else[m
[31m-                ngx.say("invalid content-type header")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local read_to_boundary = sock:receiveuntil("\\r\\n--" .. boundary)[m
[31m-            local read_line = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-            local preamble = ""[m
[31m-            while true do[m
[31m-                local data, err, part = read_to_boundary(1)[m
[31m-                if data then[m
[31m-                    preamble = preamble .. data[m
[31m-[m
[31m-                elseif not err then[m
[31m-                    break[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read the first boundary: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("preamble: [" .. preamble .. "]")[m
[31m-[m
[31m-            local i = 1[m
[31m-            while true do[m
[31m-                local line, err = read_line(50)[m
[31m-[m
[31m-                if not line and err then[m
[31m-                    ngx.say("1: failed to read post-boundary line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if line then[m
[31m-                    local dummy[m
[31m-                    dummy, err = read_line(1)[m
[31m-                    if err then[m
[31m-                        ngx.say("2: failed to read post-boundary line: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if dummy then[m
[31m-                        ngx.say("bad post-boundary line: ", dummy)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    m = ngx.re.match(line, "--$", "jo")[m
[31m-                    if m then[m
[31m-                        ngx.say("found the end of the stream")[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = read_line(50)[m
[31m-                    if not line and err then[m
[31m-                        ngx.say("failed to read part ", i, " header: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if line then[m
[31m-                        local line, err = read_line(1)[m
[31m-                        if line or err then[m
[31m-                            ngx.say("error")[m
[31m-                            return[m
[31m-                        end[m
[31m-                    end[m
[31m-[m
[31m-                    if line == "" then[m
[31m-                        -- the header part completes[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("part ", i, " header: [", line, "]")[m
[31m-                end[m
[31m-[m
[31m-                local body = ""[m
[31m-[m
[31m-                while true do[m
[31m-                    local data, err, part = read_to_boundary(1)[m
[31m-                    if data then[m
[31m-                        body = body .. data[m
[31m-[m
[31m-                    elseif err then[m
[31m-                        ngx.say("failed to read part ", i + 1, " boundary: ", err)[m
[31m-                        return[m
[31m-[m
[31m-                    else[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("part ", i, " body: [" .. body .. "]")[m
[31m-[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.\r[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-"[m
[31m---- more_headers[m
[31m-Content-Type: multipart/mixed; boundary="simple boundary"[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-preamble: [This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.][m
[31m-part 1 body: [This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.][m
[31m-part 2 header: [Content-type: text/plain; charset=us-ascii][m
[31m-part 2 body: [This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-][m
[31m-found the end of the stream[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: attempt to use the req socket across request boundary[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock, err[m
[31m-[m
[31m-function go()[m
[31m-    if not sock then[m
[31m-        sock, err = ngx.req.socket()[m
[31m-        if sock then[m
[31m-            ngx.say("got the request socket")[m
[31m-        else[m
[31m-            ngx.say("failed to get the request socket: ", err)[m
[31m-        end[m
[31m-    else[m
[31m-        for i = 1, 3 do[m
[31m-            local data, err, part = sock:receive(5)[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body_like[m
[31m-(?:got the request socket[m
[31m-|failed to receive: closed [d][m
[31m-)?done[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: receive until on request_body - receiveuntil(1) on the last byte of the body[m
[31m-See https://groups.google.com/group/openresty/browse_thread/thread/43cf01da3c681aba for details[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-   local sock, err = ngx.req.socket()[m
[31m-   if sock then[m
[31m-      ngx.say("got the request socket")[m
[31m-   else[m
[31m-      ngx.say("failed to get the request socket: ", err)[m
[31m-      return[m
[31m-   end[m
[31m-[m
[31m-   local data, err, part = sock:receive(56)[m
[31m-   if data then[m
[31m-      ngx.say("received: ", data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-[m
[31m-   local discard_line = sock:receiveuntil('\r\n')[m
[31m-[m
[31m-   local data, err, part = discard_line(8192)[m
[31m-   if data then[m
[31m-      ngx.say("received len: ", #data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-[m
[31m-   local data, err, part = discard_line(1)[m
[31m-   if data then[m
[31m-      ngx.say("received: ", data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-end[m
[31m---- request[m
[31m-POST /t[m
[31m------------------------------820127721219505131303151179################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################$[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-received: -----------------------------820127721219505131303151179[m
[31m-received len: 8192[m
[31m-received: $[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: pipelined POST requests[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-   local sock, err = ngx.req.socket()[m
[31m-   if sock then[m
[31m-      ngx.say("got the request socket")[m
[31m-   else[m
[31m-      ngx.say("failed to get the request socket: ", err)[m
[31m-      return[m
[31m-   end[m
[31m-[m
[31m-   while true do[m
[31m-       local data, err, part = sock:receive(4)[m
[31m-       if data then[m
[31m-          ngx.say("received: ", data)[m
[31m-       else[m
[31m-          ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-          return[m
[31m-       end[m
[31m-   end[m
[31m-end[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello, world",[m
[31m-"POST /t[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["got the request socket[m
[31m-received: hell[m
[31m-received: o, w[m
[31m-received: orld[m
[31m-failed to receive: closed [][m
[31m-done[m
[31m-",[m
[31m-"got the request socket[m
[31m-received: hiya[m
[31m-received: , wo[m
[31m-failed to receive: closed [rld][m
[31m-done[m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: Expect & 100 Continue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- error_code: 100[m
[31m---- response_body_like chomp[m
[31m-\breceived: hello\b.*?\breceived:  worl\b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/request_body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/request_body.t[m
[1mdeleted file mode 100644[m
[1mindex 665d6de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/request_body.t[m
[1m+++ /dev/null[m
[36m@@ -1,173 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('debug'); # to ensure any log-level can be outputed[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test not reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test default setting (not reading request body)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: test main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test override main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test override server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: Expect: 100-Continue[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo_body[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-http finalize request: 500, "/echo_body?" a:1, c:2[m
[31m-http finalize request: 500, "/echo_body?" a:1, c:0[m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 20b00e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,802 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#no_nginx_manager();[m
[31m-#log_level('warn');[m
[31m-#master_on();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 12);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        rewrite_by_lua 'ngx.print("Hello, Lua!\\n")';[m
[31m-        content_by_lua return;[m
[31m-        #content_by_lua 'ngx.say("Hi")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic say[m
[31m---- config[m
[31m-    location /say {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say("Hello, Lua!")[m
[31m-            ngx.say("Yay! ", 123)';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /say[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-Yay! 123[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no ngx.echo[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.echo("Hello, Lua!\\n")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: variable[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        rewrite_by_lua 'v = ngx.var["request_uri"] ngx.print("request_uri: ", v, "\\n")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variable (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/test.lua;[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: calc expression[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/calc.lua;[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> calc.lua[m
[31m-local function uri_unescape(uri)[m
[31m-    local function convert(hex)[m
[31m-        return string.char(tonumber("0x"..hex))[m
[31m-    end[m
[31m-    local s = string.gsub(uri, "%%([0-9a-fA-F][0-9a-fA-F])", convert)[m
[31m-    return s[m
[31m-end[m
[31m-[m
[31m-local function eval_exp(str)[m
[31m-    return loadstring("return "..str)()[m
[31m-end[m
[31m-[m
[31m-local exp_str = ngx.var["arg_exp"][m
[31m--- print("exp: '", exp_str, "'\n")[m
[31m-local status, res[m
[31m-status, res = pcall(uri_unescape, exp_str)[m
[31m-if not status then[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-    return[m
[31m-end[m
[31m-status, res = pcall(eval_exp, res)[m
[31m-if status then[m
[31m-    ngx.print("result: ", res, "\n")[m
[31m-else[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua?exp=1%2B2*math.sin(3)%2Fmath.exp(4)-math.sqrt(2)[m
[31m---- response_body[m
[31m-result: -0.4090441561579[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read $arg_xxx[m
[31m---- config[m
[31m-    location = /lua {[m
[31m-        rewrite_by_lua 'who = ngx.var.arg_who[m
[31m-            ngx.print("Hello, ", who, "!")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?who=agentzh[m
[31m---- response_body chomp[m
[31m-Hello, agentzh![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: capture location[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-res = ngx.location.capture("/other")[m
[31m-ngx.print("status=", res.status, " ")[m
[31m-ngx.print("body=", res.body)[m
[31m-';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-status=200 body=hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: capture non-existed location[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'res = ngx.location.capture("/other"); ngx.print("status=", res.status)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body: status=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: invalid capture location (not as expected...)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'res = ngx.location.capture("*(#*"); ngx.say("res=", res.status)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-res=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nil is "nil"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.say(nil)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: write boolean[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.say(true, " ", false)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-true false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: bad argument type to ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.location.capture(nil)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: capture location (default 0);[m
[31m---- config[m
[31m- location /recur {[m
[31m-       rewrite_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body, "\\n");[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-[m
[31m-           content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur[m
[31m---- response_body[m
[31m-num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: capture location[m
[31m---- config[m
[31m- location /recur {[m
[31m-       rewrite_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body);[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-[m
[31m-           content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur?num=3[m
[31m---- response_body[m
[31m-num is: 3[m
[31m-status=200 body=num is: 2[m
[31m-status=200 body=num is: 1[m
[31m-status=200 body=num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: setting nginx variables from within Lua[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a "";[m
[31m-       rewrite_by_lua 'ngx.var.a = 32; ngx.say(ngx.var.a)';[m
[31m-       content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-       add_header Foo $a;[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_headers[m
[31m-Foo: 32[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: nginx quote sql string 1[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a 'hello\n\r\'"\\'; # this runs after rewrite_by_lua[m
[31m-       rewrite_by_lua 'ngx.say(ngx.quote_sql_str(ngx.var.a))';[m
[31m-       content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: nginx quote sql string 2[m
[31m---- config[m
[31m-location /set {[m
[31m-    #set $a "hello\n\r'\"\\";[m
[31m-    rewrite_by_lua 'ngx.say(ngx.quote_sql_str("hello\\n\\r\'\\"\\\\"))';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: use dollar[m
[31m---- config[m
[31m-location /set {[m
[31m-    rewrite_by_lua '[m
[31m-        local s = "hello 112";[m
[31m-        ngx.say(string.find(s, "%d+$"))';[m
[31m-[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-79[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: subrequests do not share variables of main requests by default[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a 12;[m
[31m-    rewrite_by_lua 'res = ngx.location.capture("/sub"); ngx.print(res.body)';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: subrequests can share variables of main requests[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a '';[m
[31m-    rewrite_by_lua '[m
[31m-        ngx.var.a = 12;[m
[31m-        res = ngx.location.capture([m
[31m-            "/sub",[m
[31m-            { share_all_vars = true }[m
[31m-        );[m
[31m-        ngx.print(res.body)[m
[31m-    ';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: main requests use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-}[m
[31m-location /parent {[m
[31m-    rewrite_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = true });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: main requests do NOT use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-    content_by_lua return;[m
[31m-}[m
[31m-[m
[31m-location /parent {[m
[31m-    rewrite_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = false });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-    content_by_lua return;[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body_like eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"]);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: Bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-            ngx.header.Bar = nil;[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"] or "nil");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: rewrite_by_lua runs before ngx_access[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        deny all;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: rewrite_by_lua shouldn't send headers automatically (on simple return)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'return';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        default_type 'text/css';[m
[31m-        add_header Bar Baz;[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-Bar: Baz[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: rewrite_by_lua shouldn't send headers automatically (on simple exit)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.exit(ngx.OK)';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        default_type 'text/css';[m
[31m-        add_header Bar Baz;[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-Bar: Baz[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: short circuit[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say("Hi")[m
[31m-            ngx.eof()[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            print("HERE")[m
[31m-            ngx.print("BAD")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: nginx vars in script path[m
[31m---- config[m
[31m-    location ~ /lua/(.+)$ {[m
[31m-        rewrite_by_lua_file html/$1.lua;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            print("HERE")[m
[31m-            ngx.print("BAD")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> hi.lua[m
[31m-ngx.say("Hi")[m
[31m-ngx.eof()[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua/hi[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: phase postponing works for various locations[m
[31m---- config[m
[31m-    location ~ '^/lua/(.+)' {[m
[31m-        set $path $1;[m
[31m-        rewrite_by_lua 'ngx.say(ngx.var.path)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/lua2/(.+)' {[m
[31m-        set $path $1;[m
[31m-        rewrite_by_lua 'ngx.say(ngx.var.path)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua/foo;[m
[31m-        echo_location /lua/bar;[m
[31m-        echo_location /lua2/baz;[m
[31m-        echo_location /lua2/bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-foo[m
[31m-bar[m
[31m-baz[m
[31m-bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: server rewrite_by_lua[m
[31m---- config[m
[31m-    rewrite_by_lua 'ngx.header["X-Foo"] = "bar" -- ngx.send_headers()';[m
[31m---- request[m
[31m-GET /[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m---- response_headers[m
[31m-X-Foo: bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: server rewrite_by_lua_file[m
[31m---- config[m
[31m-    rewrite_by_lua_file html/foo.lua;[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header["X-Foo"] = "bar" -- ngx.send_headers()[m
[31m---- request[m
[31m-GET /[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m---- response_headers[m
[31m-X-Foo: bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: rewrite last before rewrite_by_lua[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite ^/main/xyz\.html$ /abc.html last;[m
[31m-        rewrite_by_lua 'ngx.exit(503)';[m
[31m-    }[m
[31m-    location ~ /abc.html {[m
[31m-        echo abc;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main/xyz.html[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: rewrite last before rewrite_by_lua_file[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite ^/main/xyz\.html$ /abc.html last;[m
[31m-        rewrite_by_lua_file html/exit.lua;[m
[31m-    }[m
[31m-    location ~ /abc.html {[m
[31m-        echo abc;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> exit.lua[m
[31m-ngx.exit(503)[m
[31m---- request[m
[31m-    GET /main/xyz.html[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: rewrite before rewrite_by_lua[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite ^/main/xyz\.html$ /abc.html;[m
[31m-        rewrite_by_lua 'ngx.exit(503)';[m
[31m-    }[m
[31m-    location ~ /abc.html {[m
[31m-        echo abc;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main/xyz.html[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: rewrite break before rewrite_by_lua[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite ^/main/xyz\.html$ /abc.html break;[m
[31m-        rewrite_by_lua 'ngx.exit(503)';[m
[31m-    }[m
[31m-    location ~ /abc.html {[m
[31m-        echo abc;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main/xyz.html[m
[31m---- response_body_like: 503 Service Temporarily Unavailable[m
[31m---- error_code: 503[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?\btest2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: use of ngx.say() in rewrite_by_lua without exiting with 200+.[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua "ngx.say('test')";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: use of ngx.say() in rewrite_by_lua without exiting with 200+. (with explicit ngx.eof())[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua "ngx.say('test') ngx.eof()";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: use of ngx.say() in rewrite_by_lua without exiting with 200+. (with IO)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua "ngx.say('test') ngx.sleep(0.001)";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/sleep.t[m
[1mdeleted file mode 100644[m
[1mindex 1719784..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,222 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 33;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep 0.5[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep(0.5)[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-9]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep ag[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep("a")[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep 0.5 in subrequest[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            local now = ngx.now()[m
[31m-            local delay = now - before[m
[31m-            ngx.say(delay)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        rewrite_by_lua 'ngx.sleep(0.5) ngx.exit(200)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-9]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/sleep?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sleep a in subrequest with bad argument[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/sleep");[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        rewrite_by_lua 'ngx.sleep("a") ngx.exit(200)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-500[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sleep 0.5 - multi-times[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local start = ngx.now()[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say(ngx.now() - start)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:8[5-9]\d*|9[0-9]\d*|9)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: sleep 0.5 - interleaved by ngx.say() - ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(1)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m---- error_log[m
[31m-lua ready to sleep[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sleep 0.5 - interleaved by ngx.say() - not ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(0.5)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m-hiya[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.location.capture before and after ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /hello {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m-    location = /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/socket-keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/socket-keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex 50de0b3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/socket-keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,1010 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 4);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-#$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-$ENV{LUA_PATH} ||=[m
[31m-    '/usr/local/openresty-debug/lualib/?.lua;/usr/local/openresty/lualib/?.lua;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^connected: 1, reused: \d+[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-connected: 1, reused: [1-9]\d*[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- grep_error_log eval[m
[31m-qr/lua tcp socket get keepalive peer: using connection|lua tcp socket keepalive create connection pool for key "[^"]+"/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-qq{lua tcp socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-},[m
[31m-"lua tcp socket get keepalive peer: using connection[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: free up the whole connection pool if no active connections[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port, true)[m
[31m-            test.go(port, false)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, keepalive)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    if keepalive then[m
[31m-        local ok, err = sock:setkeepalive()[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to set reusable: ", err)[m
[31m-        end[m
[31m-[m
[31m-    else[m
[31m-        sock:close()[m
[31m-    end[m
[31m-end[m
[31m---- response_body_like[m
[31m-^connected: 1, reused: \d+[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-connected: 1, reused: [1-9]\d*[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket get keepalive peer: using connection",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: upstream sockets close prematurely[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   keepalive_timeout 100ms;[m
[31m-   location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, err = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: http keepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-        keepalive_timeout 60s;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, err = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive close handler: fd:",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: lua_socket_keepalive_timeout[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 100 ms",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_socket_pool_size[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-       lua_socket_pool_size 1;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 100 ms",[m
[31m-qr/lua tcp socket connection pool size: 1\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: "lua_socket_keepalive_timeout 0" means unlimited[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 0;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval[m
[31m-qr/lua tcp socket keepalive timeout: unlimited|lua tcp socket connection pool size: \d+/[m
[31m---- grep_error_log_out eval[m
[31m-["lua tcp socket connection pool size: 30[m
[31m-lua tcp socket keepalive timeout: unlimited[m
[31m-",[m
[31m-"lua tcp socket keepalive timeout: unlimited[m
[31m-"][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: setkeepalive(timeout) overrides lua_socket_keepalive_timeout[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-        keepalive_timeout 60s;[m
[31m-        lua_socket_keepalive_timeout 60s;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(123)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 123 ms",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sock:setkeepalive(timeout, size) overrides lua_socket_pool_size[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-       lua_socket_pool_size 100;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(101, 25)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 101 ms",[m
[31m-qr/lua tcp socket connection pool size: 25\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sock:keepalive_timeout(0) means unlimited[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 1000ms;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(0)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval[m
[31m-qr/lua tcp socket keepalive timeout: unlimited|lua tcp socket connection pool size: \d+/[m
[31m---- grep_error_log_out eval[m
[31m-["lua tcp socket connection pool size: 30[m
[31m-lua tcp socket keepalive timeout: unlimited[m
[31m-",[m
[31m-"lua tcp socket keepalive timeout: unlimited[m
[31m-"[m
[31m-][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: sanity (uds)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen unix:$::HtmlDir/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            echo foo;[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local path = "$TEST_NGINX_HTML_DIR/nginx.sock";[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(path, port)[m
[31m-            test.go(path, port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(path, port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("unix:" .. path)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "GET /foo HTTP/1.1\r\nHost: localhost\r\nConnection: keepalive\r\n\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local reader = sock:receiveuntil("\r\n0\r\n\r\n")[m
[31m-    local data, err = reader()[m
[31m-[m
[31m-    if not data then[m
[31m-        ngx.say("failed to receive response body: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- response_body_like[m
[31m-^connected: 1, reused: \d+[m
[31m-request sent: 61[m
[31m-received response of 119 bytes[m
[31m-connected: 1, reused: [1-9]\d*[m
[31m-request sent: 61[m
[31m-received response of 119 bytes[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- grep_error_log eval[m
[31m-qr/lua tcp socket get keepalive peer: using connection|lua tcp socket keepalive create connection pool for key "unix:/[m
[31m---- grep_error_log_out eval[m
[31m-[qq{lua tcp socket keepalive create connection pool for key "unix:[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-},[m
[31m-"lua tcp socket get keepalive peer: using connection[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #108: ngx.locaiton.capture + redis.set_keepalive[m
[31m---- http_config eval[m
[31m-    qq{[m
[31m-        lua_package_path "$::HtmlDir/?.lua;;";[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        default_type text/html;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #lua_code_cache off;[m
[31m-        lua_need_request_body on;[m
[31m-        rewrite_by_lua_file html/t.lua;[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /anyurl {[m
[31m-        internal;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/dummy;[m
[31m-    }[m
[31m-[m
[31m-    location = /dummy {[m
[31m-        echo dummy;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> t.lua[m
[31m-local sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)[m
[31m-if not sock then ngx.say(err) return end[m
[31m-sock:send("flush_all\r\n")[m
[31m-sock:receive()[m
[31m-sock:setkeepalive()[m
[31m-[m
[31m-sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)[m
[31m-if not sock then ngx.say(err) return end[m
[31m-local res = ngx.location.capture("/anyurl") --3[m
[31m-[m
[31m-ngx.say("ok")[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #110: ngx.exit with HTTP_NOT_FOUND causes worker process to exit[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    error_page 404 /404.html;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        access_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 404.html[m
[31m-Not found, dear...[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.log(ngx.ERR, "failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if not line then[m
[31m-        ngx.log(ngx.ERR, "failed to receive a line: ", err, " [", part, "]")[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    -- local ok, err = sock:setkeepalive()[m
[31m-    -- if not ok then[m
[31m-        -- ngx.log(ngx.ERR, "failed to set reusable: ", err)[m
[31m-        -- return[m
[31m-    -- end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Not found, dear...[m
[31m---- error_code: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 3c206a8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,642 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: DELETE[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: DELETE (proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: POST (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-POST[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: HEAD[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_HEAD });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: explicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: implicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: implicit GET (empty option table)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo", {})[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: PUT (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-        #echo "[$http_content_length]";[m
[31m-        echo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo $echo_request_method;[m
[31m-        echo -n "[$http_content_length]";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-            ngx.say(res.body)[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-PUT[m
[31m-hello[m
[31m-GET[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: POST (with body, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-POST[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd "";[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/flush",[m
[31m-                { share_all_vars = true });[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { share_all_vars = true });[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello", share_all_vars = true });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc", { share_all_vars = true });[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: emtpy args option table[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = {} })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: non-empty args option table (1 pair)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-fo%3D=%3D%3E[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: non-empty args option table (2 pairs)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>",[m
[31m-                    ["="] = ":" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:fo%3D=%3D%3E\&%3D=%3A|%3D=%3A\&fo%3D=%3D%3E)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: non-empty args option table (2 pairs, no special chars)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { foo = 3,[m
[31m-                    bar = "hello" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:bar=hello\&foo=3|foo=3\&bar=hello)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: non-empty args option table (number key)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { [57] = "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: non-empty args option table (plain arrays)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = { b = 4 } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = "b=4" })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: more args[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc_set {[m
[31m-        #set $memc_cmd set;[m
[31m-        #set $memc_key $arg_key;[m
[31m-        #memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        echo OK;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            print("HELLO")[m
[31m-            local memc_key = "hello"[m
[31m-            local res = ngx.location.capture("/memc?key=" .. memc_key )[m
[31m-            ngx.say("copass: res " .. res.status)[m
[31m-[m
[31m-            if res.status == 404 then[m
[31m-                   ngx.say("copas: capture /memc_set")[m
[31m-                   res = ngx.location.capture("/memc_set?key=" .. memc_key)[m
[31m-                   ngx.say("copss: status " .. res.status);[m
[31m-            end[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-        #echo Hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-copass: res 404[m
[31m-copas: capture /memc_set[m
[31m-copss: status 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: I/O in named location[m
[31m-the nginx core requires the patch https://github.com/agentzh/ngx_openresty/blob/master/patches/nginx-1.0.15-reset_wev_handler_in_named_locations.patch[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_exec @named;[m
[31m-    }[m
[31m-[m
[31m-    location @named {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/hello")[m
[31m-        ';[m
[31m-        echo done;[m
[31m-    }[m
[31m-[m
[31m-    location /hello {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/tcp-socket-timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/tcp-socket-timeout.t[m
[1mdeleted file mode 100644[m
[1mindex 79cd0b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/tcp-socket-timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,615 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'get helloworld';[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 14);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: lua_socket_connect_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t1 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t1[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 100[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sock:settimeout() overrides lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 60s;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t2 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(150)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t2[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 150[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sock:settimeout(nil) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    #resolver_timeout 3s;[m
[31m-    location /t3 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(nil)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t3[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sock:settimeout(0) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t4 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(0)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t4[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sock:settimeout(-1) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t5 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(-1)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t5[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_socket_read_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sock:settimeout() overrides lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 60s;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(150)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 150[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sock:settimeout(nil) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(nil)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sock:settimeout(0) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(0)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sock:settimeout(-1) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(-1)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: lua_socket_send_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: sock:settimeout() overrides lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 60s;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(150)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 150[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: sock:settimeout(nil) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(nil)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: sock:settimeout(0) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(0)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: sock:settimeout(-1) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(-1)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/tcp-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/tcp-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 9b39ba1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/tcp-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,2393 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 107;[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no trailing newline[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 1234;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            sock:close()[m
[31m-            ngx.say("closed")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.print("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 3[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-failed to receive a line: closed [foo][m
[31m-closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no resolver defined[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 1234;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: no resolver defined to resolve "agentzh.org"[m
[31m-connected: nil[m
[31m-failed to send request: closed[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: with resolver[m
[31m---- timeout: 10[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("first line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive the first line: ", err)[m
[31m-            end[m
[31m-[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("second line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive the second line: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 56[m
[31m-first line received: HTTP/1.1 200 OK[m
[31m-second line received: Server: openresty[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: connection refused (tcp)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil connection refused[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: connection timeout (tcp)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil timeout[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not closed manually[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: resolver error (host not found)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)[m
[31m-            print("connected: ", ok, " ", err, " ", not ok)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(3: Host not found\))?[m
[31m-connected: nil[m
[31m-failed to send request: closed$[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: resolver error (timeout)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver 8.8.8.8;[m
[31m-    resolver_timeout 1ms;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)[m
[31m-            print("connected: ", ok, " ", err, " ", not ok)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(\d+: Operation timed out\))?[m
[31m-connected: nil[m
[31m-failed to send request: closed$[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: explicit *l pattern for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err = sock:receive("*l")[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: *a pattern for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err = sock:receive("*a")[m
[31m-            if data then[m
[31m-                ngx.say("receive: ", data)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-receive: HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-foo[m
[31m-[m
[31m-err: nil[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: mixing *a and *l patterns for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive("*l")[m
[31m-            if line then[m
[31m-                ngx.say("receive: ", line)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local data[m
[31m-            data, err = sock:receive("*a")[m
[31m-            if data then[m
[31m-                ngx.say("receive: ", data)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-receive: HTTP/1.1 200 OK[m
[31m-err: nil[m
[31m-receive: Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-foo[m
[31m-[m
[31m-err: nil[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: receive by chunks[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(10)[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: receive by chunks (very small buffer)[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(10)[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: line reading (very small buffer)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.socket.connect (working)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-            local sock, err = ngx.socket.connect("127.0.0.1", port)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected.")[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected.[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.socket.connect() shortcut (connection refused)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local sock, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-failed to connect: connection refused[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: receive by chunks (stringified size)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive("10")[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: cannot survive across request boundary (send)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-"^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to send request: closed)\$"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: cannot survive across request boundary (receive)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local line, err, part = sock:receive()[m
[31m-        if line then[m
[31m-            ngx.say("received: ", line)[m
[31m-[m
[31m-        else[m
[31m-            ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to receive a line: closed \[nil\])$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: cannot survive across request boundary (close)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local ok, err = sock:close()[m
[31m-        if ok then[m
[31m-            ngx.say("successfully closed")[m
[31m-[m
[31m-        else[m
[31m-            ngx.say("failed to close: ", err)[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to close: closed)$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: cannot survive across request boundary (connect)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect again: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected again: ", ok)[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected(?: again)?: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-){2}$/[m
[31m---- error_log[m
[31m-lua reuse socket upstream ctx[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: connect again immediately[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected again: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-connected again: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua reuse socket upstream", "lua tcp socket reconnect without shutting down"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: two sockets mix together[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port1 $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        set $port2 $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock1 = ngx.socket.tcp()[m
[31m-            local sock2 = ngx.socket.tcp()[m
[31m-[m
[31m-            local port1 = ngx.var.port1[m
[31m-            local port2 = ngx.var.port2[m
[31m-[m
[31m-            local ok, err = sock1:connect("127.0.0.1", port1)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock2:connect("127.0.0.1", port2)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: connected: ", ok)[m
[31m-[m
[31m-            local req1 = "flush_all\\r\\n"[m
[31m-            local bytes, err = sock1:send(req1)[m
[31m-            if not bytes then[m
[31m-                ngx.say("1: failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("1: request sent: ", bytes)[m
[31m-[m
[31m-            local req2 = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            local bytes, err = sock2:send(req2)[m
[31m-            if not bytes then[m
[31m-                ngx.say("2: failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("2: request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock1:receive()[m
[31m-            if line then[m
[31m-                ngx.say("1: received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("1: failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            line, err, part = sock2:receive()[m
[31m-            if line then[m
[31m-                ngx.say("2: received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("2: failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock1:close()[m
[31m-            ngx.say("1: close: ", ok, " ", err)[m
[31m-[m
[31m-            ok, err = sock2:close()[m
[31m-            ngx.say("2: close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: connected: 1[m
[31m-2: connected: 1[m
[31m-1: request sent: 11[m
[31m-2: request sent: 57[m
[31m-1: received: OK[m
[31m-2: received: HTTP/1.1 200 OK[m
[31m-1: close: 1 nil[m
[31m-2: close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: send tables of string fragments[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: send tables of string fragments (bad type "nil")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", nil, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type nil found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: send tables of string fragments (bad type "boolean")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", true, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type boolean found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: send tables of string fragments (bad type ngx.null)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", ngx.null, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type userdata found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: cosocket before location capture (tcpsock:send did not clear u->waiting)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-            local resp = ngx.location.capture("/memc")[m
[31m-            if type(resp) ~= "table" then[m
[31m-                ngx.say("bad resp: type ", type(resp), ": ", resp)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.print("subrequest: ", resp.status, ", ", resp.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m-subrequest: 200, OK\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: CR in a line[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo\\r\\rbar\\rbaz")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 13[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foobarbaz[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: receive(0)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err, part = sock:receive(0)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive(0): ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("receive(0): [", data, "]")[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-receive(0): [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: send("")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local bytes, err = sock:send("")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("send(\\"\\"): ", bytes)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-send(""): 0[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: bad request tries to connect[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                test.new_sock()[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            else[m
[31m-                ngx.say("connected")[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):7: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: bad request tries to receive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:receive()[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: bad request tries to send[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:send("a")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: bad request tries to close[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: bad request tries to set keepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:setkeepalive()[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: bad request tries to receiveuntil[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            local it, err = sock:receiveuntil("abc")[m
[31m-            if it then[m
[31m-                it()[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):16: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/unix-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/unix-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 098dd67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/unix-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,153 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: connection refused (unix domain socket)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("unix:/tmp/nosuchfile.sock")[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil no such file or directory[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log eval[m
[31m-qr{\[crit\] .*? connect\(\) to unix:/tmp/nosuchfile\.sock failed}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: invalid host argument[m
[31m---- http_server[m
[31m-    server {[m
[31m-        listen /tmp/test-nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            content_by_lua 'ngx.say("foo")';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("/tmp/test-nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-failed to connect: failed to parse host name "/tmp/test-nginx.sock": invalid host[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            content_by_lua 'ngx.say("foo")';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                print("calling receive")[m
[31m-                local line, err = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-exec.t[m
[1mdeleted file mode 100644[m
[1mindex 2bea7e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,345 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exec in user thread (entry still pending)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exec in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exec in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exec in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exec in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-exit.t[m
[1mdeleted file mode 100644[m
[1mindex 266d5ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,1331 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exit in user thread (entry thread is still pending to run)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-                ngx.say("g")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m-f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exit in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("exiting the user thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-exiting the user thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.tcp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_resolve_start) {[m
[31m-    println("resolver started")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_socket_resolve_handler) {[m
[31m-    println("resolver done")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_tcp_resolve_cleanup) {[m
[31m-    println("lua tcp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolver started[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.udp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        #resolver 127.0.0.1;[m
[31m-        resolver_timeout 12s;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_resolve_start) {[m
[31m-    println("resolver started")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_socket_resolve_handler) {[m
[31m-    println("resolver done")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_resolve_cleanup) {[m
[31m-    println("lua udp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolver started[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: exit in user thread (entry thread is still pending on tcpsock:connect)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(12000)[m
[31m-            local ok, err = sock:connect("106.187.41.147", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: exit in user thread (entry thread is still pending on tcpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: exit in user thread (entry thread is still pending on tcpsock:receiveuntil's iterator)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local it, err = sock:receiveuntil("\\r\\n")[m
[31m-            if not it then[m
[31m-                ngx.say("failed to receive until: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = it()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exit in user thread (entry thread is still pending on udpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_socket_cleanup) {[m
[31m-    println("lua udp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exit in user thread (entry thread is still pending on reqsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.req.socket()[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive(1024)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exit in user thread (entry thread is still pending on ngx.req.read_body)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_req_body_cleanup) {[m
[31m-    println("lua req body cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req body cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exit in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: exit in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: exit in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-redirect.t[m
[1mdeleted file mode 100644[m
[1mindex 0f125e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,189 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.redirect() in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: redirect in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-spawn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-spawn.t[m
[1mdeleted file mode 100644[m
[1mindex 58af7d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/023-rewrite/uthread-spawn.t[m
[1m+++ /dev/null[m
[36m@@ -1,1452 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple user thread without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval[m
[31m-<<'_EOC_' . $::StapScript;[m
[31m-[m
[31m-F(ngx_http_lua_send_chain_link) {[m
[31m-    printf("send link %p\n", $in)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    println("core content phase")[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: two simple user threads without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("in thread 1")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("in thread 2")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before 1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after 1")[m
[31m-[m
[31m-            ngx.say("before 2")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after 2")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before 1[m
[31m-in thread 1[m
[31m-after 1[m
[31m-before 2[m
[31m-in thread 2[m
[31m-after 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple user thread with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before sleep[m
[31m-after thread create[m
[31m-after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: two simple user threads with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("1: before sleep")[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("1: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("2: before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("2: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("1: after thread create")[m
[31m-[m
[31m-            ngx.say("2: before thread create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("2: after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-1: before thread create[m
[31m-1: before sleep[m
[31m-1: after thread create[m
[31m-2: before thread create[m
[31m-2: before sleep[m
[31m-2: after thread create[m
[31m-2: after sleep[m
[31m-1: after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: error in user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.blah()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-after[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: rewrite_by_lua\(nginx\.conf:\d+\):3: attempt to call field 'blah' \(a nil value\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple user threads doing a single subrequest (entry quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple user threads doing a single subrequest (entry also does a subrequest and quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-capture: hello bar[m
[31m-after capture: hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple user threads doing a single subrequest (entry also does a subrequest and quits late)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello foo[m
[31m-capture: hello bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: two simple user threads doing single subrequests (entry also does a subrequest and quits between)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("f: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("f: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("g: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?bah")[m
[31m-                ngx.say("g: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread 1 create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread 1 create")[m
[31m-[m
[31m-            ngx.say("before thread 2 create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after thread 2 create")[m
[31m-[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bah {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n hello bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before thread 1 create[m
[31m-f: before capture[m
[31m-after thread 1 create[m
[31m-before thread 2 create[m
[31m-g: before capture[m
[31m-after thread 2 create[m
[31m-f: after capture: hello foo[m
[31m-capture: hello bar[m
[31m-g: after capture: hello bah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nested user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after f[m
[31m-after g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nested user threads (with I/O)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-after f[m
[31m-after g[m
[31m-hello in g()[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: coroutine status of a running user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: running[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: coroutine status of a dead user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-status: zombie[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: coroutine status of a "normal" user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                local co2 = coroutine.create(g)[m
[31m-                coroutine.resume(co2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: normal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: creating user threads in a user coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after g[m
[31m-after f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: manual time slicing between a user thread and the entry thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            local self = coroutine.running()[m
[31m-            ngx.say("0")[m
[31m-            yield(self)[m
[31m-            ngx.say("1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("2")[m
[31m-            yield(self)[m
[31m-            ngx.say("3")[m
[31m-            yield(self)[m
[31m-            ngx.say("4")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-0[m
[31m-1[m
[31m-f 1[m
[31m-2[m
[31m-f 2[m
[31m-3[m
[31m-f 3[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: manual time slicing between two user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("g 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 3")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-f 2[m
[31m-done[m
[31m-g 2[m
[31m-f 3[m
[31m-g 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entry thread and a user thread flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                coroutine.yield(coroutine.running)[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.flush(true)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: two user threads flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello from g")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- response_body[m
[31m-hello from f[m
[31m-hello from g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: user threads + ngx.socket.tcp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flush_all\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: user threads + ngx.socket.udp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.udp()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", 12345)[m
[31m-                local bytes, err = sock:send("blah")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- udp_listen: 12345[m
[31m---- udp_query: blah[m
[31m---- udp_reply: hello udp[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-after[m
[31m-received: hello udp[m
[31m-|before[m
[31m-received: hello udp[m
[31m-after)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: simple user thread with ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.req.read_body()[m
[31m-                local body = ngx.req.get_body_data()[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: simple user thread with ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.req.socket()[m
[31m-                local body, err = sock:receive(11)[m
[31m-                if not body then[m
[31m-                    ngx.say("failed to read body: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: multiple user threads + subrequests returning 404 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-finalize request /proxy/1: rc:404 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=404, status=0 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-finalize request /proxy/2: rc:404 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=404, status=0 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:200 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 404[m
[31m-status: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: multiple user threads + subrequests returning 404 remotely (no wait)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 5 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/d/$1;[m
[31m-    }[m
[31m-[m
[31m-    location /d {[m
[31m-        return 404;[m
[31m-        #echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-create 5 in 1[m
[31m-spawn user thread 5 in 1[m
[31m-create 6 in 1[m
[31m-spawn user thread 6 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-(?:terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 6: ok[m
[31m-delete thread 6|terminate 6: ok[m
[31m-delete thread 6[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: multiple user threads + subrequests returning 201 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        content_by_lua 'ngx.exit(201)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("send header main_req=%d, r=%p\n", $r == $r->main, $r)[m
[31m-    print_ubacktrace()[m
[31m-    printf("========================================")[m
[31m-}[m
[31m---- stap_out3[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-finalize request /proxy/1: rc:0 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=0, status=201 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-finalize request /proxy/2: rc:0 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=0, status=201 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:200 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 201[m
[31m-status: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: multiple user threads + subrequests returning 204 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        content_by_lua 'ngx.exit(204)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-finalize request /proxy/1: rc:204 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=204, status=204 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-finalize request /proxy/2: rc:204 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=204, status=204 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:200 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 204[m
[31m-status: 204[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/auth.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/auth.t[m
[1mdeleted file mode 100644[m
[1mindex 5da09cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/auth.t[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-#no_nginx_manager();[m
[31m-[m
[31m-#repeat_each(1);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic test passing[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 100k;[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            -- check the client IP addr is in our black list[m
[31m-            if ngx.var.remote_addr == "132.5.72.3" then[m
[31m-                ngx.exit(ngx.HTTP_FORBIDDEN)[m
[31m-            end[m
[31m-[m
[31m-            -- check if the request body contains bad words[m
[31m-            if ngx.var.request_body and string.match(ngx.var.request_body, "fuck") then[m
[31m-                return ngx.redirect("/terms_of_use.html")[m
[31m-            end[m
[31m-[m
[31m-            -- tests passed[m
[31m-        ';[m
[31m-[m
[31m-        echo Logged in;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Logged in[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bad words in request body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 100k;[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            -- check the client IP addr is in our black list[m
[31m-            if ngx.var.remote_addr == "132.5.72.3" then[m
[31m-                ngx.exit(ngx.HTTP_FORBIDDEN)[m
[31m-            end[m
[31m-[m
[31m-            -- check if the request body contains bad words[m
[31m-            if ngx.var.request_body and string.match(ngx.var.request_body, "fuck") then[m
[31m-                return ngx.redirect("/terms_of_use.html")[m
[31m-            end[m
[31m-[m
[31m-            -- tests passed[m
[31m-        ';[m
[31m-[m
[31m-        echo Logged in;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-He fucks himself![m
[31m---- response_body_like: 302 Found[m
[31m---- response_headers_like[m
[31m-Location: /terms_of_use\.html[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: client IP[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 100k;[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            -- check the client IP addr is in our black list[m
[31m-            if ngx.var.remote_addr == "127.0.0.1" then[m
[31m-                ngx.exit(ngx.HTTP_FORBIDDEN)[m
[31m-            end[m
[31m-[m
[31m-            -- check if the request body contains bad words[m
[31m-            if ngx.var.request_body and string.match(ngx.var.request_body, "fuck") then[m
[31m-                return ngx.redirect("/terms_of_use.html")[m
[31m-            end[m
[31m-[m
[31m-            -- tests passed[m
[31m-        ';[m
[31m-[m
[31m-        echo Logged in;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/client-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/client-abort.t[m
[1mdeleted file mode 100644[m
[1mindex a94f822..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/client-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,853 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- wait: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: subrequest + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: subrequest + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: fail[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad things happen[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: subrequest + stop (proxy, ignore client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: subrequest + stop (proxy, check client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort off;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: need body on + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        lua_need_request_body on;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.req.socket + receive() + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.req.socket + receive(N) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(5)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.req.socket + receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:lua check broken conn[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup|lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.req.socket + m * receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(1)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.req.socket + receiveuntil + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.req.socket + receiveuntil + it(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it(2)[m
[31m-            it(3)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: cosocket + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "failed to get socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("blpop nonexist 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.log(ngx.ERR, "about to receive")[m
[31m-[m
[31m-            local res, err = sock:receive()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to receive query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "res: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.req.socket + receive n < content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 100\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to receive: client aborted[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.req.socket + receive n == content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.sleep(1)[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.req.socket + receive n == content-length + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: exec to lua + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exec to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: exec (named location) to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("@t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location @t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/exec.t[m
[1mdeleted file mode 100644[m
[1mindex 8bf638f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,351 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/hi");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty uri arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec();[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: too many args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec(1, 2, 3, 4);[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: null uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec(nil)[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/hi", "Yichun Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello Yichun Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: args in uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/hi?agentzh")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello agentzh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello a=Yichun&b=Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("@hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location @hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exec after location capture[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua_file 'html/test.lua';[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('/b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exec after (named) location capture[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location @b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('@b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (named location)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location @p {[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("@p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (post subrequest)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/blah")[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: access_by_lua + ngx.exec + subrequest capture[m
[31m---- config[m
[31m-    location /main {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/test_loc");[m
[31m-            ngx.print("hello, ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /test_loc {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m-    location @proxy {[m
[31m-        #echo proxy;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo bah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, bah[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/exit.t[m
[1mdeleted file mode 100644[m
[1mindex 8470ab9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,548 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#repeat_each(20000);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#log_level('debug');[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1024);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: throw 403[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.exit(403);ngx.say('hi')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: throw 404[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.exit(404);ngx.say('hi');";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 404[m
[31m---- response_body_like: 404 Not Found[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: throw 404 after sending the header and partial body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.say('hi');ngx.exit(404);ngx.say(', you')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- error_log[m
[31m-attempt to set status 404 via ngx.exit after sending out the response status 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: working with ngx_auth_request (succeeded)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        access_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentzh[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Logged in[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: working with ngx_auth_request (failed)[m
[31m---- config[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        access_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentz[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: working with ngx_auth_request (simplest form, w/o ngx_memc)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        access_by_lua_file 'html/foo.lua';[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m-print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m-print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    -- ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: working with ngx_auth_request (simplest form)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        access_by_lua_file html/foo.lua;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: working with ngx_auth_request[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_b {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream_list memc_cluster memc_a memc_b;[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        access_by_lua_file html/foo.lua;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: working with ngx_auth_request[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 300;[m
[31m-    }[m
[31m-[m
[31m-    #upstream_list memc_cluster memc_a memc_b;[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        #set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass memc_a;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uri-$query_string";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        set_quote_sql_str $seo_uri $query_string;[m
[31m-        drizzle_query "select url from my_url_map where seo_url=$seo_uri";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        access_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /baz {[m
[31m-        set $my_uri $uri;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo_exec /jump $my_uri;[m
[31m-    }[m
[31m-[m
[31m-    location /jump {[m
[31m-        internal;[m
[31m-        rewrite ^ $query_string? redirect;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local seo_uri = ngx.var.my_uri[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-mysql?' .. seo_uri)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].url) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.my_uri = res[1].url;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /baz[m
[31m---- response_body_like: 302[m
[31m---- error_code: 302[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/foo/bar[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: throw 0[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.say('Hi'); ngx.eof(); ngx.exit(0);ngx.say('world')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: throw ngx.OK does *not* skip other later phase handlers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.exit(ngx.OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: throw ngx.HTTP_OK *does* skip other later phase handlers (by inlined code)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.exit(ngx.HTTP_OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by inlined code + partial output)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.say('hiya') ngx.exit(ngx.HTTP_OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: throw ngx.HTTP_OK *does* skip other later phase handlers (by file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua_file html/foo.lua;[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by file + partial output)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/foo.lua;[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.say("morning")[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-morning[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: error page with custom body[m
[31m---- config[m
[31m-    error_page 410 @err;[m
[31m-    location @err {[m
[31m-        echo blah blah;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            ngx.status = ngx.HTTP_GONE[m
[31m-            ngx.say("This is our own content")[m
[31m-            -- to cause quit the whole request rather than the current phase handler[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-        echo Hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-This is our own content[m
[31m---- error_code: 410[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exit(404) after I/O[m
[31m---- config[m
[31m-    error_page 400 /400.html;[m
[31m-    error_page 404 /404.html;[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.exit(ngx.HTTP_NOT_FOUND)[m
[31m-        ';[m
[31m-        echo Hello;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.002;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 400.html[m
[31m-Bad request, dear...[m
[31m->>> 404.html[m
[31m-Not found, dear...[m
[31m---- request[m
[31m-    GET /bah[m
[31m---- response_body[m
[31m-Not found, dear...[m
[31m---- error_code: 404[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/mixed.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/mixed.t[m
[1mdeleted file mode 100644[m
[1mindex a9f8039..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/mixed.t[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: access I/O with content I/O[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("access GET: ", res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            print("access PUT: ", res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("access cached: ", res.body);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("content PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content cached: " .. res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-content GET: 404[m
[31m-content PUT: 201[m
[31m-content cached: hello[m
[31m---- grep_error_log eval: qr/access .+?(?= while )/[m
[31m---- grep_error_log_out[m
[31m-access GET: 404[m
[31m-access PUT: 201[m
[31m-access cached: hello[m
[31m-[m
[31m---- log_level: info[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: share data via nginx variables[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo '';[m
[31m-        access_by_lua '[m
[31m-            ngx.var.foo = 32[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say(tonumber(ngx.var.foo) * 2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-64[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: share the request body (need request body explicitly off)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        set $res '';[m
[31m-        access_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: share the request body (need request body off by default)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        #lua_need_request_body off;[m
[31m-        set $res '';[m
[31m-        access_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: share the request body (need request body on)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        set $res '';[m
[31m-        access_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: rewrite I/O with access I/O with content I/O[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("rewrite GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            print("rewrite PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("rewrite cached: " .. res.body);[m
[31m-        ';[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("access GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            print("access PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("access cached: " .. res.body);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("content PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-content GET: 404[m
[31m-content PUT: 201[m
[31m-content cached: hello[m
[31m-[m
[31m---- grep_error_log eval: qr/(?:rewrite|access) .+?(?= while )/[m
[31m---- grep_error_log_out[m
[31m-rewrite GET: 404[m
[31m-rewrite PUT: 201[m
[31m-rewrite cached: hello[m
[31m-access GET: 404[m
[31m-access PUT: 201[m
[31m-access cached: hello[m
[31m-[m
[31m---- log_level: info[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: I/O in access shortcuts content automatically[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_by_lua_block {[m
[31m-            ngx.print("")[m
[31m-        }[m
[31m-[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/multi-capture.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/multi-capture.t[m
[1mdeleted file mode 100644[m
[1mindex 368d401..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/multi-capture.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(10);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/([a-d])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = c[m
[31m-res4.status = 200[m
[31m-res4.body = d[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: capture multi in series[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("2 res1.status = " .. res1.status)[m
[31m-            ngx.say("2 res1.body = " .. res1.body)[m
[31m-            ngx.say("2 res2.status = " .. res2.status)[m
[31m-            ngx.say("2 res2.body = " .. res2.body)[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-2 res1.status = 200[m
[31m-2 res1.body = a[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: capture multi in subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo?n=1")[m
[31m-            ngx.say("top res.status = " .. res.status)[m
[31m-            ngx.say("top res.body = [" .. res.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res.status = 200[m
[31m-top res.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: capture multi in parallel[m
[31m---- config[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("top res1.status = " .. res1.status)[m
[31m-            ngx.say("top res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("top res2.status = " .. res2.status)[m
[31m-            ngx.say("top res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([abcd])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res1.status = 200[m
[31m-top res1.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-top res2.status = 200[m
[31m-top res2.body = [2 res1.status = 200[m
[31m-2 res1.body = c[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = d[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: memc sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[ab]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: memc muti + multi[m
[31m---- config[m
[31m-    location /main {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-            print("args: " .. ngx.var.args)[m
[31m-            local n = ngx.var.arg_n[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[abcd]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = [1 res1.status = 201[m
[31m-1 res1.body = STORED\r[m
[31m-[m
[31m-1 res2.status = 201[m
[31m-1 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-res2.status = 200[m
[31m-res2.body = [2 res1.status = 201[m
[31m-2 res1.body = STORED\r[m
[31m-[m
[31m-2 res2.status = 201[m
[31m-2 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: memc 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[a-d]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-res3.status = 201[m
[31m-res3.body = STORED\r[m
[31m-[m
[31m-res4.status = 201[m
[31m-res4.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/on-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/on-abort.t[m
[1mdeleted file mode 100644[m
[1mindex 0c17b55..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/on-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,652 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 15);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ignore the client abort event in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: abort in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.exit(499) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exit(408) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(408)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(-1) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(-1)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(0) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(0)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.log(ngx.ERR, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.7;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.6[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-'client prematurely closed connection',[m
[31m-'on abort called',[m
[31m-qr/lua user thread aborted: runtime error: access_by_lua\(nginx\.conf:\d+\):4: attempt to abort with pending subrequests/,[m
[31m-'main handler done',[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: accessing cosocket in callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flushall\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive()[m
[31m-                if not res then[m
[31m-                    ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                ngx.log(ngx.NOTICE, "callback done: ", res)[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-lua check broken conn[m
[31m-(?:lua check broken conn[m
[31m-)?terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-$[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.2[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-callback done: +OK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ignore the client abort event in the user callback (no check)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("cannot set on_abort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- response_body[m
[31m-cannot set on_abort: lua_check_client_abort is off[m
[31m---- no_error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: regsiter on_abort callback but no client abortion[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ignore the client abort event in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abort in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: regsiter on_abort callback but no client abortion (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: regsiter on_abort callback multiple times[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("1: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("2: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-2: cannot set on_abort: duplicate call[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/redirect.t[m
[1mdeleted file mode 100644[m
[1mindex c7ce512..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,125 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 3;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo");[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: explicit 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", ngx.HTTP_MOVED_TEMPORARILY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: explicit 301[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", ngx.HTTP_MOVED_PERMANENTLY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad rc[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", 404);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: no args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect()[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: relative uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like: Location: /foo\r\n[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/req-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/req-body.t[m
[1mdeleted file mode 100644[m
[1mindex fd33aff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/req-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,221 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 19);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read buffered body[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read buffered body (timed out)[m
[31m---- config[m
[31m-    client_body_timeout 1ms;[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /test HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 100\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-hello, world"[m
[31m---- response_body:[m
[31m---- error_code_like: ^(?:500)?$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read buffered body and then subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: first subrequest and then read buffered body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: failed to write 100 continue[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-http finalize request: 500, "/test?" a:1, c:0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: not discard body (exit 200)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        access_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not discard body (exit 201)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        access_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: not discard body (exit 302)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        access_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            -- ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.redirect("/blah")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-[qr/302 Found/,[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[302, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/request_body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/request_body.t[m
[1mdeleted file mode 100644[m
[1mindex e4ac161..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/request_body.t[m
[1m+++ /dev/null[m
[36m@@ -1,173 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('debug'); # to ensure any log-level can be outputed[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test not reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test default setting (not reading request body)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: test main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test override main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test override server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: Expect: 100-Continue[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo_body[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-http finalize request: 500, "/echo_body?" a:1, c:2[m
[31m-http finalize request: 500, "/echo_body?" a:1, c:0[m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex de63a68..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,744 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#log_level('warn');[m
[31m-#no_nginx_manager();[m
[31m-#master_on();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 11);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        access_by_lua 'ngx.print("Hello, Lua!\\n")';[m
[31m-        content_by_lua return;[m
[31m-        #content_by_lua 'ngx.say("Hi")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic say[m
[31m---- config[m
[31m-    location /say {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        access_by_lua '[m
[31m-            ngx.say("Hello, Lua!")[m
[31m-            ngx.say("Yay! ", 123)';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /say[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-Yay! 123[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no ngx.echo[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.echo("Hello, Lua!\\n")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: variable[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        access_by_lua 'v = ngx.var["request_uri"] ngx.print("request_uri: ", v, "\\n")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variable (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua_file html/test.lua;[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: calc expression[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua_file html/calc.lua;[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> calc.lua[m
[31m-local function uri_unescape(uri)[m
[31m-    local function convert(hex)[m
[31m-        return string.char(tonumber("0x"..hex))[m
[31m-    end[m
[31m-    local s = string.gsub(uri, "%%([0-9a-fA-F][0-9a-fA-F])", convert)[m
[31m-    return s[m
[31m-end[m
[31m-[m
[31m-local function eval_exp(str)[m
[31m-    return loadstring("return "..str)()[m
[31m-end[m
[31m-[m
[31m-local exp_str = ngx.var["arg_exp"][m
[31m--- print("exp: '", exp_str, "'\n")[m
[31m-local status, res[m
[31m-status, res = pcall(uri_unescape, exp_str)[m
[31m-if not status then[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-    return[m
[31m-end[m
[31m-status, res = pcall(eval_exp, res)[m
[31m-if status then[m
[31m-    ngx.print("result: ", res, "\n")[m
[31m-else[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua?exp=1%2B2*math.sin(3)%2Fmath.exp(4)-math.sqrt(2)[m
[31m---- response_body[m
[31m-result: -0.4090441561579[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read $arg_xxx[m
[31m---- config[m
[31m-    location = /lua {[m
[31m-        access_by_lua 'who = ngx.var.arg_who[m
[31m-            ngx.print("Hello, ", who, "!")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?who=agentzh[m
[31m---- response_body chomp[m
[31m-Hello, agentzh![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: capture location[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-res = ngx.location.capture("/other")[m
[31m-ngx.print("status=", res.status, " ")[m
[31m-ngx.print("body=", res.body)[m
[31m-';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-status=200 body=hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: capture non-existed location[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'res = ngx.location.capture("/other"); ngx.print("status=", res.status)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body: status=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: invalid capture location (not as expected...)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'res = ngx.location.capture("*(#*"); ngx.say("res=", res.status)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-res=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nil is "nil"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.say(nil)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: write boolean[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.say(true, " ", false)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-true false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: bad argument type to ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.location.capture(nil)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: capture location (default 0);[m
[31m---- config[m
[31m- location /recur {[m
[31m-       access_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body, "\\n");[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-[m
[31m-           content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur[m
[31m---- response_body[m
[31m-num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: capture location[m
[31m-access phase not running in subrequests[m
[31m---- config[m
[31m- location /recur {[m
[31m-       access_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body);[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-[m
[31m-           content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur?num=3[m
[31m---- response_body chomp[m
[31m-num is: 3[m
[31m-status=200 body=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: setting nginx variables from within Lua[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a "";[m
[31m-       access_by_lua 'ngx.var.a = 32; ngx.say(ngx.var.a)';[m
[31m-       content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-       add_header Foo $a;[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_headers[m
[31m-Foo: 32[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: nginx quote sql string 1[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a 'hello\n\r\'"\\'; # this runs after access_by_lua[m
[31m-       access_by_lua 'ngx.say(ngx.quote_sql_str(ngx.var.a))';[m
[31m-       content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: nginx quote sql string 2[m
[31m---- config[m
[31m-location /set {[m
[31m-    #set $a "hello\n\r'\"\\";[m
[31m-    access_by_lua 'ngx.say(ngx.quote_sql_str("hello\\n\\r\'\\"\\\\"))';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: use dollar[m
[31m---- config[m
[31m-location /set {[m
[31m-    access_by_lua '[m
[31m-        local s = "hello 112";[m
[31m-        ngx.say(string.find(s, "%d+$"))';[m
[31m-[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-79[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: subrequests do not share variables of main requests by default[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a 12;[m
[31m-    access_by_lua 'res = ngx.location.capture("/sub"); ngx.print(res.body)';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: subrequests can share variables of main requests[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a '';[m
[31m-    access_by_lua '[m
[31m-        ngx.var.a = 12;[m
[31m-        res = ngx.location.capture([m
[31m-            "/sub",[m
[31m-            { share_all_vars = true }[m
[31m-        );[m
[31m-        ngx.print(res.body)[m
[31m-    ';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: main requests use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-}[m
[31m-location /parent {[m
[31m-    access_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = true });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: main requests do NOT use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-    content_by_lua return;[m
[31m-}[m
[31m-[m
[31m-location /parent {[m
[31m-    access_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = false });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-    content_by_lua return;[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body_like eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"]);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: Bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        access_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-            ngx.header.Bar = nil;[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"] or "nil");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: access_by_lua runs after ngx_access[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        deny all;[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: auth_request runs before ngx_access[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        deny all;[m
[31m-[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: access_by_lua shouldn't send headers automatically (on simple return)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'return';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        default_type 'text/css';[m
[31m-        add_header Bar Baz;[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-Bar: Baz[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: access_by_lua shouldn't send headers automatically (on simple exit)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.exit(ngx.OK)';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        default_type 'text/css';[m
[31m-        add_header Bar Baz;[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-Bar: Baz[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: short circuit[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.say("Hi")[m
[31m-            ngx.eof()[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            print("HERE")[m
[31m-            ngx.print("BAD")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: nginx vars in script path[m
[31m---- config[m
[31m-    location ~ ^/lua/(.+)$ {[m
[31m-        access_by_lua_file html/$1.lua;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            print("HERE")[m
[31m-            ngx.print("BAD")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> hi.lua[m
[31m-ngx.say("Hi")[m
[31m-ngx.eof()[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua/hi[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: phase postponing works for various locations (access phase not running in subrequest)[m
[31m---- config[m
[31m-    location ~ '^/lua/(.+)' {[m
[31m-        set $path $1;[m
[31m-        access_by_lua 'ngx.say(ngx.var.path)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/lua2/(.+)' {[m
[31m-        set $path $1;[m
[31m-        access_by_lua 'ngx.say(ngx.var.path)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua/foo;[m
[31m-        echo_location /lua/bar;[m
[31m-        echo_location /lua2/baz;[m
[31m-        echo_location /lua2/bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: server access_by_lua[m
[31m---- config[m
[31m-    access_by_lua 'ngx.header["X-Foo"] = "bar" -- ngx.send_headers()';[m
[31m---- request[m
[31m-GET /[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m---- response_headers[m
[31m-X-Foo: bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: server access_by_lua_file[m
[31m---- config[m
[31m-    access_by_lua_file html/foo.lua;[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header["X-Foo"] = "bar" -- ngx.send_headers()[m
[31m---- request[m
[31m-GET /[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m---- response_headers[m
[31m-X-Foo: bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: use of ngx.say() in access_by_lua without exiting with 200+.[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua "ngx.say('test')";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: use of ngx.say() in access_by_lua without exiting with 200+. (with explicit ngx.eof())[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua "ngx.say('test') ngx.eof()";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: use of ngx.say() in access_by_lua without exiting with 200+. (with IO)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua "ngx.say('test') ngx.sleep(0.001)";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/satisfy.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/satisfy.t[m
[1mdeleted file mode 100644[m
[1mindex 10d3ece..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/satisfy.t[m
[1m+++ /dev/null[m
[36m@@ -1,212 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(4);[m
[31m-#log_level('warn');[m
[31m-no_root_location();[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: satisfy any[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        allow all;[m
[31m-        access_by_lua 'ngx.exit(403)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: satisfy any[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.exit(403)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: satisfy any (explicit ngx.exit(0))[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.exit(0)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: satisfy any (simple return)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua return;[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: satisfy any (declined)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.exit(ngx.DECLINED)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: satisfy any (declined, with I/O)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.location.capture("/echo") ngx.exit(ngx.DECLINED)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-        #echo_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: satisfy any (simple return, with I/O)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.location.capture("/echo") return';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: satisfy any - with I/O[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.location.capture("/echo") ngx.exit(403)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: satisfy any (explicit ngx.exit(0), with I/O)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.location.capture("/echo") ngx.exit(0)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/sleep.t[m
[1mdeleted file mode 100644[m
[1mindex 2eb0822..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,222 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 33;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep 0.5[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep(0.5)[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-5]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep ag[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep("a")[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep 0.5 in subrequest[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            local now = ngx.now()[m
[31m-            local delay = now - before[m
[31m-            ngx.say(delay)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        content_by_lua 'ngx.sleep(0.5)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-9]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/sleep?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sleep a in subrequest with bad argument[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            local res = ngx.location.capture("/sleep");[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        content_by_lua 'ngx.sleep("a")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-500[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sleep 0.5 - multi-times[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local start = ngx.now()[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say(ngx.now() - start)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:8[5-9]\d*|9[0-9]\d*|9)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: sleep 0.5 - interleaved by ngx.say() - ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(1)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m---- error_log[m
[31m-lua ready to sleep[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sleep 0.5 - interleaved by ngx.say() - not ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(0.5)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m-hiya[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.location.capture before and after ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /hello {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m-    location = /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 00c56b8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,602 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: DELETE[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: DELETE (proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: POST (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-POST[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: HEAD[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_HEAD });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: explicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: implicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: implicit GET (empty option table)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo", {})[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: PUT (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-        #echo "[$http_content_length]";[m
[31m-        echo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo $echo_request_method;[m
[31m-        echo -n "[$http_content_length]";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-            ngx.say(res.body)[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-PUT[m
[31m-hello[m
[31m-GET[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: POST (with body, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-POST[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd "";[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/flush",[m
[31m-                { share_all_vars = true });[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { share_all_vars = true });[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello", share_all_vars = true });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc", { share_all_vars = true });[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: emtpy args option table[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = {} })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: non-empty args option table (1 pair)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-fo%3D=%3D%3E[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: non-empty args option table (2 pairs)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>",[m
[31m-                    ["="] = ":" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:fo%3D=%3D%3E\&%3D=%3A|%3D=%3A\&fo%3D=%3D%3E)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: non-empty args option table (2 pairs, no special chars)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { foo = 3,[m
[31m-                    bar = "hello" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:bar=hello\&foo=3|foo=3\&bar=hello)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: non-empty args option table (number key)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { [57] = "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: non-empty args option table (plain arrays)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = { b = 4 } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = "b=4" })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: I/O in named location[m
[31m-the nginx core requires the patch https://github.com/agentzh/ngx_openresty/blob/master/patches/nginx-1.0.15-reset_wev_handler_in_named_locations.patch[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_exec @named;[m
[31m-    }[m
[31m-[m
[31m-    location @named {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/hello")[m
[31m-        ';[m
[31m-        echo done;[m
[31m-    }[m
[31m-[m
[31m-    location /hello {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-exec.t[m
[1mdeleted file mode 100644[m
[1mindex d7c2321..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,347 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exec in user thread (entry still pending)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exec in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exec in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exec in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exec in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-exit.t[m
[1mdeleted file mode 100644[m
[1mindex c08fefc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,1314 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exit in user thread (entry thread is still pending to run)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-                ngx.say("g")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m-f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exit in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("exiting the user thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-exiting the user thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.tcp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_tcp_resolve_cleanup) {[m
[31m-    println("lua tcp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.udp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_resolve_cleanup) {[m
[31m-    println("lua udp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: exit in user thread (entry thread is still pending on tcpsock:connect)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(12000)[m
[31m-            local ok, err = sock:connect("106.187.41.147", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: exit in user thread (entry thread is still pending on tcpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: exit in user thread (entry thread is still pending on tcpsock:receiveuntil's iterator)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local it, err = sock:receiveuntil("\\r\\n")[m
[31m-            if not it then[m
[31m-                ngx.say("failed to receive until: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = it()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exit in user thread (entry thread is still pending on udpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_socket_cleanup) {[m
[31m-    println("lua udp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exit in user thread (entry thread is still pending on reqsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.req.socket()[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive(1024)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exit in user thread (entry thread is still pending on ngx.req.read_body)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_req_body_cleanup) {[m
[31m-    println("lua req body cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req body cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exit in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: exit in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: exit in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-redirect.t[m
[1mdeleted file mode 100644[m
[1mindex 8b030ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.redirect() in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: redirect in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-spawn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-spawn.t[m
[1mdeleted file mode 100644[m
[1mindex 415e4c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/024-access/uthread-spawn.t[m
[1m+++ /dev/null[m
[36m@@ -1,1119 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple user thread without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval[m
[31m-<<'_EOC_' . $::StapScript;[m
[31m-[m
[31m-F(ngx_http_lua_send_chain_link) {[m
[31m-    printf("send link %p\n", $in)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    println("core content phase")[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: two simple user threads without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("in thread 1")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("in thread 2")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before 1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after 1")[m
[31m-[m
[31m-            ngx.say("before 2")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after 2")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before 1[m
[31m-in thread 1[m
[31m-after 1[m
[31m-before 2[m
[31m-in thread 2[m
[31m-after 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple user thread with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before sleep[m
[31m-after thread create[m
[31m-after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: two simple user threads with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("1: before sleep")[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("1: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("2: before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("2: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("1: after thread create")[m
[31m-[m
[31m-            ngx.say("2: before thread create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("2: after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-1: before thread create[m
[31m-1: before sleep[m
[31m-1: after thread create[m
[31m-2: before thread create[m
[31m-2: before sleep[m
[31m-2: after thread create[m
[31m-2: after sleep[m
[31m-1: after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: error in user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.blah()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-after[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: access_by_lua\(nginx\.conf:\d+\):3: attempt to call field 'blah' \(a nil value\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple user threads doing a single subrequest (entry quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple user threads doing a single subrequest (entry also does a subrequest and quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-capture: hello bar[m
[31m-after capture: hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple user threads doing a single subrequest (entry also does a subrequest and quits late)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello foo[m
[31m-capture: hello bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: two simple user threads doing single subrequests (entry also does a subrequest and quits between)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("f: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("f: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("g: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?bah")[m
[31m-                ngx.say("g: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread 1 create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread 1 create")[m
[31m-[m
[31m-            ngx.say("before thread 2 create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after thread 2 create")[m
[31m-[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bah {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n hello bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before thread 1 create[m
[31m-f: before capture[m
[31m-after thread 1 create[m
[31m-before thread 2 create[m
[31m-g: before capture[m
[31m-after thread 2 create[m
[31m-f: after capture: hello foo[m
[31m-capture: hello bar[m
[31m-g: after capture: hello bah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nested user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after f[m
[31m-after g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nested user threads (with I/O)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-after f[m
[31m-after g[m
[31m-hello in g()[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: coroutine status of a running user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: running[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: coroutine status of a dead user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-status: zombie[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: coroutine status of a "normal" user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                local co2 = coroutine.create(g)[m
[31m-                coroutine.resume(co2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: normal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: creating user threads in a user coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after g[m
[31m-after f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: manual time slicing between a user thread and the entry thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            local self = coroutine.running()[m
[31m-            ngx.say("0")[m
[31m-            yield(self)[m
[31m-            ngx.say("1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("2")[m
[31m-            yield(self)[m
[31m-            ngx.say("3")[m
[31m-            yield(self)[m
[31m-            ngx.say("4")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-0[m
[31m-1[m
[31m-f 1[m
[31m-2[m
[31m-f 2[m
[31m-3[m
[31m-f 3[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: manual time slicing between two user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("g 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 3")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-f 2[m
[31m-done[m
[31m-g 2[m
[31m-f 3[m
[31m-g 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entry thread and a user thread flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                coroutine.yield(coroutine.running)[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.flush(true)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: two user threads flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello from g")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- response_body[m
[31m-hello from f[m
[31m-hello from g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: user threads + ngx.socket.tcp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flush_all\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: user threads + ngx.socket.udp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.udp()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", 12345)[m
[31m-                local bytes, err = sock:send("blah")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- udp_listen: 12345[m
[31m---- udp_query: blah[m
[31m---- udp_reply: hello udp[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-after[m
[31m-received: hello udp[m
[31m-|before[m
[31m-received: hello udp[m
[31m-after)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: simple user thread with ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.req.read_body()[m
[31m-                local body = ngx.req.get_body_data()[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: simple user thread with ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.req.socket()[m
[31m-                local body, err = sock:receive(11)[m
[31m-                if not body then[m
[31m-                    ngx.say("failed to read body: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/025-codecache.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/025-codecache.t[m
[1mdeleted file mode 100644[m
[1mindex f33452a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/025-codecache.t[m
[1m+++ /dev/null[m
[36m@@ -1,1247 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 155;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: code cache on by default[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: code cache explicitly on[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache on;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: code cache explicitly off[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-101[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: code cache explicitly off (server level)[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-101[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: code cache explicitly off (server level) but be overridden in the location[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m-    location /lua {[m
[31m-        lua_code_cache on;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: code cache explicitly off (affects require) + content_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo";[m
[31m-        ';[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/foo.lua", "w"))[m
[31m-            f:write("module(..., package.seeall); ngx.say(102);")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall); ngx.say(32);[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-102[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: code cache explicitly off (affects require) + content_by_lua_file[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/foo.lua", "w"))[m
[31m-            f:write("module(..., package.seeall); ngx.say(102);")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local foo = require "foo";[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall); ngx.say(32);[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-102[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: code cache explicitly off (affects require) + set_by_lua_file[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        set_by_lua_file $a html/test.lua;[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/foo.lua", "w"))[m
[31m-            f:write("module(..., package.seeall); return 102;")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-return require "foo"[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall); return 32;[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-102[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: code cache explicitly on (affects require) + set_by_lua_file[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache on;[m
[31m-        set_by_lua_file $a html/test.lua;[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/foo.lua", "w"))[m
[31m-            f:write("module(..., package.seeall); return 102;")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-return require "foo"[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall); return 32;[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: code cache explicitly off + set_by_lua_file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        set_by_lua_file $a html/test.lua;[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("return 101")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-return 32[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-101[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: code cache explicitly on + set_by_lua_file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache on;[m
[31m-        set_by_lua_file $a html/test.lua;[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("return 101")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-return 32[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: no clear builtin lib "string"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(string.len("hello"))[m
[31m-ngx.say(table.concat({1,2,3}, ", "))[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-5[m
[31m-1, 2, 3[m
[31m-5[m
[31m-1, 2, 3[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no clear builtin lib "string"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua '[m
[31m-            ngx.say(string.len("hello"))[m
[31m-            ngx.say(table.concat({1,2,3}, ", "))[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-5[m
[31m-1, 2, 3[m
[31m-5[m
[31m-1, 2, 3[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: no clear builtin lib "string"[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local test = require("test")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-string = require("string")[m
[31m-math = require("math")[m
[31m-io = require("io")[m
[31m-os = require("os")[m
[31m-table = require("table")[m
[31m-coroutine = require("coroutine")[m
[31m-package = require("package")[m
[31m-ngx.say("OK")[m
[31m---- response_body[m
[31m-OK[m
[31m-OK[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: do not skip luarocks[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-     lua_code_cache off;"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /load;[m
[31m-        echo_location /check;[m
[31m-        echo_location /check;[m
[31m-    }[m
[31m-[m
[31m-    location /load {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.luarocks = nil;[m
[31m-            local foo = require "luarocks";[m
[31m-            foo.hi()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /check {[m
[31m-        content_by_lua '[m
[31m-            local foo = package.loaded.luarocks[m
[31m-            if foo then[m
[31m-                ngx.say("found")[m
[31m-            else[m
[31m-                ngx.say("not found")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- user_files[m
[31m->>> luarocks.lua[m
[31m-module(..., package.seeall);[m
[31m-[m
[31m-ngx.say("loading");[m
[31m-[m
[31m-function hi ()[m
[31m-    ngx.say("hello, foo")[m
[31m-end;[m
[31m---- response_body[m
[31m-loading[m
[31m-hello, foo[m
[31m-not found[m
[31m-not found[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: do not skip luarocks*[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-     lua_code_cache off;"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /load;[m
[31m-        echo_location /check;[m
[31m-        echo_location /check;[m
[31m-    }[m
[31m-[m
[31m-    location /load {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.luarocks2 = nil;[m
[31m-            local foo = require "luarocks2";[m
[31m-            foo.hi()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /check {[m
[31m-        content_by_lua '[m
[31m-            local foo = package.loaded.luarocks2[m
[31m-            if foo then[m
[31m-                ngx.say("found")[m
[31m-            else[m
[31m-                ngx.say("not found")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- user_files[m
[31m->>> luarocks2.lua[m
[31m-module(..., package.seeall);[m
[31m-[m
[31m-ngx.say("loading");[m
[31m-[m
[31m-function hi ()[m
[31m-    ngx.say("hello, foo")[m
[31m-end;[m
[31m---- response_body[m
[31m-loading[m
[31m-hello, foo[m
[31m-not found[m
[31m-not found[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: clear _G table[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            if not _G.foo then[m
[31m-                _G.foo = 1[m
[31m-            else[m
[31m-                _G.foo = _G.foo + 1[m
[31m-            end[m
[31m-            ngx.say("_G.foo: ", _G.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-_G.foo: 1[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: github #257: globals cleared when code cache off[m
[31m---- http_config[m
[31m-    lua_code_cache off;[m
[31m-    init_by_lua '[m
[31m-      test = setfenv([m
[31m-        function()[m
[31m-          ngx.say(tostring(table))[m
[31m-        end,[m
[31m-        setmetatable({},[m
[31m-        {[m
[31m-          __index = function(self, key)[m
[31m-          return rawget(self, key) or _G[key][m
[31m-        end[m
[31m-      }))';[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'test()';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^table: 0x\d*?[1-9a-fA-F][m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: lua_code_cache off + FFI-based Lua modules[m
[31m---- http_config[m
[31m-    lua_code_cache off;[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            if not jit then[m
[31m-                ngx.say("skipped for non-LuaJIT")[m
[31m-            else[m
[31m-                local test = require("test")[m
[31m-                ngx.say("test module loaded: ", test and true or false)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local ffi = require "ffi"[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int my_test_function_here(void *p);[m
[31m-    int my_test_function_here2(void *p);[m
[31m-    int my_test_function_here3(void *p);[m
[31m-]][m
[31m-[m
[31m-return {[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^(?:skipped for non-LuaJIT|test module loaded: true)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.timer.* + ndk[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /read {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            ngx.timer.at(0, function ()[m
[31m-                local foo = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-                ngx.log(ngx.WARN, "foo = ", foo)[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-ok[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["foo = a b",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: set ngx.ctx before internal redirects performed by other nginx modules (with log_by_lua)[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = "hello world";[m
[31m-        ';[m
[31m-        echo_exec /foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello;[m
[31m-        log_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log eval[m
[31m-["lua release ngx.ctx at ref",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: set by lua file[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $res html/a.lua $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return ngx.arg[1] + ngx.arg[2][m
[31m---- request[m
[31m-GET /lua?a=5&b=2[m
[31m---- response_body[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-[qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: simple set by lua[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "return 1+1";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: lua_max_pending_timers - chained timers (non-zero delay) - not exceeding[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 1;[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0.01, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-decrementing the reference count for Lua VM: 3[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"trace: [m][f][g]",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: lua variable sharing via upvalue[m
[31m---- http_config[m
[31m-    lua_code_cache off;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local foo[m
[31m-            local function f()[m
[31m-                foo = 3[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.06)[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-registered timer[m
[31m-foo = 3[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-decrementing the reference count for Lua VM: 3[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: lua_max_running_timers (just not enough)[m
[31m---- http_config[m
[31m-    lua_max_running_timers 1;[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"1 lua_max_running_timers are not enough",[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"decrementing the reference count for Lua VM: 3",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: GC issue with the on_abort thread object[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.on_abort(function () end)[m
[31m-            collectgarbage()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- abort[m
[31m---- timeout: 0.2[m
[31m---- wait: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-decrementing the reference count for Lua VM: 2[m
[31m-decrementing the reference count for Lua VM: 3[m
[31m---- error_log eval[m
[31m-["decrementing the reference count for Lua VM: 1",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multiple parallel timers[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                fail("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, g)[m
[31m-            if not ok then[m
[31m-                fail("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-decrementing the reference count for Lua VM: 4[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"trace: [m][f][g]",[m
[31m-"decrementing the reference count for Lua VM: 3",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: cosocket connection pool timeout (after Lua VM destroys)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive(1)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-lua tcp socket keepalive max idle timeout[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qq{lua tcp socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"},[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: cosocket connection pool timeout (before Lua VM destroys)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive(1)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-    ngx.sleep(0.01)[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-[[m
[31m-qq{lua tcp socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"},[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive max idle timeout",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: lua_max_running_timers (just not enough, also low lua_max_pending_timers)[m
[31m---- http_config[m
[31m-    lua_max_running_timers 1;[m
[31m-    lua_max_pending_timers 10;[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"1 lua_max_running_timers are not enough",[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"decrementing the reference count for Lua VM: 3",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/026-mysql.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/026-mysql.t[m
[1mdeleted file mode 100644[m
[1mindex e14ffb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/026-mysql.t[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 3;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: when mysql query timed out, kill that query by Lua[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m---- config[m
[31m-    location = /mysql {[m
[31m-        #internal;[m
[31m-        drizzle_send_query_timeout 100ms;[m
[31m-        #drizzle_send_query_timeout 1s;[m
[31m-        drizzle_query $echo_request_body;[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        #error_page 504 /ret/504;[m
[31m-        rds_json on;[m
[31m-        more_set_headers -s 504 "X-Mysql-Tid: $drizzle_thread_id";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local sql = "select sleep(5)"[m
[31m-            local res = ngx.location.capture("/mysql",[m
[31m-                { method = ngx.HTTP_POST, body = sql })[m
[31m-[m
[31m-            ngx.say("status = " .. res.status)[m
[31m-[m
[31m-            local tid = res.header["X-Mysql-Tid"][m
[31m-            if tid == nil then[m
[31m-                ngx.say("thread id = nil")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            tid = tonumber(tid)[m
[31m-            ngx.say("thread id = " .. tid)[m
[31m-[m
[31m-            res = ngx.location.capture("/mysql",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = "kill query " .. tid })[m
[31m-[m
[31m-            ngx.say("kill status = " .. res.status)[m
[31m-            ngx.say("kill body = " .. res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body_like[m
[31m-^status = 504[m
[31m-thread id = \d+[m
[31m-kill status = 200[m
[31m-kill body = {"errcode":0}$[m
[31m---- error_log eval[m
[31m-qr{upstream timed out \(\d+: Connection timed out\) while sending query to drizzle upstream}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no error pages[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m---- config[m
[31m-    location @err { echo Hi; }[m
[31m-    error_page 504 = @err;[m
[31m-    location = /mysql {[m
[31m-        #internal;[m
[31m-        drizzle_send_query_timeout 100ms;[m
[31m-        #drizzle_send_query_timeout 1s;[m
[31m-        drizzle_query $echo_request_body;[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        no_error_pages;[m
[31m-[m
[31m-        rds_json on;[m
[31m-        more_set_headers -s 504 "X-Mysql-Tid: $drizzle_thread_id";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local sql = "select sleep(3)"[m
[31m-            local res = ngx.location.capture("/mysql",[m
[31m-                { method = ngx.HTTP_POST, body = sql })[m
[31m-[m
[31m-            ngx.say("status = " .. res.status)[m
[31m-[m
[31m-            local tid = res.header["X-Mysql-Tid"][m
[31m-            if tid == nil then[m
[31m-                ngx.say("thread id = nil")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            tid = tonumber(tid)[m
[31m-            ngx.say("thread id = " .. tid)[m
[31m-[m
[31m-            res = ngx.location.capture("/mysql",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = "kill query " .. tid })[m
[31m-[m
[31m-            ngx.say("kill status = " .. res.status)[m
[31m-            ngx.say("kill body = " .. res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body_like[m
[31m-^status = 504[m
[31m-thread id = \d+[m
[31m-kill status = 200[m
[31m-kill body = {"errcode":0}$[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/027-multi-capture.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/027-multi-capture.t[m
[1mdeleted file mode 100644[m
[1mindex 3588c69..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/027-multi-capture.t[m
[1m+++ /dev/null[m
[36m@@ -1,755 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(10);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/([a-d])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = c[m
[31m-res4.status = 200[m
[31m-res4.body = d[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: capture multi in series[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("2 res1.status = " .. res1.status)[m
[31m-            ngx.say("2 res1.body = " .. res1.body)[m
[31m-            ngx.say("2 res2.status = " .. res2.status)[m
[31m-            ngx.say("2 res2.body = " .. res2.body)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-2 res1.status = 200[m
[31m-2 res1.body = a[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: capture multi in subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo?n=1")[m
[31m-            ngx.say("top res.status = " .. res.status)[m
[31m-            ngx.say("top res.body = [" .. res.body .. "]")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res.status = 200[m
[31m-top res.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: capture multi in parallel[m
[31m---- config[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("top res1.status = " .. res1.status)[m
[31m-            ngx.say("top res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("top res2.status = " .. res2.status)[m
[31m-            ngx.say("top res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([abcd])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res1.status = 200[m
[31m-top res1.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-top res2.status = 200[m
[31m-top res2.body = [2 res1.status = 200[m
[31m-2 res1.body = c[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = d[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: memc sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/[ab]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: memc muti + multi[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-            print("args: " .. ngx.var.args)[m
[31m-            local n = ngx.var.arg_n[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/[abcd]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = [1 res1.status = 201[m
[31m-1 res1.body = STORED\r[m
[31m-[m
[31m-1 res2.status = 201[m
[31m-1 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-res2.status = 200[m
[31m-res2.body = [2 res1.status = 201[m
[31m-2 res1.body = STORED\r[m
[31m-[m
[31m-2 res2.status = 201[m
[31m-2 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: memc 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/[a-d]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-res3.status = 201[m
[31m-res3.body = STORED\r[m
[31m-[m
[31m-res4.status = 201[m
[31m-res4.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: capture multi in series (more complex)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            local res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo" },[m
[31m-                { "/foo" },[m
[31m-            }[m
[31m-            local res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/foo" },[m
[31m-                { "/foo" },[m
[31m-            }[m
[31m-            ngx.print(res1.body)[m
[31m-            ngx.print(res2.body)[m
[31m-            ngx.print(res3.body)[m
[31m-            ngx.print(res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = a[m
[31m-res4.status = 200[m
[31m-res4.body = b[m
[31m-" x 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: capture multi in series (more complex, using memc)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            local res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/e" },[m
[31m-                { "/f" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_val;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([a-f])$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/memc?cmd=set&val=" .. ngx.var.tag)[m
[31m-            local res = ngx.location.capture("/memc?cmd=get&val=" .. ngx.var.tag)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo" },[m
[31m-                { "/foo" },[m
[31m-            }[m
[31m-            local res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/foo" },[m
[31m-                { "/foo" },[m
[31m-            }[m
[31m-            ngx.print(res1.body)[m
[31m-            ngx.print(res2.body)[m
[31m-            ngx.print(res3.body)[m
[31m-            ngx.print(res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body2[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = e[m
[31m-res4.status = 200[m
[31m-res4.body = f[m
[31m-" x 4[m
[31m---- no_error_log eval[m
[31m-["[error]", "[alert]"][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: a mixture of rewrite, access, content phases[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/a")[m
[31m-            print("rewrite a: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/b")[m
[31m-            print("rewrite b: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/c")[m
[31m-            print("rewrite c: " .. res.body)[m
[31m-        ';[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            local res = ngx.location.capture("/A")[m
[31m-            print("access A: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/B")[m
[31m-            print("access B: " .. res.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/d")[m
[31m-            ngx.say("content d: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/e")[m
[31m-            ngx.say("content e: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/f")[m
[31m-            ngx.say("content f: " .. res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_val;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([A-F])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([a-f])$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/memc?cmd=set&val=" .. ngx.var.tag)[m
[31m-            local res = ngx.location.capture("/memc?cmd=get&val=" .. ngx.var.tag)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-content d: d[m
[31m-content e: e[m
[31m-content f: f[m
[31m-[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/rewrite .+?(?= while )|access .+?(?=,)/[m
[31m---- grep_error_log_out[m
[31m-rewrite a: a[m
[31m-rewrite b: b[m
[31m-rewrite c: c[m
[31m-access A: A[m
[31m-access B: B[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: a mixture of rewrite, access, content phases[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local a, b, c = ngx.location.capture_multi{[m
[31m-                {"/a"}, {"/b"}, {"/c"},[m
[31m-            }[m
[31m-            print("rewrite a: " .. a.body)[m
[31m-            print("rewrite b: " .. b.body)[m
[31m-            print("rewrite c: " .. c.body)[m
[31m-        ';[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            local A, B = ngx.location.capture_multi{[m
[31m-                {"/A"}, {"/B"},[m
[31m-            }[m
[31m-            print("access A: " .. A.body)[m
[31m-            print("access B: " .. B.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local d, e, f = ngx.location.capture_multi{[m
[31m-                {"/d"}, {"/e"}, {"/f"},[m
[31m-            }[m
[31m-            ngx.say("content d: " .. d.body)[m
[31m-            ngx.say("content e: " .. e.body)[m
[31m-            ngx.say("content f: " .. f.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_val;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([A-F])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([a-f])$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/memc?cmd=set&val=" .. ngx.var.tag)[m
[31m-            local res = ngx.location.capture("/memc?cmd=get&val=" .. ngx.var.tag)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- stap2[m
[31m-global delta = "  "[m
[31m-[m
[31m-M(http-subrequest-start) {[m
[31m-    r = $arg1[m
[31m-    n = ngx_http_subreq_depth(r)[m
[31m-    pr = ngx_http_req_parent(r)[m
[31m-    printf("%sbegin %s -> %s (%d)\n", ngx_indent(n, delta),[m
[31m-        ngx_http_req_uri(pr),[m
[31m-        ngx_http_req_uri(r),[m
[31m-        n)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    r = $r[m
[31m-    uri = ngx_http_req_uri(r)[m
[31m-    if (uri == "/main") {[m
[31m-        printf("run thread %s: %d\n", uri, $nret)[m
[31m-        #print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(http-lua-info) {[m
[31m-    uri = ngx_http_req_uri($r)[m
[31m-    #if (uri == "/main") {[m
[31m-    printf("XXX info: %s: %s", uri, user_string($arg1))[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    r = $r[m
[31m-    n = ngx_http_subreq_depth(r)[m
[31m-    pr = ngx_http_req_parent(r)[m
[31m-[m
[31m-    printf("%send %s -> %s (%d)\n", ngx_indent(n, delta),[m
[31m-        ngx_http_req_uri(r),[m
[31m-        ngx_http_req_uri(pr),[m
[31m-        n)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_handle_subreq_responses) {[m
[31m-    r = $r[m
[31m-    n = ngx_http_subreq_depth(r)[m
[31m-    printf("%shandle res %s (%d)\n", ngx_indent(n, delta), ngx_http_req_uri(r), n)[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-content d: d[m
[31m-content e: e[m
[31m-content f: f[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/rewrite .+?(?= while )|access .+?(?=,)/[m
[31m---- grep_error_log_out[m
[31m-rewrite a: a[m
[31m-rewrite b: b[m
[31m-rewrite c: c[m
[31m-access A: A[m
[31m-access B: B[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: proxy_cache_lock in subrequests[m
[31m---- http_config[m
[31m-proxy_cache_lock on;[m
[31m-proxy_cache_lock_timeout 100ms;[m
[31m-proxy_connect_timeout 300ms;[m
[31m-[m
[31m-proxy_cache_path conf/cache levels=1:2 keys_zone=STATIC:10m inactive=10m max_size=1m;[m
[31m-[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/proxy" },[m
[31m-                { "/proxy" },[m
[31m-                { "/proxy" },[m
[31m-                { "/proxy" },[m
[31m-            }[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-            proxy_cache STATIC;[m
[31m-            proxy_pass http://agentzh.org:12345;[m
[31m-            proxy_cache_key $proxy_host$uri$args;[m
[31m-            proxy_cache_valid any 1s;[m
[31m-            #proxy_http_version 1.1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/028-req-header.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/028-req-header.t[m
[1mdeleted file mode 100644[m
[1mindex fd13cba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/028-req-header.t[m
[1m+++ /dev/null[m
[36m@@ -1,1584 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 28);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: random access req headers[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Foo: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-            ngx.say("Bar: ", ngx.req.get_headers()["Bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua exceeding request header limit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: iterating through headers[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        content_by_lua '[m
[31m-            local h = {}[m
[31m-            for k, v in pairs(ngx.req.get_headers(nil, true)) do[m
[31m-                h[k] = v[m
[31m-            end[m
[31m-            ngx.say("Foo: ", h["Foo"] or "nil")[m
[31m-            ngx.say("Bar: ", h["Bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set input header[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Foo", "new value");[m
[31m-        ';[m
[31m-[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: new value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: clear input header[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Foo", nil);[m
[31m-        ';[m
[31m-[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: rewrite content length[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Content-Length", 2048)[m
[31m-        ';[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /bar\n" .[m
[31m-"a" x 4096[m
[31m---- response_body eval[m
[31m-"a" x 2048[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: rewrite content length (normalized form)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("content-length", 2048)[m
[31m-        ';[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /bar\n" .[m
[31m-"a" x 4096[m
[31m---- response_body eval[m
[31m-"a" x 2048[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: rewrite host and user-agent[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Host", "foo")[m
[31m-            ngx.req.set_header("User-Agent", "blah")[m
[31m-        ';[m
[31m-        echo "Host: $host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Host: foo[m
[31m-User-Agent: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear host and user-agent[m
[31m-$host always has a default value and cannot be really cleared.[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Host", nil)[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-        ';[m
[31m-        echo "Host: $host";[m
[31m-        echo "Host (2): $http_host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Host: localhost[m
[31m-Host (2): [m
[31m-User-Agent: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: clear host and user-agent (the other way)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Host")[m
[31m-            ngx.req.clear_header("User-Agent")[m
[31m-            ngx.req.clear_header("X-Foo")[m
[31m-        ';[m
[31m-        echo "Host: $host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-        echo "X-Foo: $http_x_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- more_headers[m
[31m-X-Foo: bar[m
[31m---- response_body[m
[31m-Host: localhost[m
[31m-User-Agent: [m
[31m-X-Foo: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: clear content-length[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.clear_header("Content-Length")[m
[31m-        ';[m
[31m-        echo "Content-Length: $http_content_length";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-Content-Length: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: rewrite type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.set_header("Content-Type", "text/css")[m
[31m-        ';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: text/css[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: clear type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.clear_header("Content-Type")[m
[31m-        ';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: add multiple request headers[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.set_header("Foo", {"a", "b"})[m
[31m-        ';[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Foo: a[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: add multiple request headers[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.set_header("Foo", {"a", "abc"})[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body_like chomp[m
[31m-\bFoo: a\r\n.*?\bFoo: abc\b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set_header and clear_header should refresh ngx.req.get_headers() automatically[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Foo: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-[m
[31m-            ngx.req.set_header("Foo", 32)[m
[31m-            ngx.say("Foo 1: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-[m
[31m-            ngx.req.set_header("Foo", "abc")[m
[31m-            ngx.say("Foo 2: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-[m
[31m-            ngx.req.clear_header("Foo")[m
[31m-            ngx.say("Foo 3: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-Foo: foo[m
[31m-Foo 1: 32[m
[31m-Foo 2: abc[m
[31m-Foo 3: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: duplicate req headers[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage()[m
[31m-            local vals = ngx.req.get_headers()["Foo"][m
[31m-            ngx.say("value is of type ", type(vals), ".")[m
[31m-            if type(vals) == "table" then[m
[31m-                ngx.say("Foo takes ", #vals or "nil", " values.")[m
[31m-                ngx.say("They are ", table.concat(vals, ", "), ".")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Foo: bar[m
[31m-Foo: baz[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-value is of type table.[m
[31m-Foo takes 3 values.[m
[31m-They are foo, bar, baz.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: Accept-Encoding (scalar)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        default_type 'text/plain';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Accept-Encoding", "gzip")[m
[31m-        ';[m
[31m-        gzip on;[m
[31m-        gzip_min_length  1;[m
[31m-        gzip_buffers     4 8k;[m
[31m-        gzip_types       text/plain;[m
[31m-    }[m
[31m---- user_files[m
[31m-">>> bar[m
[31m-" . ("hello" x 512)[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- response_body_like: .{20}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: Accept-Encoding (table)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        default_type 'text/plain';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Accept-Encoding", {"gzip"})[m
[31m-        ';[m
[31m-        gzip on;[m
[31m-        gzip_min_length  1;[m
[31m-        gzip_buffers     4 8k;[m
[31m-        gzip_types       text/plain;[m
[31m-    }[m
[31m---- user_files[m
[31m-">>> bar[m
[31m-" . ("hello" x 512)[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- response_body_like: .{20}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: default max 100 headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(headers) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, ": ", headers[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers eval[m
[31m-my $i = 1;[m
[31m-my $s;[m
[31m-while ($i <= 102) {[m
[31m-    $s .= "X-$i:$i\n";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 98) {[m
[31m-    push @k, "x-$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-push @k, "connection: close\n";[m
[31m-push @k, "host: localhost\n";[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= ": $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua exceeding request header limit 100[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: custom max 102 headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers(102)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(headers) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, ": ", headers[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers eval[m
[31m-my $i = 1;[m
[31m-my $s;[m
[31m-while ($i <= 103) {[m
[31m-    $s .= "X-$i:$i\n";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 100) {[m
[31m-    push @k, "x-$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-push @k, "connection: close\n";[m
[31m-push @k, "host: localhost\n";[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= ": $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua exceeding request header limit 102[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: custom unlimited headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers(0)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(headers) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, ": ", headers[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers eval[m
[31m-my $s;[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    $s .= "X-$i:$i\n";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    push @k, "x-$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-push @k, "connection: close\n";[m
[31m-push @k, "host: localhost\n";[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= ": $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: modify subrequest req headers should not affect the parent[m
[31m---- config[m
[31m-    location = /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            print("subrequest: ", res.status)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("foo121", 121)[m
[31m-            ngx.req.set_header("foo122", 122)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        #echo $echo_client_request_headers;[m
[31m-        echo "foo121: [$http_foo121]";[m
[31m-        echo "foo122: [$http_foo122]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Bar: bar[m
[31m-Foo1: foo1[m
[31m-Foo2: foo2[m
[31m-Foo3: foo3[m
[31m-Foo4: foo4[m
[31m-Foo5: foo5[m
[31m-Foo6: foo6[m
[31m-Foo7: foo7[m
[31m-Foo8: foo8[m
[31m-Foo9: foo9[m
[31m-Foo10: foo10[m
[31m-Foo11: foo11[m
[31m-Foo12: foo12[m
[31m-Foo13: foo13[m
[31m-Foo14: foo14[m
[31m-Foo15: foo15[m
[31m-Foo16: foo16[m
[31m-Foo17: foo17[m
[31m-Foo18: foo18[m
[31m-Foo19: foo19[m
[31m-Foo20: foo20[m
[31m---- response_body[m
[31m-Foo: [][m
[31m-Bar: [][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: clear_header should clear all the instances of the user custom header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Foo")[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo "Foo: [$http_foo]";[m
[31m-        echo "Test-Header: [$http_test_header]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Foo: bah[m
[31m-Test-Header: 1[m
[31m---- response_body[m
[31m-Foo: [][m
[31m-Test-Header: [1][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: clear_header should clear all the instances of the builtin header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Content-Type")[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo "Content-Type: [$http_content_type]";[m
[31m-        echo "Test-Header: [$http_test_header]";[m
[31m-        #echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Content-Type: foo[m
[31m-Content-Type: bah[m
[31m-Test-Header: 1[m
[31m---- response_body[m
[31m-Content-Type: [][m
[31m-Test-Header: [1][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: Converting POST to GET - clearing headers (bug found by Matthieu Tourne, 411 error page)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Content-Type")[m
[31m-            ngx.req.clear_header("Content-Length")[m
[31m-        ';[m
[31m-[m
[31m-        #proxy_pass http://127.0.0.1:8888;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Content-Type: application/ocsp-request[m
[31m-Test-Header: 1[m
[31m---- response_body_like eval[m
[31m-qr/Connection: close\r[m
[31m-Test-Header: 1\r[m
[31m-\r[m
[31m-$/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: clear_header() does not duplicate subsequent headers (old bug)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Foo")[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Bah: bah[m
[31m-Foo: foo[m
[31m-Test-Header: 1[m
[31m-Foo1: foo1[m
[31m-Foo2: foo2[m
[31m-Foo3: foo3[m
[31m-Foo4: foo4[m
[31m-Foo5: foo5[m
[31m-Foo6: foo6[m
[31m-Foo7: foo7[m
[31m-Foo8: foo8[m
[31m-Foo9: foo9[m
[31m-Foo10: foo10[m
[31m-Foo11: foo11[m
[31m-Foo12: foo12[m
[31m-Foo13: foo13[m
[31m-Foo14: foo14[m
[31m-Foo15: foo15[m
[31m-Foo16: foo16[m
[31m-Foo17: foo17[m
[31m-Foo18: foo18[m
[31m-Foo19: foo19[m
[31m-Foo20: foo20[m
[31m-Foo21: foo21[m
[31m-Foo22: foo22[m
[31m---- response_body_like eval[m
[31m-qr/Bah: bah\r[m
[31m-Test-Header: 1\r[m
[31m-Foo1: foo1\r[m
[31m-Foo2: foo2\r[m
[31m-Foo3: foo3\r[m
[31m-Foo4: foo4\r[m
[31m-Foo5: foo5\r[m
[31m-Foo6: foo6\r[m
[31m-Foo7: foo7\r[m
[31m-Foo8: foo8\r[m
[31m-Foo9: foo9\r[m
[31m-Foo10: foo10\r[m
[31m-Foo11: foo11\r[m
[31m-Foo12: foo12\r[m
[31m-Foo13: foo13\r[m
[31m-Foo14: foo14\r[m
[31m-Foo15: foo15\r[m
[31m-Foo16: foo16\r[m
[31m-Foo17: foo17\r[m
[31m-Foo18: foo18\r[m
[31m-Foo19: foo19\r[m
[31m-Foo20: foo20\r[m
[31m-Foo21: foo21\r[m
[31m-Foo22: foo22\r[m
[31m-/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: iterating through headers (raw form)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local h = {}[m
[31m-            local arr = {}[m
[31m-            for k, v in pairs(ngx.req.get_headers(nil, true)) do[m
[31m-                h[k] = v[m
[31m-                table.insert(arr, k)[m
[31m-            end[m
[31m-            table.sort(arr)[m
[31m-            for i, k in ipairs(arr) do[m
[31m-                ngx.say(k, ": ", h[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-My-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Bar: baz[m
[31m-Connection: close[m
[31m-Host: localhost[m
[31m-My-Foo: bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: __index metamethod not working for "raw" mode[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local h = ngx.req.get_headers(nil, true)[m
[31m-            ngx.say("My-Foo-Header: ", h.my_foo_header)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-My-Foo-Header: Hello World[m
[31m---- response_body[m
[31m-My-Foo-Header: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: __index metamethod not working for the default mode[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local h = ngx.req.get_headers()[m
[31m-            ngx.say("My-Foo-Header: ", h.my_foo_header)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-My-Foo-Header: Hello World[m
[31m---- response_body[m
[31m-My-Foo-Header: Hello World[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: clear input header (just more than 20 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua 'ngx.req.clear_header("R")';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-Q: q\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: clear input header (just more than 20 headers, and add more)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("R")[m
[31m-            for i = 1, 21 do[m
[31m-                ngx.req.set_header("foo-" .. i, i)[m
[31m-            end[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-Q: q\r[m
[31m-foo-1: 1\r[m
[31m-foo-2: 2\r[m
[31m-foo-3: 3\r[m
[31m-foo-4: 4\r[m
[31m-foo-5: 5\r[m
[31m-foo-6: 6\r[m
[31m-foo-7: 7\r[m
[31m-foo-8: 8\r[m
[31m-foo-9: 9\r[m
[31m-foo-10: 10\r[m
[31m-foo-11: 11\r[m
[31m-foo-12: 12\r[m
[31m-foo-13: 13\r[m
[31m-foo-14: 14\r[m
[31m-foo-15: 15\r[m
[31m-foo-16: 16\r[m
[31m-foo-17: 17\r[m
[31m-foo-18: 18\r[m
[31m-foo-19: 19\r[m
[31m-foo-20: 20\r[m
[31m-foo-21: 21\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: clear input header (just more than 21 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("R")[m
[31m-            ngx.req.clear_header("Q")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: clear input header (just more than 21 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("R")[m
[31m-            ngx.req.clear_header("Q")[m
[31m-            for i = 1, 21 do[m
[31m-                ngx.req.set_header("foo-" .. i, i)[m
[31m-            end[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-foo-1: 1\r[m
[31m-foo-2: 2\r[m
[31m-foo-3: 3\r[m
[31m-foo-4: 4\r[m
[31m-foo-5: 5\r[m
[31m-foo-6: 6\r[m
[31m-foo-7: 7\r[m
[31m-foo-8: 8\r[m
[31m-foo-9: 9\r[m
[31m-foo-10: 10\r[m
[31m-foo-11: 11\r[m
[31m-foo-12: 12\r[m
[31m-foo-13: 13\r[m
[31m-foo-14: 14\r[m
[31m-foo-15: 15\r[m
[31m-foo-16: 16\r[m
[31m-foo-17: 17\r[m
[31m-foo-18: 18\r[m
[31m-foo-19: 19\r[m
[31m-foo-20: 20\r[m
[31m-foo-21: 21\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: raw form[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-           -- get ALL the raw headers (0 == no limit, not recommended)[m
[31m-           local h = {}[m
[31m-           local arr = {}[m
[31m-           for k, v in pairs(ngx.req.get_headers(0, true)) do[m
[31m-               h[k] = v[m
[31m-               table.insert(arr, k)[m
[31m-           end[m
[31m-           table.sort(arr)[m
[31m-           for i, k in ipairs(arr) do[m
[31m-               ngx.say(k, ": ", h[k])[m
[31m-           end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-My-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Bar: baz[m
[31m-Connection: close[m
[31m-Host: localhost[m
[31m-My-Foo: bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: clear X-Real-IP[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("X-Real-IP", nil)[m
[31m-        ';[m
[31m-        echo "X-Real-IP: $http_x_real_ip";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-X-Real-IP: 8.8.8.8[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("rewrite: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("content: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("content: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: x-real-ip: 8.8.8.8[m
[31m-content: no x-real-ip[m
[31m-[m
[31m---- response_body[m
[31m-X-Real-IP: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: set custom X-Real-IP[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("X-Real-IP", "8.8.4.4")[m
[31m-        ';[m
[31m-        echo "X-Real-IP: $http_x_real_ip";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("rewrite: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no x-real-ip")[m
[31m-    }[m
[31m-[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("content: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("content: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: no x-real-ip[m
[31m-content: x-real-ip: 8.8.4.4[m
[31m-[m
[31m---- response_body[m
[31m-X-Real-IP: 8.8.4.4[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: clear Via[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Via", nil)[m
[31m-        ';[m
[31m-        echo "Via: $http_via";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("rewrite: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("content: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("content: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-content: no via[m
[31m-[m
[31m---- response_body[m
[31m-Via: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: set custom Via[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Via", "1.0 fred, 1.1 nowhere.com (Apache/1.1)")[m
[31m-        ';[m
[31m-        echo "Via: $http_via";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("rewrite: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no via")[m
[31m-    }[m
[31m-[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("content: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("content: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: no via[m
[31m-content: via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- response_body[m
[31m-Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: set input header (with underscores in the header name)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("foo_bar", "some value");[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- response_body_like eval[m
[31m-qr{^GET /back HTTP/1.0\r[m
[31m-Host: 127.0.0.1:\d+\r[m
[31m-Connection: close\r[m
[31m-foo_bar: some value\r[m
[31m-\r[m
[31m-$}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: HTTP 0.9 (set & get)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("X-Foo", "howdy");[m
[31m-            ngx.say("X-Foo: ", ngx.req.get_headers()["X-Foo"])[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-X-Foo: nil[m
[31m---- http09[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: HTTP 0.9 (clear)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("X-Foo", "howdy");[m
[31m-            ngx.say("X-Foo: ", ngx.req.get_headers()["X-Foo"])[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-X-Foo: nil[m
[31m---- http09[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: Host header with port and $host (github issue #292)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Host", "agentzh.org:1984")[m
[31m-        ';[m
[31m-        echo "host var: $host";[m
[31m-        echo "http_host var: $http_host";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-host var: agentzh.org[m
[31m-http_host var: agentzh.org:1984[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: Host header with upper case letters and $host (github issue #292)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Host", "agentZH.org:1984")[m
[31m-        ';[m
[31m-        echo "host var: $host";[m
[31m-        echo "http_host var: $http_host";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-host var: agentzh.org[m
[31m-http_host var: agentZH.org:1984[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: clear all and re-insert[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers(100, true)[m
[31m-            local n = 0[m
[31m-            for header, _ in pairs(headers) do[m
[31m-                n = n + 1[m
[31m-                ngx.req.clear_header(header)[m
[31m-            end[m
[31m-            ngx.say("got ", n, " headers")[m
[31m-            local i = 0[m
[31m-            for header, value in pairs(headers) do[m
[31m-                i = i + 1[m
[31m-                print("1: reinsert header ", header, ": ", i)[m
[31m-                ngx.req.set_header(header, value)[m
[31m-            end[m
[31m-            local headers = ngx.req.get_headers(100, true)[m
[31m-            n = 0[m
[31m-            for header, _ in pairs(headers) do[m
[31m-                n = n + 1[m
[31m-                ngx.req.clear_header(header)[m
[31m-            end[m
[31m-            ngx.say("got ", n, " headers")[m
[31m-            -- do return end[m
[31m-            local i = 0[m
[31m-            for header, value in pairs(headers) do[m
[31m-                i = i + 1[m
[31m-                if i > 8 then[m
[31m-                    break[m
[31m-                end[m
[31m-                print("2: reinsert header ", header, ": ", i)[m
[31m-                ngx.req.set_header(header, value)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Cache-Control: max-age=0\r[m
[31m-Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36\r[m
[31m-Accept-Encoding: gzip,deflate,sdch\r[m
[31m-Accept-Language: en-US,en;q=0.8\r[m
[31m-Cookie: test=cookie;\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body[m
[31m-got 8 headers[m
[31m-got 8 headers[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: github issue #314: ngx.req.set_header does not override request headers with multiple values[m
[31m---- config[m
[31m-    #lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("AAA", "111")[m
[31m-            local headers = ngx.req.get_headers()[m
[31m-            ngx.say(headers["AAA"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-AAA: 123[m
[31m-AAA: 456[m
[31m-AAA: 678[m
[31m-[m
[31m---- response_body[m
[31m-111[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: clear If-Match req header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.clear_header("if-match")[m
[31m-            if not ngx.send_headers() then[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-Match: abc[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: clear If-Unmodified-Since req header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.clear_header("if-unmodified-since")[m
[31m-            ngx.header["Last-Modified"] = "Tue, 30 Jun 2011 12:16:36 GMT"[m
[31m-            if not ngx.send_headers() then[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Tue, 28 Jun 2011 12:16:36 GMT[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: clear If-None-Match req header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.clear_header("if-none-match")[m
[31m-            -- ngx.header["etags"] = "abc"[m
[31m-            if not ngx.send_headers() then[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: *[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: set the Destination request header for WebDav[m
[31m---- config[m
[31m-    location = /a.txt {[m
[31m-        rewrite_by_lua_block {[m
[31m-            ngx.req.set_header("Destination", "/b.txt")[m
[31m-        }[m
[31m-        dav_methods MOVE;[m
[31m-        dav_access            all:rw;[m
[31m-        root                  html;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-hello, world![m
[31m-[m
[31m---- request[m
[31m-MOVE /a.txt[m
[31m-[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-client sent no "Destination" header[m
[31m-[error][m
[31m---- error_code: 204[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: X-Forwarded-For[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_by_lua_block {[m
[31m-            ngx.req.set_header("X-Forwarded-For", "8.8.8.8")[m
[31m-        }[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Foo $proxy_add_x_forwarded_for;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Foo: 8.8.8.8, 127.0.0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: X-Forwarded-For[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_by_lua_block {[m
[31m-            ngx.req.clear_header("X-Forwarded-For")[m
[31m-        }[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Foo $proxy_add_x_forwarded_for;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-X-Forwarded-For: 8.8.8.8[m
[31m---- response_body[m
[31m-Foo: 127.0.0.1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/029-http-time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/029-http-time.t[m
[1mdeleted file mode 100644[m
[1mindex 71a7758..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/029-http-time.t[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: http_time in content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.http_time(1290079655))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Thu, 18 Nov 2010 11:27:35 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http_time in set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $a '[m
[31m-            return ngx.http_time(1290079655)[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Thu, 18 Nov 2010 11:27:35 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: parse_http_time in set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $a '[m
[31m-            return ngx.parse_http_time("Thu, 18 Nov 2010 11:27:35 GMT")[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1290079655[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: parse_http_time in content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.parse_http_time("Thu, 18 Nov 2010 11:27:35 GMT"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1290079655[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad arg for parse_http_time in content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.parse_http_time("abc") or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/030-uri-args.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/030-uri-args.t[m
[1mdeleted file mode 100644[m
[1mindex 2f18ba7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/030-uri-args.t[m
[1m+++ /dev/null[m
[36m@@ -1,1392 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 17);[m
[31m-[m
[31m-no_root_location();[m
[31m-[m
[31m-#no_shuffle();[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=3&b=4&c[m
[31m---- response_body[m
[31m-a = 3[m
[31m-b = 4[m
[31m-c = true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: args take no value[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo&baz=&bar=42[m
[31m---- response_body[m
[31m-bar = 42[m
[31m-baz = [m
[31m-foo = true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: arg key and value escaped[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("again...")[m
[31m-[m
[31m-            args = ngx.req.get_uri_args()[m
[31m-            keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?%3d&b%20r=4%61+2[m
[31m---- response_body[m
[31m-= = true[m
[31m-b r = 4a 2[m
[31m-again...[m
[31m-= = true[m
[31m-b r = 4a 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: empty[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: empty arg, but with = and &[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?=&&[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multi-value keys[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                local val = args[key][m
[31m-                if type(val) == "table" then[m
[31m-                    ngx.say(key, " = [", table.concat(val, ", "), "]")[m
[31m-                else[m
[31m-                    ngx.say(key, " = ", val)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=32&foo==&foo=baz[m
[31m---- response_body[m
[31m-foo = [32, =, baz][m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multi-value keys[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                local val = args[key][m
[31m-                if type(val) == "table" then[m
[31m-                    ngx.say(key, " = [", table.concat(val, ", "), "]")[m
[31m-                else[m
[31m-                    ngx.say(key, " = ", val)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=32&foo==&bar=baz[m
[31m---- response_body[m
[31m-bar = baz[m
[31m-foo = [32, =][m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty arg[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            -- ngx.say(args)[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?&=[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: = in value[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            -- ngx.say(args)[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo===[m
[31m---- response_body[m
[31m-foo = ==[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: empty key, but non-emtpy values[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?=hello&=world[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: updating args with $args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("updating args...")[m
[31m-[m
[31m-            ngx.var.args = "a=3&b=4"[m
[31m-[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=bar[m
[31m---- response_body[m
[31m-foo = bar[m
[31m-updating args...[m
[31m-a = 3[m
[31m-b = 4[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: rewrite uri and args[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar", true);[m
[31m-        ';[m
[31m-        proxy_pass http://agentzh.org:12345;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua set uri jump to "/bar"[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: rewrite args (not break cycle by default)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo "bar: $uri?$args";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar", true)[m
[31m-        ';[m
[31m-        echo "foo: $uri?$args";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-bar: /bar?hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: rewrite (not break cycle explicitly)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo "bar: $uri?$args";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar", true)[m
[31m-        ';[m
[31m-        echo "foo: $uri?$args";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-bar: /bar?hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: rewrite (break cycle explicitly)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo "bar: $uri?$args";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-        ';[m
[31m-        echo "foo: $uri?$args";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-foo: /bar?hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: rewrite uri (zero-length)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            local res, err = pcall(ngx.req.set_uri, "")[m
[31m-            print("rewrite: err: ", err)[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo: ", ngx.var.uri, "?", ngx.var.args)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-foo: /foo?world[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/rewrite: .+?(?=,)/[m
[31m---- grep_error_log_out[m
[31m-rewrite: err: attempt to use zero-length uri[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: rewrite uri and args[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-HTTP/1.0 hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: rewrite uri and args (table args)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-            ngx.req.set_uri_args({["ca t"] = "%"})[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-HTTP/1.0 ca%20t=%25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: rewrite uri and args (never returns)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar", true);[m
[31m-            ngx.exit(503)[m
[31m-        ';[m
[31m-        proxy_pass http://agentzh.org:12345;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.req.set_uri with jump not allowed in access phase[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        set $err '';[m
[31m-        access_by_lua '[m
[31m-            res, err = pcall(ngx.req.set_uri, "/bar", true);[m
[31m-            ngx.var.err = err[m
[31m-        ';[m
[31m-        echo "err: $err";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-err: API disabled in the context of access_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.req.set_uri without jump allowed in access phase[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        set $err '';[m
[31m-        access_by_lua '[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        echo "uri: $uri";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-uri: /bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx.req.set_uri with jump not allowed in content phase[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        content_by_lua '[m
[31m-            res, err = pcall(ngx.req.set_uri, "/bar", true);[m
[31m-            ngx.say("err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-err: API disabled in the context of content_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.req.set_uri without jump allowed in content phase[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        set $err '';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-            ngx.say("uri: ", ngx.var.uri)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-uri: /bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx.req.set_uri with jump not allowed in set_by_lua[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        set_by_lua $err '[m
[31m-            res, err = pcall(ngx.req.set_uri, "/bar", true);[m
[31m-            return err[m
[31m-        ';[m
[31m-        echo "err: $err";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-err: API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx.encode_args (sanity)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {a = "bar", b = "foo"}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=bar&b=foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: ngx.encode_args (empty table)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {a = nil}[m
[31m-            ngx.say("args:" .. ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-args:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx.encode_args (value is table)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {a = {9, 2}, b = 3}[m
[31m-            ngx.say("args:" .. ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^args:[m
[31m-    (?= .*? \b a=9 \b )  # 3 chars[m
[31m-    (?= .*? \b a=2 \b )  # 3 chars[m
[31m-    (?= .*? \b b=3 \b )  # 3 chars[m
[31m-    (?= (?: [^&]+ & ){2} [^&]+ $ )  # requires exactly 2 &'s[m
[31m-    (?= .{11} $ )  # requires for total 11 chars (exactly) in the string[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx.encode_args (boolean values)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {a = true, foo = 3}[m
[31m-            ngx.say("args: " .. ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-^args: (?:a&foo=3|foo=3&a)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: ngx.encode_args (boolean values, false)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {a = false, foo = 3}[m
[31m-            ngx.say("args: " .. ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-args: foo=3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: boolean values in ngx.encode_args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {bar = {32, true}, foo = 3}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b bar=32 \b )     # 6 chars[m
[31m-    (?= .*? \b bar (?!=) \b )  # 3 chars[m
[31m-    (?= .*? \b foo=3 \b )      # 5 chars[m
[31m-    (?= (?: [^&]+ & ){2} [^&]+ $ )  # requires exactly 2 &'s[m
[31m-    (?= .{16} $ )  # requires for total 16 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: ngx.encode_args (bad user data value)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {bar = ngx.shared.dogs, foo = 3}[m
[31m-            rc, err = pcall(ngx.encode_args, t)[m
[31m-            ngx.say("rc: ", rc, ", err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-rc: false, err: attempt to use userdata as query arg value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: ngx.encode_args (empty table)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {}[m
[31m-            ngx.say("args: ", ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-args: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: ngx.encode_args (bad arg)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local rc, err = pcall(ngx.encode_args, true)[m
[31m-            ngx.say("rc: ", rc, ", err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-rc: false, err: bad argument #1 to '?' (table expected, got boolean)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: max args (limited after normal key=value)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=3&bar=4&baz=2[m
[31m---- response_body[m
[31m-bar = 4[m
[31m-foo = 3[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: max args (limited after an orphan key)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=3&bar&baz=2[m
[31m---- response_body[m
[31m-bar = true[m
[31m-foo = 3[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: max args (limited after an empty key, but non-emtpy values)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=3&=hello&=world[m
[31m---- response_body[m
[31m-foo = 3[m
[31m-done[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: default max 100 args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "GET /lua?";[m
[31m-my $i = 1;[m
[31m-while ($i <= 102) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 100) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua hit query args limit 100[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: custom max 102 args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(102)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "GET /lua?";[m
[31m-my $i = 1;[m
[31m-while ($i <= 103) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 102) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua hit query args limit 102[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: custom unlimited args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(0)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "GET /lua?";[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: rewrite uri and args (multi-value args)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args({a = 3, b = {5, 6}})[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-HTTP/1.0 a=3&b=5&b=6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: ngx.decode_args (sanity)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=bar&b=foo"[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = bar[m
[31m-b = foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: ngx.decode_args (multi-value)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=bar&b=foo&a=baz"[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("a = ", table.concat(args.a, ", "))[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = bar, baz[m
[31m-b = foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: ngx.decode_args (empty string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ""[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("n = ", #args)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-n = 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: ngx.decode_args (boolean args)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a&b"[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = true[m
[31m-b = true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: ngx.decode_args (empty value args)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=&b="[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = [m
[31m-b = [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: ngx.decode_args (max_args = 1)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=bar&b=foo"[m
[31m-            args = ngx.decode_args(args, 1)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = bar[m
[31m-b = nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: ngx.decode_args (max_args = -1)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=bar&b=foo"[m
[31m-            args = ngx.decode_args(args, -1)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = bar[m
[31m-b = foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: ngx.decode_args should not modify lua strings in place[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local s = "f+f=bar&B=foo"[m
[31m-            args = ngx.decode_args(s)[m
[31m-            local arr = {}[m
[31m-            for k, v in pairs(args) do[m
[31m-                table.insert(arr, k)[m
[31m-            end[m
[31m-            table.sort(arr)[m
[31m-            for i, k in ipairs(arr) do[m
[31m-                ngx.say("key: ", k)[m
[31m-            end[m
[31m-            ngx.say("s = ", s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-key: B[m
[31m-key: f f[m
[31m-s = f+f=bar&B=foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: ngx.decode_args should not modify lua strings in place (sample from Xu Jian)[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            function split(s, delimiter)[m
[31m-                local result = {}[m
[31m-                local from = 1[m
[31m-                local delim_from, delim_to = string.find(s, delimiter, from)[m
[31m-                while delim_from do[m
[31m-                    table.insert(result, string.sub(s, from, delim_from - 1))[m
[31m-                    from = delim_to + 1[m
[31m-                    delim_from, delim_to = string.find(s, delimiter, from)[m
[31m-                end[m
[31m-                table.insert(result, string.sub(s, from))[m
[31m-                return result[m
[31m-            end[m
[31m-[m
[31m-            local post_data = ngx.req.get_body_data()[m
[31m-[m
[31m-            local commands = split(post_data, "||")[m
[31m-            for _, command in pairs(commands) do[m
[31m-                --command = ngx.unescape_uri(command)[m
[31m-                local request_args = ngx.decode_args(command, 0)[m
[31m-                local arr = {}[m
[31m-                for k, v in pairs(request_args) do[m
[31m-                    table.insert(arr, k)[m
[31m-                end[m
[31m-                table.sort(arr)[m
[31m-                for i, k in ipairs(arr) do[m
[31m-                    ngx.say(k, ": ", request_args[k])[m
[31m-                end[m
[31m-                ngx.say(" ===============")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-method=zadd&key=User%3A1227713%3Alikes%3Atwitters&arg1=1356514698&arg2=780984852||method=zadd&key=User%3A1227713%3Alikes%3Atwitters&arg1=1356514698&arg2=780984852||method=zadd&key=User%3A1227713%3Alikes%3Atwitters&arg1=1356514698&arg2=780984852[m
[31m---- response_body[m
[31m-arg1: 1356514698[m
[31m-arg2: 780984852[m
[31m-key: User:1227713:likes:twitters[m
[31m-method: zadd[m
[31m- ===============[m
[31m-arg1: 1356514698[m
[31m-arg2: 780984852[m
[31m-key: User:1227713:likes:twitters[m
[31m-method: zadd[m
[31m- ===============[m
[31m-arg1: 1356514698[m
[31m-arg2: 780984852[m
[31m-key: User:1227713:likes:twitters[m
[31m-method: zadd[m
[31m- ===============[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: recursive rewrite[m
[31m---- config[m
[31m-    rewrite_by_lua '[m
[31m-        local args = ngx.var.args[m
[31m-        if args == "jump" then[m
[31m-            ngx.req.set_uri("/jump",true)[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m-    location /jump {[m
[31m-        echo "Jump around!";[m
[31m-    }[m
[31m-[m
[31m-    location / {[m
[31m-        echo "$scheme://$http_host$request_uri";[m
[31m-    }[m
[31m---- request[m
[31m-GET /?jump[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m---- error_log[m
[31m-rewrite or internal redirection cycle while processing "/jump"[m
[31m---- timeout: 10[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: boolean values in ngx.encode_args (trailing arg)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {a = {32, true}, foo = 3, bar = 5}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b a=32 \b )       # 4 chars[m
[31m-    (?= .*? \b a (?=&|$) \b )  # 1 chars[m
[31m-    (?= .*? \b foo=3 \b )      # 5 chars[m
[31m-    (?= .*? \b bar=5 \b )      # 5 chars[m
[31m-    (?= (?: [^&]+ & ){3} [^&]+ $ )  # requires exactly 3 &'s[m
[31m-    (?= .{18} $ )  # requires for total 18 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: false boolean values in ngx.encode_args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {a = {32, false}, foo = 3, bar = 5}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b a=32 \b )   # 4 chars[m
[31m-    (?= .*? \b foo=3 \b )  # 5 chars[m
[31m-    (?= .*? \b bar=5 \b )  # 5 chars[m
[31m-    (?= (?: [^&]+ & ){2} [^&]+ $ )  # requires exactly 2 &'s[m
[31m-    (?= .{16} $ )  # requires for total 16 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: false boolean values in ngx.encode_args (escaping)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {["a b"] = {32, false}, foo = 3, bar = 5}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b a%20b=32 \b )  # 8 chars[m
[31m-    (?= .*? \b foo=3 \b )     # 5 chars[m
[31m-    (?= .*? \b bar=5 \b )     # 5 chars[m
[31m-    (?= (?: [^&]+ & ){2} [^&]+ $ )  # requires exactly 2 &'s[m
[31m-    (?= .{20} $ )  # requires for total 20 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: true boolean values in ngx.encode_args (escaping)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {["a b"] = {32, true}, foo = 3, bar = 5}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b a%20b=32 \b )     # 8 chars[m
[31m-    (?= .*? \b a%20b (?!=) \b )  # 5 chars[m
[31m-    (?= .*? \b foo=3 \b )        # 5 chars[m
[31m-    (?= .*? \b bar=5 \b )        # 5 chars[m
[31m-    (?= (?: [^&]+ & ){3} [^&]+ $ )  # requires exactly 3 &'s[m
[31m-    (?= .{26} $ )  # requires for total 26 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: rewrite uri and args (boolean in multi-value args)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args({a = 3, b = {5, true, 6}})[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body_like[m
[31m-(?x) ^HTTP/1.0 \s[m
[31m-    (?= .*? \b a=3 \b )      # 3 chars[m
[31m-    (?= .*? \b b=5 \b )      # 3 chars[m
[31m-    (?= .*? \b b (?!=) \b )  # 1 chars[m
[31m-    (?= .*? \b b=6 \b )      # 3 chars[m
[31m-    (?= (?: [^&]+ & ){3} [^&]+ $ )  # requires exactly 3 &'s[m
[31m-    (?= .{13} $ )  # requires for total 13 chars (exactly) in the string[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: rewrite uri and args (boolean value)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args({a = 3, b = true})[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body_like[m
[31m-^HTTP/1.0 (a=3&b|b&a=3)$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/031-post-args.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/031-post-args.t[m
[1mdeleted file mode 100644[m
[1mindex 4f8b9d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/031-post-args.t[m
[1m+++ /dev/null[m
[36m@@ -1,356 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 6);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_post_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-a=3&b=4&c[m
[31m---- response_body[m
[31m-a = 3[m
[31m-b = 4[m
[31m-c = true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: lua_need_request_body off[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_post_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-a=3&b=4&c[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: empty request body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_post_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                local val = args[key][m
[31m-                if type(val) == "table" then[m
[31m-                    ngx.say(key, ": ", table.concat(val, ", "))[m
[31m-                else[m
[31m-                    ngx.say(key, ": ", val)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: max args (limited after normal key=value)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local args = ngx.req.get_post_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-foo=3&bar=4&baz=2[m
[31m---- response_body[m
[31m-bar = 4[m
[31m-foo = 3[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: max args (limited after an orphan key)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local args = ngx.req.get_post_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-foo=3&bar&baz=2[m
[31m---- response_body[m
[31m-bar = true[m
[31m-foo = 3[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: max args (limited after an empty key, but non-emtpy values)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local args = ngx.req.get_post_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-foo=3&=hello&=world[m
[31m---- response_body[m
[31m-foo = 3[m
[31m-done[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: default max 100 args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local args = ngx.req.get_post_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "POST /lua\n";[m
[31m-my $i = 1;[m
[31m-while ($i <= 102) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 100) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua hit query args limit 100[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: custom max 102 args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local args = ngx.req.get_post_args(102)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "POST /lua\n";[m
[31m-my $i = 1;[m
[31m-while ($i <= 103) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 102) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua hit query args limit 102[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: custom unlimited args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local args = ngx.req.get_post_args(0)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "POST /lua\n";[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: request body in temp file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        client_body_in_file_only clean;[m
[31m-        content_by_lua_block {[m
[31m-            local args, err = ngx.req.get_post_args()[m
[31m-[m
[31m-            if not args then[m
[31m-                ngx.say(err)[m
[31m-            else[m
[31m-                local keys = {}[m
[31m-                for key, val in pairs(args) do[m
[31m-                    table.insert(keys, key)[m
[31m-                end[m
[31m-[m
[31m-                table.sort(keys)[m
[31m-                for i, key in ipairs(keys) do[m
[31m-                    ngx.say(key, " = ", args[key])[m
[31m-                end[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-a=3&b=4&c[m
[31m---- response_body[m
[31m-requesty body in temp file not supported[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/032-iolist.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/032-iolist.t[m
[1mdeleted file mode 100644[m
[1mindex ddf3d7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/032-iolist.t[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local table = {"hello", nil, true, false, 32.5, 56}[m
[31m-            ngx.say(table)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-helloniltruefalse32.556[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nested table[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local table = {"hello", nil, true, false, 32.5, 56}[m
[31m-            local table2 = {table, "--", table}[m
[31m-            ngx.say(table2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-helloniltruefalse32.556--helloniltruefalse32.556[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: non-array table[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local table = {foo = 3}[m
[31m-            ngx.say(table)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad data type in table[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local f = function () return end[m
[31m-            local table = {1, 3, f}[m
[31m-            ngx.say(table)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/033-ctx.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/033-ctx.t[m
[1mdeleted file mode 100644[m
[1mindex eefb216..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/033-ctx.t[m
[1m+++ /dev/null[m
[36m@@ -1,443 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 8);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rewrite, access, and content[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            print("foo = ", ngx.ctx.foo)[m
[31m-            ngx.ctx.foo = 76[m
[31m-        ';[m
[31m-        access_by_lua '[m
[31m-            ngx.ctx.foo = ngx.ctx.foo + 3[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-79[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/foo = [^,]+/[m
[31m---- log_level: info[m
[31m---- grep_error_log_out[m
[31m-foo = nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: interal redirect clears ngx.ctx[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = ngx.var.arg_data[m
[31m-            -- ngx.say(ngx.ctx.foo)[m
[31m-            ngx.exec("/echo")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?data=hello[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: subrequest has its own ctx[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("sub pre: ", ngx.ctx.blah)[m
[31m-            ngx.ctx.blah = 32[m
[31m-            ngx.say("sub post: ", ngx.ctx.blah)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.blah = 73[m
[31m-            ngx.say("main pre: ", ngx.ctx.blah)[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("main post: ", ngx.ctx.blah)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-main pre: 73[m
[31m-sub pre: nil[m
[31m-sub post: 32[m
[31m-main post: 73[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: overriding ctx[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx = { foo = 32, bar = 54 };[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-            ngx.say(ngx.ctx.bar)[m
[31m-[m
[31m-            ngx.ctx = { baz = 56  };[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-            ngx.say(ngx.ctx.baz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-32[m
[31m-54[m
[31m-nil[m
[31m-56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: header filter[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.blah = ngx.ctx.foo + 1[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-blah: 33[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: capture_multi[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.ctx.dog)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'blah';[m
[31m-        set $cat 'foo';[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/other/1",[m
[31m-                    { ctx = { dog = "hello" }}[m
[31m-                },[m
[31m-                {"/other/2",[m
[31m-                    { ctx = { dog = "hiya" }}[m
[31m-                }[m
[31m-            };[m
[31m-[m
[31m-            ngx.print(res1.body)[m
[31m-            ngx.print(res2.body)[m
[31m-            ngx.say("parent: ", ngx.ctx.dog)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-dog = hello[m
[31m-dog = hiya[m
[31m-parent: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $bar 'ngx.ctx.foo = 3 return 4';[m
[31m-        set_by_lua $foo 'return ngx.ctx.foo';[m
[31m-        echo "foo = $foo, bar = $bar";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-foo = 3, bar = 4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.ctx leaks with ngx.exec + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.exec("/f")[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)';[m
[31m-    }[m
[31m-    location = /f {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-ctx.foo = [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: memory leaks with ngx.ctx + ngx.req.set_uri + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.req.set_uri("/f", true)[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)';[m
[31m-    }[m
[31m-    location = /f {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-ctx.foo = [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.ctx + ngx.exit(ngx.ERROR) + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ngx.ctx = ", ngx.ctx.foo)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-ngx.ctx = 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.ctx + ngx.exit(200) + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-ctx.foo = 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.ctx + ngx.redirect + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.redirect("/f")[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ngx.ctx.foo = ", 32)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- error_log[m
[31m-ctx.foo = 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set ngx.ctx before internal redirects performed by other nginx modules[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = "hello world";[m
[31m-        ';[m
[31m-        echo_exec /foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua release ngx.ctx at ref[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set ngx.ctx before internal redirects performed by other nginx modules (with log_by_lua)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = "hello world";[m
[31m-        ';[m
[31m-        echo_exec /foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello;[m
[31m-        log_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua release ngx.ctx at ref[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set ngx.ctx before simple uri rewrite performed by other nginx modules[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $a 'ngx.ctx.foo = "hello world"; return 1';[m
[31m-        rewrite ^ /foo last;[m
[31m-        echo blah;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua release ngx.ctx at ref[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.ctx gets prematurely released ngx.exit()[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 3[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            -- if ngx.headers_sent ~= true then ngx.send_headers() end[m
[31m-            return ngx.exit(200)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            if ngx.ctx.foo ~= 3 then[m
[31m-                ngx.log(ngx.ERR, "bad ngx.ctx.foo: ", ngx.ctx.foo)[m
[31m-            end[m
[31m-        ';[m
[31m-        }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.ctx gets prematurely released ngx.exit() (lua_code_cache off)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_code_cache off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 3[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            -- if ngx.headers_sent ~= true then ngx.send_headers() end[m
[31m-            return ngx.exit(200)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            if ngx.ctx.foo ~= 3 then[m
[31m-                ngx.log(ngx.ERR, "bad ngx.ctx.foo: ", ngx.ctx.foo)[m
[31m-            end[m
[31m-        ';[m
[31m-        }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/034-match.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/034-match.t[m
[1mdeleted file mode 100644[m
[1mindex 35149f1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/034-match.t[m
[1m+++ /dev/null[m
[36m@@ -1,1192 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 15);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: escaping sequences[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "(\\\\d+)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: escaping sequences (bad)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "(\\d+)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\('/][m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: escaping sequences in [[ ... ]][m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "[[\\d+]]")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\[\['/][m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: single capture[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]{2})[0-9]+")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([a-z]+).*?([0-9]{2})[0-9]+", "")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple captures (with o)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([a-z]+).*?([0-9]{2})[0-9]+", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "foo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: case sensitive by default[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "HELLO")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: case insensitive[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "HELLO", "i")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: UTF-8 mode[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            rc, err = pcall(ngx.re.match, "hello章亦春", "HELLO.{2}", "iu")[m
[31m-            if not rc then[m
[31m-                ngx.say("FAIL: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local m = err[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-^(?:FAIL: bad argument \#2 to '\?' \(pcre_compile\(\) failed: this version of PCRE is not compiled with PCRE_UTF8 support in "HELLO\.\{2\}" at "HELLO\.\{2\}"\)|hello章亦)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: multi-line mode (^ at line head)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "^world", "m")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: multi-line mode (. does not match \n)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", ".*", "m")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: single-line mode (^ as normal)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "^world", "s")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: single-line mode (dot all)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", ".*", "s")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "\\\\w     \\\\w", "x")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-he[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.match("hello\\nworld", "(abc")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad option[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            rc, m = pcall(ngx.re.match, "hello\\nworld", ".*", "Hm")[m
[31m-            if rc then[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            else[m
[31m-                ngx.say("error: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-error: .*?unknown flag "H" \(flags "Hm"\)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, world", "(world)|(hello)", "x")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-false[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: optional trailing captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)(h?)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-"1234[m
[31m-1234[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: anchored match (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "a")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "a")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: match with ctx but no pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "", ctx)[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say(ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: match with ctx and a pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = { pos = 3 }[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "", ctx)[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say(ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-34[m
[31m-5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: sanity (set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)")[m
[31m-            if m then[m
[31m-                return m[0][m
[31m-            else[m
[31m-                return "not matched!"[m
[31m-            end[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: match (look-behind assertion)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local m = ngx.re.match("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: escaping sequences[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-m = ngx.re.match("hello, 1234", "(\\\s+)")[m
[31m-if m then[m
[31m-    ngx.say("[", m[0], "]")[m
[31m-else[m
[31m-    ngx.say("not matched!")[m
[31m-end[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\(\\'/][m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: escaping sequences[m
[31m---- config[m
[31m-    location /re {[m
[31m-        access_by_lua_file html/a.lua;[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local uri = "<impact>2</impact>"[m
[31m-local regex = '(?:>[\\w\\s]*</?\\w{2,}>)';[m
[31m-ngx.say("regex: ", regex)[m
[31m-m = ngx.re.match(uri, regex, "oi")[m
[31m-if m then[m
[31m-    ngx.say("[", m[0], "]")[m
[31m-else[m
[31m-    ngx.say("not matched!")[m
[31m-end[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-regex: (?:>[\w\s]*</?\w{2,}>)[m
[31m-[>2</impact>][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: long brackets[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", [[\\d+]])[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.match("hello, 1234", "([0-9]+")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched!")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "([0-9]+"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: long brackets containing [...][m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", [[([0-9]+)]])[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: bug report (github issue #72)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.re.match("hello", "hello", "j")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.re.match("hello", "world", "j")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: bug report (github issue #72)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.re.match("hello", "hello", "j")[m
[31m-            ngx.exec("/foo")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.re.match("hello", "world", "j")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: non-empty subject, empty pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local m = ngx.re.match("hello, 1234", "", "", ctx)[m
[31m-            if m then[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-                ngx.say("m: ", m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-pos: 1[m
[31m-m: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "(?<first>[a-z]+), [0-9]+")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-hello[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: duplicate named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "(?<first>[a-z]+), (?<first>[0-9]+)", "D")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-1234[m
[31m-hello-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: named captures are empty strings[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("1234", "(?<first>[a-z]*)([0-9]+)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: named captures are false[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, world", "(world)|(hello)|(?<named>howdy)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-                ngx.say(m["named"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-false[m
[31m-hello[m
[31m-false[m
[31m-false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: duplicate named subpatterns[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, world",[m
[31m-                                   "(?<named>\\\\w+), (?<named>\\\\w+)",[m
[31m-                                   "D")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.named,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hello[m
[31m-world[m
[31m-hello-world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: Javascript compatible mode[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("章", [[\\u7AE0]], "uJ")[m
[31m-            if m then[m
[31m-                ngx.say("matched: ", m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-matched: 章[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: empty duplicate captures[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "[m
[31m-            local target = 'test'[m
[31m-            local regex = '^(?:(?<group1>(?:foo))|(?<group2>(?:bar))|(?<group3>(?:test)))$'[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local m = ngx.re.match(target, regex, 'D')[m
[31m-[m
[31m-            ngx.say(type(m.group1))[m
[31m-            ngx.say(type(m.group2))[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local m, err = ngx.re.match(string.sub(target, 1, 4), regex, "u")[m
[31m-[m
[31m-            if err then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say("matched: ", m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^error: pcre_exec\(\) failed: -10$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("你好", ".", "U")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("你好", ".", "u")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, err = ngx.re.match(s, re, "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, err = ngx.re.match(s, re, "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-failed to match[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: extra table argument[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local res = {}[m
[31m-            local s = "hello, 1234"[m
[31m-            m = ngx.re.match(s, [[(\\d)(\\d)]], "o", nil, res)[m
[31m-            if m then[m
[31m-                ngx.say("1: m size: ", #m)[m
[31m-                ngx.say("1: res size: ", #res)[m
[31m-            else[m
[31m-                ngx.say("1: not matched!")[m
[31m-            end[m
[31m-            m = ngx.re.match(s, [[(\\d)]], "o", nil, res)[m
[31m-            if m then[m
[31m-                ngx.say("2: m size: ", #m)[m
[31m-                ngx.say("2: res size: ", #res)[m
[31m-            else[m
[31m-                ngx.say("2: not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1: m size: 2[m
[31m-1: res size: 2[m
[31m-2: m size: 2[m
[31m-2: res size: 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        m = ngx.re.match("hello, 1234", "(\\\\d+)")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: trailing captures are false[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello", "(hello)(.+)?")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: the 5th argument hides the 4th (GitHub #719)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx, m = { pos = 5 }, {};[m
[31m-            local _, err = ngx.re.match("20172016-11-3 03:07:09", [=[(\d\d\d\d)]=], "", ctx, m);[m
[31m-            if m then[m
[31m-                ngx.say(m[0], " ", _[0], " ", ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-2016 2016 9[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/035-gmatch.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/035-gmatch.t[m
[1mdeleted file mode 100644[m
[1mindex 69b9512..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/035-gmatch.t[m
[1m+++ /dev/null[m
[36m@@ -1,904 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(5);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 7);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: gmatch[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, world", "[a-z]+") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: fail to match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: match but iterate more times (not just match at the end)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world!", "[a-z]+")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: match but iterate more times (just matched at the end)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: anchored match (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            it = ngx.re.gmatch("hello, 1234", "([0-9]+)", "a")[m
[31m-            ngx.say(it())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]", "a")[m
[31m-            local m = it()[m
[31m-            ngx.say(m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m[0])[m
[31m-            ngx.say(it())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: non-anchored gmatch (without regex cache)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: non-anchored gmatch (with regex cache)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]", "o")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]", "a")[m
[31m-            local m = it()[m
[31m-            ngx.say(m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m[0])[m
[31m-            ngx.say(it())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: anchored match (succeeded, set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]", "a")[m
[31m-            local m = it()[m
[31m-            return m[0][m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: gmatch (look-behind assertion)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("{foobar}, {foobaz}", "(?<=foo)ba[rz]") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: gmatch (look-behind assertion 2)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: with regex cache[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, 1234", "([A-Z]+)", "io")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("1234, okay", "([A-Z]+)", "io")[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("hi, 1234", "([A-Z]+)", "o")[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- stap2[m
[31m-F(ngx_http_lua_ngx_re_gmatch_iterator) { println("iterator") }[m
[31m-F(ngx_http_lua_ngx_re_gmatch_gc) { println("gc") }[m
[31m-F(ngx_http_lua_ngx_re_gmatch_cleanup) { println("cleanup") }[m
[31m---- response_body[m
[31m-hello[m
[31m-okay[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: exceeding regex cache max entries[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 2;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, 1234", "([0-9]+)", "o")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("howdy, 567", "([0-9]+)", "oi")[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("hiya, 98", "([0-9]+)", "ox")[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-567[m
[31m-98[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: disable regex cache completely[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 0;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, 1234", "([0-9]+)", "o")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("howdy, 567", "([0-9]+)", "oi")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("hiya, 98", "([0-9]+)", "ox")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-567[m
[31m-98[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: gmatch matched but no iterate[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: gmatch matched but only iterate once and still matches remain[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: gmatch matched but no iterate and early forced GC[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local a = {}[m
[31m-            for i = 1, 3 do[m
[31m-                it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-                it()[m
[31m-                collectgarbage()[m
[31m-                table.insert(a, {"hello", "world"})[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: gmatch iterator used by another request[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;;';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.foo = nil[m
[31m-[m
[31m-            local res = ngx.location.capture("/t")[m
[31m-            if res.status == 200 then[m
[31m-                ngx.print(res.body)[m
[31m-            else[m
[31m-                ngx.say("sr failed: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            res = ngx.location.capture("/t")[m
[31m-            if res.status == 200 then[m
[31m-                ngx.print(res.body)[m
[31m-            else[m
[31m-                ngx.say("sr failed: ", res.status)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            local m = foo.go()[m
[31m-            ngx.say(m and "matched" or "no")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-local it[m
[31m-[m
[31m-function go()[m
[31m-    if not it then[m
[31m-        it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-    end[m
[31m-[m
[31m-    return it()[m
[31m-end[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-matched[m
[31m-sr failed: 500[m
[31m---- error_log[m
[31m-attempt to use ngx.re.gmatch iterator in a request that did not create it[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: gmatch (empty matched string)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello", "a|") do[m
[31m-                if m then[m
[31m-                    ngx.say("matched: [", m[0], "]")[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-matched: [][m
[31m-matched: [][m
[31m-matched: [][m
[31m-matched: [][m
[31m-matched: [][m
[31m-matched: [][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: gmatch with named pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("1234, 1234", "(?<first>[0-9]+)")[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m["first"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m["first"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-1234[m
[31m-1234[m
[31m-1234[m
[31m-1234[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: gmatch with multiple named pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("1234, abcd, 1234", "(?<first>[0-9]+)|(?<second>[a-z]+)")[m
[31m-[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m["first"])[m
[31m-                ngx.say(m["second"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m["first"])[m
[31m-                ngx.say(m["second"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-1234[m
[31m-false[m
[31m-1234[m
[31m-false[m
[31m-abcd[m
[31m-false[m
[31m-abcd[m
[31m-false[m
[31m-abcd[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: gmatch with duplicate named pattern w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, 1234", "(?<first>[a-z]+), (?<first>[0-9]+)", "D")[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-             ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-1234[m
[31m-hello-1234[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: named captures are empty[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("1234", "(?<first>[a-z]*)([0-9]+)", "")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: named captures are empty (with regex cache)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("1234", "(?<first>[a-z]*)([0-9]+)", "o")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it, err = ngx.re.gmatch("hello\\nworld", "(abc")[m
[31m-            if not err then[m
[31m-                ngx.say("good")[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local it, err = ngx.re.gmatch(string.sub(target, 1, 4), regex, "u")[m
[31m-[m
[31m-            if err then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local m, err = it()[m
[31m-            if err then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say("matched: ", m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-error: pcre_exec\(\) failed: -10[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("你好", ".", "U")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("你好", ".", "u")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local it, err = ngx.re.gmatch(s, re, "o")[m
[31m-if not it then[m
[31m-    ngx.say("failed to gen iterator: ", err)[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m-local res, err = it()[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local it, err = ngx.re.gmatch(s, re, "o")[m
[31m-if not it then[m
[31m-    ngx.say("failed to gen iterator: ", err)[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m-res, err = it()[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-failed to match[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/036-sub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/036-sub.t[m
[1mdeleted file mode 100644[m
[1mindex f08c50f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/036-sub.t[m
[1m+++ /dev/null[m
[36m@@ -1,757 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 19);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched but w/o variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, world[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[A-Z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched and with variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(b) (c)", "[$0] [$1] [$2] [$3] [$134]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: matched and with named variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("a b c d",[m
[31m-                "(b) (c)", "[$0] [$1] [$2] [$3] [$hello]")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-attempt to use named capturing variable "hello" (named captures not supported yet)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: matched and with named variables (bracketed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("a b c d",[m
[31m-                "(b) (c)", "[$0] [$1] [$2] [$3] [${hello}]")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-attempt to use named capturing variable "hello" (named captures not supported yet)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: matched and with bracketed variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134}]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134]")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-the closing bracket in "134" variable is missing[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-the closing bracket in "134" variable is missing[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-lua script: invalid capturing variable name found in "[$0] [$1] [${2}] [$3] [${"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: trailing $[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [$")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-lua script: invalid capturing variable name found in "[$0] [$1] [${2}] [$3] [$"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: matched but w/o variables and with literal $[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "ho$$wdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-ho$wdy, world[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: non-anchored match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "[0-9]", "x")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, x234[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: anchored match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "[0-9]", "x", "a")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: function replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([0-9])", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [3] [3]4[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: function replace (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([A-Z])", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 34[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad repl arg type[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([A-Z])", true)[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-false[m
[31m-bad argument #3 to '?' (string, number, or function expected, got boolean)[m
[31m-nil[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: use number to replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([0-9])", 72)[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-true[m
[31m-hello, 724[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad function return value type[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m) end[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([0-9])", f)[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-false[m
[31m-bad argument #3 to '?' (string or number expected to be returned by the replace function, got nil)[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: matched but w/o variables (set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "howdy")[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: matched and with variables w/o using named patterns in sub[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", "[$0] [$1] [$2] [$3] [$134]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: matched and with variables using named patterns in func[m
[31m---- config[m
[31m-    error_log /tmp/nginx_error debug;[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m["first"] .. "] [" .. m[2] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] d[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: matched and with variables w/ using named patterns in sub[m
[31m-This is still a TODO[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", "[$0] [${first}] [${second}] [$3] [$134]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: $0 without parens[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", [[\w]], "[$0]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[a] b c d[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("hello\\nworld", "(abc", "")[m
[31m-            if s then[m
[31m-                ngx.say("subs: ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local s, n, err = ngx.re.sub(string.sub(target, 1, 4), regex, "", "u")[m
[31m-[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-error: pcre_exec\(\) failed: -10[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("你好", ".", "a", "U")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: a好[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("你好", ".", "a", "u")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: a好[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, cnt, err = ngx.re.sub(s, re, "", "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if err then[m
[31m-    ngx.say("error: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ngx.say("sub: ", cnt)[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-local s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, cnt, err = ngx.re.sub(s, re, "", "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if err then[m
[31m-    ngx.say("error: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ngx.say("sub: ", cnt)[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-sub: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: bug: sub incorrectly swallowed a character is the first character[m
[31m-Original bad result: estCase[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("TestCase", "^ *", "", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-TestCase[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: bug: sub incorrectly swallowed a character is not the first character[m
[31m-Original bad result: .b.d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("abcd", "(?=c)", ".")[m
[31m-            if s then[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-ab.cd[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: ngx.re.gsub: recursive calling (github #445)[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        function test()[m
[31m-            local data = [[[m
[31m-                OUTER {FIRST}[m
[31m-]][m
[31m-[m
[31m-            local p1 = "(OUTER)(.+)"[m
[31m-            local p2 = "{([A-Z]+)}"[m
[31m-[m
[31m-            ngx.print(data)[m
[31m-[m
[31m-            local res =  ngx.re.gsub(data, p1, function(m)[m
[31m-                -- ngx.say("pre: m[1]: [", m[1], "]")[m
[31m-                -- ngx.say("pre: m[2]: [", m[2], "]")[m
[31m-[m
[31m-                local res = ngx.re.gsub(m[2], p2, function(_)[m
[31m-                    return "REPLACED"[m
[31m-                end, "")[m
[31m-[m
[31m-                -- ngx.say("post: m[1]: [", m[1], "]")[m
[31m-                -- ngx.say("post m[2]: [", m[2], "]")[m
[31m-                return m[1] .. res[m
[31m-            end, "")[m
[31m-[m
[31m-            ngx.print(res)[m
[31m-        end[m
[31m-[m
[31m-        test()[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-                OUTER {FIRST}[m
[31m-                OUTER REPLACED[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: function replace (false for groups)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                print("group 1: ", m[2])[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([0-9])|(world)", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [3] [3]4[m
[31m-1[m
[31m---- error_log[m
[31m-group 1: false[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/037-gsub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/037-gsub.t[m
[1mdeleted file mode 100644[m
[1mindex 2a1e00f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/037-gsub.t[m
[1m+++ /dev/null[m
[36m@@ -1,699 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 17);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("[hello, world]", "[a-z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[howdy, howdy][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: trimmed[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[a-z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, howdy[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[A-Z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: replace by function (trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, world", "([a-z])[a-z]+", f)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: replace by function (not trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", f)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: replace by script (trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "([a-z])[a-z]+", "[$0,$1]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: replace by script (not trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", "[$0,$1]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set_by_lua[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", f)[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: look-behind assertion[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "h$0")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{foohbarhbaz}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: gsub with a patch matching an empty substring (string template)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello", "a|", "b")[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: bhbeblblbob[m
[31m-n: 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: gsub with a patch matching an empty substring (string template, empty subj)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("", "a|", "b")[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: b[m
[31m-n: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: gsub with a patch matching an empty substring (func)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello", "a|", function () return "b" end)[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: bhbeblblbob[m
[31m-n: 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: gsub with a patch matching an empty substring (func, empty subj)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("", "a|", function () return "b" end)[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: b[m
[31m-n: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: big subject string exceeding the luabuf chunk size (with trailing unmatched data, func repl)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local subj = string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. "aaa"[m
[31m-[m
[31m-            local function repl(m)[m
[31m-                return string.rep("c", string.len(m[0]))[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub(subj, "b+", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-("a" x 8000) . ("c" x 1000) . ("a" x 8000) . ("c" x 1000)[m
[31m-. "aaa[m
[31m-2[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: big subject string exceeding the luabuf chunk size (without trailing unmatched data, func repl)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local subj = string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-[m
[31m-            local function repl(m)[m
[31m-                return string.rep("c", string.len(m[0]))[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub(subj, "b+", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-("a" x 8000) . ("c" x 1000) . ("a" x 8000) . ("c" x 1000)[m
[31m-. "\n2\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: big subject string exceeding the luabuf chunk size (with trailing unmatched data, str repl)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local subj = string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. "aaa"[m
[31m-[m
[31m-            local s, n = ngx.re.gsub(subj, "b(b+)(b)", "$1 $2")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-("a" x 8000) . ("b" x 998) . " b" . ("a" x 8000) . ("b" x 998) . " baaa[m
[31m-2[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: big subject string exceeding the luabuf chunk size (without trailing unmatched data, str repl)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local subj = string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-[m
[31m-            local s, n = ngx.re.gsub(subj, "b(b+)(b)", "$1 $2")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-("a" x 8000) . ("b" x 998) . " b" . ("a" x 8000) . ("b" x 998) . " b\n2\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: named pattern repl w/ callback[m
[31m---- config[m
[31m-    location /re {[m
[31m-       content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m["first"] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, world", "(?<first>[a-z])[a-z]+", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: $0 without parens[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("a b c d", [[\w]], "[$0]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[a] [b] [c] [d][m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local s, n, err = ngx.re.gsub(string.sub(target, 1, 4), regex, "", "u")[m
[31m-[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-       ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-error: pcre_exec\(\) failed: -10[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("你好", ".", "a", "U")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-exec opts: 2000[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: aa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("你好", ".", "a", "u")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-exec opts: 0[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: aa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, cnt, err = ngx.re.gsub(s, re, "", "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if err then[m
[31m-    ngx.say("error: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ngx.say("gsub: ", cnt)[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-local s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, cnt, err = ngx.re.gsub(s, re, "", "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if err then[m
[31m-    ngx.say("error: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ngx.say("gsub: ", cnt)[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-gsub: 0[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: bug: gsub incorrectly swallowed a character is the first character[m
[31m-Original bad result: estCase[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("TestCase", "^ *", "", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-TestCase[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: bug: gsub incorrectly swallowed a character is not the first character[m
[31m-Original bad result: .b.d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("abcd", "a|(?=c)", ".")[m
[31m-            if s then[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-.b.cd[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: use of ngx.req.get_headers in the user callback[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        local data = [[[m
[31m-            INNER[m
[31m-            INNER[m
[31m-]][m
[31m-[m
[31m-        -- ngx.say(data)[m
[31m-[m
[31m-        local res =  ngx.re.gsub(data, "INNER", function(inner_matches)[m
[31m-            local header = ngx.req.get_headers()["Host"][m
[31m-            -- local header = ngx.var["http_HEADER"][m
[31m-            return "INNER_REPLACED"[m
[31m-        end, "s")[m
[31m-[m
[31m-        ngx.print(res)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-            INNER_REPLACED[m
[31m-            INNER_REPLACED[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: use of ngx.var in the user callback[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        local data = [[[m
[31m-            INNER[m
[31m-            INNER[m
[31m-]][m
[31m-[m
[31m-        -- ngx.say(data)[m
[31m-[m
[31m-        local res =  ngx.re.gsub(data, "INNER", function(inner_matches)[m
[31m-            -- local header = ngx.req.get_headers()["Host"][m
[31m-            local header = ngx.var["http_HEADER"][m
[31m-            return "INNER_REPLACED"[m
[31m-        end, "s")[m
[31m-[m
[31m-        ngx.print(res)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-            INNER_REPLACED[m
[31m-            INNER_REPLACED[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: function replace (false for groups)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                print("group 1: ", m[2])[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, 34", "([0-9])|(world)", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [3] [3][4] [4][m
[31m-2[m
[31m---- error_log[m
[31m-group 1: false[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/038-match-o.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/038-match-o.t[m
[1mdeleted file mode 100644[m
[1mindex 628e27f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/038-match-o.t[m
[1m+++ /dev/null[m
[36m@@ -1,743 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: escaping sequences[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "(\\\\d+)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: escaping sequences (bad)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "(\\d+)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\('/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: escaping sequences in [[ ... ]][m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "[[\\d+]]", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\[\['/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: single capture[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]{2})[0-9]+", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([a-z]+).*?([0-9]{2})[0-9]+", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "foo", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: case sensitive by default[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "HELLO", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: case sensitive by default[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "HELLO", "oi")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: UTF-8 mode[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, m = pcall(ngx.re.match, "hello章亦春", "HELLO.{2}", "iou")[m
[31m-            if not rc then[m
[31m-                ngx.say("error: ", m)[m
[31m-                return[m
[31m-            end[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-this version of PCRE is not compiled with PCRE_UTF8 support|^hello章亦$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: multi-line mode (^ at line head)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "^world", "mo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: multi-line mode (. does not match \n)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", ".*", "om")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: single-line mode (^ as normal)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "^world", "so")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: single-line mode (dot all)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", ".*", "os")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "\\\\w     \\\\w", "xo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-he[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.match("hello\\nworld", "(abc", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad option[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            rc, m = pcall(ngx.re.match, "hello\\nworld", ".*", "Ho")[m
[31m-            if rc then[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            else[m
[31m-                ngx.say("error: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-^error: .*?unknown flag "H"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, world", "(world)|(hello)", "xo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-false[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: optional trailing captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)(h?)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-"1234[m
[31m-1234[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: anchored match (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "oa")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "ao")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: match with ctx but no pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "o", ctx)[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say(ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: match with ctx and a pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = { pos = 3 }[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "o", ctx)[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say(ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-34[m
[31m-5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: sanity (set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "o")[m
[31m-            if m then[m
[31m-                return m[0][m
[31m-            else[m
[31m-                return "not matched!"[m
[31m-            end[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: match (look-behind assertion)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local m = ngx.re.match("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "o", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "o", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: match (with regex cache)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "([A-Z]+)", "io")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("1234, okay", "([A-Z]+)", "io")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("hello, 1234", "([A-Z]+)", "o")[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-okay[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: match (with regex cache and ctx)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local m = ngx.re.match("hello, 1234", "([A-Z]+)", "io", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-            ngx.say(ctx.pos)[m
[31m-[m
[31m-            m = ngx.re.match("1234, okay", "([A-Z]+)", "io", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-            ngx.say(ctx.pos)[m
[31m-[m
[31m-            ctx.pos = 1[m
[31m-            m = ngx.re.match("hi, 1234", "([A-Z]+)", "o", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-            ngx.say(ctx.pos)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-6[m
[31m-okay[m
[31m-11[m
[31m-nil[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: exceeding regex cache max entries[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 2;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "([0-9]+)", "o")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("howdy, 567", "([0-9]+)", "oi")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("hiya, 98", "([0-9]+)", "ox")[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-567[m
[31m-98[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: disable regex cache completely[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 0;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "([0-9]+)", "o")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("howdy, 567", "([0-9]+)", "oi")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("hiya, 98", "([0-9]+)", "ox")[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-567[m
[31m-98[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "(?<first>[a-z]+), [0-9]+", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-hello[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: duplicate named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "(?<first>[a-z]+), (?<first>[0-9]+)", "Do")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-1234[m
[31m-hello-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: named captures are empty strings[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("1234", "(?<first>[a-z]*)([0-9]+)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: named captures are false[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, world", "(world)|(hello)|(?<named>howdy)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-                ngx.say(m["named"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-false[m
[31m-hello[m
[31m-false[m
[31m-false[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/039-sub-o.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/039-sub-o.t[m
[1mdeleted file mode 100644[m
[1mindex a861b6c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/039-sub-o.t[m
[1m+++ /dev/null[m
[36m@@ -1,581 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 6);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched but w/o variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, world[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[A-Z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched and with variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(b) (c)", "[$0] [$1] [$2] [$3] [$134]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: matched and with named variables (bad template)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("a b c d",[m
[31m-                                         "(b) (c)",[m
[31m-                                         "[$0] [$1] [$2] [$3] [$hello]",[m
[31m-                                         "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-attempt to use named capturing variable "hello" (named captures not supported yet)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: matched and with named variables (bracketed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("a b c d",[m
[31m-                                         "(b) (c)",[m
[31m-                                         "[$0] [$1] [$2] [$3] [${hello}]",[m
[31m-                                         "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-attempt to use named capturing variable "hello" (named captures not supported yet)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: matched and with bracketed variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134}]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134]", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-the closing bracket in "134" variable is missing[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-the closing bracket in "134" variable is missing[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-lua script: invalid capturing variable name found in "[$0] [$1] [${2}] [$3] [${"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: trailing $[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [$", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-lua script: invalid capturing variable name found in "[$0] [$1] [${2}] [$3] [$"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: matched but w/o variables and with literal $[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "ho$$wdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-ho$wdy, world[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: non-anchored match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", " [0-9] ", "x", "xo")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, x234[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: anchored match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "[0-9]", "x", "ao")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: function replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([0-9])", repl, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [3] [3]4[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: function replace (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([A-Z])", repl, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 34[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad repl arg type[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([A-Z])", true, "o")[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-false[m
[31m-bad argument #3 to '?' (string, number, or function expected, got boolean)[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: use number to replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([0-9])", 72, "o")[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-true[m
[31m-hello, 724[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad function return value type[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m) end[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([0-9])", f, "o")[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-false[m
[31m-bad argument #3 to '?' (string or number expected to be returned by the replace function, got nil)[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: matched but w/o variables (set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "howdy", "o")[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: with regex cache (with text replace)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([A-Z]+)", "baz", "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            local s, n = ngx.re.sub("howdy, 1234", "([A-Z]+)", "baz", "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-[m
[31m-            s, n = ngx.re.sub("1234, okay", "([A-Z]+)", "blah", "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("hi, 1234", "([A-Z]+)", "hello", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-baz, 1234[m
[31m-1[m
[31m-baz, 1234[m
[31m-1[m
[31m-1234, blah[m
[31m-1[m
[31m-hi, 1234[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: with regex cache (with func replace)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([A-Z]+)", "baz", "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            local s, n = ngx.re.sub("howdy, 1234", "([A-Z]+)", function () return "bah" end, "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("1234, okay", "([A-Z]+)", function () return "blah" end, "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("hi, 1234", "([A-Z]+)", "hello", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-baz, 1234[m
[31m-1[m
[31m-bah, 1234[m
[31m-1[m
[31m-1234, blah[m
[31m-1[m
[31m-hi, 1234[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exceeding regex cache max entries[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 2;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([0-9]+)", "hello", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("howdy, 567", "([0-9]+)", "hello", "oi")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("hiya, 98", "([0-9]+)", "hello", "ox")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, hello[m
[31m-1[m
[31m-howdy, hello[m
[31m-1[m
[31m-hiya, hello[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: disable regex cache completely[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 0;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([0-9]+)", "hello", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("howdy, 567", "([0-9]+)", "hello", "oi")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("hiya, 98", "([0-9]+)", "hello", "ox")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, hello[m
[31m-1[m
[31m-howdy, hello[m
[31m-1[m
[31m-hiya, hello[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: empty replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([0-9]+)", "", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hi, 5432", "([0-9]+)", "", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [m
[31m-1[m
[31m-hi, [m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: matched and with variables w/o using named patterns in sub[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", "[$0] [$1] [$2] [$3] [$134]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: matched and with variables using named patterns in func[m
[31m---- config[m
[31m-    error_log /tmp/nginx_error debug;[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m["first"] .. "] [" .. m[2] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", repl, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] d[m
[31m-1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/040-gsub-o.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/040-gsub-o.t[m
[1mdeleted file mode 100644[m
[1mindex 90619b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/040-gsub-o.t[m
[1m+++ /dev/null[m
[36m@@ -1,201 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("[hello, world]", "[a-z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[howdy, howdy][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: trimmed[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[a-z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, howdy[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[A-Z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: replace by function (trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, world", "([a-z])[a-z]+", f, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: replace by function (not trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", f, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: replace by script (trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "([a-z])[a-z]+", "[$0,$1]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: replace by script (not trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", "[$0,$1]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set_by_lua[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", f, "o")[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: look-behind assertion[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "h$0", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{foohbarhbaz}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: named pattern repl w/ callback[m
[31m---- config[m
[31m-    location /re {[m
[31m-       content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m["first"] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, world", "(?<first>[a-z])[a-z]+", repl, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/041-header-filter.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/041-header-filter.t[m
[1mdeleted file mode 100644[m
[1mindex 553ee43..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/041-header-filter.t[m
[1m+++ /dev/null[m
[36m@@ -1,793 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 94;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_type = "text/my-plain";[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: server config[m
[31m---- config[m
[31m-    header_filter_by_lua '[m
[31m-        ngx.header.content_type = "text/my-plain";[m
[31m-    ';[m
[31m-[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set in http[m
[31m---- http_config[m
[31m-    header_filter_by_lua '[m
[31m-        ngx.header.content_type = "text/my-plain";[m
[31m-    ';[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: overriding config[m
[31m---- config[m
[31m-    header_filter_by_lua '[m
[31m-        ngx.header.content_type = "text/my-plain";[m
[31m-    ';[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_type = "text/read-plain";[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/read-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_type = "text/my-plain";[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua code run failed[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_length = "text/my-plain";[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- error_code[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: use variable generated by content phrase[m
[31m---- config[m
[31m-   location /read {[m
[31m-        set $strvar '1';[m
[31m-        content_by_lua '[m
[31m-            ngx.var.strvar = "127.0.0.1:8080";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = ngx.var.strvar;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-uid: 127.0.0.1:8080[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: use variable generated by content phrase for HEAD[m
[31m---- config[m
[31m-   location /read {[m
[31m-        set $strvar '1';[m
[31m-        content_by_lua '[m
[31m-            ngx.var.strvar = "127.0.0.1:8080";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = ngx.var.strvar;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /read[m
[31m---- response_headers[m
[31m-uid: 127.0.0.1:8080[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: use variable generated by content phrase for HTTP 1.0[m
[31m---- config[m
[31m-   location /read {[m
[31m-        set $strvar '1';[m
[31m-        content_by_lua '[m
[31m-            ngx.var.strvar = "127.0.0.1:8080";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = ngx.var.strvar;[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- request[m
[31m-GET /read HTTP/1.0[m
[31m---- response_headers[m
[31m-uid: 127.0.0.1:8080[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: use capture and header_filter_by[m
[31m---- config[m
[31m-   location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = "sub";[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /parent {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            if res.status == 200 then[m
[31m-                ngx.say(res.header.uid)[m
[31m-            else[m
[31m-                ngx.say("parent")[m
[31m-            end[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = "parent";[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_headers[m
[31m-uid: parent[m
[31m---- response_body[m
[31m-sub[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: overriding ctx[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.ctx.foo = ngx.ctx.foo + 1;[m
[31m-            ngx.header.uid = ngx.ctx.foo;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-uid: 33[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: use req[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua '[m
[31m-            local str = "";[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                local val = args[key][m
[31m-                if type(val) == "table" then[m
[31m-                    str = str .. table.concat(val, ", ")[m
[31m-                else[m
[31m-                    str = str .. ":" .. val[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.header.uid = str;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_headers[m
[31m-uid: :1:2[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: use ngx md5 function[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = ngx.md5("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-uid: c1a5298f939e87e8f962a5edfc206918[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set response content-type header (by file)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header.content_type = "text/my-plain";[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: by_lua_file server config[m
[31m---- config[m
[31m-    header_filter_by_lua_file 'html/foo.lua';[m
[31m-[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header.content_type = "text/my-plain";[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: by_lua_file set in http[m
[31m---- http_config[m
[31m-    header_filter_by_lua_file 'html/foo.lua';[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header.content_type = "text/my-plain";[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: by_lua_file overriding config[m
[31m---- config[m
[31m-    header_filter_by_lua 'html/foo.lua';[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua_file 'html/bar.lua';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header.content_type = "text/my-plain";[m
[31m->>> bar.lua[m
[31m-ngx.header.content_type = "text/read-plain";[m
[31m---- response_headers[m
[31m-Content-Type: text/read-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.ctx available in header_filter_by_lua (already defined)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.ctx.counter = 3 ngx.say(ngx.ctx.counter)';[m
[31m-        header_filter_by_lua 'ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-3[m
[31m---- error_log[m
[31m-ngx.ctx.counter: 3[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.ctx available in header_filter_by_lua (not defined yet)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)[m
[31m-            ngx.ctx.counter = "hello world"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-ngx.ctx.counter: nil[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: global got cleared for each single request[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $foo '';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say(ngx.var.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            if not foo then[m
[31m-                foo = 1[m
[31m-            else[m
[31m-                foo = foo + 1[m
[31m-            end[m
[31m-            ngx.var.foo = foo[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: lua error (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $foo '';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say(ngx.var.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            error("Something bad")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to run header_filter_by_lua*: header_filter_by_lua:2: Something bad[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: lua error (nil)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $foo '';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say(ngx.var.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            error(nil)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to run header_filter_by_lua*: unknown reason[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: no ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.print(32) return 1";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: no ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.say(32) return 1";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: no ngx.flush[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.flush()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: no ngx.eof[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.eof()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: no ngx.send_headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.send_headers()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: no ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.location.capture("/sub")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: no ngx.location.capture_multi[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.location.capture_multi{{"/sub"}}';[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: no ngx.redirect[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.redirect("/blah")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: no ngx.exec[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.exec("/blah")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: no ngx.req.set_uri(uri, true)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.req.set_uri("/blah", true)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: ngx.req.set_uri(uri) exists[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.req.set_uri("/blah") return 1';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("uri: ", ngx.var.uri)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-uri: /blah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: no ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.req.read_body()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: no ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'return ngx.req.socket()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: no ngx.socket.tcp()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'return ngx.socket.tcp()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: no ngx.socket.connect()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'return ngx.socket.connect("127.0.0.1", 80)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: clear content-length[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 12[m
[31m-            ngx.say("hello world")[m
[31m-        ';[m
[31m-        header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-!content-length[m
[31m---- response_body[m
[31m-hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: backtrace[m
[31m---- config[m
[31m-    location /t {[m
[31m-        header_filter_by_lua '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                error("something bad happened")[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-        ';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-something bad happened[m
[31m-stack traceback:[m
[31m-in function 'error'[m
[31m-in function 'bar'[m
[31m-in function 'foo'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        header_filter_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: filter finalize[m
[31m---- config[m
[31m-    error_page 582 = /bar;[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(582)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /bar {[m
[31m-        echo hi;[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(302)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/042-crc32.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/042-crc32.t[m
[1mdeleted file mode 100644[m
[1mindex 86d9201..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/042-crc32.t[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: short sanity[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.crc32_short("hello, world"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-4289425978[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: long sanity[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.crc32_long("hello, world"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-4289425978[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: long sanity (empty)[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.crc32_long(""))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-0[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/043-shdict.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/043-shdict.t[m
[1mdeleted file mode 100644[m
[1mindex cd160f7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/043-shdict.t[m
[1m+++ /dev/null[m
[36m@@ -1,2450 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 18);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: string key, int value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: string key, floating-point value[m
[31m---- http_config[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local cats = ngx.shared.cats[m
[31m-            cats:set("foo", 3.14159)[m
[31m-            cats:set("baz", 1.28)[m
[31m-            cats:set("baz", 3.96)[m
[31m-            local val = cats:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = cats:get("baz")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-3.14159 number[m
[31m-3.96 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: string key, boolean value[m
[31m---- http_config[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local cats = ngx.shared.cats[m
[31m-            cats:set("foo", true)[m
[31m-            cats:set("bar", false)[m
[31m-            local val = cats:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = cats:get("bar")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-true boolean[m
[31m-false boolean[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: number keys, string values[m
[31m---- http_config[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local cats = ngx.shared.cats[m
[31m-            ngx.say(cats:set(1234, "cat"))[m
[31m-            ngx.say(cats:set("1234", "dog"))[m
[31m-            ngx.say(cats:set(256, "bird"))[m
[31m-            ngx.say(cats:get(1234))[m
[31m-            ngx.say(cats:get("1234"))[m
[31m-            local val = cats:get("256")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-truenilfalse[m
[31m-truenilfalse[m
[31m-truenilfalse[m
[31m-dog[m
[31m-dog[m
[31m-bird string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: different-size values set to the same key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "hello")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-hello, world[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: expired entries (can be auto-removed by get)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0.01)[m
[31m-            ngx.location.capture("/sleep/0.01")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/sleep/(.+)' {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: expired entries (can NOT be auto-removed by get)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 56, 0.001)[m
[31m-            dogs:set("baz", 78, 0.001)[m
[31m-            dogs:set("foo", 32, 0.01)[m
[31m-            ngx.location.capture("/sleep/0.012")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/sleep/(.+)' {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: not yet expired entries[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0.5)[m
[31m-            ngx.location.capture("/sleep/0.01")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/sleep/(.+)' {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: forcibly override other valid entries[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep(" hello", 10) .. i[m
[31m-                local res, err, forcible = dogs:set("key_" .. i, val)[m
[31m-                if not res or forcible then[m
[31m-                    ngx.say(res, " ", err, " ", forcible)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-            ngx.say("cur value: ", dogs:get("key_" .. i))[m
[31m-            if i > 1 then[m
[31m-                ngx.say("1st value: ", dogs:get("key_1"))[m
[31m-            end[m
[31m-            if i > 2 then[m
[31m-                ngx.say("2nd value: ", dogs:get("key_2"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-my $a = "true nil true\nabort at (353|705)\ncur value: " . (" hello" x 10) . "\\1\n1st value: nil\n2nd value: " . (" hello" x 10) . "2\n";[m
[31m-[qr/$a/,[m
[31m-"true nil true\nabort at 1\ncur value: " . (" hello" x 10) . "1\n"[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: forcibly override other valid entries and test LRU[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep(" hello", 10) .. i[m
[31m-                if i == 10 then[m
[31m-                    dogs:get("key_1")[m
[31m-                end[m
[31m-                local res, err, forcible = dogs:set("key_" .. i, val)[m
[31m-                if not res or forcible then[m
[31m-                    ngx.say(res, " ", err, " ", forcible)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-            ngx.say("cur value: ", dogs:get("key_" .. i))[m
[31m-            if i > 1 then[m
[31m-                ngx.say("1st value: ", dogs:get("key_1"))[m
[31m-            end[m
[31m-            if i > 2 then[m
[31m-                ngx.say("2nd value: ", dogs:get("key_2"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-my $a = "true nil true\nabort at (353|705)\ncur value: " . (" hello" x 10) . "\\1\n1st value: " . (" hello" x 10) . "1\n2nd value: nil\n";[m
[31m-[qr/$a/,[m
[31m-"true nil true\nabort at 2\ncur value: " . (" hello" x 10) . "2\n1st value: " . (" hello" x 10) . "1\n"[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: dogs and cats dicts[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local cats = ngx.shared.cats[m
[31m-            dogs:set("foo", 32)[m
[31m-            cats:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            ngx.say(cats:get("foo"))[m
[31m-            dogs:set("foo", 56)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            ngx.say(cats:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m-hello, world[m
[31m-56[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: get non-existent keys[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: not feed the object into the call[m
[31m---- SKIP[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local rc, err = pcall(dogs.set, "foo", 3, 0.01)[m
[31m-            ngx.say(rc, " ", err)[m
[31m-            rc, err = pcall(dogs.set, "foo", 3)[m
[31m-            ngx.say(rc, " ", err)[m
[31m-            rc, err = pcall(dogs.get, "foo")[m
[31m-            ngx.say(rc, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-false bad argument #1 to '?' (userdata expected, got string)[m
[31m-false expecting 3, 4 or 5 arguments, but only seen 2[m
[31m-false expecting exactly two arguments, but only seen 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: too big value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 50k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage("collect")[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local res, err, forcible = dogs:set("foo", string.rep("helloworld", 10000))[m
[31m-            ngx.say(res, " ", err, " ", forcible)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-false no memory false[m
[31m---- log_level: info[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[31m-ngx_slab_alloc() failed: no memory in lua_shared_dict zone[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set too large key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local key = string.rep("a", 65535)[m
[31m-            local rc, err = dogs:set(key, "hello")[m
[31m-            ngx.say(rc, " ", err)[m
[31m-            ngx.say(dogs:get(key))[m
[31m-[m
[31m-            key = string.rep("a", 65536)[m
[31m-            ok, err = dogs:set(key, "world")[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-true nil[m
[31m-hello[m
[31m-not ok: key too long[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad value type[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", dogs)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: bad value type[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: delete after setting values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:delete("foo")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m-nil[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: delete at first[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:delete("foo")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: set nil after setting values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", nil)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m-nil[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: set nil at first[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", nil)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: fail to allocate memory[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep("hello", i )[m
[31m-                local res, err, forcible = dogs:set("key_" .. i, val)[m
[31m-                if not res or forcible then[m
[31m-                    ngx.say(res, " ", err, " ", forcible)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like[m
[31m-^true nil true\nabort at (?:139|140)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: string key, int value (write_by_lua)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: string key, int value (access_by_lua)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: string key, int value (set_by_lua)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set_by_lua $res '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            return dogs:get("foo")[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: string key, int value (header_by_lua)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            ngx.header["X-Foo"] = dogs:get("foo")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_headers[m
[31m-X-Foo: 32[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: too big value (forcible)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 50k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage("collect")[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bah", "hello")[m
[31m-            local res, err, forcible = dogs:set("foo", string.rep("helloworld", 10000))[m
[31m-            ngx.say(res, " ", err, " ", forcible)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-false no memory true[m
[31m---- log_level: info[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[31m-ngx_slab_alloc() failed: no memory in lua_shared_dict zone[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: add key (key exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err, forcible = dogs:add("foo", 10502)[m
[31m-            ngx.say("add: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-add: false exists false[m
[31m-foo = 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: add key (key not exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bah", 32)[m
[31m-            local res, err, forcible = dogs:add("foo", 10502)[m
[31m-            ngx.say("add: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-add: true nil false[m
[31m-foo = 10502[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: add key (key expired)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 32, 0.001)[m
[31m-            dogs:set("baz", 32, 0.001)[m
[31m-            dogs:set("foo", 32, 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local res, err, forcible = dogs:add("foo", 10502)[m
[31m-            ngx.say("add: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-add: true nil false[m
[31m-foo = 10502[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: add key (key expired and value size unmatched)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 32, 0.001)[m
[31m-            dogs:set("baz", 32, 0.001)[m
[31m-            dogs:set("foo", "hi", 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local res, err, forcible = dogs:add("foo", "hello")[m
[31m-            ngx.say("add: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-add: true nil false[m
[31m-foo = hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: incr key (key exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err, forcible = dogs:replace("foo", 10502)[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-[m
[31m-            local res, err, forcible = dogs:replace("foo", "hello")[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-replace: true nil false[m
[31m-foo = 10502[m
[31m-replace: true nil false[m
[31m-foo = hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: replace key (key not exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bah", 32)[m
[31m-            local res, err, forcible = dogs:replace("foo", 10502)[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-replace: false not found false[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: replace key (key expired)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 3, 0.001)[m
[31m-            dogs:set("baz", 2, 0.001)[m
[31m-            dogs:set("foo", 32, 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local res, err, forcible = dogs:replace("foo", 10502)[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-replace: false not found false[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: replace key (key expired and value size unmatched)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 32, 0.001)[m
[31m-            dogs:set("baz", 32, 0.001)[m
[31m-            dogs:set("foo", "hi", 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local rc, err, forcible = dogs:replace("foo", "hello")[m
[31m-            ngx.say("replace: ", rc, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-replace: false not found false[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: incr key (key exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err = dogs:incr("foo", 10502)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: 10534 nil[m
[31m-foo = 10534[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: replace key (key not exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bah", 32)[m
[31m-            local res, err = dogs:incr("foo", 2)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: nil not found[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: replace key (key expired)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 3, 0.001)[m
[31m-            dogs:set("baz", 2, 0.001)[m
[31m-            dogs:set("foo", 32, 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local res, err = dogs:incr("foo", 10502)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: nil not found[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: incr key (incr by 0)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err = dogs:incr("foo", 0)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: 32 nil[m
[31m-foo = 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: incr key (incr by floating point number)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err = dogs:incr("foo", 0.14)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: 32.14 nil[m
[31m-foo = 32.14[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: incr key (incr by negative numbers)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err = dogs:incr("foo", -0.14)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: 31.86 nil[m
[31m-foo = 31.86[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: incr key (original value is not number)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", true)[m
[31m-            local res, err = dogs:incr("foo", -0.14)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: nil not a number[m
[31m-foo = true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: get and set with flags[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0, 199)[m
[31m-            dogs:set("bah", 10502, 202)[m
[31m-            local val, flags = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            ngx.say(flags, " ", type(flags))[m
[31m-            val, flags = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            ngx.say(flags, " ", type(flags))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-199 number[m
[31m-10502 number[m
[31m-nil nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: expired entries (can be auto-removed by get), with flags set[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0.01, 255)[m
[31m-            ngx.location.capture("/sleep/0.01")[m
[31m-            local res, flags = dogs:get("foo")[m
[31m-            ngx.say("res = ", res, ", flags = ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/sleep/(.+)' {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-res = nil, flags = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: flush_all[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-[m
[31m-            dogs:flush_all()[m
[31m-[m
[31m-            val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m-nil nil[m
[31m-nil nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: flush_expires[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "x", 1)[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 100)[m
[31m-[m
[31m-            ngx.sleep(1.5)[m
[31m-[m
[31m-            local num = dogs:flush_expired()[m
[31m-            ngx.say(num)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: flush_expires with number[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            for i=1,100 do[m
[31m-                dogs:set(tostring(i), "x", 1)[m
[31m-            end[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 100)[m
[31m-[m
[31m-            ngx.sleep(1.5)[m
[31m-[m
[31m-            local num = dogs:flush_expired(42)[m
[31m-            ngx.say(num)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-42[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: flush_expires an empty dict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local num = dogs:flush_expired()[m
[31m-            ngx.say(num)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: flush_expires a dict without expired items[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 100)[m
[31m-[m
[31m-            local num = dogs:flush_expired()[m
[31m-            ngx.say(num)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: list all keys in a shdict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 0)[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-            table.sort(keys)[m
[31m-            for _,k in ipairs(keys) do[m
[31m-                ngx.say(k)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-2[m
[31m-bah[m
[31m-bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: list keys in a shdict with limit[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 0)[m
[31m-            local keys = dogs:get_keys(1)[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: list all keys in a shdict with expires[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "x", 1)[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 100)[m
[31m-[m
[31m-            ngx.sleep(1.5)[m
[31m-[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: list keys in a shdict with limit larger than number of keys[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 0)[m
[31m-            local keys = dogs:get_keys(3)[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: list keys in an empty shdict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: list keys in an empty shdict with a limit[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local keys = dogs:get_keys(4)[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: list all keys in a shdict with all keys expired[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "x", 1)[m
[31m-            dogs:set("bah", "y", 1)[m
[31m-            dogs:set("bar", "z", 1)[m
[31m-[m
[31m-            ngx.sleep(1.5)[m
[31m-[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: list all keys in a shdict with more than 1024 keys with no limit set[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            for i=1,2048 do[m
[31m-                dogs:set(tostring(i), i)[m
[31m-            end[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1024[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 57: list all keys in a shdict with more than 1024 keys with 0 limit set[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            for i=1,2048 do[m
[31m-                dogs:set(tostring(i), i)[m
[31m-            end[m
[31m-            local keys = dogs:get_keys(0)[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-2048[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 58: safe_set[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep(" hello", 10) .. i[m
[31m-                local res, err = dogs:safe_set("key_" .. i, val)[m
[31m-                if not res then[m
[31m-                    ngx.say(res, " ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-            ngx.say("cur value: ", dogs:get("key_" .. i))[m
[31m-            if i > 1 then[m
[31m-                ngx.say("1st value: ", dogs:get("key_1"))[m
[31m-            end[m
[31m-            if i > 2 then[m
[31m-                ngx.say("2nd value: ", dogs:get("key_2"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-my $a = "false no memory\nabort at (353|705)\ncur value: nil\n1st value: " . (" hello" x 10) . "1\n2nd value: " . (" hello" x 10) . "2\n";[m
[31m-[qr/$a/, qr/$a/][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 59: safe_add[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep(" hello", 10) .. i[m
[31m-                local res, err = dogs:safe_add("key_" .. i, val)[m
[31m-                if not res then[m
[31m-                    ngx.say(res, " ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-            ngx.say("cur value: ", dogs:get("key_" .. i))[m
[31m-            if i > 1 then[m
[31m-                ngx.say("1st value: ", dogs:get("key_1"))[m
[31m-            end[m
[31m-            if i > 2 then[m
[31m-                ngx.say("2nd value: ", dogs:get("key_2"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-my $a = "false no memory\nabort at (353|705)\ncur value: nil\n1st value: " . (" hello" x 10) . "1\n2nd value: " . (" hello" x 10) . "2\n";[m
[31m-[qr/$a/,[m
[31m-q{false exists[m
[31m-abort at 1[m
[31m-cur value:  hello hello hello hello hello hello hello hello hello hello1[m
[31m-}[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 60: get_stale: expired entries can still be fetched[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0.01)[m
[31m-            dogs:set("blah", 33, 0.3)[m
[31m-            ngx.sleep(0.02)[m
[31m-            local val, flags, stale = dogs:get_stale("foo")[m
[31m-            ngx.say(val, ", ", flags, ", ", stale)[m
[31m-            local val, flags, stale = dogs:get_stale("blah")[m
[31m-            ngx.say(val, ", ", flags, ", ", stale)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32, nil, true[m
[31m-33, nil, false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 61: set nil key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set(nil, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 62: set bad zone argument[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs.set(nil, "foo", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 63: set empty string keys[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: empty key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 64: get bad zone argument[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs.get(nil, "foo")[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 65: get nil key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get(nil)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 66: get empty key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get("")[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: empty key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 67: get a too-long key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get(string.rep("a", 65536))[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: key too long[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 68: set & get large values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", string.rep("helloworld", 1024))[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err = dogs:get("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get ok: ", #data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get ok: 10240[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 69: get_stale nil key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get_stale(nil)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 70: get_stale empty key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get_stale("")[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: empty key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 71: get_stale number key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set(1024, "hello")[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-            local data, err = dogs:get_stale(1024)[m
[31m-            if not ok then[m
[31m-                ngx.say("get_stale not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get_stale: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 72: get_stale a too-long key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get_stale(string.rep("a", 65536))[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: key too long[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 73: get_stale a non-existent key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local data, err = dogs:get_stale("not_found")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get ok: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-get ok: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 74: set & get_stale large values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", string.rep("helloworld", 1024))[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err, stale = dogs:get_stale("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get_stale ok: ", #data, ", stale: ", stale)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale ok: 10240, stale: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 75: set & get_stale boolean values (true)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", true)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err, stale = dogs:get_stale("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get_stale ok: ", data, ", stale: ", stale)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale ok: true, stale: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 76: set & get_stale boolean values (false)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", false)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err, stale = dogs:get_stale("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get_stale ok: ", data, ", stale: ", stale)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale ok: false, stale: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 77: set & get_stale with a flag[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", false, 0, 325)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err, stale = dogs:get_stale("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            flags = err[m
[31m-            ngx.say("get_stale ok: ", data, ", flags: ", flags,[m
[31m-                    ", stale: ", stale)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale ok: false, flags: 325, stale: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 78: incr nil key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:incr(nil, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 79: incr bad zone argument[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs.incr(nil, "foo", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 80: incr empty string keys[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:incr("", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: empty key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 81: incr too long key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local key = string.rep("a", 65536)[m
[31m-            local ok, err = dogs:incr(key, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: key too long[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 82: incr number key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local key = 56[m
[31m-            local ok, err = dogs:set(key, 1)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-            ok, err = dogs:incr(key, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("incr not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("incr ok")[m
[31m-            local data, err = dogs:get(key)[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local flags = err[m
[31m-            ngx.say("get ok: ", data, ", flags: ", flags)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-incr ok[m
[31m-get ok: 33, flags: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 83: incr a number-like string key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local key = 56[m
[31m-            local ok, err = dogs:set(key, 1)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-            ok, err = dogs:incr(key, "32")[m
[31m-            if not ok then[m
[31m-                ngx.say("incr not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("incr ok")[m
[31m-            local data, err = dogs:get(key)[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local flags = err[m
[31m-            ngx.say("get ok: ", data, ", flags: ", flags)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-incr ok[m
[31m-get ok: 33, flags: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 84: add nil values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:add("foo", nil)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: attempt to add or replace nil values[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 85: replace key with exptime[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 2, 0)[m
[31m-            dogs:replace("foo", 32, 0.01)[m
[31m-            local data = dogs:get("foo")[m
[31m-            ngx.say("get foo: ", data)[m
[31m-            ngx.location.capture("/sleep/0.02")[m
[31m-            local res, err, forcible = dogs:replace("foo", 10502)[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-get foo: 32[m
[31m-replace: false not found false[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 86: the lightuserdata ngx.null has no methods of shared dicts.[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local lightuserdata = ngx.null[m
[31m-            lightuserdata:set("foo", 1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- grep_error_log chop[m
[31m-attempt to index local 'lightuserdata' (a userdata value)[m
[31m---- grep_error_log_out[m
[31m-attempt to index local 'lightuserdata' (a userdata value)[m
[31m---- error_log[m
[31m-[error][m
[31m---- no_error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 87: set bad zone table[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs.set({1}, "foo", 1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 88: get bad zone table[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs.get({1}, "foo")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 89: incr bad zone table[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs.incr({1}, "foo", 32)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 90: check the type of the shdict object[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("type: ", type(ngx.shared.dogs))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-type: table[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 91: dogs, cat mixing[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-[m
[31m-            local cats = ngx.shared.cats[m
[31m-            val = cats:get("foo")[m
[31m-            ngx.say(val or "nil")[m
[31m-            val = cats:get("bah")[m
[31m-            ngx.say(val or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m-nil[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 92: invalid expire time[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, -1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "exptime" argument[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/044-req-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/044-req-body.t[m
[1mdeleted file mode 100644[m
[1mindex 28fa818..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/044-req-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,1740 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 52 );[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read buffered body[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read buffered body (timed out)[m
[31m---- config[m
[31m-    client_body_timeout 1ms;[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /test HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 100\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-hello, world"[m
[31m---- response_body:[m
[31m---- error_code_like: ^(?:500)?$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read buffered body and then subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: first subrequest and then read buffered body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: discard body[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: not discard body (content_by_lua falls through)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read buffered body and retrieve the data[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: read buffered body to file and call get_body_data[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: read buffered body to file and call get_body_file[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_file())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body_like: client_body_temp/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: read buffered body to memory and retrieve the file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_file())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: read buffered body to memory and reset it with data in memory[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear")[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say(ngx.var.echo_request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hiya, dear[m
[31m-hiya, dear[m
[31m-hiya, dear[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: read body to file and then override it with data in memory[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hello, baby")[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-yeah[m
[31m---- response_body[m
[31m-hello, baby[m
[31m-hello, baby[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: do not read the current request body but replace it with our own in memory[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_body_data("hello, baby")[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-yeah[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/lua entry thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):2: request body not read yet/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: read buffered body to file and reset it to a new file[m
[31m---- config[m
[31m-[m
[31m-    location = /test {[m
[31m-        client_body_in_file_only on;[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.var.old = ngx.req.get_body_file()[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-            ngx.var.new = ngx.req.get_body_file()[m
[31m-        ';[m
[31m-        #echo_request_body;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        #proxy_pass http://127.0.0.1:7890/echo;[m
[31m-        add_header X-Old $old;[m
[31m-        add_header X-New $new;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- raw_response_headers_like[m
[31m-X-Old: \S+/client_body_temp/\d+\r[m
[31m-.*?X-New: \S+/html/a\.txt\r[m
[31m---- response_body[m
[31m-Will you change this world?[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: read buffered body to file and reset it to a new file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        client_body_in_file_only on;[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.var.old = ngx.req.get_body_file() or ""[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-            ngx.var.new = ngx.req.get_body_file()[m
[31m-        ';[m
[31m-        #echo_request_body;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        #proxy_pass http://127.0.0.1:7890/echo;[m
[31m-        add_header X-Old $old;[m
[31m-        add_header X-New $new;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world![m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- raw_response_headers_like[m
[31m-X-Old: \S+/client_body_temp/\d+\r[m
[31m-.*?X-New: \S+/html/a\.txt\r[m
[31m---- response_body[m
[31m-Will you change this world?[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: read buffered body to file and reset it to a new file (auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.var.old = ngx.req.get_body_file()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, true)[m
[31m-            local b_file = ngx.var.realpath_root .. "/b.txt"[m
[31m-            ngx.req.set_body_file(b_file, true)[m
[31m-            ngx.say("a.txt exists: ", io.open(a_file) and "yes" or "no")[m
[31m-            ngx.say("b.txt exists: ", io.open(b_file) and "yes" or "no")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m->>> b.txt[m
[31m-Sure I will![m
[31m---- response_body[m
[31m-a.txt exists: no[m
[31m-b.txt exists: yes[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: read buffered body to memoary and reset it to a new file (auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, true)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hey, you"][m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- response_body eval[m
[31m-["Will you change this world?\n",[m
[31m-qr/500 Internal Server Error/][m
[31m---- error_code eval[m
[31m-[200, 500][m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: read buffered body to memoary and reset it to a new file (no auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, false)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hey, you"][m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- response_body eval[m
[31m-["Will you change this world?\n",[m
[31m-"Will you change this world?\n"][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: request body discarded and reset it to a new file (auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-    client_header_buffer_size 80;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, false)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: no request body and reset it to a new file (no auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, true)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/lua entry thread aborted: runtime error: rewrite_by_lua\(nginx\.conf:\d+\):3: request body not read yet/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: read buffered body to memory and reset it with data in memory + proxy[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear dear friend!")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body chomp[m
[31m-hiya, dear dear friend![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: discard request body and reset it to a new file (no auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, true)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: discard body and then read[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hello, world"][m
[31m---- response_body eval[m
[31m-["nil","nil"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: set empty request body in memory[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: [", ngx.req.get_body_data(), "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hello, world"][m
[31m---- response_body eval[m
[31m-["body: [nil]\n","body: [nil]\n"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: set empty request body in file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: [", ngx.req.get_body_data(), "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hello, world"][m
[31m---- response_body eval[m
[31m-["body: [nil]\n","body: [nil]\n"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: read and set body[m
[31m---- config[m
[31m-    location /test {[m
[31m-        lua_need_request_body on;[m
[31m-        access_by_lua_file html/myscript.lua;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> myscript.lua[m
[31m-    local data, data2 = ngx.req.get_post_args(), {}[m
[31m-    for k, v in pairs(data) do[m
[31m-        if type(v) == "table" then[m
[31m-            for i, val in ipairs(v) do[m
[31m-                local s = ngx.escape_uri(string.upper(k)) .. '='[m
[31m-                        .. ngx.escape_uri(string.upper(val))[m
[31m-                table.insert(data2, s)[m
[31m-            end[m
[31m-        else[m
[31m-            local s = ngx.escape_uri(string.upper(k)) .. '='[m
[31m-                    .. ngx.escape_uri(string.upper(v))[m
[31m-            table.insert(data2, s)[m
[31m-        end[m
[31m-    end[m
[31m-    ngx.req.set_body_data(table.concat(data2, "&"))[m
[31m---- request[m
[31m-POST /test[m
[31m-a=1&a=2&b=hello&c=world[m
[31m---- response_body[m
[31m-B=HELLO&A=1&A=2&C=WORLD[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: read buffered body to memory and reset it with data in memory + proxy twice[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear dear friend!")[m
[31m-            ngx.req.set_body_data("howdy, my dear little sister!")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body chomp[m
[31m-howdy, my dear little sister![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: read buffered body to memory and reset it with data in memory and then reset it to file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear dear friend!")[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-howdy, my dear little sister![m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-howdy, my dear little sister![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: read buffered body to memory and reset it with empty string + proxy twice[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear dear friend!")[m
[31m-            ngx.req.set_body_data("")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body chomp[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: multi-buffer request body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store POST /store;[m
[31m-[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        content_by_lua '[m
[31m-            local body = ngx.req.get_body_data()[m
[31m-            ngx.log(ngx.WARN, "srcache_store: request body len: ", #body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- error_log[m
[31m-srcache_store: request body len: 55[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: init & append & finish (just in buffer)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_write_request_body) {[m
[31m-    b = ngx_chain_buf($body)[m
[31m-    println("buf: ", b,[m
[31m-        ", in-mem: ", ngx_buf_in_memory(b),[m
[31m-        ", size: ", ngx_buf_size(b),[m
[31m-        ", data: ", ngx_buf_data(b))[m
[31m-}[m
[31m---- response_body[m
[31m-content length: 4[m
[31m-body: hell[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: init & append & finish (exceeding the buffer size)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.append_body("o")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-            local file = ngx.req.get_body_file()[m
[31m-            if not file then[m
[31m-                ngx.say("body file: ", file)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f, err = io.open(file, "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open file: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = f:read("*a")[m
[31m-            f:close()[m
[31m-            ngx.say("body file: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_write_request_body) {[m
[31m-    b = ngx_chain_buf($body)[m
[31m-    println("buf: ", b,[m
[31m-        ", in-mem: ", ngx_buf_in_memory(b),[m
[31m-        ", size: ", ngx_buf_size(b),[m
[31m-        ", data: ", ngx_buf_data(b))[m
[31m-}[m
[31m-F(ngx_open_tempfile) {[m
[31m-    println("open temp file ", user_string($name), ", persist: ", $persistent)[m
[31m-}[m
[31m-F(ngx_pool_delete_file) {[m
[31m-    println("delete ", ngx_pool_cleanup_file_name($data))[m
[31m-}[m
[31m---- response_body[m
[31m-content length: 5[m
[31m-body: nil[m
[31m-body file: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: init & append & finish (use default buffer size) - body not read yet[m
[31m---- config[m
[31m-    location /t {[m
[31m-        client_body_buffer_size 4;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.init_body()[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/lua entry thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):2: request body not read yet/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: init & append & finish (use default buffer size)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        client_body_buffer_size 4;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body()[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-content length: 4[m
[31m-body: hell[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: init & append & finish (exceeding the buffer size, proxy)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.append_body("o\\n")[m
[31m-            ngx.req.finish_body()[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-i do like the sky[m
[31m-[m
[31m---- stap[m
[31m-global valid = 0[m
[31m-[m
[31m-F(ngx_http_handler) { valid = 1  }[m
[31m-[m
[31m-probe syscall.unlink {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(name, "(", argstr, ")")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-^unlink\(".*?client_body_temp/\d+"\)$[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: init & append & finish (just in buffer, proxy)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.finish_body()[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-i do like the sky[m
[31m---- response_body chop[m
[31m-hell[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: init & append & finish (exceeding buffer size, discard on-disk buffer)[m
[31m---- config[m
[31m-    client_header_buffer_size 100;[m
[31m-    location /t {[m
[31m-        client_body_buffer_size 4;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            -- ngx.say("original body: ", ngx.req.get_body_data())[m
[31m-            -- ngx.say("original body file: ", ngx.req.get_body_file())[m
[31m-[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.append_body("o")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-            local file = ngx.req.get_body_file()[m
[31m-            if not file then[m
[31m-                ngx.say("body file: ", file)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f, err = io.open(file, "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open file: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = f:read("*a")[m
[31m-            f:close()[m
[31m-            ngx.say("body file: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-" . ("howdyworld" x 15)[m
[31m---- stap[m
[31m-/*[m
[31m-F(ngx_http_read_client_request_body) { T() }[m
[31m-M(http-read-body-abort) { println("read body aborted: ", user_string($arg2)) }[m
[31m-M(http-read-req-header-done) { println("req header: ", ngx_table_elt_key($arg2), ": ", ngx_table_elt_value($arg2)) }[m
[31m-#probe syscall.open { if (isinstr(argstr, "temp")) { println(name, ": ", argstr) } }[m
[31m-[m
[31m-probe syscall.unlink {[m
[31m-    println(name, ": ", argstr, " :", target(), " == ", pid(), ": ", execname())[m
[31m-    system(sprintf("ps aux|grep %d|grep -v grep > /dev/stderr", target()))[m
[31m-    system(sprintf("ps aux|grep %d|grep -v grep  > /dev/stderr", pid()))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-global valid = 0[m
[31m-[m
[31m-F(ngx_http_handler) { valid = 1  }[m
[31m-#F(ngx_http_free_request) { valid = 0 }[m
[31m-[m
[31m-probe syscall.unlink {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(name, "(", argstr, ")")[m
[31m-        #print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-probe syscall.close, syscall.open, syscall.unlink {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        print(name, "(", argstr, ")")[m
[31m-        #print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.close.return, syscall.open.return, syscall.unlink.return {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(" = ", retstr)[m
[31m-    }[m
[31m-}[m
[31m-*/[m
[31m---- stap_out_like chop[m
[31m-^unlink\(".*?client_body_temp/\d+"\)[m
[31m-unlink\(".*?client_body_temp/\d+"\)$[m
[31m---- response_body[m
[31m-content length: 5[m
[31m-body: nil[m
[31m-body file: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: ngx.req.socket + init & append & finish (requests)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        client_body_buffer_size 1;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-        content_by_lua '[m
[31m-            local sock,err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.init_body(100)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err = sock:receive(1)[m
[31m-                if not data then[m
[31m-                    if err == "closed" then[m
[31m-                        break[m
[31m-                    else[m
[31m-                        ngx.say("failed to read body: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-                ngx.req.append_body(data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello, my dear friend![m
[31m---- response_body[m
[31m-content length: 22[m
[31m-body: hello, my dear friend![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: ngx.req.socket + init & append & finish (pipelined requests, small buffer size)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        client_body_buffer_size 1;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-        content_by_lua '[m
[31m-            local sock,err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.init_body(100)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err = sock:receive(1)[m
[31m-                if not data then[m
[31m-                    if err == "closed" then[m
[31m-                        break[m
[31m-                    else[m
[31m-                        ngx.say("failed to read body: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-                ngx.req.append_body(data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello, my dear friend!",[m
[31m-"POST /t[m
[31m-blah blah blah"][m
[31m---- response_body eval[m
[31m-["content length: 22[m
[31m-body: hello, my dear friend![m
[31m-","content length: 14[m
[31m-body: blah blah blah[m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: ngx.req.socket + init & append & finish (pipelined requests, big buffer size)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        client_body_buffer_size 100;[m
[31m-        lua_socket_buffer_size 100;[m
[31m-        content_by_lua '[m
[31m-            local sock,err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.init_body(100)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(100)[m
[31m-                if not data then[m
[31m-                    if err == "closed" then[m
[31m-                        ngx.req.append_body(partial)[m
[31m-                        break[m
[31m-                    else[m
[31m-                        ngx.say("failed to read body: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-                ngx.req.append_body(data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello, my dear friend!",[m
[31m-"POST /t[m
[31m-blah blah blah"][m
[31m---- response_body eval[m
[31m-["content length: 22[m
[31m-body: hello, my dear friend![m
[31m-","content length: 14[m
[31m-body: blah blah blah[m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: calling ngx.req.socket after ngx.req.read_body[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        client_body_buffer_size 100;[m
[31m-        lua_socket_buffer_size 100;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello, my dear friend![m
[31m---- response_body[m
[31m-failed to get req socket: request body already exists[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: failed to write 100 continue[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-http finalize request: 500, "/test?" a:1, c:0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: chunked support in ngx.req.read_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-5\r[m
[31m-hello\r[m
[31m-1\r[m
[31m-,\r[m
[31m-1\r[m
[31m- \r[m
[31m-5\r[m
[31m-world\r[m
[31m-0\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- skip_nginx: 4: <1.3.9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: zero size request body and reset it to a new file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        client_body_in_file_only on;[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-            ngx.var.new = ngx.req.get_body_file()[m
[31m-        ';[m
[31m-        #echo_request_body;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        #proxy_pass http://127.0.0.1:7890/echo;[m
[31m-        add_header X-Old $old;[m
[31m-        add_header X-New $new;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m-[m
[31m---- stap[m
[31m-probe syscall.fcntl {[m
[31m-    O_DIRECT = 0x4000[m
[31m-    if (pid() == target() && ($arg & O_DIRECT)) {[m
[31m-        println("fcntl(O_DIRECT)")[m
[31m-    }[m
[31m-}[m
[31m---- stap_out_unlike[m
[31m-fcntl\(O_DIRECT\)[m
[31m-[m
[31m---- raw_response_headers_like[m
[31m-.*?X-New: \S+/html/a\.txt\r[m
[31m---- response_body[m
[31m-Will you change this world?[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: not discard body (content_by_lua exit 200)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: not discard body (content_by_lua exit 201)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: not discard body (content_by_lua exit 302)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            -- ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.redirect("/blah")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-[qr/302 Found/,[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[302, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: not discard body (custom error page)[m
[31m---- config[m
[31m-    error_page 404 = /err;[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /err {[m
[31m-        content_by_lua 'ngx.say("error")';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /foo[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["error\n",[m
[31m-"error\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[404, 404][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: get body data at log phase[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        }[m
[31m-        log_by_lua_block {[m
[31m-            ngx.log(ngx.WARN, "request body:", ngx.req.get_body_data())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- error_log[m
[31m-request body:hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: init & append & finish (content_length = 0)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local old_http_content_length = ngx.var.http_content_length[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body()[m
[31m-            ngx.req.append_body("he")[m
[31m-            ngx.req.append_body("llo")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("old content length: ", old_http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            local data_file = ngx.req.get_body_file()[m
[31m-[m
[31m-            if not data and data_file then[m
[31m-                ngx.say("no data in buf, go to data file")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Content-Length: 0[m
[31m---- response_body[m
[31m-old content length: 0[m
[31m-content length: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: init & append & finish (init_body(0))[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local old_http_content_length = ngx.var.http_content_length[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(0)[m
[31m-            ngx.req.append_body("he")[m
[31m-            ngx.req.append_body("llo")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("old content length: ", old_http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            local data_file = ngx.req.get_body_file()[m
[31m-[m
[31m-            if not data and data_file then[m
[31m-                ngx.say("no data in buf, go to data file")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Content-Length: 0[m
[31m---- response_body[m
[31m-old content length: 0[m
[31m-no data in buf, go to data file[m
[31m-content length: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: init & append & finish (client_body_buffer_size = 0)[m
[31m---- http_config[m
[31m-    client_body_buffer_size 0;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body()[m
[31m-            ngx.req.append_body("he")[m
[31m-            ngx.req.append_body("llo")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            local data_file = ngx.req.get_body_file()[m
[31m-[m
[31m-            if not data and data_file then[m
[31m-                ngx.say("no data in buf, go to data file")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-no data in buf, go to data file[m
[31m-content length: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/045-ngx-var.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/045-ngx-var.t[m
[1mdeleted file mode 100644[m
[1mindex 8f2dcb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/045-ngx-var.t[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 7);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set indexed variables to nil[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $var 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("old: ", ngx.var.var)[m
[31m-            ngx.var.var = nil[m
[31m-            ngx.say("new: ", ngx.var.var)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-old: 32[m
[31m-new: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set variables with set_handler to nil[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("old: ", ngx.var.args)[m
[31m-            ngx.var.args = nil[m
[31m-            ngx.say("new: ", ngx.var.args)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?hello=world[m
[31m---- response_body[m
[31m-old: hello=world[m
[31m-new: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: reference nonexistent variable[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $var 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("value: ", ngx.var.notfound)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-value: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: no-hash variables[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-My-Host"] = ngx.var.proxy_host[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_headers[m
[31m-X-My-Host: foo[m
[31m---- response_body[m
[31m-foo[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variable name is caseless[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $Var 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("value: ", ngx.var.VAR)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-value: 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: true $invalid_referer variable value in Lua[m
[31m-github issue #239[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        valid_referers www.foo.com;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("invalid referer: ", ngx.var.invalid_referer)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-        #echo $invalid_referer;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Referer: http://www.foo.com/[m
[31m-[m
[31m---- response_body[m
[31m-invalid referer: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: false $invalid_referer variable value in Lua[m
[31m-github issue #239[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        valid_referers www.foo.com;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("invalid referer: ", ngx.var.invalid_referer)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-        #echo $invalid_referer;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Referer: http://www.bar.com[m
[31m-[m
[31m---- response_body[m
[31m-invalid referer: 1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: $proxy_host & $proxy_port[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["Proxy-Host"] = ngx.var.proxy_host[m
[31m-            ngx.header["Proxy-Port"] = ngx.var.proxy_port[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- raw_response_headers_like[m
[31m-Proxy-Host: 127.0.0.1\:\d+\r[m
[31m-Proxy-Port: \d+\r[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get a bad variable name[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $true 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("value: ", ngx.var[true])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad variable name[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set a bad variable name[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $true 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.var[true] = 56[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad variable name[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set a variable that is not changeable[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.var.query_string = 56[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?hello[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-variable "query_string" not changeable[m
[31m---- error_code: 500[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/046-hmac.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/046-hmac.t[m
[1mdeleted file mode 100644[m
[1mindex 686b479..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/046-hmac.t[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local digest = ngx.hmac_sha1("thisisverysecretstuff", "some string we want to sign")[m
[31m-            ngx.say(ngx.encode_base64(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-R/pvxzHC4NLtj7S+kXFg/NePTmk=[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/047-match-jit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/047-match-jit.t[m
[1mdeleted file mode 100644[m
[1mindex 077ebb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/047-match-jit.t[m
[1m+++ /dev/null[m
[36m@@ -1,215 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 5);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "j")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, world", "([0-9]+)", "j")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "jo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, world", "([0-9]+)", "jo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.match("hello\\nworld", "(abc", "j")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 2940;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 21)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, err = ngx.re.match(s, re, "jo")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 2950;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 21)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, err = ngx.re.match(s, re, "jo")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-failed to match[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/048-match-dfa.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/048-match-dfa.t[m
[1mdeleted file mode 100644[m
[1mindex 8a0a328..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/048-match-dfa.t[m
[1m+++ /dev/null[m
[36m@@ -1,210 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello", "(he|hell)", "d")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: matched with d + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello", "(he|hell)", "do")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with d + j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello", "(he|hell)", "jd")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("world", "(he|hell)", "d")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello", "he|hell", "do")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: not matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("world", "([0-9]+)", "do")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("你好", ".", "Ud")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("你好", ".", "ud")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/049-gmatch-jit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/049-gmatch-jit.t[m
[1mdeleted file mode 100644[m
[1mindex 614c440..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/049-gmatch-jit.t[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 9);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: gmatch matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, world", "[a-z]+", "j") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: fail to match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]", "j")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: gmatch matched but no iterate[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "j")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: gmatch matched but only iterate once and still matches remain[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "j")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: gmatch matched + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, world", "[a-z]+", "jo") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: fail to match + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]", "jo")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: gmatch matched but no iterate + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "jo")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: gmatch matched but only iterate once and still matches remain + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "jo")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.gmatch("hello\\nworld", "(abc", "j")[m
[31m-            if not m then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("success")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/050-gmatch-dfa.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/050-gmatch-dfa.t[m
[1mdeleted file mode 100644[m
[1mindex d2ac2bc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/050-gmatch-dfa.t[m
[1m+++ /dev/null[m
[36m@@ -1,338 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 5);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: gmatch matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, halo", "h[a-z]|h[a-z][a-z]", "d") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                    ngx.say(m[1])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hel[m
[31m-nil[m
[31m-hal[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: d + j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, halo", "h[a-z]|h[a-z][a-z]", "dj") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hel[m
[31m-hal[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: fail to match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]", "d")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: gmatch matched but no iterate[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "d")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: gmatch matched but only iterate once and still matches remain[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "d")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: gmatch matched + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, world", "[a-z]+", "do") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: fail to match + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]", "do")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: gmatch matched but no iterate + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "do")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: gmatch matched but only iterate once and still matches remain + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "do")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it, err = ngx.re.gmatch("hello\\nworld", "(abc", "d")[m
[31m-            if not it then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("success")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("你好", ".", "Ud")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("你好", ".", "ud")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: gmatched with submatch captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in  ngx.re.gmatch("hello", "(he|hell)", "d") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                    ngx.say(m[1])[m
[31m-                    ngx.say(m[2])[m
[31m-                else[m
[31m-                    ngx.say("not matched!")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: gmatched with submatch captures (compile once)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in  ngx.re.gmatch("hello", "(he|hell)", "od") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                    ngx.say(m[1])[m
[31m-                    ngx.say(m[2])[m
[31m-                else[m
[31m-                    ngx.say("not matched!")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/051-sub-jit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/051-sub-jit.t[m
[1mdeleted file mode 100644[m
[1mindex 789e897..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/051-sub-jit.t[m
[1m+++ /dev/null[m
[36m@@ -1,150 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 6);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234 5678", "([0-9]+)", "world", "j")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world 5678: 1[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[0-9]+", "hiya", "j")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234 5678", "([0-9]+)", "world", "jo")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world 5678: 1[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[0-9]+", "hiya", "jo")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("hello\\nworld", "(abc", "world", "j")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad pattern + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub( "hello\\nworld", "(abc", "world", "jo")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/052-sub-dfa.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/052-sub-dfa.t[m
[1mdeleted file mode 100644[m
[1mindex 254913b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/052-sub-dfa.t[m
[1m+++ /dev/null[m
[36m@@ -1,235 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 8);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234 5678", "[0-9]|[0-9][0-9]", "world", "d")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world34 5678: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[0-9]+", "hiya", "d")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234 5678", "[0-9]|[0-9][0-9]", "world", "do")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world34 5678: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[0-9]+", "hiya", "do")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("hello\\nworld", "(abc", "world", "j")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad pattern + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("hello\\nworld", "(abc", "world", "jo")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("你好", ".", "a", "Ud")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: a好[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("你好", ".", "a", "ud")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: a好[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sub with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.re.sub("hello", "(he|hell)", function (m) ngx.say(m[0]) ngx.say(m[1]) return "x" end, "d"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-xo1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sub with d + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.re.sub("hello", "(he|hell)", function (m) ngx.say(m[0]) ngx.say(m[1]) return "x" end, "do"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-xo1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/053-gsub-jit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/053-gsub-jit.t[m
[1mdeleted file mode 100644[m
[1mindex 3a2a1aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/053-gsub-jit.t[m
[1m+++ /dev/null[m
[36m@@ -1,150 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 6);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, 1234 5678", "([0-9]+)", "world", "j")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world world: 2[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[0-9]+", "hiya", "j")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, 1234 5678", "([0-9]+)", "world", "jo")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world world: 2[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[0-9]+", "hiya", "jo")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("hello\\nworld", "(abc", "world", "j")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad pattern + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("hello\\nworld", "(abc", "world", "jo")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/054-gsub-dfa.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/054-gsub-dfa.t[m
[1mdeleted file mode 100644[m
[1mindex 937aa1c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/054-gsub-dfa.t[m
[1m+++ /dev/null[m
[36m@@ -1,236 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 7);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, 1234 5678", "[0-9]|[0-9][0-9]", "world", "d")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, worldworld worldworld: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[0-9]+", "hiya", "d")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, 1234 5678", "[0-9]|[0-9][0-9]", "world", "do")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, worldworld worldworld: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[0-9]+", "hiya", "do")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("hello\\nworld", "(abc", "world", "j")[m
[31m-            if s then[m
[31m-                ngx.say("gsub: ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad pattern + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("hello\\nworld", "(abc", "world", "jo")[m
[31m-            if s then[m
[31m-                ngx.say("gsub: ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("你好", ".", "a", "Ud")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-exec opts: 2000[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: aa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("你好", ".", "a", "ud")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-exec opts: 0[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: aa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: gsub with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.re.gsub("hello", "(he|hell)", function (m) ngx.say(m[0]) ngx.say(m[1]) return "x" end, "d"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-xo1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: gsub with d + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.re.gsub("hello", "(he|hell)", function (m) ngx.say(m[0]) ngx.say(m[1]) return "x" end, "do"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-xo1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/055-subreq-vars.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/055-subreq-vars.t[m
[1mdeleted file mode 100644[m
[1mindex 2fc6960..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/055-subreq-vars.t[m
[1m+++ /dev/null[m
[36m@@ -1,339 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set non-existent variables via "vars" option[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { dog = "hello", cat = 32 }});[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- stap2[m
[31m-[m
[31m-global delta = "  "[m
[31m-[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    uri = ngx_http_req_uri($r)[m
[31m-    printf("finalize req %s: %d\n", uri, $rc)[m
[31m-    if ($rc == 500) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    uri = ngx_http_req_uri($r)[m
[31m-    printf("lua run thread %s\n", uri)[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-start) {[m
[31m-    r = $arg1[m
[31m-    n = ngx_http_subreq_depth(r)[m
[31m-    pr = ngx_http_req_parent(r)[m
[31m-    printf("%sbegin %s -> %s (%d)\n", ngx_indent(n, delta),[m
[31m-        ngx_http_req_uri(pr),[m
[31m-        ngx_http_req_uri(r),[m
[31m-        n)[m
[31m-}[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log eval[m
[31m-qr/variable "(dog|cat)" cannot be assigned a value \(maybe you forgot to define it first\?\)/[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set non-existent variables via "vars" option[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog '';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { dog = "hello", cat = 32 }});[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log chop[m
[31m-variable "cat" cannot be assigned a value (maybe you forgot to define it first?)[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: good "vars" option: user variables[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog '';[m
[31m-        set $cat '';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { dog = "hello", cat = 32 }});[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-dog = hello[m
[31m-cat = 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad "vars" option value[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog '';[m
[31m-        set $cat '';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log chop[m
[31m-Bad vars option value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad "vars" option value value[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog '';[m
[31m-        set $cat '';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { cat = true } });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log chop[m
[31m-attempt to use bad variable value type boolean[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: good "vars" option: builtin variables[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "args: $args";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { args = "a=hello&b=32" }});[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-args: a=hello&b=32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: setting non-changeable vars[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "query string: $query_string";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { query_string = "hello" } });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log chop[m
[31m-variable "query_string" not changeable[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: copy all vars[m
[31m---- config[m
[31m-    location /other {[m
[31m-        set $dog "$dog world";[m
[31m-        echo "$uri dog: $dog";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'hello';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { copy_all_vars = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say(ngx.var.uri, ": ", ngx.var.dog)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/other dog: hello world[m
[31m-/lua: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: share all vars[m
[31m---- config[m
[31m-    location /other {[m
[31m-        set $dog "$dog world";[m
[31m-        echo "$uri dog: $dog";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'hello';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { share_all_vars = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say(ngx.var.uri, ": ", ngx.var.dog)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/other dog: hello world[m
[31m-/lua: hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: vars takes priority over copy_all_vars[m
[31m---- config[m
[31m-    location /other {[m
[31m-        set $dog "$dog world";[m
[31m-        echo "$uri dog: $dog";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'hello';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { dog = "hiya" }, copy_all_vars = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say(ngx.var.uri, ": ", ngx.var.dog)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/other dog: hiya world[m
[31m-/lua: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: capture_multi: good "vars" option: user variables[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'blah';[m
[31m-        set $cat 'foo';[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/other/1",[m
[31m-                    { vars = { dog = "hello", cat = 32 }}[m
[31m-                },[m
[31m-                {"/other/2",[m
[31m-                    { vars = { dog = "hiya", cat = 56 }}[m
[31m-                }[m
[31m-            };[m
[31m-[m
[31m-            ngx.print(res1.body)[m
[31m-            ngx.print(res2.body)[m
[31m-            ngx.say("parent dog: ", ngx.var.dog)[m
[31m-            ngx.say("parent cat: ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-dog = hello[m
[31m-cat = 32[m
[31m-dog = hiya[m
[31m-cat = 56[m
[31m-parent dog: blah[m
[31m-parent cat: foo[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/056-flush.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/056-flush.t[m
[1mdeleted file mode 100644[m
[1mindex d189cd5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/056-flush.t[m
[1m+++ /dev/null[m
[36m@@ -1,523 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    $ENV{TEST_NGINX_POSTPONE_OUTPUT} = 1;[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 60;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush wait - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua reuse free buf chain, but reallocate memory because 5 >= 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: flush no wait - content[m
[31m---- config[m
[31m-    send_timeout 500ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(false)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: flush wait - rewrite[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush no wait - rewrite[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: http 1.0 (sync)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-Content-Length: 23[m
[31m---- timeout: 5[m
[31m---- error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: http 1.0 (async)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(false)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "1: failed to flush: ", err)[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-            local ok, err = ngx.flush(false)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "2: failed to flush: ", err)[m
[31m-            end[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-Content-Length: 23[m
[31m---- error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m-1: failed to flush: buffering[m
[31m-2: failed to flush: buffering[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush wait - big data[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(string.rep("a", 1024 * 64))[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: flush wait - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.flush(true)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: http 1.0 (sync + buffering off)[m
[31m---- config[m
[31m-    lua_http10_buffering off;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: http 1.0 (async)[m
[31m---- config[m
[31m-    lua_http10_buffering on;[m
[31m-    location /test {[m
[31m-        lua_http10_buffering off;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- no_error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: http 1.0 (sync) - buffering explicitly off[m
[31m---- config[m
[31m-    location /test {[m
[31m-        lua_http10_buffering on;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-Content-Length: 23[m
[31m---- timeout: 5[m
[31m---- error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: http 1.0 (async) - buffering explicitly off[m
[31m---- config[m
[31m-    location /test {[m
[31m-        lua_http10_buffering on;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-Content-Length: 23[m
[31m---- error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush wait in a user coroutine[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello, world")[m
[31m-                ngx.flush(true)[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("hiya")[m
[31m-            end[m
[31m-            local c = coroutine.create(f)[m
[31m-            ngx.say(coroutine.resume(c))[m
[31m-            ngx.say(coroutine.resume(c))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap2[m
[31m-F(ngx_http_lua_wev_handler) {[m
[31m-    printf("wev handler: wev:%d\n", $r->connection->write->ready)[m
[31m-}[m
[31m-[m
[31m-global ids, cur[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    delete ids[m
[31m-    cur = 0[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    id = gen_id($ctx->cur_co)[m
[31m-    printf("run thread %d\n", id)[m
[31m-}[m
[31m-[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("lua resume %d\n", id)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-resume) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("resume %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-entry-coroutine-yield) {[m
[31m-    println("entry coroutine yield")[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_coroutine_yield) {[m
[31m-    printf("yield %x\n", gen_id($L))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-yield) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("yield %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_atpanic) {[m
[31m-    printf("lua atpanic(%d):", gen_id($L))[m
[31m-    print_ubacktrace();[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exec) { println("exec") }[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) { println("exit") }[m
[31m-[m
[31m-F(ngx_http_writer) { println("http writer") }[m
[31m-[m
[31m---- response_body[m
[31m-hello, world[m
[31m-true[m
[31m-hiya[m
[31m-true[m
[31m---- error_log[m
[31m-lua reuse free buf memory 13 >= 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: flush before sending out the header[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.flush()[m
[31m-            ngx.status = 404[m
[31m-            ngx.say("not found")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not found[m
[31m---- error_code: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: flush wait - gzip[m
[31m---- config[m
[31m-    gzip             on;[m
[31m-    gzip_min_length  1;[m
[31m-    gzip_types       text/plain;[m
[31m-[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- response_body_like: .{15}[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush wait - gunzip[m
[31m---- config[m
[31m-    location /test {[m
[31m-        gunzip on;[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open(ngx.var.document_root .. "/gzip.bin", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open file: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local data = f:read(100)[m
[31m-            ngx.header.content_encoding = "gzip"[m
[31m-            ngx.print(data)[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            data = f:read("*a")[m
[31m-            ngx.print(data)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files eval[m
[31m-">>> gzip.bin[m
[31m-\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x62\x64\x62\x62\x61\x62\x64\x63\x61\xe4\xe0\xe2\xe6\xe4\x61\xe4\xe4\xe7\x63\x12\xe4\xe1\xe0\x60\x14\x12\xe3\x91\xe4\xe4\xe4\x13\x60\xe3\x95\x12\x90\x15\xe0\x11\x50\x92\xd1\x16\x17\xe2\xd3\x17\x14\x11\x95\x95\x57\x96\x63\x37\xd2\x36\xd6\x51\x34\xb1\xe6\x62\x17\x95\xb0\x77\x60\xe3\x96\x33\x95\xb6\x91\x75\x97\x30\xe4\x66\x0c\xd0\xe3\xe0\xb5\xd3\x33\xf6\x90\x16\xb2\x90\x77\x56\x31\xe7\x55\x32\x11\x74\xe0\x02\x00\x00\x00\xff\xff\xcb\xc8\xac\x4c\xe4\x02\x00\x19\x15\xa9\x77\x6a\x00\x00\x00"[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: limit_rate[m
[31m---- config[m
[31m-    location /test {[m
[31m-        limit_rate 150;[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            for i = 1, 2 do[m
[31m-                ngx.print(string.rep("a", 100))[m
[31m-                local ok, err = ngx.flush(true)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to flush: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            local elapsed = ngx.now() - begin[m
[31m-            ngx.log(ngx.WARN, "lua writes elapsed ", elapsed, " sec")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-"a" x 200[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/lua writes elapsed [12](?:\.\d+)? sec/,[m
[31m-qr/lua flush requires waiting: buffered 0x[0-9a-f]+, delayed:1/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 4[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/057-flush-timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/057-flush-timeout.t[m
[1mdeleted file mode 100644[m
[1mindex d6e0f86..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/057-flush-timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,321 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'hello, world';[m
[31m-    $ENV{TEST_NGINX_POSTPONE_OUTPUT} = 1;[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 17;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush wait - timeout[m
[31m---- config[m
[31m-    send_timeout 100ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/client timed out \(\d+: .*?timed out\)/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: send timeout timer got removed in time[m
[31m---- config[m
[31m-    send_timeout 1234ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(string.rep("blah blah blah", 10))[m
[31m-            -- ngx.flush(true)[m
[31m-            ngx.eof()[m
[31m-            for i = 1, 20 do[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global evtime[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    delete evtime[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1234) {[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-        evtime[$arg1] = $arg2[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    time = evtime[$arg1][m
[31m-    if (time == 1234) {[m
[31m-        printf("del timer %d\n", time)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    time = evtime[$arg1][m
[31m-    if (time == 1234) {[m
[31m-        printf("expire timer %d\n", time)[m
[31m-        #print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-/*[m
[31m-probe syscall.writev.return {[m
[31m-    if (pid() == target()) {[m
[31m-        printf("writev: %s\n", retstr)[m
[31m-    }[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-add timer 1234[m
[31m-del timer 1234[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit in user thread (entry thread is still pending on ngx.flush)[m
[31m---- config[m
[31m-    send_timeout 200ms;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.say("hello, world!")[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request: c:%d, a:%d, cb:%d, rb:%d\n", $r->main->count,[m
[31m-        $r == $r->connection->data, $r->connection->buffered, $r->buffered)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_set_write_handler) {[m
[31m-    println("set write handler")[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-F(ngx_http_lua_flush_cleanup) {[m
[31m-    println("lua flush cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua flush cleanup[m
[31m-delete timer 200[m
[31m-delete thread 1[m
[31m-add timer 200[m
[31m-expire timer 200[m
[31m-free request[m
[31m-[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush wait - return "timeout" error[m
[31m---- config[m
[31m-    send_timeout 100ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to flush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/client timed out \(\d+: .*?timed out\)/,[m
[31m-'failed to flush: timeout',[m
[31m-][m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: flush wait in multiple user threads - return "timeout" error[m
[31m---- config[m
[31m-    send_timeout 100ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-[m
[31m-            local function run(tag)[m
[31m-                local ok, err = ngx.flush(true)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "thread ", tag, ": failed to flush: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("hiya")[m
[31m-            end[m
[31m-[m
[31m-            local function new_thread(tag)[m
[31m-                local ok, err = ngx.thread.spawn(run, tag)[m
[31m-                if not ok then[m
[31m-                    return error("failed to spawn thread: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            new_thread("A")[m
[31m-            new_thread("B")[m
[31m-            run("main")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/client timed out \(\d+: .*?timed out\)/,[m
[31m-'thread main: failed to flush: timeout',[m
[31m-'thread A: failed to flush: timeout',[m
[31m-'thread B: failed to flush: timeout',[m
[31m-][m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: flush wait - client abort connection prematurely[m
[31m---- config[m
[31m-    #send_timeout 100ms;[m
[31m-    location /test {[m
[31m-        limit_rate 2;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, lua")[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to flush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/writev\(\) failed .*? Broken pipe/i,[m
[31m-qr/failed to flush: client aborted/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/058-tcp-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/058-tcp-socket.t[m
[1mdeleted file mode 100644[m
[1mindex acf69f0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/058-tcp-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,3642 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 187;[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no trailing newline[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 1234;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            sock:close()[m
[31m-            ngx.say("closed")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.print("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 3[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-failed to receive a line: closed [foo][m
[31m-closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no resolver defined[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 1234;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: no resolver defined to resolve "agentzh.org"[m
[31m-connected: nil[m
[31m-failed to send request: closed[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: with resolver[m
[31m---- timeout: 10[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("first line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive the first line: ", err)[m
[31m-            end[m
[31m-[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("second line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive the second line: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 56[m
[31m-first line received: HTTP/1.1 200 OK[m
[31m-second line received: Server: openresty[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: connection refused (tcp)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil connection refused[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: connection timeout (tcp)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil timeout[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not closed manually[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: resolver error (host not found)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)[m
[31m-            print("connected: ", ok, " ", err, " ", not ok)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(3: Host not found\))?[m
[31m-connected: nil[m
[31m-failed to send request: closed$[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: resolver error (timeout)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 1ms;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)[m
[31m-            print("connected: ", ok, " ", err, " ", not ok)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(\d+: (?:Operation timed out|Host not found)\))?[m
[31m-connected: nil[m
[31m-failed to send request: closed$[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: explicit *l pattern for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err = sock:receive("*l")[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: *a pattern for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err = sock:receive("*a")[m
[31m-            if data then[m
[31m-                ngx.say("receive: ", data)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-receive: HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-foo[m
[31m-[m
[31m-err: nil[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: mixing *a and *l patterns for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive("*l")[m
[31m-            if line then[m
[31m-                ngx.say("receive: ", line)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local data[m
[31m-            data, err = sock:receive("*a")[m
[31m-            if data then[m
[31m-                ngx.say("receive: ", data)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-receive: HTTP/1.1 200 OK[m
[31m-err: nil[m
[31m-receive: Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-foo[m
[31m-[m
[31m-err: nil[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: receive by chunks[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(10)[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: receive by chunks (very small buffer)[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(10)[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: line reading (very small buffer)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.socket.connect (working)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-            local sock, err = ngx.socket.connect("127.0.0.1", port)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected.")[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected.[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.socket.connect() shortcut (connection refused)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local sock, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m-[m
[31m---- stap2[m
[31m-M(http-lua-info) {[m
[31m-    printf("tcp resume: %p\n", $coctx)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-failed to connect: connection refused[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: receive by chunks (stringified size)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive("10")[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: cannot survive across request boundary (send)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-"^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to send request: closed)\$"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: cannot survive across request boundary (receive)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local line, err, part = sock:receive()[m
[31m-        if line then[m
[31m-            ngx.say("received: ", line)[m
[31m-[m
[31m-        else[m
[31m-            ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- stap2[m
[31m-M(http-lua-info) {[m
[31m-    printf("tcp resume\n")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to receive a line: closed \[nil\])$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: cannot survive across request boundary (close)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local ok, err = sock:close()[m
[31m-        if ok then[m
[31m-            ngx.say("successfully closed")[m
[31m-[m
[31m-        else[m
[31m-            ngx.say("failed to close: ", err)[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to close: closed)$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: cannot survive across request boundary (connect)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect again: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected again: ", ok)[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected(?: again)?: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-){2}$/[m
[31m---- error_log[m
[31m-lua reuse socket upstream ctx[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: connect again immediately[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected again: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-connected again: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua reuse socket upstream", "lua tcp socket reconnect without shutting down"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: two sockets mix together[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port1 $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        set $port2 $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock1 = ngx.socket.tcp()[m
[31m-            local sock2 = ngx.socket.tcp()[m
[31m-[m
[31m-            local port1 = ngx.var.port1[m
[31m-            local port2 = ngx.var.port2[m
[31m-[m
[31m-            local ok, err = sock1:connect("127.0.0.1", port1)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock2:connect("127.0.0.1", port2)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: connected: ", ok)[m
[31m-[m
[31m-            local req1 = "flush_all\\r\\n"[m
[31m-            local bytes, err = sock1:send(req1)[m
[31m-            if not bytes then[m
[31m-                ngx.say("1: failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("1: request sent: ", bytes)[m
[31m-[m
[31m-            local req2 = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            local bytes, err = sock2:send(req2)[m
[31m-            if not bytes then[m
[31m-                ngx.say("2: failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("2: request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock1:receive()[m
[31m-            if line then[m
[31m-                ngx.say("1: received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("1: failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            line, err, part = sock2:receive()[m
[31m-            if line then[m
[31m-                ngx.say("2: received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("2: failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock1:close()[m
[31m-            ngx.say("1: close: ", ok, " ", err)[m
[31m-[m
[31m-            ok, err = sock2:close()[m
[31m-            ngx.say("2: close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: connected: 1[m
[31m-2: connected: 1[m
[31m-1: request sent: 11[m
[31m-2: request sent: 57[m
[31m-1: received: OK[m
[31m-2: received: HTTP/1.1 200 OK[m
[31m-1: close: 1 nil[m
[31m-2: close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: send tables of string fragments[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: send tables of string fragments (bad type "nil")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", nil, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type nil found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: send tables of string fragments (bad type "boolean")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", true, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type boolean found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: send tables of string fragments (bad type ngx.null)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", ngx.null, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type userdata found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: cosocket before location capture (tcpsock:send did not clear u->waiting)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-            local resp = ngx.location.capture("/memc")[m
[31m-            if type(resp) ~= "table" then[m
[31m-                ngx.say("bad resp: type ", type(resp), ": ", resp)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.print("subrequest: ", resp.status, ", ", resp.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m-subrequest: 200, OK\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: CR in a line[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "foo\r\rbar\rbaz";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 13[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foobarbaz[m
[31m-failed to receive a line: closed [][m
[31m-close: nil closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: receive(0)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err, part = sock:receive(0)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive(0): ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("receive(0): [", data, "]")[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-receive(0): [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: send("")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local bytes, err = sock:send("")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("send(\\"\\"): ", bytes)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-send(""): 0[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: github issue #215: Handle the posted requests in lua cosocket api (failed to resolve)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-[m
[31m-    location = /sub {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("xxx", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect to xxx: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("successfully connected to xxx!")[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_resolve_name_done) {[m
[31m-    println("resolve name done")[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-resolve name done[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^failed to connect to xxx: xxx could not be resolved.*?Host not found[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: github issue #215: Handle the posted requests in lua cosocket api (successfully resolved)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-    location = /sub {[m
[31m-        content_by_lua '[m
[31m-            if not package.i then[m
[31m-                package.i = 1[m
[31m-            end[m
[31m-[m
[31m-            local servers = {"openresty.org", "agentzh.org", "sregex.org"}[m
[31m-            local server = servers[package.i][m
[31m-            package.i = package.i + 1[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect(server, 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect to ", server, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("successfully connected to xxx!")[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to xxx![m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_socket_resolve_handler) {[m
[31m-    println("lua socket resolve handler")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_socket_tcp_conn_retval_handler) {[m
[31m-    println("lua socket tcp connect retval handler")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_run_posted_requests) {[m
[31m-    println("run posted requests")[m
[31m-}[m
[31m-[m
[31m---- stap_out_like[m
[31m-run posted requests[m
[31m-lua socket resolve handler[m
[31m-run posted requests[m
[31m-lua socket tcp connect retval handler[m
[31m-run posted requests[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: connection refused (tcp) - lua_socket_log_errors off[m
[31m---- config[m
[31m-    location /test {[m
[31m-        lua_socket_log_errors off;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil connection refused[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- no_error_log eval[m
[31m-[qr/connect\(\) failed \(\d+: Connection refused\)/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: reread after a read time out happen (receive -> receive)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-[m
[31m-                line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: successful reread after a read time out happen (receive -> receive)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("GET /back HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to read the response header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local data, err, partial = sock:receive(100)[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, ", partial: ", partial)[m
[31m-[m
[31m-                sock:settimeout(123)[m
[31m-                ngx.sleep(0.1)[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hi")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.print("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"failed to receive: timeout, partial: 2\r[m
[31m-hi\r[m
[31m-[m
[31m-received: 5[m
[31m-received: world[m
[31m-"[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: successful reread after a read time out happen (receive -> receiveuntil)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("GET /back HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to read the response header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local data, err, partial = sock:receive(100)[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, ", partial: ", partial)[m
[31m-[m
[31m-                ngx.sleep(0.1)[m
[31m-[m
[31m-                sock:settimeout(123)[m
[31m-                local reader = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-                local line, err = reader()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local line, err = reader()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hi")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.print("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"failed to receive: timeout, partial: 2\r[m
[31m-hi\r[m
[31m-[m
[31m-received: 5[m
[31m-received: world[m
[31m-"[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: successful reread after a read time out happen (receiveuntil -> receiveuntil)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("GET /back HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to read the response header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("no-such-terminator")[m
[31m-            local data, err, partial = reader()[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, ", partial: ", partial)[m
[31m-[m
[31m-                ngx.sleep(0.1)[m
[31m-[m
[31m-                sock:settimeout(123)[m
[31m-[m
[31m-                local reader = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-                local line, err = reader()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local line, err = reader()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hi")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.print("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"failed to receive: timeout, partial: 2\r[m
[31m-hi\r[m
[31m-[m
[31m-received: 5[m
[31m-received: world[m
[31m-"[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: successful reread after a read time out happen (receiveuntil -> receive)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("GET /back HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to read the response header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("no-such-terminator")[m
[31m-            local data, err, partial = reader()[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, ", partial: ", partial)[m
[31m-[m
[31m-                ngx.sleep(0.1)[m
[31m-[m
[31m-                sock:settimeout(123)[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hi")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.print("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"failed to receive: timeout, partial: 2\r[m
[31m-hi\r[m
[31m-[m
[31m-received: 5[m
[31m-received: world[m
[31m-"[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: receive(0)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local data, err = sock:receive(0)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-received: [m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: empty options table[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port, {})[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: u->coctx left over bug[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local ready = false[m
[31m-            local fatal = false[m
[31m-[m
[31m-            function f()[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive the 1st line: ", err, " [", part, "]")[m
[31m-                    fatal = true[m
[31m-                    return[m
[31m-                end[m
[31m-                ready = true[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            local st = ngx.thread.spawn(f)[m
[31m-            while true do[m
[31m-                if fatal then[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not ready then[m
[31m-                    ngx.sleep(0.01)[m
[31m-                else[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    -- ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    -- ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-            ngx.exit(0)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.sleep(0.1) ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua clean up the timer for pending ngx.sleep[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: bad request tries to connect[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                test.new_sock()[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            else[m
[31m-                ngx.say("connected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):7: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: bad request tries to receive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:receive()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: bad request tries to send[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:send("a")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: bad request tries to close[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: bad request tries to set keepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:setkeepalive()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: bad request tries to receiveuntil[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            local it, err = sock:receiveuntil("abc")[m
[31m-            if it then[m
[31m-                it()[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):16: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: cosocket resolving aborted by coroutine yielding failures (require)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.myfoo = nil[m
[31m-            require "myfoo"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- user_files[m
[31m->>> myfoo.lua[m
[31m-local sock = ngx.socket.tcp()[m
[31m-local ok, err = sock:connect("agentzh.org")[m
[31m-if not ok then[m
[31m-    ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- wait: 0.3[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-resolve name done[m
[31m-runtime error: attempt to yield across C-call boundary[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: cosocket resolving aborted by coroutine yielding failures (xpcall err)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                return error(1)[m
[31m-            end[m
[31m-            local function err()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("agentzh.org")[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            xpcall(f, err)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- wait: 0.3[m
[31m---- error_log[m
[31m-resolve name done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-could not cancel[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: tcp_nodelay on[m
[31m---- config[m
[31m-    tcp_nodelay on;[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- error_log[m
[31m-lua socket tcp_nodelay[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: tcp_nodelay off[m
[31m---- config[m
[31m-    tcp_nodelay off;[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-lua socket tcp_nodelay[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: IPv6[m
[31m---- http_config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    server {[m
[31m-        listen [::1]:$TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        location /foo {[m
[31m-            content_by_lua 'ngx.say("foo")';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("[::1]", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- skip_eval: 3: system("ping6 -c 1 ::1 >/dev/null 2>&1") ne 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: kill a thread with a connecting socket[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 1s;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock[m
[31m-[m
[31m-            local thr = ngx.thread.spawn(function ()[m
[31m-                sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-            end)[m
[31m-[m
[31m-            ngx.sleep(0.002)[m
[31m-            ngx.thread.kill(thr)[m
[31m-            ngx.sleep(0.001)[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to setkeepalive: ", err)[m
[31m-            else[m
[31m-                ngx.say("setkeepalive: ", ok)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to setkeepalive: closed[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 100[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: reuse cleanup[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if not line then[m
[31m-                        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- error_log[m
[31m-lua http cleanup reuse[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 57: reuse cleanup in ngx.timer (fake_request)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            local total_send_bytes = 0[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local function network()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                total_send_bytes = total_send_bytes + bytes[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if not line then[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local done = false[m
[31m-[m
[31m-            local function double_network()[m
[31m-                network()[m
[31m-                network()[m
[31m-                done = true[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.timer.at(0, double_network)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to create timer: ", err)[m
[31m-            end[m
[31m-[m
[31m-            i = 1[m
[31m-            while not done do[m
[31m-                local time = 0.005 * i[m
[31m-                if time > 0.1 then[m
[31m-                    time = 0.1[m
[31m-                end[m
[31m-                ngx.sleep(time)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage("collect")[m
[31m-[m
[31m-            ngx.say("total_send_bytes: ", total_send_bytes)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-total_send_bytes: 114[m
[31m---- error_log[m
[31m-lua http cleanup reuse[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 58: free cleanup in ngx.timer (without sock:close)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            local total_send_bytes = 0[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local function network()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                total_send_bytes = total_send_bytes + bytes[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if not line then[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local done = false[m
[31m-[m
[31m-            local function double_network()[m
[31m-                network()[m
[31m-                network()[m
[31m-                done = true[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.timer.at(0, double_network)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to create timer: ", err)[m
[31m-            end[m
[31m-[m
[31m-            i = 1[m
[31m-            while not done do[m
[31m-                local time = 0.005 * i[m
[31m-                if time > 0.1 then[m
[31m-                    time = 0.1[m
[31m-                end[m
[31m-                ngx.sleep(time)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage("collect")[m
[31m-[m
[31m-            ngx.say("total_send_bytes: ", total_send_bytes)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-total_send_bytes: 114[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 59: reuse cleanup in subrequest[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        echo_location /tt;[m
[31m-    }[m
[31m-[m
[31m-    location /tt {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if not line then[m
[31m-                        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- error_log[m
[31m-lua http cleanup reuse[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/059-unix-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/059-unix-socket.t[m
[1mdeleted file mode 100644[m
[1mindex b06ba6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/059-unix-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,203 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: connection refused (unix domain socket)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("unix:/tmp/nosuchfile.sock")[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil no such file or directory[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log eval[m
[31m-qr{\[crit\] .*? connect\(\) to unix:/tmp/nosuchfile\.sock failed}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: invalid host argument[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("/tmp/test-nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-failed to connect: failed to parse host name "/tmp/test-nginx.sock": invalid host[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            content_by_lua 'ngx.say("foo")';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                print("calling receive")[m
[31m-                local line, err = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.socket.stream[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            content_by_lua_block { ngx.say("foo") }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local sock = ngx.socket.stream()[m
[31m-            local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                print("calling receive")[m
[31m-                local line, err = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/060-lua-memcached.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/060-lua-memcached.t[m
[1mdeleted file mode 100644[m
[1mindex e1ebb92..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/060-lua-memcached.t[m
[1m+++ /dev/null[m
[36m@@ -1,169 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-my $pwd = `pwd`;[m
[31m-chomp $pwd;[m
[31m-$ENV{TEST_NGINX_PWD} ||= $pwd;[m
[31m-[m
[31m-#master_on();[m
[31m-workers(1);[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1014);[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    lua_package_path '$TEST_NGINX_PWD/t/lib/?.lua;;';[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            package.loaded["socket"] = ngx.socket[m
[31m-            local Memcached = require "Memcached"[m
[31m-            Memcached.socket = ngx.socket[m
[31m-[m
[31m-            local memc = Memcached.Connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-[m
[31m-            memc:set("some_key", "hello 1234")[m
[31m-            local data = memc:get("some_key")[m
[31m-            ngx.say("some_key: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-some_key: hello 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: raw memcached[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;;';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc, err = memcached.connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-[m
[31m-            local ok, err = memc:set("some_key", "hello 1234")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set some_key: ", err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            local data, err = memc:get("some_key")[m
[31m-            if not data and err then[m
[31m-                ngx.log(ngx.ERR, "failed to get some_key: ", err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("some_key: ", data)[m
[31m-[m
[31m-            local res, err = memc:set_keepalive()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> resty/memcached.lua[m
[31m-module("resty.memcached", package.seeall)[m
[31m-[m
[31m-local mt = { __index = resty.memcached }[m
[31m-local sub = string.sub[m
[31m-local escape_uri = ngx.escape_uri[m
[31m-local socket_connect = ngx.socket.connect[m
[31m-local match = string.match[m
[31m-[m
[31m-function connect(...)[m
[31m-    local sock, err = socket_connect(...)[m
[31m-    return setmetatable({ sock = sock }, mt)[m
[31m-end[m
[31m-[m
[31m-function get(self, key)[m
[31m-    local cmd = "get " .. escape_uri(key) .. "\r\n"[m
[31m-    local bytes, err = self.sock:send(cmd)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = self.sock:receive()[m
[31m-    if line == 'END' then[m
[31m-        return nil, nil[m
[31m-    end[m
[31m-[m
[31m-    local flags, len = match(line, [[^VALUE %S+ (%d+) (%d+)]])[m
[31m-    if not flags then[m
[31m-        return nil, "bad response: " .. line[m
[31m-    end[m
[31m-[m
[31m-    print("size: ", size, ", flags: ", len)[m
[31m-[m
[31m-    local data, err = self.sock:receive(len)[m
[31m-    if not data then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    line, err = self.sock:receive(2) -- discard the trailing CRLF[m
[31m-    if not line then[m
[31m-        return nil, nil, "failed to receive CRLF: " .. (err or "")[m
[31m-    end[m
[31m-[m
[31m-    line, err = self.sock:receive() -- discard "END\r\n"[m
[31m-    if not line then[m
[31m-        return nil, nil, "failed to receive END CRLF: " .. (err or "")[m
[31m-    end[m
[31m-[m
[31m-    return data[m
[31m-end[m
[31m-[m
[31m-function set(self, key, value, exptime, flags)[m
[31m-    if not exptime then[m
[31m-        exptime = 0[m
[31m-    end[m
[31m-[m
[31m-    if not flags then[m
[31m-        flags = 0[m
[31m-    end[m
[31m-[m
[31m-    local cmd = table.concat({"set ", escape_uri(key), " ", flags, " ", exptime, " ", #value, "\r\n", value, "\r\n"}, "")[m
[31m-[m
[31m-    local bytes, err = self.sock:send(cmd)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local data, err = self.sock:receive()[m
[31m-    if sub(data, 1, 6) == "STORED" then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return false, err[m
[31m-end[m
[31m-[m
[31m-function set_keepalive(self)[m
[31m-    return self.sock:setkeepalive(0, 100)[m
[31m-end[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-some_key: hello 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua reuse free buf memory[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/061-lua-redis.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/061-lua-redis.t[m
[1mdeleted file mode 100644[m
[1mindex d7b1876..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/061-lua-redis.t[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#log_level "warn";[m
[31m-#worker_connections(1024);[m
[31m-#master_on();[m
[31m-[m
[31m-my $pwd = `pwd`;[m
[31m-chomp $pwd;[m
[31m-$ENV{TEST_NGINX_PWD} ||= $pwd;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    lua_package_path '$TEST_NGINX_PWD/t/lib/?.lua;;';[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            package.loaded["socket"] = ngx.socket[m
[31m-            local Redis = require "Redis"[m
[31m-[m
[31m-            local redis = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-[m
[31m-            redis:set("some_key", "hello 1234")[m
[31m-            local data = redis:get("some_key")[m
[31m-            ngx.say("some_key: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-some_key: hello 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: coroutine-based pub/sub[m
[31m---- http_config eval[m
[31m-qq{[m
[31m-    lua_package_path '\$TEST_NGINX_PWD/t/lib/?.lua;;';[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-}[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            package.loaded["socket"] = ngx.socket[m
[31m-            local Redis = require "Redis"[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local r1 = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-[m
[31m-            local r2 = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-[m
[31m-            local loop = r2:pubsub({ subscribe = "foo" })[m
[31m-            local msg, abort = loop()[m
[31m-            ngx.say("msg type: ", type(msg))[m
[31m-            ngx.say("abort: ", type(abort))[m
[31m-[m
[31m-            if msg then[m
[31m-                ngx.say("msg: ", ljson.encode(msg))[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                r1:publish("foo", "test " .. i)[m
[31m-                msg, abort = loop()[m
[31m-                if msg then[m
[31m-                    ngx.say("msg: ", ljson.encode(msg))[m
[31m-                end[m
[31m-                ngx.say("abort: ", type(abort))[m
[31m-            end[m
[31m-[m
[31m-            abort()[m
[31m-[m
[31m-            msg, abort = loop()[m
[31m-            ngx.say("msg type: ", type(msg))[m
[31m-        ';[m
[31m-    }[m
[31m---- stap2[m
[31m-global ids, cur[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    delete ids[m
[31m-    cur = 0[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_yield") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("raw lua yield %d\n", id)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("raw lua resume %d\n", id)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    id = gen_id($ctx->cur_co)[m
[31m-    printf("run thread %d\n", id)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-resume) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("resume %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-entry-coroutine-yield) {[m
[31m-    println("entry coroutine yield")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coroutine_yield) {[m
[31m-    printf("yield %x\n", gen_id($L))[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_coroutine_resume) {[m
[31m-    printf("resume %x\n", gen_id($L))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-yield) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("yield %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_atpanic) {[m
[31m-    printf("lua atpanic(%d):", gen_id($L))[m
[31m-    print_ubacktrace();[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exec) { println("exec") }[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) { println("exit") }[m
[31m-[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-msg type: table[m
[31m-abort: function[m
[31m-msg: {"channel":"foo","kind":"subscribe","payload":1}[m
[31m-msg: {"channel":"foo","kind":"message","payload":"test 1"}[m
[31m-abort: function[m
[31m-msg: {"channel":"foo","kind":"message","payload":"test 2"}[m
[31m-abort: function[m
[31m-msg: {"channel":"foo","kind":"message","payload":"test 3"}[m
[31m-abort: function[m
[31m-msg type: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/062-count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/062-count.t[m
[1mdeleted file mode 100644[m
[1mindex a24611c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/062-count.t[m
[1m+++ /dev/null[m
[36m@@ -1,496 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(4);[m
[31m-#log_level('warn');[m
[31m-no_root_location();[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{LUA_CPATH} = "/usr/local/openresty/lualib/?.so;" . $ENV{LUA_CPATH};[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: entries under ngx. (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("ngx: ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ngx: 116[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: entries under ngx. (set by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            set_by_lua $n '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                return n;[m
[31m-            ';[m
[31m-            echo $n;[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-116[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: entries under ngx. (header filter by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            set $n '';[m
[31m-[m
[31m-            content_by_lua '[m
[31m-                ngx.send_headers()[m
[31m-                ngx.say("n = ", ngx.var.n)[m
[31m-            ';[m
[31m-[m
[31m-            header_filter_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-[m
[31m-                ngx.var.n = n[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 116[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: entries under ndk. (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ndk) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: entries under ngx.req (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.req) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 24[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: entries under ngx.req (set by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            set_by_lua $n '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.req) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                return n[m
[31m-            ';[m
[31m-[m
[31m-            echo "n = $n";[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 24[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: entries under ngx.req (header filter by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            set $n '';[m
[31m-[m
[31m-            header_filter_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.req) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.var.n = n[m
[31m-            ';[m
[31m-[m
[31m-            content_by_lua '[m
[31m-                ngx.send_headers()[m
[31m-                ngx.say("n = ", ngx.var.n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 24[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: entries under ngx.location[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.location) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: entries under ngx.socket[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.socket) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: entries under ngx._tcp_meta[m
[31m---- SKIP[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx._tcp_meta) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: entries under the metatable of req sockets[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                local sock, err = ngx.req.socket()[m
[31m-                if not sock then[m
[31m-                    ngx.say("failed to get the request socket: ", err)[m
[31m-                end[m
[31m-[m
[31m-                for k, v in pairs(getmetatable(sock)) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello world[m
[31m---- response_body[m
[31m-n = 4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: shdict metatable[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local mt = dogs.__index[m
[31m-            local n = 0[m
[31m-            for k, v in pairs(mt) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("n = ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 13[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: entries under ngx. (log by lua)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        log_by_lua '[m
[31m-            local n = 0[m
[31m-            for k, v in pairs(ngx) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.log(ngx.ERR, "ngx. entry count: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- error_log[m
[31m-ngx. entry count: 116[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: entries under ngx.timer[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.timer) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: entries under ngx.config[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.config) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: entries under ngx.re[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.re) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: entries under coroutine. (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(coroutine) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("coroutine: ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap2[m
[31m-global c[m
[31m-probe process("$LIBLUA_PATH").function("rehashtab") {[m
[31m-    c++[m
[31m-    printf("rehash: %d\n", c)[m
[31m-}[m
[31m---- stap_out2[m
[31m-3[m
[31m---- response_body[m
[31m-coroutine: 14[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entries under ngx.thread. (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.thread) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("thread: ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap2[m
[31m-global c[m
[31m-probe process("$LIBLUA_PATH").function("rehashtab") {[m
[31m-    c++[m
[31m-    printf("rehash: %d\n", c)[m
[31m-}[m
[31m---- stap_out2[m
[31m---- response_body[m
[31m-thread: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: entries under ngx.worker[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.worker) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("worker: ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-worker: 4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: entries under the metatable of udp sockets[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                local sock = ngx.socket.udp()[m
[31m-                for k, v in pairs(getmetatable(sock)) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: entries under the metatable of req raw sockets[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                ngx.req.read_body()[m
[31m-                local sock, err = ngx.req.socket(true)[m
[31m-                if not sock then[m
[31m-                    ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                for k, v in pairs(getmetatable(sock)) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 6\\r\\n\\r\\nn = "..n.."\\n")[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to send: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 5[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/063-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/063-abort.t[m
[1mdeleted file mode 100644[m
[1mindex c112ee1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/063-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,1020 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(4);[m
[31m-#log_level('warn');[m
[31m-no_root_location();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{LUA_CPATH} = "/usr/local/openresty/lualib/?.so;" . $ENV{LUA_CPATH};[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.exit(400) should abort print[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /memc_query {[m
[31m-            internal;[m
[31m-            set               $memc_cmd     $arg_cmd;[m
[31m-            set_unescape_uri  $memc_key     $arg_key;[m
[31m-            set_unescape_uri  $memc_value   $arg_value;[m
[31m-            set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-            memc_cmds_allowed get set add delete;[m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-        }[m
[31m-[m
[31m-        location = /test {[m
[31m-            content_by_lua_file html/test.lua;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local memd = require 'memd'[m
[31m-ngx.exit(400)[m
[31m-local res = memd.query( { cmd = 'get', key = id } )[m
[31m->>> memd.lua[m
[31m-module('memd', package.seeall)[m
[31m-[m
[31m-local URL = '/memc_query'[m
[31m-local capture = ngx.location.capture[m
[31m-[m
[31m-function query(arg)[m
[31m-    if type(arg) ~= 'table' then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    print("HELLO WORLD")[m
[31m-    return capture(URL, { args = arg } )[m
[31m-end[m
[31m---- request[m
[31m-GET /test?a[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log eval[m
[31m-["lua print: HELLO WORLD", q{the "$memc_key" variable is not set}][m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.exit(400) should abort ngx.log[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /memc_query {[m
[31m-            internal;[m
[31m-            set               $memc_cmd     $arg_cmd;[m
[31m-            set_unescape_uri  $memc_key     $arg_key;[m
[31m-            set_unescape_uri  $memc_value   $arg_value;[m
[31m-            set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-            memc_cmds_allowed get set add delete;[m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-        }[m
[31m-[m
[31m-        location = /test {[m
[31m-            content_by_lua_file html/test.lua;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local memd = require 'memd'[m
[31m-ngx.exit(400)[m
[31m-local res = memd.query( { cmd = 'get', key = id } )[m
[31m->>> memd.lua[m
[31m-module('memd', package.seeall)[m
[31m-[m
[31m-local URL = '/memc_query'[m
[31m-local capture = ngx.location.capture[m
[31m-local log = ngx.log[m
[31m-local level = ngx.ERR[m
[31m-[m
[31m-function query(arg)[m
[31m-    if type(arg) ~= 'table' then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    log(level, "HELLO WORLD")[m
[31m-    return capture(URL, { args = arg } )[m
[31m-end[m
[31m---- request[m
[31m-GET /test?a[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log eval[m
[31m-["HELLO WORLD", q{the "$memc_key" variable is not set}][m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.exit(400) should abort ngx.location.capture[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /memc_query {[m
[31m-            internal;[m
[31m-            set               $memc_cmd     $arg_cmd;[m
[31m-            set_unescape_uri  $memc_key     $arg_key;[m
[31m-            set_unescape_uri  $memc_value   $arg_value;[m
[31m-            set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-            memc_cmds_allowed get set add delete;[m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-        }[m
[31m-[m
[31m-        location = /test {[m
[31m-            content_by_lua_file html/test.lua;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local memd = require 'memd'[m
[31m-ngx.exit(400)[m
[31m-local res = memd.query( { cmd = 'get', key = id } )[m
[31m->>> memd.lua[m
[31m-module('memd', package.seeall)[m
[31m-[m
[31m-local URL = '/memc_query'[m
[31m-local capture = ngx.location.capture[m
[31m-[m
[31m-function query(arg)[m
[31m-    if type(arg) ~= 'table' then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return capture(URL, { args = arg } )[m
[31m-end[m
[31m---- request[m
[31m-GET /test?a[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-the "$memc_key" variable is not set[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exit(400) should abort ngx.location.capture_multi[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /memc_query {[m
[31m-            internal;[m
[31m-            set               $memc_cmd     $arg_cmd;[m
[31m-            set_unescape_uri  $memc_key     $arg_key;[m
[31m-            set_unescape_uri  $memc_value   $arg_value;[m
[31m-            set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-            memc_cmds_allowed get set add delete;[m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-        }[m
[31m-[m
[31m-        location = /test {[m
[31m-            content_by_lua_file html/test.lua;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local memd = require 'memd'[m
[31m-ngx.exit(400)[m
[31m-local res = memd.query( { cmd = 'get', key = id } )[m
[31m->>> memd.lua[m
[31m-module('memd', package.seeall)[m
[31m-[m
[31m-local URL = '/memc_query'[m
[31m-local capture_multi = ngx.location.capture_multi[m
[31m-[m
[31m-function query(arg)[m
[31m-    if type(arg) ~= 'table' then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return capture_multi{ {URL, { args = arg }} }[m
[31m-end[m
[31m---- request[m
[31m-GET /test?a[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-the "$memc_key" variable is not set[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(400) should abort ngx.redirect[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.redirect("/blah")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua redirect to "/blah" with code 302[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(400) should abort ngx.exit[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.exit(503)[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua exit with code 503[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.exit(400) should abort ngx.exec[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.exec("/blah")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua exec "/blah?"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.exit(400) should abort ngx.send_headers[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.send_headers()[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua send headers[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.exit(400) should abort ngx.print[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.print("HELLO WORLD")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua print response[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.exit(400) should abort ngx.say[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("HELLO WORLD")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua say response[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.exit(400) should abort ngx.flush[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.flush()[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua flush asynchronously[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.exit(400) should abort ngx.eof[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.eof()[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua send eof[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.exit(400) should abort ngx.re.match[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.re.match("a", "a", "jo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua compiling match regex "a" with options "jo"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.exit(400) should abort ngx.re.gmatch[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.re.gmatch("a", "a", "jo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua compiling gmatch regex "a" with options "jo"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.exit(400) should abort ngx.re.sub[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.re.sub("a", "a", "", "jo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua compiling sub regex "a" with options "jo"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.exit(400) should abort ngx.re.gsub[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.re.gsub("a", "a", "", "jo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua compiling gsub regex "a" with options "jo"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.exit(400) should abort ngx.shared.DICT (set)[m
[31m---- http_config eval[m
[31m-    "lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                print("foo = ", dogs:get("foo"))[m
[31m-                dogs:set("foo", 32)[m
[31m-                ngx.exit(400)[m
[31m-                test.go(dogs)[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go(dogs)[m
[31m-    dogs:set("foo", 56)[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-foo = 56[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.exit(400) should abort ngx.shared.DICT (replace)[m
[31m---- http_config eval[m
[31m-    "lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                print("foo = ", dogs:get("foo"))[m
[31m-                dogs:set("foo", 32)[m
[31m-                ngx.exit(400)[m
[31m-                test.go(dogs)[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go(dogs)[m
[31m-    dogs:replace("foo", 56)[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-foo = 56[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.exit(400) should abort ngx.shared.DICT (incr)[m
[31m---- http_config eval[m
[31m-    "lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                print("foo = ", dogs:get("foo"))[m
[31m-                dogs:set("foo", 32)[m
[31m-                ngx.exit(400)[m
[31m-                test.go(dogs)[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go(dogs)[m
[31m-    dogs:incr("foo", 56)[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-foo = 88[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.exit(400) should abort ngx.shared.DICT (get)[m
[31m---- http_config eval[m
[31m-    "lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                dogs:set("foo", 32)[m
[31m-                ngx.exit(400)[m
[31m-                test.go(dogs)[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go(dogs)[m
[31m-    dogs:get("foo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-fetching key "foo" in shared dict "dogs"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.exit(400) should skip os.execute[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx.exit(400) should break pcall and skip os.execute[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                pcall(ngx.exit, 400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-fetching key "foo" in shared dict "dogs"[m
[31m---- error_code: 400[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.exit(400) should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    pcall(ngx.exit, 400)[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx.redirect() should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    pcall(ngx.redirect, "/blah")[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 302 Found[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 302[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx.redirect() should skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    ngx.redirect("/blah")[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 302 Found[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 302[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: ngx.exec() should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    pcall(ngx.exec, "/foo")[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx.exec() should skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    ngx.exec("/foo")[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx.set_uri(uri, true) should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            rewrite_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-            echo hello;[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    local ok, err = pcall(ngx.req.set_uri, "/foo", true)[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "error: ", err)[m
[31m-    end[m
[31m-[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: abort does not affect following coroutines[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            rewrite_by_lua 'ngx.exit(0)';[m
[31m-            content_by_lua '[m
[31m-                pcall(ngx.say, "hello world")[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: ngx.exit(400) should break xpcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function myexit()[m
[31m-    ngx.exit(400)[m
[31m-end[m
[31m-[m
[31m-function go()[m
[31m-    xpcall(myexit, function () end)[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: ngx.exec() should skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local os_exec = os.execute[m
[31m-local ngx_exec = ngx.exec[m
[31m-module('test')[m
[31m-[m
[31m-function go()[m
[31m-    ngx_exec("/foo")[m
[31m-    os_exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: ngx.exec() should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local os_exec = os.execute[m
[31m-local ngx_exec = ngx.exec[m
[31m-local pcall = pcall[m
[31m-module('test')[m
[31m-[m
[31m-function go()[m
[31m-    pcall(ngx_exec, "/foo")[m
[31m-    os_exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/064-pcall.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/064-pcall.t[m
[1mdeleted file mode 100644[m
[1mindex cf90a07..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/064-pcall.t[m
[1m+++ /dev/null[m
[36m@@ -1,107 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(4);[m
[31m-#log_level('warn');[m
[31m-no_root_location();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{LUA_CPATH} = "/usr/local/openresty/lualib/?.so;" . $ENV{LUA_CPATH};[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: pcall works[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                function f(a, b)[m
[31m-                    if a == 0 and b == 0 then[m
[31m-                        error("zero error")[m
[31m-                    end[m
[31m-[m
[31m-                    return 23, "hello", true[m
[31m-                end[m
[31m-[m
[31m-                local res = {pcall(f, 0, 0)}[m
[31m-                ngx.say("res len: ", #res)[m
[31m-                ngx.say("res: ", unpack(res))[m
[31m-[m
[31m-                res = {pcall(f, 0)}[m
[31m-                ngx.say("res len: ", #res)[m
[31m-                ngx.say("res: ", unpack(res))[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qr/^res len: 2[m
[31m-res: falsecontent_by_lua\(nginx\.conf:\d+\):4: zero error[m
[31m-res len: 4[m
[31m-res: true23hellotrue[m
[31m-$/s[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: xpcall works[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                function f(a, b)[m
[31m-                    if a == 0 and b == 0 then[m
[31m-                        error("zero error")[m
[31m-                    end[m
[31m-[m
[31m-                    return 23, "hello", true[m
[31m-                end[m
[31m-[m
[31m-                function g()[m
[31m-                    return f(0, 0)[m
[31m-                end[m
[31m-[m
[31m-                function h()[m
[31m-                    return f(0)[m
[31m-                end[m
[31m-[m
[31m-                function err(...)[m
[31m-                    ngx.say("error handler called: ", ...)[m
[31m-                    return "this is the new err"[m
[31m-                end[m
[31m-[m
[31m-                local res = {xpcall(g, err)}[m
[31m-                ngx.say("res len: ", #res)[m
[31m-                ngx.say("res: ", unpack(res))[m
[31m-[m
[31m-                res = {xpcall(h, err)}[m
[31m-                ngx.say("res len: ", #res)[m
[31m-                ngx.say("res: ", unpack(res))[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qr/^error handler called: content_by_lua\(nginx\.conf:\d+\):4: zero error[m
[31m-res len: 2[m
[31m-res: falsethis is the new err[m
[31m-res len: 4[m
[31m-res: true23hellotrue[m
[31m-$/[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/065-tcp-socket-timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/065-tcp-socket-timeout.t[m
[1mdeleted file mode 100644[m
[1mindex ec79891..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/065-tcp-socket-timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,997 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'get helloworld';[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 12);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-log_level("debug");[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: lua_socket_connect_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 100[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sock:settimeout() overrides lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 60s;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(150)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 150[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sock:settimeout(nil) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(nil)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m-lua tcp socket connect timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sock:settimeout(0) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(0)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sock:settimeout(-1) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(-1)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m-lua tcp socket connect timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_socket_read_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sock:settimeout() overrides lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 60s;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(150)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 150[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sock:settimeout(nil) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(nil)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sock:settimeout(0) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(0)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sock:settimeout(-1) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(-1)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: lua_socket_send_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-F(ngx_http_lua_socket_send) {[m
[31m-    active = 1[m
[31m-    println(probefunc())[m
[31m-}[m
[31m-probe syscall.send,[m
[31m-    syscall.sendto,[m
[31m-    syscall.writev[m
[31m-{[m
[31m-    if (active && pid() == target()) {[m
[31m-        println(probefunc())[m
[31m-    }[m
[31m-}[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: sock:settimeout() overrides lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 60s;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(150)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 150[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: sock:settimeout(nil) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(nil)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: sock:settimeout(0) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(0)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: sock:settimeout(-1) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(-1)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: exit in user thread (entry thread is still pending on tcpsock:send)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local bytes, ok = sock:send("get helloworld!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: re-connect after timed out[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("2: failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("2: connected: ", ok)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: failed to connect: timeout[m
[31m-2: connected: 1[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 100[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: re-send on the same object after a send timeout happens[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                bytes, err = sock:send("blah")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send again: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-F(ngx_http_lua_socket_send) {[m
[31m-    active = 1[m
[31m-    println(probefunc())[m
[31m-}[m
[31m-probe syscall.send,[m
[31m-    syscall.sendto,[m
[31m-    syscall.writev[m
[31m-{[m
[31m-    if (active && pid() == target()) {[m
[31m-        println(probefunc())[m
[31m-    }[m
[31m-}[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m-failed to send again: closed[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: abort when upstream sockets pending on writes[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-            ngx.thread.spawn(function () ngx.sleep(0.001) ngx.say("done") ngx.exit(200) end)[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-F(ngx_http_lua_socket_send) {[m
[31m-    active = 1[m
[31m-    println(probefunc())[m
[31m-}[m
[31m-probe syscall.send,[m
[31m-    syscall.sendto,[m
[31m-    syscall.writev[m
[31m-{[m
[31m-    if (active && pid() == target()) {[m
[31m-        println(probefunc())[m
[31m-    }[m
[31m-}[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-done[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m---- no_error_log[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: abort when downstream socket pending on writes[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to acquire the req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.log(ngx.WARN, "quitting request now")[m
[31m-                ngx.exit(200)[m
[31m-            end)[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("e\\r\\nget helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-F(ngx_http_lua_socket_send) {[m
[31m-    active = 1[m
[31m-    println(probefunc())[m
[31m-}[m
[31m-probe syscall.send,[m
[31m-    syscall.sendto,[m
[31m-    syscall.writev[m
[31m-{[m
[31m-    if (active && pid() == target()) {[m
[31m-        println(probefunc())[m
[31m-    }[m
[31m-}[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-quitting request now[m
[31m---- no_error_log[m
[31m-lua tcp socket write timed out[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: read timeout on receive(N)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(10)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive(3)[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 10[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: concurrent operations while writing[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ready = false[m
[31m-[m
[31m-            local function f()[m
[31m-                while not ready do[m
[31m-                    ngx.sleep(0.001)[m
[31m-                end[m
[31m-[m
[31m-                local bytes, err = sock:send("flush_all")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-                sock:settimeout(1)[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            ready = true[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local bytes, err = sock:send("get helloworld!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("send failed: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connect: 1 nil[m
[31m-send: nil socket busy writing[m
[31m-close: nil socket busy writing[m
[31m-getreusedtimes: 0 nil[m
[31m-setkeepalive: nil socket busy writing[m
[31m-connect: nil socket busy writing[m
[31m-receive: nil timeout[m
[31m-send failed: timeout[m
[31m-close: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/066-socket-receiveuntil.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/066-socket-receiveuntil.t[m
[1mdeleted file mode 100644[m
[1mindex 3bf5229..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/066-socket-receiveuntil.t[m
[1m+++ /dev/null[m
[36m@@ -1,1332 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: memcached read lines[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local readline = sock:receiveuntil("\\r\\n")[m
[31m-            local line, err, part = readline()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http read lines[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local readline = sock:receiveuntil("\\r\\n")[m
[31m-            local line, err, part[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = readline()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: HTTP/1.1 200 OK[m
[31m-read: Server: nginx[m
[31m-read: Content-Type: text/plain[m
[31m-read: Content-Length: 4[m
[31m-read: Connection: close[m
[31m-read: [m
[31m-failed to read a line: closed [foo[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: http read all the headers in a single run[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local line, err, part[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = read_headers()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close[m
[31m-failed to read a line: closed [foo[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ambiguous boundary patterns (abcabd)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabd")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("abcabcabd")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abc[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ambiguous boundary patterns (aa)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("abcabcaad")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabc[m
[31m-failed to read a line: closed [d[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ambiguous boundary patterns (aaa)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aaa")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abaabcaaaef;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abaabc[m
[31m-failed to read a line: closed [ef[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ambiguous boundary patterns (aaaaad)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aaaaad")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo baaaaaaaaeaaaaaaadf;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: baaaaaaaaeaa[m
[31m-failed to read a line: closed [f[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ambiguous boundary patterns (aaaaad), small buffer, 2 bytes[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 2;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aaaaad")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo baaaaaaaaeaaaaaaadf;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: baaaaaaaaeaa[m
[31m-failed to read a line: closed [f[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ambiguous boundary patterns (aaaaad), small buffer, 1 byte[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aaaaad")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo baaaaaaaaeaaaaaaadf;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: baaaaaaaaeaa[m
[31m-failed to read a line: closed [f[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ambiguous boundary patterns (abcabdabcabe)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabdabcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabd[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ambiguous boundary patterns (abcabdabcabe 2)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabdabcabcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabdabc[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ambiguous boundary patterns (abcabdabcabe 3)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abc[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ambiguous boundary patterns (abcabdabcabe 4)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo ababcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: ab[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ambiguous boundary patterns (--abc)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo -- ----abc;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: --[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ambiguous boundary patterns (--abc)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc")[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read: o, w[m
[31m-read: orld[m
[31m-read:  --[m
[31m-read: [m
[31m-failed to read a line: nil [nil][m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ambiguous boundary patterns (--abc), small buffer[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc")[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read: o, w[m
[31m-read: orld[m
[31m-read:  --[m
[31m-read: [m
[31m-failed to read a line: nil [nil][m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ambiguous boundary patterns (--abc), small buffer, mixed by other reading calls[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc")[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a chunk: ", err, " [", part, "]")[m
[31m-                end[m
[31m-[m
[31m-                local data, err, part = sock:receive(1)[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to read a byte: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                else[m
[31m-                    ngx.say("read one byte: ", data)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read one byte: o[m
[31m-read: , wo[m
[31m-read one byte: r[m
[31m-read: ld -[m
[31m-read one byte: -[m
[31m-read: [m
[31m-read one byte: [m
[31m-[m
[31m-failed to read a chunk: nil [nil][m
[31m-failed to read a byte: closed [][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ambiguous boundary patterns (abcabd), small buffer[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 3;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabd")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcabd;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abc[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: long patterns[m
[31m-this exposed a memory leak in receiveuntil[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local reader, err = sock:receiveuntil("------------------------------------------- abcdefghijklmnopqrstuvwxyz")[m
[31m-            if not reader then[m
[31m-                ngx.say("failed to get reader: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    POST /t[m
[31m-[m
[31m---- more_headers: Content-Length: 1024[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/067-req-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/067-req-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 30a653a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/067-req-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,1099 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 9);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-received: hello[m
[31m-received:  worl[m
[31m-failed to receive: closed [d][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multipart rfc sample (just partial streaming)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local boundary[m
[31m-            local header = ngx.var.http_content_type[m
[31m-            local m = ngx.re.match(header, [[; +boundary=(?:"(.*?)"|(\\w+))]], "jo")[m
[31m-            if m then[m
[31m-                boundary = m[1] or m[2][m
[31m-[m
[31m-            else[m
[31m-                ngx.say("invalid content-type header")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local read_to_boundary = sock:receiveuntil("\\r\\n--" .. boundary)[m
[31m-            local read_line = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-            local data, err, part = read_to_boundary()[m
[31m-            if data then[m
[31m-                ngx.say("preamble: [" .. data .. "]")[m
[31m-            else[m
[31m-                ngx.say("failed to read the first boundary: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local i = 1[m
[31m-            while true do[m
[31m-                local line, err = read_line()[m
[31m-[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to read post-boundary line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                m = ngx.re.match(line, "--$", "jo")[m
[31m-                if m then[m
[31m-                    ngx.say("found the end of the stream")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = read_line()[m
[31m-                    if not line then[m
[31m-                        ngx.say("failed to read part ", i, " header: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if line == "" then[m
[31m-                        -- the header part completes[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("part ", i, " header: [", line, "]")[m
[31m-                end[m
[31m-[m
[31m-                local data, err, part = read_to_boundary()[m
[31m-                if data then[m
[31m-                    ngx.say("part ", i, " body: [" .. data .. "]")[m
[31m-                else[m
[31m-                    ngx.say("failed to read part ", i + 1, " boundary: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.\r[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-"[m
[31m---- more_headers[m
[31m-Content-Type: multipart/mixed; boundary="simple boundary"[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-preamble: [This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.][m
[31m-part 1 body: [This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.][m
[31m-part 2 header: [Content-type: text/plain; charset=us-ascii][m
[31m-part 2 body: [This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-][m
[31m-found the end of the stream[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multipart rfc sample (completely streaming)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local boundary[m
[31m-            local header = ngx.var.http_content_type[m
[31m-            local m = ngx.re.match(header, [[; +boundary=(?:"(.*?)"|(\\w+))]], "jo")[m
[31m-            if m then[m
[31m-                boundary = m[1] or m[2][m
[31m-[m
[31m-            else[m
[31m-                ngx.say("invalid content-type header")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local read_to_boundary = sock:receiveuntil("\\r\\n--" .. boundary)[m
[31m-            local read_line = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-            local preamble = ""[m
[31m-            while true do[m
[31m-                local data, err, part = read_to_boundary(1)[m
[31m-                if data then[m
[31m-                    preamble = preamble .. data[m
[31m-[m
[31m-                elseif not err then[m
[31m-                    break[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read the first boundary: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("preamble: [" .. preamble .. "]")[m
[31m-[m
[31m-            local i = 1[m
[31m-            while true do[m
[31m-                local line, err = read_line(50)[m
[31m-[m
[31m-                if not line and err then[m
[31m-                    ngx.say("1: failed to read post-boundary line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if line then[m
[31m-                    local dummy[m
[31m-                    dummy, err = read_line(1)[m
[31m-                    if err then[m
[31m-                        ngx.say("2: failed to read post-boundary line: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if dummy then[m
[31m-                        ngx.say("bad post-boundary line: ", dummy)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    m = ngx.re.match(line, "--$", "jo")[m
[31m-                    if m then[m
[31m-                        ngx.say("found the end of the stream")[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = read_line(50)[m
[31m-                    if not line and err then[m
[31m-                        ngx.say("failed to read part ", i, " header: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if line then[m
[31m-                        local line, err = read_line(1)[m
[31m-                        if line or err then[m
[31m-                            ngx.say("error")[m
[31m-                            return[m
[31m-                        end[m
[31m-                    end[m
[31m-[m
[31m-                    if line == "" then[m
[31m-                        -- the header part completes[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("part ", i, " header: [", line, "]")[m
[31m-                end[m
[31m-[m
[31m-                local body = ""[m
[31m-[m
[31m-                while true do[m
[31m-                    local data, err, part = read_to_boundary(1)[m
[31m-                    if data then[m
[31m-                        body = body .. data[m
[31m-[m
[31m-                    elseif err then[m
[31m-                        ngx.say("failed to read part ", i + 1, " boundary: ", err)[m
[31m-                        return[m
[31m-[m
[31m-                    else[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("part ", i, " body: [" .. body .. "]")[m
[31m-[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.\r[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-"[m
[31m---- more_headers[m
[31m-Content-Type: multipart/mixed; boundary="simple boundary"[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-preamble: [This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.][m
[31m-part 1 body: [This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.][m
[31m-part 2 header: [Content-type: text/plain; charset=us-ascii][m
[31m-part 2 body: [This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-][m
[31m-found the end of the stream[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: attempt to use the req socket across request boundary[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock, err[m
[31m-[m
[31m-function go()[m
[31m-    if not sock then[m
[31m-        sock, err = ngx.req.socket()[m
[31m-        if sock then[m
[31m-            ngx.say("got the request socket")[m
[31m-        else[m
[31m-            ngx.say("failed to get the request socket: ", err)[m
[31m-        end[m
[31m-    else[m
[31m-        for i = 1, 3 do[m
[31m-            local data, err, part = sock:receive(5)[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body_like[m
[31m-(?:got the request socket[m
[31m-|failed to receive: closed [d][m
[31m-)?done[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: receive until on request_body - receiveuntil(1) on the last byte of the body[m
[31m-See https://groups.google.com/group/openresty/browse_thread/thread/43cf01da3c681aba for details[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-   local sock, err = ngx.req.socket()[m
[31m-   if sock then[m
[31m-      ngx.say("got the request socket")[m
[31m-   else[m
[31m-      ngx.say("failed to get the request socket: ", err)[m
[31m-      return[m
[31m-   end[m
[31m-[m
[31m-   local data, err, part = sock:receive(56)[m
[31m-   if data then[m
[31m-      ngx.say("received: ", data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-[m
[31m-   local discard_line = sock:receiveuntil('\r\n')[m
[31m-[m
[31m-   local data, err, part = discard_line(8192)[m
[31m-   if data then[m
[31m-      ngx.say("received len: ", #data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-[m
[31m-   local data, err, part = discard_line(1)[m
[31m-   if data then[m
[31m-      ngx.say("received: ", data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-end[m
[31m---- request[m
[31m-POST /t[m
[31m------------------------------820127721219505131303151179################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################$[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-received: -----------------------------820127721219505131303151179[m
[31m-received len: 8192[m
[31m-received: $[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: pipelined POST requests[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-   local sock, err = ngx.req.socket()[m
[31m-   if sock then[m
[31m-      ngx.say("got the request socket")[m
[31m-   else[m
[31m-      ngx.say("failed to get the request socket: ", err)[m
[31m-      return[m
[31m-   end[m
[31m-[m
[31m-   while true do[m
[31m-       local data, err, part = sock:receive(4)[m
[31m-       if data then[m
[31m-          ngx.say("received: ", data)[m
[31m-       else[m
[31m-          ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-          return[m
[31m-       end[m
[31m-   end[m
[31m-end[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello, world",[m
[31m-"POST /t[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["got the request socket[m
[31m-received: hell[m
[31m-received: o, w[m
[31m-received: orld[m
[31m-failed to receive: closed [][m
[31m-done[m
[31m-",[m
[31m-"got the request socket[m
[31m-received: hiya[m
[31m-received: , wo[m
[31m-failed to receive: closed [rld][m
[31m-done[m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: Expect & 100 Continue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- error_code: 100[m
[31m---- response_body_like chomp[m
[31m-\breceived: hello\b.*?\breceived:  worl\b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: pipelined requests, big buffer, small steps[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_buffer_size 5;[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 6 do[m
[31m-                local data, err, part = sock:receive(2)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap2[m
[31m-M(http-lua-req-socket-consume-preread) {[m
[31m-    println("preread: ", user_string_n($arg2, $arg3))[m
[31m-}[m
[31m-[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello world","POST /t[m
[31m-hiya globe"][m
[31m---- response_body eval[m
[31m-["got the request socket[m
[31m-received: he[m
[31m-received: ll[m
[31m-received: o [m
[31m-received: wo[m
[31m-received: rl[m
[31m-failed to receive: closed [d][m
[31m-","got the request socket[m
[31m-received: hi[m
[31m-received: ya[m
[31m-received:  g[m
[31m-received: lo[m
[31m-received: be[m
[31m-failed to receive: closed [][m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: chunked support is still a TODO[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.req.read_body()[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-b\r[m
[31m-hello world\r[m
[31m-0\r[m
[31m-\r[m
[31m-"[m
[31m---- stap2[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    if ($r->main->count == 2) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-F(ngx_http_free_request) {[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-*/[m
[31m---- response_body[m
[31m-failed to get the request socket: chunked request bodies not supported yet[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- skip_nginx: 4: <1.3.9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: chunked support in ngx.req.read_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-b\r[m
[31m-hello world\r[m
[31m-0\r[m
[31m-\r[m
[31m-"[m
[31m---- stap2[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    if ($r->main->count == 2) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-F(ngx_http_free_request) {[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-*/[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- skip_nginx: 4: <1.3.9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: downstream cosocket for GET requests (w/o request bodies)[m
[31m---- config[m
[31m-    #resolver 8.8.8.8;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-           local sock, err = ngx.req.socket()[m
[31m-[m
[31m-           if not sock then[m
[31m-              ngx.say("failed to get socket: ", err)[m
[31m-              return nil[m
[31m-           end[m
[31m-[m
[31m-           while true do[m
[31m-              local data, err, partial = sock:receive(4096)[m
[31m-[m
[31m-              ngx.log(ngx.INFO, "Received data")[m
[31m-[m
[31m-              if err then[m
[31m-                 ngx.say("err: ", err)[m
[31m-                 if partial then[m
[31m-                    ngx.print(partial)[m
[31m-                 end[m
[31m-[m
[31m-                 break[m
[31m-              end[m
[31m-[m
[31m-              if data then[m
[31m-                 ngx.print(data)[m
[31m-              end[m
[31m-           end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to get socket: no body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: downstream cosocket for POST requests with 0 size bodies[m
[31m---- config[m
[31m-    #resolver 8.8.8.8;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-           local sock, err = ngx.req.socket()[m
[31m-[m
[31m-           if not sock then[m
[31m-              ngx.say("failed to get socket: ", err)[m
[31m-              return nil[m
[31m-           end[m
[31m-[m
[31m-           while true do[m
[31m-              local data, err, partial = sock:receive(4096)[m
[31m-[m
[31m-              ngx.log(ngx.INFO, "Received data")[m
[31m-[m
[31m-              if err then[m
[31m-                 ngx.say("err: ", err)[m
[31m-                 if partial then[m
[31m-                    ngx.print(partial)[m
[31m-                 end[m
[31m-[m
[31m-                 break[m
[31m-              end[m
[31m-[m
[31m-              if data then[m
[31m-                 ngx.print(data)[m
[31m-              end[m
[31m-           end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /t[m
[31m---- more_headers[m
[31m-Content-Length: 0[m
[31m---- response_body[m
[31m-failed to get socket: no body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: failing reread after reading timeout happens[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-[m
[31m-            if not sock then[m
[31m-               ngx.say("failed to get socket: ", err)[m
[31m-               return nil[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100);[m
[31m-[m
[31m-            local data, err, partial = sock:receive(4096)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            end[m
[31m-[m
[31m-            local data, err, partial = sock:receive(4096)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-               return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 10245\r[m
[31m-\r[m
[31m-hello"[m
[31m---- response_body[m
[31m-err: timeout, partial: hello[m
[31m-err: timeout, partial: [m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: successful reread after reading timeout happens (receive -> receive)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("POST /back HTTP/1.0\\r\\nHost: localhost\\r\\nContent-Length: 1024\\r\\n\\r\\nabc")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = sock:send("hello world")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to receive header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-[m
[31m-            if not sock then[m
[31m-               ngx.say("failed to get socket: ", err)[m
[31m-               return nil[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100);[m
[31m-[m
[31m-            local data, err, partial = sock:receive(4096)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            local data, err, partial = sock:receive(11)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sent: 65[m
[31m-sent: 11[m
[31m-received: err: timeout, partial: abc[m
[31m-received: received: hello world[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: successful reread after reading timeout happens (receive -> receiveuntil)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("POST /back HTTP/1.0\\r\\nHost: localhost\\r\\nContent-Length: 1024\\r\\n\\r\\nabc")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = sock:send("hello world\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to receive header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-[m
[31m-            if not sock then[m
[31m-               ngx.say("failed to get socket: ", err)[m
[31m-               return nil[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100);[m
[31m-[m
[31m-            local data, err, partial = sock:receive(4096)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sent: 65[m
[31m-sent: 12[m
[31m-received: err: timeout, partial: abc[m
[31m-received: received: hello world[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: successful reread after reading timeout happens (receiveuntil -> receive)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("POST /back HTTP/1.0\\r\\nHost: localhost\\r\\nContent-Length: 1024\\r\\n\\r\\nabc")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = sock:send("hello world\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to receive header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-[m
[31m-            if not sock then[m
[31m-               ngx.say("failed to get socket: ", err)[m
[31m-               return nil[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100);[m
[31m-[m
[31m-            local reader = sock:receiveuntil("no-such-terminator")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            local data, err, partial = sock:receive()[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sent: 65[m
[31m-sent: 12[m
[31m-received: err: timeout, partial: abc[m
[31m-received: received: hello world[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: req socket GC'd[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock, err = ngx.req.socket()[m
[31m-                if sock then[m
[31m-                    ngx.say("got the request socket")[m
[31m-                else[m
[31m-                    ngx.say("failed to get the request socket: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            collectgarbage()[m
[31m-            ngx.log(ngx.WARN, "GC cycle done")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/lua finalize socket|GC cycle done/[m
[31m---- grep_error_log_out[m
[31m-lua finalize socket[m
[31m-GC cycle done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/068-socket-keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/068-socket-keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex a005620..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/068-socket-keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,1478 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 7);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-$ENV{LUA_PATH} ||=[m
[31m-    '/usr/local/openresty-debug/lualib/?.lua;/usr/local/openresty/lualib/?.lua;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-connected: 1, reused: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- error_log eval[m
[31m-qq{lua tcp socket get keepalive peer: using connection[m
[31m-lua tcp socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: free up the whole connection pool if no active connections[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port, true)[m
[31m-            test.go(port, false)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, keepalive)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    if keepalive then[m
[31m-        local ok, err = sock:setkeepalive()[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to set reusable: ", err)[m
[31m-        end[m
[31m-[m
[31m-    else[m
[31m-        sock:close()[m
[31m-    end[m
[31m-end[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-connected: 1, reused: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket get keepalive peer: using connection",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: upstream sockets close prematurely[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   keepalive_timeout 100ms;[m
[31m-   location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, err = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: http keepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-        keepalive_timeout 60s;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, err = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive close handler: fd:",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: lua_socket_keepalive_timeout[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 100 ms",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_socket_pool_size[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-       lua_socket_pool_size 1;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 100 ms",[m
[31m-qr/lua tcp socket connection pool size: 1\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: "lua_socket_keepalive_timeout 0" means unlimited[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 0;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive timeout: unlimited",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: setkeepalive(timeout) overrides lua_socket_keepalive_timeout[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-        keepalive_timeout 60s;[m
[31m-        lua_socket_keepalive_timeout 60s;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(123)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 123 ms",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sock:setkeepalive(timeout, size) overrides lua_socket_pool_size[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-       lua_socket_pool_size 100;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(101, 25)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 101 ms",[m
[31m-qr/lua tcp socket connection pool size: 25\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sock:keepalive_timeout(0) means unlimited[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 1000ms;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(0)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive timeout: unlimited",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: sanity (uds)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen unix:$::HtmlDir/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            echo foo;[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local path = "$TEST_NGINX_HTML_DIR/nginx.sock";[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(path, port)[m
[31m-            test.go(path, port)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(path, port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("unix:" .. path)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "GET /foo HTTP/1.1\r\nHost: localhost\r\nConnection: keepalive\r\n\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local reader = sock:receiveuntil("\r\n0\r\n\r\n")[m
[31m-    local data, err = reader()[m
[31m-[m
[31m-    if not data then[m
[31m-        ngx.say("failed to receive response body: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 61[m
[31m-received response of 119 bytes[m
[31m-connected: 1, reused: 1[m
[31m-request sent: 61[m
[31m-received response of 119 bytes[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- error_log eval[m
[31m-["lua tcp socket get keepalive peer: using connection",[m
[31m-'lua tcp socket keepalive create connection pool for key "unix:'][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #108: ngx.locaiton.capture + redis.set_keepalive[m
[31m---- http_config eval[m
[31m-    qq{[m
[31m-        lua_package_path "$::HtmlDir/?.lua;;";[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        default_type text/html;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #lua_code_cache off;[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua_file html/t.lua;[m
[31m-    }[m
[31m-[m
[31m-    location /anyurl {[m
[31m-        internal;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/dummy;[m
[31m-    }[m
[31m-[m
[31m-    location = /dummy {[m
[31m-        echo dummy;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> t.lua[m
[31m-local sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)[m
[31m-if not sock then ngx.say(err) return end[m
[31m-sock:send("flush_all\r\n")[m
[31m-sock:receive()[m
[31m-sock:setkeepalive()[m
[31m-[m
[31m-sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)[m
[31m-if not sock then ngx.say(err) return end[m
[31m-local res = ngx.location.capture("/anyurl") --3[m
[31m-[m
[31m-ngx.say("ok")[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #110: ngx.exit with HTTP_NOT_FOUND causes worker process to exit[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    error_page 404 /404.html;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        access_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 404.html[m
[31m-Not found, dear...[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.log(ngx.ERR, "failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if not line then[m
[31m-        ngx.log(ngx.ERR, "failed to receive a line: ", err, " [", part, "]")[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    -- local ok, err = sock:setkeepalive()[m
[31m-    -- if not ok then[m
[31m-        -- ngx.log(ngx.ERR, "failed to set reusable: ", err)[m
[31m-        -- return[m
[31m-    -- end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Not found, dear...[m
[31m---- error_code: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: custom pools (different pool for the same host:port) - tcp[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port, "A")[m
[31m-            test.go(port, "B")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 0[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket get keepalive peer: using connection"[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "A"[m
[31m-lua tcp socket keepalive create connection pool for key "B"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: custom pools (same pool for different host:port) - tcp[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, "foo")[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, "foo")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 1[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "foo"[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: custom pools (different pool for the same host:port) - unix[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen unix:$::HtmlDir/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            echo foo;[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local path = "$TEST_NGINX_HTML_DIR/nginx.sock";[m
[31m-            test.go(path, "A")[m
[31m-            test.go(path, "B")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(path, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("unix:" .. path, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 0[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket get keepalive peer: using connection"[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "A"[m
[31m-lua tcp socket keepalive create connection pool for key "B"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: custom pools (same pool for the same path) - unix[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen unix:$::HtmlDir/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local path = "$TEST_NGINX_HTML_DIR/nginx.sock";[m
[31m-            test.go(path, "A")[m
[31m-            test.go(path, "A")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(path, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("unix:" .. path, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 1[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "A"[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: numeric pool option value[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, 3.14)[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, 3.14)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 1[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "3.14"[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: nil pool option value[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, nil)[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, nil)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 0[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: (bad) table pool option value[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, {})[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, {})[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #3 to 'connect' (bad "pool" option type: table)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: (bad) boolean pool option value[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, true)[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, false)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #3 to 'connect' (bad "pool" option type: boolean)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: clear the redis store[m
[31m---- config[m
[31m-    location /t {[m
[31m-        redis2_query flushall;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body eval[m
[31m-"+OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: bug in send(): clear the chain writer ctx[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_REDIS_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send({})[m
[31m-    if err then[m
[31m-        ngx.say("failed to send empty request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "*2\r\n$3\r\nget\r\n$3\r\ndog\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("done")[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active[m
[31m-M(http-lua-socket-tcp-send-start) {[m
[31m-    active = 1[m
[31m-    printf("send [%s] %d\n", text_str(user_string_n($arg3, $arg4)), $arg4)[m
[31m-}[m
[31m-M(http-lua-socket-tcp-receive-done) {[m
[31m-    printf("receive [%s]\n", text_str(user_string_n($arg3, $arg4)))[m
[31m-}[m
[31m-F(ngx_output_chain) {[m
[31m-    #printf("ctx->in: %s\n", ngx_chain_dump($ctx->in))[m
[31m-    #printf("ctx->busy: %s\n", ngx_chain_dump($ctx->busy))[m
[31m-    printf("output chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_linux_sendfile_chain) {[m
[31m-    printf("linux sendfile chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_chain_writer) {[m
[31m-    printf("chain writer ctx out: %p\n", $data)[m
[31m-    printf("nginx chain writer: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_http_lua_socket_tcp_setkeepalive) {[m
[31m-    delete active[m
[31m-}[m
[31m-M(http-lua-socket-tcp-setkeepalive-buf-unread) {[m
[31m-    printf("setkeepalive unread: [%s]\n", text_str(user_string_n($arg3, $arg4)))[m
[31m-}[m
[31m-probe syscall.recvfrom {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf("recvfrom(%s)", argstr)[m
[31m-    }[m
[31m-}[m
[31m-probe syscall.recvfrom.return {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf(" = %s, data [%s]\n", retstr, text_str(user_string_n($ubuf, $size)))[m
[31m-    }[m
[31m-}[m
[31m-probe syscall.writev {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf("writev(%s)", ngx_iovec_dump($vec, $vlen))[m
[31m-        /*[m
[31m-        for (i = 0; i < $vlen; i++) {[m
[31m-            printf(" %p [%s]", $vec[i]->iov_base, text_str(user_string_n($vec[i]->iov_base, $vec[i]->iov_len)))[m
[31m-        }[m
[31m-        */[m
[31m-    }[m
[31m-}[m
[31m-probe syscall.writev.return {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf(" = %s\n", retstr)[m
[31m-    }[m
[31m-}[m
[31m---- response_body[m
[31m-received: $-1[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/069-null.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/069-null.t[m
[1mdeleted file mode 100644[m
[1mindex 7761c91..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/069-null.t[m
[1m+++ /dev/null[m
[36m@@ -1,96 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#log_level('debug');[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1024);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: compare ngx.null with cjson.null[m
[31m---- http_config eval[m
[31m-    "lua_package_cpath '$::LuaCpath';";[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say(cjson.null == ngx.null)[m
[31m-            ngx.say(cjson.encode(ngx.null))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-true[m
[31m-null[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: output ngx.null[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("ngx.null: ", ngx.null)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ngx.null: null[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: output ngx.null in a table[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say({"ngx.null: ", ngx.null})[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ngx.null: null[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: log ngx.null[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            print("ngx.null: ", ngx.null)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log[m
[31m-ngx.null: null[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/070-sha1.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/070-sha1.t[m
[1mdeleted file mode 100644[m
[1mindex 8648a8c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/070-sha1.t[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set sha1 hello[m
[31m---- config[m
[31m-    location = /sha1 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(ngx.sha1_bin("hello")))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-qvTGHdzF6KLavt4PO0gs2a6pQ00=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set sha1 ""[m
[31m---- config[m
[31m-    location = /sha1 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(ngx.sha1_bin("")))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-2jmj7l5rSw0yVb/vlWAYkK/YBwk=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set sha1 nil[m
[31m---- config[m
[31m-    location = /sha1 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(ngx.sha1_bin(nil)))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-2jmj7l5rSw0yVb/vlWAYkK/YBwk=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set sha1 number[m
[31m---- config[m
[31m-    location = /sha1 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(ngx.sha1_bin(512)))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-zgmxJ9SPg4aKRWReJG07UvS97L4=[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/071-idle-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/071-idle-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 55d25c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/071-idle-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,434 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read events come when socket is idle[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("foofoo\\r\\n")[m
[31m-            local line, err, part = reader()[m
[31m-            if line then[m
[31m-                ngx.print("read: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local data, err, part = sock:receive("*a")[m
[31m-            if not data then[m
[31m-                ngx.say("failed to read the 2nd part: ", err)[m
[31m-            else[m
[31m-                ngx.say("2nd part: [", data, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo -n foofoo;[m
[31m-        echo_flush;[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n barbar;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-6\r[m
[31m-2nd part: [6\r[m
[31m-barbar\r[m
[31m-0\r[m
[31m-\r[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read timer cleared in time[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            sock:settimeout(400)[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent again: ", bytes)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-request sent again: 11[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: connect timer cleared in time[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 11[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: send timer cleared in time[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set keepalive when system socket recv buffer has unread data[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("foofoo\\r\\n")[m
[31m-            local line, err, part = reader()[m
[31m-            if line then[m
[31m-                ngx.print("read: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo -n foofoo;[m
[31m-        echo_flush;[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n barbar;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr{connected: 1[m
[31m-request sent: 57[m
[31m-read: HTTP/1\.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-6\r[m
[31m-failed to set keepalive: (?:unread data in buffer|connection in dubious state)[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set keepalive when cosocket recv buffer has unread data[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err = sock:receive(1)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to read the 1st byte: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("read: ", data)[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 11[m
[31m-read: O[m
[31m-failed to set keepalive: unread data in buffer[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/072-conditional-get.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/072-conditional-get.t[m
[1mdeleted file mode 100644[m
[1mindex 4bb567a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/072-conditional-get.t[m
[1m+++ /dev/null[m
[36m@@ -1,91 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: If-Modified-Since true[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m---- error_code: 304[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: If-Modified-Since true[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        if_modified_since before;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:48 GMT"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m---- error_code: 304[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: If-Unmodified-Since false[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        #if_modified_since before;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:48 GMT"[m
[31m-            local ok, err = ngx.say("hello")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "say failed: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Thu, 10 May 2012 07:50:47 GMT[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body_like: 412 Precondition Failed[m
[31m---- error_code: 412[m
[31m---- error_log[m
[31m-say failed: nginx output filter error[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/073-backtrace.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/073-backtrace.t[m
[1mdeleted file mode 100644[m
[1mindex aae4bae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/073-backtrace.t[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 51;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua[m
[31m-        '   function bar()[m
[31m-                return lua_concat(3)[m
[31m-            end[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-            foo()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to call global 'lua_concat'[m
[31m-: in function 'bar'[m
[31m-:5: in function 'foo'[m
[31m-:7: in function[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: error(nil)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua[m
[31m-        '   function bar()[m
[31m-                error(nil)[m
[31m-            end[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-            foo()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua entry thread aborted: runtime error: unknown reason',[m
[31m-'stack traceback:',[m
[31m-" in function 'error'",[m
[31m-": in function 'bar'",[m
[31m-":5: in function 'foo'",[m
[31m-qr/:7: in function <content_by_lua\(nginx\.conf:\d+\):1>/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: deep backtrace in a single coroutine (more than 15)[m
[31m---- config eval[m
[31m-my $s = "[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-";[m
[31m-my $prev;[m
[31m-for my $i (1..18) {[m
[31m-    if (!defined $prev) {[m
[31m-        $s .= "[m
[31m-            local function func$i()[m
[31m-                return error([[blah]])[m
[31m-            end";[m
[31m-    } else {[m
[31m-        $s .= "[m
[31m-            local function func$i()[m
[31m-                local v = func$prev()[m
[31m-                return v[m
[31m-            end";[m
[31m-    }[m
[31m-    $prev = $i;[m
[31m-}[m
[31m-$s .= "[m
[31m-            func$prev()[m
[31m-        ';[m
[31m-    }[m
[31m-";[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2[m
[31m-probe process("$LIBLUA_PATH").function("lua_concat") {[m
[31m-    println("lua concat")[m
[31m-    //print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-: blah[m
[31m-: in function 'func1'[m
[31m-:7: in function 'func2'[m
[31m-:11: in function 'func3'[m
[31m-:15: in function 'func4'[m
[31m-:19: in function 'func5'[m
[31m-:23: in function 'func6'[m
[31m-:27: in function 'func7'[m
[31m-:31: in function 'func8'[m
[31m-:35: in function 'func9'[m
[31m-:39: in function 'func10'[m
[31m-:43: in function 'func11'[m
[31m-:47: in function 'func12'[m
[31m-:51: in function 'func13'[m
[31m-:55: in function 'func14'[m
[31m-:59: in function 'func15'[m
[31m-:63: in function 'func16'[m
[31m-:67: in function 'func17'[m
[31m-:71: in function 'func18'[m
[31m-:74: in function[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: deep backtrace in a single coroutine (more than 22)[m
[31m---- config eval[m
[31m-my $s = "[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-";[m
[31m-my $prev;[m
[31m-for my $i (1..23) {[m
[31m-    if (!defined $prev) {[m
[31m-        $s .= "[m
[31m-            local function func$i()[m
[31m-                return error([[blah]])[m
[31m-            end";[m
[31m-    } else {[m
[31m-        $s .= "[m
[31m-            local function func$i()[m
[31m-                local v = func$prev()[m
[31m-                return v[m
[31m-            end";[m
[31m-    }[m
[31m-    $prev = $i;[m
[31m-}[m
[31m-$s .= "[m
[31m-            func$prev()[m
[31m-        ';[m
[31m-    }[m
[31m-";[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2[m
[31m-probe process("$LIBLUA_PATH").function("lua_concat") {[m
[31m-    println("lua concat")[m
[31m-    //print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-: blah[m
[31m-: in function 'func1'[m
[31m-:7: in function 'func2'[m
[31m-:11: in function 'func3'[m
[31m-:15: in function 'func4'[m
[31m-:19: in function 'func5'[m
[31m-:23: in function 'func6'[m
[31m-:27: in function 'func7'[m
[31m-:31: in function 'func8'[m
[31m-:35: in function 'func9'[m
[31m-:39: in function 'func10'[m
[31m-:43: in function 'func11'[m
[31m-:47: in function 'func12'[m
[31m-:59: in function 'func15'[m
[31m-:63: in function 'func16'[m
[31m-:67: in function 'func17'[m
[31m-:71: in function 'func18'[m
[31m-:75: in function 'func19'[m
[31m-:79: in function 'func20'[m
[31m-:83: in function 'func21'[m
[31m-...[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/074-prefix-var.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/074-prefix-var.t[m
[1mdeleted file mode 100644[m
[1mindex 3cc4587..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/074-prefix-var.t[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: $prefix[m
[31m---- http_config: lua_package_path "$prefix/html/?.lua;;";[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            foo.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("Greetings from module foo.")[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Greetings from module foo.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ${prefix}[m
[31m---- http_config: lua_package_path "${prefix}html/?.lua;;";[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            foo.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("Greetings from module foo.")[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Greetings from module foo.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/075-logby.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/075-logby.t[m
[1mdeleted file mode 100644[m
[1mindex f987c8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/075-logby.t[m
[1m+++ /dev/null[m
[36m@@ -1,584 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 10);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: log_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        log_by_lua 'ngx.log(ngx.ERR, "Hello from log_by_lua: ", ngx.var.uri)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-Hello from log_by_lua: /lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: log_by_lua_file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        log_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.log(ngx.ERR, "Hello from log_by_lua: ", ngx.var.uri)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-Hello from log_by_lua: /lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: log_by_lua_file & content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $counter 3;[m
[31m-        content_by_lua 'ngx.var.counter = ngx.var.counter + 1 ngx.say(ngx.var.counter)';[m
[31m-        log_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.log(ngx.ERR, "Hello from log_by_lua: ", ngx.var.counter * 2)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-4[m
[31m---- error_log[m
[31m-Hello from log_by_lua: 8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.ctx available in log_by_lua (already defined)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.ctx.counter = 3 ngx.say(ngx.ctx.counter)';[m
[31m-        log_by_lua 'ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-3[m
[31m---- error_log[m
[31m-ngx.ctx.counter: 3[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.ctx available in log_by_lua (not defined yet)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)[m
[31m-            ngx.ctx.counter = "hello world"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-ngx.ctx.counter: nil[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: log_by_lua + shared dict[m
[31m---- http_config[m
[31m-    lua_shared_dict foo 100k;[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            local foo = ngx.shared.foo[m
[31m-            local key = ngx.var.uri .. ngx.status[m
[31m-            local newval, err = foo:incr(key, 1)[m
[31m-            if not newval then[m
[31m-                if err == "not found" then[m
[31m-                    foo:add(key, 0)[m
[31m-                    newval, err = foo:incr(key, 1)[m
[31m-                    if not newval then[m
[31m-                        ngx.log(ngx.ERR, "failed to incr ", key, ": ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.log(ngx.ERR, "failed to incr ", key, ": ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            print(key, ": ", foo:get(key))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log eval[m
[31m-qr{/lua200: [12]}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.ctx used in different locations and different ctx (1)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t2 {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.counter = 32[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-ngx.ctx.counter: nil[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.ctx used in different locations and different ctx (2)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t2 {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.counter = 32[m
[31m-            ngx.say(ngx.ctx.counter)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t2[m
[31m---- response_body[m
[31m-32[m
[31m---- error_log[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: lua error (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'error("Bad")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/failed to run log_by_lua\*: log_by_lua\(nginx\.conf:\d+\):1: Bad/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: lua error (nil)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'error(nil)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-failed to run log_by_lua*: unknown reason[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: globals get cleared for every single request[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            if not foo then[m
[31m-                foo = 1[m
[31m-            else[m
[31m-                foo = foo + 1[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-foo = 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: no ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.print(32) return 1";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.say(32) return 1";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: no ngx.flush[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.flush()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: no ngx.eof[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.eof()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: no ngx.send_headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.send_headers()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: no ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.location.capture("/sub")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: no ngx.location.capture_multi[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.location.capture_multi{{"/sub"}}';[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: no ngx.exit[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.exit(0)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: no ngx.redirect[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.redirect("/blah")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: no ngx.exec[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.exec("/blah")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: no ngx.req.set_uri(uri, true)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.req.set_uri("/blah", true)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.req.set_uri(uri) exists[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.req.set_uri("/blah") print("log_by_lua: uri: ", ngx.var.uri)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-log_by_lua: uri: /blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: no ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.req.read_body()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: no ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'return ngx.req.socket()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: no ngx.socket.tcp()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'return ngx.socket.tcp()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: no ngx.socket.connect()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'return ngx.socket.connect("127.0.0.1", 80)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: backtrace[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                error("something bad happened")[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-something bad happened[m
[31m-stack traceback:[m
[31m-in function 'error'[m
[31m-in function 'bar'[m
[31m-in function 'foo'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        log_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: log_by_lua runs before access logging (github issue #254)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        access_log logs/foo.log;[m
[31m-        log_by_lua 'print("hello")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap[m
[31m-F(ngx_http_log_handler) {[m
[31m-    println("log handler")[m
[31m-}[m
[31m-F(ngx_http_lua_log_handler) {[m
[31m-    println("lua log handler")[m
[31m-}[m
[31m---- stap_out[m
[31m-lua log handler[m
[31m-log handler[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: reading ngx.header.HEADER in log_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "content-type: ", ngx.header.content_type)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr{log_by_lua\(nginx\.conf:\d+\):1: content-type: text/plain}[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/076-no-postpone.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/076-no-postpone.t[m
[1mdeleted file mode 100644[m
[1mindex 94da63a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/076-no-postpone.t[m
[1m+++ /dev/null[m
[36m@@ -1,146 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rewrite no postpone on[m
[31m---- http_config[m
[31m-    rewrite_by_lua_no_postpone on;[m
[31m---- config[m
[31m-    set $foo '';[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.foo = 1[m
[31m-        ';[m
[31m-        if ($foo = 1) {[m
[31m-            echo "foo: $foo";[m
[31m-        }[m
[31m-        echo "no foo: $foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-foo: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rewrite no postpone explicitly off[m
[31m---- http_config[m
[31m-    rewrite_by_lua_no_postpone off;[m
[31m---- config[m
[31m-    set $foo '';[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.foo = 1[m
[31m-        ';[m
[31m-        if ($foo = 1) {[m
[31m-            echo "foo: $foo";[m
[31m-        }[m
[31m-        echo "no foo: $foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-no foo: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rewrite no postpone off by default[m
[31m---- config[m
[31m-    set $foo '';[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.foo = 1[m
[31m-        ';[m
[31m-        if ($foo = 1) {[m
[31m-            echo "foo: $foo";[m
[31m-        }[m
[31m-        echo "no foo: $foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-no foo: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: access no postpone on[m
[31m---- http_config[m
[31m-    access_by_lua_no_postpone on;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-        deny all;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: access no postpone explicitly off[m
[31m---- http_config[m
[31m-    access_by_lua_no_postpone off;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-        deny all;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: access no postpone off by default[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-        deny all;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/077-sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/077-sleep.t[m
[1mdeleted file mode 100644[m
[1mindex a7c251a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/077-sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,407 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 63;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep 0.5 - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep(0.5)[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-5]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m-lua sleep timer expired: "/test?"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep a - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep("a")[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep 0.5 in subrequest - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            local now = ngx.now()[m
[31m-            local delay = now - before[m
[31m-            ngx.say(delay)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        content_by_lua 'ngx.sleep(0.5)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-9]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/sleep?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sleep a in subrequest with bad argument[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sleep");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        content_by_lua 'ngx.sleep("a")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like:[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sleep 0.33 - multi-times in content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local start = ngx.now()[m
[31m-            ngx.sleep(0.33)[m
[31m-            ngx.sleep(0.33)[m
[31m-            ngx.sleep(0.33)[m
[31m-            ngx.say(ngx.now() - start)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^(?:0\.9\d*|1\.[0-2]\d*|1)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: sleep 0.5 - interleaved by ngx.say() - ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(1)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m---- error_log[m
[31m-lua ready to sleep[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sleep 0.5 - interleaved by ngx.say() - not ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(0.5)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m-hiya[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.location.capture before and after ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /hello {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m-    location = /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sleep 0[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep(0)[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say("elapsed: ", now - before)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-elapsed: 0[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.sleep unavailable in log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            ngx.sleep(0.1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.sleep() fails to yield (xpcall err handler)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                return error(1)[m
[31m-            end[m
[31m-            local function err()[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-            xpcall(f, err)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-lua clean up the timer for pending ngx.sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.sleep() fails to yield (require)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            package.loaded["foosleep"] = nil[m
[31m-            require "foosleep";[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- user_files[m
[31m->>> foosleep.lua[m
[31m-ngx.sleep(0.001)[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- wait: 0.2[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua clean up the timer for pending ngx.sleep",[m
[31m-qr{runtime error: attempt to yield across (?:metamethod/)?C-call boundary},[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: sleep coctx handler did not get called in ngx.exit().[m
[31m---- config[m
[31m-    location /t {[m
[31m-         content_by_lua "[m
[31m-            local function sleep(t)[m
[31m-                --- nginx return reply to client without waiting[m
[31m-                ngx.sleep(t)[m
[31m-            end[m
[31m-[m
[31m-            local function wait()[m
[31m-                 --- worker would crash afterwards[m
[31m-                 xpcall(function () error(1) end, function() return sleep(0.001) end)[m
[31m-                 --- ngx.exit was required to crash worker[m
[31m-                 ngx.exit(200)[m
[31m-            end[m
[31m-[m
[31m-            wait()[m
[31m-         ";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: sleep coctx handler did not get called in ngx.exec().[m
[31m---- config[m
[31m-    location /t {[m
[31m-         content_by_lua '[m
[31m-            local function sleep(t)[m
[31m-                --- nginx return reply to client without waiting[m
[31m-                ngx.sleep(t)[m
[31m-            end[m
[31m-[m
[31m-            local function wait()[m
[31m-                 --- worker would crash afterwards[m
[31m-                 xpcall(function () error(1) end, function() return sleep(0.001) end)[m
[31m-                 --- ngx.exit was required to crash worker[m
[31m-                 ngx.exec("/dummy")[m
[31m-            end[m
[31m-[m
[31m-            wait()[m
[31m-         ';[m
[31m-    }[m
[31m-[m
[31m-    location /dummy {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: sleep coctx handler did not get called in ngx.req.set_uri(uri, true).[m
[31m---- config[m
[31m-    location /t {[m
[31m-         rewrite_by_lua '[m
[31m-            local function sleep(t)[m
[31m-                --- nginx return reply to client without waiting[m
[31m-                ngx.sleep(t)[m
[31m-            end[m
[31m-[m
[31m-            local function wait()[m
[31m-                 --- worker would crash afterwards[m
[31m-                 xpcall(function () error(1) end, function() return sleep(0.001) end)[m
[31m-                 --- ngx.exit was required to crash worker[m
[31m-                 ngx.req.set_uri("/dummy", true)[m
[31m-            end[m
[31m-[m
[31m-            wait()[m
[31m-         ';[m
[31m-    }[m
[31m-[m
[31m-    location /dummy {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/078-hup-vars.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/078-hup-vars.t[m
[1mdeleted file mode 100644[m
[1mindex 8acc346..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/078-hup-vars.t[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-our $SkipReason;[m
[31m-[m
[31m-BEGIN {[m
[31m-    if ($ENV{TEST_NGINX_CHECK_LEAK}) {[m
[31m-        $SkipReason = "unavailable for the hup tests";[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{TEST_NGINX_USE_HUP} = 1;[m
[31m-        undef $ENV{TEST_NGINX_USE_STAP};[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua $SkipReason ? (skip_all => $SkipReason) : ();[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: nginx variable hup bug (step 1)[m
[31m-http://mailman.nginx.org/pipermail/nginx-devel/2012-May/002223.html[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $vv $http_host;[m
[31m-        set_by_lua $i 'return ngx.var.http_host';[m
[31m-        echo $i;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-localhost[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nginx variable hup bug (step 2)[m
[31m-http://mailman.nginx.org/pipermail/nginx-devel/2012-May/002223.html[m
[31m---- config[m
[31m-    location /t {[m
[31m-        #set $vv $http_host;[m
[31m-        set_by_lua $i 'return ngx.var.http_host';[m
[31m-        echo $i;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-localhost[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/079-unused-directives.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/079-unused-directives.t[m
[1mdeleted file mode 100644[m
[1mindex cba0e41..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/079-unused-directives.t[m
[1m+++ /dev/null[m
[36m@@ -1,343 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 110;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rewrite_by_lua unused[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set_by_lua $i 'return 32';[m
[31m-        #rewrite_by_lua return;[m
[31m-        echo $i;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rewrite_by_lua used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m---- no_error_log[m
[31m-lua access handler, uri:"/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: access_by_lua used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua access handler, uri:"/t" c:1[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m---- no_error_log[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: content_by_lua used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua 'ngx.say("hello")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua content handler, uri:"/t" c:1[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m---- no_error_log[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: header_filter_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua log handler, uri:"/t"[m
[31m---- no_error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: body_filter_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: header_filter_by_lua_file[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua log handler, uri:"/t"[m
[31m---- no_error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: body_filter_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: header_filter_by_lua with multiple http blocks (github issue #294)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.status = 201[m
[31m-            ngx.header.Foo = "foo"[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-Foo: foo[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_code: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: body_filter_by_lua in multiple http blocks (github issue #294)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo -n ok;[m
[31m-        body_filter_by_lua '[m
[31m-            if ngx.arg[2] then[m
[31m-                ngx.arg[1] = ngx.arg[1] .. "ay\\n"[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-okay[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: capture filter with multiple http blocks (github issue #294)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        echo -n sub;[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sub: sub[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/080-hup-shdict.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/080-hup-shdict.t[m
[1mdeleted file mode 100644[m
[1mindex f9a0278..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/080-hup-shdict.t[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-our $SkipReason;[m
[31m-[m
[31m-BEGIN {[m
[31m-    if ($ENV{TEST_NGINX_CHECK_LEAK}) {[m
[31m-        $SkipReason = "unavailable for the hup tests";[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{TEST_NGINX_USE_HUP} = 1;[m
[31m-        undef $ENV{TEST_NGINX_USE_STAP};[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua $SkipReason ? (skip_all => $SkipReason) : ();[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: initialize the fields in shdict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: retrieve the fields in shdict after HUP reload[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            -- dogs:set("foo", 32)[m
[31m-            -- dogs:set("bah", 10502)[m
[31m-[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/081-bytecode.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/081-bytecode.t[m
[1mdeleted file mode 100644[m
[1mindex cb50e94..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/081-bytecode.t[m
[1m+++ /dev/null[m
[36m@@ -1,373 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bytecode ("ngx.say('hello');")[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            if jit then[m
[31m-                if not string.find(jit.version, "LuaJIT 2.0") then[m
[31m-                    ngx.say("test skipped")[m
[31m-                    return[m
[31m-                end[m
[31m-                f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x01\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x02\x29\x02\x00\x02\x00\x03\x00\x05\x34\x00\x00\x00\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body_like chop[m
[31m-^(?:hello|test skipped)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: luajit load lua bytecode or lua load luajit bytecode[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            if not package.loaded["jit"] then[m
[31m-                f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            if res.status == 200 then[m
[31m-                ngx.print(res.body)[m
[31m-            else[m
[31m-                ngx.say("error")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x01\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x02\x29\x02\x00\x02\x00\x03\x00\x05\x34\x00\x00\x00\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body[m
[31m-error[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test\.lua": bad byte-code header/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unknown bytecode version[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            if package.loaded["jit"] then[m
[31m-                f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            if res.status == 200 then[m
[31m-                ngx.print(res.body)[m
[31m-            else[m
[31m-                ngx.say("error")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x52\x00\x01\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x80\x02\x29\x02\x00\x02\x00\x03\x00\x05\x34\x00\x00\x00\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body[m
[31m-error[m
[31m---- error_log[m
[31m-bytecode format version unsupported[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bytecode (big endian)[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            local do_jit[m
[31m-            if jit then[m
[31m-                if not string.find(jit.version, "LuaJIT 2.0") then[m
[31m-                    ngx.say("test skipped")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                do_jit = true; f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            if do_jit and res.status == 200 then[m
[31m-                ngx.say("ok")[m
[31m-            elseif not do_jit and res.status == 500 then[m
[31m-                ngx.say("ok")[m
[31m-            else[m
[31m-                ngx.say("error")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x00\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x03\x29\x02\x00\x02\x00\x03\x00\x05\x00\x00\x00\x34\x00\x01\x00\x37\x00\x02\x01\x25\x01\x02\x00\x3e\x00\x01\x00\x47\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body_like chop[m
[31m-^(?:ok|test skipped)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: good header but bad body[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            local jit;[m
[31m-            if package.loaded["jit"] then[m
[31m-                jit = true;[m
[31m-                f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            if not jit then[m
[31m-                f:close(); res = ngx.location.capture("/call");[m
[31m-                if res.status == 200 then[m
[31m-                    ngx.print("ok")[m
[31m-                else[m
[31m-                    ngx.say("error")[m
[31m-                end[m
[31m-            else[m
[31m-            -- luajit will get a segmentation fault with bad bytecode,[m
[31m-            -- so here just skip this case for luajit[m
[31m-                ngx.say("error")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x01\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\xff\xff\xff\xff\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x02\x29\x02\x00\x02\x00\x03\x00\x05\xff\xff\xff\xff\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body[m
[31m-error[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: stripped(lua) & no stripped(luajit)[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            if jit then[m
[31m-                if not string.find(jit.version, "LuaJIT 2.0") then[m
[31m-                    ngx.say("test skipped")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                f:write(string.sub(b, 119));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 117));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x01\x04\x08\x04\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x00\x09\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x32\x02\x00\x02\x00\x03\x00\x05\x06\x00\x02\x34\x00\x00\x00\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x01\x01\x01\x01\x01\x00\x00"[m
[31m---- response_body_like chop[m
[31m-^(?:hello|test skipped)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: generate & load bytecode for LuaJIT (stripped)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local bcsave = require "jit.bcsave"[m
[31m-            if jit then[m
[31m-                local prefix = ngx.config.prefix()[m
[31m-                local infile = prefix .. "html/a.lua"[m
[31m-                local outfile = prefix .. "html/a.luac"[m
[31m-                bcsave.start("-s", infile, outfile)[m
[31m-                return ngx.exec("/call")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("test skipped!")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /call {[m
[31m-        content_by_lua_file html/a.luac;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.status = 201 ngx.say("hello from Lua!")[m
[31m---- response_body_like chop[m
[31m-^(?:hello from Lua!|test skipped!)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: generate & load bytecode for LuaJIT (not stripped)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local bcsave = require "jit.bcsave"[m
[31m-            if jit then[m
[31m-                local prefix = ngx.config.prefix()[m
[31m-                local infile = prefix .. "html/a.lua"[m
[31m-                local outfile = prefix .. "html/a.luac"[m
[31m-                bcsave.start("-g", infile, outfile)[m
[31m-                return ngx.exec("/call")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("test skipped!")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /call {[m
[31m-        content_by_lua_file html/a.luac;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.status = 201 ngx.say("hello from Lua!")[m
[31m---- response_body_like chop[m
[31m-^(?:hello from Lua!|test skipped!)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bytecode (not stripped)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local f = assert(loadstring("a = a and a + 1 or 1 ngx.say('a = ', a)", "=code"))[m
[31m-            local bc = string.dump(f)[m
[31m-            local f = assert(io.open("t/servroot/html/a.luac", "w"))[m
[31m-            f:write(bc)[m
[31m-            f:close()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        content_by_lua_file html/a.luac;[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        echo_location /t;[m
[31m-        echo_location /t2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-a = 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bytecode (stripped)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local f = assert(loadstring("a = a and a + 1 or 1 ngx.say('a = ', a)", "=code"))[m
[31m-            local bc = string.dump(f, true)[m
[31m-            local f = assert(io.open("t/servroot/html/a.luac", "w"))[m
[31m-            f:write(bc)[m
[31m-            f:close()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        content_by_lua_file html/a.luac;[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        echo_location /t;[m
[31m-        echo_location /t2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-a = 1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/082-body-filter.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/082-body-filter.t[m
[1mdeleted file mode 100644[m
[1mindex 98efa84..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/082-body-filter.t[m
[1m+++ /dev/null[m
[36m@@ -1,839 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 11);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read chunks (inline)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo -n hello world;[m
[31m-        echo -n hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            print("chunk: [", chunk, "], eof: ", eof)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body chop[m
[31m-hello worldhiya globe[m
[31m---- error_log[m
[31m-chunk: [hello world], eof: false[m
[31m-chunk: [hiya globe], eof: false[m
[31m-chunk: [], eof: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read chunks (file)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo -n hello world;[m
[31m-        echo -n hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-print("chunk: [", chunk, "], eof: ", eof)[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body chop[m
[31m-hello worldhiya globe[m
[31m---- error_log[m
[31m-chunk: [hello world], eof: false[m
[31m-chunk: [hiya globe], eof: false[m
[31m-chunk: [], eof: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read chunks (user module)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo -n hello world;[m
[31m-        echo -n hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            foo.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    -- ngx.say("Hello")[m
[31m-    local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-    print("chunk: [", chunk, "], eof: ", eof)[m
[31m-end[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body chop[m
[31m-hello worldhiya globe[m
[31m---- error_log[m
[31m-chunk: [hello world], eof: false[m
[31m-chunk: [hiya globe], eof: false[m
[31m-chunk: [], eof: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rewrite chunks (upper all)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = string.upper(ngx.arg[1])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-HELLO WORLD[m
[31m-HIYA GLOBE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: rewrite chunks (truncate data)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk = ngx.arg[1][m
[31m-            if string.match(chunk, "hello") then[m
[31m-                ngx.arg[1] = string.upper(chunk)[m
[31m-                ngx.arg[2] = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-HELLO WORLD[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set eof back and forth[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk = ngx.arg[1][m
[31m-            if string.match(chunk, "hello") then[m
[31m-                ngx.arg[1] = string.upper(chunk)[m
[31m-                ngx.arg[2] = true[m
[31m-                ngx.arg[2] = false[m
[31m-                ngx.arg[2] = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-            ngx.arg[2] = true[m
[31m-            ngx.arg[2] = false[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-HELLO WORLD[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set eof to original[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            ngx.arg[2] = eof[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m-hiya globe[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set eof to original[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            ngx.arg[2] = eof[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m-hiya globe[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: fully buffered output (string scalar)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            local buf = ngx.ctx.buf[m
[31m-[m
[31m-            if eof then[m
[31m-                if buf then[m
[31m-                    ngx.arg[1] = "[" .. buf .. chunk .. "]"[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if buf then[m
[31m-                ngx.ctx.buf = buf .. chunk[m
[31m-            else[m
[31m-                ngx.ctx.buf = chunk[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chop[m
[31m-[hello world[m
[31m-hiya globe[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: fully buffered output (string table)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            local buf = ngx.ctx.buf[m
[31m-[m
[31m-            if eof then[m
[31m-                if buf then[m
[31m-                    ngx.arg[1] = {"[", buf, chunk, "]"}[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if buf then[m
[31m-                ngx.ctx.buf = {buf, chunk}[m
[31m-            else[m
[31m-                ngx.ctx.buf = chunk[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chop[m
[31m-[hello world[m
[31m-hiya globe[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abort via user error (string)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo_flush;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            if eof then[m
[31m-                error("something bad happened!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to run body_filter_by_lua*: body_filter_by_lua:4: something bad happened![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: abort via user error (nil)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo_flush;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            if eof then[m
[31m-                error(nil)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to run body_filter_by_lua*: unknown reason[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: abort via return NGX_ERROR[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo_flush;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            if eof then[m
[31m-                return ngx.ERROR[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: using body_filter_by_lua and header_filter_by_lua at the same time[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 12[m
[31m-            ngx.say("Hello World")[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = ngx.arg[1] .. "aaa"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chop[m
[31m-Hello World[m
[31m-aaaaaa[m
[31m---- response_headers[m
[31m-!content-length[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: table arguments to ngx.arg[1] (github issue #54)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n hello;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            if ngx.arg[1] ~= "" then[m
[31m-                ngx.arg[1] = {{ngx.arg[1]}, "!", "\\n"}[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: fully buffered output (string scalar, buffering to disk by ngx_proxy)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/stub;[m
[31m-        proxy_buffers 2 256;[m
[31m-        proxy_busy_buffers_size 256;[m
[31m-        proxy_buffer_size 256;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            local buf = ngx.ctx.buf[m
[31m-[m
[31m-            if eof then[m
[31m-                if buf then[m
[31m-                    ngx.arg[1] = "[" .. buf .. chunk .. "]"[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if buf then[m
[31m-                ngx.ctx.buf = buf .. chunk[m
[31m-            else[m
[31m-                ngx.ctx.buf = chunk[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /stub {[m
[31m-        echo_duplicate 512 "a";[m
[31m-        echo_duplicate 512 "b";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"[" . ("a" x 512) . ("b" x 512) . "]";[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: backtrace[m
[31m---- config[m
[31m-    location /t {[m
[31m-        body_filter_by_lua '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                error("something bad happened")[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-        ';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-something bad happened[m
[31m-stack traceback:[m
[31m-in function 'error'[m
[31m-in function 'bar'[m
[31m-in function 'foo'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: setting "eof" in subrequests[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_location /read;[m
[31m-        echo_location /read;[m
[31m-    }[m
[31m-[m
[31m-    location /read {[m
[31m-        echo -n hello world;[m
[31m-        echo -n hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[2] = 1[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chop[m
[31m-hello worldhello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        body_filter_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: overwrite eof[m
[31m---- config[m
[31m-    location /read {[m
[31m-        return 200 "hello world";[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            if eof then[m
[31m-                ngx.arg[2] = false[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/read")[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-truncated: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: zero-size bufs[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = ""[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: body filter + ngx.say() (github issue #386)[m
[31m---- config[m
[31m-    postpone_output 1;[m
[31m-    location = /t {[m
[31m-        header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            -- do return end[m
[31m-            if not ngx.ctx.chunks then[m
[31m-                ngx.ctx.chunks = {}[m
[31m-            end[m
[31m-[m
[31m-            table.insert(ngx.ctx.chunks, ngx.arg[1])[m
[31m-            print("got chunk ", ngx.arg[1])[m
[31m-            ngx.arg[1] = nil[m
[31m-[m
[31m-            if ngx.arg[2] then[m
[31m-                print("seen eof: ", string.upper(table.concat(ngx.ctx.chunks)))[m
[31m-                ngx.arg[1] = string.upper(table.concat(ngx.ctx.chunks))[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 10 do[m
[31m-                assert(ngx.say("hello world"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"HELLO WORLD\n" x 10[m
[31m-[m
[31m---- stap2[m
[31m-global active = 1[m
[31m-F(ngx_http_lua_body_filter_by_chunk) {[m
[31m-    printf("body filter by lua: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_write_filter) {[m
[31m-    printf("write filter: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_output_chain) {[m
[31m-    #printf("ctx->in: %s\n", ngx_chain_dump($ctx->in))[m
[31m-    #printf("ctx->busy: %s\n", ngx_chain_dump($ctx->busy))[m
[31m-    printf("output chain %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_linux_sendfile_chain) {[m
[31m-    printf("linux sendfile chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_chain_writer) {[m
[31m-    printf("chain writer ctx out: %p\n", $data)[m
[31m-    printf("nginx chain writer: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-probe syscall.writev {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf("writev(%s)", ngx_iovec_dump($vec, $vlen))[m
[31m-        /*[m
[31m-        for (i = 0; i < $vlen; i++) {[m
[31m-            printf(" %p [%s]", $vec[i]->iov_base, text_str(user_string_n($vec[i]->iov_base, $vec[i]->iov_len)))[m
[31m-        }[m
[31m-        */[m
[31m-    }[m
[31m-}[m
[31m-probe syscall.writev.return {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf(" = %s\n", retstr)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: body filter + ngx.say() (github issue #386), with flush[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            -- do return end[m
[31m-            if not ngx.ctx.chunks then[m
[31m-                ngx.ctx.chunks = {}[m
[31m-            end[m
[31m-[m
[31m-            table.insert(ngx.ctx.chunks, ngx.arg[1])[m
[31m-            print("got chunk ", ngx.arg[1])[m
[31m-            ngx.arg[1] = nil[m
[31m-[m
[31m-            if ngx.arg[2] then[m
[31m-                print("seen eof: ", string.upper(table.concat(ngx.ctx.chunks)))[m
[31m-                ngx.arg[1] = string.upper(table.concat(ngx.ctx.chunks))[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 10 do[m
[31m-                assert(ngx.say("hello world"))[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"HELLO WORLD\n" x 10[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_write_filter) {[m
[31m-    for (cl = $in; cl; cl = @cast(cl, "ngx_chain_t")->next) {[m
[31m-        if (@cast(cl, "ngx_chain_t")->buf->flush) {[m
[31m-            printf("seen flush buf.\n")[m
[31m-        }[m
[31m-[m
[31m-        if (@cast(cl, "ngx_chain_t")->buf->last_buf) {[m
[31m-            printf("seen last buf.\n")[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out_like eval[m
[31m-qr/^(?:seen flush buf\.[m
[31m-){10,}seen last buf\.[m
[31m-$/[m
[31m-[m
[31m---- stap2[m
[31m-global active = 1[m
[31m-F(ngx_http_lua_body_filter_by_chunk) {[m
[31m-    printf("body filter by lua: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_write_filter) {[m
[31m-    printf("write filter: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_charset_body_filter) {[m
[31m-    printf("charset body filter: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_output_chain) {[m
[31m-    #printf("ctx->in: %s\n", ngx_chain_dump($ctx->in))[m
[31m-    #printf("ctx->busy: %s\n", ngx_chain_dump($ctx->busy))[m
[31m-    printf("output chain %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_linux_sendfile_chain) {[m
[31m-    printf("linux sendfile chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_chain_writer) {[m
[31m-    printf("chain writer ctx out: %p\n", $data)[m
[31m-    printf("nginx chain writer: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-probe syscall.writev {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf("writev(%s)", ngx_iovec_dump($vec, $vlen))[m
[31m-        /*[m
[31m-        for (i = 0; i < $vlen; i++) {[m
[31m-            printf(" %p [%s]", $vec[i]->iov_base, text_str(user_string_n($vec[i]->iov_base, $vec[i]->iov_len)))[m
[31m-        }[m
[31m-        */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.writev.return {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf(" = %s\n", retstr)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: clear ngx.arg[1] and then read it[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = nil[m
[31m-            local data = ngx.arg[1][m
[31m-            print([[data chunk: "]], data, [["]])[m
[31m-[m
[31m-            ngx.arg[1] = ""[m
[31m-            data = ngx.arg[1][m
[31m-            print([[data chunk 2: "]], data, [["]])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/data chunk(?: \d+)?: [^,]+/[m
[31m---- grep_error_log_out[m
[31m-data chunk: ""[m
[31m-data chunk 2: ""[m
[31m-data chunk: ""[m
[31m-data chunk 2: ""[m
[31m-data chunk: ""[m
[31m-data chunk 2: ""[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: clear ngx.arg[1] and then read ngx.arg[2][m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = nil[m
[31m-            local eof = ngx.arg[2][m
[31m-            print([[eof: ]], eof)[m
[31m-[m
[31m-            ngx.arg[1] = ""[m
[31m-            eof = ngx.arg[2][m
[31m-            print([[eof 2: ]], eof)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/eof(?: \d+)?: [^,]+/[m
[31m---- grep_error_log_out[m
[31m-eof: false[m
[31m-eof 2: false[m
[31m-eof: false[m
[31m-eof 2: false[m
[31m-eof: true[m
[31m-eof 2: true[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: no ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        body_filter_by_lua "ngx.print(32) return 1";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of body_filter_by_lua*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/083-bad-sock-self.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/083-bad-sock-self.t[m
[1mdeleted file mode 100644[m
[1mindex b93849f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/083-bad-sock-self.t[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: receive[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            sock.receive("l")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    POST /t[m
[31m---- more_headers: Content-Length: 1024[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'receive' (table expected, got string)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: receiveuntil[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            sock.receiveuntil(32, "ab")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    POST /t[m
[31m---- more_headers: Content-Length: 1024[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'receiveuntil' (table expected, got number)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: send (bad arg number)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.send("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-expecting 2 arguments (including the object), but got 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: send (bad self)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.send("hello", 32)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (table expected, got string)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: getreusedtimes (bad self)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.getreusedtimes(2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'getreusedtimes' (table expected, got number)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: close (bad self)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.close(2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'close' (table expected, got number)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: setkeepalive (bad self)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.setkeepalive(2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'setkeepalive' (table expected, got number)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/084-inclusive-receiveuntil.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/084-inclusive-receiveuntil.t[m
[1mdeleted file mode 100644[m
[1mindex c966015..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/084-inclusive-receiveuntil.t[m
[1m+++ /dev/null[m
[36m@@ -1,746 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ambiguous boundary patterns (abcabd) - inclusive mode[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabd", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcabdabcabd;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabcabd[m
[31m-read: abcabd[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ambiguous boundary patterns (abcabdabcabe 4) - inclusive mode[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo ababcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: ababcabdabcabe[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ambiguous boundary patterns (abcabd) - inclusive mode - small buffers[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabd", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcabdabcabd;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabcabd[m
[31m-read: abcabd[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: inclusive option value nil[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = nil })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabc[m
[31m-failed to read a line: closed [d[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: inclusive option value false[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = false })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabc[m
[31m-failed to read a line: closed [d[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: inclusive option value true (aa)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabcaa[m
[31m-failed to read a line: closed [d[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: bad inclusive option value type[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = "true" })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad "inclusive" option value type: string[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: bad option table[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = "true" })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad "inclusive" option value type: string[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ambiguous boundary patterns (--abc), small buffer[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read: o, w[m
[31m-read: orld[m
[31m-read:  --[m
[31m-read: --abc[m
[31m-failed to read a line: nil [nil][m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ambiguous boundary patterns (--abc), small buffer, mixed by other reading calls[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a chunk: ", err, " [", part, "]")[m
[31m-                end[m
[31m-[m
[31m-                local data, err, part = sock:receive(1)[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to read a byte: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                else[m
[31m-                    ngx.say("read one byte: ", data)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read one byte: o[m
[31m-read: , wo[m
[31m-read one byte: r[m
[31m-read: ld -[m
[31m-read one byte: -[m
[31m-read: --abc[m
[31m-read one byte: [m
[31m-[m
[31m-failed to read a chunk: nil [nil][m
[31m-failed to read a byte: closed [][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/085-if.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/085-if.t[m
[1mdeleted file mode 100644[m
[1mindex e08b43c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/085-if.t[m
[1m+++ /dev/null[m
[36m@@ -1,201 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set_by_lua (if fails)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true $arg_a;[m
[31m-        if ($true) {[m
[31m-            set_by_lua $true 'return tonumber(ngx.var["true"]) + 1';[m
[31m-            break;[m
[31m-        }[m
[31m-        set $true "empty";[m
[31m-[m
[31m-        echo "[$true]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-[empty][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set_by_lua (if true)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true $arg_a;[m
[31m-        if ($true) {[m
[31m-            set_by_lua $true 'return tonumber(ngx.var["true"]) + 1';[m
[31m-            break;[m
[31m-        }[m
[31m-        set $true "blah";[m
[31m-[m
[31m-        echo "[$true]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t?a=2[m
[31m---- response_body[m
[31m-[3][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: content_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        content_by_lua 'ngx.say("hello world")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rewrite_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        rewrite_by_lua 'ngx.say("hello world") ngx.exit(200)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: access_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        access_by_lua 'ngx.say("hello world") ngx.exit(200)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: log_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "from log by lua")';[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-from log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: header_filter_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        header_filter_by_lua 'ngx.header.Foo = "bah"';[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- response_headers[m
[31m-Foo: bah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: body_filter_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        body_filter_by_lua 'ngx.arg[1] = string.upper(ngx.arg[1])';[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-HELLO WORLD[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: if is evil for ngx_proxy[m
[31m-This test case requires the following patch for the nginx core:[m
[31m-http://mailman.nginx.org/pipermail/nginx-devel/2012-June/002374.html[m
[31m---- config[m
[31m-    location /proxy-pass-uri {[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT/;[m
[31m-[m
[31m-        set $true 1;[m
[31m-[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /proxy-pass-uri[m
[31m---- response_body_like: It works![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/086-init-by.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/086-init-by.t[m
[1mdeleted file mode 100644[m
[1mindex 3a474fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/086-init-by.t[m
[1m+++ /dev/null[m
[36m@@ -1,306 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity (inline)[m
[31m---- http_config[m
[31m-    init_by_lua 'foo = "hello, FOO"';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say(foo)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello, FOO[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (file)[m
[31m---- http_config[m
[31m-    init_by_lua_file html/init.lua;[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say(foo)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> init.lua[m
[31m-foo = "hello, FOO"[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello, FOO[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: require[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-    init_by_lua 'require "blah"';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            blah.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.lua[m
[31m-module(..., package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("hello, blah")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello, blah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: shdict (single)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    init_by_lua '[m
[31m-        local dogs = ngx.shared.dogs[m
[31m-        dogs:set("Jim", 6)[m
[31m-        dogs:get("Jim")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            ngx.say("Jim: ", dogs:get("Jim"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Jim: 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: shdict (multi)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m-    init_by_lua '[m
[31m-        local dogs = ngx.shared.dogs[m
[31m-        dogs:set("Jim", 6)[m
[31m-        dogs:get("Jim")[m
[31m-        local cats = ngx.shared.cats[m
[31m-        cats:set("Tom", 2)[m
[31m-        dogs:get("Tom")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            ngx.say("Jim: ", dogs:get("Jim"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Jim: 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: print[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m-    init_by_lua '[m
[31m-        print("log from init_by_lua")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log chop[m
[31m-log from init_by_lua[m
[31m---- grep_error_log_out eval[m
[31m-["log from init_by_lua\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.log[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m-    init_by_lua '[m
[31m-        ngx.log(ngx.NOTICE, "log from init_by_lua")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log chop[m
[31m-log from init_by_lua[m
[31m---- grep_error_log_out eval[m
[31m-["log from init_by_lua\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: require (with shm defined)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    init_by_lua 'require "blah"';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            blah.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.lua[m
[31m-module(..., package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("hello, blah")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello, blah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: coroutine API (inlined init_by_lua)[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        local function f()[m
[31m-            foo = 32[m
[31m-            coroutine.yield(78)[m
[31m-            bar = coroutine.status(coroutine.running())[m
[31m-        end[m
[31m-        local co = coroutine.create(f)[m
[31m-        local ok, err = coroutine.resume(co)[m
[31m-        if not ok then[m
[31m-            print("Failed to resume our co: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        baz = err[m
[31m-        coroutine.resume(co)[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-            ngx.say("bar = ", bar)[m
[31m-            ngx.say("baz = ", baz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-foo = 32[m
[31m-bar = running[m
[31m-baz = 78[m
[31m---- no_error_log[m
[31m-[error][m
[31m-Failed to resume our co: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: coroutine API (init_by_lua_file)[m
[31m---- http_config[m
[31m-    init_by_lua_file html/init.lua;[m
[31m-[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-            ngx.say("bar = ", bar)[m
[31m-            ngx.say("baz = ", baz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- user_files[m
[31m->>> init.lua[m
[31m-local function f()[m
[31m-    foo = 32[m
[31m-    coroutine.yield(78)[m
[31m-    bar = coroutine.status(coroutine.running())[m
[31m-end[m
[31m-local co = coroutine.create(f)[m
[31m-local ok, err = coroutine.resume(co)[m
[31m-if not ok then[m
[31m-    print("Failed to resume our co: ", err)[m
[31m-    return[m
[31m-end[m
[31m-baz = err[m
[31m-coroutine.resume(co)[m
[31m-[m
[31m---- response_body[m
[31m-foo = 32[m
[31m-bar = running[m
[31m-baz = 78[m
[31m---- no_error_log[m
[31m-[error][m
[31m-Failed to resume our co: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: access a field in the ngx. table[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        print("INIT 1: foo = ", ngx.foo)[m
[31m-        ngx.foo = 3[m
[31m-        print("INIT 2: foo = ", ngx.foo)[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/INIT \d+: foo = \S+/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"INIT 1: foo = nil[m
[31m-INIT 2: foo = 3[m
[31m-",[m
[31m-"",[m
[31m-][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/087-udp-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/087-udp-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 79ba452..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/087-udp-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,1103 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 13);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected\nreceived 12 bytes: \x{00}\x{01}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua udp socket receive buffer size: 8192[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multiple parallel queries[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            req = "\\0\\2\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.05)[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("1: received ", #data, " bytes: ", data)[m
[31m-[m
[31m-            data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("2: received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-"^connected\n"[m
[31m-."1: received 12 bytes: "[m
[31m-."\x{00}[\1\2]\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m-."2: received 12 bytes: "[m
[31m-."\x{00}[\1\2]\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}\$"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: access a TCP interface[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected[m
[31m-failed to receive data: connection refused[m
[31m---- error_log eval[m
[31m-qr/recv\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: access conflicts of connect() on shared udp objects[m
[31m---- http_config[m
[31m-    lua_package_path '$prefix/html/?.lua;;';[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local reqs = {}[m
[31m-            for i = 1, 170 do[m
[31m-                table.insert(reqs, {"/t"})[m
[31m-            end[m
[31m-            local resps = {ngx.location.capture_multi(reqs)}[m
[31m-            for i = 1, 170 do[m
[31m-                ngx.say(resps[i].status)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-            local foo = require "foo"[m
[31m-            local udp = foo.get_udp()[m
[31m-[m
[31m-            udp:settimeout(100) -- 100 ms[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-local udp[m
[31m-[m
[31m-function get_udp()[m
[31m-    if not udp then[m
[31m-        udp = ngx.socket.udp()[m
[31m-    end[m
[31m-[m
[31m-    return udp[m
[31m-end[m
[31m-[m
[31m---- stap2[m
[31m-M(http-lua-info) {[m
[31m-    printf("udp resume: %p\n", $coctx)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: \b500\b[m
[31m---- error_log eval[m
[31m-qr/content_by_lua\(nginx\.conf:\d+\):8: bad request/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: access conflicts of receive() on shared udp objects[m
[31m---- http_config[m
[31m-    lua_package_path '$prefix/html/?.lua;;';[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local reqs = {}[m
[31m-            for i = 1, 170 do[m
[31m-                table.insert(reqs, {"/t"})[m
[31m-            end[m
[31m-            local resps = {ngx.location.capture_multi(reqs)}[m
[31m-            for i = 1, 170 do[m
[31m-                ngx.say(resps[i].status)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-            local foo = require "foo"[m
[31m-            local udp = foo.get_udp(port)[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive data: ", err)[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-local udp[m
[31m-[m
[31m-function get_udp(port)[m
[31m-    if not udp then[m
[31m-        udp = ngx.socket.udp()[m
[31m-[m
[31m-        udp:settimeout(100) -- 100ms[m
[31m-[m
[31m-        local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-            return ngx.exit(500)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return udp[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: \b500\b[m
[31m---- error_log eval[m
[31m-qr/content_by_lua\(nginx\.conf:\d+\):6: bad request/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: connect again immediately[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected again: ", ok)[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = sock:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", ok)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-connected again: 1[m
[31m-request sent: 1[m
[31m-received: \0\1\0\0\0\1\0\0OK\r\n[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua reuse socket upstream", "lua udp socket reconnect without shutting down"][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: recv timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            sock:settimeout(100) -- 100 ms[m
[31m-[m
[31m-            local ok, err = sock:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            -- ok, err = sock:close()[m
[31m-            -- ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: with an explicit receive buffer size argument[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive(1400)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected\nreceived 12 bytes: \x{00}\x{01}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua udp socket receive buffer size: 1400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: read timeout and re-receive[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local udp = ngx.socket.udp()[m
[31m-            udp:settimeout(30)[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", 19232)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to setpeername: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = udp:send("blah")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            for i = 1, 2 do[m
[31m-                local data, err = udp:receive()[m
[31m-                if err == "timeout" then[m
[31m-                    -- continue[m
[31m-                else[m
[31m-                    if not data then[m
[31m-                        ngx.say("failed to receive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    ngx.say("received: ", data)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("timed out")[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 19232[m
[31m---- udp_reply: hello world[m
[31m---- udp_reply_delay: 45ms[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-received: hello world[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: access the google DNS server (using IP addr)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            udp:settimeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("$TEST_NGINX_RESOLVER", 53)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "\\0}\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\3www\\6google\\3com\\0\\0\\1\\0\\1"[m
[31m-[m
[31m-            -- ngx.print(req)[m
[31m-            -- do return end[m
[31m-[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if string.match(data, "\\3www\\6google\\3com") then[m
[31m-                ngx.say("received a good response.")[m
[31m-            else[m
[31m-                ngx.say("received a bad response: ", #data, " bytes: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-received a good response.[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua udp socket receive buffer size: 8192[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: access the google DNS server (using domain names)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER ipv6=off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            -- avoid flushing google in "check leak" testing mode:[m
[31m-            local counter = package.loaded.counter[m
[31m-            if not counter then[m
[31m-                counter = 1[m
[31m-            elseif counter >= 2 then[m
[31m-                return ngx.exit(503)[m
[31m-            else[m
[31m-                counter = counter + 1[m
[31m-            end[m
[31m-            package.loaded.counter = counter[m
[31m-[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            udp:settimeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("google-public-dns-a.google.com", 53)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "\\0}\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\3www\\6google\\3com\\0\\0\\1\\0\\1"[m
[31m-[m
[31m-            -- ngx.print(req)[m
[31m-            -- do return end[m
[31m-[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if string.match(data, "\\3www\\6google\\3com") then[m
[31m-                ngx.say("received a good response.")[m
[31m-            else[m
[31m-                ngx.say("received a bad response: ", #data, " bytes: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-received a good response.[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua udp socket receive buffer size: 8192[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #215: Handle the posted requests in lua cosocket api (failed to resolve)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-[m
[31m-    location = /sub {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("xxx", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect to xxx: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("successfully connected to xxx!")[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sub[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_resolve_name_done) {[m
[31m-    println("resolve name done")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-resolve name done[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^failed to connect to xxx: xxx could not be resolved.*?Host not found[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #215: Handle the posted requests in lua cosocket api (successfully resolved)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-    location = /sub {[m
[31m-        content_by_lua '[m
[31m-            if not package.i then[m
[31m-                package.i = 1[m
[31m-            end[m
[31m-[m
[31m-            local servers = {"openresty.org", "agentzh.org", "sregex.org"}[m
[31m-            local server = servers[package.i][m
[31m-            package.i = package.i + 1[m
[31m-[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername(server, 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect to ", server, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("successfully connected to xxx!")[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to xxx![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: datagram unix domain socket[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("unix:a.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "hello,\\nserver"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- udp_listen: a.sock[m
[31m---- udp_reply[m
[31m-hello,[m
[31m-client[m
[31m-[m
[31m---- response_body[m
[31m-connected[m
[31m-received 14 bytes: hello,[m
[31m-client[m
[31m-[m
[31m---- stap2[m
[31m-probe syscall.socket, syscall.connect {[m
[31m-    print(name, "(", argstr, ")")[m
[31m-}[m
[31m-[m
[31m-probe syscall.socket.return, syscall.connect.return {[m
[31m-    println(" = ", retstr)[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[31m---- skip_eval: 3: $^O ne 'linux'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: bad request tries to setpeer[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad request tries to send[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:send("a")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad request tries to receive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:receive()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad request tries to close[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:send("a")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: bad request tries to receive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/088-req-method.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/088-req-method.t[m
[1mdeleted file mode 100644[m
[1mindex 9ced40c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/088-req-method.t[m
[1m+++ /dev/null[m
[36m@@ -1,265 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get method name in main request[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("method: [", ngx.req.get_method(), "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-method: [GET][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get method name in subrequest[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_subrequest POST /sub;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("method: [", ngx.req.get_method(), "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-method: [POST][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set GET to POST[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_POST)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-POST[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set POST to GET[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_GET)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set POST to DELETE[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_DELETE)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-DELETE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set POST to PUT[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_PUT)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-PUT[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set POST to PUT (using $requeset_method)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_PUT)[m
[31m-        ';[m
[31m-[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-PUT[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set GET to HEAD[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_HEAD)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        #proxy_pass http://127.0.0.1:8888/;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set method name in subrequest[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_subrequest POST /sub;[m
[31m-        echo "main: $echo_request_method";[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_PUT)[m
[31m-            ngx.say("sub: ", ngx.var.echo_request_method)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-sub: PUT[m
[31m-main: GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set HEAD to GET[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_GET)[m
[31m-        ';[m
[31m-[m
[31m-        echo "method: $echo_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /t[m
[31m---- response_body[m
[31m-method: GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set GET to WebDAV methods[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local methods = {[m
[31m-                ngx.HTTP_MKCOL,[m
[31m-                ngx.HTTP_COPY,[m
[31m-                ngx.HTTP_MOVE,[m
[31m-                ngx.HTTP_PROPFIND,[m
[31m-                ngx.HTTP_PROPPATCH,[m
[31m-                ngx.HTTP_LOCK,[m
[31m-                ngx.HTTP_UNLOCK,[m
[31m-                ngx.HTTP_PATCH,[m
[31m-                ngx.HTTP_TRACE,[m
[31m-            }[m
[31m-[m
[31m-            for i, method in ipairs(methods) do[m
[31m-                ngx.req.set_method(method)[m
[31m-                ngx.say("method: ", ngx.var.echo_request_method)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /t[m
[31m---- response_body[m
[31m-method: MKCOL[m
[31m-method: COPY[m
[31m-method: MOVE[m
[31m-method: PROPFIND[m
[31m-method: PROPPATCH[m
[31m-method: LOCK[m
[31m-method: UNLOCK[m
[31m-method: PATCH[m
[31m-method: TRACE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/089-phase.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/089-phase.t[m
[1mdeleted file mode 100644[m
[1mindex 57921fc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/089-phase.t[m
[1m+++ /dev/null[m
[36m@@ -1,179 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get_phase in init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua 'phase = ngx.get_phase()';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(phase)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-init[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get_phase in set_by_lua[m
[31m---- config[m
[31m-    set_by_lua $phase 'return ngx.get_phase()';[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.phase)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-set[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get_phase in rewrite_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say(ngx.get_phase())[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-rewrite[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get_phase in access_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.say(ngx.get_phase())[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-access[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get_phase in content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.get_phase())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-content[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: get_phase in header_filter_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo "OK";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.Phase = ngx.get_phase()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_header[m
[31m-Phase: header_filter[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get_phase in body_filter_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = ngx.get_phase()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chop[m
[31m-body_filter[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: get_phase in log_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo "OK";[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.ERR, ngx.get_phase())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_log[m
[31m-log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get_phase in ngx.timer callback[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo "OK";[m
[31m-        log_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.log(ngx.WARN, "current phase: ", ngx.get_phase())[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to add timer: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-current phase: timer[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: get_phase in init_worker_by_lua[m
[31m---- http_config[m
[31m-    init_worker_by_lua 'phase = ngx.get_phase()';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(phase)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-init_worker[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/090-log-socket-errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/090-log-socket-errors.t[m
[1mdeleted file mode 100644[m
[1mindex a5943c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/090-log-socket-errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: log socket errors off (tcp)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_connect_timeout 1ms;[m
[31m-        lua_socket_log_errors off;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("8.8.8.8", 80)[m
[31m-            ngx.say(err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timeout[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: log socket errors on (tcp)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_connect_timeout 1ms;[m
[31m-        lua_socket_log_errors on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("8.8.8.8", 80)[m
[31m-            ngx.say(err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: log socket errors on (udp)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_log_errors on;[m
[31m-        lua_socket_read_timeout 1ms;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 80)[m
[31m-            ok, err = sock:receive()[m
[31m-            ngx.say(err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timeout[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: log socket errors off (udp)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_log_errors off;[m
[31m-        lua_socket_read_timeout 1ms;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 80)[m
[31m-            ok, err = sock:receive()[m
[31m-            ngx.say(err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timeout[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/091-coroutine.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/091-coroutine.t[m
[1mdeleted file mode 100644[m
[1mindex b047ccb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/091-coroutine.t[m
[1m+++ /dev/null[m
[36m@@ -1,1318 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-our $StapScript = <<'_EOC_';[m
[31m-global ids, cur[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    delete ids[m
[31m-    cur = 0[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    id = gen_id($ctx->cur_co)[m
[31m-    printf("run thread %d\n", id)[m
[31m-}[m
[31m-[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("lua resume %d\n", id)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-resume) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("resume %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-thread-yield) {[m
[31m-    println("thread yield")[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_coroutine_yield) {[m
[31m-    printf("yield %x\n", gen_id($L))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-yield) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("yield %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_atpanic) {[m
[31m-    printf("lua atpanic(%d):", gen_id($L))[m
[31m-    print_ubacktrace();[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exec) { println("exec") }[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) { println("exit") }[m
[31m-F(ngx_http_lua_ffi_exit) { println("exit") }[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic coroutine print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    ngx.say("Hello, ", cnt)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i=1,3 do[m
[31m-                cr(c)[m
[31m-                ngx.say("***")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-Hello, 0[m
[31m-***[m
[31m-Hello, 1[m
[31m-***[m
[31m-Hello, 2[m
[31m-***[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic coroutine2[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f(fid)[m
[31m-                local cnt = 0[m
[31m-                while true do[m
[31m-                    ngx.say("cc", fid, ": ", cnt)[m
[31m-                    coroutine.yield()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local ccs = {}[m
[31m-            for i=1,3 do[m
[31m-                ccs[#ccs+1] = coroutine.create(function() f(i) end)[m
[31m-            end[m
[31m-[m
[31m-            for i=1,9 do[m
[31m-                local cc = table.remove(ccs, 1)[m
[31m-                coroutine.resume(cc)[m
[31m-                ccs[#ccs+1] = cc[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-cc1: 0[m
[31m-cc2: 0[m
[31m-cc3: 0[m
[31m-cc1: 1[m
[31m-cc2: 1[m
[31m-cc3: 1[m
[31m-cc1: 2[m
[31m-cc2: 2[m
[31m-cc3: 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic coroutine and cosocket[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function worker(url)[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect(url, 80)[m
[31m-                coroutine.yield()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect to: ", url, " error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("successfully connected to: ", url)[m
[31m-                sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local urls = {[m
[31m-                "agentzh.org",[m
[31m-                "iscribblet.org",[m
[31m-                "openresty.org"[m
[31m-            }[m
[31m-[m
[31m-            local ccs = {}[m
[31m-            for i, url in ipairs(urls) do[m
[31m-                local cc = coroutine.create(function() worker(url) end)[m
[31m-                ccs[#ccs+1] = cc[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                if #ccs == 0 then break end[m
[31m-                local cc = table.remove(ccs, 1)[m
[31m-                local ok = coroutine.resume(cc)[m
[31m-                if ok then[m
[31m-                    ccs[#ccs+1] = cc[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("*** All Done ***")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to: agentzh.org[m
[31m-successfully connected to: iscribblet.org[m
[31m-successfully connected to: openresty.org[m
[31m-*** All Done ***[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: coroutine.wrap(generate prime numbers)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- generate all the numbers from 2 to n[m
[31m-            function gen (n)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                for i=2,n do coroutine.yield(i) end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            -- filter the numbers generated by g, removing multiples of p[m
[31m-            function filter (p, g)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                while 1 do[m
[31m-                  local n = g()[m
[31m-                  if n == nil then return end[m
[31m-                  if math.fmod(n, p) ~= 0 then coroutine.yield(n) end[m
[31m-                end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            N = 10[m
[31m-            x = gen(N)		-- generate primes up to N[m
[31m-            while 1 do[m
[31m-              local n = x()		-- pick a number until done[m
[31m-              if n == nil then break end[m
[31m-              ngx.say(n)		-- must be a prime number[m
[31m-              x = filter(n, x)	-- now remove its multiples[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m-3[m
[31m-5[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: coroutine.wrap(generate prime numbers,reset create and resume)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            coroutine.create = nil[m
[31m-            coroutine.resume = nil[m
[31m-            -- generate all the numbers from 2 to n[m
[31m-            function gen (n)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                for i=2,n do coroutine.yield(i) end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            -- filter the numbers generated by g, removing multiples of p[m
[31m-            function filter (p, g)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                while 1 do[m
[31m-                  local n = g()[m
[31m-                  if n == nil then return end[m
[31m-                  if math.fmod(n, p) ~= 0 then coroutine.yield(n) end[m
[31m-                end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            N = 10 [m
[31m-            x = gen(N)		-- generate primes up to N[m
[31m-            while 1 do[m
[31m-              local n = x()		-- pick a number until done[m
[31m-              if n == nil then break end[m
[31m-              ngx.say(n)		-- must be a prime number[m
[31m-              x = filter(n, x)	-- now remove its multiples[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m-3[m
[31m-5[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: coroutine.wrap(generate fib)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function generatefib (n)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                local a,b = 1, 1[m
[31m-                while a <= n do[m
[31m-                  coroutine.yield(a)[m
[31m-                  a, b = b, a+b[m
[31m-                end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            -- In lua, because OP_TFORLOOP uses luaD_call to execute the iterator function,[m
[31m-            -- and luaD_call is a C function, so we can not yield in the iterator function.[m
[31m-            -- So the following case(using for loop) will be failed.[m
[31m-            -- Luajit is OK.[m
[31m-            if package.loaded["jit"] then[m
[31m-                for i in generatefib(1000) do ngx.say(i) end[m
[31m-            else[m
[31m-                local gen = generatefib(1000)[m
[31m-                while true do[m
[31m-                    local i = gen()[m
[31m-                    if not i then break end[m
[31m-                    ngx.say(i)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-5[m
[31m-8[m
[31m-13[m
[31m-21[m
[31m-34[m
[31m-55[m
[31m-89[m
[31m-144[m
[31m-233[m
[31m-377[m
[31m-610[m
[31m-987[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: coroutine wrap and cosocket[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function worker(url)[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect(url, 80)[m
[31m-                coroutine.yield()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect to: ", url, " error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("successfully connected to: ", url)[m
[31m-                sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local urls = {[m
[31m-                "agentzh.org",[m
[31m-                "iscribblet.org",[m
[31m-                "openresty.org"[m
[31m-            }[m
[31m-[m
[31m-            local cfs = {}[m
[31m-            for i, url in ipairs(urls) do[m
[31m-                local cf = coroutine.wrap(function() worker(url) end)[m
[31m-                cfs[#cfs+1] = cf[m
[31m-            end[m
[31m-[m
[31m-            for i=1,3 do cfs[i]() end[m
[31m-            for i=1,3 do cfs[i]() end[m
[31m-            for i=1,3 do cfs[i]() end[m
[31m-[m
[31m-            ngx.say("*** All Done ***")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to: agentzh.org[m
[31m-successfully connected to: iscribblet.org[m
[31m-successfully connected to: openresty.org[m
[31m-*** All Done ***[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: coroutine status, running[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-            local st, rn = coroutine.status, coroutine.running[m
[31m-[m
[31m-            function f(self)[m
[31m-                local cnt = 0[m
[31m-                if rn() ~= self then ngx.say("error"); return end[m
[31m-                ngx.say("running: ", st(self)) --running[m
[31m-                cy()[m
[31m-                local c = cc(function(father)[m
[31m-                    ngx.say("normal: ", st(father))[m
[31m-                end) -- normal[m
[31m-                cr(c, self)[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            ngx.say("suspended: ", st(c)) -- suspended[m
[31m-            cr(c, c)[m
[31m-            ngx.say("suspended: ", st(c)) -- suspended[m
[31m-            cr(c, c)[m
[31m-            ngx.say("dead: ", st(c)) -- dead[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-suspended: suspended[m
[31m-running: running[m
[31m-suspended: suspended[m
[31m-normal: normal[m
[31m-dead: dead[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: entry coroutine yielded will be resumed immediately[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("[", {coroutine.yield()}, "]")[m
[31m-            ngx.say("[", {coroutine.yield(1, "a")}, "]")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[][m
[31m-[][m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: thread traceback (multi-thread)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local f = function(cr) coroutine.resume(cr) end[m
[31m-            -- emit a error[m
[31m-            local g = function() unknown.unknown = 1 end[m
[31m-            local l1 = coroutine.create(f)[m
[31m-            local l2 = coroutine.create(g)[m
[31m-            coroutine.resume(l1, l2)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log eval[m
[31m-["stack traceback:", "coroutine 0:", "coroutine 1:", "coroutine 2:"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: thread traceback (only the entry thread)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- emit a error[m
[31m-            unknown.unknown = 1[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-["stack traceback:", "coroutine 0:"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: bug: resume dead coroutine with args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function print(...)[m
[31m-                local args = {...}[m
[31m-                local is_first = true[m
[31m-                for i,v in ipairs(args) do[m
[31m-                    if is_first then[m
[31m-                        is_first = false[m
[31m-                    else[m
[31m-                        ngx.print(" ")[m
[31m-                    end[m
[31m-                    ngx.print(v)[m
[31m-                end[m
[31m-                ngx.print("\\\n")[m
[31m-            end[m
[31m-[m
[31m-            function foo (a)[m
[31m-                print("foo", a)[m
[31m-                return coroutine.yield(2*a)[m
[31m-            end[m
[31m-[m
[31m-            co = coroutine.create(function (a,b)[m
[31m-                    print("co-body", a, b)[m
[31m-                    local r = foo(a+1)[m
[31m-                    print("co-body", r)[m
[31m-                    local r, s = coroutine.yield(a+b, a-b)[m
[31m-                    print("co-body", r, s)[m
[31m-                    return b, "end"[m
[31m-                end)[m
[31m-[m
[31m-            print("main", coroutine.resume(co, 1, 10))[m
[31m-            print("main", coroutine.resume(co, "r"))[m
[31m-            print("main", coroutine.resume(co, "x", "y"))[m
[31m-            print("main", coroutine.resume(co, "x", "y"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-co-body 1 10[m
[31m-foo 2[m
[31m-main true 4[m
[31m-co-body r[m
[31m-main true 11 -9[m
[31m-co-body x y[m
[31m-main true 10 end[m
[31m-main false cannot resume dead coroutine[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: deeply nested coroutines[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local create = coroutine.create[m
[31m-            local resume = coroutine.resume[m
[31m-            local yield = coroutine.yield[m
[31m-            function f()[m
[31m-                ngx.say("f begin")[m
[31m-                yield()[m
[31m-                local c2 = create(g)[m
[31m-                ngx.say("1: resuming c2")[m
[31m-                resume(c2)[m
[31m-                ngx.say("2: resuming c2")[m
[31m-                resume(c2)[m
[31m-                yield()[m
[31m-                ngx.say("3: resuming c2")[m
[31m-                resume(c2)[m
[31m-                ngx.say("f done")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("g begin")[m
[31m-                yield()[m
[31m-                ngx.say("g going")[m
[31m-                yield()[m
[31m-                ngx.say("g done")[m
[31m-            end[m
[31m-[m
[31m-            local c1 = create(f)[m
[31m-            ngx.say("1: resuming c1")[m
[31m-            resume(c1)[m
[31m-            ngx.say("2: resuming c1")[m
[31m-            resume(c1)[m
[31m-            ngx.say("3: resuming c1")[m
[31m-            resume(c1)[m
[31m-            ngx.say("main done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1: resuming c1[m
[31m-f begin[m
[31m-2: resuming c1[m
[31m-1: resuming c2[m
[31m-g begin[m
[31m-2: resuming c2[m
[31m-g going[m
[31m-3: resuming c1[m
[31m-3: resuming c2[m
[31m-g done[m
[31m-f done[m
[31m-main done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: using ngx.exit in user coroutines[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local create = coroutine.create[m
[31m-            local resume = coroutine.resume[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            local code = 400[m
[31m-[m
[31m-            function f()[m
[31m-                local c2 = create(g)[m
[31m-                yield()[m
[31m-                code = code + 1[m
[31m-                resume(c2)[m
[31m-                yield()[m
[31m-                resume(c2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                code = code + 1[m
[31m-                yield()[m
[31m-                code = code + 1[m
[31m-                ngx.exit(code)[m
[31m-            end[m
[31m-[m
[31m-            local c1 = create(f)[m
[31m-            resume(c1)[m
[31m-            resume(c1)[m
[31m-            resume(c1)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap eval: $::StapScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-resume 2 in 1[m
[31m-create 3 in 2[m
[31m-yield 2 in 1[m
[31m-resume 2 in 1[m
[31m-resume 3 in 2[m
[31m-yield 3 in 2[m
[31m-yield 2 in 1[m
[31m-resume 2 in 1[m
[31m-resume 3 in 2[m
[31m-exit[m
[31m-[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: using ngx.exec in user coroutines[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local create = coroutine.create[m
[31m-            local resume = coroutine.resume[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            local code = 0[m
[31m-[m
[31m-            function f()[m
[31m-                local c2 = create(g)[m
[31m-                yield()[m
[31m-                code = code + 1[m
[31m-                resume(c2)[m
[31m-                yield()[m
[31m-                resume(c2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                code = code + 1[m
[31m-                yield()[m
[31m-                code = code + 1[m
[31m-                ngx.exec("/n/" .. code)[m
[31m-            end[m
[31m-[m
[31m-            local c1 = create(f)[m
[31m-            resume(c1)[m
[31m-            resume(c1)[m
[31m-            resume(c1)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/n/(\d+)' {[m
[31m-        echo "num: $1";[m
[31m-    }[m
[31m-[m
[31m---- stap eval: $::StapScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-resume 2 in 1[m
[31m-create 3 in 2[m
[31m-yield 2 in 1[m
[31m-resume 2 in 1[m
[31m-resume 3 in 2[m
[31m-yield 3 in 2[m
[31m-yield 2 in 1[m
[31m-resume 2 in 1[m
[31m-resume 3 in 2[m
[31m-exec[m
[31m-[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-num: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: coroutine.create in header_filter_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            function f()[m
[31m-                yield()[m
[31m-            end[m
[31m-[m
[31m-            local c1 = coroutine.create(f)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: resume coroutines from within another one that is not its parent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local print = ngx.say[m
[31m-[m
[31m-            local c1, c2[m
[31m-[m
[31m-            function f()[m
[31m-                print("f 1")[m
[31m-                print(coroutine.resume(c2))[m
[31m-                print("f 2")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                print("g 1")[m
[31m-                -- print(coroutine.resume(c1))[m
[31m-                print("g 2")[m
[31m-            end[m
[31m-[m
[31m-            c1 = coroutine.create(f)[m
[31m-            c2 = coroutine.create(g)[m
[31m-[m
[31m-            coroutine.resume(c1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-g 2[m
[31m-true[m
[31m-f 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: infinite recursive calls of coroutine.resume[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local print = ngx.say[m
[31m-[m
[31m-            local c1, c2[m
[31m-[m
[31m-            function f()[m
[31m-                print("f 1")[m
[31m-                print(coroutine.resume(c2))[m
[31m-                print("f 2")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                print("g 1")[m
[31m-                print(coroutine.resume(c1))[m
[31m-                print("g 2")[m
[31m-            end[m
[31m-[m
[31m-            c1 = coroutine.create(f)[m
[31m-            c2 = coroutine.create(g)[m
[31m-[m
[31m-            coroutine.resume(c1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-falsecannot resume normal coroutine[m
[31m-g 2[m
[31m-true[m
[31m-f 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: resume running (entry) coroutines[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(coroutine.status(coroutine.running()))[m
[31m-            ngx.say(coroutine.resume(coroutine.running()))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-running[m
[31m-falsecannot resume running coroutine[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: resume running (user) coroutines[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                ngx.say("f: ", coroutine.status(co))[m
[31m-                ngx.say("f: ", coroutine.resume(co))[m
[31m-            end[m
[31m-            co = coroutine.create(f)[m
[31m-            ngx.say("chunk: ", coroutine.status(co))[m
[31m-            ngx.say("chunk: ", coroutine.resume(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-chunk: suspended[m
[31m-f: running[m
[31m-f: falsecannot resume running coroutine[m
[31m-chunk: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: user coroutine end with errors, and the parent coroutine gets the right status[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                error("bad")[m
[31m-            end[m
[31m-            co = coroutine.create(f)[m
[31m-            ngx.say("child: resume: ", coroutine.resume(co))[m
[31m-            ngx.say("child: status: ", coroutine.status(co))[m
[31m-            ngx.say("parent: status: ", coroutine.status(coroutine.running()))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qr/^child: resume: falsecontent_by_lua\(nginx\.conf:\d+\):4: bad[m
[31m-child: status: dead[m
[31m-parent: status: running[m
[31m-$/s[m
[31m---- error_log eval[m
[31m-qr/lua coroutine: runtime error: content_by_lua\(nginx\.conf:\d+\):4: bad/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: entry coroutine is yielded by hand and still gets the right status[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local co = coroutine.running()[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-            coroutine.yield(co)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-status: running[m
[31m-status: running[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: github issue #208: coroutine as iterator doesn't work[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local say = ngx.say[m
[31m-            local wrap, yield = coroutine.wrap, coroutine.yield[m
[31m-[m
[31m-            local function it(it_state)[m
[31m-              for i = 1, it_state.i do[m
[31m-                yield(it_state.path, tostring(i))[m
[31m-              end[m
[31m-              return nil[m
[31m-            end[m
[31m-[m
[31m-            local function it_factory(path)[m
[31m-              local it_state = { i = 10, path = path }[m
[31m-              return wrap(it), it_state[m
[31m-            end[m
[31m-[m
[31m-            --[[[m
[31m-            for path, value in it_factory("test") do[m
[31m-              say(path, value)[m
[31m-            end[m
[31m-            ]][m
[31m-[m
[31m-            do[m
[31m-              local f, s, var = it_factory("test")[m
[31m-              while true do[m
[31m-                local path, value = f(s, var)[m
[31m-                var = path[m
[31m-                if var == nil then break end[m
[31m-                say(path, value)[m
[31m-              end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Cookie: abc=32[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-test1[m
[31m-test2[m
[31m-test3[m
[31m-test4[m
[31m-test5[m
[31m-test6[m
[31m-test7[m
[31m-test8[m
[31m-test9[m
[31m-test10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: init_by_lua + our own coroutines in content_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua 'return';[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function worker(url)[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect(url, 80)[m
[31m-                coroutine.yield()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect to: ", url, " error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("successfully connected to: ", url)[m
[31m-                sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local urls = {[m
[31m-                "agentzh.org",[m
[31m-            }[m
[31m-[m
[31m-            local ccs = {}[m
[31m-            for i, url in ipairs(urls) do[m
[31m-                local cc = coroutine.create(function() worker(url) end)[m
[31m-                ccs[#ccs+1] = cc[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                if #ccs == 0 then break end[m
[31m-                local cc = table.remove(ccs, 1)[m
[31m-                local ok = coroutine.resume(cc)[m
[31m-                if ok then[m
[31m-                    ccs[#ccs+1] = cc[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("*** All Done ***")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to: agentzh.org[m
[31m-*** All Done ***[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: init_by_lua_file + our own coroutines in content_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua_file html/init.lua;[m
[31m-[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function worker(url)[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect(url, 80)[m
[31m-                coroutine.yield()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect to: ", url, " error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("successfully connected to: ", url)[m
[31m-                sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local urls = {[m
[31m-                "agentzh.org"[m
[31m-            }[m
[31m-[m
[31m-            local ccs = {}[m
[31m-            for i, url in ipairs(urls) do[m
[31m-                local cc = coroutine.create(function() worker(url) end)[m
[31m-                ccs[#ccs+1] = cc[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                if #ccs == 0 then break end[m
[31m-                local cc = table.remove(ccs, 1)[m
[31m-                local ok = coroutine.resume(cc)[m
[31m-                if ok then[m
[31m-                    ccs[#ccs+1] = cc[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("*** All Done ***")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> init.lua[m
[31m-return[m
[31m-[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to: agentzh.org[m
[31m-*** All Done ***[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: mixing coroutine.* API between init_by_lua and other contexts (github #304) - init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-          co_wrap = coroutine.wrap[m
[31m-          co_yield = coroutine.yield[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location /cotest {[m
[31m-        content_by_lua '[m
[31m-            function generator()[m
[31m-                return co_wrap(function()[m
[31m-                    co_yield("data")[m
[31m-                end)[m
[31m-            end[m
[31m-[m
[31m-            local co = generator()[m
[31m-            local data = co()[m
[31m-            ngx.say(data)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /cotest[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-data[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: mixing coroutine.* API between init_by_lua and other contexts (github #304) - init_by_lua_file[m
[31m---- http_config[m
[31m-    init_by_lua_file html/init.lua;[m
[31m-[m
[31m---- config[m
[31m-    location /cotest {[m
[31m-        content_by_lua '[m
[31m-            function generator()[m
[31m-                return co_wrap(function()[m
[31m-                    co_yield("data")[m
[31m-                end)[m
[31m-            end[m
[31m-[m
[31m-            local co = generator()[m
[31m-            local data = co()[m
[31m-            ngx.say(data)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> init.lua[m
[31m-co_wrap = coroutine.wrap[m
[31m-co_yield = coroutine.yield[m
[31m-[m
[31m---- request[m
[31m-GET /cotest[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-data[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: coroutine context collicisions[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                return 3[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 10 do[m
[31m-                collectgarbage()[m
[31m-                local c = cc(f)[m
[31m-                if coroutine.status(c) == "dead" then[m
[31m-                    ngx.say("found a dead coroutine")[m
[31m-                    return[m
[31m-                end[m
[31m-                cr(c)[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: require "coroutine"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local coroutine = require "coroutine"[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    ngx.say("Hello, ", cnt)[m
[31m-                    ngx.sleep(0.001)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i=1,3 do[m
[31m-                cr(c)[m
[31m-                ngx.say("***")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-Hello, 0[m
[31m-***[m
[31m-Hello, 1[m
[31m-***[m
[31m-Hello, 2[m
[31m-***[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: basic coroutine in header_filter_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        header_filter_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    print("co yield: ", cnt)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i = 1, 3 do[m
[31m-                print("co resume.")[m
[31m-                cr(c)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/co (?:yield: \d+|resume\.)/[m
[31m---- grep_error_log_out[m
[31m-co resume.[m
[31m-co yield: 0[m
[31m-co resume.[m
[31m-co yield: 1[m
[31m-co resume.[m
[31m-co yield: 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: basic coroutine in body_filter_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        body_filter_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    print("co yield: ", cnt)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i = 1, 3 do[m
[31m-                print("co resume.")[m
[31m-                cr(c)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/co (?:yield: \d+|resume\.)/[m
[31m---- grep_error_log_out[m
[31m-co resume.[m
[31m-co yield: 0[m
[31m-co resume.[m
[31m-co yield: 1[m
[31m-co resume.[m
[31m-co yield: 2[m
[31m-co resume.[m
[31m-co yield: 0[m
[31m-co resume.[m
[31m-co yield: 1[m
[31m-co resume.[m
[31m-co yield: 2[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/092-eof.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/092-eof.t[m
[1mdeleted file mode 100644[m
[1mindex a75711f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/092-eof.t[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-master_on();[m
[31m-workers(2);[m
[31m-no_root_location();[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: 404 parallel subrequests after ngx.eof()[m
[31m---- config[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(1)[m
[31m-            ngx.eof()[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/bad1" },[m
[31m-                { "/bad2" }[m
[31m-            }[m
[31m-            ngx.log(ngx.WARN, "res1: ", res1.status)[m
[31m-            ngx.log(ngx.WARN, "res2: ", res2.status)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- error_log[m
[31m-res1: 404[m
[31m-res2: 404[m
[31m-No such file or directory[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: parallel normal subrequests after ngx.eof()[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(1)[m
[31m-            ngx.eof()[m
[31m-            local r1, r2 = ngx.location.capture_multi{[m
[31m-                { "/proxy/tom" },[m
[31m-                { "/proxy/jim" }[m
[31m-            }[m
[31m-            ngx.log(ngx.WARN, r1.body)[m
[31m-            ngx.log(ngx.WARN, r2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/proxy/(\w+)' {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello?a=$1;[m
[31m-    }[m
[31m-[m
[31m-    location = /hello {[m
[31m-        echo_sleep 0.5;[m
[31m-        echo -n "hello, $arg_a";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m---- error_log[m
[31m-hello, tom[m
[31m-hello, jim[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/093-uthread-spawn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/093-uthread-spawn.t[m
[1mdeleted file mode 100644[m
[1mindex 772e866..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/093-uthread-spawn.t[m
[1m+++ /dev/null[m
[36m@@ -1,1675 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-worker_connections(256);[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple user thread without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: two simple user threads without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("in thread 1")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("in thread 2")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before 1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after 1")[m
[31m-[m
[31m-            ngx.say("before 2")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after 2")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before 1[m
[31m-in thread 1[m
[31m-after 1[m
[31m-before 2[m
[31m-in thread 2[m
[31m-after 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple user thread with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before sleep[m
[31m-after thread create[m
[31m-after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: two simple user threads with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("1: before sleep")[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("1: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("2: before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("2: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("1: after thread create")[m
[31m-[m
[31m-            ngx.say("2: before thread create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("2: after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-1: before thread create[m
[31m-1: before sleep[m
[31m-1: after thread create[m
[31m-2: before thread create[m
[31m-2: before sleep[m
[31m-2: after thread create[m
[31m-2: after sleep[m
[31m-1: after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: error in user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.blah()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-after[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):3: attempt to call field 'blah' \(a nil value\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple user threads doing a single subrequest (entry quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple user threads doing a single subrequest (entry also does a subrequest and quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-capture: hello bar[m
[31m-after capture: hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple user threads doing a single subrequest (entry also does a subrequest and quits late)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello foo[m
[31m-capture: hello bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: two simple user threads doing single subrequests (entry also does a subrequest and quits between)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("f: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("f: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("g: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?bah")[m
[31m-                ngx.say("g: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread 1 create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread 1 create")[m
[31m-[m
[31m-            ngx.say("before thread 2 create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after thread 2 create")[m
[31m-[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bah {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n hello bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before thread 1 create[m
[31m-f: before capture[m
[31m-after thread 1 create[m
[31m-before thread 2 create[m
[31m-g: before capture[m
[31m-after thread 2 create[m
[31m-f: after capture: hello foo[m
[31m-capture: hello bar[m
[31m-g: after capture: hello bah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nested user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after f[m
[31m-after g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nested user threads (with I/O)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-after f[m
[31m-after g[m
[31m-hello in g()[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: coroutine status of a running user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: running[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: coroutine status of a dead user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-status: zombie[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: coroutine status of a "normal" user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                local co2 = coroutine.create(g)[m
[31m-                coroutine.resume(co2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: normal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: creating user threads in a user coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after g[m
[31m-after f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: manual time slicing between a user thread and the entry thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            local self = coroutine.running()[m
[31m-            ngx.say("0")[m
[31m-            yield(self)[m
[31m-            ngx.say("1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("2")[m
[31m-            yield(self)[m
[31m-            ngx.say("3")[m
[31m-            yield(self)[m
[31m-            ngx.say("4")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-0[m
[31m-1[m
[31m-f 1[m
[31m-2[m
[31m-f 2[m
[31m-3[m
[31m-f 3[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: manual time slicing between two user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("g 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 3")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-f 2[m
[31m-done[m
[31m-g 2[m
[31m-f 3[m
[31m-g 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entry thread and a user thread flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                coroutine.yield(coroutine.running)[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.flush(true)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: two user threads flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello from g")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- response_body[m
[31m-hello from f[m
[31m-hello from g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: user threads + ngx.socket.tcp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flush_all\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: user threads + ngx.socket.udp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.udp()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", 12345)[m
[31m-                local bytes, err = sock:send("blah")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-)$[m
[31m-[m
[31m---- udp_listen: 12345[m
[31m---- udp_query: blah[m
[31m---- udp_reply: hello udp[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-after[m
[31m-received: hello udp[m
[31m-|before[m
[31m-received: hello udp[m
[31m-after)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: simple user thread with ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.req.read_body()[m
[31m-                local body = ngx.req.get_body_data()[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: simple user thread with ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.req.socket()[m
[31m-                local body, err = sock:receive(11)[m
[31m-                if not body then[m
[31m-                    ngx.say("failed to read body: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: simple user thread with args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f(a, b)[m
[31m-                ngx.say("hello ", a, " and ", b)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f, "foo", 3.14)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello foo and 3.14[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: multiple user threads + subrequests returning 404 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-finalize request /t: rc:-4 c:4 a:1[m
[31m-finalize request /proxy/1: rc:404 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=404, status=0 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-finalize request /proxy/2: rc:404 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=404, status=0 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:0 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 404[m
[31m-status: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: multiple user threads + subrequests returning 404 remotely (no wait)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 5 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/d/$1;[m
[31m-    }[m
[31m-[m
[31m-    location /d {[m
[31m-        return 404;[m
[31m-        #echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-create 5 in 1[m
[31m-spawn user thread 5 in 1[m
[31m-create 6 in 1[m
[31m-spawn user thread 6 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-(?:terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 6: ok[m
[31m-delete thread 6[m
[31m-|terminate 6: ok[m
[31m-delete thread 6[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: multiple user threads + subrequests returning 201 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        content_by_lua 'ngx.exit(201)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-finalize request /t: rc:-4 c:4 a:1[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-finalize request /proxy/1: rc:0 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=0, status=201 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-finalize request /proxy/2: rc:0 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=0, status=201 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:0 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 201[m
[31m-status: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multiple user threads + subrequests returning 204 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        content_by_lua 'ngx.exit(204)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-finalize request /t: rc:-4 c:4 a:1[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-finalize request /proxy/1: rc:204 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=204, status=204 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-finalize request /proxy/2: rc:204 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=204, status=204 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:0 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 204[m
[31m-status: 204[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: multiple user threads + subrequests returning 404 remotely (wait)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local n = 5[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                return res.status[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, n do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                local ok, res = ngx.thread.wait(threads[i])[m
[31m-                ngx.say(i, ": ", res)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/d/$1;[m
[31m-    }[m
[31m-[m
[31m-    location /d {[m
[31m-        return 404;[m
[31m-        #echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3 eval: $::GCScript[m
[31m---- stap_out3[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-create 5 in 1[m
[31m-spawn user thread 5 in 1[m
[31m-create 6 in 1[m
[31m-spawn user thread 6 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 6: ok[m
[31m-delete thread 6[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-1: 404[m
[31m-2: 404[m
[31m-3: 404[m
[31m-4: 404[m
[31m-5: 404[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: multiple user threads + subrequests remotely (wait)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local n = 20[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                return res.status[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, n do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                local ok, res = ngx.thread.wait(threads[i])[m
[31m-                ngx.say(i, ": ", res)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/d/$1;[m
[31m-    }[m
[31m-[m
[31m-    location /d {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3 eval: $::GCScript[m
[31m---- stap_out3[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-create 5 in 1[m
[31m-spawn user thread 5 in 1[m
[31m-create 6 in 1[m
[31m-spawn user thread 6 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 6: ok[m
[31m-delete thread 6[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-1: 200[m
[31m-2: 200[m
[31m-3: 200[m
[31m-4: 200[m
[31m-5: 200[m
[31m-6: 200[m
[31m-7: 200[m
[31m-8: 200[m
[31m-9: 200[m
[31m-10: 200[m
[31m-11: 200[m
[31m-12: 200[m
[31m-13: 200[m
[31m-14: 200[m
[31m-15: 200[m
[31m-16: 200[m
[31m-17: 200[m
[31m-18: 200[m
[31m-19: 200[m
[31m-20: 200[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: simple user thread without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/094-uthread-exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/094-uthread-exit.t[m
[1mdeleted file mode 100644[m
[1mindex 4d1d316..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/094-uthread-exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,1651 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exit in user thread (entry thread is still pending to run)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-                ngx.say("g")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m-f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exit in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("exiting the user thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-exiting the user thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.tcp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_tcp_resolve_cleanup) {[m
[31m-    println("lua tcp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.udp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_resolve_cleanup) {[m
[31m-    println("lua udp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: exit in user thread (entry thread is still pending on tcpsock:connect)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(12000)[m
[31m-            local ok, err = sock:connect("106.187.41.147", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: exit in user thread (entry thread is still pending on tcpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: exit in user thread (entry thread is still pending on tcpsock:receiveuntil's iterator)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local it, err = sock:receiveuntil("\\r\\n")[m
[31m-            if not it then[m
[31m-                ngx.say("failed to receive until: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = it()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exit in user thread (entry thread is still pending on udpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_socket_cleanup) {[m
[31m-    println("lua udp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exit in user thread (entry thread is still pending on reqsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.req.socket()[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive(1024)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exit in user thread (entry thread is still pending on ngx.req.read_body)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_req_body_cleanup) {[m
[31m-    println("lua req body cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req body cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exit(0) in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: exit in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: exit in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: exit in entry thread (user thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture_multi{[m
[31m-                    {"/echo"},[m
[31m-                    {"/sleep"}[m
[31m-                }[m
[31m-                ngx.say("end")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-            ngx.exit(0)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 1: fail[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exit(444) in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: exit(408) in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(408)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: exit(499) in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(499)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[warn][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/095-uthread-exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/095-uthread-exec.t[m
[1mdeleted file mode 100644[m
[1mindex 4459360..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/095-uthread-exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,426 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exec in user thread (entry still pending)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exec in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exec in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exec in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exec in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: exec in entry thread (user thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture("/sleep")[m
[31m-                ngx.say("end")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-            ngx.exec("/foo")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 1: fail[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/096-uthread-redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/096-uthread-redirect.t[m
[1mdeleted file mode 100644[m
[1mindex b0258fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/096-uthread-redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,280 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.redirect() in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: redirect in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.redirect() in entry thread (user thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture_multi{[m
[31m-                    {"/echo"},[m
[31m-                    {"/sleep"}[m
[31m-                }[m
[31m-                ngx.say("end")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-            ngx.redirect(301)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 1: fail[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/097-uthread-rewrite.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/097-uthread-rewrite.t[m
[1mdeleted file mode 100644[m
[1mindex 178a374..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/097-uthread-rewrite.t[m
[1m+++ /dev/null[m
[36m@@ -1,347 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rewrite in user thread (entry still pending)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rewrite in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rewrite in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rewrite in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: rewrite in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/098-uthread-wait.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/098-uthread-wait.t[m
[1mdeleted file mode 100644[m
[1mindex aaf020a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/098-uthread-wait.t[m
[1m+++ /dev/null[m
[36m@@ -1,1324 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple user thread wait without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple user thread wait with I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-hello in thread[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: wait on uthreads on the reversed order of their termination[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("g: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait g: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g: ", res)[m
[31m-[m
[31m-            ngx.say("f thread status: ", coroutine.status(tf))[m
[31m-[m
[31m-            ok, res = ngx.thread.wait(tf)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait f: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f thread created: running[m
[31m-g thread created: running[m
[31m-f: hello[m
[31m-g: hello[m
[31m-g: done[m
[31m-f thread status: zombie[m
[31m-f: done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: wait on uthreads on the exact order of their termination[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("g: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-[m
[31m-            ok, res = ngx.thread.wait(tf)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait f: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f: ", res)[m
[31m-[m
[31m-            ngx.say("g thread status: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait g: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-f thread created: running[m
[31m-g thread created: running[m
[31m-f: hello[m
[31m-f: done[m
[31m-g thread status: running[m
[31m-g: hello[m
[31m-g: done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: simple user thread wait without I/O (return multiple values)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done", 3.14[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res1, res2 = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res1)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("res: ", res1, " ", res2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-res: done 3.14[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple user thread wait with I/O, return multiple values[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done", 3.14[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            local ok, res1, res2 = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait thread: ", res1)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("res: ", res1, " ", res2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-hello in thread[m
[31m-res: done 3.14[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple user thread wait without I/O, throw errors[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                error("bad bad!")[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-failed to wait thread: bad bad![m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):4: bad bad!/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple user thread wait with I/O, throw errors[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in thread")[m
[31m-                error("bad bad!")[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-hello in thread[m
[31m-failed to wait thread: bad bad![m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):5: bad bad!/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: simple user thread wait without I/O (in a user coroutine)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function g()[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function f()[m
[31m-                local t, err = ngx.thread.spawn(g)[m
[31m-                if not t then[m
[31m-                    ngx.say("failed to spawn thread: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to run thread: ", res)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say(res)[m
[31m-            end[m
[31m-[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: simple user thread wait with I/O (in a user coroutine)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function f()[m
[31m-                local t, err = ngx.thread.spawn(g)[m
[31m-                if not t then[m
[31m-                    ngx.say("failed to spawn thread: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to run thread: ", res)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say(res)[m
[31m-            end[m
[31m-[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-hello in thread[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: waiting on two simple user threads without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                out("f: hello")[m
[31m-                return "f done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                out("g: hello")[m
[31m-                return "g done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("res: ", res)[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f: hello[m
[31m-thread f created: zombie[m
[31m-g: hello[m
[31m-thread g created: zombie[m
[31m-res: f done[m
[31m-f status: dead[m
[31m-g status: zombie[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: waiting on two simple user threads with I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                out("f: hello")[m
[31m-                return "f done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                out("g: hello")[m
[31m-                return "g done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("res: ", res)[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-thread f created: running[m
[31m-thread g created: running[m
[31m-f: hello[m
[31m-res: f done[m
[31m-f status: dead[m
[31m-g status: running[m
[31m-g: hello[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: waiting on two simple user threads with I/O (uthreads completed in reversed order)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                ngx.sleep(0.2)[m
[31m-                out("f: hello")[m
[31m-                return "f done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                out("g: hello")[m
[31m-                return "g done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("res: ", res)[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-thread f created: running[m
[31m-thread g created: running[m
[31m-g: hello[m
[31m-res: g done[m
[31m-f status: running[m
[31m-g status: dead[m
[31m-f: hello[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: waiting on two simple user threads without I/O, both aborted by errors[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                out("f: hello")[m
[31m-                error("f done")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                out("g: hello")[m
[31m-                error("g done")[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-            else[m
[31m-                out("res: ", res)[m
[31m-            end[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: fail[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f: hello[m
[31m-thread f created: zombie[m
[31m-g: hello[m
[31m-thread g created: zombie[m
[31m-failed to wait thread: f done[m
[31m-f status: dead[m
[31m-g status: zombie[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):7: f done/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: waiting on two simple user threads with I/O, both aborted by errors[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                out("f: hello")[m
[31m-                error("f done")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                out("g: hello")[m
[31m-                error("g done")[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-            else[m
[31m-                out("res: ", res)[m
[31m-            end[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: fail[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: fail[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-thread f created: running[m
[31m-thread g created: running[m
[31m-f: hello[m
[31m-failed to wait thread: f done[m
[31m-f status: dead[m
[31m-g status: running[m
[31m-g: hello[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):8: f done/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: wait on uthreads on the exact order of their termination, but exit the world early[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("g: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-[m
[31m-            ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("res: ", res)[m
[31m-[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f thread created: running[m
[31m-g thread created: running[m
[31m-f: hello[m
[31m-res: done[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: wait on uthreads on the reversed order of their termination, but exit the world early[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("f: hello")[m
[31m-                return "f done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("g: hello")[m
[31m-                return "g done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-[m
[31m-            ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("res: ", res)[m
[31m-[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f thread created: running[m
[31m-g thread created: running[m
[31m-g: hello[m
[31m-res: g done[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entry coroutine waiting on a thread not created by itself[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                t = ngx.thread.spawn(f)[m
[31m-            end[m
[31m-[m
[31m-            local co = coroutine.create(g)[m
[31m-            coroutine.resume(co)[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 2: ok[m
[31m-terminate 1: fail[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-only the parent coroutine can wait on the thread[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: entry coroutine waiting on a user coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                coroutine.yield()[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(co)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: fail[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/lua entry thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):11: attempt to wait on a coroutine that is not a user thread/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: lua backtrace dumper may access dead parent coroutines[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                collectgarbage()[m
[31m-                error("f done")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("ok")[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: fail[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):5: f done/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: waiting on a dead coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-failed to run thread: already waited or killed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: spawn and wait uthreads for many times[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                -- ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 100 do[m
[31m-                local t, err = ngx.thread.spawn(f)[m
[31m-                if not t then[m
[31m-                    ngx.say("failed to spawn thread: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-[m
[31m-                -- ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to run thread: ", res)[m
[31m-                    break[m
[31m-                end[m
[31m-[m
[31m-                ngx.say(i, ": ", res)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval[m
[31m-my $s = '';[m
[31m-for my $i (1..100) {[m
[31m-    $s .= "$i: done\n";[m
[31m-}[m
[31m-$s;[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/099-c-api.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/099-c-api.t[m
[1mdeleted file mode 100644[m
[1mindex a0b375c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/099-c-api.t[m
[1m+++ /dev/null[m
[36m@@ -1,397 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: find zone[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-            ]][m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local zone = ffi.C.ngx_http_lua_find_zone(buf, 3)[m
[31m-            ngx.say("foo zone: ", tonumber(ffi.cast("long", zone)) ~= 0 and "defined" or "undef")[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-            ngx.say("dogs zone: ", tonumber(ffi.cast("long", zone)) ~= 0 and "defined" or "undef")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo zone: undef[m
[31m-dogs zone: defined[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: number typed value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 1234567)[m
[31m-            dogs:set("bar", 3.14159)[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc),[m
[31m-                ", type=", val[0].type,[m
[31m-                ", val=", tonumber(val[0].value.n))[m
[31m-[m
[31m-            ffi.copy(buf, "bar", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("bar: rc=", tonumber(rc),[m
[31m-                ", type=", val[0].type,[m
[31m-                ", val=", tonumber(val[0].value.n))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=0, type=3, val=1234567[m
[31m-bar: rc=0, type=3, val=3.14159[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: boolean typed value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", true)[m
[31m-            dogs:set("bar", false)[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc),[m
[31m-                ", type=", tonumber(val[0].type),[m
[31m-                ", val=", tonumber(val[0].value.b))[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-            ffi.copy(buf, "bar", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("bar: rc=", tonumber(rc),[m
[31m-                ", type=", tonumber(val[0].type),[m
[31m-                ", val=", tonumber(val[0].value.b))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=0, type=1, val=1[m
[31m-bar: rc=0, type=1, val=0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: key not found[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:flush_all()[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc))[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-            ffi.copy(buf, "bar", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("bar: rc=", tonumber(rc))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=-5[m
[31m-bar: rc=-5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: string typed value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "hello world")[m
[31m-            dogs:set("bar", "")[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local s = ffi.new("char[?]", 20)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-            val[0].value.s.len = 20[m
[31m-            val[0].value.s.data = s[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc),[m
[31m-                ", type=", tonumber(val[0].type),[m
[31m-                ", val=", ffi.string(val[0].value.s.data, val[0].value.s.len),[m
[31m-                ", len=", tonumber(val[0].value.s.len))[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-            val[0].value.s.len = 20[m
[31m-            val[0].value.s.data = s[m
[31m-[m
[31m-            ffi.copy(buf, "bar", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("bar: rc=", tonumber(rc),[m
[31m-                ", type=", tonumber(val[0].type),[m
[31m-                ", val=", ffi.string(val[0].value.s.data, val[0].value.s.len),[m
[31m-                ", len=", tonumber(val[0].value.s.len))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=0, type=4, val=hello world, len=11[m
[31m-bar: rc=0, type=4, val=, len=0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: nil typed value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", nil)[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=-5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: find zone (multiple zones)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-            ]][m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-            ffi.copy(buf, "cats", 4)[m
[31m-            local zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-            local cats = tostring(zone)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-            local dogs = tostring(zone)[m
[31m-[m
[31m-            ngx.say("dogs == cats ? ", dogs == cats)[m
[31m-            -- ngx.say("dogs: ", dogs)[m
[31m-            -- ngx.say("cats ", cats)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-dogs == cats ? false[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/100-client-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/100-client-abort.t[m
[1mdeleted file mode 100644[m
[1mindex cd46859..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/100-client-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,1067 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: subrequest + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: subrequest + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: fail[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad things happen[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: subrequest + stop (proxy, ignore client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: subrequest + stop (proxy, check client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort off;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: need body on + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.req.socket + receive() + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.req.socket + receive(N) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(5)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.req.socket + receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:lua check broken conn[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup|lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.req.socket + m * receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(1)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.req.socket + receiveuntil + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.req.socket + receiveuntil + it(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it(2)[m
[31m-            it(3)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- wait: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: cosocket + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "failed to get socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("blpop nonexist 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.log(ngx.ERR, "about to receive")[m
[31m-[m
[31m-            local res, err = sock:receive()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to receive query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "res: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.req.socket + receive n < content-length + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err, part = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err, ": ", part)[m
[31m-                return[m
[31m-            end[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 100\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to receive: client aborted: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.req.socket + receive n < content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err, part = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err, ": ", part)[m
[31m-                return[m
[31m-            end[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 100\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to receive: client aborted: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.req.socket + receive n == content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.sleep(0.1)[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:lua check broken conn[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup|lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- shutdown[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.req.socket + receive n == content-length + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.sleep(0.1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exec to lua + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: exec to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: exec (named location) to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location @t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: bug in ngx_http_upstream_test_connect for kqueue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        proxy_pass http://127.0.0.1:1234/;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-qr{connect\(\) failed \(\d+: Connection refused\) while connecting to upstream}[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: sleep (default off)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx.say[m
[31m---- config[m
[31m-    location /t {[m
[31m-        postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.say("hello")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "say failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-say failed: nginx output filter error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx.print[m
[31m---- config[m
[31m-    location /t {[m
[31m-        postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.print("hello")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "print failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-print failed: nginx output filter error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: ngx.send_headers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.send_headers()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "send headers failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "send headers succeeded")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-send headers succeeded[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: ngx.flush[m
[31m---- config[m
[31m-    location /t {[m
[31m-        #postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.flush()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "flush succeeded")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-flush succeeded[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: ngx.eof[m
[31m---- config[m
[31m-    location /t {[m
[31m-        postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "eof succeeded")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-eof succeeded[m
[31m---- error_log[m
[31m-eof failed: nginx output filter error[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/101-on-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/101-on-abort.t[m
[1mdeleted file mode 100644[m
[1mindex 81cec78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/101-on-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,849 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 19);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ignore the client abort event in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-(?:lua check broken conn[m
[31m-)?terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: abort in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.exit(499) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exit(408) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(408)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(-1) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(-1)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(0) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(0)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.log(ngx.ERR, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.7;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-'client prematurely closed connection',[m
[31m-'on abort called',[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):4: attempt to abort with pending subrequests/,[m
[31m-'main handler done',[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: accessing cosocket in callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flushall\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive()[m
[31m-                if not res then[m
[31m-                    ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                ngx.log(ngx.NOTICE, "callback done: ", res)[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.5[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-callback done: +OK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ignore the client abort event in the user callback (no check)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("cannot set on_abort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- response_body[m
[31m-cannot set on_abort: lua_check_client_abort is off[m
[31m---- no_error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: regsiter on_abort callback but no client abortion[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ignore the client abort event in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abort in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- wait: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: regsiter on_abort callback but no client abortion (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: regsiter on_abort callback multiple times[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("1: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("2: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-2: cannot set on_abort: duplicate call[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: abort with 499 in the user callback, but the header is already sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.send_headers()[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: abort with 444 in the user callback, but the header is already sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.send_headers()[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: abort with 408 in the user callback, but the header is already sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(408)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.send_headers()[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- wait: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: GC issue with the on_abort thread object[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.on_abort(function () end)[m
[31m-            collectgarbage()[m
[31m-            ngx.sleep(60)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- abort[m
[31m---- timeout: 0.2[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: regsiter on_abort callback but no client abortion (2 uthreads and 1 pending)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-                ngx.exit(200)[m
[31m-            end)[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(100)[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 4[m
[31m-[m
[31m---- wait: 0.5[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/102-req-start-time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/102-req-start-time.t[m
[1mdeleted file mode 100644[m
[1mindex 1d5fe28..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/102-req-start-time.t[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-# -*- mode: conf -*-[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: start time[m
[31m---- config[m
[31m-    location = /start {[m
[31m-        content_by_lua 'ngx.say(ngx.req.start_time())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /start[m
[31m---- response_body_like: ^\d{10,}(\.\d+)?$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: start time in set_by_lua[m
[31m---- config[m
[31m-    location = /start {[m
[31m-        set_by_lua $a 'return ngx.req.start_time()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /start[m
[31m---- response_body_like: ^\d{10,}(\.\d+)?$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: request time[m
[31m---- config[m
[31m-    location = /req_time {[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            local req_time = ngx.now() - ngx.req.start_time()[m
[31m-[m
[31m-            ngx.say(req_time)[m
[31m-            ngx.say(ngx.req.start_time() < ngx.now())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /req_time[m
[31m---- response_body_like chop[m
[31m-^(?:0\.[12]|0\.099)\d*[m
[31m-true$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: request time update[m
[31m---- config[m
[31m-    location = /req_time {[m
[31m-            content_by_lua '[m
[31m-               ngx.sleep(0.1)[m
[31m-[m
[31m-               local req_time = ngx.now() - ngx.req.start_time()[m
[31m-[m
[31m-               ngx.sleep(0.1)[m
[31m-[m
[31m-               ngx.update_time()[m
[31m-[m
[31m-               local req_time_updated = ngx.now() - ngx.req.start_time()[m
[31m-[m
[31m-               ngx.say(req_time)[m
[31m-               ngx.say(req_time_updated)[m
[31m-               ngx.say(req_time_updated > req_time)[m
[31m-            ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /req_time[m
[31m---- response_body_like chomp[m
[31m-^(?:0\.[12]|0\.099)\d*[m
[31m-0\.\d+[m
[31m-true$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        time = ngx.req.start_time()[m
[31m-    ';[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(time)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/103-req-http-ver.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/103-req-http-ver.t[m
[1mdeleted file mode 100644[m
[1mindex 6ded75a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/103-req-http-ver.t[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: HTTP 1.1[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.req.http_version())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: HTTP 1.0[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.req.http_version())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/104-req-raw-header.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/104-req-raw-header.t[m
[1mdeleted file mode 100644[m
[1mindex 439b9de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/104-req-raw-header.t[m
[1m+++ /dev/null[m
[36m@@ -1,879 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 15);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: small header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: large header[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: large header (no request line)[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: small header (no request line)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: small header (no request line, with leading CRLF)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: small header, with leading CRLF[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: large header, with leading CRLF[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-".[m
[31m-(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: large header, with leading CRLF, excluding request line[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-".[m
[31m-(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: large header, with lots of leading CRLF, excluding request line[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-("\r\n" x 534) . "GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-".[m
[31m-(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: small header, pipelined[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /th"][m
[31m-[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-}, qq{GET /th HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: large header, pipelined[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m-[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-my $headers = (CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n";[m
[31m-[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-$headers},[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-$headers}][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: small header, multi-line header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar baz\r[m
[31m-  blah\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar baz\r[m
[31m-  blah\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: large header, multi-line header[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 50 567;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-my $headers = (CORE::join "\r\n", map { "Header$_: value-$_\r\n hello $_ world blah blah" } 1..512) . "\r\n\r\n";[m
[31m-[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-$headers}[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_\r\n hello $_ world blah blah" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: small header (POST body)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: small header (POST body) - in subrequests[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/t")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: large header (POST body)[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join"\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: large header (POST body) - in subrequests[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/t")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join"\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: large header (POST body) - r->header_end is outside r->header_in[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 564;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join("\n", map { "Header$_: value-$_" } 1..80) . "\nA: abcdefghijklmnopqrs\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..80)[m
[31m-. "\r\nA: abcdefghijklmnopqrs\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: large header (POST body) - r->header_end is outside r->header_in (2)[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 564;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join("\n", map { "Header$_: value-$_" } 1..52) . "\nA: abcdefghijklmnopqrs\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..52)[m
[31m-. "\r\nA: abcdefghijklmnopqrs\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: raw_header (the default header buffer can hold the request line, but not the header entries) - without request line)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-           ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-$s .= "Accept: */*\n";[m
[31m-$s .= "Cookie: " . "C" x 1200 . "\n";[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"Host: localhost\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-Accept: */*\r[m
[31m-Cookie: " . ("C" x 1200) . "\r\n\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: raw_header (the default header buffer can hold the request line, but not the header entries) - with request line)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-           ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-$s .= "Accept: */*\n";[m
[31m-$s .= "Cookie: " . "C" x 1200 . "\n";[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-Accept: */*\r[m
[31m-Cookie: " . ("C" x 1200) . "\r\n\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (exclusive LF in the request data)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (exclusive LF in the request data, and no status line)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (mixed LF and CRLF in the request data, and no status line)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (another way of mixing LF and CRLF in the request data, and no status line)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5[m
[31m-\r[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: two pipelined requests with large headers[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 3 5610;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..585[m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..585) . "\r\n\r\n",[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..585) . "\r\n\r\n",[m
[31m-,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: a request with large header and a smaller pipelined request following[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 2 1921;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m---- more_headers eval[m
[31m-[CORE::join("\n", map { "Header$_: value-$_" } 1..170), "Foo: bar\n"][m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..170) . "\r\n\r\n",[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-},[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: a request with large header and a smaller pipelined request following[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 2 1921;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t" . ("a" x 512)][m
[31m---- more_headers eval[m
[31m-[CORE::join("\n", map { "Header$_: value-$_" } 1..170), "Foo: bar\n"][m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..170) . "\r\n\r\n",[m
[31m-qq{GET /t} . ("a" x 512) . qq{ HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-},[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/105-pressure.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/105-pressure.t[m
[1mdeleted file mode 100644[m
[1mindex 10f495e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/105-pressure.t[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#log_level('debug');[m
[31m-[m
[31m-repeat_each(20);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-#warn $html_dir;[m
[31m-[m
[31m-our $Id;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: memory issue in the "args" string option for ngx.location.capture[m
[31m---- config[m
[31m-    location /test1 {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/test2/auth", {args = ngx.var.args})[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /test2 {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage()[m
[31m-            ngx.say(ngx.var.args)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request eval[m
[31m-$::Id = int rand 10000;[m
[31m-"GET /test1?parent=$::Id&name=2013031816214284300707&footprint=dsfasfwefklds"[m
[31m-[m
[31m---- response_body eval[m
[31m-"parent=$::Id&name=2013031816214284300707&footprint=dsfasfwefklds\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/106-timer.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/106-timer.t[m
[1mdeleted file mode 100644[m
[1mindex d0f6f36..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/106-timer.t[m
[1m+++ /dev/null[m
[36m@@ -1,2196 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 8 + 72);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-[m
[31m-worker_connections(1024);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple at[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f(premature)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-timer prematurely expired: true[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])\d*, context: ngx\.timer, client: \d+\.\d+\.\d+\.\d+, server: 0\.0\.0\.0:\d+/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"timer prematurely expired: false",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: separated global env[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                foo = 3[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.06)[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-foo = nil[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: lua variable sharing via upvalue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local foo[m
[31m-            local function f()[m
[31m-                foo = 3[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.06)[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-foo = 3[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: simple at (sleep in the timer callback)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                ngx.sleep(0.02)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.12[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:6[4-9]|7[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: tcp cosocket in timer handler (short connections)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local port = $TEST_NGINX_SERVER_PORT[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    fail("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("connected: ", ok)[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                -- req = "OK"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    fail("failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("request sent: ", bytes)[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if line then[m
[31m-                        print("received: ", line)[m
[31m-[m
[31m-                    else[m
[31m-                        if err == "closed" then[m
[31m-                            break[m
[31m-                        end[m
[31m-                        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-                print("close: ", ok, " ", err)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"connected: 1",[m
[31m-"request sent: 57",[m
[31m-"received: HTTP/1.1 200 OK",[m
[31m-qr/received: Server: \S+/,[m
[31m-"received: Content-Type: text/plain",[m
[31m-"received: Content-Length: 4",[m
[31m-"received: Connection: close",[m
[31m-"received: foo",[m
[31m-"close: 1 nil",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: tcp cosocket in timer handler (keep-alive connections)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: 0 timer[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0(?:[^.]|\.00)/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: udp cosocket in timer handler[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                local socket = ngx.socket[m
[31m-                -- local socket = require "socket"[m
[31m-[m
[31m-                local udp = socket.udp()[m
[31m-[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-                local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    fail("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("connected: ", ok)[m
[31m-[m
[31m-                local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-                local ok, err = udp:send(req)[m
[31m-                if not ok then[m
[31m-                    fail("failed to send: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data, err = udp:receive()[m
[31m-                if not data then[m
[31m-                    fail("failed to receive data: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                print("received ", #data, " bytes: ", data)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"connected: 1",[m
[31m-"received 12 bytes: \x{00}\x{01}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: simple at (sleep in the timer callback) - log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        log_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                ngx.sleep(0.02)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello world[m
[31m-[m
[31m---- wait: 0.12[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-qr/\[lua\] log_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:6[4-9]|7[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: tcp cosocket in timer handler (keep-alive connections) - log_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: tcp cosocket in timer handler (keep-alive connections) - header_filter_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: tcp cosocket in timer handler (keep-alive connections) - body_filter_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set keep alive: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-(?:terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-|terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: tcp cosocket in timer handler (keep-alive connections) - set_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $a '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-            return 32[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: coroutine API[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-            local function f()[m
[31m-                function f()[m
[31m-                    local cnt = 0[m
[31m-                    for i = 1, 20 do[m
[31m-                        print("cnt = ", cnt)[m
[31m-                        cy()[m
[31m-                        cnt = cnt + 1[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                local c = cc(f)[m
[31m-                for i=1,3 do[m
[31m-                    cr(c)[m
[31m-                    print("after resume, i = ", i)[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"cnt = 0",[m
[31m-"after resume, i = 1",[m
[31m-"cnt = 1",[m
[31m-"after resume, i = 2",[m
[31m-"cnt = 2",[m
[31m-"after resume, i = 3",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.thread API[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function fail (...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function handle()[m
[31m-                function f()[m
[31m-                    print("hello in thread")[m
[31m-                    return "done"[m
[31m-                end[m
[31m-[m
[31m-                local t, err = ngx.thread.spawn(f)[m
[31m-                if not t then[m
[31m-                    fail("failed to spawn thread: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    fail("failed to run thread: ", res)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("wait result: ", res)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, handle)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"hello in thread",[m
[31m-"thread created: zombie",[m
[31m-"wait result: done",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: shared dict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                dogs:set("foo", 32)[m
[31m-                dogs:set("bah", 10502)[m
[31m-                local val = dogs:get("foo")[m
[31m-                print("get foo: ", val, " ", type(val))[m
[31m-                val = dogs:get("bah")[m
[31m-                print("get bah: ", val, " ", type(val))[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"get foo: 32 number",[m
[31m-"get bah: 10502 number",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.exit(0)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local function g()[m
[31m-                    print("BEFORE ngx.exit")[m
[31m-                    ngx.exit(0)[m
[31m-                end[m
[31m-                g()[m
[31m-                print("CANNOT REACH HERE")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE ngx.exit",[m
[31m-][m
[31m---- no_error_log[m
[31m-CANNOT REACH HERE[m
[31m-API disabled[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.exit(403)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local function g()[m
[31m-                    print("BEFORE ngx.exit")[m
[31m-                    ngx.exit(403)[m
[31m-                end[m
[31m-                g()[m
[31m-                print("CANNOT REACH HERE")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-CANNOT REACH HERE[m
[31m-API disabled[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE ngx.exit",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function handle()[m
[31m-                local function f()[m
[31m-                    print("hello in thread")[m
[31m-                    ngx.sleep(0.1)[m
[31m-                    ngx.exit(0)[m
[31m-                end[m
[31m-[m
[31m-                print("BEFORE thread spawn")[m
[31m-                ngx.thread.spawn(f)[m
[31m-                print("AFTER thread spawn")[m
[31m-                ngx.sleep(1)[m
[31m-                print("entry thread END")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, handle)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-(?:create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-free request[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 2|create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-free request[m
[31m-expire timer 100[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-API disabled[m
[31m-entry thread END[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE thread spawn",[m
[31m-"hello in thread",[m
[31m-"AFTER thread spawn",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: chained timers (0 delay)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua ngx.timer expired',[m
[31m-'http lua close fake http connection',[m
[31m-qr/trace: \[m\]\[f\]\[g\], context: ngx\.timer, client: \d+\.\d+\.\d+\.\d+, server: 0\.0\.0\.0:\d+/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: chained timers (non-zero delay)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0.01, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: multiple parallel timers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                fail("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, g)[m
[31m-            if not ok then[m
[31m-                fail("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: lua_max_pending_timers[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 1;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-failed to set timer g: too many pending timers[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: lua_max_pending_timers (just not exceeding)[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 2;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: lua_max_pending_timers - chained timers (non-zero delay) - not exceeding[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 1;[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0.01, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: lua_max_pending_timers - chained timers (zero delay) - not exceeding[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 1;[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: lua_max_running_timers (just not enough)[m
[31m---- http_config[m
[31m-    lua_max_running_timers 1;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[alert\] .*? 1 lua_max_running_timers are not enough/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: lua_max_running_timers (just enough)[m
[31m---- http_config[m
[31m-    lua_max_running_timers 2;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: lua_max_running_timers (just enough) - 2[m
[31m---- http_config[m
[31m-    lua_max_running_timers 2;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.timer.at(0.02, f)[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 4 in 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: user args[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f(premature, a, b, c)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-                print("timer user args: ", a, " ", b, " ", c)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f, 1, "hello", true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-timer prematurely expired: true[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])\d*, context: ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"timer prematurely expired: false",[m
[31m-"timer user args: 1 hello true",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: use of ngx.ctx[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f(premature)[m
[31m-                ngx.ctx.s = "hello"[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-timer prematurely expired: true[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: .*?, context: ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"timer prematurely expired: false",[m
[31m-"lua release ngx.ctx at ref ",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: syslog error log[m
[31m---- http_config[m
[31m-    #error_log syslog:server=127.0.0.1:12345 error;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.log(ngx.ERR, "Bad bad bad")[m
[31m-            end[m
[31m-            ngx.timer.at(0, f)[m
[31m-            ngx.sleep(0.001)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- log_level: error[m
[31m---- error_log_file: syslog:server=127.0.0.1:12345[m
[31m---- udp_listen: 12345[m
[31m---- udp_query eval: qr/Bad bad bad/[m
[31m---- udp_reply: hello[m
[31m---- wait: 0.1[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-Bad bad bad[m
[31m---- skip_nginx: 4: < 1.7.1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/107-timer-errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/107-timer-errors.t[m
[1mdeleted file mode 100644[m
[1mindex 9ed1334..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/107-timer-errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,1423 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 7);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: accessing nginx variables[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                print("uri: ", ngx.var.uri)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: reading ngx.status[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                print("uri: ", ngx.status)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: writing ngx.status[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.status = 200[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.req.raw_header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                print("raw header: ", ngx.req.raw_header())[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.req.get_headers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_headers()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.req.set_header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_header("Foo", 32)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.req.clear_header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.clear_header("Foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.req.set_uri[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_uri("/foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.set_uri_args[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_uri_args("foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.redirect()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.redirect("/foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.exec()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.say()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.say("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.print()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.print("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.flush()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.flush()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.send_headers()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.send_headers()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.req.get_uri_args()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_uri_args()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.req.read_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.read_body()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.req.discard_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.discard_body()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.req.init_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.init_body()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.header.Foo = 3[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.on_abort[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.on_abort(f)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx.location.capture[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.location.capture("/")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.location.capture_multi[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.location.capture_multi{{"/"}}[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx.req.get_method[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_method()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx.req.set_method[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_method(ngx.HTTP_POST)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: ngx.req.http_version[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.http_version()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx.req.get_post_args[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_post_args()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx.req.get_body_data[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_body_data()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: ngx.req.get_body_file[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_body_file()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: ngx.req.set_body_data[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_body_data("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: ngx.req.set_body_file[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_body_file("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: ngx.req.append_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.append_body("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: ngx.req.finish_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.finish_body()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: ngx.headers_sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.headers_sent()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: ngx.eof[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.eof()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: ngx.req.socket[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local sock, err = ngx.req.socket()[m
[31m-                if not sock then[m
[31m-                    ngx.log(ngx.ERR, "failed to get req sock: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/108-timer-safe.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/108-timer-safe.t[m
[1mdeleted file mode 100644[m
[1mindex 19c9f6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/108-timer-safe.t[m
[1m+++ /dev/null[m
[36m@@ -1,1398 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 8 + 60);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-[m
[31m-worker_connections(1024);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple at[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.05)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple at (sleep in the timer callback)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                ngx.sleep(0.02)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.05)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:6[4-9]|7[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: tcp cosocket in timer handler (short connections)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local port = $TEST_NGINX_SERVER_PORT[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    fail("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("connected: ", ok)[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                -- req = "OK"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    fail("failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("request sent: ", bytes)[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if line then[m
[31m-                        print("received: ", line)[m
[31m-[m
[31m-                    else[m
[31m-                        if err == "closed" then[m
[31m-                            break[m
[31m-                        end[m
[31m-                        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-                print("close: ", ok, " ", err)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.02)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3 eval: $::GCScript[m
[31m---- stap_out2[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"connected: 1",[m
[31m-"request sent: 57",[m
[31m-"received: HTTP/1.1 200 OK",[m
[31m-qr/received: Server: \S+/,[m
[31m-"received: Content-Type: text/plain",[m
[31m-"received: Content-Length: 4",[m
[31m-"received: Connection: close",[m
[31m-"received: foo",[m
[31m-"close: 1 nil",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: tcp cosocket in timer handler (keep-alive connections)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.02)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3 eval: $::GCScript[m
[31m---- stap_out2[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: 0 timer[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.02[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0(?:[^.]|\.00)/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: udp cosocket in timer handler[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                local socket = ngx.socket[m
[31m-                -- local socket = require "socket"[m
[31m-[m
[31m-                local udp = socket.udp()[m
[31m-[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-                local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    fail("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("connected: ", ok)[m
[31m-[m
[31m-                local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-                local ok, err = udp:send(req)[m
[31m-                if not ok then[m
[31m-                    fail("failed to send: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data, err = udp:receive()[m
[31m-                if not data then[m
[31m-                    fail("failed to receive data: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                print("received ", #data, " bytes: ", data)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.05)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"connected: 1",[m
[31m-"received 12 bytes: \x{00}\x{01}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple at (sleep in the timer callback) - log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo_sleep 0.07;[m
[31m-        log_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                ngx.sleep(0.02)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello world[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-qr/\[lua\] log_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:6[4-9]|7[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: tcp cosocket in timer handler (keep-alive connections) - log_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        echo_sleep 0.01;[m
[31m-        log_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: tcp cosocket in timer handler (keep-alive connections) - header_filter_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        echo_sleep 0.01;[m
[31m-        header_filter_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: tcp cosocket in timer handler (keep-alive connections) - body_filter_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-(?:terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-|terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: tcp cosocket in timer handler (keep-alive connections) - set_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $a '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-            return 32[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-        echo_sleep 0.01;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: coroutine API[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-            local function f()[m
[31m-                function f()[m
[31m-                    local cnt = 0[m
[31m-                    for i = 1, 20 do[m
[31m-                        print("cnt = ", cnt)[m
[31m-                        cy()[m
[31m-                        cnt = cnt + 1[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                local c = cc(f)[m
[31m-                for i=1,3 do[m
[31m-                    cr(c)[m
[31m-                    print("after resume, i = ", i)[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.01)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"cnt = 0",[m
[31m-"after resume, i = 1",[m
[31m-"cnt = 1",[m
[31m-"after resume, i = 2",[m
[31m-"cnt = 2",[m
[31m-"after resume, i = 3",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.thread API[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function fail (...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function handle()[m
[31m-                function f()[m
[31m-                    print("hello in thread")[m
[31m-                    return "done"[m
[31m-                end[m
[31m-[m
[31m-                local t, err = ngx.thread.spawn(f)[m
[31m-                if not t then[m
[31m-                    fail("failed to spawn thread: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    fail("failed to run thread: ", res)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("wait result: ", res)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, handle)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.02)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"hello in thread",[m
[31m-"thread created: zombie",[m
[31m-"wait result: done",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: shared dict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                dogs:set("foo", 32)[m
[31m-                dogs:set("bah", 10502)[m
[31m-                local val = dogs:get("foo")[m
[31m-                print("get foo: ", val, " ", type(val))[m
[31m-                val = dogs:get("bah")[m
[31m-                print("get bah: ", val, " ", type(val))[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.02)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"get foo: 32 number",[m
[31m-"get bah: 10502 number",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.exit(0)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local function g()[m
[31m-                    print("BEFORE ngx.exit")[m
[31m-                    ngx.exit(0)[m
[31m-                end[m
[31m-                g()[m
[31m-                print("CANNOT REACH HERE")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.01)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE ngx.exit",[m
[31m-][m
[31m---- no_error_log[m
[31m-CANNOT REACH HERE[m
[31m-API disabled[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.exit(403)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local function g()[m
[31m-                    print("BEFORE ngx.exit")[m
[31m-                    ngx.exit(403)[m
[31m-                end[m
[31m-                g()[m
[31m-                print("CANNOT REACH HERE")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.01)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-CANNOT REACH HERE[m
[31m-API disabled[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE ngx.exit",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function handle()[m
[31m-                local function f()[m
[31m-                    print("hello in thread")[m
[31m-                    ngx.sleep(0.1)[m
[31m-                    ngx.exit(0)[m
[31m-                end[m
[31m-[m
[31m-                print("BEFORE thread spawn")[m
[31m-                ngx.thread.spawn(f)[m
[31m-                print("AFTER thread spawn")[m
[31m-                ngx.sleep(1)[m
[31m-                print("entry thread END")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, handle)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.12)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-API disabled[m
[31m-entry thread END[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE thread spawn",[m
[31m-"hello in thread",[m
[31m-"AFTER thread spawn",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: chained timers (non-zero delay)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0.01, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-            ngx.sleep(0.03)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/109-timer-hup.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/109-timer-hup.t[m
[1mdeleted file mode 100644[m
[1mindex 15aaa0e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/109-timer-hup.t[m
[1m+++ /dev/null[m
[36m@@ -1,503 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-our $SkipReason;[m
[31m-[m
[31m-BEGIN {[m
[31m-    if ($ENV{TEST_NGINX_CHECK_LEAK}) {[m
[31m-        $SkipReason = "unavailable for the hup tests";[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{TEST_NGINX_USE_HUP} = 1;[m
[31m-        undef $ENV{TEST_NGINX_USE_STAP};[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua $SkipReason ? (skip_all => $SkipReason) : ();[m
[31m-[m
[31m-[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 81;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-[m
[31m-worker_connections(1024);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single timer[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local i = 0[m
[31m-            local function f(premature)[m
[31m-                i = i + 1[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-                print("in callback: hello, ", i)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(3, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-timer prematurely expired: false[m
[31m-[m
[31m---- error_log[m
[31m-lua abort pending timers[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-in callback: hello, 1[m
[31m-timer prematurely expired: true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multiple timers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local i = 0[m
[31m-            local function f(premature)[m
[31m-                i = i + 1[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-                print("in callback: hello, ", i, "!")[m
[31m-            end[m
[31m-            for i = 1, 10 do[m
[31m-                local ok, err = ngx.timer.at(3, f)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("registered timers")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timers[m
[31m-[m
[31m---- wait: 0.3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 11![m
[31m-timer prematurely expired: false[m
[31m-[m
[31m---- error_log[m
[31m-lua abort pending timers[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-in callback: hello, 1![m
[31m-in callback: hello, 2![m
[31m-in callback: hello, 3![m
[31m-in callback: hello, 4![m
[31m-in callback: hello, 5![m
[31m-in callback: hello, 6![m
[31m-in callback: hello, 7![m
[31m-in callback: hello, 8![m
[31m-in callback: hello, 9![m
[31m-in callback: hello, 10![m
[31m-timer prematurely expired: true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: trying to add new timer after HUP reload[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local function f(premature)[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-                local ok, err = ngx.timer.at(3, f)[m
[31m-                if not ok then[m
[31m-                    print("failed to register a new timer after reload: ", err)[m
[31m-                else[m
[31m-                    print("registered a new timer after reload")[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(3, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-timer prematurely expired: false[m
[31m-[m
[31m---- error_log[m
[31m-lua abort pending timers[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-timer prematurely expired: true[m
[31m-failed to register a new timer after reload: process exiting, context: ngx.timer[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: trying to add new timer after HUP reload[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local function g(premature)[m
[31m-                print("g: timer prematurely expired: ", premature)[m
[31m-                print("g: exiting=", ngx.worker.exiting())[m
[31m-            end[m
[31m-[m
[31m-            local function f(premature)[m
[31m-                print("f: timer prematurely expired: ", premature)[m
[31m-                print("f: exiting=", ngx.worker.exiting())[m
[31m-                local ok, err = ngx.timer.at(0, g)[m
[31m-                if not ok then[m
[31m-                    print("f: failed to register a new timer after reload: ", err)[m
[31m-                else[m
[31m-                    print("f: registered a new timer after reload")[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(3, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-failed to register a new timer after reload[m
[31m-[m
[31m---- error_log[m
[31m-lua abort pending timers[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-f: timer prematurely expired: true[m
[31m-f: registered a new timer after reload[m
[31m-f: exiting=true[m
[31m-g: timer prematurely expired: false[m
[31m-g: exiting=true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: HUP reload should abort pending timers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local function f(premature)[m
[31m-                print("f: timer prematurely expired: ", premature)[m
[31m-                print("f: exiting=", ngx.worker.exiting())[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 100 do[m
[31m-                local ok, err = ngx.timer.at(3 + i, f)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- wait: 0.5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-failed to register a new timer after reload[m
[31m-[m
[31m---- grep_error_log eval: qr/lua found \d+ pending timers/[m
[31m---- grep_error_log_out[m
[31m-lua found 100 pending timers[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: HUP reload should abort pending timers (coroutine + cosocket)[m
[31m---- http_config[m
[31m-    lua_shared_dict test_dict 1m;[m
[31m-[m
[31m-    server {[m
[31m-        listen 12355;[m
[31m-        location = /foo {[m
[31m-            echo 'foo';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local http_req = {"GET /foo HTTP/1.1", "Host: localhost:1234", "", ""}[m
[31m-            http_req = table.concat(http_req, "\\r\\n")[m
[31m-[m
[31m-            -- Connect the socket[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok,err = sock:connect("127.0.0.1", 12355)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, err)[m
[31m-            end[m
[31m-[m
[31m-            -- Send the request[m
[31m-            local ok,err = sock:send(http_req)[m
[31m-[m
[31m-            -- Get Headers[m
[31m-            repeat[m
[31m-                local line, err = sock:receive("*l")[m
[31m-            until not line or string.find(line, "^%s*$")[m
[31m-[m
[31m-            function foo()[m
[31m-                repeat[m
[31m-                    -- Get and read chunk[m
[31m-                    local line, err = sock:receive("*l")[m
[31m-                    local len = tonumber(line)[m
[31m-                    if len > 0 then[m
[31m-                        local chunk, err = sock:receive(len)[m
[31m-                        coroutine.yield(chunk)[m
[31m-                        sock:receive(2)[m
[31m-                    else[m
[31m-                        -- Read last newline[m
[31m-                        sock:receive(2)[m
[31m-                    end[m
[31m-                until len == 0[m
[31m-            end[m
[31m-[m
[31m-            co = coroutine.create(foo)[m
[31m-            repeat[m
[31m-                local chunk = select(2,coroutine.resume(co))[m
[31m-            until chunk == nil[m
[31m-[m
[31m-            -- Breaks the timer[m
[31m-            sock:setkeepalive()[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-[m
[31m-        log_by_lua '[m
[31m-            local background_thread[m
[31m-            background_thread = function(premature)[m
[31m-                ngx.log(ngx.DEBUG, premature)[m
[31m-                if premature then[m
[31m-                    ngx.shared["test_dict"]:delete("background_flag")[m
[31m-                    return[m
[31m-                end[m
[31m-                local ok, err = ngx.timer.at(1, background_thread)[m
[31m-[m
[31m-                local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-                if not f then[m
[31m-                    ngx.say("failed to open nginx.pid: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                local pid = f:read()[m
[31m-                -- ngx.say("master pid: [", pid, "]")[m
[31m-                f:close()[m
[31m-[m
[31m-                os.execute("kill -HUP " .. pid)[m
[31m-            end[m
[31m-            local dict = ngx.shared["test_dict"][m
[31m-[m
[31m-            if dict:get("background_flag") == nil then[m
[31m-                local ok, err = ngx.timer.at(0, background_thread)[m
[31m-                if ok then[m
[31m-                    dict:set("test_dict", 1)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- wait: 0.3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-failed to register a new timer after reload[m
[31m-[m
[31m---- grep_error_log eval: qr/lua found \d+ pending timers/[m
[31m---- grep_error_log_out[m
[31m-lua found 1 pending timers[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: HUP reload should abort pending timers (fuzz test)[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 8192;[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local job = function(premature, kill)[m
[31m-                if premature then[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if kill then[m
[31m-                    local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-                    if not f then[m
[31m-                        ngx.log(ngx.ERR, "failed to open nginx.pid: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    local pid = f:read()[m
[31m-                    -- ngx.say("master pid: [", pid, "]")[m
[31m-                    f:close()[m
[31m-[m
[31m-                    os.execute("kill -HUP " .. pid)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            math.randomseed(ngx.time())[m
[31m-            local rand = math.random[m
[31m-            local newtimer = ngx.timer.at[m
[31m-            for i = 1, 8191 do[m
[31m-                local delay = rand(4096)[m
[31m-                local ok, err = newtimer(delay, job, false)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to create timer at ", delay, ": ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = newtimer(0, job, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to create the killer timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- wait: 0.3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m---- grep_error_log eval: qr/lua found \d+ pending timers/[m
[31m---- grep_error_log_out[m
[31m-lua found 8191 pending timers[m
[31m---- timeout: 20[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/110-etag.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/110-etag.t[m
[1mdeleted file mode 100644[m
[1mindex 351fec4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/110-etag.t[m
[1m+++ /dev/null[m
[36m@@ -1,84 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: If-None-Match true[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["ETag"] = "123456789"[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.say(ngx.var.http_if_none_match)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: 123456789[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m---- error_code: 304[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: If-None-Match false[m
[31m---- config[m
[31m-    location /t {[m
[31m-        etag on;[m
[31m-        content_by_lua '[m
[31m-            ngx.header["ETag"] = "123456789"[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.say(ngx.var.http_if_none_match)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: 123456780[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m-123456780[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- skip_nginx: 3: < 1.3.3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: Etag clear[m
[31m---- config[m
[31m-    location /t {[m
[31m-        etag on;[m
[31m-        content_by_lua '[m
[31m-            ngx.header["ETag"] = "123456789"[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.header["ETag"] = nil[m
[31m-            ngx.say(ngx.var.http_if_none_match)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: 123456789[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m-123456789[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- skip_nginx: 3: < 1.3.3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/111-req-header-ua.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/111-req-header-ua.t[m
[1mdeleted file mode 100644[m
[1mindex 7c980d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/111-req-header-ua.t[m
[1m+++ /dev/null[m
[36m@@ -1,676 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear Opera user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.62[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: opera: %d\n", $r->headers_in->opera)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: opera: %d\n", $r->headers_in->opera)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: opera: 1[m
[31m-content: opera: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear MSIE 4 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set custom MSIE 4 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: clear MSIE 5 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set custom MSIE 5 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: clear MSIE 6 (without SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set custom MSIE 6 (without SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear MSIE 6 (with SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=0[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set custom MSIE 6 (with SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set custom MSIE 7 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; winfx; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Zune 2.0)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; winfx; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Zune 2.0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: clear Gecko user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: gecko: 1[m
[31m-content: gecko: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set custom Gecko user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0")[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: gecko: 0[m
[31m-content: gecko: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: clear Chrome user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: chrome: 1[m
[31m-content: chrome: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set custom Chrome user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19")[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: chrome: 0[m
[31m-content: chrome: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: clear Safari (Mac OS X) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: safari: 1[m
[31m-content: safari: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set custom Safari user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: safari: 0[m
[31m-content: safari: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: clear Konqueror user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: konqueror: 1[m
[31m-content: konqueror: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set custom Konqueror user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: konqueror: 0[m
[31m-content: konqueror: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/112-req-header-conn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/112-req-header-conn.t[m
[1mdeleted file mode 100644[m
[1mindex 51df730..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/112-req-header-conn.t[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear the Connection req header[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Connection", nil);[m
[31m-        ';[m
[31m-[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 0[m
[31m-[m
[31m---- response_body[m
[31m-connection: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set custom Connection req header (close)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Connection", "CLOSE");[m
[31m-        ';[m
[31m-[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 1[m
[31m-[m
[31m---- response_body[m
[31m-connection: CLOSE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set custom Connection req header (keep-alive)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Connection", "keep-alive");[m
[31m-        ';[m
[31m-[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 2[m
[31m-[m
[31m---- response_body[m
[31m-connection: keep-alive[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set custom Connection req header (bad)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Connection", "bad");[m
[31m-        ';[m
[31m-[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 0[m
[31m-[m
[31m---- response_body[m
[31m-connection: bad[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/113-req-header-cookie.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/113-req-header-cookie.t[m
[1mdeleted file mode 100644[m
[1mindex b26b709..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/113-req-header-cookie.t[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear cookie (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", nil)[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 0[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear cookie (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", nil)[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 0[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set one custom cookie (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", "boo=123")[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 1[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set one custom cookie (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", "boo=123")[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 1[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set multiple custom cookies (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", {"boo=123","foo=78"})[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 2[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: 78[m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123; foo=78[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set multiple custom cookies (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", {"boo=123", "foo=bar"})[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 2[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: bar[m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123; foo=bar[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/114-config.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/114-config.t[m
[1mdeleted file mode 100644[m
[1mindex 9d6680d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/114-config.t[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.config.debug[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("debug: ", ngx.config.debug)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^debug: (?:true|false)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.config.subystem[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("subsystem: ", ngx.config.subsystem)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-subsystem: http[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/115-quote-sql-str.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/115-quote-sql-str.t[m
[1mdeleted file mode 100644[m
[1mindex 0c20dfb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/115-quote-sql-str.t[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#log_level("warn");[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: \0[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.quote_sql_str("a\\0b\\0"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'a\0b\0'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: \t[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.quote_sql_str("a\\tb\\t"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'a\tb\t'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: \b[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.quote_sql_str("a\\bb\\b"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'a\bb\b'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: \Z[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.quote_sql_str("a\\026b\\026"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'a\Zb\Z'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/116-raw-req-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/116-raw-req-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 6518f0e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/116-raw-req-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,879 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 40;[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-                ngx.say("no response header found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local msg, err = sock:receive()[m
[31m-            if not msg then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("msg: ", msg)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /mysock {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("1: received: " .. data .. "\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-msg: 1: received: hello[m
[31m---- grep_error_log: lua socket tcp_nodelay[m
[31m---- grep_error_log_out[m
[31m-lua socket tcp_nodelay[m
[31m-lua socket tcp_nodelay[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: header not sent yet[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\nhello")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- response_headers[m
[31m-Content-Length: 5[m
[31m---- response_body chop[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: http 1.0 buffering[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2[m
[31m-F(ngx_http_header_filter) {[m
[31m-    println("header filter")[m
[31m-}[m
[31m-F(ngx_http_lua_req_socket) {[m
[31m-    println("lua req socket")[m
[31m-}[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-server: failed to get raw req socket: http 1.0 buffering[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple raw req sockets[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local sock2, err = ngx.req.socket(true)[m
[31m-            if not sock2 then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket2: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2[m
[31m-F(ngx_http_header_filter) {[m
[31m-    println("header filter")[m
[31m-}[m
[31m-F(ngx_http_lua_req_socket) {[m
[31m-    println("lua req socket")[m
[31m-}[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-server: failed to get raw req socket2: duplicate call[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.say after ngx.req.socket(true)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.say("ok")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to say: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to say: raw request socket acquired[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.print after ngx.req.socket(true)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.print("ok")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to print: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to print: raw request socket acquired[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.eof after ngx.req.socket(true)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to eof: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to eof: raw request socket acquired[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.flush after ngx.req.socket(true)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.flush()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to flush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to flush: raw request socket acquired[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: receive timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    postpone_output 1;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.flush(true)[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local data, err, partial = sock:receive(10)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: 1: failed to receive: ", err, ", received: ", partial)[m
[31m-            end[m
[31m-[m
[31m-            data, err, partial = sock:receive(10)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: 2: failed to receive: ", err, ", received: ", partial)[m
[31m-            end[m
[31m-[m
[31m-            ngx.exit(444)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-ab"[m
[31m---- ignore_response[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-server: 1: failed to receive: timeout, received: ab,[m
[31m-server: 2: failed to receive: timeout, received: ,[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: on_abort called during ngx.sleep()[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_check_client_abort on;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-                ngx.say("no response header found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local msg, err = sock:receive()[m
[31m-            if not msg then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("msg: ", msg)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /mysock {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function (premature) ngx.log(ngx.WARN, "mysock handler aborted") end)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set on_abort handler: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("1: received: " .. data .. "\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-msg: 1: received: hello[m
[31m---- error_log[m
[31m-mysock handler aborted[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- wait: 1.1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: on_abort called during sock:receive()[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_check_client_abort on;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-                ngx.say("no response header found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local msg, err = sock:receive()[m
[31m-            if not msg then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("msg: ", msg)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /mysock {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function (premature) ngx.log(ngx.WARN, "mysock handler aborted") end)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set on_abort handler: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("1: received: " .. data .. "\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.WARN, "failed to receive a line: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-msg: 1: received: hello[m
[31m---- error_log[m
[31m-failed to receive a line: client aborted[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- wait: 0.1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: receiveuntil[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send(", ")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send packet 1: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("world")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send packet 2: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-                ngx.say("no response header found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local msg, err = sock:receive()[m
[31m-            if not msg then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("msg: ", msg)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /mysock {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("rld")[m
[31m-            local data, err = reader()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("1: received: " .. data .. "\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-msg: 1: received: hello, wo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: request body not read yet[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\n" .. data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- response_headers[m
[31m-Content-Length: 5[m
[31m---- response_body chop[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: pending request body reading[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.req.read_body()[m
[31m-            end)[m
[31m-[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.WARN, "server: failed to get raw req socket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\n" .. data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hell"[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-server: failed to get raw req socket: pending request body reading in some other thread[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: read chunked request body with raw req socket[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "failed to new: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local function err(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-                return ngx.exit(400)[m
[31m-            end[m
[31m-            local num = tonumber[m
[31m-            local MAX_CHUNKS = 1000[m
[31m-            local eof = false[m
[31m-            local chunks = {}[m
[31m-            for i = 1, MAX_CHUNKS do[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    err("failed to receive chunk size: ", err)[m
[31m-                end[m
[31m-[m
[31m-                local size = num(line, 16)[m
[31m-                if not size then[m
[31m-                    err("bad chunk size: ", line)[m
[31m-                end[m
[31m-[m
[31m-                if size == 0 then -- last chunk[m
[31m-                    -- receive the last line[m
[31m-                    line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        err("failed to receive last chunk: ", err)[m
[31m-                    end[m
[31m-[m
[31m-                    if line ~= "" then[m
[31m-                        err("bad last chunk: ", line)[m
[31m-                    end[m
[31m-[m
[31m-                    eof = true[m
[31m-                    break[m
[31m-                end[m
[31m-[m
[31m-                local chunk, err = sock:receive(size)[m
[31m-                if not chunk then[m
[31m-                    err("failed to receive chunk of size ", size, ": ", err)[m
[31m-                end[m
[31m-[m
[31m-                local data, err = sock:receive(2)[m
[31m-                if not data then[m
[31m-                    err("failed to receive chunk terminator: ", err)[m
[31m-                end[m
[31m-[m
[31m-                if data ~= "\\r\\n" then[m
[31m-                    err("bad chunk terminator: ", data)[m
[31m-                end[m
[31m-[m
[31m-                chunks[i] = chunk[m
[31m-            end[m
[31m-[m
[31m-            if not eof then[m
[31m-                err("too many chunks (more than ", MAX_CHUNKS, ")")[m
[31m-            end[m
[31m-[m
[31m-            local concat = table.concat[m
[31m-            local body = concat{"got ", #chunks, " chunks.\\nrequest body: "}[m
[31m-                         .. concat(chunks) .. "\\n"[m
[31m-            local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nConnection: close\\r\\nContent-Length: "[m
[31m-                            .. #body .. "\\r\\n\\r\\n" .. body)[m
[31m-            if not ok then[m
[31m-                err("failed to send response: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-5\r[m
[31m-hey, \r[m
[31m-b\r[m
[31m-hello world\r[m
[31m-0\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body[m
[31m-got 2 chunks.[m
[31m-request body: hey, hello world[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/117-raw-req-socket-timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/117-raw-req-socket-timeout.t[m
[1mdeleted file mode 100644[m
[1mindex 4e3929b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/117-raw-req-socket-timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'hello, world';[m
[31m-    $ENV{TEST_NGINX_POSTPONE_OUTPUT} = 1;[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: pending response header data[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    postpone_output 1;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- stap2[m
[31m-F(ngx_http_header_filter) {[m
[31m-    println("header filter")[m
[31m-}[m
[31m-F(ngx_http_lua_req_socket) {[m
[31m-    println("lua req socket")[m
[31m-}[m
[31m---- response_body[m
[31m---- error_log[m
[31m-server: failed to get raw req socket: pending data to write[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: send timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    postpone_output 1;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.flush(true)[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            sock:settimeout(100)[m
[31m-            local ok, err = sock:send("hello, world!")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-            end[m
[31m-            ngx.exit(444)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-lua tcp socket write timed out[m
[31m-server: failed to send: timeout[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/118-use-default-type.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/118-use-default-type.t[m
[1mdeleted file mode 100644[m
[1mindex 6008d65..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/118-use-default-type.t[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: lua_use_default_type default on[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: lua_use_default_type explicitly on[m
[31m---- config[m
[31m-    lua_use_default_type on;[m
[31m-    location /lua {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: lua_use_default_type off[m
[31m---- config[m
[31m-    lua_use_default_type off;[m
[31m-    location /lua {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: overriding lua_use_default_type off[m
[31m---- config[m
[31m-    lua_use_default_type off;[m
[31m-    location /lua {[m
[31m-        lua_use_default_type on;[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: overriding lua_use_default_type on[m
[31m---- config[m
[31m-    lua_use_default_type on;[m
[31m-    location /lua {[m
[31m-        lua_use_default_type off;[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_use_default_type on does not set content type on 304[m
[31m---- config[m
[31m-    lua_use_default_type on;[m
[31m-    location /lua {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.status = ngx.HTTP_NOT_MODIFIED[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 304[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/119-config-prefix.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/119-config-prefix.t[m
[1mdeleted file mode 100644[m
[1mindex 4581aa1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/119-config-prefix.t[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("prefix: ", ngx.config.prefix())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^prefix: \/\S+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/120-re-find.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/120-re-find.t[m
[1mdeleted file mode 100644[m
[1mindex 34c0207..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/120-re-find.t[m
[1m+++ /dev/null[m
[36m@@ -1,893 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9]+)", "jo")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 8[m
[31m-to: 11[m
[31m-matched: 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty matched string[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, world"[m
[31m-            local from, to, err = ngx.re.find(s, "[0-9]*")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 0[m
[31m-matched: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multiple captures (with o)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([a-z]+).*?([0-9]{2})[0-9]+", "o")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 11[m
[31m-matched: hello, 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "foo")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: case sensitive by default[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local from = ngx.re.find("hello, 1234", "HELLO")[m
[31m-            if from then[m
[31m-                ngx.say(from)[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: case insensitive[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "HELLO", "i")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 5[m
[31m-matched: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: UTF-8 mode[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello章亦春"[m
[31m-            local from, to, err = ngx.re.find(s, "HELLO.{2}", "iu")[m
[31m-            if not from then[m
[31m-                ngx.say("FAIL: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(string.sub(s, from, to))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-^(?:FAIL: bad argument \#2 to '\?' \(pcre_compile\(\) failed: this version of PCRE is not compiled with PCRE_UTF8 support in "HELLO\.\{2\}" at "HELLO\.\{2\}"\)|hello章亦)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: multi-line mode (^ at line head)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, "^world", "m")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 7[m
[31m-to: 11[m
[31m-matched: world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multi-line mode (. does not match \n)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, ".*", "m")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 5[m
[31m-matched: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: single-line mode (^ as normal)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, "^world", "s")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: single-line mode (dot all)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, ".*", "s")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 11[m
[31m-matched: hello[m
[31m-world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, "\\\\w     \\\\w", "x")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 2[m
[31m-matched: he[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, "(abc")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched.")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: bad option[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, ".*", "H")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-unknown flag "H"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: anchored match (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9]+)", "a")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "1234, hello"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9]+)", "a")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 4[m
[31m-matched: 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: match with ctx but no pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local from, to = ngx.re.find("1234, hello", "([0-9]+)", "", ctx)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 4[m
[31m-pos: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: match with ctx and a pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = { pos = 3 }[m
[31m-            local from, to, err = ngx.re.find("1234, hello", "([0-9]+)", "", ctx)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 3[m
[31m-to: 4[m
[31m-pos: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "(?<first>[a-z]+), [0-9]+")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 11[m
[31m-matched: hello, 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            local from, to, err = ngx.re.find(string.sub(target, 1, 4), regex, "u")[m
[31m-[m
[31m-            if err then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say("matched: ", from)[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^error: pcre_exec\(\) failed: -10$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "你好"[m
[31m-            local from, to, err = ngx.re.find(s, ".", "U")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 3[m
[31m-matched: 你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local from, to, err = ngx.re.find(s, re, "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not from then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match.")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local from, to, err = ngx.re.find(s, re, "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not from then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-failed to match[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: specify the group (1)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 1)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 8[m
[31m-to: 8[m
[31m-matched: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: specify the group (0)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 0)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 8[m
[31m-to: 11[m
[31m-matched: 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: specify the group (2)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 2)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 9[m
[31m-to: 11[m
[31m-matched: 234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: specify the group (3)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 3)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: nth out of bound[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: specify the group (4)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 4)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: nth out of bound[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: nil submatch (2nd)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])|(hello world)", "jo", nil, 2)[m
[31m-            if from or to then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: nil submatch (1st)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "(hello world)|([0-9])", "jo", nil, 1)[m
[31m-            if from or to then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/121-version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/121-version.t[m
[1mdeleted file mode 100644[m
[1mindex 2b7a306..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/121-version.t[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: nginx version[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("version: ", ngx.config.nginx_version)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^version: \d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx_lua_version[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("version: ", ngx.config.ngx_lua_version)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^version: \d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/122-worker.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/122-worker.t[m
[1mdeleted file mode 100644[m
[1mindex fa42b1d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/122-worker.t[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: content_by_lua + ngx.worker.exiting[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("worker exiting: ", ngx.worker.exiting())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-worker exiting: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: content_by_lua + ngx.worker.pid[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local pid = ngx.worker.pid()[m
[31m-            ngx.say("worker pid: ", pid)[m
[31m-            if pid ~= tonumber(ngx.var.pid) then[m
[31m-                ngx.say("worker pid is wrong.")[m
[31m-            else[m
[31m-                ngx.say("worker pid is correct.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-worker pid: \d+[m
[31m-worker pid is correct\.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: init_worker_by_lua + ngx.worker.pid[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        my_pid = ngx.worker.pid()[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("worker pid: ", my_pid)[m
[31m-            if my_pid ~= tonumber(ngx.var.pid) then[m
[31m-                ngx.say("worker pid is wrong.")[m
[31m-            else[m
[31m-                ngx.say("worker pid is correct.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-worker pid: \d+[m
[31m-worker pid is correct\.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/123-lua-path.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/123-lua-path.t[m
[1mdeleted file mode 100644[m
[1mindex da97909..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/123-lua-path.t[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-$ENV{LUA_PATH} = "/foo/bar/baz";[m
[31m-$ENV{LUA_CPATH} = "/baz/bar/foo";[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-master_on();[m
[31m-no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: LUA_PATH & LUA_CPATH env (code cache on)[m
[31m---- main_config[m
[31m-env LUA_PATH;[m
[31m-env LUA_CPATH;[m
[31m-[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(package.path)[m
[31m-            ngx.say(package.cpath)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/foo/bar/baz[m
[31m-/baz/bar/foo[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: LUA_PATH & LUA_CPATH env (code cache off)[m
[31m---- main_config[m
[31m-env LUA_PATH;[m
[31m-env LUA_CPATH;[m
[31m-[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(package.path)[m
[31m-            ngx.say(package.cpath)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/foo/bar/baz[m
[31m-/baz/bar/foo[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/\[alert\] .*? lua_code_cache is off/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/124-init-worker.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/124-init-worker.t[m
[1mdeleted file mode 100644[m
[1mindex d6ea675..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/124-init-worker.t[m
[1m+++ /dev/null[m
[36m@@ -1,758 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-our $ServerRoot = server_root();[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set a global lua var[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        foo = ngx.md5("hello world")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo = 5eb63bbbe01eeed093cb22bb8f5acdc3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no ngx.say()[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        ngx.say("hello")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo = nil[m
[31m---- error_log[m
[31m-API disabled in the context of init_worker_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: timer.at[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        _G.my_counter = 0[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-        local function handler(premature)[m
[31m-            warn("timer expired (premature: ", premature, "; counter: ",[m
[31m-                 _G.my_counter, ")")[m
[31m-            _G.my_counter = _G.my_counter + 1[m
[31m-        end[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to create timer: ", err)[m
[31m-        end[m
[31m-        warn("created timer: ", ok)[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.sleep(0.001)[m
[31m-            ngx.say("my_counter = ", _G.my_counter)[m
[31m-            _G.my_counter = _G.my_counter + 1[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-my_counter = 1[m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): created timer: 1[m
[31m-warn(): timer expired (premature: false; counter: 0)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: timer.at + cosocket[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        _G.done = false[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-        local function error(...)[m
[31m-            ngx.log(ngx.ERR, ...)[m
[31m-        end[m
[31m-        local function handler(premature)[m
[31m-            warn("timer expired (premature: ", premature, ")")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                error("failed to connect: ", err)[m
[31m-                _G.done = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                error("failed to send request: ", err)[m
[31m-                _G.done = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            warn("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                warn("received: ", line)[m
[31m-            else[m
[31m-                error("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-            _G.done = true[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            error("failed to create timer: ", err)[m
[31m-        end[m
[31m-        warn("created timer: ", ok)[m
[31m-    ';[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local waited = 0[m
[31m-            local sleep = ngx.sleep[m
[31m-            while not _G.done do[m
[31m-                local delay = 0.001[m
[31m-                sleep(delay)[m
[31m-                waited = waited + delay[m
[31m-                if waited > 1 then[m
[31m-                    ngx.say("timed out")[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): created timer: 1[m
[31m-warn(): timer expired (premature: false)[m
[31m-warn(): request sent: 11[m
[31m-warn(): received: OK[m
[31m-[m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 60000[m
[31m-lua tcp socket read timeout: 60000[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: init_worker_by_lua_file (simple global var)[m
[31m---- http_config[m
[31m-    init_worker_by_lua_file html/foo.lua;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-foo = ngx.md5("hello world")[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo = 5eb63bbbe01eeed093cb22bb8f5acdc3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: timer.at + cosocket (by_lua_file)[m
[31m---- main_config[m
[31m-env TEST_NGINX_MEMCACHED_PORT;[m
[31m---- http_config[m
[31m-    init_worker_by_lua_file html/foo.lua;[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-_G.done = false[m
[31m-local function warn(...)[m
[31m-    ngx.log(ngx.WARN, ...)[m
[31m-end[m
[31m-local function error(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-local function handler(premature)[m
[31m-    warn("timer expired (premature: ", premature, ")")[m
[31m-[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1",[m
[31m-                                 os.getenv("TEST_NGINX_MEMCACHED_PORT"))[m
[31m-    if not ok then[m
[31m-        error("failed to connect: ", err)[m
[31m-        _G.done = true[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        error("failed to send request: ", err)[m
[31m-        _G.done = true[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    warn("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        warn("received: ", line)[m
[31m-    else[m
[31m-        error("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-    _G.done = true[m
[31m-end[m
[31m-[m
[31m-local ok, err = ngx.timer.at(0, handler)[m
[31m-if not ok then[m
[31m-    error("failed to create timer: ", err)[m
[31m-end[m
[31m-warn("created timer: ", ok)[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local waited = 0[m
[31m-            local sleep = ngx.sleep[m
[31m-            while not _G.done do[m
[31m-                local delay = 0.001[m
[31m-                sleep(delay)[m
[31m-                waited = waited + delay[m
[31m-                if waited > 1 then[m
[31m-                    ngx.say("timed out")[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): created timer: 1[m
[31m-warn(): timer expired (premature: false)[m
[31m-warn(): request sent: 11[m
[31m-warn(): received: OK[m
[31m-[m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 60000[m
[31m-lua tcp socket read timeout: 60000[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.ctx[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        ngx.ctx.foo = "hello world"[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-        warn("foo = ", ngx.ctx.foo)[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): foo = hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: print[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        print("md5 = ", ngx.md5("hello world"))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-md5 = 5eb63bbbe01eeed093cb22bb8f5acdc3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: unescape_uri[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-[m
[31m-        warn(ngx.unescape_uri("hello%20world"))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: escape_uri[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-[m
[31m-        warn(ngx.escape_uri("hello world"))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): hello%20world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.re[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-[m
[31m-        warn((ngx.re.sub("hello world", "world", "XXX", "jo")))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): hello XXX[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.http_time[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-[m
[31m-        warn(ngx.http_time(5678))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/warn\(\): .*?(?=, context)/[m
[31m---- grep_error_log_out[m
[31m-warn(): Thu, 01 Jan 1970 01:34:38 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: cosocket with resolver[m
[31m---- timeout: 10[m
[31m---- http_config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    init_worker_by_lua '[m
[31m-        -- global[m
[31m-        logs = ""[m
[31m-        done = false[m
[31m-        local function say(...)[m
[31m-            logs = logs .. table.concat({...}) .. "\\n"[m
[31m-        end[m
[31m-[m
[31m-        local function handler()[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                say("failed to connect: ", err)[m
[31m-                done = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                say("failed to send request: ", err)[m
[31m-                done = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                say("first line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                say("failed to receive the first line: ", err)[m
[31m-            end[m
[31m-[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                say("second line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                say("failed to receive the second line: ", err)[m
[31m-            end[m
[31m-[m
[31m-            done = true[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            say("failed to create timer: ", err)[m
[31m-        else[m
[31m-            say("timer created")[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local i = 0[m
[31m-            while not done and i < 3000 do[m
[31m-                ngx.sleep(0.001)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-            ngx.print(logs)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timer created[m
[31m-connected: 1[m
[31m-request sent: 56[m
[31m-first line received: HTTP/1.1 200 OK[m
[31m-second line received: Server: openresty[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: connection refused (tcp) - log_errors on by default[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        logs = ""[m
[31m-        done = false[m
[31m-        local function say(...)[m
[31m-            logs = logs .. table.concat{...} .. "\\n"[m
[31m-        end[m
[31m-[m
[31m-        local function handler()[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not ok then[m
[31m-                say("failed to connect: ", err)[m
[31m-            else[m
[31m-                say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            say("failed to create timer: ", err)[m
[31m-        else[m
[31m-            say("timer created")[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local i = 0[m
[31m-            while not done and i < 1000 do[m
[31m-                ngx.sleep(0.001)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-            ngx.print(logs)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-timer created[m
[31m-failed to connect: connection refused[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\), context: ngx\.timer$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: connection refused (tcp) - log_errors explicitly on[m
[31m---- http_config[m
[31m-    lua_socket_log_errors on;[m
[31m-    init_worker_by_lua '[m
[31m-        logs = ""[m
[31m-        done = false[m
[31m-        local function say(...)[m
[31m-            logs = logs .. table.concat{...} .. "\\n"[m
[31m-        end[m
[31m-[m
[31m-        local function handler()[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not ok then[m
[31m-                say("failed to connect: ", err)[m
[31m-            else[m
[31m-                say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            say("failed to create timer: ", err)[m
[31m-        else[m
[31m-            say("timer created")[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local i = 0[m
[31m-            while not done and i < 1000 do[m
[31m-                ngx.sleep(0.001)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-            ngx.print(logs)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-timer created[m
[31m-failed to connect: connection refused[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: connection refused (tcp) - log_errors explicitly off[m
[31m---- http_config[m
[31m-    lua_socket_log_errors off;[m
[31m-    init_worker_by_lua '[m
[31m-        logs = ""[m
[31m-        done = false[m
[31m-        local function say(...)[m
[31m-            logs = logs .. table.concat{...} .. "\\n"[m
[31m-        end[m
[31m-[m
[31m-        local function handler()[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not ok then[m
[31m-                say("failed to connect: ", err)[m
[31m-            else[m
[31m-                say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            say("failed to create timer: ", err)[m
[31m-        else[m
[31m-            say("timer created")[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local i = 0[m
[31m-            while not done and i < 1000 do[m
[31m-                ngx.sleep(0.001)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-            ngx.print(logs)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-timer created[m
[31m-failed to connect: connection refused[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-'qr/connect\(\) failed \(\d+: Connection refused\)/',[m
[31m-'[error]',[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: init_by_lua + proxy_temp_path which has side effects in cf->cycle->paths[m
[31m---- http_config eval[m
[31m-qq{[m
[31m-    proxy_temp_path $::ServerRoot/proxy_temp;[m
[31m-    init_worker_by_lua '[m
[31m-        local a = 2 + 3[m
[31m-    ';[m
[31m-}[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: syslog error log[m
[31m---- http_config[m
[31m-    #error_log syslog:server=127.0.0.1:12345 error;[m
[31m-    init_worker_by_lua '[m
[31m-        done = false[m
[31m-        os.execute("sleep 0.1")[m
[31m-        ngx.log(ngx.ERR, "Bad bad bad")[m
[31m-        done = true[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            while not done do[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- log_level: error[m
[31m---- error_log_file: syslog:server=127.0.0.1:12345[m
[31m---- udp_listen: 12345[m
[31m---- udp_query eval: qr/Bad bad bad/[m
[31m---- udp_reply: hello[m
[31m---- wait: 0.1[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-Bad bad bad[m
[31m---- skip_nginx: 4: < 1.7.1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: fake module calls ngx_http_conf_get_module_srv_conf in its merge_srv_conf callback (GitHub issue #554)[m
[31m-This also affects merge_loc_conf[m
[31m---- http_config[m
[31m-    init_worker_by_lua return;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        return 200 ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chomp[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/125-configure-args.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/125-configure-args.t[m
[1mdeleted file mode 100644[m
[1mindex adec129..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/125-configure-args.t[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: nginx configure[m
[31m---- config[m
[31m-    location /configure_args {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.config.nginx_configure())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /configure_args[m
[31m---- response_body_like chop[m
[31m-^\s*\-\-[^-]+[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/126-shdict-frag.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/126-shdict-frag.t[m
[1mdeleted file mode 100644[m
[1mindex 94422fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/126-shdict-frag.t[m
[1m+++ /dev/null[m
[36m@@ -1,1267 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 39;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: merge 2 single-page free blocks (forcibly evicted, merge forward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                set_key("baz", string.rep("c", 8102))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-alloc pages: 1 NOT OK[m
[31m-free pages: 2[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-successfully set baz with force.[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 8102[m
[31m-successfully set foo with force.[m
[31m-successfully set bar.[m
[31m-successfully set baz with force.[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 8102[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: merge 2 single-page free slabs (forcibly evicted, merge backward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                check_key("foo")[m
[31m-                set_key("baz", string.rep("c", 8102))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-alloc pages: 1 NOT OK[m
[31m-free pages: 2[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-found foo: 4000[m
[31m-successfully set baz with force.[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 8102[m
[31m-successfully set foo with force.[m
[31m-successfully set bar.[m
[31m-found foo: 4000[m
[31m-successfully set baz with force.[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 8102[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: merge 3 single-page free slabs (actively deleted, merge backward AND forward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 25k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                set_key("baz", string.rep("c", 4002))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-[m
[31m-                dogs:delete("foo")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                dogs:delete("baz")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                dogs:delete("bar")[m
[31m-                safe_set_key("blah", string.rep("a", 12010))[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 5[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 3 ok[m
[31m-alloc pages: 1 NOT OK[m
[31m-free pages: 3[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 3 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-successfully set baz.[m
[31m-found foo: 4000[m
[31m-found bar: 4001[m
[31m-found baz: 4002[m
[31m-failed to safe set blah: no memory[m
[31m-failed to safe set blah: no memory[m
[31m-successfully safe set blah[m
[31m-successfully set foo with force.[m
[31m-successfully set bar.[m
[31m-successfully set baz.[m
[31m-found foo: 4000[m
[31m-found bar: 4001[m
[31m-found baz: 4002[m
[31m-failed to safe set blah: no memory[m
[31m-failed to safe set blah: no memory[m
[31m-successfully safe set blah[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: merge one single-page block backward, but no more[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 25k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                set_key("baz", string.rep("c", 4002))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-[m
[31m-                dogs:delete("bar")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                dogs:delete("baz")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                check_key("foo")[m
[31m-                dogs:delete("foo")[m
[31m-                check_key("blah")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 5[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-free pages: 1[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-successfully set baz.[m
[31m-found foo: 4000[m
[31m-found bar: 4001[m
[31m-found baz: 4002[m
[31m-failed to safe set blah: no memory[m
[31m-successfully safe set blah[m
[31m-found foo: 4000[m
[31m-found blah: 8100[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: merge one single-page block forward, but no more[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 25k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                set_key("baz", string.rep("c", 4002))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-[m
[31m-                dogs:delete("bar")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                dogs:delete("foo")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                check_key("baz")[m
[31m-                dogs:delete("baz")[m
[31m-                check_key("blah")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 5[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-free pages: 1[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-successfully set baz.[m
[31m-found foo: 4000[m
[31m-found bar: 4001[m
[31m-found baz: 4002[m
[31m-failed to safe set blah: no memory[m
[31m-successfully safe set blah[m
[31m-found baz: 4002[m
[31m-found blah: 8100[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: merge 2 multi-page blocks (forcibly evicted, merge backward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 30k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                set_key("foo", string.rep("a", 8100))[m
[31m-                set_key("bar", string.rep("b", 8101))[m
[31m-                check_key("foo")[m
[31m-                safe_set_key("baz", string.rep("c", 16300))[m
[31m-                dogs:delete("foo")[m
[31m-                check_key("bar")[m
[31m-                dogs:delete("bar")[m
[31m-                safe_set_key("baz", string.rep("c", 16300))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 6[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 2 ok[m
[31m-alloc pages: 2 ok[m
[31m-alloc pages: 4 NOT OK[m
[31m-free pages: 2[m
[31m-free pages: 2[m
[31m-alloc pages: 4 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-found foo: 8100[m
[31m-failed to safe set baz: no memory[m
[31m-found bar: 8101[m
[31m-successfully safe set baz[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 16300[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: merge big slabs (less than max slab size) backward[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:set("foo" .. j, string.rep("a", 5))[m
[31m-                end[m
[31m-                set_key("bar", string.rep("a", 4000))[m
[31m-[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:delete("foo" .. j)[m
[31m-                end[m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-                check_key("bar")[m
[31m-[m
[31m-                ngx.say("delete bar")[m
[31m-                dogs:delete("bar")[m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        //printf("slab max size: %d\n", @var("ngx_slab_max_size"))[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set bar.[m
[31m-failed to safe set baz: no memory[m
[31m-found bar: 4000[m
[31m-delete bar[m
[31m-successfully safe set baz[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: cannot merge in-used big slabs page (backward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                for j = 1, 63 do[m
[31m-                    dogs:set("foo" .. j, string.rep("a", 5))[m
[31m-                end[m
[31m-                set_key("bar", string.rep("a", 4000))[m
[31m-[m
[31m-                --[[[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:delete("foo" .. j)[m
[31m-                end[m
[31m-                ]][m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-                check_key("bar")[m
[31m-[m
[31m-                ngx.say("delete bar")[m
[31m-                dogs:delete("bar")[m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        //printf("slab max size: %d\n", @var("ngx_slab_max_size"))[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-[m
[31m---- response_body[m
[31m-successfully set bar.[m
[31m-failed to safe set baz: no memory[m
[31m-found bar: 4000[m
[31m-delete bar[m
[31m-failed to safe set baz: no memory[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: cannot merge in-used big slabs page (forward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                set_key("bar", string.rep("a", 4000))[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:set("foo" .. j, string.rep("a", 5))[m
[31m-                end[m
[31m-[m
[31m-                --[[[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:delete("foo" .. j)[m
[31m-                end[m
[31m-                ]][m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-                check_key("bar")[m
[31m-[m
[31m-                ngx.say("delete bar")[m
[31m-                dogs:delete("bar")[m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        //printf("slab max size: %d\n", @var("ngx_slab_max_size"))[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-[m
[31m---- response_body[m
[31m-successfully set bar.[m
[31m-failed to safe set baz: no memory[m
[31m-found bar: 4000[m
[31m-delete bar[m
[31m-failed to safe set baz: no memory[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: fuzz testing[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 200k;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local rand = math.random[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local maxsz = 9000[m
[31m-            local maxkeyidx = 30[m
[31m-            local rep = string.rep[m
[31m-[m
[31m-            math.randomseed(ngx.time())[m
[31m-            for i = 1, 30000 do[m
[31m-                local key = "mylittlekey" .. rand(maxkeyidx)[m
[31m-                local ok, err = dogs:get(key)[m
[31m-                if not ok or rand() > 0.6 then[m
[31m-                    sz = rand(maxsz)[m
[31m-                    val = rep("a", sz)[m
[31m-                    local ok, err, forcible = dogs:set(key, val)[m
[31m-                    if err then[m
[31m-                        ngx.log(ngx.ERR, "failed to set key: ", err)[m
[31m-                        -- return[m
[31m-                    end[m
[31m-                    if forcible then[m
[31m-                        -- error("forcible")[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 60[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/127-uthread-kill.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/127-uthread-kill.t[m
[1mdeleted file mode 100644[m
[1mindex 2ab8abe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/127-uthread-kill.t[m
[1m+++ /dev/null[m
[36m@@ -1,508 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: kill pending sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f()")[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello from f()[m
[31m-thread created: running[m
[31m-killed[m
[31m-failed to kill thread: already waited or killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua clean up the timer for pending ngx.sleep[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: already waited[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f()")[m
[31m-                ngx.sleep(0.001)[m
[31m-                return 32[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("waited: ", res)[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello from f()[m
[31m-thread created: running[m
[31m-waited: 32[m
[31m-failed to kill thread: already waited or killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-lua clean up the timer for pending ngx.sleep[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: kill pending resolver[m
[31m---- config[m
[31m-    resolver agentzh.org:12345;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:connect("some.agentzh.org", 12345)[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua tcp socket abort resolver[m
[31m-resolve name done: -2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: kill pending connect[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local ready = false[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:connect("agentzh.org", 80)[m
[31m-                sock:close()[m
[31m-                ready = true[m
[31m-                sock:settimeout(10000)[m
[31m-                sock:connect("agentzh.org", 12345)[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            while not ready do[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-lua tcp socket abort resolver[m
[31m---- grep_error_log: lua finalize socket[m
[31m---- grep_error_log_out[m
[31m-lua finalize socket[m
[31m-lua finalize socket[m
[31m-[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: cannot kill a pending subrequest[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture("/sub")[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-failed to kill thread: pending subrequests[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: cannot kill a pending subrequest not in the thread being killed[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture("/sub")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.3)[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread 1: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(tf)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread f: ", err)[m
[31m-            else[m
[31m-                ngx.say("killed f")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread g: ", err)[m
[31m-            else[m
[31m-                ngx.say("killed g")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-thread f created: running[m
[31m-thread g created: running[m
[31m-failed to kill thread f: pending subrequests[m
[31m-killed g[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: kill a thread that has done a subrequest but no pending ones[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ready = false[m
[31m-            function f()[m
[31m-                ngx.location.capture("/sub")[m
[31m-                ready = true[m
[31m-                ngx.sleep(0.5)[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            while not ready do[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: kill a thread already terminated[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-thread created: zombie[m
[31m-failed to kill thread: already terminated[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: kill self[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.thread.kill(coroutine.running())[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill main thread: ", err)[m
[31m-            else[m
[31m-                ngx.say("killed main thread.")[m
[31m-            end[m
[31m-[m
[31m-            function f()[m
[31m-                local ok, err = ngx.thread.kill(coroutine.running())[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to kill user thread: ", err)[m
[31m-                else[m
[31m-                    ngx.say("user thread thread.")[m
[31m-                end[m
[31m-[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-failed to kill main thread: not user thread[m
[31m-failed to kill user thread: killer not parent[m
[31m-thread created: zombie[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/128-duplex-tcp-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/128-duplex-tcp-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 0bf38d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/128-duplex-tcp-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,626 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: pipelined memcached requests (sent one byte at a time)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\nget foo\\r\\nget bar\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-            local send_idx = 1[m
[31m-[m
[31m-            local function writer()[m
[31m-                local sub = string.sub[m
[31m-                while send_idx <= #req do[m
[31m-                    local bytes, err = sock:send(sub(req, send_idx, send_idx))[m
[31m-                    if not bytes then[m
[31m-                        ngx.say("failed to send request: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    -- if send_idx % 2 == 0 then[m
[31m-                        ngx.sleep(0.001)[m
[31m-                    -- end[m
[31m-                    send_idx = send_idx + 1[m
[31m-                end[m
[31m-                -- ngx.say("request sent.")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(writer)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:setkeepalive()[m
[31m-            ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-received: OK[m
[31m-received: END[m
[31m-received: END[m
[31m-setkeepalive: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read timeout errors won't affect writing[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-            local send_idx = 1[m
[31m-[m
[31m-            sock:settimeout(1)[m
[31m-[m
[31m-            local function writer()[m
[31m-                local sub = string.sub[m
[31m-                while send_idx <= #req do[m
[31m-                    local bytes, err = sock:send(sub(req, send_idx, send_idx))[m
[31m-                    if not bytes then[m
[31m-                        ngx.say("failed to send request: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    ngx.sleep(0.001)[m
[31m-                    send_idx = send_idx + 1[m
[31m-                end[m
[31m-                -- ngx.say("request sent.")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(writer)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = ""[m
[31m-            local ntm = 0[m
[31m-            local done = false[m
[31m-            for i = 1, 300 do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if not line then[m
[31m-                    if part then[m
[31m-                        data = data .. part[m
[31m-                    end[m
[31m-                    if err ~= "timeout" then[m
[31m-                        ngx.say("failed to receive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    ntm = ntm + 1[m
[31m-[m
[31m-                else[m
[31m-                    data = data .. line[m
[31m-                    ngx.say("received: ", data)[m
[31m-                    done = true[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            if not done then[m
[31m-                ngx.say("partial read: ", data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("read timed out: ", ntm)[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected: 1[m
[31m-(?:received: OK|failed to send request: timeout[m
[31m-partial read: )[m
[31m-read timed out: [1-9]\d*[m
[31m-close: 1 nil$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: writes are rejected while reads are not[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port 7658;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-            local send_idx = 1[m
[31m-[m
[31m-            local function writer()[m
[31m-                local sub = string.sub[m
[31m-                while send_idx <= #req do[m
[31m-                    local bytes, err = sock:send(sub(req, send_idx, send_idx))[m
[31m-                    if not bytes then[m
[31m-                        ngx.say("failed to send request: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    ngx.sleep(0.001)[m
[31m-                    send_idx = send_idx + 1[m
[31m-                end[m
[31m-                -- ngx.say("request sent.")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(writer)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = ""[m
[31m-            local ntm = 0[m
[31m-            local done = false[m
[31m-            for i = 1, 3 do[m
[31m-                local res, err, part = sock:receive(1)[m
[31m-                if not res then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                else[m
[31m-                    data = data .. res[m
[31m-                end[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data)[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected: 1[m
[31m-received: OK![m
[31m-close: (?:nil socket busy writing|1 nil[m
[31m-failed to send request: closed)$[m
[31m-[m
[31m---- tcp_listen: 7658[m
[31m---- tcp_shutdown: 0[m
[31m---- tcp_reply: OK![m
[31m---- tcp_no_close: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: reads are rejected while writes are not[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port 7658;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-            local send_idx = 1[m
[31m-[m
[31m-            local function writer()[m
[31m-                local sub = string.sub[m
[31m-                while send_idx <= #req do[m
[31m-                    local bytes, err = sock:send(sub(req, send_idx, send_idx))[m
[31m-                    if not bytes then[m
[31m-                        ngx.say("failed to send request: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    -- ngx.say("sent: ", bytes)[m
[31m-                    ngx.sleep(0.001)[m
[31m-                    send_idx = send_idx + 1[m
[31m-                end[m
[31m-                ngx.say("request sent.")[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(writer)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = ""[m
[31m-            local ntm = 0[m
[31m-            local done = false[m
[31m-            for i = 1, 3 do[m
[31m-                local res, err, part = sock:receive(1)[m
[31m-                if not res then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                else[m
[31m-                    data = data .. res[m
[31m-                end[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: closed[m
[31m-request sent.[m
[31m-close: 1 nil[m
[31m-[m
[31m---- stap2[m
[31m-F(ngx_http_lua_socket_tcp_finalize_write_part) {[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- tcp_listen: 7658[m
[31m---- tcp_shutdown: 1[m
[31m---- tcp_query eval: "flush_all\r\n"[m
[31m---- tcp_query_len: 11[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: concurrent socket operations while connecting[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local function f()[m
[31m-                ngx.sleep(0.001)[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-                local bytes, err = sock:send("hello")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local ok, err = sock:connect("106.187.41.147", 12345)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-receive: nil socket busy connecting[m
[31m-send: nil socket busy connecting[m
[31m-close: nil socket busy connecting[m
[31m-getreusedtimes: 0 nil[m
[31m-setkeepalive: nil socket busy connecting[m
[31m-connect: nil socket busy connecting[m
[31m-connect: nil timeout[m
[31m-close: nil closed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: concurrent operations while resolving[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver agentzh.org:12345;[m
[31m-    resolver_timeout 300ms;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local function f()[m
[31m-                ngx.sleep(0.001)[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-                local bytes, err = sock:send("hello")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local ok, err = sock:connect("some2.agentzh.org", 12345)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-receive: nil closed[m
[31m-send: nil closed[m
[31m-close: nil closed[m
[31m-getreusedtimes: nil closed[m
[31m-setkeepalive: nil closed[m
[31m-connect: nil socket busy connecting[m
[31m-connect: nil some2.agentzh.org could not be resolved (110: Operation timed out)[m
[31m-close: nil closed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: concurrent operations while reading (receive)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ready = false[m
[31m-[m
[31m-            local function f()[m
[31m-                while not ready do[m
[31m-                    ngx.sleep(0.001)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-                local bytes, err = sock:send("flush_all")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            ready = true[m
[31m-[m
[31m-            local res, err = sock:receive(1)[m
[31m-            ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connect: 1 nil[m
[31m-receive: nil socket busy reading[m
[31m-send: 9 nil[m
[31m-close: nil socket busy reading[m
[31m-getreusedtimes: 0 nil[m
[31m-setkeepalive: nil socket busy reading[m
[31m-connect: nil socket busy reading[m
[31m-receive: nil timeout[m
[31m-close: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: concurrent operations while reading (receiveuntil)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ready = false[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local function f()[m
[31m-                while not ready do[m
[31m-                    ngx.sleep(0.001)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-                local bytes, err = sock:send("flush_all")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            ready = true[m
[31m-[m
[31m-            local it, err = sock:receiveuntil("\\r\\n")[m
[31m-            if not it then[m
[31m-                ngx.say("receiveuntil() failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = it()[m
[31m-            ngx.say("receiveuntil() iterator: ", res, " ", err)[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connect: 1 nil[m
[31m-receive: nil socket busy reading[m
[31m-send: 9 nil[m
[31m-close: nil socket busy reading[m
[31m-getreusedtimes: 0 nil[m
[31m-setkeepalive: nil socket busy reading[m
[31m-connect: nil socket busy reading[m
[31m-receiveuntil() iterator: nil timeout[m
[31m-close: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/129-ssl-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/129-ssl-socket.t[m
[1mdeleted file mode 100644[m
[1mindex c19853d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/129-ssl-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,2620 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 219;[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-sub read_file {[m
[31m-    my $infile = shift;[m
[31m-    open my $in, $infile[m
[31m-        or die "cannot open $infile for reading: $!";[m
[31m-    my $cert = do { local $/; <$in> };[m
[31m-    close $in;[m
[31m-    $cert;[m
[31m-}[m
[31m-[m
[31m-our $StartComRootCertificate = read_file("t/cert/startcom.crt");[m
[31m-our $EquifaxRootCertificate = read_file("t/cert/equifax.crt");[m
[31m-our $TestCertificate = read_file("t/cert/test.crt");[m
[31m-our $TestCertificateKey = read_file("t/cert/test.key");[m
[31m-our $TestCRL = read_file("t/cert/test.crl");[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: www.google.com[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER ipv6=off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- avoid flushing google in "check leak" testing mode:[m
[31m-            local counter = package.loaded.counter[m
[31m-            if not counter then[m
[31m-                counter = 1[m
[31m-            elseif counter >= 2 then[m
[31m-                return ngx.exit(503)[m
[31m-            else[m
[31m-                counter = counter + 1[m
[31m-            end[m
[31m-            package.loaded.counter = counter[m
[31m-[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(2000)[m
[31m-                local ok, err = sock:connect("www.google.com", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake()[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: www.google.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-\Aconnected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 (?:200 OK|302 Found)[m
[31m-close: 1 nil[m
[31m-\z[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no SNI, no verify[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("g.sregex.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake()[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: g.sregex.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 57 bytes.[m
[31m-received: HTTP/1.1 401 Unauthorized[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SNI, no verify[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ssl session reuse[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-[m
[31m-            local session[m
[31m-            for i = 1, 2 do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                session, err = sock:sslhandshake(session, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            end -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl set session: \1:2[m
[31m-lua ssl save session: \1:3[m
[31m-lua ssl free session: \1:2[m
[31m-lua ssl free session: \1:1[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-SSL reused session[m
[31m-lua ssl free session[m
[31m-[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: certificate does not match host name (verify)[m
[31m-The certificate for "blah.agentzh.org" does not contain the name "blah.agentzh.org".[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 5;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("agentzh.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "blah.agentzh.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: certificate host mismatch[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "blah.agentzh.org"[m
[31m-lua ssl certificate does not match host "blah.agentzh.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: certificate does not match host name (verify, no log socket errors)[m
[31m-The certificate for "blah.agentzh.org" does not contain the name "blah.agentzh.org".[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_socket_log_errors off;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("agentzh.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "blah.agentzh.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: blah.agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: certificate host mismatch[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "blah.agentzh.org"[m
[31m---- no_error_log[m
[31m-lua ssl certificate does not match host[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: certificate does not match host name (no verify)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("agentzh.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "agentzh.org", false)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "agentzh.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: iscribblet.org: passing SSL verify[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ssl verify depth not enough (with automatic error logging)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 20: unable to get local issuer certificate[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m-lua ssl certificate verify error: (20: unable to get local issuer certificate)[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ssl verify depth not enough (without automatic error logging)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 1;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 20: unable to get local issuer certificate[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-lua ssl certificate verify error[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 7[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: www.google.com  (SSL verify passes)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER ipv6=off;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- avoid flushing google in "check leak" testing mode:[m
[31m-            local counter = package.loaded.counter[m
[31m-            if not counter then[m
[31m-                counter = 1[m
[31m-            elseif counter >= 2 then[m
[31m-                return ngx.exit(503)[m
[31m-            else[m
[31m-                counter = counter + 1[m
[31m-            end[m
[31m-            package.loaded.counter = counter[m
[31m-[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(2000)[m
[31m-                local ok, err = sock:connect("www.google.com", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "www.google.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: www.google.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::EquifaxRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-\Aconnected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 (?:200 OK|302 Found)[m
[31m-close: 1 nil[m
[31m-\z[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "www.google.com"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: www.google.com  (SSL verify enabled and no corresponding trusted certificates)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER ipv6=off;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- avoid flushing google in "check leak" testing mode:[m
[31m-            local counter = package.loaded.counter[m
[31m-            if not counter then[m
[31m-                counter = 1[m
[31m-            elseif counter >= 2 then[m
[31m-                return ngx.exit(503)[m
[31m-            else[m
[31m-                counter = counter + 1[m
[31m-            end[m
[31m-            package.loaded.counter = counter[m
[31m-[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(2000)[m
[31m-                local ok, err = sock:connect("www.google.com", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "www.google.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: www.google.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 20: unable to get local issuer certificate[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "www.google.com"[m
[31m-lua ssl certificate verify error: (20: unable to get local issuer certificate)[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: iscribblet.org: passing SSL verify with multiple certificates[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::EquifaxRootCertificate[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: default cipher[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m-SSL: TLSv1.2, cipher: "ECDHE-RSA-RC4-SHA SSLv3[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: explicit cipher configuration[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_ciphers RC4-SHA;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m-SSL: TLSv1.2, cipher: "RC4-SHA SSLv3[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: explicit ssl protocol configuration[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_protocols TLSv1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m-SSL: TLSv1, cipher: "ECDHE-RSA-RC4-SHA SSLv3[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: unsupported ssl protocol[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_protocols SSLv2;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[crit\] .*?SSL_do_handshake\(\) failed .*?unsupported protocol/,[m
[31m-'lua ssl server name: "iscribblet.org"',[m
[31m-][m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: iscribblet.org: passing SSL verify: keepalive (reuse the ssl session)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-[m
[31m-            local session[m
[31m-            for i = 1, 3 do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                session, err = sock:sslhandshake(session, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("set keepalive: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-[m
[31m-            end[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: \1:2[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: iscribblet.org: passing SSL verify: keepalive (no reusing the ssl session)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("set keepalive: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-[m
[31m-            end[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl save session: \1:3[m
[31m-lua ssl save session: \1:4[m
[31m-lua ssl free session: \1:4[m
[31m-lua ssl free session: \1:3[m
[31m-lua ssl free session: \1:2[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: downstream cosockets do not support ssl handshake[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local sess, err = sock:sslhandshake()[m
[31m-            if not sess then[m
[31m-                ngx.say("failed to do ssl handshake: ", err)[m
[31m-            else[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-attempt to call method 'sslhandshake' (a nil value)[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: unix domain ssl cosocket (no verify)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake()[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: unix domain ssl cosocket (verify)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: unix domain ssl cosocket (no ssl on server)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-        server_name   test.com;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake()[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log eval[m
[31m-qr/SSL_do_handshake\(\) failed .*?unknown protocol/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: lua_ssl_crl[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_crl ../html/test.crl;[m
[31m-    lua_ssl_trusted_certificate ../html/test.crt;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(sess))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 12: CRL has expired[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate[m
[31m->>> test.crl[m
[31m-$::TestCRL"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: multiple handshake calls[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                for i = 1, 2 do[m
[31m-                    local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                    if not session then[m
[31m-                        ngx.say("failed to do SSL handshake: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl save session: ([0-9A-F]+):3[m
[31m-lua ssl free session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: handshake timed out[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                sock:settimeout(1);  -- should timeout immediately[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: timeout[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: unix domain ssl cosocket (no gen session)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", sess)[m
[31m-[m
[31m-                sock:close()[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: true[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: unix domain ssl cosocket (gen session, true)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                sock:close()[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: unix domain ssl cosocket (keepalive)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(3000)[m
[31m-            for i = 1, 2 do[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", sess)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set keepalive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: true[m
[31m-connected: 1[m
[31m-ssl handshake: true[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: unix domain ssl cosocket (verify cert but no host name check, passed)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, nil, true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: unix domain ssl cosocket (verify cert but no host name check, NOT passed)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    #lua_ssl_trusted_certificate ../html/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, nil, true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 18: self signed certificate[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl certificate verify error: (18: self signed certificate)[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: handshake, too many arguments[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            local ok, err = sock:connect("g.sregex.org", 443)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local session, err = sock.sslhandshake()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/\[error\] .* ngx.socket connect: expecting 1 ~ 5 arguments \(including the object\), but seen 0/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- timeout: 5[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/130-internal-api.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/130-internal-api.t[m
[1mdeleted file mode 100644[m
[1mindex d641ab5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/130-internal-api.t[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 3;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: __ngx_req and __ngx_cycle[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        my_cycle = __ngx_cycle[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local function tonum(ud)[m
[31m-                return tonumber(ffi.cast("uintptr_t", ud))[m
[31m-            end[m
[31m-            ngx.say(string.format("init: cycle=%#x", tonum(my_cycle)))[m
[31m-            ngx.say(string.format("content cycle=%#x", tonum(__ngx_cycle)))[m
[31m-            ngx.say(string.format("content req=%#x", tonum(__ngx_req)))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^init: cycle=(0x[a-f0-9]{4,})[m
[31m-content cycle=\1[m
[31m-content req=0x[a-f0-9]{4,}[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/131-duplex-req-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/131-duplex-req-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 5d698b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/131-duplex-req-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'slow';[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: raw downstream cosocket used in two different threads. See issue #481[m
[31m---- config[m
[31m-    lua_socket_read_timeout 1ms;[m
[31m-    lua_socket_send_timeout 1s;[m
[31m-    lua_socket_log_errors off;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function reader(req_socket)[m
[31m-               -- First we receive in a blocking fashion so that ctx->downstream_co_ctx will be changed[m
[31m-               local data, err, partial = req_socket:receive(1)[m
[31m-               if err ~= "timeout" then[m
[31m-                  ngx.log(ngx.ERR, "Did not get timeout in the receiving thread!")[m
[31m-                  return[m
[31m-               end[m
[31m-[m
[31m-               -- Now, sleep so that coctx->data is changed to sleep handler[m
[31m-               ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            local function writer(req_socket)[m
[31m-               -- send in a slow manner with a low timeout, so that the timeout handler will be[m
[31m-               local bytes, err = req_socket:send("slow!!!")[m
[31m-               if err ~= "timeout" then[m
[31m-                  return error("Did not get timeout in the sending thread!")[m
[31m-               end[m
[31m-            end[m
[31m-[m
[31m-            local req_socket, err = ngx.req.socket(true)[m
[31m-            if req_socket == nil then[m
[31m-               ngx.status = 500[m
[31m-               return error("Unable to get request socket:" .. (err or "nil"))[m
[31m-            end[m
[31m-[m
[31m-            local writer_thread = ngx.thread.spawn(writer, req_socket)[m
[31m-            local reader_thread = ngx.thread.spawn(reader, req_socket)[m
[31m-[m
[31m-            ngx.thread.wait(writer_thread)[m
[31m-            ngx.thread.wait(reader_thread)[m
[31m-            print("The two threads finished")[m
[31m-';[m
[31m-        }[m
[31m---- request[m
[31m-POST /t[m
[31m---- more_headers[m
[31m-Content-Length: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log: The two threads finished[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: normal downstream cosocket used in two different threads. See issue #481[m
[31m---- config[m
[31m-    lua_socket_read_timeout 1ms;[m
[31m-    lua_socket_send_timeout 1s;[m
[31m-    lua_socket_log_errors off;[m
[31m-    send_timeout 1s;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function reader(req_socket)[m
[31m-               -- First we receive in a blocking fashion so that ctx->downstream_co_ctx will be changed[m
[31m-               local data, err, partial = req_socket:receive(1)[m
[31m-               if err ~= "timeout" then[m
[31m-                  ngx.log(ngx.ERR, "Did not get timeout in the receiving thread!")[m
[31m-                  return[m
[31m-               end[m
[31m-[m
[31m-               -- Now, sleep so that coctx->data is changed to sleep handler[m
[31m-               ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            local function writer(req_socket)[m
[31m-               -- send in a slow manner with a low timeout, so that the timeout handler will be[m
[31m-               ngx.sleep(0.3)[m
[31m-               ngx.say("slow!!!")[m
[31m-               ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            local req_socket, err = ngx.req.socket()[m
[31m-            if req_socket == nil then[m
[31m-               ngx.status = 500[m
[31m-               return error("Unable to get request socket:" .. (err or "nil"))[m
[31m-            end[m
[31m-[m
[31m-            local writer_thread = ngx.thread.spawn(writer, req_socket)[m
[31m-            local reader_thread = ngx.thread.spawn(reader, req_socket)[m
[31m-[m
[31m-            ngx.thread.wait(writer_thread)[m
[31m-            ngx.thread.wait(reader_thread)[m
[31m-            print("The two threads finished")[m
[31m-';[m
[31m-        }[m
[31m---- request[m
[31m-POST /t[m
[31m---- more_headers[m
[31m-Content-Length: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log: The two threads finished[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/132-lua-blocks.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/132-lua-blocks.t[m
[1mdeleted file mode 100644[m
[1mindex e2933e9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/132-lua-blocks.t[m
[1m+++ /dev/null[m
[36m@@ -1,590 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: content_by_lua_block (simplest)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: content_by_lua_block (nested curly braces)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local a = {[m
[31m-                dogs = {32, 78, 96},[m
[31m-                cat = "kitty",[m
[31m-            }[m
[31m-            ngx.say("a.dogs[1] = ", a.dogs[1])[m
[31m-            ngx.say("a.dogs[2] = ", a.dogs[2])[m
[31m-            ngx.say("a.dogs[3] = ", a.dogs[3])[m
[31m-            ngx.say("a.cat = ", a.cat)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-a.dogs[1] = 32[m
[31m-a.dogs[2] = 78[m
[31m-a.dogs[3] = 96[m
[31m-a.cat = kitty[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: content_by_lua_block (curly braces in strings)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("}1, 2)")[m
[31m-            ngx.say('{1, 2)')[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-}1, 2)[m
[31m-{1, 2)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: content_by_lua_block (curly braces in strings, with escaped terminators)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("\"}1, 2)")[m
[31m-            ngx.say('\'{1, 2)')[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-"}1, 2)[m
[31m-'{1, 2)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: content_by_lua_block (curly braces in long brackets)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            --[[[m
[31m-                {{{[m
[31m-[m
[31m-                        }[m
[31m-            ]][m
[31m-            --[==[[m
[31m-                }}}[m
[31m-[m
[31m-                        {[m
[31m-            ]==][m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: content_by_lua_block ("nested" long brackets)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            --[[[m
[31m-                ]=][m
[31m-            '  "[m
[31m-                        }[m
[31m-            ]][m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: content_by_lua_block (curly braces in line comments)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            --}} {}[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: content_by_lua_block (cosockets)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect('127.0.0.1', tonumber(ngx.var.server_port))[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say('connected: ', ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua_block { ngx.say("foo") }[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: all in one[m
[31m---- http_config[m
[31m-    init_by_lua_block {[m
[31m-        glob = "init by lua }here{"[m
[31m-    }[m
[31m-[m
[31m-    init_worker_by_lua_block {[m
[31m-        glob = glob .. ", init worker }here{"[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $a '';[m
[31m-        rewrite_by_lua_block {[m
[31m-            local s = ngx.var.a[m
[31m-            s = s .. "}rewrite{\n"[m
[31m-            ngx.var.a = s[m
[31m-        }[m
[31m-        access_by_lua_block {[m
[31m-            local s = ngx.var.a[m
[31m-            s = s .. '}access{\n'[m
[31m-            ngx.var.a = s[m
[31m-        }[m
[31m-        content_by_lua_block {[m
[31m-            local s = ngx.var.a[m
[31m-            s = s .. [[}content{]][m
[31m-            ngx.say(s)[m
[31m-            ngx.say("glob: ", glob)[m
[31m-        }[m
[31m-        log_by_lua_block {[m
[31m-            print("log by lua running \"}{!\"")[m
[31m-        }[m
[31m-        header_filter_by_lua_block {[m
[31m-            ngx.header["Foo"] = "\"Hello, world\""[m
[31m-            ngx.header["Content-Length"] = nil[m
[31m-        }[m
[31m-        body_filter_by_lua_block {[m
[31m-            local data, eof = ngx.arg[1], ngx.arg[2][m
[31m-            print("eof = ", eof)[m
[31m-            if eof then[m
[31m-                if not data then[m
[31m-                    data = ""[m
[31m-                end[m
[31m-                data = data .. "}body filter{\n"[m
[31m-                print("data: ", data)[m
[31m-                ngx.arg[1] = data[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-}rewrite{[m
[31m-}access{[m
[31m-}content{[m
[31m-glob: init by lua }here{, init worker }here{[m
[31m-}body filter{[m
[31m-[m
[31m---- response_headers[m
[31m-Foo: "Hello, world"[m
[31m---- error_log[m
[31m-log by lua running "}{!"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: missing ]] (string)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say([[hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? Lua code block missing the closing long bracket "]]" in .*?\bnginx\.conf:41/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: missing ]==] (string)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say([==[hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? Lua code block missing the closing long bracket "]==]" in .*?\bnginx\.conf:41/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: missing ]] (comment)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say(--[[hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? Lua code block missing the closing long bracket "]]" in .*?\bnginx\.conf:41/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: missing ]=] (comment)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say(--[=[hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? Lua code block missing the closing long bracket "]=]" in .*?\bnginx\.conf:41/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: missing }[m
[31m-FIXME: we need better diagnostics by actually loading the inlined Lua code while parsing[m
[31m-the *_by_lua_block directive.[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("hello")[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-"events" directive is not allowed here[m
[31m---- must_die[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: content_by_lua_block (compact)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {ngx.say("hello, world", {"!"})}[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: content_by_lua_block unexpected closing long brackets must FAIL[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ]=][m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr{\[error\] .*? unexpected symbol near ']'}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: content_by_lua_block unexpected closing long brackets ignored (GitHub #748)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local t1, t2 = {"hello world"}, {1}[m
[31m-            ngx.say(t1[t2[1]])[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: simple set_by_lua_block (integer)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_block $res { return 1+1 }[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ambiguous line comments inside a long bracket string (GitHub #596)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say([[ok--]])[m
[31m-            ngx.say([==[ok--]==])[m
[31m-            ngx.say([==[ok-- ]==])[m
[31m-            --[[ --]] ngx.say("done")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok--[m
[31m-ok--[m
[31m-ok-- [m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: double quotes in long brackets[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua_block { print([[Hey, it is "!]]) } content_by_lua_block { ngx.say([["]]) }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-"[m
[31m---- error_log[m
[31m-Hey, it is "![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: single quotes in long brackets[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua_block { print([[Hey, it is '!]]) } content_by_lua_block { ngx.say([[']]) }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-'[m
[31m---- error_log[m
[31m-Hey, it is '![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: lexer no match due to incomplete data chunks in a fixed size buffer[m
[31m---- config[m
[31m-        location /test1 {[m
[31m-            content_by_lua_block {[m
[31m-                ngx.say("1: this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error")[m
[31m-            }[m
[31m-        }[m
[31m-        location /test2 {[m
[31m-            content_by_lua_block {[m
[31m-                ngx.say("2: this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error")[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        location /test3 {[m
[31m-            content_by_lua_block {[m
[31m-                ngx.say("3: this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error")[m
[31m-            }[m
[31m-        }[m
[31m---- request[m
[31m-GET /test3[m
[31m---- response_body eval[m
[31m-"3: " . ("this is just some random filler to cause an error" x 20) . "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/133-worker-count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/133-worker-count.t[m
[1mdeleted file mode 100644[m
[1mindex c97f6b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/133-worker-count.t[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("workers: ", ngx.worker.count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-workers: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua_block {[m
[31m-        package.loaded.count = ngx.worker.count()[m
[31m-    }[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("workers: ", package.loaded.count)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-workers: 1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/134-worker-count-5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/134-worker-count-5.t[m
[1mdeleted file mode 100644[m
[1mindex b257c12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/134-worker-count-5.t[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-workers(5);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("worker count: ", ngx.worker.count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-worker count: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua_block {[m
[31m-        package.loaded.count = ngx.worker.count()[m
[31m-    }[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("workers: ", package.loaded.count)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-workers: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: init_by_lua + module (github #681)[m
[31m---- http_config[m
[31m-    lua_package_path "t/servroot/html/?.lua;;";[m
[31m-[m
[31m-    init_by_lua_block {[m
[31m-        local blah = require "file"[m
[31m-    }[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- user_files[m
[31m->>> file.lua[m
[31m-local timer_interval = 1[m
[31m-local time_factor = timer_interval / (ngx.worker.count() * 60)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/135-worker-id.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/135-worker-id.t[m
[1mdeleted file mode 100644[m
[1mindex 3c1f24d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/135-worker-id.t[m
[1m+++ /dev/null[m
[36m@@ -1,93 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-master_on();[m
[31m-workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("worker id: ", ngx.worker.id())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^worker id: [0-1]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- skip_nginx: 3: <=1.9.0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: worker id should be nil for non-worker processes[m
[31m---- http_config[m
[31m-    proxy_cache_path conf/cache levels=1:2 keys_zone=my-cache:8m max_size=10m inactive=60m;[m
[31m-    proxy_temp_path conf/temp;[m
[31m-[m
[31m-    lua_shared_dict counters 1m;[m
[31m-[m
[31m-    init_by_lua_block {[m
[31m-        ngx.shared.counters:set("c", 0)[m
[31m-    }[m
[31m-[m
[31m-    init_worker_by_lua_block {[m
[31m-        ngx.shared.counters:incr("c", 1)[m
[31m-        ngx.log(ngx.INFO, ngx.worker.pid(), ": worker id ", ngx.worker.id());[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local counters = ngx.shared.counters[m
[31m-            local ok, c[m
[31m-            for i = 1, 45 do[m
[31m-                c = counters:get("c")[m
[31m-                if c >= 4 then[m
[31m-                    ok = true[m
[31m-                    break[m
[31m-                end[m
[31m-                local delay = 0.001 * i[m
[31m-                if delay > 0.1 then[m
[31m-                    delay = 0.1[m
[31m-                end[m
[31m-                ngx.sleep(delay)[m
[31m-            end[m
[31m-            if ok then[m
[31m-                ngx.say("ok")[m
[31m-            else[m
[31m-                ngx.say("not ok: c=", c)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-    location /cache {[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-        proxy_cache my-cache;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/worker id nil/[m
[31m---- grep_error_log_out[m
[31m-worker id nil[m
[31m-worker id nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- wait: 0.1[m
[31m---- skip_nginx: 3: <=1.9.0[m
[31m---- log_level: info[m
[31m---- timeout: 6[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/136-timer-counts.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/136-timer-counts.t[m
[1mdeleted file mode 100644[m
[1mindex 8f5329b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/136-timer-counts.t[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * (repeat_each() * 3);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: running count with no running timers[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block { ngx.say(ngx.timer.running_count()) }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: running count with no pending timers[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block { ngx.say(ngx.timer.pending_count()) }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: pending count with one pending timer[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.timer.at(3, function() end)[m
[31m-            ngx.say(ngx.timer.pending_count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: pending count with 3 pending timers[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.timer.at(4, function() end)[m
[31m-            ngx.timer.at(2, function() end)[m
[31m-            ngx.timer.at(1, function() end)[m
[31m-            ngx.say(ngx.timer.pending_count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: one running timer[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.timer.at(0.1, function() ngx.sleep(0.3) end)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.say(ngx.timer.running_count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: 3 running timers[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.timer.at(0.1, function() ngx.sleep(0.3) end)[m
[31m-            ngx.timer.at(0.11, function() ngx.sleep(0.3) end)[m
[31m-            ngx.timer.at(0.09, function() ngx.sleep(0.3) end)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.say(ngx.timer.running_count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-3[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/137-req-misc.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/137-req-misc.t[m
[1mdeleted file mode 100644[m
[1mindex 20ada3c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/137-req-misc.t[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#worker_connections(1014);[m
[31m-#log_level('warn');[m
[31m-#master_process_enabled(1);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks() * 2;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: not internal request[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite ^/test$ /lua last;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            if ngx.req.is_internal() then[m
[31m-                ngx.say("internal")[m
[31m-            else[m
[31m-                ngx.say("not internal")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-not internal[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: internal request[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite ^/test$ /lua last;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            if ngx.req.is_internal() then[m
[31m-                ngx.say("internal")[m
[31m-            else[m
[31m-                ngx.say("not internal")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-internal[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/138-balancer.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/138-balancer.t[m
[1mdeleted file mode 100644[m
[1mindex e44cf8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/138-balancer.t[m
[1m+++ /dev/null[m
[36m@@ -1,407 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 8);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple logging[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit 403[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            ngx.exit(403)[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-'[warn]',[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"},[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit OK[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            ngx.exit(ngx.OK)[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.var works[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("1: variable foo = ", ngx.var.foo)[m
[31m-            ngx.var.foo = tonumber(ngx.var.foo) + 1[m
[31m-            print("2: variable foo = ", ngx.var.foo)[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo 32;[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-"1: variable foo = 32",[m
[31m-"2: variable foo = 33",[m
[31m-qr/\[crit\] .* connect\(\) .*? failed/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.req.get_headers works[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("header foo: ", ngx.req.get_headers()["foo"])[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-"header foo: bar",[m
[31m-qr/\[crit\] .* connect\(\) .*? failed/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.req.get_uri_args() works[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("arg foo: ", ngx.req.get_uri_args()["foo"])[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t?baz=blah&foo=bar[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-["arg foo: bar",[m
[31m-qr/\[crit\] .* connect\(\) .*? failed/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.req.get_method() works[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("method: ", ngx.req.get_method())[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-"method: GET",[m
[31m-qr/\[crit\] .* connect\(\) .*? failed/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple logging (by_lua_file)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-print("hello from balancer by lua!")[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] a.lua:1: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: cosockets are disabled[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? failed to run balancer_by_lua\*: balancer_by_lua:2: API disabled in the context of balancer_by_lua\*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.sleep is disabled[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            ngx.sleep(0.1)[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? failed to run balancer_by_lua\*: balancer_by_lua:2: API disabled in the context of balancer_by_lua\*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: get_phase[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("I am in phase ", ngx.get_phase())[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr/I am in phase \w+/[m
[31m---- grep_error_log_out[m
[31m-I am in phase balancer[m
[31m---- error_log eval[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: code cache off[m
[31m---- http_config[m
[31m-    lua_package_path "t/servroot/html/?.lua;;";[m
[31m-[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            require("test")[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo_location /main;[m
[31m-        echo_location /update;[m
[31m-        echo_location /main;[m
[31m-    }[m
[31m-[m
[31m-    location = /update {[m
[31m-        content_by_lua_block {[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("print('me: ', 101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-print("me: ", 32)[m
[31m-return {}[m
[31m---- response_body[m
[31m-ok[m
[31m-updated[m
[31m-ok[m
[31m---- grep_error_log eval: qr/\bme: \w+/[m
[31m---- grep_error_log_out[m
[31m-me: 32[m
[31m-me: 101[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: lua subrequests[m
[31m---- http_config[m
[31m-    lua_package_path "t/servroot/html/?.lua;;";[m
[31m-[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("ctx counter: ", ngx.ctx.count)[m
[31m-            if not ngx.ctx.count then[m
[31m-                ngx.ctx.count = 1[m
[31m-            else[m
[31m-                ngx.ctx.count = ngx.ctx.count + 1[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local res = ngx.location.capture("/main")[m
[31m-            ngx.print(res.body)[m
[31m-            res = ngx.location.capture("/main")[m
[31m-            ngx.print(res.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m-ok[m
[31m---- grep_error_log eval: qr/\bctx counter: \w+/[m
[31m---- grep_error_log_out[m
[31m-ctx counter: nil[m
[31m-ctx counter: nil[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/139-ssl-cert-by.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/139-ssl-cert-by.t[m
[1mdeleted file mode 100644[m
[1mindex 9297a0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/139-ssl-cert-by.t[m
[1m+++ /dev/null[m
[36m@@ -1,1477 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-# All these tests need to have new openssl[m
[31m-my $NginxBinary = $ENV{'TEST_NGINX_BINARY'} || 'nginx';[m
[31m-my $openssl_version = eval { `$NginxBinary -V 2>&1` };[m
[31m-[m
[31m-if ($openssl_version =~ m/built with OpenSSL (0|1\.0\.(?:0|1[^\d]|2[a-d]).*)/) {[m
[31m-    plan(skip_all => "too old OpenSSL, need 1.0.2e, was $1");[m
[31m-} else {[m
[31m-    plan tests => repeat_each() * (blocks() * 6 + 10);[m
[31m-}[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple logging[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block { print("ssl cert by lua is running!") }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ssl_certificate_by_lua:1: ssl cert by lua is running![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local begin = ngx.now()[m
[31m-            ngx.sleep(0.1)[m
[31m-            print("elapsed in ssl cert by lua: ", ngx.now() - begin)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua ssl server name: "test.com"',[m
[31m-qr/elapsed in ssl cert by lua: 0.(?:09|1[01])\d+,/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: timer[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local function f()[m
[31m-                print("my timer run!")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to create timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-my timer run![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cosocket[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect to memc: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("flush_all\r\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send flush_all command: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = sock:receive()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to receive memc reply: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            print("received memc reply: ", res)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-received memc reply: OK[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(0) - no yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.exit(0)[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-lua exit with code 0[m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(ngx.ERROR) - no yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua_certificate_by_lua: handler return value: -1, cert cb exit code: 0',[m
[31m-qr/\[crit\] .*? SSL_do_handshake\(\) failed .*?cert cb error/,[m
[31m-'lua exit with code -1',[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.exit(0) -  yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.sleep(0.001)[m
[31m-            ngx.exit(0)[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-lua exit with code 0[m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.exit(ngx.ERROR) - yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.sleep(0.001)[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua_certificate_by_lua: cert cb exit code: 0',[m
[31m-qr/\[crit\] .*? SSL_do_handshake\(\) failed .*?cert cb error/,[m
[31m-'lua exit with code -1',[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: lua exception - no yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            error("bad bad bad")[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'runtime error: ssl_certificate_by_lua:2: bad bad bad',[m
[31m-'lua_certificate_by_lua: handler return value: 500, cert cb exit code: 0',[m
[31m-qr/\[crit\] .*? SSL_do_handshake\(\) failed .*?cert cb error/,[m
[31m-qr/context: ssl_certificate_by_lua\*, client: \d+\.\d+\.\d+\.\d+, server: \d+\.\d+\.\d+\.\d+:\d+/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: lua exception - yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.sleep(0.001)[m
[31m-            error("bad bad bad")[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'runtime error: ssl_certificate_by_lua:3: bad bad bad',[m
[31m-'lua_certificate_by_lua: cert cb exit code: 0',[m
[31m-qr/\[crit\] .*? SSL_do_handshake\(\) failed .*?cert cb error/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: get phase[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {print("get_phase: ", ngx.get_phase())}[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end[m
[31m-            collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-get_phase: ssl_cert[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: connection aborted prematurely[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.sleep(0.3)[m
[31m-            -- local ssl = require "ngx.ssl"[m
[31m-            -- ssl.clear_certs()[m
[31m-            print("ssl-cert-by-lua: after sleeping")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(150)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: timeout[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ssl-cert-by-lua: after sleeping[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- wait: 0.6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: subrequests disabled[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {ngx.location.capture("/foo")}[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua ssl server name: "test.com"',[m
[31m-'ssl_certificate_by_lua:1: API disabled in the context of ssl_certificate_by_lua*',[m
[31m-qr/\[crit\] .*?cert cb error/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: simple logging (by_lua_file)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_file html/a.lua;[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-print("ssl cert by lua is running!")[m
[31m-[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-a.lua:1: ssl cert by lua is running![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: coroutine API[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            local function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    print("co yield: ", cnt)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i = 1, 3 do[m
[31m-                print("co resume, status: ", coroutine.status(c))[m
[31m-                cr(c)[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- grep_error_log eval: qr/co (?:yield: \d+|resume, status: \w+)/[m
[31m---- grep_error_log_out[m
[31m-co resume, status: suspended[m
[31m-co yield: 0[m
[31m-co resume, status: suspended[m
[31m-co yield: 1[m
[31m-co resume, status: suspended[m
[31m-co yield: 2[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: simple user thread wait with yielding[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            function f()[m
[31m-                ngx.sleep(0.01)[m
[31m-                print("uthread: hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.log(ngx.ERR, "uthread: failed to spawn thread: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-[m
[31m-            print("uthread: thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                print("uthread: failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            print("uthread: ", res)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- grep_error_log eval: qr/uthread: [^.,]+/[m
[31m---- grep_error_log_out[m
[31m-uthread: thread created: running[m
[31m-uthread: hello in thread[m
[31m-uthread: done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: simple logging - use ssl_certificiate_by_lua* on the http {} level[m
[31m-GitHub openresty/lua-resty-core#42[m
[31m---- http_config[m
[31m-    ssl_certificate_by_lua_block { print("ssl cert by lua is running!") }[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ssl_certificate_by_lua:1: ssl cert by lua is running![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/140-ssl-c-api.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/140-ssl-c-api.t[m
[1mdeleted file mode 100644[m
[1mindex 4ecc2cd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/140-ssl-c-api.t[m
[1m+++ /dev/null[m
[36m@@ -1,499 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-# All these tests need to have new openssl[m
[31m-my $NginxBinary = $ENV{'TEST_NGINX_BINARY'} || 'nginx';[m
[31m-my $openssl_version = eval { `$NginxBinary -V 2>&1` };[m
[31m-[m
[31m-if ($openssl_version =~ m/built with OpenSSL (0|1\.0\.(?:0|1[^\d]|2[a-d]).*)/) {[m
[31m-    plan(skip_all => "too old OpenSSL, need 1.0.2e, was $1");[m
[31m-} else {[m
[31m-    plan tests => repeat_each() * (blocks() * 5 + 1);[m
[31m-}[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple cert + private key[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_set_der_certificate(void *r,[m
[31m-                    const char *data, size_t len, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_set_der_private_key(void *r,[m
[31m-                    const char *data, size_t len, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_clear_certs(void *r, char **err);[m
[31m-            ]][m
[31m-[m
[31m-            local errmsg = ffi.new("char *[1]")[m
[31m-[m
[31m-            local r = getfenv(0).__ngx_req[m
[31m-            if not r then[m
[31m-                ngx.log(ngx.ERR, "no request found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ffi.C.ngx_http_lua_ffi_ssl_clear_certs(r, errmsg)[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/test.crt", "rb"))[m
[31m-            local cert = f:read("*all")[m
[31m-            f:close()[m
[31m-[m
[31m-            local out = ffi.new("char [?]", #cert)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_cert_pem_to_der(cert, #cert, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cert_der = ffi.string(out, rc)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_certificate(r, cert_der, #cert_der, errmsg)[m
[31m-            if rc ~= 0 then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            f = assert(io.open("t/cert/test.key", "rb"))[m
[31m-            local pkey = f:read("*all")[m
[31m-            f:close()[m
[31m-[m
[31m-            out = ffi.new("char [?]", #pkey)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pkey_der = ffi.string(out, rc)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_private_key(r, pkey_der, #pkey_der, errmsg)[m
[31m-            if rc ~= 0 then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ECDSA cert + private key[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_set_der_certificate(void *r,[m
[31m-                    const char *data, size_t len, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_set_der_private_key(void *r,[m
[31m-                    const char *data, size_t len, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_clear_certs(void *r, char **err);[m
[31m-            ]][m
[31m-[m
[31m-            local errmsg = ffi.new("char *[1]")[m
[31m-[m
[31m-            local r = getfenv(0).__ngx_req[m
[31m-            if not r then[m
[31m-                ngx.log(ngx.ERR, "no request found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ffi.C.ngx_http_lua_ffi_ssl_clear_certs(r, errmsg)[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/test_ecdsa.crt", "rb"))[m
[31m-            local cert = f:read("*all")[m
[31m-            f:close()[m
[31m-[m
[31m-            local out = ffi.new("char [?]", #cert)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_cert_pem_to_der(cert, #cert, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cert_der = ffi.string(out, rc)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_certificate(r, cert_der, #cert_der, errmsg)[m
[31m-            if rc ~= 0 then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            f = assert(io.open("t/cert/test_ecdsa.key", "rb"))[m
[31m-            local pkey = f:read("*all")[m
[31m-            f:close()[m
[31m-[m
[31m-            out = ffi.new("char [?]", #pkey)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pkey_der = ffi.string(out, rc)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_private_key(r, pkey_der, #pkey_der, errmsg)[m
[31m-            if rc ~= 0 then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test_ecdsa.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: Handshake continue when cert_pem_to_der errors[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-            ]][m
[31m-[m
[31m-            local errmsg = ffi.new("char *[1]")[m
[31m-[m
[31m-            local r = getfenv(0).__ngx_req[m
[31m-            if not r then[m
[31m-                ngx.log(ngx.ERR, "no request found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cert = "garbage data"[m
[31m-[m
[31m-            local out = ffi.new("char [?]", #cert)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_cert_pem_to_der(cert, #cert, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-            end[m
[31m-[m
[31m-            local pkey = "garbage key data"[m
[31m-[m
[31m-            out = ffi.new("char [?]", #pkey)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-            end[m
[31m-        }[m
[31m-[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to parse PEM cert: PEM_read_bio_X509_AUX()[m
[31m-failed to parse PEM priv key: PEM_read_bio_PrivateKey failed[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/141-luajit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/141-luajit.t[m
[1mdeleted file mode 100644[m
[1mindex be03fe3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/141-luajit.t[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: avoid the data segment from growing on Linux[m
[31m-This is to maximize the address space that can be used by LuaJIT.[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local ffi = require "ffi"[m
[31m-            ffi.cdef[[[m
[31m-                void *malloc(size_t size);[m
[31m-                void free(void *p);[m
[31m-            ]][m
[31m-            local p = ffi.C.malloc(1);[m
[31m-            local num = tonumber(ffi.cast("uintptr_t", p))[m
[31m-            ffi.C.free(p)[m
[31m-            if ffi.abi("64bit") then[m
[31m-                if num < 2^31 then[m
[31m-                    ngx.say("fail: ", string.format("p = %#x", num))[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("pass")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-pass[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/StapThread.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/StapThread.pm[m
[1mdeleted file mode 100644[m
[1mindex e958863..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/StapThread.pm[m
[1m+++ /dev/null[m
[36m@@ -1,282 +0,0 @@[m
[31m-package t::StapThread;[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-our $GCScript = <<'_EOC_';[m
[31m-global ids, cur[m
[31m-global in_req = 0[m
[31m-global alive_reqs[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    if (!alive_reqs[$r] && $r == $r->main) {[m
[31m-        in_req++[m
[31m-        alive_reqs[$r] = 1[m
[31m-[m
[31m-        if (in_req == 1) {[m
[31m-            delete ids[m
[31m-            cur = 0[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    if (alive_reqs[$r]) {[m
[31m-        in_req--[m
[31m-        delete alive_reqs[$r][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_terminate_request) {[m
[31m-    if (alive_reqs[$r]) {[m
[31m-        in_req--[m
[31m-        delete alive_reqs[$r][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-thread-spawn) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("spawn user thread %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-thread-delete) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("delete thread %x\n", t)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-coroutine-done) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("terminate %d: %s\n", t, $arg3 ? "ok" : "fail")[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = <<'_EOC_';[m
[31m-global ids, cur[m
[31m-global timers[m
[31m-global in_req = 0[m
[31m-global co_status[m
[31m-global alive_reqs[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    if (!alive_reqs[$r] && $r == $r->main) {[m
[31m-        in_req++[m
[31m-        alive_reqs[$r] = 1[m
[31m-[m
[31m-        printf("in req: %d\n", in_req)[m
[31m-[m
[31m-        if (in_req == 1) {[m
[31m-            delete ids[m
[31m-            cur = 0[m
[31m-            co_status[0] = "running"[m
[31m-            co_status[1] = "suspended"[m
[31m-            co_status[2] = "normal"[m
[31m-            co_status[3] = "dead"[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    if (alive_reqs[$r]) {[m
[31m-        in_req--[m
[31m-        println("free request")[m
[31m-        delete alive_reqs[$r][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_terminate_request) {[m
[31m-    if (alive_reqs[$r]) {[m
[31m-        in_req--[m
[31m-        println("terminate request")[m
[31m-        delete alive_reqs[$r][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_thread) {[m
[31m-    id = gen_id($coctx->co)[m
[31m-    printf("post thread %d\n", id)[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    timers[$arg1] = $arg2[m
[31m-    printf("add timer %d\n", $arg2)[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    printf("delete timer %d\n", timers[$arg1])[m
[31m-    delete timers[$arg1][m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    printf("expire timer %d\n", timers[$arg1])[m
[31m-    delete timers[$arg1][m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_handler) {[m
[31m-    printf("sleep handler called\n")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    id = gen_id($ctx->cur_co_ctx->co)[m
[31m-    printf("run thread %d\n", id)[m
[31m-    #if (id == 1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("lua resume %d\n", id)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-thread-spawn) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("spawn uthread %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-thread-delete) {[m
[31m-    t = gen_id($arg2)[m
[31m-    uthreads = @cast($arg3, "ngx_http_lua_ctx_t")->uthreads[m
[31m-    printf("delete thread %x (uthreads %d)\n", t, uthreads)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m-M(http-lua-run-posted-thread) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("run posted thread %d (status %s)\n", t, co_status[$arg3])[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-resume) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("resume %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-thread-yield) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("thread %d yield\n", t)[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_coroutine_yield) {[m
[31m-    printf("yield %x\n", gen_id($L))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-yield) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("yield %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_atpanic) {[m
[31m-    printf("lua atpanic(%d):", gen_id($L))[m
[31m-    print_ubacktrace();[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_run_posted_threads) {[m
[31m-    printf("run posted threads\n")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-M(http-subrequest-wake-parent) {[m
[31m-    printf("subrequest wake parent %s\n", ngx_http_req_uri($r->parent))[m
[31m-}[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exec) { println("exec") }[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) { println("exit") }[m
[31m-F(ngx_http_lua_ffi_exit) { println("exit") }[m
[31m-[m
[31m-F(ngx_http_lua_req_body_cleanup) {[m
[31m-    println("lua req body cleanup")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_read_client_request_body) {[m
[31m-    println("read client request body")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_finalize_coroutines) {[m
[31m-    println("finalize coroutines")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) {[m
[31m-    println("ngx.exit() called")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ffi_exit) {[m
[31m-    println("ngx.exit() called")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_resume) {[m
[31m-    println("lua sleep resume")[m
[31m-}[m
[31m-[m
[31m-M(http-lua-coroutine-done) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("terminate coro %d: %s, waited by parent:%d, child cocotx: %p\n", t, $arg3 ? "ok" : "fail", $ctx->cur_co_ctx->waited_by_parent, $ctx->cur_co_ctx)[m
[31m-    //print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_echo) {[m
[31m-    println("ngx.print or ngx.say")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_del_all_threads) {[m
[31m-    println("del all threads")[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-M(http-lua-info) {[m
[31m-    msg = user_string($arg1)[m
[31m-    printf("lua info: %s\n", msg)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-thread-wait) {[m
[31m-    p = gen_id($arg1)[m
[31m-    c = gen_id($arg2)[m
[31m-    printf("lua thread %d waiting on %d, child coctx: %p\n", p, c, $sub_coctx)[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/equifax.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/equifax.crt[m
[1mdeleted file mode 100644[m
[1mindex f300652..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/equifax.crt[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV[m
[31m-UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy[m
[31m-dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1[m
[31m-MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx[m
[31m-dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B[m
[31m-AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f[m
[31m-BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A[m
[31m-cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC[m
[31m-AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ[m
[31m-MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm[m
[31m-aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw[m
[31m-ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj[m
[31m-IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF[m
[31m-MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y[m
[31m-7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh[m
[31m-1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/startcom.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/startcom.crt[m
[1mdeleted file mode 100644[m
[1mindex a5185ca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/startcom.crt[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW[m
[31m-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg[m
[31m-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh[m
[31m-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9[m
[31m-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi[m
[31m-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh[m
[31m-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA[m
[31m-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk[m
[31m-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf[m
[31m-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C[m
[31m-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT[m
[31m-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi[m
[31m-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM[m
[31m-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w[m
[31m-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+[m
[31m-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3[m
[31m-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B[m
[31m-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID[m
[31m-AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD[m
[31m-VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul[m
[31m-F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC[m
[31m-ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w[m
[31m-ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk[m
[31m-aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0[m
[31m-YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg[m
[31m-c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0[m
[31m-aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93[m
[31m-d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG[m
[31m-CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1[m
[31m-dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF[m
[31m-wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS[m
[31m-Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst[m
[31m-0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc[m
[31m-pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl[m
[31m-CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF[m
[31m-P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK[m
[31m-1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm[m
[31m-KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE[m
[31m-JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ[m
[31m-8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm[m
[31m-fyWl8kgAwKQB2j8=[m
[31m------END CERTIFICATE-----[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW[m
[31m-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg[m
[31m-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh[m
[31m-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9[m
[31m-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi[m
[31m-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh[m
[31m-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA[m
[31m-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk[m
[31m-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf[m
[31m-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C[m
[31m-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT[m
[31m-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi[m
[31m-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM[m
[31m-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w[m
[31m-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+[m
[31m-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3[m
[31m-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B[m
[31m-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID[m
[31m-AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE[m
[31m-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j[m
[31m-ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js[m
[31m-LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM[m
[31m-BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0[m
[31m-Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy[m
[31m-dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh[m
[31m-cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh[m
[31m-YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg[m
[31m-dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp[m
[31m-bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ[m
[31m-YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT[m
[31m-TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ[m
[31m-9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8[m
[31m-jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW[m
[31m-FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz[m
[31m-ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1[m
[31m-ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L[m
[31m-EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu[m
[31m-L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq[m
[31m-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC[m
[31m-O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V[m
[31m-um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh[m
[31m-NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.crl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.crl[m
[1mdeleted file mode 100644[m
[1mindex 098fd54..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.crl[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m------BEGIN X509 CRL-----[m
[31m-MIIBjzCB+QIBATANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMCVVMxEzARBgNV[m
[31m-BAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoM[m
[31m-CU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQDDAh0ZXN0LmNv[m
[31m-bTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20XDTE0MDcyMTIxNDEy[m
[31m-MloXDTE0MDgyMDIxNDEyMlowHDAaAgkApQ5tVpK3luIXDTE0MDcyMTIxNDEwMlqg[m
[31m-DzANMAsGA1UdFAQEAgIQATANBgkqhkiG9w0BAQUFAAOBgQBDZ6UY0Qg7qDoLrXXl[m
[31m-gJElFilZ7LiKPqjE3+Rfx7XkgdbPxjGCr77TfMm+smdvawk7WHv1AOvRH7kGrgGT[m
[31m-kGJZwqJ4vKa/NpEWJIMAZ1Gq9BIH/Ig6ffmPk+S9ozcVHKJDW7x4nMuotyj1hILN[m
[31m-EePv78DZCYMZgf8WwMElNgz6Hw==[m
[31m------END X509 CRL-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.crt[m
[1mdeleted file mode 100644[m
[1mindex a69a011..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.crt[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICqTCCAhICCQClDm1WkreW4jANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQD[m
[31m-DAh0ZXN0LmNvbTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20wIBcN[m
[31m-MTQwNzIxMDMyMzQ3WhgPMjE1MTA2MTMwMzIzNDdaMIGXMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MRIwEAYDVQQLDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl[m
[31m-c3QuY29tMSAwHgYJKoZIhvcNAQkBFhFhZ2VudHpoQGdtYWlsLmNvbTCBnzANBgkq[m
[31m-hkiG9w0BAQEFAAOBjQAwgYkCgYEA6P18zUvtmaKQK2xePy8ZbFwSyTLw+jW6t9eZ[m
[31m-aiTec8X3ibN9WemrxHzkTRikxP3cAQoITRuZiQvF4Q7DO6wMkz/b0zwfgX5uedGq[m
[31m-047AJP6n/mwlDOjGSNomBLoXQzo7tVe60ikEm3ZyDUqnJPJMt3hImO5XSop4MPMu[m
[31m-Za9WhFcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQA4OBb9bOyWB1//93nSXX1mdENZ[m
[31m-IQeyTK0Dd6My76lnZxnZ4hTWrvvd0b17KLDU6JnS2N5ee3ATVkojPidRLWLIhnh5[m
[31m-0eXrcKalbO2Ce6nShoFvQCQKXN2Txmq2vO/Mud2bHAWwJALg+qi1Iih/gVYB9sct[m
[31m-FLg8zFOzRlYiU+6Mmw==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.key b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.key[m
[1mdeleted file mode 100644[m
[1mindex 6c13527..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXgIBAAKBgQDo/XzNS+2ZopArbF4/LxlsXBLJMvD6Nbq315lqJN5zxfeJs31Z[m
[31m-6avEfORNGKTE/dwBCghNG5mJC8XhDsM7rAyTP9vTPB+Bfm550arTjsAk/qf+bCUM[m
[31m-6MZI2iYEuhdDOju1V7rSKQSbdnINSqck8ky3eEiY7ldKingw8y5lr1aEVwIDAQAB[m
[31m-AoGBANgB66sKMga2SKN5nQdHS3LDCkevCutu1OWM5ZcbB4Kej5kC57xsf+tzPtab[m
[31m-emeIVGhCPOAALqB4YcT+QtMX967oM1MjcFbtH7si5oq6UYyp3i0G9Si6jIoVHz3+[m
[31m-8yOUaqwKbK+bRX8VS0YsHZmBsPK5ryN50iUwsU08nemoA94BAkEA9GS9Q5OPeFkM[m
[31m-tFxsIQ1f2FSsZAuN/1cpZgJqY+YaAN7MSPGTWyfd7nWG/Zgk3GO9/2ihh4gww+7B[m
[31m-To09GkmW4QJBAPQOHC2V+t2TA98+6Lj6+TYwcGEkhOENfVpH25mQ+kXgF/1Bd6rA[m
[31m-nosT1bdAY+SnmWXbSw6Kv5C20Em+bEX8WjcCQCSRRjhsRdVODbaW9Z7kb2jhEoJN[m
[31m-sEt6cTlQNzcHYPCsZYisjM3g4zYg47fiIfHQAsfKkhDDcfh/KvFj9LaQOEECQQCH[m
[31m-eBWYEDpSJ7rsfqT7mQQgWj7nDThdG/nK1TxGP71McBmg0Gg2dfkLRhVJRQqt74Is[m
[31m-kc9V4Rp4n6F6baL4Lh19AkEA6pZZer0kg3Kv9hjhaITIKUYdfIp9vYnDRWbQlBmR[m
[31m-atV8V9u9q2ETZvqfHpN+9Lu6NYR4yXIEIRf1bnIZ/mr9eQ==[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test2.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test2.crt[m
[1mdeleted file mode 100644[m
[1mindex edc3b0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test2.crt[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIChzCCAfACCQDjCkJpJUtZmjANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZI[m
[31m-hvcNAQkBFhNvcGVucmVzdHlAZ21haWwuY29tMCAXDTE0MDkxMzAwMTgxMFoYDzIx[m
[31m-MTQwODIwMDAxODEwWjCBhjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3Ju[m
[31m-aWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCU9wZW5SZXN0eTES[m
[31m-MBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZIhvcNAQkBFhNvcGVucmVzdHlAZ21h[m
[31m-aWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDy+OVI2u5NBOeB2Cyz[m
[31m-Gnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7f[m
[31m-JrKFziJxMy4g4Kdn9G659vE7CWu/UAVjRUtc+mTBAEfjdbumizmHLG7DmnNhGl3R[m
[31m-NGiVNLsUInSMGfUlJRzZJXhI4QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAEMmRvyN[m
[31m-N7uE24Tc6TR19JadNHK8g3YGktRoXWiqd/y0HY4NRPgvnK/nX7CY/wXa1j+uDO8K[m
[31m-e6/Ldm5RZrjtvfHJmTSAu8zkqTJz8bqRDH7kzL5Ni2Ky2x8r9dtB0ImpOiSlwvZN[m
[31m-snMvbrxEdwBiqlC9prV2f9aG+ACo1KnPL0j6[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test2.key b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test2.key[m
[1mdeleted file mode 100644[m
[1mindex 82ce6ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test2.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXAIBAAKBgQDy+OVI2u5NBOeB2CyzGnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4[m
[31m-PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7fJrKFziJxMy4g4Kdn9G659vE7CWu/UAVj[m
[31m-RUtc+mTBAEfjdbumizmHLG7DmnNhGl3RNGiVNLsUInSMGfUlJRzZJXhI4QIDAQAB[m
[31m-AoGAEqBB83PVENJvbOTFiHVfUAjGtr3R/Wnwd4jOcjHHZB3fZ9sjVoxJntxfp3s1[m
[31m-dwZir2rxlqVS6i3VAFiGiVTOGo2Vvzhw2J7f58twCECmnLb2f863AkGEYe4dAndD[m
[31m-GHGD0WI0CBMD1sT18YCj561o0Wol5deWH0gM9pr2N3HkeIECQQD6hUKFlFhrpaHP[m
[31m-WNJsl6BxgE6pB5kxLcMcpIQ7P+kHUvtyvCJl5QZJqPrpPGjRsAI5Ph92rpsp/zDp[m
[31m-/IZNWGVjAkEA+Ele31Rt+XbV32MrLKZgBDBk+Pzss5LTn9fZ5v1k/7hrMk2VVWvk[m
[31m-AD6n5QiGe/g59woANpPb1T9l956SBf0d6wJABTXOS17pc9uvANP1FGMW6CVl/Wf2[m
[31m-DKrJ+weE5IKQwyE7r4gwIvRfbBrClSU3fNzvPueG2f4JphbzmnoxBNzIxwJAYivY[m
[31m-mGNwzHehXx99/byXMHDWK+EN0n8WsBgP75Z3rekEcbJdfpYXY8Via1vwmOnwOW65[m
[31m-4NqbzHix37PSNw37GwJBALxaGNpREO2Tk+oWOvsD2QyviMVae3mXAJHc6nLVdKDM[m
[31m-q0YvDT6VdeNYYFTkAuzJacsVXOpn6AnUMFj0OBedMhc=[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test_ecdsa.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test_ecdsa.crt[m
[1mdeleted file mode 100644[m
[1mindex b3e1e9f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test_ecdsa.crt[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIBtDCCAVoCCQD0QJnL8zpA0jAKBggqhkjOPQQDAjBhMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MREwDwYDVQQDDAh0ZXN0LmNvbTAgFw0xNTA3MTcyMTUx[m
[31m-NDFaGA8yMTE1MDYyMzIxNTE0MVowYTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh[m
[31m-bGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCU9wZW5S[m
[31m-ZXN0eTERMA8GA1UEAwwIdGVzdC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC[m
[31m-AAT/OtGmlIlbtvvJ3OP0dm5lyEMCrMnpDTDjwBPnUZ2f+16LCmNsdtEJ0r0Sd4GM[m
[31m-o4Lss2JpwzPy2SLGEj3KwGKSMAoGCCqGSM49BAMCA0gAMEUCIQDbNwDkq1FiqcRD[m
[31m-XdbP1MPAc33N2IK9EDIfMgJ0nTL82wIgNZiL4xvCQe9UA0zC+JqHLnVCQHYAM9kI[m
[31m-BbvzNrt0hEM=[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test_ecdsa.key b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test_ecdsa.key[m
[1mdeleted file mode 100644[m
[1mindex 46eb72c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/cert/test_ecdsa.key[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m------BEGIN PRIVATE KEY-----[m
[31m-MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0vwBPGgv1hE6RnQo[m
[31m-3imyoceR+5dLsKegodOlBwnWtbuhRANCAAT/OtGmlIlbtvvJ3OP0dm5lyEMCrMnp[m
[31m-DTDjwBPnUZ2f+16LCmNsdtEJ0r0Sd4GMo4Lss2JpwzPy2SLGEj3KwGKS[m
[31m------END PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/data/fake-module/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/data/fake-module/config[m
[1mdeleted file mode 100644[m
[1mindex 00cc8e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/data/fake-module/config[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_fake_module[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_http_fake_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fake_module.c"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/data/fake-module/ngx_http_fake_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/data/fake-module/ngx_http_fake_module.c[m
[1mdeleted file mode 100644[m
[1mindex 42cde55..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/data/fake-module/ngx_http_fake_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-/* Copyright (C) ZHANG Heng (chiyouhen)[m
[31m- *[m
[31m- * This fake module was used to reproduce a bug in ngx_lua's[m
[31m- * init_worker_by_lua implementation.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t a;[m
[31m-} ngx_http_fake_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t a;[m
[31m-} ngx_http_fake_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_fake_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_fake_merge_srv_conf(ngx_conf_t *cf, void *prev, void *conf);[m
[31m-static void *ngx_http_fake_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_fake_merge_loc_conf(ngx_conf_t *cf, void *prev, void *conf);[m
[31m-[m
[31m-[m
[31m-/* flow identify module configure struct */[m
[31m-static ngx_http_module_t  ngx_http_fake_module_ctx = {[m
[31m-    NULL,                           /* preconfiguration */[m
[31m-    NULL,                           /* postconfiguration */[m
[31m-[m
[31m-    NULL,                           /* create main configuration */[m
[31m-    NULL,                           /* init main configuration */[m
[31m-[m
[31m-    ngx_http_fake_create_srv_conf,  /* create server configuration */[m
[31m-    ngx_http_fake_merge_srv_conf,   /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_fake_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_http_fake_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-/* flow identify module struct */[m
[31m-ngx_module_t  ngx_http_fake_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_fake_module_ctx,      /* module context */[m
[31m-    NULL,                           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                /* module type */[m
[31m-    NULL,                           /* init master */[m
[31m-    NULL,                           /* init module */[m
[31m-    NULL,                           /* init process */[m
[31m-    NULL,                           /* init thread */[m
[31m-    NULL,                           /* exit thread */[m
[31m-    NULL,                           /* exit process */[m
[31m-    NULL,                           /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* create server configure */[m
[31m-static void *ngx_http_fake_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_fake_srv_conf_t   *fscf;[m
[31m-[m
[31m-    fscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fake_srv_conf_t));[m
[31m-    if (fscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return fscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* merge server configure */[m
[31m-static char *ngx_http_fake_merge_srv_conf(ngx_conf_t *cf, void *prev, void *conf)[m
[31m-{[m
[31m-    ngx_http_fake_srv_conf_t   *fscf;[m
[31m-[m
[31m-    fscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_fake_module);[m
[31m-    if (fscf == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, 0,[m
[31m-                           "get module srv conf failed in merge srv conf");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* create location configure */[m
[31m-static void *ngx_http_fake_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_fake_loc_conf_t   *flcf;[m
[31m-[m
[31m-    flcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fake_loc_conf_t));[m
[31m-    if (flcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return flcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* merge location configure */[m
[31m-static char *ngx_http_fake_merge_loc_conf(ngx_conf_t *cf, void *prev, void *conf)[m
[31m-{[m
[31m-    ngx_http_fake_loc_conf_t   *flcf;[m
[31m-[m
[31m-    flcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_fake_module);[m
[31m-    if (flcf == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, 0,[m
[31m-                           "get module loc conf failed in merge loc conf");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/CRC32.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/CRC32.lua[m
[1mdeleted file mode 100755[m
[1mindex 70f4215..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/CRC32.lua[m
[1m+++ /dev/null[m
[36m@@ -1,173 +0,0 @@[m
[31m---Copyright (c) 2007-2008 Neil Richardson (nrich@iinet.net.au)[m
[31m---[m
[31m---Permission is hereby granted, free of charge, to any person obtaining a copy [m
[31m---of this software and associated documentation files (the "Software"), to deal[m
[31m---in the Software without restriction, including without limitation the rights [m
[31m---to use, copy, modify, merge, publish, distribute, sublicense, and/or sell [m
[31m---copies of the Software, and to permit persons to whom the Software is [m
[31m---furnished to do so, subject to the following conditions:[m
[31m---[m
[31m---The above copyright notice and this permission notice shall be included in all[m
[31m---copies or substantial portions of the Software.[m
[31m---[m
[31m---THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR [m
[31m---IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, [m
[31m---FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE [m
[31m---AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER [m
[31m---LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, [m
[31m---OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS [m
[31m---IN THE SOFTWARE.[m
[31m-[m
[31m-module('CRC32', package.seeall)[m
[31m-[m
[31m-local max = 2^32 -1[m
[31m-[m
[31m-local CRC32 = {[m
[31m-    0,79764919,159529838,222504665,319059676,[m
[31m-    398814059,445009330,507990021,638119352,[m
[31m-    583659535,797628118,726387553,890018660,[m
[31m-    835552979,1015980042,944750013,1276238704,[m
[31m-    1221641927,1167319070,1095957929,1595256236,[m
[31m-    1540665371,1452775106,1381403509,1780037320,[m
[31m-    1859660671,1671105958,1733955601,2031960084,[m
[31m-    2111593891,1889500026,1952343757,2552477408,[m
[31m-    2632100695,2443283854,2506133561,2334638140,[m
[31m-    2414271883,2191915858,2254759653,3190512472,[m
[31m-    3135915759,3081330742,3009969537,2905550212,[m
[31m-    2850959411,2762807018,2691435357,3560074640,[m
[31m-    3505614887,3719321342,3648080713,3342211916,[m
[31m-    3287746299,3467911202,3396681109,4063920168,[m
[31m-    4143685023,4223187782,4286162673,3779000052,[m
[31m-    3858754371,3904687514,3967668269,881225847,[m
[31m-    809987520,1023691545,969234094,662832811,[m
[31m-    591600412,771767749,717299826,311336399,[m
[31m-    374308984,453813921,533576470,25881363,[m
[31m-    88864420,134795389,214552010,2023205639,[m
[31m-    2086057648,1897238633,1976864222,1804852699,[m
[31m-    1867694188,1645340341,1724971778,1587496639,[m
[31m-    1516133128,1461550545,1406951526,1302016099,[m
[31m-    1230646740,1142491917,1087903418,2896545431,[m
[31m-    2825181984,2770861561,2716262478,3215044683,[m
[31m-    3143675388,3055782693,3001194130,2326604591,[m
[31m-    2389456536,2200899649,2280525302,2578013683,[m
[31m-    2640855108,2418763421,2498394922,3769900519,[m
[31m-    3832873040,3912640137,3992402750,4088425275,[m
[31m-    4151408268,4197601365,4277358050,3334271071,[m
[31m-    3263032808,3476998961,3422541446,3585640067,[m
[31m-    3514407732,3694837229,3640369242,1762451694,[m
[31m-    1842216281,1619975040,1682949687,2047383090,[m
[31m-    2127137669,1938468188,2001449195,1325665622,[m
[31m-    1271206113,1183200824,1111960463,1543535498,[m
[31m-    1489069629,1434599652,1363369299,622672798,[m
[31m-    568075817,748617968,677256519,907627842,[m
[31m-    853037301,1067152940,995781531,51762726,[m
[31m-    131386257,177728840,240578815,269590778,[m
[31m-    349224269,429104020,491947555,4046411278,[m
[31m-    4126034873,4172115296,4234965207,3794477266,[m
[31m-    3874110821,3953728444,4016571915,3609705398,[m
[31m-    3555108353,3735388376,3664026991,3290680682,[m
[31m-    3236090077,3449943556,3378572211,3174993278,[m
[31m-    3120533705,3032266256,2961025959,2923101090,[m
[31m-    2868635157,2813903052,2742672763,2604032198,[m
[31m-    2683796849,2461293480,2524268063,2284983834,[m
[31m-    2364738477,2175806836,2238787779,1569362073,[m
[31m-    1498123566,1409854455,1355396672,1317987909,[m
[31m-    1246755826,1192025387,1137557660,2072149281,[m
[31m-    2135122070,1912620623,1992383480,1753615357,[m
[31m-    1816598090,1627664531,1707420964,295390185,[m
[31m-    358241886,404320391,483945776,43990325,[m
[31m-    106832002,186451547,266083308,932423249,[m
[31m-    861060070,1041341759,986742920,613929101,[m
[31m-    542559546,756411363,701822548,3316196985,[m
[31m-    3244833742,3425377559,3370778784,3601682597,[m
[31m-    3530312978,3744426955,3689838204,3819031489,[m
[31m-    3881883254,3928223919,4007849240,4037393693,[m
[31m-    4100235434,4180117107,4259748804,2310601993,[m
[31m-    2373574846,2151335527,2231098320,2596047829,[m
[31m-    2659030626,2470359227,2550115596,2947551409,[m
[31m-    2876312838,2788305887,2733848168,3165939309,[m
[31m-    3094707162,3040238851,2985771188,[m
[31m-}[m
[31m-[m
[31m-local function xor(a, b)[m
[31m-    local calc = 0    [m
[31m-[m
[31m-    for i = 32, 0, -1 do[m
[31m-	local val = 2 ^ i[m
[31m-	local aa = false[m
[31m-	local bb = false[m
[31m-[m
[31m-	if a == 0 then[m
[31m-	    calc = calc + b[m
[31m-	    break[m
[31m-	end[m
[31m-[m
[31m-	if b == 0 then[m
[31m-	    calc = calc + a[m
[31m-	    break[m
[31m-	end[m
[31m-[m
[31m-	if a >= val then[m
[31m-	    aa = true[m
[31m-	    a = a - val[m
[31m-	end[m
[31m-[m
[31m-	if b >= val then[m
[31m-	    bb = true[m
[31m-	    b = b - val[m
[31m-	end[m
[31m-[m
[31m-	if not (aa and bb) and (aa or bb) then[m
[31m-	    calc = calc + val[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    return calc[m
[31m-end[m
[31m-[m
[31m-local function lshift(num, left)[m
[31m-    local res = num * (2 ^ left)[m
[31m-    return res % (2 ^ 32)[m
[31m-end[m
[31m-[m
[31m-local function rshift(num, right)[m
[31m-    local res = num / (2 ^ right)[m
[31m-    return math.floor(res)[m
[31m-end[m
[31m-[m
[31m-function Hash(str)[m
[31m-    local count = string.len(tostring(str))[m
[31m-    local crc = max[m
[31m-    [m
[31m-    local i = 1[m
[31m-    while count > 0 do[m
[31m-	local byte = string.byte(str, i)[m
[31m-[m
[31m-	crc = xor(lshift(crc, 8), CRC32[xor(rshift(crc, 24), byte) + 1])[m
[31m-[m
[31m-	i = i + 1[m
[31m-	count = count - 1[m
[31m-    end[m
[31m-[m
[31m-    return crc[m
[31m-end[m
[31m-[m
[31m-[m
[31m---[m
[31m--- CRC32.lua[m
[31m---[m
[31m--- A pure Lua implementation of a CRC32 hashing algorithm. Slower than using a C implemtation,[m
[31m--- but useful having no other dependancies.[m
[31m---[m
[31m---[m
[31m--- Synopsis[m
[31m---[m
[31m--- require('CRC32')[m
[31m---[m
[31m--- crchash = CRC32.Hash('a string')[m
[31m---[m
[31m--- Methods:[m
[31m---[m
[31m--- hashval = CRC32.Hash(val)[m
[31m---    Calculates and returns (as an integer) the CRC32 hash of the parameter 'val'. [m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/Memcached.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/Memcached.lua[m
[1mdeleted file mode 100755[m
[1mindex e3288ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/Memcached.lua[m
[1m+++ /dev/null[m
[36m@@ -1,567 +0,0 @@[m
[31m---Copyright (c) 2006-2008 Neil Richardson (nrich@iinet.net.au)[m
[31m---[m
[31m---Permission is hereby granted, free of charge, to any person obtaining a copy [m
[31m---of this software and associated documentation files (the "Software"), to deal[m
[31m---in the Software without restriction, including without limitation the rights [m
[31m---to use, copy, modify, merge, publish, distribute, sublicense, and/or sell [m
[31m---copies of the Software, and to permit persons to whom the Software is [m
[31m---furnished to do so, subject to the following conditions:[m
[31m---[m
[31m---The above copyright notice and this permission notice shall be included in all[m
[31m---copies or substantial portions of the Software.[m
[31m---[m
[31m---THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR [m
[31m---IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, [m
[31m---FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE [m
[31m---AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER [m
[31m---LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, [m
[31m---OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS [m
[31m---IN THE SOFTWARE.[m
[31m-[m
[31m-module('Memcached', package.seeall)[m
[31m-[m
[31m-require('socket')[m
[31m-require('CRC32')[m
[31m-[m
[31m-local SERVER_RETRIES = 10[m
[31m-[m
[31m-local STATS_KEYS = {[m
[31m-    malloc = true,[m
[31m-    sizes = true,[m
[31m-    slabs = true,[m
[31m-    items = true,[m
[31m-}[m
[31m-[m
[31m-local FLAGS = {[m
[31m-    'STORABLE',[m
[31m-    'COMPRESSED',[m
[31m-    'SERIALISED',[m
[31m-}[m
[31m-[m
[31m-local function warn(str)[m
[31m-    io.stderr:write(string.format('Warning: %s\n', tostring(str)))[m
[31m-end[m
[31m-[m
[31m-local function _select_server(cache, key)[m
[31m-    local server_count = #cache.servers[m
[31m-[m
[31m-    local hashfunc = cache.hash or CRC32.Hash[m
[31m-[m
[31m-    if server_count == 1 then[m
[31m-	return cache.servers[1].socket[m
[31m-    else[m
[31m-	local serverhash = hashfunc(key)[m
[31m-[m
[31m-	for i = 0, SERVER_RETRIES do[m
[31m-	    local index = (serverhash % server_count) + 1[m
[31m-	    local server = cache.servers[index].socket[m
[31m-[m
[31m-	    if not server then[m
[31m-		serverhash = hashfunc(serverhash .. i)[m
[31m-	    else[m
[31m-		return server[m
[31m-	    end[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    error('No servers found')[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-local function _retrieve(cache, key, str)[m
[31m-    local server = _select_server(cache, key)[m
[31m-[m
[31m-    server:send(str .. '\r\n')[m
[31m-[m
[31m-    local function toboolean(value)[m
[31m-	if type(value) == 'string' then[m
[31m-	    if value == 'true' then[m
[31m-		return true[m
[31m-	    elseif value == 'false' then[m
[31m-		return false [m
[31m-	    end[m
[31m-	end[m
[31m-[m
[31m-	return nil[m
[31m-    end[m
[31m-[m
[31m-    local function extract_flags(str)[m
[31m-	local num = tonumber(str)[m
[31m-	local flags = {}[m
[31m-[m
[31m-	for i = table.maxn(FLAGS), 1, -1 do[m
[31m-	    local bf = 2 ^ (i - 1)[m
[31m-[m
[31m-	    if num >= bf then[m
[31m-		flags[FLAGS[i]] = true[m
[31m-		num = num - bf[m
[31m-	    end[m
[31m-	end[m
[31m-[m
[31m-	return flags[m
[31m-    end[m
[31m-[m
[31m-    local returndata = {}[m
[31m-    while true do[m
[31m-	local line, err = server:receive()[m
[31m-[m
[31m-	if line == 'END' then[m
[31m-	    break[m
[31m-	elseif string.sub(line, 1, 5) == 'VALUE' then[m
[31m-	    local key,flagstr,size,cas = string.match(line, 'VALUE (%S+) (%d+) (%d+)')[m
[31m-	    flags = extract_flags(flagstr)[m
[31m-[m
[31m-	    local data = server:receive(size)[m
[31m-[m
[31m-	    if flags.COMPRESSED and cache.compress_enabled then[m
[31m-		data = cache.decompress(data)[m
[31m-	    end[m
[31m-[m
[31m-            if flags.SERIALISED then[m
[31m-                returndata[key] = cache.decode(data)[m
[31m-            else[m
[31m-                local ldata = tonumber(data) or toboolean(data) [m
[31m-[m
[31m-                if ldata == nil then[m
[31m-                    if data == 'nil' then[m
[31m-                        returndata[key] = nil[m
[31m-                    else[m
[31m-                        returndata[key] = data[m
[31m-                    end[m
[31m-                else[m
[31m-                    returndata[key] = ldata[m
[31m-                end[m
[31m-            end[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    return returndata[m
[31m-end[m
[31m-[m
[31m-local function _send(cache, key, str)[m
[31m-    local server = _select_server(cache, key)[m
[31m-[m
[31m-    server:send(str .. "\r\n")[m
[31m-    local line, err = server:receive()[m
[31m-    [m
[31m-    if not err then return line end[m
[31m-end[m
[31m-[m
[31m-local function _store(cache, op, key, value, expiry)[m
[31m-    local str[m
[31m-    local flags = 0[m
[31m-[m
[31m-    if type(value) == 'table' then[m
[31m-	str = cache.encode(value)    [m
[31m-	-- TODO lookup rather than hard code [m
[31m-        flags = flags + 4[m
[31m-    else[m
[31m-	str = tostring(value)[m
[31m-    end[m
[31m-[m
[31m-    if cache.compress_enabled and string.len(str) > cache.compress_threshold then[m
[31m-	local cstr = cache.compress(str)[m
[31m-[m
[31m-	if string.len(cstr) < (string.len(str) * 0.8) then[m
[31m-	    str = cstr[m
[31m-[m
[31m-	    -- TODO lookup rather than hard code [m
[31m-	    flags = flags + 2[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    local len = string.len(str)[m
[31m-[m
[31m-    expiry = expiry or 0[m
[31m-[m
[31m-    local cmd = op .. ' ' .. key .. ' ' .. flags .. ' ' .. expiry .. ' ' .. len .. '\r\n' .. str[m
[31m-[m
[31m-    local res = _send(cache, key, cmd)[m
[31m-[m
[31m-    if res ~= 'STORED' then[m
[31m-	return false, res[m
[31m-    end[m
[31m-[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local function set(cache, key, value, expiry)[m
[31m-    return _store(cache, 'set', key, value, expiry)[m
[31m-end[m
[31m-[m
[31m-local function add(cache, key, value, expiry)[m
[31m-    return _store(cache, 'add', key, value, expiry)[m
[31m-end[m
[31m-[m
[31m-local function replace(cache, key, value, expiry)[m
[31m-    return _store(cache, 'replace', key, value, expiry)[m
[31m-end[m
[31m-[m
[31m-local function get(cache, key)[m
[31m-    local dataset = _retrieve(cache, key, 'get ' .. key)[m
[31m-    return dataset[key][m
[31m-end[m
[31m-[m
[31m-local function delete(cache, key)[m
[31m-    local res = _send(cache, key, 'delete ' .. key)[m
[31m-[m
[31m-    if res == 'NOT_FOUND' then[m
[31m-	return false[m
[31m-    end[m
[31m-[m
[31m-    if res ~= 'DELETED' then[m
[31m-	return false, res[m
[31m-    end[m
[31m-[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local function incr(cache, key, val)[m
[31m-    val = val or 1[m
[31m-	[m
[31m-    local res = _send(cache, key, 'incr ' .. key .. ' ' .. val)[m
[31m-[m
[31m-    if res == 'ERROR' or res == 'CLIENT_ERROR' then[m
[31m-        return false, res[m
[31m-    end[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-local function decr(cache, key, val)[m
[31m-    val = val or 1[m
[31m-[m
[31m-    local res = _send(cache, key, 'decr ' .. key .. ' ' .. val)[m
[31m-[m
[31m-    if res == 'ERROR' or res == 'CLIENT_ERROR' then[m
[31m-        return false, res[m
[31m-    end[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-local function stats(cache, key)[m
[31m-    local servers = {}[m
[31m-[m
[31m-    key = key or ''[m
[31m-[m
[31m-    if string.len(key) > 0 and not STATS_KEYS[key] then[m
[31m-	error(string.format("Unknown stats key '%s'", key))[m
[31m-    end[m
[31m-[m
[31m-    for i,server in pairs(cache.servers) do[m
[31m-	server.socket:send('stats ' .. key .. '\r\n')[m
[31m-[m
[31m-	local stats = {}[m
[31m-[m
[31m-	while true do[m
[31m-	    local line, err = server.socket:receive()[m
[31m-[m
[31m-	    if line == 'END' or line == 'ERROR' then[m
[31m-		break[m
[31m-	    end[m
[31m-[m
[31m-	    local k,v = string.match(line, 'STAT (%S+) (%S+)')[m
[31m-[m
[31m-	    if k then[m
[31m-		stats[k] = v[m
[31m-	    end[m
[31m-	end[m
[31m-[m
[31m-	servers[server.name] = stats[m
[31m-    end[m
[31m-[m
[31m-    return servers[m
[31m-end [m
[31m-[m
[31m-local function get_multi(cache, ...)[m
[31m-    local dataset = nil[m
[31m-[m
[31m-    if table.maxn(cache.servers) > 1 then[m
[31m-	dataset = {}[m
[31m-[m
[31m-	for i,k in ipairs(arg) do[m
[31m-	    local data = _retrieve(cache, k, 'get ' .. k)[m
[31m-	    dataset[k] = data[k][m
[31m-	end[m
[31m-    else[m
[31m-	local keys = table.concat(arg, ' ')[m
[31m-	dataset = _retrieve(cache, keys, 'get ' .. keys)[m
[31m-    end[m
[31m-[m
[31m-    return dataset[m
[31m-end[m
[31m-[m
[31m-local function flush_all(cache)[m
[31m-    local success = true[m
[31m-[m
[31m-    for i,server in ipairs(cache.servers) do[m
[31m-	server.socket:send('flush_all\r\n')[m
[31m-	local res = assert(server.socket:receive())[m
[31m-[m
[31m-	if res ~= 'OK' then[m
[31m-	    success = false[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    return success[m
[31m-end[m
[31m-[m
[31m-local function disconnect_all(cache)[m
[31m-    while true do[m
[31m-	local server = table.remove(cache.servers)[m
[31m-[m
[31m-	if not server then[m
[31m-	    break[m
[31m-	end[m
[31m-[m
[31m-	server.socket:close()[m
[31m-    end    [m
[31m-end[m
[31m-[m
[31m-local function set_hash(cache, hashfunc)[m
[31m-    cache.hash = hashfunc[m
[31m-end[m
[31m-[m
[31m-local function set_encode(cache, func)[m
[31m-    cache.encode = func[m
[31m-end[m
[31m-[m
[31m-local function set_decode(cache, func)[m
[31m-    cache.decode = func[m
[31m-end[m
[31m-[m
[31m-local function set_compress(cache, func)[m
[31m-    cache.compress = func[m
[31m-end[m
[31m-[m
[31m-local function set_decompress(cache, func)[m
[31m-    cache.decompress = func[m
[31m-end[m
[31m-[m
[31m-function Connect(hostlist, port)[m
[31m-    local servers = {}[m
[31m-[m
[31m-    if type(hostlist) == 'table' then[m
[31m-	for i,host in pairs(hostlist) do[m
[31m-	    local h, p[m
[31m-[m
[31m-	    if type(host) == 'table' then[m
[31m-		h = host[1][m
[31m-		p = host[2][m
[31m-	    elseif type(host) == 'string' then[m
[31m-		h = host[m
[31m-	    elseif type(host) == 'number' then[m
[31m-		p = host[m
[31m-		h = nil[m
[31m-	    end[m
[31m-[m
[31m-	    if not h then[m
[31m-		h = '127.0.0.1'[m
[31m-	    end[m
[31m-[m
[31m-	    if not p then [m
[31m-		p = 11211[m
[31m-	    end[m
[31m-[m
[31m-	    local server = socket.connect(h, p)[m
[31m-[m
[31m-	    if not server then[m
[31m-		warn('Could not connect to ' .. h .. ':' .. p)[m
[31m-	    else[m
[31m-		table.insert(servers, {socket = server, name = string.format('%s:%d', h, p)})[m
[31m-	    end[m
[31m-	end[m
[31m-    else[m
[31m-	local address = hostlist[m
[31m-[m
[31m-	if type(address) == 'number' then[m
[31m-	    port = address[m
[31m-	    address = nil[m
[31m-	end[m
[31m-[m
[31m-	if address == nil then[m
[31m-	    address = '127.0.0.1'[m
[31m-	end[m
[31m-[m
[31m-	if port == nil then[m
[31m-	    port = 11211[m
[31m-	end[m
[31m-[m
[31m-	local server = socket.connect(address, port)[m
[31m-[m
[31m-	if not server then[m
[31m-	    warn('Could not connect to ' .. address .. ':' .. port)[m
[31m-	else[m
[31m-	    servers = {{socket = server, name = string.format('%s:%d', address, port)}}[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    if table.maxn(servers) < 1 then[m
[31m-	error('No servers available')[m
[31m-    end[m
[31m-[m
[31m-    local cache = {[m
[31m-	servers = servers,[m
[31m-[m
[31m-	set_hash = set_hash,[m
[31m-	set_encode = set_encode,[m
[31m-	set_decode = set_decode,[m
[31m-	set_decompress = set_decompress,[m
[31m-	set_compress = set_compress,[m
[31m-[m
[31m-	compress_enabled = false,[m
[31m-	enable_compression = function(self, on)[m
[31m-	    self.compress_enabled = on[m
[31m-	end,[m
[31m-[m
[31m-	hash = nil,[m
[31m-	encode = function()[m
[31m-	    error('No encode function set')[m
[31m-	end,[m
[31m-[m
[31m-	decode = function()[m
[31m-	    error('No decode function set')[m
[31m-	end,[m
[31m-[m
[31m-	compress = function()[m
[31m-	    error('No compress function set')[m
[31m-	end,[m
[31m-[m
[31m-	decompress = function()[m
[31m-	    error('No decompress function set')[m
[31m-	end,[m
[31m-[m
[31m-	-- 10K default[m
[31m-	compress_threshold = 10240,[m
[31m-	set_compress_threshold = function(self, threshold)[m
[31m-	    if threshold == nil then[m
[31m-		self:enable_compression(false)[m
[31m-	    else[m
[31m-		self.compress_threshold = threshold[m
[31m-	    end[m
[31m-	end,[m
[31m-[m
[31m-	set = set,[m
[31m-	add = add,[m
[31m-	replace = replace,[m
[31m-	get = get,[m
[31m-	delete = delete,[m
[31m-	incr = incr,[m
[31m-	decr = decr,[m
[31m-[m
[31m-	get_multi = get_multi,[m
[31m-	stats = stats,[m
[31m-	flush_all = flush_all,[m
[31m-	disconnect_all = disconnect_all,[m
[31m-    }[m
[31m-[m
[31m-    return cache[m
[31m-end[m
[31m-[m
[31m-function New(hostlist, port)[m
[31m-    return Connect(hostlist, port)[m
[31m-end[m
[31m-[m
[31m--- [m
[31m--- Memcached.lua[m
[31m--- [m
[31m--- A pure Lua implementation of a simple memcached client. 1 or more memcached server(s) are currently supported. Requires the luasocket library.[m
[31m--- See http://www.danga.com/memcached/ for more information about memcached.[m
[31m---[m
[31m---[m
[31m---[m
[31m--- Synopsis[m
[31m---[m
[31m--- require('Memcached')[m
[31m---[m
[31m--- memcache = Memcached.Connect('some.host.com', 11000)[m
[31m---    OR[m
[31m--- memcache = Memcached.New('some.host.com', 11000)[m
[31m---[m
[31m--- memcache:set('some_key', 1234)[m
[31m--- memcache:add('new_key', 'add new value')[m
[31m--- memcache:replace('existing_key', 'replace old value')[m
[31m---[m
[31m--- cached_data = memcache:get('some_key')[m
[31m---[m
[31m--- memcache:delete('old_key')[m
[31m---[m
[31m---[m
[31m---[m
[31m--- Methods:[m
[31m---[m
[31m--- memcache = Memcached.Connect()[m
[31m---    Connect to memcached server at localhost on port number 11211. [m
[31m---[m
[31m--- memcache = Memcached.Connect(host[, port])[m
[31m---    Connect to memcached server at 'host' on port number 'port'. If port is not provided, port 11211 is used.  [m
[31m---[m
[31m----memcache = Memcached.Connect(port)[m
[31m---    Connect to memcached server at localhost on port number 'port'.[m
[31m---[m
[31m--- memcache = Memcached.Connect({{'host', port}, 'host', port})  [m
[31m---    Connect to multiple memcached servers.[m
[31m---[m
[31m--- memcache:set(key, value[, expiry])[m
[31m---    Unconditionally sets a key to a given value in the memcache. The value for 'expiry' is the expiration[m
[31m---    time (default is 0, never expire).[m
[31m---     [m
[31m--- memcache:add(key, value[, expiry])[m
[31m---    Like set, but only stores in memcache if the key doesn't already exist.[m
[31m---    [m
[31m--- memcache:replace(key, value[, expiry])[m
[31m---    Like set, but only stores in memcache if the key already exists. The opposite of add.[m
[31m---    [m
[31m--- value = memcache:get(key)[m
[31m---    Retrieves a key from the memcache. Returns the value or nil[m
[31m---    [m
[31m--- values = memcache:get_multi(...)[m
[31m---    Retrieves multiple keys from the memcache doing just one query.  Returns a table of key/value pairs that were available.[m
[31m---    [m
[31m--- memcache:delete(key)[m
[31m---    Deletes a key. Returns true on deletion, false if the key was not found.[m
[31m---    [m
[31m--- value = memcache:incr(key[, value])[m
[31m---    Sends a command to the server to atomically increment the value for key by value, or by 1 if value is nil. [m
[31m---    Returns nil if key doesn't exist on server, otherwise it returns the new value after incrementing. Value should be zero or greater.[m
[31m---    [m
[31m--- value = memcache:decr(key[, value])[m
[31m---    Like incr, but decrements. Unlike incr, underflow is checked and new values are capped at 0. If server value is 1, a decrement of 2 returns 0, not -1.[m
[31m---[m
[31m--- servers = memcache:stats([key])[m
[31m---    Returns a table of statistical data regarding the memcache server(s). Allowed keys are:[m
[31m---	'', 'malloc', 'sizes', 'slabs', 'items'[m
[31m---[m
[31m---  success = memcache:flush_all()[m
[31m---     Runs the memcached "flush_all" command on all configured hosts, emptying all their caches. [m
[31m---[m
[31m---  memcache:disconnect_all()[m
[31m---     Closes all cached sockets to all memcached servers.[m
[31m---[m
[31m---  memcache:set_hash(hashfunc)[m
[31m---     Sets a custom hash function for key values. The default is a CRC32 hashing function.[m
[31m---     'hashfunc' should be defined receiving a single string parameter and returing a single integer value.[m
[31m---[m
[31m---  memcache:set_encode(func)[m
[31m---     Sets a custom encode function for serialising table values. 'func' should be defined receiving a single[m
[31m---     table value and returning a single string value.[m
[31m---[m
[31m---  memcache:set_decode(func)[m
[31m---     Sets a custom decode function for deserialising table values. 'func' should be defined receiving a [m
[31m---     single single and returning a single table value[m
[31m---[m
[31m---  memcache:enable_compression(onflag)[m
[31m---     Turns data compression support on or off.[m
[31m---[m
[31m---  memcache:set_compress_threshold(size)[m
[31m---     Set the compression threshold. If the value to be stored is larger than `size' bytes (and compression [m
[31m---     is enabled), compress before storing.[m
[31m---[m
[31m---  memcache:set_compress(func)[m
[31m---     Sets a custom data compression function. 'func' should be defined receiving a single string value and[m
[31m---     returning a single string value.[m
[31m---[m
[31m---  memcache:set_decompress(func)[m
[31m---     Sets a custom data decompression function. 'func' should be defined receiving a single string value and[m
[31m---     returning a single string value.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/Redis.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/Redis.lua[m
[1mdeleted file mode 100644[m
[1mindex 8bc2804..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/Redis.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1120 +0,0 @@[m
[31m---[[[m
[31m-Copyright (c) 2009-2011 Daniele Alessandri[m
[31m- [m
[31m-Permission is hereby granted, free of charge, to any person obtaining[m
[31m-a copy of this software and associated documentation files (the[m
[31m-"Software"), to deal in the Software without restriction, including[m
[31m-without limitation the rights to use, copy, modify, merge, publish,[m
[31m-distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-permit persons to whom the Software is furnished to do so, subject to[m
[31m-the following conditions:[m
[31m- [m
[31m-The above copyright notice and this permission notice shall be[m
[31m-included in all copies or substantial portions of the Software.[m
[31m- [m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND[m
[31m-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE[m
[31m-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION[m
[31m-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION[m
[31m-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-]][m
[31m-[m
[31m-module('Redis', package.seeall)[m
[31m-[m
[31m-local commands, network, request, response = {}, {}, {}, {}[m
[31m-[m
[31m-local defaults = {[m
[31m-    host        = '127.0.0.1',[m
[31m-    port        = 6379,[m
[31m-    tcp_nodelay = true,[m
[31m-    path        = nil[m
[31m-}[m
[31m-[m
[31m-local protocol = {[m
[31m-    newline = '\r\n',[m
[31m-    ok      = 'OK',[m
[31m-    err     = 'ERR',[m
[31m-    queued  = 'QUEUED',[m
[31m-    null    = 'nil'[m
[31m-}[m
[31m-[m
[31m-local lua_error = error[m
[31m-local function default_error_fn(message, level)[m
[31m-    lua_error(message, (level or 1) + 1)[m
[31m-end[m
[31m-[m
[31m-local function merge_defaults(parameters)[m
[31m-    if parameters == nil then[m
[31m-        parameters = {}[m
[31m-    end[m
[31m-    for k, v in pairs(defaults) do[m
[31m-        if parameters[k] == nil then[m
[31m-            parameters[k] = defaults[k][m
[31m-        end[m
[31m-    end[m
[31m-    return parameters[m
[31m-end[m
[31m-[m
[31m-local function parse_boolean(v)[m
[31m-    if v == '1' or v == 'true' or v == 'TRUE' then[m
[31m-        return true[m
[31m-    elseif v == '0' or v == 'false' or v == 'FALSE' then[m
[31m-        return false[m
[31m-    else[m
[31m-        return nil[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function toboolean(value) return value == 1 end[m
[31m-[m
[31m-local function fire_and_forget(client, command)[m
[31m-    -- let's fire and forget! the connection is closed as soon[m
[31m-    -- as the SHUTDOWN command is received by the server.[m
[31m-    client.network.write(client, command .. protocol.newline)[m
[31m-    return false[m
[31m-end[m
[31m-[m
[31m-local function zset_range_request(client, command, ...)[m
[31m-    local args, opts = {...}, { }[m
[31m-[m
[31m-    if #args >= 1 and type(args[#args]) == 'table' then[m
[31m-        local options = table.remove(args, #args)[m
[31m-        if options.withscores then[m
[31m-            table.insert(opts, 'WITHSCORES')[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    for _, v in pairs(opts) do table.insert(args, v) end[m
[31m-    request.multibulk(client, command, args)[m
[31m-end[m
[31m-[m
[31m-local function zset_range_byscore_request(client, command, ...)[m
[31m-    local args, opts = {...}, { }[m
[31m-[m
[31m-    if #args >= 1 and type(args[#args]) == 'table' then[m
[31m-        local options = table.remove(args, #args)[m
[31m-        if options.limit then[m
[31m-            table.insert(opts, 'LIMIT')[m
[31m-            table.insert(opts, options.limit.offset or options.limit[1])[m
[31m-            table.insert(opts, options.limit.count or options.limit[2])[m
[31m-        end[m
[31m-        if options.withscores then[m
[31m-            table.insert(opts, 'WITHSCORES')[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    for _, v in pairs(opts) do table.insert(args, v) end[m
[31m-    request.multibulk(client, command, args)[m
[31m-end[m
[31m-[m
[31m-local function zset_range_reply(reply, command, ...)[m
[31m-    local args = {...}[m
[31m-    local opts = args[4][m
[31m-    if opts and (opts.withscores or string.lower(tostring(opts)) == 'withscores') then[m
[31m-        local new_reply = { }[m
[31m-        for i = 1, #reply, 2 do[m
[31m-            table.insert(new_reply, { reply[i], reply[i + 1] })[m
[31m-        end[m
[31m-        return new_reply[m
[31m-    else[m
[31m-        return reply[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function zset_store_request(client, command, ...)[m
[31m-    local args, opts = {...}, { }[m
[31m-[m
[31m-    if #args >= 1 and type(args[#args]) == 'table' then[m
[31m-        local options = table.remove(args, #args)[m
[31m-        if options.weights and type(options.weights) == 'table' then[m
[31m-            table.insert(opts, 'WEIGHTS')[m
[31m-            for _, weight in ipairs(options.weights) do[m
[31m-                table.insert(opts, weight)[m
[31m-            end[m
[31m-        end[m
[31m-        if options.aggregate then[m
[31m-            table.insert(opts, 'AGGREGATE')[m
[31m-            table.insert(opts, options.aggregate)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    for _, v in pairs(opts) do table.insert(args, v) end[m
[31m-    request.multibulk(client, command, args)[m
[31m-end[m
[31m-[m
[31m-local function mset_filter_args(client, command, ...)[m
[31m-    local args, arguments = {...}, {}[m
[31m-    if (#args == 1 and type(args[1]) == 'table') then[m
[31m-        for k,v in pairs(args[1]) do[m
[31m-            table.insert(arguments, k)[m
[31m-            table.insert(arguments, v)[m
[31m-        end[m
[31m-    else[m
[31m-        arguments = args[m
[31m-    end[m
[31m-    request.multibulk(client, command, arguments)[m
[31m-end[m
[31m-[m
[31m-local function hash_multi_request_builder(builder_callback)[m
[31m-    return function(client, command, ...)[m
[31m-        local args, arguments = {...}, { }[m
[31m-        if #args == 2 then[m
[31m-            table.insert(arguments, args[1])[m
[31m-            for k, v in pairs(args[2]) do[m
[31m-                builder_callback(arguments, k, v)[m
[31m-            end[m
[31m-        else[m
[31m-            arguments = args[m
[31m-        end[m
[31m-        request.multibulk(client, command, arguments)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function parse_info(response)[m
[31m-    local info = {}[m
[31m-    response:gsub('([^\r\n]*)\r\n', function(kv)[m
[31m-        local k,v = kv:match(('([^:]*):([^:]*)'):rep(1))[m
[31m-        if (k:match('db%d+')) then[m
[31m-            info[k] = {}[m
[31m-            v:gsub(',', function(dbkv)[m
[31m-                local dbk,dbv = kv:match('([^:]*)=([^:]*)')[m
[31m-                info[k][dbk] = dbv[m
[31m-            end)[m
[31m-        else[m
[31m-            info[k] = v[m
[31m-        end[m
[31m-    end)[m
[31m-    return info[m
[31m-end[m
[31m-[m
[31m-local function parse_info_new(response)[m
[31m-    local info, current = {}, nil[m
[31m-    response:gsub('([^\r\n]*)\r\n', function(kv)[m
[31m-        if kv == '' then return end[m
[31m-[m
[31m-        local section = kv:match(('^# (%w+)'):rep(1))[m
[31m-        if section then[m
[31m-            current = section:lower()[m
[31m-            info[current] = {}[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        local k,v = kv:match(('([^:]*):([^:]*)'):rep(1))[m
[31m-        if (k:match('db%d+')) then[m
[31m-            info[current][k] = {}[m
[31m-            v:gsub(',', function(dbkv)[m
[31m-                local dbk,dbv = kv:match('([^:]*)=([^:]*)')[m
[31m-                info[current][dbk] = dbv[m
[31m-            end)[m
[31m-        else[m
[31m-            info[current][k] = v[m
[31m-        end[m
[31m-    end)[m
[31m-    return info[m
[31m-end[m
[31m-[m
[31m-local function load_methods(proto, methods)[m
[31m-    local redis = setmetatable ({}, getmetatable(proto))[m
[31m-    for i, v in pairs(proto) do redis[i] = v end[m
[31m-    for i, v in pairs(methods) do redis[i] = v end[m
[31m-    return redis[m
[31m-end[m
[31m-[m
[31m-local function create_client(proto, client_socket, methods)[m
[31m-    local redis = load_methods(proto, methods)[m
[31m-    redis.network = {[m
[31m-        socket = client_socket,[m
[31m-        read   = network.read,[m
[31m-        write  = network.write,[m
[31m-    }[m
[31m-    redis.requests = {[m
[31m-        multibulk = request.multibulk,[m
[31m-    }[m
[31m-    return redis[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-function network.write(client, buffer)[m
[31m-    local _, err = client.network.socket:send(buffer)[m
[31m-    if err then client.error(err) end[m
[31m-end[m
[31m-[m
[31m-function network.read(client, len)[m
[31m-    if len == nil then len = '*l' end[m
[31m-    local line, err = client.network.socket:receive(len)[m
[31m-    if not err then return line else client.error('connection error: ' .. err) end[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-function response.read(client)[m
[31m-    local res = client.network.read(client)[m
[31m-    local prefix  = res:sub(1, -#res)[m
[31m-    local handler = protocol.prefixes[prefix][m
[31m-    if not handler then[m
[31m-        client.error('unknown response prefix: '..prefix)[m
[31m-    end[m
[31m-    return handler(client, res)[m
[31m-end[m
[31m-[m
[31m-function response.status(client, data)[m
[31m-    local sub = data:sub(2)[m
[31m-[m
[31m-    if sub == protocol.ok then[m
[31m-        return true[m
[31m-    elseif sub == protocol.queued then[m
[31m-        return { queued = true }[m
[31m-    else[m
[31m-        return sub[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function response.error(client, data)[m
[31m-    local err_line = data:sub(2)[m
[31m-[m
[31m-    if err_line:sub(1, 3) == protocol.err then[m
[31m-        client.error('redis error: ' .. err_line:sub(5))[m
[31m-    else[m
[31m-        client.error('redis error: ' .. err_line)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function response.bulk(client, data)[m
[31m-    local str = data:sub(2)[m
[31m-    local len = tonumber(str)[m
[31m-    if not len then[m
[31m-        client.error('cannot parse ' .. str .. ' as data length')[m
[31m-    end[m
[31m-[m
[31m-    if len == -1 then return nil end[m
[31m-    local next_chunk = client.network.read(client, len + 2)[m
[31m-    return next_chunk:sub(1, -3);[m
[31m-end[m
[31m-[m
[31m-function response.multibulk(client, data)[m
[31m-    local str = data:sub(2)[m
[31m-    local list_count = tonumber(str)[m
[31m-[m
[31m-    if list_count == -1 then[m
[31m-        return nil[m
[31m-    else[m
[31m-        local list = {}[m
[31m-        if list_count > 0 then[m
[31m-            for i = 1, list_count do[m
[31m-                table.insert(list, i, response.read(client))[m
[31m-            end[m
[31m-        end[m
[31m-        return list[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function response.integer(client, data)[m
[31m-    local res = data:sub(2)[m
[31m-    local number = tonumber(res)[m
[31m-[m
[31m-    if not number then[m
[31m-        if res == protocol.null then[m
[31m-            return nil[m
[31m-        end[m
[31m-        client.error('cannot parse '..res..' as a numeric response.')[m
[31m-    end[m
[31m-[m
[31m-    return number[m
[31m-end[m
[31m-[m
[31m-protocol.prefixes = {[m
[31m-    ['+'] = response.status,[m
[31m-    ['-'] = response.error,[m
[31m-    ['$'] = response.bulk,[m
[31m-    ['*'] = response.multibulk,[m
[31m-    [':'] = response.integer,[m
[31m-}[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-function request.raw(client, buffer)[m
[31m-    local bufferType = type(buffer)[m
[31m-[m
[31m-    if bufferType == 'table' then[m
[31m-        client.network.write(client, table.concat(buffer))[m
[31m-    elseif bufferType == 'string' then[m
[31m-        client.network.write(client, buffer)[m
[31m-    else[m
[31m-        client.error('argument error: ' .. bufferType)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function request.multibulk(client, command, ...)[m
[31m-    local args      = {...}[m
[31m-    local args_len  = #args[m
[31m-    local buffer    = { true, true }[m
[31m-    local proto_nl  = protocol.newline[m
[31m-[m
[31m-    if args_len == 1 and type(args[1]) == 'table' then[m
[31m-        args_len, args = #args[1], args[1][m
[31m-    end[m
[31m-[m
[31m-    buffer[1] = '*' .. tostring(args_len + 1) .. proto_nl[m
[31m-    buffer[2] = '$' .. #command .. proto_nl .. command .. proto_nl[m
[31m-[m
[31m-    for _, argument in pairs(args) do[m
[31m-        s_argument = tostring(argument)[m
[31m-        table.insert(buffer, '$' .. #s_argument .. proto_nl .. s_argument .. proto_nl)[m
[31m-    end[m
[31m-[m
[31m-    request.raw(client, buffer)[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-local function custom(command, send, parse)[m
[31m-    return function(client, ...)[m
[31m-        local has_reply = send(client, command, ...)[m
[31m-        if has_reply == false then return end[m
[31m-        local reply = response.read(client)[m
[31m-[m
[31m-        if type(reply) == 'table' and reply.queued then[m
[31m-            reply.parser = parse[m
[31m-            return reply[m
[31m-        else[m
[31m-            if parse then[m
[31m-                return parse(reply, command, ...)[m
[31m-            else[m
[31m-                return reply[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function command(command, opts)[m
[31m-    if opts == nil or type(opts) == 'function' then[m
[31m-        return custom(command, request.multibulk, opts)[m
[31m-    else[m
[31m-        return custom(command, opts.request or request.multibulk, opts.response)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local define_command_impl = function(target, name, opts)[m
[31m-    local opts = opts or {}[m
[31m-    target[string.lower(name)] = custom([m
[31m-        opts.command or string.upper(name),[m
[31m-        opts.request or request.multibulk,[m
[31m-        opts.response or nil[m
[31m-    )[m
[31m-end[m
[31m-[m
[31m-function define_command(name, opts)[m
[31m-    define_command_impl(commands, name, opts)[m
[31m-end[m
[31m-[m
[31m-local undefine_command_impl = function(target, name)[m
[31m-    target[string.lower(name)] = nil[m
[31m-end[m
[31m-[m
[31m-function undefine_command(name)[m
[31m-    undefine_command_impl(commands, name)[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-local client_prototype = {}[m
[31m-[m
[31m-client_prototype.raw_cmd = function(client, buffer)[m
[31m-    request.raw(client, buffer .. protocol.newline)[m
[31m-    return response.read(client)[m
[31m-end[m
[31m-[m
[31m-client_prototype.define_command = function(client, name, opts)[m
[31m-    define_command_impl(client, name, opts)[m
[31m-end[m
[31m-[m
[31m-client_prototype.undefine_command = function(client, name)[m
[31m-    undefine_command_impl(client, name)[m
[31m-end[m
[31m-[m
[31m--- Command pipelining[m
[31m-[m
[31m-client_prototype.pipeline = function(client, block)[m
[31m-    local requests, replies, parsers = {}, {}, {}[m
[31m-    local socket_write, socket_read = client.network.write, client.network.read[m
[31m-[m
[31m-    client.network.write = function(_, buffer)[m
[31m-        table.insert(requests, buffer)[m
[31m-    end[m
[31m-[m
[31m-    -- TODO: this hack is necessary to temporarily reuse the current[m
[31m-    --       request -> response handling implementation of redis-lua[m
[31m-    --       without further changes in the code, but it will surely[m
[31m-    --       disappear when the new command-definition infrastructure[m
[31m-    --       will finally be in place.[m
[31m-    client.network.read = function() return '+QUEUED' end[m
[31m-[m
[31m-    local pipeline = setmetatable({}, {[m
[31m-        __index = function(env, name)[m
[31m-            local cmd = client[name][m
[31m-            if not cmd then[m
[31m-                client.error('unknown redis command: ' .. name, 2)[m
[31m-            end[m
[31m-            return function(self, ...)[m
[31m-                local reply = cmd(client, ...)[m
[31m-                table.insert(parsers, #requests, reply.parser)[m
[31m-                return reply[m
[31m-            end[m
[31m-        end[m
[31m-    })[m
[31m-[m
[31m-    local success, retval = pcall(block, pipeline)[m
[31m-[m
[31m-    client.network.write, client.network.read = socket_write, socket_read[m
[31m-    if not success then client.error(retval, 0) end[m
[31m-[m
[31m-    client.network.write(client, table.concat(requests, ''))[m
[31m-[m
[31m-    for i = 1, #requests do[m
[31m-        local reply, parser = response.read(client), parsers[i][m
[31m-        if parser then[m
[31m-            reply = parser(reply)[m
[31m-        end[m
[31m-        table.insert(replies, i, reply)[m
[31m-    end[m
[31m-[m
[31m-    return replies, #requests[m
[31m-end[m
[31m-[m
[31m--- Publish/Subscribe[m
[31m-[m
[31m-do[m
[31m-    local channels = function(channels)[m
[31m-        if type(channels) == 'string' then[m
[31m-            channels = { channels }[m
[31m-        end[m
[31m-        return channels[m
[31m-    end[m
[31m-[m
[31m-    local subscribe = function(client, ...)[m
[31m-        request.multibulk(client, 'subscribe', ...)[m
[31m-    end[m
[31m-    local psubscribe = function(client, ...)[m
[31m-        request.multibulk(client, 'psubscribe', ...)[m
[31m-    end[m
[31m-    local unsubscribe = function(client, ...)[m
[31m-        request.multibulk(client, 'unsubscribe')[m
[31m-    end[m
[31m-    local punsubscribe = function(client, ...)[m
[31m-        request.multibulk(client, 'punsubscribe')[m
[31m-    end[m
[31m-[m
[31m-    local consumer_loop = function(client)[m
[31m-        local aborting, subscriptions = false, 0[m
[31m-[m
[31m-        local abort = function()[m
[31m-            if not aborting then[m
[31m-                unsubscribe(client)[m
[31m-                punsubscribe(client)[m
[31m-                aborting = true[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        return coroutine.wrap(function()[m
[31m-            while true do[m
[31m-                local message[m
[31m-                local response = response.read(client)[m
[31m-[m
[31m-                if response[1] == 'pmessage' then[m
[31m-                    message = {[m
[31m-                        kind    = response[1],[m
[31m-                        pattern = response[2],[m
[31m-                        channel = response[3],[m
[31m-                        payload = response[4],[m
[31m-                    }[m
[31m-                else[m
[31m-                    message = {[m
[31m-                        kind    = response[1],[m
[31m-                        channel = response[2],[m
[31m-                        payload = response[3],[m
[31m-                    }[m
[31m-                end[m
[31m-[m
[31m-                if string.match(message.kind, '^p?subscribe$') then[m
[31m-                    subscriptions = subscriptions + 1[m
[31m-                end[m
[31m-                if string.match(message.kind, '^p?unsubscribe$') then[m
[31m-                    subscriptions = subscriptions - 1[m
[31m-                end[m
[31m-[m
[31m-                if aborting and subscriptions == 0 then[m
[31m-                    break[m
[31m-                end[m
[31m-                coroutine.yield(message, abort)[m
[31m-            end[m
[31m-        end)[m
[31m-    end[m
[31m-[m
[31m-    client_prototype.pubsub = function(client, subscriptions)[m
[31m-        if type(subscriptions) == 'table' then[m
[31m-            if subscriptions.subscribe then[m
[31m-                subscribe(client, channels(subscriptions.subscribe))[m
[31m-            end[m
[31m-            if subscriptions.psubscribe then[m
[31m-                psubscribe(client, channels(subscriptions.psubscribe))[m
[31m-            end[m
[31m-        end[m
[31m-        return consumer_loop(client)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- Redis transactions (MULTI/EXEC)[m
[31m-[m
[31m-do[m
[31m-    local function identity(...) return ... end[m
[31m-    local emptytable = {}[m
[31m-[m
[31m-    local function initialize_transaction(client, options, block, queued_parsers)[m
[31m-        local coro = coroutine.create(block)[m
[31m-[m
[31m-        if options.watch then[m
[31m-            local watch_keys = {}[m
[31m-            for _, key in pairs(options.watch) do[m
[31m-                table.insert(watch_keys, key)[m
[31m-            end[m
[31m-            if #watch_keys > 0 then[m
[31m-                client:watch(unpack(watch_keys))[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local transaction_client = setmetatable({}, {__index=client})[m
[31m-        transaction_client.exec  = function(...)[m
[31m-            client.error('cannot use EXEC inside a transaction block')[m
[31m-        end[m
[31m-        transaction_client.multi = function(...)[m
[31m-            coroutine.yield()[m
[31m-        end[m
[31m-        transaction_client.commands_queued = function()[m
[31m-            return #queued_parsers[m
[31m-        end[m
[31m-[m
[31m-        assert(coroutine.resume(coro, transaction_client))[m
[31m-[m
[31m-        transaction_client.multi = nil[m
[31m-        transaction_client.discard = function(...)[m
[31m-            local reply = client:discard()[m
[31m-            for i, v in pairs(queued_parsers) do[m
[31m-                queued_parsers[i]=nil[m
[31m-            end[m
[31m-            coro = initialize_transaction(client, options, block, queued_parsers)[m
[31m-            return reply[m
[31m-        end[m
[31m-        transaction_client.watch = function(...)[m
[31m-            client.error('WATCH inside MULTI is not allowed')[m
[31m-        end[m
[31m-        setmetatable(transaction_client, { __index = function(t, k)[m
[31m-                local cmd = client[k][m
[31m-                if type(cmd) == "function" then[m
[31m-                    local function queuey(self, ...)[m
[31m-                        local reply = cmd(client, ...)[m
[31m-                        assert((reply or emptytable).queued == true, 'a QUEUED reply was expected')[m
[31m-                        table.insert(queued_parsers, reply.parser or identity)[m
[31m-                        return reply[m
[31m-                    end[m
[31m-                    t[k]=queuey[m
[31m-                    return queuey[m
[31m-                else[m
[31m-                    return cmd[m
[31m-                end[m
[31m-            end[m
[31m-        })[m
[31m-        client:multi()[m
[31m-        return coro[m
[31m-    end[m
[31m-[m
[31m-    local function transaction(client, options, coroutine_block, attempts)[m
[31m-        local queued_parsers, replies = {}, {}[m
[31m-        local retry = tonumber(attempts) or tonumber(options.retry) or 2[m
[31m-        local coro = initialize_transaction(client, options, coroutine_block, queued_parsers)[m
[31m-[m
[31m-        local success, retval[m
[31m-        if coroutine.status(coro) == 'suspended' then[m
[31m-            success, retval = coroutine.resume(coro)[m
[31m-        else[m
[31m-            -- do not fail if the coroutine has not been resumed (missing t:multi() with CAS)[m
[31m-            success, retval = true, 'empty transaction'[m
[31m-        end[m
[31m-        if #queued_parsers == 0 or not success then[m
[31m-            client:discard()[m
[31m-            assert(success, retval)[m
[31m-            return replies, 0[m
[31m-        end[m
[31m-[m
[31m-        local raw_replies = client:exec()[m
[31m-        if not raw_replies then[m
[31m-            if (retry or 0) <= 0 then[m
[31m-                client.error("MULTI/EXEC transaction aborted by the server")[m
[31m-            else[m
[31m-                --we're not quite done yet[m
[31m-                return transaction(client, options, coroutine_block, retry - 1)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        for i, parser in pairs(queued_parsers) do[m
[31m-            table.insert(replies, i, parser(raw_replies[i]))[m
[31m-        end[m
[31m-[m
[31m-        return replies, #queued_parsers[m
[31m-    end[m
[31m-[m
[31m-    client_prototype.transaction = function(client, arg1, arg2)[m
[31m-        local options, block[m
[31m-        if not arg2 then[m
[31m-            options, block = {}, arg1[m
[31m-        elseif arg1 then --and arg2, implicitly[m
[31m-            options, block = type(arg1)=="table" and arg1 or { arg1 }, arg2[m
[31m-        else[m
[31m-            client.error("Invalid parameters for redis transaction.")[m
[31m-        end[m
[31m-[m
[31m-        if not options.watch then[m
[31m-            watch_keys = { }[m
[31m-            for i, v in pairs(options) do[m
[31m-                if tonumber(i) then[m
[31m-                    table.insert(watch_keys, v)[m
[31m-                    options[i] = nil[m
[31m-                end[m
[31m-            end[m
[31m-            options.watch = watch_keys[m
[31m-        elseif not (type(options.watch) == 'table') then[m
[31m-            options.watch = { options.watch }[m
[31m-        end[m
[31m-[m
[31m-        if not options.cas then[m
[31m-            local tx_block = block[m
[31m-            block = function(client, ...)[m
[31m-                client:multi()[m
[31m-                return tx_block(client, ...) --can't wrap this in pcall because we're in a coroutine.[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        return transaction(client, options, block)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-local function connect_tcp(socket, parameters)[m
[31m-    local host, port = parameters.host, tonumber(parameters.port)[m
[31m-    local ok, err = socket:connect(host, port)[m
[31m-    if not ok then[m
[31m-        default_error_fn('could not connect to '..host..':'..port..' ['..err..']')[m
[31m-    end[m
[31m-    socket:setoption('tcp-nodelay', parameters.tcp_nodelay)[m
[31m-    return socket[m
[31m-end[m
[31m-[m
[31m-local function connect_unix(socket, parameters)[m
[31m-    local ok, err = socket:connect(parameters.path)[m
[31m-    if not ok then[m
[31m-        default_error_fn('could not connect to '..parameters.path..' ['..err..']')[m
[31m-    end[m
[31m-    return socket[m
[31m-end[m
[31m-[m
[31m-local function create_connection(parameters)[m
[31m-    local perform_connection, socket[m
[31m-[m
[31m-    if parameters.scheme == 'unix' then[m
[31m-        perform_connection, socket = connect_unix, require('socket.unix')[m
[31m-        assert(socket, 'your build of LuaSocket does not support UNIX domain sockets')[m
[31m-    else[m
[31m-        if parameters.scheme then[m
[31m-            local scheme = parameters.scheme[m
[31m-            assert(scheme == 'redis' or scheme == 'tcp', 'invalid scheme: '..scheme)[m
[31m-        end[m
[31m-        perform_connection, socket = connect_tcp, require('socket').tcp[m
[31m-    end[m
[31m-[m
[31m-    return perform_connection(socket(), parameters)[m
[31m-end[m
[31m-[m
[31m-function connect(...)[m
[31m-    local args, parameters = {...}, nil[m
[31m-[m
[31m-    if #args == 1 then[m
[31m-        if type(args[1]) == 'table' then[m
[31m-            parameters = args[1][m
[31m-        else[m
[31m-            local uri = require('socket.url')[m
[31m-            parameters = uri.parse(select(1, ...))[m
[31m-            if parameters.scheme then[m
[31m-                if parameters.query then[m
[31m-                    for k, v in parameters.query:gmatch('([-_%w]+)=([-_%w]+)') do[m
[31m-                        if k == 'tcp_nodelay' or k == 'tcp-nodelay' then[m
[31m-                            parameters.tcp_nodelay = parse_boolean(v)[m
[31m-                        end[m
[31m-                    end[m
[31m-                end[m
[31m-            else[m
[31m-                parameters.host = parameters.path[m
[31m-            end[m
[31m-        end[m
[31m-    elseif #args > 1 then[m
[31m-        local host, port = unpack(args)[m
[31m-        parameters = { host = host, port = port }[m
[31m-    end[m
[31m-[m
[31m-    local socket = create_connection(merge_defaults(parameters))[m
[31m-    local client = create_client(client_prototype, socket, commands)[m
[31m-    [m
[31m-    client.error = default_error_fn[m
[31m-[m
[31m-    return client[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-commands = {[m
[31m-    -- commands operating on the key space[m
[31m-    exists           = command('EXISTS', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    del              = command('DEL'),[m
[31m-    type             = command('TYPE'),[m
[31m-    rename           = command('RENAME'),[m
[31m-    renamenx         = command('RENAMENX', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    expire           = command('EXPIRE', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    pexpire          = command('PEXPIRE', {     -- >= 2.6[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    expireat         = command('EXPIREAT', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    pexpireat        = command('PEXPIREAT', {   -- >= 2.6[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    ttl              = command('TTL'),[m
[31m-    pttl             = command('PTTL'),         -- >= 2.6[m
[31m-    move             = command('MOVE', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    dbsize           = command('DBSIZE'),[m
[31m-    persist          = command('PERSIST', {     -- >= 2.2[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    keys             = command('KEYS', {[m
[31m-        response = function(response)[m
[31m-            if type(response) == 'string' then[m
[31m-                -- backwards compatibility path for Redis < 2.0[m
[31m-                local keys = {}[m
[31m-                response:gsub('[^%s]+', function(key)[m
[31m-                    table.insert(keys, key)[m
[31m-                end)[m
[31m-                response = keys[m
[31m-            end[m
[31m-            return response[m
[31m-        end[m
[31m-    }),[m
[31m-    randomkey        = command('RANDOMKEY', {[m
[31m-        response = function(response)[m
[31m-            if response == '' then[m
[31m-                return nil[m
[31m-            else[m
[31m-                return response[m
[31m-            end[m
[31m-        end[m
[31m-    }),[m
[31m-    sort             = command('SORT', {[m
[31m-        request = function(client, command, key, params)[m
[31m-            --[[ params = {[m
[31m-                    by    = 'weight_*',[m
[31m-                    get   = 'object_*',[m
[31m-                    limit = { 0, 10 },[m
[31m-                    sort  = 'desc',[m
[31m-                    alpha = true,[m
[31m-                } --]][m
[31m-            local query = { key }[m
[31m-[m
[31m-            if params then[m
[31m-                if params.by then[m
[31m-                    table.insert(query, 'BY')[m
[31m-                    table.insert(query, params.by)[m
[31m-                end[m
[31m-[m
[31m-                if type(params.limit) == 'table' then[m
[31m-                    -- TODO: check for lower and upper limits[m
[31m-                    table.insert(query, 'LIMIT')[m
[31m-                    table.insert(query, params.limit[1])[m
[31m-                    table.insert(query, params.limit[2])[m
[31m-                end[m
[31m-[m
[31m-                if params.get then[m
[31m-                    if (type(params.get) == 'table') then[m
[31m-                        for _, getarg in pairs(params.get) do[m
[31m-                            table.insert(query, 'GET')[m
[31m-                            table.insert(query, getarg)[m
[31m-                        end[m
[31m-                    else[m
[31m-                        table.insert(query, 'GET')[m
[31m-                        table.insert(query, params.get)[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                if params.sort then[m
[31m-                    table.insert(query, params.sort)[m
[31m-                end[m
[31m-[m
[31m-                if params.alpha == true then[m
[31m-                    table.insert(query, 'ALPHA')[m
[31m-                end[m
[31m-[m
[31m-                if params.store then[m
[31m-                    table.insert(query, 'STORE')[m
[31m-                    table.insert(query, params.store)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            request.multibulk(client, command, query)[m
[31m-        end[m
[31m-    }),[m
[31m-[m
[31m-    -- commands operating on string values[m
[31m-    set              = command('SET'),[m
[31m-    setnx            = command('SETNX', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    setex            = command('SETEX'),        -- >= 2.0[m
[31m-    psetex           = command('PSETEX'),       -- >= 2.6[m
[31m-    mset             = command('MSET', {[m
[31m-        request = mset_filter_args[m
[31m-    }),[m
[31m-    msetnx           = command('MSETNX', {[m
[31m-        request  = mset_filter_args,[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    get              = command('GET'),[m
[31m-    mget             = command('MGET'),[m
[31m-    getset           = command('GETSET'),[m
[31m-    incr             = command('INCR'),[m
[31m-    incrby           = command('INCRBY'),[m
[31m-    incrbyfloat      = command('INCRBYFLOAT', { -- >= 2.6[m
[31m-        response = function(reply, command, ...)[m
[31m-            return tonumber(reply)[m
[31m-        end,[m
[31m-    }),[m
[31m-    decr             = command('DECR'),[m
[31m-    decrby           = command('DECRBY'),[m
[31m-    append           = command('APPEND'),       -- >= 2.0[m
[31m-    substr           = command('SUBSTR'),       -- >= 2.0[m
[31m-    strlen           = command('STRLEN'),       -- >= 2.2[m
[31m-    setrange         = command('SETRANGE'),     -- >= 2.2[m
[31m-    getrange         = command('GETRANGE'),     -- >= 2.2[m
[31m-    setbit           = command('SETBIT'),       -- >= 2.2[m
[31m-    getbit           = command('GETBIT'),       -- >= 2.2[m
[31m-[m
[31m-    -- commands operating on lists[m
[31m-    rpush            = command('RPUSH'),[m
[31m-    lpush            = command('LPUSH'),[m
[31m-    llen             = command('LLEN'),[m
[31m-    lrange           = command('LRANGE'),[m
[31m-    ltrim            = command('LTRIM'),[m
[31m-    lindex           = command('LINDEX'),[m
[31m-    lset             = command('LSET'),[m
[31m-    lrem             = command('LREM'),[m
[31m-    lpop             = command('LPOP'),[m
[31m-    rpop             = command('RPOP'),[m
[31m-    rpoplpush        = command('RPOPLPUSH'),[m
[31m-    blpop            = command('BLPOP'),        -- >= 2.0[m
[31m-    brpop            = command('BRPOP'),        -- >= 2.0[m
[31m-    rpushx           = command('RPUSHX'),       -- >= 2.2[m
[31m-    lpushx           = command('LPUSHX'),       -- >= 2.2[m
[31m-    linsert          = command('LINSERT'),      -- >= 2.2[m
[31m-    brpoplpush       = command('BRPOPLPUSH'),   -- >= 2.2[m
[31m-[m
[31m-    -- commands operating on sets[m
[31m-    sadd             = command('SADD', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    srem             = command('SREM', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    spop             = command('SPOP'),[m
[31m-    smove            = command('SMOVE', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    scard            = command('SCARD'),[m
[31m-    sismember        = command('SISMEMBER', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    sinter           = command('SINTER'),[m
[31m-    sinterstore      = command('SINTERSTORE'),[m
[31m-    sunion           = command('SUNION'),[m
[31m-    sunionstore      = command('SUNIONSTORE'),[m
[31m-    sdiff            = command('SDIFF'),[m
[31m-    sdiffstore       = command('SDIFFSTORE'),[m
[31m-    smembers         = command('SMEMBERS'),[m
[31m-    srandmember      = command('SRANDMEMBER'),[m
[31m-[m
[31m-    -- commands operating on sorted sets[m
[31m-    zadd             = command('ZADD', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    zincrby          = command('ZINCRBY'),[m
[31m-    zrem             = command('ZREM', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    zrange           = command('ZRANGE', {[m
[31m-        request  = zset_range_request,[m
[31m-        response = zset_range_reply,[m
[31m-    }),[m
[31m-    zrevrange        = command('ZREVRANGE', {[m
[31m-        request  = zset_range_request,[m
[31m-        response = zset_range_reply,[m
[31m-    }),[m
[31m-    zrangebyscore    = command('ZRANGEBYSCORE', {[m
[31m-        request  = zset_range_byscore_request,[m
[31m-        response = zset_range_reply,[m
[31m-    }),[m
[31m-    zrevrangebyscore = command('ZREVRANGEBYSCORE', {    -- >= 2.2[m
[31m-        request  = zset_range_byscore_request,[m
[31m-        response = zset_range_reply,[m
[31m-    }),[m
[31m-    zunionstore      = command('ZUNIONSTORE', {         -- >= 2.0[m
[31m-        request = zset_store_request[m
[31m-    }),[m
[31m-    zinterstore      = command('ZINTERSTORE', {         -- >= 2.0[m
[31m-        request = zset_store_request[m
[31m-    }),[m
[31m-    zcount           = command('ZCOUNT'),[m
[31m-    zcard            = command('ZCARD'),[m
[31m-    zscore           = command('ZSCORE'),[m
[31m-    zremrangebyscore = command('ZREMRANGEBYSCORE'),[m
[31m-    zrank            = command('ZRANK'),                -- >= 2.0[m
[31m-    zrevrank         = command('ZREVRANK'),             -- >= 2.0[m
[31m-    zremrangebyrank  = command('ZREMRANGEBYRANK'),      -- >= 2.0[m
[31m-[m
[31m-    -- commands operating on hashes[m
[31m-    hset             = command('HSET', {        -- >= 2.0[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    hsetnx           = command('HSETNX', {      -- >= 2.0[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    hmset            = command('HMSET', {       -- >= 2.0[m
[31m-        request  = hash_multi_request_builder(function(args, k, v)[m
[31m-            table.insert(args, k)[m
[31m-            table.insert(args, v)[m
[31m-        end),[m
[31m-    }),[m
[31m-    hincrby          = command('HINCRBY'),      -- >= 2.0[m
[31m-    hincrbyfloat     = command('HINCRBYFLOAT', {-- >= 2.6[m
[31m-        response = function(reply, command, ...)[m
[31m-            return tonumber(reply)[m
[31m-        end,[m
[31m-    }),[m
[31m-    hget             = command('HGET'),         -- >= 2.0[m
[31m-    hmget            = command('HMGET', {       -- >= 2.0[m
[31m-        request  = hash_multi_request_builder(function(args, k, v)[m
[31m-            table.insert(args, v)[m
[31m-        end),[m
[31m-    }),[m
[31m-    hdel             = command('HDEL', {        -- >= 2.0[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    hexists          = command('HEXISTS', {     -- >= 2.0[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    hlen             = command('HLEN'),         -- >= 2.0[m
[31m-    hkeys            = command('HKEYS'),        -- >= 2.0[m
[31m-    hvals            = command('HVALS'),        -- >= 2.0[m
[31m-    hgetall          = command('HGETALL', {     -- >= 2.0[m
[31m-        response = function(reply, command, ...)[m
[31m-            local new_reply = { }[m
[31m-            for i = 1, #reply, 2 do new_reply[reply[i]] = reply[i + 1] end[m
[31m-            return new_reply[m
[31m-        end[m
[31m-    }),[m
[31m-[m
[31m-    -- connection related commands[m
[31m-    ping             = command('PING', {[m
[31m-        response = function(response) return response == 'PONG' end[m
[31m-    }),[m
[31m-    echo             = command('ECHO'),[m
[31m-    auth             = command('AUTH'),[m
[31m-    select           = command('SELECT'),[m
[31m-    quit             = command('QUIT', {[m
[31m-        request = fire_and_forget[m
[31m-    }),[m
[31m-[m
[31m-    -- transactions[m
[31m-    multi            = command('MULTI'),        -- >= 2.0[m
[31m-    exec             = command('EXEC'),         -- >= 2.0[m
[31m-    discard          = command('DISCARD'),      -- >= 2.0[m
[31m-    watch            = command('WATCH'),        -- >= 2.2[m
[31m-    unwatch          = command('UNWATCH'),      -- >= 2.2[m
[31m-[m
[31m-    -- publish - subscribe[m
[31m-    subscribe        = command('SUBSCRIBE'),    -- >= 2.0[m
[31m-    unsubscribe      = command('UNSUBSCRIBE'),  -- >= 2.0[m
[31m-    psubscribe       = command('PSUBSCRIBE'),   -- >= 2.0[m
[31m-    punsubscribe     = command('PUNSUBSCRIBE'), -- >= 2.0[m
[31m-    publish          = command('PUBLISH'),      -- >= 2.0[m
[31m-[m
[31m-    -- redis scripting[m
[31m-    eval             = command('EVAL'),         -- >= 2.6[m
[31m-    evalsha          = command('EVALSHA'),      -- >= 2.6[m
[31m-    script           = command('SCRIPT'),       -- >= 2.6[m
[31m-[m
[31m-    -- remote server control commands[m
[31m-    bgrewriteaof     = command('BGREWRITEAOF'),[m
[31m-    config           = command('CONFIG', {     -- >= 2.0[m
[31m-        response = function(reply, command, ...)[m
[31m-            if (type(reply) == 'table') then[m
[31m-                local new_reply = { }[m
[31m-                for i = 1, #reply, 2 do new_reply[reply[i]] = reply[i + 1] end[m
[31m-                return new_reply[m
[31m-            end[m
[31m-[m
[31m-            return reply[m
[31m-        end[m
[31m-    }),[m
[31m-    client           = command('CLIENT'),       -- >= 2.4[m
[31m-    slaveof          = command('SLAVEOF'),[m
[31m-    save             = command('SAVE'),[m
[31m-    bgsave           = command('BGSAVE'),[m
[31m-    lastsave         = command('LASTSAVE'),[m
[31m-    flushdb          = command('FLUSHDB'),[m
[31m-    flushall         = command('FLUSHALL'),[m
[31m-    shutdown         = command('SHUTDOWN', {[m
[31m-        request = fire_and_forget[m
[31m-    }),[m
[31m-    slowlog          = command('SLOWLOG', {     -- >= 2.2.13[m
[31m-        response = function(reply, command, ...)[m
[31m-            if (type(reply) == 'table') then[m
[31m-                local structured = { }[m
[31m-                for index, entry in ipairs(reply) do[m
[31m-                    structured[index] = {[m
[31m-                        id = tonumber(entry[1]),[m
[31m-                        timestamp = tonumber(entry[2]),[m
[31m-                        duration = tonumber(entry[3]),[m
[31m-                        command = entry[4],[m
[31m-                    }[m
[31m-                end[m
[31m-                return structured[m
[31m-            end[m
[31m-[m
[31m-            return reply[m
[31m-        end[m
[31m-    }),[m
[31m-    info             = command('INFO', {[m
[31m-        response = function(response)[m
[31m-            if string.find(response, '^# ') then[m
[31m-                return parse_info_new(response)[m
[31m-            end[m
[31m-            return parse_info(response)[m
[31m-        end[m
[31m-    }),[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/tapset/ngx_lua.stp b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/tapset/ngx_lua.stp[m
[1mdeleted file mode 100644[m
[1mindex 04fecb5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/tapset/ngx_lua.stp[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-function ngx_http_lua_ctx_context(r)[m
[31m-{[m
[31m-[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 17841ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-#!/usr/bin/env bash[m
[31m-[m
[31m-# this script is for developers only.[m
[31m-# dependent on the ngx-build script from the nginx-devel-utils repostory:[m
[31m-#   https://github.com/openresty/nginx-devel-utils/blob/master/ngx-build[m
[31m-# the resulting nginx is located at ./work/nginx/sbin/nginx[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=${1:-1.4.1}[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-# the ngx-build script is from https://github.com/agentzh/nginx-devel-utils[m
[31m-[m
[31m-            #--add-module=$home/work/nginx_upload_module-2.2.0 \[m
[31m-[m
[31m-            #--without-pcre \[m
[31m-            #--without-http_rewrite_module \[m
[31m-            #--without-http_autoindex_module \[m
[31m-            #--with-cc=gcc46 \[m
[31m-            #--with-cc=clang \[m
[31m-            #--without-http_referer_module \[m
[31m-            #--with-http_v2_module \[m
[31m-            #--with-http_spdy_module \[m
[31m-[m
[31m-time ngx-build $force $version \[m
[31m-            --with-ipv6 \[m
[31m-            --with-cc-opt="-I$PCRE_INC -I$OPENSSL_INC" \[m
[31m-            --with-http_realip_module \[m
[31m-            --with-http_ssl_module \[m
[31m-            --add-module=$root/../ndk-nginx-module \[m
[31m-            --add-module=$root/../set-misc-nginx-module \[m
[31m-            --with-ld-opt="-L$PCRE_LIB -L$OPENSSL_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:$OPENSSL_LIB" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --with-http_image_filter_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-            --with-http_auth_request_module \[m
[31m-                --add-module=$root/../echo-nginx-module \[m
[31m-                --add-module=$root/../memc-nginx-module \[m
[31m-                --add-module=$root/../srcache-nginx-module \[m
[31m-                --add-module=$root \[m
[31m-                --add-module=$root/../lua-upstream-nginx-module \[m
[31m-              --add-module=$root/../headers-more-nginx-module \[m
[31m-                --add-module=$root/../drizzle-nginx-module \[m
[31m-                --add-module=$root/../rds-json-nginx-module \[m
[31m-                --add-module=$root/../coolkit-nginx-module \[m
[31m-                --add-module=$root/../redis2-nginx-module \[m
[31m-                --add-module=$root/t/data/fake-module \[m
[31m-                --with-http_gunzip_module \[m
[31m-                --with-http_dav_module \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-                $opts \[m
[31m-                --with-debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/fix-comments b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/fix-comments[m
[1mdeleted file mode 100644[m
[1mindex bcf1d5d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/fix-comments[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-for my $infile (@ARGV) {[m
[31m-    warn "Processing $infile...\n";[m
[31m-    open my $in, $infile or[m
[31m-        die "Cannot open $infile for reading: $!\n";[m
[31m-    my $s;[m
[31m-    my $changed = 0;[m
[31m-    while (<$in>) {[m
[31m-        $changed += s{//(.*)}{/* $1 */};[m
[31m-        $s .= $_;[m
[31m-    }[m
[31m-    close $in;[m
[31m-[m
[31m-    if ($changed) {[m
[31m-        my $outfile = $infile;[m
[31m-        open my $out, ">$outfile" or[m
[31m-            die "Cannot open $outfile for writing: $!\n";[m
[31m-        print $out $s;[m
[31m-        close $out;[m
[31m-        warn "Wrote $outfile\n";[m
[31m-    }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/gdbinit b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/gdbinit[m
[1mdeleted file mode 100644[m
[1mindex 1508c64..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/gdbinit[m
[1m+++ /dev/null[m
[36m@@ -1,415 +0,0 @@[m
[31m-# This gdb script provides several useful routines for debugging ngx_lua or[m
[31m-# standalone Lua/LuaJIT.[m
[31m-#[m
[31m-# You need gdb >= v7.3 to make this script working correctly.[m
[31m-#[m
[31m-# Installation: place it at $HOME/.gdbinit[m
[31m-#[m
[31m-# -- chaoslawful <at> gmail <dot> com[m
[31m-[m
[31m-#### Lua type defines ####[m
[31m-[m
[31m-set $__LUA_TNONE = -1[m
[31m-set $__LUA_TNIL = 0[m
[31m-set $__LUA_TBOOLEAN = 1[m
[31m-set $__LUA_TLIGHTUSERDATA = 2[m
[31m-set $__LUA_TNUMBER = 3[m
[31m-set $__LUA_TSTRING = 4[m
[31m-set $__LUA_TTABLE = 5[m
[31m-set $__LUA_TFUNCTION = 6[m
[31m-set $__LUA_TUSERDATA = 7[m
[31m-set $__LUA_TTHREAD = 8[m
[31m-[m
[31m-#### Lua constants ####[m
[31m-[m
[31m-set $__LUA_GLOBALSINDEX = -10002[m
[31m-set $__LUA_ENVIRONINDEX = -10001[m
[31m-set $__LUA_REGISTRYINDEX = -10000[m
[31m-[m
[31m-#### Auxiliary methods ####[m
[31m-[m
[31m-define __lua_debug_instance[m
[31m-	if !$__lua_debug_instance[m
[31m-		set $__lua_debug_instance = (lua_Debug*)malloc(sizeof(lua_Debug))[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __free_lua_debug_instance[m
[31m-	if $__lua_debug_instance[m
[31m-		set $rc = free($__lua_debug_instance)[m
[31m-		set $__lua_debug_instance = 0[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-set $__BUCKET_SIZE = 16[m
[31m-define __set_instance[m
[31m-	if !$__set_instance[m
[31m-		set $__set_instance = (void*(*(*))[2])malloc($__BUCKET_SIZE*sizeof(void*(*)[2]))[m
[31m-		set $rc = memset($__set_instance, 0, $__BUCKET_SIZE*sizeof(void*(*)[2]))[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __free_set_instance[m
[31m-	if $__set_instance[m
[31m-		__set_clean[m
[31m-		set $rc = free($__set_instance)[m
[31m-		set $__set_instance = 0[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __set_add[m
[31m-	set $p = (void*)$arg0[m
[31m-	set $__bkt_idx = (int)$p%$__BUCKET_SIZE[m
[31m-[m
[31m-	__set_instance[m
[31m-	set $__elem = (void*(*)[2])$__set_instance[$__bkt_idx][m
[31m-	set $__found = 0[m
[31m-	while $__elem[m
[31m-		if (*$__elem)[0] == $p[m
[31m-			set $__found = 1[m
[31m-			loop_break[m
[31m-		end[m
[31m-		set $__elem = (void*(*)[2])(*$__elem)[1][m
[31m-	end[m
[31m-	if $__found[m
[31m-		set $existed_in_set = 1[m
[31m-	else[m
[31m-		set $existed_in_set = 0[m
[31m-[m
[31m-		set $rc = (void*(*)[2])calloc(1, sizeof(void*)*2)[m
[31m-		set (*$rc)[0] = $p[m
[31m-		set (*$rc)[1] = $__set_instance[$__bkt_idx][m
[31m-		set $__set_instance[$__bkt_idx] = $rc[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __set_is_exist[m
[31m-	set $p = (void*)$arg0[m
[31m-	set $__bkt_idx = (int)$p%$__BUCKET_SIZE[m
[31m-[m
[31m-	__set_instance[m
[31m-	set $__elem = (void*(*)[2])$__set_instance[$__bkt_idx][m
[31m-	set $__found = 0[m
[31m-	while $__elem[m
[31m-		if (*$__elem)[0] == $p[m
[31m-			set $__found = 1[m
[31m-			loop_break[m
[31m-		end[m
[31m-		set $__elem = (void*(*)[2])(*$__elem)[1][m
[31m-	end[m
[31m-	if $__found[m
[31m-		set $existed_in_set = 1[m
[31m-	else[m
[31m-		set $existed_in_set = 0[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __set_clean[m
[31m-	__set_instance[m
[31m-[m
[31m-	set $__bkt_idx = 0[m
[31m-	while $__bkt_idx < $__BUCKET_SIZE[m
[31m-		set $__elem = (void*(*)[2])$__set_instance[$__bkt_idx][m
[31m-		while $__elem[m
[31m-			set $__next = (void*(*)[2])(*$__elem)[1][m
[31m-			set $rc = free($__elem)[m
[31m-			set $__elem = $__next[m
[31m-		end[m
[31m-		set $__set_instance[$__bkt_idx] = 0[m
[31m-		set $__bkt_idx = $__bkt_idx+1[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define hook-quit[m
[31m-	__free_lua_debug_instance[m
[31m-	__free_set_instance[m
[31m-end[m
[31m-[m
[31m-define hook-detach[m
[31m-	__free_lua_debug_instance[m
[31m-	__free_set_instance[m
[31m-end[m
[31m-[m
[31m-define hook-disconnect[m
[31m-	__free_lua_debug_instance[m
[31m-	__free_set_instance[m
[31m-end[m
[31m-[m
[31m-define _lua_pop[m
[31m-	set $l = (lua_State*)$arg0[m
[31m-	set $_n = (int)$arg1[m
[31m-	set $_rc = lua_settop($l, -$_n-1)[m
[31m-end[m
[31m-[m
[31m-define _lua_dump_locals[m
[31m-	set $l = (lua_State*)$arg0[m
[31m-	set $dbg = (lua_Debug*)$arg1[m
[31m-	set $idx = 1[m
[31m-[m
[31m-	set $rc = lua_getlocal($l, $dbg, $idx)[m
[31m-	if $rc[m
[31m-		printf "\t----[[ Locals ]]----\n"[m
[31m-		while $rc[m
[31m-			printf "\t%d:\t'%s' = ", $idx, $rc[m
[31m-			__lua_dump_stack $l -1[m
[31m-			printf "\n"[m
[31m-[m
[31m-			_lua_pop $l 1[m
[31m-			set $idx = $idx + 1[m
[31m-			set $rc = lua_getlocal($l, $dbg, $idx)[m
[31m-		end[m
[31m-	else[m
[31m-		printf "\tNo locals!\n"[m
[31m-	end[m
[31m-	printf "\n"[m
[31m-end[m
[31m-[m
[31m-define _lua_dump_upvalues[m
[31m-	set $l = (lua_State*)$arg0[m
[31m-	set $dbg = (lua_Debug*)$arg1[m
[31m-	set $idx = 1[m
[31m-[m
[31m-	set $rc = lua_getinfo($l, "f", $dbg)[m
[31m-	if $rc[m
[31m-		set $rc = lua_getupvalue($l, -1, $idx)[m
[31m-		if $rc[m
[31m-			printf "\t----[[ Upvalues ]]----\n"[m
[31m-			while $rc[m
[31m-				printf "\t%d:\t'%s' = ", $idx, $rc[m
[31m-				__lua_dump_stack $l -1[m
[31m-				printf "\n"[m
[31m-[m
[31m-				_lua_pop $l 1[m
[31m-				set $idx = $idx + 1[m
[31m-				set $rc = lua_getupvalue($l, -1, $idx)[m
[31m-			end[m
[31m-		else[m
[31m-			printf "\tNo upvalues!\n"[m
[31m-		end[m
[31m-		_lua_pop $l 1[m
[31m-	else[m
[31m-		printf "\tFailed to get function closure!\n"[m
[31m-	end[m
[31m-	printf "\n"[m
[31m-end[m
[31m-[m
[31m-define __lua_dump_stack[m
[31m-	__set_clean[m
[31m-	__lua_dump_stack_aux $arg0 $arg1 0[m
[31m-end[m
[31m-[m
[31m-define __lua_dump_stack_aux[m
[31m-	set $l = (lua_State*)$arg0[m
[31m-	set $nidx_$arg2 = (int)$arg1[m
[31m-	set $cidx_$arg2 = (int)$arg2+1[m
[31m-[m
[31m-	# relative stack index to absolute index[m
[31m-	if $nidx_$arg2 < 0 && $nidx_$arg2 > $__LUA_REGISTRYINDEX[m
[31m-		set $nidx_$arg2 = $nidx_$arg2 + (int)lua_gettop($l) + 1[m
[31m-	end[m
[31m-[m
[31m-	set $vt_$arg2 = (int)lua_type($l, $nidx_$arg2)[m
[31m-[m
[31m-	if $vt_$arg2 == $__LUA_TNONE[m
[31m-		echo <invalid index>[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TNIL[m
[31m-		echo (nil)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TBOOLEAN[m
[31m-		printf "(bool) %d", lua_toboolean($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TLIGHTUSERDATA[m
[31m-		printf "(ludata) %p", lua_touserdata($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TNUMBER[m
[31m-		printf "%g", lua_tonumber($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TSTRING[m
[31m-		set $tmplen = (size_t*)malloc(sizeof(size_t))[m
[31m-		set $tmp = lua_pushvalue($l, $nidx_$arg2)[m
[31m-		set $tmp = lua_tolstring($l, -1, $tmplen)[m
[31m-#printf "(string:%d) ", *$tmplen[m
[31m-		eval "output/r *(const char (*)[%d])$tmp", *$tmplen[m
[31m-		_lua_pop $l 1[m
[31m-		set $tmp = free($tmplen)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TTABLE[m
[31m-		set $rc = lua_topointer($l, $nidx_$arg2)[m
[31m-#printf "(table) %p { ", $rc[m
[31m-		printf "{ "[m
[31m-		__set_add $rc[m
[31m-		if $existed_in_set[m
[31m-			printf "... "[m
[31m-		else[m
[31m-			set $rc = lua_pushnil($l)[m
[31m-			set $rc = lua_next($l, $nidx_$arg2)[m
[31m-			while $rc != 0[m
[31m-				printf "["[m
[31m-				__lua_dump_stack_aux $l -2 $cidx_$arg2[m
[31m-				printf "]"[m
[31m-				printf " = "[m
[31m-				__lua_dump_stack_aux $l -1 $cidx_$arg2[m
[31m-				printf ", "[m
[31m-				_lua_pop $l 1[m
[31m-				set $rc = lua_next($l, $nidx_$arg2)[m
[31m-			end[m
[31m-		end[m
[31m-		printf "}"[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TFUNCTION[m
[31m-		printf "(func) %p", lua_topointer($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TUSERDATA[m
[31m-		printf "(udata) %p", lua_topointer($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TTHREAD[m
[31m-		printf "(thread) %p", lua_topointer($l, $nidx_$arg2)[m
[31m-	else[m
[31m-		if $vt_$arg2 > $__LUA_TTHREAD || $vt_$arg2 < 0[m
[31m-			echo <unknown type>[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-#### Command methods ####[m
[31m-[m
[31m-define lbt [m
[31m-	if $argc < 1[m
[31m-		echo Please specify Lua state and/or dump flag!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		if $argc > 1[m
[31m-			set $dump_local = ($arg1&1)==1[m
[31m-			set $dump_upvalue = ($arg1&2)==2[m
[31m-		else[m
[31m-			set $dump_local = 0[m
[31m-			set $dump_upvalue = 0[m
[31m-		end[m
[31m-[m
[31m-		__lua_debug_instance[m
[31m-		set $dbg = $__lua_debug_instance[m
[31m-[m
[31m-		set $level = 0[m
[31m-		set $rc = lua_getstack($l, $level, $dbg)[m
[31m-		while $rc > 0[m
[31m-			set $rc = lua_getinfo($l, "Sln", $dbg)[m
[31m-			set $name = $dbg->name[m
[31m-			if !$name[m
[31m-				set $name = "???"[m
[31m-			end[m
[31m-[m
[31m-			printf "#%d\t%s\t[%s]\tat %s:%d\n", $level, $name, $dbg->what, $dbg->source, $dbg->currentline[m
[31m-[m
[31m-			if $dump_local[m
[31m-				_lua_dump_locals $l $dbg[m
[31m-			end[m
[31m-			if $dump_upvalue[m
[31m-				_lua_dump_upvalues $l $dbg[m
[31m-			end[m
[31m-[m
[31m-			set $level = $level+1[m
[31m-			set $rc = lua_getstack($l, $level, $dbg)[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document lbt[m
[31m-lbt <lua state> [<dump>]: Dump the backtrace of the specified Lua state. <dump> is a mask value, whose bit 1/2 controls the dump of locals/upvalues at each stack frame correspondingly. So set <dump> to 1 dumps only locals; set to 2 dumps only upvalues; and set to 3 dumps both locals and upvalues.[m
[31m-end[m
[31m-[m
[31m-define ll[m
[31m-	if $argc != 2[m
[31m-		echo Please specify Lua state and stack frame number (0-based)!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		set $level = (int)$arg1[m
[31m-[m
[31m-		__lua_debug_instance[m
[31m-		set $dbg = $__lua_debug_instance[m
[31m-[m
[31m-		set $rc = lua_getstack($l, $level, $dbg)[m
[31m-		if $rc > 0[m
[31m-			_lua_dump_locals $l $dbg[m
[31m-		else[m
[31m-			echo Failed to get Lua stack frame!\n[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document ll[m
[31m-ll <lua state> <frameno>: Dump all local vars in the specified Lua stack frame (0-based).[m
[31m-end[m
[31m-[m
[31m-define lu[m
[31m-	if $argc != 2[m
[31m-		echo Please specify Lua state and stack frame number (0-based)!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		set $level = (int)$arg1[m
[31m-[m
[31m-		__lua_debug_instance[m
[31m-		set $dbg = $__lua_debug_instance[m
[31m-[m
[31m-		set $rc = lua_getstack($l, $level, $dbg)[m
[31m-		if $rc > 0[m
[31m-			_lua_dump_upvalues $l $dbg[m
[31m-		else[m
[31m-			echo Failed to get Lua stack frame!\n[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document lu[m
[31m-lu <lua state> <frameno>: Dump all upvalues in the specified Lua stack frame (0-based).[m
[31m-end[m
[31m-[m
[31m-define lg[m
[31m-	if $argc != 1[m
[31m-		echo Please specify Lua state!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		__lua_dump_stack $l $__LUA_GLOBALSINDEX[m
[31m-		printf "\n"[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document lg[m
[31m-lg <lua state>: Dump all entries in Lua global table.[m
[31m-end[m
[31m-[m
[31m-define lr[m
[31m-	if $argc != 1[m
[31m-		echo Please specify Lua state!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		__lua_dump_stack $l $__LUA_REGISTRYINDEX[m
[31m-		printf "\n"[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document lr[m
[31m-lr <lua state>: Dump all entries in Lua registry table.[m
[31m-end[m
[31m-[m
[31m-define ls[m
[31m-	if $argc != 1[m
[31m-		echo Please specify Lua state!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		set $idx = lua_gettop($l)[m
[31m-		while $idx >= 1[m
[31m-			printf "#%d ", $idx[m
[31m-			__lua_dump_stack $l $idx[m
[31m-			printf "\n"[m
[31m-			set $idx = $idx - 1[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document ls[m
[31m-ls <lua state>: Dump all entries in call stack.[m
[31m-end[m
[31m-[m
[31m-# vi:ft=gdb ts=4 sw=4[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/gen-lexer-c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/gen-lexer-c[m
[1mdeleted file mode 100755[m
[1mindex dfed3fc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/gen-lexer-c[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-#!/usr/bin/env bash[m
[31m-[m
[31m-if [ -z "$1" ]; then[m
[31m-    level=0[m
[31m-else[m
[31m-    level="$1"[m
[31m-fi[m
[31m-[m
[31m-#echo '{' '}' '\[=*\[' '--\[=*\[' '\]=*\]' '--[^\n]*' '"(?:\\[^\n]|[^"\n\\])*"' $'\'(?:\\\\[^\\n]|[^\'\\n\\\\])*\''[m
[31m-[m
[31m-# we need the re.pl script here:[m
[31m-#   https://github.com/openresty/sregex/blob/dfa-multi-re/re.pl[m
[31m-re.pl -W --no-main -c --cc="clang -O2" \[m
[31m-    --func-name ngx_http_lua_lex \[m
[31m-    --header ngx_http_lua_lex.h -o src/ngx_http_lua_lex.c \[m
[31m-    --debug=$level -n 8 \[m
[31m-    -- '{' '}' '\[=*\[' '--\[=*\[' '\]=*\]' '--[^\n]*' '"(?:\\[^\n]|[^"\n\\])*"' $'\'(?:\\\\[^\\n]|[^\'\\n\\\\])*\'' \[m
[31m-    || exit 1[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/ngx-links b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/ngx-links[m
[1mdeleted file mode 100755[m
[1mindex bf54f46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/ngx-links[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use Cwd qw( cwd );[m
[31m-use Getopt::Std;[m
[31m-[m
[31m-my %opts;[m
[31m-getopts('f', \%opts) or[m
[31m-    die "Usage: $0 [-f][m
[31m-Options:[m
[31m-    -f          Override exising symbolic links with force[m
[31m-";[m
[31m-[m
[31m-my $root = shift || 'src';[m
[31m-[m
[31m-my $force = $opts{f};[m
[31m-[m
[31m-opendir my $dir, $root[m
[31m-    or die "Can't open directory src/ for reading: $!\n";[m
[31m-[m
[31m-my @links;[m
[31m-[m
[31m-while (my $entry = readdir $dir) {[m
[31m-    my ($base, $ext);[m
[31m-[m
[31m-    my $source = "$root/$entry";[m
[31m-[m
[31m-    if (-l $source || -d $source) {[m
[31m-        warn "skipping $source\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if ($entry =~ m{ ^ ngx_ (?: \w+ _ )+ (\w+) \. ([ch]|rl) $}x) {[m
[31m-        ($base, $ext) = ($1, $2);[m
[31m-    } else {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    my $target = "$root/$base.$ext";[m
[31m-    if (-e $target && ! -l $target) {[m
[31m-        die "target $target already exists, and not a symlink, not overriding...Abort.\n";[m
[31m-    } elsif (-l $target) {[m
[31m-        #warn "it's a link";[m
[31m-        if ( ! $force ) {[m
[31m-            die "target $target already exists, not overriding...Abort.\n";[m
[31m-        }[m
[31m-        warn "overriding existing symlink $target\n";[m
[31m-    }[m
[31m-    #warn "creating $target --> $root/$entry\n";[m
[31m-    system("ln -svf `pwd`/$source $target") == 0 or[m
[31m-        die "Failed to create the symlink\n";;[m
[31m-[m
[31m-    push @links, $target;[m
[31m-}[m
[31m-[m
[31m-print join("\n", @links), "\n";[m
[31m-[m
[31m-close $dir;[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/retab b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/retab[m
[1mdeleted file mode 100755[m
[1mindex 89cd1b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/retab[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-for f in $*; do[m
[31m-	if [ -f "$f" ]; then[m
[31m-		vim -c retab -c x $f[m
[31m-	fi[m
[31m-done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/revim b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/revim[m
[1mdeleted file mode 100755[m
[1mindex aa14da2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/revim[m
[1m+++ /dev/null[m
[36m@@ -1,102 +0,0 @@[m
[31m-#!/usr/bin/perl[m
[31m-# vim:set ft=perl ts=4 sw=4 et fdm=marker:[m
[31m-#[m
[31m-# revim - add customized vim modeline for given files[m
[31m-# Copyright (c) 2010 chaoslawful[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use Getopt::Std;[m
[31m-[m
[31m-my %opts;[m
[31m-[m
[31m-getopts('hm:', \%opts);[m
[31m-[m
[31m-if($opts{h} or !@ARGV) {[m
[31m-    die <<EOT;[m
[31m-Usage: revim [-m <vim modeline>] src/*[m
[31m-[m
[31m-In <vim modeline>, the following placeholder(s) can be used:[m
[31m-[m
[31m-    * %t - Expands to vim file type. E.g. 'c' for .c files, 'perl' for .pl files.[m
[31m-EOT[m
[31m-}[m
[31m-[m
[31m-my $vim_ml = $opts{m} || "vim:set ft=%t ts=4 sw=4 et fdm=marker:";[m
[31m-my @files = map glob, @ARGV;[m
[31m-for my $file (@files) {[m
[31m-    next if -d $file;[m
[31m-    my ($ft, $ml) = detect_filetype($file, $vim_ml);[m
[31m-    next if !defined($ft);[m
[31m-    revim($file, $ml);[m
[31m-}[m
[31m-[m
[31m-sub detect_filetype[m
[31m-{[m
[31m-    my ($f, $tmpl) = @_;[m
[31m-    my ($ft, $lcmt, $rcmt);[m
[31m-    my %phs;[m
[31m-[m
[31m-    if($f =~ /.([cC]|[hH])$/) {[m
[31m-        $ft = "c";[m
[31m-        ($lcmt, $rcmt) = ("/* ", " */");[m
[31m-    } elsif($f =~ /.(pl|pm)$/) {[m
[31m-        $ft = "perl";[m
[31m-        ($lcmt, $rcmt) = ("# ", "");[m
[31m-    } elsif($f =~ /.t_?$/) {[m
[31m-        # assuming tests are written in perl[m
[31m-        $ft = "perl";[m
[31m-        ($lcmt, $rcmt) = ("# ", "");[m
[31m-    } else {[m
[31m-        $ft = undef;[m
[31m-    }[m
[31m-[m
[31m-    if(defined($ft)) {[m
[31m-        %phs = ([m
[31m-            "%t" => $ft,[m
[31m-        );[m
[31m-[m
[31m-        $tmpl =~ s/(%[a-z])/$phs{$1}/ge;[m
[31m-        $tmpl =~ s/^/$lcmt/;[m
[31m-        $tmpl =~ s/$/$rcmt/;[m
[31m-[m
[31m-        return ($ft, $tmpl);[m
[31m-    }[m
[31m-[m
[31m-    return (undef, undef);[m
[31m-}[m
[31m-[m
[31m-sub revim[m
[31m-{[m
[31m-    my ($f, $ml) = @_;[m
[31m-    my @lines;[m
[31m-[m
[31m-    open my $in, $f[m
[31m-        or die "Can't open $f for reading: $!";[m
[31m-    while(<$in>) {[m
[31m-        push(@lines, $_);[m
[31m-    }[m
[31m-    close $in;[m
[31m-[m
[31m-    my @nlines = grep {!/\bvim?:/} @lines;[m
[31m-    warn "revim: $f:\tremoved existing vim modeline.\n"[m
[31m-        if(@nlines != @lines);[m
[31m-[m
[31m-    if($nlines[0] =~ /^#!/) {    # has shebang line[m
[31m-        my $shebang = shift @nlines;[m
[31m-        unshift(@nlines, $shebang, "$ml\n");[m
[31m-    } else {[m
[31m-        unshift(@nlines, "$ml\n");[m
[31m-    }[m
[31m-[m
[31m-    my $text = join '', @nlines;[m
[31m-[m
[31m-    open my $out, "> $f"[m
[31m-        or die "Can't open $f for writing: $!";[m
[31m-    binmode $out;[m
[31m-    print $out $text;[m
[31m-    close $out;[m
[31m-[m
[31m-    warn "revim: $f:\tdone.\n";[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/run_test.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/run_test.sh[m
[1mdeleted file mode 100755[m
[1mindex 1f5b12f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/run_test.sh[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-script_dir=$(dirname $0)[m
[31m-root=$(readlink -f $script_dir/..)[m
[31m-testfile=${1:-$root/t/*.t $root/t/*/*.t}[m
[31m-cd $root[m
[31m-$script_dir/reindex $testfile[m
[31m-export PATH=$root/work/sbin:$PATH[m
[31m-killall nginx[m
[31m-prove -I$root/../test-nginx/lib $testfile[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex fe161e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua-0.10.5/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,151 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr1[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Param[m
[31m-    sendmsg(mmsg[0].msg_hdr)[m
[31m-    fun:sendmmsg[m
[31m-    fun:__libc_res_nsend[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   sendmsg(msg.msg_iov[0])[m
[31m-   fun:__sendmsg_nocancel[m
[31m-   fun:ngx_write_channel[m
[31m-   fun:ngx_pass_open_channel[m
[31m-   fun:ngx_start_cache_manager_processes[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Cond[m
[31m-    fun:ngx_init_cycle[m
[31m-    fun:ngx_master_process_cycle[m
[31m-    fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   sendmsg(mmsg[0].msg_hdr)[m
[31m-   fun:sendmmsg[m
[31m-   fun:__libc_res_nsend[m
[31m-   fun:__libc_res_nquery[m
[31m-   fun:__libc_res_nquerydomain[m
[31m-   fun:__libc_res_nsearch[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex f361f79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[78][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-util/bench[m
[31m-*.html[m
[31m-trace.out*[m
[31m-try.sh[m
[31m-build9[m
[31m-src/module.[ch][m
[31m-t/servroot/[m
[31m-headers.[ch][m
[31m-buildroot/[m
[31m-build1[0-9][m
[31m-go[m
[31m-all[m
[31m-analyze[m
[31m-addr2line[m
[31m-*.plist[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/config[m
[1mdeleted file mode 100644[m
[1mindex 9e2bc08..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/config[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_lua_upstream_module[m
[31m-HTTP_LUA_UPSTREAM_SRCS="$ngx_addon_dir/src/ngx_http_lua_upstream_module.c"[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_srcs="$HTTP_LUA_UPSTREAM_SRCS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_LUA_UPSTREAM_SRCS"[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_module_incs"[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_module_libs"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex dc18430..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _DDEBUG_H_INCLUDED_[m
[31m-#define _DDEBUG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "lua-upstream *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char *fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char *fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _DDEBUG_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/src/ngx_http_lua_upstream_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/src/ngx_http_lua_upstream_module.c[m
[1mdeleted file mode 100644[m
[1mindex b299457..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/src/ngx_http_lua_upstream_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,548 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <lauxlib.h>[m
[31m-#include "ngx_http_lua_api.h"[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_lua_upstream_module;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_upstream_init(ngx_conf_t *cf);[m
[31m-static int ngx_http_lua_upstream_create_module(lua_State * L);[m
[31m-static int ngx_http_lua_upstream_get_upstreams(lua_State * L);[m
[31m-static int ngx_http_lua_upstream_get_servers(lua_State * L);[m
[31m-static ngx_http_upstream_main_conf_t *[m
[31m-    ngx_http_lua_upstream_get_upstream_main_conf(lua_State *L);[m
[31m-static int ngx_http_lua_upstream_get_primary_peers(lua_State * L);[m
[31m-static int ngx_http_lua_upstream_get_backup_peers(lua_State * L);[m
[31m-static int ngx_http_lua_get_peer(lua_State *L,[m
[31m-    ngx_http_upstream_rr_peer_t *peer, ngx_uint_t id);[m
[31m-static ngx_http_upstream_srv_conf_t *[m
[31m-    ngx_http_lua_upstream_find_upstream(lua_State *L, ngx_str_t *host);[m
[31m-static ngx_http_upstream_rr_peer_t *[m
[31m-    ngx_http_lua_upstream_lookup_peer(lua_State *L);[m
[31m-static int ngx_http_lua_upstream_set_peer_down(lua_State * L);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_lua_upstream_ctx = {[m
[31m-    NULL,                           /* preconfiguration */[m
[31m-    ngx_http_lua_upstream_init,     /* postconfiguration */[m
[31m-    NULL,                           /* create main configuration */[m
[31m-    NULL,                           /* init main configuration */[m
[31m-    NULL,                           /* create server configuration */[m
[31m-    NULL,                           /* merge server configuration */[m
[31m-    NULL,                           /* create location configuration */[m
[31m-    NULL                            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_lua_upstream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_lua_upstream_ctx,  /* module context */[m
[31m-    NULL,                        /* module directives */[m
[31m-    NGX_HTTP_MODULE,             /* module type */[m
[31m-    NULL,                        /* init master */[m
[31m-    NULL,                        /* init module */[m
[31m-    NULL,                        /* init process */[m
[31m-    NULL,                        /* init thread */[m
[31m-    NULL,                        /* exit thread */[m
[31m-    NULL,                        /* exit process */[m
[31m-    NULL,                        /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_upstream_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    if (ngx_http_lua_add_package_preload(cf, "ngx.upstream",[m
[31m-                                         ngx_http_lua_upstream_create_module)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_create_module(lua_State * L)[m
[31m-{[m
[31m-    lua_createtable(L, 0, 1);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_get_upstreams);[m
[31m-    lua_setfield(L, -2, "get_upstreams");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_get_servers);[m
[31m-    lua_setfield(L, -2, "get_servers");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_get_primary_peers);[m
[31m-    lua_setfield(L, -2, "get_primary_peers");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_get_backup_peers);[m
[31m-    lua_setfield(L, -2, "get_backup_peers");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_set_peer_down);[m
[31m-    lua_setfield(L, -2, "set_peer_down");[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_get_upstreams(lua_State * L)[m
[31m-{[m
[31m-    ngx_uint_t                            i;[m
[31m-    ngx_http_upstream_srv_conf_t        **uscfp, *uscf;[m
[31m-    ngx_http_upstream_main_conf_t        *umcf;[m
[31m-[m
[31m-    if (lua_gettop(L) != 0) {[m
[31m-        return luaL_error(L, "no argument expected");[m
[31m-    }[m
[31m-[m
[31m-    umcf = ngx_http_lua_upstream_get_upstream_main_conf(L);[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    lua_createtable(L, umcf->upstreams.nelts, 0);[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) uscf->host.data, uscf->host.len);[m
[31m-        if (uscf->port) {[m
[31m-            lua_pushfstring(L, ":%d", (int) uscf->port);[m
[31m-            lua_concat(L, 2);[m
[31m-[m
[31m-            /* XXX maybe we should also take "default_port" into account[m
[31m-             * here? */[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, -2, i + 1);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_get_servers(lua_State * L)[m
[31m-{[m
[31m-    ngx_str_t                             host;[m
[31m-    ngx_uint_t                            i, j, n;[m
[31m-    ngx_http_upstream_server_t           *server;[m
[31m-    ngx_http_upstream_srv_conf_t         *us;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "exactly one argument expected");[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) luaL_checklstring(L, 1, &host.len);[m
[31m-[m
[31m-    us = ngx_http_lua_upstream_find_upstream(L, &host);[m
[31m-    if (us == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "upstream not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (us->servers == NULL || us->servers->nelts == 0) {[m
[31m-        lua_newtable(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    server = us->servers->elts;[m
[31m-[m
[31m-    lua_createtable(L, us->servers->nelts, 0);[m
[31m-[m
[31m-    for (i = 0; i < us->servers->nelts; i++) {[m
[31m-[m
[31m-        n = 4;[m
[31m-[m
[31m-        if (server[i].name.len) {[m
[31m-            n++;[m
[31m-        }[m
[31m-[m
[31m-        if (server[i].backup) {[m
[31m-            n++;[m
[31m-        }[m
[31m-[m
[31m-        if (server[i].down) {[m
[31m-            n++;[m
[31m-        }[m
[31m-[m
[31m-        lua_createtable(L, 0, n);[m
[31m-[m
[31m-        if (server[i].name.len) {[m
[31m-            lua_pushliteral(L, "name");[m
[31m-            lua_pushlstring(L, (char *) server[i].name.data,[m
[31m-                            server[i].name.len);[m
[31m-            lua_rawset(L, -3);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushliteral(L, "addr");[m
[31m-[m
[31m-        if (server[i].naddrs == 1) {[m
[31m-            lua_pushlstring(L, (char *) server[i].addrs->name.data,[m
[31m-                            server[i].addrs->name.len);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_createtable(L, server[i].naddrs, 0);[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                lua_pushlstring(L, (char *) server[i].addrs[j].name.data,[m
[31m-                                server[i].addrs[j].name.len);[m
[31m-                lua_rawseti(L, -2, j + 1);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        lua_pushliteral(L, "weight");[m
[31m-        lua_pushinteger(L, (lua_Integer) server[i].weight);[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        lua_pushliteral(L, "max_fails");[m
[31m-        lua_pushinteger(L, (lua_Integer) server[i].max_fails);[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        lua_pushliteral(L, "fail_timeout");[m
[31m-        lua_pushinteger(L, (lua_Integer) server[i].fail_timeout);[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        if (server[i].backup) {[m
[31m-            lua_pushliteral(L, "backup");[m
[31m-            lua_pushboolean(L, 1);[m
[31m-            lua_rawset(L, -3);[m
[31m-        }[m
[31m-[m
[31m-        if (server[i].down) {[m
[31m-            lua_pushliteral(L, "down");[m
[31m-            lua_pushboolean(L, 1);[m
[31m-            lua_rawset(L, -3);[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, -2, i + 1);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_get_primary_peers(lua_State * L)[m
[31m-{[m
[31m-    ngx_str_t                             host;[m
[31m-    ngx_uint_t                            i;[m
[31m-    ngx_http_upstream_rr_peers_t         *peers;[m
[31m-    ngx_http_upstream_srv_conf_t         *us;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "exactly one argument expected");[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) luaL_checklstring(L, 1, &host.len);[m
[31m-[m
[31m-    us = ngx_http_lua_upstream_find_upstream(L, &host);[m
[31m-    if (us == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "upstream not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no peer data");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, peers->number, 0);[m
[31m-[m
[31m-    for (i = 0; i < peers->number; i++) {[m
[31m-        ngx_http_lua_get_peer(L, &peers->peer[i], i);[m
[31m-        lua_rawseti(L, -2, i + 1);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_get_backup_peers(lua_State * L)[m
[31m-{[m
[31m-    ngx_str_t                             host;[m
[31m-    ngx_uint_t                            i;[m
[31m-    ngx_http_upstream_rr_peers_t         *peers;[m
[31m-    ngx_http_upstream_srv_conf_t         *us;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "exactly one argument expected");[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) luaL_checklstring(L, 1, &host.len);[m
[31m-[m
[31m-    us = ngx_http_lua_upstream_find_upstream(L, &host);[m
[31m-    if (us == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "upstream not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no peer data");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    peers = peers->next;[m
[31m-    if (peers == NULL) {[m
[31m-        lua_newtable(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, peers->number, 0);[m
[31m-[m
[31m-    for (i = 0; i < peers->number; i++) {[m
[31m-        ngx_http_lua_get_peer(L, &peers->peer[i], i);[m
[31m-        lua_rawseti(L, -2, i + 1);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_set_peer_down(lua_State * L)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_t          *peer;[m
[31m-[m
[31m-    if (lua_gettop(L) != 4) {[m
[31m-        return luaL_error(L, "exactly 4 arguments expected");[m
[31m-    }[m
[31m-[m
[31m-    peer = ngx_http_lua_upstream_lookup_peer(L);[m
[31m-    if (peer == NULL) {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    peer->down = lua_toboolean(L, 4);[m
[31m-[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_rr_peer_t *[m
[31m-ngx_http_lua_upstream_lookup_peer(lua_State *L)[m
[31m-{[m
[31m-    int                                   id, backup;[m
[31m-    ngx_str_t                             host;[m
[31m-    ngx_http_upstream_srv_conf_t         *us;[m
[31m-    ngx_http_upstream_rr_peers_t         *peers;[m
[31m-[m
[31m-    host.data = (u_char *) luaL_checklstring(L, 1, &host.len);[m
[31m-[m
[31m-    us = ngx_http_lua_upstream_find_upstream(L, &host);[m
[31m-    if (us == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "upstream not found");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no peer data");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    backup = lua_toboolean(L, 2);[m
[31m-    if (backup) {[m
[31m-        peers = peers->next;[m
[31m-    }[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no backup peers");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    id = luaL_checkint(L, 3);[m
[31m-    if (id < 0 || (ngx_uint_t) id >= peers->number) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "bad peer id");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return &peers->peer[id];[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_get_peer(lua_State *L, ngx_http_upstream_rr_peer_t *peer,[m
[31m-    ngx_uint_t id)[m
[31m-{[m
[31m-    ngx_uint_t     n;[m
[31m-[m
[31m-    n = 8;[m
[31m-[m
[31m-    if (peer->down) {[m
[31m-        n++;[m
[31m-    }[m
[31m-[m
[31m-    if (peer->accessed) {[m
[31m-        n++;[m
[31m-    }[m
[31m-[m
[31m-    if (peer->checked) {[m
[31m-        n++;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, n);[m
[31m-[m
[31m-    lua_pushliteral(L, "id");[m
[31m-    lua_pushinteger(L, (lua_Integer) id);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "name");[m
[31m-    lua_pushlstring(L, (char *) peer->name.data, peer->name.len);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "weight");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->weight);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "current_weight");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->current_weight);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "effective_weight");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->effective_weight);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-#if (nginx_version >= 1009000)[m
[31m-    lua_pushliteral(L, "conns");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->conns);[m
[31m-    lua_rawset(L, -3);[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushliteral(L, "fails");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->fails);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "max_fails");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->max_fails);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "fail_timeout");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->fail_timeout);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    if (peer->accessed) {[m
[31m-        lua_pushliteral(L, "accessed");[m
[31m-        lua_pushinteger(L, (lua_Integer) peer->accessed);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    if (peer->checked) {[m
[31m-        lua_pushliteral(L, "checked");[m
[31m-        lua_pushinteger(L, (lua_Integer) peer->checked);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    if (peer->down) {[m
[31m-        lua_pushliteral(L, "down");[m
[31m-        lua_pushboolean(L, 1);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_main_conf_t *[m
[31m-ngx_http_lua_upstream_get_upstream_main_conf(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                   *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_request(L);[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        return ngx_http_cycle_get_module_main_conf(ngx_cycle,[m
[31m-                                                   ngx_http_upstream_module);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_lua_upstream_find_upstream(lua_State *L, ngx_str_t *host)[m
[31m-{[m
[31m-    u_char                               *port;[m
[31m-    size_t                                len;[m
[31m-    ngx_int_t                             n;[m
[31m-    ngx_uint_t                            i;[m
[31m-    ngx_http_upstream_srv_conf_t        **uscfp, *uscf;[m
[31m-    ngx_http_upstream_main_conf_t        *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_lua_upstream_get_upstream_main_conf(L);[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->host.len == host->len[m
[31m-            && ngx_memcmp(uscf->host.data, host->data, host->len) == 0)[m
[31m-        {[m
[31m-            return uscf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    port = ngx_strlchr(host->data, host->data + host->len, ':');[m
[31m-    if (port) {[m
[31m-        port++;[m
[31m-        n = ngx_atoi(port, host->data + host->len - port);[m
[31m-        if (n < 1 || n > 65535) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        /* try harder with port */[m
[31m-[m
[31m-        len = port - host->data - 1;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->port[m
[31m-                && uscf->port == n[m
[31m-                && uscf->host.len == len[m
[31m-                && ngx_memcmp(uscf->host.data, host->data, len) == 0)[m
[31m-            {[m
[31m-                return uscf;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex b6142a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,566 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MY_INIT_CONFIG} = <<_EOC_;[m
[31m-lua_package_path "t/lib/?.lua;;";[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get upstream names[m
[31m---- http_config[m
[31m-    upstream foo.com:1234 {[m
[31m-        server 127.0.0.1;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local us = upstream.get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                ngx.say(u)[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo.com:1234[m
[31m-bar[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get upstream names (no upstream)[m
[31m---- http_config[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local us = upstream.get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                ngx.say(u)[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get servers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-[m
[31m-    upstream foo.com:1234 {[m
[31m-        server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-        server agentzh.org:81 backup;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            for _, host in pairs{ "foo.com:1234", "bar", "blah" } do[m
[31m-                local srvs, err = upstream.get_servers(host)[m
[31m-                if not srvs then[m
[31m-                    ngx.say("failed to get servers: ", err)[m
[31m-                else[m
[31m-                    ngx.say(host, ": ", ljson.encode(srvs))[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo.com:1234: [{"addr":"127.0.0.1:80","fail_timeout":53,"max_fails":100,"name":"127.0.0.1","weight":4},{"addr":"106.184.1.99:81","backup":true,"fail_timeout":10,"max_fails":1,"name":"agentzh.org:81","weight":1}][m
[31m-bar: [{"addr":"127.0.0.2:80","fail_timeout":10,"max_fails":1,"name":"127.0.0.2","weight":1}][m
[31m-failed to get servers: upstream not found[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sample in README[m
[31m---- http_config[m
[31m-    upstream foo.com {[m
[31m-        server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-        server agentzh.org:81;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location = /upstreams {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            local concat = table.concat[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local get_servers = upstream.get_servers[m
[31m-            local get_upstreams = upstream.get_upstreams[m
[31m-[m
[31m-            local us = get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                ngx.say("upstream ", u, ":")[m
[31m-                local srvs, err = get_servers(u)[m
[31m-                if not srvs then[m
[31m-                    ngx.say("failed to get servers in upstream ", u)[m
[31m-                else[m
[31m-                    for _, srv in ipairs(srvs) do[m
[31m-                        local first = true[m
[31m-                        for k, v in pairs(srv) do[m
[31m-                            if first then[m
[31m-                                first = false[m
[31m-                                ngx.print("    ")[m
[31m-                            else[m
[31m-                                ngx.print(", ")[m
[31m-                            end[m
[31m-                            if type(v) == "table" then[m
[31m-                                ngx.print(k, " = {", concat(v, ", "), "}")[m
[31m-                            else[m
[31m-                                ngx.print(k, " = ", v)[m
[31m-                            end[m
[31m-                        end[m
[31m-                        ngx.print("\\n")[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /upstreams[m
[31m---- response_body[m
[31m-upstream foo.com:[m
[31m-    addr = 127.0.0.1:80, weight = 4, fail_timeout = 53, name = 127.0.0.1, max_fails = 100[m
[31m-    addr = 106.184.1.99:81, weight = 1, fail_timeout = 10, name = agentzh.org:81, max_fails = 1[m
[31m-upstream bar:[m
[31m-    addr = 127.0.0.2:80, weight = 1, fail_timeout = 10, name = 127.0.0.2, max_fails = 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: multi-peer servers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream test {[m
[31m-        server multi-ip-test.openresty.com;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local srvs, err = upstream.get_servers("test")[m
[31m-            if not srvs then[m
[31m-                ngx.say("failed to get test ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(srvs))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\[\{"addr":\["\d{1,3}(?:\.\d{1,3}){3}:80"(?:,"\d{1,3}(?:\.\d{1,3}){3}:80")+\],"fail_timeout":10,"max_fails":1,"name":"multi-ip-test\.openresty\.com","weight":1\}\]$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: get primary peers: multi-peer servers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream test {[m
[31m-        server multi-ip-test.openresty.com;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local peers, err = upstream.get_primary_peers("test")[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get primary peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\[\{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"\d{1,3}(?:\.\d{1,3}){3}:80","weight":1\}(?:,\{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":\d+,"max_fails":1,"name":"\d{1,3}(?:\.\d{1,3}){3}:80","weight":1\})+\]$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get primary peers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream foo.com:1234 {[m
[31m-        server 127.0.0.6 fail_timeout=5 backup;[m
[31m-        server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-        server agentzh.org:81;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            us = upstream.get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                local peers, err = upstream.get_primary_peers(u)[m
[31m-                if not peers then[m
[31m-                    ngx.say("failed to get peers: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say(ljson.encode(peers))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"effective_weight":4,"fail_timeout":53,"fails":0,"id":0,"max_fails":100,"name":"127.0.0.1:80","weight":4},{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":1,"max_fails":1,"name":"106.184.1.99:81","weight":1}][m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.2:80","weight":1}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: get backup peers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream foo.com:1234 {[m
[31m-        server 127.0.0.6 fail_timeout=5 backup;[m
[31m-        server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-        server agentzh.org:81;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            us = upstream.get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                local peers, err = upstream.get_backup_peers(u)[m
[31m-                if not peers then[m
[31m-                    ngx.say("failed to get peers: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say(ljson.encode(peers))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":5,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.6:80","weight":1}][m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.3:80","weight":1},{"conns":0,"current_weight":0,"effective_weight":7,"fail_timeout":23,"fails":0,"id":1,"max_fails":200,"name":"127.0.0.4:80","weight":7}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set primary peer down (0)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, false, 0, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local peers, err = upstream.get_primary_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"down":true,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.2:80","weight":1}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set primary peer down (1, bad index)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, false, 1, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local peers, err = upstream.get_primary_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-failed to set peer down: bad peer id[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set backup peer down (index 0)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, true, 0, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local peers, err = upstream.get_backup_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"down":true,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.3:80","weight":1},{"conns":0,"current_weight":0,"effective_weight":7,"fail_timeout":23,"fails":0,"id":1,"max_fails":200,"name":"127.0.0.4:80","weight":7}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set backup peer down (toggle twice, index 0)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, true, 0, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = upstream.set_peer_down(u, true, 0, false)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local peers, err = upstream.get_backup_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.3:80","weight":1},{"conns":0,"current_weight":0,"effective_weight":7,"fail_timeout":23,"fails":0,"id":1,"max_fails":200,"name":"127.0.0.4:80","weight":7}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: set backup peer down (index 1)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, true, 1, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local peers, err = upstream.get_backup_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.3:80","weight":1},{"conns":0,"current_weight":0,"down":true,"effective_weight":7,"fail_timeout":23,"fails":0,"id":1,"max_fails":200,"name":"127.0.0.4:80","weight":7}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: upstream names with ports (github #2)[m
[31m---- http_config[m
[31m---- config[m
[31m-    location /upstream1 {[m
[31m-        proxy_pass http://127.0.0.1:1190;[m
[31m-    }[m
[31m-[m
[31m-    location /upstream2{[m
[31m-        proxy_pass http://127.0.0.2:1110;[m
[31m-    }[m
[31m-[m
[31m-    location /upstream3{[m
[31m-        proxy_pass http://127.0.0.1:1130;[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-                local concat = table.concat[m
[31m-                local upstream = require "ngx.upstream"[m
[31m-                local get_servers = upstream.get_servers[m
[31m-                local get_upstreams = upstream.get_upstreams[m
[31m-[m
[31m-                local us = get_upstreams()[m
[31m-                for _, u in ipairs(us) do[m
[31m-                    ngx.say("upstream ", u, ":")[m
[31m-                    local srvs, err = get_servers(u)[m
[31m-                    if not srvs then[m
[31m-                        ngx.say("failed to get servers in upstream ", u)[m
[31m-                    else[m
[31m-                        for _, srv in ipairs(srvs) do[m
[31m-                            local first = true[m
[31m-                            for k, v in pairs(srv) do[m
[31m-                                if first then[m
[31m-                                    first = false[m
[31m-                                    ngx.print("    ")[m
[31m-                                else[m
[31m-                                    ngx.print(", ")[m
[31m-                                end[m
[31m-                                if type(v) == "table" then[m
[31m-                                    ngx.print(k, " = {", concat(v, ", "), "}")[m
[31m-                                else[m
[31m-                                    ngx.print(k, " = ", v)[m
[31m-                                end[m
[31m-                            end[m
[31m-                            ngx.print("\\n")[m
[31m-                        end[m
[31m-                    end[m
[31m-                end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-upstream 127.0.0.1:1190:[m
[31m-    addr = 127.0.0.1:1190, weight = 0, fail_timeout = 0, max_fails = 0[m
[31m-upstream 127.0.0.2:1110:[m
[31m-    addr = 127.0.0.2:1110, weight = 0, fail_timeout = 0, max_fails = 0[m
[31m-upstream 127.0.0.1:1130:[m
[31m-    addr = 127.0.0.1:1130, weight = 0, fail_timeout = 0, max_fails = 0[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex f0f1e82..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-ngx_redis_version=0.3.7[m
[31m-ngx_redis_path=$home/work/nginx/ngx_http_redis-$ngx_redis_version[m
[31m-[m
[31m-cd $ngx_redis_path || exit 1[m
[31m-patch --forward -p1 < $root/../ngx_openresty/patches/ngx_http_redis-$ngx_redis_version-variables_in_redis_pass.patch[m
[31m-cd $root || exit 1[m
[31m-[m
[31m-            #--without-http_memcached_module \[m
[31m-ngx-build $force $version \[m
[31m-            --with-cc-opt="-O0" \[m
[31m-            --with-ld-opt="-Wl,-rpath,/opt/postgres/lib:/opt/drizzle/lib:/usr/local/lib" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-            --add-module=$root/../ndk-nginx-module \[m
[31m-            --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$ngx_redis_path \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-            --add-module=$home/work/nginx/ngx_http_upstream_keepalive-0.7 \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-          --with-debug[m
[31m-          #--add-module=/home/agentz/git/dodo/utils/dodo-hook \[m
[31m-          #--add-module=$home/work/ngx_http_auth_request-0.1 #\[m
[31m-          #--with-rtsig_module[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 5b1a07d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_lua_upstream-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,132 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr1[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   sendmsg(msg.msg_iov[0])[m
[31m-   fun:__sendmsg_nocancel[m
[31m-   fun:ngx_write_channel[m
[31m-   fun:ngx_pass_open_channel[m
[31m-   fun:ngx_start_cache_manager_processes[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Cond[m
[31m-    fun:ngx_init_cycle[m
[31m-    fun:ngx_master_process_cycle[m
[31m-    fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 5001bac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-.svn[m
[31m-t/servroot/[m
[31m-*~[m
[31m-*.swp[m
[31m-src/ddebug.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/module.c[m
[31m-src/module.h[m
[31m-src/output.h[m
[31m-src/processor.c[m
[31m-src/processor.h[m
[31m-src/upstream.c[m
[31m-src/upstream.h[m
[31m-src/util.c[m
[31m-src/util.h[m
[31m-reindex[m
[31m-src/escape.c[m
[31m-src/escape.h[m
[31m-src/output.c[m
[31m-src/rewrite.c[m
[31m-src/rewrite.h[m
[31m-src/variable.c[m
[31m-src/variable.h[m
[31m-build[m
[31m-build[789][m
[31m-build10[m
[31m-go[m
[31m-genmobi.sh[m
[31m-tags[m
[31m-*.mobi[m
[31m-all[m
[31m-releng[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/CHANGES b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/CHANGES[m
[1mdeleted file mode 100644[m
[1mindex 18e6ea8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/CHANGES[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-2011-12-27    VERSION 0.9[m
[31m-    * Improve debug logging.[m
[31m-      From Yichun Zhang (agentzh).[m
[31m-[m
[31m-2011-12-23[m
[31m-    * Fix compatibility with poll, select and /dev/poll event models.[m
[31m-      Reported by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2011-11-10[m
[31m-    * Fix compatibility with PostgreSQL 9.x.[m
[31m-      Reported by Yichun Zhang (agentzh).[m
[31m-[m
[31m-    * Fix compatibility with nginx-1.1.4+.[m
[31m-      From Yichun Zhang (agentzh).[m
[31m-[m
[31m-2011-06-21[m
[31m-    * Enforce writing of proper SQL queries by replacing "row <row>"[m
[31m-      output format with "text" and returning whole result-set with[m
[31m-      values separated by newlines when using "postgres_output"[m
[31m-      directive.[m
[31m-[m
[31m-    * Enforce writing of proper SQL queries by requiring result-set[m
[31m-      to contain exactly single value when using "binary_value" or[m
[31m-      "value" output formats when using "postgres_output" directive.[m
[31m-[m
[31m-2011-06-17[m
[31m-    * Fix "duplicated last chunk" issue.[m
[31m-      Reported by Silly Sad, diagnosed by Maxim Dounin.[m
[31m-[m
[31m-    * Improve build-time PostgreSQL client library discovery process[m
[31m-      by using PostgreSQL's pg_config.[m
[31m-      Patch from Silly Sad.[m
[31m-[m
[31m-2010-12-23    VERSION 0.8[m
[31m-    * Add option to return content in binary format using[m
[31m-      "binary_value" output format in "postgres_output" directive.[m
[31m-      Mostly done by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-11-01[m
[31m-    * Support "postgres_pass", "postgres_query", "postgres_rewrite"[m
[31m-      and "postgres_output" directives in "if" pseudo-locations.[m
[31m-      From Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-10-02[m
[31m-    * Major rewrite of "postgres_escape" directive.[m
[31m-[m
[31m-2010-09-30    VERSION 0.7[m
[31m-    * Add option to send original response body with error responses[m
[31m-      set by "postgres_rewrite" directive.[m
[31m-[m
[31m-2010-08-25[m
[31m-    * Fix error that could lead to failed connection to the database.[m
[31m-[m
[31m-    * Log more details on failed connection to the database.[m
[31m-[m
[31m-2010-08-15    VERSION 0.6[m
[31m-    * Fix linking issue that manifested itself when nginx was build[m
[31m-      with both: ngx_postgres and ngx_supervisord modules.[m
[31m-      Reported by Sergey A. Osokin.[m
[31m-[m
[31m-2010-08-09[m
[31m-    * Fix pointer signedness mismatch, which broke build on Darwin[m
[31m-      and probably few other operating systems.[m
[31m-      Reported by sahuguet, fixed by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-08-03    VERSION 0.5[m
[31m-    * Fix compatibility with nginx-0.8.47+.[m
[31m-[m
[31m-2010-07-20[m
[31m-    * Add "postgres_escape" directive.[m
[31m-[m
[31m-2010-07-05    VERSION 0.4[m
[31m-    * Optimize generation of RDS output.[m
[31m-[m
[31m-2010-07-02[m
[31m-    * Fix serious bug that under certain conditions (query evaluated[m
[31m-      to empty string, failed connection to the database, etc) would[m
[31m-      lead to segmentation fault on versions older than nginx-0.8.17[m
[31m-      (including nginx-0.7.x).[m
[31m-[m
[31m-2010-06-30[m
[31m-    * When returning row or value, use Content-Type specified by[m
[31m-      "default_type" directive instead of "text/plain".[m
[31m-[m
[31m-    * Allow column to be specified by its name instead of its number[m
[31m-      (in "postgres_output" and "postgres_set" directives).[m
[31m-[m
[31m-2010-06-23[m
[31m-    * Add "postgres_rewrite" directive.[m
[31m-[m
[31m-    * Add "$postgres_affected" variable.[m
[31m-[m
[31m-2010-06-22[m
[31m-    * Fix issue that would stop gzip filter from processing[m
[31m-      responses in RDS format.[m
[31m-      Found by Qing Lin (kindy), fixed by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-06-21[m
[31m-    * Add "postgres_output" directive.[m
[31m-[m
[31m-2010-06-18[m
[31m-    * Add "$postgres_query" variable.[m
[31m-[m
[31m-2010-06-16[m
[31m-    * Add "postgres_set" directive.[m
[31m-[m
[31m-    * Add "$postgres_columns" and "$postgres_rows" variables.[m
[31m-[m
[31m-2010-06-13    VERSION 0.3[m
[31m-    * Allow configuration of method-specific queries.[m
[31m-[m
[31m-    * Restrict "postgres_pass" directive to "location" context.[m
[31m-[m
[31m-2010-06-07[m
[31m-    * Free keepalive connections on nginx shutdown.[m
[31m-      Requested by Yichun Zhang (agentzh).[m
[31m-[m
[31m-    * Fix memory leak that was happening when nginx was configured[m
[31m-      to use non-existing database tables, etc.[m
[31m-      Found by Valgrind, reported by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-06-04[m
[31m-    * Use recently standardized error codes in RDS format.[m
[31m-[m
[31m-2010-06-03[m
[31m-    * Allow request methods other than GET and HEAD.[m
[31m-      From Yichun Zhang (agentzh) via ngx_drizzle.[m
[31m-[m
[31m-2010-05-12    VERSION 0.2[m
[31m-    * Add various improvements to build and testing infrastructures.[m
[31m-      Mostly done by Yichun Zhang (agentzh).[m
[31m-[m
[31m-    * Put more restrictions on "postgres_pass" and "postgres_query"[m
[31m-      directives. Handle their bad configuration properly.[m
[31m-[m
[31m-2010-05-10[m
[31m-    * Log PostgreSQL errors into error.log.[m
[31m-      Reminded by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-05-06[m
[31m-    * Remove connection timeout from re-used keepalive connection.[m
[31m-[m
[31m-    * Fix libpq headers detection on Debian.[m
[31m-      Patch from Weibin Yao.[m
[31m-[m
[31m-    * Add "postgres_get_value" directive.[m
[31m-      Requested by Johan Bergstroem.[m
[31m-[m
[31m-    * Bring back fail-safe check that got lost during pre-release[m
[31m-      refactorization. Without this check performance was reduced[m
[31m-      few times under high load, because about 1% of keepalive[m
[31m-      connections got disconnected.[m
[31m-[m
[31m-2010-05-05    VERSION 0.1[m
[31m-    * Initial release.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 98c3bcf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m-Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m-Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-1. Redistributions of source code must retain the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer.[m
[31m-2. Redistributions in binary form must reproduce the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer in the[m
[31m-   documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/config[m
[1mdeleted file mode 100644[m
[1mindex 4b4caa4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/config[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <libpq-fe.h>"[m
[31m-ngx_feature_test="(void) PQconndefaults();"[m
[31m-[m
[31m-if [ -n "$LIBPQ_INC" -o -n "$LIBPQ_LIB" ]; then[m
[31m-    # specified by LIBPQ_INC and LIBPQ_LIB[m
[31m-    ngx_feature="libpq library in directories specified by LIBPQ_INC ($LIBPQ_INC) and LIBPQ_LIB ($LIBPQ_LIB)"[m
[31m-    ngx_feature_path="$LIBPQ_INC"[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R$LIBPQ_LIB -L$LIBPQ_LIB -lpq"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L$LIBPQ_LIB -lpq"[m
[31m-    fi[m
[31m-    . auto/feature[m
[31m-else[m
[31m-    if [ -z "$PG_CONFIG" ]; then[m
[31m-        PG_CONFIG=pg_config[m
[31m-    fi[m
[31m-[m
[31m-    if type $PG_CONFIG >/dev/null 2>&1; then[m
[31m-        # based on information from pg_config[m
[31m-        ngx_feature="libpq library (via $PG_CONFIG)"[m
[31m-        ngx_feature_path="`$PG_CONFIG --includedir`"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R`$PG_CONFIG --libdir` -L`$PG_CONFIG --libdir` -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L`$PG_CONFIG --libdir` -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    # auto-discovery[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # system-wide[m
[31m-        ngx_feature="libpq library"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lpq"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # Debian[m
[31m-        ngx_feature="libpq library in /usr/../postgresql/"[m
[31m-        ngx_feature_path="/usr/include/postgresql"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # FreeBSD[m
[31m-        ngx_feature="libpq library in /usr/local/"[m
[31m-        ngx_feature_path="/usr/local/include"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/local/lib -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # OpenBSD[m
[31m-        ngx_feature="libpq library in /usr/local/../postgresql/"[m
[31m-        ngx_feature_path="/usr/local/include/postgresql"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/local/lib -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # NetBSD[m
[31m-        ngx_feature="libpq library in /usr/pkg/"[m
[31m-        ngx_feature_path="/usr/pkg/include"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/pkg/lib -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # MacPorts[m
[31m-        ngx_feature="libpq library in /opt/local/"[m
[31m-        ngx_feature_path="/opt/local/include"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/opt/local/lib -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-   cat << END[m
[31m- $0: error: ngx_postgres addon was unable to find the libpq library.[m
[31m-END[m
[31m-   exit 1[m
[31m-fi[m
[31m-[m
[31m-ngx_version=`grep nginx_version src/core/nginx.h | sed -e 's/^.* \(.*\)$/\1/'`[m
[31m-[m
[31m-if [ -z "$ngx_version" ]; then[m
[31m-   cat << END[m
[31m- $0: error: ngx_postgres addon was unable to detect version of nginx.[m
[31m-END[m
[31m-   exit 1[m
[31m-fi[m
[31m-[m
[31m-# work-around for versions of nginx older than nginx-0.9.0[m
[31m-if [ $ngx_version -ge 9000 ]; then[m
[31m-    ngx_feature_name="NGX_POSTGRES_LIBRARY_VERSION"[m
[31m-    ngx_feature_run=value[m
[31m-else[m
[31m-    ngx_feature_name="NGX_POSTGRES_LIBRARY_VERSION_DETECTED"[m
[31m-    ngx_feature_run=no[m
[31m-fi[m
[31m-[m
[31m-lib_version=90100[m
[31m-ngx_feature="libpq library version 9.1"[m
[31m-ngx_feature_test="printf(\"%d\", PQlibVersion())"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=90000[m
[31m-    ngx_feature="libpq library version 9.0"[m
[31m-    ngx_feature_test="(void) PQescapeLiteral(NULL, NULL, 0);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80400[m
[31m-    ngx_feature="libpq library version 8.4"[m
[31m-    ngx_feature_test="PQinitOpenSSL(0, 0);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80300[m
[31m-    ngx_feature="libpq library version 8.3"[m
[31m-    ngx_feature_test="(void) PQconnectionNeedsPassword(NULL);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80200[m
[31m-    ngx_feature="libpq library version 8.2"[m
[31m-    ngx_feature_test="(void) PQsendDescribePortal(NULL, NULL);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80104[m
[31m-    ngx_feature="libpq library version 8.1.4"[m
[31m-    ngx_feature_test="(void) PQescapeByteaConn(NULL, NULL, 0, 0);[m
[31m-                      (void) PQregisterThreadLock(NULL);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80100[m
[31m-    ngx_feature="libpq library version 8.1.0"[m
[31m-    ngx_feature_test="(void) PQregisterThreadLock(NULL);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80008[m
[31m-    ngx_feature="libpq library version 8.0.8"[m
[31m-    ngx_feature_test="(void) PQescapeByteaConn(NULL, NULL, 0, 0);[m
[31m-                      (void) PQcancel(NULL, NULL, 0);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80000[m
[31m-    ngx_feature="libpq library version 8.0.0"[m
[31m-    ngx_feature_test="(void) PQcancel(NULL, NULL, 0);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-   cat << END[m
[31m- $0: error: ngx_postgres addon was unable to detect version of the libpq library.[m
[31m-END[m
[31m-   exit 1[m
[31m-fi[m
[31m-[m
[31m-# work-around for versions of nginx older than nginx-0.9.0[m
[31m-if [ $ngx_version -lt 9000 ]; then[m
[31m-    have=NGX_POSTGRES_LIBRARY_VERSION value=$lib_version . auto/define[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_postgres[m
[31m-[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_postgres_module"[m
[31m-[m
[31m-CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_postgres_escape.c $ngx_addon_dir/src/ngx_postgres_handler.c $ngx_addon_dir/src/ngx_postgres_keepalive.c $ngx_addon_dir/src/ngx_postgres_module.c $ngx_addon_dir/src/ngx_postgres_output.c $ngx_addon_dir/src/ngx_postgres_processor.c $ngx_addon_dir/src/ngx_postgres_rewrite.c $ngx_addon_dir/src/ngx_postgres_upstream.c $ngx_addon_dir/src/ngx_postgres_util.c $ngx_addon_dir/src/ngx_postgres_variable.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ngx_postgres_escape.h $ngx_addon_dir/src/ngx_postgres_handler.h $ngx_addon_dir/src/ngx_postgres_keepalive.h $ngx_addon_dir/src/ngx_postgres_module.h $ngx_addon_dir/src/ngx_postgres_output.h $ngx_addon_dir/src/ngx_postgres_processor.h $ngx_addon_dir/src/ngx_postgres_rewrite.h $ngx_addon_dir/src/ngx_postgres_upstream.h $ngx_addon_dir/src/ngx_postgres_util.h $ngx_addon_dir/src/ngx_postgres_variable.h $ngx_addon_dir/src/ngx_postgres_ddebug.h $ngx_addon_dir/src/resty_dbd_stream.h"[m
[31m-[m
[31m-have=NGX_POSTGRES_MODULE . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 38253fc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_DDEBUG_H_[m
[31m-#define _NGX_POSTGRES_DDEBUG_H_[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "postgres *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " *** %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void[m
[31m-dd(const char * fmt, ...)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void[m
[31m-dd(const char * fmt, ...)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_DDEBUG_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_escape.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_escape.c[m
[1mdeleted file mode 100644[m
[1mindex dd78194..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_escape.c[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_escape.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-[m
[31m-uintptr_t ngx_postgres_script_exit_code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_escape_string(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_postgres_escape_t      *pge;[m
[31m-    ngx_http_variable_value_t  *v;[m
[31m-    u_char                     *p, *s;[m
[31m-[m
[31m-    v = e->sp - 1;[m
[31m-[m
[31m-    dd("entering: \"%.*s\"", (int) v->len, v->data);[m
[31m-[m
[31m-    pge = (ngx_postgres_escape_t *) e->ip;[m
[31m-    e->ip += sizeof(ngx_postgres_escape_t);[m
[31m-[m
[31m-    if ((v == NULL) || (v->not_found)) {[m
[31m-        v->data = (u_char *) "NULL";[m
[31m-        v->len = sizeof("NULL") - 1;[m
[31m-        dd("returning (NULL)");[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (v->len == 0) {[m
[31m-        if (pge->empty) {[m
[31m-            v->data = (u_char *) "''";[m
[31m-            v->len = 2;[m
[31m-            dd("returning (empty/empty)");[m
[31m-            goto done;[m
[31m-        } else {[m
[31m-            v->data = (u_char *) "NULL";[m
[31m-            v->len = sizeof("NULL") - 1;[m
[31m-            dd("returning (empty/NULL)");[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = p = ngx_pnalloc(e->request->pool, 2 * v->len + 2);[m
[31m-    if (p == NULL) {[m
[31m-        e->ip = (u_char *) &ngx_postgres_script_exit_code;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        dd("returning (NGX_HTTP_INTERNAL_SERVER_ERROR)");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '\'';[m
[31m-    v->len = PQescapeString((char *) p, (const char *) v->data, v->len);[m
[31m-    p[v->len] = '\'';[m
[31m-    v->len += 2;[m
[31m-    v->data = s;[m
[31m-[m
[31m-    dd("returning");[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_escape.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_escape.h[m
[1mdeleted file mode 100644[m
[1mindex 4312de6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_escape.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_ESCAPE_H_[m
[31m-#define _NGX_POSTGRES_ESCAPE_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-void       ngx_postgres_escape_string(ngx_http_script_engine_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_ESCAPE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_handler.c[m
[1mdeleted file mode 100644[m
[1mindex cf8c1bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,410 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_handler.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_output.h"[m
[31m-#include "ngx_postgres_processor.h"[m
[31m-#include "ngx_postgres_util.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t   *pglcf;[m
[31m-    ngx_postgres_ctx_t        *pgctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_str_t                  host;[m
[31m-    ngx_url_t                  url;[m
[31m-    ngx_int_t                  rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-        /* TODO: add support for subrequest in memory by[m
[31m-         * emitting output into u->buffer instead */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: ngx_postgres module does not support"[m
[31m-                      " subrequests in memory");[m
[31m-[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pglcf->query.def == NULL) && !(pglcf->query.methods_set & r->method)) {[m
[31m-        if (pglcf->query.methods_set != 0) {[m
[31m-            dd("returning NGX_HTTP_NOT_ALLOWED");[m
[31m-            return NGX_HTTP_NOT_ALLOWED;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: missing \"postgres_query\" in location \"%V\"",[m
[31m-                      &clcf->name);[m
[31m-[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dd("returning rc:%d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) \[m
[31m-    && (((nginx_version >= 7063) && (nginx_version < 8000)) \[m
[31m-        || (nginx_version >= 8007))[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#else /* 0.7.x < 0.7.63, 0.8.x < 0.8.7 */[m
[31m-[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-#  if (NGX_THREADS)[m
[31m-    u->peer.lock = &r->connection->lock;[m
[31m-#  endif[m
[31m-    r->upstream = u;[m
[31m-#endif[m
[31m-[m
[31m-    if (pglcf->upstream_cv) {[m
[31m-        /* use complex value */[m
[31m-        if (ngx_http_complex_value(r, pglcf->upstream_cv, &host) != NGX_OK) {[m
[31m-            dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (host.len == 0) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: empty \"postgres_pass\" (was: \"%V\")"[m
[31m-                          " in location \"%V\"", &pglcf->upstream_cv->value,[m
[31m-                          &clcf->name);[m
[31m-[m
[31m-            dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-        url.host = host;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        pglcf->upstream.upstream = ngx_postgres_find_upstream(r, &url);[m
[31m-        if (pglcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: upstream name \"%V\" not found", &host);[m
[31m-[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgctx = ngx_pcalloc(r->pool, sizeof(ngx_postgres_ctx_t));[m
[31m-    if (pgctx == NULL) {[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     pgctx->response = NULL[m
[31m-     *     pgctx->var_query = { 0, NULL }[m
[31m-     *     pgctx->variables = NULL[m
[31m-     *     pgctx->status = 0[m
[31m-     */[m
[31m-[m
[31m-    pgctx->var_cols = NGX_ERROR;[m
[31m-    pgctx->var_rows = NGX_ERROR;[m
[31m-    pgctx->var_affected = NGX_ERROR;[m
[31m-[m
[31m-    if (pglcf->variables != NULL) {[m
[31m-        pgctx->variables = ngx_array_create(r->pool, pglcf->variables->nelts,[m
[31m-                                            sizeof(ngx_str_t));[m
[31m-        if (pgctx->variables == NULL) {[m
[31m-            dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* fake ngx_array_push'ing */[m
[31m-        pgctx->variables->nelts = pglcf->variables->nelts;[m
[31m-[m
[31m-        ngx_memzero(pgctx->variables->elts,[m
[31m-                    pgctx->variables->nelts * pgctx->variables->size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, pgctx, ngx_postgres_module);[m
[31m-[m
[31m-    u->schema.len = sizeof("postgres://") - 1;[m
[31m-    u->schema.data = (u_char *) "postgres://";[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_postgres_module;[m
[31m-[m
[31m-    u->conf = &pglcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_postgres_create_request;[m
[31m-    u->reinit_request = ngx_postgres_reinit_request;[m
[31m-    u->process_header = ngx_postgres_process_header;[m
[31m-    u->abort_request = ngx_postgres_abort_request;[m
[31m-    u->finalize_request = ngx_postgres_finalize_request;[m
[31m-[m
[31m-    /* we bypass the upstream input filter mechanism in[m
[31m-     * ngx_http_upstream_process_headers */[m
[31m-[m
[31m-    u->input_filter_init = ngx_postgres_input_filter_init;[m
[31m-    u->input_filter = ngx_postgres_input_filter;[m
[31m-    u->input_filter_ctx = NULL;[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8011)[m
[31m-    r->main->count++;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_init(r);[m
[31m-[m
[31m-    /* override the read/write event handler to our own */[m
[31m-    u->write_event_handler = ngx_postgres_wev_handler;[m
[31m-    u->read_event_handler = ngx_postgres_rev_handler;[m
[31m-[m
[31m-    /* a bit hack-ish way to return error response (clean-up part) */[m
[31m-    if ((u->peer.connection) && (u->peer.connection->fd == 0)) {[m
[31m-        c = u->peer.connection;[m
[31m-        u->peer.connection = NULL;[m
[31m-[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        if (c->pool) {[m
[31m-            ngx_destroy_pool(c->pool);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        ngx_postgres_upstream_finalize_request(r, u,[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-                                               NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-#else[m
[31m-            pgctx->status ? pgctx->status : NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_wev_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *pgxc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    u->request_sent = 1;[m
[31m-[m
[31m-    pgxc = u->peer.connection;[m
[31m-[m
[31m-    if (pgxc->write->timedout) {[m
[31m-        dd("postgres connection write timeout");[m
[31m-[m
[31m-        ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_postgres_upstream_test_connect(pgxc) != NGX_OK) {[m
[31m-        dd("postgres connection is broken");[m
[31m-[m
[31m-        ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_postgres_process_events(r);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_rev_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *pgxc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    u->request_sent = 1;[m
[31m-[m
[31m-    pgxc = u->peer.connection;[m
[31m-[m
[31m-    if (pgxc->read->timedout) {[m
[31m-        dd("postgres connection read timeout");[m
[31m-[m
[31m-        ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_postgres_upstream_test_connect(pgxc) != NGX_OK) {[m
[31m-        dd("postgres connection is broken");[m
[31m-[m
[31m-        ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_postgres_process_events(r);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    dd("entering");[m
[31m-[m
[31m-    r->upstream->request_bufs = NULL;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    /* override the read/write event handler to our own */[m
[31m-    u->write_event_handler = ngx_postgres_wev_handler;[m
[31m-    u->read_event_handler = ngx_postgres_rev_handler;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    dd("entering & returning (dummy function)");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-        ngx_postgres_output_chain(r, pgctx->response);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "postgres: ngx_postgres_process_header should not"[m
[31m-                  " be called by the upstream");[m
[31m-[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "postgres: ngx_postgres_input_filter_init should not"[m
[31m-                  " be called by the upstream");[m
[31m-[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_input_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "postgres: ngx_postgres_input_filter should not"[m
[31m-                  " be called by the upstream");[m
[31m-[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_handler.h[m
[1mdeleted file mode 100644[m
[1mindex 1b6715b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_HANDLER_H_[m
[31m-#define _NGX_POSTGRES_HANDLER_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_postgres_handler(ngx_http_request_t *);[m
[31m-void       ngx_postgres_wev_handler(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *);[m
[31m-void       ngx_postgres_rev_handler(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *);[m
[31m-ngx_int_t  ngx_postgres_create_request(ngx_http_request_t *);[m
[31m-ngx_int_t  ngx_postgres_reinit_request(ngx_http_request_t *);[m
[31m-void       ngx_postgres_abort_request(ngx_http_request_t *);[m
[31m-void       ngx_postgres_finalize_request(ngx_http_request_t *, ngx_int_t);[m
[31m-ngx_int_t  ngx_postgres_process_header(ngx_http_request_t *);[m
[31m-ngx_int_t  ngx_postgres_input_filter_init(void *);[m
[31m-ngx_int_t  ngx_postgres_input_filter(void *, ssize_t);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_HANDLER_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.c[m
[1mdeleted file mode 100644[m
[1mindex 6575338..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.c[m
[1m+++ /dev/null[m
[36m@@ -1,344 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * Copyright (C) 2008, Maxim Dounin[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_keepalive.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_keepalive_init(ngx_pool_t *pool,[m
[31m-    ngx_postgres_upstream_srv_conf_t *pgscf)[m
[31m-{[m
[31m-    ngx_postgres_keepalive_cache_t  *cached;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    cached = ngx_pcalloc(pool,[m
[31m-                 sizeof(ngx_postgres_keepalive_cache_t) * pgscf->max_cached);[m
[31m-    if (cached == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_init(&pgscf->cache);[m
[31m-    ngx_queue_init(&pgscf->free);[m
[31m-[m
[31m-    for (i = 0; i < pgscf->max_cached; i++) {[m
[31m-        ngx_queue_insert_head(&pgscf->free, &cached[i].queue);[m
[31m-        cached[i].srv_conf = pgscf;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_keepalive_get_peer_single(ngx_peer_connection_t *pc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgp,[m
[31m-    ngx_postgres_upstream_srv_conf_t *pgscf)[m
[31m-{[m
[31m-    ngx_postgres_keepalive_cache_t  *item;[m
[31m-    ngx_queue_t                     *q;[m
[31m-    ngx_connection_t                *c;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (!ngx_queue_empty(&pgscf->cache)) {[m
[31m-        dd("non-empty queue");[m
[31m-[m
[31m-        q = ngx_queue_head(&pgscf->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        ngx_queue_insert_head(&pgscf->free, q);[m
[31m-[m
[31m-        c->idle = 0;[m
[31m-        c->log = pc->log;[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        c->pool->log = pc->log;[m
[31m-#endif[m
[31m-        c->read->log = pc->log;[m
[31m-        c->write->log = pc->log;[m
[31m-[m
[31m-        pgp->name.data = item->name.data;[m
[31m-        pgp->name.len = item->name.len;[m
[31m-[m
[31m-        pgp->sockaddr = item->sockaddr;[m
[31m-[m
[31m-        pgp->pgconn = item->pgconn;[m
[31m-[m
[31m-        pc->connection = c;[m
[31m-        pc->cached = 1;[m
[31m-[m
[31m-        pc->name = &pgp->name;[m
[31m-[m
[31m-        pc->sockaddr = &pgp->sockaddr;[m
[31m-        pc->socklen = item->socklen;[m
[31m-[m
[31m-        dd("returning NGX_DONE");[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_keepalive_get_peer_multi(ngx_peer_connection_t *pc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgp,[m
[31m-    ngx_postgres_upstream_srv_conf_t *pgscf)[m
[31m-{[m
[31m-    ngx_postgres_keepalive_cache_t  *item;[m
[31m-    ngx_queue_t                     *q, *cache;[m
[31m-    ngx_connection_t                *c;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    cache = &pgscf->cache;[m
[31m-[m
[31m-    for (q = ngx_queue_head(cache);[m
[31m-         q != ngx_queue_sentinel(cache);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,[m
[31m-                item->socklen, pc->socklen) == 0)[m
[31m-        {[m
[31m-            ngx_queue_remove(q);[m
[31m-            ngx_queue_insert_head(&pgscf->free, q);[m
[31m-[m
[31m-            c->idle = 0;[m
[31m-            c->log = pc->log;[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-            c->pool->log = pc->log;[m
[31m-#endif[m
[31m-            c->read->log = pc->log;[m
[31m-            c->write->log = pc->log;[m
[31m-[m
[31m-            pc->connection = c;[m
[31m-            pc->cached = 1;[m
[31m-[m
[31m-            /* we do not need to resume the peer name[m
[31m-             * because we already take the right value outside */[m
[31m-[m
[31m-            pgp->pgconn = item->pgconn;[m
[31m-[m
[31m-            dd("returning NGX_DONE");[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_keepalive_free_peer(ngx_peer_connection_t *pc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgp,[m
[31m-    ngx_postgres_upstream_srv_conf_t *pgscf, ngx_uint_t  state)[m
[31m-{[m
[31m-    ngx_postgres_keepalive_cache_t  *item;[m
[31m-    ngx_queue_t                     *q;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_upstream_t             *u;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "postgres: free keepalive peer");[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED) {[m
[31m-        pgp->failed = 1;[m
[31m-    }[m
[31m-[m
[31m-    u = pgp->upstream;[m
[31m-[m
[31m-    if ((!pgp->failed) && (pc->connection != NULL)[m
[31m-        && (u->headers_in.status_n == NGX_HTTP_OK))[m
[31m-    {[m
[31m-        c = pc->connection;[m
[31m-[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        if (c->write->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-            if (ngx_del_event(c->write, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        pc->connection = NULL;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "postgres: free keepalive peer: saving connection %p",[m
[31m-                       c);[m
[31m-[m
[31m-        if (ngx_queue_empty(&pgscf->free)) {[m
[31m-            /* connection pool is already full */[m
[31m-[m
[31m-            q = ngx_queue_last(&pgscf->cache);[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t,[m
[31m-                                  queue);[m
[31m-[m
[31m-            ngx_postgres_upstream_free_connection(pc->log, item->connection,[m
[31m-                                                  item->pgconn, pgscf);[m
[31m-[m
[31m-        } else {[m
[31m-            q = ngx_queue_head(&pgscf->free);[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t,[m
[31m-                                  queue);[m
[31m-        }[m
[31m-[m
[31m-        item->connection = c;[m
[31m-        ngx_queue_insert_head(&pgscf->cache, q);[m
[31m-[m
[31m-        c->write->handler = ngx_postgres_keepalive_dummy_handler;[m
[31m-        c->read->handler = ngx_postgres_keepalive_close_handler;[m
[31m-[m
[31m-        c->data = item;[m
[31m-        c->idle = 1;[m
[31m-        c->log = ngx_cycle->log;[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        c->pool->log = ngx_cycle->log;[m
[31m-#endif[m
[31m-        c->read->log = ngx_cycle->log;[m
[31m-        c->write->log = ngx_cycle->log;[m
[31m-[m
[31m-        item->socklen = pc->socklen;[m
[31m-        ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);[m
[31m-[m
[31m-        item->pgconn = pgp->pgconn;[m
[31m-[m
[31m-        item->name.data = pgp->name.data;[m
[31m-        item->name.len = pgp->name.len;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_keepalive_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    dd("entering & returning (dummy handler)");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_keepalive_close_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf;[m
[31m-    ngx_postgres_keepalive_cache_t    *item;[m
[31m-    ngx_connection_t                  *c;[m
[31m-    PGresult                          *res;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    item = c->data;[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    if (PQconsumeInput(item->pgconn) && !PQisBusy(item->pgconn)) {[m
[31m-        res = PQgetResult(item->pgconn);[m
[31m-        if (res == NULL) {[m
[31m-            dd("returning");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        PQclear(res);[m
[31m-[m
[31m-        dd("received result on idle keepalive connection");[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "postgres: received result on idle keepalive connection");[m
[31m-    }[m
[31m-[m
[31m-close:[m
[31m-[m
[31m-    pgscf = item->srv_conf;[m
[31m-[m
[31m-    ngx_postgres_upstream_free_connection(ev->log, c, item->pgconn, pgscf);[m
[31m-[m
[31m-    ngx_queue_remove(&item->queue);[m
[31m-    ngx_queue_insert_head(&pgscf->free, &item->queue);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_keepalive_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf = data;[m
[31m-    ngx_postgres_keepalive_cache_t    *item;[m
[31m-    ngx_queue_t                       *q;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* ngx_queue_empty is broken when used on unitialized queue */[m
[31m-    if (pgscf->cache.prev == NULL) {[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* just to be on the safe-side */[m
[31m-    pgscf->max_cached = 0;[m
[31m-[m
[31m-    while (!ngx_queue_empty(&pgscf->cache)) {[m
[31m-        q = ngx_queue_head(&pgscf->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t,[m
[31m-                              queue);[m
[31m-[m
[31m-        dd("postgres: disconnecting %p", item->connection);[m
[31m-[m
[31m-        ngx_postgres_upstream_free_connection(item->connection->log,[m
[31m-                                              item->connection,[m
[31m-                                              item->pgconn, pgscf);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.h[m
[1mdeleted file mode 100644[m
[1mindex 31e024a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.h[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * Copyright (C) 2008, Maxim Dounin[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_KEEPALIVE_H_[m
[31m-#define _NGX_POSTGRES_KEEPALIVE_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_upstream.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_queue_t                        queue;[m
[31m-    ngx_postgres_upstream_srv_conf_t  *srv_conf;[m
[31m-    ngx_connection_t                  *connection;[m
[31m-    PGconn                            *pgconn;[m
[31m-    struct sockaddr                    sockaddr;[m
[31m-    socklen_t                          socklen;[m
[31m-    ngx_str_t                          name;[m
[31m-} ngx_postgres_keepalive_cache_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_postgres_keepalive_init(ngx_pool_t *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *);[m
[31m-ngx_int_t   ngx_postgres_keepalive_get_peer_single(ngx_peer_connection_t *,[m
[31m-                ngx_postgres_upstream_peer_data_t *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *);[m
[31m-ngx_int_t   ngx_postgres_keepalive_get_peer_multi(ngx_peer_connection_t *,[m
[31m-                ngx_postgres_upstream_peer_data_t *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *);[m
[31m-void        ngx_postgres_keepalive_free_peer(ngx_peer_connection_t *,[m
[31m-                ngx_postgres_upstream_peer_data_t *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *, ngx_uint_t);[m
[31m-void        ngx_postgres_keepalive_dummy_handler(ngx_event_t *);[m
[31m-void        ngx_postgres_keepalive_close_handler(ngx_event_t *);[m
[31m-void        ngx_postgres_keepalive_cleanup(void *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_KEEPALIVE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_module.c[m
[1mdeleted file mode 100644[m
[1mindex 365de00..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1336 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_escape.h"[m
[31m-#include "ngx_postgres_handler.h"[m
[31m-#include "ngx_postgres_keepalive.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_output.h"[m
[31m-#include "ngx_postgres_upstream.h"[m
[31m-#include "ngx_postgres_util.h"[m
[31m-#include "ngx_postgres_variable.h"[m
[31m-#include "ngx_postgres_rewrite.h"[m
[31m-[m
[31m-[m
[31m-#define NGX_CONF_TAKE34  (NGX_CONF_TAKE3|NGX_CONF_TAKE4)[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_postgres_module_commands[] = {[m
[31m-[m
[31m-    { ngx_string("postgres_server"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_postgres_conf_server,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_keepalive"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_postgres_conf_keepalive,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_postgres_conf_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_query"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|[m
[31m-          NGX_HTTP_LIF_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_postgres_conf_query,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_rewrite"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|[m
[31m-          NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_postgres_conf_rewrite,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_output"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|[m
[31m-          NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_postgres_conf_output,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_set"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE34,[m
[31m-      ngx_postgres_conf_set,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_escape"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_postgres_conf_escape,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_postgres_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_result_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_postgres_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-static ngx_http_variable_t ngx_postgres_module_variables[] = {[m
[31m-[m
[31m-    { ngx_string("postgres_columns"), NULL,[m
[31m-      ngx_postgres_variable_columns, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("postgres_rows"), NULL,[m
[31m-      ngx_postgres_variable_rows, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("postgres_affected"), NULL,[m
[31m-      ngx_postgres_variable_affected, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("postgres_query"), NULL,[m
[31m-      ngx_postgres_variable_query, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_module_t ngx_postgres_module_ctx = {[m
[31m-    ngx_postgres_add_variables,             /* preconfiguration */[m
[31m-    NULL,                                   /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                   /* create main configuration */[m
[31m-    NULL,                                   /* init main configuration */[m
[31m-[m
[31m-    ngx_postgres_create_upstream_srv_conf,  /* create server configuration */[m
[31m-    NULL,                                   /* merge server configuration */[m
[31m-[m
[31m-    ngx_postgres_create_loc_conf,           /* create location configuration */[m
[31m-    ngx_postgres_merge_loc_conf             /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-ngx_module_t ngx_postgres_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_postgres_module_ctx,      /* module context */[m
[31m-    ngx_postgres_module_commands,  /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-ngx_conf_bitmask_t ngx_postgres_http_methods[] = {[m
[31m-   { ngx_string("GET"),       NGX_HTTP_GET },[m
[31m-   { ngx_string("HEAD"),      NGX_HTTP_HEAD },[m
[31m-   { ngx_string("POST"),      NGX_HTTP_POST },[m
[31m-   { ngx_string("PUT"),       NGX_HTTP_PUT },[m
[31m-   { ngx_string("DELETE"),    NGX_HTTP_DELETE },[m
[31m-   { ngx_string("MKCOL"),     NGX_HTTP_MKCOL },[m
[31m-   { ngx_string("COPY"),      NGX_HTTP_COPY },[m
[31m-   { ngx_string("MOVE"),      NGX_HTTP_MOVE },[m
[31m-   { ngx_string("OPTIONS"),   NGX_HTTP_OPTIONS },[m
[31m-   { ngx_string("PROPFIND"),  NGX_HTTP_PROPFIND },[m
[31m-   { ngx_string("PROPPATCH"), NGX_HTTP_PROPPATCH },[m
[31m-   { ngx_string("LOCK"),      NGX_HTTP_LOCK },[m
[31m-   { ngx_string("UNLOCK"),    NGX_HTTP_UNLOCK },[m
[31m-#if defined(nginx_version) && (nginx_version >= 8041)[m
[31m-   { ngx_string("PATCH"),     NGX_HTTP_PATCH },[m
[31m-#endif[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-ngx_conf_enum_t ngx_postgres_upstream_mode_options[] = {[m
[31m-    { ngx_string("multi"),  0 },[m
[31m-    { ngx_string("single"), 1 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-ngx_conf_enum_t ngx_postgres_upstream_overflow_options[] = {[m
[31m-    { ngx_string("ignore"), 0 },[m
[31m-    { ngx_string("reject"), 1 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-ngx_conf_enum_t ngx_postgres_requirement_options[] = {[m
[31m-    { ngx_string("optional"), 0 },[m
[31m-    { ngx_string("required"), 1 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-ngx_postgres_rewrite_enum_t ngx_postgres_rewrite_handlers[] = {[m
[31m-    { ngx_string("no_changes"), 0, ngx_postgres_rewrite_changes },[m
[31m-    { ngx_string("changes"),    1, ngx_postgres_rewrite_changes },[m
[31m-    { ngx_string("no_rows"),    2, ngx_postgres_rewrite_rows },[m
[31m-    { ngx_string("rows"),       3, ngx_postgres_rewrite_rows },[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-ngx_postgres_output_enum_t ngx_postgres_output_handlers[] = {[m
[31m-    { ngx_string("none"),         0, NULL },[m
[31m-    { ngx_string("rds"),          0, ngx_postgres_output_rds },[m
[31m-    { ngx_string("text") ,        0, ngx_postgres_output_text },[m
[31m-    { ngx_string("value"),        0, ngx_postgres_output_value },[m
[31m-    { ngx_string("binary_value"), 1, ngx_postgres_output_value },[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    for (v = ngx_postgres_module_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-void *[m
[31m-ngx_postgres_create_upstream_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_postgres_upstream_srv_conf_t  *conf;[m
[31m-    ngx_pool_cleanup_t                *cln;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_postgres_upstream_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->peers = NULL[m
[31m-     *     conf->current = 0[m
[31m-     *     conf->servers = NULL[m
[31m-     *     conf->free = { NULL, NULL }[m
[31m-     *     conf->cache = { NULL, NULL }[m
[31m-     *     conf->active_conns = 0[m
[31m-     *     conf->reject = 0[m
[31m-     */[m
[31m-[m
[31m-    conf->pool = cf->pool;[m
[31m-[m
[31m-    /* enable keepalive (single) by default */[m
[31m-    conf->max_cached = 10;[m
[31m-    conf->single = 1;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    cln->handler = ngx_postgres_keepalive_cleanup;[m
[31m-    cln->data = conf;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-void *[m
[31m-ngx_postgres_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t  *conf;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_postgres_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.* = 0 / NULL[m
[31m-     *     conf->upstream_cv = NULL[m
[31m-     *     conf->query.methods_set = 0[m
[31m-     *     conf->query.methods = NULL[m
[31m-     *     conf->query.def = NULL[m
[31m-     *     conf->output_binary = 0[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->rewrites = NGX_CONF_UNSET_PTR;[m
[31m-    conf->output_handler = NGX_CONF_UNSET_PTR;[m
[31m-    conf->variables = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 1;[m
[31m-    conf->upstream.ignore_client_abort = 1;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t  *prev = parent;[m
[31m-    ngx_postgres_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 10000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 30000);[m
[31m-[m
[31m-    if ((conf->upstream.upstream == NULL) && (conf->upstream_cv == NULL)) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->upstream_cv = prev->upstream_cv;[m
[31m-    }[m
[31m-[m
[31m-    if ((conf->query.def == NULL) && (conf->query.methods == NULL)) {[m
[31m-        conf->query.methods_set = prev->query.methods_set;[m
[31m-        conf->query.methods = prev->query.methods;[m
[31m-        conf->query.def = prev->query.def;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->rewrites, prev->rewrites, NULL);[m
[31m-[m
[31m-    if (conf->output_handler == NGX_CONF_UNSET_PTR) {[m
[31m-        if (prev->output_handler == NGX_CONF_UNSET_PTR) {[m
[31m-            /* default */[m
[31m-            conf->output_handler = ngx_postgres_output_rds;[m
[31m-            conf->output_binary = 0;[m
[31m-        } else {[m
[31m-            /* merge */[m
[31m-            conf->output_handler = prev->output_handler;[m
[31m-            conf->output_binary = prev->output_binary;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->variables, prev->variables, NULL);[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m- * Based on: ngx_http_upstream.c/ngx_http_upstream_server[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- */[m
[31m-char *[m
[31m-ngx_postgres_conf_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf = conf;[m
[31m-    ngx_postgres_upstream_server_t    *pgs;[m
[31m-    ngx_http_upstream_srv_conf_t      *uscf;[m
[31m-    ngx_url_t                          u;[m
[31m-    ngx_uint_t                         i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (pgscf->servers == NULL) {[m
[31m-        pgscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                             sizeof(ngx_postgres_upstream_server_t));[m
[31m-        if (pgscf->servers == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        uscf->servers = pgscf->servers;[m
[31m-    }[m
[31m-[m
[31m-    pgs = ngx_array_push(pgscf->servers);[m
[31m-    if (pgs == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(pgs, sizeof(ngx_postgres_upstream_server_t));[m
[31m-[m
[31m-    /* parse the first name:port argument */[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = 5432; /* PostgreSQL default */[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "postgres: %s in upstream \"%V\"",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgs->addrs = u.addrs;[m
[31m-    pgs->naddrs = u.naddrs;[m
[31m-    pgs->port = u.port;[m
[31m-[m
[31m-    /* parse various options */[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "dbname=", sizeof("dbname=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            pgs->dbname.len = value[i].len - (sizeof("dbname=") - 1);[m
[31m-            pgs->dbname.data = &value[i].data[sizeof("dbname=") - 1];[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "user=", sizeof("user=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            pgs->user.len = value[i].len - (sizeof("user=") - 1);[m
[31m-            pgs->user.data = &value[i].data[sizeof("user=") - 1];[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "password=", sizeof("password=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            pgs->password.len = value[i].len - (sizeof("password=") - 1);[m
[31m-            pgs->password.data = &value[i].data[sizeof("password=") - 1];[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid parameter \"%V\" in"[m
[31m-                           " \"postgres_server\"", &value[i]);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_postgres_upstream_init;[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf = conf;[m
[31m-    ngx_conf_enum_t                   *e;[m
[31m-    ngx_uint_t                         i, j;[m
[31m-    ngx_int_t                          n;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (pgscf->max_cached != 10 /* default */) {[m
[31m-        dd("returning");[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if ((cf->args->nelts == 2) && (ngx_strcmp(value[1].data, "off") == 0)) {[m
[31m-        pgscf->max_cached = 0;[m
[31m-[m
[31m-        dd("returning NGX_CONF_OK");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", sizeof("max=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            value[i].len = value[i].len - (sizeof("max=") - 1);[m
[31m-            value[i].data = &value[i].data[sizeof("max=") - 1];[m
[31m-[m
[31m-            n = ngx_atoi(value[i].data, value[i].len);[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid \"max\" value \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pgscf->max_cached = (ngx_uint_t) n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "mode=", sizeof("mode=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            value[i].len = value[i].len - (sizeof("mode=") - 1);[m
[31m-            value[i].data = &value[i].data[sizeof("mode=") - 1];[m
[31m-[m
[31m-            e = ngx_postgres_upstream_mode_options;[m
[31m-            for (j = 0; e[j].name.len; j++) {[m
[31m-                if ((e[j].name.len == value[i].len)[m
[31m-                    && (ngx_strcasecmp(e[j].name.data, value[i].data) == 0))[m
[31m-                {[m
[31m-                    pgscf->single = e[j].value;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (e[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid \"mode\" value \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "overflow=", sizeof("overflow=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            value[i].len = value[i].len - (sizeof("overflow=") - 1);[m
[31m-            value[i].data = &value[i].data[sizeof("overflow=") - 1];[m
[31m-[m
[31m-            e = ngx_postgres_upstream_overflow_options;[m
[31m-            for (j = 0; e[j].name.len; j++) {[m
[31m-                if ((e[j].name.len == value[i].len)[m
[31m-                    && (ngx_strcasecmp(e[j].name.data, value[i].data) == 0))[m
[31m-                {[m
[31m-                    pgscf->reject = e[j].value;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (e[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid \"overflow\" value \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid parameter \"%V\" in"[m
[31m-                           " \"%V\" directive",[m
[31m-                           &value[i], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_postgres_loc_conf_t           *pglcf = conf;[m
[31m-    ngx_http_core_loc_conf_t          *clcf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_url_t                          url;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if ((pglcf->upstream.upstream != NULL) || (pglcf->upstream_cv != NULL)) {[m
[31m-        dd("returning");[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty upstream in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_postgres_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_variables_count(&value[1])) {[m
[31m-        /* complex value */[m
[31m-        dd("complex value");[m
[31m-[m
[31m-        pglcf->upstream_cv = ngx_palloc(cf->pool,[m
[31m-                                        sizeof(ngx_http_complex_value_t));[m
[31m-        if (pglcf->upstream_cv == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = pglcf->upstream_cv;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("returning NGX_CONF_OK");[m
[31m-        return NGX_CONF_OK;[m
[31m-    } else {[m
[31m-        /* simple value */[m
[31m-        dd("simple value");[m
[31m-[m
[31m-        ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-        url.url = value[1];[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        pglcf->upstream.upstream = ngx_http_upstream_add(cf, &url, 0);[m
[31m-        if (pglcf->upstream.upstream == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("returning NGX_CONF_OK");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_query(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_str_t                          sql = value[cf->args->nelts - 1];[m
[31m-    ngx_postgres_loc_conf_t           *pglcf = conf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_postgres_mixed_t              *query;[m
[31m-    ngx_conf_bitmask_t                *b;[m
[31m-    ngx_uint_t                         methods, i, j;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (sql.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty query in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        /* default query */[m
[31m-        dd("default query");[m
[31m-[m
[31m-        if (pglcf->query.def != NULL) {[m
[31m-            dd("returning");[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-[m
[31m-        pglcf->query.def = ngx_palloc(cf->pool, sizeof(ngx_postgres_mixed_t));[m
[31m-        if (pglcf->query.def == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        methods = 0xFFFF;[m
[31m-        query = pglcf->query.def;[m
[31m-    } else {[m
[31m-        /* method-specific query */[m
[31m-        dd("method-specific query");[m
[31m-[m
[31m-        methods = 0;[m
[31m-[m
[31m-        for (i = 1; i < cf->args->nelts - 1; i++) {[m
[31m-            b = ngx_postgres_http_methods;[m
[31m-            for (j = 0; b[j].name.len; j++) {[m
[31m-                if ((b[j].name.len == value[i].len)[m
[31m-                    && (ngx_strcasecmp(b[j].name.data, value[i].data) == 0))[m
[31m-                {[m
[31m-                    if (pglcf->query.methods_set & b[j].mask) {[m
[31m-                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                           "postgres: method \"%V\" is"[m
[31m-                                           " duplicate in \"%V\" directive",[m
[31m-                                           &value[i], &cmd->name);[m
[31m-[m
[31m-                        dd("returning NGX_CONF_ERROR");[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    methods |= b[j].mask;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid method \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (pglcf->query.methods == NULL) {[m
[31m-            pglcf->query.methods = ngx_array_create(cf->pool, 4,[m
[31m-                                       sizeof(ngx_postgres_mixed_t));[m
[31m-            if (pglcf->query.methods == NULL) {[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        query = ngx_array_push(pglcf->query.methods);[m
[31m-        if (query == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pglcf->query.methods_set |= methods;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_variables_count(&sql)) {[m
[31m-        /* complex value */[m
[31m-        dd("complex value");[m
[31m-[m
[31m-        query->key = methods;[m
[31m-[m
[31m-        query->cv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (query->cv == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &sql;[m
[31m-        ccv.complex_value = query->cv;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* simple value */[m
[31m-        dd("simple value");[m
[31m-[m
[31m-        query->key = methods;[m
[31m-        query->sv = sql;[m
[31m-        query->cv = NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                    *value = cf->args->elts;[m
[31m-    ngx_str_t                     what = value[cf->args->nelts - 2];[m
[31m-    ngx_str_t                     to = value[cf->args->nelts - 1];[m
[31m-    ngx_postgres_loc_conf_t      *pglcf = conf;[m
[31m-    ngx_postgres_rewrite_conf_t  *pgrcf;[m
[31m-    ngx_postgres_rewrite_t       *rewrite;[m
[31m-    ngx_postgres_rewrite_enum_t  *e;[m
[31m-    ngx_conf_bitmask_t           *b;[m
[31m-    ngx_uint_t                    methods, keep_body, i, j;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    e = ngx_postgres_rewrite_handlers;[m
[31m-    for (i = 0; e[i].name.len; i++) {[m
[31m-        if ((e[i].name.len == what.len)[m
[31m-            && (ngx_strcasecmp(e[i].name.data, what.data) == 0))[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (e[i].name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid condition \"%V\""[m
[31m-                           " in \"%V\" directive", &what, &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->rewrites == NGX_CONF_UNSET_PTR) {[m
[31m-        pglcf->rewrites = ngx_array_create(cf->pool, 2,[m
[31m-                                           sizeof(ngx_postgres_rewrite_conf_t));[m
[31m-        if (pglcf->rewrites == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    } else {[m
[31m-        pgrcf = pglcf->rewrites->elts;[m
[31m-        for (j = 0; j < pglcf->rewrites->nelts; j++) {[m
[31m-            if (pgrcf[j].key == e[i].key) {[m
[31m-                pgrcf = &pgrcf[j];[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgrcf = ngx_array_push(pglcf->rewrites);[m
[31m-    if (pgrcf == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(pgrcf, sizeof(ngx_postgres_rewrite_conf_t));[m
[31m-[m
[31m-    pgrcf->key = e[i].key;[m
[31m-    pgrcf->handler = e[i].handler;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        /* default rewrite */[m
[31m-        dd("default rewrite");[m
[31m-[m
[31m-        if (pgrcf->def != NULL) {[m
[31m-            dd("returning");[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-[m
[31m-        pgrcf->def = ngx_palloc(cf->pool, sizeof(ngx_postgres_rewrite_t));[m
[31m-        if (pgrcf->def == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        methods = 0xFFFF;[m
[31m-        rewrite = pgrcf->def;[m
[31m-    } else {[m
[31m-        /* method-specific rewrite */[m
[31m-        dd("method-specific rewrite");[m
[31m-[m
[31m-        methods = 0;[m
[31m-[m
[31m-        for (i = 1; i < cf->args->nelts - 2; i++) {[m
[31m-            b = ngx_postgres_http_methods;[m
[31m-            for (j = 0; b[j].name.len; j++) {[m
[31m-                if ((b[j].name.len == value[i].len)[m
[31m-                    && (ngx_strcasecmp(b[j].name.data, value[i].data) == 0))[m
[31m-                {[m
[31m-                    if (pgrcf->methods_set & b[j].mask) {[m
[31m-                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                           "postgres: method \"%V\" for"[m
[31m-                                           " condition \"%V\" is duplicate"[m
[31m-                                           " in \"%V\" directive",[m
[31m-                                           &value[i], &what, &cmd->name);[m
[31m-[m
[31m-                        dd("returning NGX_CONF_ERROR");[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    methods |= b[j].mask;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid method \"%V\" for"[m
[31m-                                   " condition \"%V\" in \"%V\" directive",[m
[31m-                                   &value[i], &what, &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (pgrcf->methods == NULL) {[m
[31m-            pgrcf->methods = ngx_array_create(cf->pool, 4,[m
[31m-                                              sizeof(ngx_postgres_rewrite_t));[m
[31m-            if (pgrcf->methods == NULL) {[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rewrite = ngx_array_push(pgrcf->methods);[m
[31m-        if (rewrite == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pgrcf->methods_set |= methods;[m
[31m-    }[m
[31m-[m
[31m-    if (to.data[0] == '=') {[m
[31m-        keep_body = 1;[m
[31m-        to.len--;[m
[31m-        to.data++;[m
[31m-    } else {[m
[31m-        keep_body = 0;[m
[31m-    }[m
[31m-[m
[31m-    rewrite->key = methods;[m
[31m-    rewrite->status = ngx_atoi(to.data, to.len);[m
[31m-    if ((rewrite->status == NGX_ERROR)[m
[31m-        || (rewrite->status < NGX_HTTP_OK)[m
[31m-        || (rewrite->status > NGX_HTTP_INSUFFICIENT_STORAGE)[m
[31m-        || ((rewrite->status >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-            && (rewrite->status < NGX_HTTP_BAD_REQUEST)))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid status value \"%V\" for"[m
[31m-                           " condition \"%V\" in \"%V\" directive",[m
[31m-                           &to, &what, &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (keep_body) {[m
[31m-        rewrite->status = -rewrite->status;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_output(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                   *value = cf->args->elts;[m
[31m-    ngx_postgres_loc_conf_t     *pglcf = conf;[m
[31m-    ngx_postgres_output_enum_t  *e;[m
[31m-    ngx_uint_t                   i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (pglcf->output_handler != NGX_CONF_UNSET_PTR) {[m
[31m-        dd("returning");[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    e = ngx_postgres_output_handlers;[m
[31m-    for (i = 0; e[i].name.len; i++) {[m
[31m-        if ((e[i].name.len == value[1].len)[m
[31m-            && (ngx_strcasecmp(e[i].name.data, value[1].data) == 0))[m
[31m-        {[m
[31m-            pglcf->output_handler = e[i].handler;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (e[i].name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid output format \"%V\""[m
[31m-                           " in \"%V\" directive", &value[1], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pglcf->output_binary = e[i].binary;[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                *value = cf->args->elts;[m
[31m-    ngx_postgres_loc_conf_t  *pglcf = conf;[m
[31m-    ngx_postgres_variable_t  *pgvar;[m
[31m-    ngx_conf_enum_t          *e;[m
[31m-    ngx_int_t                 idx;[m
[31m-    ngx_uint_t                i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (value[1].len < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty variable name in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid variable name \"%V\""[m
[31m-                           " in \"%V\" directive", &value[1], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value[1].len--;[m
[31m-    value[1].data++;[m
[31m-[m
[31m-    if (value[3].len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty column in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->variables == NGX_CONF_UNSET_PTR) {[m
[31m-        pglcf->variables = ngx_array_create(cf->pool, 4,[m
[31m-                                            sizeof(ngx_postgres_variable_t));[m
[31m-        if (pglcf->variables == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgvar = ngx_array_push(pglcf->variables);[m
[31m-    if (pgvar == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgvar->idx = pglcf->variables->nelts - 1;[m
[31m-[m
[31m-    pgvar->var = ngx_http_add_variable(cf, &value[1], 0);[m
[31m-    if (pgvar->var == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    idx = ngx_http_get_variable_index(cf, &value[1]);[m
[31m-    if (idx == NGX_ERROR) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Check if "$variable" was previously defined,[m
[31m-     * back-off even if it was marked as "CHANGEABLE".[m
[31m-     */[m
[31m-    if (pgvar->var->get_handler != NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: variable \"$%V\" is duplicate"[m
[31m-                           " in \"%V\" directive", &value[1], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgvar->var->get_handler = ngx_postgres_variable_get_custom;[m
[31m-    pgvar->var->data = (uintptr_t) pgvar;[m
[31m-[m
[31m-    pgvar->value.row = ngx_atoi(value[2].data, value[2].len);[m
[31m-    if (pgvar->value.row == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid row number \"%V\""[m
[31m-                           " in \"%V\" directive", &value[2], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgvar->value.column = ngx_atoi(value[3].data, value[3].len);[m
[31m-    if (pgvar->value.column == NGX_ERROR) {[m
[31m-        /* get column by name */[m
[31m-        pgvar->value.col_name = ngx_pnalloc(cf->pool, value[3].len + 1);[m
[31m-        if (pgvar->value.col_name == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_cpystrn(pgvar->value.col_name,[m
[31m-                           value[3].data, value[3].len + 1);[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 4) {[m
[31m-        /* default value */[m
[31m-        pgvar->value.required = 0;[m
[31m-    } else {[m
[31m-        /* user-specified value */[m
[31m-        e = ngx_postgres_requirement_options;[m
[31m-        for (i = 0; e[i].name.len; i++) {[m
[31m-            if ((e[i].name.len == value[4].len)[m
[31m-                && (ngx_strcasecmp(e[i].name.data, value[4].data) == 0))[m
[31m-            {[m
[31m-                pgvar->value.required = e[i].value;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (e[i].name.len == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "postgres: invalid requirement option \"%V\""[m
[31m-                               " in \"%V\" directive", &value[4], &cmd->name);[m
[31m-[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m- * Based on: ngx_http_rewrite_module.c/ngx_http_rewrite_set[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- */[m
[31m-char *[m
[31m-ngx_postgres_conf_escape(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                           *value = cf->args->elts;[m
[31m-    ngx_str_t                            src = value[cf->args->nelts - 1];[m
[31m-    ngx_int_t                            index;[m
[31m-    ngx_http_variable_t                 *v;[m
[31m-    ngx_http_script_var_code_t          *vcode;[m
[31m-    ngx_http_script_var_handler_code_t  *vhcode;[m
[31m-    ngx_postgres_rewrite_loc_conf_t     *rlcf;[m
[31m-    ngx_postgres_escape_t               *pge;[m
[31m-    ngx_str_t                            dst;[m
[31m-    ngx_uint_t                           empty;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if ((src.len != 0) && (src.data[0] == '=')) {[m
[31m-        empty = 1;[m
[31m-        src.len--;[m
[31m-        src.data++;[m
[31m-    } else {[m
[31m-        empty = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (src.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty value in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        dst = src;[m
[31m-    } else {[m
[31m-        dst = value[1];[m
[31m-    }[m
[31m-[m
[31m-    if (dst.len < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty variable name in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (dst.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid variable name \"%V\""[m
[31m-                           " in \"%V\" directive", &dst, &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dst.len--;[m
[31m-    dst.data++;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &dst, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, &dst);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->get_handler == NULL[m
[31m-        && ngx_strncasecmp(dst.data, (u_char *) "http_", 5) != 0[m
[31m-        && ngx_strncasecmp(dst.data, (u_char *) "sent_http_", 10) != 0[m
[31m-        && ngx_strncasecmp(dst.data, (u_char *) "upstream_http_", 14) != 0)[m
[31m-    {[m
[31m-        v->get_handler = ngx_postgres_rewrite_var;[m
[31m-        v->data = index;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (ngx_postgres_rewrite_value(cf, rlcf, &src) != NGX_CONF_OK) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pge = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                     sizeof(ngx_postgres_escape_t));[m
[31m-    if (pge == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pge->code = ngx_postgres_escape_string;[m
[31m-    pge->empty = empty;[m
[31m-[m
[31m-    if (v->set_handler) {[m
[31m-        vhcode = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                   sizeof(ngx_http_script_var_handler_code_t));[m
[31m-        if (vhcode == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        vhcode->code = ngx_http_script_var_set_handler_code;[m
[31m-        vhcode->handler = v->set_handler;[m
[31m-        vhcode->data = v->data;[m
[31m-[m
[31m-        dd("returning NGX_CONF_OK");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    vcode = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                       sizeof(ngx_http_script_var_code_t));[m
[31m-    if (vcode == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vcode->code = ngx_http_script_set_var_code;[m
[31m-    vcode->index = (uintptr_t) index;[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_postgres_find_upstream(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t   *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t   **uscfp;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if ((uscfp[i]->host.len != url->host.len)[m
[31m-            || (ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-                                url->host.len) != 0))[m
[31m-        {[m
[31m-            dd("host doesn't match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            dd("port doesn't match: %d != %d",[m
[31m-               (int) uscfp[i]->port, (int) url->port);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && url->default_port[m
[31m-            && (uscfp[i]->default_port != url->default_port))[m
[31m-        {[m
[31m-            dd("default_port doesn't match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NULL");[m
[31m-    return NULL;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_module.h[m
[1mdeleted file mode 100644[m
[1mindex 03f49fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,193 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_MODULE_H_[m
[31m-#define _NGX_POSTGRES_MODULE_H_[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_postgres_module;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt             code;[m
[31m-    ngx_uint_t                          empty;[m
[31m-} ngx_postgres_escape_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_str_t                           sv;[m
[31m-    ngx_http_complex_value_t           *cv;[m
[31m-} ngx_postgres_mixed_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_int_t                           status;[m
[31m-} ngx_postgres_rewrite_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                           row;[m
[31m-    ngx_int_t                           column;[m
[31m-    u_char                             *col_name;[m
[31m-    ngx_uint_t                          required;[m
[31m-} ngx_postgres_value_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          idx;[m
[31m-    ngx_http_variable_t                *var;[m
[31m-    ngx_postgres_value_t                value;[m
[31m-} ngx_postgres_variable_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          methods_set;[m
[31m-    ngx_array_t                        *methods; /* method-specific */[m
[31m-    ngx_postgres_mixed_t               *def;     /* default */[m
[31m-} ngx_postgres_query_conf_t;[m
[31m-[m
[31m-typedef struct ngx_postgres_rewrite_conf_s ngx_postgres_rewrite_conf_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_postgres_rewrite_handler_pt)[m
[31m-    (ngx_http_request_t *, ngx_postgres_rewrite_conf_t *);[m
[31m-[m
[31m-struct ngx_postgres_rewrite_conf_s {[m
[31m-    /* condition */[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_postgres_rewrite_handler_pt     handler;[m
[31m-    /* methods */[m
[31m-    ngx_uint_t                          methods_set;[m
[31m-    ngx_array_t                        *methods; /* method-specific */[m
[31m-    ngx_postgres_rewrite_t             *def;     /* default */[m
[31m-};[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                           name;[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_postgres_rewrite_handler_pt     handler;[m
[31m-} ngx_postgres_rewrite_enum_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_postgres_output_handler_pt)[m
[31m-    (ngx_http_request_t *, PGresult *);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                           name;[m
[31m-    unsigned                            binary:1;[m
[31m-    ngx_postgres_output_handler_pt      handler;[m
[31m-} ngx_postgres_output_enum_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-#if defined(nginx_version) && (nginx_version >= 8022)[m
[31m-    ngx_addr_t                         *addrs;[m
[31m-#else[m
[31m-    ngx_peer_addr_t                    *addrs;[m
[31m-#endif[m
[31m-    ngx_uint_t                          naddrs;[m
[31m-    in_port_t                           port;[m
[31m-    ngx_str_t                           dbname;[m
[31m-    ngx_str_t                           user;[m
[31m-    ngx_str_t                           password;[m
[31m-} ngx_postgres_upstream_server_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct sockaddr                    *sockaddr;[m
[31m-    socklen_t                           socklen;[m
[31m-    ngx_str_t                           name;[m
[31m-    ngx_str_t                           host;[m
[31m-    in_port_t                           port;[m
[31m-    ngx_str_t                           dbname;[m
[31m-    ngx_str_t                           user;[m
[31m-    ngx_str_t                           password;[m
[31m-} ngx_postgres_upstream_peer_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          single;[m
[31m-    ngx_uint_t                          number;[m
[31m-    ngx_str_t                          *name;[m
[31m-    ngx_postgres_upstream_peer_t        peer[1];[m
[31m-} ngx_postgres_upstream_peers_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_postgres_upstream_peers_t      *peers;[m
[31m-    ngx_uint_t                          current;[m
[31m-    ngx_array_t                        *servers;[m
[31m-    ngx_pool_t                         *pool;[m
[31m-    /* keepalive */[m
[31m-    ngx_flag_t                          single;[m
[31m-    ngx_queue_t                         free;[m
[31m-    ngx_queue_t                         cache;[m
[31m-    ngx_uint_t                          active_conns;[m
[31m-    ngx_uint_t                          max_cached;[m
[31m-    ngx_uint_t                          reject;[m
[31m-} ngx_postgres_upstream_srv_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* upstream */[m
[31m-    ngx_http_upstream_conf_t            upstream;[m
[31m-    ngx_http_complex_value_t           *upstream_cv;[m
[31m-    /* queries */[m
[31m-    ngx_postgres_query_conf_t           query;[m
[31m-    /* rewrites */[m
[31m-    ngx_array_t                        *rewrites;[m
[31m-    /* output */[m
[31m-    ngx_postgres_output_handler_pt      output_handler;[m
[31m-    unsigned                            output_binary:1;[m
[31m-    /* custom variables */[m
[31m-    ngx_array_t                        *variables;[m
[31m-} ngx_postgres_loc_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t                        *response;[m
[31m-    ngx_int_t                           var_cols;[m
[31m-    ngx_int_t                           var_rows;[m
[31m-    ngx_int_t                           var_affected;[m
[31m-    ngx_str_t                           var_query;[m
[31m-    ngx_array_t                        *variables;[m
[31m-    ngx_int_t                           status;[m
[31m-} ngx_postgres_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_postgres_add_variables(ngx_conf_t *);[m
[31m-void       *ngx_postgres_create_upstream_srv_conf(ngx_conf_t *);[m
[31m-void       *ngx_postgres_create_loc_conf(ngx_conf_t *);[m
[31m-char       *ngx_postgres_merge_loc_conf(ngx_conf_t *, void *, void *);[m
[31m-char       *ngx_postgres_conf_server(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_keepalive(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_pass(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_query(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_rewrite(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_output(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_set(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_escape(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t  *ngx_postgres_find_upstream(ngx_http_request_t *,[m
[31m-                                   ngx_url_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_MODULE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_output.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_output.c[m
[1mdeleted file mode 100644[m
[1mindex 9fa5481..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_output.c[m
[1m+++ /dev/null[m
[36m@@ -1,648 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_output.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_output_value(ngx_http_request_t *r, PGresult *res)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t        *pgctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    size_t                     size;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx->var_rows != 1) || (pgctx->var_cols != 1)) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: \"postgres_output value\" received %d value(s)"[m
[31m-                      " instead of expected single value in location \"%V\"",[m
[31m-                      pgctx->var_rows * pgctx->var_cols, &clcf->name);[m
[31m-[m
[31m-        dd("returning NGX_DONE, status NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        pgctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (PQgetisnull(res, 0, 0)) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: \"postgres_output value\" received NULL value"[m
[31m-                      " in location \"%V\"", &clcf->name);[m
[31m-[m
[31m-        dd("returning NGX_DONE, status NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        pgctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    size = PQgetlength(res, 0, 0);[m
[31m-    if (size == 0) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: \"postgres_output value\" received empty value"[m
[31m-                      " in location \"%V\"", &clcf->name);[m
[31m-[m
[31m-        dd("returning NGX_DONE, status NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        pgctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, PQgetvalue(res, 0, 0), size);[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    /* set output response */[m
[31m-    pgctx->response = cl;[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_output_text(ngx_http_request_t *r, PGresult *res)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t        *pgctx;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  col_count, row_count, col, row;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    col_count = pgctx->var_cols;[m
[31m-    row_count = pgctx->var_rows;[m
[31m-[m
[31m-    /* pre-calculate total length up-front for single buffer allocation */[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (row = 0; row < row_count; row++) {[m
[31m-        for (col = 0; col < col_count; col++) {[m
[31m-            if (PQgetisnull(res, row, col)) {[m
[31m-                size += sizeof("(null)") - 1;[m
[31m-            } else {[m
[31m-                size += PQgetlength(res, row, col);  /* field string data */[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size += row_count * col_count - 1;               /* delimiters */[m
[31m-[m
[31m-    if ((row_count == 0) || (size == 0)) {[m
[31m-        dd("returning NGX_DONE (empty result)");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-    for (row = 0; row < row_count; row++) {[m
[31m-        for (col = 0; col < col_count; col++) {[m
[31m-            if (PQgetisnull(res, row, col)) {[m
[31m-                b->last = ngx_copy(b->last, "(null)", sizeof("(null)") - 1);[m
[31m-            } else {[m
[31m-                size = PQgetlength(res, row, col);[m
[31m-                if (size) {[m
[31m-                    b->last = ngx_copy(b->last, PQgetvalue(res, row, col),[m
[31m-                                       size);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if ((row != row_count - 1) || (col != col_count - 1)) {[m
[31m-                b->last = ngx_copy(b->last, "\n", 1);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    /* set output response */[m
[31m-    pgctx->response = cl;[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_output_rds(ngx_http_request_t *r, PGresult *res)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-    ngx_chain_t         *first, *last;[m
[31m-    ngx_int_t            col_count, row_count, aff_count, row;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    col_count = pgctx->var_cols;[m
[31m-    row_count = pgctx->var_rows;[m
[31m-    aff_count = (pgctx->var_affected == NGX_ERROR) ? 0 : pgctx->var_affected;[m
[31m-[m
[31m-    /* render header */[m
[31m-    first = last = ngx_postgres_render_rds_header(r, r->pool, res, col_count,[m
[31m-                                                  aff_count);[m
[31m-    if (last == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PQresultStatus(res) != PGRES_TUPLES_OK) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /* render columns */[m
[31m-    last->next = ngx_postgres_render_rds_columns(r, r->pool, res, col_count);[m
[31m-    if (last->next == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-    last = last->next;[m
[31m-[m
[31m-    /* render rows */[m
[31m-    for (row = 0; row < row_count; row++) {[m
[31m-        last->next = ngx_postgres_render_rds_row(r, r->pool, res, col_count,[m
[31m-                                                 row, (row == row_count - 1));[m
[31m-        if (last->next == NULL) {[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        last = last->next;[m
[31m-    }[m
[31m-[m
[31m-    /* render row terminator (for empty result-set only) */[m
[31m-    if (row == 0) {[m
[31m-        last->next = ngx_postgres_render_rds_row_terminator(r, r->pool);[m
[31m-        if (last->next == NULL) {[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        last = last->next;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    last->next = NULL;[m
[31m-[m
[31m-    /* set output response */[m
[31m-    pgctx->response = first;[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_postgres_render_rds_header(ngx_http_request_t *r, ngx_pool_t *pool,[m
[31m-    PGresult *res, ngx_int_t col_count, ngx_int_t aff_count)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_buf_t    *b;[m
[31m-    size_t        size;[m
[31m-    char         *errstr;[m
[31m-    size_t        errstr_len;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    errstr = PQresultErrorMessage(res);[m
[31m-    errstr_len = ngx_strlen(errstr);[m
[31m-[m
[31m-    size = sizeof(uint8_t)        /* endian type */[m
[31m-         + sizeof(uint32_t)       /* format version */[m
[31m-         + sizeof(uint8_t)        /* result type */[m
[31m-         + sizeof(uint16_t)       /* standard error code */[m
[31m-         + sizeof(uint16_t)       /* driver-specific error code */[m
[31m-         + sizeof(uint16_t)       /* driver-specific error string length */[m
[31m-         + (uint16_t) errstr_len  /* driver-specific error string data */[m
[31m-         + sizeof(uint64_t)       /* rows affected */[m
[31m-         + sizeof(uint64_t)       /* insert id */[m
[31m-         + sizeof(uint16_t)       /* column count */[m
[31m-         ;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-#if NGX_HAVE_LITTLE_ENDIAN[m
[31m-    *b->last++ = 0;[m
[31m-#else[m
[31m-    *b->last++ = 1;[m
[31m-#endif[m
[31m-[m
[31m-    *(uint32_t *) b->last = (uint32_t) resty_dbd_stream_version;[m
[31m-    b->last += sizeof(uint32_t);[m
[31m-[m
[31m-    *b->last++ = 0;[m
[31m-[m
[31m-    *(uint16_t *) b->last = (uint16_t) 0;[m
[31m-    b->last += sizeof(uint16_t);[m
[31m-[m
[31m-    *(uint16_t *) b->last = (uint16_t) PQresultStatus(res);[m
[31m-    b->last += sizeof(uint16_t);[m
[31m-[m
[31m-    *(uint16_t *) b->last = (uint16_t) errstr_len;[m
[31m-    b->last += sizeof(uint16_t);[m
[31m-[m
[31m-    if (errstr_len) {[m
[31m-        b->last = ngx_copy(b->last, (u_char *) errstr, errstr_len);[m
[31m-    }[m
[31m-[m
[31m-    *(uint64_t *) b->last = (uint64_t) aff_count;[m
[31m-    b->last += sizeof(uint64_t);[m
[31m-[m
[31m-    *(uint64_t *) b->last = (uint64_t) PQoidValue(res);[m
[31m-    b->last += sizeof(uint64_t);[m
[31m-[m
[31m-    *(uint16_t *) b->last = (uint16_t) col_count;[m
[31m-    b->last += sizeof(uint16_t);[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_postgres_render_rds_columns(ngx_http_request_t *r, ngx_pool_t *pool,[m
[31m-    PGresult *res, ngx_int_t col_count)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_buf_t    *b;[m
[31m-    size_t        size;[m
[31m-    ngx_int_t     col;[m
[31m-    Oid           col_type;[m
[31m-    char         *col_name;[m
[31m-    size_t        col_name_len;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* pre-calculate total length up-front for single buffer allocation */[m
[31m-    size = col_count[m
[31m-         * (sizeof(uint16_t)    /* standard column type */[m
[31m-            + sizeof(uint16_t)  /* driver-specific column type */[m
[31m-            + sizeof(uint16_t)  /* column name string length */[m
[31m-           )[m
[31m-         ;[m
[31m-[m
[31m-    for (col = 0; col < col_count; col++) {[m
[31m-        size += ngx_strlen(PQfname(res, col));  /* column name string data */[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-    for (col = 0; col < col_count; col++) {[m
[31m-        col_type = PQftype(res, col);[m
[31m-        col_name = PQfname(res, col);[m
[31m-        col_name_len = (uint16_t) ngx_strlen(col_name);[m
[31m-[m
[31m-        *(uint16_t *) b->last = (uint16_t) ngx_postgres_rds_col_type(col_type);[m
[31m-        b->last += sizeof(uint16_t);[m
[31m-[m
[31m-        *(uint16_t *) b->last = col_type;[m
[31m-        b->last += sizeof(uint16_t);[m
[31m-[m
[31m-        *(uint16_t *) b->last = col_name_len;[m
[31m-        b->last += sizeof(uint16_t);[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, col_name, col_name_len);[m
[31m-    }[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_postgres_render_rds_row(ngx_http_request_t *r, ngx_pool_t *pool,[m
[31m-    PGresult *res, ngx_int_t col_count, ngx_int_t row, ngx_int_t last_row)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_buf_t    *b;[m
[31m-    size_t        size;[m
[31m-    ngx_int_t     col;[m
[31m-[m
[31m-    dd("entering, row:%d", (int) row);[m
[31m-[m
[31m-    /* pre-calculate total length up-front for single buffer allocation */[m
[31m-    size = sizeof(uint8_t)                 /* row number */[m
[31m-         + (col_count * sizeof(uint32_t))  /* field string length */[m
[31m-         ;[m
[31m-[m
[31m-    if (last_row) {[m
[31m-        size += sizeof(uint8_t);[m
[31m-    }[m
[31m-[m
[31m-    for (col = 0; col < col_count; col++) {[m
[31m-        size += PQgetlength(res, row, col);  /* field string data */[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-    *b->last++ = (uint8_t) 1; /* valid row */[m
[31m-[m
[31m-    for (col = 0; col < col_count; col++) {[m
[31m-        if (PQgetisnull(res, row, col)) {[m
[31m-            *(uint32_t *) b->last = (uint32_t) -1;[m
[31m-             b->last += sizeof(uint32_t);[m
[31m-        } else {[m
[31m-            size = PQgetlength(res, row, col);[m
[31m-            *(uint32_t *) b->last = (uint32_t) size;[m
[31m-            b->last += sizeof(uint32_t);[m
[31m-[m
[31m-            if (size) {[m
[31m-                b->last = ngx_copy(b->last, PQgetvalue(res, row, col), size);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last_row) {[m
[31m-        *b->last++ = (uint8_t) 0; /* row terminator */[m
[31m-    }[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_postgres_render_rds_row_terminator(ngx_http_request_t *r, ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_buf_t    *b;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, sizeof(uint8_t));[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-    *b->last++ = (uint8_t) 0; /* row terminator */[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_output_chain(ngx_http_request_t *r, ngx_chain_t *cl)[m
[31m-{[m
[31m-    ngx_http_upstream_t       *u = r->upstream;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_postgres_loc_conf_t   *pglcf;[m
[31m-    ngx_postgres_ctx_t        *pgctx;[m
[31m-    ngx_int_t                  rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (!r->header_sent) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-[m
[31m-        pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-        pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-        r->headers_out.status = pgctx->status ? ngx_abs(pgctx->status)[m
[31m-                                              : NGX_HTTP_OK;[m
[31m-[m
[31m-        if (pglcf->output_handler == &ngx_postgres_output_rds) {[m
[31m-            /* RDS for output rds */[m
[31m-            r->headers_out.content_type.data = (u_char *) rds_content_type;[m
[31m-            r->headers_out.content_type.len = rds_content_type_len;[m
[31m-            r->headers_out.content_type_len = rds_content_type_len;[m
[31m-        } else if (pglcf->output_handler != NULL) {[m
[31m-            /* default type for output value|row */[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            r->headers_out.content_type = clcf->default_type;[m
[31m-            r->headers_out.content_type_len = clcf->default_type.len;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-        rc = ngx_http_send_header(r);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-            dd("returning rc:%d", (int) rc);[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NGX_DONE");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, cl);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        dd("returning rc:%d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-    ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs, &cl,[m
[31m-                            u->output.tag);[m
[31m-#else[m
[31m-    ngx_chain_update_chains(&u->free_bufs, &u->busy_bufs, &cl, u->output.tag);[m
[31m-#endif[m
[31m-[m
[31m-    dd("returning rc:%d", (int) rc);[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-rds_col_type_t[m
[31m-ngx_postgres_rds_col_type(Oid col_type)[m
[31m-{[m
[31m-    switch (col_type) {[m
[31m-    case 20: /* int8 */[m
[31m-        return rds_col_type_bigint;[m
[31m-    case 1560: /* bit */[m
[31m-        return rds_col_type_bit;[m
[31m-    case 1562: /* varbit */[m
[31m-        return rds_col_type_bit_varying;[m
[31m-    case 16: /* bool */[m
[31m-        return rds_col_type_bool;[m
[31m-    case 18: /* char */[m
[31m-        return rds_col_type_char;[m
[31m-    case 19: /* name */[m
[31m-        /* FALLTROUGH */[m
[31m-    case 25: /* text */[m
[31m-        /* FALLTROUGH */[m
[31m-    case 1043: /* varchar */[m
[31m-        return rds_col_type_varchar;[m
[31m-    case 1082: /* date */[m
[31m-        return rds_col_type_date;[m
[31m-    case 701: /* float8 */[m
[31m-        return rds_col_type_double;[m
[31m-    case 23: /* int4 */[m
[31m-        return rds_col_type_integer;[m
[31m-    case 1186: /* interval */[m
[31m-        return rds_col_type_interval;[m
[31m-    case 1700: /* numeric */[m
[31m-        return rds_col_type_decimal;[m
[31m-    case 700: /* float4 */[m
[31m-        return rds_col_type_real;[m
[31m-    case 21: /* int2 */[m
[31m-        return rds_col_type_smallint;[m
[31m-    case 1266: /* timetz */[m
[31m-        return rds_col_type_time_with_time_zone;[m
[31m-    case 1083: /* time */[m
[31m-        return rds_col_type_time;[m
[31m-    case 1184: /* timestamptz */[m
[31m-        return rds_col_type_timestamp_with_time_zone;[m
[31m-    case 1114: /* timestamp */[m
[31m-        return rds_col_type_timestamp;[m
[31m-    case 142: /* xml */[m
[31m-        return rds_col_type_xml;[m
[31m-    case 17: /* bytea */[m
[31m-        return rds_col_type_blob;[m
[31m-    default:[m
[31m-        return rds_col_type_unknown;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_output.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_output.h[m
[1mdeleted file mode 100644[m
[1mindex a5115c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_output.h[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_OUTPUT_H_[m
[31m-#define _NGX_POSTGRES_OUTPUT_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "resty_dbd_stream.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t        ngx_postgres_output_value(ngx_http_request_t *, PGresult *);[m
[31m-ngx_int_t        ngx_postgres_output_text(ngx_http_request_t *, PGresult *);[m
[31m-ngx_int_t        ngx_postgres_output_rds(ngx_http_request_t *, PGresult *);[m
[31m-ngx_chain_t     *ngx_postgres_render_rds_header(ngx_http_request_t *,[m
[31m-                     ngx_pool_t *, PGresult *, ngx_int_t, ngx_int_t);[m
[31m-ngx_chain_t     *ngx_postgres_render_rds_columns(ngx_http_request_t *,[m
[31m-                     ngx_pool_t *, PGresult *, ngx_int_t);[m
[31m-ngx_chain_t     *ngx_postgres_render_rds_row(ngx_http_request_t *, ngx_pool_t *,[m
[31m-                     PGresult *, ngx_int_t, ngx_int_t, ngx_int_t);[m
[31m-ngx_chain_t     *ngx_postgres_render_rds_row_terminator(ngx_http_request_t *,[m
[31m-                     ngx_pool_t *);[m
[31m-ngx_int_t        ngx_postgres_output_chain(ngx_http_request_t *, ngx_chain_t *);[m
[31m-rds_col_type_t   ngx_postgres_rds_col_type(Oid);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_OUTPUT_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_processor.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_processor.c[m
[1mdeleted file mode 100644[m
[1mindex d25c054..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_processor.c[m
[1m+++ /dev/null[m
[36m@@ -1,514 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_output.h"[m
[31m-#include "ngx_postgres_processor.h"[m
[31m-#include "ngx_postgres_util.h"[m
[31m-#include "ngx_postgres_variable.h"[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_process_events(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_postgres_upstream_peer_data_t  *pgdt;[m
[31m-    ngx_connection_t                   *pgxc;[m
[31m-    ngx_http_upstream_t                *u;[m
[31m-    ngx_int_t                           rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pgxc = u->peer.connection;[m
[31m-    pgdt = u->peer.data;[m
[31m-[m
[31m-    if (!ngx_postgres_upstream_is_my_peer(&u->peer)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: trying to connect to something that"[m
[31m-                      " is not PostgreSQL database");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: process events");[m
[31m-[m
[31m-    switch (pgdt->state) {[m
[31m-    case state_db_connect:[m
[31m-        dd("state_db_connect");[m
[31m-        rc = ngx_postgres_upstream_connect(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    case state_db_send_query:[m
[31m-        dd("state_db_send_query");[m
[31m-        rc = ngx_postgres_upstream_send_query(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    case state_db_get_result:[m
[31m-        dd("state_db_get_result");[m
[31m-        rc = ngx_postgres_upstream_get_result(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    case state_db_get_ack:[m
[31m-        dd("state_db_get_ack");[m
[31m-        rc = ngx_postgres_upstream_get_ack(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    case state_db_idle:[m
[31m-        dd("state_db_idle, re-using keepalive connection");[m
[31m-        pgxc->log->action = "sending query to PostgreSQL database";[m
[31m-        pgdt->state = state_db_send_query;[m
[31m-        rc = ngx_postgres_upstream_send_query(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    default:[m
[31m-        dd("unknown state:%d", pgdt->state);[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: unknown state:%d", pgdt->state);[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_postgres_upstream_finalize_request(r, u, rc);[m
[31m-    } else if (rc == NGX_ERROR) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_connect(ngx_http_request_t *r, ngx_connection_t *pgxc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    PostgresPollingStatusType  pgrc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgrc = PQconnectPoll(pgdt->pgconn);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: polling while connecting, rc:%d", (int) pgrc);[m
[31m-[m
[31m-    if (pgrc == PGRES_POLLING_READING || pgrc == PGRES_POLLING_WRITING) {[m
[31m-[m
[31m-        /*[m
[31m-         * Fix for Linux issue found by chaoslawful (via agentzh):[m
[31m-         * "According to the source of libpq (around fe-connect.c:1215), during[m
[31m-         *  the state switch from CONNECTION_STARTED to CONNECTION_MADE, there's[m
[31m-         *  no socket read/write operations (just a plain getsockopt call and a[m
[31m-         *  getsockname call). Therefore, for edge-triggered event model, we[m
[31m-         *  have to call PQconnectPoll one more time (immediately) when we see[m
[31m-         *  CONNECTION_MADE is returned, or we're very likely to wait for a[m
[31m-         *  writable event that has already appeared and will never appear[m
[31m-         *  again :)"[m
[31m-         */[m
[31m-        if (PQstatus(pgdt->pgconn) == CONNECTION_MADE && pgxc->write->ready) {[m
[31m-            dd("re-polling on connection made");[m
[31m-[m
[31m-            pgrc = PQconnectPoll(pgdt->pgconn);[m
[31m-            dd("re-polling rc:%d", (int) pgrc);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                           "postgres: re-polling while connecting, rc:%d",[m
[31m-                           (int) pgrc);[m
[31m-[m
[31m-            if (pgrc == PGRES_POLLING_READING || pgrc == PGRES_POLLING_WRITING)[m
[31m-            {[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                               "postgres: busy while connecting, rc:%d",[m
[31m-                               (int) pgrc);[m
[31m-[m
[31m-                dd("returning NGX_AGAIN");[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        switch (PQstatus(pgdt->pgconn)) {[m
[31m-        case CONNECTION_NEEDED:[m
[31m-             dd("connecting (waiting for connect()))");[m
[31m-             break;[m
[31m-        case CONNECTION_STARTED:[m
[31m-             dd("connecting (waiting for connection to be made)");[m
[31m-             break;[m
[31m-        case CONNECTION_MADE:[m
[31m-             dd("connecting (connection established)");[m
[31m-             break;[m
[31m-        case CONNECTION_AWAITING_RESPONSE:[m
[31m-             dd("connecting (credentials sent, waiting for response)");[m
[31m-             break;[m
[31m-        case CONNECTION_AUTH_OK:[m
[31m-             dd("connecting (authenticated)");[m
[31m-             break;[m
[31m-        case CONNECTION_SETENV:[m
[31m-             dd("connecting (negotiating envinroment)");[m
[31m-             break;[m
[31m-        case CONNECTION_SSL_STARTUP:[m
[31m-             dd("connecting (negotiating SSL)");[m
[31m-             break;[m
[31m-        default:[m
[31m-             /*[m
[31m-              * This cannot happen, PQconnectPoll would return[m
[31m-              * PGRES_POLLING_FAILED in that case.[m
[31m-              */[m
[31m-             dd("connecting (unknown state:%d)", (int) PQstatus(pgdt->pgconn));[m
[31m-[m
[31m-             dd("returning NGX_ERROR");[m
[31m-             return NGX_ERROR;[m
[31m-        }[m
[31m-#endif /* DDEBUG */[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                       "postgres: busy while connecting, rc:%d", (int) pgrc);[m
[31m-[m
[31m-        dd("returning NGX_AGAIN");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    /* remove connection timeout from new connection */[m
[31m-    if (pgxc->write->timer_set) {[m
[31m-        ngx_del_timer(pgxc->write);[m
[31m-    }[m
[31m-[m
[31m-    if (pgrc != PGRES_POLLING_OK) {[m
[31m-        dd("connection failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: connection failed: %s",[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("connected successfully");[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: connected successfully");[m
[31m-[m
[31m-    pgxc->log->action = "sending query to PostgreSQL database";[m
[31m-    pgdt->state = state_db_send_query;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return ngx_postgres_upstream_send_query(r, pgxc, pgdt);[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_send_query(ngx_http_request_t *r, ngx_connection_t *pgxc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t  *pglcf;[m
[31m-    ngx_int_t                 pgrc;[m
[31m-    u_char                   *query;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-[m
[31m-    query = ngx_pnalloc(r->pool, pgdt->query.len + 1);[m
[31m-    if (query == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(query, pgdt->query.data, pgdt->query.len + 1);[m
[31m-[m
[31m-    dd("sending query: %s", query);[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: sending query: \"%s\"", query);[m
[31m-[m
[31m-    if (pglcf->output_binary) {[m
[31m-        pgrc = PQsendQueryParams(pgdt->pgconn, (const char *) query,[m
[31m-                                 0, NULL, NULL, NULL, NULL, /* binary */ 1);[m
[31m-    } else {[m
[31m-        pgrc = PQsendQuery(pgdt->pgconn, (const char *) query);[m
[31m-    }[m
[31m-[m
[31m-    if (pgrc == 0) {[m
[31m-        dd("sending query failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: sending query failed: %s",[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* set result timeout */[m
[31m-    ngx_add_timer(pgxc->read, r->upstream->conf->read_timeout);[m
[31m-[m
[31m-    dd("query sent successfully");[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: query sent successfully");[m
[31m-[m
[31m-    pgxc->log->action = "waiting for result from PostgreSQL database";[m
[31m-    pgdt->state = state_db_get_result;[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_get_result(ngx_http_request_t *r, ngx_connection_t *pgxc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    ExecStatusType   pgrc;[m
[31m-    PGresult        *res;[m
[31m-    ngx_int_t        rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* remove connection timeout from re-used keepalive connection */[m
[31m-    if (pgxc->write->timer_set) {[m
[31m-        ngx_del_timer(pgxc->write);[m
[31m-    }[m
[31m-[m
[31m-    if (!PQconsumeInput(pgdt->pgconn)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: failed to consume input: %s",[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PQisBusy(pgdt->pgconn)) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                       "postgres: busy while receiving result");[m
[31m-[m
[31m-        dd("returning NGX_AGAIN");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    dd("receiving result");[m
[31m-[m
[31m-    res = PQgetResult(pgdt->pgconn);[m
[31m-    if (res == NULL) {[m
[31m-        dd("receiving result failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: failed to receive result: %s",[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgrc = PQresultStatus(res);[m
[31m-    if ((pgrc != PGRES_COMMAND_OK) && (pgrc != PGRES_TUPLES_OK)) {[m
[31m-        dd("receiving result failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: failed to receive result: %s: %s",[m
[31m-                      PQresStatus(pgrc),[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        PQclear(res);[m
[31m-[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("result received successfully, cols:%d rows:%d",[m
[31m-       PQnfields(res), PQntuples(res));[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: result received successfully, cols:%d rows:%d",[m
[31m-                   PQnfields(res), PQntuples(res));[m
[31m-[m
[31m-    pgxc->log->action = "processing result from PostgreSQL database";[m
[31m-    rc = ngx_postgres_process_response(r, res);[m
[31m-[m
[31m-    PQclear(res);[m
[31m-[m
[31m-    if (rc != NGX_DONE) {[m
[31m-        dd("returning rc:%d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("result processed successfully");[m
[31m-[m
[31m-    pgxc->log->action = "waiting for ACK from PostgreSQL database";[m
[31m-    pgdt->state = state_db_get_ack;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return ngx_postgres_upstream_get_ack(r, pgxc, pgdt);[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_process_response(ngx_http_request_t *r, PGresult *res)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t      *pglcf;[m
[31m-    ngx_postgres_ctx_t           *pgctx;[m
[31m-    ngx_postgres_rewrite_conf_t  *pgrcf;[m
[31m-    ngx_postgres_variable_t      *pgvar;[m
[31m-    ngx_str_t                    *store;[m
[31m-    char                         *affected;[m
[31m-    size_t                        affected_len;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_int_t                     rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    /* set $postgres_columns */[m
[31m-    pgctx->var_cols = PQnfields(res);[m
[31m-[m
[31m-    /* set $postgres_rows */[m
[31m-    pgctx->var_rows = PQntuples(res);[m
[31m-[m
[31m-    /* set $postgres_affected */[m
[31m-    if (ngx_strncmp(PQcmdStatus(res), "SELECT", sizeof("SELECT") - 1)) {[m
[31m-        affected = PQcmdTuples(res);[m
[31m-        affected_len = ngx_strlen(affected);[m
[31m-        if (affected_len) {[m
[31m-            pgctx->var_affected = ngx_atoi((u_char *) affected, affected_len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->rewrites) {[m
[31m-        /* process rewrites */[m
[31m-        pgrcf = pglcf->rewrites->elts;[m
[31m-        for (i = 0; i < pglcf->rewrites->nelts; i++) {[m
[31m-            rc = pgrcf[i].handler(r, &pgrcf[i]);[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                    dd("returning NGX_DONE, status %d", (int) rc);[m
[31m-                    pgctx->status = rc;[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-[m
[31m-                pgctx->status = rc;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->variables) {[m
[31m-        /* set custom variables */[m
[31m-        pgvar = pglcf->variables->elts;[m
[31m-        store = pgctx->variables->elts;[m
[31m-[m
[31m-        for (i = 0; i < pglcf->variables->nelts; i++) {[m
[31m-            store[i] = ngx_postgres_variable_set_custom(r, res, &pgvar[i]);[m
[31m-            if ((store[i].len == 0) && (pgvar[i].value.required)) {[m
[31m-                dd("returning NGX_DONE, status NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-                pgctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->output_handler) {[m
[31m-        /* generate output */[m
[31m-        dd("returning");[m
[31m-        return pglcf->output_handler(r, res);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_get_ack(ngx_http_request_t *r, ngx_connection_t *pgxc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    PGresult  *res;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (!PQconsumeInput(pgdt->pgconn)) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PQisBusy(pgdt->pgconn)) {[m
[31m-        dd("returning NGX_AGAIN");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* remove result timeout */[m
[31m-    if (pgxc->read->timer_set) {[m
[31m-        ngx_del_timer(pgxc->read);[m
[31m-    }[m
[31m-[m
[31m-    dd("receiving ACK (ready for next query)");[m
[31m-[m
[31m-    res = PQgetResult(pgdt->pgconn);[m
[31m-    if (res != NULL) {[m
[31m-        dd("receiving ACK failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: receiving ACK failed: multiple queries(?)");[m
[31m-[m
[31m-        PQclear(res);[m
[31m-[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("ACK received successfully");[m
[31m-[m
[31m-    pgxc->log->action = "being idle on PostgreSQL database";[m
[31m-    pgdt->state = state_db_idle;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return ngx_postgres_upstream_done(r, r->upstream, pgdt);[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_done(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* flag for keepalive */[m
[31m-    u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if (pgctx->status >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_postgres_upstream_finalize_request(r, u, pgctx->status);[m
[31m-    } else {[m
[31m-        ngx_postgres_upstream_finalize_request(r, u, NGX_OK);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_processor.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_processor.h[m
[1mdeleted file mode 100644[m
[1mindex ee818f8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_processor.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_PROCESSOR_H_[m
[31m-#define _NGX_POSTGRES_PROCESSOR_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_upstream.h"[m
[31m-[m
[31m-[m
[31m-void       ngx_postgres_process_events(ngx_http_request_t *);[m
[31m-ngx_int_t  ngx_postgres_upstream_connect(ngx_http_request_t *,[m
[31m-               ngx_connection_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-ngx_int_t  ngx_postgres_upstream_send_query(ngx_http_request_t *,[m
[31m-               ngx_connection_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-ngx_int_t  ngx_postgres_upstream_get_result(ngx_http_request_t *,[m
[31m-               ngx_connection_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-ngx_int_t  ngx_postgres_process_response(ngx_http_request_t *, PGresult *);[m
[31m-ngx_int_t  ngx_postgres_upstream_get_ack(ngx_http_request_t *,[m
[31m-               ngx_connection_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-ngx_int_t  ngx_postgres_upstream_done(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_PROCESSOR_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.c[m
[1mdeleted file mode 100644[m
[1mindex 44f3e7e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.c[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_rewrite.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_rewrite(ngx_http_request_t *r,[m
[31m-    ngx_postgres_rewrite_conf_t *pgrcf)[m
[31m-{[m
[31m-    ngx_postgres_rewrite_t  *rewrite;[m
[31m-    ngx_uint_t               i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (pgrcf->methods_set & r->method) {[m
[31m-        /* method-specific */[m
[31m-        rewrite = pgrcf->methods->elts;[m
[31m-        for (i = 0; i < pgrcf->methods->nelts; i++) {[m
[31m-            if (rewrite[i].key & r->method) {[m
[31m-                dd("returning status:%d", (int) rewrite[i].status);[m
[31m-                return rewrite[i].status;[m
[31m-            }[m
[31m-        }[m
[31m-    } else if (pgrcf->def) {[m
[31m-        /* default */[m
[31m-        dd("returning status:%d", (int) pgrcf->def->status);[m
[31m-        return pgrcf->def->status;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_rewrite_changes(ngx_http_request_t *r,[m
[31m-    ngx_postgres_rewrite_conf_t *pgrcf)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgrcf->key % 2 == 0) && (pgctx->var_affected == 0)) {[m
[31m-        /* no_changes */[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_rewrite(r, pgrcf);[m
[31m-    }[m
[31m-[m
[31m-    if ((pgrcf->key % 2 == 1) && (pgctx->var_affected > 0)) {[m
[31m-        /* changes */[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_rewrite(r, pgrcf);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_rewrite_rows(ngx_http_request_t *r,[m
[31m-    ngx_postgres_rewrite_conf_t *pgrcf)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgrcf->key % 2 == 0) && (pgctx->var_rows == 0)) {[m
[31m-        /* no_rows */[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_rewrite(r, pgrcf);[m
[31m-    }[m
[31m-[m
[31m-    if ((pgrcf->key % 2 == 1) && (pgctx->var_rows > 0)) {[m
[31m-        /* rows */[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_rewrite(r, pgrcf);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.h[m
[1mdeleted file mode 100644[m
[1mindex 54afa6c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.h[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_REWRITE_H_[m
[31m-#define _NGX_POSTGRES_REWRITE_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_postgres_rewrite(ngx_http_request_t *,[m
[31m-               ngx_postgres_rewrite_conf_t *);[m
[31m-ngx_int_t  ngx_postgres_rewrite_changes(ngx_http_request_t *,[m
[31m-               ngx_postgres_rewrite_conf_t *);[m
[31m-ngx_int_t  ngx_postgres_rewrite_rows(ngx_http_request_t *,[m
[31m-               ngx_postgres_rewrite_conf_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_REWRITE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex 919029b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,598 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_keepalive.h"[m
[31m-#include "ngx_postgres_processor.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_init(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf;[m
[31m-    ngx_postgres_upstream_server_t    *server;[m
[31m-    ngx_postgres_upstream_peers_t     *peers;[m
[31m-    ngx_uint_t                         i, j, n;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    uscf->peer.init = ngx_postgres_upstream_init_peer;[m
[31m-[m
[31m-    pgscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_postgres_module);[m
[31m-[m
[31m-    if (pgscf->servers == NULL || pgscf->servers->nelts == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "postgres: no \"postgres_server\" defined"[m
[31m-                      " in upstream \"%V\" in %s:%ui",[m
[31m-                      &uscf->host, uscf->file_name, uscf->line);[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* pgscf->servers != NULL */[m
[31m-[m
[31m-    server = uscf->servers->elts;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < uscf->servers->nelts; i++) {[m
[31m-        n += server[i].naddrs;[m
[31m-    }[m
[31m-[m
[31m-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_postgres_upstream_peers_t)[m
[31m-            + sizeof(ngx_postgres_upstream_peer_t) * (n - 1));[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (n == 1);[m
[31m-    peers->number = n;[m
[31m-    peers->name = &uscf->host;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < uscf->servers->nelts; i++) {[m
[31m-        for (j = 0; j < server[i].naddrs; j++) {[m
[31m-            peers->peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-            peers->peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-            peers->peer[n].name = server[i].addrs[j].name;[m
[31m-            peers->peer[n].port = server[i].port;[m
[31m-            peers->peer[n].dbname = server[i].dbname;[m
[31m-            peers->peer[n].user = server[i].user;[m
[31m-            peers->peer[n].password = server[i].password;[m
[31m-[m
[31m-            peers->peer[n].host.data = ngx_pnalloc(cf->pool,[m
[31m-                                                   NGX_SOCKADDR_STRLEN);[m
[31m-            if (peers->peer[n].host.data == NULL) {[m
[31m-                dd("returning NGX_ERROR");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            peers->peer[n].host.len = ngx_sock_ntop(peers->peer[n].sockaddr,[m
[31m-#if defined(nginx_version) && (nginx_version >= 1005003)[m
[31m-                                          peers->peer[n].socklen,[m
[31m-#endif[m
[31m-                                          peers->peer[n].host.data,[m
[31m-                                          NGX_SOCKADDR_STRLEN, 0);[m
[31m-            if (peers->peer[n].host.len == 0) {[m
[31m-                dd("returning NGX_ERROR");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            n++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgscf->peers = peers;[m
[31m-    pgscf->active_conns = 0;[m
[31m-[m
[31m-    if (pgscf->max_cached) {[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_keepalive_init(cf->pool, pgscf);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_postgres_upstream_peer_data_t  *pgdt;[m
[31m-    ngx_postgres_upstream_srv_conf_t   *pgscf;[m
[31m-    ngx_postgres_loc_conf_t            *pglcf;[m
[31m-    ngx_postgres_ctx_t                 *pgctx;[m
[31m-    ngx_http_core_loc_conf_t           *clcf;[m
[31m-    ngx_http_upstream_t                *u;[m
[31m-    ngx_postgres_mixed_t               *query;[m
[31m-    ngx_str_t                           sql;[m
[31m-    ngx_uint_t                          i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgdt = ngx_pcalloc(r->pool, sizeof(ngx_postgres_upstream_peer_data_t));[m
[31m-    if (pgdt == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    pgdt->upstream = u;[m
[31m-    pgdt->request = r;[m
[31m-[m
[31m-    pgscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_postgres_module);[m
[31m-    pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    pgdt->srv_conf = pgscf;[m
[31m-    pgdt->loc_conf = pglcf;[m
[31m-[m
[31m-    u->peer.data = pgdt;[m
[31m-    u->peer.get = ngx_postgres_upstream_get_peer;[m
[31m-    u->peer.free = ngx_postgres_upstream_free_peer;[m
[31m-[m
[31m-    if (pglcf->query.methods_set & r->method) {[m
[31m-        /* method-specific query */[m
[31m-        dd("using method-specific query");[m
[31m-[m
[31m-        query = pglcf->query.methods->elts;[m
[31m-        for (i = 0; i < pglcf->query.methods->nelts; i++) {[m
[31m-            if (query[i].key & r->method) {[m
[31m-                query = &query[i];[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (i == pglcf->query.methods->nelts) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* default query */[m
[31m-        dd("using default query");[m
[31m-[m
[31m-        query = pglcf->query.def;[m
[31m-    }[m
[31m-[m
[31m-    if (query->cv) {[m
[31m-        /* complex value */[m
[31m-        dd("using complex value");[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, query->cv, &sql) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (sql.len == 0) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: empty \"postgres_query\" (was: \"%V\")"[m
[31m-                          " in location \"%V\"", &query->cv->value,[m
[31m-                          &clcf->name);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        pgdt->query = sql;[m
[31m-    } else {[m
[31m-        /* simple value */[m
[31m-        dd("using simple value");[m
[31m-[m
[31m-        pgdt->query = query->sv;[m
[31m-    }[m
[31m-[m
[31m-    /* set $postgres_query */[m
[31m-    pgctx->var_query = pgdt->query;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-#else[m
[31m-    r->upstream->peer.data = NULL;[m
[31m-[m
[31m-    dd("returning NGX_OK (NGX_ERROR)");[m
[31m-    return NGX_OK;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_postgres_upstream_peer_data_t  *pgdt = data;[m
[31m-    ngx_postgres_upstream_srv_conf_t   *pgscf;[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    ngx_postgres_ctx_t                 *pgctx;[m
[31m-#endif[m
[31m-    ngx_postgres_upstream_peers_t      *peers;[m
[31m-    ngx_postgres_upstream_peer_t       *peer;[m
[31m-    ngx_connection_t                   *pgxc = NULL;[m
[31m-    int                                 fd;[m
[31m-    ngx_event_t                        *rev, *wev;[m
[31m-    ngx_int_t                           rc;[m
[31m-    u_char                             *connstring, *last;[m
[31m-    size_t                              len;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    if (data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(pgdt->request, ngx_postgres_module);[m
[31m-#endif[m
[31m-[m
[31m-    pgscf = pgdt->srv_conf;[m
[31m-[m
[31m-    pgdt->failed = 0;[m
[31m-[m
[31m-    if (pgscf->max_cached && pgscf->single) {[m
[31m-        rc = ngx_postgres_keepalive_get_peer_single(pc, pgdt, pgscf);[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            /* re-use keepalive peer */[m
[31m-            dd("re-using keepalive peer (single)");[m
[31m-[m
[31m-            pgdt->state = state_db_send_query;[m
[31m-[m
[31m-            ngx_postgres_process_events(pgdt->request);[m
[31m-[m
[31m-            dd("returning NGX_AGAIN");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    peers = pgscf->peers;[m
[31m-[m
[31m-    if (pgscf->current > peers->number - 1) {[m
[31m-        pgscf->current = 0;[m
[31m-    }[m
[31m-[m
[31m-    peer = &peers->peer[pgscf->current++];[m
[31m-[m
[31m-    pgdt->name.len = peer->name.len;[m
[31m-    pgdt->name.data = peer->name.data;[m
[31m-[m
[31m-    pgdt->sockaddr = *peer->sockaddr;[m
[31m-[m
[31m-    pc->name = &pgdt->name;[m
[31m-    pc->sockaddr = &pgdt->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->cached = 0;[m
[31m-[m
[31m-    if ((pgscf->max_cached) && (!pgscf->single)) {[m
[31m-        rc = ngx_postgres_keepalive_get_peer_multi(pc, pgdt, pgscf);[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            /* re-use keepalive peer */[m
[31m-            dd("re-using keepalive peer (multi)");[m
[31m-[m
[31m-            pgdt->state = state_db_send_query;[m
[31m-[m
[31m-            ngx_postgres_process_events(pgdt->request);[m
[31m-[m
[31m-            dd("returning NGX_AGAIN");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((pgscf->reject) && (pgscf->active_conns >= pgscf->max_cached)) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, pc->log, 0,[m
[31m-                      "postgres: keepalive connection pool is full,"[m
[31m-                      " rejecting request to upstream \"%V\"", &peer->name);[m
[31m-[m
[31m-        /* a bit hack-ish way to return error response (setup part) */[m
[31m-        pc->connection = ngx_get_connection(0, pc->log);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-        pgctx->status = NGX_HTTP_SERVICE_UNAVAILABLE;[m
[31m-#endif[m
[31m-[m
[31m-        dd("returning NGX_AGAIN (NGX_HTTP_SERVICE_UNAVAILABLE)");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* sizeof("...") - 1 + 1 (for spaces and '\0' omitted */[m
[31m-    len = sizeof("hostaddr=") + peer->host.len[m
[31m-        + sizeof("port=") + sizeof("65535") - 1[m
[31m-        + sizeof("dbname=") + peer->dbname.len[m
[31m-        + sizeof("user=") + peer->user.len[m
[31m-        + sizeof("password=") + peer->password.len[m
[31m-        + sizeof("sslmode=disable");[m
[31m-[m
[31m-    connstring = ngx_pnalloc(pgdt->request->pool, len);[m
[31m-    if (connstring == NULL) {[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-#else[m
[31m-        goto failed;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    /* TODO add unix sockets */[m
[31m-    last = ngx_snprintf(connstring, len - 1,[m
[31m-                        "hostaddr=%V port=%d dbname=%V user=%V password=%V"[m
[31m-                        " sslmode=disable",[m
[31m-                        &peer->host, peer->port, &peer->dbname, &peer->user,[m
[31m-                        &peer->password);[m
[31m-    *last = '\0';[m
[31m-[m
[31m-    dd("PostgreSQL connection string: %s", connstring);[m
[31m-[m
[31m-    /*[m
[31m-     * internal checks in PQsetnonblocking are taking care of any[m
[31m-     * PQconnectStart failures, so we don't need to check them here.[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "postgres: connecting");[m
[31m-[m
[31m-    pgdt->pgconn = PQconnectStart((const char *)connstring);[m
[31m-    if (PQsetnonblocking(pgdt->pgconn, 1) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                      "postgres: connection failed: %s in upstream \"%V\"",[m
[31m-                      PQerrorMessage(pgdt->pgconn), &peer->name);[m
[31m-[m
[31m-        PQfinish(pgdt->pgconn);[m
[31m-        pgdt->pgconn = NULL;[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-        dd("returning NGX_DECLINED");[m
[31m-        return NGX_DECLINED;[m
[31m-#else[m
[31m-        pgctx->status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        goto failed;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG > 1)[m
[31m-    PQtrace(pgdt->pgconn, stderr);[m
[31m-#endif[m
[31m-[m
[31m-    dd("connection status:%d", (int) PQstatus(pgdt->pgconn));[m
[31m-[m
[31m-    /* take spot in keepalive connection pool */[m
[31m-    pgscf->active_conns++;[m
[31m-[m
[31m-    /* add the file descriptor (fd) into an nginx connection structure */[m
[31m-[m
[31m-    fd = PQsocket(pgdt->pgconn);[m
[31m-    if (fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                      "postgres: failed to get connection fd");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "postgres: connection fd:%d", fd);[m
[31m-[m
[31m-    pgxc = pc->connection = ngx_get_connection(fd, pc->log);[m
[31m-[m
[31m-    if (pgxc == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                      "postgres: failed to get a free nginx connection");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    pgxc->log = pc->log;[m
[31m-    pgxc->log_error = pc->log_error;[m
[31m-    pgxc->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    rev = pgxc->read;[m
[31m-    wev = pgxc->write;[m
[31m-[m
[31m-    rev->log = pc->log;[m
[31m-    wev->log = pc->log;[m
[31m-[m
[31m-    /* register the connection with postgres connection fd into the[m
[31m-     * nginx event model */[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {[m
[31m-        dd("NGX_USE_RTSIG_EVENT");[m
[31m-        if (ngx_add_conn(pgxc) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-        dd("NGX_USE_CLEAR_EVENT");[m
[31m-        if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_CLEAR_EVENT) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        dd("NGX_USE_LEVEL_EVENT");[m
[31m-        if (ngx_add_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgxc->log->action = "connecting to PostgreSQL database";[m
[31m-    pgdt->state = state_db_connect;[m
[31m-[m
[31m-    dd("returning NGX_AGAIN");[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-bad_add:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                  "postgres: failed to add nginx connection");[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_postgres_upstream_free_connection(pc->log, pc->connection,[m
[31m-                                          pgdt->pgconn, pgscf);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-#else[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    /* a bit hack-ish way to return error response (setup part) */[m
[31m-    pc->connection = ngx_get_connection(0, pc->log);[m
[31m-[m
[31m-    dd("returning NGX_AGAIN (NGX_ERROR)");[m
[31m-    return NGX_AGAIN;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_upstream_free_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_postgres_upstream_peer_data_t  *pgdt = data;[m
[31m-    ngx_postgres_upstream_srv_conf_t   *pgscf;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    if (data == NULL) {[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    pgscf = pgdt->srv_conf;[m
[31m-[m
[31m-    if (pgscf->max_cached) {[m
[31m-        ngx_postgres_keepalive_free_peer(pc, pgdt, pgscf, state);[m
[31m-    }[m
[31m-[m
[31m-    if (pc->connection) {[m
[31m-        dd("free connection to PostgreSQL database");[m
[31m-[m
[31m-        ngx_postgres_upstream_free_connection(pc->log, pc->connection,[m
[31m-                pgdt->pgconn, pgscf);[m
[31m-[m
[31m-        pgdt->pgconn = NULL;[m
[31m-        pc->connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-ngx_flag_t[m
[31m-ngx_postgres_upstream_is_my_peer(const ngx_peer_connection_t *peer)[m
[31m-{[m
[31m-    dd("entering & returning");[m
[31m-    return (peer->get == ngx_postgres_upstream_get_peer);[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_upstream_free_connection(ngx_log_t *log, ngx_connection_t *c,[m
[31m-    PGconn *pgconn, ngx_postgres_upstream_srv_conf_t *pgscf)[m
[31m-{[m
[31m-    ngx_event_t  *rev, *wev;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    PQfinish(pgconn);[m
[31m-[m
[31m-    if (c) {[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        if (wev->timer_set) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_del_conn) {[m
[31m-           ngx_del_conn(c, NGX_CLOSE_EVENT);[m
[31m-        } else {[m
[31m-            if (rev->active || rev->disabled) {[m
[31m-                ngx_del_event(rev, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-[m
[31m-            if (wev->active || wev->disabled) {[m
[31m-                ngx_del_event(wev, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (rev->posted) {[m
[31m-#else[m
[31m-        if (rev->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(rev);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (wev->posted) {[m
[31m-#else[m
[31m-        if (wev->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(wev);[m
[31m-        }[m
[31m-[m
[31m-        rev->closed = 1;[m
[31m-        wev->closed = 1;[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        if (c->pool) {[m
[31m-            ngx_destroy_pool(c->pool);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        c->fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    /* free spot in keepalive connection pool */[m
[31m-    pgscf->active_conns--;[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex 9ad46ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_HTTP_UPSTREAM_POSTGRES_H_[m
[31m-#define _NGX_HTTP_UPSTREAM_POSTGRES_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    state_db_connect,[m
[31m-    state_db_send_query,[m
[31m-    state_db_get_result,[m
[31m-    state_db_get_ack,[m
[31m-    state_db_idle[m
[31m-} ngx_postgres_state_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_postgres_upstream_srv_conf_t  *srv_conf;[m
[31m-    ngx_postgres_loc_conf_t           *loc_conf;[m
[31m-    ngx_http_upstream_t               *upstream;[m
[31m-    ngx_http_request_t                *request;[m
[31m-    PGconn                            *pgconn;[m
[31m-    ngx_postgres_state_t               state;[m
[31m-    ngx_str_t                          query;[m
[31m-    ngx_str_t                          name;[m
[31m-    struct sockaddr                    sockaddr;[m
[31m-    unsigned                           failed;[m
[31m-} ngx_postgres_upstream_peer_data_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_postgres_upstream_init(ngx_conf_t *,[m
[31m-                ngx_http_upstream_srv_conf_t *);[m
[31m-ngx_int_t   ngx_postgres_upstream_init_peer(ngx_http_request_t *,[m
[31m-                ngx_http_upstream_srv_conf_t *);[m
[31m-ngx_int_t   ngx_postgres_upstream_get_peer(ngx_peer_connection_t *, void *);[m
[31m-void        ngx_postgres_upstream_free_peer(ngx_peer_connection_t *, void *,[m
[31m-                ngx_uint_t);[m
[31m-ngx_flag_t  ngx_postgres_upstream_is_my_peer(const ngx_peer_connection_t *);[m
[31m-void        ngx_postgres_upstream_free_connection(ngx_log_t *,[m
[31m-                ngx_connection_t *, PGconn *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_UPSTREAM_POSTGRES_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_util.c[m
[1mdeleted file mode 100644[m
[1mindex ae7de38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,406 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * Copyright (C) 2002-2010, Igor Sysoev[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_util.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * All functions in this file are copied directly from ngx_http_upstream.c,[m
[31m- * beacuse they are declared as static there.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc)[m
[31m-{[m
[31m-#if defined(nginx_version) && (nginx_version < 1009001)[m
[31m-    ngx_time_t  *tp;[m
[31m-#endif[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http upstream request: %i", rc);[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1009001)[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-#else[m
[31m-    if (u->state && u->state->response_sec) {[m
[31m-        tp = ngx_timeofday();[m
[31m-        u->state->response_sec = tp->sec - u->state->response_sec;[m
[31m-        u->state->response_msec = tp->msec - u->state->response_msec;[m
[31m-#endif[m
[31m-[m
[31m-        if (u->pipe) {[m
[31m-            u->state->response_length = u->pipe->read_length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->finalize_request) {[m
[31m-        u->finalize_request(r, rc);[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.free) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-#if 0 /* we don't support SSL at this time, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-        /* TODO: do not shutdown persistent connection */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-[m
[31m-            /*[m
[31m-             * We send the "close notify" shutdown alert to the upstream only[m
[31m-             * and do not wait its "close notify" shutdown alert.[m
[31m-             * It is acceptable according to the TLS standard.[m
[31m-             */[m
[31m-[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    u->peer.connection = NULL;[m
[31m-[m
[31m-    if (u->pipe && u->pipe->temp_file) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream temp fd: %d",[m
[31m-                       u->pipe->temp_file->file.fd);[m
[31m-    }[m
[31m-[m
[31m-    if (u->header_sent[m
[31m-        && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))[m
[31m-    {[m
[31m-        rc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "sending to client";[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_upstream_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t ft_type)[m
[31m-{[m
[31m-    ngx_uint_t  status, state;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http next upstream, %xi", ft_type);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);[m
[31m-#endif[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {[m
[31m-        state = NGX_PEER_NEXT;[m
[31m-    } else {[m
[31m-        state = NGX_PEER_FAILED;[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type != NGX_HTTP_UPSTREAM_FT_NOLIVE) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, state);[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        status = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        switch(ft_type) {[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_TIMEOUT:[m
[31m-            status = NGX_HTTP_GATEWAY_TIME_OUT;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_HTTP_500:[m
[31m-            status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_HTTP_404:[m
[31m-            status = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        /*[m
[31m-         * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING[m
[31m-         * never reach here[m
[31m-         */[m
[31m-[m
[31m-        default:[m
[31m-            status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->error) {[m
[31m-        ngx_postgres_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (status) {[m
[31m-        u->state->status = status;[m
[31m-[m
[31m-        if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type)) {[m
[31m-            ngx_postgres_upstream_finalize_request(r, u, status);[m
[31m-[m
[31m-            dd("returning");[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-#if 0 /* we don't support SSL at this time, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-            u->peer.connection->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (u->conf->busy_lock && !u->busy_locked) {[m
[31m-        ngx_http_upstream_busy_lock(p);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: ngx_http_upstream_connect(r, u); */[m
[31m-    if (status == 0) {[m
[31m-        status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return ngx_postgres_upstream_finalize_request(r, u, status);[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        if (c->write->pending_eof) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, c->write->kq_errno,[m
[31m-                       "kevent() reported that connect() failed");[m
[31m-[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len) == -1)[m
[31m-        {[m
[31m-            err = ngx_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_variable_t              *var;[m
[31m-    ngx_http_core_main_conf_t        *cmcf;[m
[31m-    ngx_postgres_rewrite_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (rlcf->uninitialized_variable_warn == 0) {[m
[31m-        *v = ngx_http_variable_null_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    var = cmcf->variables.elts;[m
[31m-[m
[31m-    /*[m
[31m-     * the ngx_http_rewrite_module sets variables directly in r->variables,[m
[31m-     * and they should be handled by ngx_http_get_indexed_variable(),[m
[31m-     * so the handler is called only if the variable is not initialized[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                  "using uninitialized \"%V\" variable", &var[data].name);[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_rewrite_value(ngx_conf_t *cf, ngx_postgres_rewrite_loc_conf_t *lcf,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t                              n;[m
[31m-    ngx_http_script_compile_t              sc;[m
[31m-    ngx_http_script_value_code_t          *val;[m
[31m-    ngx_http_script_complex_value_code_t  *complex;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(value);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        val = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                         sizeof(ngx_http_script_value_code_t));[m
[31m-        if (val == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_atoi(value->data, value->len);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            n = 0;[m
[31m-        }[m
[31m-[m
[31m-        val->code = ngx_http_script_value_code;[m
[31m-        val->value = (uintptr_t) n;[m
[31m-        val->text_len = (uintptr_t) value->len;[m
[31m-        val->text_data = (uintptr_t) value->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    complex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                 sizeof(ngx_http_script_complex_value_code_t));[m
[31m-    if (complex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    complex->code = ngx_http_script_complex_value_code;[m
[31m-    complex->lengths = NULL;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = value;[m
[31m-    sc.lengths = &complex->lengths;[m
[31m-    sc.values = &lcf->codes;[m
[31m-    sc.variables = n;[m
[31m-    sc.complete_lengths = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_util.h[m
[1mdeleted file mode 100644[m
[1mindex 02938a9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * Copyright (C) 2002-2010, Igor Sysoev[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_UTIL_H_[m
[31m-#define _NGX_POSTGRES_UTIL_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_rewrite_module;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t  *codes;        /* uintptr_t */[m
[31m-[m
[31m-    ngx_uint_t    stack_size;[m
[31m-[m
[31m-    ngx_flag_t    log;[m
[31m-    ngx_flag_t    uninitialized_variable_warn;[m
[31m-} ngx_postgres_rewrite_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-void       ngx_postgres_upstream_finalize_request(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *, ngx_int_t);[m
[31m-void       ngx_postgres_upstream_next(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *, ngx_int_t);[m
[31m-ngx_int_t  ngx_postgres_upstream_test_connect(ngx_connection_t *);[m
[31m-[m
[31m-ngx_int_t  ngx_postgres_rewrite_var(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-char      *ngx_postgres_rewrite_value(ngx_conf_t *,[m
[31m-               ngx_postgres_rewrite_loc_conf_t *, ngx_str_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_UTIL_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_variable.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_variable.c[m
[1mdeleted file mode 100644[m
[1mindex e7f4f38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_variable.c[m
[1m+++ /dev/null[m
[36m@@ -1,288 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_variable.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_columns(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering: \"$postgres_columns\"");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->var_cols == NGX_ERROR)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%i", pgctx->var_cols) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_rows(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering: \"$postgres_rows\"");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->var_rows == NGX_ERROR)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%i", pgctx->var_rows) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_affected(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering: \"$postgres_affected\"");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->var_affected == NGX_ERROR)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%i", pgctx->var_affected) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_query(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering: \"$postgres_query\"");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->var_query.len == 0)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = pgctx->var_query.len;[m
[31m-    v->data = pgctx->var_query.data;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_get_custom(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_variable_t  *pgvar = (ngx_postgres_variable_t *) data;[m
[31m-    ngx_postgres_ctx_t       *pgctx;[m
[31m-    ngx_str_t                *store;[m
[31m-[m
[31m-    dd("entering: \"$%.*s\"", (int) pgvar->var->name.len,[m
[31m-                              pgvar->var->name.data);[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->variables == NULL)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    store = pgctx->variables->elts;[m
[31m-[m
[31m-    /* idx is always valid */[m
[31m-    if (store[pgvar->idx].len == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = store[pgvar->idx].len;[m
[31m-    v->data = store[pgvar->idx].data;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_str_t[m
[31m-ngx_postgres_variable_set_custom(ngx_http_request_t *r, PGresult *res,[m
[31m-    ngx_postgres_variable_t *pgvar)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_postgres_value_t      *pgv;[m
[31m-    ngx_int_t                  col_count, row_count, col, len;[m
[31m-    ngx_str_t                  value = ngx_null_string;[m
[31m-[m
[31m-    dd("entering: \"$%.*s\"", (int) pgvar->var->name.len,[m
[31m-                              pgvar->var->name.data);[m
[31m-[m
[31m-    col_count = PQnfields(res);[m
[31m-    row_count = PQntuples(res);[m
[31m-[m
[31m-    pgv = &pgvar->value;[m
[31m-[m
[31m-    if (pgv->column != NGX_ERROR) {[m
[31m-        /* get column by number */[m
[31m-        col = pgv->column;[m
[31m-    } else {[m
[31m-        /* get column by name */[m
[31m-        col = PQfnumber(res, (char const *) pgv->col_name);[m
[31m-        if (col == NGX_ERROR) {[m
[31m-            if (pgv->required) {[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "postgres: \"postgres_set\" for variable \"$%V\""[m
[31m-                              " requires value from column \"%s\" that wasn't"[m
[31m-                              " found in the received result-set in location"[m
[31m-                              " \"%V\"",[m
[31m-                              &pgvar->var->name, pgv->col_name, &clcf->name);[m
[31m-            }[m
[31m-[m
[31m-            dd("returning empty value");[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((pgv->row >= row_count) || (col >= col_count)) {[m
[31m-        if (pgv->required) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: \"postgres_set\" for variable \"$%V\""[m
[31m-                          " requires value out of range of the received"[m
[31m-                          " result-set (rows:%d cols:%d) in location \"%V\"",[m
[31m-                          &pgvar->var->name, row_count, col_count, &clcf->name);[m
[31m-        }[m
[31m-[m
[31m-        dd("returning empty value");[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    if (PQgetisnull(res, pgv->row, col)) {[m
[31m-        if (pgv->required) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: \"postgres_set\" for variable \"$%V\""[m
[31m-                          " requires non-NULL value in location \"%V\"",[m
[31m-                          &pgvar->var->name, &clcf->name);[m
[31m-        }[m
[31m-[m
[31m-        dd("returning empty value");[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    len = PQgetlength(res, pgv->row, col);[m
[31m-    if (len == 0) {[m
[31m-        if (pgv->required) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: \"postgres_set\" for variable \"$%V\""[m
[31m-                          " requires non-zero length value in location \"%V\"",[m
[31m-                          &pgvar->var->name, &clcf->name);[m
[31m-        }[m
[31m-[m
[31m-        dd("returning empty value");[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    value.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (value.data == NULL) {[m
[31m-        dd("returning empty value");[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(value.data, PQgetvalue(res, pgv->row, col), len);[m
[31m-    value.len = len;[m
[31m-[m
[31m-    dd("returning non-empty value");[m
[31m-    return value;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_variable.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_variable.h[m
[1mdeleted file mode 100644[m
[1mindex abdb199..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/ngx_postgres_variable.h[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_VARIABLE_H_[m
[31m-#define _NGX_POSTGRES_VARIABLE_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_postgres_variable_columns(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_postgres_variable_rows(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_postgres_variable_affected(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_postgres_variable_query(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_postgres_variable_get_custom(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_str_t  ngx_postgres_variable_set_custom(ngx_http_request_t *r,[m
[31m-               PGresult *, ngx_postgres_variable_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_VARIABLE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/resty_dbd_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/resty_dbd_stream.h[m
[1mdeleted file mode 100644[m
[1mindex ebb0cb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/src/resty_dbd_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-#ifndef RESTY_DBD_STREAME_H[m
[31m-#define RESTY_DBD_STREAME_H[m
[31m-[m
[31m-#define resty_dbd_stream_version 3[m
[31m-#define resty_dbd_stream_version_string "0.0.3"[m
[31m-[m
[31m-#define rds_content_type \[m
[31m-    "application/x-resty-dbd-stream"[m
[31m-[m
[31m-#define rds_content_type_len \[m
[31m-    (sizeof(rds_content_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_rough_col_type_int = 0 << 14,[m
[31m-    rds_rough_col_type_float = 1 << 14,[m
[31m-    rds_rough_col_type_str = 2 << 14,[m
[31m-    rds_rough_col_type_bool = 3 << 14[m
[31m-[m
[31m-} rds_rough_col_type_t;[m
[31m-[m
[31m-[m
[31m-/* The following types (or spellings thereof) are specified[m
[31m- * by SQL:[m
[31m- * bigint, bit, bit varying, boolean, char, character varying,[m
[31m- * character, varchar, date, double precision, integer,[m
[31m- * interval, numeric, decimal, real, smallint,[m
[31m- * time (with or without time zone),[m
[31m- * timestamp (with or without time zone), xml */[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_col_type_unknown = 0 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bigint = 1 | rds_rough_col_type_int,[m
[31m-    rds_col_type_bit = 2 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bit_varying = 3 | rds_rough_col_type_str,[m
[31m-[m
[31m-    rds_col_type_bool = 4 | rds_rough_col_type_bool,[m
[31m-    rds_col_type_char = 5 | rds_rough_col_type_str,[m
[31m-    rds_col_type_varchar = 6 | rds_rough_col_type_str,[m
[31m-    rds_col_type_date = 7 | rds_rough_col_type_str,[m
[31m-    rds_col_type_double = 8 | rds_rough_col_type_float,[m
[31m-    rds_col_type_integer = 9 | rds_rough_col_type_int,[m
[31m-    rds_col_type_interval = 10 | rds_rough_col_type_float,[m
[31m-    rds_col_type_decimal = 11 | rds_rough_col_type_float,[m
[31m-    rds_col_type_real = 12 | rds_rough_col_type_float,[m
[31m-    rds_col_type_smallint = 13 | rds_rough_col_type_int,[m
[31m-    rds_col_type_time_with_time_zone = 14 | rds_rough_col_type_str,[m
[31m-    rds_col_type_time = 15 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp_with_time_zone = 16 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp = 17 | rds_rough_col_type_str,[m
[31m-    rds_col_type_xml = 18 | rds_rough_col_type_str,[m
[31m-[m
[31m-    /* our additions */[m
[31m-    rds_col_type_blob = 19 | rds_rough_col_type_str[m
[31m-[m
[31m-} rds_col_type_t;[m
[31m-[m
[31m-#endif /* RESTY_DBD_STREAME_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex 832244e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "DROP TABLE cats";[m
[31m-        error_page 500  = /ignore;[m
[31m-    }[m
[31m-[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: numbers - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "DROP TABLE numbers";[m
[31m-        error_page 500  = /ignore;[m
[31m-    }[m
[31m-[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: numbers - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "CREATE TABLE numbers (number integer)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: users - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "DROP TABLE users";[m
[31m-        error_page 500  = /ignore;[m
[31m-    }[m
[31m-[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: users - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "CREATE TABLE users (login text, pass text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: users - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO users (login, pass) VALUES ('ngx_test', 'ngx_test')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/auth.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/auth.t[m
[1mdeleted file mode 100644[m
[1mindex 40468e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/auth.t[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 2 * 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: authorized (auth basic)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select login from users where login=$user and pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_set        $login 0 0 required;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        auth_request        /auth;[m
[31m-        auth_request_set    $auth_user $login;[m
[31m-        echo -n             "hi, $auth_user!";[m
[31m-    }[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-hi, ngx_test![m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unauthorized (auth basic)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select login from users where login=$user and pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_set        $login 0 0 required;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        auth_request        /auth;[m
[31m-        auth_request_set    $auth_user $login;[m
[31m-        echo -n             "hi, $auth_user!";[m
[31m-    }[m
[31m---- more_headers[m
[31m-Authorization: Basic bW9udHk6c29tZV9wYXNz[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 403[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unauthorized (no authorization header)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select login from users where login=$user and pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_set        $login 0 0 required;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        auth_request        /auth;[m
[31m-        auth_request_set    $auth_user $login;[m
[31m-        echo -n             "hi, $auth_user!";[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 403[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/bigpipe.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/bigpipe.t[m
[1mdeleted file mode 100644[m
[1mindex 4ee951d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/bigpipe.t[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: synchronous[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-        location /bigpipe {[m
[31m-            echo                 "<html>(...template with javascript and divs...)";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location        /_query1;[m
[31m-            echo                 ")</script>";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location        /_query2;[m
[31m-            echo                 ")</script>";[m
[31m-            echo                 "</html>";[m
[31m-        }[m
[31m-[m
[31m-        location /_query1 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id ASC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m-[m
[31m-        location /_query2 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id DESC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m---- request[m
[31m-GET /bigpipe[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-<html>(...template with javascript and divs...)[m
[31m-<script type="text/javascript">loader.load([{"id":2,"name":null},{"id":3,"name":"bob"}])</script>[m
[31m-<script type="text/javascript">loader.load([{"id":3,"name":"bob"},{"id":2,"name":null}])</script>[m
[31m-</html>[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: asynchronous (without echo filter)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-        location /bigpipe {[m
[31m-            echo                 "<html>(...template with javascript and divs...)";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location_async  /_query1;[m
[31m-            echo                 ")</script>";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location_async  /_query2;[m
[31m-            echo                 ")</script>";[m
[31m-            echo                 "</html>";[m
[31m-        }[m
[31m-[m
[31m-        location /_query1 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id ASC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m-[m
[31m-        location /_query2 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id DESC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m---- request[m
[31m-GET /bigpipe[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-<html>(...template with javascript and divs...)[m
[31m-<script type="text/javascript">loader.load([{"id":2,"name":null},{"id":3,"name":"bob"}])</script>[m
[31m-<script type="text/javascript">loader.load([{"id":3,"name":"bob"},{"id":2,"name":null}])</script>[m
[31m-</html>[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: asynchronous (with echo filter)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-        location /bigpipe {[m
[31m-            echo_before_body     "<html>(...template with javascript and divs...)";[m
[31m-            echo_before_body -n  "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo -n              " "; # XXX we need this to help our echo filters[m
[31m-            echo_location_async  /_query1;[m
[31m-            echo                 ")</script>";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location_async  /_query2;[m
[31m-            echo_after_body      ")</script>";[m
[31m-            echo_after_body      "</html>";[m
[31m-        }[m
[31m-[m
[31m-        location /_query1 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id ASC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m-[m
[31m-        location /_query2 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id DESC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m---- request[m
[31m-GET /bigpipe[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-<html>(...template with javascript and divs...)[m
[31m-<script type="text/javascript">loader.load( [{"id":2,"name":null},{"id":3,"name":"bob"}])</script>[m
[31m-<script type="text/javascript">loader.load([{"id":3,"name":"bob"},{"id":2,"name":null}])</script>[m
[31m-</html>[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 2: < 0.7.46[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/errors.t[m
[1mdeleted file mode 100644[m
[1mindex a502203..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "i'm bad";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: wrong credentials[m
[31m---- http_config[m
[31m-    upstream database {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=wrong_pass;[m
[31m-    }[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 502[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no database[m
[31m---- http_config[m
[31m-    upstream database {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:1 dbname=ngx_test[m
[31m-                            user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 502[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple queries[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats; select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: missing query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: empty query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        set $query          "";[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      $query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty pass[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        set $database       "";[m
[31m-        postgres_pass       $database;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: non-existing table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/escape.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/escape.t[m
[1mdeleted file mode 100644[m
[1mindex 8dad7f0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/escape.t[m
[1m+++ /dev/null[m
[36m@@ -1,361 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: '[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "he'llo";[m
[31m-        postgres_escape     $escaped $test;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'he''llo'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: \[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "he\\llo";[m
[31m-        postgres_escape     $escaped $test;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'he\\llo'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: \'[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "he\\'llo";[m
[31m-        postgres_escape     $escaped $test;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'he\\''llo'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: NULL[m
[31m---- config[m
[31m-    location /test {[m
[31m-        postgres_escape     $escaped $remote_user;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-NULL[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: empty string[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set $empty          "";[m
[31m-        postgres_escape     $escaped $empty;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-NULL[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: UTF-8[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set $utf8           "你好";[m
[31m-        postgres_escape     $escaped $utf8;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'你好'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: user arg[m
[31m---- config[m
[31m-    location /test {[m
[31m-        postgres_escape     $escaped $arg_say;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?say=he'llo![m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'he''llo!'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: NULL (empty)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        postgres_escape     $escaped =$remote_user;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-''[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: empty string (empty)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set $empty          "";[m
[31m-        postgres_escape     $escaped =$empty;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-''[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: in-place escape[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "t'\\est";[m
[31m-        postgres_escape     $test;[m
[31m-        echo                $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'t''\\est'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: re-useable variable name (test1)[m
[31m---- config[m
[31m-    location /test1 {[m
[31m-        set                 $a "a";[m
[31m-        postgres_escape     $escaped $a;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m-    location /test2 {[m
[31m-        set                 $b "b";[m
[31m-        postgres_escape     $escaped $b;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test1[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'a'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: re-useable variable name (test2)[m
[31m---- config[m
[31m-    location /test1 {[m
[31m-        set                 $a "a";[m
[31m-        postgres_escape     $escaped $a;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m-    location /test2 {[m
[31m-        set                 $b "b";[m
[31m-        postgres_escape     $escaped $b;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test2[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'b'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: concatenate multiple sources[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "t'\\est";[m
[31m-        set                 $hello " he'llo";[m
[31m-        postgres_escape     $escaped "$test$hello world!";[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'t''\\est he''llo world!'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: concatenate multiple empty sources[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $a "";[m
[31m-        set                 $b "";[m
[31m-        postgres_escape     $escaped "$a$b";[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-NULL[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: concatenate multiple empty sources (empty)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $a "";[m
[31m-        set                 $b "";[m
[31m-        postgres_escape     $escaped "=$a$b";[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-''[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: in-place escape on empty string[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "";[m
[31m-        postgres_escape     $test;[m
[31m-        echo                $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-NULL[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: in-place escape on empty string (empty)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "";[m
[31m-        postgres_escape     =$test;[m
[31m-        echo                $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-''[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: escape anonymous regex capture[m
[31m---- config[m
[31m-    location ~ /(.*) {[m
[31m-        postgres_escape     $escaped $1;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'test'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: escape named regex capture[m
[31m---- config[m
[31m-    location ~ /(?<test>.*) {[m
[31m-        postgres_escape     $escaped $test;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'test'[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.25[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex c87761d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /eval {[m
[31m-        eval_subrequest_in_memory  off;[m
[31m-[m
[31m-        eval $backend {[m
[31m-            postgres_pass    database;[m
[31m-            postgres_query   "select '$scheme://127.0.0.1:$server_port/echo'";[m
[31m-            postgres_output  value;[m
[31m-        }[m
[31m-[m
[31m-        proxy_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo -n  "it works!";[m
[31m-    }[m
[31m---- request[m
[31m-GET /eval[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-it works![m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (simple case)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /eval {[m
[31m-        eval_subrequest_in_memory  off;[m
[31m-[m
[31m-        eval $echo {[m
[31m-            postgres_pass    database;[m
[31m-            postgres_query   "select 'test' as echo";[m
[31m-            postgres_output  value;[m
[31m-        }[m
[31m-[m
[31m-        echo -n  $echo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /eval[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/form.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/form.t[m
[1mdeleted file mode 100644[m
[1mindex 4771232..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/form.t[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        set_form_input      $sql 'sql';[m
[31m-        set_unescape_uri    $sql;[m
[31m-        postgres_query      $sql;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /postgres[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/methods.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/methods.t[m
[1mdeleted file mode 100644[m
[1mindex 93b80e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/methods.t[m
[1m+++ /dev/null[m
[36m@@ -1,335 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 2 * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: method-specific query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select 'GET' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: method-specific complex query (check 1)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: method-specific complex query (check 2)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-LOCK /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{04}\x{00}\x{00}\x{00}".  # field len[m
[31m-"LOCK".          # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: method-specific complex query (using not allowed method)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /postgres[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: method-specific query and default query (using defined method)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: method-specific query and default query (using other method)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-POST /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: inheritance[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_query      "select 'default' as echo";[m
[31m-    postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inheritance (mixed, don't inherit)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_query      "select 'default' as echo";[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /postgres[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: HTTP PATCH request method[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      PATCH "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-PATCH /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{05}\x{00}\x{00}\x{00}".  # field len[m
[31m-"PATCH".         # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.41[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/output.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/output.t[m
[1mdeleted file mode 100644[m
[1mindex b4ba503..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/output.t[m
[1m+++ /dev/null[m
[36m@@ -1,447 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 4 * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: none - sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: value - sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: value - sanity (with different default_type)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/html;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: value - NULL value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: value - empty value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '' as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: text - sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'a', 'b', 'c', 'd'";[m
[31m-        postgres_output     text;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-"a".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"b".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"c".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"d"[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: rds - sanity (configured)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-        postgres_output     rds;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: rds - sanity (default)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inheritance[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type     text/plain;[m
[31m-    postgres_output  value;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: inheritance (mixed, don't inherit)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_output  text;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: value - sanity (request with known extension)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres.jpg[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: value - bytea returned in text format[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select E'\\001'::bytea as res";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body_like chomp[m
[31m-^(?:\\001|\\x01)$[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: binary value - bytea returned in binary format[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select E'\\001'::bytea as res";[m
[31m-        postgres_output     binary_value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-"\1"[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: binary value - int2 returned in binary format[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 3::int2 as res";[m
[31m-        postgres_output     binary_value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-"\0\3"[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: value - "if" pseudo-location[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        if ($arg_foo) {[m
[31m-            postgres_pass       database;[m
[31m-            postgres_query      "select id from cats order by id limit 1";[m
[31m-            postgres_output     value;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres?foo=1[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-2[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: text - NULL value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats order by id";[m
[31m-        postgres_output     text;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-"2".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"(null)".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"3".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"bob"[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: text - empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats where id=1";[m
[31m-        postgres_output     text;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: value - empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats where id=1";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: value - too many values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/restful.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/restful.t[m
[1mdeleted file mode 100644[m
[1mindex 74b111b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/restful.t[m
[1m+++ /dev/null[m
[36m@@ -1,338 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $config = <<'_EOC_';[m
[31m-    set $random  123;[m
[31m-[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "SELECT login FROM users WHERE login=$user AND pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location = /numbers/ {[m
[31m-        auth_request        /auth;[m
[31m-        postgres_pass       database;[m
[31m-[m
[31m-        postgres_query      HEAD GET  "SELECT * FROM numbers";[m
[31m-[m
[31m-        postgres_query      POST      "INSERT INTO numbers VALUES('$random') RETURNING *";[m
[31m-        postgres_rewrite    POST      changes 201;[m
[31m-[m
[31m-        postgres_query      DELETE    "DELETE FROM numbers";[m
[31m-        postgres_rewrite    DELETE    no_changes 204;[m
[31m-        postgres_rewrite    DELETE    changes 204;[m
[31m-    }[m
[31m-[m
[31m-    location ~ /numbers/(\d+) {[m
[31m-        auth_request        /auth;[m
[31m-        postgres_pass       database;[m
[31m-[m
[31m-        postgres_query      HEAD GET  "SELECT * FROM numbers WHERE number='$1'";[m
[31m-        postgres_rewrite    HEAD GET  no_rows 410;[m
[31m-[m
[31m-        postgres_query      PUT       "UPDATE numbers SET number='$1' WHERE number='$1' RETURNING *";[m
[31m-        postgres_rewrite    PUT       no_changes 410;[m
[31m-[m
[31m-        postgres_query      DELETE    "DELETE FROM numbers WHERE number='$1'";[m
[31m-        postgres_rewrite    DELETE    no_changes 410;[m
[31m-        postgres_rewrite    DELETE    changes 204;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $request_headers = <<'_EOC_';[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clean collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/[m
[31m---- error_code: 204[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: list empty collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: insert resource into collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-POST /numbers/[m
[31m---- error_code: 201[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"123".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: list collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"123".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/123[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"123".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: update resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-Content-Length: 0[m
[31m---- request[m
[31m-PUT /numbers/123[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"123".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: remove resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/123[m
[31m---- error_code: 204[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: update non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-Content-Length: 0[m
[31m---- request[m
[31m-PUT /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: remove non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: list empty collection (done)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/restful_json.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/restful_json.t[m
[1mdeleted file mode 100644[m
[1mindex aae262b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/restful_json.t[m
[1m+++ /dev/null[m
[36m@@ -1,244 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $config = <<'_EOC_';[m
[31m-    set $random  123;[m
[31m-[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "SELECT login FROM users WHERE login=$user AND pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location = /numbers/ {[m
[31m-        auth_request        /auth;[m
[31m-        postgres_pass       database;[m
[31m-        rds_json            on;[m
[31m-[m
[31m-        postgres_query      HEAD GET  "SELECT * FROM numbers";[m
[31m-[m
[31m-        postgres_query      POST      "INSERT INTO numbers VALUES('$random') RETURNING *";[m
[31m-        postgres_rewrite    POST      changes 201;[m
[31m-[m
[31m-        postgres_query      DELETE    "DELETE FROM numbers";[m
[31m-        postgres_rewrite    DELETE    no_changes 204;[m
[31m-        postgres_rewrite    DELETE    changes 204;[m
[31m-    }[m
[31m-[m
[31m-    location ~ /numbers/(\d+) {[m
[31m-        auth_request        /auth;[m
[31m-        postgres_pass       database;[m
[31m-        rds_json            on;[m
[31m-[m
[31m-        postgres_query      HEAD GET  "SELECT * FROM numbers WHERE number='$1'";[m
[31m-        postgres_rewrite    HEAD GET  no_rows 410;[m
[31m-[m
[31m-        postgres_query      PUT       "UPDATE numbers SET number='$1' WHERE number='$1' RETURNING *";[m
[31m-        postgres_rewrite    PUT       no_changes 410;[m
[31m-[m
[31m-        postgres_query      DELETE    "DELETE FROM numbers WHERE number='$1'";[m
[31m-        postgres_rewrite    DELETE    no_changes 410;[m
[31m-        postgres_rewrite    DELETE    changes 204;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $request_headers = <<'_EOC_';[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clean collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/[m
[31m---- error_code: 204[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: list empty collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: insert resource into collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-POST /numbers/[m
[31m---- error_code: 201[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"number":123}][m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: list collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"number":123}][m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/123[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"number":123}][m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: update resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-Content-Length: 0[m
[31m---- request[m
[31m-PUT /numbers/123[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"number":123}][m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: remove resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/123[m
[31m---- error_code: 204[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: update non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-Content-Length: 0[m
[31m---- request[m
[31m-PUT /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: remove non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: list empty collection (done)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[][m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/rewrites.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/rewrites.t[m
[1mdeleted file mode 100644[m
[1mindex 3cc191e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/rewrites.t[m
[1m+++ /dev/null[m
[36m@@ -1,348 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1 * 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no changes (SELECT)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no changes (UPDATE)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        postgres_rewrite    no_changes 206;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: one change[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='bob'";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rows[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: no rows[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats where name='noone'";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: inheritance[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_rewrite  no_changes 500;[m
[31m-    postgres_rewrite  changes 500;[m
[31m-    postgres_rewrite  no_rows 410;[m
[31m-    postgres_rewrite  rows 206;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: inheritance (mixed, don't inherit)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_rewrite  no_changes 500;[m
[31m-    postgres_rewrite  changes 500;[m
[31m-    postgres_rewrite  no_rows 410;[m
[31m-    postgres_rewrite  rows 206;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: rows (method-specific)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    POST PUT rows 201;[m
[31m-        postgres_rewrite    HEAD GET rows 206;[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: rows (default)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    POST PUT rows 201;[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: rows (none)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    POST PUT rows 201;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: no changes (UPDATE) with 202 response[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        postgres_rewrite    no_changes 202;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 202[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 2: < 0.8.41[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: no changes (UPDATE) with 409 response[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        postgres_rewrite    no_changes 409;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 409[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no changes (UPDATE) with 409 status and our body[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        postgres_rewrite    no_changes =409;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 409[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: rows with 409 status and our body (with integrity check)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_rows 500;[m
[31m-        postgres_rewrite    rows =409;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 409[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: rows - "if" pseudo-location[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        if ($arg_foo) {[m
[31m-            postgres_pass       database;[m
[31m-            postgres_query      "select * from cats";[m
[31m-            postgres_rewrite    no_changes 500;[m
[31m-            postgres_rewrite    changes 500;[m
[31m-            postgres_rewrite    no_rows 410;[m
[31m-            postgres_rewrite    rows 206;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres?foo=1[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 25c3d7e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,298 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    upstream database {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        postgres_keepalive  off;[m
[31m-    }[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{01}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"   # col count[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variables in postgres_pass[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        set                 $backend  database;[m
[31m-        postgres_pass       $backend;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{01}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"   # col count[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: HEAD request[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: "if" pseudo-location[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        if ($arg_foo) {[m
[31m-            postgres_pass       database;[m
[31m-            postgres_query      "select * from cats";[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres?foo=1[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/variables.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/variables.t[m
[1mdeleted file mode 100644[m
[1mindex 8938411..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/t/variables.t[m
[1m+++ /dev/null[m
[36m@@ -1,407 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1 * 4 + 1 * 1 - 5 * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 0;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Test: test[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{04}\x{00}\x{00}\x{00}".  # field len[m
[31m-"test".          # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: out-of-range value (optional)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 1;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: NULL value (optional)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        postgres_set        $test 0 0;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: zero-length value (optional)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '' as echo";[m
[31m-        postgres_set        $test 0 0;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: out-of-range value (required)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 1 required;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: NULL value (required)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        postgres_set        $test 0 0 required;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: zero-length value (required)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '' as echo";[m
[31m-        postgres_set        $test 0 0 required;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: $postgres_columns[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'a', 'b', 'c'";[m
[31m-        add_header          "X-Columns" $postgres_columns;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Columns: 3[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: $postgres_rows[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'a', 'b', 'c'";[m
[31m-        add_header          "X-Rows" $postgres_rows;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Rows: 1[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: $postgres_query (simple value)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        add_header          "X-Query" $postgres_query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Query: select 'test' as echo[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: $postgres_query (simple value)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '$request_method' as echo";[m
[31m-        add_header          "X-Query" $postgres_query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Query: select 'GET' as echo[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: variables used in non-ngx_postgres location[m
[31m---- http_config[m
[31m---- config[m
[31m-    location /etc {[m
[31m-        root                /;[m
[31m-        add_header          "X-Columns" $postgres_columns;[m
[31m-        add_header          "X-Rows" $postgres_rows;[m
[31m-        add_header          "X-Affected" $postgres_affected;[m
[31m-        add_header          "X-Query" $postgres_query;[m
[31m-        postgres_set        $pg 0 0 required;[m
[31m-        add_header          "X-Custom" $pg;[m
[31m-    }[m
[31m---- request[m
[31m-GET /etc/passwd[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-! X-Columns[m
[31m-! X-Rows[m
[31m-! X-Affected[m
[31m-! X-Query[m
[31m-! X-Custom[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: $postgres_affected (SELECT)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '$request_method' as echo";[m
[31m-        add_header          "X-Affected" $postgres_affected;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Affected[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: $postgres_affected (UPDATE, no changes)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        add_header          "X-Affected" $postgres_affected;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Affected: 0[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: $postgres_affected (UPDATE, one change)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='bob'";[m
[31m-        add_header          "X-Affected" $postgres_affected;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Affected: 1[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: inheritance[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_set  $test 0 0 required;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: inheritance (mixed, don't inherit)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_set  $test 0 0 required;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        postgres_set        $test2 2 2;[m
[31m-        add_header          "X-Test" $test2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: column by name (existing)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 "echo";[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Test: test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: column by name (not existing, optional)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 "test" optional;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: column by name (not existing, required)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 "test" required;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex e0b8e89..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/ngx_postgres-1.0rc7/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,331 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_http_init_request[m
[31m-fun:ngx_event_process_posted[m
[31m-fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_posix_memalign[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_ssi_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/array-var-nginx-module-0.05/array-var-nginx-module-0.05.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/array-var-nginx-module-0.05/array-var-nginx-module-0.05.pod[m
[1mdeleted file mode 100644[m
[1mindex 9dc6866..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/array-var-nginx-module-0.05/array-var-nginx-module-0.05.pod[m
[1m+++ /dev/null[m
[36m@@ -1,471 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-array-var-nginx-module - Add support for array-typed variables to nginx config files[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See the[m
[31m-installation instructions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_files to=$array;[m
[31m-    [m
[31m-        # use the set_quote_sql_str directive in the ngx_set_misc[m
[31m-        # module to map to each element in the array $array:[m
[31m-        array_map_op set_quote_sql_str $array;[m
[31m-    [m
[31m-        array_map "name = $array_it" $array;[m
[31m-    [m
[31m-        array_join ' or ' $array to=$sql_condition;[m
[31m-    [m
[31m-        # well, we could feed it to ngx_drizzle to talk to MySQL, for example ;)[m
[31m-        echo "select * from files where $sql_condition";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module provides array typed nginx variables to C<nginx.conf>.[m
[31m-[m
[31m-Under the hood, this module just "abuses" the nginx string values to hold binary pointers[m
[31m-to C data structures (NGINX core's C<ngx_array_t> struct on the C land).[m
[31m-[m
[31m-The array type gives C<nginx.onf> wonderful capabilities of handling value lists. Nowadays, however,[m
[31m-you are highly recommended to use the L<ngx_lua|https://github.com/openresty/lua-nginx-module> module[m
[31m-so as to have the full scripting power provided by the Lua language in nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_split[m
[31m-[m
[31m-B<syntax:> I<array_split E<lt>separatorE<gt> E<lt>subjectE<gt> to=$target_variable>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Splits the string value in the C<subject> argument with the separator string specified by the[m
[31m-C<separator> argument. The result is an array-typed value saved to the nginx variable specified by the C<to=VAR> option.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    array_split "," $arg_names to=$names;[m
[31m-[m
[31m-will split the string values in the URI query argument C<names> into an array-typed value saved to the custom nginx variable[m
[31m-C<$names>.[m
[31m-[m
[31m-This directive creates an array-typed variable. Array-typed variables cannot be used outside[m
[31m-the directives offered by this module. If you want to use the values in an array-typed variable[m
[31m-in other contexts,[m
[31m-you must use the L<array_join> directive to produce a normal string value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_join[m
[31m-[m
[31m-B<syntax:> I<array_split E<lt>separatorE<gt> $array_var>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Joins the elements in the array-typed nginx variable (C<$array_var>) into a single string value[m
[31m-with the separator specified by the first argument.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m-[m
[31m-Then request C<GET /foo?names=Bob,Marry,John> will yield the response body[m
[31m-[m
[31m-[m
[31m-    Bob+Marry+John[m
[31m-[m
[31m-In the example above, we use the L<ngx_echo|https://github.com/openresty/echo-nginx-module> module's L<echo|https://github.com/openresty/echo-nginx-module#echo> directive to output[m
[31m-the final result.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_map[m
[31m-[m
[31m-B<syntax:> I<array_map E<lt>templateE<gt> $array_var>[m
[31m-[m
[31m-B<syntax:> I<array_map E<lt>templateE<gt> $array_var to=$new_array_var>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Maps the string template to each element in the array-typed nginx variable specified. Within[m
[31m-the string template, you can use the special iterator variable C<$array_it> to reference the current[m
[31m-array element in the array being mapped.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    array_map "[$array_it]" $names;[m
[31m-[m
[31m-will change each element in the array variable C<$names> by putting the square brackets around[m
[31m-each element's string value. The modification is in-place in this case.[m
[31m-[m
[31m-If you do not want in-place modifications, you can use the C<to=$var> option to specify a new nginx variable to hold the results. For instance,[m
[31m-[m
[31m-[m
[31m-    array_map "[$array_it]" $names to=$new_names;[m
[31m-[m
[31m-where the results are saved into another (array-typed) nginx variable named C<$new_names> while[m
[31m-the C<$names> variable keeps intact.[m
[31m-[m
[31m-Below is a complete example for this:[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "$names";[m
[31m-    }[m
[31m-[m
[31m-Then request C<GET /foo?names=bob,marry,nomas> will yield the response body[m
[31m-[m
[31m-[m
[31m-    [bob]+[marry]+[nomas][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_map_op[m
[31m-[m
[31m-B<syntax:> I<array_map_op E<lt>directiveE<gt> $array_var>[m
[31m-[m
[31m-B<syntax:> I<array_map_op E<lt>directiveE<gt> $array_var to=$new_array_var>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Similar to the L<array_map> directive but maps the specified nginx configuration directive instead of[m
[31m-a string template to each element in the array-typed nginx variable specified. The result[m
[31m-of applying the specified configuration directive becomes the result of the mapping.[m
[31m-[m
[31m-The nginx configuration directive being used as the iterator must be implemented by L<Nginx Devel Kit|https://github.com/simpl/ngx_devel_kit> (NDK)'s set_var submodule's C<ndk_set_var_value>.[m
[31m-For example, the following L<set-misc-nginx-module|http://github.com/openresty/set-misc-nginx-module> directives can be invoked this way:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_sql_str|http://github.com/openresty/set-misc-nginx-module#set_quote_sql_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_pgsql_str|http://github.com/openresty/set-misc-nginx-module#set_quote_pgsql_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_json_str|http://github.com/openresty/set-misc-nginx-module#set_quote_json_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_unescape_uri|http://github.com/openresty/set-misc-nginx-module#set_unescape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_escape_uri|http://github.com/openresty/set-misc-nginx-module#set_escape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_base32|http://github.com/openresty/set-misc-nginx-module#set_encode_base32>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_base32|http://github.com/openresty/set-misc-nginx-module#set_decode_base32>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_base64|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_base64|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_hex|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_hex|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_sha1|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_md5|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This is a higher-order operation where other nginx configuration directives can be used[m
[31m-as arguments for this C<map_array_op> directive.[m
[31m-[m
[31m-Consider the following example,[m
[31m-[m
[31m-[m
[31m-    array_map_op set_quote_sql_str $names;[m
[31m-[m
[31m-This line changes each element in the array-typed nginx variable C<$names> by applying the[m
[31m-L<set_quote_sql_str|https://github.com/openresty/set-misc-nginx-module#set_quote_sql_str>[m
[31m-directive provided by the L<ngx_set_misc|https://github.com/openresty/set-misc-nginx-module>[m
[31m-module one by one. The result is that each element in the array C<$names> has been escaped as SQL string literal values.[m
[31m-[m
[31m-You can also specify the C<to=$var> option if you do not want in-place modifications of the input arrays. For instance,[m
[31m-[m
[31m-[m
[31m-    array_map_op set_quote_sql_str $names to=$quoted_names;[m
[31m-[m
[31m-will save the escaped elements into a new (array-typed) nginx variable named C<$quoted_names> with C<$names> intact.[m
[31m-[m
[31m-The following is a relatively complete example:[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_sql_str $names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m-[m
[31m-Then request C<GET /foo?names=bob,marry,nomas> will yield the response body[m
[31m-[m
[31m-[m
[31m-    'bob'+'marry'+'nomas'[m
[31m-[m
[31m-Pretty cool, huh?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<OpenResty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing OpenResty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.7 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     $ wget 'http://nginx.org/download/nginx-1.9.7.tar.gz'[m
[31m-     $ tar -xzvf nginx-1.9.7.tar.gz[m
[31m-     $ cd nginx-1.9.7/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     $ ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/array-var-nginx-module[m
[31m-    [m
[31m-     $ make -j2[m
[31m-     $ make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<array-var-nginx-module file list|https://github.com/openresty/array-var-nginx-module/tags>.[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<OpenResty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_array_var_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x> (last tested: 1.9.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x> (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x> (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x> (last tested: 1.4.2)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x> (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x> (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x> (last tested: 1.0.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x> (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x> (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.44> (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.44 does not[m
[31m-work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>array-var-nginx-module|https://github.com/openresty/array-var-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the author or just ask for[m
[31m-a commit bit to the source repository on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2009-2016, Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are[m
[31m-met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS[m
[31m-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED[m
[31m-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A[m
[31m-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<NDK|https://github.com/simpl/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_set_misc|https://github.com/openresty/set-misc-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/drizzle-nginx-module-0.1.9/drizzle-nginx-module-0.1.9.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/drizzle-nginx-module-0.1.9/drizzle-nginx-module-0.1.9.pod[m
[1mdeleted file mode 100644[m
[1mindex c4836e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/drizzle-nginx-module-0.1.9/drizzle-nginx-module-0.1.9.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1090 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-drizzle-nginx-module - Upstream module for talking to MySQL and Drizzle directly[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is already production ready and is powering L<the Taobao LineZing site|http://lz.taobao.com>.[m
[31m-[m
[31m-[m
[31m-=head1 Version[m
[31m-[m
[31m-This document describes ngx_drizzle L<v0.1.9|https://github.com/openresty/drizzle-nginx-module/tags> released on 22 June 2015.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     http {[m
[31m-         ...[m
[31m-    [m
[31m-         upstream cluster {[m
[31m-             # simple round-robin[m
[31m-             drizzle_server 127.0.0.1:3306 dbname=test[m
[31m-                  password=some_pass user=monty protocol=mysql;[m
[31m-             drizzle_server 127.0.0.1:1234 dbname=test2[m
[31m-                  password=pass user=bob protocol=drizzle;[m
[31m-         }[m
[31m-    [m
[31m-         upstream backend {[m
[31m-             drizzle_server 127.0.0.1:3306 dbname=test[m
[31m-                  password=some_pass user=monty protocol=mysql;[m
[31m-         }[m
[31m-    [m
[31m-         server {[m
[31m-             location /mysql {[m
[31m-                 set $my_sql 'select * from cats';[m
[31m-                 drizzle_query $my_sql;[m
[31m-    [m
[31m-                 drizzle_pass backend;[m
[31m-    [m
[31m-                 drizzle_connect_timeout    500ms; # default 60s[m
[31m-                 drizzle_send_query_timeout 2s;    # default 60s[m
[31m-                 drizzle_recv_cols_timeout  1s;    # default 60s[m
[31m-                 drizzle_recv_rows_timeout  1s;    # default 60s[m
[31m-             }[m
[31m-    [m
[31m-             ...[m
[31m-    [m
[31m-             # for connection pool monitoring[m
[31m-             location /mysql-pool-status {[m
[31m-                 allow 127.0.0.1;[m
[31m-                 deny all;[m
[31m-    [m
[31m-                 drizzle_status;[m
[31m-             }[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This is an nginx upstream module integrating L<libdrizzle|https://launchpad.net/drizzle> into Nginx in a non-blocking and streamming way.[m
[31m-[m
[31m-Essentially it provides a very efficient and flexible way for nginx internals to access MySQL, Drizzle, as well as other RDBMS's that support the Drizzle or MySQL wired protocol. Also it can serve as a direct REST interface to those RDBMS backends.[m
[31m-[m
[31m-This module does not generate human-readable outputs, rather, in a binary format called Resty-DBD-Stream (RDS) designed by ourselves. You usually need other components, like L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module>, L<rds-csv-nginx-module|http://github.com/openresty/rds-csv-nginx-module>, or L<lua-rds-parser|http://github.com/openresty/lua-rds-parser>, to work with this module. See L<Output Format> for details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Keepalive connection pool[m
[31m-[m
[31m-This module also provides a builtin per-worker connection pool mechanism for MySQL or Drizzle TCP connections.[m
[31m-[m
[31m-Here's a sample configuration:[m
[31m-[m
[31m-[m
[31m-     upstream backend {[m
[31m-         drizzle_server 127.0.0.1:3306 dbname=test[m
[31m-              password=some_pass user=monty protocol=mysql;[m
[31m-         drizzle_keepalive max=100 mode=single overflow=reject;[m
[31m-     }[m
[31m-[m
[31m-For now, the connection pool uses a simple LIFO algorithm to assign idle connections in the pool. That is, most recently (successfully) used connections will be reused first the next time. And new idle connections will always replace the oldest idle connections in the pool even if the pool is already full.[m
[31m-[m
[31m-See the L<drizzle_keepalive> directive for more details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Last Insert ID[m
[31m-[m
[31m-If you want to get LAST_INSERT_ID, then ngx_drizzle already returns that automatically for you when you're doing a SQL insert query. Consider the following sample C<nginx.conf> snippet:[m
[31m-[m
[31m-     location /test {[m
[31m-         echo_location /mysql "drop table if exists foo";[m
[31m-         echo;[m
[31m-         echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";[m
[31m-         echo;[m
[31m-         echo_location /mysql "insert into foo (val) values (3.1415926);";[m
[31m-         echo;[m
[31m-         echo_location /mysql "select * from foo;";[m
[31m-         echo;[m
[31m-     }[m
[31m-    [m
[31m-     location /mysql {[m
[31m-         drizzle_pass backend;[m
[31m-         drizzle_module_header off;[m
[31m-         drizzle_query $query_string;[m
[31m-         rds_json on;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> gives the following outputs:[m
[31m-[m
[31m-     {"errcode":0}[m
[31m-     {"errcode":0}[m
[31m-     {"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-     [{"id":1,"val":3.1415926}][m
[31m-[m
[31m-You can see the C<insert_id> field (as well as the C<affected_rows> field in the 3rd JSON response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_server[m
[31m-[m
[31m-B<syntax:> I<drizzle_server E<lt>hostE<gt> user=E<lt>userE<gt> password=E<lt>passE<gt> dbname=E<lt>databaseE<gt>>[m
[31m-[m
[31m-B<syntax:> I<drizzle_server E<lt>hostE<gt>:E<lt>portE<gt> user=E<lt>userE<gt> password=E<lt>passE<gt> dbname=E<lt>databaseE<gt> protocol=E<lt>protocolE<gt> charset=E<lt>charsetE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-Directive assigns the name and the parameters of server. For the name it is possible to use a domain name, an address, with an optional port (default: 3306). If domain name resolves to several addresses, then all are used.[m
[31m-[m
[31m-The following options are supported:[m
[31m-[m
[31m-B<user=>C<< <user> >>[m
[31m-MySQL/Drizzle user name C<< <user> >> for login.[m
[31m-[m
[31m-B<password=>C<< <pass> >>[m
[31m-Specify mysql password C<< <pass> >>for login. If you have special characters like C<#> or spaces in your password text, then you'll have to quote the whole key-value pair with either single-quotes or double-quotes, as in[m
[31m-[m
[31m-[m
[31m-     drizzle_server 127.0.0.1:3306 user=monty "password=a b#1"[m
[31m-             dbname=test protocol=mysql;[m
[31m-[m
[31m-B<dbname=>C<< <database> >>[m
[31m-Specify default MySQL database C<< <database> >> for the connection. Note that MySQL does allow referencing tables belonging to different databases by qualifying table names with database names in SQL queries.[m
[31m-[m
[31m-B<protocol=>C<< <protocol> >>[m
[31m-Specify which wire protocol to use, C<drizzle> or C<mysql>. Default to C<drizzle>.[m
[31m-[m
[31m-B<charset=>C<< <charset> >>[m
[31m-Explicitly specify the character set for the MySQL connections. Setting this option to a non-empty value will make this module send out a C<< set names '<charset>' >> query right after the mysql connection is established.[m
[31m-If the default character encoding of the MySQL connection is already what you want, you needn't set this option because it has extra runtime cost.[m
[31m-Here is a small example:[m
[31m-[m
[31m-     drizzle_server foo.bar.com:3306 user=monty password=some_pass[m
[31m-                                     dbname=test protocol=mysql[m
[31m-                                     charset=utf8;[m
[31m-[m
[31m-Please note that for the mysql server, "utf-8" is not a valid encoding name while C<utf8> is.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_keepalive[m
[31m-[m
[31m-B<syntax:> I<drizzle_keepalive max=E<lt>sizeE<gt> mode=E<lt>modeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_keepalive max=0 mode=single>[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-Configures the keep-alive connection pool for MySQL/Drizzle connections.[m
[31m-[m
[31m-The following options are supported:[m
[31m-[m
[31m-B<max=>C<< <num> >>[m
[31m-Specify the capacity of the connection pool for the current upstream block. The E<lt>numE<gt> value I<must> be non-zero. If set to C<0>, it effectively disables the connection pool. This option is default to C<0>.[m
[31m-[m
[31m-B<mode=>C<< <mode> >>[m
[31m-This supports two values, C<single> and C<multi>. The C<single> mode means the pool does not distinguish various drizzle servers in the current upstream block while C<multi> means the pool will merely reuse connections which have identical server host names and ports. Note that even under C<multi>, differences between C<dbname> or C<user> parameters will be silently ignored. Default to C<single>.[m
[31m-[m
[31m-B<overflow=>C<< <action> >>[m
[31m-This option specifies what to do when the connection pool is already full while new database connection is required. Either C<reject> or C<ignore> can be specified. In case of C<reject>, it will reject the current request, and returns the C<503 Service Unavailable> error page. For C<ignore>, this module will go on creating a new database connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_query[m
[31m-[m
[31m-B<syntax:> I<drizzle_query E<lt>sqlE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the SQL queries sent to the Drizzle/MySQL backend.[m
[31m-[m
[31m-Nginx variable interpolation is supported, but you must be careful with SQL injection attacks. You can use the L<set_quote_sql_str|http://github.com/openresty/set-misc-nginx-module#set_quote_sql_str> directive, for example, to quote values for SQL interpolation:[m
[31m-[m
[31m-[m
[31m-     location /cat {[m
[31m-         set_unescape_uri $name $arg_name;[m
[31m-         set_quote_sql_str $quoted_name $name;[m
[31m-    [m
[31m-         drizzle_query "select * from cats where name = $quoted_name";[m
[31m-         drizzle_pass my_backend;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_pass[m
[31m-[m
[31m-B<syntax:> I<drizzle_pass E<lt>remoteE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This directive specifies the Drizzle or MySQL upstream name to be queried in the current location. The C<< <remote> >> argument can be any upstream name defined with the L<drizzle_server> directive.[m
[31m-[m
[31m-Nginx variables can also be interpolated into the C<< <remote> >> argument, so as to do dynamic backend routing, for example:[m
[31m-[m
[31m-     upstream moon { drizzle_server ...; }[m
[31m-    [m
[31m-     server {[m
[31m-         location /cat {[m
[31m-             set $backend 'moon';[m
[31m-    [m
[31m-             drizzle_query ...;[m
[31m-             drizzle_pass $backend;[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_connect_timeout[m
[31m-[m
[31m-B<syntax:> I<drizzle_connect_time E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_connect_time 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the (total) timeout for connecting to a remote Drizzle or MySQL server.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_send_query_timeout[m
[31m-[m
[31m-B<syntax:> I<drizzle_send_query_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_send_query_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the (total) timeout for sending a SQL query to a remote Drizzle or MySQL server.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, ie, "second". The default setting is C<60s>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_recv_cols_timeout[m
[31m-[m
[31m-B<syntax:> I<drizzle_recv_cols_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_recv_cols_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the (total) timeout for receiving the columns metadata of the result-set to a remote Drizzle or MySQL server.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, ie, "second". The default setting is C<60s>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_recv_rows_timeout[m
[31m-[m
[31m-B<syntax:> I<drizzle_recv_rows_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_recv_rows_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the (total) timeout for receiving the rows data of the result-set (if any) to a remote Drizzle or MySQL server.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, ie, "second". The default setting is C<60s>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_buffer_size[m
[31m-[m
[31m-B<syntax:> I<drizzle_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_buffer_size 4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the buffer size for drizzle outputs. Default to the page size (4k/8k). The larger the buffer, the less streammy the outputing process will be.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_module_header[m
[31m-[m
[31m-B<syntax:> I<drizzle_module_header on|off>[m
[31m-[m
[31m-B<default:> I<drizzle_module_header on>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Controls whether to output the drizzle header in the response. Default on.[m
[31m-[m
[31m-The drizzle module header looks like this:[m
[31m-[m
[31m-    X-Resty-DBD-Module: ngx_drizzle 0.1.0[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_status[m
[31m-[m
[31m-B<syntax:> I<drizzle_status>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-When specified, the current Nginx location will output a status report for all the drizzle upstream servers in the virtual server of the current Nginx worker process.[m
[31m-[m
[31m-The output looks like this:[m
[31m-[m
[31m-    worker process: 15231[m
[31m-[m
[31m-    upstream backend[m
[31m-      active connections: 0[m
[31m-      connection pool capacity: 10[m
[31m-      overflow: reject[m
[31m-      cached connection queue: 0[m
[31m-      free'd connection queue: 10[m
[31m-      cached connection successfully used count:[m
[31m-      free'd connection successfully used count: 3 0 0 0 0 0 0 0 0 0[m
[31m-      servers: 1[m
[31m-      peers: 1[m
[31m-[m
[31m-    upstream backend2[m
[31m-      active connections: 0[m
[31m-      connection pool capacity: 0[m
[31m-      servers: 1[m
[31m-      peers: 1[m
[31m-[m
[31m-Note that, this is I<not> the global statistics if you do have multiple Nginx worker processes configured in your C<nginx.conf>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Variables[m
[31m-[m
[31m-This module creates the following Nginx variables:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $drizzle_thread_id[m
[31m-[m
[31m-This variable will be assigned a textual number of the underlying MySQL or Drizzle query thread ID when the current SQL query times out. This thread ID can be further used in a SQL kill command to cancel the timed-out query.[m
[31m-[m
[31m-Here's an example:[m
[31m-[m
[31m-     drizzle_connect_timeout 1s;[m
[31m-     drizzle_send_query_timeout 2s;[m
[31m-     drizzle_recv_cols_timeout 1s;[m
[31m-     drizzle_recv_rows_timeout 1s;[m
[31m-    [m
[31m-     location /query {[m
[31m-         drizzle_query 'select sleep(10)';[m
[31m-         drizzle_pass my_backend;[m
[31m-         rds_json on;[m
[31m-    [m
[31m-         more_set_headers -s 504 'X-Mysql-Tid: $drizzle_thread_id';[m
[31m-     }[m
[31m-    [m
[31m-     location /kill {[m
[31m-         drizzle_query "kill query $arg_tid";[m
[31m-         drizzle_pass my_backend;[m
[31m-         rds_json on;[m
[31m-     }[m
[31m-    [m
[31m-     location /main {[m
[31m-         content_by_lua '[m
[31m-             local res = ngx.location.capture("/query")[m
[31m-             if res.status ~= ngx.HTTP_OK then[m
[31m-                 local tid = res.header["X-Mysql-Tid"][m
[31m-                 if tid and tid ~= "" then[m
[31m-                     ngx.location.capture("/kill", { args = {tid = tid} })[m
[31m-                 end[m
[31m-                 return ngx.HTTP_INTERNAL_SERVER_ERROR;[m
[31m-             end[m
[31m-             ngx.print(res.body)[m
[31m-         '[m
[31m-     }[m
[31m-[m
[31m-where we make use of L<headers-more-nginx-module|http://github.com/openresty/headers-more-nginx-module>, L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>, and L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module> too. When the SQL query timed out, we'll explicitly cancel it immediately. One pitfall here is that you have to add these modules in this order while building Nginx:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<headers-more-nginx-module|http://github.com/openresty/headers-more-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Such that, their output filters will work in the I<reversed> order, i.e., first convert RDS to JSON, and then add our C<X-Mysql-Tid> custom header, and finally capture the whole (subrequest) response with the Lua module. You're recommended to use the L<OpenResty bundle|http://openresty.org/> though, it ensures the module building order automatically for you.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Output Format[m
[31m-[m
[31m-This module generates binary query results in a format that is shared among the various Nginx database driver modules like L<ngx_postgres|http://github.com/FRiCKLE/ngx_postgres/>. This data format is named C<Resty DBD Stream> (RDS).[m
[31m-[m
[31m-If you're a web app developer, you may be more interested in[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-using L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module> to obtain JSON output,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-using L<rds-csv-nginx-module|http://github.com/openresty/rds-csv-nginx-module> to obain Comma-Separated-Value (CSV) output,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-or using L<lua-rds-parser|http://github.com/openresty/lua-rds-parser> to parse the RDS data into Lua data structures.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-For the HTTP response header part, the C<200 OK> status code should always be returned. The C<Content-Type> header I<must> be set to C<application/x-resty-dbd-stream>. And the driver generating this response also sets a C<X-Resty-DBD> header. For instance, this module adds the following output header:[m
[31m-[m
[31m-    X-Resty-DBD-Module: drizzle 0.1.0[m
[31m-[m
[31m-where C<0.1.0> is this module's own version number. This C<X-Resty-DBD-Module> header is optional though.[m
[31m-[m
[31m-Below is the HTTP response body format (version 0.0.3):[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 RDS Header Part[m
[31m-[m
[31m-The RDS Header Part consists of the following fields:[m
[31m-[m
[31m-B<uint8_t>[m
[31m-endian type (1 means big-endian and little endian otherwise)[m
[31m-[m
[31m-B<uint32_t>[m
[31m-format version (v1.2.3 is represented as 1002003 in decimal)[m
[31m-[m
[31m-B<uint8_t>[m
[31m-result type (0 means normal SQL result type, fixed for now)[m
[31m-[m
[31m-B<uint16_t>[m
[31m-standard error code[m
[31m-[m
[31m-B<uint16_t>[m
[31m-driver-specific error code[m
[31m-[m
[31m-B<uint16_t>[m
[31m-driver-specific error string length[m
[31m-[m
[31m-B<u_char >*[m
[31m-driver-specific error string data[m
[31m-[m
[31m-B<uint64_t>[m
[31m-database rows affected[m
[31m-[m
[31m-B<uint64_t>[m
[31m-insert id (if none, 0)[m
[31m-[m
[31m-B<uint16_t>[m
[31m-column count[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 RDS Body Part[m
[31m-[m
[31m-When the C<column count> field in the L<RDS Header Part> is zero, then the whole RDS Body Part is omitted.[m
[31m-[m
[31m-The RDS Body Part consists of two sections, L<Columns> and L<Rows>.[m
[31m-[m
[31m-[m
[31m-=head3 Columns[m
[31m-[m
[31m-[m
[31m-The columns part consists of zero or more column data. The number of columns is determined by C<column count> field in L<RDS Header Part>.[m
[31m-[m
[31m-Each column consists of the following fields[m
[31m-[m
[31m-B<uint16_t>[m
[31m-non-zero value for standard column type code and for the column list terminator and zero otherwise.[m
[31m-[m
[31m-B<uint16_t>[m
[31m-driver-specific column type code[m
[31m-[m
[31m-B<uint16_t>[m
[31m-column name length[m
[31m-[m
[31m-B<u_char >*[m
[31m-column name data[m
[31m-[m
[31m-[m
[31m-=head3 Rows[m
[31m-[m
[31m-[m
[31m-The rows part consists of zero or more row data, terminated by a 8-bit zero.[m
[31m-[m
[31m-Each row data consists of a L<Row Flag> and an optional L<Fields Data> part.[m
[31m-[m
[31m-[m
[31m-=head4 Row Flag[m
[31m-[m
[31m-[m
[31m-B<uint8_t>[m
[31m-valid row (1 means valid, and 0 means the row list terminator)[m
[31m-[m
[31m-[m
[31m-=head4 Fields Data[m
[31m-[m
[31m-[m
[31m-The Fields Data consists zero or more fields of data. The field count is predetermined by the E<lt>codeE<gt>column numberE<lt>/code) specified in L<RDS Header Part>.[m
[31m-[m
[31m-B<uint32_t>[m
[31m-field length ((uint32_t) -1 represents NULL)[m
[31m-[m
[31m-B<u_char >*[m
[31m-field data in textual representation), is empty (0) if field length == (uint32_t) -1[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 RDS buffer Limitations[m
[31m-[m
[31m-On the nginx output chain link level, the following components should be put into a single C<ngx_buf_t> struct:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the header[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-each column and the column list terminator[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-each row's valid flag byte and row list terminator[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-each field in each row (if any) but the field data can span multiple bufs.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Status Code[m
[31m-[m
[31m-If the MySQL error code in MySQL's query result is not OK, then a 500 error page is returned by this module, except for the table non-existent error, which results in the C<410 Gone> error page.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Caveats[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Other usptream modules like C<upstream_hash> and L<HttpUpstreamKeepaliveModule|http://wiki.nginx.org/HttpUpstreamKeepaliveModule> I<must not> be used with this module in a single upstream block.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Directives like L<server|http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server> I<must not> be mixed with L<drizzle_server> either.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Upstream backends that don't use L<drizzle_server> to define server entries I<must not> be used in the L<drizzle_pass> directive.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Trouble Shooting[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When you see the following error message in C<error.log>:[m
[31m-[m
[31m-failed to connect: 15: drizzle_state_handshake_result_read:[m
[31m-old insecure authentication mechanism not supported in upstream, ...[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-then you may checkout if your MySQL is too old (at least 5.x is required) or your mysql config file explicitly forces the use of old authentication method (you should remove the C<old-passwords> line from your C<my.cnf> and add the line C<secure_auth 1>).[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When you see the following error message in C<error.log>:[m
[31m-[m
[31m-failed to connect: 23: Access denied for user 'root'@'ubuntu'[m
[31m-(using password: YES) while connecting to drizzle upstream, ...[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-You should check if your MySQL account does have got TCP login access on your MySQL server side. A quick check is to use MySQL's official client to connect to your server:[m
[31m-[m
[31m-         mysql --protocol=tcp -u user --password=password -h foo.bar.com dbname[m
[31m-[m
[31m-Note that the C<--protocol=tcp> option is required here, or your MySQL client may use Unix Domain Socket to connect to your MySQL server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Calling mysql procedures are currently not supported because the underlying libdrizzle library does not support the C<CLIENT_MULTI_RESULTS> flag yet :( But we'll surely work on it.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Multiple SQL statements in a single query are not supported due to the lack of C<CLIENT_MULTI_STATEMENTS> support in the underlying libdrizzle library.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This module does not (yet) work with the C<RTSIG> event model.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module as well as L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module> via the ngx_openresty bundle:[m
[31m-[m
[31m-E<lt>http://openresty.orgE<gt>[m
[31m-[m
[31m-The installation steps are usually as simple as C<./configure --with-http_drizzle_module && make && make install> (But you still need to install the libdrizzle library manually, see [E<lt>http://openresty.org/#DrizzleNginxModule]E<gt>(http://openresty.org/#DrizzleNginxModule) for detailed instructions.[m
[31m-[m
[31m-Alternatively, you can compile this module with Nginx core's source by hand:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-You should first install libdrizzle 1.0 which is now distributed with the drizzle project and can be obtained from [E<lt>https://launchpad.net/drizzle]E<gt>(https://launchpad.net/drizzle). The latest drizzle7 release does not support building libdrizzle 1.0 separately and requires a lot of external dependencies like Boost and Protobuf which are painful to install. The last version supporting building libdrizzle 1.0 separately is C<2011.07.21>. You can download it from E<lt>http://agentzh.org/misc/nginx/drizzle7-2011.07.21.tar.gzE<gt> . Which this version of drizzle7, installation of libdrizzle 1.0 is usually as simple as[m
[31m-[m
[31m-         tar xzvf drizzle7-2011.07.21.tar.gz[m
[31m-         cd drizzle7-2011.07.21/[m
[31m-         ./configure --without-server[m
[31m-         make libdrizzle-1.0[m
[31m-         make install-libdrizzle-1.0[m
[31m-[m
[31m-Ensure that you have the C<python> command point to a C<python2> interpreter. It's known that on recent : Arch Linux distribution, C<python> is linked to C<python3> by default, and while running C<make libdrizzle-1.0> will yield the error[m
[31m-[m
[31m-         File "config/pandora-plugin", line 185[m
[31m-             print "Dependency loop detected with %s" % plugin['name'][m
[31m-                                                      ^[m
[31m-         SyntaxError: invalid syntax[m
[31m-         make: *** [.plugin.scan] Error 1[m
[31m-[m
[31m-You can fix this by pointing C<python> to C<python2>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from drizzle-nginx-module L<file list|http://github.com/openresty/drizzle-nginx-module/tags>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example, the version 1.7.10 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-         wget 'http://nginx.org/download/nginx-1.7.10.tar.gz'[m
[31m-         tar -xzvf nginx-1.7.10.tar.gz[m
[31m-         cd nginx-1.7.10/[m
[31m-    [m
[31m-         # if you have installed libdrizzle to the prefix /opt/drizzle, then[m
[31m-         # specify the following environments:[m
[31m-         # export LIBDRIZZLE_INC=/opt/drizzle/include/libdrizzle-1.0[m
[31m-         # export LIBDRIZZLE_LIB=/opt/drizzle/lib[m
[31m-    [m
[31m-         # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-         ./configure --prefix=/opt/nginx \[m
[31m-                     --add-module=/path/to/drizzle-nginx-module[m
[31m-    [m
[31m-         make -j2[m
[31m-         make install[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-You usually also need L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module> to obtain JSON output from the binary RDS output generated by this upstream module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-If you're using MySQL, then MySQL C<5.0 ~ 5.5> is required. We're not sure if MySQL C<5.6+> work; reports welcome![m
[31m-[m
[31m-This module has been tested on Linux and Mac OS X. Reports on other POSIX-compliant systems will be highly appreciated.[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.5.x (last tested: 1.5.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.4.x (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.3.x (last tested: 1.3.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.2.x (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (last tested: 1.0.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x (last tested: 0.8.55)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.7.x E<gt>= 0.7.44 (last tested version is 0.7.67)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like C<0.6.x> and C<0.5.x> will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above C<0.7.44> does not work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<issue tracking interface|http://github.com/openresty/drizzle-nginx-module/issues> provided by GitHub,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or sending an email to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>drizzle-nginx-module|http://github.com/openresty/drizzle-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|http://github.com/openresty/drizzle-nginx-module/tree/master/t/> are[m
[31m-L<declarative|http://github.com/openresty/drizzle-nginx-module/blob/master/t/sanity.t> too. Thanks to the L<Test::Nginx|http://search.cpan.org/perldoc?Test::Nginx> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-echo-module:$PATH prove -r t[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add the MySQL transaction support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add multi-statement MySQL query support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the "drizzle_max_output_size" directive. When the RDS data is larger then the size specified, the module will try to terminate the output as quickly as possible but will still ensure the resulting response body is still in valid RDS format.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the C<drizzle_upstream_next> mechanism for failover support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add support for multiple "drizzle_query" directives in a single location.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement I<weighted> round-robin algorithm for the upstream server clusters.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add the C<max_idle_time> option to the L<drizzle_server> directive, so that the connection pool will automatically release idle connections for the timeout you specify.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add the C<min> option to the "drizzle_server" directive so that the connection pool will automatically create that number of connections and put them into the pool.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add Unix domain socket support in the C<drizzle_server> directive.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-make the L<drizzle_query> directive reject variables that have not been processed by a L<drizzle_process> directive. This will pretect us from SQL injections. There will also be an option ("strict=no") to disable such checks.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the ngx_openresty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Authors[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-chaoslawful (王晓哲) E<lt>chaoslawful at gmail dot comE<gt>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh at gmail dot comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Piotr Sikora E<lt>piotr.sikora at frickle dot comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This module is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2009-2014, by Xiaozhe Wang (chaoslawful) E<lt>chaoslawful@gmail.comE<gt>.[m
[31m-[m
[31m-Copyright (C) 2009-2014, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-Copyright (C) 2010-2014, by FRiCKLE Piotr Sikora E<lt>info@frickle.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rds-csv-nginx-module|http://github.com/openresty/rds-csv-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-rds-parser|http://github.com/openresty/lua-rds-parser>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<The ngx_openresty bundle|http://openresty.org>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<DrizzleNginxModule bundled by ngx_openresty|http://openresty.org/#DrizzleNginxModule>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<postgres-nginx-module|http://github.com/FRiCKLE/ngx_postgres>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<lua-resty-mysql|https://github.com/openresty/lua-resty-mysql> library based on the L<lua-nginx-module|http://github.com/openresty/lua-nginx-module> cosocket API.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/echo-nginx-module-0.59/echo-nginx-module-0.59.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/echo-nginx-module-0.59/echo-nginx-module-0.59.pod[m
[1mdeleted file mode 100644[m
[1mindex 32aaaf1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/echo-nginx-module-0.59/echo-nginx-module-0.59.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1870 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-B<ngx_echo> - Brings "echo", "sleep", "time", "exec" and more shell-style goodies to Nginx config file.[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Version[m
[31m-[m
[31m-This document describes ngx_echo L<v0.59|https://github.com/openresty/echo-nginx-module/tags> released on 15 May 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-       location /hello {[m
[31m-         echo "hello, world!";[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       location /hello {[m
[31m-         echo -n "hello, ";[m
[31m-         echo "world!";[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       location /timed_hello {[m
[31m-         echo_reset_timer;[m
[31m-         echo hello world;[m
[31m-         echo "'hello world' takes about $echo_timer_elapsed sec.";[m
[31m-         echo hiya igor;[m
[31m-         echo "'hiya igor' takes about $echo_timer_elapsed sec.";[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       location /echo_with_sleep {[m
[31m-         echo hello;[m
[31m-         echo_flush;  # ensure the client can see previous output immediately[m
[31m-         echo_sleep   2.5;  # in sec[m
[31m-         echo world;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # in the following example, accessing /echo yields[m
[31m-       #   hello[m
[31m-       #   world[m
[31m-       #   blah[m
[31m-       #   hiya[m
[31m-       #   igor[m
[31m-       location /echo {[m
[31m-           echo_before_body hello;[m
[31m-           echo_before_body world;[m
[31m-           proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;[m
[31m-           echo_after_body hiya;[m
[31m-           echo_after_body igor;[m
[31m-       }[m
[31m-       location /echo/more {[m
[31m-           echo blah;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # the output of /main might be[m
[31m-       #   hello[m
[31m-       #   world[m
[31m-       #   took 0.000 sec for total.[m
[31m-       # and the whole request would take about 2 sec to complete.[m
[31m-       location /main {[m
[31m-           echo_reset_timer;[m
[31m-    [m
[31m-           # subrequests in parallel[m
[31m-           echo_location_async /sub1;[m
[31m-           echo_location_async /sub2;[m
[31m-    [m
[31m-           echo "took $echo_timer_elapsed sec for total.";[m
[31m-       }[m
[31m-       location /sub1 {[m
[31m-           echo_sleep 2;[m
[31m-           echo hello;[m
[31m-       }[m
[31m-       location /sub2 {[m
[31m-           echo_sleep 1;[m
[31m-           echo world;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # the output of /main might be[m
[31m-       #   hello[m
[31m-       #   world[m
[31m-       #   took 3.003 sec for total.[m
[31m-       # and the whole request would take about 3 sec to complete.[m
[31m-       location /main {[m
[31m-           echo_reset_timer;[m
[31m-    [m
[31m-           # subrequests in series (chained by CPS)[m
[31m-           echo_location /sub1;[m
[31m-           echo_location /sub2;[m
[31m-    [m
[31m-           echo "took $echo_timer_elapsed sec for total.";[m
[31m-       }[m
[31m-       location /sub1 {[m
[31m-           echo_sleep 2;[m
[31m-           echo hello;[m
[31m-       }[m
[31m-       location /sub2 {[m
[31m-           echo_sleep 1;[m
[31m-           echo world;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # Accessing /dup gives[m
[31m-       #   ------ END ------[m
[31m-       location /dup {[m
[31m-         echo_duplicate 3 "--";[m
[31m-         echo_duplicate 1 " END ";[m
[31m-         echo_duplicate 3 "--";[m
[31m-         echo;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # /bighello will generate 1000,000,000 hello's.[m
[31m-       location /bighello {[m
[31m-         echo_duplicate 1000_000_000 'hello';[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # echo back the client request[m
[31m-       location /echoback {[m
[31m-         echo_duplicate 1 $echo_client_request_headers;[m
[31m-         echo "\r";[m
[31m-    [m
[31m-         echo_read_request_body;[m
[31m-    [m
[31m-         echo_request_body;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # GET /multi will yields[m
[31m-       #   querystring: foo=Foo[m
[31m-       #   method: POST[m
[31m-       #   body: hi[m
[31m-       #   content length: 2[m
[31m-       #   ///[m
[31m-       #   querystring: bar=Bar[m
[31m-       #   method: PUT[m
[31m-       #   body: hello[m
[31m-       #   content length: 5[m
[31m-       #   ///[m
[31m-       location /multi {[m
[31m-           echo_subrequest_async POST '/sub' -q 'foo=Foo' -b 'hi';[m
[31m-           echo_subrequest_async PUT '/sub' -q 'bar=Bar' -b 'hello';[m
[31m-       }[m
[31m-       location /sub {[m
[31m-           echo "querystring: $query_string";[m
[31m-           echo "method: $echo_request_method";[m
[31m-           echo "body: $echo_request_body";[m
[31m-           echo "content length: $http_content_length";[m
[31m-           echo '///';[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # GET /merge?/foo.js&/bar/blah.js&/yui/baz.js will merge the .js resources together[m
[31m-       location /merge {[m
[31m-           default_type 'text/javascript';[m
[31m-           echo_foreach_split '&' $query_string;[m
[31m-               echo "/* JS File $echo_it */";[m
[31m-               echo_location_async $echo_it;[m
[31m-               echo;[m
[31m-           echo_end;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # accessing /if?val=abc yields the "hit" output[m
[31m-       # while /if?val=bcd yields "miss":[m
[31m-       location ^~ /if {[m
[31m-           set $res miss;[m
[31m-           if ($arg_val ~* '^a') {[m
[31m-               set $res hit;[m
[31m-               echo $res;[m
[31m-           }[m
[31m-           echo $res;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module wraps lots of Nginx internal APIs for streaming input and output, parallel/sequential subrequests, timers and sleeping, as well as various meta data accessing.[m
[31m-[m
[31m-Basically it provides various utilities that help testing and debugging of other modules by trivially emulating different kinds of faked subrequest locations.[m
[31m-[m
[31m-People will also find it useful in real-world applications that need to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-serve static contents directly from memory (loading from the Nginx config file).[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-wrap the upstream response with custom header and footer (kinda like the L<addition module|http://nginx.org/en/docs/http/ngx_http_addition_module.html> but with contents read directly from the config file and Nginx variables).[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-merge contents of various "Nginx locations" (i.e., subrequests) together in a single main request (using L<echo_location> and its friends).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This is a special dual-role module that can I<lazily> serve as a content handler or register itself as an output filter only upon demand. By default, this module does not do anything at all.[m
[31m-[m
[31m-Technially, this module has also demonstrated the following techniques that might be helpful for module writers:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Issue parallel subreqeusts directly from content handler.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Issue chained subrequests directly from content handler, by passing continuation along the subrequest chain.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Issue subrequests with all HTTP 1.1 methods and even an optional faked HTTP request body.[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-Interact with the Nginx event model directly from content handler using custom events and timers, and resume the content handler back if necessary.[m
[31m-[m
[31m-=item 5.[m
[31m-[m
[31m-Dual-role module that can (lazily) serve as a content handler or an output filter or both.[m
[31m-[m
[31m-=item 6.[m
[31m-[m
[31m-Nginx config file variable creation and interpolation.[m
[31m-[m
[31m-=item 7.[m
[31m-[m
[31m-Streaming output control using output_chain, flush and its friends.[m
[31m-[m
[31m-=item 8.[m
[31m-[m
[31m-Read client request body from the content handler, and returns back (asynchronously) to the content handler after completion.[m
[31m-[m
[31m-=item 9.[m
[31m-[m
[31m-Use Perl-based declarative L<test suite> to drive the development of Nginx C modules.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Content Handler Directives[m
[31m-[m
[31m-Use of the following directives register this module to the current Nginx location as a content handler. If you want to use another module, like the L<standard proxy module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>, as the content handler, use the L<filter directives> provided by this module.[m
[31m-[m
[31m-All the content handler directives can be mixed together in a single Nginx location and they're supposed to run sequentially just as in the Bash scripting language.[m
[31m-[m
[31m-Every content handler directive supports variable interpolation in its arguments (if any).[m
[31m-[m
[31m-The MIME type set by the L<standard default_type directive|http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type> is respected by this module, as in:[m
[31m-[m
[31m-[m
[31m-       location /hello {[m
[31m-         default_type text/plain;[m
[31m-         echo hello;[m
[31m-       }[m
[31m-[m
[31m-Then on the client side:[m
[31m-[m
[31m-[m
[31m-       $ curl -I 'http://localhost/echo'[m
[31m-       HTTP/1.1 200 OK[m
[31m-       Server: nginx/0.8.20[m
[31m-       Date: Sat, 17 Oct 2009 03:40:19 GMT[m
[31m-       Content-Type: text/plain[m
[31m-       Connection: keep-alive[m
[31m-[m
[31m-Since the L<v0.22> release, all of the directives are allowed in the L<rewrite module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s L<if|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if> directive block, for instance:[m
[31m-[m
[31m-[m
[31m-     location ^~ /if {[m
[31m-         set $res miss;[m
[31m-         if ($arg_val ~* '^a') {[m
[31m-             set $res hit;[m
[31m-             echo $res;[m
[31m-         }[m
[31m-         echo $res;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo[m
[31m-[m
[31m-B<syntax:> I<echo [options] E<lt>stringE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Sends arguments joined by spaces, along with a trailing newline, out to the client.[m
[31m-[m
[31m-Note that the data might be buffered by Nginx's underlying buffer. To force the output data flushed immediately, use the L<echo_flush> command just after C<echo>, as in[m
[31m-[m
[31m-[m
[31m-        echo hello world;[m
[31m-        echo_flush;[m
[31m-[m
[31m-When no argument is specified, I<echo> emits the trailing newline alone, just like the I<echo> command in shell.[m
[31m-[m
[31m-Variables may appear in the arguments. An example is[m
[31m-[m
[31m-[m
[31m-        echo The current request uri is $request_uri;[m
[31m-[m
[31m-where L<$request_uri|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri> is a variable exposed by the L<ngx_http_core_module|http://nginx.org/en/docs/http/ngx_http_core_module.html>.[m
[31m-[m
[31m-This command can be used multiple times in a single location configuration, as in[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo hello;[m
[31m-         echo world;[m
[31m-     }[m
[31m-[m
[31m-The output on the client side looks like this[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/echo'[m
[31m-     hello[m
[31m-     world[m
[31m-[m
[31m-Special characters like newlines (C<\n>) and tabs (C<\t>) can be escaped using C-style escaping sequences. But a notable exception is the dollar sign (C<$>). As of Nginx 0.8.20, there's still no clean way to esacpe this characters. (A work-around might be to use a C<$echo_dollor> variable that is always evaluated to the constant C<$> character. This feature will possibly be introduced in a future version of this module.)[m
[31m-[m
[31m-As of the echo L<v0.28> release, one can suppress the trailing newline character in the output by using the C<-n> option, as in[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo -n "hello, ";[m
[31m-         echo "world";[m
[31m-     }[m
[31m-[m
[31m-Accessing C</echo> gives[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/echo'[m
[31m-     hello, world[m
[31m-[m
[31m-Leading C<-n> in variable values won't take effect and will be emitted literally, as in[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         set $opt -n;[m
[31m-         echo $opt "hello,";[m
[31m-         echo "world";[m
[31m-     }[m
[31m-[m
[31m-This gives the following output[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/echo'[m
[31m-     -n hello,[m
[31m-     world[m
[31m-[m
[31m-One can output leading C<-n> literals and other options using the special C<--> option like this[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo -- -n is an option;[m
[31m-     }[m
[31m-[m
[31m-which yields[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/echo'[m
[31m-     -n is an option[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_duplicate[m
[31m-[m
[31m-B<syntax:> I<echo_duplicate E<lt>countE<gt> E<lt>stringE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Outputs duplication of a string indicated by the second argument, using the count specified in the first argument.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-       location /dup {[m
[31m-           echo_duplicate 3 "abc";[m
[31m-       }[m
[31m-[m
[31m-will lead to the output of C<"abcabcabc">.[m
[31m-[m
[31m-Underscores are allowed in the count number, just like in Perl. For example, to emit 1000,000,000 instances of C<"hello, world">:[m
[31m-[m
[31m-[m
[31m-       location /many_hellos {[m
[31m-           echo_duplicate 1000_000_000 "hello, world";[m
[31m-       }[m
[31m-[m
[31m-The C<count> argument could be zero, but not negative. The second C<string> argument could be an empty string ("") likewise.[m
[31m-[m
[31m-Unlike the L<echo> directive, no trailing newline is appended to the result. So it's possible to "abuse" this directive as a no-trailing-newline version of L<echo> by using "count" 1, as in[m
[31m-[m
[31m-[m
[31m-       location /echo_art {[m
[31m-           echo_duplicate 2 '---';[m
[31m-           echo_duplicate 1 ' END ';  # we don't want a trailing newline here[m
[31m-           echo_duplicate 2 '---';[m
[31m-           echo;  # we want a trailing newline here...[m
[31m-       }[m
[31m-[m
[31m-You get[m
[31m-[m
[31m-[m
[31m-       ------ END ------[m
[31m-[m
[31m-But use of the C<-n> option in L<echo> is more appropriate for this purpose.[m
[31m-[m
[31m-This directive was first introduced in L<version 0.11>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_flush[m
[31m-[m
[31m-B<syntax:> I<echo_flush>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Forces the data potentially buffered by underlying Nginx output filters to send immediately to the client side via socket.[m
[31m-[m
[31m-Note that techically the command just emits a ngx_buf_t object with C<flush> slot set to 1, so certain weird third-party output filter module could still block it before it reaches Nginx's (last) write filter.[m
[31m-[m
[31m-This directive does not take any argument.[m
[31m-[m
[31m-Consider the following example:[m
[31m-[m
[31m-[m
[31m-       location /flush {[m
[31m-          echo hello;[m
[31m-    [m
[31m-          echo_flush;[m
[31m-    [m
[31m-          echo_sleep 1;[m
[31m-          echo world;[m
[31m-       }[m
[31m-[m
[31m-Then on the client side, using curl to access C</flush>, you'll see the "hello" line immediately, but only after 1 second, the last "world" line. Without calling C<echo_flush> in the example above, you'll most likely see no output until 1 second is elapsed due to the internal buffering of Nginx.[m
[31m-[m
[31m-This directive will fail to flush the output buffer in case of subrequests get involved. Consider the following example:[m
[31m-[m
[31m-[m
[31m-       location /main {[m
[31m-           echo_location_async /sub;[m
[31m-           echo hello;[m
[31m-           echo_flush;[m
[31m-       }[m
[31m-       location /sub {[m
[31m-           echo_sleep 1;[m
[31m-       }[m
[31m-[m
[31m-Then the client won't see "hello" appear even if C<echo_flush> has been executed before the subrequest to C</sub> has actually started executing. The outputs of C</main> that are sent I<after> L<echo_location_async> will be postponed and buffered firmly.[m
[31m-[m
[31m-This does I<not> apply to outputs sent before the subrequest initiated. For a modified version of the example given above:[m
[31m-[m
[31m-[m
[31m-       location /main {[m
[31m-           echo hello;[m
[31m-           echo_flush;[m
[31m-           echo_location_async /sub;[m
[31m-       }[m
[31m-       location /sub {[m
[31m-           echo_sleep 1;[m
[31m-       }[m
[31m-[m
[31m-The client will immediately see "hello" before C</sub> enters sleeping.[m
[31m-[m
[31m-See also L<echo>, L<echo_sleep>, and L<echo_location_async>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_sleep[m
[31m-[m
[31m-B<syntax:> I<echo_sleep E<lt>secondsE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Sleeps for the time period specified by the argument, which is in seconds.[m
[31m-[m
[31m-This operation is non-blocking on server side, so unlike the L<echo_blocking_sleep> directive, it won't block the whole Nginx worker process.[m
[31m-[m
[31m-The period might takes three digits after the decimal point and must be greater than 0.001.[m
[31m-[m
[31m-An example is[m
[31m-[m
[31m-[m
[31m-        location /echo_after_sleep {[m
[31m-            echo_sleep 1.234;[m
[31m-            echo resumed!;[m
[31m-        }[m
[31m-[m
[31m-Behind the scene, it sets up a per-request "sleep" ngx_event_t object, and adds a timer using that custom event to the Nginx event model and just waits for a timeout on that event. Because the "sleep" event is per-request, this directive can work in parallel subrequests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_blocking_sleep[m
[31m-[m
[31m-B<syntax:> I<echo_blocking_sleep E<lt>secondsE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This is a blocking version of the L<echo_sleep> directive.[m
[31m-[m
[31m-See the documentation of L<echo_sleep> for more detail.[m
[31m-[m
[31m-Behind the curtain, it calls the ngx_msleep macro provided by the Nginx core which maps to usleep on POSIX-compliant systems.[m
[31m-[m
[31m-Note that this directive will block the current Nginx worker process completely while being executed, so never use it in production environment.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_reset_timer[m
[31m-[m
[31m-B<syntax:> I<echo_reset_timer>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Reset the timer begin time to I<now>, i.e., the time when this command is executed during request.[m
[31m-[m
[31m-The timer begin time is default to the starting time of the current request and can be overridden by this directive, potentially multiple times in a single location. For example:[m
[31m-[m
[31m-[m
[31m-       location /timed_sleep {[m
[31m-           echo_sleep 0.03;[m
[31m-           echo "$echo_timer_elapsed sec elapsed.";[m
[31m-    [m
[31m-           echo_reset_timer;[m
[31m-    [m
[31m-           echo_sleep 0.02;[m
[31m-           echo "$echo_timer_elapsed sec elapsed.";[m
[31m-       }[m
[31m-[m
[31m-The output on the client side might be[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/timed_sleep'[m
[31m-     0.032 sec elapsed.[m
[31m-     0.020 sec elapsed.[m
[31m-[m
[31m-The actual figures you get on your side may vary a bit due to your system's current activities.[m
[31m-[m
[31m-Invocation of this directive will force the underlying Nginx timer to get updated to the current system time (regardless the timer resolution specified elsewhere in the config file). Furthermore, references of the L<$echo_timer_elapsed> variable will also trigger timer update forcibly.[m
[31m-[m
[31m-See also L<echo_sleep> and L<$echo_timer_elapsed>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_read_request_body[m
[31m-[m
[31m-B<syntax:> I<echo_read_request_body>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Explicitly reads request body so that the L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> variable will always have non-empty values (unless the body is so big that it has been saved by Nginx to a local temporary file).[m
[31m-[m
[31m-Note that this might not be the original client request body because the current request might be a subrequest with a "artificial" body specified by its parent.[m
[31m-[m
[31m-This directive does not generate any output itself, just like L<echo_sleep>.[m
[31m-[m
[31m-Here's an example for echo'ing back the original HTTP client request (both headers and body are included):[m
[31m-[m
[31m-[m
[31m-       location /echoback {[m
[31m-         echo_duplicate 1 $echo_client_request_headers;[m
[31m-         echo "\r";[m
[31m-         echo_read_request_body;[m
[31m-         echo $request_body;[m
[31m-       }[m
[31m-[m
[31m-The content of C</echoback> looks like this on my side (I was using Perl's LWP utility to access this location on the server):[m
[31m-[m
[31m-[m
[31m-       $ (echo hello; echo world) | lwp-request -m POST 'http://localhost/echoback'[m
[31m-       POST /echoback HTTP/1.1[m
[31m-       TE: deflate,gzip;q=0.3[m
[31m-       Connection: TE, close[m
[31m-       Host: localhost[m
[31m-       User-Agent: lwp-request/5.818 libwww-perl/5.820[m
[31m-       Content-Length: 12[m
[31m-       Content-Type: application/x-www-form-urlencoded[m
[31m-    [m
[31m-       hello[m
[31m-       world[m
[31m-[m
[31m-Because C</echoback> is the main request, L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> holds the original client request body.[m
[31m-[m
[31m-Before Nginx 0.7.56, it makes no sense to use this directive because L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> was first introduced in Nginx 0.7.58.[m
[31m-[m
[31m-This directive itself was first introduced in the echo module's L<v0.14 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_location_async[m
[31m-[m
[31m-B<syntax:> I<echo_location_async E<lt>locationE<gt> [E<lt>url_argsE<gt>]>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Issue GET subrequest to the location specified (first argument) with optional url arguments specified in the second argument.[m
[31m-[m
[31m-As of Nginx 0.8.20, the C<location> argument does I<not> support named location, due to a limitation in the C<ngx_http_subrequest> function. The same is true for its brother, the L<echo_location> directive.[m
[31m-[m
[31m-A very simple example is[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_location_async /sub;[m
[31m-         echo world;[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         echo hello;[m
[31m-     }[m
[31m-[m
[31m-Accessing C</main> gets[m
[31m-[m
[31m-[m
[31m-       hello[m
[31m-       world[m
[31m-[m
[31m-Calling multiple locations in parallel is also possible:[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_reset_timer;[m
[31m-         echo_location_async /sub1;[m
[31m-         echo_location_async /sub2;[m
[31m-         echo "took $echo_timer_elapsed sec for total.";[m
[31m-     }[m
[31m-     location /sub1 {[m
[31m-         echo_sleep 2; # sleeps 2 sec[m
[31m-         echo hello;[m
[31m-     }[m
[31m-     location /sub2 {[m
[31m-         echo_sleep 1; # sleeps 1 sec[m
[31m-         echo world;[m
[31m-     }[m
[31m-[m
[31m-Accessing C</main> yields[m
[31m-[m
[31m-[m
[31m-       $ time curl 'http://localhost/main'[m
[31m-       hello[m
[31m-       world[m
[31m-       took 0.000 sec for total.[m
[31m-    [m
[31m-       real  0m2.006s[m
[31m-       user  0m0.000s[m
[31m-       sys   0m0.004s[m
[31m-[m
[31m-You can see that the main handler C</main> does I<not> wait the subrequests C</sub1> and C</sub2> to complete and quickly goes on, hence the "0.000 sec" timing result. The whole request, however takes approximately 2 sec in total to complete because C</sub1> and C</sub2> run in parallel (or "concurrently" to be more accurate).[m
[31m-[m
[31m-If you use L<echo_blocking_sleep> in the previous example instead, then you'll get the same output, but with 3 sec total response time, because "blocking sleep" blocks the whole Nginx worker process.[m
[31m-[m
[31m-Locations can also take an optional querystring argument, for instance[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_location_async /sub 'foo=Foo&bar=Bar';[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         echo $arg_foo $arg_bar;[m
[31m-     }[m
[31m-[m
[31m-Accessing C</main> yields[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/main'[m
[31m-       Foo Bar[m
[31m-[m
[31m-Querystrings is I<not> allowed to be concatenated onto the C<location> argument with "?" directly, for example, C</sub?foo=Foo&bar=Bar> is an invalid location, and shouldn't be fed as the first argument to this directive.[m
[31m-[m
[31m-Technically speaking, this directive is an example that Nginx content handler issues one or more subrequests directly. AFAIK, the L<fancyindex module|https://connectical.com/projects/ngx-fancyindex/wiki> also does such kind of things ;)[m
[31m-[m
[31m-Nginx named locations like C<@foo> is I<not> supported here.[m
[31m-[m
[31m-This directive is logically equivalent to the GET version of L<echo_subrequest_async>. For example,[m
[31m-[m
[31m-[m
[31m-       echo_location_async /foo 'bar=Bar';[m
[31m-[m
[31m-is logically equivalent to[m
[31m-[m
[31m-[m
[31m-       echo_subrequest_async GET /foo -q 'bar=Bar';[m
[31m-[m
[31m-But calling this directive is slightly faster than calling L<echo_subrequest_async> using C<GET> because we don't have to parse the HTTP method names like C<GET> and options like C<-q>.[m
[31m-[m
[31m-This directive is first introduced in L<version 0.09> of this module and requires at least Nginx 0.7.46.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_location[m
[31m-[m
[31m-B<syntax:> I<echo_location E<lt>locationE<gt> [E<lt>url_argsE<gt>]>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Just like the L<echo_location_async> directive, but C<echo_location> issues subrequests I<in series> rather than in parallel. That is, the content handler directives following this directive won't be executed until the subrequest issued by this directive completes.[m
[31m-[m
[31m-The final response body is almost always equivalent to the case when L<echo_location_async> is used instead, only if timing variables is used in the outputs.[m
[31m-[m
[31m-Consider the following example:[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_reset_timer;[m
[31m-         echo_location /sub1;[m
[31m-         echo_location /sub2;[m
[31m-         echo "took $echo_timer_elapsed sec for total.";[m
[31m-     }[m
[31m-     location /sub1 {[m
[31m-         echo_sleep 2;[m
[31m-         echo hello;[m
[31m-     }[m
[31m-     location /sub2 {[m
[31m-         echo_sleep 1;[m
[31m-         echo world;[m
[31m-     }[m
[31m-[m
[31m-The location C</main> above will take for total 3 sec to complete (compared to 2 sec if L<echo_location_async> is used instead here). Here's the result in action on my machine:[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/main'[m
[31m-       hello[m
[31m-       world[m
[31m-       took 3.003 sec for total.[m
[31m-    [m
[31m-       real  0m3.027s[m
[31m-       user  0m0.020s[m
[31m-       sys   0m0.004s[m
[31m-[m
[31m-This directive is logically equivalent to the GET version of L<echo_subrequest>. For example,[m
[31m-[m
[31m-[m
[31m-       echo_location /foo 'bar=Bar';[m
[31m-[m
[31m-is logically equivalent to[m
[31m-[m
[31m-[m
[31m-       echo_subrequest GET /foo -q 'bar=Bar';[m
[31m-[m
[31m-But calling this directive is slightly faster than calling L<echo_subrequest> using C<GET> because we don't have to parse the HTTP method names like C<GET> and options like C<-q>.[m
[31m-[m
[31m-Behind the scene, it creates an C<ngx_http_post_subrequest_t> object as a I<continuation> and passes it into the C<ngx_http_subrequest> function call. Nginx will later reopen this "continuation" in the subrequest's C<ngx_http_finalize_request> function call. We resumes the execution of the parent-request's content handler and starts to run the next directive (command) if any.[m
[31m-[m
[31m-Nginx named locations like C<@foo> is I<not> supported here.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.12>.[m
[31m-[m
[31m-See also L<echo_location_async> for more details about the meaning of the arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_subrequest_async[m
[31m-[m
[31m-B<syntax:> I<echo_subrequest_async E<lt>HTTP_methodE<gt> E<lt>locationE<gt> [-q E<lt>url_argsE<gt>] [-b E<lt>request_bodyE<gt>] [-f E<lt>request_body_pathE<gt>]>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Initiate an asynchronous subrequest using HTTP method, an optional url arguments (or querystring) and an optional request body which can be defined as a string or as a path to a file which contains the body.[m
[31m-[m
[31m-This directive is very much like a generalized version of the L<echo_location_async> directive.[m
[31m-[m
[31m-Here's a small example demonstrating its usage:[m
[31m-[m
[31m-[m
[31m-     location /multi {[m
[31m-         # body defined as string[m
[31m-         echo_subrequest_async POST '/sub' -q 'foo=Foo' -b 'hi';[m
[31m-         # body defined as path to a file, relative to nginx prefix path if not absolute[m
[31m-         echo_subrequest_async PUT '/sub' -q 'bar=Bar' -f '/tmp/hello.txt';[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         echo "querystring: $query_string";[m
[31m-         echo "method: $echo_request_method";[m
[31m-         echo "body: $echo_request_body";[m
[31m-         echo "content length: $http_content_length";[m
[31m-         echo '///';[m
[31m-     }[m
[31m-[m
[31m-Then on the client side:[m
[31m-[m
[31m-[m
[31m-       $ echo -n hello > /tmp/hello.txt[m
[31m-       $ curl 'http://localhost/multi'[m
[31m-       querystring: foo=Foo[m
[31m-       method: POST[m
[31m-       body: hi[m
[31m-       content length: 2[m
[31m-       ///[m
[31m-       querystring: bar=Bar[m
[31m-       method: PUT[m
[31m-       body: hello[m
[31m-       content length: 5[m
[31m-       ///[m
[31m-[m
[31m-Here's more funny example using the standard L<proxy module> to handle the subrequest:[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_subrequest_async POST /sub -b 'hello, world';[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         proxy_pass $scheme://127.0.0.1:$server_port/proxied;[m
[31m-     }[m
[31m-     location /proxied {[m
[31m-         echo "method: $echo_request_method.";[m
[31m-    [m
[31m-         # we need to read body explicitly here...or $echo_request_body[m
[31m-         #   will evaluate to empty ("")[m
[31m-         echo_read_request_body;[m
[31m-    [m
[31m-         echo "body: $echo_request_body.";[m
[31m-     }[m
[31m-[m
[31m-Then on the client side, we can see that[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/main'[m
[31m-       method: POST.[m
[31m-       body: hello, world.[m
[31m-[m
[31m-Nginx named locations like C<@foo> is I<not> supported here.[m
[31m-[m
[31m-This directive takes several options:[m
[31m-[m
[31m-    -q <url_args>        Specify the URL arguments (or URL querystring) for the subrequest.[m
[31m-[m
[31m-    -f <path>            Specify the path for the file whose content will be serve as the[m
[31m-                         subrequest's request body.[m
[31m-[m
[31m-    -b <data>            Specify the request body data[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.15>.[m
[31m-[m
[31m-The C<-f> option to define a file path for the body was introduced in the L<release v0.35>.[m
[31m-[m
[31m-See also the L<echo_subrequest> and L<echo_location_async> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_subrequest[m
[31m-[m
[31m-B<syntax:> I<echo_subrequest E<lt>HTTP_methodE<gt> E<lt>locationE<gt> [-q E<lt>url_argsE<gt>] [-b E<lt>request_bodyE<gt>] [-f E<lt>request_body_pathE<gt>]>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This is the synchronous version of the L<echo_subrequest_async> directive. And just like L<echo_location>, it does not block the Nginx worker process (while L<echo_blocking_sleep> does), rather, it uses continuation to pass control along the subrequest chain.[m
[31m-[m
[31m-See L<echo_subrequest_async> for more details.[m
[31m-[m
[31m-Nginx named locations like C<@foo> is I<not> supported here.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.15>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_foreach_split[m
[31m-[m
[31m-B<syntax:> I<echo_foreach_split E<lt>delimiterE<gt> E<lt>stringE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Split the second argument C<string> using the delimiter specified in the first argument, and then iterate through the resulting items. For instance:[m
[31m-[m
[31m-[m
[31m-       location /loop {[m
[31m-         echo_foreach_split ',' $arg_list;[m
[31m-           echo "item: $echo_it";[m
[31m-         echo_end;[m
[31m-       }[m
[31m-[m
[31m-Accessing /main yields[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/loop?list=cat,dog,mouse'[m
[31m-       item: cat[m
[31m-       item: dog[m
[31m-       item: mouse[m
[31m-[m
[31m-As seen in the previous example, this directive should always be accompanied by an L<echo_end> directive.[m
[31m-[m
[31m-Parallel C<echo_foreach_split> loops are allowed, but nested ones are currently forbidden.[m
[31m-[m
[31m-The C<delimiter> argument could contain I<multiple> arbitrary characters, like[m
[31m-[m
[31m-[m
[31m-       # this outputs "cat\ndog\nmouse\n"[m
[31m-       echo_foreach_split -- '-a-' 'cat-a-dog-a-mouse';[m
[31m-         echo $echo_it;[m
[31m-       echo_end;[m
[31m-[m
[31m-Logically speaking, this looping structure is just the C<foreach> loop combined with a C<split> function call in Perl (using the previous example):[m
[31m-[m
[31m-[m
[31m-        foreach (split ',', $arg_list) {[m
[31m-            print "item $_\n";[m
[31m-        }[m
[31m-[m
[31m-People will also find it useful in merging multiple C<.js> or C<.css> resources into a whole. Here's an example:[m
[31m-[m
[31m-[m
[31m-       location /merge {[m
[31m-           default_type 'text/javascript';[m
[31m-    [m
[31m-           echo_foreach_split '&' $query_string;[m
[31m-               echo "/* JS File $echo_it */";[m
[31m-               echo_location_async $echo_it;[m
[31m-               echo;[m
[31m-           echo_end;[m
[31m-       }[m
[31m-[m
[31m-Then accessing /merge to merge the C<.js> resources specified in the query string:[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/merge?/foo/bar.js&/yui/blah.js&/baz.js'[m
[31m-[m
[31m-One can also use third-party Nginx cache module to cache the merged response generated by the C</merge> location in the previous example.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.17>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_end[m
[31m-[m
[31m-B<syntax:> I<echo_end>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This directive is used to terminate the body of looping and conditional control structures like L<echo_foreach_split>.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.17>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_request_body[m
[31m-[m
[31m-B<syntax:> I<echo_request_body>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Outputs the contents of the request body previous read.[m
[31m-[m
[31m-Behind the scene, it's implemented roughly like this:[m
[31m-[m
[31m-[m
[31m-       if (r->request_body && r->request_body->bufs) {[m
[31m-           return ngx_http_output_filter(r, r->request_body->bufs);[m
[31m-       }[m
[31m-[m
[31m-Unlike the L<$echo_request_body> and $request_body variables, this directive will show the whole request body even if some parts or all parts of it are saved in temporary files on the disk.[m
[31m-[m
[31m-It is a "no-op" if no request body has been read yet.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.18>.[m
[31m-[m
[31m-See also L<echo_read_request_body> and the L<chunkin module|http://github.com/agentzh/chunkin-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_exec[m
[31m-[m
[31m-B<syntax:> I<echo_exec E<lt>locationE<gt> [E<lt>query_stringE<gt>]>[m
[31m-[m
[31m-B<syntax:> I<echo_exec E<lt>named_locationE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Does an internal redirect to the location specified. An optional query string can be specified for normal locations, as in[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           echo_exec /bar weight=5;[m
[31m-       }[m
[31m-       location /bar {[m
[31m-           echo $arg_weight;[m
[31m-       }[m
[31m-[m
[31m-Or equivalently[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           echo_exec /bar?weight=5;[m
[31m-       }[m
[31m-       location /bar {[m
[31m-           echo $arg_weight;[m
[31m-       }[m
[31m-[m
[31m-Named locations are also supported. Here's an example:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           echo_exec @bar;[m
[31m-       }[m
[31m-       location @bar {[m
[31m-           # you'll get /foo rather than @bar[m
[31m-           #  due to a potential bug in nginx.[m
[31m-           echo $echo_request_uri;[m
[31m-       }[m
[31m-[m
[31m-But query string (if any) will always be ignored for named location redirects due to a limitation in the C<ngx_http_named_location> function.[m
[31m-[m
[31m-Never try to echo things before the C<echo_exec> directive or you won't see the proper response of the location you want to redirect to. Because any echoing will cause the original location handler to send HTTP headers before the redirection happens.[m
[31m-[m
[31m-Technically speaking, this directive exposes the Nginx internal API functions C<ngx_http_internal_redirect> and C<ngx_http_named_location>.[m
[31m-[m
[31m-This directive was first introduced in the L<v0.21 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_status[m
[31m-[m
[31m-B<syntax:> I<echo_status E<lt>status-numE<gt>>[m
[31m-[m
[31m-B<default:> I<echo_status 200>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Specify the default response status code. Default to C<200>. This directive is declarative and the relative order with other echo-like directives is not important.[m
[31m-[m
[31m-Here is an example,[m
[31m-[m
[31m-[m
[31m-     location = /bad {[m
[31m-         echo_status 404;[m
[31m-         echo "Something is missing...";[m
[31m-     }[m
[31m-[m
[31m-then we get a response like this:[m
[31m-[m
[31m-    HTTP/1.1 404 Not Found[m
[31m-    Server: nginx/1.2.1[m
[31m-    Date: Sun, 24 Jun 2012 03:58:18 GMT[m
[31m-    Content-Type: text/plain[m
[31m-    Transfer-Encoding: chunked[m
[31m-    Connection: keep-alive[m
[31m-[m
[31m-    Something is missing...[m
[31m-[m
[31m-This directive was first introduced in the C<v0.40> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Filter Directives[m
[31m-[m
[31m-Use of the following directives trigger the filter registration of this module. By default, no filter will be registered by this module.[m
[31m-[m
[31m-Every filter directive supports variable interpolation in its arguments (if any).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_before_body[m
[31m-[m
[31m-B<syntax:> I<echo_before_body [options] [argument]...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<output filter>[m
[31m-[m
[31m-It's the filter version of the L<echo> directive, and prepends its output to the beginning of the original outputs generated by the underlying content handler.[m
[31m-[m
[31m-An example is[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo_before_body hello;[m
[31m-         proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;[m
[31m-     }[m
[31m-     location /echo/more {[m
[31m-         echo world[m
[31m-     }[m
[31m-[m
[31m-Accessing C</echo> from the client side yields[m
[31m-[m
[31m-[m
[31m-       hello[m
[31m-       world[m
[31m-[m
[31m-In the previous sample, we borrow the L<standard proxy module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html> to serve as the underlying content handler that generates the "main contents".[m
[31m-[m
[31m-Multiple instances of this filter directive are also allowed, as in:[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo_before_body hello;[m
[31m-         echo_before_body world;[m
[31m-         echo !;[m
[31m-     }[m
[31m-[m
[31m-On the client side, the output is like[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/echo'[m
[31m-       hello[m
[31m-       world[m
[31m-       ![m
[31m-[m
[31m-In this example, we also use the L<content handler directives> provided by this module as the underlying content handler.[m
[31m-[m
[31m-This directive also supports the C<-n> and C<--> options like the L<echo> directive.[m
[31m-[m
[31m-This directive can be mixed with its brother directive L<echo_after_body>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_after_body[m
[31m-[m
[31m-B<syntax:> I<echo_after_body [argument]...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<output filter>[m
[31m-[m
[31m-It's very much like the L<echo_before_body> directive, but I<appends> its output to the end of the original outputs generated by the underlying content handler.[m
[31m-[m
[31m-Here's a simple example:[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo_after_body hello;[m
[31m-         proxy_pass http://127.0.0.1:$server_port$request_uri/more;[m
[31m-     }[m
[31m-     location /echo/more {[m
[31m-         echo world[m
[31m-     }[m
[31m-[m
[31m-Accessing C</echo> from the client side yields[m
[31m-[m
[31m-      world[m
[31m-      hello[m
[31m-[m
[31m-Multiple instances are allowed, as in:[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo_after_body hello;[m
[31m-         echo_after_body world;[m
[31m-         echo i;[m
[31m-         echo say;[m
[31m-     }[m
[31m-[m
[31m-The output on the client side while accessing the C</echo> location looks like[m
[31m-[m
[31m-      i[m
[31m-      say[m
[31m-      hello[m
[31m-      world[m
[31m-[m
[31m-This directive also supports the C<-n> and C<--> options like the L<echo> directive.[m
[31m-[m
[31m-This directive can be mixed with its brother directive L<echo_before_body>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_it[m
[31m-[m
[31m-This is a "topic variable" used by L<echo_foreach_split>, just like the C<$_> variable in Perl.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_timer_elapsed[m
[31m-[m
[31m-This variable holds the seconds elapsed since the start of the current request (might be a subrequest though) or the last invocation of the L<echo_reset_timer> command.[m
[31m-[m
[31m-The timing result takes three digits after the decimal point.[m
[31m-[m
[31m-References of this variable will force the underlying Nginx timer to update to the current system time, regardless the timer resolution settings elsewhere in the config file, just like the L<echo_reset_timer> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_request_body[m
[31m-[m
[31m-Evaluates to the current (sub)request's request body previously read if no part of the body has been saved to a temporary file. To always show the request body even if it's very large, use the L<echo_request_body> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_request_method[m
[31m-[m
[31m-Evaluates to the HTTP request method of the current request (it can be a subrequest).[m
[31m-[m
[31m-Behind the scene, it just takes the string data stored in C<< r->method_name >>.[m
[31m-[m
[31m-Compare it to the L<$echo_client_request_method> variable.[m
[31m-[m
[31m-At least for Nginx 0.8.20 and older, the L<$request_method|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_method> variable provided by the L<http core module|http://nginx.org/en/docs/http/ngx_http_core_module.html> is actually doing what our L<$echo_client_request_method> is doing.[m
[31m-[m
[31m-This variable was first introduced in our L<v0.15 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_client_request_method[m
[31m-[m
[31m-Always evaluates to the main request's HTTP method even if the current request is a subrequest.[m
[31m-[m
[31m-Behind the scene, it just takes the string data stored in C<< r->main->method_name >>.[m
[31m-[m
[31m-Compare it to the L<$echo_request_method> variable.[m
[31m-[m
[31m-This variable was first introduced in our L<v0.15 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_client_request_headers[m
[31m-[m
[31m-Evaluates to the original client request's headers.[m
[31m-[m
[31m-Just as the name suggests, it will always take the main request (or the client request) even if it's currently executed in a subrequest.[m
[31m-[m
[31m-A simple example is below:[m
[31m-[m
[31m-[m
[31m-       location /echoback {[m
[31m-          echo "headers are:"[m
[31m-          echo $echo_client_request_headers;[m
[31m-       }[m
[31m-[m
[31m-Accessing C</echoback> yields[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/echoback'[m
[31m-       headers are[m
[31m-       GET /echoback HTTP/1.1[m
[31m-       User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g[m
[31m-       Host: localhost:1984[m
[31m-       Accept: */*[m
[31m-[m
[31m-Behind the scene, it recovers C<< r->main->header_in >> (or the large header buffers, if any) on the C level and does not construct the headers itself by traversing parsed results in the request object.[m
[31m-[m
[31m-This variable was first introduced in L<version 0.15>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_cacheable_request_uri[m
[31m-[m
[31m-Evaluates to the parsed form of the URI (usually led by C</>) of the current (sub-)request. Unlike the L<$echo_request_uri> variable, it is cacheable.[m
[31m-[m
[31m-See L<$echo_request_uri> for more details.[m
[31m-[m
[31m-This variable was first introduced in L<version 0.17>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_request_uri[m
[31m-[m
[31m-Evaluates to the parsed form of the URI (usually led by C</>) of the current (sub-)request. Unlike the L<$echo_cacheable_request_uri> variable, it is I<not> cacheable.[m
[31m-[m
[31m-This is quite different from the L<$request_uri|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri> variable exported by the L<ngx_http_core_module|http://nginx.org/en/docs/http/ngx_http_core_module.html>, because C<$request_uri> is the I<unparsed> form of the current request's URI.[m
[31m-[m
[31m-This variable was first introduced in L<version 0.17>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_incr[m
[31m-[m
[31m-It is a counter that always generate the current counting number, starting from 1. The counter is always associated with the main request even if it is accessed within a subrequest.[m
[31m-[m
[31m-Consider the following example[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo "main pre: $echo_incr";[m
[31m-         echo_location_async /sub;[m
[31m-         echo_location_async /sub;[m
[31m-         echo "main post: $echo_incr";[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         echo "sub: $echo_incr";[m
[31m-     }[m
[31m-[m
[31m-Accessing C</main> yields[m
[31m-[m
[31m-    main pre: 1[m
[31m-    sub: 3[m
[31m-    sub: 4[m
[31m-    main post: 2[m
[31m-[m
[31m-This directive was first introduced in the L<v0.18 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_response_status[m
[31m-[m
[31m-Evaluates to the status code of the current (sub)request, null if not any.[m
[31m-[m
[31m-Behind the scene, it's just the textual representation of C<< r->headers_out->status >>.[m
[31m-[m
[31m-This directive was first introduced in the L<v0.23 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<OpenResty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing OpenResty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.15 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     $ wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     $ tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     $ cd nginx-1.9.15/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     $ ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/echo-nginx-module[m
[31m-    [m
[31m-     $ make -j2[m
[31m-     $ make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<echo-nginx-module file list|https://github.com/openresty/echo-nginx-module/tags>.[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_echo_module.so;[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<OpenResty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x>                       (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x>                       (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>                       (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x>                       (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.3.x>                       (last tested: 1.3.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x>                       (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x>                       (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x>                       (last tested: 1.0.11)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x>                       (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x>                       (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.21>             (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-In particular,[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the directive L<echo_location_async> and its brother L<echo_subrequest_async> do I<not> work with B<0.7.x E<lt> 0.7.46>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<echo_after_body> directive does I<not> work at all with nginx B<E<lt> 0.8.7>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<echo_sleep> directive cannot be used after L<echo_location> or L<echo_subrequest> for nginx B<E<lt> 0.8.11>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work at all.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.21 does not work with this module, please consider L<reporting a bug>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Modules that use this module for testing[m
[31m-[m
[31m-The following modules take advantage of this C<echo> module in their test suite:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<memc|http://github.com/openresty/memc-nginx-module> module that supports almost the whole memcached TCP protocol.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<chunkin|http://github.com/agentzh/chunkin-nginx-module> module that adds HTTP 1.1 chunked input support to Nginx.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<headers_more|http://github.com/openresty/headers-more-nginx-module> module that allows you to add, set, and clear input and output headers under the conditions that you specify.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<echo> module itself.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Please mail me other modules that use C<echo> in any form and I'll add them to the list above :)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-create a ticket on the L<issue tracking interface|https://github.com/openresty/echo-nginx-module/issues> provided by GitHub,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or send a bug report, questions, or even patches to the L<OpenResty Community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>echo-nginx-module|https://github.com/openresty/echo-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|https://github.com/openresty/echo-nginx-module/tree/master/t/> are[m
[31m-L<declarative|https://github.com/openresty/echo-nginx-module/blob/master/t/echo.t> too. Thanks to the L<Test::Nginx|http://search.cpan.org/perldoc?Test::Nginx> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-echo-module:$PATH prove -r t[m
[31m-[m
[31m-You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary.[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-Some parts of the test suite requires standard modules L<proxy|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>, L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html> and L<SSI|http://nginx.org/en/docs/http/ngx_http_ssi_module.html> to be enabled as well when building Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Fix the L<echo_after_body> directive in subrequests.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add directives I<echo_read_client_request_body> and I<echo_request_headers>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new directive I<echo_log> to use Nginx's logging facility directly from the config file and specific loglevel can be specified, as in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_log debug "I am being called.";[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add support for options C<-h> and C<-t> to L<echo_subrequest_async> and L<echo_subrequest>. For example[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_subrequest POST /sub -q 'foo=Foo&bar=Bar' -b 'hello' -t 'text/plan' -h 'X-My-Header: blah blah'[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add options to control whether a subrequest should inherit cached variables from its parent request (i.e. the current request that is calling the subrequest in question). Currently none of the subrequests issued by this module inherit the cached variables from the parent request.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new variable I<$echo_active_subrequests> to show C<< r->main->count - 1 >>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add the I<echo_file> and I<echo_cached_file> directives.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new varaible I<$echo_request_headers> to accompany the existing L<$echo_client_request_headers> variable.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new directive I<echo_foreach>, as in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_foreach 'cat' 'dog' 'mouse';[m
[31m-         echo_location_async "/animals/$echo_it";[m
[31m-       echo_end;[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new directive I<echo_foreach_range>, as in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_foreach_range '[1..100]' '[a-zA-z0-9]';[m
[31m-         echo_location_async "/item/$echo_it";[m
[31m-       echo_end;[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new directive I<echo_repeat>, as in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_repeat 10 $i {[m
[31m-           echo "Page $i";[m
[31m-           echo_location "/path/to/page/$i";[m
[31m-       }[m
[31m-[m
[31m-This is just another way of saying[m
[31m-[m
[31m-[m
[31m-       echo_foreach_range $i [1..10];[m
[31m-           echo "Page $i";[m
[31m-           echo_location "/path/to/page/$i";[m
[31m-       echo_end;[m
[31m-[m
[31m-Thanks Marcus Clyne for providing this idea.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new variable $echo_random which always returns a random non-negative integer with the lower/upper limit specified by the new directives C<echo_random_min> and C<echo_random_max>. For example,[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_random_min  10[m
[31m-       echo_random_max  200[m
[31m-       echo "random number: $echo_random";[m
[31m-[m
[31m-Thanks Marcus Clyne for providing this idea.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the L<author> or just ask for a commit bit to the L<source repository> on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) I<E<lt>agentzh@gmail.comE<gt>>, CloudFlare Inc.[m
[31m-[m
[31m-This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2009-2016, Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original L<blog post|http://agentzh.blogspot.com/2009/10/hacking-on-nginx-echo-module.html> about this module's initial development.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<addition filter module|http://nginx.org/en/docs/http/ngx_http_addition_module.html>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<proxy module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<OpenResty|http://openresty.org> bundle.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/encrypted-session-nginx-module-0.05/encrypted-session-nginx-module-0.05.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/encrypted-session-nginx-module-0.05/encrypted-session-nginx-module-0.05.pod[m
[1mdeleted file mode 100644[m
[1mindex 3a3f761..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/encrypted-session-nginx-module-0.05/encrypted-session-nginx-module-0.05.pod[m
[1m+++ /dev/null[m
[36m@@ -1,415 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-encrypted-session-nginx-module - encrypt and decrypt nginx variable values[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See the[m
[31m-installation instructions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    # key must be of 32 bytes long[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    [m
[31m-    # iv must not be longer than 16 bytes[m
[31m-    #   default: "deadbeefdeadbeef" (w/o quotes)[m
[31m-    encrypted_session_iv "1234567812345678";[m
[31m-    [m
[31m-    # default: 1d (1 day)[m
[31m-    encrypted_session_expires 2; # in sec[m
[31m-    [m
[31m-    location /encrypt {[m
[31m-        set $raw 'text to encrypted'; # from the ngx_rewrite module[m
[31m-        set_encrypt_session $session $raw;[m
[31m-        set_encode_base32 $session; # from the ngx_set_misc module[m
[31m-    [m
[31m-        add_header Set-Cookie 'my_login=$session';  # from the ngx_headers module[m
[31m-    [m
[31m-        # your content handler goes here...[m
[31m-    }[m
[31m-    [m
[31m-    location /decrypt {[m
[31m-        set_decode_base32 $session $cookie_my_login; # from the ngx_set_misc module[m
[31m-        set_decrypt_session $raw $session;[m
[31m-    [m
[31m-        if ($raw = '') {[m
[31m-            # bad session[m
[31m-        }[m
[31m-    [m
[31m-        # your content handler goes here...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module provides encryption and decryption support for[m
[31m-nginx variables based on AES-256 with Mac.[m
[31m-[m
[31m-This module is usually used with the L<ngx_set_misc module|http://github.com/agentzh/set-misc-nginx-module>[m
[31m-and the standard rewrite module's directives.[m
[31m-[m
[31m-This module can be used to implement simple user login and ACL.[m
[31m-[m
[31m-Usually, you just decrypt data in nginx level, and pass the unencrypted[m
[31m-data to your FastCGI/HTTP backend, as in[m
[31m-[m
[31m-[m
[31m-    location /blah {[m
[31m-        set_decrypt_session $raw_text $encrypted;[m
[31m-    [m
[31m-        # this directive is from the ngx_set_misc module[m
[31m-        set_escape_uri $escaped_raw_text $raw_text;[m
[31m-    [m
[31m-        fastcgi_param QUERY_STRING "uid=$uid";[m
[31m-        fastcgi_pass unix:/path/to/my/php/or/python/fastcgi.sock;[m
[31m-    }[m
[31m-[m
[31m-Lua web applications running directly on L<ngx_lua|https://github.com/openresty/lua-nginx-module> can call[m
[31m-this module's directives directly from within Lua code:[m
[31m-[m
[31m-[m
[31m-    local raw_text = ndk.set_var.set_decrypt_session(encrypted_text)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 encrypted_session_key[m
[31m-[m
[31m-B<syntax:> I<encrypted_session_key E<lt>keyE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Sets the key for the cipher (must be 32 bytes long). For example,[m
[31m-[m
[31m-[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 encrypted_session_iv[m
[31m-[m
[31m-B<syntax:> I<encrypted_session_iv E<lt>ivE<gt>>[m
[31m-[m
[31m-B<default:> I<encrypted_session_iv "deadbeefdeadbeef";>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Sets the initial vector used for the cipher (must be I<no longer> than 16 bytes).[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    encrypted_session_iv "12345678";[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 encrypted_session_expires[m
[31m-[m
[31m-B<syntax:> I<encrypted_session_expires E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<encrypted_session_expires 1d;>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Sets expiration time difference (in seconds by default).[m
[31m-[m
[31m-For example, consider the following configuration:[m
[31m-[m
[31m-[m
[31m-    encypted_session_expires 1d;[m
[31m-[m
[31m-When your session is being generated, ngx_encrypted_session will plant[m
[31m-an expiration time (1 day in the future in this example) into the[m
[31m-encrypted session string, such that when the session is being decrypted[m
[31m-later, the server can pull the expiration time out of the session and[m
[31m-compare it with the server's current system time. No matter how you[m
[31m-transfer and store your session, like using cookies, or URI query arguments,[m
[31m-or whatever.[m
[31m-[m
[31m-People may confuse this setting with the expiration date of HTTP[m
[31m-cookies. This directive simply controls when the session gets expired;[m
[31m-it knows nothing about HTTP cookies. Even if the end user intercepted[m
[31m-this session from cookie by himself and uses it later manually, the[m
[31m-server will still reject it when the expiration time gets passed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_encrypt_session[m
[31m-[m
[31m-B<syntax:> I<set_encrypt_session $target E<lt>valueE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Encrypts the string value specified by the C<value> argument and saves the result into[m
[31m-the variable specified by C<$target>.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    set_encrypt_session $res $value;[m
[31m-[m
[31m-will encrypts the value in the variable $value into the target variable C<$res>.[m
[31m-[m
[31m-The C<value> argument can also be an nginx string value, for example,[m
[31m-[m
[31m-[m
[31m-    set_encrypt_session $res "my value = $value";[m
[31m-[m
[31m-The resulting data can later be decrypted via the L<set_decrypt_session> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_decrypt_session[m
[31m-[m
[31m-B<syntax:> I<set_decrypt_session $target E<lt>valueE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Similar to L<set_encrypt_session>, but performs the inverse operation, that is,[m
[31m-to decrypt things.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<ngx_openresty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing ngx_openresty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.15 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-    wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-    tar -xzvf nginx-1.9.15.tar.gz[m
[31m-    cd nginx-1.9.15/[m
[31m-    [m
[31m-    Here we assume you would install you nginx under /opt/nginx/.[m
[31m-    ./configure --prefix=/opt/nginx \[m
[31m-      --add-module=/path/to/encrypted-session-nginx-module[m
[31m-    [m
[31m-    make -j2[m
[31m-    make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<encrypted-session-nginx-module file list|https://github.com/openresty/encrypted-session-nginx-module/tags>.[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<ngx_openresty bundle|http://openresty.org>.[m
[31m-[m
[31m-OpenSSL should not be disabled in your Nginx build.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_encrypted_session_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x> (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x> (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x> (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x> (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x> (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x> (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x> (last tested: 1.0.11)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x> (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x> (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.46> (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.44 does not[m
[31m-work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning,[m
[31m-there must be some serious bugs lurking somewhere in this module. So[m
[31m-whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-send a bug report or even patches to E<lt>agentzh@gmail.comE<gt>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or create a ticket on the L<issue tracking interface|http://github.com/openresty/encrypted-session-nginx-module/issues>[m
[31m-provided by GitHub.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>encrypted-session-nginx-module|http://github.com/openresty/encrypted-session-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the author or just ask for[m
[31m-a commit bit to the source repository on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2009-2016, Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, Cloud Flare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are[m
[31m-met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS[m
[31m-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED[m
[31m-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A[m
[31m-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<NDK|http://github.com/simpl-it/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_set_misc module|http://github.com/agentzh/set-misc-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/form-input-nginx-module-0.12/form-input-nginx-module-0.12.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/form-input-nginx-module-0.12/form-input-nginx-module-0.12.pod[m
[1mdeleted file mode 100644[m
[1mindex ffe2394..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/form-input-nginx-module-0.12/form-input-nginx-module-0.12.pod[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-form-input-nginx-module - NGINX module that reads HTTP POST and PUT request body encoded in "application/x-www-form-urlencoded" and parses the arguments into nginx variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This is a nginx module that reads HTTP POST and PUT request body encoded[m
[31m-in "application/x-www-form-urlencoded", and parse the arguments in[m
[31m-request body into nginx variables.[m
[31m-[m
[31m-This module depends on the ngx_devel_kit (NDK) module.[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.7 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-    wget 'http://nginx.org/download/nginx-1.9.7.tar.gz'[m
[31m-    tar -xzvf nginx-1.9.7.tar.gz[m
[31m-    cd nginx-1.9.7/[m
[31m-    [m
[31m-    ./configure --add-module=/path/to/ngx_devel_kit \[m
[31m-        --add-module=/path/to/form-input-nginx-module[m
[31m-    [m
[31m-    make -j2[m
[31m-    make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<form-input-nginx-module file list|http://github.com/calio/form-input-nginx-module/tags>, and the latest tarball for L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit> from its L<file list|https://github.com/simpl/ngx_devel_kit/tags>.[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_form_input_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Usage[m
[31m-[m
[31m-[m
[31m-    set_form_input $variable;[m
[31m-    set_form_input $variable argument;[m
[31m-    [m
[31m-    set_form_input_multi $variable;[m
[31m-    set_form_input_multi $variable argument;[m
[31m-[m
[31m-example:[m
[31m-[m
[31m-[m
[31m-    #nginx.conf[m
[31m-    [m
[31m-    location /foo {[m
[31m-        # ensure client_max_body_size == client_body_buffer_size[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 100k;[m
[31m-    [m
[31m-        set_form_input $data;    # read "data" field into $data[m
[31m-        set_form_input $foo foo; # read "foo" field into $foo[m
[31m-    }[m
[31m-    [m
[31m-    location /bar {[m
[31m-        # ensure client_max_body_size == client_body_buffer_size[m
[31m-        client_max_body_size 1m;[m
[31m-        client_body_buffer_size 1m;[m
[31m-    [m
[31m-        set_form_input_multi $data; # read all "data" field into $data[m
[31m-        set_form_input_multi $foo data; # read all "data" field into $foo[m
[31m-    [m
[31m-        array_join ' ' $data; # now $data is an string[m
[31m-        array_join ' ' $foo;  # now $foo is an string[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ngx_form_input will discard request bodies that are buffered[m
[31m-to disk files. When the client_max_body_size setting is larger than[m
[31m-client_body_buffer_size, request bodies that are larger[m
[31m-than client_body_buffer_size (but no larger than[m
[31m-client_max_body_size) will be buffered to disk files.[m
[31m-So it's important to ensure these two config settings take[m
[31m-the same values to avoid confustion.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.9.x (last tested: 1.9.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.8.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x (last tested: 1.7.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.5.x (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.4.x (last tested: 1.4.6)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (last tested: 1.0.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.9.x (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x E<gt>= 0.8.54[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2010, 2011, Jiale "calio" Zhi E<lt>vipcalio@gmail.comE<gt>.[m
[31m-[m
[31m-Copyright (c) 2010-2016, Yichun "agentzh" Zhang E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are[m
[31m-met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS[m
[31m-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED[m
[31m-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A[m
[31m-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/headers-more-nginx-module-0.30/headers-more-nginx-module-0.30.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/headers-more-nginx-module-0.30/headers-more-nginx-module-0.30.pod[m
[1mdeleted file mode 100644[m
[1mindex c463fe0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/headers-more-nginx-module-0.30/headers-more-nginx-module-0.30.pod[m
[1m+++ /dev/null[m
[36m@@ -1,603 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-B<ngx_headers_more> - Set and clear input and output headers...more than "add"![m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This document describes headers-more-nginx-module L<v0.30|https://github.com/openresty/headers-more-nginx-module/tags> released on 15 May 2015.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     # set the Server output header[m
[31m-     more_set_headers 'Server: my-server';[m
[31m-    [m
[31m-     # set and clear output headers[m
[31m-     location /bar {[m
[31m-         more_set_headers 'X-MyHeader: blah' 'X-MyHeader2: foo';[m
[31m-         more_set_headers -t 'text/plain text/css' 'Content-Type: text/foo';[m
[31m-         more_set_headers -s '400 404 500 503' -s 413 'Foo: Bar';[m
[31m-         more_clear_headers 'Content-Type';[m
[31m-    [m
[31m-         # your proxy_pass/memcached_pass/or any other config goes here...[m
[31m-     }[m
[31m-    [m
[31m-     # set output headers[m
[31m-     location /type {[m
[31m-         more_set_headers 'Content-Type: text/plain';[m
[31m-         # ...[m
[31m-     }[m
[31m-    [m
[31m-     # set input headers[m
[31m-     location /foo {[m
[31m-         set $my_host 'my dog';[m
[31m-         more_set_input_headers 'Host: $my_host';[m
[31m-         more_set_input_headers -t 'text/plain' 'X-Foo: bah';[m
[31m-    [m
[31m-         # now $host and $http_host have their new values...[m
[31m-         # ...[m
[31m-     }[m
[31m-    [m
[31m-     # replace input header X-Foo *only* if it already exists[m
[31m-     more_set_input_headers -r 'X-Foo: howdy';[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module allows you to add, set, or clear any output[m
[31m-or input header that you specify.[m
[31m-[m
[31m-This is an enhanced version of the standard[m
[31m-L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module because it provides more utilities like[m
[31m-resetting or clearing "builtin headers" like C<Content-Type>,[m
[31m-C<Content-Length>, and C<Server>.[m
[31m-[m
[31m-It also allows you to specify an optional HTTP status code[m
[31m-criteria using the C<-s> option and an optional content[m
[31m-type criteria using the C<-t> option while modifying the[m
[31m-output headers with the L<more_set_headers> and[m
[31m-L<more_clear_headers> directives. For example,[m
[31m-[m
[31m-[m
[31m-     more_set_headers -s 404 -t 'text/html' 'X-Foo: Bar';[m
[31m-[m
[31m-You can also specify multiple MIME types to filter out in a single C<-t> option.[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    more_set_headers -t 'text/html text/plain' 'X-Foo: Bar';[m
[31m-[m
[31m-Never use other paramemters like C<charset=utf-8> in the C<-t> option values; they will not[m
[31m-work as you would expect.[m
[31m-[m
[31m-Input headers can be modified as well. For example[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         more_set_input_headers 'Host: foo' 'User-Agent: faked';[m
[31m-         # now $host, $http_host, $user_agent, and[m
[31m-         #   $http_user_agent all have their new values.[m
[31m-     }[m
[31m-[m
[31m-The option C<-t> is also available in the[m
[31m-L<more_set_input_headers> and[m
[31m-L<more_clear_input_headers> directives (for request header filtering) while the C<-s> option[m
[31m-is not allowed.[m
[31m-[m
[31m-Unlike the standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module, this module's directives will by[m
[31m-default apply to all the status codes, including C<4xx> and C<5xx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 more_set_headers[m
[31m-[m
[31m-B<syntax:> I<more_set_headers [-t E<lt>content-type listE<gt>]... [-s E<lt>status-code listE<gt>]... E<lt>new-headerE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Replaces (if any) or adds (if not any) the specified output headers when the response status code matches the codes specified by the C<-s> option I<AND> the response content type matches the types specified by the C<-t> option.[m
[31m-[m
[31m-If either C<-s> or C<-t> is not specified or has an empty list value, then no match is required. Therefore, the following directive set the C<Server> output header to the custom value for I<any> status code and I<any> content type:[m
[31m-[m
[31m-[m
[31m-       more_set_headers    "Server: my_server";[m
[31m-[m
[31m-Existing response headers with the same name are always overridden. If you want to add headers incrementally, use the standard L<add_header|http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header> directive instead.[m
[31m-[m
[31m-A single directive can set/add multiple output headers. For example[m
[31m-[m
[31m-[m
[31m-       more_set_headers 'Foo: bar' 'Baz: bah';[m
[31m-[m
[31m-Multiple occurrences of the options are allowed in a single directive. Their values will be merged together. For instance[m
[31m-[m
[31m-[m
[31m-       more_set_headers -s 404 -s '500 503' 'Foo: bar';[m
[31m-[m
[31m-is equivalent to[m
[31m-[m
[31m-[m
[31m-       more_set_headers -s '404 500 503' 'Foo: bar';[m
[31m-[m
[31m-The new header should be the one of the forms:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-C<Name: Value>[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-C<Name: >[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-C<Name>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The last two effectively clear the value of the header C<Name>.[m
[31m-[m
[31m-Nginx variables are allowed in header values. For example:[m
[31m-[m
[31m-[m
[31m-        set $my_var "dog";[m
[31m-        more_set_headers "Server: $my_var";[m
[31m-[m
[31m-But variables won't work in header keys due to performance considerations.[m
[31m-[m
[31m-Multiple set/clear header directives are allowed in a single location, and they're executed sequentially.[m
[31m-[m
[31m-Directives inherited from an upper level scope (say, http block or server blocks) are executed before the directives in the location block.[m
[31m-[m
[31m-Note that although C<more_set_headers> is allowed in I<location> if blocks, it is I<not> allowed in the I<server> if blocks, as in[m
[31m-[m
[31m-[m
[31m-       ?  # This is NOT allowed![m
[31m-       ?  server {[m
[31m-       ?      if ($args ~ 'download') {[m
[31m-       ?          more_set_headers 'Foo: Bar';[m
[31m-       ?      }[m
[31m-       ?      ...[m
[31m-       ?  }[m
[31m-[m
[31m-Behind the scene, use of this directive and its friend L<more_clear_headers> will (lazily) register an ouput header filter that modifies C<< r->headers_out >> the way you specify.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 more_clear_headers[m
[31m-[m
[31m-B<syntax:> I<more_clear_headers [-t E<lt>content-type listE<gt>]... [-s E<lt>status-code listE<gt>]... E<lt>new-headerE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Clears the specified output headers.[m
[31m-[m
[31m-In fact,[m
[31m-[m
[31m-[m
[31m-        more_clear_headers -s 404 -t 'text/plain' Foo Baz;[m
[31m-[m
[31m-is exactly equivalent to[m
[31m-[m
[31m-[m
[31m-        more_set_headers -s 404 -t 'text/plain' "Foo: " "Baz: ";[m
[31m-[m
[31m-or[m
[31m-[m
[31m-[m
[31m-        more_set_headers -s 404 -t 'text/plain' Foo Baz[m
[31m-[m
[31m-See L<more_set_headers> for more details.[m
[31m-[m
[31m-Wildcard C<*> can also be used to specify a header name pattern. For example, the following directive effectively clears I<any> output headers starting by "C<X-Hidden->":[m
[31m-[m
[31m-[m
[31m-     more_clear_headers 'X-Hidden-*';[m
[31m-[m
[31m-The C<*> wildcard support was first introduced in L<v0.09>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 more_set_input_headers[m
[31m-[m
[31m-B<syntax:> I<more_set_input_headers [-r] [-t E<lt>content-type listE<gt>]... E<lt>new-headerE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-Very much like L<more_set_headers> except that it operates on input headers (or request headers) and it only supports the C<-t> option.[m
[31m-[m
[31m-Note that using the C<-t> option in this directive means filtering by the C<Content-Type> I<request> header, rather than the response header.[m
[31m-[m
[31m-Behind the scene, use of this directive and its friend L<more_clear_input_headers> will (lazily) register a C<rewrite phase> handler that modifies C<< r->headers_in >> the way you specify. Note that it always run at the I<end> of the C<rewrite> so that it runs I<after> the standard L<rewrite module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html> and works in subrequests as well.[m
[31m-[m
[31m-If the C<-r> option is specified, then the headers will be replaced to the new values I<only if> they already exist.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 more_clear_input_headers[m
[31m-[m
[31m-B<syntax:> I<more_clear_input_headers [-t E<lt>content-type listE<gt>]... E<lt>new-headerE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-Clears the specified input headers.[m
[31m-[m
[31m-In fact,[m
[31m-[m
[31m-[m
[31m-        more_clear_input_headers -s 404 -t 'text/plain' Foo Baz;[m
[31m-[m
[31m-is exactly equivalent to[m
[31m-[m
[31m-[m
[31m-        more_set_input_headers -s 404 -t 'text/plain' "Foo: " "Baz: ";[m
[31m-[m
[31m-or[m
[31m-[m
[31m-[m
[31m-        more_set_input_headers -s 404 -t 'text/plain' Foo Baz[m
[31m-[m
[31m-See L<more_set_input_headers> for more details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Unlike the standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module, this module does not automatically take care of the constraint among the C<Expires>, C<Cache-Control>, and C<Last-Modified> headers. You have to get them right yourself or use the L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module together with this module.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-You cannot remove the C<Connection> response header using this module because the C<Connection> response header is generated by the standard C<ngx_http_header_filter_module> in the Nginx core, whose output header filter runs always I<after> the filter of this module. The only way to actually remove the C<Connection> header is to patch the Nginx core, that is, editing the C function C<ngx_http_header_filter> in the C<src/http/ngx_http_header_filter_module.c> file.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.15 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/headers-more-nginx-module[m
[31m-    [m
[31m-     make[m
[31m-     make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<headers-more-nginx-module file list|https://github.com/openresty/headers-more-nginx-module/tags>.[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_headers_more_filter_module.so;[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<OpenResty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x>                       (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x>                       (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>                       (last tested: 1.6.2)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>                       (last tested: 1.5.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x>                       (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.3.x>                       (last tested: 1.3.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x>                       (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x>                       (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x>                       (last tested: 1.0.11)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x>                       (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x>                       (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.44>             (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.44 does not work with this module, please consider L<reporting a bug>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/chaoslawful/lua-nginx-module/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>headers-more-nginx-module|https://github.com/openresty/headers-more-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|https://github.com/openresty/headers-more-nginx-module/tree/master/t/> are[m
[31m-L<declarative|https://github.com/openresty/headers-more-nginx-module/blob/master/t/sanity.t> too. Thanks to the L<Test::Nginx|http://search.cpan.org/perldoc?Test::Nginx> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-headers-more-module:$PATH prove -r t[m
[31m-[m
[31m-To run the test suite with valgrind's memcheck, use the following commands:[m
[31m-[m
[31m-[m
[31m-     $ export PATH=/path/to/your/nginx-with-headers-more-module:$PATH[m
[31m-     $ TEST_NGINX_USE_VALGRIND=1 prove -r t[m
[31m-[m
[31m-You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary.[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-Some parts of the test suite requires modules L<proxy|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>, L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>, and L<echo|https://github.com/openresty/echo-nginx-module> to be enabled as well when building Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Support variables in new headers' keys.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the L<author> or just ask for a commit bit to the L<source repository> on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Authors[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) I<E<lt>agentzh@gmail.comE<gt>>, CloudFlare Inc.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Bernd Dorn ( E<lt>http://www.lovelysystems.com/E<gt> )[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-The code base is borrowed directly from the standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module in Nginx 0.8.24. This part of code is copyrighted by Igor Sysoev.[m
[31m-[m
[31m-Copyright (c) 2009-2014, Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-Copyright (c) 2010-2013, Bernd Dorn.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original thread on the Nginx mailing list that inspires this module's development: L<"A question about add_header replication"|http://forum.nginx.org/read.php?2,11206,11738>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The orginal announcement thread on the Nginx mailing list: L<"The "headers_more" module: Set and clear output headers...more than 'add'!"|http://forum.nginx.org/read.php?2,23460>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original L<blog post|http://agentzh.blogspot.com/2009/11/headers-more-module-scripting-input-and.html> about this module's initial development.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<echo module|https://github.com/openresty/echo-nginx-module> for Nginx module's automated testing.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/iconv-nginx-module-0.14/iconv-nginx-module-0.14.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/iconv-nginx-module-0.14/iconv-nginx-module-0.14.pod[m
[1mdeleted file mode 100644[m
[1mindex c0d8415..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/iconv-nginx-module-0.14/iconv-nginx-module-0.14.pod[m
[1m+++ /dev/null[m
[36m@@ -1,242 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-iconv-nginx-module[m
[31m-[m
[31m-[m
[31m-[m
[31m-This is a nginx module that uses libiconv to convert characters of different[m
[31m-encoding. It brings the 'set_iconv' command to nginx.[m
[31m-[m
[31m-This module depends on the ngx_devel_kit(NDK) module.[m
[31m-[m
[31m-[m
[31m-=head1 Usage[m
[31m-[m
[31m-[m
[31m-=head2 set_iconv[m
[31m-[m
[31m-B<syntax:> I<set_iconv E<lt>destination_variableE<gt> E<lt>from_variableE<gt> from=E<lt>from_encodingE<gt> to=E<lt>to_encodingE<gt>>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 iconv_buffer_size[m
[31m-[m
[31m-B<syntax:> I<iconv_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<iconv_buffer_size E<lt>pagesizeE<gt>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 iconv_filter[m
[31m-[m
[31m-B<syntax:> I<iconv_filter from=E<lt>from_encodingE<gt> to=E<lt>to_encodingE<gt>>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<phase:> I<output-filter>[m
[31m-[m
[31m-Here is a basic example:[m
[31m-[m
[31m-[m
[31m-     #nginx.conf[m
[31m-    [m
[31m-     location /foo {[m
[31m-         set $src '你好'; #in UTF-8[m
[31m-         set_iconv $dst $src from=utf8 to=gbk; #now $dst holds 你好 in GBK[m
[31m-     }[m
[31m-    [m
[31m-     #everything generated from /foo will be converted from utf8 to gbk[m
[31m-     location /bar {[m
[31m-         iconv_filter from=utf-8 to=gbk;[m
[31m-         iconv_buffer_size 1k;[m
[31m-         #content handler here[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.9.x (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.8.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.5.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.4.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.3.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.2.x (last tested: 1.2.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (last tested: 1.0.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.9.x (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.7.x (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-Get the nginx source code from L<nginx.org|http://nginx.org/>.[m
[31m-Untar the source code and build nginx with this module.[m
[31m-[m
[31m-[m
[31m-     wget 'http://sysoev.ru/nginx/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     git-clone http://github.com/simpl-it/ngx_devel_kit.git[m
[31m-     git-clone http://github.com/calio/form-input-module.git[m
[31m-    [m
[31m-     ./configure --add-module=/path/to/iconv-nginx-module/ --add-module=/path/to/ngx_devel_kit[m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_iconv_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This program is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (c) 2010-2016, Calio E<lt>vipcalio@gmail.comE<gt>.[m
[31m-[m
[31m-Copyright (c) 2010-2016, Yichun Zhang E<lt>agentzh@gmail.comE<gt>.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Neither the name of the Taobao Inc. nor the names of its[m
[31m-contributors may be used to endorse or promote products derived from[m
[31m-this software without specific prior written permission.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changelog[m
[31m-[m
[31m-This module's change logs are part of the OpenResty bundle's change logs. Please see[m
[31m-See E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<OpenResty|https://openresty.org> bundle.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-cjson-2.1.0.4/lua-cjson-2.1.0.4.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-cjson-2.1.0.4/lua-cjson-2.1.0.4.pod[m
[1mdeleted file mode 100644[m
[1mindex 26615d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-cjson-2.1.0.4/lua-cjson-2.1.0.4.pod[m
[1m+++ /dev/null[m
[36m@@ -1,113 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-cjson - Fast JSON encoding/parsing[m
[31m-[m
[31m-[m
[31m-[m
[31m-This fork of L<mpxE<sol>lua-cjson|https://github.com/mpx/lua-cjson> is included in[m
[31m-the L<OpenResty|https://openresty.org/> bundle and includes a few bugfixes and[m
[31m-improvements, especially to facilitate the encoding of empty tables as JSON Arrays.[m
[31m-[m
[31m-Please refer to the L<lua-cjson documentation|http://www.kyne.com.au/~mark/software/lua-cjson.php>[m
[31m-for standard usage, this README only provides informations regarding this fork's additions.[m
[31m-[m
[31m-See L<`mpxE<sol>master..openrestyE<sol>master`|https://github.com/mpx/lua-cjson/compare/master...openresty:master>[m
[31m-for the complete history of changes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Additions[m
[31m-[m
[31m-[m
[31m-=head2 encode_empty_table_as_object[m
[31m-[m
[31m-B<syntax:> C<cjson.encode_empty_table_as_object(true|false|"on"|"off")>[m
[31m-[m
[31m-Change the default behavior when encoding an empty Lua table.[m
[31m-[m
[31m-By default, empty Lua tables are encoded as empty JSON Objects (C<{}>). If this is set to false,[m
[31m-empty Lua tables will be encoded as empty JSON Arrays instead (C<[]>).[m
[31m-[m
[31m-This method either accepts a boolean or a string (C<"on">, C<"off">).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 empty_array[m
[31m-[m
[31m-B<syntax:> C<cjson.empty_array>[m
[31m-[m
[31m-A lightuserdata, similar to C<cjson.null>, which will be encoded as an empty JSON Array by[m
[31m-C<cjson.encode()>.[m
[31m-[m
[31m-For example, since C<encode_empty_table_as_object> is C<true> by default:[m
[31m-[m
[31m-[m
[31m-    local cjson = require "cjson"[m
[31m-    [m
[31m-    local json = cjson.encode({[m
[31m-        foo = "bar",[m
[31m-        some_object = {},[m
[31m-        some_array = cjson.empty_array[m
[31m-    })[m
[31m-[m
[31m-This will generate:[m
[31m-[m
[31m-[m
[31m-    {[m
[31m-        "foo": "bar",[m
[31m-        "some_object": {},[m
[31m-        "some_array": [][m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 empty_array_mt[m
[31m-[m
[31m-B<syntax:> C<setmetatable({}, cjson.empty_array_mt)>[m
[31m-[m
[31m-A metatable which can "tag" a table as a JSON Array in case it is empty (that is, if the[m
[31m-table has no elements, C<cjson.encode()> will encode it as an empty JSON Array).[m
[31m-[m
[31m-Instead of:[m
[31m-[m
[31m-[m
[31m-    local function serialize(arr)[m
[31m-        if #arr < 1 then[m
[31m-            arr = cjson.empty_array[m
[31m-        end[m
[31m-    [m
[31m-        return cjson.encode({some_array = arr})[m
[31m-    end[m
[31m-[m
[31m-This is more concise:[m
[31m-[m
[31m-[m
[31m-    local function serialize(arr)[m
[31m-        setmetatable(arr, cjson.empty_array_mt)[m
[31m-    [m
[31m-        return cjson.encode({some_array = arr})[m
[31m-    end[m
[31m-[m
[31m-Both will generate:[m
[31m-[m
[31m-[m
[31m-    {[m
[31m-        "some_array": [][m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 encode_number_precision[m
[31m-[m
[31m-B<syntax:> C<cjson.encode_number_precision(precision)>[m
[31m-[m
[31m-This fork allows encoding of numbers with a C<precision> up to 16 decimals (vs. 14 in mpx/lua-cjson).[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-redis-parser-0.12/lua-redis-parser-0.12.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-redis-parser-0.12/lua-redis-parser-0.12.pod[m
[1mdeleted file mode 100644[m
[1mindex ff8c734..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-redis-parser-0.12/lua-redis-parser-0.12.pod[m
[1m+++ /dev/null[m
[36m@@ -1,373 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-lua-redis-parser - Redis reply parser and request constructor library for Lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-This document describes lua-redis-parser L<v0.09rc5|https://github.com/agentzh/lua-redis-parser/tags> released on 28 August 2011.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This lua library implements a thin and fast redis raw response parser[m
[31m-that constructs corresponding lua data strucutres, as well as a[m
[31m-function that constructs redis raw requests.[m
[31m-[m
[31m-To maximize speed, this module is implemented in pure C.[m
[31m-[m
[31m-This library is usually used by Lua code running atop L<lua-nginx-module|http://github.com/chaoslawful/lua-nginx-module> to access[m
[31m-redis backends though L<redis2-nginx-module|http://github.com/agentzh/redis2-nginx-module>.[m
[31m-[m
[31m-[m
[31m-=head1 Functions[m
[31m-[m
[31m-The C<parser> variable used below is referring to the variable holding the return value of C<require "redis.parser">. In other words, we assume you have written the following code first:[m
[31m-[m
[31m-[m
[31m-        local parser = require "redis.parser"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 parse_reply[m
[31m-[m
[31m-B<syntax:> I<res, typ = parser.parse_reply(raw_reply)>[m
[31m-[m
[31m-Parses the single (or the first) raw redis reply from the C<raw_reply> string and returns the Lua data structure C<res>, as well as the reply type C<typ>.[m
[31m-[m
[31m-Here is an example:[m
[31m-[m
[31m-[m
[31m-        local parser = require 'redis.parser'[m
[31m-    [m
[31m-        -- assuming the reply variable holds the (single) redis response[m
[31m-        --  to be parsed:[m
[31m-        local res, typ = parser.parse_reply(reply)[m
[31m-    [m
[31m-        if typ == parser.BAD_REPLY then[m
[31m-            -- res is the textual error message from the parser[m
[31m-        elseif typ == parser.INTEGER_REPLY then[m
[31m-            -- res is an integer, like 3, returned from the redis server[m
[31m-        elseif typ == parser.ERROR_REPLY then[m
[31m-            -- res is the error message from the redis2 server[m
[31m-        elseif typ == parser.STATUS_REPLY then[m
[31m-            -- res is the textual message from the redis server[m
[31m-        elseif typ == parser.BULK_REPLY then[m
[31m-            --- res is a string for the bulk data[m
[31m-        elseif typ == parser.MULTI_BULK_REPLY then[m
[31m-            -- res is a lua (array) table that holds the individual bulks[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 parse_replies[m
[31m-[m
[31m-B<syntax:> I<results = parser.parse_replies(raw_replies)>[m
[31m-[m
[31m-Similar to the L<parse_reply> method, but parse multiple pipelined redis replies in the C<raw_replies> string argument. Returns a table of all the parsed results where each result is an array-like table consists of two elements, C<res> and C<typ>, which have exactly the same meaning as the return values of the L<parse_reply> function.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-        local parser = require "redis.parser"[m
[31m-    [m
[31m-        -- assuming the replies variable holds n redis responses[m
[31m-        --  to be parsed:[m
[31m-        local results = parser.parse_replies(replies, n)[m
[31m-        for i, result in ipairs(results) do[m
[31m-            local res = result[1][m
[31m-            local typ = result[2][m
[31m-    [m
[31m-            -- res and typ have exactly the same meaning as in[m
[31m-            --  the parse_reply method documented above[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 typename[m
[31m-[m
[31m-B<syntax:> I<str = parser.typename(typ)>[m
[31m-[m
[31m-Returns the textual representation of the reply type values returned by the L<parse_reply> and L<parse_replies> functions. Here's the correspondence:[m
[31m-[m
[31m-[m
[31m-        parser.typename(parser.BAD_REPLY)        == "bad reply"[m
[31m-        parser.typename(parser.INTEGER_REPLY)    == "integer reply"[m
[31m-        parser.typename(parser.ERROR_REPLY)      == "error reply"[m
[31m-        parser.typename(parser.STATUS_REPLY)     == "status reply"[m
[31m-        parser.typename(parser.BULK_REPLY)       == "bulk reply"[m
[31m-        parser.typename(parser.MULTI_BULK_REPLY) == "multi-bulk reply"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 build_query[m
[31m-[m
[31m-B<syntax:> I<raw_request = parser.build_query(args)>[m
[31m-[m
[31m-Constructs a raw Redis request from simple Lua values. It simply accepts a Lua array-like table, a list of parameters including[m
[31m-the command name.[m
[31m-[m
[31m-Please check out the complete list of redis 2.0 commands,[m
[31m-[m
[31m-E<lt>http://redis.io/commandsE<gt>[m
[31m-[m
[31m-The first command in that list, "APPEND   key value", for example, we can just use[m
[31m-[m
[31m-[m
[31m-        local parser = require "redis.parser"[m
[31m-    [m
[31m-        local req = parser.build_query({'APPEND', 'some-key', 'some-value'})[m
[31m-[m
[31m-to construct a binary request in the return value. Because the Redis command is case insensitive, I usually just use 'append', the lower case form, as the first element of that list, as in[m
[31m-[m
[31m-[m
[31m-        local parser = require "redis.parser"[m
[31m-    [m
[31m-        local req = parser.build_query({'set', 'foo', 'some value'})[m
[31m-            -- req is the raw TCP request ready to send to the remote redis server[m
[31m-            -- over the TCP connection[m
[31m-[m
[31m-Null values should be specified by C<parser.null> rather than Lua's C<nil> value.[m
[31m-[m
[31m-Boolean values will be converted to C<1> or C<0>, for C<true> and C<false>, respectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Constants[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 BAD_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.BAD_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 INTEGER_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.INTEGER_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ERROR_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.ERROR_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 STATUS_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.STATUS_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 BULK_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.BULK_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 MULTI_BULK_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.MULTI_BULK_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 null[m
[31m-[m
[31m-B<syntax:> I<val = parser.null>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Background[m
[31m-[m
[31m-This module is originally written for L<lua-nginx-module|http://github.com/chaoslawful/lua-nginx-module> and L<redis2-nginx-module|http://github.com/agentzh/redis2-nginx-module>:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-create a ticket on the L<issue tracking interface|http://github.com/agentzh/lua-redis-parser/issues> provided by GitHub,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or send a bug report or even patches to C<agentzh@gmail.com>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on GitHub at L<agentzhE<sol>lua-redis-parser|http://github.com/agentzh/lua-redis-parser>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Build requirements[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Lua (http://www.lua.org/)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-or LuaJIT (http://www.luajit.org/)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Latest source tarball of this library downloaded from E<lt>https://github.com/agentzh/lua-redis-parser/tagsE<gt>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Gnu make and gcc is required to build this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Linux/BSD/Solaris[m
[31m-[m
[31m-[m
[31m-        gmake CC=gcc[m
[31m-        gmake install CC=gcc[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Mac OS X[m
[31m-[m
[31m-[m
[31m-        make LDFLAGS='-bundle -undefined dynamic_lookup' CC=gcc[m
[31m-        make install[m
[31m-[m
[31m-If your Lua or LuaJIT is not installed into the system, specify its include directory like this:[m
[31m-[m
[31m-[m
[31m-        make LUA_INCLUDE_DIR=/opt/luajit/include/luajit-2.0[m
[31m-[m
[31m-You can specify a custom path for the installation target:[m
[31m-[m
[31m-[m
[31m-        make install LUA_LIB_DIR=/opt/lualib[m
[31m-[m
[31m-The C<DESTDIR> variable is also supported, to ease RPM packaging.[m
[31m-[m
[31m-This library is included and enabled by default in the L<ngx_openresty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This module is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2009-2015, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SEE ALSO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Use case: L<Dynamic Routing Based On Redis|http://openresty.org/#DynamicRoutingBasedOnRedis>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-nginx-module|http://github.com/chaoslawful/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<redis2-nginx-module|http://github.com/agentzh/redis2-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Redis official site|http://redis.io/>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/lua-resty-core-0.1.6.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/lua-resty-core-0.1.6.pod[m
[1mdeleted file mode 100644[m
[1mindex 9de8740..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/lua-resty-core-0.1.6.pod[m
[1m+++ /dev/null[m
[36m@@ -1,529 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-core - New FFI-based Lua API for the ngx_lua module[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is production ready and under active development.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-    [m
[31m-        http {[m
[31m-            # you do NOT need to configure the following line when you[m
[31m-            # are using the OpenResty bundle 1.4.3.9+.[m
[31m-            lua_package_path "/path/to/lua-resty-core/lib/?.lua;;";[m
[31m-    [m
[31m-            init_by_lua '[m
[31m-                require "resty.core"[m
[31m-            ';[m
[31m-    [m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This pure Lua library reimplements part of the L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme> module's[m
[31m-L<Nginx API for Lua|https://github.com/openresty/lua-nginx-module#nginx-api-for-lua>[m
[31m-with LuaJIT FFI and installs the new FFI-based Lua API into the ngx.I< and ndk.> namespaces[m
[31m-used by the ngx_lua module.[m
[31m-[m
[31m-In addition, this Lua library implements any significant new Lua APIs of[m
[31m-the L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme> module[m
[31m-as proper Lua modules, like L<ngx.semaphore> and L<ngx.balancer>.[m
[31m-[m
[31m-The FFI-based Lua API can work with LuaJIT's JIT compiler. ngx_lua's default API is based on the standard[m
[31m-Lua C API, which will never be JIT compiled and the user Lua code is always interpreted (slowly).[m
[31m-[m
[31m-This library is shipped with the OpenResty bundle by default. So you do not really need to worry about the dependencies[m
[31m-and requirements.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Prerequisites[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-LuaJIT 2.1 (for now, it is the v2.1 git branch in the official luajit-2.0 git repository: http://luajit.org/download.html )[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/openresty/lua-nginx-module> v0.10.3 or later.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-lrucache|https://github.com/openresty/lua-resty-lrucache>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 API Implemented[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.hash[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.md5|https://github.com/openresty/lua-nginx-module#ngxmd5>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.md5_bin|https://github.com/openresty/lua-nginx-module#ngxmd5_bin>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.sha1_bin|https://github.com/openresty/lua-nginx-module#ngxsha1_bin>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.base64[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.encode_base64|https://github.com/openresty/lua-nginx-module#ngxencode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.decode_base64|https://github.com/openresty/lua-nginx-module#ngxdecode_base64>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.uri[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.escape_uri|https://github.com/openresty/lua-nginx-module#ngxescape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.unescape_uri|https://github.com/openresty/lua-nginx-module#ngxunescape_uri>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.regex[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.match|https://github.com/openresty/lua-nginx-module#ngxrematch>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.find|https://github.com/openresty/lua-nginx-module#ngxrefind>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.sub|https://github.com/openresty/lua-nginx-module#ngxresub>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.gsub|https://github.com/openresty/lua-nginx-module#ngxregsub>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.exit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.exit|https://github.com/openresty/lua-nginx-module#ngxexit>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.shdict[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.get|https://github.com/openresty/lua-nginx-module#ngxshareddictget>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.get_stale|https://github.com/openresty/lua-nginx-module#ngxshareddictget_stale>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.incr|https://github.com/openresty/lua-nginx-module#ngxshareddictincr>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.set|https://github.com/openresty/lua-nginx-module#ngxshareddictset>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.safe_set|https://github.com/openresty/lua-nginx-module#ngxshareddictsafe_set>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.add|https://github.com/openresty/lua-nginx-module#ngxshareddictadd>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.safe_add|https://github.com/openresty/lua-nginx-module#ngxshareddictsafe_add>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.replace|https://github.com/openresty/lua-nginx-module#ngxshareddictreplace>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.delete|https://github.com/openresty/lua-nginx-module#ngxshareddictdelete>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.flush_all|https://github.com/openresty/lua-nginx-module#ngxshareddictflush_all>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.var[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.var.VARIABLE|https://github.com/openresty/lua-nginx-module#ngxvarvariable>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.ctx|https://github.com/openresty/lua-nginx-module#ngxctx>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_headers|https://github.com/openresty/lua-nginx-module#ngxreqget_headers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_uri_args|https://github.com/openresty/lua-nginx-module#ngxreqget_uri_args>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.start_time|https://github.com/openresty/lua-nginx-module#ngxreqstart_time>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_method|https://github.com/openresty/lua-nginx-module#ngxreqget_method>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_method|https://github.com/openresty/lua-nginx-module#ngxreqset_method>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_header|https://github.com/openresty/lua-nginx-module#ngxreqset_header>  (partial: table-typed header values not supported yet)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.clear_header|https://github.com/openresty/lua-nginx-module#ngxreqclear_header>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.response[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.header.HEADER|https://github.com/openresty/lua-nginx-module#ngxheaderheader>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.misc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.status|https://github.com/openresty/lua-nginx-module#ngxstatus>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.is_subrequest|https://github.com/openresty/lua-nginx-module#ngxis_subrequest>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.headers_sent|https://github.com/openresty/lua-nginx-module#ngxheaders_sent>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.time[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.time|https://github.com/openresty/lua-nginx-module#ngxtime>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.now|https://github.com/openresty/lua-nginx-module#ngxnow>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.worker[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.exiting|https://github.com/openresty/lua-nginx-module#ngxworkerexiting>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.pid|https://github.com/openresty/lua-nginx-module#ngxworkerpid>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.id|https://github.com/openresty/lua-nginx-module#ngxworkerid>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.count|https://github.com/openresty/lua-nginx-module#ngxworkercount>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.semaphore[m
[31m-[m
[31m-[m
[31m-This Lua module implements a semaphore API for efficient "light thread" synchronization,[m
[31m-which can work across different requests (but not across nginx worker processes).[m
[31m-[m
[31m-See the L<documentation|./lib/ngx/semaphore.md> for this Lua module for more details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.balancer[m
[31m-[m
[31m-[m
[31m-This Lua module implements for defining dynamic upstream balancers in Lua.[m
[31m-[m
[31m-See the L<documentation|./lib/ngx/balancer.md> for this Lua module for more details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Caveat[m
[31m-[m
[31m-If the user Lua code is not JIT compiled, then use of this library may[m
[31m-lead to performance drop in interpreted mode. You will only observe[m
[31m-speedup when you get a good part of your user Lua code JIT compiled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Re-implement C<ngx_lua>'s cosocket API with FFI.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Re-implement C<ngx_lua>'s C<ngx.get_phase> API function with FFI.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Re-implement C<ngx_lua>'s C<ngx.eof> and C<ngx.flush> API functions with FFI.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2013-2016, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module#readme[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-LuaJIT FFI: http://luajit.org/ext_ffi.html[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.balancer.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.balancer.pod[m
[1mdeleted file mode 100644[m
[1mindex 5d94fd6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.balancer.pod[m
[1m+++ /dev/null[m
[36m@@ -1,266 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx.balancer - Lua API for defining dynamic upstream balancers in Lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-This Lua module is currently considered experimental.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    http {[m
[31m-        upstream backend {[m
[31m-            server 0.0.0.1;   # just an invalid address as a place holder[m
[31m-    [m
[31m-            balancer_by_lua_block {[m
[31m-                local balancer = require "ngx.balancer"[m
[31m-    [m
[31m-                -- well, usually we calculate the peer's host and port[m
[31m-                -- according to some balancing policies instead of using[m
[31m-                -- hard-coded values like below[m
[31m-                local host = "127.0.0.2"[m
[31m-                local port = 8080[m
[31m-    [m
[31m-                local ok, err = balancer.set_current_peer(host, port)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to set the current peer: ", err)[m
[31m-                    return ngx.exit(500)[m
[31m-                end[m
[31m-            }[m
[31m-    [m
[31m-            keepalive 10;  # connection pool[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            # this is the real entry point[m
[31m-            listen 80;[m
[31m-    [m
[31m-            location / {[m
[31m-                # make use of the upstream named "backend" defined above:[m
[31m-                proxy_pass http://backend/fake;[m
[31m-            }[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            # this server is just for mocking up a backend peer here...[m
[31m-            listen 127.0.0.2:8080;[m
[31m-    [m
[31m-            location = /fake {[m
[31m-                echo "this is the fake backend peer...";[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua module provides API functions to allow defining highly dynamic NGINX load balancers for[m
[31m-any existing nginx upstream modules like [http://nginx.org/en/docs/http/ngx_http_proxy_module.html ngx_proxy] and[m
[31m-[http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html ngx_fastcgi].[m
[31m-[m
[31m-It allows you to dynamically select a backend peer to connect to (or retry) on a per-request[m
[31m-basis from a list of backend peers which may also be dynamic.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-All the methods of this module are static (or module-level). That is, you do not need an object (or instance)[m
[31m-to call these methods.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_current_peer[m
[31m-[m
[31m-B<syntax:> I<ok, err = balancer.set_current_peer(host, port)>[m
[31m-[m
[31m-B<context:> I<balancer_by_luaE<42>>[m
[31m-[m
[31m-Sets the peer address (host and port) for the current backend query (which may be a retry).[m
[31m-[m
[31m-Domain names in C<host> do not make sense. You need to use OpenResty libraries like[m
[31m-L<lua-resty-dns|https://github.com/openresty/lua-resty-dns> to obtain IP address(es) from[m
[31m-all the domain names before entering the C<balancer_by_lua*> handler (for example,[m
[31m-you can perform DNS lookups in an earlier phase like L<access_by_lua*|https://github.com/openresty/lua-nginx-module#access_by_lua>[m
[31m-and pass the results to the C<balancer_by_lua*> handler via L<ngx.ctx|https://github.com/openresty/lua-nginx-module#ngxctx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_more_tries[m
[31m-[m
[31m-B<syntax:> I<ok, err = balancer.set_more_tries(count)>[m
[31m-[m
[31m-B<context:> I<balancer_by_luaE<42>>[m
[31m-[m
[31m-Sets the tries performed when the current attempt (which may be a retry) fails (as determined[m
[31m-by directives like L<proxy_next_upstream|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream>, depending on what[m
[31m-particular nginx uptream module you are currently using. Note that the current attempt is I<excluded> in the C<count> number set here.[m
[31m-[m
[31m-Please note that, the total number of tries in a single downstream request cannot exceed the[m
[31m-hard limit configured by directives like L<proxy_next_upstream_tries|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream_tries>,[m
[31m-depending on what concrete nginx upstream module you are using. When exceeding this limit,[m
[31m-the C<count> value will get reduced to meet the limit and the second return value will be[m
[31m-the string C<"reduced tries due to limit">, which is a warning, while the first return value[m
[31m-is still a C<true> value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_last_failure[m
[31m-[m
[31m-B<syntax:> I<state_name, status_code = balancer.get_last_failure()>[m
[31m-[m
[31m-B<context:> I<balancer_by_luaE<42>>[m
[31m-[m
[31m-Retrieves the failure details about the previous failed attempt (if any) when the C<next_upstream> retrying[m
[31m-mechanism is in action. When there was indeed a failed previous attempt, it returned a string descrbing[m
[31m-that attempt's state name, as well as an integer describing the status code of that attempt.[m
[31m-[m
[31m-Possible state names are as follows:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<"next">[m
[31m-Failures due to bad status codes sent from the backend server. The origin's response is sane though, which means the backend connection[m
[31m-can still be reused for future requests.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<"failed">[m
[31m-Fatal errors while communicating to the backend server (like connection timeouts, connection resets, and etc). In this case,[m
[31m-the backend connection must be aborted and cannot get reused.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Possible status codes are those HTTP error status codes like C<502> and C<504>.[m
[31m-[m
[31m-When the current attempt is the first attempt for the current downstream request (which means[m
[31m-there is no previous attempts at all), this[m
[31m-method always returns a single C<nil> value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-resty-core/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun Zhang E<lt>agentzh@gmail.comE<gt> (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<balancer_by_lua*|https://github.com/openresty/lua-nginx-module#balancer_by_lua_block> directive.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-library L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.ocsp.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.ocsp.pod[m
[1mdeleted file mode 100644[m
[1mindex 23d69ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.ocsp.pod[m
[1m+++ /dev/null[m
[36m@@ -1,333 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx.ocsp - Lua API for implementing OCSP stapling in ssl_certificate_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-This Lua module is currently considered experimental.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    # Note: you do not need the following line if you are using[m
[31m-    # OpenResty 1.9.7.2+.[m
[31m-    lua_package_path "/path/to/lua-resty-core/lib/?.lua;;";[m
[31m-    [m
[31m-    server {[m
[31m-        listen 443 ssl;[m
[31m-        server_name   test.com;[m
[31m-    [m
[31m-        # useless placeholders: just to shut up NGINX configuration[m
[31m-        # loader errors:[m
[31m-        ssl_certificate /path/to/fallback.crt;[m
[31m-        ssl_certificate_key /path/to/fallback.key;[m
[31m-    [m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-            local http = require "resty.http.simple"[m
[31m-    [m
[31m-            -- assuming the user already defines the my_load_certificate_chain()[m
[31m-            -- herself.[m
[31m-            local pem_cert_chain = assert(my_load_certificate_chain())[m
[31m-    [m
[31m-            local der_cert_chain, err = ssl.cert_pem_to_der(pem_cert_chain)[m
[31m-            if not der_cert_chain then[m
[31m-                ngx.log(ngx.ERR, "failed to convert certificate chain ",[m
[31m-                        "from PEM to DER: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local ocsp_url, err = ocsp.get_ocsp_responder_from_der_chain(der_cert_chain)[m
[31m-            if not ocsp_url then[m
[31m-                ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            print("ocsp_url: ", ocsp_url)[m
[31m-    [m
[31m-            -- use cosocket-based HTTP client libraries like lua-resty-http-simple[m
[31m-            -- to send the request (url + ocsp_req as POST params or URL args) to[m
[31m-            -- CA's OCSP server. assuming the server returns the OCSP response[m
[31m-            -- in the Lua varaible, resp.[m
[31m-    [m
[31m-            local schema, host, port, ocsp_uri, err = parse_url(ocsp_url)[m
[31m-    [m
[31m-            local ocsp_req, err = ocsp.create_ocsp_request(der_cert_chain)[m
[31m-            if not ocsp_req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local res, err = http.request(host, port, {[m
[31m-                path = ocsp_uri,[m
[31m-                headers = { Host = host,[m
[31m-                            ["Content-Type"] = "application/ocsp-request" },[m
[31m-                timeout = 10000,  -- 10 sec[m
[31m-                method = "POST",[m
[31m-                body = ocsp_req,[m
[31m-                maxsize = 102400,  -- 100KB[m
[31m-            })[m
[31m-    [m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "OCSP responder query failed: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local http_status = res.status[m
[31m-    [m
[31m-            if http_status ~= 200 then[m
[31m-                ngx.log(ngx.ERR, "OCSP responder returns bad HTTP status code ",[m
[31m-                        http_status)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local ocsp_resp = res.body[m
[31m-    [m
[31m-            if ocsp_resp and #ocsp_resp > 0 then[m
[31m-                local ok, err = ocsp.validate_ocsp_response(ocsp_resp, der_cert_chain)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                    return ngx.exit(ngx.ERROR)[m
[31m-                end[m
[31m-    [m
[31m-                -- set the OCSP stapling[m
[31m-                ok, err = ocsp.set_ocsp_status_resp(resp)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to set ocsp status resp: ", err)[m
[31m-                    return ngx.exit(ngx.ERROR)[m
[31m-                end[m
[31m-            end[m
[31m-        }[m
[31m-    [m
[31m-        location / {[m
[31m-            root html;[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua module provides API to perform OCSP queries, OCSP response validations, and[m
[31m-OCSP stapling planting.[m
[31m-[m
[31m-Usually, this module is used together with the L<ngx.ssl|ssl.md> module in the[m
[31m-context of L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block>[m
[31m-(of the L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme> module).[m
[31m-[m
[31m-To load the C<ngx.ocsp> module in Lua, just write[m
[31m-[m
[31m-[m
[31m-    local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-=head2 get_ocsp_responder_from_der_chain[m
[31m-[m
[31m-B<syntax:> I<ocsp_url, err = ocsp.get_ocsp_responder_from_der_chain(der_cert_chain, max_len)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Extracts the OCSP responder URL (like C<"http://test.com/ocsp/">) from the SSL server certificate chain in the DER format.[m
[31m-[m
[31m-Usually the SSL server certificate chain is originally formatted in PEM. You can use the Lua API[m
[31m-provided by the L<ngx.ssl|ssl.md> module to do the PEM to DER conversion.[m
[31m-[m
[31m-The optional C<max_len> argument specifies the maximum length of OCSP URL allowed. This determines[m
[31m-the buffer size; so do not specify an unnecessarily large value here. It defaults to the internal[m
[31m-string buffer size used throughout this C<lua-resty-core> library (usually default to 4KB).[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 create_ocsp_request[m
[31m-[m
[31m-B<syntax:> I<ocsp_req, err = ocsp.create_ocsp_request(der_cert_chain, max_len)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Builds an OCSP request from the SSL server certificate chain in the DER format, which[m
[31m-can be used to send to the OCSP server for validation.[m
[31m-[m
[31m-The optional C<max_len> argument specifies the maximum length of the OCSP request allowed.[m
[31m-This value determines the size of the internal buffer allocated, so do not specify an[m
[31m-unnecessarily large value here. It defaults to the internal string buffer size used[m
[31m-throughout this C<lua-resty-core> library (usually defaults to 4KB).[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The raw OCSP response data can be used as the request body directly if the POST method[m
[31m-is used for the OCSP request. But for GET requests, you need to do base64 encoding and[m
[31m-then URL encoding on the data yourself before appending it to the OCSP URL obtained[m
[31m-by the L<get_ocsp_responder_from_der_chain> function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 validate_ocsp_response[m
[31m-[m
[31m-B<syntax:> I<ok, err = ocsp.validate_ocsp_response(ocsp_resp, der_cert_chain, max_err_msg_len)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Validates the raw OCSP response data specified by the C<ocsp_resp> argument using the SSL[m
[31m-server certificate chain in DER format as specified in the C<der_cert_chain> argument.[m
[31m-[m
[31m-Returns true when the validation is successful.[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string[m
[31m-describing the failure. The maximum[m
[31m-length of the error string is controlled by the optional C<max_err_msg> argument (which defaults[m
[31m-to the default internal string buffer size used throughout this C<lua-resty-core> library, usually[m
[31m-being 4KB).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_ocsp_status_resp[m
[31m-[m
[31m-B<syntax:> I<ok, err = ocsp.set_ocsp_status_resp(ocsp_resp)>[m
[31m-[m
[31m-B<context:> I<ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sets the OCSP response as the OCSP stapling for the current SSL connection.[m
[31m-[m
[31m-Returns C<true> in case of successes. If the SSL client does not send a "status request"[m
[31m-at all, then this method still returns C<true> but also with a string as the warning[m
[31m-C<"no status req">.[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The OCSP response is returned from CA's OCSP server. See the L<create_ocsp_request>[m
[31m-function for how to create an OCSP request and also L<validate_ocsp_response>[m
[31m-for how to validate the OCSP response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-resty-core/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun Zhang E<lt>agentzh@gmail.comE<gt> (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ngx.ssl|ssl.md> module.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block> directive.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-library L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.semaphore.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.semaphore.pod[m
[1mdeleted file mode 100644[m
[1mindex 9cc877d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.semaphore.pod[m
[1m+++ /dev/null[m
[36m@@ -1,376 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx.semaphore - light thread semaphore for OpenResty/ngx_lua.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This Lua module is currently considered experimental.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-=head2 Synchronizing threads in the same context[m
[31m-[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sema = semaphore.new()[m
[31m-    [m
[31m-            local function handler()[m
[31m-                ngx.say("sub thread: waiting on sema...")[m
[31m-    [m
[31m-                local ok, err = sema:wait(1)  -- wait for a second at most[m
[31m-                if not ok then[m
[31m-                    ngx.say("sub thread: failed to wait on sema: ", err)[m
[31m-                else[m
[31m-                    ngx.say("sub thread: waited successfully.")[m
[31m-                end[m
[31m-            end[m
[31m-    [m
[31m-            local co = ngx.thread.spawn(handler)[m
[31m-    [m
[31m-            ngx.say("main thread: sleeping for a little while...")[m
[31m-    [m
[31m-            ngx.sleep(0.1)  -- wait a bit[m
[31m-    [m
[31m-            ngx.say("main thread: posting to sema...")[m
[31m-    [m
[31m-            sema:post(1)[m
[31m-    [m
[31m-            ngx.say("main thread: end.")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-The example location above produces a response output like this:[m
[31m-[m
[31m-[m
[31m-    sub thread: waiting on sema...[m
[31m-    main thread: sleeping for a little while...[m
[31m-    main thread: posting to sema...[m
[31m-    main thread: end.[m
[31m-    sub thread: waited successfully.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Synchronizing threads in different contexts[m
[31m-[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sema = semaphore.new()[m
[31m-    [m
[31m-            local outputs = {}[m
[31m-            local i = 1[m
[31m-    [m
[31m-            local function out(s)[m
[31m-                outputs[i] = s[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-    [m
[31m-            local function handler()[m
[31m-                out("timer thread: sleeping for a little while...")[m
[31m-    [m
[31m-                ngx.sleep(0.1)  -- wait a bit[m
[31m-    [m
[31m-                out("timer thread: posting on sema...")[m
[31m-    [m
[31m-                sema:post(1)[m
[31m-            end[m
[31m-    [m
[31m-            assert(ngx.timer.at(0, handler))[m
[31m-    [m
[31m-            out("main thread: waiting on sema...")[m
[31m-    [m
[31m-            local ok, err = sema:wait(1)  -- wait for a second at most[m
[31m-            if not ok then[m
[31m-                out("main thread: failed to wait on sema: ", err)[m
[31m-            else[m
[31m-                out("main thread: waited successfully.")[m
[31m-            end[m
[31m-    [m
[31m-            out("main thread: end.")[m
[31m-    [m
[31m-            ngx.say(table.concat(outputs, "\n"))[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-The example location above produces a response body like this[m
[31m-[m
[31m-[m
[31m-    main thread: waiting on sema...[m
[31m-    timer thread: sleeping for a little while...[m
[31m-    timer thread: posting on sema...[m
[31m-    main thread: waited successfully.[m
[31m-    main thread: end.[m
[31m-[m
[31m-The same applies to different request contexts as long as these requests are served[m
[31m-by the same nginx worker process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module provides an efficient semaphore API for the OpenResty/ngx_lua module. With[m
[31m-semaphores, "light threads" (created by L<ngx.thread.spawn|https://github.com/openresty/lua-nginx-module#ngxthreadspawn>,[m
[31m-L<ngx.timer.at|https://github.com/openresty/lua-nginx-module#ngxtimerat>, and etc.) can[m
[31m-synchronize among each other very efficiently without constant polling and sleeping.[m
[31m-[m
[31m-"Light threads" in different contexts (like in different requests) can share the same[m
[31m-semaphore instance as long as these "light threads" reside in the same NGINX worker[m
[31m-process and the L<lua_code_cache|https://github.com/openresty/lua-nginx-module#lua_code_cache>[m
[31m-directive is turned on (which is the default). For inter-process "light thread" synchronization,[m
[31m-it is recommended to use the L<lua-resty-lock|https://github.com/openresty/lua-resty-lock> library instead[m
[31m-(which is a bit less efficient than this semaphore API though).[m
[31m-[m
[31m-This semaphore API has a pure userland implementation which does not involve any system calls nor[m
[31m-block any operating system threads. It works closely with the event model of NGINX without[m
[31m-introducing any extra delay.[m
[31m-[m
[31m-Like other APIs provided by this C<lua-resty-core> library, the LuaJIT FFI feature is required.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-B<syntax:> I<sema, err = semaphore_module.new(n?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>>[m
[31m-[m
[31m-Creates and returns a new semaphore instance that has C<n> (default to C<0>) resources.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     local semaphore = require "ngx.semaphore"[m
[31m-     local sema, err = semaphore.new()[m
[31m-     if not sema then[m
[31m-         ngx.say("create semaphore failed: ", err)[m
[31m-     end[m
[31m-[m
[31m-Often the semaphore object created is shared on the NGINX worker process by mounting in a custom Lua module, as[m
[31m-documented below:[m
[31m-[m
[31m-https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 post[m
[31m-[m
[31m-B<syntax:> I<sema:post(n?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>>[m
[31m-[m
[31m-Releases C<n> (default to C<1>) "resources" to the semaphore instance.[m
[31m-[m
[31m-This will not yield the current running "light thread".[m
[31m-[m
[31m-At most C<n> "light threads" will be waken up when the current running "light thread" later yields (or terminates).[m
[31m-[m
[31m-[m
[31m-    -- typically, we get the semaphore instance from upvalue or globally shared data[m
[31m-    -- See https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker[m
[31m-    [m
[31m-    local semaphore = require "ngx.semaphore"[m
[31m-    local sema = semaphore.new()[m
[31m-    [m
[31m-    sema:post(2)  -- releases 2 resources[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 wait[m
[31m-[m
[31m-B<syntax:> I<ok, err = sema:wait(timeout)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>>[m
[31m-[m
[31m-Requests a resource from the semaphore instance.[m
[31m-[m
[31m-Returns C<true> immediately when there is resources available for the current running "light thread".[m
[31m-Otherwise the current "light thread" will enter the waiting queue and yield execution.[m
[31m-The current "light thread" will be automatically waken up and the C<wait> function call[m
[31m-will return C<true> when there is resources available for it, or return C<nil> and a string describing[m
[31m-the error in case of failure (like C<"timeout">).[m
[31m-[m
[31m-The C<timeout> argument specifies the maximum time this function call should wait for (in seconds).[m
[31m-[m
[31m-When the C<timeout> argument is 0, it means "no wait", that is, when there is no readily available[m
[31m-"resources" for the current running "light thread", this C<wait> function call returns immediately[m
[31m-C<nil> and the error string C<"timeout">.[m
[31m-[m
[31m-"Light threads" created by different contexts (like request handlers) can wait on the[m
[31m-same semaphore instance without problem.[m
[31m-[m
[31m-See L<Synopsis> for code examples.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 count[m
[31m-[m
[31m-B<syntax:> I<count = sema:count()>[m
[31m-[m
[31m-B<context:> *init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>,[m
[31m-content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>*[m
[31m-[m
[31m-Returns the number of resources readily available in the C<sema> semaphore instance (if any).[m
[31m-[m
[31m-When the returned number is negative, it means the number of "light threads" waiting on[m
[31m-this semaphore.[m
[31m-[m
[31m-Consider the following example,[m
[31m-[m
[31m-[m
[31m-    local semaphore = require "ngx.semaphore"[m
[31m-    local sema = semaphore.new(0)[m
[31m-    [m
[31m-    ngx.say("count: ", sema:count())  -- count: 0[m
[31m-    [m
[31m-    local function handler(id)[m
[31m-        local ok, err = sema:wait(1)[m
[31m-        if not ok then[m
[31m-            ngx.say("err: ", err)[m
[31m-        else[m
[31m-            ngx.say("wait success")[m
[31m-        end[m
[31m-    end[m
[31m-    [m
[31m-    local co1 = ngx.thread.spawn(handler)[m
[31m-    local co2 = ngx.thread.spawn(handler)[m
[31m-    [m
[31m-    ngx.say("count: ", sema:count())  -- count: -2[m
[31m-    [m
[31m-    sema:post(1)[m
[31m-    [m
[31m-    ngx.say("count: ", sema:count())  -- count: -1[m
[31m-    [m
[31m-    sema:post(2)[m
[31m-    [m
[31m-    ngx.say("count: ", sema:count())  -- count: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-resty-core/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Weixie Cui, Kugou Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-library L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.ssl.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.ssl.pod[m
[1mdeleted file mode 100644[m
[1mindex d2231ec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-core-0.1.6/ngx.ssl.pod[m
[1m+++ /dev/null[m
[36m@@ -1,439 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx.ssl - Lua API for controling NGINX downstream SSL handshakes[m
[31m-[m
[31m-[m
[31m-[m
[31m-This Lua module is currently considered experimental.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    # Note: you do not need the following line if you are using[m
[31m-    # OpenResty 1.9.7.2+.[m
[31m-    lua_package_path "/path/to/lua-resty-core/lib/?.lua;;";[m
[31m-    [m
[31m-    server {[m
[31m-        listen 443 ssl;[m
[31m-        server_name   test.com;[m
[31m-    [m
[31m-        # useless placeholders: just to shut up NGINX configuration[m
[31m-        # loader errors:[m
[31m-        ssl_certificate /path/to/fallback.crt;[m
[31m-        ssl_certificate_key /path/to/fallback.key;[m
[31m-    [m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-    [m
[31m-            -- clear the fallback certificates and private keys[m
[31m-            -- set by the ssl_certificate and ssl_certificate_key[m
[31m-            -- directives above:[m
[31m-            local ok, err = ssl.clear_certs()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to clear existing (fallback) certificates")[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            -- assuming the user already defines the my_load_certificate_chain()[m
[31m-            -- herself.[m
[31m-            local pem_cert_chain = assert(my_load_certificate_chain())[m
[31m-    [m
[31m-            local der_cert_chain, err = ssl.cert_pem_to_der(pem_cert_chain)[m
[31m-            if not der_cert_chain then[m
[31m-                ngx.log(ngx.ERR, "failed to convert certificate chain ",[m
[31m-                        "from PEM to DER: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local ok, err = ssl.set_der_cert(der_cert_chain)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            -- assuming the user already defines the my_load_private_key()[m
[31m-            -- function herself.[m
[31m-            local der_pkey = assert(my_load_private_key())[m
[31m-    [m
[31m-            local ok, err = ssl.set_der_priv_key(der_pkey)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER private key: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-        }[m
[31m-    [m
[31m-        location / {[m
[31m-            root html;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua module provides API functions to control the SSL handshake process in contexts like[m
[31m-L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block>[m
[31m-(of the L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme> module).[m
[31m-[m
[31m-For web servers serving many (like millions of) https sites, it is often desired to lazily[m
[31m-load and cache the SSL certificate chain and private key data for the https sites actually[m
[31m-being served by a particular server. This Lua module provides API to support such use cases[m
[31m-in the context of the L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block>[m
[31m-directive.[m
[31m-[m
[31m-To load the C<ngx.ssl> module in Lua, just write[m
[31m-[m
[31m-[m
[31m-    local ssl = require "ngx.ssl"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-=head2 clear_certs[m
[31m-[m
[31m-B<syntax:> I<ok, err = ssl.clear_certs()>[m
[31m-[m
[31m-B<context:> I<ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Clears any existing SSL certificates and/or private keys set on the current SSL connection.[m
[31m-[m
[31m-Returns C<true> on success, or a C<nil> value and a string describing the error otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 cert_pem_to_der[m
[31m-[m
[31m-B<syntax:> I<der_cert_chain, err = ssl.cert_pem_to_der(pem_cert_chain)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Converts the PEM-formatted SSL certificate chain data into the DER format (for later uses[m
[31m-in the L<set_der_cert>[m
[31m-function, for example).[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-It is known that the C<openssl> command-line utility may not convert the whole SSL[m
[31m-certificate chain from PEM to DER correctly. So always use this Lua function to do[m
[31m-the conversion. You can always use libraries like L<lua-resty-lrucache|https://github.com/openresty/lua-resty-lrucache#readme>[m
[31m-and/or ngx_lua APIs like L<lua_shared_dict|https://github.com/openresty/lua-nginx-module#lua_shared_dict>[m
[31m-to do the caching of the DER-formatted results, for example.[m
[31m-[m
[31m-This function can be called in whatever contexts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_der_cert[m
[31m-[m
[31m-B<syntax:> I<ok, err = ssl.set_der_cert(der_cert_chain)>[m
[31m-[m
[31m-B<context:> I<ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sets the DER-formatted SSL certificate chain data for the current SSL connection. Note that[m
[31m-the DER data is[m
[31m-directly in the Lua string argument. I<No> external file names are supported here.[m
[31m-[m
[31m-Returns C<true> on success, or a C<nil> value and a string describing the error otherwise.[m
[31m-[m
[31m-Note that, the SSL certificate chain is usually encoded in the PEM format. So you need[m
[31m-to use the L<cert_pem_to_der>[m
[31m-function to do the conversion first.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 priv_key_pem_to_der[m
[31m-[m
[31m-B<syntax:> I<der_priv_key, err = ssl.priv_key_pem_to_der(pem_priv_key)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Converts the PEM-formatted SSL private key data into the DER format (for later uses[m
[31m-in the L<set_der_priv_key>[m
[31m-function, for example).[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-Alternatively, you can do the PEM to DER conversion I<offline> with the C<openssl> command-line utility, like below[m
[31m-[m
[31m-[m
[31m-    openssl rsa -in key.pem -outform DER -out key.der[m
[31m-[m
[31m-This function can be called in whatever contexts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_der_priv_key[m
[31m-[m
[31m-B<syntax:> I<ok, err = ssl.set_der_priv_key(der_cert_chain)>[m
[31m-[m
[31m-B<context:> I<ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sets the DER-formatted prviate key for the current SSL connection.[m
[31m-[m
[31m-Returns C<true> on success, or a C<nil> value and a string describing the error otherwise.[m
[31m-[m
[31m-Usually, the private keys are encoded in the PEM format. You can either use the[m
[31m-L<priv_key_pem_to_der> function[m
[31m-to do the PEM to DER conversion or just use[m
[31m-the C<openssl> command-line utility offline, like below[m
[31m-[m
[31m-[m
[31m-    openssl rsa -in key.pem -outform DER -out key.der[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_name[m
[31m-[m
[31m-B<syntax:> I<name, err = ssl.server_name()>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Returns the TLS SNI (Server Name Indication) name set by the client. Returns C<nil>[m
[31m-when the client does not set it.[m
[31m-[m
[31m-In case of failures, it returns C<nil> I<and> a string describing the error.[m
[31m-[m
[31m-Usually we use this SNI name as the domain name (like C<www.openresty.org>) to[m
[31m-identify the current web site while loading the corresponding SSL certificate[m
[31m-chain and private key for the site.[m
[31m-[m
[31m-Please note that not all https clients set the SNI name, so when the SNI name is[m
[31m-missing from the client handshake request, we use the server IP address accessed[m
[31m-by the client to identify the site. See the L<raw_server_addr> method[m
[31m-for more details.[m
[31m-[m
[31m-This function can be called in whatever contexts where downstream https is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 raw_server_addr[m
[31m-[m
[31m-B<syntax:> I<addr_data, addr_type, err = ssl.raw_server_addr()>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Returns the raw server address actually accessed by the client in the current SSL connection.[m
[31m-[m
[31m-The first two return values are strings representing the address data and the address type, respectively.[m
[31m-The address values are interpreted differently according to the address type values:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<unix>[m
[31m-: The address data is a file path for the UNIX domain socket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<inet>[m
[31m-: The address data is a binary IPv4 address of 4 bytes long.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<inet6>[m
[31m-: The address data is a binary IPv6 address of 16 bytes long.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Returns two C<nil> values and a Lua string describing the error.[m
[31m-[m
[31m-The following code snippet shows how to print out the UNIX domain socket address and[m
[31m-the IPv4 address as human-readable strings:[m
[31m-[m
[31m-[m
[31m-    local ssl = require "ngx.ssl"[m
[31m-    local byte = string.byte[m
[31m-    [m
[31m-    local addr, addrtyp, err = ssl.raw_server_addr()[m
[31m-    if not addr then[m
[31m-        ngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    [m
[31m-    if addrtyp == "inet" then  -- IPv4[m
[31m-        ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),[m
[31m-                           byte(addr, 3), byte(addr, 4))[m
[31m-        print("Using IPv4 address: ", ip)[m
[31m-    [m
[31m-    elseif addrtyp == "unix" then  -- UNIX[m
[31m-        print("Using unix socket file ", addr)[m
[31m-    [m
[31m-    else  -- IPv6[m
[31m-        -- leave as an exercise for the readers[m
[31m-    end[m
[31m-[m
[31m-This function can be called in whatever contexts where downstream https is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_tls1_version[m
[31m-[m
[31m-B<syntax:> I<ver, err = ssl.get_tls1_version()>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Returns the TLS 1.x version number used by the current SSL connection. Returns C<nil> and[m
[31m-a string describing the error otherwise.[m
[31m-[m
[31m-Typical return values are[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<SSLv3>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<TLSv1>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<TLSv1.1>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<TLSv1.2>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This function can be called in whatever contexts where downstream https is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-resty-core/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun Zhang E<lt>agentzh@gmail.comE<gt> (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ngx.ocsp|ocsp.md> module.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block> directive.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-library L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-dns-0.16/lua-resty-dns-0.16.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-dns-0.16/lua-resty-dns-0.16.pod[m
[1mdeleted file mode 100644[m
[1mindex 2b28927..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-dns-0.16/lua-resty-dns-0.16.pod[m
[1m+++ /dev/null[m
[36m@@ -1,640 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-dns - Lua DNS resolver for the ngx_lua based on the cosocket API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library provies a DNS resolver for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.5.12|https://github.com/chaoslawful/lua-nginx-module/tags> or L<OpenResty 1.2.1.11|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-Also, the L<bit library|http://bitop.luajit.org/> is also required. If you're using LuaJIT 2.0 with ngx_lua, then the C<bit> library is already available by default.[m
[31m-[m
[31m-Note that, this library is bundled and enabled by default in the L<OpenResty bundle|http://openresty.org/>.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        lua_package_path "/path/to/lua-resty-dns/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location = /dns {[m
[31m-                content_by_lua '[m
[31m-                    local resolver = require "resty.dns.resolver"[m
[31m-                    local r, err = resolver:new{[m
[31m-                        nameservers = {"8.8.8.8", {"8.8.4.4", 53} },[m
[31m-                        retrans = 5,  -- 5 retransmissions on receive timeout[m
[31m-                        timeout = 2000,  -- 2 sec[m
[31m-                    }[m
[31m-    [m
[31m-                    if not r then[m
[31m-                        ngx.say("failed to instantiate the resolver: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local answers, err = r:query("www.google.com")[m
[31m-                    if not answers then[m
[31m-                        ngx.say("failed to query the DNS server: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    if answers.errcode then[m
[31m-                        ngx.say("server returned error code: ", answers.errcode,[m
[31m-                                ": ", answers.errstr)[m
[31m-                    end[m
[31m-    [m
[31m-                    for i, ans in ipairs(answers) do[m
[31m-                        ngx.say(ans.name, " ", ans.address or ans.cname,[m
[31m-                                " type:", ans.type, " class:", ans.class,[m
[31m-                                " ttl:", ans.ttl)[m
[31m-                    end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: r, err = class:new(opts)>[m
[31m-[m
[31m-Creates a dns.resolver object. Returns C<nil> and an message string on error.[m
[31m-[m
[31m-It accepts a C<opts> table argument. The following options are supported:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<nameservers>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-a list of nameservers to be used. Each nameserver entry can be either a single hostname string or a table holding both the hostname string and the port number. The nameserver is picked up by a simple round-robin algorithm for each C<query> method call. This option is required.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<retrans>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-the total number of times of retransmitting the DNS request when receiving a DNS response times out according to the C<timeout> setting. Default to C<5> times. When trying to retransmit the query, the next nameserver according to the round-robin algorithm will be picked up.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timeout>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-the time in milliseconds for waiting for the respond for a single attempt of request transmition. note that this is ''not'' the maximal total waiting time before giving up, the maximal total waiting time can be calculated by the expression C<timeout x retrans>. The C<timeout> setting can also be changed by calling the C<set_timeout> method. The default C<timeout> setting is 2000 milliseconds, or 2 seconds.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<no_recurse>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-a boolean flag controls whether to disable the "recursion desired" (RD) flag in the UDP request. Default to C<false>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 query[m
[31m-[m
[31m-C<syntax: answers, err = r:query(name, options?)>[m
[31m-[m
[31m-Performs a DNS standard query to the nameservers specified by the C<new> method,[m
[31m-and returns all the answer records in an array-like Lua table. In case of errors, it will[m
[31m-return C<nil> and a string describing the error instead.[m
[31m-[m
[31m-If the server returns a non-zero error code, the fields C<errcode> and C<errstr> will be set accordingly in the Lua table returned.[m
[31m-[m
[31m-Each entry in the C<answers> returned table value is also a hash-like Lua table[m
[31m-which usually takes some of the following fields:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<name>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The resource record name.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<type>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The current resource record type, possible values are C<1> (C<TYPE_A>), C<5> (C<TYPE_CNAME>), C<28> (C<TYPE_AAAA>), and any other values allowed by RFC 1035.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<address>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The IPv4 or IPv6 address in their textual representations when the resource record type is either C<1> (C<TYPE_A>) or C<28> (C<TYPE_AAAA>), respectively. Secussesive 16-bit zero groups in IPv6 addresses will not be compressed by default, if you want that, you need to call the C<compress_ipv6_addr> static method instead.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<cname>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The (decoded) record data value for C<CNAME> resource records. Only present for C<CNAME> records.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ttl>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The time-to-live (TTL) value in seconds for the current resource record.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<class>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The current resource record class, possible values are C<1> (C<CLASS_IN>) or any other values allowed by RFC 1035.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<preference>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The preference integer number for C<MX> resource records. Only present for C<MX> type records.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<exchange>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The exchange domain name for C<MX> resource records. Only present for C<MX> type records.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<nsdname>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-A domain-name which specifies a host which should be authoritative for the specified class and domain. Usually present for C<NS> type records.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<rdata>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The raw resource data (RDATA) for resource records that are not recognized.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<txt>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The record value for C<TXT> records. When there is only one character string in this record, then this field takes a single Lua string. Otherwise this field takes a Lua table holding all the strings.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ptrdname>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The record value for C<PTR> records.[m
[31m-[m
[31m-This method also takes an optional C<options> argument table, which takes the following fields:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<qtype>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The type of the question. Possible values are C<1> (C<TYPE_A>), C<5> (C<TYPE_CNAME>), C<28> (C<TYPE_AAAA>), or any other QTYPE value specified by RFC 1035 and RFC 3596. Default to C<1> (C<TYPE_A>).[m
[31m-[m
[31m-When data truncation happens, the resolver will automatically retry using the TCP transport mode[m
[31m-to query the current nameserver. All TCP connections are short lived.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcp_query[m
[31m-[m
[31m-C<syntax: answers, err = r:tcp_query(name, options?)>[m
[31m-[m
[31m-Just like the C<query> method, but enforce the TCP transport mode instead of UDP.[m
[31m-[m
[31m-All TCP connections are short lived.[m
[31m-[m
[31m-Here is an example:[m
[31m-[m
[31m-[m
[31m-        local resolver = require "resty.dns.resolver"[m
[31m-    [m
[31m-        local r, err = resolver:new{[m
[31m-            nameservers = { "8.8.8.8" }[m
[31m-        }[m
[31m-        if not r then[m
[31m-            ngx.say("failed to instantiate resolver: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local ans, err = r:tcp_query("www.google.com", { qtype = r.TYPE_A })[m
[31m-        if not ans then[m
[31m-            ngx.say("failed to query: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local cjson = require "cjson"[m
[31m-        ngx.say("records: ", cjson.encode(ans))[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_timeout[m
[31m-[m
[31m-C<syntax: r:set_timeout(time)>[m
[31m-[m
[31m-Overrides the current C<timeout> setting by the C<time> argument in milliseconds for all the nameserver peers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 compress_ipv6_addr[m
[31m-[m
[31m-C<syntax: compressed = resty.dns.resolver.compress_ipv6_addr(address)>[m
[31m-[m
[31m-Compresses the successive 16-bit zero groups in the textual format of the IPv6 address.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-        local resolver = require "resty.dns.resolver"[m
[31m-        local compress = resolver.compress_ipv6_addr[m
[31m-        local new_addr = compress("FF01:0:0:0:0:0:0:101")[m
[31m-[m
[31m-will yield C<FF01::101> in the C<new_addr> return value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 expand_ipv6_addr[m
[31m-[m
[31m-C<syntax: expanded = resty.dns.resolver.expand_ipv6_addr(address)>[m
[31m-[m
[31m-Expands the successive 16-bit zero groups in the textual format of the IPv6 address.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-        local resolver = require "resty.dns.resolver"[m
[31m-        local expand = resolver.expand_ipv6_addr[m
[31m-        local new_addr = expand("FF01::101")[m
[31m-[m
[31m-will yield C<FF01:0:0:0:0:0:0:101> in the C<new_addr> return value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 arpa_str[m
[31m-[m
[31m-C<syntax: arpa_record = resty.dns.resolver.arpa_str(address)>[m
[31m-[m
[31m-Generates the reverse domain name for PTR lookups for both IPv4 and IPv6 addresses. Compressed IPv6 addresses[m
[31m-will be automatically expanded.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-        local resolver = require "resty.dns.resolver"[m
[31m-        local ptr4 = resolver.arpa_str("1.2.3.4")[m
[31m-        local ptr6 = resolver.arpa_str("FF01::101")[m
[31m-[m
[31m-will yield C<4.3.2.1.in-addr.arpa> for C<ptr4> and C<1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.F.F.ip6.arpa> for C<ptr6>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 reverse_query[m
[31m-[m
[31m-C<syntax: answers, err = r:reverse_query(address)>[m
[31m-[m
[31m-Performs a PTR lookup for both IPv4 and IPv6 addresses. This function is basically a wrapper for the C<query> command[m
[31m-which uses the C<arpa_str> command to convert the IP address on the fly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Constants[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_A[m
[31m-[m
[31m-The C<A> resource record type, equal to the decimal number C<1>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_NS[m
[31m-[m
[31m-The C<NS> resource record type, equal to the decimal number C<2>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_CNAME[m
[31m-[m
[31m-The C<CNAME> resource record type, equal to the decimal number C<5>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_PTR[m
[31m-[m
[31m-The C<PTR> resource record type, equal to the decimal number C<12>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_MX[m
[31m-[m
[31m-The C<MX> resource record type, equal to the decimal number C<15>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_TXT[m
[31m-[m
[31m-The C<TXT> resource record type, equal to the decimal number C<16>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_AAAA[m
[31m-[m
[31m-C<syntax: typ = r.TYPE_AAAA>[m
[31m-[m
[31m-The C<AAAA> resource record type, equal to the decimal number C<28>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_SRV[m
[31m-[m
[31m-C<syntax: typ = r.TYPE_SRV>[m
[31m-[m
[31m-The C<SRV> resource record type, equal to the decimal number C<33>.[m
[31m-[m
[31m-See RFC 2782 for details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_SPF[m
[31m-[m
[31m-C<syntax: typ = r.TYPE_SPF>[m
[31m-[m
[31m-The C<SPF> resource record type, equal to the decimal number C<99>.[m
[31m-[m
[31m-See RFC 4408 for details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 CLASS_IN[m
[31m-[m
[31m-C<syntax: class = r.CLASS_IN>[m
[31m-[m
[31m-The C<Internet> resource record type, equal to the decimal number C<1>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like set_by_luaI<, log_by_lua>, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.dns.resolver> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.dns.resolver> instance.[m
[31m-You should always initiate C<resty.dns.resolver> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Concurrent (or parallel) query mode[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Better support for other resource record types like C<TLSA>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2016, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-lock-0.04/lua-resty-lock-0.04.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-lock-0.04/lua-resty-lock-0.04.pod[m
[1mdeleted file mode 100644[m
[1mindex c9e7e46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-lock-0.04/lua-resty-lock-0.04.pod[m
[1m+++ /dev/null[m
[36m@@ -1,504 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-lock - Simple shm-based nonblocking lock API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is still under early development and is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    # nginx.conf[m
[31m-    [m
[31m-    http {[m
[31m-        # you do not need the following line if you are using the[m
[31m-        #   ngx_openresty bundle:[m
[31m-        lua_package_path "/path/to/lua-resty-lock/lib/?.lua;;";[m
[31m-    [m
[31m-        lua_shared_dict my_locks 100k;[m
[31m-    [m
[31m-        server {[m
[31m-            ...[m
[31m-    [m
[31m-            location = /t {[m
[31m-                content_by_lua '[m
[31m-                    local lock = require "resty.lock"[m
[31m-                    for i = 1, 2 do[m
[31m-                        local lock = lock:new("my_locks")[m
[31m-    [m
[31m-                        local elapsed, err = lock:lock("my_key")[m
[31m-                        ngx.say("lock: ", elapsed, ", ", err)[m
[31m-    [m
[31m-                        local ok, err = lock:unlock()[m
[31m-                        if not ok then[m
[31m-                            ngx.say("failed to unlock: ", err)[m
[31m-                        end[m
[31m-                        ngx.say("unlock: ", ok)[m
[31m-                    end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This library implements a simple mutex lock in a similar way to ngx_proxy module's L<proxy_cache_lock directive|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock>.[m
[31m-[m
[31m-Under the hood, this library uses L<ngx_lua|https://github.com/chaoslawful/lua-nginx-module> module's shared memory dictionaries. The lock waiting is nonblocking because we use stepwise L<ngx.sleep|https://github.com/chaoslawful/lua-nginx-module#ngxsleep> to poll the lock periodically.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-To load this library,[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-you need to specify this library's path in ngx_lua's L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path> directive. For example, C<lua_package_path "/path/to/lua-resty-lock/lib/?.lua;;";>.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-you use C<require> to load the library into a local Lua variable:[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-        local lock = require "resty.lock"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: obj = lock:new(dict_name)>[m
[31m-[m
[31m-C<syntax: obj = lock:new(dict_name, opts)>[m
[31m-[m
[31m-Creates a new lock object instance by specifying the shared dictionary name (created by L<lua_shared_dict|http://https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict>) and an optional options table C<opts>.[m
[31m-[m
[31m-The options table accepts the following options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<exptime>[m
[31m-Specifies expiration time (in seconds) for the lock entry in the shared memory dictionary. You can specify up to C<0.001> seconds. Default to 30 (seconds). Even if the invoker does not call C<unlock> or the object holding the lock is not GC'd, the lock will be released after this time. So deadlock won't happen even when the worker process holding the lock crashes.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timeout>[m
[31m-Specifies the maximal waiting time (in seconds) for the L<lock> method calls on the current object instance. You can specify up to C<0.001> seconds. Default to 5 (seconds). This option value cannot be bigger than C<exptime>. This timeout is to prevent a L<lock> method call from waiting forever.[m
[31m-You can specify C<0> to make the L<lock> method return immediately without waiting if it cannot acquire the lock right away.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<step>[m
[31m-Specifies the initial step (in seconds) of sleeping when waiting for the lock. Default to C<0.001> (seconds). When the L<lock> method is waiting on a busy lock, it sleeps by steps. The step size is increased by a ratio (specified by the C<ratio> option) until reaching the step size limit (specified by the C<max_step> option).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ratio>[m
[31m-Specifies the step increasing ratio. Default to 2, that is, the step size doubles at each waiting iteration.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max_step>[m
[31m-Specifies the maximal step size (i.e., sleep interval, in seconds) allowed. See also the C<step> and C<ratio> options). Default to 0.5 (seconds).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lock[m
[31m-[m
[31m-C<syntax: elapsed, err = obj:lock(key)>[m
[31m-[m
[31m-Tries to lock a key across all the Nginx worker processes in the current Nginx server instance. Different keys are different locks.[m
[31m-[m
[31m-The length of the key string must not be larger than 65535 bytes.[m
[31m-[m
[31m-Returns the waiting time (in seconds) if the lock is successfully acquired. Otherwise returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The waiting time is not from the wallclock, but rather is from simply adding up all the waiting "steps". A nonzero C<elapsed> return value indicates that someone else has just hold this lock. But a zero return value cannot gurantee that no one else has just acquired and released the lock.[m
[31m-[m
[31m-When this method is waiting on fetching the lock, no operating system threads will be blocked and the current Lua "light thread" will be automatically yielded behind the scene.[m
[31m-[m
[31m-It is strongly recommended to always call the L<unlock()> method to actively release the lock as soon as possible.[m
[31m-[m
[31m-If the L<unlock()> method is never called after this method call, the lock will get released when[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-the current C<resty.lock> object instance is collected automatically by the Lua GC.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-the C<exptime> for the lock entry is reached.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Common errors for this method call is[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-"timeout"[m
[31m-: The timeout threshold specified by the C<timeout> option of the L<new> method is exceeded.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-"locked"[m
[31m-: The current C<resty.lock> object instance is already holding a lock (not necessarily of the same key).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Other possible errors are from ngx_lua's shared dictionary API.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 unlock[m
[31m-[m
[31m-C<syntax: ok, err = obj:unlock()>[m
[31m-[m
[31m-Releases the lock held by the current C<resty.lock> object instance.[m
[31m-[m
[31m-Returns C<1> on success. Returns C<nil> and a string describing the error otherwise.[m
[31m-[m
[31m-If you call C<unlock> when no lock is currently held, the error "unlocked" will be returned.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 For Multiple Lua Light Threads[m
[31m-[m
[31m-It is always a bad idea to share a single C<resty.lock> object instance across multiple ngx_lua "light threads" because the object itself is stateful and is vulnerable to race conditions. It is highly recommended to always allocate a separate C<resty.lock> object instance for each "light thread" that needs one.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 For Cache Locks[m
[31m-[m
[31m-One common use case for this library is avoid the so-called "dog-pile effect", that is, to limit concurrent backend queries for the same key when a cache miss happens. This usage is similar to the standard ngx_proxy module's L<proxy_cache_lock|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock> directive.[m
[31m-[m
[31m-The basic workflow for a cache lock is as follows:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Check the cache for a hit with the key. If a cache miss happens, proceed to step 2.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Instantiate a C<resty.lock> object, call the L<lock> method on the key, and check the 1st return value, i.e., the lock waiting time. If it is C<nil>, handle the error; otherwise proceed to step 3.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Check the cache again for a hit. If it is still a miss, proceed to step 4; otherwise release the lock by calling L<unlock> and then return the cached value.[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-Query the backend (the data source) for the value, put the result into the cache, and then release the lock currently held by calling L<unlock>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Below is a kinda complete code example that demonstrates the idea.[m
[31m-[m
[31m-[m
[31m-        local resty_lock = require "resty.lock"[m
[31m-        local cache = ngx.shared.my_cache[m
[31m-    [m
[31m-        -- step 1:[m
[31m-        local val, err = cache:get(key)[m
[31m-        if val then[m
[31m-            ngx.say("result: ", val)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        if err then[m
[31m-            return fail("failed to get key from shm: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        -- cache miss![m
[31m-        -- step 2:[m
[31m-        local lock = resty_lock:new("my_locks")[m
[31m-        local elapsed, err = lock:lock(key)[m
[31m-        if not elapsed then[m
[31m-            return fail("failed to acquire the lock: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        -- lock successfully acquired![m
[31m-    [m
[31m-        -- step 3:[m
[31m-        -- someone might have already put the value into the cache[m
[31m-        -- so we check it here again:[m
[31m-        val, err = cache:get(key)[m
[31m-        if val then[m
[31m-            local ok, err = lock:unlock()[m
[31m-            if not ok then[m
[31m-                return fail("failed to unlock: ", err)[m
[31m-            end[m
[31m-    [m
[31m-            ngx.say("result: ", val)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        --- step 4:[m
[31m-        local val = fetch_redis(key)[m
[31m-        if not val then[m
[31m-            local ok, err = lock:unlock()[m
[31m-            if not ok then[m
[31m-                return fail("failed to unlock: ", err)[m
[31m-            end[m
[31m-    [m
[31m-            -- FIXME: we should handle the backend miss more carefully[m
[31m-            -- here, like inserting a stub value into the cache.[m
[31m-    [m
[31m-            ngx.say("no value found")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        -- update the shm cache with the newly fetched value[m
[31m-        local ok, err = cache:set(key, val, 1)[m
[31m-        if not ok then[m
[31m-            local ok, err = lock:unlock()[m
[31m-            if not ok then[m
[31m-                return fail("failed to unlock: ", err)[m
[31m-            end[m
[31m-    [m
[31m-            return fail("failed to update shm cache: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        local ok, err = lock:unlock()[m
[31m-        if not ok then[m
[31m-            return fail("failed to unlock: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("result: ", val)[m
[31m-[m
[31m-Here we assume that we use the ngx_lua shared memory dictionary to cache the Redis query results and we have the following configurations in C<nginx.conf>:[m
[31m-[m
[31m-[m
[31m-        # you may want to change the dictionary size for your cases.[m
[31m-        lua_shared_dict my_cache 10m;[m
[31m-        lua_shared_dict my_locks 1m;[m
[31m-[m
[31m-The C<my_cache> dictionary is for the data cache while the C<my_locks> dictionary is for C<resty.lock> itself.[m
[31m-[m
[31m-Several important things to note in the example above:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-You need to release the lock as soon as possible, even when some other unrelated errors happen.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-You need to update the cache with the result got from the backend I<before> releasing the lock so other threads already waiting on the lock can get cached value when they get the lock afterwards.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-When the backend returns no value at all, we should handle the case carefully by inserting some stub value into the cache.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Prerequisites[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<LuaJIT|http://luajit.org> 2.0+[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/chaoslawful/lua-nginx-module> 0.8.10+[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is recommended to use the latest L<ngx_openresty bundle|http://openresty.org> directly where this library[m
[31m-is bundled and enabled by default. At least ngx_openresty 1.4.2.9 is required. And you need to enable LuaJIT when building your ngx_openresty[m
[31m-bundle by passing the C<--with-luajit> option to its C<./configure> script. No extra Nginx configuration is required.[m
[31m-[m
[31m-If you want to use this library with your own Nginx build (with ngx_lua), then you need to[m
[31m-ensure you are using at least ngx_lua 0.8.10. Also, You need to configure[m
[31m-the L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path> directive to[m
[31m-add the path of your lua-resty-lock source tree to ngx_lua's Lua module search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-lock/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-and then load the library in Lua:[m
[31m-[m
[31m-[m
[31m-        local lock = require "resty.lock"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-We should simplify the current implementation when LuaJIT 2.1 gets support for C<__gc> metamethod on normal Lua tables. Right now we are using an FFI cdata and a ref/unref memo table to work around this, which is rather ugly and a bit inefficient.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/openresty/lua-resty-lock/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2013-2014, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/chaoslawful/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-lrucache-0.04/lua-resty-lrucache-0.04.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-lrucache-0.04/lua-resty-lrucache-0.04.pod[m
[1mdeleted file mode 100644[m
[1mindex d41c04d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-lrucache-0.04/lua-resty-lrucache-0.04.pod[m
[1m+++ /dev/null[m
[36m@@ -1,348 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-lrucache - in-Lua LRU Cache based on LuaJIT FFI[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is still under active development and is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    -- file myapp.lua: example "myapp" module[m
[31m-    [m
[31m-    local _M = {}[m
[31m-    [m
[31m-    -- alternatively: local lrucache = require "resty.lrucache.pureffi"[m
[31m-    local lrucache = require "resty.lrucache"[m
[31m-    [m
[31m-    -- we need to initialize the cache on the lua module level so that[m
[31m-    -- it can be shared by all the requests served by each nginx worker process:[m
[31m-    local c = lrucache.new(200)  -- allow up to 200 items in the cache[m
[31m-    if not c then[m
[31m-        return error("failed to create the cache: " .. (err or "unknown"))[m
[31m-    end[m
[31m-    [m
[31m-    function _M.go()[m
[31m-        c:set("dog", 32)[m
[31m-        c:set("cat", 56)[m
[31m-        ngx.say("dog: ", c:get("dog"))[m
[31m-        ngx.say("cat: ", c:get("cat"))[m
[31m-    [m
[31m-        c:set("dog", { age = 10 }, 0.1)  -- expire in 0.1 sec[m
[31m-        c:delete("dog")[m
[31m-    end[m
[31m-    [m
[31m-    return _M[m
[31m-[m
[31m-[m
[31m-    # nginx.conf[m
[31m-    [m
[31m-    http {[m
[31m-        lua_package_path "/path/to/lua-resty-lrucache/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            listen 8080;[m
[31m-    [m
[31m-            location = /t {[m
[31m-                content_by_lua '[m
[31m-                    require("myapp").go()[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This library implements a simple LRU cache for L<OpenResty|http://openresty.org> and the L<ngx_lua|https://github.com/chaoslawful/lua-nginx-module> module.[m
[31m-[m
[31m-This cache also supports expiration time.[m
[31m-[m
[31m-The LRU cache resides completely in the Lua VM and is subject to Lua GC. So do not expect[m
[31m-it to get shared across the OS process boundary. The upside is that you can cache[m
[31m-arbitrary complex Lua values (like deep nested Lua tables) without the overhead of[m
[31m-serialization (as with C<ngx_lua>'s[m
[31m-L<shared dictionary API|https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict>).[m
[31m-The downside is that your cache is always limited to the current OS process[m
[31m-(like the current nginx worker process). It does not really make much sense to use this[m
[31m-library in the context of L<init_by_lua|https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict>[m
[31m-because the cache will not get shared by any of the worker processes[m
[31m-(unless you just want to "warm up" the cache with predefined items which will get[m
[31m-inherited by the workers via C<fork>).[m
[31m-[m
[31m-There are two different implementations included in this library, in the form of[m
[31m-two classes: C<resty.lrucache> and C<resty.lrucache.pureffi>. They share exactly the same API. The only difference is that the latter[m
[31m-is a pure FFI implementation that also implements an FFI-based hash table[m
[31m-for the cache lookup while the former uses native Lua tables for it.[m
[31m-[m
[31m-If the cache hit rate is relatively high, you should use the C<resty.lrucache> class which is faster than C<resty.lrucache.pureffi>.[m
[31m-[m
[31m-But if the cache hit rate is relatively low and there can be a I<lot> of[m
[31m-variations of keys inserted into and removed from the cache, then you should use the C<resty.lrucache.pureffi> instead, because[m
[31m-Lua tables are not good at removing keys frequently by design and you[m
[31m-would see the C<resizetab> function call in the LuaJIT runtime being very hot in[m
[31m-L<on-CPU flame graphs|https://github.com/openresty/stapxx#lj-lua-stacks> if[m
[31m-you use the C<resty.lrucache> class instead of C<resty.lrucache.pureffi> in this use case.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-To load this library,[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-you need to specify this library's path in ngx_lua's L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path> directive. For example, C<lua_package_path "/path/to/lua-resty-lrucache/lib/?.lua;;";>.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-you use C<require> to load the library into a local Lua variable:[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-        local lrucache = require "resty.lrucache"[m
[31m-[m
[31m-or[m
[31m-[m
[31m-[m
[31m-        local lrucache = require "resty.lrucache.pureffi"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: cache, err = lrucache.new(max_items [, load_factor])>[m
[31m-[m
[31m-Creates a new cache instance. If failed, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The C<max_items> argument specifies the maximal number of items held in the cache.[m
[31m-[m
[31m-The C<load-factor> argument designates the "load factor" of the FFI-based hash-table used internally by C<resty.lrucache.pureffi>;[m
[31m-the default value is 0.5 (i.e. 50%); if the load factor is specified, it will be clamped[m
[31m-to the range of C<[0.1, 1]> (i.e. if load factor is greater than 1, it will be saturated to[m
[31m-1; likewise, if load-factor is smaller than C<0.1>, it will be clamped to C<0.1>). This argument is only meaningful for C<resty.lrucache.pureffi>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set[m
[31m-[m
[31m-C<syntax: cache:set(key, value, ttl)>[m
[31m-[m
[31m-Sets a key with a value and an expiration time.[m
[31m-[m
[31m-The C<ttl> argument specifies the expiration time period. The time value is in seconds, but you can also specify the fraction number part, like C<0.25>. A nil C<ttl> argument value means never expired (which is the default).[m
[31m-[m
[31m-When the cache is full, the cache will automatically evict the least recently used item.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get[m
[31m-[m
[31m-C<syntax: data, stale_data = cache:get(key)>[m
[31m-[m
[31m-Fetches a value with the key. If the key does not exist in the cache or has already expired, a C<nil> value will be returned.[m
[31m-[m
[31m-Starting from C<v0.03>, the stale data is also returned as the second return value if available.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 delete[m
[31m-[m
[31m-C<syntax: cache:delete(key)>[m
[31m-[m
[31m-Removes an item specified by the key from the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Prerequisites[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<LuaJIT|http://luajit.org> 2.0+[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/chaoslawful/lua-nginx-module> 0.8.10+[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is recommended to use the latest L<ngx_openresty bundle|http://openresty.org> directly. At least ngx_openresty 1.4.2.9 is required. And you need to enable LuaJIT when building your ngx_openresty[m
[31m-bundle by passing the C<--with-luajit> option to its C<./configure> script. No extra Nginx configuration is required.[m
[31m-[m
[31m-If you want to use this library with your own Nginx build (with ngx_lua), then you need to[m
[31m-ensure you are using at least ngx_lua 0.8.10.[m
[31m-[m
[31m-Also, You need to configure[m
[31m-the L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path> directive to[m
[31m-add the path of your lua-resty-lrucache source tree to ngx_lua's Lua module search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-lrucache/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-and then load the library in Lua:[m
[31m-[m
[31m-[m
[31m-        local lrucache = require "resty.lrucache"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add new method C<get_stale> for fetching already expired items.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add new method C<flush_all> for flushing out everything in the cache.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/agentzh/lua-resty-lrucache/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-Shuxin Yang, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2014-2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-Copyright (C) 2014-2015, by Shuxin Yang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/chaoslawful/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-memcached-0.14/lua-resty-memcached-0.14.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-memcached-0.14/lua-resty-memcached-0.14.pod[m
[1mdeleted file mode 100644[m
[1mindex 47c9f7e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-memcached-0.14/lua-resty-memcached-0.14.pod[m
[1m+++ /dev/null[m
[36m@@ -1,617 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-memcached - Lua memcached client driver for the ngx_lua based on the cosocket API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library is a memcached client driver for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.5.0rc29|https://github.com/chaoslawful/lua-nginx-module/tags> or L<OpenResty 1.0.15.7|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        lua_package_path "/path/to/lua-resty-memcached/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location /test {[m
[31m-                content_by_lua '[m
[31m-                    local memcached = require "resty.memcached"[m
[31m-                    local memc, err = memcached:new()[m
[31m-                    if not memc then[m
[31m-                        ngx.say("failed to instantiate memc: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    memc:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-                    -- or connect to a unix domain socket file listened[m
[31m-                    -- by a memcached server:[m
[31m-                    --     local ok, err = memc:connect("unix:/path/to/memc.sock")[m
[31m-    [m
[31m-                    local ok, err = memc:connect("127.0.0.1", 11211)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to connect: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local ok, err = memc:flush_all()[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to flush all: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local ok, err = memc:set("dog", 32)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to set dog: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local res, flags, err = memc:get("dog")[m
[31m-                    if err then[m
[31m-                        ngx.say("failed to get dog: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    if not res then[m
[31m-                        ngx.say("dog not found")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("dog: ", res)[m
[31m-    [m
[31m-                    -- put it into the connection pool of size 100,[m
[31m-                    -- with 10 seconds max idle timeout[m
[31m-                    local ok, err = memc:set_keepalive(10000, 100)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("cannot set keepalive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    -- or just close the connection right away:[m
[31m-                    -- local ok, err = memc:close()[m
[31m-                    -- if not ok then[m
[31m-                    --     ngx.say("failed to close: ", err)[m
[31m-                    --     return[m
[31m-                    -- end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-The C<key> argument provided in the following methods will be automatically escaped according to the URI escaping rules before sending to the memcached server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: memc, err = memcached:new(opts?)>[m
[31m-[m
[31m-Creates a memcached object. In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-It accepts an optional C<opts> table argument. The following options are supported:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<key_transform>[m
[31m-[m
[31m-an array table containing two functions for escaping and unescaping the[m
[31m-memcached keys, respectively. By default,[m
[31m-the memcached keys will be escaped and unescaped as URI components, that is[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-        memached:new{[m
[31m-            key_transform = { ngx.escape_uri, ngx.unescape_uri }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 connect[m
[31m-[m
[31m-C<syntax: ok, err = memc:connect(host, port)>[m
[31m-[m
[31m-C<syntax: ok, err = memc:connect("unix:/path/to/unix.sock")>[m
[31m-[m
[31m-Attempts to connect to the remote host and port that the memcached server is listening to or a local unix domain socket file listened by the memcached server.[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set[m
[31m-[m
[31m-C<syntax: ok, err = memc:set(key, value, exptime, flags)>[m
[31m-[m
[31m-Inserts an entry into memcached unconditionally. If the key already exists, overrides it.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:set("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:set("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_timeout[m
[31m-[m
[31m-C<syntax: ok, err = memc:set_timeout(time)>[m
[31m-[m
[31m-Sets the timeout (in ms) protection for subsequent operations, including the C<connect> method.[m
[31m-[m
[31m-Returns 1 when successful and nil plus a string describing the error otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_keepalive[m
[31m-[m
[31m-C<syntax: ok, err = memc:set_keepalive(max_idle_timeout, pool_size)>[m
[31m-[m
[31m-Puts the current memcached connection immediately into the ngx_lua cosocket connection pool.[m
[31m-[m
[31m-You can specify the max idle timeout (in ms) when the connection is in the pool and the maximal size of the pool every nginx worker process.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-Only call this method in the place you would have called the C<close> method instead. Calling this method will immediately turn the current memcached object into the C<closed> state. Any subsequent operations other than C<connect()> on the current objet will return the C<closed> error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_reused_times[m
[31m-[m
[31m-C<syntax: times, err = memc:get_reused_times()>[m
[31m-[m
[31m-This method returns the (successfully) reused times for the current connection. In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-If the current connection does not come from the built-in connection pool, then this method always returns C<0>, that is, the connection has never been reused (yet). If the connection comes from the connection pool, then the return value is always non-zero. So this method can also be used to determine if the current connection comes from the pool.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 close[m
[31m-[m
[31m-C<syntax: ok, err = memc:close()>[m
[31m-[m
[31m-Closes the current memcached connection and returns the status.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 add[m
[31m-[m
[31m-C<syntax: ok, err = memc:add(key, value, exptime, flags)>[m
[31m-[m
[31m-Inserts an entry into memcached if and only if the key does not exist.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:add("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:add("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 replace[m
[31m-[m
[31m-C<syntax: ok, err = memc:replace(key, value, exptime, flags)>[m
[31m-[m
[31m-Inserts an entry into memcached if and only if the key does exist.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:replace("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:replace("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 append[m
[31m-[m
[31m-C<syntax: ok, err = memc:append(key, value, exptime, flags)>[m
[31m-[m
[31m-Appends the value to an entry with the same key that already exists in memcached.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:append("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:append("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 prepend[m
[31m-[m
[31m-C<syntax: ok, err = memc:prepend(key, value, exptime, flags)>[m
[31m-[m
[31m-Prepends the value to an entry with the same key that already exists in memcached.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:prepend("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:prepend("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get[m
[31m-[m
[31m-C<syntax: value, flags, err = memc:get(key)>[m
[31m-C<syntax: results, err = memc:get(keys)>[m
[31m-[m
[31m-Get a single entry or multiple entries in the memcached server via a single key or a talbe of keys.[m
[31m-[m
[31m-Let us first discuss the case When the key is a single string.[m
[31m-[m
[31m-The key's value and associated flags value will be returned if the entry is found and no error happens.[m
[31m-[m
[31m-In case of errors, C<nil> values will be turned for C<value> and C<flags> and a 3rd (string) value will also be returned for describing the error.[m
[31m-[m
[31m-If the entry is not found, then three C<nil> values will be returned.[m
[31m-[m
[31m-Then let us discuss the case when the a Lua table of multiple keys are provided.[m
[31m-[m
[31m-In this case, a Lua table holding the key-result pairs will be always returned in case of success. Each value corresponding each key in the table is also a table holding two values, the key's value and the key's flags. If a key does not exist, then there is no responding entries in the C<results> table.[m
[31m-[m
[31m-In case of errors, C<nil> will be returned, and the second return value will be a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gets[m
[31m-[m
[31m-C<syntax: value, flags, cas_unique, err = memc:gets(key)>[m
[31m-[m
[31m-C<syntax: results, err = memc:gets(keys)>[m
[31m-[m
[31m-Just like the C<get> method, but will also return the CAS unique value associated with the entry in addition to the key's value and flags.[m
[31m-[m
[31m-This method is usually used together with the C<cas> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 cas[m
[31m-[m
[31m-C<syntax: ok, err = memc:cas(key, value, cas_unique, exptime?, flags?)>[m
[31m-[m
[31m-Just like the C<set> method but does a check and set operation, which means "store this data but[m
[31m-only if no one else has updated since I last fetched it."[m
[31m-[m
[31m-The C<cas_unique> argument can be obtained from the C<gets> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 touch[m
[31m-[m
[31m-C<syntax: ok, err = memc:touch(key, exptime)>[m
[31m-[m
[31m-Update the expiration time of an existing key.[m
[31m-[m
[31m-Returns C<1> for success or C<nil> with a string describing the error otherwise.[m
[31m-[m
[31m-This method was first introduced in the C<v0.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 flush_all[m
[31m-[m
[31m-C<syntax: ok, err = memc:flush_all(time?)>[m
[31m-[m
[31m-Flushes (or invalidates) all the existing entries in the memcached server immediately (by default) or after the expiration[m
[31m-specified by the C<time> argument (in seconds).[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 delete[m
[31m-[m
[31m-C<syntax: ok, err = memc:delete(key)>[m
[31m-[m
[31m-Deletes the key from memcached immediately.[m
[31m-[m
[31m-The key to be deleted must already exist in memcached.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 incr[m
[31m-[m
[31m-C<syntax: new_value, err = memc:incr(key, delta)>[m
[31m-[m
[31m-Increments the value of the specified key by the integer value specified in the C<delta> argument.[m
[31m-[m
[31m-Returns the new value after incrementation in success, and C<nil> with a string describing the error in case of failures.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 decr[m
[31m-[m
[31m-C<syntax: new_value, err = memc:decr(key, value)>[m
[31m-[m
[31m-Decrements the value of the specified key by the integer value specified in the C<delta> argument.[m
[31m-[m
[31m-Returns the new value after decrementation in success, and C<nil> with a string describing the error in case of failures.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 stats[m
[31m-[m
[31m-C<syntax: lines, err = memc:stats(args?)>[m
[31m-[m
[31m-Returns memcached server statistics information with an optional C<args> argument.[m
[31m-[m
[31m-In case of success, this method returns a lua table holding all of the lines of the output; in case of failures, it returns C<nil> with a string describing the error.[m
[31m-[m
[31m-If the C<args> argument is omitted, general server statistics is returned. Possible C<args> argument values are C<items>, C<sizes>, C<slabs>, among others.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 version[m
[31m-[m
[31m-C<syntax: version, err = memc:version(args?)>[m
[31m-[m
[31m-Returns the server version number, like C<1.2.8>.[m
[31m-[m
[31m-In case of error, it returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 quit[m
[31m-[m
[31m-C<syntax: ok, err = memc:quit()>[m
[31m-[m
[31m-Tells the server to close the current memcached connection.[m
[31m-[m
[31m-Returns C<1> in case of success and C<nil> other wise. In case of failures, another string value will also be returned to describe the error.[m
[31m-[m
[31m-Generally you can just directly call the C<close> method to achieve the same effect.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 verbosity[m
[31m-[m
[31m-C<syntax: ok, err = memc:verbosity(level)>[m
[31m-[m
[31m-Sets the verbosity level used by the memcached server. The C<level> argument should be given integers only.[m
[31m-[m
[31m-Returns C<1> in case of success and C<nil> other wise. In case of failures, another string value will also be returned to describe the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like set_by_luaI<, log_by_lua>, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.memcached> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.memcached> instance.[m
[31m-You should always initiate C<resty.memcached> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the memcached pipelining API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the UDP part of the memcached ascii protocol.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2016, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the memcached wired protocol specification: http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-mysql-0.16/lua-resty-mysql-0.16.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-mysql-0.16/lua-resty-mysql-0.16.pod[m
[1mdeleted file mode 100644[m
[1mindex 9574f61..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-mysql-0.16/lua-resty-mysql-0.16.pod[m
[1m+++ /dev/null[m
[36m@@ -1,673 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-mysql - Lua MySQL client driver for ngx_lua based on the cosocket API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library is a MySQL client driver for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.9.11|https://github.com/chaoslawful/lua-nginx-module/tags> or L<ngx_openresty 1.7.4.1|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-Also, the L<bit library|http://bitop.luajit.org/> is also required. If you're using LuaJIT 2.0 with ngx_lua, then the C<bit> library is already available by default.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        # you do not need the following line if you are using[m
[31m-        # the ngx_openresty bundle:[m
[31m-        lua_package_path "/path/to/lua-resty-mysql/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location /test {[m
[31m-                content_by_lua '[m
[31m-                    local mysql = require "resty.mysql"[m
[31m-                    local db, err = mysql:new()[m
[31m-                    if not db then[m
[31m-                        ngx.say("failed to instantiate mysql: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    db:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-                    -- or connect to a unix domain socket file listened[m
[31m-                    -- by a mysql server:[m
[31m-                    --     local ok, err, errno, sqlstate =[m
[31m-                    --           db:connect{[m
[31m-                    --              path = "/path/to/mysql.sock",[m
[31m-                    --              database = "ngx_test",[m
[31m-                    --              user = "ngx_test",[m
[31m-                    --              password = "ngx_test" }[m
[31m-    [m
[31m-                    local ok, err, errno, sqlstate = db:connect{[m
[31m-                        host = "127.0.0.1",[m
[31m-                        port = 3306,[m
[31m-                        database = "ngx_test",[m
[31m-                        user = "ngx_test",[m
[31m-                        password = "ngx_test",[m
[31m-                        max_packet_size = 1024 * 1024 }[m
[31m-    [m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("connected to mysql.")[m
[31m-    [m
[31m-                    local res, err, errno, sqlstate =[m
[31m-                        db:query("drop table if exists cats")[m
[31m-                    if not res then[m
[31m-                        ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    res, err, errno, sqlstate =[m
[31m-                        db:query("create table cats "[m
[31m-                                 .. "(id serial primary key, "[m
[31m-                                 .. "name varchar(5))")[m
[31m-                    if not res then[m
[31m-                        ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("table cats created.")[m
[31m-    [m
[31m-                    res, err, errno, sqlstate =[m
[31m-                        db:query("insert into cats (name) "[m
[31m-                                 .. "values (\'Bob\'),(\'\'),(null)")[m
[31m-                    if not res then[m
[31m-                        ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say(res.affected_rows, " rows inserted into table cats ",[m
[31m-                            "(last insert id: ", res.insert_id, ")")[m
[31m-    [m
[31m-                    -- run a select query, expected about 10 rows in[m
[31m-                    -- the result set:[m
[31m-                    res, err, errno, sqlstate =[m
[31m-                        db:query("select * from cats order by id asc", 10)[m
[31m-                    if not res then[m
[31m-                        ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local cjson = require "cjson"[m
[31m-                    ngx.say("result: ", cjson.encode(res))[m
[31m-    [m
[31m-                    -- put it into the connection pool of size 100,[m
[31m-                    -- with 10 seconds max idle timeout[m
[31m-                    local ok, err = db:set_keepalive(10000, 100)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to set keepalive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    -- or just close the connection right away:[m
[31m-                    -- local ok, err = db:close()[m
[31m-                    -- if not ok then[m
[31m-                    --     ngx.say("failed to close: ", err)[m
[31m-                    --     return[m
[31m-                    -- end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: db, err = mysql:new()>[m
[31m-[m
[31m-Creates a MySQL connection object. In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 connect[m
[31m-[m
[31m-C<syntax: ok, err = db:connect(options)>[m
[31m-[m
[31m-Attempts to connect to the remote MySQL server.[m
[31m-[m
[31m-The C<options> argument is a Lua table holding the following keys:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<host>[m
[31m-[m
[31m-the host name for the MySQL server.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<port>[m
[31m-[m
[31m-the port that the MySQL server is listening on. Default to 3306.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<path>[m
[31m-[m
[31m-the path of the unix socket file listened by the MySQL server.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<database>[m
[31m-[m
[31m-the MySQL database name.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<user>[m
[31m-[m
[31m-MySQL account name for login.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<password>[m
[31m-[m
[31m-MySQL account password for login (in clear text).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max_packet_size>[m
[31m-[m
[31m-the upper limit for the reply packets sent from the MySQL server (default to 1MB).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ssl>[m
[31m-[m
[31m-If set to C<true>, then uses SSL to connect to MySQL (default to C<false>). If the MySQL[m
[31m-server does not have SSL support[m
[31m-(or just disabled), the error string "ssl disabled on server" will be returned.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ssl_verify>[m
[31m-[m
[31m-If set to C<true>, then verifies the validity of the server SSL certificate (default to C<false>).[m
[31m-Note that you need to configure the L<lua_ssl_trusted_certificate|https://github.com/openresty/lua-nginx-module#lua_ssl_trusted_certificate>[m
[31m-to specify the CA (or server) certificate used by your MySQL server. You may also[m
[31m-need to configure L<lua_ssl_verify_depth|https://github.com/openresty/lua-nginx-module#lua_ssl_verify_depth>[m
[31m-accordingly.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pool>[m
[31m-[m
[31m-the name for the MySQL connection pool. if omitted, an ambiguous pool name will be generated automatically with the string template C<user:database:host:port> or C<user:database:path>. (this option was first introduced in C<v0.08>.)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<compact_arrays>[m
[31m-[m
[31m-when this option is set to true, then the L<query> and L<read_result> methods will return the array-of-arrays structure for the resultset, rather than the default array-of-hashes structure.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_timeout[m
[31m-[m
[31m-C<syntax: db:set_timeout(time)>[m
[31m-[m
[31m-Sets the timeout (in ms) protection for subsequent operations, including the C<connect> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_keepalive[m
[31m-[m
[31m-C<syntax: ok, err = db:set_keepalive(max_idle_timeout, pool_size)>[m
[31m-[m
[31m-Puts the current MySQL connection immediately into the ngx_lua cosocket connection pool.[m
[31m-[m
[31m-You can specify the max idle timeout (in ms) when the connection is in the pool and the maximal size of the pool every nginx worker process.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-Only call this method in the place you would have called the C<close> method instead. Calling this method will immediately turn the current C<resty.mysql> object into the C<closed> state. Any subsequent operations other than C<connect()> on the current objet will return the C<closed> error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_reused_times[m
[31m-[m
[31m-C<syntax: times, err = db:get_reused_times()>[m
[31m-[m
[31m-This method returns the (successfully) reused times for the current connection. In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-If the current connection does not come from the built-in connection pool, then this method always returns C<0>, that is, the connection has never been reused (yet). If the connection comes from the connection pool, then the return value is always non-zero. So this method can also be used to determine if the current connection comes from the pool.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 close[m
[31m-[m
[31m-C<syntax: ok, err = db:close()>[m
[31m-[m
[31m-Closes the current mysql connection and returns the status.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 send_query[m
[31m-[m
[31m-C<syntax: bytes, err = db:send_query(query)>[m
[31m-[m
[31m-Sends the query to the remote MySQL server without waiting for its replies.[m
[31m-[m
[31m-Returns the bytes successfully sent out in success and otherwise returns C<nil> and a string describing the error.[m
[31m-[m
[31m-You should use the L<read_result> method to read the MySQL replies afterwards.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 read_result[m
[31m-[m
[31m-C<syntax: res, err, errno, sqlstate = db:read_result()>[m
[31m-[m
[31m-C<syntax: res, err, errno, sqlstate = db:read_result(nrows)>[m
[31m-[m
[31m-Reads in one result returned from the MySQL server.[m
[31m-[m
[31m-It returns a Lua table (C<res>) describing the MySQL C<OK packet> or C<result set packet> for the query result.[m
[31m-[m
[31m-For queries corresponding to a result set, it returns an array holding all the rows. Each row holds key-value apirs for each data fields. For instance,[m
[31m-[m
[31m-[m
[31m-        {[m
[31m-            { name = "Bob", age = 32, phone = ngx.null },[m
[31m-            { name = "Marry", age = 18, phone = "10666372"}[m
[31m-        }[m
[31m-[m
[31m-For queries that do not correspond to a result set, it returns a Lua table like this:[m
[31m-[m
[31m-[m
[31m-        {[m
[31m-            insert_id = 0,[m
[31m-            server_status = 2,[m
[31m-            warning_count = 1,[m
[31m-            affected_rows = 32,[m
[31m-            message = nil[m
[31m-        }[m
[31m-[m
[31m-If more results are following the current result, a second C<err> return value will be given the string C<again>. One should always check this (second) return value and if it is C<again>, then she should call this method again to retrieve more results. This usually happens when the original query contains multiple statements (separated by semicolon in the same query string) or calling a MySQL procedure. See also L<Multi-Resultset Support>.[m
[31m-[m
[31m-In case of errors, this method returns at most 4 values: C<nil>, C<err>, C<errcode>, and C<sqlstate>. The C<err> return value contains a string describing the error, the C<errcode> return value holds the MySQL error code (a numerical value), and finally, the C<sqlstate> return value contains the standard SQL error code that consists of 5 characters. Note that, the C<errcode> and C<sqlstate> might be C<nil> if MySQL does not return them.[m
[31m-[m
[31m-The optional argument C<nrows> can be used to specify an approximate number of rows for the result set. This value can be used[m
[31m-to pre-allocate space in the resulting Lua table for the result set. By default, it takes the value 4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 query[m
[31m-[m
[31m-C<syntax: res, err, errcode, sqlstate = db:query(query)>[m
[31m-[m
[31m-C<syntax: res, err, errcode, sqlstate = db:query(query, nrows)>[m
[31m-[m
[31m-This is a shortcut for combining the L<send_query> call and the first L<read_result> call.[m
[31m-[m
[31m-You should always check if the C<err> return value  is C<again> in case of success because this method will only call L<read_result> only once for you. See also L<Multi-Resultset Support>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_ver[m
[31m-[m
[31m-C<syntax: str = db:server_ver()>[m
[31m-[m
[31m-Returns the MySQL server version string, like C<"5.1.64">.[m
[31m-[m
[31m-You should only call this method after successfully connecting to a MySQL server, otherwise C<nil> will be returned.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_compact_arrays[m
[31m-[m
[31m-C<syntax: db:set_compact_arrays(boolean)>[m
[31m-[m
[31m-Sets whether to use the "compact-arrays" structure for the resultsets returned by subsequent queries. See the C<compact_arrays> option for the C<connect> method for more details.[m
[31m-[m
[31m-This method was first introduced in the C<v0.09> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SQL Literal Quoting[m
[31m-[m
[31m-It is always important to quote SQL literals properly to prevent SQL injection attacks. You can use the[m
[31m-L<ngx.quote_sql_str|http://wiki.nginx.org/HttpLuaModule#ngx.quote_sql_str> function provided by ngx_lua to quote values.[m
[31m-Here is an example:[m
[31m-[m
[31m-[m
[31m-        local name = ngx.unescape_uri(ngx.var.arg_name)[m
[31m-        local quoted_name = ngx.quote_sql_str(name)[m
[31m-        local sql = "select * from users where name = " .. quoted_name[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Multi-Resultset Support[m
[31m-[m
[31m-For a SQL query that produces multiple result-sets, it is always your duty to check the "again" error message returned by the L<query> or L<read_result> method calls, and keep pulling more result sets by calling the L<read_result> method until no "again" error message returned (or some other errors happen).[m
[31m-[m
[31m-Below is a trivial example for this:[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        local mysql = require "resty.mysql"[m
[31m-    [m
[31m-        local db = mysql:new()[m
[31m-        local ok, err, errno, sqlstate = db:connect({[m
[31m-            host = "127.0.0.1",[m
[31m-            port = 3306,[m
[31m-            database = "world",[m
[31m-            user = "monty",[m
[31m-            password = "pass"})[m
[31m-    [m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-            return ngx.exit(500)[m
[31m-        end[m
[31m-    [m
[31m-        res, err, errno, sqlstate = db:query("select 1; select 2; select 3;")[m
[31m-        if not res then[m
[31m-            ngx.log(ngx.ERR, "bad result #1: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            return ngx.exit(500)[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("result #1: ", cjson.encode(res))[m
[31m-    [m
[31m-        local i = 2[m
[31m-        while err == "again" do[m
[31m-            res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "bad result #", i, ": ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-    [m
[31m-            ngx.say("result #", i, ": ", cjson.encode(res))[m
[31m-            i = i + 1[m
[31m-        end[m
[31m-    [m
[31m-        local ok, err = db:set_keepalive(10000, 50)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to set keepalive: ", err)[m
[31m-            ngx.exit(500)[m
[31m-        end[m
[31m-[m
[31m-This code snippet will produce the following response body data:[m
[31m-[m
[31m-    result #1: [{"1":"1"}][m
[31m-    result #2: [{"2":"2"}][m
[31m-    result #3: [{"3":"3"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Debugging[m
[31m-[m
[31m-It is usually convenient to use the L<lua-cjson|http://www.kyne.com.au/~mark/software/lua-cjson.php> library to encode the return values of the MySQL query methods to JSON. For example,[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        ...[m
[31m-        local res, err, errcode, sqlstate = db:query("select * from cats")[m
[31m-        if res then[m
[31m-            print("res: ", cjson.encode(res))[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like init_by_luaI<, set_by_lua>, log_by_lua*, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.mysql> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.mysql> instance.[m
[31m-You should always initiate C<resty.mysql> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-If you are using the ngx_openresty bundle (http://openresty.org ), then[m
[31m-you do not need to do anything because it already includes and enables[m
[31m-lua-resty-mysql by default. And you can just use it in your Lua code,[m
[31m-as in[m
[31m-[m
[31m-[m
[31m-        local mysql = require "resty.mysql"[m
[31m-        ...[m
[31m-[m
[31m-If you are using your own nginx + ngx_lua build, then you need to configure[m
[31m-the lua_package_path directive to add the path of your lua-resty-mysql source[m
[31m-tree to ngx_lua's LUA_PATH search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-mysql/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-Ensure that the system account running your Nginx ''worker'' proceses have[m
[31m-enough permission to read the C<.lua> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/agentzh/lua-resty-mysql/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community|http://wiki.nginx.org/HttpLuaModule#Community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-improve the MySQL connection pool support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the MySQL binary row data packets.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement MySQL's old pre-4.0 authentication method.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement MySQL server prepare and execute packets.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the data compression support in the protocol.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2013, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the MySQL wired protocol specification: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_drizzle module: http://wiki.nginx.org/HttpDrizzleModule[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-redis-0.24/lua-resty-redis-0.24.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-redis-0.24/lua-resty-redis-0.24.pod[m
[1mdeleted file mode 100644[m
[1mindex 7eb01c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-redis-0.24/lua-resty-redis-0.24.pod[m
[1m+++ /dev/null[m
[36m@@ -1,753 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-redis - Lua redis client driver for the ngx_lua based on the cosocket API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library is a Redis client driver for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.5.14|https://github.com/chaoslawful/lua-nginx-module/tags> or L<OpenResty 1.2.1.14|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        # you do not need the following line if you are using[m
[31m-        # the OpenResty bundle:[m
[31m-        lua_package_path "/path/to/lua-resty-redis/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location /test {[m
[31m-                content_by_lua '[m
[31m-                    local redis = require "resty.redis"[m
[31m-                    local red = redis:new()[m
[31m-    [m
[31m-                    red:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-                    -- or connect to a unix domain socket file listened[m
[31m-                    -- by a redis server:[m
[31m-                    --     local ok, err = red:connect("unix:/path/to/redis.sock")[m
[31m-    [m
[31m-                    local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to connect: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ok, err = red:set("dog", "an animal")[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to set dog: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("set result: ", ok)[m
[31m-    [m
[31m-                    local res, err = red:get("dog")[m
[31m-                    if not res then[m
[31m-                        ngx.say("failed to get dog: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    if res == ngx.null then[m
[31m-                        ngx.say("dog not found.")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("dog: ", res)[m
[31m-    [m
[31m-                    red:init_pipeline()[m
[31m-                    red:set("cat", "Marry")[m
[31m-                    red:set("horse", "Bob")[m
[31m-                    red:get("cat")[m
[31m-                    red:get("horse")[m
[31m-                    local results, err = red:commit_pipeline()[m
[31m-                    if not results then[m
[31m-                        ngx.say("failed to commit the pipelined requests: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    for i, res in ipairs(results) do[m
[31m-                        if type(res) == "table" then[m
[31m-                            if res[1] == false then[m
[31m-                                ngx.say("failed to run command ", i, ": ", res[2])[m
[31m-                            else[m
[31m-                                -- process the table value[m
[31m-                            end[m
[31m-                        else[m
[31m-                            -- process the scalar value[m
[31m-                        end[m
[31m-                    end[m
[31m-    [m
[31m-                    -- put it into the connection pool of size 100,[m
[31m-                    -- with 10 seconds max idle time[m
[31m-                    local ok, err = red:set_keepalive(10000, 100)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to set keepalive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    -- or just close the connection right away:[m
[31m-                    -- local ok, err = red:close()[m
[31m-                    -- if not ok then[m
[31m-                    --     ngx.say("failed to close: ", err)[m
[31m-                    --     return[m
[31m-                    -- end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-All of the Redis commands have their own methods with the same name except all in lower case.[m
[31m-[m
[31m-You can find the complete list of Redis commands here:[m
[31m-[m
[31m-http://redis.io/commands[m
[31m-[m
[31m-You need to check out this Redis command reference to see what Redis command accepts what arguments.[m
[31m-[m
[31m-The Redis command arguments can be directly fed into the corresponding method call. For example, the "GET" redis command accepts a single key argument, then you can just call the "get" method like this:[m
[31m-[m
[31m-[m
[31m-        local res, err = red:get("key")[m
[31m-[m
[31m-Similarly, the "LRANGE" redis command accepts threee arguments, then you should call the "lrange" method like this:[m
[31m-[m
[31m-[m
[31m-        local res, err = red:lrange("nokey", 0, 1)[m
[31m-[m
[31m-For example, "SET", "GET", "LRANGE", and "BLPOP" commands correspond to the methods "set", "get", "lrange", and "blpop".[m
[31m-[m
[31m-Here are some more examples:[m
[31m-[m
[31m-[m
[31m-        -- HMGET myhash field1 field2 nofield[m
[31m-        local res, err = red:hmget("myhash", "field1", "field2", "nofield")[m
[31m-[m
[31m-[m
[31m-        -- HMSET myhash field1 "Hello" field2 "World"[m
[31m-        local res, err = red:hmset("myhash", "field1", "Hello", "field2", "World")[m
[31m-[m
[31m-All these command methods returns a single result in success and C<nil> otherwise. In case of errors or failures, it will also return a second value which is a string describing the error.[m
[31m-[m
[31m-A Redis "status reply" results in a string typed return value with the "+" prefix stripped.[m
[31m-[m
[31m-A Redis "integer reply" results in a Lua number typed return value.[m
[31m-[m
[31m-A Redis "error reply" results in a C<false> value I<and> a string describing the error.[m
[31m-[m
[31m-A non-nil Redis "bulk reply" results in a Lua string as the return value. A nil bulk reply results in a C<ngx.null> return value.[m
[31m-[m
[31m-A non-nil Redis "multi-bulk reply" results in a Lua table holding all the composing values (if any). If any of the composing value is a valid redis error value, then it will be a two element table C<{false, err}>.[m
[31m-[m
[31m-A nil multi-bulk reply returns in a C<ngx.null> value.[m
[31m-[m
[31m-See http://redis.io/topics/protocol for details regarding various Redis reply types.[m
[31m-[m
[31m-In addition to all those redis command methods, the following methods are also provided:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: red, err = redis:new()>[m
[31m-[m
[31m-Creates a redis object. In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 connect[m
[31m-[m
[31m-C<syntax: ok, err = red:connect(host, port, options_table?)>[m
[31m-[m
[31m-C<syntax: ok, err = red:connect("unix:/path/to/unix.sock", options_table?)>[m
[31m-[m
[31m-Attempts to connect to the remote host and port that the redis server is listening to or a local unix domain socket file listened by the redis server.[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method.[m
[31m-[m
[31m-An optional Lua table can be specified as the last argument to this method to specify various connect options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pool>[m
[31m-[m
[31m-Specifies a custom name for the connection pool being used. If omitted, then the connection pool name will be generated from the string template C<< <host>:<port> >> or C<< <unix-socket-path> >>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_timeout[m
[31m-[m
[31m-C<syntax: red:set_timeout(time)>[m
[31m-[m
[31m-Sets the timeout (in ms) protection for subsequent operations, including the C<connect> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_keepalive[m
[31m-[m
[31m-C<syntax: ok, err = red:set_keepalive(max_idle_timeout, pool_size)>[m
[31m-[m
[31m-Puts the current Redis connection immediately into the ngx_lua cosocket connection pool.[m
[31m-[m
[31m-You can specify the max idle timeout (in ms) when the connection is in the pool and the maximal size of the pool every nginx worker process.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-Only call this method in the place you would have called the C<close> method instead. Calling this method will immediately turn the current redis object into the C<closed> state. Any subsequent operations other than C<connect()> on the current object will return the C<closed> error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_reused_times[m
[31m-[m
[31m-C<syntax: times, err = red:get_reused_times()>[m
[31m-[m
[31m-This method returns the (successfully) reused times for the current connection. In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-If the current connection does not come from the built-in connection pool, then this method always returns C<0>, that is, the connection has never been reused (yet). If the connection comes from the connection pool, then the return value is always non-zero. So this method can also be used to determine if the current connection comes from the pool.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 close[m
[31m-[m
[31m-C<syntax: ok, err = red:close()>[m
[31m-[m
[31m-Closes the current redis connection and returns the status.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_pipeline[m
[31m-[m
[31m-C<syntax: red:init_pipeline()>[m
[31m-[m
[31m-C<syntax: red:init_pipeline(n)>[m
[31m-[m
[31m-Enable the redis pipelining mode. All subsequent calls to Redis command methods will automatically get cached and will send to the server in one run when the C<commit_pipeline> method is called or get cancelled by calling the C<cancel_pipeline> method.[m
[31m-[m
[31m-This method always succeeds.[m
[31m-[m
[31m-If the redis object is already in the Redis pipelining mode, then calling this method will discard existing cached Redis queries.[m
[31m-[m
[31m-The optional C<n> argument specifies the (approximate) number of commands that are going to add to this pipeline, which can make things a little faster.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 commit_pipeline[m
[31m-[m
[31m-C<syntax: results, err = red:commit_pipeline()>[m
[31m-[m
[31m-Quits the pipelining mode by committing all the cached Redis queries to the remote server in a single run. All the replies for these queries will be collected automatically and are returned as if a big multi-bulk reply at the highest level.[m
[31m-[m
[31m-This method returns C<nil> and a Lua string describing the error upon failures.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 cancel_pipeline[m
[31m-[m
[31m-C<syntax: red:cancel_pipeline()>[m
[31m-[m
[31m-Quits the pipelining mode by discarding all existing cached Redis commands since the last call to the C<init_pipeline> method.[m
[31m-[m
[31m-This method always succeeds.[m
[31m-[m
[31m-If the redis object is not in the Redis pipelining mode, then this method is a no-op.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hmset[m
[31m-[m
[31m-C<syntax: red:hmset(myhash, field1, value1, field2, value2, ...)>[m
[31m-[m
[31m-C<syntax: red:hmset(myhash, { field1 = value1, field2 = value2, ... })>[m
[31m-[m
[31m-Special wrapper for the Redis "hmset" command.[m
[31m-[m
[31m-When there are only three arguments (including the "red" object[m
[31m-itself), then the last argument must be a Lua table holding all the field/value pairs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_to_hash[m
[31m-[m
[31m-C<syntax: hash = red:array_to_hash(array)>[m
[31m-[m
[31m-Auxiliary function that converts an array-like Lua table into a hash-like table.[m
[31m-[m
[31m-This method was first introduced in the C<v0.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 read_reply[m
[31m-[m
[31m-C<syntax: res, err = red:read_reply()>[m
[31m-[m
[31m-Reading a reply from the redis server. This method is mostly useful for the L<Redis PubE<sol>Sub API|http://redis.io/topics/pubsub/>, for example,[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        local redis = require "resty.redis"[m
[31m-    [m
[31m-        local red = redis:new()[m
[31m-        local red2 = redis:new()[m
[31m-    [m
[31m-        red:set_timeout(1000) -- 1 sec[m
[31m-        red2:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-        local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("1: failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ok, err = red2:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("2: failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local res, err = red:subscribe("dog")[m
[31m-        if not res then[m
[31m-            ngx.say("1: failed to subscribe: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-    [m
[31m-        res, err = red2:publish("dog", "Hello")[m
[31m-        if not res then[m
[31m-            ngx.say("2: failed to publish: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("2: publish: ", cjson.encode(res))[m
[31m-    [m
[31m-        res, err = red:read_reply()[m
[31m-        if not res then[m
[31m-            ngx.say("1: failed to read reply: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("1: receive: ", cjson.encode(res))[m
[31m-    [m
[31m-        red:close()[m
[31m-        red2:close()[m
[31m-[m
[31m-Running this example gives the output like this:[m
[31m-[m
[31m-    1: subscribe: ["subscribe","dog",1][m
[31m-    2: publish: 1[m
[31m-    1: receive: ["message","dog","Hello"][m
[31m-[m
[31m-The following class methods are provieded:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 add_commands[m
[31m-[m
[31m-C<syntax: hash = redis.add_commands(cmd_name1, cmd_name2, ...)>[m
[31m-[m
[31m-Adds new redis commands to the C<resty.redis> class. Here is an example:[m
[31m-[m
[31m-[m
[31m-        local redis = require "resty.redis"[m
[31m-    [m
[31m-        redis.add_commands("foo", "bar")[m
[31m-    [m
[31m-        local red = redis:new()[m
[31m-    [m
[31m-        red:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-        local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local res, err = red:foo("a")[m
[31m-        if not res then[m
[31m-            ngx.say("failed to foo: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        res, err = red:bar()[m
[31m-        if not res then[m
[31m-            ngx.say("failed to bar: ", err)[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Redis Authentication[m
[31m-[m
[31m-Redis uses the C<AUTH> command to do authentication: http://redis.io/commands/auth[m
[31m-[m
[31m-There is nothing special for this command as compared to other Redis[m
[31m-commands like C<GET> and C<SET>. So one can just invoke the C<auth> method on your C<resty.redis> instance. Here is an example:[m
[31m-[m
[31m-[m
[31m-        local redis = require "resty.redis"[m
[31m-        local red = redis:new()[m
[31m-    [m
[31m-        red:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-        local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local res, err = red:auth("foobared")[m
[31m-        if not res then[m
[31m-            ngx.say("failed to authenticate: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-where we assume that the Redis server is configured with the[m
[31m-password C<foobared> in the C<redis.conf> file:[m
[31m-[m
[31m-    requirepass foobared[m
[31m-[m
[31m-If the password specified is wrong, then the sample above will output the[m
[31m-following to the HTTP client:[m
[31m-[m
[31m-    failed to authenticate: ERR invalid password[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Redis Transactions[m
[31m-[m
[31m-This library supports the L<Redis transactions|http://redis.io/topics/transactions/>. Here is an example:[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        local redis = require "resty.redis"[m
[31m-        local red = redis:new()[m
[31m-    [m
[31m-        red:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-        local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local ok, err = red:multi()[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to run multi: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        ngx.say("multi ans: ", cjson.encode(ok))[m
[31m-    [m
[31m-        local ans, err = red:set("a", "abc")[m
[31m-        if not ans then[m
[31m-            ngx.say("failed to run sort: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        ngx.say("set ans: ", cjson.encode(ans))[m
[31m-    [m
[31m-        local ans, err = red:lpop("a")[m
[31m-        if not ans then[m
[31m-            ngx.say("failed to run sort: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        ngx.say("set ans: ", cjson.encode(ans))[m
[31m-    [m
[31m-        ans, err = red:exec()[m
[31m-        ngx.say("exec ans: ", cjson.encode(ans))[m
[31m-    [m
[31m-        red:close()[m
[31m-[m
[31m-Then the output will be[m
[31m-[m
[31m-    multi ans: "OK"[m
[31m-    set ans: "QUEUED"[m
[31m-    set ans: "QUEUED"[m
[31m-    exec ans: ["OK",[false,"ERR Operation against a key holding the wrong kind of value"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Load Balancing and Failover[m
[31m-[m
[31m-You can trivially implement your own Redis load balancing logic yourself in Lua. Just keep a Lua table of all available Redis backend information (like host name and port numbers) and pick one server according to some rule (like round-robin or key-based hashing) from the Lua table at every request. You can keep track of the current rule state in your own Lua module's data, see http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker[m
[31m-[m
[31m-Similarly, you can implement automatic failover logic in Lua at great flexibility.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Debugging[m
[31m-[m
[31m-It is usually convenient to use the L<lua-cjson|http://www.kyne.com.au/~mark/software/lua-cjson.php> library to encode the return values of the redis command methods to JSON. For example,[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        ...[m
[31m-        local res, err = red:mget("h1234", "h5678")[m
[31m-        if res then[m
[31m-            print("res: ", cjson.encode(res))[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Check List for Issues[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Ensure you configure the connection pool size properly in the L<set_keepalive> . Basically if your NGINX handle C<n> concurrent requests and your NGINX has C<m> workers, then the connection pool size should be configured as C<n/m>. For example, if your NGINX usually handles 1000 concurrent requests and you have 10 NGINX workers, then the connection pool size should be 100.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Ensure the backlog setting on the Redis side is large enough. For Redis 2.8+, you can directly tune the C<tcp-backlog> parameter in the C<redis.conf> file (and also tune the kernel parameter C<SOMAXCONN> accordingly at least on Linux). You may also want to tune the C<maxclients> parameter in C<redis.conf>.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Ensure you are not using too short timeout setting in the L<set_timeout> method. If you have to, try redoing the operation upon timeout and turning off L<automatic error logging> (because you are already doing proper error handling in your own Lua code).[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-If your NGINX worker processes' CPU usage is very high under load, then the NGINX event loop might be blocked by the CPU computation too much. Try sampling a L<C-land on-CPU Flame Graph|https://github.com/agentzh/nginx-systemtap-toolkit#sample-bt> and L<Lua-land on-CPU Flame Graph|https://github.com/agentzh/stapxx#ngx-lj-lua-stacks> for a typical NGINX worker process. You can optimize the CPU-bound things according to these Flame Graphs.[m
[31m-[m
[31m-=item 5.[m
[31m-[m
[31m-If your NGINX worker processes' CPU usage is very low under load, then the NGINX event loop might be blocked by some blocking system calls (like file IO system calls). You can confirm the issue by running the L<epoll-loop-blocking-distr|https://github.com/agentzh/stapxx#epoll-loop-blocking-distr> tool against a typical NGINX worker process. If it is indeed the case, then you can further sample a L<C-land off-CPU Flame Graph|https://github.com/agentzh/nginx-systemtap-toolkit#sample-bt-off-cpu> for a NGINX worker process to analyze the actual blockers.[m
[31m-[m
[31m-=item 6.[m
[31m-[m
[31m-If your C<redis-server> process is running near 100% CPU usage, then you should consider scale your Redis backend by multiple nodes or use the L<C-land on-CPU Flame Graph tool|https://github.com/agentzh/nginx-systemtap-toolkit#sample-bt> to analyze the internal bottlenecks within the Redis server process.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like init_by_luaI<, set_by_lua>, log_by_lua*, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.redis> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.redis> instance[m
[31m-(you would see the "bad request" or "socket busy" error to be returned from the method calls).[m
[31m-You should always initiate C<resty.redis> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-If you are using the OpenResty bundle (http://openresty.org ), then[m
[31m-you do not need to do anything because it already includes and enables[m
[31m-lua-resty-redis by default. And you can just use it in your Lua code,[m
[31m-as in[m
[31m-[m
[31m-[m
[31m-        local redis = require "resty.redis"[m
[31m-        ...[m
[31m-[m
[31m-If you are using your own nginx + ngx_lua build, then you need to configure[m
[31m-the lua_package_path directive to add the path of your lua-resty-redis source[m
[31m-tree to ngx_lua's LUA_PATH search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-redis/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-Ensure that the system account running your Nginx ''worker'' proceses have[m
[31m-enough permission to read the C<.lua> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/agentzh/lua-resty-redis/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2016, by Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the redis wired protocol specification: http://redis.io/topics/protocol[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-string-0.09/lua-resty-string-0.09.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-string-0.09/lua-resty-string-0.09.pod[m
[1mdeleted file mode 100644[m
[1mindex d66dc1d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-string-0.09/lua-resty-string-0.09.pod[m
[1m+++ /dev/null[m
[36m@@ -1,213 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-string - String utilities and common hash functions for ngx_lua and LuaJIT[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered experimental and still under active development.[m
[31m-[m
[31m-The API is still in flux and may change without notice.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This library requires an nginx build with OpenSSL,[m
[31m-the L<ngx_lua module|http://wiki.nginx.org/HttpLuaModule>, and L<LuaJIT 2.0|http://luajit.org/luajit.html>.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        # nginx.conf:[m
[31m-    [m
[31m-        lua_package_path "/path/to/lua-resty-string/lib/?.lua;;"[m
[31m-    [m
[31m-        server {[m
[31m-            location = /test {[m
[31m-                content_by_lua_file conf/test.lua;[m
[31m-            }[m
[31m-        }[m
[31m-    [m
[31m-        -- conf/test.lua:[m
[31m-    [m
[31m-        local resty_sha1 = require "resty.sha1"[m
[31m-    [m
[31m-        local sha1 = resty_sha1:new()[m
[31m-        if not sha1 then[m
[31m-            ngx.say("failed to create the sha1 object")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local ok = sha1:update("hello, ")[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to add data")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ok = sha1:update("world")[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to add data")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local digest = sha1:final()  -- binary digest[m
[31m-    [m
[31m-        local str = require "resty.string"[m
[31m-        ngx.say("sha1: ", str.to_hex(digest))[m
[31m-            -- output: "sha1: b7e23ec29af22b0b4e41da31e868d57226121c84"[m
[31m-    [m
[31m-        local resty_md5 = require "resty.md5"[m
[31m-        local md5 = resty_md5:new()[m
[31m-        if not md5 then[m
[31m-            ngx.say("failed to create md5 object")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local ok = md5:update("hel")[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to add data")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ok = md5:update("lo")[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to add data")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local digest = md5:final()[m
[31m-    [m
[31m-        local str = require "resty.string"[m
[31m-        ngx.say("md5: ", str.to_hex(digest))[m
[31m-            -- yield "md5: 5d41402abc4b2a76b9719d911017c592"[m
[31m-    [m
[31m-        local resty_sha224 = require "resty.sha224"[m
[31m-        local str = require "resty.string"[m
[31m-        local sha224 = resty_sha224:new()[m
[31m-        ngx.say(sha224:update("hello"))[m
[31m-        local digest = sha224:final()[m
[31m-        ngx.say("sha224: ", str.to_hex(digest))[m
[31m-    [m
[31m-        local resty_sha256 = require "resty.sha256"[m
[31m-        local str = require "resty.string"[m
[31m-        local sha256 = resty_sha256:new()[m
[31m-        ngx.say(sha256:update("hello"))[m
[31m-        local digest = sha256:final()[m
[31m-        ngx.say("sha256: ", str.to_hex(digest))[m
[31m-    [m
[31m-        local resty_sha512 = require "resty.sha512"[m
[31m-        local str = require "resty.string"[m
[31m-        local sha512 = resty_sha512:new()[m
[31m-        ngx.say(sha512:update("hello"))[m
[31m-        local digest = sha512:final()[m
[31m-        ngx.say("sha512: ", str.to_hex(digest))[m
[31m-    [m
[31m-        local resty_sha384 = require "resty.sha384"[m
[31m-        local str = require "resty.string"[m
[31m-        local sha384 = resty_sha384:new()[m
[31m-        ngx.say(sha384:update("hel"))[m
[31m-        ngx.say(sha384:update("lo"))[m
[31m-        local digest = sha384:final()[m
[31m-        ngx.say("sha384: ", str.to_hex(digest))[m
[31m-    [m
[31m-        local resty_random = require "resty.random"[m
[31m-        local str = require "resty.string"[m
[31m-        local random = resty_random.bytes(16)[m
[31m-            -- generate 16 bytes of pseudo-random data[m
[31m-        ngx.say("pseudo-random: ", str.to_hex(random))[m
[31m-    [m
[31m-        local resty_random = require "resty.random"[m
[31m-        local str = require "resty.string"[m
[31m-        local strong_random = resty_random.bytes(16,true)[m
[31m-            -- attempt to generate 16 bytes of[m
[31m-            -- cryptographically strong random data[m
[31m-        while strong_random == nil do[m
[31m-            strong_random = resty_random.bytes(16,true)[m
[31m-        end[m
[31m-        ngx.say("random: ", str.to_hex(strong_random))[m
[31m-    [m
[31m-        local aes = require "resty.aes"[m
[31m-        local str = require "resty.string"[m
[31m-        local aes_128_cbc_md5 = aes:new("AKeyForAES")[m
[31m-            -- the default cipher is AES 128 CBC with 1 round of MD5[m
[31m-            -- for the key and a nil salt[m
[31m-        local encrypted = aes_128_cbc_md5:encrypt("Secret message!")[m
[31m-        ngx.say("AES 128 CBC (MD5) Encrypted HEX: ", str.to_hex(encrypted))[m
[31m-        ngx.say("AES 128 CBC (MD5) Decrypted: ", aes_128_cbc_md5:decrypt(encrypted))[m
[31m-    [m
[31m-        local aes = require "resty.aes"[m
[31m-        local str = require "resty.string"[m
[31m-        local aes_256_cbc_sha512x5 = aes:new("AKeyForAES-256-CBC",[m
[31m-            "MySalt!", aes.cipher(256,"cbc"), aes.hash.sha512, 5)[m
[31m-            -- AES 256 CBC with 5 rounds of SHA-512 for the key[m
[31m-            -- and a salt of "MySalt!"[m
[31m-        local encrypted = aes_256_cbc_sha512x5:encrypt("Really secret message!")[m
[31m-        ngx.say("AES 256 CBC (SHA-512, salted) Encrypted HEX: ", str.to_hex(encrypted))[m
[31m-        ngx.say("AES 256 CBC (SHA-512, salted) Decrypted: ",[m
[31m-            aes_256_cbc_sha512x5:decrypt(encrypted))[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2014, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-upload-0.09/lua-resty-upload-0.09.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-upload-0.09/lua-resty-upload-0.09.pod[m
[1mdeleted file mode 100644[m
[1mindex c604a62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-upload-0.09/lua-resty-upload-0.09.pod[m
[1m+++ /dev/null[m
[36m@@ -1,227 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-upload - Streaming reader and parser for HTTP file uploading based on ngx_lua cosocket[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library is a streaming file uploading API for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-The multipart/form-data MIME type is supported.[m
[31m-[m
[31m-The API of this library just returns tokens one by one. The user just needs to call the C<read> method repeatedly until a nil token type is returned. For each token returned from the C<read> method, just check the first return value for the current token type. The token type can be C<header>, C<body>, and C<part end>. Each C<multipart/form-data> form field parsed consists of several C<header> tokens holding each field header, several C<body> tokens holding each body data chunk, and a C<part end> flag indicating the field end.[m
[31m-[m
[31m-This is how streaming reading works. Even for giga bytes of file data input, the memory used in the lua land can be small and constant, as long as the user does not accumulate the input data chunks herself.[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.7.9|https://github.com/chaoslawful/lua-nginx-module/tags> or L<ngx_openresty 1.2.4.14|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        lua_package_path "/path/to/lua-resty-redis/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location /test {[m
[31m-                content_by_lua '[m
[31m-                    local upload = require "resty.upload"[m
[31m-                    local cjson = require "cjson"[m
[31m-    [m
[31m-                    local chunk_size = 5 -- should be set to 4096 or 8192[m
[31m-                                         -- for real-world settings[m
[31m-    [m
[31m-                    local form, err = upload:new(chunk_size)[m
[31m-                    if not form then[m
[31m-                        ngx.log(ngx.ERR, "failed to new upload: ", err)[m
[31m-                        ngx.exit(500)[m
[31m-                    end[m
[31m-    [m
[31m-                    form:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-                    while true do[m
[31m-                        local typ, res, err = form:read()[m
[31m-                        if not typ then[m
[31m-                            ngx.say("failed to read: ", err)[m
[31m-                            return[m
[31m-                        end[m
[31m-    [m
[31m-                        ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-    [m
[31m-                        if typ == "eof" then[m
[31m-                            break[m
[31m-                        end[m
[31m-                    end[m
[31m-    [m
[31m-                    local typ, res, err = form:read()[m
[31m-                    ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-A typical output of the /test location defined above is:[m
[31m-[m
[31m-    read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-    read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-    read: ["body","Hello"][m
[31m-    read: ["body",", wor"][m
[31m-    read: ["body","ld"][m
[31m-    read: ["part_end"][m
[31m-    read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-    read: ["body","value"][m
[31m-    read: ["body","\r\n"][m
[31m-    read: ["part_end"][m
[31m-    read: ["eof"][m
[31m-    read: ["eof"][m
[31m-[m
[31m-You can use the L<lua-resty-string|https://github.com/agentzh/lua-resty-string> library to compute SHA-1 and MD5 digest of the file data incrementally. Here is such an example:[m
[31m-[m
[31m-[m
[31m-        local resty_sha1 = require "resty.sha1"[m
[31m-        local upload = require "resty.upload"[m
[31m-    [m
[31m-        local chunk_size = 4096[m
[31m-        local form = upload:new(chunk_size)[m
[31m-        local sha1 = resty_sha1:new()[m
[31m-        local file[m
[31m-        while true do[m
[31m-            local typ, res, err = form:read()[m
[31m-    [m
[31m-            if not typ then[m
[31m-                 ngx.say("failed to read: ", err)[m
[31m-                 return[m
[31m-            end[m
[31m-    [m
[31m-            if typ == "header" then[m
[31m-                local file_name = my_get_file_name(res)[m
[31m-                if file_name then[m
[31m-                    file = io.open(file_name, "w+")[m
[31m-                    if not file then[m
[31m-                        ngx.say("failed to open file ", file_name)[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-    [m
[31m-             elseif typ == "body" then[m
[31m-                if file then[m
[31m-                    file:write(res)[m
[31m-                    sha1:update(res)[m
[31m-                end[m
[31m-    [m
[31m-            elseif typ == "part_end" then[m
[31m-                file:close()[m
[31m-                file = nil[m
[31m-                local sha1_sum = sha1:final()[m
[31m-                sha1:reset()[m
[31m-                my_save_sha1_sum(sha1_sum)[m
[31m-    [m
[31m-            elseif typ == "eof" then[m
[31m-                break[m
[31m-    [m
[31m-            else[m
[31m-                -- do nothing[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-If you want to copmute MD5 sums for the uploaded files, just use the[m
[31m-resty.md5 module shipped by the L<lua-resty-string|https://github.com/agentzh/lua-resty-string> library. It has[m
[31m-a similar API as resty.sha1.[m
[31m-[m
[31m-For big file uploading, it is important not to buffer all the data in memory.[m
[31m-That is, you should never accumulate data chunks either in a huge Lua string or[m
[31m-in a huge Lua table. You must write the data chunk into files as soon as possible and[m
[31m-throw away the data chunk immediately (to let the Lua GC free it up).[m
[31m-[m
[31m-Instead of writing the data chunk into files (as shown in the example above),[m
[31m-you can also write the data chunks to upstream cosocket connections if you do[m
[31m-not want to save the data on local file systems.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2013, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ngx_lua module|http://wiki.nginx.org/HttpLuaModule>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-string|https://github.com/agentzh/lua-resty-string> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-upstream-healthcheck-0.04/lua-resty-upstream-healthcheck-0.04.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-upstream-healthcheck-0.04/lua-resty-upstream-healthcheck-0.04.pod[m
[1mdeleted file mode 100644[m
[1mindex 81ed065..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-upstream-healthcheck-0.04/lua-resty-upstream-healthcheck-0.04.pod[m
[1m+++ /dev/null[m
[36m@@ -1,332 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-upstream-healthcheck - Health-checker for Nginx upstream servers[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is still under early development but is already production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    http {[m
[31m-        lua_package_path "/path/to/lua-resty-upstream-healthcheck/lib/?.lua;;";[m
[31m-    [m
[31m-        # sample upstream block:[m
[31m-        upstream foo.com {[m
[31m-            server 127.0.0.1:12354;[m
[31m-            server 127.0.0.1:12355;[m
[31m-            server 127.0.0.1:12356 backup;[m
[31m-        }[m
[31m-    [m
[31m-        # the size depends on the number of servers in upstream {}:[m
[31m-        lua_shared_dict healthcheck 1m;[m
[31m-    [m
[31m-        lua_socket_log_errors off;[m
[31m-    [m
[31m-        init_worker_by_lua_block {[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-    [m
[31m-            local ok, err = hc.spawn_checker{[m
[31m-                shm = "healthcheck",  -- defined by "lua_shared_dict"[m
[31m-                upstream = "foo.com", -- defined by "upstream"[m
[31m-                type = "http",[m
[31m-    [m
[31m-                http_req = "GET /status HTTP/1.0\r\nHost: foo.com\r\n\r\n",[m
[31m-                        -- raw HTTP request for checking[m
[31m-    [m
[31m-                interval = 2000,  -- run the check cycle every 2 sec[m
[31m-                timeout = 1000,   -- 1 sec is the timeout for network operations[m
[31m-                fall = 3,  -- # of successive failures before turning a peer down[m
[31m-                rise = 2,  -- # of successive successes before turning a peer up[m
[31m-                valid_statuses = {200, 302},  -- a list valid HTTP status code[m
[31m-                concurrency = 10,  -- concurrency level for test requests[m
[31m-            }[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-    [m
[31m-            -- Just call hc.spawn_checker() for more times here if you have[m
[31m-            -- more upstream groups to monitor. One call for one upstream group.[m
[31m-            -- They can all share the same shm zone without conflicts but they[m
[31m-            -- need a bigger shm zone for obvious reasons.[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            ...[m
[31m-    [m
[31m-            # status page for all the peers:[m
[31m-            location = /status {[m
[31m-                access_log off;[m
[31m-                allow 127.0.0.1;[m
[31m-                deny all;[m
[31m-    [m
[31m-                default_type text/plain;[m
[31m-                content_by_lua_block {[m
[31m-                    local hc = require "resty.upstream.healthcheck"[m
[31m-                    ngx.say("Nginx Worker PID: ", ngx.worker.pid())[m
[31m-                    ngx.print(hc.status_page())[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This library performs healthcheck for server peers defined in NGINX C<upstream> groups specified by names.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-=head2 spawn_checker[m
[31m-[m
[31m-B<syntax:> C<ok, err = healthcheck.spawn_checker(options)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>>[m
[31m-[m
[31m-Spawns background timer-based "light threads" to perform periodic healthchecks on[m
[31m-the specified NGINX upstream group with the specified shm storage.[m
[31m-[m
[31m-The healthchecker does not need any client traffic to function. The checks are performed actively[m
[31m-and periodically.[m
[31m-[m
[31m-This method call is asynchronous and returns immediately.[m
[31m-[m
[31m-Returns true on success, or C<nil> and a string describing an error otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 status_page[m
[31m-[m
[31m-B<syntax:> C<str, err = healthcheck.status_page()>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Generates a detailed status report for all the upstreams defined in the current NGINX server.[m
[31m-[m
[31m-One typical output is[m
[31m-[m
[31m-[m
[31m-    Upstream foo.com[m
[31m-        Primary Peers[m
[31m-            127.0.0.1:12354 up[m
[31m-            127.0.0.1:12355 DOWN[m
[31m-        Backup Peers[m
[31m-            127.0.0.1:12356 up[m
[31m-    [m
[31m-    Upstream bar.com[m
[31m-        Primary Peers[m
[31m-            127.0.0.1:12354 up[m
[31m-            127.0.0.1:12355 DOWN[m
[31m-            127.0.0.1:12357 DOWN[m
[31m-        Backup Peers[m
[31m-            127.0.0.1:12356 up[m
[31m-[m
[31m-If an upstream has no health checkers, then it will be marked by C<(NO checkers)>, as in[m
[31m-[m
[31m-[m
[31m-    Upstream foo.com (NO checkers)[m
[31m-        Primary Peers[m
[31m-            127.0.0.1:12354 up[m
[31m-            127.0.0.1:12355 up[m
[31m-        Backup Peers[m
[31m-            127.0.0.1:12356 up[m
[31m-[m
[31m-If you indeed have spawned a healthchecker in C<init_worker_by_lua*>, then you should really[m
[31m-check out the NGINX error log file to see if there is any fatal errors aborting the healthchecker threads.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Multiple Upstreams[m
[31m-[m
[31m-One can perform healchchecks on multiple C<upstream> groups by calling the L<spawn_checker> method[m
[31m-multiple times in the C<init_worker_by_lua*> handler. For example,[m
[31m-[m
[31m-[m
[31m-    upstream foo {[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    upstream bar {[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    lua_shared_dict healthcheck 1m;[m
[31m-    [m
[31m-    lua_socket_log_errors off;[m
[31m-    [m
[31m-    init_worker_by_lua_block {[m
[31m-        init_worker_by_lua_block {[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-    [m
[31m-            local ok, err = hc.spawn_checker{[m
[31m-                shm = "healthcheck",[m
[31m-                upstream = "foo",[m
[31m-                ...[m
[31m-            }[m
[31m-    [m
[31m-            ...[m
[31m-    [m
[31m-            ok, err = hc.spawn_checker{[m
[31m-                shm = "healthcheck",[m
[31m-                upstream = "bar",[m
[31m-                ...[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-Different upstreams' healthcheckers use different keys (by always prefixing the keys with the[m
[31m-upstream name), so sharing a single C<lua_shared_dict> among multiple checkers should not have[m
[31m-any issues at all. But you need to compensate the size of the shared dict for multiple users (i.e., multiple checkers).[m
[31m-If you have many upstreams (thousands or even more), then it is more optimal to use separate shm zones[m
[31m-for each (group) of the upstreams.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-If you are using L<OpenResty|http://openresty.org> 1.9.3.2 or later, then you should already have this library (and all of its dependencies) installed by default (and this is also the recommended way of using this library). Otherwise continue reading:[m
[31m-[m
[31m-You need to compile both the L<ngx_lua|https://github.com/openresty/lua-nginx-module> and L<ngx_lua_upstream|https://github.com/openresty/lua-upstream-nginx-module> modules into your Nginx.[m
[31m-[m
[31m-The latest git master branch of L<ngx_lua|https://github.com/openresty/lua-nginx-module> is required.[m
[31m-[m
[31m-You need to configure[m
[31m-the L<lua_package_path|https://github.com/openresty/lua-nginx-module#lua_package_path> directive to[m
[31m-add the path of your C<lua-resty-upstream-healthcheck> source tree to L<ngx_lua|https://github.com/openresty/lua-nginx-module>'s Lua module search path, as in[m
[31m-[m
[31m-[m
[31m-    # nginx.conf[m
[31m-    http {[m
[31m-        lua_package_path "/path/to/lua-resty-upstream-healthcheck/lib/?.lua;;";[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/openresty/lua-resty-upstream-healthcheck/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2014-2016, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua_upstream module: https://github.com/openresty/lua-upstream-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-websocket-0.05/lua-resty-websocket-0.05.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-websocket-0.05/lua-resty-websocket-0.05.pod[m
[1mdeleted file mode 100644[m
[1mindex 7621c29..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/lua-resty-websocket-0.05/lua-resty-websocket-0.05.pod[m
[1m+++ /dev/null[m
[36m@@ -1,759 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-websocket - Lua WebSocket implementation for the ngx_lua module[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library implements a WebSocket server and client libraries based on the L<ngx_lua module|http://wiki.nginx.org/HttpLuaModule>.[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that only L<RFC 6455|http://tools.ietf.org/html/rfc6455> is supported. Earlier protocol revisions like "hybi-10", "hybi-07", and "hybi-00" are not and will not be considered.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        local server = require "resty.websocket.server"[m
[31m-    [m
[31m-        local wb, err = server:new{[m
[31m-            timeout = 5000,  -- in milliseconds[m
[31m-            max_payload_len = 65535,[m
[31m-        }[m
[31m-        if not wb then[m
[31m-            ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-            return ngx.exit(444)[m
[31m-        end[m
[31m-    [m
[31m-        local data, typ, err = wb:recv_frame()[m
[31m-    [m
[31m-        if not data then[m
[31m-            ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-            return ngx.exit(444)[m
[31m-        end[m
[31m-    [m
[31m-        if typ == "close" then[m
[31m-            -- send a close frame back:[m
[31m-    [m
[31m-            local bytes, err = wb:send_close(1000, "enough, enough!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the close frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local code = err[m
[31m-            ngx.log(ngx.INFO, "closing with status code ", code, " and message ", data)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        if typ == "ping" then[m
[31m-            -- send a pong frame back:[m
[31m-    [m
[31m-            local bytes, err = wb:send_pong(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        elseif typ == "pong" then[m
[31m-            -- just discard the incoming pong frame[m
[31m-    [m
[31m-        else[m
[31m-            ngx.log(ngx.INFO, "received a frame of type ", typ, " and payload ", data)[m
[31m-        end[m
[31m-    [m
[31m-        wb:set_timeout(1000)  -- change the network timeout to 1 second[m
[31m-    [m
[31m-        bytes, err = wb:send_text("Hello world")[m
[31m-        if not bytes then[m
[31m-            ngx.log(ngx.ERR, "failed to send a text frame: ", err)[m
[31m-            return ngx.exit(444)[m
[31m-        end[m
[31m-    [m
[31m-        bytes, err = wb:send_binary("blah blah blah...")[m
[31m-        if not bytes then[m
[31m-            ngx.log(ngx.ERR, "failed to send a binary frame: ", err)[m
[31m-            return ngx.exit(444)[m
[31m-        end[m
[31m-    [m
[31m-        local bytes, err = wb:send_close(1000, "enough, enough!")[m
[31m-        if not bytes then[m
[31m-            ngx.log(ngx.ERR, "failed to send the close frame: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Modules[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.websocket.server[m
[31m-[m
[31m-To load this module, just do this[m
[31m-[m
[31m-[m
[31m-        local server = require "resty.websocket.server"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head3 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 new[m
[31m-[m
[31m-C<syntax: wb, err = server:new()>[m
[31m-[m
[31m-C<syntax: wb, err = server:new(opts)>[m
[31m-[m
[31m-Performs the websocket handshake process on the server side and returns a WebSocket server object.[m
[31m-[m
[31m-In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-An optional options table can be specified. The following options are as follows:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max_payload_len>[m
[31m-[m
[31m-Specifies the maximal length of payload allowed when sending and receiving WebSocket frames.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<send_masked>[m
[31m-[m
[31m-Specifies whether to send out masked WebSocket frames. When it is C<true>, masked frames are always sent. Default to C<false>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timeout>[m
[31m-[m
[31m-Specifies the network timeout threshold in milliseconds. You can change this setting later via the C<set_timeout> method call. Note that this timeout setting does not affect the HTTP response header sending process for the websocket handshake; you need to configure the L<send_timeout|http://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout> directive at the same time.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 set_timeout[m
[31m-[m
[31m-C<syntax: wb:set_timeout(ms)>[m
[31m-[m
[31m-Sets the timeout delay (in milliseconds) for the network-related operations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_text[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_text(text)>[m
[31m-[m
[31m-Sends the C<text> argument out as an unfragmented data frame of the C<text> type. Returns the number of bytes that have actually been sent on the TCP level.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_binary[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_binary(data)>[m
[31m-[m
[31m-Sends the C<data> argument out as an unfragmented data frame of the C<binary> type. Returns the number of bytes that have actually been sent on the TCP level.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_ping[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_ping()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_ping(msg)>[m
[31m-[m
[31m-Sends out a C<ping> frame with an optional message specified by the C<msg> argument. Returns the number of bytes that have actually been sent on the TCP level.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-Note that this method does not wait for a pong frame from the remote end.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_pong[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_pong()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_pong(msg)>[m
[31m-[m
[31m-Sends out a C<pong> frame with an optional message specified by the C<msg> argument. Returns the number of bytes that have actually been sent on the TCP level.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_close[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_close()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_close(code, msg)>[m
[31m-[m
[31m-Sends out a C<close> frame with an optional status code and a message.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-For a list of valid status code, see the following document:[m
[31m-[m
[31m-http://tools.ietf.org/html/rfc6455#section-7.4.1[m
[31m-[m
[31m-Note that this method does not wait for a C<close> frame from the remote end.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_frame[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_frame(fin, opcode, payload)>[m
[31m-[m
[31m-Sends out a raw websocket frame by specifying the C<fin> field (boolean value), the opcode, and the payload.[m
[31m-[m
[31m-For a list of valid opcode, see[m
[31m-[m
[31m-http://tools.ietf.org/html/rfc6455#section-5.2[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-To control the maximal payload length allowed, you can pass the C<max_payload_len> option to the C<new> constructor.[m
[31m-[m
[31m-To control whether to send masked frames, you can pass C<true> to the C<send_masked> option in the C<new> constructor method. By default, unmasked frames are sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 recv_frame[m
[31m-[m
[31m-C<syntax: data, typ, err = wb:recv_frame()>[m
[31m-[m
[31m-Receives a WebSocket frame from the wire.[m
[31m-[m
[31m-In case of an error, returns two C<nil> values and a string describing the error.[m
[31m-[m
[31m-The second return value is always the frame type, which could be one of C<continuation>, C<text>, C<binary>, C<close>, C<ping>, C<pong>, or C<nil> (for unknown types).[m
[31m-[m
[31m-For C<close> frames, returns 3 values: the extra status message (which could be an empty string), the string "close", and a Lua number for the status code (if any). For possible closing status codes, see[m
[31m-[m
[31m-http://tools.ietf.org/html/rfc6455#section-7.4.1[m
[31m-[m
[31m-For other types of frames, just returns the payload and the type.[m
[31m-[m
[31m-For fragmented frames, the C<err> return value is the Lua string "again".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.websocket.client[m
[31m-[m
[31m-To load this module, just do this[m
[31m-[m
[31m-[m
[31m-        local client = require "resty.websocket.client"[m
[31m-[m
[31m-A simple example to demonstrate the usage:[m
[31m-[m
[31m-[m
[31m-        local client = require "resty.websocket.client"[m
[31m-        local wb, err = client:new()[m
[31m-        local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-        local ok, err = wb:connect(uri)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: " .. err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local data, typ, err = wb:recv_frame()[m
[31m-        if not data then[m
[31m-            ngx.say("failed to receive the frame: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("received: ", data, " (", typ, "): ", err)[m
[31m-    [m
[31m-        local bytes, err = wb:send_text("copy: " .. data)[m
[31m-        if not bytes then[m
[31m-            ngx.say("failed to send frame: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local bytes, err = wb:send_close()[m
[31m-        if not bytes then[m
[31m-            ngx.say("failed to send frame: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head3 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:new[m
[31m-[m
[31m-C<syntax: wb, err = client:new()>[m
[31m-[m
[31m-C<syntax: wb, err = client:new(opts)>[m
[31m-[m
[31m-Instantiates a WebSocket client object.[m
[31m-[m
[31m-In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-An optional options table can be specified. The following options are as follows:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max_payload_len>[m
[31m-[m
[31m-Specifies the maximal length of payload allowed when sending and receiving WebSocket frames.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<send_unmasked>[m
[31m-[m
[31m-Specifies whether to send out an unmasked WebSocket frames. When it is C<true>, unmasked frames are always sent. Default to C<false>. RFC 6455 requires, however, that the client MUST send masked frames to the server, so never set this option to C<true> unless you know what you are doing.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timeout>[m
[31m-[m
[31m-Specifies the default network timeout threshold in milliseconds. You can change this setting later via the C<set_timeout> method call.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:connect[m
[31m-[m
[31m-C<< syntax: ok, err = wb:connect("ws://<host>:<port>/<path>") >>[m
[31m-[m
[31m-C<< syntax: ok, err = wb:connect("wss://<host>:<port>/<path>") >>[m
[31m-[m
[31m-C<< syntax: ok, err = wb:connect("ws://<host>:<port>/<path>", options) >>[m
[31m-[m
[31m-C<< syntax: ok, err = wb:connect("wss://<host>:<port>/<path>", options) >>[m
[31m-[m
[31m-Connects to the remote WebSocket service port and performs the websocket handshake process on the client side.[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method.[m
[31m-[m
[31m-An optional Lua table can be specified as the last argument to this method to specify various connect options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<protocols>[m
[31m-[m
[31m-Specifies all the subprotocols used for the current WebSocket session. It could be a Lua table holding all the subprotocol names or just a single Lua string.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<origin>[m
[31m-[m
[31m-Specifies the value of the C<Origin> request header.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pool>[m
[31m-[m
[31m-Specifies a custom name for the connection pool being used. If omitted, then the connection pool name will be generated from the string template C<< <host>:<port> >>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ssl_verify>[m
[31m-[m
[31m-Specifies whether to perform SSL certificate verfication during the[m
[31m-SSL handshake if the C<wss://> scheme is used.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The SSL connection mode (C<wss://>) requires at least ngx_lua 0.9.11 or OpenResty 1.7.4.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:close[m
[31m-[m
[31m-C<syntax: ok, err = wb:close()>[m
[31m-[m
[31m-Closes the current WebSocket connection. If no C<close> frame is sent yet, then the C<close> frame will be automatically sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:set_keepalive[m
[31m-[m
[31m-C<syntax: ok, err = wb:set_keepalive(max_idle_timeout, pool_size)>[m
[31m-[m
[31m-Puts the current Redis connection immediately into the ngx_lua cosocket connection pool.[m
[31m-[m
[31m-You can specify the max idle timeout (in ms) when the connection is in the pool and the maximal size of the pool every nginx worker process.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-Only call this method in the place you would have called the C<close> method instead. Calling this method will immediately turn the current redis object into the C<closed> state. Any subsequent operations other than C<connect()> on the current objet will return the C<closed> error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:set_timeout[m
[31m-[m
[31m-C<syntax: wb:set_timeout(ms)>[m
[31m-[m
[31m-Identical to the C<set_timeout> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_text[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_text(text)>[m
[31m-[m
[31m-Identical to the L<send_text> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_binary[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_binary(data)>[m
[31m-[m
[31m-Identical to the L<send_binary> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_ping[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_ping()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_ping(msg)>[m
[31m-[m
[31m-Identical to the L<send_ping> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_pong[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_pong()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_pong(msg)>[m
[31m-[m
[31m-Identical to the L<send_pong> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_close[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_close()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_close(code, msg)>[m
[31m-[m
[31m-Identical to the L<send_close> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_frame[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_frame(fin, opcode, payload)>[m
[31m-[m
[31m-Identical to the L<send_frame> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-To control whether to send unmasked frames, you can pass C<true> to the C<send_unmasked> option in the C<new> constructor method. By default, masked frames are sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:recv_frame[m
[31m-[m
[31m-C<syntax: data, typ, err = wb:recv_frame()>[m
[31m-[m
[31m-Identical to the L<recv_frame> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.websocket.protocol[m
[31m-[m
[31m-To load this module, just do this[m
[31m-[m
[31m-[m
[31m-        local protocol = require "resty.websocket.protocol"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head3 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 recv_frame[m
[31m-[m
[31m-C<syntax: data, typ, err = protocol.recv_frame(socket, max_payload_len, force_masking)>[m
[31m-[m
[31m-Receives a WebSocket frame from the wire.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 build_frame[m
[31m-[m
[31m-C<syntax: frame = protocol.build_frame(fin, opcode, payload_len, payload, masking)>[m
[31m-[m
[31m-Builds a raw WebSocket frame.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_frame[m
[31m-[m
[31m-C<syntax: bytes, err = protocol.send_frame(socket, fin, opcode, payload, max_payload_len, masking)>[m
[31m-[m
[31m-Sends a raw WebSocket frame.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like init_by_luaI<, set_by_lua>, log_by_lua*, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.websocket> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.websocket> instance.[m
[31m-You should always initiate C<resty.websocket> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is recommended to use the latest L<ngx_openresty bundle|http://openresty.org> directly where this library[m
[31m-is bundled and enabled by default. At least ngx_openresty 1.4.2.9 is required. And you need to enable LuaJIT when building your ngx_openresty[m
[31m-bundle by passing the C<--with-luajit> option to its C<./configure> script. No extra Nginx configuration is required.[m
[31m-[m
[31m-If you want to use this library with your own Nginx build (with ngx_lua), then[m
[31m-you need to ensure you are using at least ngx_lua 0.9.0[m
[31m-(and L<lua-bitop|http://bitop.luajit.org/> library if you are not using LuaJIT).[m
[31m-Also, You need to configure the[m
[31m-L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path>[m
[31m-directive to add the path of your lua-resty-websocket source tree to ngx_lua's[m
[31m-Lua module search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-websocket/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-and then load the library in Lua:[m
[31m-[m
[31m-[m
[31m-        local server = require "resty.websocket.server"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/agentzh/lua-resty-websocket/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community|http://wiki.nginx.org/HttpLuaModule#Community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2013-2014, by Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Blog post L<WebSockets with OpenResty|https://medium.com/p/1778601c9e05> by Aapo Talvensaari.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the websocket protocol: http://tools.ietf.org/html/rfc6455[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-upload|https://github.com/agentzh/lua-resty-upload> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/memc-nginx-module-0.17/memc-nginx-module-0.17.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/memc-nginx-module-0.17/memc-nginx-module-0.17.pod[m
[1mdeleted file mode 100644[m
[1mindex 029fd67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/memc-nginx-module-0.17/memc-nginx-module-0.17.pod[m
[1m+++ /dev/null[m
[36m@@ -1,844 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-B<ngx_memc> - An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands.[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This document describes ngx_memc L<v0.17|http://github.com/openresty/memc-nginx-module/tags> released on 15 May 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     # GET /foo?key=dog[m
[31m-     #[m
[31m-     # POST /foo?key=cat[m
[31m-     # Cat's value...[m
[31m-     #[m
[31m-     # PUT /foo?key=bird[m
[31m-     # Bird's value...[m
[31m-     #[m
[31m-     # DELETE /foo?key=Tiger[m
[31m-     location /foo {[m
[31m-         set $memc_key $arg_key;[m
[31m-    [m
[31m-         # $memc_cmd defaults to get for GET,[m
[31m-         #   add for POST, set for PUT, and[m
[31m-         #   delete for the DELETE request method.[m
[31m-    [m
[31m-         memc_pass 127.0.0.1:11211;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     # GET /bar?cmd=get&key=cat[m
[31m-     #[m
[31m-     # POST /bar?cmd=set&key=dog[m
[31m-     # My value for the "dog" key...[m
[31m-     #[m
[31m-     # DELETE /bar?cmd=delete&key=dog[m
[31m-     # GET /bar?cmd=delete&key=dog[m
[31m-     location /bar {[m
[31m-         set $memc_cmd $arg_cmd;[m
[31m-         set $memc_key $arg_key;[m
[31m-         set $memc_flags $arg_flags; # defaults to 0[m
[31m-         set $memc_exptime $arg_exptime; # defaults to 0[m
[31m-    [m
[31m-         memc_pass 127.0.0.1:11211;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     # GET /bar?cmd=get&key=cat[m
[31m-     # GET /bar?cmd=set&key=dog&val=animal&flags=1234&exptime=2[m
[31m-     # GET /bar?cmd=delete&key=dog[m
[31m-     # GET /bar?cmd=flush_all[m
[31m-     location /bar {[m
[31m-         set $memc_cmd $arg_cmd;[m
[31m-         set $memc_key $arg_key;[m
[31m-         set $memc_value $arg_val;[m
[31m-         set $memc_flags $arg_flags; # defaults to 0[m
[31m-         set $memc_exptime $arg_exptime; # defaults to 0[m
[31m-    [m
[31m-         memc_cmds_allowed get set add delete flush_all;[m
[31m-    [m
[31m-         memc_pass 127.0.0.1:11211;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-       http {[m
[31m-         ...[m
[31m-         upstream backend {[m
[31m-            server 127.0.0.1:11984;[m
[31m-            server 127.0.0.1:11985;[m
[31m-         }[m
[31m-         server {[m
[31m-             location /stats {[m
[31m-                 set $memc_cmd stats;[m
[31m-                 memc_pass backend;[m
[31m-             }[m
[31m-             ...[m
[31m-         }[m
[31m-       }[m
[31m-       ...[m
[31m-[m
[31m-[m
[31m-     # read the memcached flags into the Last-Modified header[m
[31m-     # to respond 304 to conditional GET[m
[31m-     location /memc {[m
[31m-         set $memc_key $arg_key;[m
[31m-    [m
[31m-         memc_pass 127.0.0.1:11984;[m
[31m-    [m
[31m-         memc_flags_to_last_modified on;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     location /memc {[m
[31m-         set $memc_key foo;[m
[31m-         set $memc_cmd get;[m
[31m-    [m
[31m-         # access the unix domain socket listend by memcached[m
[31m-         memc_pass unix:/tmp/memcached.sock;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module extends the standard L<memcached module|http://nginx.org/en/docs/http/ngx_http_memcached_module.html> to support almost the whole L<memcached ascii protocol|http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt>.[m
[31m-[m
[31m-It allows you to define a custom L<REST|http://en.wikipedia.org/wiki/REST> interface to your memcached servers or access memcached in a very efficient way from within the nginx server by means of subrequests or L<independent fake requests|http://github.com/srlindsay/nginx-independent-subrequest>.[m
[31m-[m
[31m-This module is not supposed to be merged into the Nginx core because I've used L<Ragel|http://www.complang.org/ragel/> to generate the memcached response parsers (in C) for joy :)[m
[31m-[m
[31m-If you are going to use this module to cache location responses out of the box, try L<srcache-nginx-module|http://github.com/openresty/srcache-nginx-module> with this module to achieve that.[m
[31m-[m
[31m-When used in conjunction with L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>, it is recommended to use the L<lua-resty-memcached|http://github.com/openresty/lua-resty-memcached> library instead of this module though, because the former is much more flexible and memory-efficient.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Keep-alive connections to memcached servers[m
[31m-[m
[31m-You need L<HttpUpstreamKeepaliveModule|http://wiki.nginx.org/HttpUpstreamKeepaliveModule> together with this module for keep-alive TCP connections to your backend memcached servers.[m
[31m-[m
[31m-Here's a sample configuration:[m
[31m-[m
[31m-[m
[31m-       http {[m
[31m-         upstream backend {[m
[31m-           server 127.0.0.1:11211;[m
[31m-    [m
[31m-           # a pool with at most 1024 connections[m
[31m-           # and do not distinguish the servers:[m
[31m-           keepalive 1024;[m
[31m-         }[m
[31m-    [m
[31m-         server {[m
[31m-             ...[m
[31m-             location /memc {[m
[31m-                 set $memc_cmd get;[m
[31m-                 set $memc_key $arg_key;[m
[31m-                 memc_pass backend;[m
[31m-             }[m
[31m-         }[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 How it works[m
[31m-[m
[31m-It implements the memcached TCP protocol all by itself, based upon the C<upstream> mechanism. Everything involving I/O is non-blocking.[m
[31m-[m
[31m-The module itself does not keep TCP connections to the upstream memcached servers across requests, just like other upstream modules. For a working solution, see section L<Keep-alive connections to memcached servers>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Memcached commands supported[m
[31m-[m
[31m-The memcached storage commands L<set>, L<add>, L<replace>, L<prepend>, and L<append> uses the C<$memc_key> as the key, C<$memc_exptime> as the expiration time (or delay) (defaults to 0), C<$memc_flags> as the flags (defaults to 0), to build the corresponding memcached queries.[m
[31m-[m
[31m-If C<$memc_value> is not defined at all, then the request body will be used as the value of the C<$memc_value> except for the L<incr> and L<decr> commands. Note that if C<$memc_value> is defined as an empty string (C<"">), that empty string will still be used as the value as is.[m
[31m-[m
[31m-The following memcached commands have been implemented and tested (with their parameters marked by corresponding[m
[31m-nginx variables defined by this module):[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get $memc_key[m
[31m-[m
[31m-Retrieves the value using a key.[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd 'get';[m
[31m-           set $memc_key 'my_key';[m
[31m-    [m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-    [m
[31m-           add_header X-Memc-Flags $memc_flags;[m
[31m-       }[m
[31m-[m
[31m-Returns C<200 OK> with the value put into the response body if the key is found, or C<404 Not Found> otherwise. The C<flags> number will be set into the C<$memc_flags> variable so it's often desired to put that info into the response headers by means of the standard L<add_header directive|http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header>.[m
[31m-[m
[31m-It returns C<502> for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-To use the request body as the memcached value, just avoid setting the C<$memc_value> variable:[m
[31m-[m
[31m-[m
[31m-       # POST /foo[m
[31m-       # my value...[m
[31m-       location /foo {[m
[31m-           set $memc_cmd 'set';[m
[31m-           set $memc_key 'my_key';[m
[31m-           set $memc_flags 12345;[m
[31m-           set $memc_exptime 24;[m
[31m-    [m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Or let the C<$memc_value> hold the value:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd 'set';[m
[31m-           set $memc_key 'my_key';[m
[31m-           set $memc_flags 12345;[m
[31m-           set $memc_exptime 24;[m
[31m-           set $memc_value 'my_value';[m
[31m-    [m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Returns C<201 Created> if the upstream memcached server replies C<STORED>, C<200> for C<NOT_STORED>, C<404> for C<NOT_FOUND>, C<502> for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-The original memcached responses are returned as the response body except for C<404 NOT FOUND>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 add $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-Similar to the L<set command>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 replace $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-Similar to the L<set command>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 append $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-Similar to the L<set command>.[m
[31m-[m
[31m-Note that at least memcached version 1.2.2 does not support the "append" and "prepend" commands. At least 1.2.4 and later versions seem to supports these two commands.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 prepend $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-Similar to the L<append command>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 delete $memc_key[m
[31m-[m
[31m-Deletes the memcached entry using a key.[m
[31m-[m
[31m-[m
[31m-       location /foo[m
[31m-           set $memc_cmd delete;[m
[31m-           set $memc_key my_key;[m
[31m-    [m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Returns C<200 OK> if deleted successfully, C<404 Not Found> for C<NOT_FOUND>, or C<502> for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-The original memcached responses are returned as the response body except for C<404 NOT FOUND>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 delete $memc_key $memc_exptime[m
[31m-[m
[31m-Similar to the L<delete $memc_key> command except it accepts an optional C<expiration> time specified by the C<$memc_exptime> variable.[m
[31m-[m
[31m-This command is no longer available in the latest memcached version 1.4.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 incr $memc_key $memc_value[m
[31m-[m
[31m-Increments the existing value of C<$memc_key> by the amount specified by C<$memc_value>:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_key my_key;[m
[31m-           set $memc_value 2;[m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-In the preceding example, every time we access C</foo> will cause the value of C<my_key> increments by C<2>.[m
[31m-[m
[31m-Returns C<200 OK> with the new value associated with that key as the response body if successful, or C<404 Not Found> if the key is not found.[m
[31m-[m
[31m-It returns C<502> for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 decr $memc_key $memc_value[m
[31m-[m
[31m-Similar to L<incr $memc_key $memc_value>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 flush_all[m
[31m-[m
[31m-Mark all the keys on the memcached server as expired:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd flush_all;[m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 flush_all $memc_exptime[m
[31m-[m
[31m-Just like L<flush_all> but also accepts an expiration time specified by the C<$memc_exptime> variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 stats[m
[31m-[m
[31m-Causes the memcached server to output general-purpose statistics and settings[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd stats;[m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Returns C<200 OK> if the request succeeds, or 502 for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-The raw C<stats> command output from the upstream memcached server will be put into the response body. [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 version[m
[31m-[m
[31m-Queries the memcached server's version number:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd version;[m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Returns C<200 OK> if the request succeeds, or 502 for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-The raw C<version> command output from the upstream memcached server will be put into the response body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-All the standard L<memcached module|http://nginx.org/en/docs/http/ngx_http_memcached_module.html> directives in nginx 0.8.28 are directly inherited, with the C<memcached_> prefixes replaced by C<memc_>. For example, the C<memcached_pass> directive is spelled C<memc_pass>.[m
[31m-[m
[31m-Here we only document the most important two directives (the latter is a new directive introduced by this module).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_pass[m
[31m-[m
[31m-B<syntax:> I<memc_pass E<lt>memcached server IP addressE<gt>:E<lt>memcached server portE<gt>>[m
[31m-[m
[31m-B<syntax:> I<memc_pass E<lt>memcached server hostnameE<gt>:E<lt>memcached server portE<gt>>[m
[31m-[m
[31m-B<syntax:> I<memc_pass E<lt>upstream_backend_nameE<gt>>[m
[31m-[m
[31m-B<syntax:> I<memc_pass unix:E<lt>path_to_unix_domain_socketE<gt>>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<context:> I<http, server, location, if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Specify the memcached server backend.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_cmds_allowed[m
[31m-[m
[31m-B<syntax:> I<memc_cmds_allowed E<lt>cmdE<gt>...>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<context:> I<http, server, location, if>[m
[31m-[m
[31m-Lists memcached commands that are allowed to access. By default, all the memcached commands supported by this module are accessible.[m
[31m-An example is[m
[31m-[m
[31m-[m
[31m-        location /foo {[m
[31m-            set $memc_cmd $arg_cmd;[m
[31m-            set $memc_key $arg_key;[m
[31m-            set $memc_value $arg_val;[m
[31m-    [m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-    [m
[31m-            memc_cmds_allowed get;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_flags_to_last_modified[m
[31m-[m
[31m-B<syntax:> I<memc_flags_to_last_modified on|off>[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-B<context:> I<http, server, location, if>[m
[31m-[m
[31m-Read the memcached flags as epoch seconds and set it as the value of the C<Last-Modified> header. For conditional GET, it will signal nginx to return C<304 Not Modified> response to save bandwidth.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_connect_timeout[m
[31m-[m
[31m-B<syntax:> I<memc_connect_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for connecting to the memcached server, in seconds by default.[m
[31m-[m
[31m-It's wise to always explicitly specify the time unit to avoid confusion. Time units supported are "s"(seconds), "ms"(milliseconds), "y"(years), "M"(months), "w"(weeks), "d"(days), "h"(hours), and "m"(minutes).[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_send_timeout[m
[31m-[m
[31m-B<syntax:> I<memc_send_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for sending TCP requests to the memcached server, in seconds by default.[m
[31m-[m
[31m-It is wise to always explicitly specify the time unit to avoid confusion. Time units supported are "s"(seconds), "ms"(milliseconds), "y"(years), "M"(months), "w"(weeks), "d"(days), "h"(hours), and "m"(minutes).[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_read_timeout[m
[31m-[m
[31m-B<syntax:> I<memc_read_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for reading TCP responses from the memcached server, in seconds by default.[m
[31m-[m
[31m-It's wise to always explicitly specify the time unit to avoid confusion. Time units supported are "s"(seconds), "ms"(milliseconds), "y"(years), "M"(months), "w"(weeks), "d"(days), "h"(hours), and "m"(minutes).[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_buffer_size[m
[31m-[m
[31m-B<syntax:> I<memc_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This buffer size is used for the memory buffer to hold[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the complete response for memcached commands other than C<get>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the complete response header (i.e., the first line of the response) for the C<get> memcached command.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This default size is the page size, may be C<4k> or C<8k>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_ignore_client_abort[m
[31m-[m
[31m-B<syntax:> I<memc_ignore_client_abort on|off>[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-Determines whether the connection with a memcache server should be closed when a client closes a connection without waiting for a response.[m
[31m-[m
[31m-This directive was first added in the C<v0.14> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<OpenResty bundle|http://openresty.org>. See the L<installation steps|http://openresty.org/#Installation> for C<OpenResty>.[m
[31m-[m
[31m-Alternatively, you can compile this module into the standard Nginx source distribution by hand:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.15 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/memc-nginx-module[m
[31m-    [m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<memc-nginx-module file list|http://github.com/openresty/memc-nginx-module/tags>.[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_memc_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 For Developers[m
[31m-[m
[31m-The memached response parsers were generated by L<Ragel|http://www.complang.org/ragel/>. If you want to[m
[31m-regenerate the parser's C file, i.e., L<srcE<sol>ngx_http_memc_response.c|http://github.com/openresty/memc-nginx-module/blob/master/src/ngx_http_memc_response.c>, use the following command from the root of the memc module's source tree:[m
[31m-[m
[31m-[m
[31m-     $ ragel -G2 src/ngx_http_memc_response.rl[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x>                       (last tested: 1.9.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x>                       (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>                       (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x>                       (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x>                       (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x>                       (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x>                       (last tested: 1.0.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x>                       (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x>                       (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.46>             (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-It's worth mentioning that some 0.7.x versions older than 0.7.46 might also work, but I can't easily test them because the test suite makes extensive use of the L<echo module|http://github.com/openresty/echo-nginx-module>'s L<echo_location directive|http://github.com/openresty/echo-nginx-module#echo_location>, which requires at least nginx 0.7.46 :)[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.46 does not work with this module, please consider L<reporting a bug>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-create a ticket on the L<issue tracking interface|http://github.com/openresty/memc-nginx-module/issues> provided by GitHub,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or send a bug report or even patches to the L<nginx mailing list|http://mailman.nginx.org/mailman/listinfo/nginx>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>memc-nginx-module|http://github.com/openresty/memc-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|http://github.com/openresty/memc-nginx-module/tree/master/t/> are[m
[31m-L<declarative|http://github.com/openresty/memc-nginx-module/blob/master/t/storage.t> too. Thanks to the L<Test::Base|http://search.cpan.org/perldoc?Test::Base> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-memc-module:$PATH prove -r t[m
[31m-[m
[31m-You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary.[m
[31m-[m
[31m-Either L<LWP::UserAgent|http://search.cpan.org/perldoc?LWP::UserAgent> or L<IO::Socket|http://search.cpan.org/perldoc?IO::Socket> is used by the L<test scaffold|http://github.com/openresty/memc-nginx-module/blob/master/test/lib/Test/Nginx/LWP.pm>.[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-You should also keep a memcached server listening on the C<11211> port at localhost before running the test suite.[m
[31m-[m
[31m-Some parts of the test suite requires modules L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html> and L<echo|http://github.com/openresty/echo-nginx-module> to be enabled as well when building Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add support for the memcached commands C<cas>, C<gets> and C<stats $memc_value>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add support for the C<noreply> option.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the L<author> or just ask for a commit bit to the L<source repository> on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) I<E<lt>agentzh@gmail.comE<gt>>, CloudFlare Inc.[m
[31m-[m
[31m-This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-The code base is borrowed directly from the standard L<memcached module|http://nginx.org/en/docs/http/ngx_http_memcached_module.html> in the Nginx core. This part of code is copyrighted by Igor Sysoev and Nginx Inc.[m
[31m-[m
[31m-Copyright (c) 2009-2016, Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original announcement email on the nginx mailing list: L<ngx_memc: "an extended version of ngx_memcached that supports set, add, delete, and many more commands"|http://forum.nginx.org/read.php?2,28359>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-My slides demonstrating various ngx_memc usage: E<lt>http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#34E<gt> (use the arrow or pageup/pagedown keys on the keyboard to swith pages)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The latest L<memcached TCP protocol|http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<ngx_srcache|http://github.com/openresty/srcache-nginx-module> module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<lua-resty-memcached|https://github.com/openresty/lua-resty-memcached> library based on the L<lua-nginx-module|http://github.com/openresty/lua-nginx-module> cosocket API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<memcached|http://nginx.org/en/docs/http/ngx_http_memcached_module.html> module.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<echo module|http://github.com/openresty/echo-nginx-module> for Nginx module's automated testing.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module and the 3rd-parth L<headers-more|http://github.com/openresty/headers-more-nginx-module> module.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/accept_failed.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/accept_failed.pod[m
[1mdeleted file mode 100644[m
[1mindex 1dfab32..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/accept_failed.pod[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-accept_failed[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-What does the following error mean in the log file: "accept() failed (53:[m
[31m-Software caused connection abort) while accepting new[m
[31m-connection on 0.0.0.0:80"?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-Such errors stem from the connections that the clients managed[m
[31m-to close before nginx was able to process them. For instance, this can[m
[31m-happen in a situation when the user didn’t wait for a page[m
[31m-heavily populated with images to load fully, and clicked on a[m
[31m-different link. In this case user’s browser would close all of[m
[31m-the prior connections which aren’t longer necessary.[m
[31m-It is a non-critical error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/beginners_guide.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/beginners_guide.pod[m
[1mdeleted file mode 100644[m
[1mindex 3393538..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/beginners_guide.pod[m
[1m+++ /dev/null[m
[36m@@ -1,563 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-beginners_guide - Beginner’s Guide[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-This guide gives a basic introduction to nginx and describes some[m
[31m-simple tasks that can be done with it.[m
[31m-It is supposed that nginx is already installed on the reader’s machine.[m
[31m-If it is not, see the L<install> page.[m
[31m-This guide describes how to start and stop nginx, and reload its[m
[31m-configuration, explains the structure[m
[31m-of the configuration file and describes how to set up nginx[m
[31m-to serve out static content, how to configure nginx as a proxy[m
[31m-server, and how to connect it with a FastCGI application.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx has one master process and several worker processes.[m
[31m-The main purpose of the master process is to read and evaluate configuration,[m
[31m-and maintain worker processes.[m
[31m-Worker processes do actual processing of requests.[m
[31m-nginx employs event-based model and OS-dependent mechanisms to efficiently[m
[31m-distribute requests among worker processes.[m
[31m-The number of worker processes is defined in the configuration file and[m
[31m-may be fixed for a given configuration or automatically adjusted to the[m
[31m-number of available CPU cores (see[m
[31m-L<ngx_core_module>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The way nginx and its modules work is determined in the configuration file.[m
[31m-By default, the configuration file is named F<nginx.conf>[m
[31m-and placed in the directory[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>conf>,[m
[31m-F<E<sol>etcE<sol>nginx>, or[m
[31m-F<E<sol>usrE<sol>localE<sol>etcE<sol>nginx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Starting, Stopping, and Reloading Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-To start nginx, run the executable file.[m
[31m-Once nginx is started, it can be controlled by invoking the executable[m
[31m-with the C<-s> parameter.[m
[31m-Use the following syntax:[m
[31m-[m
[31m-    [m
[31m-    nginx -s <i>signal</i>[m
[31m-[m
[31m-[m
[31m-Where I<signal> may be one of the following:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<stop>E<mdash>fast shutdown[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<quit>E<mdash>graceful shutdown[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<reload>E<mdash>reloading the configuration file[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<reopen>E<mdash>reopening the log files[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-For example, to stop nginx processes with waiting for the worker processes[m
[31m-to finish serving current requests, the following command can be executed:[m
[31m-[m
[31m-    [m
[31m-    nginx -s quit[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-This command should be executed under the same user that[m
[31m-started nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Changes made in the configuration file[m
[31m-will not be applied until the command to reload configuration is[m
[31m-sent to nginx or it is restarted.[m
[31m-To reload configuration, execute:[m
[31m-[m
[31m-    [m
[31m-    nginx -s reload[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Once the master process receives the signal to reload configuration,[m
[31m-it checks the syntax validity[m
[31m-of the new configuration file and tries to apply the configuration provided[m
[31m-in it.[m
[31m-If this is a success, the master process starts new worker processes[m
[31m-and sends messages to old worker processes, requesting them to[m
[31m-shut down.[m
[31m-Otherwise, the master process rolls back the changes and[m
[31m-continues to work with the old configuration.[m
[31m-Old worker processes, receiving a command to shut down,[m
[31m-stop accepting new connections and continue to service current requests until[m
[31m-all such requests are serviced.[m
[31m-After that, the old worker processes exit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A signal may also be sent to nginx processes with the help of Unix tools[m
[31m-such as the C<kill> utility.[m
[31m-In this case a signal is sent directly to a process with a given process ID.[m
[31m-The process ID of the nginx master process is written, by default, to the[m
[31m-F<nginx.pid> in the directory[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>logs> or[m
[31m-F<E<sol>varE<sol>run>.[m
[31m-For example, if the master process ID is 1628, to send the QUIT signal[m
[31m-resulting in nginx’s graceful shutdown, execute:[m
[31m-[m
[31m-    [m
[31m-    kill -s QUIT 1628[m
[31m-[m
[31m-[m
[31m-For getting the list of all running nginx processes, the C<ps>[m
[31m-utility may be used, for example, in the following way:[m
[31m-[m
[31m-    [m
[31m-    ps -ax | grep nginx[m
[31m-[m
[31m-[m
[31m-For more information on sending signals to nginx, see[m
[31m-L<control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Configuration File’s Structure[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx consists of modules which are controlled by directives specified[m
[31m-in the configuration file.[m
[31m-Directives are divided into simple directives and block directives.[m
[31m-A simple directive consists of the name and parameters separated by spaces[m
[31m-and ends with a semicolon (C<;>).[m
[31m-A block directive has the same structure as a simple directive, but[m
[31m-instead of the semicolon it ends with a set of additional instructions[m
[31m-surrounded by braces (C<{> and C<}>).[m
[31m-If a block directive can have other directives inside braces,[m
[31m-it is called a context (examples:[m
[31m-L<ngx_core_module>,[m
[31m-L<ngx_http_core_module>,[m
[31m-L<ngx_http_core_module>,[m
[31m-and[m
[31m-L<ngx_http_core_module>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Directives placed in the configuration file outside[m
[31m-of any contexts are considered to be in the[m
[31m-L<main|ngx_core_module> context.[m
[31m-The C<events> and C<http> directives[m
[31m-reside in the C<main> context, C<server>[m
[31m-in C<http>, and C<location> in[m
[31m-C<server>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The rest of a line after the C<#> sign is considered a comment.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Serving Static Content[m
[31m-[m
[31m-[m
[31m-[m
[31m-An important web server task is serving out[m
[31m-files (such as images or static HTML pages).[m
[31m-You will implement an example where, depending on the request,[m
[31m-files will be served from different local directories: F<E<sol>dataE<sol>www>[m
[31m-(which may contain HTML files) and F<E<sol>dataE<sol>images>[m
[31m-(containing images).[m
[31m-This will require editing of the configuration file and setting up of a[m
[31m-L<ngx_http_core_module>[m
[31m-block inside the L<ngx_http_core_module>[m
[31m-block with two L<ngx_http_core_module>[m
[31m-blocks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-First, create the F<E<sol>dataE<sol>www> directory and put an[m
[31m-F<index.html> file with any text content into it and[m
[31m-create the F<E<sol>dataE<sol>images> directory and place some[m
[31m-images in it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Next, open the configuration file.[m
[31m-The default configuration file already includes several examples of[m
[31m-the C<server> block, mostly commented out.[m
[31m-For now comment out all such blocks and start a new[m
[31m-C<server> block:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        server {[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Generally, the configuration file may include several[m
[31m-C<server> blocks[m
[31m-L<distinguished|request_processing> by ports on which[m
[31m-they L<listen|ngx_http_core_module> to[m
[31m-and by[m
[31m-L<server names|server_names>.[m
[31m-Once nginx decides which C<server> processes a request,[m
[31m-it tests the URI specified in the request’s header against the parameters of the[m
[31m-C<location> directives defined inside the[m
[31m-C<server> block.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Add the following C<location> block to the[m
[31m-C<server> block:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        root /data/www;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This C<location> block specifies the[m
[31m-“F<E<sol>>” prefix compared with the URI from the request.[m
[31m-For matching requests, the URI will be added to the path specified in the[m
[31m-L<ngx_http_core_module>[m
[31m-directive, that is, to F<E<sol>dataE<sol>www>,[m
[31m-to form the path to the requested file on the local file system.[m
[31m-If there are several matching C<location> blocks nginx[m
[31m-selects the one with the longest prefix.[m
[31m-The C<location> block above provides the shortest[m
[31m-prefix, of length one,[m
[31m-and so only if all other C<location>[m
[31m-blocks fail to provide a match, this block will be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Next, add the second C<location> block:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root /data;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-It will be a match for requests starting with C<E<sol>imagesE<sol>>[m
[31m-(C<location E<sol>> also matches such requests,[m
[31m-but has shorter prefix).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The resulting configuration of the C<server> block should[m
[31m-look like this:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            root /data/www;[m
[31m-        }[m
[31m-    [m
[31m-        location /images/ {[m
[31m-            root /data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This is already a working configuration of a server that listens[m
[31m-on the standard port 80 and is accessible on the local machine at[m
[31m-C<http:E<sol>E<sol>localhostE<sol>>.[m
[31m-In response to requests with URIs starting with C<E<sol>imagesE<sol>>,[m
[31m-the server will send files from the F<E<sol>dataE<sol>images> directory.[m
[31m-For example, in response to the[m
[31m-C<http:E<sol>E<sol>localhostE<sol>imagesE<sol>example.png> request nginx will[m
[31m-send the F<E<sol>dataE<sol>imagesE<sol>example.png> file.[m
[31m-If such file does not exist, nginx will send a response[m
[31m-indicating the 404 error.[m
[31m-Requests with URIs not starting with C<E<sol>imagesE<sol>> will be[m
[31m-mapped onto the F<E<sol>dataE<sol>www> directory.[m
[31m-For example, in response to the[m
[31m-C<http:E<sol>E<sol>localhostE<sol>someE<sol>example.html> request nginx will[m
[31m-send the F<E<sol>dataE<sol>wwwE<sol>someE<sol>example.html> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To apply the new configuration, start nginx if it is not yet started or[m
[31m-send the C<reload> signal to the nginx’s master process,[m
[31m-by executing:[m
[31m-[m
[31m-    [m
[31m-    nginx -s reload[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In case something does not work as expected, you may try to find out[m
[31m-the reason in F<access.log> and[m
[31m-F<error.log> files in the directory[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>logs> or[m
[31m-F<E<sol>varE<sol>logE<sol>nginx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Setting Up a Simple Proxy Server[m
[31m-[m
[31m-[m
[31m-[m
[31m-One of the frequent uses of nginx is setting it up as a proxy server, which[m
[31m-means a server that receives requests, passes them to the proxied servers,[m
[31m-retrieves responses from them, and sends them to the clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-We will configure a basic proxy server, which serves requests of[m
[31m-images with files from the local directory and sends all other requests to a[m
[31m-proxied server.[m
[31m-In this example, both servers will be defined on a single nginx instance.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-First, define the proxied server by adding one more C<server>[m
[31m-block to the nginx’s configuration file with the following contents:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen 8080;[m
[31m-        root /data/up1;[m
[31m-    [m
[31m-        location / {[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This will be a simple server that listens on the port 8080[m
[31m-(previously, the C<listen> directive has not been specified[m
[31m-since the standard port 80 was used) and maps[m
[31m-all requests to the F<E<sol>dataE<sol>up1> directory on the local[m
[31m-file system.[m
[31m-Create this directory and put the F<index.html> file into it.[m
[31m-Note that the C<root> directive is placed in the[m
[31m-C<server> context.[m
[31m-Such C<root> directive is used when the[m
[31m-C<location> block selected for serving a request does not[m
[31m-include own C<root> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Next, use the server configuration from the previous section[m
[31m-and modify it to make it a proxy server configuration.[m
[31m-In the first C<location> block, put the[m
[31m-L<ngx_http_proxy_module>[m
[31m-directive with the protocol, name and port of the proxied server specified[m
[31m-in the parameter (in our case, it is C<http:E<sol>E<sol>localhost:8080>):[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            proxy_pass http://localhost:8080;[m
[31m-        }[m
[31m-    [m
[31m-        location /images/ {[m
[31m-            root /data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-We will modify the second C<location>[m
[31m-block, which currently maps requests with the C<E<sol>imagesE<sol>>[m
[31m-prefix to the files under the F<E<sol>dataE<sol>images> directory,[m
[31m-to make it match the requests of images with typical file extensions.[m
[31m-The modified C<location> block looks like this:[m
[31m-[m
[31m-    [m
[31m-    location ~ \.(gif|jpg|png)$ {[m
[31m-        root /data/images;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The parameter is a regular expression matching all URIs ending[m
[31m-with F<.gif>, F<.jpg>, or F<.png>.[m
[31m-A regular expression should be preceded with C<~>.[m
[31m-The corresponding requests will be mapped to the F<E<sol>dataE<sol>images>[m
[31m-directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When nginx selects a C<location> block to serve a request[m
[31m-it first checks L<ngx_http_core_module>[m
[31m-directives that specify prefixes, remembering C<location>[m
[31m-with the longest prefix, and then checks regular expressions.[m
[31m-If there is a match with a regular expression, nginx picks this[m
[31m-C<location> or, otherwise, it picks the one remembered earlier.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The resulting configuration of a proxy server will look like this:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            proxy_pass http://localhost:8080/;[m
[31m-        }[m
[31m-    [m
[31m-        location ~ \.(gif|jpg|png)$ {[m
[31m-            root /data/images;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This server will filter requests ending with F<.gif>,[m
[31m-F<.jpg>, or F<.png>[m
[31m-and map them to the F<E<sol>dataE<sol>images> directory (by adding URI to the[m
[31m-C<root> directive’s parameter) and pass all other requests[m
[31m-to the proxied server configured above.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To apply new configuration, send the C<reload> signal to[m
[31m-nginx as described in the previous sections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There are many L<more|ngx_http_proxy_module>[m
[31m-directives that may be used to further configure a proxy connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Setting Up FastCGI Proxying[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx can be used to route requests to FastCGI servers which run[m
[31m-applications built with various frameworks and programming languages[m
[31m-such as PHP.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The most basic nginx configuration to work with a FastCGI server[m
[31m-includes using the[m
[31m-L<ngx_http_fastcgi_module>[m
[31m-directive instead of the C<proxy_pass> directive,[m
[31m-and L<ngx_http_fastcgi_module>[m
[31m-directives to set parameters passed to a FastCGI server.[m
[31m-Suppose the FastCGI server is accessible on C<localhost:9000>.[m
[31m-Taking the proxy configuration from the previous section as a basis,[m
[31m-replace the C<proxy_pass> directive with the[m
[31m-C<fastcgi_pass> directive and change the parameter to[m
[31m-C<localhost:9000>.[m
[31m-In PHP, the C<SCRIPT_FILENAME> parameter is used for[m
[31m-determining the script name, and the C<QUERY_STRING>[m
[31m-parameter is used to pass request parameters.[m
[31m-The resulting configuration would be:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            fastcgi_pass  localhost:9000;[m
[31m-            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;[m
[31m-            fastcgi_param QUERY_STRING    $query_string;[m
[31m-        }[m
[31m-    [m
[31m-        location ~ \.(gif|jpg|png)$ {[m
[31m-            root /data/images;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This will set up a server that will route all requests except for[m
[31m-requests for static images to the proxied server operating on[m
[31m-C<localhost:9000> through the FastCGI protocol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/chunked_encoding_from_backend.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/chunked_encoding_from_backend.pod[m
[1mdeleted file mode 100644[m
[1mindex e9738de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/chunked_encoding_from_backend.pod[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-chunked_encoding_from_backend[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-My backend server appears to send HTTPE<sol>1.0 responses using[m
[31m-chunked encoding but nginx doesn’t handle it correctly.[m
[31m-For instance, I’m using nginx as a frontend to my node.js[m
[31m-application and instead of pure JSON from backend, nginx[m
[31m-returns something framed in decimal numbers like[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    47[m
[31m-    {"error":"query error","message":"Parameter(s) missing: user,password"}[m
[31m-    0[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-Your backend violates HTTP specification (see[m
[31m-L<RFC 2616,[m
[31m-"3.6 Transfer Codings"|http://tools.ietf.org/html/rfc2616#section-3.6>).[m
[31m-The "chunked" transfer-codings must not be used with HTTPE<sol>1.0.[m
[31m-You’d need to either fix your backend application or upgrade[m
[31m-to nginx version 1.1.4 and newer, where an additional code[m
[31m-was introduced to handle such erratic backend behavior.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/configure.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/configure.pod[m
[1mdeleted file mode 100644[m
[1mindex 97781b6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/configure.pod[m
[1m+++ /dev/null[m
[36m@@ -1,350 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-configure - Building nginx from Sources[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The build is configured using the C<configure> command.[m
[31m-It defines various aspects of the system, including the methods nginx[m
[31m-is allowed to use for connection processing.[m
[31m-At the end it creates a F<Makefile>.[m
[31m-The C<configure> command supports the following parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--prefix=I<C<path>>>E<mdash>defines[m
[31m-a directory that will keep server files.[m
[31m-This same directory will also be used for all relative paths set by[m
[31m-C<configure> (except for paths to libraries sources)[m
[31m-and in the F<nginx.conf> configuration file.[m
[31m-It is set to the F<E<sol>usrE<sol>localE<sol>nginx> directory by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--sbin-path=I<C<path>>>E<mdash>sets[m
[31m-the name of an nginx executable file.[m
[31m-This name is used only during installation.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>sbinE<sol>nginx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--conf-path=I<C<path>>>E<mdash>sets[m
[31m-the name of an F<nginx.conf> configuration file.[m
[31m-If needs be, nginx can always be started with a different configuration file,[m
[31m-by specifying it in the command-line parameter[m
[31m-C<-c I<C<file>>>.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>confE<sol>nginx.conf>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--pid-path=I<C<path>>>E<mdash>sets[m
[31m-the name of an nginx.pid file that will store the process ID[m
[31m-of the main process.[m
[31m-After installation, the file name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_core_module> directive.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>logsE<sol>nginx.pid>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--error-log-path=I<C<path>>>E<mdash>sets[m
[31m-the name of the primary error, warnings, and diagnostic file.[m
[31m-After installation, the file name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_core_module> directive.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>logsE<sol>error.log>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--http-log-path=I<C<path>>>E<mdash>sets[m
[31m-the name of the primary request log file of the HTTP server.[m
[31m-After installation, the file name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_http_log_module> directive.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>logsE<sol>access.log>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--user=I<C<name>>>E<mdash>sets[m
[31m-the name of an unprivileged user whose credentials will be used[m
[31m-by worker processes.[m
[31m-After installation, the name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_core_module> directive.[m
[31m-The default user name is nobody.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--group=I<C<name>>>E<mdash>sets[m
[31m-the name of a group whose credentials will be used[m
[31m-by worker processes.[m
[31m-After installation, the name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_core_module> directive.[m
[31m-By default, a group name is set to the name of an unprivileged user.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-select_module>[m
[31m-[m
[31m-[m
[31m-C<--without-select_module>E<mdash>enables or disables[m
[31m-building a module that allows the server to work with the[m
[31m-C<select> method.[m
[31m-This module is built automatically if the platform does not appear[m
[31m-to support more appropriate methods such as kqueue, epoll, or E<sol>devE<sol>poll.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-poll_module>[m
[31m-[m
[31m-[m
[31m-C<--without-poll_module>E<mdash>enables or disables[m
[31m-building a module that allows the server to work with the[m
[31m-C<poll> method.[m
[31m-This module is built automatically if the platform does not appear[m
[31m-to support more appropriate methods such as kqueue, epoll, or E<sol>devE<sol>poll.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--without-http_gzip_module>E<mdash>disables building a module[m
[31m-that L<compresses responses|ngx_http_gzip_module>[m
[31m-of an HTTP server.[m
[31m-The zlib library is required to build and run this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--without-http_rewrite_module>E<mdash>disables building a[m
[31m-module that allows an HTTP server to[m
[31m-L<redirect requests and change URI[m
[31m-of requests|ngx_http_rewrite_module>.[m
[31m-The PCRE library is required to build and run this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--without-http_proxy_module>E<mdash>disables building an[m
[31m-HTTP server L<proxying module|ngx_http_proxy_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-http_ssl_module>E<mdash>enables building a module[m
[31m-that adds the L<HTTPS protocol[m
[31m-support|ngx_http_ssl_module> to an HTTP server.[m
[31m-This module is not built by default.[m
[31m-The OpenSSL library is required to build and run this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-pcre=I<C<path>>>E<mdash>sets[m
[31m-the path to the sources of the PCRE library.[m
[31m-The library distribution (version[m
[31m-4.4E<mdash>8.38) needs to be downloaded from the[m
[31m-L<PCRE|http://www.pcre.org> site and extracted.[m
[31m-The rest is done by nginx’s C<.E<sol>configure> and[m
[31m-C<make>.[m
[31m-The library is required for regular expressions support in the[m
[31m-L<ngx_http_core_module> directive[m
[31m-and for the[m
[31m-L<ngx_http_rewrite_module|ngx_http_rewrite_module>[m
[31m-module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-pcre-jit>E<mdash>builds the PCRE library with[m
[31m-“just-in-time compilation” support (1.1.12, the[m
[31m-L<ngx_core_module> directive).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-zlib=I<C<path>>>E<mdash>sets[m
[31m-the path to the sources of the zlib library.[m
[31m-The library distribution (version[m
[31m-1.1.3E<mdash>1.2.8) needs to be downloaded from the[m
[31m-L<zlib|http://zlib.net> site and extracted.[m
[31m-The rest is done by nginx’s C<.E<sol>configure> and[m
[31m-C<make>.[m
[31m-The library is required for the[m
[31m-L<ngx_http_gzip_module|ngx_http_gzip_module> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-cc-opt=I<C<parameters>>>E<mdash>sets[m
[31m-additional parameters that will be added to the CFLAGS variable.[m
[31m-When using the system PCRE library under FreeBSD,[m
[31m-C<--with-cc-opt="-I E<sol>usrE<sol>localE<sol>include">[m
[31m-should be specified.[m
[31m-If the number of files supported by C<select> needs to be[m
[31m-increased it can also be specified here such as this:[m
[31m-C<--with-cc-opt="-D FD_SETSIZE=2048">.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-ld-opt=I<C<parameters>>>E<mdash>sets[m
[31m-additional parameters that will be used during linking.[m
[31m-When using the system PCRE library under FreeBSD,[m
[31m-C<--with-ld-opt="-L E<sol>usrE<sol>localE<sol>lib">[m
[31m-should be specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example of parameters usage (all of this needs to be typed in one line):[m
[31m-[m
[31m-    [m
[31m-    ./configure[m
[31m-        --sbin-path=/usr/local/nginx/nginx[m
[31m-        --conf-path=/usr/local/nginx/nginx.conf[m
[31m-        --pid-path=/usr/local/nginx/nginx.pid[m
[31m-        --with-http_ssl_module[m
[31m-        --with-pcre=../pcre-8.38[m
[31m-        --with-zlib=../zlib-1.2.8[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-After configuration,[m
[31m-nginx is compiled and installed using C<make>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/configuring_https_servers.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/configuring_https_servers.pod[m
[1mdeleted file mode 100644[m
[1mindex 9c60a44..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/configuring_https_servers.pod[m
[1m+++ /dev/null[m
[36m@@ -1,610 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-configuring_https_servers - Configuring HTTPS servers[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-To configure an HTTPS server, the C<ssl> parameter[m
[31m-must be enabled on[m
[31m-L<listening sockets|ngx_http_core_module>[m
[31m-in the L<ngx_http_core_module> block,[m
[31m-and the locations of the server certificate[m
[31m-and private key files should be specified:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen              443 <b>ssl</b>;[m
[31m-        server_name         www.example.com;[m
[31m-        ssl_certificate     <b>www.example.com.crt</b>;[m
[31m-        ssl_certificate_key <b>www.example.com.key</b>;[m
[31m-        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-        ssl_ciphers         HIGH:!aNULL:!MD5;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-The server certificate is a public entity.[m
[31m-It is sent to every client that connects to the server.[m
[31m-The private key is a secure entity and should be stored in a file with[m
[31m-restricted access, however, it must be readable by nginx’s master process.[m
[31m-The private key may alternately be stored in the same file as the certificate:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-        ssl_certificate     www.example.com.cert;[m
[31m-        ssl_certificate_key www.example.com.cert;[m
[31m-[m
[31m-[m
[31m-[m
[31m-in which case the file access rights should also be restricted.[m
[31m-Although the certificate and the key are stored in one file,[m
[31m-only the certificate is sent to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directives L<ngx_http_ssl_module> and[m
[31m-L<ngx_http_ssl_module>[m
[31m-can be used to limit connections[m
[31m-to include only the strong versions and ciphers of SSLE<sol>TLS.[m
[31m-By default nginx uses[m
[31m-“C<ssl_protocols TLSv1 TLSv1.1 TLSv1.2>”[m
[31m-and “C<ssl_ciphers HIGH:!aNULL:!MD5>”,[m
[31m-so configuring them explicitly is generally not needed.[m
[31m-Note that default values of these directives were[m
[31m-changed several times.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 HTTPS server optimization[m
[31m-[m
[31m-[m
[31m-[m
[31m-SSL operations consume extra CPU resources.[m
[31m-On multi-processor systems several worker processes should be run,[m
[31m-no less than the number of available CPU cores.[m
[31m-The most CPU-intensive operation is the SSL handshake.[m
[31m-There are two ways to minimize the number of these operations per client:[m
[31m-the first is by enabling keepalive connections to send several[m
[31m-requests via one connection and the second is to reuse SSL session[m
[31m-parameters to avoid SSL handshakes for parallel and subsequent connections.[m
[31m-The sessions are stored in an SSL session cache shared between workers[m
[31m-and configured by the[m
[31m-L<ngx_http_ssl_module>[m
[31m-directive.[m
[31m-One megabyte of the cache contains about 4000 sessions.[m
[31m-The default cache timeout is 5 minutes.[m
[31m-It can be increased by using the[m
[31m-L<ngx_http_ssl_module>[m
[31m-directive.[m
[31m-Here is a sample configuration optimized for a multi-core system[m
[31m-with 10 megabyte shared session cache:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    <b>worker_processes auto</b>;[m
[31m-    [m
[31m-    http {[m
[31m-        <b>ssl_session_cache   shared:SSL:10m</b>;[m
[31m-        <b>ssl_session_timeout 10m</b>;[m
[31m-    [m
[31m-        server {[m
[31m-            listen              443 ssl;[m
[31m-            server_name         www.example.com;[m
[31m-            <b>keepalive_timeout   70</b>;[m
[31m-    [m
[31m-            ssl_certificate     www.example.com.crt;[m
[31m-            ssl_certificate_key www.example.com.key;[m
[31m-            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-            ssl_ciphers         HIGH:!aNULL:!MD5;[m
[31m-            ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SSL certificate chains[m
[31m-[m
[31m-[m
[31m-[m
[31m-Some browsers may complain about a certificate signed by a well-known[m
[31m-certificate authority, while other browsers may accept the certificate[m
[31m-without issues.[m
[31m-This occurs because the issuing authority has signed the server certificate[m
[31m-using an intermediate certificate that is not present in the certificate[m
[31m-base of well-known trusted certificate authorities which is distributed[m
[31m-with a particular browser.[m
[31m-In this case the authority provides a bundle of chained certificates[m
[31m-which should be concatenated to the signed server certificate.[m
[31m-The server certificate must appear before the chained certificates[m
[31m-in the combined file:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    $ cat www.example.com.crt bundle.crt > www.example.com.chained.crt[m
[31m-[m
[31m-[m
[31m-[m
[31m-The resulting file should be used in the[m
[31m-L<ngx_http_ssl_module> directive:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen              443 ssl;[m
[31m-        server_name         www.example.com;[m
[31m-        ssl_certificate     www.example.com.chained.crt;[m
[31m-        ssl_certificate_key www.example.com.key;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the server certificate and the bundle have been concatenated in the wrong[m
[31m-order, nginx will fail to start and will display the error message:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed[m
[31m-       (SSL: error:0B080074:x509 certificate routines:[m
[31m-        X509_check_private_key:key values mismatch)[m
[31m-[m
[31m-[m
[31m-[m
[31m-because nginx has tried to use the private key with the bundle’s[m
[31m-first certificate instead of the server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Browsers usually store intermediate certificates which they receive[m
[31m-and which are signed by trusted authorities, so actively used browsers[m
[31m-may already have the required intermediate certificates and[m
[31m-may not complain about a certificate sent without a chained bundle.[m
[31m-To ensure the server sends the complete certificate chain,[m
[31m-the C<openssl> command-line utility may be used, for example:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    $ openssl s_client -connect www.godaddy.com:443[m
[31m-    ...[m
[31m-    Certificate chain[m
[31m-     0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US[m
[31m-         /1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc[m
[31m-         /OU=MIS Department/<b>CN=www.GoDaddy.com</b>[m
[31m-         /serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)[m
[31m-       i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.[m
[31m-         /OU=http://certificates.godaddy.com/repository[m
[31m-         /CN=Go Daddy Secure Certification Authority[m
[31m-         /serialNumber=07969287[m
[31m-     1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.[m
[31m-         /OU=http://certificates.godaddy.com/repository[m
[31m-         /CN=Go Daddy Secure Certification Authority[m
[31m-         /serialNumber=07969287[m
[31m-       i:/C=US/O=The Go Daddy Group, Inc.[m
[31m-         /OU=Go Daddy Class 2 Certification Authority[m
[31m-     2 s:/C=US/O=The Go Daddy Group, Inc.[m
[31m-         /OU=Go Daddy Class 2 Certification Authority[m
[31m-       i:/L=ValiCert Validation Network/O=<b>ValiCert, Inc.</b>[m
[31m-         /OU=ValiCert Class 2 Policy Validation Authority[m
[31m-         /CN=http://www.valicert.com//emailAddress=info@valicert.com[m
[31m-    ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this example the subject (“I<s>”) of the[m
[31m-C<www.GoDaddy.com> server certificate #0 is signed by an issuer[m
[31m-(“I<i>”) which itself is the subject of the certificate #1,[m
[31m-which is signed by an issuer which itself is the subject of the certificate #2,[m
[31m-which signed by the well-known issuer I<ValiCert, Inc.>[m
[31m-whose certificate is stored in the browsers’ built-in[m
[31m-certificate base (that lay in the house that Jack built).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a certificate bundle has not been added, only the server certificate #0[m
[31m-will be shown.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 A single HTTP/HTTPS server[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is possible to configure a single server that handles both HTTP[m
[31m-and HTTPS requests:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen              80;[m
[31m-        listen              443 ssl;[m
[31m-        server_name         www.example.com;[m
[31m-        ssl_certificate     www.example.com.crt;[m
[31m-        ssl_certificate_key www.example.com.key;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to 0.7.14 SSL could not be enabled selectively for[m
[31m-individual listening sockets, as shown above.[m
[31m-SSL could only be enabled for the entire server using the[m
[31m-L<ngx_http_ssl_module> directive,[m
[31m-making it impossible to set up a single HTTPE<sol>HTTPS server.[m
[31m-The C<ssl> parameter of the[m
[31m-L<ngx_http_core_module> directive[m
[31m-was added to solve this issue.[m
[31m-The use of the[m
[31m-L<ngx_http_ssl_module> directive[m
[31m-in modern versions is thus discouraged.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name-based HTTPS servers[m
[31m-[m
[31m-[m
[31m-[m
[31m-A common issue arises when configuring two or more HTTPS servers[m
[31m-listening on a single IP address:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen          443 ssl;[m
[31m-        server_name     www.example.com;[m
[31m-        ssl_certificate www.example.com.crt;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen          443 ssl;[m
[31m-        server_name     www.example.org;[m
[31m-        ssl_certificate www.example.org.crt;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-With this configuration a browser receives the default server’s certificate,[m
[31m-i.e. C<www.example.com> regardless of the requested server name.[m
[31m-This is caused by SSL protocol behaviour.[m
[31m-The SSL connection is established before the browser sends an HTTP request[m
[31m-and nginx does not know the name of the requested server.[m
[31m-Therefore, it may only offer the default server’s certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The oldest and most robust method to resolve the issue[m
[31m-is to assign a separate IP address for every HTTPS server:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen          192.168.1.1:443 ssl;[m
[31m-        server_name     www.example.com;[m
[31m-        ssl_certificate www.example.com.crt;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen          192.168.1.2:443 ssl;[m
[31m-        server_name     www.example.org;[m
[31m-        ssl_certificate www.example.org.crt;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 An SSL certificate with several names[m
[31m-[m
[31m-[m
[31m-[m
[31m-There are other ways that allow sharing a single IP address[m
[31m-between several HTTPS servers.[m
[31m-However, all of them have their drawbacks.[m
[31m-One way is to use a certificate with several names in[m
[31m-the SubjectAltName certificate field, for example,[m
[31m-C<www.example.com> and C<www.example.org>.[m
[31m-However, the SubjectAltName field length is limited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Another way is to use a certificate with a wildcard name, for example,[m
[31m-C<*.example.org>.[m
[31m-A wildcard certificate secures all subdomains of the specified domain,[m
[31m-but only on one level.[m
[31m-This certificate matches C<www.example.org>, but does not match[m
[31m-C<example.org> and C<www.sub.example.org>.[m
[31m-These two methods can also be combined.[m
[31m-A certificate may contain exact and wildcard names in the[m
[31m-SubjectAltName field, for example,[m
[31m-C<example.org> and C<*.example.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is better to place a certificate file with several names and[m
[31m-its private key file at the I<http> level of configuration[m
[31m-to inherit their single memory copy in all servers:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    ssl_certificate     common.crt;[m
[31m-    ssl_certificate_key common.key;[m
[31m-    [m
[31m-    server {[m
[31m-        listen          443 ssl;[m
[31m-        server_name     www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen          443 ssl;[m
[31m-        server_name     www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Server Name Indication[m
[31m-[m
[31m-[m
[31m-[m
[31m-A more generic solution for running several HTTPS servers on a single[m
[31m-IP address is[m
[31m-L<TLS[m
[31m-Server Name Indication extension|http://en.wikipedia.org/wiki/Server_Name_Indication> (SNI, RFC 6066),[m
[31m-which allows a browser to pass a requested server name during the SSL handshake[m
[31m-and, therefore, the server will know which certificate it should use[m
[31m-for the connection.[m
[31m-However, SNI has limited browser support.[m
[31m-Currently it is supported starting with the following browsers versions:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Opera 8.0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-MSIE 7.0 (but only on Windows Vista or higher);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Firefox 2.0 and other browsers using Mozilla Platform rv:1.8.1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Safari 3.2.1 (Windows version supports SNI on Vista or higher);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and Chrome (Windows version supports SNI on Vista or higher, too).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Only domain names can be passed in SNI,[m
[31m-however some browsers may erroneously pass an IP address of the server[m
[31m-as its name if a request includes literal IP address.[m
[31m-One should not rely on this.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order to use SNI in nginx, it must be supported in both the[m
[31m-OpenSSL library with which the nginx binary has been built as well as[m
[31m-the library to which it is being dynamically linked at run time.[m
[31m-OpenSSL supports SNI since 0.9.8f version if it was built with config option[m
[31m-“--enable-tlsext”.[m
[31m-Since OpenSSL 0.9.8j this option is enabled by default.[m
[31m-If nginx was built with SNI support, then nginx will show this[m
[31m-when run with the “-V” switch:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    $ nginx -V[m
[31m-    ...[m
[31m-    TLS SNI support enabled[m
[31m-    ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, if the SNI-enabled nginx is linked dynamically to[m
[31m-an OpenSSL library without SNI support, nginx displays the warning:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    nginx was built with SNI support, however, now it is linked[m
[31m-    dynamically to an OpenSSL library which has no tlsext support,[m
[31m-    therefore SNI is not available[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The SNI support status has been shown by the “-V” switch[m
[31m-since 0.8.21 and 0.7.62.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<ssl> parameter of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive has been supported since 0.7.14.[m
[31m-Prior to 0.8.21 it could only be specified along with the[m
[31m-C<default> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-SNI has been supported since 0.5.32.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The shared SSL session cache has been supported since 0.5.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 1.9.1 and later: the default SSL protocols are TLSv1,[m
[31m-TLSv1.1, and TLSv1.2 (if supported by the OpenSSL library).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.7.65, 0.8.19 and later: the default SSL protocols are SSLv3, TLSv1,[m
[31m-TLSv1.1, and TLSv1.2 (if supported by the OpenSSL library).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.7.64, 0.8.18 and earlier: the default SSL protocols are SSLv2,[m
[31m-SSLv3, and TLSv1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 1.0.5 and later: the default SSL ciphers are[m
[31m-“C<HIGH:!aNULL:!MD5>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.7.65, 0.8.20 and later: the default SSL ciphers are[m
[31m-“C<HIGH:!ADH:!MD5>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.8.19: the default SSL ciphers are[m
[31m-“C<ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.7.64, 0.8.18 and earlier: the default SSL ciphers are[m
[31m-[m
[31m-[m
[31m-“C<ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/contributing_changes.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/contributing_changes.pod[m
[1mdeleted file mode 100644[m
[1mindex 7c3dd78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/contributing_changes.pod[m
[1m+++ /dev/null[m
[36m@@ -1,192 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-contributing_changes - Contributing Changes[m
[31m-[m
[31m-[m
[31m-=head1 Getting Sources[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Mercurial|http://mercurial.selenic.com> is used[m
[31m-to store source code.[m
[31m-The L<repository|http://hg.nginx.org/nginx> can be cloned[m
[31m-with the following command:[m
[31m-[m
[31m-    [m
[31m-    hg clone http://hg.nginx.org/nginx[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Formatting Changes[m
[31m-[m
[31m-[m
[31m-[m
[31m-Changes should be formatted according to the code style used by nginx.[m
[31m-Code formatting should not rely on such editor features like syntax[m
[31m-highlighting or automatic line breaking.[m
[31m-Below are some basic rules:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-maximum text width is 80 characters[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-indentation is four spaces[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-no tabs[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-logical code blocks in a file are separated with two empty lines[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Examine how existing nginx sources are formatted and mimic this style[m
[31m-in your code.[m
[31m-Changes will more likely be accepted if style corresponds to the surrounding[m
[31m-code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Commit the changes to create a Mercurial[m
[31m-L<changeset|http://mercurial.selenic.com/wiki/ChangeSet>.[m
[31m-Please ensure that the specified[m
[31m-L<e-mail|http://mercurial.selenic.com/wiki/QuickStart#Setting_a_username>[m
[31m-address and real name of the change’s author are correct.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The commit message should have a single-line synopsis followed by verbose[m
[31m-description after an empty line.[m
[31m-It is desirable that the first line is no longer than 67 symbols.[m
[31m-The resulting changeset as a patch can be obtained using the[m
[31m-C<hg export> command:[m
[31m-[m
[31m-    [m
[31m-    # HG changeset patch[m
[31m-    # User Filipe Da Silva <username@example.com>[m
[31m-    # Date 1368089668 -7200[m
[31m-    #      Thu May 09 10:54:28 2013 +0200[m
[31m-    # Node ID 2220de0521ca2c0b664a8ea1e201ce1cb90fd7a2[m
[31m-    # Parent  822b82191940ef309cd1e6502f94d50d811252a1[m
[31m-    Mail: removed surplus ngx_close_connection() call.[m
[31m-    [m
[31m-    It is already called for a peer connection a few lines above.[m
[31m-    [m
[31m-    diff -r 822b82191940 -r 2220de0521ca src/mail/ngx_mail_auth_http_module.c[m
[31m-    --- a/src/mail/ngx_mail_auth_http_module.c      Wed May 15 15:04:49 2013 +0400[m
[31m-    +++ b/src/mail/ngx_mail_auth_http_module.c      Thu May 09 10:54:28 2013 +0200[m
[31m-    @@ -699,7 +699,6 @@ ngx_mail_auth_http_process_headers(ngx_m[m
[31m-    [m
[31m-                         p = ngx_pnalloc(s->connection->pool, ctx->err.len);[m
[31m-                         if (p == NULL) {[m
[31m-    -                        ngx_close_connection(ctx->peer.connection);[m
[31m-                             ngx_destroy_pool(ctx->pool);[m
[31m-                             ngx_mail_session_internal_server_error(s);[m
[31m-                             return;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Before Submitting[m
[31m-[m
[31m-[m
[31m-[m
[31m-Several points are worth to consider before submitting changes:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The proposed changes should work properly on a wide range of[m
[31m-L<supported[m
[31m-platforms|index>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Try to make it clear why the suggested change is needed, and provide a use[m
[31m-case, if possible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Passing your changes through the test suite is a good way to ensure[m
[31m-that they do not cause a regression.[m
[31m-The L<repository|http://hg.nginx.org/nginx-tests> with[m
[31m-tests can be cloned with the following command:[m
[31m-[m
[31m-    [m
[31m-    hg clone http://hg.nginx.org/nginx-tests[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Submitting Changes[m
[31m-[m
[31m-[m
[31m-[m
[31m-The proposed changes should be sent to the[m
[31m-L<nginx development|support>[m
[31m-mailing list.[m
[31m-The preferred and convenient method of submitting changesets[m
[31m-is with the[m
[31m-L<patchbomb|http://mercurial.selenic.com/wiki/PatchbombExtension>[m
[31m-extension.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 License[m
[31m-[m
[31m-[m
[31m-[m
[31m-Submitting changes implies granting project a permission to use it under[m
[31m-an appropriate L<license|../../LICENSE>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/control.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/control.pod[m
[1mdeleted file mode 100644[m
[1mindex 906dd10..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/control.pod[m
[1m+++ /dev/null[m
[36m@@ -1,279 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-control - Controlling nginx[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx can be controlled with signals.[m
[31m-The process ID of the master process is written to the file[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>logsE<sol>nginx.pid> by default.[m
[31m-This name may be changed at configuration time, or in[m
[31m-F<nginx.conf> using the[m
[31m-L<ngx_core_module>[m
[31m-directive.[m
[31m-The master process supports the following signals:[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-[m
[31m-TERM, INT                          fast shutdown[m
[31m-     QUIT                      graceful shutdown[m
[31m-     USR1                   re-opening log files[m
[31m-     USR2           upgrading an executable file[m
[31m-    WINCH  graceful shutdown of worker processes[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Individual worker processes can be controlled with signals as well,[m
[31m-though it is not required.[m
[31m-The supported signals are:[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-[m
[31m-TERM, INT         fast shutdown[m
[31m-     QUIT     graceful shutdown[m
[31m-     USR1  re-opening log files[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changing Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order for nginx to re-read the configuration file, a HUP[m
[31m-signal should be sent to the master process.[m
[31m-The master process first checks the syntax validity, then tries[m
[31m-to apply new configuration, that is, to open log files and new[m
[31m-listen sockets.[m
[31m-If this fails, it rolls back changes and continues to work[m
[31m-with old configuration.[m
[31m-If this succeeds, it starts new worker processes, and[m
[31m-sends messages to old worker processes requesting them to[m
[31m-shut down gracefully.[m
[31m-Old worker processes close listen sockets and continue to service[m
[31m-old clients.[m
[31m-After all clients are serviced, old worker processes are shut down.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Let’s illustrate this by example.[m
[31m-Imagine that nginx is run on FreeBSD 4.x and the command[m
[31m-[m
[31m-    [m
[31m-    ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'[m
[31m-[m
[31m-[m
[31m-produces the following output:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33127 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)[m
[31m-    33128 33126 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    33129 33126 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If HUP is sent to the master process, the output becomes:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33129 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)[m
[31m-    33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33135 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One of the old worker processes with PID 33129 still continues to work.[m
[31m-After some time it exits:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33135 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Rotating Log-files[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order to rotate log files, they need to be renamed first.[m
[31m-After that USR1 signal should be sent to the master process.[m
[31m-The master process will then re-open all currently open log files and[m
[31m-assign them an unprivileged user under which the worker processes[m
[31m-are running, as an owner.[m
[31m-After successful re-opening, the master process closes all open files and[m
[31m-sends the message to worker process to ask them to re-open files.[m
[31m-Worker processes also open new files and close old files right away.[m
[31m-As a result, old files are almost immediately available for post[m
[31m-processing, such as compression.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Upgrading Executable on the Fly[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order to upgrade the server executable, the new executable file[m
[31m-should be put in place of an old file first.[m
[31m-After that USR2 signal should be sent to the master process.[m
[31m-The master process first renames its file with the process ID to a[m
[31m-new file with the F<.oldbin> suffix, e.g.[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>logsE<sol>nginx.pid.oldbin>,[m
[31m-then starts a new executable file that in turn starts new[m
[31m-worker processes:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)[m
[31m-    33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-After that all worker processes (old and new ones) continue to accept requests.[m
[31m-If the WINCH signal is sent to the first master process, it will[m
[31m-send messages to its worker processes, requesting them to shut[m
[31m-down gracefully, and they will start to exit:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33135 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)[m
[31m-    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-After some time, only the new worker processes will process requests:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be noted that the old master process does not close its listen[m
[31m-sockets, and it can be managed to start its worker processes again if needed.[m
[31m-If for some reason the new executable file works unacceptably, one of the[m
[31m-following can be done:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-Send the HUP signal to the old master process.[m
[31m-The old master process will start new worker processes[m
[31m-without re-reading the configuration.[m
[31m-After that, all new processes can be shut down gracefully,[m
[31m-by sending the QUIT signal to the new master process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-Send the TERM signal to the new master process.[m
[31m-It will then send a message to its worker processes requesting them[m
[31m-to exit immediately, and they will all exit almost immediately.[m
[31m-(If new processes do not exit for some reason,[m
[31m-the KILL signal should be sent to them to force them to exit.)[m
[31m-When the new master process exits, the old master process will start new[m
[31m-worker processes automatically.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the new master process exits then the old master process discards[m
[31m-the F<.oldbin> suffix from the file name with the process ID.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If upgrade was successful, then the old master process should be sent[m
[31m-the QUIT signal, and only new processes will stay:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    36264     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/converting_rewrite_rules.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/converting_rewrite_rules.pod[m
[1mdeleted file mode 100644[m
[1mindex 18440dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/converting_rewrite_rules.pod[m
[1m+++ /dev/null[m
[36m@@ -1,175 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-converting_rewrite_rules - Converting rewrite rules[m
[31m-[m
[31m-[m
[31m-=head1 A redirect to a main site[m
[31m-[m
[31m-[m
[31m-[m
[31m-People who during their shared hosting life used to configure[m
[31m-I<everything> using I<only> ApacheE<rsquo>s .htaccess files,[m
[31m-usually translate the following rules:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    RewriteCond  %{HTTP_HOST}  example.org[m
[31m-    RewriteRule  (.*)          http://www.example.org$1[m
[31m-[m
[31m-[m
[31m-[m
[31m-to something like this:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  www.example.org  example.org;[m
[31m-        if ($http_host = example.org) {[m
[31m-            rewrite  (.*)  http://www.example.org$1;[m
[31m-        }[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This is a wrong, cumbersome, and ineffective way.[m
[31m-The right way is to define a separate server for C<example.org>:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org;[m
[31m-        return       301 http://www.example.org$request_uri;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-On versions prior to 0.9.1, redirects can be made with:[m
[31m-[m
[31m-    [m
[31m-        rewrite      ^ http://www.example.org$request_uri?;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-Another example.[m
[31m-Instead of the E<ldquo>upside-downE<rdquo> logic E<ldquo>all that is not[m
[31m-C<example.com> and is not C<www.example.com>E<rdquo>:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    RewriteCond  %{HTTP_HOST}  !example.com[m
[31m-    RewriteCond  %{HTTP_HOST}  !www.example.com[m
[31m-    RewriteRule  (.*)          http://www.example.com$1[m
[31m-[m
[31m-[m
[31m-[m
[31m-one should simply define C<example.com>, C<www.example.com>,[m
[31m-and E<ldquo>everything elseE<rdquo>:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.com www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80 default_server;[m
[31m-        server_name  _;[m
[31m-        return       301 http://example.com$request_uri;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-On versions prior to 0.9.1, redirects can be made with:[m
[31m-[m
[31m-    [m
[31m-        rewrite      ^ http://example.com$request_uri?;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Converting Mongrel rules[m
[31m-[m
[31m-[m
[31m-[m
[31m-Typical Mongrel rules:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    DocumentRoot /var/www/myapp.com/current/public[m
[31m-    [m
[31m-    RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f[m
[31m-    RewriteCond %{SCRIPT_FILENAME} !maintenance.html[m
[31m-    RewriteRule ^.*$ %{DOCUMENT_ROOT}/system/maintenance.html [L][m
[31m-    [m
[31m-    RewriteCond %{REQUEST_FILENAME} -f[m
[31m-    RewriteRule ^(.*)$ $1 [QSA,L][m
[31m-    [m
[31m-    RewriteCond %{REQUEST_FILENAME}/index.html -f[m
[31m-    RewriteRule ^(.*)$ $1/index.html [QSA,L][m
[31m-    [m
[31m-    RewriteCond %{REQUEST_FILENAME}.html -f[m
[31m-    RewriteRule ^(.*)$ $1.html [QSA,L][m
[31m-    [m
[31m-    RewriteRule ^/(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L][m
[31m-[m
[31m-[m
[31m-[m
[31m-should be converted to[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        root       /var/www/myapp.com/current/public;[m
[31m-    [m
[31m-        try_files  /system/maintenance.html[m
[31m-                   $uri  $uri/index.html $uri.html[m
[31m-                   @mongrel;[m
[31m-    }[m
[31m-    [m
[31m-    location @mongrel {[m
[31m-        proxy_pass  http://mongrel;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/daemon_master_process_off.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/daemon_master_process_off.pod[m
[1mdeleted file mode 100644[m
[1mindex 5729fef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/daemon_master_process_off.pod[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-daemon_master_process_off[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-Can I run nginx with "daemon off" or "master_process off" settings[m
[31m-in a production environment?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-First of all, both "daemon onE<verbar>off" and "master_process onE<verbar>off" directives were[m
[31m-intended to be used primarily for nginx code development.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-While many people use "daemon off" in production it wasn’t really meant for[m
[31m-that. Since version 1.0.9 it is now quite safe to run nginx in production[m
[31m-with "daemon off", though. Bear in mind that non-stop upgrade is not an[m
[31m-option with "daemon off".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In a development environment, using "master_process off", nginx can run in[m
[31m-the foreground without the master process and can be terminated simply[m
[31m-with ^C (SIGINT). This is somewhat similar to running Apache with[m
[31m-an 'X' command-line option. However you should NEVER run nginx in production[m
[31m-with "master_process off".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/debugging_log.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/debugging_log.pod[m
[1mdeleted file mode 100644[m
[1mindex f14f054..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/debugging_log.pod[m
[1m+++ /dev/null[m
[36m@@ -1,145 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-debugging_log - A debugging log[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-To enable a debugging log, nginx needs to be configured to support[m
[31m-debugging during the build:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    ./configure --with-debug ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-Then the C<debug> level should be set with the[m
[31m-L<ngx_core_module> directive:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    error_log /path/to/log debug;[m
[31m-[m
[31m-[m
[31m-[m
[31m-To verify that nginx is configured to support debugging,[m
[31m-run the C<nginx -V> command:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    configure arguments: --with-debug ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-Pre-built L<Linux|linux_packages> packages[m
[31m-provide out-of-the-box support for debugging log with[m
[31m-the C<nginx-debug> binary (1.9.8)[m
[31m-which can be run using commands[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    service nginx stop[m
[31m-    service nginx-debug start[m
[31m-[m
[31m-[m
[31m-[m
[31m-and then set the C<debug> level.[m
[31m-The nginx binary version for Windows is always built with the debugging log[m
[31m-support, so only setting the C<debug> level will suffice.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that redefining the log without also specifying the[m
[31m-C<debug>[m
[31m-level will disable the debugging log.[m
[31m-In the example below, redefining the log on the[m
[31m-L<ngx_http_core_module>[m
[31m-level disables the debugging log for this server:[m
[31m-[m
[31m-    [m
[31m-    error_log /path/to/log debug;[m
[31m-    [m
[31m-    http {[m
[31m-        server {[m
[31m-            error_log /path/to/log;[m
[31m-            ...[m
[31m-[m
[31m-[m
[31m-To avoid this, either the line redefining the log should be[m
[31m-commented out, or the C<debug> level specification should[m
[31m-also be added:[m
[31m-[m
[31m-    [m
[31m-    error_log /path/to/log debug;[m
[31m-    [m
[31m-    http {[m
[31m-        server {[m
[31m-            error_log /path/to/log debug;[m
[31m-            ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Debugging log for selected clients[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to enable the debugging log for[m
[31m-L<selected[m
[31m-client addresses|ngx_core_module> only:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    error_log /path/to/log;[m
[31m-    [m
[31m-    events {[m
[31m-        debug_connection 192.168.1.1;[m
[31m-        debug_connection 192.168.10.0/24;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Logging to a cyclic memory buffer[m
[31m-[m
[31m-[m
[31m-[m
[31m-The debugging log can be written to a cyclic memory buffer:[m
[31m-[m
[31m-    [m
[31m-    error_log memory:32m debug;[m
[31m-[m
[31m-[m
[31m-Logging to the memory buffer on the C<debug> level[m
[31m-does not have significant impact on performance even under high load.[m
[31m-In this case, the log can be extracted using[m
[31m-a C<gdb> script like the following one:[m
[31m-[m
[31m-    [m
[31m-    set $log = ngx_cycle->log[m
[31m-    [m
[31m-    while $log->writer != ngx_log_memory_writer[m
[31m-        set $log = $log->next[m
[31m-    end[m
[31m-    [m
[31m-    set $buf = (ngx_log_memory_buf_t *) $log->wdata[m
[31m-    dump binary memory debug_log.txt $buf->start $buf->end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/events.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/events.pod[m
[1mdeleted file mode 100644[m
[1mindex 53bb4ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/events.pod[m
[1m+++ /dev/null[m
[36m@@ -1,120 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-events - Connection processing methods[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx supports a variety of connection processing methods.[m
[31m-The availability of a particular method depends on the platform used.[m
[31m-On platforms that support several methods nginx will normally[m
[31m-select the most efficient method automatically.[m
[31m-However, if needed, a connection processing method can be selected[m
[31m-explicitly with the[m
[31m-L<ngx_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following connection processing methods are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<select>E<mdash>standard method.[m
[31m-The supporting module is built automatically on platforms that lack[m
[31m-more efficient methods.[m
[31m-The C<--with-select_module> and[m
[31m-C<--without-select_module> configuration parameters[m
[31m-can be used to forcibly enable or disable the build of this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<poll>E<mdash>standard method.[m
[31m-The supporting module is built automatically on platforms that lack[m
[31m-more efficient methods.[m
[31m-The C<--with-poll_module> and[m
[31m-C<--without-poll_module> configuration parameters[m
[31m-can be used to forcibly enable or disable the build of this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<kqueue>E<mdash>efficient method used on[m
[31m-FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0, and Mac OS X.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<epoll>E<mdash>efficient method used on[m
[31m-Linux 2.6+.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Some older distributions like SuSE 8.2 provide patches[m
[31m-that add epoll support to 2.4 kernels.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<E<sol>devE<sol>poll>E<mdash>efficient method used on[m
[31m-Solaris 7 11E<sol>99+, HPE<sol>UX 11.22+ (eventport), IRIX 6.5.15+,[m
[31m-and Tru64 UNIX 5.1A+.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<eventport>E<mdash>event ports, efficient method[m
[31m-used on Solaris 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/example.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/example.pod[m
[1mdeleted file mode 100644[m
[1mindex f41d001..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/example.pod[m
[1m+++ /dev/null[m
[36m@@ -1,158 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-example - Example nginx configuration[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-An example site configuration that passes all requests to the backend except[m
[31m-images and requests starting with "E<sol>downloadE<sol>".[m
[31m-[m
[31m-    [m
[31m-    user  www www;[m
[31m-    [m
[31m-    worker_processes  2;[m
[31m-    [m
[31m-    pid /var/run/nginx.pid;[m
[31m-    [m
[31m-    #                          [ debug | info | notice | warn | error | crit ][m
[31m-    [m
[31m-    error_log  /var/log/nginx.error_log  info;[m
[31m-    [m
[31m-    events {[m
[31m-        worker_connections   2000;[m
[31m-    [m
[31m-        # use [ kqueue | epoll | /dev/poll | select | poll ];[m
[31m-        use kqueue;[m
[31m-    }[m
[31m-    [m
[31m-    http {[m
[31m-    [m
[31m-        include       conf/mime.types;[m
[31m-        default_type  application/octet-stream;[m
[31m-    [m
[31m-    [m
[31m-        log_format main      '$remote_addr - $remote_user [$time_local] '[m
[31m-                             '"$request" $status $bytes_sent '[m
[31m-                             '"$http_referer" "$http_user_agent" '[m
[31m-                             '"$gzip_ratio"';[m
[31m-    [m
[31m-        log_format download  '$remote_addr - $remote_user [$time_local] '[m
[31m-                             '"$request" $status $bytes_sent '[m
[31m-                             '"$http_referer" "$http_user_agent" '[m
[31m-                             '"$http_range" "$sent_http_content_range"';[m
[31m-    [m
[31m-        client_header_timeout  3m;[m
[31m-        client_body_timeout    3m;[m
[31m-        send_timeout           3m;[m
[31m-    <!--[m
[31m-        connection_pool_size         256;[m
[31m-    -->[m
[31m-        client_header_buffer_size    1k;[m
[31m-        large_client_header_buffers  4 4k;[m
[31m-    <!--[m
[31m-        request_pool_size            4k;[m
[31m-    -->[m
[31m-        gzip on;[m
[31m-        gzip_min_length  1100;[m
[31m-        gzip_buffers     4 8k;[m
[31m-        gzip_types       text/plain;[m
[31m-    [m
[31m-        output_buffers   1 32k;[m
[31m-        postpone_output  1460;[m
[31m-    [m
[31m-        sendfile         on;[m
[31m-        tcp_nopush       on;[m
[31m-        tcp_nodelay      on;[m
[31m-        send_lowat       12000;[m
[31m-    [m
[31m-        keepalive_timeout  75 20;[m
[31m-    [m
[31m-        #lingering_time     30;[m
[31m-        #lingering_timeout  10;[m
[31m-        #reset_timedout_connection  on;[m
[31m-    [m
[31m-    [m
[31m-        server {[m
[31m-            listen        one.example.com;[m
[31m-            server_name   one.example.com  www.one.example.com;[m
[31m-    [m
[31m-            access_log   /var/log/nginx.access_log  main;[m
[31m-    [m
[31m-            location / {[m
[31m-                proxy_pass         http://127.0.0.1/;[m
[31m-                proxy_redirect     off;[m
[31m-    [m
[31m-                proxy_set_header   Host             $host;[m
[31m-                proxy_set_header   X-Real-IP        $remote_addr;[m
[31m-                #proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;[m
[31m-    [m
[31m-                client_max_body_size       10m;[m
[31m-                client_body_buffer_size    128k;[m
[31m-    [m
[31m-                client_body_temp_path      /var/nginx/client_body_temp;[m
[31m-    [m
[31m-                proxy_connect_timeout      70;[m
[31m-                proxy_send_timeout         90;[m
[31m-                proxy_read_timeout         90;[m
[31m-                proxy_send_lowat           12000;[m
[31m-    [m
[31m-                proxy_buffer_size          4k;[m
[31m-                proxy_buffers              4 32k;[m
[31m-                proxy_busy_buffers_size    64k;[m
[31m-                proxy_temp_file_write_size 64k;[m
[31m-    [m
[31m-                proxy_temp_path            /var/nginx/proxy_temp;[m
[31m-    [m
[31m-                charset  koi8-r;[m
[31m-            }[m
[31m-    [m
[31m-            error_page  404  /404.html;[m
[31m-    [m
[31m-            location /404.html {[m
[31m-                root  /spool/www;[m
[31m-            }[m
[31m-    [m
[31m-            location /old_stuff/ {[m
[31m-                rewrite   ^/old_stuff/(.*)$  /new_stuff/$1  permanent;[m
[31m-            }[m
[31m-    [m
[31m-            location /download/ {[m
[31m-    [m
[31m-                valid_referers  none  blocked  server_names  *.example.com;[m
[31m-    [m
[31m-                if ($invalid_referer) {[m
[31m-                    #rewrite   ^/   http://www.example.com/;[m
[31m-                    return   403;[m
[31m-                }[m
[31m-    [m
[31m-                #rewrite_log  on;[m
[31m-    [m
[31m-                # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3[m
[31m-                rewrite ^/(download/.*)/mp3/(.*)\..*$[m
[31m-                        /$1/mp3/$2.mp3                   break;[m
[31m-    [m
[31m-                root         /spool/www;[m
[31m-                #autoindex    on;[m
[31m-                access_log   /var/log/nginx-download.access_log  download;[m
[31m-            }[m
[31m-    [m
[31m-            location ~* \.(jpg|jpeg|gif)$ {[m
[31m-                root         /spool/www;[m
[31m-                access_log   off;[m
[31m-                expires      30d;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/faq.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/faq.pod[m
[1mdeleted file mode 100644[m
[1mindex 4a38d5f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/faq.pod[m
[1m+++ /dev/null[m
[36m@@ -1,68 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-faq - FAQ[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<welcome_nginx_facebook>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<license_copyright>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<accept_failed>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<variables_in_config>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<daemon_master_process_off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<chunked_encoding_from_backend>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<sys_errlist>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/freebsd_tuning.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/freebsd_tuning.pod[m
[1mdeleted file mode 100644[m
[1mindex 39f44c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/freebsd_tuning.pod[m
[1m+++ /dev/null[m
[36m@@ -1,332 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-freebsd_tuning - Tuning FreeBSD for the highload[m
[31m-[m
[31m-[m
[31m-=head1 Syncache and syncookies[m
[31m-[m
[31m-[m
[31m-[m
[31m-We look at how various kernel settings affect ability of the kernel[m
[31m-to process requests. LetE<rsquo>s start with TCPE<sol>IP connection establishment.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[ syncache, syncookies ][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Listen queues[m
[31m-[m
[31m-[m
[31m-[m
[31m-After the connection has been established it is placed in the listen queue[m
[31m-of the listen socket.[m
[31m-To see the current listen queues state, you may run the command[m
[31m-“C<netstat -Lan>”:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    Current listen queue sizes (qlen/incqlen/maxqlen)[m
[31m-    Proto Listen         Local Address[m
[31m-    tcp4  <b>10</b>/0/128       *.80[m
[31m-    tcp4  0/0/128        *.22[m
[31m-[m
[31m-[m
[31m-[m
[31m-This is a normal case: the listen queue of the port *:80 contains[m
[31m-just 10 unaccepted connections.[m
[31m-If the web server is not able to handle the load, you may see[m
[31m-something like this:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    Current listen queue sizes (qlen/incqlen/maxqlen)[m
[31m-    Proto Listen         Local Address[m
[31m-    tcp4  <b>192/</b>0/<b>128</b>      *.80[m
[31m-    tcp4  0/0/128        *.22[m
[31m-[m
[31m-[m
[31m-[m
[31m-Here are 192 unaccepted connections and most likely new coming connections[m
[31m-are discarding. Although the limit is 128 connections, FreeBSD allows[m
[31m-receiving 1.5 times connections than the limit before it starts to discard[m
[31m-the new connections. You may increase the limit using[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    sysctl kern.ipc.somaxconn=4096[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, note that the queue is only a damper to quench bursts.[m
[31m-If it is always overflowed, this means that you need to improve the web server,[m
[31m-but not to continue to increase the limit.[m
[31m-You may also change the listen queue maximum size in nginx configuration:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    listen  80  backlog=1024;[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, you may not set it more than the current[m
[31m-F<kern.ipc.somaxconn> value.[m
[31m-By default nginx uses the maximum value of FreeBSD kernel.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Sockets and files[m
[31m-[m
[31m-[m
[31m-[m
[31m-[ sockets, files ][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Socket buffers[m
[31m-[m
[31m-[m
[31m-[m
[31m-When a client sends a data, the data first is received by the kernel[m
[31m-which places the data in the socket receiving buffer.[m
[31m-Then an application such as the web server[m
[31m-may call C<recv> or C<read> system calls[m
[31m-to get the data from the buffer.[m
[31m-When the application wants to send a data, it calls[m
[31m-C<send> or C<write>[m
[31m-system calls to place the data in the socket sending buffer.[m
[31m-Then the kernel manages to send the data from the buffer to the client.[m
[31m-In modern FreeBSD versions the default sizes of the socket receiving[m
[31m-and sending buffers are respectively 64K and 32K.[m
[31m-You may change them on the fly using the sysctls[m
[31m-F<net.inet.tcp.recvspace> and[m
[31m-F<net.inet.tcp.sendspace>.[m
[31m-Of course the bigger buffer sizes may increase throughput,[m
[31m-because connections may use bigger TCP sliding windows sizes.[m
[31m-And on the Internet you may see recommendations to increase[m
[31m-the buffer sizes to one or even several megabytes.[m
[31m-However, such large buffer sizes are suitable for local networks[m
[31m-or for networks under your control.[m
[31m-Since on the Internet a slow modem client may ask a large file[m
[31m-and then it will download the file during several minutes if not hours.[m
[31m-All this time the megabyte buffer will be bound to the slow client,[m
[31m-although we may devote just several kilobytes to it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is one more advantage of the large sending buffers for[m
[31m-the web servers such as Apache which use the blocking IE<sol>O system calls.[m
[31m-The server may place a whole large response in the sending buffer, then may[m
[31m-close the connection, and let the kernel to send the response to a slow client,[m
[31m-while the server is ready to serve other requests.[m
[31m-You should decide what is it better to bind to a client in your case:[m
[31m-a tens megabytes ApacheE<sol>mod_perl process[m
[31m-or the hundreds kilobytes socket sending buffer.[m
[31m-Note that nginx uses non-blocking IE<sol>O system calls[m
[31m-and devotes just tens kilobytes to connections,[m
[31m-therefore it does not require the large buffer sizes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[ dynamic buffers ][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 mbufs, mbuf clusters, etc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Inside the kernel the buffers are stored in the form of chains of[m
[31m-memory chunks linked using the I<mbuf> structures.[m
[31m-The mbuf size is 256 bytes and it can be used to store a small amount[m
[31m-of data, for example, TCPE<sol>IP header. However, the mbufs point mostly[m
[31m-to other data stored in the I<mbuf clusters> or I<jumbo clusters>,[m
[31m-and in this kind they are used as the chain links only.[m
[31m-The mbuf cluster size is 2K.[m
[31m-The jumbo cluster size can be equal to a CPU page size (4K for i386 and amd64),[m
[31m-9K, or 16K.[m
[31m-The 9K and 16K jumbo clusters are used mainly in local networks with Ethernet[m
[31m-frames larger than usual 1500 bytes, and they are beyond the scope of[m
[31m-this article.[m
[31m-The page size jumbo clusters are usually used for sending only,[m
[31m-while the mbuf clusters are used for both sending and receiving.[m
[31m-[m
[31m-To see the current usage of the mbufs and clusters and their limits,[m
[31m-you may run the command “C<netstat -m>”.[m
[31m-Here is a sample from FreeBSD 7.2E<sol>amd64 with the default settings:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    1477/<b>3773/5250 mbufs</b> in use (current/cache/total)[m
[31m-    771/2203/<b>2974/25600 mbuf clusters</b> in use (current/cache/total/max)[m
[31m-    771/1969 mbuf+clusters out of packet secondary zone in use[m
[31m-       (current/cache)[m
[31m-    296/863/<b>1159/12800 4k (page size) jumbo clusters</b> in use[m
[31m-       (current/cache/total/max)[m
[31m-    0/0/0/6400 9k jumbo clusters in use (current/cache/total/max)[m
[31m-    0/0/0/3200 16k jumbo clusters in use (current/cache/total/max)[m
[31m-    3095K/8801K/11896K bytes allocated to network(current/cache/total)[m
[31m-    0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters)[m
[31m-    0/0/0 requests for jumbo clusters denied (4k/9k/16k)[m
[31m-    0/0/0 sfbufs in use (current/peak/max)[m
[31m-    0 requests for sfbufs denied[m
[31m-    0 requests for sfbufs delayed[m
[31m-    523590 requests for I/O initiated by sendfile[m
[31m-    0 calls to protocol drain routines[m
[31m-[m
[31m-[m
[31m-[m
[31m-There are 12800 page size jumbo clusters,[m
[31m-therefore they can store only 50M of data.[m
[31m-If you set the F<net.inet.tcp.sendspace> to 1M,[m
[31m-then merely 50 slow clients will take all jumbo clusters[m
[31m-requesting large files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-You may increase the clusters limits on the fly using:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    sysctl kern.ipc.nmbclusters=200000[m
[31m-    sysctl kern.ipc.nmbjumbop=100000[m
[31m-[m
[31m-[m
[31m-[m
[31m-The former command increases the mbuf clusters limit[m
[31m-and the latter increases page size jumbo clusters limit.[m
[31m-Note that all allocated mbufs clusters will take about 440M physical memory:[m
[31m-(200000 E<times> (2048 + 256)) because each mbuf cluster requires also the mbuf.[m
[31m-All allocated page size jumbo clusters will take yet about 415M physical memory:[m
[31m-(100000 E<times> (4096 + 256)).[m
[31m-And together they may take 845M.[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The page size jumbo clusters have been introduced in FreeBSD 7.0.[m
[31m-In earlier versions you should tune only 2K mbuf clusters.[m
[31m-Prior to FreeBSD 6.2, the F<kern.ipc.nmbclusters> value can be[m
[31m-set only on the boot time via loader tunable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On the amd64 architecture FreeBSD kernel can use for sockets buffers[m
[31m-almost all physical memory,[m
[31m-while on the i386 architecture no more than 2G memory can be used,[m
[31m-regardless of the available physical memory.[m
[31m-We will discuss the i386 specific tuning later.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is way not to use the jumbo clusters while serving static files:[m
[31m-the I<sendfile()> system call.[m
[31m-The sendfile allows sending a file or its part to a socket directly[m
[31m-without reading the parts in an application buffer.[m
[31m-It creates the mbufs chain where the mbufs point to the file pages that are[m
[31m-already present in FreeBSD cache memory, and passes the chain to[m
[31m-the TCPE<sol>IP stack.[m
[31m-Thus, sendfile decreases both CPU usage by omitting two memory copy operations,[m
[31m-and memory usage by using the cached file pages.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-And again, the amd64 sendfile implementation is the best:[m
[31m-the zeros in the “C<netstat -m>” output[m
[31m-[m
[31m-    [m
[31m-    ...[m
[31m-    <b>0/0/0</b> sfbufs in use (current/peak/max)[m
[31m-    ...[m
[31m-[m
[31m-[m
[31m-mean that there is no I<sfbufs> limit,[m
[31m-while on i386 architecture you should to tune them.[m
[31m-[m
[31m-[m
[31m-=head1 Proxying[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    net.inet.ip.portrange.randomized=0[m
[31m-    net.inet.ip.portrange.first=1024[m
[31m-    net.inet.ip.portrange.last=65535[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Finalizing connection[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    net.inet.tcp.fast_finwait2_recycle=1[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 i386 specific tuning[m
[31m-[m
[31m-[m
[31m-[m
[31m-[ KVA, KVM, nsfbufs ][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Minor optimizations[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    sysctl kern.random.sys.harvest.ethernet=0[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/hash.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/hash.pod[m
[1mdeleted file mode 100644[m
[1mindex 058f0ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/hash.pod[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-hash - Setting up hashes[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-To quickly process static sets of data such as server names,[m
[31m-L<ngx_http_map_module> directive’s values,[m
[31m-MIME types, names of request header strings,[m
[31m-nginx uses hash tables.[m
[31m-During the start and each re-configuration nginx selects the[m
[31m-minimum possible sizes of hash tables such that the bucket size[m
[31m-that stores keys with identical hash values does not exceed the[m
[31m-configured parameter (hash bucket size).[m
[31m-The size of a table is expressed in buckets.[m
[31m-The adjustment is continued until the table size exceeds the[m
[31m-hash max size parameter.[m
[31m-Most hashes have the corresponding directives that allow changing[m
[31m-these parameters, for example, for the server names hash they are[m
[31m-L<ngx_http_core_module>[m
[31m-and L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The hash bucket size parameter is aligned to the size that is a[m
[31m-multiple of the processor’s cache line size.  This speeds up[m
[31m-key search in a hash on modern processors by reducing the number[m
[31m-of memory accesses.[m
[31m-If hash bucket size is equal to one processor’s cache line size[m
[31m-then the number of memory accesses during the key search will be[m
[31m-two in the worst caseE<mdash>first to compute the bucket address,[m
[31m-and second during the key search inside the bucket.[m
[31m-Therefore, if nginx emits the message requesting to increase[m
[31m-either hash max size or hash bucket size then the first parameter[m
[31m-should first be increased.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/howto_build_on_win32.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/howto_build_on_win32.pod[m
[1mdeleted file mode 100644[m
[1mindex 40936d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/howto_build_on_win32.pod[m
[1m+++ /dev/null[m
[36m@@ -1,178 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-howto_build_on_win32 - Building nginx on the Win32 platform with Visual C[m
[31m-[m
[31m-[m
[31m-=head1 Prerequisites[m
[31m-[m
[31m-[m
[31m-[m
[31m-To build nginx on the Microsoft Win32 E<copy> platform you need:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Microsoft Visual C compiler. Microsoft Visual Studio E<copy>[m
[31m-8 and 10 are known to work.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<MSYS|http://www.mingw.org/wiki/MSYS>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Perl, if you want to build OpenSSL E<copy> and nginx with SSL support.[m
[31m-For example L<ActivePerl|http://www.activestate.com/activeperl>[m
[31m-or L<Strawberry Perl|http://strawberryperl.com>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Mercurial|http://mercurial.selenic.com/> client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<PCRE|http://www.pcre.org>, L<zlib|http://zlib.net>[m
[31m-and L<OpenSSL|http://www.openssl.org> libraries sources.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Build steps[m
[31m-[m
[31m-[m
[31m-[m
[31m-Ensure that paths to Perl, Mercurial and MSYS bin directories are added to[m
[31m-PATH environment variable before you start build. To set Visual C environment[m
[31m-run vcvarsall.bat script from Visual C directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To build nginx:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Start MSYS bash.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Check out nginx sources from the hg.nginx.org repository. For example:[m
[31m-[m
[31m-    [m
[31m-    hg clone http://hg.nginx.org/nginx[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Create a build and lib directories, and unpack zlib, PCRE and OpenSSL libraries[m
[31m-sources into lib directory:[m
[31m-[m
[31m-    [m
[31m-    mkdir objs[m
[31m-    mkdir objs/lib[m
[31m-    cd objs/lib[m
[31m-    tar -xzf ../../pcre-8.32.tar.gz[m
[31m-    tar -xzf ../../zlib-1.2.7.tar.gz[m
[31m-    tar -xzf ../../openssl-1.0.1e.tar.gz[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Run configure script:[m
[31m-[m
[31m-    [m
[31m-    auto/configure --with-cc=cl --builddir=objs --prefix= \[m
[31m-    --conf-path=conf/nginx.conf --pid-path=logs/nginx.pid \[m
[31m-    --http-log-path=logs/access.log --error-log-path=logs/error.log \[m
[31m-    --sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp \[m
[31m-    --http-proxy-temp-path=temp/proxy_temp \[m
[31m-    --http-fastcgi-temp-path=temp/fastcgi_temp \[m
[31m-    --with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=objs/lib/pcre-8.32 \[m
[31m-    --with-zlib=objs/lib/zlib-1.2.7 --with-openssl=objs/lib/openssl-1.0.1e \[m
[31m-    --with-select_module --with-http_ssl_module --with-ipv6[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Run make:[m
[31m-[m
[31m-    [m
[31m-    nmake -f objs/Makefile[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See also[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<windows>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/install.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/install.pod[m
[1mdeleted file mode 100644[m
[1mindex 6a03dce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/install.pod[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-install - Installing nginx[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx can be installed differently, depending on the operating system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation on Linux[m
[31m-[m
[31m-[m
[31m-[m
[31m-For Linux, nginx L<packages|linux_packages>[m
[31m-from nginx.org can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation on FreeBSD[m
[31m-[m
[31m-[m
[31m-[m
[31m-On FreeBSD, nginx can be installed either from the L<packages|http://www.freebsd.org/doc/handbook/pkgng-intro.html>[m
[31m-or through the[m
[31m-L<ports|http://www.freebsd.org/doc/handbook/ports-using.html>[m
[31m-system.[m
[31m-The ports system provides greater flexibility, allowing selection among[m
[31m-a wide range of options.[m
[31m-The port will compile nginx with the specified options and install it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Building from Sources[m
[31m-[m
[31m-[m
[31m-[m
[31m-If some special functionality is required, not available with packages and[m
[31m-ports, nginx can also be compiled from source files.[m
[31m-While more flexible, this approach may be complex for a beginner.[m
[31m-For more information, see L<configure>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/license_copyright.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/license_copyright.pod[m
[1mdeleted file mode 100644[m
[1mindex 1718ef6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/license_copyright.pod[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-license_copyright[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-I’d like to use nginx distribution as part of my proprietary[m
[31m-software package. How can nginx copyright be acknowledged[m
[31m-when using nginx as part of a proprietary software distribution?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-The text below should be added to your license conditions,[m
[31m-followed by the text of the applicable 2-clause BSD license described[m
[31m-L<here|http://nginx.org/LICENSE>.[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    This product contains software provided by Nginx, Inc. and its contributors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Also, if your build of nginx includes any of the following 3rd party[m
[31m-products: zlib, PCRE, OpenSSL E<8212> it’s worth including their[m
[31m-copyright acknowledgements and disclaimers as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/load_balancing.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/load_balancing.pod[m
[1mdeleted file mode 100644[m
[1mindex b2b8118..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/load_balancing.pod[m
[1m+++ /dev/null[m
[36m@@ -1,372 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-load_balancing - Using nginx as HTTP load balancer[m
[31m-[m
[31m-[m
[31m-=head1 Introduction[m
[31m-[m
[31m-[m
[31m-[m
[31m-Load balancing across multiple application instances is a commonly used[m
[31m-technique for optimizing resource utilization, maximizing throughput,[m
[31m-reducing latency, and ensuring fault-tolerant configurations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is possible to use nginx as a very efficient HTTP load balancer to[m
[31m-distribute traffic to several application servers and to improve[m
[31m-performance, scalability and reliability of web applications with nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Load balancing methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following load balancing mechanisms (or methods) are supported in[m
[31m-nginx:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-round-robin — requests to the application servers are distributed[m
[31m-in a round-robin fashion,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-least-connected — next request is assigned to the server with the[m
[31m-least number of active connections,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ip-hash — a hash-function is used to determine what server should[m
[31m-be selected for the next request (based on the client’s IP address).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Default load balancing configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-The simplest configuration for load balancing with nginx may look[m
[31m-like the following:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        upstream myapp1 {[m
[31m-            server srv1.example.com;[m
[31m-            server srv2.example.com;[m
[31m-            server srv3.example.com;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 80;[m
[31m-    [m
[31m-            location / {[m
[31m-                proxy_pass http://myapp1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In the example above, there are 3 instances of the same application[m
[31m-running on srv1-srv3.[m
[31m-When the load balancing method is not specifically configured,[m
[31m-it defaults to round-robin.[m
[31m-All requests are[m
[31m-L<proxied|ngx_http_proxy_module> to the server group myapp1, and nginx applies HTTP load[m
[31m-balancing to distribute the requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Reverse proxy implementation in nginx includes load balancing for HTTP,[m
[31m-HTTPS, FastCGI, uwsgi, SCGI, and memcached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To configure load balancing for HTTPS instead of HTTP, just use “https”[m
[31m-as the protocol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When setting up load balancing for FastCGI, uwsgi, SCGI, or memcached, use[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-L<ngx_http_scgi_module>, and[m
[31m-L<ngx_http_memcached_module>[m
[31m-directives respectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Least connected load balancing[m
[31m-[m
[31m-[m
[31m-[m
[31m-Another load balancing discipline is least-connected.[m
[31m-Least-connected allows controlling the load on application[m
[31m-instances more fairly in a situation when some of the requests[m
[31m-take longer to complete.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With the least-connected load balancing, nginx will try not to overload a[m
[31m-busy application server with excessive requests, distributing the new[m
[31m-requests to a less busy server instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Least-connected load balancing in nginx is activated when the[m
[31m-L<least_conn|ngx_http_upstream_module> directive is used as part of the server group configuration:[m
[31m-[m
[31m-    [m
[31m-        upstream myapp1 {[m
[31m-            least_conn;[m
[31m-            server srv1.example.com;[m
[31m-            server srv2.example.com;[m
[31m-            server srv3.example.com;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Session persistence[m
[31m-[m
[31m-[m
[31m-[m
[31m-Please note that with round-robin or least-connected load[m
[31m-balancing, each subsequent client’s request can be potentially[m
[31m-distributed to a different server.[m
[31m-There is no guarantee that the same client will be always[m
[31m-directed to the same server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If there is the need to tie a client to a particular application server —[m
[31m-in other words, make the client’s session “sticky” or “persistent” in[m
[31m-terms of always trying to select a particular server — the ip-hash load[m
[31m-balancing mechanism can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With ip-hash, the client’s IP address is used as a hashing key to[m
[31m-determine what server in a server group should be selected for the[m
[31m-client’s requests.[m
[31m-This method ensures that the requests from the same client[m
[31m-will always be directed to the same server[m
[31m-except when this server is unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To configure ip-hash load balancing, just add the[m
[31m-L<ngx_http_upstream_module>[m
[31m-directive to the server (upstream) group configuration:[m
[31m-[m
[31m-    [m
[31m-    upstream myapp1 {[m
[31m-        ip_hash;[m
[31m-        server srv1.example.com;[m
[31m-        server srv2.example.com;[m
[31m-        server srv3.example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Weighted load balancing[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to influence nginx load balancing algorithms even[m
[31m-further by using server weights.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In the examples above, the server weights are not configured which means[m
[31m-that all specified servers are treated as equally qualified for a[m
[31m-particular load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With the round-robin in particular it also means a more or less equal[m
[31m-distribution of requests across the servers — provided there are enough[m
[31m-requests, and when the requests are processed in a uniform manner and[m
[31m-completed fast enough.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the[m
[31m-L<weight|ngx_http_upstream_module>[m
[31m-parameter is specified for a server, the weight is accounted as part[m
[31m-of the load balancing decision.[m
[31m-[m
[31m-    [m
[31m-        upstream myapp1 {[m
[31m-            server srv1.example.com weight=3;[m
[31m-            server srv2.example.com;[m
[31m-            server srv3.example.com;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With this configuration, every 5 new requests will be distributed across[m
[31m-the application instances as the following: 3 requests will be directed[m
[31m-to srv1, one request will go to srv2, and another one — to srv3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is similarly possible to use weights with the least-connected and[m
[31m-ip-hash load balancing in the recent versions of nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Health checks[m
[31m-[m
[31m-[m
[31m-[m
[31m-Reverse proxy implementation in nginx includes in-band (or passive)[m
[31m-server health checks.[m
[31m-If the response from a particular server fails with an error,[m
[31m-nginx will mark this server as failed, and will try to[m
[31m-avoid selecting this server for subsequent inbound requests for a while.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The[m
[31m-L<max_fails|ngx_http_upstream_module>[m
[31m-directive sets the number of consecutive unsuccessful attempts to[m
[31m-communicate with the server that should happen during[m
[31m-L<fail_timeout|ngx_http_upstream_module>.[m
[31m-By default,[m
[31m-L<max_fails|ngx_http_upstream_module>[m
[31m-is set to 1.[m
[31m-When it is set to 0, health checks are disabled for this server.[m
[31m-The[m
[31m-L<fail_timeout|ngx_http_upstream_module>[m
[31m-parameter also defines how long the server will be marked as failed.[m
[31m-After[m
[31m-L<fail_timeout|ngx_http_upstream_module>[m
[31m-interval following the server failure, nginx will start to gracefully[m
[31m-probe the server with the live client’s requests.[m
[31m-If the probes have been successful, the server is marked as a live one.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Further reading[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, there are more directives and parameters that control server[m
[31m-load balancing in nginx, e.g.[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<backup|ngx_http_upstream_module>,[m
[31m-L<down|ngx_http_upstream_module>, and[m
[31m-L<ngx_http_upstream_module>.[m
[31m-For more information please check our[m
[31m-L<reference documentation|..>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Last but not least,[m
[31m-L<application load balancing|https://www.nginx.com/products/application-load-balancing/>,[m
[31m-L<application health checks|https://www.nginx.com/products/application-health-checks/>,[m
[31m-L<activity monitoring|https://www.nginx.com/products/live-activity-monitoring/> and[m
[31m-L<on-the-fly reconfiguration|https://www.nginx.com/products/on-the-fly-reconfiguration/> of server groups are available[m
[31m-as part of our paid NGINX Plus subscriptions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following articles describe load balancing with NGINX Plus[m
[31m-in more detail:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Load Balancing with NGINX and NGINX Plus|https://www.nginx.com/blog/load-balancing-with-nginx-plus/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Load Balancing with NGINX and NGINX Plus part 2|https://www.nginx.com/blog/load-balancing-with-nginx-plus-part2/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/nginx.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/nginx.pod[m
[1mdeleted file mode 100644[m
[1mindex 4423c56..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/nginx.pod[m
[1m+++ /dev/null[m
[36m@@ -1,704 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-index - nginx documentation[m
[31m-[m
[31m-[m
[31m-=head1 Introduction[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<install>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<beginners_guide>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Admin’s Guide|https://www.nginx.com/resources/admin-guide/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<control>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<hash>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<debugging_log>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<syslog>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<syntax>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<switches>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<windows>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<request_processing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<server_names>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<load_balancing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<configuring_https_servers>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Chapter “nginx” in[m
[31m-“The Architecture of Open Source Applications”|http://www.aosabook.org/en/nginx.html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 How-To[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<configure>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<howto_build_on_win32>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Setting up NGINX Plus environment on Amazon EC2|https://www.nginx.com/resources/admin-guide/setting-nginx-plus-environment-amazon-ec2/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<nginx_dtrace_pid_provider>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<converting_rewrite_rules>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<websocket>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Development[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<contributing_changes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Modules reference[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<dirindex>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<varindex>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_core_module|ngx_http_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_access_module|ngx_http_access_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_addition_module|ngx_http_addition_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_auth_basic_module|ngx_http_auth_basic_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_auth_request_module|ngx_http_auth_request_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_autoindex_module|ngx_http_autoindex_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_browser_module|ngx_http_browser_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_charset_module|ngx_http_charset_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_dav_module|ngx_http_dav_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_empty_gif_module|ngx_http_empty_gif_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_f4f_module|ngx_http_f4f_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_fastcgi_module|ngx_http_fastcgi_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_flv_module|ngx_http_flv_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_geo_module|ngx_http_geo_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_geoip_module|ngx_http_geoip_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_gunzip_module|ngx_http_gunzip_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_gzip_module|ngx_http_gzip_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_gzip_static_module|ngx_http_gzip_static_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_headers_module|ngx_http_headers_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_hls_module|ngx_http_hls_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_image_filter_module|ngx_http_image_filter_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_index_module|ngx_http_index_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_limit_conn_module|ngx_http_limit_conn_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_limit_req_module|ngx_http_limit_req_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_log_module|ngx_http_log_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_map_module|ngx_http_map_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_memcached_module|ngx_http_memcached_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_mp4_module|ngx_http_mp4_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_perl_module|ngx_http_perl_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_proxy_module|ngx_http_proxy_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_random_index_module|ngx_http_random_index_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_realip_module|ngx_http_realip_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_referer_module|ngx_http_referer_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_rewrite_module|ngx_http_rewrite_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_scgi_module|ngx_http_scgi_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_secure_link_module|ngx_http_secure_link_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_session_log_module|ngx_http_session_log_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_slice_module|ngx_http_slice_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_spdy_module|ngx_http_spdy_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_split_clients_module|ngx_http_split_clients_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_ssi_module|ngx_http_ssi_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_ssl_module|ngx_http_ssl_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_status_module|ngx_http_status_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_stub_status_module|ngx_http_stub_status_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_sub_module|ngx_http_sub_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_upstream_module|ngx_http_upstream_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_upstream_conf_module|ngx_http_upstream_conf_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_userid_module|ngx_http_userid_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_uwsgi_module|ngx_http_uwsgi_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_v2_module|ngx_http_v2_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_xslt_module|ngx_http_xslt_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_core_module|ngx_mail_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_auth_http_module|ngx_mail_auth_http_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_proxy_module|ngx_mail_proxy_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_ssl_module|ngx_mail_ssl_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_imap_module|ngx_mail_imap_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_pop3_module|ngx_mail_pop3_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_smtp_module|ngx_mail_smtp_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_core_module|ngx_stream_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_access_module|ngx_stream_access_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_limit_conn_module|ngx_stream_limit_conn_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_proxy_module|ngx_stream_proxy_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_ssl_module|ngx_stream_ssl_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_upstream_module|ngx_stream_upstream_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/nginx_dtrace_pid_provider.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/nginx_dtrace_pid_provider.pod[m
[1mdeleted file mode 100644[m
[1mindex 4651850..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/nginx_dtrace_pid_provider.pod[m
[1m+++ /dev/null[m
[36m@@ -1,217 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-nginx_dtrace_pid_provider - Debugging nginx with DTrace pid provider[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-This article assumes the reader has a general knowledge of nginx internals and[m
[31m-DTrace.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Although nginx built with the L<--with-debug|debugging_log>[m
[31m-option already provides a lot of information about request processing,[m
[31m-it is sometimes desirable to trace particular parts of code path more[m
[31m-thoroughly and at the same time omit the rest of debugging output.[m
[31m-DTrace pid provider (available on Solaris, Mac OS X) is a useful tool to[m
[31m-explore userland program’s internals, since it doesn’t require any code[m
[31m-changes and it can help with the task.[m
[31m-A simple DTrace script to trace and print nginx function calls[m
[31m-may look like this:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    #pragma D option flowindent[m
[31m-    [m
[31m-    pid$target:nginx::entry {[m
[31m-    }[m
[31m-    [m
[31m-    pid$target:nginx::return {[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-DTrace capabilities for function calls tracing provide only a limited amount[m
[31m-of useful information, though.[m
[31m-Real-time inspection of function arguments is typically more interesting,[m
[31m-but also a bit more complicated.[m
[31m-Examples below are intended to help the reader become more familiar with[m
[31m-DTrace and the process of analyzing nginx behavior using DTrace.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One of the common scenarios for using DTrace with nginx is the following:[m
[31m-attach to the nginx worker process to log request lines and request start times.[m
[31m-The corresponding function to attach is[m
[31m-C<ngx_http_process_request>, and the argument in question[m
[31m-is a pointer to the C<ngx_http_request_t> structure.[m
[31m-DTrace script for such request logging can be as simple as:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    pid$target::*ngx_http_process_request:entry[m
[31m-    {[m
[31m-        this->request = (ngx_http_request_t *)copyin(arg0, sizeof(ngx_http_request_t));[m
[31m-        this->request_line = stringof(copyin((uintptr_t)this->request->request_line.data,[m
[31m-                                             this->request->request_line.len));[m
[31m-        printf("request line = %s\n", this->request_line);[m
[31m-        printf("request start sec = %d\n", this->request->start_sec);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be noted that in the example above DTrace requires some knowledge[m
[31m-about the C<ngx_http_process_request> structure.[m
[31m-Unfortunately while it is possible to use a specific C<#include>[m
[31m-directive in the DTrace script and then pass it to a C preprocessor[m
[31m-(with the C<-C> flag), that doesn’t really work.[m
[31m-Due to a lot of cross dependencies, almost all nginx header files[m
[31m-have to be included.[m
[31m-In turn, based on C<configure> script settings,[m
[31m-nginx headers will include PCRE,[m
[31m-OpenSSL and a variety of system header files.[m
[31m-While in theory all those header files related to a specific nginx build[m
[31m-might be included in DTrace script preprocessing and compilation, in reality[m
[31m-DTrace script most probably will fail to compile because of unknown syntax in[m
[31m-some header files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The problem above can be solved by including only the relevant and[m
[31m-necessary structure and type definitions in the DTrace script.[m
[31m-DTrace has to know sizes of structures, types, and fields offsets.[m
[31m-Thus dependencies can be further reduced by manually optimizing[m
[31m-structure definitions for use with DTrace.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Let’s use DTrace script example above and see what structure definitions[m
[31m-it needs to work properly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-First of all C<objsE<sol>ngx_auto_config.h> file generated by[m
[31m-configure should be included, because it defines a number of constants[m
[31m-affecting various C<#ifdef>’s.[m
[31m-After that, some basic types and definitions[m
[31m-like C<ngx_str_t>, C<ngx_table_elt_t>,[m
[31m-C<ngx_uint_t> etc. should be put at the beginning of the[m
[31m-DTrace script.[m
[31m-These definitions are compact, commonly used and unlikely to be[m
[31m-frequently changed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Then there’s the C<ngx_http_process_request_t> structure that[m
[31m-contains a lot of pointers to other structures.[m
[31m-Because these pointers are really irrelevant to this script, and because they[m
[31m-have the same size, it is possible to just replace them with void pointers.[m
[31m-Instead of changing definitions, it is better to add appropriate typedefs,[m
[31m-though:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    typedef ngx_http_upstream_t     void;[m
[31m-    typedef ngx_http_request_body_t void;[m
[31m-[m
[31m-[m
[31m-[m
[31m-Last but not least it is necessary to add definitions of two member structures[m
[31m-(C<ngx_http_headers_in_t>,[m
[31m-C<ngx_http_headers_out_t>),[m
[31m-declarations of callback functions and definitions of constants.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The final DTrace script can be downloaded from[m
[31m-L<here|http://nginx.org/download/trace_process_request.d>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following example shows the output of running this script:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    # dtrace -C -I ./objs -s trace_process_request.d -p 4848[m
[31m-    dtrace: script 'trace_process_request.d' matched 1 probe[m
[31m-    CPU     ID                    FUNCTION:NAME[m
[31m-      1      4 .XAbmO.ngx_http_process_request:entry request line = GET / HTTP/1.1[m
[31m-    request start sec = 1349162898[m
[31m-    [m
[31m-      0      4 .XAbmO.ngx_http_process_request:entry request line = GET /en/docs/nginx_dtrace_pid_provider.html HTTP/1.1[m
[31m-    request start sec = 1349162899[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Using similar techniques the reader should be able to trace other[m
[31m-nginx function calls.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See also[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Solaris Dynamic Tracing Guide|http://docs.oracle.com/cd/E19253-01/817-6223/index.html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Introduction article on DTrace pid provider|http://dtrace.org/blogs/brendan/2011/02/09/dtrace-pid-provider/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_core_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_core_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 747b5cf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_core_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1114 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_core_module - Core functionality[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    user www www;[m
[31m-    worker_processes 2;[m
[31m-    [m
[31m-    error_log /var/log/nginx-error.log info;[m
[31m-    [m
[31m-    events {[m
[31m-        use kqueue;[m
[31m-        worker_connections 2048;[m
[31m-    }[m
[31m-    [m
[31m-    ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 accept_mutex[m
[31m-[m
[31m-[m
[31m-B<syntax:> accept_mutex I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<accept_mutex> is enabled,[m
[31m-worker processes will accept new connections by turn.[m
[31m-Otherwise, all worker processes will be notified about new connections,[m
[31m-and if volume of new connections is low, some of the worker processes[m
[31m-may just waste system resources.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 accept_mutex_delay[m
[31m-[m
[31m-[m
[31m-B<syntax:> accept_mutex_delay I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<500ms>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If L</accept_mutex> is enabled, specifies the maximum time[m
[31m-during which a worker process will try to restart accepting new[m
[31m-connections if another worker process is currently accepting[m
[31m-new connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 daemon[m
[31m-[m
[31m-[m
[31m-B<syntax:> daemon I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether nginx should become a daemon.[m
[31m-Mainly used during development.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 debug_connection[m
[31m-[m
[31m-[m
[31m-B<syntax:> debug_connection I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables debugging log for selected client connections.[m
[31m-Other connections will use logging level set by the[m
[31m-L</error_log> directive.[m
[31m-Debugged connections are specified by IPv4 or IPv6 (1.3.0, 1.2.1)[m
[31m-address or network.[m
[31m-A connection may also be specified using a hostname.[m
[31m-For connections using UNIX-domain sockets (1.3.0, 1.2.1),[m
[31m-debugging log is enabled by the “C<unix:>” parameter.[m
[31m-[m
[31m-    [m
[31m-    events {[m
[31m-        debug_connection 127.0.0.1;[m
[31m-        debug_connection localhost;[m
[31m-        debug_connection 192.0.2.0/24;[m
[31m-        debug_connection ::1;[m
[31m-        debug_connection 2001:0db8::/32;[m
[31m-        debug_connection unix:;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-For this directive to work, nginx needs to[m
[31m-be built with C<--with-debug>,[m
[31m-see “L<debugging_log>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 debug_points[m
[31m-[m
[31m-[m
[31m-B<syntax:> debug_points I<C<abort> E<verbar> C<stop>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is used for debugging.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When internal error is detected, e.g. the leak of sockets on[m
[31m-restart of working processes, enabling C<debug_points>[m
[31m-leads to a core file creation (C<abort>)[m
[31m-or to stopping of a process (C<stop>) for further[m
[31m-analysis using a system debugger.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 error_log[m
[31m-[m
[31m-[m
[31m-B<syntax:> error_log I<I<C<file>> [I<C<level>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<logsE<sol>error.log error>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures logging.[m
[31m-Several logs can be specified on the same level (1.5.2).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first parameter defines a I<C<file>> that will store the log.[m
[31m-The special value C<stderr> selects the standard error file.[m
[31m-Logging to L<syslog|syslog> can be configured by specifying[m
[31m-the “C<syslog:>” prefix.[m
[31m-Logging to a[m
[31m-L<cyclic memory buffer|debugging_log>[m
[31m-can be configured by specifying the “C<memory:>” prefix and[m
[31m-buffer I<C<size>>, and is generally used for debugging (1.7.11).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The second parameter determines the I<C<level>> of logging,[m
[31m-and can be one of the following:[m
[31m-C<debug>, C<info>, C<notice>,[m
[31m-C<warn>, C<error>, C<crit>,[m
[31m-C<alert>, or C<emerg>.[m
[31m-Log levels above are listed in the order of increasing severity.[m
[31m-Setting a certain log level will cause all messages of[m
[31m-the specified and more severe log levels to be logged.[m
[31m-For example, the default level C<error> will[m
[31m-cause C<error>, C<crit>,[m
[31m-C<alert>, and C<emerg> messages[m
[31m-to be logged.[m
[31m-If this parameter is omitted then C<error> is used.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-For C<debug> logging to work, nginx needs to[m
[31m-be built with C<--with-debug>,[m
[31m-see “L<debugging_log>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The directive can be specified on the[m
[31m-C<stream> level[m
[31m-starting from version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The directive can be specified on the[m
[31m-C<mail> level[m
[31m-starting from version 1.9.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 env[m
[31m-[m
[31m-[m
[31m-B<syntax:> env I<I<C<variable>>[=I<C<value>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TZ>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, nginx removes all environment variables inherited[m
[31m-from its parent process except the TZ variable.[m
[31m-This directive allows preserving some of the inherited variables,[m
[31m-changing their values, or creating new environment variables.[m
[31m-These variables are then:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-inherited during a L<live upgrade|control>[m
[31m-of an executable file;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-used by the[m
[31m-L<ngx_http_perl_module|ngx_http_perl_module> module;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-used by worker processes.[m
[31m-One should bear in mind that controlling system libraries in this way[m
[31m-is not always possible as it is common for libraries to check[m
[31m-variables only during initialization, well before they can be set[m
[31m-using this directive.[m
[31m-An exception from this is an above mentioned[m
[31m-L<live upgrade|control>[m
[31m-of an executable file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The TZ variable is always inherited and available to the[m
[31m-L<ngx_http_perl_module|ngx_http_perl_module>[m
[31m-module, unless it is configured explicitly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    env MALLOC_OPTIONS;[m
[31m-    env PERL5LIB=/data/site/modules;[m
[31m-    env OPENSSL_ALLOW_PROXY_CERTS=1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The NGINX environment variable is used internally by nginx[m
[31m-and should not be set directly by the user.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 events[m
[31m-[m
[31m-[m
[31m-events { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Provides the configuration file context in which the directives that[m
[31m-affect connection processing are specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 include[m
[31m-[m
[31m-[m
[31m-B<syntax:> include I<I<C<file>> E<verbar> I<C<mask>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Includes another I<C<file>>, or files matching the[m
[31m-specified I<C<mask>>, into configuration.[m
[31m-Included files should consist of[m
[31m-syntactically correct directives and blocks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    include mime.types;[m
[31m-    include vhosts/*.conf;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 load_module[m
[31m-[m
[31m-[m
[31m-B<syntax:> load_module I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Loads a dynamic module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    load_module modules/ngx_mail_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lock_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> lock_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<logsE<sol>nginx.lock>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx uses the locking mechanism to implement L</accept_mutex>[m
[31m-and serialize access to shared memory.[m
[31m-On most systems the locks are implemented using atomic operations,[m
[31m-and this directive is ignored.[m
[31m-On other systems the “lock file” mechanism is used.[m
[31m-This directive specifies a prefix for the names of lock files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 master_process[m
[31m-[m
[31m-[m
[31m-B<syntax:> master_process I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether worker processes are started.[m
[31m-This directive is intended for nginx developers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 multi_accept[m
[31m-[m
[31m-[m
[31m-B<syntax:> multi_accept I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<multi_accept> is disabled, a worker process[m
[31m-will accept one new connection at a time.[m
[31m-Otherwise, a worker process[m
[31m-will accept all new connections at a time.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The directive is ignored if L<events>[m
[31m-connection processing method is used, because it reports[m
[31m-the number of new connections waiting to be accepted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 pcre_jit[m
[31m-[m
[31m-[m
[31m-B<syntax:> pcre_jit I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of “just-in-time compilation” (PCRE JIT)[m
[31m-for the regular expressions known by the time of configuration parsing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-PCRE JIT can speed up processing of regular expressions significantly.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The JIT is available in PCRE libraries starting from version 8.20[m
[31m-built with the C<--enable-jit> configuration parameter.[m
[31m-When the PCRE library is built with nginx (C<--with-pcre=>),[m
[31m-the JIT support is enabled via the[m
[31m-C<--with-pcre-jit> configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 pid[m
[31m-[m
[31m-[m
[31m-B<syntax:> pid I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<nginx.pid>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a I<C<file>> that will store the process ID of the main process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_engine[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_engine I<I<C<device>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the name of the hardware SSL accelerator.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 thread_pool[m
[31m-[m
[31m-[m
[31m-B<syntax:> thread_pool I<[m
[31m-    I<C<name>>[m
[31m-    C<threads>=I<C<number>>[m
[31m-    [C<max_queue>=I<C<number>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<default threads=32 max_queue=65536>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines named thread pools[m
[31m-used for multi-threaded reading and sending of files[m
[31m-L<without blocking|ngx_http_core_module>[m
[31m-worker processes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<threads> parameter[m
[31m-defines the number of threads in the pool.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In the event that all threads in the pool are busy,[m
[31m-a new task will wait in the queue.[m
[31m-The C<max_queue> parameter limits the number[m
[31m-of tasks allowed to be waiting in the queue.[m
[31m-By default, up to 65536 tasks can wait in the queue.[m
[31m-When the queue overflows, the task is completed with an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 timer_resolution[m
[31m-[m
[31m-[m
[31m-B<syntax:> timer_resolution I<I<C<interval>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Reduces timer resolution in worker processes, thus reducing the[m
[31m-number of C<gettimeofday> system calls made.[m
[31m-By default, C<gettimeofday> is called each time[m
[31m-a kernel event is received.[m
[31m-With reduced resolution, C<gettimeofday> is only[m
[31m-called once per specified I<C<interval>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    timer_resolution 100ms;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Internal implementation of the interval depends on the method used:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the C<EVFILT_TIMER> filter if C<kqueue> is used;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timer_create> if C<eventport> is used;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<setitimer> otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 use[m
[31m-[m
[31m-[m
[31m-B<syntax:> use I<I<C<method>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the L<connection processing|events>[m
[31m-I<C<method>> to use.[m
[31m-There is normally no need to specify it explicitly, because nginx will[m
[31m-by default use the most efficient method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 user[m
[31m-[m
[31m-[m
[31m-B<syntax:> user I<I<C<user>> [I<C<group>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<nobody nobody>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines I<C<user>> and I<C<group>>[m
[31m-credentials used by worker processes.[m
[31m-If I<C<group>> is omitted, a group whose name equals[m
[31m-that of I<C<user>> is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_aio_requests[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_aio_requests I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using L<ngx_http_core_module>[m
[31m-with the L<events>[m
[31m-connection processing method, sets the maximum I<C<number>> of[m
[31m-outstanding asynchronous IE<sol>O operations[m
[31m-for a single worker process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_connections[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_connections I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum number of simultaneous connections that[m
[31m-can be opened by a worker process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be kept in mind that this number includes all connections[m
[31m-(e.g. connections with proxied servers, among others),[m
[31m-not only connections with clients.[m
[31m-Another consideration is that the actual number of simultaneous[m
[31m-connections cannot exceed the current limit on[m
[31m-the maximum number of open files, which can be changed by[m
[31m-L</worker_rlimit_nofile>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_cpu_affinity[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_cpu_affinity I<I<C<cpumask>> ...>[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_cpu_affinity I<C<auto> [I<C<cpumask>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Binds worker processes to the sets of CPUs.[m
[31m-Each CPU set is represented by a bitmask of allowed CPUs.[m
[31m-There should be a separate set defined for each of the worker processes.[m
[31m-By default, worker processes are not bound to any specific CPUs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-    [m
[31m-    worker_processes    4;[m
[31m-    worker_cpu_affinity 0001 0010 0100 1000;[m
[31m-[m
[31m-[m
[31m-binds each worker process to a separate CPU, while[m
[31m-[m
[31m-    [m
[31m-    worker_processes    2;[m
[31m-    worker_cpu_affinity 0101 1010;[m
[31m-[m
[31m-[m
[31m-binds the first worker process to CPU0E<sol>CPU2,[m
[31m-and the second worker process to CPU1E<sol>CPU3.[m
[31m-The second example is suitable for hyper-threading.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<auto> (1.9.10) allows[m
[31m-binding worker processes automatically to available CPUs:[m
[31m-[m
[31m-    [m
[31m-    worker_processes auto;[m
[31m-    worker_cpu_affinity auto;[m
[31m-[m
[31m-[m
[31m-The optional mask parameter can be used to limit the CPUs[m
[31m-available for automatic binding:[m
[31m-[m
[31m-    [m
[31m-    worker_cpu_affinity auto 01010101;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The directive is only available on FreeBSD and Linux.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_priority[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_priority I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the scheduling priority for worker processes like it is[m
[31m-done by the C<nice> command: a negative[m
[31m-I<C<number>>[m
[31m-means higher priority.[m
[31m-Allowed range normally varies from -20 to 20.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    worker_priority -10;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_processes[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_processes I<I<C<number>> E<verbar> C<auto>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the number of worker processes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The optimal value depends on many factors including (but not[m
[31m-limited to) the number of CPU cores, the number of hard disk[m
[31m-drives that store data, and load pattern.[m
[31m-When one is in doubt, setting it to the number of available CPU cores[m
[31m-would be a good start (the value “C<auto>”[m
[31m-will try to autodetect it).[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The C<auto> parameter is supported starting from[m
[31m-versions 1.3.8 and 1.2.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_rlimit_core[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_rlimit_core I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Changes the limit on the largest size of a core file[m
[31m-(C<RLIMIT_CORE>) for worker processes.[m
[31m-Used to increase the limit without restarting the main process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_rlimit_nofile[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_rlimit_nofile I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Changes the limit on the maximum number of open files[m
[31m-(C<RLIMIT_NOFILE>) for worker processes.[m
[31m-Used to increase the limit without restarting the main process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 working_directory[m
[31m-[m
[31m-[m
[31m-B<syntax:> working_directory I<I<C<directory>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the current working directory for a worker process.[m
[31m-It is primarily used when writing a core-file, in which case[m
[31m-a worker process should have write permission for the[m
[31m-specified directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_access_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_access_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 7cf9d60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_access_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_access_module - Module ngx_http_access_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_access_module> module allows[m
[31m-limiting access to certain client addresses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Access can also be limited by[m
[31m-L<password|ngx_http_auth_basic_module> or by the[m
[31m-L<result of subrequest|ngx_http_auth_request_module>.[m
[31m-Simultaneous limitation of access by address and by password is controlled[m
[31m-by the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        deny  192.168.1.1;[m
[31m-        allow 192.168.1.0/24;[m
[31m-        allow 10.1.1.0/16;[m
[31m-        allow 2001:0db8::/32;[m
[31m-        deny  all;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The rules are checked in sequence until the first match is found.[m
[31m-In this example, access is allowed only for IPv4 networks[m
[31m-C<10.1.1.0E<sol>16> and C<192.168.1.0E<sol>24>[m
[31m-excluding the address C<192.168.1.1>,[m
[31m-and for IPv6 network C<2001:0db8::E<sol>32>.[m
[31m-In case of a lot of rules, the use of the[m
[31m-L<ngx_http_geo_module|ngx_http_geo_module>[m
[31m-module variables is preferable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 allow[m
[31m-[m
[31m-[m
[31m-B<syntax:> allow I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:> E<verbar>[m
[31m-    C<all>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows access for the specified network or address.[m
[31m-If the special value C<unix:> is specified (1.5.1),[m
[31m-allows access for all UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 deny[m
[31m-[m
[31m-[m
[31m-B<syntax:> deny I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:> E<verbar>[m
[31m-    C<all>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Denies access for the specified network or address.[m
[31m-If the special value C<unix:> is specified (1.5.1),[m
[31m-denies access for all UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_addition_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_addition_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 674ee3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_addition_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_addition_module - Module ngx_http_addition_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_addition_module> module is a filter[m
[31m-that adds text before and after a response.[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_addition_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        add_before_body /before_action;[m
[31m-        add_after_body  /after_action;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 add_before_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> add_before_body I<I<C<uri>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the text returned as a result of processing a given subrequest[m
[31m-before the response body.[m
[31m-An empty string (C<"">) as a parameter cancels addition[m
[31m-inherited from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 add_after_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> add_after_body I<I<C<uri>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the text returned as a result of processing a given subrequest[m
[31m-after the response body.[m
[31m-An empty string (C<"">) as a parameter cancels addition[m
[31m-inherited from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 addition_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> addition_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows adding text in responses with the specified MIME types,[m
[31m-in addition to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_auth_basic_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_auth_basic_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 5b0fd88..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_auth_basic_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,179 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_auth_basic_module - Module ngx_http_auth_basic_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_auth_basic_module> module allows[m
[31m-limiting access to resources by validating the user name and password[m
[31m-using the “HTTP Basic Authentication” protocol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Access can also be limited by[m
[31m-L<address|ngx_http_access_module> or by the[m
[31m-L<result of subrequest|ngx_http_auth_request_module>.[m
[31m-Simultaneous limitation of access by address and by password is controlled[m
[31m-by the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        auth_basic           "closed site";[m
[31m-        auth_basic_user_file conf/htpasswd;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 auth_basic[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_basic I<I<C<string>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables validation of user name and password using the[m
[31m-“HTTP Basic Authentication” protocol.[m
[31m-The specified parameter is used as a I<C<realm>>.[m
[31m-Parameter value can contain variables (1.3.10, 1.2.7).[m
[31m-The special value C<off> allows cancelling the effect[m
[31m-of the C<auth_basic> directive[m
[31m-inherited from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_basic_user_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_basic_user_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a file that keeps user names and passwords,[m
[31m-in the following format:[m
[31m-[m
[31m-    [m
[31m-    # comment[m
[31m-    name1:password1[m
[31m-    name2:password2:comment[m
[31m-    name3:password3[m
[31m-[m
[31m-[m
[31m-The I<C<file>> name can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following password types are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-encrypted with the C<crypt> function; can be generated using[m
[31m-the “C<htpasswd>” utility from the Apache HTTP Server[m
[31m-distribution or the “C<openssl passwd>” command;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-hashed with the Apache variant of the MD5-based password algorithm (apr1);[m
[31m-can be generated with the same tools;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-specified by the[m
[31m-“C<{>I<C<scheme>>C<}>I<C<data>>”[m
[31m-syntax (1.0.3+) as described in[m
[31m-L<RFC 2307|http://tools.ietf.org/html/rfc2307#section-5.3>;[m
[31m-currently implemented schemes include C<PLAIN> (an example one,[m
[31m-should not be used), C<SHA> (1.3.13) (plain SHA-1[m
[31m-hashing, should not be used) and C<SSHA> (salted SHA-1 hashing,[m
[31m-used by some software packages, notably OpenLDAP and Dovecot).[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Support for C<SHA> scheme was added only to aid[m
[31m-in migration from other web servers.[m
[31m-It should not be used for new passwords, since unsalted SHA-1 hashing[m
[31m-that it employs is vulnerable to[m
[31m-L<rainbow table|http://en.wikipedia.org/wiki/Rainbow_attack>[m
[31m-attacks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_auth_request_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_auth_request_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a32518d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_auth_request_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_auth_request_module - Module ngx_http_auth_request_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_auth_request_module> module (1.5.4+) implements[m
[31m-client authorization based on the result of a subrequest.[m
[31m-If the subrequest returns a 2xx response code, the access is allowed.[m
[31m-If it returns 401 or 403,[m
[31m-the access is denied with the corresponding error code.[m
[31m-Any other response code returned by the subrequest is considered an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the 401 error, the client also receives the[m
[31m-C<WWW-Authenticate> header from the subrequest response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_auth_request_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module may be combined with[m
[31m-other access modules, such as[m
[31m-L<ngx_http_access_module|ngx_http_access_module> and[m
[31m-L<ngx_http_auth_basic_module|ngx_http_auth_basic_module>,[m
[31m-via the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.7.3, responses to authorization subrequests could not be cached[m
[31m-(using L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_proxy_module>, etc.).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /private/ {[m
[31m-        auth_request /auth;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    location = /auth {[m
[31m-        proxy_pass ...[m
[31m-        proxy_pass_request_body off;[m
[31m-        proxy_set_header Content-Length "";[m
[31m-        proxy_set_header X-Original-URI $request_uri;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 auth_request[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_request I<I<C<uri>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables authorization based on the result of a subrequest and sets[m
[31m-the URI to which the subrequest will be sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_request_set[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_request_set I<I<C<variable>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the request I<C<variable>> to the given[m
[31m-I<C<value>> after the authorization request completes.[m
[31m-The value may contain variables from the authorization request,[m
[31m-such as C<$upstream_http_*>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_autoindex_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_autoindex_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 49f16f2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_autoindex_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_autoindex_module - Module ngx_http_autoindex_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_autoindex_module> module processes requests[m
[31m-ending with the slash character (‘C<E<sol>>’) and produces[m
[31m-a directory listing.[m
[31m-Usually a request is passed to the C<ngx_http_autoindex_module>[m
[31m-module when the[m
[31m-L<ngx_http_index_module|ngx_http_index_module> module[m
[31m-cannot find an index file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        autoindex on;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 autoindex[m
[31m-[m
[31m-[m
[31m-B<syntax:> autoindex I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the directory listing output.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 autoindex_exact_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> autoindex_exact_size I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the HTML format,[m
[31m-specifies whether exact file sizes should be output in the directory listing,[m
[31m-or rather rounded to kilobytes, megabytes, and gigabytes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 autoindex_format[m
[31m-[m
[31m-[m
[31m-B<syntax:> autoindex_format I<[m
[31m-    C<html> E<verbar>[m
[31m-    C<xml> E<verbar>[m
[31m-    C<json> E<verbar>[m
[31m-    C<jsonp>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the format of a directory listing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the JSONP format is used, the name of a callback function is set[m
[31m-with the C<callback> request argument.[m
[31m-If the argument is missing or has an empty value,[m
[31m-then the JSON format is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The XML output can be transformed using the[m
[31m-L<ngx_http_xslt_module|ngx_http_xslt_module> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 autoindex_localtime[m
[31m-[m
[31m-[m
[31m-B<syntax:> autoindex_localtime I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the HTML format,[m
[31m-specifies whether times in the directory listing should be[m
[31m-output in the local time zone or UTC.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_browser_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_browser_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 19fa40c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_browser_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,247 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_browser_module - Module ngx_http_browser_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_browser_module> module creates variables[m
[31m-whose values depend on the value of the C<User-Agent>[m
[31m-request header field:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$modern_browser>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-equals the value set by the L</modern_browser_value> directive,[m
[31m-if a browser was identified as modern;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ancient_browser>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-equals the value set by the L</ancient_browser_value> directive,[m
[31m-if a browser was identified as ancient;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$msie>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-equals “1” if a browser was identified as MSIE of any version.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-Choosing an index file:[m
[31m-[m
[31m-    [m
[31m-    modern_browser_value "modern.";[m
[31m-    [m
[31m-    modern_browser msie      5.5;[m
[31m-    modern_browser gecko     1.0.0;[m
[31m-    modern_browser opera     9.0;[m
[31m-    modern_browser safari    413;[m
[31m-    modern_browser konqueror 3.0;[m
[31m-    [m
[31m-    index index.${modern_browser}html index.html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Redirection for old browsers:[m
[31m-[m
[31m-    [m
[31m-    modern_browser msie      5.0;[m
[31m-    modern_browser gecko     0.9.1;[m
[31m-    modern_browser opera     8.0;[m
[31m-    modern_browser safari    413;[m
[31m-    modern_browser konqueror 3.0;[m
[31m-    [m
[31m-    modern_browser unlisted;[m
[31m-    [m
[31m-    ancient_browser Links Lynx netscape4;[m
[31m-    [m
[31m-    if ($ancient_browser) {[m
[31m-        rewrite ^ /ancient.html;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ancient_browser[m
[31m-[m
[31m-[m
[31m-B<syntax:> ancient_browser I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any of the specified substrings is found in the C<User-Agent>[m
[31m-request header field, the browser will be considered ancient.[m
[31m-The special string “C<netscape4>” corresponds to the[m
[31m-regular expression “C<^MozillaE<sol>[1-4]>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ancient_browser_value[m
[31m-[m
[31m-[m
[31m-B<syntax:> ancient_browser_value I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a value for the C<$ancient_browser> variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 modern_browser[m
[31m-[m
[31m-[m
[31m-B<syntax:> modern_browser I<I<C<browser>> I<C<version>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> modern_browser I<C<unlisted>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a version starting from which a browser is considered modern.[m
[31m-A browser can be any one of the following: C<msie>,[m
[31m-C<gecko> (browsers based on Mozilla),[m
[31m-C<opera>, C<safari>,[m
[31m-or C<konqueror>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Versions can be specified in the following formats: X, X.X, X.X.X, or X.X.X.X.[m
[31m-The maximum values for each of the format are[m
[31m-4000, 4000.99, 4000.99.99, and 4000.99.99.99, respectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<unlisted> specifies to consider[m
[31m-a browser as modern if it was not listed by the[m
[31m-C<modern_browser> and L</ancient_browser>[m
[31m-directives.[m
[31m-Otherwise such a browser is considered ancient.[m
[31m-If a request does not provide the C<User-Agent> field[m
[31m-in the header, the browser is treated as not being listed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 modern_browser_value[m
[31m-[m
[31m-[m
[31m-B<syntax:> modern_browser_value I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a value for the C<$modern_browser> variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_charset_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_charset_module.pod[m
[1mdeleted file mode 100644[m
[1mindex c460729..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_charset_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,343 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_charset_module - Module ngx_http_charset_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_charset_module> module adds the specified[m
[31m-charset to the C<Content-Type> response header field.[m
[31m-In addition, the module can convert data from one charset to another,[m
[31m-with some limitations:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-conversion is performed one way — from server to client,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-only single-byte charsets can be converted[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-or single-byte charsets toE<sol>from UTF-8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    include        conf/koi-win;[m
[31m-    [m
[31m-    charset        windows-1251;[m
[31m-    source_charset koi8-r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 charset[m
[31m-[m
[31m-[m
[31m-B<syntax:> charset I<I<C<charset>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the specified charset to the C<Content-Type>[m
[31m-response header field.[m
[31m-If this charset is different from the charset specified[m
[31m-in the L</source_charset> directive, a conversion is performed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The parameter C<off> cancels the addition of charset[m
[31m-to the C<Content-Type> response header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A charset can be defined with a variable:[m
[31m-[m
[31m-    [m
[31m-    charset $charset;[m
[31m-[m
[31m-[m
[31m-In such a case, all possible values of a variable need to be present[m
[31m-in the configuration at least once in the form of the[m
[31m-L</charset_map>, L</charset>, or[m
[31m-L</source_charset> directives.[m
[31m-For C<utf-8>, C<windows-1251>, and[m
[31m-C<koi8-r> charsets, it is sufficient to include the files[m
[31m-F<confE<sol>koi-win>, F<confE<sol>koi-utf>, and[m
[31m-F<confE<sol>win-utf> into configuration.[m
[31m-For other charsets, simply making a fictitious conversion table works,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    charset_map iso-8859-5 _ { }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, a charset can be set in the[m
[31m-C<X-Accel-Charset> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 charset_map[m
[31m-[m
[31m-[m
[31m-B<syntax:> charset_map I<I<C<charset1>> I<C<charset2>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Describes the conversion table from one charset to another.[m
[31m-A reverse conversion table is built using the same data.[m
[31m-Character codes are given in hexadecimal.[m
[31m-Missing characters in the range 80-FF are replaced with “C<?>”.[m
[31m-When converting from UTF-8, characters missing in a one-byte charset[m
[31m-are replaced with “C<E<amp>#XXXX;>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    charset_map koi8-r windows-1251 {[m
[31m-        C0 FE ; # small yu[m
[31m-        C1 E0 ; # small a[m
[31m-        C2 E1 ; # small b[m
[31m-        C3 F6 ; # small ts[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When describing a conversion table to UTF-8, codes for the UTF-8 charset should[m
[31m-be given in the second column, for example:[m
[31m-[m
[31m-    [m
[31m-    charset_map koi8-r utf-8 {[m
[31m-        C0 D18E ; # small yu[m
[31m-        C1 D0B0 ; # small a[m
[31m-        C2 D0B1 ; # small b[m
[31m-        C3 D186 ; # small ts[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Full conversion tables from C<koi8-r> to[m
[31m-C<windows-1251>, and from C<koi8-r> and[m
[31m-C<windows-1251> to C<utf-8>[m
[31m-are provided in the distribution files F<confE<sol>koi-win>,[m
[31m-F<confE<sol>koi-utf>, and F<confE<sol>win-utf>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 charset_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> charset_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html textE<sol>xml textE<sol>plain textE<sol>vnd.wap.wml[m
[31m-applicationE<sol>javascript applicationE<sol>rss+xml>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables module processing in responses with the specified MIME types[m
[31m-in addition to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Until version 1.5.4, “C<applicationE<sol>x-javascript>” was used[m
[31m-as the default MIME type instead of “C<applicationE<sol>javascript>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 override_charset[m
[31m-[m
[31m-[m
[31m-B<syntax:> override_charset I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether a conversion should be performed for answers[m
[31m-received from a proxied or a FastCGIE<sol>uwsgiE<sol>SCGI server[m
[31m-when the answers already carry a charset in the C<Content-Type>[m
[31m-response header field.[m
[31m-If conversion is enabled, a charset specified in the received[m
[31m-response is used as a source charset.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-It should be noted that if a response is received in a subrequest[m
[31m-then the conversion from the response charset to the main request charset[m
[31m-is always performed, regardless of the C<override_charset>[m
[31m-directive setting.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 source_charset[m
[31m-[m
[31m-[m
[31m-B<syntax:> source_charset I<I<C<charset>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the source charset of a response.[m
[31m-If this charset is different from the charset specified[m
[31m-in the L</charset> directive, a conversion is performed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_core_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_core_module.pod[m
[1mdeleted file mode 100644[m
[1mindex ca6a160..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_core_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,4894 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_core_module - Module ngx_http_core_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 aio[m
[31m-[m
[31m-[m
[31m-B<syntax:> aio I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    C<threads>[C<=>I<C<pool>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of asynchronous file IE<sol>O (AIO)[m
[31m-on FreeBSD and Linux:[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        aio            on;[m
[31m-        output_buffers 1 64k;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On FreeBSD, AIO can be used starting from FreeBSDE<nbsp>4.3.[m
[31m-AIO can either be linked statically into a kernel:[m
[31m-[m
[31m-    [m
[31m-    options VFS_AIO[m
[31m-[m
[31m-[m
[31m-or loaded dynamically as a kernel loadable module:[m
[31m-[m
[31m-    [m
[31m-    kldload aio[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On Linux, AIO can be used starting from kernel version 2.6.22.[m
[31m-Also, it is necessary to enable[m
[31m-L</directio>,[m
[31m-or otherwise reading will be blocking:[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        aio            on;[m
[31m-        directio       512;[m
[31m-        output_buffers 1 128k;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On Linux,[m
[31m-L</directio>[m
[31m-can only be used for reading blocks that are aligned on 512-byte[m
[31m-boundaries (or 4K for XFS).[m
[31m-File’s unaligned end is read in blocking mode.[m
[31m-The same holds true for byte range requests and for FLV requests[m
[31m-not from the beginning of a file: reading of unaligned data at the[m
[31m-beginning and end of a file will be blocking.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When both AIO and L</sendfile> are enabled on Linux,[m
[31m-AIO is used for files that are larger than or equal to[m
[31m-the size specified in the L</directio> directive,[m
[31m-while L</sendfile> is used for files of smaller sizes[m
[31m-or when L</directio> is disabled.[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        sendfile       on;[m
[31m-        aio            on;[m
[31m-        directio       8m;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Finally, files can be read and sent[m
[31m-using multi-threading (1.7.11),[m
[31m-without blocking a worker process:[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        sendfile       on;[m
[31m-        aio            threads;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Read and send file operations are offloaded to threads of the specified[m
[31m-L<pool|ngx_core_module>.[m
[31m-If the pool name is omitted,[m
[31m-the pool with the name “C<default>” is used.[m
[31m-The pool name can also be set with variables:[m
[31m-[m
[31m-    [m
[31m-    aio threads=pool$disk;[m
[31m-[m
[31m-[m
[31m-By default, multi-threading is disabled, it should be[m
[31m-enabled with the[m
[31m-C<--with-threads> configuration parameter.[m
[31m-Currently, multi-threading is compatible only with the[m
[31m-L<events>,[m
[31m-L<events>,[m
[31m-and[m
[31m-L<events> methods.[m
[31m-Multi-threaded sending of files is only supported on Linux.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the L</sendfile> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 aio_write[m
[31m-[m
[31m-[m
[31m-B<syntax:> aio_write I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If L</aio> is enabled, specifies whether it is used for writing files.[m
[31m-Currently, this only works when using[m
[31m-C<aio threads>[m
[31m-and is limited to writing temporary files[m
[31m-with data received from proxied servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 alias[m
[31m-[m
[31m-[m
[31m-B<syntax:> alias I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a replacement for the specified location.[m
[31m-For example, with the following configuration[m
[31m-[m
[31m-    [m
[31m-    location /i/ {[m
[31m-        alias /data/w3/images/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-on request of[m
[31m-“C<E<sol>iE<sol>top.gif>”, the file[m
[31m-F<E<sol>dataE<sol>w3E<sol>imagesE<sol>top.gif> will be sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<path>> value can contain variables,[m
[31m-except C<$document_root> and C<$realpath_root>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<alias> is used inside a location defined[m
[31m-with a regular expression then such regular expression should[m
[31m-contain captures and C<alias> should refer to[m
[31m-these captures (0.7.40), for example:[m
[31m-[m
[31m-    [m
[31m-    location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {[m
[31m-        alias /data/w3/images/$1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When location matches the last part of the directive’s value:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        alias /data/w3/images/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-it is better to use the[m
[31m-L</root>[m
[31m-directive instead:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root /data/w3;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 chunked_transfer_encoding[m
[31m-[m
[31m-[m
[31m-B<syntax:> chunked_transfer_encoding I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows disabling chunked transfer encoding in HTTPE<sol>1.1.[m
[31m-It may come in handy when using a software failing to support[m
[31m-chunked encoding despite the standard’s requirement.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_buffer_size[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets buffer size for reading client request body.[m
[31m-In case the request body is larger than the buffer,[m
[31m-the whole body or only its part is written to a[m
[31m-temporary file.[m
[31m-By default, buffer size is equal to two memory pages.[m
[31m-This is 8K on x86, other 32-bit platforms, and x86-64.[m
[31m-It is usually 16K on other 64-bit platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_in_file_only[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_in_file_only I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<clean> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether nginx should save the entire client request body[m
[31m-into a file.[m
[31m-This directive can be used during debugging, or when using the[m
[31m-C<$request_body_file>[m
[31m-variable, or the[m
[31m-L<$r-E<gt>request_body_file|ngx_http_perl_module>[m
[31m-method of the module[m
[31m-L<ngx_http_perl_module|ngx_http_perl_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When set to the value C<on>, temporary files are not[m
[31m-removed after request processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value C<clean> will cause the temporary files[m
[31m-left after request processing to be removed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_in_single_buffer[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_in_single_buffer I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether nginx should save the entire client request body[m
[31m-in a single buffer.[m
[31m-The directive is recommended when using the[m
[31m-C<$request_body>[m
[31m-variable, to save the number of copy operations involved.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<client_body_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files holding client request bodies.[m
[31m-Up to three-level subdirectory hierarchy can be used under the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    client_body_temp_path /spool/nginx/client_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a path to a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/client_temp/7/45/00000123457[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading client request body.[m
[31m-The timeout is set only for a period between two successive read operations,[m
[31m-not for the transmission of the whole request body.[m
[31m-If a client does not transmit anything within this time, the[m
[31m-C<408> (C<Request Time-out>)[m
[31m-error is returned to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_header_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_header_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets buffer size for reading client request header.[m
[31m-For most requests, a buffer of 1K bytes is enough.[m
[31m-However, if a request includes long cookies, or comes from a WAP client,[m
[31m-it may not fit into 1K.[m
[31m-If a request line or a request header field does not fit into[m
[31m-this buffer then larger buffers, configured by the[m
[31m-L</large_client_header_buffers> directive,[m
[31m-are allocated.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_header_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_header_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading client request header.[m
[31m-If a client does not transmit the entire header within this time, the[m
[31m-C<408> (C<Request Time-out>)[m
[31m-error is returned to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_max_body_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_max_body_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum allowed size of the client request body,[m
[31m-specified in the[m
[31m-C<Content-Length>[m
[31m-request header field.[m
[31m-If the size in a request exceeds the configured value, the[m
[31m-C<413> (C<Request Entity Too Large>)[m
[31m-error is returned to the client.[m
[31m-Please be aware that[m
[31m-browsers cannot correctly display[m
[31m-this error.[m
[31m-Setting I<C<size>> to 0 disables checking of client[m
[31m-request body size.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 connection_pool_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> connection_pool_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<256E<verbar>512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows accurate tuning of per-connection memory allocations.[m
[31m-This directive has minimal impact on performance[m
[31m-and should not generally be used.[m
[31m-By default, the size is equal to[m
[31m-256 bytes on 32-bit platforms and 512 bytes on 64-bit platforms.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.9.8, the default value was 256 on all platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 default_type[m
[31m-[m
[31m-[m
[31m-B<syntax:> default_type I<I<C<mime-type>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>plain>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the default MIME type of a response.[m
[31m-Mapping of file name extensions to MIME types can be set[m
[31m-with the L</types> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 directio[m
[31m-[m
[31m-[m
[31m-B<syntax:> directio I<I<C<size>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the use of[m
[31m-the C<O_DIRECT> flag (FreeBSD, Linux),[m
[31m-the C<F_NOCACHE> flag (Mac OS X),[m
[31m-or the C<directio> function (Solaris),[m
[31m-when reading files that are larger than or equal to[m
[31m-the specified I<C<size>>.[m
[31m-The directive automatically disables (0.7.15) the use of[m
[31m-L</sendfile>[m
[31m-for a given request.[m
[31m-It can be useful for serving large files:[m
[31m-[m
[31m-    [m
[31m-    directio 4m;[m
[31m-[m
[31m-[m
[31m-or when using L</aio> on Linux.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 directio_alignment[m
[31m-[m
[31m-[m
[31m-B<syntax:> directio_alignment I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the alignment for[m
[31m-L</directio>.[m
[31m-In most cases, a 512-byte alignment is enough.[m
[31m-However, when using XFS under Linux, it needs to be increased to 4K.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 disable_symlinks[m
[31m-[m
[31m-[m
[31m-B<syntax:> disable_symlinks I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> disable_symlinks I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<if_not_owner>[m
[31m-    [C<from>=I<C<part>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines how symbolic links should be treated when opening files:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Symbolic links in the pathname are allowed and not checked.[m
[31m-This is the default behavior.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<on>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any component of the pathname is a symbolic link,[m
[31m-access to a file is denied.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<if_not_owner>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Access to a file is denied if any component of the pathname[m
[31m-is a symbolic link, and the link and object that the link[m
[31m-points to have different owners.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<from>=I<C<part>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When checking symbolic links[m
[31m-(parameters C<on> and C<if_not_owner>),[m
[31m-all components of the pathname are normally checked.[m
[31m-Checking of symbolic links in the initial part of the pathname[m
[31m-may be avoided by specifying additionally the[m
[31m-C<from>=I<C<part>> parameter.[m
[31m-In this case, symbolic links are checked only from[m
[31m-the pathname component that follows the specified initial part.[m
[31m-If the value is not an initial part of the pathname checked, the whole[m
[31m-pathname is checked as if this parameter was not specified at all.[m
[31m-If the value matches the whole file name,[m
[31m-symbolic links are not checked.[m
[31m-The parameter value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    disable_symlinks on from=$document_root;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is only available on systems that have the[m
[31m-C<openat> and C<fstatat> interfaces.[m
[31m-Such systems include modern versions of FreeBSD, Linux, and Solaris.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters C<on> and C<if_not_owner>[m
[31m-add a processing overhead.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-On systems that do not support opening of directories only for search,[m
[31m-to use these parameters it is required that worker processes[m
[31m-have read permissions for all directories being checked.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The[m
[31m-L<ngx_http_autoindex_module|ngx_http_autoindex_module>,[m
[31m-L<ngx_http_random_index_module|ngx_http_random_index_module>,[m
[31m-and L<ngx_http_dav_module|ngx_http_dav_module>[m
[31m-modules currently ignore this directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 error_page[m
[31m-[m
[31m-[m
[31m-B<syntax:> error_page I<[m
[31m-    I<C<code>> ...[m
[31m-    [C<=>[I<C<response>>]][m
[31m-    I<C<uri>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the URI that will be shown for the specified errors.[m
[31m-C<error_page> directives are inherited from the previous[m
[31m-level only if there are no C<error_page>[m
[31m-directives defined on the current level.[m
[31m-A C<uri> value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    error_page 404             /404.html;[m
[31m-    error_page 500 502 503 504 /50x.html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Furthermore, it is possible to change the response code to another[m
[31m-using the “C<=>I<C<response>>” syntax, for example:[m
[31m-[m
[31m-    [m
[31m-    error_page 404 =200 /empty.gif;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If an error response is processed by a proxied server[m
[31m-or a FastCGIE<sol>uwsgiE<sol>SCGI server,[m
[31m-and the server may return different response codes (e.g., 200, 302, 401[m
[31m-or 404), it is possible to respond with the code it returns:[m
[31m-[m
[31m-    [m
[31m-    error_page 404 = /404.php;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to use redirects for error processing:[m
[31m-[m
[31m-    [m
[31m-    error_page 403      http://example.com/forbidden.html;[m
[31m-    error_page 404 =301 http://example.com/notfound.html;[m
[31m-[m
[31m-[m
[31m-In this case, by default, the response code 302 is returned to the client.[m
[31m-It can only be changed to one of the redirect status[m
[31m-codes (301, 302, 303, and 307).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If there is no need to change URI during internal redirection it is[m
[31m-possible to pass error processing into a named location:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        error_page 404 = @fallback;[m
[31m-    }[m
[31m-    [m
[31m-    location @fallback {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-If C<uri> processing leads to an error,[m
[31m-the status code of the last occurred error is returned to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 etag[m
[31m-[m
[31m-[m
[31m-B<syntax:> etag I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables automatic generation of the C<ETag>[m
[31m-response header field for static resources.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http[m
[31m-[m
[31m-[m
[31m-http { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Provides the configuration file context in which the HTTP server directives[m
[31m-are specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 if_modified_since[m
[31m-[m
[31m-[m
[31m-B<syntax:> if_modified_since I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<exact> E<verbar>[m
[31m-    C<before>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<exact>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.24.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies how to compare modification time of a response[m
[31m-with the time in the[m
[31m-C<If-Modified-Since>[m
[31m-request header field:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the[m
[31m-C<If-Modified-Since> request header field is ignored (0.7.34);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<exact>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-exact match;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<before>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-modification time of a response is[m
[31m-less than or equal to the time in the C<If-Modified-Since>[m
[31m-request header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ignore_invalid_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ignore_invalid_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Controls whether header fields with invalid names should be ignored.[m
[31m-Valid names are composed of English letters, digits, hyphens, and possibly[m
[31m-underscores (as controlled by the L</underscores_in_headers>[m
[31m-directive).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is specified on the L</server> level,[m
[31m-its value is only used if a server is a default one.[m
[31m-The value specified also applies to all virtual servers[m
[31m-listening on the same address and port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 internal[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a given location can only be used for internal requests.[m
[31m-For external requests, the client error[m
[31m-C<404> (C<Not Found>)[m
[31m-is returned.[m
[31m-Internal requests are the following:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-requests redirected by the[m
[31m-L</error_page>,[m
[31m-L<ngx_http_index_module>,[m
[31m-L<ngx_http_random_index_module>, and[m
[31m-L</try_files> directives;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-requests redirected by the C<X-Accel-Redirect>[m
[31m-response header field from an upstream server;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-subrequests formed by the[m
[31m-“C<include virtual>”[m
[31m-command of the[m
[31m-L<ngx_http_ssi_module|ngx_http_ssi_module>[m
[31m-module and by the[m
[31m-L<ngx_http_addition_module|ngx_http_addition_module>[m
[31m-module directives;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-requests changed by the[m
[31m-L<ngx_http_rewrite_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    error_page 404 /404.html;[m
[31m-    [m
[31m-    location /404.html {[m
[31m-        internal;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-There is a limit of 10 internal redirects per request to prevent[m
[31m-request processing cycles that can occur in incorrect configurations.[m
[31m-If this limit is reached, the error[m
[31m-C<500> (C<Internal Server Error>) is returned.[m
[31m-In such cases, the “rewrite or internal redirection cycle” message[m
[31m-can be seen in the error log.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 keepalive_disable[m
[31m-[m
[31m-[m
[31m-B<syntax:> keepalive_disable I<C<none> E<verbar> I<C<browser>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<msie6>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables keep-alive connections with misbehaving browsers.[m
[31m-The I<C<browser>> parameters specify which[m
[31m-browsers will be affected.[m
[31m-The value C<msie6> disables keep-alive connections[m
[31m-with old versions of MSIE, once a POST request is received.[m
[31m-The value C<safari> disables keep-alive connections[m
[31m-with Safari and Safari-like browsers on Mac OS X and Mac OS X-like[m
[31m-operating systems.[m
[31m-The value C<none> enables keep-alive connections[m
[31m-with all browsers.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.1.18, the value C<safari> matched[m
[31m-all Safari and Safari-like browsers on all operating systems, and[m
[31m-keep-alive connections with them were disabled by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 keepalive_requests[m
[31m-[m
[31m-[m
[31m-B<syntax:> keepalive_requests I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<100>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum number of requests that can be[m
[31m-served through one keep-alive connection.[m
[31m-After the maximum number of requests are made, the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 keepalive_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> keepalive_timeout I<[m
[31m-    I<C<timeout>>[m
[31m-    [I<C<header_timeout>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<75s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first parameter sets a timeout during which a keep-alive[m
[31m-client connection will stay open on the server side.[m
[31m-The zero value disables keep-alive client connections.[m
[31m-The optional second parameter sets a value in the[m
[31m-C<Keep-Alive: timeout=I<C<time>>>[m
[31m-response header field.[m
[31m-Two parameters may differ.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The[m
[31m-C<Keep-Alive: timeout=I<C<time>>>[m
[31m-header field is recognized by Mozilla and Konqueror.[m
[31m-MSIE closes keep-alive connections by itself in about 60 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 large_client_header_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> large_client_header_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4 8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<number>> and I<C<size>> of[m
[31m-buffers used for reading large client request header.[m
[31m-A request line cannot exceed the size of one buffer, or the[m
[31m-C<414> (C<Request-URI Too Large>)[m
[31m-error is returned to the client.[m
[31m-A request header field cannot exceed the size of one buffer as well, or the[m
[31m-C<400> (C<Bad Request>)[m
[31m-error is returned to the client.[m
[31m-Buffers are allocated only on demand.[m
[31m-By default, the buffer size is equal to 8K bytes.[m
[31m-If after the end of request processing a connection is transitioned[m
[31m-into the keep-alive state, these buffers are released.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_except[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_except I<I<C<method>> ... { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits allowed HTTP methods inside a location.[m
[31m-The I<C<method>> parameter can be one of the following:[m
[31m-C<GET>,[m
[31m-C<HEAD>,[m
[31m-C<POST>,[m
[31m-C<PUT>,[m
[31m-C<DELETE>,[m
[31m-C<MKCOL>,[m
[31m-C<COPY>,[m
[31m-C<MOVE>,[m
[31m-C<OPTIONS>,[m
[31m-C<PROPFIND>,[m
[31m-C<PROPPATCH>,[m
[31m-C<LOCK>,[m
[31m-C<UNLOCK>,[m
[31m-or[m
[31m-C<PATCH>.[m
[31m-Allowing the C<GET> method makes the[m
[31m-C<HEAD> method also allowed.[m
[31m-Access to other methods can be limited using the[m
[31m-L<ngx_http_access_module|ngx_http_access_module>[m
[31m-and[m
[31m-L<ngx_http_auth_basic_module|ngx_http_auth_basic_module>[m
[31m-modules directives:[m
[31m-[m
[31m-    [m
[31m-    limit_except GET {[m
[31m-        allow 192.168.1.0/32;[m
[31m-        deny  all;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Please note that this will limit access to all methods[m
[31m-I<except> GET and HEAD.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the rate of response transmission to a client.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if a client simultaneously opens[m
[31m-two connections, the overall rate will be twice as much[m
[31m-as the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Rate limit can also be set in the C<$limit_rate> variable.[m
[31m-It may be useful in cases where rate should be limited[m
[31m-depending on a certain condition:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-    [m
[31m-        if ($slow) {[m
[31m-            set $limit_rate 4k;[m
[31m-        }[m
[31m-    [m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Rate limit can also be set in the[m
[31m-C<X-Accel-Limit-Rate> header field of a proxied server response.[m
[31m-This capability can be disabled using the[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_rate_after[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_rate_after I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the initial amount after which the further transmission[m
[31m-of a response to a client will be rate limited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    location /flv/ {[m
[31m-        flv;[m
[31m-        limit_rate_after 500k;[m
[31m-        limit_rate       50k;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lingering_close[m
[31m-[m
[31m-[m
[31m-B<syntax:> lingering_close I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<on> E<verbar>[m
[31m-    C<always>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Controls how nginx closes client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The default value “C<on>” instructs nginx to[m
[31m-wait for and[m
[31m-process additional data from a client[m
[31m-before fully closing a connection, but only[m
[31m-if heuristics suggests that a client may be sending more data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value “C<always>” will cause nginx to unconditionally[m
[31m-wait for and process additional client data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value “C<off>” tells nginx to never wait for[m
[31m-more data and close the connection immediately.[m
[31m-This behavior breaks the protocol and should not be used under normal[m
[31m-circumstances.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lingering_time[m
[31m-[m
[31m-[m
[31m-B<syntax:> lingering_time I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When L</lingering_close> is in effect,[m
[31m-this directive specifies the maximum time during which nginx[m
[31m-will process (read and ignore) additional data coming from a client.[m
[31m-After that, the connection will be closed, even if there will be[m
[31m-more data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lingering_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> lingering_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When L</lingering_close> is in effect, this directive specifies[m
[31m-the maximum waiting time for more client data to arrive.[m
[31m-If data are not received during this time, the connection is closed.[m
[31m-Otherwise, the data are read and ignored, and nginx starts waiting[m
[31m-for more data again.[m
[31m-The “wait-read-ignore” cycle is repeated, but no longer than specified by the[m
[31m-L</lingering_time> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 listen[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    I<C<address>>[:I<C<port>>][m
[31m-    [C<default_server>][m
[31m-    [C<ssl>][m
[31m-    [C<http2> E<verbar> C<spdy>][m
[31m-    [C<proxy_protocol>][m
[31m-    [C<setfib>=I<C<number>>][m
[31m-    [C<fastopen>=I<C<number>>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<rcvbuf>=I<C<size>>][m
[31m-    [C<sndbuf>=I<C<size>>][m
[31m-    [C<accept_filter>=I<C<filter>>][m
[31m-    [C<deferred>][m
[31m-    [C<bind>][m
[31m-    [C<ipv6only>=C<on>E<verbar>C<off>][m
[31m-    [C<reuseport>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    I<C<port>>[m
[31m-    [C<default_server>][m
[31m-    [C<ssl>][m
[31m-    [C<http2> E<verbar> C<spdy>][m
[31m-    [C<proxy_protocol>][m
[31m-    [C<setfib>=I<C<number>>][m
[31m-    [C<fastopen>=I<C<number>>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<rcvbuf>=I<C<size>>][m
[31m-    [C<sndbuf>=I<C<size>>][m
[31m-    [C<accept_filter>=I<C<filter>>][m
[31m-    [C<deferred>][m
[31m-    [C<bind>][m
[31m-    [C<ipv6only>=C<on>E<verbar>C<off>][m
[31m-    [C<reuseport>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    C<unix:>I<C<path>>[m
[31m-    [C<default_server>][m
[31m-    [C<ssl>][m
[31m-    [C<http2> E<verbar> C<spdy>][m
[31m-    [C<proxy_protocol>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<rcvbuf>=I<C<size>>][m
[31m-    [C<sndbuf>=I<C<size>>][m
[31m-    [C<accept_filter>=I<C<filter>>][m
[31m-    [C<deferred>][m
[31m-    [C<bind>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<*:80 E<verbar> *:8000>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<address>> and I<C<port>> for IP,[m
[31m-or the I<C<path>> for a UNIX-domain socket on which[m
[31m-the server will accept requests.[m
[31m-Both I<C<address>> and I<C<port>>,[m
[31m-or only I<C<address>> or only I<C<port>> can be specified.[m
[31m-An I<C<address>> may also be a hostname, for example:[m
[31m-[m
[31m-    [m
[31m-    listen 127.0.0.1:8000;[m
[31m-    listen 127.0.0.1;[m
[31m-    listen 8000;[m
[31m-    listen *:8000;[m
[31m-    listen localhost:8000;[m
[31m-[m
[31m-[m
[31m-IPv6 addresses (0.7.36) are specified in square brackets:[m
[31m-[m
[31m-    [m
[31m-    listen [::]:8000;[m
[31m-    listen [::1];[m
[31m-[m
[31m-[m
[31m-UNIX-domain sockets (0.8.21) are specified with the “C<unix:>”[m
[31m-prefix:[m
[31m-[m
[31m-    [m
[31m-    listen unix:/var/run/nginx.sock;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only I<C<address>> is given, the port 80 is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is not present then either C<*:80> is used[m
[31m-if nginx runs with the superuser privileges, or C<*:8000>[m
[31m-otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<default_server> parameter, if present,[m
[31m-will cause the server to become the default server for the specified[m
[31m-I<C<address>>:I<C<port>> pair.[m
[31m-If none of the directives have the C<default_server>[m
[31m-parameter then the first server with the[m
[31m-I<C<address>>:I<C<port>> pair will be[m
[31m-the default server for this pair.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In versions prior to 0.8.21 this parameter is named simply[m
[31m-C<default>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ssl> parameter (0.7.14) allows specifying that all[m
[31m-connections accepted on this port should work in SSL mode.[m
[31m-This allows for a more compact L<configuration|configuring_https_servers> for the server that[m
[31m-handles both HTTP and HTTPS requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<http2> parameter (1.9.5) configures the port to accept[m
[31m-L<HTTPE<sol>2|ngx_http_v2_module> connections.[m
[31m-Normally, for this to work the C<ssl> parameter should be[m
[31m-specified as well, but nginx can also be configured to accept HTTPE<sol>2[m
[31m-connections without SSL.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<spdy> parameter (1.3.15-1.9.4) allows accepting[m
[31m-L<SPDY|ngx_http_spdy_module> connections on this port.[m
[31m-Normally, for this to work the C<ssl> parameter should be[m
[31m-specified as well, but nginx can also be configured to accept SPDY[m
[31m-connections without SSL.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<proxy_protocol> parameter (1.5.12)[m
[31m-allows specifying that all connections accepted on this port should use the[m
[31m-L<PROXY[m
[31m-protocol|http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<listen> directive[m
[31m-can have several additional parameters specific to socket-related system calls.[m
[31m-These parameters can be specified in any[m
[31m-C<listen> directive, but only once for a given[m
[31m-I<C<address>>:I<C<port>> pair.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In versions prior to 0.8.21, they could only be[m
[31m-specified in the C<listen> directive together with the[m
[31m-C<default> parameter.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<setfib>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (0.8.44) sets the associated routing table, FIB[m
[31m-(the C<SO_SETFIB> option) for the listening socket.[m
[31m-This currently works only on FreeBSD.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fastopen>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables[m
[31m-“L<TCP Fast Open|http://en.wikipedia.org/wiki/TCP_Fast_Open>”[m
[31m-for the listening socket (1.5.8) and[m
[31m-L<limits|http://tools.ietf.org/html/rfc7413#section-5.1>[m
[31m-the maximum length for the queue of connections that have not yet completed[m
[31m-the three-way handshake.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Do not enable this feature unless the server can handle[m
[31m-receiving the[m
[31m-L<same SYN packet with data|http://tools.ietf.org/html/rfc7413#section-6.1> more than once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backlog>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the C<backlog> parameter in the[m
[31m-C<listen> call that limits[m
[31m-the maximum length for the queue of pending connections.[m
[31m-By default,[m
[31m-C<backlog> is set to -1 on FreeBSD, DragonFly BSD, and Mac OS X,[m
[31m-and to 511 on other platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<rcvbuf>=I<C<size>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the receive buffer size[m
[31m-(the C<SO_RCVBUF> option) for the listening socket.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<sndbuf>=I<C<size>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the send buffer size[m
[31m-(the C<SO_SNDBUF> option) for the listening socket.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<accept_filter>=I<C<filter>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the name of accept filter[m
[31m-(the C<SO_ACCEPTFILTER> option) for the listening socket[m
[31m-that filters incoming connections before passing them to[m
[31m-C<accept>.[m
[31m-This works only on FreeBSD and NetBSD 5.0+.[m
[31m-Possible values are[m
[31m-L<dataready|http://man.freebsd.org/accf_data>[m
[31m-and[m
[31m-L<httpready|http://man.freebsd.org/accf_http>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<deferred>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-instructs to use a deferred C<accept>[m
[31m-(the C<TCP_DEFER_ACCEPT> socket option) on Linux.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<bind>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-instructs to make a separate C<bind> call for a given[m
[31m-I<C<address>>:I<C<port>> pair.[m
[31m-This is useful because if there are several C<listen>[m
[31m-directives with the same port but different addresses, and one of the[m
[31m-C<listen> directives listens on all addresses[m
[31m-for the given port (C<*:>I<C<port>>), nginx[m
[31m-will C<bind> only to C<*:>I<C<port>>.[m
[31m-It should be noted that the C<getsockname> system call will be[m
[31m-made in this case to determine the address that accepted the connection.[m
[31m-If the C<setfib>,[m
[31m-C<backlog>, C<rcvbuf>,[m
[31m-C<sndbuf>, C<accept_filter>,[m
[31m-C<deferred>, C<ipv6only>,[m
[31m-or C<so_keepalive> parameters[m
[31m-are used then for a given[m
[31m-I<C<address>>:I<C<port>> pair[m
[31m-a separate C<bind> call will always be made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<ipv6only>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (0.7.42) determines[m
[31m-(via the C<IPV6_V6ONLY> socket option)[m
[31m-whether an IPv6 socket listening on a wildcard address C<[::]>[m
[31m-will accept only IPv6 connections or both IPv6 and IPv4 connections.[m
[31m-This parameter is turned on by default.[m
[31m-It can only be set once on start.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.3.4,[m
[31m-if this parameter was omitted then the operating system’s settings were[m
[31m-in effect for the socket.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<reuseport>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (1.9.1) instructs to create an individual listening socket[m
[31m-for each worker process[m
[31m-(using the C<SO_REUSEPORT> socket option), allowing a kernel[m
[31m-to distribute incoming connections between worker processes.[m
[31m-This currently works only on Linux 3.9+ and DragonFly BSD.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Inappropriate use of this option may have its security[m
[31m-L<implications|http://man7.org/linux/man-pages/man7/socket.7.html>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (1.1.11) configures the “TCP keepalive” behavior[m
[31m-for the listening socket.[m
[31m-If this parameter is omitted then the operating system’s settings will be[m
[31m-in effect for the socket.[m
[31m-If it is set to the value “C<on>”, the[m
[31m-C<SO_KEEPALIVE> option is turned on for the socket.[m
[31m-If it is set to the value “C<off>”, the[m
[31m-C<SO_KEEPALIVE> option is turned off for the socket.[m
[31m-Some operating systems support setting of TCP keepalive parameters on[m
[31m-a per-socket basis using the C<TCP_KEEPIDLE>,[m
[31m-C<TCP_KEEPINTVL>, and C<TCP_KEEPCNT> socket options.[m
[31m-On such systems (currently, Linux 2.4+, NetBSD 5+, and[m
[31m-FreeBSD 9.0-STABLE), they can be configured[m
[31m-using the I<C<keepidle>>, I<C<keepintvl>>, and[m
[31m-I<C<keepcnt>> parameters.[m
[31m-One or two parameters may be omitted, in which case the system default setting[m
[31m-for the corresponding socket option will be in effect.[m
[31m-For example,[m
[31m-[m
[31m-    so_keepalive=30m::10[m
[31m-[m
[31m-will set the idle timeout (C<TCP_KEEPIDLE>) to 30 minutes,[m
[31m-leave the probe interval (C<TCP_KEEPINTVL>) at its system default,[m
[31m-and set the probes count (C<TCP_KEEPCNT>) to 10 probes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 location[m
[31m-[m
[31m-[m
[31m-B<syntax:> location I<[[m
[31m-    C<=> E<verbar>[m
[31m-    C<~> E<verbar>[m
[31m-    C<~*> E<verbar>[m
[31m-    C<^~>[m
[31m-    ] I<C<uri>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-B<syntax:> location I<C<@>I<C<name>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets configuration depending on a request URI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The matching is performed against a normalized URI,[m
[31m-after decoding the text encoded in the “C<%XX>” form,[m
[31m-resolving references to relative path components “C<.>”[m
[31m-and “C<..>”, and possible[m
[31m-compression of two or more[m
[31m-adjacent slashes into a single slash.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A location can either be defined by a prefix string, or by a regular expression.[m
[31m-Regular expressions are specified with the preceding[m
[31m-“C<~*>” modifier (for case-insensitive matching), or the[m
[31m-“C<~>” modifier (for case-sensitive matching).[m
[31m-To find location matching a given request, nginx first checks[m
[31m-locations defined using the prefix strings (prefix locations).[m
[31m-Among them, the location with the longest matching[m
[31m-prefix is selected and remembered.[m
[31m-Then regular expressions are checked, in the order of their appearance[m
[31m-in the configuration file.[m
[31m-The search of regular expressions terminates on the first match,[m
[31m-and the corresponding configuration is used.[m
[31m-If no match with a regular expression is found then the[m
[31m-configuration of the prefix location remembered earlier is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<location> blocks can be nested, with some exceptions[m
[31m-mentioned below.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For case-insensitive operating systems such as Mac OS X and Cygwin,[m
[31m-matching with prefix strings ignores a case (0.7.7).[m
[31m-However, comparison is limited to one-byte locales.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Regular expressions can contain captures (0.7.40) that can later[m
[31m-be used in other directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the longest matching prefix location has the “C<^~>” modifier[m
[31m-then regular expressions are not checked.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Also, using the “C<=>” modifier it is possible to define[m
[31m-an exact match of URI and location.[m
[31m-If an exact match is found, the search terminates.[m
[31m-For example, if a “C<E<sol>>” request happens frequently,[m
[31m-defining “C<location = E<sol>>” will speed up the processing[m
[31m-of these requests, as search terminates right after the first[m
[31m-comparison.[m
[31m-Such a location cannot obviously contain nested locations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In versions from 0.7.1 to 0.8.41, if a request matched the prefix[m
[31m-location without the “C<=>” and “C<^~>”[m
[31m-modifiers, the search also terminated and regular expressions were[m
[31m-not checked.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Let’s illustrate the above by an example:[m
[31m-[m
[31m-    [m
[31m-    location = / {[m
[31m-        [ configuration A ][m
[31m-    }[m
[31m-    [m
[31m-    location / {[m
[31m-        [ configuration B ][m
[31m-    }[m
[31m-    [m
[31m-    location /documents/ {[m
[31m-        [ configuration C ][m
[31m-    }[m
[31m-    [m
[31m-    location ^~ /images/ {[m
[31m-        [ configuration D ][m
[31m-    }[m
[31m-    [m
[31m-    location ~* \.(gif|jpg|jpeg)$ {[m
[31m-        [ configuration E ][m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The “C<E<sol>>” request will match configuration A,[m
[31m-the “C<E<sol>index.html>” request will match configuration B,[m
[31m-the “C<E<sol>documentsE<sol>document.html>” request will match[m
[31m-configuration C,[m
[31m-the “C<E<sol>imagesE<sol>1.gif>” request will match configuration D, and[m
[31m-the “C<E<sol>documentsE<sol>1.jpg>” request will match configuration E.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The “C<@>” prefix defines a named location.[m
[31m-Such a location is not used for a regular request processing, but instead[m
[31m-used for request redirection.[m
[31m-They cannot be nested, and cannot contain nested locations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a location is defined by a prefix string that ends with the slash character,[m
[31m-and requests are processed by one of[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-L<ngx_http_scgi_module>, or[m
[31m-L<ngx_http_memcached_module>,[m
[31m-then the special processing is performed.[m
[31m-In response to a request with URI equal to this string,[m
[31m-but without the trailing slash,[m
[31m-a permanent redirect with the code 301 will be returned to the requested URI[m
[31m-with the slash appended.[m
[31m-If this is not desired, an exact match of the URI and location could be[m
[31m-defined like this:[m
[31m-[m
[31m-    [m
[31m-    location /user/ {[m
[31m-        proxy_pass http://user.example.com;[m
[31m-    }[m
[31m-    [m
[31m-    location = /user {[m
[31m-        proxy_pass http://login.example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_not_found[m
[31m-[m
[31m-[m
[31m-B<syntax:> log_not_found I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables logging of errors about not found files into[m
[31m-L<ngx_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_subrequest[m
[31m-[m
[31m-[m
[31m-B<syntax:> log_subrequest I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables logging of subrequests into[m
[31m-L<ngx_http_log_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 max_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> max_ranges I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the maximum allowed number of ranges in byte-range requests.[m
[31m-Requests that exceed the limit are processed as if there were no[m
[31m-byte ranges specified.[m
[31m-By default, the number of ranges is not limited.[m
[31m-The zero value disables the byte-range support completely.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 merge_slashes[m
[31m-[m
[31m-[m
[31m-B<syntax:> merge_slashes I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables compression of two or more adjacent slashes[m
[31m-in a URI into a single slash.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that compression is essential for the correct matching of prefix string[m
[31m-and regular expression locations.[m
[31m-Without it, the “C<E<sol>E<sol>scriptsE<sol>one.php>” request would not match[m
[31m-[m
[31m-    [m
[31m-    location /scripts/ {[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-and might be processed as a static file.[m
[31m-So it gets converted to “C<E<sol>scriptsE<sol>one.php>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turning the compression C<off> can become necessary if a URI[m
[31m-contains base64-encoded names, since base64 uses the “C<E<sol>>”[m
[31m-character internally.[m
[31m-However, for security considerations, it is better to avoid turning[m
[31m-the compression off.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is specified on the L</server> level,[m
[31m-its value is only used if a server is a default one.[m
[31m-The value specified also applies to all virtual servers[m
[31m-listening on the same address and port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 msie_padding[m
[31m-[m
[31m-[m
[31m-B<syntax:> msie_padding I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables adding comments to responses for MSIE clients with status[m
[31m-greater than 400 to increase the response size to 512 bytes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 msie_refresh[m
[31m-[m
[31m-[m
[31m-B<syntax:> msie_refresh I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables issuing refreshes instead of redirects for MSIE clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_file_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache I<[m
[31m-C<max>=I<C<N>>[m
[31m-[C<inactive>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures a cache that can store:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-open file descriptors, their sizes and modification times;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-information on existence of directories;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-file lookup errors, such as “file not found”, “no read permission”,[m
[31m-and so on.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Caching of errors should be enabled separately by the[m
[31m-L</open_file_cache_errors>[m
[31m-directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive has the following parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the maximum number of elements in the cache;[m
[31m-on cache overflow the least recently used (LRU) elements are removed;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<inactive>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines a time after which an element is removed from the cache[m
[31m-if it has not been accessed during this time;[m
[31m-by default, it is 60 seconds;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    open_file_cache          max=1000 inactive=20s;[m
[31m-    open_file_cache_valid    30s;[m
[31m-    open_file_cache_min_uses 2;[m
[31m-    open_file_cache_errors   on;<!--[m
[31m-    open_file_cache_events   on;[m
[31m-    -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_file_cache_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables caching of file lookup errors by[m
[31m-L</open_file_cache>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_file_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the minimum I<C<number>> of file accesses during[m
[31m-the period configured by the C<inactive> parameter[m
[31m-of the L</open_file_cache> directive, required for a file[m
[31m-descriptor to remain open in the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_file_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache_valid I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a time after which[m
[31m-L</open_file_cache>[m
[31m-elements should be validated.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 output_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> output_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<2 32k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from a disk.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.9.5, the default value was 1 32k.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 port_in_redirect[m
[31m-[m
[31m-[m
[31m-B<syntax:> port_in_redirect I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables specifying the port in redirects issued by nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The use of the primary server name in redirects is controlled by[m
[31m-the L</server_name_in_redirect> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 postpone_output[m
[31m-[m
[31m-[m
[31m-B<syntax:> postpone_output I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1460>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If possible, the transmission of client data will be postponed until[m
[31m-nginx has at least I<C<size>> bytes of data to send.[m
[31m-The zero value disables postponing data transmission.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 read_ahead[m
[31m-[m
[31m-[m
[31m-B<syntax:> read_ahead I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the amount of pre-reading for the kernel when working with file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On Linux, the[m
[31m-C<posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL)>[m
[31m-system call is used, and so the I<C<size>> parameter is ignored.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On FreeBSD, the[m
[31m-C<fcntl(O_READAHEAD,>[m
[31m-I<C<size>>C<)>[m
[31m-system call, supported since FreeBSDE<nbsp>9.0-CURRENT, is used.[m
[31m-FreeBSDE<nbsp>7 has to be[m
[31m-L<patched|http://sysoev.ru/freebsd/patch.readahead.txt>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 recursive_error_pages[m
[31m-[m
[31m-[m
[31m-B<syntax:> recursive_error_pages I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables doing several redirects using the[m
[31m-L</error_page>[m
[31m-directive.[m
[31m-The number of such redirects is limited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 request_pool_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> request_pool_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows accurate tuning of per-request memory allocations.[m
[31m-This directive has minimal impact on performance[m
[31m-and should not generally be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 reset_timedout_connection[m
[31m-[m
[31m-[m
[31m-B<syntax:> reset_timedout_connection I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables resetting timed out connections.[m
[31m-The reset is performed as follows.[m
[31m-Before closing a socket, the[m
[31m-C<SO_LINGER>[m
[31m-option is set on it with a timeout value of 0.[m
[31m-When the socket is closed, TCP RST is sent to the client, and all memory[m
[31m-occupied by this socket is released.[m
[31m-This helps avoid keeping an already closed socket with filled buffers[m
[31m-in a FIN_WAIT1 state for a long time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be noted that timed out keep-alive connections are[m
[31m-closed normally.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver I<[m
[31m-    I<C<address>> ...[m
[31m-    [C<valid>=I<C<time>>][m
[31m-    [C<ipv6>=C<on>E<verbar>C<off>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures name servers used to resolve names of upstream servers[m
[31m-into addresses, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353;[m
[31m-[m
[31m-[m
[31m-An address can be specified as a domain name or IP address,[m
[31m-and an optional port (1.3.1, 1.2.2).[m
[31m-If port is not specified, the port 53 is used.[m
[31m-Name servers are queried in a round-robin fashion.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.7, only a single name server could be configured.[m
[31m-Specifying name servers using IPv6 addresses is supported[m
[31m-starting from versions 1.3.1 and 1.2.2.[m
[31m-[m
[31m-By default, nginx will look up both IPv4 and IPv6 addresses while resolving.[m
[31m-If looking up of IPv6 addresses is not desired,[m
[31m-the C<ipv6=off> parameter can be specified.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Resolving of names into IPv6 addresses is supported[m
[31m-starting from version 1.5.8.[m
[31m-[m
[31m-By default, nginx caches answers using the TTL value of a response.[m
[31m-An optional C<valid> parameter allows overriding it:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353 valid=30s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.9, tuning of caching time was not possible,[m
[31m-and nginx always cached answers for the duration of 5 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for name resolution, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 root[m
[31m-[m
[31m-[m
[31m-B<syntax:> root I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the root directory for requests.[m
[31m-For example, with the following configuration[m
[31m-[m
[31m-    [m
[31m-    location /i/ {[m
[31m-        root /data/w3;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The F<E<sol>dataE<sol>w3E<sol>iE<sol>top.gif> file will be sent in response to[m
[31m-the “C<E<sol>iE<sol>top.gif>” request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<path>> value can contain variables,[m
[31m-except C<$document_root> and C<$realpath_root>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A path to the file is constructed by merely adding a URI to the value[m
[31m-of the C<root> directive.[m
[31m-If a URI has to be modified, the[m
[31m-L</alias> directive should be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 satisfy[m
[31m-[m
[31m-[m
[31m-B<syntax:> satisfy I<C<all> E<verbar> C<any>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<all>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows access if all (C<all>) or at least one[m
[31m-(C<any>) of the[m
[31m-L<ngx_http_access_module|ngx_http_access_module>,[m
[31m-L<ngx_http_auth_basic_module|ngx_http_auth_basic_module> or[m
[31m-L<ngx_http_auth_request_module|ngx_http_auth_request_module>[m
[31m-modules allow access.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        satisfy any;[m
[31m-    [m
[31m-        allow 192.168.1.0/32;[m
[31m-        deny  all;[m
[31m-    [m
[31m-        auth_basic           "closed site";[m
[31m-        auth_basic_user_file conf/htpasswd;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 send_lowat[m
[31m-[m
[31m-[m
[31m-B<syntax:> send_lowat I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is set to a non-zero value, nginx will try to minimize[m
[31m-the number of send operations on client sockets by using either[m
[31m-C<NOTE_LOWAT> flag of the[m
[31m-L<events> method[m
[31m-or the C<SO_SNDLOWAT> socket option.[m
[31m-In both cases the specified I<C<size>> is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is ignored on Linux, Solaris, and Windows.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a response to the client.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the client does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sendfile[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> sendfile I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of[m
[31m-C<sendfile>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Starting from nginxE<nbsp>0.8.12 and FreeBSDE<nbsp>5.2.1,[m
[31m-L</aio> can be used to pre-load data[m
[31m-for C<sendfile>:[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        sendfile       on;[m
[31m-        tcp_nopush     on;[m
[31m-        aio            on;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-In this configuration, C<sendfile> is called with[m
[31m-the C<SF_NODISKIO> flag which causes it not to block on disk IE<sol>O,[m
[31m-but, instead, report back that the data are not in memory.[m
[31m-nginx then initiates an asynchronous data load by reading one byte.[m
[31m-On the first read, the FreeBSD kernel loads the first 128K bytes[m
[31m-of a file into memory, although next reads will only load data in 16K chunks.[m
[31m-This can be changed using the[m
[31m-L</read_ahead> directive.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.7.11, pre-loading could be enabled with[m
[31m-C<aio sendfile;>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sendfile_max_chunk[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> sendfile_max_chunk I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When set to a non-zero value, limits the amount of data that can be[m
[31m-transferred in a single C<sendfile> call.[m
[31m-Without the limit, one fast connection may seize the worker process entirely.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-server { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets configuration for a virtual server.[m
[31m-There is no clear separation between IP-based (based on the IP address)[m
[31m-and name-based (based on the C<Host> request header field)[m
[31m-virtual servers.[m
[31m-Instead, the L</listen> directives describe all[m
[31m-addresses and ports that should accept connections for the server, and the[m
[31m-L</server_name> directive lists all server names.[m
[31m-Example configurations are provided in the[m
[31m-“L<request_processing>” document.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_name I<I<C<name>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<"">[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets names of a virtual server, for example:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name example.com www.example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first name becomes the primary server name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Server names can include an asterisk (“C<*>”)[m
[31m-replacing the first or last part of a name:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name example.com *.example.com www.example.*;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Such names are called wildcard names.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first two of the names mentioned above can be combined in one:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name .example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to use regular expressions in server names,[m
[31m-preceding the name with a tilde (“C<~>”):[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name www.example.com ~^www\d+\.example\.com$;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Regular expressions can contain captures (0.7.40) that can later[m
[31m-be used in other directives:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name ~^(www\.)?(.+)$;[m
[31m-    [m
[31m-        location / {[m
[31m-            root /sites/$2;[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        server_name _;[m
[31m-    [m
[31m-        location / {[m
[31m-            root /sites/default;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Named captures in regular expressions create variables (0.8.25)[m
[31m-that can later be used in other directives:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name ~^(www\.)?(?<domain>.+)$;[m
[31m-    [m
[31m-        location / {[m
[31m-            root /sites/$domain;[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        server_name _;[m
[31m-    [m
[31m-        location / {[m
[31m-            root /sites/default;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive’s parameter is set to “C<$hostname>” (0.9.4), the[m
[31m-machine’s hostname is inserted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to specify an empty server name (0.7.11):[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name www.example.com "";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-It allows this server to process requests without the C<Host>[m
[31m-header field — instead of the default server — for the given address:port pair.[m
[31m-This is the default setting.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 0.8.48, the machine’s hostname was used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-During searching for a virtual server by name,[m
[31m-if the name matches more than one of the specified variants,[m
[31m-(e.g. both a wildcard name and regular expression match), the first matching[m
[31m-variant will be chosen, in the following order of priority:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-the exact name[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-the longest wildcard name starting with an asterisk,[m
[31m-e.g. “C<*.example.com>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-the longest wildcard name ending with an asterisk,[m
[31m-e.g. “C<mail.*>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-the first matching regular expression[m
[31m-(in order of appearance in the configuration file)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Detailed description of server names is provided in a separate[m
[31m-L<server_names> document.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_name_in_redirect[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_name_in_redirect I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of the primary server name, specified by the[m
[31m-L</server_name>[m
[31m-directive, in redirects issued by nginx.[m
[31m-When the use of the primary server name is disabled, the name from the[m
[31m-C<Host> request header field is used.[m
[31m-If this field is not present, the IP address of the server is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The use of a port in redirects is controlled by[m
[31m-the L</port_in_redirect> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_names_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_names_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32E<verbar>64E<verbar>128>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the server names hash tables.[m
[31m-The default value depends on the size of the processor’s cache line.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_names_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_names_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the server names hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_tokens[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_tokens I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables emitting nginx version in error messages and in the[m
[31m-C<Server> response header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, as part of our[m
[31m-commercial subscription,[m
[31m-starting from version 1.9.13[m
[31m-the signature in error messages and[m
[31m-the C<Server> response header field value[m
[31m-can be set explicitly using the I<C<string>> with variables.[m
[31m-An empty string disables the emission of the C<Server> field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcp_nodelay[m
[31m-[m
[31m-[m
[31m-B<syntax:> tcp_nodelay I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of the C<TCP_NODELAY> option.[m
[31m-The option is enabled only when a connection is transitioned into the[m
[31m-keep-alive state.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcp_nopush[m
[31m-[m
[31m-[m
[31m-B<syntax:> tcp_nopush I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of[m
[31m-the C<TCP_NOPUSH> socket option on FreeBSD[m
[31m-or the C<TCP_CORK> socket option on Linux.[m
[31m-The options are enabled only when L</sendfile> is used.[m
[31m-Enabling the option allows[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-sending the response header and the beginning of a file in one packet,[m
[31m-on Linux and FreeBSDE<nbsp>4.*;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-sending a file in full packets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 try_files[m
[31m-[m
[31m-[m
[31m-B<syntax:> try_files I<I<C<file>> ... I<C<uri>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> try_files I<I<C<file>> ... =I<C<code>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Checks the existence of files in the specified order and uses[m
[31m-the first found file for request processing; the processing[m
[31m-is performed in the current context.[m
[31m-The path to a file is constructed from the[m
[31m-I<C<file>> parameter[m
[31m-according to the[m
[31m-L</root> and L</alias> directives.[m
[31m-It is possible to check directory’s existence by specifying[m
[31m-a slash at the end of a name, e.g. “C<$uriE<sol>>”.[m
[31m-If none of the files were found, an internal redirect to the[m
[31m-I<C<uri>> specified in the last parameter is made.[m
[31m-For example:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        try_files $uri /images/default.gif;[m
[31m-    }[m
[31m-    [m
[31m-    location = /images/default.gif {[m
[31m-        expires 30s;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The last parameter can also point to a named location,[m
[31m-as shown in examples below.[m
[31m-Starting from version 0.7.51, the last parameter can also be a[m
[31m-I<C<code>>:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files $uri $uri/index.html $uri.html =404;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example in proxying Mongrel:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files /system/maintenance.html[m
[31m-                  $uri $uri/index.html $uri.html[m
[31m-                  @mongrel;[m
[31m-    }[m
[31m-    [m
[31m-    location @mongrel {[m
[31m-        proxy_pass http://mongrel;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example for DrupalE<sol>FastCGI:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files $uri $uri/ @drupal;[m
[31m-    }[m
[31m-    [m
[31m-    location ~ \.php$ {[m
[31m-        try_files $uri @drupal;[m
[31m-    [m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;[m
[31m-        fastcgi_param SCRIPT_NAME     $fastcgi_script_name;[m
[31m-        fastcgi_param QUERY_STRING    $args;[m
[31m-    [m
[31m-        ... other fastcgi_param's[m
[31m-    }[m
[31m-    [m
[31m-    location @drupal {[m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to/index.php;[m
[31m-        fastcgi_param SCRIPT_NAME     /index.php;[m
[31m-        fastcgi_param QUERY_STRING    q=$uri&$args;[m
[31m-    [m
[31m-        ... other fastcgi_param's[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-In the following example,[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files $uri $uri/ @drupal;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-the C<try_files> directive is equivalent to[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        error_page 404 = @drupal;[m
[31m-        log_not_found off;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-And here,[m
[31m-[m
[31m-    [m
[31m-    location ~ \.php$ {[m
[31m-        try_files $uri @drupal;[m
[31m-    [m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;[m
[31m-    [m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-C<try_files> checks the existence of the PHP file[m
[31m-before passing the request to the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example for Wordpress and Joomla:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files $uri $uri/ @wordpress;[m
[31m-    }[m
[31m-    [m
[31m-    location ~ \.php$ {[m
[31m-        try_files $uri @wordpress;[m
[31m-    [m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;[m
[31m-        ... other fastcgi_param's[m
[31m-    }[m
[31m-    [m
[31m-    location @wordpress {[m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to/index.php;[m
[31m-        ... other fastcgi_param's[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 types[m
[31m-[m
[31m-[m
[31m-types { B<...> }[m
[31m-[m
[31m-[m
[31m-B<default:> I<[m
[31m-    textE<sol>html  html;[m
[31m-    imageE<sol>gif  gif;[m
[31m-    imageE<sol>jpeg jpg;[m
[31m->[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Maps file name extensions to MIME types of responses.[m
[31m-Extensions are case-insensitive.[m
[31m-Several extensions can be mapped to one type, for example:[m
[31m-[m
[31m-    [m
[31m-    types {[m
[31m-        application/octet-stream bin exe dll;[m
[31m-        application/octet-stream deb;[m
[31m-        application/octet-stream dmg;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A sufficiently full mapping table is distributed with nginx in the[m
[31m-F<confE<sol>mime.types> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To make a particular location emit the[m
[31m-“C<applicationE<sol>octet-stream>”[m
[31m-MIME type for all requests, the following configuration can be used:[m
[31m-[m
[31m-    [m
[31m-    location /download/ {[m
[31m-        types        { }[m
[31m-        default_type application/octet-stream;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 types_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> types_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the types hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.5.13,[m
[31m-the default value depended on the size of the processor’s cache line.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 types_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> types_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the types hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 underscores_in_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> underscores_in_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of underscores in client request header fields.[m
[31m-When the use of underscores is disabled, request header fields whose names[m
[31m-contain underscores are[m
[31m-marked as invalid and become subject to the[m
[31m-L</ignore_invalid_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is specified on the L</server> level,[m
[31m-its value is only used if a server is a default one.[m
[31m-The value specified also applies to all virtual servers[m
[31m-listening on the same address and port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 variables_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> variables_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the variables hash table.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 variables_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> variables_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the variables hash table.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.5.13, the default value was 512.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_core_module> module supports embedded variables[m
[31m-with names matching the Apache Server variables.[m
[31m-First of all, these are variables representing client request header[m
[31m-fields, such as C<$http_user_agent>, C<$http_cookie>,[m
[31m-and so on.[m
[31m-Also there are other variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$arg_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-argument I<C<name>> in the request line[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$args>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-arguments in the request line[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$binary_remote_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client address in a binary form, value’s length is always 4 bytes[m
[31m-for IPv4 addresses or 16 bytes for IPv6 addresses[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$body_bytes_sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-number of bytes sent to a client, not counting the response header;[m
[31m-this variable is compatible with the “C<%B>” parameter of the[m
[31m-C<mod_log_config>[m
[31m-Apache module[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$bytes_sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-number of bytes sent to a client (1.3.8, 1.2.5)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connection>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-connection serial number (1.3.8, 1.2.5)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connection_requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current number of requests made through a connection (1.3.8, 1.2.5)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$content_length>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<Content-Length> request header field[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$content_type>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<Content-Type> request header field[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$cookie_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the I<C<name>> cookie[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$document_root>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L</root> or L</alias> directive’s value[m
[31m-for the current request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$document_uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as C<$uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$host>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-in this order of precedence:[m
[31m-host name from the request line, or[m
[31m-host name from the C<Host> request header field, or[m
[31m-the server name matching a request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$hostname>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-host name[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$http_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-arbitrary request header field;[m
[31m-the last part of a variable name is the field name converted[m
[31m-to lower case with dashes replaced by underscores[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$https>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<on>”[m
[31m-if connection operates in SSL mode,[m
[31m-or an empty string otherwise[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$is_args>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<?>” if a request line has arguments,[m
[31m-or an empty string otherwise[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$limit_rate>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-setting this variable enables response rate limiting;[m
[31m-see L</limit_rate>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$msec>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current time in seconds with the milliseconds resolution (1.3.9, 1.2.6)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$nginx_version>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx version[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$pid>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-PID of the worker process[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$pipe>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<p>” if request was pipelined, “C<.>”[m
[31m-otherwise (1.3.12, 1.2.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$proxy_protocol_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client address from the PROXY protocol header, or an empty string otherwise[m
[31m-(1.5.12)[m
[31m-[m
[31m-[m
[31m-The PROXY protocol must be previously enabled by setting the[m
[31m-C<proxy_protocol> parameter[m
[31m-in the L</listen> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$proxy_protocol_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client port from the PROXY protocol header, or an empty string otherwise[m
[31m-(1.11.0)[m
[31m-[m
[31m-[m
[31m-The PROXY protocol must be previously enabled by setting the[m
[31m-C<proxy_protocol> parameter[m
[31m-in the L</listen> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$query_string>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as C<$args>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$realpath_root>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-an absolute pathname corresponding to the[m
[31m-L</root> or L</alias> directive’s value[m
[31m-for the current request,[m
[31m-with all symbolic links resolved to real paths[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$remote_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client address[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$remote_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client port[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$remote_user>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-user name supplied with the Basic authentication[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-full original request line[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_body>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request body[m
[31m-[m
[31m-[m
[31m-The variable’s value is made available in locations[m
[31m-processed by the[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_body_file>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-name of a temporary file with the request body[m
[31m-[m
[31m-[m
[31m-At the end of processing, the file needs to be removed.[m
[31m-To always write the request body to a file,[m
[31m-L</client_body_in_file_only> needs to be enabled.[m
[31m-When the name of a temporary file is passed in a proxied request[m
[31m-or in a request to a FastCGIE<sol>uwsgiE<sol>SCGI server,[m
[31m-passing the request body should be disabled by the[m
[31m-L<proxy_pass_request_body off|ngx_http_proxy_module>,[m
[31m-L<fastcgi_pass_request_body off|ngx_http_fastcgi_module>,[m
[31m-L<uwsgi_pass_request_body off|ngx_http_uwsgi_module>, or[m
[31m-L<scgi_pass_request_body off|ngx_http_scgi_module>[m
[31m-directives, respectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_completion>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<OK>” if a request has completed,[m
[31m-or an empty string otherwise[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_filename>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-file path for the current request, based on the[m
[31m-L</root> or L</alias>[m
[31m-directives, and the request URI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-unique request identifier (1.11.0)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_length>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request length (including request line, header, and request body)[m
[31m-(1.3.12, 1.2.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_method>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request method, usually[m
[31m-“C<GET>” or “C<POST>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request processing time in seconds with a milliseconds resolution[m
[31m-(1.3.9, 1.2.6);[m
[31m-time elapsed since the first bytes were read from the client[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-full original request URI (with arguments)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$scheme>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request scheme, “C<http>” or “C<https>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$sent_http_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-arbitrary response header field;[m
[31m-the last part of a variable name is the field name converted[m
[31m-to lower case with dashes replaced by underscores[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$server_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-an address of the server which accepted a request[m
[31m-[m
[31m-[m
[31m-Computing a value of this variable usually requires one system call.[m
[31m-To avoid a system call, the L</listen> directives[m
[31m-must specify addresses and use the C<bind> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$server_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-name of the server which accepted a request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$server_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-port of the server which accepted a request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$server_protocol>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request protocol, usually[m
[31m-“C<HTTPE<sol>1.0>”,[m
[31m-“C<HTTPE<sol>1.1>”,[m
[31m-or[m
[31m-“L<HTTPE<sol>2.0|ngx_http_v2_module>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$status>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-response status (1.3.2, 1.2.2)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<$tcpinfo_rtt>,[m
[31m-C<$tcpinfo_rttvar>,[m
[31m-C<$tcpinfo_snd_cwnd>,[m
[31m-C<$tcpinfo_rcv_space>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-information about the client TCP connection; available on systems[m
[31m-that support the C<TCP_INFO> socket option[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$time_iso8601>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-local time in the ISO 8601 standard format (1.3.12, 1.2.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$time_local>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-local time in the Common Log Format (1.3.12, 1.2.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current URI in request, normalized[m
[31m-[m
[31m-[m
[31m-The value of C<$uri> may change during request processing,[m
[31m-e.g. when doing internal redirects, or when using index files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_dav_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_dav_module.pod[m
[1mdeleted file mode 100644[m
[1mindex dbdf576..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_dav_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,255 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_dav_module - Module ngx_http_dav_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_dav_module> module is intended for file[m
[31m-management automation via the WebDAV protocol.[m
[31m-The module processes HTTP and WebDAV[m
[31m-methods PUT, DELETE, MKCOL, COPY, and MOVE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_dav_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-WebDAV clients that require additional WebDAV methods to operate[m
[31m-will not work with this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        root                  /data/www;[m
[31m-    [m
[31m-        client_body_temp_path /data/client_temp;[m
[31m-    [m
[31m-        dav_methods PUT DELETE MKCOL COPY MOVE;[m
[31m-    [m
[31m-        create_full_put_path  on;[m
[31m-        dav_access            group:rw  all:r;[m
[31m-    [m
[31m-        limit_except GET {[m
[31m-            allow 192.168.1.0/32;[m
[31m-            deny  all;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 dav_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> dav_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    dav_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    dav_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 dav_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> dav_methods I<[m
[31m-    C<off> E<verbar> I<C<method>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows the specified HTTP and WebDAV methods.[m
[31m-The parameter C<off> denies all methods processed[m
[31m-by this module.[m
[31m-The following methods are supported:[m
[31m-C<PUT>, C<DELETE>, C<MKCOL>,[m
[31m-C<COPY>, and C<MOVE>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A file uploaded with the PUT method is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the[m
[31m-L<ngx_http_core_module>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When creating a file with the PUT method, it is possible to specify[m
[31m-the modification date by passing it in the C<Date>[m
[31m-header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 create_full_put_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> create_full_put_path I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The WebDAV specification only allows creating files in already[m
[31m-existing directories.[m
[31m-This directive allows creating all needed intermediate directories.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 min_delete_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> min_delete_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows the DELETE method to remove files provided that[m
[31m-the number of elements in a request path is not less than the specified[m
[31m-number.[m
[31m-For example, the directive[m
[31m-[m
[31m-    [m
[31m-    min_delete_depth 4;[m
[31m-[m
[31m-[m
[31m-allows removing files on requests[m
[31m-[m
[31m-    [m
[31m-    /users/00/00/name[m
[31m-    /users/00/00/name/pic.jpg[m
[31m-    /users/00/00/page.html[m
[31m-[m
[31m-[m
[31m-and denies the removal of[m
[31m-[m
[31m-    [m
[31m-    /users/00/00[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_empty_gif_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_empty_gif_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a992c8f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_empty_gif_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_empty_gif_module - Module ngx_http_empty_gif_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_empty_gif_module> module emits[m
[31m-single-pixel transparent GIF.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location = /_.gif {[m
[31m-        empty_gif;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 empty_gif[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_f4f_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_f4f_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a3a8141..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_f4f_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,115 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_f4f_module - Module ngx_http_f4f_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_f4f_module> module provides[m
[31m-server-side support for Adobe HTTP Dynamic Streaming (HDS).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module implements handling of HTTP Dynamic Streaming requests in the[m
[31m-“C<E<sol>videoSeg1-Frag1>” form — extracting the needed fragment[m
[31m-from the F<videoSeg1.f4f> file using the F<videoSeg1.f4x>[m
[31m-index file.[m
[31m-This module is an alternative to the Adobe’s f4f module (HTTP Origin Module)[m
[31m-for Apache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usual pre-processing with Adobe’s f4fpackager is required, see relevant[m
[31m-documentation for details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        f4f;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 f4f[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on module processing in the surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 f4f_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> f4f_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for[m
[31m-reading the F<.f4x> index file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_fastcgi_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_fastcgi_module.pod[m
[1mdeleted file mode 100644[m
[1mindex e7bea5c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_fastcgi_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,2495 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_fastcgi_module - Module ngx_http_fastcgi_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_fastcgi_module> module allows passing[m
[31m-requests to a FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        fastcgi_pass  localhost:9000;[m
[31m-        fastcgi_index index.php;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;[m
[31m-        fastcgi_param QUERY_STRING    $query_string;[m
[31m-        fastcgi_param REQUEST_METHOD  $request_method;[m
[31m-        fastcgi_param CONTENT_TYPE    $content_type;[m
[31m-        fastcgi_param CONTENT_LENGTH  $content_length;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 fastcgi_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.22.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a FastCGI server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<fastcgi_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a FastCGI server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the first part[m
[31m-of the response received from the FastCGI server.[m
[31m-This part usually contains a small response header.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-It can be made smaller, however.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of responses from the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, nginx receives a response from the FastCGI server[m
[31m-as soon as possible, saving it into the buffers set by the[m
[31m-L</fastcgi_buffer_size> and L</fastcgi_buffers> directives.[m
[31m-If the whole response does not fit into memory, a part of it can be saved[m
[31m-to a temporary file on the disk.[m
[31m-Writing to temporary files is controlled by the[m
[31m-L</fastcgi_max_temp_file_size> and[m
[31m-L</fastcgi_temp_file_write_size> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the response is passed to a client synchronously,[m
[31m-immediately as it is received.[m
[31m-nginx will not try to read the whole response from the FastCGI server.[m
[31m-The maximum size of the data that nginx can receive from the server[m
[31m-at a time is set by the L</fastcgi_buffer_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering can also be enabled or disabled by passing[m
[31m-“C<yes>” or “C<no>” in the[m
[31m-C<X-Accel-Buffering> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L</fastcgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from the FastCGI server,[m
[31m-for a single connection.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_busy_buffers_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_busy_buffers_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the FastCGI[m
[31m-server is enabled, limits the total I<C<size>> of buffers that[m
[31m-can be busy sending a response to the client while the response is not[m
[31m-yet fully read.[m
[31m-In the meantime, the rest of the buffers can be used for reading the response[m
[31m-and, if needed, buffering part of the response to a temporary file.[m
[31m-By default, I<C<size>> is limited by the size of two buffers set by the[m
[31m-L</fastcgi_buffer_size> and L</fastcgi_buffers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache I<I<C<zone>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a shared memory zone used for caching.[m
[31m-The same zone can be used in several places.[m
[31m-Parameter value can contain variables (1.7.9).[m
[31m-The C<off> parameter disables caching inherited[m
[31m-from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_bypass[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_bypass I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be taken from a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be taken from the cache:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_bypass $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    fastcgi_cache_bypass $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</fastcgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_key I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for caching, for example[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_key localhost:9000$request_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_lock[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_lock I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When enabled, only one request at a time will be allowed to populate[m
[31m-a new cache element identified according to the L</fastcgi_cache_key>[m
[31m-directive by passing a request to a FastCGI server.[m
[31m-Other requests of the same cache element will either wait[m
[31m-for a response to appear in the cache or the cache lock for[m
[31m-this element to be released, up to the time set by the[m
[31m-L</fastcgi_cache_lock_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_lock_age[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_lock_age I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the last request passed to the FastCGI server[m
[31m-for populating a new cache element[m
[31m-has not completed for the specified I<C<time>>,[m
[31m-one more request may be passed to the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_lock_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_lock_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for L</fastcgi_cache_lock>.[m
[31m-When the I<C<time>> expires,[m
[31m-the request will be passed to the FastCGI server,[m
[31m-however, the response will not be cached.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 1.7.8, the response could be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_methods I<[m
[31m-    C<GET> E<verbar>[m
[31m-    C<HEAD> E<verbar>[m
[31m-    C<POST>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<GET HEAD>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.59.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the client request method is listed in this directive then[m
[31m-the response will be cached.[m
[31m-“C<GET>” and “C<HEAD>” methods are always[m
[31m-added to the list, though it is recommended to specify them explicitly.[m
[31m-See also the L</fastcgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> of requests after which the response[m
[31m-will be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_path I<[m
[31m-    I<C<path>>[m
[31m-    [C<levels>=I<C<levels>>][m
[31m-    [C<use_temp_path>=C<on>E<verbar>C<off>][m
[31m-    C<keys_zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<inactive>=I<C<time>>][m
[31m-    [C<max_size>=I<C<size>>][m
[31m-    [C<loader_files>=I<C<number>>][m
[31m-    [C<loader_sleep>=I<C<time>>][m
[31m-    [C<loader_threshold>=I<C<time>>][m
[31m-    [C<purger>=C<on>E<verbar>C<off>][m
[31m-    [C<purger_files>=I<C<number>>][m
[31m-    [C<purger_sleep>=I<C<time>>][m
[31m-    [C<purger_threshold>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path and other parameters of a cache.[m
[31m-Cache data are stored in files.[m
[31m-Both the key and file name in a cache are a result of[m
[31m-applying the MD5 function to the proxied URL.[m
[31m-[m
[31m-The C<levels> parameter defines hierarchy levels of a cache.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;[m
[31m-[m
[31m-[m
[31m-file names in a cache will look like this:[m
[31m-[m
[31m-    [m
[31m-    /data/nginx/cache/<emphasis>c</emphasis>/<emphasis>29</emphasis>/b7f54b2df7773722d382f4809d650<emphasis>29c</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A cached response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the cache can be put on[m
[31m-different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both cache and a directory[m
[31m-holding temporary files[m
[31m-are put on the same file system.[m
[31m-A directory for temporary files is set based on[m
[31m-the C<use_temp_path> parameter (1.7.10).[m
[31m-If this parameter is omitted or set to the value C<on>,[m
[31m-the directory set by the L</fastcgi_temp_path> directive[m
[31m-for the given location will be used.[m
[31m-If the value is set to C<off>,[m
[31m-temporary files will be put directly in the cache directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, all active keys and information about data are stored[m
[31m-in a shared memory zone, whose I<C<name>> and I<C<size>>[m
[31m-are configured by the C<keys_zone> parameter.[m
[31m-One megabyte zone can store about 8 thousand keys.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Cached data that are not accessed during the time specified by the[m
[31m-C<inactive> parameter get removed from the cache[m
[31m-regardless of their freshness.[m
[31m-By default, C<inactive> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special “cache manager” process monitors the maximum cache size set[m
[31m-by the C<max_size> parameter.[m
[31m-When this size is exceeded, it removes the least recently used data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A minute after the start the special “cache loader” process is activated.[m
[31m-It loads information about previously cached data stored on file system[m
[31m-into a cache zone.[m
[31m-The loading is done in iterations.[m
[31m-During one iteration no more than C<loader_files> items[m
[31m-are loaded (by default, 100).[m
[31m-Besides, the duration of one iteration is limited by the[m
[31m-C<loader_threshold> parameter (by default, 200 milliseconds).[m
[31m-Between iterations, a pause configured by the C<loader_sleep>[m
[31m-parameter (by default, 50 milliseconds) is made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Instructs whether cache entries that match a[m
[31m-wildcard key[m
[31m-will be removed from the disk by the cache purger (1.7.12).[m
[31m-Setting the parameter to C<on>[m
[31m-(default is C<off>)[m
[31m-will activate the “cache purger” process that[m
[31m-permanently iterates through all cache entries[m
[31m-and deletes the entries that match the wildcard key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_files>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of items that will be scanned during one iteration (1.7.12).[m
[31m-By default, C<purger_files> is set to 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_threshold>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the duration of one iteration (1.7.12).[m
[31m-By default, C<purger_threshold> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_sleep>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a pause between iterations (1.7.12).[m
[31m-By default, C<purger_sleep> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_purge[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_purge I<string ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the request will be considered a cache[m
[31m-purge request.[m
[31m-If at least one value of the string parameters is not empty and is not equal[m
[31m-to “0” then the cache entry with a corresponding[m
[31m-cache key is removed.[m
[31m-The result of successful operation is indicated by returning[m
[31m-the C<204> (C<No Content>) response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the cache key of a purge request ends[m
[31m-with an asterisk (“C<*>”), all cache entries matching the[m
[31m-wildcard key will be removed from the cache.[m
[31m-However, these entries will remain on the disk until they are deleted[m
[31m-for either inactivity,[m
[31m-or processed by the cache purger (1.7.12),[m
[31m-or a client attempts to access them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m;[m
[31m-    [m
[31m-    map $request_method $purge_method {[m
[31m-        PURGE   1;[m
[31m-        default 0;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        location / {[m
[31m-            fastcgi_pass        backend;[m
[31m-            fastcgi_cache       cache_zone;[m
[31m-            fastcgi_cache_key   $uri;[m
[31m-            fastcgi_cache_purge $purge_method;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This functionality is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_revalidate[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_revalidate I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables revalidation of expired cache items using conditional requests with[m
[31m-the C<If-Modified-Since> and C<If-None-Match>[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_use_stale[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_use_stale I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<updating> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines in which cases a stale cached response can be used[m
[31m-when an error occurs during communication with the FastCGI server.[m
[31m-The directive’s parameters match the parameters of the[m
[31m-L</fastcgi_next_upstream> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<error> parameter also permits[m
[31m-using a stale cached response if a FastCGI server to process a request[m
[31m-cannot be selected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, the C<updating> parameter permits[m
[31m-using a stale cached response if it is currently being updated.[m
[31m-This allows minimizing the number of accesses to FastCGI servers[m
[31m-when updating cached data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To minimize the number of accesses to FastCGI servers when[m
[31m-populating a new cache element, the L</fastcgi_cache_lock>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_valid I<[I<C<code>> ...] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets caching time for different response codes.[m
[31m-For example, the following directives[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_valid 200 302 10m;[m
[31m-    fastcgi_cache_valid 404      1m;[m
[31m-[m
[31m-[m
[31m-set 10 minutes of caching for responses with codes 200 and 302[m
[31m-and 1 minute for responses with code 404.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only caching I<C<time>> is specified[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_valid 5m;[m
[31m-[m
[31m-[m
[31m-then only 200, 301, and 302 responses are cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the C<any> parameter can be specified[m
[31m-to cache any responses:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_valid 200 302 10m;[m
[31m-    fastcgi_cache_valid 301      1h;[m
[31m-    fastcgi_cache_valid any      1m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters of caching can also be set directly[m
[31m-in the response header.[m
[31m-This has higher priority than setting of caching time using the directive.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<X-Accel-Expires> header field sets caching time of a[m
[31m-response in seconds.[m
[31m-The zero value disables caching for a response.[m
[31m-If the value starts with the C<@> prefix, it sets an absolute[m
[31m-time in seconds since Epoch, up to which the response may be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header does not include the C<X-Accel-Expires> field,[m
[31m-parameters of caching may be set in the header fields[m
[31m-C<Expires> or C<Cache-Control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Set-Cookie> field, such a[m
[31m-response will not be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Vary> field[m
[31m-with the special value “C<*>”, such a[m
[31m-response will not be cached (1.7.7).[m
[31m-If the header includes the C<Vary> field[m
[31m-with another value, such a response will be cached[m
[31m-taking into account the corresponding request header fields (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Processing of one or more of these response header fields can be disabled[m
[31m-using the L</fastcgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_catch_stderr[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_catch_stderr I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a string to search for in the error stream of a response[m
[31m-received from a FastCGI server.[m
[31m-If the I<C<string>> is found then it is considered that the FastCGI[m
[31m-server has returned an invalid response.[m
[31m-This allows handling application errors in nginx, for example:[m
[31m-[m
[31m-    [m
[31m-    location /php {[m
[31m-        fastcgi_pass backend:9000;[m
[31m-        ...[m
[31m-        fastcgi_catch_stderr "PHP Fatal error";[m
[31m-        fastcgi_next_upstream error timeout invalid_header;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a FastCGI server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the FastCGI server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_hide_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_hide_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default,[m
[31m-nginx does not pass the header fields C<Status> and[m
[31m-C<X-Accel-...> from the response of a FastCGI[m
[31m-server to a client.[m
[31m-The C<fastcgi_hide_header> directive sets additional fields[m
[31m-that will not be passed.[m
[31m-If, on the contrary, the passing of fields needs to be permitted,[m
[31m-the L</fastcgi_pass_header> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_ignore_client_abort[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_ignore_client_abort I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether the connection with a FastCGI server should be[m
[31m-closed when a client closes the connection without waiting[m
[31m-for a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_ignore_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_ignore_headers I<I<C<field>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables processing of certain response header fields from the FastCGI server.[m
[31m-The following fields can be ignored: C<X-Accel-Redirect>,[m
[31m-C<X-Accel-Expires>, C<X-Accel-Limit-Rate> (1.1.6),[m
[31m-C<X-Accel-Buffering> (1.1.6),[m
[31m-C<X-Accel-Charset> (1.1.6), C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie> (0.8.44),[m
[31m-and C<Vary> (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If not disabled, processing of these header fields has the following[m
[31m-effect:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Expires>, C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie>,[m
[31m-and C<Vary>[m
[31m-set the parameters of response caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Redirect> performs an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> to the specified URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Limit-Rate> sets the[m
[31m-L<rate[m
[31m-limit|ngx_http_core_module> for transmission of a response to a client;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Buffering> enables or disables[m
[31m-buffering of a response;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Charset> sets the desired[m
[31m-L<ngx_http_charset_module>[m
[31m-of a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_index[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_index I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a file name that will be appended after a URI that ends with[m
[31m-a slash, in the value of the C<$fastcgi_script_name> variable.[m
[31m-For example, with these settings[m
[31m-[m
[31m-    [m
[31m-    fastcgi_index index.php;[m
[31m-    fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;[m
[31m-[m
[31m-[m
[31m-and the “C<E<sol>page.php>” request,[m
[31m-the C<SCRIPT_FILENAME> parameter will be equal to[m
[31m-“C<E<sol>homeE<sol>wwwE<sol>scriptsE<sol>phpE<sol>page.php>”,[m
[31m-and with the “C<E<sol>>” request it will be equal to[m
[31m-“C<E<sol>homeE<sol>wwwE<sol>scriptsE<sol>phpE<sol>index.php>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_intercept_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_intercept_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether FastCGI server responses with codes greater than or equal[m
[31m-to 300 should be passed to a client or be redirected to nginx for processing[m
[31m-with the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_keep_conn[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_keep_conn I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, a FastCGI server will close a connection right after[m
[31m-sending the response.[m
[31m-However, when this directive is set to the value C<on>,[m
[31m-nginx will instruct a FastCGI server to keep connections open.[m
[31m-This is necessary, in particular, for[m
[31m-L<ngx_http_upstream_module>[m
[31m-connections to FastCGI servers to function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the response from the FastCGI server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if nginx simultaneously opens[m
[31m-two connections to the FastCFI server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-The limitation works only if[m
[31m-buffering of responses from the FastCGI[m
[31m-server is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_max_temp_file_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_max_temp_file_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the FastCGI[m
[31m-server is enabled, and the whole response does not fit into the buffers[m
[31m-set by the L</fastcgi_buffer_size> and L</fastcgi_buffers>[m
[31m-directives, a part of the response can be saved to a temporary file.[m
[31m-This directive sets the maximum I<C<size>> of the temporary file.[m
[31m-The size of data written to the temporary file at a time is set[m
[31m-by the L</fastcgi_temp_file_write_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The zero value disables buffering of responses to temporary files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This restriction does not apply to responses[m
[31m-that will be cached[m
[31m-or stored on disk.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<non_idempotent> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_header>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<http_500>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 500;[m
[31m-[m
[31m-[m
[31m-=item C<http_503>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 503;[m
[31m-[m
[31m-[m
[31m-=item C<http_403>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 403;[m
[31m-[m
[31m-[m
[31m-=item C<http_404>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 404;[m
[31m-[m
[31m-[m
[31m-=item C<non_idempotent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-normally, requests with a[m
[31m-L<non-idempotent|http://tools.ietf.org/html/rfc7231#section-4.2.2>[m
[31m-method[m
[31m-(C<POST>, C<LOCK>, C<PATCH>)[m
[31m-are not passed to the next server[m
[31m-if a request has been sent to an upstream server (1.9.13);[m
[31m-enabling this option explicitly allows retrying such requests;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The cases of C<http_500> and C<http_503> are[m
[31m-considered unsuccessful attempts only if they are specified in the directive.[m
[31m-The cases of C<http_403> and C<http_404>[m
[31m-are never considered unsuccessful attempts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_no_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_no_cache I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be saved to a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be saved:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_no_cache $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    fastcgi_no_cache $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</fastcgi_cache_bypass> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_param I<[m
[31m-    I<C<parameter>> I<C<value>>[m
[31m-    [C<if_not_empty>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<parameter>> that should be passed to the FastCGI server.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<fastcgi_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following example shows the minimum required settings for PHP:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;[m
[31m-    fastcgi_param QUERY_STRING    $query_string;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<SCRIPT_FILENAME> parameter is used in PHP for[m
[31m-determining the script name, and the C<QUERY_STRING>[m
[31m-parameter is used to pass request parameters.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For scripts that process C<POST> requests, the[m
[31m-following three parameters are also required:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_param REQUEST_METHOD  $request_method;[m
[31m-    fastcgi_param CONTENT_TYPE    $content_type;[m
[31m-    fastcgi_param CONTENT_LENGTH  $content_length;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If PHP was built with the C<--enable-force-cgi-redirect>[m
[31m-configuration parameter, the C<REDIRECT_STATUS> parameter[m
[31m-should also be passed with the value “200”:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_param REDIRECT_STATUS 200;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a directive is specified with C<if_not_empty> (1.1.11) then[m
[31m-such a parameter will not be passed to the server until its value is not empty:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_param HTTPS           $https if_not_empty;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_pass I<I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the address of a FastCGI server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_pass localhost:9000;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_pass unix:/tmp/fastcgi.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_pass_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_pass_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Permits passing otherwise disabled header[m
[31m-fields from a FastCGI server to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_pass_request_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_pass_request_body I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the original request body is passed[m
[31m-to the FastCGI server.[m
[31m-See also the L</fastcgi_pass_request_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_pass_request_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_pass_request_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the header fields of the original request are passed[m
[31m-to the FastCGI server.[m
[31m-See also the L</fastcgi_pass_request_body> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the FastCGI server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the FastCGI server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_request_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_request_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of a client request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the entire request body is[m
[31m-L<read|ngx_http_core_module>[m
[31m-from the client before sending the request to a FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the request body is sent to the FastCGI server[m
[31m-immediately as it is received.[m
[31m-In this case, the request cannot be passed to the[m
[31m-next server[m
[31m-if nginx already started sending the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_send_lowat[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_send_lowat I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is set to a non-zero value, nginx will try to[m
[31m-minimize the number[m
[31m-of send operations on outgoing connections to a FastCGI server by using either[m
[31m-C<NOTE_LOWAT> flag of the[m
[31m-L<events> method,[m
[31m-or the C<SO_SNDLOWAT> socket option,[m
[31m-with the specified I<C<size>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is ignored on Linux, Solaris, and Windows.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the FastCGI server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the FastCGI server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_split_path_info[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_split_path_info I<I<C<regex>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a regular expression that captures a value for the[m
[31m-C<$fastcgi_path_info> variable.[m
[31m-The regular expression should have two captures: the first becomes[m
[31m-a value of the C<$fastcgi_script_name> variable, the second[m
[31m-becomes a value of the C<$fastcgi_path_info> variable.[m
[31m-For example, with these settings[m
[31m-[m
[31m-    [m
[31m-    location ~ ^(.+\.php)(.*)$ {[m
[31m-        fastcgi_split_path_info       ^(.+\.php)(.*)$;[m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;[m
[31m-        fastcgi_param PATH_INFO       $fastcgi_path_info;[m
[31m-[m
[31m-[m
[31m-and the “C<E<sol>show.phpE<sol>articleE<sol>0001>” request,[m
[31m-the C<SCRIPT_FILENAME> parameter will be equal to[m
[31m-“C<E<sol>pathE<sol>toE<sol>phpE<sol>show.php>”, and the[m
[31m-C<PATH_INFO> parameter will be equal to[m
[31m-“C<E<sol>articleE<sol>0001>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_store[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_store I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables saving of files to a disk.[m
[31m-The C<on> parameter saves files with paths[m
[31m-corresponding to the directives[m
[31m-L<ngx_http_core_module> or[m
[31m-L<ngx_http_core_module>.[m
[31m-The C<off> parameter disables saving of files.[m
[31m-In addition, the file name can be set explicitly using the[m
[31m-I<C<string>> with variables:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_store /data/www$original_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The modification time of files is set according to the received[m
[31m-C<Last-Modified> response header field.[m
[31m-The response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the L</fastcgi_temp_path>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive can be used to create local copies of static unchangeable[m
[31m-files, e.g.:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root                 /data/www;[m
[31m-        error_page           404 = /fetch$uri;[m
[31m-    }[m
[31m-    [m
[31m-    location /fetch/ {[m
[31m-        internal;[m
[31m-    [m
[31m-        fastcgi_pass         backend:9000;[m
[31m-        ...[m
[31m-    [m
[31m-        fastcgi_store        on;[m
[31m-        fastcgi_store_access user:rw group:rw all:r;[m
[31m-        fastcgi_temp_path    /data/temp;[m
[31m-    [m
[31m-        alias                /data/www/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_store_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_store_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_store_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_store_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_temp_file_write_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_temp_file_write_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the I<C<size>> of data written to a temporary file[m
[31m-at a time, when buffering of responses from the FastCGI server[m
[31m-to temporary files is enabled.[m
[31m-By default, I<C<size>> is limited by two buffers set by the[m
[31m-L</fastcgi_buffer_size> and L</fastcgi_buffers> directives.[m
[31m-The maximum size of a temporary file is set by the[m
[31m-L</fastcgi_max_temp_file_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<fastcgi_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files[m
[31m-with data received from FastCGI servers.[m
[31m-Up to three-level subdirectory hierarchy can be used underneath the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    fastcgi_temp_path /spool/nginx/fastcgi_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/fastcgi_temp/<emphasis>7</emphasis>/<emphasis>45</emphasis>/00000123<emphasis>457</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the C<use_temp_path> parameter of the[m
[31m-L</fastcgi_cache_path> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Parameters Passed to a FastCGI Server[m
[31m-[m
[31m-[m
[31m-[m
[31m-HTTP request header fields are passed to a FastCGI server as parameters.[m
[31m-In applications and scripts running as FastCGI servers,[m
[31m-these parameters are usually made available as environment variables.[m
[31m-For example, the C<User-Agent> header field is passed as the[m
[31m-C<HTTP_USER_AGENT> parameter.[m
[31m-In addition to HTTP request header fields, it is possible to pass arbitrary[m
[31m-parameters using the L</fastcgi_param> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_fastcgi_module> module supports embedded[m
[31m-variables that can be used to set parameters using the[m
[31m-L</fastcgi_param> directive:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$fastcgi_script_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request URI or, if a URI ends with a slash, request URI with an index file[m
[31m-name configured by the L</fastcgi_index> directive appended to it.[m
[31m-This variable can be used to set the[m
[31m-C<SCRIPT_FILENAME> and C<PATH_TRANSLATED>[m
[31m-parameters that determine the script name in PHP.[m
[31m-For example, for the “C<E<sol>infoE<sol>>” request with the[m
[31m-following directives[m
[31m-[m
[31m-    [m
[31m-    fastcgi_index index.php;[m
[31m-    fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;[m
[31m-[m
[31m-[m
[31m-the C<SCRIPT_FILENAME> parameter will be equal to[m
[31m-“C<E<sol>homeE<sol>wwwE<sol>scriptsE<sol>phpE<sol>infoE<sol>index.php>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using the L</fastcgi_split_path_info> directive,[m
[31m-the C<$fastcgi_script_name> variable equals the value of[m
[31m-the first capture set by the directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$fastcgi_path_info>[m
[31m-[m
[31m-[m
[31m-[m
[31m-the value of the second capture set by the[m
[31m-L</fastcgi_split_path_info> directive.[m
[31m-This variable can be used to set the[m
[31m-C<PATH_INFO> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_flv_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_flv_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d0574e6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_flv_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_flv_module - Module ngx_http_flv_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_flv_module> module provides pseudo-streaming[m
[31m-server-side support for Flash Video (FLV) files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It handles requests with the C<start> argument in[m
[31m-the request URI’s query string specially, by sending back the contents[m
[31m-of a file starting from the requested byte offset and with the prepended FLV[m
[31m-header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_flv_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location ~ \.flv$ {[m
[31m-        flv;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 flv[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_geo_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_geo_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 2dab484..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_geo_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,260 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_geo_module - Module ngx_http_geo_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_geo_module> module creates variables[m
[31m-with values depending on the client IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    geo $geo {[m
[31m-        default        0;[m
[31m-    [m
[31m-        127.0.0.1      2;[m
[31m-        192.168.1.0/24 1;[m
[31m-        10.1.0.0/16    1;[m
[31m-    [m
[31m-        ::1            2;[m
[31m-        2001:0db8::/32 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 geo[m
[31m-[m
[31m-[m
[31m-B<syntax:> geo I<[I<C<$address>>] I<C<$variable>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Describes the dependency of values of the specified variable[m
[31m-on the client IP address.[m
[31m-By default, the address is taken from the C<$remote_addr> variable,[m
[31m-but it can also be taken from another variable (0.7.27), for example:[m
[31m-[m
[31m-    [m
[31m-    geo $arg_remote_addr $geo {[m
[31m-        ...;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Since variables are evaluated only when used, the mere existence[m
[31m-of even a large number of declared “C<geo>” variables[m
[31m-does not cause any extra costs for request processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the value of a variable does not represent a valid IP address[m
[31m-then the “C<255.255.255.255>” address is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Addresses are specified either as prefixes in CIDR notation[m
[31m-(including individual addresses) or as ranges (0.7.23).[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-IPv6 prefixes are supported starting from versions 1.3.10 and 1.2.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following special parameters are also supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<delete>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-deletes the specified network (0.7.23).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<default>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a value set to the variable if the client address does not[m
[31m-match any of the specified addresses.[m
[31m-When addresses are specified in CIDR notation,[m
[31m-“C<0.0.0.0E<sol>0>” and “C<::E<sol>0>”[m
[31m-can be used instead of C<default>.[m
[31m-When C<default> is not specified, the default[m
[31m-value will be an empty string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<include>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-includes a file with addresses and values.[m
[31m-There can be several inclusions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<proxy>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines trusted addresses (0.8.7, 0.7.63).[m
[31m-When a request comes from a trusted address,[m
[31m-an address from the C<X-Forwarded-For> request[m
[31m-header field will be used instead.[m
[31m-In contrast to the regular addresses, trusted addresses are[m
[31m-checked sequentially.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Trusted IPv6 addresses are supported starting from versions 1.3.0 and 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<proxy_recursive>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables recursive address search (1.3.0, 1.2.1).[m
[31m-If recursive search is disabled then instead of the original client[m
[31m-address that matches one of the trusted addresses, the last[m
[31m-address sent in C<X-Forwarded-For> will be used.[m
[31m-If recursive search is enabled then instead of the original client[m
[31m-address that matches one of the trusted addresses, the last[m
[31m-non-trusted address sent in C<X-Forwarded-For> will be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<ranges>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-indicates that addresses are specified as ranges (0.7.23).[m
[31m-This parameter should be the first.[m
[31m-To speed up loading of a geo base, addresses should be put in ascending order.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    geo $country {[m
[31m-        default        ZZ;[m
[31m-        include        conf/geo.conf;[m
[31m-        delete         127.0.0.0/16;[m
[31m-        proxy          192.168.100.0/24;[m
[31m-        proxy          2001:0db8::/32;[m
[31m-    [m
[31m-        127.0.0.0/24   US;[m
[31m-        127.0.0.1/32   RU;[m
[31m-        10.1.0.0/16    RU;[m
[31m-        192.168.1.0/24 UK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The F<confE<sol>geo.conf> file could contain the following lines:[m
[31m-[m
[31m-    [m
[31m-    10.2.0.0/16    RU;[m
[31m-    192.168.2.0/24 RU;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A value of the most specific match is used.[m
[31m-For example, for the 127.0.0.1 address the value “C<RU>”[m
[31m-will be chosen, not “C<US>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example with ranges:[m
[31m-[m
[31m-    [m
[31m-    geo $country {[m
[31m-        ranges;[m
[31m-        default                   ZZ;[m
[31m-        127.0.0.0-127.0.0.0       US;[m
[31m-        127.0.0.1-127.0.0.1       RU;[m
[31m-        127.0.0.1-127.0.0.255     US;[m
[31m-        10.1.0.0-10.1.255.255     RU;[m
[31m-        192.168.1.0-192.168.1.255 UK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_geoip_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_geoip_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d0a3601..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_geoip_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,393 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_geoip_module - Module ngx_http_geoip_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_geoip_module> module (0.8.6+) creates variables[m
[31m-with values depending on the client IP address, using the precompiled[m
[31m-L<MaxMind|http://www.maxmind.com> databases.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using the databases with IPv6 support (1.3.12, 1.2.7),[m
[31m-IPv4 addresses are looked up as IPv4-mapped IPv6 addresses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_geoip_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires the[m
[31m-L<MaxMind GeoIP|http://www.maxmind.com/app/c> library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        geoip_country         GeoIP.dat;[m
[31m-        geoip_city            GeoLiteCity.dat;[m
[31m-        geoip_proxy           192.168.100.0/24;[m
[31m-        geoip_proxy           2001:0db8::/32;[m
[31m-        geoip_proxy_recursive on;[m
[31m-        ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 geoip_country[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_country I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a database used to determine the country[m
[31m-depending on the client IP address.[m
[31m-The following variables are available when using this database:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_country_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-two-letter country code, for example,[m
[31m-“C<RU>”, “C<US>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_country_code3>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-three-letter country code, for example,[m
[31m-“C<RUS>”, “C<USA>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_country_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-country name, for example,[m
[31m-“C<Russian Federation>”, “C<United States>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 geoip_city[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_city I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a database used to determine the country, region, and city[m
[31m-depending on the client IP address.[m
[31m-The following variables are available when using this database:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_area_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-telephone area code (US only).[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This variable may contain outdated information since[m
[31m-the corresponding database field is deprecated.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<$geoip_city_continent_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-two-letter continent code, for example,[m
[31m-“C<EU>”, “C<NA>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_city_country_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-two-letter country code, for example,[m
[31m-“C<RU>”, “C<US>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_city_country_code3>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-three-letter country code, for example,[m
[31m-“C<RUS>”, “C<USA>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_city_country_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-country name, for example,[m
[31m-“C<Russian Federation>”, “C<United States>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_dma_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-DMA region code in US (also known as “metro code”), according to the[m
[31m-L<geotargeting|https://developers.google.com/adwords/api/docs/appendix/cities-DMAregions>[m
[31m-in Google AdWords API.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_latitude>[m
[31m-[m
[31m-[m
[31m-[m
[31m-latitude.[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_longitude>[m
[31m-[m
[31m-[m
[31m-[m
[31m-longitude.[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_region>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-two-symbol country region code (region, territory, state, province, federal land[m
[31m-and the like), for example,[m
[31m-“C<48>”, “C<DC>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_region_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-country region name (region, territory, state, province, federal land[m
[31m-and the like), for example,[m
[31m-“C<Moscow City>”, “C<District of Columbia>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_city>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-city name, for example,[m
[31m-“C<Moscow>”, “C<Washington>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_postal_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-postal code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 geoip_org[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_org I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a database used to determine the organization[m
[31m-depending on the client IP address.[m
[31m-The following variable is available when using this database:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_org>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-organization name, for example, “The University of Melbourne”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 geoip_proxy[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_proxy I<I<C<address>> E<verbar> I<C<CIDR>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines trusted addresses.[m
[31m-When a request comes from a trusted address,[m
[31m-an address from the C<X-Forwarded-For> request[m
[31m-header field will be used instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 geoip_proxy_recursive[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_proxy_recursive I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If recursive search is disabled then instead of the original client[m
[31m-address that matches one of the trusted addresses, the last[m
[31m-address sent in C<X-Forwarded-For> will be used.[m
[31m-If recursive search is enabled then instead of the original client[m
[31m-address that matches one of the trusted addresses, the last[m
[31m-non-trusted address sent in C<X-Forwarded-For> will be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gunzip_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gunzip_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 0cebda0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gunzip_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_gunzip_module - Module ngx_http_gunzip_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_gunzip_module> module is a filter that[m
[31m-decompresses responses with “C<Content-Encoding: gzip>”[m
[31m-for clients that do not support “gzip” encoding method.[m
[31m-The module will be useful when it is desirable to store[m
[31m-data compressed to save space and reduce IE<sol>O costs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_gunzip_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /storage/ {[m
[31m-        gunzip on;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 gunzip[m
[31m-[m
[31m-[m
[31m-B<syntax:> gunzip I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables decompression of gzipped responses[m
[31m-for clients that lack gzip support.[m
[31m-If enabled, the following directives are also taken into account[m
[31m-when determining if clients support gzip:[m
[31m-L<ngx_http_gzip_module>,[m
[31m-L<ngx_http_gzip_module>, and[m
[31m-L<ngx_http_gzip_module>.[m
[31m-See also the L<ngx_http_gzip_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gunzip_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> gunzip_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32 4kE<verbar>16 8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of buffers[m
[31m-used to decompress a response.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gzip_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gzip_module.pod[m
[1mdeleted file mode 100644[m
[1mindex e096eec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gzip_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,482 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_gzip_module - Module ngx_http_gzip_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_gzip_module> module is a filter[m
[31m-that compresses responses using the “gzip” method.[m
[31m-This often helps to reduce the size of transmitted data by half or even more.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    gzip            on;[m
[31m-    gzip_min_length 1000;[m
[31m-    gzip_proxied    expired no-cache no-store private auth;[m
[31m-    gzip_types      text/plain application/xml;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<$gzip_ratio> variable can be used to log the[m
[31m-achieved compression ratio.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 gzip[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables gzipping of responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32 4kE<verbar>16 8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of buffers[m
[31m-used to compress a response.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Until version 0.7.28, four 4K or 8K buffers were used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_comp_level[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_comp_level I<I<C<level>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a gzip compression I<C<level>> of a response.[m
[31m-Acceptable values are in the range from 1 to 9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_disable[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_disable I<I<C<regex>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.6.23.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables gzipping of responses for requests with[m
[31m-C<User-Agent> header fields matching[m
[31m-any of the specified regular expressions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special mask “C<msie6>” (0.7.12) corresponds to[m
[31m-the regular expression “C<MSIE [4-6]\.>”, but works faster.[m
[31m-Starting from version 0.8.11, “C<MSIE 6.0; ... SV1>”[m
[31m-is excluded from this mask.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_min_length[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_min_length I<I<C<length>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<20>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the minimum length of a response that will be gzipped.[m
[31m-The length is determined only from the C<Content-Length>[m
[31m-response header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_http_version[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_http_version I<C<1.0> E<verbar> C<1.1>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1.1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the minimum HTTP version of a request required to compress a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_proxied[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_proxied I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<expired> E<verbar>[m
[31m-    C<no-cache> E<verbar>[m
[31m-    C<no-store> E<verbar>[m
[31m-    C<private> E<verbar>[m
[31m-    C<no_last_modified> E<verbar>[m
[31m-    C<no_etag> E<verbar>[m
[31m-    C<auth> E<verbar>[m
[31m-    C<any>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables gzipping of responses for proxied[m
[31m-requests depending on the request and response.[m
[31m-The fact that the request is proxied is determined by[m
[31m-the presence of the C<Via> request header field.[m
[31m-The directive accepts multiple parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables compression for all proxied requests,[m
[31m-ignoring other parameters;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<expired>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header includes the[m
[31m-C<Expires> field with a value that disables caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<no-cache>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header includes the[m
[31m-C<Cache-Control> field with the[m
[31m-“C<no-cache>” parameter;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<no-store>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header includes the[m
[31m-C<Cache-Control> field with the[m
[31m-“C<no-store>” parameter;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<private>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header includes the[m
[31m-C<Cache-Control> field with the[m
[31m-“C<private>” parameter;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<no_last_modified>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header does not include the[m
[31m-C<Last-Modified> field;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<no_etag>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header does not include the[m
[31m-C<ETag> field;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<auth>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a request header includes the[m
[31m-C<Authorization> field;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<any>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression for all proxied requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables gzipping of responses for the specified MIME types in addition[m
[31m-to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-Responses with the “C<textE<sol>html>” type are always compressed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_vary[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_vary I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables inserting the C<Vary: Accept-Encoding>[m
[31m-response header field if the directives[m
[31m-L</gzip>,[m
[31m-L<ngx_http_gzip_static_module>, or[m
[31m-L<ngx_http_gunzip_module>[m
[31m-are active.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$gzip_ratio>[m
[31m-[m
[31m-[m
[31m-[m
[31m-achieved compression ratio, computed as the ratio between the[m
[31m-original and compressed response sizes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gzip_static_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gzip_static_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d1e9b89..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_gzip_static_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,101 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_gzip_static_module - Module ngx_http_gzip_static_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_gzip_static_module> module allows[m
[31m-sending precompressed files with the “C<.gz>”[m
[31m-filename extension instead of regular files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_gzip_static_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    gzip_static  on;[m
[31m-    gzip_proxied expired no-cache no-store private auth;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 gzip_static[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_static I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    C<always>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables (“C<on>”) or disables (“C<off>”)[m
[31m-checking the existence of precompressed files.[m
[31m-The following directives are also taken into account:[m
[31m-L<ngx_http_gzip_module>,[m
[31m-L<ngx_http_gzip_module>,[m
[31m-L<ngx_http_gzip_module>,[m
[31m-and L<ngx_http_gzip_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With the “C<always>” value (1.3.6), gzipped file is used[m
[31m-in all cases, without checking if the client supports it.[m
[31m-It is useful if there are no uncompressed files on the disk anyway[m
[31m-or the L<ngx_http_gunzip_module|ngx_http_gunzip_module>[m
[31m-is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The files can be compressed using the C<gzip> command,[m
[31m-or any other compatible one.[m
[31m-It is recommended that the modification date and time of original and[m
[31m-compressed files be the same.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_headers_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_headers_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 8cff85a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_headers_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,222 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_headers_module - Module ngx_http_headers_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_headers_module> module allows adding[m
[31m-the C<Expires> and C<Cache-Control> header[m
[31m-fields, and arbitrary fields, to a response header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    expires    24h;[m
[31m-    expires    modified +24h;[m
[31m-    expires    @24h;[m
[31m-    expires    0;[m
[31m-    expires    -1;[m
[31m-    expires    epoch;[m
[31m-    expires    $expires;[m
[31m-    add_header Cache-Control private;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 add_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> add_header I<[m
[31m-I<C<name>> I<C<value>>[m
[31m-[C<always>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the specified field to a response header provided that[m
[31m-the response code equals 200, 201, 204, 206, 301, 302, 303, 304, or 307.[m
[31m-A value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<add_header> directives.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<add_header>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<always> parameter is specified (1.7.5),[m
[31m-the header field will be added regardless of the response code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 expires[m
[31m-[m
[31m-[m
[31m-B<syntax:> expires I<[C<modified>] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> expires I<[m
[31m-    C<epoch> E<verbar>[m
[31m-    C<max> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables adding or modifying the C<Expires>[m
[31m-and C<Cache-Control> response header fields provided that[m
[31m-the response code equals 200, 201, 204, 206, 301, 302, 303, 304, or 307.[m
[31m-A parameter can be a positive or negative[m
[31m-L<time|syntax>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A time in the C<Expires> field is computed as a sum of the[m
[31m-current time and I<C<time>> specified in the directive.[m
[31m-If the C<modified> parameter is used (0.7.0, 0.6.32)[m
[31m-then time is computed as a sum of the file’s modification time and[m
[31m-I<C<time>> specified in the directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, it is possible to specify a time of the day using[m
[31m-the “C<@>” prefix (0.7.9, 0.6.34):[m
[31m-[m
[31m-    [m
[31m-    expires @15h30m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<epoch> parameter corresponds to the absolute time[m
[31m-“C<Thu, 01 Jan 1970 00:00:01 GMT>”.[m
[31m-The contents of the C<Cache-Control> field depends[m
[31m-on the sign of the specified time:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-time is negative — C<Cache-Control: no-cache>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-time is positive or zero —[m
[31m-C<Cache-Control: max-age=I<C<t>>>,[m
[31m-where I<C<t>> is a time specified in the directive, in seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<max> parameter sets C<Expires>[m
[31m-to the value “C<Thu, 31 Dec 2037 23:55:55 GMT>”,[m
[31m-and C<Cache-Control> to 10 years.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<off> parameter disables adding or modifying the[m
[31m-C<Expires> and C<Cache-Control> response[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The last parameter value can contain variables (1.7.9):[m
[31m-[m
[31m-    [m
[31m-    map $sent_http_content_type $expires {[m
[31m-        default         off;[m
[31m-        application/pdf 42d;[m
[31m-        ~image/         max;[m
[31m-    }[m
[31m-    [m
[31m-    expires $expires;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_hls_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_hls_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 327cfa5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_hls_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,407 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_hls_module - Module ngx_http_hls_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_hls_module> module provides HTTP Live Streaming[m
[31m-(HLS) server-side support for MP4 and MOV media files.[m
[31m-Such files typically have the F<.mp4>, F<.m4v>,[m
[31m-F<.m4a>, F<.mov>, or F<.qt> filename extensions.[m
[31m-The module supports H.264 video codec, AAC and MP3 audio codecs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each media file, two URIs are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A playlist URI with the “C<.m3u8>” filename extension.[m
[31m-The URI can accept optional arguments:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-“C<start>” and “C<end>”[m
[31m-define playlist boundaries in seconds (1.9.0).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-“C<offset>” shifts an initial playback position[m
[31m-to the time offset in seconds (1.9.0).[m
[31m-A positive value sets a time offset from the beginning of the playlist.[m
[31m-A negative value sets a time offset[m
[31m-from the end of the last fragment in the playlist.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-“C<len>” defines the fragment length in seconds.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A fragment URI with the “C<.ts>” filename extension.[m
[31m-The URI can accept optional arguments:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-“C<start>” and “C<end>”[m
[31m-define fragment boundaries in seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        hls;[m
[31m-        hls_fragment            5s;[m
[31m-        hls_buffers             10 10m;[m
[31m-        hls_mp4_buffer_size     1m;[m
[31m-        hls_mp4_max_buffer_size 5m;[m
[31m-        root /var/video/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-With this configuration, the following URIs are supported for[m
[31m-the “F<E<sol>varE<sol>videoE<sol>test.mp4>” file:[m
[31m-[m
[31m-    [m
[31m-    http://hls.example.com/test.mp4.m3u8?offset=1.000&start=1.000&end=2.200[m
[31m-    http://hls.example.com/test.mp4.m3u8?len=8.000[m
[31m-    http://hls.example.com/test.mp4.ts?start=1.000&end=2.200[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 hls[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on HLS streaming in the surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 2m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<number>> and I<C<size>> of buffers[m
[31m-that are used for reading and writing data frames.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_forward_args[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_forward_args I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds arguments from a playlist request to URIs of fragments.[m
[31m-This may be useful for performing client authorization at the moment of[m
[31m-requesting a fragment, or when protecting an HLS stream with the[m
[31m-L<ngx_http_secure_link_module|ngx_http_secure_link_module>[m
[31m-module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, if a client requests a playlist[m
[31m-C<http:E<sol>E<sol>example.comE<sol>hlsE<sol>test.mp4.m3u8?a=1E<amp>b=2>,[m
[31m-the arguments C<a=1> and C<b=2>[m
[31m-will be added to URIs of fragments after the arguments[m
[31m-C<start> and C<end>:[m
[31m-[m
[31m-    [m
[31m-    #EXTM3U[m
[31m-    #EXT-X-VERSION:3[m
[31m-    #EXT-X-TARGETDURATION:15[m
[31m-    #EXT-X-PLAYLIST-TYPE:VOD[m
[31m-    [m
[31m-    #EXTINF:9.333,[m
[31m-    test.mp4.ts?start=0.000&end=9.333&a=1&b=2[m
[31m-    #EXTINF:7.167,[m
[31m-    test.mp4.ts?start=9.333&end=16.500&a=1&b=2[m
[31m-    #EXTINF:5.416,[m
[31m-    test.mp4.ts?start=16.500&end=21.916&a=1&b=2[m
[31m-    #EXTINF:5.500,[m
[31m-    test.mp4.ts?start=21.916&end=27.416&a=1&b=2[m
[31m-    #EXTINF:15.167,[m
[31m-    test.mp4.ts?start=27.416&end=42.583&a=1&b=2[m
[31m-    #EXTINF:9.626,[m
[31m-    test.mp4.ts?start=42.583&end=52.209&a=1&b=2[m
[31m-    [m
[31m-    #EXT-X-ENDLIST[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If an HLS stream is protected with the[m
[31m-L<ngx_http_secure_link_module|ngx_http_secure_link_module>[m
[31m-module, C<$uri> should not be used in the[m
[31m-L<ngx_http_secure_link_module>[m
[31m-expression because this will cause errors when requesting the fragments.[m
[31m-L<Base URI|ngx_http_map_module> should be used[m
[31m-instead of C<$uri>[m
[31m-(C<$hls_uri> in the example):[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        ...[m
[31m-    [m
[31m-        map $uri $hls_uri {[m
[31m-            ~^(?<base_uri>.*).m3u8$ $base_uri;[m
[31m-            ~^(?<base_uri>.*).ts$   $base_uri;[m
[31m-            default                 $uri;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            ...[m
[31m-    [m
[31m-            location /hls {[m
[31m-                hls;[m
[31m-                hls_forward_args on;[m
[31m-    [m
[31m-                alias /var/videos;[m
[31m-    [m
[31m-                secure_link $arg_md5,$arg_expires;[m
[31m-                secure_link_md5 "$secure_link_expires$hls_uri$remote_addr secret";[m
[31m-    [m
[31m-                if ($secure_link = "") {[m
[31m-                    return 403;[m
[31m-                }[m
[31m-    [m
[31m-                if ($secure_link = "0") {[m
[31m-                    return 410;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_fragment[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_fragment I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the default fragment length for playlist URIs requested without the[m
[31m-“C<len>” argument.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_mp4_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_mp4_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the initial I<C<size>> of the buffer used for[m
[31m-processing MP4 and MOV files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_mp4_max_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_mp4_max_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<10m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-During metadata processing, a larger buffer may become necessary.[m
[31m-Its size cannot exceed the specified I<C<size>>,[m
[31m-or else nginx will return the server error[m
[31m-C<500> (C<Internal Server Error>),[m
[31m-and log the following message:[m
[31m-[m
[31m-    [m
[31m-    "/some/movie/file.mp4" mp4 moov atom is too large:[m
[31m-    12583268, you may want to increase hls_mp4_max_buffer_size[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_image_filter_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_image_filter_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 47bd541..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_image_filter_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,370 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_image_filter_module - Module ngx_http_image_filter_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_image_filter_module> module (0.7.54+) is a filter[m
[31m-that transforms images in JPEG, GIF, and PNG formats.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_image_filter_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module utilizes the[m
[31m-L<libgd|http://libgd.org> library.[m
[31m-It is recommended to use the latest available version of the library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /img/ {[m
[31m-        proxy_pass   http://backend;[m
[31m-        image_filter resize 150 100;[m
[31m-        image_filter rotate 90;[m
[31m-        error_page   415 = /empty;[m
[31m-    }[m
[31m-    [m
[31m-    location = /empty {[m
[31m-        empty_gif;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 image_filter[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<C<test>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<C<size>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<[m
[31m-    C<rotate>[m
[31m-    C<90> E<verbar> C<180> E<verbar>[m
[31m-    C<270>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<[m
[31m-    C<resize>[m
[31m-    I<C<width>>[m
[31m-    I<C<height>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<[m
[31m-    C<crop>[m
[31m-    I<C<width>>[m
[31m-    I<C<height>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the type of transformation to perform on images:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-turns off module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<test>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-ensures that responses are images in either JPEG, GIF, or PNG format.[m
[31m-Otherwise, the[m
[31m-C<415> (C<Unsupported Media Type>)[m
[31m-error is returned.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-outputs information about images in a JSON format, e.g.:[m
[31m-[m
[31m-    [m
[31m-    { "img" : { "width": 100, "height": 100, "type": "gif" } }[m
[31m-[m
[31m-[m
[31m-In case of an error, the output is as follows:[m
[31m-[m
[31m-    [m
[31m-    {}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<rotate>[m
[31m-C<90>E<verbar>C<180>E<verbar>C<270>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-rotates images counter-clockwise by the specified number of degrees.[m
[31m-Parameter value can contain variables.[m
[31m-This mode can be used either alone or along with the[m
[31m-C<resize> and C<crop> transformations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<resize>[m
[31m-I<C<width>>[m
[31m-I<C<height>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-proportionally reduces an image to the specified sizes.[m
[31m-To reduce by only one dimension, another dimension can be specified as[m
[31m-“C<->”.[m
[31m-In case of an error, the server will return code[m
[31m-C<415> (C<Unsupported Media Type>).[m
[31m-Parameter values can contain variables.[m
[31m-When used along with the C<rotate> parameter,[m
[31m-the rotation happens I<after> reduction.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<crop>[m
[31m-I<C<width>>[m
[31m-I<C<height>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-proportionally reduces an image to the larger side size[m
[31m-and crops extraneous edges by another side.[m
[31m-To reduce by only one dimension, another dimension can be specified as[m
[31m-“C<->”.[m
[31m-In case of an error, the server will return code[m
[31m-C<415> (C<Unsupported Media Type>).[m
[31m-Parameter values can contain variables.[m
[31m-When used along with the C<rotate> parameter,[m
[31m-the rotation happens I<before> reduction.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_buffer[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_buffer I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1M>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum size of the buffer used for reading images.[m
[31m-When the size is exceeded the server returns error[m
[31m-C<415> (C<Unsupported Media Type>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_interlace[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_interlace I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If enabled, final images will be interlaced.[m
[31m-For JPEG, final images will be in “progressive JPEG” format.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_jpeg_quality[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_jpeg_quality I<I<C<quality>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<75>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the desired I<C<quality>> of the transformed JPEG images.[m
[31m-Acceptable values are in the range from 1 to 100.[m
[31m-Lesser values usually imply both lower image quality and less data to transfer.[m
[31m-The maximum recommended value is 95.[m
[31m-Parameter value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_sharpen[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_sharpen I<I<C<percent>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Increases sharpness of the final image.[m
[31m-The sharpness percentage can exceed 100.[m
[31m-The zero value disables sharpening.[m
[31m-Parameter value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_transparency[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_transparency I<C<on>E<verbar>C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines whether transparency should be preserved when transforming[m
[31m-GIF images or PNG images with colors specified by a palette.[m
[31m-The loss of transparency results in images of a better quality.[m
[31m-The alpha channel transparency in PNG is always preserved.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_index_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_index_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 841a709..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_index_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,100 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_index_module - Module ngx_http_index_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_index_module> module processes requests[m
[31m-ending with the slash character (‘C<E<sol>>’).[m
[31m-Such requests can also be processed by the[m
[31m-L<ngx_http_autoindex_module|ngx_http_autoindex_module>[m
[31m-and[m
[31m-L<ngx_http_random_index_module|ngx_http_random_index_module>[m
[31m-modules.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        index index.$geo.html index.html;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 index[m
[31m-[m
[31m-[m
[31m-B<syntax:> index I<I<C<file>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<index.html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines files that will be used as an index.[m
[31m-The I<C<file>> name can contain variables.[m
[31m-Files are checked in the specified order.[m
[31m-The last element of the list can be a file with an absolute path.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    index index.$geo.html index.0.html /index.html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be noted that using an index file causes an internal redirect,[m
[31m-and the request can be processed in a different location.[m
[31m-For example, with the following configuration:[m
[31m-[m
[31m-    [m
[31m-    location = / {[m
[31m-        index index.html;[m
[31m-    }[m
[31m-    [m
[31m-    location / {[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-a “C<E<sol>>” request will actually be processed in the[m
[31m-second location as “C<E<sol>index.html>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_limit_conn_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_limit_conn_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d5749e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_limit_conn_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,293 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_limit_conn_module - Module ngx_http_limit_conn_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_limit_conn_module> module is used to[m
[31m-limit the number of connections per the defined key, in[m
[31m-particular, the number of connections from a single IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Not all connections are counted.[m
[31m-A connection is counted only if it has a request processed by the server[m
[31m-and the whole request header has already been read.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-    [m
[31m-            ...[m
[31m-    [m
[31m-            location /download/ {[m
[31m-                limit_conn addr 1;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 limit_conn[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn I<I<C<zone>> I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the shared memory zone[m
[31m-and the maximum allowed number of connections for a given key value.[m
[31m-When this limit is exceeded, the server will return the[m
[31m-C<503> (C<Service Temporarily Unavailable>)[m
[31m-error in reply to a request.[m
[31m-For example, the directives[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-    [m
[31m-    server {[m
[31m-        location /download/ {[m
[31m-            limit_conn addr 1;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-allow only one connection per an IP address at a time.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In HTTPE<sol>2 and SPDY, each concurrent request is considered a separate connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<limit_conn> directives.[m
[31m-For example, the following configuration will limit the number[m
[31m-of connections to the server per a client IP and, at the same time,[m
[31m-the total number of connections to the virtual server:[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=perip:10m;[m
[31m-    limit_conn_zone $server_name zone=perserver:10m;[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        limit_conn perip 10;[m
[31m-        limit_conn perserver 100;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<limit_conn>[m
[31m-directives on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_log_level[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_log_level I<[m
[31m-C<info> E<verbar>[m
[31m-C<notice> E<verbar>[m
[31m-C<warn> E<verbar>[m
[31m-C<error>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the desired logging level for cases when the server[m
[31m-limits the number of connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_status[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_status I<I<C<code>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<503>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the status code to return in response to rejected requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_zone I<[m
[31m-    I<C<key>>[m
[31m-    C<zone>=I<C<name>>:I<C<size>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets parameters for a shared memory zone[m
[31m-that will keep states for various keys.[m
[31m-In particular, the state includes the current number of connections.[m
[31m-The I<C<key>> can contain text, variables, and their combination.[m
[31m-Requests with an empty key value are not accounted.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.7.6, a I<C<key>> could contain exactly one variable.[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-[m
[31m-[m
[31m-Here, a client IP address serves as a key.[m
[31m-Note that instead of C<$remote_addr>, the[m
[31m-C<$binary_remote_addr> variable is used here.[m
[31m-The C<$remote_addr> variable’s size can[m
[31m-vary from 7 to 15 bytes.[m
[31m-The stored state occupies either[m
[31m-32 or 64 bytes of memory on 32-bit platforms and always 64[m
[31m-bytes on 64-bit platforms.[m
[31m-The C<$binary_remote_addr> variable’s size[m
[31m-is always 4 bytes for IPv4 addresses or 16 bytes for IPv6 addresses.[m
[31m-The stored state always occupies 32 or 64 bytes[m
[31m-on 32-bit platforms and 64 bytes on 64-bit platforms.[m
[31m-One megabyte zone can keep about 32 thousand 32-byte states[m
[31m-or about 16 thousand 64-byte states.[m
[31m-If the zone storage is exhausted, the server will return the[m
[31m-C<503> (C<Service Temporarily Unavailable>)[m
[31m-error to all further requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_zone I<[m
[31m-    I<C<name>>[m
[31m-    I<C<$variable>>[m
[31m-    I<C<size>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive was made obsolete in version 1.1.8[m
[31m-and was removed in version 1.7.6.[m
[31m-An equivalent L</limit_conn_zone> directive[m
[31m-with a changed syntax should be used instead:[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-C<limit_conn_zone>[m
[31m-I<C<$variable>>[m
[31m-C<zone>=I<C<name>>:I<C<size>>;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_limit_req_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_limit_req_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 493c8cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_limit_req_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_limit_req_module - Module ngx_http_limit_req_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_limit_req_module> module (0.7.21) is used[m
[31m-to limit the request processing rate per a defined key,[m
[31m-in particular, the processing rate of requests coming[m
[31m-from a single IP address.[m
[31m-The limitation is done using the “leaky bucket” method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-    [m
[31m-            ...[m
[31m-    [m
[31m-            location /search/ {[m
[31m-                limit_req zone=one burst=5;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 limit_req[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_req I<[m
[31m-    C<zone>=I<C<name>>[m
[31m-    [C<burst>=I<C<number>>][m
[31m-    [C<nodelay>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the shared memory zone[m
[31m-and the maximum burst size of requests.[m
[31m-If the requests rate exceeds the rate configured for a zone,[m
[31m-their processing is delayed such that requests are processed[m
[31m-at a defined rate.[m
[31m-Excessive requests are delayed until their number exceeds the[m
[31m-maximum burst size[m
[31m-in which case the request is terminated with an error[m
[31m-C<503> (C<Service Temporarily Unavailable>).[m
[31m-By default, the maximum burst size is equal to zero.[m
[31m-For example, the directives[m
[31m-[m
[31m-    [m
[31m-    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;[m
[31m-    [m
[31m-    server {[m
[31m-        location /search/ {[m
[31m-            limit_req zone=one burst=5;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-allow not more than 1 request per second at an average,[m
[31m-with bursts not exceeding 5 requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If delaying of excessive requests while requests are being limited is not[m
[31m-desired, the parameter C<nodelay> should be used:[m
[31m-[m
[31m-    [m
[31m-    limit_req zone=one burst=5 nodelay;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<limit_req> directives.[m
[31m-For example, the following configuration will limit the processing rate[m
[31m-of requests coming from a single IP address and, at the same time,[m
[31m-the request processing rate by the virtual server:[m
[31m-[m
[31m-    [m
[31m-    limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;[m
[31m-    limit_req_zone $server_name zone=perserver:10m rate=10r/s;[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        limit_req zone=perip burst=5 nodelay;[m
[31m-        limit_req zone=perserver burst=10;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<limit_req>[m
[31m-directives on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_req_log_level[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_req_log_level I<[m
[31m-C<info> E<verbar>[m
[31m-C<notice> E<verbar>[m
[31m-C<warn> E<verbar>[m
[31m-C<error>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the desired logging level[m
[31m-for cases when the server refuses to process requests[m
[31m-due to rate exceeding,[m
[31m-or delays request processing.[m
[31m-Logging level for delays is one point less than for refusals; for example,[m
[31m-if “C<limit_req_log_level notice>” is specified,[m
[31m-delays are logged with the C<info> level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_req_status[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_req_status I<I<C<code>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<503>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the status code to return in response to rejected requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_req_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_req_zone I<[m
[31m-    I<C<key>>[m
[31m-    C<zone>=I<C<name>>:I<C<size>>[m
[31m-    C<rate>=I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets parameters for a shared memory zone[m
[31m-that will keep states for various keys.[m
[31m-In particular, the state stores the current number of excessive requests.[m
[31m-The I<C<key>> can contain text, variables, and their combination.[m
[31m-Requests with an empty key value are not accounted.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.7.6, a I<C<key>> could contain exactly one variable.[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Here, the states are kept in a 10 megabyte zone “one”, and an[m
[31m-average request processing rate for this zone cannot exceed[m
[31m-1 request per second.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A client IP address serves as a key.[m
[31m-Note that instead of C<$remote_addr>, the[m
[31m-C<$binary_remote_addr> variable is used here.[m
[31m-The C<$binary_remote_addr> variable’s size[m
[31m-is always 4 bytes for IPv4 addresses or 16 bytes for IPv6 addresses.[m
[31m-The stored state always occupies[m
[31m-64 bytes on 32-bit platforms and 128 bytes on 64-bit platforms.[m
[31m-One megabyte zone can keep about 16 thousand 64-byte states[m
[31m-or about 8 thousand 128-byte states.[m
[31m-If the zone storage is exhausted, the server will return the[m
[31m-C<503> (C<Service Temporarily Unavailable>)[m
[31m-error to all further requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The rate is specified in requests per second (rE<sol>s).[m
[31m-If a rate of less than one request per second is desired,[m
[31m-it is specified in request per minute (rE<sol>m).[m
[31m-For example, half-request per second is 30rE<sol>m.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_log_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_log_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 83bb3da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_log_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,561 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_log_module - Module ngx_http_log_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_log_module> module writes request logs[m
[31m-in the specified format.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Requests are logged in the context of a location where processing ends.[m
[31m-It may be different from the original location, if an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> happens during request processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    log_format compression '$remote_addr - $remote_user [$time_local] '[m
[31m-                           '"$request" $status $bytes_sent '[m
[31m-                           '"$http_referer" "$http_user_agent" "$gzip_ratio"';[m
[31m-    [m
[31m-    access_log /spool/logs/nginx-access.log compression buffer=32k;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 access_log[m
[31m-[m
[31m-[m
[31m-B<syntax:> access_log I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<format>>[m
[31m-    [C<buffer>=I<C<size>>][m
[31m-    [C<gzip[=I<C<level>>]>][m
[31m-    [C<flush>=I<C<time>>][m
[31m-    [C<if>=I<C<condition>>]]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> access_log I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<logsE<sol>access.log combined>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path, format, and configuration for a buffered log write.[m
[31m-Several logs can be specified on the same level.[m
[31m-Logging to L<syslog|syslog>[m
[31m-can be configured by specifying[m
[31m-the “C<syslog:>” prefix in the first parameter.[m
[31m-The special value C<off> cancels all[m
[31m-C<access_log> directives on the current level.[m
[31m-If the format is not specified then the predefined[m
[31m-“C<combined>” format is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If either the C<buffer> or C<gzip>[m
[31m-(1.3.10, 1.2.7)[m
[31m-parameter is used, writes to log will be buffered.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The buffer size must not exceed the size of an atomic write to a disk file.[m
[31m-For FreeBSD this size is unlimited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the data will be written to the file:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-if the next log line does not fit into the buffer;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-if the buffered data is older than specified by the C<flush>[m
[31m-parameter (1.3.10, 1.2.7);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-when a worker process is L<re-opening|control> log[m
[31m-files or is shutting down.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<gzip> parameter is used, then the buffered data will[m
[31m-be compressed before writing to the file.[m
[31m-The compression level can be set between 1 (fastest, less compression)[m
[31m-and 9 (slowest, best compression).[m
[31m-By default, the buffer size is equal to 64K bytes, and the compression level[m
[31m-is set to 1.[m
[31m-Since the data is compressed in atomic blocks, the log file can be decompressed[m
[31m-or read by “C<zcat>” at any time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    access_log /path/to/log.gz combined gzip flush=5m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-For gzip compression to work, nginx must be built with the zlib library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The file path can contain variables (0.7.6+),[m
[31m-but such logs have some constraints:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ngx_core_module>[m
[31m-whose credentials are used by worker processes should[m
[31m-have permissions to create files in a directory with[m
[31m-such logs;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-buffered writes do not work;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the file is opened and closed for each log write.[m
[31m-However, since the descriptors of frequently used files can be stored[m
[31m-in a cache, writing to the old file[m
[31m-can continue during the time specified by the L</open_log_file_cache>[m
[31m-directive’s C<valid> parameter[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-during each log write the existence of the request’s[m
[31m-L<root directory|ngx_http_core_module>[m
[31m-is checked, and if it does not exist the log is not[m
[31m-created.[m
[31m-It is thus a good idea to specify both[m
[31m-L<ngx_http_core_module>[m
[31m-and C<access_log> on the same level:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        root       /spool/vhost/data/$host;[m
[31m-        access_log /spool/vhost/logs/$host;[m
[31m-        ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<if> parameter (1.7.0) enables conditional logging.[m
[31m-A request will not be logged if the I<C<condition>> evaluates to “0”[m
[31m-or an empty string.[m
[31m-In the following example, the requests with response codes 2xx and 3xx[m
[31m-will not be logged:[m
[31m-[m
[31m-    [m
[31m-    map $status $loggable {[m
[31m-        ~^[23]  0;[m
[31m-        default 1;[m
[31m-    }[m
[31m-    [m
[31m-    access_log /path/to/access.log combined if=$loggable;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_format[m
[31m-[m
[31m-[m
[31m-B<syntax:> log_format I<[m
[31m-    I<C<name>>[m
[31m-    I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<combined "...">[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies log format.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The log format can contain common variables, and variables that[m
[31m-exist only at the time of a log write:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$bytes_sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the number of bytes sent to a client[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connection>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-connection serial number[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connection_requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the current number of requests made through a connection (1.1.18)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$msec>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-time in seconds with a milliseconds resolution at the time of the log write[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$pipe>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<p>” if request was pipelined, “C<.>”[m
[31m-otherwise[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_length>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request length (including request line, header, and request body)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request processing time in seconds with a milliseconds resolution;[m
[31m-time elapsed between the first bytes were read from the client and[m
[31m-the log write after the last bytes were sent to the client[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$status>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-response status[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$time_iso8601>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-local time in the ISO 8601 standard format[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$time_local>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-local time in the Common Log Format[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In the modern nginx versions variables[m
[31m-L<$status|ngx_http_core_module>[m
[31m-(1.3.2, 1.2.2),[m
[31m-L<$bytes_sent|ngx_http_core_module>[m
[31m-(1.3.8, 1.2.5),[m
[31m-L<$connection|ngx_http_core_module>[m
[31m-(1.3.8, 1.2.5),[m
[31m-L<$connection_requests|ngx_http_core_module>[m
[31m-(1.3.8, 1.2.5),[m
[31m-L<$msec|ngx_http_core_module>[m
[31m-(1.3.9, 1.2.6),[m
[31m-L<$request_time|ngx_http_core_module>[m
[31m-(1.3.9, 1.2.6),[m
[31m-L<$pipe|ngx_http_core_module>[m
[31m-(1.3.12, 1.2.7),[m
[31m-L<$request_length|ngx_http_core_module>[m
[31m-(1.3.12, 1.2.7),[m
[31m-L<$time_iso8601|ngx_http_core_module>[m
[31m-(1.3.12, 1.2.7),[m
[31m-and[m
[31m-L<$time_local|ngx_http_core_module>[m
[31m-(1.3.12, 1.2.7)[m
[31m-are also available as common variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Header lines sent to a client have the prefix[m
[31m-“C<sent_http_>”, for example,[m
[31m-C<$sent_http_content_range>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The configuration always includes the predefined[m
[31m-“C<combined>” format:[m
[31m-[m
[31m-    [m
[31m-    log_format combined '$remote_addr - $remote_user [$time_local] '[m
[31m-                        '"$request" $status $body_bytes_sent '[m
[31m-                        '"$http_referer" "$http_user_agent"';[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_log_file_cache[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_log_file_cache I<[m
[31m-C<max>=I<C<N>>[m
[31m-[C<inactive>=I<C<time>>][m
[31m-[C<min_uses>=I<C<N>>][m
[31m-[C<valid>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_log_file_cache I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a cache that stores the file descriptors of frequently used logs[m
[31m-whose names contain variables.[m
[31m-The directive has the following parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<max>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the maximum number of descriptors in a cache;[m
[31m-if the cache becomes full the least recently used (LRU)[m
[31m-descriptors are closed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<inactive>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the time after which the cached descriptor is closed[m
[31m-if there were no access during this time;[m
[31m-by default, 10 seconds[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<min_uses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the minimum number of file uses during the time[m
[31m-defined by the C<inactive> parameter[m
[31m-to let the descriptor stay open in a cache;[m
[31m-by default, 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<valid>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the time after which it should be checked that the file[m
[31m-still exists with the same name; by default, 60 seconds[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables caching[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_map_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_map_module.pod[m
[1mdeleted file mode 100644[m
[1mindex f55197c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_map_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,304 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_map_module - Module ngx_http_map_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_map_module> module creates variables[m
[31m-whose values depend on values of other variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    map $http_host $name {[m
[31m-        hostnames;[m
[31m-    [m
[31m-        default       0;[m
[31m-    [m
[31m-        example.com   1;[m
[31m-        *.example.com 1;[m
[31m-        example.org   2;[m
[31m-        *.example.org 2;[m
[31m-        .example.net  3;[m
[31m-        wap.*         4;[m
[31m-    }[m
[31m-    [m
[31m-    map $http_user_agent $mobile {[m
[31m-        default       0;[m
[31m-        "~Opera Mini" 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 map[m
[31m-[m
[31m-[m
[31m-B<syntax:> map I<[m
[31m-    I<C<string>>[m
[31m-    I<C<$variable>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Creates a new variable whose value[m
[31m-depends on values of one or more of the source variables[m
[31m-specified in the first parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 0.9.0 only a single variable could be[m
[31m-specified in the first parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Since variables are evaluated only when they are used, the mere declaration[m
[31m-even of a large number of “C<map>” variables[m
[31m-does not add any extra costs to request processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters inside the C<map> block specify a mapping[m
[31m-between source and resulting values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Source values are specified as strings or regular expressions (0.9.6).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Strings are matched ignoring the case.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A regular expression should either start from the “C<~>”[m
[31m-symbol for a case-sensitive matching, or from the “C<~*>”[m
[31m-symbols (1.0.4) for case-insensitive matching.[m
[31m-A regular expression can contain named and positional captures[m
[31m-that can later be used in other directives along with the[m
[31m-resulting variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a source value matches one of the names of special parameters[m
[31m-described below, it should be prefixed with the “C<\>” symbol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The resulting value can contain text,[m
[31m-variable (0.9.0), and their combination (1.11.0).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also supports three special parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<default> I<C<value>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the resulting value if the source value matches none[m
[31m-of the specified variants.[m
[31m-When C<default> is not specified, the default[m
[31m-resulting value will be an empty string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<hostnames>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-indicates that source values can be hostnames with a prefix or suffix mask:[m
[31m-[m
[31m-    [m
[31m-    *.example.com 1;[m
[31m-    example.*     1;[m
[31m-[m
[31m-[m
[31m-The following two records[m
[31m-[m
[31m-    [m
[31m-    example.com   1;[m
[31m-    *.example.com 1;[m
[31m-[m
[31m-[m
[31m-can be combined:[m
[31m-[m
[31m-    [m
[31m-    .example.com  1;[m
[31m-[m
[31m-[m
[31m-This parameter should be specified before the list of values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<include> I<C<file>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-includes a file with values.[m
[31m-There can be several inclusions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the source value matches more than one of the specified variants,[m
[31m-e.g. both a mask and a regular expression match, the first matching[m
[31m-variant will be chosen, in the following order of priority:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-string value without a mask[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-longest string value with a prefix mask,[m
[31m-e.g. “C<*.example.com>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-longest string value with a suffix mask,[m
[31m-e.g. “C<mail.*>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-first matching regular expression[m
[31m-(in order of appearance in a configuration file)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 5.[m
[31m-[m
[31m-default value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 map_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> map_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32E<verbar>64E<verbar>128>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the L</map> variables hash tables.[m
[31m-Default value depends on the processor’s cache line size.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 map_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> map_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<2048>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the L</map> variables[m
[31m-hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_memcached_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_memcached_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 0a58e8c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_memcached_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,554 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_memcached_module - Module ngx_http_memcached_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_memcached_module> module is used to obtain[m
[31m-responses from a memcached server.[m
[31m-The key is set in the C<$memcached_key> variable.[m
[31m-A response should be put in memcached in advance by means[m
[31m-external to nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            set            $memcached_key "$uri?$args";[m
[31m-            memcached_pass host:11211;[m
[31m-            error_page     404 502 504 = @fallback;[m
[31m-        }[m
[31m-    [m
[31m-        location @fallback {[m
[31m-            proxy_pass     http://backend;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 memcached_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.22.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a memcached server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<memcached_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a memcached server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    memcached_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the memcached server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the response[m
[31m-received from the memcached server.[m
[31m-The response is passed to the client synchronously, as soon as it is received.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a memcached server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the memcached server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_gzip_flag[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_gzip_flag I<I<C<flag>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the test for the I<C<flag>> presence in the memcached[m
[31m-server response and sets the “C<Content-Encoding>”[m
[31m-response header field to “C<gzip>”[m
[31m-if the flag is set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_response> E<verbar>[m
[31m-    C<not_found> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_response>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<not_found>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a response was not found on the server;[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The case of C<not_found>[m
[31m-is never considered an unsuccessful attempt.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_pass I<I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the memcached server address.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    memcached_pass localhost:11211;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    memcached_pass unix:/tmp/memcached.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the memcached server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the memcached server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the memcached server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the memcached server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$memcached_key>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for obtaining response from a memcached server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_mp4_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_mp4_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d4b98f8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_mp4_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,329 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_mp4_module - Module ngx_http_mp4_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_mp4_module> module provides pseudo-streaming[m
[31m-server-side support for MP4 files.[m
[31m-Such files typically have the F<.mp4>, F<.m4v>,[m
[31m-or F<.m4a> filename extensions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Pseudo-streaming works in alliance with a compatible Flash player.[m
[31m-The player sends an HTTP request to the server with the start time[m
[31m-specified in the query string argument (named simply[m
[31m-C<start>[m
[31m-and specified in seconds), and the server responds with the stream[m
[31m-such that its start position corresponds to the requested time,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    http://example.com/elephants_dream.mp4?start=238.88[m
[31m-[m
[31m-[m
[31m-This allows performing a random seeking at any time, or starting playback[m
[31m-in the middle of the timeline.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To support seeking, H.264-based formats store metadata[m
[31m-in a so-called “moov atom”.[m
[31m-It is a part of the file that holds the index information for the[m
[31m-whole file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To start playback, the player first needs to read metadata.[m
[31m-This is done by sending a special request with the[m
[31m-C<start=0> argument.[m
[31m-A lot of encoding software insert the metadata at[m
[31m-the end of the file.[m
[31m-This is suboptimal for pseudo-streaming, because the player[m
[31m-has to download the entire file before starting playback.[m
[31m-If the metadata are located at the beginning of the file,[m
[31m-it is enough for nginx to simply start sending back the file contents.[m
[31m-If the metadata are located at the end of the file,[m
[31m-nginx must read the entire file and prepare a new stream so that[m
[31m-the metadata come before the media data.[m
[31m-This involves some CPU, memory, and disk IE<sol>O overhead,[m
[31m-so it is a good idea to[m
[31m-L<prepare an original file for pseudo-streaming|http://flowplayer.org/plugins/streaming/pseudostreaming.html#prepare> in advance,[m
[31m-rather than having nginx do this on every such request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module also supports the C<end> argument of an HTTP request[m
[31m-(1.5.13) which sets the end point of playback.[m
[31m-The C<end> argument can be specified with the[m
[31m-C<start> argument[m
[31m-or separately:[m
[31m-[m
[31m-    [m
[31m-    http://example.com/elephants_dream.mp4?start=238.88&end=555.55[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For a matching request with a non-zero[m
[31m-C<start> or C<end>[m
[31m-argument, nginx will read the metadata from the file, prepare the[m
[31m-stream with the requested time range, and send it to the client.[m
[31m-This has the same overhead as described above.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a matching request does not include the[m
[31m-C<start> and C<end>[m
[31m-arguments, there is no overhead, and the file is sent simply as a static[m
[31m-resource.[m
[31m-Some players also support byte-range requests, and thus do not require[m
[31m-this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_mp4_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-If a third-party mp4 module was previously used, it should be disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A similar pseudo-streaming support for FLV files is provided by the[m
[31m-L<ngx_http_flv_module|ngx_http_flv_module> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        mp4;[m
[31m-        mp4_buffer_size       1m;[m
[31m-        mp4_max_buffer_size   5m;[m
[31m-        mp4_limit_rate        on;[m
[31m-        mp4_limit_rate_after  30s;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 mp4[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mp4_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> mp4_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512K>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the initial I<C<size>> of the buffer used for[m
[31m-processing MP4 files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mp4_max_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> mp4_max_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<10M>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-During metadata processing, a larger buffer may become necessary.[m
[31m-Its size cannot exceed the specified I<C<size>>,[m
[31m-or else nginx will return the[m
[31m-C<500> (C<Internal Server Error>) server error,[m
[31m-and log the following message:[m
[31m-[m
[31m-    [m
[31m-    "/some/movie/file.mp4" mp4 moov atom is too large:[m
[31m-    12583268, you may want to increase mp4_max_buffer_size[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mp4_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> mp4_limit_rate I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<factor>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the rate of response transmission to a client.[m
[31m-The rate is limited based on the average bitrate of the[m
[31m-MP4 file served.[m
[31m-To calculate the rate, the bitrate is multiplied by the specified[m
[31m-I<C<factor>>.[m
[31m-The special value “C<on>” corresponds to the factor of 1.1.[m
[31m-The special value “C<off>” disables rate limiting.[m
[31m-The limit is set per a request, and so if a client simultaneously opens[m
[31m-two connections, the overall rate will be twice as much[m
[31m-as the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mp4_limit_rate_after[m
[31m-[m
[31m-[m
[31m-B<syntax:> mp4_limit_rate_after I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the initial amount of media data (measured in playback time)[m
[31m-after which the further transmission of the response to a client[m
[31m-will be rate limited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_perl_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_perl_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a372a3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_perl_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,620 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_perl_module - Module ngx_http_perl_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_perl_module> module is used to implement[m
[31m-location and variable handlers in Perl and insert Perl calls into SSI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_perl_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires[m
[31m-L<Perl|https://www.perl.org/get.html> version 5.6.1 or higher.[m
[31m-The C compiler should be compatible with the one used to build Perl.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module is experimental, caveat emptor applies.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order for Perl to recompile the modified modules during[m
[31m-reconfiguration, it should be built with the[m
[31m-C<-Dusemultiplicity=yes> or[m
[31m-C<-Dusethreads=yes> parameters.[m
[31m-Also, to make Perl leak less memory at run time,[m
[31m-it should be built with the[m
[31m-C<-Dusemymalloc=no> parameter.[m
[31m-To check the values of these parameters in an already built[m
[31m-Perl (preferred values are specified in the example), run:[m
[31m-[m
[31m-    [m
[31m-    $ perl -V:usemultiplicity -V:usemymalloc[m
[31m-    usemultiplicity='define';[m
[31m-    usemymalloc='n';[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that after rebuilding Perl with the new[m
[31m-C<-Dusemultiplicity=yes> or[m
[31m-C<-Dusethreads=yes> parameters,[m
[31m-all binary Perl modules will have to be rebuilt as well —[m
[31m-they will just stop working with the new Perl.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is a possibility that the main process and then worker processes will[m
[31m-grow in size after every reconfiguration.[m
[31m-If the main process grows to an unacceptable size, the[m
[31m-L<live upgrade|control>[m
[31m-procedure can be applied without changing the executable file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-While the Perl module is performing a long-running operation, such as[m
[31m-resolving a domain name, connecting to another server, or querying a database,[m
[31m-other requests assigned to the current worker process will not be processed.[m
[31m-It is thus recommended to perform only such operations[m
[31m-that have predictable and short execution time, such as[m
[31m-accessing the local file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-    [m
[31m-        perl_modules perl/lib;[m
[31m-        perl_require hello.pm;[m
[31m-    [m
[31m-        perl_set $msie6 '[m
[31m-    [m
[31m-            sub {[m
[31m-                my $r = shift;[m
[31m-                my $ua = $r->header_in("User-Agent");[m
[31m-    [m
[31m-                return "" if $ua =~ /Opera/;[m
[31m-                return "1" if $ua =~ / MSIE [6-9]\.\d+/;[m
[31m-                return "";[m
[31m-            }[m
[31m-    [m
[31m-        ';[m
[31m-    [m
[31m-        server {[m
[31m-            location / {[m
[31m-                perl hello::handler;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The F<perlE<sol>libE<sol>hello.pm> module:[m
[31m-[m
[31m-    [m
[31m-    package hello;[m
[31m-    [m
[31m-    use nginx;[m
[31m-    [m
[31m-    sub handler {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        $r->send_http_header("text/html");[m
[31m-        return OK if $r->header_only;[m
[31m-    [m
[31m-        $r->print("hello!\n<br/>");[m
[31m-    [m
[31m-        if (-f $r->filename or -d _) {[m
[31m-            $r->print($r->uri, " exists!\n");[m
[31m-        }[m
[31m-    [m
[31m-        return OK;[m
[31m-    }[m
[31m-    [m
[31m-    1;[m
[31m-    __END__[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 perl[m
[31m-[m
[31m-[m
[31m-B<syntax:> perl I<I<C<module>>::I<C<function>>E<verbar>'sub { ... }'>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a Perl handler for the given location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 perl_modules[m
[31m-[m
[31m-[m
[31m-B<syntax:> perl_modules I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets an additional path for Perl modules.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 perl_require[m
[31m-[m
[31m-[m
[31m-B<syntax:> perl_require I<I<C<module>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the name of a module that will be loaded during each[m
[31m-reconfiguration.[m
[31m-Several C<perl_require> directives can be present.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 perl_set[m
[31m-[m
[31m-[m
[31m-B<syntax:> perl_set I<[m
[31m-    I<C<$variable>>[m
[31m-    I<C<module>>::I<C<function>>E<verbar>'sub { ... }'>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Installs a Perl handler for the specified variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Calling Perl from SSI[m
[31m-[m
[31m-[m
[31m-[m
[31m-An SSI command calling Perl has the following format:[m
[31m-[m
[31m-    [m
[31m-    <!--# perl sub="<value>module</value>::<value>function</value>" arg="<value>parameter1</value>" arg="<value>parameter2</value>" ...[m
[31m-    -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 The $r Request Object Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>args>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns request arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>filename>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns a filename corresponding to the request URI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>has_request_body(I<C<handler>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns 0 if there is no body in a request.[m
[31m-If there is a body, the specified handler is set for the request[m
[31m-and 1 is returned.[m
[31m-After reading the request body, nginx will call the specified handler.[m
[31m-Note that the handler function should be passed by reference.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    package hello;[m
[31m-    [m
[31m-    use nginx;[m
[31m-    [m
[31m-    sub handler {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        if ($r->request_method ne "POST") {[m
[31m-            return DECLINED;[m
[31m-        }[m
[31m-    [m
[31m-        if ($r->has_request_body(<emphasis>\&post</emphasis>)) {[m
[31m-            return OK;[m
[31m-        }[m
[31m-    [m
[31m-        return HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-    [m
[31m-    sub <emphasis>post</emphasis> {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        $r->send_http_header;[m
[31m-    [m
[31m-        $r->print("request_body: \"", $r->request_body, "\"<br/>");[m
[31m-        $r->print("request_body_file: \"", $r->request_body_file, "\"<br/>\n");[m
[31m-    [m
[31m-        return OK;[m
[31m-    }[m
[31m-    [m
[31m-    1;[m
[31m-    [m
[31m-    __END__[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>allow_ranges>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables the use of byte ranges when sending responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>discard_request_body>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-instructs nginx to discard the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>header_in(I<C<field>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the value of the specified client request header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>header_only>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-determines whether the whole response or only its header should be sent to[m
[31m-the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>header_out(I<C<field>>,[m
[31m-    I<C<value>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets a value for the specified response header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>internal_redirect(I<C<uri>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-does an internal redirect to the specified I<C<uri>>.[m
[31m-An actual redirect happens after the Perl handler execution is completed.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Redirections to named locations are currently not supported.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>log_error(I<C<errno>>,[m
[31m-I<C<message>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-writes the specified I<C<message>> into the[m
[31m-L<ngx_core_module>.[m
[31m-If I<C<errno>> is non-zero, an error code and its description[m
[31m-will be appended to the message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>print(I<C<text>>, ...)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-passes data to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>request_body>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client request body if it has not been[m
[31m-written to a temporary file.[m
[31m-To ensure that the client request body is in memory,[m
[31m-its size should be limited by[m
[31m-L<ngx_http_core_module>,[m
[31m-and a sufficient buffer size should be set using[m
[31m-L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>request_body_file>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the name of the file with the client request body.[m
[31m-After the processing, the file should be removed.[m
[31m-To always write a request body to a file,[m
[31m-L<ngx_http_core_module>[m
[31m-should be enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>request_method>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client request HTTP method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>remote_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>flush>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-immediately sends data to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>sendfile(I<C<name>>[,[m
[31m-    I<C<offset>>[,[m
[31m-    I<C<length>>]])>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sends the specified file content to the client.[m
[31m-Optional parameters[m
[31m-specify the initial offset and length of the data to be transmitted.[m
[31m-The actual data transmission happens after the Perl handler[m
[31m-has completed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>send_http_header([I<C<type>>])>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sends the response header to the client.[m
[31m-The optional I<C<type>> parameter sets the value of[m
[31m-the C<Content-Type> response header field.[m
[31m-If the value is an empty string, the C<Content-Type>[m
[31m-header field will not be sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>status(I<C<code>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets a response code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>sleep(I<C<milliseconds>>,[m
[31m-    I<C<handler>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the specified handler[m
[31m-and stops request processing for the specified time.[m
[31m-In the meantime, nginx continues to process other requests.[m
[31m-After the specified time has elapsed, nginx will call the installed handler.[m
[31m-Note that the handler function should be passed by reference.[m
[31m-In order to pass data between handlers,[m
[31m-C<$r-E<gt>variable()> should be used.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    package hello;[m
[31m-    [m
[31m-    use nginx;[m
[31m-    [m
[31m-    sub handler {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        $r->discard_request_body;[m
[31m-        $r->variable("var", "OK");[m
[31m-        $r->sleep(1000, <emphasis>\&next</emphasis>);[m
[31m-    [m
[31m-        return OK;[m
[31m-    }[m
[31m-    [m
[31m-    sub <emphasis>next</emphasis> {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        $r->send_http_header;[m
[31m-        $r->print($r->variable("var"));[m
[31m-    [m
[31m-        return OK;[m
[31m-    }[m
[31m-    [m
[31m-    1;[m
[31m-    [m
[31m-    __END__[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>unescape(I<C<text>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-decodes a text encoded in the “%XX” form.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns a request URI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>variable(I<C<name>>[,[m
[31m-    I<C<value>>])>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns or sets the value of the specified variable.[m
[31m-Variables are local to each request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_proxy_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_proxy_module.pod[m
[1mdeleted file mode 100644[m
[1mindex df57bc0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_proxy_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,3544 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_proxy_module - Module ngx_http_proxy_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_proxy_module> module allows passing[m
[31m-requests to another server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        proxy_pass       http://localhost:8000;[m
[31m-        proxy_set_header Host      $host;[m
[31m-        proxy_set_header X-Real-IP $remote_addr;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 proxy_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.22.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a proxied server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<proxy_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a proxied server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    proxy_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the first part[m
[31m-of the response received from the proxied server.[m
[31m-This part usually contains a small response header.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-It can be made smaller, however.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of responses from the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, nginx receives a response from the proxied server[m
[31m-as soon as possible, saving it into the buffers set by the[m
[31m-L</proxy_buffer_size> and L</proxy_buffers> directives.[m
[31m-If the whole response does not fit into memory, a part of it can be saved[m
[31m-to a temporary file on the disk.[m
[31m-Writing to temporary files is controlled by the[m
[31m-L</proxy_max_temp_file_size> and[m
[31m-L</proxy_temp_file_write_size> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the response is passed to a client synchronously,[m
[31m-immediately as it is received.[m
[31m-nginx will not try to read the whole response from the proxied server.[m
[31m-The maximum size of the data that nginx can receive from the server[m
[31m-at a time is set by the L</proxy_buffer_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering can also be enabled or disabled by passing[m
[31m-“C<yes>” or “C<no>” in the[m
[31m-C<X-Accel-Buffering> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L</proxy_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from the proxied server,[m
[31m-for a single connection.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_busy_buffers_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_busy_buffers_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the proxied[m
[31m-server is enabled, limits the total I<C<size>> of buffers that[m
[31m-can be busy sending a response to the client while the response is not[m
[31m-yet fully read.[m
[31m-In the meantime, the rest of the buffers can be used for reading the response[m
[31m-and, if needed, buffering part of the response to a temporary file.[m
[31m-By default, I<C<size>> is limited by the size of two buffers set by the[m
[31m-L</proxy_buffer_size> and L</proxy_buffers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache I<I<C<zone>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a shared memory zone used for caching.[m
[31m-The same zone can be used in several places.[m
[31m-Parameter value can contain variables (1.7.9).[m
[31m-The C<off> parameter disables caching inherited[m
[31m-from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_bypass[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_bypass I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be taken from a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be taken from the cache:[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    proxy_cache_bypass $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</proxy_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_convert_head[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_convert_head I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the conversion of the “C<HEAD>” method[m
[31m-to “C<GET>” for caching.[m
[31m-When the conversion is disabled, the[m
[31m-cache key should be configured[m
[31m-to include the C<$request_method>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_key I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<$scheme$proxy_host$request_uri>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for caching, for example[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_key "$host$request_uri $cookie_user";[m
[31m-[m
[31m-[m
[31m-By default, the directive’s value is close to the string[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_key $scheme$proxy_host$uri$is_args$args;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_lock[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_lock I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When enabled, only one request at a time will be allowed to populate[m
[31m-a new cache element identified according to the L</proxy_cache_key>[m
[31m-directive by passing a request to a proxied server.[m
[31m-Other requests of the same cache element will either wait[m
[31m-for a response to appear in the cache or the cache lock for[m
[31m-this element to be released, up to the time set by the[m
[31m-L</proxy_cache_lock_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_lock_age[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_lock_age I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the last request passed to the proxied server[m
[31m-for populating a new cache element[m
[31m-has not completed for the specified I<C<time>>,[m
[31m-one more request may be passed to the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_lock_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_lock_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for L</proxy_cache_lock>.[m
[31m-When the I<C<time>> expires,[m
[31m-the request will be passed to the proxied server,[m
[31m-however, the response will not be cached.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 1.7.8, the response could be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_methods I<[m
[31m-    C<GET> E<verbar>[m
[31m-    C<HEAD> E<verbar>[m
[31m-    C<POST>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<GET HEAD>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.59.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the client request method is listed in this directive then[m
[31m-the response will be cached.[m
[31m-“C<GET>” and “C<HEAD>” methods are always[m
[31m-added to the list, though it is recommended to specify them explicitly.[m
[31m-See also the L</proxy_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> of requests after which the response[m
[31m-will be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_path I<[m
[31m-    I<C<path>>[m
[31m-    [C<levels>=I<C<levels>>][m
[31m-    [C<use_temp_path>=C<on>E<verbar>C<off>][m
[31m-    C<keys_zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<inactive>=I<C<time>>][m
[31m-    [C<max_size>=I<C<size>>][m
[31m-    [C<loader_files>=I<C<number>>][m
[31m-    [C<loader_sleep>=I<C<time>>][m
[31m-    [C<loader_threshold>=I<C<time>>][m
[31m-    [C<purger>=C<on>E<verbar>C<off>][m
[31m-    [C<purger_files>=I<C<number>>][m
[31m-    [C<purger_sleep>=I<C<time>>][m
[31m-    [C<purger_threshold>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path and other parameters of a cache.[m
[31m-Cache data are stored in files.[m
[31m-The file name in a cache is a result of[m
[31m-applying the MD5 function to the[m
[31m-cache key.[m
[31m-The C<levels> parameter defines hierarchy levels of a cache.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;[m
[31m-[m
[31m-[m
[31m-file names in a cache will look like this:[m
[31m-[m
[31m-    [m
[31m-    /data/nginx/cache/<emphasis>c</emphasis>/<emphasis>29</emphasis>/b7f54b2df7773722d382f4809d650<emphasis>29c</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A cached response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the cache can be put on[m
[31m-different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both cache and a directory[m
[31m-holding temporary files[m
[31m-are put on the same file system.[m
[31m-The directory for temporary files is set based on[m
[31m-the C<use_temp_path> parameter (1.7.10).[m
[31m-If this parameter is omitted or set to the value C<on>,[m
[31m-the directory set by the L</proxy_temp_path> directive[m
[31m-for the given location will be used.[m
[31m-If the value is set to C<off>,[m
[31m-temporary files will be put directly in the cache directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, all active keys and information about data are stored[m
[31m-in a shared memory zone, whose I<C<name>> and I<C<size>>[m
[31m-are configured by the C<keys_zone> parameter.[m
[31m-One megabyte zone can store about 8 thousand keys.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Cached data that are not accessed during the time specified by the[m
[31m-C<inactive> parameter get removed from the cache[m
[31m-regardless of their freshness.[m
[31m-By default, C<inactive> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special “cache manager” process monitors the maximum cache size set[m
[31m-by the C<max_size> parameter.[m
[31m-When this size is exceeded, it removes the least recently used data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A minute after the start the special “cache loader” process is activated.[m
[31m-It loads information about previously cached data stored on file system[m
[31m-into a cache zone.[m
[31m-The loading is done in iterations.[m
[31m-During one iteration no more than C<loader_files> items[m
[31m-are loaded (by default, 100).[m
[31m-Besides, the duration of one iteration is limited by the[m
[31m-C<loader_threshold> parameter (by default, 200 milliseconds).[m
[31m-Between iterations, a pause configured by the C<loader_sleep>[m
[31m-parameter (by default, 50 milliseconds) is made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Instructs whether cache entries that match a[m
[31m-wildcard key[m
[31m-will be removed from the disk by the cache purger (1.7.12).[m
[31m-Setting the parameter to C<on>[m
[31m-(default is C<off>)[m
[31m-will activate the “cache purger” process that[m
[31m-permanently iterates through all cache entries[m
[31m-and deletes the entries that match the wildcard key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_files>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of items that will be scanned during one iteration (1.7.12).[m
[31m-By default, C<purger_files> is set to 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_threshold>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the duration of one iteration (1.7.12).[m
[31m-By default, C<purger_threshold> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_sleep>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a pause between iterations (1.7.12).[m
[31m-By default, C<purger_sleep> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_purge[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_purge I<string ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the request will be considered a cache[m
[31m-purge request.[m
[31m-If at least one value of the string parameters is not empty and is not equal[m
[31m-to “0” then the cache entry with a corresponding[m
[31m-cache key is removed.[m
[31m-The result of successful operation is indicated by returning[m
[31m-the C<204> (C<No Content>) response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the cache key of a purge request ends[m
[31m-with an asterisk (“C<*>”), all cache entries matching the[m
[31m-wildcard key will be removed from the cache.[m
[31m-However, these entries will remain on the disk until they are deleted[m
[31m-for either inactivity,[m
[31m-or processed by the cache purger (1.7.12),[m
[31m-or a client attempts to access them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration:[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m;[m
[31m-    [m
[31m-    map $request_method $purge_method {[m
[31m-        PURGE   1;[m
[31m-        default 0;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        location / {[m
[31m-            proxy_pass http://backend;[m
[31m-            proxy_cache cache_zone;[m
[31m-            proxy_cache_key $uri;[m
[31m-            proxy_cache_purge $purge_method;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This functionality is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_revalidate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_revalidate I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables revalidation of expired cache items using conditional requests with[m
[31m-the C<If-Modified-Since> and C<If-None-Match>[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_use_stale[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_use_stale I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<updating> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_502> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_504> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines in which cases a stale cached response can be used[m
[31m-when an error occurs during communication with the proxied server.[m
[31m-The directive’s parameters match the parameters of the[m
[31m-L</proxy_next_upstream> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<error> parameter also permits[m
[31m-using a stale cached response if a proxied server to process a request[m
[31m-cannot be selected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, the C<updating> parameter permits[m
[31m-using a stale cached response if it is currently being updated.[m
[31m-This allows minimizing the number of accesses to proxied servers[m
[31m-when updating cached data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To minimize the number of accesses to proxied servers when[m
[31m-populating a new cache element, the L</proxy_cache_lock>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_valid I<[I<C<code>> ...] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets caching time for different response codes.[m
[31m-For example, the following directives[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_valid 200 302 10m;[m
[31m-    proxy_cache_valid 404      1m;[m
[31m-[m
[31m-[m
[31m-set 10 minutes of caching for responses with codes 200 and 302[m
[31m-and 1 minute for responses with code 404.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only caching I<C<time>> is specified[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_valid 5m;[m
[31m-[m
[31m-[m
[31m-then only 200, 301, and 302 responses are cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the C<any> parameter can be specified[m
[31m-to cache any responses:[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_valid 200 302 10m;[m
[31m-    proxy_cache_valid 301      1h;[m
[31m-    proxy_cache_valid any      1m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters of caching can also be set directly[m
[31m-in the response header.[m
[31m-This has higher priority than setting of caching time using the directive.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<X-Accel-Expires> header field sets caching time of a[m
[31m-response in seconds.[m
[31m-The zero value disables caching for a response.[m
[31m-If the value starts with the C<@> prefix, it sets an absolute[m
[31m-time in seconds since Epoch, up to which the response may be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header does not include the C<X-Accel-Expires> field,[m
[31m-parameters of caching may be set in the header fields[m
[31m-C<Expires> or C<Cache-Control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Set-Cookie> field, such a[m
[31m-response will not be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Vary> field[m
[31m-with the special value “C<*>”, such a[m
[31m-response will not be cached (1.7.7).[m
[31m-If the header includes the C<Vary> field[m
[31m-with another value, such a response will be cached[m
[31m-taking into account the corresponding request header fields (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Processing of one or more of these response header fields can be disabled[m
[31m-using the L</proxy_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a proxied server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cookie_domain[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cookie_domain I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cookie_domain I<I<C<domain>> I<C<replacement>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a text that should be changed in the C<domain>[m
[31m-attribute of the C<Set-Cookie> header fields of a[m
[31m-proxied server response.[m
[31m-Suppose a proxied server returned the C<Set-Cookie>[m
[31m-header field with the attribute[m
[31m-“C<domain=localhost>”.[m
[31m-The directive[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain localhost example.org;[m
[31m-[m
[31m-[m
[31m-will rewrite this attribute to[m
[31m-“C<domain=example.org>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A dot at the beginning of the I<C<domain>> and[m
[31m-I<C<replacement>> strings and the C<domain>[m
[31m-attribute is ignored.[m
[31m-Matching is case-insensitive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<domain>> and I<C<replacement>> strings[m
[31m-can contain variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain www.$host $host;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive can also be specified using regular expressions.[m
[31m-In this case, I<C<domain>> should start from[m
[31m-the “C<~>” symbol.[m
[31m-A regular expression can contain named and positional captures,[m
[31m-and I<C<replacement>> can reference them:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<proxy_cookie_domain> directives:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain localhost example.org;[m
[31m-    proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<off> parameter cancels the effect of all[m
[31m-C<proxy_cookie_domain> directives on the current level:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain off;[m
[31m-    proxy_cookie_domain localhost example.org;[m
[31m-    proxy_cookie_domain www.example.org example.org;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cookie_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cookie_path I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cookie_path I<I<C<path>> I<C<replacement>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a text that should be changed in the C<path>[m
[31m-attribute of the C<Set-Cookie> header fields of a[m
[31m-proxied server response.[m
[31m-Suppose a proxied server returned the C<Set-Cookie>[m
[31m-header field with the attribute[m
[31m-“C<path=E<sol>twoE<sol>someE<sol>uriE<sol>>”.[m
[31m-The directive[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path /two/ /;[m
[31m-[m
[31m-[m
[31m-will rewrite this attribute to[m
[31m-“C<path=E<sol>someE<sol>uriE<sol>>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<path>> and I<C<replacement>> strings[m
[31m-can contain variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path $uri /some$uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive can also be specified using regular expressions.[m
[31m-In this case, I<C<path>> should either start from[m
[31m-the “C<~>” symbol for a case-sensitive matching,[m
[31m-or from the “C<~*>” symbols for case-insensitive[m
[31m-matching.[m
[31m-The regular expression can contain named and positional captures,[m
[31m-and I<C<replacement>> can reference them:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path ~*^/user/([^/]+) /u/$1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<proxy_cookie_path> directives:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path /one/ /;[m
[31m-    proxy_cookie_path / /two/;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<off> parameter cancels the effect of all[m
[31m-C<proxy_cookie_path> directives on the current level:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path off;[m
[31m-    proxy_cookie_path /two/ /;[m
[31m-    proxy_cookie_path ~*^/user/([^/]+) /u/$1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the proxied server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_headers_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_headers_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket I<C<size>> for hash tables[m
[31m-used by the L</proxy_hide_header> and L</proxy_set_header>[m
[31m-directives.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_headers_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_headers_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of hash tables[m
[31m-used by the L</proxy_hide_header> and L</proxy_set_header>[m
[31m-directives.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_hide_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_hide_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default,[m
[31m-nginx does not pass the header fields C<Date>,[m
[31m-C<Server>, C<X-Pad>, and[m
[31m-C<X-Accel-...> from the response of a proxied[m
[31m-server to a client.[m
[31m-The C<proxy_hide_header> directive sets additional fields[m
[31m-that will not be passed.[m
[31m-If, on the contrary, the passing of fields needs to be permitted,[m
[31m-the L</proxy_pass_header> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_http_version[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_http_version I<C<1.0> E<verbar> C<1.1>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1.0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the HTTP protocol version for proxying.[m
[31m-By default, version 1.0 is used.[m
[31m-Version 1.1 is recommended for use with[m
[31m-L<ngx_http_upstream_module>[m
[31m-connections and[m
[31m-L<NTLM authentication|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ignore_client_abort[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ignore_client_abort I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether the connection with a proxied server should be[m
[31m-closed when a client closes the connection without waiting[m
[31m-for a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ignore_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ignore_headers I<I<C<field>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables processing of certain response header fields from the proxied server.[m
[31m-The following fields can be ignored: C<X-Accel-Redirect>,[m
[31m-C<X-Accel-Expires>, C<X-Accel-Limit-Rate> (1.1.6),[m
[31m-C<X-Accel-Buffering> (1.1.6),[m
[31m-C<X-Accel-Charset> (1.1.6), C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie> (0.8.44),[m
[31m-and C<Vary> (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If not disabled, processing of these header fields has the following[m
[31m-effect:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Expires>, C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie>,[m
[31m-and C<Vary>[m
[31m-set the parameters of response caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Redirect> performs an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> to the specified URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Limit-Rate> sets the[m
[31m-L<rate[m
[31m-limit|ngx_http_core_module> for transmission of a response to a client;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Buffering> enables or disables[m
[31m-buffering of a response;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Charset> sets the desired[m
[31m-L<ngx_http_charset_module>[m
[31m-of a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_intercept_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_intercept_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether proxied responses with codes greater than or equal[m
[31m-to 300 should be passed to a client or be redirected to nginx for processing[m
[31m-with the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the response from the proxied server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if nginx simultaneously opens[m
[31m-two connections to the proxied server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-The limitation works only if[m
[31m-buffering of responses from the proxied[m
[31m-server is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_max_temp_file_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_max_temp_file_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the proxied[m
[31m-server is enabled, and the whole response does not fit into the buffers[m
[31m-set by the L</proxy_buffer_size> and L</proxy_buffers>[m
[31m-directives, a part of the response can be saved to a temporary file.[m
[31m-This directive sets the maximum I<C<size>> of the temporary file.[m
[31m-The size of data written to the temporary file at a time is set[m
[31m-by the L</proxy_temp_file_write_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The zero value disables buffering of responses to temporary files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This restriction does not apply to responses[m
[31m-that will be cached[m
[31m-or stored on disk.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_method[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_method I<I<C<method>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the HTTP I<C<method>> to use in requests forwarded[m
[31m-to the proxied server instead of the method from the client request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_502> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_504> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<non_idempotent> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_header>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<http_500>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 500;[m
[31m-[m
[31m-[m
[31m-=item C<http_502>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 502;[m
[31m-[m
[31m-[m
[31m-=item C<http_503>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 503;[m
[31m-[m
[31m-[m
[31m-=item C<http_504>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 504;[m
[31m-[m
[31m-[m
[31m-=item C<http_403>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 403;[m
[31m-[m
[31m-[m
[31m-=item C<http_404>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 404;[m
[31m-[m
[31m-[m
[31m-=item C<non_idempotent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-normally, requests with a[m
[31m-L<non-idempotent|http://tools.ietf.org/html/rfc7231#section-4.2.2>[m
[31m-method[m
[31m-(C<POST>, C<LOCK>, C<PATCH>)[m
[31m-are not passed to the next server[m
[31m-if a request has been sent to an upstream server (1.9.13);[m
[31m-enabling this option explicitly allows retrying such requests;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The cases of C<http_500>, C<http_502>,[m
[31m-C<http_503> and C<http_504> are[m
[31m-considered unsuccessful attempts only if they are specified in the directive.[m
[31m-The cases of C<http_403> and C<http_404>[m
[31m-are never considered unsuccessful attempts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_no_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_no_cache I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be saved to a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be saved:[m
[31m-[m
[31m-    [m
[31m-    proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    proxy_no_cache $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</proxy_cache_bypass> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass I<I<C<URL>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the protocol and address of a proxied server and an optional URI[m
[31m-to which a location should be mapped.[m
[31m-As a protocol, “C<http>” or “C<https>”[m
[31m-can be specified.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and an optional port:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass http://localhost:8000/uri/;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path specified after the word[m
[31m-“C<unix>” and enclosed in colons:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass http://unix:/tmp/backend.socket:/uri/;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A request URI is passed to the server as follows:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the C<proxy_pass> directive is specified with a URI,[m
[31m-then when a request is passed to the server, the part of a[m
[31m-L<normalized|ngx_http_core_module>[m
[31m-request URI matching the location is replaced by a URI[m
[31m-specified in the directive:[m
[31m-[m
[31m-    [m
[31m-    location /name/ {[m
[31m-        proxy_pass http://127.0.0.1/remote/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If C<proxy_pass> is specified without a URI,[m
[31m-the request URI is passed to the server in the same form[m
[31m-as sent by a client when the original request is processed,[m
[31m-or the full normalized request URI is passed[m
[31m-when processing the changed URI:[m
[31m-[m
[31m-    [m
[31m-    location /some/path/ {[m
[31m-        proxy_pass http://127.0.0.1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.12,[m
[31m-if C<proxy_pass> is specified without a URI,[m
[31m-the original request URI might be passed[m
[31m-instead of the changed URI in some cases.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In some cases, the part of a request URI to be replaced cannot be determined:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When location is specified using a regular expression.[m
[31m-[m
[31m-[m
[31m-In this case, the directive should be specified without a URI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When the URI is changed inside a proxied location using the[m
[31m-L<ngx_http_rewrite_module> directive,[m
[31m-and this same configuration will be used to process a request[m
[31m-(C<break>):[m
[31m-[m
[31m-    [m
[31m-    location /name/ {[m
[31m-        rewrite    /name/([^/]+) /users?name=$1 break;[m
[31m-        proxy_pass http://127.0.0.1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this case, the URI specified in the directive is ignored and[m
[31m-the full changed request URI is passed to the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A server name, its port and the passed URI can also be specified using[m
[31m-variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass http://$host$uri;[m
[31m-[m
[31m-[m
[31m-or even like this:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass $request;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this case, the server name is searched among the described[m
[31m-L<server groups|ngx_http_upstream_module>,[m
[31m-and, if not found, is determined using a[m
[31m-L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<WebSocket|websocket> proxying requires special[m
[31m-configuration and is supported since version 1.3.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Permits passing otherwise disabled header[m
[31m-fields from a proxied server to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass_request_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass_request_body I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the original request body is passed[m
[31m-to the proxied server.[m
[31m-[m
[31m-    [m
[31m-    location /x-accel-redirect-here/ {[m
[31m-        proxy_method GET;[m
[31m-        proxy_pass_request_body off;[m
[31m-        proxy_set_header Content-Length "";[m
[31m-    [m
[31m-        proxy_pass ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-See also the L</proxy_set_header> and[m
[31m-L</proxy_pass_request_headers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass_request_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass_request_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the header fields of the original request are passed[m
[31m-to the proxied server.[m
[31m-[m
[31m-    [m
[31m-    location /x-accel-redirect-here/ {[m
[31m-        proxy_method GET;[m
[31m-        proxy_pass_request_headers off;[m
[31m-        proxy_pass_request_body off;[m
[31m-    [m
[31m-        proxy_pass ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-See also the L</proxy_set_header> and[m
[31m-L</proxy_pass_request_body> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the proxied server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the proxied server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_redirect[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_redirect I<C<default>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_redirect I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_redirect I<I<C<redirect>> I<C<replacement>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<default>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the text that should be changed in the C<Location>[m
[31m-and C<Refresh> header fields of a proxied server response.[m
[31m-Suppose a proxied server returned the header field[m
[31m-“C<Location: http:E<sol>E<sol>localhost:8000E<sol>twoE<sol>someE<sol>uriE<sol>>”.[m
[31m-The directive[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect http://localhost:8000/two/ http://frontend/one/;[m
[31m-[m
[31m-[m
[31m-will rewrite this string to[m
[31m-“C<Location: http:E<sol>E<sol>frontendE<sol>oneE<sol>someE<sol>uriE<sol>>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A server name may be omitted in the I<C<replacement>> string:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect http://localhost:8000/two/ /;[m
[31m-[m
[31m-[m
[31m-then the primary server’s name and port, if different from 80,[m
[31m-will be inserted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The default replacement specified by the C<default> parameter[m
[31m-uses the parameters of the[m
[31m-L<ngx_http_core_module> and[m
[31m-L</proxy_pass> directives.[m
[31m-Hence, the two configurations below are equivalent:[m
[31m-[m
[31m-    [m
[31m-    location /one/ {[m
[31m-        proxy_pass     http://upstream:port/two/;[m
[31m-        proxy_redirect default;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /one/ {[m
[31m-        proxy_pass     http://upstream:port/two/;[m
[31m-        proxy_redirect http://upstream:port/two/ /one/;[m
[31m-[m
[31m-[m
[31m-The C<default> parameter is not permitted if[m
[31m-L</proxy_pass> is specified using variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A I<C<replacement>> string can contain variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect http://localhost:8000/ http://$host:$server_port/;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A I<C<redirect>> can also contain (1.1.11) variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect http://$proxy_host:8000/ /;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive can be specified (1.1.11) using regular expressions.[m
[31m-In this case, I<C<redirect>> should either start with[m
[31m-the “C<~>” symbol for a case-sensitive matching,[m
[31m-or with the “C<~*>” symbols for case-insensitive[m
[31m-matching.[m
[31m-The regular expression can contain named and positional captures,[m
[31m-and I<C<replacement>> can reference them:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;[m
[31m-    proxy_redirect ~*/user/([^/]+)/(.+)$      http://$1.example.com/$2;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<proxy_redirect> directives:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect default;[m
[31m-    proxy_redirect http://localhost:8000/  /;[m
[31m-    proxy_redirect http://www.example.com/ /;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<off> parameter cancels the effect of all[m
[31m-C<proxy_redirect> directives on the current level:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect off;[m
[31m-    proxy_redirect default;[m
[31m-    proxy_redirect http://localhost:8000/  /;[m
[31m-    proxy_redirect http://www.example.com/ /;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Using this directive, it is also possible to add host names to relative[m
[31m-redirects issued by a proxied server:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect / /;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_request_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_request_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of a client request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the entire request body is[m
[31m-L<read|ngx_http_core_module>[m
[31m-from the client before sending the request to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the request body is sent to the proxied server[m
[31m-immediately as it is received.[m
[31m-In this case, the request cannot be passed to the[m
[31m-next server[m
[31m-if nginx already started sending the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When HTTPE<sol>1.1 chunked transfer encoding is used[m
[31m-to send the original request body,[m
[31m-the request body will be buffered regardless of the directive value unless[m
[31m-HTTPE<sol>1.1 is enabled for proxying.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_send_lowat[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_send_lowat I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is set to a non-zero value, nginx will try to[m
[31m-minimize the number[m
[31m-of send operations on outgoing connections to a proxied server by using either[m
[31m-C<NOTE_LOWAT> flag of the[m
[31m-L<events> method,[m
[31m-or the C<SO_SNDLOWAT> socket option,[m
[31m-with the specified I<C<size>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is ignored on Linux, Solaris, and Windows.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the proxied server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the proxied server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_set_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_set_body I<I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows redefining the request body passed to the proxied server.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_set_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_set_header I<I<C<field>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<Host $proxy_host>[m
[31m-[m
[31m-[m
[31m-B<default:> I<Connection close>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows redefining or appending fields to the request header[m
[31m-passed to the proxied server.[m
[31m-The I<C<value>> can contain text, variables, and their combinations.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<proxy_set_header>[m
[31m-directives defined on the current level.[m
[31m-By default, only two fields are redefined:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Host       $proxy_host;[m
[31m-    proxy_set_header Connection close;[m
[31m-[m
[31m-[m
[31m-If caching is enabled, the header fields[m
[31m-C<If-Modified-Since>,[m
[31m-C<If-Unmodified-Since>,[m
[31m-C<If-None-Match>,[m
[31m-C<If-Match>,[m
[31m-C<Range>,[m
[31m-and[m
[31m-C<If-Range>[m
[31m-from the original request are not passed to the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-An unchanged C<Host> request header field can be passed like this:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Host       $http_host;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, if this field is not present in a client request header then[m
[31m-nothing will be passed.[m
[31m-In such a case it is better to use the C<$host> variableE<mdash>its[m
[31m-value equals the server name in the C<Host> request header[m
[31m-field or the primary server name if this field is not present:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Host       $host;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the server name can be passed together with the port of the[m
[31m-proxied server:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Host       $host:$proxy_port;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the value of a header field is an empty string then this[m
[31m-field will not be passed to a proxied server:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Accept-Encoding "";[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-used for authentication to a proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-used for authentication to a proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>> (1.7.9),[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<DEFAULT>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers for requests to a proxied HTTPS server.[m
[31m-The ciphers are specified in the format understood by the OpenSSL library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-the certificate of the proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<$proxy_host>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows overriding the server name used to[m
[31m-verify[m
[31m-the certificate of the proxied HTTPS server and to be[m
[31m-passed through SNI[m
[31m-when establishing a connection with the proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the host part of the L</proxy_pass> URL is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_server_name I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables passing of the server name through[m
[31m-L<TLS[m
[31m-Server Name Indication extension|http://en.wikipedia.org/wiki/Server_Name_Indication> (SNI, RFC 6066)[m
[31m-when establishing a connection with the proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_session_reuse[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_session_reuse I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether SSL sessions can be reused when working with[m
[31m-the proxied server.[m
[31m-If the errors[m
[31m-“C<SSL3_GET_FINISHED:digest check failed>”[m
[31m-appear in the logs, try disabling session reuse.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols for requests to a proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify[m
[31m-the certificate of the proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_verify[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_verify I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables verification of the proxied HTTPS server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the proxied HTTPS server certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_store[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_store I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables saving of files to a disk.[m
[31m-The C<on> parameter saves files with paths[m
[31m-corresponding to the directives[m
[31m-L<ngx_http_core_module> or[m
[31m-L<ngx_http_core_module>.[m
[31m-The C<off> parameter disables saving of files.[m
[31m-In addition, the file name can be set explicitly using the[m
[31m-I<C<string>> with variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_store /data/www$original_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The modification time of files is set according to the received[m
[31m-C<Last-Modified> response header field.[m
[31m-The response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the L</proxy_temp_path>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive can be used to create local copies of static unchangeable[m
[31m-files, e.g.:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root               /data/www;[m
[31m-        error_page         404 = /fetch$uri;[m
[31m-    }[m
[31m-    [m
[31m-    location /fetch/ {[m
[31m-        internal;[m
[31m-    [m
[31m-        proxy_pass         http://backend/;[m
[31m-        proxy_store        on;[m
[31m-        proxy_store_access user:rw group:rw all:r;[m
[31m-        proxy_temp_path    /data/temp;[m
[31m-    [m
[31m-        alias              /data/www/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-or like this:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root               /data/www;[m
[31m-        error_page         404 = @fetch;[m
[31m-    }[m
[31m-    [m
[31m-    location @fetch {[m
[31m-        internal;[m
[31m-    [m
[31m-        proxy_pass         http://backend;[m
[31m-        proxy_store        on;[m
[31m-        proxy_store_access user:rw group:rw all:r;[m
[31m-        proxy_temp_path    /data/temp;[m
[31m-    [m
[31m-        root               /data/www;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_store_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_store_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    proxy_store_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    proxy_store_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_temp_file_write_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_temp_file_write_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the I<C<size>> of data written to a temporary file[m
[31m-at a time, when buffering of responses from the proxied server[m
[31m-to temporary files is enabled.[m
[31m-By default, I<C<size>> is limited by two buffers set by the[m
[31m-L</proxy_buffer_size> and L</proxy_buffers> directives.[m
[31m-The maximum size of a temporary file is set by the[m
[31m-L</proxy_max_temp_file_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<proxy_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files[m
[31m-with data received from proxied servers.[m
[31m-Up to three-level subdirectory hierarchy can be used underneath the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    proxy_temp_path /spool/nginx/proxy_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/proxy_temp/<emphasis>7</emphasis>/<emphasis>45</emphasis>/00000123<emphasis>457</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the C<use_temp_path> parameter of the[m
[31m-L</proxy_cache_path> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_proxy_module> module supports embedded variables[m
[31m-that can be used to compose headers using the[m
[31m-L</proxy_set_header> directive:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$proxy_host>[m
[31m-[m
[31m-[m
[31m-[m
[31m-name and port of a proxied server as specified in the[m
[31m-L</proxy_pass> directive;[m
[31m-[m
[31m-[m
[31m-=item C<$proxy_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-port of a proxied server as specified in the[m
[31m-L</proxy_pass> directive, or the protocol’s default port;[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<$proxy_add_x_forwarded_for>[m
[31m-[m
[31m-[m
[31m-[m
[31m-the C<X-Forwarded-For> client request header field[m
[31m-with the C<$remote_addr> variable appended to it, separated by a comma.[m
[31m-If the C<X-Forwarded-For> field is not present in the client[m
[31m-request header, the C<$proxy_add_x_forwarded_for> variable is equal[m
[31m-to the C<$remote_addr> variable.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_random_index_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_random_index_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 9337872..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_random_index_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_random_index_module - Module ngx_http_random_index_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_random_index_module> module processes requests[m
[31m-ending with the slash character (‘C<E<sol>>’) and picks a random[m
[31m-file in a directory to serve as an index file.[m
[31m-The module is processed before the[m
[31m-L<ngx_http_index_module|ngx_http_index_module>[m
[31m-module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_random_index_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        random_index on;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 random_index[m
[31m-[m
[31m-[m
[31m-B<syntax:> random_index I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_realip_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_realip_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 689f9d9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_realip_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_realip_module - Module ngx_http_realip_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_realip_module> module is used[m
[31m-to change the client address and optional port[m
[31m-to the one sent in the specified header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_realip_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    set_real_ip_from  192.168.1.0/24;[m
[31m-    set_real_ip_from  192.168.2.1;[m
[31m-    set_real_ip_from  2001:0db8::/32;[m
[31m-    real_ip_header    X-Forwarded-For;[m
[31m-    real_ip_recursive on;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 set_real_ip_from[m
[31m-[m
[31m-[m
[31m-B<syntax:> set_real_ip_from I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines trusted addresses that are known to send correct[m
[31m-replacement addresses.[m
[31m-If the special value C<unix:> is specified,[m
[31m-all UNIX-domain sockets will be trusted.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-IPv6 addresses are supported starting from versions 1.3.0 and 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 real_ip_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> real_ip_header I<[m
[31m-    I<C<field>> E<verbar>[m
[31m-    C<X-Real-IP> E<verbar>[m
[31m-    C<X-Forwarded-For> E<verbar>[m
[31m-    C<proxy_protocol>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<X-Real-IP>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the request header field[m
[31m-whose value will be used to replace the client address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<X-Real-IP> and C<X-Forwarded-For>[m
[31m-parameters may contain an optional port (1.11.0).[m
[31m-The address and port should be specified according to[m
[31m-L<RFC 3986|http://tools.ietf.org/html/3986>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<proxy_protocol> parameter (1.5.12) changes[m
[31m-the client address to the one from the PROXY protocol header.[m
[31m-The PROXY protocol must be previously enabled by setting the[m
[31m-C<proxy_protocol> parameter[m
[31m-in the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 real_ip_recursive[m
[31m-[m
[31m-[m
[31m-B<syntax:> real_ip_recursive I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If recursive search is disabled, the original client address that[m
[31m-matches one of the trusted addresses is replaced by the last[m
[31m-address sent in the request header field defined by the[m
[31m-L</real_ip_header> directive.[m
[31m-If recursive search is enabled, the original client address that[m
[31m-matches one of the trusted addresses is replaced by the last[m
[31m-non-trusted address sent in the request header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$realip_remote_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the original client address (1.9.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$realip_remote_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the original client port (1.11.0)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_referer_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_referer_module.pod[m
[1mdeleted file mode 100644[m
[1mindex ce2315b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_referer_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,255 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_referer_module - Module ngx_http_referer_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_referer_module> module is used to block[m
[31m-access to a site for requests with invalid values in the[m
[31m-C<Referer> header field.[m
[31m-It should be kept in mind that fabricating a request with an appropriate[m
[31m-C<Referer> field value is quite easy, and so the intended[m
[31m-purpose of this module is not to block such requests thoroughly but to block[m
[31m-the mass flow of requests sent by regular browsers.[m
[31m-It should also be taken into consideration that regular browsers may[m
[31m-not send the C<Referer> field even for valid requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    valid_referers none blocked server_names[m
[31m-                   *.example.com example.* www.example.org/galleries/[m
[31m-                   ~\.google\.;[m
[31m-    [m
[31m-    if ($invalid_referer) {[m
[31m-        return 403;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 referer_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> referer_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the valid referers hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 referer_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> referer_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<2048>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the valid referers hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 valid_referers[m
[31m-[m
[31m-[m
[31m-B<syntax:> valid_referers I<[m
[31m-    C<none> E<verbar>[m
[31m-    C<blocked> E<verbar>[m
[31m-    C<server_names> E<verbar>[m
[31m-    I<C<string>>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the C<Referer> request header field values[m
[31m-that will cause the embedded C<$invalid_referer> variable to[m
[31m-be set to an empty string.[m
[31m-Otherwise, the variable will be set to “C<1>”.[m
[31m-Search for a match is case-insensitive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters can be as follows:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the C<Referer> field is missing in the request header;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<blocked>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the C<Referer> field is present in the request header,[m
[31m-but its value has been deleted by a firewall or proxy server;[m
[31m-such values are strings that do not start with[m
[31m-“C<http:E<sol>E<sol>>” or “C<https:E<sol>E<sol>>”;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server_names>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the C<Referer> request header field contains[m
[31m-one of the server names;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item arbitrary string[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines a server name and an optional URI prefix.[m
[31m-A server name can have an “C<*>” at the beginning or end.[m
[31m-During the checking, the server’s port in the C<Referer> field[m
[31m-is ignored;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item regular expression[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the first symbol should be a “C<~>”.[m
[31m-It should be noted that an expression will be matched against[m
[31m-the text starting after the “C<http:E<sol>E<sol>>”[m
[31m-or “C<https:E<sol>E<sol>>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    valid_referers none blocked server_names[m
[31m-                   *.example.com example.* www.example.org/galleries/[m
[31m-                   ~\.google\.;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$invalid_referer>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Empty string, if the C<Referer> request header field[m
[31m-value is considered[m
[31m-valid, otherwise “C<1>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_rewrite_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_rewrite_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 043266f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_rewrite_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,700 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_rewrite_module - Module ngx_http_rewrite_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_rewrite_module> module is used to[m
[31m-change request URI using regular expressions, return redirects, and[m
[31m-conditionally select configurations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_rewrite_module> module directives are[m
[31m-processed in the following order:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the directives of this module specified on the[m
[31m-L<ngx_http_core_module> level[m
[31m-are executed sequentially;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-repeatedly:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-a[m
[31m-L<ngx_http_core_module>[m
[31m-is searched based on a request URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the directives of this module specified inside the found location[m
[31m-are executed sequentially;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the loop is repeated if a request URI was rewritten,[m
[31m-but not more than[m
[31m-L<10 times|ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 break[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Stops processing the current set of[m
[31m-C<ngx_http_rewrite_module> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a directive is specified inside the[m
[31m-L<ngx_http_core_module>,[m
[31m-further processing of the request continues in this location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    if ($slow) {[m
[31m-        limit_rate 10k;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 if[m
[31m-[m
[31m-[m
[31m-B<syntax:> if I<(I<C<condition>>) { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The specified I<C<condition>> is evaluated.[m
[31m-If true, this module directives specified inside the braces are[m
[31m-executed, and the request is assigned the configuration inside the[m
[31m-C<if> directive.[m
[31m-Configurations inside the C<if> directives are[m
[31m-inherited from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A condition may be any of the following:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-a variable name; false if the value of a variable is an empty string[m
[31m-or “C<0>”;[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.0.1, any string starting with “C<0>”[m
[31m-was considered a false value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-comparison of a variable with a string using the[m
[31m-“C<=>” and “C<!=>” operators;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-matching of a variable against a regular expression using the[m
[31m-“C<~>” (for case-sensitive matching) and[m
[31m-“C<~*>” (for case-insensitive matching) operators.[m
[31m-Regular expressions can contain captures that are made available for[m
[31m-later reuse in the C<$1>..C<$9> variables.[m
[31m-Negative operators “C<!~>” and “C<!~*>”[m
[31m-are also available.[m
[31m-If a regular expression includes the “C<}>”[m
[31m-or “C<;>” characters, the whole expressions should be enclosed[m
[31m-in single or double quotes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checking of a file existence with the “C<-f>” and[m
[31m-“C<!-f>” operators;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checking of a directory existence with the “C<-d>” and[m
[31m-“C<!-d>” operators;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checking of a file, directory, or symbolic link existence with the[m
[31m-“C<-e>” and “C<!-e>” operators;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checking for an executable file with the “C<-x>”[m
[31m-and “C<!-x>” operators.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Examples:[m
[31m-[m
[31m-    [m
[31m-    if ($http_user_agent ~ MSIE) {[m
[31m-        rewrite ^(.*)$ /msie/$1 break;[m
[31m-    }[m
[31m-    [m
[31m-    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {[m
[31m-        set $id $1;[m
[31m-    }[m
[31m-    [m
[31m-    if ($request_method = POST) {[m
[31m-        return 405;[m
[31m-    }[m
[31m-    [m
[31m-    if ($slow) {[m
[31m-        limit_rate 10k;[m
[31m-    }[m
[31m-    [m
[31m-    if ($invalid_referer) {[m
[31m-        return 403;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-A value of the C<$invalid_referer> embedded variable is set by the[m
[31m-L<ngx_http_referer_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 return[m
[31m-[m
[31m-[m
[31m-B<syntax:> return I<I<C<code>> [I<C<text>>]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> return I<I<C<code>> I<C<URL>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> return I<I<C<URL>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Stops processing and returns the specified I<C<code>> to a client.[m
[31m-The non-standard code 444 closes a connection without sending[m
[31m-a response header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Starting from version 0.8.42, it is possible to specify[m
[31m-either a redirect URL (for codes 301, 302, 303, and 307),[m
[31m-or the response body I<C<text>> (for other codes).[m
[31m-A response body text and redirect URL can contain variables.[m
[31m-As a special case, a redirect URL can be specified as a URI[m
[31m-local to this server, in which case the full redirect URL[m
[31m-is formed according to the request scheme (C<$scheme>) and the[m
[31m-L<ngx_http_core_module> and[m
[31m-L<ngx_http_core_module> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, a I<C<URL>> for temporary redirect with the code 302[m
[31m-can be specified as the sole parameter.[m
[31m-Such a parameter should start with the “C<http:E<sol>E<sol>>”,[m
[31m-“C<https:E<sol>E<sol>>”, or “C<$scheme>” string.[m
[31m-A I<C<URL>> can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Only the following codes could be returned before version 0.7.51:[m
[31m-204, 400, 402 — 406, 408, 410, 411, 413, 416, and 500 — 504.[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The code 307 was not treated as a redirect until versions 1.1.16 and 1.0.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite[m
[31m-[m
[31m-[m
[31m-B<syntax:> rewrite I<[m
[31m-    I<C<regex>>[m
[31m-    I<C<replacement>>[m
[31m-    [I<C<flag>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the specified regular expression matches a request URI, URI is changed[m
[31m-as specified in the I<C<replacement>> string.[m
[31m-The C<rewrite> directives are executed sequentially[m
[31m-in order of their appearance in the configuration file.[m
[31m-It is possible to terminate further processing of the directives using flags.[m
[31m-If a replacement string starts with “C<http:E<sol>E<sol>>”[m
[31m-or “C<https:E<sol>E<sol>>”, the processing stops and the[m
[31m-redirect is returned to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-An optional I<C<flag>> parameter can be one of:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<last>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-stops processing the current set of[m
[31m-C<ngx_http_rewrite_module> directives and starts[m
[31m-a search for a new location matching the changed URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<break>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-stops processing the current set of[m
[31m-C<ngx_http_rewrite_module> directives[m
[31m-as with the L</break> directive;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<redirect>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns a temporary redirect with the 302 code;[m
[31m-used if a replacement string does not start with[m
[31m-“C<http:E<sol>E<sol>>” or “C<https:E<sol>E<sol>>”;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<permanent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns a permanent redirect with the 301 code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-The full redirect URL is formed according to the[m
[31m-request scheme (C<$scheme>) and the[m
[31m-L<ngx_http_core_module> and[m
[31m-L<ngx_http_core_module> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;[m
[31m-        rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;[m
[31m-        return  403;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-But if these directives are put inside the “C<E<sol>downloadE<sol>>”[m
[31m-location, the C<last> flag should be replaced by[m
[31m-C<break>, or otherwise nginx will make 10 cycles and[m
[31m-return the 500 error:[m
[31m-[m
[31m-    [m
[31m-    location /download/ {[m
[31m-        rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;[m
[31m-        rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;[m
[31m-        return  403;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a I<C<replacement>> string includes the new request arguments,[m
[31m-the previous request arguments are appended after them.[m
[31m-If this is undesired, putting a question mark at the end of a replacement[m
[31m-string avoids having them appended, for example:[m
[31m-[m
[31m-    [m
[31m-    rewrite ^/users/(.*)$ /show?user=$1? last;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a regular expression includes the “C<}>”[m
[31m-or “C<;>” characters, the whole expressions should be enclosed[m
[31m-in single or double quotes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_log[m
[31m-[m
[31m-[m
[31m-B<syntax:> rewrite_log I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables logging of C<ngx_http_rewrite_module>[m
[31m-module directives processing results[m
[31m-into the L<ngx_core_module> at[m
[31m-the C<notice> level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set[m
[31m-[m
[31m-[m
[31m-B<syntax:> set I<I<C<$variable>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<value>> for the specified I<C<variable>>.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uninitialized_variable_warn[m
[31m-[m
[31m-[m
[31m-B<syntax:> uninitialized_variable_warn I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Controls whether warnings about uninitialized variables are logged.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Internal Implementation[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_rewrite_module> module directives[m
[31m-are compiled at the configuration stage into internal instructions[m
[31m-that are interpreted during request processing.[m
[31m-An interpreter is a simple virtual stack machine.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, the directives[m
[31m-[m
[31m-    [m
[31m-    location /download/ {[m
[31m-        if ($forbidden) {[m
[31m-            return 403;[m
[31m-        }[m
[31m-    [m
[31m-        if ($slow) {[m
[31m-            limit_rate 10k;[m
[31m-        }[m
[31m-    [m
[31m-        rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-will be translated into these instructions:[m
[31m-[m
[31m-    [m
[31m-    variable $forbidden[m
[31m-    check against zero[m
[31m-        return 403[m
[31m-        end of code[m
[31m-    variable $slow[m
[31m-    check against zero[m
[31m-    match of regular expression[m
[31m-    copy "/"[m
[31m-    copy $1[m
[31m-    copy "/mp3/"[m
[31m-    copy $2[m
[31m-    copy ".mp3"[m
[31m-    end of regular expression[m
[31m-    end of code[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that there are no instructions for the[m
[31m-L<ngx_http_core_module>[m
[31m-directive above as it is unrelated to the[m
[31m-C<ngx_http_rewrite_module> module.[m
[31m-A separate configuration is created for the L</if> block.[m
[31m-If the condition holds true, a request is assigned this configuration[m
[31m-where C<limit_rate> equals to 10k.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive[m
[31m-[m
[31m-    [m
[31m-    rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;[m
[31m-[m
[31m-[m
[31m-can be made smaller by one instruction if the first slash in the regular expression[m
[31m-is put inside the parentheses:[m
[31m-[m
[31m-    [m
[31m-    rewrite ^(<emphasis>/</emphasis>download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;[m
[31m-[m
[31m-[m
[31m-The corresponding instructions will then look like this:[m
[31m-[m
[31m-    [m
[31m-    match of regular expression[m
[31m-    copy $1[m
[31m-    copy "/mp3/"[m
[31m-    copy $2[m
[31m-    copy ".mp3"[m
[31m-    end of regular expression[m
[31m-    end of code[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_scgi_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_scgi_module.pod[m
[1mdeleted file mode 100644[m
[1mindex f590f54..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_scgi_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,2178 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_scgi_module - Module ngx_http_scgi_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_scgi_module> module allows passing[m
[31m-requests to an SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        include   scgi_params;[m
[31m-        scgi_pass localhost:9000;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 scgi_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to an SCGI server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<scgi_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to an SCGI server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    scgi_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the first part[m
[31m-of the response received from the SCGI server.[m
[31m-This part usually contains a small response header.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-It can be made smaller, however.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of responses from the SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, nginx receives a response from the SCGI server[m
[31m-as soon as possible, saving it into the buffers set by the[m
[31m-L</scgi_buffer_size> and L</scgi_buffers> directives.[m
[31m-If the whole response does not fit into memory, a part of it can be saved[m
[31m-to a temporary file on the disk.[m
[31m-Writing to temporary files is controlled by the[m
[31m-L</scgi_max_temp_file_size> and[m
[31m-L</scgi_temp_file_write_size> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the response is passed to a client synchronously,[m
[31m-immediately as it is received.[m
[31m-nginx will not try to read the whole response from the SCGI server.[m
[31m-The maximum size of the data that nginx can receive from the server[m
[31m-at a time is set by the L</scgi_buffer_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering can also be enabled or disabled by passing[m
[31m-“C<yes>” or “C<no>” in the[m
[31m-C<X-Accel-Buffering> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L</scgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from the SCGI server,[m
[31m-for a single connection.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_busy_buffers_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_busy_buffers_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the SCGI[m
[31m-server is enabled, limits the total I<C<size>> of buffers that[m
[31m-can be busy sending a response to the client while the response is not[m
[31m-yet fully read.[m
[31m-In the meantime, the rest of the buffers can be used for reading the response[m
[31m-and, if needed, buffering part of the response to a temporary file.[m
[31m-By default, I<C<size>> is limited by the size of two buffers set by the[m
[31m-L</scgi_buffer_size> and L</scgi_buffers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache I<I<C<zone>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a shared memory zone used for caching.[m
[31m-The same zone can be used in several places.[m
[31m-Parameter value can contain variables (1.7.9).[m
[31m-The C<off> parameter disables caching inherited[m
[31m-from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_bypass[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_bypass I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be taken from a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be taken from the cache:[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_bypass $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    scgi_cache_bypass $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</scgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_key I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for caching, for example[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_key localhost:9000$request_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_lock[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_lock I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When enabled, only one request at a time will be allowed to populate[m
[31m-a new cache element identified according to the L</scgi_cache_key>[m
[31m-directive by passing a request to an SCGI server.[m
[31m-Other requests of the same cache element will either wait[m
[31m-for a response to appear in the cache or the cache lock for[m
[31m-this element to be released, up to the time set by the[m
[31m-L</scgi_cache_lock_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_lock_age[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_lock_age I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the last request passed to the SCGI server[m
[31m-for populating a new cache element[m
[31m-has not completed for the specified I<C<time>>,[m
[31m-one more request may be passed to the SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_lock_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_lock_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for L</scgi_cache_lock>.[m
[31m-When the I<C<time>> expires,[m
[31m-the request will be passed to the SCGI server,[m
[31m-however, the response will not be cached.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 1.7.8, the response could be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_methods I<[m
[31m-    C<GET> E<verbar>[m
[31m-    C<HEAD> E<verbar>[m
[31m-    C<POST>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<GET HEAD>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the client request method is listed in this directive then[m
[31m-the response will be cached.[m
[31m-“C<GET>” and “C<HEAD>” methods are always[m
[31m-added to the list, though it is recommended to specify them explicitly.[m
[31m-See also the L</scgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> of requests after which the response[m
[31m-will be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_path I<[m
[31m-    I<C<path>>[m
[31m-    [C<levels>=I<C<levels>>][m
[31m-    [C<use_temp_path>=C<on>E<verbar>C<off>][m
[31m-    C<keys_zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<inactive>=I<C<time>>][m
[31m-    [C<max_size>=I<C<size>>][m
[31m-    [C<loader_files>=I<C<number>>][m
[31m-    [C<loader_sleep>=I<C<time>>][m
[31m-    [C<loader_threshold>=I<C<time>>][m
[31m-    [C<purger>=C<on>E<verbar>C<off>][m
[31m-    [C<purger_files>=I<C<number>>][m
[31m-    [C<purger_sleep>=I<C<time>>][m
[31m-    [C<purger_threshold>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path and other parameters of a cache.[m
[31m-Cache data are stored in files.[m
[31m-The file name in a cache is a result of[m
[31m-applying the MD5 function to the[m
[31m-cache key.[m
[31m-The C<levels> parameter defines hierarchy levels of a cache.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;[m
[31m-[m
[31m-[m
[31m-file names in a cache will look like this:[m
[31m-[m
[31m-    [m
[31m-    /data/nginx/cache/<emphasis>c</emphasis>/<emphasis>29</emphasis>/b7f54b2df7773722d382f4809d650<emphasis>29c</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A cached response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the cache can be put on[m
[31m-different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both cache and a directory[m
[31m-holding temporary files[m
[31m-are put on the same file system.[m
[31m-A directory for temporary files is set based on[m
[31m-the C<use_temp_path> parameter (1.7.10).[m
[31m-If this parameter is omitted or set to the value C<on>,[m
[31m-the directory set by the L</scgi_temp_path> directive[m
[31m-for the given location will be used.[m
[31m-If the value is set to C<off>,[m
[31m-temporary files will be put directly in the cache directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, all active keys and information about data are stored[m
[31m-in a shared memory zone, whose I<C<name>> and I<C<size>>[m
[31m-are configured by the C<keys_zone> parameter.[m
[31m-One megabyte zone can store about 8 thousand keys.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Cached data that are not accessed during the time specified by the[m
[31m-C<inactive> parameter get removed from the cache[m
[31m-regardless of their freshness.[m
[31m-By default, C<inactive> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special “cache manager” process monitors the maximum cache size set[m
[31m-by the C<max_size> parameter.[m
[31m-When this size is exceeded, it removes the least recently used data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A minute after the start the special “cache loader” process is activated.[m
[31m-It loads information about previously cached data stored on file system[m
[31m-into a cache zone.[m
[31m-The loading is done in iterations.[m
[31m-During one iteration no more than C<loader_files> items[m
[31m-are loaded (by default, 100).[m
[31m-Besides, the duration of one iteration is limited by the[m
[31m-C<loader_threshold> parameter (by default, 200 milliseconds).[m
[31m-Between iterations, a pause configured by the C<loader_sleep>[m
[31m-parameter (by default, 50 milliseconds) is made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Instructs whether cache entries that match a[m
[31m-wildcard key[m
[31m-will be removed from the disk by the cache purger (1.7.12).[m
[31m-Setting the parameter to C<on>[m
[31m-(default is C<off>)[m
[31m-will activate the “cache purger” process that[m
[31m-permanently iterates through all cache entries[m
[31m-and deletes the entries that match the wildcard key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_files>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of items that will be scanned during one iteration (1.7.12).[m
[31m-By default, C<purger_files> is set to 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_threshold>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the duration of one iteration (1.7.12).[m
[31m-By default, C<purger_threshold> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_sleep>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a pause between iterations (1.7.12).[m
[31m-By default, C<purger_sleep> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_purge[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_purge I<string ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the request will be considered a cache[m
[31m-purge request.[m
[31m-If at least one value of the string parameters is not empty and is not equal[m
[31m-to “0” then the cache entry with a corresponding[m
[31m-cache key is removed.[m
[31m-The result of successful operation is indicated by returning[m
[31m-the C<204> (C<No Content>) response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the cache key of a purge request ends[m
[31m-with an asterisk (“C<*>”), all cache entries matching the[m
[31m-wildcard key will be removed from the cache.[m
[31m-However, these entries will remain on the disk until they are deleted[m
[31m-for either inactivity,[m
[31m-or processed by the cache purger (1.7.12),[m
[31m-or a client attempts to access them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration:[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m;[m
[31m-    [m
[31m-    map $request_method $purge_method {[m
[31m-        PURGE   1;[m
[31m-        default 0;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        location / {[m
[31m-            scgi_pass        backend;[m
[31m-            scgi_cache       cache_zone;[m
[31m-            scgi_cache_key   $uri;[m
[31m-            scgi_cache_purge $purge_method;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This functionality is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_revalidate[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_revalidate I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables revalidation of expired cache items using conditional requests with[m
[31m-the C<If-Modified-Since> and C<If-None-Match>[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_use_stale[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_use_stale I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<updating> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines in which cases a stale cached response can be used[m
[31m-when an error occurs during communication with the SCGI server.[m
[31m-The directive’s parameters match the parameters of the[m
[31m-L</scgi_next_upstream> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<error> parameter also permits[m
[31m-using a stale cached response if an SCGI server to process a request[m
[31m-cannot be selected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, the C<updating> parameter permits[m
[31m-using a stale cached response if it is currently being updated.[m
[31m-This allows minimizing the number of accesses to SCGI servers[m
[31m-when updating cached data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To minimize the number of accesses to SCGI servers when[m
[31m-populating a new cache element, the L</scgi_cache_lock>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_valid I<[I<C<code>> ...] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets caching time for different response codes.[m
[31m-For example, the following directives[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_valid 200 302 10m;[m
[31m-    scgi_cache_valid 404      1m;[m
[31m-[m
[31m-[m
[31m-set 10 minutes of caching for responses with codes 200 and 302[m
[31m-and 1 minute for responses with code 404.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only caching I<C<time>> is specified[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_valid 5m;[m
[31m-[m
[31m-[m
[31m-then only 200, 301, and 302 responses are cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the C<any> parameter can be specified[m
[31m-to cache any responses:[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_valid 200 302 10m;[m
[31m-    scgi_cache_valid 301      1h;[m
[31m-    scgi_cache_valid any      1m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters of caching can also be set directly[m
[31m-in the response header.[m
[31m-This has higher priority than setting of caching time using the directive.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<X-Accel-Expires> header field sets caching time of a[m
[31m-response in seconds.[m
[31m-The zero value disables caching for a response.[m
[31m-If the value starts with the C<@> prefix, it sets an absolute[m
[31m-time in seconds since Epoch, up to which the response may be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header does not include the C<X-Accel-Expires> field,[m
[31m-parameters of caching may be set in the header fields[m
[31m-C<Expires> or C<Cache-Control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Set-Cookie> field, such a[m
[31m-response will not be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Vary> field[m
[31m-with the special value “C<*>”, such a[m
[31m-response will not be cached (1.7.7).[m
[31m-If the header includes the C<Vary> field[m
[31m-with another value, such a response will be cached[m
[31m-taking into account the corresponding request header fields (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Processing of one or more of these response header fields can be disabled[m
[31m-using the L</scgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with an SCGI server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the SCGI server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_hide_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_hide_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default,[m
[31m-nginx does not pass the header fields C<Status> and[m
[31m-C<X-Accel-...> from the response of an SCGI[m
[31m-server to a client.[m
[31m-The C<scgi_hide_header> directive sets additional fields[m
[31m-that will not be passed.[m
[31m-If, on the contrary, the passing of fields needs to be permitted,[m
[31m-the L</scgi_pass_header> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_ignore_client_abort[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_ignore_client_abort I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether the connection with an SCGI server should be[m
[31m-closed when a client closes the connection without waiting[m
[31m-for a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_ignore_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_ignore_headers I<I<C<field>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables processing of certain response header fields from the SCGI server.[m
[31m-The following fields can be ignored: C<X-Accel-Redirect>,[m
[31m-C<X-Accel-Expires>, C<X-Accel-Limit-Rate> (1.1.6),[m
[31m-C<X-Accel-Buffering> (1.1.6),[m
[31m-C<X-Accel-Charset> (1.1.6), C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie> (0.8.44),[m
[31m-and C<Vary> (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If not disabled, processing of these header fields has the following[m
[31m-effect:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Expires>, C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie>,[m
[31m-and C<Vary>[m
[31m-set the parameters of response caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Redirect> performs an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> to the specified URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Limit-Rate> sets the[m
[31m-L<rate[m
[31m-limit|ngx_http_core_module> for transmission of a response to a client;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Buffering> enables or disables[m
[31m-buffering of a response;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Charset> sets the desired[m
[31m-L<ngx_http_charset_module>[m
[31m-of a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_intercept_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_intercept_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether an SCGI server responses with codes greater than or equal[m
[31m-to 300 should be passed to a client or be redirected to nginx for processing[m
[31m-with the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the response from the SCGI server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if nginx simultaneously opens[m
[31m-two connections to the SCGI server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-The limitation works only if[m
[31m-buffering of responses from the SCGI[m
[31m-server is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_max_temp_file_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_max_temp_file_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the SCGI[m
[31m-server is enabled, and the whole response does not fit into the buffers[m
[31m-set by the L</scgi_buffer_size> and L</scgi_buffers>[m
[31m-directives, a part of the response can be saved to a temporary file.[m
[31m-This directive sets the maximum I<C<size>> of the temporary file.[m
[31m-The size of data written to the temporary file at a time is set[m
[31m-by the L</scgi_temp_file_write_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The zero value disables buffering of responses to temporary files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This restriction does not apply to responses[m
[31m-that will be cached[m
[31m-or stored on disk.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<non_idempotent> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_header>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<http_500>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 500;[m
[31m-[m
[31m-[m
[31m-=item C<http_503>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 503;[m
[31m-[m
[31m-[m
[31m-=item C<http_403>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 403;[m
[31m-[m
[31m-[m
[31m-=item C<http_404>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 404;[m
[31m-[m
[31m-[m
[31m-=item C<non_idempotent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-normally, requests with a[m
[31m-L<non-idempotent|http://tools.ietf.org/html/rfc7231#section-4.2.2>[m
[31m-method[m
[31m-(C<POST>, C<LOCK>, C<PATCH>)[m
[31m-are not passed to the next server[m
[31m-if a request has been sent to an upstream server (1.9.13);[m
[31m-enabling this option explicitly allows retrying such requests;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The cases of C<http_500> and C<http_503> are[m
[31m-considered unsuccessful attempts only if they are specified in the directive.[m
[31m-The cases of C<http_403> and C<http_404>[m
[31m-are never considered unsuccessful attempts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_no_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_no_cache I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be saved to a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be saved:[m
[31m-[m
[31m-    [m
[31m-    scgi_no_cache $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    scgi_no_cache $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</scgi_cache_bypass> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_param I<[m
[31m-    I<C<parameter>> I<C<value>>[m
[31m-    [C<if_not_empty>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<parameter>> that should be passed to the SCGI server.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<scgi_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Standard[m
[31m-L<CGI[m
[31m-environment variables|http://tools.ietf.org/html/rfc3875#section-4.1>[m
[31m-should be provided as SCGI headers, see the F<scgi_params> file[m
[31m-provided in the distribution:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        include scgi_params;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a directive is specified with C<if_not_empty> (1.1.11) then[m
[31m-such a parameter will not be passed to the server until its value is not empty:[m
[31m-[m
[31m-    [m
[31m-    scgi_param HTTPS $https if_not_empty;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_pass I<I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the address of an SCGI server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    scgi_pass localhost:9000;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    scgi_pass unix:/tmp/scgi.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_pass_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_pass_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Permits passing otherwise disabled header[m
[31m-fields from an SCGI server to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_pass_request_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_pass_request_body I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the original request body is passed[m
[31m-to the SCGI server.[m
[31m-See also the L</scgi_pass_request_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_pass_request_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_pass_request_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the header fields of the original request are passed[m
[31m-to the SCGI server.[m
[31m-See also the L</scgi_pass_request_body> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the SCGI server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the SCGI server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_request_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_request_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of a client request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the entire request body is[m
[31m-L<read|ngx_http_core_module>[m
[31m-from the client before sending the request to an SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the request body is sent to the SCGI server[m
[31m-immediately as it is received.[m
[31m-In this case, the request cannot be passed to the[m
[31m-next server[m
[31m-if nginx already started sending the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When HTTPE<sol>1.1 chunked transfer encoding is used[m
[31m-to send the original request body,[m
[31m-the request body will be buffered regardless of the directive value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the SCGI server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the SCGI server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_store[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_store I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables saving of files to a disk.[m
[31m-The C<on> parameter saves files with paths[m
[31m-corresponding to the directives[m
[31m-L<ngx_http_core_module> or[m
[31m-L<ngx_http_core_module>.[m
[31m-The C<off> parameter disables saving of files.[m
[31m-In addition, the file name can be set explicitly using the[m
[31m-I<C<string>> with variables:[m
[31m-[m
[31m-    [m
[31m-    scgi_store /data/www$original_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The modification time of files is set according to the received[m
[31m-C<Last-Modified> response header field.[m
[31m-The response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the L</scgi_temp_path>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive can be used to create local copies of static unchangeable[m
[31m-files, e.g.:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root              /data/www;[m
[31m-        error_page        404 = /fetch$uri;[m
[31m-    }[m
[31m-    [m
[31m-    location /fetch/ {[m
[31m-        internal;[m
[31m-    [m
[31m-        scgi_pass         backend:9000;[m
[31m-        ...[m
[31m-    [m
[31m-        scgi_store        on;[m
[31m-        scgi_store_access user:rw group:rw all:r;[m
[31m-        scgi_temp_path    /data/temp;[m
[31m-    [m
[31m-        alias             /data/www/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_store_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_store_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    scgi_store_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    scgi_store_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_temp_file_write_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_temp_file_write_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the I<C<size>> of data written to a temporary file[m
[31m-at a time, when buffering of responses from the SCGI server[m
[31m-to temporary files is enabled.[m
[31m-By default, I<C<size>> is limited by two buffers set by the[m
[31m-L</scgi_buffer_size> and L</scgi_buffers> directives.[m
[31m-The maximum size of a temporary file is set by the[m
[31m-L</scgi_max_temp_file_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<scgi_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files[m
[31m-with data received from SCGI servers.[m
[31m-Up to three-level subdirectory hierarchy can be used underneath the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    scgi_temp_path /spool/nginx/scgi_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/scgi_temp/<emphasis>7</emphasis>/<emphasis>45</emphasis>/00000123<emphasis>457</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the C<use_temp_path> parameter of the[m
[31m-L</scgi_cache_path> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_secure_link_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_secure_link_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 4420b97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_secure_link_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,328 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_secure_link_module - Module ngx_http_secure_link_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_secure_link_module> module (0.7.18)[m
[31m-is used to check authenticity of requested links,[m
[31m-protect resources from unauthorized access,[m
[31m-and limit link lifetime.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The authenticity of a requested link is verified by comparing the[m
[31m-checksum value passed in a request with the value computed[m
[31m-for the request.[m
[31m-If a link has a limited lifetime and the time has expired,[m
[31m-the link is considered outdated.[m
[31m-The status of these checks is made available in the[m
[31m-C<$secure_link> variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module provides two alternative operation modes.[m
[31m-The first mode is enabled by the L</secure_link_secret>[m
[31m-directive and is used to check authenticity of requested links[m
[31m-as well as protect resources from unauthorized access.[m
[31m-The second mode (0.8.50) is enabled by the[m
[31m-L</secure_link> and L</secure_link_md5>[m
[31m-directives and is also used to limit lifetime of links.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_secure_link_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 secure_link[m
[31m-[m
[31m-[m
[31m-B<syntax:> secure_link I<I<C<expression>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a string with variables from which the[m
[31m-checksum value and lifetime of a link will be extracted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Variables used in an I<C<expression>> are usually associated[m
[31m-with a request; see example below.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The checksum value extracted from the string is compared with[m
[31m-the MD5 hash value of the expression defined by the[m
[31m-L</secure_link_md5> directive.[m
[31m-If the checksums are different, the C<$secure_link> variable[m
[31m-is set to an empty string.[m
[31m-If the checksums are the same, the link lifetime is checked.[m
[31m-If the link has a limited lifetime and the time has expired,[m
[31m-the C<$secure_link> variable is set to “C<0>”.[m
[31m-Otherwise, it is set to “C<1>”.[m
[31m-The MD5 hash value passed in a request is encoded in[m
[31m-L<base64url|http://tools.ietf.org/html/rfc4648#section-5>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a link has a limited lifetime, the expiration time[m
[31m-is set in seconds since Epoch (Thu, 01 Jan 1970 00:00:00 GMT).[m
[31m-The value is specified in the expression after the MD5 hash,[m
[31m-and is separated by a comma.[m
[31m-The expiration time passed in a request is available through[m
[31m-the C<$secure_link_expires> variable for a use in[m
[31m-the L</secure_link_md5> directive.[m
[31m-If the expiration time is not specified, a link has the unlimited[m
[31m-lifetime.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 secure_link_md5[m
[31m-[m
[31m-[m
[31m-B<syntax:> secure_link_md5 I<I<C<expression>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines an expression for which the MD5 hash value will[m
[31m-be computed and compared with the value passed in a request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The expression should contain the secured part of a link (resource)[m
[31m-and a secret ingredient.[m
[31m-If the link has a limited lifetime,[m
[31m-the expression should also contain C<$secure_link_expires>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To prevent unauthorized access, the expression may contain some[m
[31m-information about the client, such as its address and browser version.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    location /s/ {[m
[31m-        secure_link $arg_md5,$arg_expires;[m
[31m-        secure_link_md5 "$secure_link_expires$uri$remote_addr secret";[m
[31m-    [m
[31m-        if ($secure_link = "") {[m
[31m-            return 403;[m
[31m-        }[m
[31m-    [m
[31m-        if ($secure_link = "0") {[m
[31m-            return 410;[m
[31m-        }[m
[31m-    [m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The[m
[31m-“C<E<sol>sE<sol>link?md5=_e4Nc3iduzkWRm01TBBNYwE<amp>expires=2147483647>”[m
[31m-link[m
[31m-restricts access to “C<E<sol>sE<sol>link>” for the client with the[m
[31m-IP address 127.0.0.1.[m
[31m-The link also has the limited lifetime until January 19, 2038 (GMT).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On UNIX, the I<C<md5>> request argument value can be obtained as:[m
[31m-[m
[31m-    [m
[31m-    echo -n '2147483647/s/link127.0.0.1 secret' | \[m
[31m-        openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 secure_link_secret[m
[31m-[m
[31m-[m
[31m-B<syntax:> secure_link_secret I<I<C<word>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a secret I<C<word>> used to check authenticity[m
[31m-of requested links.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full URI of a requested link looks as follows:[m
[31m-[m
[31m-    [m
[31m-    /<value>prefix</value>/<value>hash</value>/<value>link</value>[m
[31m-[m
[31m-[m
[31m-where I<C<hash>> is a hexadecimal representation of the[m
[31m-MD5 hash computed for the concatenation of the link and secret word,[m
[31m-and I<C<prefix>> is an arbitrary string without slashes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the requested link passes the authenticity check,[m
[31m-the C<$secure_link> variable is set to the link[m
[31m-extracted from the request URI.[m
[31m-Otherwise, the C<$secure_link> variable[m
[31m-is set to an empty string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    location /p/ {[m
[31m-        secure_link_secret secret;[m
[31m-    [m
[31m-        if ($secure_link = "") {[m
[31m-            return 403;[m
[31m-        }[m
[31m-    [m
[31m-        rewrite ^ /secure/$secure_link;[m
[31m-    }[m
[31m-    [m
[31m-    location /secure/ {[m
[31m-        internal;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-A request of “C<E<sol>pE<sol>5e814704a28d9bc1914ff19fa0c4a00aE<sol>link>”[m
[31m-will be internally redirected to[m
[31m-“C<E<sol>secureE<sol>link>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On UNIX, the hash value for this example can be obtained as:[m
[31m-[m
[31m-    [m
[31m-    echo -n 'linksecret' | openssl md5 -hex[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$secure_link>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The status of a link check.[m
[31m-The specific value depends on the selected operation mode.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$secure_link_expires>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The lifetime of a link passed in a request;[m
[31m-intended to be used only in the[m
[31m-L</secure_link_md5> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_session_log_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_session_log_module.pod[m
[1mdeleted file mode 100644[m
[1mindex ffffb0e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_session_log_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_session_log_module - Module ngx_http_session_log_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_session_log_module> module enables logging[m
[31m-sessions (that is, aggregates of multiple HTTP requests) instead of[m
[31m-individual HTTP requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following configuration sets up a session log and maps requests to[m
[31m-sessions according to the request client address and C<User-Agent>[m
[31m-request header field:[m
[31m-[m
[31m-    [m
[31m-        session_log_zone /path/to/log format=combined[m
[31m-                         zone=one:1m timeout=30s[m
[31m-                         md5=$binary_remote_addr$http_user_agent;[m
[31m-    [m
[31m-        location /media/ {[m
[31m-            session_log one;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 session_log_format[m
[31m-[m
[31m-[m
[31m-B<syntax:> session_log_format I<[m
[31m-    I<C<name>>[m
[31m-    I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<combined "...">[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the output format of a log.[m
[31m-The value of the C<$body_bytes_sent> variable is aggregated across[m
[31m-all requests in a session.[m
[31m-The values of all other variables available for logging correspond to the[m
[31m-first request in a session.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 session_log_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> session_log_zone I<[m
[31m-    I<C<path>>[m
[31m-    C<zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<format>=I<C<format>>][m
[31m-    [C<timeout>=I<C<time>>][m
[31m-    [C<id>=I<C<id>>][m
[31m-    [C<md5>=I<C<md5>>][m
[31m->[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path to a log file and configures the shared memory zone that is used[m
[31m-to store currently active sessions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A session is considered active for as long as the time elapsed since[m
[31m-the last request in the session does not exceed the specified[m
[31m-C<timeout> (by default, 30 seconds).[m
[31m-Once a session is no longer active, it is written to the log.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<id> parameter identifies the[m
[31m-session to which a request is mapped.[m
[31m-The C<id> parameter is set to the hexadecimal representation[m
[31m-of an MD5 hash (for example, obtained from a cookie using variables).[m
[31m-If this parameter is not specified or does not represent the valid[m
[31m-MD5 hash, nginx computes the MD5 hash from the value of[m
[31m-the C<md5> parameter and creates a new session using this hash.[m
[31m-Both the C<id> and C<md5> parameters[m
[31m-can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<format> parameter sets the custom session log[m
[31m-format configured by the L</session_log_format> directive.[m
[31m-If C<format> is not specified, the predefined[m
[31m-“C<combined>” format is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 session_log[m
[31m-[m
[31m-[m
[31m-B<syntax:> session_log I<I<C<name>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the use of the specified session log.[m
[31m-The special value C<off> cancels all[m
[31m-C<session_log> directives inherited from the previous[m
[31m-configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_session_log_module> module supports[m
[31m-two embedded variables:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$session_log_id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current session ID;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$session_log_binary_id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current session ID in binary form (16 bytes).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_slice_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_slice_module.pod[m
[1mdeleted file mode 100644[m
[1mindex c46d5b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_slice_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,132 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_slice_module - Module ngx_http_slice_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_slice_module> module (1.9.8) is a filter[m
[31m-that splits a request into subrequests,[m
[31m-each returning a certain range of response.[m
[31m-The filter provides more effective caching of big responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_slice_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        <emphasis>slice</emphasis>             1m;[m
[31m-        proxy_cache       cache;[m
[31m-        proxy_cache_key   $uri$is_args$args<emphasis>$slice_range</emphasis>;[m
[31m-        proxy_set_header  Range <emphasis>$slice_range</emphasis>;[m
[31m-        proxy_cache_valid 200 206 1h;[m
[31m-        proxy_pass        http://localhost:8000;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-In this example,[m
[31m-the response is split into 1-megabyte cacheable slices.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 slice[m
[31m-[m
[31m-[m
[31m-B<syntax:> slice I<C<size>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the slice.[m
[31m-The zero value disables splitting responses into slices.[m
[31m-Note that a too low value may result in excessive memory usage[m
[31m-and a large number of file descriptors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order for a subrequest to return the required range,[m
[31m-the C<$slice_range> variable should be[m
[31m-L<passed|ngx_http_proxy_module> to[m
[31m-the proxied server as the C<Range> request header field.[m
[31m-If[m
[31m-L<caching|ngx_http_proxy_module>[m
[31m-is enabled, C<$slice_range> should be added to the[m
[31m-L<cache key|ngx_http_proxy_module>[m
[31m-and caching of responses with 206 status code should be[m
[31m-L<enabled|ngx_http_proxy_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_slice_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$slice_range>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the current slice range in[m
[31m-L<HTTP[m
[31m-byte range|https://tools.ietf.org/html/rfc7233#section-2.1> format,[m
[31m-for example, C<bytes=0-1048575>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_spdy_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_spdy_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a694191..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_spdy_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,220 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_spdy_module - Module ngx_http_spdy_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_spdy_module> module provides experimental[m
[31m-support for L<SPDY|http://www.chromium.org/spdy/spdy-protocol>.[m
[31m-Currently,[m
[31m-L<draft[m
[31m-3.1|http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1> of SPDY protocol is implemented.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.5.10,[m
[31m-L<draft[m
[31m-2|http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2> of SPDY protocol was implemented.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with[m
[31m-the C<--with-http_spdy_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module was superseded by the[m
[31m-L<ngx_http_v2_module|ngx_http_v2_module> module[m
[31m-in 1.9.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module is experimental, caveat emptor applies.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Current implementation of SPDY protocol does not support “server push”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In versions prior to 1.5.9, responses in SPDY connections could not be[m
[31m-L<rate limited|ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering of a client request body cannot be disabled[m
[31m-regardless of[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>, and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directive values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen 443 ssl spdy;[m
[31m-    [m
[31m-        ssl_certificate server.crt;[m
[31m-        ssl_certificate_key server.key;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Note that in order to accept both[m
[31m-L<HTTPS|ngx_http_ssl_module> and SPDY connections[m
[31m-simultaneously on the same port,[m
[31m-L<OpenSSL|http://www.openssl.org> library used should support[m
[31m-“Next Protocol Negotiation” TLS extension, available since OpenSSL[m
[31m-version 1.0.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 spdy_chunk_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> spdy_chunk_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum size of chunks[m
[31m-into which the response body is[m
[31m-L<sliced|http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Data-frames>.[m
[31m-A too low value results in higher overhead.[m
[31m-A too high value impairs prioritization due to[m
[31m-L<HOL blocking|http://en.wikipedia.org/wiki/Head-of-line_blocking>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 spdy_headers_comp[m
[31m-[m
[31m-[m
[31m-B<syntax:> spdy_headers_comp I<I<C<level>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the header compression I<C<level>> of a response in a range from[m
[31m-1 (fastest, less compression) to 9 (slowest, best compression).[m
[31m-The special value 0 turns off the header compression.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_spdy_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$spdy>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-SPDY protocol version for SPDY connections,[m
[31m-or an empty string otherwise;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$spdy_request_priority>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request priority for SPDY connections,[m
[31m-or an empty string otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_split_clients_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_split_clients_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 79b847d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_split_clients_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_split_clients_module - Module ngx_http_split_clients_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_split_clients_module> module creates[m
[31m-variables suitable for AE<sol>B testing, also known as split testing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        split_clients "${remote_addr}AAA" $variant {[m
[31m-                       0.5%               .one;[m
[31m-                       2.0%               .two;[m
[31m-                       *                  "";[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            location / {[m
[31m-                index index${variant}.html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 split_clients[m
[31m-[m
[31m-[m
[31m-B<syntax:> split_clients I<[m
[31m-    I<C<string>>[m
[31m-    I<C<$variable>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Creates a variable for AE<sol>B testing, for example:[m
[31m-[m
[31m-    [m
[31m-    split_clients "${remote_addr}AAA" $variant {[m
[31m-                   0.5%               .one;[m
[31m-                   2.0%               .two;[m
[31m-                   *                  "";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The value of the original string is hashed using MurmurHash2.[m
[31m-In the example given, hash values from 0 to 21474835 (0.5%)[m
[31m-correspond to the[m
[31m-value C<".one"> of the C<$variant> variable,[m
[31m-hash values from 21474836 to 107374180 (2%) correspond to[m
[31m-the value C<".two">,[m
[31m-and hash values from 107374181 to 4294967295 correspond to[m
[31m-the value C<""> (an empty string).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_ssi_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_ssi_module.pod[m
[1mdeleted file mode 100644[m
[1mindex fe379ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_ssi_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,710 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_ssi_module - Module ngx_http_ssi_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssi_module> module is a filter[m
[31m-that processes SSI (Server Side Includes) commands in responses[m
[31m-passing through it.[m
[31m-Currently, the list of supported SSI commands is incomplete.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        ssi on;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ssi[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables processing of SSI commands in responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_last_modified[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_last_modified I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows preserving the C<Last-Modified> header field[m
[31m-from the original response during SSI processing[m
[31m-to facilitate response caching.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the header field is removed as contents of the response[m
[31m-are modified during processing and may contain dynamically generated elements[m
[31m-or parts that are changed independently of the original response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_min_file_chunk[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_min_file_chunk I<C<size>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the minimum I<C<size>> for parts of a response stored on disk,[m
[31m-starting from which it makes sense to send them using[m
[31m-L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_silent_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_silent_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If enabled, suppresses the output of the[m
[31m-“C<[an error occurred while processing the directive]>”[m
[31m-string if an error occurred during SSI processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables processing of SSI commands in responses with the specified MIME types[m
[31m-in addition to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_value_length[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_value_length I<I<C<length>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<256>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum length of parameter values in SSI commands.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SSI Commands[m
[31m-[m
[31m-[m
[31m-[m
[31m-SSI commands have the following generic format:[m
[31m-[m
[31m-    [m
[31m-    <!--# command parameter1=value1 parameter2=value2 ... -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following commands are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<block>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a block that can be used as a stub[m
[31m-in the C<include> command.[m
[31m-The block can contain other SSI commands.[m
[31m-The command has the following parameter:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-block name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    <!--# block name="one" -->[m
[31m-    stub[m
[31m-    <!--# endblock -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<config>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets some parameters used during SSI processing, namely:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<errmsg>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a string that is output if an error occurs during SSI processing.[m
[31m-By default, the following string is output:[m
[31m-[m
[31m-    [m
[31m-    [an error occurred while processing the directive][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<timefmt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a format string passed to the C<strftime> function[m
[31m-used to output date and time.[m
[31m-By default, the following format is used:[m
[31m-[m
[31m-    [m
[31m-    "%A, %d-%b-%Y %H:%M:%S %Z"[m
[31m-[m
[31m-[m
[31m-The “C<%s>” format is suitable to output time in seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<echo>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Outputs the value of a variable.[m
[31m-The command has the following parameters:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<var>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the variable name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<encoding>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the encoding method.[m
[31m-Possible values include C<none>, C<url>, and[m
[31m-C<entity>.[m
[31m-By default, C<entity> is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<default>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a non-standard parameter that sets a string to be output[m
[31m-if a variable is undefined.[m
[31m-By default, “C<none>” is output.[m
[31m-The command[m
[31m-[m
[31m-    [m
[31m-    <!--# echo var="name" default="<emphasis>no</emphasis>" -->[m
[31m-[m
[31m-[m
[31m-replaces the following sequence of commands:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name" --><!--# echo var="name" --><!--#[m
[31m-           else --><emphasis>no</emphasis><!--# endif -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Performs a conditional inclusion.[m
[31m-The following commands are supported:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="..." -->[m
[31m-    ...[m
[31m-    <!--# elif expr="..." -->[m
[31m-    ...[m
[31m-    <!--# else -->[m
[31m-    ...[m
[31m-    <!--# endif -->[m
[31m-[m
[31m-[m
[31m-Only one level of nesting is currently supported.[m
[31m-The command has the following parameter:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<expr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-expression.[m
[31m-An expression can be:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-variable existence check:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-comparison of a variable with a text:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name = <value>text</value>" -->[m
[31m-    <!--# if expr="$name != <value>text</value>" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-comparison of a variable with a regular expression:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name = /<value>text</value>/" -->[m
[31m-    <!--# if expr="$name != /<value>text</value>/" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a I<C<text>> contains variables,[m
[31m-their values are substituted.[m
[31m-A regular expression can contain positional and named captures[m
[31m-that can later be used through variables, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name = /(.+)@(?P<domain>.+)/" -->[m
[31m-        <!--# echo var="1" -->[m
[31m-        <!--# echo var="domain" -->[m
[31m-    <!--# endif -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<include>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Includes the result of another request into a response.[m
[31m-The command has the following parameters:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<file>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies an included file, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# include file="footer.html" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<virtual>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies an included request, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# include virtual="/remote/body.php?argument=value" -->[m
[31m-[m
[31m-[m
[31m-Several requests specified on one page and processed by proxied or[m
[31m-FastCGIE<sol>uwsgiE<sol>SCGI servers run in parallel.[m
[31m-If sequential processing is desired, the C<wait>[m
[31m-parameter should be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<stub>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a non-standard parameter that names the block whose[m
[31m-content will be output if the included request results in an empty[m
[31m-body or if an error occurs during the request processing, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# block name="one" -->&nbsp;<!--# endblock -->[m
[31m-    <!--# include virtual="/remote/body.php?argument=value" stub="one" -->[m
[31m-[m
[31m-[m
[31m-The replacement block content is processed in the included request context.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<wait>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a non-standard parameter that instructs to wait for a request to fully[m
[31m-complete before continuing with SSI processing, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# include virtual="/remote/body.php?argument=value" wait="yes" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<set>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a non-standard parameter that instructs to write a successful result[m
[31m-of request processing to the specified variable,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# include virtual="/remote/body.php?argument=value" set="one" -->[m
[31m-[m
[31m-[m
[31m-It should be noted that only the results of responses obtained using the[m
[31m-L<ngx_http_proxy_module|ngx_http_proxy_module>,[m
[31m-L<ngx_http_memcached_module|ngx_http_memcached_module>,[m
[31m-L<ngx_http_fastcgi_module|ngx_http_fastcgi_module> (1.5.6),[m
[31m-L<ngx_http_uwsgi_module|ngx_http_uwsgi_module> (1.5.6),[m
[31m-and L<ngx_http_scgi_module|ngx_http_scgi_module> (1.5.6)[m
[31m-modules can be written into variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<set>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a value of a variable.[m
[31m-The command has the following parameters:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<var>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the variable name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<value>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the variable value.[m
[31m-If an assigned value contains variables,[m
[31m-their values are substituted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssi_module> module supports[m
[31m-two embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$date_local>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current time in the local time zone.[m
[31m-The format is set by the C<config> command[m
[31m-with the C<timefmt> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$date_gmt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current time in GMT.[m
[31m-The format is set by the C<config> command[m
[31m-with the C<timefmt> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_ssl_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_ssl_module.pod[m
[1mdeleted file mode 100644[m
[1mindex e9db67d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_ssl_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1300 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_ssl_module - Module ngx_http_ssl_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssl_module> module provides the[m
[31m-necessary support for HTTPS.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_ssl_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires the[m
[31m-L<OpenSSL|http://www.openssl.org> library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-To reduce the processor load it is recommended to[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-set the number of worker processes equal to the number of processors,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-enable keep-alive connections,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-enable the shared session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-disable the built-in session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and possibly increase the session lifetime (by default, 5 minutes):[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    <emphasis>worker_processes auto;</emphasis>[m
[31m-    [m
[31m-    http {[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            listen              443 ssl;[m
[31m-            <emphasis>keepalive_timeout   70;</emphasis>[m
[31m-    [m
[31m-            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-            ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;[m
[31m-            ssl_certificate     /usr/local/nginx/conf/cert.pem;[m
[31m-            ssl_certificate_key /usr/local/nginx/conf/cert.key;[m
[31m-            <emphasis>ssl_session_cache   shared:SSL:10m;</emphasis>[m
[31m-            <emphasis>ssl_session_timeout 10m;</emphasis>[m
[31m-    [m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ssl[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the HTTPS protocol for the given virtual server.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-It is recommended to use the C<ssl> parameter of the[m
[31m-L<ngx_http_core_module> directive instead[m
[31m-of this directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the size of the buffer used for sending data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the buffer size is 16k, which corresponds to minimal[m
[31m-overhead when sending big responses.[m
[31m-To minimize Time To First Byte it may be beneficial to use smaller values,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_buffer_size 4k;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-for the given virtual server.[m
[31m-If intermediate certificates should be specified in addition to a primary[m
[31m-certificate, they should be specified in the same file in the following[m
[31m-order: the primary certificate comes first, then the intermediate certificates.[m
[31m-A secret key in the PEM format may be placed in the same file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be kept in mind that due to the HTTPS protocol limitations[m
[31m-virtual servers should listen on different IP addresses:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen          192.168.1.1:443;[m
[31m-        server_name     one.example.com;[m
[31m-        ssl_certificate /usr/local/nginx/conf/one.example.com.cert;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen          192.168.1.2:443;[m
[31m-        server_name     two.example.com;[m
[31m-        ssl_certificate /usr/local/nginx/conf/two.example.com.cert;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-otherwise[m
[31m-L<the first server’s certificate|configuring_https_servers>[m
[31m-will be issued for the second site.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-for the given virtual server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>> (1.7.9),[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<HIGH:!aNULL:!MD5>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers.[m
[31m-The ciphers are specified in the format understood by the[m
[31m-OpenSSL library, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The previous versions of nginx used[m
[31m-L<different|configuring_https_servers>[m
[31m-ciphers by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_client_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_client_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify client certificates and[m
[31m-OCSP responses if L</ssl_stapling> is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The list of certificates will be sent to clients.[m
[31m-If this is not desired, the L</ssl_trusted_certificate>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-client certificates.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_dhparam[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_dhparam I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with DH parameters for DHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ecdh_curve[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ecdh_curve I<I<C<curve>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<auto>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<curve>> for ECDHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using OpenSSL 1.0.2 or higher,[m
[31m-it is possible to specify multiple curves (1.11.0), for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ecdh_curve prime256v1:secp384r1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<auto> (1.11.0) instructs nginx to use[m
[31m-a list built into the OpenSSL library when using OpenSSL 1.0.2 or higher,[m
[31m-or C<prime256v1> with older versions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.11.0,[m
[31m-the C<prime256v1> curve was used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        ssl_password_file /etc/keys/global.pass;[m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            server_name www1.example.com;[m
[31m-            ssl_certificate_key /etc/keys/first.key;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            server_name www2.example.com;[m
[31m-    [m
[31m-            # named pipe can also be used instead of a file[m
[31m-            ssl_password_file /etc/keys/fifo;[m
[31m-            ssl_certificate_key /etc/keys/second.key;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_prefer_server_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_prefer_server_ciphers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that server ciphers should be preferred over client[m
[31m-ciphers when using the SSLv3 and TLS protocols.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols.[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters work[m
[31m-only when the OpenSSL library of version 1.0.1 or higher is used.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters are[m
[31m-supported starting from versions 1.1.13 and 1.0.12,[m
[31m-so when the OpenSSL version 1.0.1 or higher[m
[31m-is used on older nginx versions, these protocols work, but cannot[m
[31m-be disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_cache I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<none> E<verbar>[m
[31m-    [C<builtin>[:I<C<size>>]][m
[31m-    [C<shared>:I<C<name>>:I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the types and sizes of caches that store session parameters.[m
[31m-A cache can be of any of the following types:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is strictly prohibited:[m
[31m-nginx explicitly tells a client that sessions may not be reused.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is gently disallowed:[m
[31m-nginx tells a client that sessions may be reused, but does not[m
[31m-actually store session parameters in the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<builtin>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache built in OpenSSL; used by one worker process only.[m
[31m-The cache size is specified in sessions.[m
[31m-If size is not given, it is equal to 20480 sessions.[m
[31m-Use of the built-in cache can cause memory fragmentation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<shared>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache shared between all worker processes.[m
[31m-The cache size is specified in bytes; one megabyte can store[m
[31m-about 4000 sessions.[m
[31m-Each shared cache should have an arbitrary name.[m
[31m-A cache with the same name can be used in several virtual servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Both cache types can be used simultaneously, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_cache builtin:1000 shared:SSL:10m;[m
[31m-[m
[31m-[m
[31m-but using only shared cache without the built-in cache should[m
[31m-be more efficient.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_ticket_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_ticket_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<file>> with the secret key used to encrypt[m
[31m-and decrypt TLS session tickets.[m
[31m-The directive is necessary if the same key has to be shared between[m
[31m-multiple servers.[m
[31m-By default, a randomly generated key is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several keys are specified, only the first key is[m
[31m-used to encrypt TLS session tickets.[m
[31m-This allows configuring key rotation, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_ticket_key current.key;[m
[31m-    ssl_session_ticket_key previous.key;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<file>> must contain 48 bytes of random data and can[m
[31m-be created using the following command:[m
[31m-[m
[31m-    [m
[31m-    openssl rand 48 > ticket.key[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_tickets[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_tickets I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables session resumption through[m
[31m-L<TLS session tickets|http://tools.ietf.org/html/rfc5077>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a time during which a client may reuse the[m
[31m-session parameters stored in a cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_stapling[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_stapling I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables[m
[31m-L<stapling[m
[31m-of OCSP responses|http://tools.ietf.org/html/rfc4366#section-3.6> by the server.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    ssl_stapling on;[m
[31m-    resolver 192.0.2.1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the OCSP stapling to work, the certificate of the server certificate[m
[31m-issuer should be known.[m
[31m-If the L</ssl_certificate> file does[m
[31m-not contain intermediate certificates,[m
[31m-the certificate of the server certificate issuer should be[m
[31m-present in the[m
[31m-L</ssl_trusted_certificate> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For a resolution of the OCSP responder hostname,[m
[31m-the L<ngx_http_core_module> directive[m
[31m-should also be specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_stapling_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_stapling_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When set, the stapled OCSP response will be taken from the[m
[31m-specified I<C<file>> instead of querying[m
[31m-the OCSP responder specified in the server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The file should be in the DER format as produced by the[m
[31m-“C<openssl ocsp>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_stapling_responder[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_stapling_responder I<I<C<url>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Overrides the URL of the OCSP responder specified in the[m
[31m-“L<Authority[m
[31m-Information Access|http://tools.ietf.org/html/rfc5280#section-4.2.2.1>” certificate extension.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Only “C<http:E<sol>E<sol>>” OCSP responders are supported:[m
[31m-[m
[31m-    [m
[31m-    ssl_stapling_responder http://ocsp.example.com/;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_stapling_verify[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_stapling_verify I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables verification of OCSP responses by the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For verification to work, the certificate of the server certificate[m
[31m-issuer, the root certificate, and all intermediate certificates[m
[31m-should be configured as trusted using the[m
[31m-L</ssl_trusted_certificate> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify client certificates and[m
[31m-OCSP responses if L</ssl_stapling> is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In contrast to the certificate set by L</ssl_client_certificate>,[m
[31m-the list of these certificates will not be sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_verify_client[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_verify_client I<[m
[31m-    C<on> E<verbar> C<off> E<verbar>[m
[31m-    C<optional> E<verbar> C<optional_no_ca>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables verification of client certificates.[m
[31m-The verification result is stored in the[m
[31m-C<$ssl_client_verify> variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<optional> parameter (0.8.7+) requests the client[m
[31m-certificate and verifies it if the certificate is present.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<optional_no_ca> parameter (1.3.8, 1.2.5)[m
[31m-requests the client[m
[31m-certificate but does not require it to be signed by a trusted CA certificate.[m
[31m-This is intended for the use in cases when a service that is external to nginx[m
[31m-performs the actual certificate verification.[m
[31m-The contents of the certificate is accessible through the[m
[31m-C<$ssl_client_cert> variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the client certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Error Processing[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssl_module> module supports several[m
[31m-non-standard error codes that can be used for redirects using the[m
[31m-L<ngx_http_core_module> directive:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<495>[m
[31m-an error has occurred during the client certificate verification;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<496>[m
[31m-a client has not presented the required certificate;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<497>[m
[31m-a regular request has been sent to the HTTPS port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The redirection happens after the request is fully parsed and[m
[31m-the variables, such as C<$request_uri>,[m
[31m-C<$uri>, C<$args> and others, are available.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssl_module> module supports[m
[31m-several embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_cipher>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the string of ciphers used[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_cert>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client certificate in the PEM format[m
[31m-for an established SSL connection, with each line except the first[m
[31m-prepended with the tab character;[m
[31m-this is intended for the use in the[m
[31m-L<ngx_http_proxy_module> directive;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_fingerprint>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the SHA1 fingerprint of the client certificate[m
[31m-for an established SSL connection (1.7.1);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_raw_cert>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client certificate in the PEM format[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_serial>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the serial number of the client certificate[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_s_dn>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the “subject DN” string of the client certificate[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_i_dn>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the “issuer DN” string of the client certificate[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_verify>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the result of client certificate verification:[m
[31m-“C<SUCCESS>”, “C<FAILED>”, and[m
[31m-“C<NONE>” if a certificate was not present;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_protocol>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the protocol of an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_server_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the server name requested through[m
[31m-L<SNI|http://en.wikipedia.org/wiki/Server_Name_Indication>[m
[31m-(1.7.0);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_session_id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the session identifier of an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_session_reused>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns “C<r>” if an SSL session was reused,[m
[31m-or “C<.>” otherwise (1.5.11).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_status_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_status_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 1924e3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_status_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1598 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_status_module - Module ngx_http_status_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_status_module> module provides[m
[31m-access to various status information.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        upstream <emphasis>backend</emphasis> {[m
[31m-            <emphasis>zone</emphasis> http_backend 64k;[m
[31m-    [m
[31m-            server backend1.example.com weight=5;[m
[31m-            server backend2.example.com;[m
[31m-        }[m
[31m-    [m
[31m-        proxy_cache_path /data/nginx/cache_backend keys_zone=<emphasis>cache_backend</emphasis>:10m;[m
[31m-    [m
[31m-        server {[m
[31m-            server_name backend.example.com;[m
[31m-    [m
[31m-            location / {[m
[31m-                proxy_pass  http://backend;[m
[31m-                proxy_cache cache_backend;[m
[31m-    [m
[31m-                health_check;[m
[31m-            }[m
[31m-    [m
[31m-            <emphasis>status_zone server_backend;</emphasis>[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 127.0.0.1;[m
[31m-    [m
[31m-            location /upstream_conf {[m
[31m-                upstream_conf;[m
[31m-            }[m
[31m-    [m
[31m-            location /status {[m
[31m-                status;[m
[31m-            }[m
[31m-    [m
[31m-            location = /status.html {[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-    stream {[m
[31m-        upstream <emphasis>backend</emphasis> {[m
[31m-            <emphasis>zone</emphasis> stream_backend 64k;[m
[31m-    [m
[31m-            server backend1.example.com:12345 weight=5;[m
[31m-            server backend2.example.com:12345;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen      127.0.0.1:12345;[m
[31m-            proxy_pass  backend;[m
[31m-            <emphasis>status_zone server_backend;</emphasis>[m
[31m-            health_check;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Examples of status requests with this configuration:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/status[m
[31m-    http://127.0.0.1/status/nginx_version[m
[31m-    http://127.0.0.1/status/caches/cache_backend[m
[31m-    http://127.0.0.1/status/upstreams[m
[31m-    http://127.0.0.1/status/upstreams/backend[m
[31m-    http://127.0.0.1/status/upstreams/backend/peers/1[m
[31m-    http://127.0.0.1/status/upstreams/backend/peers/1/weight[m
[31m-    http://127.0.0.1/status/stream[m
[31m-    http://127.0.0.1/status/stream/upstreams[m
[31m-    http://127.0.0.1/status/stream/upstreams/backend[m
[31m-    http://127.0.0.1/status/stream/upstreams/backend/peers/1[m
[31m-    http://127.0.0.1/status/stream/upstreams/backend/peers/1/weight[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The simple monitoring page is shipped with this distribution,[m
[31m-accessible as “C<E<sol>status.html>” in the default configuration.[m
[31m-It requires the locations “C<E<sol>status>” and[m
[31m-“C<E<sol>status.html>” to be configured as shown above.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 status[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The status information will be accessible from the surrounding location.[m
[31m-Access to this location should be[m
[31m-L<limited|ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 status_format[m
[31m-[m
[31m-[m
[31m-B<syntax:> status_format I<C<json>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> status_format I<C<jsonp> [I<C<callback>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<json>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, status information is output in the JSON format.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Alternatively, data may be output as JSONP.[m
[31m-The I<C<callback>> parameter specifies the name of a callback function.[m
[31m-The value can contain variables.[m
[31m-If parameter is omitted, or the computed value is an empty string,[m
[31m-then “C<ngx_status_jsonp_callback>” is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 status_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> status_zone I<I<C<zone>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables collection of virtual[m
[31m-L<http|ngx_http_core_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_core_module>[m
[31m-(1.7.11) server status information in the specified I<C<zone>>.[m
[31m-Several servers may share the same zone.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Data[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following status information is provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<version>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Version of the provided data set.[m
[31m-The current version is 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<nginx_version>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Version of nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<address>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The address of the server that accepted status request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<generation>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of configuration[m
[31m-L<reloads|control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<load_timestamp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Time of the last reload of configuration, in milliseconds since Epoch.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<timestamp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Current time in milliseconds since Epoch.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<pid>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The ID of the worker process that handled status request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<processes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<respawned>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of abnormally terminated and respawned[m
[31m-child processes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<connections>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<accepted>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of accepted client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<dropped>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of dropped client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<active>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of active client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<idle>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of idle client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<ssl>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<handshakes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of successful SSL handshakes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<handshakes_failed>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of failed SSL handshakes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<session_reuses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of session reuses during SSL handshake.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<total>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of client requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<current>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of client requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server_zones>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each L</status_zone>:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<processing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of[m
[31m-client requests that are currently being processed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-client requests received from clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<total>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-responses sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<1xx>,[m
[31m-C<2xx>,[m
[31m-C<3xx>,[m
[31m-C<4xx>,[m
[31m-C<5xx>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of responses with status codes 1xx, 2xx, 3xx, 4xx, and 5xx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<discarded>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of requests completed without sending a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<received>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes received from clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<upstreams>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each[m
[31m-L<dynamically[m
[31m-configurable|ngx_http_upstream_module>[m
[31m-L<group|ngx_http_upstream_module>,[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<peers>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each[m
[31m-L<ngx_http_upstream_module>,[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The ID of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-An[m
[31m-L<address|ngx_http_upstream_module>[m
[31m-of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<backup>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A boolean value indicating whether the server is a[m
[31m-L<ngx_http_upstream_module>[m
[31m-server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<weight>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Weight|ngx_http_upstream_module>[m
[31m-of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<state>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Current state, which may be one of[m
[31m-“C<up>”,[m
[31m-“C<draining>”,[m
[31m-“C<down>”,[m
[31m-“C<unavail>”,[m
[31m-or[m
[31m-“C<unhealthy>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<active>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of active connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<max_conns>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The L<ngx_http_upstream_module> limit[m
[31m-for the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-client requests forwarded to this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<total>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-responses obtained from this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<1xx>,[m
[31m-C<2xx>,[m
[31m-C<3xx>,[m
[31m-C<4xx>,[m
[31m-C<5xx>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of responses with status codes 1xx, 2xx, 3xx, 4xx, and 5xx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes sent to this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<received>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes received from this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<fails>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-unsuccessful attempts to communicate with the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<unavail>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-How many times[m
[31m-the server became unavailable for client requests[m
[31m-(state “C<unavail>”)[m
[31m-due to the number of unsuccessful attempts reaching the[m
[31m-L<ngx_http_upstream_module>[m
[31m-threshold.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<health_checks>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<checks>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-L<health check|ngx_http_upstream_module>[m
[31m-requests made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<fails>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of failed health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<unhealthy>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-How many times[m
[31m-the server became unhealthy (state “C<unhealthy>”).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<last_passed>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Boolean indicating[m
[31m-if the last health check request was successful and passed[m
[31m-L<tests|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<downtime>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Total time[m
[31m-the server was in the “C<unavail>”[m
[31m-and “C<unhealthy>” states.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<downstart>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The time (in milliseconds since Epoch)[m
[31m-when the server became[m
[31m-“C<unavail>”[m
[31m-or “C<unhealthy>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<selected>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The time (in milliseconds since Epoch)[m
[31m-when the server was last selected to process a request (1.7.5).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to get the[m
[31m-L<response[m
[31m-header|ngx_http_upstream_module> from the server (1.7.10).[m
[31m-The field is available when using the[m
[31m-L<ngx_http_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<response_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to get the[m
[31m-L<full[m
[31m-response|ngx_http_upstream_module> from the server (1.7.10).[m
[31m-The field is available when using the[m
[31m-L<ngx_http_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<keepalive>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of[m
[31m-idle L<ngx_http_upstream_module> connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<queue>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the requests L<ngx_http_upstream_module>,[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of requests in the queue.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<max_size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The maximum number of requests that can be in the queue at the same time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<overflows>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of requests rejected due to the queue overflow.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<caches>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each cache (configured by[m
[31m-L<ngx_http_proxy_module> and the likes):[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current size of the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<max_size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The limit on the maximum size of the cache specified in the configuration.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<cold>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A boolean value indicating whether the “cache loader” process is still loading[m
[31m-data from disk into the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<hit>,[m
[31m-    C<stale>,[m
[31m-    C<updating>,[m
[31m-    C<revalidated>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of responses read from the cache (hits, or stale responses[m
[31m-due to L<ngx_http_proxy_module>[m
[31m-and the likes).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<bytes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes read from the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<miss>,[m
[31m-    C<expired>,[m
[31m-    C<bypass>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of responses not taken from the cache (misses, expires, or[m
[31m-bypasses due to[m
[31m-L<ngx_http_proxy_module>[m
[31m-and the likes).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<bytes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes read from the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses_written>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of responses written to the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<bytes_written>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes written to the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<server_zones>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each L</status_zone>:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<processing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of[m
[31m-client connections that are currently being processed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<connections>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-connections accepted from clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<received>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes received from clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<upstreams>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each[m
[31m-L<dynamically[m
[31m-configurable|ngx_stream_upstream_module>[m
[31m-L<group|ngx_stream_upstream_module>,[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<peers>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each[m
[31m-L<ngx_stream_upstream_module>[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The ID of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-An[m
[31m-L<address|ngx_stream_upstream_module>[m
[31m-of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<backup>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A boolean value indicating whether the server is a[m
[31m-L<ngx_stream_upstream_module>[m
[31m-server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<weight>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Weight|ngx_stream_upstream_module>[m
[31m-of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<state>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Current state, which may be one of[m
[31m-“C<up>”,[m
[31m-“C<down>”,[m
[31m-“C<unavail>”,[m
[31m-or[m
[31m-“C<unhealthy>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<active>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<connections>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-client connections forwarded to this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<connect_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to connect to the upstream server.[m
[31m-The field is available when using the[m
[31m-L<ngx_stream_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<first_byte_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to receive the first byte of data.[m
[31m-The field is available when using the[m
[31m-L<ngx_stream_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<response_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to receive the last byte of data.[m
[31m-The field is available when using the[m
[31m-L<ngx_stream_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes sent to this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<received>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes received from this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<fails>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-unsuccessful attempts to communicate with the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<unavail>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-How many times[m
[31m-the server became unavailable for client connections[m
[31m-(state “C<unavail>”)[m
[31m-due to the number of unsuccessful attempts reaching the[m
[31m-L<ngx_stream_upstream_module>[m
[31m-threshold.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<health_checks>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<checks>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-L<health check|ngx_stream_upstream_module>[m
[31m-requests made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<fails>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of failed health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<unhealthy>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-How many times[m
[31m-the server became unhealthy (state “C<unhealthy>”).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<last_passed>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Boolean indicating[m
[31m-if the last health check request was successful and passed[m
[31m-L<tests|ngx_stream_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<downtime>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Total time[m
[31m-the server was in the “C<unavail>”[m
[31m-and “C<unhealthy>” states.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<downstart>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The time (in milliseconds since Epoch)[m
[31m-when the server became[m
[31m-“C<unavail>”[m
[31m-or “C<unhealthy>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<selected>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The time (in milliseconds since Epoch)[m
[31m-when the server was last selected to process a connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L</ssl> status data[m
[31m-were added in L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</discarded> field in[m
[31m-L</server_zones>[m
[31m-was added in L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L</queue> status data[m
[31m-were added in L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</pid> field[m
[31m-was added in L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The list of servers in L</upstreams>[m
[31m-was moved into L</peers> in[m
[31m-L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<keepalive> field of an upstream server[m
[31m-was removed in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The stream status data[m
[31m-were added in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</generation> field[m
[31m-was added in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</respawned> field in[m
[31m-L</processes>[m
[31m-was added in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</header_time> and L</response_time> fields in[m
[31m-L</upstreams>[m
[31m-were added in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</selected> field in[m
[31m-L</upstreams>[m
[31m-was added in L</version> 4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The draining state in[m
[31m-L</upstreams>[m
[31m-was added in L</version> 4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</id> and L</max_conns> fields in[m
[31m-L</upstreams>[m
[31m-were added in L</version> 3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<revalidated> field in[m
[31m-L</caches>[m
[31m-was added in L</version> 3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L</server_zones>, L</caches>,[m
[31m-and L</load_timestamp> status data[m
[31m-were added in L</version> 2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_stub_status_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_stub_status_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 8ada5a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_stub_status_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,230 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_stub_status_module - Module ngx_http_stub_status_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_stub_status_module> module provides[m
[31m-access to basic status information.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_stub_status_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /basic_status {[m
[31m-        stub_status;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This configuration creates a simple web page[m
[31m-with basic status data which may look like as follows:[m
[31m-[m
[31m-    [m
[31m-    Active connections: 291 [m
[31m-    server accepts handled requests[m
[31m-     16630948 16630948 31070465 [m
[31m-    Reading: 6 Writing: 179 Waiting: 106 [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 stub_status[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The basic status information will be accessible from the surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In versions prior to 1.7.5,[m
[31m-the directive syntax required an arbitrary argument, for example,[m
[31m-“C<stub_status on>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Data[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following status information is provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<Active connections>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of active client connections[m
[31m-including C<Waiting> connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<accepts>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of accepted client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<handled>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of handled connections.[m
[31m-Generally, the parameter value is the same as C<accepts>[m
[31m-unless some resource limits have been reached[m
[31m-(for example, the[m
[31m-L<ngx_core_module> limit).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of client requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<Reading>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of connections where nginx is reading the request header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<Writing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of connections[m
[31m-where nginx is writing the response back to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<Waiting>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of idle client connections waiting for a request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_stub_status_module> module[m
[31m-supports the following embedded variables (1.3.14):[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connections_active>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as the C<Active connections> value;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connections_reading>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as the C<Reading> value;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connections_writing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as the C<Writing> value;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connections_waiting>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as the C<Waiting> value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_sub_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_sub_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 4f240d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_sub_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,180 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_sub_module - Module ngx_http_sub_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_sub_module> module is a filter[m
[31m-that modifies a response by replacing one specified string by another.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_sub_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        sub_filter '<a href="http://127.0.0.1:8080/'  '<a href="https://$host/';[m
[31m-        sub_filter '<img src="http://127.0.0.1:8080/' '<img src="https://$host/';[m
[31m-        sub_filter_once on;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 sub_filter[m
[31m-[m
[31m-[m
[31m-B<syntax:> sub_filter I<I<C<string>> I<C<replacement>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a string to replace and a replacement string.[m
[31m-The string to replace is matched ignoring the case.[m
[31m-The string to replace (1.9.4) and replacement string can contain variables.[m
[31m-Several C<sub_filter> directives[m
[31m-can be specified on one configuration level (1.9.4).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sub_filter_last_modified[m
[31m-[m
[31m-[m
[31m-B<syntax:> sub_filter_last_modified I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows preserving the C<Last-Modified> header field[m
[31m-from the original response during replacement[m
[31m-to facilitate response caching.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the header field is removed as contents of the response[m
[31m-are modified during processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sub_filter_once[m
[31m-[m
[31m-[m
[31m-B<syntax:> sub_filter_once I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether to look for each string to replace[m
[31m-once or repeatedly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sub_filter_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> sub_filter_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables string replacement in responses with the specified MIME types[m
[31m-in addition to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_upstream_conf_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_upstream_conf_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 63ebbd1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_upstream_conf_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,494 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_upstream_conf_module - Module ngx_http_upstream_conf_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_upstream_conf_module> module[m
[31m-allows configuring upstream server groups on-the-fly[m
[31m-via a simple HTTP interface without the need of restarting nginx.[m
[31m-The[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-server group must reside in the shared memory.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        zone upstream_backend 64k;[m
[31m-    [m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        location /upstream_conf {[m
[31m-            <emphasis>upstream_conf</emphasis>;[m
[31m-            allow 127.0.0.1;[m
[31m-            deny all;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 upstream_conf[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on the HTTP interface of upstream configuration in the surrounding[m
[31m-location.[m
[31m-Access to this location should be[m
[31m-L<limited|ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configuration commands can be used to:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-view the group configuration;[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-view, modify, or remove a server;[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-add a new server.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Since addresses in a group are not required to be unique, specific[m
[31m-servers in a group are referenced by their IDs.[m
[31m-IDs are assigned automatically and shown when adding a new server[m
[31m-or viewing the group configuration.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A configuration command consists of parameters passed as request arguments,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following parameters are supported:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<stream=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Selects a[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server group.[m
[31m-Without this parameter, selects an[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-upstream server group.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<upstream=>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Selects a group to work with.[m
[31m-This parameter is mandatory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<id=>I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Selects a server for viewing, modifying, or removing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<remove=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Removes a server from the group.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<add=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds a new server to the group.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backup=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Required to add a backup server.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.7.2, C<backup=>[m
[31m-was also required to view, modify, or remove existing backup servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<server=>I<C<address>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<address>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-When adding a server, it is possible to specify it as a domain name.[m
[31m-In this case, changes of the IP addresses that correspond to a domain name[m
[31m-will be monitored and automatically applied to the upstream[m
[31m-configuration without the need of restarting nginx (1.7.2).[m
[31m-This requires the “C<resolver>” directive in the[m
[31m-L<http|ngx_http_core_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_core_module>[m
[31m-block.[m
[31m-See also the “C<resolve>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<service=>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<service>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server (1.9.13).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<weight=>I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<weight>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_conns=>I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<max_conns>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_fails=>I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<max_fails>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fail_timeout=>I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<fail_timeout>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<slow_start=>I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<slow_start>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<down=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<down>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<drain=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Puts the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-upstream server in the “draining” mode (1.7.5).[m
[31m-In this mode, only requests of the[m
[31m-L<bound|ngx_http_upstream_module> to the server[m
[31m-will be proxied to it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<up=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The opposite of the “C<down>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<route=>I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<route>” parameter of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first three parameters select an object.[m
[31m-This can be either the whole http or stream upstream server group,[m
[31m-or a specific server.[m
[31m-Without other parameters, the configuration of the selected[m
[31m-group or server is shown.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, to view the configuration of the whole group, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend[m
[31m-[m
[31m-[m
[31m-[m
[31m-To view the configuration of a specific server, also specify its ID:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend&id=42[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To add a new server,[m
[31m-specify its address in the “C<server=>” parameter.[m
[31m-Without other parameters specified, a server will be added with other[m
[31m-parameters set to their default values (see the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-“C<server>” directive).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, to add a new primary server, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?add=&upstream=backend&server=127.0.0.1:8080[m
[31m-[m
[31m-[m
[31m-[m
[31m-To add a new backup server, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?add=&upstream=backend&backup=&server=127.0.0.1:8080[m
[31m-[m
[31m-[m
[31m-[m
[31m-To add a new primary server,[m
[31m-set its parameters to non-default values[m
[31m-and mark it as “C<down>”, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?add=&upstream=backend&server=127.0.0.1:8080&weight=2&down=[m
[31m-[m
[31m-[m
[31m-[m
[31m-To remove a server, specify its ID:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?remove=&upstream=backend&id=42[m
[31m-[m
[31m-[m
[31m-[m
[31m-To mark an existing server as “C<down>”, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend&id=42&down=[m
[31m-[m
[31m-[m
[31m-[m
[31m-To modify the address of an existing server, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend&id=42&server=192.0.2.3:8123[m
[31m-[m
[31m-[m
[31m-[m
[31m-To modify other parameters of an existing server, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend&id=42&max_fails=3&weight=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-The above examples are for an[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-upstream server group.[m
[31m-Similar examples for a[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server group require the “C<stream=>” parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_upstream_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_upstream_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 0f92e08..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_upstream_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1940 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_upstream_module - Module ngx_http_upstream_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_upstream_module> module[m
[31m-is used to define groups of servers that can be referenced[m
[31m-by the L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-L<ngx_http_scgi_module>, and[m
[31m-L<ngx_http_memcached_module> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    upstream <emphasis>backend</emphasis> {[m
[31m-        server backend1.example.com       weight=5;[m
[31m-        server backend2.example.com:8080;[m
[31m-        server unix:/tmp/backend3;[m
[31m-    [m
[31m-        server backup1.example.com:8080   backup;[m
[31m-        server backup2.example.com:8080   backup;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            proxy_pass http://<emphasis>backend</emphasis>;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Dynamically configurable group,[m
[31m-available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-    [m
[31m-    resolver 10.0.0.1;[m
[31m-    [m
[31m-    upstream <emphasis>dynamic</emphasis> {[m
[31m-        zone upstream_dynamic 64k;[m
[31m-    [m
[31m-        server backend1.example.com      weight=5;[m
[31m-        server backend2.example.com:8080 fail_timeout=5s slow_start=30s;[m
[31m-        server 192.0.2.1                 max_fails=3;[m
[31m-        server backend3.example.com      resolve;[m
[31m-        server backend4.example.com      service=http resolve;[m
[31m-    [m
[31m-        server backup1.example.com:8080  backup;[m
[31m-        server backup2.example.com:8080  backup;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            proxy_pass http://<emphasis>dynamic</emphasis>;[m
[31m-            health_check;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> upstream I<I<C<name>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a group of servers.[m
[31m-Servers can listen on different ports.[m
[31m-In addition, servers listening on TCP and UNIX-domain sockets[m
[31m-can be mixed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        server backend1.example.com weight=5;[m
[31m-        server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;[m
[31m-        server unix:/tmp/backend3;[m
[31m-    [m
[31m-        server backup1.example.com  backup;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, requests are distributed between the servers using a[m
[31m-weighted round-robin balancing method.[m
[31m-In the above example, each 7 requests will be distributed as follows:[m
[31m-5 requests go to C<backend1.example.com>[m
[31m-and one request to each of the second and third servers.[m
[31m-If an error occurs during communication with a server, the request will[m
[31m-be passed to the next server, and so on until all of the functioning[m
[31m-servers will be tried.[m
[31m-If a successful response could not be obtained from any of the servers,[m
[31m-the client will receive the result of the communication with the last server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-B<syntax:> server I<I<C<address>> [I<C<parameters>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<address>> and other I<C<parameters>>[m
[31m-of a server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-with an optional port, or as a UNIX-domain socket path[m
[31m-specified after the “C<unix:>” prefix.[m
[31m-If a port is not specified, the port 80 is used.[m
[31m-A domain name that resolves to several IP addresses defines[m
[31m-multiple servers at once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following parameters can be defined:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<weight>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the weight of the server, by default, 1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_fails>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of unsuccessful attempts to communicate with the server[m
[31m-that should happen in the duration set by the C<fail_timeout>[m
[31m-parameter to consider the server unavailable for a duration also set by the[m
[31m-C<fail_timeout> parameter.[m
[31m-By default, the number of unsuccessful attempts is set to 1.[m
[31m-The zero value disables the accounting of attempts.[m
[31m-What is considered an unsuccessful attempt is defined by the[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-L<ngx_http_scgi_module>, and[m
[31m-L<ngx_http_memcached_module>[m
[31m-directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fail_timeout>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the time during which the specified number of unsuccessful attempts to[m
[31m-communicate with the server should happen to consider the server unavailable;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and the period of time the server will be considered unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-By default, the parameter is set to 10 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backup>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-marks the server as a backup server.[m
[31m-It will be passed requests when the primary servers are unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<down>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-marks the server as permanently unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_conns>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-limits the maximum I<C<number>> of simultaneous active[m
[31m-connections to the proxied server (1.5.9).[m
[31m-Default value is zero, meaning there is no limit.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-When L</keepalive> connections and multiple[m
[31m-L<workers|ngx_core_module>[m
[31m-are enabled,[m
[31m-the total number of connections to the proxied server[m
[31m-may exceed the C<max_conns> value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<resolve>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-monitors changes of the IP addresses[m
[31m-that correspond to a domain name of the server,[m
[31m-and automatically modifies the upstream configuration[m
[31m-without the need of restarting nginx (1.5.12).[m
[31m-The server group must reside in the shared memory.[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-the L<ngx_http_core_module> directive[m
[31m-must be specified in the[m
[31m-L<ngx_http_core_module> block.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        resolver 10.0.0.1;[m
[31m-    [m
[31m-        upstream u {[m
[31m-            zone ...;[m
[31m-            ...[m
[31m-            server example.com resolve;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<route>=I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the server route name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<service>=I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables resolving of DNS[m
[31m-L<SRV|https://tools.ietf.org/html/rfc2782>[m
[31m-records and sets the service I<C<name>> (1.9.13).[m
[31m-In order for this parameter to work, it is necessary to specify[m
[31m-the L</resolve> parameter for the server[m
[31m-and specify a hostname without a port number.[m
[31m-[m
[31m-[m
[31m-If the service name does not contain a dot (“C<.>”), then[m
[31m-the L<RFC|https://tools.ietf.org/html/rfc2782>-compliant name[m
[31m-is constructed[m
[31m-and the TCP protocol is added to the service prefix.[m
[31m-For example, to look up the[m
[31m-C<_http._tcp.backend.example.com> SRV record,[m
[31m-it is necessary to specify the directive:[m
[31m-[m
[31m-    [m
[31m-    server backend.example.com service=http resolve;[m
[31m-[m
[31m-[m
[31m-If the service name contains one or more dots, then the name is constructed[m
[31m-by joining the service prefix and the server name.[m
[31m-For example, to look up the C<_http._tcp.backend.example.com>[m
[31m-and C<server1.backend.example.com> SRV records,[m
[31m-it is necessary to specify the directives:[m
[31m-[m
[31m-    [m
[31m-    server backend.example.com service=_http._tcp resolve;[m
[31m-    server example.com service=server1.backend resolve;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Highest-priority SRV records[m
[31m-(records with the same lowest-number priority value)[m
[31m-are resolved as primary servers,[m
[31m-the rest of SRV records are resolved as backup servers.[m
[31m-If the L</backup> parameter is specified for the server,[m
[31m-high-priority SRV records are resolved as backup servers,[m
[31m-the rest of SRV records are ignored.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<slow_start>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the I<C<time>> during which the server will recover its weight[m
[31m-from zero to a nominal value, when unhealthy server becomes[m
[31m-healthy,[m
[31m-or when the server becomes available after a period of time[m
[31m-it was considered unavailable.[m
[31m-Default value is zero, i.e. slow start is disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-If there is only a single server in a group, C<max_fails>,[m
[31m-C<fail_timeout> and C<slow_start> parameters[m
[31m-are ignored, and such a server will never be considered unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> zone I<I<C<name>> [I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<name>> and I<C<size>> of the shared[m
[31m-memory zone that keeps the group’s configuration and run-time state that are[m
[31m-shared between worker processes.[m
[31m-Several groups may share the same zone.[m
[31m-In this case, it is enough to specify the I<C<size>> only once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-as part of our commercial subscription,[m
[31m-such groups allow changing the group membership[m
[31m-or modifying the settings of a particular server[m
[31m-without the need of restarting nginx.[m
[31m-The configuration is accessible via a special location[m
[31m-handled by[m
[31m-L<ngx_http_upstream_conf_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 state[m
[31m-[m
[31m-[m
[31m-B<syntax:> state I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> that keeps the state[m
[31m-of the dynamically configurable group.[m
[31m-The state is currently limited to the list of servers with their parameters.[m
[31m-The file is read when parsing the configuration and is updated each time[m
[31m-the upstream configuration is[m
[31m-L<changed|ngx_http_upstream_conf_module>.[m
[31m-Changing the file content directly should be avoided.[m
[31m-The directive cannot be used[m
[31m-along with the L</server> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Changes made during[m
[31m-L<configuration reload|control>[m
[31m-or L<binary upgrade|control>[m
[31m-can be lost.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hash[m
[31m-[m
[31m-[m
[31m-B<syntax:> hash I<I<C<key>> [C<consistent>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a load balancing method for a server group[m
[31m-where the client-server mapping is based on the hashed I<C<key>> value.[m
[31m-The I<C<key>> can contain text, variables, and their combinations.[m
[31m-Note that adding or removing a server from the group[m
[31m-may result in remapping most of the keys to different servers.[m
[31m-The method is compatible with the[m
[31m-L<Cache::Memcached|http://search.cpan.org/perldoc?Cache%3A%3AMemcached>[m
[31m-Perl library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<consistent> parameter is specified[m
[31m-the L<ketama|http://www.last.fm/user/RJ/journal/2007/04/10/392555/>[m
[31m-consistent hashing method will be used instead.[m
[31m-The method ensures that only a few keys[m
[31m-will be remapped to different servers[m
[31m-when a server is added to or removed from the group.[m
[31m-This helps to achieve a higher cache hit ratio for caching servers.[m
[31m-The method is compatible with the[m
[31m-L<Cache::Memcached::Fast|http://search.cpan.org/perldoc?Cache%3A%3AMemcached%3A%3AFast>[m
[31m-Perl library with the I<C<ketama_points>> parameter set to 160.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ip_hash[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a group should use a load balancing method where requests[m
[31m-are distributed between servers based on client IP addresses.[m
[31m-The first three octets of the client IPv4 address, or the entire IPv6 address,[m
[31m-are used as a hashing key.[m
[31m-The method ensures that requests from the same client will always be[m
[31m-passed to the same server except when this server is unavailable.[m
[31m-In the latter case client requests will be passed to another server.[m
[31m-Most probably, it will always be the same server as well.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-IPv6 addresses are supported starting from versions 1.3.2 and 1.2.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If one of the servers needs to be temporarily removed, it should[m
[31m-be marked with the C<down> parameter in[m
[31m-order to preserve the current hashing of client IP addresses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        ip_hash;[m
[31m-    [m
[31m-        server backend1.example.com;[m
[31m-        server backend2.example.com;[m
[31m-        server backend3.example.com <emphasis>down</emphasis>;[m
[31m-        server backend4.example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Until versions 1.3.1 and 1.2.2, it was not possible to specify a weight for[m
[31m-servers using the C<ip_hash> load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 keepalive[m
[31m-[m
[31m-[m
[31m-B<syntax:> keepalive I<I<C<connections>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Activates the cache for connections to upstream servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<connections>> parameter sets the maximum number of[m
[31m-idle keepalive connections to upstream servers that are preserved in[m
[31m-the cache of each worker process.[m
[31m-When this number is exceeded, the least recently used connections[m
[31m-are closed.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-It should be particularly noted that the C<keepalive> directive[m
[31m-does not limit the total number of connections to upstream servers[m
[31m-that an nginx worker process can open.[m
[31m-The I<C<connections>> parameter should be set to a number small enough[m
[31m-to let upstream servers process new incoming connections as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration of memcached upstream with keepalive connections:[m
[31m-[m
[31m-    [m
[31m-    upstream memcached_backend {[m
[31m-        server 127.0.0.1:11211;[m
[31m-        server 10.0.0.2:11211;[m
[31m-    [m
[31m-        keepalive 32;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-    [m
[31m-        location /memcached/ {[m
[31m-            set $memcached_key $uri;[m
[31m-            memcached_pass memcached_backend;[m
[31m-        }[m
[31m-    [m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For HTTP, the L<ngx_http_proxy_module>[m
[31m-directive should be set to “C<1.1>”[m
[31m-and the C<Connection> header field should be cleared:[m
[31m-[m
[31m-    [m
[31m-    upstream http_backend {[m
[31m-        server 127.0.0.1:8080;[m
[31m-    [m
[31m-        keepalive 16;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-    [m
[31m-        location /http/ {[m
[31m-            proxy_pass http://http_backend;[m
[31m-            proxy_http_version 1.1;[m
[31m-            proxy_set_header Connection "";[m
[31m-            ...[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Alternatively, HTTPE<sol>1.0 persistent connections can be used by passing the[m
[31m-C<Connection: Keep-Alive> header field to an upstream server,[m
[31m-though this method is not recommended.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For FastCGI servers, it is required to set[m
[31m-L<ngx_http_fastcgi_module>[m
[31m-for keepalive connections to work:[m
[31m-[m
[31m-    [m
[31m-    upstream fastcgi_backend {[m
[31m-        server 127.0.0.1:9000;[m
[31m-    [m
[31m-        keepalive 8;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-    [m
[31m-        location /fastcgi/ {[m
[31m-            fastcgi_pass fastcgi_backend;[m
[31m-            fastcgi_keep_conn on;[m
[31m-            ...[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-When using load balancer methods other than the default[m
[31m-round-robin method, it is necessary to activate them before[m
[31m-the C<keepalive> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-SCGI and uwsgi protocols do not have a notion of keepalive connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ntlm[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows proxying requests with[m
[31m-L<NTLM[m
[31m-Authentication|https://en.wikipedia.org/wiki/Integrated_Windows_Authentication>.[m
[31m-The upstream connection is bound to the client connection[m
[31m-once the client sends a request with the C<Authorization>[m
[31m-header field value[m
[31m-starting with “C<Negotiate>” or “C<NTLM>”.[m
[31m-Further client requests will be proxied through the same upstream connection,[m
[31m-keeping the authentication context.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order for NTLM authentication to work,[m
[31m-it is necessary to enable keepalive connections to upstream servers.[m
[31m-The L<ngx_http_proxy_module>[m
[31m-directive should be set to “C<1.1>”[m
[31m-and the C<Connection> header field should be cleared:[m
[31m-[m
[31m-    [m
[31m-    upstream http_backend {[m
[31m-        server 127.0.0.1:8080;[m
[31m-    [m
[31m-        ntlm;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-    [m
[31m-        location /http/ {[m
[31m-            proxy_pass http://http_backend;[m
[31m-            proxy_http_version 1.1;[m
[31m-            proxy_set_header Connection "";[m
[31m-            ...[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-When using load balancer methods other than the default[m
[31m-round-robin method, it is necessary to activate them before[m
[31m-the C<ntlm> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 least_conn[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.2.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a group should use a load balancing method where a request[m
[31m-is passed to the server with the least number of active connections,[m
[31m-taking into account weights of servers.[m
[31m-If there are several such servers, they are tried in turn using a[m
[31m-weighted round-robin balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 least_time[m
[31m-[m
[31m-[m
[31m-B<syntax:> least_time I<C<header> E<verbar> C<last_byte>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a group should use a load balancing method where a request[m
[31m-is passed to the server with the least average response time and[m
[31m-least number of active connections, taking into account weights of servers.[m
[31m-If there are several such servers, they are tried in turn using a[m
[31m-weighted round-robin balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<header> parameter is specified,[m
[31m-time to receive the[m
[31m-response header is used.[m
[31m-If the C<last_byte> parameter is specified,[m
[31m-time to receive the full response[m
[31m-is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 health_check[m
[31m-[m
[31m-[m
[31m-B<syntax:> health_check I<[I<C<parameters>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables periodic health checks of the servers in a[m
[31m-group referenced in the surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following optional parameters are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<interval>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the interval between two consecutive health checks,[m
[31m-by default, 5 seconds;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fails>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of consecutive failed health checks of a particular server[m
[31m-after which this server will be considered unhealthy,[m
[31m-by default, 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<passes>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of consecutive passed health checks of a particular server[m
[31m-after which the server will be considered healthy,[m
[31m-by default, 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<uri>=I<C<uri>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines the URI used in health check requests,[m
[31m-by default, “C<E<sol>>”;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<match>=I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies the C<match> block configuring the tests that a[m
[31m-response should pass in order for a health check to pass;[m
[31m-by default, the response should have status code 2xx or 3xx;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<port>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines the port used when connecting to a server[m
[31m-to perform a health check (1.9.7);[m
[31m-by default, equals the L</server> port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        proxy_pass http://backend;[m
[31m-        health_check;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-will send “C<E<sol>>” requests to each[m
[31m-server in the C<backend> group every five seconds.[m
[31m-If any communication error or timeout occurs, or a[m
[31m-proxied server responds with the status code other than[m
[31m-2xx or 3xx, the health check will fail, and the server will[m
[31m-be considered unhealthy.[m
[31m-Client requests are not passed to unhealthy servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Health checks can be configured to test the status code of a response,[m
[31m-presence of certain header fields and their values,[m
[31m-and the body contents.[m
[31m-Tests are configured separately using the L</match> directive[m
[31m-and referenced in the C<match> parameter.[m
[31m-For example:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        server {[m
[31m-        ...[m
[31m-            location / {[m
[31m-                proxy_pass http://backend;[m
[31m-                health_check match=welcome;[m
[31m-            }[m
[31m-        }[m
[31m-    [m
[31m-        match welcome {[m
[31m-            status 200;[m
[31m-            header Content-Type = text/html;[m
[31m-            body ~ "Welcome to nginx!";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This configuration tells that for a health check to pass, the response to a[m
[31m-health check request should succeed,[m
[31m-have status 200, content type “C<textE<sol>html>”,[m
[31m-and contain “C<Welcome to nginx!>” in the body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The server group must reside in the shared memory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several health checks are defined for the same group of servers,[m
[31m-a single failure of any check will make the corresponding server be[m
[31m-considered unhealthy.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Please note that most of the variables will have empty values[m
[31m-when used with health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 match[m
[31m-[m
[31m-[m
[31m-B<syntax:> match I<I<C<name>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the named test set used to verify responses to health check requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following items can be tested in a response:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<status 200;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is 200[m
[31m-[m
[31m-[m
[31m-=item C<status ! 500;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is not 500[m
[31m-[m
[31m-[m
[31m-=item C<status 200 204;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is 200 or 204[m
[31m-[m
[31m-[m
[31m-=item C<status ! 301 302;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is neither 301 nor 302[m
[31m-[m
[31m-[m
[31m-=item C<status 200-399;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is in the range from 200 to 399[m
[31m-[m
[31m-[m
[31m-=item C<status ! 400-599;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is not in the range from 400 to 599[m
[31m-[m
[31m-[m
[31m-=item C<status 301-303 307;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is either 301, 302, 303, or 307[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Content-Type = textE<sol>html;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Content-Type>[m
[31m-with value C<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Content-Type != textE<sol>html;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Content-Type>[m
[31m-with value other than C<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Connection ~ close;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Connection>[m
[31m-with value matching regular expression C<close>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Connection !~ close;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Connection>[m
[31m-with value not matching regular expression C<close>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Host;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Host>[m
[31m-[m
[31m-[m
[31m-=item C<header ! X-Accel-Redirect;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-header lacks C<X-Accel-Redirect>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<body ~ "Welcome to nginx!";>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-body matches regular expression “C<Welcome to nginx!>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<body !~ "Welcome to nginx!";>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-body does not match regular expression “C<Welcome to nginx!>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several tests are specified,[m
[31m-the response matches only if it matches all tests.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Only the first 256k of the response body are examined.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Examples:[m
[31m-[m
[31m-    [m
[31m-    # status is 200, content type is "text/html",[m
[31m-    # and body contains "Welcome to nginx!"[m
[31m-    match welcome {[m
[31m-        status 200;[m
[31m-        header Content-Type = text/html;[m
[31m-        body ~ "Welcome to nginx!";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    # status is not one of 301, 302, 303, or 307, and header does not have "Refresh:"[m
[31m-    match not_redirect {[m
[31m-        status ! 301-303 307;[m
[31m-        header ! Refresh;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    # status ok and not in maintenance mode[m
[31m-    match server_ok {[m
[31m-        status 200-399;[m
[31m-        body !~ "maintenance mode";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 queue[m
[31m-[m
[31m-[m
[31m-B<syntax:> queue I<[m
[31m-I<C<number>>[m
[31m-[C<timeout>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If an upstream server cannot be selected immediately[m
[31m-while processing a request,[m
[31m-and there are the servers in the group that have reached the[m
[31m-L</max_conns> limit,[m
[31m-the request will be placed into the queue.[m
[31m-The directive specifies the maximum number of requests that can be in the queue[m
[31m-at the same time.[m
[31m-If the queue is filled up,[m
[31m-or the server to pass the request to cannot be selected within[m
[31m-the time period specified in the C<timeout> parameter,[m
[31m-the C<502> (C<Bad Gateway>)[m
[31m-error will be returned to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The default value of the C<timeout> parameter is 60 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sticky[m
[31m-[m
[31m-[m
[31m-B<syntax:> sticky I<[m
[31m-    C<cookie> I<C<name>>[m
[31m-    [C<expires=>I<C<time>>][m
[31m-    [C<domain=>I<C<domain>>][m
[31m-    [C<httponly>][m
[31m-    [C<secure>][m
[31m-    [C<path=>I<C<path>>]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> sticky I<[m
[31m-    C<route> I<C<$variable>> ...>[m
[31m-[m
[31m-[m
[31m-B<syntax:> sticky I<[m
[31m-    C<learn>[m
[31m-    C<create=>I<C<$variable>>[m
[31m-    C<lookup=>I<C<$variable>>[m
[31m-    C<zone=>I<C<name>>:I<C<size>>[m
[31m-    [C<timeout=>I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables session affinity, which causes requests from the same client to be[m
[31m-passed to the same server in a group of servers.[m
[31m-Three methods are available:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<cookie>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the C<cookie> method is used, information about the[m
[31m-designated server is passed in an HTTP cookie generated by nginx:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        server backend1.example.com;[m
[31m-        server backend2.example.com;[m
[31m-    [m
[31m-        sticky cookie srv_id expires=1h domain=.example.com path=/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A request that comes from a client not yet bound to a particular server[m
[31m-is passed to the server selected by the configured balancing method.[m
[31m-Further requests with this cookie will be passed to the designated server.[m
[31m-If the designated server cannot process a request, the new server is[m
[31m-selected as if the client has not been bound yet.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first parameter sets the name of the cookie to be set or inspected.[m
[31m-Additional parameters may be as follows:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<expires=>I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<time>> for which a browser should keep the cookie.[m
[31m-The special value C<max> will cause the cookie to expire on[m
[31m-“C<31 Dec 2037 23:55:55 GMT>”.[m
[31m-If the parameter is not specified, it will cause the cookie to expire at[m
[31m-the end of a browser session.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<domain=>I<C<domain>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<domain>> for which the cookie is set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<httponly>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the C<HttpOnly> attribute to the cookie (1.7.11).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<secure>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the C<Secure> attribute to the cookie (1.7.11).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<path=>I<C<path>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<path>> for which the cookie is set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-If any parameters are omitted, the corresponding cookie fields are not set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<route>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the C<route> method is used, proxied server assigns[m
[31m-client a route on receipt of the first request.[m
[31m-All subsequent requests from this client will carry routing information[m
[31m-in a cookie or URI.[m
[31m-This information is compared with the “C<route>” parameter[m
[31m-of the L</server> directive to identify the server to which the[m
[31m-request should be proxied.[m
[31m-If the designated server cannot process a request, the new server is[m
[31m-selected by the configured balancing method as if there is no routing[m
[31m-information in the request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The parameters of the C<route> method specify variables that[m
[31m-may contain routing information.[m
[31m-The first non-empty variable is used to find the matching server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    map $cookie_jsessionid $route_cookie {[m
[31m-        ~.+\.(?P<route>\w+)$ $route;[m
[31m-    }[m
[31m-    [m
[31m-    map $request_uri $route_uri {[m
[31m-        ~jsessionid=.+\.(?P<route>\w+)$ $route;[m
[31m-    }[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        server backend1.example.com route=a;[m
[31m-        server backend2.example.com route=b;[m
[31m-    [m
[31m-        sticky route $route_cookie $route_uri;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Here, the route is taken from the “C<JSESSIONID>” cookie[m
[31m-if present in a request.[m
[31m-Otherwise, the route from the URI is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<learn>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the C<learn> method (1.7.1) is used, nginx[m
[31m-analyzes upstream server responses and learns server-initiated sessions[m
[31m-usually passed in an HTTP cookie.[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-       server backend1.example.com:8080;[m
[31m-       server backend2.example.com:8081;[m
[31m-    [m
[31m-       sticky learn[m
[31m-              create=$upstream_cookie_examplecookie[m
[31m-              lookup=$cookie_examplecookie[m
[31m-              zone=client_sessions:1m;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-In the example, the upstream server creates a session by setting the[m
[31m-cookie “C<EXAMPLECOOKIE>” in the response.[m
[31m-Further requests with this cookie will be passed to the same server.[m
[31m-If the server cannot process the request, the new server is[m
[31m-selected as if the client has not been bound yet.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The parameters C<create> and C<lookup>[m
[31m-specify variables that indicate how new sessions are created and existing[m
[31m-sessions are searched, respectively.[m
[31m-Both parameters may be specified more than once, in which case the first[m
[31m-non-empty variable is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sessions are stored in a shared memory zone, whose I<C<name>> and[m
[31m-I<C<size>> are configured by the C<zone> parameter.[m
[31m-One megabyte zone can store about 8000 sessions on the 64-bit platform.[m
[31m-The sessions that are not accessed during the time specified by the[m
[31m-C<timeout> parameter get removed from the zone.[m
[31m-By default, C<timeout> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sticky_cookie_insert[m
[31m-[m
[31m-[m
[31m-B<syntax:> sticky_cookie_insert I<I<C<name>>[m
[31m-[C<expires=>I<C<time>>][m
[31m-[C<domain=>I<C<domain>>][m
[31m-[C<path=>I<C<path>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is obsolete since version 1.5.7.[m
[31m-An equivalent[m
[31m-L</sticky> directive with a new syntax should be used instead:[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-C<sticky cookie> I<C<name>>[m
[31m-[C<expires=>I<C<time>>][m
[31m-[C<domain=>I<C<domain>>][m
[31m-[C<path=>I<C<path>>];[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_upstream_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the IP address and port,[m
[31m-or the path to the UNIX-domain socket of the upstream server.[m
[31m-If several servers were contacted during request processing,[m
[31m-their addresses are separated by commas, e.g.[m
[31m-“C<192.168.1.1:80, 192.168.1.2:80, unix:E<sol>tmpE<sol>sock>”.[m
[31m-If an internal redirect from one server group to another happens,[m
[31m-initiated by[m
[31m-C<X-Accel-Redirect> or[m
[31m-L<ngx_http_core_module>,[m
[31m-then the server addresses from different groups are separated by colons, e.g.[m
[31m-“C<192.168.1.1:80, 192.168.1.2:80, unix:E<sol>tmpE<sol>sock : 192.168.10.1:80, 192.168.10.2:80>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_cache_status>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the status of accessing a response cache (0.8.3).[m
[31m-The status can be either “C<MISS>”,[m
[31m-“C<BYPASS>”, “C<EXPIRED>”,[m
[31m-“C<STALE>”, “C<UPDATING>”,[m
[31m-“C<REVALIDATED>”, or “C<HIT>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_connect_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps time spent on establishing a connection with the upstream server (1.9.1);[m
[31m-the time is kept in seconds with millisecond resolution.[m
[31m-In case of SSL, includes time spent on handshake.[m
[31m-Times of several connections[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_cookie_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-cookie with the specified I<C<name>> sent by the upstream server[m
[31m-in the C<Set-Cookie> response header field (1.7.1).[m
[31m-Only the cookies from the response of the last server are saved.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_header_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps time[m
[31m-spent on receiving the response header from the upstream server (1.7.10);[m
[31m-the time is kept in seconds with millisecond resolution.[m
[31m-Times of several responses[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_http_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keep server response header fields.[m
[31m-For example, the C<Server> response header field[m
[31m-is available through the C<$upstream_http_server> variable.[m
[31m-The rules of converting header field names to variable names are the same[m
[31m-as for the variables that start with the[m
[31m-“L<$http_|ngx_http_core_module>” prefix.[m
[31m-Only the header fields from the response of the last server are saved.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_response_length>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the length of the response obtained from the upstream server (0.7.27);[m
[31m-the length is kept in bytes.[m
[31m-Lengths of several responses[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_response_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps time spent on receiving the response from the upstream server;[m
[31m-the time is kept in seconds with millisecond resolution.[m
[31m-Times of several responses[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_status>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps status code of the response obtained from the upstream server.[m
[31m-Status codes of several responses[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_userid_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_userid_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 524ff16..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_userid_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,412 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_userid_module - Module ngx_http_userid_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_userid_module> module sets cookies[m
[31m-suitable for client identification.[m
[31m-Received and set cookies can be logged using the embedded variables[m
[31m-$uid_got and[m
[31m-$uid_set.[m
[31m-This module is compatible with the[m
[31m-L<mod_uid|http://www.lexa.ru/programs/mod-uid-eng.html>[m
[31m-module for Apache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    userid         on;[m
[31m-    userid_name    uid;[m
[31m-    userid_domain  example.com;[m
[31m-    userid_path    /;[m
[31m-    userid_expires 365d;[m
[31m-    userid_p3p     'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 userid[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<v1> E<verbar>[m
[31m-    C<log> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables setting cookies and logging the received cookies:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<on>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables the setting of version 2 cookies[m
[31m-and logging of the received cookies;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<v1>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables the setting of version 1 cookies[m
[31m-and logging of the received cookies;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<log>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables the setting of cookies,[m
[31m-but enables logging of the received cookies;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables the setting of cookies and logging of the received cookies.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_domain[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_domain I<I<C<name>> E<verbar> C<none>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a domain for which the cookie is set.[m
[31m-The C<none> parameter disables setting of a domain for the[m
[31m-cookie.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_expires[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_expires I<I<C<time>> E<verbar> C<max> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a time during which a browser should keep the cookie.[m
[31m-The parameter C<max> will cause the cookie to expire on[m
[31m-“C<31 Dec 2037 23:55:55 GMT>”.[m
[31m-The parameter C<off> will cause the cookie to expire at[m
[31m-the end of a browser session.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_mark[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_mark I<[m
[31m-    I<C<letter>> E<verbar> I<C<digit>> E<verbar>[m
[31m-    C<=> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the parameter is not C<off>, enables the cookie marking[m
[31m-mechanism and sets the character used as a mark.[m
[31m-This mechanism is used to add or change[m
[31m-L</userid_p3p> andE<sol>or a cookie expiration time while[m
[31m-preserving the client identifier.[m
[31m-A mark can be any letter of the English alphabet (case-sensitive),[m
[31m-digit, or the “C<=>” character.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the mark is set, it is compared with the first padding symbol[m
[31m-in the base64 representation of the client identifier passed in a cookie.[m
[31m-If they do not match, the cookie is resent with the specified mark,[m
[31m-expiration time, and C<P3P> header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<uid>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the cookie name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_p3p[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_p3p I<I<C<string>> E<verbar> C<none>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a value for the C<P3P> header field that will be[m
[31m-sent along with the cookie.[m
[31m-If the directive is set to the special value C<none>,[m
[31m-the C<P3P> header will not be sent in a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_path I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<E<sol>>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a path for which the cookie is set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_service[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_service I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<IP address of the server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If identifiers are issued by multiple servers (services),[m
[31m-each service should be assigned its own I<C<number>>[m
[31m-to ensure that client identifiers are unique.[m
[31m-For version 1 cookies, the default value is zero.[m
[31m-For version 2 cookies, the default value is the number composed from the last[m
[31m-four octets of the server’s IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_userid_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$uid_got>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The cookie name and received client identifier.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$uid_reset>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the variable is set to a non-empty string that is not “C<0>”,[m
[31m-the client identifiers are reset.[m
[31m-The special value “C<log>” additionally leads to the output of[m
[31m-messages about the reset identifiers to the[m
[31m-L<ngx_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$uid_set>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The cookie name and sent client identifier.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_uwsgi_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_uwsgi_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 1ad1143..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_uwsgi_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,2689 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_uwsgi_module - Module ngx_http_uwsgi_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_uwsgi_module> module allows passing[m
[31m-requests to a uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        include    uwsgi_params;[m
[31m-        uwsgi_pass localhost:9000;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 uwsgi_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a uwsgi server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<uwsgi_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a uwsgi server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the first part[m
[31m-of the response received from the uwsgi server.[m
[31m-This part usually contains a small response header.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-It can be made smaller, however.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of responses from the uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, nginx receives a response from the uwsgi server[m
[31m-as soon as possible, saving it into the buffers set by the[m
[31m-L</uwsgi_buffer_size> and L</uwsgi_buffers> directives.[m
[31m-If the whole response does not fit into memory, a part of it can be saved[m
[31m-to a temporary file on the disk.[m
[31m-Writing to temporary files is controlled by the[m
[31m-L</uwsgi_max_temp_file_size> and[m
[31m-L</uwsgi_temp_file_write_size> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the response is passed to a client synchronously,[m
[31m-immediately as it is received.[m
[31m-nginx will not try to read the whole response from the uwsgi server.[m
[31m-The maximum size of the data that nginx can receive from the server[m
[31m-at a time is set by the L</uwsgi_buffer_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering can also be enabled or disabled by passing[m
[31m-“C<yes>” or “C<no>” in the[m
[31m-C<X-Accel-Buffering> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L</uwsgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from the uwsgi server,[m
[31m-for a single connection.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_busy_buffers_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_busy_buffers_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the uwsgi[m
[31m-server is enabled, limits the total I<C<size>> of buffers that[m
[31m-can be busy sending a response to the client while the response is not[m
[31m-yet fully read.[m
[31m-In the meantime, the rest of the buffers can be used for reading the response[m
[31m-and, if needed, buffering part of the response to a temporary file.[m
[31m-By default, I<C<size>> is limited by the size of two buffers set by the[m
[31m-L</uwsgi_buffer_size> and L</uwsgi_buffers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache I<I<C<zone>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a shared memory zone used for caching.[m
[31m-The same zone can be used in several places.[m
[31m-Parameter value can contain variables (1.7.9).[m
[31m-The C<off> parameter disables caching inherited[m
[31m-from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_bypass[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_bypass I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be taken from a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be taken from the cache:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_bypass $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    uwsgi_cache_bypass $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</uwsgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_key I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for caching, for example[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_key localhost:9000$request_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_lock[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_lock I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When enabled, only one request at a time will be allowed to populate[m
[31m-a new cache element identified according to the L</uwsgi_cache_key>[m
[31m-directive by passing a request to a uwsgi server.[m
[31m-Other requests of the same cache element will either wait[m
[31m-for a response to appear in the cache or the cache lock for[m
[31m-this element to be released, up to the time set by the[m
[31m-L</uwsgi_cache_lock_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_lock_age[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_lock_age I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the last request passed to the uwsgi server[m
[31m-for populating a new cache element[m
[31m-has not completed for the specified I<C<time>>,[m
[31m-one more request may be passed to the uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_lock_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_lock_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for L</uwsgi_cache_lock>.[m
[31m-When the I<C<time>> expires,[m
[31m-the request will be passed to the uwsgi server,[m
[31m-however, the response will not be cached.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 1.7.8, the response could be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_methods I<[m
[31m-    C<GET> E<verbar>[m
[31m-    C<HEAD> E<verbar>[m
[31m-    C<POST>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<GET HEAD>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the client request method is listed in this directive then[m
[31m-the response will be cached.[m
[31m-“C<GET>” and “C<HEAD>” methods are always[m
[31m-added to the list, though it is recommended to specify them explicitly.[m
[31m-See also the L</uwsgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> of requests after which the response[m
[31m-will be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_path I<[m
[31m-    I<C<path>>[m
[31m-    [C<levels>=I<C<levels>>][m
[31m-    [C<use_temp_path>=C<on>E<verbar>C<off>][m
[31m-    C<keys_zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<inactive>=I<C<time>>][m
[31m-    [C<max_size>=I<C<size>>][m
[31m-    [C<loader_files>=I<C<number>>][m
[31m-    [C<loader_sleep>=I<C<time>>][m
[31m-    [C<loader_threshold>=I<C<time>>][m
[31m-    [C<purger>=C<on>E<verbar>C<off>][m
[31m-    [C<purger_files>=I<C<number>>][m
[31m-    [C<purger_sleep>=I<C<time>>][m
[31m-    [C<purger_threshold>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path and other parameters of a cache.[m
[31m-Cache data are stored in files.[m
[31m-The file name in a cache is a result of[m
[31m-applying the MD5 function to the[m
[31m-cache key.[m
[31m-The C<levels> parameter defines hierarchy levels of a cache.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;[m
[31m-[m
[31m-[m
[31m-file names in a cache will look like this:[m
[31m-[m
[31m-    [m
[31m-    /data/nginx/cache/<emphasis>c</emphasis>/<emphasis>29</emphasis>/b7f54b2df7773722d382f4809d650<emphasis>29c</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A cached response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the cache can be put on[m
[31m-different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both cache and a directory[m
[31m-holding temporary files[m
[31m-are put on the same file system.[m
[31m-A directory for temporary files is set based on[m
[31m-the C<use_temp_path> parameter (1.7.10).[m
[31m-If this parameter is omitted or set to the value C<on>,[m
[31m-the directory set by the L</uwsgi_temp_path> directive[m
[31m-for the given location will be used.[m
[31m-If the value is set to C<off>,[m
[31m-temporary files will be put directly in the cache directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, all active keys and information about data are stored[m
[31m-in a shared memory zone, whose I<C<name>> and I<C<size>>[m
[31m-are configured by the C<keys_zone> parameter.[m
[31m-One megabyte zone can store about 8 thousand keys.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Cached data that are not accessed during the time specified by the[m
[31m-C<inactive> parameter get removed from the cache[m
[31m-regardless of their freshness.[m
[31m-By default, C<inactive> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special “cache manager” process monitors the maximum cache size set[m
[31m-by the C<max_size> parameter.[m
[31m-When this size is exceeded, it removes the least recently used data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A minute after the start the special “cache loader” process is activated.[m
[31m-It loads information about previously cached data stored on file system[m
[31m-into a cache zone.[m
[31m-The loading is done in iterations.[m
[31m-During one iteration no more than C<loader_files> items[m
[31m-are loaded (by default, 100).[m
[31m-Besides, the duration of one iteration is limited by the[m
[31m-C<loader_threshold> parameter (by default, 200 milliseconds).[m
[31m-Between iterations, a pause configured by the C<loader_sleep>[m
[31m-parameter (by default, 50 milliseconds) is made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Instructs whether cache entries that match a[m
[31m-wildcard key[m
[31m-will be removed from the disk by the cache purger (1.7.12).[m
[31m-Setting the parameter to C<on>[m
[31m-(default is C<off>)[m
[31m-will activate the “cache purger” process that[m
[31m-permanently iterates through all cache entries[m
[31m-and deletes the entries that match the wildcard key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_files>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of items that will be scanned during one iteration (1.7.12).[m
[31m-By default, C<purger_files> is set to 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_threshold>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the duration of one iteration (1.7.12).[m
[31m-By default, C<purger_threshold> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_sleep>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a pause between iterations (1.7.12).[m
[31m-By default, C<purger_sleep> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_purge[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_purge I<string ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the request will be considered a cache[m
[31m-purge request.[m
[31m-If at least one value of the string parameters is not empty and is not equal[m
[31m-to “0” then the cache entry with a corresponding[m
[31m-cache key is removed.[m
[31m-The result of successful operation is indicated by returning[m
[31m-the C<204> (C<No Content>) response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the cache key of a purge request ends[m
[31m-with an asterisk (“C<*>”), all cache entries matching the[m
[31m-wildcard key will be removed from the cache.[m
[31m-However, these entries will remain on the disk until they are deleted[m
[31m-for either inactivity,[m
[31m-or processed by the cache purger (1.7.12),[m
[31m-or a client attempts to access them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m;[m
[31m-    [m
[31m-    map $request_method $purge_method {[m
[31m-        PURGE   1;[m
[31m-        default 0;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        location / {[m
[31m-            uwsgi_pass        backend;[m
[31m-            uwsgi_cache       cache_zone;[m
[31m-            uwsgi_cache_key   $uri;[m
[31m-            uwsgi_cache_purge $purge_method;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This functionality is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_revalidate[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_revalidate I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables revalidation of expired cache items using conditional requests with[m
[31m-the C<If-Modified-Since> and C<If-None-Match>[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_use_stale[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_use_stale I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<updating> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines in which cases a stale cached response can be used[m
[31m-when an error occurs during communication with the uwsgi server.[m
[31m-The directive’s parameters match the parameters of the[m
[31m-L</uwsgi_next_upstream> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<error> parameter also permits[m
[31m-using a stale cached response if a uwsgi server to process a request[m
[31m-cannot be selected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, the C<updating> parameter permits[m
[31m-using a stale cached response if it is currently being updated.[m
[31m-This allows minimizing the number of accesses to uwsgi servers[m
[31m-when updating cached data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To minimize the number of accesses to uwsgi servers when[m
[31m-populating a new cache element, the L</uwsgi_cache_lock>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_valid I<[I<C<code>> ...] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets caching time for different response codes.[m
[31m-For example, the following directives[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_valid 200 302 10m;[m
[31m-    uwsgi_cache_valid 404      1m;[m
[31m-[m
[31m-[m
[31m-set 10 minutes of caching for responses with codes 200 and 302[m
[31m-and 1 minute for responses with code 404.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only caching I<C<time>> is specified[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_valid 5m;[m
[31m-[m
[31m-[m
[31m-then only 200, 301, and 302 responses are cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the C<any> parameter can be specified[m
[31m-to cache any responses:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_valid 200 302 10m;[m
[31m-    uwsgi_cache_valid 301      1h;[m
[31m-    uwsgi_cache_valid any      1m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters of caching can also be set directly[m
[31m-in the response header.[m
[31m-This has higher priority than setting of caching time using the directive.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<X-Accel-Expires> header field sets caching time of a[m
[31m-response in seconds.[m
[31m-The zero value disables caching for a response.[m
[31m-If the value starts with the C<@> prefix, it sets an absolute[m
[31m-time in seconds since Epoch, up to which the response may be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header does not include the C<X-Accel-Expires> field,[m
[31m-parameters of caching may be set in the header fields[m
[31m-C<Expires> or C<Cache-Control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Set-Cookie> field, such a[m
[31m-response will not be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Vary> field[m
[31m-with the special value “C<*>”, such a[m
[31m-response will not be cached (1.7.7).[m
[31m-If the header includes the C<Vary> field[m
[31m-with another value, such a response will be cached[m
[31m-taking into account the corresponding request header fields (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Processing of one or more of these response header fields can be disabled[m
[31m-using the L</uwsgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a uwsgi server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the uwsgi server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_hide_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_hide_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default,[m
[31m-nginx does not pass the header fields C<Status> and[m
[31m-C<X-Accel-...> from the response of a uwsgi[m
[31m-server to a client.[m
[31m-The C<uwsgi_hide_header> directive sets additional fields[m
[31m-that will not be passed.[m
[31m-If, on the contrary, the passing of fields needs to be permitted,[m
[31m-the L</uwsgi_pass_header> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ignore_client_abort[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ignore_client_abort I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether the connection with a uwsgi server should be[m
[31m-closed when a client closes the connection without waiting[m
[31m-for a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ignore_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ignore_headers I<I<C<field>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables processing of certain response header fields from the uwsgi server.[m
[31m-The following fields can be ignored: C<X-Accel-Redirect>,[m
[31m-C<X-Accel-Expires>, C<X-Accel-Limit-Rate> (1.1.6),[m
[31m-C<X-Accel-Buffering> (1.1.6),[m
[31m-C<X-Accel-Charset> (1.1.6), C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie> (0.8.44),[m
[31m-and C<Vary> (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If not disabled, processing of these header fields has the following[m
[31m-effect:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Expires>, C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie>,[m
[31m-and C<Vary>[m
[31m-set the parameters of response caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Redirect> performs an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> to the specified URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Limit-Rate> sets the[m
[31m-L<rate[m
[31m-limit|ngx_http_core_module> for transmission of a response to a client;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Buffering> enables or disables[m
[31m-buffering of a response;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Charset> sets the desired[m
[31m-L<ngx_http_charset_module>[m
[31m-of a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_intercept_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_intercept_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether a uwsgi server responses with codes greater than or equal[m
[31m-to 300 should be passed to a client or be redirected to nginx for processing[m
[31m-with the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the response from the uwsgi server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if nginx simultaneously opens[m
[31m-two connections to the uwsgi server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-The limitation works only if[m
[31m-buffering of responses from the uwsgi[m
[31m-server is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_max_temp_file_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_max_temp_file_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the uwsgi[m
[31m-server is enabled, and the whole response does not fit into the buffers[m
[31m-set by the L</uwsgi_buffer_size> and L</uwsgi_buffers>[m
[31m-directives, a part of the response can be saved to a temporary file.[m
[31m-This directive sets the maximum I<C<size>> of the temporary file.[m
[31m-The size of data written to the temporary file at a time is set[m
[31m-by the L</uwsgi_temp_file_write_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The zero value disables buffering of responses to temporary files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This restriction does not apply to responses[m
[31m-that will be cached[m
[31m-or stored on disk.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_modifier1[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_modifier1 I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the value of the C<modifier1> field in the[m
[31m-L<uwsgi[m
[31m-packet header|http://uwsgi-docs.readthedocs.org/en/latest/Protocol.html#uwsgi-packet-header>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_modifier2[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_modifier2 I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the value of the C<modifier2> field in the[m
[31m-L<uwsgi[m
[31m-packet header|http://uwsgi-docs.readthedocs.org/en/latest/Protocol.html#uwsgi-packet-header>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<non_idempotent> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_header>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<http_500>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 500;[m
[31m-[m
[31m-[m
[31m-=item C<http_503>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 503;[m
[31m-[m
[31m-[m
[31m-=item C<http_403>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 403;[m
[31m-[m
[31m-[m
[31m-=item C<http_404>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 404;[m
[31m-[m
[31m-[m
[31m-=item C<non_idempotent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-normally, requests with a[m
[31m-L<non-idempotent|http://tools.ietf.org/html/rfc7231#section-4.2.2>[m
[31m-method[m
[31m-(C<POST>, C<LOCK>, C<PATCH>)[m
[31m-are not passed to the next server[m
[31m-if a request has been sent to an upstream server (1.9.13);[m
[31m-enabling this option explicitly allows retrying such requests;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The cases of C<http_500> and C<http_503> are[m
[31m-considered unsuccessful attempts only if they are specified in the directive.[m
[31m-The cases of C<http_403> and C<http_404>[m
[31m-are never considered unsuccessful attempts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_no_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_no_cache I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be saved to a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be saved:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_no_cache $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    uwsgi_no_cache $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</uwsgi_cache_bypass> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_param I<[m
[31m-    I<C<parameter>> I<C<value>>[m
[31m-    [C<if_not_empty>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<parameter>> that should be passed to the uwsgi server.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<uwsgi_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Standard[m
[31m-L<CGI[m
[31m-environment variables|http://tools.ietf.org/html/rfc3875#section-4.1>[m
[31m-should be provided as uwsgi headers, see the F<uwsgi_params> file[m
[31m-provided in the distribution:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        include uwsgi_params;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a directive is specified with C<if_not_empty> (1.1.11) then[m
[31m-such a parameter will not be passed to the server until its value is not empty:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_param HTTPS $https if_not_empty;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_pass I<[I<C<protocol>>:E<sol>E<sol>]I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the protocol and address of a uwsgi server.[m
[31m-As a I<C<protocol>>,[m
[31m-“C<uwsgi>” or “C<suwsgi>”[m
[31m-(secured uwsgi, uwsgi over SSL) can be specified.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_pass localhost:9000;[m
[31m-    uwsgi_pass uwsgi://localhost:9000;[m
[31m-    uwsgi_pass suwsgi://[2001:db8::1]:9090;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_pass unix:/tmp/uwsgi.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Secured uwsgi protocol is supported since version 1.5.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_pass_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_pass_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Permits passing otherwise disabled header[m
[31m-fields from a uwsgi server to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_pass_request_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_pass_request_body I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the original request body is passed[m
[31m-to the uwsgi server.[m
[31m-See also the L</uwsgi_pass_request_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_pass_request_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_pass_request_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the header fields of the original request are passed[m
[31m-to the uwsgi server.[m
[31m-See also the L</uwsgi_pass_request_body> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the uwsgi server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the uwsgi server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_request_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_request_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of a client request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the entire request body is[m
[31m-L<read|ngx_http_core_module>[m
[31m-from the client before sending the request to a uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the request body is sent to the uwsgi server[m
[31m-immediately as it is received.[m
[31m-In this case, the request cannot be passed to the[m
[31m-next server[m
[31m-if nginx already started sending the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When HTTPE<sol>1.1 chunked transfer encoding is used[m
[31m-to send the original request body,[m
[31m-the request body will be buffered regardless of the directive value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the uwsgi server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the uwsgi server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-used for authentication to a secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-used for authentication to a secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>> (1.7.9),[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<DEFAULT>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers for requests to a secured uwsgi server.[m
[31m-The ciphers are specified in the format understood by the OpenSSL library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-the certificate of the secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<host from uwsgi_pass>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows overriding the server name used to[m
[31m-verify[m
[31m-the certificate of the secured uwsgi server and to be[m
[31m-passed through SNI[m
[31m-when establishing a connection with the secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the host part from L</uwsgi_pass> is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols for requests to a secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_server_name I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables passing of the server name through[m
[31m-L<TLS[m
[31m-Server Name Indication extension|http://en.wikipedia.org/wiki/Server_Name_Indication> (SNI, RFC 6066)[m
[31m-when establishing a connection with the secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_session_reuse[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_session_reuse I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether SSL sessions can be reused when working with[m
[31m-a secured uwsgi server.[m
[31m-If the errors[m
[31m-“C<SSL3_GET_FINISHED:digest check failed>”[m
[31m-appear in the logs, try disabling session reuse.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify[m
[31m-the certificate of the secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_verify[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_verify I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables verification of the secured uwsgi server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the secured uwsgi server certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_store[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_store I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables saving of files to a disk.[m
[31m-The C<on> parameter saves files with paths[m
[31m-corresponding to the directives[m
[31m-L<ngx_http_core_module> or[m
[31m-L<ngx_http_core_module>.[m
[31m-The C<off> parameter disables saving of files.[m
[31m-In addition, the file name can be set explicitly using the[m
[31m-I<C<string>> with variables:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_store /data/www$original_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The modification time of files is set according to the received[m
[31m-C<Last-Modified> response header field.[m
[31m-The response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the L</uwsgi_temp_path>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive can be used to create local copies of static unchangeable[m
[31m-files, e.g.:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root               /data/www;[m
[31m-        error_page         404 = /fetch$uri;[m
[31m-    }[m
[31m-    [m
[31m-    location /fetch/ {[m
[31m-        internal;[m
[31m-    [m
[31m-        uwsgi_pass         backend:9000;[m
[31m-        ...[m
[31m-    [m
[31m-        uwsgi_store        on;[m
[31m-        uwsgi_store_access user:rw group:rw all:r;[m
[31m-        uwsgi_temp_path    /data/temp;[m
[31m-    [m
[31m-        alias              /data/www/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_store_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_store_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_store_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_store_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_temp_file_write_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_temp_file_write_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the I<C<size>> of data written to a temporary file[m
[31m-at a time, when buffering of responses from the uwsgi server[m
[31m-to temporary files is enabled.[m
[31m-By default, I<C<size>> is limited by two buffers set by the[m
[31m-L</uwsgi_buffer_size> and L</uwsgi_buffers> directives.[m
[31m-The maximum size of a temporary file is set by the[m
[31m-L</uwsgi_max_temp_file_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<uwsgi_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files[m
[31m-with data received from uwsgi servers.[m
[31m-Up to three-level subdirectory hierarchy can be used underneath the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    uwsgi_temp_path /spool/nginx/uwsgi_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/uwsgi_temp/<emphasis>7</emphasis>/<emphasis>45</emphasis>/00000123<emphasis>457</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the C<use_temp_path> parameter of the[m
[31m-L</uwsgi_cache_path> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_v2_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_v2_module.pod[m
[1mdeleted file mode 100644[m
[1mindex f81542b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_v2_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,350 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_v2_module - Module ngx_http_v2_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_v2_module> module (1.9.5) provides[m
[31m-support for L<HTTPE<sol>2|https://tools.ietf.org/html/rfc7540>[m
[31m-and supersedes the[m
[31m-L<ngx_http_spdy_module|ngx_http_spdy_module> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with[m
[31m-the C<--with-http_v2_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module is experimental, caveat emptor applies.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Before version 1.9.14,[m
[31m-buffering of a client request body could not be disabled[m
[31m-regardless of[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>, and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directive values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen 443 ssl http2;[m
[31m-    [m
[31m-        ssl_certificate server.crt;[m
[31m-        ssl_certificate_key server.key;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Note that accepting HTTPE<sol>2 connections over TLS requires[m
[31m-the “Application-Layer Protocol Negotiation” (ALPN) TLS extension[m
[31m-support, which is available only since[m
[31m-L<OpenSSL|http://www.openssl.org> version 1.0.2.[m
[31m-Using the “Next Protocol Negotiation” (NPN) TLS extension for this purpose[m
[31m-(available since OpenSSL version 1.0.1) is not guaranteed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Also note that if the[m
[31m-L<ngx_http_ssl_module> directive[m
[31m-is set to the value “C<on>”,[m
[31m-the L<ciphers|ngx_http_ssl_module>[m
[31m-should be configured to comply with[m
[31m-L<RFC 7540, Appendix A|https://tools.ietf.org/html/rfc7540#appendix-A>[m
[31m-black list and supported by clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 http2_chunk_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_chunk_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum size of chunks[m
[31m-into which the response body is sliced.[m
[31m-A too low value results in higher overhead.[m
[31m-A too high value impairs prioritization due to[m
[31m-L<HOL blocking|http://en.wikipedia.org/wiki/Head-of-line_blocking>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_body_preread_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_body_preread_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.11.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer per each request[m
[31m-in which the request body may be saved[m
[31m-before it is started to be processed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_idle_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_idle_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<3m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the timeout of inactivity after which the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_max_concurrent_streams[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_max_concurrent_streams I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<128>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum number of concurrent HTTPE<sol>2 streams[m
[31m-in a connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_max_field_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_max_field_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the maximum size of[m
[31m-an L<HPACK|http://tools.ietf.org/html/rfc7541>-compressed[m
[31m-request header field.[m
[31m-The limit applies equally to both name and value.[m
[31m-Note that if Huffman encoding is applied,[m
[31m-the actual size of decompressed name and value strings may be larger.[m
[31m-For most requests, the default limit should be enough.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_max_header_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_max_header_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the maximum size of the entire request header list after[m
[31m-L<HPACK|http://tools.ietf.org/html/rfc7541> decompression.[m
[31m-For most requests, the default limit should be enough.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_recv_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_recv_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<256k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the size of the per[m
[31m-L<worker|ngx_core_module>[m
[31m-input buffer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_recv_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_recv_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the timeout for expecting more data from the client,[m
[31m-after which the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_v2_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$http2>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-negotiated protocol identifier:[m
[31m-“C<h2>” for HTTPE<sol>2 over TLS,[m
[31m-“C<h2c>” for HTTPE<sol>2 over cleartext TCP,[m
[31m-or an empty string otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_xslt_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_xslt_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 9170756..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_http_xslt_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,320 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_xslt_module - Module ngx_http_xslt_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_xslt_module> (0.7.8+) is a filter[m
[31m-that transforms XML responses using one or more XSLT stylesheets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_xslt_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires the[m
[31m-L<libxml2|http://xmlsoft.org> and[m
[31m-L<libxslt|http://xmlsoft.org/XSLT/> libraries.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        xml_entities    /site/dtd/entities.dtd;[m
[31m-        xslt_stylesheet /site/xslt/one.xslt param=value;[m
[31m-        xslt_stylesheet /site/xslt/two.xslt;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 xml_entities[m
[31m-[m
[31m-[m
[31m-B<syntax:> xml_entities I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the DTD file that declares character entities.[m
[31m-This file is compiled at the configuration stage.[m
[31m-For technical reasons, the module is unable to use the[m
[31m-external subset declared in the processed XML, so it is[m
[31m-ignored and a specially defined file is used instead.[m
[31m-This file should not describe the XML structure.[m
[31m-It is enough to declare just the required character entities, for example:[m
[31m-[m
[31m-    [m
[31m-    <!ENTITY nbsp "&#xa0;">[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_last_modified[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_last_modified I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows preserving the C<Last-Modified> header field[m
[31m-from the original response during XSLT transformations[m
[31m-to facilitate response caching.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the header field is removed as contents of the response[m
[31m-are modified during transformations and may contain dynamically generated[m
[31m-elements or parts that are changed independently of the original response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_param I<I<C<parameter>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the parameters for XSLT stylesheets.[m
[31m-The I<C<value>> is treated as an XPath expression.[m
[31m-The I<C<value>> can contain variables.[m
[31m-To pass a string value to a stylesheet,[m
[31m-the L</xslt_string_param> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<xslt_param> directives.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<xslt_param> and L</xslt_string_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_string_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_string_param I<I<C<parameter>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the string parameters for XSLT stylesheets.[m
[31m-XPath expressions in the I<C<value>> are not interpreted.[m
[31m-The I<C<value>> can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<xslt_string_param> directives.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-L</xslt_param> and C<xslt_string_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_stylesheet[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_stylesheet I<[m
[31m-    I<C<stylesheet>>[m
[31m-    [I<C<parameter>>=I<C<value>> ...]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the XSLT stylesheet and its optional parameters.[m
[31m-A stylesheet is compiled at the configuration stage.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters can either be specified separately, or grouped in a[m
[31m-single line using the “C<:>” delimiter.[m
[31m-If a parameter includes the “C<:>” character,[m
[31m-it should be escaped as “C<%3A>”.[m
[31m-Also, C<libxslt> requires to enclose parameters[m
[31m-that contain non-alphanumeric characters into single or double quotes,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    param1='http%3A//www.example.com':param2=value2[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The parameters description can contain variables, for example,[m
[31m-the whole line of parameters can be taken from a single variable:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        xslt_stylesheet /site/xslt/one.xslt[m
[31m-                        $arg_xslt_params[m
[31m-                        param1='$value1':param2=value2[m
[31m-                        param3=value3;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is possible to specify several stylesheets.[m
[31m-They will be applied sequentially in the specified order.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>xml>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables transformations in responses with the specified MIME types[m
[31m-in addition to “C<textE<sol>xml>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-If the transformation result is an HTML response, its MIME type[m
[31m-is changed to “C<textE<sol>html>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_auth_http_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_auth_http_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 8ad8824..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_auth_http_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,323 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_auth_http_module - Module ngx_mail_auth_http_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 auth_http[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_http I<I<C<URL>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the URL of the HTTP authentication server.[m
[31m-The protocol is described below.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_http_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_http_header I<I<C<header>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Appends the specified header to requests sent to the authentication server.[m
[31m-This header can be used as the shared secret to verify[m
[31m-that the request comes from nginx.[m
[31m-For example:[m
[31m-[m
[31m-    [m
[31m-    auth_http_header X-Auth-Key "secret_string";[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_http_pass_client_cert[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_http_pass_client_cert I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Appends the C<Auth-SSL-Cert> header with the[m
[31m-L<client|ngx_mail_ssl_module>[m
[31m-certificate in the PEM format (urlencoded)[m
[31m-to requests sent to the authentication server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_http_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_http_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the timeout for communication with the authentication server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Protocol[m
[31m-[m
[31m-[m
[31m-[m
[31m-The HTTP protocol is used to communicate with the authentication server.[m
[31m-The data in the response body is ignored, the information is passed only in[m
[31m-the headers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Examples of requests and responses:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Request:[m
[31m-[m
[31m-    [m
[31m-    GET /auth HTTP/1.0[m
[31m-    Host: localhost[m
[31m-    Auth-Method: plain # plain/apop/cram-md5[m
[31m-    Auth-User: user[m
[31m-    Auth-Pass: password[m
[31m-    Auth-Protocol: imap # imap/pop3/smtp[m
[31m-    Auth-Login-Attempt: 1[m
[31m-    Client-IP: 192.0.2.42[m
[31m-    Client-Host: client.example.org[m
[31m-[m
[31m-[m
[31m-Good response:[m
[31m-[m
[31m-    [m
[31m-    HTTP/1.0 200 OK[m
[31m-    Auth-Status: OK[m
[31m-    Auth-Server: 198.51.100.1[m
[31m-    Auth-Port: 143[m
[31m-[m
[31m-[m
[31m-Bad response:[m
[31m-[m
[31m-    [m
[31m-    HTTP/1.0 200 OK[m
[31m-    Auth-Status: Invalid login or password[m
[31m-    Auth-Wait: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If there is no C<Auth-Wait> header,[m
[31m-an error will be returned and the connection will be closed.[m
[31m-The current implementation allocates memory for each authentication attempt.[m
[31m-The memory is freed only at the end of a session.[m
[31m-Therefore, the number of invalid authentication attempts in a single session[m
[31m-must be limited — the server must respond without[m
[31m-the C<Auth-Wait> header after 10-20 attempts[m
[31m-(the attempt number is passed in the C<Auth-Login-Attempt>[m
[31m-header).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the APOP or CRAM-MD5 are used, request-response will look as follows:[m
[31m-[m
[31m-    [m
[31m-    GET /auth HTTP/1.0[m
[31m-    Host: localhost[m
[31m-    Auth-Method: apop[m
[31m-    Auth-User: user[m
[31m-    Auth-Salt: <238188073.1163692009@mail.example.com>[m
[31m-    Auth-Pass: auth_response[m
[31m-    Auth-Protocol: imap[m
[31m-    Auth-Login-Attempt: 1[m
[31m-    Client-IP: 192.0.2.42[m
[31m-    Client-Host: client.example.org[m
[31m-[m
[31m-[m
[31m-Good response:[m
[31m-[m
[31m-    [m
[31m-    HTTP/1.0 200 OK[m
[31m-    Auth-Status: OK[m
[31m-    Auth-Server: 198.51.100.1[m
[31m-    Auth-Port: 143[m
[31m-    Auth-Pass: plain-text-pass[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<Auth-User> header exists in the response,[m
[31m-it overrides the username used to authenticate with the backend.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the SMTP, the response additionally takes into account[m
[31m-the C<Auth-Error-Code> header — if exists, it is used[m
[31m-as a response code in case of an error.[m
[31m-Otherwise, the 535 5.7.0 code will be added to[m
[31m-the C<Auth-Status> header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, if the following response is received[m
[31m-from the authentication server:[m
[31m-[m
[31m-    [m
[31m-    HTTP/1.0 200 OK[m
[31m-    Auth-Status: Temporary server problem, try again later[m
[31m-    Auth-Error-Code: 451 4.3.0[m
[31m-    Auth-Wait: 3[m
[31m-[m
[31m-[m
[31m-then the SMTP client will receive an error[m
[31m-[m
[31m-    [m
[31m-    451 4.3.0 Temporary server problem, try again later[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If proxying SMTP does not require authentication,[m
[31m-the request will look as follows:[m
[31m-[m
[31m-    [m
[31m-    GET /auth HTTP/1.0[m
[31m-    Host: localhost[m
[31m-    Auth-Method: none[m
[31m-    Auth-User:[m
[31m-    Auth-Pass:[m
[31m-    Auth-Protocol: smtp[m
[31m-    Auth-Login-Attempt: 1[m
[31m-    Client-IP: 192.0.2.42[m
[31m-    Client-Host: client.example.org[m
[31m-    Auth-SMTP-Helo: client.example.org[m
[31m-    Auth-SMTP-From: MAIL FROM: <>[m
[31m-    Auth-SMTP-To: RCPT TO: <postmaster@mail.example.com>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the SSLE<sol>TLS client connection (1.7.11),[m
[31m-the C<Auth-SSL> header is added, and[m
[31m-C<Auth-SSL-Verify> will contain[m
[31m-the result of client certificate verification, if[m
[31m-L<enabled|ngx_mail_ssl_module>:[m
[31m-“C<SUCCESS>”, “C<FAILED>”, and[m
[31m-“C<NONE>” if a certificate was not present.[m
[31m-When the client certificate was present,[m
[31m-its details are passed in the following request headers:[m
[31m-C<Auth-SSL-Subject>, C<Auth-SSL-Issuer>,[m
[31m-C<Auth-SSL-Serial>, and C<Auth-SSL-Fingerprint>.[m
[31m-If L</auth_http_pass_client_cert> is enabled,[m
[31m-the certificate itself is passed in the[m
[31m-C<Auth-SSL-Cert> header.[m
[31m-The request will look as follows:[m
[31m-[m
[31m-    [m
[31m-    GET /auth HTTP/1.0[m
[31m-    Host: localhost[m
[31m-    Auth-Method: plain[m
[31m-    Auth-User: user[m
[31m-    Auth-Pass: password[m
[31m-    Auth-Protocol: imap[m
[31m-    Auth-Login-Attempt: 1[m
[31m-    Client-IP: 192.0.2.42[m
[31m-    Auth-SSL: on[m
[31m-    Auth-SSL-Verify: SUCCESS[m
[31m-    Auth-SSL-Subject: /CN=example.com[m
[31m-    Auth-SSL-Issuer: /CN=example.com[m
[31m-    Auth-SSL-Serial: C07AD56B846B5BFF[m
[31m-    Auth-SSL-Fingerprint: 29d6a80a123d13355ed16b4b04605e29cb55a5ad[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_core_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_core_module.pod[m
[1mdeleted file mode 100644[m
[1mindex ffd7a4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_core_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,553 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_core_module - Module ngx_mail_core_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be[m
[31m-enabled with[m
[31m-the C<--with-mail> configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    worker_processes 1;[m
[31m-    [m
[31m-    error_log /var/log/nginx/error.log info;[m
[31m-    [m
[31m-    events {[m
[31m-        worker_connections  1024;[m
[31m-    }[m
[31m-    [m
[31m-    mail {[m
[31m-        server_name       mail.example.com;[m
[31m-        auth_http         localhost:9000/cgi-bin/nginxauth.cgi;[m
[31m-    [m
[31m-        imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA;[m
[31m-    [m
[31m-        pop3_auth         plain apop cram-md5;[m
[31m-        pop3_capabilities LAST TOP USER PIPELINING UIDL;[m
[31m-    [m
[31m-        smtp_auth         login plain cram-md5;[m
[31m-        smtp_capabilities "SIZE 10485760" ENHANCEDSTATUSCODES 8BITMIME DSN;[m
[31m-        xclient           off;[m
[31m-    [m
[31m-        server {[m
[31m-            listen   25;[m
[31m-            protocol smtp;[m
[31m-        }[m
[31m-        server {[m
[31m-            listen   110;[m
[31m-            protocol pop3;[m
[31m-            proxy_pass_error_message on;[m
[31m-        }[m
[31m-        server {[m
[31m-            listen   143;[m
[31m-            protocol imap;[m
[31m-        }[m
[31m-        server {[m
[31m-            listen   587;[m
[31m-            protocol smtp;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 listen[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    I<C<address>>:I<C<port>>[m
[31m-    [C<ssl>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<bind>][m
[31m-    [C<ipv6only>=C<on>E<verbar>C<off>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<address>> and I<C<port>> for the socket[m
[31m-on which the server will accept requests.[m
[31m-It is possible to specify just the port.[m
[31m-The address can also be a hostname, for example:[m
[31m-[m
[31m-    [m
[31m-    listen 127.0.0.1:110;[m
[31m-    listen *:110;[m
[31m-    listen 110;     # same as *:110[m
[31m-    listen localhost:110;[m
[31m-[m
[31m-[m
[31m-IPv6 addresses (0.7.58) are specified in square brackets:[m
[31m-[m
[31m-    [m
[31m-    listen [::1]:110;[m
[31m-    listen [::]:110;[m
[31m-[m
[31m-[m
[31m-UNIX-domain sockets (1.3.5) are specified with the “C<unix:>”[m
[31m-prefix:[m
[31m-[m
[31m-    [m
[31m-    listen unix:/var/run/nginx.sock;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Different servers must listen on different[m
[31m-I<C<address>>:I<C<port>> pairs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ssl> parameter allows specifying that all[m
[31m-connections accepted on this port should work in SSL mode.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<listen> directive[m
[31m-can have several additional parameters specific to socket-related system calls.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backlog>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the C<backlog> parameter in the[m
[31m-C<listen> call that limits[m
[31m-the maximum length for the queue of pending connections (1.9.2).[m
[31m-By default,[m
[31m-C<backlog> is set to -1 on FreeBSD, DragonFly BSD, and Mac OS X,[m
[31m-and to 511 on other platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<bind>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter instructs to make a separate C<bind>[m
[31m-call for a given address:port pair.[m
[31m-The fact is that if there are several C<listen> directives with[m
[31m-the same port but different addresses, and one of the[m
[31m-C<listen> directives listens on all addresses[m
[31m-for the given port (C<*:>I<C<port>>), nginx will[m
[31m-C<bind> only to C<*:>I<C<port>>.[m
[31m-It should be noted that the C<getsockname> system call will be[m
[31m-made in this case to determine the address that accepted the connection.[m
[31m-If the C<ipv6only>[m
[31m-or C<so_keepalive> parameters[m
[31m-are used then for a given[m
[31m-I<C<address>>:I<C<port>> pair[m
[31m-a separate C<bind> call will always be made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<ipv6only>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter determines[m
[31m-(via the C<IPV6_V6ONLY> socket option)[m
[31m-whether an IPv6 socket listening on a wildcard address C<[::]>[m
[31m-will accept only IPv6 connections or both IPv6 and IPv4 connections.[m
[31m-This parameter is turned on by default.[m
[31m-It can only be set once on start.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter configures the “TCP keepalive” behavior[m
[31m-for the listening socket.[m
[31m-If this parameter is omitted then the operating system’s settings will be[m
[31m-in effect for the socket.[m
[31m-If it is set to the value “C<on>”, the[m
[31m-C<SO_KEEPALIVE> option is turned on for the socket.[m
[31m-If it is set to the value “C<off>”, the[m
[31m-C<SO_KEEPALIVE> option is turned off for the socket.[m
[31m-Some operating systems support setting of TCP keepalive parameters on[m
[31m-a per-socket basis using the C<TCP_KEEPIDLE>,[m
[31m-C<TCP_KEEPINTVL>, and C<TCP_KEEPCNT> socket options.[m
[31m-On such systems (currently, Linux 2.4+, NetBSD 5+, and[m
[31m-FreeBSD 9.0-STABLE), they can be configured[m
[31m-using the I<C<keepidle>>, I<C<keepintvl>>, and[m
[31m-I<C<keepcnt>> parameters.[m
[31m-One or two parameters may be omitted, in which case the system default setting[m
[31m-for the corresponding socket option will be in effect.[m
[31m-For example,[m
[31m-[m
[31m-    so_keepalive=30m::10[m
[31m-[m
[31m-will set the idle timeout (C<TCP_KEEPIDLE>) to 30 minutes,[m
[31m-leave the probe interval (C<TCP_KEEPINTVL>) at its system default,[m
[31m-and set the probes count (C<TCP_KEEPCNT>) to 10 probes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mail[m
[31m-[m
[31m-[m
[31m-mail { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Provides the configuration file context in which the mail server directives[m
[31m-are specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 protocol[m
[31m-[m
[31m-[m
[31m-B<syntax:> protocol I<[m
[31m-  C<imap> E<verbar>[m
[31m-  C<pop3> E<verbar>[m
[31m-  C<smtp>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the protocol for a proxied server.[m
[31m-Supported protocols are[m
[31m-L<IMAP|ngx_mail_imap_module>,[m
[31m-L<POP3|ngx_mail_pop3_module>, and[m
[31m-L<SMTP|ngx_mail_smtp_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is not set, the protocol can be detected automatically[m
[31m-based on the well-known port specified in the L</listen>[m
[31m-directive:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<imap>: 143, 993[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pop3>: 110, 995[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<smtp>: 25, 587, 465[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Unnecessary protocols can be disabled using the[m
[31m-L<configuration|configure>[m
[31m-parameters C<--without-mail_imap_module>,[m
[31m-C<--without-mail_pop3_module>, and[m
[31m-C<--without-mail_smtp_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver I<[m
[31m-I<C<address>> ...[m
[31m-[C<valid>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures name servers used to find the client’s hostname[m
[31m-to pass it to the[m
[31m-L<authentication server|ngx_mail_auth_http_module>,[m
[31m-and in the[m
[31m-L<XCLIENT|ngx_mail_proxy_module>[m
[31m-command when proxying SMTP.[m
[31m-For example:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353;[m
[31m-[m
[31m-[m
[31m-An address can be specified as a domain name or IP address,[m
[31m-and an optional port (1.3.1, 1.2.2).[m
[31m-If port is not specified, the port 53 is used.[m
[31m-Name servers are queried in a round-robin fashion.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.7, only a single name server could be configured.[m
[31m-Specifying name servers using IPv6 addresses is supported[m
[31m-starting from versions 1.3.1 and 1.2.2.[m
[31m-[m
[31m-By default, nginx caches answers using the TTL value of a response.[m
[31m-An optional C<valid> parameter allows overriding it:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353 valid=30s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.9, tuning of caching time was not possible,[m
[31m-and nginx always cached answers for the duration of 5 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<off> disables resolving.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for DNS operations, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-server { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the configuration for a server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<hostname>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the server name that is used:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-in the initial POP3E<sol>SMTP server greeting;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-in the salt during the SASL CRAM-MD5 authentication;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-in the C<EHLO> command when connecting to the SMTP backend,[m
[31m-if the passing of the[m
[31m-L<XCLIENT|ngx_mail_proxy_module> command[m
[31m-is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is not specified, the machine’s hostname is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the timeout that is used before proxying to the backend starts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_imap_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_imap_module.pod[m
[1mdeleted file mode 100644[m
[1mindex b50c10a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_imap_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,153 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_imap_module - Module ngx_mail_imap_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 imap_auth[m
[31m-[m
[31m-[m
[31m-B<syntax:> imap_auth I<I<C<method>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<plain>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets permitted methods of authentication for IMAP clients.[m
[31m-Supported methods are:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<login>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH=LOGIN|http://tools.ietf.org/html/draft-murchison-sasl-login-00>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<plain>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH=PLAIN|http://tools.ietf.org/html/rfc4616>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<cram-md5>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH=CRAM-MD5|http://tools.ietf.org/html/rfc2195>.[m
[31m-In order for this method to work, the password must be stored unencrypted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 imap_capabilities[m
[31m-[m
[31m-[m
[31m-B<syntax:> imap_capabilities I<I<C<extension>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<IMAP4 IMAP4rev1 UIDPLUS>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the[m
[31m-L<IMAP protocol|http://tools.ietf.org/html/rfc3501>[m
[31m-extensions list that is passed to the client in response to[m
[31m-the C<CAPABILITY> command.[m
[31m-The authentication methods specified in the L</imap_auth> and[m
[31m-L<STARTTLS|http://tools.ietf.org/html/rfc2595> directives[m
[31m-are automatically added to this list if the[m
[31m-L<ngx_mail_ssl_module> directive is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It makes sense to specify the extensions[m
[31m-supported by the IMAP backends[m
[31m-to which the clients are proxied (if these extensions are related to commands[m
[31m-used after the authentication, when nginx transparently proxies a client[m
[31m-connection to the backend).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current list of standardized extensions is published at[m
[31m-L<www.iana.org|http://www.iana.org/assignments/imap4-capabilities>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 imap_client_buffer[m
[31m-[m
[31m-[m
[31m-B<syntax:> imap_client_buffer I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the IMAP commands read buffer size.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_pop3_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_pop3_module.pod[m
[1mdeleted file mode 100644[m
[1mindex df24f39..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_pop3_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_pop3_module - Module ngx_mail_pop3_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 pop3_auth[m
[31m-[m
[31m-[m
[31m-B<syntax:> pop3_auth I<I<C<method>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<plain>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets permitted methods of authentication for POP3 clients.[m
[31m-Supported methods are:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<plain>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<USERE<sol>PASS|http://tools.ietf.org/html/rfc1939>,[m
[31m-L<AUTH PLAIN|http://tools.ietf.org/html/rfc4616>,[m
[31m-L<AUTH LOGIN|http://tools.ietf.org/html/draft-murchison-sasl-login-00>.[m
[31m-It is not possible to disable these methods.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<apop>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<APOP|http://tools.ietf.org/html/rfc1939>.[m
[31m-In order for this method to work, the password must be stored unencrypted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<cram-md5>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH CRAM-MD5|http://tools.ietf.org/html/rfc2195>.[m
[31m-In order for this method to work, the password must be stored unencrypted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 pop3_capabilities[m
[31m-[m
[31m-[m
[31m-B<syntax:> pop3_capabilities I<I<C<extension>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TOP USER UIDL>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the[m
[31m-L<POP3 protocol|http://tools.ietf.org/html/rfc2449>[m
[31m-extensions list that is passed to the client in response to[m
[31m-the C<CAPA> command.[m
[31m-[m
[31m-The authentication methods specified in the L</pop3_auth> and[m
[31m-(L<SASL|http://tools.ietf.org/html/rfc2449> extension) and[m
[31m-L<STLS|http://tools.ietf.org/html/rfc2595> directives,[m
[31m-are automatically added to this list if the[m
[31m-L<ngx_mail_ssl_module> directive is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It makes sense to specify the extensions[m
[31m-supported by the POP3 backends[m
[31m-to which the clients are proxied (if these extensions are related to commands[m
[31m-used after the authentication, when nginx transparently proxies the client[m
[31m-connection to the backend).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current list of standardized extensions is published at[m
[31m-L<www.iana.org|http://www.iana.org/assignments/pop3-extension-mechanism>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_proxy_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_proxy_module.pod[m
[1mdeleted file mode 100644[m
[1mindex fa1f6f1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_proxy_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,211 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_proxy_module - Module ngx_mail_proxy_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 proxy_buffer[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffer I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the size of the buffer used for proxying.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-Depending on a platform, it is either 4K or 8K.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass_error_message[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass_error_message I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether to pass the error message obtained during[m
[31m-the authentication on the backend to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usually, if the authentication in nginx is a success,[m
[31m-the backend cannot return an error.[m
[31m-If it nevertheless returns an error,[m
[31m-it means some internal error has occurred.[m
[31m-In such case the backend message can contain information[m
[31m-that should not be shown to the client.[m
[31m-However, responding with an error for the correct password[m
[31m-is a normal behavior for some POP3 servers.[m
[31m-For example, CommuniGatePro informs a user about[m
[31m-L<mailbox[m
[31m-overflow|http://www.stalker.com/CommuniGatePro/Alerts.html#Quota> or other events by periodically outputting the[m
[31m-L<authentication[m
[31m-error|http://www.stalker.com/CommuniGatePro/POP.html#Alerts>.[m
[31m-The directive should be enabled in this case.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_timeout I<I<C<timeout>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<24h>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<timeout>> between two successive[m
[31m-read or write operations on client or proxied server connections.[m
[31m-If no data is transmitted within this time, the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xclient[m
[31m-[m
[31m-[m
[31m-B<syntax:> xclient I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the passing of the[m
[31m-L<XCLIENT|http://www.postfix.org/XCLIENT_README.html>[m
[31m-command with client parameters when connecting to the SMTP backend.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With C<XCLIENT>, the MTA is able to write client information[m
[31m-to the log and apply various limitations based on this data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<XCLIENT> is enabled[m
[31m-then nginx passes the following commands when connecting to the backend:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<EHLO> with the[m
[31m-L<server name|ngx_mail_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<[m
[31m-XCLIENT[m
[31m->[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<EHLO> or C<HELO>,[m
[31m-as passed by the client[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the name[m
[31m-L<found|ngx_mail_core_module>[m
[31m-by the client IP address points to the same address,[m
[31m-it is passed in the C<NAME> parameter[m
[31m-of the C<XCLIENT> command.[m
[31m-If the name could not be found, points to a different address,[m
[31m-or L<ngx_mail_core_module> is not specified,[m
[31m-the C<[UNAVAILABLE]> is passed[m
[31m-in the C<NAME> parameter.[m
[31m-If an error has occurred in the process of resolving,[m
[31m-the C<[TEMPUNAVAIL]> value is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<XCLIENT> is disabled[m
[31m-then nginx passes the C<EHLO> command with the[m
[31m-L<server name|ngx_mail_core_module>[m
[31m-when connecting to the backend if the client has passed[m
[31m-C<EHLO>,[m
[31m-or C<HELO> with the server name, otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_smtp_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_smtp_module.pod[m
[1mdeleted file mode 100644[m
[1mindex c13f764..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_smtp_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_smtp_module - Module ngx_mail_smtp_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 smtp_auth[m
[31m-[m
[31m-[m
[31m-B<syntax:> smtp_auth I<I<C<method>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<login plain>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets permitted methods of[m
[31m-L<SASL authentication|http://tools.ietf.org/html/rfc2554>[m
[31m-for SMTP clients.[m
[31m-Supported methods are:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<login>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH LOGIN|http://tools.ietf.org/html/draft-murchison-sasl-login-00>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<plain>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH PLAIN|http://tools.ietf.org/html/rfc4616>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<cram-md5>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH CRAM-MD5|http://tools.ietf.org/html/rfc2195>.[m
[31m-In order for this method to work, the password must be stored unencrypted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Authentication is not required.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 smtp_capabilities[m
[31m-[m
[31m-[m
[31m-B<syntax:> smtp_capabilities I<I<C<extension>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the SMTP protocol extensions list[m
[31m-that is passed to the client in response to the[m
[31m-C<EHLO> command.[m
[31m-Authentication methods specified in the L</smtp_auth> directive[m
[31m-are automatically added to this list.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It makes sense to specify the extensions[m
[31m-supported by the MTA[m
[31m-to which the clients are proxied (if these extensions are related to commands[m
[31m-used after the authentication, when nginx transparently proxies the client[m
[31m-connection to the backend).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current list of standardized extensions is published at[m
[31m-L<www.iana.org|http://www.iana.org/assignments/mail-parameters>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_ssl_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_ssl_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 88121b7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_mail_ssl_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,933 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_ssl_module - Module ngx_mail_ssl_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_mail_ssl_module> module provides the necessary[m
[31m-support for a mail proxy server to work with the SSLE<sol>TLS protocol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with[m
[31m-the C<--with-mail_ssl_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires the L<OpenSSL|http://www.openssl.org>[m
[31m-library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-To reduce the processor load, it is recommended to[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-set the number of worker processes equal to the number of processors,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-enable the shared session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-disable the built-in session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and possibly increase the session lifetime (by default, 5 minutes):[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    <emphasis>worker_processes auto;</emphasis>[m
[31m-    [m
[31m-    mail {[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            listen              993 ssl;[m
[31m-    [m
[31m-            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-            ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;[m
[31m-            ssl_certificate     /usr/local/nginx/conf/cert.pem;[m
[31m-            ssl_certificate_key /usr/local/nginx/conf/cert.key;[m
[31m-            <emphasis>ssl_session_cache   shared:SSL:10m;</emphasis>[m
[31m-            <emphasis>ssl_session_timeout 10m;</emphasis>[m
[31m-    [m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ssl[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the SSLE<sol>TLS protocol for the given server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-for the given server.[m
[31m-If intermediate certificates should be specified in addition to a primary[m
[31m-certificate, they should be specified in the same file in the following[m
[31m-order: the primary certificate comes first, then the intermediate certificates.[m
[31m-A secret key in the PEM format may be placed in the same file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-for the given server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>> (1.7.9),[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<HIGH:!aNULL:!MD5>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers.[m
[31m-The ciphers are specified in the format understood by the[m
[31m-OpenSSL library, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The previous versions of nginx used[m
[31m-L<different|configuring_https_servers>[m
[31m-ciphers by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_client_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_client_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify client certificates.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The list of certificates will be sent to clients.[m
[31m-If this is not desired, the L</ssl_trusted_certificate>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-client certificates.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_dhparam[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_dhparam I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with DH parameters for DHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ecdh_curve[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ecdh_curve I<I<C<curve>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<auto>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<curve>> for ECDHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using OpenSSL 1.0.2 or higher,[m
[31m-it is possible to specify multiple curves (1.11.0), for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ecdh_curve prime256v1:secp384r1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<auto> (1.11.0) instructs nginx to use[m
[31m-a list built into the OpenSSL library when using OpenSSL 1.0.2 or higher,[m
[31m-or C<prime256v1> with older versions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.11.0,[m
[31m-the C<prime256v1> curve was used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    mail {[m
[31m-        ssl_password_file /etc/keys/global.pass;[m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            server_name mail1.example.com;[m
[31m-            ssl_certificate_key /etc/keys/first.key;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            server_name mail2.example.com;[m
[31m-    [m
[31m-            # named pipe can also be used instead of a file[m
[31m-            ssl_password_file /etc/keys/fifo;[m
[31m-            ssl_certificate_key /etc/keys/second.key;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_prefer_server_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_prefer_server_ciphers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that server ciphers should be preferred over client ciphers[m
[31m-when the SSLv3 and TLS protocols are used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols.[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters work[m
[31m-only when the OpenSSL library of version 1.0.1 or higher is used.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters are[m
[31m-supported starting from versions 1.1.13 and 1.0.12[m
[31m-so when the OpenSSL version 1.0.1 or higher[m
[31m-is used on older nginx versions, these protocols work, but cannot[m
[31m-be disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_cache I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<none> E<verbar>[m
[31m-    [C<builtin>[:I<C<size>>]][m
[31m-    [C<shared>:I<C<name>>:I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the types and sizes of caches that store session parameters.[m
[31m-A cache can be of any of the following types:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is strictly prohibited:[m
[31m-nginx explicitly tells a client that sessions may not be reused.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is gently disallowed:[m
[31m-nginx tells a client that sessions may be reused, but does not[m
[31m-actually store session parameters in the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<builtin>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache built in OpenSSL; used by one worker process only.[m
[31m-The cache size is specified in sessions.[m
[31m-If size is not given, it is equal to 20480 sessions.[m
[31m-Use of the built-in cache can cause memory fragmentation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<shared>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache shared between all worker processes.[m
[31m-The cache size is specified in bytes; one megabyte can store[m
[31m-about 4000 sessions.[m
[31m-Each shared cache should have an arbitrary name.[m
[31m-A cache with the same name can be used in several[m
[31m-servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Both cache types can be used simultaneously, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_cache builtin:1000 shared:SSL:10m;[m
[31m-[m
[31m-[m
[31m-but using only shared cache without the built-in cache should[m
[31m-be more efficient.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_ticket_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_ticket_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<file>> with the secret key used to encrypt[m
[31m-and decrypt TLS session tickets.[m
[31m-The directive is necessary if the same key has to be shared between[m
[31m-multiple servers.[m
[31m-By default, a randomly generated key is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several keys are specified, only the first key is[m
[31m-used to encrypt TLS session tickets.[m
[31m-This allows configuring key rotation, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_ticket_key current.key;[m
[31m-    ssl_session_ticket_key previous.key;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<file>> must contain 48 bytes of random data and can[m
[31m-be created using the following command:[m
[31m-[m
[31m-    [m
[31m-    openssl rand 48 > ticket.key[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_tickets[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_tickets I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables session resumption through[m
[31m-L<TLS session tickets|http://tools.ietf.org/html/rfc5077>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a time during which a client may reuse the[m
[31m-session parameters stored in a cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify client certificates.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In contrast to the certificate set by L</ssl_client_certificate>,[m
[31m-the list of these certificates will not be sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_verify_client[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_verify_client I<[m
[31m-    C<on> E<verbar> C<off> E<verbar>[m
[31m-    C<optional> E<verbar> C<optional_no_ca>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables verification of client certificates.[m
[31m-The verification result is passed in the[m
[31m-C<Auth-SSL-Verify> header of the[m
[31m-L<authentication|ngx_mail_auth_http_module>[m
[31m-request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<optional> parameter requests the client[m
[31m-certificate and verifies it if the certificate is present.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<optional_no_ca> parameter[m
[31m-requests the client[m
[31m-certificate but does not require it to be signed by a trusted CA certificate.[m
[31m-This is intended for the use in cases when a service that is external to nginx[m
[31m-performs the actual certificate verification.[m
[31m-The contents of the certificate is accessible through requests[m
[31m-L<sent|ngx_mail_auth_http_module>[m
[31m-to the authentication server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the client certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 starttls[m
[31m-[m
[31m-[m
[31m-B<syntax:> starttls I<[m
[31m-  C<on> E<verbar>[m
[31m-  C<off> E<verbar>[m
[31m-  C<only>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<on>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-allow usage of the C<STLS> command for the POP3[m
[31m-and the C<STARTTLS> command for the IMAP;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-deny usage of the C<STLS>[m
[31m-and C<STARTTLS> commands;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<only>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-require preliminary TLS transition.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_access_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_access_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 9880032..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_access_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_access_module - Module ngx_stream_access_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_access_module> module (1.9.2) allows[m
[31m-limiting access to certain client addresses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        deny  192.168.1.1;[m
[31m-        allow 192.168.1.0/24;[m
[31m-        allow 10.1.1.0/16;[m
[31m-        allow 2001:0db8::/32;[m
[31m-        deny  all;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The rules are checked in sequence until the first match is found.[m
[31m-In this example, access is allowed only for IPv4 networks[m
[31m-C<10.1.1.0E<sol>16> and C<192.168.1.0E<sol>24>[m
[31m-excluding the address C<192.168.1.1>,[m
[31m-and for IPv6 network C<2001:0db8::E<sol>32>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 allow[m
[31m-[m
[31m-[m
[31m-B<syntax:> allow I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:> E<verbar>[m
[31m-    C<all>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows access for the specified network or address.[m
[31m-If the special value C<unix:> is specified,[m
[31m-allows access for all UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 deny[m
[31m-[m
[31m-[m
[31m-B<syntax:> deny I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:> E<verbar>[m
[31m-    C<all>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Denies access for the specified network or address.[m
[31m-If the special value C<unix:> is specified,[m
[31m-denies access for all UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_core_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_core_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 6acea88..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_core_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,454 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_core_module - Module ngx_stream_core_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_core_module> module[m
[31m-is available since version 1.9.0.[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-stream>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    worker_processes auto;[m
[31m-    [m
[31m-    error_log /var/log/nginx/error.log info;[m
[31m-    [m
[31m-    events {[m
[31m-        worker_connections  1024;[m
[31m-    }[m
[31m-    [m
[31m-    stream {[m
[31m-        upstream backend {[m
[31m-            hash $remote_addr consistent;[m
[31m-    [m
[31m-            server backend1.example.com:12345 weight=5;[m
[31m-            server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;[m
[31m-            server unix:/tmp/backend3;[m
[31m-        }[m
[31m-    [m
[31m-        upstream dns {[m
[31m-           server 192.168.0.1:53535;[m
[31m-           server dns.example.com:53;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 12345;[m
[31m-            proxy_connect_timeout 1s;[m
[31m-            proxy_timeout 3s;[m
[31m-            proxy_pass backend;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 127.0.0.1:53 udp;[m
[31m-            proxy_responses 1;[m
[31m-            proxy_timeout 20s;[m
[31m-            proxy_pass dns;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen [::1]:12345;[m
[31m-            proxy_pass unix:/tmp/stream.socket;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 listen[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    I<C<address>>:I<C<port>>[m
[31m-    [C<ssl>][m
[31m-    [C<udp>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<bind>][m
[31m-    [C<ipv6only>=C<on>E<verbar>C<off>][m
[31m-    [C<reuseport>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<address>> and I<C<port>> for the socket[m
[31m-on which the server will accept connections.[m
[31m-It is possible to specify just the port.[m
[31m-The address can also be a hostname, for example:[m
[31m-[m
[31m-    [m
[31m-    listen 127.0.0.1:12345;[m
[31m-    listen *:12345;[m
[31m-    listen 12345;     # same as *:12345[m
[31m-    listen localhost:12345;[m
[31m-[m
[31m-[m
[31m-IPv6 addresses are specified in square brackets:[m
[31m-[m
[31m-    [m
[31m-    listen [::1]:12345;[m
[31m-    listen [::]:12345;[m
[31m-[m
[31m-[m
[31m-UNIX-domain sockets are specified with the “C<unix:>”[m
[31m-prefix:[m
[31m-[m
[31m-    [m
[31m-    listen unix:/var/run/nginx.sock;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ssl> parameter allows specifying that all[m
[31m-connections accepted on this port should work in SSL mode.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<udp> parameter configures a listening socket[m
[31m-for working with datagrams (1.9.13).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<listen> directive[m
[31m-can have several additional parameters specific to socket-related system calls.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backlog>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the C<backlog> parameter in the[m
[31m-C<listen> call that limits[m
[31m-the maximum length for the queue of pending connections (1.9.2).[m
[31m-By default,[m
[31m-C<backlog> is set to -1 on FreeBSD, DragonFly BSD, and Mac OS X,[m
[31m-and to 511 on other platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<bind>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter instructs to make a separate C<bind>[m
[31m-call for a given address:port pair.[m
[31m-The fact is that if there are several C<listen> directives with[m
[31m-the same port but different addresses, and one of the[m
[31m-C<listen> directives listens on all addresses[m
[31m-for the given port (C<*:>I<C<port>>), nginx will[m
[31m-C<bind> only to C<*:>I<C<port>>.[m
[31m-It should be noted that the C<getsockname> system call will be[m
[31m-made in this case to determine the address that accepted the connection.[m
[31m-If the C<ipv6only>[m
[31m-or C<so_keepalive> parameters[m
[31m-are used then for a given[m
[31m-I<C<address>>:I<C<port>> pair[m
[31m-a separate C<bind> call will always be made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<ipv6only>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter determines[m
[31m-(via the C<IPV6_V6ONLY> socket option)[m
[31m-whether an IPv6 socket listening on a wildcard address C<[::]>[m
[31m-will accept only IPv6 connections or both IPv6 and IPv4 connections.[m
[31m-This parameter is turned on by default.[m
[31m-It can only be set once on start.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<reuseport>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (1.9.1) instructs to create an individual listening socket[m
[31m-for each worker process[m
[31m-(using the C<SO_REUSEPORT> socket option), allowing a kernel[m
[31m-to distribute incoming connections between worker processes.[m
[31m-This currently works only on Linux 3.9+ and DragonFly BSD.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Inappropriate use of this option may have its security[m
[31m-L<implications|http://man7.org/linux/man-pages/man7/socket.7.html>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter configures the “TCP keepalive” behavior[m
[31m-for the listening socket.[m
[31m-If this parameter is omitted then the operating system’s settings will be[m
[31m-in effect for the socket.[m
[31m-If it is set to the value “C<on>”, the[m
[31m-C<SO_KEEPALIVE> option is turned on for the socket.[m
[31m-If it is set to the value “C<off>”, the[m
[31m-C<SO_KEEPALIVE> option is turned off for the socket.[m
[31m-Some operating systems support setting of TCP keepalive parameters on[m
[31m-a per-socket basis using the C<TCP_KEEPIDLE>,[m
[31m-C<TCP_KEEPINTVL>, and C<TCP_KEEPCNT> socket options.[m
[31m-On such systems (currently, Linux 2.4+, NetBSD 5+, and[m
[31m-FreeBSD 9.0-STABLE), they can be configured[m
[31m-using the I<C<keepidle>>, I<C<keepintvl>>, and[m
[31m-I<C<keepcnt>> parameters.[m
[31m-One or two parameters may be omitted, in which case the system default setting[m
[31m-for the corresponding socket option will be in effect.[m
[31m-For example,[m
[31m-[m
[31m-    so_keepalive=30m::10[m
[31m-[m
[31m-will set the idle timeout (C<TCP_KEEPIDLE>) to 30 minutes,[m
[31m-leave the probe interval (C<TCP_KEEPINTVL>) at its system default,[m
[31m-and set the probes count (C<TCP_KEEPCNT>) to 10 probes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Different servers must listen on different[m
[31m-I<C<address>>:I<C<port>> pairs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver I<[m
[31m-    I<C<address>> ...[m
[31m-    [C<valid>=I<C<time>>][m
[31m-    [C<ipv6>=C<on>E<verbar>C<off>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures name servers used to resolve names of upstream servers[m
[31m-into addresses, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353;[m
[31m-[m
[31m-[m
[31m-An address can be specified as a domain name or IP address,[m
[31m-and an optional port.[m
[31m-If port is not specified, the port 53 is used.[m
[31m-Name servers are queried in a round-robin fashion.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, nginx will look up both IPv4 and IPv6 addresses while resolving.[m
[31m-If looking up of IPv6 addresses is not desired,[m
[31m-the C<ipv6=off> parameter can be specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, nginx caches answers using the TTL value of a response.[m
[31m-The optional C<valid> parameter allows overriding it:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353 valid=30s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for name resolution, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-server { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the configuration for a server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 stream[m
[31m-[m
[31m-[m
[31m-stream { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Provides the configuration file context in which the stream server directives[m
[31m-are specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcp_nodelay[m
[31m-[m
[31m-[m
[31m-B<syntax:> tcp_nodelay I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of the C<TCP_NODELAY> option.[m
[31m-The option is enabled for both client and proxied server connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_limit_conn_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_limit_conn_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 113becd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_limit_conn_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,177 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_limit_conn_module - Module ngx_stream_limit_conn_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_limit_conn_module> module (1.9.3) is used to[m
[31m-limit the number of connections per the defined key, in[m
[31m-particular, the number of connections from a single IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    stream {[m
[31m-        limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-    [m
[31m-            ...[m
[31m-    [m
[31m-            limit_conn           addr 1;[m
[31m-            limit_conn_log_level error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 limit_conn[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn I<I<C<zone>> I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the shared memory zone[m
[31m-and the maximum allowed number of connections for a given key value.[m
[31m-When this limit is exceeded, the server will close the connection.[m
[31m-For example, the directives[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        limit_conn addr 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-allow only one connection per an IP address at a time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When several C<limit_conn> directives are specified,[m
[31m-any configured limit will apply.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<limit_conn>[m
[31m-directives on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_log_level[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_log_level I<[m
[31m-C<info> E<verbar>[m
[31m-C<notice> E<verbar>[m
[31m-C<warn> E<verbar>[m
[31m-C<error>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the desired logging level for cases when the server[m
[31m-limits the number of connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_zone I<[m
[31m-    I<C<key>>[m
[31m-    C<zone>=I<C<name>>:I<C<size>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets parameters for a shared memory zone[m
[31m-that will keep states for various keys.[m
[31m-In particular, the state includes the current number of connections.[m
[31m-Currently, the supported value for the I<C<key>> is[m
[31m-the client address in the binary form specified as[m
[31m-C<$binary_remote_addr>.[m
[31m-Connections with an empty key value are not accounted.[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-[m
[31m-[m
[31m-Here, the key is a client IP address set by the[m
[31m-C<$binary_remote_addr> key.[m
[31m-The size of C<$binary_remote_addr>[m
[31m-is 4 bytes for IPv4 addresses or 16 bytes for IPv6 addresses.[m
[31m-The stored state always occupies 32 or 64 bytes[m
[31m-on 32-bit platforms and 64 bytes on 64-bit platforms.[m
[31m-One megabyte zone can keep about 32 thousand 32-byte states[m
[31m-or about 16 thousand 64-byte states.[m
[31m-If the zone storage is exhausted, the server will close the connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_proxy_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_proxy_module.pod[m
[1mdeleted file mode 100644[m
[1mindex fc4fdc7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_proxy_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,832 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_proxy_module - Module ngx_stream_proxy_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_proxy_module> module (1.9.0) allows proxying[m
[31m-data streams over TCP, UDP (1.9.13), and UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen 127.0.0.1:12345;[m
[31m-        proxy_pass 127.0.0.1:8080;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen 12345;[m
[31m-        proxy_connect_timeout 1s;[m
[31m-        proxy_timeout 1m;[m
[31m-        proxy_pass example.com:12345;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen 53 udp;[m
[31m-        proxy_responses 1;[m
[31m-        proxy_timeout 20s;[m
[31m-        proxy_pass dns.example.com:53;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen [::1]:12345;[m
[31m-        proxy_pass unix:/tmp/stream.socket;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 proxy_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a proxied server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-The special value C<off> cancels the effect[m
[31m-of the C<proxy_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a proxied server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    proxy_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading data[m
[31m-from the proxied server.[m
[31m-Also sets the I<C<size>> of the buffer used for reading data[m
[31m-from the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_download_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_download_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the data from the proxied server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a connection, so if nginx simultaneously opens[m
[31m-two connections to the proxied server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When a connection to the proxied server cannot be established, determines[m
[31m-whether a client connection will be passed to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a connection to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time allowed to pass a connection to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a connection to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass I<I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the address of a proxied server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass localhost:12345;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass unix:/tmp/stream.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_stream_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_protocol[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_protocol I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the[m
[31m-L<PROXY[m
[31m-protocol|http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt> for connections to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_responses[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_responses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of datagrams expected from the proxied server[m
[31m-in response to the client request[m
[31m-if the L<UDP|ngx_stream_core_module>[m
[31m-protocol is used.[m
[31m-By default, the number of datagrams is not limited:[m
[31m-the response datagrams will be sent[m
[31m-until the L</proxy_timeout> value expires.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the SSLE<sol>TLS protocol for connections to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-used for authentication to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-used for authentication to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<DEFAULT>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers for connections to a proxied server.[m
[31m-The ciphers are specified in the format understood by the OpenSSL library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-the certificate of the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<host from proxy_pass>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows overriding the server name used to[m
[31m-verify[m
[31m-the certificate of the proxied server and to be[m
[31m-passed through SNI[m
[31m-when establishing a connection with the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the host part of the L</proxy_pass> address is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_server_name I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables passing of the server name through[m
[31m-L<TLS[m
[31m-Server Name Indication extension|http://en.wikipedia.org/wiki/Server_Name_Indication> (SNI, RFC 6066)[m
[31m-when establishing a connection with the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_session_reuse[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_session_reuse I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether SSL sessions can be reused when working with[m
[31m-the proxied server.[m
[31m-If the errors[m
[31m-“C<SSL3_GET_FINISHED:digest check failed>”[m
[31m-appear in the logs, try disabling session reuse.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols for connections to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify[m
[31m-the certificate of the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_verify[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_verify I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables verification of the proxied server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the proxied server certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_timeout I<I<C<timeout>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<10m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<timeout>> between two successive[m
[31m-read or write operations on client or proxied server connections.[m
[31m-If no data is transmitted within this time, the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_upload_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_upload_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the data from the client.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a connection, so if the client simultaneously opens[m
[31m-two connections,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_ssl_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_ssl_module.pod[m
[1mdeleted file mode 100644[m
[1mindex fad7fb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_ssl_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,623 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_ssl_module - Module ngx_stream_ssl_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_ssl_module> module (1.9.0)[m
[31m-provides the necessary support for a stream proxy server to work with[m
[31m-the SSLE<sol>TLS protocol.[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-stream_ssl_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-To reduce the processor load, it is recommended to[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-set the number of worker processes equal to the number of processors,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-enable the shared session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-disable the built-in session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and possibly increase the session lifetime (by default, 5 minutes):[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    <emphasis>worker_processes auto;</emphasis>[m
[31m-    [m
[31m-    stream {[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            listen              12345 ssl;[m
[31m-    [m
[31m-            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-            ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;[m
[31m-            ssl_certificate     /usr/local/nginx/conf/cert.pem;[m
[31m-            ssl_certificate_key /usr/local/nginx/conf/cert.key;[m
[31m-            <emphasis>ssl_session_cache   shared:SSL:10m;</emphasis>[m
[31m-            <emphasis>ssl_session_timeout 10m;</emphasis>[m
[31m-    [m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-for the given server.[m
[31m-If intermediate certificates should be specified in addition to a primary[m
[31m-certificate, they should be specified in the same file in the following[m
[31m-order: the primary certificate comes first, then the intermediate certificates.[m
[31m-A secret key in the PEM format may be placed in the same file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-for the given server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>>,[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<HIGH:!aNULL:!MD5>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers.[m
[31m-The ciphers are specified in the format understood by the[m
[31m-OpenSSL library, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_dhparam[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_dhparam I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with DH parameters for DHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ecdh_curve[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ecdh_curve I<I<C<curve>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<auto>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<curve>> for ECDHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using OpenSSL 1.0.2 or higher,[m
[31m-it is possible to specify multiple curves (1.11.0), for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ecdh_curve prime256v1:secp384r1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<auto> (1.11.0) instructs nginx to use[m
[31m-a list built into the OpenSSL library when using OpenSSL 1.0.2 or higher,[m
[31m-or C<prime256v1> with older versions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.11.0,[m
[31m-the C<prime256v1> curve was used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_handshake_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_handshake_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a timeout for the SSL handshake to complete.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    stream {[m
[31m-        ssl_password_file /etc/keys/global.pass;[m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            listen 127.0.0.1:12345;[m
[31m-            ssl_certificate_key /etc/keys/first.key;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 127.0.0.1:12346;[m
[31m-    [m
[31m-            # named pipe can also be used instead of a file[m
[31m-            ssl_password_file /etc/keys/fifo;[m
[31m-            ssl_certificate_key /etc/keys/second.key;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_prefer_server_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_prefer_server_ciphers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that server ciphers should be preferred over client ciphers[m
[31m-when the SSLv3 and TLS protocols are used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols.[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters work[m
[31m-only when the OpenSSL library of version 1.0.1 or higher is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_cache I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<none> E<verbar>[m
[31m-    [C<builtin>[:I<C<size>>]][m
[31m-    [C<shared>:I<C<name>>:I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the types and sizes of caches that store session parameters.[m
[31m-A cache can be of any of the following types:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is strictly prohibited:[m
[31m-nginx explicitly tells a client that sessions may not be reused.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is gently disallowed:[m
[31m-nginx tells a client that sessions may be reused, but does not[m
[31m-actually store session parameters in the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<builtin>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache built in OpenSSL; used by one worker process only.[m
[31m-The cache size is specified in sessions.[m
[31m-If size is not given, it is equal to 20480 sessions.[m
[31m-Use of the built-in cache can cause memory fragmentation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<shared>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache shared between all worker processes.[m
[31m-The cache size is specified in bytes; one megabyte can store[m
[31m-about 4000 sessions.[m
[31m-Each shared cache should have an arbitrary name.[m
[31m-A cache with the same name can be used in several[m
[31m-servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Both cache types can be used simultaneously, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_cache builtin:1000 shared:SSL:10m;[m
[31m-[m
[31m-[m
[31m-but using only shared cache without the built-in cache should[m
[31m-be more efficient.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_ticket_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_ticket_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<file>> with the secret key used to encrypt[m
[31m-and decrypt TLS session tickets.[m
[31m-The directive is necessary if the same key has to be shared between[m
[31m-multiple servers.[m
[31m-By default, a randomly generated key is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several keys are specified, only the first key is[m
[31m-used to encrypt TLS session tickets.[m
[31m-This allows configuring key rotation, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_ticket_key current.key;[m
[31m-    ssl_session_ticket_key previous.key;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<file>> must contain 48 bytes of random data and can[m
[31m-be created using the following command:[m
[31m-[m
[31m-    [m
[31m-    openssl rand 48 > ticket.key[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_tickets[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_tickets I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables session resumption through[m
[31m-L<TLS session tickets|http://tools.ietf.org/html/rfc5077>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a time during which a client may reuse the[m
[31m-session parameters stored in a cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_upstream_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_upstream_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 135f0a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/ngx_stream_upstream_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,992 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_upstream_module - Module ngx_stream_upstream_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_upstream_module> module (1.9.0)[m
[31m-is used to define groups of servers that can be referenced[m
[31m-by the L<ngx_stream_proxy_module>[m
[31m-directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    upstream <emphasis>backend</emphasis> {[m
[31m-        hash $remote_addr consistent;[m
[31m-    [m
[31m-        server backend1.example.com:12345  weight=5;[m
[31m-        server backend2.example.com:12345;[m
[31m-        server unix:/tmp/backend3;[m
[31m-    [m
[31m-        server backup1.example.com:12345   backup;[m
[31m-        server backup2.example.com:12345   backup;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen 12346;[m
[31m-        proxy_pass <emphasis>backend</emphasis>;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Dynamically configurable group,[m
[31m-available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-    [m
[31m-    resolver 10.0.0.1;[m
[31m-    [m
[31m-    upstream <emphasis>dynamic</emphasis> {[m
[31m-        zone upstream_dynamic 64k;[m
[31m-    [m
[31m-        server backend1.example.com:12345 weight=5;[m
[31m-        server backend2.example.com:12345 fail_timeout=5s slow_start=30s;[m
[31m-        server 192.0.2.1:12345            max_fails=3;[m
[31m-        server backend3.example.com:12345 resolve;[m
[31m-        server backend4.example.com       service=http resolve;[m
[31m-    [m
[31m-        server backup1.example.com:12345  backup;[m
[31m-        server backup2.example.com:12345  backup;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen 12346;[m
[31m-        proxy_pass <emphasis>dynamic</emphasis>;[m
[31m-        health_check;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> upstream I<I<C<name>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a group of servers.[m
[31m-Servers can listen on different ports.[m
[31m-In addition, servers listening on TCP and UNIX-domain sockets[m
[31m-can be mixed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        server backend1.example.com:12345 weight=5;[m
[31m-        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;[m
[31m-        server unix:/tmp/backend2;[m
[31m-        server backend3.example.com:12345 resolve;[m
[31m-    [m
[31m-        server backup1.example.com:12345  backup;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, connections are distributed between the servers using a[m
[31m-weighted round-robin balancing method.[m
[31m-In the above example, each 7 connections will be distributed as follows:[m
[31m-5 connections go to C<backend1.example.com:12345>[m
[31m-and one connection to each of the second and third servers.[m
[31m-If an error occurs during communication with a server, the connection will[m
[31m-be passed to the next server, and so on until all of the functioning[m
[31m-servers will be tried.[m
[31m-If communication with all servers fails, the connection will be closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-B<syntax:> server I<I<C<address>> [I<C<parameters>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<address>> and other I<C<parameters>>[m
[31m-of a server.[m
[31m-The address can be specified as a domain name or IP address[m
[31m-with an obligatory port, or as a UNIX-domain socket path[m
[31m-specified after the “C<unix:>” prefix.[m
[31m-A domain name that resolves to several IP addresses defines[m
[31m-multiple servers at once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following parameters can be defined:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<weight>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the weight of the server, by default, 1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_fails>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of unsuccessful attempts to communicate with the server[m
[31m-that should happen in the duration set by the C<fail_timeout>[m
[31m-parameter to consider the server unavailable for a duration also set by the[m
[31m-C<fail_timeout> parameter.[m
[31m-By default, the number of unsuccessful attempts is set to 1.[m
[31m-The zero value disables the accounting of attempts.[m
[31m-Here, an unsuccessful attempt is an error or timeout[m
[31m-while establishing a connection with the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fail_timeout>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the time during which the specified number of unsuccessful attempts to[m
[31m-communicate with the server should happen to consider the server unavailable;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and the period of time the server will be considered unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-By default, the parameter is set to 10 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backup>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-marks the server as a backup server.[m
[31m-Connections to the backup server will be passed[m
[31m-when the primary servers are unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<down>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-marks the server as permanently unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_conns>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-limits the maximum I<C<number>> of simultaneous connections to the[m
[31m-proxied server.[m
[31m-Default value is zero, meaning there is no limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<resolve>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-monitors changes of the IP addresses[m
[31m-that correspond to a domain name of the server,[m
[31m-and automatically modifies the upstream configuration[m
[31m-without the need of restarting nginx.[m
[31m-The server group must reside in the shared memory.[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-the L<ngx_stream_core_module> directive[m
[31m-must be specified in the[m
[31m-L<ngx_stream_core_module> block.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    stream {[m
[31m-        resolver 10.0.0.1;[m
[31m-    [m
[31m-        upstream u {[m
[31m-            zone ...;[m
[31m-            ...[m
[31m-            server example.com:12345 resolve;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<service>=I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables resolving of DNS[m
[31m-L<SRV|https://tools.ietf.org/html/rfc2782>[m
[31m-records and sets the service I<C<name>> (1.9.13).[m
[31m-In order for this parameter to work, it is necessary to specify[m
[31m-the L</resolve> parameter for the server[m
[31m-and specify a hostname without a port number.[m
[31m-[m
[31m-[m
[31m-If the service name does not contain a dot (“C<.>”), then[m
[31m-the L<RFC|https://tools.ietf.org/html/rfc2782>-compliant name[m
[31m-is constructed[m
[31m-and the TCP protocol is added to the service prefix.[m
[31m-For example, to look up the[m
[31m-C<_http._tcp.backend.example.com> SRV record,[m
[31m-it is necessary to specify the directive:[m
[31m-[m
[31m-    [m
[31m-    server backend.example.com service=http resolve;[m
[31m-[m
[31m-[m
[31m-If the service name contains one or more dots, then the name is constructed[m
[31m-by joining the service prefix and the server name.[m
[31m-For example, to look up the C<_http._tcp.backend.example.com>[m
[31m-and C<server1.backend.example.com> SRV records,[m
[31m-it is necessary to specify the directives:[m
[31m-[m
[31m-    [m
[31m-    server backend.example.com service=_http._tcp resolve;[m
[31m-    server example.com service=server1.backend resolve;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Highest-priority SRV records[m
[31m-(records with the same lowest-number priority value)[m
[31m-are resolved as primary servers,[m
[31m-the rest of SRV records are resolved as backup servers.[m
[31m-If the L</backup> parameter is specified for the server,[m
[31m-high-priority SRV records are resolved as backup servers,[m
[31m-the rest of SRV records are ignored.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<slow_start>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the I<C<time>> during which the server will recover its weight[m
[31m-from zero to a nominal value,[m
[31m-or when the server becomes available after a period of time[m
[31m-it was considered unavailable.[m
[31m-Default value is zero, i.e. slow start is disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-If there is only a single server in a group, C<max_fails>,[m
[31m-C<fail_timeout> and C<slow_start> parameters[m
[31m-are ignored, and such a server will never be considered unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> zone I<I<C<name>> [I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<name>> and I<C<size>> of the shared[m
[31m-memory zone that keeps the group’s configuration and run-time state that are[m
[31m-shared between worker processes.[m
[31m-Several groups may share the same zone.[m
[31m-In this case, it is enough to specify the zone size only once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-as part of our commercial subscription,[m
[31m-such groups allow changing the group membership[m
[31m-or modifying the settings of a particular server[m
[31m-without the need of restarting nginx.[m
[31m-The configuration is accessible via a special location[m
[31m-handled by[m
[31m-L<ngx_http_upstream_conf_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 state[m
[31m-[m
[31m-[m
[31m-B<syntax:> state I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> that keeps the state[m
[31m-of the dynamically configurable group.[m
[31m-The state is currently limited to the list of servers with their parameters.[m
[31m-The file is read when parsing the configuration and is updated each time[m
[31m-the upstream configuration is[m
[31m-L<changed|ngx_http_upstream_conf_module>.[m
[31m-Changing the file content directly should be avoided.[m
[31m-The directive cannot be used[m
[31m-along with the L</server> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Changes made during[m
[31m-L<configuration reload|control>[m
[31m-or L<binary upgrade|control>[m
[31m-can be lost.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hash[m
[31m-[m
[31m-[m
[31m-B<syntax:> hash I<I<C<key>> [C<consistent>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a load balancing method for a server group[m
[31m-where client-server mapping is based on the hashed I<C<key>> value.[m
[31m-Currently, the only supported value for the C<key>[m
[31m-is the client remote address specified as C<$remote_addr>.[m
[31m-Note that adding or removing a server from the group[m
[31m-may result in remapping most of the keys to different servers.[m
[31m-The method is compatible with the[m
[31m-L<Cache::Memcached|http://search.cpan.org/perldoc?Cache%3A%3AMemcached>[m
[31m-Perl library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<consistent> parameter is specified,[m
[31m-the L<ketama|http://www.last.fm/user/RJ/journal/2007/04/10/392555/>[m
[31m-consistent hashing method will be used instead.[m
[31m-The method ensures that only a few keys[m
[31m-will be remapped to different servers[m
[31m-when a server is added to or removed from the group.[m
[31m-This helps to achieve a higher cache hit ratio for caching servers.[m
[31m-The method is compatible with the[m
[31m-L<Cache::Memcached::Fast|http://search.cpan.org/perldoc?Cache%3A%3AMemcached%3A%3AFast>[m
[31m-Perl library with the I<C<ketama_points>> parameter set to 160.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 least_conn[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a server group should use a load balancing method[m
[31m-where a connection[m
[31m-is passed to the server with the least number of active connections,[m
[31m-taking into account weights of servers.[m
[31m-If there are several such servers, they are tried in turn using a[m
[31m-weighted round-robin balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 least_time[m
[31m-[m
[31m-[m
[31m-B<syntax:> least_time I<C<connect> E<verbar>[m
[31m-     C<first_byte> E<verbar>[m
[31m-     C<last_byte>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a group should use a load balancing method where a connection[m
[31m-is passed to the server with the least average time and[m
[31m-least number of active connections, taking into account weights of servers.[m
[31m-If there are several such servers, they are tried in turn using a[m
[31m-weighted round-robin balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<connect> parameter is specified,[m
[31m-time to connect to the upstream server is used.[m
[31m-If the C<first_byte> parameter is specified,[m
[31m-time to receive the first byte of data is used.[m
[31m-If the C<last_byte> is specified,[m
[31m-time to receive the last byte of data is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 health_check[m
[31m-[m
[31m-[m
[31m-B<syntax:> health_check I<[I<C<parameters>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables periodic health checks of the servers in a[m
[31m-group.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following optional parameters are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<interval>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the interval between two consecutive health checks,[m
[31m-by default, 5 seconds;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fails>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of consecutive failed health checks of a particular server[m
[31m-after which this server will be considered unhealthy,[m
[31m-by default, 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<passes>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of consecutive passed health checks of a particular server[m
[31m-after which the server will be considered healthy,[m
[31m-by default, 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<match>=I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies the C<match> block configuring the tests that a[m
[31m-successful connection should pass in order for a health check to pass.[m
[31m-By default,[m
[31m-only the ability to establish a TCP connection with the server is checked;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<port>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines the port used when connecting to a server[m
[31m-to perform a health check (1.9.7);[m
[31m-by default, equals the L</server> port;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<udp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies that the C<UDP> protocol should be used for[m
[31m-health checks instead of the default C<TCP> protocol (1.9.13);[m
[31m-requires a match block with the[m
[31m-send and expect[m
[31m-parameters.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        proxy_pass backend;[m
[31m-        health_check;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-will check the ability to establish a TCP connection to each server[m
[31m-in the C<backend> group every five seconds.[m
[31m-When a connection to the server cannot be established,[m
[31m-the health check will fail, and the server will[m
[31m-be considered unhealthy.[m
[31m-Client connections are not passed to unhealthy servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Health checks can also be configured to test data obtained from the server.[m
[31m-Tests are configured separately using the L</match> directive[m
[31m-and referenced in the C<match> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The server group must reside in the shared memory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several health checks are defined for the same group of servers,[m
[31m-a single failure of any check will make the corresponding server be[m
[31m-considered unhealthy.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 health_check_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> health_check_timeout I<I<C<timeout>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Overrides the[m
[31m-L<ngx_stream_proxy_module>[m
[31m-value for health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 match[m
[31m-[m
[31m-[m
[31m-B<syntax:> match I<I<C<name>>  { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the named test set used to verify server responses to health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following parameters can be configured:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<send> I<C<string>>;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sends a I<C<string>> to the server;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<expect> I<C<string>> E<verbar>[m
[31m-C<~> I<C<regex>>;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a literal string (1.9.12) or a regular expression[m
[31m-that the data obtained from the server should match.[m
[31m-The regular expression is specified with the preceding[m
[31m-“C<~*>” modifier (for case-insensitive matching), or the[m
[31m-“C<~>” modifier (for case-sensitive matching).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Both C<send> and C<expect> parameters[m
[31m-can contain hexadecimal literals with the prefix “C<\x>”[m
[31m-followed by two hex digits, for example, “C<\x80>” (1.9.12).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Health check is passed if:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the TCP connection was successfully established;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the I<C<string>> from the C<send> parameter,[m
[31m-if specified, was sent;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the data obtained from the server matched the string or regular expression[m
[31m-from the C<expect> parameter, if specified;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the time elapsed does not exceed the value specified[m
[31m-in the L</health_check_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        zone     upstream_backend 10m;[m
[31m-        server   127.0.0.1:12345;[m
[31m-    }[m
[31m-    [m
[31m-    match http {[m
[31m-        send     "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n";[m
[31m-        expect ~ "200 OK";[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       12346;[m
[31m-        proxy_pass   backend;[m
[31m-        health_check match=http;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Only the first[m
[31m-L<ngx_stream_proxy_module>[m
[31m-bytes of data obtained from the server are examined.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/request_processing.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/request_processing.pod[m
[1mdeleted file mode 100644[m
[1mindex 5baa1ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/request_processing.pod[m
[1m+++ /dev/null[m
[36m@@ -1,339 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-request_processing - How nginx processes a request[m
[31m-[m
[31m-[m
[31m-=head1 Name-based virtual servers[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx first decides which I<server> should process the request.[m
[31m-Let’s start with a simple configuration[m
[31m-where all three virtual servers listen on port *:80:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name example.org www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name example.net www.example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name example.com www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this configuration nginx tests only the request’s header field[m
[31m-C<Host> to determine which server the request should be routed to.[m
[31m-If its value does not match any server name,[m
[31m-or the request does not contain this header field at all,[m
[31m-then nginx will route the request to the default server for this port.[m
[31m-In the configuration above, the default server is the first[m
[31m-oneE<mdash>which is nginx’s standard default behaviour.[m
[31m-It can also be set explicitly which server should be default,[m
[31m-with the C<default_server> parameter[m
[31m-in the L<ngx_http_core_module> directive:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80 <b>default_server</b>;[m
[31m-        server_name example.net www.example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The C<default_server> parameter has been available since[m
[31m-version 0.8.21.[m
[31m-In earlier versions the C<default> parameter should be used[m
[31m-instead.[m
[31m-[m
[31m-Note that the default server is a property of the listen port[m
[31m-and not of the server name.[m
[31m-More about this later.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 How to prevent processing requests with undefined server names[m
[31m-[m
[31m-[m
[31m-[m
[31m-If requests without the C<Host> header field should not be[m
[31m-allowed, a server that just drops the requests can be defined:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name "";[m
[31m-        return      444;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Here, the server name is set to an empty string that will match[m
[31m-requests without the C<Host> header field,[m
[31m-and a special nginx’s non-standard code 444[m
[31m-is returned that closes the connection.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Since version 0.8.48, this is the default setting for the[m
[31m-server name, so the C<server_name ""> can be omitted.[m
[31m-In earlier versions, the machine’s I<hostname> was used as[m
[31m-a default server name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Mixed name-based and IP-based virtual servers[m
[31m-[m
[31m-[m
[31m-[m
[31m-Let’s look at a more complex configuration[m
[31m-where some virtual servers listen on different addresses:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.1:80;[m
[31m-        server_name example.org www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.1:80;[m
[31m-        server_name example.net www.example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.2:80;[m
[31m-        server_name example.com www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-In this configuration, nginx first tests the IP address and port[m
[31m-of the request against the[m
[31m-L<ngx_http_core_module> directives[m
[31m-of the[m
[31m-L<ngx_http_core_module> blocks.[m
[31m-It then tests the C<Host>[m
[31m-header field of the request against the[m
[31m-L<ngx_http_core_module>[m
[31m-entries of the[m
[31m-L<ngx_http_core_module>[m
[31m-blocks that matched[m
[31m-the IP address and port.[m
[31m-If the server name is not found, the request will be processed by[m
[31m-the default server.[m
[31m-For example, a request for C<www.example.com> received on[m
[31m-the 192.168.1.1:80 port will be handled by the default server[m
[31m-of the 192.168.1.1:80 port, i.e., by the first server,[m
[31m-since there is no C<www.example.com> defined for this port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-As already stated, a default server is a property of the listen port,[m
[31m-and different default servers may be defined for different ports:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.1:80;[m
[31m-        server_name example.org www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.1:80 <b>default_server</b>;[m
[31m-        server_name example.net www.example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.2:80 <b>default_server</b>;[m
[31m-        server_name example.com www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 A simple PHP site configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-Now let’s look at how nginx chooses a I<location> to process a request[m
[31m-for a typical, simple PHP site:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name example.org www.example.org;[m
[31m-        root        /data/www;[m
[31m-    [m
[31m-        location / {[m
[31m-            index   index.html index.php;[m
[31m-        }[m
[31m-    [m
[31m-        location ~* \.(gif|jpg|png)$ {[m
[31m-            expires 30d;[m
[31m-        }[m
[31m-    [m
[31m-        location ~ \.php$ {[m
[31m-            fastcgi_pass  localhost:9000;[m
[31m-            fastcgi_param SCRIPT_FILENAME[m
[31m-                          $document_root$fastcgi_script_name;[m
[31m-            include       fastcgi_params;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx first searches for the most specific prefix location given by[m
[31m-literal strings regardless of the listed order.[m
[31m-In the configuration above[m
[31m-the only prefix location is “C<E<sol>>” and since it matches[m
[31m-any request it will be used as a last resort.[m
[31m-Then nginx checks locations given by[m
[31m-regular expression in the order listed in the configuration file.[m
[31m-The first matching expression stops the search and nginx will use this[m
[31m-location.[m
[31m-If no regular expression matches a request, then nginx uses[m
[31m-the most specific prefix location found earlier.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that locations of all types test only a URI part of request line[m
[31m-without arguments.[m
[31m-This is done because arguments in the query string may be given in[m
[31m-several ways, for example:[m
[31m-[m
[31m-    [m
[31m-    /index.php?user=john&page=1[m
[31m-    /index.php?page=1&user=john[m
[31m-[m
[31m-[m
[31m-Besides, anyone may request anything in the query string:[m
[31m-[m
[31m-    [m
[31m-    /index.php?page=1&something+else&user=john[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Now let’s look at how requests would be processed[m
[31m-in the configuration above:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A request “C<E<sol>logo.gif>” is matched by the prefix location[m
[31m-“C<E<sol>>” first and then by the regular expression[m
[31m-“C<\.(gifE<verbar>jpgE<verbar>png)$>”,[m
[31m-therefore, it is handled by the latter location.[m
[31m-Using the directive “C<rootE<nbsp>E<sol>dataE<sol>www>” the request[m
[31m-is mapped to the file F<E<sol>dataE<sol>wwwE<sol>logo.gif>, and the file[m
[31m-is sent to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A request “C<E<sol>index.php>” is also matched by the prefix location[m
[31m-“C<E<sol>>” first and then by the regular expression[m
[31m-“C<\.(php)$>”.[m
[31m-Therefore, it is handled by the latter location[m
[31m-and the request is passed to a FastCGI server listening on localhost:9000.[m
[31m-The[m
[31m-L<ngx_http_fastcgi_module>[m
[31m-directive sets the FastCGI parameter[m
[31m-C<SCRIPT_FILENAME> to “C<E<sol>dataE<sol>wwwE<sol>index.php>”,[m
[31m-and the FastCGI server executes the file.[m
[31m-The variable C<$document_root> is equal to[m
[31m-the value of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive and the variable C<$fastcgi_script_name> is equal to[m
[31m-the request URI, i.e. “C<E<sol>index.php>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A request “C<E<sol>about.html>” is matched by the prefix location[m
[31m-“C<E<sol>>” only, therefore, it is handled in this location.[m
[31m-Using the directive “C<root E<sol>dataE<sol>www>” the request is mapped[m
[31m-to the file F<E<sol>dataE<sol>wwwE<sol>about.html>, and the file is sent[m
[31m-to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Handling a request “C<E<sol>>” is more complex.[m
[31m-It is matched by the prefix location “C<E<sol>>” only,[m
[31m-therefore, it is handled by this location.[m
[31m-Then the[m
[31m-L<ngx_http_index_module>[m
[31m-directive tests for the existence[m
[31m-of index files according to its parameters and[m
[31m-the “C<root E<sol>dataE<sol>www>” directive.[m
[31m-If the file F<E<sol>dataE<sol>wwwE<sol>index.html> does not exist,[m
[31m-and the file F<E<sol>dataE<sol>wwwE<sol>index.php> exists,[m
[31m-then the directive does an internal redirect to “C<E<sol>index.php>”,[m
[31m-and nginx searches the locations again[m
[31m-as if the request had been sent by a client.[m
[31m-As we saw before, the redirected request will eventually be handled[m
[31m-by the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/server_names.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/server_names.pod[m
[1mdeleted file mode 100644[m
[1mindex 217b7e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/server_names.pod[m
[1m+++ /dev/null[m
[36m@@ -1,562 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-server_names - Server names[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-Server names are defined using the[m
[31m-L<ngx_http_core_module>[m
[31m-directive[m
[31m-and determine which L<ngx_http_core_module> block[m
[31m-is used for a given request.[m
[31m-See also “L<request_processing>”.[m
[31m-They may be defined using exact names, wildcard names, or regular expressions:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org  www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  *.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  mail.*;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  ~^(?<user>.+)\.example\.net$;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When searching for a virtual server by name, if name matches more than one of[m
[31m-the specified variants, e.g. both wildcard name and regular expression match,[m
[31m-the first matching variant will be chosen, in the following order of precedence:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-exact name[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-longest wildcard name starting with an asterisk, e.g.[m
[31m-“C<*.example.org>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-longest wildcard name ending with an asterisk, e.g. “C<mail.*>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-first matching regular expression[m
[31m-(in order of appearance in a configuration file)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Wildcard names[m
[31m-[m
[31m-[m
[31m-[m
[31m-A wildcard name may contain an asterisk only on the name’s start or end,[m
[31m-and only on a dot border. The names “C<www.*.example.org>”[m
[31m-and “C<w*.example.org>” are invalid.[m
[31m-However, these names can be specified using regular expressions,[m
[31m-for example, “C<~^www\..+\.example\.org$>” and[m
[31m-“C<~^w.*\.example\.org$>”.[m
[31m-An asterisk can match several name parts.[m
[31m-The name “C<*.example.org>” matches not only[m
[31m-C<www.example.org> but C<www.sub.example.org> as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A special wildcard name in the form “C<.example.org>” can be[m
[31m-used to match both the exact name “C<example.org>”[m
[31m-and the wildcard name “C<*.example.org>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Regular expressions names[m
[31m-[m
[31m-[m
[31m-[m
[31m-The regular expressions used by nginx are compatible with those used[m
[31m-by the Perl programming language (PCRE).[m
[31m-To use a regular expression, the server name must start with the tilde[m
[31m-character:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server_name  ~^www\d+\.example\.net$;[m
[31m-[m
[31m-[m
[31m-[m
[31m-otherwise it will be treated as an exact name, or if the expression contains[m
[31m-an asterisk, as a wildcard name (and most likely as an invalid one).[m
[31m-Do not forget to set “C<^>” and “C<$>” anchors.[m
[31m-They are not required syntactically, but logically.[m
[31m-Also note that domain name dots should be escaped with a backslash.[m
[31m-A regular expression containing the characters “C<{>”[m
[31m-and “C<}>” should be quoted:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server_name  "~^(?<name>\w\d<b>{</b>1,3<b>}</b>+)\.example\.net$";[m
[31m-[m
[31m-[m
[31m-[m
[31m-otherwise nginx will fail to start and display the error message:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    directive "server_name" is not terminated by ";" in ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-A named regular expression capture can be used later as a variable:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name   ~^(www\.)?(<b>?<domain></b>.+)$;[m
[31m-    [m
[31m-        location / {[m
[31m-            root   /sites/<b>$domain</b>;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-The PCRE library supports named captures using the following syntax:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If nginx fails to start and displays the error message:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    pcre_compile() failed: unrecognized character after (?< in ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-this means that the PCRE library is old and the syntax[m
[31m-“C<?PE<lt>I<C<name>>E<gt>>” should be tried instead.[m
[31m-The captures can also be used in digital form:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name   ~^(www\.)?(.+)$;[m
[31m-    [m
[31m-        location / {[m
[31m-            root   /sites/<b>$2</b>;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, such usage should be limited to simple cases (like the above),[m
[31m-since the digital references can easily be overwritten.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Miscellaneous names[m
[31m-[m
[31m-[m
[31m-[m
[31m-There are some server names that are treated specially.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If it is required to process requests without the C<Host>[m
[31m-header field in a L<ngx_http_core_module>[m
[31m-block which is not the default, an empty name should be specified:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org  www.example.org  "";[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If no[m
[31m-L<ngx_http_core_module>[m
[31m-is defined in a L<ngx_http_core_module> block[m
[31m-then nginx uses the empty name as the server name.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-nginx versions up to 0.8.48 used the machine’s hostname as the server name[m
[31m-in this case.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a server name is defined as “C<$hostname>” (0.9.4), the[m
[31m-machine’s hostname is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If someone makes a request using an IP address instead of a server name,[m
[31m-the C<Host> request header field will contain the IP address[m
[31m-and the request can be handled using the IP address as the server name:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org[m
[31m-                     www.example.org[m
[31m-                     ""[m
[31m-                     <b>192.168.1.1</b>[m
[31m-                     ;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In catch-all server examples the strange name “C<_>” can[m
[31m-be seen:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80  default_server;[m
[31m-        server_name  _;[m
[31m-        return       444;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is nothing special about this name, it is just one of a myriad[m
[31m-of invalid domain names which never intersect with any real name.[m
[31m-Other invalid names like “C<-->” and “C<!@#>”[m
[31m-may equally be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx versions up to 0.6.25 supported the special name “C<*>”[m
[31m-which was erroneously interpreted to be a catch-all name.[m
[31m-It never functioned as a catch-all or wildcard server name.[m
[31m-Instead, it supplied the functionality that is now provided[m
[31m-by the[m
[31m-L<ngx_http_core_module>[m
[31m-directive.[m
[31m-The special name “C<*>” is now deprecated[m
[31m-and the[m
[31m-L<ngx_http_core_module>[m
[31m-directive should be used.[m
[31m-Note that there is no way to specify the catch-all name or[m
[31m-the default server using the[m
[31m-L<ngx_http_core_module>[m
[31m-directive.[m
[31m-This is a property of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive[m
[31m-and not of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive.[m
[31m-See also “L<request_processing>”.[m
[31m-It is possible to define servers listening on ports *:80 and *:8080,[m
[31m-and direct that one will be the default server for port *:8080,[m
[31m-while the other will be the default for port *:80:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        listen       8080  default_server;[m
[31m-        server_name  example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80  default_server;[m
[31m-        listen       8080;[m
[31m-        server_name  example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Optimization[m
[31m-[m
[31m-[m
[31m-[m
[31m-Exact names, wildcard names starting with an asterisk,[m
[31m-and wildcard names ending with an asterisk are stored[m
[31m-in three hash tables bound to the listen ports.[m
[31m-The sizes of hash tables are optimized at the configuration phase[m
[31m-so that a name can be found with the fewest CPU cache misses.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The exact names hash table is searched first.[m
[31m-If a name is not found, the hash table with wildcard names[m
[31m-starting with an asterisk is searched.[m
[31m-If the name is not found there, the hash table with wildcard names[m
[31m-ending with an asterisk is searched.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Searching wildcard names hash table is slower than searching exact names hash[m
[31m-table because names are searched by domain parts.[m
[31m-Note that the special wildcard form “C<.example.org>”[m
[31m-is stored in a wildcard names hash table and not in an exact names hash table.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Regular expressions are tested sequentially[m
[31m-and therefore are the slowest method and are non-scalable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For these reasons, it is better to use exact names where possible.[m
[31m-For example, if the most frequently requested names of a server[m
[31m-are C<example.org> and C<www.example.org>,[m
[31m-it is more efficient to define them explicitly:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org  www.example.org  *.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-than to use the simplified form:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  .example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a large number of server names are defined,[m
[31m-or unusually long server names are defined, tuning[m
[31m-the L<ngx_http_core_module>[m
[31m-and L<ngx_http_core_module>[m
[31m-directives at the I<http> level may become necessary.[m
[31m-The default value of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive may be equal to 32, or 64, or another value,[m
[31m-depending on CPU cache line size.[m
[31m-If the default value is 32 and server name is defined as[m
[31m-“C<too.long.server.name.example.org>”[m
[31m-then nginx will fail to start and display the error message:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    could not build the server_names_hash,[m
[31m-    you should increase server_names_hash_bucket_size: 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this case, the directive value should be increased to the next power of two:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        server_names_hash_bucket_size  64;[m
[31m-        ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a large number of server names are defined,[m
[31m-another error message will appear:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    could not build the server_names_hash,[m
[31m-    you should increase either server_names_hash_max_size: 512[m
[31m-    or server_names_hash_bucket_size: 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-In such a case, first try to set[m
[31m-L<ngx_http_core_module>[m
[31m-to a number close to the number of server names.[m
[31m-Only if this does not help,[m
[31m-or if nginx’s start time is unacceptably long, try to increase[m
[31m-L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a server is the only server for a listen port, then nginx will not test[m
[31m-server names at all (and will not build the hash tables for the listen port).[m
[31m-However, there is one exception.[m
[31m-If a server name is a regular expression with captures,[m
[31m-then nginx has to execute the expression to get the captures.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The special server name “C<$hostname>” has been supported[m
[31m-since 0.9.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A default server name value is an empty name “” since 0.8.48.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Named regular expression server name captures have been supported since 0.8.25.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Regular expression server name captures have been supported since 0.7.40.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-An empty server name “” has been supported since 0.7.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A wildcard server name or regular expression has been supported for use[m
[31m-as the first server name since 0.6.25.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Regular expression server names have been supported since 0.6.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Wildcard form C<example.*> has been supported since 0.6.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The special form C<.example.org> has been supported since 0.3.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Wildcard form C<*.example.org> has been supported since 0.1.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/switches.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/switches.pod[m
[1mdeleted file mode 100644[m
[1mindex e0e755b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/switches.pod[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-switches - Command-line parameters[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx supports the following command-line parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-?> E<verbar> C<-h>E<mdash>print help[m
[31m-for command-line parameters.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-c I<C<file>>>E<mdash>use an alternative[m
[31m-configuration I<C<file>> instead of a default file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-g I<C<directives>>>E<mdash>set[m
[31m-L<global configuration directives|ngx_core_module>,[m
[31m-for example,[m
[31m-[m
[31m-    [m
[31m-    nginx -g "pid /var/run/nginx.pid; worker_processes `sysctl -n hw.ncpu`;"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-p I<C<prefix>>>E<mdash>set nginx path prefix,[m
[31m-i.e. a directory that will keep server files[m
[31m-(default value is I<C<E<sol>usrE<sol>localE<sol>nginx>>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-q>E<mdash>suppress non-error messages[m
[31m-during configuration testing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-s I<C<signal>>>E<mdash>send a I<signal>[m
[31m-to the master process.[m
[31m-The argument I<signal> can be one of:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<stop>E<mdash>shut down quickly[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<quit>E<mdash>shut down gracefully[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<reload>E<mdash>reload configuration,[m
[31m-start the new worker process with a new configuration,[m
[31m-gracefully shut down old worker processes.[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<reopen>E<mdash>reopen log files[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-t>E<mdash>test the configuration file: nginx checks the[m
[31m-configuration for correct syntax, and then tries to open files[m
[31m-referred in the configuration.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-T>E<mdash>same as C<-t>,[m
[31m-but additionally dump configuration files to standard output (1.9.2).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-v>E<mdash>print nginx version.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-V>E<mdash>print nginx version, compiler version,[m
[31m-and configure parameters.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/syntax.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/syntax.pod[m
[1mdeleted file mode 100644[m
[1mindex ef6e8d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/syntax.pod[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-syntax - Configuration file measurement units[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sizes can be specified in bytes, kilobytes[m
[31m-(suffixes C<k> and C<K>) or megabytes[m
[31m-(suffixes C<m> and C<M>), for example,[m
[31m-“C<1024>”, “C<8k>”, “C<1m>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Time intervals can be specified in milliseconds, seconds,[m
[31m-minutes, hours, days and so on, using the following suffixes:[m
[31m-[m
[31m-ms     milliseconds[m
[31m- s          seconds[m
[31m- m          minutes[m
[31m- h            hours[m
[31m- d             days[m
[31m- w            weeks[m
[31m- M  months, 30 days[m
[31m- y  years, 365 days[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Multiple units can be combined in a single value[m
[31m-by specifying them in the order from the most to the least significant,[m
[31m-and optionally separated by whitespace.[m
[31m-For example, “C<1h 30m>” specifies the same time[m
[31m-as “C<90m>” or “C<5400s>”.[m
[31m-A value without a suffix means seconds.[m
[31m-It is recommended to always specify a suffix.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Some of the time intervals can be specified only with a seconds resolution.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/sys_errlist.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/sys_errlist.pod[m
[1mdeleted file mode 100644[m
[1mindex abc5e96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/sys_errlist.pod[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-sys_errlist[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-While building nginx version 0.7.66, 0.8.35 or higher on Linux[m
[31m-the following warning messages are issued:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    warning: `sys_errlist' is deprecated;[m
[31m-        use `strerror' or `strerror_r' instead[m
[31m-    warning: `sys_nerr' is deprecated;[m
[31m-        use `strerror' or `strerror_r' instead[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-This is normal: nginx has to use the deprecated sys_errlist[] and sys_nerr[m
[31m-in signal handlers because strerror() and strerror_r() functions[m
[31m-are not Async-Signal-Safe.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/syslog.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/syslog.pod[m
[1mdeleted file mode 100644[m
[1mindex 8cf5546..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/syslog.pod[m
[1m+++ /dev/null[m
[36m@@ -1,126 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-syslog - Logging to syslog[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The[m
[31m-L<ngx_core_module>[m
[31m-and[m
[31m-L<ngx_http_log_module>[m
[31m-directives support logging to syslog.[m
[31m-The following parameters configure logging to syslog:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server=>I<C<address>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the address of a syslog server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-with an optional port, or as a UNIX-domain socket path[m
[31m-specified after the “C<unix:>” prefix.[m
[31m-If port is not specified, the UDP port 514 is used.[m
[31m-If a domain name resolves to several IP addresses, the first resolved[m
[31m-address is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<facility=>I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets facility of syslog messages, as defined in[m
[31m-L<RFC 3164|http://tools.ietf.org/html/rfc3164#section-4.1.1>.[m
[31m-Facility can be one of “C<kern>”, “C<user>”,[m
[31m-“C<mail>”, “C<daemon>”,[m
[31m-“C<auth>”, “C<intern>”,[m
[31m-“C<lpr>”, “C<news>”, “C<uucp>”,[m
[31m-“C<clock>”, “C<authpriv>”,[m
[31m-“C<ftp>”, “C<ntp>”, “C<audit>”,[m
[31m-“C<alert>”, “C<cron>”,[m
[31m-“C<local0>”..“C<local7>”.[m
[31m-Default is “C<local7>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<severity=>I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets severity of syslog messages for[m
[31m-L<ngx_http_log_module>,[m
[31m-as defined in[m
[31m-L<RFC 3164|http://tools.ietf.org/html/rfc3164#section-4.1.1>.[m
[31m-Possible values are the same as for the second parameter (level) of the[m
[31m-L<ngx_core_module> directive.[m
[31m-Default is “C<info>”.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Severity of error messages is determined by nginx, thus the parameter[m
[31m-is ignored in the C<error_log> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<tag=>I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the tag of syslog messages.[m
[31m-Default is “C<nginx>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<nohostname>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables adding the “hostname” field into the syslog message header (1.9.7).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Example syslog configuration:[m
[31m-[m
[31m-    [m
[31m-    error_log syslog:server=192.168.1.1 debug;[m
[31m-    [m
[31m-    access_log syslog:server=unix:/var/log/nginx.sock,nohostname;[m
[31m-    access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Logging to syslog is available since version 1.7.1.[m
[31m-As part of our[m
[31m-commercial subscription[m
[31m-logging to syslog is available since version 1.5.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/variables_in_config.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/variables_in_config.pod[m
[1mdeleted file mode 100644[m
[1mindex b22ade1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/variables_in_config.pod[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-variables_in_config[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-Is there a proper way to use nginx variables to make sections of[m
[31m-the configuration shorter, using them as macros for making[m
[31m-parts of configuration work as templates?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-Variables should not be used as template macros. Variables are[m
[31m-evaluated in the run-time during the processing of each[m
[31m-request, so they are rather costly compared to plain static[m
[31m-configuration. Using variables to store static strings is also[m
[31m-a bad idea. Instead, a macro expansion and "include" directives[m
[31m-should be used to generate configs more easily and it can be[m
[31m-done with the external tools, e.g. sed + make or any other[m
[31m-common template mechanism.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/websocket.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/websocket.pod[m
[1mdeleted file mode 100644[m
[1mindex e6bfe62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/websocket.pod[m
[1m+++ /dev/null[m
[36m@@ -1,101 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-websocket - WebSocket proxying[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-To turn a connection between a client and server from HTTPE<sol>1.1 into WebSocket,[m
[31m-the L<protocol[m
[31m-switch|http://tools.ietf.org/html/rfc2616#section-14.42> mechanism available in HTTPE<sol>1.1 is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is one subtlety however: since the C<Upgrade> is a[m
[31m-L<hop-by-hop|http://tools.ietf.org/html/rfc2616#section-13.5.1>[m
[31m-header, it is not passed from a client to proxied server.[m
[31m-With forward proxying, clients may use the C<CONNECT>[m
[31m-method to circumvent this issue.[m
[31m-This does not work with reverse proxying however,[m
[31m-since clients are not aware of any proxy servers,[m
[31m-and special processing on a proxy server is required.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Since version 1.3.13,[m
[31m-nginx implements special mode of operation[m
[31m-that allows setting up a tunnel between a client and proxied[m
[31m-server if the proxied server returned a response with the code[m
[31m-C<101> (C<Switching Protocols>),[m
[31m-and the client asked for a protocol switch via the C<Upgrade>[m
[31m-header in a request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-As noted above, hop-by-hop headers including C<Upgrade>[m
[31m-and C<Connection> are not passed from a client to proxied[m
[31m-server, therefore in order for the proxied server to know about the client’s[m
[31m-intention to switch a protocol to WebSocket, these headers have to be[m
[31m-passed explicitly:[m
[31m-[m
[31m-    [m
[31m-    location /chat/ {[m
[31m-        proxy_pass http://backend;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Upgrade $http_upgrade;[m
[31m-        proxy_set_header Connection "upgrade";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-A more sophisticated example[m
[31m-in which a value of the C<Connection> header field[m
[31m-in a request to the proxied server depends on the presence of[m
[31m-the C<Upgrade> field in the client request header:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        map $http_upgrade $connection_upgrade {[m
[31m-            default upgrade;[m
[31m-            ''      close;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            ...[m
[31m-    [m
[31m-            location /chat/ {[m
[31m-                proxy_pass http://backend;[m
[31m-                proxy_http_version 1.1;[m
[31m-                proxy_set_header Upgrade $http_upgrade;[m
[31m-                proxy_set_header Connection $connection_upgrade;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the connection will be closed[m
[31m-if the proxied server does not transmit any data within 60 seconds.[m
[31m-This timeout can be increased with the[m
[31m-L<ngx_http_proxy_module> directive.[m
[31m-Alternatively, the proxied server can be configured[m
[31m-to periodically send WebSocket ping frames to reset the timeout[m
[31m-and check if the connection is still alive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/welcome_nginx_facebook.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/welcome_nginx_facebook.pod[m
[1mdeleted file mode 100644[m
[1mindex 9038cbd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/welcome_nginx_facebook.pod[m
[1m+++ /dev/null[m
[36m@@ -1,245 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-welcome_nginx_facebook[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-I am trying to open Facebook, Yahoo!, Yandex, Google, or some[m
[31m-other well known web site and instead I am getting a blank web page[m
[31m-with a message referring to nginx: E<ldquo>Welcome to nginx!E<rdquo> or[m
[31m-E<ldquo>404 Not Found E<sol> nginxE<rdquo>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-I suspect something is wrong and there is probably a malicious attempt[m
[31m-to direct me to a rogue web page (to break into my computer, do[m
[31m-phishing etc.). Why is that, and what has nginx to do with my attempts[m
[31m-to connect to Facebook (Yahoo!, Google, etc.) ?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-First of all, the E<ldquo>Welcome to nginx!E<rdquo> page you see is[m
[31m-NOT our website. At nginx, we write and distribute a B<free>[m
[31m-L<open source|http://en.wikipedia.org/wiki/Open-source_software> web server software. A web page saying[m
[31m-E<ldquo>Welcome to nginx!E<rdquo> is just a diagnostics response that[m
[31m-can be produced by any of the websites out there, running nginx[m
[31m-web server. Currently, nginx is the 2nd most popular open source[m
[31m-web server in the world, it’s being used by over 126,000,000 (or[m
[31m-14% of the Internet) websites. Most of these websites are[m
[31m-legitimate, but some aren’t. Our software was created with a good[m
[31m-reason of enabling performance and scalability on the Internet,[m
[31m-it is licensed under L<popular open source license|http://nginx.org/LICENSE>, and has nothing to do with any[m
[31m-kind of threatening or malicious activity per se E<8212>[m
[31m-nginx is NOT a malware, and it is NOT on your computer. But someone’s[m
[31m-malware could have indeed tampered with your computer or router,[m
[31m-redirecting you to a fraudulent Internet server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-We recommend running an anti-virus check on your computer, and[m
[31m-we recommend to check and verify your entire system setup with the[m
[31m-help of your ISP, or another support personnel:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-(Disclaimer: at nginx we are not responsible for any negative[m
[31m-impact or effects that the actions below might cause. Use the[m
[31m-following recommendations at your own risk, especially if[m
[31m-you aren’t an experienced user of your operating system andE<sol>or[m
[31m-Internet applications. In no event shall nginx be liable for[m
[31m-any direct, indirect, incidental, special, exemplary, or[m
[31m-consequential damages, including, but not limited to loss of[m
[31m-use, data, or profits; or business interruption).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Check your TCPE<sol>IP settings and see if the DNS servers[m
[31m-configuration matches the valid one (suggested by your Internet[m
[31m-service provider or IT support personnel).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Use L<Google[m
[31m-Public DNS|http://developers.google.com/speed/public-dns/>, and see if it fixes the problem. From Google’s[m
[31m-description of its Public DNS E<8212> "Google Public DNS is a free,[m
[31m-global Domain Name System (DNS) resolution service,[m
[31m-that you can use as an alternative to your current DNS[m
[31m-provider. [..] By using Google Public DNS you can: Speed up your[m
[31m-browsing experience. B<Improve your security>."[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Clear your DNS resolver cache. On Microsoft Windows XP go to[m
[31m-Start E<gt> Run, and then type the following command:[m
[31m-"ipconfig E<sol>flushdns". On Microsoft Vista, Windows 7, and[m
[31m-Windows 8 click on Start logo, follow All Programs E<gt> Accessories,[m
[31m-right-click on Command Prompt, choose "Run As Administrator",[m
[31m-type in "ipconfig E<sol>flushdns" and hit Enter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Click the "page reload" button in your browser. Clear browser[m
[31m-data (cache, cookies etc.). E.g. with Chrome find and click[m
[31m-"Clear Browsing Data" (Settings E<gt> Under the Hood). With Internet[m
[31m-Explorer find Tools E<gt> Internet Options E<gt> General.[m
[31m-B<Caution:> you may be deleting saved passwords information[m
[31m-here, so do it carefully and check what exact actions you are[m
[31m-performing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Check if the "hosts" file doesn’t contain entries other[m
[31m-than "127.0.0.1 localhost", and if so E<8212> if these entries are for[m
[31m-the web site you’re trying to reach. The "hosts" files is located in[m
[31m-C:\WINDOWS\system32\drivers\etc directory. Typically there should[m
[31m-be just one entry in it, for "127.0.0.1 localhost", that’s it. The[m
[31m-"hosts" file can be viewed and edited with your standard[m
[31m-Notepad application.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Check the plugins and extensions installed with your browser.[m
[31m-Re-install your browser or try an alternative one if possible.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Something must be wrong with your B<operating[m
[31m-system> settings, B<home router> setup, or B<browser>[m
[31m-configuration, if you are trying to access a well known web site[m
[31m-and what you get instead is E<ldquo>Welcome to nginx!E<rdquo>.[m
[31m-This should NOT happen if your computers and network are[m
[31m-clean and safe.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If changing DNS servers to Google Public DNS, flushing DNS resolver[m
[31m-cache, fixing your browser configuration, or cleaning "hosts" file[m
[31m-(when applicable) have helped, it might be that there’s a malware[m
[31m-somewhere on your PC or around. Find and clean it using[m
[31m-your preferred anti-virus and anti-malware tools.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additional articles that might be helpful:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-DCWG.org:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<How can you detect if your computer has been violated and infected[m
[31m-with DNS Changer?|http://www.dcwg.org/detect/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<How to clean up or fix malicious software (E<amp>ldquo;malwareE<amp>rdquo;)[m
[31m-associated with DNS Changer|http://www.dcwg.org/fix/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Microsoft:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Malicious Software Removal Tool|http://www.microsoft.com/security/pc-security/malware-removal.aspx>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<How can I reset the Hosts file back to the default?|http://support.microsoft.com/kb/972034>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<How to reset Internet Protocol (TCPE<sol>IP)|http://support.microsoft.com/kb/299357>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Firefox Help:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Disable or remove Add-ons|http://support.mozilla.org/en-US/kb/disable-or-remove-add-ons>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Tech-Recipes:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<DNS Cache Flush, Clear, or Reset in Vista,[m
[31m-Windows 7, and Windows 8|http://www.tech-recipes.com/rx/1600/vista_dns_cache_flush/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/windows.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/windows.pod[m
[1mdeleted file mode 100644[m
[1mindex 1e82f0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/nginx/windows.pod[m
[1m+++ /dev/null[m
[36m@@ -1,168 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-windows - nginx for Windows[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-Version of nginx for Windows uses the native Win32 API (not the Cygwin emulation[m
[31m-layer).[m
[31m-Only the C<select> connection processing method is currently used,[m
[31m-so high performance and scalability should not be expected.[m
[31m-Due to this and some other known issues version of nginx for Windows[m
[31m-is considered to be a I<beta> version.[m
[31m-At this time, it provides almost the same functionality as a UNIX version[m
[31m-of nginx except for[m
[31m-XSLT filter, image filter, GeoIP module, and embedded Perl language.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To install nginxE<sol>Windows, L<download|download>[m
[31m-the latest mainline version distribution (1.9.7),[m
[31m-since the mainline branch of nginx contains all known fixes.[m
[31m-Then unpack the distribution, go to the[m
[31m-nginx-1.9.7[m
[31m-directory, and run C<nginx>.[m
[31m-Here is an example for the drive C: root directory:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    cd c:\[m
[31m-    unzip nginx-<mainline_version/>.zip[m
[31m-    cd nginx-<mainline_version/>[m
[31m-    start nginx[m
[31m-[m
[31m-[m
[31m-[m
[31m-Run the C<tasklist> command-line utility[m
[31m-to see nginx processes:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    C:\nginx-<mainline_version/>>tasklist /fi "imagename eq nginx.exe"[m
[31m-    [m
[31m-    Image Name           PID Session Name     Session#    Mem Usage[m
[31m-    =============== ======== ============== ========== ============[m
[31m-    nginx.exe            652 Console                 0      2 780 K[m
[31m-    nginx.exe           1332 Console                 0      3 112 K[m
[31m-[m
[31m-[m
[31m-[m
[31m-One of the processes is the master process and another is the worker process.[m
[31m-If nginx does not start, look for the reason in[m
[31m-the error log file F<logs\error.log>.[m
[31m-If the log file has not been created, the reason for this should be reported[m
[31m-in the Windows Event Log.[m
[31m-If an error page is displayed instead of the expected page, also look[m
[31m-for the reason in the F<logs\error.log> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginxE<sol>Windows uses the directory where it has been run as the prefix[m
[31m-for relative paths in the configuration.[m
[31m-In the example above, the prefix is[m
[31m-F<C:\nginx-1.9.7\>.[m
[31m-Paths in a configuration file must be specified in UNIX-style using[m
[31m-forward slashes:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    access_log   logs/site.log;[m
[31m-    root         C:/web/html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginxE<sol>Windows runs as a standard console application (not a service),[m
[31m-and it can be managed using the following commands:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known issues[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Although several workers can be started, only one of them[m
[31m-actually does any work.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A worker can handle no more than 1024 simultaneous connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The cache and other modules which require shared memory support do not work[m
[31m-on Windows Vista and later versions due to[m
[31m-address space layout randomization being enabled in these Windows versions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The UDP proxy functionality is not supported.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Possible future enhancements[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Running as a service.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Using the IE<sol>O completion ports as a connection processing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Using multiple worker threads inside a single worker process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_devel_kit-0.3.0/ngx_devel_kit-0.3.0.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_devel_kit-0.3.0/ngx_devel_kit-0.3.0.pod[m
[1mdeleted file mode 100644[m
[1mindex 5213b29..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_devel_kit-0.3.0/ngx_devel_kit-0.3.0.pod[m
[1m+++ /dev/null[m
[36m@@ -1,321 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-NDK - Nginx Development Kit[m
[31m-[m
[31m-[m
[31m-[m
[31m-The NDK is an Nginx module that is designed to extend the core functionality of the[m
[31m-excellent Nginx webserver in a way that can be used as a basis of other Nginx modules.[m
[31m-[m
[31m-It has functions and macros to deal with generic tasks that don't currently have[m
[31m-generic code as part of the core distribution.  The NDK itself adds few features[m
[31m-that are seen from a user's point of view - it's just designed to help reduce the[m
[31m-code that Nginx module developers need to write.[m
[31m-[m
[31m-Nginx module developers wishing to use any of the features in the NDK should specify[m
[31m-that the NDK is a dependency of their module, and that users will need to compile[m
[31m-it as well when they compile their own modules.  They will also need to declare in[m
[31m-their own modules which features of the NDK they wish to use (explained below).[m
[31m-[m
[31m-If you are not an Nginx module developer, then the only useful part of this project[m
[31m-will be the 'usage for users' section below.[m
[31m-[m
[31m-[m
[31m-=head1 Status[m
[31m-[m
[31m-The NDK is now considered to be stable. It is already being used in quite a few third[m
[31m-party modules.[m
[31m-[m
[31m-[m
[31m-=head1 Features[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-additional conf_set functions for regexes, complex/script values, paths...[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-macros to simplify tasks like checking for NULL values when doing ngx_array_push[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-patches to the main source code[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ngx_auto_lib_core generic external library handler is included (see separate readme)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Design[m
[31m-[m
[31m-[m
[31m-=head2 modular[m
[31m-[m
[31m-The kit itself is designed in a modular way, so that only the required code is compiled.[m
[31m-It's possible to add just a single NDK module, a few or all of them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auto-generated & easily extensible[m
[31m-[m
[31m-Many of the macros available in the NDK are auto-generated from simple configuration[m
[31m-files.  This makes creating similar macros for your own code very simple - it's usually[m
[31m-just the case of adding an extra line to a config file and re-running the build script.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Usage for users[m
[31m-[m
[31m-If another Nginx module you wish to use specifies that the NDK is a dependency, you[m
[31m-will need to do the following :[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-download the source (https://github.com/simpl/ngx_devel_kit)[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-unpack the source (tar -xzf $name)[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-compile Nginx with the following extra option C<--add-module=/path/to/ngx_devel_kit>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-e.g.[m
[31m-[m
[31m-[m
[31m-    ./configure --add-module=/path/to/ngx_devel_kit \[m
[31m-                --add-module=/path/to/another/module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;[m
[31m-    load_module /path/to/another/module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Usage for developers[m
[31m-[m
[31m-To use the NDK in your own module, you need to add the following:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-add this line to your module[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-    #include    <ndk.h>[m
[31m-[m
[31m-Note: since the NDK includes the following lines[m
[31m-[m
[31m-[m
[31m-    #include    <ngx_config.h>[m
[31m-    #include    <ngx_core.h>[m
[31m-    #include    <ngx_http.h>[m
[31m-[m
[31m-you can replace these with the single include above.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-add the following line in the config file for your module:[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-    have=NDK_[module_name]  . auto/have[m
[31m-[m
[31m-for each NDK module that you wish to use (you need to include auto/have multiple[m
[31m-times if you wish to use multiple NDK modules.[m
[31m-[m
[31m-Note: the old method of setting[m
[31m-[m
[31m-[m
[31m-    CFLAGS="$CFLAGS -DNDK_[module_name]"[m
[31m-[m
[31m-is now deprecated. It will still work, but results in unnecessary lines being[m
[31m-displayed when compiling Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Warning: using NDK_ALL[m
[31m-[m
[31m-You can also set C<NDK_ALL> to include all the NDK modules.  This is primarily as[m
[31m-a convenience in the early stages of development of another module. However,[m
[31m-[m
[31m-DO NOT LEAVE C<NDK_ALL> IN YOUR CONFIG FILE WHEN PUBLISHING[m
[31m-[m
[31m-Although the NDK is fairly small now, it could in time become a large repository[m
[31m-of code that would, if using NDK_ALL, result in considerably more code being compiled[m
[31m-than is necessary.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Modules using NDK[m
[31m-[m
[31m-The following 3rd-party modules make use of NDK.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_lua_module|https://github.com/openresty/lua-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_set_misc_module|https://github.com/openresty/set-misc-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_encrypted_session_module|https://github.com/openresty/encrypted-session-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_form_input_module|https://github.com/calio/form-input-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_iconv_module|https://github.com/calio/iconv-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_array_var_module|https://github.com/openresty/array-var-nginx-module#readme>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-documentation for modules that don't already have it[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-additional phase-handler functions[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-generically testing for needing to add a handler[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-remove dependency of set_var on OpenSSL being compiled in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 License[m
[31m-[m
[31m-Copyright (c) 2010-2016, Marcus Clyne[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are[m
[31m-permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of[m
[31m-conditions and the following disclaimer.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of[m
[31m-conditions and the following disclaimer in the documentation and/or other materials[m
[31m-provided with the distribution.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Neither the name of the copyright holder nor the names of its contributors may be used[m
[31m-to endorse or promote products derived from this software without specific prior[m
[31m-written permission.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS[m
[31m-OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF[m
[31m-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE[m
[31m-COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,[m
[31m-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE[m
[31m-GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED[m
[31m-AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF[m
[31m-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Contributing / Feedback[m
[31m-[m
[31m-If you are an Nginx module developer, and have developed some functions that are[m
[31m-generic in nature (or would be easily adapted to be so), then please send them to[m
[31m-me at the address below, and I'll add them to the kit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Marcus Clyne (contact at simpl dot it)[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_lua-0.10.5/ngx_lua-0.10.5.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_lua-0.10.5/ngx_lua-0.10.5.pod[m
[1mdeleted file mode 100644[m
[1mindex b9bdf86..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_lua-0.10.5/ngx_lua-0.10.5.pod[m
[1m+++ /dev/null[m
[36m@@ -1,8869 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx_http_lua_module - Embed the power of Lua into Nginx HTTP Servers.[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Version[m
[31m-[m
[31m-This document describes ngx_lua L<v0.10.5|https://github.com/openresty/lua-nginx-module/tags> released on 25 May 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     # set search paths for pure Lua external libraries (';;' is the default path):[m
[31m-     lua_package_path '/foo/bar/?.lua;/blah/?.lua;;';[m
[31m-    [m
[31m-     # set search paths for Lua external libraries written in C (can also use ';;'):[m
[31m-     lua_package_cpath '/bar/baz/?.so;/blah/blah/?.so;;';[m
[31m-    [m
[31m-     server {[m
[31m-         location /lua_content {[m
[31m-             # MIME type determined by default_type:[m
[31m-             default_type 'text/plain';[m
[31m-    [m
[31m-             content_by_lua_block {[m
[31m-                 ngx.say('Hello,world!')[m
[31m-             }[m
[31m-         }[m
[31m-    [m
[31m-         location /nginx_var {[m
[31m-             # MIME type determined by default_type:[m
[31m-             default_type 'text/plain';[m
[31m-    [m
[31m-             # try access /nginx_var?a=hello,world[m
[31m-             content_by_lua_block {[m
[31m-                 ngx.say(ngx.var.arg_a)[m
[31m-             }[m
[31m-         }[m
[31m-    [m
[31m-         location = /request_body {[m
[31m-             client_max_body_size 50k;[m
[31m-             client_body_buffer_size 50k;[m
[31m-    [m
[31m-             content_by_lua_block {[m
[31m-                 ngx.req.read_body()  -- explicitly read the req body[m
[31m-                 local data = ngx.req.get_body_data()[m
[31m-                 if data then[m
[31m-                     ngx.say("body data:")[m
[31m-                     ngx.print(data)[m
[31m-                     return[m
[31m-                 end[m
[31m-    [m
[31m-                 -- body may get buffered in a temp file:[m
[31m-                 local file = ngx.req.get_body_file()[m
[31m-                 if file then[m
[31m-                     ngx.say("body is in file ", file)[m
[31m-                 else[m
[31m-                     ngx.say("no body found")[m
[31m-                 end[m
[31m-             }[m
[31m-         }[m
[31m-    [m
[31m-         # transparent non-blocking I/O in Lua via subrequests[m
[31m-         # (well, a better way is to use cosockets)[m
[31m-         location = /lua {[m
[31m-             # MIME type determined by default_type:[m
[31m-             default_type 'text/plain';[m
[31m-    [m
[31m-             content_by_lua_block {[m
[31m-                 local res = ngx.location.capture("/some_other_location")[m
[31m-                 if res then[m
[31m-                     ngx.say("status: ", res.status)[m
[31m-                     ngx.say("body:")[m
[31m-                     ngx.print(res.body)[m
[31m-                 end[m
[31m-             }[m
[31m-         }[m
[31m-    [m
[31m-         location = /foo {[m
[31m-             rewrite_by_lua_block {[m
[31m-                 res = ngx.location.capture("/memc",[m
[31m-                     { args = { cmd = "incr", key = ngx.var.uri } }[m
[31m-                 )[m
[31m-             }[m
[31m-    [m
[31m-             proxy_pass http://blah.blah.com;[m
[31m-         }[m
[31m-    [m
[31m-         location = /mixed {[m
[31m-             rewrite_by_lua_file /path/to/rewrite.lua;[m
[31m-             access_by_lua_file /path/to/access.lua;[m
[31m-             content_by_lua_file /path/to/content.lua;[m
[31m-         }[m
[31m-    [m
[31m-         # use nginx var in code path[m
[31m-         # WARNING: contents in nginx var must be carefully filtered,[m
[31m-         # otherwise there'll be great security risk![m
[31m-         location ~ ^/app/([-_a-zA-Z0-9/]+) {[m
[31m-             set $path $1;[m
[31m-             content_by_lua_file /path/to/lua/app/root/$path.lua;[m
[31m-         }[m
[31m-    [m
[31m-         location / {[m
[31m-            client_max_body_size 100k;[m
[31m-            client_body_buffer_size 100k;[m
[31m-    [m
[31m-            access_by_lua_block {[m
[31m-                -- check the client IP address is in our black list[m
[31m-                if ngx.var.remote_addr == "132.5.72.3" then[m
[31m-                    ngx.exit(ngx.HTTP_FORBIDDEN)[m
[31m-                end[m
[31m-    [m
[31m-                -- check if the URI contains bad words[m
[31m-                if ngx.var.uri and[m
[31m-                       string.match(ngx.var.request_body, "evil")[m
[31m-                then[m
[31m-                    return ngx.redirect("/terms_of_use.html")[m
[31m-                end[m
[31m-    [m
[31m-                -- tests passed[m
[31m-            }[m
[31m-    [m
[31m-            # proxy_pass/fastcgi_pass/etc settings[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module embeds Lua, via the standard Lua 5.1 interpreter or L<LuaJIT 2.0E<sol>2.1|http://luajit.org/luajit.html>, into Nginx and by leveraging Nginx's subrequests, allows the integration of the powerful Lua threads (Lua coroutines) into the Nginx event model.[m
[31m-[m
[31m-Unlike L<Apache's mod_lua|https://httpd.apache.org/docs/trunk/mod/mod_lua.html> and L<Lighttpd's mod_magnet|http://redmine.lighttpd.net/wiki/1/Docs:ModMagnet>, Lua code executed using this module can be I<100% non-blocking> on network traffic as long as the L<Nginx API for Lua> provided by this module is used to handle[m
[31m-requests to upstream services such as MySQL, PostgreSQL, Memcached, Redis, or upstream HTTP web services.[m
[31m-[m
[31m-At least the following Lua libraries and Nginx modules can be used with this ngx_lua module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-memcached|https://github.com/openresty/lua-resty-memcached>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-mysql|https://github.com/openresty/lua-resty-mysql>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-redis|https://github.com/openresty/lua-resty-redis>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-dns|https://github.com/openresty/lua-resty-dns>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-upload|https://github.com/openresty/lua-resty-upload>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-websocket|https://github.com/openresty/lua-resty-websocket>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-lock|https://github.com/openresty/lua-resty-lock>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-logger-socket|https://github.com/cloudflare/lua-resty-logger-socket>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-lrucache|https://github.com/openresty/lua-resty-lrucache>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-string|https://github.com/openresty/lua-resty-string>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_memc|http://github.com/openresty/memc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_postgres|https://github.com/FRiCKLE/ngx_postgres>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_redis2|http://github.com/openresty/redis2-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_redis|http://wiki.nginx.org/HttpRedisModule>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_proxy|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_fastcgi|http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Almost all the Nginx modules can be used with this ngx_lua module by means of L<ngx.location.capture> or L<ngx.location.capture_multi> but it is recommended to use those C<lua-resty-*> libraries instead of creating subrequests to access the Nginx upstream modules because the former is usually much more flexible and memory-efficient.[m
[31m-[m
[31m-The Lua interpreter or LuaJIT instance is shared across all the requests in a single nginx worker process but request contexts are segregated using lightweight Lua coroutines.[m
[31m-[m
[31m-Loaded Lua modules persist in the nginx worker process level resulting in a small memory footprint in Lua even when under heavy loads.[m
[31m-[m
[31m-This module is plugged into NGINX's "http" subsystem so it can only speaks downstream communication protocols in the HTTP family (HTTP 0.9/1.0/1.1/2.0, WebSockets, and etc).[m
[31m-If you want to do generic TCP communications with the downstream clients, then you should use the L<ngx_stream_lua|https://github.com/openresty/stream-lua-nginx-module#readme> module instead[m
[31m-which has a compatible Lua API.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Typical Uses[m
[31m-[m
[31m-Just to name a few:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Mashup'ing and processing outputs of various nginx upstream outputs (proxy, drizzle, postgres, redis, memcached, and etc) in Lua,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-doing arbitrarily complex access control and security checks in Lua before requests actually reach the upstream backends,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-manipulating response headers in an arbitrary way (by Lua)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-fetching backend information from external storage backends (like redis, memcached, mysql, postgresql) and use that information to choose which upstream backend to access on-the-fly,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-coding up arbitrarily complex web applications in a content handler using synchronous but still non-blocking access to the database backends and other storage,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-doing very complex URL dispatch in Lua at rewrite phase,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-using Lua to implement advanced caching mechanism for Nginx's subrequests and arbitrary locations.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The possibilities are unlimited as the module allows bringing together various elements within Nginx as well as exposing the power of the Lua language to the user. The module provides the full flexibility of scripting while offering performance levels comparable with native C language programs both in terms of CPU time as well as memory footprint. This is particularly the case when LuaJIT 2.x is enabled.[m
[31m-[m
[31m-Other scripting language implementations typically struggle to match this performance level.[m
[31m-[m
[31m-The Lua state (Lua VM instance) is shared across all the requests handled by a single nginx worker process to minimize memory use.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Nginx Compatibility[m
[31m-[m
[31m-The latest version of this module is compatible with the following versions of Nginx:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.9.x (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.8.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Nginx cores older than 1.6.0 (exclusive) are I<not> supported.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is highly recommended to use the L<OpenResty bundle|http://openresty.org> that bundles Nginx, ngx_lua,  LuaJIT 2.0/2.1 (or the optional standard Lua 5.1 interpreter), as well as a package of powerful companion Nginx modules. The basic installation step is a simple command: C<./configure --with-luajit && make && make install>.[m
[31m-[m
[31m-Alternatively, ngx_lua can be manually compiled into Nginx:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Install LuaJIT 2.0 or 2.1 (recommended) or Lua 5.1 (Lua 5.2 is I<not> supported yet). LuaJIT can be downloaded from the L<LuaJIT project website|http://luajit.org/download.html> and Lua 5.1, from the L<Lua project website|http://www.lua.org/>.  Some distribution package managers also distribute LuaJIT and/or Lua.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Download the latest version of the ngx_devel_kit (NDK) module L<HERE|https://github.com/simpl/ngx_devel_kit/tags>.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Download the latest version of ngx_lua L<HERE|https://github.com/openresty/lua-nginx-module/tags>.[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-Download the latest version of Nginx L<HERE|http://nginx.org/> (See L<Nginx Compatibility>)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Build the source with this module:[m
[31m-[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     # tell nginx's build system where to find LuaJIT 2.0:[m
[31m-     export LUAJIT_LIB=/path/to/luajit/lib[m
[31m-     export LUAJIT_INC=/path/to/luajit/include/luajit-2.0[m
[31m-    [m
[31m-     # tell nginx's build system where to find LuaJIT 2.1:[m
[31m-     export LUAJIT_LIB=/path/to/luajit/lib[m
[31m-     export LUAJIT_INC=/path/to/luajit/include/luajit-2.1[m
[31m-    [m
[31m-     # or tell where to find Lua if using Lua instead:[m
[31m-     #export LUA_LIB=/path/to/lua/lib[m
[31m-     #export LUA_INC=/path/to/lua/include[m
[31m-    [m
[31m-     # Here we assume Nginx is to be installed under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-             --with-ld-opt="-Wl,-rpath,/path/to/luajit-or-lua/lib" \[m
[31m-             --add-module=/path/to/ngx_devel_kit \[m
[31m-             --add-module=/path/to/lua-nginx-module[m
[31m-    [m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_lua_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 C Macro Configurations[m
[31m-[m
[31m-While building this module either via OpenResty or with the NGINX core, you can define the following C macros via the C compiler options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<NGX_LUA_USE_ASSERT>[m
[31m-When defined, will enable assertions in the ngx_lua C code base. Recommended for debugging or testing builds. It can introduce some (small) runtime overhead when enabled. This macro was first introduced in the C<v0.9.10> release.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<NGX_LUA_ABORT_AT_PANIC>[m
[31m-When the Lua/LuaJIT VM panics, ngx_lua will instruct the current nginx worker process to quit gracefully by default. By specifying this C macro, ngx_lua will abort the current nginx worker process (which usually result in a core dump file) immediately. This option is useful for debugging VM panics. This option was first introduced in the C<v0.9.8> release.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<NGX_LUA_NO_FFI_API>[m
[31m-Excludes pure C API functions for FFI-based Lua API for NGINX (as required by L<lua-resty-core|https://github.com/openresty/lua-resty-core#readme>, for example). Enabling this macro can make the resulting binary code size smaller.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-To enable one or more of these macros, just pass extra C compiler options to the C<./configure> script of either NGINX or OpenResty. For instance,[m
[31m-[m
[31m-    ./configure --with-cc-opt="-DNGX_LUA_USE_ASSERT -DNGX_LUA_ABORT_AT_PANIC"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Installation on Ubuntu 11.10[m
[31m-[m
[31m-Note that it is recommended to use LuaJIT 2.0 or LuaJIT 2.1 instead of the standard Lua 5.1 interpreter wherever possible.[m
[31m-[m
[31m-If the standard Lua 5.1 interpreter is required however, run the following command to install it from the Ubuntu repository:[m
[31m-[m
[31m-[m
[31m-     apt-get install -y lua5.1 liblua5.1-0 liblua5.1-0-dev[m
[31m-[m
[31m-Everything should be installed correctly, except for one small tweak.[m
[31m-[m
[31m-Library name C<liblua.so> has been changed in liblua5.1 package, it only comes with C<liblua5.1.so>, which needs to be symlinked to C</usr/lib> so it could be found during the configuration process.[m
[31m-[m
[31m-[m
[31m-     ln -s /usr/lib/x86_64-linux-gnu/liblua5.1.so /usr/lib/liblua.so[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Code Repository[m
[31m-[m
[31m-The code repository of this project is hosted on github at L<openrestyE<sol>lua-nginx-module|https://github.com/openresty/lua-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-nginx-module/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Lua/LuaJIT bytecode support[m
[31m-[m
[31m-As from the C<v0.5.0rc32> release, all C<*_by_lua_file> configure directives (such as L<content_by_lua_file>) support loading Lua 5.1 and LuaJIT 2.0/2.1 raw bytecode files directly.[m
[31m-[m
[31m-Please note that the bytecode format used by LuaJIT 2.0/2.1 is not compatible with that used by the standard Lua 5.1 interpreter. So if using LuaJIT 2.0/2.1 with ngx_lua, LuaJIT compatible bytecode files must be generated as shown:[m
[31m-[m
[31m-[m
[31m-     /path/to/luajit/bin/luajit -b /path/to/input_file.lua /path/to/output_file.luac[m
[31m-[m
[31m-The C<-bg> option can be used to include debug information in the LuaJIT bytecode file:[m
[31m-[m
[31m-[m
[31m-     /path/to/luajit/bin/luajit -bg /path/to/input_file.lua /path/to/output_file.luac[m
[31m-[m
[31m-Please refer to the official LuaJIT documentation on the C<-b> option for more details:[m
[31m-[m
[31m-E<lt>http://luajit.org/running.html#opt_bE<gt>[m
[31m-[m
[31m-Also, the bytecode files generated by LuaJIT 2.1 is I<not> compatible with LuaJIT 2.0, and vice versa. The support for LuaJIT 2.1 bytecode was first added in ngx_lua v0.9.3.[m
[31m-[m
[31m-Similarly, if using the standard Lua 5.1 interpreter with ngx_lua, Lua compatible bytecode files must be generated using the C<luac> commandline utility as shown:[m
[31m-[m
[31m-[m
[31m-     luac -o /path/to/output_file.luac /path/to/input_file.lua[m
[31m-[m
[31m-Unlike as with LuaJIT, debug information is included in standard Lua 5.1 bytecode files by default. This can be striped out by specifying the C<-s> option as shown:[m
[31m-[m
[31m-[m
[31m-     luac -s -o /path/to/output_file.luac /path/to/input_file.lua[m
[31m-[m
[31m-Attempts to load standard Lua 5.1 bytecode files into ngx_lua instances linked to LuaJIT 2.0/2.1 or vice versa, will result in an error message, such as that below, being logged into the Nginx C<error.log> file:[m
[31m-[m
[31m-    [error] 13909#0: *1 failed to load Lua inlined code: bad byte-code header in /path/to/test_file.luac[m
[31m-[m
[31m-Loading bytecode files via the Lua primitives like C<require> and C<dofile> should always work as expected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 System Environment Variable Support[m
[31m-[m
[31m-If you want to access the system environment variable, say, C<foo>, in Lua via the standard Lua API L<os.getenv|http://www.lua.org/manual/5.1/manual.html#pdf-os.getenv>, then you should also list this environment variable name in your C<nginx.conf> file via the L<env directive|http://nginx.org/en/docs/ngx_core_module.html#env>. For example,[m
[31m-[m
[31m-[m
[31m-     env foo;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 HTTP 1.0 support[m
[31m-[m
[31m-The HTTP 1.0 protocol does not support chunked output and requires an explicit C<Content-Length> header when the response body is not empty in order to support the HTTP 1.0 keep-alive.[m
[31m-So when a HTTP 1.0 request is made and the L<lua_http10_buffering> directive is turned C<on>, ngx_lua will buffer the[m
[31m-output of L<ngx.say> and L<ngx.print> calls and also postpone sending response headers until all the response body output is received.[m
[31m-At that time ngx_lua can calculate the total length of the body and construct a proper C<Content-Length> header to return to the HTTP 1.0 client.[m
[31m-If the C<Content-Length> response header is set in the running Lua code, however, this buffering will be disabled even if the L<lua_http10_buffering> directive is turned C<on>.[m
[31m-[m
[31m-For large streaming output responses, it is important to disable the L<lua_http10_buffering> directive to minimise memory usage.[m
[31m-[m
[31m-Note that common HTTP benchmark tools such as C<ab> and C<http_load> issue HTTP 1.0 requests by default.[m
[31m-To force C<curl> to send HTTP 1.0 requests, use the C<-0> option.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Statically Linking Pure Lua Modules[m
[31m-[m
[31m-When LuaJIT 2.x is used, it is possible to statically link the bytecode of pure Lua modules into the Nginx executable.[m
[31m-[m
[31m-Basically you use the C<luajit> executable to compile C<.lua> Lua module files to C<.o> object files containing the exported bytecode data, and then link the C<.o> files directly in your Nginx build.[m
[31m-[m
[31m-Below is a trivial example to demonstrate this. Consider that we have the following C<.lua> file named C<foo.lua>:[m
[31m-[m
[31m-[m
[31m-     -- foo.lua[m
[31m-     local _M = {}[m
[31m-    [m
[31m-     function _M.go()[m
[31m-         print("Hello from foo")[m
[31m-     end[m
[31m-    [m
[31m-     return _M[m
[31m-[m
[31m-And then we compile this C<.lua> file to C<foo.o> file:[m
[31m-[m
[31m-    /path/to/luajit/bin/luajit -bg foo.lua foo.o[m
[31m-[m
[31m-What matters here is the name of the C<.lua> file, which determines how you use this module later on the Lua land. The file name C<foo.o> does not matter at all except the C<.o> file extension (which tells C<luajit> what output format is used). If you want to strip the Lua debug information from the resulting bytecode, you can just specify the C<-b> option above instead of C<-bg>.[m
[31m-[m
[31m-Then when building Nginx or OpenResty, pass the C<--with-ld-opt="foo.o"> option to the C<./configure> script:[m
[31m-[m
[31m-[m
[31m-     ./configure --with-ld-opt="/path/to/foo.o" ...[m
[31m-[m
[31m-Finally, you can just do the following in any Lua code run by ngx_lua:[m
[31m-[m
[31m-[m
[31m-     local foo = require "foo"[m
[31m-     foo.go()[m
[31m-[m
[31m-And this piece of code no longer depends on the external C<foo.lua> file any more because it has already been compiled into the C<nginx> executable.[m
[31m-[m
[31m-If you want to use dot in the Lua module name when calling C<require>, as in[m
[31m-[m
[31m-[m
[31m-     local foo = require "resty.foo"[m
[31m-[m
[31m-then you need to rename the C<foo.lua> file to C<resty_foo.lua> before compiling it down to a C<.o> file with the C<luajit> command-line utility.[m
[31m-[m
[31m-It is important to use exactly the same version of LuaJIT when compiling C<.lua> files to C<.o> files as building nginx + ngx_lua. This is because the LuaJIT bytecode format may be incompatible between different LuaJIT versions. When the bytecode format is incompatible, you will see a Lua runtime error saying that the Lua module is not found.[m
[31m-[m
[31m-When you have multiple C<.lua> files to compile and link, then just specify their C<.o> files at the same time in the value of the C<--with-ld-opt> option. For instance,[m
[31m-[m
[31m-[m
[31m-     ./configure --with-ld-opt="/path/to/foo.o /path/to/bar.o" ...[m
[31m-[m
[31m-If you have just too many C<.o> files, then it might not be feasible to name them all in a single command. In this case, you can build a static library (or archive) for your C<.o> files, as in[m
[31m-[m
[31m-[m
[31m-     ar rcus libmyluafiles.a *.o[m
[31m-[m
[31m-then you can link the C<myluafiles> archive as a whole to your nginx executable:[m
[31m-[m
[31m-[m
[31m-     ./configure \[m
[31m-         --with-ld-opt="-L/path/to/lib -Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive"[m
[31m-[m
[31m-where C</path/to/lib> is the path of the directory containing the C<libmyluafiles.a> file. It should be noted that the linker option C<--whole-archive> is required here because otherwise our archive will be skipped because no symbols in our archive are mentioned in the main parts of the nginx executable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Data Sharing within an Nginx Worker[m
[31m-[m
[31m-To globally share data among all the requests handled by the same nginx worker process, encapsulate the shared data into a Lua module, use the Lua C<require> builtin to import the module, and then manipulate the shared data in Lua. This works because required Lua modules are loaded only once and all coroutines will share the same copy of the module (both its code and data). Note however that Lua global variables (note, not module-level variables) WILL NOT persist between requests because of the one-coroutine-per-request isolation design.[m
[31m-[m
[31m-Here is a complete small example:[m
[31m-[m
[31m-[m
[31m-     -- mydata.lua[m
[31m-     local _M = {}[m
[31m-    [m
[31m-     local data = {[m
[31m-         dog = 3,[m
[31m-         cat = 4,[m
[31m-         pig = 5,[m
[31m-     }[m
[31m-    [m
[31m-     function _M.get_age(name)[m
[31m-         return data[name][m
[31m-     end[m
[31m-    [m
[31m-     return _M[m
[31m-[m
[31m-and then accessing it from C<nginx.conf>:[m
[31m-[m
[31m-[m
[31m-     location /lua {[m
[31m-         content_by_lua '[m
[31m-             local mydata = require "mydata"[m
[31m-             ngx.say(mydata.get_age("dog"))[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-The C<mydata> module in this example will only be loaded and run on the first request to the location C</lua>,[m
[31m-and all subsequent requests to the same nginx worker process will use the reloaded instance of the[m
[31m-module as well as the same copy of the data in it, until a C<HUP> signal is sent to the Nginx master process to force a reload.[m
[31m-This data sharing technique is essential for high performance Lua applications based on this module.[m
[31m-[m
[31m-Note that this data sharing is on a I<per-worker> basis and not on a I<per-server> basis. That is, when there are multiple nginx worker processes under an Nginx master, data sharing cannot cross the process boundary between these workers.[m
[31m-[m
[31m-It is usually recommended to share read-only data this way. You can also share changeable data among all the concurrent requests of each nginx worker process as[m
[31m-long as there is I<no> nonblocking I/O operations (including L<ngx.sleep>)[m
[31m-in the middle of your calculations. As long as you do not give the[m
[31m-control back to the nginx event loop and ngx_lua's light thread[m
[31m-scheduler (even implicitly), there can never be any race conditions in[m
[31m-between. For this reason, always be very careful when you want to share changeable data on the[m
[31m-worker level. Buggy optimizations can easily lead to hard-to-debug[m
[31m-race conditions under load.[m
[31m-[m
[31m-If server-wide data sharing is required, then use one or more of the following approaches:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Use the L<ngx.shared.DICT> API provided by this module.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Use only a single nginx worker and a single server (this is however not recommended when there is a multi core CPU or multiple CPUs in a single machine).[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Use data storage mechanisms such as C<memcached>, C<redis>, C<MySQL> or C<PostgreSQL>. L<The OpenResty bundle|http://openresty.org> associated with this module comes with a set of companion Nginx modules and Lua libraries that provide interfaces with these data storage mechanisms.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TCP socket connect operation issues[m
[31m-[m
[31m-The L<tcpsock:connect> method may indicate C<success> despite connection failures such as with C<Connection Refused> errors. [m
[31m-[m
[31m-However, later attempts to manipulate the cosocket object will fail and return the actual error status message generated by the failed connect operation. [m
[31m-[m
[31m-This issue is due to limitations in the Nginx event model and only appears to affect Mac OS X.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Lua Coroutine Yielding/Resuming[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Because Lua's C<dofile> and C<require> builtins are currently implemented as C functions in both Lua 5.1 and LuaJIT 2.0/2.1, if the Lua file being loaded by C<dofile> or C<require> invokes L<ngx.location.capture*>, L<ngx.exec>, L<ngx.exit>, or other API functions requiring yielding in the I<top-level> scope of the Lua file, then the Lua error "attempt to yield across C-call boundary" will be raised. To avoid this, put these calls requiring yielding into your own Lua functions in the Lua file instead of the top-level scope of the file.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-As the standard Lua 5.1 interpreter's VM is not fully resumable, the methods L<ngx.location.capture>, L<ngx.location.capture_multi>, L<ngx.redirect>, L<ngx.exec>, and L<ngx.exit> cannot be used within the context of a Lua L<pcall()|http://www.lua.org/manual/5.1/manual.html#pdf-pcall> or L<xpcall()|http://www.lua.org/manual/5.1/manual.html#pdf-xpcall> or even the first line of the C<for ... in ...> statement when the standard Lua 5.1 interpreter is used and the C<attempt to yield across metamethod/C-call boundary> error will be produced. Please use LuaJIT 2.x, which supports a fully resumable VM, to avoid this.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Lua Variable Scope[m
[31m-[m
[31m-Care must be taken when importing modules and this form should be used:[m
[31m-[m
[31m-[m
[31m-     local xxx = require('xxx')[m
[31m-[m
[31m-instead of the old deprecated form:[m
[31m-[m
[31m-[m
[31m-     require('xxx')[m
[31m-[m
[31m-Here is the reason: by design, the global environment has exactly the same lifetime as the Nginx request handler associated with it. Each request handler has its own set of Lua global variables and that is the idea of request isolation. The Lua module is actually loaded by the first Nginx request handler and is cached by the C<require()> built-in in the C<package.loaded> table for later reference, and the C<module()> builtin used by some Lua modules has the side effect of setting a global variable to the loaded module table. But this global variable will be cleared at the end of the request handler,  and every subsequent request handler all has its own (clean) global environment. So one will get Lua exception for accessing the C<nil> value.[m
[31m-[m
[31m-Generally, use of Lua global variables is a really really bad idea in the context of ngx_lua because[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-misuse of Lua globals has very bad side effects for concurrent requests when these variables are actually supposed to be local only,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Lua global variables require Lua table look-up in the global environment (which is just a Lua table), which is kinda expensive, and[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-some Lua global variable references are just typos, which are hard to debug.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-It's I<highly> recommended to always declare them via "local" in the scope that is reasonable.[m
[31m-[m
[31m-To find out all the uses of Lua global variables in your Lua code, you can run the L<lua-releng tool|https://github.com/openresty/nginx-devel-utils/blob/master/lua-releng> across all your .lua source files:[m
[31m-[m
[31m-    $ lua-releng[m
[31m-    Checking use of Lua global variables in file lib/foo/bar.lua ...[m
[31m-            1       [1489]  SETGLOBAL       7 -1    ; contains[m
[31m-            55      [1506]  GETGLOBAL       7 -3    ; setvar[m
[31m-            3       [1545]  GETGLOBAL       3 -4    ; varexpand[m
[31m-[m
[31m-The output says that the line 1489 of file C<lib/foo/bar.lua> writes to a global variable named C<contains>, the line 1506 reads from the global variable C<setvar>, and line 1545 reads the global C<varexpand>.[m
[31m-[m
[31m-This tool will guarantee that local variables in the Lua module functions are all declared with the C<local> keyword, otherwise a runtime exception will be thrown. It prevents undesirable race conditions while accessing such variables. See L<Data Sharing within an Nginx Worker> for the reasons behind this.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Locations Configured by Subrequest Directives of Other Modules[m
[31m-[m
[31m-The L<ngx.location.capture> and L<ngx.location.capture_multi> directives cannot capture locations that include the L<add_before_body|http://nginx.org/en/docs/http/ngx_http_addition_module.html#add_before_body>, L<add_after_body|http://nginx.org/en/docs/http/ngx_http_addition_module.html#add_after_body>, L<auth_request|http://nginx.org/en/docs/http/ngx_http_auth_request_module.html#auth_request>, L<echo_location|http://github.com/openresty/echo-nginx-module#echo_location>, L<echo_location_async|http://github.com/openresty/echo-nginx-module#echo_location_async>, L<echo_subrequest|http://github.com/openresty/echo-nginx-module#echo_subrequest>, or L<echo_subrequest_async|http://github.com/openresty/echo-nginx-module#echo_subrequest_async> directives.[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         content_by_lua '[m
[31m-             res = ngx.location.capture("/bar")[m
[31m-         ';[m
[31m-     }[m
[31m-     location /bar {[m
[31m-         echo_location /blah;[m
[31m-     }[m
[31m-     location /blah {[m
[31m-         echo "Success!";[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     $ curl -i http://example.com/foo[m
[31m-[m
[31m-will not work as expected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Cosockets Not Available Everywhere[m
[31m-[m
[31m-Due the internal limitations in the nginx core, the cosocket API are disabled in the following contexts: L<set_by_lua*>, L<log_by_lua*>, L<header_filter_by_lua*>, and L<body_filter_by_lua>.[m
[31m-[m
[31m-The cosockets are currently also disabled in the L<init_by_lua*> and L<init_worker_by_lua*> directive contexts but we may add support for these contexts in the future because there is no limitation in the nginx core (or the limitation might be worked around).[m
[31m-[m
[31m-There exists a work-around, however, when the original context does I<not> need to wait for the cosocket results. That is, creating a 0-delay timer via the L<ngx.timer.at> API and do the cosocket results in the timer handler, which runs asynchronously as to the original context creating the timer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Special Escaping Sequences[m
[31m-[m
[31m-B<WARNING> We no longer suffer from this pitfall since the introduction of the[m
[31m-C<*_by_lua_block {}> configuration directives.[m
[31m-[m
[31m-PCRE sequences such as C<\d>, C<\s>, or C<\w>, require special attention because in string literals, the backslash character, C<\>, is stripped out by both the Lua language parser and by the Nginx config file parser before processing. So the following snippet will not work as expected:[m
[31m-[m
[31m-[m
[31m-     # nginx.conf[m
[31m-     ? location /test {[m
[31m-     ?     content_by_lua '[m
[31m-     ?         local regex = "\d+"  -- THIS IS WRONG!![m
[31m-     ?         local m = ngx.re.match("hello, 1234", regex)[m
[31m-     ?         if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-     ?     ';[m
[31m-     ? }[m
[31m-     # evaluates to "not matched!"[m
[31m-[m
[31m-To avoid this, I<double> escape the backslash:[m
[31m-[m
[31m-[m
[31m-     # nginx.conf[m
[31m-     location /test {[m
[31m-         content_by_lua '[m
[31m-             local regex = "\\\\d+"[m
[31m-             local m = ngx.re.match("hello, 1234", regex)[m
[31m-             if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-         ';[m
[31m-     }[m
[31m-     # evaluates to "1234"[m
[31m-[m
[31m-Here, C<\\\\d+> is stripped down to C<\\d+> by the Nginx config file parser and this is further stripped down to C<\d+> by the Lua language parser before running.[m
[31m-[m
[31m-Alternatively, the regex pattern can be presented as a long-bracketed Lua string literal by encasing it in "long brackets", C<[[...]]>, in which case backslashes have to only be escaped once for the Nginx config file parser. [m
[31m-[m
[31m-[m
[31m-     # nginx.conf[m
[31m-     location /test {[m
[31m-         content_by_lua '[m
[31m-             local regex = [[\\d+]][m
[31m-             local m = ngx.re.match("hello, 1234", regex)[m
[31m-             if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-         ';[m
[31m-     }[m
[31m-     # evaluates to "1234"[m
[31m-[m
[31m-Here, C<[[\\d+]]> is stripped down to C<[[\d+]]> by the Nginx config file parser and this is processed correctly.[m
[31m-[m
[31m-Note that a longer from of the long bracket, C<[=[...]=]>, may be required if the regex pattern contains C<[...]> sequences. [m
[31m-The C<[=[...]=]> form may be used as the default form if desired.[m
[31m-[m
[31m-[m
[31m-     # nginx.conf[m
[31m-     location /test {[m
[31m-         content_by_lua '[m
[31m-             local regex = [=[[0-9]+]=][m
[31m-             local m = ngx.re.match("hello, 1234", regex)[m
[31m-             if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-         ';[m
[31m-     }[m
[31m-     # evaluates to "1234"[m
[31m-[m
[31m-An alternative approach to escaping PCRE sequences is to ensure that Lua code is placed in external script files and executed using the various C<*_by_lua_file> directives. [m
[31m-With this approach, the backslashes are only stripped by the Lua language parser and therefore only need to be escaped once each.[m
[31m-[m
[31m-[m
[31m-     -- test.lua[m
[31m-     local regex = "\\d+"[m
[31m-     local m = ngx.re.match("hello, 1234", regex)[m
[31m-     if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-     -- evaluates to "1234"[m
[31m-[m
[31m-Within external script files, PCRE sequences presented as long-bracketed Lua string literals do not require modification. [m
[31m-[m
[31m-[m
[31m-     -- test.lua[m
[31m-     local regex = [[\d+]][m
[31m-     local m = ngx.re.match("hello, 1234", regex)[m
[31m-     if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-     -- evaluates to "1234"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Mixing with SSI Not Supported[m
[31m-[m
[31m-Mixing SSI with ngx_lua in the same Nginx request is not supported at all. Just use ngx_lua exclusively. Everything you can do with SSI can be done atop ngx_lua anyway and it can be more efficient when using ngx_lua.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 SPDY Mode Not Fully Supported[m
[31m-[m
[31m-Certain Lua APIs provided by ngx_lua do not work in Nginx's SPDY mode yet: L<ngx.location.capture>, L<ngx.location.capture_multi>, and L<ngx.req.socket>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Missing data on short circuited requests[m
[31m-[m
[31m-Nginx may terminate a request early with (at least):[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-400 (Bad Request)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-405 (Not Allowed)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-408 (Request Timeout)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-414 (Request URI Too Large)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-494 (Request Headers Too Large)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-499 (Client Closed Request)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-500 (Internal Server Error)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-501 (Not Implemented)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This means that phases that normally run are skipped, such as the rewrite or[m
[31m-access phase. This also means that later phases that are run regardless, e.g.[m
[31m-L<log_by_lua>, will not have access to information that is normally set in those[m
[31m-phases.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: implement LuaSocket's unconnected UDP API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-port this module to the "datagram" subsystem of NGINX for implementing general UDP servers instead of HTTP[m
[31m-servers in Lua. For example,[m
[31m-[m
[31m-     datagram {[m
[31m-         server {[m
[31m-             listen 1953;[m
[31m-             handler_by_lua '[m
[31m-                 -- custom Lua code implementing the special UDP server...[m
[31m-             ';[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-shm: implement a "shared queue API" to complement the existing L<shared dict> API.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: add support in the context of L<init_by_lua*>.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: implement the C<bind()> method for stream-typed cosockets.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: pool-based backend concurrency level control: implement automatic C<connect> queueing when the backend concurrency exceeds its connection pool limit.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: review and merge aviramc's L<patch|https://github.com/openresty/lua-nginx-module/pull/290> for adding the C<bsdrecv> method.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add new API function C<ngx.resp.add_header> to emulate the standard C<add_header> config directive.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-review and apply Jader H. Silva's patch for C<ngx.re.split()>.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-review and apply vadim-pavlov's patch for L<ngx.location.capture>'s C<extra_headers> option[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-use C<ngx_hash_t> to optimize the built-in header look-up process for L<ngx.req.set_header>, L<ngx.header.HEADER>, and etc.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add configure options for different strategies of handling the cosocket connection exceeding in the pools.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add directives to run Lua codes when nginx stops.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add C<ignore_resp_headers>, C<ignore_resp_body>, and C<ignore_resp> options to L<ngx.location.capture> and L<ngx.location.capture_multi> methods, to allow micro performance tuning on the user side.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add automatic Lua code time slicing support by yielding and resuming the Lua VM actively via Lua's debug hooks.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add C<stat> mode similar to L<mod_lua|https://httpd.apache.org/docs/trunk/mod/mod_lua.html>.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: add client SSL certificiate support.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-The following dependencies are required to run the test suite:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Nginx version E<gt>= 1.4.2[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Perl modules:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Test::Nginx: E<lt>https://github.com/openresty/test-nginxE<gt>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Nginx modules:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_set_misc|https://github.com/openresty/set-misc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_auth_request|http://mdounin.ru/files/ngx_http_auth_request_module-0.2.tar.gz> (this is not needed if you're using Nginx 1.5.4+.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_echo|https://github.com/openresty/echo-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_memc|https://github.com/openresty/memc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_srcache|https://github.com/openresty/srcache-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ngx_lua (i.e., this module)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua_upstream|https://github.com/openresty/lua-upstream-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_headers_more|https://github.com/openresty/headers-more-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_drizzle|https://github.com/openresty/drizzle-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_rds_json|https://github.com/openresty/rds-json-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_coolkit|https://github.com/FRiCKLE/ngx_coolkit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_redis2|https://github.com/openresty/redis2-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The order in which these modules are added during configuration is important because the position of any filter module in the[m
[31m-filtering chain determines the final output, for example. The correct adding order is shown above.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-3rd-party Lua libraries:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-cjson|http://www.kyne.com.au/~mark/software/lua-cjson.php>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Applications:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-mysql: create database 'ngx_test', grant all privileges to user 'ngx_test', password is 'ngx_test'[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-memcached: listening on the default port, 11211.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-redis: listening on the default port, 6379.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-See also the L<developer build script|https://github.com/openresty/lua-nginx-module/blob/master/util/build.sh> for more details on setting up the testing environment.[m
[31m-[m
[31m-To run the whole test suite in the default testing mode:[m
[31m-[m
[31m-    cd /path/to/lua-nginx-module[m
[31m-    export PATH=/path/to/your/nginx/sbin:$PATH[m
[31m-    prove -I/path/to/test-nginx/lib -r t[m
[31m-[m
[31m-To run specific test files:[m
[31m-[m
[31m-    cd /path/to/lua-nginx-module[m
[31m-    export PATH=/path/to/your/nginx/sbin:$PATH[m
[31m-    prove -I/path/to/test-nginx/lib t/002-content.t t/003-errors.t[m
[31m-[m
[31m-To run a specific test block in a particular test file, add the line C<--- ONLY> to the test block you want to run, and then use the C<prove> utility to run that C<.t> file.[m
[31m-[m
[31m-There are also various testing modes based on mockeagain, valgrind, and etc. Refer to the L<Test::Nginx documentation|http://search.cpan.org/perldoc?Test::Nginx> for more details for various advanced testing modes. See also the test reports for the Nginx test cluster running on Amazon EC2: E<lt>http://qa.openresty.org.E<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2009-2016, by Xiaozhe Wang (chaoslawful) E<lt>chaoslawful@gmail.comE<gt>.[m
[31m-[m
[31m-Copyright (C) 2009-2016, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_lua_module|https://github.com/openresty/stream-lua-nginx-module#readme> for an official port of this module for the NGINX "stream" subsystem (doing generic downstream TCP communications).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-memcached|https://github.com/openresty/lua-resty-memcached> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-redis|https://github.com/openresty/lua-resty-redis> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-mysql|https://github.com/openresty/lua-resty-mysql> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-upload|https://github.com/openresty/lua-resty-upload> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-dns|https://github.com/openresty/lua-resty-dns> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-websocket|https://github.com/openresty/lua-resty-websocket> library for both WebSocket server and client, based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-string|https://github.com/openresty/lua-resty-string> library based on L<LuaJIT FFI|http://luajit.org/ext_ffi.html>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-lock|https://github.com/openresty/lua-resty-lock> library for a nonblocking simple lock API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-cookie|https://github.com/cloudflare/lua-resty-cookie> library for HTTP cookie manipulation.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Routing requests to different MySQL queries based on URI arguments|http://openresty.org/#RoutingMySQLQueriesBasedOnURIArgs>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Dynamic Routing Based on Redis and Lua|http://openresty.org/#DynamicRoutingBasedOnRedis>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Using LuaRocks with ngx_lua|http://openresty.org/#UsingLuaRocks>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Introduction to ngx_lua|https://github.com/openresty/lua-nginx-module/wiki/Introduction>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<drizzle-nginx-module|http://github.com/openresty/drizzle-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<postgres-nginx-module|https://github.com/FRiCKLE/ngx_postgres>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<memc-nginx-module|http://github.com/openresty/memc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<The OpenResty bundle|http://openresty.org>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Nginx Systemtap Toolkit|https://github.com/openresty/nginx-systemtap-toolkit>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_use_default_type>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_code_cache>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_regex_cache_max_entries>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_regex_match_limit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_package_path>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_package_cpath>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_worker_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_worker_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_worker_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<content_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<content_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<content_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rewrite_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rewrite_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rewrite_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<access_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<access_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<access_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<header_filter_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<header_filter_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<header_filter_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<body_filter_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<body_filter_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<body_filter_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<log_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<log_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<log_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<balancer_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<balancer_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_need_request_body>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ssl_certificate_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ssl_certificate_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_shared_dict>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_connect_timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_send_timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_send_lowat>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_read_timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_buffer_size>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_pool_size>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_keepalive_timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_log_errors>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_ciphers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_crl>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_protocols>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_trusted_certificate>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_verify_depth>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_http10_buffering>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rewrite_by_lua_no_postpone>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<access_by_lua_no_postpone>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_transform_underscores_in_response_headers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_check_client_abort>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_max_pending_timers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_max_running_timers>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The basic building blocks of scripting Nginx with Lua are directives. Directives are used to specify when the user Lua code is run and[m
[31m-how the result will be used. Below is a diagram showing the order in which directives are executed.[m
[31m-[m
[31m-!L<Lua Nginx Modules Directives|https://cloud.githubusercontent.com/assets/2137369/15272097/77d1c09e-1a37-11e6-97ef-d9767035fc3e.png>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_use_default_type[m
[31m-[m
[31m-B<syntax:> I<lua_use_default_type on | off>[m
[31m-[m
[31m-B<default:> I<lua_use_default_type on>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specifies whether to use the MIME type specified by the L<default_type|http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type> directive for the default value of the C<Content-Type> response header. If you do not want a default C<Content-Type> response header for your Lua request handlers, then turn this directive off.[m
[31m-[m
[31m-This directive is turned on by default.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_code_cache[m
[31m-[m
[31m-B<syntax:> I<lua_code_cache on | off>[m
[31m-[m
[31m-B<default:> I<lua_code_cache on>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Enables or disables the Lua code cache for Lua code in C<*_by_lua_file> directives (like L<set_by_lua_file> and[m
[31m-L<content_by_lua_file>) and Lua modules.[m
[31m-[m
[31m-When turning off, every request served by ngx_lua will run in a separate Lua VM instance, starting from the C<0.9.3> release. So the Lua files referenced in L<set_by_lua_file>,[m
[31m-L<content_by_lua_file>, L<access_by_lua_file>,[m
[31m-and etc will not be cached[m
[31m-and all Lua modules used will be loaded from scratch. With this in place, developers can adopt an edit-and-refresh approach.[m
[31m-[m
[31m-Please note however, that Lua code written inlined within nginx.conf[m
[31m-such as those specified by L<set_by_lua>, L<content_by_lua>,[m
[31m-L<access_by_lua>, and L<rewrite_by_lua> will not be updated when you edit the inlined Lua code in your C<nginx.conf> file because only the Nginx config file parser can correctly parse the C<nginx.conf>[m
[31m-file and the only way is to reload the config file[m
[31m-by sending a C<HUP> signal or just to restart Nginx.[m
[31m-[m
[31m-Even when the code cache is enabled, Lua files which are loaded by C<dofile> or C<loadfile>[m
[31m-in *_by_lua_file cannot be cached (unless you cache the results yourself). Usually you can either use the L<init_by_lua>[m
[31m-or L<init_by_lua_file> directives to load all such files or just make these Lua files true Lua modules[m
[31m-and load them via C<require>.[m
[31m-[m
[31m-The ngx_lua module does not support the C<stat> mode available with the[m
[31m-Apache C<mod_lua> module (yet).[m
[31m-[m
[31m-Disabling the Lua code cache is strongly[m
[31m-discouraged for production use and should only be used during [m
[31m-development as it has a significant negative impact on overall performance. For example, the performance a "hello world" Lua example can drop by an order of magnitude after disabling the Lua code cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_regex_cache_max_entries[m
[31m-[m
[31m-B<syntax:> I<lua_regex_cache_max_entries E<lt>numE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_regex_cache_max_entries 1024>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Specifies the maximum number of entries allowed in the worker process level compiled regex cache.[m
[31m-[m
[31m-The regular expressions used in L<ngx.re.match>, L<ngx.re.gmatch>, L<ngx.re.sub>, and L<ngx.re.gsub> will be cached within this cache if the regex option C<o> (i.e., compile-once flag) is specified.[m
[31m-[m
[31m-The default number of entries allowed is 1024 and when this limit is reached, new regular expressions will not be cached (as if the C<o> option was not specified) and there will be one, and only one, warning in the C<error.log> file:[m
[31m-[m
[31m-    2011/08/27 23:18:26 [warn] 31997#0: *1 lua exceeding regex cache max entries (1024), ...[m
[31m-[m
[31m-Do not activate the C<o> option for regular expressions (and/or C<replace> string arguments for L<ngx.re.sub> and L<ngx.re.gsub>) that are generated I<on the fly> and give rise to infinite variations to avoid hitting the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_regex_match_limit[m
[31m-[m
[31m-B<syntax:> I<lua_regex_match_limit E<lt>numE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_regex_match_limit 0>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Specifies the "match limit" used by the PCRE library when executing the L<ngx.re API>. To quote the PCRE manpage, "the limit ... has the effect of limiting the amount of backtracking that can take place."[m
[31m-[m
[31m-When the limit is hit, the error string "pcre_exec() failed: -8" will be returned by the L<ngx.re API> functions on the Lua land.[m
[31m-[m
[31m-When setting the limit to 0, the default "match limit" when compiling the PCRE library is used. And this is the default value of this directive.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.8.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_package_path[m
[31m-[m
[31m-B<syntax:> I<lua_package_path E<lt>lua-style-path-strE<gt>>[m
[31m-[m
[31m-B<default:> I<The content of LUA_PATH environ variable or Lua's compiled-in defaults.>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Sets the Lua module search path used by scripts specified by L<set_by_lua>,[m
[31m-L<content_by_lua> and others. The path string is in standard Lua path form, and C<;;>[m
[31m-can be used to stand for the original search paths.[m
[31m-[m
[31m-As from the C<v0.5.0rc29> release, the special notation C<$prefix> or C<${prefix}> can be used in the search path string to indicate the path of the C<server prefix> usually determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_package_cpath[m
[31m-[m
[31m-B<syntax:> I<lua_package_cpath E<lt>lua-style-cpath-strE<gt>>[m
[31m-[m
[31m-B<default:> I<The content of LUA_CPATH environment variable or Lua's compiled-in defaults.>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Sets the Lua C-module search path used by scripts specified by L<set_by_lua>,[m
[31m-L<content_by_lua> and others. The cpath string is in standard Lua cpath form, and C<;;>[m
[31m-can be used to stand for the original cpath.[m
[31m-[m
[31m-As from the C<v0.5.0rc29> release, the special notation C<$prefix> or C<${prefix}> can be used in the search path string to indicate the path of the C<server prefix> usually determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_by_lua[m
[31m-[m
[31m-B<syntax:> I<init_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<loading-config>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<init_by_lua_block> directive instead.[m
[31m-[m
[31m-Runs the Lua code specified by the argument C<< <lua-script-str> >> on the global Lua VM level when the Nginx master process (if any) is loading the Nginx config file.[m
[31m-[m
[31m-When Nginx receives the C<HUP> signal and starts reloading the config file, the Lua VM will also be re-created and C<init_by_lua> will run again on the new Lua VM. In case that the L<lua_code_cache> directive is turned off (default on), the C<init_by_lua> handler will run upon every request because in this special mode a standalone Lua VM is always created for each request.[m
[31m-[m
[31m-Usually you can register (true) Lua global variables or pre-load Lua modules at server start-up by means of this hook. Here is an example for pre-loading Lua modules:[m
[31m-[m
[31m-[m
[31m-     init_by_lua 'cjson = require "cjson"';[m
[31m-    [m
[31m-     server {[m
[31m-         location = /api {[m
[31m-             content_by_lua '[m
[31m-                 ngx.say(cjson.encode({dog = 5, cat = 6}))[m
[31m-             ';[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-You can also initialize the L<lua_shared_dict> shm storage at this phase. Here is an example for this:[m
[31m-[m
[31m-[m
[31m-     lua_shared_dict dogs 1m;[m
[31m-    [m
[31m-     init_by_lua '[m
[31m-         local dogs = ngx.shared.dogs;[m
[31m-         dogs:set("Tom", 56)[m
[31m-     ';[m
[31m-    [m
[31m-     server {[m
[31m-         location = /api {[m
[31m-             content_by_lua '[m
[31m-                 local dogs = ngx.shared.dogs;[m
[31m-                 ngx.say(dogs:get("Tom"))[m
[31m-             ';[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-But note that, the L<lua_shared_dict>'s shm storage will not be cleared through a config reload (via the C<HUP> signal, for example). So if you do I<not> want to re-initialize the shm storage in your C<init_by_lua> code in this case, then you just need to set a custom flag in the shm storage and always check the flag in your C<init_by_lua> code.[m
[31m-[m
[31m-Because the Lua code in this context runs before Nginx forks its worker processes (if any), data or code loaded here will enjoy the L<Copy-on-write (COW)|http://en.wikipedia.org/wiki/Copy-on-write> feature provided by many operating systems among all the worker processes, thus saving a lot of memory.[m
[31m-[m
[31m-Do I<not> initialize your own Lua global variables in this context because use of Lua global variables have performance penalties and can lead to global namespace pollution (see the L<Lua Variable Scope> section for more details). The recommended way is to use proper L<Lua module|http://www.lua.org/manual/5.1/manual.html#5.3> files (but do not use the standard Lua function L<module()|http://www.lua.org/manual/5.1/manual.html#pdf-module> to define Lua modules because it pollutes the global namespace as well) and call L<require()|http://www.lua.org/manual/5.1/manual.html#pdf-require> to load your own module files in C<init_by_lua> or other contexts (L<require()|http://www.lua.org/manual/5.1/manual.html#pdf-require> does cache the loaded Lua modules in the global C<package.loaded> table in the Lua registry so your modules will only loaded once for the whole Lua VM instance).[m
[31m-[m
[31m-Only a small set of the L<Nginx API for Lua> is supported in this context:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Logging APIs: L<ngx.log> and L<print>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Shared Dictionary API: L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-More Nginx APIs for Lua may be supported in this context upon future user requests.[m
[31m-[m
[31m-Basically you can safely use Lua libraries that do blocking I/O in this very context because blocking the master process during server start-up is completely okay. Even the Nginx core does blocking I/O (at least on resolving upstream's host names) at the configure-loading phase.[m
[31m-[m
[31m-You should be very careful about potential security vulnerabilities in your Lua code registered in this context because the Nginx master process is often run under the C<root> account.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<init_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<loading-config>[m
[31m-[m
[31m-Similar to the L<init_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     init_by_lua_block {[m
[31m-         print("I need no extra escaping here, for example: \r\nblah")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<init_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<loading-config>[m
[31m-[m
[31m-Equivalent to L<init_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code or L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_worker_by_lua[m
[31m-[m
[31m-B<syntax:> I<init_worker_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<starting-worker>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>; use the new L<init_worker_by_lua_block> directive instead.[m
[31m-[m
[31m-Runs the specified Lua code upon every Nginx worker process's startup when the master process is enabled. When the master process is disabled, this hook will just run after L<init_by_lua*>.[m
[31m-[m
[31m-This hook is often used to create per-worker reoccurring timers (via the L<ngx.timer.at> Lua API), either for backend health-check or other timed routine work. Below is an example,[m
[31m-[m
[31m-[m
[31m-     init_worker_by_lua '[m
[31m-         local delay = 3  -- in seconds[m
[31m-         local new_timer = ngx.timer.at[m
[31m-         local log = ngx.log[m
[31m-         local ERR = ngx.ERR[m
[31m-         local check[m
[31m-    [m
[31m-         check = function(premature)[m
[31m-             if not premature then[m
[31m-                 -- do the health check or other routine work[m
[31m-                 local ok, err = new_timer(delay, check)[m
[31m-                 if not ok then[m
[31m-                     log(ERR, "failed to create timer: ", err)[m
[31m-                     return[m
[31m-                 end[m
[31m-             end[m
[31m-         end[m
[31m-    [m
[31m-         local ok, err = new_timer(delay, check)[m
[31m-         if not ok then[m
[31m-             log(ERR, "failed to create timer: ", err)[m
[31m-             return[m
[31m-         end[m
[31m-     ';[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_worker_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<init_worker_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<starting-worker>[m
[31m-[m
[31m-Similar to the L<init_worker_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     init_worker_by_lua_block {[m
[31m-         print("I need no extra escaping here, for example: \r\nblah")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_worker_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<init_worker_by_lua_file E<lt>lua-file-pathE<gt>>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<starting-worker>[m
[31m-[m
[31m-Similar to L<init_worker_by_lua>, but accepts the file path to a Lua source file or Lua bytecode file.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_by_lua[m
[31m-[m
[31m-B<syntax:> I<set_by_lua $res E<lt>lua-script-strE<gt> [$arg1 $arg2 ...]>[m
[31m-[m
[31m-B<context:> I<server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>; use the new L<set_by_lua_block> directive instead.[m
[31m-[m
[31m-Executes code specified in C<< <lua-script-str> >> with optional input arguments C<$arg1 $arg2 ...>, and returns string output to C<$res>.[m
[31m-The code in C<< <lua-script-str> >> can make L<API calls> and can retrieve input arguments from the C<ngx.arg> table (index starts from C<1> and increases sequentially).[m
[31m-[m
[31m-This directive is designed to execute short, fast running code blocks as the Nginx event loop is blocked during code execution. Time consuming code sequences should therefore be avoided.[m
[31m-[m
[31m-This directive is implemented by injecting custom commands into the standard L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s command list. Because L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html> does not support nonblocking I/O in its commands, Lua APIs requiring yielding the current Lua "light thread" cannot work in this directive.[m
[31m-[m
[31m-At least the following API functions are currently disabled within the context of C<set_by_lua>:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Output API functions (e.g., L<ngx.say> and L<ngx.send_headers>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Control API functions (e.g., L<ngx.exit>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Subrequest API functions (e.g., L<ngx.location.capture> and L<ngx.location.capture_multi>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cosocket API functions (e.g., L<ngx.socket.tcp> and L<ngx.req.socket>).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Sleeping API function L<ngx.sleep>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-In addition, note that this directive can only write out a value to a single Nginx variable at[m
[31m-a time. However, a workaround is possible using the L<ngx.var.VARIABLE> interface.[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $diff ''; # we have to predefine the $diff variable here[m
[31m-    [m
[31m-         set_by_lua $sum '[m
[31m-             local a = 32[m
[31m-             local b = 56[m
[31m-    [m
[31m-             ngx.var.diff = a - b;  -- write to $diff directly[m
[31m-             return a + b;          -- return the $sum value normally[m
[31m-         ';[m
[31m-    [m
[31m-         echo "sum = $sum, diff = $diff";[m
[31m-     }[m
[31m-[m
[31m-This directive can be freely mixed with all directives of the L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>, L<set-misc-nginx-module|http://github.com/openresty/set-misc-nginx-module>, and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module> modules. All of these directives will run in the same order as they appear in the config file.[m
[31m-[m
[31m-[m
[31m-     set $foo 32;[m
[31m-     set_by_lua $bar 'return tonumber(ngx.var.foo) + 1';[m
[31m-     set $baz "bar: $bar";  # $baz == "bar: 33"[m
[31m-[m
[31m-As from the C<v0.5.0rc29> release, Nginx variable interpolation is disabled in the C<< <lua-script-str> >> argument of this directive and therefore, the dollar sign character (C<$>) can be used directly.[m
[31m-[m
[31m-This directive requires the L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<set_by_lua_block $res { lua-script }>[m
[31m-[m
[31m-B<context:> I<server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Similar to the L<set_by_lua> directive except that[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-this directive inlines the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping), and[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-this directive does not support extra arguments after the Lua script as in L<set_by_lua>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     set_by_lua_block $res { return 32 + math.cos(32) }[m
[31m-     # $res now has the value "32.834223360507" or alike.[m
[31m-[m
[31m-No special escaping is required in the Lua code block.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<set_by_lua_file $res E<lt>path-to-lua-script-fileE<gt> [$arg1 $arg2 ...]>[m
[31m-[m
[31m-B<context:> I<server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Equivalent to L<set_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed. [m
[31m-[m
[31m-Nginx variable interpolation is supported in the C<< <path-to-lua-script-file> >> argument string of this directive. But special care must be taken for injection attacks.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-When the Lua code cache is turned on (by default), the user code is loaded once at the first request and cached [m
[31m-and the Nginx config must be reloaded each time the Lua source file is modified.[m
[31m-The Lua code cache can be temporarily disabled during development by [m
[31m-switching L<lua_code_cache> C<off> in C<nginx.conf> to avoid reloading Nginx.[m
[31m-[m
[31m-This directive requires the L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 content_by_lua[m
[31m-[m
[31m-B<syntax:> I<content_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<content_by_lua_block> directive instead.[m
[31m-[m
[31m-Acts as a "content handler" and executes Lua code string specified in C<< <lua-script-str> >> for every request. [m
[31m-The Lua code may make L<API calls> and is executed as a new spawned coroutine in an independent global environment (i.e. a sandbox).[m
[31m-[m
[31m-Do not use this directive and other content handler directives in the same location. For example, this directive and the L<proxy_pass|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass> directive should not be used in the same location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 content_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<content_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Similar to the L<content_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     content_by_lua_block {[m
[31m-         ngx.say("I need no extra escaping here, for example: \r\nblah")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 content_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<content_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Equivalent to L<content_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-Nginx variables can be used in the C<< <path-to-lua-script-file> >> string to provide flexibility. This however carries some risks and is not ordinarily recommended.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-When the Lua code cache is turned on (by default), the user code is loaded once at the first request and cached [m
[31m-and the Nginx config must be reloaded each time the Lua source file is modified.[m
[31m-The Lua code cache can be temporarily disabled during development by [m
[31m-switching L<lua_code_cache> C<off> in C<nginx.conf> to avoid reloading Nginx.[m
[31m-[m
[31m-Nginx variables are supported in the file path for dynamic dispatch, for example:[m
[31m-[m
[31m-[m
[31m-     # WARNING: contents in nginx var must be carefully filtered,[m
[31m-     # otherwise there'll be great security risk![m
[31m-     location ~ ^/app/([-_a-zA-Z0-9/]+) {[m
[31m-         set $path $1;[m
[31m-         content_by_lua_file /path/to/lua/app/root/$path.lua;[m
[31m-     }[m
[31m-[m
[31m-But be very careful about malicious user inputs and always carefully validate or filter out the user-supplied path components.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_by_lua[m
[31m-[m
[31m-B<syntax:> I<rewrite_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<rewrite_by_lua_block> directive instead.[m
[31m-[m
[31m-Acts as a rewrite phase handler and executes Lua code string specified in C<< <lua-script-str> >> for every request.[m
[31m-The Lua code may make L<API calls> and is executed as a new spawned coroutine in an independent global environment (i.e. a sandbox).[m
[31m-[m
[31m-Note that this handler always runs I<after> the standard L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>. So the following will work as expected:[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $a 12; # create and initialize $a[m
[31m-         set $b ""; # create and initialize $b[m
[31m-         rewrite_by_lua 'ngx.var.b = tonumber(ngx.var.a) + 1';[m
[31m-         echo "res = $b";[m
[31m-     }[m
[31m-[m
[31m-because C<set $a 12> and C<set $b ""> run I<before> L<rewrite_by_lua>.[m
[31m-[m
[31m-On the other hand, the following will not work as expected:[m
[31m-[m
[31m-[m
[31m-     ?  location /foo {[m
[31m-     ?      set $a 12; # create and initialize $a[m
[31m-     ?      set $b ''; # create and initialize $b[m
[31m-     ?      rewrite_by_lua 'ngx.var.b = tonumber(ngx.var.a) + 1';[m
[31m-     ?      if ($b = '13') {[m
[31m-     ?         rewrite ^ /bar redirect;[m
[31m-     ?         break;[m
[31m-     ?      }[m
[31m-     ?[m
[31m-     ?      echo "res = $b";[m
[31m-     ?  }[m
[31m-[m
[31m-because C<if> runs I<before> L<rewrite_by_lua> even if it is placed after L<rewrite_by_lua> in the config.[m
[31m-[m
[31m-The right way of doing this is as follows:[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $a 12; # create and initialize $a[m
[31m-         set $b ''; # create and initialize $b[m
[31m-         rewrite_by_lua '[m
[31m-             ngx.var.b = tonumber(ngx.var.a) + 1[m
[31m-             if tonumber(ngx.var.b) == 13 then[m
[31m-                 return ngx.redirect("/bar");[m
[31m-             end[m
[31m-         ';[m
[31m-    [m
[31m-         echo "res = $b";[m
[31m-     }[m
[31m-[m
[31m-Note that the L<ngx_eval|http://www.grid.net.ru/nginx/eval.en.html> module can be approximated by using L<rewrite_by_lua>. For example,[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         eval $res {[m
[31m-             proxy_pass http://foo.com/check-spam;[m
[31m-         }[m
[31m-    [m
[31m-         if ($res = 'spam') {[m
[31m-             rewrite ^ /terms-of-use.html redirect;[m
[31m-         }[m
[31m-    [m
[31m-         fastcgi_pass ...;[m
[31m-     }[m
[31m-[m
[31m-can be implemented in ngx_lua as:[m
[31m-[m
[31m-[m
[31m-     location = /check-spam {[m
[31m-         internal;[m
[31m-         proxy_pass http://foo.com/check-spam;[m
[31m-     }[m
[31m-    [m
[31m-     location / {[m
[31m-         rewrite_by_lua '[m
[31m-             local res = ngx.location.capture("/check-spam")[m
[31m-             if res.body == "spam" then[m
[31m-                 return ngx.redirect("/terms-of-use.html")[m
[31m-             end[m
[31m-         ';[m
[31m-    [m
[31m-         fastcgi_pass ...;[m
[31m-     }[m
[31m-[m
[31m-Just as any other rewrite phase handlers, L<rewrite_by_lua> also runs in subrequests.[m
[31m-[m
[31m-Note that when calling C<ngx.exit(ngx.OK)> within a L<rewrite_by_lua> handler, the nginx request processing control flow will still continue to the content handler. To terminate the current request from within a L<rewrite_by_lua> handler, calling L<ngx.exit> with status E<gt>= 200 (C<ngx.HTTP_OK>) and status E<lt> 300 (C<ngx.HTTP_SPECIAL_RESPONSE>) for successful quits and C<ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)> (or its friends) for failures.[m
[31m-[m
[31m-If the L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite> directive is used to change the URI and initiate location re-lookups (internal redirections), then any L<rewrite_by_lua> or L<rewrite_by_lua_file> code sequences within the current location will not be executed. For example,[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         rewrite ^ /bar;[m
[31m-         rewrite_by_lua 'ngx.exit(503)';[m
[31m-     }[m
[31m-     location /bar {[m
[31m-         ...[m
[31m-     }[m
[31m-[m
[31m-Here the Lua code C<ngx.exit(503)> will never run. This will be the case if C<rewrite ^ /bar last> is used as this will similarly initiate an internal redirection. If the C<break> modifier is used instead, there will be no internal redirection and the C<rewrite_by_lua> code will be executed.[m
[31m-[m
[31m-The C<rewrite_by_lua> code will always run at the end of the C<rewrite> request-processing phase unless L<rewrite_by_lua_no_postpone> is turned on.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<rewrite_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-Similar to the L<rewrite_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     rewrite_by_lua_block {[m
[31m-         do_something("hello, world!\nhiya\n")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<rewrite_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-Equivalent to L<rewrite_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-Nginx variables can be used in the C<< <path-to-lua-script-file> >> string to provide flexibility. This however carries some risks and is not ordinarily recommended.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-When the Lua code cache is turned on (by default), the user code is loaded once at the first request and cached and the Nginx config must be reloaded each time the Lua source file is modified. The Lua code cache can be temporarily disabled during development by switching L<lua_code_cache> C<off> in C<nginx.conf> to avoid reloading Nginx.[m
[31m-[m
[31m-The C<rewrite_by_lua_file> code will always run at the end of the C<rewrite> request-processing phase unless L<rewrite_by_lua_no_postpone> is turned on.[m
[31m-[m
[31m-Nginx variables are supported in the file path for dynamic dispatch just as in L<content_by_lua_file>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 access_by_lua[m
[31m-[m
[31m-B<syntax:> I<access_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<access tail>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<access_by_lua_block> directive instead.[m
[31m-[m
[31m-Acts as an access phase handler and executes Lua code string specified in C<< <lua-script-str> >> for every request.[m
[31m-The Lua code may make L<API calls> and is executed as a new spawned coroutine in an independent global environment (i.e. a sandbox).[m
[31m-[m
[31m-Note that this handler always runs I<after> the standard L<ngx_http_access_module|http://nginx.org/en/docs/http/ngx_http_access_module.html>. So the following will work as expected:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         deny    192.168.1.1;[m
[31m-         allow   192.168.1.0/24;[m
[31m-         allow   10.1.1.0/16;[m
[31m-         deny    all;[m
[31m-    [m
[31m-         access_by_lua '[m
[31m-             local res = ngx.location.capture("/mysql", { ... })[m
[31m-             ...[m
[31m-         ';[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/...[m
[31m-     }[m
[31m-[m
[31m-That is, if a client IP address is in the blacklist, it will be denied before the MySQL query for more complex authentication is executed by L<access_by_lua>.[m
[31m-[m
[31m-Note that the L<ngx_auth_request|http://mdounin.ru/hg/ngx_http_auth_request_module/> module can be approximated by using L<access_by_lua>:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         auth_request /auth;[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/postgres_pass/...[m
[31m-     }[m
[31m-[m
[31m-can be implemented in ngx_lua as:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         access_by_lua '[m
[31m-             local res = ngx.location.capture("/auth")[m
[31m-    [m
[31m-             if res.status == ngx.HTTP_OK then[m
[31m-                 return[m
[31m-             end[m
[31m-    [m
[31m-             if res.status == ngx.HTTP_FORBIDDEN then[m
[31m-                 ngx.exit(res.status)[m
[31m-             end[m
[31m-    [m
[31m-             ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-         ';[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/postgres_pass/...[m
[31m-     }[m
[31m-[m
[31m-As with other access phase handlers, L<access_by_lua> will I<not> run in subrequests.[m
[31m-[m
[31m-Note that when calling C<ngx.exit(ngx.OK)> within a L<access_by_lua> handler, the nginx request processing control flow will still continue to the content handler. To terminate the current request from within a L<access_by_lua> handler, calling L<ngx.exit> with status E<gt>= 200 (C<ngx.HTTP_OK>) and status E<lt> 300 (C<ngx.HTTP_SPECIAL_RESPONSE>) for successful quits and C<ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)> (or its friends) for failures.[m
[31m-[m
[31m-Starting from the C<v0.9.20> release, you can use the L<access_by_lua_no_postpone>[m
[31m-directive to control when to run this handler inside the "access" request-processing phase[m
[31m-of NGINX.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 access_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<access_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<access tail>[m
[31m-[m
[31m-Similar to the L<access_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     access_by_lua_block {[m
[31m-         do_something("hello, world!\nhiya\n")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 access_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<access_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<access tail>[m
[31m-[m
[31m-Equivalent to L<access_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-Nginx variables can be used in the C<< <path-to-lua-script-file> >> string to provide flexibility. This however carries some risks and is not ordinarily recommended.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-When the Lua code cache is turned on (by default), the user code is loaded once at the first request and cached [m
[31m-and the Nginx config must be reloaded each time the Lua source file is modified.[m
[31m-The Lua code cache can be temporarily disabled during development by switching L<lua_code_cache> C<off> in C<nginx.conf> to avoid repeatedly reloading Nginx.[m
[31m-[m
[31m-Nginx variables are supported in the file path for dynamic dispatch just as in L<content_by_lua_file>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 header_filter_by_lua[m
[31m-[m
[31m-B<syntax:> I<header_filter_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<header_filter_by_lua_block> directive instead.[m
[31m-[m
[31m-Uses Lua code specified in C<< <lua-script-str> >> to define an output header filter.[m
[31m-[m
[31m-Note that the following API functions are currently disabled within this context:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Output API functions (e.g., L<ngx.say> and L<ngx.send_headers>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Control API functions (e.g., L<ngx.redirect> and L<ngx.exec>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Subrequest API functions (e.g., L<ngx.location.capture> and L<ngx.location.capture_multi>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cosocket API functions (e.g., L<ngx.socket.tcp> and L<ngx.req.socket>).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Here is an example of overriding a response header (or adding one if absent) in our Lua header filter:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         proxy_pass http://mybackend;[m
[31m-         header_filter_by_lua 'ngx.header.Foo = "blah"';[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.2.1rc20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 header_filter_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<header_filter_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Similar to the L<header_filter_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     header_filter_by_lua_block {[m
[31m-         ngx.header["content-length"] = nil[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 header_filter_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<header_filter_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Equivalent to L<header_filter_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.2.1rc20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 body_filter_by_lua[m
[31m-[m
[31m-B<syntax:> I<body_filter_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-body-filter>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<body_filter_by_lua_block> directive instead.[m
[31m-[m
[31m-Uses Lua code specified in C<< <lua-script-str> >> to define an output body filter.[m
[31m-[m
[31m-The input data chunk is passed via L<ngx.arg>[1] (as a Lua string value) and the "eof" flag indicating the end of the response body data stream is passed via L<ngx.arg>[2] (as a Lua boolean value).[m
[31m-[m
[31m-Behind the scene, the "eof" flag is just the C<last_buf> (for main requests) or C<last_in_chain> (for subrequests) flag of the Nginx chain link buffers. (Before the C<v0.7.14> release, the "eof" flag does not work at all in subrequests.)[m
[31m-[m
[31m-The output data stream can be aborted immediately by running the following Lua statement:[m
[31m-[m
[31m-[m
[31m-     return ngx.ERROR[m
[31m-[m
[31m-This will truncate the response body and usually result in incomplete and also invalid responses.[m
[31m-[m
[31m-The Lua code can pass its own modified version of the input data chunk to the downstream Nginx output body filters by overriding L<ngx.arg>[1] with a Lua string or a Lua table of strings. For example, to transform all the lowercase letters in the response body, we can just write:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         proxy_pass http://mybackend;[m
[31m-         body_filter_by_lua 'ngx.arg[1] = string.upper(ngx.arg[1])';[m
[31m-     }[m
[31m-[m
[31m-When setting C<nil> or an empty Lua string value to C<ngx.arg[1]>, no data chunk will be passed to the downstream Nginx output filters at all.[m
[31m-[m
[31m-Likewise, new "eof" flag can also be specified by setting a boolean value to L<ngx.arg>[2]. For example,[m
[31m-[m
[31m-[m
[31m-     location /t {[m
[31m-         echo hello world;[m
[31m-         echo hiya globe;[m
[31m-    [m
[31m-         body_filter_by_lua '[m
[31m-             local chunk = ngx.arg[1][m
[31m-             if string.match(chunk, "hello") then[m
[31m-                 ngx.arg[2] = true  -- new eof[m
[31m-                 return[m
[31m-             end[m
[31m-    [m
[31m-             -- just throw away any remaining chunk data[m
[31m-             ngx.arg[1] = nil[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then C<GET /t> will just return the output[m
[31m-[m
[31m-    hello world[m
[31m-[m
[31m-That is, when the body filter sees a chunk containing the word "hello", then it will set the "eof" flag to true immediately, resulting in truncated but still valid responses.[m
[31m-[m
[31m-When the Lua code may change the length of the response body, then it is required to always clear out the C<Content-Length> response header (if any) in a header filter to enforce streaming output, as in[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         # fastcgi_pass/proxy_pass/...[m
[31m-    [m
[31m-         header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-         body_filter_by_lua 'ngx.arg[1] = string.len(ngx.arg[1]) .. "\\n"';[m
[31m-     }[m
[31m-[m
[31m-Note that the following API functions are currently disabled within this context due to the limitations in NGINX output filter's current implementation:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Output API functions (e.g., L<ngx.say> and L<ngx.send_headers>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Control API functions (e.g., L<ngx.exit> and L<ngx.exec>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Subrequest API functions (e.g., L<ngx.location.capture> and L<ngx.location.capture_multi>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cosocket API functions (e.g., L<ngx.socket.tcp> and L<ngx.req.socket>).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Nginx output filters may be called multiple times for a single request because response body may be delivered in chunks. Thus, the Lua code specified by in this directive may also run multiple times in the lifetime of a single HTTP request.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc32> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 body_filter_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<body_filter_by_lua_block { lua-script-str }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-body-filter>[m
[31m-[m
[31m-Similar to the L<body_filter_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     body_filter_by_lua_block {[m
[31m-         local data, eof = ngx.arg[1], ngx.arg[2][m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 body_filter_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<body_filter_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-body-filter>[m
[31m-[m
[31m-Equivalent to L<body_filter_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc32> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_by_lua[m
[31m-[m
[31m-B<syntax:> I<log_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<log>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<log_by_lua_block> directive instead.[m
[31m-[m
[31m-Runs the Lua source code inlined as the C<< <lua-script-str> >> at the C<log> request processing phase. This does not replace the current access logs, but runs before.[m
[31m-[m
[31m-Note that the following API functions are currently disabled within this context:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Output API functions (e.g., L<ngx.say> and L<ngx.send_headers>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Control API functions (e.g., L<ngx.exit>) [m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Subrequest API functions (e.g., L<ngx.location.capture> and L<ngx.location.capture_multi>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cosocket API functions (e.g., L<ngx.socket.tcp> and L<ngx.req.socket>).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Here is an example of gathering average data for L<$upstream_response_time|http://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_response_time>:[m
[31m-[m
[31m-[m
[31m-     lua_shared_dict log_dict 5M;[m
[31m-    [m
[31m-     server {[m
[31m-         location / {[m
[31m-             proxy_pass http://mybackend;[m
[31m-    [m
[31m-             log_by_lua '[m
[31m-                 local log_dict = ngx.shared.log_dict[m
[31m-                 local upstream_time = tonumber(ngx.var.upstream_response_time)[m
[31m-    [m
[31m-                 local sum = log_dict:get("upstream_time-sum") or 0[m
[31m-                 sum = sum + upstream_time[m
[31m-                 log_dict:set("upstream_time-sum", sum)[m
[31m-    [m
[31m-                 local newval, err = log_dict:incr("upstream_time-nb", 1)[m
[31m-                 if not newval and err == "not found" then[m
[31m-                     log_dict:add("upstream_time-nb", 0)[m
[31m-                     log_dict:incr("upstream_time-nb", 1)[m
[31m-                 end[m
[31m-             ';[m
[31m-         }[m
[31m-    [m
[31m-         location = /status {[m
[31m-             content_by_lua '[m
[31m-                 local log_dict = ngx.shared.log_dict[m
[31m-                 local sum = log_dict:get("upstream_time-sum")[m
[31m-                 local nb = log_dict:get("upstream_time-nb")[m
[31m-    [m
[31m-                 if nb and sum then[m
[31m-                     ngx.say("average upstream response time: ", sum / nb,[m
[31m-                             " (", nb, " reqs)")[m
[31m-                 else[m
[31m-                     ngx.say("no data yet")[m
[31m-                 end[m
[31m-             ';[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc31> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<log_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<log>[m
[31m-[m
[31m-Similar to the L<log_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     log_by_lua_block {[m
[31m-         print("I need no extra escaping here, for example: \r\nblah")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<log_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<log>[m
[31m-[m
[31m-Equivalent to L<log_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc31> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 balancer_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<balancer_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This directive runs Lua code as an upstream balancer for any upstream entities defined[m
[31m-by the C<upstream {}> configuration block.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     upstream foo {[m
[31m-         server 127.0.0.1;[m
[31m-         balancer_by_lua_block {[m
[31m-             -- use Lua to do something interesting here[m
[31m-             -- as a dynamic balancer[m
[31m-         }[m
[31m-     }[m
[31m-    [m
[31m-     server {[m
[31m-         location / {[m
[31m-             proxy_pass http://foo;[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-The resulting Lua load balancer can work with any existing nginx upstream modules[m
[31m-like L<ngx_proxy|http://nginx.org/en/docs/http/ngx_http_proxy_module.html> and[m
[31m-L<ngx_fastcgi|http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html>.[m
[31m-[m
[31m-Also, the Lua load balancer can work with the standard upstream connection pool mechanism,[m
[31m-i.e., the standard L<keepalive|http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive> directive.[m
[31m-Just ensure that the L<keepalive|http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive> directive[m
[31m-is used I<after> this C<balancer_by_lua_block> directive in a single C<upstream {}> configuration block.[m
[31m-[m
[31m-The Lua load balancer can totally ignore the list of servers defined in the C<upstream {}> block[m
[31m-and select peer from a completely dynamic server list (even changing per request) via the[m
[31m-L<ngx.balancer|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/balancer.md> module[m
[31m-from the L<lua-resty-core|https://github.com/openresty/lua-resty-core> library.[m
[31m-[m
[31m-The Lua code handler registered by this directive might get called more than once in a single[m
[31m-downstream request when the nginx upstream mechanism retries the request on conditions[m
[31m-specified by directives like the L<proxy_next_upstream|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream>[m
[31m-directive.[m
[31m-[m
[31m-This Lua code execution context does not support yielding, so Lua APIs that may yield[m
[31m-(like cosockets and "light threads") are disabled in this context. One can usually work[m
[31m-around this limitation by doing such operations in an earlier phase handler (like[m
[31m-L<access_by_lua*>) and passing along the result into this context[m
[31m-via the L<ngx.ctx> table.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.10.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 balancer_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<balancer_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Equivalent to L<balancer_by_lua_block>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.10.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_need_request_body[m
[31m-[m
[31m-B<syntax:> I<lua_need_request_body E<lt>on|offE<gt>>[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<depends on usage>[m
[31m-[m
[31m-Determines whether to force the request body data to be read before running rewrite/access/access_by_lua* or not. The Nginx core does not read the client request body by default and if request body data is required, then this directive should be turned C<on> or the L<ngx.req.read_body> function should be called within the Lua code.[m
[31m-[m
[31m-To read the request body data within the L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> variable, [m
[31m-L<client_body_buffer_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size> must have the same value as L<client_max_body_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>. Because when the content length exceeds L<client_body_buffer_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size> but less than L<client_max_body_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>, Nginx will buffer the data into a temporary file on the disk, which will lead to empty value in the L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> variable.[m
[31m-[m
[31m-If the current location includes L<rewrite_by_lua> or L<rewrite_by_lua_file> directives,[m
[31m-then the request body will be read just before the L<rewrite_by_lua> or L<rewrite_by_lua_file> code is run (and also at the[m
[31m-C<rewrite> phase). Similarly, if only L<content_by_lua> is specified,[m
[31m-the request body will not be read until the content handler's Lua code is[m
[31m-about to run (i.e., the request body will be read during the content phase).[m
[31m-[m
[31m-It is recommended however, to use the L<ngx.req.read_body> and L<ngx.req.discard_body> functions for finer control over the request body reading process instead.[m
[31m-[m
[31m-This also applies to L<access_by_lua> and L<access_by_lua_file>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<ssl_certificate_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-B<phase:> I<right-before-SSL-handshake>[m
[31m-[m
[31m-This directive runs user Lua code when NGINX is about to start the SSL handshake for the downstream[m
[31m-SSL (https) connections.[m
[31m-[m
[31m-It is particularly useful for setting the SSL certificate chain and the corresponding private key on a per-request[m
[31m-basis. It is also useful to load such handshake configurations nonblockingly from the remote (for example,[m
[31m-with the L<cosocket> API). And one can also do per-request OCSP stapling handling in pure[m
[31m-Lua here as well.[m
[31m-[m
[31m-Another typical use case is to do SSL handshake traffic control nonblockingly in this context,[m
[31m-with the help of the L<lua-resty-limit-traffic#readme|https://github.com/openresty/lua-resty-limit-traffic>[m
[31m-library, for example.[m
[31m-[m
[31m-One can also do interesting things with the SSL handshake requests from the client side, like[m
[31m-rejecting old SSL clients using the SSLv3 protocol or even below selectively.[m
[31m-[m
[31m-The L<ngx.ssl|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md>[m
[31m-and L<ngx.ocsp|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ocsp.md> Lua modules[m
[31m-provided by the L<lua-resty-core|https://github.com/openresty/lua-resty-core/#readme>[m
[31m-library are particularly useful in this context. You can use the Lua API offered by these two Lua modules[m
[31m-to manipulate the SSL certificate chain and private key for the current SSL connection[m
[31m-being initiated.[m
[31m-[m
[31m-This Lua handler does not run at all, however, when NGINX/OpenSSL successfully resumes[m
[31m-the SSL session via SSL session IDs or TLS session tickets for the current SSL connection. In[m
[31m-other words, this Lua handler only runs when NGINX has to initiate a full SSL handshake.[m
[31m-[m
[31m-Below is a trivial example using the[m
[31m-L<ngx.ssl|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md> module[m
[31m-at the same time:[m
[31m-[m
[31m-[m
[31m-     server {[m
[31m-         listen 443 ssl;[m
[31m-         server_name   test.com;[m
[31m-    [m
[31m-         ssl_certificate_by_lua_block {[m
[31m-             print("About to initiate a new SSL handshake!")[m
[31m-         }[m
[31m-    [m
[31m-         location / {[m
[31m-             root html;[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-See more complicated examples in the L<ngx.ssl|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md>[m
[31m-and L<ngx.ocsp|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ocsp.md>[m
[31m-Lua modules' official documentation.[m
[31m-[m
[31m-Uncaught Lua exceptions in the user Lua code immediately abort the current SSL session, so does the[m
[31m-L<ngx.exit> call with an error code like C<ngx.ERROR>.[m
[31m-[m
[31m-This Lua code execution context I<does> support yielding, so Lua APIs that may yield[m
[31m-(like cosockets, sleeping, and "light threads")[m
[31m-are enabled in this context.[m
[31m-[m
[31m-Note, however, you still need to configure the L<ssl_certificate|http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate> and[m
[31m-L<ssl_certificate_key|http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate_key>[m
[31m-directives even though you will not use this static certificate and private key at all. This is[m
[31m-because the NGINX core requires their appearance otherwise you are seeing the following error[m
[31m-while starting NGINX:[m
[31m-[m
[31m-    nginx: [emerg] no ssl configured for the server[m
[31m-[m
[31m-This directive currently requires the following NGINX core patch to work correctly:[m
[31m-[m
[31m-E<lt>http://mailman.nginx.org/pipermail/nginx-devel/2016-January/007748.htmlE<gt>[m
[31m-[m
[31m-The bundled version of the NGINX core in OpenResty 1.9.7.2 (or above) already has this[m
[31m-patch applied.[m
[31m-[m
[31m-Furthermore, one needs at least OpenSSL 1.0.2e for this directive to work.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.10.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<ssl_certificate_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-B<phase:> I<right-before-SSL-handshake>[m
[31m-[m
[31m-Equivalent to L<ssl_certificate_by_lua_block>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.10.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_shared_dict[m
[31m-[m
[31m-B<syntax:> I<lua_shared_dict E<lt>nameE<gt> E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<depends on usage>[m
[31m-[m
[31m-Declares a shared memory zone, C<< <name> >>, to serve as storage for the shm based Lua dictionary C<< ngx.shared.<name> >>.[m
[31m-[m
[31m-Shared memory zones are always shared by all the nginx worker processes in the current nginx server instance.[m
[31m-[m
[31m-The C<< <size> >> argument accepts size units such as C<k> and C<m>:[m
[31m-[m
[31m-[m
[31m-     http {[m
[31m-         lua_shared_dict dogs 10m;[m
[31m-         ...[m
[31m-     }[m
[31m-[m
[31m-The hard-coded minimum size is 8KB while the practical minimum size depends[m
[31m-on actual user data set (some people start with 12KB).[m
[31m-[m
[31m-See L<ngx.shared.DICT> for details.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_connect_timeout[m
[31m-[m
[31m-B<syntax:> I<lua_socket_connect_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_connect_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This directive controls the default timeout value used in TCP/unix-domain socket object's L<connect> method and can be overridden by the L<settimeout> method.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_send_timeout[m
[31m-[m
[31m-B<syntax:> I<lua_socket_send_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_send_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Controls the default timeout value used in TCP/unix-domain socket object's L<send> method and can be overridden by the L<settimeout> method.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_send_lowat[m
[31m-[m
[31m-B<syntax:> I<lua_socket_send_lowat E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_send_lowat 0>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Controls the C<lowat> (low water) value for the cosocket send buffer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_read_timeout[m
[31m-[m
[31m-B<syntax:> I<lua_socket_read_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_read_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-B<phase:> I<depends on usage>[m
[31m-[m
[31m-This directive controls the default timeout value used in TCP/unix-domain socket object's L<receive> method and iterator functions returned by the L<receiveuntil> method. This setting can be overridden by the L<settimeout> method.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_buffer_size[m
[31m-[m
[31m-B<syntax:> I<lua_socket_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_buffer_size 4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Specifies the buffer size used by cosocket reading operations.[m
[31m-[m
[31m-This buffer does not have to be that big to hold everything at the same time because cosocket supports 100% non-buffered reading and parsing. So even C<1> byte buffer size should still work everywhere but the performance could be terrible.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_pool_size[m
[31m-[m
[31m-B<syntax:> I<lua_socket_pool_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_pool_size 30>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Specifies the size limit (in terms of connection count) for every cosocket connection pool associated with every remote server (i.e., identified by either the host-port pair or the unix domain socket file path).[m
[31m-[m
[31m-Default to 30 connections for every pool.[m
[31m-[m
[31m-When the connection pool exceeds the available size limit, the least recently used (idle) connection already in the pool will be closed to make room for the current connection.[m
[31m-[m
[31m-Note that the cosocket connection pool is per nginx worker process rather than per nginx server instance, so size limit specified here also applies to every single nginx worker process.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_keepalive_timeout[m
[31m-[m
[31m-B<syntax:> I<lua_socket_keepalive_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_keepalive_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This directive controls the default maximal idle time of the connections in the cosocket built-in connection pool. When this timeout reaches, idle connections will be closed and removed from the pool. This setting can be overridden by cosocket objects' L<setkeepalive> method.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_log_errors[m
[31m-[m
[31m-B<syntax:> I<lua_socket_log_errors on|off>[m
[31m-[m
[31m-B<default:> I<lua_socket_log_errors on>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This directive can be used to toggle error logging when a failure occurs for the TCP or UDP cosockets. If you are already doing proper error handling and logging in your Lua code, then it is recommended to turn this directive off to prevent data flushing in your nginx error log files (which is usually rather expensive).[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.13> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_ssl_ciphers[m
[31m-[m
[31m-B<syntax:> I<lua_ssl_ciphers E<lt>ciphersE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_ssl_ciphers DEFAULT>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Specifies the enabled ciphers for requests to a SSL/TLS server in the L<tcpsock:sslhandshake> method. The ciphers are specified in the format understood by the OpenSSL library.[m
[31m-[m
[31m-The full list can be viewed using the “openssl ciphers” command.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_ssl_crl[m
[31m-[m
[31m-B<syntax:> I<lua_ssl_crl E<lt>fileE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Specifies a file with revoked certificates (CRL) in the PEM format used to verify the certificate of the SSL/TLS server in the L<tcpsock:sslhandshake> method.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_ssl_protocols[m
[31m-[m
[31m-B<syntax:> I<lua_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]>[m
[31m-[m
[31m-B<default:> I<lua_ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Enables the specified protocols for requests to a SSL/TLS server in the L<tcpsock:sslhandshake> method.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_ssl_trusted_certificate[m
[31m-[m
[31m-B<syntax:> I<lua_ssl_trusted_certificate E<lt>fileE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Specifies a file path with trusted CA certificates in the PEM format used to verify the certificate of the SSL/TLS server in the L<tcpsock:sslhandshake> method.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.11> release.[m
[31m-[m
[31m-See also L<lua_ssl_verify_depth>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_ssl_verify_depth[m
[31m-[m
[31m-B<syntax:> I<lua_ssl_verify_depth E<lt>numberE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_ssl_verify_depth 1>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Sets the verification depth in the server certificates chain.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.11> release.[m
[31m-[m
[31m-See also L<lua_ssl_trusted_certificate>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_http10_buffering[m
[31m-[m
[31m-B<syntax:> I<lua_http10_buffering on|off>[m
[31m-[m
[31m-B<default:> I<lua_http10_buffering on>[m
[31m-[m
[31m-B<context:> I<http, server, location, location-if>[m
[31m-[m
[31m-Enables or disables automatic response buffering for HTTP 1.0 (or older) requests. This buffering mechanism is mainly used for HTTP 1.0 keep-alive which replies on a proper C<Content-Length> response header.[m
[31m-[m
[31m-If the Lua code explicitly sets a C<Content-Length> response header before sending the headers (either explicitly via L<ngx.send_headers> or implicitly via the first L<ngx.say> or L<ngx.print> call), then the HTTP 1.0 response buffering will be disabled even when this directive is turned on.[m
[31m-[m
[31m-To output very large response data in a streaming fashion (via the L<ngx.flush> call, for example), this directive MUST be turned off to minimize memory usage.[m
[31m-[m
[31m-This directive is turned C<on> by default.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc19> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_by_lua_no_postpone[m
[31m-[m
[31m-B<syntax:> I<rewrite_by_lua_no_postpone on|off>[m
[31m-[m
[31m-B<default:> I<rewrite_by_lua_no_postpone off>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Controls whether or not to disable postponing L<rewrite_by_lua>* directives to run at the end of the C<rewrite> request-processing phase. By default, this directive is turned off and the Lua code is postponed to run at the end of the C<rewrite> phase.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc29> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 access_by_lua_no_postpone[m
[31m-[m
[31m-B<syntax:> I<access_by_lua_no_postpone on|off>[m
[31m-[m
[31m-B<default:> I<access_by_lua_no_postpone off>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Controls whether or not to disable postponing L<access_by_lua>* directives to run at the end of the C<access> request-processing phase. By default, this directive is turned off and the Lua code is postponed to run at the end of the C<access> phase.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_transform_underscores_in_response_headers[m
[31m-[m
[31m-B<syntax:> I<lua_transform_underscores_in_response_headers on|off>[m
[31m-[m
[31m-B<default:> I<lua_transform_underscores_in_response_headers on>[m
[31m-[m
[31m-B<context:> I<http, server, location, location-if>[m
[31m-[m
[31m-Controls whether to transform underscores (C<_>) in the response header names specified in the L<ngx.header.HEADER> API to hypens (C<->).[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc32> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_check_client_abort[m
[31m-[m
[31m-B<syntax:> I<lua_check_client_abort on|off>[m
[31m-[m
[31m-B<default:> I<lua_check_client_abort off>[m
[31m-[m
[31m-B<context:> I<http, server, location, location-if>[m
[31m-[m
[31m-This directive controls whether to check for premature client connection abortion.[m
[31m-[m
[31m-When this directive is turned on, the ngx_lua module will monitor the premature connection close event on the downstream connections. And when there is such an event, it will call the user Lua function callback (registered by L<ngx.on_abort>) or just stop and clean up all the Lua "light threads" running in the current request's request handler when there is no user callback function registered.[m
[31m-[m
[31m-According to the current implementation, however, if the client closes the connection before the Lua code finishes reading the request body data via L<ngx.req.socket>, then ngx_lua will neither stop all the running "light threads" nor call the user callback (if L<ngx.on_abort> has been called). Instead, the reading operation on L<ngx.req.socket> will just return the error message "client aborted" as the second return value (the first return value is surely C<nil>).[m
[31m-[m
[31m-When TCP keepalive is disabled, it is relying on the client side to close the socket gracefully (by sending a C<FIN> packet or something like that). For (soft) real-time web applications, it is highly recommended to configure the L<TCP keepalive|http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html> support in your system's TCP stack implementation in order to detect "half-open" TCP connections in time.[m
[31m-[m
[31m-For example, on Linux, you can configure the standard L<listen|http://nginx.org/en/docs/http/ngx_http_core_module.html#listen> directive in your C<nginx.conf> file like this:[m
[31m-[m
[31m-[m
[31m-     listen 80 so_keepalive=2s:2s:8;[m
[31m-[m
[31m-On FreeBSD, you can only tune the system-wide configuration for TCP keepalive, for example:[m
[31m-[m
[31m-    # sysctl net.inet.tcp.keepintvl=2000[m
[31m-    # sysctl net.inet.tcp.keepidle=2000[m
[31m-[m
[31m-This directive was first introduced in the C<v0.7.4> release.[m
[31m-[m
[31m-See also L<ngx.on_abort>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_max_pending_timers[m
[31m-[m
[31m-B<syntax:> I<lua_max_pending_timers E<lt>countE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_max_pending_timers 1024>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Controls the maximum number of pending timers allowed.[m
[31m-[m
[31m-Pending timers are those timers that have not expired yet.[m
[31m-[m
[31m-When exceeding this limit, the L<ngx.timer.at> call will immediately return C<nil> and the error string "too many pending timers".[m
[31m-[m
[31m-This directive was first introduced in the C<v0.8.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_max_running_timers[m
[31m-[m
[31m-B<syntax:> I<lua_max_running_timers E<lt>countE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_max_running_timers 256>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Controls the maximum number of "running timers" allowed.[m
[31m-[m
[31m-Running timers are those timers whose user callback functions are still running.[m
[31m-[m
[31m-When exceeding this limit, Nginx will stop running the callbacks of newly expired timers and log an error message "N lua_max_running_timers are not enough" where "N" is the current value of this directive.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.8.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Nginx API for Lua[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Introduction>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.arg>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.var.VARIABLE>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Core constants>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<HTTP method constants>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<HTTP status constants>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Nginx log level constants>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<print>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.ctx>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.location.capture>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.location.capture_multi>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.status>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.header.HEADER>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.resp.get_headers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.is_internal>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.start_time>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.http_version>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.raw_header>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_method>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_method>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_uri_args>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_uri_args>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_post_args>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_headers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_header>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.clear_header>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.read_body>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.discard_body>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_body_data>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_body_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_body_data>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_body_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.init_body>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.append_body>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.finish_body>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.socket>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.exec>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.redirect>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.send_headers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.headers_sent>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.print>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.say>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.log>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.flush>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.exit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.eof>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.sleep>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.escape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.unescape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.encode_args>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.decode_args>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.decode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.crc32_short>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.crc32_long>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.hmac_sha1>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.md5>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.md5_bin>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.sha1_bin>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.quote_sql_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.today>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.time>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.now>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.update_time>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.localtime>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.utctime>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.cookie_time>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.http_time>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.parse_http_time>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.is_subrequest>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.match>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.find>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.gmatch>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.sub>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.gsub>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.get>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.get_stale>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.set>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.safe_set>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.add>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.safe_add>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.replace>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.delete>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.incr>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.flush_all>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.flush_expired>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.get_keys>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.socket.udp>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<udpsock:setpeername>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<udpsock:send>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<udpsock:receive>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<udpsock:close>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<udpsock:settimeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.socket.stream>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.socket.tcp>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:connect>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:sslhandshake>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:send>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:receive>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:receiveuntil>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:close>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:settimeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:setoption>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:setkeepalive>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<tcpsock:getreusedtimes>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.socket.connect>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.get_phase>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.thread.spawn>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.thread.wait>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.thread.kill>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.on_abort>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.timer.at>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.timer.running_count>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.timer.pending_count>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.config.subsystem>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.config.debug>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.config.prefix>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.config.nginx_version>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.config.nginx_configure>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.config.ngx_lua_version>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.exiting>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.pid>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.count>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.id>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.semaphore>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.balancer>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.ssl>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.ocsp>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ndk.set_var.DIRECTIVE>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<coroutine.create>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<coroutine.resume>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<coroutine.yield>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<coroutine.wrap>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<coroutine.running>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<coroutine.status>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Introduction[m
[31m-[m
[31m-The various C<*_by_lua> and C<*_by_lua_file> configuration directives serve as gateways to the Lua API within the C<nginx.conf> file. The Nginx Lua API described below can only be called within the user Lua code run in the context of these configuration directives.[m
[31m-[m
[31m-The API is exposed to Lua in the form of two standard packages C<ngx> and C<ndk>. These packages are in the default global scope within ngx_lua and are always available within ngx_lua directives.[m
[31m-[m
[31m-The packages can be introduced into external Lua modules like this:[m
[31m-[m
[31m-[m
[31m-     local say = ngx.say[m
[31m-    [m
[31m-     local _M = {}[m
[31m-    [m
[31m-     function _M.foo(a)[m
[31m-         say(a)[m
[31m-     end[m
[31m-    [m
[31m-     return _M[m
[31m-[m
[31m-Use of the L<package.seeall|http://www.lua.org/manual/5.1/manual.html#pdf-package.seeall> flag is strongly discouraged due to its various bad side-effects.[m
[31m-[m
[31m-It is also possible to directly require the packages in external Lua modules:[m
[31m-[m
[31m-[m
[31m-     local ngx = require "ngx"[m
[31m-     local ndk = require "ndk"[m
[31m-[m
[31m-The ability to require these packages was introduced in the C<v0.2.1rc19> release.[m
[31m-[m
[31m-Network I/O operations in user code should only be done through the Nginx Lua API calls as the Nginx event loop may be blocked and performance drop off dramatically otherwise. Disk operations with relatively small amount of data can be done using the standard Lua C<io> library but huge file reading and writing should be avoided wherever possible as they may block the Nginx process significantly. Delegating all network and disk I/O operations to Nginx's subrequests (via the L<ngx.location.capture> method and similar) is strongly recommended for maximum performance.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.arg[m
[31m-[m
[31m-B<syntax:> I<val = ngx.arg[index]>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, body_filter_by_luaE<42>>[m
[31m-[m
[31m-When this is used in the context of the L<set_by_lua> or L<set_by_lua_file> directives, this table is read-only and holds the input arguments to the config directives:[m
[31m-[m
[31m-[m
[31m-     value = ngx.arg[n][m
[31m-[m
[31m-Here is an example[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $a 32;[m
[31m-         set $b 56;[m
[31m-    [m
[31m-         set_by_lua $sum[m
[31m-             'return tonumber(ngx.arg[1]) + tonumber(ngx.arg[2])'[m
[31m-             $a $b;[m
[31m-    [m
[31m-         echo $sum;[m
[31m-     }[m
[31m-[m
[31m-that writes out C<88>, the sum of C<32> and C<56>.[m
[31m-[m
[31m-When this table is used in the context of L<body_filter_by_lua> or L<body_filter_by_lua_file>, the first element holds the input data chunk to the output filter code and the second element holds the boolean flag for the "eof" flag indicating the end of the whole output data stream.[m
[31m-[m
[31m-The data chunk and "eof" flag passed to the downstream Nginx output filters can also be overridden by assigning values directly to the corresponding table elements. When setting C<nil> or an empty Lua string value to C<ngx.arg[1]>, no data chunk will be passed to the downstream Nginx output filters at all.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.var.VARIABLE[m
[31m-[m
[31m-B<syntax:> I<ngx.var.VAR_NAME>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>>[m
[31m-[m
[31m-Read and write Nginx variable values.[m
[31m-[m
[31m-[m
[31m-     value = ngx.var.some_nginx_variable_name[m
[31m-     ngx.var.some_nginx_variable_name = value[m
[31m-[m
[31m-Note that only already defined nginx variables can be written to.[m
[31m-For example:[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $my_var ''; # this line is required to create $my_var at config time[m
[31m-         content_by_lua '[m
[31m-             ngx.var.my_var = 123;[m
[31m-             ...[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-That is, nginx variables cannot be created on-the-fly.[m
[31m-[m
[31m-Some special nginx variables like C<$args> and C<$limit_rate> can be assigned a value,[m
[31m-many others are not, like C<$query_string>, C<$arg_PARAMETER>, and C<$http_NAME>.[m
[31m-[m
[31m-Nginx regex group capturing variables C<$1>, C<$2>, C<$3>, and etc, can be read by this[m
[31m-interface as well, by writing C<ngx.var[1]>, C<ngx.var[2]>, C<ngx.var[3]>, and etc.[m
[31m-[m
[31m-Setting C<ngx.var.Foo> to a C<nil> value will unset the C<$Foo> Nginx variable.[m
[31m-[m
[31m-[m
[31m-     ngx.var.args = nil[m
[31m-[m
[31m-B<WARNING> When reading from an Nginx variable, Nginx will allocate memory in the per-request memory pool which is freed only at request termination. So when you need to read from an Nginx variable repeatedly in your Lua code, cache the Nginx variable value to your own Lua variable, for example,[m
[31m-[m
[31m-[m
[31m-     local val = ngx.var.some_var[m
[31m-     --- use the val repeatedly later[m
[31m-[m
[31m-to prevent (temporary) memory leaking within the current request's lifetime. Another way of caching the result is to use the L<ngx.ctx> table.[m
[31m-[m
[31m-Undefined NGINX variables are evaluated to C<nil> while uninitialized (but defined) NGINX variables are evaluated to an empty Lua string.[m
[31m-[m
[31m-This API requires a relatively expensive metamethod call and it is recommended to avoid using it on hot code paths.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Core constants[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, E<42>log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-[m
[31m-       ngx.OK (0)[m
[31m-       ngx.ERROR (-1)[m
[31m-       ngx.AGAIN (-2)[m
[31m-       ngx.DONE (-4)[m
[31m-       ngx.DECLINED (-5)[m
[31m-[m
[31m-Note that only three of these constants are utilized by the L<Nginx API for Lua> (i.e., L<ngx.exit> accepts C<NGX_OK>, C<NGX_ERROR>, and C<NGX_DECLINED> as input).[m
[31m-[m
[31m-[m
[31m-       ngx.null[m
[31m-[m
[31m-The C<ngx.null> constant is a C<NULL> light userdata usually used to represent nil values in Lua tables etc and is similar to the L<lua-cjson|http://www.kyne.com.au/~mark/software/lua-cjson.php> library's C<cjson.null> constant. This constant was first introduced in the C<v0.5.0rc5> release.[m
[31m-[m
[31m-The C<ngx.DECLINED> constant was first introduced in the C<v0.5.0rc19> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 HTTP method constants[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-      ngx.HTTP_GET[m
[31m-      ngx.HTTP_HEAD[m
[31m-      ngx.HTTP_PUT[m
[31m-      ngx.HTTP_POST[m
[31m-      ngx.HTTP_DELETE[m
[31m-      ngx.HTTP_OPTIONS   (added in the v0.5.0rc24 release)[m
[31m-      ngx.HTTP_MKCOL     (added in the v0.8.2 release)[m
[31m-      ngx.HTTP_COPY      (added in the v0.8.2 release)[m
[31m-      ngx.HTTP_MOVE      (added in the v0.8.2 release)[m
[31m-      ngx.HTTP_PROPFIND  (added in the v0.8.2 release)[m
[31m-      ngx.HTTP_PROPPATCH (added in the v0.8.2 release)[m
[31m-      ngx.HTTP_LOCK      (added in the v0.8.2 release)[m
[31m-      ngx.HTTP_UNLOCK    (added in the v0.8.2 release)[m
[31m-      ngx.HTTP_PATCH     (added in the v0.8.2 release)[m
[31m-      ngx.HTTP_TRACE     (added in the v0.8.2 release)[m
[31m-[m
[31m-These constants are usually used in L<ngx.location.capture> and L<ngx.location.capture_multi> method calls.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 HTTP status constants[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-[m
[31m-       value = ngx.HTTP_CONTINUE (100) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_SWITCHING_PROTOCOLS (101) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_OK (200)[m
[31m-       value = ngx.HTTP_CREATED (201)[m
[31m-       value = ngx.HTTP_ACCEPTED (202) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_NO_CONTENT (204) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_PARTIAL_CONTENT (206) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_SPECIAL_RESPONSE (300)[m
[31m-       value = ngx.HTTP_MOVED_PERMANENTLY (301)[m
[31m-       value = ngx.HTTP_MOVED_TEMPORARILY (302)[m
[31m-       value = ngx.HTTP_SEE_OTHER (303)[m
[31m-       value = ngx.HTTP_NOT_MODIFIED (304)[m
[31m-       value = ngx.HTTP_TEMPORARY_REDIRECT (307) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_BAD_REQUEST (400)[m
[31m-       value = ngx.HTTP_UNAUTHORIZED (401)[m
[31m-       value = ngx.HTTP_PAYMENT_REQUIRED (402) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_FORBIDDEN (403)[m
[31m-       value = ngx.HTTP_NOT_FOUND (404)[m
[31m-       value = ngx.HTTP_NOT_ALLOWED (405)[m
[31m-       value = ngx.HTTP_NOT_ACCEPTABLE (406) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_REQUEST_TIMEOUT (408) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_CONFLICT (409) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_GONE (410)[m
[31m-       value = ngx.HTTP_UPGRADE_REQUIRED (426) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_TOO_MANY_REQUESTS (429) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_CLOSE (444) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_ILLEGAL (451) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_INTERNAL_SERVER_ERROR (500)[m
[31m-       value = ngx.HTTP_METHOD_NOT_IMPLEMENTED (501)[m
[31m-       value = ngx.HTTP_BAD_GATEWAY (502) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_SERVICE_UNAVAILABLE (503)[m
[31m-       value = ngx.HTTP_GATEWAY_TIMEOUT (504) (first added in the v0.3.1rc38 release)[m
[31m-       value = ngx.HTTP_VERSION_NOT_SUPPORTED (505) (first added in the v0.9.20 release)[m
[31m-       value = ngx.HTTP_INSUFFICIENT_STORAGE (507) (first added in the v0.9.20 release)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Nginx log level constants[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-[m
[31m-       ngx.STDERR[m
[31m-       ngx.EMERG[m
[31m-       ngx.ALERT[m
[31m-       ngx.CRIT[m
[31m-       ngx.ERR[m
[31m-       ngx.WARN[m
[31m-       ngx.NOTICE[m
[31m-       ngx.INFO[m
[31m-       ngx.DEBUG[m
[31m-[m
[31m-These constants are usually used by the L<ngx.log> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 print[m
[31m-[m
[31m-B<syntax:> I<print(...)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, certificate_by_luaE<42>>[m
[31m-[m
[31m-Writes argument values into the nginx C<error.log> file with the C<ngx.NOTICE> log level.[m
[31m-[m
[31m-It is equivalent to[m
[31m-[m
[31m-[m
[31m-     ngx.log(ngx.NOTICE, ...)[m
[31m-[m
[31m-Lua C<nil> arguments are accepted and result in literal C<"nil"> strings while Lua booleans result in literal C<"true"> or C<"false"> strings. And the C<ngx.null> constant will yield the C<"null"> string output.[m
[31m-[m
[31m-There is a hard coded C<2048> byte limitation on error message lengths in the Nginx core. This limit includes trailing newlines and leading time stamps. If the message size exceeds this limit, Nginx will truncate the message text accordingly. This limit can be manually modified by editing the C<NGX_MAX_ERROR_STR> macro definition in the C<src/core/ngx_log.h> file in the Nginx source tree.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.ctx[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>>[m
[31m-[m
[31m-This table can be used to store per-request Lua context data and has a life time identical to the current request (as with the Nginx variables). [m
[31m-[m
[31m-Consider the following example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         rewrite_by_lua '[m
[31m-             ngx.ctx.foo = 76[m
[31m-         ';[m
[31m-         access_by_lua '[m
[31m-             ngx.ctx.foo = ngx.ctx.foo + 3[m
[31m-         ';[m
[31m-         content_by_lua '[m
[31m-             ngx.say(ngx.ctx.foo)[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then C<GET /test> will yield the output[m
[31m-[m
[31m-[m
[31m-     79[m
[31m-[m
[31m-That is, the C<ngx.ctx.foo> entry persists across the rewrite, access, and content phases of a request.[m
[31m-[m
[31m-Every request, including subrequests, has its own copy of the table. For example:[m
[31m-[m
[31m-[m
[31m-     location /sub {[m
[31m-         content_by_lua '[m
[31m-             ngx.say("sub pre: ", ngx.ctx.blah)[m
[31m-             ngx.ctx.blah = 32[m
[31m-             ngx.say("sub post: ", ngx.ctx.blah)[m
[31m-         ';[m
[31m-     }[m
[31m-    [m
[31m-     location /main {[m
[31m-         content_by_lua '[m
[31m-             ngx.ctx.blah = 73[m
[31m-             ngx.say("main pre: ", ngx.ctx.blah)[m
[31m-             local res = ngx.location.capture("/sub")[m
[31m-             ngx.print(res.body)[m
[31m-             ngx.say("main post: ", ngx.ctx.blah)[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then C<GET /main> will give the output[m
[31m-[m
[31m-[m
[31m-     main pre: 73[m
[31m-     sub pre: nil[m
[31m-     sub post: 32[m
[31m-     main post: 73[m
[31m-[m
[31m-Here, modification of the C<ngx.ctx.blah> entry in the subrequest does not affect the one in the parent request. This is because they have two separate versions of C<ngx.ctx.blah>.[m
[31m-[m
[31m-Internal redirection will destroy the original request C<ngx.ctx> data (if any) and the new request will have an empty C<ngx.ctx> table. For instance,[m
[31m-[m
[31m-[m
[31m-     location /new {[m
[31m-         content_by_lua '[m
[31m-             ngx.say(ngx.ctx.foo)[m
[31m-         ';[m
[31m-     }[m
[31m-    [m
[31m-     location /orig {[m
[31m-         content_by_lua '[m
[31m-             ngx.ctx.foo = "hello"[m
[31m-             ngx.exec("/new")[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then C<GET /orig> will give[m
[31m-[m
[31m-[m
[31m-     nil[m
[31m-[m
[31m-rather than the original C<"hello"> value.[m
[31m-[m
[31m-Arbitrary data values, including Lua closures and nested tables, can be inserted into this "magic" table. It also allows the registration of custom meta methods.[m
[31m-[m
[31m-Overriding C<ngx.ctx> with a new Lua table is also supported, for example,[m
[31m-[m
[31m-[m
[31m-     ngx.ctx = { foo = 32, bar = 54 }[m
[31m-[m
[31m-When being used in the context of L<init_worker_by_lua*>, this table just has the same lifetime of the current Lua handler.[m
[31m-[m
[31m-The C<ngx.ctx> lookup requires relatively expensive metamethod calls and it is much slower than explicitly passing per-request data along by your own function arguments. So do not abuse this API for saving your own function arguments because it usually has quite some performance impact.[m
[31m-[m
[31m-Because of the metamethod magic, never "local" the C<ngx.ctx> table outside your Lua function scope on the Lua module level level due to L<worker-level data sharing>. For example, the following is bad:[m
[31m-[m
[31m-[m
[31m-     -- mymodule.lua[m
[31m-     local _M = {}[m
[31m-    [m
[31m-     -- the following line is bad since ngx.ctx is a per-request[m
[31m-     -- data while this `ctx` variable is on the Lua module level[m
[31m-     -- and thus is per-nginx-worker.[m
[31m-     local ctx = ngx.ctx[m
[31m-    [m
[31m-     function _M.main()[m
[31m-         ctx.foo = "bar"[m
[31m-     end[m
[31m-    [m
[31m-     return _M[m
[31m-[m
[31m-Use the following instead:[m
[31m-[m
[31m-[m
[31m-     -- mymodule.lua[m
[31m-     local _M = {}[m
[31m-    [m
[31m-     function _M.main(ctx)[m
[31m-         ctx.foo = "bar"[m
[31m-     end[m
[31m-    [m
[31m-     return _M[m
[31m-[m
[31m-That is, let the caller pass the C<ctx> table explicitly via a function argument.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.location.capture[m
[31m-[m
[31m-B<syntax:> I<res = ngx.location.capture(uri, options?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Issues a synchronous but still non-blocking I<Nginx Subrequest> using C<uri>.[m
[31m-[m
[31m-Nginx's subrequests provide a powerful way to make non-blocking internal requests to other locations configured with disk file directory or I<any> other nginx C modules like C<ngx_proxy>, C<ngx_fastcgi>, C<ngx_memc>,[m
[31m-C<ngx_postgres>, C<ngx_drizzle>, and even ngx_lua itself and etc etc etc.[m
[31m-[m
[31m-Also note that subrequests just mimic the HTTP interface but there is I<no> extra HTTP/TCP traffic I<nor> IPC involved. Everything works internally, efficiently, on the C level.[m
[31m-[m
[31m-Subrequests are completely different from HTTP 301/302 redirection (via L<ngx.redirect>) and internal redirection (via L<ngx.exec>).[m
[31m-[m
[31m-You should always read the request body (by either calling L<ngx.req.read_body> or configuring L<lua_need_request_body> on) before initiating a subrequest.[m
[31m-[m
[31m-This API function (as well as L<ngx.location.capture_multi>) always buffers the whole response body of the subrequest in memory. Thus, you should use L<cosockets>[m
[31m-and streaming processing instead if you have to handle large subrequest responses.[m
[31m-[m
[31m-Here is a basic example:[m
[31m-[m
[31m-[m
[31m-     res = ngx.location.capture(uri)[m
[31m-[m
[31m-Returns a Lua table with 4 slots: C<res.status>, C<res.header>, C<res.body>, and C<res.truncated>.[m
[31m-[m
[31m-C<res.status> holds the response status code for the subrequest response.[m
[31m-[m
[31m-C<res.header> holds all the response headers of the[m
[31m-subrequest and it is a normal Lua table. For multi-value response headers,[m
[31m-the value is a Lua (array) table that holds all the values in the order that[m
[31m-they appear. For instance, if the subrequest response headers contain the following[m
[31m-lines:[m
[31m-[m
[31m-[m
[31m-     Set-Cookie: a=3[m
[31m-     Set-Cookie: foo=bar[m
[31m-     Set-Cookie: baz=blah[m
[31m-[m
[31m-Then C<res.header["Set-Cookie"]> will be evaluated to the table value[m
[31m-C<{"a=3", "foo=bar", "baz=blah"}>.[m
[31m-[m
[31m-C<res.body> holds the subrequest's response body data, which might be truncated. You always need to check the C<res.truncated> boolean flag to see if C<res.body> contains truncated data. The data truncation here can only be caused by those unrecoverable errors in your subrequests like the cases that the remote end aborts the connection prematurely in the middle of the response body data stream or a read timeout happens when your subrequest is receiving the response body data from the remote.[m
[31m-[m
[31m-URI query strings can be concatenated to URI itself, for instance,[m
[31m-[m
[31m-[m
[31m-     res = ngx.location.capture('/foo/bar?a=3&b=4')[m
[31m-[m
[31m-Named locations like C<@foo> are not allowed due to a limitation in[m
[31m-the nginx core. Use normal locations combined with the C<internal> directive to[m
[31m-prepare internal-only locations.[m
[31m-[m
[31m-An optional option table can be fed as the second[m
[31m-argument, which supports the options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<method>[m
[31m-specify the subrequest's request method, which only accepts constants like C<ngx.HTTP_POST>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<body>[m
[31m-specify the subrequest's request body (string value only).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<args>[m
[31m-specify the subrequest's URI query arguments (both string value and Lua tables are accepted)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ctx>[m
[31m-specify a Lua table to be the L<ngx.ctx> table for the subrequest. It can be the current request's L<ngx.ctx> table, which effectively makes the parent and its subrequest to share exactly the same context table. This option was first introduced in the C<v0.3.1rc25> release.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<vars>[m
[31m-take a Lua table which holds the values to set the specified Nginx variables in the subrequest as this option's value. This option was first introduced in the C<v0.3.1rc31> release.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<copy_all_vars>[m
[31m-specify whether to copy over all the Nginx variable values of the current request to the subrequest in question. modifications of the nginx variables in the subrequest will not affect the current (parent) request. This option was first introduced in the C<v0.3.1rc31> release.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<share_all_vars>[m
[31m-specify whether to share all the Nginx variables of the subrequest with the current (parent) request. modifications of the Nginx variables in the subrequest will affect the current (parent) request. Enabling this option may lead to hard-to-debug issues due to bad side-effects and is considered bad and harmful. Only enable this option when you completely know what you are doing.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<always_forward_body>[m
[31m-when set to true, the current (parent) request's request body will always be forwarded to the subrequest being created if the C<body> option is not specified. The request body read by either L<ngx.req.read_body()> or L<lua_need_request_body on> will be directly forwarded to the subrequest without copying the whole request body data when creating the subrequest (no matter the request body data is buffered in memory buffers or temporary files). By default, this option is C<false> and when the C<body> option is not specified, the request body of the current (parent) request is only forwarded when the subrequest takes the C<PUT> or C<POST> request method.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Issuing a POST subrequest, for example, can be done as follows[m
[31m-[m
[31m-[m
[31m-     res = ngx.location.capture([m
[31m-         '/foo/bar',[m
[31m-         { method = ngx.HTTP_POST, body = 'hello, world' }[m
[31m-     )[m
[31m-[m
[31m-See HTTP method constants methods other than POST.[m
[31m-The C<method> option is C<ngx.HTTP_GET> by default.[m
[31m-[m
[31m-The C<args> option can specify extra URI arguments, for instance,[m
[31m-[m
[31m-[m
[31m-     ngx.location.capture('/foo?a=1',[m
[31m-         { args = { b = 3, c = ':' } }[m
[31m-     )[m
[31m-[m
[31m-is equivalent to[m
[31m-[m
[31m-[m
[31m-     ngx.location.capture('/foo?a=1&b=3&c=%3a')[m
[31m-[m
[31m-that is, this method will escape argument keys and values according to URI rules and[m
[31m-concatenate them together into a complete query string. The format for the Lua table passed as the C<args> argument is identical to the format used in the L<ngx.encode_args> method.[m
[31m-[m
[31m-The C<args> option can also take plain query strings:[m
[31m-[m
[31m-[m
[31m-     ngx.location.capture('/foo?a=1',[m
[31m-         { args = 'b=3&c=%3a' } }[m
[31m-     )[m
[31m-[m
[31m-This is functionally identical to the previous examples.[m
[31m-[m
[31m-The C<share_all_vars> option controls whether to share nginx variables among the current request and its subrequests. [m
[31m-If this option is set to C<true>, then the current request and associated subrequests will share the same Nginx variable scope. Hence, changes to Nginx variables made by a subrequest will affect the current request.[m
[31m-[m
[31m-Care should be taken in using this option as variable scope sharing can have unexpected side effects. The C<args>, C<vars>, or C<copy_all_vars> options are generally preferable instead.[m
[31m-[m
[31m-This option is set to C<false> by default[m
[31m-[m
[31m-[m
[31m-     location /other {[m
[31m-         set $dog "$dog world";[m
[31m-         echo "$uri dog: $dog";[m
[31m-     }[m
[31m-    [m
[31m-     location /lua {[m
[31m-         set $dog 'hello';[m
[31m-         content_by_lua '[m
[31m-             res = ngx.location.capture("/other",[m
[31m-                 { share_all_vars = true });[m
[31m-    [m
[31m-             ngx.print(res.body)[m
[31m-             ngx.say(ngx.var.uri, ": ", ngx.var.dog)[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Accessing location C</lua> gives[m
[31m-[m
[31m-    /other dog: hello world[m
[31m-    /lua: hello world[m
[31m-[m
[31m-The C<copy_all_vars> option provides a copy of the parent request's Nginx variables to subrequests when such subrequests are issued. Changes made to these variables by such subrequests will not affect the parent request or any other subrequests sharing the parent request's variables.[m
[31m-[m
[31m-[m
[31m-     location /other {[m
[31m-         set $dog "$dog world";[m
[31m-         echo "$uri dog: $dog";[m
[31m-     }[m
[31m-    [m
[31m-     location /lua {[m
[31m-         set $dog 'hello';[m
[31m-         content_by_lua '[m
[31m-             res = ngx.location.capture("/other",[m
[31m-                 { copy_all_vars = true });[m
[31m-    [m
[31m-             ngx.print(res.body)[m
[31m-             ngx.say(ngx.var.uri, ": ", ngx.var.dog)[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Request C<GET /lua> will give the output[m
[31m-[m
[31m-    /other dog: hello world[m
[31m-    /lua: hello[m
[31m-[m
[31m-Note that if both C<share_all_vars> and C<copy_all_vars> are set to true, then C<share_all_vars> takes precedence.[m
[31m-[m
[31m-In addition to the two settings above, it is possible to specify[m
[31m-values for variables in the subrequest using the C<vars> option. These[m
[31m-variables are set after the sharing or copying of variables has been[m
[31m-evaluated, and provides a more efficient method of passing specific[m
[31m-values to a subrequest over encoding them as URL arguments and [m
[31m-unescaping them in the Nginx config file.[m
[31m-[m
[31m-[m
[31m-     location /other {[m
[31m-         content_by_lua '[m
[31m-             ngx.say("dog = ", ngx.var.dog)[m
[31m-             ngx.say("cat = ", ngx.var.cat)[m
[31m-         ';[m
[31m-     }[m
[31m-    [m
[31m-     location /lua {[m
[31m-         set $dog '';[m
[31m-         set $cat '';[m
[31m-         content_by_lua '[m
[31m-             res = ngx.location.capture("/other",[m
[31m-                 { vars = { dog = "hello", cat = 32 }});[m
[31m-    [m
[31m-             ngx.print(res.body)[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Accessing C</lua> will yield the output[m
[31m-[m
[31m-    dog = hello[m
[31m-    cat = 32[m
[31m-[m
[31m-The C<ctx> option can be used to specify a custom Lua table to serve as the L<ngx.ctx> table for the subrequest.[m
[31m-[m
[31m-[m
[31m-     location /sub {[m
[31m-         content_by_lua '[m
[31m-             ngx.ctx.foo = "bar";[m
[31m-         ';[m
[31m-     }[m
[31m-     location /lua {[m
[31m-         content_by_lua '[m
[31m-             local ctx = {}[m
[31m-             res = ngx.location.capture("/sub", { ctx = ctx })[m
[31m-    [m
[31m-             ngx.say(ctx.foo);[m
[31m-             ngx.say(ngx.ctx.foo);[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /lua> gives[m
[31m-[m
[31m-    bar[m
[31m-    nil[m
[31m-[m
[31m-It is also possible to use this C<ctx> option to share the same L<ngx.ctx> table between the current (parent) request and the subrequest:[m
[31m-[m
[31m-[m
[31m-     location /sub {[m
[31m-         content_by_lua '[m
[31m-             ngx.ctx.foo = "bar";[m
[31m-         ';[m
[31m-     }[m
[31m-     location /lua {[m
[31m-         content_by_lua '[m
[31m-             res = ngx.location.capture("/sub", { ctx = ngx.ctx })[m
[31m-             ngx.say(ngx.ctx.foo);[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Request C<GET /lua> yields the output[m
[31m-[m
[31m-    bar[m
[31m-[m
[31m-Note that subrequests issued by L<ngx.location.capture> inherit all the[m
[31m-request headers of the current request by default and that this may have unexpected side effects on the[m
[31m-subrequest responses. For example, when using the standard C<ngx_proxy> module to serve[m
[31m-subrequests, an "Accept-Encoding: gzip" header in the main request may result[m
[31m-in gzipped responses that cannot be handled properly in Lua code. Original request headers should be ignored by setting [m
[31m-L<proxy_pass_request_headers|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_request_headers> to C<off> in subrequest locations.[m
[31m-[m
[31m-When the C<body> option is not specified and the C<always_forward_body> option is false (the default value), the C<POST> and C<PUT> subrequests will inherit the request bodies of the parent request (if any).[m
[31m-[m
[31m-There is a hard-coded upper limit on the number of concurrent subrequests possible for every main request. In older versions of Nginx, the limit was C<50> concurrent subrequests and in more recent versions, Nginx C<1.1.x> onwards, this was increased to C<200> concurrent subrequests. When this limit is exceeded, the following error message is added to the C<error.log> file:[m
[31m-[m
[31m-    [error] 13983#0: *1 subrequests cycle while processing "/uri"[m
[31m-[m
[31m-The limit can be manually modified if required by editing the definition of the C<NGX_HTTP_MAX_SUBREQUESTS> macro in the C<nginx/src/http/ngx_http_request.h> file in the Nginx source tree.[m
[31m-[m
[31m-Please also refer to restrictions on capturing locations configured by L<subrequest directives of other modules>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.location.capture_multi[m
[31m-[m
[31m-B<syntax:> I<res1, res2, ... = ngx.location.capture_multi({ {uri, options?}, {uri, options?}, ... })>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Just like L<ngx.location.capture>, but supports multiple subrequests running in parallel.[m
[31m-[m
[31m-This function issues several parallel subrequests specified by the input table and returns their results in the same order. For example,[m
[31m-[m
[31m-[m
[31m-     res1, res2, res3 = ngx.location.capture_multi{[m
[31m-         { "/foo", { args = "a=3&b=4" } },[m
[31m-         { "/bar" },[m
[31m-         { "/baz", { method = ngx.HTTP_POST, body = "hello" } },[m
[31m-     }[m
[31m-    [m
[31m-     if res1.status == ngx.HTTP_OK then[m
[31m-         ...[m
[31m-     end[m
[31m-    [m
[31m-     if res2.body == "BLAH" then[m
[31m-         ...[m
[31m-     end[m
[31m-[m
[31m-This function will not return until all the subrequests terminate.[m
[31m-The total latency is the longest latency of the individual subrequests rather than the sum.[m
[31m-[m
[31m-Lua tables can be used for both requests and responses when the number of subrequests to be issued is not known in advance:[m
[31m-[m
[31m-[m
[31m-     -- construct the requests table[m
[31m-     local reqs = {}[m
[31m-     table.insert(reqs, { "/mysql" })[m
[31m-     table.insert(reqs, { "/postgres" })[m
[31m-     table.insert(reqs, { "/redis" })[m
[31m-     table.insert(reqs, { "/memcached" })[m
[31m-    [m
[31m-     -- issue all the requests at once and wait until they all return[m
[31m-     local resps = { ngx.location.capture_multi(reqs) }[m
[31m-    [m
[31m-     -- loop over the responses table[m
[31m-     for i, resp in ipairs(resps) do[m
[31m-         -- process the response table "resp"[m
[31m-     end[m
[31m-[m
[31m-The L<ngx.location.capture> function is just a special form[m
[31m-of this function. Logically speaking, the L<ngx.location.capture> can be implemented like this[m
[31m-[m
[31m-[m
[31m-     ngx.location.capture =[m
[31m-         function (uri, args)[m
[31m-             return ngx.location.capture_multi({ {uri, args} })[m
[31m-         end[m
[31m-[m
[31m-Please also refer to restrictions on capturing locations configured by L<subrequest directives of other modules>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.status[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>>[m
[31m-[m
[31m-Read and write the current request's response status. This should be called[m
[31m-before sending out the response headers.[m
[31m-[m
[31m-[m
[31m-     ngx.status = ngx.HTTP_CREATED[m
[31m-     status = ngx.status[m
[31m-[m
[31m-Setting C<ngx.status> after the response header is sent out has no effect but leaving an error message in your nginx's error log file:[m
[31m-[m
[31m-    attempt to set ngx.status after sending out response headers[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.header.HEADER[m
[31m-[m
[31m-B<syntax:> I<ngx.header.HEADER = VALUE>[m
[31m-[m
[31m-B<syntax:> I<value = ngx.header.HEADER>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>>[m
[31m-[m
[31m-Set, add to, or clear the current request's C<HEADER> response header that is to be sent.[m
[31m-[m
[31m-Underscores (C<_>) in the header names will be replaced by hyphens (C<->) by default. This transformation can be turned off via the L<lua_transform_underscores_in_response_headers> directive.[m
[31m-[m
[31m-The header names are matched case-insensitively.[m
[31m-[m
[31m-[m
[31m-     -- equivalent to ngx.header["Content-Type"] = 'text/plain'[m
[31m-     ngx.header.content_type = 'text/plain';[m
[31m-    [m
[31m-     ngx.header["X-My-Header"] = 'blah blah';[m
[31m-[m
[31m-Multi-value headers can be set this way:[m
[31m-[m
[31m-[m
[31m-     ngx.header['Set-Cookie'] = {'a=32; path=/', 'b=4; path=/'}[m
[31m-[m
[31m-will yield[m
[31m-[m
[31m-[m
[31m-     Set-Cookie: a=32; path=/[m
[31m-     Set-Cookie: b=4; path=/[m
[31m-[m
[31m-in the response headers. [m
[31m-[m
[31m-Only Lua tables are accepted (Only the last element in the table will take effect for standard headers such as C<Content-Type> that only accept a single value).[m
[31m-[m
[31m-[m
[31m-     ngx.header.content_type = {'a', 'b'}[m
[31m-[m
[31m-is equivalent to[m
[31m-[m
[31m-[m
[31m-     ngx.header.content_type = 'b'[m
[31m-[m
[31m-Setting a slot to C<nil> effectively removes it from the response headers:[m
[31m-[m
[31m-[m
[31m-     ngx.header["X-My-Header"] = nil;[m
[31m-[m
[31m-The same applies to assigning an empty table:[m
[31m-[m
[31m-[m
[31m-     ngx.header["X-My-Header"] = {};[m
[31m-[m
[31m-Setting C<ngx.header.HEADER> after sending out response headers (either explicitly with L<ngx.send_headers> or implicitly with L<ngx.print> and similar) will throw out a Lua exception.[m
[31m-[m
[31m-Reading C<ngx.header.HEADER> will return the value of the response header named C<HEADER>. [m
[31m-[m
[31m-Underscores (C<_>) in the header names will also be replaced by dashes (C<->) and the header names will be matched case-insensitively. If the response header is not present at all, C<nil> will be returned.[m
[31m-[m
[31m-This is particularly useful in the context of L<header_filter_by_lua> and L<header_filter_by_lua_file>, for example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $footer '';[m
[31m-    [m
[31m-         proxy_pass http://some-backend;[m
[31m-    [m
[31m-         header_filter_by_lua '[m
[31m-             if ngx.header["X-My-Header"] == "blah" then[m
[31m-                 ngx.var.footer = "some value"[m
[31m-             end[m
[31m-         ';[m
[31m-    [m
[31m-         echo_after_body $footer;[m
[31m-     }[m
[31m-[m
[31m-For multi-value headers, all of the values of header will be collected in order and returned as a Lua table. For example, response headers[m
[31m-[m
[31m-    Foo: bar[m
[31m-    Foo: baz[m
[31m-[m
[31m-will result in[m
[31m-[m
[31m-[m
[31m-     {"bar", "baz"}[m
[31m-[m
[31m-to be returned when reading C<ngx.header.Foo>.[m
[31m-[m
[31m-Note that C<ngx.header> is not a normal Lua table and as such, it is not possible to iterate through it using the Lua C<ipairs> function.[m
[31m-[m
[31m-For reading I<request> headers, use the L<ngx.req.get_headers> function instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.resp.get_headers[m
[31m-[m
[31m-B<syntax:> I<headers = ngx.resp.get_headers(max_headers?, raw?)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>, balancer_by_luaE<42>>[m
[31m-[m
[31m-Returns a Lua table holding all the current response headers for the current request.[m
[31m-[m
[31m-[m
[31m-     local h = ngx.resp.get_headers()[m
[31m-     for k, v in pairs(h) do[m
[31m-         ...[m
[31m-     end[m
[31m-[m
[31m-This function has the same signature as L<ngx.req.get_headers> except getting response headers instead of request headers.[m
[31m-[m
[31m-This API was first introduced in the C<v0.9.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.is_internal[m
[31m-[m
[31m-B<syntax:> I<is_internal = ngx.req.is_internal()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>>[m
[31m-[m
[31m-Returns a boolean indicating whether the current request is an "internal request", i.e.,[m
[31m-a request initiated from inside the current nginx server instead of from the client side.[m
[31m-[m
[31m-Subrequests are all internal requests and so are requests after internal redirects.[m
[31m-[m
[31m-This API was first introduced in the C<v0.9.20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.start_time[m
[31m-[m
[31m-B<syntax:> I<secs = ngx.req.start_time()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>>[m
[31m-[m
[31m-Returns a floating-point number representing the timestamp (including milliseconds as the decimal part) when the current request was created.[m
[31m-[m
[31m-The following example emulates the C<$request_time> variable value (provided by L<ngx_http_log_module|http://nginx.org/en/docs/http/ngx_http_log_module.html>) in pure Lua:[m
[31m-[m
[31m-[m
[31m-     local request_time = ngx.now() - ngx.req.start_time()[m
[31m-[m
[31m-This function was first introduced in the C<v0.7.7> release.[m
[31m-[m
[31m-See also L<ngx.now> and L<ngx.update_time>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.http_version[m
[31m-[m
[31m-B<syntax:> I<num = ngx.req.http_version()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>>[m
[31m-[m
[31m-Returns the HTTP version number for the current request as a Lua number.[m
[31m-[m
[31m-Current possible values are 2.0, 1.0, 1.1, and 0.9. Returns C<nil> for unrecognized values.[m
[31m-[m
[31m-This method was first introduced in the C<v0.7.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.raw_header[m
[31m-[m
[31m-B<syntax:> I<str = ngx.req.raw_header(no_request_line?)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>>[m
[31m-[m
[31m-Returns the original raw HTTP protocol header received by the Nginx server.[m
[31m-[m
[31m-By default, the request line and trailing C<CR LF> terminator will also be included. For example,[m
[31m-[m
[31m-[m
[31m-     ngx.print(ngx.req.raw_header())[m
[31m-[m
[31m-gives something like this:[m
[31m-[m
[31m-    GET /t HTTP/1.1[m
[31m-    Host: localhost[m
[31m-    Connection: close[m
[31m-    Foo: bar[m
[31m-[m
[31m-You can specify the optional[m
[31m-C<no_request_line> argument as a C<true> value to exclude the request line from the result. For example,[m
[31m-[m
[31m-[m
[31m-     ngx.print(ngx.req.raw_header(true))[m
[31m-[m
[31m-outputs something like this:[m
[31m-[m
[31m-    Host: localhost[m
[31m-    Connection: close[m
[31m-    Foo: bar[m
[31m-[m
[31m-This method was first introduced in the C<v0.7.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.get_method[m
[31m-[m
[31m-B<syntax:> I<method_name = ngx.req.get_method()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, balancer_by_luaE<42>>[m
[31m-[m
[31m-Retrieves the current request's request method name. Strings like C<"GET"> and C<"POST"> are returned instead of numerical L<method constants>.[m
[31m-[m
[31m-If the current request is an Nginx subrequest, then the subrequest's method name will be returned.[m
[31m-[m
[31m-This method was first introduced in the C<v0.5.6> release.[m
[31m-[m
[31m-See also L<ngx.req.set_method>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.set_method[m
[31m-[m
[31m-B<syntax:> I<ngx.req.set_method(method_id)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>>[m
[31m-[m
[31m-Overrides the current request's request method with the C<method_id> argument. Currently only numerical L<method constants> are supported, like C<ngx.HTTP_POST> and C<ngx.HTTP_GET>.[m
[31m-[m
[31m-If the current request is an Nginx subrequest, then the subrequest's method will be overridden.[m
[31m-[m
[31m-This method was first introduced in the C<v0.5.6> release.[m
[31m-[m
[31m-See also L<ngx.req.get_method>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.set_uri[m
[31m-[m
[31m-B<syntax:> I<ngx.req.set_uri(uri, jump?)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>>[m
[31m-[m
[31m-Rewrite the current request's (parsed) URI by the C<uri> argument. The C<uri> argument must be a Lua string and cannot be of zero length, or a Lua exception will be thrown.[m
[31m-[m
[31m-The optional boolean C<jump> argument can trigger location rematch (or location jump) as L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite> directive, that is, when C<jump> is C<true> (default to C<false>), this function will never return and it will tell Nginx to try re-searching locations with the new URI value at the later C<post-rewrite> phase and jumping to the new location.[m
[31m-[m
[31m-Location jump will not be triggered otherwise, and only the current request's URI will be modified, which is also the default behavior. This function will return but with no returned values when the C<jump> argument is C<false> or absent altogether.[m
[31m-[m
[31m-For example, the following nginx config snippet[m
[31m-[m
[31m-[m
[31m-     rewrite ^ /foo last;[m
[31m-[m
[31m-can be coded in Lua like this:[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_uri("/foo", true)[m
[31m-[m
[31m-Similarly, Nginx config[m
[31m-[m
[31m-[m
[31m-     rewrite ^ /foo break;[m
[31m-[m
[31m-can be coded in Lua as[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_uri("/foo", false)[m
[31m-[m
[31m-or equivalently,[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_uri("/foo")[m
[31m-[m
[31m-The C<jump> argument can only be set to C<true> in L<rewrite_by_lua> and L<rewrite_by_lua_file>. Use of jump in other contexts is prohibited and will throw out a Lua exception.[m
[31m-[m
[31m-A more sophisticated example involving regex substitutions is as follows[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         rewrite_by_lua '[m
[31m-             local uri = ngx.re.sub(ngx.var.uri, "^/test/(.*)", "/$1", "o")[m
[31m-             ngx.req.set_uri(uri)[m
[31m-         ';[m
[31m-         proxy_pass http://my_backend;[m
[31m-     }[m
[31m-[m
[31m-which is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         rewrite ^/test/(.*) /$1 break;[m
[31m-         proxy_pass http://my_backend;[m
[31m-     }[m
[31m-[m
[31m-Note that it is not possible to use this interface to rewrite URI arguments and that L<ngx.req.set_uri_args> should be used for this instead. For instance, Nginx config[m
[31m-[m
[31m-[m
[31m-     rewrite ^ /foo?a=3? last;[m
[31m-[m
[31m-can be coded as[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_uri_args("a=3")[m
[31m-     ngx.req.set_uri("/foo", true)[m
[31m-[m
[31m-or[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_uri_args({a = 3})[m
[31m-     ngx.req.set_uri("/foo", true)[m
[31m-[m
[31m-This interface was first introduced in the C<v0.3.1rc14> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.set_uri_args[m
[31m-[m
[31m-B<syntax:> I<ngx.req.set_uri_args(args)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>>[m
[31m-[m
[31m-Rewrite the current request's URI query arguments by the C<args> argument. The C<args> argument can be either a Lua string, as in[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_uri_args("a=3&b=hello%20world")[m
[31m-[m
[31m-or a Lua table holding the query arguments' key-value pairs, as in[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_uri_args({ a = 3, b = "hello world" })[m
[31m-[m
[31m-where in the latter case, this method will escape argument keys and values according to the URI escaping rule.[m
[31m-[m
[31m-Multi-value arguments are also supported:[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_uri_args({ a = 3, b = {5, 6} })[m
[31m-[m
[31m-which will result in a query string like C<a=3&b=5&b=6>.[m
[31m-[m
[31m-This interface was first introduced in the C<v0.3.1rc13> release.[m
[31m-[m
[31m-See also L<ngx.req.set_uri>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.get_uri_args[m
[31m-[m
[31m-B<syntax:> I<args = ngx.req.get_uri_args(max_args?)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>, balancer_by_luaE<42>>[m
[31m-[m
[31m-Returns a Lua table holding all the current request URL query arguments.[m
[31m-[m
[31m-[m
[31m-     location = /test {[m
[31m-         content_by_lua '[m
[31m-             local args = ngx.req.get_uri_args()[m
[31m-             for key, val in pairs(args) do[m
[31m-                 if type(val) == "table" then[m
[31m-                     ngx.say(key, ": ", table.concat(val, ", "))[m
[31m-                 else[m
[31m-                     ngx.say(key, ": ", val)[m
[31m-                 end[m
[31m-             end[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then C<GET /test?foo=bar&bar=baz&bar=blah> will yield the response body[m
[31m-[m
[31m-[m
[31m-     foo: bar[m
[31m-     bar: baz, blah[m
[31m-[m
[31m-Multiple occurrences of an argument key will result in a table value holding all the values for that key in order.[m
[31m-[m
[31m-Keys and values are unescaped according to URI escaping rules. In the settings above, C<GET /test?a%20b=1%61+2> will yield:[m
[31m-[m
[31m-[m
[31m-     a b: 1a 2[m
[31m-[m
[31m-Arguments without the C<< =<value> >> parts are treated as boolean arguments. C<GET /test?foo&bar> will yield:[m
[31m-[m
[31m-[m
[31m-     foo: true[m
[31m-     bar: true[m
[31m-[m
[31m-That is, they will take Lua boolean values C<true>. However, they are different from arguments taking empty string values. C<GET /test?foo=&bar=> will give something like[m
[31m-[m
[31m-[m
[31m-     foo:[m
[31m-     bar:[m
[31m-[m
[31m-Empty key arguments are discarded. C<GET /test?=hello&=world> will yield an empty output for instance.[m
[31m-[m
[31m-Updating query arguments via the nginx variable C<$args> (or C<ngx.var.args> in Lua) at runtime is also supported:[m
[31m-[m
[31m-[m
[31m-     ngx.var.args = "a=3&b=42"[m
[31m-     local args = ngx.req.get_uri_args()[m
[31m-[m
[31m-Here the C<args> table will always look like[m
[31m-[m
[31m-[m
[31m-     {a = 3, b = 42}[m
[31m-[m
[31m-regardless of the actual request query string.[m
[31m-[m
[31m-Note that a maximum of 100 request arguments are parsed by default (including those with the same name) and that additional request arguments are silently discarded to guard against potential denial of service attacks.[m
[31m-[m
[31m-However, the optional C<max_args> function argument can be used to override this limit:[m
[31m-[m
[31m-[m
[31m-     local args = ngx.req.get_uri_args(10)[m
[31m-[m
[31m-This argument can be set to zero to remove the limit and to process all request arguments received:[m
[31m-[m
[31m-[m
[31m-     local args = ngx.req.get_uri_args(0)[m
[31m-[m
[31m-Removing the C<max_args> cap is strongly discouraged.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.get_post_args[m
[31m-[m
[31m-B<syntax:> I<args, err = ngx.req.get_post_args(max_args?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>>[m
[31m-[m
[31m-Returns a Lua table holding all the current request POST query arguments (of the MIME type C<application/x-www-form-urlencoded>). Call L<ngx.req.read_body> to read the request body first or turn on the L<lua_need_request_body> directive to avoid errors.[m
[31m-[m
[31m-[m
[31m-     location = /test {[m
[31m-         content_by_lua '[m
[31m-             ngx.req.read_body()[m
[31m-             local args, err = ngx.req.get_post_args()[m
[31m-             if not args then[m
[31m-                 ngx.say("failed to get post args: ", err)[m
[31m-                 return[m
[31m-             end[m
[31m-             for key, val in pairs(args) do[m
[31m-                 if type(val) == "table" then[m
[31m-                     ngx.say(key, ": ", table.concat(val, ", "))[m
[31m-                 else[m
[31m-                     ngx.say(key, ": ", val)[m
[31m-                 end[m
[31m-             end[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then[m
[31m-[m
[31m-[m
[31m-     # Post request with the body 'foo=bar&bar=baz&bar=blah'[m
[31m-     $ curl --data 'foo=bar&bar=baz&bar=blah' localhost/test[m
[31m-[m
[31m-will yield the response body like[m
[31m-[m
[31m-[m
[31m-     foo: bar[m
[31m-     bar: baz, blah[m
[31m-[m
[31m-Multiple occurrences of an argument key will result in a table value holding all of the values for that key in order.[m
[31m-[m
[31m-Keys and values will be unescaped according to URI escaping rules.[m
[31m-[m
[31m-With the settings above,[m
[31m-[m
[31m-[m
[31m-     # POST request with body 'a%20b=1%61+2'[m
[31m-     $ curl -d 'a%20b=1%61+2' localhost/test[m
[31m-[m
[31m-will yield:[m
[31m-[m
[31m-[m
[31m-     a b: 1a 2[m
[31m-[m
[31m-Arguments without the C<< =<value> >> parts are treated as boolean arguments. C<POST /test> with the request body C<foo&bar> will yield:[m
[31m-[m
[31m-[m
[31m-     foo: true[m
[31m-     bar: true[m
[31m-[m
[31m-That is, they will take Lua boolean values C<true>. However, they are different from arguments taking empty string values. C<POST /test> with request body C<foo=&bar=> will return something like[m
[31m-[m
[31m-[m
[31m-     foo:[m
[31m-     bar:[m
[31m-[m
[31m-Empty key arguments are discarded. C<POST /test> with body C<=hello&=world> will yield empty outputs for instance.[m
[31m-[m
[31m-Note that a maximum of 100 request arguments are parsed by default (including those with the same name) and that additional request arguments are silently discarded to guard against potential denial of service attacks.  [m
[31m-[m
[31m-However, the optional C<max_args> function argument can be used to override this limit:[m
[31m-[m
[31m-[m
[31m-     local args = ngx.req.get_post_args(10)[m
[31m-[m
[31m-This argument can be set to zero to remove the limit and to process all request arguments received:[m
[31m-[m
[31m-[m
[31m-     local args = ngx.req.get_post_args(0)[m
[31m-[m
[31m-Removing the C<max_args> cap is strongly discouraged.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.get_headers[m
[31m-[m
[31m-B<syntax:> I<headers = ngx.req.get_headers(max_headers?, raw?)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua, log_by_luaE<42>>[m
[31m-[m
[31m-Returns a Lua table holding all the current request headers.[m
[31m-[m
[31m-[m
[31m-     local h = ngx.req.get_headers()[m
[31m-     for k, v in pairs(h) do[m
[31m-         ...[m
[31m-     end[m
[31m-[m
[31m-To read an individual header:[m
[31m-[m
[31m-[m
[31m-     ngx.say("Host: ", ngx.req.get_headers()["Host"])[m
[31m-[m
[31m-Note that the L<ngx.var.HEADER> API call, which uses core L<$http_HEADER|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_http_> variables, may be more preferable for reading individual request headers.[m
[31m-[m
[31m-For multiple instances of request headers such as:[m
[31m-[m
[31m-[m
[31m-     Foo: foo[m
[31m-     Foo: bar[m
[31m-     Foo: baz[m
[31m-[m
[31m-the value of C<ngx.req.get_headers()["Foo"]> will be a Lua (array) table such as:[m
[31m-[m
[31m-[m
[31m-     {"foo", "bar", "baz"}[m
[31m-[m
[31m-Note that a maximum of 100 request headers are parsed by default (including those with the same name) and that additional request headers are silently discarded to guard against potential denial of service attacks.  [m
[31m-[m
[31m-However, the optional C<max_headers> function argument can be used to override this limit:[m
[31m-[m
[31m-[m
[31m-     local headers = ngx.req.get_headers(10)[m
[31m-[m
[31m-This argument can be set to zero to remove the limit and to process all request headers received:[m
[31m-[m
[31m-[m
[31m-     local headers = ngx.req.get_headers(0)[m
[31m-[m
[31m-Removing the C<max_headers> cap is strongly discouraged.[m
[31m-[m
[31m-Since the C<0.6.9> release, all the header names in the Lua table returned are converted to the pure lower-case form by default, unless the C<raw> argument is set to C<true> (default to C<false>).[m
[31m-[m
[31m-Also, by default, an C<__index> metamethod is added to the resulting Lua table and will normalize the keys to a pure lowercase form with all underscores converted to dashes in case of a lookup miss. For example, if a request header C<My-Foo-Header> is present, then the following invocations will all pick up the value of this header correctly:[m
[31m-[m
[31m-[m
[31m-     ngx.say(headers.my_foo_header)[m
[31m-     ngx.say(headers["My-Foo-Header"])[m
[31m-     ngx.say(headers["my-foo-header"])[m
[31m-[m
[31m-The C<__index> metamethod will not be added when the C<raw> argument is set to C<true>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.set_header[m
[31m-[m
[31m-B<syntax:> I<ngx.req.set_header(header_name, header_value)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_lua>[m
[31m-[m
[31m-Set the current request's request header named C<header_name> to value C<header_value>, overriding any existing ones.[m
[31m-[m
[31m-By default, all the subrequests subsequently initiated by L<ngx.location.capture> and L<ngx.location.capture_multi> will inherit the new header.[m
[31m-[m
[31m-Here is an example of setting the C<Content-Type> header:[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_header("Content-Type", "text/css")[m
[31m-[m
[31m-The C<header_value> can take an array list of values,[m
[31m-for example,[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_header("Foo", {"a", "abc"})[m
[31m-[m
[31m-will produce two new request headers:[m
[31m-[m
[31m-[m
[31m-     Foo: a[m
[31m-     Foo: abc[m
[31m-[m
[31m-and old C<Foo> headers will be overridden if there is any.[m
[31m-[m
[31m-When the C<header_value> argument is C<nil>, the request header will be removed. So[m
[31m-[m
[31m-[m
[31m-     ngx.req.set_header("X-Foo", nil)[m
[31m-[m
[31m-is equivalent to[m
[31m-[m
[31m-[m
[31m-     ngx.req.clear_header("X-Foo")[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.clear_header[m
[31m-[m
[31m-B<syntax:> I<ngx.req.clear_header(header_name)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>>[m
[31m-[m
[31m-Clears the current request's request header named C<header_name>. None of the current request's existing subrequests will be affected but subsequently initiated subrequests will inherit the change by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.read_body[m
[31m-[m
[31m-B<syntax:> I<ngx.req.read_body()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Reads the client request body synchronously without blocking the Nginx event loop.[m
[31m-[m
[31m-[m
[31m-     ngx.req.read_body()[m
[31m-     local args = ngx.req.get_post_args()[m
[31m-[m
[31m-If the request body is already read previously by turning on L<lua_need_request_body> or by using other modules, then this function does not run and returns immediately.[m
[31m-[m
[31m-If the request body has already been explicitly discarded, either by the L<ngx.req.discard_body> function or other modules, this function does not run and returns immediately.[m
[31m-[m
[31m-In case of errors, such as connection errors while reading the data, this method will throw out a Lua exception I<or> terminate the current request with a 500 status code immediately.[m
[31m-[m
[31m-The request body data read using this function can be retrieved later via L<ngx.req.get_body_data> or, alternatively, the temporary file name for the body data cached to disk using L<ngx.req.get_body_file>. This depends on[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-whether the current request body is already larger than the L<client_body_buffer_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-and whether L<client_body_in_file_only|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only> has been switched on.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-In cases where current request may have a request body and the request body data is not required, The L<ngx.req.discard_body> function must be used to explicitly discard the request body to avoid breaking things under HTTP 1.1 keepalive or HTTP 1.1 pipelining.[m
[31m-[m
[31m-This function was first introduced in the C<v0.3.1rc17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.discard_body[m
[31m-[m
[31m-B<syntax:> I<ngx.req.discard_body()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Explicitly discard the request body, i.e., read the data on the connection and throw it away immediately (without using the request body by any means).[m
[31m-[m
[31m-This function is an asynchronous call and returns immediately.[m
[31m-[m
[31m-If the request body has already been read, this function does nothing and returns immediately.[m
[31m-[m
[31m-This function was first introduced in the C<v0.3.1rc17> release.[m
[31m-[m
[31m-See also L<ngx.req.read_body>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.get_body_data[m
[31m-[m
[31m-B<syntax:> I<data = ngx.req.get_body_data()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, log_by_luaE<42>>[m
[31m-[m
[31m-Retrieves in-memory request body data. It returns a Lua string rather than a Lua table holding all the parsed query arguments. Use the L<ngx.req.get_post_args> function instead if a Lua table is required.[m
[31m-[m
[31m-This function returns C<nil> if[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-the request body has not been read,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-the request body has been read into disk temporary files,[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-or the request body has zero size.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-If the request body has not been read yet, call L<ngx.req.read_body> first (or turned on L<lua_need_request_body> to force this module to read the request body. This is not recommended however).[m
[31m-[m
[31m-If the request body has been read into disk files, try calling the L<ngx.req.get_body_file> function instead.[m
[31m-[m
[31m-To force in-memory request bodies, try setting L<client_body_buffer_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size> to the same size value in L<client_max_body_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>.[m
[31m-[m
[31m-Note that calling this function instead of using C<ngx.var.request_body> or C<ngx.var.echo_request_body> is more efficient because it can save one dynamic memory allocation and one data copy.[m
[31m-[m
[31m-This function was first introduced in the C<v0.3.1rc17> release.[m
[31m-[m
[31m-See also L<ngx.req.get_body_file>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.get_body_file[m
[31m-[m
[31m-B<syntax:> I<file_name = ngx.req.get_body_file()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Retrieves the file name for the in-file request body data. Returns C<nil> if the request body has not been read or has been read into memory.[m
[31m-[m
[31m-The returned file is read only and is usually cleaned up by Nginx's memory pool. It should not be manually modified, renamed, or removed in Lua code.[m
[31m-[m
[31m-If the request body has not been read yet, call L<ngx.req.read_body> first (or turned on L<lua_need_request_body> to force this module to read the request body. This is not recommended however).[m
[31m-[m
[31m-If the request body has been read into memory, try calling the L<ngx.req.get_body_data> function instead.[m
[31m-[m
[31m-To force in-file request bodies, try turning on L<client_body_in_file_only|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only>.[m
[31m-[m
[31m-This function was first introduced in the C<v0.3.1rc17> release.[m
[31m-[m
[31m-See also L<ngx.req.get_body_data>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.set_body_data[m
[31m-[m
[31m-B<syntax:> I<ngx.req.set_body_data(data)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Set the current request's request body using the in-memory data specified by the C<data> argument.[m
[31m-[m
[31m-If the current request's request body has not been read, then it will be properly discarded. When the current request's request body has been read into memory or buffered into a disk file, then the old request body's memory will be freed or the disk file will be cleaned up immediately, respectively.[m
[31m-[m
[31m-This function was first introduced in the C<v0.3.1rc18> release.[m
[31m-[m
[31m-See also L<ngx.req.set_body_file>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.set_body_file[m
[31m-[m
[31m-B<syntax:> I<ngx.req.set_body_file(file_name, auto_clean?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Set the current request's request body using the in-file data specified by the C<file_name> argument.[m
[31m-[m
[31m-If the optional C<auto_clean> argument is given a C<true> value, then this file will be removed at request completion or the next time this function or L<ngx.req.set_body_data> are called in the same request. The C<auto_clean> is default to C<false>.[m
[31m-[m
[31m-Please ensure that the file specified by the C<file_name> argument exists and is readable by an Nginx worker process by setting its permission properly to avoid Lua exception errors.[m
[31m-[m
[31m-If the current request's request body has not been read, then it will be properly discarded. When the current request's request body has been read into memory or buffered into a disk file, then the old request body's memory will be freed or the disk file will be cleaned up immediately, respectively.[m
[31m-[m
[31m-This function was first introduced in the C<v0.3.1rc18> release.[m
[31m-[m
[31m-See also L<ngx.req.set_body_data>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.init_body[m
[31m-[m
[31m-B<syntax:> I<ngx.req.init_body(buffer_size?)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Creates a new blank request body for the current request and inializes the buffer for later request body data writing via the L<ngx.req.append_body> and L<ngx.req.finish_body> APIs.[m
[31m-[m
[31m-If the C<buffer_size> argument is specified, then its value will be used for the size of the memory buffer for body writing with L<ngx.req.append_body>. If the argument is omitted, then the value specified by the standard L<client_body_buffer_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size> directive will be used instead.[m
[31m-[m
[31m-When the data can no longer be hold in the memory buffer for the request body, then the data will be flushed onto a temporary file just like the standard request body reader in the Nginx core.[m
[31m-[m
[31m-It is important to always call the L<ngx.req.finish_body> after all the data has been appended onto the current request body. Also, when this function is used together with L<ngx.req.socket>, it is required to call L<ngx.req.socket> I<before> this function, or you will get the "request body already exists" error message.[m
[31m-[m
[31m-The usage of this function is often like this:[m
[31m-[m
[31m-[m
[31m-     ngx.req.init_body(128 * 1024)  -- buffer is 128KB[m
[31m-     for chunk in next_data_chunk() do[m
[31m-         ngx.req.append_body(chunk) -- each chunk can be 4KB[m
[31m-     end[m
[31m-     ngx.req.finish_body()[m
[31m-[m
[31m-This function can be used with L<ngx.req.append_body>, L<ngx.req.finish_body>, and L<ngx.req.socket> to implement efficient input filters in pure Lua (in the context of L<rewrite_by_lua>I< or L<access_by_lua>>), which can be used with other Nginx content handler or upstream modules like L<ngx_http_proxy_module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html> and L<ngx_http_fastcgi_module|http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html>.[m
[31m-[m
[31m-This function was first introduced in the C<v0.5.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.append_body[m
[31m-[m
[31m-B<syntax:> I<ngx.req.append_body(data_chunk)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Append new data chunk specified by the C<data_chunk> argument onto the existing request body created by the L<ngx.req.init_body> call.[m
[31m-[m
[31m-When the data can no longer be hold in the memory buffer for the request body, then the data will be flushed onto a temporary file just like the standard request body reader in the Nginx core.[m
[31m-[m
[31m-It is important to always call the L<ngx.req.finish_body> after all the data has been appended onto the current request body.[m
[31m-[m
[31m-This function can be used with L<ngx.req.init_body>, L<ngx.req.finish_body>, and L<ngx.req.socket> to implement efficient input filters in pure Lua (in the context of L<rewrite_by_lua>I< or L<access_by_lua>>), which can be used with other Nginx content handler or upstream modules like L<ngx_http_proxy_module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html> and L<ngx_http_fastcgi_module|http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html>.[m
[31m-[m
[31m-This function was first introduced in the C<v0.5.11> release.[m
[31m-[m
[31m-See also L<ngx.req.init_body>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.finish_body[m
[31m-[m
[31m-B<syntax:> I<ngx.req.finish_body()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Completes the construction process of the new request body created by the L<ngx.req.init_body> and L<ngx.req.append_body> calls.[m
[31m-[m
[31m-This function can be used with L<ngx.req.init_body>, L<ngx.req.append_body>, and L<ngx.req.socket> to implement efficient input filters in pure Lua (in the context of L<rewrite_by_lua>I< or L<access_by_lua>>), which can be used with other Nginx content handler or upstream modules like L<ngx_http_proxy_module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html> and L<ngx_http_fastcgi_module|http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html>.[m
[31m-[m
[31m-This function was first introduced in the C<v0.5.11> release.[m
[31m-[m
[31m-See also L<ngx.req.init_body>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.req.socket[m
[31m-[m
[31m-B<syntax:> I<tcpsock, err = ngx.req.socket()>[m
[31m-[m
[31m-B<syntax:> I<tcpsock, err = ngx.req.socket(raw)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Returns a read-only cosocket object that wraps the downstream connection. Only L<receive> and L<receiveuntil> methods are supported on this object.[m
[31m-[m
[31m-In case of error, C<nil> will be returned as well as a string describing the error.[m
[31m-[m
[31m-The socket object returned by this method is usually used to read the current request's body in a streaming fashion. Do not turn on the L<lua_need_request_body> directive, and do not mix this call with L<ngx.req.read_body> and L<ngx.req.discard_body>.[m
[31m-[m
[31m-If any request body data has been pre-read into the Nginx core request header buffer, the resulting cosocket object will take care of this to avoid potential data loss resulting from such pre-reading.[m
[31m-Chunked request bodies are not yet supported in this API.[m
[31m-[m
[31m-Since the C<v0.9.0> release, this function accepts an optional boolean C<raw> argument. When this argument is C<true>, this function returns a full-duplex cosocket object wrapping around the raw downstream connection socket, upon which you can call the L<receive>, L<receiveuntil>, and L<send> methods.[m
[31m-[m
[31m-When the C<raw> argument is C<true>, it is required that no pending data from any previous L<ngx.say>, L<ngx.print>, or L<ngx.send_headers> calls exists. So if you have these downstream output calls previously, you should call L<ngx.flush(true)> before calling C<ngx.req.socket(true)> to ensure that there is no pending output data. If the request body has not been read yet, then this "raw socket" can also be used to read the request body.[m
[31m-[m
[31m-You can use the "raw request socket" returned by C<ngx.req.socket(true)> to implement fancy protocols like L<WebSocket|http://en.wikipedia.org/wiki/WebSocket>, or just emit your own raw HTTP response header or body data. You can refer to the L<lua-resty-websocket library|https://github.com/openresty/lua-resty-websocket> for a real world example.[m
[31m-[m
[31m-This function was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.exec[m
[31m-[m
[31m-B<syntax:> I<ngx.exec(uri, args?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Does an internal redirect to C<uri> with C<args> and is similar to the L<echo_exec|http://github.com/openresty/echo-nginx-module#echo_exec> directive of the L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>.[m
[31m-[m
[31m-[m
[31m-     ngx.exec('/some-location');[m
[31m-     ngx.exec('/some-location', 'a=3&b=5&c=6');[m
[31m-     ngx.exec('/some-location?a=3&b=5', 'c=6');[m
[31m-[m
[31m-The optional second C<args> can be used to specify extra URI query arguments, for example:[m
[31m-[m
[31m-[m
[31m-     ngx.exec("/foo", "a=3&b=hello%20world")[m
[31m-[m
[31m-Alternatively, a Lua table can be passed for the C<args> argument for ngx_lua to carry out URI escaping and string concatenation.[m
[31m-[m
[31m-[m
[31m-     ngx.exec("/foo", { a = 3, b = "hello world" })[m
[31m-[m
[31m-The result is exactly the same as the previous example.[m
[31m-[m
[31m-The format for the Lua table passed as the C<args> argument is identical to the format used in the L<ngx.encode_args> method.[m
[31m-[m
[31m-Named locations are also supported but the second C<args> argument will be ignored if present and the querystring for the new target is inherited from the referring location (if any).[m
[31m-[m
[31m-C<GET /foo/file.php?a=hello> will return "hello" and not "goodbye" in the example below[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         content_by_lua '[m
[31m-             ngx.exec("@bar", "a=goodbye");[m
[31m-         ';[m
[31m-     }[m
[31m-    [m
[31m-     location @bar {[m
[31m-         content_by_lua '[m
[31m-             local args = ngx.req.get_uri_args()[m
[31m-             for key, val in pairs(args) do[m
[31m-                 if key == "a" then[m
[31m-                     ngx.say(val)[m
[31m-                 end[m
[31m-             end[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Note that the C<ngx.exec> method is different from L<ngx.redirect> in that[m
[31m-it is purely an internal redirect and that no new external HTTP traffic is involved.[m
[31m-[m
[31m-Also note that this method call terminates the processing of the current request and that it I<must> be called before L<ngx.send_headers> or explicit response body[m
[31m-outputs by either L<ngx.print> or L<ngx.say>.[m
[31m-[m
[31m-It is recommended that a coding style that combines this method call with the C<return> statement, i.e., C<return ngx.exec(...)> be adopted when this method call is used in contexts other than L<header_filter_by_lua> to reinforce the fact that the request processing is being terminated.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.redirect[m
[31m-[m
[31m-B<syntax:> I<ngx.redirect(uri, status?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Issue an C<HTTP 301> or C<302> redirection to C<uri>.[m
[31m-[m
[31m-The optional C<status> parameter specifies whether[m
[31m-C<301> or C<302> to be used. It is C<302> (C<ngx.HTTP_MOVED_TEMPORARILY>) by default.[m
[31m-[m
[31m-Here is an example assuming the current server name is C<localhost> and that it is listening on port 1984:[m
[31m-[m
[31m-[m
[31m-     return ngx.redirect("/foo")[m
[31m-[m
[31m-which is equivalent to[m
[31m-[m
[31m-[m
[31m-     return ngx.redirect("/foo", ngx.HTTP_MOVED_TEMPORARILY)[m
[31m-[m
[31m-Redirecting arbitrary external URLs is also supported, for example:[m
[31m-[m
[31m-[m
[31m-     return ngx.redirect("http://www.google.com")[m
[31m-[m
[31m-We can also use the numerical code directly as the second C<status> argument:[m
[31m-[m
[31m-[m
[31m-     return ngx.redirect("/foo", 301)[m
[31m-[m
[31m-This method is similar to the L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite> directive with the C<redirect> modifier in the standard[m
[31m-L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>, for example, this C<nginx.conf> snippet[m
[31m-[m
[31m-[m
[31m-     rewrite ^ /foo? redirect;  # nginx config[m
[31m-[m
[31m-is equivalent to the following Lua code[m
[31m-[m
[31m-[m
[31m-     return ngx.redirect('/foo');  -- Lua code[m
[31m-[m
[31m-while[m
[31m-[m
[31m-[m
[31m-     rewrite ^ /foo? permanent;  # nginx config[m
[31m-[m
[31m-is equivalent to[m
[31m-[m
[31m-[m
[31m-     return ngx.redirect('/foo', ngx.HTTP_MOVED_PERMANENTLY)  -- Lua code[m
[31m-[m
[31m-URI arguments can be specified as well, for example:[m
[31m-[m
[31m-[m
[31m-     return ngx.redirect('/foo?a=3&b=4')[m
[31m-[m
[31m-Note that this method call terminates the processing of the current request and that it I<must> be called before L<ngx.send_headers> or explicit response body[m
[31m-outputs by either L<ngx.print> or L<ngx.say>.[m
[31m-[m
[31m-It is recommended that a coding style that combines this method call with the C<return> statement, i.e., C<return ngx.redirect(...)> be adopted when this method call is used in contexts other than L<header_filter_by_lua> to reinforce the fact that the request processing is being terminated.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.send_headers[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.send_headers()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Explicitly send out the response headers.[m
[31m-[m
[31m-Since C<v0.8.3> this function returns C<1> on success, or returns C<nil> and a string describing the error otherwise.[m
[31m-[m
[31m-Note that there is normally no need to manually send out response headers as ngx_lua will automatically send headers out[m
[31m-before content is output with L<ngx.say> or L<ngx.print> or when L<content_by_lua> exits normally.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.headers_sent[m
[31m-[m
[31m-B<syntax:> I<value = ngx.headers_sent>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Returns C<true> if the response headers have been sent (by ngx_lua), and C<false> otherwise.[m
[31m-[m
[31m-This API was first introduced in ngx_lua v0.3.1rc6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.print[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.print(...)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Emits arguments concatenated to the HTTP client (as response body). If response headers have not been sent, this function will send headers out first and then output body data.[m
[31m-[m
[31m-Since C<v0.8.3> this function returns C<1> on success, or returns C<nil> and a string describing the error otherwise.[m
[31m-[m
[31m-Lua C<nil> values will output C<"nil"> strings and Lua boolean values will output C<"true"> and C<"false"> literal strings respectively.[m
[31m-[m
[31m-Nested arrays of strings are permitted and the elements in the arrays will be sent one by one:[m
[31m-[m
[31m-[m
[31m-     local table = {[m
[31m-         "hello, ",[m
[31m-         {"world: ", true, " or ", false,[m
[31m-             {": ", nil}}[m
[31m-     }[m
[31m-     ngx.print(table)[m
[31m-[m
[31m-will yield the output[m
[31m-[m
[31m-[m
[31m-     hello, world: true or false: nil[m
[31m-[m
[31m-Non-array table arguments will cause a Lua exception to be thrown.[m
[31m-[m
[31m-The C<ngx.null> constant will yield the C<"null"> string output.[m
[31m-[m
[31m-This is an asynchronous call and will return immediately without waiting for all the data to be written into the system send buffer. To run in synchronous mode, call C<ngx.flush(true)> after calling C<ngx.print>. This can be particularly useful for streaming output. See L<ngx.flush> for more details.[m
[31m-[m
[31m-Please note that both C<ngx.print> and L<ngx.say> will always invoke the whole Nginx output body filter chain, which is an expensive operation. So be careful when calling either of these two in a tight loop; buffer the data yourself in Lua and save the calls.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.say[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.say(...)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Just as L<ngx.print> but also emit a trailing newline.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.log[m
[31m-[m
[31m-B<syntax:> I<ngx.log(log_level, ...)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Log arguments concatenated to error.log with the given logging level.[m
[31m-[m
[31m-Lua C<nil> arguments are accepted and result in literal C<"nil"> string while Lua booleans result in literal C<"true"> or C<"false"> string outputs. And the C<ngx.null> constant will yield the C<"null"> string output.[m
[31m-[m
[31m-The C<log_level> argument can take constants like C<ngx.ERR> and C<ngx.WARN>. Check out L<Nginx log level constants> for details.[m
[31m-[m
[31m-There is a hard coded C<2048> byte limitation on error message lengths in the Nginx core. This limit includes trailing newlines and leading time stamps. If the message size exceeds this limit, Nginx will truncate the message text accordingly. This limit can be manually modified by editing the C<NGX_MAX_ERROR_STR> macro definition in the C<src/core/ngx_log.h> file in the Nginx source tree.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.flush[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.flush(wait?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Flushes response output to the client. [m
[31m-[m
[31m-C<ngx.flush> accepts an optional boolean C<wait> argument (Default: C<false>) first introduced in the C<v0.3.1rc34> release. When called with the default argument, it issues an asynchronous call (Returns immediately without waiting for output data to be written into the system send buffer). Calling the function with the C<wait> argument set to C<true> switches to synchronous mode. [m
[31m-[m
[31m-In synchronous mode, the function will not return until all output data has been written into the system send buffer or until the L<send_timeout|http://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout> setting has expired. Note that using the Lua coroutine mechanism means that this function does not block the Nginx event loop even in the synchronous mode.[m
[31m-[m
[31m-When C<ngx.flush(true)> is called immediately after L<ngx.print> or L<ngx.say>, it causes the latter functions to run in synchronous mode. This can be particularly useful for streaming output.[m
[31m-[m
[31m-Note that C<ngx.flush> is not functional when in the HTTP 1.0 output buffering mode. See L<HTTP 1.0 support>.[m
[31m-[m
[31m-Since C<v0.8.3> this function returns C<1> on success, or returns C<nil> and a string describing the error otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.exit[m
[31m-[m
[31m-B<syntax:> I<ngx.exit(status)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-When C<< status >= 200 >> (i.e., C<ngx.HTTP_OK> and above), it will interrupt the execution of the current request and return status code to nginx.[m
[31m-[m
[31m-When C<status == 0> (i.e., C<ngx.OK>), it will only quit the current phase handler (or the content handler if the L<content_by_lua> directive is used) and continue to run later phases (if any) for the current request.[m
[31m-[m
[31m-The C<status> argument can be C<ngx.OK>, C<ngx.ERROR>, C<ngx.HTTP_NOT_FOUND>,[m
[31m-C<ngx.HTTP_MOVED_TEMPORARILY>, or other L<HTTP status constants>.[m
[31m-[m
[31m-To return an error page with custom contents, use code snippets like this:[m
[31m-[m
[31m-[m
[31m-     ngx.status = ngx.HTTP_GONE[m
[31m-     ngx.say("This is our own content")[m
[31m-     -- to cause quit the whole request rather than the current phase handler[m
[31m-     ngx.exit(ngx.HTTP_OK)[m
[31m-[m
[31m-The effect in action:[m
[31m-[m
[31m-[m
[31m-     $ curl -i http://localhost/test[m
[31m-     HTTP/1.1 410 Gone[m
[31m-     Server: nginx/1.0.6[m
[31m-     Date: Thu, 15 Sep 2011 00:51:48 GMT[m
[31m-     Content-Type: text/plain[m
[31m-     Transfer-Encoding: chunked[m
[31m-     Connection: keep-alive[m
[31m-    [m
[31m-     This is our own content[m
[31m-[m
[31m-Number literals can be used directly as the argument, for instance,[m
[31m-[m
[31m-[m
[31m-     ngx.exit(501)[m
[31m-[m
[31m-Note that while this method accepts all L<HTTP status constants> as input, it only accepts C<NGX_OK> and C<NGX_ERROR> of the L<core constants>.[m
[31m-[m
[31m-Also note that this method call terminates the processing of the current request and that it is recommended that a coding style that combines this method call with the C<return> statement, i.e., C<return ngx.exit(...)> be used to reinforce the fact that the request processing is being terminated.[m
[31m-[m
[31m-When being used in the context of L<header_filter_by_lua>, C<ngx.exit()> is an asynchronous operation and will return immediately. This behavior may change in future and it is recommended that users always use C<return> in combination as suggested above.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.eof[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.eof()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Explicitly specify the end of the response output stream. In the case of HTTP 1.1 chunked encoded output, it will just trigger the Nginx core to send out the "last chunk".[m
[31m-[m
[31m-When you disable the HTTP 1.1 keep-alive feature for your downstream connections, you can rely on descent HTTP clients to close the connection actively for you when you call this method. This trick can be used do back-ground jobs without letting the HTTP clients to wait on the connection, as in the following example:[m
[31m-[m
[31m-[m
[31m-     location = /async {[m
[31m-         keepalive_timeout 0;[m
[31m-         content_by_lua '[m
[31m-             ngx.say("got the task!")[m
[31m-             ngx.eof()  -- a descent HTTP client will close the connection at this point[m
[31m-             -- access MySQL, PostgreSQL, Redis, Memcached, and etc here...[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-But if you create subrequests to access other locations configured by Nginx upstream modules, then you should configure those upstream modules to ignore client connection abortions if they are not by default. For example, by default the standard L<ngx_http_proxy_module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html> will terminate both the subrequest and the main request as soon as the client closes the connection, so it is important to turn on the L<proxy_ignore_client_abort|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort> directive in your location block configured by L<ngx_http_proxy_module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>:[m
[31m-[m
[31m-[m
[31m-     proxy_ignore_client_abort on;[m
[31m-[m
[31m-A better way to do background jobs is to use the L<ngx.timer.at> API.[m
[31m-[m
[31m-Since C<v0.8.3> this function returns C<1> on success, or returns C<nil> and a string describing the error otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.sleep[m
[31m-[m
[31m-B<syntax:> I<ngx.sleep(seconds)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sleeps for the specified seconds without blocking. One can specify time resolution up to 0.001 seconds (i.e., one milliseconds).[m
[31m-[m
[31m-Behind the scene, this method makes use of the Nginx timers.[m
[31m-[m
[31m-Since the C<0.7.20> release, The C<0> time argument can also be specified.[m
[31m-[m
[31m-This method was introduced in the C<0.5.0rc30> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.escape_uri[m
[31m-[m
[31m-B<syntax:> I<newstr = ngx.escape_uri(str)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Escape C<str> as a URI component.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.unescape_uri[m
[31m-[m
[31m-B<syntax:> I<newstr = ngx.unescape_uri(str)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Unescape C<str> as an escaped URI component.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     ngx.say(ngx.unescape_uri("b%20r56+7"))[m
[31m-[m
[31m-gives the output[m
[31m-[m
[31m-    b r56 7[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.encode_args[m
[31m-[m
[31m-B<syntax:> I<str = ngx.encode_args(table)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Encode the Lua table to a query args string according to the URI encoded rules.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     ngx.encode_args({foo = 3, ["b r"] = "hello world"})[m
[31m-[m
[31m-yields[m
[31m-[m
[31m-    foo=3&b%20r=hello%20world[m
[31m-[m
[31m-The table keys must be Lua strings.[m
[31m-[m
[31m-Multi-value query args are also supported. Just use a Lua table for the argument's value, for example:[m
[31m-[m
[31m-[m
[31m-     ngx.encode_args({baz = {32, "hello"}})[m
[31m-[m
[31m-gives[m
[31m-[m
[31m-    baz=32&baz=hello[m
[31m-[m
[31m-If the value table is empty and the effect is equivalent to the C<nil> value.[m
[31m-[m
[31m-Boolean argument values are also supported, for instance,[m
[31m-[m
[31m-[m
[31m-     ngx.encode_args({a = true, b = 1})[m
[31m-[m
[31m-yields[m
[31m-[m
[31m-    a&b=1[m
[31m-[m
[31m-If the argument value is C<false>, then the effect is equivalent to the C<nil> value.[m
[31m-[m
[31m-This method was first introduced in the C<v0.3.1rc27> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.decode_args[m
[31m-[m
[31m-B<syntax:> I<table = ngx.decode_args(str, max_args?)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Decodes a URI encoded query-string into a Lua table. This is the inverse function of L<ngx.encode_args>.[m
[31m-[m
[31m-The optional C<max_args> argument can be used to specify the maximum number of arguments parsed from the C<str> argument. By default, a maximum of 100 request arguments are parsed (including those with the same name) and that additional URI arguments are silently discarded to guard against potential denial of service attacks.[m
[31m-[m
[31m-This argument can be set to zero to remove the limit and to process all request arguments received:[m
[31m-[m
[31m-[m
[31m-     local args = ngx.decode_args(str, 0)[m
[31m-[m
[31m-Removing the C<max_args> cap is strongly discouraged.[m
[31m-[m
[31m-This method was introduced in the C<v0.5.0rc29>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.encode_base64[m
[31m-[m
[31m-B<syntax:> I<newstr = ngx.encode_base64(str, no_padding?)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Encodes C<str> to a base64 digest.[m
[31m-[m
[31m-Since the C<0.9.16> release, an optional boolean-typed C<no_padding> argument can be specified to control whether the base64 padding should be appended to the resulting digest (default to C<false>, i.e., with padding enabled).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.decode_base64[m
[31m-[m
[31m-B<syntax:> I<newstr = ngx.decode_base64(str)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Decodes the C<str> argument as a base64 digest to the raw form. Returns C<nil> if C<str> is not well formed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.crc32_short[m
[31m-[m
[31m-B<syntax:> I<intval = ngx.crc32_short(str)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Calculates the CRC-32 (Cyclic Redundancy Code) digest for the C<str> argument.[m
[31m-[m
[31m-This method performs better on relatively short C<str> inputs (i.e., less than 30 ~ 60 bytes), as compared to L<ngx.crc32_long>. The result is exactly the same as L<ngx.crc32_long>.[m
[31m-[m
[31m-Behind the scene, it is just a thin wrapper around the C<ngx_crc32_short> function defined in the Nginx core.[m
[31m-[m
[31m-This API was first introduced in the C<v0.3.1rc8> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.crc32_long[m
[31m-[m
[31m-B<syntax:> I<intval = ngx.crc32_long(str)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Calculates the CRC-32 (Cyclic Redundancy Code) digest for the C<str> argument.[m
[31m-[m
[31m-This method performs better on relatively long C<str> inputs (i.e., longer than 30 ~ 60 bytes), as compared to L<ngx.crc32_short>.  The result is exactly the same as L<ngx.crc32_short>.[m
[31m-[m
[31m-Behind the scene, it is just a thin wrapper around the C<ngx_crc32_long> function defined in the Nginx core.[m
[31m-[m
[31m-This API was first introduced in the C<v0.3.1rc8> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.hmac_sha1[m
[31m-[m
[31m-B<syntax:> I<digest = ngx.hmac_sha1(secret_key, str)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Computes the L<HMAC-SHA1|http://en.wikipedia.org/wiki/HMAC> digest of the argument C<str> and turns the result using the secret key C<< <secret_key> >>.[m
[31m-[m
[31m-The raw binary form of the C<HMAC-SHA1> digest will be generated, use L<ngx.encode_base64>, for example, to encode the result to a textual representation if desired.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     local key = "thisisverysecretstuff"[m
[31m-     local src = "some string we want to sign"[m
[31m-     local digest = ngx.hmac_sha1(key, src)[m
[31m-     ngx.say(ngx.encode_base64(digest))[m
[31m-[m
[31m-yields the output[m
[31m-[m
[31m-    R/pvxzHC4NLtj7S+kXFg/NePTmk=[m
[31m-[m
[31m-This API requires the OpenSSL library enabled in the Nginx build (usually by passing the C<--with-http_ssl_module> option to the C<./configure> script).[m
[31m-[m
[31m-This function was first introduced in the C<v0.3.1rc29> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.md5[m
[31m-[m
[31m-B<syntax:> I<digest = ngx.md5(str)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns the hexadecimal representation of the MD5 digest of the C<str> argument.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     location = /md5 {[m
[31m-         content_by_lua 'ngx.say(ngx.md5("hello"))';[m
[31m-     }[m
[31m-[m
[31m-yields the output[m
[31m-[m
[31m-    5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-See L<ngx.md5_bin> if the raw binary MD5 digest is required.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.md5_bin[m
[31m-[m
[31m-B<syntax:> I<digest = ngx.md5_bin(str)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns the binary form of the MD5 digest of the C<str> argument.[m
[31m-[m
[31m-See L<ngx.md5> if the hexadecimal form of the MD5 digest is required.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.sha1_bin[m
[31m-[m
[31m-B<syntax:> I<digest = ngx.sha1_bin(str)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns the binary form of the SHA-1 digest of the C<str> argument.[m
[31m-[m
[31m-This function requires SHA-1 support in the Nginx build. (This usually just means OpenSSL should be installed while building Nginx).[m
[31m-[m
[31m-This function was first introduced in the C<v0.5.0rc6>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.quote_sql_str[m
[31m-[m
[31m-B<syntax:> I<quoted_value = ngx.quote_sql_str(raw_value)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns a quoted SQL string literal according to the MySQL quoting rules.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.today[m
[31m-[m
[31m-B<syntax:> I<str = ngx.today()>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns current date (in the format C<yyyy-mm-dd>) from the nginx cached time (no syscall involved unlike Lua's date library).[m
[31m-[m
[31m-This is the local time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.time[m
[31m-[m
[31m-B<syntax:> I<secs = ngx.time()>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns the elapsed seconds from the epoch for the current time stamp from the nginx cached time (no syscall involved unlike Lua's date library).[m
[31m-[m
[31m-Updates of the Nginx time cache an be forced by calling L<ngx.update_time> first.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.now[m
[31m-[m
[31m-B<syntax:> I<secs = ngx.now()>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns a floating-point number for the elapsed time in seconds (including milliseconds as the decimal part) from the epoch for the current time stamp from the nginx cached time (no syscall involved unlike Lua's date library).[m
[31m-[m
[31m-You can forcibly update the Nginx time cache by calling L<ngx.update_time> first.[m
[31m-[m
[31m-This API was first introduced in C<v0.3.1rc32>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.update_time[m
[31m-[m
[31m-B<syntax:> I<ngx.update_time()>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Forcibly updates the Nginx current time cache. This call involves a syscall and thus has some overhead, so do not abuse it.[m
[31m-[m
[31m-This API was first introduced in C<v0.3.1rc32>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.localtime[m
[31m-[m
[31m-B<syntax:> I<str = ngx.localtime()>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns the current time stamp (in the format C<yyyy-mm-dd hh:mm:ss>) of the nginx cached time (no syscall involved unlike Lua's L<os.date|http://www.lua.org/manual/5.1/manual.html#pdf-os.date> function).[m
[31m-[m
[31m-This is the local time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.utctime[m
[31m-[m
[31m-B<syntax:> I<str = ngx.utctime()>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns the current time stamp (in the format C<yyyy-mm-dd hh:mm:ss>) of the nginx cached time (no syscall involved unlike Lua's L<os.date|http://www.lua.org/manual/5.1/manual.html#pdf-os.date> function).[m
[31m-[m
[31m-This is the UTC time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.cookie_time[m
[31m-[m
[31m-B<syntax:> I<str = ngx.cookie_time(sec)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns a formatted string can be used as the cookie expiration time. The parameter C<sec> is the time stamp in seconds (like those returned from L<ngx.time>).[m
[31m-[m
[31m-[m
[31m-     ngx.say(ngx.cookie_time(1290079655))[m
[31m-         -- yields "Thu, 18-Nov-10 11:27:35 GMT"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.http_time[m
[31m-[m
[31m-B<syntax:> I<str = ngx.http_time(sec)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns a formated string can be used as the http header time (for example, being used in C<Last-Modified> header). The parameter C<sec> is the time stamp in seconds (like those returned from L<ngx.time>).[m
[31m-[m
[31m-[m
[31m-     ngx.say(ngx.http_time(1290079655))[m
[31m-         -- yields "Thu, 18 Nov 2010 11:27:35 GMT"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.parse_http_time[m
[31m-[m
[31m-B<syntax:> I<sec = ngx.parse_http_time(str)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Parse the http time string (as returned by L<ngx.http_time>) into seconds. Returns the seconds or C<nil> if the input string is in bad forms.[m
[31m-[m
[31m-[m
[31m-     local time = ngx.parse_http_time("Thu, 18 Nov 2010 11:27:35 GMT")[m
[31m-     if time == nil then[m
[31m-         ...[m
[31m-     end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.is_subrequest[m
[31m-[m
[31m-B<syntax:> I<value = ngx.is_subrequest>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>>[m
[31m-[m
[31m-Returns C<true> if the current request is an nginx subrequest, or C<false> otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.re.match[m
[31m-[m
[31m-B<syntax:> I<captures, err = ngx.re.match(subject, regex, options?, ctx?, res_table?)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Matches the C<subject> string using the Perl compatible regular expression C<regex> with the optional C<options>.[m
[31m-[m
[31m-Only the first occurrence of the match is returned, or C<nil> if no match is found. In case of errors, like seeing a bad regular expression or exceeding the PCRE stack limit, C<nil> and a string describing the error will be returned.[m
[31m-[m
[31m-When a match is found, a Lua table C<captures> is returned, where C<captures[0]> holds the whole substring being matched, and C<captures[1]> holds the first parenthesized sub-pattern's capturing, C<captures[2]> the second, and so on.[m
[31m-[m
[31m-[m
[31m-     local m, err = ngx.re.match("hello, 1234", "[0-9]+")[m
[31m-     if m then[m
[31m-         -- m[0] == "1234"[m
[31m-    [m
[31m-     else[m
[31m-         if err then[m
[31m-             ngx.log(ngx.ERR, "error: ", err)[m
[31m-             return[m
[31m-         end[m
[31m-    [m
[31m-         ngx.say("match not found")[m
[31m-     end[m
[31m-[m
[31m-[m
[31m-     local m, err = ngx.re.match("hello, 1234", "([0-9])[0-9]+")[m
[31m-     -- m[0] == "1234"[m
[31m-     -- m[1] == "1"[m
[31m-[m
[31m-Named captures are also supported since the C<v0.7.14> release[m
[31m-and are returned in the same Lua table as key-value pairs as the numbered captures.[m
[31m-[m
[31m-[m
[31m-     local m, err = ngx.re.match("hello, 1234", "([0-9])(?<remaining>[0-9]+)")[m
[31m-     -- m[0] == "1234"[m
[31m-     -- m[1] == "1"[m
[31m-     -- m[2] == "234"[m
[31m-     -- m["remaining"] == "234"[m
[31m-[m
[31m-Unmatched subpatterns will have C<false> values in their C<captures> table fields.[m
[31m-[m
[31m-[m
[31m-     local m, err = ngx.re.match("hello, world", "(world)|(hello)|(?<named>howdy)")[m
[31m-     -- m[0] == "hello"[m
[31m-     -- m[1] == false[m
[31m-     -- m[2] == "hello"[m
[31m-     -- m[3] == false[m
[31m-     -- m["named"] == false[m
[31m-[m
[31m-Specify C<options> to control how the match operation will be performed. The following option characters are supported:[m
[31m-[m
[31m-    a             anchored mode (only match from the beginning)[m
[31m-[m
[31m-    d             enable the DFA mode (or the longest token match semantics).[m
[31m-                  this requires PCRE 6.0+ or else a Lua exception will be thrown.[m
[31m-                  first introduced in ngx_lua v0.3.1rc30.[m
[31m-[m
[31m-    D             enable duplicate named pattern support. This allows named[m
[31m-                  subpattern names to be repeated, returning the captures in[m
[31m-                  an array-like Lua table. for example,[m
[31m-                    local m = ngx.re.match("hello, world",[m
[31m-                                           "(?<named>\w+), (?<named>\w+)",[m
[31m-                                           "D")[m
[31m-                    -- m["named"] == {"hello", "world"}[m
[31m-                  this option was first introduced in the v0.7.14 release.[m
[31m-                  this option requires at least PCRE 8.12.[m
[31m-[m
[31m-    i             case insensitive mode (similar to Perl's /i modifier)[m
[31m-[m
[31m-    j             enable PCRE JIT compilation, this requires PCRE 8.21+ which[m
[31m-                  must be built with the --enable-jit option. for optimum performance,[m
[31m-                  this option should always be used together with the 'o' option.[m
[31m-                  first introduced in ngx_lua v0.3.1rc30.[m
[31m-[m
[31m-    J             enable the PCRE Javascript compatible mode. this option was[m
[31m-                  first introduced in the v0.7.14 release. this option requires[m
[31m-                  at least PCRE 8.12.[m
[31m-[m
[31m-    m             multi-line mode (similar to Perl's /m modifier)[m
[31m-[m
[31m-    o             compile-once mode (similar to Perl's /o modifier),[m
[31m-                  to enable the worker-process-level compiled-regex cache[m
[31m-[m
[31m-    s             single-line mode (similar to Perl's /s modifier)[m
[31m-[m
[31m-    u             UTF-8 mode. this requires PCRE to be built with[m
[31m-                  the --enable-utf8 option or else a Lua exception will be thrown.[m
[31m-[m
[31m-    U             similar to "u" but disables PCRE's UTF-8 validity check on[m
[31m-                  the subject string. first introduced in ngx_lua v0.8.1.[m
[31m-[m
[31m-    x             extended mode (similar to Perl's /x modifier)[m
[31m-[m
[31m-These options can be combined:[m
[31m-[m
[31m-[m
[31m-     local m, err = ngx.re.match("hello, world", "HEL LO", "ix")[m
[31m-     -- m[0] == "hello"[m
[31m-[m
[31m-[m
[31m-     local m, err = ngx.re.match("hello, 美好生活", "HELLO, (.{2})", "iu")[m
[31m-     -- m[0] == "hello, 美好"[m
[31m-     -- m[1] == "美好"[m
[31m-[m
[31m-The C<o> option is useful for performance tuning, because the regex pattern in question will only be compiled once, cached in the worker-process level, and shared among all requests in the current Nginx worker process. The upper limit of the regex cache can be tuned via the L<lua_regex_cache_max_entries> directive.[m
[31m-[m
[31m-The optional fourth argument, C<ctx>, can be a Lua table holding an optional C<pos> field. When the C<pos> field in the C<ctx> table argument is specified, C<ngx.re.match> will start matching from that offset (starting from 1). Regardless of the presence of the C<pos> field in the C<ctx> table, C<ngx.re.match> will always set this C<pos> field to the position I<after> the substring matched by the whole pattern in case of a successful match. When match fails, the C<ctx> table will be left intact.[m
[31m-[m
[31m-[m
[31m-     local ctx = {}[m
[31m-     local m, err = ngx.re.match("1234, hello", "[0-9]+", "", ctx)[m
[31m-          -- m[0] = "1234"[m
[31m-          -- ctx.pos == 5[m
[31m-[m
[31m-[m
[31m-     local ctx = { pos = 2 }[m
[31m-     local m, err = ngx.re.match("1234, hello", "[0-9]+", "", ctx)[m
[31m-          -- m[0] = "34"[m
[31m-          -- ctx.pos == 5[m
[31m-[m
[31m-The C<ctx> table argument combined with the C<a> regex modifier can be used to construct a lexer atop C<ngx.re.match>.[m
[31m-[m
[31m-Note that, the C<options> argument is not optional when the C<ctx> argument is specified and that the empty Lua string (C<"">) must be used as placeholder for C<options> if no meaningful regex options are required.[m
[31m-[m
[31m-This method requires the PCRE library enabled in Nginx.  (L<Known Issue With Special Escaping Sequences>).[m
[31m-[m
[31m-To confirm that PCRE JIT is enabled, activate the Nginx debug log by adding the C<--with-debug> option to Nginx or OpenResty's C<./configure> script. Then, enable the "debug" error log level in C<error_log> directive. The following message will be generated if PCRE JIT is enabled:[m
[31m-[m
[31m-    pcre JIT compiling result: 1[m
[31m-[m
[31m-Starting from the C<0.9.4> release, this function also accepts a 5th argument, C<res_table>, for letting the caller supply the Lua table used to hold all the capturing results. Starting from C<0.9.6>, it is the caller's responsibility to ensure this table is empty. This is very useful for recycling Lua tables and saving GC and table allocation overhead.[m
[31m-[m
[31m-This feature was introduced in the C<v0.2.1rc11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.re.find[m
[31m-[m
[31m-B<syntax:> I<from, to, err = ngx.re.find(subject, regex, options?, ctx?, nth?)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Similar to L<ngx.re.match> but only returns the begining index (C<from>) and end index (C<to>) of the matched substring. The returned indexes are 1-based and can be fed directly into the L<string.sub|http://www.lua.org/manual/5.1/manual.html#pdf-string.sub> API function to obtain the matched substring.[m
[31m-[m
[31m-In case of errors (like bad regexes or any PCRE runtime errors), this API function returns two C<nil> values followed by a string describing the error.[m
[31m-[m
[31m-If no match is found, this function just returns a C<nil> value.[m
[31m-[m
[31m-Below is an example:[m
[31m-[m
[31m-[m
[31m-     local s = "hello, 1234"[m
[31m-     local from, to, err = ngx.re.find(s, "([0-9]+)", "jo")[m
[31m-     if from then[m
[31m-         ngx.say("from: ", from)[m
[31m-         ngx.say("to: ", to)[m
[31m-         ngx.say("matched: ", string.sub(s, from, to))[m
[31m-     else[m
[31m-         if err then[m
[31m-             ngx.say("error: ", err)[m
[31m-             return[m
[31m-         end[m
[31m-         ngx.say("not matched!")[m
[31m-     end[m
[31m-[m
[31m-This example produces the output[m
[31m-[m
[31m-    from: 8[m
[31m-    to: 11[m
[31m-    matched: 1234[m
[31m-[m
[31m-Because this API function does not create new Lua strings nor new Lua tables, it is much faster than L<ngx.re.match>. It should be used wherever possible.[m
[31m-[m
[31m-Since the C<0.9.3> release, an optional 5th argument, C<nth>, is supported to specify which (submatch) capture's indexes to return. When C<nth> is 0 (which is the default), the indexes for the whole matched substring is returned; when C<nth> is 1, then the 1st submatch capture's indexes are returned; when C<nth> is 2, then the 2nd submatch capture is returned, and so on. When the specified submatch does not have a match, then two C<nil> values will be returned. Below is an example for this:[m
[31m-[m
[31m-[m
[31m-     local str = "hello, 1234"[m
[31m-     local from, to = ngx.re.find(str, "([0-9])([0-9]+)", "jo", nil, 2)[m
[31m-     if from then[m
[31m-         ngx.say("matched 2nd submatch: ", string.sub(str, from, to))  -- yields "234"[m
[31m-     end[m
[31m-[m
[31m-This API function was first introduced in the C<v0.9.2> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.re.gmatch[m
[31m-[m
[31m-B<syntax:> I<iterator, err = ngx.re.gmatch(subject, regex, options?)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Similar to L<ngx.re.match>, but returns a Lua iterator instead, so as to let the user programmer iterate all the matches over the C<< <subject> >> string argument with the PCRE C<regex>.[m
[31m-[m
[31m-In case of errors, like seeing an ill-formed regular expression, C<nil> and a string describing the error will be returned.[m
[31m-[m
[31m-Here is a small example to demonstrate its basic usage:[m
[31m-[m
[31m-[m
[31m-     local iterator, err = ngx.re.gmatch("hello, world!", "([a-z]+)", "i")[m
[31m-     if not iterator then[m
[31m-         ngx.log(ngx.ERR, "error: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-    [m
[31m-     local m[m
[31m-     m, err = iterator()    -- m[0] == m[1] == "hello"[m
[31m-     if err then[m
[31m-         ngx.log(ngx.ERR, "error: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-    [m
[31m-     m, err = iterator()    -- m[0] == m[1] == "world"[m
[31m-     if err then[m
[31m-         ngx.log(ngx.ERR, "error: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-    [m
[31m-     m, err = iterator()    -- m == nil[m
[31m-     if err then[m
[31m-         ngx.log(ngx.ERR, "error: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-[m
[31m-More often we just put it into a Lua loop:[m
[31m-[m
[31m-[m
[31m-     local it, err = ngx.re.gmatch("hello, world!", "([a-z]+)", "i")[m
[31m-     if not it then[m
[31m-         ngx.log(ngx.ERR, "error: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-    [m
[31m-     while true do[m
[31m-         local m, err = it()[m
[31m-         if err then[m
[31m-             ngx.log(ngx.ERR, "error: ", err)[m
[31m-             return[m
[31m-         end[m
[31m-    [m
[31m-         if not m then[m
[31m-             -- no match found (any more)[m
[31m-             break[m
[31m-         end[m
[31m-    [m
[31m-         -- found a match[m
[31m-         ngx.say(m[0])[m
[31m-         ngx.say(m[1])[m
[31m-     end[m
[31m-[m
[31m-The optional C<options> argument takes exactly the same semantics as the L<ngx.re.match> method.[m
[31m-[m
[31m-The current implementation requires that the iterator returned should only be used in a single request. That is, one should I<not> assign it to a variable belonging to persistent namespace like a Lua package.[m
[31m-[m
[31m-This method requires the PCRE library enabled in Nginx.  (L<Known Issue With Special Escaping Sequences>).[m
[31m-[m
[31m-This feature was first introduced in the C<v0.2.1rc12> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.re.sub[m
[31m-[m
[31m-B<syntax:> I<newstr, n, err = ngx.re.sub(subject, regex, replace, options?)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Substitutes the first match of the Perl compatible regular expression C<regex> on the C<subject> argument string with the string or function argument C<replace>. The optional C<options> argument has exactly the same meaning as in L<ngx.re.match>.[m
[31m-[m
[31m-This method returns the resulting new string as well as the number of successful substitutions. In case of failures, like syntax errors in the regular expressions or the C<< <replace> >> string argument, it will return C<nil> and a string describing the error.[m
[31m-[m
[31m-When the C<replace> is a string, then it is treated as a special template for string replacement. For example,[m
[31m-[m
[31m-[m
[31m-     local newstr, n, err = ngx.re.sub("hello, 1234", "([0-9])[0-9]", "[$0][$1]")[m
[31m-     if newstr then[m
[31m-         -- newstr == "hello, [12][1]34"[m
[31m-         -- n == 1[m
[31m-     else[m
[31m-         ngx.log(ngx.ERR, "error: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-[m
[31m-where C<$0> referring to the whole substring matched by the pattern and C<$1> referring to the first parenthesized capturing substring.[m
[31m-[m
[31m-Curly braces can also be used to disambiguate variable names from the background string literals: [m
[31m-[m
[31m-[m
[31m-     local newstr, n, err = ngx.re.sub("hello, 1234", "[0-9]", "${0}00")[m
[31m-         -- newstr == "hello, 100234"[m
[31m-         -- n == 1[m
[31m-[m
[31m-Literal dollar sign characters (C<$>) in the C<replace> string argument can be escaped by another dollar sign, for instance,[m
[31m-[m
[31m-[m
[31m-     local newstr, n, err = ngx.re.sub("hello, 1234", "[0-9]", "$$")[m
[31m-         -- newstr == "hello, $234"[m
[31m-         -- n == 1[m
[31m-[m
[31m-Do not use backlashes to escape dollar signs; it will not work as expected.[m
[31m-[m
[31m-When the C<replace> argument is of type "function", then it will be invoked with the "match table" as the argument to generate the replace string literal for substitution. The "match table" fed into the C<replace> function is exactly the same as the return value of L<ngx.re.match>. Here is an example:[m
[31m-[m
[31m-[m
[31m-     local func = function (m)[m
[31m-         return "[" .. m[0] .. "][" .. m[1] .. "]"[m
[31m-     end[m
[31m-     local newstr, n, err = ngx.re.sub("hello, 1234", "( [0-9] ) [0-9]", func, "x")[m
[31m-         -- newstr == "hello, [12][1]34"[m
[31m-         -- n == 1[m
[31m-[m
[31m-The dollar sign characters in the return value of the C<replace> function argument are not special at all.[m
[31m-[m
[31m-This method requires the PCRE library enabled in Nginx.  (L<Known Issue With Special Escaping Sequences>).[m
[31m-[m
[31m-This feature was first introduced in the C<v0.2.1rc13> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.re.gsub[m
[31m-[m
[31m-B<syntax:> I<newstr, n, err = ngx.re.gsub(subject, regex, replace, options?)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Just like L<ngx.re.sub>, but does global substitution.[m
[31m-[m
[31m-Here is some examples:[m
[31m-[m
[31m-[m
[31m-     local newstr, n, err = ngx.re.gsub("hello, world", "([a-z])[a-z]+", "[$0,$1]", "i")[m
[31m-     if newstr then[m
[31m-         -- newstr == "[hello,h], [world,w]"[m
[31m-         -- n == 2[m
[31m-     else[m
[31m-         ngx.log(ngx.ERR, "error: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-[m
[31m-[m
[31m-     local func = function (m)[m
[31m-         return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-     end[m
[31m-     local newstr, n, err = ngx.re.gsub("hello, world", "([a-z])[a-z]+", func, "i")[m
[31m-         -- newstr == "[hello,h], [world,w]"[m
[31m-         -- n == 2[m
[31m-[m
[31m-This method requires the PCRE library enabled in Nginx.  (L<Known Issue With Special Escaping Sequences>).[m
[31m-[m
[31m-This feature was first introduced in the C<v0.2.1rc15> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT[m
[31m-[m
[31m-B<syntax:> I<dict = ngx.shared.DICT>[m
[31m-[m
[31m-B<syntax:> I<dict = ngx.shared[name_var]>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Fetching the shm-based Lua dictionary object for the shared memory zone named C<DICT> defined by the L<lua_shared_dict> directive.[m
[31m-[m
[31m-Shared memory zones are always shared by all the nginx worker processes in the current nginx server instance.[m
[31m-[m
[31m-The resulting object C<dict> has the following methods:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<get>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<get_stale>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<safe_set>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<add>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<safe_add>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<replace>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<delete>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<incr>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<flush_all>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<flush_expired>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<get_keys>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Here is an example:[m
[31m-[m
[31m-[m
[31m-     http {[m
[31m-         lua_shared_dict dogs 10m;[m
[31m-         server {[m
[31m-             location /set {[m
[31m-                 content_by_lua '[m
[31m-                     local dogs = ngx.shared.dogs[m
[31m-                     dogs:set("Jim", 8)[m
[31m-                     ngx.say("STORED")[m
[31m-                 ';[m
[31m-             }[m
[31m-             location /get {[m
[31m-                 content_by_lua '[m
[31m-                     local dogs = ngx.shared.dogs[m
[31m-                     ngx.say(dogs:get("Jim"))[m
[31m-                 ';[m
[31m-             }[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-Let us test it:[m
[31m-[m
[31m-[m
[31m-     $ curl localhost/set[m
[31m-     STORED[m
[31m-    [m
[31m-     $ curl localhost/get[m
[31m-     8[m
[31m-    [m
[31m-     $ curl localhost/get[m
[31m-     8[m
[31m-[m
[31m-The number C<8> will be consistently output when accessing C</get> regardless of how many Nginx workers there are because the C<dogs> dictionary resides in the shared memory and visible to I<all> of the worker processes.[m
[31m-[m
[31m-The shared dictionary will retain its contents through a server config reload (either by sending the C<HUP> signal to the Nginx process or by using the C<-s reload> command-line option).[m
[31m-[m
[31m-The contents in the dictionary storage will be lost, however, when the Nginx server quits.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.get[m
[31m-[m
[31m-B<syntax:> I<value, flags = ngx.shared.DICT:get(key)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Retrieving the value in the dictionary L<ngx.shared.DICT> for the key C<key>. If the key does not exist or has been expired, then C<nil> will be returned.[m
[31m-[m
[31m-In case of errors, C<nil> and a string describing the error will be returned.[m
[31m-[m
[31m-The value returned will have the original data type when they were inserted into the dictionary, for example, Lua booleans, numbers, or strings.[m
[31m-[m
[31m-The first argument to this method must be the dictionary object itself, for example,[m
[31m-[m
[31m-[m
[31m-     local cats = ngx.shared.cats[m
[31m-     local value, flags = cats.get(cats, "Marry")[m
[31m-[m
[31m-or use Lua's syntactic sugar for method calls:[m
[31m-[m
[31m-[m
[31m-     local cats = ngx.shared.cats[m
[31m-     local value, flags = cats:get("Marry")[m
[31m-[m
[31m-These two forms are fundamentally equivalent.[m
[31m-[m
[31m-If the user flags is C<0> (the default), then no flags value will be returned.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.get_stale[m
[31m-[m
[31m-B<syntax:> I<value, flags, stale = ngx.shared.DICT:get_stale(key)>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Similar to the L<get> method but returns the value even if the key has already expired.[m
[31m-[m
[31m-Returns a 3rd value, C<stale>, indicating whether the key has expired or not.[m
[31m-[m
[31m-Note that the value of an expired key is not guaranteed to be available so one should never rely on the availability of expired items.[m
[31m-[m
[31m-This method was first introduced in the C<0.8.6> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.set[m
[31m-[m
[31m-B<syntax:> I<success, err, forcible = ngx.shared.DICT:set(key, value, exptime?, flags?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Unconditionally sets a key-value pair into the shm-based dictionary L<ngx.shared.DICT>. Returns three values:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<success>: boolean value to indicate whether the key-value pair is stored or not.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<err>: textual error message, can be C<"no memory">.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<forcible>: a boolean value to indicate whether other valid items have been removed forcibly when out of storage in the shared memory zone.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The C<value> argument inserted can be Lua booleans, numbers, strings, or C<nil>. Their value type will also be stored into the dictionary and the same data type can be retrieved later via the L<get> method.[m
[31m-[m
[31m-The optional C<exptime> argument specifies expiration time (in seconds) for the inserted key-value pair. The time resolution is C<0.001> seconds. If the C<exptime> takes the value C<0> (which is the default), then the item will never expire.[m
[31m-[m
[31m-The optional C<flags> argument specifies a user flags value associated with the entry to be stored. It can also be retrieved later with the value. The user flags is stored as an unsigned 32-bit integer internally. Defaults to C<0>. The user flags argument was first introduced in the C<v0.5.0rc2> release.[m
[31m-[m
[31m-When it fails to allocate memory for the current key-value item, then C<set> will try removing existing items in the storage according to the Least-Recently Used (LRU) algorithm. Note that, LRU takes priority over expiration time here. If up to tens of existing items have been removed and the storage left is still insufficient (either due to the total capacity limit specified by L<lua_shared_dict> or memory segmentation), then the C<err> return value will be C<no memory> and C<success> will be C<false>.[m
[31m-[m
[31m-If this method succeeds in storing the current item by forcibly removing other not-yet-expired items in the dictionary via LRU, the C<forcible> return value will be C<true>. If it stores the item without forcibly removing other valid items, then the return value C<forcible> will be C<false>.[m
[31m-[m
[31m-The first argument to this method must be the dictionary object itself, for example,[m
[31m-[m
[31m-[m
[31m-     local cats = ngx.shared.cats[m
[31m-     local succ, err, forcible = cats.set(cats, "Marry", "it is a nice cat!")[m
[31m-[m
[31m-or use Lua's syntactic sugar for method calls:[m
[31m-[m
[31m-[m
[31m-     local cats = ngx.shared.cats[m
[31m-     local succ, err, forcible = cats:set("Marry", "it is a nice cat!")[m
[31m-[m
[31m-These two forms are fundamentally equivalent.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-Please note that while internally the key-value pair is set atomically, the atomicity does not go across the method call boundary.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.safe_set[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.shared.DICT:safe_set(key, value, exptime?, flags?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Similar to the L<set> method, but never overrides the (least recently used) unexpired items in the store when running out of storage in the shared memory zone. In this case, it will immediately return C<nil> and the string "no memory".[m
[31m-[m
[31m-This feature was first introduced in the C<v0.7.18> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.add[m
[31m-[m
[31m-B<syntax:> I<success, err, forcible = ngx.shared.DICT:add(key, value, exptime?, flags?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Just like the L<set> method, but only stores the key-value pair into the dictionary L<ngx.shared.DICT> if the key does I<not> exist.[m
[31m-[m
[31m-If the C<key> argument already exists in the dictionary (and not expired for sure), the C<success> return value will be C<false> and the C<err> return value will be C<"exists">.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.safe_add[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.shared.DICT:safe_add(key, value, exptime?, flags?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Similar to the L<add> method, but never overrides the (least recently used) unexpired items in the store when running out of storage in the shared memory zone. In this case, it will immediately return C<nil> and the string "no memory".[m
[31m-[m
[31m-This feature was first introduced in the C<v0.7.18> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.replace[m
[31m-[m
[31m-B<syntax:> I<success, err, forcible = ngx.shared.DICT:replace(key, value, exptime?, flags?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Just like the L<set> method, but only stores the key-value pair into the dictionary L<ngx.shared.DICT> if the key I<does> exist.[m
[31m-[m
[31m-If the C<key> argument does I<not> exist in the dictionary (or expired already), the C<success> return value will be C<false> and the C<err> return value will be C<"not found">.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.delete[m
[31m-[m
[31m-B<syntax:> I<ngx.shared.DICT:delete(key)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Unconditionally removes the key-value pair from the shm-based dictionary L<ngx.shared.DICT>.[m
[31m-[m
[31m-It is equivalent to C<ngx.shared.DICT:set(key, nil)>.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.incr[m
[31m-[m
[31m-B<syntax:> I<newval, err = ngx.shared.DICT:incr(key, value)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Increments the (numerical) value for C<key> in the shm-based dictionary L<ngx.shared.DICT> by the step value C<value>. Returns the new resulting number if the operation is successfully completed or C<nil> and an error message otherwise.[m
[31m-[m
[31m-The key must already exist in the dictionary, otherwise it will return C<nil> and C<"not found">.[m
[31m-[m
[31m-If the original value is not a valid Lua number in the dictionary, it will return C<nil> and C<"not a number">.[m
[31m-[m
[31m-The C<value> argument can be any valid Lua numbers, like negative numbers or floating-point numbers.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.flush_all[m
[31m-[m
[31m-B<syntax:> I<ngx.shared.DICT:flush_all()>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Flushes out all the items in the dictionary. This method does not actuall free up all the memory blocks in the dictionary but just marks all the existing items as expired.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc17> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT.flush_expired> and L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.flush_expired[m
[31m-[m
[31m-B<syntax:> I<flushed = ngx.shared.DICT:flush_expired(max_count?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Flushes out the expired items in the dictionary, up to the maximal number specified by the optional C<max_count> argument. When the C<max_count> argument is given C<0> or not given at all, then it means unlimited. Returns the number of items that have actually been flushed.[m
[31m-[m
[31m-Unlike the L<flush_all> method, this method actually free up the memory used by the expired items.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.6.3> release.[m
[31m-[m
[31m-See also L<ngx.shared.DICT.flush_all> and L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.shared.DICT.get_keys[m
[31m-[m
[31m-B<syntax:> I<keys = ngx.shared.DICT:get_keys(max_count?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Fetch a list of the keys from the dictionary, up to C<< <max_count> >>.[m
[31m-[m
[31m-By default, only the first 1024 keys (if any) are returned. When the C<< <max_count> >> argument is given the value C<0>, then all the keys will be returned even there is more than 1024 keys in the dictionary.[m
[31m-[m
[31m-B<WARNING> Be careful when calling this method on dictionaries with a really huge number of keys. This method may lock the dictionary for quite a while and block all the nginx worker processes that are trying to access the dictionary.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.7.3> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.socket.udp[m
[31m-[m
[31m-B<syntax:> I<udpsock = ngx.socket.udp()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Creates and returns a UDP or datagram-oriented unix domain socket object (also known as one type of the "cosocket" objects). The following methods are supported on this object:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<setpeername>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<send>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<receive>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<close>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<settimeout>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-It is intended to be compatible with the UDP API of the L<LuaSocket|http://w3.impa.br/~diego/software/luasocket/udp.html> library but is 100% nonblocking out of the box.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.7> release.[m
[31m-[m
[31m-See also L<ngx.socket.tcp>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 udpsock:setpeername[m
[31m-[m
[31m-B<syntax:> I<ok, err = udpsock:setpeername(host, port)>[m
[31m-[m
[31m-B<syntax:> I<ok, err = udpsock:setpeername("unix:/path/to/unix-domain.socket")>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Attempts to connect a UDP socket object to a remote server or to a datagram unix domain socket file. Because the datagram protocol is actually connection-less, this method does not really establish a "connection", but only just set the name of the remote peer for subsequent read/write operations.[m
[31m-[m
[31m-Both IP addresses and domain names can be specified as the C<host> argument. In case of domain names, this method will use Nginx core's dynamic resolver to parse the domain name without blocking and it is required to configure the L<resolver|http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver> directive in the C<nginx.conf> file like this:[m
[31m-[m
[31m-[m
[31m-     resolver 8.8.8.8;  # use Google's public DNS nameserver[m
[31m-[m
[31m-If the nameserver returns multiple IP addresses for the host name, this method will pick up one randomly.[m
[31m-[m
[31m-In case of error, the method returns C<nil> followed by a string describing the error. In case of success, the method returns C<1>.[m
[31m-[m
[31m-Here is an example for connecting to a UDP (memcached) server:[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         resolver 8.8.8.8;[m
[31m-    [m
[31m-         content_by_lua '[m
[31m-             local sock = ngx.socket.udp()[m
[31m-             local ok, err = sock:setpeername("my.memcached.server.domain", 11211)[m
[31m-             if not ok then[m
[31m-                 ngx.say("failed to connect to memcached: ", err)[m
[31m-                 return[m
[31m-             end[m
[31m-             ngx.say("successfully connected to memcached!")[m
[31m-             sock:close()[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Since the C<v0.7.18> release, connecting to a datagram unix domain socket file is also possible on Linux:[m
[31m-[m
[31m-[m
[31m-     local sock = ngx.socket.udp()[m
[31m-     local ok, err = sock:setpeername("unix:/tmp/some-datagram-service.sock")[m
[31m-     if not ok then[m
[31m-         ngx.say("failed to connect to the datagram unix domain socket: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-[m
[31m-assuming the datagram service is listening on the unix domain socket file C</tmp/some-datagram-service.sock> and the client socket will use the "autobind" feature on Linux.[m
[31m-[m
[31m-Calling this method on an already connected socket object will cause the original connection to be closed first.[m
[31m-[m
[31m-This method was first introduced in the C<v0.5.7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 udpsock:send[m
[31m-[m
[31m-B<syntax:> I<ok, err = udpsock:send(data)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sends data on the current UDP or datagram unix domain socket object.[m
[31m-[m
[31m-In case of success, it returns C<1>. Otherwise, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The input argument C<data> can either be a Lua string or a (nested) Lua table holding string fragments. In case of table arguments, this method will copy all the string elements piece by piece to the underlying Nginx socket send buffers, which is usually optimal than doing string concatenation operations on the Lua land.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 udpsock:receive[m
[31m-[m
[31m-B<syntax:> I<data, err = udpsock:receive(size?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Receives data from the UDP or datagram unix domain socket object with an optional receive buffer size argument, C<size>.[m
[31m-[m
[31m-This method is a synchronous operation and is 100% nonblocking.[m
[31m-[m
[31m-In case of success, it returns the data received; in case of error, it returns C<nil> with a string describing the error.[m
[31m-[m
[31m-If the C<size> argument is specified, then this method will use this size as the receive buffer size. But when this size is greater than C<8192>, then C<8192> will be used instead.[m
[31m-[m
[31m-If no argument is specified, then the maximal buffer size, C<8192> is assumed.[m
[31m-[m
[31m-Timeout for the reading operation is controlled by the L<lua_socket_read_timeout> config directive and the L<settimeout> method. And the latter takes priority. For example:[m
[31m-[m
[31m-[m
[31m-     sock:settimeout(1000)  -- one second timeout[m
[31m-     local data, err = sock:receive()[m
[31m-     if not data then[m
[31m-         ngx.say("failed to read a packet: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-     ngx.say("successfully read a packet: ", data)[m
[31m-[m
[31m-It is important here to call the L<settimeout> method I<before> calling this method.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 udpsock:close[m
[31m-[m
[31m-B<syntax:> I<ok, err = udpsock:close()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Closes the current UDP or datagram unix domain socket. It returns the C<1> in case of success and returns C<nil> with a string describing the error otherwise.[m
[31m-[m
[31m-Socket objects that have not invoked this method (and associated connections) will be closed when the socket object is released by the Lua GC (Garbage Collector) or the current client HTTP request finishes processing.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 udpsock:settimeout[m
[31m-[m
[31m-B<syntax:> I<udpsock:settimeout(time)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Set the timeout value in milliseconds for subsequent socket operations (like L<receive>).[m
[31m-[m
[31m-Settings done by this method takes priority over those config directives, like L<lua_socket_read_timeout>.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.socket.stream[m
[31m-[m
[31m-Just an alias to L<ngx.socket.tcp>. If the stream-typed cosocket may also connect to a unix domain[m
[31m-socket, then this API name is preferred.[m
[31m-[m
[31m-This API function was first added to the C<v0.10.1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.socket.tcp[m
[31m-[m
[31m-B<syntax:> I<tcpsock = ngx.socket.tcp()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Creates and returns a TCP or stream-oriented unix domain socket object (also known as one type of the "cosocket" objects). The following methods are supported on this object:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<connect>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<sslhandshake>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<send>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<receive>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<close>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<settimeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<setoption>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<receiveuntil>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<setkeepalive>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<getreusedtimes>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-It is intended to be compatible with the TCP API of the L<LuaSocket|http://w3.impa.br/~diego/software/luasocket/tcp.html> library but is 100% nonblocking out of the box. Also, we introduce some new APIs to provide more functionalities.[m
[31m-[m
[31m-The cosocket object created by this API function has exactly the same lifetime as the Lua handler creating it. So never pass the cosocket object to any other Lua handler (including ngx.timer callback functions) and never share the cosocket object between different NGINX requests.[m
[31m-[m
[31m-For every cosocket object's underlying connection, if you do not[m
[31m-explicitly close it (via L<close>) or put it back to the connection[m
[31m-pool (via L<setkeepalive>), then it is automatically closed when one of[m
[31m-the following two events happens:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the current request handler completes, or[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the Lua cosocket object value gets collected by the Lua GC.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Fatal errors in cosocket operations always automatically close the current[m
[31m-connection (note that, read timeout error is the only error that is[m
[31m-not fatal), and if you call L<close> on a closed connection, you will get[m
[31m-the "closed" error.[m
[31m-[m
[31m-Starting from the C<0.9.9> release, the cosocket object here is full-duplex, that is, a reader "light thread" and a writer "light thread" can operate on a single cosocket object simultaneously (both "light threads" must belong to the same Lua handler though, see reasons above). But you cannot have two "light threads" both reading (or writing or connecting) the same cosocket, otherwise you might get an error like "socket busy reading" when calling the methods of the cosocket object.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-See also L<ngx.socket.udp>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:connect[m
[31m-[m
[31m-B<syntax:> I<ok, err = tcpsock:connect(host, port, options_table?)>[m
[31m-[m
[31m-B<syntax:> I<ok, err = tcpsock:connect("unix:/path/to/unix-domain.socket", options_table?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Attempts to connect a TCP socket object to a remote server or to a stream unix domain socket file without blocking.[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method (or the L<ngx.socket.connect> function).[m
[31m-[m
[31m-Both IP addresses and domain names can be specified as the C<host> argument. In case of domain names, this method will use Nginx core's dynamic resolver to parse the domain name without blocking and it is required to configure the L<resolver|http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver> directive in the C<nginx.conf> file like this:[m
[31m-[m
[31m-[m
[31m-     resolver 8.8.8.8;  # use Google's public DNS nameserver[m
[31m-[m
[31m-If the nameserver returns multiple IP addresses for the host name, this method will pick up one randomly.[m
[31m-[m
[31m-In case of error, the method returns C<nil> followed by a string describing the error. In case of success, the method returns C<1>.[m
[31m-[m
[31m-Here is an example for connecting to a TCP server:[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         resolver 8.8.8.8;[m
[31m-    [m
[31m-         content_by_lua '[m
[31m-             local sock = ngx.socket.tcp()[m
[31m-             local ok, err = sock:connect("www.google.com", 80)[m
[31m-             if not ok then[m
[31m-                 ngx.say("failed to connect to google: ", err)[m
[31m-                 return[m
[31m-             end[m
[31m-             ngx.say("successfully connected to google!")[m
[31m-             sock:close()[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Connecting to a Unix Domain Socket file is also possible:[m
[31m-[m
[31m-[m
[31m-     local sock = ngx.socket.tcp()[m
[31m-     local ok, err = sock:connect("unix:/tmp/memcached.sock")[m
[31m-     if not ok then[m
[31m-         ngx.say("failed to connect to the memcached unix domain socket: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-[m
[31m-assuming memcached (or something else) is listening on the unix domain socket file C</tmp/memcached.sock>.[m
[31m-[m
[31m-Timeout for the connecting operation is controlled by the L<lua_socket_connect_timeout> config directive and the L<settimeout> method. And the latter takes priority. For example:[m
[31m-[m
[31m-[m
[31m-     local sock = ngx.socket.tcp()[m
[31m-     sock:settimeout(1000)  -- one second timeout[m
[31m-     local ok, err = sock:connect(host, port)[m
[31m-[m
[31m-It is important here to call the L<settimeout> method I<before> calling this method.[m
[31m-[m
[31m-Calling this method on an already connected socket object will cause the original connection to be closed first.[m
[31m-[m
[31m-An optional Lua table can be specified as the last argument to this method to specify various connect options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pool>[m
[31m-specify a custom name for the connection pool being used. If omitted, then the connection pool name will be generated from the string template C<< "<host>:<port>" >> or C<< "<unix-socket-path>" >>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The support for the options table argument was first introduced in the C<v0.5.7> release.[m
[31m-[m
[31m-This method was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:sslhandshake[m
[31m-[m
[31m-B<syntax:> I<session, err = tcpsock:sslhandshake(reused_session?, server_name?, ssl_verify?, send_status_req?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Does SSL/TLS handshake on the currently established connection.[m
[31m-[m
[31m-The optional C<reused_session> argument can take a former SSL[m
[31m-session userdata returned by a previous C<sslhandshake>[m
[31m-call for exactly the same target. For short-lived connections, reusing SSL[m
[31m-sessions can usually speed up the handshake by one order by magnitude but it[m
[31m-is not so useful if the connection pool is enabled. This argument defaults to[m
[31m-C<nil>. If this argument takes the boolean C<false> value, no SSL session[m
[31m-userdata would return by this call and only a Lua boolean will be returned as[m
[31m-the first return value; otherwise the current SSL session will[m
[31m-always be returned as the first argument in case of successes.[m
[31m-[m
[31m-The optional C<server_name> argument is used to specify the server[m
[31m-name for the new TLS extension Server Name Indication (SNI). Use of SNI can[m
[31m-make different servers share the same IP address on the server side. Also,[m
[31m-when SSL verification is enabled, this C<server_name> argument is[m
[31m-also used to validate the server name specified in the server certificate sent from[m
[31m-the remote.[m
[31m-[m
[31m-The optional C<ssl_verify> argument takes a Lua boolean value to[m
[31m-control whether to perform SSL verification. When set to C<true>, the server[m
[31m-certificate will be verified according to the CA certificates specified by[m
[31m-the L<lua_ssl_trusted_certificate> directive.[m
[31m-You may also need to adjust the L<lua_ssl_verify_depth>[m
[31m-directive to control how deep we should follow along the certificate chain.[m
[31m-Also, when the C<ssl_verify> argument is true and the[m
[31m-C<server_name> argument is also specified, the latter will be used[m
[31m-to validate the server name in the server certificate.[m
[31m-[m
[31m-The optional C<send_status_req> argument takes a boolean that controls whether to send[m
[31m-the OCSP status request in the SSL handshake request (which is for requesting OCSP stapling).[m
[31m-[m
[31m-For connections that have already done SSL/TLS handshake, this method returns[m
[31m-immediately.[m
[31m-[m
[31m-This method was first introduced in the C<v0.9.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:send[m
[31m-[m
[31m-B<syntax:> I<bytes, err = tcpsock:send(data)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sends data without blocking on the current TCP or Unix Domain Socket connection.[m
[31m-[m
[31m-This method is a synchronous operation that will not return until I<all> the data has been flushed into the system socket send buffer or an error occurs.[m
[31m-[m
[31m-In case of success, it returns the total number of bytes that have been sent. Otherwise, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The input argument C<data> can either be a Lua string or a (nested) Lua table holding string fragments. In case of table arguments, this method will copy all the string elements piece by piece to the underlying Nginx socket send buffers, which is usually optimal than doing string concatenation operations on the Lua land.[m
[31m-[m
[31m-Timeout for the sending operation is controlled by the L<lua_socket_send_timeout> config directive and the L<settimeout> method. And the latter takes priority. For example:[m
[31m-[m
[31m-[m
[31m-     sock:settimeout(1000)  -- one second timeout[m
[31m-     local bytes, err = sock:send(request)[m
[31m-[m
[31m-It is important here to call the L<settimeout> method I<before> calling this method.[m
[31m-[m
[31m-In case of any connection errors, this method always automatically closes the current connection.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:receive[m
[31m-[m
[31m-B<syntax:> I<data, err, partial = tcpsock:receive(size)>[m
[31m-[m
[31m-B<syntax:> I<data, err, partial = tcpsock:receive(pattern?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Receives data from the connected socket according to the reading pattern or size.[m
[31m-[m
[31m-This method is a synchronous operation just like the L<send> method and is 100% nonblocking.[m
[31m-[m
[31m-In case of success, it returns the data received; in case of error, it returns C<nil> with a string describing the error and the partial data received so far.[m
[31m-[m
[31m-If a number-like argument is specified (including strings that look like numbers), then it is interpreted as a size. This method will not return until it reads exactly this size of data or an error occurs.[m
[31m-[m
[31m-If a non-number-like string argument is specified, then it is interpreted as a "pattern". The following patterns are supported:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<'*a'>: reads from the socket until the connection is closed. No end-of-line translation is performed;[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<'*l'>: reads a line of text from the socket. The line is terminated by a C<Line Feed> (LF) character (ASCII 10), optionally preceded by a C<Carriage Return> (CR) character (ASCII 13). The CR and LF characters are not included in the returned line. In fact, all CR characters are ignored by the pattern.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-If no argument is specified, then it is assumed to be the pattern C<'*l'>, that is, the line reading pattern.[m
[31m-[m
[31m-Timeout for the reading operation is controlled by the L<lua_socket_read_timeout> config directive and the L<settimeout> method. And the latter takes priority. For example:[m
[31m-[m
[31m-[m
[31m-     sock:settimeout(1000)  -- one second timeout[m
[31m-     local line, err, partial = sock:receive()[m
[31m-     if not line then[m
[31m-         ngx.say("failed to read a line: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-     ngx.say("successfully read a line: ", line)[m
[31m-[m
[31m-It is important here to call the L<settimeout> method I<before> calling this method.[m
[31m-[m
[31m-Since the C<v0.8.8> release, this method no longer automatically closes the current connection when the read timeout error happens. For other connection errors, this method always automatically closes the connection.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:receiveuntil[m
[31m-[m
[31m-B<syntax:> I<iterator = tcpsock:receiveuntil(pattern, options?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-This method returns an iterator Lua function that can be called to read the data stream until it sees the specified pattern or an error occurs.[m
[31m-[m
[31m-Here is an example for using this method to read a data stream with the boundary sequence C<--abcedhb>:[m
[31m-[m
[31m-[m
[31m-     local reader = sock:receiveuntil("\r\n--abcedhb")[m
[31m-     local data, err, partial = reader()[m
[31m-     if not data then[m
[31m-         ngx.say("failed to read the data stream: ", err)[m
[31m-     end[m
[31m-     ngx.say("read the data stream: ", data)[m
[31m-[m
[31m-When called without any argument, the iterator function returns the received data right I<before> the specified pattern string in the incoming data stream. So for the example above, if the incoming data stream is C<'hello, world! -agentzh\r\n--abcedhb blah blah'>, then the string C<'hello, world! -agentzh'> will be returned.[m
[31m-[m
[31m-In case of error, the iterator function will return C<nil> along with a string describing the error and the partial data bytes that have been read so far.[m
[31m-[m
[31m-The iterator function can be called multiple times and can be mixed safely with other cosocket method calls or other iterator function calls.[m
[31m-[m
[31m-The iterator function behaves differently (i.e., like a real iterator) when it is called with a C<size> argument. That is, it will read that C<size> of data on each invocation and will return C<nil> at the last invocation (either sees the boundary pattern or meets an error). For the last successful invocation of the iterator function, the C<err> return value will be C<nil> too. The iterator function will be reset after the last successful invocation that returns C<nil> data and C<nil> error. Consider the following example:[m
[31m-[m
[31m-[m
[31m-     local reader = sock:receiveuntil("\r\n--abcedhb")[m
[31m-    [m
[31m-     while true do[m
[31m-         local data, err, partial = reader(4)[m
[31m-         if not data then[m
[31m-             if err then[m
[31m-                 ngx.say("failed to read the data stream: ", err)[m
[31m-                 break[m
[31m-             end[m
[31m-    [m
[31m-             ngx.say("read done")[m
[31m-             break[m
[31m-         end[m
[31m-         ngx.say("read chunk: [", data, "]")[m
[31m-     end[m
[31m-[m
[31m-Then for the incoming data stream C<'hello, world! -agentzh\r\n--abcedhb blah blah'>, we shall get the following output from the sample code above:[m
[31m-[m
[31m-    read chunk: [hell][m
[31m-    read chunk: [o, w][m
[31m-    read chunk: [orld][m
[31m-    read chunk: [! -a][m
[31m-    read chunk: [gent][m
[31m-    read chunk: [zh][m
[31m-    read done[m
[31m-[m
[31m-Note that, the actual data returned I<might> be a little longer than the size limit specified by the C<size> argument when the boundary pattern has ambiguity for streaming parsing. Near the boundary of the data stream, the data string actually returned could also be shorter than the size limit.[m
[31m-[m
[31m-Timeout for the iterator function's reading operation is controlled by the L<lua_socket_read_timeout> config directive and the L<settimeout> method. And the latter takes priority. For example:[m
[31m-[m
[31m-[m
[31m-     local readline = sock:receiveuntil("\r\n")[m
[31m-    [m
[31m-     sock:settimeout(1000)  -- one second timeout[m
[31m-     line, err, partial = readline()[m
[31m-     if not line then[m
[31m-         ngx.say("failed to read a line: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-     ngx.say("successfully read a line: ", line)[m
[31m-[m
[31m-It is important here to call the L<settimeout> method I<before> calling the iterator function (note that the C<receiveuntil> call is irrelevant here).[m
[31m-[m
[31m-As from the C<v0.5.1> release, this method also takes an optional C<options> table argument to control the behavior. The following options are supported:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<inclusive>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The C<inclusive> takes a boolean value to control whether to include the pattern string in the returned data string. Default to C<false>. For example,[m
[31m-[m
[31m-[m
[31m-     local reader = tcpsock:receiveuntil("_END_", { inclusive = true })[m
[31m-     local data = reader()[m
[31m-     ngx.say(data)[m
[31m-[m
[31m-Then for the input data stream C<"hello world _END_ blah blah blah">, then the example above will output C<hello world _END_>, including the pattern string C<_END_> itself.[m
[31m-[m
[31m-Since the C<v0.8.8> release, this method no longer automatically closes the current connection when the read timeout error happens. For other connection errors, this method always automatically closes the connection.[m
[31m-[m
[31m-This method was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:close[m
[31m-[m
[31m-B<syntax:> I<ok, err = tcpsock:close()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Closes the current TCP or stream unix domain socket. It returns the C<1> in case of success and returns C<nil> with a string describing the error otherwise.[m
[31m-[m
[31m-Note that there is no need to call this method on socket objects that have invoked the L<setkeepalive> method because the socket object is already closed (and the current connection is saved into the built-in connection pool).[m
[31m-[m
[31m-Socket objects that have not invoked this method (and associated connections) will be closed when the socket object is released by the Lua GC (Garbage Collector) or the current client HTTP request finishes processing.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:settimeout[m
[31m-[m
[31m-B<syntax:> I<tcpsock:settimeout(time)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Set the timeout value in milliseconds for subsequent socket operations (L<connect>, L<receive>, and iterators returned from L<receiveuntil>).[m
[31m-[m
[31m-Settings done by this method takes priority over those config directives, i.e., L<lua_socket_connect_timeout>, L<lua_socket_send_timeout>, and L<lua_socket_read_timeout>.[m
[31m-[m
[31m-Note that this method does I<not> affect the L<lua_socket_keepalive_timeout> setting; the C<timeout> argument to the L<setkeepalive> method should be used for this purpose instead.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:setoption[m
[31m-[m
[31m-B<syntax:> I<tcpsock:setoption(option, value?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-This function is added for L<LuaSocket|http://w3.impa.br/~diego/software/luasocket/tcp.html> API compatibility and does nothing for now. Its functionality will be implemented in future.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:setkeepalive[m
[31m-[m
[31m-B<syntax:> I<ok, err = tcpsock:setkeepalive(timeout?, size?)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Puts the current socket's connection immediately into the cosocket built-in connection pool and keep it alive until other L<connect> method calls request it or the associated maximal idle timeout is expired.[m
[31m-[m
[31m-The first optional argument, C<timeout>, can be used to specify the maximal idle timeout (in milliseconds) for the current connection. If omitted, the default setting in the L<lua_socket_keepalive_timeout> config directive will be used. If the C<0> value is given, then the timeout interval is unlimited.[m
[31m-[m
[31m-The second optional argument, C<size>, can be used to specify the maximal number of connections allowed in the connection pool for the current server (i.e., the current host-port pair or the unix domain socket file path). Note that the size of the connection pool cannot be changed once the pool is created. When this argument is omitted, the default setting in the L<lua_socket_pool_size> config directive will be used.[m
[31m-[m
[31m-When the connection pool exceeds the available size limit, the least recently used (idle) connection already in the pool will be closed to make room for the current connection.[m
[31m-[m
[31m-Note that the cosocket connection pool is per Nginx worker process rather than per Nginx server instance, so the size limit specified here also applies to every single Nginx worker process.[m
[31m-[m
[31m-Idle connections in the pool will be monitored for any exceptional events like connection abortion or unexpected incoming data on the line, in which cases the connection in question will be closed and removed from the pool.[m
[31m-[m
[31m-In case of success, this method returns C<1>; otherwise, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-When the system receive buffer for the current connection has unread data, then this method will return the "connection in dubious state" error message (as the second return value) because the previous session has unread data left behind for the next session and the connection is not safe to be reused.[m
[31m-[m
[31m-This method also makes the current cosocket object enter the "closed" state, so there is no need to manually call the L<close> method on it afterwards.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcpsock:getreusedtimes[m
[31m-[m
[31m-B<syntax:> I<count, err = tcpsock:getreusedtimes()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-This method returns the (successfully) reused times for the current connection. In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-If the current connection does not come from the built-in connection pool, then this method always returns C<0>, that is, the connection has never been reused (yet). If the connection comes from the connection pool, then the return value is always non-zero. So this method can also be used to determine if the current connection comes from the pool.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.socket.connect[m
[31m-[m
[31m-B<syntax:> I<tcpsock, err = ngx.socket.connect(host, port)>[m
[31m-[m
[31m-B<syntax:> I<tcpsock, err = ngx.socket.connect("unix:/path/to/unix-domain.socket")>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>>[m
[31m-[m
[31m-This function is a shortcut for combining L<ngx.socket.tcp()> and the L<connect()> method call in a single operation. It is actually implemented like this:[m
[31m-[m
[31m-[m
[31m-     local sock = ngx.socket.tcp()[m
[31m-     local ok, err = sock:connect(...)[m
[31m-     if not ok then[m
[31m-         return nil, err[m
[31m-     end[m
[31m-     return sock[m
[31m-[m
[31m-There is no way to use the L<settimeout> method to specify connecting timeout for this method and the L<lua_socket_connect_timeout> directive must be set at configure time instead.[m
[31m-[m
[31m-This feature was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.get_phase[m
[31m-[m
[31m-B<syntax:> I<str = ngx.get_phase()>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Retrieves the current running phase name. Possible return values are[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<init>[m
[31m-for the context of L<init_by_lua> or L<init_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<init_worker>[m
[31m-for the context of L<init_worker_by_lua> or L<init_worker_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ssl_cert>[m
[31m-for the context of L<ssl_certificate_by_lua_block> or L<ssl_certificate_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<set>[m
[31m-for the context of L<set_by_lua> or L<set_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<rewrite>[m
[31m-for the context of L<rewrite_by_lua> or L<rewrite_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<balancer>[m
[31m-for the context of L<balancer_by_lua_block> or L<balancer_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<access>[m
[31m-for the context of L<access_by_lua> or L<access_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<content>[m
[31m-for the context of L<content_by_lua> or L<content_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<header_filter>[m
[31m-for the context of L<header_filter_by_lua> or L<header_filter_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<body_filter>[m
[31m-for the context of L<body_filter_by_lua> or L<body_filter_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<log>[m
[31m-for the context of L<log_by_lua> or L<log_by_lua_file>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timer>[m
[31m-for the context of user callback functions for L<ngx.timer.*>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This API was first introduced in the C<v0.5.10> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.thread.spawn[m
[31m-[m
[31m-B<syntax:> I<co = ngx.thread.spawn(func, arg1, arg2, ...)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Spawns a new user "light thread" with the Lua function C<func> as well as those optional arguments C<arg1>, C<arg2>, and etc. Returns a Lua thread (or Lua coroutine) object represents this "light thread".[m
[31m-[m
[31m-"Light threads" are just a special kind of Lua coroutines that are scheduled by the ngx_lua module.[m
[31m-[m
[31m-Before C<ngx.thread.spawn> returns, the C<func> will be called with those optional arguments until it returns, aborts with an error, or gets yielded due to I/O operations via the L<Nginx API for Lua> (like L<tcpsock:receive>).[m
[31m-[m
[31m-After C<ngx.thread.spawn> returns, the newly-created "light thread" will keep running asynchronously usually at various I/O events.[m
[31m-[m
[31m-All the Lua code chunks running by L<rewrite_by_lua>, L<access_by_lua>, and L<content_by_lua> are in a boilerplate "light thread" created automatically by ngx_lua. Such boilerplate "light thread" are also called "entry threads".[m
[31m-[m
[31m-By default, the corresponding Nginx handler (e.g., L<rewrite_by_lua> handler) will not terminate until[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-both the "entry thread" and all the user "light threads" terminates,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-a "light thread" (either the "entry thread" or a user "light thread" aborts by calling L<ngx.exit>, L<ngx.exec>, L<ngx.redirect>, or L<ngx.req.set_uri(uri, true)>, or[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-the "entry thread" terminates with a Lua error.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-When the user "light thread" terminates with a Lua error, however, it will not abort other running "light threads" like the "entry thread" does.[m
[31m-[m
[31m-Due to the limitation in the Nginx subrequest model, it is not allowed to abort a running Nginx subrequest in general. So it is also prohibited to abort a running "light thread" that is pending on one ore more Nginx subrequests. You must call L<ngx.thread.wait> to wait for those "light thread" to terminate before quitting the "world". A notable exception here is that you can abort pending subrequests by calling L<ngx.exit> with and only with the status code C<ngx.ERROR> (-1), C<408>, C<444>, or C<499>.[m
[31m-[m
[31m-The "light threads" are not scheduled in a pre-emptive way. In other words, no time-slicing is performed automatically. A "light thread" will keep running exclusively on the CPU until[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-a (nonblocking) I/O operation cannot be completed in a single run,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-it calls L<coroutine.yield> to actively give up execution, or[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-it is aborted by a Lua error or an invocation of L<ngx.exit>, L<ngx.exec>, L<ngx.redirect>, or L<ngx.req.set_uri(uri, true)>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-For the first two cases, the "light thread" will usually be resumed later by the ngx_lua scheduler unless a "stop-the-world" event happens.[m
[31m-[m
[31m-User "light threads" can create "light threads" themselves. And normal user coroutines created by L<coroutine.create> can also create "light threads". The coroutine (be it a normal Lua coroutine or a "light thread") that directly spawns the "light thread" is called the "parent coroutine" for the "light thread" newly spawned.[m
[31m-[m
[31m-The "parent coroutine" can call L<ngx.thread.wait> to wait on the termination of its child "light thread".[m
[31m-[m
[31m-You can call coroutine.status() and coroutine.yield() on the "light thread" coroutines.[m
[31m-[m
[31m-The status of the "light thread" coroutine can be "zombie" if[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-the current "light thread" already terminates (either successfully or with an error),[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-its parent coroutine is still alive, and[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-its parent coroutine is not waiting on it with L<ngx.thread.wait>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The following example demonstrates the use of coroutine.yield() in the "light thread" coroutines[m
[31m-to do manual time-slicing:[m
[31m-[m
[31m-[m
[31m-     local yield = coroutine.yield[m
[31m-    [m
[31m-     function f()[m
[31m-         local self = coroutine.running()[m
[31m-         ngx.say("f 1")[m
[31m-         yield(self)[m
[31m-         ngx.say("f 2")[m
[31m-         yield(self)[m
[31m-         ngx.say("f 3")[m
[31m-     end[m
[31m-    [m
[31m-     local self = coroutine.running()[m
[31m-     ngx.say("0")[m
[31m-     yield(self)[m
[31m-    [m
[31m-     ngx.say("1")[m
[31m-     ngx.thread.spawn(f)[m
[31m-    [m
[31m-     ngx.say("2")[m
[31m-     yield(self)[m
[31m-    [m
[31m-     ngx.say("3")[m
[31m-     yield(self)[m
[31m-    [m
[31m-     ngx.say("4")[m
[31m-[m
[31m-Then it will generate the output[m
[31m-[m
[31m-    0[m
[31m-    1[m
[31m-    f 1[m
[31m-    2[m
[31m-    f 2[m
[31m-    3[m
[31m-    f 3[m
[31m-    4[m
[31m-[m
[31m-"Light threads" are mostly useful for doing concurrent upstream requests in a single Nginx request handler, kinda like a generalized version of L<ngx.location.capture_multi> that can work with all the L<Nginx API for Lua>. The following example demonstrates parallel requests to MySQL, Memcached, and upstream HTTP services in a single Lua handler, and outputting the results in the order that they actually return (very much like the Facebook BigPipe model):[m
[31m-[m
[31m-[m
[31m-     -- query mysql, memcached, and a remote http service at the same time,[m
[31m-     -- output the results in the order that they[m
[31m-     -- actually return the results.[m
[31m-    [m
[31m-     local mysql = require "resty.mysql"[m
[31m-     local memcached = require "resty.memcached"[m
[31m-    [m
[31m-     local function query_mysql()[m
[31m-         local db = mysql:new()[m
[31m-         db:connect{[m
[31m-                     host = "127.0.0.1",[m
[31m-                     port = 3306,[m
[31m-                     database = "test",[m
[31m-                     user = "monty",[m
[31m-                     password = "mypass"[m
[31m-                   }[m
[31m-         local res, err, errno, sqlstate =[m
[31m-                 db:query("select * from cats order by id asc")[m
[31m-         db:set_keepalive(0, 100)[m
[31m-         ngx.say("mysql done: ", cjson.encode(res))[m
[31m-     end[m
[31m-    [m
[31m-     local function query_memcached()[m
[31m-         local memc = memcached:new()[m
[31m-         memc:connect("127.0.0.1", 11211)[m
[31m-         local res, err = memc:get("some_key")[m
[31m-         ngx.say("memcached done: ", res)[m
[31m-     end[m
[31m-    [m
[31m-     local function query_http()[m
[31m-         local res = ngx.location.capture("/my-http-proxy")[m
[31m-         ngx.say("http done: ", res.body)[m
[31m-     end[m
[31m-    [m
[31m-     ngx.thread.spawn(query_mysql)      -- create thread 1[m
[31m-     ngx.thread.spawn(query_memcached)  -- create thread 2[m
[31m-     ngx.thread.spawn(query_http)       -- create thread 3[m
[31m-[m
[31m-This API was first enabled in the C<v0.7.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.thread.wait[m
[31m-[m
[31m-B<syntax:> I<ok, res1, res2, ... = ngx.thread.wait(thread1, thread2, ...)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Waits on one or more child "light threads" and returns the results of the first "light thread" that terminates (either successfully or with an error).[m
[31m-[m
[31m-The arguments C<thread1>, C<thread2>, and etc are the Lua thread objects returned by earlier calls of L<ngx.thread.spawn>.[m
[31m-[m
[31m-The return values have exactly the same meaning as L<coroutine.resume>, that is, the first value returned is a boolean value indicating whether the "light thread" terminates successfully or not, and subsequent values returned are the return values of the user Lua function that was used to spawn the "light thread" (in case of success) or the error object (in case of failure).[m
[31m-[m
[31m-Only the direct "parent coroutine" can wait on its child "light thread", otherwise a Lua exception will be raised.[m
[31m-[m
[31m-The following example demonstrates the use of C<ngx.thread.wait> and L<ngx.location.capture> to emulate L<ngx.location.capture_multi>:[m
[31m-[m
[31m-[m
[31m-     local capture = ngx.location.capture[m
[31m-     local spawn = ngx.thread.spawn[m
[31m-     local wait = ngx.thread.wait[m
[31m-     local say = ngx.say[m
[31m-    [m
[31m-     local function fetch(uri)[m
[31m-         return capture(uri)[m
[31m-     end[m
[31m-    [m
[31m-     local threads = {[m
[31m-         spawn(fetch, "/foo"),[m
[31m-         spawn(fetch, "/bar"),[m
[31m-         spawn(fetch, "/baz")[m
[31m-     }[m
[31m-    [m
[31m-     for i = 1, #threads do[m
[31m-         local ok, res = wait(threads[i])[m
[31m-         if not ok then[m
[31m-             say(i, ": failed to run: ", res)[m
[31m-         else[m
[31m-             say(i, ": status: ", res.status)[m
[31m-             say(i, ": body: ", res.body)[m
[31m-         end[m
[31m-     end[m
[31m-[m
[31m-Here it essentially implements the "wait all" model.[m
[31m-[m
[31m-And below is an example demonstrating the "wait any" model:[m
[31m-[m
[31m-[m
[31m-     function f()[m
[31m-         ngx.sleep(0.2)[m
[31m-         ngx.say("f: hello")[m
[31m-         return "f done"[m
[31m-     end[m
[31m-    [m
[31m-     function g()[m
[31m-         ngx.sleep(0.1)[m
[31m-         ngx.say("g: hello")[m
[31m-         return "g done"[m
[31m-     end[m
[31m-    [m
[31m-     local tf, err = ngx.thread.spawn(f)[m
[31m-     if not tf then[m
[31m-         ngx.say("failed to spawn thread f: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-    [m
[31m-     ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-    [m
[31m-     local tg, err = ngx.thread.spawn(g)[m
[31m-     if not tg then[m
[31m-         ngx.say("failed to spawn thread g: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-    [m
[31m-     ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-    [m
[31m-     ok, res = ngx.thread.wait(tf, tg)[m
[31m-     if not ok then[m
[31m-         ngx.say("failed to wait: ", res)[m
[31m-         return[m
[31m-     end[m
[31m-    [m
[31m-     ngx.say("res: ", res)[m
[31m-    [m
[31m-     -- stop the "world", aborting other running threads[m
[31m-     ngx.exit(ngx.OK)[m
[31m-[m
[31m-And it will generate the following output:[m
[31m-[m
[31m-    f thread created: running[m
[31m-    g thread created: running[m
[31m-    g: hello[m
[31m-    res: g done[m
[31m-[m
[31m-This API was first enabled in the C<v0.7.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.thread.kill[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.thread.kill(thread)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>>[m
[31m-[m
[31m-Kills a running "light thread" created by L<ngx.thread.spawn>. Returns a true value when successful or C<nil> and a string describing the error otherwise.[m
[31m-[m
[31m-According to the current implementation, only the parent coroutine (or "light thread") can kill a thread. Also, a running "light thread" with pending NGINX subrequests (initiated by L<ngx.location.capture> for example) cannot be killed due to a limitation in the NGINX core.[m
[31m-[m
[31m-This API was first enabled in the C<v0.9.9> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.on_abort[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.on_abort(callback)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>>[m
[31m-[m
[31m-Registers a user Lua function as the callback which gets called automatically when the client closes the (downstream) connection prematurely.[m
[31m-[m
[31m-Returns C<1> if the callback is registered successfully or returns C<nil> and a string describing the error otherwise.[m
[31m-[m
[31m-All the L<Nginx API for Lua> can be used in the callback function because the function is run in a special "light thread", just as those "light threads" created by L<ngx.thread.spawn>.[m
[31m-[m
[31m-The callback function can decide what to do with the client abortion event all by itself. For example, it can simply ignore the event by doing nothing and the current Lua request handler will continue executing without interruptions. And the callback function can also decide to terminate everything by calling L<ngx.exit>, for example,[m
[31m-[m
[31m-[m
[31m-     local function my_cleanup()[m
[31m-         -- custom cleanup work goes here, like cancelling a pending DB transaction[m
[31m-    [m
[31m-         -- now abort all the "light threads" running in the current request handler[m
[31m-         ngx.exit(499)[m
[31m-     end[m
[31m-    [m
[31m-     local ok, err = ngx.on_abort(my_cleanup)[m
[31m-     if not ok then[m
[31m-         ngx.log(ngx.ERR, "failed to register the on_abort callback: ", err)[m
[31m-         ngx.exit(500)[m
[31m-     end[m
[31m-[m
[31m-When L<lua_check_client_abort> is set to C<off> (which is the default), then this function call will always return the error message "lua_check_client_abort is off".[m
[31m-[m
[31m-According to the current implementation, this function can only be called once in a single request handler; subsequent calls will return the error message "duplicate call".[m
[31m-[m
[31m-This API was first introduced in the C<v0.7.4> release.[m
[31m-[m
[31m-See also L<lua_check_client_abort>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.timer.at[m
[31m-[m
[31m-B<syntax:> I<ok, err = ngx.timer.at(delay, callback, user_arg1, user_arg2, ...)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Creates an Nginx timer with a user callback function as well as optional user arguments.[m
[31m-[m
[31m-The first argument, C<delay>, specifies the delay for the timer,[m
[31m-in seconds. One can specify fractional seconds like C<0.001> to mean 1[m
[31m-millisecond here. C<0> delay can also be specified, in which case the[m
[31m-timer will immediately expire when the current handler yields[m
[31m-execution.[m
[31m-[m
[31m-The second argument, C<callback>, can[m
[31m-be any Lua function, which will be invoked later in a background[m
[31m-"light thread" after the delay specified. The user callback will be[m
[31m-called automatically by the Nginx core with the arguments C<premature>,[m
[31m-C<user_arg1>, C<user_arg2>, and etc, where the C<premature>[m
[31m-argument takes a boolean value indicating whether it is a premature timer[m
[31m-expiration or not, and C<user_arg1>, C<user_arg2>, and etc, are[m
[31m-those (extra) user arguments specified when calling C<ngx.timer.at>[m
[31m-as the remaining arguments.[m
[31m-[m
[31m-Premature timer expiration happens when the Nginx worker process is[m
[31m-trying to shut down, as in an Nginx configuration reload triggered by[m
[31m-the C<HUP> signal or in an Nginx server shutdown. When the Nginx worker[m
[31m-is trying to shut down, one can no longer call C<ngx.timer.at> to[m
[31m-create new timers with nonzero delays and in that case C<ngx.timer.at> will return C<nil> and[m
[31m-a string describing the error, that is, "process exiting".[m
[31m-[m
[31m-Starting from the C<v0.9.3> release, it is allowed to create zero-delay timers even when the Nginx worker process starts shutting down.[m
[31m-[m
[31m-When a timer expires, the user Lua code in the timer callback is[m
[31m-running in a "light thread" detached completely from the original[m
[31m-request creating the timer. So objects with the same lifetime as the[m
[31m-request creating them, like L<cosockets>, cannot be shared between the[m
[31m-original request and the timer user callback function.[m
[31m-[m
[31m-Here is a simple example:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         ...[m
[31m-         log_by_lua '[m
[31m-             local function push_data(premature, uri, args, status)[m
[31m-                 -- push the data uri, args, and status to the remote[m
[31m-                 -- via ngx.socket.tcp or ngx.socket.udp[m
[31m-                 -- (one may want to buffer the data in Lua a bit to[m
[31m-                 -- save I/O operations)[m
[31m-             end[m
[31m-             local ok, err = ngx.timer.at(0, push_data,[m
[31m-                                          ngx.var.uri, ngx.var.args, ngx.header.status)[m
[31m-             if not ok then[m
[31m-                 ngx.log(ngx.ERR, "failed to create timer: ", err)[m
[31m-                 return[m
[31m-             end[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-One can also create infinite re-occuring timers, for instance, a timer getting triggered every C<5> seconds, by calling C<ngx.timer.at> recursively in the timer callback function. Here is such an example,[m
[31m-[m
[31m-[m
[31m-     local delay = 5[m
[31m-     local handler[m
[31m-     handler = function (premature)[m
[31m-         -- do some routine job in Lua just like a cron job[m
[31m-         if premature then[m
[31m-             return[m
[31m-         end[m
[31m-         local ok, err = ngx.timer.at(delay, handler)[m
[31m-         if not ok then[m
[31m-             ngx.log(ngx.ERR, "failed to create the timer: ", err)[m
[31m-             return[m
[31m-         end[m
[31m-     end[m
[31m-    [m
[31m-     local ok, err = ngx.timer.at(delay, handler)[m
[31m-     if not ok then[m
[31m-         ngx.log(ngx.ERR, "failed to create the timer: ", err)[m
[31m-         return[m
[31m-     end[m
[31m-[m
[31m-Because timer callbacks run in the background and their running time[m
[31m-will not add to any client request's response time, they can easily[m
[31m-accumulate in the server and exhaust system resources due to either[m
[31m-Lua programming mistakes or just too much client traffic. To prevent[m
[31m-extreme consequences like crashing the Nginx server, there are[m
[31m-built-in limitations on both the number of "pending timers" and the[m
[31m-number of "running timers" in an Nginx worker process. The "pending[m
[31m-timers" here mean timers that have not yet been expired and "running[m
[31m-timers" are those whose user callbacks are currently running.[m
[31m-[m
[31m-The maximal number of pending timers allowed in an Nginx[m
[31m-worker is constrolled by the L<lua_max_pending_timers>[m
[31m-directive. The maximal number of running timers is controlled by the[m
[31m-L<lua_max_running_timers> directive.[m
[31m-[m
[31m-According to the current implementation, each "running timer" will[m
[31m-take one (fake) connection record from the global connection record[m
[31m-list configured by the standard L<worker_connections|http://nginx.org/en/docs/ngx_core_module.html#worker_connections> directive in[m
[31m-C<nginx.conf>. So ensure that the[m
[31m-L<worker_connections|http://nginx.org/en/docs/ngx_core_module.html#worker_connections> directive is set to[m
[31m-a large enough value that takes into account both the real connections[m
[31m-and fake connections required by timer callbacks (as limited by the[m
[31m-L<lua_max_running_timers> directive).[m
[31m-[m
[31m-A lot of the Lua APIs for Nginx are enabled in the context of the timer[m
[31m-callbacks, like stream/datagram cosockets (L<ngx.socket.tcp> and L<ngx.socket.udp>), shared[m
[31m-memory dictionaries (L<ngx.shared.DICT>), user coroutines (L<coroutine.*>),[m
[31m-user "light threads" (L<ngx.thread.*>), L<ngx.exit>, L<ngx.now>/L<ngx.time>,[m
[31m-L<ngx.md5>/L<ngx.sha1_bin>, are all allowed. But the subrequest API (like[m
[31m-L<ngx.location.capture>), the L<ngx.req.*> API, the downstream output API[m
[31m-(like L<ngx.say>, L<ngx.print>, and L<ngx.flush>) are explicitly disabled in[m
[31m-this context.[m
[31m-[m
[31m-You can pass most of the standard Lua values (nils, booleans, numbers, strings, tables, closures, file handles, and etc) into the timer callback, either explicitly as user arguments or implicitly as upvalues for the callback closure. There are several exceptions, however: you I<cannot> pass any thread objects returned by L<coroutine.create> and L<ngx.thread.spawn> or any cosocket objects returned by L<ngx.socket.tcp>, L<ngx.socket.udp>, and L<ngx.req.socket> because these objects' lifetime is bound to the request context creating them while the timer callback is detached from the creating request's context (by design) and runs in its own (fake) request context. If you try to share the thread or cosocket objects across the boundary of the creating request, then you will get the "no co ctx found" error (for threads) or "bad request" (for cosockets). It is fine, however, to create all these objects inside your timer callback.[m
[31m-[m
[31m-This API was first introduced in the C<v0.8.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.timer.running_count[m
[31m-[m
[31m-B<syntax:> I<count = ngx.timer.running_count()>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns the number of timers currently running.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.timer.pending_count[m
[31m-[m
[31m-B<syntax:> I<count = ngx.timer.pending_count()>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Returns the number of pending timers.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.config.subsystem[m
[31m-[m
[31m-B<syntax:> I<subsystem = ngx.config.subsystem>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>, init_worker_by_luaE<42>>[m
[31m-[m
[31m-This string field indicates the current NGINX subsystem the current Lua environment is based on. For this module, this field always takes the string value C<"http">. For[m
[31m-L<ngx_stream_lua_module|https://github.com/openresty/stream-lua-nginx-module#readme>, however, this field takes the value C<"stream">.[m
[31m-[m
[31m-This field was first introduced in the C<0.10.1>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.config.debug[m
[31m-[m
[31m-B<syntax:> I<debug = ngx.config.debug>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>, init_worker_by_luaE<42>>[m
[31m-[m
[31m-This boolean field indicates whether the current Nginx is a debug build, i.e., being built by the C<./configure> option C<--with-debug>.[m
[31m-[m
[31m-This field was first introduced in the C<0.8.7>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.config.prefix[m
[31m-[m
[31m-B<syntax:> I<prefix = ngx.config.prefix()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>, init_worker_by_luaE<42>>[m
[31m-[m
[31m-Returns the Nginx server "prefix" path, as determined by the C<-p> command-line option when running the nginx executable, or the path specified by the C<--prefix> command-line option when building Nginx with the C<./configure> script.[m
[31m-[m
[31m-This function was first introduced in the C<0.9.2>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.config.nginx_version[m
[31m-[m
[31m-B<syntax:> I<ver = ngx.config.nginx_version>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>, init_worker_by_luaE<42>>[m
[31m-[m
[31m-This field take an integral value indicating the version number of the current Nginx core being used. For example, the version number C<1.4.3> results in the Lua number 1004003.[m
[31m-[m
[31m-This API was first introduced in the C<0.9.3> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.config.nginx_configure[m
[31m-[m
[31m-B<syntax:> I<str = ngx.config.nginx_configure()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>>[m
[31m-[m
[31m-This function returns a string for the NGINX C<./configure> command's arguments string.[m
[31m-[m
[31m-This API was first introduced in the C<0.9.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.config.ngx_lua_version[m
[31m-[m
[31m-B<syntax:> I<ver = ngx.config.ngx_lua_version>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>>[m
[31m-[m
[31m-This field take an integral value indicating the version number of the current C<ngx_lua> module being used. For example, the version number C<0.9.3> results in the Lua number 9003.[m
[31m-[m
[31m-This API was first introduced in the C<0.9.3> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.worker.exiting[m
[31m-[m
[31m-B<syntax:> I<exiting = ngx.worker.exiting()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>, init_worker_by_luaE<42>>[m
[31m-[m
[31m-This function returns a boolean value indicating whether the current Nginx worker process already starts exiting. Nginx worker process exiting happens on Nginx server quit or configuration reload (aka HUP reload).[m
[31m-[m
[31m-This API was first introduced in the C<0.9.3> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.worker.pid[m
[31m-[m
[31m-B<syntax:> I<pid = ngx.worker.pid()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>, init_worker_by_luaE<42>>[m
[31m-[m
[31m-This function returns a Lua number for the process ID (PID) of the current Nginx worker process. This API is more efficient than C<ngx.var.pid> and can be used in contexts where the L<ngx.var.VARIABLE> API cannot be used (like L<init_worker_by_lua>).[m
[31m-[m
[31m-This API was first introduced in the C<0.9.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.worker.count[m
[31m-[m
[31m-B<syntax:> I<count = ngx.worker.count()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_by_luaE<42>>[m
[31m-[m
[31m-Returns the total number of the Nginx worker processes (i.e., the value configured[m
[31m-by the L<worker_processes|http://nginx.org/en/docs/ngx_core_module.html#worker_processes>[m
[31m-directive in C<nginx.conf>).[m
[31m-[m
[31m-This API was first introduced in the C<0.9.20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.worker.id[m
[31m-[m
[31m-B<syntax:> I<count = ngx.worker.id()>[m
[31m-[m
[31m-B<context:> I<set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, init_worker_by_luaE<42>>[m
[31m-[m
[31m-Returns the ordinal number of the current Nginx worker processes (starting from number 0).[m
[31m-[m
[31m-So if the total number of workers is C<N>, then this method may return a number between 0[m
[31m-and C<N - 1> (inclusive).[m
[31m-[m
[31m-This function returns meaningful values only for NGINX 1.9.1+. With earlier versions of NGINX, it[m
[31m-always returns C<nil>.[m
[31m-[m
[31m-See also L<ngx.worker.count>.[m
[31m-[m
[31m-This API was first introduced in the C<0.9.20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.semaphore[m
[31m-[m
[31m-B<syntax:> I<local semaphore = require "ngx.semaphore">[m
[31m-[m
[31m-This is a Lua module that implements a classic-style semaphore API for efficient synchronizations among[m
[31m-different "light threads". Sharing the same semaphore among different "light threads" created in different (request)[m
[31m-contexts are also supported as long as the "light threads" reside in the same NGINX worker process[m
[31m-and the L<lua_code_cache> directive is turned on (which is the default).[m
[31m-[m
[31m-This Lua module does not ship with this ngx_lua module itself rather it is shipped with[m
[31m-the[m
[31m-L<lua-resty-core|https://github.com/openresty/lua-resty-core> library.[m
[31m-[m
[31m-Please refer to the L<documentation|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/semaphore.md>[m
[31m-for this C<ngx.semaphore> Lua module in L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-for more details.[m
[31m-[m
[31m-This feature requires at least ngx_lua C<v0.10.0>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.balancer[m
[31m-[m
[31m-B<syntax:> I<local balancer = require "ngx.balancer">[m
[31m-[m
[31m-This is a Lua module that provides a Lua API to allow defining completely dynamic load balancers[m
[31m-in pure Lua.[m
[31m-[m
[31m-This Lua module does not ship with this ngx_lua module itself rather it is shipped with[m
[31m-the[m
[31m-L<lua-resty-core|https://github.com/openresty/lua-resty-core> library.[m
[31m-[m
[31m-Please refer to the L<documentation|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/balancer.md>[m
[31m-for this C<ngx.balancer> Lua module in L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-for more details.[m
[31m-[m
[31m-This feature requires at least ngx_lua C<v0.10.0>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.ssl[m
[31m-[m
[31m-B<syntax:> I<local ssl = require "ngx.ssl">[m
[31m-[m
[31m-This Lua module provides API functions to control the SSL handshake process in contexts like[m
[31m-L<ssl_certificate_by_lua*>.[m
[31m-[m
[31m-This Lua module does not ship with this ngx_lua module itself rather it is shipped with[m
[31m-the[m
[31m-L<lua-resty-core|https://github.com/openresty/lua-resty-core> library.[m
[31m-[m
[31m-Please refer to the L<documentation|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md>[m
[31m-for this C<ngx.ssl> Lua module for more details.[m
[31m-[m
[31m-This feature requires at least ngx_lua C<v0.10.0>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.ocsp[m
[31m-[m
[31m-B<syntax:> I<local ocsp = require "ngx.ocsp">[m
[31m-[m
[31m-This Lua module provides API to perform OCSP queries, OCSP response validations, and[m
[31m-OCSP stapling planting.[m
[31m-[m
[31m-Usually, this module is used together with the L<ngx.ssl|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md>[m
[31m-module in the[m
[31m-context of L<ssl_certificate_by_lua*>.[m
[31m-[m
[31m-This Lua module does not ship with this ngx_lua module itself rather it is shipped with[m
[31m-the[m
[31m-L<lua-resty-core|https://github.com/openresty/lua-resty-core> library.[m
[31m-[m
[31m-Please refer to the L<documentation|https://github.com/openresty/lua-resty-core/blob/ocsp-cert-by-lua-2/lib/ngx/ocsp.md>[m
[31m-for this C<ngx.ocsp> Lua module for more details.[m
[31m-[m
[31m-This feature requires at least ngx_lua C<v0.10.0>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ndk.set_var.DIRECTIVE[m
[31m-[m
[31m-B<syntax:> I<res = ndk.set_var.DIRECTIVE_NAME>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>, balancer_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-This mechanism allows calling other nginx C modules' directives that are implemented by L<Nginx Devel Kit|https://github.com/simpl/ngx_devel_kit> (NDK)'s set_var submodule's C<ndk_set_var_value>.[m
[31m-[m
[31m-For example, the following L<set-misc-nginx-module|http://github.com/openresty/set-misc-nginx-module> directives can be invoked this way:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_sql_str|http://github.com/openresty/set-misc-nginx-module#set_quote_sql_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_pgsql_str|http://github.com/openresty/set-misc-nginx-module#set_quote_pgsql_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_json_str|http://github.com/openresty/set-misc-nginx-module#set_quote_json_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_unescape_uri|http://github.com/openresty/set-misc-nginx-module#set_unescape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_escape_uri|http://github.com/openresty/set-misc-nginx-module#set_escape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_base32|http://github.com/openresty/set-misc-nginx-module#set_encode_base32>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_base32|http://github.com/openresty/set-misc-nginx-module#set_decode_base32>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_base64|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_base64|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_hex|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_hex|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_sha1|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_md5|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     local res = ndk.set_var.set_escape_uri('a/b');[m
[31m-     -- now res == 'a%2fb'[m
[31m-[m
[31m-Similarly, the following directives provided by L<encrypted-session-nginx-module|http://github.com/openresty/encrypted-session-nginx-module> can be invoked from within Lua too:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encrypt_session|http://github.com/openresty/encrypted-session-nginx-module#set_encrypt_session>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decrypt_session|http://github.com/openresty/encrypted-session-nginx-module#set_decrypt_session>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This feature requires the L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 coroutine.create[m
[31m-[m
[31m-B<syntax:> I<co = coroutine.create(f)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, init_by_luaE<42>, ngx.timer.E<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Creates a user Lua coroutines with a Lua function, and returns a coroutine object.[m
[31m-[m
[31m-Similar to the standard Lua L<coroutine.create|http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.create> API, but works in the context of the Lua coroutines created by ngx_lua.[m
[31m-[m
[31m-This API was first usable in the context of L<init_by_lua*> since the C<0.9.2>.[m
[31m-[m
[31m-This API was first introduced in the C<v0.6.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 coroutine.resume[m
[31m-[m
[31m-B<syntax:> I<ok, ... = coroutine.resume(co, ...)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, init_by_luaE<42>, ngx.timer.E<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Resumes the executation of a user Lua coroutine object previously yielded or just created.[m
[31m-[m
[31m-Similar to the standard Lua L<coroutine.resume|http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.resume> API, but works in the context of the Lua coroutines created by ngx_lua.[m
[31m-[m
[31m-This API was first usable in the context of L<init_by_lua*> since the C<0.9.2>.[m
[31m-[m
[31m-This API was first introduced in the C<v0.6.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 coroutine.yield[m
[31m-[m
[31m-B<syntax:> I<... = coroutine.yield(...)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, init_by_luaE<42>, ngx.timer.E<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Yields the execution of the current user Lua coroutine.[m
[31m-[m
[31m-Similar to the standard Lua L<coroutine.yield|http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.yield> API, but works in the context of the Lua coroutines created by ngx_lua.[m
[31m-[m
[31m-This API was first usable in the context of L<init_by_lua*> since the C<0.9.2>.[m
[31m-[m
[31m-This API was first introduced in the C<v0.6.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 coroutine.wrap[m
[31m-[m
[31m-B<syntax:> I<co = coroutine.wrap(f)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, init_by_luaE<42>, ngx.timer.E<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Similar to the standard Lua L<coroutine.wrap|http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.wrap> API, but works in the context of the Lua coroutines created by ngx_lua.[m
[31m-[m
[31m-This API was first usable in the context of L<init_by_lua*> since the C<0.9.2>.[m
[31m-[m
[31m-This API was first introduced in the C<v0.6.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 coroutine.running[m
[31m-[m
[31m-B<syntax:> I<co = coroutine.running()>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, init_by_luaE<42>, ngx.timer.E<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Identical to the standard Lua L<coroutine.running|http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.running> API.[m
[31m-[m
[31m-This API was first usable in the context of L<init_by_lua*> since the C<0.9.2>.[m
[31m-[m
[31m-This API was first enabled in the C<v0.6.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 coroutine.status[m
[31m-[m
[31m-B<syntax:> I<status = coroutine.status(co)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, init_by_luaE<42>, ngx.timer.E<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Identical to the standard Lua L<coroutine.status|http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.status> API.[m
[31m-[m
[31m-This API was first usable in the context of L<init_by_lua*> since the C<0.9.2>.[m
[31m-[m
[31m-This API was first enabled in the C<v0.6.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Obsolete Sections[m
[31m-[m
[31m-This section is just holding obsolete documentation sections that have been either renamed or removed so that existing links over the web are still valid.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Special PCRE Sequences[m
[31m-[m
[31m-This section has been renamed to L<Special Escaping Sequences>.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_lua_upstream-0.05/ngx_lua_upstream-0.05.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_lua_upstream-0.05/ngx_lua_upstream-0.05.pod[m
[1mdeleted file mode 100644[m
[1mindex 1ab5200..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_lua_upstream-0.05/ngx_lua_upstream-0.05.pod[m
[1m+++ /dev/null[m
[36m@@ -1,425 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx_http_lua_upstream - Nginx C module to expose Lua API to ngx_lua for Nginx upstreams[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    http {[m
[31m-        upstream foo.com {[m
[31m-            server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-            server agentzh.org:81;[m
[31m-        }[m
[31m-    [m
[31m-        upstream bar {[m
[31m-            server 127.0.0.2;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 8080;[m
[31m-    [m
[31m-            # sample output for the following /upstream interface:[m
[31m-            # upstream foo.com:[m
[31m-            #     addr = 127.0.0.1:80, weight = 4, fail_timeout = 53, max_fails = 100[m
[31m-            #     addr = 106.184.1.99:81, weight = 1, fail_timeout = 10, max_fails = 1[m
[31m-            # upstream bar:[m
[31m-            #     addr = 127.0.0.2:80, weight = 1, fail_timeout = 10, max_fails = 1[m
[31m-    [m
[31m-            location = /upstreams {[m
[31m-                default_type text/plain;[m
[31m-                content_by_lua '[m
[31m-                    local concat = table.concat[m
[31m-                    local upstream = require "ngx.upstream"[m
[31m-                    local get_servers = upstream.get_servers[m
[31m-                    local get_upstreams = upstream.get_upstreams[m
[31m-    [m
[31m-                    local us = get_upstreams()[m
[31m-                    for _, u in ipairs(us) do[m
[31m-                        ngx.say("upstream ", u, ":")[m
[31m-                        local srvs, err = get_servers(u)[m
[31m-                        if not srvs then[m
[31m-                            ngx.say("failed to get servers in upstream ", u)[m
[31m-                        else[m
[31m-                            for _, srv in ipairs(srvs) do[m
[31m-                                local first = true[m
[31m-                                for k, v in pairs(srv) do[m
[31m-                                    if first then[m
[31m-                                        first = false[m
[31m-                                        ngx.print("    ")[m
[31m-                                    else[m
[31m-                                        ngx.print(", ")[m
[31m-                                    end[m
[31m-                                    if type(v) == "table" then[m
[31m-                                        ngx.print(k, " = {", concat(v, ", "), "}")[m
[31m-                                    else[m
[31m-                                        ngx.print(k, " = ", v)[m
[31m-                                    end[m
[31m-                                end[m
[31m-                                ngx.print("\\n")[m
[31m-                            end[m
[31m-                        end[m
[31m-                    end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Functions[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_upstreams[m
[31m-[m
[31m-C<syntax: names = upstream.get_upstreams()>[m
[31m-[m
[31m-Get a list of the names for all the named upstream groups (i.e., explicit C<upstream {}> blocks).[m
[31m-[m
[31m-Note that implicit upstream groups created by C<proxy_pass> and etc are excluded.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_servers[m
[31m-[m
[31m-C<syntax: servers = upstream.get_servers(upstream_name)>[m
[31m-[m
[31m-Get configurations for all the servers in the specified upstream group. Please one server may take multiple addresses when its server name can be resolved to multiple addresses.[m
[31m-[m
[31m-The return value is an array-like Lua table. Each table entry is a hash-like Lua table that takes the following keys:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-addr[m
[31m-[m
[31m-socket address(es). can be either a Lua string or an array-like Lua table of Lua strings.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-backup[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-fail_timeout[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-max_fails[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-name[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-weight[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_primary_peers[m
[31m-[m
[31m-C<syntax: peers = upstream.get_primary_peers(upstream_name)>[m
[31m-[m
[31m-Get configurations for all the primary (non-backup) peers in the specified upstream group.[m
[31m-[m
[31m-The return value is an array-like Lua table for all the primary peers. Each table entry is a (nested) hash-like Lua table that takes the following keys:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-current_weight[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-effective_weight[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-fail_timeout[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-fails[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-id[m
[31m-[m
[31m-Identifier (ID) for the peer. This ID can be used to reference a peer in a group in the peer modifying API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-max_fails[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-name[m
[31m-[m
[31m-Socket address for the current peer[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-weight[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-accessed[m
[31m-[m
[31m-Timestamp for the last access (in seconds since the Epoch)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checked[m
[31m-[m
[31m-Timestamp for the last check (in seconds since the Epoch)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-conns[m
[31m-[m
[31m-Number of active connections to the peer (this requires NGINX 1.9.0 or above).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_backup_peers[m
[31m-[m
[31m-C<syntax: peers = upstream.get_backup_peers(upstream_name)>[m
[31m-[m
[31m-Get configurations for all the backup peers in the specified upstream group.[m
[31m-[m
[31m-The return value has the same structure as L<get_primary_peers> function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_peer_down[m
[31m-[m
[31m-C<syntax: ok, err = upstream.set_peer_down(upstream_name, is_backup, peer_id, down_value)>[m
[31m-[m
[31m-Set the "down" (boolean) attribute of the specified peer.[m
[31m-[m
[31m-To uniquely specify a peer, you need to specify the upstream name, whether or not it is a backup peer, and the peer id (starting from 0).[m
[31m-[m
[31m-Note that this method only changes the peer settings in the current Nginx worker[m
[31m-process. You need to synchronize the changes across all the Nginx workers yourself if you[m
[31m-want a server-wide change (for example, by means of L<ngx_lua|https://github.com/openresty/lua-nginx-module#ngxshareddict>'s L<ngx.shared.DICT|https://github.com/openresty/lua-nginx-module#ngxshareddict>).[m
[31m-[m
[31m-Below is an example. Consider we have a "bar" upstream block in C<nginx.conf>:[m
[31m-[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m-[m
[31m-then[m
[31m-[m
[31m-[m
[31m-    upstream.set_peer_down("bar", false, 0, true)[m
[31m-[m
[31m-will turn down the primary peer corresponding to C<server 127.0.0.2>.[m
[31m-[m
[31m-Similarly,[m
[31m-[m
[31m-[m
[31m-    upstream.set_peer_down("bar", true, 1, true)[m
[31m-[m
[31m-will turn down the backup peer corresponding to C<server 127.0.0.4 ...>.[m
[31m-[m
[31m-You can turn on a peer again by providing a C<false> value as the 4th argument.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add API to add or remove servers to existing upstream groups.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x>  (last tested: 1.9.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x>  (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>  (last tested: 1.5.12)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-This module is bundled and enabled by default in the L<OpenResty|http://openresty.org> bundle. And you are recommended to use OpenResty.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.5.12 (see L<nginx compatibility>),[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-then grab the source code of the L<ngx_lua|https://github.com/openresty/lua-nginx-module#installation> as well as its dependencies like L<LuaJIT|http://luajit.org/download.html>.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-and finally build the source with this module:[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-    wget 'http://nginx.org/download/nginx-1.9.7.tar.gz'[m
[31m-    tar -xzvf nginx-1.9.7.tar.gz[m
[31m-    cd nginx-1.9.7/[m
[31m-    [m
[31m-    # assuming your luajit is installed to /opt/luajit:[m
[31m-    export LUAJIT_LIB=/opt/luajit/lib[m
[31m-    [m
[31m-    # assuming you are using LuaJIT v2.1:[m
[31m-    export LUAJIT_INC=/opt/luajit/include/luajit-2.1[m
[31m-    [m
[31m-    # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-    ./configure --prefix=/opt/nginx \[m
[31m-        --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" \[m
[31m-        --add-module=/path/to/lua-nginx-module \[m
[31m-        --add-module=/path/to/lua-upstream-nginx-module[m
[31m-    [m
[31m-    make -j2[m
[31m-    make install[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_lua_upstream_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2014-2016, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://github.com/openresty/lua-nginx-module#readme[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-upstream-healthcheck|https://github.com/openresty/lua-resty-upstream-healthcheck> library which makes use of the Lua API provided by this module.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_postgres-1.0rc7/ngx_postgres-1.0rc7.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_postgres-1.0rc7/ngx_postgres-1.0rc7.pod[m
[1mdeleted file mode 100644[m
[1mindex 2d8cbe0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_postgres-1.0rc7/ngx_postgres-1.0rc7.pod[m
[1m+++ /dev/null[m
[36m@@ -1,758 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 About[m
[31m-[m
[31m-C<ngx_postgres> is an upstream module that allows C<nginx> to communicate directly[m
[31m-with C<PostgreSQL> database.[m
[31m-[m
[31m-Response is generated in C<rds> format, so it's compatible with C<ngx_rds_json>[m
[31m-and C<ngx_drizzle> modules.[m
[31m-[m
[31m-[m
[31m-=head1 Status[m
[31m-[m
[31m-This module is production-ready and it's compatible with following nginx[m
[31m-releases:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.7.x (tested with 0.7.60 to 0.7.69),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x (tested with 0.8.0 to 0.8.55),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.9.x (tested with 0.9.0 to 0.9.7),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (tested with 1.0.0 to 1.0.11),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (tested with 1.1.0 to 1.1.12).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.2.x (tested with 1.2.3 to 1.2.3).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.3.x (tested with 1.3.4 to 1.3.4).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=head1 Configuration directives[m
[31m-[m
[31m-[m
[31m-=head2 postgres_server[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_server ip[:port] dbname=dbname user=user password=pass>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<none>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<upstream>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Set details about the database server.[m
[31m-[m
[31m-[m
[31m-=head2 postgres_keepalive[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_keepalive off | max=count [mode=single|multi] [overflow=ignore|reject]>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<max=10 mode=single overflow=ignore>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<upstream>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Configure keepalive parameters:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max>      - maximum number of keepalive connections (per worker process),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<mode>     - backend matching mode,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<overflow> - either C<ignore> the fact that keepalive connection pool is full[m
[31m-and allow request, but close connection afterwards or C<reject> request with[m
[31m-C<503 Service Unavailable> response.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=head2 postgres_pass[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_pass upstream>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<none>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<location>, C<if location>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Set name of an upstream block that will be used for the database connections[m
[31m-(it can include variables).[m
[31m-[m
[31m-[m
[31m-=head2 postgres_query[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_query [methods] query>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<none>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<http>, C<server>, C<location>, C<if location>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Set query string (it can include variables). When methods are specified then[m
[31m-query is used only for them, otherwise it's used for all methods.[m
[31m-[m
[31m-This directive can be used more than once within same context.[m
[31m-[m
[31m-[m
[31m-=head2 postgres_rewrite[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_rewrite [methods] condition [=]status_code>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<none>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<http>, C<server>, C<location>, C<if location>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Rewrite response C<status_code> when given condition is met (first one wins!):[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<no_changes> - no rows were affected by the query,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<changes>    - at least one row was affected by the query,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<no_rows>    - no rows were returned in the result-set,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<rows>       - at least one row was returned in the result-set.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-When C<status_code> is prefixed with C<=> sign then original response body is[m
[31m-send to the client instead of the default error page for given C<status_code>.[m
[31m-[m
[31m-By design both C<no_changes> and C<changes> apply only to C<INSERT>,[m
[31m-C<UPDATE>, C<DELETE>, C<MOVE>, C<FETCH> and C<COPY> SQL queries.[m
[31m-[m
[31m-This directive can be used more than once within same context.[m
[31m-[m
[31m-[m
[31m-=head2 postgres_output[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_output rds|text|value|binary_value|none>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<rds>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<http>, C<server>, C<location>, C<if location>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Set output format:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<rds>          - return all values from the result-set in C<rds> format[m
[31m-(with appropriate C<Content-Type>),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<text>         - return all values from the result-set in text format[m
[31m-(with default C<Content-Type>), values are separated by new line,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<value>        - return single value from the result-set in text format[m
[31m-(with default C<Content-Type>),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<binary_value> - return single value from the result-set in binary format[m
[31m-(with default C<Content-Type>),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<none>         - don't return anything, this should be used only when[m
[31m-extracting values with C<postgres_set> for use with other modules (without[m
[31m-C<Content-Type>).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=head2 postgres_set[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_set $variable row column [optional|required]>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<none>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<http>, C<server>, C<location>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Get single value from the result-set and keep it in $variable.[m
[31m-[m
[31m-When requirement level is set to C<required> and value is either out-of-range,[m
[31m-C<NULL> or zero-length, then nginx returns C<500 Internal Server Error> response.[m
[31m-Such condition is silently ignored when requirement level is set to C<optional>[m
[31m-(default).[m
[31m-[m
[31m-Row and column numbers start at 0. Column name can be used instead of column[m
[31m-number.[m
[31m-[m
[31m-This directive can be used more than once within same context.[m
[31m-[m
[31m-[m
[31m-=head2 postgres_escape[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_escape $escaped [[=]$unescaped]>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<none>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<http>, C<server>, C<location>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Escape and quote C<$unescaped> string. Result is stored in C<$escaped> variable[m
[31m-which can be safely used in SQL queries.[m
[31m-[m
[31m-Because nginx cannot tell the difference between empty and non-existing strings,[m
[31m-all empty strings are by default escaped to C<NULL> value. This behavior can be[m
[31m-disabled by prefixing C<$unescaped> string with C<=> sign.[m
[31m-[m
[31m-[m
[31m-=head2 postgres_connect_timeout[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_connect_timeout timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<10s>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<http>, C<server>, C<location>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Set timeout for connecting to the database.[m
[31m-[m
[31m-[m
[31m-=head2 postgres_result_timeout[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<syntax>: C<postgres_result_timeout timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<default>: C<30s>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<context>: C<http>, C<server>, C<location>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Set timeout for receiving result from the database.[m
[31m-[m
[31m-[m
[31m-=head1 Configuration variables[m
[31m-[m
[31m-[m
[31m-=head2 $postgres_columns[m
[31m-[m
[31m-Number of columns in received result-set.[m
[31m-[m
[31m-[m
[31m-=head2 $postgres_rows[m
[31m-[m
[31m-Number of rows in received result-set.[m
[31m-[m
[31m-[m
[31m-=head2 $postgres_affected[m
[31m-[m
[31m-Number of rows affected by C<INSERT>, C<UPDATE>, C<DELETE>, C<MOVE>, C<FETCH>[m
[31m-or C<COPY> SQL query.[m
[31m-[m
[31m-[m
[31m-=head2 $postgres_query[m
[31m-[m
[31m-SQL query, as seen by C<PostgreSQL> database.[m
[31m-[m
[31m-[m
[31m-=head1 Sample configurations[m
[31m-[m
[31m-[m
[31m-=head2 Sample configuration #1[m
[31m-[m
[31m-Return content of table C<cats> (in C<rds> format).[m
[31m-[m
[31m-    http {[m
[31m-        upstream database {[m
[31m-            postgres_server  127.0.0.1 dbname=test[m
[31m-                             user=test password=test;[m
[31m-        }[m
[31m-[m
[31m-        server {[m
[31m-            location / {[m
[31m-                postgres_pass   database;[m
[31m-                postgres_query  "SELECT * FROM cats";[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head2 Sample configuration #2[m
[31m-[m
[31m-Return only those rows from table C<sites> that match C<host> filter which[m
[31m-is evaluated for each request based on its C<$http_host> variable.[m
[31m-[m
[31m-    http {[m
[31m-        upstream database {[m
[31m-            postgres_server  127.0.0.1 dbname=test[m
[31m-                             user=test password=test;[m
[31m-        }[m
[31m-[m
[31m-        server {[m
[31m-            location / {[m
[31m-                postgres_pass   database;[m
[31m-                postgres_query  SELECT * FROM sites WHERE host='$http_host'";[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head2 Sample configuration #3[m
[31m-[m
[31m-Pass request to the backend selected from the database (traffic router).[m
[31m-[m
[31m-    http {[m
[31m-        upstream database {[m
[31m-            postgres_server  127.0.0.1 dbname=test[m
[31m-                             user=test password=test;[m
[31m-        }[m
[31m-[m
[31m-        server {[m
[31m-            location / {[m
[31m-                eval_subrequest_in_memory  off;[m
[31m-[m
[31m-                eval $backend {[m
[31m-                    postgres_pass    database;[m
[31m-                    postgres_query   "SELECT * FROM backends LIMIT 1";[m
[31m-                    postgres_output  value 0 0;[m
[31m-                }[m
[31m-[m
[31m-                proxy_pass  $backend;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-Required modules (other than C<ngx_postgres>):[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<nginx-eval-module (agentzh's fork)|http://github.com/agentzh/nginx-eval-module>,[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=head2 Sample configuration #4[m
[31m-[m
[31m-Restrict access to local files by authenticating against C<PostgreSQL> database.[m
[31m-[m
[31m-    http {[m
[31m-        upstream database {[m
[31m-            postgres_server  127.0.0.1 dbname=test[m
[31m-                             user=test password=test;[m
[31m-        }[m
[31m-[m
[31m-        server {[m
[31m-            location = /auth {[m
[31m-                internal;[m
[31m-[m
[31m-                postgres_escape   $user $remote_user;[m
[31m-                postgres_escape   $pass $remote_passwd;[m
[31m-[m
[31m-                postgres_pass     database;[m
[31m-                postgres_query    "SELECT login FROM users WHERE login=$user AND pass=$pass";[m
[31m-                postgres_rewrite  no_rows 403;[m
[31m-                postgres_output   none;[m
[31m-            }[m
[31m-[m
[31m-            location / {[m
[31m-                auth_request      /auth;[m
[31m-                root              /files;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-Required modules (other than C<ngx_postgres>):[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_auth_request_module|http://mdounin.ru/hg/ngx_http_auth_request_module/>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_coolkit|http://github.com/FRiCKLE/ngx_coolkit>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=head2 Sample configuration #5[m
[31m-[m
[31m-Simple RESTful webservice returning JSON responses with appropriate HTTP status[m
[31m-codes.[m
[31m-[m
[31m-    http {[m
[31m-        upstream database {[m
[31m-            postgres_server  127.0.0.1 dbname=test[m
[31m-                             user=test password=test;[m
[31m-        }[m
[31m-[m
[31m-        server {[m
[31m-            set $random  123;[m
[31m-[m
[31m-            location = /numbers/ {[m
[31m-                postgres_pass     database;[m
[31m-                rds_json          on;[m
[31m-[m
[31m-                postgres_query    HEAD GET  "SELECT * FROM numbers";[m
[31m-[m
[31m-                postgres_query    POST      "INSERT INTO numbers VALUES('$random') RETURNING *";[m
[31m-                postgres_rewrite  POST      changes 201;[m
[31m-[m
[31m-                postgres_query    DELETE    "DELETE FROM numbers";[m
[31m-                postgres_rewrite  DELETE    no_changes 204;[m
[31m-                postgres_rewrite  DELETE    changes 204;[m
[31m-            }[m
[31m-[m
[31m-            location ~ /numbers/(?<num>\d+) {[m
[31m-                postgres_pass     database;[m
[31m-                rds_json          on;[m
[31m-[m
[31m-                postgres_query    HEAD GET  "SELECT * FROM numbers WHERE number='$num'";[m
[31m-                postgres_rewrite  HEAD GET  no_rows 410;[m
[31m-[m
[31m-                postgres_query    PUT       "UPDATE numbers SET number='$num' WHERE number='$num' RETURNING *";[m
[31m-                postgres_rewrite  PUT       no_changes 410;[m
[31m-[m
[31m-                postgres_query    DELETE    "DELETE FROM numbers WHERE number='$num'";[m
[31m-                postgres_rewrite  DELETE    no_changes 410;[m
[31m-                postgres_rewrite  DELETE    changes 204;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-Required modules (other than C<ngx_postgres>):[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_rds_json|http://github.com/agentzh/rds-json-nginx-module>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=head2 Sample configuration #6[m
[31m-[m
[31m-Use GET parameter in SQL query.[m
[31m-[m
[31m-    location /quotes {[m
[31m-        set_unescape_uri  $txt $arg_txt;[m
[31m-        postgres_escape   $txt;[m
[31m-        postgres_pass     database;[m
[31m-        postgres_query    "SELECT * FROM quotes WHERE quote=$txt";[m
[31m-    }[m
[31m-[m
[31m-Required modules (other than C<ngx_postgres>):[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_set_misc|http://github.com/agentzh/set-misc-nginx-module>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=head1 Testing[m
[31m-[m
[31m-C<ngx_postgres> comes with complete test suite based on L<Test::Nginx|http://github.com/agentzh/test-nginx>.[m
[31m-[m
[31m-You can test core functionality by running:[m
[31m-[m
[31m-C<$ TEST_NGINX_IGNORE_MISSING_DIRECTIVES=1 prove>[m
[31m-[m
[31m-You can also test interoperability with following modules:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_coolkit|http://github.com/FRiCKLE/ngx_coolkit>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_echo|github.com/agentzh/echo-nginx-module>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_form_input|http://github.com/calio/form-input-nginx-module>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_set_misc|http://github.com/agentzh/set-misc-nginx-module>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_auth_request_module|http://mdounin.ru/hg/ngx_http_auth_request_module/>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<nginx-eval-module (agentzh's fork)|http://github.com/agentzh/nginx-eval-module>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_rds_json|http://github.com/agentzh/rds-json-nginx-module>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-by running:[m
[31m-[m
[31m-C<$ prove>[m
[31m-[m
[31m-[m
[31m-=head1 License[m
[31m-[m
[31m-    Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m-    Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m-    Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m-    All rights reserved.[m
[31m-[m
[31m-    Redistribution and use in source and binary forms, with or without[m
[31m-    modification, are permitted provided that the following conditions[m
[31m-    are met:[m
[31m-    1. Redistributions of source code must retain the above copyright[m
[31m-       notice, this list of conditions and the following disclaimer.[m
[31m-    2. Redistributions in binary form must reproduce the above copyright[m
[31m-       notice, this list of conditions and the following disclaimer in the[m
[31m-       documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-    HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m-    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m-    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m-    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m-    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m-    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-This software includes also parts of the code from:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<nginx> (copyrighted by B<Igor Sysoev> under BSD license),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ngx_http_upstream_keepalive> module (copyrighted by B<Maxim Dounin>[m
[31m-under BSD license).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=head1 See also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_rds_json|http://github.com/agentzh/rds-json-nginx-module>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_drizzle|http://github.com/chaoslawful/drizzle-nginx-module>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|http://github.com/chaoslawful/lua-nginx-module>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<nginx-eval-module (agentzh's fork)|http://github.com/agentzh/nginx-eval-module>.[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_postgres-1.0rc7/todo.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_postgres-1.0rc7/todo.pod[m
[1mdeleted file mode 100644[m
[1mindex 3ae35f3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/ngx_postgres-1.0rc7/todo.pod[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-Features that sooner or later will be added to C<ngx_postgres>:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add support for SSL connections to the database.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add support for dropping of idle keep-alived connections to the[m
[31m-database.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add C<$postgres_error> variable.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add support for sending mulitple queries in one go (transactions,[m
[31m-multiple SELECTs, etc), this will require changes in the processing[m
[31m-flow B<and> RDS format.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add C<postgres_escape_bytea> or C<postgres_escape_binary>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Use C<PQescapeStringConn()> instead of C<PQescapeString()>, this will[m
[31m-require lazy-evaluation of the variables after we acquire connection,[m
[31m-but before we send query to the database.[m
[31m-Notes: Don't break C<$postgres_query>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cancel long-running queries using C<PQcancel()>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Detect server version using C<PQserverVersion()>.[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/rds-csv-nginx-module-0.07/rds-csv-nginx-module-0.07.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/rds-csv-nginx-module-0.07/rds-csv-nginx-module-0.07.pod[m
[1mdeleted file mode 100644[m
[1mindex 9025bd7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/rds-csv-nginx-module-0.07/rds-csv-nginx-module-0.07.pod[m
[1m+++ /dev/null[m
[36m@@ -1,287 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx_rds_csv - Nginx output filter module to convert Resty-DBD-Streams[m
[31m-(RDS) to Comma-Separated Values (CSV)[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        # drizzle_pass/postgres_pass/...[m
[31m-    [m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n"; # default to "\r\n"[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module implements an efficient output filter that converts[m
[31m-Resty-DBD-Streams (RDS) generated by L<ngx_drizzle|https://github.com/openresty/drizzle-nginx-module>[m
[31m-and L<ngx_postgres|https://github.com/FRiCKLE/ngx_postgres/>[m
[31m-to Comma-Separated Values (CSV) format in a streaming fashion.[m
[31m-By default, the CSV format is in compliance with L<RFC 4180|http://tools.ietf.org/html/rfc4180>:[m
[31m-[m
[31m-http://tools.ietf.org/html/rfc4180[m
[31m-[m
[31m-SQL NULL values will be converted to empty field value, just like[m
[31m-empty string values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_csv[m
[31m-[m
[31m-B<syntax:> I<rds_csv on|off>[m
[31m-[m
[31m-B<default:> I<rds_csv off>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Enables this output filter when on and disables otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_csv_row_terminator[m
[31m-[m
[31m-B<syntax:> I<rds_csv_row_terminator E<lt>strE<gt>>[m
[31m-[m
[31m-B<default:> I<rds_csv_row_terminator "\r\n">[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specifies the row terminator used by the CSV format.[m
[31m-Only C<"\r\n"> and C<"\n"> are allowed.[m
[31m-[m
[31m-Defaults to C<"\r\n">, i.e., CR LF, according to L<RFC 4180|http://tools.ietf.org/html/rfc4180>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_csv_field_separator[m
[31m-[m
[31m-B<syntax:> I<rds_csv_field_separator E<lt>charE<gt>>[m
[31m-[m
[31m-B<default:> I<rds_csv_field_separator ",">[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specifies the field seperator used by the CSV format.[m
[31m-Only C<",">, C<";">, and C<"\t"> are allowed.[m
[31m-[m
[31m-Defaults to C<","> according to L<RFC 4180|http://tools.ietf.org/html/rfc4180>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_csv_field_name_header[m
[31m-[m
[31m-B<syntax:> I<rds_csv_field_name_header on|off>[m
[31m-[m
[31m-B<default:> I<rds_csv_field_name_header off>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Emits the first line of field names when this directive is set on,[m
[31m-and none otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_csv_content_type[m
[31m-[m
[31m-B<syntax:> I<rds_csv_content_type E<lt>strE<gt>>[m
[31m-[m
[31m-B<default:> I<rds_csv_content_type "text/csv; header=E<lt>present|absenceE<gt>">[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specifies the C<Content-Type> response header generated by this module.[m
[31m-[m
[31m-Defaults to C<"text/csv; header=present"> or C<"text/csv; header=absence">,[m
[31m-depending on whether L<rds_csv_field_name_header> is on or off.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_csv_buffer_size[m
[31m-[m
[31m-B<syntax:> I<rds_csv_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<rds_csv_buffer_size 4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-The lager this buffer size setting, the less streammy the output[m
[31m-will be.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<ngx_openresty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing ngx_openresty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.3 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     $ wget 'http://nginx.org/download/nginx-1.9.3.tar.gz'[m
[31m-     $ tar -xzvf nginx-1.9.3.tar.gz[m
[31m-     $ cd nginx-1.9.3/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     $ ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/rds-csv-nginx-module[m
[31m-    [m
[31m-     $ make -j2[m
[31m-     $ make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<rds-csv-nginx-module file list|https://github.com/openresty/rds-csv-nginx-module/tags>.[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<ngx_openresty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-This module is compatible with the following versions of Nginx:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x> (last tested: 1.9.3)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x> (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x> (last tested: 1.4.3)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x> (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x> (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x> (last tested: 1.0.8)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This module is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2011-2015, Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_drizzle|https://github.com/openresty/drizzle-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_postgres|https://github.com/FRiCKLE/ngx_postgres/>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_rds_json|https://github.com/openresty/rds-json-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/rds-json-nginx-module-0.14/rds-json-nginx-module-0.14.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/rds-json-nginx-module-0.14/rds-json-nginx-module-0.14.pod[m
[1mdeleted file mode 100644[m
[1mindex adcf611..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/rds-json-nginx-module-0.14/rds-json-nginx-module-0.14.pod[m
[1m+++ /dev/null[m
[36m@@ -1,382 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx_rds_json - an output filter that formats Resty DBD Streams generated by ngx_drizzle and others to JSON[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is considered production ready.[m
[31m-[m
[31m-We need your help! If you find this module useful and/or interesting, please consider joining the development![m
[31m-Commit bit can be freely delivered at your request ;)[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    server {[m
[31m-        location /mysql {[m
[31m-            drizzle_query 'select * from cats';[m
[31m-            drizzle_pass my_mysql_upstream;[m
[31m-    [m
[31m-            rds_json on;[m
[31m-        }[m
[31m-    [m
[31m-        location /foo {[m
[31m-            if ($arg_limit !~ '^\d{2}$') {[m
[31m-                rds_json_ret 400 'Bad "limit" argument';[m
[31m-            }[m
[31m-    [m
[31m-            drizzle_query "select * from dogs limit $arg_limit";[m
[31m-            drizzle_pass my_mysql_upstream;[m
[31m-    [m
[31m-            rds_json on;[m
[31m-        }[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module provides an output filter that can format the RDS outputs[m
[31m-generated by L<ngx_drizzle|https://github.com/openresty/drizzle-nginx-module>[m
[31m-and L<ngx_postgres|https://github.com/FRiCKLE/ngx_postgres/> modules to JSON.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json[m
[31m-[m
[31m-B<syntax:> I<rds_json  on|off>[m
[31m-[m
[31m-B<default:> I<rds_json off>[m
[31m-[m
[31m-Enables or disables the output filter of this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_buffer_size[m
[31m-[m
[31m-B<syntax:> I<rds_json_buffer_size   E<lt>bytesE<gt>>[m
[31m-[m
[31m-B<default:> I<rds_json_buffer_size E<lt>page-sizeE<gt>>[m
[31m-[m
[31m-Controls the buffer size used by this module. default to the page size (4k/8k).[m
[31m-The bigger the buffer size, the less streammy the conversion[m
[31m-will be. But usually increasing the buffer size[m
[31m-does help reduce CPU time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_format[m
[31m-[m
[31m-B<syntax:> I<rds_json_format  normal|compact>[m
[31m-[m
[31m-B<default:> I<rds_json_format normal>[m
[31m-[m
[31m-Controls the output JSON format. A sample of the default "normal" format[m
[31m-looks like this[m
[31m-[m
[31m-[m
[31m-     [{"id":1,"name":"marry"},{"id":2,"name":"bob"}][m
[31m-[m
[31m-while it looks like below when in the "compact" format[m
[31m-[m
[31m-[m
[31m-     [["id","name"],[1,"marry"],[2,"bob"]][m
[31m-[m
[31m-that is, the first row holds the column name list.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_root[m
[31m-[m
[31m-B<syntax:> I<rds_json_root E<lt>keyE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-Specifies the "root" key for data rows (if any). For example,[m
[31m-[m
[31m-[m
[31m-     rds_json on;[m
[31m-     rds_json_root rows;[m
[31m-[m
[31m-will return JSON output like this:[m
[31m-[m
[31m-[m
[31m-     {"rows":[{"id":2,"name":null},{"id":3,"name":"bob"}]}[m
[31m-[m
[31m-if C<rds_json_format compact> is also specified, then the[m
[31m-output will look like this:[m
[31m-[m
[31m-[m
[31m-     {"rows":[["id","name"],[2,null],[3,"bob"]]}[m
[31m-[m
[31m-Nginx variables are not supported in the E<lt>keyE<gt> argument of[m
[31m-this directive.[m
[31m-[m
[31m-If this directive is not defined, neither are L<rds_json_success_property>,[m
[31m-nor L<rds_json_user_property>, the JSON output for select queries will[m
[31m-just be an array at the top level.[m
[31m-[m
[31m-When either L<rds_json_success_property> or L<rds_json_user_property> are specified,[m
[31m-this directive takes a default argument of "data".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_success_property[m
[31m-[m
[31m-B<syntax:> I<rds_json_success_property E<lt>keyE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-Specifies the top-level object property name used in the JSON output[m
[31m-for indicating success or false of the query.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_user_property[m
[31m-[m
[31m-B<syntax:> I<rds_json_user_property E<lt>keyE<gt> E<lt>valueE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-Specifies additonal user properties for the top-level object[m
[31m-of the JSON output.[m
[31m-[m
[31m-Multiple instances of this directives are allowed in a single scope.[m
[31m-[m
[31m-Nginx variables are supported in the C<value> argument.[m
[31m-[m
[31m-Both of the C<key> and C<value> arguments will be automatically[m
[31m-quoted according to JSON strings' notation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_errcode_key[m
[31m-[m
[31m-B<syntax:> I<rds_json_errcode_key E<lt>keyE<gt>>[m
[31m-[m
[31m-B<default:> I<rds_json_errcode_key errcode>[m
[31m-[m
[31m-Specifies the errcode key name used in the JSON output.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_errstr_key[m
[31m-[m
[31m-B<syntax:> I<rds_json_errstr_key E<lt>keyE<gt>>[m
[31m-[m
[31m-B<default:> I<rds_json_errstr_key errstr>[m
[31m-[m
[31m-Specifies the errstr key name used in the JSON output.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_ret[m
[31m-[m
[31m-B<syntax:> I<rds_json_ret E<lt>error-codeE<gt> E<lt>descrptionE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-This directive enables a content handler that simply emits[m
[31m-an response body like this:[m
[31m-[m
[31m-[m
[31m-     {"errcode":<error-code>,"errstr":"<description>"}[m
[31m-[m
[31m-while the C<< <description> >> string will be properly quoted as[m
[31m-a JSON string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rds_json_content_type[m
[31m-[m
[31m-B<syntax:> I<rds_json_content_type E<lt>mime-typeE<gt>>[m
[31m-[m
[31m-B<default:> I<rds_json_content_type application/json>[m
[31m-[m
[31m-Controls the C<Content-Type> header of the response generated by[m
[31m-this module's output filter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<ngx_openresty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing ngx_openresty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.7.10 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     $ wget 'http://nginx.org/download/nginx-1.7.10.tar.gz'[m
[31m-     $ tar -xzvf nginx-1.7.10.tar.gz[m
[31m-     $ cd nginx-1.7.10/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     $ ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/rds-json-nginx-module[m
[31m-    [m
[31m-     $ make -j2[m
[31m-     $ make install[m
[31m-[m
[31m-ownload the latest version of the release tarball of this module from L<echo-nginx-module file list|https://github.com/agentzh/echo-nginx-module/tags>.[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<ngx_openresty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x> (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x> (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x> (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x> (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x> (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x> (last tested: 1.0.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x> (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x> (last tested: 0.8.55)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.46> (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.44 does not[m
[31m-work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) I<E<lt>agentzh@gmail.comE<gt>>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This module is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2009-2015, Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_drizzle|https://github.com/openresty/drizzle-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_postgres|https://github.com/FRiCKLE/ngx_postgres/>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_rds_csv|https://github.com/openresty/rds-csv-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/redis2-nginx-module-0.13/redis2-nginx-module-0.13.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/redis2-nginx-module-0.13/redis2-nginx-module-0.13.pod[m
[1mdeleted file mode 100644[m
[1mindex 749383e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/redis2-nginx-module-0.13/redis2-nginx-module-0.13.pod[m
[1m+++ /dev/null[m
[36m@@ -1,854 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx_redis2 - Nginx upstream module for the Redis 2.0 protocol[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is already production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Version[m
[31m-[m
[31m-This document describes ngx_redis2 L<v0.13|https://github.com/openresty/redis2-nginx-module/tags> released on 15 May 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     location = /foo {[m
[31m-         set $value 'first';[m
[31m-         redis2_query set one $value;[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     # GET /get?key=some_key[m
[31m-     location = /get {[m
[31m-         set_unescape_uri $key $arg_key;  # this requires ngx_set_misc[m
[31m-         redis2_query get $key;[m
[31m-         redis2_pass foo.com:6379;[m
[31m-     }[m
[31m-    [m
[31m-     # GET /set?key=one&val=first%20value[m
[31m-     location = /set {[m
[31m-         set_unescape_uri $key $arg_key;  # this requires ngx_set_misc[m
[31m-         set_unescape_uri $val $arg_val;  # this requires ngx_set_misc[m
[31m-         redis2_query set $key $val;[m
[31m-         redis2_pass foo.com:6379;[m
[31m-     }[m
[31m-    [m
[31m-     # multiple pipelined queries[m
[31m-     location = /foo {[m
[31m-         set $value 'first';[m
[31m-         redis2_query set one $value;[m
[31m-         redis2_query get one;[m
[31m-         redis2_query set one two;[m
[31m-         redis2_query get one;[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     location = /bar {[m
[31m-         # $ is not special here...[m
[31m-         redis2_literal_raw_query '*1\r\n$4\r\nping\r\n';[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     location = /bar {[m
[31m-         # variables can be used below and $ is special[m
[31m-         redis2_raw_query 'get one\r\n';[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     # GET /baz?get%20foo%0d%0a[m
[31m-     location = /baz {[m
[31m-         set_unescape_uri $query $query_string; # this requires the ngx_set_misc module[m
[31m-         redis2_raw_query $query;[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     location = /init {[m
[31m-         redis2_query del key1;[m
[31m-         redis2_query lpush key1 C;[m
[31m-         redis2_query lpush key1 B;[m
[31m-         redis2_query lpush key1 A;[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     location = /get {[m
[31m-         redis2_query lrange key1 0 -1;[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This is an Nginx upstream module that makes nginx talk to a L<Redis|http://redis.io/> 2.x server in a non-blocking way. The full Redis 2.0 unified protocol has been implemented including the Redis pipelining support.[m
[31m-[m
[31m-This module returns the raw TCP response from the Redis server. It's recommended to use my L<lua-redis-parser|http://github.com/openresty/lua-redis-parser> (written in pure C) to parse these responses into lua data structure when combined with L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>.[m
[31m-[m
[31m-When used in conjunction with L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>, it is recommended to use the L<lua-resty-redis|http://github.com/openresty/lua-resty-redis> library instead of this module though, because the former is much more flexible and memory-efficient.[m
[31m-[m
[31m-If you only want to use the C<get> redis command, you can try out the L<HttpRedisModule|http://wiki.nginx.org/HttpRedisModule>. It returns the parsed content part of the Redis response because only C<get> is needed to implement.[m
[31m-[m
[31m-Another option is to parse the redis responses on your client side yourself.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_query[m
[31m-[m
[31m-B<syntax:> I<redis2_query cmd arg1 arg2 ...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-Specify a Redis command by specifying its individual arguments (including the Redis command name itself) in a similar way to the C<redis-cli> utility.[m
[31m-[m
[31m-Multiple instances of this directive are allowed in a single location and these queries will be pipelined. For example,[m
[31m-[m
[31m-[m
[31m-     location = /pipelined {[m
[31m-         redis2_query set hello world;[m
[31m-         redis2_query get hello;[m
[31m-    [m
[31m-         redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-     }[m
[31m-[m
[31m-then C<GET /pipelined> will yield two successive raw Redis responses[m
[31m-[m
[31m-[m
[31m-     +OK[m
[31m-     $5[m
[31m-     world[m
[31m-[m
[31m-while newlines here are actually C<CR LF> (C<\r\n>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_raw_query[m
[31m-[m
[31m-B<syntax:> I<redis2_raw_query QUERY>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-Specify raw Redis queries and nginx variables are recognized in the C<QUERY> argument.[m
[31m-[m
[31m-Only I<one> Redis command is allowed in the C<QUERY> argument, or you'll receive an error. If you want to specify multiple pipelined commands in a single query, use the L<redis2_raw_queries> directive instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_raw_queries[m
[31m-[m
[31m-B<syntax:> I<redis2_raw_queries N QUERIES>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-Specify C<N> commands in the C<QUERIES> argument. Both the C<N> and C<QUERIES>[m
[31m-arguments can take Nginx variables.[m
[31m-[m
[31m-Here's some examples[m
[31m-[m
[31m-     location = /pipelined {[m
[31m-         redis2_raw_queries 3 "flushall\r\nget key1\r\nget key2\r\n";[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     # GET /pipelined2?n=2&cmds=flushall%0D%0Aget%20key%0D%0A[m
[31m-     location = /pipelined2 {[m
[31m-         set_unescape_uri $n $arg_n;[m
[31m-         set_unescape_uri $cmds $arg_cmds;[m
[31m-    [m
[31m-         redis2_raw_queries $n $cmds;[m
[31m-    [m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-[m
[31m-Note that in the second sample above, the L<set_unescape_uri|http://github.com/openresty/set-misc-nginx-module#set_unescape_uri> directive is provided by the L<set-misc-nginx-module|http://github.com/openresty/set-misc-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_literal_raw_query[m
[31m-[m
[31m-B<syntax:> I<redis2_literal_raw_query QUERY>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-Specify a raw Redis query but Nginx variables in it will not be I<not> recognized. In other words, you're free to use the dollar sign character (C<$>) in your C<QUERY> argument.[m
[31m-[m
[31m-Only One redis command is allowed in the C<QUERY> argument.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_pass[m
[31m-[m
[31m-B<syntax:> I<redis2_pass E<lt>upstream_nameE<gt>>[m
[31m-[m
[31m-B<syntax:> I<redis2_pass E<lt>hostE<gt>:E<lt>portE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Specify the Redis server backend. [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_connect_timeout[m
[31m-[m
[31m-B<syntax:> I<redis2_connect_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for connecting to the Redis server, in seconds by default.[m
[31m-[m
[31m-It's wise to always explicitly specify the time unit to avoid confusion. Time units supported are C<s>(seconds), C<ms>(milliseconds), C<y>(years), C<M>(months), C<w>(weeks), C<d>(days), C<h>(hours), and C<m>(minutes).[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_send_timeout[m
[31m-[m
[31m-B<syntax:> I<redis2_send_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for sending TCP requests to the Redis server, in seconds by default.[m
[31m-[m
[31m-It's wise to always explicitly specify the time unit to avoid confusion. Time units supported are C<s>(seconds), C<ms>(milliseconds), C<y>(years), C<M>(months), C<w>(weeks), C<d>(days), C<h>(hours), and C<m>(minutes).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_read_timeout[m
[31m-[m
[31m-B<syntax:> I<redis2_read_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for reading TCP responses from the redis server, in seconds by default.[m
[31m-[m
[31m-It's wise to always explicitly specify the time unit to avoid confusion. Time units supported are C<s>(seconds), C<ms>(milliseconds), C<y>(years), C<M>(months), C<w>(weeks), C<d>(days), C<h>(hours), and C<m>(minutes).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_buffer_size[m
[31m-[m
[31m-B<syntax:> I<redis2_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This buffer size is used for reading Redis replies, but it's not required to be as big as the largest possible Redis reply.[m
[31m-[m
[31m-This default size is the page size, may be 4k or 8k.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 redis2_next_upstream[m
[31m-[m
[31m-B<syntax:> I<redis2_next_upstream [ error | timeout | invalid_response | off ]>[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Specify which failure conditions should cause the request to be forwarded to another[m
[31m-upstream server. Applies only when the value in L<redis2_pass> is an upstream with two or more[m
[31m-servers.[m
[31m-[m
[31m-Here's an artificial example:[m
[31m-[m
[31m-     upstream redis_cluster {[m
[31m-         server 127.0.0.1:6379;[m
[31m-         server 127.0.0.1:6380;[m
[31m-     }[m
[31m-    [m
[31m-     server {[m
[31m-         location = /redis {[m
[31m-             redis2_next_upstream error timeout invalid_response;[m
[31m-             redis2_query get foo;[m
[31m-             redis2_pass redis_cluster;[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Connection Pool[m
[31m-[m
[31m-You can use the excellent L<HttpUpstreamKeepaliveModule|http://wiki.nginx.org/HttpUpstreamKeepaliveModule> with this module to provide TCP connection pool for Redis.[m
[31m-[m
[31m-A sample config snippet looks like this[m
[31m-[m
[31m-[m
[31m-     http {[m
[31m-         upstream backend {[m
[31m-           server 127.0.0.1:6379;[m
[31m-    [m
[31m-           # a pool with at most 1024 connections[m
[31m-           # and do not distinguish the servers:[m
[31m-           keepalive 1024;[m
[31m-         }[m
[31m-    [m
[31m-         server {[m
[31m-             ...[m
[31m-             location = /redis {[m
[31m-                 set_unescape_uri $query $arg_query;[m
[31m-                 redis2_query $query;[m
[31m-                 redis2_pass backend;[m
[31m-             }[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Selecting Redis Databases[m
[31m-[m
[31m-Redis provides the L<select|http://redis.io/commands/SELECT> command to switch Redis databaess. This command is no different from other normal commands[m
[31m-like L<get|http://redis.io/commands/GET> or L<set|http://redis.io/commands/SET>. So you can use them in L<redis2_query> directives, for[m
[31m-example,[m
[31m-[m
[31m-[m
[31m-    redis2_query select 8;[m
[31m-    redis2_query get foo;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Lua Interoperability[m
[31m-[m
[31m-This module can be served as a non-blocking redis2 client for L<lua-nginx-module|http://github.com/openresty/lua-nginx-module> (but nowadays it is recommended to use the L<lua-resty-redis|http://github.com/openresty/lua-resty-redis> library instead, which is much simpler to use and more efficient most of the time).[m
[31m-Here's an example using a GET subrequest:[m
[31m-[m
[31m-[m
[31m-     location = /redis {[m
[31m-         internal;[m
[31m-    [m
[31m-         # set_unescape_uri is provided by ngx_set_misc[m
[31m-         set_unescape_uri $query $arg_query;[m
[31m-    [m
[31m-         redis2_raw_query $query;[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     location = /main {[m
[31m-         content_by_lua '[m
[31m-             local res = ngx.location.capture("/redis",[m
[31m-                 { args = { query = "ping\\r\\n" } }[m
[31m-             )[m
[31m-             ngx.print("[" .. res.body .. "]")[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then accessing C</main> yields[m
[31m-[m
[31m-    [+PONG\r\n][m
[31m-[m
[31m-where C<\r\n> is C<CRLF>. That is, this module returns the I<raw> TCP responses from the remote redis server. For Lua-based application developers, they may want to utilize the L<lua-redis-parser|http://github.com/openresty/lua-redis-parser> library (written in pure C) to parse such raw responses into Lua data structures.[m
[31m-[m
[31m-When moving the inlined Lua code into an external C<.lua> file, it's important to use the escape sequence C<\r\n> directly. We used C<\\r\\n> above just because the Lua code itself needs quoting when being put into an Nginx string literal.[m
[31m-[m
[31m-You can also use POST/PUT subrequests to transfer the raw Redis request via request body, which does not require URI escaping and unescaping, thus saving some CPU cycles. Here's such an example:[m
[31m-[m
[31m-[m
[31m-     location = /redis {[m
[31m-         internal;[m
[31m-    [m
[31m-         # $echo_request_body is provided by the ngx_echo module[m
[31m-         redis2_raw_query $echo_request_body;[m
[31m-    [m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     location = /main {[m
[31m-         content_by_lua '[m
[31m-             local res = ngx.location.capture("/redis",[m
[31m-                 { method = ngx.HTTP_PUT,[m
[31m-                   body = "ping\\r\\n" }[m
[31m-             )[m
[31m-             ngx.print("[" .. res.body .. "]")[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-This yeilds exactly the same output as the previous (GET) sample.[m
[31m-[m
[31m-One can also use Lua to pick up a concrete Redis backend based on some complicated hashing rules. For instance,[m
[31m-[m
[31m-[m
[31m-     upstream redis-a {[m
[31m-         server foo.bar.com:6379;[m
[31m-     }[m
[31m-    [m
[31m-     upstream redis-b {[m
[31m-         server bar.baz.com:6379;[m
[31m-     }[m
[31m-    [m
[31m-     upstream redis-c {[m
[31m-         server blah.blah.org:6379;[m
[31m-     }[m
[31m-    [m
[31m-     server {[m
[31m-         ...[m
[31m-    [m
[31m-         location = /redis {[m
[31m-             set_unescape_uri $query $arg_query;[m
[31m-             redis2_query $query;[m
[31m-             redis2_pass $arg_backend;[m
[31m-         }[m
[31m-    [m
[31m-         location = /foo {[m
[31m-             content_by_lua "[m
[31m-                 -- pick up a server randomly[m
[31m-                 local servers = {'redis-a', 'redis-b', 'redis-c'}[m
[31m-                 local i = ngx.time() % #servers + 1;[m
[31m-                 local srv = servers[i][m
[31m-    [m
[31m-                 local res = ngx.location.capture('/redis',[m
[31m-                     { args = {[m
[31m-                         query = '...',[m
[31m-                         backend = srv[m
[31m-                       }[m
[31m-                     }[m
[31m-                 )[m
[31m-                 ngx.say(res.body)[m
[31m-             ";[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Pipelined Redis Requests by Lua[m
[31m-[m
[31m-Here's a complete example demonstrating how to use Lua to issue multiple pipelined Redis requests via this Nginx module.[m
[31m-[m
[31m-First of all, we include the following in our C<nginx.conf> file:[m
[31m-[m
[31m-[m
[31m-     location = /redis2 {[m
[31m-         internal;[m
[31m-    [m
[31m-         redis2_raw_queries $args $echo_request_body;[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     location = /test {[m
[31m-         content_by_lua_file conf/test.lua;[m
[31m-     }[m
[31m-[m
[31m-Basically we use URI query args to pass the number of Redis requests and request body to pass the pipelined Redis request string.[m
[31m-[m
[31m-And then we create the C<conf/test.lua> file (whose path is relative to the server root of Nginx) to include the following Lua code:[m
[31m-[m
[31m-[m
[31m-     -- conf/test.lua[m
[31m-     local parser = require "redis.parser"[m
[31m-    [m
[31m-     local reqs = {[m
[31m-         {"set", "foo", "hello world"},[m
[31m-         {"get", "foo"}[m
[31m-     }[m
[31m-    [m
[31m-     local raw_reqs = {}[m
[31m-     for i, req in ipairs(reqs) do[m
[31m-         table.insert(raw_reqs, parser.build_query(req))[m
[31m-     end[m
[31m-    [m
[31m-     local res = ngx.location.capture("/redis2?" .. #reqs,[m
[31m-         { body = table.concat(raw_reqs, "") })[m
[31m-    [m
[31m-     if res.status ~= 200 or not res.body then[m
[31m-         ngx.log(ngx.ERR, "failed to query redis")[m
[31m-         ngx.exit(500)[m
[31m-     end[m
[31m-    [m
[31m-     local replies = parser.parse_replies(res.body, #reqs)[m
[31m-     for i, reply in ipairs(replies) do[m
[31m-         ngx.say(reply[1])[m
[31m-     end[m
[31m-[m
[31m-Here we assume that your Redis server is listening on the default port (6379) of the localhost. We also make use of the L<lua-redis-parser|http://github.com/openresty/lua-redis-parser> library to construct raw Redis queries for us and also use it to parse the replies.[m
[31m-[m
[31m-Accessing the C</test> location via HTTP clients like C<curl> yields the following output[m
[31m-[m
[31m-    OK[m
[31m-    hello world[m
[31m-[m
[31m-A more realistic setting is to use a proper upstream definition for our Redis backend and enable TCP connection pool via the L<keepalive|http://wiki.nginx.org/HttpUpstreamKeepaliveModule#keepalive> directive in it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Redis Publish/Subscribe Support[m
[31m-[m
[31m-This module has limited support for Redis publish/subscribe feature. It cannot be fully supported due to the stateless nature of REST and HTTP model.[m
[31m-[m
[31m-Consider the following example:[m
[31m-[m
[31m-[m
[31m-     location = /redis {[m
[31m-         redis2_raw_queries 2 "subscribe /foo/bar\r\n";[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-[m
[31m-And then publish a message for the key C</foo/bar> in the C<redis-cli> command line. And then you'll receive two multi-bulk replies from the C</redis> location.[m
[31m-[m
[31m-You can surely parse the replies with the L<lua-redis-parser|http://github.com/openresty/lua-redis-parser> library if you're using Lua to access this module's location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Limitations For Redis Publish/Subscribe[m
[31m-[m
[31m-If you want to use the L<Redis pubE<sol>sub|http://redis.io/topics/pubsub> feature with this module, then you must note the following limitations:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-You cannot use L<HttpUpstreamKeepaliveModule|http://wiki.nginx.org/HttpUpstreamKeepaliveModule> with this Redis upstream. Only short Redis connections will work.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-There may be some race conditions that produce the harmless C<Redis server returned extra bytes> warnings in your nginx's error.log. Such warnings might be rare but just be prepared for it.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-You should tune the various timeout settings provided by this module like L<redis2_connect_timeout> and L<redis2_read_timeout>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-If you cannot stand these limitations, then you are highly recommended to switch to the L<lua-resty-redis|https://github.com/openresty/lua-resty-redis> library for L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Performance Tuning[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When you're using this module, please ensure you're using a TCP connection pool (provided by L<HttpUpstreamKeepaliveModule|http://wiki.nginx.org/HttpUpstreamKeepaliveModule>) and Redis pipelining wherever possible. These features will significantly improve performance.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Using multiple instance of Redis servers on your multi-core machines also help a lot due to the sequential processing nature of a single Redis server instance.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When you're benchmarking performance using something like C<ab> or C<http_load>, please ensure that your error log level is high enough (like C<warn>) to prevent Nginx workers spend too much cycles on flushing the C<error.log> file, which is always non-buffered and blocking and thus very expensive.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You are recommended to install this module (as well as the Nginx core and many many other goodies) via the L<ngx_openresty bundle|http://openresty.org>. Check out the L<installation instructions|http://openresty.org/#Installation> for setting up L<ngx_openresty|http://openresty.org>.[m
[31m-[m
[31m-Alternatively, you can install this module manually by recompiling the standard Nginx core as follows:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org>, for example, the version 1.9.15 (see nginx compatibility),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and then download the latest version of the release tarball of this module from ngx_redis2's L<file list|http://github.com/openresty/redis2-nginx-module/tags>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and finally build the source with this module:[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-                 --add-module=/path/to/redis2-nginx-module[m
[31m-    [m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_redis2_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-Redis 2.0, 2.2, 2.4, and above should work with this module without any issues. So is the L<Alchemy Database|http://code.google.com/p/alchemydatabase/> (aka redisql in its early days).[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.9.x (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.8.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.5.x (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.4.x (last tested: 1.4.3)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.3.x (last tested: 1.3.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.2.x (last tested: 1.2.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (last tested: 1.0.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.9.x (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x E<gt>= 0.8.31 (last tested: 0.8.54)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.8.31 does not work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/openresty/redis2-nginx-module/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>redis2-nginx-module|http://github.com/openresty/redis2-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add the C<redis2_as_json> directive to allow emitting JSON directly.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the author or just ask for[m
[31m-a commit bit to the source repository on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This module is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2010-2016, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SEE ALSO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<Redis|http://redis.io/> server homepage.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The Redis wire protocol: E<lt>http://redis.io/topics/protocolE<gt>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-a redis response parser and a request constructor for Lua: L<lua-redis-parser|http://github.com/openresty/lua-redis-parser>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<ngx_openresty bundle|http://openresty.org>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<lua-resty-redis|https://github.com/openresty/lua-resty-redis> library based on the L<lua-nginx-module|http://github.com/openresty/lua-nginx-module> cosocket API.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/resty-cli-0.12/resty-cli-0.12.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/resty-cli-0.12/resty-cli-0.12.pod[m
[1mdeleted file mode 100644[m
[1mindex 989973f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/resty-cli-0.12/resty-cli-0.12.pod[m
[1m+++ /dev/null[m
[36m@@ -1,233 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-resty-cli - Fancy command-line utilities for OpenResty.[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<resty> command-line utility can be used to run OpenResty's Lua scripts directly off the command-line just like the C<lua> or C<luajit> command-line utilities. It can be used to create various command-line utilities using OpenResty Lua.[m
[31m-[m
[31m-This tool works by creating a head-less C<nginx> instance,[m
[31m-disabling L<daemon|http://nginx.org/en/docs/ngx_core_module.html#daemon>, L<master_process|http://nginx.org/en/docs/ngx_core_module.html#master_process>, L<access_log|http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log>, and other things it does[m
[31m-not need. No C<server {}> is configured hence I<no> listening sockets[m
[31m-are involved at all.[m
[31m-[m
[31m-The Lua code is initiated by the L<init_worker_by_lua|https://github.com/openresty/lua-nginx-module#init_worker_by_lua>[m
[31m-directive and run in the context of L<ngx.timer|https://github.com/openresty/lua-nginx-module#ngxtimerat> callback. So all of[m
[31m-L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme>'s Lua APIs available in the L<ngx.timer|https://github.com/openresty/lua-nginx-module#ngxtimerat> callback context are[m
[31m-also available in the C<resty> utility. We may remove some of the[m
[31m-remaining limitations in the future though.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-    $ export PATH=/usr/local/openresty/bin:$PATH[m
[31m-[m
[31m-    $ which resty[m
[31m-    /usr/local/openresty/bin/resty[m
[31m-[m
[31m-    $ resty -h[m
[31m-    resty [options] [lua-file [args]][m
[31m-[m
[31m-    Options:[m
[31m-        -c num              Set maximal connection count (default: 64).[m
[31m-        -e prog             Run the inlined Lua code in "prog".[m
[31m-        --help              Print this help.[m
[31m-[m
[31m-        --http-include path Include the specified file in the nginx http configuration block[m
[31m-                            (multiple instances are supported).[m
[31m-[m
[31m-        -I dir              Add dir to the search paths for Lua libraries.[m
[31m-[m
[31m-        --main-include path Include the specified file in the nginx main configuration block[m
[31m-                            (multiple instances are supported).[m
[31m-[m
[31m-        --nginx             Specify the nginx path (this option might be removed in the future).[m
[31m-        -V                  Print version numbers and nginx configurations.[m
[31m-        --valgrind          Use valgrind to run nginx[m
[31m-        --valgrind-opts     Pass extra options to valgrind[m
[31m-[m
[31m-    For bug reporting instructions, please see:[m
[31m-    <http://openresty.org/#Community>[m
[31m-[m
[31m-    $ resty -e 'print("hello")'[m
[31m-    hello[m
[31m-[m
[31m-    $ time resty -e 'ngx.sleep(3) print("done\n")'[m
[31m-    done[m
[31m-[m
[31m-    real 0m3.085s[m
[31m-    user 0m0.071s[m
[31m-    sys 0m0.010s[m
[31m-[m
[31m-    $ resty -e 'ngx.say(ngx.md5("hello"))'[m
[31m-    5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-    $ resty -e 'io.stderr:write("hello world\n")' > /dev/null[m
[31m-    hello world[m
[31m-[m
[31m-To run the code example in L<lua-resty-mysql|https://github.com/openresty/lua-resty-mysql>'s[m
[31m-"Synopsis" documentation section:[m
[31m-[m
[31m-    $ resty mysql-example.lua[m
[31m-    connected to mysql.[m
[31m-    table cats created.[m
[31m-    3 rows inserted into table cats (last insert id: 1)[m
[31m-    result: [{"name":"Bob","id":"1"},{"name":"","id":"2"},{"name":null,"id":"3"}][m
[31m-[m
[31m-where C<mysql-example.lua> is from L<lua-resty-mysql|https://github.com/openresty/lua-resty-mysql>'s docs.[m
[31m-[m
[31m-Stdin also works (in addition to stdout and stderr):[m
[31m-[m
[31m-    $ resty -e 'print("got: ", io.stdin:read("*l"))'[m
[31m-    hiya[m
[31m-    got: hiya[m
[31m-[m
[31m-where the first "hiya" line was entered from the keyboard.[m
[31m-[m
[31m-"Light threads" also work:[m
[31m-[m
[31m-    $ time resty -e 'local ths = {}[m
[31m-                     for i = 1, 3 do[m
[31m-                         ths[i] = ngx.thread.spawn(function ()[m
[31m-                                      ngx.sleep(3) ngx.say("done ", i)[m
[31m-                                  end)[m
[31m-                     end[m
[31m-                     for i = 1, #ths do ngx.thread.wait(ths[i]) end'[m
[31m-    done 1[m
[31m-    done 2[m
[31m-    done 3[m
[31m-[m
[31m-    real 0m3.073s[m
[31m-    user 0m0.053s[m
[31m-    sys 0m0.015s[m
[31m-[m
[31m-User command-line arguments are also passed:[m
[31m-[m
[31m-    $ resty -e 'print(arg[1], ", ", arg[2])' hello world[m
[31m-    hello, world[m
[31m-[m
[31m-To check version numbers:[m
[31m-[m
[31m-    $ resty -V[m
[31m-    resty 0.01[m
[31m-    nginx version: openresty/1.7.7.2[m
[31m-    built by gcc 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC)[m
[31m-    TLS SNI support enabled[m
[31m-    configure arguments: --prefix=/usr/local/openresty/nginx ...[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-The C<resty> command-line utility is bundled and enabled in OpenResty 1.7.7.2+ by[m
[31m-default and is installed under C<< <openresty-prefix>/bin/ >> by default.[m
[31m-If the OpenResty prefix is the default value (C</usr/local/openresty>),[m
[31m-then you can just add C</usr/local/openresty/bin> to your PATH environment:[m
[31m-[m
[31m-[m
[31m-    export PATH=/usr/local/openresty/bin:$PATH[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This project comes with a test suite powered by Perl's testing toolchain.[m
[31m-[m
[31m-To run the test suite on your side, first install some of the CPAN modules required by the test[m
[31m-scaffold:[m
[31m-[m
[31m-[m
[31m-    sudo cpan Test::Base IPC::Run[m
[31m-[m
[31m-Also, you need to make your nginx executable visible in your PATH environment:[m
[31m-[m
[31m-[m
[31m-    export PATH=/path/to/your/nginx/sbin:$PATH[m
[31m-[m
[31m-Then you can run the tests with the C<prove> command provided by Perl:[m
[31m-[m
[31m-[m
[31m-    prove -r t[m
[31m-[m
[31m-To run an individual test file, just specify the test file on the command-line, for instance,[m
[31m-[m
[31m-[m
[31m-    prove t/resty/user-args.t[m
[31m-[m
[31m-To run an individual test case in a test file, just (temporarily) add the line[m
[31m-[m
[31m-[m
[31m-    --- ONLY[m
[31m-[m
[31m-to the end of that test block, then run that particular test file as mentioned above.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Authors[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Guanlan Dai E<lt>guanlan@cloudflare.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2014-2016, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-Copyright (C) 2014-2016, by Guanlan Dai E<lt>guanlan@cloudflare.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/set-misc-nginx-module-0.30/set-misc-nginx-module-0.30.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/set-misc-nginx-module-0.30/set-misc-nginx-module-0.30.pod[m
[1mdeleted file mode 100644[m
[1mindex 9f03387..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/set-misc-nginx-module-0.30/set-misc-nginx-module-0.30.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1305 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-B<ngx_set_misc> - Various set_xxx directives added to nginx's rewrite module (md5/sha1, sql/json quoting, and many more)[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This document describes ngx_set_misc L<v0.30|https://github.com/openresty/set-misc-nginx-module/tags> released on 8 March 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $a $arg_a;[m
[31m-         set_if_empty $a 56;[m
[31m-    [m
[31m-         # GET /foo?a=32 will yield $a == 32[m
[31m-         # while GET /foo and GET /foo?a= will[m
[31m-         # yeild $a == 56 here.[m
[31m-     }[m
[31m-    [m
[31m-     location /bar {[m
[31m-         set $foo "hello\n\n'\"\\";[m
[31m-         set_quote_sql_str $foo $foo; # for mysql[m
[31m-    [m
[31m-         # OR in-place editing:[m
[31m-         #   set_quote_sql_str $foo;[m
[31m-    [m
[31m-         # now $foo is: 'hello\n\n\'\"\\'[m
[31m-     }[m
[31m-    [m
[31m-     location /bar {[m
[31m-         set $foo "hello\n\n'\"\\";[m
[31m-         set_quote_pgsql_str $foo;  # for PostgreSQL[m
[31m-    [m
[31m-         # now $foo is: E'hello\n\n\'\"\\'[m
[31m-     }[m
[31m-    [m
[31m-     location /json {[m
[31m-         set $foo "hello\n\n'\"\\";[m
[31m-         set_quote_json_str $foo $foo;[m
[31m-    [m
[31m-         # OR in-place editing:[m
[31m-         #   set_quote_json_str $foo;[m
[31m-    [m
[31m-         # now $foo is: "hello\n\n'\"\\"[m
[31m-     }[m
[31m-    [m
[31m-     location /baz {[m
[31m-         set $foo "hello%20world";[m
[31m-         set_unescape_uri $foo $foo;[m
[31m-    [m
[31m-         # OR in-place editing:[m
[31m-         #   set_unescape_uri $foo;[m
[31m-    [m
[31m-         # now $foo is: hello world[m
[31m-     }[m
[31m-    [m
[31m-     upstream_list universe moon sun earth;[m
[31m-     upstream moon { ... }[m
[31m-     upstream sun { ... }[m
[31m-     upstream earth { ... }[m
[31m-     location /foo {[m
[31m-         set_hashed_upstream $backend universe $arg_id;[m
[31m-         drizzle_pass $backend; # used with ngx_drizzle[m
[31m-     }[m
[31m-    [m
[31m-     location /base32 {[m
[31m-         set $a 'abcde';[m
[31m-         set_encode_base32 $a;[m
[31m-         set_decode_base32 $b $a;[m
[31m-    [m
[31m-         # now $a == 'c5h66p35' and[m
[31m-         # $b == 'abcde'[m
[31m-     }[m
[31m-    [m
[31m-     location /base64 {[m
[31m-         set $a 'abcde';[m
[31m-         set_encode_base64 $a;[m
[31m-         set_decode_base64 $b $a;[m
[31m-    [m
[31m-         # now $a == 'YWJjZGU=' and[m
[31m-         # $b == 'abcde'[m
[31m-     }[m
[31m-    [m
[31m-     location /hex {[m
[31m-         set $a 'abcde';[m
[31m-         set_encode_hex $a;[m
[31m-         set_decode_hex $b $a;[m
[31m-    [m
[31m-         # now $a == '6162636465' and[m
[31m-         # $b == 'abcde'[m
[31m-     }[m
[31m-    [m
[31m-     # GET /sha1 yields the output[m
[31m-     #   aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m-     location /sha1 {[m
[31m-         set_sha1 $a hello;[m
[31m-         echo $a;[m
[31m-     }[m
[31m-    [m
[31m-     # ditto[m
[31m-     location /sha1 {[m
[31m-         set $a hello;[m
[31m-         set_sha1 $a;[m
[31m-         echo $a;[m
[31m-     }[m
[31m-    [m
[31m-     # GET /today yields the date of today in local time using format 'yyyy-mm-dd'[m
[31m-     location /today {[m
[31m-         set_local_today $today;[m
[31m-         echo $today;[m
[31m-     }[m
[31m-    [m
[31m-     # GET /signature yields the hmac-sha-1 signature[m
[31m-     # given a secret and a string to sign[m
[31m-     # this example yields the base64 encoded singature which is[m
[31m-     # "HkADYytcoQQzqbjQX33k/ZBB/DQ="[m
[31m-     location /signature {[m
[31m-         set $secret_key 'secret-key';[m
[31m-         set $string_to_sign "some-string-to-sign";[m
[31m-         set_hmac_sha1 $signature $secret_key $string_to_sign;[m
[31m-         set_encode_base64 $signature $signature;[m
[31m-         echo $signature;[m
[31m-     }[m
[31m-    [m
[31m-     location = /rand {[m
[31m-         set $from 3;[m
[31m-         set $to 15;[m
[31m-         set_random $rand $from $to;[m
[31m-    [m
[31m-         # or write directly[m
[31m-         #   set_random $rand 3 15;[m
[31m-    [m
[31m-         echo $rand;  # will print a random integer in the range [3, 15][m
[31m-     }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module extends the standard HttpRewriteModule's directive set to provide more functionalities like URI escaping and unescaping, JSON quoting, Hexadecimal/MD5/SHA1/Base32/Base64 digest encoding and decoding, random number generator, and more![m
[31m-[m
[31m-Every directive provided by this module can be mixed freely with other L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s directives, like L<if|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if> and L<set|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#set>. (Thanks to the L<Nginx Devel Kit|https://github.com/simpl/ngx_devel_kit>!)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_if_empty[m
[31m-[m
[31m-B<syntax:> I<set_if_empty $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Assign the value of the argument C<< <src> >> if and only if variable C<$dst> is empty (i.e., not found or has an empty string value).[m
[31m-[m
[31m-In the following example,[m
[31m-[m
[31m-[m
[31m-     set $a 32;[m
[31m-     set_if_empty $a 56;[m
[31m-[m
[31m-the variable C<$dst> will take the value 32 at last. But in the sample[m
[31m-[m
[31m-[m
[31m-     set $a '';[m
[31m-     set $value "hello, world"[m
[31m-     set_if_empty $a $value;[m
[31m-[m
[31m-C<$a> will take the value C<"hello, world"> at last.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_quote_sql_str[m
[31m-[m
[31m-B<syntax:> I<set_quote_sql_str $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_quote_sql_str $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-When taking two arguments, this directive will quote the value of the second argument C<< <src> >> by MySQL's string value quoting rule and assign the result into the first argument, variable C<$dst>. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "hello\n\r'\"\\";[m
[31m-         set_quote_sql_str $quoted $value;[m
[31m-    [m
[31m-         echo $quoted;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> will yield the following output[m
[31m-[m
[31m-[m
[31m-     'hello\n\r\'\"\\'[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-When taking a single argument, this directive will do in-place modification of the argument variable. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "hello\n\r'\"\\";[m
[31m-         set_quote_sql_str $value;[m
[31m-    [m
[31m-         echo $value;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will give exactly the same output as the previous example.[m
[31m-[m
[31m-This directive is usually used to prevent SQL injection.[m
[31m-[m
[31m-This directive can be invoked by L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>'s L<ndk.set_var.DIRECTIVE|http://github.com/openresty/lua-nginx-module#ndkset_vardirective> interface and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module>'s L<array_map_op|http://github.com/openresty/array-var-nginx-module#array_map_op> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_quote_pgsql_str[m
[31m-[m
[31m-B<syntax:> I<set_quote_pgsql_str $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_quote_pgsql_str $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-Very much like L<set_quote_sql_str>, but with PostgreSQL quoting rules for SQL string literals.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_quote_json_str[m
[31m-[m
[31m-B<syntax:> I<set_quote_json_str $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_quote_json_str $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-When taking two arguments, this directive will quote the value of the second argument C<< <src> >> by JSON string value quoting rule and assign the result into the first argument, variable C<$dst>. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "hello\n\r'\"\\";[m
[31m-         set_quote_json_str $quoted $value;[m
[31m-    [m
[31m-         echo $quoted;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> will yield the following output[m
[31m-[m
[31m-[m
[31m-     "hello\n\r'\"\\"[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-When taking a single argument, this directive will do in-place modification of the argument variable. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "hello\n\r'\"\\";[m
[31m-         set_quote_json_str $value;[m
[31m-    [m
[31m-         echo $value;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will give exactly the same output as the previous example.[m
[31m-[m
[31m-This directive can be invoked by L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>'s L<ndk.set_var.DIRECTIVE|http://github.com/openresty/lua-nginx-module#ndkset_vardirective> interface and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module>'s L<array_map_op|http://github.com/openresty/array-var-nginx-module#array_map_op> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_unescape_uri[m
[31m-[m
[31m-B<syntax:> I<set_unescape_uri $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_unescape_uri $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-When taking two arguments, this directive will unescape the value of the second argument C<< <src> >> as a URI component and assign the result into the first argument, variable C<$dst>. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set_unescape_uri $key $arg_key;[m
[31m-         echo $key;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test?key=hello+world%21> will yield the following output[m
[31m-[m
[31m-[m
[31m-    hello world![m
[31m-[m
[31m-The nginx standard L<$arg_PARAMETER|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_arg_> variable holds the raw (escaped) value of the URI parameter. So we need the C<set_unescape_uri> directive to unescape it first.[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-When taking a single argument, this directive will do in-place modification of the argument variable. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $key $arg_key;[m
[31m-         set_unescape_uri $key;[m
[31m-    [m
[31m-         echo $key;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test?key=hello+world%21> will give exactly the same output as the previous example.[m
[31m-[m
[31m-This directive can be invoked by L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>'s L<ndk.set_var.DIRECTIVE|http://github.com/openresty/lua-nginx-module#ndkset_vardirective> interface and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module>'s L<array_map_op|http://github.com/openresty/array-var-nginx-module#array_map_op> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_escape_uri[m
[31m-[m
[31m-B<syntax:> I<set_escape_uri $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_escape_uri $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-Very much like the L<set_unescape_uri> directive, but does the conversion the other way around, i.e., URL component escaping.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_hashed_upstream[m
[31m-[m
[31m-B<syntax:> I<set_hashed_upstream $dst E<lt>upstream_list_nameE<gt> E<lt>srcE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Hashes the string argument C<< <src> >> into one of the upstream name included in the upstream list named C<< <upstream_list_name> >>. The hash function being used is simple modulo.[m
[31m-[m
[31m-Here's an example,[m
[31m-[m
[31m-[m
[31m-     upstream moon { ... }[m
[31m-     upstream sun { ... }[m
[31m-     upstream earth { ... }[m
[31m-    [m
[31m-     upstream_list universe moon sun earth;[m
[31m-    [m
[31m-     location /test {[m
[31m-         set_unescape_uri $key $arg_key;[m
[31m-         set $list_name universe;[m
[31m-         set_hashed_upstream $backend $list_name $key;[m
[31m-    [m
[31m-         echo $backend;[m
[31m-     }[m
[31m-[m
[31m-Then C<GET /test?key=blah> will output either "moon", "sun", or "earth", depending on the actual value of the C<key> query argument.[m
[31m-[m
[31m-This directive is usually used to compute an nginx variable to be passed to L<memc-nginx-module|http://github.com/openresty/memc-nginx-module>'s L<memc_pass|http://github.com/openresty/memc-nginx-module#memc_pass> directive, L<redis2-nginx-module|http://github.com/openresty/redis2-nginx-module>'s [[HttpRedis2Module#redis2_pass]] directive, and L<ngx_http_proxy_module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>'s L<proxy_pass|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass> directive, among others.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_encode_base32[m
[31m-[m
[31m-B<syntax:> I<set_encode_base32 $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_encode_base32 $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-When taking two arguments, this directive will encode the value of the second argument C<< <src> >> to its base32(hex) digest and assign the result into the first argument, variable C<$dst>. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $raw "abcde";[m
[31m-         set_encode_base32 $digest $raw;[m
[31m-    [m
[31m-         echo $digest;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> will yield the following output[m
[31m-[m
[31m-[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-RFC forces the C<[A-Z2-7]> RFC-3548 compliant encoding, but we are using the "base32hex" encoding (C<[0-9a-v]>) by default. The L<set_base32_alphabet> directive (first introduced in C<v0.28>) allows you to change the alphabet used for encoding/decoding so RFC-3548 compliant encoding is still possible by custom configurations.[m
[31m-[m
[31m-By default, the C<=> character is used to pad the left-over bytes due to alignment. But the padding behavior can be completely disabled by setting L<set_base32_padding> C<off>.[m
[31m-[m
[31m-When taking a single argument, this directive will do in-place modification of the argument variable. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "abcde";[m
[31m-         set_encode_base32 $value;[m
[31m-    [m
[31m-         echo $value;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will give exactly the same output as the previous example.[m
[31m-[m
[31m-This directive can be invoked by L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>'s L<ndk.set_var.DIRECTIVE|http://github.com/openresty/lua-nginx-module#ndkset_vardirective> interface and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module>'s L<array_map_op|http://github.com/openresty/array-var-nginx-module#array_map_op> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_base32_padding[m
[31m-[m
[31m-B<syntax:> I<set_base32_padding on|off>[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<no>[m
[31m-[m
[31m-This directive can control whether to pad left-over bytes with the "=" character when encoding a base32 digest by the[m
[31m-L<set_encode_base32> directive.[m
[31m-[m
[31m-This directive was first introduced in C<v0.28>. If you use earlier versions of this module, then you should use L<set_misc_base32_padding> instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_misc_base32_padding[m
[31m-[m
[31m-B<syntax:> I<set_misc_base32_padding on|off>[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<no>[m
[31m-[m
[31m-This directive has been deprecated since C<v0.28>. Use L<set_base32_padding> instead if you are using C<v0.28+>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_base32_alphabet[m
[31m-[m
[31m-B<syntax:> I<set_base32_alphabet E<lt>alphabetE<gt>>[m
[31m-[m
[31m-B<default:> I<"0123456789abcdefghijklmnopqrstuv">[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<no>[m
[31m-[m
[31m-This directive controls the alphabet used for encoding/decoding a base32 digest. It accepts a string containing the desired alphabet like "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" for standard alphabet.[m
[31m-[m
[31m-Extended (base32hex) alphabet is used by default.[m
[31m-[m
[31m-This directive was first introduced in C<v0.28>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_decode_base32[m
[31m-[m
[31m-B<syntax:> I<set_decode_base32 $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_decode_base32 $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-Similar to the L<set_encode_base32> directive, but does exactly the the opposite operation, .i.e, decoding a base32(hex) digest into its original form.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_encode_base64[m
[31m-[m
[31m-B<syntax:> I<set_encode_base64 $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_encode_base64 $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-When taking two arguments, this directive will encode the value of the second argument C<< <src> >> to its base64 digest and assign the result into the first argument, variable C<$dst>. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $raw "abcde";[m
[31m-         set_encode_base64 $digest $raw;[m
[31m-    [m
[31m-         echo $digest;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> will yield the following output[m
[31m-[m
[31m-[m
[31m-    YWJjZGU=[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-When taking a single argument, this directive will do in-place modification of the argument variable. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "abcde";[m
[31m-         set_encode_base64 $value;[m
[31m-    [m
[31m-         echo $value;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will give exactly the same output as the previous example.[m
[31m-[m
[31m-This directive can be invoked by L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>'s L<ndk.set_var.DIRECTIVE|http://github.com/openresty/lua-nginx-module#ndkset_vardirective> interface and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module>'s L<array_map_op|http://github.com/openresty/array-var-nginx-module#array_map_op> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_decode_base64[m
[31m-[m
[31m-B<syntax:> I<set_decode_base64 $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_decode_base64 $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-Similar to the L<set_encode_base64> directive, but does exactly the the opposite operation, .i.e, decoding a base64 digest into its original form.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_encode_hex[m
[31m-[m
[31m-B<syntax:> I<set_encode_hex $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_encode_hex $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-When taking two arguments, this directive will encode the value of the second argument C<< <src> >> to its hexadecimal digest and assign the result into the first argument, variable C<$dst>. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $raw "章亦春";[m
[31m-         set_encode_hex $digest $raw;[m
[31m-    [m
[31m-         echo $digest;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> will yield the following output[m
[31m-[m
[31m-[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-When taking a single argument, this directive will do in-place modification of the argument variable. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "章亦春";[m
[31m-         set_encode_hex $value;[m
[31m-    [m
[31m-         echo $value;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will give exactly the same output as the previous example.[m
[31m-[m
[31m-This directive can be invoked by L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>'s L<ndk.set_var.DIRECTIVE|http://github.com/openresty/lua-nginx-module#ndkset_vardirective> interface and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module>'s L<array_map_op|http://github.com/openresty/array-var-nginx-module#array_map_op> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_decode_hex[m
[31m-[m
[31m-B<syntax:> I<set_decode_hex $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_decode_hex $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-Similar to the L<set_encode_hex> directive, but does exactly the the opposite operation, .i.e, decoding a hexadecimal digest into its original form.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_sha1[m
[31m-[m
[31m-B<syntax:> I<set_sha1 $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_sha1 $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-When taking two arguments, this directive will encode the value of the second argument C<< <src> >> to its L<SHA-1|http://en.wikipedia.org/wiki/SHA-1> digest and assign the result into the first argument, variable C<$dst>. The hexadecimal form of the C<SHA-1> digest will be generated automatically, use L<set_decode_hex> to decode the result if you want the binary form of the C<SHA-1> digest.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $raw "hello";[m
[31m-         set_sha1 $digest $raw;[m
[31m-    [m
[31m-         echo $digest;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> will yield the following output[m
[31m-[m
[31m-[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-When taking a single argument, this directive will do in-place modification of the argument variable. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "hello";[m
[31m-         set_sha1 $value;[m
[31m-    [m
[31m-         echo $value;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will give exactly the same output as the previous example.[m
[31m-[m
[31m-This directive can be invoked by L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>'s L<ndk.set_var.DIRECTIVE|http://github.com/openresty/lua-nginx-module#ndkset_vardirective> interface and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module>'s L<array_map_op|http://github.com/openresty/array-var-nginx-module#array_map_op> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_md5[m
[31m-[m
[31m-B<syntax:> I<set_md5 $dst E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_md5 $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<category:> I<ndk_set_var_value>[m
[31m-[m
[31m-When taking two arguments, this directive will encode the value of the second argument C<< <src> >> to its L<MD5|http://en.wikipedia.org/wiki/MD5> digest and assign the result into the first argument, variable C<$dst>. The hexadecimal form of the C<MD5> digest will be generated automatically, use L<set_decode_hex> to decode the result if you want the binary form of the C<MD5> digest.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $raw "hello";[m
[31m-         set_md5 $digest $raw;[m
[31m-    [m
[31m-         echo $digest;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> will yield the following output[m
[31m-[m
[31m-    5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-When taking a single argument, this directive will do in-place modification of the argument variable. For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $value "hello";[m
[31m-         set_md5 $value;[m
[31m-    [m
[31m-         echo $value;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will give exactly the same output as the previous example.[m
[31m-[m
[31m-This directive can be invoked by L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>'s L<ndk.set_var.DIRECTIVE|http://github.com/openresty/lua-nginx-module#ndkset_vardirective> interface and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module>'s L<array_map_op|http://github.com/openresty/array-var-nginx-module#array_map_op> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_hmac_sha1[m
[31m-[m
[31m-B<syntax:> I<set_hmac_sha1 $dst E<lt>secret_keyE<gt> E<lt>srcE<gt>>[m
[31m-[m
[31m-B<syntax:> I<set_hmac_sha1 $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Computes the L<HMAC-SHA1|http://en.wikipedia.org/wiki/HMAC> digest of the argument C<< <src> >> and assigns the result into the argument variable C<$dst> with the secret key C<< <secret_key> >>.[m
[31m-[m
[31m-The raw binary form of the C<HMAC-SHA1> digest will be generated, use L<set_encode_base64>, for example, to encode the result to a textual representation if desired.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $secret 'thisisverysecretstuff';[m
[31m-         set $string_to_sign 'some string we want to sign';[m
[31m-         set_hmac_sha1 $signature $secret $string_to_sign;[m
[31m-         set_encode_base64 $signature $signature;[m
[31m-         echo $signature;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> will yield the following output[m
[31m-[m
[31m-[m
[31m-    R/pvxzHC4NLtj7S+kXFg/NePTmk=[m
[31m-[m
[31m-Please note that we're using L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>'s L<echo directive|http://github.com/openresty/echo-nginx-module#echo> here to output values of nginx variables directly.[m
[31m-[m
[31m-This directive requires the OpenSSL library enabled in your Nignx build (usually by passing the C<--with-http_ssl_module> option to the C<./configure> script).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_random[m
[31m-[m
[31m-B<syntax:> I<set_random $res E<lt>fromE<gt> E<lt>toE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Generates a (pseudo) random number (in textual form) within the range C<< [<$from>, <$to>] >> (inclusive).[m
[31m-[m
[31m-Only non-negative numbers are allowed for the C<< <from> >> and C<< <to> >> arguments.[m
[31m-[m
[31m-When C<< <from> >> is greater than C<< <to> >>, their values will be exchanged accordingly.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set $from 5;[m
[31m-         set $to 7;[m
[31m-         set_random $res $from $to;[m
[31m-    [m
[31m-         echo $res;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will output a number between 5 and 7 (i.e., among 5, 6, 7).[m
[31m-[m
[31m-For now, there's no way to configure a custom random generator seed.[m
[31m-[m
[31m-Behind the scene, it makes use of the standard C function C<rand()>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.22rc1> release.[m
[31m-[m
[31m-See also L<set_secure_random_alphanum> and L<set_secure_random_lcalpha>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_secure_random_alphanum[m
[31m-[m
[31m-B<syntax:> I<set_secure_random_alphanum $res E<lt>lengthE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Generates a cryptographically-strong random string C<< <length> >> characters long with the alphabet C<[a-zA-Z0-9]>.[m
[31m-[m
[31m-C<< <length> >> may be between 1 and 64, inclusive.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set_secure_random_alphanum $res 32;[m
[31m-    [m
[31m-         echo $res;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will output a string like C<ivVVRP2DGaAqDmdf3Rv4ZDJ7k0gOfASz>.[m
[31m-[m
[31m-This functionality depends on the presence of the C</dev/urandom> device, available on most UNIX-like systems.[m
[31m-[m
[31m-See also L<set_secure_random_lcalpha> and L<set_random>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.22rc8> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_secure_random_lcalpha[m
[31m-[m
[31m-B<syntax:> I<set_secure_random_lcalpha $res E<lt>lengthE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Generates a cryptographically-strong random string C<< <length> >> characters long with the alphabet C<[a-z]>.[m
[31m-[m
[31m-C<< <length> >> may be between 1 and 64, inclusive.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     location /test {[m
[31m-         set_secure_random_lcalpha $res 32;[m
[31m-    [m
[31m-         echo $res;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /test> will output a string like C<kcuxcddktffsippuekhshdaclaquiusj>.[m
[31m-[m
[31m-This functionality depends on the presence of the C</dev/urandom> device, available on most UNIX-like systems.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.22rc8> release.[m
[31m-[m
[31m-See also L<set_secure_random_alphanum> and L<set_random>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_rotate[m
[31m-[m
[31m-B<syntax:> I<set_rotate $value E<lt>fromE<gt> E<lt>toE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Increments C<$value> but keeps it in range from C<< <from> >> to C<< <to> >>. [m
[31m-If C<$value> is greater than C<< <to> >> or less than C<< <from> >> is will be [m
[31m-set to C<< <from> >> value.[m
[31m-[m
[31m-The current value after running this directive will always be saved on a per-location basis. And the this saved value will be used for incrementation when the C<$value> is not initialized or has a bad value.[m
[31m-[m
[31m-Only non-negative numbers are allowed for the C<< <from> >> and C<< <to> >> arguments.[m
[31m-[m
[31m-When C<< <from> >> is greater than C<< <to> >>, their values will be exchanged accordingly.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     location /rotate {[m
[31m-         default_type text/plain;[m
[31m-         set $counter $cookie_counter;[m
[31m-         set_rotate $counter 1 5;[m
[31m-         echo $counter;[m
[31m-         add_header Set-Cookie counter=$counter;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /rotate> will output next number between 1 and 5 (i.e., 1, 2, 3, 4, 5) on each[m
[31m-refresh of the page. This directive may be userful for banner rotation purposes.[m
[31m-[m
[31m-Another example is to use server-side value persistence to do simple round-robin:[m
[31m-[m
[31m-[m
[31m-     location /rotate {[m
[31m-         default_type text/plain;[m
[31m-         set_rotate $counter 0 3;[m
[31m-         echo $counter;[m
[31m-     }[m
[31m-[m
[31m-And accessing C</rotate> will also output integer sequence 0, 1, 2, 3, 0, 1, 2, 3, and so on.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.22rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_local_today[m
[31m-[m
[31m-B<syntax:> I<set_local_today $dst>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Set today's date ("yyyy-mm-dd") in localtime to the argument variable C<$dst>.[m
[31m-[m
[31m-Here's an example,[m
[31m-[m
[31m-[m
[31m-     location /today {[m
[31m-         set_local_today $today;[m
[31m-         echo $today;[m
[31m-     }[m
[31m-[m
[31m-then request C<GET /today> will output something like[m
[31m-[m
[31m-[m
[31m-    2011-08-16[m
[31m-[m
[31m-and year, the actual date you get here will vary every day ;)[m
[31m-[m
[31m-Behind the scene, this directive utilizes the C<ngx_time> API in the Nginx core, so usually no syscall is involved due to the time caching mechanism in the Nginx core.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_formatted_gmt_time[m
[31m-[m
[31m-B<syntax:> I<set_formatted_gmt_time $res E<lt>time-formatE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Set a formatted GMT time to variable C<$res> (as the first argument) using the format string in the second argument.[m
[31m-[m
[31m-All the conversion specification notations in the standard C function C<strftime> are supported, like C<%Y> (for 4-digit years) and C<%M> (for minutes in decimal). See E<lt>http://linux.die.net/man/3/strftimeE<gt> for a complete list of conversion specification symbols.[m
[31m-[m
[31m-Below is an example:[m
[31m-[m
[31m-[m
[31m-     location = /t {[m
[31m-         set_formatted_gmt_time $timestr "%a %b %e %H:%M:%S %Y GMT";[m
[31m-         echo $timestr;[m
[31m-     }[m
[31m-[m
[31m-Accessing C</t> yields the output[m
[31m-[m
[31m-[m
[31m-    Fri Dec 13 15:34:37 2013 GMT[m
[31m-[m
[31m-This directive was first added in the C<0.23> release.[m
[31m-[m
[31m-See also L<set_formatted_local_time>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_formatted_local_time[m
[31m-[m
[31m-B<syntax:> I<set_formatted_local_time $res E<lt>time-formatE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Set a formatted local time to variable C<$res> (as the first argument) using the format string in the second argument.[m
[31m-[m
[31m-All the conversion specification notations in the standard C function C<strftime> are supported, like C<%Y> (for 4-digit years) and C<%M> (for minutes in decimal). See E<lt>http://linux.die.net/man/3/strftimeE<gt> for a complete list of conversion specification symbols.[m
[31m-[m
[31m-Below is an example:[m
[31m-[m
[31m-[m
[31m-     location = /t {[m
[31m-         set_formatted_local_time $timestr "%a %b %e %H:%M:%S %Y %Z";[m
[31m-         echo $timestr;[m
[31m-     }[m
[31m-[m
[31m-Accessing C</t> yields the output[m
[31m-[m
[31m-[m
[31m-    Fri Dec 13 15:42:15 2013 PST[m
[31m-[m
[31m-This directive was first added in the C<0.23> release.[m
[31m-[m
[31m-See also L<set_formatted_gmt_time>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Caveats[m
[31m-[m
[31m-Do not use L<$arg_PARAMETER|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_arg_>, L<$cookie_COOKIE|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_cookie_>, L<$http_HEADER|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_http_> or other special variables defined in the Nginx core module as the target variable in this module's directives. For instance,[m
[31m-[m
[31m-[m
[31m-     set_if_empty $arg_user 'foo';  # DO NOT USE THIS![m
[31m-[m
[31m-may lead to segmentation faults.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-This module is included and enabled by default in the L<OpenResty bundle|http://openresty.org>. If you want to install this module manually with your own Nginx source tarball, then follow the steps below:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.7 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.7.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.7.tar.gz[m
[31m-     cd nginx-1.9.7/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-         --with-http_ssl_module \[m
[31m-         --add-module=/path/to/ngx_devel_kit \[m
[31m-         --add-module=/path/to/set-misc-nginx-module[m
[31m-    [m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<set-misc-nginx-module file list|http://github.com/openresty/set-misc-nginx-module/tags>, and the latest tarball for L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit> from its L<file list|https://github.com/simpl/ngx_devel_kit/tags>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_set_misc_module.so;[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<OpenResty bundle|http://openresty.org/>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x>                       (last tested: 1.9.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x>                       (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>                       (last tested: 1.5.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x>                       (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x>                       (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x>                       (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x>                       (last tested: 1.0.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x>                       (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x>                       (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.46>             (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.46 does not work with this module, please consider L<reporting a bug>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-send a bug report or even patches to the L<openresty-en mailing list|https://groups.google.com/group/openresty-en>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or create a ticket on the L<issue tracking interface|http://github.com/openresty/set-misc-nginx-module/issues> provided by GitHub.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>set-misc-nginx-module|http://github.com/openresty/set-misc-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The change logs for every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|http://github.com/openresty/set-misc-nginx-module/tree/master/t/> are[m
[31m-L<declarative|http://github.com/openresty/set-misc-nginx-module/blob/master/t/escape-uri.t> too. Thanks to the L<Test::Nginx|http://search.cpan.org/perldoc?Test::Nginx> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-set-misc-module:$PATH prove -r t[m
[31m-[m
[31m-You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary.[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the L<author> or just ask for a commit bit to the L<source repository> on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun Zhang (agentzh) I<E<lt>agentzh@gmail.comE<gt>>, CloudFlare Inc.[m
[31m-[m
[31m-This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (C) 2009-2016, Yichun Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Nginx Devel Kit|https://github.com/simpl/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<The OpenResty bundle|http://openresty.org>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/srcache-nginx-module-0.31/srcache-nginx-module-0.31.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/srcache-nginx-module-0.31/srcache-nginx-module-0.31.pod[m
[1mdeleted file mode 100644[m
[1mindex db117eb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/srcache-nginx-module-0.31/srcache-nginx-module-0.31.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1418 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-B<ngx_srcache> - Transparent subrequest-based caching layout for arbitrary nginx locations[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Version[m
[31m-[m
[31m-This document describes srcache-nginx-module L<v0.31|https://github.com/openresty/srcache-nginx-module/tags> released on 15 May 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     upstream my_memcached {[m
[31m-         server 10.62.136.7:11211;[m
[31m-         keepalive 10;[m
[31m-     }[m
[31m-    [m
[31m-     location = /memc {[m
[31m-         internal;[m
[31m-    [m
[31m-         memc_connect_timeout 100ms;[m
[31m-         memc_send_timeout 100ms;[m
[31m-         memc_read_timeout 100ms;[m
[31m-         memc_ignore_client_abort on;[m
[31m-    [m
[31m-         set $memc_key $query_string;[m
[31m-         set $memc_exptime 300;[m
[31m-    [m
[31m-         memc_pass my_memcached;[m
[31m-     }[m
[31m-    [m
[31m-     location /foo {[m
[31m-         set $key $uri$args;[m
[31m-         srcache_fetch GET /memc $key;[m
[31m-         srcache_store PUT /memc $key;[m
[31m-         srcache_store_statuses 200 301 302;[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/drizzle_pass/echo/etc...[m
[31m-         # or even static files on the disk[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     location = /memc2 {[m
[31m-         internal;[m
[31m-    [m
[31m-         memc_connect_timeout 100ms;[m
[31m-         memc_send_timeout 100ms;[m
[31m-         memc_read_timeout 100ms;[m
[31m-         memc_ignore_client_abort on;[m
[31m-    [m
[31m-         set_unescape_uri $memc_key $arg_key;[m
[31m-         set $memc_exptime $arg_exptime;[m
[31m-    [m
[31m-         memc_pass unix:/tmp/memcached.sock;[m
[31m-     }[m
[31m-    [m
[31m-     location /bar {[m
[31m-         set_escape_uri $key $uri$args;[m
[31m-         srcache_fetch GET /memc2 key=$key;[m
[31m-         srcache_store PUT /memc2 key=$key&exptime=$srcache_expire;[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/drizzle_pass/echo/etc...[m
[31m-         # or even static files on the disk[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     map $request_method $skip_fetch {[m
[31m-         default     0;[m
[31m-         POST        1;[m
[31m-         PUT         1;[m
[31m-     }[m
[31m-    [m
[31m-     server {[m
[31m-         listen 8080;[m
[31m-    [m
[31m-         location /api/ {[m
[31m-             set $key "$uri?$args";[m
[31m-    [m
[31m-             srcache_fetch GET /memc $key;[m
[31m-             srcache_store PUT /memc $key;[m
[31m-    [m
[31m-             srcache_methods GET PUT POST;[m
[31m-             srcache_fetch_skip $skip_fetch;[m
[31m-    [m
[31m-             # proxy_pass/drizzle_pass/content_by_lua/echo/...[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module provides a transparent caching layer for arbitrary nginx locations (like those use an upstream or even serve static disk files). The caching behavior is mostly compatible with L<RFC 2616|http://www.ietf.org/rfc/rfc2616.txt>.[m
[31m-[m
[31m-Usually, L<memc-nginx-module|https://github.com/openresty/memc-nginx-module> is used together with this module to provide a concrete caching storage backend. But technically, any modules that provide a REST interface can be used as the fetching and storage subrequests used by this module.[m
[31m-[m
[31m-For main requests, the L<srcache_fetch> directive works at the end of the access phase, so the L<standard access module|http://nginx.org/en/docs/http/ngx_http_access_module.html>'s L<allow|http://nginx.org/en/docs/http/ngx_http_access_module.html#allow> and L<deny|http://nginx.org/en/docs/http/ngx_http_access_module.html#deny> direcives run I<before> ours, which is usually the desired behavior for security reasons.[m
[31m-[m
[31m-The workflow of this module looks like below:[m
[31m-[m
[31m-!L<srcache flowchart|http://agentzh.org/misc/image/srcache-flowchart.png "srcache flowchart">[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Subrequest caching[m
[31m-[m
[31m-For I<subrequests>, we explicitly B<disallow> the use of this module because it's too difficult to get right. There used to be an implementation but it was buggy and I finally gave up fixing it and abandoned it.[m
[31m-[m
[31m-However, if you're using L<lua-nginx-module|https://github.com/openresty/lua-nginx-module>, it's easy to do subrequest caching in Lua all by yourself. That is, first issue a subrequest to an L<memc-nginx-module|https://github.com/openresty/memc-nginx-module> location to do an explicit cache lookup, if cache hit, just use the cached data returned; otherwise, fall back to the true backend, and finally do a cache insertion to feed the data into the cache.[m
[31m-[m
[31m-Using this module for main request caching and Lua for subrequest caching is the approach that we're taking in our business. This hybrid solution works great in production.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Distributed Memcached Caching[m
[31m-[m
[31m-Here is a simple example demonstrating a distributed memcached caching mechanism built atop this module. Suppose we do have three different memcached nodes and we use simple modulo to hash our keys.[m
[31m-[m
[31m-[m
[31m-     http {[m
[31m-         upstream moon {[m
[31m-             server 10.62.136.54:11211;[m
[31m-             server unix:/tmp/memcached.sock backup;[m
[31m-         }[m
[31m-    [m
[31m-         upstream earth {[m
[31m-             server 10.62.136.55:11211;[m
[31m-         }[m
[31m-    [m
[31m-         upstream sun {[m
[31m-             server 10.62.136.56:11211;[m
[31m-         }[m
[31m-    [m
[31m-         upstream_list universe moon earth sun;[m
[31m-    [m
[31m-         server {[m
[31m-             memc_connect_timeout 100ms;[m
[31m-             memc_send_timeout 100ms;[m
[31m-             memc_read_timeout 100ms;[m
[31m-    [m
[31m-             location = /memc {[m
[31m-                 internal;[m
[31m-    [m
[31m-                 set $memc_key $query_string;[m
[31m-                 set_hashed_upstream $backend universe $memc_key;[m
[31m-                 set $memc_exptime 3600; # in seconds[m
[31m-                 memc_pass $backend;[m
[31m-             }[m
[31m-    [m
[31m-             location / {[m
[31m-                 set $key $uri;[m
[31m-                 srcache_fetch GET /memc $key;[m
[31m-                 srcache_store PUT /memc $key;[m
[31m-    [m
[31m-                 # proxy_pass/fastcgi_pass/content_by_lua/drizzle_pass/...[m
[31m-             }[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-Here's what is going on in the sample above:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-We first define three upstreams, C<moon>, C<earth>, and C<sun>. These are our three memcached servers.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-And then we group them together as an upstream list entity named C<universe> with the C<upstream_list> directive provided by L<set-misc-nginx-module|https://github.com/openresty/set-misc-nginx-module>.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-After that, we define an internal location named C</memc> for talking to the memcached cluster.[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-In this C</memc> location, we first set the C<$memc_key> variable with the query string (C<$args>), and then use the L<set_hashed_upstream|https://github.com/openresty/set-misc-nginx-module#set_hashed_upstream> directive to hash our L<$memc_key|https://github.com/openresty/memc-nginx-module#memc_key> over the upsteam list C<universe>, so as to obtain a concrete upstream name to be assigned to the variable C<$backend>.[m
[31m-[m
[31m-=item 5.[m
[31m-[m
[31m-We pass this C<$backend> variable into the L<memc_pass|https://github.com/openresty/memc-nginx-module#memc_pass> directive. The C<$backend> variable can hold a value among C<moon>, C<earth>, and C<sun>.[m
[31m-[m
[31m-=item 6.[m
[31m-[m
[31m-Also, we define the memcached caching expiration time to be 3600 seconds (i.e., an hour) by overriding the L<$memc_exptime|https://github.com/openresty/memc-nginx-module#memc_exptime> variable.[m
[31m-[m
[31m-=item 7.[m
[31m-[m
[31m-In our main public location C</>, we configure the C<$uri> variable as our cache key, and then configure L<srcache_fetch> for cache lookups and L<srcache_store> for cache updates. We're using two subrequests to our C</memc> location defined earlier in these two directives.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-One can use L<lua-nginx-module|https://github.com/openresty/lua-nginx-module>'s L<set_by_lua|https://github.com/openresty/lua-nginx-module#set_by_lua> or L<rewrite_by_lua|https://github.com/openresty/lua-nginx-module#rewrite_by_lua> directives to inject custom Lua code to compute the C<$backend> and/or C<$key> variables in the sample above.[m
[31m-[m
[31m-One thing that should be taken care of is that memcached does have restriction on key lengths, i.e., 250 bytes, so for keys that may be very long, one could use the L<set_md5|https://github.com/openresty/set-misc-nginx-module#set_md5> directive or its friends to pre-hash the key to a fixed-length digest before assigning it to C<$memc_key> in the C</memc> location or the like.[m
[31m-[m
[31m-Further, one can utilize the L<srcache_fetch_skip> and L<srcache_store_skip> directives to control what to cache and what not on a per-request basis, and Lua can also be used here in a similar way. So the possibility is really unlimited.[m
[31m-[m
[31m-To maximize speed, we often enable TCP (or Unix Domain Socket) connection pool for our memcached upstreams provided by L<HttpUpstreamKeepaliveModule|http://wiki.nginx.org/HttpUpstreamKeepaliveModule>, for example,[m
[31m-[m
[31m-[m
[31m-     upstream moon {[m
[31m-         server 10.62.136.54:11211;[m
[31m-         server unix:/tmp/memcached.sock backup;[m
[31m-         keepalive 10;[m
[31m-     }[m
[31m-[m
[31m-where we define a connection pool which holds up to 10 keep-alive connections (per nginx worker process) for our C<moon> upstream (cluster).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Caching with Redis[m
[31m-[m
[31m-One annoyance with Memcached backed caching is Memcached server's 1 MB value size limit. So it is often desired to use some more permissive backend storage services like Redis to serve as this module's backend.[m
[31m-[m
[31m-Here is a working example by using Redis:[m
[31m-[m
[31m-[m
[31m-     location /api {[m
[31m-         default_type text/css;[m
[31m-    [m
[31m-         set $key $uri;[m
[31m-         set_escape_uri $escaped_key $key;[m
[31m-    [m
[31m-         srcache_fetch GET /redis $key;[m
[31m-         srcache_store PUT /redis2 key=$escaped_key&exptime=120;[m
[31m-    [m
[31m-         # fastcgi_pass/proxy_pass/drizzle_pass/postgres_pass/echo/etc[m
[31m-     }[m
[31m-    [m
[31m-     location = /redis {[m
[31m-         internal;[m
[31m-    [m
[31m-         set_md5 $redis_key $args;[m
[31m-         redis_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-    [m
[31m-     location = /redis2 {[m
[31m-         internal;[m
[31m-    [m
[31m-         set_unescape_uri $exptime $arg_exptime;[m
[31m-         set_unescape_uri $key $arg_key;[m
[31m-         set_md5 $key;[m
[31m-    [m
[31m-         redis2_query set $key $echo_request_body;[m
[31m-         redis2_query expire $key $exptime;[m
[31m-         redis2_pass 127.0.0.1:6379;[m
[31m-     }[m
[31m-[m
[31m-This example makes use of the L<$echo_request_body|https://github.com/openresty/echo-nginx-module#echo_request_body> variable provided by L<echo-nginx-module|https://github.com/openresty/echo-nginx-module>. Note that you need the latest version of L<echo-nginx-module|https://github.com/openresty/echo-nginx-module>, C<v0.38rc2> because earlier versions may not work reliably.[m
[31m-[m
[31m-Also, you need both L<HttpRedisModule|http://wiki.nginx.org/HttpRedisModule> and L<redis2-nginx-module|https://github.com/openresty/redis2-nginx-module>. The former is used in the L<srcache_fetch> subrequest and the latter is used in the L<srcache_store> subrequest.[m
[31m-[m
[31m-The Nginx core also has a bug that could prevent L<redis2-nginx-module|https://github.com/openresty/redis2-nginx-module>'s pipelining support from working properly in certain extreme conditions. And the following patch fixes this:[m
[31m-[m
[31m-http://mailman.nginx.org/pipermail/nginx-devel/2012-March/002040.html[m
[31m-[m
[31m-Note that, however, if you are using the L<OpenResty|http://openresty.org/> 1.0.15.3 bundle or later, then you already have everything that you need here in the bundle.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Cache Key Preprocessing[m
[31m-[m
[31m-It is often desired to preprocess the cache key to exclude random noises that may hurt the cache hit rate. For example, random session IDs in the URI arguments are usually desired to get removed.[m
[31m-[m
[31m-Consider the following URI querystring[m
[31m-[m
[31m-    SID=BC3781C3-2E02-4A11-89CF-34E5CFE8B0EF&UID=44332&L=EN&M=1&H=1&UNC=0&SRC=LK&RT=62[m
[31m-[m
[31m-we want to remove the C<SID> and C<UID> arguments from it. It is easy to achieve if you use L<lua-nginx-module|https://github.com/openresty/lua-nginx-module> at the same time:[m
[31m-[m
[31m-[m
[31m-     location = /t {[m
[31m-         rewrite_by_lua '[m
[31m-             local args = ngx.req.get_uri_args()[m
[31m-             args.SID = nil[m
[31m-             args.UID = nil[m
[31m-             ngx.req.set_uri_args(args)[m
[31m-         ';[m
[31m-    [m
[31m-         echo $args;[m
[31m-     }[m
[31m-[m
[31m-Here we use the L<echo|https://github.com/openresty/echo-nginx-module#echo> directive from L<echo-nginx-module|https://github.com/openresty/echo-nginx-module> to dump out[m
[31m-the final value of L<$args|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_args> in the end. You can replace it with your[m
[31m-L<srcache-nginx-module|https://github.com/openresty/srcache-nginx-module> configurations and upstream configurations instead for[m
[31m-your case. Let's test this /t interface with curl:[m
[31m-[m
[31m-    $ curl 'localhost:8081/t?RT=62&SID=BC3781C3-2E02-4A11-89CF-34E5CFE8B0EF&UID=44332&L=EN&M=1&H=1&UNC=0&SRC=LK'[m
[31m-    M=1&UNC=0&RT=62&H=1&L=EN&SRC=LK[m
[31m-[m
[31m-It is worth mentioning that, if you want to retain the order of the URI[m
[31m-arguments, then you can do string substitutions on the value of L<$args|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_args>[m
[31m-directly, for example,[m
[31m-[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local args = ngx.var.args[m
[31m-            newargs, n, err = ngx.re.gsub(args, [[\b[SU]ID=[^&]*&?]], "", "jo")[m
[31m-            if n and n > 0 then[m
[31m-                ngx.var.args = newargs[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        echo $args;[m
[31m-    }[m
[31m-[m
[31m-Now test it with the original curl command again, we get exactly what[m
[31m-we would expect:[m
[31m-[m
[31m-    RT=62&L=EN&M=1&H=1&UNC=0&SRC=LK[m
[31m-[m
[31m-But for caching purposes, it's good to normalize the URI argument[m
[31m-order so that you can increase the cache hit rate. And the hash table[m
[31m-entry order used by LuaJIT or Lua can be used to normalize the order[m
[31m-as a nice side effect.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_fetch[m
[31m-[m
[31m-B<syntax:> I<srcache_fetch E<lt>methodE<gt> E<lt>uriE<gt> E<lt>argsE<gt>?>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<post-access>[m
[31m-[m
[31m-This directive registers an access phase handler that will issue an Nginx subrequest to lookup the cache.[m
[31m-[m
[31m-When the subrequest returns status code other than C<200>, than a cache miss is signaled and the control flow will continue to the later phases including the content phase configured by L<ngx_http_proxy_module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>, L<ngx_http_fastcgi_module|http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html>, and others. If the subrequest returns C<200 OK>, then a cache hit is signaled and this module will send the subrequest's response as the current main request's response to the client directly.[m
[31m-[m
[31m-This directive will always run at the end of the access phase, such that L<ngx_http_access_module|http://nginx.org/en/docs/http/ngx_http_access_module.html>'s L<allow|http://nginx.org/en/docs/http/ngx_http_access_module.html#allow> and L<deny|http://nginx.org/en/docs/http/ngx_http_access_module.html#deny> will always run I<before> this.[m
[31m-[m
[31m-You can use the L<srcache_fetch_skip> directive to disable cache look-up selectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_fetch_skip[m
[31m-[m
[31m-B<syntax:> I<srcache_fetch_skip E<lt>flagE<gt>>[m
[31m-[m
[31m-B<default:> I<srcache_fetch_skip 0>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<post-access>[m
[31m-[m
[31m-The C<< <flag> >> argument supports nginx variables. When this argument's value is not empty I<and> not equal to C<0>, then the fetching process will be unconditionally skipped.[m
[31m-[m
[31m-For example, to skip caching requests which have a cookie named C<foo> with the value C<bar>, we can write[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         set $key ...;[m
[31m-         set_by_lua $skip '[m
[31m-             if ngx.var.cookie_foo == "bar" then[m
[31m-                 return 1[m
[31m-             end[m
[31m-             return 0[m
[31m-         ';[m
[31m-    [m
[31m-         srcache_fetch_skip $skip;[m
[31m-         srcache_store_skip $skip;[m
[31m-    [m
[31m-         srcache_fetch GET /memc $key;[m
[31m-         srcache_store GET /memc $key;[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/content_by_lua/...[m
[31m-     }[m
[31m-[m
[31m-where L<lua-nginx-module|https://github.com/openresty/lua-nginx-module> is used to calculate the value of the C<$skip> variable at the (earlier) rewrite phase. Similarly, the C<$key> variable can be computed by Lua using the L<set_by_lua|https://github.com/openresty/lua-nginx-module#set_by_lua> or L<rewrite_by_lua|https://github.com/openresty/lua-nginx-module#rewrite_by_lua> directive too.[m
[31m-[m
[31m-The standard L<map|http://nginx.org/en/docs/http/ngx_http_map_module.html#map> directive can also be used to compute the value of the C<$skip> variable used in the sample above:[m
[31m-[m
[31m-[m
[31m-     map $cookie_foo $skip {[m
[31m-         default     0;[m
[31m-         bar         1;[m
[31m-     }[m
[31m-[m
[31m-but your L<map|http://nginx.org/en/docs/http/ngx_http_map_module.html#map> statement should be put into the C<http> config block in your C<nginx.conf> file though.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store[m
[31m-[m
[31m-B<syntax:> I<srcache_store E<lt>methodE<gt> E<lt>uriE<gt> E<lt>argsE<gt>?>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-filter>[m
[31m-[m
[31m-This directive registers an output filter handler that will issue an Nginx subrequest to save the response of the current main request into a cache backend. The status code of the subrequest will be ignored.[m
[31m-[m
[31m-You can use the L<srcache_store_skip> and L<srcache_store_max_size> directives to disable caching for certain requests in case of a cache miss.[m
[31m-[m
[31m-Since the C<v0.12rc7> release, both the response status line, response headers, and response bodies will be put into the cache. By default, the following special response headers will not be cached:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Connection[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Keep-Alive[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Proxy-Authenticate[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Proxy-Authorization[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-TE[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Trailers[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Transfer-Encoding[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Upgrade[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Set-Cookie[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-You can use the L<srcache_store_pass_header> and/or L<srcache_store_hide_header> directives to control what headers to cache and what not.[m
[31m-[m
[31m-The original response's data chunks get emitted as soon as [m
[31m-they arrive. C<srcache_store> just copies and collects the data in an output filter without postponing them from being sent downstream.[m
[31m-[m
[31m-But please note that even though all the response data will be sent immediately, the current Nginx request lifetime will not finish until the srcache_store subrequest completes. That means a delay in closing the TCP connection on the server side (when HTTP keepalive is disabled, but proper HTTP clients should close the connection actively on the client side, which adds no extra delay or other issues at all) or serving the next request sent on the same TCP connection (when HTTP keepalive is in action).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_max_size[m
[31m-[m
[31m-B<syntax:> I<srcache_store_max_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<srcache_store_max_size 0>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-When the response body length is exceeding this size, this module will not try to store the response body into the cache using the subrequest template that is specified in L<srcache_store>.[m
[31m-[m
[31m-This is particular useful when using cache storage backend that does have a hard upper limit on the input data. For example, for Memcached server, the limit is usually C<1 MB>.[m
[31m-[m
[31m-When C<0> is specified (the default value), there's no limit check at all.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_skip[m
[31m-[m
[31m-B<syntax:> I<srcache_store_skip E<lt>flagE<gt>>[m
[31m-[m
[31m-B<default:> I<srcache_store_skip 0>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-The C<< <flag> >> argument supports Nginx variables. When this argument's value is not empty I<and> not equal to C<0>, then the storing process will be unconditionally skipped.[m
[31m-[m
[31m-Starting from the C<v0.25> release, the C<< <flag> >> expression (possibly containing Nginx variables) can be evaluated up to twice: the first time is right after the response header is being sent and when the C<< <flag> >> expression is not evaluated to true values it will be evaluated again right after the end of the response body data stream is seen. Before C<v0.25>, only the first time evaluation is performed.[m
[31m-[m
[31m-Here's an example using Lua to set $nocache to avoid storing URIs that contain the string "/tmp":[m
[31m-[m
[31m-[m
[31m-     set_by_lua $nocache '[m
[31m-         if string.match(ngx.var.uri, "/tmp") then[m
[31m-             return 1[m
[31m-         end[m
[31m-         return 0';[m
[31m-    [m
[31m-     srcache_store_skip $nocache;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_statuses[m
[31m-[m
[31m-B<syntax:> I<srcache_store_statuses E<lt>status1E<gt> E<lt>status2E<gt> ..>[m
[31m-[m
[31m-B<default:> I<srcache_store_statuses 200 301 302>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-This directive controls what responses to store to the cache according to their status code.[m
[31m-[m
[31m-By default, only C<200>, C<301>, and C<302> responses will be stored to cache and any other responses will skip L<srcache_store>.[m
[31m-[m
[31m-You can specify arbitrary positive numbers for the response status code that you'd like to cache, even including error code like C<404> and C<503>. For example:[m
[31m-[m
[31m-[m
[31m-     srcache_store_statuses 200 201 301 302 404 503;[m
[31m-[m
[31m-At least one argument should be given to this directive.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.13rc2> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_ranges[m
[31m-[m
[31m-B<syntax:> I<srcache_store_ranges on|off>[m
[31m-[m
[31m-B<default:> I<srcache_store_ranges off>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-body-filter>[m
[31m-[m
[31m-When this directive is turned on (default to C<off>), L<srcache_store> will also store 206 Partial Content responses generated by the standard C<ngx_http_range_filter_module>. If you turn this directive on, you MUST add C<$http_range> to your cache keys. For example,[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         set $key "$uri$args$http_range";[m
[31m-         srcache_fetch GET /memc $key;[m
[31m-         srcache_store PUT /memc $key;[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.27> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_header_buffer_size[m
[31m-[m
[31m-B<syntax:> I<srcache_header_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<srcache_header_buffer_size 4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-This directive controles the header buffer when serializing response headers for L<srcache_store>. The default size is the page size, usually C<4k> or C<8k> depending on specific platforms.[m
[31m-[m
[31m-Note that the buffer is not used to hold all the response headers, but just each individual header. So the buffer is merely needed to be big enough to hold the longest response header.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_hide_header[m
[31m-[m
[31m-B<syntax:> I<srcache_store_hide_header E<lt>headerE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-By default, this module caches all the response headers except the following ones:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Connection[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Keep-Alive[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Proxy-Authenticate[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Proxy-Authorization[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-TE[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Trailers[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Transfer-Encoding[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Upgrade[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Set-Cookie[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-You can hide even more response headers from L<srcache_store> by listing their names (case-insensitive) by means of this directive. For examples,[m
[31m-[m
[31m-[m
[31m-     srcache_store_hide_header X-Foo;[m
[31m-     srcache_store_hide_header Last-Modified;[m
[31m-[m
[31m-Multiple occurrences of this directive are allowed in a single location.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-See also L<srcache_store_pass_header>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_pass_header[m
[31m-[m
[31m-B<syntax:> I<srcache_store_pass_header E<lt>headerE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-By default, this module caches all the response headers except the following ones:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Connection[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Keep-Alive[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Proxy-Authenticate[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Proxy-Authorization[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-TE[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Trailers[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Transfer-Encoding[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Upgrade[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Set-Cookie[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-You can force L<srcache_store> to store one or more of these response headers from L<srcache_store> by listing their names (case-insensitive) by means of this directive. For examples,[m
[31m-[m
[31m-[m
[31m-     srcache_store_pass_header Set-Cookie;[m
[31m-     srcache_store_pass_header Proxy-Autenticate;[m
[31m-[m
[31m-Multiple occurrences of this directive are allowed in a single location.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-See also L<srcache_store_hide_header>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_methods[m
[31m-[m
[31m-B<syntax:> I<srcache_methods E<lt>methodE<gt>...>[m
[31m-[m
[31m-B<default:> I<srcache_methods GET HEAD>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-B<phase:> I<post-access, output-header-filter>[m
[31m-[m
[31m-This directive specifies HTTP request methods that are considered by either L<srcache_fetch> or L<srcache_store>. HTTP request methods not listed will be skipped completely from the cache.[m
[31m-[m
[31m-The following HTTP methods are allowed: C<GET>, C<HEAD>, C<POST>, C<PUT>, and C<DELETE>. The C<GET> and C<HEAD> methods are always implicitly included in the list regardless of their presence in this directive.[m
[31m-[m
[31m-Note that since the C<v0.17> release C<HEAD> requests are always skipped by L<srcache_store> because their responses never carry a response body.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_ignore_content_encoding[m
[31m-[m
[31m-B<syntax:> I<srcache_ignore_content_encoding on|off>[m
[31m-[m
[31m-B<default:> I<srcache_ignore_content_encoding off>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-When this directive is turned C<off> (which is the default), non-empty C<Content-Encoding> response header will cause L<srcache_store> skip storing the whole response into the cache and issue a warning into nginx's C<error.log> file like this:[m
[31m-[m
[31m-    [warn] 12500#0: *1 srcache_store skipped due to response header "Content-Encoding: gzip"[m
[31m-                (maybe you forgot to disable compression on the backend?)[m
[31m-[m
[31m-Turning on this directive will ignore the C<Content-Encoding> response header and store the response as usual (and also without warning).[m
[31m-[m
[31m-It's recommended to always disable gzip/deflate compression on your backend server by specifying the following line in your C<nginx.conf> file:[m
[31m-[m
[31m-[m
[31m-     proxy_set_header  Accept-Encoding  "";[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_request_cache_control[m
[31m-[m
[31m-B<syntax:> I<srcache_request_cache_control on|off>[m
[31m-[m
[31m-B<default:> I<srcache_request_cache_control off>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-B<phase:> I<post-access, output-header-filter>[m
[31m-[m
[31m-When this directive is turned C<on>, the request headers C<Cache-Control> and C<Pragma> will be honored by this module in the following ways:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-L<srcache_fetch>, i.e., the cache lookup operation, will be skipped when request headers C<Cache-Control: no-cache> and/or C<Pragma: no-cache> are present.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-L<srcache_store>, i.e., the cache store operation, will be skipped when the request header C<Cache-Control: no-store> is specified.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Turning off this directive will disable this functionality and is considered safer for busy sites mainly relying on cache for speed.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-See also L<srcache_response_cache_control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_response_cache_control[m
[31m-[m
[31m-B<syntax:> I<srcache_response_cache_control on|off>[m
[31m-[m
[31m-B<default:> I<srcache_response_cache_control on>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-When this directive is turned C<on>, the response headers C<Cache-Control> and C<Expires> will be honored by this module in the following ways:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<Cache-Control: private> skips L<srcache_store>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<Cache-Control: no-store> skips L<srcache_store>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<Cache-Control: no-cache> skips L<srcache_store>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<Cache-Control: max-age=0> skips L<srcache_store>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and C<< Expires: <date-no-more-recently-than-now> >> skips L<srcache_store>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This directive takes priority over the L<srcache_store_no_store>, L<srcache_store_no_cache>, and L<srcache_store_private> directives.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-See also L<srcache_request_cache_control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_no_store[m
[31m-[m
[31m-B<syntax:> I<srcache_store_no_store on|off>[m
[31m-[m
[31m-B<default:> I<srcache_store_no_store off>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Turning this directive on will force responses with the header C<Cache-Control: no-store> to be stored into the cache when L<srcache_response_cache_control> is turned C<on> I<and> other conditions are met. Default to C<off>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_no_cache[m
[31m-[m
[31m-B<syntax:> I<srcache_store_no_cache on|off>[m
[31m-[m
[31m-B<default:> I<srcache_store_no_cache off>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Turning this directive on will force responses with the header C<Cache-Control: no-cache> to be stored into the cache when L<srcache_response_cache_control> is turned C<on> I<and> other conditions are met. Default to C<off>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_store_private[m
[31m-[m
[31m-B<syntax:> I<srcache_store_private on|off>[m
[31m-[m
[31m-B<default:> I<srcache_store_private off>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Turning this directive on will force responses with the header C<Cache-Control: private> to be stored into the cache when L<srcache_response_cache_control> is turned C<on> I<and> other conditions are met. Default to C<off>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_default_expire[m
[31m-[m
[31m-B<syntax:> I<srcache_default_expire E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<srcache_default_expire 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-This directive controls the default expiration time period that is allowed for the L<$srcache_expire> variable value when neither C<Cache-Control: max-age=N> nor C<Expires> are specified in the response headers.[m
[31m-[m
[31m-The C<< <time> >> argument values are in seconds by default. But it's wise to always explicitly specify the time unit to avoid confusion. Time units supported are "s"(seconds), "ms"(milliseconds), "y"(years), "M"(months), "w"(weeks), "d"(days), "h"(hours), and "m"(minutes). For example,[m
[31m-[m
[31m-[m
[31m-     srcache_default_expire 30m; # 30 minutes[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-The semantics of a zero expiration time depends on the actual cache backend storage you are currently using, which is agnostic to this[m
[31m-module. In the case of memcached, for example, zero expiration times mean that the item will never expire.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 srcache_max_expire[m
[31m-[m
[31m-B<syntax:> I<srcache_max_expire E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<srcache_max_expire 0>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-This directive controls the maximal expiration time period that is allowed for the L<$srcache_expire> variable value. This setting takes priority over other calculating methods.[m
[31m-[m
[31m-The C<< <time> >> argument values are in seconds by default. But it's wise to always explicitly specify the time unit to avoid confusion. Time units supported are "s"(seconds), "ms"(milliseconds), "y"(years), "M"(months), "w"(weeks), "d"(days), "h"(hours), and "m"(minutes). For example,[m
[31m-[m
[31m-[m
[31m-     srcache_max_expire 2h;  # 2 hours[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-When C<0> is specified, which is the default setting, then there will be I<no> limit at all.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $srcache_expire[m
[31m-[m
[31m-B<type:> I<integer>[m
[31m-[m
[31m-B<cacheable:> I<no>[m
[31m-[m
[31m-B<writable:> I<no>[m
[31m-[m
[31m-This Nginx variable gives the recommended expiration time period (in seconds) for the current response being stored into the cache. The algorithm of computing the value is as follows:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-When the response header C<Cache-Control: max-age=N> is specified, then C<N> will be used as the expiration time,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-otherwise if the response header C<Expires> is specified, then the expiration time will be obtained by subtracting the current time stamp from the time specified in the C<Expires> header,[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-when neither C<Cache-Control: max-age=N> nor C<Expires> headers are specified, use the value specified in the L<srcache_default_expire> directive.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The final value of this variable will be the value specified by the L<srcache_max_expire> directive if the value obtained in the algorithm above exceeds the maximal value (if any).[m
[31m-[m
[31m-You don't have to use this variable for the expiration time.[m
[31m-[m
[31m-This variable was first introduced in the C<v0.12rc7> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $srcache_fetch_status[m
[31m-[m
[31m-B<type:> I<string>[m
[31m-[m
[31m-B<cacheable:> I<no>[m
[31m-[m
[31m-B<writable:> I<no>[m
[31m-[m
[31m-This Nginx variable is evaluated to the status of the "fetch" phase for the caching system. Three values are possible, C<HIT>, C<MISS>, and C<BYPASS>.[m
[31m-[m
[31m-When the "fetch" subrequest returns status code other than C<200> or its response data is not well-formed, then this variable is evaluated to the value C<MISS>.[m
[31m-[m
[31m-The value of this variable is only meaningful after the C<access> request processing phase, or C<BYPASS> is always given.[m
[31m-[m
[31m-This variable was first introduced in the C<v0.14> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $srcache_store_status[m
[31m-[m
[31m-B<type:> I<string>[m
[31m-[m
[31m-B<cacheable:> I<no>[m
[31m-[m
[31m-B<writable:> I<no>[m
[31m-[m
[31m-This Nginx variable gives the current caching status for the "store" phase. Two possible values, C<STORE> and C<BYPASS> can be obtained.[m
[31m-[m
[31m-Because the responses for the "store" subrequest are always discarded, so the value of this variable will always be C<STORE> as long as the "store" subrequest is actually issued.[m
[31m-[m
[31m-The value of this variable is only meaningful at least when the request headers of the current (main) request are being sent. The final result can only be obtained after all the response body has been sent if the C<Content-Length> response header is not specified for the main request.[m
[31m-[m
[31m-This variable was first introduced in the C<v0.14> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-On certain systems, enabling aio and/or sendfile may stop L<srcache_store> from working. You can disable them in the locations configured by L<srcache_store>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<srcache_store> directive can not be used to capture the responses generated by L<echo-nginx-module|https://github.com/openresty/echo-nginx-module>'s subrequest directivees like L<echo_subrequest_async|https://github.com/openresty/echo-nginx-module#echo_subrequest_async> and L<echo_location|https://github.com/openresty/echo-nginx-module#echo_location>. You are recommended to use HttpLuaModule to initiate and capture subrequests, which should work with L<srcache_store>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Caveats[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-It is recommended to disable your backend server's gzip compression and use nginx's L<ngx_http_gzip_module|http://nginx.org/en/docs/http/ngx_http_gzip_module.html> to do the job. In case of L<ngx_http_proxy_module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>, you can use the following configure setting to disable backend gzip compression:[m
[31m-[m
[31m-     proxy_set_header  Accept-Encoding  "";[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Do I<not> use L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s L<if|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if> directive in the same location as this module's, because "L<if|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if> is evil". Instead, use L<ngx_http_map_module|http://nginx.org/en/docs/http/ngx_http_map_module.html> or L<lua-nginx-module|https://github.com/openresty/lua-nginx-module> combined with this module's L<srcache_store_skip> and/or L<srcache_fetch_skip> directives. For example:[m
[31m-[m
[31m-     map $request_method $skip_fetch {[m
[31m-         default     0;[m
[31m-         POST        1;[m
[31m-         PUT         1;[m
[31m-     }[m
[31m-    [m
[31m-     server {[m
[31m-         listen 8080;[m
[31m-    [m
[31m-         location /api/ {[m
[31m-             set $key "$uri?$args";[m
[31m-    [m
[31m-             srcache_fetch GET /memc $key;[m
[31m-             srcache_store PUT /memc $key;[m
[31m-    [m
[31m-             srcache_methods GET PUT POST;[m
[31m-             srcache_fetch_skip $skip_fetch;[m
[31m-    [m
[31m-             # proxy_pass/drizzle_pass/content_by_lua/echo/...[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Trouble Shooting[m
[31m-[m
[31m-To debug issues, you should always check your Nginx C<error.log> file first. If no error messages are printed, you need to enable the Nginx debugging logs to get more details, as explained in L<debugging log|http://nginx.org/en/docs/debugging_log.html>.[m
[31m-[m
[31m-Several common pitfalls for beginners:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original response carries a C<Cache-Control> header that explicitly disables caching and you do not configure directives like L<srcache_response_cache_control>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original response is already gzip compressed, which is not cached by default (see L<srcache_ignore_content_encoding>).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Memcached might return C<CLIENT_ERROR bad command line format> when using a too long key (250 chars as of version 1.4.25). It is thus safer to use C<set_md5 $key $uri$args;> instead of C<set $key $uri$args;>. The C<set_md5> directive (and more) is available from L<OpenResty's set-misc module|https://github.com/openresty/set-misc-nginx-module>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is recommended to install this module as well as the Nginx core and many other goodies via the L<OpenResty bundle|http://openresty.org>. It is the easiest way and most safe way to set things up. See OpenResty's L<installation instructions|http://openresty.org/#Installation> for details.[m
[31m-[m
[31m-Alternatively, you can build Nginx with this module all by yourself:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org>, for example, the version 1.9.15 (see L<Nginx Compatibility>),[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and then apply the patch to your nginx source tree that fixes an important bug in the mainline Nginx core: E<lt>https://raw.github.com/openresty/openresty/master/patches/nginx-1.4.3-upstream_truncation.patchE<gt> (you do NOT need this patch if you are using nginx 1.5.3 and later versions.)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-after that, download the latest version of the release tarball of this module from srcache-nginx-module L<file list|https://github.com/openresty/srcache-nginx-module/tags>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and finally build the Nginx source with this module[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-          --add-module=/path/to/srcache-nginx-module[m
[31m-    [m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_srcache_filter_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.9.x (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.8.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.5.x (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.4.x (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.3.x (last tested: 1.3.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.2.x (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (last tested: 1.0.11)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.9.x (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x E<gt>= 0.8.54 (last tested: 0.8.54)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.7.x, 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.44 does not work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/srcache-nginx-module/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>srcache-nginx-module|https://github.com/openresty/srcache-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|https://github.com/openresty/srcache-nginx-module/tree/master/test/t> are L<declarative|https://github.com/openresty/srcache-nginx-module/blob/master/test/t/main-req.t> too. Thanks to the L<Test::Nginx|http://search.cpan.org/perldoc?Test::Base> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-srcache-module:$PATH prove -r t[m
[31m-[m
[31m-You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary.[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-Some parts of the test suite requires modules L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>, L<echo-nginx-module|https://github.com/openresty/echo-nginx-module>, L<rds-json-nginx-module|https://github.com/openresty/rds-json-nginx-module>, and L<drizzle-nginx-module|https://github.com/openresty/drizzle-nginx-module> to be enabled as well when building Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add gzip compression and decompression support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add new nginx variable C<$srcache_key> and new directives C<srcache_key_ignore_args>, C<srcache_key_filter_args>, and C<srcache_key_sort_args>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the author or just ask for a commit bit to the source repository on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2010-2016, Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<memc-nginx-module|https://github.com/openresty/memc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-nginx-module|https://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set-misc-nginx-module|https://github.com/openresty/set-misc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<openresty bundle|http://openresty.org>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/xss-nginx-module-0.05/xss-nginx-module-0.05.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/xss-nginx-module-0.05/xss-nginx-module-0.05.pod[m
[1mdeleted file mode 100644[m
[1mindex 7a16cb2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/pod/xss-nginx-module-0.05/xss-nginx-module-0.05.pod[m
[1m+++ /dev/null[m
[36m@@ -1,341 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-xss-nginx-module - Native cross-site scripting support in nginx[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    # accessing /foo?callback=process gives the response[m
[31m-    # body "process(...);" (without quotes) where "..."[m
[31m-    # is the original response body of the /foo location.[m
[31m-    server {[m
[31m-        location /foo {[m
[31m-            # your content handler goes here...[m
[31m-    [m
[31m-            xss_get on;[m
[31m-            xss_callback_arg 'callback';[m
[31m-            xss_input_types 'application/json'; # default[m
[31m-            xss_output_type 'application/x-javascript'; # default[m
[31m-        }[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module adds cross-site AJAX support to nginx. Currently only[m
[31m-cross-site GET is supported. But cross-site POST will be added[m
[31m-in the future.[m
[31m-[m
[31m-The cross-site GET is currently implemented as JSONP[m
[31m-(or "JSON with padding"). See http://en.wikipedia.org/wiki/JSON#JSONP[m
[31m-for more details.[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xss_get[m
[31m-[m
[31m-B<syntax:> I<xss_get on | off>[m
[31m-[m
[31m-B<default:> I<xss_get off>[m
[31m-[m
[31m-B<context:> I<http, server, location, if location>[m
[31m-[m
[31m-Enables JSONP support for GET requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xss_callback_arg[m
[31m-[m
[31m-B<syntax:> I<xss_callback_arg E<lt>nameE<gt>>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<context:> I<http, http, location, if location>[m
[31m-[m
[31m-Specifies the JavaScript callback function name[m
[31m-used in the responses.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-then[m
[31m-[m
[31m-[m
[31m-    GET /foo?c=blah[m
[31m-[m
[31m-returns[m
[31m-[m
[31m-[m
[31m-    blah(...);[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xss_override_status[m
[31m-[m
[31m-B<syntax:> I<xss_override_status on | off>[m
[31m-[m
[31m-B<default:> I<xss_check_status on>[m
[31m-[m
[31m-B<context:> I<http, server, location, if location>[m
[31m-[m
[31m-Specifies whether to override 30x, 40x and 50x status to 200[m
[31m-when the response is actually being processed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xss_check_status[m
[31m-[m
[31m-B<syntax:> I<xss_check_status on | off>[m
[31m-[m
[31m-B<default:> I<xss_check_status on>[m
[31m-[m
[31m-B<context:> I<http, server, location, if location>[m
[31m-[m
[31m-By default, ngx_xss only process responses with the status code[m
[31m-200 or 201.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xss_input_types[m
[31m-[m
[31m-B<syntax:> I<xss_input_types [mime-type]...>[m
[31m-[m
[31m-B<default:> I<xss_input_types application/json>[m
[31m-[m
[31m-B<context:> I<http, server, location, if location>[m
[31m-[m
[31m-Only processes the responses of the specified MIME types.[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-[m
[31m-    xss_input_types application/json text/plain;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ngx_xss will not work with L<ngx_echo|https://github.com/openresty/echo-nginx-module>'s[m
[31m-subrequest interfaces, due to the underlying[m
[31m-limitations imposed by subrequests' "postponed chain" mechanism in the nginx core.[m
[31m-The standard ngx_addition module also falls into this category.  You're recommended,[m
[31m-however, to use L<ngx_lua|https://github.com/openresty/lua-nginx-module> as the content[m
[31m-handler to issue subrequests I<and> ngx_xss[m
[31m-to do JSONP, because L<ngx_lua|https://github.com/openresty/lua-nginx-module>'s[m
[31m-L<ngx.location.capture()|https://github.com/openresty/lua-nginx-module#ngxlocationcapture>[m
[31m-interface does not utilize the "postponed chain" mechanism, thus getting out of this[m
[31m-limitation. We're taking this approach in production and it works great.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Trouble Shooting[m
[31m-[m
[31m-Use the "info" error log level (or lower) to get more[m
[31m-diagnostics when things go wrong.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<ngx_openresty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing ngx_openresty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.7.10 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     $ wget 'http://nginx.org/download/nginx-1.7.10.tar.gz'[m
[31m-     $ tar -xzvf nginx-1.7.10.tar.gz[m
[31m-     $ cd nginx-1.7.10/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     $ ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/rds-json-nginx-module[m
[31m-    [m
[31m-     $ make -j2[m
[31m-     $ make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<xss-nginx-module file list|https://github.com/openresty/xss-nginx-module/tags>.[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<ngx_openresty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x> (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x> (last tested: 1.4.3)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x> (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x> (last tested: 1.0.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x> (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x> (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x> E<gt>= 0.7.30 (last tested: 0.7.67)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.30 does not[m
[31m-work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add cross-site POST support.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail@comE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-The implementation of the builtin connection pool has borrowed[m
[31m-a lot of code from Maxim Dounin's upstream_keepalive module.[m
[31m-This part of code is copyrighted by Maxim Dounin.[m
[31m-[m
[31m-This module is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2009-2015 by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Introduction to JSONP|http://en.wikipedia.org/wiki/JSONP>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex b2d368a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,73 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-go[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/util.h[m
[31m-src/util.c[m
[31m-src/processor.h[m
[31m-src/processor.c[m
[31m-src/rds.h[m
[31m-src/utils.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-util/bench[m
[31m-pack[m
[31m-restart[m
[31m-misc/[m
[31m-t/servroot/[m
[31m-all[m
[31m-build1[0-9][m
[31m-buildroot/[m
[31m-a.pl[m
[31m-*.plist[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/config[m
[1mdeleted file mode 100644[m
[1mindex ec13e3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/config[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_rds_csv_filter_module[m
[31m-HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_rds_csv_filter_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_http_rds_csv_filter_module.c $ngx_addon_dir/src/ngx_http_rds_csv_processor.c $ngx_addon_dir/src/ngx_http_rds_csv_util.c $ngx_addon_dir/src/ngx_http_rds_csv_output.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ddebug.h $ngx_addon_dir/src/resty_dbd_stream.h $ngx_addon_dir/src/ngx_http_rds_csv_filter_module.h $ngx_addon_dir/src/ngx_http_rds_csv_processor.h $ngx_addon_dir/src/ngx_http_rds_csv_util.h $ngx_addon_dir/src/ngx_http_rds.h $ngx_addon_dir/src/resty_dbd_stream.h $ngx_addon_dir/src/ngx_http_rds_csv_output.h $ngx_addon_dir/src/ngx_http_rds_utils.h"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 5c15a74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   define dd_dump_chain_size() { \[m
[31m-        int              n; \[m
[31m-        ngx_chain_t     *cl; \[m
[31m-            \[m
[31m-        for (n = 0, cl = ctx->out; cl; cl = cl->next, n++) { \[m
[31m-        } \[m
[31m-            \[m
[31m-        dd("chain size: %d", n); \[m
[31m-    }[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "rds-csv *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   define dd_dump_chain_size()[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds.h[m
[1mdeleted file mode 100644[m
[1mindex 2e3d878..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds.h[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_H[m
[31m-#define NGX_HTTP_RDS_H[m
[31m-[m
[31m-[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint16_t        std_errcode;[m
[31m-    uint16_t        drv_errcode;[m
[31m-    ngx_str_t       errstr;[m
[31m-[m
[31m-    uint64_t        affected_rows;[m
[31m-    uint64_t        insert_id;[m
[31m-    uint16_t        col_count;[m
[31m-[m
[31m-} ngx_http_rds_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_rds_column_s {[m
[31m-    rds_col_type_t      std_type;[m
[31m-    uint16_t            drv_type;[m
[31m-[m
[31m-    ngx_str_t           name;[m
[31m-[m
[31m-} ngx_http_rds_column_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 7bde99c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,518 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_csv_filter_module.h"[m
[31m-#include "ngx_http_rds_csv_util.h"[m
[31m-#include "ngx_http_rds_csv_processor.h"[m
[31m-#include "ngx_http_rds_csv_output.h"[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_rds_csv_content_type  "text/csv"[m
[31m-#define ngx_http_rds_csv_row_term  "\r\n"[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_rds_csv_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt  ngx_http_rds_csv_next_header_filter;[m
[31m-ngx_http_output_body_filter_pt    ngx_http_rds_csv_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_rds_csv_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rds_csv_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_rds_csv_filter_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rds_csv_row_terminator(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_rds_csv_field_separator(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_rds_csv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_rds_csv_create_main_conf(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_rds_csv_commands[] = {[m
[31m-[m
[31m-    { ngx_string("rds_csv"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_FLAG,[m
[31m-      ngx_http_rds_csv,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_csv_loc_conf_t, enabled),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_csv_row_terminator"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_http_rds_csv_row_terminator,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_csv_loc_conf_t, row_term),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_csv_field_separator"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_http_rds_csv_field_separator,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_csv_field_name_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_csv_loc_conf_t, field_name_header),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_csv_content_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_csv_loc_conf_t, content_type),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_csv_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_csv_loc_conf_t, buf_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_rds_csv_filter_module_ctx = {[m
[31m-    NULL,                                 /* preconfiguration */[m
[31m-    ngx_http_rds_csv_filter_init,         /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_rds_csv_create_main_conf,    /* create main configuration */[m
[31m-    NULL,                                 /* init main configuration */[m
[31m-[m
[31m-    NULL,                                 /* create server configuration */[m
[31m-    NULL,                                 /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_rds_csv_create_loc_conf,     /* create location configuration */[m
[31m-    ngx_http_rds_csv_merge_loc_conf       /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_rds_csv_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_rds_csv_filter_module_ctx,  /* module context */[m
[31m-    ngx_http_rds_csv_commands,            /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_csv_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_rds_csv_ctx_t          *ctx;[m
[31m-    ngx_http_rds_csv_loc_conf_t     *conf;[m
[31m-    size_t                           len;[m
[31m-    u_char                          *p;[m
[31m-[m
[31m-    /* XXX maybe we can generate stub JSON strings like[m
[31m-     * {"errcode":403,"error":"Permission denied"}[m
[31m-     * for HTTP error pages? */[m
[31m-    if ((r->headers_out.status < NGX_HTTP_OK)[m
[31m-        || (r->headers_out.status >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-        || (r->headers_out.status == NGX_HTTP_NO_CONTENT)[m
[31m-        || (r->headers_out.status == NGX_HTTP_RESET_CONTENT))[m
[31m-    {[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-        dd("status is not OK: %d, skipping", (int) r->headers_out.status);[m
[31m-[m
[31m-        return ngx_http_rds_csv_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    /* r->headers_out.status = 0; */[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    if (!conf->enabled) {[m
[31m-        return ngx_http_rds_csv_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_rds_csv_test_content_type(r) != NGX_OK) {[m
[31m-        return ngx_http_rds_csv_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (conf->content_type.len == sizeof(ngx_http_rds_csv_content_type) - 1[m
[31m-        && ngx_strncmp(conf->content_type.data, ngx_http_rds_csv_content_type,[m
[31m-                       sizeof(ngx_http_rds_csv_content_type) - 1) == 0)[m
[31m-    {[m
[31m-        /* MIME type is text/csv, we process Content-Type[m
[31m-         * according to RFC 4180 */[m
[31m-[m
[31m-        len = sizeof(ngx_http_rds_csv_content_type) - 1[m
[31m-              + sizeof("; header=") - 1;[m
[31m-[m
[31m-        if (conf->field_name_header) {[m
[31m-            len += sizeof("presence") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            len += sizeof("absence") - 1;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_palloc(r->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type.len = len;[m
[31m-        r->headers_out.content_type_len = len;[m
[31m-[m
[31m-        r->headers_out.content_type.data = p;[m
[31m-[m
[31m-        p = ngx_copy(p, conf->content_type.data, conf->content_type.len);[m
[31m-[m
[31m-        if (conf->field_name_header) {[m
[31m-            p = ngx_copy_literal(p, "; header=presence");[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_copy_literal(p, "; header=absence");[m
[31m-        }[m
[31m-[m
[31m-        if (p - r->headers_out.content_type.data != (ssize_t) len) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_csv: content type buffer error: %uz != %uz",[m
[31m-                          (size_t) (p - r->headers_out.content_type.data),[m
[31m-                          len);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* custom MIME-type, we just pass it through */[m
[31m-[m
[31m-        r->headers_out.content_type = conf->content_type;[m
[31m-        r->headers_out.content_type_len = conf->content_type.len;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_rds_csv_ctx_t));[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->tag = (ngx_buf_tag_t) &ngx_http_rds_csv_filter_module;[m
[31m-[m
[31m-    ctx->state = state_expect_header;[m
[31m-[m
[31m-    ctx->header_sent = 0;[m
[31m-[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    /* set by ngx_pcalloc[m
[31m-     *      ctx->out       = NULL[m
[31m-     *      ctx->busy_bufs = NULL[m
[31m-     *      ctx->free_bufs = NULL[m
[31m-     *      ctx->cached = (ngx_buf_t) 0[m
[31m-     *      ctx->postponed = (ngx_buf_t) 0[m
[31m-     *      ctx->avail_out = 0[m
[31m-     *      ctx->col_names = NULL[m
[31m-     *      ctx->col_count = 0[m
[31m-     *      ctx->cur_col = 0[m
[31m-     *      ctx->field_offset = 0[m
[31m-     *      ctx->field_total = 0[m
[31m-     *      ctx->field_data_rest = 0[m
[31m-     */[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    /* we do postpone the header sending to the body filter */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_csv_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_rds_csv_ctx_t    *ctx;[m
[31m-    ngx_int_t                   rc;[m
[31m-[m
[31m-    if (in == NULL || r->header_only) {[m
[31m-        return ngx_http_rds_csv_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_rds_csv_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    switch (ctx->state) {[m
[31m-    case state_expect_header:[m
[31m-        rc = ngx_http_rds_csv_process_header(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_expect_col:[m
[31m-        rc = ngx_http_rds_csv_process_col(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_expect_row:[m
[31m-        rc = ngx_http_rds_csv_process_row(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_expect_field:[m
[31m-        rc = ngx_http_rds_csv_process_field(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_expect_more_field_data:[m
[31m-        rc = ngx_http_rds_csv_process_more_field_data(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_done:[m
[31m-[m
[31m-        /* mark the remaining bufs as consumed */[m
[31m-[m
[31m-        dd("discarding bufs");[m
[31m-[m
[31m-        ngx_http_rds_csv_discard_bufs(r->pool, in);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-        break;[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_csv: invalid internal state: %d",[m
[31m-                      ctx->state);[m
[31m-[m
[31m-        rc = NGX_ERROR;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    dd("body filter rc: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ctx->state = state_done;[m
[31m-[m
[31m-        if (!ctx->header_sent) {[m
[31m-            ctx->header_sent = 1;[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->headers_out.status = rc;[m
[31m-[m
[31m-            dd("sending ERROR headers");[m
[31m-[m
[31m-            ngx_http_rds_csv_next_header_filter(r);[m
[31m-            ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("output bufs");[m
[31m-[m
[31m-    return ngx_http_rds_csv_output_bufs(r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_csv_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                             multi_http_blocks;[m
[31m-    ngx_http_rds_csv_main_conf_t   *rmcf;[m
[31m-[m
[31m-    rmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                              ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    if (ngx_http_rds_csv_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_rds_csv_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || rmcf->requires_filter) {[m
[31m-        ngx_http_rds_csv_next_header_filter = ngx_http_top_header_filter;[m
[31m-        ngx_http_top_header_filter = ngx_http_rds_csv_header_filter;[m
[31m-[m
[31m-        ngx_http_rds_csv_next_body_filter = ngx_http_top_body_filter;[m
[31m-        ngx_http_top_body_filter = ngx_http_rds_csv_body_filter;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_rds_csv_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_rds_csv_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_rds_csv_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->content_type = { 0, NULL };[m
[31m-     *     conf->row_term = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->enabled = NGX_CONF_UNSET;[m
[31m-    conf->field_sep = NGX_CONF_UNSET_UINT;[m
[31m-    conf->buf_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->field_name_header = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_csv_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_rds_csv_loc_conf_t *prev = parent;[m
[31m-    ngx_http_rds_csv_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enabled, prev->enabled, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->field_name_header, prev->field_name_header, 1);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->field_sep, prev->field_sep,[m
[31m-                              (ngx_uint_t) ',');[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->row_term, prev->row_term,[m
[31m-                             ngx_http_rds_csv_row_term);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->content_type, prev->content_type,[m
[31m-                             ngx_http_rds_csv_content_type);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buf_size, prev->buf_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_csv_row_terminator(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_csv_loc_conf_t         *rlcf = conf;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_str_t                           *term;[m
[31m-[m
[31m-    if (rlcf->row_term.len != 0) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    term = &value[1];[m
[31m-[m
[31m-    if (term->len == 0) {[m
[31m-        return "takes empty string value";[m
[31m-    }[m
[31m-[m
[31m-    if ((term->len == 1 && term->data[0] == '\n')[m
[31m-        || (term->len == 2 && term->data[0] == '\r' && term->data[1] == '\n'))[m
[31m-    {[m
[31m-        return ngx_conf_set_str_slot(cf, cmd, conf);[m
[31m-    }[m
[31m-[m
[31m-    return "takes a value other than \"\\n\" and \"\\r\\n\"";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_csv_field_separator(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_csv_loc_conf_t         *rlcf = conf;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_str_t                           *sep;[m
[31m-[m
[31m-    if (rlcf->field_sep != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    sep = &value[1];[m
[31m-[m
[31m-    if (sep->len != 1) {[m
[31m-        return "takes a string value not of length 1";[m
[31m-    }[m
[31m-[m
[31m-    if (sep->data[0] == ',' || sep->data[0] == ';' || sep->data[0] == '\t') {[m
[31m-        rlcf->field_sep = (ngx_uint_t) (sep->data[0]);[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return "takes a value other than \",\", \";\", and \"\\t\"";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_csv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_csv_main_conf_t     *rmcf;[m
[31m-[m
[31m-    rmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                              ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    rmcf->requires_filter = 1;[m
[31m-[m
[31m-    return ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_rds_csv_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_rds_csv_main_conf_t    *rmcf;[m
[31m-[m
[31m-    rmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_rds_csv_main_conf_t));[m
[31m-    if (rmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      rmcf->requires_filter = 0;[m
[31m-     */[m
[31m-[m
[31m-    return rmcf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.h[m
[1mdeleted file mode 100644[m
[1mindex ab43c4a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_filter_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_CSV_FILTER_MODULE_H[m
[31m-#define NGX_HTTP_RDS_CSV_FILTER_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RESET_CONTENT[m
[31m-#define NGX_HTTP_RESET_CONTENT 205[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_rds_csv_filter_module;[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt  ngx_http_rds_csv_next_header_filter;[m
[31m-extern ngx_http_output_body_filter_pt    ngx_http_rds_csv_next_body_filter;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t                       enabled;[m
[31m-    ngx_str_t                        row_term;[m
[31m-    ngx_uint_t                       field_sep;[m
[31m-    size_t                           buf_size;[m
[31m-    ngx_flag_t                       field_name_header;[m
[31m-    ngx_str_t                        content_type;[m
[31m-} ngx_http_rds_csv_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t           requires_filter;[m
[31m-} ngx_http_rds_csv_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    state_expect_header,[m
[31m-    state_expect_col,[m
[31m-    state_expect_row,[m
[31m-    state_expect_field,[m
[31m-    state_expect_more_field_data,[m
[31m-    state_done[m
[31m-[m
[31m-} ngx_http_rds_csv_state_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_rds_csv_state_t            state;[m
[31m-[m
[31m-    ngx_str_t                           *col_name;[m
[31m-    ngx_uint_t                           col_count;[m
[31m-    ngx_uint_t                           cur_col;[m
[31m-[m
[31m-    ngx_http_rds_column_t               *cols;[m
[31m-    size_t                               row;[m
[31m-[m
[31m-    uint32_t                             field_offset;[m
[31m-    uint32_t                             field_total;[m
[31m-[m
[31m-    ngx_buf_tag_t                        tag;[m
[31m-[m
[31m-    ngx_chain_t                         *out;[m
[31m-    ngx_chain_t                        **last_out;[m
[31m-    ngx_chain_t                         *busy_bufs;[m
[31m-    ngx_chain_t                         *free_bufs;[m
[31m-[m
[31m-    ngx_buf_t                           *out_buf;[m
[31m-    ngx_buf_t                            cached;[m
[31m-    ngx_buf_t                            postponed;[m
[31m-[m
[31m-    size_t                               avail_out;[m
[31m-[m
[31m-    uint32_t                             field_data_rest;[m
[31m-[m
[31m-    ngx_flag_t                           header_sent:1;[m
[31m-    ngx_flag_t                           seen_stream_end:1;[m
[31m-    ngx_flag_t                           generated_col_names:1;[m
[31m-} ngx_http_rds_csv_ctx_t;[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_CSV_FILTER_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.c[m
[1mdeleted file mode 100644[m
[1mindex abb7db3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.c[m
[1m+++ /dev/null[m
[36m@@ -1,770 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_csv_filter_module.h"[m
[31m-#include "ngx_http_rds_csv_output.h"[m
[31m-#include "ngx_http_rds_csv_util.h"[m
[31m-#include "resty_dbd_stream.h"[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_http_rds_csv_request_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, size_t len);[m
[31m-static ngx_int_t ngx_http_rds_csv_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx);[m
[31m-static u_char *ngx_http_rds_csv_get_postponed(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, size_t len);[m
[31m-static ngx_int_t ngx_http_rds_csv_submit_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, size_t len, unsigned last_buf);[m
[31m-static size_t ngx_get_num_size(uint64_t i);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_output_literal(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, u_char *data, size_t len,[m
[31m-    int last_buf)[m
[31m-{[m
[31m-    u_char                      *pos;[m
[31m-[m
[31m-    pos = ngx_http_rds_csv_request_mem(r, ctx, len);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(pos, data, len);[m
[31m-[m
[31m-    dd("before output chain");[m
[31m-[m
[31m-    if (last_buf) {[m
[31m-        ctx->seen_stream_end = 1;[m
[31m-[m
[31m-        if (r != r->main) {[m
[31m-            last_buf = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_csv_submit_mem(r, ctx, len, (unsigned) last_buf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_output_bufs(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_chain_t             *cl;[m
[31m-[m
[31m-    dd("entered output chain");[m
[31m-[m
[31m-    if (ctx->seen_stream_end) {[m
[31m-        ctx->seen_stream_end = 0;[m
[31m-[m
[31m-        if (ctx->avail_out) {[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = ctx->out_buf;[m
[31m-            cl->next = NULL;[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            ctx->avail_out = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd_dump_chain_size();[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (ctx->out == NULL) {[m
[31m-            /* fprintf(stderr, "\n"); */[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        /* fprintf(stderr, "XXX Relooping..."); */[m
[31m-[m
[31m-        rc = ngx_http_rds_csv_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free_bufs, &ctx->busy_bufs,[m
[31m-                                &ctx->out, ctx->tag);[m
[31m-#else[m
[31m-        ngx_chain_update_chains(&ctx->free_bufs, &ctx->busy_bufs, &ctx->out,[m
[31m-                                ctx->tag);[m
[31m-#endif[m
[31m-[m
[31m-        ctx->last_out = &ctx->out;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_output_header(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, ngx_http_rds_header_t *header)[m
[31m-{[m
[31m-    u_char                  *pos, *last;[m
[31m-    size_t                   size;[m
[31m-    uintptr_t                escape;[m
[31m-    unsigned                 last_buf = 0;[m
[31m-    unsigned                 need_quotes = 0;[m
[31m-    u_char                   sep;[m
[31m-[m
[31m-    ngx_http_rds_csv_loc_conf_t       *conf;[m
[31m-[m
[31m-    /* calculate the buffer size */[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    if (conf->field_name_header) {[m
[31m-        size = sizeof("errcode,errstr,insert_id,affected_rows") - 1[m
[31m-               + conf->row_term.len;[m
[31m-[m
[31m-    } else {[m
[31m-        size = 0;[m
[31m-    }[m
[31m-[m
[31m-    sep = (u_char) conf->field_sep;[m
[31m-[m
[31m-    size += 3 /* field seperators */ + conf->row_term.len;[m
[31m-[m
[31m-    size += ngx_get_num_size(header->std_errcode);[m
[31m-[m
[31m-    escape = ngx_http_rds_csv_escape_csv_str(sep, NULL, header->errstr.data,[m
[31m-                                             header->errstr.len,[m
[31m-                                             &need_quotes);[m
[31m-[m
[31m-    if (need_quotes) {[m
[31m-        size += sizeof("\"\"") - 1;[m
[31m-    }[m
[31m-[m
[31m-    size += header->errstr.len + escape[m
[31m-            + ngx_get_num_size(header->insert_id)[m
[31m-            + ngx_get_num_size(header->affected_rows);[m
[31m-[m
[31m-    /* create the buffer */[m
[31m-[m
[31m-    pos = ngx_http_rds_csv_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* fill up the buffer */[m
[31m-[m
[31m-    last = ngx_sprintf(last, "errcode%cerrstr%cinsert_id%caffected_rows%V"[m
[31m-                       "%uD%c", sep, sep, sep, &conf->row_term,[m
[31m-                       (uint32_t) header->std_errcode, sep);[m
[31m-[m
[31m-    if (need_quotes) {[m
[31m-        *last++ = '"';[m
[31m-    }[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        last = ngx_copy(last, header->errstr.data, header->errstr.len);[m
[31m-[m
[31m-    } else {[m
[31m-        last = (u_char *)[m
[31m-                ngx_http_rds_csv_escape_csv_str(sep, last,[m
[31m-                                                header->errstr.data,[m
[31m-                                                header->errstr.len, NULL);[m
[31m-    }[m
[31m-[m
[31m-    if (need_quotes) {[m
[31m-        *last++ = '"';[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_sprintf(last, "%c%uL%c%uL%V", sep, header->insert_id, sep,[m
[31m-                       header->affected_rows, &conf->row_term);[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_csv: output header buffer error: %uz != %uz",[m
[31m-                      (size_t) (last - pos), size);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->seen_stream_end = 1;[m
[31m-[m
[31m-    return ngx_http_rds_csv_submit_mem(r, ctx, size, last_buf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_output_field_names(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_http_rds_column_t               *col;[m
[31m-    size_t                               size;[m
[31m-    u_char                              *pos, *last;[m
[31m-    uintptr_t                            escape = 0;[m
[31m-    unsigned                             need_quotes;[m
[31m-    u_char                               sep;[m
[31m-    ngx_http_rds_csv_loc_conf_t         *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    sep = (u_char) conf->field_sep;[m
[31m-[m
[31m-    size = ctx->col_count - 1 /* field sep count */[m
[31m-         + conf->row_term.len;[m
[31m-[m
[31m-    for (i = 0; i < ctx->col_count; i++) {[m
[31m-        col = &ctx->cols[i];[m
[31m-        escape = ngx_http_rds_csv_escape_csv_str(sep, NULL, col->name.data,[m
[31m-                                                 col->name.len, &need_quotes);[m
[31m-[m
[31m-        dd("field escape: %d", (int) escape);[m
[31m-[m
[31m-        if (need_quotes) {[m
[31m-            size += sizeof("\"\"") - 1;[m
[31m-        }[m
[31m-[m
[31m-        size += col->name.len + escape;[m
[31m-    }[m
[31m-[m
[31m-    ctx->generated_col_names = 1;[m
[31m-[m
[31m-    pos = ngx_http_rds_csv_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    for (i = 0; i < ctx->col_count; i++) {[m
[31m-        col = &ctx->cols[i];[m
[31m-[m
[31m-        escape = ngx_http_rds_csv_escape_csv_str(sep, NULL, col->name.data,[m
[31m-                                                 col->name.len, &need_quotes);[m
[31m-[m
[31m-        if (need_quotes) {[m
[31m-            *last++ = '"';[m
[31m-        }[m
[31m-[m
[31m-        if (escape == 0) {[m
[31m-            last = ngx_copy(last, col->name.data, col->name.len);[m
[31m-[m
[31m-        } else {[m
[31m-            last = (u_char *)[m
[31m-                   ngx_http_rds_csv_escape_csv_str(sep, last,[m
[31m-                                                   col->name.data,[m
[31m-                                                   col->name.len, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (need_quotes) {[m
[31m-            *last++ = '"';[m
[31m-        }[m
[31m-[m
[31m-        if (i != ctx->col_count - 1) {[m
[31m-            *last++ = sep;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_copy(last, conf->row_term.data, conf->row_term.len);[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_csv: output field names buffer error: %uz != %uz",[m
[31m-                      (size_t) (last - pos), size);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_csv_submit_mem(r, ctx, size, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_output_field(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, u_char *data, size_t len, int is_null)[m
[31m-{[m
[31m-    u_char                              *pos, *last;[m
[31m-    ngx_http_rds_column_t               *col;[m
[31m-    size_t                               size;[m
[31m-    uintptr_t                            val_escape = 0;[m
[31m-    unsigned                             need_quotes = 0;[m
[31m-    u_char                               sep;[m
[31m-    ngx_http_rds_csv_loc_conf_t         *conf;[m
[31m-#if DDEBUG[m
[31m-    u_char                              *p;[m
[31m-#endif[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    sep = (u_char) conf->field_sep;[m
[31m-[m
[31m-    dd("reading row %llu, col %d, len %d",[m
[31m-       (unsigned long long) ctx->row,[m
[31m-       (int) ctx->cur_col, (int) len);[m
[31m-[m
[31m-    /* calculate the buffer size */[m
[31m-[m
[31m-    if (ctx->cur_col == 0) {[m
[31m-        size = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        size = 1 /* field sep */;[m
[31m-    }[m
[31m-[m
[31m-    col = &ctx->cols[ctx->cur_col];[m
[31m-[m
[31m-    if (len == 0 && ctx->field_data_rest > 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_csv: at least one octet should go with the field "[m
[31m-                      "size in one buf");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (is_null) {[m
[31m-        /* SQL NULL is just empty in the CSV field */[m
[31m-[m
[31m-    } else if (len == 0) {[m
[31m-        /* empty string is also empty */[m
[31m-[m
[31m-    } else {[m
[31m-        switch (col->std_type & 0xc000) {[m
[31m-        case rds_rough_col_type_float:[m
[31m-        case rds_rough_col_type_int:[m
[31m-        case rds_rough_col_type_bool:[m
[31m-            size += len;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            dd("string field found");[m
[31m-[m
[31m-            val_escape = ngx_http_rds_csv_escape_csv_str(sep, NULL, data, len,[m
[31m-                                                         &need_quotes);[m
[31m-[m
[31m-            if (ctx->field_data_rest > 0 && !need_quotes) {[m
[31m-                need_quotes = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (need_quotes) {[m
[31m-                if (ctx->field_data_rest == 0) {[m
[31m-                    size += sizeof("\"\"") - 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    size += sizeof("\"") - 1;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            size += len + val_escape;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->field_data_rest == 0 && ctx->cur_col == ctx->col_count - 1) {[m
[31m-        /* last column in the row */[m
[31m-        size += conf->row_term.len;[m
[31m-    }[m
[31m-[m
[31m-    /* allocate the buffer */[m
[31m-[m
[31m-    pos = ngx_http_rds_csv_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* fill up the buffer */[m
[31m-[m
[31m-    if (ctx->cur_col != 0) {[m
[31m-        *last++ = sep;[m
[31m-    }[m
[31m-[m
[31m-    if (is_null || len == 0) {[m
[31m-        /* do nothing */[m
[31m-[m
[31m-    } else {[m
[31m-        switch (col->std_type & 0xc000) {[m
[31m-        case rds_rough_col_type_int:[m
[31m-        case rds_rough_col_type_float:[m
[31m-        case rds_rough_col_type_bool:[m
[31m-            last = ngx_copy(last, data, len);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            /* string */[m
[31m-            if (need_quotes) {[m
[31m-                *last++ = '"';[m
[31m-            }[m
[31m-[m
[31m-            if (val_escape == 0) {[m
[31m-                last = ngx_copy(last, data, len);[m
[31m-[m
[31m-            } else {[m
[31m-                dd("field: string value escape non-zero: %d",[m
[31m-                   (int) val_escape);[m
[31m-[m
[31m-#if DDEBUG[m
[31m-                p = last;[m
[31m-#endif[m
[31m-[m
[31m-                last = (u_char *)[m
[31m-                       ngx_http_rds_csv_escape_csv_str(sep, last, data, len,[m
[31m-                                                       NULL);[m
[31m-[m
[31m-#if DDEBUG[m
[31m-                dd("escaped value \"%.*s\" (len %d, escape %d, escape2 %d)",[m
[31m-                   (int) (len + val_escape),[m
[31m-                   p, (int) (len + val_escape),[m
[31m-                   (int) val_escape,[m
[31m-                   (int) ((last - p) - len));[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            if (need_quotes && ctx->field_data_rest == 0) {[m
[31m-                *last++ = '"';[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->field_data_rest == 0 && ctx->cur_col == ctx->col_count - 1) {[m
[31m-        last = ngx_copy(last, conf->row_term.data, conf->row_term.len);[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_csv: output field: buffer error (%d left)",[m
[31m-                      (int) size - (last - pos));[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_csv_submit_mem(r, ctx, size, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_output_more_field_data(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, u_char *data, size_t len)[m
[31m-{[m
[31m-    u_char                          *pos, *last;[m
[31m-    size_t                           size = 0;[m
[31m-    ngx_http_rds_column_t           *col;[m
[31m-    uintptr_t                        escape = 0;[m
[31m-#if DDEBUG[m
[31m-    u_char                          *p;[m
[31m-#endif[m
[31m-    unsigned                         need_quotes;[m
[31m-    u_char                           sep;[m
[31m-    ngx_http_rds_csv_loc_conf_t     *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    sep = (u_char) conf->field_sep;[m
[31m-[m
[31m-    /* calculate the buffer size */[m
[31m-[m
[31m-    col = &ctx->cols[ctx->cur_col];[m
[31m-[m
[31m-    switch (col->std_type & 0xc000) {[m
[31m-    case rds_rough_col_type_int:[m
[31m-    case rds_rough_col_type_float:[m
[31m-    case rds_rough_col_type_bool:[m
[31m-        size += len;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        /* string */[m
[31m-[m
[31m-        escape = ngx_http_rds_csv_escape_csv_str(sep, NULL, data, len,[m
[31m-                                                 &need_quotes);[m
[31m-[m
[31m-        size = len + escape;[m
[31m-[m
[31m-        if (ctx->field_data_rest == 0) {[m
[31m-            size += sizeof("\"") - 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->field_data_rest == 0 && ctx->cur_col == ctx->col_count - 1) {[m
[31m-        /* last column in the row */[m
[31m-        size += conf->row_term.len;[m
[31m-    }[m
[31m-[m
[31m-    /* allocate the buffer */[m
[31m-[m
[31m-    pos = ngx_http_rds_csv_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* fill up the buffer */[m
[31m-[m
[31m-    switch (col->std_type & 0xc000) {[m
[31m-    case rds_rough_col_type_int:[m
[31m-    case rds_rough_col_type_float:[m
[31m-    case rds_rough_col_type_bool:[m
[31m-        last = ngx_copy(last, data, len);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        /* string */[m
[31m-        if (escape == 0) {[m
[31m-            last = ngx_copy(last, data, len);[m
[31m-[m
[31m-        } else {[m
[31m-            dd("more field data: string value escape non-zero: %d",[m
[31m-               (int) escape);[m
[31m-[m
[31m-#if DDEBUG[m
[31m-            p = last;[m
[31m-#endif[m
[31m-[m
[31m-            last = (u_char *) ngx_http_rds_csv_escape_csv_str(sep, last, data,[m
[31m-                                                              len, NULL);[m
[31m-[m
[31m-#if DDEBUG[m
[31m-            dd("escaped value \"%.*s\" (len %d, escape %d, escape2 %d)",[m
[31m-               (int) (len + escape),[m
[31m-               p, (int) (len + escape),[m
[31m-               (int) escape,[m
[31m-               (int) ((last - p) - len));[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->field_data_rest == 0) {[m
[31m-            *last++ = '"';[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    } /* switch */[m
[31m-[m
[31m-    if (ctx->field_data_rest == 0 && ctx->cur_col == ctx->col_count - 1) {[m
[31m-        /* last column in the row */[m
[31m-        last = ngx_copy(last, conf->row_term.data, conf->row_term.len);[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_csv: output more field data: buffer error "[m
[31m-                      "(%d left)", (int) (size - (last - pos)));[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_csv_submit_mem(r, ctx, size, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_rds_csv_request_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, size_t len)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    u_char                  *p;[m
[31m-[m
[31m-    rc = ngx_http_rds_csv_get_buf(r, ctx);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->avail_out < len) {[m
[31m-        p = ngx_http_rds_csv_get_postponed(r, ctx, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ctx->postponed.pos = p;[m
[31m-        ctx->postponed.last = p + len;[m
[31m-[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return ctx->out_buf->last;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_csv_get_buf(ngx_http_request_t *r, ngx_http_rds_csv_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_rds_csv_loc_conf_t         *conf;[m
[31m-[m
[31m-    dd("MEM enter");[m
[31m-[m
[31m-    if (ctx->avail_out) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-    if (ctx->free_bufs) {[m
[31m-        dd("MEM reusing temp buf from free_bufs");[m
[31m-[m
[31m-        ctx->out_buf = ctx->free_bufs->buf;[m
[31m-        ctx->free_bufs = ctx->free_bufs->next;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("MEM creating temp buf with size: %d", (int) conf->buf_size);[m
[31m-        ctx->out_buf = ngx_create_temp_buf(r->pool, conf->buf_size);[m
[31m-        if (ctx->out_buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_rds_csv_filter_module;[m
[31m-        ctx->out_buf->recycled = 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->avail_out = conf->buf_size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_rds_csv_get_postponed(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, size_t len)[m
[31m-{[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    dd("MEM enter");[m
[31m-[m
[31m-    if (ctx->cached.start == NULL) {[m
[31m-        goto alloc;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (ctx->cached.end - ctx->cached.start) < len) {[m
[31m-        ngx_pfree(r->pool, ctx->cached.start);[m
[31m-        goto alloc;[m
[31m-    }[m
[31m-[m
[31m-    return ctx->cached.start;[m
[31m-[m
[31m-alloc:[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cached.start = p;[m
[31m-    ctx->cached.end = p + len;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_csv_submit_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, size_t len, unsigned last_buf)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    if (ctx->postponed.pos != NULL) {[m
[31m-        dd("MEM copy postponed data over to ctx->out for len %d", (int) len);[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            len = ctx->postponed.last - ctx->postponed.pos;[m
[31m-            if (len > ctx->avail_out) {[m
[31m-                len = ctx->avail_out;[m
[31m-            }[m
[31m-[m
[31m-            ctx->out_buf->last = ngx_copy(ctx->out_buf->last,[m
[31m-                                          ctx->postponed.pos, len);[m
[31m-[m
[31m-            ctx->avail_out -= len;[m
[31m-[m
[31m-            ctx->postponed.pos += len;[m
[31m-[m
[31m-            if (ctx->postponed.pos == ctx->postponed.last) {[m
[31m-                ctx->postponed.pos = NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->avail_out > 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            dd("MEM save ctx->out_buf");[m
[31m-[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = ctx->out_buf;[m
[31m-            cl->next = NULL;[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            if (ctx->postponed.pos == NULL) {[m
[31m-                ctx->out_buf->last_buf = last_buf;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_rds_csv_get_buf(r, ctx);[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("MEM consuming out_buf for %d", (int) len);[m
[31m-[m
[31m-    ctx->out_buf->last += len;[m
[31m-    ctx->avail_out -= len;[m
[31m-    ctx->out_buf->last_buf = last_buf;[m
[31m-[m
[31m-    if (ctx->avail_out == 0) {[m
[31m-        dd("MEM save ctx->out_buf");[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ctx->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_get_num_size(uint64_t i)[m
[31m-{[m
[31m-    size_t          n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        i = i / 10;[m
[31m-        n++;[m
[31m-    } while (i > 0);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.h[m
[1mdeleted file mode 100644[m
[1mindex 43b955f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_output.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_CSV_OUTPUT_H[m
[31m-#define NGX_HTTP_RDS_CSV_OUTPUT_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_csv_filter_module.h"[m
[31m-#include "ngx_http_rds.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_output_header(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, ngx_http_rds_header_t *header);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_output_field_names(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_output_literal(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, u_char *data, size_t len, int last_buf);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_output_bufs(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_output_field(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, u_char *data, size_t len, int is_null);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_output_more_field_data(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx, u_char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_CSV_OUTPUT_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.c[m
[1mdeleted file mode 100644[m
[1mindex 4a156d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.c[m
[1m+++ /dev/null[m
[36m@@ -1,476 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_csv_processor.h"[m
[31m-#include "ngx_http_rds_csv_util.h"[m
[31m-#include "ngx_http_rds_csv_output.h"[m
[31m-#include "ngx_http_rds.h"[m
[31m-#include "ngx_http_rds_utils.h"[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_process_header(ngx_http_request_t *r, ngx_chain_t *in,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t                       *b;[m
[31m-    ngx_http_rds_header_t            header;[m
[31m-    ngx_int_t                        rc;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    b = in->buf;[m
[31m-[m
[31m-    if (!ngx_buf_in_memory(b)) {[m
[31m-        if (!ngx_buf_special(b)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_csv: process header: buf from "[m
[31m-                          "upstream not in memory");[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_rds_parse_header(r, b, &header);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    dd("col count: %d", (int) header.col_count);[m
[31m-[m
[31m-    if (header.col_count == 0) {[m
[31m-        /* for empty result set, just return the JSON[m
[31m-         * representation of the RDS header */[m
[31m-[m
[31m-        dd("col count == 0");[m
[31m-[m
[31m-        if (b->pos != b->last) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_csv: header: there's unexpected remaining data "[m
[31m-                          "in the buf");[m
[31m-[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        ctx->state = state_done;[m
[31m-[m
[31m-        /* now we send the postponed response header */[m
[31m-        if (!ctx->header_sent) {[m
[31m-            ctx->header_sent = 1;[m
[31m-[m
[31m-            rc = ngx_http_rds_csv_next_header_filter(r);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_rds_csv_output_header(r, ctx, &header);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_rds_csv_discard_bufs(r->pool, in);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cols = ngx_palloc(r->pool,[m
[31m-                           header.col_count * sizeof(ngx_http_rds_column_t));[m
[31m-[m
[31m-    if (ctx->cols == NULL) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ctx->state = state_expect_col;[m
[31m-    ctx->cur_col = 0;[m
[31m-    ctx->col_count = header.col_count;[m
[31m-[m
[31m-    /* now we send the postponed response header */[m
[31m-    if (!ctx->header_sent) {[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        rc = ngx_http_rds_csv_next_header_filter(r);[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_csv_process_col(r, b->pos == b->last ? in->next : in,[m
[31m-                                        ctx);[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    dd("return 500");[m
[31m-    if (!ctx->header_sent) {[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        r->headers_out.status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        ngx_http_send_header(r);[m
[31m-        ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_process_col(ngx_http_request_t *r, ngx_chain_t *in,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t                       *b;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_rds_csv_loc_conf_t     *conf;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    b = in->buf;[m
[31m-[m
[31m-    if (!ngx_buf_in_memory(b)) {[m
[31m-        if (!ngx_buf_special(b)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_csv: process col: buf from upstream not in "[m
[31m-                          "memory");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-    }[m
[31m-[m
[31m-    dd("parsing rds column");[m
[31m-[m
[31m-    rc = ngx_http_rds_parse_col(r, b, &ctx->cols[ctx->cur_col]);[m
[31m-[m
[31m-    dd("parse col returns %d (%d)", (int) rc, (int) NGX_OK);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (b->pos == b->last) {[m
[31m-        dd("parse col buf consumed");[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cur_col++;[m
[31m-[m
[31m-    if (ctx->cur_col >= ctx->col_count) {[m
[31m-        dd("end of column list");[m
[31m-[m
[31m-        ctx->state = state_expect_row;[m
[31m-        ctx->row = 0;[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_csv_filter_module);[m
[31m-[m
[31m-        if (conf->field_name_header) {[m
[31m-            rc = ngx_http_rds_csv_output_field_names(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("after output literal");[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        dd("process col is entering process row...");[m
[31m-        return ngx_http_rds_csv_process_row(r, in, ctx);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_csv_process_col(r, in, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_process_row(ngx_http_request_t *r, ngx_chain_t *in,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("process row");[m
[31m-[m
[31m-    b = in->buf;[m
[31m-[m
[31m-    if (!ngx_buf_in_memory(b)) {[m
[31m-        if (!ngx_buf_special(b)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_csv: process row: buf from "[m
[31m-                          "upstream not in memory");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-    }[m
[31m-[m
[31m-    if (b->last - b->pos < (ssize_t) sizeof(uint8_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_csv: row flag is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("row flag: %d (offset %d)", (char) *b->pos, (int) (b->pos - b->start));[m
[31m-[m
[31m-    if (*b->pos++ == 0) {[m
[31m-        /* end of row list */[m
[31m-        ctx->state = state_done;[m
[31m-[m
[31m-        if (b->pos != b->last) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_csv: row: there's unexpected remaining data "[m
[31m-                          "in the buf");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_rds_csv_output_literal(r, ctx, (u_char *) "", 0,[m
[31m-                                             1 /* last buf*/);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ctx->row++;[m
[31m-    ctx->cur_col = 0;[m
[31m-    ctx->state = state_expect_field;[m
[31m-[m
[31m-    if (b->pos == b->last) {[m
[31m-        in = in->next;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("process row: buf not consumed completely");[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_csv_process_field(r, in, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_process_field(ngx_http_request_t *r, ngx_chain_t *in,[m
[31m-    ngx_http_rds_csv_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t              total, len;[m
[31m-    ngx_buf_t          *b;[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    for (;;) {[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(b)) {[m
[31m-            dd("buf not in memory");[m
[31m-[m
[31m-            if (!ngx_buf_special(b)) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "rds_csv: process field: buf from "[m
[31m-                              "upstream not in memory");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            in = in->next;[m
[31m-[m
[31m-            if (in == NULL) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            b = in->buf;[m
[31m-        }[m
[31m-[m
[31m-        dd("process field: buf size: %d", (int) ngx_buf_size(b));[m
[31m-[m
[31m-        if (b->last - b->pos < (ssize_t) sizeof(uint32_t)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_csv: field size is incomplete in the buf: %*s "[m
[31m-                          "(len: %d)", b->last - b->pos, b->pos,[m
[31m-                          (int) (b->last - b->pos));[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        total = *(uint32_t *) b->pos;[m
[31m-[m
[31m-        dd("total: %d", (int) total);[m
[31m-[m
[31m-        b->pos += sizeof(uint32_t);[m
[31m-[m
[31m-        if (total == (uint32_t) -1) {[m
[31m-            /* SQL NULL found */[m
[31m-            total = 0;[m
[31m-            len = 0;[m
[31m-            ctx->field_data_rest = 0;[m
[31m-[m
[31m-            rc = ngx_http_rds_csv_output_field(r, ctx, b->pos, len,[m
[31m-                                               1 /* is null */);[m
[31m-[m
[31m-        } else {[m
[31m-            len = (uint32_t) (b->last - b->pos);[m
[31m-[m
[31m-            if (len >= total) {[m
[31m-                len = total;[m
[31m-            }[m
[31m-[m
[31m-            ctx->field_data_rest = total - len;[m
[31m-[m
[31m-            rc = ngx_http_rds_csv_output_field(r, ctx, b->pos, len,[m
[31m-                                               0 /* not null */);[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        b->pos += len;[m
[31m-[m
[31m-        if (b->pos == b->last) {[m
[31m-            in = in->next;[m
[31m-        }[m
[31m-[m
[31m-        if (len < total) {[m
[31m-            dd("process field: need to read more field data");[m
[31m-[m
[31m-            ctx->state = state_expect_more_field_data;[m
[31m-[m
[31m-            return ngx_http_rds_csv_process_more_field_data(r, in, ctx);[m
[31m-        }[m
[31m-[m
[31m-        ctx->cur_col++;[m
[31m-[m
[31m-        if (ctx->cur_col >= ctx->col_count) {[m
[31m-            dd("reached the end of the current row");[m
[31m-[m
[31m-            ctx->state = state_expect_row;[m
[31m-[m
[31m-            return ngx_http_rds_csv_process_row(r, in, ctx);[m
[31m-        }[m
[31m-[m
[31m-        /* continue to process the next field (if any) */[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_process_more_field_data(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in, ngx_http_rds_csv_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    size_t                       len;[m
[31m-[m
[31m-    for (;;) {[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(b)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_csv: buf from upstream not in memory");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = b->last - b->pos;[m
[31m-[m
[31m-        if (len >= ctx->field_data_rest) {[m
[31m-            len = ctx->field_data_rest;[m
[31m-            ctx->field_data_rest = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->field_data_rest -= len;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_rds_csv_output_more_field_data(r, ctx, b->pos, len);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        b->pos += len;[m
[31m-[m
[31m-        if (b->pos == b->last) {[m
[31m-            in = in->next;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->field_data_rest) {[m
[31m-            dd("process more field data: still some data remaining");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("process more field data: reached the end of the current field");[m
[31m-[m
[31m-        ctx->cur_col++;[m
[31m-[m
[31m-        if (ctx->cur_col >= ctx->col_count) {[m
[31m-            dd("process more field data: reached the end of the current row");[m
[31m-[m
[31m-            ctx->state = state_expect_row;[m
[31m-[m
[31m-            return ngx_http_rds_csv_process_row(r, in, ctx);[m
[31m-        }[m
[31m-[m
[31m-        dd("proces more field data: read the next field");[m
[31m-[m
[31m-        ctx->state = state_expect_field;[m
[31m-[m
[31m-        return ngx_http_rds_csv_process_field(r, in, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.h[m
[1mdeleted file mode 100644[m
[1mindex 011913b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_processor.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_CSV_PROCESSOR_H[m
[31m-#define NGX_HTTP_RDS_CSV_PROCESSOR_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_csv_filter_module.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_process_header(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in, ngx_http_rds_csv_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_process_col(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in, ngx_http_rds_csv_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_process_row(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in, ngx_http_rds_csv_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_process_field(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in, ngx_http_rds_csv_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_csv_process_more_field_data(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in, ngx_http_rds_csv_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_CSV_PROCESSOR_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.c[m
[1mdeleted file mode 100644[m
[1mindex 7f71950..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include "ngx_http_rds_csv_util.h"[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_http_rds_csv_escape_csv_str(u_char field_sep, u_char *dst, u_char *src,[m
[31m-    size_t size, unsigned *need_quotes)[m
[31m-{[m
[31m-    ngx_uint_t                   n;[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        *need_quotes = 0;[m
[31m-[m
[31m-        /* find the number of characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            switch (*src) {[m
[31m-                case '"':[m
[31m-                    n++;[m
[31m-[m
[31m-                case '\r':[m
[31m-                case '\n':[m
[31m-                    *need_quotes = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    if (*src == field_sep) {[m
[31m-                        *need_quotes = 1;[m
[31m-                    }[m
[31m-                    break;[m
[31m-            }[m
[31m-[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (*src == '"') {[m
[31m-            *dst++ = '"';[m
[31m-            *dst++ = '"';[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_csv_test_content_type(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t           *type;[m
[31m-[m
[31m-    type = &r->headers_out.content_type;[m
[31m-    if (type->len != rds_content_type_len[m
[31m-        || ngx_strncmp(type->data, rds_content_type, rds_content_type_len)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_rds_csv_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-#if 0[m
[31m-        if (cl->buf->temporary[m
[31m-                && ngx_buf_size(cl->buf) > 0) {[m
[31m-            ngx_pfree(pool, cl->buf->start);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.h[m
[1mdeleted file mode 100644[m
[1mindex 57fe892..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_csv_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_CSV_UTIL_H[m
[31m-#define NGX_HTTP_RDS_CSV_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_UINT64_LEN[m
[31m-#define NGX_UINT64_LEN (sizeof("18446744073709551615") - 1)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_UINT16_LEN[m
[31m-#define NGX_UINT16_LEN (sizeof("65535") - 1)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef ngx_copy_literal[m
[31m-#define ngx_copy_literal(p, s)  ngx_copy(p, s, sizeof(s) - 1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-uintptr_t ngx_http_rds_csv_escape_csv_str(u_char field_sep, u_char *dst,[m
[31m-    u_char *src, size_t size, unsigned *need_quotes);[m
[31m-ngx_int_t ngx_http_rds_csv_test_content_type(ngx_http_request_t *r);[m
[31m-void ngx_http_rds_csv_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_CSV_UTIL_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_utils.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_utils.h[m
[1mdeleted file mode 100644[m
[1mindex 4a71d4a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/ngx_http_rds_utils.h[m
[1m+++ /dev/null[m
[36m@@ -1,205 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_UTILS_H[m
[31m-#define NGX_HTTP_RDS_UTILS_H[m
[31m-[m
[31m-[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_rds_parse_header(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_rds_header_t *header)[m
[31m-{[m
[31m-    ssize_t          rest;[m
[31m-[m
[31m-    rest = sizeof(uint8_t)        /* endian type */[m
[31m-           + sizeof(uint32_t)     /* format version */[m
[31m-           + sizeof(uint8_t)      /* result type */[m
[31m-[m
[31m-           + sizeof(uint16_t)     /* standard error code */[m
[31m-           + sizeof(uint16_t)     /* driver-specific error code */[m
[31m-[m
[31m-            + sizeof(uint16_t)    /* driver-specific errstr len */[m
[31m-            + 0                   /* driver-specific errstr data */[m
[31m-            + sizeof(uint64_t)    /* affected rows */[m
[31m-            + sizeof(uint64_t)    /* insert id */[m
[31m-            + sizeof(uint16_t)    /* column count */[m
[31m-            ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: header is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* check endian type */[m
[31m-[m
[31m-    if (*(uint8_t *) b->pos !=[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN)[m
[31m-            0[m
[31m-#else /* big endian */[m
[31m-            1[m
[31m-#endif[m
[31m-       )[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: endian type in the header differ");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos += sizeof(uint8_t);[m
[31m-[m
[31m-    /* check RDS format version number */[m
[31m-[m
[31m-    if (*(uint32_t *) b->pos != (uint32_t) resty_dbd_stream_version) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: RDS format version differ");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("RDS format version: %d", (int) *(uint32_t *) b->pos);[m
[31m-[m
[31m-    b->pos += sizeof(uint32_t);[m
[31m-[m
[31m-    /* check RDS result type */[m
[31m-[m
[31m-    if (*b->pos != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: RDS result type must be 0 for now");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos++;[m
[31m-[m
[31m-    /* save the standard error code */[m
[31m-[m
[31m-    header->std_errcode = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save the driver-specific error code */[m
[31m-[m
[31m-    header->drv_errcode = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save the error string length */[m
[31m-[m
[31m-    header->errstr.len = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    dd("errstr len: %d", (int) header->errstr.len);[m
[31m-[m
[31m-    /* check the rest data's size */[m
[31m-[m
[31m-    rest = header->errstr.len[m
[31m-           + sizeof(uint64_t)     /* affected rows */[m
[31m-           + sizeof(uint64_t)     /* insert id */[m
[31m-           + sizeof(uint16_t)     /* column count */[m
[31m-           ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: header is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* save the error string data */[m
[31m-[m
[31m-    header->errstr.data = b->pos;[m
[31m-[m
[31m-    b->pos += header->errstr.len;[m
[31m-[m
[31m-    /* save affected rows */[m
[31m-[m
[31m-    header->affected_rows = *(uint64_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint64_t);[m
[31m-[m
[31m-    /* save insert id */[m
[31m-[m
[31m-    header->insert_id = *(uint64_t *)b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint64_t);[m
[31m-[m
[31m-    /* save column count */[m
[31m-[m
[31m-    header->col_count = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    dd("saved column count: %d", (int) header->col_count);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_rds_parse_col(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_rds_column_t *col)[m
[31m-{[m
[31m-    ssize_t         rest;[m
[31m-[m
[31m-    rest = sizeof(uint16_t)         /* std col type */[m
[31m-           + sizeof(uint16_t)         /* driver col type */[m
[31m-           + sizeof(uint16_t)         /* col name str len */[m
[31m-           ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: column spec is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* save standard column type */[m
[31m-    col->std_type = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save driver-specific column type */[m
[31m-    col->drv_type = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* read column name string length */[m
[31m-[m
[31m-    col->name.len = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    if (col->name.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_csv: column name empty");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rest = col->name.len;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: column name string is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* save the column name string data */[m
[31m-[m
[31m-    col->name.data = ngx_palloc(r->pool, col->name.len);[m
[31m-    if (col->name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(col->name.data, b->pos, col->name.len);[m
[31m-    b->pos += col->name.len;[m
[31m-[m
[31m-    dd("saved column name \"%.*s\" (len %d, offset %d)",[m
[31m-       (int) col->name.len, col->name.data,[m
[31m-       (int) col->name.len, (int) (b->pos - b->start));[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_UTILS_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/resty_dbd_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/resty_dbd_stream.h[m
[1mdeleted file mode 100644[m
[1mindex ebb0cb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/src/resty_dbd_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-#ifndef RESTY_DBD_STREAME_H[m
[31m-#define RESTY_DBD_STREAME_H[m
[31m-[m
[31m-#define resty_dbd_stream_version 3[m
[31m-#define resty_dbd_stream_version_string "0.0.3"[m
[31m-[m
[31m-#define rds_content_type \[m
[31m-    "application/x-resty-dbd-stream"[m
[31m-[m
[31m-#define rds_content_type_len \[m
[31m-    (sizeof(rds_content_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_rough_col_type_int = 0 << 14,[m
[31m-    rds_rough_col_type_float = 1 << 14,[m
[31m-    rds_rough_col_type_str = 2 << 14,[m
[31m-    rds_rough_col_type_bool = 3 << 14[m
[31m-[m
[31m-} rds_rough_col_type_t;[m
[31m-[m
[31m-[m
[31m-/* The following types (or spellings thereof) are specified[m
[31m- * by SQL:[m
[31m- * bigint, bit, bit varying, boolean, char, character varying,[m
[31m- * character, varchar, date, double precision, integer,[m
[31m- * interval, numeric, decimal, real, smallint,[m
[31m- * time (with or without time zone),[m
[31m- * timestamp (with or without time zone), xml */[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_col_type_unknown = 0 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bigint = 1 | rds_rough_col_type_int,[m
[31m-    rds_col_type_bit = 2 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bit_varying = 3 | rds_rough_col_type_str,[m
[31m-[m
[31m-    rds_col_type_bool = 4 | rds_rough_col_type_bool,[m
[31m-    rds_col_type_char = 5 | rds_rough_col_type_str,[m
[31m-    rds_col_type_varchar = 6 | rds_rough_col_type_str,[m
[31m-    rds_col_type_date = 7 | rds_rough_col_type_str,[m
[31m-    rds_col_type_double = 8 | rds_rough_col_type_float,[m
[31m-    rds_col_type_integer = 9 | rds_rough_col_type_int,[m
[31m-    rds_col_type_interval = 10 | rds_rough_col_type_float,[m
[31m-    rds_col_type_decimal = 11 | rds_rough_col_type_float,[m
[31m-    rds_col_type_real = 12 | rds_rough_col_type_float,[m
[31m-    rds_col_type_smallint = 13 | rds_rough_col_type_int,[m
[31m-    rds_col_type_time_with_time_zone = 14 | rds_rough_col_type_str,[m
[31m-    rds_col_type_time = 15 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp_with_time_zone = 16 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp = 17 | rds_rough_col_type_str,[m
[31m-    rds_col_type_xml = 18 | rds_rough_col_type_str,[m
[31m-[m
[31m-    /* our additions */[m
[31m-    rds_col_type_blob = 19 | rds_rough_col_type_str[m
[31m-[m
[31m-} rds_col_type_t;[m
[31m-[m
[31m-#endif /* RESTY_DBD_STREAME_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex b7e98d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $http_config2 = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: dogs - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS dogs";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: dogs - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE dogs (male boolean, name text, height real)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: dogs - insert values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "[m
[31m-INSERT INTO dogs (male, name, height)[m
[31m-VALUES[m
[31m-    (false, 'hello \"tom', 3.14),[m
[31m-    (true, 'hi,ya', -3),[m
[31m-    (false, 'hey\\ndad', 7),[m
[31m-    (false, '\\rkay', 0.005),[m
[31m-    (false, 'ab;c', 0.005),[m
[31m-    (false, 'foo\\tbar', 21);";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: birds - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS birds";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: birds - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE birds (`\"name\"` text, height real)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: birds - insert values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "[m
[31m-INSERT INTO birds (`\"name\"`, height)[m
[31m-VALUES[m
[31m-    ('hello \"tom', 3.14),[m
[31m-    ('hi,ya', -3),[m
[31m-    ('hey\\ndad', 7),[m
[31m-    ('\\rkay', 0.005),[m
[31m-    ('ab;c', 0.005),[m
[31m-    ('foo\\tbar', 21);";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: cats - drop table[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "DROP TABLE cats";[m
[31m-        error_page 500  = /ignore;[m
[31m-    }[m
[31m-[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: cats - create table[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: cats - insert value[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: cats - insert value[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/buf.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/buf.t[m
[1mdeleted file mode 100644[m
[1mindex 90f84f9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/buf.t[m
[1m+++ /dev/null[m
[36m@@ -1,241 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rds in a single buf (empty result set)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-    set_unescape_uri $rds $arg_rds;[m
[31m-    echo_duplicate 1 $rds;[m
[31m-    rds_csv on;[m
[31m-}[m
[31m---- request eval[m
[31m-my $rds = "\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-$rds = uri_escape($rds);[m
[31m-"GET /single?rds=$rds"[m
[31m---- response_body eval[m
[31m-"id,name\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rds in a single buf (non-empty result set)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-    set_unescape_uri $rds $arg_rds;[m
[31m-    echo_duplicate 1 $rds;[m
[31m-    rds_csv on;[m
[31m-}[m
[31m---- request eval[m
[31m-my $rds =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-$rds = uri_escape($rds);[m
[31m-"GET /single?rds=$rds"[m
[31m---- response_body eval[m
[31m-"id,name\r[m
[31m-2,\r[m
[31m-3,bob\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rds in a single buf (non-empty result set, and each row in a single buf)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-[m
[31m-    set_unescape_uri $a $arg_a;[m
[31m-    set_unescape_uri $b $arg_b;[m
[31m-    set_unescape_uri $c $arg_c;[m
[31m-    set_unescape_uri $d $arg_d;[m
[31m-[m
[31m-    echo_duplicate 1 $a;[m
[31m-    echo_duplicate 1 $b;[m
[31m-    echo_duplicate 1 $c;[m
[31m-    echo_duplicate 1 $d;[m
[31m-[m
[31m-    rds_csv on;[m
[31m-}[m
[31m---- request eval[m
[31m-my $a =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name";  # col name data[m
[31m-[m
[31m-my $b =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"";  # field data[m
[31m-[m
[31m-my $c =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob";  # field data[m
[31m-[m
[31m-my $d =[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-[m
[31m-$a = uri_escape($a);[m
[31m-$b = uri_escape($b);[m
[31m-$c = uri_escape($c);[m
[31m-$d = uri_escape($d);[m
[31m-[m
[31m-"GET /single?a=$a&b=$b&c=$c&d=$d"[m
[31m---- response_body eval[m
[31m-"id,name\r[m
[31m-2,\r[m
[31m-3,bob\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rds in a single buf (non-empty result set, and each row in a single buf)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-[m
[31m-    set_unescape_uri $a $arg_a;[m
[31m-    set_unescape_uri $b $arg_b;[m
[31m-    set_unescape_uri $c $arg_c;[m
[31m-[m
[31m-    echo -n $a;[m
[31m-    echo -n $b;[m
[31m-    echo -n $c;[m
[31m-[m
[31m-    rds_csv on;[m
[31m-}[m
[31m---- request eval[m
[31m-my $a =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name";  # col name data[m
[31m-[m
[31m-my $b =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"";  # field data[m
[31m-[m
[31m-my $c =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-[m
[31m-$a = uri_escape($a);[m
[31m-$b = uri_escape($b);[m
[31m-$c = uri_escape($c);[m
[31m-[m
[31m-"GET /single?a=$a&b=$b&c=$c"[m
[31m---- response_body eval[m
[31m-"id,name\r[m
[31m-2,\r[m
[31m-3,bob\r[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/escape.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/escape.t[m
[1mdeleted file mode 100644[m
[1mindex 9fe97aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/escape.t[m
[1m+++ /dev/null[m
[36m@@ -1,343 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body eval[m
[31m-qq{male,name,height\r[m
[31m-0,"\rkay",0.005\r[m
[31m-0,ab;c,0.005\r[m
[31m-0,foo\tbar,21\r[m
[31m-0,"hello ""tom",3.14\r[m
[31m-0,"hey[m
[31m-dad",7\r[m
[31m-1,"hi,ya",-3\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: using ; as the field separator[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator ';';[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body eval[m
[31m-qq{male;name;height\r[m
[31m-0;"\rkay";0.005\r[m
[31m-0;"ab;c";0.005\r[m
[31m-0;foo\tbar;21\r[m
[31m-0;"hello ""tom";3.14\r[m
[31m-0;"hey[m
[31m-dad";7\r[m
[31m-1;hi,ya;-3\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: using tab as the field separator[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator '\t';[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body eval[m
[31m-qq{male\tname\theight\r[m
[31m-0\t"\rkay"\t0.005\r[m
[31m-0\tab;c\t0.005\r[m
[31m-0\t"foo\tbar"\t21\r[m
[31m-0\t"hello ""tom"\t3.14\r[m
[31m-0\t"hey[m
[31m-dad"\t7\r[m
[31m-1\thi,ya\t-3\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: explicitly using \r\n as the row terminator[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator '\t';[m
[31m-        rds_csv_row_terminator '\r\n';[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body eval[m
[31m-qq{male\tname\theight\r[m
[31m-0\t"\rkay"\t0.005\r[m
[31m-0\tab;c\t0.005\r[m
[31m-0\t"foo\tbar"\t21\r[m
[31m-0\t"hello ""tom"\t3.14\r[m
[31m-0\t"hey[m
[31m-dad"\t7\r[m
[31m-1\thi,ya\t-3\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: using \n as the row terminator[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator '\t';[m
[31m-        rds_csv_row_terminator '\n';[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body eval[m
[31m-qq{male\tname\theight[m
[31m-0\t"\rkay"\t0.005[m
[31m-0\tab;c\t0.005[m
[31m-0\t"foo\tbar"\t21[m
[31m-0\t"hello ""tom"\t3.14[m
[31m-0\t"hey[m
[31m-dad"\t7[m
[31m-1\thi,ya\t-3[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: explicitly field name header on[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator '\t';[m
[31m-        rds_csv_row_terminator '\n';[m
[31m-        rds_csv_field_name_header on;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body eval[m
[31m-qq{male\tname\theight[m
[31m-0\t"\rkay"\t0.005[m
[31m-0\tab;c\t0.005[m
[31m-0\t"foo\tbar"\t21[m
[31m-0\t"hello ""tom"\t3.14[m
[31m-0\t"hey[m
[31m-dad"\t7[m
[31m-1\thi,ya\t-3[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: explicitly field name header off[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator '\t';[m
[31m-        rds_csv_row_terminator '\n';[m
[31m-        rds_csv_field_name_header off;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=absence[m
[31m---- response_body eval[m
[31m-qq{0\t"\rkay"\t0.005[m
[31m-0\tab;c\t0.005[m
[31m-0\t"foo\tbar"\t21[m
[31m-0\t"hello ""tom"\t3.14[m
[31m-0\t"hey[m
[31m-dad"\t7[m
[31m-1\thi,ya\t-3[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: the "charset" directive does not affect us[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        charset "gbk";[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator '\t';[m
[31m-        rds_csv_row_terminator '\n';[m
[31m-        rds_csv_field_name_header off;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=absence[m
[31m---- response_body eval[m
[31m-qq{0\t"\rkay"\t0.005[m
[31m-0\tab;c\t0.005[m
[31m-0\t"foo\tbar"\t21[m
[31m-0\t"hello ""tom"\t3.14[m
[31m-0\t"hey[m
[31m-dad"\t7[m
[31m-1\thi,ya\t-3[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set content type[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator '\t';[m
[31m-        rds_csv_row_terminator '\n';[m
[31m-        rds_csv_field_name_header off;[m
[31m-        rds_csv_content_type "text/tab-separated-values";[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-Content-Type: text/tab-separated-values[m
[31m---- response_body eval[m
[31m-qq{0\t"\rkay"\t0.005[m
[31m-0\tab;c\t0.005[m
[31m-0\t"foo\tbar"\t21[m
[31m-0\t"hello ""tom"\t3.14[m
[31m-0\t"hey[m
[31m-dad"\t7[m
[31m-1\thi,ya\t-3[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set content type (bigger buffer size)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select * from dogs order by name asc;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv_field_separator '\t';[m
[31m-        rds_csv_row_terminator '\n';[m
[31m-        rds_csv_field_name_header off;[m
[31m-        rds_csv_content_type "text/tab-separated-values";[m
[31m-        rds_csv on;[m
[31m-        rds_csv_buffer_size 8k;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-Content-Type: text/tab-separated-values[m
[31m---- response_body eval[m
[31m-qq{0\t"\rkay"\t0.005[m
[31m-0\tab;c\t0.005[m
[31m-0\t"foo\tbar"\t21[m
[31m-0\t"hello ""tom"\t3.14[m
[31m-0\t"hey[m
[31m-dad"\t7[m
[31m-1\thi,ya\t-3[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: escaping column names[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select `\"name\"`, height from birds order by height limit 1;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body[m
[31m-"""name""",height[m
[31m-"hi,ya",-3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/form.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/form.t[m
[1mdeleted file mode 100644[m
[1mindex 13ee552..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/form.t[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set_form_input $sql 'sql';[m
[31m-        set_unescape_uri $sql;[m
[31m-        #echo $sql;[m
[31m-        drizzle_query $sql;[m
[31m-        drizzle_pass backend;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_body eval[m
[31m-"id,name\r[m
[31m-2,\r[m
[31m-3,bob\r[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/pg.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/pg.t[m
[1mdeleted file mode 100644[m
[1mindex ce9aa20..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/pg.t[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bool blob field (keepalive off)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        postgres_server     127.0.0.1:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        postgres_keepalive  off;[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /pgignore "drop table if exists foo";[m
[31m-        echo_location /pg "create table foo (id serial, flag bool);";[m
[31m-        echo_location /pg "insert into foo (flag) values (true);";[m
[31m-        echo_location /pg "insert into foo (flag) values (false);";[m
[31m-        echo_location /pg "select * from foo order by id;";[m
[31m-    }[m
[31m-    location /pg {[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query $query_string;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m-    location = /pgignore {[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        error_page 500 = /ignore;[m
[31m-    }[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,1\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,1\r[m
[31m-id,flag\r[m
[31m-1,t\r[m
[31m-2,f\r[m
[31m-}[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bool blob field (keepalive on)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        postgres_server     127.0.0.1:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /pg "drop table if exists foo";[m
[31m-        echo_location /pg "create table foo (id serial, flag bool);";[m
[31m-        echo_location /pg "insert into foo (flag) values (true);";[m
[31m-        echo_location /pg "insert into foo (flag) values (false);";[m
[31m-        echo_location /pg "select * from foo order by id;";[m
[31m-    }[m
[31m-    location /pg {[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query $query_string;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m-    location = /pgignore {[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        error_page 500 = /ignore;[m
[31m-    }[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,1\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,1\r[m
[31m-id,flag\r[m
[31m-1,t\r[m
[31m-2,f\r[m
[31m-}[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/sanity-stream.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/sanity-stream.t[m
[1mdeleted file mode 100644[m
[1mindex 2673f2e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/sanity-stream.t[m
[1m+++ /dev/null[m
[36m@@ -1,465 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(10);[m
[31m-no_shuffle();[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 3;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        rds_csv_field_name_header off;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: text/csv; header=absence[m
[31m---- response_body[m
[31m-2,[m
[31m-3,bob[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body[m
[31m-id,name[m
[31m-2,[m
[31m-3,bob[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,Rows matched: 1  Changed: 0  Warnings: 0,0,0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_csv on;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"id,name\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        if ($arg_name ~ '[^A-Za-z0-9]') {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='$arg_name' where name='$arg_name'";[m
[31m-[m
[31m-        rds_csv on;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql?name=bob[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,Rows matched: 1  Changed: 0  Warnings: 0,0,0\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: invalid SQL[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select '32";[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module:[m
[31m-Content-Type: text/html[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: single row, single col[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists singles";[m
[31m-        echo_location /mysql "create table singles (name varchar(15));";[m
[31m-        echo_location /mysql "insert into singles values ('marry');";[m
[31m-        echo_location /mysql "select * from singles;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,1[m
[31m-name[m
[31m-marry[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: floating number and insert id[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";[m
[31m-        echo_location /mysql "insert into foo (val) values (3.1415926);";[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,1,1[m
[31m-id,val[m
[31m-1,3.1415926[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: text blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, body text);";[m
[31m-        echo_location /mysql "insert into foo (body) values ('hello');";[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,1,1[m
[31m-id,body[m
[31m-1,hello[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bool blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, flag bool);";[m
[31m-        echo_location /mysql "insert into foo (flag) values (true);";[m
[31m-        echo_location /mysql "insert into foo (flag) values (false);";[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,1,1[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,2,1[m
[31m-id,flag[m
[31m-1,1[m
[31m-2,0[m
[31m-}[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: bit field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, flag bit);";[m
[31m-        echo_location /mysql "insert into foo (flag) values (1);";[m
[31m-        echo_location /mysql "insert into foo (flag) values (0);";[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,1,1[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,2,1[m
[31m-id,flag[m
[31m-1,\x01[m
[31m-2,\x00[m
[31m-}[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: date type[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, created date);";[m
[31m-        echo_location /mysql "insert into foo (created) values ('2007-05-24');";[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,1,1\r[m
[31m-id,created\r[m
[31m-1,2007-05-24\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: strings need to be escaped (forcing utf8)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\b你好\Z');";[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,1,1\r[m
[31m-id,body\r[m
[31m-1,"a\r[m
[31m-b\b??\cZ"\r[m
[31m-}[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: strings need to be escaped[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\b你好\Z');";[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,1,1\r[m
[31m-id,body\r[m
[31m-1,"a\r[m
[31m-b\b你好\x1a"\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: null values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, name char(10), age integer);";[m
[31m-        echo_location /mysql "insert into foo (name, age) values ('', null);";[m
[31m-        echo_location /mysql "insert into foo (name, age) values (null, 0);";[m
[31m-        echo_location /mysql "select * from foo order by id";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,1,1\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,2,1\r[m
[31m-id,name,age\r[m
[31m-1,,\r[m
[31m-2,,0\r[m
[31m-}[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 81bea5d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,452 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(10);[m
[31m-no_shuffle();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 7);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-        rds_csv_field_name_header off;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: text/csv; header=absence[m
[31m---- response_body[m
[31m-2,[m
[31m-3,bob[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body[m
[31m-id,name[m
[31m-2,[m
[31m-3,bob[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,Rows matched: 1  Changed: 0  Warnings: 0,0,0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"id,name\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        if ($arg_name ~ '[^A-Za-z0-9]') {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='$arg_name' where name='$arg_name'";[m
[31m-[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql?name=bob[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: text/csv; header=presence[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,Rows matched: 1  Changed: 0  Warnings: 0,0,0\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: invalid SQL[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select '32";[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module:[m
[31m-Content-Type: text/html[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: single row, single col[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists singles";[m
[31m-        echo_location /mysql "create table singles (name varchar(15));";[m
[31m-        echo_location /mysql "insert into singles values ('marry');";[m
[31m-        echo_location /mysql "select * from singles;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,1[m
[31m-name[m
[31m-marry[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: floating number and insert id[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";[m
[31m-        echo_location /mysql "insert into foo (val) values (3.1415926);";[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,1,1[m
[31m-id,val[m
[31m-1,3.1415926[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: text blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, body text);";[m
[31m-        echo_location /mysql "insert into foo (body) values ('hello');";[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,1,1[m
[31m-id,body[m
[31m-1,hello[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bool blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, flag bool);";[m
[31m-        echo_location /mysql "insert into foo (flag) values (true);";[m
[31m-        echo_location /mysql "insert into foo (flag) values (false);";[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,1,1[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,2,1[m
[31m-id,flag[m
[31m-1,1[m
[31m-2,0[m
[31m-}[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: bit field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, flag bit);";[m
[31m-        echo_location /mysql "insert into foo (flag) values (1);";[m
[31m-        echo_location /mysql "insert into foo (flag) values (0);";[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-        rds_csv_row_terminator "\n";[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,0,0[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,1,1[m
[31m-errcode,errstr,insert_id,affected_rows[m
[31m-0,,2,1[m
[31m-id,flag[m
[31m-1,\x01[m
[31m-2,\x00[m
[31m-}[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: date type[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, created date);";[m
[31m-        echo_location /mysql "insert into foo (created) values ('2007-05-24');";[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,1,1\r[m
[31m-id,created\r[m
[31m-1,2007-05-24\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: strings need to be escaped (forcing utf8)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\b你好\Z');";[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,1,1\r[m
[31m-id,body\r[m
[31m-1,"a\r[m
[31m-b\b??\cZ"\r[m
[31m-}[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: strings need to be escaped[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\b你好\Z');";[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,1,1\r[m
[31m-id,body\r[m
[31m-1,"a\r[m
[31m-b\b你好\x1a"\r[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: null values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo_location /mysql "create table foo (id serial, name char(10), age integer);";[m
[31m-        echo_location /mysql "insert into foo (name, age) values ('', null);";[m
[31m-        echo_location /mysql "insert into foo (name, age) values (null, 0);";[m
[31m-        echo_location /mysql "select * from foo order by id";[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qq{errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,0,0\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,1,1\r[m
[31m-errcode,errstr,insert_id,affected_rows\r[m
[31m-0,,2,1\r[m
[31m-id,name,age\r[m
[31m-1,,\r[m
[31m-2,,0\r[m
[31m-}[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/unused.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/unused.t[m
[1mdeleted file mode 100644[m
[1mindex 86852d4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/t/unused.t[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(10);[m
[31m-no_shuffle();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: used[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap[m
[31m-F(ngx_http_rds_csv_header_filter) {[m
[31m-    println("rds csv header filter")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_rds_csv_body_filter) {[m
[31m-    println("rds csv body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rds csv header filter[m
[31m-rds csv body filter[m
[31m-rds csv body filter[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unused[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        #rds_csv on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap[m
[31m-F(ngx_http_rds_csv_header_filter) {[m
[31m-    println("rds csv header filter")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_rds_csv_body_filter) {[m
[31m-    println("rds csv body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: used (multi http {} blocks)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        rds_csv on;[m
[31m-    }[m
[31m-[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap[m
[31m-F(ngx_http_rds_csv_header_filter) {[m
[31m-    println("rds csv header filter")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_rds_csv_body_filter) {[m
[31m-    println("rds csv body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rds csv header filter[m
[31m-rds csv body filter[m
[31m-rds csv body filter[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex e16e1d2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-          --with-cc-opt="-O1" \[m
[31m-            --with-ld-opt="-Wl,-rpath,/opt/drizzle/lib:/opt/pg9/lib" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../eval-nginx-module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../xss-nginx-module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root/../array-var-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --add-module=$root/../drizzle-nginx-module \[m
[31m-          --add-module=$root/../form-input-nginx-module \[m
[31m-          --add-module=$root/../postgres-nginx-module \[m
[31m-          --with-debug[m
[31m-          #--add-module=$root/../lua-nginx-module \[m
[31m-          #--add-module=$home/work/ngx_http_auth_request-0.1 #\[m
[31m-          #--with-rtsig_module[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 0c3820a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-csv-nginx-module-0.07/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,311 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_posix_memalign[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   spawn_process_alloc[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_ssi_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_script_compile[m
[31m-   fun:ngx_http_rewrite_value[m
[31m-   fun:ndk_set_var_value_core[m
[31m-   fun:ndk_set_var_value[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_location[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push_n[m
[31m-   fun:ngx_http_script_add_code[m
[31m-   fun:ngx_http_script_compile[m
[31m-   fun:ngx_http_rewrite_value[m
[31m-   fun:ndk_set_var_value_core[m
[31m-   fun:ndk_set_var_value[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_location[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_rewrite_set[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_location[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 8d4b393..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-go[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/util.h[m
[31m-src/util.c[m
[31m-src/processor.h[m
[31m-src/processor.c[m
[31m-src/rds.h[m
[31m-src/utils.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-util/bench[m
[31m-pack[m
[31m-restart[m
[31m-misc/[m
[31m-t/servroot/[m
[31m-all[m
[31m-build1[0-9][m
[31m-buildroot/[m
[31m-*.html[m
[31m-*.plist[m
[31m-Makefile[m
[31m-*.patch[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/config[m
[1mdeleted file mode 100644[m
[1mindex f9f65d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/config[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_rds_json_filter_module[m
[31m-HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_rds_json_filter_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_http_rds_json_filter_module.c $ngx_addon_dir/src/ngx_http_rds_json_processor.c $ngx_addon_dir/src/ngx_http_rds_json_util.c $ngx_addon_dir/src/ngx_http_rds_json_output.c $ngx_addon_dir/src/ngx_http_rds_json_handler.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ddebug.h $ngx_addon_dir/src/resty_dbd_stream.h $ngx_addon_dir/src/ngx_http_rds_json_filter_module.h $ngx_addon_dir/src/ngx_http_rds_json_processor.h $ngx_addon_dir/src/ngx_http_rds_json_util.h $ngx_addon_dir/src/ngx_http_rds.h $ngx_addon_dir/src/resty_dbd_stream.h $ngx_addon_dir/src/ngx_http_rds_json_output.h $ngx_addon_dir/src/ngx_http_rds_utils.h $ngx_addon_dir/src/ngx_http_rds_json_handler.h"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 6a52e4a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,84 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   define dd_dump_chain_size() { \[m
[31m-        int              n; \[m
[31m-        ngx_chain_t     *cl; \[m
[31m-            \[m
[31m-        for (n = 0, cl = ctx->out; cl; cl = cl->next, n++) { \[m
[31m-        } \[m
[31m-            \[m
[31m-        dd("chain size: %d", n); \[m
[31m-    }[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "rds-json *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   define dd_dump_chain_size()[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds.h[m
[1mdeleted file mode 100644[m
[1mindex 838f838..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds.h[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_H[m
[31m-#define NGX_HTTP_RDS_H[m
[31m-[m
[31m-[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint16_t        std_errcode;[m
[31m-    uint16_t        drv_errcode;[m
[31m-    ngx_str_t       errstr;[m
[31m-[m
[31m-    uint64_t        affected_rows;[m
[31m-    uint64_t        insert_id;[m
[31m-    uint16_t        col_count;[m
[31m-[m
[31m-} ngx_http_rds_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_rds_column_s {[m
[31m-    rds_col_type_t      std_type;[m
[31m-    uint16_t            drv_type;[m
[31m-[m
[31m-    ngx_str_t           name;[m
[31m-[m
[31m-} ngx_http_rds_column_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 1a26583..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,862 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_rds_json_filter_module.h"[m
[31m-#include "ngx_http_rds_json_util.h"[m
[31m-#include "ngx_http_rds_json_processor.h"[m
[31m-#include "ngx_http_rds_json_handler.h"[m
[31m-#include "ngx_http_rds_json_output.h"[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_rds_json_content_type  "application/json"[m
[31m-[m
[31m-#define ngx_http_rds_json_errcode_default_key  "\"errcode\""[m
[31m-#define ngx_http_rds_json_errstr_default_key   "\"errstr\""[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_rds_json_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_rds_json_formats[] = {[m
[31m-    { ngx_string("normal"), json_format_normal },[m
[31m-    { ngx_string("compact"), json_format_compact },[m
[31m-    /* { ngx_string("pretty"),  json_format_pretty }, */[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt  ngx_http_rds_json_next_header_filter;[m
[31m-ngx_http_output_body_filter_pt    ngx_http_rds_json_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_rds_json_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rds_json_ret(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_http_rds_json_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rds_json_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_rds_json_filter_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rds_json_root(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_rds_json_success_property(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_rds_json_user_property(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_rds_json_errcode_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_rds_json_errstr_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_rds_json(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_rds_json_commands[] = {[m
[31m-[m
[31m-    { ngx_string("rds_json"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_FLAG,[m
[31m-      ngx_http_rds_json,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_json_loc_conf_t, enabled),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_json_root"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_http_rds_json_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_json_success_property"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_http_rds_json_success_property,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_json_user_property"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE2,[m
[31m-      ngx_http_rds_json_user_property,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_json_errcode_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_http_rds_json_errcode_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_json_errstr_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_http_rds_json_errstr_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_json_format"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_json_loc_conf_t, format),[m
[31m-      &ngx_http_rds_json_formats },[m
[31m-[m
[31m-    { ngx_string("rds_json_content_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF[m
[31m-          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_json_loc_conf_t, content_type),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_json_ret"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_rds_json_ret,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rds_json_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rds_json_loc_conf_t, buf_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_rds_json_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_rds_json_filter_init,         /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_rds_json_create_main_conf,    /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_rds_json_create_loc_conf,     /* create location configuration */[m
[31m-    ngx_http_rds_json_merge_loc_conf       /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_rds_json_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_rds_json_filter_module_ctx,  /* module context */[m
[31m-    ngx_http_rds_json_commands,            /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_json_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_rds_json_ctx_t         *ctx;[m
[31m-    ngx_http_rds_json_loc_conf_t    *conf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rds json header filter, \"%V\"", &r->uri);[m
[31m-[m
[31m-    /* XXX maybe we can generate stub JSON strings like[m
[31m-     * {"errcode":403,"error":"Permission denied"}[m
[31m-     * for HTTP error pages? */[m
[31m-[m
[31m-    if ((r->headers_out.status < NGX_HTTP_OK)[m
[31m-        || (r->headers_out.status >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-        || (r->headers_out.status == NGX_HTTP_NO_CONTENT)[m
[31m-        || (r->headers_out.status == NGX_HTTP_RESET_CONTENT))[m
[31m-    {[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "rds json: skipped due to bad status: %ui",[m
[31m-                       r->headers_out.status);[m
[31m-[m
[31m-        return ngx_http_rds_json_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    /* r->headers_out.status = 0; */[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    if (!conf->enabled) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "rds json: skipped because not enabled in the current "[m
[31m-                       "location");[m
[31m-[m
[31m-        return ngx_http_rds_json_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_rds_json_test_content_type(r) != NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "rds json: skipped due to unmatched Content-Type "[m
[31m-                       "response header \"%V\"",[m
[31m-                       &r->headers_out.content_type);[m
[31m-[m
[31m-        return ngx_http_rds_json_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type = conf->content_type;[m
[31m-    r->headers_out.content_type_len = conf->content_type.len;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_rds_json_ctx_t));[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->tag = (ngx_buf_tag_t) &ngx_http_rds_json_filter_module;[m
[31m-[m
[31m-    ctx->state = state_expect_header;[m
[31m-[m
[31m-    ctx->header_sent = 0;[m
[31m-[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    /* set by ngx_pcalloc[m
[31m-     *      ctx->out       = NULL[m
[31m-     *      ctx->busy_bufs = NULL[m
[31m-     *      ctx->free_bufs = NULL[m
[31m-     *      ctx->cached = (ngx_buf_t) 0[m
[31m-     *      ctx->postponed = (ngx_buf_t) 0[m
[31m-     *      ctx->avail_out = 0[m
[31m-     *      ctx->col_names = NULL[m
[31m-     *      ctx->col_count = 0[m
[31m-     *      ctx->cur_col = 0[m
[31m-     *      ctx->field_offset = 0[m
[31m-     *      ctx->field_total = 0[m
[31m-     *      ctx->field_data_rest = 0[m
[31m-     */[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rds json header filter postponed header sending");[m
[31m-[m
[31m-    /* we do postpone the header sending to the body filter */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_json_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_rds_json_ctx_t    *ctx;[m
[31m-    ngx_int_t                   rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rds json body filter, \"%V\"", &r->uri);[m
[31m-[m
[31m-    if (in == NULL || r->header_only) {[m
[31m-        return ngx_http_rds_json_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_rds_json_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rds json body filter postponed header sending");[m
[31m-[m
[31m-    switch (ctx->state) {[m
[31m-    case state_expect_header:[m
[31m-        rc = ngx_http_rds_json_process_header(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_expect_col:[m
[31m-        rc = ngx_http_rds_json_process_col(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_expect_row:[m
[31m-        rc = ngx_http_rds_json_process_row(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_expect_field:[m
[31m-        rc = ngx_http_rds_json_process_field(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_expect_more_field_data:[m
[31m-        rc = ngx_http_rds_json_process_more_field_data(r, in, ctx);[m
[31m-        break;[m
[31m-[m
[31m-    case state_done:[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "rds json body filter discarding unexpected trailing "[m
[31m-                       "buffers");[m
[31m-[m
[31m-        /* mark the remaining bufs as consumed */[m
[31m-[m
[31m-        ngx_http_rds_json_discard_bufs(r->pool, in);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_json: invalid internal state: %d",[m
[31m-                      ctx->state);[m
[31m-[m
[31m-        rc = NGX_ERROR;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    dd("body filter rc: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ctx->state = state_done;[m
[31m-[m
[31m-        if (!ctx->header_sent) {[m
[31m-            ctx->header_sent = 1;[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->headers_out.status = rc;[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rds json body filter sending error page headers");[m
[31m-[m
[31m-            ngx_http_rds_json_next_header_filter(r);[m
[31m-            ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("output bufs");[m
[31m-[m
[31m-    return ngx_http_rds_json_output_bufs(r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_json_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                              multi_http_blocks;[m
[31m-    ngx_http_rds_json_main_conf_t   *rmcf;[m
[31m-[m
[31m-    rmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                              ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    if (ngx_http_rds_json_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_rds_json_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("setting next filter: %d", (int) rmcf->requires_filters);[m
[31m-[m
[31m-    if (multi_http_blocks || rmcf->requires_filters) {[m
[31m-        dd("register filters");[m
[31m-[m
[31m-        ngx_http_rds_json_next_header_filter = ngx_http_top_header_filter;[m
[31m-        ngx_http_top_header_filter = ngx_http_rds_json_header_filter;[m
[31m-[m
[31m-        ngx_http_rds_json_next_body_filter = ngx_http_top_body_filter;[m
[31m-        ngx_http_top_body_filter = ngx_http_rds_json_body_filter;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_rds_json_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_rds_json_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_rds_json_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->content_type = { 0, NULL };[m
[31m-     *     conf->root         = { 0, NULL };[m
[31m-     *     conf->success      = { 0, NULL };[m
[31m-     *     conf->user_props   = NULL;[m
[31m-     *     conf->errcode      = { 0, NULL };[m
[31m-     *     conf->errstr       = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->enabled = NGX_CONF_UNSET;[m
[31m-    conf->format = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->buf_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-#if 0[m
[31m-    conf->buf_size = 1;[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_json_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_rds_json_loc_conf_t *prev = parent;[m
[31m-    ngx_http_rds_json_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enabled, prev->enabled, 0);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->format, prev->format, json_format_normal);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->root, prev->root, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->success, prev->success, "");[m
[31m-[m
[31m-    if (conf->user_props == NULL) {[m
[31m-        conf->user_props = prev->user_props;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->root.len == 0 && (conf->success.len || conf->user_props)) {[m
[31m-        ngx_str_set(&conf->root, "\"data\"");[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->errcode_key, prev->errcode_key,[m
[31m-                             "\"errcode\"");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->errstr_key, prev->errstr_key,[m
[31m-                             "\"errstr\"");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->content_type, prev->content_type,[m
[31m-                             ngx_http_rds_json_content_type);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buf_size, prev->buf_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_json_ret(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_json_loc_conf_t        *jlcf = conf;[m
[31m-    ngx_http_core_loc_conf_t            *clcf;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_http_compile_complex_value_t     ccv;[m
[31m-    ngx_uint_t                           i;[m
[31m-    u_char                               c;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    jlcf->errcode = value[1];[m
[31m-[m
[31m-    if (jlcf->errcode.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "rds_json: rds_json_ret: the errcode argument is empty");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* check the validaty of the errcode argument */[m
[31m-    for (i = 0; i < jlcf->errcode.len; i++) {[m
[31m-        c = jlcf->errcode.data[i];[m
[31m-[m
[31m-        if (c < '0' || c > '9') {[m
[31m-            ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                          "rds_json: rds_json_ret: invalid errcode argument: "[m
[31m-                          "\"%V\"", &jlcf->errcode);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    jlcf->errstr = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-    if (jlcf->errstr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[2].len == 0) {[m
[31m-        ngx_memzero(jlcf->errstr, sizeof(ngx_http_complex_value_t));[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = jlcf->errstr;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf,[m
[31m-            ngx_http_core_module);[m
[31m-    if (clcf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->handler = ngx_http_rds_json_ret_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_json_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_json_loc_conf_t        *jlcf = conf;[m
[31m-    ngx_str_t                           *value;[m
[31m-    uintptr_t                            escape;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (jlcf->root.len) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        return "takes an empty value";[m
[31m-    }[m
[31m-[m
[31m-    escape = ngx_http_rds_json_escape_json_str(NULL, value[1].data,[m
[31m-                                               value[1].len);[m
[31m-[m
[31m-    jlcf->root.len = value[1].len + escape + sizeof("\"\"") - 1;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, jlcf->root.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    jlcf->root.data = p;[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, value[1].data, value[1].len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_rds_json_escape_json_str(p, value[1].data,[m
[31m-                                                         value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (p - jlcf->root.data != (ssize_t) jlcf->root.len) {[m
[31m-        return "sees buffer error";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_json_success_property(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_json_loc_conf_t        *jlcf = conf;[m
[31m-    ngx_str_t                           *value;[m
[31m-    uintptr_t                            escape;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (jlcf->success.len) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        return "takes an empty value";[m
[31m-    }[m
[31m-[m
[31m-    escape = ngx_http_rds_json_escape_json_str(NULL, value[1].data,[m
[31m-                                               value[1].len);[m
[31m-[m
[31m-    jlcf->success.len = value[1].len + escape + sizeof("\"\"") - 1;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, jlcf->success.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    jlcf->success.data = p;[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, value[1].data, value[1].len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_rds_json_escape_json_str(p, value[1].data,[m
[31m-                                                         value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (p - jlcf->success.data != (ssize_t) jlcf->success.len) {[m
[31m-        return "sees buffer error";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_json_user_property(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                              *p;[m
[31m-    ngx_str_t                           *value;[m
[31m-    uintptr_t                            escape;[m
[31m-    ngx_http_rds_json_property_t        *prop;[m
[31m-    ngx_http_rds_json_loc_conf_t        *jlcf = conf;[m
[31m-    ngx_http_compile_complex_value_t     ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        return "takes an empty key";[m
[31m-    }[m
[31m-[m
[31m-    if (value[2].len == 0) {[m
[31m-        return "takes an empty value";[m
[31m-    }[m
[31m-[m
[31m-    if (jlcf->user_props == NULL) {[m
[31m-        jlcf->user_props = ngx_array_create(cf->pool, 4,[m
[31m-                                        sizeof(ngx_http_rds_json_property_t));[m
[31m-[m
[31m-        if (jlcf->user_props == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    prop = ngx_array_push(jlcf->user_props);[m
[31m-    if (prop == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* process the user property key */[m
[31m-[m
[31m-    escape = ngx_http_rds_json_escape_json_str(NULL, value[1].data,[m
[31m-                                               value[1].len);[m
[31m-[m
[31m-    prop->key.len = value[1].len + escape + sizeof("\"\"") - 1;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, prop->key.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    prop->key.data = p;[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, value[1].data, value[1].len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_rds_json_escape_json_str(p, value[1].data,[m
[31m-                                                         value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (p - prop->key.data != (ssize_t) prop->key.len) {[m
[31m-        return "sees buffer error";[m
[31m-    }[m
[31m-[m
[31m-    /* process the user property value */[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &prop->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_json_errcode_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_json_loc_conf_t        *jlcf = conf;[m
[31m-    u_char                              *p;[m
[31m-    ngx_str_t                           *value;[m
[31m-    uintptr_t                            escape;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (jlcf->errcode_key.len) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        return "takes an empty value";[m
[31m-    }[m
[31m-[m
[31m-    escape = ngx_http_rds_json_escape_json_str(NULL, value[1].data,[m
[31m-                                               value[1].len);[m
[31m-[m
[31m-    jlcf->errcode_key.len = value[1].len + escape + sizeof("\"\"") - 1;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, jlcf->errcode_key.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    jlcf->errcode_key.data = p;[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, value[1].data, value[1].len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_rds_json_escape_json_str(p, value[1].data,[m
[31m-                                                         value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (p - jlcf->errcode_key.data != (ssize_t) jlcf->errcode_key.len) {[m
[31m-        return "sees buffer error";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_json_errstr_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_json_loc_conf_t        *jlcf = conf;[m
[31m-    ngx_str_t                           *value;[m
[31m-    uintptr_t                            escape;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (jlcf->errstr_key.len) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        return "takes an empty value";[m
[31m-    }[m
[31m-[m
[31m-    escape = ngx_http_rds_json_escape_json_str(NULL, value[1].data,[m
[31m-                                               value[1].len);[m
[31m-[m
[31m-    jlcf->errstr_key.len = value[1].len + escape + sizeof("\"\"") - 1;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, jlcf->errstr_key.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    jlcf->errstr_key.data = p;[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, value[1].data, value[1].len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_rds_json_escape_json_str(p, value[1].data,[m
[31m-                                                         value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '"';[m
[31m-[m
[31m-    if (p - jlcf->errstr_key.data != (ssize_t) jlcf->errstr_key.len) {[m
[31m-        return "sees buffer error";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rds_json(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rds_json_main_conf_t     *rmcf;[m
[31m-[m
[31m-    rmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                              ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    dd("set filter used to 1");[m
[31m-[m
[31m-    rmcf->requires_filters = 1;[m
[31m-[m
[31m-    return ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_rds_json_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_rds_json_main_conf_t    *rmcf;[m
[31m-[m
[31m-    rmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_rds_json_main_conf_t));[m
[31m-    if (rmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      rmcf->requires_filters = 0;[m
[31m-     */[m
[31m-[m
[31m-    return rmcf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.h[m
[1mdeleted file mode 100644[m
[1mindex 18019b6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_filter_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_JSON_FILTER_MODULE_H[m
[31m-#define NGX_HTTP_RDS_JSON_FILTER_MODULE_H[m
[31m-[m
[31m-#include "ngx_http_rds.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RESET_CONTENT[m
[31m-#define NGX_HTTP_RESET_CONTENT 205[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_rds_json_filter_module;[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt  ngx_http_rds_json_next_header_filter;[m
[31m-[m
[31m-extern ngx_http_output_body_filter_pt    ngx_http_rds_json_next_body_filter;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    json_format_normal,[m
[31m-    json_format_compact,[m
[31m-    json_format_pretty          /* TODO */[m
[31m-[m
[31m-} ngx_http_rds_json_format_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                       key;[m
[31m-    ngx_http_complex_value_t        value;[m
[31m-} ngx_http_rds_json_property_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned            requires_filters; /* :1 */[m
[31m-[m
[31m-} ngx_http_rds_json_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t                       enabled;[m
[31m-    ngx_uint_t                       format;[m
[31m-    ngx_str_t                        content_type;[m
[31m-    ngx_str_t                        root; /* rds_json_root key */[m
[31m-    ngx_str_t                        success; /* rds_json_success_property[m
[31m-                                               * key */[m
[31m-    ngx_array_t                     *user_props; /* rds_json_user_property */[m
[31m-[m
[31m-    ngx_str_t                        errcode_key;[m
[31m-    ngx_str_t                        errstr_key;[m
[31m-[m
[31m-    size_t                           buf_size;[m
[31m-[m
[31m-    /* for rds_json_ret */[m
[31m-    ngx_str_t                        errcode;[m
[31m-    ngx_http_complex_value_t        *errstr;[m
[31m-[m
[31m-} ngx_http_rds_json_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    state_expect_header,[m
[31m-    state_expect_col,[m
[31m-    state_expect_row,[m
[31m-    state_expect_field,[m
[31m-    state_expect_more_field_data,[m
[31m-    state_done[m
[31m-[m
[31m-} ngx_http_rds_json_state_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_rds_json_state_t            state;[m
[31m-[m
[31m-    ngx_str_t                           *col_name;[m
[31m-    ngx_uint_t                           col_count;[m
[31m-    ngx_uint_t                           cur_col;[m
[31m-[m
[31m-    ngx_http_rds_column_t               *cols;[m
[31m-    size_t                               row;[m
[31m-[m
[31m-    uint32_t                             field_offset;[m
[31m-    uint32_t                             field_total;[m
[31m-[m
[31m-    ngx_buf_tag_t                        tag;[m
[31m-[m
[31m-    ngx_chain_t                         *out;[m
[31m-    ngx_chain_t                        **last_out;[m
[31m-    ngx_chain_t                         *busy_bufs;[m
[31m-    ngx_chain_t                         *free_bufs;[m
[31m-[m
[31m-    ngx_buf_t                           *out_buf;[m
[31m-    ngx_buf_t                            cached;[m
[31m-    ngx_buf_t                            postponed;[m
[31m-[m
[31m-    size_t                               avail_out;[m
[31m-[m
[31m-    uint32_t                             field_data_rest;[m
[31m-[m
[31m-    ngx_flag_t                           header_sent:1;[m
[31m-    ngx_flag_t                           seen_stream_end:1;[m
[31m-    ngx_flag_t                           generated_col_names:1;[m
[31m-} ngx_http_rds_json_ctx_t;[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_JSON_FILTER_MODULE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 756e007..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,197 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_rds_json_handler.h"[m
[31m-#include "ngx_http_rds_json_util.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_ret_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_chain_t                     *cl;[m
[31m-    ngx_buf_t                       *b;[m
[31m-    size_t                           len;[m
[31m-    ngx_str_t                        errstr;[m
[31m-    ngx_int_t                        rc;[m
[31m-    uintptr_t                        escape = 0;[m
[31m-    ngx_str_t                       *values = NULL;[m
[31m-    uintptr_t                       *escapes = NULL;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_http_rds_json_property_t    *prop = NULL;[m
[31m-    ngx_http_rds_json_loc_conf_t    *conf;[m
[31m-[m
[31m-    dd("entered ret handler");[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r,[m
[31m-            ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    /* evaluate the final value of conf->errstr */[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, conf->errstr, &errstr) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* calculate the buffer size */[m
[31m-[m
[31m-    len = sizeof("{") - 1[m
[31m-        + conf->errcode_key.len[m
[31m-        + sizeof(":") - 1[m
[31m-        + conf->errcode.len[m
[31m-        + sizeof("}") - 1[m
[31m-        ;[m
[31m-[m
[31m-    if (errstr.len) {[m
[31m-        escape = ngx_http_rds_json_escape_json_str(NULL,[m
[31m-                errstr.data, errstr.len);[m
[31m-[m
[31m-        len += sizeof(",") - 1[m
[31m-             + conf->errstr_key.len[m
[31m-             + sizeof(":") - 1[m
[31m-             + sizeof("\"") - 1[m
[31m-             + errstr.len[m
[31m-             + escape[m
[31m-             + sizeof("\"") - 1[m
[31m-             ;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->success.len) {[m
[31m-        len += conf->success.len + sizeof(":,") - 1;[m
[31m-        if (ngx_atoi(conf->errcode.data, conf->errcode.len) == 0) {[m
[31m-            len += sizeof("true") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            len += sizeof("false") - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->user_props) {[m
[31m-        values = ngx_pnalloc(r->pool,[m
[31m-                    conf->user_props->nelts * (sizeof(ngx_str_t) +[m
[31m-                    sizeof(uintptr_t)));[m
[31m-[m
[31m-        if (values == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        escapes = (uintptr_t *) ((u_char *) values +[m
[31m-                  conf->user_props->nelts * sizeof(ngx_str_t));[m
[31m-[m
[31m-        prop = conf->user_props->elts;[m
[31m-        for (i = 0; i < conf->user_props->nelts; i++) {[m
[31m-            if (ngx_http_complex_value(r, &prop[i].value, &values[i])[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            escapes[i] = ngx_http_rds_json_escape_json_str(NULL, values[i].data,[m
[31m-                values[i].len);[m
[31m-[m
[31m-            len += sizeof(":\"\",") - 1 + prop[i].key.len + values[i].len[m
[31m-                  + escapes[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* create the buffer */[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    /* copy data over to the buffer */[m
[31m-[m
[31m-    *b->last++ = '{';[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, conf->errcode_key.data, conf->errcode_key.len);[m
[31m-    *b->last++ = ':';[m
[31m-    b->last = ngx_copy(b->last, conf->errcode.data, conf->errcode.len);[m
[31m-[m
[31m-    if (errstr.len) {[m
[31m-        *b->last++ = ',';[m
[31m-        b->last = ngx_copy(b->last,[m
[31m-                conf->errstr_key.data, conf->errstr_key.len);[m
[31m-        *b->last++ = ':';[m
[31m-        *b->last++ = '"';[m
[31m-[m
[31m-        if (escape == 0) {[m
[31m-            b->last = ngx_copy(b->last, errstr.data, errstr.len);[m
[31m-        } else {[m
[31m-            b->last = (u_char *) ngx_http_rds_json_escape_json_str(b->last,[m
[31m-                    errstr.data, errstr.len);[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = '"';[m
[31m-    }[m
[31m-[m
[31m-    if (conf->success.len) {[m
[31m-        *b->last++ = ',';[m
[31m-        b->last = ngx_copy(b->last, conf->success.data, conf->success.len);[m
[31m-[m
[31m-        if (ngx_atoi(conf->errcode.data, conf->errcode.len) == 0) {[m
[31m-            b->last = ngx_copy_literal(b->last, ":true");[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_copy_literal(b->last, ":false");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->user_props) {[m
[31m-        for (i = 0; i < conf->user_props->nelts; i++) {[m
[31m-            *b->last++ = ',';[m
[31m-            b->last = ngx_copy(b->last, prop[i].key.data, prop[i].key.len);[m
[31m-            *b->last++ = ':';[m
[31m-            *b->last++ = '"';[m
[31m-[m
[31m-            if (escapes[i] == 0) {[m
[31m-                b->last = ngx_copy(b->last, values[i].data, values[i].len);[m
[31m-[m
[31m-            } else {[m
[31m-                b->last = (u_char *) ngx_http_rds_json_escape_json_str(b->last,[m
[31m-                    values[i].data, values[i].len);[m
[31m-            }[m
[31m-[m
[31m-            *b->last++ = '"';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = '}';[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                "rds_json: rds_json_ret: buffer error");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* send headers */[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_type = conf->content_type;[m
[31m-    r->headers_out.content_type_len = conf->content_type.len;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("output filter...");[m
[31m-[m
[31m-    return ngx_http_output_filter(r, cl);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.h[m
[1mdeleted file mode 100644[m
[1mindex 2a924f4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-#ifndef NGX_HTTP_RDS_JSON_HANDLER_H[m
[31m-#define NGX_HTTP_RDS_JSON_HANDLER_H[m
[31m-[m
[31m-#include "ngx_http_rds_json_filter_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_json_ret_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_JSON_HANDLER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.c[m
[1mdeleted file mode 100644[m
[1mindex f266808..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.c[m
[1m+++ /dev/null[m
[36m@@ -1,1117 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_json_filter_module.h"[m
[31m-#include "ngx_http_rds_json_output.h"[m
[31m-#include "ngx_http_rds_json_util.h"[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_http_rds_json_request_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, size_t len);[m
[31m-static ngx_int_t ngx_http_rds_json_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx);[m
[31m-static u_char *ngx_http_rds_json_get_postponed(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, size_t len);[m
[31m-static ngx_int_t ngx_http_rds_json_submit_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, size_t len, unsigned last_buf);[m
[31m-[m
[31m-[m
[31m-static size_t ngx_get_num_size(uint64_t i);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_output_literal(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, u_char *data, size_t len, int last_buf)[m
[31m-{[m
[31m-    u_char                      *pos;[m
[31m-[m
[31m-    pos = ngx_http_rds_json_request_mem(r, ctx, len);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(pos, data, len);[m
[31m-[m
[31m-    dd("before output chain");[m
[31m-[m
[31m-    if (last_buf) {[m
[31m-        ctx->seen_stream_end = 1;[m
[31m-[m
[31m-        if (r != r->main) {[m
[31m-            last_buf = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_json_submit_mem(r, ctx, len, (unsigned) last_buf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_output_bufs(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_chain_t             *cl;[m
[31m-[m
[31m-    dd("entered output chain");[m
[31m-[m
[31m-    if (ctx->seen_stream_end) {[m
[31m-        ctx->seen_stream_end = 0;[m
[31m-[m
[31m-        if (ctx->avail_out) {[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = ctx->out_buf;[m
[31m-            cl->next = NULL;[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            ctx->avail_out = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd_dump_chain_size();[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (ctx->out == NULL) {[m
[31m-            /* fprintf(stderr, "\n"); */[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        /* fprintf(stderr, "XXX Relooping..."); */[m
[31m-[m
[31m-        rc = ngx_http_rds_json_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free_bufs, &ctx->busy_bufs,[m
[31m-                                &ctx->out, ctx->tag);[m
[31m-#else[m
[31m-        ngx_chain_update_chains(&ctx->free_bufs, &ctx->busy_bufs, &ctx->out,[m
[31m-                                ctx->tag);[m
[31m-#endif[m
[31m-[m
[31m-        ctx->last_out = &ctx->out;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_output_header(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, ngx_http_rds_header_t *header)[m
[31m-{[m
[31m-    u_char                  *pos, *last;[m
[31m-    size_t                   size;[m
[31m-    uintptr_t                escape;[m
[31m-    unsigned                 last_buf = 0;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_str_t               *values = NULL;[m
[31m-    uintptr_t               *escapes = NULL;[m
[31m-[m
[31m-    ngx_http_rds_json_property_t        *prop = NULL;[m
[31m-    ngx_http_rds_json_loc_conf_t        *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    /* calculate the buffer size */[m
[31m-[m
[31m-    size = sizeof("{") - 1[m
[31m-           + conf->errcode_key.len[m
[31m-           + sizeof(":") - 1[m
[31m-           + ngx_get_num_size(header->std_errcode)[m
[31m-           + sizeof("}") - 1;[m
[31m-[m
[31m-    if (conf->success.len) {[m
[31m-        size += conf->success.len + sizeof(":,") - 1;[m
[31m-        if (header->std_errcode == 0) {[m
[31m-            size += sizeof("true") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            size += sizeof("false") - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->user_props) {[m
[31m-        values = ngx_pnalloc(r->pool,[m
[31m-                             conf->user_props->nelts * (sizeof(ngx_str_t)[m
[31m-                             + sizeof(uintptr_t)));[m
[31m-[m
[31m-        if (values == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        escapes = (uintptr_t *) ((u_char *) values[m
[31m-                  + conf->user_props->nelts * sizeof(ngx_str_t));[m
[31m-[m
[31m-        prop = conf->user_props->elts;[m
[31m-        for (i = 0; i < conf->user_props->nelts; i++) {[m
[31m-            if (ngx_http_complex_value(r, &prop[i].value, &values[i])[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            escapes[i] = ngx_http_rds_json_escape_json_str(NULL,[m
[31m-                                                           values[i].data,[m
[31m-                                                           values[i].len);[m
[31m-[m
[31m-            size += sizeof(":\"\",") - 1 + prop[i].key.len + values[i].len[m
[31m-                    + escapes[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (header->errstr.len) {[m
[31m-        escape = ngx_http_rds_json_escape_json_str(NULL, header->errstr.data,[m
[31m-                                                   header->errstr.len);[m
[31m-[m
[31m-        size += sizeof(",") - 1[m
[31m-                + conf->errstr_key.len[m
[31m-                + sizeof(":") - 1[m
[31m-                + sizeof("\"") - 1[m
[31m-                + header->errstr.len[m
[31m-                + escape[m
[31m-                + sizeof("\"") - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        escape = (uintptr_t) 0;[m
[31m-    }[m
[31m-[m
[31m-    if (header->insert_id) {[m
[31m-        size += sizeof(",\"insert_id\":") - 1[m
[31m-                + ngx_get_num_size(header->insert_id);[m
[31m-    }[m
[31m-[m
[31m-    if (header->affected_rows) {[m
[31m-        size += sizeof(",\"affected_rows\":") - 1[m
[31m-                + ngx_get_num_size(header->affected_rows);[m
[31m-    }[m
[31m-[m
[31m-    /* create the buffer */[m
[31m-[m
[31m-    pos = ngx_http_rds_json_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* fill up the buffer */[m
[31m-[m
[31m-    *last++ = '{';[m
[31m-[m
[31m-    if (conf->success.len) {[m
[31m-        last = ngx_copy(last, conf->success.data, conf->success.len);[m
[31m-[m
[31m-        if (header->std_errcode == 0) {[m
[31m-            last = ngx_copy_literal(last, ":true,");[m
[31m-[m
[31m-        } else {[m
[31m-            last = ngx_copy_literal(last, ":false,");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->user_props) {[m
[31m-        for (i = 0; i < conf->user_props->nelts; i++) {[m
[31m-            last = ngx_copy(last, prop[i].key.data, prop[i].key.len);[m
[31m-            *last++ = ':';[m
[31m-            *last++ = '"';[m
[31m-[m
[31m-            if (escapes[i] == 0) {[m
[31m-                last = ngx_copy(last, values[i].data, values[i].len);[m
[31m-[m
[31m-            } else {[m
[31m-                last = (u_char *)[m
[31m-                        ngx_http_rds_json_escape_json_str(last,[m
[31m-                                                          values[i].data,[m
[31m-                                                          values[i].len);[m
[31m-            }[m
[31m-[m
[31m-            *last++ = '"';[m
[31m-            *last++ = ',';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_copy(last, conf->errcode_key.data, conf->errcode_key.len);[m
[31m-    *last++ = ':';[m
[31m-[m
[31m-    last = ngx_snprintf(last, NGX_UINT16_LEN, "%uD",[m
[31m-                        (uint32_t) header->std_errcode);[m
[31m-[m
[31m-    if (header->errstr.len) {[m
[31m-        *last++ = ',';[m
[31m-        last = ngx_copy(last, conf->errstr_key.data, conf->errstr_key.len);[m
[31m-        *last++ = ':';[m
[31m-        *last++ = '"';[m
[31m-[m
[31m-        if (escape == 0) {[m
[31m-            last = ngx_copy(last, header->errstr.data, header->errstr.len);[m
[31m-[m
[31m-        } else {[m
[31m-            last = (u_char *)[m
[31m-                    ngx_http_rds_json_escape_json_str(last,[m
[31m-                                                      header->errstr.data,[m
[31m-                                                      header->errstr.len);[m
[31m-        }[m
[31m-[m
[31m-        *last++ = '"';[m
[31m-    }[m
[31m-[m
[31m-    if (header->insert_id) {[m
[31m-        last = ngx_copy_literal(last, ",\"insert_id\":");[m
[31m-        last = ngx_snprintf(last, NGX_UINT64_LEN, "%uL", header->insert_id);[m
[31m-    }[m
[31m-[m
[31m-    if (header->affected_rows) {[m
[31m-        last = ngx_copy_literal(last, ",\"affected_rows\":");[m
[31m-        last = ngx_snprintf(last, NGX_UINT64_LEN, "%uL",[m
[31m-                            header->affected_rows);[m
[31m-    }[m
[31m-[m
[31m-    *last++ = '}';[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_json: output header buffer error: %O != %uz",[m
[31m-                      (off_t) (last - pos), size);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->seen_stream_end = 1;[m
[31m-[m
[31m-    return ngx_http_rds_json_submit_mem(r, ctx, size, (unsigned) last_buf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_output_props(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, ngx_http_rds_json_loc_conf_t *conf)[m
[31m-{[m
[31m-    size_t                   size;[m
[31m-    u_char                  *pos, *last;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_str_t               *values = NULL;[m
[31m-    uintptr_t               *escapes = NULL;[m
[31m-[m
[31m-    ngx_http_rds_json_property_t        *prop = NULL;[m
[31m-[m
[31m-    size = sizeof("{:") - 1 + conf->root.len;[m
[31m-[m
[31m-    if (conf->success.len) {[m
[31m-        size += sizeof(",:true") - 1 + conf->success.len;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->user_props) {[m
[31m-        values = ngx_pnalloc(r->pool,[m
[31m-                             conf->user_props->nelts * (sizeof(ngx_str_t)[m
[31m-                             + sizeof(uintptr_t)));[m
[31m-[m
[31m-        if (values == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        escapes = (uintptr_t *) ((u_char *) values[m
[31m-                  + conf->user_props->nelts * sizeof(ngx_str_t));[m
[31m-[m
[31m-        prop = conf->user_props->elts;[m
[31m-        for (i = 0; i < conf->user_props->nelts; i++) {[m
[31m-            if (ngx_http_complex_value(r, &prop[i].value, &values[i])[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            escapes[i] = ngx_http_rds_json_escape_json_str(NULL,[m
[31m-                                                           values[i].data,[m
[31m-                                                           values[i].len);[m
[31m-[m
[31m-            size += sizeof(":\"\",") - 1 + prop[i].key.len + values[i].len[m
[31m-                    + escapes[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pos = ngx_http_rds_json_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    *last++ = '{';[m
[31m-[m
[31m-    if (conf->success.len) {[m
[31m-        last = ngx_copy(last, conf->success.data, conf->success.len);[m
[31m-        last = ngx_copy_literal(last, ":true,");[m
[31m-    }[m
[31m-[m
[31m-    if (conf->user_props) {[m
[31m-        for (i = 0; i < conf->user_props->nelts; i++) {[m
[31m-            last = ngx_copy(last, prop[i].key.data, prop[i].key.len);[m
[31m-            *last++ = ':';[m
[31m-            *last++ = '"';[m
[31m-[m
[31m-            if (escapes[i] == 0) {[m
[31m-                last = ngx_copy(last, values[i].data, values[i].len);[m
[31m-[m
[31m-            } else {[m
[31m-                last = (u_char *)[m
[31m-                        ngx_http_rds_json_escape_json_str(last,[m
[31m-                                                          values[i].data,[m
[31m-                                                          values[i].len);[m
[31m-            }[m
[31m-[m
[31m-            *last++ = '"';[m
[31m-            *last++ = ',';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_copy(last, conf->root.data, conf->root.len);[m
[31m-    *last++ = ':';[m
[31m-[m
[31m-    if (last - pos != (ssize_t) size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_json: output props begin: buffer error: %O != %uz",[m
[31m-                      (off_t) (last - pos), size);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_json_submit_mem(r, ctx, size, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_output_cols(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_http_rds_column_t               *col;[m
[31m-    size_t                               size;[m
[31m-    u_char                              *pos, *last;[m
[31m-    uintptr_t                            key_escape = 0;[m
[31m-[m
[31m-    size = sizeof("[]") - 1;[m
[31m-[m
[31m-    for (i = 0; i < ctx->col_count; i++) {[m
[31m-        col = &ctx->cols[i];[m
[31m-        key_escape = ngx_http_rds_json_escape_json_str(NULL, col->name.data,[m
[31m-                                                       col->name.len);[m
[31m-[m
[31m-        dd("key_escape: %d", (int) key_escape);[m
[31m-[m
[31m-        size += col->name.len + key_escape + sizeof("\"\"") - 1;[m
[31m-[m
[31m-        if (i != ctx->col_count - 1) {[m
[31m-            /* not the last column */[m
[31m-            size += sizeof(",") - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->generated_col_names = 1;[m
[31m-[m
[31m-    pos = ngx_http_rds_json_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    *last++ = '[';[m
[31m-[m
[31m-    for (i = 0; i < ctx->col_count; i++) {[m
[31m-        col = &ctx->cols[i];[m
[31m-[m
[31m-        *last++ = '"';[m
[31m-[m
[31m-        last = (u_char *) ngx_http_rds_json_escape_json_str(last,[m
[31m-                                                            col->name.data,[m
[31m-                                                            col->name.len);[m
[31m-[m
[31m-        *last++ = '"';[m
[31m-[m
[31m-        if (i != ctx->col_count - 1) {[m
[31m-            *last++ = ',';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *last++ = ']';[m
[31m-[m
[31m-    return ngx_http_rds_json_submit_mem(r, ctx, size, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_output_field(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, u_char *data, size_t len, int is_null)[m
[31m-{[m
[31m-    u_char                              *pos, *last;[m
[31m-    ngx_http_rds_column_t               *col;[m
[31m-    ngx_flag_t                           bool_val = 0;[m
[31m-    size_t                               size;[m
[31m-    uintptr_t                            key_escape = 0;[m
[31m-    uintptr_t                            val_escape = 0;[m
[31m-    u_char                              *p;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_http_rds_json_loc_conf_t        *conf;[m
[31m-    ngx_uint_t                           format;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    format = conf->format;[m
[31m-[m
[31m-    dd("reading row %llu, col %d, len %d",[m
[31m-       (unsigned long long) ctx->row,[m
[31m-       (int) ctx->cur_col, (int) len);[m
[31m-[m
[31m-    /* calculate the buffer size */[m
[31m-[m
[31m-    if (format == json_format_normal) {[m
[31m-        if (ctx->cur_col == 0) {[m
[31m-            dd("first column");[m
[31m-            if (ctx->row == 1) {[m
[31m-                dd("first column, first row");[m
[31m-                size = sizeof("{\"") - 1;[m
[31m-[m
[31m-            } else {[m
[31m-                size = sizeof(",{\"") - 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            size = sizeof(",\"") - 1;[m
[31m-        }[m
[31m-[m
[31m-    } else if (format == json_format_compact) {[m
[31m-        if (ctx->cur_col == 0) {[m
[31m-            dd("first column");[m
[31m-            size = sizeof(",[") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            size = sizeof(",") - 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    col = &ctx->cols[ctx->cur_col];[m
[31m-[m
[31m-    if (format == json_format_normal) {[m
[31m-        key_escape = ngx_http_rds_json_escape_json_str(NULL, col->name.data,[m
[31m-                                                       col->name.len);[m
[31m-[m
[31m-        dd("key_escape: %d", (int) key_escape);[m
[31m-[m
[31m-        size += col->name.len + key_escape + sizeof("\":") - 1;[m
[31m-[m
[31m-    } else if (format == json_format_compact) {[m
[31m-        /* do nothing */[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 && ctx->field_data_rest > 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_json: at least one octet should go with the "[m
[31m-                      "field size in one buf");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (is_null) {[m
[31m-        size += sizeof("null") - 1;[m
[31m-[m
[31m-    } else if (len == 0) {[m
[31m-        dd("empty string value found");[m
[31m-[m
[31m-        size += sizeof("\"\"") - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        switch (col->std_type & 0xc000) {[m
[31m-        case rds_rough_col_type_float:[m
[31m-            dd("float field found");[m
[31m-            /* TODO check validity of floating numbers */[m
[31m-            size += len;[m
[31m-            break;[m
[31m-[m
[31m-        case rds_rough_col_type_int:[m
[31m-            dd("int field found");[m
[31m-[m
[31m-            for (p = data, i = 0; i < len; i++, p++) {[m
[31m-                if (i == 0 && *p == '-') {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (*p < '0' || *p > '9') {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "rds_json: invalid integral field value: "[m
[31m-                                  "\"%*s\"", len, data);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            size += len;[m
[31m-            break;[m
[31m-[m
[31m-        case rds_rough_col_type_bool:[m
[31m-            dd("bool field found");[m
[31m-[m
[31m-            if (*data == '0' || *data == 'f' || *data == 'F'[m
[31m-                || *data == '1' || *data == 't' || *data == 'T' )[m
[31m-            {[m
[31m-                if (len != 1 || ctx->field_data_rest) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "rds_json: invalid boolean field value "[m
[31m-                                  "leading by \"%*s\"", len, data);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (*data == '0' || *data == 'f' || *data == 'F') {[m
[31m-                    bool_val = 0;[m
[31m-                    size += sizeof("false") - 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    bool_val = 1;[m
[31m-                    size += sizeof("true") - 1;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "rds_json: output field: invalid boolean value "[m
[31m-                              "leading by \"%*s\"", len, data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            dd("string field found");[m
[31m-[m
[31m-            /* TODO: further inspect array types and key-value types */[m
[31m-[m
[31m-            val_escape = ngx_http_rds_json_escape_json_str(NULL, data, len);[m
[31m-[m
[31m-            size += sizeof("\"") - 1 + len + val_escape;[m
[31m-[m
[31m-            if (ctx->field_data_rest == 0) {[m
[31m-                size += sizeof("\"") - 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->field_data_rest == 0[m
[31m-        && ctx->cur_col == ctx->col_count - 1)[m
[31m-    {[m
[31m-        /* last column in the row */[m
[31m-        if (format == json_format_normal) {[m
[31m-            size += sizeof("}") - 1;[m
[31m-[m
[31m-        } else if (format == json_format_compact) {[m
[31m-            size += sizeof("]") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* allocate the buffer */[m
[31m-[m
[31m-    pos = ngx_http_rds_json_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* fill up the buffer */[m
[31m-[m
[31m-    if (format == json_format_normal) {[m
[31m-        if (ctx->cur_col == 0) {[m
[31m-            dd("first column");[m
[31m-            if (ctx->row == 1) {[m
[31m-                dd("first column, first row");[m
[31m-                *last++ = '{';[m
[31m-[m
[31m-            } else {[m
[31m-                *last++ = ','; *last++ = '{';[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            *last++ = ',';[m
[31m-        }[m
[31m-[m
[31m-        *last++ = '"';[m
[31m-[m
[31m-        if (key_escape == 0) {[m
[31m-            last = ngx_copy(last, col->name.data, col->name.len);[m
[31m-[m
[31m-        } else {[m
[31m-            last = (u_char *)[m
[31m-                    ngx_http_rds_json_escape_json_str(last, col->name.data,[m
[31m-                                                      col->name.len);[m
[31m-        }[m
[31m-[m
[31m-        *last++ = '"'; *last++ = ':';[m
[31m-[m
[31m-    } else if (format == json_format_compact) {[m
[31m-[m
[31m-        if (ctx->cur_col == 0) {[m
[31m-            dd("first column");[m
[31m-            *last++ = ',';[m
[31m-            *last++ = '[';[m
[31m-[m
[31m-        } else {[m
[31m-            *last++ = ',';[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (is_null) {[m
[31m-        dd("copy null value over");[m
[31m-        last = ngx_copy_literal(last, "null");[m
[31m-[m
[31m-    } else if (len == 0) {[m
[31m-        dd("copy emtpy string over");[m
[31m-        last = ngx_copy_literal(last, "\"\"");[m
[31m-[m
[31m-    } else {[m
[31m-        switch (col->std_type & 0xc000) {[m
[31m-        case rds_rough_col_type_int:[m
[31m-        case rds_rough_col_type_float:[m
[31m-            last = ngx_copy(last, data, len);[m
[31m-[m
[31m-            dd("copy over int/float value: %.*s", (int) len, data);[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case rds_rough_col_type_bool:[m
[31m-            if (bool_val) {[m
[31m-                last = ngx_copy_literal(last, "true");[m
[31m-[m
[31m-            } else {[m
[31m-                last = ngx_copy_literal(last, "false");[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            /* string */[m
[31m-            *last++ = '"';[m
[31m-[m
[31m-            if (val_escape == 0) {[m
[31m-                last = ngx_copy(last, data, len);[m
[31m-[m
[31m-            } else {[m
[31m-                dd("field: string value escape non-zero: %d",[m
[31m-                   (int) val_escape);[m
[31m-[m
[31m-#if DDEBUG[m
[31m-                p = last;[m
[31m-#endif[m
[31m-[m
[31m-                last = (u_char *)[m
[31m-                        ngx_http_rds_json_escape_json_str(last, data, len);[m
[31m-[m
[31m-#if DDEBUG[m
[31m-                dd("escaped value \"%.*s\" (len %d, escape %d, escape2 %d)",[m
[31m-                   (int) (len + val_escape),[m
[31m-                   p, (int) (len + val_escape),[m
[31m-                   (int) val_escape,[m
[31m-                   (int) ((last - p) - len));[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->field_data_rest == 0) {[m
[31m-                *last++ = '"';[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->field_data_rest == 0 && ctx->cur_col == ctx->col_count - 1) {[m
[31m-        dd("last column in the row");[m
[31m-        if (format == json_format_normal) {[m
[31m-            *last++ = '}';[m
[31m-[m
[31m-        } else if (format == json_format_compact) {[m
[31m-            *last++ = ']';[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_json: output field: buffer error (%d left)",[m
[31m-                      (int) size - (last - pos));[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_json_submit_mem(r, ctx, size, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_output_more_field_data(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, u_char *data, size_t len)[m
[31m-{[m
[31m-    u_char                          *pos, *last;[m
[31m-    size_t                           size = 0;[m
[31m-    ngx_http_rds_column_t           *col;[m
[31m-    uintptr_t                        escape = 0;[m
[31m-    u_char                          *p;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_http_rds_json_loc_conf_t    *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    /* calculate the buffer size */[m
[31m-[m
[31m-    col = &ctx->cols[ctx->cur_col];[m
[31m-[m
[31m-    switch (col->std_type & 0xc000) {[m
[31m-    case rds_rough_col_type_int:[m
[31m-        for (p = data, i = 0; i < len; i++, p++) {[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "rds_json: invalid integral field value: \"%*s\"",[m
[31m-                              len, data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size += len;[m
[31m-        break;[m
[31m-[m
[31m-    case rds_rough_col_type_float:[m
[31m-        /* TODO: check validity of floating-point field values */[m
[31m-        size += len;[m
[31m-        break;[m
[31m-[m
[31m-    case rds_rough_col_type_bool:[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        /* string */[m
[31m-        escape = ngx_http_rds_json_escape_json_str(NULL, data, len);[m
[31m-        size = len + escape;[m
[31m-[m
[31m-        if (ctx->field_data_rest == 0) {[m
[31m-            size += sizeof("\"") - 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->field_data_rest == 0 && ctx->cur_col == ctx->col_count - 1) {[m
[31m-        /* last column in the row */[m
[31m-        if (conf->format == json_format_normal) {[m
[31m-            size += sizeof("}") - 1;[m
[31m-[m
[31m-        } else if (conf->format == json_format_compact) {[m
[31m-            size += sizeof("]") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* allocate the buffer */[m
[31m-[m
[31m-    pos = ngx_http_rds_json_request_mem(r, ctx, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* fill up the buffer */[m
[31m-[m
[31m-    switch (col->std_type & 0xc000) {[m
[31m-    case rds_rough_col_type_int:[m
[31m-    case rds_rough_col_type_float:[m
[31m-        last = ngx_copy(last, data, len);[m
[31m-        break;[m
[31m-[m
[31m-    case rds_rough_col_type_bool:[m
[31m-        /* no op */[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        /* string */[m
[31m-        if (escape == 0) {[m
[31m-            last = ngx_copy(last, data, len);[m
[31m-[m
[31m-        } else {[m
[31m-            dd("more field data: string value escape non-zero: %d",[m
[31m-                (int) escape);[m
[31m-[m
[31m-#if DDEBUG[m
[31m-                p = last;[m
[31m-#endif[m
[31m-[m
[31m-            last = (u_char *) ngx_http_rds_json_escape_json_str(last,[m
[31m-                    data, len);[m
[31m-[m
[31m-#if DDEBUG[m
[31m-            dd("escaped value \"%.*s\" (len %d, escape %d, escape2 %d)",[m
[31m-               (int) (len + escape),[m
[31m-               p, (int) (len + escape),[m
[31m-               (int) escape,[m
[31m-               (int) ((last - p) - len));[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->field_data_rest == 0) {[m
[31m-            *last++ = '"';[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    } /* switch */[m
[31m-[m
[31m-    if (ctx->field_data_rest == 0 && ctx->cur_col == ctx->col_count - 1) {[m
[31m-        /* last column in the row */[m
[31m-        if (conf->format == json_format_normal) {[m
[31m-            *last++ = '}';[m
[31m-[m
[31m-        } else if (conf->format == json_format_compact) {[m
[31m-            *last++ = ']';[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_json: output more field data: buffer error "[m
[31m-                      "(%d left)", (int) (size - (last - pos)));[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_json_submit_mem(r, ctx, size, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_rds_json_request_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, size_t len)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    u_char                  *p;[m
[31m-[m
[31m-    rc = ngx_http_rds_json_get_buf(r, ctx);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->avail_out < len) {[m
[31m-        p = ngx_http_rds_json_get_postponed(r, ctx, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ctx->postponed.pos = p;[m
[31m-        ctx->postponed.last = p + len;[m
[31m-[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return ctx->out_buf->last;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_json_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_rds_json_loc_conf_t         *conf;[m
[31m-[m
[31m-    dd("MEM enter");[m
[31m-[m
[31m-    if (ctx->avail_out) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-    if (ctx->free_bufs) {[m
[31m-        dd("MEM reusing temp buf from free_bufs");[m
[31m-[m
[31m-        ctx->out_buf = ctx->free_bufs->buf;[m
[31m-        ctx->free_bufs = ctx->free_bufs->next;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("MEM creating temp buf with size: %d", (int) conf->buf_size);[m
[31m-        ctx->out_buf = ngx_create_temp_buf(r->pool, conf->buf_size);[m
[31m-[m
[31m-        if (ctx->out_buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_rds_json_filter_module;[m
[31m-        ctx->out_buf->recycled = 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->avail_out = conf->buf_size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_rds_json_get_postponed(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, size_t len)[m
[31m-{[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    dd("MEM enter");[m
[31m-[m
[31m-    if (ctx->cached.start == NULL) {[m
[31m-        goto alloc;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (ctx->cached.end - ctx->cached.start) < len) {[m
[31m-        ngx_pfree(r->pool, ctx->cached.start);[m
[31m-        goto alloc;[m
[31m-    }[m
[31m-[m
[31m-    return ctx->cached.start;[m
[31m-[m
[31m-alloc:[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cached.start = p;[m
[31m-    ctx->cached.end = p + len;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rds_json_submit_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, size_t len, unsigned last_buf)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    if (ctx->postponed.pos != NULL) {[m
[31m-        dd("MEM copy postponed data over to ctx->out for len %d", (int) len);[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            len = ctx->postponed.last - ctx->postponed.pos;[m
[31m-            if (len > ctx->avail_out) {[m
[31m-                len = ctx->avail_out;[m
[31m-            }[m
[31m-[m
[31m-            ctx->out_buf->last = ngx_copy(ctx->out_buf->last,[m
[31m-                                          ctx->postponed.pos, len);[m
[31m-[m
[31m-            ctx->avail_out -= len;[m
[31m-[m
[31m-            ctx->postponed.pos += len;[m
[31m-[m
[31m-            if (ctx->postponed.pos == ctx->postponed.last) {[m
[31m-                ctx->postponed.pos = NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->avail_out > 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            dd("MEM save ctx->out_buf");[m
[31m-[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = ctx->out_buf;[m
[31m-            cl->next = NULL;[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            if (ctx->postponed.pos == NULL) {[m
[31m-                ctx->out_buf->last_buf = last_buf;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_rds_json_get_buf(r, ctx);[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("MEM consuming out_buf for %d", (int) len);[m
[31m-[m
[31m-    ctx->out_buf->last += len;[m
[31m-    ctx->avail_out -= len;[m
[31m-    ctx->out_buf->last_buf = last_buf;[m
[31m-[m
[31m-    if (ctx->avail_out == 0) {[m
[31m-        dd("MEM save ctx->out_buf");[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ctx->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_get_num_size(uint64_t i)[m
[31m-{[m
[31m-    size_t          n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        i = i / 10;[m
[31m-        n++;[m
[31m-    } while (i > 0);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.h[m
[1mdeleted file mode 100644[m
[1mindex 6575f92..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_output.h[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_JSON_OUTPUT_H[m
[31m-#define NGX_HTTP_RDS_JSON_OUTPUT_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_json_filter_module.h"[m
[31m-#include "ngx_http_rds.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_json_output_header(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, ngx_http_rds_header_t *header);[m
[31m-ngx_int_t ngx_http_rds_json_output_cols(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx);[m
[31m-ngx_int_t ngx_http_rds_json_output_literal(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, u_char *data, size_t len, int last_buf);[m
[31m-ngx_int_t ngx_http_rds_json_output_bufs(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx);[m
[31m-ngx_int_t ngx_http_rds_json_output_field(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, u_char *data, size_t len, int is_null);[m
[31m-ngx_int_t ngx_http_rds_json_output_more_field_data(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, u_char *data, size_t len);[m
[31m-ngx_int_t ngx_http_rds_json_output_props(ngx_http_request_t *r,[m
[31m-    ngx_http_rds_json_ctx_t *ctx, ngx_http_rds_json_loc_conf_t *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_JSON_OUTPUT_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.c[m
[1mdeleted file mode 100644[m
[1mindex 9a242f3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.c[m
[1m+++ /dev/null[m
[36m@@ -1,509 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_json_util.h"[m
[31m-#include "ngx_http_rds_json_processor.h"[m
[31m-#include "ngx_http_rds_json_output.h"[m
[31m-#include "ngx_http_rds.h"[m
[31m-#include "ngx_http_rds_utils.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_process_header(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in, ngx_http_rds_json_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t                       *b;[m
[31m-    ngx_http_rds_header_t            header;[m
[31m-    ngx_int_t                        rc;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    b = in->buf;[m
[31m-[m
[31m-    if (!ngx_buf_in_memory(b)) {[m
[31m-        if (!ngx_buf_special(b)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_json: process header: buf from "[m
[31m-                          "upstream not in memory");[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_rds_parse_header(r, b, &header);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    dd("col count: %d", (int) header.col_count);[m
[31m-[m
[31m-    if (header.col_count == 0) {[m
[31m-        /* for empty result set, just return the JSON[m
[31m-         * representation of the RDS header */[m
[31m-[m
[31m-        dd("col count == 0");[m
[31m-[m
[31m-        if (b->pos != b->last) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_json: header: there's unexpected remaining data "[m
[31m-                          "in the buf");[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        ctx->state = state_done;[m
[31m-[m
[31m-        /* now we send the postponed response header */[m
[31m-        if (!ctx->header_sent) {[m
[31m-            ctx->header_sent = 1;[m
[31m-[m
[31m-            rc = ngx_http_rds_json_next_header_filter(r);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_rds_json_output_header(r, ctx, &header);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_rds_json_discard_bufs(r->pool, in);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cols = ngx_palloc(r->pool,[m
[31m-                           header.col_count * sizeof(ngx_http_rds_column_t));[m
[31m-[m
[31m-    if (ctx->cols == NULL) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ctx->state = state_expect_col;[m
[31m-    ctx->cur_col = 0;[m
[31m-    ctx->col_count = header.col_count;[m
[31m-[m
[31m-    /* now we send the postponed response header */[m
[31m-    if (!ctx->header_sent) {[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        rc = ngx_http_rds_json_next_header_filter(r);[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_json_process_col(r, b->pos == b->last ? in->next : in,[m
[31m-                                         ctx);[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    dd("return 500");[m
[31m-    if (!ctx->header_sent) {[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        r->headers_out.status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        ngx_http_send_header(r);[m
[31m-        ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_process_col(ngx_http_request_t *r, ngx_chain_t *in,[m
[31m-    ngx_http_rds_json_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t                       *b;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_rds_json_loc_conf_t    *conf;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    b = in->buf;[m
[31m-[m
[31m-    if (!ngx_buf_in_memory(b)) {[m
[31m-        if (!ngx_buf_special(b)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_json: process col: buf from "[m
[31m-                          "upstream not in memory");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-    }[m
[31m-[m
[31m-    dd("parsing rds column");[m
[31m-[m
[31m-    rc = ngx_http_rds_parse_col(r, b, &ctx->cols[ctx->cur_col]);[m
[31m-[m
[31m-    dd("parse col returns %d (%d)", (int) rc, (int) NGX_OK);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (b->pos == b->last) {[m
[31m-        dd("parse col buf consumed");[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cur_col++;[m
[31m-[m
[31m-    if (ctx->cur_col >= ctx->col_count) {[m
[31m-        dd("end of column list");[m
[31m-[m
[31m-        ctx->state = state_expect_row;[m
[31m-        ctx->row = 0;[m
[31m-[m
[31m-        dd("output \"[\"");[m
[31m-        dd("before output literal");[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-        if (conf->root.len) {[m
[31m-            rc = ngx_http_rds_json_output_props(r, ctx, conf);[m
[31m-[m
[31m-            dd("after output literal");[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_rds_json_output_literal(r, ctx,[m
[31m-                                              (u_char *)"[", sizeof("[") - 1,[m
[31m-                                              0 /* last buf */);[m
[31m-[m
[31m-        dd("after output literal");[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->format == json_format_compact) {[m
[31m-            rc = ngx_http_rds_json_output_cols(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("after output literal");[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        dd("process col is entering process row...");[m
[31m-        return ngx_http_rds_json_process_row(r, in, ctx);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_json_process_col(r, in, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_process_row(ngx_http_request_t *r, ngx_chain_t *in,[m
[31m-    ngx_http_rds_json_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    ngx_http_rds_json_loc_conf_t        *conf;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("process row");[m
[31m-[m
[31m-    b = in->buf;[m
[31m-[m
[31m-    if (!ngx_buf_in_memory(b)) {[m
[31m-        if (!ngx_buf_special(b)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_json: process row: buf from "[m
[31m-                          "upstream not in memory");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-    }[m
[31m-[m
[31m-    if (b->last - b->pos < (ssize_t) sizeof(uint8_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_json: row flag is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("row flag: %d (offset %d)",[m
[31m-       (char) *b->pos,[m
[31m-       (int) (b->pos - b->start));[m
[31m-[m
[31m-    if (*b->pos++ == 0) {[m
[31m-        /* end of row list */[m
[31m-        ctx->state = state_done;[m
[31m-[m
[31m-        if (b->pos != b->last) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_json: row: there's unexpected remaining data "[m
[31m-                          "in the buf");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_rds_json_filter_module);[m
[31m-[m
[31m-        if (conf->root.len) {[m
[31m-            rc = ngx_http_rds_json_output_literal(r, ctx,[m
[31m-                                                  (u_char *)"]}",[m
[31m-                                                  sizeof("]}") - 1,[m
[31m-                                                  1 /* last buf*/);[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_http_rds_json_output_literal(r, ctx,[m
[31m-                                                  (u_char *)"]",[m
[31m-                                                  sizeof("]") - 1,[m
[31m-                                                  1 /* last buf*/);[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ctx->row++;[m
[31m-    ctx->cur_col = 0;[m
[31m-    ctx->state = state_expect_field;[m
[31m-[m
[31m-    if (b->pos == b->last) {[m
[31m-        in = in->next;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("process row: buf not consumed completely");[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_rds_json_process_field(r, in, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_process_field(ngx_http_request_t *r, ngx_chain_t *in,[m
[31m-    ngx_http_rds_json_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t              total, len;[m
[31m-    ngx_buf_t          *b;[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    for (;;) {[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(b)) {[m
[31m-            dd("buf not in memory");[m
[31m-[m
[31m-            if (!ngx_buf_special(b)) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "rds_json: process field: buf from "[m
[31m-                              "upstream not in memory");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            in = in->next;[m
[31m-[m
[31m-            if (in == NULL) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            b = in->buf;[m
[31m-        }[m
[31m-[m
[31m-        dd("process field: buf size: %d", (int) ngx_buf_size(b));[m
[31m-[m
[31m-        if (b->last - b->pos < (ssize_t) sizeof(uint32_t)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_json: field size is incomplete in the buf: %*s "[m
[31m-                          "(len: %d)", b->last - b->pos, b->pos,[m
[31m-                          (int) (b->last - b->pos));[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        total = *(uint32_t *) b->pos;[m
[31m-[m
[31m-        dd("total: %d", (int) total);[m
[31m-[m
[31m-        b->pos += sizeof(uint32_t);[m
[31m-[m
[31m-        if (total == (uint32_t) -1) {[m
[31m-            /* SQL NULL found */[m
[31m-            total = 0;[m
[31m-            len = 0;[m
[31m-            ctx->field_data_rest = 0;[m
[31m-[m
[31m-            rc = ngx_http_rds_json_output_field(r, ctx, b->pos, len,[m
[31m-                                                1 /* is null */);[m
[31m-[m
[31m-        } else {[m
[31m-            len = (uint32_t) (b->last - b->pos);[m
[31m-[m
[31m-            if (len >= total) {[m
[31m-                len = total;[m
[31m-            }[m
[31m-[m
[31m-            ctx->field_data_rest = total - len;[m
[31m-[m
[31m-            rc = ngx_http_rds_json_output_field(r, ctx, b->pos, len,[m
[31m-                                                0 /* not null */);[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        b->pos += len;[m
[31m-[m
[31m-        if (b->pos == b->last) {[m
[31m-            in = in->next;[m
[31m-        }[m
[31m-[m
[31m-        if (len < total) {[m
[31m-            dd("process field: need to read more field data");[m
[31m-[m
[31m-            ctx->state = state_expect_more_field_data;[m
[31m-[m
[31m-            return ngx_http_rds_json_process_more_field_data(r, in, ctx);[m
[31m-        }[m
[31m-[m
[31m-        ctx->cur_col++;[m
[31m-[m
[31m-        if (ctx->cur_col >= ctx->col_count) {[m
[31m-            dd("reached the end of the current row");[m
[31m-[m
[31m-            ctx->state = state_expect_row;[m
[31m-[m
[31m-            return ngx_http_rds_json_process_row(r, in, ctx);[m
[31m-        }[m
[31m-[m
[31m-        /* continue to process the next field (if any) */[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_process_more_field_data(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in, ngx_http_rds_json_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    size_t                       len;[m
[31m-[m
[31m-    for (;;) {[m
[31m-        if (in == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(b)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "rds_json: buf from upstream not in memory");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = b->last - b->pos;[m
[31m-[m
[31m-        if (len >= ctx->field_data_rest) {[m
[31m-            len = ctx->field_data_rest;[m
[31m-            ctx->field_data_rest = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->field_data_rest -= len;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_rds_json_output_more_field_data(r, ctx, b->pos, len);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        b->pos += len;[m
[31m-[m
[31m-        if (b->pos == b->last) {[m
[31m-            in = in->next;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->field_data_rest) {[m
[31m-            dd("process more field data: still some data remaining");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("process more field data: reached the end of the current field");[m
[31m-[m
[31m-        ctx->cur_col++;[m
[31m-[m
[31m-        if (ctx->cur_col >= ctx->col_count) {[m
[31m-            dd("process more field data: reached the end of the current row");[m
[31m-[m
[31m-            ctx->state = state_expect_row;[m
[31m-[m
[31m-            return ngx_http_rds_json_process_row(r, in, ctx);[m
[31m-        }[m
[31m-[m
[31m-        dd("proces more field data: read the next field");[m
[31m-[m
[31m-        ctx->state = state_expect_field;[m
[31m-[m
[31m-        return ngx_http_rds_json_process_field(r, in, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.h[m
[1mdeleted file mode 100644[m
[1mindex 54e0ecb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_processor.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_JSON_PROCESSOR_H[m
[31m-#define NGX_HTTP_RDS_JSON_PROCESSOR_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_rds_json_filter_module.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_json_process_header(ngx_http_request_t *r,[m
[31m-        ngx_chain_t *in, ngx_http_rds_json_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_json_process_col(ngx_http_request_t *r,[m
[31m-        ngx_chain_t *in, ngx_http_rds_json_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_json_process_row(ngx_http_request_t *r,[m
[31m-        ngx_chain_t *in, ngx_http_rds_json_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_json_process_field(ngx_http_request_t *r,[m
[31m-        ngx_chain_t *in, ngx_http_rds_json_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_json_process_more_field_data(ngx_http_request_t *r,[m
[31m-        ngx_chain_t *in, ngx_http_rds_json_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_JSON_PROCESSOR_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.c[m
[1mdeleted file mode 100644[m
[1mindex 8a7616b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include "ngx_http_rds_json_util.h"[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_http_rds_json_escape_json_str(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    ngx_uint_t                   n;[m
[31m-[m
[31m-    static u_char hex[] = "0123456789abcdef";[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        /* find the number of characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            /* UTF-8 char has high bit of 1 */[m
[31m-            if ((*src & 0x80) == 0) {[m
[31m-                switch (*src) {[m
[31m-                case '\r':[m
[31m-                case '\n':[m
[31m-                case '\\':[m
[31m-                case '"':[m
[31m-                case '\f':[m
[31m-                case '\b':[m
[31m-                case '\t':[m
[31m-                    n++;[m
[31m-                    break;[m
[31m-                default:[m
[31m-                    if (*src < 32) {[m
[31m-                        n += sizeof("\\u00xx") - 2;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if ((*src & 0x80) == 0) {[m
[31m-            switch (*src) {[m
[31m-            case '\r':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 'r';[m
[31m-                break;[m
[31m-[m
[31m-            case '\n':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 'n';[m
[31m-                break;[m
[31m-[m
[31m-            case '\\':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = '\\';[m
[31m-                break;[m
[31m-[m
[31m-            case '"':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = '"';[m
[31m-                break;[m
[31m-[m
[31m-            case '\f':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 'f';[m
[31m-                break;[m
[31m-[m
[31m-            case '\b':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 'b';[m
[31m-                break;[m
[31m-[m
[31m-            case '\t':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 't';[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (*src < 32) { /* control chars */[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'u';[m
[31m-                    *dst++ = '0';[m
[31m-                    *dst++ = '0';[m
[31m-                    *dst++ = hex[*src >> 4];[m
[31m-                    *dst++ = hex[*src & 0x0f];[m
[31m-                } else {[m
[31m-                    *dst++ = *src;[m
[31m-                }[m
[31m-                break;[m
[31m-            } /* switch */[m
[31m-[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_rds_json_test_content_type(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t           *type;[m
[31m-[m
[31m-    type = &r->headers_out.content_type;[m
[31m-    if (type->len != rds_content_type_len[m
[31m-        || ngx_strncmp(type->data, rds_content_type, rds_content_type_len)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_rds_json_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-#if 0[m
[31m-        if (cl->buf->temporary[m
[31m-                && ngx_buf_size(cl->buf) > 0) {[m
[31m-            ngx_pfree(pool, cl->buf->start);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.h[m
[1mdeleted file mode 100644[m
[1mindex bce303c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_json_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_JSON_UTIL_H[m
[31m-#define NGX_HTTP_RDS_JSON_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_UINT64_LEN[m
[31m-#define NGX_UINT64_LEN (sizeof("18446744073709551615") - 1)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_UINT16_LEN[m
[31m-#define NGX_UINT16_LEN (sizeof("65535") - 1)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef ngx_copy_literal[m
[31m-#define ngx_copy_literal(p, s)  ngx_copy(p, s, sizeof(s) - 1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-uintptr_t ngx_http_rds_json_escape_json_str(u_char *dst, u_char *src,[m
[31m-    size_t size);[m
[31m-[m
[31m-ngx_int_t ngx_http_rds_json_test_content_type(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_rds_json_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_JSON_UTIL_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_utils.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_utils.h[m
[1mdeleted file mode 100644[m
[1mindex 25d44d2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/ngx_http_rds_utils.h[m
[1m+++ /dev/null[m
[36m@@ -1,202 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_RDS_UTILS_H[m
[31m-#define NGX_HTTP_RDS_UTILS_H[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_rds_parse_header(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_rds_header_t *header)[m
[31m-{[m
[31m-    ssize_t          rest;[m
[31m-[m
[31m-    rest = sizeof(uint8_t)        /* endian type */[m
[31m-           + sizeof(uint32_t)     /* format version */[m
[31m-           + sizeof(uint8_t)      /* result type */[m
[31m-[m
[31m-           + sizeof(uint16_t)     /* standard error code */[m
[31m-           + sizeof(uint16_t)     /* driver-specific error code */[m
[31m-[m
[31m-           + sizeof(uint16_t)     /* driver-specific errstr len */[m
[31m-           + 0                    /* driver-specific errstr data */[m
[31m-           + sizeof(uint64_t)     /* affected rows */[m
[31m-           + sizeof(uint64_t)     /* insert id */[m
[31m-           + sizeof(uint16_t)     /* column count */[m
[31m-           ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: header is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* check endian type */[m
[31m-[m
[31m-    if (*(uint8_t *) b->pos !=[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN)[m
[31m-            0[m
[31m-#else /* big endian */[m
[31m-            1[m
[31m-#endif[m
[31m-       )[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: endian type in the header differ");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos += sizeof(uint8_t);[m
[31m-[m
[31m-    /* check RDS format version number */[m
[31m-[m
[31m-    if (*(uint32_t *) b->pos != (uint32_t) resty_dbd_stream_version) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: RDS format version differ");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("RDS format version: %d", (int) *(uint32_t *) b->pos);[m
[31m-[m
[31m-    b->pos += sizeof(uint32_t);[m
[31m-[m
[31m-    /* check RDS result type */[m
[31m-[m
[31m-    if (*b->pos != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: RDS result type must be 0 for now");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos++;[m
[31m-[m
[31m-    /* save the standard error code */[m
[31m-[m
[31m-    header->std_errcode = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save the driver-specific error code */[m
[31m-[m
[31m-    header->drv_errcode = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save the error string length */[m
[31m-[m
[31m-    header->errstr.len = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    dd("errstr len: %d", (int) header->errstr.len);[m
[31m-[m
[31m-    /* check the rest data's size */[m
[31m-[m
[31m-    rest = header->errstr.len[m
[31m-           + sizeof(uint64_t)     /* affected rows */[m
[31m-           + sizeof(uint64_t)     /* insert id */[m
[31m-           + sizeof(uint16_t)     /* column count */[m
[31m-           ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: header is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* save the error string data */[m
[31m-[m
[31m-    header->errstr.data = b->pos;[m
[31m-[m
[31m-    b->pos += header->errstr.len;[m
[31m-[m
[31m-    /* save affected rows */[m
[31m-[m
[31m-    header->affected_rows = *(uint64_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint64_t);[m
[31m-[m
[31m-    /* save insert id */[m
[31m-[m
[31m-    header->insert_id = *(uint64_t *)b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint64_t);[m
[31m-[m
[31m-    /* save column count */[m
[31m-[m
[31m-    header->col_count = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    dd("saved column count: %d", (int) header->col_count);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_rds_parse_col(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_rds_column_t *col)[m
[31m-{[m
[31m-    ssize_t         rest;[m
[31m-[m
[31m-    rest = sizeof(uint16_t)         /* std col type */[m
[31m-           + sizeof(uint16_t)       /* driver col type */[m
[31m-           + sizeof(uint16_t)       /* col name str len */[m
[31m-           ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: column spec is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* save standard column type */[m
[31m-    col->std_type = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save driver-specific column type */[m
[31m-    col->drv_type = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* read column name string length */[m
[31m-[m
[31m-    col->name.len = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    if (col->name.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds_json: column name empty");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rest = col->name.len;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rds: column name string is incomplete in the buf");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* save the column name string data */[m
[31m-[m
[31m-    col->name.data = ngx_palloc(r->pool, col->name.len);[m
[31m-    if (col->name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(col->name.data, b->pos, col->name.len);[m
[31m-    b->pos += col->name.len;[m
[31m-[m
[31m-    dd("saved column name \"%.*s\" (len %d, offset %d)",[m
[31m-       (int) col->name.len, col->name.data,[m
[31m-       (int) col->name.len, (int) (b->pos - b->start));[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_RDS_UTILS_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/resty_dbd_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/resty_dbd_stream.h[m
[1mdeleted file mode 100644[m
[1mindex ebb0cb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/src/resty_dbd_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-#ifndef RESTY_DBD_STREAME_H[m
[31m-#define RESTY_DBD_STREAME_H[m
[31m-[m
[31m-#define resty_dbd_stream_version 3[m
[31m-#define resty_dbd_stream_version_string "0.0.3"[m
[31m-[m
[31m-#define rds_content_type \[m
[31m-    "application/x-resty-dbd-stream"[m
[31m-[m
[31m-#define rds_content_type_len \[m
[31m-    (sizeof(rds_content_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_rough_col_type_int = 0 << 14,[m
[31m-    rds_rough_col_type_float = 1 << 14,[m
[31m-    rds_rough_col_type_str = 2 << 14,[m
[31m-    rds_rough_col_type_bool = 3 << 14[m
[31m-[m
[31m-} rds_rough_col_type_t;[m
[31m-[m
[31m-[m
[31m-/* The following types (or spellings thereof) are specified[m
[31m- * by SQL:[m
[31m- * bigint, bit, bit varying, boolean, char, character varying,[m
[31m- * character, varchar, date, double precision, integer,[m
[31m- * interval, numeric, decimal, real, smallint,[m
[31m- * time (with or without time zone),[m
[31m- * timestamp (with or without time zone), xml */[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_col_type_unknown = 0 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bigint = 1 | rds_rough_col_type_int,[m
[31m-    rds_col_type_bit = 2 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bit_varying = 3 | rds_rough_col_type_str,[m
[31m-[m
[31m-    rds_col_type_bool = 4 | rds_rough_col_type_bool,[m
[31m-    rds_col_type_char = 5 | rds_rough_col_type_str,[m
[31m-    rds_col_type_varchar = 6 | rds_rough_col_type_str,[m
[31m-    rds_col_type_date = 7 | rds_rough_col_type_str,[m
[31m-    rds_col_type_double = 8 | rds_rough_col_type_float,[m
[31m-    rds_col_type_integer = 9 | rds_rough_col_type_int,[m
[31m-    rds_col_type_interval = 10 | rds_rough_col_type_float,[m
[31m-    rds_col_type_decimal = 11 | rds_rough_col_type_float,[m
[31m-    rds_col_type_real = 12 | rds_rough_col_type_float,[m
[31m-    rds_col_type_smallint = 13 | rds_rough_col_type_int,[m
[31m-    rds_col_type_time_with_time_zone = 14 | rds_rough_col_type_str,[m
[31m-    rds_col_type_time = 15 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp_with_time_zone = 16 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp = 17 | rds_rough_col_type_str,[m
[31m-    rds_col_type_xml = 18 | rds_rough_col_type_str,[m
[31m-[m
[31m-    /* our additions */[m
[31m-    rds_col_type_blob = 19 | rds_rough_col_type_str[m
[31m-[m
[31m-} rds_col_type_t;[m
[31m-[m
[31m-#endif /* RESTY_DBD_STREAME_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex e57b498..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,201 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $http_config2 = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-[m
[31m-worker_connections(128);[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: birds - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS birds";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: birds - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE birds (`\"name\"` text, height real)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: birds - insert values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "[m
[31m-INSERT INTO birds (`\"name\"`, height)[m
[31m-VALUES[m
[31m-    ('hello \"tom', 3.14),[m
[31m-    ('hi,ya', -3),[m
[31m-    ('hey\\ndad', 7),[m
[31m-    ('\\rkay', 0.005),[m
[31m-    ('ab;c', 0.005),[m
[31m-    ('foo\\tbar', 21);";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: cats - drop table - pg[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "DROP TABLE cats";[m
[31m-        error_page 500  = /ignore;[m
[31m-    }[m
[31m-[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: cats - create table - pg[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: cats - insert value - pg[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: cats - insert value - pg[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/buf.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/buf.t[m
[1mdeleted file mode 100644[m
[1mindex 5118803..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/buf.t[m
[1m+++ /dev/null[m
[36m@@ -1,231 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rds in a single buf (empty result set)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-    set_unescape_uri $rds $arg_rds;[m
[31m-    echo_duplicate 1 $rds;[m
[31m-    rds_json on;[m
[31m-}[m
[31m---- request eval[m
[31m-my $rds = "\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-$rds = uri_escape($rds);[m
[31m-"GET /single?rds=$rds"[m
[31m---- response_body chop[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rds in a single buf (non-empty result set)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-    set_unescape_uri $rds $arg_rds;[m
[31m-    echo_duplicate 1 $rds;[m
[31m-    rds_json on;[m
[31m-}[m
[31m---- request eval[m
[31m-my $rds =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-$rds = uri_escape($rds);[m
[31m-"GET /single?rds=$rds"[m
[31m---- response_body chop[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rds in a single buf (non-empty result set, and each row in a single buf)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-[m
[31m-    set_unescape_uri $a $arg_a;[m
[31m-    set_unescape_uri $b $arg_b;[m
[31m-    set_unescape_uri $c $arg_c;[m
[31m-    set_unescape_uri $d $arg_d;[m
[31m-[m
[31m-    echo_duplicate 1 $a;[m
[31m-    echo_duplicate 1 $b;[m
[31m-    echo_duplicate 1 $c;[m
[31m-    echo_duplicate 1 $d;[m
[31m-[m
[31m-    rds_json on;[m
[31m-}[m
[31m---- request eval[m
[31m-my $a =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name";  # col name data[m
[31m-[m
[31m-my $b =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"";  # field data[m
[31m-[m
[31m-my $c =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob";  # field data[m
[31m-[m
[31m-my $d =[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-[m
[31m-$a = uri_escape($a);[m
[31m-$b = uri_escape($b);[m
[31m-$c = uri_escape($c);[m
[31m-$d = uri_escape($d);[m
[31m-[m
[31m-"GET /single?a=$a&b=$b&c=$c&d=$d"[m
[31m---- response_body chop[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rds in a single buf (non-empty result set, and each row in a single buf)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-[m
[31m-    set_unescape_uri $a $arg_a;[m
[31m-    set_unescape_uri $b $arg_b;[m
[31m-    set_unescape_uri $c $arg_c;[m
[31m-[m
[31m-    echo -n $a;[m
[31m-    echo -n $b;[m
[31m-    echo -n $c;[m
[31m-[m
[31m-    rds_json on;[m
[31m-}[m
[31m---- request eval[m
[31m-my $a =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name";  # col name data[m
[31m-[m
[31m-my $b =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"";  # field data[m
[31m-[m
[31m-my $c =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-[m
[31m-$a = uri_escape($a);[m
[31m-$b = uri_escape($b);[m
[31m-$c = uri_escape($c);[m
[31m-[m
[31m-"GET /single?a=$a&b=$b&c=$c"[m
[31m---- response_body chop[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/buf.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/buf.t[m
[1mdeleted file mode 100644[m
[1mindex f467942..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/buf.t[m
[1m+++ /dev/null[m
[36m@@ -1,235 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rds in a single buf (empty result set)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-    set_unescape_uri $rds $arg_rds;[m
[31m-    echo_duplicate 1 $rds;[m
[31m-    rds_json on;[m
[31m-    rds_json_format compact;[m
[31m-}[m
[31m---- request eval[m
[31m-my $rds = "\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-$rds = uri_escape($rds);[m
[31m-"GET /single?rds=$rds"[m
[31m---- response_body chop[m
[31m-[["id","name"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rds in a single buf (non-empty result set)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-    set_unescape_uri $rds $arg_rds;[m
[31m-    echo_duplicate 1 $rds;[m
[31m-    rds_json on;[m
[31m-    rds_json_format compact;[m
[31m-}[m
[31m---- request eval[m
[31m-my $rds =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-$rds = uri_escape($rds);[m
[31m-"GET /single?rds=$rds"[m
[31m---- response_body chop[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rds in a single buf (non-empty result set, and each row in a single buf)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-[m
[31m-    set_unescape_uri $a $arg_a;[m
[31m-    set_unescape_uri $b $arg_b;[m
[31m-    set_unescape_uri $c $arg_c;[m
[31m-    set_unescape_uri $d $arg_d;[m
[31m-[m
[31m-    echo_duplicate 1 $a;[m
[31m-    echo_duplicate 1 $b;[m
[31m-    echo_duplicate 1 $c;[m
[31m-    echo_duplicate 1 $d;[m
[31m-[m
[31m-    rds_json on;[m
[31m-    rds_json_format compact;[m
[31m-}[m
[31m---- request eval[m
[31m-my $a =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name";  # col name data[m
[31m-[m
[31m-my $b =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"";  # field data[m
[31m-[m
[31m-my $c =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob";  # field data[m
[31m-[m
[31m-my $d =[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-[m
[31m-$a = uri_escape($a);[m
[31m-$b = uri_escape($b);[m
[31m-$c = uri_escape($c);[m
[31m-$d = uri_escape($d);[m
[31m-[m
[31m-"GET /single?a=$a&b=$b&c=$c&d=$d"[m
[31m---- response_body chop[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rds in a single buf (non-empty result set, and each row in a single buf)[m
[31m---- config[m
[31m-location = /single {[m
[31m-    default_type 'application/x-resty-dbd-stream';[m
[31m-[m
[31m-    set_unescape_uri $a $arg_a;[m
[31m-    set_unescape_uri $b $arg_b;[m
[31m-    set_unescape_uri $c $arg_c;[m
[31m-[m
[31m-    echo -n $a;[m
[31m-    echo -n $b;[m
[31m-    echo -n $c;[m
[31m-[m
[31m-    rds_json on;[m
[31m-    rds_json_format compact;[m
[31m-}[m
[31m---- request eval[m
[31m-my $a =[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{01}\x{00}".  # std col type (bigint/int)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name";  # col name data[m
[31m-[m
[31m-my $b =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"";  # field data[m
[31m-[m
[31m-my $c =[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}";  # row list terminator[m
[31m-[m
[31m-use URI::Escape;[m
[31m-[m
[31m-$a = uri_escape($a);[m
[31m-$b = uri_escape($b);[m
[31m-$c = uri_escape($c);[m
[31m-[m
[31m-"GET /single?a=$a&b=$b&c=$c"[m
[31m---- response_body chop[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/openresty.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/openresty.t[m
[1mdeleted file mode 100644[m
[1mindex da8d2c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/openresty.t[m
[1m+++ /dev/null[m
[36m@@ -1,648 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket skip_all => 'not working at all (missing data)';[m
[31m-[m
[31m-#repeat_each(100);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-worker_connections(128);[m
[31m-workers(1);[m
[31m-#master_on;[m
[31m-log_level('warn');[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $config = <<'_EOC_';[m
[31m-    xss_get on;[m
[31m-    xss_callback_arg _callback;[m
[31m-    rds_json on;[m
[31m-    rds_json_format compact;[m
[31m-[m
[31m-   location = /auth {[m
[31m-        #internal;[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        #internal;[m
[31m-        eval_subrequest_in_memory off;[m
[31m-        eval $res {[m
[31m-            set_quote_sql_str $user $arg_user;[m
[31m-            set $sql 'select count(*) res from users where name=$user';[m
[31m-            drizzle_query $sql;[m
[31m-            drizzle_pass backend;[m
[31m-            #echo $sql;[m
[31m-            #echo hi;[m
[31m-            rds_json on;[m
[31m-            rds_json_content_type application/octet-stream;[m
[31m-        }[m
[31m-        #echo $res;[m
[31m-        if ($res ~ '"res":1') {[m
[31m-            echo pass;[m
[31m-            break;[m
[31m-        }[m
[31m-        if ($res !~ '"res":1') {[m
[31m-            return 403;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    # XXX we should implement these in the ngx_xss module[m
[31m-    location @err500 { rds_json_ret 500 "Internal Server Error"; }[m
[31m-    location @err404 { rds_json_ret 404 "Not Found"; }[m
[31m-    location @err400 { rds_json_ret 400 "Bad Request"; }[m
[31m-    location @err403 { rds_json_ret 403 "Forbidden"; }[m
[31m-    location @err502 { rds_json_ret 502 "Bad Gateway"; }[m
[31m-    location @err503 { rds_json_ret 503 "Service Unavailable"; }[m
[31m-[m
[31m-    error_page 500 = @err500;[m
[31m-    error_page 404 = @err404;[m
[31m-    error_page 403 = @err403;[m
[31m-    error_page 400 = @err400;[m
[31m-    error_page 502 = @err502;[m
[31m-    error_page 503 = @err503;[m
[31m-    error_page 504 507 = @err500;[m
[31m-[m
[31m-    location = '/=/view/PostsByMonth/~/~' {[m
[31m-        if ($arg_year !~ '^\d{4}$') {[m
[31m-            rds_json_ret 400 'Bad "year" argument';[m
[31m-        }[m
[31m-        if ($arg_month !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "month" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select id, title, day(created) as day[m
[31m-from posts[m
[31m-where year(created) = $arg_year and month(created) = $arg_month[m
[31m-order by created asc";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/RecentComments/~/~' {[m
[31m-        set $offset $arg_offset;[m
[31m-        set_if_empty $offset 0;[m
[31m-[m
[31m-        set $limit $arg_limit;[m
[31m-        set_if_empty $limit 10;[m
[31m-[m
[31m-        if ($offset !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "offset" argument';[m
[31m-        }[m
[31m-        if ($limit !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "limit" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select comments.id as id, post, sender, title[m
[31m-from posts, comments[m
[31m-where post = posts.id[m
[31m-order by comments.id desc[m
[31m-limit $offset, $limit";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/RecentPosts/~/~' {[m
[31m-        set $offset $arg_offset;[m
[31m-        set_if_empty $offset 0;[m
[31m-[m
[31m-        set $limit $arg_limit;[m
[31m-        set_if_empty $limit 10;[m
[31m-[m
[31m-        if ($offset !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "offset" argument';[m
[31m-        }[m
[31m-        if ($limit !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "limit" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select id, title[m
[31m-from posts[m
[31m-order by id desc[m
[31m-limit $offset, $limit";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/PrevNextPost/~/~' {[m
[31m-        if ($arg_current !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "current" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"(select id, title[m
[31m-  from posts[m
[31m-  where id < $arg_current[m
[31m-  order by id desc[m
[31m-  limit 1)[m
[31m-  union[m
[31m- (select id, title[m
[31m-  from posts[m
[31m-  where id > $arg_current[m
[31m-  order by id asc[m
[31m-  limit 1)";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/RowCount/~/~' {[m
[31m-        if ($arg_model = 'Post') {[m
[31m-            drizzle_query "select count(*) as count from posts";[m
[31m-            drizzle_pass backend;[m
[31m-        }[m
[31m-        if ($arg_model = 'Comment') {[m
[31m-            drizzle_query "select count(*) as count from comments";[m
[31m-            drizzle_pass backend;[m
[31m-        }[m
[31m-[m
[31m-        rds_json_ret 400 'Bad "model" argument';[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/PostCountByMonths/~/~' {[m
[31m-        set $offset $arg_offset;[m
[31m-        set_if_empty $offset 0;[m
[31m-[m
[31m-        set $limit $arg_limit;[m
[31m-        set_if_empty $limit 10;[m
[31m-[m
[31m-        if ($offset !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "offset" argument';[m
[31m-        }[m
[31m-        if ($limit !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "limit" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select date_format(created, '%Y-%m-01') `year_month`, count(*) count[m
[31m-from posts[m
[31m-group by `year_month`[m
[31m-order by `year_month` desc[m
[31m-limit $offset, $limit";[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/FullPostsByMonth/~/~' {[m
[31m-        set $count $arg_count;[m
[31m-        set_if_empty $count 40;[m
[31m-[m
[31m-        if ($arg_year !~ '^(?:19|20)\d{2}$') {[m
[31m-            rds_json_ret 400 'Bad "year" argument';[m
[31m-        }[m
[31m-        if ($arg_month !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "month" argument';[m
[31m-        }[m
[31m-        if ($arg_count !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "count" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select * from posts[m
[31m-where year(created) = $arg_year and month(created) = $arg_month[m
[31m-order by id desc[m
[31m-limit $count";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/PrevNextArchive/~/~' {[m
[31m-        if ($arg_now !~ '^\d{4}-\d{1,2}(?:-\d{1,2})?$') {[m
[31m-            rds_json_ret 400 'Bad "now" argument';[m
[31m-        }[m
[31m-        if ($arg_month !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "month" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"(select 'next' as id, month(created) as month, year(created) as year[m
[31m-  from posts[m
[31m-  where created > $arg_now and month(created) <> $arg_month[m
[31m-  order by created asc[m
[31m-  limit 1)[m
[31m-  union[m
[31m- (select 'prev' as id, month(created) as month, year(created) as year[m
[31m-  from posts[m
[31m-  where created < $arg_now and month(created) <> $arg_month[m
[31m-  order by created desc[m
[31m-  limit 1)";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/batch/GetSidebar/~/~' {[m
[31m-        if ($arg_year !~ '^(?:19|20)\d{2}$') {[m
[31m-            rds_json_ret 400 'Bad "year" argument';[m
[31m-        }[m
[31m-        if ($arg_month !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "month" argument';[m
[31m-        }[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-        echo '[';[m
[31m-        echo_location_async '/=/view/PostsByMonth/~/~' "year=$arg_year&month=$arg_month";[m
[31m-        echo ',';[m
[31m-        echo_location_async '/=/view/RecentPosts/~/~' "offset=0&limit=6";[m
[31m-        echo ',';[m
[31m-        echo_location_async '/=/view/RecentComments/~/~' "offset=0&limit=6";[m
[31m-        echo ',';[m
[31m-        echo_location_async '/=/view/PostCountByMonths/~/~' "offset=0&limit=12";[m
[31m-        echo ']';[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/batch/GetFullPost/~/~' {[m
[31m-        if ($arg_id !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "id" argument';[m
[31m-        }[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-        echo '[';[m
[31m-        echo_location_async "/=/model/Post/id/$arg_id";[m
[31m-        echo ',';[m
[31m-        echo_location_async "/=/view/PrevNextPost/~/~" "current=$arg_id";[m
[31m-        echo ',';[m
[31m-        echo_location_async "/=/model/Comment/post/$arg_id" "_order_by=id:desc";[m
[31m-        echo ']';[m
[31m-    }[m
[31m-[m
[31m-    location ~* '^/=/model/Post/id/(.*)$' {[m
[31m-        set $id $1;[m
[31m-        if ($id !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "id" value';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query "select * from posts where id = $id";[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location ~* '^/=/model/Comment/post/(.*)$' {[m
[31m-        set $post $1;[m
[31m-        if ($post !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "post" value';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query "select * from comments where post = $post";[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/model/Post/~/~' {[m
[31m-        if ($arg__offset !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "_offset" argument';[m
[31m-        }[m
[31m-        if ($arg__limit !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "_limit" argument';[m
[31m-        }[m
[31m-        if ($arg__order_by !~ '^([A-Za-z]\w*)%3A(desc|asc)$') {[m
[31m-            rds_json_ret 400 'Bad "_order_by" argument';[m
[31m-        }[m
[31m-        set $col $1;[m
[31m-        set $order $2;[m
[31m-        drizzle_query[m
[31m-"select *[m
[31m-from posts[m
[31m-order by `$col` $order[m
[31m-limit $arg__offset, $arg__limit";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/batch/NewComment/~/~' {[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        set_unescape_uri $sender $arg_sender;[m
[31m-[m
[31m-        set_unescape_uri $email $arg_email;[m
[31m-[m
[31m-        set_unescape_uri $url $arg_url;[m
[31m-[m
[31m-        set_unescape_uri $body $arg_body;[m
[31m-[m
[31m-        set_unescape_uri $post_id $arg_post_id;[m
[31m-[m
[31m-        if ($sender !~ '\S') {[m
[31m-            rds_json_ret 400 "Bad \"sender\" argument";[m
[31m-        }[m
[31m-        if ($email !~ '^[-A-Za-z0-9_.]+@[-A-Za-z0-9_.]+$') {[m
[31m-            rds_json_ret 400 "Bad \"email\" argument";[m
[31m-        }[m
[31m-        if ($url !~ '^(?:\s*|https?://\S+)$') {[m
[31m-            rds_json_ret 400 "Bad \"url\" argument: $url";[m
[31m-        }[m
[31m-        if ($body ~ '^\s*$') {[m
[31m-            rds_json_ret 400 "Bad \"body\" argument";[m
[31m-        }[m
[31m-        if ($post_id !~ '^[1-9]\d*$') {[m
[31m-            rds_json_ret 400 "Bad \"post_id\" argument";[m
[31m-        }[m
[31m-[m
[31m-        set_quote_sql_str $sender;[m
[31m-        set_quote_sql_str $email;[m
[31m-        set_quote_sql_str $url;[m
[31m-        set_quote_sql_str $body;[m
[31m-[m
[31m-        # XXX these operations should be put into a[m
[31m-        # single transaction[m
[31m-        echo '[';[m
[31m-[m
[31m-        echo_location '/=/action/RunSQL/~/~'[m
[31m-"insert into comments (sender, email, url, body, post)[m
[31m-values($sender, $email, $url, $body, $post_id)";[m
[31m-[m
[31m-        echo ',';[m
[31m-[m
[31m-        echo_location '/=/action/RunSQL/~/~'[m
[31m-"update posts[m
[31m-set comments = comments + 1[m
[31m-where id = $post_id";[m
[31m-[m
[31m-        echo ']';[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/action/RunSQL/~/~' {[m
[31m-        internal;[m
[31m-        drizzle_query $query_string;[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: PostsByMonth view (no month arg)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo({"errcode":400,"errstr":"Bad \"month\" argument"});[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: PostsByMonth view (bad month)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?month=1234&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo({"errcode":400,"errstr":"Bad \"month\" argument"});[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: PostsByMonth view (emtpy result)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?year=1984&month=2&_callback=bar[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-bar([]);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: PostsByMonth view (non-emtpy result)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?year=2009&month=10&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo([{"id":114,"title":"Hacking on the Nginx echo module","day":15}]);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: PostsByMonth view (non-emtpy result)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?year=2009&month=12&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo([{"id":117,"title":"Major updates to ngx_chunkin: lots of bug fixes and beginning of keep-alive support","day":4},{"id":118,"title":"ngx_memc: an extended version of ngx_memcached that supports set, add, delete, and many more commands","day":6},{"id":119,"title":"Test::Nginx::LWP and Test::Nginx::Socket are now on CPAN","day":8}]);[m
[31m---- timeout: 90[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: GetSideBar[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/batch/GetSidebar/~/~?year=2009&month=10&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo([[m
[31m-[{"id":114,"title":"Hacking on the Nginx echo module","day":15}],[m
[31m-[{"id":119,"title":"Test::Nginx::LWP and Test::Nginx::Socket are now on CPAN"},{"id":118,"title":"ngx_memc: an extended version of ngx_memcached that supports set, add, delete, and many more commands"},{"id":117,"title":"Major updates to ngx_chunkin: lots of bug fixes and beginning of keep-alive support"},{"id":116,"title":"The \"headers more\" module: scripting input and output filters in your Nginx config file"},{"id":115,"title":"The \"chunkin\" module: Experimental chunked input support for Nginx"},{"id":114,"title":"Hacking on the Nginx echo module"}],[m
[31m-[{"id":179,"post":101,"sender":"agentzh","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":178,"post":101,"sender":"Winter","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":177,"post":100,"sender":"Mountain","title":"漂在北京"},{"id":176,"post":106,"sender":"agentzh","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":175,"post":106,"sender":"gosber","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":174,"post":105,"sender":"cnangel","title":"SSH::Batch: Treating clusters as maths sets and intervals"}],[m
[31m-[{"year_month":"2009-12-01","count":3},{"year_month":"2009-11-01","count":2},{"year_month":"2009-10-01","count":1},{"year_month":"2009-09-01","count":5},{"year_month":"2009-05-01","count":2},{"year_month":"2009-04-01","count":3},{"year_month":"2009-02-01","count":2},{"year_month":"2008-12-01","count":3},{"year_month":"2008-11-01","count":2},{"year_month":"2008-10-01","count":2},{"year_month":"2008-09-01","count":4},{"year_month":"2008-08-01","count":2}]][m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: GetFullPost[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/batch/GetFullPost/~/~?id=116&_user=agentzh.Public&_callback=OpenResty.callbackMap%5B1264354204389%5D[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: RowCount[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/RowCount/~/~?model=Post&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo([{"count":118}]);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: GetFullPost bug[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/model/Comment/post/67[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body_like: laser[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: more field data error[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/model/Post/~/~?_limit=5&_order_by=id%3Adesc&_offset=100[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body_like: 测试[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: default arguments[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/RecentComments/~/~[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-[{"id":179,"post":101,"sender":"agentzh","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":178,"post":101,"sender":"Winter","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":177,"post":100,"sender":"Mountain","title":"漂在北京"},{"id":176,"post":106,"sender":"agentzh","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":175,"post":106,"sender":"gosber","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":174,"post":105,"sender":"cnangel","title":"SSH::Batch: Treating clusters as maths sets and intervals"},{"id":173,"post":106,"sender":"cnangel","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":172,"post":104,"sender":"agentzh","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"},{"id":171,"post":104,"sender":"kindy","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"},{"id":170,"post":104,"sender":"cnangel","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"}][m
[31m---- error_code: 200[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: post a comment with empty body[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/batch/NewComment/~/~?sender=agentzh&email=agentzh@gmail.com&body=&post_id=3[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":400,"errstr":"Bad \"body\" argument"}[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: post a comment with valid gmail[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/batch/NewComment/~/~?sender=agentzh&email=agentzh%40gmail.com&body=hi&post_id=[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":400,"errstr":"Bad \"post_id\" argument"}[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: try to run the internal location[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/action/RunSQL/~/~?select[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":404,"errstr":"Not Found"}[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: auth[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /auth?user=agentzh[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body[m
[31m-pass[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: auth[m
[31m-[m
[31m-init db:[m
[31m-[m
[31m-create table users ([m
[31m-    id serial primary key,[m
[31m-    name text not null,[m
[31m-    password text not null[m
[31m-);[m
[31m-[m
[31m-insert into users[m
[31m-    (name, password)[m
[31m-    values ('agentzh', 'some_pass');[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /auth?user=john[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":403,"errstr":"Forbidden"}[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: auth[m
[31m-[m
[31m-db init:[m
[31m-[m
[31m-create table users ([m
[31m-    id serial primary key,[m
[31m-    name text not null,[m
[31m-    password text not null[m
[31m-);[m
[31m-[m
[31m-insert into users[m
[31m-    (name, password)[m
[31m-    values ('agentzh', 'some_pass');[m
[31m-[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body[m
[31m-pass[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: default arguments (small pagesize)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval[m
[31m-"rds_json_buffer_size 1;[m
[31m-$::config"[m
[31m---- request[m
[31m-GET /=/view/RecentComments/~/~[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-[{"id":179,"post":101,"sender":"agentzh","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":178,"post":101,"sender":"Winter","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":177,"post":100,"sender":"Mountain","title":"漂在北京"},{"id":176,"post":106,"sender":"agentzh","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":175,"post":106,"sender":"gosber","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":174,"post":105,"sender":"cnangel","title":"SSH::Batch: Treating clusters as maths sets and intervals"},{"id":173,"post":106,"sender":"cnangel","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":172,"post":104,"sender":"agentzh","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"},{"id":171,"post":104,"sender":"kindy","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"},{"id":170,"post":104,"sender":"cnangel","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"}][m
[31m---- error_code: 200[m
[31m---- timeout: 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/sanity-stream.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/sanity-stream.t[m
[1mdeleted file mode 100644[m
[1mindex 66cf7fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/sanity-stream.t[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(10);[m
[31m-no_shuffle();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 3;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-[["id","name"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        if ($arg_name ~ '[^A-Za-z0-9]') {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='$arg_name' where name='$arg_name'";[m
[31m-[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql?name=bob[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: invalid SQL[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select '32";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module:[m
[31m-Content-Type: text/html[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: single row, single col[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists singles";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table singles (name varchar(15));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into singles values ('marry');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from singles;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"affected_rows":1}[m
[31m-[["name"],["marry"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: floating number and insert id[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (val) values (3.1415926);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","val"],[1,3.1415926]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: text blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body text);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('hello');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","body"],[1,"hello"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bool blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, flag bool);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (true);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (false);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","flag"],[1,1],[2,0]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: bit field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, flag bit);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (1);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (0);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","flag"],[1,"\u0001"],[2,"\u0000"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: date type[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, created date);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (created) values ('2007-05-24');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","created"],[1,"2007-05-24"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: strings need to be escaped[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\bhello\Z');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","body"],[1,"a\r\nb\bhello\u001a"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: null values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, name char(10), age integer);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (name, age) values ('', null);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (name, age) values (null, 0);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","name","age"],[1,"",null],[2,null,0]][m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 91b57ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/compact/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,402 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(10);[m
[31m-no_shuffle();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 3;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-[["id","name"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        if ($arg_name ~ '[^A-Za-z0-9]') {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='$arg_name' where name='$arg_name'";[m
[31m-[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql?name=bob[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: invalid SQL[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select '32";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module:[m
[31m-Content-Type: text/html[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: single row, single col[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists singles";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table singles (name varchar(15));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into singles values ('marry');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from singles;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"affected_rows":1}[m
[31m-[["name"],["marry"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: floating number and insert id[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (val) values (3.1415926);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","val"],[1,3.1415926]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: text blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body text);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('hello');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","body"],[1,"hello"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bool blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, flag bool);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (true);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (false);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","flag"],[1,1],[2,0]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: bit field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, flag bit);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (1);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (0);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","flag"],[1,"\u0001"],[2,"\u0000"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: date type[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, created date);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (created) values ('2007-05-24');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","created"],[1,"2007-05-24"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: strings need to be escaped[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\bhello\Z');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","body"],[1,"a\r\nb\bhello\u001a"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: null values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, name char(10), age integer);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (name, age) values ('', null);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (name, age) values (null, 0);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","name","age"],[1,"",null],[2,null,0]][m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/escape.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/escape.t[m
[1mdeleted file mode 100644[m
[1mindex 44c6c57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/escape.t[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: escaping column names (normal mode)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select `\"name\"`, height from birds order by height;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chomp[m
[31m-[{"\"name\"":"hi,ya","height":-3},{"\"name\"":"\rkay","height":0.005},{"\"name\"":"ab;c","height":0.005},{"\"name\"":"hello \"tom","height":3.14},{"\"name\"":"hey\ndad","height":7},{"\"name\"":"foo\tbar","height":21}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: escaping column names (compact mode)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query "[m
[31m-            select `\"name\"`, height from birds order by height;[m
[31m-        ";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chomp[m
[31m-[["\"name\"","height"],["hi,ya",-3],["\rkay",0.005],["ab;c",0.005],["hello \"tom",3.14],["hey\ndad",7],["foo\tbar",21]][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/form.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/form.t[m
[1mdeleted file mode 100644[m
[1mindex 7fac2b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/form.t[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set_form_input $sql 'sql';[m
[31m-        set_unescape_uri $sql;[m
[31m-        #echo $sql;[m
[31m-        drizzle_query $sql;[m
[31m-        drizzle_pass backend;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /mysql[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/openresty.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/openresty.t[m
[1mdeleted file mode 100644[m
[1mindex b843a76..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/openresty.t[m
[1m+++ /dev/null[m
[36m@@ -1,647 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket skip_all => 'not working at all (missing data)';[m
[31m-[m
[31m-#repeat_each(100);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-worker_connections(128);[m
[31m-workers(1);[m
[31m-#master_on;[m
[31m-log_level('warn');[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $config = <<'_EOC_';[m
[31m-    xss_get on;[m
[31m-    xss_callback_arg _callback;[m
[31m-    rds_json on;[m
[31m-[m
[31m-   location = /auth {[m
[31m-        #internal;[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        #internal;[m
[31m-        eval_subrequest_in_memory off;[m
[31m-        eval $res {[m
[31m-            set_quote_sql_str $user $arg_user;[m
[31m-            set $sql 'select count(*) res from users where name=$user';[m
[31m-            drizzle_query $sql;[m
[31m-            drizzle_pass backend;[m
[31m-            #echo $sql;[m
[31m-            #echo hi;[m
[31m-            rds_json on;[m
[31m-            rds_json_content_type application/octet-stream;[m
[31m-        }[m
[31m-        #echo $res;[m
[31m-        if ($res ~ '"res":1') {[m
[31m-            echo pass;[m
[31m-            break;[m
[31m-        }[m
[31m-        if ($res !~ '"res":1') {[m
[31m-            return 403;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    # XXX we should implement these in the ngx_xss module[m
[31m-    location @err500 { rds_json_ret 500 "Internal Server Error"; }[m
[31m-    location @err404 { rds_json_ret 404 "Not Found"; }[m
[31m-    location @err400 { rds_json_ret 400 "Bad Request"; }[m
[31m-    location @err403 { rds_json_ret 403 "Forbidden"; }[m
[31m-    location @err502 { rds_json_ret 502 "Bad Gateway"; }[m
[31m-    location @err503 { rds_json_ret 503 "Service Unavailable"; }[m
[31m-[m
[31m-    error_page 500 = @err500;[m
[31m-    error_page 404 = @err404;[m
[31m-    error_page 403 = @err403;[m
[31m-    error_page 400 = @err400;[m
[31m-    error_page 502 = @err502;[m
[31m-    error_page 503 = @err503;[m
[31m-    error_page 504 507 = @err500;[m
[31m-[m
[31m-    location = '/=/view/PostsByMonth/~/~' {[m
[31m-        if ($arg_year !~ '^\d{4}$') {[m
[31m-            rds_json_ret 400 'Bad "year" argument';[m
[31m-        }[m
[31m-        if ($arg_month !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "month" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select id, title, day(created) as day[m
[31m-from posts[m
[31m-where year(created) = $arg_year and month(created) = $arg_month[m
[31m-order by created asc";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/RecentComments/~/~' {[m
[31m-        set $offset $arg_offset;[m
[31m-        set_if_empty $offset 0;[m
[31m-[m
[31m-        set $limit $arg_limit;[m
[31m-        set_if_empty $limit 10;[m
[31m-[m
[31m-        if ($offset !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "offset" argument';[m
[31m-        }[m
[31m-        if ($limit !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "limit" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select comments.id as id, post, sender, title[m
[31m-from posts, comments[m
[31m-where post = posts.id[m
[31m-order by comments.id desc[m
[31m-limit $offset, $limit";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/RecentPosts/~/~' {[m
[31m-        set $offset $arg_offset;[m
[31m-        set_if_empty $offset 0;[m
[31m-[m
[31m-        set $limit $arg_limit;[m
[31m-        set_if_empty $limit 10;[m
[31m-[m
[31m-        if ($offset !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "offset" argument';[m
[31m-        }[m
[31m-        if ($limit !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "limit" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select id, title[m
[31m-from posts[m
[31m-order by id desc[m
[31m-limit $offset, $limit";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/PrevNextPost/~/~' {[m
[31m-        if ($arg_current !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "current" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"(select id, title[m
[31m-  from posts[m
[31m-  where id < $arg_current[m
[31m-  order by id desc[m
[31m-  limit 1)[m
[31m-  union[m
[31m- (select id, title[m
[31m-  from posts[m
[31m-  where id > $arg_current[m
[31m-  order by id asc[m
[31m-  limit 1)";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/RowCount/~/~' {[m
[31m-        if ($arg_model = 'Post') {[m
[31m-            drizzle_query "select count(*) as count from posts";[m
[31m-            drizzle_pass backend;[m
[31m-        }[m
[31m-        if ($arg_model = 'Comment') {[m
[31m-            drizzle_query "select count(*) as count from comments";[m
[31m-            drizzle_pass backend;[m
[31m-        }[m
[31m-[m
[31m-        rds_json_ret 400 'Bad "model" argument';[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/PostCountByMonths/~/~' {[m
[31m-        set $offset $arg_offset;[m
[31m-        set_if_empty $offset 0;[m
[31m-[m
[31m-        set $limit $arg_limit;[m
[31m-        set_if_empty $limit 10;[m
[31m-[m
[31m-        if ($offset !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "offset" argument';[m
[31m-        }[m
[31m-        if ($limit !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "limit" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select date_format(created, '%Y-%m-01') `year_month`, count(*) count[m
[31m-from posts[m
[31m-group by `year_month`[m
[31m-order by `year_month` desc[m
[31m-limit $offset, $limit";[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/FullPostsByMonth/~/~' {[m
[31m-        set $count $arg_count;[m
[31m-        set_if_empty $count 40;[m
[31m-[m
[31m-        if ($arg_year !~ '^(?:19|20)\d{2}$') {[m
[31m-            rds_json_ret 400 'Bad "year" argument';[m
[31m-        }[m
[31m-        if ($arg_month !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "month" argument';[m
[31m-        }[m
[31m-        if ($arg_count !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "count" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"select * from posts[m
[31m-where year(created) = $arg_year and month(created) = $arg_month[m
[31m-order by id desc[m
[31m-limit $count";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/view/PrevNextArchive/~/~' {[m
[31m-        if ($arg_now !~ '^\d{4}-\d{1,2}(?:-\d{1,2})?$') {[m
[31m-            rds_json_ret 400 'Bad "now" argument';[m
[31m-        }[m
[31m-        if ($arg_month !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "month" argument';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query[m
[31m-"(select 'next' as id, month(created) as month, year(created) as year[m
[31m-  from posts[m
[31m-  where created > $arg_now and month(created) <> $arg_month[m
[31m-  order by created asc[m
[31m-  limit 1)[m
[31m-  union[m
[31m- (select 'prev' as id, month(created) as month, year(created) as year[m
[31m-  from posts[m
[31m-  where created < $arg_now and month(created) <> $arg_month[m
[31m-  order by created desc[m
[31m-  limit 1)";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/batch/GetSidebar/~/~' {[m
[31m-        if ($arg_year !~ '^(?:19|20)\d{2}$') {[m
[31m-            rds_json_ret 400 'Bad "year" argument';[m
[31m-        }[m
[31m-        if ($arg_month !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "month" argument';[m
[31m-        }[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-        echo '[';[m
[31m-        echo_location_async '/=/view/PostsByMonth/~/~' "year=$arg_year&month=$arg_month";[m
[31m-        echo ',';[m
[31m-        echo_location_async '/=/view/RecentPosts/~/~' "offset=0&limit=6";[m
[31m-        echo ',';[m
[31m-        echo_location_async '/=/view/RecentComments/~/~' "offset=0&limit=6";[m
[31m-        echo ',';[m
[31m-        echo_location_async '/=/view/PostCountByMonths/~/~' "offset=0&limit=12";[m
[31m-        echo ']';[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/batch/GetFullPost/~/~' {[m
[31m-        if ($arg_id !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "id" argument';[m
[31m-        }[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-        echo '[';[m
[31m-        echo_location_async "/=/model/Post/id/$arg_id";[m
[31m-        echo ',';[m
[31m-        echo_location_async "/=/view/PrevNextPost/~/~" "current=$arg_id";[m
[31m-        echo ',';[m
[31m-        echo_location_async "/=/model/Comment/post/$arg_id" "_order_by=id:desc";[m
[31m-        echo ']';[m
[31m-    }[m
[31m-[m
[31m-    location ~* '^/=/model/Post/id/(.*)$' {[m
[31m-        set $id $1;[m
[31m-        if ($id !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "id" value';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query "select * from posts where id = $id";[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location ~* '^/=/model/Comment/post/(.*)$' {[m
[31m-        set $post $1;[m
[31m-        if ($post !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "post" value';[m
[31m-        }[m
[31m-[m
[31m-        drizzle_query "select * from comments where post = $post";[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/model/Post/~/~' {[m
[31m-        if ($arg__offset !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Bad "_offset" argument';[m
[31m-        }[m
[31m-        if ($arg__limit !~ '^\d{1,2}$') {[m
[31m-            rds_json_ret 400 'Bad "_limit" argument';[m
[31m-        }[m
[31m-        if ($arg__order_by !~ '^([A-Za-z]\w*)%3A(desc|asc)$') {[m
[31m-            rds_json_ret 400 'Bad "_order_by" argument';[m
[31m-        }[m
[31m-        set $col $1;[m
[31m-        set $order $2;[m
[31m-        drizzle_query[m
[31m-"select *[m
[31m-from posts[m
[31m-order by `$col` $order[m
[31m-limit $arg__offset, $arg__limit";[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/batch/NewComment/~/~' {[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        set_unescape_uri $sender $arg_sender;[m
[31m-[m
[31m-        set_unescape_uri $email $arg_email;[m
[31m-[m
[31m-        set_unescape_uri $url $arg_url;[m
[31m-[m
[31m-        set_unescape_uri $body $arg_body;[m
[31m-[m
[31m-        set_unescape_uri $post_id $arg_post_id;[m
[31m-[m
[31m-        if ($sender !~ '\S') {[m
[31m-            rds_json_ret 400 "Bad \"sender\" argument";[m
[31m-        }[m
[31m-        if ($email !~ '^[-A-Za-z0-9_.]+@[-A-Za-z0-9_.]+$') {[m
[31m-            rds_json_ret 400 "Bad \"email\" argument";[m
[31m-        }[m
[31m-        if ($url !~ '^(?:\s*|https?://\S+)$') {[m
[31m-            rds_json_ret 400 "Bad \"url\" argument: $url";[m
[31m-        }[m
[31m-        if ($body ~ '^\s*$') {[m
[31m-            rds_json_ret 400 "Bad \"body\" argument";[m
[31m-        }[m
[31m-        if ($post_id !~ '^[1-9]\d*$') {[m
[31m-            rds_json_ret 400 "Bad \"post_id\" argument";[m
[31m-        }[m
[31m-[m
[31m-        set_quote_sql_str $sender;[m
[31m-        set_quote_sql_str $email;[m
[31m-        set_quote_sql_str $url;[m
[31m-        set_quote_sql_str $body;[m
[31m-[m
[31m-        # XXX these operations should be put into a[m
[31m-        # single transaction[m
[31m-        echo '[';[m
[31m-[m
[31m-        echo_location '/=/action/RunSQL/~/~'[m
[31m-"insert into comments (sender, email, url, body, post)[m
[31m-values($sender, $email, $url, $body, $post_id)";[m
[31m-[m
[31m-        echo ',';[m
[31m-[m
[31m-        echo_location '/=/action/RunSQL/~/~'[m
[31m-"update posts[m
[31m-set comments = comments + 1[m
[31m-where id = $post_id";[m
[31m-[m
[31m-        echo ']';[m
[31m-    }[m
[31m-[m
[31m-    location = '/=/action/RunSQL/~/~' {[m
[31m-        internal;[m
[31m-        drizzle_query $query_string;[m
[31m-        drizzle_pass backend;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: PostsByMonth view (no month arg)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo({"errcode":400,"errstr":"Bad \"month\" argument"});[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: PostsByMonth view (bad month)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?month=1234&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo({"errcode":400,"errstr":"Bad \"month\" argument"});[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: PostsByMonth view (emtpy result)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?year=1984&month=2&_callback=bar[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-bar([]);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: PostsByMonth view (non-emtpy result)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?year=2009&month=10&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo([{"id":114,"title":"Hacking on the Nginx echo module","day":15}]);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: PostsByMonth view (non-emtpy result)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/PostsByMonth/~/~?year=2009&month=12&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo([{"id":117,"title":"Major updates to ngx_chunkin: lots of bug fixes and beginning of keep-alive support","day":4},{"id":118,"title":"ngx_memc: an extended version of ngx_memcached that supports set, add, delete, and many more commands","day":6},{"id":119,"title":"Test::Nginx::LWP and Test::Nginx::Socket are now on CPAN","day":8}]);[m
[31m---- timeout: 90[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: GetSideBar[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/batch/GetSidebar/~/~?year=2009&month=10&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo([[m
[31m-[{"id":114,"title":"Hacking on the Nginx echo module","day":15}],[m
[31m-[{"id":119,"title":"Test::Nginx::LWP and Test::Nginx::Socket are now on CPAN"},{"id":118,"title":"ngx_memc: an extended version of ngx_memcached that supports set, add, delete, and many more commands"},{"id":117,"title":"Major updates to ngx_chunkin: lots of bug fixes and beginning of keep-alive support"},{"id":116,"title":"The \"headers more\" module: scripting input and output filters in your Nginx config file"},{"id":115,"title":"The \"chunkin\" module: Experimental chunked input support for Nginx"},{"id":114,"title":"Hacking on the Nginx echo module"}],[m
[31m-[{"id":179,"post":101,"sender":"agentzh","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":178,"post":101,"sender":"Winter","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":177,"post":100,"sender":"Mountain","title":"漂在北京"},{"id":176,"post":106,"sender":"agentzh","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":175,"post":106,"sender":"gosber","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":174,"post":105,"sender":"cnangel","title":"SSH::Batch: Treating clusters as maths sets and intervals"}],[m
[31m-[{"year_month":"2009-12-01","count":3},{"year_month":"2009-11-01","count":2},{"year_month":"2009-10-01","count":1},{"year_month":"2009-09-01","count":5},{"year_month":"2009-05-01","count":2},{"year_month":"2009-04-01","count":3},{"year_month":"2009-02-01","count":2},{"year_month":"2008-12-01","count":3},{"year_month":"2008-11-01","count":2},{"year_month":"2008-10-01","count":2},{"year_month":"2008-09-01","count":4},{"year_month":"2008-08-01","count":2}]][m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: GetFullPost[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/batch/GetFullPost/~/~?id=116&_user=agentzh.Public&_callback=OpenResty.callbackMap%5B1264354204389%5D[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: RowCount[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/RowCount/~/~?model=Post&_callback=foo[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo([{"count":118}]);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: GetFullPost bug[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/model/Comment/post/67[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body_like: laser[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: more field data error[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/model/Post/~/~?_limit=5&_order_by=id%3Adesc&_offset=100[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body_like: 测试[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: default arguments[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/view/RecentComments/~/~[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-[{"id":179,"post":101,"sender":"agentzh","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":178,"post":101,"sender":"Winter","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":177,"post":100,"sender":"Mountain","title":"漂在北京"},{"id":176,"post":106,"sender":"agentzh","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":175,"post":106,"sender":"gosber","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":174,"post":105,"sender":"cnangel","title":"SSH::Batch: Treating clusters as maths sets and intervals"},{"id":173,"post":106,"sender":"cnangel","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":172,"post":104,"sender":"agentzh","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"},{"id":171,"post":104,"sender":"kindy","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"},{"id":170,"post":104,"sender":"cnangel","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"}][m
[31m---- error_code: 200[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: post a comment with empty body[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/batch/NewComment/~/~?sender=agentzh&email=agentzh@gmail.com&body=&post_id=3[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":400,"errstr":"Bad \"body\" argument"}[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: post a comment with valid gmail[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/batch/NewComment/~/~?sender=agentzh&email=agentzh%40gmail.com&body=hi&post_id=[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":400,"errstr":"Bad \"post_id\" argument"}[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: try to run the internal location[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /=/action/RunSQL/~/~?select[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":404,"errstr":"Not Found"}[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: auth[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /auth?user=agentzh[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body[m
[31m-pass[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: auth[m
[31m-[m
[31m-init db:[m
[31m-[m
[31m-create table users ([m
[31m-    id serial primary key,[m
[31m-    name text not null,[m
[31m-    password text not null[m
[31m-);[m
[31m-[m
[31m-insert into users[m
[31m-    (name, password)[m
[31m-    values ('agentzh', 'some_pass');[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /auth?user=john[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":403,"errstr":"Forbidden"}[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: auth[m
[31m-[m
[31m-db init:[m
[31m-[m
[31m-create table users ([m
[31m-    id serial primary key,[m
[31m-    name text not null,[m
[31m-    password text not null[m
[31m-);[m
[31m-[m
[31m-insert into users[m
[31m-    (name, password)[m
[31m-    values ('agentzh', 'some_pass');[m
[31m-[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body[m
[31m-pass[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: default arguments (small pagesize)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval[m
[31m-"rds_json_buffer_size 1;[m
[31m-$::config"[m
[31m---- request[m
[31m-GET /=/view/RecentComments/~/~[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-[{"id":179,"post":101,"sender":"agentzh","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":178,"post":101,"sender":"Winter","title":"生活搜基于 Firefox 3.1 的 List Hunter 集群"},{"id":177,"post":100,"sender":"Mountain","title":"漂在北京"},{"id":176,"post":106,"sender":"agentzh","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":175,"post":106,"sender":"gosber","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":174,"post":105,"sender":"cnangel","title":"SSH::Batch: Treating clusters as maths sets and intervals"},{"id":173,"post":106,"sender":"cnangel","title":"Text::SmartLinks: The Perl 6 love for Perl 5"},{"id":172,"post":104,"sender":"agentzh","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"},{"id":171,"post":104,"sender":"kindy","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"},{"id":170,"post":104,"sender":"cnangel","title":"My VDOM.pm & WebKit Cluster Talk at the April Meeting of Beijing Perl Workshop"}][m
[31m---- error_code: 200[m
[31m---- timeout: 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/pg.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/pg.t[m
[1mdeleted file mode 100644[m
[1mindex d7be1fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/pg.t[m
[1m+++ /dev/null[m
[36m@@ -1,128 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bool blob field (keepalive off)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        postgres_keepalive  off;[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /pg "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /pg "create table foo (id serial, flag bool);";[m
[31m-        echo;[m
[31m-        echo_location /pg "insert into foo (flag) values (true);";[m
[31m-        echo;[m
[31m-        echo_location /pg "insert into foo (flag) values (false);";[m
[31m-        echo;[m
[31m-        echo_location /pg "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /pg {[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-    location = /pgignore {[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query $query_string;[m
[31m-        rds_json on;[m
[31m-        error_page 500 = /ignore;[m
[31m-    }[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"affected_rows":1}[m
[31m-{"errcode":0,"affected_rows":1}[m
[31m-[{"id":1,"flag":true},{"id":2,"flag":false}][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bool blob field (keepalive on)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /pgignore "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /pg "create table foo (id serial, flag bool);";[m
[31m-        echo;[m
[31m-        echo_location /pg "insert into foo (flag) values (true);";[m
[31m-        echo;[m
[31m-        echo_location /pg "insert into foo (flag) values (false);";[m
[31m-        echo;[m
[31m-        echo_location /pg "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /pg {[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-    location = /pgignore {[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query $query_string;[m
[31m-        rds_json on;[m
[31m-        error_page 500 = /ignore;[m
[31m-    }[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"affected_rows":1}[m
[31m-{"errcode":0,"affected_rows":1}[m
[31m-[{"id":1,"flag":true},{"id":2,"flag":false}][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity (github issue #2)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /pg {[m
[31m-        rds_json on;[m
[31m-        rds_json_root     url;[m
[31m-[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query GET "select * from cats order by id";[m
[31m-        postgres_output   rds;[m
[31m-    }[m
[31m---- request[m
[31m-GET /pg[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"url":[{"id":2,"name":null},{"id":3,"name":"bob"}]}[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/property.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/property.t[m
[1mdeleted file mode 100644[m
[1mindex 05f9fb0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/property.t[m
[1m+++ /dev/null[m
[36m@@ -1,561 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query '[m
[31m-            select * from cats order by id asc[m
[31m-        ';[m
[31m-        drizzle_pass backend;[m
[31m-        rds_json on;[m
[31m-        rds_json_root rows;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chomp[m
[31m-{"rows":[{"id":2,"name":null},{"id":3,"name":"bob"}]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: update (root)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-        rds_json_root data;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_root data;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"data":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sanity + compact[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query '[m
[31m-            select * from cats order by id asc[m
[31m-        ';[m
[31m-        drizzle_pass backend;[m
[31m-        rds_json on;[m
[31m-        rds_json_root rows;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chomp[m
[31m-{"rows":[["id","name"],[2,null],[3,"bob"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: select empty result + compact[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_root data;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"data":[["id","name"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: select empty result + compact + escaping[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_root "'\"\\:";[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"'\"\\:":[["id","name"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: success property (inherited)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    rds_json_success_property "suc";[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_root "rows";[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"suc":true,"rows":[["id","name"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: success property (root inherited)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    rds_json_root "rows";[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_success_property "suc";[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"suc":true,"rows":[["id","name"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: success property[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        #rds_json_root "data";[m
[31m-        rds_json_success_property "suc";[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"suc":true,"data":[["id","name"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: success property with an odd key[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_root "data";[m
[31m-        rds_json_success_property "a\"'\\:";[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"a\"'\\:":true,"data":[["id","name"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: update (root + success prop)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-        rds_json_root rows;[m
[31m-        rds_json_success_property success;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"success":true,"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: update (user property)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-[m
[31m-        set $name 'Jimmy';[m
[31m-        rds_json_user_property name $name;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"name":"Jimmy","errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: update (multi user property)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-[m
[31m-        set $name 'Jimmy"';[m
[31m-        set $age 32;[m
[31m-        rds_json_user_property name $name;[m
[31m-        rds_json_user_property age $age;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"name":"Jimmy\"","age":"32","errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: compact + user property[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query '[m
[31m-            select * from cats order by id asc[m
[31m-        ';[m
[31m-        drizzle_pass backend;[m
[31m-        rds_json on;[m
[31m-        rds_json_root rows;[m
[31m-        set $val 'bar"';[m
[31m-        rds_json_user_property foo $val;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chomp[m
[31m-{"foo":"bar\"","rows":[["id","name"],[2,null],[3,"bob"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: compact + user property + success[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_query '[m
[31m-            select * from cats order by id asc[m
[31m-        ';[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-        rds_json_root rows;[m
[31m-[m
[31m-        rds_json_success_property suc;[m
[31m-[m
[31m-        set $val 'bar"';[m
[31m-        rds_json_user_property foo $val;[m
[31m-[m
[31m-        set $baz '"baz"\\';[m
[31m-        rds_json_user_property '\\bar' $baz;[m
[31m-        rds_json_format compact;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chomp[m
[31m-{"suc":true,"foo":"bar\"","\\bar":"\"baz\"\\","rows":[["id","name"],[2,null],[3,"bob"]]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: rds_json_ret with success property[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /ret {[m
[31m-        rds_json_success_property ret;[m
[31m-[m
[31m-        rds_json_ret 400 'Non zero ret';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ret[m
[31m---- response_body chomp[m
[31m-{"errcode":400,"errstr":"Non zero ret","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: rds_json_ret with user property[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /ret {[m
[31m-        set $city 'beijing';[m
[31m-        rds_json_user_property city $city;[m
[31m-        rds_json_ret 400 'Non zero ret';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ret[m
[31m---- response_body chomp[m
[31m-{"errcode":400,"errstr":"Non zero ret","city":"beijing"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: rds_json_ret with property[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /ret {[m
[31m-        rds_json_success_property ret;[m
[31m-[m
[31m-        set $city 'beijing';[m
[31m-        rds_json_user_property city $city;[m
[31m-[m
[31m-        rds_json_ret 400 'Non zero ret';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ret[m
[31m---- response_body chomp[m
[31m-{"errcode":400,"errstr":"Non zero ret","ret":false,"city":"beijing"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: rds_json_ret when errcode equal 0[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /ret {[m
[31m-        rds_json_success_property ret;[m
[31m-[m
[31m-        set $city 'beijing';[m
[31m-        rds_json_user_property city $city;[m
[31m-[m
[31m-        rds_json_ret 0 'Zero errcode';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ret[m
[31m---- response_body chomp[m
[31m-{"errcode":0,"errstr":"Zero errcode","ret":true,"city":"beijing"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: rds_json_ret with multiple user properties[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /ret {[m
[31m-        set $city 'beijing';[m
[31m-        rds_json_user_property city $city;[m
[31m-        rds_json_user_property '"hi"' '"hello\n"';[m
[31m-        rds_json_ret 400 'Non zero ret';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ret[m
[31m---- response_body chomp[m
[31m-{"errcode":400,"errstr":"Non zero ret","city":"beijing","\"hi\"":"\"hello\n\""}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: location internal rewrite[m
[31m---- config[m
[31m-    location @err403 {[m
[31m-        rds_json_success_property ret;[m
[31m-        rds_json_ret 403 "Forbidden";[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        error_page 403 = @err403;[m
[31m-        return 403;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body chop[m
[31m-{"errcode":403,"errstr":"Forbidden","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: rds_json_errcode_key[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rds_json_errcode_key "ecode";[m
[31m-        rds_json_success_property ret;[m
[31m-        rds_json_ret 403 "Forbidden";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body chop[m
[31m-{"ecode":403,"errstr":"Forbidden","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: rds_json_errcode_key[m
[31m---- config[m
[31m-    rds_json_errcode_key "ecoderoot";[m
[31m-[m
[31m-    location /foo {[m
[31m-        rds_json_success_property ret;[m
[31m-        rds_json_ret 403 "Forbidden";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body chop[m
[31m-{"ecoderoot":403,"errstr":"Forbidden","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: rds_json_errcode_key[m
[31m---- config[m
[31m-    rds_json_errcode_key "ecoderoot";[m
[31m-[m
[31m-    location /foo {[m
[31m-        rds_json_errcode_key "ecode";[m
[31m-        rds_json_success_property ret;[m
[31m-        rds_json_ret 403 "Forbidden";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body chop[m
[31m-{"ecode":403,"errstr":"Forbidden","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: rds_json_errstr_key[m
[31m---- config[m
[31m-    rds_json_errstr_key "msg";[m
[31m-[m
[31m-    location /foo {[m
[31m-        rds_json_success_property ret;[m
[31m-        rds_json_ret 403 "Forbidden";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body chop[m
[31m-{"errcode":403,"msg":"Forbidden","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: rds_json_errstr_key[m
[31m---- config[m
[31m-    rds_json_errstr_key "msg";[m
[31m-[m
[31m-    location /foo {[m
[31m-        rds_json_errstr_key "msg2";[m
[31m-        rds_json_success_property ret;[m
[31m-        rds_json_ret 403 "Forbidden";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body chop[m
[31m-{"errcode":403,"msg2":"Forbidden","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: rds_json_errstr_key & rds_json_root[m
[31m---- config[m
[31m-    rds_json_errstr_key "msg2";[m
[31m-    rds_json_root rows;[m
[31m-[m
[31m-    location /foo {[m
[31m-        rds_json_success_property ret;[m
[31m-        rds_json_ret 403 "Forbidden";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body chop[m
[31m-{"errcode":403,"msg2":"Forbidden","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: rds_json_errcode_key & rds_json_root[m
[31m---- config[m
[31m-    rds_json_root rows;[m
[31m-    rds_json_errcode_key "code";[m
[31m-[m
[31m-    location /foo {[m
[31m-        rds_json_success_property ret;[m
[31m-        rds_json_ret 403 "Forbidden";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body chop[m
[31m-{"code":403,"errstr":"Forbidden","ret":false}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: update - custom errstr_key[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-        rds_json_errcode_key "\"code\"";[m
[31m-        rds_json_errstr_key "\"str\"";[m
[31m-[m
[31m-        set $name 'Jimmy"';[m
[31m-        set $age 32;[m
[31m-        rds_json_user_property name $name;[m
[31m-        rds_json_user_property age $age;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"name":"Jimmy\"","age":"32","\"code\"":0,"\"str\"":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: select - custom errstr_key[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select 'aaa' as a, 'bbb' as b";[m
[31m-        rds_json on;[m
[31m-        rds_json_errcode_key "\"code\"";[m
[31m-        rds_json_errstr_key "\"str\"";[m
[31m-[m
[31m-        rds_json_root data;[m
[31m-[m
[31m-        set $name 'Jimmy"';[m
[31m-        set $age 32;[m
[31m-        rds_json_user_property name $name;[m
[31m-        rds_json_user_property age $age;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"name":"Jimmy\"","age":"32","data":[{"a":"aaa","b":"bbb"}]}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/ret.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/ret.t[m
[1mdeleted file mode 100644[m
[1mindex 0d77b28..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/ret.t[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rds_json_ret 400 "Bad request";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":400,"errstr":"Bad request"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty errstr[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rds_json_ret 400 "";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":400}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set content type[m
[31m---- config[m
[31m-    rds_json_content_type 'text/javascript';[m
[31m-    location /foo {[m
[31m-        rds_json_ret 400 "Bad request";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/javascript[m
[31m---- response_body chop[m
[31m-{"errcode":400,"errstr":"Bad request"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: JSON escaping[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($arg_limit !~ '^\d+$') {[m
[31m-            rds_json_ret 400 'Invalid "limit" argument.';[m
[31m-        }[m
[31m-        echo done;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":400,"errstr":"Invalid \"limit\" argument."}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/sanity-stream.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/sanity-stream.t[m
[1mdeleted file mode 100644[m
[1mindex 116b987..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/sanity-stream.t[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(10);[m
[31m-no_shuffle();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 3;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-[["id","name"],[2,null],[3,"bob"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-[["id","name"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        if ($arg_name ~ '[^A-Za-z0-9]') {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='$arg_name' where name='$arg_name'";[m
[31m-[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql?name=bob[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: invalid SQL[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select '32";[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module:[m
[31m-Content-Type: text/html[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: single row, single col[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists singles";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table singles (name varchar(15));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into singles values ('marry');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from singles;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"affected_rows":1}[m
[31m-[["name"],["marry"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: floating number and insert id[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (val) values (3.1415926);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","val"],[1,3.1415926]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: text blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body text);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('hello');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","body"],[1,"hello"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bool blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, flag bool);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (true);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (false);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","flag"],[1,1],[2,0]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: bit field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, flag bit);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (1);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (0);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","flag"],[1,"\u0001"],[2,"\u0000"]][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: date type[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, created date);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (created) values ('2007-05-24');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","created"],[1,"2007-05-24"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: strings need to be escaped[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\bhello\Z');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[["id","body"],[1,"a\r\nb\bhello\u001a"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: null values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, name char(10), age integer);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (name, age) values ('', null);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (name, age) values (null, 0);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-        rds_json_format compact;[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[["id","name","age"],[1,"",null],[2,null,0]][m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 2c7ea61..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,460 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(10);[m
[31m-no_shuffle();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 7);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_long_string();[m
[31m-#master_on();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats order by id';[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        if ($arg_name ~ '[^A-Za-z0-9]') {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='$arg_name' where name='$arg_name'";[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql?name=bob[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: invalid SQL[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select '32";[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module:[m
[31m-Content-Type: text/html[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: single row, single col[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists singles";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table singles (name varchar(15));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into singles values ('marry');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from singles;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"affected_rows":1}[m
[31m-[{"name":"marry"}][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: floating number and insert id[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (val) values (3.1415926);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[{"id":1,"val":3.1415926}][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: text blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body text);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('hello');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[{"id":1,"body":"hello"}][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bool blob field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, flag bool);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (true);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (false);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[{"id":1,"flag":1},{"id":2,"flag":0}][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: bit field[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, flag bit);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (1);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (flag) values (0);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id;";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[{"id":1,"flag":"\u0001"},{"id":2,"flag":"\u0000"}][m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: date type[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, created date);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (created) values ('2007-05-24');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[{"id":1,"created":"2007-05-24"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: strings need to be escaped (forcing utf8)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\b你好\Z');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[{"id":1,"body":"a\r\nb\b??\u001a"}][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: strings need to be escaped[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, body char(25));";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\b你好\Z');";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-[{"id":1,"body":"a\r\nb\b你好\u001a"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: null values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /test {[m
[31m-        echo_location /mysql "drop table if exists foo";[m
[31m-        echo;[m
[31m-        echo_location /mysql "create table foo (id serial, name char(10), age integer);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (name, age) values ('', null);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "insert into foo (name, age) values (null, 0);";[m
[31m-        echo;[m
[31m-        echo_location /mysql "select * from foo order by id";[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query $query_string;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-{"errcode":0}[m
[31m-{"errcode":0}[m
[31m-{"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-{"errcode":0,"insert_id":2,"affected_rows":1}[m
[31m-[{"id":1,"name":"","age":null},{"id":2,"name":null,"age":0}][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: call proc[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "call myproc()";[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body chop[m
[31m-{"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad MIME type[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        default_type "text/css";[m
[31m-        echo hello;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-hello[m
[31m---- timeout: 15[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/unused.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/unused.t[m
[1mdeleted file mode 100644[m
[1mindex a5d2d07..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/t/unused.t[m
[1m+++ /dev/null[m
[36m@@ -1,91 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (5 * blocks());[m
[31m-[m
[31m-log_level('debug');[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: not using this module's directives at all[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo Hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Hello[m
[31m---- no_error_log[m
[31m-rds json header filter, "/foo"[m
[31m-rds json body filter, "/foo"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: using rds_json_ret, but not rds_json[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rds_json_ret 400 "Bad request";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chop[m
[31m-{"errcode":400,"errstr":"Bad request"}[m
[31m---- no_error_log[m
[31m-rds json header filter, "/foo"[m
[31m-rds json body filter, "/foo"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: using rds_json[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo Hello;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Hello[m
[31m---- error_log[m
[31m-rds json header filter, "/foo"[m
[31m-rds json body filter, "/foo"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple http {} blocks[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo Hello;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Hello[m
[31m---- error_log[m
[31m-rds json header filter, "/foo"[m
[31m-rds json body filter, "/foo"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex ff093db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-version=$1[m
[31m-force=$2[m
[31m-#opts=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-          --with-cc-opt="-O1" \[m
[31m-            --with-ld-opt="-Wl,-rpath,/opt/drizzle/lib:/opt/pg9/lib" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../eval-nginx-module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../xss-nginx-module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root/../array-var-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --add-module=$root/../drizzle-nginx-module \[m
[31m-          --add-module=$root/../form-input-nginx-module \[m
[31m-          --add-module=$root/../postgres-nginx-module \[m
[31m-          --with-debug[m
[31m-          #--add-module=$root/../lua-nginx-module \[m
[31m-          #--add-module=$home/work/ngx_http_auth_request-0.1 #\[m
[31m-          #--with-rtsig_module[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 53e342f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/rds-json-nginx-module-0.14/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,316 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   create_pool_posix_memalign[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   spawn_process_alloc[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_ssi_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_script_compile[m
[31m-   fun:ngx_http_rewrite_value[m
[31m-   fun:ndk_set_var_value_core[m
[31m-   fun:ndk_set_var_value[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_location[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push_n[m
[31m-   fun:ngx_http_script_add_code[m
[31m-   fun:ngx_http_script_compile[m
[31m-   fun:ngx_http_rewrite_value[m
[31m-   fun:ndk_set_var_value_core[m
[31m-   fun:ndk_set_var_value[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_location[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_rewrite_set[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_location[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/AUTHOR b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/AUTHOR[m
[1mdeleted file mode 100644[m
[1mindex 49e7c8c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/AUTHOR[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-Sergey A. Osokin <osa@FreeBSD.ORG.ru>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/CHANGES b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/CHANGES[m
[1mdeleted file mode 100644[m
[1mindex 8c07b0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/CHANGES[m
[1m+++ /dev/null[m
[36m@@ -1,102 +0,0 @@[m
[31m-Changes with ngx_http_redis 0.3.7                               28 Nov 2013[m
[31m-[m
[31m-    *) Bugfix: ngx_http_redis_module might issue the error message[m
[31m-       "redis sent invalid trailer" for nginx >= 1.5.3.[m
[31m-       Thanks to Maxim Dounin.[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.3.6                               03 Apr 2012[m
[31m-[m
[31m-    *) Feature: redis_gzip_flag.  Usefull if you are prefer to[m
[31m-       store data compressed in redis.  Works with ngx_http_gunzip_filter[m
[31m-       module.[m
[31m-       Thanks to Maxim Dounin.[m
[31m-[m
[31m-    *) Bugfix: ngx_http_redis_module might issue the error message[m
[31m-       "redis sent invalid trailer".[m
[31m-       Thanks to agentzh.[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.3.5                               30 Aug 2011[m
[31m-[m
[31m-    *) Feature: add test for not set $redis_db directive.[m
[31m-[m
[31m-    *) Feature: keep-alive support merged from original[m
[31m-       memcached module 1.1.4.[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.3.4                               24 Aug 2011[m
[31m-[m
[31m-    *) Change: better error messages diagnostics in select phase.[m
[31m-[m
[31m-    *) Add more comments in source code.[m
[31m-[m
[31m-    *) Bugfix: fix interaction with redis if redis_db was unused.[m
[31m-       Found by Sergey Makarov.[m
[31m-       Thanks to Igor Sysoev.[m
[31m-[m
[31m-    *) Feature: add test suite for redis backend.[m
[31m-       Thanks to Maxim Dounin.[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.3.3                               07 Jun 2011[m
[31m-[m
[31m-    *) Bugfix: fix interaction with redis if redis_db was used.[m
[31m-       Also, compile with -Werror now is possible.[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.3.2                               17 Aug 2010[m
[31m-[m
[31m-    *) Bugfix: ngx_http_redis_module might issue the error message [m
[31m-       "redis sent invalid trailer".  For more information see:[m
[31m-       $ diff -ruN \[m
[31m-             nginx-0.8.34/src/http/modules/ngx_http_memcached_module.c \[m
[31m-             nginx-0.8.35/src/http/modules/ngx_http_memcached_module.c[m
[31m-[m
[31m-    *) Change: now the $redis_db set is not obligatory; default[m
[31m-       value is "0".[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.3.1                               26 Dec 2009[m
[31m-[m
[31m-    *) Change: return 502 instead of 404 for error.[m
[31m-[m
[31m-    *) Change: better error messages diagnostics.[m
[31m-[m
[31m-    *) Bugfix: improve interoperability with redis; the bug had[m
[31m-       appeared in 0.3.0.[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.3.0                               23 Dec 2009[m
[31m-[m
[31m-    *) Compatibility with latest stable (0.7.64) and[m
[31m-       development 0.8.31 releases.[m
[31m-[m
[31m-    *) Bugfix: multiple commands issue with interoperability with[m
[31m-       redis; the bug had appeared in 0.2.0.[m
[31m-[m
[31m-    *) Feature: redis_bind directive merge from original[m
[31m-       memcached module (for 0.8.22 and later).[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.2.0                               19 Sep 2009[m
[31m-[m
[31m-    *) Feature: the $redis_db variable: now the ngx_http_redis[m
[31m-       module uses the $redis_db variable value as the parameter[m
[31m-       for SELECT command.[m
[31m-[m
[31m-    *) Cleanup: style/spaces fixes.[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.1.2                               14 Sep 2009[m
[31m-[m
[31m-    *) Change: backport to 0.7.61.[m
[31m-[m
[31m-[m
[31m-Changes with ngx_http_redis 0.1.1                               31 Aug 2009[m
[31m-[m
[31m-    *) Change: compatibility with nginx 0.8.11.[m
[31m-[m
[31m-    *) Cleanup: mlcf -> rlcf, i.e.[m
[31m-       (memcached location configuration) -> redis...[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 208b1ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-/* [m
[31m- * Copyright (C) 2002-2009 Igor Sysoev[m
[31m- * Copyright (C) 2009-2013 Sergey A. Osokin[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/README b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/README[m
[1mdeleted file mode 100644[m
[1mindex 45e11ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/README[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-nginx HTTP redis module[m
[31m---[m
[31m-[m
[31m-Description:[m
[31m---[m
[31m-[m
[31m-The nginx HTTP redis module for caching with redis,[m
[31m-http://code.google.com/p/redis/.[m
[31m-[m
[31m-The redis protocol[m
[31m-(http://code.google.com/p/redis/wiki/ProtocolSpecification)[m
[31m-not yet fully implemented, but GET and SELECT commands only.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Installation:[m
[31m---[m
[31m-[m
[31m-You'll need to re-compile Nginx from source to include this module.[m
[31m-Modify your compile of Nginx by adding the following directive[m
[31m-(modified to suit your path of course):[m
[31m-[m
[31m-./configure --add-module=/absolute/path/to/ngx_http_redis[m
[31m-make[m
[31m-make install[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usage:[m
[31m---[m
[31m-[m
[31m-Example 1.[m
[31m-[m
[31m-[m
[31m-http[m
[31m-{[m
[31m- ...[m
[31m-        server {[m
[31m-                location / {[m
[31m-                        set $redis_key  "$uri?$args";[m
[31m-                        redis_pass      127.0.0.1:6379;[m
[31m-                        error_page      404 502 504 = @fallback;[m
[31m-                }[m
[31m-[m
[31m-                location @fallback {[m
[31m-                        proxy_pass      backed;[m
[31m-                }[m
[31m-        }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Example 2.[m
[31m-[m
[31m-Capture User-Agent from an HTTP header, query to redis database[m
[31m-for lookup appropriate backend.[m
[31m-[m
[31m-Eval module (http://www.grid.net.ru/nginx/eval.en.html) required.[m
[31m-[m
[31m-http[m
[31m-{[m
[31m- ...[m
[31m-    upstream redis {[m
[31m-        server  127.0.0.1:6379;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-     ...[m
[31m-        location / {[m
[31m-[m
[31m-	    eval_escalate on;[m
[31m-[m
[31m-	    eval $answer {[m
[31m-		set $redis_key	"$http_user_agent";[m
[31m-		redis_pass	redis;[m
[31m-	    }[m
[31m-[m
[31m-            proxy_pass $answer;[m
[31m-        }[m
[31m-        ...[m
[31m-     }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Example 3.[m
[31m-[m
[31m-Compile nginx with ngx_http_redis and ngx_http_gunzip_filter modules[m
[31m-(http://mdounin.ru/hg/ngx_http_gunzip_filter_module/).[m
[31m-Gzip content and put it into redis database.[m
[31m-[m
[31m-% cat index.html[m
[31m-<html><body>Hello from redis!</body></html>[m
[31m-% gzip index.html[m
[31m-% cat index.html.gz | redis-cli -x set /index.html[m
[31m-OK[m
[31m-% cat index.html.gz | redis-cli -x set /[m
[31m-OK[m
[31m-%[m
[31m-[m
[31m-Using following configuration nginx get data from redis database and[m
[31m-gunzip it.[m
[31m-[m
[31m-http[m
[31m-{[m
[31m- ...[m
[31m-    upstream redis {[m
[31m-        server  127.0.0.1:6379;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-     ...[m
[31m-        location / {[m
[31m-                gunzip on;[m
[31m-                redis_gzip_flag 1;[m
[31m-                set $redis_key "$uri";[m
[31m-                redis_pass redis;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-Thanks to:[m
[31m---[m
[31m-[m
[31m-Maxim Dounin[m
[31m-Vsevolod Stakhov[m
[31m-Ezra Zygmuntowicz[m
[31m-[m
[31m-[m
[31m-[m
[31m-Special thanks to:[m
[31m---[m
[31m-Evan Miller for his "Guide To Nginx Module Development" and "Advanced Topics[m
[31m-In Nginx Module Development"[m
[31m-Valery Kholodkov for his "Nginx modules development"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/config[m
[1mdeleted file mode 100644[m
[1mindex 490477c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/config[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_redis_module[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_http_redis_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_redis_module.c"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/ngx_http_redis_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/ngx_http_redis_module.c[m
[1mdeleted file mode 100644[m
[1mindex a07fbc7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/ngx_http_redis_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1019 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Sergey A. Osokin[m
[31m- */[m
[31m-[m
[31m-#define NGX_ESCAPE_REDIS   4[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-    ngx_int_t                  index;[m
[31m-    ngx_int_t                  db;[m
[31m-    ngx_uint_t                 gzip_flag;[m
[31m-[m
[31m-    ngx_http_complex_value_t  *complex_target; /* for redis_pass */[m
[31m-} ngx_http_redis_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                     rest;[m
[31m-    ngx_http_request_t        *request;[m
[31m-    ngx_str_t                  key;[m
[31m-} ngx_http_redis_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_redis_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_redis_filter(void *data, ssize_t bytes);[m
[31m-static void ngx_http_redis_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_redis_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_redis_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_redis_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_redis_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_redis_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_http_upstream_srv_conf_t *[m
[31m-    ngx_http_redis_upstream_add(ngx_http_request_t *r, ngx_url_t *url);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_redis_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_redis_commands[] = {[m
[31m-[m
[31m-    { ngx_string("redis_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_redis_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8022[m
[31m-    { ngx_string("redis_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("redis_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_redis_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("redis_gzip_flag"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, gzip_flag),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_redis_module_ctx = {[m
[31m-    ngx_http_redis_add_variables,          /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_redis_create_loc_conf,        /* create location configration */[m
[31m-    ngx_http_redis_merge_loc_conf          /* merge location configration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_redis_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_redis_module_ctx,            /* module context */[m
[31m-    ngx_http_redis_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-/* Initialize additional var for hide "Content-Enconding: gzip" header */[m
[31m-static ngx_str_t  ngx_http_redis_hide_headers[] = {[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-static ngx_str_t  ngx_http_redis_key = ngx_string("redis_key");[m
[31m-static ngx_str_t  ngx_http_redis_db  = ngx_string("redis_db");[m
[31m-static ngx_uint_t ngx_http_redis_db_index;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REDIS_END   (sizeof(ngx_http_redis_end) - 1)[m
[31m-static u_char  ngx_http_redis_end[] = CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_redis_ctx_t           *ctx;[m
[31m-    ngx_http_redis_loc_conf_t      *rlcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module);[m
[31m-    if (rlcf->complex_target) {[m
[31m-        ngx_str_t           target;[m
[31m-        ngx_url_t           url;[m
[31m-[m
[31m-        /* variables used in the redis_pass directive */[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, rlcf->complex_target, &target)[m
[31m-                != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (target.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                    "handler: empty \"redis_pass\" target");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        url.host = target;[m
[31m-        url.port = 0;[m
[31m-        url.default_port = 6379;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        rlcf->upstream.upstream = ngx_http_redis_upstream_add(r, &url);[m
[31m-[m
[31m-        if (rlcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                   "redis: upstream \"%V\" not found", &target);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-#else[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-#endif[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-    u = r->upstream;[m
[31m-#endif[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8037[m
[31m-    ngx_str_set(&u->schema, "redis://");[m
[31m-#else[m
[31m-    u->schema.len = sizeof("redis://") - 1;[m
[31m-    u->schema.data = (u_char *) "redis://";[m
[31m-#endif[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_redis_module;[m
[31m-#else[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-#endif[m
[31m-[m
[31m-#if !defined(nginx_version) || nginx_version < 8011[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_redis_module;[m
[31m-#endif[m
[31m-[m
[31m-    u->conf = &rlcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_http_redis_create_request;[m
[31m-    u->reinit_request = ngx_http_redis_reinit_request;[m
[31m-    u->process_header = ngx_http_redis_process_header;[m
[31m-    u->abort_request = ngx_http_redis_abort_request;[m
[31m-    u->finalize_request = ngx_http_redis_finalize_request;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version < 8011[m
[31m-    r->upstream = u;[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_palloc(r->pool, sizeof(ngx_http_redis_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest = NGX_HTTP_REDIS_END;[m
[31m-    ctx->request = r;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_redis_module);[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_redis_filter_init;[m
[31m-    u->input_filter = ngx_http_redis_filter;[m
[31m-    u->input_filter_ctx = ctx;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-    r->main->count++;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_init(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_http_redis_ctx_t           *ctx;[m
[31m-    ngx_http_variable_value_t      *vv[2];[m
[31m-    ngx_http_redis_loc_conf_t      *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module);[m
[31m-[m
[31m-    vv[0] = ngx_http_get_indexed_variable(r, ngx_http_redis_db_index);[m
[31m-[m
[31m-    /*[m
[31m-     * If user do not select redis database in nginx.conf by redis_db[m
[31m-     * variable, just add size of "select 0" to request.  This is add[m
[31m-     * some overhead in talk with redis, but this way simplify parsing[m
[31m-     * the redis answer in ngx_http_redis_process_header().[m
[31m-     */[m
[31m-    if (vv[0] == NULL || vv[0]->not_found || vv[0]->len == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "select 0 redis database" );[m
[31m-        len = sizeof("select 0") - 1;[m
[31m-    } else {[m
[31m-        len = sizeof("select ") - 1 + vv[0]->len;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "select %s redis database", vv[0]->data);[m
[31m-    }[m
[31m-    len += sizeof(CRLF) - 1;[m
[31m-[m
[31m-    vv[1] = ngx_http_get_indexed_variable(r, rlcf->index);[m
[31m-[m
[31m-    /* If nginx.conf have no redis_key return error. */[m
[31m-    if (vv[1] == NULL || vv[1]->not_found || vv[1]->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$redis_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* Count have space required escape symbols. */[m
[31m-    escape = 2 * ngx_escape_uri(NULL, vv[1]->data, vv[1]->len, NGX_ESCAPE_REDIS);[m
[31m-[m
[31m-    len += sizeof("get ") - 1 + vv[1]->len + escape + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    /* Create temporary buffer for request with size len. */[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    /* Add "select " for request. */[m
[31m-    *b->last++ = 's'; *b->last++ = 'e'; *b->last++ = 'l'; *b->last++ = 'e';[m
[31m-    *b->last++ = 'c'; *b->last++ = 't'; *b->last++ = ' ';[m
[31m-[m
[31m-    /* Get context redis_db from configuration file. */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_redis_module);[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    /*[m
[31m-     * Add "0" as redis number db to request if redis_db undefined,[m
[31m-     * othervise add real number from context.[m
[31m-     */[m
[31m-    if (vv[0] == NULL || vv[0]->not_found || vv[0]->len == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "select 0 redis database" );[m
[31m-        *b->last++ = '0';[m
[31m-    } else {[m
[31m-        b->last = ngx_copy(b->last, vv[0]->data, vv[0]->len);[m
[31m-        ctx->key.len = b->last - ctx->key.data;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "select %V redis database", &ctx->key);[m
[31m-    }[m
[31m-[m
[31m-    /* Add "\r\n". */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-[m
[31m-    /* Add "get" command with space. */[m
[31m-    *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' ';[m
[31m-[m
[31m-    /* Get context redis_key from nginx.conf. */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_redis_module);[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    /*[m
[31m-     * If no escape symbols then copy data as is, othervise use[m
[31m-     * escape-copy function.[m
[31m-     */[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, vv[1]->data, vv[1]->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, vv[1]->data, vv[1]->len,[m
[31m-                                            NGX_ESCAPE_REDIS);[m
[31m-    }[m
[31m-[m
[31m-    ctx->key.len = b->last - ctx->key.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http redis request: \"%V\"", &ctx->key);[m
[31m-[m
[31m-    /* Add one more "\r\n". */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    /*[m
[31m-     * Summary, the request looks like this:[m
[31m-     * "select $redis_db\r\nget $redis_key\r\n", where[m
[31m-     * $redis_db and $redis_key are variable's values.[m
[31m-     */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *p, *len;[m
[31m-    u_int                      c, try;[m
[31m-    ngx_str_t                  line;[m
[31m-    ngx_table_elt_t           *h;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_redis_ctx_t      *ctx;[m
[31m-    ngx_http_redis_loc_conf_t *rlcf;[m
[31m-[m
[31m-    c = try = 0;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    /*[m
[31m-     * Good answer from redis should looks like this:[m
[31m-     * "+OK\r\n$8\r\n12345678\r\n"[m
[31m-     *[m
[31m-     * Here is:[m
[31m-     * "+OK" is answer for first command "select 0".[m
[31m-     * Next two strings are answer for command "get $redis_key", where[m
[31m-     *[m
[31m-     * "$8" is length of following next string and[m
[31m-     * "12345678" is value of $redis_key, the string.[m
[31m-     *[m
[31m-     * So, if the first symbol is:[m
[31m-     * "+" (good answer) - try to find 2 strings;[m
[31m-     * "-" (bad answer) - try to find 1 string;[m
[31m-     * othervise answer is invalid. [m
[31m-     */[m
[31m-    if (*p == '+') {[m
[31m-        try = 2;[m
[31m-    } else if (*p == '-') {[m
[31m-        try = 1;[m
[31m-    } else {[m
[31m-        goto no_valid;[m
[31m-    }[m
[31m-[m
[31m-    for (p = u->buffer.pos; p < u->buffer.last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            c++;[m
[31m-            if (c == try) {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    line.len = p - u->buffer.pos - 1;[m
[31m-    line.data = u->buffer.pos;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "redis: \"%V\"", &line);[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    /* Get context of redis_key for future error messages, i.e. ctx->key */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_redis_module);[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module);[m
[31m-[m
[31m-    /* Compare pointer and error message, if yes set 502 and return */[m
[31m-    if (ngx_strncmp(p, "-ERR", sizeof("-ERR") - 1) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "redis sent error in response \"%V\" "[m
[31m-                      "for key \"%V\"",[m
[31m-                      &line, &ctx->key);[m
[31m-[m
[31m-        u->headers_in.status_n = 502;[m
[31m-        u->state->status = 502;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* Compare pointer and good message, if yes move on the pointer */[m
[31m-    if (ngx_strncmp(p, "+OK\r\n", sizeof("+OK\r\n") - 1) == 0) {[m
[31m-        p += sizeof("+OK\r\n") - 1;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Compare pointer and "get" answer.  As said before, "$" means, that[m
[31m-     * next symbols are length for upcoming key, "-1" means no key.[m
[31m-     * Set 404 and return.[m
[31m-     */[m
[31m-    if (ngx_strncmp(p, "$-1", sizeof("$-1") - 1) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "key: \"%V\" was not found by redis", &ctx->key);[m
[31m-[m
[31m-        u->headers_in.status_n = 404;[m
[31m-        u->state->status = 404;[m
[31m-#if defined nginx_version && nginx_version >= 1001004[m
[31m-        u->keepalive = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* Compare pointer and "get" answer, if "$"... */[m
[31m-    if (ngx_strncmp(p, "$", sizeof("$") - 1) == 0) {[m
[31m-[m
[31m-        /* move on pointer */[m
[31m-        p += sizeof("$") - 1;[m
[31m-[m
[31m-        /* set len to pointer */[m
[31m-        len = p;[m
[31m-[m
[31m-        /* if defined gzip_flag... */[m
[31m-        if (rlcf->gzip_flag) {[m
[31m-            /* hash init */[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * add Content-Encoding header for future gunzipping[m
[31m-             * with ngx_http_gunzip_filter module[m
[31m-             */[m
[31m-            h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash([m
[31m-                                ngx_hash(ngx_hash(ngx_hash([m
[31m-                                ngx_hash(ngx_hash(ngx_hash([m
[31m-                                ngx_hash(ngx_hash(ngx_hash([m
[31m-                                ngx_hash(ngx_hash('c', 'o'), 'n'), 't'), 'e'),[m
[31m-                                 'n'), 't'), '-'), 'e'), 'n'), 'c'), 'o'),[m
[31m-                                 'd'), 'i'), 'n'), 'g');[m
[31m-            ngx_str_set(&h->key, "Content-Encoding");[m
[31m-            ngx_str_set(&h->value, "gzip");[m
[31m-            h->lowcase_key = (u_char*) "content-encoding";[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-            u->headers_in.content_encoding = h;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        /* try to find end of string */[m
[31m-        while (*p && *p++ != CR) { /* void */ }[m
[31m-[m
[31m-        /*[m
[31m-         * get the length of upcoming redis_key value, convert from ascii[m
[31m-         * if the length is empty, return[m
[31m-         */[m
[31m-#if defined nginx_version && nginx_version < 1001004[m
[31m-        r->headers_out.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (r->headers_out.content_length_n == -1) {[m
[31m-#else[m
[31m-        u->headers_in.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (u->headers_in.content_length_n == -1) {[m
[31m-#endif[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "redis sent invalid length in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        /* The length of answer is not empty, set 200 */[m
[31m-        u->headers_in.status_n = 200;[m
[31m-        u->state->status = 200;[m
[31m-        /* Set position to the first symbol of data and return */[m
[31m-        u->buffer.pos = p + 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-no_valid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "redis sent invalid response: \"%V\"", &line);[m
[31m-[m
[31m-    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_redis_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version < 1005003[m
[31m-    u->length += NGX_HTTP_REDIS_END;[m
[31m-#else[m
[31m-    if (u->headers_in.status_n != 404) {[m
[31m-        u->length = u->headers_in.content_length_n + NGX_HTTP_REDIS_END;[m
[31m-        ctx->rest = NGX_HTTP_REDIS_END;[m
[31m-[m
[31m-    } else {[m
[31m-        u->length = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_redis_ctx_t  *ctx = data;[m
[31m-[m
[31m-    u_char               *last;[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version < 1001004[m
[31m-    if (u->length == ctx->rest) {[m
[31m-#else[m
[31m-    if (u->length == (ssize_t) ctx->rest) {[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_strncmp(b->last,[m
[31m-                   ngx_http_redis_end + NGX_HTTP_REDIS_END - ctx->rest,[m
[31m-                   bytes)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                          "redis sent invalid trailer");[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            ctx->rest = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->length -= bytes;[m
[31m-        ctx->rest -= bytes;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 1001004[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = b->last;[m
[31m-    cl->buf->pos = last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "redis filter bytes:%z size:%z length:%z rest:%z",[m
[31m-                   bytes, b->last - b->pos, u->length, ctx->rest);[m
[31m-[m
[31m-    if (bytes <= (ssize_t) (u->length - NGX_HTTP_REDIS_END)) {[m
[31m-        u->length -= bytes;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    last += (size_t) (u->length - NGX_HTTP_REDIS_END);[m
[31m-[m
[31m-    if (ngx_strncmp(last, ngx_http_redis_end, b->last - last) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                      "redis sent invalid trailer");[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 1001004[m
[31m-        b->last = last;[m
[31m-        cl->buf->last = last;[m
[31m-        u->length = 0;[m
[31m-        ctx->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest -= b->last - last;[m
[31m-    b->last = last;[m
[31m-    cl->buf->last = last;[m
[31m-    u->length = ctx->rest;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 1001004[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_redis_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http redis request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_redis_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http redis request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_redis_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_redis_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_redis_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-        return NULL;[m
[31m-#else[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.ignore_client_abort = 0;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    /*[m
[31m-     * initialize additional parameters for hide[m
[31m-     * "Content-Encoding: gzip" header[m
[31m-     */[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->index = NGX_CONF_UNSET;[m
[31m-    conf->db = NGX_CONF_UNSET;[m
[31m-    conf->gzip_flag = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_redis_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_hash_init_t            hash;[m
[31m-[m
[31m-    ngx_http_redis_loc_conf_t *prev = parent;[m
[31m-    ngx_http_redis_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    /* Initialize hash for hide "Content-Encoding" header */[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "redis_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_redis_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.upstream == NULL) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->index == NGX_CONF_UNSET) {[m
[31m-        conf->index = prev->index;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->db == NGX_CONF_UNSET) {[m
[31m-        conf->db = prev->db;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->gzip_flag, prev->gzip_flag, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_redis_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_redis_loc_conf_t *rlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_url_t                  u;[m
[31m-    ngx_uint_t                 n;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    if (rlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_redis_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->index = ngx_http_get_variable_index(cf, &ngx_http_redis_key);[m
[31m-[m
[31m-    if (rlcf->index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->db = ngx_http_get_variable_index(cf, &ngx_http_redis_db);[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-    if (n) {[m
[31m-        rlcf->complex_target = ngx_palloc(cf->pool,[m
[31m-                                          sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        if (rlcf->complex_target == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = rlcf->complex_target;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->complex_target = NULL;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    rlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (rlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_reset_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_redis_db,[m
[31m-                                NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_redis_reset_variable;[m
[31m-[m
[31m-    n = ngx_http_get_variable_index(cf, &ngx_http_redis_db);[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_redis_db_index = n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_redis_upstream_add(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_uint_t                      i;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != url->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-               url->host.len) != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port[m
[31m-            && url->default_port[m
[31m-            && uscfp[i]->default_port != url->default_port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/ngx_http_redis_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/ngx_http_redis_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 4766fcd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/ngx_http_redis_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,1017 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Sergey A. Osokin[m
[31m- */[m
[31m-[m
[31m-#define NGX_ESCAPE_REDIS   4[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-    ngx_int_t                  index;[m
[31m-    ngx_int_t                  db;[m
[31m-    ngx_uint_t                 gzip_flag;[m
[31m-[m
[31m-    ngx_http_complex_value_t  *complex_target; /* for redis_pass */[m
[31m-} ngx_http_redis_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                     rest;[m
[31m-    ngx_http_request_t        *request;[m
[31m-    ngx_str_t                  key;[m
[31m-} ngx_http_redis_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_redis_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_redis_filter(void *data, ssize_t bytes);[m
[31m-static void ngx_http_redis_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_redis_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_redis_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_redis_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_redis_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_redis_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_http_upstream_srv_conf_t *[m
[31m-    ngx_http_redis_upstream_add(ngx_http_request_t *r, ngx_url_t *url);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_redis_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_redis_commands[] = {[m
[31m-[m
[31m-    { ngx_string("redis_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_redis_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8022[m
[31m-    { ngx_string("redis_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("redis_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_redis_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("redis_gzip_flag"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis_loc_conf_t, gzip_flag),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_redis_module_ctx = {[m
[31m-    ngx_http_redis_add_variables,          /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_redis_create_loc_conf,        /* create location configration */[m
[31m-    ngx_http_redis_merge_loc_conf          /* merge location configration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_redis_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_redis_module_ctx,            /* module context */[m
[31m-    ngx_http_redis_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-/* Initialize additional var for hide "Content-Enconding: gzip" header */[m
[31m-static ngx_str_t  ngx_http_redis_hide_headers[] = {[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-static ngx_str_t  ngx_http_redis_key = ngx_string("redis_key");[m
[31m-static ngx_str_t  ngx_http_redis_db  = ngx_string("redis_db");[m
[31m-static ngx_uint_t ngx_http_redis_db_index;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REDIS_END   (sizeof(ngx_http_redis_end) - 1)[m
[31m-static u_char  ngx_http_redis_end[] = CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_redis_ctx_t           *ctx;[m
[31m-    ngx_http_redis_loc_conf_t      *rlcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module);[m
[31m-    if (rlcf->complex_target) {[m
[31m-        ngx_str_t           target;[m
[31m-        ngx_url_t           url;[m
[31m-[m
[31m-        /* variables used in the redis_pass directive */[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, rlcf->complex_target, &target)[m
[31m-                != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (target.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                    "handler: empty \"redis_pass\" target");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        url.host = target;[m
[31m-        url.port = 0;[m
[31m-        url.default_port = 6379;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        rlcf->upstream.upstream = ngx_http_redis_upstream_add(r, &url);[m
[31m-[m
[31m-        if (rlcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                   "redis: upstream \"%V\" not found", &target);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-#else[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-#endif[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-    u = r->upstream;[m
[31m-#endif[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8037[m
[31m-    ngx_str_set(&u->schema, "redis://");[m
[31m-#else[m
[31m-    u->schema.len = sizeof("redis://") - 1;[m
[31m-    u->schema.data = (u_char *) "redis://";[m
[31m-#endif[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_redis_module;[m
[31m-#else[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-#endif[m
[31m-[m
[31m-#if !defined(nginx_version) || nginx_version < 8011[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_redis_module;[m
[31m-#endif[m
[31m-[m
[31m-    u->conf = &rlcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_http_redis_create_request;[m
[31m-    u->reinit_request = ngx_http_redis_reinit_request;[m
[31m-    u->process_header = ngx_http_redis_process_header;[m
[31m-    u->abort_request = ngx_http_redis_abort_request;[m
[31m-    u->finalize_request = ngx_http_redis_finalize_request;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version < 8011[m
[31m-    r->upstream = u;[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_palloc(r->pool, sizeof(ngx_http_redis_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest = NGX_HTTP_REDIS_END;[m
[31m-    ctx->request = r;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_redis_module);[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_redis_filter_init;[m
[31m-    u->input_filter = ngx_http_redis_filter;[m
[31m-    u->input_filter_ctx = ctx;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-    r->main->count++;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_init(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_http_redis_ctx_t           *ctx;[m
[31m-    ngx_http_variable_value_t      *vv[2];[m
[31m-    ngx_http_redis_loc_conf_t      *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module);[m
[31m-[m
[31m-    vv[0] = ngx_http_get_indexed_variable(r, ngx_http_redis_db_index);[m
[31m-[m
[31m-    /*[m
[31m-     * If user do not select redis database in nginx.conf by redis_db[m
[31m-     * variable, just add size of "select 0" to request.  This is add[m
[31m-     * some overhead in talk with redis, but this way simplify parsing[m
[31m-     * the redis answer in ngx_http_redis_process_header().[m
[31m-     */[m
[31m-    if (vv[0] == NULL || vv[0]->not_found || vv[0]->len == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "select 0 redis database" );[m
[31m-        len = sizeof("select 0") - 1;[m
[31m-    } else {[m
[31m-        len = sizeof("select ") - 1 + vv[0]->len;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "select %s redis database", vv[0]->data);[m
[31m-    }[m
[31m-    len += sizeof(CRLF) - 1;[m
[31m-[m
[31m-    vv[1] = ngx_http_get_indexed_variable(r, rlcf->index);[m
[31m-[m
[31m-    /* If nginx.conf have no redis_key return error. */[m
[31m-    if (vv[1] == NULL || vv[1]->not_found || vv[1]->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$redis_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* Count have space required escape symbols. */[m
[31m-    escape = 2 * ngx_escape_uri(NULL, vv[1]->data, vv[1]->len, NGX_ESCAPE_REDIS);[m
[31m-[m
[31m-    len += sizeof("get ") - 1 + vv[1]->len + escape + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    /* Create temporary buffer for request with size len. */[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    /* Add "select " for request. */[m
[31m-    *b->last++ = 's'; *b->last++ = 'e'; *b->last++ = 'l'; *b->last++ = 'e';[m
[31m-    *b->last++ = 'c'; *b->last++ = 't'; *b->last++ = ' ';[m
[31m-[m
[31m-    /* Get context redis_db from configuration file. */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_redis_module);[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    /*[m
[31m-     * Add "0" as redis number db to request if redis_db undefined,[m
[31m-     * othervise add real number from context.[m
[31m-     */[m
[31m-    if (vv[0] == NULL || vv[0]->not_found || vv[0]->len == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "select 0 redis database" );[m
[31m-        *b->last++ = '0';[m
[31m-    } else {[m
[31m-        b->last = ngx_copy(b->last, vv[0]->data, vv[0]->len);[m
[31m-        ctx->key.len = b->last - ctx->key.data;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "select %V redis database", &ctx->key);[m
[31m-    }[m
[31m-[m
[31m-    /* Add "\r\n". */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-[m
[31m-    /* Add "get" command with space. */[m
[31m-    *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' ';[m
[31m-[m
[31m-    /* Get context redis_key from nginx.conf. */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_redis_module);[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    /*[m
[31m-     * If no escape symbols then copy data as is, othervise use[m
[31m-     * escape-copy function.[m
[31m-     */[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, vv[1]->data, vv[1]->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, vv[1]->data, vv[1]->len,[m
[31m-                                            NGX_ESCAPE_REDIS);[m
[31m-    }[m
[31m-[m
[31m-    ctx->key.len = b->last - ctx->key.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http redis request: \"%V\"", &ctx->key);[m
[31m-[m
[31m-    /* Add one more "\r\n". */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    /*[m
[31m-     * Summary, the request looks like this:[m
[31m-     * "select $redis_db\r\nget $redis_key\r\n", where[m
[31m-     * $redis_db and $redis_key are variable's values.[m
[31m-     */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *p, *len;[m
[31m-    u_int                      c, try;[m
[31m-    ngx_str_t                  line;[m
[31m-    ngx_table_elt_t           *h;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_redis_ctx_t      *ctx;[m
[31m-    ngx_http_redis_loc_conf_t *rlcf;[m
[31m-[m
[31m-    c = try = 0;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    /*[m
[31m-     * Good answer from redis should looks like this:[m
[31m-     * "+OK\r\n$8\r\n12345678\r\n"[m
[31m-     *[m
[31m-     * Here is:[m
[31m-     * "+OK" is answer for first command "select 0".[m
[31m-     * Next two strings are answer for command "get $redis_key", where[m
[31m-     *[m
[31m-     * "$8" is length of following next string and[m
[31m-     * "12345678" is value of $redis_key, the string.[m
[31m-     *[m
[31m-     * So, if the first symbol is:[m
[31m-     * "+" (good answer) - try to find 2 strings;[m
[31m-     * "-" (bad answer) - try to find 1 string;[m
[31m-     * othervise answer is invalid. [m
[31m-     */[m
[31m-    if (*p == '+') {[m
[31m-        try = 2;[m
[31m-    } else if (*p == '-') {[m
[31m-        try = 1;[m
[31m-    } else {[m
[31m-        goto no_valid;[m
[31m-    }[m
[31m-[m
[31m-    for (p = u->buffer.pos; p < u->buffer.last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            c++;[m
[31m-            if (c == try) {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    line.len = p - u->buffer.pos - 1;[m
[31m-    line.data = u->buffer.pos;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "redis: \"%V\"", &line);[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    /* Get context of redis_key for future error messages, i.e. ctx->key */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_redis_module);[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module);[m
[31m-[m
[31m-    /* Compare pointer and error message, if yes set 502 and return */[m
[31m-    if (ngx_strncmp(p, "-ERR", sizeof("-ERR") - 1) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "redis sent error in response \"%V\" "[m
[31m-                      "for key \"%V\"",[m
[31m-                      &line, &ctx->key);[m
[31m-[m
[31m-        u->headers_in.status_n = 502;[m
[31m-        u->state->status = 502;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* Compare pointer and good message, if yes move on the pointer */[m
[31m-    if (ngx_strncmp(p, "+OK\r\n", sizeof("+OK\r\n") - 1) == 0) {[m
[31m-        p += sizeof("+OK\r\n") - 1;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Compare pointer and "get" answer.  As said before, "$" means, that[m
[31m-     * next symbols are length for upcoming key, "-1" means no key.[m
[31m-     * Set 404 and return.[m
[31m-     */[m
[31m-    if (ngx_strncmp(p, "$-1", sizeof("$-1") - 1) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "key: \"%V\" was not found by redis", &ctx->key);[m
[31m-[m
[31m-        u->headers_in.status_n = 404;[m
[31m-        u->state->status = 404;[m
[31m-#if defined nginx_version && nginx_version >= 1001004[m
[31m-        u->keepalive = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* Compare pointer and "get" answer, if "$"... */[m
[31m-    if (ngx_strncmp(p, "$", sizeof("$") - 1) == 0) {[m
[31m-[m
[31m-        /* move on pointer */[m
[31m-        p += sizeof("$") - 1;[m
[31m-[m
[31m-        /* set len to pointer */[m
[31m-        len = p;[m
[31m-[m
[31m-        /* if defined gzip_flag... */[m
[31m-        if (rlcf->gzip_flag) {[m
[31m-            /* hash init */[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * add Content-Encoding header for future gunzipping[m
[31m-             * with ngx_http_gunzip_filter module[m
[31m-             */[m
[31m-            h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash([m
[31m-                                ngx_hash(ngx_hash(ngx_hash([m
[31m-                                ngx_hash(ngx_hash(ngx_hash([m
[31m-                                ngx_hash(ngx_hash(ngx_hash([m
[31m-                                ngx_hash(ngx_hash('c', 'o'), 'n'), 't'), 'e'),[m
[31m-                                 'n'), 't'), '-'), 'e'), 'n'), 'c'), 'o'),[m
[31m-                                 'd'), 'i'), 'n'), 'g');[m
[31m-            ngx_str_set(&h->key, "Content-Encoding");[m
[31m-            ngx_str_set(&h->value, "gzip");[m
[31m-            h->lowcase_key = (u_char*) "content-encoding";[m
[31m-            u->headers_in.content_encoding = h;[m
[31m-        }[m
[31m-[m
[31m-        /* try to find end of string */[m
[31m-        while (*p && *p++ != CR) { /* void */ }[m
[31m-[m
[31m-        /*[m
[31m-         * get the length of upcoming redis_key value, convert from ascii[m
[31m-         * if the length is empty, return[m
[31m-         */[m
[31m-#if defined nginx_version && nginx_version < 1001004[m
[31m-        r->headers_out.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (r->headers_out.content_length_n == -1) {[m
[31m-#else[m
[31m-        u->headers_in.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (u->headers_in.content_length_n == -1) {[m
[31m-#endif[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "redis sent invalid length in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        /* The length of answer is not empty, set 200 */[m
[31m-        u->headers_in.status_n = 200;[m
[31m-        u->state->status = 200;[m
[31m-        /* Set position to the first symbol of data and return */[m
[31m-        u->buffer.pos = p + 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-no_valid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "redis sent invalid response: \"%V\"", &line);[m
[31m-[m
[31m-    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_redis_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version < 1005003[m
[31m-    u->length += NGX_HTTP_REDIS_END;[m
[31m-#else[m
[31m-    if (u->headers_in.status_n != 404) {[m
[31m-        u->length = u->headers_in.content_length_n + NGX_HTTP_REDIS_END;[m
[31m-        ctx->rest = NGX_HTTP_REDIS_END;[m
[31m-[m
[31m-    } else {[m
[31m-        u->length = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_redis_ctx_t  *ctx = data;[m
[31m-[m
[31m-    u_char               *last;[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version < 1001004[m
[31m-    if (u->length == ctx->rest) {[m
[31m-#else[m
[31m-    if (u->length == (ssize_t) ctx->rest) {[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_strncmp(b->last,[m
[31m-                   ngx_http_redis_end + NGX_HTTP_REDIS_END - ctx->rest,[m
[31m-                   bytes)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                          "redis sent invalid trailer");[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            ctx->rest = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->length -= bytes;[m
[31m-        ctx->rest -= bytes;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 1001004[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = b->last;[m
[31m-    cl->buf->pos = last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "redis filter bytes:%z size:%z length:%z rest:%z",[m
[31m-                   bytes, b->last - b->pos, u->length, ctx->rest);[m
[31m-[m
[31m-    if (bytes <= (ssize_t) (u->length - NGX_HTTP_REDIS_END)) {[m
[31m-        u->length -= bytes;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    last += (size_t) (u->length - NGX_HTTP_REDIS_END);[m
[31m-[m
[31m-    if (ngx_strncmp(last, ngx_http_redis_end, b->last - last) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                      "redis sent invalid trailer");[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 1001004[m
[31m-        b->last = last;[m
[31m-        cl->buf->last = last;[m
[31m-        u->length = 0;[m
[31m-        ctx->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest -= b->last - last;[m
[31m-    b->last = last;[m
[31m-    cl->buf->last = last;[m
[31m-    u->length = ctx->rest;[m
[31m-[m
[31m-#if defined nginx_version && nginx_version >= 1001004[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_redis_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http redis request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_redis_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http redis request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_redis_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_redis_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_redis_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-#if defined nginx_version && nginx_version >= 8011[m
[31m-        return NULL;[m
[31m-#else[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.ignore_client_abort = 0;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    /*[m
[31m-     * initialize additional parameters for hide[m
[31m-     * "Content-Encoding: gzip" header[m
[31m-     */[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->index = NGX_CONF_UNSET;[m
[31m-    conf->db = NGX_CONF_UNSET;[m
[31m-    conf->gzip_flag = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_redis_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_hash_init_t            hash;[m
[31m-[m
[31m-    ngx_http_redis_loc_conf_t *prev = parent;[m
[31m-    ngx_http_redis_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    /* Initialize hash for hide "Content-Encoding" header */[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "redis_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_redis_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.upstream == NULL) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->index == NGX_CONF_UNSET) {[m
[31m-        conf->index = prev->index;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->db == NGX_CONF_UNSET) {[m
[31m-        conf->db = prev->db;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->gzip_flag, prev->gzip_flag, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_redis_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_redis_loc_conf_t *rlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_url_t                  u;[m
[31m-    ngx_uint_t                 n;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    if (rlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_redis_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->index = ngx_http_get_variable_index(cf, &ngx_http_redis_key);[m
[31m-[m
[31m-    if (rlcf->index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->db = ngx_http_get_variable_index(cf, &ngx_http_redis_db);[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-    if (n) {[m
[31m-        rlcf->complex_target = ngx_palloc(cf->pool,[m
[31m-                                          sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        if (rlcf->complex_target == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = rlcf->complex_target;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->complex_target = NULL;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    rlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (rlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_reset_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_redis_db,[m
[31m-                                NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_redis_reset_variable;[m
[31m-[m
[31m-    n = ngx_http_get_variable_index(cf, &ngx_http_redis_db);[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_redis_db_index = n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_redis_upstream_add(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_uint_t                      i;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != url->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-               url->host.len) != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port[m
[31m-            && url->default_port[m
[31m-            && uscfp[i]->default_port != url->default_port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/Test/Nginx.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/Test/Nginx.pm[m
[1mdeleted file mode 100644[m
[1mindex 9e9d5c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/Test/Nginx.pm[m
[1m+++ /dev/null[m
[36m@@ -1,447 +0,0 @@[m
[31m-package Test::Nginx;[m
[31m-[m
[31m-# (C) Maxim Dounin[m
[31m-[m
[31m-# Generic module for nginx tests.[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-use warnings;[m
[31m-use strict;[m
[31m-[m
[31m-use base qw/ Exporter /;[m
[31m-[m
[31m-our @EXPORT = qw/ log_in log_out http http_get http_head /;[m
[31m-our @EXPORT_OK = qw/ http_gzip_request http_gzip_like /;[m
[31m-our %EXPORT_TAGS = ([m
[31m-	gzip => [ qw/ http_gzip_request http_gzip_like / ][m
[31m-);[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-use File::Temp qw/ tempdir /;[m
[31m-use IO::Socket;[m
[31m-use Socket qw/ CRLF /;[m
[31m-use Test::More qw//;[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-our $NGINX = defined $ENV{TEST_NGINX_BINARY} ? $ENV{TEST_NGINX_BINARY}[m
[31m-	: '../nginx/objs/nginx';[m
[31m-[m
[31m-sub new {[m
[31m-	my $self = {};[m
[31m-	bless $self;[m
[31m-[m
[31m-	$self->{_testdir} = tempdir([m
[31m-		'nginx-test-XXXXXXXXXX',[m
[31m-		TMPDIR => 1,[m
[31m-		CLEANUP => not $ENV{TEST_NGINX_LEAVE}[m
[31m-	)[m
[31m-		or die "Can't create temp directory: $!\n";[m
[31m-[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub DESTROY {[m
[31m-	my ($self) = @_;[m
[31m-	$self->stop();[m
[31m-	$self->stop_daemons();[m
[31m-	if ($ENV{TEST_NGINX_CATLOG}) {[m
[31m-		system("cat $self->{_testdir}/error.log");[m
[31m-	}[m
[31m-}[m
[31m-[m
[31m-sub has($;) {[m
[31m-	my ($self, @features) = @_;[m
[31m-[m
[31m-	foreach my $feature (@features) {[m
[31m-		Test::More::plan(skip_all => "$feature not compiled in")[m
[31m-			unless $self->has_module($feature);[m
[31m-	}[m
[31m-[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub has_module($) {[m
[31m-	my ($self, $feature) = @_;[m
[31m-[m
[31m-	my %regex = ([m
[31m-		mail	=> '--with-mail(?!\S)',[m
[31m-		flv	=> '--with-http_flv_module',[m
[31m-		perl	=> '--with-http_perl_module',[m
[31m-		redis   => '(?s)^(?!--add-module=.*ngx_http_redis-)',[m
[31m-		charset	=> '(?s)^(?!.*--without-http_charset_module)',[m
[31m-		gzip	=> '(?s)^(?!.*--without-http_gzip_module)',[m
[31m-		ssi	=> '(?s)^(?!.*--without-http_ssi_module)',[m
[31m-		userid	=> '(?s)^(?!.*--without-http_userid_module)',[m
[31m-		access	=> '(?s)^(?!.*--without-http_access_module)',[m
[31m-		auth_basic[m
[31m-			=> '(?s)^(?!.*--without-http_auth_basic_module)',[m
[31m-		autoindex[m
[31m-			=> '(?s)^(?!.*--without-http_autoindex_module)',[m
[31m-		geo	=> '(?s)^(?!.*--without-http_geo_module)',[m
[31m-		map	=> '(?s)^(?!.*--without-http_map_module)',[m
[31m-		referer	=> '(?s)^(?!.*--without-http_referer_module)',[m
[31m-		rewrite	=> '(?s)^(?!.*--without-http_rewrite_module)',[m
[31m-		proxy	=> '(?s)^(?!.*--without-http_proxy_module)',[m
[31m-		fastcgi	=> '(?s)^(?!.*--without-http_fastcgi_module)',[m
[31m-		uwsgi	=> '(?s)^(?!.*--without-http_uwsgi_module)',[m
[31m-		scgi	=> '(?s)^(?!.*--without-http_scgi_module)',[m
[31m-		memcached[m
[31m-			=> '(?s)^(?!.*--without-http_memcached_module)',[m
[31m-		limit_zone[m
[31m-			=> '(?s)^(?!.*--without-http_limit_zone_module)',[m
[31m-		limit_req[m
[31m-			=> '(?s)^(?!.*--without-http_limit_req_module)',[m
[31m-		empty_gif[m
[31m-			=> '(?s)^(?!.*--without-http_empty_gif_module)',[m
[31m-		browser	=> '(?s)^(?!.*--without-http_browser_module)',[m
[31m-		upstream_ip_hash[m
[31m-			=> '(?s)^(?!.*--without-http_upstream_ip_hash_module)',[m
[31m-		http	=> '(?s)^(?!.*--without-http(?!\S))',[m
[31m-		cache	=> '(?s)^(?!.*--without-http-cache)',[m
[31m-		pop3	=> '(?s)^(?!.*--without-mail_pop3_module)',[m
[31m-		imap	=> '(?s)^(?!.*--without-mail_imap_module)',[m
[31m-		smtp	=> '(?s)^(?!.*--without-mail_smtp_module)',[m
[31m-		pcre	=> '(?s)^(?!.*--without-pcre)',[m
[31m-	);[m
[31m-[m
[31m-	my $re = $regex{$feature};[m
[31m-	$re = $feature if !defined $re;[m
[31m-[m
[31m-	$self->{_configure_args} = `$NGINX -V 2>&1`[m
[31m-		if !defined $self->{_configure_args};[m
[31m-[m
[31m-	return ($self->{_configure_args} =~ $re) ? 1 : 0;[m
[31m-}[m
[31m-[m
[31m-sub has_daemon($) {[m
[31m-	my ($self, $daemon) = @_;[m
[31m-[m
[31m-	Test::More::plan(skip_all => "$daemon not found")[m
[31m-		unless `which $daemon`;[m
[31m-[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub plan($) {[m
[31m-	my ($self, $plan) = @_;[m
[31m-[m
[31m-	Test::More::plan(tests => $plan);[m
[31m-[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub run(;$) {[m
[31m-	my ($self, $conf) = @_;[m
[31m-[m
[31m-	my $testdir = $self->{_testdir};[m
[31m-[m
[31m-	if (defined $conf) {[m
[31m-		my $c = `cat $conf`;[m
[31m-		$self->write_file_expand('nginx.conf', $c);[m
[31m-	}[m
[31m-[m
[31m-	my $pid = fork();[m
[31m-	die "Unable to fork(): $!\n" unless defined $pid;[m
[31m-[m
[31m-	if ($pid == 0) {[m
[31m-		my @globals = $self->{_test_globals} ?[m
[31m-			() : ('-g', "pid $testdir/nginx.pid; "[m
[31m-			. "error_log $testdir/error.log debug;");[m
[31m-		exec($NGINX, '-c', "$testdir/nginx.conf", @globals)[m
[31m-			or die "Unable to exec(): $!\n";[m
[31m-	}[m
[31m-[m
[31m-	# wait for nginx to start[m
[31m-[m
[31m-	$self->waitforfile("$testdir/nginx.pid")[m
[31m-		or die "Can't start nginx";[m
[31m-[m
[31m-	$self->{_started} = 1;[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub waitforfile($) {[m
[31m-	my ($self, $file) = @_;[m
[31m-[m
[31m-	# wait for file to appear[m
[31m-[m
[31m-	for (1 .. 30) {[m
[31m-		return 1 if -e $file;[m
[31m-		select undef, undef, undef, 0.1;[m
[31m-	}[m
[31m-[m
[31m-	return undef;[m
[31m-}[m
[31m-[m
[31m-sub waitforsocket($) {[m
[31m-	my ($self, $peer) = @_;[m
[31m-[m
[31m-	# wait for socket to accept connections[m
[31m-[m
[31m-	for (1 .. 30) {[m
[31m-		my $s = IO::Socket::INET->new([m
[31m-			Proto => 'tcp',[m
[31m-			PeerAddr => $peer[m
[31m-		);[m
[31m-[m
[31m-		return 1 if defined $s;[m
[31m-[m
[31m-		select undef, undef, undef, 0.1;[m
[31m-	}[m
[31m-[m
[31m-	return undef;[m
[31m-}[m
[31m-[m
[31m-sub stop() {[m
[31m-	my ($self) = @_;[m
[31m-[m
[31m-	return $self unless $self->{_started};[m
[31m-[m
[31m-	kill 'QUIT', `cat $self->{_testdir}/nginx.pid`;[m
[31m-	wait;[m
[31m-[m
[31m-	$self->{_started} = 0;[m
[31m-[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub stop_daemons() {[m
[31m-	my ($self) = @_;[m
[31m-[m
[31m-	while ($self->{_daemons} && scalar @{$self->{_daemons}}) {[m
[31m-		my $p = shift @{$self->{_daemons}};[m
[31m-		kill 'TERM', $p;[m
[31m-		wait;[m
[31m-	}[m
[31m-[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub write_file($$) {[m
[31m-	my ($self, $name, $content) = @_;[m
[31m-[m
[31m-	open F, '>' . $self->{_testdir} . '/' . $name[m
[31m-		or die "Can't create $name: $!";[m
[31m-	print F $content;[m
[31m-	close F;[m
[31m-[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub write_file_expand($$) {[m
[31m-	my ($self, $name, $content) = @_;[m
[31m-[m
[31m-	$content =~ s/%%TEST_GLOBALS%%/$self->test_globals()/gmse;[m
[31m-	$content =~ s/%%TEST_GLOBALS_HTTP%%/$self->test_globals_http()/gmse;[m
[31m-	$content =~ s/%%TESTDIR%%/$self->{_testdir}/gms;[m
[31m-[m
[31m-	return $self->write_file($name, $content);[m
[31m-}[m
[31m-[m
[31m-sub run_daemon($;@) {[m
[31m-	my ($self, $code, @args) = @_;[m
[31m-[m
[31m-	my $pid = fork();[m
[31m-	die "Can't fork daemon: $!\n" unless defined $pid;[m
[31m-[m
[31m-	if ($pid == 0) {[m
[31m-		if (ref($code) eq 'CODE') {[m
[31m-			$code->(@args);[m
[31m-			exit 0;[m
[31m-		} else {[m
[31m-			exec($code, @args);[m
[31m-		}[m
[31m-	}[m
[31m-[m
[31m-	$self->{_daemons} = [] unless defined $self->{_daemons};[m
[31m-	push @{$self->{_daemons}}, $pid;[m
[31m-[m
[31m-	return $self;[m
[31m-}[m
[31m-[m
[31m-sub testdir() {[m
[31m-	my ($self) = @_;[m
[31m-	return $self->{_testdir};[m
[31m-}[m
[31m-[m
[31m-sub test_globals() {[m
[31m-	my ($self) = @_;[m
[31m-[m
[31m-	return $self->{_test_globals}[m
[31m-		if defined $self->{_test_globals};[m
[31m-[m
[31m-	my $s = '';[m
[31m-[m
[31m-	$s .= "pid $self->{_testdir}/nginx.pid;\n";[m
[31m-	$s .= "error_log $self->{_testdir}/error.log debug;\n";[m
[31m-[m
[31m-	$self->{_test_globals} = $s;[m
[31m-}[m
[31m-[m
[31m-sub test_globals_http() {[m
[31m-	my ($self) = @_;[m
[31m-[m
[31m-	return $self->{_test_globals_http}[m
[31m-		if defined $self->{_test_globals_http};[m
[31m-[m
[31m-	my $s = '';[m
[31m-[m
[31m-	$s .= "root $self->{_testdir};\n";[m
[31m-	$s .= "access_log $self->{_testdir}/access.log;\n";[m
[31m-	$s .= "client_body_temp_path $self->{_testdir}/client_body_temp;\n";[m
[31m-[m
[31m-	$s .= "fastcgi_temp_path $self->{_testdir}/fastcgi_temp;\n" [m
[31m-		if $self->has_module('fastcgi');[m
[31m-[m
[31m-	$s .= "proxy_temp_path $self->{_testdir}/proxy_temp;\n"[m
[31m-		if $self->has_module('proxy');[m
[31m-[m
[31m-	$s .= "uwsgi_temp_path $self->{_testdir}/uwsgi_temp;\n"[m
[31m-		if $self->has_module('uwsgi');[m
[31m-[m
[31m-	$s .= "scgi_temp_path $self->{_testdir}/scgi_temp;\n"[m
[31m-		if $self->has_module('scgi');[m
[31m-[m
[31m-	$self->{_test_globals_http} = $s;[m
[31m-}[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-sub log_core {[m
[31m-	return unless $ENV{TEST_NGINX_VERBOSE};[m
[31m-	my ($prefix, $msg) = @_;[m
[31m-	($prefix, $msg) = ('', $prefix) unless defined $msg;[m
[31m-	$prefix .= ' ' if length($prefix) > 0;[m
[31m-[m
[31m-	if (length($msg) > 4096) {[m
[31m-		$msg = substr($msg, 0, 4096)[m
[31m-			. "(...logged only 4096 of " . length($msg)[m
[31m-			. " bytes)";[m
[31m-	}[m
[31m-[m
[31m-	$msg =~ s/^/# $prefix/gm;[m
[31m-	$msg =~ s/([^\x20-\x7e])/sprintf('\\x%02x', ord($1)) . (($1 eq "\n") ? "\n" : '')/gmxe;[m
[31m-	$msg .= "\n" unless $msg =~ /\n\Z/;[m
[31m-	print $msg;[m
[31m-}[m
[31m-[m
[31m-sub log_out {[m
[31m-	log_core('>>', @_);[m
[31m-}[m
[31m-[m
[31m-sub log_in {[m
[31m-	log_core('<<', @_);[m
[31m-}[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-sub http_get($;%) {[m
[31m-	my ($url, %extra) = @_;[m
[31m-	return http(<<EOF, %extra);[m
[31m-GET $url HTTP/1.0[m
[31m-Host: localhost[m
[31m-[m
[31m-EOF[m
[31m-}[m
[31m-[m
[31m-sub http_head($;%) {[m
[31m-	my ($url, %extra) = @_;[m
[31m-	return http(<<EOF, %extra);[m
[31m-HEAD $url HTTP/1.0[m
[31m-Host: localhost[m
[31m-[m
[31m-EOF[m
[31m-}[m
[31m-[m
[31m-sub http($;%) {[m
[31m-	my ($request, %extra) = @_;[m
[31m-	my $reply;[m
[31m-	eval {[m
[31m-		local $SIG{ALRM} = sub { die "timeout\n" };[m
[31m-		local $SIG{PIPE} = sub { die "sigpipe\n" };[m
[31m-		alarm(2);[m
[31m-		my $s = IO::Socket::INET->new([m
[31m-			Proto => 'tcp',[m
[31m-			PeerAddr => '127.0.0.1:8080'[m
[31m-		);[m
[31m-		log_out($request);[m
[31m-		$s->print($request);[m
[31m-		local $/;[m
[31m-		select undef, undef, undef, $extra{sleep} if $extra{sleep};[m
[31m-		return '' if $extra{aborted};[m
[31m-		$reply = $s->getline();[m
[31m-		alarm(0);[m
[31m-	};[m
[31m-	alarm(0);[m
[31m-	if ($@) {[m
[31m-		log_in("died: $@");[m
[31m-		return undef;[m
[31m-	} else {[m
[31m-		log_in($reply);[m
[31m-	}[m
[31m-	return $reply;[m
[31m-}[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-sub http_gzip_request {[m
[31m-	my ($url) = @_;[m
[31m-	my $r = http(<<EOF);[m
[31m-GET $url HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Accept-Encoding: gzip[m
[31m-[m
[31m-EOF[m
[31m-}[m
[31m-[m
[31m-sub http_content {[m
[31m-	my ($text) = @_;[m
[31m-[m
[31m-	return undef if !defined $text;[m
[31m-[m
[31m-	if ($text !~ /(.*?)\x0d\x0a?\x0d\x0a?(.*)/ms) {[m
[31m-		return undef;[m
[31m-	}[m
[31m-[m
[31m-	my ($headers, $body) = ($1, $2);[m
[31m-[m
[31m-	if ($headers !~ /Transfer-Encoding: chunked/i) {[m
[31m-		return $body;[m
[31m-	}[m
[31m-[m
[31m-	my $content = '';[m
[31m-	while ($body =~ /\G\x0d?\x0a?([0-9a-f]+)\x0d\x0a?/gcmsi) {[m
[31m-		my $len = hex($1);[m
[31m-		$content .= substr($body, pos($body), $len);[m
[31m-		pos($body) += $len;[m
[31m-	}[m
[31m-[m
[31m-	return $content;[m
[31m-}[m
[31m-[m
[31m-sub http_gzip_like {[m
[31m-	my ($text, $re, $name) = @_;[m
[31m-[m
[31m-	SKIP: {[m
[31m-		eval { require IO::Uncompress::Gunzip; };[m
[31m-		Test::More->builder->skip([m
[31m-			"IO::Uncompress::Gunzip not installed", 1) if $@;[m
[31m-[m
[31m-		my $in = http_content($text);[m
[31m-		my $out;[m
[31m-[m
[31m-		IO::Uncompress::Gunzip::gunzip(\$in => \$out);[m
[31m-[m
[31m-		Test::More->builder->like($out, $re, $name);[m
[31m-	}[m
[31m-}[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-1;[m
[31m-[m
[31m-###############################################################################[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/redis.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/redis.t[m
[1mdeleted file mode 100644[m
[1mindex f64bc30..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/redis.t[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-#!/usr/bin/perl[m
[31m-[m
[31m-# (C) Maxim Dounin[m
[31m-# (C) Sergey A. Osokin[m
[31m-[m
[31m-# Test for redis backend.[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-use warnings;[m
[31m-use strict;[m
[31m-[m
[31m-use Test::More;[m
[31m-[m
[31m-BEGIN { use FindBin; chdir($FindBin::Bin); }[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx;[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-select STDERR; $| = 1;[m
[31m-select STDOUT; $| = 1;[m
[31m-[m
[31m-eval { require Redis; };[m
[31m-plan(skip_all => 'Redis not installed') if $@;[m
[31m-[m
[31m-[m
[31m-my $t = Test::Nginx->new()->has(qw/http redis/)[m
[31m-	->has_daemon('redis-server')->plan(6)[m
[31m-	->write_file_expand('nginx.conf', <<'EOF');[m
[31m-[m
[31m-%%TEST_GLOBALS%%[m
[31m-[m
[31m-daemon         off;[m
[31m-[m
[31m-events {[m
[31m-}[m
[31m-[m
[31m-http {[m
[31m-    %%TEST_GLOBALS_HTTP%%[m
[31m-[m
[31m-    upstream redisbackend {[m
[31m-        server 127.0.0.1:8081;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        listen       127.0.0.1:8080;[m
[31m-        server_name  localhost;[m
[31m-[m
[31m-        location / {[m
[31m-            set $redis_key $uri;[m
[31m-            redis_pass redisbackend;[m
[31m-        }[m
[31m-[m
[31m-        location /0 {[m
[31m-            set $redis_key $uri;[m
[31m-            set $redis_db  "0";[m
[31m-            redis_pass redisbackend;[m
[31m-        }[m
[31m-[m
[31m-        location /1 {[m
[31m-            set $redis_key $uri;[m
[31m-            set $redis_db  "1";[m
[31m-            redis_pass redisbackend;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-EOF[m
[31m-[m
[31m-$t->write_file('redis.conf', <<EOF);[m
[31m-[m
[31m-daemonize no[m
[31m-pidfile ./redis.pid[m
[31m-port 8081[m
[31m-bind 127.0.0.1[m
[31m-timeout 300[m
[31m-loglevel debug[m
[31m-logfile ./redis.log[m
[31m-databases 16[m
[31m-save 900 1[m
[31m-save 300 10[m
[31m-save 60 10000[m
[31m-rdbcompression yes[m
[31m-dbfilename dump.rdb[m
[31m-dir ./[m
[31m-appendonly no[m
[31m-appendfsync always[m
[31m-[m
[31m-EOF[m
[31m-[m
[31m-$t->run_daemon('redis-server', $t->testdir() . '/redis.conf');[m
[31m-$t->run();[m
[31m-[m
[31m-$t->waitforsocket('127.0.0.1:8081')[m
[31m-	or die "Can't start redis";[m
[31m-[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-my $r = Redis->new(server => '127.0.0.1:8081');[m
[31m-$r->set('/' => 'SEE-THIS') or die "can't put value into redis: $!";[m
[31m-$r->set('/0/' => 'SEE-THIS.0') or die "can't put value into redis: $!";[m
[31m-[m
[31m-$r->select("1") or die "can't select db 1 in redis: $!";[m
[31m-$r->set('/1/' => 'SEE-THIS.1') or die "can't put value into redis: $!";[m
[31m-[m
[31m-like(http_get('/'), qr/SEE-THIS/, 'redis request /');[m
[31m-[m
[31m-like(http_get('/0/'), qr/SEE-THIS.0/, 'redis request from db 0');[m
[31m-[m
[31m-like(http_get('/1/'), qr/SEE-THIS.1/, 'redis request from db 1');[m
[31m-[m
[31m-like(http_get('/0/'), qr/SEE-THIS.0/, 'redis request from db 0');[m
[31m-[m
[31m-like(http_get('/notfound'), qr/404/, 'redis not found');[m
[31m-[m
[31m-unlike (http_head('/'), qr/SEE-THIS/, 'redis no data in HEAD');[m
[31m-[m
[31m-###############################################################################[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/redis_db_not_set.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/redis_db_not_set.t[m
[1mdeleted file mode 100644[m
[1mindex d9ec5ba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis-nginx-module-0.3.7/t/redis_db_not_set.t[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-#!/usr/bin/perl[m
[31m-[m
[31m-# (C) Maxim Dounin[m
[31m-# (C) Sergey A. Osokin[m
[31m-[m
[31m-# Test for redis backend.[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-use warnings;[m
[31m-use strict;[m
[31m-[m
[31m-use Test::More;[m
[31m-[m
[31m-BEGIN { use FindBin; chdir($FindBin::Bin); }[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx;[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-select STDERR; $| = 1;[m
[31m-select STDOUT; $| = 1;[m
[31m-[m
[31m-eval { require Redis; };[m
[31m-plan(skip_all => 'Redis not installed') if $@;[m
[31m-[m
[31m-my $t = Test::Nginx->new()->has(qw/http redis/)[m
[31m-	->has_daemon('redis-server')->plan(1)[m
[31m-	->write_file_expand('nginx.conf', <<'EOF');[m
[31m-[m
[31m-%%TEST_GLOBALS%%[m
[31m-[m
[31m-daemon         off;[m
[31m-[m
[31m-events {[m
[31m-}[m
[31m-[m
[31m-http {[m
[31m-    %%TEST_GLOBALS_HTTP%%[m
[31m-[m
[31m-    upstream redisbackend {[m
[31m-        server 127.0.0.1:8081;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        listen       127.0.0.1:8080;[m
[31m-        server_name  localhost;[m
[31m-[m
[31m-        location / {[m
[31m-            set $redis_key $uri;[m
[31m-            redis_pass redisbackend;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-EOF[m
[31m-[m
[31m-$t->run();[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 0f2da28..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-analyze[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-util/bench[m
[31m-src/cipher.c[m
[31m-src/cipher.h[m
[31m-pack.sh[m
[31m-*.html[m
[31m-t/servroot/[m
[31m-src/reply.c[m
[31m-src/reply.h[m
[31m-src/reply.rl[m
[31m-all[m
[31m-go[m
[31m-buildroot/[m
[31m-build1[0-9][m
[31m-*.plist[m
[31m-Makefile[m
[31m-addr2line[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/Changes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/Changes[m
[1mdeleted file mode 100644[m
[1mindex a442193..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/Changes[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-v0.07 - 20 July, 2011[m
[31m-* now we have implemented redis command pipelining by using multiple redis2_query directives in a single location. also updated the document to reflect this change.[m
[31m-* implemented the new redis2_raw_queries directive which supports multiple pipelined redis commands in a single TCP query.[m
[31m-* fixed github issue #5: CRLF in chunk data confused the response parser when packet segmentation happens. thanks dlogar.[m
[31m-* fixed an issue in the multi-bulk reply parser that only chunks were allowed as elements. now single line replies are all allowed, but recursive multi-bulk replies are still not allowed.[m
[31m-* fixed an issue regarding defining global variables in C header files: we should have defined the global ngx_http_redis2_module in a single compilation unit. thanks @姜大炮.[m
[31m-* documented the redis2_next_upstream directive as per Lance.[m
[31m-* documented the limited redis pub/sub feature support.[m
[31m-* documented the various timeout config directives. thanks Mike Ferrier.[m
[31m-* now we only issue a warning when there is left-over bytes in the redis response stream.[m
[31m-* added a memory allocation failure check. (calio)[m
[31m-* fixed a typo in the source; it does not affect runtime results though. thanks calio for catching it.[m
[31m-* fixed one spot of unused-but-set-variable warning issued by gcc 4.6.[m
[31m-* now we allow empty parameters in the redis2_query directive.[m
[31m-* added a performance tuning section as per HowToMeetLadies.[m
[31m-* fixed a typo in the source code reported by Rares Mirica.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/config[m
[1mdeleted file mode 100644[m
[1mindex bd0c3a9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/config[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_redis2_module[m
[31m-[m
[31m-REDIS2_SRCS="                                                               \[m
[31m-            $ngx_addon_dir/src/ngx_http_redis2_module.c                     \[m
[31m-            $ngx_addon_dir/src/ngx_http_redis2_handler.c                    \[m
[31m-            $ngx_addon_dir/src/ngx_http_redis2_reply.c                      \[m
[31m-            $ngx_addon_dir/src/ngx_http_redis2_util.c                       \[m
[31m-            "[m
[31m-[m
[31m-REDIS2_DEPS="                                                               \[m
[31m-            $ngx_addon_dir/src/ddebug.h                                     \[m
[31m-            $ngx_addon_dir/src/ngx_http_redis2_module.h                     \[m
[31m-            $ngx_addon_dir/src/ngx_http_redis2_handler.h                    \[m
[31m-            $ngx_addon_dir/src/ngx_http_redis2_reply.h                      \[m
[31m-            $ngx_addon_dir/src/ngx_http_redis2_util.h                       \[m
[31m-            "[m
[31m-[m
[31m-if [ -n "$ngx_module_link" ]; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_srcs="$REDIS2_SRCS"[m
[31m-    ngx_module_deps="$REDIS2_DEPS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $REDIS2_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $REDIS2_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/misc/serv.erl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/misc/serv.erl[m
[1mdeleted file mode 100755[m
[1mindex 52188f2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/misc/serv.erl[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-#!/usr/bin/env escript[m
[31m-[m
[31m--define(PORT, 4891).[m
[31m--define(TIMEOUT, 3000).[m
[31m-[m
[31m-main(_) -> io:format("listening to port ~w~n", [?PORT]), server().[m
[31m-[m
[31m-server() ->[m
[31m-    case gen_tcp:listen(?PORT, [binary, {active, false}, {reuseaddr, true}, {nodelay, true}]) of[m
[31m-        {ok, LSock} -> wait_connect(LSock);[m
[31m-        E -> io:format("error occured: ~w~n", [E])[m
[31m-    end.[m
[31m-[m
[31m-wait_connect(LSock) ->[m
[31m-    % io:format("trying to accept..."),[m
[31m-    case gen_tcp:accept(LSock) of[m
[31m-        {ok, Sock} ->[m
[31m-            Pid = spawn([m
[31m-                fun () ->[m
[31m-                    receive start -> ok end,[m
[31m-                    get_request(Sock)[m
[31m-                end[m
[31m-            ),[m
[31m-            gen_tcp:controlling_process(Sock, Pid),[m
[31m-            Pid ! start;[m
[31m-        {error, Error} ->[m
[31m-            io:format("failed to accept: ~w~n", [Error]);[m
[31m-        E -> io:format("error: ~w~n", [E])[m
[31m-    end,[m
[31m-    wait_connect(LSock).[m
[31m-[m
[31m-get_request(Sock) ->[m
[31m-    % io:format("get request~n"),[m
[31m-    send_response(Sock).[m
[31m-[m
[31m-send_response(Sock) ->[m
[31m-    gen_tcp:send(Sock, "$1a\r\n"),[m
[31m-    gen_tcp:close(Sock).[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/common.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/common.rl[m
[1mdeleted file mode 100644[m
[1mindex 17083de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/common.rl[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-%%{[m
[31m-    machine common;[m
[31m-[m
[31m-    action read_char {[m
[31m-        dd("reading %c", *p);[m
[31m-    }[m
[31m-[m
[31m-    CR = "\r";[m
[31m-    LF = "\n";[m
[31m-    CRLF = CR LF; # $read_char;[m
[31m-[m
[31m-    action finalize {[m
[31m-        dd("done!");[m
[31m-        done = 1;[m
[31m-    }[m
[31m-[m
[31m-    action read_size {[m
[31m-        ctx->chunk_size *= 10;[m
[31m-        ctx->chunk_size += *p - '0';[m
[31m-        dd("read chunk size: %d", (int) ctx->chunk_size);[m
[31m-    }[m
[31m-[m
[31m-    action start_reading_size {[m
[31m-        dd("start reading chunk size");[m
[31m-        ctx->chunk_bytes_read = 0;[m
[31m-        ctx->chunk_size = 0;[m
[31m-    }[m
[31m-[m
[31m-    action start_reading_data {[m
[31m-        dd("start reading data");[m
[31m-        ctx->chunk_bytes_read = 0;[m
[31m-    }[m
[31m-[m
[31m-    action test_len {[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-    }[m
[31m-[m
[31m-    chunk_size = ([1-9] digit*) >start_reading_size $read_size[m
[31m-               ;[m
[31m-[m
[31m-    chunk_data_octet = any when test_len[m
[31m-                     ;[m
[31m-[m
[31m-    chunk_data = chunk_data_octet+;[m
[31m-[m
[31m-    action read_chunk {[m
[31m-        ctx->chunks_read++;[m
[31m-        dd("have read chunk %d, %.*s", (int) ctx->chunks_read,[m
[31m-            (int) (p - (signed char *) b->last), (signed char *) b->last);[m
[31m-    }[m
[31m-[m
[31m-    action check_data_complete {[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-    }[m
[31m-[m
[31m-    trailer = CRLF @read_chunk[m
[31m-            ;[m
[31m-[m
[31m-    chunk = "$" "0"+ CRLF trailer[m
[31m-          | "$-" digit+ trailer[m
[31m-          | "$" chunk_size CRLF chunk_data CR when check_data_complete LF @read_chunk[m
[31m-          ;[m
[31m-[m
[31m-    single_line_reply = [:\+\-] (any* -- CRLF) CRLF;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 70d3225..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "redis2 *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/multi_bulk_reply.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/multi_bulk_reply.rl[m
[1mdeleted file mode 100644[m
[1mindex be6f8eb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/multi_bulk_reply.rl[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-%%{[m
[31m-    machine multi_bulk_reply;[m
[31m-[m
[31m-    include common "common.rl";[m
[31m-[m
[31m-    action test_chunk_count {[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-    }[m
[31m-[m
[31m-    action start_reading_chunk {[m
[31m-        dd("start reading bulk");[m
[31m-        ctx->chunks_read = 0;[m
[31m-    }[m
[31m-[m
[31m-    action start_reading_count {[m
[31m-        dd("start reading bulk count");[m
[31m-        ctx->chunk_count = 0;[m
[31m-    }[m
[31m-[m
[31m-    action read_count {[m
[31m-        ctx->chunk_count *= 10;[m
[31m-        ctx->chunk_count += *p - '0';[m
[31m-        dd("chunk count: %d", (int) ctx->chunk_count);[m
[31m-    }[m
[31m-[m
[31m-    action multi_bulk_finalize {[m
[31m-        dd("finalize multi bulks");[m
[31m-[m
[31m-        if (ctx->chunks_read == ctx->chunk_count) {[m
[31m-            dd("done multi bunlk reading!");[m
[31m-            done = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    reply = single_line_reply @read_chunk[m
[31m-          | chunk[m
[31m-          ;[m
[31m-[m
[31m-    protected_chunk = reply when test_chunk_count[m
[31m-                    ;[m
[31m-[m
[31m-    chunk_count = ([1-9] digit*) >start_reading_count $read_count[m
[31m-                ;[m
[31m-[m
[31m-    multi_bulk_reply = "*" "-1" CRLF @multi_bulk_finalize[m
[31m-                     | "*" "0"+ CRLF @multi_bulk_finalize[m
[31m-                     | "*" chunk_count CRLF @start_reading_chunk[m
[31m-                        protected_chunk+[m
[31m-                        @multi_bulk_finalize[m
[31m-                     ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_handler.c[m
[1mdeleted file mode 100644[m
[1mindex ee42be9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,318 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_redis2_handler.h"[m
[31m-#include "ngx_http_redis2_reply.h"[m
[31m-#include "ngx_http_redis2_util.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_redis2_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis2_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis2_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_redis2_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_redis2_filter(void *data, ssize_t bytes);[m
[31m-static void ngx_http_redis2_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_redis2_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_redis2_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_upstream_t             *u;[m
[31m-    ngx_http_redis2_ctx_t           *ctx;[m
[31m-    ngx_http_redis2_loc_conf_t      *rlcf;[m
[31m-    ngx_str_t                        target;[m
[31m-    ngx_url_t                        url;[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis2_module);[m
[31m-[m
[31m-    if (rlcf->complex_target) {[m
[31m-        /* variables used in the redis2_pass directive */[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, rlcf->complex_target, &target)[m
[31m-                != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (target.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                    "handler: empty \"redis2_pass\" target");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        url.host = target;[m
[31m-        url.port = 0;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        rlcf->upstream.upstream = ngx_http_redis2_upstream_add(r, &url);[m
[31m-[m
[31m-        if (rlcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                   "redis2: upstream \"%V\" not found", &target);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&u->schema, "redis2://");[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_redis2_module;[m
[31m-[m
[31m-    u->conf = &rlcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_http_redis2_create_request;[m
[31m-    u->reinit_request = ngx_http_redis2_reinit_request;[m
[31m-    u->process_header = ngx_http_redis2_process_header;[m
[31m-    u->abort_request = ngx_http_redis2_abort_request;[m
[31m-    u->finalize_request = ngx_http_redis2_finalize_request;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_redis2_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-    ctx->state = NGX_ERROR;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_redis2_module);[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_redis2_filter_init;[m
[31m-    u->input_filter = ngx_http_redis2_filter;[m
[31m-    u->input_filter_ctx = ctx;[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis2_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_buf_t                       *b;[m
[31m-    ngx_chain_t                     *cl;[m
[31m-    ngx_http_redis2_loc_conf_t      *rlcf;[m
[31m-    ngx_str_t                        query;[m
[31m-    ngx_str_t                        query_count;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_redis2_ctx_t           *ctx;[m
[31m-    ngx_int_t                        n;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_redis2_module);[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis2_module);[m
[31m-[m
[31m-    if (rlcf->queries) {[m
[31m-        ctx->query_count = rlcf->queries->nelts;[m
[31m-[m
[31m-        rc = ngx_http_redis2_build_query(r, rlcf->queries, &b);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-    } else if (rlcf->literal_query.len == 0) {[m
[31m-        if (rlcf->complex_query == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                    "no redis2 query specified or the query is empty");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, rlcf->complex_query, &query)[m
[31m-                != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (query.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                    "the redis query is empty");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rlcf->complex_query_count == NULL) {[m
[31m-            ctx->query_count = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_complex_value(r, rlcf->complex_query_count,[m
[31m-                    &query_count) != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (query_count.len == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                        "the N argument to redis2_raw_queries is empty");[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_atoi(query_count.data, query_count.len);[m
[31m-            if (n == NGX_ERROR || n == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                        "the N argument to redis2_raw_queries is invalid");[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->query_count = n;[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->pool, query.len);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->pos, query.data, query.len);[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->query_count = 1;[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = rlcf->literal_query.data;[m
[31m-        b->last = b->pos + rlcf->literal_query.len;[m
[31m-        b->memory = 1;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http redis2 request: \"%V\"", &rlcf->literal_query);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis2_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis2_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-    ngx_http_redis2_ctx_t       *ctx;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    u_char                       chr;[m
[31m-    ngx_str_t                    buf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (b->last - b->pos < (ssize_t) sizeof(u_char)) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_redis2_module);[m
[31m-[m
[31m-    /* the first char is the response header */[m
[31m-[m
[31m-    chr = *b->pos;[m
[31m-[m
[31m-    dd("response header: %c (ascii %d)", chr, chr);[m
[31m-[m
[31m-    switch (chr) {[m
[31m-        case '+':[m
[31m-        case '-':[m
[31m-        case ':':[m
[31m-        case '$':[m
[31m-        case '*':[m
[31m-            ctx->filter = ngx_http_redis2_process_reply;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            buf.data = b->pos;[m
[31m-            buf.len = b->last - b->pos;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "redis2 sent invalid response: \"%V\"", &buf);[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-    u->state->status = NGX_HTTP_OK;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis2_filter_init(void *data)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_http_redis2_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_redis2_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_redis2_ctx_t  *ctx = data;[m
[31m-[m
[31m-    return ctx->filter(ctx, bytes);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_redis2_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http redis2 request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_redis2_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http redis2 request");[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        r->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_handler.h[m
[1mdeleted file mode 100644[m
[1mindex c238ad1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-#ifndef NGX_HTTP_REDIS2_HANDLER_H[m
[31m-#define NGX_HTTP_REDIS2_HANDLER_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_redis2_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_redis2_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_REDIS2_HANDLER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_module.c[m
[1mdeleted file mode 100644[m
[1mindex cd5bbb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,433 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_redis2_module.h"[m
[31m-#include "ngx_http_redis2_handler.h"[m
[31m-#include "ngx_http_redis2_util.h"[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_redis2_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_redis2_merge_loc_conf(ngx_conf_t *cf,[m
[31m-        void *parent, void *child);[m
[31m-static char *ngx_http_redis2_raw_queries(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-        void *conf);[m
[31m-static char *ngx_http_redis2_query(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-        void *conf);[m
[31m-static char *ngx_http_redis2_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_redis2_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_redis2_commands[] = {[m
[31m-[m
[31m-    { ngx_string("redis2_query"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_redis2_query,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_raw_query"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_redis2_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis2_loc_conf_t, complex_query),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_raw_queries"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_redis2_raw_queries,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_literal_raw_query"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis2_loc_conf_t, literal_query),[m
[31m-      NULL },[m
[31m-[m
[31m-[m
[31m-    { ngx_string("redis2_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_redis2_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis2_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis2_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis2_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis2_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis2_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("redis2_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_redis2_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_redis2_next_upstream_masks },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_redis2_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_redis2_create_loc_conf,    /* create location configration */[m
[31m-    ngx_http_redis2_merge_loc_conf      /* merge location configration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_redis2_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_redis2_module_ctx,        /* module context */[m
[31m-    ngx_http_redis2_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_redis2_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_redis2_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_redis2_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     *     conf->complex_query = NULL;[m
[31m-     *     conf->literal_query = { 0, NULL };[m
[31m-     *     conf->queries = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.ignore_client_abort = 1;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_redis2_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_redis2_loc_conf_t *prev = parent;[m
[31m-    ngx_http_redis2_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.upstream == NULL) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->complex_query == NULL) {[m
[31m-        conf->complex_query = prev->complex_query;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->complex_query_count == NULL) {[m
[31m-        conf->complex_query_count = prev->complex_query_count;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->queries == NULL) {[m
[31m-        conf->queries = prev->queries;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->literal_query.data == NULL) {[m
[31m-        conf->literal_query.data = prev->literal_query.data;[m
[31m-        conf->literal_query.len = prev->literal_query.len;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_redis2_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_redis2_loc_conf_t *rlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_url_t                   url;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    if (rlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_redis2_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-    if (n) {[m
[31m-        rlcf->complex_target = ngx_palloc(cf->pool,[m
[31m-                                          sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        if (rlcf->complex_target == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = rlcf->complex_target;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->complex_target = NULL;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url = value[1];[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    rlcf->upstream.upstream = ngx_http_upstream_add(cf, &url, 0);[m
[31m-    if (rlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_redis2_query(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_redis2_loc_conf_t  *rlcf = conf;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_array_t                **query;[m
[31m-    ngx_uint_t                   n;[m
[31m-    ngx_http_complex_value_t   **arg;[m
[31m-    ngx_uint_t                   i;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    if (rlcf->literal_query.len) {[m
[31m-        return "conflicts with redis2_literal_raw_query";[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->complex_query) {[m
[31m-        return "conflicts with redis2_raw_query";[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->queries == NULL) {[m
[31m-        rlcf->queries = ngx_array_create(cf->pool, 1, sizeof(ngx_array_t *));[m
[31m-[m
[31m-        if (rlcf->queries == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    query = ngx_array_push(rlcf->queries);[m
[31m-    if (query == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = cf->args->nelts - 1;[m
[31m-[m
[31m-    *query = ngx_array_create(cf->pool, n, sizeof(ngx_http_complex_value_t *));[m
[31m-[m
[31m-    if (*query == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i <= n; i++) {[m
[31m-        arg = ngx_array_push(*query);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *arg = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (*arg == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len == 0) {[m
[31m-            ngx_memzero(*arg, sizeof(ngx_http_complex_value_t));[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[i];[m
[31m-        ccv.complex_value = *arg;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_redis2_raw_queries(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_redis2_loc_conf_t  *rlcf = conf;[m
[31m-    ngx_str_t                   *value;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    /* compile the N argument */[m
[31m-[m
[31m-    rlcf->complex_query_count = ngx_palloc(cf->pool,[m
[31m-            sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    if (rlcf->complex_query_count == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = rlcf->complex_query_count;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* compile the CMDS argument */[m
[31m-[m
[31m-    rlcf->complex_query = ngx_palloc(cf->pool,[m
[31m-            sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    if (rlcf->complex_query == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = rlcf->complex_query;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_module.h[m
[1mdeleted file mode 100644[m
[1mindex 54ea656..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-#ifndef NGX_HTTP_REDIS2_MODULE_H[m
[31m-#define NGX_HTTP_REDIS2_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_redis2_module;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-    ngx_str_t                  literal_query; /* for redis2_literal_raw_query */[m
[31m-    ngx_http_complex_value_t  *complex_query; /* for redis2_raw_query */[m
[31m-    ngx_http_complex_value_t  *complex_query_count; /* for redis2_raw_query */[m
[31m-    ngx_http_complex_value_t  *complex_target; /* for redis2_pass */[m
[31m-    ngx_array_t               *queries; /* for redis2_query */[m
[31m-[m
[31m-} ngx_http_redis2_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_redis2_ctx_s  ngx_http_redis2_ctx_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_redis2_filter_handler_ptr)[m
[31m-    (ngx_http_redis2_ctx_t *ctx, ssize_t bytes);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_redis2_ctx_s {[m
[31m-    ngx_int_t                  query_count;[m
[31m-    ngx_http_request_t        *request;[m
[31m-    int                        state;[m
[31m-    size_t                     chunk_size;[m
[31m-    size_t                     chunk_bytes_read;[m
[31m-    size_t                     chunks_read;[m
[31m-    size_t                     chunk_count;[m
[31m-[m
[31m-    ngx_http_redis2_filter_handler_ptr  filter;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_REDIS2_MODULE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.c[m
[1mdeleted file mode 100644[m
[1mindex 78070f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.c[m
[1m+++ /dev/null[m
[36m@@ -1,4168 +0,0 @@[m
[31m-[m
[31m-#line 1 "src/ngx_http_redis2_reply.rl"[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_redis2_reply.h"[m
[31m-#include "ngx_http_redis2_util.h"[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#line 20 "src/ngx_http_redis2_reply.rl"[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 18 "src/ngx_http_redis2_reply.c"[m
[31m-static const int reply_start = 1;[m
[31m-static const int reply_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 23 "src/ngx_http_redis2_reply.rl"[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_redis2_process_reply(ngx_http_redis2_ctx_t *ctx, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_buf_t                *b;[m
[31m-    ngx_http_upstream_t      *u;[m
[31m-    ngx_str_t                 buf;[m
[31m-    ngx_flag_t                done;[m
[31m-    ngx_chain_t              *cl = NULL;[m
[31m-    ngx_chain_t             **ll = NULL;[m
[31m-[m
[31m-    int                       cs;[m
[31m-    signed char              *p;[m
[31m-    signed char              *orig_p;[m
[31m-    ssize_t                   orig_len;[m
[31m-    signed char              *pe;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    orig_p = (signed char *) b->last;[m
[31m-    orig_len = bytes;[m
[31m-[m
[31m-    while (ctx->query_count) {[m
[31m-        done = 0;[m
[31m-[m
[31m-        if (ctx->state == NGX_ERROR) {[m
[31m-            dd("init the state machine");[m
[31m-[m
[31m-            [m
[31m-#line 57 "src/ngx_http_redis2_reply.c"[m
[31m-	{[m
[31m-	cs = reply_start;[m
[31m-	}[m
[31m-[m
[31m-#line 53 "src/ngx_http_redis2_reply.rl"[m
[31m-[m
[31m-            ctx->state = cs;[m
[31m-[m
[31m-        } else {[m
[31m-            cs = ctx->state;[m
[31m-            dd("resumed the old state %d", cs);[m
[31m-        }[m
[31m-[m
[31m-        p  = (signed char *) b->last;[m
[31m-        pe = (signed char *) b->last + bytes;[m
[31m-[m
[31m-        dd("response body: %.*s", (int) bytes, p);[m
[31m-[m
[31m-        [m
[31m-#line 77 "src/ngx_http_redis2_reply.c"[m
[31m-	{[m
[31m-	short _widec;[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 36: goto st2;[m
[31m-		case 42: goto st14;[m
[31m-		case 43: goto st50;[m
[31m-		case 45: goto st50;[m
[31m-		case 58: goto st50;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	switch( (*p) ) {[m
[31m-		case 45: goto st3;[m
[31m-		case 48: goto st6;[m
[31m-	}[m
[31m-	if ( 49 <= (*p) && (*p) <= 57 )[m
[31m-		goto tr6;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st5;[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr9;[m
[31m-	goto st0;[m
[31m-tr9:[m
[31m-#line 50 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunks_read++;[m
[31m-        dd("have read chunk %d, %.*s", (int) ctx->chunks_read,[m
[31m-            (int) (p - (signed char *) b->last), (signed char *) b->last);[m
[31m-    }[m
[31m-#line 12 "src/common.rl"[m
[31m-	{[m
[31m-        dd("done!");[m
[31m-        done = 1;[m
[31m-    }[m
[31m-	goto st52;[m
[31m-tr23:[m
[31m-#line 30 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        dd("finalize multi bulks");[m
[31m-[m
[31m-        if (ctx->chunks_read == ctx->chunk_count) {[m
[31m-            dd("done multi bunlk reading!");[m
[31m-            done = 1;[m
[31m-        }[m
[31m-    }[m
[31m-	goto st52;[m
[31m-tr62:[m
[31m-#line 12 "src/common.rl"[m
[31m-	{[m
[31m-        dd("done!");[m
[31m-        done = 1;[m
[31m-    }[m
[31m-	goto st52;[m
[31m-st52:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof52;[m
[31m-case 52:[m
[31m-#line 165 "src/ngx_http_redis2_reply.c"[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st7;[m
[31m-		case 48: goto st6;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-tr6:[m
[31m-#line 23 "src/common.rl"[m
[31m-	{[m
[31m-        dd("start reading chunk size");[m
[31m-        ctx->chunk_bytes_read = 0;[m
[31m-        ctx->chunk_size = 0;[m
[31m-    }[m
[31m-#line 17 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunk_size *= 10;[m
[31m-        ctx->chunk_size += *p - '0';[m
[31m-        dd("read chunk size: %d", (int) ctx->chunk_size);[m
[31m-    }[m
[31m-	goto st9;[m
[31m-tr13:[m
[31m-#line 17 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunk_size *= 10;[m
[31m-        ctx->chunk_size += *p - '0';[m
[31m-        dd("read chunk size: %d", (int) ctx->chunk_size);[m
[31m-    }[m
[31m-	goto st9;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-#line 216 "src/ngx_http_redis2_reply.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st10;[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto tr13;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	_widec = (*p);[m
[31m-	_widec = (short)(128 + ((*p) - -128));[m
[31m-	if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-	if ( 384 <= _widec && _widec <= 639 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 13 ) {[m
[31m-		if ( (*p) <= 12 ) {[m
[31m-			_widec = (short)(128 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 13 ) {[m
[31m-		if ( 14 <= (*p) )[m
[31m- {			_widec = (short)(128 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(1152 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 1549: goto st12;[m
[31m-		case 1805: goto st5;[m
[31m-		case 2061: goto st13;[m
[31m-	}[m
[31m-	if ( _widec > 524 ) {[m
[31m-		if ( 526 <= _widec && _widec <= 639 )[m
[31m-			goto st12;[m
[31m-	} else if ( _widec >= 384 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 13 ) {[m
[31m-		if ( (*p) <= 12 ) {[m
[31m-			_widec = (short)(128 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 13 ) {[m
[31m-		if ( 14 <= (*p) )[m
[31m- {			_widec = (short)(128 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(1152 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 266: goto tr9;[m
[31m-		case 522: goto tr17;[m
[31m-		case 1549: goto st12;[m
[31m-		case 1805: goto st5;[m
[31m-		case 2061: goto st13;[m
[31m-	}[m
[31m-	if ( _widec > 524 ) {[m
[31m-		if ( 526 <= _widec && _widec <= 639 )[m
[31m-			goto st12;[m
[31m-	} else if ( _widec >= 384 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-tr17:[m
[31m-#line 50 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunks_read++;[m
[31m-        dd("have read chunk %d, %.*s", (int) ctx->chunks_read,[m
[31m-            (int) (p - (signed char *) b->last), (signed char *) b->last);[m
[31m-    }[m
[31m-#line 12 "src/common.rl"[m
[31m-	{[m
[31m-        dd("done!");[m
[31m-        done = 1;[m
[31m-    }[m
[31m-	goto st53;[m
[31m-st53:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof53;[m
[31m-case 53:[m
[31m-#line 394 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 13 ) {[m
[31m-		if ( (*p) <= 12 ) {[m
[31m-			_widec = (short)(128 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 13 ) {[m
[31m-		if ( 14 <= (*p) )[m
[31m- {			_widec = (short)(128 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(1152 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 1549: goto st12;[m
[31m-		case 1805: goto st5;[m
[31m-		case 2061: goto st13;[m
[31m-	}[m
[31m-	if ( _widec > 524 ) {[m
[31m-		if ( 526 <= _widec && _widec <= 639 )[m
[31m-			goto st12;[m
[31m-	} else if ( _widec >= 384 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	switch( (*p) ) {[m
[31m-		case 45: goto st15;[m
[31m-		case 48: goto st18;[m
[31m-	}[m
[31m-	if ( 49 <= (*p) && (*p) <= 57 )[m
[31m-		goto tr20;[m
[31m-	goto st0;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	if ( (*p) == 49 )[m
[31m-		goto st16;[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st17;[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr23;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st17;[m
[31m-		case 48: goto st18;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-tr20:[m
[31m-#line 19 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        dd("start reading bulk count");[m
[31m-        ctx->chunk_count = 0;[m
[31m-    }[m
[31m-#line 24 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        ctx->chunk_count *= 10;[m
[31m-        ctx->chunk_count += *p - '0';[m
[31m-        dd("chunk count: %d", (int) ctx->chunk_count);[m
[31m-    }[m
[31m-	goto st19;[m
[31m-tr25:[m
[31m-#line 24 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        ctx->chunk_count *= 10;[m
[31m-        ctx->chunk_count += *p - '0';[m
[31m-        dd("chunk count: %d", (int) ctx->chunk_count);[m
[31m-    }[m
[31m-	goto st19;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-#line 521 "src/ngx_http_redis2_reply.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st20;[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto tr25;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr26;[m
[31m-	goto st0;[m
[31m-tr26:[m
[31m-#line 14 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        dd("start reading bulk");[m
[31m-        ctx->chunks_read = 0;[m
[31m-    }[m
[31m-	goto st21;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-#line 545 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 43 ) {[m
[31m-		if ( 36 <= (*p) && (*p) <= 36 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 43 ) {[m
[31m-		if ( (*p) > 45 ) {[m
[31m-			if ( 58 <= (*p) && (*p) <= 58 ) {[m
[31m-				_widec = (short)(5248 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 45 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 5668: goto st22;[m
[31m-		case 5675: goto st26;[m
[31m-		case 5677: goto st26;[m
[31m-		case 5690: goto st26;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 48 ) {[m
[31m-		if ( 45 <= (*p) && (*p) <= 45 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 48 ) {[m
[31m-		if ( 49 <= (*p) && (*p) <= 57 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 5677: goto st23;[m
[31m-		case 5680: goto st28;[m
[31m-	}[m
[31m-	if ( 5681 <= _widec && _widec <= 5689 )[m
[31m-		goto tr31;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	_widec = (*p);[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( 5680 <= _widec && _widec <= 5689 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) > 13 ) {[m
[31m-		if ( 48 <= (*p) && (*p) <= 57 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) >= 13 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5645 )[m
[31m-		goto st25;[m
[31m-	if ( 5680 <= _widec && _widec <= 5689 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	_widec = (*p);[m
[31m-	if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5642 )[m
[31m-		goto tr34;[m
[31m-	goto st0;[m
[31m-tr34:[m
[31m-#line 50 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunks_read++;[m
[31m-        dd("have read chunk %d, %.*s", (int) ctx->chunks_read,[m
[31m-            (int) (p - (signed char *) b->last), (signed char *) b->last);[m
[31m-    }[m
[31m-#line 30 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        dd("finalize multi bulks");[m
[31m-[m
[31m-        if (ctx->chunks_read == ctx->chunk_count) {[m
[31m-            dd("done multi bunlk reading!");[m
[31m-            done = 1;[m
[31m-        }[m
[31m-    }[m
[31m-	goto st54;[m
[31m-st54:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof54;[m
[31m-case 54:[m
[31m-#line 751 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 43 ) {[m
[31m-		if ( 36 <= (*p) && (*p) <= 36 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 43 ) {[m
[31m-		if ( (*p) > 45 ) {[m
[31m-			if ( 58 <= (*p) && (*p) <= 58 ) {[m
[31m-				_widec = (short)(5248 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 45 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 5668: goto st22;[m
[31m-		case 5675: goto st26;[m
[31m-		case 5677: goto st26;[m
[31m-		case 5690: goto st26;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 13 ) {[m
[31m-		if ( (*p) <= 12 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 13 ) {[m
[31m-		if ( 14 <= (*p) )[m
[31m- {			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5645 )[m
[31m-		goto st27;[m
[31m-	if ( 5504 <= _widec && _widec <= 5759 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 11 ) {[m
[31m-		if ( (*p) > 9 ) {[m
[31m-			if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-				_widec = (short)(5248 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 12 ) {[m
[31m-		if ( (*p) > 13 ) {[m
[31m-			if ( 14 <= (*p) )[m
[31m- {				_widec = (short)(5248 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 13 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 5642: goto tr34;[m
[31m-		case 5645: goto st27;[m
[31m-	}[m
[31m-	if ( 5504 <= _widec && _widec <= 5759 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) > 13 ) {[m
[31m-		if ( 48 <= (*p) && (*p) <= 48 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) >= 13 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 5645: goto st29;[m
[31m-		case 5680: goto st28;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	_widec = (*p);[m
[31m-	if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5642 )[m
[31m-		goto st30;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	_widec = (*p);[m
[31m-	if ( 13 <= (*p) && (*p) <= 13 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5645 )[m
[31m-		goto st25;[m
[31m-	goto st0;[m
[31m-tr31:[m
[31m-#line 23 "src/common.rl"[m
[31m-	{[m
[31m-        dd("start reading chunk size");[m
[31m-        ctx->chunk_bytes_read = 0;[m
[31m-        ctx->chunk_size = 0;[m
[31m-    }[m
[31m-#line 17 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunk_size *= 10;[m
[31m-        ctx->chunk_size += *p - '0';[m
[31m-        dd("read chunk size: %d", (int) ctx->chunk_size);[m
[31m-    }[m
[31m-	goto st31;[m
[31m-tr39:[m
[31m-#line 17 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunk_size *= 10;[m
[31m-        ctx->chunk_size += *p - '0';[m
[31m-        dd("read chunk size: %d", (int) ctx->chunk_size);[m
[31m-    }[m
[31m-	goto st31;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-#line 1036 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) > 13 ) {[m
[31m-		if ( 48 <= (*p) && (*p) <= 57 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) >= 13 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5645 )[m
[31m-		goto st32;[m
[31m-	if ( 5680 <= _widec && _widec <= 5689 )[m
[31m-		goto tr39;[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	_widec = (*p);[m
[31m-	if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5642 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	_widec = (*p);[m
[31m-	_widec = (short)(2176 + ((*p) - -128));[m
[31m-	if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-	if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	if ( 2944 <= _widec && _widec <= 3199 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 13 ) {[m
[31m-		if ( (*p) <= 12 ) {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 13 ) {[m
[31m-		if ( 14 <= (*p) )[m
[31m- {			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(3200 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 11 ) {[m
[31m-		if ( (*p) > 9 ) {[m
[31m-			if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 12 ) {[m
[31m-		if ( (*p) > 13 ) {[m
[31m-			if ( 14 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 13 ) {[m
[31m-			_widec = (short)(3200 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2826: goto tr34;[m
[31m-		case 3082: goto tr43;[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-tr43:[m
[31m-#line 50 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunks_read++;[m
[31m-        dd("have read chunk %d, %.*s", (int) ctx->chunks_read,[m
[31m-            (int) (p - (signed char *) b->last), (signed char *) b->last);[m
[31m-    }[m
[31m-#line 30 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        dd("finalize multi bulks");[m
[31m-[m
[31m-        if (ctx->chunks_read == ctx->chunk_count) {[m
[31m-            dd("done multi bunlk reading!");[m
[31m-            done = 1;[m
[31m-        }[m
[31m-    }[m
[31m-	goto st55;[m
[31m-st55:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof55;[m
[31m-case 55:[m
[31m-#line 1364 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 43 ) {[m
[31m-		if ( (*p) < 14 ) {[m
[31m-			if ( (*p) > 12 ) {[m
[31m-				if ( 13 <= (*p) && (*p) <= 13 ) {[m
[31m-					_widec = (short)(3200 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-				}[m
[31m-			} else {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) > 35 ) {[m
[31m-			if ( (*p) > 36 ) {[m
[31m-				if ( 37 <= (*p) && (*p) <= 42 ) {[m
[31m-					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 36 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 43 ) {[m
[31m-		if ( (*p) < 46 ) {[m
[31m-			if ( (*p) > 44 ) {[m
[31m-				if ( 45 <= (*p) && (*p) <= 45 ) {[m
[31m-					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 44 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) > 57 ) {[m
[31m-			if ( (*p) > 58 ) {[m
[31m-				if ( 59 <= (*p) )[m
[31m- {					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 58 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2852: goto st22;[m
[31m-		case 2859: goto st26;[m
[31m-		case 2861: goto st26;[m
[31m-		case 2874: goto st26;[m
[31m-		case 3108: goto st36;[m
[31m-		case 3115: goto st44;[m
[31m-		case 3117: goto st44;[m
[31m-		case 3130: goto st44;[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 45 ) {[m
[31m-		if ( (*p) < 13 ) {[m
[31m-			if ( (*p) <= 12 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) > 13 ) {[m
[31m-			if ( 14 <= (*p) && (*p) <= 44 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(3200 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-		}[m
[31m-	} else if ( (*p) > 45 ) {[m
[31m-		if ( (*p) < 48 ) {[m
[31m-			if ( 46 <= (*p) && (*p) <= 47 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) > 48 ) {[m
[31m-			if ( (*p) > 57 ) {[m
[31m-				if ( 58 <= (*p) )[m
[31m- {					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 49 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2861: goto st23;[m
[31m-		case 2864: goto st28;[m
[31m-		case 3117: goto st37;[m
[31m-		case 3120: goto st39;[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec < 3086 ) {[m
[31m-		if ( _widec > 2873 ) {[m
[31m-			if ( 2944 <= _widec && _widec <= 3084 )[m
[31m-				goto st34;[m
[31m-		} else if ( _widec >= 2865 )[m
[31m-			goto tr31;[m
[31m-	} else if ( _widec > 3119 ) {[m
[31m-		if ( _widec > 3129 ) {[m
[31m-			if ( 3130 <= _widec && _widec <= 3199 )[m
[31m-				goto st34;[m
[31m-		} else if ( _widec >= 3121 )[m
[31m-			goto tr46;[m
[31m-	} else[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 14 ) {[m
[31m-		if ( (*p) > 12 ) {[m
[31m-			if ( 13 <= (*p) && (*p) <= 13 ) {[m
[31m-				_widec = (short)(3200 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 47 ) {[m
[31m-		if ( (*p) > 57 ) {[m
[31m-			if ( 58 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 48 ) {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec < 3086 ) {[m
[31m-		if ( _widec > 2873 ) {[m
[31m-			if ( 2944 <= _widec && _widec <= 3084 )[m
[31m-				goto st34;[m
[31m-		} else if ( _widec >= 2864 )[m
[31m-			goto st24;[m
[31m-	} else if ( _widec > 3119 ) {[m
[31m-		if ( _widec > 3129 ) {[m
[31m-			if ( 3130 <= _widec && _widec <= 3199 )[m
[31m-				goto st34;[m
[31m-		} else if ( _widec >= 3120 )[m
[31m-			goto st38;[m
[31m-	} else[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 14 ) {[m
[31m-		if ( (*p) > 12 ) {[m
[31m-			if ( 13 <= (*p) && (*p) <= 13 ) {[m
[31m-				_widec = (short)(3200 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 47 ) {[m
[31m-		if ( (*p) > 57 ) {[m
[31m-			if ( 58 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 48 ) {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 4365: goto st25;[m
[31m-		case 4621: goto st35;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec < 3086 ) {[m
[31m-		if ( _widec > 2873 ) {[m
[31m-			if ( 2944 <= _widec && _widec <= 3084 )[m
[31m-				goto st34;[m
[31m-		} else if ( _widec >= 2864 )[m
[31m-			goto st24;[m
[31m-	} else if ( _widec > 3119 ) {[m
[31m-		if ( _widec > 3129 ) {[m
[31m-			if ( 3130 <= _widec && _widec <= 3199 )[m
[31m-				goto st34;[m
[31m-		} else if ( _widec >= 3120 )[m
[31m-			goto st38;[m
[31m-	} else[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 14 ) {[m
[31m-		if ( (*p) > 12 ) {[m
[31m-			if ( 13 <= (*p) && (*p) <= 13 ) {[m
[31m-				_widec = (short)(3200 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 47 ) {[m
[31m-		if ( (*p) > 48 ) {[m
[31m-			if ( 49 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 48 ) {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2864: goto st28;[m
[31m-		case 3120: goto st39;[m
[31m-		case 4365: goto st29;[m
[31m-		case 4621: goto st40;[m
[31m-		case 4877: goto st42;[m
[31m-		case 5133: goto st43;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 11 ) {[m
[31m-		if ( (*p) > 9 ) {[m
[31m-			if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 12 ) {[m
[31m-		if ( (*p) > 13 ) {[m
[31m-			if ( 14 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 13 ) {[m
[31m-			_widec = (short)(3200 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2826: goto st30;[m
[31m-		case 3082: goto st41;[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st41:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof41;[m
[31m-case 41:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 13 ) {[m
[31m-		if ( (*p) <= 12 ) {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 13 ) {[m
[31m-		if ( 14 <= (*p) )[m
[31m- {			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(3200 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 4365: goto st25;[m
[31m-		case 4621: goto st35;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st42:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof42;[m
[31m-case 42:[m
[31m-	_widec = (*p);[m
[31m-	if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5642 )[m
[31m-		goto tr52;[m
[31m-	goto st0;[m
[31m-tr52:[m
[31m-#line 50 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunks_read++;[m
[31m-        dd("have read chunk %d, %.*s", (int) ctx->chunks_read,[m
[31m-            (int) (p - (signed char *) b->last), (signed char *) b->last);[m
[31m-    }[m
[31m-#line 30 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        dd("finalize multi bulks");[m
[31m-[m
[31m-        if (ctx->chunks_read == ctx->chunk_count) {[m
[31m-            dd("done multi bunlk reading!");[m
[31m-            done = 1;[m
[31m-        }[m
[31m-    }[m
[31m-	goto st56;[m
[31m-st56:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof56;[m
[31m-case 56:[m
[31m-#line 2547 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 43 ) {[m
[31m-		if ( (*p) > 13 ) {[m
[31m-			if ( 36 <= (*p) && (*p) <= 36 ) {[m
[31m-				_widec = (short)(5248 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 13 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else if ( (*p) > 43 ) {[m
[31m-		if ( (*p) > 45 ) {[m
[31m-			if ( 58 <= (*p) && (*p) <= 58 ) {[m
[31m-				_widec = (short)(5248 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 45 ) {[m
[31m-			_widec = (short)(5248 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 5645: goto st25;[m
[31m-		case 5668: goto st22;[m
[31m-		case 5675: goto st26;[m
[31m-		case 5677: goto st26;[m
[31m-		case 5690: goto st26;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st43:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof43;[m
[31m-case 43:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 11 ) {[m
[31m-		if ( (*p) > 9 ) {[m
[31m-			if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 12 ) {[m
[31m-		if ( (*p) > 13 ) {[m
[31m-			if ( 14 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 13 ) {[m
[31m-			_widec = (short)(3200 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2826: goto tr52;[m
[31m-		case 3082: goto tr53;[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-tr53:[m
[31m-#line 50 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunks_read++;[m
[31m-        dd("have read chunk %d, %.*s", (int) ctx->chunks_read,[m
[31m-            (int) (p - (signed char *) b->last), (signed char *) b->last);[m
[31m-    }[m
[31m-#line 30 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        dd("finalize multi bulks");[m
[31m-[m
[31m-        if (ctx->chunks_read == ctx->chunk_count) {[m
[31m-            dd("done multi bunlk reading!");[m
[31m-            done = 1;[m
[31m-        }[m
[31m-    }[m
[31m-	goto st57;[m
[31m-st57:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof57;[m
[31m-case 57:[m
[31m-#line 2779 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 43 ) {[m
[31m-		if ( (*p) < 14 ) {[m
[31m-			if ( (*p) > 12 ) {[m
[31m-				if ( 13 <= (*p) && (*p) <= 13 ) {[m
[31m-					_widec = (short)(3200 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-				}[m
[31m-			} else {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) > 35 ) {[m
[31m-			if ( (*p) > 36 ) {[m
[31m-				if ( 37 <= (*p) && (*p) <= 42 ) {[m
[31m-					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 36 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 43 ) {[m
[31m-		if ( (*p) < 46 ) {[m
[31m-			if ( (*p) > 44 ) {[m
[31m-				if ( 45 <= (*p) && (*p) <= 45 ) {[m
[31m-					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 44 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) > 57 ) {[m
[31m-			if ( (*p) > 58 ) {[m
[31m-				if ( 59 <= (*p) )[m
[31m- {					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 58 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2852: goto st22;[m
[31m-		case 2859: goto st26;[m
[31m-		case 2861: goto st26;[m
[31m-		case 2874: goto st26;[m
[31m-		case 3108: goto st36;[m
[31m-		case 3115: goto st44;[m
[31m-		case 3117: goto st44;[m
[31m-		case 3130: goto st44;[m
[31m-		case 4365: goto st25;[m
[31m-		case 4621: goto st35;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st44:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof44;[m
[31m-case 44:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 13 ) {[m
[31m-		if ( (*p) <= 12 ) {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 13 ) {[m
[31m-		if ( 14 <= (*p) )[m
[31m- {			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(3200 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 4365: goto st27;[m
[31m-		case 4621: goto st45;[m
[31m-		case 4877: goto st27;[m
[31m-		case 5133: goto st45;[m
[31m-	}[m
[31m-	if ( _widec < 2830 ) {[m
[31m-		if ( 2688 <= _widec && _widec <= 2828 )[m
[31m-			goto st26;[m
[31m-	} else if ( _widec > 2943 ) {[m
[31m-		if ( _widec > 3084 ) {[m
[31m-			if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-				goto st44;[m
[31m-		} else if ( _widec >= 2944 )[m
[31m-			goto st44;[m
[31m-	} else[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st45:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof45;[m
[31m-case 45:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 11 ) {[m
[31m-		if ( (*p) > 9 ) {[m
[31m-			if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 12 ) {[m
[31m-		if ( (*p) > 13 ) {[m
[31m-			if ( 14 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 13 ) {[m
[31m-			_widec = (short)(3200 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2826: goto tr34;[m
[31m-		case 3082: goto tr43;[m
[31m-		case 4365: goto st27;[m
[31m-		case 4621: goto st45;[m
[31m-		case 4877: goto st27;[m
[31m-		case 5133: goto st45;[m
[31m-	}[m
[31m-	if ( _widec < 2830 ) {[m
[31m-		if ( 2688 <= _widec && _widec <= 2828 )[m
[31m-			goto st26;[m
[31m-	} else if ( _widec > 2943 ) {[m
[31m-		if ( _widec > 3084 ) {[m
[31m-			if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-				goto st44;[m
[31m-		} else if ( _widec >= 2944 )[m
[31m-			goto st44;[m
[31m-	} else[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-tr46:[m
[31m-#line 23 "src/common.rl"[m
[31m-	{[m
[31m-        dd("start reading chunk size");[m
[31m-        ctx->chunk_bytes_read = 0;[m
[31m-        ctx->chunk_size = 0;[m
[31m-    }[m
[31m-#line 17 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunk_size *= 10;[m
[31m-        ctx->chunk_size += *p - '0';[m
[31m-        dd("read chunk size: %d", (int) ctx->chunk_size);[m
[31m-    }[m
[31m-	goto st46;[m
[31m-tr56:[m
[31m-#line 17 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunk_size *= 10;[m
[31m-        ctx->chunk_size += *p - '0';[m
[31m-        dd("read chunk size: %d", (int) ctx->chunk_size);[m
[31m-    }[m
[31m-	goto st46;[m
[31m-st46:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof46;[m
[31m-case 46:[m
[31m-#line 3320 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 14 ) {[m
[31m-		if ( (*p) > 12 ) {[m
[31m-			if ( 13 <= (*p) && (*p) <= 13 ) {[m
[31m-				_widec = (short)(3200 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 47 ) {[m
[31m-		if ( (*p) > 57 ) {[m
[31m-			if ( 58 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 48 ) {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 4365: goto st32;[m
[31m-		case 4621: goto st47;[m
[31m-		case 4877: goto st48;[m
[31m-		case 5133: goto st49;[m
[31m-	}[m
[31m-	if ( _widec < 3086 ) {[m
[31m-		if ( _widec > 2873 ) {[m
[31m-			if ( 2944 <= _widec && _widec <= 3084 )[m
[31m-				goto st34;[m
[31m-		} else if ( _widec >= 2864 )[m
[31m-			goto tr39;[m
[31m-	} else if ( _widec > 3119 ) {[m
[31m-		if ( _widec > 3129 ) {[m
[31m-			if ( 3130 <= _widec && _widec <= 3199 )[m
[31m-				goto st34;[m
[31m-		} else if ( _widec >= 3120 )[m
[31m-			goto tr56;[m
[31m-	} else[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st47:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof47;[m
[31m-case 47:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 11 ) {[m
[31m-		if ( (*p) > 9 ) {[m
[31m-			if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 12 ) {[m
[31m-		if ( (*p) > 13 ) {[m
[31m-			if ( 14 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 13 ) {[m
[31m-			_widec = (short)(3200 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2826: goto st33;[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st48:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof48;[m
[31m-case 48:[m
[31m-	_widec = (*p);[m
[31m-	if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-		_widec = (short)(5248 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 256;[m
[31m-	}[m
[31m-	if ( _widec == 5642 )[m
[31m-		goto tr60;[m
[31m-	goto st0;[m
[31m-tr60:[m
[31m-#line 50 "src/common.rl"[m
[31m-	{[m
[31m-        ctx->chunks_read++;[m
[31m-        dd("have read chunk %d, %.*s", (int) ctx->chunks_read,[m
[31m-            (int) (p - (signed char *) b->last), (signed char *) b->last);[m
[31m-    }[m
[31m-#line 30 "src/multi_bulk_reply.rl"[m
[31m-	{[m
[31m-        dd("finalize multi bulks");[m
[31m-[m
[31m-        if (ctx->chunks_read == ctx->chunk_count) {[m
[31m-            dd("done multi bunlk reading!");[m
[31m-            done = 1;[m
[31m-        }[m
[31m-    }[m
[31m-	goto st58;[m
[31m-st58:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof58;[m
[31m-case 58:[m
[31m-#line 3639 "src/ngx_http_redis2_reply.c"[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 44 ) {[m
[31m-		if ( (*p) < 36 ) {[m
[31m-			if ( (*p) <= 35 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) > 36 ) {[m
[31m-			if ( (*p) > 42 ) {[m
[31m-				if ( 43 <= (*p) && (*p) <= 43 ) {[m
[31m-					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 37 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 44 ) {[m
[31m-		if ( (*p) < 46 ) {[m
[31m-			if ( 45 <= (*p) && (*p) <= 45 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) > 57 ) {[m
[31m-			if ( (*p) > 58 ) {[m
[31m-				if ( 59 <= (*p) )[m
[31m- {					_widec = (short)(2176 + ((*p) - -128));[m
[31m-					if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-					if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-				}[m
[31m-			} else if ( (*p) >= 58 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2852: goto st22;[m
[31m-		case 2859: goto st26;[m
[31m-		case 2861: goto st26;[m
[31m-		case 2874: goto st26;[m
[31m-		case 3108: goto st36;[m
[31m-		case 3115: goto st44;[m
[31m-		case 3117: goto st44;[m
[31m-		case 3130: goto st44;[m
[31m-	}[m
[31m-	if ( 2944 <= _widec && _widec <= 3199 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st49:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof49;[m
[31m-case 49:[m
[31m-	_widec = (*p);[m
[31m-	if ( (*p) < 11 ) {[m
[31m-		if ( (*p) > 9 ) {[m
[31m-			if ( 10 <= (*p) && (*p) <= 10 ) {[m
[31m-				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else {[m
[31m-			_widec = (short)(2176 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-		}[m
[31m-	} else if ( (*p) > 12 ) {[m
[31m-		if ( (*p) > 13 ) {[m
[31m-			if ( 14 <= (*p) )[m
[31m- {				_widec = (short)(2176 + ((*p) - -128));[m
[31m-				if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-				if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-			}[m
[31m-		} else if ( (*p) >= 13 ) {[m
[31m-			_widec = (short)(3200 + ((*p) - -128));[m
[31m-			if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-			if ( [m
[31m-#line 56 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr,[m
[31m-            "check_data_complete: chunk bytes read: %d, chunk size: %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read == ctx->chunk_size + 1[m
[31m-     ) _widec += 512;[m
[31m-			if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 1024;[m
[31m-		}[m
[31m-	} else {[m
[31m-		_widec = (short)(2176 + ((*p) - -128));[m
[31m-		if ( [m
[31m-#line 34 "src/common.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk len: %d < %d\n",[m
[31m-            (int) ctx->chunk_bytes_read, (int) ctx->chunk_size),[m
[31m-#endif[m
[31m-        ctx->chunk_bytes_read++ < ctx->chunk_size[m
[31m-     ) _widec += 256;[m
[31m-		if ( [m
[31m-#line 6 "src/multi_bulk_reply.rl"[m
[31m-[m
[31m-#if 0[m
[31m-        fprintf(stderr, "test chunk count: %d < %d\n",[m
[31m-            (int) ctx->chunks_read, (int) ctx->chunk_count),[m
[31m-#endif[m
[31m-        ctx->chunks_read < ctx->chunk_count[m
[31m-     ) _widec += 512;[m
[31m-	}[m
[31m-	switch( _widec ) {[m
[31m-		case 2826: goto tr60;[m
[31m-		case 3082: goto tr43;[m
[31m-		case 4621: goto st34;[m
[31m-		case 4877: goto st25;[m
[31m-		case 5133: goto st35;[m
[31m-	}[m
[31m-	if ( _widec > 3084 ) {[m
[31m-		if ( 3086 <= _widec && _widec <= 3199 )[m
[31m-			goto st34;[m
[31m-	} else if ( _widec >= 2944 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st50:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof50;[m
[31m-case 50:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st51;[m
[31m-	goto st50;[m
[31m-st51:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof51;[m
[31m-case 51:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr62;[m
[31m-		case 13: goto st51;[m
[31m-	}[m
[31m-	goto st50;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof52: cs = 52; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof53: cs = 53; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof54: cs = 54; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof55: cs = 55; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof41: cs = 41; goto _test_eof; [m
[31m-	_test_eof42: cs = 42; goto _test_eof; [m
[31m-	_test_eof56: cs = 56; goto _test_eof; [m
[31m-	_test_eof43: cs = 43; goto _test_eof; [m
[31m-	_test_eof57: cs = 57; goto _test_eof; [m
[31m-	_test_eof44: cs = 44; goto _test_eof; [m
[31m-	_test_eof45: cs = 45; goto _test_eof; [m
[31m-	_test_eof46: cs = 46; goto _test_eof; [m
[31m-	_test_eof47: cs = 47; goto _test_eof; [m
[31m-	_test_eof48: cs = 48; goto _test_eof; [m
[31m-	_test_eof58: cs = 58; goto _test_eof; [m
[31m-	_test_eof49: cs = 49; goto _test_eof; [m
[31m-	_test_eof50: cs = 50; goto _test_eof; [m
[31m-	_test_eof51: cs = 51; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 67 "src/ngx_http_redis2_reply.rl"[m
[31m-[m
[31m-        dd("state after exec: %d, done: %d, %.*s", cs, (int) done,[m
[31m-            (int) (bytes - ((u_char *) p - b->last)), p);[m
[31m-[m
[31m-        ctx->state = cs;[m
[31m-[m
[31m-        if (!done && cs == reply_error) {[m
[31m-            if (cl) {[m
[31m-                cl->buf->last = cl->buf->pos;[m
[31m-                cl = NULL;[m
[31m-                *ll = NULL;[m
[31m-            }[m
[31m-[m
[31m-            buf.data = b->pos;[m
[31m-            buf.len = b->last - b->pos + bytes;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                "Redis server returned invalid response near pos %z in "[m
[31m-                "\"%V\"",[m
[31m-                    (ssize_t) ((u_char *) p - b->pos), &buf);[m
[31m-[m
[31m-            u->length = 0;[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cl == NULL) {[m
[31m-            for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-                ll = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-            if (cl == NULL) {[m
[31m-                u->length = 0;[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->flush = 1;[m
[31m-            cl->buf->memory = 1;[m
[31m-[m
[31m-            *ll = cl;[m
[31m-[m
[31m-            dd("response body: %.*s", (int) bytes, p);[m
[31m-[m
[31m-            cl->buf->pos = b->last;[m
[31m-            cl->buf->last = (u_char *) p;[m
[31m-            cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf->last = (u_char *) p;[m
[31m-        }[m
[31m-[m
[31m-        bytes -= (ssize_t) ((u_char *) p - b->last);[m
[31m-        b->last = (u_char *) p;[m
[31m-[m
[31m-        if (done) {[m
[31m-            dd("response parser done");[m
[31m-[m
[31m-            ctx->query_count--;[m
[31m-[m
[31m-            if (ctx->query_count == 0) {[m
[31m-                if (cs == reply_error) {[m
[31m-                    buf.data = (u_char *) p;[m
[31m-                    buf.len = orig_p - p + orig_len;[m
[31m-[m
[31m-                    ngx_log_error(NGX_LOG_WARN, ctx->request->connection->log,[m
[31m-                        0, "Redis server returned extra bytes: \"%V\" (len %z)",[m
[31m-                        &buf, buf.len);[m
[31m-[m
[31m-#if 0[m
[31m-                    if (cl) {[m
[31m-                        cl->buf->last = cl->buf->pos;[m
[31m-                        cl = NULL;[m
[31m-                        *ll = NULL;[m
[31m-                    }[m
[31m-[m
[31m-                    u->length = 0;[m
[31m-[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-                } else {[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-                    u->keepalive = 1;[m
[31m-#endif[m
[31m-                }[m
[31m-[m
[31m-                u->length = 0;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->state = NGX_ERROR;[m
[31m-                /* continue */[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* need more data */[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.h[m
[1mdeleted file mode 100644[m
[1mindex ee2d664..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef NGX_HTTP_REDIS2_REPLY_H[m
[31m-#define NGX_HTTP_REDIS2_REPLY_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_redis2_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_redis2_process_reply([m
[31m-        ngx_http_redis2_ctx_t *ctx, ssize_t bytes);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_REDIS2_REPLY_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.rl[m
[1mdeleted file mode 100644[m
[1mindex 82f7c00..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_reply.rl[m
[1m+++ /dev/null[m
[36m@@ -1,170 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_redis2_reply.h"[m
[31m-#include "ngx_http_redis2_util.h"[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-%%{[m
[31m-    machine reply;[m
[31m-[m
[31m-    include multi_bulk_reply "multi_bulk_reply.rl";[m
[31m-[m
[31m-    main := single_line_reply @finalize[m
[31m-          | chunk @finalize[m
[31m-          | multi_bulk_reply[m
[31m-          ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[31m-%% write data;[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_redis2_process_reply(ngx_http_redis2_ctx_t *ctx, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_buf_t                *b;[m
[31m-    ngx_http_upstream_t      *u;[m
[31m-    ngx_str_t                 buf;[m
[31m-    ngx_flag_t                done;[m
[31m-    ngx_chain_t              *cl = NULL;[m
[31m-    ngx_chain_t             **ll = NULL;[m
[31m-[m
[31m-    int                       cs;[m
[31m-    signed char              *p;[m
[31m-    signed char              *orig_p;[m
[31m-    ssize_t                   orig_len;[m
[31m-    signed char              *pe;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    orig_p = (signed char *) b->last;[m
[31m-    orig_len = bytes;[m
[31m-[m
[31m-    while (ctx->query_count) {[m
[31m-        done = 0;[m
[31m-[m
[31m-        if (ctx->state == NGX_ERROR) {[m
[31m-            dd("init the state machine");[m
[31m-[m
[31m-            %% write init;[m
[31m-[m
[31m-            ctx->state = cs;[m
[31m-[m
[31m-        } else {[m
[31m-            cs = ctx->state;[m
[31m-            dd("resumed the old state %d", cs);[m
[31m-        }[m
[31m-[m
[31m-        p  = (signed char *) b->last;[m
[31m-        pe = (signed char *) b->last + bytes;[m
[31m-[m
[31m-        dd("response body: %.*s", (int) bytes, p);[m
[31m-[m
[31m-        %% write exec;[m
[31m-[m
[31m-        dd("state after exec: %d, done: %d, %.*s", cs, (int) done,[m
[31m-            (int) (bytes - ((u_char *) p - b->last)), p);[m
[31m-[m
[31m-        ctx->state = cs;[m
[31m-[m
[31m-        if (!done && cs == reply_error) {[m
[31m-            if (cl) {[m
[31m-                cl->buf->last = cl->buf->pos;[m
[31m-                cl = NULL;[m
[31m-                *ll = NULL;[m
[31m-            }[m
[31m-[m
[31m-            buf.data = b->pos;[m
[31m-            buf.len = b->last - b->pos + bytes;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                "Redis server returned invalid response near pos %z in "[m
[31m-                "\"%V\"",[m
[31m-                    (ssize_t) ((u_char *) p - b->pos), &buf);[m
[31m-[m
[31m-            u->length = 0;[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cl == NULL) {[m
[31m-            for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-                ll = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-            if (cl == NULL) {[m
[31m-                u->length = 0;[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->flush = 1;[m
[31m-            cl->buf->memory = 1;[m
[31m-[m
[31m-            *ll = cl;[m
[31m-[m
[31m-            dd("response body: %.*s", (int) bytes, p);[m
[31m-[m
[31m-            cl->buf->pos = b->last;[m
[31m-            cl->buf->last = (u_char *) p;[m
[31m-            cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf->last = (u_char *) p;[m
[31m-        }[m
[31m-[m
[31m-        bytes -= (ssize_t) ((u_char *) p - b->last);[m
[31m-        b->last = (u_char *) p;[m
[31m-[m
[31m-        if (done) {[m
[31m-            dd("response parser done");[m
[31m-[m
[31m-            ctx->query_count--;[m
[31m-[m
[31m-            if (ctx->query_count == 0) {[m
[31m-                if (cs == reply_error) {[m
[31m-                    buf.data = (u_char *) p;[m
[31m-                    buf.len = orig_p - p + orig_len;[m
[31m-[m
[31m-                    ngx_log_error(NGX_LOG_WARN, ctx->request->connection->log,[m
[31m-                        0, "Redis server returned extra bytes: \"%V\" (len %z)",[m
[31m-                        &buf, buf.len);[m
[31m-[m
[31m-#if 0[m
[31m-                    if (cl) {[m
[31m-                        cl->buf->last = cl->buf->pos;[m
[31m-                        cl = NULL;[m
[31m-                        *ll = NULL;[m
[31m-                    }[m
[31m-[m
[31m-                    u->length = 0;[m
[31m-[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-                } else {[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-                    u->keepalive = 1;[m
[31m-#endif[m
[31m-                }[m
[31m-[m
[31m-                u->length = 0;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->state = NGX_ERROR;[m
[31m-                /* continue */[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* need more data */[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_util.c[m
[1mdeleted file mode 100644[m
[1mindex d7a34d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,214 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_redis2_util.h"[m
[31m-[m
[31m-[m
[31m-static size_t ngx_get_num_size(uint64_t i);[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_redis2_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char                             *p = conf;[m
[31m-    ngx_http_complex_value_t        **field;[m
[31m-    ngx_str_t                        *value;[m
[31m-    ngx_http_compile_complex_value_t  ccv;[m
[31m-[m
[31m-    field = (ngx_http_complex_value_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*field) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *field = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-    if (*field == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_memzero(*field, sizeof(ngx_http_complex_value_t));[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = *field;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_redis2_upstream_add(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_uint_t                      i;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != url->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-               url->host.len) != 0)[m
[31m-        {[m
[31m-            dd("upstream_add: host not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            dd("upstream_add: port not match: %d != %d",[m
[31m-                    (int) uscfp[i]->port, (int) url->port);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port[m
[31m-            && url->default_port[m
[31m-            && uscfp[i]->default_port != url->default_port)[m
[31m-        {[m
[31m-            dd("upstream_add: default_port not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    dd("no upstream found: %.*s", (int) url->host.len, url->host.data);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_get_num_size(uint64_t i)[m
[31m-{[m
[31m-    size_t          n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        i = i / 10;[m
[31m-        n++;[m
[31m-    } while (i > 0);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_redis2_build_query(ngx_http_request_t *r, ngx_array_t *queries,[m
[31m-    ngx_buf_t **b)[m
[31m-{[m
[31m-    ngx_uint_t                       i, j;[m
[31m-    ngx_uint_t                       n;[m
[31m-    ngx_str_t                       *arg;[m
[31m-    ngx_array_t                     *args;[m
[31m-    size_t                           len;[m
[31m-    ngx_array_t                    **query_args;[m
[31m-    ngx_http_complex_value_t       **complex_arg;[m
[31m-    u_char                          *p;[m
[31m-    ngx_http_redis2_loc_conf_t      *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis2_module);[m
[31m-[m
[31m-    query_args = rlcf->queries->elts;[m
[31m-[m
[31m-    n = 0;[m
[31m-    for (i = 0; i < rlcf->queries->nelts; i++) {[m
[31m-        for (j = 0; j < query_args[i]->nelts; j++) {[m
[31m-            n++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    args = ngx_array_create(r->pool, n, sizeof(ngx_str_t));[m
[31m-[m
[31m-    if (args == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < rlcf->queries->nelts; i++) {[m
[31m-        complex_arg = query_args[i]->elts;[m
[31m-[m
[31m-        len += sizeof("*") - 1[m
[31m-             + ngx_get_num_size(query_args[i]->nelts)[m
[31m-             + sizeof("\r\n") - 1[m
[31m-             ;[m
[31m-[m
[31m-        for (j = 0; j < query_args[i]->nelts; j++) {[m
[31m-            n++;[m
[31m-[m
[31m-            arg = ngx_array_push(args);[m
[31m-            if (arg == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_complex_value(r, complex_arg[j], arg) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len += sizeof("$") - 1[m
[31m-                 + ngx_get_num_size(arg->len)[m
[31m-                 + sizeof("\r\n") - 1[m
[31m-                 + arg->len[m
[31m-                 + sizeof("\r\n") - 1[m
[31m-                 ;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (*b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = (*b)->last;[m
[31m-[m
[31m-    arg = args->elts;[m
[31m-[m
[31m-    n = 0;[m
[31m-    for (i = 0; i < rlcf->queries->nelts; i++) {[m
[31m-        *p++ = '*';[m
[31m-        p = ngx_sprintf(p, "%uz", query_args[i]->nelts);[m
[31m-        *p++ = '\r'; *p++ = '\n';[m
[31m-[m
[31m-        for (j = 0; j < query_args[i]->nelts; j++) {[m
[31m-            *p++ = '$';[m
[31m-            p = ngx_sprintf(p, "%uz", arg[n].len);[m
[31m-            *p++ = '\r'; *p++ = '\n';[m
[31m-            p = ngx_copy(p, arg[n].data, arg[n].len);[m
[31m-            *p++ = '\r'; *p++ = '\n';[m
[31m-[m
[31m-            n++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("query: %.*s", (int) (p - (*b)->pos), (*b)->pos);[m
[31m-[m
[31m-    if (p - (*b)->pos != (ssize_t) len) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                "redis2: redis2_query buffer error %uz != %uz",[m
[31m-                (size_t) (p - (*b)->pos), len);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (*b)->last = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_util.h[m
[1mdeleted file mode 100644[m
[1mindex 069aadb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/src/ngx_http_redis2_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-#ifndef NGX_HTTP_REDIS2_UTIL_H[m
[31m-#define NGX_HTTP_REDIS2_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_redis2_module.h"[m
[31m-[m
[31m-[m
[31m-#ifndef ngx_str_set[m
[31m-#define ngx_str_set(str, text)                                               \[m
[31m-    (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-char *ngx_http_redis2_set_complex_value_slot(ngx_conf_t *cf,[m
[31m-        ngx_command_t *cmd, void *conf);[m
[31m-ngx_http_upstream_srv_conf_t *ngx_http_redis2_upstream_add([m
[31m-        ngx_http_request_t *r, ngx_url_t *url);[m
[31m-ngx_int_t ngx_http_redis2_build_query(ngx_http_request_t *r,[m
[31m-        ngx_array_t *queries, ngx_buf_t **b);[m
[31m-[m
[31m-#endif /* NGX_HTTP_REDIS2_UTIL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 56cc88e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#master_on;[m
[31m-#worker_connections 1024;[m
[31m-[m
[31m-#no_diff;[m
[31m-no_long_string;[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: 0 in bulk size[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query set 'counters::stats::list' '[["mafiaclans.eu", 12], ["picfu.net", 5], ["www.test.com", 0], ["www.ayom.com", 0], ["www.21dezember2012.org", 0], ["the-indie.ch", 0], ["spiele-check.de", 0], ["online-right-now.net", 0], ["google.com", 0]]';[m
[31m-[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /get {[m
[31m-        redis2_raw_query 'get counters::stats::list\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main2 {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/set");[m
[31m-            ngx.print(res.body)[m
[31m-            res = ngx.location.capture("/get");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        # echo_location is buggy...sigh.[m
[31m-        echo_location /set;[m
[31m-        echo_location /get;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main2[m
[31m---- response_body eval[m
[31m-qq{+OK\r[m
[31m-\$207\r[m
[31m-[["mafiaclans.eu", 12], ["picfu.net", 5], ["www.test.com", 0], ["www.ayom.com", 0], ["www.21dezember2012.org", 0], ["the-indie.ch", 0], ["spiele-check.de", 0], ["online-right-now.net", 0], ["google.com", 0]]\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: "0" digit in bulk count number[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query set a hello;[m
[31m-[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /get {[m
[31m-        redis2_query mget a a a a a a a a a a;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/set");[m
[31m-            ngx.print(res.body)[m
[31m-            res = ngx.location.capture("/get");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-qq{+OK\r[m
[31m-\*10\r[m
[31m-} . "\$5\r[m
[31m-hello\r[m
[31m-" x 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: zero bulk count[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query flushall;[m
[31m-[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /get {[m
[31m-        redis2_query lrange blah 0 0;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/set");[m
[31m-            ngx.print(res.body)[m
[31m-            res = ngx.location.capture("/get");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-qq{+OK\r[m
[31m-\*0\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: \r\n in content: sanity check[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query set A 'hello\r\nworld';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /get {[m
[31m-        redis2_query get A;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/set");[m
[31m-            ngx.print(res.body)[m
[31m-            res = ngx.location.capture("/get");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-qq{+OK\r[m
[31m-\$12\r[m
[31m-hello\r[m
[31m-world\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: github issue #5: Get content from Redis with "\r\n" in text fails with "Redis server returned extra bytes[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query flushall;[m
[31m-        redis2_query hset "/step2redisallhget?auctionid=2l" "content" "a 1line \r\n and 2nd";[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /get {[m
[31m-        redis2_query hget "/step2redisallhget?auctionid=2l" "content";[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/set");[m
[31m-            ngx.print(res.body)[m
[31m-            res = ngx.location.capture("/get");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-qq{+OK\r[m
[31m-:1\r[m
[31m-\$18\r\na 1line \r\n and 2nd\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set empty param[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query flushall;[m
[31m-        redis2_query set foo "";[m
[31m-        redis2_query get foo;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /set[m
[31m---- response_body eval[m
[31m-qq{+OK\r[m
[31m-+OK\r[m
[31m-\$0\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: two pipelined multi-bulk replies[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query subscribe foo;[m
[31m-        redis2_query unsubscribe foo;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /set[m
[31m---- response_body eval[m
[31m-qq{*3\r[m
[31m-\$9\r[m
[31m-subscribe\r[m
[31m-\$3\r[m
[31m-foo\r[m
[31m-:1\r[m
[31m-*3\r[m
[31m-\$11\r[m
[31m-unsubscribe\r[m
[31m-\$3\r[m
[31m-foo\r[m
[31m-:0\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty multi-bulk replies[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query flushall;[m
[31m-        redis2_query blpop key 1;[m
[31m-        redis2_query set key 3;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /set[m
[31m---- response_body eval[m
[31m-qq{+OK\r[m
[31m-*-1\r[m
[31m-+OK\r[m
[31m-}[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex 17a8721..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,102 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11984;[m
[31m-$ENV{LUA_CPATH} ||= '/home/lz/luax/?.so';[m
[31m-[m
[31m-#master_on;[m
[31m-#worker_connections 1024;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no subrequest in memory[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        eval_override_content_type 'application/octet-stream';[m
[31m-        eval_subrequest_in_memory off;[m
[31m-        eval $res {[m
[31m-            redis2_query set one first;[m
[31m-            redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-        }[m
[31m-        echo [$res];[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: ^\[\+OK\r\n\]$[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: subrequest in memory[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        eval_override_content_type 'application/octet-stream';[m
[31m-        eval_subrequest_in_memory on;[m
[31m-        eval $res {[m
[31m-            #redis2_literal_raw_query 'set one 5\r\nfirst\r\n';[m
[31m-            #redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-            set $memcached_key foo;[m
[31m-            memcached_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        }[m
[31m-        echo [$res];[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: ^\[\+OK\r\n\]$[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: subrequest in memory[m
[31m---- config[m
[31m-    location = /redis {[m
[31m-        internal;[m
[31m-        redis2_query get $query_string;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/([a-zA-Z0-9]+)$ {[m
[31m-        set $path $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local resp = ngx.location.capture("/redis",[m
[31m-                { args = ngx.var.path })[m
[31m-[m
[31m-            if resp.status ~= ngx.HTTP_OK then[m
[31m-                return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-            end[m
[31m-[m
[31m-            local parser = require("redis.parser")[m
[31m-            local res, rc = parser.parse_reply(resp.body)[m
[31m-            -- print("rc = ", rc, " ", parser.BULK_REPLY)[m
[31m-            if rc ~= parser.BULK_REPLY then[m
[31m-                return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-            end[m
[31m-[m
[31m-            print("res = ", res)[m
[31m-[m
[31m-            -- ngx.print(ngx.var.path)[m
[31m-            return ngx.redirect(res)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-     }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers_like[m
[31m-Location: http://[^/]+/hello/world[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/if.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/if.t[m
[1mdeleted file mode 100644[m
[1mindex 2169b67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/if.t[m
[1m+++ /dev/null[m
[36m@@ -1,93 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#master_on;[m
[31m-#worker_connections 1024;[m
[31m-[m
[31m-#no_diff;[m
[31m-no_long_string;[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: location if (query)[m
[31m---- config[m
[31m-    location /redis {[m
[31m-        set $key 'default';[m
[31m-        if ($uri ~ "(special.*)") {[m
[31m-            set $key $1;[m
[31m-        }[m
[31m-        redis2_query lrange $key 0 -1;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /redis/special[m
[31m---- response_body eval[m
[31m-"*0\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: location if (literal query)[m
[31m---- config[m
[31m-    location /redis {[m
[31m-        if ($uri ~ "(special.*)") {[m
[31m-        }[m
[31m-        redis2_literal_raw_query 'flushall\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /redis/special[m
[31m---- response_body eval[m
[31m-"+OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: location if (raw queries)[m
[31m---- config[m
[31m-    location /redis {[m
[31m-        if ($uri ~ "(special.*)") {[m
[31m-            set $n 2;[m
[31m-        }[m
[31m-        redis2_raw_queries $n 'flushall\r\nget foo\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /redis/special[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$-1\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: location if (raw query)[m
[31m---- config[m
[31m-    location /redis {[m
[31m-        if ($uri ~ "(special.*)") {[m
[31m-            set $n 2;[m
[31m-        }[m
[31m-        redis2_raw_query 'flushall\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /redis/special[m
[31m---- response_body eval[m
[31m-"+OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/pipeline.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/pipeline.t[m
[1mdeleted file mode 100644[m
[1mindex 3459a99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/pipeline.t[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#master_on;[m
[31m-#worker_connections 1024;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: advanced query (2 pipelined)[m
[31m---- config[m
[31m-    location /a {[m
[31m-        redis2_query set hello world;[m
[31m-        redis2_query get hello;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /a[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$5\r\nworld\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: 4 pipelined[m
[31m---- config[m
[31m-    location /a {[m
[31m-        redis2_query set hello world;[m
[31m-        redis2_query get hello;[m
[31m-        redis2_query set hello agentzh;[m
[31m-        redis2_query get hello;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /a[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$5\r\nworld\r\n+OK\r\n\$7\r\nagentzh\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: redis2_raw_queries (2 queries)[m
[31m---- config[m
[31m-    location /pipelined2 {[m
[31m-        set_unescape_uri $n $arg_n;[m
[31m-        set_unescape_uri $cmds $arg_cmds;[m
[31m-[m
[31m-        redis2_raw_queries $n $cmds;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /pipelined2?n=2&cmds=flushall%0D%0Aget%20key%0D%0A[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$-1\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: redis2_raw_queries (2 queries, smaller N arg, bad)[m
[31m---- config[m
[31m-    location /pipelined2 {[m
[31m-        set_unescape_uri $n $arg_n;[m
[31m-        set_unescape_uri $cmds $arg_cmds;[m
[31m-[m
[31m-        redis2_raw_queries $n $cmds;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /pipelined2?n=1&cmds=flushall%0D%0Aget%20key%0D%0A[m
[31m---- response_body eval[m
[31m-"+OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: redis2_raw_queries (2 queries, larger N arg, bad)[m
[31m---- config[m
[31m-    redis2_read_timeout 100ms;[m
[31m-    location /pipelined2 {[m
[31m-        set_unescape_uri $n $arg_n;[m
[31m-        set_unescape_uri $cmds $arg_cmds;[m
[31m-[m
[31m-        redis2_raw_queries $n $cmds;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /pipelined2?n=3&cmds=flushall%0D%0Aget%20key%0D%0A[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m---- error_log eval[m
[31m-qr/upstream timed out .*? while reading upstream/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: advanced query (2 pipelined) - keepalive[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-        keepalive 100;[m
[31m-    }[m
[31m---- config[m
[31m-    location /a {[m
[31m-        redis2_query set hello world;[m
[31m-        redis2_query get hello;[m
[31m-        redis2_pass backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /a[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$5\r\nworld\r\n"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 11d1a26..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,475 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#master_on;[m
[31m-#worker_connections 1024;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no query[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty query[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        redis2_literal_raw_query "";[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple set query[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        redis2_query set one first;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"+OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: simple get query[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        redis2_literal_raw_query 'get not_exist_yet\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"+OK\r\n"[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad command[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        redis2_literal_raw_query 'bad_cmd\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"-ERR unknown command 'bad_cmd'\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: integer reply[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        redis2_literal_raw_query 'incr counter\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: ^:\d+\r\n$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: bulk reply[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        redis2_literal_raw_query 'get not_exist_yet\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"\$-1\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: bulk reply[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_literal_raw_query '*3\r\n$3\r\nset\r\n$3\r\none\r\n$5\r\nfirst\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /get {[m
[31m-        redis2_literal_raw_query '*2\r\n$3\r\nget\r\n$3\r\none\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        echo_location /set;[m
[31m-        echo_location /get;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$5\r\nfirst\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bulk reply[m
[31m---- config[m
[31m-    location /set {[m
[31m-        redis2_query set one first;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /get {[m
[31m-        redis2_query get one;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        echo_location /set;[m
[31m-        echo_location /get;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-global pool[m
[31m-[m
[31m-F(ngx_http_init_request) {[m
[31m-    println("init req")[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-M(create-pool-done) {[m
[31m-    if (active) {[m
[31m-        printf("create pool: %p\n", $arg1)[m
[31m-        print_ubacktrace()[m
[31m-        active = 0;[m
[31m-        pool = $arg1[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_destroy_pool) {[m
[31m-    if ($pool == pool) {[m
[31m-        printf("destroy: %p\n", $pool)[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe process("/lib64/libc.so.6").function("free") {[m
[31m-    if ($mem == pool) {[m
[31m-        printf("free: %p\n", $mem)[m
[31m-    }[m
[31m-}[m
[31m---- stap2[m
[31m-global pools[m
[31m-[m
[31m-M(create-pool-done) {[m
[31m-    key = sprintf("%p", $arg1)[m
[31m-    pools[key] = ubacktrace()[m
[31m-[m
[31m-    # FIXME: the following line is necessary, and i don't know why[m
[31m-    key = sprintf("%p", $arg1)[m
[31m-    printf("create pool: %s\n", key)[m
[31m-[m
[31m-    #print_ubacktrace()[m
[31m-    #print_ustack(ubacktrace())[m
[31m-    #printf("%s", sprint_ubacktrace())[m
[31m-}[m
[31m-[m
[31m-F(ngx_destroy_pool) {[m
[31m-    key = sprintf("%p", $pool)[m
[31m-    delete pools[key][m
[31m-    printf("destroy pool: %s\n", key)[m
[31m-}[m
[31m-[m
[31m-probe end {[m
[31m-    println("leaked pools:\n")[m
[31m-    foreach (k in pools) {[m
[31m-        printf("%s: [%s]\n", k, pools[k])[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$5\r\nfirst\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bulk reply (empty)[m
[31m---- config[m
[31m-    location /set {[m
[31m-        set $empty '';[m
[31m-        redis2_query set one $empty;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /get {[m
[31m-        redis2_query get one;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        echo_location /set;[m
[31m-        echo_location /get;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$0\r\n\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: multi bulk reply (empty)[m
[31m---- config[m
[31m-    location /set_foo {[m
[31m-        set $empty '';[m
[31m-        redis2_query set foo $empty;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /set_bar {[m
[31m-        set $empty '';[m
[31m-        redis2_query set bar $empty;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /mget {[m
[31m-        redis2_literal_raw_query 'mget foo bar\r\n';[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        echo_location /set_foo;[m
[31m-        echo_location /set_bar;[m
[31m-        echo_location /mget;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"+OK\r[m
[31m-+OK\r[m
[31m-*2\r[m
[31m-\$0\r[m
[31m-\r[m
[31m-\$0\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: multi bulk reply (empty)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $query 'ping\r\n';[m
[31m-        redis2_raw_query $query;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"+PONG\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: multi bulk reply (empty)[m
[31m---- http_config[m
[31m-    upstream blah {[m
[31m-        server 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $query 'ping\r\n';[m
[31m-        redis2_raw_query $query;[m
[31m-        set $backend blah;[m
[31m-        redis2_pass $backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"+PONG\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: eval compatibility[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/octet-stream';[m
[31m-        eval $res {[m
[31m-            set $query 'ping\r\n';[m
[31m-            redis2_raw_query $query;[m
[31m-            redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-        }[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"[+PONG\r\n]"[m
[31m---- timeout: 5[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: lua compatibility (GET subrequest)[m
[31m---- config[m
[31m-    location /redis {[m
[31m-        internal;[m
[31m-        set_unescape_uri $query $arg_query;[m
[31m-        redis2_raw_query $query;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/redis",[m
[31m-                { args = { query = "ping\\r\\n" } }[m
[31m-            )[m
[31m-            ngx.print("[" .. res.body .. "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"[+PONG\r\n]"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: lua compatibility (POST subrequest)[m
[31m---- config[m
[31m-    location /redis {[m
[31m-        internal;[m
[31m-        redis2_raw_query $echo_request_body;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/redis",[m
[31m-                { method = ngx.HTTP_PUT,[m
[31m-                  body = "ping\\r\\n" }[m
[31m-            )[m
[31m-            ngx.print("[" .. res.body .. "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"[+PONG\r\n]"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: CRLF in data[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m---- config[m
[31m-    location /a {[m
[31m-        redis2_literal_raw_query '*3\r\n$3\r\nset\r\n$4\r\ncrlf\r\n$2\r\n\r\n\r\n';[m
[31m-        redis2_pass backend;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        redis2_literal_raw_query 'get crlf\r\n';[m
[31m-        redis2_pass backend;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /a;[m
[31m-        echo_location /b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$2\r\n\r\n\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: Unicode chars in data[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m---- config[m
[31m-    location /a {[m
[31m-        redis2_literal_raw_query '*3\r\n$3\r\nset\r\n$4\r\ncrlf\r\n$6\r\n亦春\r\n';[m
[31m-        redis2_pass backend;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        redis2_literal_raw_query 'get crlf\r\n';[m
[31m-        redis2_pass backend;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /a;[m
[31m-        echo_location /b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$6\r\n亦春\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: advanced query[m
[31m---- config[m
[31m-    location /a {[m
[31m-        redis2_query set hello world;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        redis2_query get hello;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /a;[m
[31m-        echo_location /b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"+OK\r\n\$5\r\nworld\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: request body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        # these two settings must be the same to prevent[m
[31m-        # automatic buffering large request bodies[m
[31m-        # to temp files:[m
[31m-        client_body_buffer_size 8k;[m
[31m-        client_max_body_size 8k;[m
[31m-[m
[31m-        redis2_query flushall;[m
[31m-        redis2_query lpush q1 $echo_request_body;[m
[31m-        redis2_query lpop q1;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body eval[m
[31m-"+OK\r\n:1\r\n\$11\r\nhello world\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 7a9c5b8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-ragel -I src -G2 src/ngx_http_redis2_reply.rl || exit 1[m
[31m-./util/fix-clang-warnings[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-          #--with-cc-opt="-O3" \[m
[31m-          #--with-cc-opt="-fast" \[m
[31m-          #--with-cc=gcc46 \[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:/usr/local/lib" \[m
[31m-          --with-cc-opt="-O3 -funsigned-char" \[m
[31m-          --with-http_addition_module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --add-module=$root/../eval-nginx-module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-    --add-module=$home/work/nginx/ngx_http_upstream_keepalive-0.7 \[m
[31m-          --with-debug[m
[31m-          #--add-module=$root/../eval-nginx-module \[m
[31m-          #--add-module=$home/work/nginx/nginx_upstream_hash-0.3 \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/util/fix-clang-warnings b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/util/fix-clang-warnings[m
[1mdeleted file mode 100755[m
[1mindex 150c666..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/util/fix-clang-warnings[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use File::Temp 'tempfile';[m
[31m-[m
[31m-my $infile = "src/ngx_http_redis2_reply.c";[m
[31m-my ($out, $outfile) = tempfile();[m
[31m-open my $in, $infile[m
[31m-    or die "Cannot open $infile for reading: $!\n";[m
[31m-[m
[31m-my $hits = 0;[m
[31m-while (<$in>) {[m
[31m-    if (/ \b reply_ (?: en_main | first_final ) \b /x)[m
[31m-     {[m
[31m-        #warn "HIT!";[m
[31m-        $hits++;[m
[31m-        next;[m
[31m-    }[m
[31m-    print $out $_;[m
[31m-}[m
[31m-[m
[31m-close $in;[m
[31m-close $out;[m
[31m-[m
[31m-if ($hits) {[m
[31m-    my $cmd = "cp $outfile $infile";[m
[31m-    system($cmd) == 0[m
[31m-        or die "Cannot run command \"$cmd\": $!";[m
[31m-}[m
[31m-#die;[m
[31m-[m
[31m-__END__[m
[31m-[m
[31m-This script is to fix the following clang warnings when using Ragel 6.8/6.9/etc:[m
[31m-[m
[31m-src/ngx_http_redis2_reply.c:19:18: error: unused variable 'reply_first_final' [-Werror,-Wunused-const-variable][m
[31m-static const int reply_first_final = 52;[m
[31m-                 ^[m
[31m-src/ngx_http_redis2_reply.c:22:18: error: unused variable 'reply_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int reply_en_main = 1;[m
[31m-                 ^[m
[31m-2 errors generated.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 9b1d859..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/redis2-nginx-module-0.13/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,225 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:lj_str_new[m
[31m-fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_event_accept[m
[31m-fun:ngx_epoll_process_events[m
[31m-fun:ngx_process_events_and_timers[m
[31m-fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Cond[m
[31m-fun:lj_str_new[m
[31m-obj:*[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:lj_str_new[m
[31m-fun:lua_pushlstring[m
[31m-fun:ngx_http_lua_handle_subreq_responses[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:nss_parse_service_list[m
[31m-   fun:__nss_database_lookup[m
[31m-   obj:*[m
[31m-   obj:*[m
[31m-   fun:getgrnam_r@@GLIBC_2.2.5[m
[31m-   fun:getgrnam[m
[31m-   fun:ngx_core_module_init_conf[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:nss_parse_service_list[m
[31m-   fun:__nss_database_lookup[m
[31m-   obj:*[m
[31m-   obj:*[m
[31m-   fun:getpwnam_r@@GLIBC_2.2.5[m
[31m-   fun:getpwnam[m
[31m-   fun:ngx_core_module_init_conf[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_upstream_connect[m
[31m-   fun:ngx_http_upstream_init_request[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 883db4e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-reindex[m
[31m-t/tmp/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 2317ac7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - LUAJIT_LIB=/usr/lib64/libluajit-5.1.so[m
[31m-    - LUAJIT_INC=/usr/include/luajit-2.0[m
[31m-    - LUA_INCLUDE_DIR=/usr/include/luajit-2.0[m
[31m-    - LUA_CMODULE_DIR=/lib[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-[m
[31m-before_install:[m
[31m-  - sudo apt-get install -y axel cpanminus libluajit-5.1-dev[m
[31m-  - sudo cpanm --notest Test::Base IPC::Run[m
[31m-[m
[31m-install:[m
[31m-  - git clone https://github.com/openresty/openresty.git ../openresty[m
[31m-  - git clone https://github.com/openresty/nginx-devel-utils.git[m
[31m-  - git clone https://github.com/openresty/lua-nginx-module.git ../lua-nginx-module[m
[31m-  - git clone https://github.com/openresty/no-pool-nginx.git ../no-pool-nginx[m
[31m-[m
[31m-script:[m
[31m-  - export PATH=$PATH:`pwd`/nginx-devel-utils[m
[31m-  - ngx-build $NGINX_VERSION --with-ipv6 --with-http_realip_module --with-http_ssl_module --add-module=../lua-nginx-module --with-debug[m
[31m-  - export PATH=$PATH:`pwd`/work/nginx/sbin[m
[31m-  - prove -lv t/resty[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/md2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/md2pod.pl[m
[1mdeleted file mode 100755[m
[1mindex cb2bd7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/md2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,630 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use v5.10.1;[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use Getopt::Std;[m
[31m-[m
[31m-my %opts;[m
[31m-getopts('ho:', \%opts)[m
[31m-    or usage(1);[m
[31m-[m
[31m-if ($opts{h}) {[m
[31m-    usage(0);[m
[31m-}[m
[31m-[m
[31m-my %html_entities = ([m
[31m-    'amp' => '&',[m
[31m-    'lt' => 'E<lt>',[m
[31m-    'gt' => 'E<gt>',[m
[31m-    'quot' => '"',[m
[31m-);[m
[31m-[m
[31m-my $infile = shift or die "No input file specified.\n";[m
[31m-my $pod = process_file($infile);[m
[31m-[m
[31m-my $outfile = $opts{o};[m
[31m-if (defined $outfile) {[m
[31m-    open my $out, ">:encoding(UTF-8)", $outfile[m
[31m-        or die "cannot open $outfile for writing: $!\n";[m
[31m-    print $out $pod;[m
[31m-    close $out;[m
[31m-[m
[31m-} else {[m
[31m-    binmode STDOUT, ':encoding(UTF-8)';[m
[31m-    print $pod;[m
[31m-}[m
[31m-[m
[31m-sub process_file {[m
[31m-    my $infile = shift;[m
[31m-[m
[31m-    open my $in, "<:encoding(UTF-8)", $infile[m
[31m-        or die "cannot open $infile for reading: $!\n";[m
[31m-    local $_ = do { local $/; <$in> };[m
[31m-    close $in;[m
[31m-[m
[31m-    my $out = "=encoding utf-8\n\n";[m
[31m-    my ($in_code, %ind2level, %level2ind, $list_level, $cur_list_indent, %list_idx);[m
[31m-    my $just_seen_newline;[m
[31m-    my $add_indent;[m
[31m-    my $total_len = length;[m
[31m-[m
[31m-    while (1) {[m
[31m-        #warn pos_str($_), $in_code ? ', in-code' : (),[m
[31m-        #$list_level ? ", list level $list_level" : ();[m
[31m-[m
[31m-        if ($in_code) {[m
[31m-            if ($add_indent && m/ \G ^ ``` \s* \n? $ /gcxm) {[m
[31m-                undef $in_code;[m
[31m-                undef $add_indent;[m
[31m-                $just_seen_newline = 1;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (!$add_indent) {[m
[31m-                if (m/ \G ^ \s* \n /gcxm) {[m
[31m-                    $just_seen_newline = 1;[m
[31m-                    $out .= "\n";[m
[31m-                    undef $in_code;[m
[31m-                    next;[m
[31m-                }[m
[31m-[m
[31m-                undef $just_seen_newline;[m
[31m-[m
[31m-                if (m/ \G ^ (\s+) /gcxm) {[m
[31m-                    my $leading_spaces = $1;[m
[31m-                    if (length $leading_spaces < 4) {[m
[31m-                        # new paragraph[m
[31m-                        pos $_ -= length $leading_spaces;[m
[31m-                        undef $in_code;[m
[31m-                        next;[m
[31m-                    }[m
[31m-[m
[31m-                    pos $_ -= length $leading_spaces;[m
[31m-[m
[31m-                } else {[m
[31m-                    undef $in_code;[m
[31m-                    next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ( [^\n]+ \n? ) /gcxms) {[m
[31m-                if ($add_indent) {[m
[31m-                    $out .= "    " . $1;[m
[31m-[m
[31m-                } else {[m
[31m-                    $out .= $1;[m
[31m-                }[m
[31m-[m
[31m-                undef $just_seen_newline;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G (.) /gcxs) {[m
[31m-                if ($add_indent) {[m
[31m-                    $out .= "    " . $1;[m
[31m-[m
[31m-                } else {[m
[31m-                    $out .= $1;[m
[31m-                }[m
[31m-[m
[31m-                undef $just_seen_newline;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if ($add_indent) {[m
[31m-                warn "missing terminating ```\n";[m
[31m-            }[m
[31m-[m
[31m-            last;[m
[31m-[m
[31m-        } else {[m
[31m-            # !$in_code[m
[31m-[m
[31m-            if (/ \G ^ ( \S .* ) \n \s* ([-=]+) \s* \n? $ /gcxm) {[m
[31m-                my ($title, $type) = ($1, $2);[m
[31m-[m
[31m-                #die "Hit!";[m
[31m-[m
[31m-                if ($list_level) {[m
[31m-                    for (my $level = $list_level; $level > 0; $level--) {[m
[31m-                        $out .= "\n=back\n\n";[m
[31m-                        my $ind = $level2ind{$level};[m
[31m-                        delete $level2ind{$level};[m
[31m-                        delete $ind2level{$ind};[m
[31m-                        delete $list_idx{$level};[m
[31m-                    }[m
[31m-[m
[31m-                    undef $list_level;[m
[31m-                    undef $cur_list_indent;[m
[31m-                }[m
[31m-[m
[31m-                my $level = ($type =~ /=/) ? 1 : 2;[m
[31m-[m
[31m-                $out .= "\n=head$level ";[m
[31m-                $out .= process_remaining_line($title);[m
[31m-                $out .= "\n";[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ^ \s* \<!--.*?--> \s* /gcxms) {[m
[31m-                $out .= "\n";[m
[31m-                $just_seen_newline = 1;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ^ \s* (?: \n | $ ) /gcxm) {[m
[31m-                $just_seen_newline = 1;[m
[31m-                $out .= "\n";[m
[31m-[m
[31m-                if ($list_level && m/ \G (?! ^ \  ) /gcxm) {[m
[31m-                    for (my $level = $list_level; $level > 0; $level--) {[m
[31m-                        $out .= "\n=back\n\n";[m
[31m-                        my $ind = $level2ind{$level};[m
[31m-                        delete $level2ind{$level};[m
[31m-                        delete $ind2level{$ind};[m
[31m-                        delete $list_idx{$level};[m
[31m-                    }[m
[31m-[m
[31m-                    undef $list_level;[m
[31m-                    undef $cur_list_indent;[m
[31m-                }[m
[31m-[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ^ ``` \s* (?: \w+ \s* )? (?: \n | $ ) /gcxm) {[m
[31m-                $in_code = 1;[m
[31m-                $add_indent = 1;[m
[31m-                $out .= "\n";[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ^ (\s*) ( [-+*] | \d+ \. ) \s+ /gcxm) {[m
[31m-                my ($leading_space, $prefix) = ($1, $2);[m
[31m-[m
[31m-                if (!defined $list_level) {[m
[31m-                    # first element[m
[31m-                    if (length $leading_space < 4) {[m
[31m-                        $out .= "\n=over\n\n";[m
[31m-[m
[31m-                        # treat it as a new list[m
[31m-                        if ($prefix =~ /^[-+*]$/) {[m
[31m-                            $out .= "\n=item *\n\n";[m
[31m-                        } else {[m
[31m-                            $list_idx{1} = 1;[m
[31m-                            $out .= "\n=item 1.\n\n";[m
[31m-                        }[m
[31m-[m
[31m-                        $list_level = 1;[m
[31m-                        $cur_list_indent = length $leading_space;[m
[31m-                        $ind2level{$cur_list_indent} = $list_level;[m
[31m-                        $level2ind{$list_level} = $cur_list_indent;[m
[31m-[m
[31m-                        $out .= process_remaining_line($_);[m
[31m-[m
[31m-                    } else {[m
[31m-                        if ($just_seen_newline) {[m
[31m-                            undef $just_seen_newline;[m
[31m-                            # FIXME must with a leading empty line[m
[31m-                            $in_code = 1;[m
[31m-                            m/ \G (.* \n? ) /;[m
[31m-                            $out .= $leading_space . $1;[m
[31m-                            next;[m
[31m-                        }[m
[31m-[m
[31m-                        # append to the previous paraprah[m
[31m-                        $out .= process_remaining_line($_);[m
[31m-                        next;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    if ($just_seen_newline) {[m
[31m-                        for (my $level = $list_level; $level > 0; $level--) {[m
[31m-                            $out .= "\n=back\n\n";[m
[31m-                            my $ind = $level2ind{$level};[m
[31m-                            delete $level2ind{$level};[m
[31m-                            delete $ind2level{$ind};[m
[31m-                            delete $list_idx{$level};[m
[31m-                        }[m
[31m-[m
[31m-                        undef $list_level;[m
[31m-                        undef $cur_list_indent;[m
[31m-[m
[31m-                        # first element[m
[31m-                        if (length $leading_space < 4) {[m
[31m-                            $out .= "\n=over\n\n";[m
[31m-[m
[31m-                            # treat it as a new list[m
[31m-                            if ($prefix =~ /^[-+*]$/) {[m
[31m-                                $out .= "\n=item *\n\n";[m
[31m-                            } else {[m
[31m-                                $list_idx{1} = 1;[m
[31m-                                $out .= "\n=item 1.\n\n";[m
[31m-                            }[m
[31m-[m
[31m-                            $list_level = 1;[m
[31m-                            $cur_list_indent = length $leading_space;[m
[31m-                            $ind2level{$cur_list_indent} = $list_level;[m
[31m-                            $level2ind{$list_level} = $cur_list_indent;[m
[31m-[m
[31m-                            $out .= process_remaining_line($_);[m
[31m-[m
[31m-                        } else {[m
[31m-                            if ($just_seen_newline) {[m
[31m-                                undef $just_seen_newline;[m
[31m-                                # FIXME must with a leading empty line[m
[31m-                                $in_code = 1;[m
[31m-                                $out .= "$_";[m
[31m-                                next;[m
[31m-                            }[m
[31m-[m
[31m-                            # append to the previous paraprah[m
[31m-                            $out .= process_remaining_line($_);[m
[31m-                            next;[m
[31m-                        }[m
[31m-[m
[31m-                        next;[m
[31m-                    }[m
[31m-[m
[31m-                    # a new element in an existing list or new list[m
[31m-                    if (length $leading_space != $cur_list_indent) {[m
[31m-                        my $new_level = $ind2level{length $leading_space};[m
[31m-                        if (defined $new_level) {[m
[31m-                            if ($new_level < $list_level) {[m
[31m-                                # closing current nested levels[m
[31m-                                for (my $level = $list_level; $level > $new_level; $level--) {[m
[31m-                                    $out .= "\n=back\n\n";[m
[31m-                                    my $ind = $level2ind{$level};[m
[31m-                                    delete $level2ind{$level};[m
[31m-                                    delete $ind2level{$ind};[m
[31m-                                    delete $list_idx{$level};[m
[31m-                                }[m
[31m-                                $list_level = $new_level;[m
[31m-                                $cur_list_indent = $level2ind{$list_level};[m
[31m-[m
[31m-                                my $idx = $list_idx{$list_level};[m
[31m-                                if (defined $idx) {[m
[31m-                                    # being a numbered list[m
[31m-                                    $list_idx{$list_level}++;[m
[31m-                                    $idx++;[m
[31m-                                    $out .= "\n=item $idx.\n\n";[m
[31m-[m
[31m-                                } else {[m
[31m-                                    $out .= "\n=item *\n\n";[m
[31m-                                }[m
[31m-[m
[31m-                                $out .= process_remaining_line($_);[m
[31m-[m
[31m-                            } else {[m
[31m-                                die "cannot happen!";[m
[31m-                            }[m
[31m-[m
[31m-                        } else {[m
[31m-                            # a new nested list[m
[31m-                            $list_level++;[m
[31m-[m
[31m-                            $out .= "\n=over\n\n";[m
[31m-[m
[31m-                            if ($prefix =~ /^[-+*]$/) {[m
[31m-                                $out .= "\n=item *\n\n";[m
[31m-                            } else {[m
[31m-                                $list_idx{$list_level} = 1;[m
[31m-                                $out .= "\n=item 1.\n\n";[m
[31m-                            }[m
[31m-[m
[31m-                            $cur_list_indent = length $leading_space;[m
[31m-                            $ind2level{$cur_list_indent} = $list_level;[m
[31m-                            $level2ind{$list_level} = $cur_list_indent;[m
[31m-[m
[31m-                            $out .= process_remaining_line($_);[m
[31m-                        }[m
[31m-[m
[31m-                    } else {[m
[31m-                        # in the current list[m
[31m-[m
[31m-                        my $idx = $list_idx{$list_level};[m
[31m-                        if (defined $idx) {[m
[31m-                            # being a numbered list[m
[31m-                            $list_idx{$list_level}++;[m
[31m-                            $idx++;[m
[31m-                            $out .= "\n=item $idx.\n\n";[m
[31m-[m
[31m-                        } else {[m
[31m-                            $out .= "\n=item *\n\n";[m
[31m-                        }[m
[31m-[m
[31m-                        $out .= process_remaining_line($_);[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                undef $just_seen_newline;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ^ (\#+) \s+ /gcxm) {[m
[31m-                undef $just_seen_newline;[m
[31m-[m
[31m-                if ($list_level) {[m
[31m-                    for (my $level = $list_level; $level > 0; $level--) {[m
[31m-                        $out .= "\n=back\n\n";[m
[31m-                        my $ind = $level2ind{$level};[m
[31m-                        delete $level2ind{$level};[m
[31m-                        delete $ind2level{$ind};[m
[31m-                        delete $list_idx{$level};[m
[31m-                    }[m
[31m-[m
[31m-                    undef $list_level;[m
[31m-                    undef $cur_list_indent;[m
[31m-                }[m
[31m-[m
[31m-                my $level = length $1;[m
[31m-                if ($level > 4) {[m
[31m-                    $level = 4;  # POD only supports 4 levels.[m
[31m-                }[m
[31m-                $out .= "\n=head$level ";[m
[31m-                $out .= process_remaining_line($_);[m
[31m-                $out =~ s/ \s* \#+ \s* $//xg;[m
[31m-                $out .= "\n";[m
[31m-[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ^ (\s*) /gcxm) {  # not an empty line though[m
[31m-                my $leading_space = $1;[m
[31m-                if ($list_level) {[m
[31m-                    # append to the previous paragraph[m
[31m-                    $out .= process_remaining_line($_);[m
[31m-                    undef $just_seen_newline;[m
[31m-[m
[31m-                } else {[m
[31m-                    if ($just_seen_newline) {[m
[31m-                        undef $just_seen_newline;[m
[31m-[m
[31m-                        if (length $leading_space >= 4) {[m
[31m-                            #warn "found new code";[m
[31m-                            # new code[m
[31m-                            m/ \G (.* \n?) /gcxm;[m
[31m-                            $out .= $leading_space . $1;[m
[31m-                            $in_code = 1;[m
[31m-                            undef $add_indent;[m
[31m-[m
[31m-                        } else {[m
[31m-                            # new paragraph[m
[31m-                            #s/^\s*//;[m
[31m-                            $out .= process_remaining_line($_);[m
[31m-                        }[m
[31m-[m
[31m-                    } else {[m
[31m-                        # append to the previous paragraph[m
[31m-                        $out .= process_remaining_line($_);[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            $out .= process_remaining_line($_);[m
[31m-[m
[31m-            if (pos $_ && pos $_ >= $total_len) {[m
[31m-                last;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    close $in;[m
[31m-[m
[31m-    if ($list_level) {[m
[31m-        for (my $level = $list_level; $level > 0; $level--) {[m
[31m-            $out .= "\n=back\n\n";[m
[31m-            my $ind = $level2ind{$level};[m
[31m-            delete $level2ind{$level};[m
[31m-            delete $ind2level{$ind};[m
[31m-            delete $list_idx{$level};[m
[31m-        }[m
[31m-[m
[31m-        undef $list_level;[m
[31m-        undef $cur_list_indent;[m
[31m-    }[m
[31m-[m
[31m-    return $out;[m
[31m-}[m
[31m-[m
[31m-sub process_remaining_line {[m
[31m-    #warn pos $_[0] // 0;[m
[31m-    my %seen_quotes;[m
[31m-    my $out = '';[m
[31m-    for ($_[0]) {[m
[31m-        while (1) {[m
[31m-[m
[31m-            if (!$seen_quotes{'**'} && m/ \G (\*\*) (?= .*? \*\* ) /gcxm[m
[31m-                || !$seen_quotes{'**'} && !$seen_quotes{'*'} && m/ \G ( \* ) (?= .*? \* ) /gcxm[m
[31m-                || $seen_quotes{'**'} && !$seen_quotes{'*'} && m/ \G ( \* ) (?! \* ) (?= .+? \* ) /gcxm)[m
[31m-            {[m
[31m-                my $quote = $1;[m
[31m-                # an opening quote[m
[31m-                if (length $quote == 1) {[m
[31m-                    $out .= "I<";[m
[31m-                } else {[m
[31m-                    $out .= "B<";[m
[31m-                }[m
[31m-                $seen_quotes{$quote} = 1;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if ($seen_quotes{'**'} && m/ \G (\*\*) /gcxm[m
[31m-                || !$seen_quotes{'**'} && $seen_quotes{'*'} && m/ \G ( \* ) /gcxm[m
[31m-                || $seen_quotes{'**'} && $seen_quotes{'*'} && m/ \G ( \* ) (?! \* ) /gcxm)[m
[31m-            {[m
[31m-                # found a closing quote[m
[31m-                my $quote = $1;[m
[31m-                $out .= ">";[m
[31m-                delete $seen_quotes{$quote};[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (!$seen_quotes{'__'} && m/ \G \b (__) (?= .*? __ \b ) /gcxm[m
[31m-                || !$seen_quotes{'__'} && !$seen_quotes{'_'} && m/ \G \b ( _ ) (?= .*? _ \b ) /gcxm[m
[31m-                || $seen_quotes{'__'} && !$seen_quotes{'_'} && m/ \G \b ( _ ) (?! _ \b ) (?= .+? _ \b ) /gcxm)[m
[31m-            {[m
[31m-                my $quote = $1;[m
[31m-                # an opening quote[m
[31m-                if (length $quote == 1) {[m
[31m-                    $out .= "I<";[m
[31m-                } else {[m
[31m-                    $out .= "B<";[m
[31m-                }[m
[31m-                $seen_quotes{$quote} = 1;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if ($seen_quotes{'__'} && m/ \G (__) /gcxm[m
[31m-                || !$seen_quotes{'__'} && $seen_quotes{'_'} && m/ \G ( _ ) /gcxm[m
[31m-                || $seen_quotes{'__'} && $seen_quotes{'_'} && m/ \G ( _ ) (?! _ ) /gcxm)[m
[31m-            {[m
[31m-                # found a closing quote[m
[31m-                my $quote = $1;[m
[31m-                $out .= ">";[m
[31m-                delete $seen_quotes{$quote};[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ([<>]) /gcx) {[m
[31m-                my $c = $1;[m
[31m-                if ($c eq '<') {[m
[31m-                    $out .= "E<lt>";[m
[31m-[m
[31m-                } elsif ($c eq '>') {[m
[31m-                    $out .= "E<gt>";[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G \&(\w+); /gcx) {[m
[31m-                my $entity = $1;[m
[31m-                my $pod = $html_entities{$entity};[m
[31m-                if ($pod) {[m
[31m-                    $out .= $pod;[m
[31m-[m
[31m-                } else {[m
[31m-                    $out .= "E<$entity>";[m
[31m-                }[m
[31m-[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G \& \# (\d+) ; /gcx) {[m
[31m-                my $dec = $1;[m
[31m-                $out .= "E<$dec>";[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ` (.*?) ` /gcx) {[m
[31m-                my $code = $1;[m
[31m-                my $level;[m
[31m-[m
[31m-                if ($code =~ /(>+)/) {[m
[31m-                    $level = length($1) + 1;[m
[31m-[m
[31m-                } elsif ($code =~ /^</) {[m
[31m-                    $level = 2;[m
[31m-[m
[31m-                } else {[m
[31m-                    $level = 1;[m
[31m-                }[m
[31m-[m
[31m-                if ($level == 1) {[m
[31m-                    $out .= "C<$code>";[m
[31m-                } else {[m
[31m-                    $out .= 'C' . ('<' x $level) . " $code " . ('>' x $level);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G \\ ([\[\]]) /gcx) {[m
[31m-                $out .= $1;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G \[ ( [^\n\[\]]* ) \] \( ( [^()\n]* ) \) /gcxm) {[m
[31m-                my ($label, $link) = ($1, $2);[m
[31m-[m
[31m-                if ($label eq 'Back to TOC') {[m
[31m-                    next;[m
[31m-                }[m
[31m-[m
[31m-                $label =~ s/\|/E<verbar>/g;[m
[31m-                $label =~ s{/}{E<sol>}g;[m
[31m-                if ($link =~ m/^\#/) {[m
[31m-                    $out .= "L<$label>";[m
[31m-                } else {[m
[31m-                    $out .= "L<$label|$link>";[m
[31m-                }[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G ( [^`<>\[\n*_\&\\]+ ) /gcxm) {[m
[31m-                $out .= $1;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if (/ \G (.) /gcxm) {[m
[31m-                $out .= $1;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ($_[0] =~ / \G \n /gcx) {[m
[31m-        $out .= "\n";[m
[31m-    }[m
[31m-[m
[31m-    #warn pos $_[0] // 0;[m
[31m-[m
[31m-    return $out;[m
[31m-}[m
[31m-[m
[31m-sub pos_str {[m
[31m-    my $pos = pos $_[0];[m
[31m-    my ($ln, $col);[m
[31m-    if (!defined $pos) {[m
[31m-        $pos = 0;[m
[31m-        $ln = 1;[m
[31m-        $col = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        my $s = substr $_[0], 0, $pos;[m
[31m-        $ln = 1;[m
[31m-        while ($s =~ /\n/gc) {[m
[31m-            $ln++;[m
[31m-        }[m
[31m-        $s =~ /\G (.*) /gcx;[m
[31m-        $col = 1 + length $1;[m
[31m-    }[m
[31m-[m
[31m-    return "pos $pos line $ln, col $col";[m
[31m-}[m
[31m-[m
[31m-sub usage {[m
[31m-    my $code = shift;[m
[31m-    my $msg = <<_EOC_;[m
[31m-Usage:[m
[31m-    $0 [options] <input-file>[m
[31m-[m
[31m-Options:[m
[31m-[m
[31m-    -h           Print out this usage.[m
[31m-    -o file      Specify the output POD file.[m
[31m-[m
[31m-Copyright (C) Yichun Zhang (agentzh). All rights reserved.[m
[31m-_EOC_[m
[31m-[m
[31m-    if ($code == 0) {[m
[31m-        print $msg;[m
[31m-        exit(0);[m
[31m-    }[m
[31m-[m
[31m-    print STDERR $msg;[m
[31m-    exit($code);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/nginx-xml2pod b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/nginx-xml2pod[m
[1mdeleted file mode 100755[m
[1mindex 0930bc9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/nginx-xml2pod[m
[1m+++ /dev/null[m
[36m@@ -1,635 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use File::Find ();[m
[31m-use Data::Dumper;[m
[31m-[m
[31m-my $mainline_version = '1.9.7';[m
[31m-[m
[31m-my $infile = shift[m
[31m-    or die "No input directory or file specified.\n";;[m
[31m-[m
[31m-if (-d $infile) {[m
[31m-    my $indir = $infile;[m
[31m-    File::Find::find({ wanted => \&wanted, no_chdir => 1 },  $indir);[m
[31m-[m
[31m-} else {[m
[31m-    process_xml_file($infile);[m
[31m-}[m
[31m-[m
[31m-sub wanted {[m
[31m-    return unless -f $_ && /\.xml$/;[m
[31m-    my $xmlfile = $File::Find::name;[m
[31m-    process_xml_file($xmlfile);[m
[31m-}[m
[31m-[m
[31m-sub process_xml_file {[m
[31m-    my $xmlfile = shift;[m
[31m-[m
[31m-    (my $name = $xmlfile) =~ s/\.xml$//;[m
[31m-    $name =~ s{.*/}{};[m
[31m-[m
[31m-    open my $in, "<:encoding(UTF-8)", $xmlfile[m
[31m-        or die "Cannot open $xmlfile for reading: $!\n";[m
[31m-    local $_ = do { local $/; <$in> };[m
[31m-    close $in;[m
[31m-[m
[31m-    my $pod = "=encoding utf-8\n\n";[m
[31m-    my $level = 1;[m
[31m-    my $directive;[m
[31m-    my @lists;[m
[31m-    my $syntax_block;[m
[31m-[m
[31m-    while (1) {[m
[31m-        #warn "scanner: ", pos_str($_);[m
[31m-[m
[31m-        next if / \G ^ \s* (?: \n | $ ) /xgcm;[m
[31m-[m
[31m-        if (/\G < \? xml .*? \? > \s* /gcxms[m
[31m-            || /\G \s* <!-- .*? --> \s* /gcxms[m
[31m-            || /\G <!DOCTYPE .*? > \s* /gcxms)[m
[31m-        {[m
[31m-            # ignore[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (/ \G < \s* article ( (?: \s+ \w+ \s* = \s* " .*? " )* ) > \s* /gcxms) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-            #warn "article: ", Dumper($attrs);[m
[31m-            $pod .= "\n=head1 Name\n\n";[m
[31m-[m
[31m-            my $title = $attrs->{name};[m
[31m-            if (defined $title) {[m
[31m-                $pod .= "\n$name - $title\n\n";[m
[31m-[m
[31m-            } else {[m
[31m-                $pod .= "\n$name\n\n";[m
[31m-            }[m
[31m-[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (/ \G < \s* section ( (?: \s+ \w+ \s* = \s* " .*? " )* ) > \s* /gcxm) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-[m
[31m-            #warn "secton: ", Dumper($attrs);[m
[31m-[m
[31m-            my $title = $attrs->{name};[m
[31m-            if (defined $title) {[m
[31m-                $pod .= "\n=head$level $title\n\n";[m
[31m-[m
[31m-            } else {[m
[31m-                $pod .= "\n=head$level\n\n";[m
[31m-            }[m
[31m-[m
[31m-            $level++;[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* section \s* > \s* }gcxs) {[m
[31m-            $level--;[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* article \s* > \s* }gcxs) {[m
[31m-            $pod .= "\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* link ( (?: \s+ \w+ \s* = \s* " [^"]* " )* ) >[m
[31m-              (.*?)[m
[31m-                 < \s* / \s* link \s* > }gcxs)[m
[31m-         {[m
[31m-            my ($attrs, $label) = ($1, $2);[m
[31m-[m
[31m-            $label = encode_pod(decode_xml($label));[m
[31m-            $label =~ s/^\s+|\s+$//gs;[m
[31m-[m
[31m-            $attrs = parse_attrs($attrs);[m
[31m-[m
[31m-            my $doc = $attrs->{doc};[m
[31m-            my $url = $attrs->{url};[m
[31m-            my $id = $attrs->{id};[m
[31m-[m
[31m-            if ($doc) {[m
[31m-                $doc =~ s{.*/}{};[m
[31m-                $doc =~ s/\.xml$//;[m
[31m-                $pod .= "L<$label|$doc>";[m
[31m-[m
[31m-            } elsif ($url) {[m
[31m-                $pod .= "L<$label|$url>";[m
[31m-[m
[31m-            } elsif ($id) {[m
[31m-                $pod .= "$label";[m
[31m-[m
[31m-            } else {[m
[31m-                die "Bad link: $&";[m
[31m-            }[m
[31m-[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* link ( (?: \s+ \w+ \s* = \s* " [^"]* " )* ) \s* / \s* > }gcxs) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-            my $doc = $attrs->{doc};[m
[31m-            my $id = $attrs->{id};[m
[31m-            if ($doc) {[m
[31m-                $doc =~ s{.*/}{};[m
[31m-                $doc =~ s/\.xml$//;[m
[31m-                $pod .= "L<$doc>"[m
[31m-[m
[31m-            } elsif ($id) {[m
[31m-                $pod .= "L</$id>";[m
[31m-            } else {[m
[31m-                die "No doc attribute found for link: $&";[m
[31m-            }[m
[31m-[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* (/?) \s* literal \s* > }gcxs) {[m
[31m-            my $closing = $1;[m
[31m-            if ($closing) {[m
[31m-                $pod .= ">";[m
[31m-            } else {[m
[31m-                $pod .= 'C<';[m
[31m-            }[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* /? \s* commercial_version \s* > }gcxs)[m
[31m-        {[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* example \s* > (.*?) < \s* / \s* example \s* > }gcxs)[m
[31m-        {[m
[31m-            my $code = decode_xml($1);[m
[31m-            $code =~ s/^/    /gm;[m
[31m-            $pod .= "\n$code\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* programlisting \s* > (.*?) < \s* / \s* programlisting \s* > }gcxs)[m
[31m-        {[m
[31m-            my $code = decode_xml($1);[m
[31m-            $code =~ s/^/    /gm;[m
[31m-            $pod .= "\n$code\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* registered \s* > (.*?) < \s* / \s* registered \s* > }gcxs) {[m
[31m-            my $label = encode_pod(decode_xml($1));[m
[31m-            $label =~ s/^\s+|\s+$//gs;[m
[31m-            $pod .= "$label E<copy>";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* list ( (?: \s+ \w+ \s* = \s* " [^"]* " )* )  > }gcxs) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-[m
[31m-            #warn pos_str($_), " Found list!";[m
[31m-[m
[31m-            my $type = $attrs->{type};[m
[31m-            if (!defined $type || $type !~ /^(?:bullet|enum|tag)$/) {[m
[31m-                error($xmlfile, $_, "list lacks a type or takes a bad type");[m
[31m-            }[m
[31m-[m
[31m-            $pod .= "\n=over\n\n";[m
[31m-[m
[31m-            push @lists, [$type, 1];[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* list \s* > }gcxs) {[m
[31m-            $pod .= "\n=back\n\n";[m
[31m-            pop @lists;[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* listitem \s* > }gcxs) {[m
[31m-            # do nothing...[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* note \s* > }gcxs) {[m
[31m-            $pod .= "\nB<NOTE>\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* note \s* > }gcxs) {[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* value \s* > }gcxs) {[m
[31m-            $pod .= "I<C<";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* value \s* > }gcxs) {[m
[31m-            $pod .= ">>";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* path \s* > }gcxs) {[m
[31m-            $pod .= "F<";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* path \s* > }gcxs) {[m
[31m-            $pod .= ">";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* appeared-in \s* > (.*?) < \s* / \s* appeared-in \s* > }gcxs) {[m
[31m-            my $version = decode_xml($1);[m
[31m-            $pod .= "\nThis directive appeared in version " . encode_pod($version) . ".\n\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* syntax ( (?: \s+ \w+ \s* = \s* " [^"]* " )+ ) \s* / \s* > }gcxs) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-            if ($attrs->{block} eq 'yes') {[m
[31m-                if (!$directive) {[m
[31m-                    error($xmlfile, $_, "syntax used outside of <directive>");[m
[31m-                }[m
[31m-                $pod .= "$directive { B<...> }\n\n";[m
[31m-[m
[31m-            } else {[m
[31m-                error($xmlfile, $_, "block attr not defined in <syntax />");[m
[31m-            }[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* syntax ( (?: \s+ \w+ \s* = \s* " [^"]* " )+ ) \s* > }gcxs) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-            if ($attrs->{block} eq 'yes') {[m
[31m-                if (!$directive) {[m
[31m-                    error($xmlfile, $_, "syntax used outside of <directive>");[m
[31m-                }[m
[31m-                $pod .= "B<syntax:> $directive I<";[m
[31m-                $syntax_block = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                error($xmlfile, $_, "block attr not defined in <syntax />");[m
[31m-            }[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* ( syntax | default | context ) \s* > }gcxs) {[m
[31m-            my $tag = $1;[m
[31m-            if ($tag eq 'syntax') {[m
[31m-                undef $syntax_block;[m
[31m-                $pod .= "B<syntax:> $directive I<";[m
[31m-            } else {[m
[31m-                $pod .= "B<$tag:> I<";[m
[31m-            }[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* ( syntax | default | context ) \s* > }gcxs) {[m
[31m-            my $tag = $1;[m
[31m-            if ($tag eq 'syntax' && $syntax_block) {[m
[31m-                $pod .= " { B<...> } >\n\n";[m
[31m-            } else {[m
[31m-                $pod .= ">\n\n";[m
[31m-            }[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* (?: syntax | default | context ) \s* / \s * > }gcxs) {[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        if (m{ \G < \s* listitem \b [^>]* > }gcxs) {[m
[31m-            my $list = $lists[-1];[m
[31m-            if (!defined $list) {[m
[31m-                error($xmlfile, $_, "listitem used outside list");[m
[31m-            }[m
[31m-[m
[31m-            my ($type, $idx) = @$list;[m
[31m-[m
[31m-            if ($type eq 'tag') {[m
[31m-                error($xmlfile, $_, "listitem is disallowed inside tagged-type lists");[m
[31m-            }[m
[31m-[m
[31m-            if ($type eq 'bullet') {[m
[31m-                $pod .= "\n=item *\n";[m
[31m-[m
[31m-            } elsif ($type eq 'enum') {[m
[31m-                $pod .= "\n=item $idx.\n";[m
[31m-                $list->[1]++;[m
[31m-[m
[31m-            } else {[m
[31m-                die "cannot happen: $type";[m
[31m-            }[m
[31m-[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* tag-name \b [^>]* > }gcxs) {[m
[31m-            my $list = $lists[-1];[m
[31m-[m
[31m-            if (!defined $list) {[m
[31m-                #warn $pod;[m
[31m-                error($xmlfile, $_, "tag-name used outside of any lists");[m
[31m-            }[m
[31m-[m
[31m-            #warn "Found tag-name!";[m
[31m-[m
[31m-            my ($type, $idx) = @$list;[m
[31m-            if ($type ne 'tag') {[m
[31m-                error($xmlfile, $_, "tag-name used outside of tagged lists");[m
[31m-            }[m
[31m-[m
[31m-            $pod .= "=item ";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* tag-name \s* > }gcxs) {[m
[31m-            $pod .= "\n\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* tag-desc \s* > }gcxs) {[m
[31m-            my $list = $lists[-1];[m
[31m-[m
[31m-            if (!defined $list) {[m
[31m-                #warn $pod;[m
[31m-                error($xmlfile, $_, "tag-name used outside of any lists");[m
[31m-            }[m
[31m-[m
[31m-            my ($type, $idx) = @$list;[m
[31m-            if ($type ne 'tag') {[m
[31m-                error($xmlfile, $_, "tag-name used outside of tagged lists");[m
[31m-            }[m
[31m-[m
[31m-            #warn "tag list defined!";[m
[31m-            $pod .= "\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* tag-desc \s* > }gcxs) {[m
[31m-            $pod .= "\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* table \b [^>]* > (.*?) < \s* / \s* table \s* > }gcxs) {[m
[31m-            $pod .= process_table($1);[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* para \b .*? \s* > }gcxs) {[m
[31m-            $pod .= "\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* para \s* > }gcxs) {[m
[31m-            $pod .= "\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* (?: c-def | var | c-func | header ) \s* > }gcxs) {[m
[31m-            $pod .= "C<";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* (?: c-def | var | c-func | header ) \s* > }gcxs) {[m
[31m-            $pod .= ">";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* (?: http-status ( (?: \s+ \w+ \s* = \s* " [^"]* " )* ) ) \s* /? \s* > }gcxs) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-            $pod .= "C<$attrs->{code}> (C<" . encode_pod($attrs->{text}) . ">)";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* command \s* > }gcxs) {[m
[31m-            $pod .= "C<";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* br \s* / \s* > }gcxs) {[m
[31m-            $pod .= "\n\n";[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* command \s* > }gcxs) {[m
[31m-            $pod .= ">";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* (?: i | emphasis ) \s* > }gcxsi) {[m
[31m-            $pod .= "I<";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* b \s* > }gcxsi) {[m
[31m-            $pod .= "B<";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* (?: [bi] | emphasis ) \s* > }gcxsi) {[m
[31m-            $pod .= ">";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* /? \s* nobr \s* > }gcxs) {[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* initial \s* > }gcxs) {[m
[31m-            $pod .= "B<";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* initial \s* > }gcxs) {[m
[31m-            $pod .= ">";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* mainline_version \s* / \s* > }gcxs) {[m
[31m-            $pod .= $mainline_version;[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* module ( (?: \s+ \w+ \s* = \s* " [^"]* " )* ) \s* > }gcxs) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-            if (!$attrs->{name}) {[m
[31m-                error($xmlfile, $_, "no \"name\" attribute found for <module>");[m
[31m-            }[m
[31m-            $pod .= <<_EOC_;[m
[31m-=head1 NAME[m
[31m-[m
[31m-$name - $attrs->{name}[m
[31m-[m
[31m-_EOC_[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* module \s* > }gcxs) {[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* directive ( (?: \s+ \w+ \s* = \s* " [^"]* " )* ) \s* > }gcxs) {[m
[31m-            my $attrs = parse_attrs($1);[m
[31m-            if (!$attrs->{name}) {[m
[31m-                error($xmlfile, $_, "no \"name\" attribute found for <directive>");[m
[31m-            }[m
[31m-[m
[31m-            $directive = $attrs->{name};[m
[31m-[m
[31m-            $pod .= <<_EOC_;[m
[31m-=head$level $directive[m
[31m-[m
[31m-_EOC_[m
[31m-            $level++;[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G < \s* / \s* directive > }gcxs) {[m
[31m-            $level--;[m
[31m-            $pod .= "\n";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G \&(\w+); }gcxs) {[m
[31m-            my $entity = $1;[m
[31m-            $pod .= "E<$entity>";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G \&\#(\d+); }gcxs) {[m
[31m-            my $num = $1;[m
[31m-            $pod .= "E<$num>";[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G ([^<&]+) }gcxs) {[m
[31m-            $pod .= encode_pod(decode_xml($1));[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (m{ \G (.) }gcxs) {[m
[31m-            error($xmlfile, $_, "bad character found: $1");[m
[31m-        }[m
[31m-[m
[31m-        last;[m
[31m-    }[m
[31m-[m
[31m-    $pod =~ s/ ^ =item \s+ (\d+) \s* $ /=item C<$1>/gmsx;[m
[31m-[m
[31m-    my $outfile = "$name.pod";[m
[31m-    open my $out, ">:encoding(UTF-8)", $outfile[m
[31m-        or die "cannot open $outfile for writing: $!\n";[m
[31m-    print $out $pod;[m
[31m-    close $out;[m
[31m-[m
[31m-    print "wrote $outfile\n";[m
[31m-[m
[31m-    shell("pod2text $outfile > /dev/null");[m
[31m-}[m
[31m-[m
[31m-sub shell {[m
[31m-    my $cmd = shift;[m
[31m-    system($cmd) == 0[m
[31m-        or die "failed to run command \"$cmd\": $?\n";[m
[31m-}[m
[31m-[m
[31m-sub error {[m
[31m-    my $file = shift;[m
[31m-    my $msg = pop;[m
[31m-    my $pos = pos_str($_[0]);[m
[31m-    $_[0] =~ / \G (.{0,100}) /gcsx;[m
[31m-    die "$file: $pos: $msg ($1)\n";[m
[31m-}[m
[31m-[m
[31m-sub encode_pod {[m
[31m-    my $s = shift;[m
[31m-    $s =~ s/</E<lt>/g;[m
[31m-    $s =~ s/>/E<gt>/g;[m
[31m-    $s =~ s/\&/E<amp>/g;[m
[31m-    $s =~ s/\|/E<verbar>/g;[m
[31m-    $s =~ s{/}{E<sol>}g;[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub process_table {[m
[31m-    my $s = shift;[m
[31m-    my @rows;[m
[31m-    my @col_w;[m
[31m-    while ($s =~ m{ < \s* tr .*? > (.*?) < \s* / \s* tr \s* >}gx) {[m
[31m-        my $row_s = $1;[m
[31m-        my @cols;[m
[31m-        my $col_id = 0;[m
[31m-        while ($row_s =~ m{< \s* td .*? > (.*?) < \s* / \s* td \s* >}gx) {[m
[31m-            my $fld = decode_xml($1);[m
[31m-            push @cols, $fld;[m
[31m-            my $len = length $fld;[m
[31m-            my $max_len = $col_w[$col_id];[m
[31m-            if (!defined $max_len || $len > $max_len) {[m
[31m-                $col_w[$col_id] = $len;[m
[31m-            }[m
[31m-            $col_id++;[m
[31m-        }[m
[31m-        push @rows, \@cols;[m
[31m-    }[m
[31m-[m
[31m-    my $pod = "\n";[m
[31m-    for my $row (@rows) {[m
[31m-        my @fld_pod;[m
[31m-        my $i = 0;[m
[31m-        for my $fld (@$row) {[m
[31m-            my $len = $col_w[$i];[m
[31m-            push @fld_pod, sprintf("\%${len}s", $fld);[m
[31m-            $i++;[m
[31m-        }[m
[31m-        $pod .= join("  ", @fld_pod) . "\n";[m
[31m-    }[m
[31m-[m
[31m-    return $pod;[m
[31m-}[m
[31m-[m
[31m-sub decode_xml {[m
[31m-    my $s = shift;[m
[31m-    $s =~ s/\&quot;/"/g;[m
[31m-    $s =~ s/\&amp;/&/g;[m
[31m-    $s =~ s/\&apos;/'/g;[m
[31m-    $s =~ s/\&lt;/</g;[m
[31m-    $s =~ s/\&gt;/>/g;[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub parse_attrs {[m
[31m-    my $s = shift;[m
[31m-    my %kv;[m
[31m-    while ($s =~ / (\w+) \s* = \s* " (.*?) " /gx) {[m
[31m-        my ($k, $v) = ($1, $2);[m
[31m-        $kv{$k} = decode_xml($v);[m
[31m-    }[m
[31m-    return \%kv;[m
[31m-}[m
[31m-[m
[31m-sub pos_str {[m
[31m-    my $pos = pos $_[0];[m
[31m-    my ($ln, $col);[m
[31m-    if (!defined $pos) {[m
[31m-        $pos = 0;[m
[31m-        $ln = 1;[m
[31m-        $col = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        my $s = substr $_[0], 0, $pos;[m
[31m-        $ln = 1;[m
[31m-        while ($s =~ /\n/gc) {[m
[31m-            $ln++;[m
[31m-        }[m
[31m-        $s =~ /\G (.*) /gcx;[m
[31m-        $col = 1 + length $1;[m
[31m-    }[m
[31m-[m
[31m-    return "pos $pos, line $ln, col $col";[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/resty b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/resty[m
[1mdeleted file mode 100755[m
[1mindex a43832a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/resty[m
[1m+++ /dev/null[m
[36m@@ -1,503 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-# Copyright (C) Yichun Zhang (agentzh)[m
[31m-# Copyright (C) Guanlan Dai[m
[31m-[m
[31m-# TODO: port this script into the nginx core for greater flexibility[m
[31m-# and better performance.[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-our $VERSION = '0.12';[m
[31m-[m
[31m-use File::Spec ();[m
[31m-use FindBin ();[m
[31m-use List::Util qw( max );[m
[31m-use Getopt::Long qw( GetOptions :config no_ignore_case require_order);[m
[31m-use File::Temp qw( tempdir );[m
[31m-use POSIX qw( WNOHANG );[m
[31m-[m
[31m-sub resolve_includes {[m
[31m-    my $type = shift;[m
[31m-    my @paths = map {[m
[31m-        my $abs_path = File::Spec->rel2abs($_);[m
[31m-        unless (-f $abs_path) {[m
[31m-          die "Could not find $type include '$abs_path'";[m
[31m-        }[m
[31m-        "include $abs_path;";[m
[31m-    } @_;[m
[31m-    return join("\n", @paths);[m
[31m-}[m
[31m-[m
[31m-my @all_args = @ARGV;[m
[31m-[m
[31m-my (@http_includes, @main_includes, @src_a);[m
[31m-[m
[31m-GetOptions("c=i",             \(my $conns_num),[m
[31m-           "e=s",             \@src_a,[m
[31m-           "h|help",          \(my $help),[m
[31m-           "http-include=s",  \@http_includes,[m
[31m-           "I=s@",            \(my $Inc),[m
[31m-           "main-include=s",  \@main_includes,[m
[31m-           "nginx=s",         \(my $nginx_path),[m
[31m-           "valgrind",        \(my $use_valgrind),[m
[31m-           "valgrind-opts=s", \(my $valgrind_opts),[m
[31m-           "V|v",             \(my $version))[m
[31m-   or die usage(1);[m
[31m-[m
[31m-my $src;[m
[31m-if (@src_a) {[m
[31m-    $src = join('; ', @src_a);[m
[31m-}[m
[31m-[m
[31m-if ($help) {[m
[31m-    usage(0);[m
[31m-}[m
[31m-[m
[31m-if (!$nginx_path) {[m
[31m-    use Config;[m
[31m-    my $ext = $Config{_exe};[m
[31m-    if (!$ext) {[m
[31m-        if ($^O eq 'msys') {[m
[31m-            $ext = '.exe';[m
[31m-        } else {[m
[31m-            $ext = '';[m
[31m-        }[m
[31m-    }[m
[31m-    $nginx_path = File::Spec->catfile($FindBin::Bin, "..", "nginx", "sbin", "nginx$ext");[m
[31m-    if (!-f $nginx_path) {[m
[31m-        $nginx_path = File::Spec->catfile($FindBin::Bin, "nginx$ext");[m
[31m-        if (!-f $nginx_path) {[m
[31m-            $nginx_path = "nginx";  # find in PATH[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#warn $nginx_path;[m
[31m-[m
[31m-if ($version) {[m
[31m-    warn "resty $VERSION\n";[m
[31m-    my $cmd = "$nginx_path -V";[m
[31m-    exec $cmd or die "Failed to run command \"$cmd\": $!\n";[m
[31m-}[m
[31m-[m
[31m-my $lua_package_path_config = '';[m
[31m-if (defined $Inc) {[m
[31m-    my $package_path = "";[m
[31m-    my $package_cpath = "";[m
[31m-    for my $dir (@$Inc) {[m
[31m-        if (!-d $dir) {[m
[31m-            die "Search directory $dir is not found.\n";[m
[31m-        }[m
[31m-        $package_path .= File::Spec->catfile($dir, "?.lua;");[m
[31m-        $package_cpath .= File::Spec->catfile($dir, "?.so;");[m
[31m-    }[m
[31m-    $lua_package_path_config = <<_EOC_;[m
[31m-    lua_package_path "$package_path;";[m
[31m-    lua_package_cpath "$package_cpath;";[m
[31m-_EOC_[m
[31m-}[m
[31m-[m
[31m-my $luafile = shift;[m
[31m-if (!defined $src and !defined $luafile) {[m
[31m-    die qq{Neither Lua input file nor -e "" option specified.\n};[m
[31m-}[m
[31m-[m
[31m-my $conns = $conns_num || 64;[m
[31m-[m
[31m-my @nameservers;[m
[31m-[m
[31m-# try to read the nameservers used by the system resolver:[m
[31m-if (open my $in, "/etc/resolv.conf") {[m
[31m-    while (<$in>) {[m
[31m-        if (/^\s*nameserver\s+(\d+(?:\.\d+){3})(?:\s+|$)/) {[m
[31m-            push @nameservers, $1;[m
[31m-            if (@nameservers > 10) {[m
[31m-                last;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-    close $in;[m
[31m-}[m
[31m-[m
[31m-if (!@nameservers) {[m
[31m-    # default to Google's open DNS servers[m
[31m-    push @nameservers, "8.8.8.8", "8.8.4.4";[m
[31m-}[m
[31m-[m
[31m-#warn "@nameservers\n";[m
[31m-[m
[31m-my $prefix_dir;[m
[31m-if ($^O eq 'msys') {[m
[31m-    # to work around a bug in msys perl (at least 5.8.8 msys 64int)[m
[31m-    $prefix_dir = "resty_cli_temp";[m
[31m-    if (-d $prefix_dir) {[m
[31m-        system("rm -rf $prefix_dir") == 0 or die $!;[m
[31m-    }[m
[31m-    mkdir $prefix_dir or die "failed to mkdir $prefix_dir: $!";[m
[31m-[m
[31m-} else {[m
[31m-    $prefix_dir = tempdir(CLEANUP => 1);[m
[31m-    if ($^O eq 'MSWin32') {[m
[31m-        require Win32;[m
[31m-        $prefix_dir = Win32::GetLongPathName($prefix_dir);[m
[31m-    }[m
[31m-}[m
[31m-#warn "prefix dir: $prefix_dir\n";[m
[31m-[m
[31m-my $logs_dir = File::Spec->catfile($prefix_dir, "logs");[m
[31m-mkdir $logs_dir or die "failed to mkdir $logs_dir: $!";[m
[31m-[m
[31m-my $conf_dir = File::Spec->catfile($prefix_dir, "conf");[m
[31m-mkdir $conf_dir or die "failed to mkdir $conf_dir: $!";[m
[31m-[m
[31m-my $inline_lua = '';[m
[31m-my $quoted_luafile;[m
[31m-if (defined $src) {[m
[31m-    my $file = File::Spec->catfile($conf_dir, "a.lua");[m
[31m-    open my $out, ">$file"[m
[31m-        or die "Cannot open $file for writing: $!\n";[m
[31m-    print $out $src;[m
[31m-    close $out;[m
[31m-    my $chunk_name = "=(command line -e)";[m
[31m-    $quoted_luafile = quote_as_lua_str($file);[m
[31m-[m
[31m-    $inline_lua = <<"_EOC_";[m
[31m-                local fname = $quoted_luafile[m
[31m-                local f = assert(io.open(fname, "r"))[m
[31m-                local chunk = f:read("*a")[m
[31m-                local inline_gen = assert(loadstring(chunk, "$chunk_name"))[m
[31m-_EOC_[m
[31m-}[m
[31m-[m
[31m-my $file_lua = '';[m
[31m-if (defined $luafile) {[m
[31m-    my $chunk_name = "\@$luafile";[m
[31m-    $quoted_luafile = quote_as_lua_str($luafile);[m
[31m-    $file_lua = <<"_EOC_";[m
[31m-                local fname = $quoted_luafile[m
[31m-                local f = assert(io.open(fname, "r"))[m
[31m-                local chunk = f:read("*a")[m
[31m-                local file_gen = assert(loadstring(chunk, "$chunk_name"))[m
[31m-_EOC_[m
[31m-}[m
[31m-[m
[31m-my @user_args =  @ARGV;[m
[31m-my $args = gen_lua_code_for_args(\@user_args, \@all_args);[m
[31m-[m
[31m-my $loader = <<_EOC_;[m
[31m-            local gen[m
[31m-            do[m
[31m-                $args[m
[31m-$inline_lua[m
[31m-$file_lua[m
[31m-[m
[31m-                gen = function()[m
[31m-                  if inline_gen then inline_gen() end[m
[31m-                  if file_gen then file_gen() end[m
[31m-                end[m
[31m-            end[m
[31m-_EOC_[m
[31m-[m
[31m-my $env_list = '';[m
[31m-for my $var (sort keys %ENV) {[m
[31m-    #warn $var;[m
[31m-    $env_list .= "env $var;\n";[m
[31m-}[m
[31m-[m
[31m-my $main_include_directives = resolve_includes('main', @main_includes);[m
[31m-my $http_include_directives = resolve_includes('http', @http_includes);[m
[31m-[m
[31m-my $conf_file = File::Spec->catfile($conf_dir, "nginx.conf");[m
[31m-open my $out, ">$conf_file"[m
[31m-    or die "Cannot open $conf_file for writing: $!\n";[m
[31m-[m
[31m-print $out <<_EOC_;[m
[31m-daemon off;[m
[31m-master_process off;[m
[31m-worker_processes 1;[m
[31m-pid logs/nginx.pid;[m
[31m-[m
[31m-$env_list[m
[31m-[m
[31m-error_log stderr warn;[m
[31m-#error_log stderr debug;[m
[31m-[m
[31m-events {[m
[31m-    worker_connections $conns;[m
[31m-}[m
[31m-[m
[31m-$main_include_directives[m
[31m-[m
[31m-http {[m
[31m-    access_log off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver @nameservers;[m
[31m-$lua_package_path_config[m
[31m-    $http_include_directives[m
[31m-    init_by_lua '[m
[31m-        local stdout = io.stdout[m
[31m-        local ngx_null = ngx.null[m
[31m-        local maxn = table.maxn[m
[31m-        local unpack = unpack[m
[31m-        local concat = table.concat[m
[31m-[m
[31m-        local expand_table[m
[31m-        function expand_table(src, inplace)[m
[31m-            local n = maxn(src)[m
[31m-            local dst = inplace and src or {}[m
[31m-            for i = 1, n do[m
[31m-                local arg = src[i][m
[31m-                local typ = type(arg)[m
[31m-                if arg == nil then[m
[31m-                    dst[i] = "nil"[m
[31m-[m
[31m-                elseif typ == "boolean" then[m
[31m-                    if arg then[m
[31m-                        dst[i] = "true"[m
[31m-                    else[m
[31m-                        dst[i] = "false"[m
[31m-                    end[m
[31m-[m
[31m-                elseif arg == ngx_null then[m
[31m-                    dst[i] = "null"[m
[31m-[m
[31m-                elseif typ == "table" then[m
[31m-                    dst[i] = expand_table(arg, false)[m
[31m-[m
[31m-                elseif typ ~= "string" then[m
[31m-                    dst[i] = tostring(arg)[m
[31m-[m
[31m-                else[m
[31m-                    dst[i] = arg[m
[31m-                end[m
[31m-            end[m
[31m-            return concat(dst)[m
[31m-        end[m
[31m-[m
[31m-        local function output(...)[m
[31m-            local args = {...}[m
[31m-[m
[31m-            return stdout:write(expand_table(args, true))[m
[31m-        end[m
[31m-[m
[31m-        ngx.print = output[m
[31m-        ngx.say = function (...)[m
[31m-                local ok, err = output(...)[m
[31m-                if ok then[m
[31m-                    return output("\\\\n")[m
[31m-                end[m
[31m-                return ok, err[m
[31m-            end[m
[31m-        print = ngx.say[m
[31m-[m
[31m-        ngx.flush = function (...) return stdout:flush() end[m
[31m-        -- we cannot close stdout here due to a bug in Lua:[m
[31m-        ngx.eof = function (...) return true end[m
[31m-        ngx.exit = os.exit[m
[31m-    ';[m
[31m-[m
[31m-    init_worker_by_lua '[m
[31m-        local exit = os.exit[m
[31m-        local stderr = io.stderr[m
[31m-[m
[31m-        local function handle_err(err)[m
[31m-            if err then[m
[31m-                err = string.gsub(err, "^init_worker_by_lua:%d+: ", "")[m
[31m-                stderr:write(err, "\\\\n")[m
[31m-            end[m
[31m-            return exit(1)[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = pcall(function ()[m
[31m-            if not ngx.config[m
[31m-               or not ngx.config.ngx_lua_version[m
[31m-               or ngx.config.ngx_lua_version < 9011[m
[31m-            then[m
[31m-                error("at least ngx_lua 0.9.12 is required")[m
[31m-            end[m
[31m-[m
[31m-$loader[m
[31m-            -- print("calling timer.at...")[m
[31m-            local ok, err = ngx.timer.at(0, function ()[m
[31m-                -- io.stderr:write("timer firing")[m
[31m-                local ok, err = pcall(gen)[m
[31m-                if not ok then[m
[31m-                    return handle_err(err)[m
[31m-                end[m
[31m-                local rc = err[m
[31m-                if rc and type(rc) ~= "number" then[m
[31m-                    return handle_err("bad return value of type " .. type(rc))[m
[31m-                end[m
[31m-                return exit(rc)[m
[31m-            end)[m
[31m-            if not ok then[m
[31m-                return handle_err(err)[m
[31m-            end[m
[31m-            -- print("timer created")[m
[31m-        end)[m
[31m-[m
[31m-        if not ok then[m
[31m-            return handle_err(err)[m
[31m-        end[m
[31m-    ';[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-close $out;[m
[31m-[m
[31m-my @cmd = ($nginx_path, '-p', "$prefix_dir/", '-c', "conf/nginx.conf");[m
[31m-[m
[31m-if ($use_valgrind) {[m
[31m-    my @new = ('valgrind');[m
[31m-    if ($valgrind_opts) {[m
[31m-        $valgrind_opts =~ s/^\s+|\s+$//g;[m
[31m-        push @new, split /\s+/, $valgrind_opts;[m
[31m-    }[m
[31m-    unshift @cmd, @new;[m
[31m-}[m
[31m-[m
[31m-my $child_pid;[m
[31m-[m
[31m-sub sigint {[m
[31m-    $SIG{INT} = \&sigint;[m
[31m-    if ($child_pid) {[m
[31m-        kill INT => $child_pid;[m
[31m-    }[m
[31m-}[m
[31m-$SIG{INT} = \&sigint;[m
[31m-[m
[31m-my $pid = fork();[m
[31m-[m
[31m-if (!defined $pid) {[m
[31m-    die "fork() failed: $!\n";[m
[31m-}[m
[31m-[m
[31m-if ($pid == 0) {  # child process[m
[31m-    #warn "exec @cmd...";[m
[31m-    exec(@cmd)[m
[31m-        or die "Failed to run command \"@cmd\": $!\n";[m
[31m-[m
[31m-} else {[m
[31m-    $child_pid = $pid;[m
[31m-    waitpid($child_pid, 0);[m
[31m-    my $rc = 0;[m
[31m-    if (defined $?) {[m
[31m-        $rc = ($? >> 8);[m
[31m-    }[m
[31m-    exit($rc);[m
[31m-}[m
[31m-[m
[31m-sub usage {[m
[31m-    my $rc = shift;[m
[31m-    my $msg = <<_EOC_;[m
[31m-resty [options] [lua-file [args]][m
[31m-[m
[31m-Options:[m
[31m-    -c num              Set maximal connection count (default: 64).[m
[31m-    -e prog             Run the inlined Lua code in "prog".[m
[31m-    --help              Print this help.[m
[31m-[m
[31m-    --http-include path Include the specified file in the nginx http configuration block[m
[31m-                        (multiple instances are supported).[m
[31m-[m
[31m-    -I dir              Add dir to the search paths for Lua libraries.[m
[31m-[m
[31m-    --main-include path Include the specified file in the nginx main configuration block[m
[31m-                        (multiple instances are supported).[m
[31m-[m
[31m-    --nginx             Specify the nginx path (this option might be removed in the future).[m
[31m-    -V                  Print version numbers and nginx configurations.[m
[31m-    --valgrind          Use valgrind to run nginx[m
[31m-    --valgrind-opts     Pass extra options to valgrind[m
[31m-[m
[31m-For bug reporting instructions, please see:[m
[31m-[m
[31m-    <https://openresty.org/en/community.html>[m
[31m-[m
[31m-Copyright (C) Yichun Zhang (agentzh). All rights reserved.[m
[31m-_EOC_[m
[31m-    if ($rc == 0) {[m
[31m-        print $msg;[m
[31m-        exit(0);[m
[31m-    }[m
[31m-[m
[31m-    warn $msg;[m
[31m-    exit($rc);[m
[31m-}[m
[31m-[m
[31m-sub get_bracket_level {[m
[31m-    my %bracket_levels;[m
[31m-    my $bracket_level = 0;[m
[31m-    my $max_level = 0;[m
[31m-[m
[31m-    # scan all args and store level of closing brackets[m
[31m-    for my $arg (@_) {[m
[31m-        while ($arg =~ /\](=*)\]/g) {[m
[31m-            my $level = length($1);[m
[31m-            if ($level > $max_level) {[m
[31m-                $max_level = $level;[m
[31m-            }[m
[31m-            $bracket_levels{$level} = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    # if args contain closing bracket[m
[31m-    if (%bracket_levels) {[m
[31m-        # find the shortest form of the long brackets accordingly[m
[31m-        for (my $i = 1; $i < $max_level; $i++) {[m
[31m-            if (!exists $bracket_levels{$i}) {[m
[31m-                $bracket_level = $i;[m
[31m-                last;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if ($bracket_level == 0) {[m
[31m-            $bracket_level = $max_level + 1;[m
[31m-        }[m
[31m-        return $bracket_level;[m
[31m-    }[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-sub quote_as_lua_str {[m
[31m-    my ($str) = @_;[m
[31m-    my $bracket_level = get_bracket_level($str);[m
[31m-    my $left_bracket = "[" . "=" x $bracket_level . "[";[m
[31m-    my $right_bracket = "]" . "=" x $bracket_level . "]";[m
[31m-[m
[31m-    return $left_bracket . $str . $right_bracket;[m
[31m-}[m
[31m-[m
[31m-sub gen_lua_code_for_args {[m
[31m-    my ($user_args, $all_args) = @_;[m
[31m-[m
[31m-    my $luasrc = "arg = {}\n";[m
[31m-[m
[31m-    # args[n] (n = 0)[m
[31m-    $luasrc .= "arg[0] = $quoted_luafile\n";[m
[31m-[m
[31m-    # args[n] (n > 0)[m
[31m-    for my $i (0 .. $#user_args) {[m
[31m-        my $index = $i + 1;[m
[31m-        my $quoted_arg = quote_as_lua_str($user_args[$i]);[m
[31m-        $luasrc .= "arg[$index] = $quoted_arg\n";[m
[31m-    }[m
[31m-[m
[31m-    # args[n] (n < 0)[m
[31m-    my $left_num = $#all_args - $#user_args;[m
[31m-    for my $i (0 .. $left_num - 2) {[m
[31m-        my $index = 0 - $left_num + $i + 1;[m
[31m-        my $quoted_arg = quote_as_lua_str($all_args[$i]);[m
[31m-        $luasrc .= "arg[$index] = $quoted_arg\n";[m
[31m-    }[m
[31m-[m
[31m-    # args[n] (n = the index of resty-cli itself)[m
[31m-    my $index = 0 - $left_num;[m
[31m-    my $quoted_arg = quote_as_lua_str($0);[m
[31m-    $luasrc .= "arg[$index] = $quoted_arg\n";[m
[31m-[m
[31m-    #warn $luasrc;[m
[31m-    return $luasrc;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/restydoc b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/restydoc[m
[1mdeleted file mode 100755[m
[1mindex 87d3f07..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/restydoc[m
[1m+++ /dev/null[m
[36m@@ -1,598 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-our $VERSION = '0.12';[m
[31m-[m
[31m-use Getopt::Std qw( getopts );[m
[31m-use File::Spec ();[m
[31m-use FindBin ();[m
[31m-use File::Temp qw( tempfile );[m
[31m-[m
[31m-my %opts;[m
[31m-getopts("vhs:", \%opts)[m
[31m-    or usage(1);[m
[31m-[m
[31m-if ($opts{h}) {[m
[31m-    usage(0);[m
[31m-}[m
[31m-[m
[31m-if ($opts{v}) {[m
[31m-    print "restydoc $VERSION\n";[m
[31m-    exit;[m
[31m-}[m
[31m-[m
[31m-my $section_pat = $opts{s};[m
[31m-my $module_pat = shift;[m
[31m-[m
[31m-if (!$section_pat && !$module_pat) {[m
[31m-    print STDERR "ERROR: you need to specify a module name or ",[m
[31m-                 "a section name.\n\n";[m
[31m-    usage(1);[m
[31m-}[m
[31m-[m
[31m-my $interactive = (-t STDOUT);[m
[31m-my $pager = $ENV{RESTYDOC_PAGER};[m
[31m-my $on_win32 = ($^O eq 'msys' || $^O eq 'MSWin32');[m
[31m-if (!defined $pager) {[m
[31m-    if ($^O eq 'MSWin32') {[m
[31m-        $pager = 'more';[m
[31m-    } else {[m
[31m-        $pager = 'less -nR';[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-my $index_file = "$FindBin::Bin/../resty.index";[m
[31m-{[m
[31m-    if (!-f $index_file) {[m
[31m-        my $f = "$FindBin::Bin/resty.index";[m
[31m-        if (-f $f) {[m
[31m-            $index_file = $f;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-$index_file = File::Spec->canonpath($index_file);[m
[31m-open my $in, $index_file[m
[31m-    or die "cannot open $index_file for reading: $!\n";[m
[31m-[m
[31m-my ($dist, @dists, $module, %modules, @modules, %module2dist);[m
[31m-while (<$in>) {[m
[31m-    next if / ^ \s* $ /x;[m
[31m-[m
[31m-    if (/ ^ module \s+ (\S+) \s* $/x) {[m
[31m-        my $name = $1;[m
[31m-        $module = {[m
[31m-            name => $name,[m
[31m-            priority => $.,  # smaller priority means higher priority.[m
[31m-            index => scalar @modules,[m
[31m-        };[m
[31m-[m
[31m-        my $old_module = $modules{$name};[m
[31m-        if (defined $old_module) {[m
[31m-            undef $modules[$old_module->{index}];[m
[31m-        }[m
[31m-[m
[31m-        undef $dist;[m
[31m-[m
[31m-        $modules{$name} = $module;[m
[31m-        push @modules, $module;[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/ ^ \s* section \s+ (\d+) \s+ (\d+) \s+ (\S.*) $ /xm) {[m
[31m-        my ($from, $to, $title) = ($1, $2, $3);[m
[31m-        $title =~ s/\s+$//;[m
[31m-[m
[31m-        if ($from > $to) {[m
[31m-            die "ERROR: $index_file: line $.: invalid \"from\" and ",[m
[31m-                "\"to\" fields.\n";[m
[31m-        }[m
[31m-[m
[31m-        undef $dist;[m
[31m-[m
[31m-        if (!defined $module) {[m
[31m-            die "ERROR: $index_file: line $.: unepxected section line.\n";[m
[31m-        }[m
[31m-[m
[31m-        my $sections = $module->{sections};[m
[31m-        if (!defined $sections) {[m
[31m-            $sections = [];[m
[31m-            $module->{sections} = $sections;[m
[31m-        }[m
[31m-[m
[31m-        push @$sections, {[m
[31m-            title => $title,[m
[31m-            from => $from,[m
[31m-            to => $to,[m
[31m-        };[m
[31m-[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/ ^ dist \s+ (\S+) \s* $/x) {[m
[31m-        undef $module;[m
[31m-        $dist = {[m
[31m-            dist => $1,[m
[31m-        };[m
[31m-        push @dists, $dist;[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/ ^ \s+ version \s+ (\S+) \s* $/x) {[m
[31m-        my $ver = $1;[m
[31m-        if (!defined $dist) {[m
[31m-            die "ERROR: $index_file: line $.: unexpected version line.\n";[m
[31m-        }[m
[31m-        $dist->{version} = $ver;[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/ ^ \s+ aliases \s+ (\S.*) $/x) {[m
[31m-        (my $s = $1) =~ s/\s+$//;[m
[31m-        my @elems = split /\s+/, $s;[m
[31m-        if (!defined $dist && !defined $module) {[m
[31m-            die "ERROR: $index_file: line $.: unexpected aliases line.\n";[m
[31m-        }[m
[31m-        if (@elems) {[m
[31m-            if (defined $dist) {[m
[31m-                my %aliases = map { ($_ => 1) } @elems;[m
[31m-                $dist->{aliases} = \%aliases;[m
[31m-            } else {[m
[31m-                for my $alias (@elems) {[m
[31m-                    if (!defined $modules{$alias}) {[m
[31m-                        #warn "add module alias $alias for $module->{name}";[m
[31m-                        $modules{$alias} = $module;[m
[31m-[m
[31m-                        my $dist = $module2dist{$module->{name}};[m
[31m-                        $dist->{modules}{$alias} = $module;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/ ^ \s+ modules \s+ (\S.*) $/x) {[m
[31m-        (my $s = $1) =~ s/\s+$//;[m
[31m-        if (!defined $dist) {[m
[31m-            die "ERROR: $index_file: line $.: unexpected modules line.\n";[m
[31m-        }[m
[31m-        my @elems = split /\s+/, $s;[m
[31m-        if (@elems) {[m
[31m-            my %modules = map { ($_ => 1) } @elems;[m
[31m-            $dist->{modules} = \%modules;[m
[31m-            for my $elem (@elems) {[m
[31m-                $module2dist{$elem} = $dist;[m
[31m-            }[m
[31m-        }[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    die "ERROR: $index_file: line $.: syntax error: $_";[m
[31m-}[m
[31m-[m
[31m-close $in;[m
[31m-[m
[31m-if (!@dists) {[m
[31m-    die "ERROR: $index_file is empty.\n";[m
[31m-}[m
[31m-[m
[31m-my $poddir = "$FindBin::Bin/../pod";[m
[31m-[m
[31m-if ($section_pat) {[m
[31m-    $section_pat = lc $section_pat;[m
[31m-[m
[31m-    for my $module (values %modules) {[m
[31m-        my $sections = $module->{sections};[m
[31m-        next if !defined $sections;[m
[31m-        my %dict;[m
[31m-        for my $sec (@$sections) {[m
[31m-            my $title = $sec->{title};[m
[31m-            next if exists $dict{$title};[m
[31m-            $dict{$title} = $sec;[m
[31m-        }[m
[31m-        $module->{section_dict} = \%dict;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-if ($module_pat) {[m
[31m-    if ($module_pat =~ m{/|\.\.}) {[m
[31m-        die "Invalid module pattern \"$module_pat\".\n";[m
[31m-    }[m
[31m-[m
[31m-    $module_pat = lc $module_pat;[m
[31m-[m
[31m-    my ($hit_dist, $hit_module_name) = find_module($module_pat);[m
[31m-[m
[31m-    if (defined $hit_dist && !$section_pat) {[m
[31m-        process_module_hit($hit_dist, $hit_module_name);[m
[31m-        exit;[m
[31m-    }[m
[31m-[m
[31m-    if (!defined $section_pat) {[m
[31m-        die "Documentation for module pattern \"$module_pat\" not found.\n";[m
[31m-    }[m
[31m-[m
[31m-    # look for the section in the module[m
[31m-[m
[31m-    my $module = $modules{$hit_module_name};[m
[31m-    if (!defined $module) {[m
[31m-        die "No \"module\" record found for $hit_module_name.\n";[m
[31m-    }[m
[31m-[m
[31m-    # 1. attempt an exact match.[m
[31m-[m
[31m-    my $section_dict = $module->{section_dict};[m
[31m-    #require Data::Dumper;[m
[31m-    #warn Data::Dumper::Dumper($section_dict);[m
[31m-[m
[31m-    my $hit_section = $section_dict->{$section_pat};[m
[31m-    if (defined $hit_section) {[m
[31m-        process_section_hit($hit_dist, $hit_section, $hit_module_name);[m
[31m-        exit;[m
[31m-    }[m
[31m-[m
[31m-    # 2. attemp a prefix match.[m
[31m-[m
[31m-    my $sections = $module->{sections};[m
[31m-    for my $sec (@$sections) {[m
[31m-        if ($sec->{title} =~ / ^ \Q$section_pat\E /x) {[m
[31m-            process_section_hit($hit_dist, $sec, $hit_module_name);[m
[31m-            exit;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    # 3. attemp a contains match.[m
[31m-[m
[31m-    for my $sec (@$sections) {[m
[31m-        if ($sec->{title} =~ / \Q$section_pat\E /x) {[m
[31m-            process_section_hit($hit_dist, $sec, $hit_module_name);[m
[31m-            exit;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    die "Documentation for section pattern \"$section_pat\" in ",[m
[31m-        "module $hit_module_name not found.\n";[m
[31m-}[m
[31m-[m
[31m-# when only the section pattern is specified.[m
[31m-[m
[31m-for my $module (@modules) {[m
[31m-    next if !defined $module;[m
[31m-[m
[31m-    my $module_name = $module->{name};[m
[31m-    my $dist = $module2dist{$module_name};[m
[31m-    if (!defined $dist) {[m
[31m-        die "ERROR: $index_file: module $module_name does not ",[m
[31m-            "belong to any distributions.\n";[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-# 1. attempt an exact match.[m
[31m-[m
[31m-for my $module (@modules) {[m
[31m-    next if !defined $module;[m
[31m-[m
[31m-    my $module_name = $module->{name};[m
[31m-    my $dist = $module2dist{$module_name};[m
[31m-[m
[31m-    my $section_dict = $module->{section_dict};[m
[31m-    #require Data::Dumper;[m
[31m-    #warn Data::Dumper::Dumper($section_dict);[m
[31m-[m
[31m-    my $hit_section = $section_dict->{$section_pat};[m
[31m-    if (defined $hit_section) {[m
[31m-        process_section_hit($dist, $hit_section, $module_name);[m
[31m-        exit;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-# 2. attemp a prefix match.[m
[31m-[m
[31m-for my $module (@modules) {[m
[31m-    next if !defined $module;[m
[31m-[m
[31m-    my $module_name = $module->{name};[m
[31m-    my $dist = $module2dist{$module_name};[m
[31m-[m
[31m-    my $sections = $module->{sections};[m
[31m-    for my $sec (@$sections) {[m
[31m-        if ($sec->{title} =~ / ^ \Q$section_pat\E /x) {[m
[31m-            process_section_hit($dist, $sec, $module_name);[m
[31m-            exit;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-# 3. attemp a contains match.[m
[31m-[m
[31m-for my $module (@modules) {[m
[31m-    next if !defined $module;[m
[31m-[m
[31m-    my $module_name = $module->{name};[m
[31m-    my $dist = $module2dist{$module_name};[m
[31m-    my $sections = $module->{sections};[m
[31m-[m
[31m-    for my $sec (@$sections) {[m
[31m-        if ($sec->{title} =~ / \Q$section_pat\E /x) {[m
[31m-            process_section_hit($dist, $sec, $module_name);[m
[31m-            exit;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-die "Documentation for section pattern \"$section_pat\" not found.\n";[m
[31m-[m
[31m-sub find_module {[m
[31m-    my $pat = shift;[m
[31m-[m
[31m-    my ($hit, $name);[m
[31m-[m
[31m-    # 1. attempt an exact match[m
[31m-[m
[31m-    for my $r (@dists) {[m
[31m-        if ($r->{dist} eq $pat) {[m
[31m-            #warn "Hit dist!";[m
[31m-            $hit = $r;[m
[31m-            $name = $pat;[m
[31m-            last;[m
[31m-        }[m
[31m-[m
[31m-        if (defined $r->{modules} && $r->{modules}{$pat}) {[m
[31m-            #warn "Hit module!";[m
[31m-            $hit = $r;[m
[31m-            my $module = $modules{$pat};[m
[31m-            $name = $module->{name};[m
[31m-            last;[m
[31m-        }[m
[31m-[m
[31m-        if (defined $r->{aliases} && $r->{aliases}{$pat}) {[m
[31m-            #warn "HIT dist alias!";[m
[31m-            $hit = $r;[m
[31m-            $name = $r->{dist};[m
[31m-            last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (defined $hit) {[m
[31m-        if (!defined $hit->{modules} || !$hit->{modules}{$name}) {[m
[31m-            #warn "HERE";[m
[31m-            die "No documentation found for module $pat.\n";[m
[31m-        }[m
[31m-[m
[31m-        return $hit, $name;[m
[31m-    }[m
[31m-[m
[31m-    # 2. attempt a prefix match[m
[31m-[m
[31m-    for my $r (@dists) {[m
[31m-        if ($r->{dist} =~ / ^ \Q$pat\E/x) {[m
[31m-            #warn "Hit dist prefix!";[m
[31m-            $hit = $r;[m
[31m-            $name = $r->{dist};[m
[31m-            last;[m
[31m-        }[m
[31m-[m
[31m-        my $modules = $r->{modules};[m
[31m-        if (defined $modules) {[m
[31m-            for my $module (keys %$modules) {[m
[31m-                if ($module =~ / ^ \Q$pat\E /x) {[m
[31m-                    $hit = $r;[m
[31m-                    $name = $module;[m
[31m-                    last;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (defined $hit) {[m
[31m-                last;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        my $aliases = $r->{aliases};[m
[31m-        if (defined $aliases) {[m
[31m-            for my $alias (keys %$aliases) {[m
[31m-                if ($alias =~ / ^ \Q$pat\E /x) {[m
[31m-                    $hit = $r;[m
[31m-                    $name = $r->{dist};[m
[31m-                    last;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (defined $hit) {[m
[31m-                last;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (defined $hit) {[m
[31m-        return $hit, $name;[m
[31m-    }[m
[31m-[m
[31m-    # 3. attempt a contains search[m
[31m-[m
[31m-    for my $r (@dists) {[m
[31m-        if ($r->{dist} =~ / \Q$pat\E/x) {[m
[31m-            $hit = $r;[m
[31m-            $name = $r->{dist};[m
[31m-            last;[m
[31m-        }[m
[31m-[m
[31m-        my $modules = $r->{modules};[m
[31m-        if (defined $modules) {[m
[31m-            for my $module (keys %$modules) {[m
[31m-                if ($module =~ / \Q$pat\E /x) {[m
[31m-                    $hit = $r;[m
[31m-                    $name = $r->{dist};[m
[31m-                    last;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (defined $hit) {[m
[31m-                last;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        my $aliases = $r->{aliases};[m
[31m-        if (defined $aliases) {[m
[31m-            for my $alias (keys %$aliases) {[m
[31m-                if ($alias =~ / \Q$pat\E /x) {[m
[31m-                    $hit = $r;[m
[31m-                    $name = $r->{dist};[m
[31m-                    last;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (defined $hit) {[m
[31m-                last;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (defined $hit) {[m
[31m-        return $hit, $name;[m
[31m-    }[m
[31m-[m
[31m-    die "No documentation found for module pattern $pat.\n";[m
[31m-}[m
[31m-[m
[31m-sub process_section_hit {[m
[31m-    my ($dist, $section, $module_name) = @_;[m
[31m-[m
[31m-    my $dist_name = $dist->{dist};[m
[31m-    my $dist_ver = $dist->{version};[m
[31m-    my $full_dist_name;[m
[31m-    if (defined $dist_ver) {[m
[31m-        $full_dist_name = "$dist_name $dist_ver";[m
[31m-    } else {[m
[31m-        $full_dist_name = $dist_name;[m
[31m-    }[m
[31m-[m
[31m-    my $podfile = "$poddir/$dist_name/$module_name.pod";[m
[31m-    open my $in, $podfile[m
[31m-        or die "Cannot open $podfile for reading: $!\n";[m
[31m-[m
[31m-    my $from = $section->{from};[m
[31m-    if (!defined $from) {[m
[31m-        die "No from defined in section $section->{title} in module $module_name.\n";[m
[31m-    }[m
[31m-[m
[31m-    seek $in, $from, 0[m
[31m-        or die "Cannot seek to $section->{from} in file $podfile: $!\n";[m
[31m-[m
[31m-    my $pod;[m
[31m-    my $to = $section->{to};[m
[31m-    read $in, $pod, $to - $from[m
[31m-        or die "Cannot read from file $podfile starting from $from through $to";[m
[31m-[m
[31m-    close $in;[m
[31m-[m
[31m-    if (!$pod) {[m
[31m-        die "ERROR: section \"$section->{title}\" is empty.\n";[m
[31m-    }[m
[31m-[m
[31m-    my ($tmp, $tmpfile) = tempfile( CLEANUP => 1, SUFFIX => '.pod' );[m
[31m-[m
[31m-    print $tmp "=encoding utf8\n\n";[m
[31m-[m
[31m-    if ($pod =~ /\A\s*=item/s) {[m
[31m-        print $tmp "=over\n\n";[m
[31m-    }[m
[31m-[m
[31m-    print $tmp $pod;[m
[31m-[m
[31m-    if ($pod =~ /\A\s*=item/s && $pod !~ /=back\s*\z/s) {[m
[31m-        print $tmp "\n\n=back\n";[m
[31m-    }[m
[31m-[m
[31m-    close $tmp;[m
[31m-[m
[31m-    if (!$interactive) {[m
[31m-        exec("pod2text $tmpfile");[m
[31m-    }[m
[31m-[m
[31m-    if ($on_win32) {[m
[31m-        exec("pod2text $tmpfile | $pager");[m
[31m-    }[m
[31m-[m
[31m-    my $groff_cmd = get_groff_cmd();[m
[31m-    exec("pod2man -u -c '$full_dist_name' "[m
[31m-          . " -r -s 7 -n '$module_name' "[m
[31m-          . "$tmpfile | $groff_cmd | $pager");[m
[31m-}[m
[31m-[m
[31m-sub process_module_hit {[m
[31m-    my ($hit, $name) = @_;[m
[31m-[m
[31m-    #warn "Found $name";[m
[31m-    my $dist_name = $hit->{dist};[m
[31m-    my $dist_ver = $hit->{version};[m
[31m-    my $full_dist_name;[m
[31m-    if (defined $dist_ver) {[m
[31m-        $full_dist_name = "$dist_name $dist_ver";[m
[31m-[m
[31m-    } else {[m
[31m-        $full_dist_name = $dist_name;[m
[31m-    }[m
[31m-[m
[31m-    my $podfile = "$poddir/$dist_name/$name.pod";[m
[31m-    if (!-f $podfile) {[m
[31m-        die "POD file $podfile not found.\n";[m
[31m-    }[m
[31m-[m
[31m-    if (!$interactive) {[m
[31m-        exec("pod2text $podfile");[m
[31m-    }[m
[31m-[m
[31m-    if ($on_win32) {[m
[31m-        exec("pod2text $podfile | $pager");[m
[31m-    }[m
[31m-[m
[31m-    my $groff_cmd = get_groff_cmd();[m
[31m-    exec("pod2man -u -c '$full_dist_name' "[m
[31m-          . "-r -s 7 -n '$name' "[m
[31m-          . "$podfile | $groff_cmd | $pager");[m
[31m-}[m
[31m-[m
[31m-sub get_groff_cmd {[m
[31m-    my $cmd = "groff -Kutf8 -Tutf8 -mandoc -Wbreak";[m
[31m-    if (system("echo '=head1 NAME' | pod2man | $cmd > /dev/null 2>&1") == 0) {[m
[31m-        return $cmd;[m
[31m-    }[m
[31m-    return "groff -Tascii -mandoc -Wbreak";[m
[31m-}[m
[31m-[m
[31m-sub shell {[m
[31m-    my $cmd = shift;[m
[31m-[m
[31m-    #warn $cmd;[m
[31m-    system($cmd) == 0[m
[31m-        or die "failed to run command \"$cmd\": $!\n";[m
[31m-}[m
[31m-[m
[31m-sub usage {[m
[31m-    my $code = shift;[m
[31m-    my $msg = <<_EOC_;[m
[31m-Usage:[m
[31m-    $0 [options] [module][m
[31m-[m
[31m-Options:[m
[31m-    -h              Print this help.[m
[31m-    -s SECTION      Specify the section name to be searched[m
[31m-[m
[31m-For bug reporting instructions, please see:[m
[31m-[m
[31m-    <https://openresty.org/en/community.html>[m
[31m-[m
[31m-Copyright (C) Yichun Zhang (agentzh). All rights reserved.[m
[31m-_EOC_[m
[31m-[m
[31m-    if ($code == 0) {[m
[31m-        print $msg;[m
[31m-        exit 0;[m
[31m-    }[m
[31m-[m
[31m-    print STDERR $msg;[m
[31m-    exit $code;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/restydoc-index b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/restydoc-index[m
[1mdeleted file mode 100755[m
[1mindex a2f4749..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/bin/restydoc-index[m
[1m+++ /dev/null[m
[36m@@ -1,342 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use FindBin ();[m
[31m-use File::Find ();[m
[31m-use Cwd qw( cwd );[m
[31m-use File::Spec ();[m
[31m-use File::Copy qw( copy );[m
[31m-use File::Path qw( make_path );[m
[31m-use Getopt::Long qw( GetOptions );[m
[31m-use bytes ();[m
[31m-[m
[31m-GetOptions([m
[31m-    "outdir=s" => \(my $outdir),[m
[31m-) or die "Usage: $0 [--outdir DIR] DIR\n";[m
[31m-[m
[31m-if (!defined $outdir) {[m
[31m-    $outdir = "$FindBin::Bin/..";[m
[31m-[m
[31m-} else {[m
[31m-    $outdir = File::Spec->rel2abs($outdir);[m
[31m-}[m
[31m-[m
[31m-my $indir = shift[m
[31m-    or die "no input project directory name specified.\n";[m
[31m-[m
[31m-if (!-d $indir) {[m
[31m-    die "input directory $indir not found.\n";[m
[31m-}[m
[31m-[m
[31m-$indir = File::Spec->rel2abs($indir);[m
[31m-[m
[31m-$indir =~ s{/+$}{}g;[m
[31m-[m
[31m-(my $full_dist_name = $indir) =~ s{.*/}{};[m
[31m-(my $dist_name = $full_dist_name) =~ s{ [-_] v? ( \d+ (?:\.\d+)* (?: rc\d+ | _\d+ )? ) $ }{}i;[m
[31m-$dist_name = lc $dist_name;[m
[31m-$dist_name =~ s/\.org$//;[m
[31m-my $dist_ver = $1;[m
[31m-[m
[31m-#print "name: $full_dist_name\n";[m
[31m-#if (defined $dist_ver) {[m
[31m-    #print "version: $dist_ver\n";[m
[31m-#}[m
[31m-[m
[31m-my @aliases = gen_aliases($indir, $dist_name);[m
[31m-#print "aliases: @aliases\n";[m
[31m-[m
[31m-my $poddir = "$outdir/pod/$dist_name";[m
[31m-#warn "poddir: $poddir";[m
[31m-[m
[31m-if (!-d $poddir) {[m
[31m-    make_path($poddir);[m
[31m-}[m
[31m-[m
[31m-my @dist_modules;[m
[31m-[m
[31m-File::Find::find(\&wanted,  $indir);[m
[31m-[m
[31m-my $index = "dist $dist_name\n";[m
[31m-[m
[31m-if ($dist_ver) {[m
[31m-    $index .= "  version $dist_ver\n";[m
[31m-}[m
[31m-[m
[31m-if (@aliases) {[m
[31m-    $index .= "  aliases @aliases\n";[m
[31m-}[m
[31m-[m
[31m-if (@dist_modules) {[m
[31m-    @dist_modules = sort { lc($a->{name}) cmp lc($b->{name}) } @dist_modules;[m
[31m-    my @names = map { lc($_->{name}) } @dist_modules;[m
[31m-    $index .= "  modules " . join(" ", @names) . "\n";[m
[31m-[m
[31m-    for my $module (@dist_modules) {[m
[31m-        $index .= <<_EOC_;[m
[31m-[m
[31m-module $module->{name}[m
[31m-_EOC_[m
[31m-[m
[31m-        my @aliases = gen_aliases(undef, $module->{name});[m
[31m-        if (@aliases) {[m
[31m-            $index .= "  aliases @aliases\n";[m
[31m-        }[m
[31m-[m
[31m-        my $sections = $module->{sections};[m
[31m-        if (defined $sections) {[m
[31m-            for my $sec (@$sections) {[m
[31m-                $index .= "  section $sec->{from} $sec->{to} $sec->{title}\n";[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-$index .= "\n";[m
[31m-[m
[31m-my $index_file = "$outdir/resty.index";[m
[31m-open my $out, ">>:encoding(UTF-8)", $index_file[m
[31m-    or die "cannot open $index_file for appending: $!\n";[m
[31m-print $out $index;[m
[31m-close $out;[m
[31m-[m
[31m-sub wanted {[m
[31m-    return unless -f $_ && m/ \. ( md | markdown | pod ) $ /x;[m
[31m-    my $ext = lc $1;[m
[31m-    my $docfile = $File::Find::name;[m
[31m-[m
[31m-    my $name = File::Spec->abs2rel($docfile, $indir);[m
[31m-    return if $name =~ /^node_modules/i;[m
[31m-[m
[31m-    $name = lc $name;[m
[31m-    $name =~ s{ ^ (?: lib | src | lua | docs? ) / }{}xi;[m
[31m-    $name =~ s{ \. \w+ $ }{}x;[m
[31m-    $name =~ s{/}{.}g;[m
[31m-    $name =~ s/\.org$//;[m
[31m-[m
[31m-    return if length($name) == 1;[m
[31m-[m
[31m-    my $podfile;[m
[31m-[m
[31m-    if ($name =~ / ^ (?: README | index ) $ /xi) {[m
[31m-        $name = $dist_name;[m
[31m-    }[m
[31m-[m
[31m-    if ($ext eq 'pod') {[m
[31m-        $podfile = "$poddir/$name.pod";[m
[31m-        copy($docfile, $podfile)[m
[31m-            or die "cannot copy $docfile to $podfile: $!\n";[m
[31m-[m
[31m-    } else {[m
[31m-        my $mdfile = $docfile;[m
[31m-[m
[31m-        #warn $name;[m
[31m-        #warn "wanted: $File::Find::dir $File::Find::name $_\n";[m
[31m-        $podfile = "$poddir/$name.pod";[m
[31m-        shell("$FindBin::Bin/md2pod.pl -o $podfile $mdfile");[m
[31m-    }[m
[31m-[m
[31m-    my $dist_module = process_pod($podfile, $name);[m
[31m-[m
[31m-    push @dist_modules, $dist_module;[m
[31m-}[m
[31m-[m
[31m-sub strip_pod_tags {[m
[31m-    my $pod = shift;[m
[31m-    if ($pod =~ /[<>]/) {[m
[31m-        #warn $pod;[m
[31m-        $pod =~ s/\b[E]<lt>/&lt;/g;[m
[31m-        $pod =~ s/\b[E]<gt>/&gt;/g;[m
[31m-        while ($pod =~ s/\b[CFBI]<([^<>]*)>/$1/g) {}[m
[31m-        $pod =~ s/\&lt;/</g;[m
[31m-        $pod =~ s/\&gt;/>/g;[m
[31m-    }[m
[31m-    $pod;[m
[31m-}[m
[31m-[m
[31m-sub process_pod {[m
[31m-    my ($infile, $name) = @_;[m
[31m-[m
[31m-    my $dist_module = {[m
[31m-        name => $name,[m
[31m-    };[m
[31m-[m
[31m-    open my $in, "<:encoding(UTF-8)", $infile or[m
[31m-        die "cannot open $infile for reading: $!\n";[m
[31m-[m
[31m-    my ($toc_level, $new);[m
[31m-    while (<$in>) {[m
[31m-        if (defined $toc_level) {[m
[31m-            if (/ ^ =head (\d+) /x && $1 >= $toc_level) {[m
[31m-                undef $toc_level;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            # ignore the content[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        # !defined $level[m
[31m-[m
[31m-        if (/ ^ =head (\d+) \s+ Table \s+ of \s+ Contents? \s* $ /ix) {[m
[31m-            $toc_level = $1;[m
[31m-            # ignore the content[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        $new .= $_;[m
[31m-    }[m
[31m-[m
[31m-    close $in;[m
[31m-[m
[31m-    open my $out, ">:encoding(UTF-8)", $infile[m
[31m-        or die "cannot open $infile for writing: $!\n";[m
[31m-    print $out $new;[m
[31m-    close $out;[m
[31m-[m
[31m-    open $in, "<:encoding(UTF-8)", $infile or[m
[31m-        die "cannot open $infile for reading: $!\n";[m
[31m-[m
[31m-    my @sections;[m
[31m-    my $level;[m
[31m-    while (<$in>) {[m
[31m-        if (/ ^ =head (\d+) \s+ (\S.*) /mx) {[m
[31m-            $level = $1;[m
[31m-            (my $title = $2) =~ s/\s+$//;[m
[31m-            $title = strip_pod_tags($title);[m
[31m-            $title = lc $title;[m
[31m-            next unless $title =~ /[a-z]+/;[m
[31m-            my $len = bytes::length($_);[m
[31m-            my $pos = tell($in) - $len;[m
[31m-            my $sec = {[m
[31m-                title => $title,[m
[31m-                from => $pos,[m
[31m-                level => $level,[m
[31m-            };[m
[31m-            push @sections, $sec;[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        if (/ ^ =item \s+ (\S.*) /mx) {[m
[31m-            (my $title = $1) =~ s/\s+$//;[m
[31m-[m
[31m-            next unless defined $level;[m
[31m-[m
[31m-            $title = strip_pod_tags($title);[m
[31m-            $title = lc $title;[m
[31m-[m
[31m-            next unless $title =~ /[a-z]+/;[m
[31m-[m
[31m-            #warn "section $title";[m
[31m-            my $len = bytes::length($_);[m
[31m-            my $pos = tell($in) - $len;[m
[31m-            my $sec = {[m
[31m-                title => $title,[m
[31m-                from => $pos,[m
[31m-                level => $level + 1,[m
[31m-            };[m
[31m-            push @sections, $sec;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $final_pos = tell $in;[m
[31m-[m
[31m-    close $in;[m
[31m-[m
[31m-    my (%levels, $prev_level);[m
[31m-    for my $sec (@sections) {[m
[31m-        my $level = $sec->{level};[m
[31m-        if (defined $prev_level && $level <= $prev_level) {[m
[31m-            for (my $l = $prev_level; $l >= $level; $l--) {[m
[31m-                my $s = $levels{$l};[m
[31m-                next if !defined $s;[m
[31m-                #warn "setting to...";[m
[31m-                $s->{to} = $sec->{from};[m
[31m-                delete $levels{$l};[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (defined $prev_level && $levels{$level}) {[m
[31m-            die "Bad level $level";[m
[31m-        }[m
[31m-        $levels{$level} = $sec;[m
[31m-        $prev_level = $level;[m
[31m-    }[m
[31m-[m
[31m-    if (defined $prev_level) {[m
[31m-        for (my $l = $prev_level; $l >= 1; $l--) {[m
[31m-            my $s = $levels{$l};[m
[31m-            next if !defined $s;[m
[31m-            #warn "setting to...";[m
[31m-            $s->{to} = $final_pos;[m
[31m-            delete $levels{$l};[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (%levels) {[m
[31m-        require Data::Dumper;[m
[31m-        die "cannot happen: ", Data::Dumper::Dumper(\%levels);[m
[31m-    }[m
[31m-[m
[31m-    if (@sections) {[m
[31m-        $dist_module->{sections} = \@sections;[m
[31m-    }[m
[31m-[m
[31m-    return $dist_module;[m
[31m-}[m
[31m-[m
[31m-sub shell {[m
[31m-    my $cmd = shift;[m
[31m-[m
[31m-    #warn $cmd;[m
[31m-    system($cmd) == 0[m
[31m-        or die "failed to run command \"$cmd\": $!\n";[m
[31m-}[m
[31m-[m
[31m-sub gen_aliases {[m
[31m-    my ($indir, $name) = @_;[m
[31m-[m
[31m-    $name =~ s/-\d+\.\d+.*//g;[m
[31m-[m
[31m-    my @aliases;[m
[31m-    my $alias = $name;[m
[31m-    if ($alias =~ s/-nginx-module$//) {[m
[31m-        $alias =~ s/-/_/g;[m
[31m-        $alias = "ngx_" . $alias;[m
[31m-        push @aliases, $alias;[m
[31m-[m
[31m-    } else {[m
[31m-        $alias = $name;[m
[31m-        if ($alias =~ s/^ngx_http_(\w+)_module$/ngx_$1/) {[m
[31m-            push @aliases, $alias;[m
[31m-[m
[31m-        } else {[m
[31m-            $alias = $name;[m
[31m-            if ($alias =~ / ^ lua (?: - \w+ )+ $ /x) {[m
[31m-                $alias =~ s/^lua-//;[m
[31m-                $alias =~ s/-/./g;[m
[31m-                push @aliases, $alias;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (defined $indir) {[m
[31m-        my $config_file = "$indir/config";[m
[31m-        if (-f $config_file) {[m
[31m-            open my $in, $config_file[m
[31m-                or die "cannot open $config_file for reading: $!\n";[m
[31m-            while (<$in>) {[m
[31m-                if (/ \b ngx_addon_name = .*? (\w+) /x) {[m
[31m-                    my $addon = lc $1;[m
[31m-                    push @aliases, $addon;[m
[31m-                    last;[m
[31m-                }[m
[31m-            }[m
[31m-            close $in;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return @aliases;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/lib/Test/Resty.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/lib/Test/Resty.pm[m
[1mdeleted file mode 100644[m
[1mindex 187ac68..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/lib/Test/Resty.pm[m
[1m+++ /dev/null[m
[36m@@ -1,244 +0,0 @@[m
[31m-# Copyright (C) Yichun Zhang (agentzh)[m
[31m-# Copyright (C) Guanlan Dai[m
[31m-[m
[31m-package Test::Resty;[m
[31m-[m
[31m-use Test::Base -Base;[m
[31m-use File::Temp qw( tempfile );[m
[31m-use IPC::Run ();[m
[31m-[m
[31m-our @EXPORT = qw( run_tests blocks plan );[m
[31m-[m
[31m-our $UseValgrind = $ENV{TEST_RESTY_USE_VALGRIND};[m
[31m-[m
[31m-sub write_user_files ($);[m
[31m-[m
[31m-sub run_tests () {[m
[31m-    for my $block (Test::Base::blocks()) {[m
[31m-        run_test($block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-sub bail_out (@) {[m
[31m-    Test::More::BAIL_OUT(@_);[m
[31m-}[m
[31m-[m
[31m-sub parse_cmd ($) {[m
[31m-    my $cmd = shift;[m
[31m-    my @cmd;[m
[31m-    while (1) {[m
[31m-        if ($cmd =~ /\G\s*"(.*?)"/gmsc) {[m
[31m-            push @cmd, $1;[m
[31m-[m
[31m-        } elsif ($cmd =~ /\G\s*'(.*?)'/gmsc) {[m
[31m-            push @cmd, $1;[m
[31m-[m
[31m-        } elsif ($cmd =~ /\G\s*(\S+)/gmsc) {[m
[31m-            push @cmd, $1;[m
[31m-[m
[31m-        } else {[m
[31m-            last;[m
[31m-        }[m
[31m-    }[m
[31m-    return @cmd;[m
[31m-}[m
[31m-[m
[31m-sub run_test ($) {[m
[31m-    my $block = shift;[m
[31m-    my $name = $block->name;[m
[31m-[m
[31m-    my $timeout = $block->timeout() || 10;[m
[31m-    my $opts = $block->opts;[m
[31m-    my $args = $block->args;[m
[31m-[m
[31m-    my $cmd = "./bin/resty";[m
[31m-[m
[31m-    if ($UseValgrind) {[m
[31m-        my $val_opts = " --num-callers=100 -q --gen-suppressions=all";[m
[31m-[m
[31m-        my $sup_file = 'valgrind.suppress';[m
[31m-        if (-f $sup_file) {[m
[31m-            $val_opts .= " --suppressions=$sup_file";[m
[31m-        }[m
[31m-[m
[31m-        my $extra_opts = "--valgrind '--valgrind-opts=$val_opts'";[m
[31m-        if (!defined $opts) {[m
[31m-            $opts = $extra_opts;[m
[31m-[m
[31m-        } else {[m
[31m-            $opts .= " $extra_opts";[m
[31m-        }[m
[31m-[m
[31m-        warn "$name\n";[m
[31m-    }[m
[31m-[m
[31m-    if (defined $opts) {[m
[31m-        $cmd .= " $opts";[m
[31m-    }[m
[31m-[m
[31m-    my $luafile;[m
[31m-    if (defined $block->src) {[m
[31m-        my ($out, $luafile) = tempfile("testXXXXXX",[m
[31m-                                        SUFFIX => '.lua',[m
[31m-                                        TMPDIR => 1,[m
[31m-                                        UNLINK => 1);[m
[31m-        print $out ($block->src);[m
[31m-        close $out;[m
[31m-        $cmd .= " $luafile"[m
[31m-    }[m
[31m-[m
[31m-    if (defined $args) {[m
[31m-        $cmd .= " $args";[m
[31m-    }[m
[31m-[m
[31m-    #warn "CMD: $cmd\n";[m
[31m-[m
[31m-    my @cmd = parse_cmd($cmd);[m
[31m-[m
[31m-    write_user_files($block);[m
[31m-[m
[31m-    my ($out, $err);[m
[31m-[m
[31m-    eval {[m
[31m-        IPC::Run::run(\@cmd, \undef, \$out, \$err,[m
[31m-                      IPC::Run::timeout($timeout));[m
[31m-    };[m
[31m-    if ($@) {[m
[31m-        # timed out[m
[31m-        if ($@ =~ /timeout/) {[m
[31m-            if (!defined $block->expect_timeout) {[m
[31m-                fail("$name: resty process timed out");[m
[31m-            }[m
[31m-	} else {[m
[31m-            fail("$name: failed to run command [$cmd]: $@");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $ret = ($? >> 8);[m
[31m-[m
[31m-    if (defined $luafile) {[m
[31m-        unlink $luafile;[m
[31m-    }[m
[31m-[m
[31m-    if (defined $block->out) {[m
[31m-        is $out, $block->out, "$name - stdout eq okay";[m
[31m-    }[m
[31m-[m
[31m-    my $regex = $block->out_like;[m
[31m-    if (defined $regex) {[m
[31m-        if (!ref $regex) {[m
[31m-            $regex = qr/$regex/ms;[m
[31m-        }[m
[31m-        like $out, $regex, "$name - stdout like okay";[m
[31m-    }[m
[31m-[m
[31m-    if (defined $block->err) {[m
[31m-        is $err, $block->err, "$name - stderr eq okay";[m
[31m-    }[m
[31m-[m
[31m-    $regex = $block->err_like;[m
[31m-    if (defined $regex) {[m
[31m-        if (!ref $regex) {[m
[31m-            $regex = qr/$regex/ms;[m
[31m-        }[m
[31m-        like $err, $regex, "$name - stderr like okay";[m
[31m-    }[m
[31m-[m
[31m-    my $exp_ret = $block->ret;[m
[31m-    if (!defined $exp_ret) {[m
[31m-        $exp_ret = 0;[m
[31m-[m
[31m-    } elsif ($UseValgrind) {[m
[31m-        $ret &= 0x3;[m
[31m-    }[m
[31m-    is $ret, $exp_ret, "$name - exit code okay";[m
[31m-}[m
[31m-[m
[31m-sub write_user_files ($) {[m
[31m-    my $block = shift;[m
[31m-[m
[31m-    my $tmpdir = "./t/tmp";[m
[31m-    if (!-d $tmpdir) {[m
[31m-        mkdir $tmpdir or die "cannot mkdir $tmpdir: $!\n";[m
[31m-    }[m
[31m-[m
[31m-    my $name = $block->name;[m
[31m-[m
[31m-    my $files = $block->user_files;[m
[31m-    if ($files) {[m
[31m-        if (!ref $files) {[m
[31m-            my $raw = $files;[m
[31m-[m
[31m-            open my $in, '<', \$raw;[m
[31m-[m
[31m-            $files = [];[m
[31m-            my ($fname, $body, $date);[m
[31m-            while (<$in>) {[m
[31m-                if (/>>> (\S+)(?:\s+(.+))?/) {[m
[31m-                    if ($fname) {[m
[31m-                        push @$files, [$fname, $body, $date];[m
[31m-                    }[m
[31m-[m
[31m-                    $fname = $1;[m
[31m-                    $date = $2;[m
[31m-                    undef $body;[m
[31m-                } else {[m
[31m-                    $body .= $_;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if ($fname) {[m
[31m-                push @$files, [$fname, $body, $date];[m
[31m-            }[m
[31m-[m
[31m-        } elsif (ref $files ne 'ARRAY') {[m
[31m-            bail_out "$name - wrong value type: ", ref $files,[m
[31m-                     ", only scalar or ARRAY are accepted";[m
[31m-        }[m
[31m-[m
[31m-        for my $file (@$files) {[m
[31m-            my ($fname, $body, $date) = @$file;[m
[31m-            #warn "write file $fname with content [$body]\n";[m
[31m-[m
[31m-            if (!defined $body) {[m
[31m-                $body = '';[m
[31m-            }[m
[31m-[m
[31m-            my $path;[m
[31m-            if ($fname !~ m{^/}) {[m
[31m-                $path = "$tmpdir/$fname";[m
[31m-[m
[31m-            } else {[m
[31m-                $path = $fname;[m
[31m-            }[m
[31m-[m
[31m-            if ($path =~ /(.*)\//) {[m
[31m-                my $dir = $1;[m
[31m-                if (! -d $dir) {[m
[31m-                    make_path($dir)[m
[31m-                        or bail_out "$name - Cannot create directory ", $dir;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (-f $path) {[m
[31m-                unlink $path or die "$name - Cannot remove file $path: $!\n";[m
[31m-            }[m
[31m-[m
[31m-            open my $out, ">$path" or[m
[31m-                bail_out "$name - Cannot open $path for writing: $!\n";[m
[31m-            binmode $out;[m
[31m-            #warn "write file $path with data len ", length $body;[m
[31m-            print $out $body;[m
[31m-            close $out;[m
[31m-[m
[31m-            if ($date) {[m
[31m-                my $cmd = "TZ=GMT touch -t '$date' $path";[m
[31m-                system($cmd) == 0 or[m
[31m-                    bail_out "Failed to run shell command: $cmd\n";[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-1;[m
[31m-# vi: et[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/resty/options.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/resty/options.t[m
[1mdeleted file mode 100644[m
[1mindex 8693a3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/resty/options.t[m
[1m+++ /dev/null[m
[36m@@ -1,208 +0,0 @@[m
[31m-# vi:ft= et ts=4 sw=4[m
[31m-[m
[31m-use lib 't/lib';[m
[31m-use Test::Resty;[m
[31m-[m
[31m-plan tests => blocks() * 3;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad --nginx value[m
[31m---- opts: --nginx=/tmp/no/such/file[m
[31m---- src[m
[31m-print("arg 0: ", arg[0])[m
[31m-print("arg 1: ", arg[1])[m
[31m-print("arg 2: ", arg[2])[m
[31m-print("arg 3: ", arg[3])[m
[31m-[m
[31m---- out[m
[31m---- err_like chop[m
[31m-(?:Can't exec|valgrind:) "?/tmp/no/such/file"?: No such file or directory[m
[31m---- ret: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: -V[m
[31m---- opts: -V[m
[31m---- out[m
[31m---- err_like eval[m
[31m-qr/^resty \d+.\d{2}[m
[31m-nginx version: /s[m
[31m---- ret: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: -h[m
[31m---- opts: -h[m
[31m---- out[m
[31m-resty [options] [lua-file [args]][m
[31m-[m
[31m-Options:[m
[31m-    -c num              Set maximal connection count (default: 64).[m
[31m-    -e prog             Run the inlined Lua code in "prog".[m
[31m-    --help              Print this help.[m
[31m-[m
[31m-    --http-include path Include the specified file in the nginx http configuration block[m
[31m-                        (multiple instances are supported).[m
[31m-[m
[31m-    -I dir              Add dir to the search paths for Lua libraries.[m
[31m-[m
[31m-    --main-include path Include the specified file in the nginx main configuration block[m
[31m-                        (multiple instances are supported).[m
[31m-[m
[31m-    --nginx             Specify the nginx path (this option might be removed in the future).[m
[31m-    -V                  Print version numbers and nginx configurations.[m
[31m-    --valgrind          Use valgrind to run nginx[m
[31m-    --valgrind-opts     Pass extra options to valgrind[m
[31m-[m
[31m-For bug reporting instructions, please see:[m
[31m-[m
[31m-    <https://openresty.org/en/community.html>[m
[31m-[m
[31m-Copyright (C) Yichun Zhang (agentzh). All rights reserved.[m
[31m---- err[m
[31m---- ret: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad --http-include value[m
[31m---- opts: --http-include=/tmp/no/such/file[m
[31m---- src[m
[31m---- out[m
[31m---- err_like chop[m
[31m-Could not find http include '/tmp/no/such/file'[m
[31m---- ret: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad --main-include value[m
[31m---- opts: --main-include=/tmp/no/such/file[m
[31m---- src[m
[31m---- out[m
[31m---- err_like chop[m
[31m-Could not find main include '/tmp/no/such/file'[m
[31m---- ret: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad --main-include file content[m
[31m---- opts: --main-include=/tmp/a.conf[m
[31m---- user_files[m
[31m->>> /tmp/a.conf[m
[31m-lua_shared_dict dogs 1m;[m
[31m---- src[m
[31m-local dogs = ngx.shared.dogs[m
[31m-dogs:set("Tom", 32)[m
[31m-print(dogs:get("Tom"))[m
[31m---- out[m
[31m---- err[m
[31m-nginx: [emerg] "lua_shared_dict" directive is not allowed here in /tmp/a.conf:1[m
[31m---- ret: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: good --http-include file content[m
[31m---- opts: --http-include=/tmp/a.conf[m
[31m---- user_files[m
[31m->>> /tmp/a.conf[m
[31m-lua_shared_dict dogs 1m;[m
[31m---- src[m
[31m-local dogs = ngx.shared.dogs[m
[31m-dogs:set("Tom", 32)[m
[31m-print(dogs:get("Tom"))[m
[31m---- out[m
[31m-32[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: multiple --http-include options[m
[31m---- opts: --http-include=/tmp/a.conf --http-include=/tmp/b.conf[m
[31m---- user_files[m
[31m->>> /tmp/a.conf[m
[31m-lua_shared_dict dogs 1m;[m
[31m->>> /tmp/b.conf[m
[31m-lua_shared_dict cats 1m;[m
[31m---- src[m
[31m-local dogs = ngx.shared.dogs[m
[31m-local cats = ngx.shared.cats[m
[31m-dogs:set("Tom", 32)[m
[31m-cats:set("Tom", 12)[m
[31m-print("dog: ", dogs:get("Tom"))[m
[31m-print("cat: ", cats:get("Tom"))[m
[31m---- out[m
[31m-dog: 32[m
[31m-cat: 12[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multiple --main-include options[m
[31m---- opts: --main-include=/tmp/a.conf --main-include=/tmp/b.conf[m
[31m---- user_files[m
[31m->>> /tmp/a.conf[m
[31m-env foo=32;[m
[31m->>> /tmp/b.conf[m
[31m-env bar=56;[m
[31m---- src[m
[31m-print("foo: ", os.getenv("foo"))[m
[31m-print("bar: ", os.getenv("bar"))[m
[31m---- out[m
[31m-foo: 32[m
[31m-bar: 56[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: good --http-include file content (relative path)[m
[31m---- opts: --http-include=t/tmp/a.conf[m
[31m---- user_files[m
[31m->>> a.conf[m
[31m-lua_shared_dict dogs 1m;[m
[31m---- src[m
[31m-local dogs = ngx.shared.dogs[m
[31m-dogs:set("Tom", 32)[m
[31m-print(dogs:get("Tom"))[m
[31m---- out[m
[31m-32[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: good --main-include option value (relative path)[m
[31m---- opts: --main-include=/tmp/a.conf --main-include=/tmp/b.conf[m
[31m---- user_files[m
[31m->>> /tmp/a.conf[m
[31m-env foo=32;[m
[31m->>> /tmp/b.conf[m
[31m-env bar=56;[m
[31m---- src[m
[31m-print("foo: ", os.getenv("foo"))[m
[31m-print("bar: ", os.getenv("bar"))[m
[31m---- out[m
[31m-foo: 32[m
[31m-bar: 56[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: multiple -e options[m
[31m---- opts: -e 'print(1)' -e 'print(2)'[m
[31m---- out[m
[31m-1[m
[31m-2[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: multiple -e options with file[m
[31m---- opts: -e 'print(1)' -e 'print(2)'[m
[31m---- src[m
[31m-print(3)[m
[31m---- out[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m---- err[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/resty/user-args.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/resty/user-args.t[m
[1mdeleted file mode 100644[m
[1mindex 3cc6d45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/t/resty/user-args.t[m
[1m+++ /dev/null[m
[36m@@ -1,163 +0,0 @@[m
[31m-# vi:ft= et ts=4 sw=4[m
[31m-[m
[31m-use lib 't/lib';[m
[31m-use Test::Resty;[m
[31m-[m
[31m-plan tests => blocks() * 3;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simplest[m
[31m---- args: 1 testing "2 3 4"[m
[31m---- src[m
[31m-print("arg 0: ", arg[0])[m
[31m-print("arg 1: ", arg[1])[m
[31m-print("arg 2: ", arg[2])[m
[31m-print("arg 3: ", arg[3])[m
[31m-[m
[31m---- out_like chop[m
[31m-^arg 0: .*?/tmp/\S+?\.lua[m
[31m-arg 1: 1[m
[31m-arg 2: testing[m
[31m-arg 3: 2 3 4$[m
[31m-[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: minus indexes[m
[31m---- args: 1 testing "2 3 4"[m
[31m---- src[m
[31m-print("arg -1: ", arg[-1])[m
[31m-print("arg 0: ", arg[0])[m
[31m-print("arg 1: ", arg[1])[m
[31m-print("arg 2: ", arg[2])[m
[31m-print("arg 3: ", arg[3])[m
[31m-[m
[31m---- out_like chop[m
[31m-^arg -1: ./bin/resty[m
[31m-arg 0: .*?/tmp/\S+?\.lua[m
[31m-arg 1: 1[m
[31m-arg 2: testing[m
[31m-arg 3: 2 3 4$[m
[31m-[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: with quote and options[m
[31m---- opts: -I /tmp[m
[31m---- args: 1 2 \"[m
[31m---- src[m
[31m-print("arg -3: ", arg[-3])[m
[31m-print("arg -2: ", arg[-2])[m
[31m-print("arg -1: ", arg[-1])[m
[31m-print("arg 0: ", arg[0])[m
[31m-print("arg 1: ", arg[1])[m
[31m-print("arg 2: ", arg[2])[m
[31m-print("arg 3: ", arg[3])[m
[31m-[m
[31m---- out_like chop[m
[31m-^arg -3: ./bin/resty[m
[31m-arg -2: -I[m
[31m-arg -1: /tmp[m
[31m-arg 0: .*?/tmp/\S+?\.lua[m
[31m-arg 1: 1[m
[31m-arg 2: 2[m
[31m-arg 3: \"$[m
[31m-[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: with long brackets[m
[31m---- args: 1 ] ]] ]]] ]=] ]==] ]====] [===[ [[ [=[[m
[31m---- src[m
[31m-print("arg 0: ", arg[0])[m
[31m-print("arg 1: ", arg[1])[m
[31m-print("arg 2: ", arg[2])[m
[31m-print("arg 3: ", arg[3])[m
[31m-print("arg 4: ", arg[4])[m
[31m-print("arg 5: ", arg[5])[m
[31m-print("arg 6: ", arg[6])[m
[31m-print("arg 7: ", arg[7])[m
[31m-print("arg 8: ", arg[8])[m
[31m-print("arg 9: ", arg[9])[m
[31m-print("arg 10: ", arg[10])[m
[31m-[m
[31m---- out_like chop[m
[31m-^arg 0: .*?/tmp/\S+?\.lua[m
[31m-arg 1: 1[m
[31m-arg 2: ][m
[31m-arg 3: ]][m
[31m-arg 4: ]]][m
[31m-arg 5: ]=][m
[31m-arg 6: ]==][m
[31m-arg 7: ]====][m
[31m-arg 8: \[===\[[m
[31m-arg 9: \[\[[m
[31m-arg 10: \[=\[$[m
[31m-[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: with complex long brackets[m
[31m---- args: 1]] 1]=]3 4]===] ]====]5 ]==2!] [=[]=][m
[31m---- src[m
[31m-print("arg 0: ", arg[0])[m
[31m-print("arg 1: ", arg[1])[m
[31m-print("arg 2: ", arg[2])[m
[31m-print("arg 3: ", arg[3])[m
[31m-print("arg 4: ", arg[4])[m
[31m-print("arg 5: ", arg[5])[m
[31m-print("arg 6: ", arg[6])[m
[31m-[m
[31m---- out_like chop[m
[31m-^arg 0: .*?/tmp/\S+?\.lua[m
[31m-arg 1: 1]][m
[31m-arg 2: 1]=]3[m
[31m-arg 3: 4]===][m
[31m-arg 4: ]====]5[m
[31m-arg 5: ]==2!][m
[31m-arg 6: \[=\[]=]$[m
[31m-[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: user options[m
[31m---- args: --help[m
[31m---- src[m
[31m-print("arg 0: ", arg[0])[m
[31m-print("arg 1: ", arg[1])[m
[31m-print("arg 2: ", arg[2])[m
[31m-print("arg 3: ", arg[3])[m
[31m-[m
[31m---- out_like chop[m
[31m-^arg 0: .*?/tmp/\S+?\.lua[m
[31m-arg 1: --help[m
[31m-arg 2: [m
[31m-arg 3: [m
[31m-[m
[31m---- err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: user options (--)[m
[31m---- args: -- --help[m
[31m---- src[m
[31m-print("arg 0: ", arg[0])[m
[31m-print("arg 1: ", arg[1])[m
[31m-print("arg 2: ", arg[2])[m
[31m-print("arg 3: ", arg[3])[m
[31m-[m
[31m---- out_like chop[m
[31m-^arg 0: .*?/tmp/\S+?\.lua[m
[31m-arg 1: --[m
[31m-arg 2: --help[m
[31m-arg 3: [m
[31m-[m
[31m---- err[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex feb8504..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty-cli-0.12/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-{[m
[31m-    <ld>[m
[31m-    Memcheck:Cond[m
[31m-    fun:index[m
[31m-    fun:expand_dynamic_string_token[m
[31m-    fun:_dl_map_object[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_notify_init[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty.index b/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty.index[m
[1mdeleted file mode 100644[m
[1mindex 4994590..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/resty.index[m
[1m+++ /dev/null[m
[36m@@ -1,2862 +0,0 @@[m
[31m-dist nginx[m
[31m-  modules accept_failed beginners_guide chunked_encoding_from_backend configure configuring_https_servers contributing_changes control converting_rewrite_rules daemon_master_process_off debugging_log events example faq freebsd_tuning hash howto_build_on_win32 install license_copyright load_balancing nginx nginx_dtrace_pid_provider ngx_core_module ngx_http_access_module ngx_http_addition_module ngx_http_auth_basic_module ngx_http_auth_request_module ngx_http_autoindex_module ngx_http_browser_module ngx_http_charset_module ngx_http_core_module ngx_http_dav_module ngx_http_empty_gif_module ngx_http_f4f_module ngx_http_fastcgi_module ngx_http_flv_module ngx_http_geo_module ngx_http_geoip_module ngx_http_gunzip_module ngx_http_gzip_module ngx_http_gzip_static_module ngx_http_headers_module ngx_http_hls_module ngx_http_image_filter_module ngx_http_index_module ngx_http_limit_conn_module ngx_http_limit_req_module ngx_http_log_module ngx_http_map_module ngx_http_memcached_module ngx_http_mp4_module ngx_http_perl_module ngx_http_proxy_module ngx_http_random_index_module ngx_http_realip_module ngx_http_referer_module ngx_http_rewrite_module ngx_http_scgi_module ngx_http_secure_link_module ngx_http_session_log_module ngx_http_slice_module ngx_http_spdy_module ngx_http_split_clients_module ngx_http_ssi_module ngx_http_ssl_module ngx_http_status_module ngx_http_stub_status_module ngx_http_sub_module ngx_http_upstream_conf_module ngx_http_upstream_module ngx_http_userid_module ngx_http_uwsgi_module ngx_http_v2_module ngx_http_xslt_module ngx_mail_auth_http_module ngx_mail_core_module ngx_mail_imap_module ngx_mail_pop3_module ngx_mail_proxy_module ngx_mail_smtp_module ngx_mail_ssl_module ngx_stream_access_module ngx_stream_core_module ngx_stream_limit_conn_module ngx_stream_proxy_module ngx_stream_ssl_module ngx_stream_upstream_module request_processing server_names switches syntax sys_errlist syslog variables_in_config websocket welcome_nginx_facebook windows[m
[31m-[m
[31m-module accept_failed[m
[31m-  section 18 652 name[m
[31m-[m
[31m-module beginners_guide[m
[31m-  section 18 1416 name[m
[31m-  section 1416 3769 starting, stopping, and reloading configuration[m
[31m-  section 3769 4787 configuration file’s structure[m
[31m-  section 4787 8623 serving static content[m
[31m-  section 8623 12072 setting up a simple proxy server[m
[31m-  section 12072 13450 setting up fastcgi proxying[m
[31m-[m
[31m-module chunked_encoding_from_backend[m
[31m-  section 18 872 name[m
[31m-[m
[31m-module configure[m
[31m-  section 18 6374 name[m
[31m-[m
[31m-module configuring_https_servers[m
[31m-  section 18 1688 name[m
[31m-  section 1688 3153 https server optimization[m
[31m-  section 3153 6687 ssl certificate chains[m
[31m-  section 6687 7519 a single http/https server[m
[31m-  section 7519 12032 name-based https servers[m
[31m-  section 8814 10147 an ssl certificate with several names[m
[31m-  section 10147 12032 server name indication[m
[31m-  section 12032 13346 compatibility[m
[31m-[m
[31m-module contributing_changes[m
[31m-  section 18 78 name[m
[31m-  section 78 313 getting sources[m
[31m-  section 313 2523 formatting changes[m
[31m-  section 2523 3120 before submitting[m
[31m-  section 3120 3389 submitting changes[m
[31m-  section 3389 3525 license[m
[31m-[m
[31m-module control[m
[31m-  section 18 899 name[m
[31m-  section 899 3111 changing configuration[m
[31m-  section 3111 3735 rotating log-files[m
[31m-  section 3735 7797 upgrading executable on the fly[m
[31m-[m
[31m-module converting_rewrite_rules[m
[31m-  section 18 86 name[m
[31m-  section 86 1951 a redirect to a main site[m
[31m-  section 1951 2913 converting mongrel rules[m
[31m-[m
[31m-module daemon_master_process_off[m
[31m-  section 18 929 name[m
[31m-[m
[31m-module debugging_log[m
[31m-  section 18 1494 name[m
[31m-  section 1494 1787 debugging log for selected clients[m
[31m-  section 1787 2386 logging to a cyclic memory buffer[m
[31m-[m
[31m-module events[m
[31m-  section 18 1642 name[m
[31m-[m
[31m-module example[m
[31m-  section 18 4367 name[m
[31m-[m
[31m-module faq[m
[31m-  section 18 325 name[m
[31m-[m
[31m-module freebsd_tuning[m
[31m-  section 18 83 name[m
[31m-  section 83 302 syncache and syncookies[m
[31m-  section 302 1826 listen queues[m
[31m-  section 1826 1877 sockets and files[m
[31m-  section 1877 3863 socket buffers[m
[31m-  section 3863 7821 mbufs, mbuf clusters, etc.[m
[31m-  section 7821 7961 proxying[m
[31m-  section 7961 8042 finalizing connection[m
[31m-  section 8042 8099 i386 specific tuning[m
[31m-  section 8099 8189 minor optimizations[m
[31m-[m
[31m-module hash[m
[31m-  section 18 1414 name[m
[31m-[m
[31m-module howto_build_on_win32[m
[31m-  section 18 108 name[m
[31m-  section 108 755 prerequisites[m
[31m-  section 755 2146 build steps[m
[31m-  section 2146 2211 see also[m
[31m-[m
[31m-module install[m
[31m-  section 18 146 name[m
[31m-  section 146 254 installation on linux[m
[31m-  section 254 661 installation on freebsd[m
[31m-  section 661 931 building from sources[m
[31m-[m
[31m-module license_copyright[m
[31m-  section 18 729 name[m
[31m-[m
[31m-module load_balancing[m
[31m-  section 18 85 name[m
[31m-  section 85 529 introduction[m
[31m-  section 529 1038 load balancing methods[m
[31m-  section 1038 2254 default load balancing configuration[m
[31m-  section 2254 3035 least connected load balancing[m
[31m-  section 3035 4178 session persistence[m
[31m-  section 4178 5402 weighted load balancing[m
[31m-  section 5402 6402 health checks[m
[31m-  section 6402 7533 further reading[m
[31m-[m
[31m-module nginx[m
[31m-  section 18 62 name[m
[31m-  section 62 723 introduction[m
[31m-  section 723 1100 how-to[m
[31m-  section 1100 1181 development[m
[31m-  section 1181 5373 modules reference[m
[31m-[m
[31m-module nginx_dtrace_pid_provider[m
[31m-  section 18 5038 name[m
[31m-  section 5038 5304 see also[m
[31m-[m
[31m-module ngx_core_module[m
[31m-  section 17 71 name[m
[31m-  section 71 297 example configuration[m
[31m-  section 297 14165 directives[m
[31m-  section 316 704 accept_mutex[m
[31m-  section 704 1036 accept_mutex_delay[m
[31m-  section 1036 1231 daemon[m
[31m-  section 1231 2145 debug_connection[m
[31m-  section 2145 2540 debug_points[m
[31m-  section 2540 4107 error_log[m
[31m-  section 4107 5405 env[m
[31m-  section 5405 5587 events[m
[31m-  section 5587 5922 include[m
[31m-  section 5922 6151 load_module[m
[31m-  section 6151 6596 lock_file[m
[31m-  section 6596 6824 master_process[m
[31m-  section 6824 7275 multi_accept[m
[31m-  section 7275 7934 pcre_jit[m
[31m-  section 7934 8110 pid[m
[31m-  section 8110 8253 ssl_engine[m
[31m-  section 8253 9018 thread_pool[m
[31m-  section 9018 9693 timer_resolution[m
[31m-  section 9693 9954 use[m
[31m-  section 9954 10231 user[m
[31m-  section 10231 10644 worker_aio_requests[m
[31m-  section 10644 11225 worker_connections[m
[31m-  section 11225 12389 worker_cpu_affinity[m
[31m-  section 12389 12743 worker_priority[m
[31m-  section 12743 13324 worker_processes[m
[31m-  section 13324 13587 worker_rlimit_core[m
[31m-  section 13587 13859 worker_rlimit_nofile[m
[31m-  section 13859 14165 working_directory[m
[31m-[m
[31m-module ngx_http_access_module[m
[31m-  aliases ngx_access[m
[31m-  section 17 447 name[m
[31m-  section 447 1023 example configuration[m
[31m-  section 1023 1810 directives[m
[31m-  section 1042 1427 allow[m
[31m-  section 1427 1810 deny[m
[31m-[m
[31m-module ngx_http_addition_module[m
[31m-  aliases ngx_addition[m
[31m-  section 17 325 name[m
[31m-  section 325 471 example configuration[m
[31m-  section 471 1583 directives[m
[31m-  section 490 839 add_before_body[m
[31m-  section 839 1185 add_after_body[m
[31m-  section 1185 1583 addition_types[m
[31m-[m
[31m-module ngx_http_auth_basic_module[m
[31m-  aliases ngx_auth_basic[m
[31m-  section 17 531 name[m
[31m-  section 531 686 example configuration[m
[31m-  section 686 2699 directives[m
[31m-  section 705 1251 auth_basic[m
[31m-  section 1251 2699 auth_basic_user_file[m
[31m-[m
[31m-module ngx_http_auth_request_module[m
[31m-  aliases ngx_auth_request[m
[31m-  section 17 1084 name[m
[31m-  section 1084 1391 example configuration[m
[31m-  section 1391 2066 directives[m
[31m-  section 1410 1704 auth_request[m
[31m-  section 1704 2066 auth_request_set[m
[31m-[m
[31m-module ngx_http_autoindex_module[m
[31m-  aliases ngx_autoindex[m
[31m-  section 17 413 name[m
[31m-  section 413 502 example configuration[m
[31m-  section 502 2023 directives[m
[31m-  section 521 742 autoindex[m
[31m-  section 742 1091 autoindex_exact_size[m
[31m-  section 1091 1714 autoindex_format[m
[31m-  section 1714 2023 autoindex_localtime[m
[31m-[m
[31m-module ngx_http_browser_module[m
[31m-  aliases ngx_browser[m
[31m-  section 17 618 name[m
[31m-  section 243 378 $modern_browser[m
[31m-  section 378 516 $ancient_browser[m
[31m-  section 516 618 $msie[m
[31m-  section 618 1322 example configuration[m
[31m-  section 1322 3117 directives[m
[31m-  section 1341 1731 ancient_browser[m
[31m-  section 1731 1966 ancient_browser_value[m
[31m-  section 1966 2885 modern_browser[m
[31m-  section 2885 3117 modern_browser_value[m
[31m-[m
[31m-module ngx_http_charset_module[m
[31m-  aliases ngx_charset[m
[31m-  section 17 511 name[m
[31m-  section 511 653 example configuration[m
[31m-  section 653 4932 directives[m
[31m-  section 672 1997 charset[m
[31m-  section 1997 3165 charset_map[m
[31m-  section 3165 3831 charset_types[m
[31m-  section 3831 4593 override_charset[m
[31m-  section 4593 4932 source_charset[m
[31m-[m
[31m-module ngx_http_core_module[m
[31m-  aliases ngx_core[m
[31m-  section 17 85 name[m
[31m-  section 85 61580 directives[m
[31m-  section 104 2526 aio[m
[31m-  section 2526 2950 aio_write[m
[31m-  section 2950 3955 alias[m
[31m-  section 3955 4335 chunked_transfer_encoding[m
[31m-  section 4335 4854 client_body_buffer_size[m
[31m-  section 4854 5579 client_body_in_file_only[m
[31m-  section 5579 5995 client_body_in_single_buffer[m
[31m-  section 5995 6627 client_body_temp_path[m
[31m-  section 6627 7109 client_body_timeout[m
[31m-  section 7109 7644 client_header_buffer_size[m
[31m-  section 7644 7986 client_header_timeout[m
[31m-  section 7986 8548 client_max_body_size[m
[31m-  section 8548 9036 connection_pool_size[m
[31m-  section 9036 9350 default_type[m
[31m-  section 9350 9968 directio[m
[31m-  section 9968 10344 directio_alignment[m
[31m-  section 10344 12529 disable_symlinks[m
[31m-  section 10729 10839 off[m
[31m-  section 10839 10939 on[m
[31m-  section 10939 11119 if_not_owner[m
[31m-  section 11119 12529 from=part[m
[31m-  section 12529 14284 error_page[m
[31m-  section 14284 14589 etag[m
[31m-  section 14589 14745 http[m
[31m-  section 14745 15418 if_modified_since[m
[31m-  section 15141 15228 off[m
[31m-  section 15228 15263 exact[m
[31m-  section 15263 15418 before[m
[31m-  section 15418 16014 ignore_invalid_headers[m
[31m-  section 16014 17245 internal[m
[31m-  section 17245 18082 keepalive_disable[m
[31m-  section 18082 18469 keepalive_requests[m
[31m-  section 18469 19144 keepalive_timeout[m
[31m-  section 19144 19900 large_client_header_buffers[m
[31m-  section 19900 20675 limit_except[m
[31m-  section 20675 21691 limit_rate[m
[31m-  section 21691 22171 limit_rate_after[m
[31m-  section 22171 23037 lingering_close[m
[31m-  section 23037 23451 lingering_time[m
[31m-  section 23451 24015 lingering_timeout[m
[31m-  section 24015 32683 listen[m
[31m-  section 32683 36827 location[m
[31m-  section 36827 37090 log_not_found[m
[31m-  section 37090 37343 log_subrequest[m
[31m-  section 37343 37795 max_ranges[m
[31m-  section 37795 38847 merge_slashes[m
[31m-  section 38847 39162 msie_padding[m
[31m-  section 39162 39416 msie_refresh[m
[31m-  section 39416 40673 open_file_cache[m
[31m-  section 40673 40941 open_file_cache_errors[m
[31m-  section 40941 41333 open_file_cache_min_uses[m
[31m-  section 41333 41590 open_file_cache_valid[m
[31m-  section 41590 41931 output_buffers[m
[31m-  section 41931 42298 port_in_redirect[m
[31m-  section 42298 42646 postpone_output[m
[31m-  section 42646 43214 read_ahead[m
[31m-  section 43214 43530 recursive_error_pages[m
[31m-  section 43530 43819 request_pool_size[m
[31m-  section 43819 44500 reset_timedout_connection[m
[31m-  section 44500 45793 resolver[m
[31m-  section 45793 46048 resolver_timeout[m
[31m-  section 46048 46759 root[m
[31m-  section 46759 47395 satisfy[m
[31m-  section 47395 47881 send_lowat[m
[31m-  section 47881 48301 send_timeout[m
[31m-  section 48301 49315 sendfile[m
[31m-  section 49315 49679 sendfile_max_chunk[m
[31m-  section 49679 50191 server[m
[31m-  section 50191 52925 server_name[m
[31m-  section 52925 53520 server_name_in_redirect[m
[31m-  section 53520 53900 server_names_hash_bucket_size[m
[31m-  section 53900 54187 server_names_hash_max_size[m
[31m-  section 54187 54795 server_tokens[m
[31m-  section 54795 55115 tcp_nodelay[m
[31m-  section 55115 55666 tcp_nopush[m
[31m-  section 55666 58715 try_files[m
[31m-  section 58715 59586 types[m
[31m-  section 59586 60009 types_hash_bucket_size[m
[31m-  section 60009 60326 types_hash_max_size[m
[31m-  section 60326 60963 underscores_in_headers[m
[31m-  section 60963 61239 variables_hash_bucket_size[m
[31m-  section 61239 61580 variables_hash_max_size[m
[31m-  section 61580 67937 embedded variables[m
[31m-  section 61897 61969 $arg_i<name>[m
[31m-  section 61969 62021 $args[m
[31m-  section 62021 62175 $binary_remote_addr[m
[31m-  section 62175 62374 $body_bytes_sent[m
[31m-  section 62374 62450 $bytes_sent[m
[31m-  section 62450 62518 $connection[m
[31m-  section 62518 62623 $connection_requests[m
[31m-  section 62623 62694 $content_length[m
[31m-  section 62694 62761 $content_type[m
[31m-  section 62761 62818 $cookie_i<name>[m
[31m-  section 62818 62915 $document_root[m
[31m-  section 62915 62961 $document_uri[m
[31m-  section 62961 63135 $host[m
[31m-  section 63135 63171 $hostname[m
[31m-  section 63171 63347 $http_i<name>[m
[31m-  section 63347 63447 $https[m
[31m-  section 63447 63545 $is_args[m
[31m-  section 63545 63646 $limit_rate[m
[31m-  section 63646 63740 $msec[m
[31m-  section 63740 63785 $nginx_version[m
[31m-  section 63785 63832 $pid[m
[31m-  section 63832 63928 $pipe[m
[31m-  section 63928 64172 $proxy_protocol_addr[m
[31m-  section 64172 64413 $proxy_protocol_port[m
[31m-  section 64413 64460 $query_string[m
[31m-  section 64460 64647 $realpath_root[m
[31m-  section 64647 64691 $remote_addr[m
[31m-  section 64691 64732 $remote_port[m
[31m-  section 64732 64810 $remote_user[m
[31m-  section 64810 64862 $request[m
[31m-  section 64862 65100 $request_body[m
[31m-  section 65100 65756 $request_body_file[m
[31m-  section 65756 65861 $request_completion[m
[31m-  section 65861 65997 $request_filename[m
[31m-  section 65997 66060 $request_id[m
[31m-  section 66060 66174 $request_length[m
[31m-  section 66174 66260 $request_method[m
[31m-  section 66260 66433 $request_time[m
[31m-  section 66433 66505 $request_uri[m
[31m-  section 66505 66577 $scheme[m
[31m-  section 66577 66759 $sent_http_i<name>[m
[31m-  section 66759 67015 $server_addr[m
[31m-  section 67015 67088 $server_name[m
[31m-  section 67088 67161 $server_port[m
[31m-  section 67161 67313 $server_protocol[m
[31m-  section 67313 67573 $status[m
[31m-  section 67573 67662 $time_iso8601[m
[31m-  section 67662 67742 $time_local[m
[31m-  section 67742 67937 $uri[m
[31m-[m
[31m-module ngx_http_dav_module[m
[31m-  aliases ngx_dav[m
[31m-  section 17 516 name[m
[31m-  section 516 916 example configuration[m
[31m-  section 916 3322 directives[m
[31m-  section 935 1385 dav_access[m
[31m-  section 1385 2437 dav_methods[m
[31m-  section 2437 2783 create_full_put_path[m
[31m-  section 2783 3322 min_delete_depth[m
[31m-[m
[31m-module ngx_http_empty_gif_module[m
[31m-  aliases ngx_empty_gif[m
[31m-  section 17 185 name[m
[31m-  section 185 278 example configuration[m
[31m-  section 278 408 directives[m
[31m-  section 297 408 empty_gif[m
[31m-[m
[31m-module ngx_http_f4f_module[m
[31m-  aliases ngx_f4f[m
[31m-  section 17 699 name[m
[31m-  section 699 797 example configuration[m
[31m-  section 797 1170 directives[m
[31m-  section 816 923 f4f[m
[31m-  section 923 1170 f4f_buffer_size[m
[31m-[m
[31m-module ngx_http_fastcgi_module[m
[31m-  aliases ngx_fastcgi[m
[31m-  section 17 188 name[m
[31m-  section 188 628 example configuration[m
[31m-  section 628 36301 directives[m
[31m-  section 647 1667 fastcgi_bind[m
[31m-  section 1667 2164 fastcgi_buffer_size[m
[31m-  section 2164 3428 fastcgi_buffering[m
[31m-  section 3428 3861 fastcgi_buffers[m
[31m-  section 3861 4536 fastcgi_busy_buffers_size[m
[31m-  section 4536 4946 fastcgi_cache[m
[31m-  section 4946 5525 fastcgi_cache_bypass[m
[31m-  section 5525 5779 fastcgi_cache_key[m
[31m-  section 5779 6420 fastcgi_cache_lock[m
[31m-  section 6420 6835 fastcgi_cache_lock_age[m
[31m-  section 6835 7292 fastcgi_cache_lock_timeout[m
[31m-  section 7292 7837 fastcgi_cache_methods[m
[31m-  section 7837 8097 fastcgi_cache_min_uses[m
[31m-  section 8097 12008 fastcgi_cache_path[m
[31m-  section 12008 13385 fastcgi_cache_purge[m
[31m-  section 13385 13768 fastcgi_cache_revalidate[m
[31m-  section 13768 14884 fastcgi_cache_use_stale[m
[31m-  section 14884 16774 fastcgi_cache_valid[m
[31m-  section 16774 17392 fastcgi_catch_stderr[m
[31m-  section 17392 17721 fastcgi_connect_timeout[m
[31m-  section 17721 18110 fastcgi_force_ranges[m
[31m-  section 18110 18602 fastcgi_hide_header[m
[31m-  section 18602 18950 fastcgi_ignore_client_abort[m
[31m-  section 18950 20069 fastcgi_ignore_headers[m
[31m-  section 20069 20773 fastcgi_index[m
[31m-  section 20773 21172 fastcgi_intercept_errors[m
[31m-  section 21172 21720 fastcgi_keep_conn[m
[31m-  section 21720 22353 fastcgi_limit_rate[m
[31m-  section 22353 23146 fastcgi_max_temp_file_size[m
[31m-  section 23146 25522 fastcgi_next_upstream[m
[31m-  section 23639 23783 error[m
[31m-  section 23783 23934 timeout[m
[31m-  section 23934 24011 invalid_header[m
[31m-  section 24011 24082 http_500[m
[31m-  section 24082 24153 http_503[m
[31m-  section 24153 24224 http_403[m
[31m-  section 24224 24295 http_404[m
[31m-  section 24295 24610 non_idempotent[m
[31m-  section 24610 25522 off[m
[31m-  section 25522 25879 fastcgi_next_upstream_timeout[m
[31m-  section 25879 26239 fastcgi_next_upstream_tries[m
[31m-  section 26239 26789 fastcgi_no_cache[m
[31m-  section 26789 28302 fastcgi_param[m
[31m-  section 28302 28864 fastcgi_pass[m
[31m-  section 28864 29108 fastcgi_pass_header[m
[31m-  section 29108 29444 fastcgi_pass_request_body[m
[31m-  section 29444 29800 fastcgi_pass_request_headers[m
[31m-  section 29800 30252 fastcgi_read_timeout[m
[31m-  section 30252 30932 fastcgi_request_buffering[m
[31m-  section 30932 31444 fastcgi_send_lowat[m
[31m-  section 31444 31894 fastcgi_send_timeout[m
[31m-  section 31894 32796 fastcgi_split_path_info[m
[31m-  section 32796 34466 fastcgi_store[m
[31m-  section 34466 34956 fastcgi_store_access[m
[31m-  section 34956 35529 fastcgi_temp_file_write_size[m
[31m-  section 35529 36301 fastcgi_temp_path[m
[31m-  section 36301 36769 parameters passed to a fastcgi server[m
[31m-  section 36769 37929 embedded variables[m
[31m-  section 36948 37739 $fastcgi_script_name[m
[31m-  section 37739 37929 $fastcgi_path_info[m
[31m-[m
[31m-module ngx_http_flv_module[m
[31m-  aliases ngx_flv[m
[31m-  section 17 542 name[m
[31m-  section 542 629 example configuration[m
[31m-  section 629 753 directives[m
[31m-  section 648 753 flv[m
[31m-[m
[31m-module ngx_http_geo_module[m
[31m-  aliases ngx_geo[m
[31m-  section 17 197 name[m
[31m-  section 197 428 example configuration[m
[31m-  section 428 3843 directives[m
[31m-  section 447 3843 geo[m
[31m-  section 1419 1482 delete[m
[31m-  section 1482 1809 default[m
[31m-  section 1809 1909 include[m
[31m-  section 1909 2271 proxy[m
[31m-  section 2271 2717 proxy_recursive[m
[31m-  section 2717 3843 ranges[m
[31m-[m
[31m-module ngx_http_geoip_module[m
[31m-  aliases ngx_geoip[m
[31m-  section 17 620 name[m
[31m-  section 620 903 example configuration[m
[31m-  section 903 4564 directives[m
[31m-  section 922 1511 geoip_country[m
[31m-  section 1173 1273 $geoip_country_code[m
[31m-  section 1273 1379 $geoip_country_code3[m
[31m-  section 1379 1511 $geoip_country_name[m
[31m-  section 1511 3202 geoip_city[m
[31m-  section 1774 2058 $geoip_area_code[m
[31m-  section 2058 2164 $geoip_city_country_code[m
[31m-  section 2164 2275 $geoip_city_country_code3[m
[31m-  section 2275 2397 $geoip_city_country_name[m
[31m-  section 2397 2615 $geoip_dma_code[m
[31m-  section 2615 2655 $geoip_latitude[m
[31m-  section 2655 2697 $geoip_longitude[m
[31m-  section 2697 2862 $geoip_region[m
[31m-  section 2862 3048 $geoip_region_name[m
[31m-  section 3048 3138 $geoip_city[m
[31m-  section 3138 3202 $geoip_postal_code[m
[31m-  section 3202 3603 geoip_org[m
[31m-  section 3493 3603 $geoip_org[m
[31m-  section 3603 3964 geoip_proxy[m
[31m-  section 3964 4564 geoip_proxy_recursive[m
[31m-[m
[31m-module ngx_http_gunzip_module[m
[31m-  aliases ngx_gunzip[m
[31m-  section 17 516 name[m
[31m-  section 516 622 example configuration[m
[31m-  section 622 1515 directives[m
[31m-  section 641 1131 gunzip[m
[31m-  section 1131 1515 gunzip_buffers[m
[31m-[m
[31m-module ngx_http_gzip_module[m
[31m-  aliases ngx_gzip[m
[31m-  section 17 279 name[m
[31m-  section 279 565 example configuration[m
[31m-  section 565 5092 directives[m
[31m-  section 584 820 gzip[m
[31m-  section 820 1275 gzip_buffers[m
[31m-  section 1275 1545 gzip_comp_level[m
[31m-  section 1545 2079 gzip_disable[m
[31m-  section 2079 2391 gzip_min_length[m
[31m-  section 2391 2655 gzip_http_version[m
[31m-  section 2655 4327 gzip_proxied[m
[31m-  section 3284 3378 off[m
[31m-  section 3378 3509 expired[m
[31m-  section 3509 3649 no-cache[m
[31m-  section 3649 3789 no-store[m
[31m-  section 3789 3927 private[m
[31m-  section 3927 4046 no_last_modified[m
[31m-  section 4046 4147 no_etag[m
[31m-  section 4147 4245 auth[m
[31m-  section 4245 4327 any[m
[31m-  section 4327 4739 gzip_types[m
[31m-  section 4739 5092 gzip_vary[m
[31m-  section 5092 5272 embedded variables[m
[31m-  section 5131 5272 $gzip_ratio[m
[31m-[m
[31m-module ngx_http_gzip_static_module[m
[31m-  aliases ngx_gzip_static[m
[31m-  section 17 388 name[m
[31m-  section 388 510 example configuration[m
[31m-  section 510 1436 directives[m
[31m-  section 529 1436 gzip_static[m
[31m-[m
[31m-module ngx_http_headers_module[m
[31m-  aliases ngx_headers[m
[31m-  section 17 252 name[m
[31m-  section 252 489 example configuration[m
[31m-  section 489 3007 directives[m
[31m-  section 508 1180 add_header[m
[31m-  section 1180 3007 expires[m
[31m-[m
[31m-module ngx_http_hls_module[m
[31m-  aliases ngx_hls[m
[31m-  section 17 1284 name[m
[31m-  section 1284 1850 example configuration[m
[31m-  section 1850 5659 directives[m
[31m-  section 1869 1972 hls[m
[31m-  section 1972 2256 hls_buffers[m
[31m-  section 2256 4598 hls_forward_args[m
[31m-  section 4598 4861 hls_fragment[m
[31m-  section 4861 5122 hls_mp4_buffer_size[m
[31m-  section 5122 5659 hls_mp4_max_buffer_size[m
[31m-[m
[31m-module ngx_http_image_filter_module[m
[31m-  aliases ngx_image_filter[m
[31m-  section 17 507 name[m
[31m-  section 507 773 example configuration[m
[31m-  section 773 4777 directives[m
[31m-  section 792 2847 image_filter[m
[31m-  section 1282 1357 off[m
[31m-  section 1357 1517 test[m
[31m-  section 1517 1728 size[m
[31m-  section 1728 1988 rotate[m
[31m-  section 1988 2388 resize[m
[31m-  section 2388 2847 crop[m
[31m-  section 2847 3173 image_filter_buffer[m
[31m-  section 3173 3526 image_filter_interlace[m
[31m-  section 3526 3988 image_filter_jpeg_quality[m
[31m-  section 3988 4326 image_filter_sharpen[m
[31m-  section 4326 4777 image_filter_transparency[m
[31m-[m
[31m-module ngx_http_index_module[m
[31m-  aliases ngx_index[m
[31m-  section 17 379 name[m
[31m-  section 379 488 example configuration[m
[31m-  section 488 1322 directives[m
[31m-  section 507 1322 index[m
[31m-[m
[31m-module ngx_http_limit_conn_module[m
[31m-  aliases ngx_limit_conn[m
[31m-  section 17 446 name[m
[31m-  section 446 708 example configuration[m
[31m-  section 708 4408 directives[m
[31m-  section 727 2031 limit_conn[m
[31m-  section 2031 2406 limit_conn_log_level[m
[31m-  section 2406 2692 limit_conn_status[m
[31m-  section 2692 4026 limit_conn_zone[m
[31m-  section 4026 4408 limit_zone[m
[31m-[m
[31m-module ngx_http_limit_req_module[m
[31m-  aliases ngx_limit_req[m
[31m-  section 17 362 name[m
[31m-  section 362 639 example configuration[m
[31m-  section 639 4827 directives[m
[31m-  section 658 2402 limit_req[m
[31m-  section 2402 2992 limit_req_log_level[m
[31m-  section 2992 3276 limit_req_status[m
[31m-  section 3276 4827 limit_req_zone[m
[31m-[m
[31m-module ngx_http_log_module[m
[31m-  aliases ngx_log[m
[31m-  section 17 384 name[m
[31m-  section 384 713 example configuration[m
[31m-  section 713 7472 directives[m
[31m-  section 732 4055 access_log[m
[31m-  section 4055 6266 log_format[m
[31m-  section 4336 4401 $bytes_sent[m
[31m-  section 4401 4454 $connection[m
[31m-  section 4454 4558 $connection_requests[m
[31m-  section 4558 4656 $msec[m
[31m-  section 4656 4736 $pipe[m
[31m-  section 4736 4834 $request_length[m
[31m-  section 4834 5057 $request_time[m
[31m-  section 5057 5097 $status[m
[31m-  section 5097 5170 $time_iso8601[m
[31m-  section 5170 6266 $time_local[m
[31m-  section 6266 7472 open_log_file_cache[m
[31m-  section 6714 6864 max[m
[31m-  section 6864 7012 inactive[m
[31m-  section 7012 7185 min_uses[m
[31m-  section 7185 7324 valid[m
[31m-  section 7324 7472 off[m
[31m-[m
[31m-module ngx_http_map_module[m
[31m-  aliases ngx_map[m
[31m-  section 17 199 name[m
[31m-  section 199 576 example configuration[m
[31m-  section 576 3780 directives[m
[31m-  section 595 3149 map[m
[31m-  section 1950 2158 default value[m
[31m-  section 2158 2494 hostnames[m
[31m-  section 2494 3149 include file[m
[31m-  section 3149 3505 map_hash_bucket_size[m
[31m-  section 3505 3780 map_hash_max_size[m
[31m-[m
[31m-module ngx_http_memcached_module[m
[31m-  aliases ngx_memcached[m
[31m-  section 17 329 name[m
[31m-  section 329 657 example configuration[m
[31m-  section 657 7024 directives[m
[31m-  section 676 1710 memcached_bind[m
[31m-  section 1710 2082 memcached_buffer_size[m
[31m-  section 2082 2417 memcached_connect_timeout[m
[31m-  section 2417 2812 memcached_force_ranges[m
[31m-  section 2812 3209 memcached_gzip_flag[m
[31m-  section 3209 4811 memcached_next_upstream[m
[31m-  section 3599 3743 error[m
[31m-  section 3743 3894 timeout[m
[31m-  section 3894 3973 invalid_response[m
[31m-  section 3973 4037 not_found[m
[31m-  section 4037 4811 off[m
[31m-  section 4811 5172 memcached_next_upstream_timeout[m
[31m-  section 5172 5536 memcached_next_upstream_tries[m
[31m-  section 5536 6106 memcached_pass[m
[31m-  section 6106 6566 memcached_read_timeout[m
[31m-  section 6566 7024 memcached_send_timeout[m
[31m-  section 7024 7169 embedded variables[m
[31m-  section 7063 7169 $memcached_key[m
[31m-[m
[31m-module ngx_http_mp4_module[m
[31m-  aliases ngx_mp4[m
[31m-  section 17 2915 name[m
[31m-  section 2915 3138 example configuration[m
[31m-  section 3138 5229 directives[m
[31m-  section 3157 3262 mp4[m
[31m-  section 3262 3507 mp4_buffer_size[m
[31m-  section 3507 4032 mp4_max_buffer_size[m
[31m-  section 4032 4811 mp4_limit_rate[m
[31m-  section 4811 5229 mp4_limit_rate_after[m
[31m-[m
[31m-module ngx_http_perl_module[m
[31m-  aliases ngx_perl[m
[31m-  section 17 514 name[m
[31m-  section 514 1950 known issues[m
[31m-  section 1950 2905 example configuration[m
[31m-  section 2905 3688 directives[m
[31m-  section 2924 3121 perl[m
[31m-  section 3121 3258 perl_modules[m
[31m-  section 3258 3484 perl_require[m
[31m-  section 3484 3688 perl_set[m
[31m-  section 3688 3930 calling perl from ssi[m
[31m-  section 3930 8789 the $r request object methods[m
[31m-  section 3980 4036 $r->args[m
[31m-  section 4036 5093 $r->filename[m
[31m-  section 5093 5185 $r->allow_ranges[m
[31m-  section 5185 5275 $r->discard_request_body[m
[31m-  section 5275 5386 $r->header_in(field)[m
[31m-  section 5386 5893 $r->header_only[m
[31m-  section 5893 6114 c<$r->log_error(errno,[m
[31m-  section 6114 6186 $r->print(text, ...)[m
[31m-  section 6186 6485 $r->request_body[m
[31m-  section 6485 6721 $r->request_body_file[m
[31m-  section 6721 6800 $r->request_method[m
[31m-  section 6800 6867 $r->remote_addr[m
[31m-  section 6867 7519 $r->flush[m
[31m-  section 7519 8474 $r->status(code)[m
[31m-  section 8474 8565 $r->unescape(text)[m
[31m-  section 8565 8789 $r->uri[m
[31m-[m
[31m-module ngx_http_proxy_module[m
[31m-  aliases ngx_proxy[m
[31m-  section 17 180 name[m
[31m-  section 180 386 example configuration[m
[31m-  section 386 49689 directives[m
[31m-  section 405 1417 proxy_bind[m
[31m-  section 1417 1910 proxy_buffer_size[m
[31m-  section 1910 3113 proxy_buffering[m
[31m-  section 3113 3542 proxy_buffers[m
[31m-  section 3542 4209 proxy_busy_buffers_size[m
[31m-  section 4209 4615 proxy_cache[m
[31m-  section 4615 5183 proxy_cache_bypass[m
[31m-  section 5183 5623 proxy_cache_convert_head[m
[31m-  section 5623 6048 proxy_cache_key[m
[31m-  section 6048 6681 proxy_cache_lock[m
[31m-  section 6681 7092 proxy_cache_lock_age[m
[31m-  section 7092 7543 proxy_cache_lock_timeout[m
[31m-  section 7543 8082 proxy_cache_methods[m
[31m-  section 8082 8338 proxy_cache_min_uses[m
[31m-  section 8338 12226 proxy_cache_path[m
[31m-  section 12226 13581 proxy_cache_purge[m
[31m-  section 13581 13960 proxy_cache_revalidate[m
[31m-  section 13960 15120 proxy_cache_use_stale[m
[31m-  section 15120 16992 proxy_cache_valid[m
[31m-  section 16992 17317 proxy_connect_timeout[m
[31m-  section 17317 18980 proxy_cookie_domain[m
[31m-  section 18980 20508 proxy_cookie_path[m
[31m-  section 20508 20893 proxy_force_ranges[m
[31m-  section 20893 21290 proxy_headers_hash_bucket_size[m
[31m-  section 21290 21682 proxy_headers_hash_max_size[m
[31m-  section 21682 22186 proxy_hide_header[m
[31m-  section 22186 22632 proxy_http_version[m
[31m-  section 22632 22976 proxy_ignore_client_abort[m
[31m-  section 22976 24091 proxy_ignore_headers[m
[31m-  section 24091 24479 proxy_intercept_errors[m
[31m-  section 24479 25108 proxy_limit_rate[m
[31m-  section 25108 25891 proxy_max_temp_file_size[m
[31m-  section 25891 26168 proxy_method[m
[31m-  section 26168 28760 proxy_next_upstream[m
[31m-  section 26709 26853 error[m
[31m-  section 26853 27004 timeout[m
[31m-  section 27004 27081 invalid_header[m
[31m-  section 27081 27152 http_500[m
[31m-  section 27152 27223 http_502[m
[31m-  section 27223 27294 http_503[m
[31m-  section 27294 27365 http_504[m
[31m-  section 27365 27436 http_403[m
[31m-  section 27436 27507 http_404[m
[31m-  section 27507 27822 non_idempotent[m
[31m-  section 27822 28760 off[m
[31m-  section 28760 29113 proxy_next_upstream_timeout[m
[31m-  section 29113 29469 proxy_next_upstream_tries[m
[31m-  section 29469 30009 proxy_no_cache[m
[31m-  section 30009 32844 proxy_pass[m
[31m-  section 32844 33084 proxy_pass_header[m
[31m-  section 33084 33628 proxy_pass_request_body[m
[31m-  section 33628 34188 proxy_pass_request_headers[m
[31m-  section 34188 34636 proxy_read_timeout[m
[31m-  section 34636 37423 proxy_redirect[m
[31m-  section 37423 38306 proxy_request_buffering[m
[31m-  section 38306 38814 proxy_send_lowat[m
[31m-  section 38814 39260 proxy_send_timeout[m
[31m-  section 39260 39543 proxy_set_body[m
[31m-  section 39543 41195 proxy_set_header[m
[31m-  section 41195 41516 proxy_ssl_certificate[m
[31m-  section 41516 42028 proxy_ssl_certificate_key[m
[31m-  section 42028 42477 proxy_ssl_ciphers[m
[31m-  section 42477 42802 proxy_ssl_crl[m
[31m-  section 42802 43274 proxy_ssl_name[m
[31m-  section 43274 43649 proxy_ssl_password_file[m
[31m-  section 43649 44114 proxy_ssl_server_name[m
[31m-  section 44114 44506 proxy_ssl_session_reuse[m
[31m-  section 44506 44889 proxy_ssl_protocols[m
[31m-  section 44889 45243 proxy_ssl_trusted_certificate[m
[31m-  section 45243 45547 proxy_ssl_verify[m
[31m-  section 45547 45853 proxy_ssl_verify_depth[m
[31m-  section 45853 47886 proxy_store[m
[31m-  section 47886 48368 proxy_store_access[m
[31m-  section 48368 48931 proxy_temp_file_write_size[m
[31m-  section 48931 49689 proxy_temp_path[m
[31m-  section 49689 50446 embedded variables[m
[31m-  section 49870 49976 $proxy_host[m
[31m-  section 49976 50446 $proxy_port[m
[31m-[m
[31m-module ngx_http_random_index_module[m
[31m-  aliases ngx_random_index[m
[31m-  section 17 515 name[m
[31m-  section 515 607 example configuration[m
[31m-  section 607 822 directives[m
[31m-  section 626 822 random_index[m
[31m-[m
[31m-module ngx_http_realip_module[m
[31m-  aliases ngx_realip[m
[31m-  section 17 369 name[m
[31m-  section 369 589 example configuration[m
[31m-  section 589 2535 directives[m
[31m-  section 608 1062 set_real_ip_from[m
[31m-  section 1062 1865 real_ip_header[m
[31m-  section 1865 2535 real_ip_recursive[m
[31m-  section 2535 2741 embedded variables[m
[31m-  section 2574 2652 $realip_remote_addr[m
[31m-  section 2652 2741 $realip_remote_port[m
[31m-[m
[31m-module ngx_http_referer_module[m
[31m-  aliases ngx_referer[m
[31m-  section 17 626 name[m
[31m-  section 626 876 example configuration[m
[31m-  section 876 3136 directives[m
[31m-  section 895 1246 referer_hash_bucket_size[m
[31m-  section 1246 1599 referer_hash_max_size[m
[31m-  section 1599 3136 valid_referers[m
[31m-  section 2088 2164 none[m
[31m-  section 2164 2411 blocked[m
[31m-  section 2411 2510 server_names[m
[31m-  section 2510 2729 arbitrary string[m
[31m-  section 2729 3136 regular expression[m
[31m-  section 3136 3323 embedded variables[m
[31m-  section 3175 3323 $invalid_referer[m
[31m-[m
[31m-module ngx_http_rewrite_module[m
[31m-  aliases ngx_rewrite[m
[31m-  section 17 825 name[m
[31m-  section 825 8155 directives[m
[31m-  section 844 1231 break[m
[31m-  section 1231 3367 if[m
[31m-  section 3367 4773 return[m
[31m-  section 4773 7256 rewrite[m
[31m-  section 5471 5631 last[m
[31m-  section 5631 5760 break[m
[31m-  section 5760 5941 redirect[m
[31m-  section 5941 7256 permanent[m
[31m-  section 7256 7598 rewrite_log[m
[31m-  section 7598 7861 set[m
[31m-  section 7861 8155 uninitialized_variable_warn[m
[31m-  section 8155 9822 internal implementation[m
[31m-[m
[31m-module ngx_http_scgi_module[m
[31m-  aliases ngx_scgi[m
[31m-  section 17 177 name[m
[31m-  section 177 309 example configuration[m
[31m-  section 309 31555 directives[m
[31m-  section 328 1283 scgi_bind[m
[31m-  section 1283 1771 scgi_buffer_size[m
[31m-  section 1771 2957 scgi_buffering[m
[31m-  section 2957 3381 scgi_buffers[m
[31m-  section 3381 4041 scgi_busy_buffers_size[m
[31m-  section 4041 4445 scgi_cache[m
[31m-  section 4445 5009 scgi_cache_bypass[m
[31m-  section 5009 5254 scgi_cache_key[m
[31m-  section 5254 5881 scgi_cache_lock[m
[31m-  section 5881 6284 scgi_cache_lock_age[m
[31m-  section 6284 6729 scgi_cache_lock_timeout[m
[31m-  section 6729 7219 scgi_cache_methods[m
[31m-  section 7219 7473 scgi_cache_min_uses[m
[31m-  section 7473 11355 scgi_cache_path[m
[31m-  section 11355 12711 scgi_cache_purge[m
[31m-  section 12711 13088 scgi_cache_revalidate[m
[31m-  section 13088 14181 scgi_cache_use_stale[m
[31m-  section 14181 16044 scgi_cache_valid[m
[31m-  section 16044 16365 scgi_connect_timeout[m
[31m-  section 16365 16745 scgi_force_ranges[m
[31m-  section 16745 17223 scgi_hide_header[m
[31m-  section 17223 17563 scgi_ignore_client_abort[m
[31m-  section 17563 18673 scgi_ignore_headers[m
[31m-  section 18673 19066 scgi_intercept_errors[m
[31m-  section 19066 19684 scgi_limit_rate[m
[31m-  section 19684 20459 scgi_max_temp_file_size[m
[31m-  section 20459 22829 scgi_next_upstream[m
[31m-  section 20946 21090 error[m
[31m-  section 21090 21241 timeout[m
[31m-  section 21241 21318 invalid_header[m
[31m-  section 21318 21389 http_500[m
[31m-  section 21389 21460 http_503[m
[31m-  section 21460 21531 http_403[m
[31m-  section 21531 21602 http_404[m
[31m-  section 21602 21917 non_idempotent[m
[31m-  section 21917 22829 off[m
[31m-  section 22829 23180 scgi_next_upstream_timeout[m
[31m-  section 23180 23534 scgi_next_upstream_tries[m
[31m-  section 23534 24069 scgi_no_cache[m
[31m-  section 24069 24979 scgi_param[m
[31m-  section 24979 25524 scgi_pass[m
[31m-  section 25524 25760 scgi_pass_header[m
[31m-  section 25760 26084 scgi_pass_request_body[m
[31m-  section 26084 26428 scgi_pass_request_headers[m
[31m-  section 26428 26868 scgi_read_timeout[m
[31m-  section 26868 27699 scgi_request_buffering[m
[31m-  section 27699 28137 scgi_send_timeout[m
[31m-  section 28137 29774 scgi_store[m
[31m-  section 29774 30252 scgi_store_access[m
[31m-  section 30252 30807 scgi_temp_file_write_size[m
[31m-  section 30807 31555 scgi_temp_path[m
[31m-[m
[31m-module ngx_http_secure_link_module[m
[31m-  aliases ngx_secure_link[m
[31m-  section 17 1102 name[m
[31m-  section 1102 5063 directives[m
[31m-  section 1121 2468 secure_link[m
[31m-  section 2468 3845 secure_link_md5[m
[31m-  section 3845 5063 secure_link_secret[m
[31m-  section 5063 5376 embedded variables[m
[31m-  section 5102 5218 $secure_link[m
[31m-  section 5218 5376 $secure_link_expires[m
[31m-[m
[31m-module ngx_http_session_log_module[m
[31m-  aliases ngx_session_log[m
[31m-  section 17 346 name[m
[31m-  section 346 790 example configuration[m
[31m-  section 790 2791 directives[m
[31m-  section 809 1207 session_log_format[m
[31m-  section 1207 2453 session_log_zone[m
[31m-  section 2453 2791 session_log[m
[31m-  section 2791 3057 embedded variables[m
[31m-  section 2906 2958 $session_log_id[m
[31m-  section 2958 3057 $session_log_binary_id[m
[31m-[m
[31m-module ngx_http_slice_module[m
[31m-  aliases ngx_slice[m
[31m-  section 17 427 name[m
[31m-  section 427 883 example configuration[m
[31m-  section 883 1646 directives[m
[31m-  section 902 1646 slice[m
[31m-  section 1646 1942 embedded variables[m
[31m-  section 1764 1942 $slice_range[m
[31m-[m
[31m-module ngx_http_spdy_module[m
[31m-  aliases ngx_spdy[m
[31m-  section 17 718 name[m
[31m-  section 718 1190 known issues[m
[31m-  section 1190 1651 example configuration[m
[31m-  section 1651 2535 directives[m
[31m-  section 1670 2199 spdy_chunk_size[m
[31m-  section 2199 2535 spdy_headers_comp[m
[31m-  section 2535 2870 embedded variables[m
[31m-  section 2652 2748 $spdy[m
[31m-  section 2748 2870 $spdy_request_priority[m
[31m-[m
[31m-module ngx_http_split_clients_module[m
[31m-  aliases ngx_split_clients[m
[31m-  section 17 239 name[m
[31m-  section 239 590 example configuration[m
[31m-  section 590 1350 directives[m
[31m-  section 609 1350 split_clients[m
[31m-[m
[31m-module ngx_http_ssi_module[m
[31m-  aliases ngx_ssi[m
[31m-  section 17 288 name[m
[31m-  section 288 383 example configuration[m
[31m-  section 383 2489 directives[m
[31m-  section 402 654 ssi[m
[31m-  section 654 1236 ssi_last_modified[m
[31m-  section 1236 1556 ssi_min_file_chunk[m
[31m-  section 1556 1895 ssi_silent_errors[m
[31m-  section 1895 2253 ssi_types[m
[31m-  section 2253 2489 ssi_value_length[m
[31m-  section 2489 7531 ssi commands[m
[31m-  section 2683 2865 block[m
[31m-  section 2865 2992 name[m
[31m-  section 2992 3079 config[m
[31m-  section 3079 3275 errmsg[m
[31m-  section 3275 3536 timefmt[m
[31m-  section 3536 3639 echo[m
[31m-  section 3639 3678 var[m
[31m-  section 3678 3811 encoding[m
[31m-  section 3811 4225 default[m
[31m-  section 4225 4543 if[m
[31m-  section 4543 5384 expr[m
[31m-  section 5384 5513 include[m
[31m-  section 5513 5624 file[m
[31m-  section 5624 5960 virtual[m
[31m-  section 5960 6385 stub[m
[31m-  section 6385 6621 wait[m
[31m-  section 6621 7257 set[m
[31m-  section 7257 7354 set[m
[31m-  section 7354 7393 var[m
[31m-  section 7393 7531 value[m
[31m-  section 7531 7910 embedded variables[m
[31m-  section 7637 7776 $date_local[m
[31m-  section 7776 7910 $date_gmt[m
[31m-[m
[31m-module ngx_http_ssl_module[m
[31m-  aliases ngx_ssl[m
[31m-  section 17 375 name[m
[31m-  section 375 1418 example configuration[m
[31m-  section 1418 14012 directives[m
[31m-  section 1437 1752 ssl[m
[31m-  section 1752 2220 ssl_buffer_size[m
[31m-  section 2220 3340 ssl_certificate[m
[31m-  section 3340 3748 ssl_certificate_key[m
[31m-  section 3748 4293 ssl_ciphers[m
[31m-  section 4293 4722 ssl_client_certificate[m
[31m-  section 4722 4985 ssl_crl[m
[31m-  section 4985 5206 ssl_dhparam[m
[31m-  section 5206 5900 ssl_ecdh_curve[m
[31m-  section 5900 6703 ssl_password_file[m
[31m-  section 6703 6990 ssl_prefer_server_ciphers[m
[31m-  section 6990 7594 ssl_protocols[m
[31m-  section 7594 8997 ssl_session_cache[m
[31m-  section 7960 8096 off[m
[31m-  section 8096 8277 none[m
[31m-  section 8277 8512 builtin[m
[31m-  section 8512 8997 shared[m
[31m-  section 8997 9781 ssl_session_ticket_key[m
[31m-  section 9781 10096 ssl_session_tickets[m
[31m-  section 10096 10339 ssl_session_timeout[m
[31m-  section 10339 11113 ssl_stapling[m
[31m-  section 11113 11535 ssl_stapling_file[m
[31m-  section 11535 12016 ssl_stapling_responder[m
[31m-  section 12016 12510 ssl_stapling_verify[m
[31m-  section 12510 12983 ssl_trusted_certificate[m
[31m-  section 12983 13803 ssl_verify_client[m
[31m-  section 13803 14012 ssl_verify_depth[m
[31m-  section 14012 14584 error processing[m
[31m-  section 14584 16324 embedded variables[m
[31m-  section 14694 14792 $ssl_cipher[m
[31m-  section 14792 15047 $ssl_client_cert[m
[31m-  section 15047 15185 $ssl_client_fingerprint[m
[31m-  section 15185 15307 $ssl_client_raw_cert[m
[31m-  section 15307 15429 $ssl_client_serial[m
[31m-  section 15429 15560 $ssl_client_s_dn[m
[31m-  section 15560 15690 $ssl_client_i_dn[m
[31m-  section 15690 15867 $ssl_client_verify[m
[31m-  section 15867 15952 $ssl_protocol[m
[31m-  section 15952 16095 $ssl_server_name[m
[31m-  section 16095 16192 $ssl_session_id[m
[31m-  section 16192 16324 $ssl_session_reused[m
[31m-[m
[31m-module ngx_http_status_module[m
[31m-  aliases ngx_status[m
[31m-  section 17 268 name[m
[31m-  section 268 2572 example configuration[m
[31m-  section 2572 3632 directives[m
[31m-  section 2591 2785 status[m
[31m-  section 2785 3337 status_format[m
[31m-  section 3337 3632 status_zone[m
[31m-  section 3632 13552 data[m
[31m-  section 3703 3787 version[m
[31m-  section 3787 3835 nginx_version[m
[31m-  section 3835 3915 address[m
[31m-  section 3915 3996 generation[m
[31m-  section 3996 4098 load_timestamp[m
[31m-  section 4098 4166 timestamp[m
[31m-  section 4166 4244 pid[m
[31m-  section 4244 4277 processes[m
[31m-  section 4277 4388 respawned[m
[31m-  section 4388 4423 connections[m
[31m-  section 4423 4497 accepted[m
[31m-  section 4497 4569 dropped[m
[31m-  section 4569 4641 active[m
[31m-  section 4641 4721 idle[m
[31m-  section 4721 4748 ssl[m
[31m-  section 4748 4822 handshakes[m
[31m-  section 4822 4899 handshakes_failed[m
[31m-  section 4899 4999 session_reuses[m
[31m-  section 4999 5031 requests[m
[31m-  section 5031 5090 total[m
[31m-  section 5090 5165 current[m
[31m-  section 5165 5227 server_zones[m
[31m-  section 5227 5320 processing[m
[31m-  section 5320 5404 requests[m
[31m-  section 5404 5437 responses[m
[31m-  section 5437 5643 total[m
[31m-  section 5643 5736 discarded[m
[31m-  section 5736 5810 received[m
[31m-  section 5810 5886 sent[m
[31m-  section 5886 6049 upstreams[m
[31m-  section 6049 6149 peers[m
[31m-  section 6149 6190 id[m
[31m-  section 6190 6267 server[m
[31m-  section 6267 6377 backup[m
[31m-  section 6377 6450 weight[m
[31m-  section 6450 6595 state[m
[31m-  section 6595 6660 active[m
[31m-  section 6660 6740 max_conns[m
[31m-  section 6740 6827 requests[m
[31m-  section 6827 6860 responses[m
[31m-  section 6860 7076 total[m
[31m-  section 7076 7144 sent[m
[31m-  section 7144 7222 received[m
[31m-  section 7222 7318 fails[m
[31m-  section 7318 7527 unavail[m
[31m-  section 7527 7564 health_checks[m
[31m-  section 7564 7663 checks[m
[31m-  section 7663 7721 fails[m
[31m-  section 7721 7818 unhealthy[m
[31m-  section 7818 7971 last_passed[m
[31m-  section 7971 8077 downtime[m
[31m-  section 8077 8205 downstart[m
[31m-  section 8205 8333 selected[m
[31m-  section 8333 8548 header_time[m
[31m-  section 8548 8775 response_time[m
[31m-  section 8775 8869 keepalive[m
[31m-  section 8869 8977 queue[m
[31m-  section 8977 9043 size[m
[31m-  section 9043 9142 max_size[m
[31m-  section 9142 9257 overflows[m
[31m-  section 9257 9358 caches[m
[31m-  section 9358 9410 size[m
[31m-  section 9410 9510 max_size[m
[31m-  section 9510 9729 cold[m
[31m-  section 9729 9879 responses[m
[31m-  section 9879 10025 bytes[m
[31m-  section 10025 10184 responses[m
[31m-  section 10184 10262 bytes[m
[31m-  section 10262 10348 responses_written[m
[31m-  section 10348 10450 bytes_written[m
[31m-  section 10450 10480 stream[m
[31m-  section 10480 10542 server_zones[m
[31m-  section 10542 10638 processing[m
[31m-  section 10638 10721 connections[m
[31m-  section 10721 10795 received[m
[31m-  section 10795 10871 sent[m
[31m-  section 10871 11038 upstreams[m
[31m-  section 11038 11139 peers[m
[31m-  section 11139 11180 id[m
[31m-  section 11180 11259 server[m
[31m-  section 11259 11371 backup[m
[31m-  section 11371 11446 weight[m
[31m-  section 11446 11572 state[m
[31m-  section 11572 11630 active[m
[31m-  section 11630 11723 connections[m
[31m-  section 11723 11895 connect_time[m
[31m-  section 11895 12070 first_byte_time[m
[31m-  section 12070 12242 response_time[m
[31m-  section 12242 12310 sent[m
[31m-  section 12310 12388 received[m
[31m-  section 12388 12484 fails[m
[31m-  section 12484 12698 unavail[m
[31m-  section 12698 12735 health_checks[m
[31m-  section 12735 12836 checks[m
[31m-  section 12836 12894 fails[m
[31m-  section 12894 12991 unhealthy[m
[31m-  section 12991 13146 last_passed[m
[31m-  section 13146 13252 downtime[m
[31m-  section 13252 13380 downstart[m
[31m-  section 13380 13552 selected[m
[31m-  section 13552 14808 compatibility[m
[31m-[m
[31m-module ngx_http_stub_status_module[m
[31m-  aliases ngx_stub_status[m
[31m-  section 17 331 name[m
[31m-  section 331 679 example configuration[m
[31m-  section 679 995 directives[m
[31m-  section 698 995 stub_status[m
[31m-  section 995 1852 data[m
[31m-  section 1066 1183 active connections[m
[31m-  section 1183 1256 accepts[m
[31m-  section 1256 1469 handled[m
[31m-  section 1469 1531 requests[m
[31m-  section 1531 1632 reading[m
[31m-  section 1632 1746 writing[m
[31m-  section 1746 1852 waiting[m
[31m-  section 1852 2276 embedded variables[m
[31m-  section 1985 2062 $connections_active[m
[31m-  section 2062 2129 $connections_reading[m
[31m-  section 2129 2196 $connections_writing[m
[31m-  section 2196 2276 $connections_waiting[m
[31m-[m
[31m-module ngx_http_sub_module[m
[31m-  aliases ngx_sub[m
[31m-  section 17 337 name[m
[31m-  section 337 595 example configuration[m
[31m-  section 595 2140 directives[m
[31m-  section 614 1040 sub_filter[m
[31m-  section 1040 1521 sub_filter_last_modified[m
[31m-  section 1521 1776 sub_filter_once[m
[31m-  section 1776 2140 sub_filter_types[m
[31m-[m
[31m-module ngx_http_upstream_conf_module[m
[31m-  aliases ngx_upstream_conf[m
[31m-  section 17 480 name[m
[31m-  section 480 772 example configuration[m
[31m-  section 772 6715 directives[m
[31m-  section 791 6715 upstream_conf[m
[31m-  section 4190 6715 drain=[m
[31m-[m
[31m-module ngx_http_upstream_module[m
[31m-  aliases ngx_upstream[m
[31m-  section 17 362 name[m
[31m-  section 362 1553 example configuration[m
[31m-  section 1553 27480 directives[m
[31m-  section 1572 2652 upstream[m
[31m-  section 2652 7471 server[m
[31m-  section 7471 8174 zone[m
[31m-  section 8174 8923 state[m
[31m-  section 8923 10044 hash[m
[31m-  section 10044 11245 ip_hash[m
[31m-  section 11245 13673 keepalive[m
[31m-  section 13673 14975 ntlm[m
[31m-  section 14975 15411 least_conn[m
[31m-  section 15411 16156 least_time[m
[31m-  section 16156 19074 health_check[m
[31m-  section 19074 21404 match[m
[31m-  section 19302 19342 status 200;[m
[31m-  section 19342 19388 status ! 500;[m
[31m-  section 19388 19439 status 200 204;[m
[31m-  section 19439 19501 status ! 301 302;[m
[31m-  section 19501 19570 status 200-399;[m
[31m-  section 19570 19645 status ! 400-599;[m
[31m-  section 19645 19738 status 301-303 307;[m
[31m-  section 19738 19853 c<header content-type = texte<sol>html;>[m
[31m-  section 19853 19980 c<header content-type != texte<sol>html;>[m
[31m-  section 19980 20101 header connection ~ close;[m
[31m-  section 20101 20227 header connection !~ close;[m
[31m-  section 20227 20278 header host;[m
[31m-  section 20278 20372 header ! x-accel-redirect;[m
[31m-  section 20372 20475 body ~ "welcome to nginx!";[m
[31m-  section 20475 21404 body !~ "welcome to nginx!";[m
[31m-  section 21404 22227 queue[m
[31m-  section 22227 27060 sticky[m
[31m-  section 22861 23659 cookie[m
[31m-  section 23659 23956 expires=time[m
[31m-  section 23956 24046 domain=domain[m
[31m-  section 24046 24126 httponly[m
[31m-  section 24126 24203 secure[m
[31m-  section 24203 24377 path=path[m
[31m-  section 24377 25594 route[m
[31m-  section 25594 27060 learn[m
[31m-  section 27060 27480 sticky_cookie_insert[m
[31m-  section 27480 30491 embedded variables[m
[31m-  section 27601 28206 $upstream_addr[m
[31m-  section 28206 28451 $upstream_cache_status[m
[31m-  section 28451 28789 $upstream_connect_time[m
[31m-  section 28789 29016 $upstream_cookie_i<name>[m
[31m-  section 29016 29306 $upstream_header_time[m
[31m-  section 29306 29724 $upstream_http_i<name>[m
[31m-  section 29724 29984 $upstream_response_length[m
[31m-  section 29984 30260 $upstream_response_time[m
[31m-  section 30260 30491 $upstream_status[m
[31m-[m
[31m-module ngx_http_userid_module[m
[31m-  aliases ngx_userid[m
[31m-  section 17 390 name[m
[31m-  section 390 637 example configuration[m
[31m-  section 637 4188 directives[m
[31m-  section 656 1341 userid[m
[31m-  section 944 1041 on[m
[31m-  section 1041 1138 v1[m
[31m-  section 1138 1236 log[m
[31m-  section 1236 1341 off[m
[31m-  section 1341 1640 userid_domain[m
[31m-  section 1640 2083 userid_expires[m
[31m-  section 2083 2906 userid_mark[m
[31m-  section 2906 3091 userid_name[m
[31m-  section 3091 3459 userid_p3p[m
[31m-  section 3459 3669 userid_path[m
[31m-  section 3669 4188 userid_service[m
[31m-  section 4188 4723 embedded variables[m
[31m-  section 4307 4380 $uid_got[m
[31m-  section 4380 4641 $uid_reset[m
[31m-  section 4641 4723 $uid_set[m
[31m-[m
[31m-module ngx_http_uwsgi_module[m
[31m-  aliases ngx_uwsgi[m
[31m-  section 17 180 name[m
[31m-  section 180 315 example configuration[m
[31m-  section 315 37399 directives[m
[31m-  section 334 1294 uwsgi_bind[m
[31m-  section 1294 1785 uwsgi_buffer_size[m
[31m-  section 1785 2982 uwsgi_buffering[m
[31m-  section 2982 3409 uwsgi_buffers[m
[31m-  section 3409 4074 uwsgi_busy_buffers_size[m
[31m-  section 4074 4480 uwsgi_cache[m
[31m-  section 4480 5049 uwsgi_cache_bypass[m
[31m-  section 5049 5297 uwsgi_cache_key[m
[31m-  section 5297 5928 uwsgi_cache_lock[m
[31m-  section 5928 6335 uwsgi_cache_lock_age[m
[31m-  section 6335 6784 uwsgi_cache_lock_timeout[m
[31m-  section 6784 7277 uwsgi_cache_methods[m
[31m-  section 7277 7533 uwsgi_cache_min_uses[m
[31m-  section 7533 11419 uwsgi_cache_path[m
[31m-  section 11419 12782 uwsgi_cache_purge[m
[31m-  section 12782 13161 uwsgi_cache_revalidate[m
[31m-  section 13161 14261 uwsgi_cache_use_stale[m
[31m-  section 14261 16133 uwsgi_cache_valid[m
[31m-  section 16133 16456 uwsgi_connect_timeout[m
[31m-  section 16456 16839 uwsgi_force_ranges[m
[31m-  section 16839 17321 uwsgi_hide_header[m
[31m-  section 17321 17663 uwsgi_ignore_client_abort[m
[31m-  section 17663 18776 uwsgi_ignore_headers[m
[31m-  section 18776 19171 uwsgi_intercept_errors[m
[31m-  section 19171 19795 uwsgi_limit_rate[m
[31m-  section 19795 20576 uwsgi_max_temp_file_size[m
[31m-  section 20576 20896 uwsgi_modifier1[m
[31m-  section 20896 21216 uwsgi_modifier2[m
[31m-  section 21216 23588 uwsgi_next_upstream[m
[31m-  section 21705 21849 error[m
[31m-  section 21849 22000 timeout[m
[31m-  section 22000 22077 invalid_header[m
[31m-  section 22077 22148 http_500[m
[31m-  section 22148 22219 http_503[m
[31m-  section 22219 22290 http_403[m
[31m-  section 22290 22361 http_404[m
[31m-  section 22361 22676 non_idempotent[m
[31m-  section 22676 23588 off[m
[31m-  section 23588 23941 uwsgi_next_upstream_timeout[m
[31m-  section 23941 24297 uwsgi_next_upstream_tries[m
[31m-  section 24297 24837 uwsgi_no_cache[m
[31m-  section 24837 25755 uwsgi_param[m
[31m-  section 25755 26608 uwsgi_pass[m
[31m-  section 26608 26846 uwsgi_pass_header[m
[31m-  section 26846 27174 uwsgi_pass_request_body[m
[31m-  section 27174 27522 uwsgi_pass_request_headers[m
[31m-  section 27522 27966 uwsgi_read_timeout[m
[31m-  section 27966 28800 uwsgi_request_buffering[m
[31m-  section 28800 29242 uwsgi_send_timeout[m
[31m-  section 29242 29563 uwsgi_ssl_certificate[m
[31m-  section 29563 30075 uwsgi_ssl_certificate_key[m
[31m-  section 30075 30524 uwsgi_ssl_ciphers[m
[31m-  section 30524 30849 uwsgi_ssl_crl[m
[31m-  section 30849 31324 uwsgi_ssl_name[m
[31m-  section 31324 31699 uwsgi_ssl_password_file[m
[31m-  section 31699 32082 uwsgi_ssl_protocols[m
[31m-  section 32082 32547 uwsgi_ssl_server_name[m
[31m-  section 32547 32988 uwsgi_ssl_session_reuse[m
[31m-  section 32988 33342 uwsgi_ssl_trusted_certificate[m
[31m-  section 33342 33646 uwsgi_ssl_verify[m
[31m-  section 33646 33952 uwsgi_ssl_verify_depth[m
[31m-  section 33952 35600 uwsgi_store[m
[31m-  section 35600 36082 uwsgi_store_access[m
[31m-  section 36082 36643 uwsgi_temp_file_write_size[m
[31m-  section 36643 37399 uwsgi_temp_path[m
[31m-[m
[31m-module ngx_http_v2_module[m
[31m-  aliases ngx_v2[m
[31m-  section 17 402 name[m
[31m-  section 402 705 known issues[m
[31m-  section 705 1509 example configuration[m
[31m-  section 1509 3994 directives[m
[31m-  section 1528 1931 http2_chunk_size[m
[31m-  section 1931 2266 http2_body_preread_size[m
[31m-  section 2266 2485 http2_idle_timeout[m
[31m-  section 2485 2733 http2_max_concurrent_streams[m
[31m-  section 2733 3211 http2_max_field_size[m
[31m-  section 3211 3546 http2_max_header_size[m
[31m-  section 3546 3747 http2_recv_buffer_size[m
[31m-  section 3747 3994 http2_recv_timeout[m
[31m-  section 3994 4294 embedded variables[m
[31m-  section 4109 4294 $http2[m
[31m-[m
[31m-module ngx_http_xslt_module[m
[31m-  aliases ngx_xslt[m
[31m-  section 17 455 name[m
[31m-  section 455 672 example configuration[m
[31m-  section 672 4661 directives[m
[31m-  section 691 1268 xml_entities[m
[31m-  section 1268 1863 xslt_last_modified[m
[31m-  section 1863 2509 xslt_param[m
[31m-  section 2509 3101 xslt_string_param[m
[31m-  section 3101 4211 xslt_stylesheet[m
[31m-  section 4211 4661 xslt_types[m
[31m-[m
[31m-module ngx_mail_auth_http_module[m
[31m-  section 17 95 name[m
[31m-  section 95 1290 directives[m
[31m-  section 114 307 auth_http[m
[31m-  section 307 684 auth_http_header[m
[31m-  section 684 1074 auth_http_pass_client_cert[m
[31m-  section 1074 1290 auth_http_timeout[m
[31m-  section 1290 5162 protocol[m
[31m-[m
[31m-module ngx_mail_core_module[m
[31m-  section 17 206 name[m
[31m-  section 206 1216 example configuration[m
[31m-  section 1216 7961 directives[m
[31m-  section 1235 4813 listen[m
[31m-  section 4813 4969 mail[m
[31m-  section 4969 5702 protocol[m
[31m-  section 5702 6888 resolver[m
[31m-  section 6888 7116 resolver_timeout[m
[31m-  section 7116 7222 server[m
[31m-  section 7222 7763 server_name[m
[31m-  section 7763 7961 timeout[m
[31m-[m
[31m-module ngx_mail_imap_module[m
[31m-  section 17 85 name[m
[31m-  section 85 1896 directives[m
[31m-  section 104 663 imap_auth[m
[31m-  section 330 423 login[m
[31m-  section 423 494 plain[m
[31m-  section 494 663 cram-md5[m
[31m-  section 663 1587 imap_capabilities[m
[31m-  section 1587 1896 imap_client_buffer[m
[31m-[m
[31m-module ngx_mail_pop3_module[m
[31m-  section 17 85 name[m
[31m-  section 85 1855 directives[m
[31m-  section 104 882 pop3_auth[m
[31m-  section 330 573 plain[m
[31m-  section 573 713 apop[m
[31m-  section 713 882 cram-md5[m
[31m-  section 882 1855 pop3_capabilities[m
[31m-[m
[31m-module ngx_mail_proxy_module[m
[31m-  section 17 87 name[m
[31m-  section 87 3026 directives[m
[31m-  section 106 407 proxy_buffer[m
[31m-  section 407 1363 proxy_pass_error_message[m
[31m-  section 1363 1689 proxy_timeout[m
[31m-  section 1689 3026 xclient[m
[31m-[m
[31m-module ngx_mail_smtp_module[m
[31m-  section 17 85 name[m
[31m-  section 85 1487 directives[m
[31m-  section 104 765 smtp_auth[m
[31m-  section 379 472 login[m
[31m-  section 472 543 plain[m
[31m-  section 543 696 cram-md5[m
[31m-  section 696 765 none[m
[31m-  section 765 1487 smtp_capabilities[m
[31m-[m
[31m-module ngx_mail_ssl_module[m
[31m-  section 17 428 name[m
[31m-  section 428 1372 example configuration[m
[31m-  section 1372 11101 directives[m
[31m-  section 1391 1580 ssl[m
[31m-  section 1580 2078 ssl_certificate[m
[31m-  section 2078 2478 ssl_certificate_key[m
[31m-  section 2478 3023 ssl_ciphers[m
[31m-  section 3023 3448 ssl_client_certificate[m
[31m-  section 3448 3712 ssl_crl[m
[31m-  section 3712 3933 ssl_dhparam[m
[31m-  section 3933 4627 ssl_ecdh_curve[m
[31m-  section 4627 5432 ssl_password_file[m
[31m-  section 5432 5722 ssl_prefer_server_ciphers[m
[31m-  section 5722 6325 ssl_protocols[m
[31m-  section 6325 7720 ssl_session_cache[m
[31m-  section 6691 6827 off[m
[31m-  section 6827 7008 none[m
[31m-  section 7008 7243 builtin[m
[31m-  section 7243 7720 shared[m
[31m-  section 7720 8504 ssl_session_ticket_key[m
[31m-  section 8504 8819 ssl_session_tickets[m
[31m-  section 8819 9062 ssl_session_timeout[m
[31m-  section 9062 9486 ssl_trusted_certificate[m
[31m-  section 9486 10421 ssl_verify_client[m
[31m-  section 10421 10676 ssl_verify_depth[m
[31m-  section 10676 11101 starttls[m
[31m-  section 10847 10956 on[m
[31m-  section 10956 11028 off[m
[31m-  section 11028 11101 only[m
[31m-[m
[31m-module ngx_stream_access_module[m
[31m-  section 17 206 name[m
[31m-  section 206 673 example configuration[m
[31m-  section 673 1336 directives[m
[31m-  section 692 1015 allow[m
[31m-  section 1015 1336 deny[m
[31m-[m
[31m-module ngx_stream_core_module[m
[31m-  section 17 283 name[m
[31m-  section 283 1283 example configuration[m
[31m-  section 1283 7287 directives[m
[31m-  section 1302 5447 listen[m
[31m-  section 5447 6384 resolver[m
[31m-  section 6384 6694 resolver_timeout[m
[31m-  section 6694 6802 server[m
[31m-  section 6802 6964 stream[m
[31m-  section 6964 7287 tcp_nodelay[m
[31m-[m
[31m-module ngx_stream_limit_conn_module[m
[31m-  section 17 297 name[m
[31m-  section 297 575 example configuration[m
[31m-  section 575 2622 directives[m
[31m-  section 594 1321 limit_conn[m
[31m-  section 1321 1626 limit_conn_log_level[m
[31m-  section 1626 2622 limit_conn_zone[m
[31m-[m
[31m-module ngx_stream_proxy_module[m
[31m-  section 17 229 name[m
[31m-  section 229 739 example configuration[m
[31m-  section 739 9742 directives[m
[31m-  section 758 1688 proxy_bind[m
[31m-  section 1688 2043 proxy_buffer_size[m
[31m-  section 2043 2273 proxy_connect_timeout[m
[31m-  section 2273 2791 proxy_download_rate[m
[31m-  section 2791 3190 proxy_next_upstream[m
[31m-  section 3190 3466 proxy_next_upstream_timeout[m
[31m-  section 3466 3756 proxy_next_upstream_tries[m
[31m-  section 3756 4278 proxy_pass[m
[31m-  section 4278 4606 proxy_protocol[m
[31m-  section 4606 5063 proxy_responses[m
[31m-  section 5063 5281 proxy_ssl[m
[31m-  section 5281 5527 proxy_ssl_certificate[m
[31m-  section 5527 5780 proxy_ssl_certificate_key[m
[31m-  section 5780 6157 proxy_ssl_ciphers[m
[31m-  section 6157 6407 proxy_ssl_crl[m
[31m-  section 6407 6811 proxy_ssl_name[m
[31m-  section 6811 7117 proxy_ssl_password_file[m
[31m-  section 7117 7507 proxy_ssl_server_name[m
[31m-  section 7507 7875 proxy_ssl_session_reuse[m
[31m-  section 7875 8186 proxy_ssl_protocols[m
[31m-  section 8186 8465 proxy_ssl_trusted_certificate[m
[31m-  section 8465 8694 proxy_ssl_verify[m
[31m-  section 8694 8925 proxy_ssl_verify_depth[m
[31m-  section 8925 9253 proxy_timeout[m
[31m-  section 9253 9742 proxy_upload_rate[m
[31m-[m
[31m-module ngx_stream_ssl_module[m
[31m-  section 17 362 name[m
[31m-  section 362 1310 example configuration[m
[31m-  section 1310 7729 directives[m
[31m-  section 1329 1829 ssl_certificate[m
[31m-  section 1829 2223 ssl_certificate_key[m
[31m-  section 2223 2659 ssl_ciphers[m
[31m-  section 2659 2837 ssl_dhparam[m
[31m-  section 2837 3443 ssl_ecdh_curve[m
[31m-  section 3443 3657 ssl_handshake_timeout[m
[31m-  section 3657 4407 ssl_password_file[m
[31m-  section 4407 4699 ssl_prefer_server_ciphers[m
[31m-  section 4699 5074 ssl_protocols[m
[31m-  section 5074 6471 ssl_session_cache[m
[31m-  section 5442 5578 off[m
[31m-  section 5578 5759 none[m
[31m-  section 5759 5994 builtin[m
[31m-  section 5994 6471 shared[m
[31m-  section 6471 7212 ssl_session_ticket_key[m
[31m-  section 7212 7484 ssl_session_tickets[m
[31m-  section 7484 7729 ssl_session_timeout[m
[31m-[m
[31m-module ngx_stream_upstream_module[m
[31m-  section 17 264 name[m
[31m-  section 264 1465 example configuration[m
[31m-  section 1465 14967 directives[m
[31m-  section 1484 2578 upstream[m
[31m-  section 2578 6961 server[m
[31m-  section 6961 7618 zone[m
[31m-  section 7618 8367 state[m
[31m-  section 8367 9483 hash[m
[31m-  section 9483 9839 least_conn[m
[31m-  section 9839 10658 least_time[m
[31m-  section 10658 12862 health_check[m
[31m-  section 12862 13171 health_check_timeout[m
[31m-  section 13171 14967 match[m
[31m-[m
[31m-module request_processing[m
[31m-  section 18 85 name[m
[31m-  section 85 1590 name-based virtual servers[m
[31m-  section 1590 2289 how to prevent processing requests with undefined server names[m
[31m-  section 2289 4031 mixed name-based and ip-based virtual servers[m
[31m-  section 4031 7803 a simple php site configuration[m
[31m-[m
[31m-module server_names[m
[31m-  section 18 1308 name[m
[31m-  section 1308 1980 wildcard names[m
[31m-  section 1980 3759 regular expressions names[m
[31m-  section 3759 6442 miscellaneous names[m
[31m-  section 6442 9510 optimization[m
[31m-  section 9510 10398 compatibility[m
[31m-[m
[31m-module switches[m
[31m-  section 18 1616 name[m
[31m-[m
[31m-module syntax[m
[31m-  section 18 963 name[m
[31m-[m
[31m-module sys_errlist[m
[31m-  section 18 535 name[m
[31m-[m
[31m-module syslog[m
[31m-  section 18 2131 name[m
[31m-  section 223 598 server=address[m
[31m-  section 598 1079 facility=string[m
[31m-  section 1079 1505 severity=string[m
[31m-  section 1505 1598 tag=string[m
[31m-  section 1598 2131 nohostname[m
[31m-[m
[31m-module variables_in_config[m
[31m-  section 18 717 name[m
[31m-[m
[31m-module websocket[m
[31m-  section 18 2478 name[m
[31m-[m
[31m-module welcome_nginx_facebook[m
[31m-  section 18 5785 name[m
[31m-[m
[31m-module windows[m
[31m-  section 18 2249 name[m
[31m-  section 2249 2726 known issues[m
[31m-  section 2726 2975 possible future enhancements[m
[31m-[m
[31m-dist array-var-nginx-module-0.05[m
[31m-  aliases ngx_array_var ngx_http_array_var_module[m
[31m-  modules array-var-nginx-module-0.05[m
[31m-[m
[31m-module array-var-nginx-module-0.05[m
[31m-  aliases ngx_array_var[m
[31m-  section 18 247 name[m
[31m-  section 247 768 synopsis[m
[31m-  section 768 1305 description[m
[31m-  section 1305 7683 directives[m
[31m-  section 1327 2212 array_split[m
[31m-  section 2212 2960 array_join[m
[31m-  section 2960 4290 array_map[m
[31m-  section 4290 7683 array_map_op[m
[31m-  section 7683 9463 installation[m
[31m-  section 8879 9463 building as a dynamic module[m
[31m-  section 9463 10218 compatibility[m
[31m-  section 10218 10365 source repository[m
[31m-  section 10365 10515 getting involved[m
[31m-  section 10515 10614 author[m
[31m-  section 10614 12066 copyright & license[m
[31m-  section 12066 12302 see also[m
[31m-[m
[31m-dist drizzle-nginx-module-0.1.9[m
[31m-  aliases ngx_drizzle ngx_http_drizzle_module[m
[31m-  modules drizzle-nginx-module-0.1.9[m
[31m-[m
[31m-module drizzle-nginx-module-0.1.9[m
[31m-  aliases ngx_drizzle[m
[31m-  section 19 320 name[m
[31m-  section 320 465 version[m
[31m-  section 465 1704 synopsis[m
[31m-  section 1704 4351 description[m
[31m-  section 2566 3322 keepalive connection pool[m
[31m-  section 3322 4351 last insert id[m
[31m-  section 4351 12782 directives[m
[31m-  section 4373 6485 drizzle_server[m
[31m-  section 6485 7814 drizzle_keepalive[m
[31m-  section 7814 8507 drizzle_query[m
[31m-  section 8507 9195 drizzle_pass[m
[31m-  section 9195 9664 drizzle_connect_timeout[m
[31m-  section 9664 10155 drizzle_send_query_timeout[m
[31m-  section 10155 10672 drizzle_recv_cols_timeout[m
[31m-  section 10672 11191 drizzle_recv_rows_timeout[m
[31m-  section 11191 11518 drizzle_buffer_size[m
[31m-  section 11518 11851 drizzle_module_header[m
[31m-  section 11851 12782 drizzle_status[m
[31m-  section 12782 15137 variables[m
[31m-  section 12855 15137 $drizzle_thread_id[m
[31m-  section 15137 18598 output format[m
[31m-  section 16358 16926 rds header part[m
[31m-  section 16926 18163 rds body part[m
[31m-  section 17126 17551 columns[m
[31m-  section 17551 18163 rows[m
[31m-  section 17722 17816 row flag[m
[31m-  section 17816 18163 fields data[m
[31m-  section 18163 18598 rds buffer limitations[m
[31m-  section 18598 18817 status code[m
[31m-  section 18817 19353 caveats[m
[31m-  section 19353 20457 trouble shooting[m
[31m-  section 20457 20924 known issues[m
[31m-  section 20924 24049 installation[m
[31m-  section 24049 24970 compatibility[m
[31m-  section 24970 25257 community[m
[31m-  section 24991 25127 english mailing list[m
[31m-  section 25127 25257 chinese mailing list[m
[31m-  section 25257 25552 report bugs[m
[31m-  section 25552 25694 source repository[m
[31m-  section 25694 26357 test suite[m
[31m-  section 26357 27667 todo[m
[31m-  section 27667 27833 changes[m
[31m-  section 27833 28121 authors[m
[31m-  section 28121 29797 copyright & license[m
[31m-  section 29797 30554 see also[m
[31m-[m
[31m-dist echo-nginx-module-0.59[m
[31m-  aliases ngx_echo ngx_http_echo_module[m
[31m-  modules echo-nginx-module-0.59[m
[31m-[m
[31m-module echo-nginx-module-0.59[m
[31m-  aliases ngx_echo[m
[31m-  section 18 269 name[m
[31m-  section 269 406 version[m
[31m-  section 406 4556 synopsis[m
[31m-  section 4556 6736 description[m
[31m-  section 6736 32807 content handler directives[m
[31m-  section 8244 10630 echo[m
[31m-  section 10630 12000 echo_duplicate[m
[31m-  section 12000 13960 echo_flush[m
[31m-  section 13960 14811 echo_sleep[m
[31m-  section 14811 15364 echo_blocking_sleep[m
[31m-  section 15364 16594 echo_reset_timer[m
[31m-  section 16594 18481 echo_read_request_body[m
[31m-  section 18481 21713 echo_location_async[m
[31m-  section 21713 23995 echo_location[m
[31m-  section 23995 26762 echo_subrequest_async[m
[31m-  section 26762 27458 echo_subrequest[m
[31m-  section 27458 29447 echo_foreach_split[m
[31m-  section 29447 29752 echo_end[m
[31m-  section 29752 30557 echo_request_body[m
[31m-  section 30557 32054 echo_exec[m
[31m-  section 32054 32807 echo_status[m
[31m-  section 32807 35511 filter directives[m
[31m-  section 33057 34451 echo_before_body[m
[31m-  section 34451 35511 echo_after_body[m
[31m-  section 35511 39973 variables[m
[31m-  section 35532 35649 $echo_it[m
[31m-  section 35649 36134 $echo_timer_elapsed[m
[31m-  section 36134 36390 $echo_request_body[m
[31m-  section 36390 37017 $echo_request_method[m
[31m-  section 37017 37355 $echo_client_request_method[m
[31m-  section 37355 38240 $echo_client_request_headers[m
[31m-  section 38240 38531 $echo_cacheable_request_uri[m
[31m-  section 38531 39091 $echo_request_uri[m
[31m-  section 39091 39712 $echo_incr[m
[31m-  section 39712 39973 $echo_response_status[m
[31m-  section 39973 41595 installation[m
[31m-  section 41595 43017 compatibility[m
[31m-  section 43017 43757 modules that use this module for testing[m
[31m-  section 43757 44044 community[m
[31m-  section 43778 43914 english mailing list[m
[31m-  section 43914 44044 chinese mailing list[m
[31m-  section 44044 44513 report bugs[m
[31m-  section 44513 44650 source repository[m
[31m-  section 44650 44812 changes[m
[31m-  section 44812 45889 test suite[m
[31m-  section 45889 48202 todo[m
[31m-  section 48202 48358 getting involved[m
[31m-  section 48358 48576 author[m
[31m-  section 48576 50040 copyright & license[m
[31m-  section 50040 50486 see also[m
[31m-[m
[31m-dist encrypted-session-nginx-module-0.05[m
[31m-  aliases ngx_encrypted_session ngx_http_encrypted_session_module[m
[31m-  modules encrypted-session-nginx-module-0.05[m
[31m-[m
[31m-module encrypted-session-nginx-module-0.05[m
[31m-  aliases ngx_encrypted_session[m
[31m-  section 18 237 name[m
[31m-  section 237 1194 synopsis[m
[31m-  section 1194 2200 description[m
[31m-  section 2200 4895 directives[m
[31m-  section 2222 2519 encrypted_session_key[m
[31m-  section 2519 2856 encrypted_session_iv[m
[31m-  section 2856 3982 encrypted_session_expires[m
[31m-  section 3982 4623 set_encrypt_session[m
[31m-  section 4623 4895 set_decrypt_session[m
[31m-  section 4895 6752 installation[m
[31m-  section 6160 6752 building as a dynamic module[m
[31m-  section 6752 7509 compatibility[m
[31m-  section 7509 7979 report bugs[m
[31m-  section 7979 8141 source repository[m
[31m-  section 8141 8291 getting involved[m
[31m-  section 8291 8373 author[m
[31m-  section 8373 9826 copyright & license[m
[31m-  section 9826 10001 see also[m
[31m-[m
[31m-dist form-input-nginx-module-0.12[m
[31m-  aliases ngx_form_input ngx_http_form_input_module[m
[31m-  modules form-input-nginx-module-0.12[m
[31m-[m
[31m-module form-input-nginx-module-0.12[m
[31m-  aliases ngx_form_input[m
[31m-  section 18 442 name[m
[31m-  section 442 1791 installation[m
[31m-  section 1206 1791 building as a dynamic module[m
[31m-  section 1791 2722 usage[m
[31m-  section 2722 3156 limitations[m
[31m-  section 3156 3583 compatibility[m
[31m-  section 3583 5109 copyright & license[m
[31m-[m
[31m-dist headers-more-nginx-module-0.30[m
[31m-  aliases ngx_headers_more ngx_http_headers_more_filter_module[m
[31m-  modules headers-more-nginx-module-0.30[m
[31m-[m
[31m-module headers-more-nginx-module-0.30[m
[31m-  aliases ngx_headers_more[m
[31m-  section 18 356 name[m
[31m-  section 356 1382 synopsis[m
[31m-  section 1382 2996 description[m
[31m-  section 2996 7984 directives[m
[31m-  section 3018 5547 more_set_headers[m
[31m-  section 5547 6392 more_clear_headers[m
[31m-  section 6392 7420 more_set_input_headers[m
[31m-  section 7420 7984 more_clear_input_headers[m
[31m-  section 7984 8894 limitations[m
[31m-  section 8894 10136 installation[m
[31m-  section 10136 11210 compatibility[m
[31m-  section 11210 11497 community[m
[31m-  section 11231 11367 english mailing list[m
[31m-  section 11367 11497 chinese mailing list[m
[31m-  section 11497 11764 bugs and patches[m
[31m-  section 11764 11917 source repository[m
[31m-  section 11917 12079 changes[m
[31m-  section 12079 13360 test suite[m
[31m-  section 13360 13443 todo[m
[31m-  section 13443 13599 getting involved[m
[31m-  section 13599 13909 authors[m
[31m-  section 13909 15608 copyright & license[m
[31m-  section 15608 16396 see also[m
[31m-[m
[31m-dist iconv-nginx-module-0.14[m
[31m-  aliases ngx_iconv ngx_http_iconv_module[m
[31m-  modules iconv-nginx-module-0.14[m
[31m-[m
[31m-module iconv-nginx-module-0.14[m
[31m-  aliases ngx_iconv[m
[31m-  section 19 242 name[m
[31m-  section 242 1141 usage[m
[31m-  section 257 455 set_iconv[m
[31m-  section 455 585 iconv_buffer_size[m
[31m-  section 585 1141 iconv_filter[m
[31m-  section 1141 1604 compatibility[m
[31m-  section 1604 2700 installation[m
[31m-  section 2120 2700 building as a dynamic module[m
[31m-  section 2700 4391 copyright & license[m
[31m-  section 4391 4542 changelog[m
[31m-  section 4542 4635 see also[m
[31m-[m
[31m-dist lua-5.1.5[m
[31m-[m
[31m-dist lua-cjson-2.1.0.4[m
[31m-  aliases cjson[m
[31m-  modules lua-cjson-2.1.0.4[m
[31m-[m
[31m-module lua-cjson-2.1.0.4[m
[31m-  aliases cjson[m
[31m-  section 18 668 name[m
[31m-  section 668 2474 additions[m
[31m-  section 687 1103 encode_empty_table_as_object[m
[31m-  section 1103 1620 empty_array[m
[31m-  section 1620 2282 empty_array_mt[m
[31m-  section 2282 2474 encode_number_precision[m
[31m-[m
[31m-dist luajit-2.1-20160517[m
[31m-[m
[31m-dist lua-rds-parser-0.06[m
[31m-  aliases rds.parser[m
[31m-[m
[31m-dist lua-redis-parser-0.12[m
[31m-  aliases redis.parser[m
[31m-  modules lua-redis-parser-0.12[m
[31m-[m
[31m-module lua-redis-parser-0.12[m
[31m-  aliases redis.parser[m
[31m-  section 18 244 name[m
[31m-  section 244 727 description[m
[31m-  section 727 4768 functions[m
[31m-  section 984 2125 parse_reply[m
[31m-  section 2125 3011 parse_replies[m
[31m-  section 3011 3627 typename[m
[31m-  section 3627 4768 build_query[m
[31m-  section 4768 5226 constants[m
[31m-  section 4789 4848 bad_reply[m
[31m-  section 4848 4915 integer_reply[m
[31m-  section 4915 4978 error_reply[m
[31m-  section 4978 5043 status_reply[m
[31m-  section 5043 5104 bulk_reply[m
[31m-  section 5104 5177 multi_bulk_reply[m
[31m-  section 5177 5226 null[m
[31m-  section 5226 5428 background[m
[31m-  section 5428 5875 report bugs[m
[31m-  section 5875 6005 source repository[m
[31m-  section 6005 6956 installation[m
[31m-  section 6029 6332 build requirements[m
[31m-  section 6332 6413 linux/bsd/solaris[m
[31m-  section 6413 6956 mac os x[m
[31m-  section 6956 7064 author[m
[31m-  section 7064 8541 copyright & license[m
[31m-  section 8541 8884 see also[m
[31m-[m
[31m-dist lua-resty-core-0.1.6[m
[31m-  aliases resty.core[m
[31m-  modules lua-resty-core-0.1.6 ngx.balancer ngx.ocsp ngx.semaphore ngx.ssl[m
[31m-[m
[31m-module lua-resty-core-0.1.6[m
[31m-  aliases resty.core[m
[31m-  section 18 161 name[m
[31m-  section 161 530 synopsis[m
[31m-  section 530 1438 description[m
[31m-  section 1438 1779 prerequisites[m
[31m-  section 1779 6665 api implemented[m
[31m-  section 1806 2091 resty.core.hash[m
[31m-  section 2091 2326 resty.core.base64[m
[31m-  section 2326 2550 resty.core.uri[m
[31m-  section 2550 2920 resty.core.regex[m
[31m-  section 2920 3041 resty.core.exit[m
[31m-  section 3041 4108 resty.core.shdict[m
[31m-  section 4108 4243 resty.core.var[m
[31m-  section 4243 4361 resty.core.ctx[m
[31m-  section 4361 5140 resty.core.request[m
[31m-  section 5140 5282 resty.core.response[m
[31m-  section 5282 5593 resty.core.misc[m
[31m-  section 5593 5788 resty.core.time[m
[31m-  section 5788 6193 resty.core.worker[m
[31m-  section 6193 6478 ngx.semaphore[m
[31m-  section 6478 6665 ngx.balancer[m
[31m-  section 6665 6892 caveat[m
[31m-  section 6892 7148 todo[m
[31m-  section 7148 7247 author[m
[31m-  section 7247 8702 copyright and license[m
[31m-  section 8702 8874 see also[m
[31m-[m
[31m-module ngx.balancer[m
[31m-  section 18 160 name[m
[31m-  section 160 1496 synopsis[m
[31m-  section 1496 1961 description[m
[31m-  section 1961 5049 methods[m
[31m-  section 2114 2849 set_current_peer[m
[31m-  section 2849 3884 set_more_tries[m
[31m-  section 3884 5049 get_last_failure[m
[31m-  section 5049 5336 community[m
[31m-  section 5070 5206 english mailing list[m
[31m-  section 5206 5336 chinese mailing list[m
[31m-  section 5336 5587 bugs and patches[m
[31m-  section 5587 5674 author[m
[31m-  section 5674 7124 copyright and license[m
[31m-  section 7124 7470 see also[m
[31m-[m
[31m-module ngx.ocsp[m
[31m-  section 18 167 name[m
[31m-  section 167 3745 synopsis[m
[31m-  section 3745 4242 description[m
[31m-  section 4242 7423 methods[m
[31m-  section 4259 5077 get_ocsp_responder_from_der_chain[m
[31m-  section 5077 6067 create_ocsp_request[m
[31m-  section 6067 6739 validate_ocsp_response[m
[31m-  section 6739 7423 set_ocsp_status_resp[m
[31m-  section 7423 7710 community[m
[31m-  section 7444 7580 english mailing list[m
[31m-  section 7580 7710 chinese mailing list[m
[31m-  section 7710 7961 bugs and patches[m
[31m-  section 7961 8048 author[m
[31m-  section 8048 9498 copyright and license[m
[31m-  section 9498 9899 see also[m
[31m-[m
[31m-module ngx.semaphore[m
[31m-  section 18 152 name[m
[31m-  section 152 2837 synopsis[m
[31m-  section 170 1347 synchronizing threads in the same context[m
[31m-  section 1347 2837 synchronizing threads in different contexts[m
[31m-  section 2837 4093 description[m
[31m-  section 4093 7999 methods[m
[31m-  section 4112 4889 new[m
[31m-  section 4889 5714 post[m
[31m-  section 5714 6855 wait[m
[31m-  section 6855 7999 count[m
[31m-  section 7999 8286 community[m
[31m-  section 8020 8156 english mailing list[m
[31m-  section 8156 8286 chinese mailing list[m
[31m-  section 8286 8537 bugs and patches[m
[31m-  section 8537 8579 author[m
[31m-  section 8579 10029 copyright and license[m
[31m-  section 10029 10263 see also[m
[31m-[m
[31m-module ngx.ssl[m
[31m-  section 18 155 name[m
[31m-  section 155 2237 synopsis[m
[31m-  section 2237 3035 description[m
[31m-  section 3035 8676 methods[m
[31m-  section 3052 3347 clear_certs[m
[31m-  section 3347 4189 cert_pem_to_der[m
[31m-  section 4189 4754 set_der_cert[m
[31m-  section 4754 5310 priv_key_pem_to_der[m
[31m-  section 5310 5873 set_der_priv_key[m
[31m-  section 5873 6684 server_name[m
[31m-  section 6684 8241 raw_server_addr[m
[31m-  section 8241 8676 get_tls1_version[m
[31m-  section 8676 8963 community[m
[31m-  section 8697 8833 english mailing list[m
[31m-  section 8833 8963 chinese mailing list[m
[31m-  section 8963 9214 bugs and patches[m
[31m-  section 9214 9301 author[m
[31m-  section 9301 10751 copyright and license[m
[31m-  section 10751 11154 see also[m
[31m-[m
[31m-dist lua-resty-dns-0.16[m
[31m-  aliases resty.dns[m
[31m-  modules lua-resty-dns-0.16[m
[31m-[m
[31m-module lua-resty-dns-0.16[m
[31m-  aliases resty.dns[m
[31m-  section 18 156 name[m
[31m-  section 156 823 description[m
[31m-  section 823 2268 synopsis[m
[31m-  section 2268 9244 methods[m
[31m-  section 2287 3734 new[m
[31m-  section 3734 6670 query[m
[31m-  section 6670 7424 tcp_query[m
[31m-  section 7424 7591 set_timeout[m
[31m-  section 7591 8021 compress_ipv6_addr[m
[31m-  section 8021 8436 expand_ipv6_addr[m
[31m-  section 8436 8975 arpa_str[m
[31m-  section 8975 9244 reverse_query[m
[31m-  section 9244 10327 constants[m
[31m-  section 9265 9349 type_a[m
[31m-  section 9349 9435 type_ns[m
[31m-  section 9435 9527 type_cname[m
[31m-  section 9527 9616 type_ptr[m
[31m-  section 9616 9703 type_mx[m
[31m-  section 9703 9792 type_txt[m
[31m-  section 9792 9913 type_aaaa[m
[31m-  section 9913 10058 type_srv[m
[31m-  section 10058 10203 type_spf[m
[31m-  section 10203 10327 class_in[m
[31m-  section 10327 10827 automatic error logging[m
[31m-  section 10827 11616 limitations[m
[31m-  section 11616 11766 todo[m
[31m-  section 11766 11865 author[m
[31m-  section 11865 13360 copyright and license[m
[31m-  section 13360 13725 see also[m
[31m-[m
[31m-dist lua-resty-lock-0.04[m
[31m-  aliases resty.lock[m
[31m-  modules lua-resty-lock-0.04[m
[31m-[m
[31m-module lua-resty-lock-0.04[m
[31m-  aliases resty.lock[m
[31m-  section 18 162 name[m
[31m-  section 162 1117 synopsis[m
[31m-  section 1117 1617 description[m
[31m-  section 1617 5791 methods[m
[31m-  section 2030 3885 new[m
[31m-  section 3885 5488 lock[m
[31m-  section 5488 5791 unlock[m
[31m-  section 5791 6147 for multiple lua light threads[m
[31m-  section 6147 10189 for cache locks[m
[31m-  section 10189 10351 prerequisites[m
[31m-  section 10351 11315 installation[m
[31m-  section 11315 11606 todo[m
[31m-  section 11606 11893 community[m
[31m-  section 11627 11763 english mailing list[m
[31m-  section 11763 11893 chinese mailing list[m
[31m-  section 11893 12143 bugs and patches[m
[31m-  section 12143 12242 author[m
[31m-  section 12242 13697 copyright and license[m
[31m-  section 13697 13852 see also[m
[31m-[m
[31m-dist lua-resty-lrucache-0.04[m
[31m-  aliases resty.lrucache[m
[31m-  modules lua-resty-lrucache-0.04[m
[31m-[m
[31m-module lua-resty-lrucache-0.04[m
[31m-  aliases resty.lrucache[m
[31m-  section 18 177 name[m
[31m-  section 177 1297 synopsis[m
[31m-  section 1297 3375 description[m
[31m-  section 3375 5387 methods[m
[31m-  section 3864 4580 new[m
[31m-  section 4580 4999 set[m
[31m-  section 4999 5285 get[m
[31m-  section 5285 5387 delete[m
[31m-  section 5387 5549 prerequisites[m
[31m-  section 5549 6477 installation[m
[31m-  section 6477 6664 todo[m
[31m-  section 6664 6951 community[m
[31m-  section 6685 6821 english mailing list[m
[31m-  section 6821 6951 chinese mailing list[m
[31m-  section 6951 7203 bugs and patches[m
[31m-  section 7203 7332 author[m
[31m-  section 7332 8845 copyright and license[m
[31m-  section 8845 9001 see also[m
[31m-[m
[31m-dist lua-resty-memcached-0.14[m
[31m-  aliases resty.memcached[m
[31m-  modules lua-resty-memcached-0.14[m
[31m-[m
[31m-module lua-resty-memcached-0.14[m
[31m-  aliases resty.memcached[m
[31m-  section 18 173 name[m
[31m-  section 173 573 description[m
[31m-  section 573 3012 synopsis[m
[31m-  section 3012 13803 methods[m
[31m-  section 3192 3771 new[m
[31m-  section 3771 4261 connect[m
[31m-  section 4261 4838 set[m
[31m-  section 4838 5084 set_timeout[m
[31m-  section 5084 5808 set_keepalive[m
[31m-  section 5808 6388 get_reused_times[m
[31m-  section 6388 6610 close[m
[31m-  section 6610 7273 add[m
[31m-  section 7273 7948 replace[m
[31m-  section 7948 8634 append[m
[31m-  section 8634 9325 prepend[m
[31m-  section 9325 10416 get[m
[31m-  section 10416 10736 gets[m
[31m-  section 10736 11049 cas[m
[31m-  section 11049 11302 touch[m
[31m-  section 11302 11644 flush_all[m
[31m-  section 11644 11907 delete[m
[31m-  section 11907 12197 incr[m
[31m-  section 12197 12487 decr[m
[31m-  section 12487 12956 stats[m
[31m-  section 12956 13146 version[m
[31m-  section 13146 13486 quit[m
[31m-  section 13486 13803 verbosity[m
[31m-  section 13803 14303 automatic error logging[m
[31m-  section 14303 15083 limitations[m
[31m-  section 15083 15232 todo[m
[31m-  section 15232 15331 author[m
[31m-  section 15331 16826 copyright and license[m
[31m-  section 16826 17221 see also[m
[31m-[m
[31m-dist lua-resty-mysql-0.16[m
[31m-  aliases resty.mysql[m
[31m-  modules lua-resty-mysql-0.16[m
[31m-[m
[31m-module lua-resty-mysql-0.16[m
[31m-  aliases resty.mysql[m
[31m-  section 18 161 name[m
[31m-  section 161 724 description[m
[31m-  section 724 4835 synopsis[m
[31m-  section 4835 12025 methods[m
[31m-  section 4854 5010 new[m
[31m-  section 5010 7071 connect[m
[31m-  section 7071 7224 set_timeout[m
[31m-  section 7224 7947 set_keepalive[m
[31m-  section 7947 8525 get_reused_times[m
[31m-  section 8525 8741 close[m
[31m-  section 8741 9082 send_query[m
[31m-  section 9082 11057 read_result[m
[31m-  section 11057 11479 query[m
[31m-  section 11479 11713 server_ver[m
[31m-  section 11713 12025 set_compact_arrays[m
[31m-  section 12025 12483 sql literal quoting[m
[31m-  section 12483 14361 multi-resultset support[m
[31m-  section 14361 14774 debugging[m
[31m-  section 14774 15274 automatic error logging[m
[31m-  section 15274 16056 limitations[m
[31m-  section 16056 16812 installation[m
[31m-  section 16812 17099 community[m
[31m-  section 16833 16969 english mailing list[m
[31m-  section 16969 17099 chinese mailing list[m
[31m-  section 17099 17406 bugs and patches[m
[31m-  section 17406 17738 todo[m
[31m-  section 17738 17837 author[m
[31m-  section 17837 19332 copyright and license[m
[31m-  section 19332 19800 see also[m
[31m-[m
[31m-dist lua-resty-redis-0.24[m
[31m-  aliases resty.redis[m
[31m-  modules lua-resty-redis-0.24[m
[31m-[m
[31m-module lua-resty-redis-0.24[m
[31m-  aliases resty.redis[m
[31m-  section 18 165 name[m
[31m-  section 165 558 description[m
[31m-  section 558 3701 synopsis[m
[31m-  section 3701 12835 methods[m
[31m-  section 5849 5995 new[m
[31m-  section 5995 6851 connect[m
[31m-  section 6851 7005 set_timeout[m
[31m-  section 7005 7721 set_keepalive[m
[31m-  section 7721 8300 get_reused_times[m
[31m-  section 8300 8517 close[m
[31m-  section 8517 9176 init_pipeline[m
[31m-  section 9176 9575 commit_pipeline[m
[31m-  section 9575 9881 cancel_pipeline[m
[31m-  section 9881 10238 hmset[m
[31m-  section 10238 10448 array_to_hash[m
[31m-  section 10448 12100 read_reply[m
[31m-  section 12100 12835 add_commands[m
[31m-  section 12835 13883 redis authentication[m
[31m-  section 13883 15224 redis transactions[m
[31m-  section 15224 15800 load balancing and failover[m
[31m-  section 15800 16192 debugging[m
[31m-  section 16192 16692 automatic error logging[m
[31m-  section 16692 19053 check list for issues[m
[31m-  section 19053 19929 limitations[m
[31m-  section 19929 20681 installation[m
[31m-  section 20681 20697 todo[m
[31m-  section 20697 20984 community[m
[31m-  section 20718 20854 english mailing list[m
[31m-  section 20854 20984 chinese mailing list[m
[31m-  section 20984 21233 bugs and patches[m
[31m-  section 21233 21332 author[m
[31m-  section 21332 22815 copyright and license[m
[31m-  section 22815 23175 see also[m
[31m-[m
[31m-dist lua-resty-string-0.09[m
[31m-  aliases resty.string[m
[31m-  modules lua-resty-string-0.09[m
[31m-[m
[31m-module lua-resty-string-0.09[m
[31m-  aliases resty.string[m
[31m-  section 18 254 name[m
[31m-  section 254 435 description[m
[31m-  section 435 4946 synopsis[m
[31m-  section 4946 5028 author[m
[31m-  section 5028 6523 copyright and license[m
[31m-  section 6523 6625 see also[m
[31m-[m
[31m-dist lua-resty-upload-0.09[m
[31m-  aliases resty.upload[m
[31m-  modules lua-resty-upload-0.09[m
[31m-[m
[31m-module lua-resty-upload-0.09[m
[31m-  aliases resty.upload[m
[31m-  section 18 178 name[m
[31m-  section 178 1373 description[m
[31m-  section 1373 5591 synopsis[m
[31m-  section 5591 5690 author[m
[31m-  section 5690 7185 copyright and license[m
[31m-  section 7185 7635 see also[m
[31m-[m
[31m-dist lua-resty-upstream-healthcheck-0.04[m
[31m-  aliases resty.upstream.healthcheck[m
[31m-  modules lua-resty-upstream-healthcheck-0.04[m
[31m-[m
[31m-module lua-resty-upstream-healthcheck-0.04[m
[31m-  aliases resty.upstream.healthcheck[m
[31m-  section 18 190 name[m
[31m-  section 190 2561 synopsis[m
[31m-  section 2561 2692 description[m
[31m-  section 2692 4275 methods[m
[31m-  section 2709 3240 spawn_checker[m
[31m-  section 3240 4275 status_page[m
[31m-  section 4275 5552 multiple upstreams[m
[31m-  section 5552 6533 installation[m
[31m-  section 6533 6549 todo[m
[31m-  section 6549 6836 community[m
[31m-  section 6570 6706 english mailing list[m
[31m-  section 6706 6836 chinese mailing list[m
[31m-  section 6836 7102 bugs and patches[m
[31m-  section 7102 7201 author[m
[31m-  section 7201 8656 copyright and license[m
[31m-  section 8656 8904 see also[m
[31m-[m
[31m-dist lua-resty-websocket-0.05[m
[31m-  aliases resty.websocket[m
[31m-  modules lua-resty-websocket-0.05[m
[31m-[m
[31m-module lua-resty-websocket-0.05[m
[31m-  aliases resty.websocket[m
[31m-  section 18 155 name[m
[31m-  section 155 596 description[m
[31m-  section 596 2709 synopsis[m
[31m-  section 2709 13641 modules[m
[31m-  section 2728 7218 resty.websocket.server[m
[31m-  section 2855 7218 methods[m
[31m-  section 2875 3917 new[m
[31m-  section 3917 4049 set_timeout[m
[31m-  section 4049 4342 send_text[m
[31m-  section 4342 4641 send_binary[m
[31m-  section 4641 5051 send_ping[m
[31m-  section 5051 5386 send_pong[m
[31m-  section 5386 5832 send_close[m
[31m-  section 5832 6459 send_frame[m
[31m-  section 6459 7218 recv_frame[m
[31m-  section 7218 13042 resty.websocket.client[m
[31m-  section 8254 13042 methods[m
[31m-  section 8274 9180 client:new[m
[31m-  section 9180 10607 client:connect[m
[31m-  section 10607 10792 client:close[m
[31m-  section 10792 11513 client:set_keepalive[m
[31m-  section 11513 11656 client:set_timeout[m
[31m-  section 11656 11808 client:send_text[m
[31m-  section 11808 11966 client:send_binary[m
[31m-  section 11966 12157 client:send_ping[m
[31m-  section 12157 12348 client:send_pong[m
[31m-  section 12348 12549 client:send_close[m
[31m-  section 12549 12887 client:send_frame[m
[31m-  section 12887 13042 client:recv_frame[m
[31m-  section 13042 13641 resty.websocket.protocol[m
[31m-  section 13175 13641 methods[m
[31m-  section 13195 13349 recv_frame[m
[31m-  section 13349 13488 build_frame[m
[31m-  section 13488 13641 send_frame[m
[31m-  section 13641 14141 automatic error logging[m
[31m-  section 14141 14935 limitations[m
[31m-  section 14935 16002 installation[m
[31m-  section 16002 16018 todo[m
[31m-  section 16018 16305 community[m
[31m-  section 16039 16175 english mailing list[m
[31m-  section 16175 16305 chinese mailing list[m
[31m-  section 16305 16604 bugs and patches[m
[31m-  section 16604 16703 author[m
[31m-  section 16703 18186 copyright and license[m
[31m-  section 18186 18807 see also[m
[31m-[m
[31m-dist memc-nginx-module-0.17[m
[31m-  aliases ngx_memc ngx_http_memc_module[m
[31m-  modules memc-nginx-module-0.17[m
[31m-[m
[31m-module memc-nginx-module-0.17[m
[31m-  aliases ngx_memc[m
[31m-  section 18 383 name[m
[31m-  section 383 2540 synopsis[m
[31m-  section 2540 4863 description[m
[31m-  section 3775 4484 keep-alive connections to memcached servers[m
[31m-  section 4484 4863 how it works[m
[31m-  section 4863 10338 memcached commands supported[m
[31m-  section 5618 6307 get $memc_key[m
[31m-  section 6307 7293 set $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-  section 7293 7388 add $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-  section 7388 7487 replace $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-  section 7487 7754 append $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-  section 7754 7856 prepend $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-  section 7856 8304 delete $memc_key[m
[31m-  section 8304 8559 delete $memc_key $memc_exptime[m
[31m-  section 8559 9146 incr $memc_key $memc_value[m
[31m-  section 9146 9227 decr $memc_key $memc_value[m
[31m-  section 9227 9411 flush_all[m
[31m-  section 9411 9550 flush_all $memc_exptime[m
[31m-  section 9550 9957 stats[m
[31m-  section 9957 10338 version[m
[31m-  section 10338 14280 directives[m
[31m-  section 10750 11208 memc_pass[m
[31m-  section 11208 11729 memc_cmds_allowed[m
[31m-  section 11729 12080 memc_flags_to_last_modified[m
[31m-  section 12080 12549 memc_connect_timeout[m
[31m-  section 12549 13023 memc_send_timeout[m
[31m-  section 13023 13499 memc_read_timeout[m
[31m-  section 13499 13954 memc_buffer_size[m
[31m-  section 13954 14280 memc_ignore_client_abort[m
[31m-  section 14280 16124 installation[m
[31m-  section 15707 16124 for developers[m
[31m-  section 16124 17446 compatibility[m
[31m-  section 17446 17733 community[m
[31m-  section 17467 17603 english mailing list[m
[31m-  section 17603 17733 chinese mailing list[m
[31m-  section 17733 18236 report bugs[m
[31m-  section 18236 18372 source repository[m
[31m-  section 18372 18534 changes[m
[31m-  section 18534 19891 test suite[m
[31m-  section 19891 20064 todo[m
[31m-  section 20064 20220 getting involved[m
[31m-  section 20220 20438 author[m
[31m-  section 20438 22119 copyright & license[m
[31m-  section 22119 23391 see also[m
[31m-[m
[31m-dist ngx_coolkit-0.2rc3[m
[31m-  aliases ngx_coolkit_module[m
[31m-[m
[31m-dist ngx_devel_kit-0.3.0[m
[31m-  aliases ngx_devel_kit[m
[31m-  modules ngx_devel_kit-0.3.0[m
[31m-[m
[31m-module ngx_devel_kit-0.3.0[m
[31m-  section 18 990 name[m
[31m-  section 990 1108 status[m
[31m-  section 1108 1458 features[m
[31m-  section 1458 1960 design[m
[31m-  section 1474 1652 modular[m
[31m-  section 1652 1960 auto-generated & easily extensible[m
[31m-  section 1960 2967 usage for users[m
[31m-  section 2451 2967 building as a dynamic module[m
[31m-  section 2967 4230 usage for developers[m
[31m-  section 3788 4230 warning: using ndk_all[m
[31m-  section 4230 4902 modules using ndk[m
[31m-  section 4902 5170 todo[m
[31m-  section 5170 6717 license[m
[31m-  section 6717 6971 contributing / feedback[m
[31m-  section 6971 7028 author[m
[31m-[m
[31m-dist ngx_lua-0.10.5[m
[31m-  aliases ngx_http_lua_module[m
[31m-  modules ngx_lua-0.10.5[m
[31m-[m
[31m-module ngx_lua-0.10.5[m
[31m-  section 19 221 name[m
[31m-  section 221 358 version[m
[31m-  section 358 4075 synopsis[m
[31m-  section 4075 7157 description[m
[31m-  section 7157 8734 typical uses[m
[31m-  section 8734 9041 nginx compatibility[m
[31m-  section 9041 13690 installation[m
[31m-  section 11082 11660 building as a dynamic module[m
[31m-  section 11660 12997 c macro configurations[m
[31m-  section 12997 13690 installation on ubuntu 11.10[m
[31m-  section 13690 13977 community[m
[31m-  section 13711 13847 english mailing list[m
[31m-  section 13847 13977 chinese mailing list[m
[31m-  section 13977 14146 code repository[m
[31m-  section 14146 14411 bugs and patches[m
[31m-  section 14411 16333 lua/luajit bytecode support[m
[31m-  section 16333 16740 system environment variable support[m
[31m-  section 16740 17832 http 1.0 support[m
[31m-  section 17832 20953 statically linking pure lua modules[m
[31m-  section 20953 23941 data sharing within an nginx worker[m
[31m-  section 23941 34352 known issues[m
[31m-  section 23965 24391 tcp socket connect operation issues[m
[31m-  section 24391 25630 lua coroutine yielding/resuming[m
[31m-  section 25630 28171 lua variable scope[m
[31m-  section 28171 29300 locations configured by subrequest directives of other modules[m
[31m-  section 29300 30098 cosockets not available everywhere[m
[31m-  section 30098 33253 special escaping sequences[m
[31m-  section 33253 33512 mixing with ssi not supported[m
[31m-  section 33512 33708 spdy mode not fully supported[m
[31m-  section 33708 34352 missing data on short circuited requests[m
[31m-  section 34352 36675 todo[m
[31m-  section 36675 36837 changes[m
[31m-  section 36837 39837 test suite[m
[31m-  section 39837 41421 copyright and license[m
[31m-  section 41421 43682 see also[m
[31m-  section 43682 110710 directives[m
[31m-  section 46104 46713 lua_use_default_type[m
[31m-  section 46713 48592 lua_code_cache[m
[31m-  section 48592 49625 lua_regex_cache_max_entries[m
[31m-  section 49625 50316 lua_regex_match_limit[m
[31m-  section 50316 50986 lua_package_path[m
[31m-  section 50986 51661 lua_package_cpath[m
[31m-  section 51661 55634 init_by_lua[m
[31m-  section 55634 56166 init_by_lua_block[m
[31m-  section 56166 56755 init_by_lua_file[m
[31m-  section 56755 58204 init_worker_by_lua[m
[31m-  section 58204 58765 init_worker_by_lua_block[m
[31m-  section 58765 59081 init_worker_by_lua_file[m
[31m-  section 59081 62157 set_by_lua[m
[31m-  section 62157 62919 set_by_lua_block[m
[31m-  section 62919 64144 set_by_lua_file[m
[31m-  section 64144 64926 content_by_lua[m
[31m-  section 64926 65482 content_by_lua_block[m
[31m-  section 65482 67041 content_by_lua_file[m
[31m-  section 67041 71280 rewrite_by_lua[m
[31m-  section 71280 71829 rewrite_by_lua_block[m
[31m-  section 71829 73200 rewrite_by_lua_file[m
[31m-  section 73200 75852 access_by_lua[m
[31m-  section 75852 76396 access_by_lua_block[m
[31m-  section 76396 77621 access_by_lua_file[m
[31m-  section 77621 78754 header_filter_by_lua[m
[31m-  section 78754 79332 header_filter_by_lua_block[m
[31m-  section 79332 80029 header_filter_by_lua_file[m
[31m-  section 80029 83605 body_filter_by_lua[m
[31m-  section 83605 84183 body_filter_by_lua_block[m
[31m-  section 84183 84873 body_filter_by_lua_file[m
[31m-  section 84873 87247 log_by_lua[m
[31m-  section 87247 87795 log_by_lua_block[m
[31m-  section 87795 88446 log_by_lua_file[m
[31m-  section 88446 90781 balancer_by_lua_block[m
[31m-  section 90781 91427 balancer_by_lua_file[m
[31m-  section 91427 93459 lua_need_request_body[m
[31m-  section 93459 97117 ssl_certificate_by_lua_block[m
[31m-  section 97117 97801 ssl_certificate_by_lua_file[m
[31m-  section 97801 98572 lua_shared_dict[m
[31m-  section 98572 99188 lua_socket_connect_timeout[m
[31m-  section 99188 99777 lua_socket_send_timeout[m
[31m-  section 99777 100012 lua_socket_send_lowat[m
[31m-  section 100012 100722 lua_socket_read_timeout[m
[31m-  section 100722 101264 lua_socket_buffer_size[m
[31m-  section 101264 102113 lua_socket_pool_size[m
[31m-  section 102113 102853 lua_socket_keepalive_timeout[m
[31m-  section 102853 103397 lua_socket_log_errors[m
[31m-  section 103397 103864 lua_ssl_ciphers[m
[31m-  section 103864 104211 lua_ssl_crl[m
[31m-  section 104211 104587 lua_ssl_protocols[m
[31m-  section 104587 105003 lua_ssl_trusted_certificate[m
[31m-  section 105003 105335 lua_ssl_verify_depth[m
[31m-  section 105335 106277 lua_http10_buffering[m
[31m-  section 106277 106752 rewrite_by_lua_no_postpone[m
[31m-  section 106752 107218 access_by_lua_no_postpone[m
[31m-  section 107218 107666 lua_transform_underscores_in_response_headers[m
[31m-  section 107666 109684 lua_check_client_abort[m
[31m-  section 109684 110148 lua_max_pending_timers[m
[31m-  section 110148 110710 lua_max_running_timers[m
[31m-  section 110710 295624 nginx api for lua[m
[31m-  section 114878 116516 introduction[m
[31m-  section 116516 117699 ngx.arg[m
[31m-  section 117699 119615 ngx.var.variable[m
[31m-  section 119615 120558 core constants[m
[31m-  section 120558 121599 http method constants[m
[31m-  section 121599 124042 http status constants[m
[31m-  section 124042 124517 nginx log level constants[m
[31m-  section 124517 125575 print[m
[31m-  section 125575 129202 ngx.ctx[m
[31m-  section 129202 140541 ngx.location.capture[m
[31m-  section 140541 142483 ngx.location.capture_multi[m
[31m-  section 142483 143045 ngx.status[m
[31m-  section 143045 145853 ngx.header.header[m
[31m-  section 145853 146490 ngx.resp.get_headers[m
[31m-  section 146490 147058 ngx.req.is_internal[m
[31m-  section 147058 147778 ngx.req.start_time[m
[31m-  section 147778 148203 ngx.req.http_version[m
[31m-  section 148203 149056 ngx.req.raw_header[m
[31m-  section 149056 149617 ngx.req.get_method[m
[31m-  section 149617 150186 ngx.req.set_method[m
[31m-  section 150186 152687 ngx.req.set_uri[m
[31m-  section 152687 153576 ngx.req.set_uri_args[m
[31m-  section 153576 155966 ngx.req.get_uri_args[m
[31m-  section 155966 158602 ngx.req.get_post_args[m
[31m-  section 158602 160827 ngx.req.get_headers[m
[31m-  section 160827 161859 ngx.req.set_header[m
[31m-  section 161859 162296 ngx.req.clear_header[m
[31m-  section 162296 164025 ngx.req.read_body[m
[31m-  section 164025 164583 ngx.req.discard_body[m
[31m-  section 164583 166059 ngx.req.get_body_data[m
[31m-  section 166059 167078 ngx.req.get_body_file[m
[31m-  section 167078 167735 ngx.req.set_body_data[m
[31m-  section 167735 168849 ngx.req.set_body_file[m
[31m-  section 168849 170848 ngx.req.init_body[m
[31m-  section 170848 172032 ngx.req.append_body[m
[31m-  section 172032 172879 ngx.req.finish_body[m
[31m-  section 172879 174987 ngx.req.socket[m
[31m-  section 174987 177304 ngx.exec[m
[31m-  section 177304 179288 ngx.redirect[m
[31m-  section 179288 179820 ngx.send_headers[m
[31m-  section 179820 180129 ngx.headers_sent[m
[31m-  section 180129 181699 ngx.print[m
[31m-  section 181699 181889 ngx.say[m
[31m-  section 181889 183035 ngx.log[m
[31m-  section 183035 184398 ngx.flush[m
[31m-  section 184398 186455 ngx.exit[m
[31m-  section 186455 188317 ngx.eof[m
[31m-  section 188317 188820 ngx.sleep[m
[31m-  section 188820 189199 ngx.escape_uri[m
[31m-  section 189199 189684 ngx.unescape_uri[m
[31m-  section 189684 190745 ngx.encode_args[m
[31m-  section 190745 191743 ngx.decode_args[m
[31m-  section 191743 192327 ngx.encode_base64[m
[31m-  section 192327 192744 ngx.decode_base64[m
[31m-  section 192744 193481 ngx.crc32_short[m
[31m-  section 193481 194219 ngx.crc32_long[m
[31m-  section 194219 195312 ngx.hmac_sha1[m
[31m-  section 195312 195899 ngx.md5[m
[31m-  section 195899 196332 ngx.md5_bin[m
[31m-  section 196332 196889 ngx.sha1_bin[m
[31m-  section 196889 197283 ngx.quote_sql_str[m
[31m-  section 197283 197746 ngx.today[m
[31m-  section 197746 198285 ngx.time[m
[31m-  section 198285 198952 ngx.now[m
[31m-  section 198952 199442 ngx.update_time[m
[31m-  section 199442 199991 ngx.localtime[m
[31m-  section 199991 200534 ngx.utctime[m
[31m-  section 200534 201113 ngx.cookie_time[m
[31m-  section 201113 201734 ngx.http_time[m
[31m-  section 201734 202330 ngx.parse_http_time[m
[31m-  section 202330 202650 ngx.is_subrequest[m
[31m-  section 202650 209354 ngx.re.match[m
[31m-  section 209354 211643 ngx.re.find[m
[31m-  section 211643 213989 ngx.re.gmatch[m
[31m-  section 213989 216728 ngx.re.sub[m
[31m-  section 216728 217831 ngx.re.gsub[m
[31m-  section 217831 220006 ngx.shared.dict[m
[31m-  section 220006 221226 ngx.shared.dict.get[m
[31m-  section 221226 221955 ngx.shared.dict.get_stale[m
[31m-  section 221955 224953 ngx.shared.dict.set[m
[31m-  section 224953 225647 ngx.shared.dict.safe_set[m
[31m-  section 225647 226425 ngx.shared.dict.add[m
[31m-  section 226425 227119 ngx.shared.dict.safe_add[m
[31m-  section 227119 227901 ngx.shared.dict.replace[m
[31m-  section 227901 228471 ngx.shared.dict.delete[m
[31m-  section 228471 229461 ngx.shared.dict.incr[m
[31m-  section 229461 230095 ngx.shared.dict.flush_all[m
[31m-  section 230095 230952 ngx.shared.dict.flush_expired[m
[31m-  section 230952 231877 ngx.shared.dict.get_keys[m
[31m-  section 231877 232631 ngx.socket.udp[m
[31m-  section 232631 235089 udpsock:setpeername[m
[31m-  section 235089 235837 udpsock:send[m
[31m-  section 235837 237169 udpsock:receive[m
[31m-  section 237169 237798 udpsock:close[m
[31m-  section 237798 238251 udpsock:settimeout[m
[31m-  section 238251 238483 ngx.socket.stream[m
[31m-  section 238483 240816 ngx.socket.tcp[m
[31m-  section 240816 244026 tcpsock:connect[m
[31m-  section 244026 246274 tcpsock:sslhandshake[m
[31m-  section 246274 247690 tcpsock:send[m
[31m-  section 247690 249976 tcpsock:receive[m
[31m-  section 249976 254397 tcpsock:receiveuntil[m
[31m-  section 254397 255255 tcpsock:close[m
[31m-  section 255255 256009 tcpsock:settimeout[m
[31m-  section 256009 256461 tcpsock:setoption[m
[31m-  section 256461 258843 tcpsock:setkeepalive[m
[31m-  section 258843 259620 tcpsock:getreusedtimes[m
[31m-  section 259620 260440 ngx.socket.connect[m
[31m-  section 260440 261976 ngx.get_phase[m
[31m-  section 261976 268144 ngx.thread.spawn[m
[31m-  section 268144 271063 ngx.thread.wait[m
[31m-  section 271063 271719 ngx.thread.kill[m
[31m-  section 271719 273511 ngx.on_abort[m
[31m-  section 273511 280094 ngx.timer.at[m
[31m-  section 280094 280547 ngx.timer.running_count[m
[31m-  section 280547 280990 ngx.timer.pending_count[m
[31m-  section 280990 281650 ngx.config.subsystem[m
[31m-  section 281650 282129 ngx.config.debug[m
[31m-  section 282129 282714 ngx.config.prefix[m
[31m-  section 282714 283254 ngx.config.nginx_version[m
[31m-  section 283254 283685 ngx.config.nginx_configure[m
[31m-  section 283685 284208 ngx.config.ngx_lua_version[m
[31m-  section 284208 284778 ngx.worker.exiting[m
[31m-  section 284778 285373 ngx.worker.pid[m
[31m-  section 285373 285901 ngx.worker.count[m
[31m-  section 285901 286589 ngx.worker.id[m
[31m-  section 286589 287516 ngx.semaphore[m
[31m-  section 287516 288155 ngx.balancer[m
[31m-  section 288155 288715 ngx.ssl[m
[31m-  section 288715 289463 ngx.ocsp[m
[31m-  section 289463 292019 ndk.set_var.directive[m
[31m-  section 292019 292686 coroutine.create[m
[31m-  section 292686 293372 coroutine.resume[m
[31m-  section 293372 294011 coroutine.yield[m
[31m-  section 294011 294586 coroutine.wrap[m
[31m-  section 294586 295104 coroutine.running[m
[31m-  section 295104 295624 coroutine.status[m
[31m-  section 295624 295905 obsolete sections[m
[31m-  section 295809 295905 special pcre sequences[m
[31m-[m
[31m-dist ngx_lua_upstream-0.05[m
[31m-  aliases ngx_http_lua_upstream_module[m
[31m-  modules ngx_lua_upstream-0.05[m
[31m-[m
[31m-module ngx_lua_upstream-0.05[m
[31m-  section 18 157 name[m
[31m-  section 157 2511 synopsis[m
[31m-  section 2511 5806 functions[m
[31m-  section 2532 2784 get_upstreams[m
[31m-  section 2784 3378 get_servers[m
[31m-  section 3378 4286 get_primary_peers[m
[31m-  section 4286 4528 get_backup_peers[m
[31m-  section 4528 5806 set_peer_down[m
[31m-  section 5806 5911 todo[m
[31m-  section 5911 6179 compatibility[m
[31m-  section 6179 7798 installation[m
[31m-  section 7798 7897 author[m
[31m-  section 7897 9352 copyright and license[m
[31m-  section 9352 9642 see also[m
[31m-[m
[31m-dist ngx_postgres-1.0rc7[m
[31m-  aliases ngx_postgres[m
[31m-  modules ngx_postgres-1.0rc7 todo[m
[31m-[m
[31m-module ngx_postgres-1.0rc7[m
[31m-  section 18 255 about[m
[31m-  section 255 699 status[m
[31m-  section 699 5823 configuration directives[m
[31m-  section 733 967 postgres_server[m
[31m-  section 967 1596 postgres_keepalive[m
[31m-  section 1596 1869 postgres_pass[m
[31m-  section 1869 2273 postgres_query[m
[31m-  section 2273 3220 postgres_rewrite[m
[31m-  section 3220 4143 postgres_output[m
[31m-  section 4143 4811 postgres_set[m
[31m-  section 4811 5345 postgres_escape[m
[31m-  section 5345 5581 postgres_connect_timeout[m
[31m-  section 5581 5823 postgres_result_timeout[m
[31m-  section 5823 6191 configuration variables[m
[31m-  section 5856 5926 $postgres_columns[m
[31m-  section 5926 5990 $postgres_rows[m
[31m-  section 5990 6119 $postgres_affected[m
[31m-  section 6119 6191 $postgres_query[m
[31m-  section 6191 11113 sample configurations[m
[31m-  section 6222 6632 sample configuration #1[m
[31m-  section 6632 7156 sample configuration #2[m
[31m-  section 7156 7953 sample configuration #3[m
[31m-  section 7953 9011 sample configuration #4[m
[31m-  section 9011 10701 sample configuration #5[m
[31m-  section 10701 11113 sample configuration #6[m
[31m-  section 11113 11976 testing[m
[31m-  section 11976 13772 license[m
[31m-  section 13772 14119 see also[m
[31m-[m
[31m-module todo[m
[31m-[m
[31m-dist rds-csv-nginx-module-0.07[m
[31m-  aliases ngx_rds_csv ngx_http_rds_csv_filter_module[m
[31m-  modules rds-csv-nginx-module-0.07[m
[31m-[m
[31m-module rds-csv-nginx-module-0.07[m
[31m-  aliases ngx_rds_csv[m
[31m-  section 18 188 name[m
[31m-  section 188 357 synopsis[m
[31m-  section 357 892 description[m
[31m-  section 892 2797 directives[m
[31m-  section 914 1103 rds_csv[m
[31m-  section 1103 1479 rds_csv_row_terminator[m
[31m-  section 1479 1846 rds_csv_field_separator[m
[31m-  section 1846 2117 rds_csv_field_name_header[m
[31m-  section 2117 2547 rds_csv_content_type[m
[31m-  section 2547 2797 rds_csv_buffer_size[m
[31m-  section 2797 3999 installation[m
[31m-  section 3999 4404 compatibility[m
[31m-  section 4404 4491 author[m
[31m-  section 4491 5964 copyright & license[m
[31m-  section 5964 6219 see also[m
[31m-[m
[31m-dist rds-json-nginx-module-0.14[m
[31m-  aliases ngx_rds_json ngx_http_rds_json_filter_module[m
[31m-  modules rds-json-nginx-module-0.14[m
[31m-[m
[31m-module rds-json-nginx-module-0.14[m
[31m-  aliases ngx_rds_json[m
[31m-  section 18 353 name[m
[31m-  section 353 859 synopsis[m
[31m-  section 859 1109 description[m
[31m-  section 1109 4480 directives[m
[31m-  section 1131 1267 rds_json[m
[31m-  section 1267 1627 rds_json_buffer_size[m
[31m-  section 1627 2038 rds_json_format[m
[31m-  section 2038 2872 rds_json_root[m
[31m-  section 2872 3099 rds_json_success_property[m
[31m-  section 3099 3538 rds_json_user_property[m
[31m-  section 3538 3722 rds_json_errcode_key[m
[31m-  section 3722 3901 rds_json_errstr_key[m
[31m-  section 3901 4240 rds_json_ret[m
[31m-  section 4240 4480 rds_json_content_type[m
[31m-  section 4480 5678 installation[m
[31m-  section 5678 6374 compatibility[m
[31m-  section 6374 6476 author[m
[31m-  section 6476 7937 copyright & license[m
[31m-  section 7937 8190 see also[m
[31m-[m
[31m-dist redis2-nginx-module-0.13[m
[31m-  aliases ngx_redis2 ngx_http_redis2_module[m
[31m-  modules redis2-nginx-module-0.13[m
[31m-[m
[31m-module redis2-nginx-module-0.13[m
[31m-  aliases ngx_redis2[m
[31m-  section 18 235 name[m
[31m-  section 235 376 version[m
[31m-  section 376 2181 synopsis[m
[31m-  section 2181 3332 description[m
[31m-  section 3332 8435 directives[m
[31m-  section 3354 4078 redis2_query[m
[31m-  section 4078 4500 redis2_raw_query[m
[31m-  section 4500 5417 redis2_raw_queries[m
[31m-  section 5417 5796 redis2_literal_raw_query[m
[31m-  section 5796 6042 redis2_pass[m
[31m-  section 6042 6519 redis2_connect_timeout[m
[31m-  section 6519 6960 redis2_send_timeout[m
[31m-  section 6960 7404 redis2_read_timeout[m
[31m-  section 7404 7723 redis2_buffer_size[m
[31m-  section 7723 8435 redis2_next_upstream[m
[31m-  section 8435 9123 connection pool[m
[31m-  section 9123 9513 selecting redis databases[m
[31m-  section 9513 14860 lua interoperability[m
[31m-  section 12851 14860 pipelined redis requests by lua[m
[31m-  section 14860 16503 redis publish/subscribe support[m
[31m-  section 15546 16503 limitations for redis publish/subscribe[m
[31m-  section 16503 17310 performance tuning[m
[31m-  section 17310 18864 installation[m
[31m-  section 18864 19749 compatibility[m
[31m-  section 19749 20036 community[m
[31m-  section 19770 19906 english mailing list[m
[31m-  section 19906 20036 chinese mailing list[m
[31m-  section 20036 20303 bugs and patches[m
[31m-  section 20303 20443 source repository[m
[31m-  section 20443 20555 todo[m
[31m-  section 20555 20654 author[m
[31m-  section 20654 20804 getting involved[m
[31m-  section 20804 22297 copyright & license[m
[31m-  section 22297 22915 see also[m
[31m-[m
[31m-dist redis-nginx-module-0.3.7[m
[31m-  aliases ngx_redis ngx_http_redis_module[m
[31m-[m
[31m-dist resty-cli-0.12[m
[31m-  modules resty-cli-0.12[m
[31m-[m
[31m-module resty-cli-0.12[m
[31m-  section 18 1285 name[m
[31m-  section 1285 4205 synopsis[m
[31m-  section 4205 4583 installation[m
[31m-  section 4583 5350 test suite[m
[31m-  section 5350 5553 authors[m
[31m-  section 5553 7137 copyright and license[m
[31m-[m
[31m-dist set-misc-nginx-module-0.30[m
[31m-  aliases ngx_set_misc ngx_http_set_misc_module[m
[31m-  modules set-misc-nginx-module-0.30[m
[31m-[m
[31m-module set-misc-nginx-module-0.30[m
[31m-  aliases ngx_set_misc[m
[31m-  section 19 382 name[m
[31m-  section 382 3491 synopsis[m
[31m-  section 3491 4157 description[m
[31m-  section 4157 30630 directives[m
[31m-  section 4179 4739 set_if_empty[m
[31m-  section 4739 6396 set_quote_sql_str[m
[31m-  section 6396 6732 set_quote_pgsql_str[m
[31m-  section 6732 8332 set_quote_json_str[m
[31m-  section 8332 10113 set_unescape_uri[m
[31m-  section 10113 10464 set_escape_uri[m
[31m-  section 10464 11857 set_hashed_upstream[m
[31m-  section 11857 13908 set_encode_base32[m
[31m-  section 13908 14379 set_base32_padding[m
[31m-  section 14379 14673 set_misc_base32_padding[m
[31m-  section 14673 15187 set_base32_alphabet[m
[31m-  section 15187 15573 set_decode_base32[m
[31m-  section 15573 17125 set_encode_base64[m
[31m-  section 17125 17506 set_decode_base64[m
[31m-  section 17506 19043 set_encode_hex[m
[31m-  section 19043 19417 set_decode_hex[m
[31m-  section 19417 21121 set_sha1[m
[31m-  section 21121 22848 set_md5[m
[31m-  section 22848 24178 set_hmac_sha1[m
[31m-  section 24178 25142 set_random[m
[31m-  section 25142 25935 set_secure_random_alphanum[m
[31m-  section 25935 26720 set_secure_random_lcalpha[m
[31m-  section 26720 28236 set_rotate[m
[31m-  section 28236 28869 set_local_today[m
[31m-  section 28869 29747 set_formatted_gmt_time[m
[31m-  section 29747 30630 set_formatted_local_time[m
[31m-  section 30630 31131 caveats[m
[31m-  section 31131 32929 installation[m
[31m-  section 32242 32929 building as a dynamic module[m
[31m-  section 32929 33831 compatibility[m
[31m-  section 33831 34342 report bugs[m
[31m-  section 34342 34486 source repository[m
[31m-  section 34486 34653 changes[m
[31m-  section 34653 35444 test suite[m
[31m-  section 35444 35600 getting involved[m
[31m-  section 35600 35806 author[m
[31m-  section 35806 37260 copyright & license[m
[31m-  section 37260 37419 see also[m
[31m-[m
[31m-dist srcache-nginx-module-0.31[m
[31m-  aliases ngx_srcache ngx_http_srcache_filter_module[m
[31m-  modules srcache-nginx-module-0.31[m
[31m-[m
[31m-module srcache-nginx-module-0.31[m
[31m-  aliases ngx_srcache[m
[31m-  section 18 256 name[m
[31m-  section 256 408 version[m
[31m-  section 408 2269 synopsis[m
[31m-  section 2269 13102 description[m
[31m-  section 3383 4258 subrequest caching[m
[31m-  section 4258 8645 distributed memcached caching[m
[31m-  section 8645 10813 caching with redis[m
[31m-  section 10813 13102 cache key preprocessing[m
[31m-  section 13102 30969 directives[m
[31m-  section 13124 14406 srcache_fetch[m
[31m-  section 14406 16132 srcache_fetch_skip[m
[31m-  section 16132 17948 srcache_store[m
[31m-  section 17948 18608 srcache_store_max_size[m
[31m-  section 18608 19681 srcache_store_skip[m
[31m-  section 19681 20495 srcache_store_statuses[m
[31m-  section 20495 21174 srcache_store_ranges[m
[31m-  section 21174 21847 srcache_header_buffer_size[m
[31m-  section 21847 22761 srcache_store_hide_header[m
[31m-  section 22761 23722 srcache_store_pass_header[m
[31m-  section 23722 24542 srcache_methods[m
[31m-  section 24542 25586 srcache_ignore_content_encoding[m
[31m-  section 25586 26530 srcache_request_cache_control[m
[31m-  section 26530 27486 srcache_response_cache_control[m
[31m-  section 27486 27973 srcache_store_no_store[m
[31m-  section 27973 28460 srcache_store_no_cache[m
[31m-  section 28460 28943 srcache_store_private[m
[31m-  section 28943 30058 srcache_default_expire[m
[31m-  section 30058 30969 srcache_max_expire[m
[31m-  section 30969 33423 variables[m
[31m-  section 30990 32071 $srcache_expire[m
[31m-  section 32071 32663 $srcache_fetch_status[m
[31m-  section 32663 33423 $srcache_store_status[m
[31m-  section 33423 34122 known issues[m
[31m-  section 34122 35661 caveats[m
[31m-  section 35661 36665 trouble shooting[m
[31m-  section 36665 38516 installation[m
[31m-  section 38516 39227 compatibility[m
[31m-  section 39227 39514 community[m
[31m-  section 39248 39384 english mailing list[m
[31m-  section 39384 39514 chinese mailing list[m
[31m-  section 39514 39783 bugs and patches[m
[31m-  section 39783 39926 source repository[m
[31m-  section 39926 41122 test suite[m
[31m-  section 41122 41367 todo[m
[31m-  section 41367 41517 getting involved[m
[31m-  section 41517 41616 author[m
[31m-  section 41616 43080 copyright & license[m
[31m-  section 43080 43409 see also[m
[31m-[m
[31m-dist xss-nginx-module-0.05[m
[31m-  aliases ngx_xss ngx_http_xss_filter_module[m
[31m-  modules xss-nginx-module-0.05[m
[31m-[m
[31m-module xss-nginx-module-0.05[m
[31m-  aliases ngx_xss[m
[31m-  section 18 579 name[m
[31m-  section 579 887 description[m
[31m-  section 887 2255 directives[m
[31m-  section 909 1081 xss_get[m
[31m-  section 1081 1455 xss_callback_arg[m
[31m-  section 1455 1727 xss_override_status[m
[31m-  section 1727 1961 xss_check_status[m
[31m-  section 1961 2255 xss_input_types[m
[31m-  section 2255 3067 limitations[m
[31m-  section 3067 3184 trouble shooting[m
[31m-  section 3184 4383 installation[m
[31m-  section 4383 5018 compatibility[m
[31m-  section 5018 5090 todo[m
[31m-  section 5090 5172 author[m
[31m-  section 5172 6806 copyright & license[m
[31m-  section 6806 6979 see also[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 7500112..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-reindex[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-all[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-genmobi.sh[m
[31m-*.mobi[m
[31m-misc/chunked[m
[31m-ctags[m
[31m-src/base32.h[m
[31m-src/uri.c[m
[31m-src/module.c[m
[31m-src/upstream.c[m
[31m-src/upstream.h[m
[31m-src/uri.c[m
[31m-src/sql.c[m
[31m-src/uri.h[m
[31m-src/sql.h[m
[31m-src/uri.h[m
[31m-src/value.c[m
[31m-src/base32.c[m
[31m-src/value.h[m
[31m-src/hash.h[m
[31m-src/hash.c[m
[31m-src/today.h[m
[31m-src/today.c[m
[31m-src/json.[ch][m
[31m-all.sh[m
[31m-go[m
[31m-t/servroot/[m
[31m-src/base64.c[m
[31m-src/base64.h[m
[31m-src/hex.c[m
[31m-src/hex.h[m
[31m-src/hmac.c[m
[31m-src/hmac.h[m
[31m-src/rotate.[ch][m
[31m-analyze[m
[31m-buildroot/[m
[31m-src/module.h[m
[31m-work/[m
[31m-src/random.[ch][m
[31m-build1[0-9][m
[31m-nginx[m
[31m-analyze[m
[31m-src/rotate.[ch][m
[31m-*.plist[m
[31m-Makefile[m
[31m-src/base64url.[ch][m
[31m-src/expired.[ch][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/config[m
[1mdeleted file mode 100755[m
[1mindex df5f0ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/config[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_set_misc_module[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_set_misc; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_set_misc; please put it before ngx_set_misc." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_set_misc; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_set_misc; please put it before ngx_set_misc." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-SET_MISC_SRCS="                                                             \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_base32.c                        \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_default_value.c                 \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_hashed_upstream.c               \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_quote_sql.c                     \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_quote_json.c                    \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_unescape_uri.c                  \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_misc_module.c                   \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_escape_uri.c                    \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_hash.c                          \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_local_today.c                   \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_hex.c                           \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_base64.c                        \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_random.c                        \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_secure_random.c                 \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_rotate.c[m
[31m-            "[m
[31m-[m
[31m-SET_MISC_DEPS="                                                             \[m
[31m-            $ngx_addon_dir/src/ddebug.h                                     \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_default_value.h                 \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_hashed_upstream.h               \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_quote_sql.h                     \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_quote_json.h                    \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_unescape_uri.h                  \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_escape_uri.h                    \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_hash.h                          \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_local_today.h                   \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_hex.h                           \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_base64.h                        \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_random.h                        \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_rotate.h                        \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_secure_random.h                 \[m
[31m-            $ngx_addon_dir/src/ngx_http_set_misc_module.h                   \[m
[31m-            "[m
[31m-[m
[31m-if [ $USE_OPENSSL = YES -o $MAIL_SSL = YES ]; then[m
[31m-    SET_MISC_DEPS="$SET_MISC_DEPS $ngx_addon_dir/src/ngx_http_set_hmac.h"[m
[31m-    SET_MISC_SRCS="$SET_MISC_SRCS $ngx_addon_dir/src/ngx_http_set_hmac.c"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR -DNDK_UPSTREAM_LIST"[m
[31m-USE_SHA1=YES[m
[31m-USE_MD5=YES[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$SET_MISC_DEPS"[m
[31m-    ngx_module_srcs="$SET_MISC_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $SET_MISC_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $SET_MISC_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 97962b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "set_misc *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base32.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base32.c[m
[1mdeleted file mode 100644[m
[1mindex c56c7ba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base32.c[m
[1m+++ /dev/null[m
[36m@@ -1,263 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-[m
[31m-#include "ngx_http_set_base32.h"[m
[31m-#include "ngx_http_set_misc_module.h"[m
[31m-[m
[31m-[m
[31m-#define base32_encoded_length(len) ((((len)+4)/5)*8)[m
[31m-#define base32_decoded_length(len) ((((len)+7)/8)*5)[m
[31m-[m
[31m-[m
[31m-static void encode_base32(size_t slen, u_char *src, size_t *dlen, u_char *dst,[m
[31m-    ngx_flag_t padding, ngx_str_t *alphabet);[m
[31m-static int decode_base32(size_t slen, u_char *src, size_t *dlen, u_char *dst,[m
[31m-    u_char *basis32);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_encode_base32(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *p;[m
[31m-    u_char                  *src, *dst;[m
[31m-[m
[31m-    ngx_http_set_misc_loc_conf_t        *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_set_misc_module);[m
[31m-[m
[31m-    len = base32_encoded_length(v->len);[m
[31m-[m
[31m-    dd("estimated dst len: %d", (int) len);[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    src = v->data; dst = p;[m
[31m-[m
[31m-    encode_base32(v->len, src, &len, dst, conf->base32_padding,[m
[31m-                  &conf->base32_alphabet);[m
[31m-[m
[31m-    res->data = p;[m
[31m-    res->len = len;[m
[31m-[m
[31m-    dd("res (len %d): %.*s", (int) res->len, (int) res->len, res->data);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_decode_base32(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *p;[m
[31m-    u_char                  *src, *dst;[m
[31m-    int                      ret;[m
[31m-[m
[31m-    ngx_http_set_misc_loc_conf_t        *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_set_misc_module);[m
[31m-[m
[31m-    len = base32_decoded_length(v->len);[m
[31m-[m
[31m-    dd("estimated dst len: %d", (int) len);[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    src = v->data; dst = p;[m
[31m-[m
[31m-    ret = decode_base32(v->len, src, &len, dst, conf->basis32);[m
[31m-[m
[31m-    if (ret == 0 /* OK */) {[m
[31m-        res->data = p;[m
[31m-        res->len = len;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* failed to decode */[m
[31m-[m
[31m-    res->data = NULL;[m
[31m-    res->len = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* See the implementation in src/core/ngx_string.c's[m
[31m- * ngx_(encode|decode)_base64() for details. */[m
[31m-[m
[31m-static void[m
[31m-encode_base32(size_t slen, u_char *src, size_t *dlen, u_char *dst,[m
[31m-    ngx_flag_t padding, ngx_str_t *alphabet)[m
[31m-{[m
[31m-    unsigned char *basis32 = alphabet->data;[m
[31m-[m
[31m-    size_t       len;[m
[31m-    u_char      *s;[m
[31m-    u_char      *d;[m
[31m-[m
[31m-    len = slen;[m
[31m-    s = src;[m
[31m-    d = dst;[m
[31m-[m
[31m-    while (len > 4) {[m
[31m-        *d++ = basis32[s[0] >> 3];[m
[31m-        *d++ = basis32[((s[0] & 0x07) << 2) | (s[1] >> 6)];[m
[31m-        *d++ = basis32[(s[1] >> 1) & 0x1f];[m
[31m-        *d++ = basis32[((s[1] & 1) << 4) | (s[2] >> 4)];[m
[31m-        *d++ = basis32[((s[2] & 0x0f) << 1) | (s[3] >> 7)];[m
[31m-        *d++ = basis32[(s[3] >> 2) & 0x1f];[m
[31m-        *d++ = basis32[((s[3] & 0x03) << 3) | (s[4] >> 5)];[m
[31m-        *d++ = basis32[s[4] & 0x1f];[m
[31m-[m
[31m-        s += 5;[m
[31m-        len -= 5;[m
[31m-    }[m
[31m-[m
[31m-    if (len) {[m
[31m-        *d++ = basis32[s[0] >> 3];[m
[31m-[m
[31m-        if (len == 1) {[m
[31m-            /* 1 byte left */[m
[31m-            *d++ = basis32[(s[0] & 0x07) << 2];[m
[31m-[m
[31m-            /* pad six '='s to the end */[m
[31m-            if (padding) {[m
[31m-                *d++ = '=';[m
[31m-                *d++ = '=';[m
[31m-                *d++ = '=';[m
[31m-                *d++ = '=';[m
[31m-                *d++ = '=';[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            *d++ = basis32[((s[0] & 0x07) << 2) | (s[1] >> 6)];[m
[31m-            *d++ = basis32[(s[1] >> 1) & 0x1f];[m
[31m-[m
[31m-            if (len == 2) {[m
[31m-                /* 2 bytes left */[m
[31m-                *d++ = basis32[(s[1] & 1) << 4];[m
[31m-[m
[31m-                /* pad four '='s to the end */[m
[31m-                if (padding) {[m
[31m-                    *d++ = '=';[m
[31m-                    *d++ = '=';[m
[31m-                    *d++ = '=';[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                *d++ = basis32[((s[1] & 1) << 4) | (s[2] >> 4)];[m
[31m-[m
[31m-                if (len == 3) {[m
[31m-                    /* 3 bytes left */[m
[31m-                    *d++ = basis32[(s[2] & 0x0f) << 1];[m
[31m-[m
[31m-                    if (padding) {[m
[31m-                        /* pad three '='s to the end */[m
[31m-                        *d++ = '=';[m
[31m-                        *d++ = '=';[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    /* 4 bytes left */[m
[31m-                    *d++ = basis32[((s[2] & 0x0f) << 1) | (s[3] >> 7)];[m
[31m-                    *d++ = basis32[(s[3] >> 2) & 0x1f];[m
[31m-                    *d++ = basis32[(s[3] & 0x03) << 3];[m
[31m-[m
[31m-                    /* pad one '=' to the end */[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (padding) {[m
[31m-            *d++ = '=';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *dlen = (size_t) (d - dst);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-decode_base32(size_t slen, u_char *src, size_t *dlen, u_char *dst,[m
[31m-    u_char *basis32)[m
[31m-{[m
[31m-    size_t                   len, mod;[m
[31m-    u_char                  *s = src;[m
[31m-    u_char                  *d = dst;[m
[31m-[m
[31m-    for (len = 0; len < slen; len++) {[m
[31m-        if (s[len] == '=') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (basis32[s[len]] == 77) {[m
[31m-            return -1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    mod = len % 8;[m
[31m-[m
[31m-    if (mod == 1 || mod == 3 || mod == 6) {[m
[31m-        /* bad Base32 digest length */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    while (len > 7) {[m
[31m-        *d++ = (basis32[s[0]] << 3) | ((basis32[s[1]] >> 2) & 0x07);[m
[31m-[m
[31m-        *d++ = ((basis32[s[1]] & 0x03) << 6) | (basis32[s[2]] << 1) |[m
[31m-            ((basis32[s[3]] >> 4) & 1);[m
[31m-[m
[31m-        *d++ = ((basis32[s[3]] & 0x0f) << 4) | ((basis32[s[4]] >> 1) & 0x0f);[m
[31m-[m
[31m-        *d++ = ((basis32[s[4]] & 1) << 7) | ((basis32[s[5]] & 0x1f) << 2) |[m
[31m-            ((basis32[s[6]] >> 3) & 0x03);[m
[31m-        *d++ = ((basis32[s[6]] & 0x07) << 5) | (basis32[s[7]] & 0x1f);[m
[31m-[m
[31m-        s += 8;[m
[31m-        len -= 8;[m
[31m-    }[m
[31m-[m
[31m-    if (len) {[m
[31m-        /* 2 bytes left */[m
[31m-        *d++ = (basis32[s[0]] << 3) | ((basis32[s[1]] >> 2) & 0x07);[m
[31m-[m
[31m-        if (len > 2) {[m
[31m-            /* 4 bytes left */[m
[31m-            *d++ = ((basis32[s[1]] & 0x03) << 6) | ((basis32[s[2]] & 0x1f) << 1)[m
[31m-                | ((basis32[s[3]] >> 4) & 1);[m
[31m-[m
[31m-            if (len > 4) {[m
[31m-                /* 5 bytes left */[m
[31m-                *d++ = ((basis32[s[3]] & 0x0f) << 4) |[m
[31m-                    ((basis32[s[4]] >> 1) & 0x0f);[m
[31m-[m
[31m-                if (len > 5) {[m
[31m-                    /* 7 bytes left */[m
[31m-                    *d++ = ((basis32[s[4]] & 1) << 7) |[m
[31m-                        ((basis32[s[5]] & 0x1f) << 2) |[m
[31m-                        ((basis32[s[6]] >> 3) & 0x03);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *dlen = (size_t) (d - dst);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base32.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base32.h[m
[1mdeleted file mode 100644[m
[1mindex 68ca277..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base32.h[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-#ifndef NGX_HTTP_SET_BASE32[m
[31m-#define NGX_HTTP_SET_BASE32[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_encode_base32(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_decode_base32(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_BASE32 */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base64.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base64.c[m
[1mdeleted file mode 100644[m
[1mindex 8493187..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base64.c[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include    <ndk.h>[m
[31m-#include "ngx_http_set_base64.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_decode_base64(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-[m
[31m-    ngx_str_t        src;[m
[31m-[m
[31m-    src.len = v->len;[m
[31m-    src.data = v->data;[m
[31m-[m
[31m-    res->len = ngx_base64_decoded_length(v->len);[m
[31m-    ndk_palloc_re(res->data, r->pool, res->len);[m
[31m-[m
[31m-    if (ngx_decode_base64(res, &src) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_decode_base64: invalid value");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_encode_base64(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-[m
[31m-    ngx_str_t        src;[m
[31m-[m
[31m-    src.len = v->len;[m
[31m-    src.data = v->data;[m
[31m-[m
[31m-    res->len = ngx_base64_encoded_length(v->len);[m
[31m-    ndk_palloc_re(res->data, r->pool, res->len);[m
[31m-[m
[31m-    ngx_encode_base64(res, &src);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base64.h[m
[1mdeleted file mode 100644[m
[1mindex 6594c77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_base64.h[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_encode_base64(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_decode_base64(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_default_value.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_default_value.c[m
[1mdeleted file mode 100644[m
[1mindex f4c80a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_default_value.c[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_default_value.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_if_empty(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_variable_value_t   *cur_v, *default_v;[m
[31m-[m
[31m-    cur_v = &v[0];[m
[31m-    default_v = &v[1];[m
[31m-[m
[31m-    if (cur_v->not_found || cur_v->len == 0) {[m
[31m-        res->data = default_v->data;[m
[31m-        res->len = default_v->len;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    res->data = cur_v->data;[m
[31m-    res->len = cur_v->len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_set_if_empty(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t            filter;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.func = (void *) ngx_http_set_misc_set_if_empty;[m
[31m-    filter.size = 2;[m
[31m-    filter.data = NULL;[m
[31m-[m
[31m-    return  ndk_set_var_multi_value_core(cf, &value[1], &value[1], &filter);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_default_value.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_default_value.h[m
[1mdeleted file mode 100644[m
[1mindex 5bf5168..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_default_value.h[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#ifndef NGX_HTTP_SET_DEFAULT_VALUE[m
[31m-#define NGX_HTTP_SET_DEFAULT_VALUE[m
[31m-[m
[31m-[m
[31m-char *ngx_http_set_if_empty(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-ngx_int_t ngx_http_set_misc_set_if_empty(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_DEFAULT_VALUE */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.c[m
[1mdeleted file mode 100644[m
[1mindex 2bf73ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.c[m
[1m+++ /dev/null[m
[36m@@ -1,208 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_escape_uri.h"[m
[31m-#include "ngx_string.h"[m
[31m-[m
[31m-[m
[31m-static uintptr_t ngx_escape_uri_patched(u_char *dst, u_char *src, size_t size,[m
[31m-    ngx_uint_t type);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_escape_uri(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t           len;[m
[31m-    uintptr_t        escape;[m
[31m-    u_char          *src, *dst;[m
[31m-[m
[31m-    if (v->len == 0) {[m
[31m-        res->len = 0;[m
[31m-        res->data = NULL;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    src = v->data;[m
[31m-[m
[31m-    dd("before escape:%.*s", v->len, v->data);[m
[31m-    escape = 2 * ngx_escape_uri_patched(NULL, src, v->len, NGX_ESCAPE_URI);[m
[31m-    /* len = v->len + 2 * ngx_escape_uri(NULL, src, v->len, NGX_ESCAPE_URI); */[m
[31m-    len = escape + v->len;[m
[31m-    dd("escaped string len:%zu", len);[m
[31m-[m
[31m-    dst = ngx_palloc(r->pool, len);[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        ngx_memcpy(dst, src, len);[m
[31m-        dd("escape == 0");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_escape_uri_patched(dst, src, v->len, NGX_ESCAPE_URI);[m
[31m-    }[m
[31m-[m
[31m-    res->data = dst;[m
[31m-    res->len = len;[m
[31m-[m
[31m-    dd("after eacape:%.*s", (int) res->len, res->data);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uintptr_t[m
[31m-ngx_escape_uri_patched(u_char *dst, u_char *src, size_t size, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t      n;[m
[31m-    uint32_t       *escape;[m
[31m-    static u_char   hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-                    /* " ", "#", "%", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   uri[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0xfc00886d, /* 1111 1100 0000 0000  1000 1000 0110 1101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x78000000, /* 0111 1000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0xa8000000, /* 1010 1000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", "%", "+", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   args[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x80000829, /* 1000 0000 0000 0000  0000 1000 0010 1001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   html[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x000000ad, /* 0000 0000 0000 0000  0000 0000 1010 1101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   refresh[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000085, /* 0000 0000 0000 0000  0000 0000 1000 0101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "%", %00-%1F */[m
[31m-[m
[31m-    static uint32_t   memcached[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000021, /* 0000 0000 0000 0000  0000 0000 0010 0001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-    };[m
[31m-[m
[31m-                    /* mail_auth is the same as memcached */[m
[31m-[m
[31m-    static uint32_t  *map[] =[m
[31m-        { uri, args, html, refresh, memcached, memcached };[m
[31m-[m
[31m-[m
[31m-    escape = map[type];[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '%';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.h[m
[1mdeleted file mode 100644[m
[1mindex b8564bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_escape_uri.h[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-#ifndef NGX_HTTP_SET_ESCAPE_URI[m
[31m-#define NGX_HTTP_SET_ESCAPE_URI[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_escape_uri(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_ESCAPE_URI */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hash.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hash.c[m
[1mdeleted file mode 100644[m
[1mindex 59ad606..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hash.c[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_set_hash.h"[m
[31m-[m
[31m-#if NGX_HAVE_SHA1[m
[31m-#include "ngx_sha1.h"[m
[31m-[m
[31m-#ifndef SHA_DIGEST_LENGTH[m
[31m-#define SHA_DIGEST_LENGTH 20[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_md5.h"[m
[31m-[m
[31m-[m
[31m-#ifndef MD5_DIGEST_LENGTH[m
[31m-#define MD5_DIGEST_LENGTH 16[m
[31m-#endif[m
[31m-[m
[31m-enum {[m
[31m-#if NGX_HAVE_SHA1[m
[31m-    SHA_HEX_LENGTH = SHA_DIGEST_LENGTH * 2,[m
[31m-#endif[m
[31m-    MD5_HEX_LENGTH = MD5_DIGEST_LENGTH * 2[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if NGX_HAVE_SHA1[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_sha1(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    u_char                  *p;[m
[31m-    ngx_sha1_t               sha;[m
[31m-    u_char                   sha_buf[SHA_DIGEST_LENGTH];[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, SHA_HEX_LENGTH);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sha1_init(&sha);[m
[31m-    ngx_sha1_update(&sha, v->data, v->len);[m
[31m-    ngx_sha1_final(sha_buf, &sha);[m
[31m-[m
[31m-    ngx_hex_dump(p, sha_buf, sizeof(sha_buf));[m
[31m-[m
[31m-    res->data = p;[m
[31m-    res->len = SHA_HEX_LENGTH;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_md5(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    u_char                  *p;[m
[31m-    ngx_md5_t                md5;[m
[31m-    u_char                   md5_buf[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, MD5_HEX_LENGTH);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, v->data, v->len);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    ngx_hex_dump(p, md5_buf, sizeof(md5_buf));[m
[31m-[m
[31m-    res->data = p;[m
[31m-    res->len = MD5_HEX_LENGTH;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hash.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hash.h[m
[1mdeleted file mode 100644[m
[1mindex a210616..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hash.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-#ifndef NGX_HTTP_SET_HASH_H[m
[31m-#define NGX_HTTP_SET_HASH_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_sha1(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_md5(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_HASH_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex 133e364..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_set_hashed_upstream.h"[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_http_set_misc_apply_distribution(ngx_log_t *log, ngx_uint_t hash,[m
[31m-    ndk_upstream_list_t *ul, ngx_http_set_misc_distribution_t type)[m
[31m-{[m
[31m-    switch (type) {[m
[31m-    case ngx_http_set_misc_distribution_modula:[m
[31m-        return (uint32_t) hash % (uint32_t) ul->nelts;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0, "apply_distribution: "[m
[31m-                      "unknown distribution: %d", type);[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_hashed_upstream(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    ngx_str_t                  **u;[m
[31m-    ndk_upstream_list_t         *ul = data;[m
[31m-    ngx_str_t                    ulname;[m
[31m-    ngx_uint_t                   hash, index;[m
[31m-    ngx_http_variable_value_t   *key;[m
[31m-[m
[31m-    if (ul == NULL) {[m
[31m-        ulname.data = v->data;[m
[31m-        ulname.len = v->len;[m
[31m-[m
[31m-        dd("ulname: %.*s", (int) ulname.len, ulname.data);[m
[31m-[m
[31m-        ul = ndk_get_upstream_list(ndk_http_get_main_conf(r),[m
[31m-                                   ulname.data, ulname.len);[m
[31m-[m
[31m-        if (ul == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "set_hashed_upstream: upstream list \"%V\" "[m
[31m-                    "not defined yet", &ulname);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        key = v + 1;[m
[31m-    } else {[m
[31m-        key = v;[m
[31m-    }[m
[31m-[m
[31m-    if (ul->nelts == 0) {[m
[31m-        res->data = NULL;[m
[31m-        res->len = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u = ul->elts;[m
[31m-[m
[31m-    dd("upstream list: %d upstreams found", (int) ul->nelts);[m
[31m-[m
[31m-    if (ul->nelts == 1) {[m
[31m-        dd("only one upstream found in the list");[m
[31m-[m
[31m-        res->data = u[0]->data;[m
[31m-        res->len = u[0]->len;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("key: \"%.*s\"", key->len, key->data);[m
[31m-[m
[31m-    hash = ngx_hash_key_lc(key->data, key->len);[m
[31m-[m
[31m-    index = ngx_http_set_misc_apply_distribution(r->connection->log, hash, ul,[m
[31m-            ngx_http_set_misc_distribution_modula);[m
[31m-[m
[31m-    res->data = u[index]->data;[m
[31m-    res->len = u[index]->len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_set_hashed_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t            filter;[m
[31m-    ngx_uint_t               n;[m
[31m-    ngx_str_t               *var;[m
[31m-    ngx_str_t               *ulname;[m
[31m-    ndk_upstream_list_t     *ul;[m
[31m-    ngx_str_t               *v;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    var = &value[1];[m
[31m-    ulname = &value[2];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(ulname);[m
[31m-[m
[31m-    filter.func = (void *) ngx_http_set_misc_set_hashed_upstream;[m
[31m-[m
[31m-    if (n) {[m
[31m-        /* upstream list name contains variables */[m
[31m-        v = &value[2];[m
[31m-        filter.size = 2;[m
[31m-        filter.data = NULL;[m
[31m-        filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-[m
[31m-        return  ndk_set_var_multi_value_core(cf, var, v, &filter);[m
[31m-    }[m
[31m-[m
[31m-    ul = ndk_get_upstream_list(ndk_http_conf_get_main_conf(cf),[m
[31m-                               ulname->data, ulname->len);[m
[31m-    if (ul == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "set_hashed_upstream: upstream list \"%V\" "[m
[31m-                      "not defined yet", ulname);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v = &value[3];[m
[31m-[m
[31m-    filter.size = 1;[m
[31m-    filter.data = ul;[m
[31m-    filter.type = NDK_SET_VAR_VALUE_DATA;[m
[31m-[m
[31m-    return ndk_set_var_value_core(cf, var, v, &filter);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex 8b7caa7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hashed_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-#ifndef NGX_HTTP_SET_HASHED_UPSTREAM[m
[31m-#define NGX_HTTP_SET_HASHED_UPSTREAM[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ndk.h>[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_set_misc_distribution_modula,[m
[31m-    ngx_http_set_misc_distribution_random /* XXX not used */[m
[31m-} ngx_http_set_misc_distribution_t;[m
[31m-[m
[31m-[m
[31m-ngx_uint_t ngx_http_set_misc_apply_distribution(ngx_log_t *log, ngx_uint_t hash,[m
[31m-    ndk_upstream_list_t *ul, ngx_http_set_misc_distribution_t type);[m
[31m-[m
[31m-char *ngx_http_set_hashed_upstream(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_hashed_upstream(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_HASHED_UPSTREAM */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hex.c[m
[1mdeleted file mode 100644[m
[1mindex 6bdaa4b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hex.c[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_hex.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_decode_hex(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-[m
[31m-    u_char      *p;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i;[m
[31m-    size_t       len;[m
[31m-[m
[31m-    if (v->len % 2 != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_decode_hex: invalid value");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = v->data;[m
[31m-    len = v->len >> 1;[m
[31m-[m
[31m-    res->data = ngx_palloc(r->pool, len);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        n = ngx_hextoi(p, 2);[m
[31m-        if (n == NGX_ERROR || n > 255) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "set_decode_hex: invalid value");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p += 2;[m
[31m-        res->data[i] = (u_char) n;[m
[31m-    }[m
[31m-[m
[31m-    res->len = len;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_encode_hex(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    res->len = v->len << 1;[m
[31m-    res->data = ngx_palloc(r->pool, res->len);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(res->data, v->data, v->len);[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hex.h[m
[1mdeleted file mode 100644[m
[1mindex e8b77e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hex.h[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_decode_hex(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_encode_hex(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hmac.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hmac.c[m
[1mdeleted file mode 100644[m
[1mindex c2d4aba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hmac.c[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-[m
[31m-#include "ngx_http_set_hmac.h"[m
[31m-#include <openssl/evp.h>[m
[31m-#include <openssl/hmac.h>[m
[31m-[m
[31m-[m
[31m-/* this function's implementation is partly borrowed from[m
[31m- * https://github.com/anomalizer/ngx_aws_auth */[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_hmac_sha1(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_variable_value_t   *secret, *string_to_sign;[m
[31m-    unsigned int                 md_len = 0;[m
[31m-    unsigned char                md[EVP_MAX_MD_SIZE];[m
[31m-    const EVP_MD                *evp_md;[m
[31m-[m
[31m-    evp_md = EVP_sha1();[m
[31m-[m
[31m-    secret = v;[m
[31m-    string_to_sign = v + 1;[m
[31m-[m
[31m-    dd("secret=%.*s, string_to_sign=%.*s", (int) secret->len, secret->data,[m
[31m-       (int) string_to_sign->len, string_to_sign->data);[m
[31m-[m
[31m-    HMAC(evp_md, secret->data, secret->len, string_to_sign->data,[m
[31m-         string_to_sign->len, md, &md_len);[m
[31m-[m
[31m-    /* defensive test if there is something wrong with openssl */[m
[31m-    if (md_len == 0 || md_len > EVP_MAX_MD_SIZE) {[m
[31m-        res->len = 0;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->len = md_len;[m
[31m-    ndk_palloc_re(res->data, r->pool, md_len);[m
[31m-[m
[31m-    ngx_memcpy(res->data,[m
[31m-               &md,[m
[31m-               md_len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hmac.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hmac.h[m
[1mdeleted file mode 100644[m
[1mindex 833d17c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_hmac.h[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_hmac_sha1(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_local_today.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_local_today.c[m
[1mdeleted file mode 100644[m
[1mindex fa1c703..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_local_today.c[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_SET_MISC_FMT_DATE_LEN[m
[31m-#define NGX_HTTP_SET_MISC_FMT_DATE_LEN       256[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_local_today(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    time_t           now;[m
[31m-    ngx_tm_t         tm;[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    /*t = ngx_timeofday();*/[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    ngx_gmtime(now + ngx_cached_time->gmtoff * 60, &tm);[m
[31m-[m
[31m-    dd("tm.ngx_tm_hour:%d", tm.ngx_tm_hour);[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, sizeof("yyyy-mm-dd") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(p, "%04d-%02d-%02d", tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                tm.ngx_tm_mday);[m
[31m-[m
[31m-    res->data = p;[m
[31m-    res->len = sizeof("yyyy-mm-dd") - 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_formatted_gmt_time(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    time_t           now;[m
[31m-    u_char          *p;[m
[31m-    struct tm        tm;[m
[31m-[m
[31m-    if (v->not_found || v->len == 0) {[m
[31m-        res->data = NULL;[m
[31m-        res->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-    ngx_libc_gmtime(now, &tm);[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_HTTP_SET_MISC_FMT_DATE_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->len = strftime((char *) p, NGX_HTTP_SET_MISC_FMT_DATE_LEN,[m
[31m-                        (char *) v->data, &tm);[m
[31m-    if (res->len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_formatted_local_time(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    time_t           now;[m
[31m-    u_char          *p;[m
[31m-    struct tm        tm;[m
[31m-[m
[31m-    if (v->not_found || v->len == 0) {[m
[31m-        res->data = NULL;[m
[31m-        res->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-    ngx_libc_localtime(now, &tm);[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_HTTP_SET_MISC_FMT_DATE_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->len = strftime((char *) p, NGX_HTTP_SET_MISC_FMT_DATE_LEN,[m
[31m-                        (char *) v->data, &tm);[m
[31m-    if (res->len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_local_today.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_local_today.h[m
[1mdeleted file mode 100644[m
[1mindex 993431e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_local_today.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_set_local_today(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-        ngx_http_variable_value_t *v);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_formatted_gmt_time(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-        ngx_http_variable_value_t *v);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_formatted_local_time(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.c[m
[1mdeleted file mode 100644[m
[1mindex 622067b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,535 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_misc_module.h"[m
[31m-#include "ngx_http_set_base32.h"[m
[31m-#include "ngx_http_set_default_value.h"[m
[31m-#include "ngx_http_set_hashed_upstream.h"[m
[31m-#include "ngx_http_set_unescape_uri.h"[m
[31m-#include "ngx_http_set_quote_sql.h"[m
[31m-#include "ngx_http_set_quote_json.h"[m
[31m-#include "ngx_http_set_escape_uri.h"[m
[31m-#include "ngx_http_set_local_today.h"[m
[31m-#include "ngx_http_set_hash.h"[m
[31m-#include "ngx_http_set_hex.h"[m
[31m-#include "ngx_http_set_base64.h"[m
[31m-#if NGX_OPENSSL[m
[31m-#include "ngx_http_set_hmac.h"[m
[31m-#endif[m
[31m-#include "ngx_http_set_random.h"[m
[31m-#include "ngx_http_set_secure_random.h"[m
[31m-#include "ngx_http_set_rotate.h"[m
[31m-[m
[31m-[m
[31m-#define NGX_UNESCAPE_URI_COMPONENT  0[m
[31m-#define BASE32_ALPHABET_LEN         32[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_set_misc_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_set_misc_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_set_misc_base32_alphabet(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_deprecated_t  ngx_conf_deprecated_set_misc_base32_padding = {[m
[31m-    ngx_conf_deprecated, "set_misc_base32_padding", "set_base32_padding"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_encode_base64_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_encode_base64,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_decode_base64_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_decode_base64,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_decode_hex_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_decode_hex,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_encode_hex_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_encode_hex,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if NGX_OPENSSL[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_hmac_sha1_filter = {[m
[31m-    NDK_SET_VAR_MULTI_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_hmac_sha1,[m
[31m-    2,[m
[31m-    NULL[m
[31m-};[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_SET_HASH[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_md5_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_md5,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if NGX_HAVE_SHA1[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_sha1_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_sha1,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_unescape_uri_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_unescape_uri,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t ngx_http_set_misc_escape_uri_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_escape_uri,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_decode_base32_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_decode_base32,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_quote_sql_str_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_quote_sql_str,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_quote_pgsql_str_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_quote_pgsql_str,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_quote_json_str_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_quote_json_str,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_encode_base32_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_encode_base32,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t ngx_http_set_misc_local_today_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_local_today,[m
[31m-    0,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t ngx_http_set_misc_formatted_gmt_time_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_formatted_gmt_time,[m
[31m-    2,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t ngx_http_set_misc_formatted_local_time_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_formatted_local_time,[m
[31m-    2,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_random_filter = {[m
[31m-    NDK_SET_VAR_MULTI_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_random,[m
[31m-    2,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_secure_random_alphanum_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_secure_random_alphanum,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_t  ngx_http_set_misc_set_secure_random_lcalpha_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_misc_set_secure_random_lcalpha,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_set_misc_commands[] = {[m
[31m-    {   ngx_string ("set_encode_base64"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_encode_base64_filter[m
[31m-    },[m
[31m-    {   ngx_string ("set_decode_base64"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_decode_base64_filter[m
[31m-    },[m
[31m-    {   ngx_string ("set_decode_hex"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_decode_hex_filter[m
[31m-    },[m
[31m-    {   ngx_string ("set_encode_hex"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_encode_hex_filter[m
[31m-    },[m
[31m-#if NGX_OPENSSL[m
[31m-    {   ngx_string ("set_hmac_sha1"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE3,[m
[31m-        ndk_set_var_multi_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_hmac_sha1_filter[m
[31m-    },[m
[31m-#endif[m
[31m-#ifndef NGX_HTTP_SET_HASH[m
[31m-    {   ngx_string ("set_md5"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_md5_filter[m
[31m-    },[m
[31m-#if NGX_HAVE_SHA1[m
[31m-    {[m
[31m-        ngx_string ("set_sha1"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_sha1_filter[m
[31m-    },[m
[31m-#endif[m
[31m-#endif[m
[31m-    {[m
[31m-        ngx_string ("set_unescape_uri"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_unescape_uri_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("set_escape_uri"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_escape_uri_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("set_quote_sql_str"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_quote_sql_str_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("set_quote_pgsql_str"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_quote_pgsql_str_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("set_quote_json_str"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_quote_json_str_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("set_if_empty"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE2,[m
[31m-        ngx_http_set_if_empty,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_hashed_upstream"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE3,[m
[31m-        ngx_http_set_hashed_upstream,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        /* this is now deprecated; use set_base32_padding instead */[m
[31m-        ngx_string("set_misc_base32_padding"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-        ngx_conf_set_flag_slot,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        offsetof(ngx_http_set_misc_loc_conf_t, base32_padding),[m
[31m-        &ngx_conf_deprecated_set_misc_base32_padding,[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_base32_padding"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-        ngx_conf_set_flag_slot,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        offsetof(ngx_http_set_misc_loc_conf_t, base32_padding),[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_base32_alphabet"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_set_misc_base32_alphabet,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        offsetof(ngx_http_set_misc_loc_conf_t, base32_alphabet),[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_encode_base32"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_encode_base32_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_decode_base32"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_decode_base32_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_local_today"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_local_today_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_formatted_gmt_time"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE2,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_formatted_gmt_time_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_formatted_local_time"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE2,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_formatted_local_time_filter[m
[31m-    },[m
[31m-    {   ngx_string ("set_random"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE3,[m
[31m-        ndk_set_var_multi_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_random_filter[m
[31m-    },[m
[31m-    {   ngx_string ("set_secure_random_alphanum"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_secure_random_alphanum_filter[m
[31m-    },[m
[31m-    {   ngx_string ("set_secure_random_lcalpha"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_set_misc_set_secure_random_lcalpha_filter[m
[31m-    },[m
[31m-    {   ngx_string ("set_rotate"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE3,[m
[31m-        ngx_http_set_rotate,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_set_misc_module_ctx = {[m
[31m-    NULL,                                 /* preconfiguration */[m
[31m-    NULL,                                 /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_set_misc_create_loc_conf,     /* create location configuration */[m
[31m-    ngx_http_set_misc_merge_loc_conf       /*  merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_set_misc_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_set_misc_module_ctx,          /* module context */[m
[31m-    ngx_http_set_misc_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                        /* module type */[m
[31m-    NULL,                                   /* init master */[m
[31m-    NULL,                                   /* init module */[m
[31m-    NULL,                                   /* init process */[m
[31m-    NULL,                                   /* init thread */[m
[31m-    NULL,                                   /* exit thread */[m
[31m-    NULL,                                   /* exit process */[m
[31m-    NULL,                                   /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_set_misc_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_set_misc_loc_conf_t *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_set_misc_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->base32_padding = NGX_CONF_UNSET;[m
[31m-    conf->base32_alphabet.data = NULL;[m
[31m-    conf->base32_alphabet.len = 0;[m
[31m-    conf->current = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_set_misc_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_uint_t               i;[m
[31m-[m
[31m-    ngx_http_set_misc_loc_conf_t *prev = parent;[m
[31m-    ngx_http_set_misc_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->base32_padding, prev->base32_padding, 1);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->base32_alphabet, prev->base32_alphabet,[m
[31m-                             "0123456789abcdefghijklmnopqrstuv");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->current, prev->current, NGX_CONF_UNSET);[m
[31m-[m
[31m-    for (i = 0; i < BASE32_ALPHABET_LEN; i++) {[m
[31m-        conf->basis32[conf->base32_alphabet.data[i]] = (u_char) i;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_misc_base32_alphabet(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_str_t       *value;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len != BASE32_ALPHABET_LEN) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"set_base32_alphabet\" directive takes an "[m
[31m-                           "alphabet of %uz bytes but %d expected",[m
[31m-                           value[1].len, BASE32_ALPHABET_LEN);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_conf_set_str_slot(cf, cmd, conf);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.h[m
[1mdeleted file mode 100644[m
[1mindex 424d655..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_misc_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-#ifndef NGX_HTTP_SET_MISC_MODULE_H[m
[31m-#define NGX_HTTP_SET_MISC_MODULE_H[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t          base32_padding;[m
[31m-    ngx_str_t           base32_alphabet;[m
[31m-    u_char              basis32[256];[m
[31m-    ngx_int_t           current;  /* for set_rotate */[m
[31m-} ngx_http_set_misc_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_set_misc_module;[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_MISC_MODULE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.c[m
[1mdeleted file mode 100644[m
[1mindex 115dd3c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.c[m
[1m+++ /dev/null[m
[36m@@ -1,163 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_quote_json.h"[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_quote_json_str(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *p;[m
[31m-    size_t                   escape;[m
[31m-[m
[31m-    if (v->not_found || v->len == 0) {[m
[31m-        res->data = (u_char *) "null";[m
[31m-        res->len = sizeof("null") - 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    escape = ngx_http_set_misc_escape_json_str(NULL, v->data, v->len);[m
[31m-[m
[31m-    len = sizeof("''") - 1[m
[31m-        + v->len[m
[31m-        + escape;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->data = p;[m
[31m-    res->len = len;[m
[31m-[m
[31m-    *p++ = '\"';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, v->data, v->len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_set_misc_escape_json_str(p, v->data, v->len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '\"';[m
[31m-[m
[31m-    if (p != res->data + res->len) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_quote_sql_str: buffer error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_http_set_misc_escape_json_str(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    ngx_uint_t                   n;[m
[31m-[m
[31m-    static u_char hex[] = "0123456789abcdef";[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        /* find the number of characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            /* UTF-8 char has high bit of 1 */[m
[31m-            if ((*src & 0x80) == 0) {[m
[31m-                switch (*src) {[m
[31m-                case '\r':[m
[31m-                case '\n':[m
[31m-                case '\\':[m
[31m-                case '"':[m
[31m-                case '\f':[m
[31m-                case '\b':[m
[31m-                case '\t':[m
[31m-                    n++;[m
[31m-                    break;[m
[31m-                default:[m
[31m-                    if (*src < 32) {[m
[31m-                        n += sizeof("\\u00xx") - 2;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if ((*src & 0x80) == 0) {[m
[31m-            switch (*src) {[m
[31m-            case '\r':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 'r';[m
[31m-                break;[m
[31m-[m
[31m-            case '\n':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 'n';[m
[31m-                break;[m
[31m-[m
[31m-            case '\\':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = '\\';[m
[31m-                break;[m
[31m-[m
[31m-            case '"':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = '"';[m
[31m-                break;[m
[31m-[m
[31m-            case '\f':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 'f';[m
[31m-                break;[m
[31m-[m
[31m-            case '\b':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 'b';[m
[31m-                break;[m
[31m-[m
[31m-            case '\t':[m
[31m-                *dst++ = '\\';[m
[31m-                *dst++ = 't';[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (*src < 32) { /* control chars */[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'u';[m
[31m-                    *dst++ = '0';[m
[31m-                    *dst++ = '0';[m
[31m-                    *dst++ = hex[*src >> 4];[m
[31m-                    *dst++ = hex[*src & 0x0f];[m
[31m-                } else {[m
[31m-                    *dst++ = *src;[m
[31m-                }[m
[31m-                break;[m
[31m-            } /* switch */[m
[31m-[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.h[m
[1mdeleted file mode 100644[m
[1mindex 1bf55e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_json.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-#ifndef NGX_HTTP_SET_QUOTE_JSON_H[m
[31m-#define NGX_HTTP_SET_QUOTE_JSON_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_quote_json_str(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-uintptr_t ngx_http_set_misc_escape_json_str(u_char *dst, u_char *src,[m
[31m-        size_t size);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_QUOTE_JSON_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.c[m
[1mdeleted file mode 100644[m
[1mindex 0afbc51..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.c[m
[1m+++ /dev/null[m
[36m@@ -1,338 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_quote_sql.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_pg_utf_escape(ngx_http_request_t *r, ngx_str_t *res);[m
[31m-static ngx_int_t ngx_http_pg_utf_islegal(const unsigned char *s, ngx_int_t len);[m
[31m-static ngx_int_t ngx_http_pg_utf_mblen(const unsigned char *s);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_quote_pgsql_str(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    u_char                   *pstr;[m
[31m-    ngx_int_t                 length;[m
[31m-[m
[31m-    if (v->not_found || v->len ==0) {[m
[31m-        res->data = (u_char *) "''";[m
[31m-        res->len = sizeof("''") - 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_misc_quote_sql_str(r, res, v);[m
[31m-    length  = res->len;[m
[31m-[m
[31m-    pstr    = ngx_palloc(r->pool, length + 1);[m
[31m-    if (pstr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *pstr   = 'E';[m
[31m-    memcpy(pstr + 1, res->data, length);[m
[31m-    res->data   = pstr;[m
[31m-    res->len    = length + 1;[m
[31m-[m
[31m-    if (ngx_http_pg_utf_islegal(res->data, res->len)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_pg_utf_escape(r, res) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_pg_utf_mblen(const unsigned char *s)[m
[31m-{[m
[31m-    int len;[m
[31m-[m
[31m-    if ((*s & 0x80) == 0)[m
[31m-        len = 1;[m
[31m-    else if ((*s & 0xe0) == 0xc0)[m
[31m-        len = 2;[m
[31m-    else if ((*s & 0xf0) == 0xe0)[m
[31m-        len = 3;[m
[31m-    else if ((*s & 0xf8) == 0xf0)[m
[31m-        len = 4;[m
[31m-#ifdef NOT_USED[m
[31m-    else if ((*s & 0xfc) == 0xf8)[m
[31m-        len = 5;[m
[31m-    else if ((*s & 0xfe) == 0xfc)[m
[31m-        len = 6;[m
[31m-#endif[m
[31m-    else[m
[31m-        len = 1;[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_pg_utf_islegal(const unsigned char *s, ngx_int_t len)[m
[31m-{[m
[31m-    ngx_int_t               mblen;[m
[31m-    ngx_int_t               slen;[m
[31m-    u_char                  a;[m
[31m-[m
[31m-    slen = len;[m
[31m-[m
[31m-    while (slen > 0) {[m
[31m-        mblen = ngx_http_pg_utf_mblen(s);[m
[31m-        if (slen < mblen)[m
[31m-            return 0;[m
[31m-[m
[31m-        switch(mblen)[m
[31m-        {[m
[31m-            default:[m
[31m-                return 0;[m
[31m-            case 4:[m
[31m-                a = *(s + 3);[m
[31m-                if (a < 0x80 || a > 0xBF)[m
[31m-                    return 0;[m
[31m-            case 3:[m
[31m-                a = *(s + 2);[m
[31m-                if (a < 0x80 || a > 0xBF)[m
[31m-                    return 0;[m
[31m-            case 2:[m
[31m-                a = *(s + 1);[m
[31m-                switch (*s)[m
[31m-                {[m
[31m-                    case 0xE0:[m
[31m-                        if (a < 0xA0 || a > 0xBF)[m
[31m-                            return 0;[m
[31m-                        break;[m
[31m-                    case 0xED:[m
[31m-                        if (a < 0x80 || a > 0x9F)[m
[31m-                            return 0;[m
[31m-                        break;[m
[31m-                    case 0xF0:[m
[31m-                        if (a < 0x90 || a > 0xBF)[m
[31m-                            return 0;[m
[31m-                        break;[m
[31m-                    case 0xF4:[m
[31m-                        if (a < 0x80 || a > 0x8F)[m
[31m-                            return 0;[m
[31m-                        break;[m
[31m-                    default:[m
[31m-                        if (a < 0x80 || a > 0xBF)[m
[31m-                            return 0;[m
[31m-                        break;[m
[31m-                }[m
[31m-            case 1:[m
[31m-                a = *s;[m
[31m-                if (a >= 0x80 && a < 0xC2)[m
[31m-                    return 0;[m
[31m-                if (a > 0xF4)[m
[31m-                    return 0;[m
[31m-                break;[m
[31m-        }[m
[31m-[m
[31m-        s       += mblen;[m
[31m-        slen    -= mblen;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_pg_utf_escape(ngx_http_request_t *r, ngx_str_t *res)[m
[31m-{[m
[31m-    ngx_str_t               *result;[m
[31m-    ngx_int_t                l, count;[m
[31m-    u_char                  *d, *p, *p1;[m
[31m-[m
[31m-    l      = res->len;[m
[31m-    d      = res->data;[m
[31m-    result = res;[m
[31m-    count  = 0;[m
[31m-[m
[31m-    while (l-- > 0) {[m
[31m-        if (*d & 0x80) {[m
[31m-            count += 4;[m
[31m-        }[m
[31m-        d++;[m
[31m-        count++;[m
[31m-    }[m
[31m-[m
[31m-    d = res->data;[m
[31m-    l = res->len;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, count);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p1  = p;[m
[31m-    while (l-- > 0) {[m
[31m-        if ((*d & 0x80)) {[m
[31m-            *p++ = '\\';[m
[31m-            *p++ = '\\';[m
[31m-            *p++ = (*d >> 6) + '0';[m
[31m-            *p++ = ((*d >> 3) & 07) + '0';[m
[31m-            *p++ = (*d & 07) + '0';[m
[31m-        } else {[m
[31m-            *p++ = *d;[m
[31m-        }[m
[31m-        d++;[m
[31m-    }[m
[31m-[m
[31m-    result->len  = count;[m
[31m-    result->data = p1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_quote_sql_str(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *p;[m
[31m-    size_t                   escape;[m
[31m-[m
[31m-    if (v->not_found || v->len == 0) {[m
[31m-        res->data   = (u_char *) "''";[m
[31m-        res->len    = sizeof("''") - 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    escape = ngx_http_set_misc_escape_sql_str(NULL, v->data, v->len);[m
[31m-[m
[31m-    len = sizeof("''") - 1 + v->len + escape;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->data = p;[m
[31m-    res->len = len;[m
[31m-[m
[31m-    *p++ = '\'';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, v->data, v->len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_set_misc_escape_sql_str(p, v->data, v->len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '\'';[m
[31m-[m
[31m-    if (p != res->data + res->len) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_quote_sql_str: buffer error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_http_set_misc_escape_sql_str(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    ngx_uint_t               n;[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        /* find the number of chars to be escaped */[m
[31m-        n = 0;[m
[31m-        while (size) {[m
[31m-            /* the highest bit of all the UTF-8 chars[m
[31m-             * is always 1 */[m
[31m-            if ((*src & 0x80) == 0) {[m
[31m-                switch (*src) {[m
[31m-                    case '\0':[m
[31m-                    case '\b':[m
[31m-                    case '\n':[m
[31m-                    case '\r':[m
[31m-                    case '\t':[m
[31m-                    case '\\':[m
[31m-                    case '\'':[m
[31m-                    case '"':[m
[31m-                    case 26: /* \Z */[m
[31m-                        n++;[m
[31m-                        break;[m
[31m-                    default:[m
[31m-                        break;[m
[31m-                }[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if ((*src & 0x80) == 0) {[m
[31m-            switch (*src) {[m
[31m-                case '\0':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '0';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\b':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'b';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\n':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'n';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\r':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'r';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\t':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 't';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\\':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '\\';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\'':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '\'';[m
[31m-                    break;[m
[31m-[m
[31m-                case '"':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '"';[m
[31m-                    break;[m
[31m-[m
[31m-                case 26:[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'Z';[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    *dst++ = *src;[m
[31m-                    break;[m
[31m-            }[m
[31m-        } else {[m
[31m-            *dst++ = *src;[m
[31m-        }[m
[31m-        src++;[m
[31m-        size--;[m
[31m-    } /* while (size) */[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.h[m
[1mdeleted file mode 100644[m
[1mindex c631dd7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_quote_sql.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-#ifndef NGX_SET_QUOTE_SQL_H[m
[31m-#define NGX_SET_QUOTE_SQL_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-uintptr_t ngx_http_set_misc_escape_sql_str(u_char *dst, u_char *src,[m
[31m-        size_t size);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_quote_sql_str(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_quote_pgsql_str(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_SET_QUOTE_SQL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_random.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_random.c[m
[1mdeleted file mode 100644[m
[1mindex c223633..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_random.c[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_random.h"[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_random(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_variable_value_t   *rand_from, *rand_to;[m
[31m-    ngx_int_t                    int_from, int_to, tmp, random;[m
[31m-[m
[31m-    rand_from = v;[m
[31m-    rand_to = v + 1;[m
[31m-[m
[31m-    int_from = ngx_atoi(rand_from->data, rand_from->len);[m
[31m-    if (int_from == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_random: bad \"from\" argument: %v", rand_from);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    int_to = ngx_atoi(rand_to->data, rand_to->len);[m
[31m-    if (int_to == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_random: bad \"to\" argument: %v", rand_to);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (int_from > int_to) {[m
[31m-        tmp = int_from;[m
[31m-        int_from = int_to;[m
[31m-        int_to = tmp;[m
[31m-    }[m
[31m-[m
[31m-    random = rand() % (int_to - int_from + 1) + int_from;[m
[31m-[m
[31m-    res->data = ngx_palloc(r->pool, NGX_INT_T_LEN);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->len = ngx_sprintf(res->data, "%i", random) - res->data;[m
[31m-[m
[31m-    /* Set all required params */[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_random.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_random.h[m
[1mdeleted file mode 100644[m
[1mindex 88cffdc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_random.h[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-#ifndef NGX_SET_RANDOM_H[m
[31m-#define NGX_SET_RANDOM_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_random(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-#endif /* NGX_SET_RANDOM_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_rotate.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_rotate.c[m
[1mdeleted file mode 100644[m
[1mindex b83dee7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_rotate.c[m
[1m+++ /dev/null[m
[36m@@ -1,113 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_rotate.h"[m
[31m-#include "ngx_http_set_misc_module.h"[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_rotate(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_variable_value_t   *rotate_from, *rotate_to, *rotate_num;[m
[31m-    ngx_int_t                    int_from, int_to, tmp, int_current;[m
[31m-[m
[31m-    ngx_http_set_misc_loc_conf_t        *conf;[m
[31m-[m
[31m-    rotate_num = &v[0];[m
[31m-    rotate_from = &v[1];[m
[31m-    rotate_to = &v[2];[m
[31m-[m
[31m-    int_from = ngx_atoi(rotate_from->data, rotate_from->len);[m
[31m-    if (int_from == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_rotate: bad \"from\" argument value: \"%v\"",[m
[31m-                      rotate_from);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    int_to = ngx_atoi(rotate_to->data, rotate_to->len);[m
[31m-    if (int_to == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_rotate: bad \"to\" argument value: \"%v\"",[m
[31m-                      rotate_to);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (int_from > int_to) {[m
[31m-        tmp = int_from;[m
[31m-        int_from = int_to;[m
[31m-        int_to = tmp;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_set_misc_module);[m
[31m-[m
[31m-    dd("current value not found: %d", (int) rotate_num->not_found);[m
[31m-[m
[31m-    if (rotate_num->len == 0) {[m
[31m-        if (conf->current != NGX_CONF_UNSET) {[m
[31m-            int_current = conf->current;[m
[31m-[m
[31m-        } else {[m
[31m-            int_current = int_from - 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        int_current = ngx_atoi(rotate_num->data, rotate_num->len);[m
[31m-        if (int_current == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "set_rotate: bad current value: \"%v\"", rotate_num);[m
[31m-[m
[31m-            if (conf->current != NGX_CONF_UNSET) {[m
[31m-                int_current = conf->current;[m
[31m-[m
[31m-            } else {[m
[31m-                int_current = int_from - 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    int_current++;[m
[31m-[m
[31m-    if (int_current > int_to || int_current < int_from) {[m
[31m-        int_current = int_from;[m
[31m-    }[m
[31m-[m
[31m-    conf->current = int_current;[m
[31m-[m
[31m-    res->data = ngx_palloc(r->pool, NGX_INT_T_LEN);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->len = ngx_sprintf(res->data, "%i", int_current) - res->data;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_set_rotate(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t            filter;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.func = (void *) ngx_http_set_misc_set_rotate;[m
[31m-    filter.size = 3;[m
[31m-    filter.data = NULL;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, &value[1], &value[1], &filter);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_rotate.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_rotate.h[m
[1mdeleted file mode 100644[m
[1mindex 429204c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_rotate.h[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-#ifndef NGX_HTTP_SET_MISC_ROTATE_H[m
[31m-#define NGX_HTTP_SET_MISC_ROTATE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-char *ngx_http_set_rotate(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_rotate(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_MISC_ROTATE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.c[m
[1mdeleted file mode 100644[m
[1mindex 8cc3e97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.c[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_secure_random.h"[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    MAX_RANDOM_STRING = 64,[m
[31m-    ALPHANUM = 1,[m
[31m-    LCALPHA  = 2[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_misc_set_secure_random_common(int alphabet_type,[m
[31m-    ngx_http_request_t *r, ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_secure_random_alphanum(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    return ngx_http_set_misc_set_secure_random_common(ALPHANUM, r, res, v);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_set_secure_random_lcalpha(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    return ngx_http_set_misc_set_secure_random_common(LCALPHA, r, res, v);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_misc_set_secure_random_common(int alphabet_type,[m
[31m-    ngx_http_request_t *r, ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    static u_char  alphabet[] = "abcdefghijklmnopqrstuvwxyz"[m
[31m-                                "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";[m
[31m-[m
[31m-    u_char         entropy[MAX_RANDOM_STRING];[m
[31m-    u_char         output[MAX_RANDOM_STRING];[m
[31m-    ngx_int_t      length, i;[m
[31m-    ngx_fd_t       fd;[m
[31m-    ssize_t        n;[m
[31m-[m
[31m-    length = ngx_atoi(v->data, v->len);[m
[31m-[m
[31m-    if (length == NGX_ERROR || length < 1 || length > MAX_RANDOM_STRING) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_random: bad \"length\" argument: %v", v);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fd = ngx_open_file((u_char *) "/dev/urandom", NGX_FILE_RDONLY,[m
[31m-                       NGX_FILE_OPEN, 0);[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_secure_random: could not open /dev/urandom");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_fd(fd, entropy, length);[m
[31m-    if (n != length) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_secure_random: could not read all %i byte(s) from "[m
[31m-                      "/dev/urandom", length);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_file(fd);[m
[31m-[m
[31m-    for (i = 0; i < length; i++) {[m
[31m-        if (alphabet_type == LCALPHA) {[m
[31m-            output[i] = entropy[i] % 26 + 'a';[m
[31m-[m
[31m-        } else {[m
[31m-            output[i] = alphabet[ entropy[i] % (sizeof alphabet - 1) ];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    res->data = ngx_palloc(r->pool, length);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(res->data, output, length);[m
[31m-[m
[31m-    res->len = length;[m
[31m-[m
[31m-    /* set all required params */[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.h[m
[1mdeleted file mode 100644[m
[1mindex d65129e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_secure_random.h[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-#ifndef NGX_SET_SECURE_RANDOM_H[m
[31m-#define NGX_SET_SECURE_RANDOM_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_secure_random_alphanum(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_set_secure_random_lcalpha(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-#endif /* NGX_SET_SECURE_RANDOM_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.c[m
[1mdeleted file mode 100644[m
[1mindex 3ae1d0a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.c[m
[1m+++ /dev/null[m
[36m@@ -1,184 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_set_unescape_uri.h"[m
[31m-[m
[31m-#define NGX_UNESCAPE_URI_COMPONENT  0[m
[31m-[m
[31m-[m
[31m-static void ngx_unescape_uri_patched(u_char **dst, u_char **src, size_t size,[m
[31m-    ngx_uint_t type);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_misc_unescape_uri(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *p;[m
[31m-    u_char                  *src, *dst;[m
[31m-[m
[31m-    /* the unescaped string can only be smaller */[m
[31m-    len = v->len;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    src = v->data; dst = p;[m
[31m-[m
[31m-    ngx_unescape_uri_patched(&dst, &src, v->len, NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-    if (src != v->data + v->len) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "set_unescape_uri: input data not consumed completely");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->data = p;[m
[31m-    res->len = dst - p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* XXX we also decode '+' to ' ' */[m
[31m-static void[m
[31m-ngx_unescape_uri_patched(u_char **dst, u_char **src, size_t size,[m
[31m-    ngx_uint_t type)[m
[31m-{[m
[31m-    u_char  *d, *s, ch, c, decoded;[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_quoted,[m
[31m-        sw_quoted_second[m
[31m-    } state;[m
[31m-[m
[31m-    d = *dst;[m
[31m-    s = *src;[m
[31m-[m
[31m-    state = 0;[m
[31m-    decoded = 0;[m
[31m-[m
[31m-    while (size--) {[m
[31m-[m
[31m-        ch = *s++;[m
[31m-[m
[31m-        switch (state) {[m
[31m-        case sw_usual:[m
[31m-            if (ch == '?'[m
[31m-                && (type & (NGX_UNESCAPE_URI|NGX_UNESCAPE_REDIRECT)))[m
[31m-            {[m
[31m-                *d++ = ch;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '%') {[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '+') {[m
[31m-                *d++ = ' ';[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted:[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                decoded = (u_char) (ch - '0');[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                decoded = (u_char) (c - 'a' + 10);[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted_second:[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ch = (u_char) ((decoded << 4) + ch - '0');[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ch = (u_char) ((decoded << 4) + c - 'a' + 10);[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_URI) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = ch;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    *dst = d;[m
[31m-    *src = s;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.h[m
[1mdeleted file mode 100644[m
[1mindex 59e9a93..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/src/ngx_http_set_unescape_uri.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-[m
[31m-#ifndef NGX_HTTP_SET_UNESCAPE_URI[m
[31m-#define NGX_HTTP_SET_UNESCAPE_URI[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_set_misc_unescape_uri(ngx_http_request_t *r,[m
[31m-        ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SET_UNESCAPE_URI */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base32.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base32.t[m
[1mdeleted file mode 100644[m
[1mindex 102aadc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base32.t[m
[1m+++ /dev/null[m
[36m@@ -1,557 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: base32 (5 bytes)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a 'abcde';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-c5h66p35[m
[31m-abcde[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: base32 (1 byte)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-44======[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: base32 (1 byte) - not in-place editing[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a $a;[m
[31m-        set_decode_base32 $b $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-44======[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: base32 (hello world)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!\nhiya"';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m6888ad1knio92[m
[31m-"hello, world![m
[31m-hiya"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: base32 (0 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: base32 (6 bytes padded)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"a';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892c4======[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: base32 (4 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"ab';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892c5h0====[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: base32 (3 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abc';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892c5h66===[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: base32 (1 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abcd';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892c5h66p0=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: base32 standard alphabet (5 bytes)[m
[31m---- config[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a 'abcde';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-MFRGGZDF[m
[31m-abcde[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: base32 standard alphabet (1 byte)[m
[31m---- config[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EE======[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: base32 standard alphabet (1 byte) - not in-place editing[m
[31m---- config[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a $a;[m
[31m-        set_decode_base32 $b $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EE======[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: base32 standard alphabet (hello world)[m
[31m---- config[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!\nhiya"';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIIKNBUXSYJC[m
[31m-"hello, world![m
[31m-hiya"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: base32 standard alphabet (0 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJC[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: base32 standard alphabet (6 bytes padded)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"a';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJCME======[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: base32 standard alphabet (4 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"ab';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJCMFRA====[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: base32 standard alphabet (3 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abc';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJCMFRGG===[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: base32 standard alphabet (1 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abcd';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJCMFRGGZA=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: base32 custom alphabet (5 bytes)[m
[31m---- config[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a 'abcde';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-qjvkk3hj[m
[31m-abcde[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: base32 custom alphabet (1 byte)[m
[31m---- config[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-ii======[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: base32 custom alphabet (1 byte) - not in-place editing[m
[31m---- config[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a $a;[m
[31m-        set_decode_base32 $b $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-ii======[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: base32 custom alphabet (hello world)[m
[31m---- config[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!\nhiya"';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmmorfy1w2ng[m
[31m-"hello, world![m
[31m-hiya"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: base32 custom alphabet (0 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmng[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: base32 custom alphabet (6 bytes padded)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"a';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmngqi======[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: base32 custom alphabet (4 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"ab';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmngqjve====[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: base32 custom alphabet (3 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abc';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmngqjvkk===[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: base32 custom alphabet (1 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abcd';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmngqjvkk3e=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: use set_base32_alphabet in location[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    location /bar {[m
[31m-        set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789";[m
[31m-        set $a '"hello, world!"abcd';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmngqjvkk3e=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: one byte less in set_base32_alphabet[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    location /bar {[m
[31m-        set_base32_alphabet "efghijklmnopqrstuvwxyz012345678";[m
[31m-        set $a '"hello, world!"abcd?\/.;';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmngqjvkk3e=[m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? "set_base32_alphabet" directive takes an alphabet of 31 bytes but 32 expected/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: one byte more in set_base32_alphabet[m
[31m---- config[m
[31m-    set_base32_padding on;[m
[31m-    location /bar {[m
[31m-        set_base32_alphabet "efghijklmnopqrstuvwxyz0123456789A";[m
[31m-        set $a '"hello, world!"abcd?\/.;';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-inyko5hqr60ge75tsn0kmmngqjvkk3e=[m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? "set_base32_alphabet" directive takes an alphabet of 33 bytes but 32 expected/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base32_no_padding.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base32_no_padding.t[m
[1mdeleted file mode 100644[m
[1mindex 95fbafc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base32_no_padding.t[m
[1m+++ /dev/null[m
[36m@@ -1,532 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: base32 (5 bytes)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a 'abcde';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-c5h66p35[m
[31m-abcde[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: base32 (1 byte)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-44[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: base32 (1 byte) - not in-place editing[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_base32_padding off;[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a $a;[m
[31m-        set_decode_base32 $b $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-44[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: base32 (hello world)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!\nhiya"';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m6888ad1knio92[m
[31m-"hello, world![m
[31m-hiya"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: base32 (0 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: base32 (6 bytes padded)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"a';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892c4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: base32 (4 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"ab';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892c5h0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: base32 (3 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abc';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892c5h66[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: base32 (1 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abcd';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-49k6ar3cdsm20trfe9m68892c5h66p0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: base32 standard alphabet (5 bytes)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a 'abcde';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-MFRGGZDF[m
[31m-abcde[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: base32 standard alphabet (1 byte)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EE[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: base32 standard alphabet (1 byte) - not in-place editing[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_base32_padding off;[m
[31m-        set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a $a;[m
[31m-        set_decode_base32 $b $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EE[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: base32 standard alphabet (hello world)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!\nhiya"';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIIKNBUXSYJC[m
[31m-"hello, world![m
[31m-hiya"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: base32 standard alphabet (0 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJC[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: base32 standard alphabet (6 bytes padded)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"a';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJCME[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: base32 standard alphabet (4 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"ab';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJCMFRA[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: base32 standard alphabet (3 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abc';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJCMFRGG[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: base32 standard alphabet (1 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abcd';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-EJUGK3DMN4WCA53POJWGIIJCMFRGGZA[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: base32 custom alphabet (5 bytes)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-    location /bar {[m
[31m-        set $a 'abcde';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-ohtii2fh[m
[31m-abcde[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: base32 custom alphabet (1 byte)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-    location /bar {[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-gg[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: base32 custom alphabet (1 byte) - not in-place editing[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_base32_padding off;[m
[31m-        set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-        set $a '!';[m
[31m-        set_encode_base32 $a $a;[m
[31m-        set_decode_base32 $b $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-gg[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: base32 custom alphabet (hello world)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!\nhiya"';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-glwim4fop5yec64rqlyikkkmpdwzu1le[m
[31m-"hello, world![m
[31m-hiya"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: base32 custom alphabet (0 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-glwim4fop5yec64rqlyikkle[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: base32 custom alphabet (6 bytes padded)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"a';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-glwim4fop5yec64rqlyikkleog[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: base32 custom alphabet (4 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"ab';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-glwim4fop5yec64rqlyikkleohtc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: base32 custom alphabet (3 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abc';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-glwim4fop5yec64rqlyikkleohtii[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: base32 custom alphabet (1 bytes left)[m
[31m---- config[m
[31m-    set_base32_padding off;[m
[31m-    set_base32_alphabet "cdefghijklmnopqrstuvwxyz12345678";[m
[31m-    location /bar {[m
[31m-        set $a '"hello, world!"abcd';[m
[31m-        set_encode_base32 $a;[m
[31m-[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-glwim4fop5yec64rqlyikkleohtii2c[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: deprecated set_misc_base32_padding[m
[31m---- config[m
[31m-    set_misc_base32_padding off;[m
[31m-    location /bar {[m
[31m-        set $a 'abcde';[m
[31m-        set_encode_base32 $a;[m
[31m-        set $b $a;[m
[31m-        set_decode_base32 $b;[m
[31m-[m
[31m-        echo $a;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-c5h66p35[m
[31m-abcde[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base64.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base64.t[m
[1mdeleted file mode 100644[m
[1mindex f816aa3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/base64.t[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: base64 encode[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_encode_base64 $out "abcde";[m
[31m-        echo $out;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-YWJjZGU=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: base64 decode[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_decode_base64 $out "YWJjZGU=";[m
[31m-        echo $out;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-abcde[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/default-value.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/default-value.t[m
[1mdeleted file mode 100644[m
[1mindex 53c2a59..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/default-value.t[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set if empty[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $a 32;[m
[31m-        set_if_empty $a 56;[m
[31m-        echo $a;[m
[31m-[m
[31m-        set_if_empty $b 72;[m
[31m-        echo $b;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-32[m
[31m-72[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set if empty[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $bar $arg_bar;[m
[31m-        set_if_empty $bar 15;[m
[31m-        echo $bar;[m
[31m-[m
[31m-        set $bah $arg_bah;[m
[31m-        set_if_empty $bah 25;[m
[31m-        echo $bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?bar=71[m
[31m---- response_body[m
[31m-71[m
[31m-25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set if empty[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $bar $arg_bar;[m
[31m-        set_if_empty $bar 15;[m
[31m-        echo $bar;[m
[31m-[m
[31m-        set $bah $arg_bah;[m
[31m-        set_if_empty $bah 25;[m
[31m-        echo $bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?bar=[m
[31m---- response_body[m
[31m-15[m
[31m-25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set if empty (using arg_xxx directly)[m
[31m-buggy?[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_if_empty $arg_bar 15;[m
[31m-        echo $arg_bar;[m
[31m-[m
[31m-        set_if_empty $arg_bah 25;[m
[31m-        echo $arg_bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?bar=71[m
[31m---- response_body[m
[31m-71[m
[31m-25[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/escape-uri.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/escape-uri.t[m
[1mdeleted file mode 100644[m
[1mindex f0e21f4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/escape-uri.t[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set escape uri[m
[31m---- config[m
[31m-	location /foo {[m
[31m-		set $foo "hello world";[m
[31m-		set_escape_uri $foo $foo;[m
[31m-		echo $foo;[m
[31m-	}[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-hello%20world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set escape uri(in-place)[m
[31m---- config[m
[31m-	location /foo {[m
[31m-		set $foo "hello world";[m
[31m-		set_escape_uri $foo;[m
[31m-		echo $foo;[m
[31m-	}[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-hello%20world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: blank string[m
[31m---- config[m
[31m-	location /foo {[m
[31m-		set $foo "";[m
[31m-		set_escape_uri $foo;[m
[31m-		echo $foo;[m
[31m-	}[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: blank string(in place)[m
[31m---- config[m
[31m-	location /foo {[m
[31m-		set $foo "";[m
[31m-		set_escape_uri $foo;[m
[31m-		echo $foo;[m
[31m-	}[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: eacape chinese character[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "你好";[m
[31m-        set_escape_uri $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-%E4%BD%A0%E5%A5%BD[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: escape long string[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "法规及饿哦物权法家哦低价非结果哦我二期界  附件饿哦武器  积分饿哦为契机佛i 该软件哦气氛  份额叫我起 国无二君哦气氛为界非ieowq结果哦而完全附件  份额叫我iqfjeowiqgjeriowqfjpdjfosadijfoiasdjf 附件饿哦武器界 份额叫我起界份额叫我起哦ifjefejwioq附件饿哦武器界非风格及去哦根据份额叫我起哦界份额为契机哦乳房阿基完全哦igqtewqo个人就去哦ieorjwrewqoi日哦额外起今天诶哦我亲热为特务前日哦我而哥特完全哦iijrtewmkdf 服务鄂潜江哦irewq";[m
[31m-        set_escape_uri $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-%E6%B3%95%E8%A7%84%E5%8F%8A%E9%A5%BF%E5%93%A6%E7%89%A9%E6%9D%83%E6%B3%95%E5%AE%B6%E5%93%A6%E4%BD%8E%E4%BB%B7%E9%9D%9E%E7%BB%93%E6%9E%9C%E5%93%A6%E6%88%91%E4%BA%8C%E6%9C%9F%E7%95%8C%20%20%E9%99%84%E4%BB%B6%E9%A5%BF%E5%93%A6%E6%AD%A6%E5%99%A8%20%20%E7%A7%AF%E5%88%86%E9%A5%BF%E5%93%A6%E4%B8%BA%E5%A5%91%E6%9C%BA%E4%BD%9Bi%20%E8%AF%A5%E8%BD%AF%E4%BB%B6%E5%93%A6%E6%B0%94%E6%B0%9B%20%20%E4%BB%BD%E9%A2%9D%E5%8F%AB%E6%88%91%E8%B5%B7%20%E5%9B%BD%E6%97%A0%E4%BA%8C%E5%90%9B%E5%93%A6%E6%B0%94%E6%B0%9B%E4%B8%BA%E7%95%8C%E9%9D%9Eieowq%E7%BB%93%E6%9E%9C%E5%93%A6%E8%80%8C%E5%AE%8C%E5%85%A8%E9%99%84%E4%BB%B6%20%20%E4%BB%BD%E9%A2%9D%E5%8F%AB%E6%88%91iqfjeowiqgjeriowqfjpdjfosadijfoiasdjf%20%E9%99%84%E4%BB%B6%E9%A5%BF%E5%93%A6%E6%AD%A6%E5%99%A8%E7%95%8C%20%E4%BB%BD%E9%A2%9D%E5%8F%AB%E6%88%91%E8%B5%B7%E7%95%8C%E4%BB%BD%E9%A2%9D%E5%8F%AB%E6%88%91%E8%B5%B7%E5%93%A6ifjefejwioq%E9%99%84%E4%BB%B6%E9%A5%BF%E5%93%A6%E6%AD%A6%E5%99%A8%E7%95%8C%E9%9D%9E%E9%A3%8E%E6%A0%BC%E5%8F%8A%E5%8E%BB%E5%93%A6%E6%A0%B9%E6%8D%AE%E4%BB%BD%E9%A2%9D%E5%8F%AB%E6%88%91%E8%B5%B7%E5%93%A6%E7%95%8C%E4%BB%BD%E9%A2%9D%E4%B8%BA%E5%A5%91%E6%9C%BA%E5%93%A6%E4%B9%B3%E6%88%BF%E9%98%BF%E5%9F%BA%E5%AE%8C%E5%85%A8%E5%93%A6igqtewqo%E4%B8%AA%E4%BA%BA%E5%B0%B1%E5%8E%BB%E5%93%A6ieorjwrewqoi%E6%97%A5%E5%93%A6%E9%A2%9D%E5%A4%96%E8%B5%B7%E4%BB%8A%E5%A4%A9%E8%AF%B6%E5%93%A6%E6%88%91%E4%BA%B2%E7%83%AD%E4%B8%BA%E7%89%B9%E5%8A%A1%E5%89%8D%E6%97%A5%E5%93%A6%E6%88%91%E8%80%8C%E5%93%A5%E7%89%B9%E5%AE%8C%E5%85%A8%E5%93%A6iijrtewmkdf%20%E6%9C%8D%E5%8A%A1%E9%84%82%E6%BD%9C%E6%B1%9F%E5%93%A6irewq[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: no need to escape[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo 'welcometotheworldofnginx';[m
[31m-        set_escape_uri $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-welcometotheworldofnginx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: fixed ngx_escape_uri issues: + and / should also be escaped[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo '+/=';[m
[31m-        set_escape_uri $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-%2B%2F%3D[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: fixed ngx_escape_uri issues: / {} : & [] and more[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo '"a/b={}:<>;&[]\\^';[m
[31m-        set_escape_uri $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-%22a%2Fb%3D%7B%7D%3A%3C%3E%3B%26%5B%5D%5C%5E[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/formatted-time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/formatted-time.t[m
[1mdeleted file mode 100644[m
[1mindex dcc6535..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/formatted-time.t[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-use POSIX qw(strftime);[m
[31m-[m
[31m-my $fmt="%a %b %e %H:%M:%S %Y";[m
[31m-[m
[31m-our $str_local = (strftime $fmt, localtime  time()).'|'.(strftime $fmt, localtime time()+1).'|'.(strftime $fmt, localtime time()+2);[m
[31m-[m
[31m-our $str_gmt =  (strftime $fmt, gmtime time()).'|'.(strftime $fmt, gmtime time()+1).'|'.(strftime $fmt, gmtime time()+2);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-log_level('warn');[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: local time format[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_formatted_local_time $today "%a %b %e %H:%M:%S %Y";[m
[31m-        echo $today;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body_like eval: $main::str_local[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: GMT time format[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_formatted_gmt_time $today "%a %b %e %H:%M:%S %Y";[m
[31m-        echo $today;[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body_like eval: $main::str_gmt[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set_formatted_gmt_time (empty formatter)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_formatted_gmt_time $today "";[m
[31m-        echo "[$today]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set_formatted_local_time (empty formatter)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_formatted_local_time $today "";[m
[31m-        echo "[$today]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set_formatted_local_time (constant formatter)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_formatted_local_time $today "hello world";[m
[31m-        echo "[$today]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-[hello world][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hash.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hash.t[m
[1mdeleted file mode 100644[m
[1mindex cc618ca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hash.t[m
[1m+++ /dev/null[m
[36m@@ -1,95 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sha1 hello (copy)[m
[31m---- config[m
[31m-    location /sha1 {[m
[31m-        set_sha1 $a hello;[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sha1 hello (in-place)[m
[31m---- config[m
[31m-    location /sha1 {[m
[31m-        set $a hello;[m
[31m-        set_sha1 $a;[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sha1 (empty)[m
[31m---- config[m
[31m-    location /sha1 {[m
[31m-        set_sha1 $a "";[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-da39a3ee5e6b4b0d3255bfef95601890afd80709[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: md5 hello (copy)[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        set_md5 $a hello;[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: md5 hello (in-place)[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        set $a hello;[m
[31m-        set_md5 $a;[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: md5 (empty)[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        set_md5 $a "";[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hashed-upstream.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hashed-upstream.t[m
[1mdeleted file mode 100644[m
[1mindex 2c0f01d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hashed-upstream.t[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-#master_on();[m
[31m-#log_level("warn");[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set hashed upstream[m
[31m-buggy?[m
[31m---- config[m
[31m-    upstream_list universe moon sun earth;[m
[31m-    location /foo {[m
[31m-        set_hashed_upstream $backend universe $arg_id;[m
[31m-        echo $backend;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location_async /foo;[m
[31m-        echo_location_async /foo?id=hello;[m
[31m-        echo_location_async /foo?id=world;[m
[31m-        echo_location_async /foo?id=larry;[m
[31m-        echo_location_async /foo?id=audreyt;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-moon[m
[31m-sun[m
[31m-moon[m
[31m-earth[m
[31m-earth[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set hashed upstream (use var for upstream_list name)[m
[31m-buggy?[m
[31m---- config[m
[31m-    upstream_list universe moon sun earth;[m
[31m-    location /foo {[m
[31m-        set $list_name universe;[m
[31m-        set_hashed_upstream $backend $list_name $arg_id;[m
[31m-        echo $backend;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location_async /foo;[m
[31m-        echo_location_async /foo?id=hello;[m
[31m-        echo_location_async /foo?id=world;[m
[31m-        echo_location_async /foo?id=larry;[m
[31m-        echo_location_async /foo?id=audreyt;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-moon[m
[31m-sun[m
[31m-moon[m
[31m-earth[m
[31m-earth[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hex.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hex.t[m
[1mdeleted file mode 100644[m
[1mindex 78b302e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hex.t[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hex encode[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_encode_hex $out "abcde";[m
[31m-        echo $out;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-6162636465[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: hex decode[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_decode_hex $out "6162636465";[m
[31m-        echo $out;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-abcde[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: hex encode (chinese)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $raw "章亦春";[m
[31m-        set_encode_hex $digest $raw;[m
[31m-        set_decode_hex $hex $digest;[m
[31m-        echo $digest;[m
[31m-        echo $hex;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-e7aba0e4baa6e698a5[m
[31m-章亦春[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hmac.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hmac.t[m
[1mdeleted file mode 100644[m
[1mindex 4e0b57f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/hmac.t[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hmac[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $secret 'thisisverysecretstuff';[m
[31m-        set $string_to_sign 'some string we want to sign';[m
[31m-        set_hmac_sha1 $signature $secret $string_to_sign;[m
[31m-        set_encode_base64 $signature $signature;[m
[31m-        echo $signature;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-R/pvxzHC4NLtj7S+kXFg/NePTmk=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: hmac empty vars[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $secret '';[m
[31m-        set $string_to_sign '';[m
[31m-        set_hmac_sha1 $signature $secret $string_to_sign;[m
[31m-        set_encode_base64 $signature $signature;[m
[31m-        echo $signature;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-+9sdGxiqbAgyS31ktx+3Y3BpDh0=[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/local-today.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/local-today.t[m
[1mdeleted file mode 100644[m
[1mindex 6dd7e1f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/local-today.t[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-my ($sec, $min, $hour, $mday, $mon, $year) = localtime;[m
[31m-[m
[31m-our $str = sprintf("%04d-%02d-%02d\n", $year + 1900, $mon + 1, $mday);[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_local_today $today;[m
[31m-        echo $today;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body eval: $main::str[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/quote-json.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/quote-json.t[m
[1mdeleted file mode 100644[m
[1mindex 44b7218..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/quote-json.t[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set quote json value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "hello\n\r'\"\\";[m
[31m-        set_quote_json_str $foo $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-"hello\n\r'\"\\"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set quote json value (in place)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "hello\n\r'\"\\";[m
[31m-        set_quote_json_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-"hello\n\r'\"\\"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set quote empty json value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "";[m
[31m-        set_quote_json_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-null[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set quote null json value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_quote_json_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-null[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/quote-sql.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/quote-sql.t[m
[1mdeleted file mode 100644[m
[1mindex 88a95f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/quote-sql.t[m
[1m+++ /dev/null[m
[36m@@ -1,182 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set quote sql value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "hello\n\r'\"\\";[m
[31m-        set_quote_sql_str $foo $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set quote sql value (in place)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "hello\n\r'\"\\";[m
[31m-        set_quote_sql_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set quote empty sql value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "";[m
[31m-        set_quote_sql_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-''[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set quote null sql value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_quote_sql_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-''[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set quote null pgsql value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_quote_pgsql_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-''[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set quote pgsql value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "hello\n\r'\"\\";[m
[31m-        set_quote_pgsql_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-E'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set quote pgsql valid utf8 value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "你好";[m
[31m-        set_quote_pgsql_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-E'你好'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set quote pgsql invalid utf8 value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "你好";[m
[31m-        set_iconv $foo $foo from=utf-8 to=gbk;[m
[31m-        set_quote_pgsql_str $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-E'\\304\\343\\272\\303'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: \0 for mysql[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_unescape_uri $foo $arg_a;[m
[31m-        set_quote_sql_str $foo $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=a%00b%00[m
[31m---- response_body[m
[31m-'a\0b\0'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: \b for mysql[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_unescape_uri $foo $arg_a;[m
[31m-        set_quote_sql_str $foo $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=a%08b%08[m
[31m---- response_body[m
[31m-'a\bb\b'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: \t for mysql[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_unescape_uri $foo $arg_a;[m
[31m-        set_quote_sql_str $foo $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=a%09b%09[m
[31m---- response_body[m
[31m-'a\tb\t'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: \Z for mysql[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_unescape_uri $foo $arg_a;[m
[31m-        set_quote_sql_str $foo $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=a%1ab%1a[m
[31m---- response_body[m
[31m-'a\Zb\Z'[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/rand.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/rand.t[m
[1mdeleted file mode 100644[m
[1mindex 6becc18..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/rand.t[m
[1m+++ /dev/null[m
[36m@@ -1,169 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(100);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from 5;[m
[31m-        set $to 7;[m
[31m-        set_random $res $from $to;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body_like: [5-7][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (two digits)[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from 35;[m
[31m-        set $to 37;[m
[31m-        set_random $res $from $to;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body_like: 3[5-7][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity (two digits, from > to)[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from 37;[m
[31m-        set $to 35;[m
[31m-        set_random $res $from $to;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body_like: 3[5-7][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sanity (two digits, from == to)[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from 117;[m
[31m-        set $to 117;[m
[31m-        set_random $res $from $to;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body[m
[31m-117[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: negative number not allowed in from arg[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from -2;[m
[31m-        set $to 4;[m
[31m-        set_random $res $from $to;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: negative number not allowed in to arg[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from 2;[m
[31m-        set $to -4;[m
[31m-        set_random $res $from $to;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty string not allowed in from arg[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from '';[m
[31m-        set $to 4;[m
[31m-        set_random $res $from $to;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty string not allowed in to arg[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from 2;[m
[31m-        set $to '';[m
[31m-        set_random $res $from $to;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: wrong number of arguments[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set $from 2;[m
[31m-        set_random $res $from;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: zero is fine[m
[31m---- config[m
[31m-    location /rand {[m
[31m-        set_random $res 0 0;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /rand[m
[31m---- response_body[m
[31m-0[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/rotate.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/rotate.t[m
[1mdeleted file mode 100644[m
[1mindex cc1bdb4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/rotate.t[m
[1m+++ /dev/null[m
[36m@@ -1,271 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a 1;[m
[31m-        set_rotate $a 1 3;[m
[31m-[m
[31m-        set $b 2;[m
[31m-        set_rotate $b 1 3;[m
[31m-[m
[31m-        set $c 3;[m
[31m-        set_rotate $c 1 3;[m
[31m-[m
[31m-        set $d 0;[m
[31m-        set_rotate $d 1 3;[m
[31m-[m
[31m-        set $e 1;[m
[31m-        set_rotate $e 3 5;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-        echo "b = $b";[m
[31m-        echo "c = $c";[m
[31m-        echo "d = $d";[m
[31m-        echo "e = $e";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-a = 2[m
[31m-b = 3[m
[31m-c = 1[m
[31m-d = 1[m
[31m-e = 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bad current value[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a abc;[m
[31m-        set_rotate $a 1 3;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body_like: ^a = [12]$[m
[31m---- error_log[m
[31m-set_rotate: bad current value: "abc"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: bad "from" value[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a 2;[m
[31m-        set_rotate $a abc 3;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-set_rotate: bad "from" argument value: "abc"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad "to" argument value[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a 2;[m
[31m-        set_rotate $a 1 abc;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-set_rotate: bad "to" argument value: "abc"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: when no current value is given[m
[31m---- config[m
[31m-    location /incr {[m
[31m-        set_rotate $a 1 3;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-a = 1[m
[31m-a = 2[m
[31m-a = 3[m
[31m-a = 1[m
[31m-a = 2[m
[31m-a = 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: when no current value is given (starting from 0)[m
[31m---- config[m
[31m-    location /incr {[m
[31m-        set_rotate $a 0 2;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-a = 0[m
[31m-a = 1[m
[31m-a = 2[m
[31m-a = 0[m
[31m-a = 1[m
[31m-a = 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: when a non-integer string value is given[m
[31m---- config[m
[31m-    location /incr {[m
[31m-        set $a "hello";[m
[31m-        set_rotate $a 0 2;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-a = 0[m
[31m-a = 1[m
[31m-a = 2[m
[31m-a = 0[m
[31m-a = 1[m
[31m-a = 2[m
[31m---- error_log[m
[31m-set_rotate: bad current value: "hello"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: when an empty string value is given[m
[31m---- config[m
[31m-    location /incr {[m
[31m-        set $a "";[m
[31m-        set_rotate $a 0 2;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-a = 0[m
[31m-a = 1[m
[31m-a = 2[m
[31m-a = 0[m
[31m-a = 1[m
[31m-a = 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: value persistence is per-location[m
[31m---- config[m
[31m-    location /incr {[m
[31m-        set_rotate $a 0 2;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m-[m
[31m-    location /incr2 {[m
[31m-        set_rotate $a 0 2;[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr2;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr2;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr2;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr2;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr2;[m
[31m-        echo_location /incr;[m
[31m-        echo_location /incr2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-a = 0[m
[31m-a = 0[m
[31m-a = 1[m
[31m-a = 1[m
[31m-a = 2[m
[31m-a = 2[m
[31m-a = 0[m
[31m-a = 0[m
[31m-a = 1[m
[31m-a = 1[m
[31m-a = 2[m
[31m-a = 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/secure-random.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/secure-random.t[m
[1mdeleted file mode 100644[m
[1mindex 06df78d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/secure-random.t[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: a 32-character alphanum[m
[31m---- config[m
[31m-    location /alphanum {[m
[31m-        set_secure_random_alphanum $res 32;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /alphanum[m
[31m---- response_body_like: ^[a-zA-Z0-9]{32}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: a 16-character alphanum[m
[31m---- config[m
[31m-    location /alphanum {[m
[31m-        set_secure_random_alphanum $res 16;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /alphanum[m
[31m---- response_body_like: ^[a-zA-Z0-9]{16}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: a 1-character alphanum[m
[31m---- config[m
[31m-    location /alphanum {[m
[31m-        set_secure_random_alphanum $res 1;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /alphanum[m
[31m---- response_body_like: ^[a-zA-Z0-9]{1}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: length less than <= 0 should fail[m
[31m---- config[m
[31m-    location /alphanum {[m
[31m-        set_secure_random_alphanum $res 0;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /alphanum[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: length less than <= 0 should fail[m
[31m---- config[m
[31m-    location /alphanum {[m
[31m-        set_secure_random_alphanum $res -4;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /alphanum[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: non-numeric length should fail[m
[31m---- config[m
[31m-    location /alphanum {[m
[31m-        set_secure_random_alphanum $res bob;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /alphanum[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: a 16-character lcalpha[m
[31m---- config[m
[31m-    location /lcalpha {[m
[31m-        set_secure_random_lcalpha $res 16;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lcalpha[m
[31m---- response_body_like: ^[a-z]{16}$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/unescape-uri.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/unescape-uri.t[m
[1mdeleted file mode 100644[m
[1mindex daf36f9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/t/unescape-uri.t[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set unescape uri[m
[31m-buggy?[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "hello%20world";[m
[31m-        set_unescape_uri $foo $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set unescape uri (in-place)[m
[31m-buggy?[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo "hello%20world";[m
[31m-        set_unescape_uri $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unescape '+' to ' '[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $a 'a+b';[m
[31m-        set_unescape_uri $a;[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bar[m
[31m---- response_body[m
[31m-a b[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 7519f60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-version=$1[m
[31m-force=$2[m
[31m-[m
[31m-    #--with-cc="gcc46" \[m
[31m-    #--with-ld-opt="-rdynamic" \[m
[31m-    #--with-mail \[m
[31m-    #--with-mail_ssl_module \[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-    --with-http_ssl_module \[m
[31m-    --without-mail_pop3_module \[m
[31m-    --without-mail_imap_module \[m
[31m-    --without-mail_smtp_module \[m
[31m-    --without-http_upstream_ip_hash_module \[m
[31m-    --without-http_empty_gif_module \[m
[31m-    --without-http_memcached_module \[m
[31m-    --without-http_referer_module \[m
[31m-    --without-http_autoindex_module \[m
[31m-    --without-http_auth_basic_module \[m
[31m-    --without-http_userid_module \[m
[31m-    --add-module=$root/../echo-nginx-module \[m
[31m-    --add-module=$root/../ndk-nginx-module \[m
[31m-    --add-module=$root/../iconv-nginx-module \[m
[31m-    --add-module=$root $opts \[m
[31m-    --with-debug \[m
[31m-  || exit 1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 3bdd958..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/set-misc-nginx-module-0.30/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_http_init_request[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_location[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   /lib/libc-2.12.so[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:CRYPTO_malloc[m
[31m-   fun:lh_insert[m
[31m-   obj:/lib64/libcrypto.so.0.9.8[m
[31m-   fun:ERR_load_strings[m
[31m-   fun:ngx_ssl_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:CRYPTO_malloc[m
[31m-   fun:lh_insert[m
[31m-   obj:/lib64/libcrypto.so.0.9.8[m
[31m-   fun:ERR_load_strings[m
[31m-   fun:ERR_load_OCSP_strings[m
[31m-   fun:ERR_load_crypto_strings[m
[31m-   fun:SSL_load_error_strings[m
[31m-   fun:ngx_ssl_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 5e0cb97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[78][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/util.h[m
[31m-src/util.c[m
[31m-src/processor.h[m
[31m-src/processor.c[m
[31m-src/rds.h[m
[31m-src/utils.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-src/var.[ch][m
[31m-util/bench[m
[31m-*.html[m
[31m-trace.out*[m
[31m-try.sh[m
[31m-build9[m
[31m-src/fetch.[ch][m
[31m-src/store.[ch][m
[31m-t/servroot/[m
[31m-headers.[ch][m
[31m-buildroot/[m
[31m-build1[0-9][m
[31m-go[m
[31m-all[m
[31m-analyze[m
[31m-addr2line[m
[31m-*.plist[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/Changes b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/Changes[m
[1mdeleted file mode 100644[m
[1mindex 5f257fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/Changes[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-v0.12 - 11 July 2011[m
[31m-* now we properly support fetch/store subrequests with internal redirection in them. main requests with internal redirection will still not be stored into the cache if there is a cache miss. thanks Liseen Wan for reporting it.[m
[31m-* fixed spots that trigger the unused-but-set-variable warning by gcc 4.6.[m
[31m-* added srcache_store_skip and srcache_fetch_skip directives to skip cache fetching or storing based on variables that are set and not empty nor 0. thanks Andre. Examples of using Lua to set $nocache to avoid storing URIs that contain /tmp:[m
[31m-    set_by_lua $nocache '[m
[31m-    	if string.match(ngx.var.request_uri, "/tmp") then[m
[31m-    	  return "true"[m
[31m-    	else[m
[31m-    	  return ""[m
[31m-    	end';[m
[31m-[m
[31m-    srcache_store_skip $nocache;[m
[31m-* added new directive srcache_store_max_size. thanks Andre.[m
[31m-* made our filter optimization work with nginx HUP by clearing the ngx_http_srcache_used flag at nginx pre-config callback. thanks Marcus Clyne.[m
[31m-* now we skip NULL chains in our output filters and also removed the SUBREQUEST_IN_MEMORY flag for our srcache_store subrequests because it will cause mysterious hanging issues when memcached returns CLIENT_ERROR for "get".[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/config[m
[1mdeleted file mode 100644[m
[1mindex 752043c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/config[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_srcache_filter_module[m
[31m-[m
[31m-HTTP_SRCACHE_FILTER_SRCS="                                                  \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_filter_module.c \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_util.c          \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_var.c           \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_store.c         \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_fetch.c         \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_headers.c       \[m
[31m-                        "[m
[31m-[m
[31m-HTTP_SRCACHE_FILTER_DEPS="                                                  \[m
[31m-                        $ngx_addon_dir/src/ddebug.h                         \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_filter_module.h \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_util.h          \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_var.h           \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_fetch.h         \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_store.h         \[m
[31m-                        $ngx_addon_dir/src/ngx_http_srcache_headers.h       \[m
[31m-                        "[m
[31m-[m
[31m-# nginx won't have HTTP_POSTPONE_FILTER_MODULE & HTTP_POSTPONE_FILTER_SRCS[m
[31m-# defined since 1.9.11[m
[31m-if test -z "$HTTP_POSTPONE_FILTER_MODULE"; then[m
[31m-    HTTP_POSTPONE_FILTER_MODULE=ngx_http_postpone_filter_module[m
[31m-    HTTP_POSTPONE_FILTER_SRCS=src/http/ngx_http_postpone_filter_module.c[m
[31m-fi[m
[31m-[m
[31m-# This module depends upon the postpone filter being activated[m
[31m-if [ $HTTP_POSTPONE != YES ]; then[m
[31m-    HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_POSTPONE_FILTER_MODULE"[m
[31m-    HTTP_SRCS="$HTTP_SRCS $HTTP_POSTPONE_FILTER_SRCS"[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-if [ -n "$ngx_module_link" ]; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_srcs="$HTTP_SRCACHE_FILTER_SRCS"[m
[31m-    ngx_module_deps="$HTTP_SRCACHE_FILTER_DEPS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_SRCACHE_FILTER_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_SRCACHE_FILTER_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex a2c6808..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,124 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "srcache *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-[m
[31m-#       if defined(nginx_version) && nginx_version >= 8011[m
[31m-#           define dd_main_req_count r->main->count[m
[31m-#       else[m
[31m-#           define dd_main_req_count 0[m
[31m-#       endif[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd_enter_helper(ngx_http_request_t *r, const char *func) {[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, ">enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            (int) dd_main_req_count, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.c[m
[1mdeleted file mode 100644[m
[1mindex 216253d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.c[m
[1m+++ /dev/null[m
[36m@@ -1,470 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_fetch.h"[m
[31m-#include "ngx_http_srcache_store.h"[m
[31m-#include "ngx_http_srcache_util.h"[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_srcache_fetch_subrequest(ngx_http_request_t *r,[m
[31m-        ngx_http_srcache_loc_conf_t *conf, ngx_http_srcache_ctx_t *ctx);[m
[31m-static void ngx_http_srcache_post_read_body(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_access_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                       skip;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_http_srcache_loc_conf_t    *conf;[m
[31m-    ngx_http_srcache_main_conf_t   *smcf;[m
[31m-    ngx_http_srcache_ctx_t         *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    size_t                          len;[m
[31m-    unsigned                        no_store;[m
[31m-[m
[31m-    /* access phase handlers are skipped in subrequests,[m
[31m-     * so the current request must be a main request */[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (conf->fetch == NULL && conf->store == NULL) {[m
[31m-        dd("bypass: %.*s", (int) r->uri.len, r->uri.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    dd("store defined? %p", conf->store);[m
[31m-[m
[31m-    dd("req method: %lu", (unsigned long) r->method);[m
[31m-    dd("cache methods: %lu", (unsigned long) conf->cache_methods);[m
[31m-[m
[31m-    if (!(r->method & conf->cache_methods)) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_fetch and srcache_store skipped due to request "[m
[31m-                       "method %V", &r->method_name);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->req_cache_control[m
[31m-        && ngx_http_srcache_request_no_cache(r, &no_store) == NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_fetch skipped due to request headers "[m
[31m-                       "\"Cache-Control: no-cache\" or \"Pragma: no-cache\"");[m
[31m-[m
[31m-        if (!no_store) {[m
[31m-            /* register a ctx to give a chance to srcache_store to run */[m
[31m-[m
[31m-            ctx = ngx_pcalloc(r->pool,[m
[31m-                              sizeof(ngx_http_srcache_filter_module));[m
[31m-[m
[31m-            if (ctx == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_set_ctx(r, ctx, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "srcache_store skipped due to request header "[m
[31m-                           "\"Cache-Control: no-store\"");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->fetch_skip != NULL[m
[31m-        && ngx_http_complex_value(r, conf->fetch_skip, &skip) == NGX_OK[m
[31m-        && skip.len[m
[31m-        && (skip.len != 1 || skip.data[0] != '0'))[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_fetch skipped due to the true value fed into "[m
[31m-                       "srcache_fetch_skip: \"%V\"", &skip);[m
[31m-[m
[31m-        /* register a ctx to give a chance to srcache_store to run */[m
[31m-[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_srcache_filter_module));[m
[31m-[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (ctx != NULL) {[m
[31m-        /*[m
[31m-        if (ctx->fetch_error) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-        */[m
[31m-[m
[31m-        if (ctx->waiting_subrequest) {[m
[31m-            dd("waiting subrequest");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->waiting_request_body) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->request_body_done == 1) {[m
[31m-            ctx->request_body_done = 0;[m
[31m-            goto do_fetch_subrequest;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->request_done) {[m
[31m-            dd("request done");[m
[31m-[m
[31m-            if (ngx_http_post_request(r, NULL) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (!ctx->from_cache) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            dd("sending header");[m
[31m-[m
[31m-            if (ctx->body_from_cache) {[m
[31m-                len = 0;[m
[31m-[m
[31m-                for (cl = ctx->body_from_cache; cl->next; cl = cl->next) {[m
[31m-                    len += ngx_buf_size(cl->buf);[m
[31m-                }[m
[31m-[m
[31m-                len += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-                cl->buf->last_buf = 1;[m
[31m-[m
[31m-                r->headers_out.content_length_n = len;[m
[31m-[m
[31m-                rc = ngx_http_send_header(r);[m
[31m-[m
[31m-                dd("srcache fetch header returned %d", (int) rc);[m
[31m-[m
[31m-                if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-#if 1[m
[31m-                if (r->header_only) {[m
[31m-                    return NGX_HTTP_OK;[m
[31m-                }[m
[31m-#endif[m
[31m-[m
[31m-                if (!r->filter_finalize) {[m
[31m-                    rc = ngx_http_output_filter(r, ctx->body_from_cache);[m
[31m-                    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                dd("sent body from cache: %d", (int) rc);[m
[31m-                dd("finalize from here...");[m
[31m-[m
[31m-                ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-                /* dd("r->main->count (post): %d", (int) r->main->count); */[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_srcache_filter_module));[m
[31m-[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_srcache_filter_module);[m
[31m-    }[m
[31m-[m
[31m-    smcf = ngx_http_get_module_main_conf(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (!smcf->postponed_to_access_phase_end) {[m
[31m-        ngx_http_core_main_conf_t       *cmcf;[m
[31m-        ngx_http_phase_handler_t         tmp;[m
[31m-        ngx_http_phase_handler_t        *ph;[m
[31m-        ngx_http_phase_handler_t        *cur_ph;[m
[31m-        ngx_http_phase_handler_t        *last_ph;[m
[31m-[m
[31m-        smcf->postponed_to_access_phase_end = 1;[m
[31m-[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ph = cmcf->phase_engine.handlers;[m
[31m-        cur_ph = &ph[r->phase_handler];[m
[31m-[m
[31m-        /* we should skip the post_access phase handler here too */[m
[31m-        last_ph = &ph[cur_ph->next - 2];[m
[31m-[m
[31m-        if (cur_ph < last_ph) {[m
[31m-            dd("swaping the contents of cur_ph and last_ph...");[m
[31m-[m
[31m-            tmp = *cur_ph;[m
[31m-[m
[31m-            memmove(cur_ph, cur_ph + 1,[m
[31m-                    (last_ph - cur_ph) * sizeof (ngx_http_phase_handler_t));[m
[31m-[m
[31m-            *last_ph = tmp;[m
[31m-[m
[31m-            r->phase_handler--; /* redo the current ph */[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->fetch == NULL) {[m
[31m-        dd("fetch is not defined");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    dd("running phase handler...");[m
[31m-[m
[31m-    if (!r->request_body) {[m
[31m-        dd("reading request body: ctx = %p", ctx);[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r,[m
[31m-                                               ngx_http_srcache_post_read_body);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-#if (nginx_version < 1002006)                                               \[m
[31m-    || (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            ctx->waiting_request_body = 1;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_OK */[m
[31m-    }[m
[31m-[m
[31m-do_fetch_subrequest:[m
[31m-[m
[31m-    /* issue a subrequest to fetch cached stuff (if any) */[m
[31m-[m
[31m-    rc = ngx_http_srcache_fetch_subrequest(r, conf, ctx);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ctx->waiting_subrequest = 1;[m
[31m-[m
[31m-    dd("quit");[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_fetch_post_subrequest(ngx_http_request_t *r, void *data,[m
[31m-    ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_srcache_ctx_t      *ctx = data;[m
[31m-    ngx_http_srcache_ctx_t      *pr_ctx;[m
[31m-    ngx_http_request_t          *pr;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (r != r->connection->data) {[m
[31m-        dd("waited: %d, rc: %d", (int) r->waited, (int) rc);[m
[31m-    }[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    pr_ctx = ngx_http_get_module_ctx(pr, ngx_http_srcache_filter_module);[m
[31m-    if (pr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->parsing_cached_headers) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "srcache_fetch: cache sent truncated status line "[m
[31m-                      "or headers");[m
[31m-[m
[31m-        pr_ctx->from_cache = 0;[m
[31m-[m
[31m-    } else if (r->headers_out.status >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-               || rc == NGX_ERROR[m
[31m-               || rc >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-    {[m
[31m-        dd("HERE");[m
[31m-        pr_ctx->from_cache = 0;[m
[31m-[m
[31m-    } else if (!ctx->seen_subreq_eof) {[m
[31m-[m
[31m-#if 1[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "srcache_fetch: cache sent truncated "[m
[31m-                      "response body");[m
[31m-[m
[31m-        pr_ctx->from_cache = 0;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    pr_ctx->waiting_subrequest = 0;[m
[31m-    pr_ctx->request_done = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_fetch_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_http_srcache_loc_conf_t *conf, ngx_http_srcache_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_srcache_ctx_t         *sr_ctx;[m
[31m-    ngx_http_post_subrequest_t     *psr;[m
[31m-    ngx_str_t                       args;[m
[31m-    ngx_uint_t                      flags = 0;[m
[31m-    ngx_http_request_t             *sr;[m
[31m-    ngx_int_t                       rc;[m
[31m-[m
[31m-    ngx_http_srcache_parsed_request_t  *parsed_sr;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    parsed_sr = ngx_palloc(r->pool, sizeof(ngx_http_srcache_parsed_request_t));[m
[31m-    if (parsed_sr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->fetch == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    parsed_sr->method      = conf->fetch->method;[m
[31m-    parsed_sr->method_name = conf->fetch->method_name;[m
[31m-[m
[31m-    parsed_sr->request_body = NULL;[m
[31m-    parsed_sr->content_length_n = -1;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &conf->fetch->location,[m
[31m-                               &parsed_sr->location) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (parsed_sr->location.len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &conf->fetch->args, &parsed_sr->args)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &parsed_sr->location, &args, &flags)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && parsed_sr->args.len == 0) {[m
[31m-        parsed_sr->args = args;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_srcache_ctx_t));[m
[31m-    if (sr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx->in_fetch_subrequest = 1;[m
[31m-[m
[31m-    psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-    if (psr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    psr->handler = ngx_http_srcache_fetch_post_subrequest;[m
[31m-    psr->data = sr_ctx;[m
[31m-[m
[31m-    dd("firing the fetch subrequest");[m
[31m-[m
[31m-    dd("fetch location: %.*s", (int) parsed_sr->location.len,[m
[31m-       parsed_sr->location.data);[m
[31m-[m
[31m-    dd("fetch args: %.*s", (int) parsed_sr->args.len,[m
[31m-       parsed_sr->args.data);[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, &parsed_sr->location, &parsed_sr->args,[m
[31m-                             &sr, psr, flags);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_srcache_adjust_subrequest(sr, parsed_sr);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(sr, sr_ctx, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    ctx->issued_fetch_subrequest = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_srcache_post_read_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_srcache_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    dd("post read: ctx=%p", ctx);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "srcache post read for the access phase: wait:%ud c:%ud",[m
[31m-                   (unsigned) ctx->waiting_request_body, r->main->count);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_core_run_phases;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-    dd("c:%u", r->main->count);[m
[31m-[m
[31m-    if (ctx->waiting_request_body) {[m
[31m-        ctx->request_body_done = 1;[m
[31m-        ctx->waiting_request_body = 0;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.h[m
[1mdeleted file mode 100644[m
[1mindex 3a30e35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_fetch.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SRCACHE_FETCH_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SRCACHE_FETCH_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_filter_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_srcache_access_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_srcache_fetch_post_subrequest(ngx_http_request_t *r,[m
[31m-        void *data, ngx_int_t rc);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SRCACHE_FETCH_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 7bbad4e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,623 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_filter_module.h"[m
[31m-#include "ngx_http_srcache_util.h"[m
[31m-#include "ngx_http_srcache_var.h"[m
[31m-#include "ngx_http_srcache_fetch.h"[m
[31m-#include "ngx_http_srcache_store.h"[m
[31m-#include "ngx_http_srcache_headers.h"[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_srcache_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_srcache_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_srcache_post_config(ngx_conf_t *cf);[m
[31m-static char *ngx_http_srcache_conf_set_request(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_srcache_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_srcache_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static char *ngx_http_srcache_store_statuses(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_srcache_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_srcache_hide_headers[] = {[m
[31m-    ngx_string("Connection"),[m
[31m-    ngx_string("Keep-Alive"),[m
[31m-    ngx_string("Proxy-Authenticate"),[m
[31m-    ngx_string("Proxy-Authorization"),[m
[31m-    ngx_string("TE"),[m
[31m-    ngx_string("Trailers"),[m
[31m-    ngx_string("Transfer-Encoding"),[m
[31m-    ngx_string("Upgrade"),[m
[31m-    ngx_string("Set-Cookie"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_srcache_cache_method_mask[] = {[m
[31m-    { ngx_string("GET"),  NGX_HTTP_GET},[m
[31m-    { ngx_string("HEAD"), NGX_HTTP_HEAD },[m
[31m-    { ngx_string("POST"), NGX_HTTP_POST },[m
[31m-    { ngx_string("PUT"), NGX_HTTP_PUT },[m
[31m-    { ngx_string("DELETE"), NGX_HTTP_DELETE },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_srcache_commands[] = {[m
[31m-[m
[31m-    { ngx_string("srcache_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, buf_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_fetch"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE23,[m
[31m-      ngx_http_srcache_conf_set_request,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, fetch),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE23,[m
[31m-      ngx_http_srcache_conf_set_request,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, store),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, store_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_fetch_skip"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, fetch_skip),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_skip"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, store_skip),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_statuses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_1MORE,[m
[31m-      ngx_http_srcache_store_statuses,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, cache_methods),[m
[31m-      &ngx_http_srcache_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("srcache_request_cache_control"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, req_cache_control),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_private"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, store_private),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_no_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, store_no_store),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, store_no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_response_cache_control"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, resp_cache_control),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_store_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, store_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_ignore_content_encoding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, ignore_content_encoding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_header_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, header_buf_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_max_expire"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, max_expire),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("srcache_default_expire"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_srcache_loc_conf_t, default_expire),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_srcache_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_srcache_post_config,          /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_srcache_create_main_conf,     /* create main configuration */[m
[31m-    ngx_http_srcache_init_main_conf,       /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_srcache_create_loc_conf,      /* create location configuration */[m
[31m-    ngx_http_srcache_merge_loc_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_srcache_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_srcache_filter_module_ctx,   /* module context */[m
[31m-    ngx_http_srcache_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_srcache_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_srcache_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_srcache_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *      conf->fetch_skip = NULL;[m
[31m-     *      conf->store_skip = NULL;[m
[31m-     *      conf->cache_methods = 0;[m
[31m-     *      conf->hide_headers_hash = { NULL, 0 };[m
[31m-     *      conf->skip_content_type = 0;[m
[31m-     *      conf->store_statuses = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->fetch = NGX_CONF_UNSET_PTR;[m
[31m-    conf->store = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->buf_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->store_max_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->header_buf_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->req_cache_control = NGX_CONF_UNSET;[m
[31m-    conf->resp_cache_control = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->store_private = NGX_CONF_UNSET;[m
[31m-    conf->store_no_store = NGX_CONF_UNSET;[m
[31m-    conf->store_no_cache = NGX_CONF_UNSET;[m
[31m-    conf->store_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->max_expire = NGX_CONF_UNSET;[m
[31m-    conf->default_expire = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->ignore_content_encoding = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_srcache_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_srcache_loc_conf_t     *prev = parent;[m
[31m-    ngx_http_srcache_loc_conf_t     *conf = child;[m
[31m-    ngx_hash_init_t                  hash;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->fetch, prev->fetch, NULL);[m
[31m-    ngx_conf_merge_ptr_value(conf->store, prev->store, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buf_size, prev->buf_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->store_max_size, prev->store_max_size, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->header_buf_size, prev->header_buf_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    if (conf->fetch_skip == NULL) {[m
[31m-        conf->fetch_skip = prev->fetch_skip;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->store_skip == NULL) {[m
[31m-        conf->store_skip = prev->store_skip;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->store_statuses == NULL) {[m
[31m-        conf->store_statuses = prev->store_statuses;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->cache_methods == 0) {[m
[31m-        conf->cache_methods = prev->cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->req_cache_control, prev->req_cache_control, 0);[m
[31m-    ngx_conf_merge_value(conf->resp_cache_control, prev->resp_cache_control, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->store_private, prev->store_private, 0);[m
[31m-    ngx_conf_merge_value(conf->store_no_store, prev->store_no_store, 0);[m
[31m-    ngx_conf_merge_value(conf->store_no_cache, prev->store_no_cache, 0);[m
[31m-    ngx_conf_merge_value(conf->store_ranges, prev->store_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->max_expire, prev->max_expire, 0);[m
[31m-    ngx_conf_merge_value(conf->default_expire, prev->default_expire, 60);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ignore_content_encoding,[m
[31m-                         prev->ignore_content_encoding, 0);[m
[31m-[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "srcache_store_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_srcache_hide_headers_hash(cf, conf,[m
[31m-             prev, ngx_http_srcache_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_srcache_conf_set_request(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_http_srcache_request_t      **rpp;[m
[31m-    ngx_http_srcache_request_t       *rp;[m
[31m-    ngx_str_t                        *value;[m
[31m-    ngx_str_t                        *method_name;[m
[31m-    ngx_http_compile_complex_value_t  ccv;[m
[31m-    ngx_http_srcache_main_conf_t     *smcf;[m
[31m-[m
[31m-    rpp = (ngx_http_srcache_request_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*rpp != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    smcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                              ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    smcf->module_used = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *rpp = ngx_pcalloc(cf->pool, sizeof(ngx_http_srcache_request_t));[m
[31m-    if (*rpp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rp = *rpp;[m
[31m-[m
[31m-    method_name = &value[1];[m
[31m-[m
[31m-    rp->method = ngx_http_srcache_parse_method_name(&method_name);[m
[31m-[m
[31m-    if (rp->method == NGX_HTTP_UNKNOWN) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "%V specifies bad HTTP method %V",[m
[31m-                           &cmd->name, method_name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rp->method_name = *method_name;[m
[31m-[m
[31m-    /* compile the location arg */[m
[31m-[m
[31m-    if (value[2].len == 0) {[m
[31m-        ngx_memzero(&rp->location, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[2];[m
[31m-        ccv.complex_value = &rp->location;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* compile the args arg */[m
[31m-[m
[31m-    if (value[3].len == 0) {[m
[31m-        ngx_memzero(&rp->location, sizeof(ngx_http_complex_value_t));[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[3];[m
[31m-    ccv.complex_value = &rp->args;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_srcache_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_srcache_main_conf_t *smcf;[m
[31m-[m
[31m-    smcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_srcache_main_conf_t));[m
[31m-    if (smcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      smcf->postponed_to_access_phase_end = 0;[m
[31m-     *      smcf->module_used = 0;[m
[31m-     *      smcf->headers_in_hash = { NULL, 0 };[m
[31m-     */[m
[31m-[m
[31m-    return smcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_srcache_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_srcache_main_conf_t *smcf = conf;[m
[31m-[m
[31m-    ngx_array_t                     headers_in;[m
[31m-    ngx_hash_key_t                 *hk;[m
[31m-    ngx_hash_init_t                 hash;[m
[31m-    ngx_http_srcache_header_t      *header;[m
[31m-[m
[31m-    /* srcache_headers_in_hash */[m
[31m-[m
[31m-    if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (header = ngx_http_srcache_headers_in; header->name.len; header++) {[m
[31m-        hk = ngx_array_push(&headers_in);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = header->name;[m
[31m-        hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);[m
[31m-        hk->value = header;[m
[31m-    }[m
[31m-[m
[31m-    hash.hash = &smcf->headers_in_hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "srcache_headers_in_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_post_config(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                              multi_http_blocks;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_handler_pt             *h;[m
[31m-    ngx_http_core_main_conf_t       *cmcf;[m
[31m-    ngx_http_srcache_main_conf_t    *smcf;[m
[31m-[m
[31m-    rc = ngx_http_srcache_add_variables(cf);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    smcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                              ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (ngx_http_srcache_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_srcache_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || smcf->module_used) {[m
[31m-[m
[31m-        dd("using ngx-srcache");[m
[31m-[m
[31m-        /* register our output filters */[m
[31m-        rc = ngx_http_srcache_filter_init(cf);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-        /* register our access phase handler */[m
[31m-[m
[31m-        h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *h = ngx_http_srcache_access_handler;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_srcache_store_statuses(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_srcache_loc_conf_t     *slcf = conf;[m
[31m-[m
[31m-    ngx_uint_t       i, n;[m
[31m-    ngx_int_t        status;[m
[31m-    ngx_str_t       *value;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (slcf->store_statuses) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    n = cf->args->nelts - 1;[m
[31m-[m
[31m-    slcf->store_statuses = ngx_pnalloc(cf->pool, (n + 1) * sizeof(ngx_int_t));[m
[31m-    if (slcf->store_statuses == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i <= n; i++) {[m
[31m-        status = ngx_atoi(value[i].data, value[i].len);[m
[31m-        if (status == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "status code \"%V\" is an invalid number",[m
[31m-                               &value[i]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (status < 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "status code \"%V\" is not a positive number",[m
[31m-                               &value[i]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        slcf->store_statuses[i - 1] = status;[m
[31m-    }[m
[31m-[m
[31m-    slcf->store_statuses[i - 1] = 0;[m
[31m-[m
[31m-    ngx_sort(slcf->store_statuses, n, sizeof(ngx_int_t),[m
[31m-             ngx_http_srcache_cmp_int);[m
[31m-[m
[31m-#if 0[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        dd("status: %d", (int) slcf->store_statuses[i]);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.h[m
[1mdeleted file mode 100644[m
[1mindex 50c4b87..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_filter_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,152 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SRCACHE_FILTER_MODULE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SRCACHE_FILTER_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NGX_HTTP_SRCACHE_FETCH_BYPASS = 0,[m
[31m-    NGX_HTTP_SRCACHE_FETCH_MISS   = 1,[m
[31m-    NGX_HTTP_SRCACHE_FETCH_HIT    = 2[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NGX_HTTP_SRCACHE_STORE_BYPASS = 0,[m
[31m-    NGX_HTTP_SRCACHE_STORE_STORE  = 1[m
[31m-};[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_srcache_filter_module;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                  method;[m
[31m-    ngx_str_t                   method_name;[m
[31m-    ngx_http_complex_value_t    location;[m
[31m-    ngx_http_complex_value_t    args;[m
[31m-[m
[31m-} ngx_http_srcache_request_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                  method;[m
[31m-    ngx_str_t                   method_name;[m
[31m-    ngx_str_t                   location;[m
[31m-    ngx_str_t                   args;[m
[31m-    ngx_http_request_body_t    *request_body;[m
[31m-    ssize_t                     content_length_n;[m
[31m-[m
[31m-} ngx_http_srcache_parsed_request_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_srcache_request_t      *fetch;[m
[31m-    ngx_http_srcache_request_t      *store;[m
[31m-    size_t                           buf_size;[m
[31m-    size_t                           store_max_size;[m
[31m-    size_t                           header_buf_size;[m
[31m-[m
[31m-    ngx_http_complex_value_t        *fetch_skip;[m
[31m-    ngx_http_complex_value_t        *store_skip;[m
[31m-[m
[31m-    ngx_uint_t                       cache_methods;[m
[31m-[m
[31m-    ngx_int_t                       *store_statuses;[m
[31m-[m
[31m-    ngx_flag_t                       req_cache_control;[m
[31m-    ngx_flag_t                       resp_cache_control;[m
[31m-[m
[31m-    ngx_flag_t                       store_private;[m
[31m-    ngx_flag_t                       store_no_store;[m
[31m-    ngx_flag_t                       store_no_cache;[m
[31m-    ngx_flag_t                       store_ranges;[m
[31m-[m
[31m-    ngx_flag_t                       ignore_content_encoding;[m
[31m-[m
[31m-    ngx_hash_t                       hide_headers_hash;[m
[31m-    ngx_array_t                     *hide_headers;[m
[31m-    ngx_array_t                     *pass_headers;[m
[31m-[m
[31m-    time_t                           max_expire;[m
[31m-    time_t                           default_expire;[m
[31m-[m
[31m-    unsigned                         postponed_to_access_phase_end:1;[m
[31m-    unsigned                         hide_content_type:1;[m
[31m-    unsigned                         hide_last_modified:1;[m
[31m-} ngx_http_srcache_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned            postponed_to_access_phase_end;[m
[31m-    unsigned            module_used;[m
[31m-    ngx_hash_t          headers_in_hash;[m
[31m-[m
[31m-} ngx_http_srcache_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_srcache_ctx_s  ngx_http_srcache_ctx_t;[m
[31m-[m
[31m-typedef struct ngx_http_srcache_postponed_request_s[m
[31m-    ngx_http_srcache_postponed_request_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_srcache_ctx_s {[m
[31m-    ngx_chain_t                     *body_from_cache;[m
[31m-    ngx_chain_t                     *body_to_cache;[m
[31m-    size_t                           response_length;[m
[31m-    size_t                           response_body_length;[m
[31m-    void                            *store_wev_handler_ctx;[m
[31m-[m
[31m-    ngx_int_t                      (*process_header)(ngx_http_request_t *r,[m
[31m-                                                     ngx_buf_t *b);[m
[31m-[m
[31m-    time_t                           valid_sec;[m
[31m-[m
[31m-    ngx_http_status_t                status;[m
[31m-    ngx_buf_t                       *header_buf;[m
[31m-[m
[31m-    ngx_http_srcache_postponed_request_t  *postponed_requests;[m
[31m-[m
[31m-    ngx_uint_t      http_status; /* the HTTP status code that has been[m
[31m-                                    actually sent */[m
[31m-[m
[31m-    unsigned        waiting_subrequest:1;[m
[31m-    unsigned        request_done:1;[m
[31m-    unsigned        from_cache:1;[m
[31m-    /* unsigned      fetch_error:1; */[m
[31m-    unsigned        in_fetch_subrequest:1;[m
[31m-    unsigned        in_store_subrequest:1;[m
[31m-    unsigned        ignore_body:1;[m
[31m-    unsigned        parsing_cached_headers:1;[m
[31m-    unsigned        store_response:1;[m
[31m-    unsigned        store_skip:1;[m
[31m-    unsigned        issued_fetch_subrequest:1;[m
[31m-    unsigned        seen_subreq_eof:1;[m
[31m-    unsigned        waiting_request_body:1;[m
[31m-    unsigned        request_body_done:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_srcache_postponed_request_s {[m
[31m-    ngx_http_srcache_postponed_request_t     *next;[m
[31m-[m
[31m-    ngx_http_request_t              *request;[m
[31m-    ngx_http_srcache_ctx_t          *ctx;[m
[31m-    unsigned                         ready:1;[m
[31m-    unsigned                         done:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#endif  /* _NGX_HTTP_SRCACHE_FILTER_MODULE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_headers.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_headers.c[m
[1mdeleted file mode 100644[m
[1mindex 40f9b05..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_headers.c[m
[1m+++ /dev/null[m
[36m@@ -1,347 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_headers.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_srcache_process_content_type(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_srcache_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_srcache_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_srcache_process_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_srcache_process_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_srcache_process_accept_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_srcache_ignore_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_srcache_process_location(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t[m
[31m-    ngx_http_srcache_process_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_http_srcache_header_t  ngx_http_srcache_headers_in[] = {[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 ngx_http_srcache_process_content_type, 0 },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 ngx_http_srcache_process_content_length, 0 },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 ngx_http_srcache_process_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, date) },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 ngx_http_srcache_process_last_modified, 0 },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 ngx_http_srcache_process_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, etag) },[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 ngx_http_srcache_process_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, server) },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 ngx_http_srcache_process_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, www_authenticate) },[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 ngx_http_srcache_process_location,[m
[31m-                 0 },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 ngx_http_srcache_process_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, refresh) },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 ngx_http_srcache_process_multi_header_lines,[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control) },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 ngx_http_srcache_process_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, expires) },[m
[31m-[m
[31m-    { ngx_string("X-SRCache-Allow-Ranges"),[m
[31m-                 ngx_http_srcache_process_allow_ranges,[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges) },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 ngx_http_srcache_process_accept_ranges,[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges) },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 ngx_http_srcache_ignore_header_line, 0 },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 ngx_http_srcache_ignore_header_line, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 ngx_http_srcache_process_content_encoding,[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding) },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (offset) {[m
[31m-        ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);[m
[31m-        *ph = ho;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_process_location(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (ho->value.data[0] != '/') {[m
[31m-        r->headers_out.location = ho;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_process_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    r->headers_out.content_type_len = h->value.len;[m
[31m-    r->headers_out.content_type = h->value;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    for (p = h->value.data; *p; p++) {[m
[31m-[m
[31m-        if (*p != ';') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        last = p;[m
[31m-[m
[31m-        while (*++p == ' ') { /* void */ }[m
[31m-[m
[31m-        if (*p == '\0') {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p += 8;[m
[31m-[m
[31m-        r->headers_out.content_type_len = last - h->value.data;[m
[31m-[m
[31m-        if (*p == '"') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        last = h->value.data + h->value.len;[m
[31m-[m
[31m-        if (*(last - 1) == '"') {[m
[31m-            last--;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.charset.len = last - p;[m
[31m-        r->headers_out.charset.data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.content_length = ho;[m
[31m-    r->headers_out.content_length_n = ngx_atoof(h->value.data, h->value.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-#if 1[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.last_modified = ho;[m
[31m-#endif[m
[31m-[m
[31m-    r->headers_out.last_modified_time = ngx_http_parse_time(h->value.data,[m
[31m-                                                            h->value.len);[m
[31m-[m
[31m-    dd("setting last-modified-time: %d",[m
[31m-       (int) r->headers_out.last_modified_time);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_process_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_process_accept_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.accept_ranges = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_process_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_process_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.content_encoding = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_headers.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_headers.h[m
[1mdeleted file mode 100644[m
[1mindex 5951c92..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_headers.h[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SRCACHE_HEADERS_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SRCACHE_HEADERS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_filter_module.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_http_header_handler_pt       handler;[m
[31m-    ngx_uint_t                       offset;[m
[31m-} ngx_http_srcache_header_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_http_srcache_header_t  ngx_http_srcache_headers_in[];[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_srcache_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SRCACHE_HEADERS_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_store.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_store.c[m
[1mdeleted file mode 100644[m
[1mindex d3f4fa5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_store.c[m
[1m+++ /dev/null[m
[36m@@ -1,673 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_store.h"[m
[31m-#include "ngx_http_srcache_fetch.h"[m
[31m-#include "ngx_http_srcache_util.h"[m
[31m-#include <assert.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_srcache_store_post_subrequest(ngx_http_request_t *r,[m
[31m-    void *data, ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_srcache_store_subrequest(ngx_http_request_t *r,[m
[31m-        ngx_http_srcache_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_srcache_header_filter(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_srcache_body_filter(ngx_http_request_t *r,[m
[31m-        ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt  ngx_http_srcache_next_header_filter;[m
[31m-ngx_http_output_body_filter_pt    ngx_http_srcache_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_srcache_ctx_t          *ctx, *pr_ctx;[m
[31m-    ngx_http_srcache_loc_conf_t     *slcf;[m
[31m-    ngx_http_post_subrequest_t      *ps;[m
[31m-    ngx_str_t                        skip;[m
[31m-    ngx_uint_t                      *sp; /* status pointer */[m
[31m-[m
[31m-    dd_enter();[m
[31m-    dd("srcache header filter");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (r != r->main && ctx == NULL) {[m
[31m-        ps = r->post_subrequest;[m
[31m-        if (ps != NULL[m
[31m-            && (ps->handler == ngx_http_srcache_fetch_post_subrequest[m
[31m-                || ps->handler == ngx_http_srcache_store_post_subrequest)[m
[31m-            && ps->data != NULL)[m
[31m-        {[m
[31m-            /* the subrequest ctx has been cleared by[m
[31m-             * ngx_http_internal_redirect, resume it from the post_subrequest[m
[31m-             * data[m
[31m-             */[m
[31m-            dd("resumed ctx from post_subrequest");[m
[31m-            ctx = ps->data;[m
[31m-            ngx_http_set_ctx(r, ctx, ngx_http_srcache_filter_module);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx == NULL || ctx->from_cache) {[m
[31m-        dd("bypass: %.*s", (int) r->uri.len, r->uri.data);[m
[31m-        return ngx_http_srcache_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->in_fetch_subrequest) {[m
[31m-        dd("in fetch subrequest");[m
[31m-[m
[31m-        pr_ctx = ngx_http_get_module_ctx(r->parent,[m
[31m-                                         ngx_http_srcache_filter_module);[m
[31m-[m
[31m-        if (pr_ctx == NULL) {[m
[31m-            dd("parent ctx is null");[m
[31m-[m
[31m-            ctx->ignore_body = 1;[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_fetch: subrequest returned status %ui",[m
[31m-                       r->headers_out.status);[m
[31m-[m
[31m-        if (r->headers_out.status != NGX_HTTP_OK) {[m
[31m-            dd("ignoring body because status == %d",[m
[31m-               (int) r->headers_out.status);[m
[31m-[m
[31m-            ctx->ignore_body = 1;[m
[31m-[m
[31m-            pr_ctx->waiting_subrequest = 0;[m
[31m-            /* pr_ctx->fetch_error = 1; */[m
[31m-            r->header_sent = 1;[m
[31m-[m
[31m-            if (r->method == NGX_HTTP_HEAD) {[m
[31m-                r->header_only = 1;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_fetch decides to send the response in cache");[m
[31m-[m
[31m-        r->filter_need_in_memory = 1;[m
[31m-        pr_ctx->from_cache = 1;[m
[31m-        ctx->parsing_cached_headers = 1;[m
[31m-        r->header_sent = 1;[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_HEAD) {[m
[31m-            r->header_only = 1;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->in_store_subrequest) {[m
[31m-        dd("in store subreuqest");[m
[31m-        ctx->ignore_body = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_store: subrequest returned status %ui",[m
[31m-                       r->headers_out.status);[m
[31m-[m
[31m-        r->header_sent = 1;[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_HEAD) {[m
[31m-            r->header_only = 1;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (slcf->store == NULL) {[m
[31m-        dd("slcf->store is NULL");[m
[31m-        return ngx_http_srcache_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    /* slcf->store != NULL */[m
[31m-[m
[31m-#if 1[m
[31m-    if (!(r->method & (slcf->cache_methods & ~NGX_HTTP_HEAD))) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_store skipped due to request method %V",[m
[31m-                       &r->method_name);[m
[31m-[m
[31m-        return ngx_http_srcache_next_header_filter(r);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (!slcf->ignore_content_encoding[m
[31m-        && r->headers_out.content_encoding[m
[31m-        && r->headers_out.content_encoding->value.len)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                      "srcache_store skipped due to response header "[m
[31m-                      "\"Content-Encoding: %V\" (maybe you forgot to disable "[m
[31m-                      "compression on the backend?)",[m
[31m-                      &r->headers_out.content_encoding->value);[m
[31m-[m
[31m-        return ngx_http_srcache_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->resp_cache_control[m
[31m-        && ngx_http_srcache_response_no_cache(r, slcf, ctx) == NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_store skipped due to response header "[m
[31m-                       "Cache-Control");[m
[31m-[m
[31m-        return ngx_http_srcache_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->store_skip != NULL[m
[31m-        && ngx_http_complex_value(r, slcf->store_skip, &skip) == NGX_OK[m
[31m-        && skip.len[m
[31m-        && (skip.len != 1 || skip.data[0] != '0'))[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_store skipped due to the true value fed into "[m
[31m-                       "srcache_store_skip: \"%V\"", &skip);[m
[31m-[m
[31m-        ctx->store_skip = 1;[m
[31m-[m
[31m-        return ngx_http_srcache_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    dd("error page: %d", (int) r->error_page);[m
[31m-[m
[31m-    if (slcf->store_statuses != NULL) {[m
[31m-[m
[31m-        sp = (ngx_uint_t *) slcf->store_statuses;[m
[31m-[m
[31m-        while (r->headers_out.status < *sp) {[m
[31m-            sp++;[m
[31m-        }[m
[31m-[m
[31m-        if (*sp == 0 || r->headers_out.status > *sp) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "srcache_store bypassed because of unmatched "[m
[31m-                           "status code %ui with srcache_store_statuses",[m
[31m-                           r->headers_out.status);[m
[31m-[m
[31m-            return ngx_http_srcache_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        /* r->headers_out.status == (ngx_uint_t) *sp */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (r->headers_out.status != NGX_HTTP_OK[m
[31m-            && r->headers_out.status != NGX_HTTP_MOVED_TEMPORARILY[m
[31m-            && r->headers_out.status != NGX_HTTP_MOVED_PERMANENTLY)[m
[31m-        {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "srcache_store bypassed because of unmatched status "[m
[31m-                           "code %i (only 200, 301, or 302 are accepted by "[m
[31m-                           "default)", r->headers_out.status);[m
[31m-[m
[31m-            return ngx_http_srcache_next_header_filter(r);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->store_max_size != 0[m
[31m-        && r->headers_out.content_length_n > 0[m
[31m-        && r->headers_out.content_length_n + 15[m
[31m-           /* just an approxiation for the response header size */[m
[31m-           > (off_t) slcf->store_max_size)[m
[31m-    {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "srcache_store bypassed because of too large "[m
[31m-                       "Content-Length response header: %O (limit is: %z)",[m
[31m-                       r->headers_out.content_length_n, slcf->store_max_size);[m
[31m-[m
[31m-        return ngx_http_srcache_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    dd("try to save the response header");[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "ngx_srcache not working in subrequests (yet)");[m
[31m-[m
[31m-        /* not allowd in subrquests */[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "srcache_store decides to store the response");[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    ctx->http_status = r->headers_out.status;[m
[31m-    ctx->store_response = 1;[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    /* store the response header to ctx->body_to_cache */[m
[31m-    if (ngx_http_srcache_store_response_header(r, ctx) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_srcache_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_srcache_ctx_t      *ctx, *pr_ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    skip;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_http_srcache_loc_conf_t *slcf;[m
[31m-    size_t                       len;[m
[31m-    unsigned                     last;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_srcache_next_body_filter(r, NULL);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->from_cache || ctx->store_skip) {[m
[31m-        dd("bypass: %.*s", (int) r->uri.len, r->uri.data);[m
[31m-        return ngx_http_srcache_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ignore_body || ctx->in_store_subrequest/* || ctx->fetch_error */) {[m
[31m-        dd("ignore body: ignore body %d, in store sr %d",[m
[31m-           (int) ctx->ignore_body, (int) ctx->in_store_subrequest);[m
[31m-        ngx_http_srcache_discard_bufs(r->pool, in);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->in_fetch_subrequest) {[m
[31m-        if (ctx->parsing_cached_headers) {[m
[31m-[m
[31m-            /* parse the cached response's headers and[m
[31m-             * set r->parent->headers_out */[m
[31m-[m
[31m-            if (ctx->process_header == NULL) {[m
[31m-                dd("restore parent request header");[m
[31m-                ctx->process_header = ngx_http_srcache_process_status_line;[m
[31m-                r->state = 0; /* sw_start */[m
[31m-            }[m
[31m-[m
[31m-            for (cl = in; cl; cl = cl->next) {[m
[31m-                if (ngx_buf_in_memory(cl->buf)) {[m
[31m-                    dd("old pos %p, last %p", cl->buf->pos, cl->buf->last);[m
[31m-[m
[31m-                    rc = ctx->process_header(r, cl->buf);[m
[31m-[m
[31m-                    if (rc == NGX_AGAIN) {[m
[31m-                        dd("AGAIN/OK: new pos %p, last %p",[m
[31m-                           cl->buf->pos, cl->buf->last);[m
[31m-[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    if (rc == NGX_ERROR) {[m
[31m-                        r->state = 0; /* sw_start */[m
[31m-                        ctx->parsing_cached_headers = 0;[m
[31m-                        ctx->ignore_body = 1;[m
[31m-                        ngx_http_srcache_discard_bufs(r->pool, cl);[m
[31m-                        pr_ctx = ngx_http_get_module_ctx(r->parent,[m
[31m-                                              ngx_http_srcache_filter_module);[m
[31m-[m
[31m-                        if (pr_ctx == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        pr_ctx->from_cache = 0;[m
[31m-[m
[31m-                        return NGX_OK;[m
[31m-                    }[m
[31m-[m
[31m-                    /* rc == NGX_OK */[m
[31m-[m
[31m-                    dd("OK: new pos %p, last %p", cl->buf->pos, cl->buf->last);[m
[31m-                    dd("buf left: %.*s", (int) (cl->buf->last - cl->buf->pos),[m
[31m-                       cl->buf->pos);[m
[31m-[m
[31m-                    ctx->parsing_cached_headers = 0;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (cl->buf->pos == cl->buf->last) {[m
[31m-                cl = cl->next;[m
[31m-            }[m
[31m-[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            in = cl;[m
[31m-        }[m
[31m-[m
[31m-        dd("save the cached response body for parent");[m
[31m-[m
[31m-        pr_ctx = ngx_http_get_module_ctx(r->parent,[m
[31m-                                         ngx_http_srcache_filter_module);[m
[31m-[m
[31m-        if (pr_ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_srcache_add_copy_chain(r->pool,[m
[31m-                                             &pr_ctx->body_from_cache, in,[m
[31m-                                             &last);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (last) {[m
[31m-            ctx->seen_subreq_eof = 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_srcache_discard_bufs(r->pool, in);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->store_response) {[m
[31m-        dd("storing the response: %p", in);[m
[31m-[m
[31m-        slcf = ngx_http_get_module_loc_conf(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-        if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT[m
[31m-            && ctx->http_status == NGX_HTTP_OK)[m
[31m-        {[m
[31m-            u_char *p;[m
[31m-[m
[31m-            if (!slcf->store_ranges) {[m
[31m-                ctx->store_response = 0;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            dd("fix 206 status code");[m
[31m-[m
[31m-            /* handle 206 Partial Content generated by the range filter */[m
[31m-            cl = ctx->body_to_cache;[m
[31m-            assert(cl && cl->buf && cl->buf->last - cl->buf->pos > 12);[m
[31m-            p = cl->buf->pos + sizeof("HTTP/1.x 20") - 1;[m
[31m-            *p = '6';[m
[31m-[m
[31m-            ctx->http_status = NGX_HTTP_PARTIAL_CONTENT;[m
[31m-        }[m
[31m-[m
[31m-        for (cl = in; cl; cl = cl->next) {[m
[31m-            if (ngx_buf_in_memory(cl->buf)) {[m
[31m-                len = ngx_buf_size(cl->buf);[m
[31m-                ctx->response_length += len;[m
[31m-                ctx->response_body_length += len;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (slcf->store_max_size != 0[m
[31m-            && ctx->response_length > slcf->store_max_size)[m
[31m-        {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "srcache_store bypassed because response body "[m
[31m-                           "exceeded maximum size: %z (limit is: %z)",[m
[31m-                           ctx->response_length, slcf->store_max_size);[m
[31m-[m
[31m-            ctx->store_response = 0;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_srcache_add_copy_chain(r->pool, &ctx->body_to_cache,[m
[31m-                                             in, &last);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ctx->store_response = 0;[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (last && r == r->main) {[m
[31m-[m
[31m-#if 1[m
[31m-            if (r->headers_out.content_length_n >[m
[31m-                (off_t) ctx->response_body_length)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "srcache_store: skipped because response body "[m
[31m-                              "truncated: %O > %uz",[m
[31m-                              r->headers_out.content_length_n,[m
[31m-                              ctx->response_body_length);[m
[31m-[m
[31m-                ctx->store_response = 0;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (r->headers_out.status >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-                && r->headers_out.status != ctx->http_status)[m
[31m-            {[m
[31m-                /* data truncation or body receive timeout */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "srcache_store: skipped due to new error status "[m
[31m-                              "code %ui (old: %ui)",[m
[31m-                              r->headers_out.status, ctx->http_status);[m
[31m-[m
[31m-                ctx->store_response = 0;[m
[31m-                goto done;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (slcf->store_skip != NULL[m
[31m-                && ngx_http_complex_value(r, slcf->store_skip, &skip) == NGX_OK[m
[31m-                && skip.len[m
[31m-                && (skip.len != 1 || skip.data[0] != '0'))[m
[31m-            {[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "srcache_store skipped due to the true value in "[m
[31m-                               "srcache_store_skip: \"%V\"", &skip);[m
[31m-[m
[31m-                ctx->store_response = 0;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_srcache_store_subrequest(r, ctx);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                ctx->store_response = 0;[m
[31m-                goto done;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        dd("NO store response");[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    return ngx_http_srcache_next_body_filter(r, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_store_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_http_srcache_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_srcache_ctx_t         *sr_ctx;[m
[31m-    ngx_str_t                       args;[m
[31m-    ngx_uint_t                      flags = 0;[m
[31m-    ngx_http_request_t             *sr;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_http_request_body_t        *rb = NULL;[m
[31m-    ngx_http_srcache_loc_conf_t    *conf;[m
[31m-    ngx_http_post_subrequest_t     *psr;[m
[31m-[m
[31m-    ngx_http_srcache_parsed_request_t  *parsed_sr;[m
[31m-[m
[31m-    dd("store subrequest");[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (conf->store == NULL) {[m
[31m-        dd("conf store is NULL");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    parsed_sr = ngx_palloc(r->pool, sizeof(ngx_http_srcache_parsed_request_t));[m
[31m-    if (parsed_sr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    parsed_sr->method      = conf->store->method;[m
[31m-    parsed_sr->method_name = conf->store->method_name;[m
[31m-[m
[31m-    if (ctx->body_to_cache) {[m
[31m-        dd("found body to cache (len %d)", (int) ctx->response_length);[m
[31m-[m
[31m-        rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-[m
[31m-        if (rb == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs = ctx->body_to_cache;[m
[31m-        rb->buf = ctx->body_to_cache->buf;[m
[31m-[m
[31m-        parsed_sr->request_body = rb;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "srcache_store: no request body for the subrequest");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    parsed_sr->content_length_n = ctx->response_length;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &conf->store->location,[m
[31m-                               &parsed_sr->location) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (parsed_sr->location.len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &conf->store->args, &parsed_sr->args)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &parsed_sr->location, &args, &flags)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && parsed_sr->args.len == 0) {[m
[31m-        parsed_sr->args = args;[m
[31m-    }[m
[31m-[m
[31m-    dd("firing the store subrequest");[m
[31m-[m
[31m-    dd("store location: %.*s", (int) parsed_sr->location.len,[m
[31m-       parsed_sr->location.data);[m
[31m-[m
[31m-    dd("store args: %.*s", (int) parsed_sr->args.len,[m
[31m-       parsed_sr->args.data);[m
[31m-[m
[31m-    sr_ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_srcache_ctx_t));[m
[31m-[m
[31m-    if (sr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx->in_store_subrequest = 1;[m
[31m-[m
[31m-    psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-    if (psr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    psr->handler = ngx_http_srcache_store_post_subrequest;[m
[31m-    psr->data = sr_ctx;[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, &parsed_sr->location, &parsed_sr->args,[m
[31m-                             &sr, psr, flags);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_srcache_adjust_subrequest(sr, parsed_sr);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(sr, sr_ctx, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_store_post_subrequest(ngx_http_request_t *r, void *data,[m
[31m-    ngx_int_t rc)[m
[31m-{[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        || r->headers_out.status >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "srcache_store subrequest failed: rc=%i status=%ui",[m
[31m-                      rc, r->headers_out.status);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_srcache_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_srcache_header_filter;[m
[31m-[m
[31m-    ngx_http_srcache_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_srcache_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_store.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_store.h[m
[1mdeleted file mode 100644[m
[1mindex 08aaf56..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_store.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SRCACHE_STORE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SRCACHE_STORE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_filter_module.h"[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt  ngx_http_srcache_next_header_filter;[m
[31m-extern ngx_http_output_body_filter_pt    ngx_http_srcache_next_body_filter;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_srcache_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SRCACHE_STORE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_util.c[m
[1mdeleted file mode 100644[m
[1mindex bc8b0aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,1276 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_util.h"[m
[31m-#include "ngx_http_srcache_headers.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_srcache_set_content_length_header([m
[31m-        ngx_http_request_t *r, off_t len);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_status_lines[] = {[m
[31m-[m
[31m-    ngx_string("200 OK"),[m
[31m-    ngx_string("201 Created"),[m
[31m-    ngx_string("202 Accepted"),[m
[31m-    ngx_null_string,  /* "203 Non-Authoritative Information" */[m
[31m-    ngx_string("204 No Content"),[m
[31m-    ngx_null_string,  /* "205 Reset Content" */[m
[31m-    ngx_string("206 Partial Content"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "207 Multi-Status" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_LEVEL_200  207[m
[31m-#define NGX_HTTP_LEVEL_200       (NGX_HTTP_LAST_LEVEL_200 - 200)[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "300 Multiple Choices" */[m
[31m-[m
[31m-    ngx_string("301 Moved Permanently"),[m
[31m-    ngx_string("302 Moved Temporarily"),[m
[31m-    ngx_string("303 See Other"),[m
[31m-    ngx_string("304 Not Modified"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "305 Use Proxy" */[m
[31m-    /* ngx_null_string, */  /* "306 unused" */[m
[31m-    /* ngx_null_string, */  /* "307 Temporary Redirect" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_LEVEL_300  305[m
[31m-#define NGX_HTTP_LEVEL_300       (NGX_HTTP_LAST_LEVEL_300 - 301)[m
[31m-[m
[31m-    ngx_string("400 Bad Request"),[m
[31m-    ngx_string("401 Unauthorized"),[m
[31m-    ngx_string("402 Payment Required"),[m
[31m-    ngx_string("403 Forbidden"),[m
[31m-    ngx_string("404 Not Found"),[m
[31m-    ngx_string("405 Not Allowed"),[m
[31m-    ngx_string("406 Not Acceptable"),[m
[31m-    ngx_null_string,  /* "407 Proxy Authentication Required" */[m
[31m-    ngx_string("408 Request Time-out"),[m
[31m-    ngx_string("409 Conflict"),[m
[31m-    ngx_string("410 Gone"),[m
[31m-    ngx_string("411 Length Required"),[m
[31m-    ngx_string("412 Precondition Failed"),[m
[31m-    ngx_string("413 Request Entity Too Large"),[m
[31m-    ngx_null_string,  /* "414 Request-URI Too Large", but we never send it[m
[31m-                       * because we treat such requests as the HTTP/0.9[m
[31m-                       * requests and send only a body without a header[m
[31m-                       */[m
[31m-    ngx_string("415 Unsupported Media Type"),[m
[31m-    ngx_string("416 Requested Range Not Satisfiable"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "417 Expectation Failed" */[m
[31m-    /* ngx_null_string, */  /* "418 unused" */[m
[31m-    /* ngx_null_string, */  /* "419 unused" */[m
[31m-    /* ngx_null_string, */  /* "420 unused" */[m
[31m-    /* ngx_null_string, */  /* "421 unused" */[m
[31m-    /* ngx_null_string, */  /* "422 Unprocessable Entity" */[m
[31m-    /* ngx_null_string, */  /* "423 Locked" */[m
[31m-    /* ngx_null_string, */  /* "424 Failed Dependency" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_LEVEL_400  417[m
[31m-#define NGX_HTTP_LEVEL_400       (NGX_HTTP_LAST_LEVEL_400 - 400)[m
[31m-[m
[31m-    ngx_string("500 Internal Server Error"),[m
[31m-    ngx_string("501 Method Not Implemented"),[m
[31m-    ngx_string("502 Bad Gateway"),[m
[31m-    ngx_string("503 Service Temporarily Unavailable"),[m
[31m-    ngx_string("504 Gateway Time-out"),[m
[31m-[m
[31m-    ngx_null_string,        /* "505 HTTP Version Not Supported" */[m
[31m-    ngx_null_string,        /* "506 Variant Also Negotiates" */[m
[31m-    ngx_string("507 Insufficient Storage"),[m
[31m-    /* ngx_null_string, */  /* "508 unused" */[m
[31m-    /* ngx_null_string, */  /* "509 unused" */[m
[31m-    /* ngx_null_string, */  /* "510 Not Extended" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_LEVEL_500  508[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_srcache_content_length_header_key =[m
[31m-        ngx_string("Content-Length");[m
[31m-ngx_str_t  ngx_http_srcache_get_method =[m
[31m-        ngx_http_srcache_method_name("GET");[m
[31m-ngx_str_t  ngx_http_srcache_put_method =[m
[31m-        ngx_http_srcache_method_name("PUT");[m
[31m-ngx_str_t  ngx_http_srcache_post_method =[m
[31m-        ngx_http_srcache_method_name("POST");[m
[31m-ngx_str_t  ngx_http_srcache_head_method =[m
[31m-        ngx_http_srcache_method_name("HEAD");[m
[31m-ngx_str_t  ngx_http_srcache_copy_method =[m
[31m-        ngx_http_srcache_method_name("COPY");[m
[31m-ngx_str_t  ngx_http_srcache_move_method =[m
[31m-        ngx_http_srcache_method_name("MOVE");[m
[31m-ngx_str_t  ngx_http_srcache_lock_method =[m
[31m-        ngx_http_srcache_method_name("LOCK");[m
[31m-ngx_str_t  ngx_http_srcache_mkcol_method =[m
[31m-        ngx_http_srcache_method_name("MKCOL");[m
[31m-ngx_str_t  ngx_http_srcache_trace_method =[m
[31m-        ngx_http_srcache_method_name("TRACE");[m
[31m-ngx_str_t  ngx_http_srcache_delete_method =[m
[31m-        ngx_http_srcache_method_name("DELETE");[m
[31m-ngx_str_t  ngx_http_srcache_unlock_method =[m
[31m-        ngx_http_srcache_method_name("UNLOCK");[m
[31m-ngx_str_t  ngx_http_srcache_options_method =[m
[31m-        ngx_http_srcache_method_name("OPTIONS");[m
[31m-ngx_str_t  ngx_http_srcache_propfind_method =[m
[31m-        ngx_http_srcache_method_name("PROPFIND");[m
[31m-ngx_str_t  ngx_http_srcache_proppatch_method =[m
[31m-        ngx_http_srcache_method_name("PROPPATCH");[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_srcache_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_parse_method_name(ngx_str_t **method_name_ptr)[m
[31m-{[m
[31m-    const ngx_str_t         *method_name = *method_name_ptr;[m
[31m-[m
[31m-    switch (method_name->len) {[m
[31m-[m
[31m-    case 3:[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "GET") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_get_method;[m
[31m-            return NGX_HTTP_GET;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "PUT") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_put_method;[m
[31m-            return NGX_HTTP_PUT;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 4:[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "POST") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_post_method;[m
[31m-            return NGX_HTTP_POST;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "HEAD") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_head_method;[m
[31m-            return NGX_HTTP_HEAD;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "COPY") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_copy_method;[m
[31m-            return NGX_HTTP_COPY;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "MOVE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_move_method;[m
[31m-            return NGX_HTTP_MOVE;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "LOCK") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_lock_method;[m
[31m-            return NGX_HTTP_LOCK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 5:[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "MKCOL") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_mkcol_method;[m
[31m-            return NGX_HTTP_MKCOL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "TRACE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_trace_method;[m
[31m-            return NGX_HTTP_TRACE;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 6:[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "DELETE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_delete_method;[m
[31m-            return NGX_HTTP_DELETE;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "UNLOCK") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_unlock_method;[m
[31m-            return NGX_HTTP_UNLOCK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 7:[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "OPTIONS") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_options_method;[m
[31m-            return NGX_HTTP_OPTIONS;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 8:[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "PROPFIND") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_srcache_propfind_method;[m
[31m-            return NGX_HTTP_PROPFIND;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 9:[m
[31m-        if (ngx_http_srcache_strcmp_const(method_name->data, "PROPPATCH")[m
[31m-            == 0)[m
[31m-        {[m
[31m-            *method_name_ptr = &ngx_http_srcache_proppatch_method;[m
[31m-            return NGX_HTTP_PROPPATCH;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_UNKNOWN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_adjust_subrequest(ngx_http_request_t *sr,[m
[31m-    ngx_http_srcache_parsed_request_t *parsed_sr)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_request_body_t    *body;[m
[31m-    ngx_int_t                   rc;[m
[31m-[m
[31m-    sr->method      = parsed_sr->method;[m
[31m-    sr->method_name = parsed_sr->method_name;[m
[31m-[m
[31m-    r = sr->parent;[m
[31m-[m
[31m-    dd("subrequest method: %d %.*s", (int) sr->method,[m
[31m-       (int) sr->method_name.len, sr->method_name.data);[m
[31m-[m
[31m-    sr->header_in = r->header_in;[m
[31m-[m
[31m-#if 1[m
[31m-    /* XXX work-around a bug in ngx_http_subrequest */[m
[31m-    if (r->headers_in.headers.last == &r->headers_in.headers.part) {[m
[31m-        sr->headers_in.headers.last = &sr->headers_in.headers.part;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    /* we do not inherit the parent request's variables */[m
[31m-    cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-    sr->variables = ngx_pcalloc(sr->pool, cmcf->variables.nelts[m
[31m-                                * sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-    if (sr->variables == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    body = parsed_sr->request_body;[m
[31m-    if (body) {[m
[31m-        sr->request_body = body;[m
[31m-[m
[31m-        rc = ngx_http_srcache_set_content_length_header(sr,[m
[31m-                                                 parsed_sr->content_length_n);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_add_copy_chain(ngx_pool_t *pool, ngx_chain_t **chain,[m
[31m-    ngx_chain_t *in, unsigned *plast)[m
[31m-{[m
[31m-    ngx_chain_t     *cl, **ll;[m
[31m-    size_t           len;[m
[31m-[m
[31m-    ll = chain;[m
[31m-[m
[31m-    for (cl = *chain; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    *plast = 0;[m
[31m-[m
[31m-    while (in) {[m
[31m-        cl = ngx_alloc_chain_link(pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->last_buf || in->buf->last_in_chain) {[m
[31m-            *plast = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_special(in->buf)) {[m
[31m-            cl->buf = in->buf;[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_buf_in_memory(in->buf)) {[m
[31m-                len = ngx_buf_size(in->buf);[m
[31m-                cl->buf = ngx_create_temp_buf(pool, len);[m
[31m-                if (cl->buf == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                dd("buf: %.*s", (int) len, in->buf->pos);[m
[31m-[m
[31m-                cl->buf->last = ngx_copy(cl->buf->pos, in->buf->pos, len);[m
[31m-[m
[31m-            } else {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_post_request_at_head(ngx_http_request_t *r,[m
[31m-    ngx_http_posted_request_t *pr)[m
[31m-{[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-        if (pr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = r->main->posted_requests;[m
[31m-    r->main->posted_requests = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_set_content_length_header(ngx_http_request_t *r, off_t len)[m
[31m-{[m
[31m-    ngx_table_elt_t                 *h, *header;[m
[31m-    u_char                          *p;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_http_request_t              *pr;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->key = ngx_http_srcache_content_length_header_key;[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    r->headers_in.content_length = h;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->value.data = p;[m
[31m-[m
[31m-    h->value.len = ngx_sprintf(h->value.data, "%O", len) - h->value.data;[m
[31m-[m
[31m-    h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash(ngx_hash(ngx_hash(ngx_hash([m
[31m-            ngx_hash(ngx_hash(ngx_hash(ngx_hash(ngx_hash([m
[31m-            ngx_hash('c', 'o'), 'n'), 't'), 'e'), 'n'), 't'), '-'), 'l'), 'e'),[m
[31m-            'n'), 'g'), 't'), 'h');[m
[31m-[m
[31m-    dd("r content length: %.*s",[m
[31m-       (int) r->headers_in.content_length->value.len,[m
[31m-       r->headers_in.content_length->value.data);[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* forward the parent request's all other request headers */[m
[31m-[m
[31m-    part = &pr->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len == sizeof("Content-Length") - 1[m
[31m-            && ngx_strncasecmp(header[i].key.data,[m
[31m-                               (u_char *) "Content-Length",[m
[31m-                               sizeof("Content-Length") - 1) == 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        h = ngx_list_push(&r->headers_in.headers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *h = header[i];[m
[31m-    }[m
[31m-[m
[31m-    /* XXX maybe we should set those built-in header slot in[m
[31m-     * ngx_http_headers_in_t too? */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_request_no_cache(ngx_http_request_t *r, unsigned *no_store)[m
[31m-{[m
[31m-    ngx_table_elt_t                 *h;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    u_char                          *p;[m
[31m-    u_char                          *last;[m
[31m-    ngx_uint_t                       i;[m
[31m-    unsigned                         no_cache;[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    *no_store = 0;[m
[31m-    no_cache = 0;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].key.len == sizeof("Cache-Control") - 1[m
[31m-            && ngx_strncasecmp(h[i].key.data, (u_char *) "Cache-Control",[m
[31m-                               sizeof("Cache-Control") - 1) == 0)[m
[31m-        {[m
[31m-            p = h[i].value.data;[m
[31m-            last = p + h[i].value.len;[m
[31m-[m
[31m-            if (!*no_store[m
[31m-                && ngx_strlcasestrn(p, last, (u_char *) "no-store", 8 - 1)[m
[31m-                   != NULL)[m
[31m-            {[m
[31m-                *no_store = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strlcasestrn(p, last, (u_char *) "no-cache", 8 - 1) != NULL)[m
[31m-            {[m
[31m-                no_cache = 1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].key.len == sizeof("Pragma") - 1[m
[31m-            && ngx_strncasecmp(h[i].key.data, (u_char *) "Pragma",[m
[31m-                               sizeof("Pragma") - 1) == 0)[m
[31m-        {[m
[31m-            p = h[i].value.data;[m
[31m-            last = p + h[i].value.len;[m
[31m-[m
[31m-            if (ngx_strlcasestrn(p, last, (u_char *) "no-cache", 8 - 1) != NULL)[m
[31m-            {[m
[31m-                no_cache = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return no_cache ? NGX_OK : NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_response_no_cache(ngx_http_request_t *r,[m
[31m-    ngx_http_srcache_loc_conf_t *conf, ngx_http_srcache_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_table_elt_t   **ccp;[m
[31m-    ngx_table_elt_t    *h;[m
[31m-    ngx_uint_t          i;[m
[31m-    u_char             *p, *last;[m
[31m-    ngx_int_t           n;[m
[31m-    time_t              expires;[m
[31m-[m
[31m-    dd("checking response cache control settings");[m
[31m-[m
[31m-    ccp = r->headers_out.cache_control.elts;[m
[31m-[m
[31m-    if (ccp == NULL) {[m
[31m-        goto check_expires;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < r->headers_out.cache_control.nelts; i++) {[m
[31m-        if (!ccp[i]->hash) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p = ccp[i]->value.data;[m
[31m-        last = p + ccp[i]->value.len;[m
[31m-[m
[31m-        if (!conf->store_private[m
[31m-            && ngx_strlcasestrn(p, last, (u_char *) "private", 7 - 1) != NULL)[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!conf->store_no_store[m
[31m-            && ngx_strlcasestrn(p, last, (u_char *) "no-store", 8 - 1) != NULL)[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!conf->store_no_cache[m
[31m-            && ngx_strlcasestrn(p, last, (u_char *) "no-cache", 8 - 1) != NULL)[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->valid_sec != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_strlcasestrn(p, last, (u_char *) "max-age=", 8 - 1);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        for (p += 8; p < last; p++) {[m
[31m-            if (*p == ',' || *p == ';' || *p == ' ') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (*p >= '0' && *p <= '9') {[m
[31m-                n = n * 10 + *p - '0';[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ctx->valid_sec = ngx_time() + n;[m
[31m-    }[m
[31m-[m
[31m-check_expires:[m
[31m-[m
[31m-    dd("valid_sec after processing cache-control: %d", (int) ctx->valid_sec);[m
[31m-[m
[31m-    if (ctx->valid_sec == 0) {[m
[31m-        h = r->headers_out.expires;[m
[31m-[m
[31m-        dd("expires header: %p", h);[m
[31m-[m
[31m-        if (h != NULL && h->hash != 0) {[m
[31m-            expires = ngx_http_parse_time(h->value.data, h->value.len);[m
[31m-[m
[31m-            if (expires == NGX_ERROR || expires <= ngx_time()) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ctx->valid_sec = expires;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_process_status_line(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_srcache_ctx_t      *ctx;[m
[31m-    ngx_http_request_t          *pr;[m
[31m-    ngx_http_srcache_loc_conf_t *conf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, b, &ctx->status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "srcache_fetch: cache sent invalid status line");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "srcache_fetch status line done");[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-    pr->headers_out.status = ctx->status.code;[m
[31m-[m
[31m-    ctx->process_header = ngx_http_srcache_process_header;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(pr, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    dd("header buffer size: %d", (int) conf->header_buf_size);[m
[31m-[m
[31m-    ctx->header_buf = ngx_create_temp_buf(r->pool, conf->header_buf_size);[m
[31m-    if (ctx->header_buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (b->pos == b->last) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_srcache_process_header(r, b);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_process_header(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_table_elt_t                 header;[m
[31m-    ngx_http_srcache_ctx_t         *ctx;[m
[31m-    off_t                           len, rest;[m
[31m-    unsigned                        truncate;[m
[31m-    u_char                         *p;[m
[31m-    ngx_http_srcache_header_t      *hh;[m
[31m-    ngx_http_srcache_main_conf_t   *smcf;[m
[31m-[m
[31m-    smcf = ngx_http_get_module_main_conf(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        len = b->last - b->pos;[m
[31m-        rest = ctx->header_buf->end - ctx->header_buf->last;[m
[31m-[m
[31m-        dd("len: %d, rest: %d", (int) len, (int) rest);[m
[31m-[m
[31m-        if (len > rest) {[m
[31m-            len = rest;[m
[31m-            truncate = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            truncate = 0;[m
[31m-        }[m
[31m-[m
[31m-        ctx->header_buf->last = ngx_copy(ctx->header_buf->last, b->pos,[m
[31m-                                         (size_t) len);[m
[31m-[m
[31m-        p = ctx->header_buf->pos;[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, ctx->header_buf, 1);[m
[31m-[m
[31m-        b->pos += ctx->header_buf->pos - p;[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            ngx_memzero(&header, sizeof(ngx_table_elt_t));[m
[31m-[m
[31m-            header.hash = r->header_hash;[m
[31m-[m
[31m-            header.key.len = r->header_name_end - r->header_name_start;[m
[31m-            header.value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            header.key.data = ngx_pnalloc(r->pool,[m
[31m-                                          header.key.len + 1[m
[31m-                                          + header.value.len + 1[m
[31m-                                          + header.key.len);[m
[31m-[m
[31m-            if (header.key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            header.value.data = header.key.data + header.key.len + 1;[m
[31m-            header.lowcase_key = header.key.data + header.key.len + 1[m
[31m-                                 + header.value.len + 1;[m
[31m-[m
[31m-            ngx_cpystrn(header.key.data, r->header_name_start,[m
[31m-                        header.key.len + 1);[m
[31m-[m
[31m-            ngx_cpystrn(header.value.data, r->header_start,[m
[31m-                        header.value.len + 1);[m
[31m-[m
[31m-            if (header.key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(header.lowcase_key, r->lowcase_header,[m
[31m-                           header.key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(header.lowcase_key, header.key.data, header.key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&smcf->headers_in_hash, header.hash,[m
[31m-                               header.lowcase_key, header.key.len);[m
[31m-[m
[31m-            if (hh) {[m
[31m-                if (hh->handler(r->parent, &header, hh->offset) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                if (ngx_http_srcache_process_header_line(r->parent, &header, 0)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "srcache_fetch header: \"%V: %V\"",[m
[31m-                           &header.key, &header.value);[m
[31m-[m
[31m-            ctx->header_buf->pos = ctx->header_buf->start;[m
[31m-            ctx->header_buf->last = ctx->header_buf->start;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ctx->header_buf->pos = ctx->header_buf->start;[m
[31m-            ctx->header_buf->last = ctx->header_buf->start;[m
[31m-            ngx_pfree(r->pool, ctx->header_buf->start);[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "srcache_fetch header done");[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            if (truncate) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "srcache_fetch: header buffer overflown "[m
[31m-                              "(maybe you should consider increasing "[m
[31m-                              "srcache_header_buffer_size?)");[m
[31m-[m
[31m-                ctx->header_buf->pos = ctx->header_buf->start;[m
[31m-                ctx->header_buf->last = ctx->header_buf->start;[m
[31m-                ngx_pfree(r->pool, ctx->header_buf->start);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ctx->header_buf->pos = ctx->header_buf->start;[m
[31m-        ctx->header_buf->last = ctx->header_buf->start;[m
[31m-        ngx_pfree(r->pool, ctx->header_buf->start);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "srcache_fetch: cache sent invalid header");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_store_response_header(ngx_http_request_t *r,[m
[31m-    ngx_http_srcache_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    size_t                   len;[m
[31m-    ngx_buf_t               *b;[m
[31m-    ngx_uint_t               status;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_str_t               *status_line;[m
[31m-    ngx_list_part_t         *part;[m
[31m-    ngx_table_elt_t         *header;[m
[31m-[m
[31m-    u_char                   buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];[m
[31m-[m
[31m-    ngx_http_srcache_loc_conf_t    *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    dd("request: %p, uri: %.*s", r, (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    len = sizeof("HTTP/1.x ") - 1 + sizeof(CRLF) - 1[m
[31m-          /* the end of the header */[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    if (r->headers_out.status_line.len) {[m
[31m-        dd("status line defined");[m
[31m-        len += r->headers_out.status_line.len;[m
[31m-        status_line = &r->headers_out.status_line;[m
[31m-        status = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("status line not defined");[m
[31m-[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-        if (status >= NGX_HTTP_OK[m
[31m-            && status < NGX_HTTP_LAST_LEVEL_200)[m
[31m-        {[m
[31m-            /* 2XX */[m
[31m-[m
[31m-            status -= NGX_HTTP_OK;[m
[31m-            dd("status: %d", (int) status);[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_MOVED_PERMANENTLY[m
[31m-                   && status < NGX_HTTP_LAST_LEVEL_300)[m
[31m-        {[m
[31m-            /* 3XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-                r->header_only = 1;[m
[31m-            }[m
[31m-[m
[31m-            status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_BAD_REQUEST[m
[31m-                   && status < NGX_HTTP_LAST_LEVEL_400)[m
[31m-        {[m
[31m-            /* 4XX */[m
[31m-            status = status - NGX_HTTP_BAD_REQUEST[m
[31m-                            + NGX_HTTP_LEVEL_200[m
[31m-                            + NGX_HTTP_LEVEL_300;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                   && status < NGX_HTTP_LAST_LEVEL_500)[m
[31m-        {[m
[31m-            /* 5XX */[m
[31m-            status = status - NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                            + NGX_HTTP_LEVEL_200[m
[31m-                            + NGX_HTTP_LEVEL_300[m
[31m-                            + NGX_HTTP_LEVEL_400;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else {[m
[31m-            len += NGX_INT_T_LEN;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!conf->hide_content_type && r->headers_out.content_type.len) {[m
[31m-        len += sizeof("Content-Type: ") - 1[m
[31m-               + r->headers_out.content_type.len + 2;[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!conf->hide_last_modified) {[m
[31m-        if (r->headers_out.last_modified_time != -1) {[m
[31m-            if (r->headers_out.status != NGX_HTTP_OK[m
[31m-                && r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT[m
[31m-                && r->headers_out.status != NGX_HTTP_NOT_MODIFIED[m
[31m-                && r->headers_out.status != NGX_HTTP_NO_CONTENT)[m
[31m-            {[m
[31m-                r->headers_out.last_modified_time = -1;[m
[31m-                r->headers_out.last_modified = NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("last modified time: %d", (int) r->headers_out.last_modified_time);[m
[31m-[m
[31m-        if (r->headers_out.last_modified == NULL[m
[31m-            && r->headers_out.last_modified_time != -1)[m
[31m-        {[m
[31m-            (void) ngx_http_time(buf, r->headers_out.last_modified_time);[m
[31m-[m
[31m-            len += sizeof("Last-Modified: ") - 1 + sizeof(buf) + 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->allow_ranges) {[m
[31m-        len += sizeof("X-SRCache-Allow-Ranges: 1") - 1 + 2;[m
[31m-    }[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_hash_find(&conf->hide_headers_hash, header[i].hash,[m
[31m-                          header[i].lowcase_key, header[i].key.len))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len += header[i].key.len + sizeof(": ") - 1 + header[i].value.len[m
[31m-               + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* "HTTP/1.x " */[m
[31m-    b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1);[m
[31m-[m
[31m-    /* status line */[m
[31m-    if (status_line) {[m
[31m-        b->last = ngx_copy(b->last, status_line->data, status_line->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_sprintf(b->last, "%ui", status);[m
[31m-    }[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (!conf->hide_content_type && r->headers_out.content_type.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Content-Type: ",[m
[31m-                             sizeof("Content-Type: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.content_type.data,[m
[31m-                           r->headers_out.content_type.len);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            b->last = ngx_cpymem(b->last, "; charset=",[m
[31m-                                 sizeof("; charset=") - 1);[m
[31m-            b->last = ngx_copy(b->last, r->headers_out.charset.data,[m
[31m-                               r->headers_out.charset.len);[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (!conf->hide_last_modified[m
[31m-        && r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        b->last = ngx_cpymem(b->last, "Last-Modified: ",[m
[31m-                             sizeof("Last-Modified: ") - 1);[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, buf, sizeof(buf));[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->allow_ranges) {[m
[31m-        b->last = ngx_cpymem(b->last, "X-SRCache-Allow-Ranges: 1\r\n",[m
[31m-                             sizeof("X-SRCache-Allow-Ranges: 1\r\n") - 1);[m
[31m-    }[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("header hash: %lu, hash lc: %lu", (unsigned long) header[i].hash,[m
[31m-           (unsigned long) ngx_hash_key_lc(header[i].key.data,[m
[31m-                                           header[i].key.len));[m
[31m-[m
[31m-        if (ngx_hash_find(&conf->hide_headers_hash, header[i].hash,[m
[31m-                          header[i].lowcase_key, header[i].key.len))[m
[31m-        {[m
[31m-            dd("skipped header key: %.*s", (int) header[i].key.len,[m
[31m-               header[i].key.data);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("header not skipped");[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-        *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].value.data, header[i].value.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "srcache store header %*s", (size_t) (b->last - b->pos),[m
[31m-                   b->pos);[m
[31m-[m
[31m-    /* the end of HTTP header */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "srcache_fetch: buffer error when serializing the "[m
[31m-                      "response header: %O left", (off_t) (b->last - b->end));[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    ctx->body_to_cache = cl;[m
[31m-[m
[31m-    ctx->response_length += len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_hide_headers_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_srcache_loc_conf_t *conf, ngx_http_srcache_loc_conf_t *prev,[m
[31m-    ngx_str_t *default_hide_headers, ngx_hash_init_t *hash)[m
[31m-{[m
[31m-    ngx_str_t       *h;[m
[31m-    ngx_uint_t       i, j;[m
[31m-    ngx_array_t      hide_headers;[m
[31m-    ngx_hash_key_t  *hk;[m
[31m-[m
[31m-    if (conf->hide_headers == NGX_CONF_UNSET_PTR[m
[31m-        && conf->pass_headers == NGX_CONF_UNSET_PTR)[m
[31m-    {[m
[31m-        conf->hide_headers_hash = prev->hide_headers_hash;[m
[31m-[m
[31m-        if (conf->hide_headers_hash.buckets) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        conf->hide_headers = prev->hide_headers;[m
[31m-        conf->pass_headers = prev->pass_headers;[m
[31m-        conf->hide_content_type = prev->hide_content_type;[m
[31m-        conf->hide_last_modified = prev->hide_last_modified;[m
[31m-[m
[31m-    } else {[m
[31m-        if (conf->hide_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->hide_headers = prev->hide_headers;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->pass_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->pass_headers = prev->pass_headers;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("init hide headers");[m
[31m-[m
[31m-    if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (h = default_hide_headers; h->len; h++) {[m
[31m-        hk = ngx_array_push(&hide_headers);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = *h;[m
[31m-        hk->key_hash = ngx_hash_key_lc(h->data, h->len);[m
[31m-        hk->value = (void *) 1;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->hide_headers != NGX_CONF_UNSET_PTR) {[m
[31m-        dd("hide headers not empty");[m
[31m-[m
[31m-        h = conf->hide_headers->elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->hide_headers->nelts; i++) {[m
[31m-[m
[31m-            hk = hide_headers.elts;[m
[31m-[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    goto exist;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hk = ngx_array_push(&hide_headers);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key = h[i];[m
[31m-            hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-            if (h[i].len == sizeof("Last-Modified") - 1[m
[31m-                && ngx_strncasecmp(h[i].data, (u_char *) "Last-Modified",[m
[31m-                                   sizeof("Last-Modified") - 1)[m
[31m-                == 0)[m
[31m-            {[m
[31m-                conf->hide_last_modified = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (h[i].len == sizeof("Content-Type") - 1[m
[31m-                && ngx_strncasecmp(h[i].data, (u_char *) "Content-Type",[m
[31m-                                   sizeof("Content-Type") - 1) == 0)[m
[31m-            {[m
[31m-                conf->hide_content_type = 1;[m
[31m-            }[m
[31m-[m
[31m-            dd("adding header to hide headers: %.*s", (int) h[i].len,[m
[31m-               h[i].data);[m
[31m-[m
[31m-        exist:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pass_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->pass_headers->elts;[m
[31m-        hk = hide_headers.elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->pass_headers->nelts; i++) {[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-[m
[31m-                if (hk[j].key.data == NULL) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (h[i].len == sizeof("Content-Type") - 1[m
[31m-                    && ngx_strncasecmp(h[i].data, (u_char *) "Content-Type",[m
[31m-                                       sizeof("Content-Type") - 1) == 0)[m
[31m-                {[m
[31m-                    conf->hide_content_type = 0;[m
[31m-                }[m
[31m-[m
[31m-                if (h[i].len == sizeof("Last-Modified") - 1[m
[31m-                    && ngx_strncasecmp(h[i].data, (u_char *) "Last-Modified",[m
[31m-                                       sizeof("Last-Modified") - 1) == 0)[m
[31m-                {[m
[31m-                    conf->hide_last_modified = 0;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    hk[j].key.data = NULL;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hash->hash = &conf->hide_headers_hash;[m
[31m-    hash->key = ngx_hash_key_lc;[m
[31m-    hash->pool = cf->pool;[m
[31m-    hash->temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_cmp_int(const void *one, const void *two)[m
[31m-{[m
[31m-    const ngx_int_t           *a = one;[m
[31m-    const ngx_int_t           *b = two;[m
[31m-[m
[31m-    return (*a < *b);[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_util.h[m
[1mdeleted file mode 100644[m
[1mindex 907151f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SRCACHE_UTIL_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SRCACHE_UTIL_H_INCLUDED_[m
[31m-[m
[31m-#include "ngx_http_srcache_filter_module.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_srcache_method_name(m) { sizeof(m) - 1, (u_char *) m " " }[m
[31m-[m
[31m-#define ngx_http_srcache_strcmp_const(a, b) \[m
[31m-        ngx_strncmp(a, b, sizeof(b) - 1)[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_srcache_content_length_header_key;[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_srcache_get_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_put_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_post_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_head_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_copy_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_move_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_lock_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_mkcol_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_trace_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_delete_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_unlock_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_options_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_propfind_method;[m
[31m-extern ngx_str_t  ngx_http_srcache_proppatch_method;[m
[31m-[m
[31m-ngx_int_t ngx_http_srcache_parse_method_name(ngx_str_t **method_name_ptr);[m
[31m-void ngx_http_srcache_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in);[m
[31m-ngx_int_t ngx_http_srcache_adjust_subrequest(ngx_http_request_t *sr,[m
[31m-        ngx_http_srcache_parsed_request_t *parsed_sr);[m
[31m-ngx_int_t ngx_http_srcache_add_copy_chain(ngx_pool_t *pool,[m
[31m-        ngx_chain_t **chain, ngx_chain_t *in, unsigned *plast);[m
[31m-ngx_int_t ngx_http_srcache_post_request_at_head(ngx_http_request_t *r,[m
[31m-        ngx_http_posted_request_t *pr);[m
[31m-ngx_int_t ngx_http_srcache_request_no_cache(ngx_http_request_t *r,[m
[31m-        unsigned *no_store);[m
[31m-ngx_int_t ngx_http_srcache_response_no_cache(ngx_http_request_t *r,[m
[31m-        ngx_http_srcache_loc_conf_t *conf, ngx_http_srcache_ctx_t *ctx);[m
[31m-ngx_int_t ngx_http_srcache_process_status_line(ngx_http_request_t *r,[m
[31m-        ngx_buf_t *b);[m
[31m-ngx_int_t ngx_http_srcache_process_header(ngx_http_request_t *r,[m
[31m-        ngx_buf_t *b);[m
[31m-ngx_int_t ngx_http_srcache_store_response_header(ngx_http_request_t *r,[m
[31m-        ngx_http_srcache_ctx_t *ctx);[m
[31m-ngx_int_t ngx_http_srcache_hide_headers_hash(ngx_conf_t *cf,[m
[31m-        ngx_http_srcache_loc_conf_t *conf, ngx_http_srcache_loc_conf_t *prev,[m
[31m-        ngx_str_t *default_hide_headers, ngx_hash_init_t *hash);[m
[31m-ngx_int_t ngx_http_srcache_cmp_int(const void *one, const void *two);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SRCACHE_UTIL_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_var.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_var.c[m
[1mdeleted file mode 100644[m
[1mindex 16b1f4f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_var.c[m
[1m+++ /dev/null[m
[36m@@ -1,180 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_var.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_srcache_expire_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_srcache_fetch_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_srcache_store_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_srcache_fetch_status[] = {[m
[31m-    ngx_string("BYPASS"),[m
[31m-    ngx_string("MISS"),[m
[31m-    ngx_string("HIT")[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_srcache_store_status[] = {[m
[31m-    ngx_string("BYPASS"),[m
[31m-    ngx_string("STORE"),[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t ngx_http_srcache_variables[] = {[m
[31m-[m
[31m-    { ngx_string("srcache_expire"), NULL,[m
[31m-      ngx_http_srcache_expire_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("srcache_fetch_status"), NULL,[m
[31m-      ngx_http_srcache_fetch_status_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("srcache_store_status"), NULL,[m
[31m-      ngx_http_srcache_store_status_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_expire_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_srcache_ctx_t       *ctx;[m
[31m-    u_char                       *p;[m
[31m-    time_t                        expire;[m
[31m-    ngx_http_srcache_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 1;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (!ctx || !ctx->store_response) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->valid_sec == 0) {[m
[31m-        expire = conf->default_expire;[m
[31m-[m
[31m-    } else {[m
[31m-        expire = ctx->valid_sec - ngx_time();[m
[31m-    }[m
[31m-[m
[31m-    if (conf->max_expire > 0 && expire > conf->max_expire) {[m
[31m-        expire = conf->max_expire;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_TIME_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-    p =  ngx_sprintf(p, "%T", expire);[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_fetch_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t                    status;[m
[31m-    ngx_http_srcache_ctx_t       *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        status = NGX_HTTP_SRCACHE_FETCH_BYPASS;[m
[31m-[m
[31m-    } else if (ctx->from_cache) {[m
[31m-        status = NGX_HTTP_SRCACHE_FETCH_HIT;[m
[31m-[m
[31m-    } else if (ctx->issued_fetch_subrequest) {[m
[31m-        status = NGX_HTTP_SRCACHE_FETCH_MISS;[m
[31m-[m
[31m-    } else {[m
[31m-        status = NGX_HTTP_SRCACHE_FETCH_BYPASS;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 1;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->len = ngx_http_srcache_fetch_status[status].len;[m
[31m-    v->data = ngx_http_srcache_fetch_status[status].data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_srcache_store_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t                    status;[m
[31m-    ngx_http_srcache_ctx_t       *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_srcache_filter_module);[m
[31m-[m
[31m-    if (ctx && ctx->store_response) {[m
[31m-        status = NGX_HTTP_SRCACHE_STORE_STORE;[m
[31m-[m
[31m-    } else {[m
[31m-        status = NGX_HTTP_SRCACHE_STORE_BYPASS;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 1;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->len = ngx_http_srcache_store_status[status].len;[m
[31m-    v->data = ngx_http_srcache_store_status[status].data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_srcache_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_srcache_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_var.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_var.h[m
[1mdeleted file mode 100644[m
[1mindex 151561d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/src/ngx_http_srcache_var.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SRCACHE_VAR_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SRCACHE_VAR_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_srcache_filter_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_srcache_add_variables(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SRCACHE_VAR_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex b7bf501..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,159 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-[m
[31m-    upstream pg {[m
[31m-        postgres_server 127.0.0.1:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: cats - drop table - pg[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   pg;[m
[31m-        postgres_query  "DROP TABLE IF EXISTS cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: cats - create table - pg[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   pg;[m
[31m-        postgres_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: cats - insert value - pg[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   pg;[m
[31m-        postgres_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: cats - insert value - pg[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   pg;[m
[31m-        postgres_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/access.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/access.t[m
[1mdeleted file mode 100644[m
[1mindex c9f9161..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/access.t[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        #deny all;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        deny all;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 99307d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,669 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks() + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic fetch[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc;[m
[31m-        srcache_store PUT /memc;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo';[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: internal redirect in fetch subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /fetch {[m
[31m-        echo_exec /bar;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        default_type 'text/css';[m
[31m-        echo "HTTP/1.1 200 OK\r\nContent-Type: text/css\r\n\r\nbar";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 4[m
[31m---- response_body[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: internal redirect in main request (no caching happens) (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo_exec /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        default_type text/javascript;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/javascript[m
[31m-! Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: internal redirect happends in the main request (cache miss as well)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        #srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: internal redirect in store subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store GET /store;[m
[31m-[m
[31m-        echo blah;[m
[31m-    }[m
[31m-    location /store {[m
[31m-        echo_exec /set-value;[m
[31m-    }[m
[31m-    location /set-value {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_value "HTTP/1.0 201 Created\r\nContent-Type: text/blah\r\n\r\nbar";[m
[31m-        set $memc_cmd set;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: internal redirect in store subrequest (check if value has been stored)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-[m
[31m-        echo blah;[m
[31m-    }[m
[31m-    location /fetch {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/blah[m
[31m-Content-Length: 3[m
[31m---- response_body chop[m
[31m-bar[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: skipped in subrequests[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 128.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: multi-buffer response resulted in incorrect request length header[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store POST /store;[m
[31m-[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.WARN, "srcache_store: request Content-Length: ", ngx.var.http_content_length)[m
[31m-            -- local body = ngx.req.get_body_data()[m
[31m-            -- ngx.log(ngx.WARN, "srcache_store: request body len: ", #body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- error_log[m
[31m-srcache_store: request Content-Length: 55[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: read timed out when receiving upstream response body in srcache_fetch[m
[31m---- config[m
[31m-    memc_read_timeout 200ms;[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        #srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo I do like you;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key 'foo';[m
[31m-        #set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:19112; #$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_srcache_fetch_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-^finalize: -4[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=504[m
[31m-finalize: 0[m
[31m-post subreq: rc=0, status=200[m
[31m-finalize: 0$[m
[31m-[m
[31m---- tcp_listen: 19112[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"VALUE foo 0 1024\r\nHTTP/1.1 200 OK\r\n\r\nhello world"[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-I do like you[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exit(ngx.ERROR) in srcache_fetch[m
[31m---- config[m
[31m-    memc_read_timeout 200ms;[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        srcache_fetch GET /sub;[m
[31m-        #srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo I do like you;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap2[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_srcache_fetch_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-I do like you[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exit(500) in srcache_fetch[m
[31m---- config[m
[31m-    memc_read_timeout 200ms;[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        srcache_fetch GET /sub;[m
[31m-        #srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo I do like you;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap2[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_srcache_fetch_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-I do like you[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: upstream closes the connection prematurely in srcache_fetch[m
[31m---- config[m
[31m-    memc_read_timeout 200ms;[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        #srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo I do like you;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key 'foo';[m
[31m-        #set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:19112; #$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_srcache_fetch_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m---- stap_out_like[m
[31m-finalize: -4[m
[31m-(?:upstream fin req: error=0 eof=1 rc=502[m
[31m-finalize: 0[m
[31m-post subreq: rc=0, status=200[m
[31m-|conn err: \d+: writev\(\) failed[m
[31m-upstream fin req: error=0 eof=0 rc=502[m
[31m-finalize: (?:0|502)[m
[31m-post subreq: rc=(?:0|502), status=(?:0|200)[m
[31m-(?:finalize: 0[m
[31m-)?)?finalize: 0[m
[31m-[m
[31m---- tcp_listen: 19112[m
[31m---- tcp_reply eval[m
[31m-"VALUE foo 0 1024\r\nHTTP/1.1 200 OK\r\n\r\nhello world"[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-I do like you[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: exit(ngx.ERROR) in srcache_store[m
[31m---- config[m
[31m-    memc_read_timeout 200ms;[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        srcache_store PUT /sub;[m
[31m-[m
[31m-        echo I do like you;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_srcache_store_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-finalize: 0[m
[31m-finalize: -1[m
[31m-post subreq: rc=-1, status=0[m
[31m-finalize: 0[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-I do like you[m
[31m---- error_log[m
[31m-srcache_store subrequest failed: rc=-1 status=0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: exit(500) in srcache_store[m
[31m---- config[m
[31m-    memc_read_timeout 200ms;[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        srcache_store PUT /sub;[m
[31m-[m
[31m-        echo I do like you;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_srcache_store_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-finalize: 0[m
[31m-finalize: 500[m
[31m-post subreq: rc=500, status=0[m
[31m-finalize: 0[m
[31m-[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-I do like you[m
[31m---- error_log[m
[31m-srcache_store subrequest failed: rc=500 status=0,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: skipped in subrequests[m
[31m---- config[m
[31m-    location /t {[m
[31m-        srcache_fetch GET /f;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /f {[m
[31m-        echo "HTTP/1.1 200 OK\r\n\r\ncached data";[m
[31m-        body_filter_by_lua '[m
[31m-            if ngx.arg[2] then[m
[31m-                ngx.arg[2] = false[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-srcache_fetch: cache sent truncated response body[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: store subrequest failure[m
[31m---- http_config[m
[31m-    upstream local {[m
[31m-        server localhost:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    memc_connect_timeout 100ms;[m
[31m-    memc_send_timeout 100ms;[m
[31m-    memc_read_timeout 100ms;[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 1d;[m
[31m-        memc_pass local;[m
[31m-    }[m
[31m-[m
[31m-    location = /tblah {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /tblah[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-variable "$memc_exptime" takes invalid value: 1d,[m
[31m-srcache_store subrequest failed: rc=400 status=0,[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/conditional-get.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/conditional-get.t[m
[1mdeleted file mode 100644[m
[1mindex 367731a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/conditional-get.t[m
[1m+++ /dev/null[m
[36m@@ -1,304 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(100);[m
[31m-[m
[31m-plan tests => repeat_each() * (6 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-#$ENV{TEST_NGINX_MYSQL_PORT}     ||= 3306;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Last-Modified[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cache miss[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type application/json;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 3000;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m-Last-Modified: Thu, 10 May 2012 07:50:59 GMT[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cache hit[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 3000;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m-Content-Length: 6[m
[31m-Last-Modified: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cache hit (I-M-S conditional GET, exact)[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 3000;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m-!Content-Length[m
[31m-Last-Modified: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- stap2[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("r content handler: %s\n", usymname($r->content_handler))[m
[31m-}[m
[31m-[m
[31m---- error_code: 304[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: cache hit (I-M-S conditional GET, exact failed)[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 3000;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:51:00 GMT[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m-Content-Length: 6[m
[31m-Last-Modified: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: cache hit (I-M-S conditional GET, exact failed, before suceeded)[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        if_modified_since before;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 3000;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:51:00 GMT[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m-!Content-Length[m
[31m-Last-Modified: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m---- error_code: 304[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: cache hit (I-U-S conditional GET, 412)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 3000;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Thu, 10 May 2012 07:50:58 GMT[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m-Content-Length: 182[m
[31m-!Last-Modified[m
[31m---- response_body_like: 412 Precondition Failed[m
[31m---- error_code: 412[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: cache hit (I-U-S conditional GET, precondition succeeded)[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 3000;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m-Content-Length: 6[m
[31m-Last-Modified: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: cache hit (I-U-S conditional GET, precondition succeeded, newer)[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 3000;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Thu, 10 May 2012 07:51:00 GMT[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m-Content-Length: 6[m
[31m-Last-Modified: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/content-length.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/content-length.t[m
[1mdeleted file mode 100644[m
[1mindex 9905e1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/content-length.t[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 - 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/gate;[m
[31m-    }[m
[31m-[m
[31m-    location = /gate {[m
[31m-        default_type text/css;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 10[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 10[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-srcache_store: subrequest returned status[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/content-type.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/content-type.t[m
[1mdeleted file mode 100644[m
[1mindex 6e72ba8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/content-type.t[m
[1m+++ /dev/null[m
[36m@@ -1,91 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (Set-Cookie and Proxy-Authenticate hide by default)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        charset UTF-8;[m
[31m-        charset_types application/x-javascript;[m
[31m-        default_type application/json;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?c=bar[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript; charset=UTF-8[m
[31m-Content-Length:[m
[31m---- response_body chop[m
[31m-bar(hello[m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        charset UTF-8;[m
[31m-        charset_types application/x-javascript;[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?c=bar[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript; charset=UTF-8[m
[31m-Content-Length: [m
[31m-!Set-Cookie[m
[31m-!Proxy-Authenticate[m
[31m---- response_body chop[m
[31m-bar(hello[m
[31m-);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/disk.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/disk.t[m
[1mdeleted file mode 100644[m
[1mindex 73da17c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/disk.t[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(100);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cache miss[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- response_headers[m
[31m-Accept-Ranges: bytes[m
[31m---- response_body_like: It works![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cache hit[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- response_body_like: It works![m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/drizzle-main.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/drizzle-main.t[m
[1mdeleted file mode 100644[m
[1mindex f725f65..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/drizzle-main.t[m
[1m+++ /dev/null[m
[36m@@ -1,106 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(100);[m
[31m-[m
[31m-plan tests => repeat_each() * 4 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT}     ||= 3306;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cache miss[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cache hit[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query 'invalid sql here';[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/drizzle-sub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/drizzle-sub.t[m
[1mdeleted file mode 100644[m
[1mindex 1845adb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/drizzle-sub.t[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket skip_all => 'subrequests not working';[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT}     ||= 3306;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /cats dir=asc;[m
[31m-        echo_location /cats dir=desc;[m
[31m-    }[m
[31m-[m
[31m-    location /cats {[m
[31m-        internal;[m
[31m-[m
[31m-        srcache_fetch GET /memc $uri-$arg_dir;[m
[31m-        srcache_store PUT /memc $uri-$arg_dir;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query 'select * from cats order by id $arg_dir';[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][{"id":3,"name":"bob"},{"id":2,"name":null}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /cats dir=asc;[m
[31m-        echo_location /cats dir=desc;[m
[31m-    }[m
[31m-[m
[31m-    location /cats {[m
[31m-        internal;[m
[31m-[m
[31m-        srcache_fetch GET /memc $uri-$arg_dir;[m
[31m-        srcache_store PUT /memc $uri-$arg_dir;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query 'invalid sql here';[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][{"id":3,"name":"bob"},{"id":2,"name":null}][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/empty-resp.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/empty-resp.t[m
[1mdeleted file mode 100644[m
[1mindex d30bd4e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/empty-resp.t[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(100);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-#$ENV{TEST_NGINX_MYSQL_PORT}     ||= 3306;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cache miss[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type application/json;[m
[31m-[m
[31m-        echo -n '';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body:[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cache hit[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m-Content-Length: 0[m
[31m---- response_body:[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/err-page.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/err-page.t[m
[1mdeleted file mode 100644[m
[1mindex 26ba06a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/err-page.t[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch[m
[31m---- config[m
[31m-    location @err {[m
[31m-        echo "err";[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-        error_page 404 = @err;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-err[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: fetch again[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        error_page 404 = @err;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/etag.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/etag.t[m
[1mdeleted file mode 100644[m
[1mindex 0ed1734..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/etag.t[m
[1m+++ /dev/null[m
[36m@@ -1,187 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (5 * blocks() + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all (not using ngx_srcache)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["ETag"] = [["abcd1234"]][m
[31m-            ngx.header["Last-Modified"] = "Sat, 01 Mar 2014 01:02:38 GMT"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-        #echo hello;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-X-Fetch-Status: MISS[m
[31m-X-Store-Status: STORE[m
[31m-Last-Modified: Sat, 01 Mar 2014 01:02:38 GMT[m
[31m---- response_body[m
[31m-hello[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-srcache_store: subrequest returned status 201[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- more_headers[m
[31m-If-None-Match: "abcd1234"[m
[31m---- response_headers[m
[31m-X-Fetch-Status: HIT[m
[31m-X-Store-Status: BYPASS[m
[31m-ETag: "abcd1234"[m
[31m-Last-Modified: Sat, 01 Mar 2014 01:02:38 GMT[m
[31m---- response_body:[m
[31m---- error_code: 304[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all (not using ngx_srcache)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss, 304)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["ETag"] = [["abcd1234"]][m
[31m-            ngx.header["Last-Modified"] = "Sat, 01 Mar 2014 01:02:38 GMT"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-        #echo hello;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- more_headers[m
[31m-If-None-Match: "abcd1234"[m
[31m---- response_headers[m
[31m-Content-Length:[m
[31m-X-Fetch-Status: MISS[m
[31m-X-Store-Status: BYPASS[m
[31m-Last-Modified: Sat, 01 Mar 2014 01:02:38 GMT[m
[31m---- response_body:[m
[31m---- error_code: 304[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        #internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc?/foo[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex 77ccfdf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT}     ||= 3306;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cache miss[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-[m
[31m-    upstream mem_backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #keepalive 100 single;[m
[31m-    }[m
[31m---- config[m
[31m-    location /test1 {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        default_type text/css;[m
[31m-        charset UTF-8;[m
[31m-[m
[31m-        drizzle_query "select 1+2 as a;";[m
[31m-        drizzle_pass backend;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        #internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass mem_backend;[m
[31m-    }[m
[31m-[m
[31m-    location /pt1 {[m
[31m-        echo "pt1";[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        eval_subrequest_in_memory off;[m
[31m-        eval_override_content_type text/plain;[m
[31m-[m
[31m-        eval $res {[m
[31m-            #proxy_pass http://127.0.0.1:$server_port/test1;[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/pt1;[m
[31m-            #echo "ab";[m
[31m-        }[m
[31m-[m
[31m-        if ($res ~ '1') {[m
[31m-            #proxy_pass $scheme://127.0.0.1:$server_port/test1;[m
[31m-            #echo_exec /pi;[m
[31m-            echo_exec /test1;[m
[31m-            #echo_exec /pt1;[m
[31m-            #echo "okay $res";[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        echo "[$res] error";[m
[31m-    }[m
[31m-[m
[31m-    location /pi {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/test1;[m
[31m-        #echo hi;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /proxy[m
[31m---- response_body chomp[m
[31m-[{"a":3}][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/expire-var.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/expire-var.t[m
[1mdeleted file mode 100644[m
[1mindex b66ec79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/expire-var.t[m
[1m+++ /dev/null[m
[36m@@ -1,593 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 10);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss), exptime specified by Expires[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Cache-Control"] = "max-age=60"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: check memcached key[m
[31m---- config[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /store[m
[31m---- response_body chop[m
[31m-60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss), exptime specified by Expires[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time() + 12)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: check memcached key[m
[31m---- config[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /store[m
[31m---- response_body chop[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (cache miss), greater than exptime[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-        srcache_max_expire 11s;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time() + 12)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: check memcached key[m
[31m---- config[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /store[m
[31m---- response_body chop[m
[31m-11[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: basic fetch (cache miss), no greater than exptime[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-        srcache_max_expire 12s;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time() + 12)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: check memcached key[m
[31m---- config[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /store[m
[31m---- response_body chop[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: basic fetch (cache miss), less than exptime[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-        srcache_max_expire 13s;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time() + 12)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: check memcached key[m
[31m---- config[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /store[m
[31m---- response_body chop[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: basic fetch (cache miss), default expire[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-        srcache_max_expire 13s;[m
[31m-        srcache_default_expire 6s;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: check memcached key[m
[31m---- config[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /store[m
[31m---- response_body chop[m
[31m-6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: cache-control: max-age[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-        srcache_max_expire 13s;[m
[31m-        srcache_default_expire 6s;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "max-age=7"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: check memcached key[m
[31m---- config[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /store[m
[31m---- response_body chop[m
[31m-7[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: cache-control: max-age (greater than max_expire)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-        srcache_max_expire 6s;[m
[31m-        srcache_default_expire 5s;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "max-age=7"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: check memcached key[m
[31m---- config[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /store[m
[31m---- response_body chop[m
[31m-6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: $srcache_expire used too early[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /fetch;[m
[31m-        srcache_store PUT /store $srcache_expire;[m
[31m-        srcache_max_expire 8s;[m
[31m-        srcache_default_expire 5s;[m
[31m-[m
[31m-        set $saved_expire $srcache_expire;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "max-age=7"[m
[31m-            ngx.say("expire in content before sending header: ", ngx.var.srcache_expire)[m
[31m-            ngx.say("expire in content after sending header: ", ngx.var.srcache_expire)[m
[31m-            ngx.say("expire in rewrite: ", ngx.var.saved_expire)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /fetch {[m
[31m-        return 404;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value $args;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-expire in content before sending header: nil[m
[31m-expire in content after sending header: 7[m
[31m-expire in rewrite: [m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/expires.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/expires.t[m
[1mdeleted file mode 100644[m
[1mindex 0f97eb8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/expires.t[m
[1m+++ /dev/null[m
[36m@@ -1,378 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 4 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss), and no store due to Expires: <now>[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time())[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache miss because not stored before)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss), and no store due to Expires: <now> - 1[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time() - 1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache miss because not stored before)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (cache miss), and no store due to Expires: <now>, and srcache_response_cache_control on[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_response_cache_control on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time())[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: basic fetch (cache miss because not stored before)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: basic fetch (cache miss), and store due to Expires: <now>, and srcache_response_cache_control off[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_response_cache_control off;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time())[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: basic fetch (cache miss), and store due to not expired expires[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.expires = ngx.http_time(ngx.time() + 10)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/fetch-header.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/fetch-header.t[m
[1mdeleted file mode 100644[m
[1mindex df280a9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/fetch-header.t[m
[1m+++ /dev/null[m
[36m@@ -1,233 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (5 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set key in memcached (good content)[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key '/foo';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 8[m
[31m-!X-Fetch-Status[m
[31m---- request eval[m
[31m-"PUT /memc[m
[31m-HTTP/1.1 200 OK\r[m
[31m-Content-Type: foo/bar\r[m
[31m-Foo: Bar\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m---- response_body eval: "STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: foo/bar[m
[31m-Content-Length: 5[m
[31m-Foo: Bar[m
[31m-X-Fetch-Status: HIT[m
[31m---- response_body chop[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set key in memcached (bad content, syntax error in status line)[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key '/foo';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 8[m
[31m-!X-Fetch-Status[m
[31m---- request eval[m
[31m-"PUT /memc[m
[31m-HTTP 200 OK\r[m
[31m-Content-Type: foo/bar\r[m
[31m-Foo: Bar\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m---- response_body eval: "STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache hit, but found syntax error in status line)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m-X-Fetch-Status: MISS[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set key in memcached (bad content, unexpected eof in status line)[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key '/foo';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 8[m
[31m-!X-Fetch-Status[m
[31m---- request eval[m
[31m-"PUT /memc[m
[31m-HTTP/1.1 200"[m
[31m---- response_body eval: "STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: basic fetch (cache hit, but found unexpected eof in status line)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m-X-Fetch-Status: MISS[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set key in memcached (bad content, unexpected eof in header)[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key '/foo';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 8[m
[31m-!X-Fetch-Status[m
[31m---- request eval[m
[31m-"PUT /memc[m
[31m-HTTP/1.1 200 OK\r[m
[31m-Content-Ty"[m
[31m---- response_body eval: "STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: basic fetch (cache hit, but found unexpected eof in status line)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m-X-Fetch-Status: MISS[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/fetch-skip.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/fetch-skip.t[m
[1mdeleted file mode 100644[m
[1mindex 51b5551..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/fetch-skip.t[m
[1m+++ /dev/null[m
[36m@@ -1,529 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 10);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: skip is false[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        set $skip '';[m
[31m-        srcache_fetch_skip $skip;[m
[31m-[m
[31m-        echo hello;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_value 'hello';[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Fetch-Status: MISS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: check if /memc was invoked (just equal)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body chomp[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: fetch_skip is literally false[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_fetch_skip 0;[m
[31m-[m
[31m-        echo hello;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Fetch-Status: MISS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: check if /memc was invoked (less than)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body chomp[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: fetch_skip is true[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_fetch_skip 1;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: check if /memc was invoked (more than)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- response_headers[m
[31m-!X-Fetch-Status[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: explicit "true" string[m
[31m---- config[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_fetch_skip true;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.txt[m
[31m-hello[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: check if /memc was invoked (explicit "true" string)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- response_headers[m
[31m-!X-Fetch-Status[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: server-side config[m
[31m---- config[m
[31m-    srcache_fetch_skip 1;[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.txt[m
[31m-abc[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-abc[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: check if /memc was invoked (server-level config)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- response_headers[m
[31m-!X-Fetch-Status[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: overriding server-side config[m
[31m---- config[m
[31m-    srcache_fetch_skip 1;[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_fetch_skip 0;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.txt[m
[31m-hello, world[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- response_headers[m
[31m-X-Fetch-Status: MISS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: check if /memc was invoked (overriding server config)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_value hello;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body chomp[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Fetch-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-X-Fetch-Status: MISS[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-X-Fetch-Status: HIT[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: fetch skip true[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_fetch_skip 1;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- more_headers[m
[31m-cache-control: No-Cache[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m-X-Fetch-Status: BYPASS[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: basic fetch (cache hit again)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-X-Fetch-Status: HIT[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/gzip.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/gzip.t[m
[1mdeleted file mode 100644[m
[1mindex c1054f2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/gzip.t[m
[1m+++ /dev/null[m
[36m@@ -1,161 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 4 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss), and not stored due to Content-Encoding[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_encoding = "gzip"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Length:[m
[31m-Content-Encoding: gzip[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss), and stored due to Content-Encoding + srcache_ignore_content_encoding[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_ignore_content_encoding on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_encoding = "gzip"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Length:[m
[31m-Content-Encoding: gzip[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/header-buf-size.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/header-buf-size.t[m
[1mdeleted file mode 100644[m
[1mindex 74293c4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/header-buf-size.t[m
[1m+++ /dev/null[m
[36m@@ -1,146 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set key in memcached (header buf overflown)[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key '/foo';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 8[m
[31m---- request eval[m
[31m-"PUT /memc[m
[31m-HTTP/1.1 200 OK\r[m
[31m-Foo: Bar\r[m
[31m-Content-Type: foo/bar\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m---- response_body eval: "STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit, but header buf overflown)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_header_buffer_size 22;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set key in memcached[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key '/foo';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 8[m
[31m---- request eval[m
[31m-"PUT /memc[m
[31m-HTTP/1.1 200 OK\r[m
[31m-Foo: Bar\r[m
[31m-Content-Type: foo/bar\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m---- response_body eval: "STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache hit, just enough big header buffer)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_header_buffer_size 23;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: foo/bar[m
[31m-Content-Length: 5[m
[31m---- response_body chomp[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/main-req.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/main-req.t[m
[1mdeleted file mode 100644[m
[1mindex 04d54ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/main-req.t[m
[1m+++ /dev/null[m
[36m@@ -1,147 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (5 * blocks() + 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all (not using ngx_srcache)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_srcache_access_handler) {[m
[31m-    println("srcache access handler")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_srcache_header_filter) {[m
[31m-    println("srcache header filter")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_srcache_body_filter) {[m
[31m-    println("srcache body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-X-Fetch-Status: MISS[m
[31m-X-Store-Status: STORE[m
[31m---- response_body[m
[31m-hello[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-srcache_store: subrequest returned status 201[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-X-Fetch-Status: HIT[m
[31m-X-Store-Status: BYPASS[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rewrite directives run before srcache directives[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        set $key $uri;[m
[31m-        set $loc /memc;[m
[31m-        srcache_fetch GET $loc $key;[m
[31m-        srcache_store PUT $loc $key;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-X-Fetch-Status: HIT[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/max-age.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/max-age.t[m
[1mdeleted file mode 100644[m
[1mindex 849b61d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/max-age.t[m
[1m+++ /dev/null[m
[36m@@ -1,306 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 4 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss), and no store due to max-age=0[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "public; max-age=0"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache miss because not stored before)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss), and no store due to max-age=0, and srcache_response_cache_control on[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_response_cache_control on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Cache-Control"] = "public; max-age=0"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache miss because not stored before)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (cache miss), and store due to max-age=0, and srcache_response_cache_control off[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_response_cache_control off;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Cache-Control"] = "public; max-age=0"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: basic fetch (cache miss because not stored before)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: basic fetch (cache miss), and store due to max-age=<not 0>[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Cache-Control"] = "public; max-age=7";[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: basic fetch (cache miss because not stored before)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/methods.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/methods.t[m
[1mdeleted file mode 100644[m
[1mindex 732bf96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/methods.t[m
[1m+++ /dev/null[m
[36m@@ -1,390 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks() + 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: basic fetch (POST cache miss for POST by default)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /foo[m
[31m-hiya, china[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-! Content-Length[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (POST cache hit if we enable POST explicitly)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_methods POST;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /foo[m
[31m-hiya, china[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (GET still cache hit if we enable POST  and PUT explicitly)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_methods POST PUT;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: basic fetch (HEAD still cache hit if we enable POST explicitly)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_methods POST;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: basic fetch (cache miss), POST not store[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /foo[m
[31m-howdy[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: basic fetch (cache miss), POST stored when POST is enabled in srcache_methods[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_methods POST;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /foo[m
[31m-howdy[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: basic fetch (cache miss) - HEAD[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        return 200 "hello world";[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 11[m
[31m---- response_body[m
[31m---- error_log[m
[31m-srcache_store skipped due to request method HEAD[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- wait: 0.1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/no-cache.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/no-cache.t[m
[1mdeleted file mode 100644[m
[1mindex 85da584..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/no-cache.t[m
[1m+++ /dev/null[m
[36m@@ -1,310 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 4 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss), and not stored due to Cache-Control: no-cache[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "no-cache"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss), and not stored due to Cache-Control: no-cache (srcache_store_no_cache off)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_no_cache off;[m
[31m-        srcache_store_no_store on;[m
[31m-        srcache_store_private on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "no-cache"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (cache miss), and stored due to srcache_store_no_cache on[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_no_cache on;[m
[31m-        srcache_store_no_store off;[m
[31m-        srcache_store_private off;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "no-cache"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: basic fetch (cache miss), and not stored due to Cache-Control: no-cache[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "blah", "blah; No-Cache" }[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/no-store.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/no-store.t[m
[1mdeleted file mode 100644[m
[1mindex a6edbdc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/no-store.t[m
[1m+++ /dev/null[m
[36m@@ -1,306 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 4 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss), and not stored due to Cache-Control: no-store[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "no-store"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss), and not stored due to Cache-Control: no-store (srcache_store_no_store off)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_no_store off;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "no-store"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (cache miss), and stored due to srcache_store_no_store on[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_no_store on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "no-store"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: basic fetch (cache miss), and not stored due to Cache-Control: no-store[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "blah", "blah; No-Store" }[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/postgres-main.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/postgres-main.t[m
[1mdeleted file mode 100644[m
[1mindex d9f76e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/postgres-main.t[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(100);[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cache miss[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        postgres_server 127.0.0.1:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query 'select * from cats';[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cache hit[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        postgres_server 127.0.0.1:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query 'invalid sql here';[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: SSL packet issue (bug)[m
[31m---- SKIP[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        postgres_server 127.0.0.1:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type application/json;[m
[31m-[m
[31m-        postgres_escape $token $arg_token;[m
[31m-        postgres_escape $limit $arg_limit;[m
[31m-        postgres_pass backend;[m
[31m-        postgres_query HEAD GET "select $token,$limit";[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats?token=3&limit=10[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body chomp[m
[31m-[{"id":2,"name":null},{"id":3,"name":"bob"}][m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/private.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/private.t[m
[1mdeleted file mode 100644[m
[1mindex 91cd90c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/private.t[m
[1m+++ /dev/null[m
[36m@@ -1,529 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 4 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss), and not stored due to Cache-Control: private[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "private"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss), and not stored due to Cache-Control: private (srcache_store_private off)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_private off;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "private"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (cache miss), and stored due to srcache_store_private on[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_private on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "private"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: basic fetch (cache miss), and not stored due to Cache-Control: private[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "blah", "blah; Private" }[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: basic fetch (cache miss), and not stored due to Cache-Control: private, proxy_pass[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        default_type text/css;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "private"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: basic fetch (cache miss), and not stored due to Cache-Control: private, proxy_pass[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Cache-Control"] = "private"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: basic fetch (cache miss again, not stored in the previous case)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: basic fetch (cache miss), and stored due to Cache-Control: private but srcache_response_cache_control off[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_private off;[m
[31m-        srcache_response_cache_control off;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "blah", "blah; Private" }[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/proxy.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/proxy.t[m
[1mdeleted file mode 100644[m
[1mindex d78cee1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/proxy.t[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(100);[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT}     ||= 3306;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cache miss[m
[31m---- SKIP[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /cats {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /cats[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/ranges.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/ranges.t[m
[1mdeleted file mode 100644[m
[1mindex ee36463..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/ranges.t[m
[1m+++ /dev/null[m
[36m@@ -1,411 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (5 * blocks() + 12);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all (not using ngx_srcache)[m
[31m---- config[m
[31m-    location = /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: range fetch (cache miss)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        srcache_store_ranges on;[m
[31m-        srcache_fetch GET /memc $uri$http_range;[m
[31m-        srcache_store PUT /memc $uri$http_range;[m
[31m-[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=2-5[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: MISS[m
[31m-X-Store-Status: STORE[m
[31m---- response_body chop[m
[31m-tml>[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-srcache_store: subrequest returned status 201[m
[31m---- error_code: 206[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: range fetch (cache hit)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri$http_range;[m
[31m-        srcache_store PUT /memc $uri$http_range;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=2-5[m
[31m-[m
[31m---- response_headers[m
[31m-X-Fetch-Status: HIT[m
[31m-X-Store-Status: BYPASS[m
[31m-Content-Length: 4[m
[31m---- response_body chop[m
[31m-tml>[m
[31m---- error_code: 206[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: full fetch (cache miss)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri$http_range;[m
[31m-        srcache_store PUT /memc $uri$http_range;[m
[31m-[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m-[m
[31m---- response_headers[m
[31m-X-Fetch-Status: MISS[m
[31m-X-Store-Status: STORE[m
[31m-Content-Length: 72[m
[31m---- response_body_like: It works![m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: flush all (not using ngx_srcache)[m
[31m---- config[m
[31m-    location = /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: full fetch (cache miss)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m-Content-Length: 72[m
[31m-X-Fetch-Status: MISS[m
[31m-X-Store-Status: STORE[m
[31m---- response_body_like: It works![m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-srcache_store: subrequest returned status 201[m
[31m---- error_code: 200[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: range fetch (cache hit)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=2-5[m
[31m-[m
[31m---- response_headers[m
[31m-X-Fetch-Status: HIT[m
[31m-X-Store-Status: BYPASS[m
[31m-Content-Length: 4[m
[31m---- response_body chop[m
[31m-tml>[m
[31m---- error_code: 206[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: flush all (not using ngx_srcache)[m
[31m---- config[m
[31m-    location = /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: range fetch (cache miss) - no store ranges (default off)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        #srcache_store_ranges on;[m
[31m-        srcache_fetch GET /memc $uri$http_range;[m
[31m-        srcache_store PUT /memc $uri$http_range;[m
[31m-[m
[31m-        #add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        #add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=2-5[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m-Content-Length: 4[m
[31m-!X-Fetch-Status[m
[31m-!X-Store-Status[m
[31m---- response_body chop[m
[31m-tml>[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-srcache_store: subrequest returned status 201[m
[31m---- error_code: 206[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: range fetch (cache hit)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri$http_range;[m
[31m-        srcache_store PUT /memc $uri$http_range;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=2-5[m
[31m-[m
[31m---- response_headers[m
[31m-X-Fetch-Status: MISS[m
[31m-X-Store-Status: STORE[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-world[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: flush all (not using ngx_srcache)[m
[31m---- config[m
[31m-    location = /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-X-Fetch-Status: BYPASS[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: range fetch (cache miss) - no store ranges (explicit off)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        srcache_store_ranges off;[m
[31m-        srcache_fetch GET /memc $uri$http_range;[m
[31m-        srcache_store PUT /memc $uri$http_range;[m
[31m-[m
[31m-        #add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        #add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=2-5[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m-Content-Length: 4[m
[31m-!X-Fetch-Status[m
[31m-!X-Store-Status[m
[31m---- response_body chop[m
[31m-tml>[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-srcache_store: subrequest returned status 201[m
[31m---- error_code: 206[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: range fetch (cache hit)[m
[31m---- config[m
[31m-    location = /index.html {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri$http_range;[m
[31m-        srcache_store PUT /memc $uri$http_range;[m
[31m-[m
[31m-        echo world;[m
[31m-        add_header X-Fetch-Status $srcache_fetch_status;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=2-5[m
[31m-[m
[31m---- response_headers[m
[31m-X-Fetch-Status: MISS[m
[31m-X-Store-Status: STORE[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-world[m
[31m---- error_code: 200[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/redis.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/redis.t[m
[1mdeleted file mode 100644[m
[1mindex 7bda7d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/redis.t[m
[1m+++ /dev/null[m
[36m@@ -1,247 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 5 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#master_on();[m
[31m-#no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-#log_level('warn');[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        redis2_query flushall;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-!Content-Length[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "+OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- timeout: 3[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        set $key $uri;[m
[31m-        set_escape_uri $escaped_key $key;[m
[31m-        srcache_fetch GET /redis $key;[m
[31m-        srcache_store POST /redis2 key=$escaped_key&exptime=120;[m
[31m-[m
[31m-        echo hello;[m
[31m-        echo hiya;[m
[31m-    }[m
[31m-[m
[31m-    location = /redis {[m
[31m-        internal;[m
[31m-[m
[31m-        set $redis_key $args;[m
[31m-        redis_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location = /redis2 {[m
[31m-        internal;[m
[31m-[m
[31m-        set_unescape_uri $exptime $arg_exptime;[m
[31m-        set_unescape_uri $key $arg_key;[m
[31m-[m
[31m-        redis2_query set $key $echo_request_body;[m
[31m-        redis2_query expire $key $exptime;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-hiya[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        set $key $uri;[m
[31m-        srcache_fetch GET /redis $key;[m
[31m-        srcache_store PUT /redis2 key=$key&exptime=10;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location = /redis {[m
[31m-        #internal;[m
[31m-[m
[31m-        #redis2_query get $args;[m
[31m-        #redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-        #echo "args = $args";[m
[31m-[m
[31m-        set $redis_key $args;[m
[31m-        redis_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location = /redis2 {[m
[31m-        internal;[m
[31m-[m
[31m-        set_unescape_uri $exptime $arg_exptime;[m
[31m-        set_unescape_uri $key $arg_key;[m
[31m-[m
[31m-        redis2_query set $key $echo_request_body;[m
[31m-        redis2_query expire $key $exptime;[m
[31m-[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 11[m
[31m---- response_body[m
[31m-hello[m
[31m-hiya[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all - cluster[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        redis2_query flushall;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-!Content-Length[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "+OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss) - cluster[m
[31m---- timeout: 3[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        set $key $uri;[m
[31m-        set_escape_uri $escaped_key $key;[m
[31m-        #srcache_fetch GET /redis $key;[m
[31m-        srcache_store POST /redis2 key=$escaped_key&exptime=120;[m
[31m-[m
[31m-        echo hello;[m
[31m-        echo hiya;[m
[31m-    }[m
[31m-[m
[31m-    location = /redis {[m
[31m-        internal;[m
[31m-[m
[31m-        set_md5 $redis_key $args;[m
[31m-        set $backend foo;[m
[31m-        redis_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location = /redis2 {[m
[31m-        internal;[m
[31m-[m
[31m-        set_unescape_uri $exptime $arg_exptime;[m
[31m-        set_unescape_uri $key $arg_key;[m
[31m-        set_md5 $key;[m
[31m-        set $backend foo;[m
[31m-[m
[31m-        redis2_query set $key $echo_request_body;[m
[31m-        redis2_query expire $key $exptime;[m
[31m-        redis2_pass $backend;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-hiya[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache hit) - cluster[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        set $key $uri;[m
[31m-        srcache_fetch GET /redis $key;[m
[31m-        srcache_store PUT /redis2 key=$key&exptime=10;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location = /redis {[m
[31m-        #internal;[m
[31m-[m
[31m-        set_md5 $redis_key $args;[m
[31m-        set $backend foo;[m
[31m-        redis_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location = /redis2 {[m
[31m-        internal;[m
[31m-[m
[31m-        set_unescape_uri $exptime $arg_exptime;[m
[31m-        set_unescape_uri $key $arg_key;[m
[31m-        set_md5 $key;[m
[31m-[m
[31m-        redis2_query set $key $echo_request_body;[m
[31m-        redis2_query expire $key $exptime;[m
[31m-[m
[31m-        set $backend foo;[m
[31m-        redis2_pass $backend;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 11[m
[31m---- response_body[m
[31m-hello[m
[31m-hiya[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/req-cache-control.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/req-cache-control.t[m
[1mdeleted file mode 100644[m
[1mindex b5acdf5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/req-cache-control.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 4 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: request cache-control: no-cache[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_request_cache_control on;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- more_headers[m
[31m-cache-control: No-Cache[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache hit again)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: request cache-control: no-cache & no-store[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_request_cache_control on;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- more_headers[m
[31m-Cache-Control: no-cache[m
[31m-Cache-Control: no-store[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: [m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: basic fetch (cache hit again)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: request cache-control: no-store[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_request_cache_control on;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- more_headers[m
[31m-Cache-Control: no-store[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: basic fetch (cache hit again)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/satisfy.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/satisfy.t[m
[1mdeleted file mode 100644[m
[1mindex fc02e81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/satisfy.t[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss) - deny all[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        deny all;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        satisfy any;[m
[31m-[m
[31m-        default_type text/css;[m
[31m-[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/static.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/static.t[m
[1mdeleted file mode 100644[m
[1mindex ed32825..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/static.t[m
[1m+++ /dev/null[m
[36m@@ -1,163 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 5 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-Last-Modified: [m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo 201103040521.59[m
[31m-hello[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-Last-Modified: Fri, 04 Mar 2011 05:21:59 GMT[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-Last-Modified: Fri, 04 Mar 2011 05:21:59 GMT[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-Last-Modified: [m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss), hide Last-Modified[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_hide_header Last-Modified;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo 201103040521.59[m
[31m-hello[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-Last-Modified: Fri, 04 Mar 2011 05:21:59 GMT[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-!Last-Modified[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/status.t[m
[1mdeleted file mode 100644[m
[1mindex bc7e498..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/status.t[m
[1m+++ /dev/null[m
[36m@@ -1,561 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 97;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (http 1.0)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua 'ngx.say("hello")';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: inspect the cached item[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key "/foo";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 49[m
[31m-!Set-Cookie[m
[31m-!Proxy-Authenticate[m
[31m---- response_body eval[m
[31m-"HTTP/1.1 200 OK\r[m
[31m-Content-Type: text/css\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache 500 404 200 statuses)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_statuses 500 200 404;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: inspect the cached item[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key "/foo";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body_like[m
[31m-^HTTP/1\.1 404 Not Found\r[m
[31m-Content-Type: text/html\r[m
[31m-\r[m
[31m-.*?404 Not Found.*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (404 not listed in store_statuses)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_statuses 500 200 410;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inspect the cached item[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key "/foo";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: basic fetch (cache 301 by default)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("/bah", 301)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: inspect the cached item[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key "/foo";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body_like[m
[31m-^HTTP/1\.1 301 Moved Permanently\r[m
[31m-Content-Type: text/html\r[m
[31m-Location: /bah\r[m
[31m-\r[m
[31m-.*?301 Moved Permanently.*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: basic fetch (cache 302 by default)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("/bah", 302)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m-Location: /bah[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: inspect the cached item[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key "/foo";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body_like[m
[31m-^HTTP/1\.1 302 Moved Temporarily\r[m
[31m-Content-Type: text/html\r[m
[31m-Location: /bah\r[m
[31m-\r[m
[31m-.*?302 Found.*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: cache hit[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_statuses 303 304;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m-Location: /bah[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: basic fetch (201 not cached by default)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 201[m
[31m-            ngx.say("Dog created")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-Dog created[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: inspect the cached item[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key "/foo";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: basic fetch (explicitly do not cache 302)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_statuses 301 200;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("/bah", 302)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: inspect the cached item[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key "/foo";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: basic fetch (explicitly do not cache 302, and store_statuses are all bigger than 302)[m
[31m-github pull #19[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_statuses 303 304;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("/bah", 302)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: inspect the cached item[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key "/foo";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-hide-headers.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-hide-headers.t[m
[1mdeleted file mode 100644[m
[1mindex 0ac3a21..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-hide-headers.t[m
[1m+++ /dev/null[m
[36m@@ -1,390 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 5 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo-Bar"] = "hi world"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-Foo-Bar: hi world[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-Foo-Bar: hi world[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_hide_header "Foo-Bar";[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo-Bar"] = "hi world"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-Foo-Bar: hi world[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-!Foo-Bar[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: basic fetch (cache miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_hide_header "Foo-Bar";[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo-Bar"] = "hi world";[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-Foo-Bar: hi world[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-!Foo-Bar[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: basic fetch (hide Content-Type in store)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_hide_header "Content-Type";[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-!Foo-Bar[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m-Content-Length: 6[m
[31m-!Foo-Bar[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: basic fetch (hide and pass Content-Type in store)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_hide_header "Content-Type";[m
[31m-        srcache_store_pass_header "Content-Type";[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-!Foo-Bar[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/blah;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-!Foo-Bar[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-max-size.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-max-size.t[m
[1mdeleted file mode 100644[m
[1mindex ddc8eec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-max-size.t[m
[1m+++ /dev/null[m
[36m@@ -1,357 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: just hit store_max_size[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_max_size 49;[m
[31m-[m
[31m-        echo hello;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key hit_store_max_size;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Store-Status: STORE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: check if /memc was invoked (just equal)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key hit_store_max_size;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body eval[m
[31m-"HTTP/1.1 200 OK\r[m
[31m-Content-Type: text/css\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: less than store_max_size[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_max_size 50;[m
[31m-[m
[31m-        echo hello;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key less_than_store_max_size;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Store-Status: STORE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: check if /memc was invoked (less than)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key less_than_store_max_size;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body eval[m
[31m-"HTTP/1.1 200 OK\r[m
[31m-Content-Type: text/css\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: just more than store_max_size[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_max_size 48;[m
[31m-[m
[31m-        echo hello;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "store status: ", ngx.var.srcache_store_status)';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key more_than_store_max_size;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- wait: 0.1[m
[31m---- response_headers[m
[31m-X-Store-Status: STORE[m
[31m---- error_log[m
[31m-store status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: check if /memc was invoked (more than)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key more_than_store_max_size;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: just more than store_max_size (explicit content-length)[m
[31m---- config[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_max_size 48;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 40;[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key more_than_store_max_size;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: check if /memc was invoked (more than)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key more_than_store_max_size;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: server-side config[m
[31m---- config[m
[31m-    srcache_store_max_size 46;[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key more_than_store_max_size;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.txt[m
[31m-abc[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: check if /memc was invoked (server-level config)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key more_than_store_max_size;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: 0 means unlimited[m
[31m---- config[m
[31m-    srcache_store_max_size 3;[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_max_size 0;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key more_than_store_max_size;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.txt 199801171935.33[m
[31m-hello, world[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: check if /memc was invoked (explicit unlimited)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key more_than_store_max_size;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like eval[m
[31m-qr{^HTTP/1.1 200 OK\r[m
[31m-Content-Type: text/css\r[m
[31m-Last-Modified: Sat, 17 Jan 1998 19:35:33 GMT\r[m
[31m-X-SRCache-Allow-Ranges: 1\r[m
[31m-(?:ETag: "[^"]+"\r[m
[31m-)?\r[m
[31m-hello, world$}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-pass-headers.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-pass-headers.t[m
[1mdeleted file mode 100644[m
[1mindex 3358f12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-pass-headers.t[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (5 * blocks() + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic fetch (Set-Cookie and Proxy-Authenticate hide by default)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Set-Cookie"] = "foo=baz"[m
[31m-            ngx.header["Proxy-Authenticate"] = "blah"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-Set-Cookie: foo=baz[m
[31m-Proxy-Authenticate: blah[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-!Set-Cookie[m
[31m-!Proxy-Authenticate[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-Content-Length: 4[m
[31m-!Foo-Bar[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: basic fetch (Set-Cookie hide by default)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_pass_header Set-Cookie;[m
[31m-        srcache_store_pass_header Proxy-Authenticate;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Set-Cookie"] = "foo=baz"[m
[31m-            ngx.header["Proxy-Authenticate"] = "blah"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length:[m
[31m-Set-Cookie: foo=baz[m
[31m-Proxy-Authenticate: blah[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: basic fetch (cache hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-Content-Length: 6[m
[31m-Set-Cookie: foo=baz[m
[31m-Proxy-Authenticate: blah[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-skip.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-skip.t[m
[1mdeleted file mode 100644[m
[1mindex e802972..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/store-skip.t[m
[1m+++ /dev/null[m
[36m@@ -1,435 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 8);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: skip is false[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        set $skip '';[m
[31m-        srcache_store_skip $skip;[m
[31m-[m
[31m-        echo hello;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Store-Status: STORE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: check if /memc was invoked (just equal)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body eval[m
[31m-"HTTP/1.1 200 OK\r[m
[31m-Content-Type: text/css\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: store_skip is literally false[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_skip 0;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Store-Status: STORE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: check if /memc was invoked (less than)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body eval[m
[31m-"HTTP/1.1 200 OK\r[m
[31m-Content-Type: text/css\r[m
[31m-\r[m
[31m-hello[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: store_skip is true[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_skip 1;[m
[31m-[m
[31m-        echo hello;[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-X-Store-Status: BYPASS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: check if /memc was invoked (more than)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: explicit "true" string[m
[31m---- config[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_skip true;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.txt[m
[31m-hello[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: check if /memc was invoked (explicit "true" string)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: server-side config[m
[31m---- config[m
[31m-    srcache_store_skip 1;[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.txt[m
[31m-abc[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: check if /memc was invoked (server-level config)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: overriding server-side config[m
[31m---- config[m
[31m-    srcache_store_skip 1;[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        srcache_store_skip 0;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.txt 201012240310.03[m
[31m-hello, world[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: check if /memc was invoked (overriding server config)[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body eval[m
[31m-qr{HTTP/1.1 200 OK\r[m
[31m-Content-Type: text/css\r[m
[31m-Last-Modified: Fri, 24 Dec 2010 03:10:03 GMT\r[m
[31m-X-SRCache-Allow-Ranges: 1\r[m
[31m-(?:ETag: "4d140f0b-d"\r[m
[31m-)?\r[m
[31m-hello, world$}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: check the response[m
[31m---- config[m
[31m-    location /foo.txt {[m
[31m-        default_type text/css;[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo.txt[m
[31m---- response_headers[m
[31m-Accept-Ranges: bytes[m
[31m-Last-Modified: Fri, 24 Dec 2010 03:10:03 GMT[m
[31m-Content-Length: 13[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: flush all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- response_body eval: "OK\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: store_skip is true in the last minute[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-        set $skip '';[m
[31m-        srcache_store_skip $skip;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.say("world")[m
[31m-            ngx.var.skip = 1[m
[31m-        ';[m
[31m-        add_header X-Store-Status $srcache_store_status;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key key;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- response_headers[m
[31m-X-Store-Status: STORE[m
[31m---- error_log[m
[31m-srcache_store skipped due to the true value in srcache_store_skip: "1"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: check if /memc was invoked[m
[31m---- config[m
[31m-     location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/sub-req.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/sub-req.t[m
[1mdeleted file mode 100644[m
[1mindex eb4564c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/sub-req.t[m
[1m+++ /dev/null[m
[36m@@ -1,449 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket skip_all => 'subrequests not working';[m
[31m-;[m
[31m-[m
[31m-no_long_string();[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple fetch[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /pre /foo;[m
[31m-        echo_location /foo;[m
[31m-        echo_location /foo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /pre {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_value "hello\n";[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-hello[m
[31m-hello[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple fetch (without fetch)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /foo?1;[m
[31m-        echo_location /foo?2;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple fetch (flush fetch)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /flush;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /flush;[m
[31m-        echo_location /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /flush {[m
[31m-        internal;[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-1[m
[31m-OK\r[m
[31m-2[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: fetch & store[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /flush;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /flush {[m
[31m-        internal;[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-"[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: fetch & store (mixture of echo_location & echo_location_async)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /flush;[m
[31m-        #echo_location /bar?;[m
[31m-        echo_location /group?a=1&b=2;[m
[31m-        echo_location_async /group?a=3&b=4;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        #echo_location /bar;[m
[31m-        echo_location /bar $arg_a;[m
[31m-        echo_location_async /bar $arg_b;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /flush {[m
[31m-        internal;[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        #internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-"[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: deep nested echo_location/echo_location_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /flush;[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location /group;[m
[31m-        echo_location_async /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /flush {[m
[31m-        internal;[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-"[m
[31m---- timeout: 2[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: deep nested pure echo_location[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /flush;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /group;[m
[31m-        echo_location /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /flush {[m
[31m-        internal;[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-"[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: deep nested echo_location/echo_location_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /flush;[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location_async /group;[m
[31m-        echo_location_async /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location_async /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /flush {[m
[31m-        internal;[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-"[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: deep nested echo_location/echo_location_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /flush;[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /flush {[m
[31m-        internal;[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-"[m
[31m---- timeout: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: simple store[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /flush;[m
[31m-        echo_location /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /flush {[m
[31m-        internal;[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-1[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/timeout.t[m
[1mdeleted file mode 100644[m
[1mindex 993ec14..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,120 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks() - 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic fetch (cache miss)[m
[31m---- config[m
[31m-    error_page   500 502 503 504  /50x.html;[m
[31m-    location = /50x.html {[m
[31m-       root   html;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        srcache_fetch GET /memc $uri;[m
[31m-        srcache_store PUT /memc $uri;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /hello {[m
[31m-        echo hello;[m
[31m-        default_type text/css;[m
[31m-    }[m
[31m-[m
[31m-    memc_connect_timeout 1ms;[m
[31m-    location = /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $query_string;[m
[31m-        set $memc_exptime 300;[m
[31m-        memc_pass www.google.com:1234;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 50x.html[m
[31m-bad bad[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: main req upstream truncation (with content-length)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        srcache_store PUT /err;[m
[31m-[m
[31m-        proxy_read_timeout 100ms;[m
[31m-        proxy_pass http://127.0.0.1:11945/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /err {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.ERR, "location /err is called")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- tcp_listen: 11945[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\nContent-Length: 120\r\n\r\nhello world"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-location /err is called[m
[31m---- no_error_log[m
[31m-srcache_store: subrequest returned status[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: main req upstream truncation (without content-length)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        srcache_store PUT /err;[m
[31m-[m
[31m-        proxy_read_timeout 100ms;[m
[31m-        proxy_pass http://127.0.0.1:11945/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /err {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.ERR, "location /err is called")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- tcp_listen: 11945[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-location /err is called[m
[31m-srcache_store: subrequest returned status[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/unused.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/unused.t[m
[1mdeleted file mode 100644[m
[1mindex 4d4a8ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/t/unused.t[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#master_on();[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module used[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        srcache_store PUT /store;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        echo stored;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap[m
[31m-F(ngx_http_srcache_header_filter) {[m
[31m-    println("srcache header filter called")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_srcache_access_handler) {[m
[31m-    println("srcache access handler called")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-srcache access handler called[m
[31m-srcache access handler called[m
[31m-srcache header filter called[m
[31m-srcache header filter called[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: module unused[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #srcache_store PUT /store;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        echo stored;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap[m
[31m-F(ngx_http_srcache_header_filter) {[m
[31m-    println("srcache header filter called")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_srcache_access_handler) {[m
[31m-    println("srcache access handler called")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: module used (multiple http {} blocks)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        srcache_store PUT /store;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        echo stored;[m
[31m-    }[m
[31m-[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /foo[m
[31m---- stap[m
[31m-F(ngx_http_srcache_header_filter) {[m
[31m-    println("srcache header filter called")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_srcache_access_handler) {[m
[31m-    println("srcache access handler called")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-srcache access handler called[m
[31m-srcache access handler called[m
[31m-srcache header filter called[m
[31m-srcache header filter called[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 9e98980..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-ngx_redis_version=0.3.7[m
[31m-ngx_redis_path=$home/work/nginx/ngx_http_redis-$ngx_redis_version[m
[31m-[m
[31m-cd $ngx_redis_path || exit 1[m
[31m-patch --forward -p1 < $root/../ngx_openresty/patches/ngx_http_redis-$ngx_redis_version-variables_in_redis_pass.patch[m
[31m-cd $root || exit 1[m
[31m-[m
[31m-            #--without-http_memcached_module \[m
[31m-ngx-build $force $version \[m
[31m-            --with-cc-opt="-O0" \[m
[31m-            --with-ld-opt="-Wl,-rpath,/opt/postgres/lib:/opt/drizzle/lib:/usr/local/lib:/home/lz/lib" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-            --add-module=$root/../ndk-nginx-module \[m
[31m-            --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$ngx_redis_path \[m
[31m-          --add-module=$root/../xss-nginx-module \[m
[31m-          --add-module=$root/../redis2-nginx-module \[m
[31m-          --add-module=$root/../eval-nginx-module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../headers-more-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root/../rds-json-nginx-module \[m
[31m-          --add-module=$root/../drizzle-nginx-module \[m
[31m-          --add-module=$root/../postgres-nginx-module \[m
[31m-          --add-module=$root/../memc-nginx-module \[m
[31m-            --add-module=$home/work/nginx/ngx_http_upstream_keepalive-0.7 \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-          --without-http_ssi_module \[m
[31m-          --with-debug[m
[31m-          #--add-module=/home/agentz/git/dodo/utils/dodo-hook \[m
[31m-          #--add-module=$home/work/ngx_http_auth_request-0.1 #\[m
[31m-          #--with-rtsig_module[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 2502ccc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/srcache-nginx-module-0.31/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_core_location[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex cd6fa0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-build1[0-9][m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-go[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/util.h[m
[31m-src/util.c[m
[31m-src/util.rl[m
[31m-all[m
[31m-t/servroot/[m
[31m-buildroot/[m
[31m-build12[m
[31m-*.plist[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/config b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/config[m
[1mdeleted file mode 100644[m
[1mindex 42ebe33..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/config[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_xss_filter_module[m
[31m-HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_xss_filter_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_http_xss_filter_module.c $ngx_addon_dir/src/ngx_http_xss_util.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ddebug.h $ngx_addon_dir/src/ngx_http_xss_filter_module.h $ngx_addon_dir/src/ngx_http_xss_util.h"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 725bbf8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "xss *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex fd6e944..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,472 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_xss_filter_module.h"[m
[31m-#include "ngx_http_xss_util.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_xss_default_output_type "application/x-javascript"[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_xss_default_types[] = {[m
[31m-    ngx_string("application/json"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_xss_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_xss_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_xss_filter_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_xss_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_xss_get(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_xss_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_xss_commands[] = {[m
[31m-[m
[31m-    { ngx_string("xss_get"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_http_xss_get,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xss_loc_conf_t, get_enabled),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xss_callback_arg"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xss_loc_conf_t, callback_arg),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xss_input_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_CONF_1MORE|NGX_HTTP_LIF_CONF,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xss_loc_conf_t, input_types_keys),[m
[31m-      &ngx_http_xss_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("xss_check_status"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_CONF_FLAG|NGX_HTTP_LIF_CONF,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xss_loc_conf_t, check_status),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xss_override_status"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_CONF_FLAG|NGX_HTTP_LIF_CONF,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xss_loc_conf_t, override_status),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xss_output_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_CONF_1MORE|NGX_HTTP_LIF_CONF,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xss_loc_conf_t, output_type),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_xss_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_xss_filter_init,              /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_xss_create_main_conf,         /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_xss_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_xss_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_xss_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_xss_filter_module_ctx,       /* module context */[m
[31m-    ngx_http_xss_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xss_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_xss_ctx_t          *ctx;[m
[31m-    ngx_http_xss_loc_conf_t     *xlcf;[m
[31m-    ngx_str_t                    callback;[m
[31m-    u_char                      *p, *src, *dst;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "xss skipped in subrequests");[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    xlcf = ngx_http_get_module_loc_conf(r, ngx_http_xss_filter_module);[m
[31m-[m
[31m-    if (!xlcf->get_enabled) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->method != NGX_HTTP_GET) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "xss skipped due to the unmatched request method: %V",[m
[31m-                       &r->method_name);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (xlcf->check_status) {[m
[31m-[m
[31m-        if (r->headers_out.status != NGX_HTTP_OK[m
[31m-            && r->headers_out.status != NGX_HTTP_CREATED)[m
[31m-        {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xss skipped due to unmatched response status "[m
[31m-                           "\"%ui\"", r->headers_out.status);[m
[31m-[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (xlcf->callback_arg.len == 0) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xss: xss_get is enabled but no xss_callback_arg "[m
[31m-                      "specified");[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_test_content_type(r, &xlcf->input_types) == NULL) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "xss skipped due to unmatched Content-Type response "[m
[31m-                       "header");[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_arg(r, xlcf->callback_arg.data, xlcf->callback_arg.len,[m
[31m-                     &callback)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "xss skipped: no GET argument \"%V\" specified in "[m
[31m-                       "the request", &xlcf->callback_arg);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, callback.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    src = callback.data; dst = p;[m
[31m-[m
[31m-    ngx_unescape_uri(&dst, &src, callback.len, NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-    if (src != callback.data + callback.len) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xss: unescape uri: input data not consumed completely");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    callback.data = p;[m
[31m-    callback.len = dst - p;[m
[31m-[m
[31m-    if (ngx_http_xss_test_callback(callback.data, callback.len) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xss: bad callback argument: \"%V\"", &callback);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_xss_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     ctx->callback = { 0, NULL };[m
[31m-     *     ctx->before_body_sent = 0;[m
[31m-     */[m
[31m-[m
[31m-    ctx->callback = callback;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_xss_filter_module);[m
[31m-[m
[31m-    r->headers_out.content_type = xlcf->output_type;[m
[31m-    r->headers_out.content_type_len = xlcf->output_type.len;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xss output Content-Type header \"%V\"",[m
[31m-                   &xlcf->output_type);[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-    if (xlcf->override_status[m
[31m-        && r->headers_out.status >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-    {[m
[31m-        r->headers_out.status = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xss_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_uint_t                 last;[m
[31m-    ngx_chain_t               *cl, *orig_in;[m
[31m-    ngx_chain_t              **ll = NULL;[m
[31m-    ngx_http_xss_ctx_t        *ctx;[m
[31m-    size_t                     len;[m
[31m-    ngx_buf_t                 *b;[m
[31m-[m
[31m-    if (in == NULL || r->header_only) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_xss_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    orig_in = in;[m
[31m-[m
[31m-    if (!ctx->before_body_sent) {[m
[31m-        ctx->before_body_sent = 1;[m
[31m-[m
[31m-        dd("callback: %.*s", (int) ctx->callback.len,[m
[31m-           ctx->callback.data);[m
[31m-[m
[31m-        len = ctx->callback.len + sizeof("(") - 1;[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->pool, len);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, ctx->callback.data, ctx->callback.len);[m
[31m-[m
[31m-        *b->last++ = '(';[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = in;[m
[31m-        in = cl;[m
[31m-    }[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    for (cl = orig_in; cl; cl = cl->next) {[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            cl->buf->last_buf = 0;[m
[31m-            cl->buf->sync = 1;[m
[31m-            ll = &cl->next;[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        len = sizeof(");") - 1;[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->pool, len);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = ')';[m
[31m-        *b->last++ = ';';[m
[31m-[m
[31m-        b->last_buf = 1;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ll = cl;[m
[31m-[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_xss_filter_module);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xss_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                             multi_http_blocks;[m
[31m-    ngx_http_xss_main_conf_t       *xmcf;[m
[31m-[m
[31m-    xmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_xss_filter_module);[m
[31m-[m
[31m-    if (ngx_http_xss_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_xss_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || xmcf->requires_filter) {[m
[31m-        ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-        ngx_http_top_header_filter = ngx_http_xss_header_filter;[m
[31m-[m
[31m-        ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-        ngx_http_top_body_filter = ngx_http_xss_body_filter;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_xss_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_xss_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_xss_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->callback_arg = { 0, NULL };[m
[31m-     *     conf->input_types = { NULL };[m
[31m-     *     conf->input_types_keys = NULL;[m
[31m-     *     conf->output_type = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->get_enabled = NGX_CONF_UNSET;[m
[31m-    conf->check_status = NGX_CONF_UNSET;[m
[31m-    conf->override_status = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xss_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_xss_loc_conf_t *prev = parent;[m
[31m-    ngx_http_xss_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->callback_arg, prev->callback_arg, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->get_enabled, prev->get_enabled, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->check_status, prev->check_status, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->override_status, prev->override_status, 1);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8029[m
[31m-    if (ngx_http_merge_types(cf, &conf->input_types_keys, &conf->input_types,[m
[31m-                             &prev->input_types_keys, &prev->input_types,[m
[31m-                             ngx_http_xss_default_types)[m
[31m-        != NGX_OK)[m
[31m-#else /* 0.7.x or 0.8.x < 0.8.29 */[m
[31m-    if (ngx_http_merge_types(cf, conf->input_types_keys, &conf->input_types,[m
[31m-                             prev->input_types_keys, &prev->input_types,[m
[31m-                             ngx_http_xss_default_types)[m
[31m-        != NGX_OK)[m
[31m-#endif[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->output_type, prev->output_type,[m
[31m-                             ngx_http_xss_default_output_type);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_xss_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_xss_main_conf_t    *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_xss_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      conf->requires_filter = 0;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xss_get(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_xss_main_conf_t       *xmcf;[m
[31m-[m
[31m-    xmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                              ngx_http_xss_filter_module);[m
[31m-[m
[31m-    xmcf->requires_filter = 1;[m
[31m-[m
[31m-    return ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_filter_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_filter_module.h[m
[1mdeleted file mode 100644[m
[1mindex 08219e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_filter_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-#ifndef NGX_HTTP_XSS_FILTER_MODULE_H[m
[31m-#define NGX_HTTP_XSS_FILTER_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t       callback_arg;[m
[31m-[m
[31m-    ngx_hash_t      input_types;[m
[31m-    ngx_array_t    *input_types_keys;[m
[31m-[m
[31m-    ngx_str_t       output_type;[m
[31m-[m
[31m-    ngx_flag_t      get_enabled;[m
[31m-    ngx_flag_t      check_status;[m
[31m-    ngx_flag_t      override_status;[m
[31m-[m
[31m-} ngx_http_xss_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t       requires_filter;[m
[31m-[m
[31m-} ngx_http_xss_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t       callback;[m
[31m-    ngx_flag_t      before_body_sent;[m
[31m-[m
[31m-} ngx_http_xss_ctx_t;[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_XSS_FILTER_MODULE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.c[m
[1mdeleted file mode 100644[m
[1mindex 30ecbce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,145 +0,0 @@[m
[31m-[m
[31m-#line 1 "src/ngx_http_xss_util.rl"[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_xss_util.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 16 "src/ngx_http_xss_util.rl"[m
[31m-[m
[31m-#line 21 "src/ngx_http_xss_util.c"[m
[31m-static const int javascript_start = 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 17 "src/ngx_http_xss_util.rl"[m
[31m-[m
[31m-ngx_int_t ngx_http_xss_test_callback(u_char *data, size_t len)[m
[31m-{[m
[31m-    signed char *p = (signed char *) data;[m
[31m-    signed char *pe;[m
[31m-    int cs;[m
[31m-[m
[31m-    pe = p + len;[m
[31m-[m
[31m-    [m
[31m-#line 40 "src/ngx_http_xss_util.c"[m
[31m-	{[m
[31m-	cs = javascript_start;[m
[31m-	}[m
[31m-[m
[31m-#line 45 "src/ngx_http_xss_util.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-st1:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof1;[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 36: goto st6;[m
[31m-		case 95: goto st6;[m
[31m-	}[m
[31m-	if ( (*p) > 90 ) {[m
[31m-		if ( 97 <= (*p) && (*p) <= 122 )[m
[31m-			goto st6;[m
[31m-	} else if ( (*p) >= 65 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	switch( (*p) ) {[m
[31m-		case 36: goto st6;[m
[31m-		case 46: goto st1;[m
[31m-		case 91: goto st2;[m
[31m-		case 95: goto st6;[m
[31m-	}[m
[31m-	if ( (*p) < 65 ) {[m
[31m-		if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-			goto st6;[m
[31m-	} else if ( (*p) > 90 ) {[m
[31m-		if ( 97 <= (*p) && (*p) <= 122 )[m
[31m-			goto st6;[m
[31m-	} else[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 46 )[m
[31m-		goto st3;[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 93 )[m
[31m-		goto st7;[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	switch( (*p) ) {[m
[31m-		case 46: goto st3;[m
[31m-		case 93: goto st7;[m
[31m-	}[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof1: cs = 1; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 38 "src/ngx_http_xss_util.rl"[m
[31m-[m
[31m-[m
[31m-    if (cs < 6 || p != pe) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.h[m
[1mdeleted file mode 100644[m
[1mindex aa67e1b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-#ifndef NGX_HTTP_XSS_UTIL_H[m
[31m-#define NGX_HTTP_XSS_UTIL_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#ifndef ngx_copy_const_str[m
[31m-#define ngx_copy_const_str(p, s)  ngx_copy(p, s, sizeof(s) - 1)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_UNESCAPE_URI_COMPONENT[m
[31m-#define NGX_UNESCAPE_URI_COMPONENT 0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_xss_test_callback(u_char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_XSS_UTIL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.rl[m
[1mdeleted file mode 100644[m
[1mindex 27def77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/src/ngx_http_xss_util.rl[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_xss_util.h"[m
[31m-[m
[31m-[m
[31m-%% machine javascript;[m
[31m-%% write data;[m
[31m-[m
[31m-ngx_int_t ngx_http_xss_test_callback(u_char *data, size_t len)[m
[31m-{[m
[31m-    signed char *p = (signed char *) data;[m
[31m-    signed char *pe;[m
[31m-    int cs;[m
[31m-[m
[31m-    pe = p + len;[m
[31m-[m
[31m-    %%{[m
[31m-        identifier = [$A-Za-z_] [$A-Za-z0-9_]*;[m
[31m-[m
[31m-        index = [0-9]* '.' [0-9]+[m
[31m-              | [0-9]+[m
[31m-              ;[m
[31m-[m
[31m-        main := identifier ( '.' identifier )*[m
[31m-                  ('[' index ']')? ;[m
[31m-[m
[31m-        write init;[m
[31m-        write exec;[m
[31m-    }%%[m
[31m-[m
[31m-    if (cs < %%{ write first_final; }%% || p != pe) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/gzip.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/gzip.t[m
[1mdeleted file mode 100644[m
[1mindex 199ed99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/gzip.t[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 1);[m
[31m-[m
[31m-#no_long_string();[m
[31m-log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: xss_get is on while no xss_callback_arg & xss_output_type[m
[31m---- config[m
[31m-    xss_get on; # enable cross-site GET support[m
[31m-    xss_callback_arg c; # use $arg_callback[m
[31m-    gzip on;[m
[31m-    gzip_types application/json application/x-javascript;[m
[31m-[m
[31m-    location /foo {[m
[31m-        default_type "application/json";[m
[31m-        echo -n '{"cat":32}';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- request[m
[31m-    GET /foo?c=blah[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m-Content-Encoding: gzip[m
[31m---- response_body_like eval[m
[31m-"\x{00}\x{00}\x{00}"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex c2c0ab2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,301 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 3 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: skipped: no callback arg given[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg foo;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_headers_like[m
[31m-Content-Type: application/json[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg a;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?foo=blar&a=bar[m
[31m---- response_headers_like[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-bar([][m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: bug[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg foo;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?foo=bar[m
[31m---- response_headers_like[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-bar([][m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: uri escaped[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg _callback;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?_callback=OpenResty.callbackMap%5b32%5D[m
[31m---- response_headers_like[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-OpenResty.callbackMap[32]([][m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test invalid callback[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg _callback;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?_callback=a();b[m
[31m---- response_headers_like[m
[31m-Content-Type: application/json[m
[31m---- response_body[m
[31m-[][m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: input type mismatch[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg foo;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?foo=bar[m
[31m---- response_headers_like[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: input type match by setting xss_input_types[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg foo;[m
[31m-        xss_input_types text/plain text/css;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?foo=bar[m
[31m---- response_headers_like[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-bar([][m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set a different output type[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg foo;[m
[31m-        xss_input_types text/plain text/css;[m
[31m-        xss_output_type text/html;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?foo=bar[m
[31m---- response_headers_like[m
[31m-Content-Type: text/html[m
[31m---- response_body chop[m
[31m-bar([][m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: xss_get is on while no xss_callback_arg[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        #xss_callback_arg foo;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?foo=bar[m
[31m---- response_headers_like[m
[31m-Content-Type: application/json[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: xss_get is on while no xss_callback_arg[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type "application/json";[m
[31m-        echo '{"errcode":400,"errstr":"Bad Request"}';[m
[31m-[m
[31m-        xss_get on; # enable cross-site GET support[m
[31m-        xss_callback_arg callback; # use $arg_callback[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?callback=blah[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-blah({"errcode":400,"errstr":"Bad Request"}[m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: xss_get is on while no xss_callback_arg & xss_output_type[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type "application/json";[m
[31m-        echo '{"errcode":400,"errstr":"Bad Request"}';[m
[31m-[m
[31m-        xss_get on; # enable cross-site GET support[m
[31m-        xss_callback_arg callback; # use $arg_callback[m
[31m-        xss_output_type text/javascript;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?callback=blah[m
[31m---- response_headers[m
[31m-Content-Type: text/javascript[m
[31m---- response_body chop[m
[31m-blah({"errcode":400,"errstr":"Bad Request"}[m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: check status and override status[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        xss_check_status off;[m
[31m-        default_type application/json;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 404[m
[31m-            ngx.print("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?c=blah[m
[31m---- response_body chop[m
[31m-blah(hello);[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: check status and NO override status[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        xss_override_status off;[m
[31m-        xss_check_status off;[m
[31m-        default_type application/json;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 404[m
[31m-            ngx.print("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?c=blah[m
[31m---- response_body chop[m
[31m-blah(hello);[m
[31m---- error_code: 404[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: bug: keys started by underscore[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg _callback;[m
[31m-        echo '[]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?_callback=foo._bar[m
[31m---- response_headers_like[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-foo._bar([][m
[31m-);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: exec[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type "application/json";[m
[31m-        echo -n hello world;[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg _c;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        echo_exec /foo $args;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua?_c=bah[m
[31m---- response_headers[m
[31m-Content-Type: application/x-javascript[m
[31m---- response_body chop[m
[31m-bah(hello world);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/unused.t b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/unused.t[m
[1mdeleted file mode 100644[m
[1mindex 6d8f95c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/t/unused.t[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_long_string();[m
[31m-log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: used[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap[m
[31m-F(ngx_http_xss_header_filter) {[m
[31m-    println("xss header filter")[m
[31m-}[m
[31m-F(ngx_http_xss_body_filter) {[m
[31m-    println("xss body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-xss header filter[m
[31m-xss body filter[m
[31m-xss body filter[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not used[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap[m
[31m-F(ngx_http_xss_header_filter) {[m
[31m-    println("xss header filter")[m
[31m-}[m
[31m-F(ngx_http_xss_body_filter) {[m
[31m-    println("xss body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: used (multiple http {} blocks)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        default_type application/json;[m
[31m-        xss_callback_arg 'callback';[m
[31m-        echo -n hello;[m
[31m-        xss_get on;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- request[m
[31m-    GET /t?callback=foo[m
[31m---- stap[m
[31m-F(ngx_http_xss_header_filter) {[m
[31m-    println("xss header filter")[m
[31m-}[m
[31m-F(ngx_http_xss_body_filter) {[m
[31m-    println("xss body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-xss header filter[m
[31m-xss body filter[m
[31m-xss body filter[m
[31m-[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- response_body chop[m
[31m-foo(hello);[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 07d41d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-ragel -G2 src/ngx_http_xss_util.rl[m
[31m-if [ $? != 0 ]; then[m
[31m-    echo 'Failed to generate the ngx_http_xss_util.c.' 1>&2[m
[31m-    exit 1;[m
[31m-fi[m
[31m-[m
[31m-./util/fix-clang-warnings || exit 1[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-version=$1[m
[31m-force=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:$LUAJIT_LIB:/usr/local/lib" \[m
[31m-        --with-http_ssl_module \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$home/git/echo-nginx-module \[m
[31m-          --add-module=$home/git/ndk-nginx-module \[m
[31m-          --add-module=$home/git/lua-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --with-debug[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/fix-clang-warnings b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/fix-clang-warnings[m
[1mdeleted file mode 100755[m
[1mindex 1d7a7b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/fix-clang-warnings[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use File::Temp 'tempfile';[m
[31m-[m
[31m-my $infile = "src/ngx_http_xss_util.c";[m
[31m-my ($out, $outfile) = tempfile();[m
[31m-open my $in, $infile[m
[31m-    or die "Cannot open $infile for reading: $!\n";[m
[31m-[m
[31m-my $hits = 0;[m
[31m-while (<$in>) {[m
[31m-    if (/ \b javascript_ (?: en_main | error | first_final ) \b /x)[m
[31m-     {[m
[31m-        #warn "HIT!";[m
[31m-        $hits++;[m
[31m-        next;[m
[31m-    }[m
[31m-    print $out $_;[m
[31m-}[m
[31m-[m
[31m-close $in;[m
[31m-close $out;[m
[31m-[m
[31m-if ($hits) {[m
[31m-    my $cmd = "cp $outfile $infile";[m
[31m-    system($cmd) == 0[m
[31m-        or die "Cannot run command \"$cmd\": $!";[m
[31m-}[m
[31m-#die;[m
[31m-[m
[31m-__END__[m
[31m-[m
[31m-This script is to fix the following clang warnings when using Ragel 6.8/6.9/etc:[m
[31m-[m
[31m-rc/ngx_http_xss_util.c:22:18: error: unused variable 'javascript_first_final' [-Werror,-Wunused-const-variable][m
[31m-static const int javascript_first_final = 6;[m
[31m-                 ^[m
[31m-src/ngx_http_xss_util.c:23:18: error: unused variable 'javascript_error' [-Werror,-Wunused-const-variable][m
[31m-static const int javascript_error = 0;[m
[31m-                 ^[m
[31m-src/ngx_http_xss_util.c:25:18: error: unused variable 'javascript_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int javascript_en_main = 1;[m
[31m-                 ^[m
[31m-3 errors generated.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 00613fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/build/xss-nginx-module-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 9dd51e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-*.[oa][m
[31m-*.so[m
[31m-*.obj[m
[31m-*.lib[m
[31m-*.exp[m
[31m-*.dll[m
[31m-*.exe[m
[31m-*.manifest[m
[31m-*.dmp[m
[31m-*.swp[m
[31m-.tags[m
[31m-*~[m
[31m-tags[m
[31m-*.swo[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/COPYRIGHT b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/COPYRIGHT[m
[1mdeleted file mode 100644[m
[1mindex b614d3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/COPYRIGHT[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-===============================================================================[m
[31m-LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/[m
[31m-[m
[31m-Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining a copy[m
[31m-of this software and associated documentation files (the "Software"), to deal[m
[31m-in the Software without restriction, including without limitation the rights[m
[31m-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell[m
[31m-copies of the Software, and to permit persons to whom the Software is[m
[31m-furnished to do so, subject to the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be included in[m
[31m-all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR[m
[31m-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,[m
[31m-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE[m
[31m-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER[m
[31m-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,[m
[31m-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN[m
[31m-THE SOFTWARE.[m
[31m-[m
[31m-[ MIT license: http://www.opensource.org/licenses/mit-license.php ][m
[31m-[m
[31m-===============================================================================[m
[31m-[ LuaJIT includes code from Lua 5.1/5.2, which has this license statement: ][m
[31m-[m
[31m-Copyright (C) 1994-2012 Lua.org, PUC-Rio.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining a copy[m
[31m-of this software and associated documentation files (the "Software"), to deal[m
[31m-in the Software without restriction, including without limitation the rights[m
[31m-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell[m
[31m-copies of the Software, and to permit persons to whom the Software is[m
[31m-furnished to do so, subject to the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be included in[m
[31m-all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR[m
[31m-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,[m
[31m-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE[m
[31m-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER[m
[31m-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,[m
[31m-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN[m
[31m-THE SOFTWARE.[m
[31m-[m
[31m-===============================================================================[m
[31m-[ LuaJIT includes code from dlmalloc, which has this license statement: ][m
[31m-[m
[31m-This is a version (aka dlmalloc) of malloc/free/realloc written by[m
[31m-Doug Lea and released to the public domain, as explained at[m
[31m-http://creativecommons.org/licenses/publicdomain[m
[31m-[m
[31m-===============================================================================[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 165d7ea..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,160 +0,0 @@[m
[31m-##############################################################################[m
[31m-# LuaJIT top level Makefile for installation. Requires GNU Make.[m
[31m-#[m
[31m-# Please read doc/install.html before changing any variables![m
[31m-#[m
[31m-# Suitable for POSIX platforms (Linux, *BSD, OSX etc.).[m
[31m-# Note: src/Makefile has many more configurable options.[m
[31m-#[m
[31m-# ##### This Makefile is NOT useful for Windows! #####[m
[31m-# For MSVC, please follow the instructions given in src/msvcbuild.bat.[m
[31m-# For MinGW and Cygwin, cd to src and run make with the Makefile there.[m
[31m-#[m
[31m-# Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-##############################################################################[m
[31m-[m
[31m-MAJVER=  2[m
[31m-MINVER=  1[m
[31m-RELVER=  0[m
[31m-PREREL=  -beta2[m
[31m-VERSION= $(MAJVER).$(MINVER).$(RELVER)$(PREREL)[m
[31m-ABIVER=  5.1[m
[31m-[m
[31m-##############################################################################[m
[31m-#[m
[31m-# Change the installation path as needed. This automatically adjusts[m
[31m-# the paths in src/luaconf.h, too. Note: PREFIX must be an absolute path![m
[31m-#[m
[31m-export PREFIX= /usr/local[m
[31m-export MULTILIB= lib[m
[31m-##############################################################################[m
[31m-[m
[31m-DPREFIX= $(DESTDIR)$(PREFIX)[m
[31m-INSTALL_BIN=   $(DPREFIX)/bin[m
[31m-INSTALL_LIB=   $(DPREFIX)/$(MULTILIB)[m
[31m-INSTALL_SHARE= $(DPREFIX)/share[m
[31m-INSTALL_INC=   $(DPREFIX)/include/luajit-$(MAJVER).$(MINVER)[m
[31m-[m
[31m-INSTALL_LJLIBD= $(INSTALL_SHARE)/luajit-$(VERSION)[m
[31m-INSTALL_JITLIB= $(INSTALL_LJLIBD)/jit[m
[31m-INSTALL_LMODD= $(INSTALL_SHARE)/lua[m
[31m-INSTALL_LMOD= $(INSTALL_LMODD)/$(ABIVER)[m
[31m-INSTALL_CMODD= $(INSTALL_LIB)/lua[m
[31m-INSTALL_CMOD= $(INSTALL_CMODD)/$(ABIVER)[m
[31m-INSTALL_MAN= $(INSTALL_SHARE)/man/man1[m
[31m-INSTALL_PKGCONFIG= $(INSTALL_LIB)/pkgconfig[m
[31m-[m
[31m-INSTALL_TNAME= luajit-$(VERSION)[m
[31m-INSTALL_TSYMNAME= luajit[m
[31m-INSTALL_ANAME= libluajit-$(ABIVER).a[m
[31m-INSTALL_SOSHORT1= libluajit-$(ABIVER).so[m
[31m-INSTALL_SOSHORT2= libluajit-$(ABIVER).so.$(MAJVER)[m
[31m-INSTALL_SONAME= $(INSTALL_SOSHORT2).$(MINVER).$(RELVER)[m
[31m-INSTALL_DYLIBSHORT1= libluajit-$(ABIVER).dylib[m
[31m-INSTALL_DYLIBSHORT2= libluajit-$(ABIVER).$(MAJVER).dylib[m
[31m-INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).$(MINVER).$(RELVER).dylib[m
[31m-INSTALL_PCNAME= luajit.pc[m
[31m-[m
[31m-INSTALL_STATIC= $(INSTALL_LIB)/$(INSTALL_ANAME)[m
[31m-INSTALL_DYN= $(INSTALL_LIB)/$(INSTALL_SONAME)[m
[31m-INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_SOSHORT1)[m
[31m-INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_SOSHORT2)[m
[31m-INSTALL_T= $(INSTALL_BIN)/$(INSTALL_TNAME)[m
[31m-INSTALL_TSYM= $(INSTALL_BIN)/$(INSTALL_TSYMNAME)[m
[31m-INSTALL_PC= $(INSTALL_PKGCONFIG)/$(INSTALL_PCNAME)[m
[31m-[m
[31m-INSTALL_DIRS= $(INSTALL_BIN) $(INSTALL_LIB) $(INSTALL_INC) $(INSTALL_MAN) \[m
[31m-  $(INSTALL_PKGCONFIG) $(INSTALL_JITLIB) $(INSTALL_LMOD) $(INSTALL_CMOD)[m
[31m-UNINSTALL_DIRS= $(INSTALL_JITLIB) $(INSTALL_LJLIBD) $(INSTALL_INC) \[m
[31m-  $(INSTALL_LMOD) $(INSTALL_LMODD) $(INSTALL_CMOD) $(INSTALL_CMODD)[m
[31m-[m
[31m-RM= rm -f[m
[31m-MKDIR= mkdir -p[m
[31m-RMDIR= rmdir 2>/dev/null[m
[31m-SYMLINK= ln -sf[m
[31m-INSTALL_X= install -m 0755[m
[31m-INSTALL_F= install -m 0644[m
[31m-UNINSTALL= $(RM)[m
[31m-LDCONFIG= ldconfig -n[m
[31m-SED_PC= sed -e "s|^prefix=.*|prefix=$(PREFIX)|" \[m
[31m-            -e "s|^multilib=.*|multilib=$(MULTILIB)|"[m
[31m-[m
[31m-FILE_T= luajit[m
[31m-FILE_A= libluajit.a[m
[31m-FILE_SO= libluajit.so[m
[31m-FILE_MAN= luajit.1[m
[31m-FILE_PC= luajit.pc[m
[31m-FILES_INC= lua.h lualib.h lauxlib.h luaconf.h lua.hpp luajit.h[m
[31m-FILES_JITLIB= bc.lua bcsave.lua dump.lua p.lua v.lua zone.lua \[m
[31m-	      dis_x86.lua dis_x64.lua dis_arm.lua dis_ppc.lua \[m
[31m-	      dis_mips.lua dis_mipsel.lua vmdef.lua[m
[31m-[m
[31m-ifeq (,$(findstring Windows,$(OS)))[m
[31m-  HOST_SYS:= $(shell uname -s)[m
[31m-else[m
[31m-  HOST_SYS= Windows[m
[31m-endif[m
[31m-TARGET_SYS?= $(HOST_SYS)[m
[31m-[m
[31m-ifeq (Darwin,$(TARGET_SYS))[m
[31m-  INSTALL_SONAME= $(INSTALL_DYLIBNAME)[m
[31m-  INSTALL_SOSHORT1= $(INSTALL_DYLIBSHORT1)[m
[31m-  INSTALL_SOSHORT2= $(INSTALL_DYLIBSHORT2)[m
[31m-  LDCONFIG= :[m
[31m-endif[m
[31m-[m
[31m-##############################################################################[m
[31m-[m
[31m-INSTALL_DEP= src/luajit[m
[31m-[m
[31m-default all $(INSTALL_DEP):[m
[31m-	@echo "==== Building LuaJIT $(VERSION) ===="[m
[31m-	$(MAKE) -C src[m
[31m-	@echo "==== Successfully built LuaJIT $(VERSION) ===="[m
[31m-[m
[31m-install: $(INSTALL_DEP)[m
[31m-	@echo "==== Installing LuaJIT $(VERSION) to $(PREFIX) ===="[m
[31m-	$(MKDIR) $(INSTALL_DIRS)[m
[31m-	cd src && $(INSTALL_X) $(FILE_T) $(INSTALL_T)[m
[31m-	cd src && test -f $(FILE_A) && $(INSTALL_F) $(FILE_A) $(INSTALL_STATIC) || :[m
[31m-	$(RM) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2)[m
[31m-	cd src && test -f $(FILE_SO) && \[m
[31m-	  $(INSTALL_X) $(FILE_SO) $(INSTALL_DYN) && \[m
[31m-	  $(LDCONFIG) $(INSTALL_LIB) && \[m
[31m-	  $(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT1) && \[m
[31m-	  $(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT2) || :[m
[31m-	cd etc && $(INSTALL_F) $(FILE_MAN) $(INSTALL_MAN)[m
[31m-	cd etc && $(SED_PC) $(FILE_PC) > $(FILE_PC).tmp && \[m
[31m-	  $(INSTALL_F) $(FILE_PC).tmp $(INSTALL_PC) && \[m
[31m-	  $(RM) $(FILE_PC).tmp[m
[31m-	cd src && $(INSTALL_F) $(FILES_INC) $(INSTALL_INC)[m
[31m-	cd src/jit && $(INSTALL_F) $(FILES_JITLIB) $(INSTALL_JITLIB)[m
[31m-	$(SYMLINK) $(INSTALL_TNAME) $(INSTALL_TSYM)[m
[31m-	@echo "==== Successfully installed LuaJIT $(VERSION) to $(PREFIX) ===="[m
[31m-[m
[31m-[m
[31m-uninstall:[m
[31m-	@echo "==== Uninstalling LuaJIT $(VERSION) from $(PREFIX) ===="[m
[31m-	$(UNINSTALL) $(INSTALL_T) $(INSTALL_STATIC) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2) $(INSTALL_MAN)/$(FILE_MAN) $(INSTALL_PC)[m
[31m-	for file in $(FILES_JITLIB); do \[m
[31m-	  $(UNINSTALL) $(INSTALL_JITLIB)/$$file; \[m
[31m-	  done[m
[31m-	for file in $(FILES_INC); do \[m
[31m-	  $(UNINSTALL) $(INSTALL_INC)/$$file; \[m
[31m-	  done[m
[31m-	$(LDCONFIG) $(INSTALL_LIB)[m
[31m-	$(RMDIR) $(UNINSTALL_DIRS) || :[m
[31m-	@echo "==== Successfully uninstalled LuaJIT $(VERSION) from $(PREFIX) ===="[m
[31m-[m
[31m-##############################################################################[m
[31m-[m
[31m-amalg:[m
[31m-	@echo "Building LuaJIT $(VERSION)"[m
[31m-	$(MAKE) -C src amalg[m
[31m-[m
[31m-clean:[m
[31m-	$(MAKE) -C src clean[m
[31m-[m
[31m-.PHONY: all install amalg clean[m
[31m-[m
[31m-##############################################################################[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/README[m
[1mdeleted file mode 100644[m
[1mindex 01fd4a0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/README[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-README for LuaJIT 2.1.0-beta2[m
[31m------------------------------[m
[31m-[m
[31m-LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming language.[m
[31m-[m
[31m-Project Homepage: http://luajit.org/[m
[31m-[m
[31m-LuaJIT is Copyright (C) 2005-2016 Mike Pall.[m
[31m-LuaJIT is free software, released under the MIT license.[m
[31m-See full Copyright Notice in the COPYRIGHT file or in luajit.h.[m
[31m-[m
[31m-Documentation for LuaJIT is available in HTML format.[m
[31m-Please point your favorite browser to:[m
[31m-[m
[31m- doc/luajit.html[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/bluequad-print.css b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/bluequad-print.css[m
[1mdeleted file mode 100644[m
[1mindex 975a55b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/bluequad-print.css[m
[1m+++ /dev/null[m
[36m@@ -1,166 +0,0 @@[m
[31m-/* Copyright (C) 2004-2016 Mike Pall.[m
[31m- *[m
[31m- * You are welcome to use the general ideas of this design for your own sites.[m
[31m- * But please do not steal the stylesheet, the layout or the color scheme.[m
[31m- */[m
[31m-body {[m
[31m-  font-family: serif;[m
[31m-  font-size: 11pt;[m
[31m-  margin: 0 3em;[m
[31m-  padding: 0;[m
[31m-  border: none;[m
[31m-}[m
[31m-a:link, a:visited, a:hover, a:active {[m
[31m-  text-decoration: none;[m
[31m-  background: transparent;[m
[31m-  color: #0000ff;[m
[31m-}[m
[31m-h1, h2, h3 {[m
[31m-  font-family: sans-serif;[m
[31m-  font-weight: bold;[m
[31m-  text-align: left;[m
[31m-  margin: 0.5em 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-h1 {[m
[31m-  font-size: 200%;[m
[31m-}[m
[31m-h2 {[m
[31m-  font-size: 150%;[m
[31m-}[m
[31m-h3 {[m
[31m-  font-size: 125%;[m
[31m-}[m
[31m-p {[m
[31m-  margin: 0 0 0.5em 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-ul, ol {[m
[31m-  margin: 0.5em 0;[m
[31m-  padding: 0 0 0 2em;[m
[31m-}[m
[31m-ul {[m
[31m-  list-style: outside square;[m
[31m-}[m
[31m-ol {[m
[31m-  list-style: outside decimal;[m
[31m-}[m
[31m-li {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-dl {[m
[31m-  margin: 1em 0;[m
[31m-  padding: 1em;[m
[31m-  border: 1px solid black;[m
[31m-}[m
[31m-dt {[m
[31m-  font-weight: bold;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-dt sup {[m
[31m-  float: right;[m
[31m-  margin-left: 1em;[m
[31m-}[m
[31m-dd {[m
[31m-  margin: 0.5em 0 0 2em;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-table {[m
[31m-  table-layout: fixed;[m
[31m-  width: 100%;[m
[31m-  margin: 1em 0;[m
[31m-  padding: 0;[m
[31m-  border: 1px solid black;[m
[31m-  border-spacing: 0;[m
[31m-  border-collapse: collapse;[m
[31m-}[m
[31m-tr {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-  border: none;[m
[31m-}[m
[31m-td {[m
[31m-  text-align: left;[m
[31m-  margin: 0;[m
[31m-  padding: 0.2em 0.5em;[m
[31m-  border-top: 1px solid black;[m
[31m-  border-bottom: 1px solid black;[m
[31m-}[m
[31m-tr.separate td {[m
[31m-  border-top: double;[m
[31m-}[m
[31m-tt, pre, code, kbd, samp {[m
[31m-  font-family: monospace;[m
[31m-  font-size: 75%;[m
[31m-}[m
[31m-kbd {[m
[31m-  font-weight: bolder;[m
[31m-}[m
[31m-blockquote, pre {[m
[31m-  margin: 1em 2em;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-img {[m
[31m-  border: none;[m
[31m-  vertical-align: baseline;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-img.left {[m
[31m-  float: left;[m
[31m-  margin: 0.5em 1em 0.5em 0;[m
[31m-}[m
[31m-img.right {[m
[31m-  float: right;[m
[31m-  margin: 0.5em 0 0.5em 1em;[m
[31m-}[m
[31m-.flush {[m
[31m-  clear: both;[m
[31m-  visibility: hidden;[m
[31m-}[m
[31m-.hide, .noprint, #nav {[m
[31m-  display: none !important;[m
[31m-}[m
[31m-.pagebreak {[m
[31m-  page-break-before: always;[m
[31m-}[m
[31m-#site {[m
[31m-  text-align: right;[m
[31m-  font-family: sans-serif;[m
[31m-  font-weight: bold;[m
[31m-  margin: 0 1em;[m
[31m-  border-bottom: 1pt solid black;[m
[31m-}[m
[31m-#site a {[m
[31m-  font-size: 1.2em;[m
[31m-}[m
[31m-#site a:link, #site a:visited {[m
[31m-  text-decoration: none;[m
[31m-  font-weight: bold;[m
[31m-  background: transparent;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#logo {[m
[31m-  color: #ff8000;[m
[31m-}[m
[31m-#head {[m
[31m-  clear: both;[m
[31m-  margin: 0 1em;[m
[31m-}[m
[31m-#main {[m
[31m-  line-height: 1.3;[m
[31m-  text-align: justify;[m
[31m-  margin: 1em;[m
[31m-}[m
[31m-#foot {[m
[31m-  clear: both;[m
[31m-  font-size: 80%;[m
[31m-  text-align: center;[m
[31m-  margin: 0 1.25em;[m
[31m-  padding: 0.5em 0 0 0;[m
[31m-  border-top: 1pt solid black;[m
[31m-  page-break-before: avoid;[m
[31m-  page-break-after: avoid;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/bluequad.css b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/bluequad.css[m
[1mdeleted file mode 100644[m
[1mindex 5dca906..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/bluequad.css[m
[1m+++ /dev/null[m
[36m@@ -1,325 +0,0 @@[m
[31m-/* Copyright (C) 2004-2016 Mike Pall.[m
[31m- *[m
[31m- * You are welcome to use the general ideas of this design for your own sites.[m
[31m- * But please do not steal the stylesheet, the layout or the color scheme.[m
[31m- */[m
[31m-/* colorscheme:[m
[31m- *[m
[31m- * site  |  head   #4162bf/white   | #6078bf/#e6ecff[m
[31m- * ------+------   ----------------+-------------------[m
[31m- * nav   |  main   #bfcfff         | #e6ecff/black[m
[31m- *[m
[31m- * nav:  hiback   loback     #c5d5ff #b9c9f9[m
[31m- *       hiborder loborder   #e6ecff #97a7d7[m
[31m- *       link     hover      #2142bf #ff0000[m
[31m- *[m
[31m- * link: link visited hover  #2142bf #8122bf #ff0000[m
[31m- *[m
[31m- * main: boxback  boxborder  #f0f4ff #bfcfff[m
[31m- */[m
[31m-body {[m
[31m-  font-family: Verdana, Arial, Helvetica, sans-serif;[m
[31m-  font-size: 10pt;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-  border: none;[m
[31m-  background: #e0e0e0;[m
[31m-  color: #000000;[m
[31m-}[m
[31m-a:link {[m
[31m-  text-decoration: none;[m
[31m-  background: transparent;[m
[31m-  color: #2142bf;[m
[31m-}[m
[31m-a:visited {[m
[31m-  text-decoration: none;[m
[31m-  background: transparent;[m
[31m-  color: #8122bf;[m
[31m-}[m
[31m-a:hover, a:active {[m
[31m-  text-decoration: underline;[m
[31m-  background: transparent;[m
[31m-  color: #ff0000;[m
[31m-}[m
[31m-h1, h2, h3 {[m
[31m-  font-weight: bold;[m
[31m-  text-align: left;[m
[31m-  margin: 0.5em 0;[m
[31m-  padding: 0;[m
[31m-  background: transparent;[m
[31m-}[m
[31m-h1 {[m
[31m-  font-size: 200%;[m
[31m-  line-height: 3em; /* really 6em relative to body, match #site span */[m
[31m-  margin: 0;[m
[31m-}[m
[31m-h2 {[m
[31m-  font-size: 150%;[m
[31m-  color: #606060;[m
[31m-}[m
[31m-h3 {[m
[31m-  font-size: 125%;[m
[31m-  color: #404040;[m
[31m-}[m
[31m-p {[m
[31m-  max-width: 600px;[m
[31m-  margin: 0 0 0.5em 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-b {[m
[31m-  color: #404040;[m
[31m-}[m
[31m-ul, ol {[m
[31m-  max-width: 600px;[m
[31m-  margin: 0.5em 0;[m
[31m-  padding: 0 0 0 2em;[m
[31m-}[m
[31m-ul {[m
[31m-  list-style: outside square;[m
[31m-}[m
[31m-ol {[m
[31m-  list-style: outside decimal;[m
[31m-}[m
[31m-li {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-dl {[m
[31m-  max-width: 600px;[m
[31m-  margin: 1em 0;[m
[31m-  padding: 1em;[m
[31m-  border: 1px solid #bfcfff;[m
[31m-  background: #f0f4ff;[m
[31m-}[m
[31m-dt {[m
[31m-  font-weight: bold;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-dt sup {[m
[31m-  float: right;[m
[31m-  margin-left: 1em;[m
[31m-  color: #808080;[m
[31m-}[m
[31m-dt a:visited {[m
[31m-  text-decoration: none;[m
[31m-  color: #2142bf;[m
[31m-}[m
[31m-dt a:hover, dt a:active {[m
[31m-  text-decoration: none;[m
[31m-  color: #ff0000;[m
[31m-}[m
[31m-dd {[m
[31m-  margin: 0.5em 0 0 2em;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-div.tablewrap { /* for IE *sigh* */[m
[31m-  max-width: 600px;[m
[31m-}[m
[31m-table {[m
[31m-  table-layout: fixed;[m
[31m-  border-spacing: 0;[m
[31m-  border-collapse: collapse;[m
[31m-  max-width: 600px;[m
[31m-  width: 100%;[m
[31m-  margin: 1em 0;[m
[31m-  padding: 0;[m
[31m-  border: 1px solid #bfcfff;[m
[31m-}[m
[31m-tr {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-  border: none;[m
[31m-}[m
[31m-tr.odd {[m
[31m-  background: #f0f4ff;[m
[31m-}[m
[31m-tr.separate td {[m
[31m-  border-top: 1px solid #bfcfff;[m
[31m-}[m
[31m-td {[m
[31m-  text-align: left;[m
[31m-  margin: 0;[m
[31m-  padding: 0.2em 0.5em;[m
[31m-  border: none;[m
[31m-}[m
[31m-tt, code, kbd, samp {[m
[31m-  font-family: Courier New, Courier, monospace;[m
[31m-  line-height: 1.2;[m
[31m-  font-size: 110%;[m
[31m-}[m
[31m-kbd {[m
[31m-  font-weight: bolder;[m
[31m-}[m
[31m-blockquote, pre {[m
[31m-  max-width: 600px;[m
[31m-  margin: 1em 2em;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-pre {[m
[31m-  line-height: 1.1;[m
[31m-}[m
[31m-pre.code {[m
[31m-  line-height: 1.4;[m
[31m-  margin: 0.5em 0 1em 0.5em;[m
[31m-  padding: 0.5em 1em;[m
[31m-  border: 1px solid #bfcfff;[m
[31m-  background: #f0f4ff;[m
[31m-}[m
[31m-pre.mark {[m
[31m-  padding-left: 2em;[m
[31m-}[m
[31m-span.codemark {[m
[31m-  position:absolute;[m
[31m-  left: 16em;[m
[31m-  color: #4040c0;[m
[31m-}[m
[31m-span.mark {[m
[31m-  color: #4040c0;[m
[31m-  font-family: Courier New, Courier, monospace;[m
[31m-  line-height: 1.1;[m
[31m-}[m
[31m-img {[m
[31m-  border: none;[m
[31m-  vertical-align: baseline;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-img.left {[m
[31m-  float: left;[m
[31m-  margin: 0.5em 1em 0.5em 0;[m
[31m-}[m
[31m-img.right {[m
[31m-  float: right;[m
[31m-  margin: 0.5em 0 0.5em 1em;[m
[31m-}[m
[31m-.indent {[m
[31m-  padding-left: 1em;[m
[31m-}[m
[31m-.flush {[m
[31m-  clear: both;[m
[31m-  visibility: hidden;[m
[31m-}[m
[31m-.hide, .noscreen {[m
[31m-  display: none !important;[m
[31m-}[m
[31m-.ext {[m
[31m-  color: #ff8000;[m
[31m-}[m
[31m-.new {[m
[31m-  font-size: 6pt;[m
[31m-  vertical-align: middle;[m
[31m-  background: #ff8000;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#site {[m
[31m-  clear: both;[m
[31m-  float: left;[m
[31m-  width: 13em;[m
[31m-  text-align: center;[m
[31m-  font-weight: bold;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-  background: transparent;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#site a {[m
[31m-  font-size: 200%;[m
[31m-}[m
[31m-#site a:link, #site a:visited {[m
[31m-  text-decoration: none;[m
[31m-  font-weight: bold;[m
[31m-  background: transparent;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#site span {[m
[31m-  line-height: 3em; /* really 6em relative to body, match h1 */[m
[31m-}[m
[31m-#logo {[m
[31m-  color: #ffb380;[m
[31m-}[m
[31m-#head {[m
[31m-  margin: 0;[m
[31m-  padding: 0 0 0 2em;[m
[31m-  border-left: solid 13em #4162bf;[m
[31m-  border-right: solid 3em #6078bf;[m
[31m-  background: #6078bf;[m
[31m-  color: #e6ecff;[m
[31m-}[m
[31m-#nav {[m
[31m-  clear: both;[m
[31m-  float: left;[m
[31m-  overflow: hidden;[m
[31m-  text-align: left;[m
[31m-  line-height: 1.5;[m
[31m-  width: 13em;[m
[31m-  padding-top: 1em;[m
[31m-  background: transparent;[m
[31m-}[m
[31m-#nav ul {[m
[31m-  list-style: none outside;[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-#nav li {[m
[31m-  margin: 0;[m
[31m-  padding: 0;[m
[31m-}[m
[31m-#nav a {[m
[31m-  display: block;[m
[31m-  text-decoration: none;[m
[31m-  font-weight: bold;[m
[31m-  margin: 0;[m
[31m-  padding: 2px 1em;[m
[31m-  border-top: 1px solid transparent;[m
[31m-  border-bottom: 1px solid transparent;[m
[31m-  background: transparent;[m
[31m-  color: #2142bf;[m
[31m-}[m
[31m-#nav a:hover, #nav a:active {[m
[31m-  text-decoration: none;[m
[31m-  border-top: 1px solid #97a7d7;[m
[31m-  border-bottom: 1px solid #e6ecff;[m
[31m-  background: #b9c9f9;[m
[31m-  color: #ff0000;[m
[31m-}[m
[31m-#nav a.current, #nav a.current:hover, #nav a.current:active {[m
[31m-  border-top: 1px solid #e6ecff;[m
[31m-  border-bottom: 1px solid #97a7d7;[m
[31m-  background: #c5d5ff;[m
[31m-  color: #2142bf;[m
[31m-}[m
[31m-#nav ul ul a {[m
[31m-  padding: 0 1em 0 1.7em;[m
[31m-}[m
[31m-#nav ul ul ul a {[m
[31m-  padding: 0 0.5em 0 2.4em;[m
[31m-}[m
[31m-#main {[m
[31m-  line-height: 1.5;[m
[31m-  text-align: left;[m
[31m-  margin: 0;[m
[31m-  padding: 1em 2em;[m
[31m-  border-left: solid 13em #bfcfff;[m
[31m-  border-right: solid 3em #e6ecff;[m
[31m-  background: #e6ecff;[m
[31m-}[m
[31m-#foot {[m
[31m-  clear: both;[m
[31m-  font-size: 80%;[m
[31m-  text-align: center;[m
[31m-  margin: 0;[m
[31m-  padding: 0.5em;[m
[31m-  background: #6078bf;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#foot a:link, #foot a:visited {[m
[31m-  text-decoration: underline;[m
[31m-  background: transparent;[m
[31m-  color: #ffffff;[m
[31m-}[m
[31m-#foot a:hover, #foot a:active {[m
[31m-  text-decoration: underline;[m
[31m-  background: transparent;[m
[31m-  color: #bfcfff;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/changes.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/changes.html[m
[1mdeleted file mode 100644[m
[1mindex 9684d7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/changes.html[m
[1m+++ /dev/null[m
[36m@@ -1,817 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>LuaJIT Change History</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-div.major { max-width: 600px; padding: 1em; margin: 1em 0 1em 0; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>LuaJIT Change History</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a class="current" href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-This is a list of changes between the released versions of LuaJIT.<br>[m
[31m-The current <span style="color: #0000c0;">stable version</span> is <strong>LuaJIT&nbsp;2.0.4</strong>.<br>[m
[31m-</p>[m
[31m-<p>[m
[31m-Please check the[m
[31m-<a href="http://luajit.org/changes.html"><span class="ext">&raquo;</span>&nbsp;Online Change History</a>[m
[31m-to see whether newer versions are available.[m
[31m-</p>[m
[31m-[m
[31m-<div class="major" style="background: #d0d0ff;">[m
[31m-<h2 id="LuaJIT-2.1.0-beta2">LuaJIT 2.1.0-beta2 &mdash; 2016-03-03</h2>[m
[31m-<ul>[m
[31m-<li>Enable trace stitching.</li>[m
[31m-<li>Use internal implementation for converting FP numbers to strings.</li>[m
[31m-<li>Parse Unicode escape <tt>'\u{XX...}'</tt> in string literals.</li>[m
[31m-<li>Add MIPS soft-float support.</li>[m
[31m-<li>Switch MIPS port to dual-number mode.</li>[m
[31m-<li>x86/x64: Add support for AES-NI, AVX and AVX2 to DynASM.</li>[m
[31m-<li>FFI: Add <tt>ssize_t</tt> declaration.</li>[m
[31m-<li>FFI: Parse <tt>#line NN</tt> and <tt>#NN</tt>.</li>[m
[31m-<li>Various minor fixes.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.1.0-beta1">LuaJIT 2.1.0-beta1 &mdash; 2015-08-25</h2>[m
[31m-<p>[m
[31m-This is a brief summary of the major changes in LuaJIT 2.1 compared to 2.0.[m
[31m-Please take a look at the commit history for more details.[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>Changes to the VM core:[m
[31m-<ul>[m
[31m-<li>Add low-overhead profiler (<tt>-jp</tt>).</li>[m
[31m-<li>Add <tt>LJ_GC64</tt> mode: 64 bit GC object references (really: 47 bit). Interpreter-only for now.</li>[m
[31m-<li>Add <tt>LJ_FR2</tt> mode: Two-slot frame info. Required by <tt>LJ_GC64</tt> mode.</li>[m
[31m-<li>Add <tt>table.new()</tt> and <tt>table.clear()</tt>.</li>[m
[31m-<li>Parse binary number literals (<tt>0bxxx</tt>).</li>[m
[31m-</ul></li>[m
[31m-<li>Improvements to the JIT compiler:[m
[31m-<ul>[m
[31m-<li>Add trace stitching (disabled for now).</li>[m
[31m-<li>Compile various builtins: <tt>string.char()</tt>, <tt>string.reverse()</tt>, <tt>string.lower()</tt>, <tt>string.upper()</tt>, <tt>string.rep()</tt>, <tt>string.format()</tt>, <tt>table.concat()</tt>, <tt>bit.tohex()</tt>, <tt>getfenv(0)</tt>, <tt>debug.getmetatable()</tt>.</li>[m
[31m-<li>Compile <tt>string.find()</tt> for fixed string searches (no patterns).</li>[m
[31m-<li>Compile <tt>BC_TSETM</tt>, e.g. <tt>{1,2,3,f()}</tt>.</li>[m
[31m-<li>Compile string concatenations (<tt>BC_CAT</tt>).</li>[m
[31m-<li>Compile <tt>__concat</tt> metamethod.</li>[m
[31m-<li>Various minor optimizations.</li>[m
[31m-</ul></li>[m
[31m-<li>Internal Changes:[m
[31m-<ul>[m
[31m-<li>Add support for embedding LuaJIT bytecode for builtins.</li>[m
[31m-<li>Replace various builtins with embedded bytecode.</li>[m
[31m-<li>Refactor string buffers and string formatting.</li>[m
[31m-<li>Remove obsolete non-truncating number to integer conversions.</li>[m
[31m-</ul></li>[m
[31m-<li>Ports:[m
[31m-<ul>[m
[31m-<li>Add Xbox One port (<tt>LJ_GC64</tt> mode).</li>[m
[31m-<li>ARM64: Add port of the interpreter (<tt>LJ_GC64</tt> mode).</li>[m
[31m-<li>x64: Add separate port of the interpreter to <tt>LJ_GC64</tt> mode.</li>[m
[31m-<li>x86/x64: Drop internal x87 math functions. Use libm functions.</li>[m
[31m-<li>x86: Remove x87 support from interpreter. SSE2 is mandatory now.</li>[m
[31m-<li>PPC/e500: Drop support for this architecture.</li>[m
[31m-</ul></li>[m
[31m-<li>FFI library:[m
[31m-<ul>[m
[31m-<li>FFI: Add 64 bit bitwise operations.</li>[m
[31m-<li>FFI: Compile VLA/VLS and large cdata allocations with default initialization.</li>[m
[31m-<li>FFI: Compile conversions from functions to function pointers.</li>[m
[31m-<li>FFI: Compile lightuserdata to <tt>void *</tt> conversion.</li>[m
[31m-<li>FFI: Compile <tt>ffi.gc(cdata, nil)</tt>, too.</li>[m
[31m-<li>FFI: Add <tt>ffi.typeinfo()</tt>.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-</div>[m
[31m-[m
[31m-<div class="major" style="background: #ffffd0;">[m
[31m-<h2 id="LuaJIT-2.0.4">LuaJIT 2.0.4 &mdash; 2015-05-14</h2>[m
[31m-<ul>[m
[31m-<li>Fix stack check in narrowing optimization.</li>[m
[31m-<li>Fix Lua/C API typecheck error for special indexes.</li>[m
[31m-<li>Fix string to number conversion.</li>[m
[31m-<li>Fix lexer error for chunks without tokens.</li>[m
[31m-<li>Don't compile <tt>IR_RETF</tt> after <tt>CALLT</tt> to ff with-side effects.</li>[m
[31m-<li>Fix <tt>BC_UCLO</tt>/<tt>BC_JMP</tt> join optimization in Lua parser.</li>[m
[31m-<li>Fix corner case in string to number conversion.</li>[m
[31m-<li>Gracefully handle <tt>lua_error()</tt> for a suspended coroutine.</li>[m
[31m-<li>Avoid error messages when building with Clang.</li>[m
[31m-<li>Fix snapshot #0 handling for traces with a stack check on entry.</li>[m
[31m-<li>Fix fused constant loads under high register pressure.</li>[m
[31m-<li>Invalidate backpropagation cache after DCE.</li>[m
[31m-<li>Fix ABC elimination.</li>[m
[31m-<li>Fix debug info for main chunk of stripped bytecode.</li>[m
[31m-<li>Fix FOLD rule for <tt>string.sub(s, ...) == k</tt>.</li>[m
[31m-<li>Fix FOLD rule for <tt>STRREF</tt> of <tt>SNEW</tt>.</li>[m
[31m-<li>Fix frame traversal while searching for error function.</li>[m
[31m-<li>Prevent GC estimate miscalculation due to buffer growth.</li>[m
[31m-<li>Prevent adding side traces for stack checks.</li>[m
[31m-<li>Fix top slot calculation for snapshots with continuations.</li>[m
[31m-<li>Fix check for reuse of SCEV results in <tt>FORL</tt>.</li>[m
[31m-<li>Add PS Vita port.</li>[m
[31m-<li>Fix compatibility issues with Illumos.</li>[m
[31m-<li>Fix DragonFly build (unsupported).</li>[m
[31m-<li>OpenBSD/x86: Better executable memory allocation for W^X mode.</li>[m
[31m-<li>x86: Fix argument checks for <tt>ipairs()</tt> iterator.</li>[m
[31m-<li>x86: <tt>lj_math_random_step()</tt> clobbers XMM regs on OSX Clang.</li>[m
[31m-<li>x86: Fix code generation for unused result of <tt>math.random()</tt>.</li>[m
[31m-<li>x64: Allow building with <tt>LUAJIT_USE_SYSMALLOC</tt> and <tt>LUAJIT_USE_VALGRIND</tt>.</li>[m
[31m-<li>x86/x64: Fix argument check for bit shifts.</li>[m
[31m-<li>x86/x64: Fix code generation for fused test/arith ops.</li>[m
[31m-<li>ARM: Fix write barrier check in <tt>BC_USETS</tt>.</li>[m
[31m-<li>PPC: Fix red zone overflow in machine code generation.</li>[m
[31m-<li>PPC: Don't use <tt>mcrxr</tt> on PPE.</li>[m
[31m-<li>Various archs: Fix excess stack growth in interpreter.</li>[m
[31m-<li>FFI: Fix FOLD rule for <tt>TOBIT</tt> + <tt>CONV num.u32</tt>.</li>[m
[31m-<li>FFI: Prevent DSE across <tt>ffi.string()</tt>.</li>[m
[31m-<li>FFI: No meta fallback when indexing pointer to incomplete struct.</li>[m
[31m-<li>FFI: Fix initialization of unions of subtypes.</li>[m
[31m-<li>FFI: Fix cdata vs. non-cdata arithmetic and comparisons.</li>[m
[31m-<li>FFI: Fix <tt>__index</tt>/<tt>__newindex</tt> metamethod resolution for ctypes.</li>[m
[31m-<li>FFI: Fix compilation of reference field access.</li>[m
[31m-<li>FFI: Fix frame traversal for backtraces with FFI callbacks.</li>[m
[31m-<li>FFI: Fix recording of indexing a struct pointer ctype object itself.</li>[m
[31m-<li>FFI: Allow non-scalar cdata to be compared for equality by address.</li>[m
[31m-<li>FFI: Fix pseudo type conversions for type punning.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.3">LuaJIT 2.0.3 &mdash; 2014-03-12</h2>[m
[31m-<ul>[m
[31m-<li>Add PS4 port.</li>[m
[31m-<li>Add support for multilib distro builds.</li>[m
[31m-<li>Fix OSX build.</li>[m
[31m-<li>Fix MinGW build.</li>[m
[31m-<li>Fix Xbox 360 build.</li>[m
[31m-<li>Improve ULOAD forwarding for open upvalues.</li>[m
[31m-<li>Fix GC steps threshold handling when called by JIT-compiled code.</li>[m
[31m-<li>Fix argument checks for <tt>math.deg()</tt> and <tt>math.rad()</tt>.</li>[m
[31m-<li>Fix <tt>jit.flush(func|true)</tt>.</li>[m
[31m-<li>Respect <tt>jit.off(func)</tt> when returning to a function, too.</li>[m
[31m-<li>Fix compilation of <tt>string.byte(s, nil, n)</tt>.</li>[m
[31m-<li>Fix line number for relocated bytecode after closure fixup</li>[m
[31m-<li>Fix frame traversal for backtraces.</li>[m
[31m-<li>Fix ABC elimination.</li>[m
[31m-<li>Fix handling of redundant PHIs.</li>[m
[31m-<li>Fix snapshot restore for exit to function header.</li>[m
[31m-<li>Fix type punning alias analysis for constified pointers</li>[m
[31m-<li>Fix call unroll checks in the presence of metamethod frames.</li>[m
[31m-<li>Fix initial maxslot for down-recursive traces.</li>[m
[31m-<li>Prevent BASE register coalescing if parent uses <tt>IR_RETF</tt>.</li>[m
[31m-<li>Don't purge modified function from stack slots in <tt>BC_RET</tt>.</li>[m
[31m-<li>Fix recording of <tt>BC_VARG</tt>.</li>[m
[31m-<li>Don't access dangling reference to reallocated IR.</li>[m
[31m-<li>Fix frame depth display for bytecode dump in <tt>-jdump</tt>.</li>[m
[31m-<li>ARM: Fix register allocation when rematerializing FPRs.</li>[m
[31m-<li>x64: Fix store to upvalue for lightuserdata values.</li>[m
[31m-<li>FFI: Add missing GC steps for callback argument conversions.</li>[m
[31m-<li>FFI: Properly unload loaded DLLs.</li>[m
[31m-<li>FFI: Fix argument checks for <tt>ffi.string()</tt>.</li>[m
[31m-<li>FFI/x64: Fix passing of vector arguments to calls.</li>[m
[31m-<li>FFI: Rehash finalizer table after GC cycle, if needed.</li>[m
[31m-<li>FFI: Fix <tt>cts-&gt;L</tt> for cdata unsinking in snapshot restore.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.2">LuaJIT 2.0.2 &mdash; 2013-06-03</h2>[m
[31m-<ul>[m
[31m-<li>Fix memory access check for fast string interning.</li>[m
[31m-<li>Fix MSVC intrinsics for older versions.</li>[m
[31m-<li>Add missing GC steps for <tt>io.*</tt> functions.</li>[m
[31m-<li>Fix spurious red zone overflows in machine code generation.</li>[m
[31m-<li>Fix jump-range constrained mcode allocation.</li>[m
[31m-<li>Inhibit DSE for implicit loads via calls.</li>[m
[31m-<li>Fix builtin string to number conversion for overflow digits.</li>[m
[31m-<li>Fix optional argument handling while recording builtins.</li>[m
[31m-<li>Fix optional argument handling in <tt>table.concat()</tt>.</li>[m
[31m-<li>Add partial support for building with MingW64 GCC 4.8-SEH.</li>[m
[31m-<li>Add missing PHI barrier to <tt>string.sub(str, a, b) == kstr</tt> FOLD rule.</li>[m
[31m-<li>Fix compatibility issues with Illumos.</li>[m
[31m-<li>ARM: Fix cache flush/sync for exit stubs of JIT-compiled code.</li>[m
[31m-<li>MIPS: Fix cache flush/sync for JIT-compiled code jump area.</li>[m
[31m-<li>PPC: Add <tt>plt</tt> suffix for external calls from assembler code.</li>[m
[31m-<li>FFI: Fix snapshot substitution in SPLIT pass.</li>[m
[31m-<li>FFI/x86: Fix register allocation for 64 bit comparisons.</li>[m
[31m-<li>FFI: Fix tailcall in lowest frame to C&nbsp;function with bool result.</li>[m
[31m-<li>FFI: Ignore <tt>long</tt> type specifier in <tt>ffi.istype()</tt>.</li>[m
[31m-<li>FFI: Fix calling conventions for 32 bit OSX and iOS simulator (struct returns).</li>[m
[31m-<li>FFI: Fix calling conventions for ARM hard-float EABI (nested structs).</li>[m
[31m-<li>FFI: Improve error messages for arithmetic and comparison operators.</li>[m
[31m-<li>FFI: Insert no-op type conversion for pointer to integer cast.</li>[m
[31m-<li>FFI: Fix unroll limit for <tt>ffi.fill()</tt>.</li>[m
[31m-<li>FFI: Must sink <tt>XBAR</tt> together with <tt>XSTORE</tt>s.</li>[m
[31m-<li>FFI: Preserve intermediate string for <tt>const&nbsp;char&nbsp;*</tt> conversion.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.1">LuaJIT 2.0.1 &mdash; 2013-02-19</h2>[m
[31m-<ul>[m
[31m-<li>Don't clear frame for out-of-memory error.</li>[m
[31m-<li>Leave hook when resume catches error thrown from hook.</li>[m
[31m-<li>Add missing GC steps for template table creation.</li>[m
[31m-<li>Fix discharge order of comparisons in Lua parser.</li>[m
[31m-<li>Improve buffer handling for <tt>io.read()</tt>.</li>[m
[31m-<li>OSX: Add support for Mach-O object files to <tt>-b</tt> option.</li>[m
[31m-<li>Fix PS3 port.</li>[m
[31m-<li>Fix/enable Xbox 360 port.</li>[m
[31m-<li>x86/x64: Always mark ref for shift count as non-weak.</li>[m
[31m-<li>x64: Don't fuse implicitly 32-to-64 extended operands.</li>[m
[31m-<li>ARM: Fix armhf call argument handling.</li>[m
[31m-<li>ARM: Fix code generation for integer math.min/math.max.</li>[m
[31m-<li>PPC/e500: Fix <tt>lj_vm_floor()</tt> for Inf/NaN.</li>[m
[31m-<li>FFI: Change priority of table initializer variants for structs.</li>[m
[31m-<li>FFI: Fix code generation for bool call result check on x86/x64.</li>[m
[31m-<li>FFI: Load FFI library on-demand for bytecode with cdata literals.</li>[m
[31m-<li>FFI: Fix handling of qualified transparent structs/unions.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0">LuaJIT 2.0.0 &mdash; 2012-11-08</h2>[m
[31m-<ul>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-  <li>Fix Android/x86 build.</li>[m
[31m-  <li>Fix recording of equality comparisons with <tt>__eq</tt> metamethods.</li>[m
[31m-  <li>Fix detection of immutable upvalues.</li>[m
[31m-  <li>Replace error with PANIC for callbacks from JIT-compiled code.</li>[m
[31m-  <li>Fix builtin string to number conversion for <tt>INT_MIN</tt>.</li>[m
[31m-  <li>Don't create unneeded array part for template tables.</li>[m
[31m-  <li>Fix <tt>CONV.num.int</tt> sinking.</li>[m
[31m-  <li>Don't propagate implicitly widened number to index metamethods.</li>[m
[31m-  <li>ARM: Fix ordered comparisons of number vs. non-number.</li>[m
[31m-  <li>FFI: Fix code generation for replay of sunk float fields.</li>[m
[31m-  <li>FFI: Fix signedness of bool.</li>[m
[31m-  <li>FFI: Fix recording of bool call result check on x86/x64.</li>[m
[31m-  <li>FFI: Fix stack-adjustment for <tt>__thiscall</tt> callbacks.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta11">LuaJIT 2.0.0-beta11 &mdash; 2012-10-16</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-  <li>Use ARM VFP instructions, if available (build-time detection).</li>[m
[31m-  <li>Add support for ARM hard-float EABI (<tt>armhf</tt>).</li>[m
[31m-  <li>Add PS3 port.</li>[m
[31m-  <li>Add many features from Lua&nbsp;5.2, e.g. <tt>goto</tt>/labels.[m
[31m-  Refer to <a href="extensions.html#lua52">this list</a>.</li>[m
[31m-  <li>FFI: Add parameterized C types.</li>[m
[31m-  <li>FFI: Add support for copy constructors.</li>[m
[31m-  <li>FFI: Equality comparisons never raise an error (treat as unequal instead).</li>[m
[31m-  <li>FFI: Box all accessed or returned enums.</li>[m
[31m-  <li>FFI: Check for <tt>__new</tt> metamethod when calling a constructor.</li>[m
[31m-  <li>FFI: Handle <tt>__pairs</tt>/<tt>__ipairs</tt> metamethods for cdata objects.</li>[m
[31m-  <li>FFI: Convert <tt>io.*</tt> file handle to <tt>FILE *</tt> pointer (but as a <tt>void *</tt>).</li>[m
[31m-  <li>FFI: Detect and support type punning through unions.</li>[m
[31m-  <li>FFI: Improve various error messages.</li>[m
[31m-</ul></li>[m
[31m-<li>Build-system reorganization:[m
[31m-<ul>[m
[31m-  <li>Reorganize directory layout:<br>[m
[31m-  <tt>lib/*</tt> &rarr; <tt>src/jit/*</tt><br>[m
[31m-  <tt>src/buildvm_*.dasc</tt> &rarr; <tt>src/vm_*.dasc</tt><br>[m
[31m-  <tt>src/buildvm_*.h</tt> &rarr; removed<br>[m
[31m-  <tt>src/buildvm*</tt> &rarr; <tt>src/host/*</tt></li>[m
[31m-  <li>Add minified Lua interpreter plus Lua BitOp (<tt>minilua</tt>) to run DynASM.</li>[m
[31m-  <li>Change DynASM bit operations to use Lua BitOp</li>[m
[31m-  <li>Translate only <tt>vm_*.dasc</tt> for detected target architecture.</li>[m
[31m-  <li>Improve target detection for <tt>msvcbuild.bat</tt>.</li>[m
[31m-  <li>Fix build issues on Cygwin and MinGW with optional MSys.</li>[m
[31m-  <li>Handle cross-compiles with FPU/no-FPU or hard-fp/soft-fp ABI mismatch.</li>[m
[31m-  <li>Remove some library functions for no-JIT/no-FFI builds.</li>[m
[31m-  <li>Add uninstall target to top-level Makefile.</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-  <li>Preserve snapshot #0 PC for all traces.</li>[m
[31m-  <li>Fix argument checks for <tt>coroutine.create()</tt>.</li>[m
[31m-  <li>Command line prints version and JIT status to <tt>stdout</tt>, not <tt>stderr</tt>.</li>[m
[31m-  <li>Fix userdata <tt>__gc</tt> separations at Lua state close.</li>[m
[31m-  <li>Fix <tt>TDUP</tt> to <tt>HLOAD</tt> forwarding for <tt>LJ_DUALNUM</tt> builds.</li>[m
[31m-  <li>Fix buffer check in bytecode writer.</li>[m
[31m-  <li>Make <tt>os.date()</tt> thread-safe.</li>[m
[31m-  <li>Add missing declarations for MSVC intrinsics.</li>[m
[31m-  <li>Fix dispatch table modifications for return hooks.</li>[m
[31m-  <li>Workaround for MSVC conversion bug (<tt>double</tt> &rarr; <tt>uint32_t</tt> &rarr; <tt>int32_t</tt>).</li>[m
[31m-  <li>Fix FOLD rule <tt>(i-j)-i => 0-j</tt>.</li>[m
[31m-  <li>Never use DWARF unwinder on Windows.</li>[m
[31m-  <li>Fix shrinking of direct mapped blocks in builtin allocator.</li>[m
[31m-  <li>Limit recursion depth in <tt>string.match()</tt> et al.</li>[m
[31m-  <li>Fix late despecialization of <tt>ITERN</tt> after loop has been entered.</li>[m
[31m-  <li>Fix <tt>'f'</tt> and <tt>'L'</tt> options for <tt>debug.getinfo()</tt> and <tt>lua_getinfo()</tt>.</li>[m
[31m-  <li>Fix <tt>package.searchpath()</tt>.</li>[m
[31m-  <li>OSX: Change dylib names to be consistent with other platforms.</li>[m
[31m-  <li>Android: Workaround for broken <tt>sprintf("%g",&nbsp;-0.0)</tt>.</li>[m
[31m-  <li>x86: Remove support for ancient CPUs without <tt>CMOV</tt> (before Pentium Pro).</li>[m
[31m-  <li>x86: Fix register allocation for calls returning register pair.</li>[m
[31m-  <li>x86/x64: Fix fusion of unsigned byte comparisons with swapped operands.</li>[m
[31m-  <li>ARM: Fix <tt>tonumber()</tt> argument check.</li>[m
[31m-  <li>ARM: Fix modulo operator and <tt>math.floor()</tt>/<tt>math.ceil()</tt> for <tt>inf</tt>/<tt>nan</tt>.</li>[m
[31m-  <li>ARM: Invoke SPLIT pass for leftover <tt>IR_TOBIT</tt>.</li>[m
[31m-  <li>ARM: Fix BASE register coalescing.</li>[m
[31m-  <li>PPC: Fix interpreter state setup in callbacks.</li>[m
[31m-  <li>PPC: Fix <tt>string.sub()</tt> range check.</li>[m
[31m-  <li>MIPS: Support generation of MIPS/MIPSEL bytecode object files.</li>[m
[31m-  <li>MIPS: Fix calls to <tt>floor()</tt>/<tt>ceil()</tt><tt>/trunc()</tt>.</li>[m
[31m-  <li>ARM/PPC: Detect more target architecture variants.</li>[m
[31m-  <li>ARM/PPC/e500/MIPS: Fix tailcalls from fast functions, esp. <tt>tostring()</tt>.</li>[m
[31m-  <li>ARM/PPC/MIPS: Fix rematerialization of FP constants.</li>[m
[31m-  <li>FFI: Don't call <tt>FreeLibrary()</tt> on our own EXE/DLL.</li>[m
[31m-  <li>FFI: Resolve metamethods for constructors, too.</li>[m
[31m-  <li>FFI: Properly disable callbacks on iOS (would require executable memory).</li>[m
[31m-  <li>FFI: Fix cdecl string parsing during recording.</li>[m
[31m-  <li>FFI: Show address pointed to for <tt>tostring(ref)</tt>, too.</li>[m
[31m-  <li>FFI: Fix alignment of C call argument/return structure.</li>[m
[31m-  <li>FFI: Initialize all fields of standard types.</li>[m
[31m-  <li>FFI: Fix callback handling when new C&nbsp;types are declared in callback.</li>[m
[31m-  <li>FFI: Fix recording of constructors for pointers.</li>[m
[31m-  <li>FFI: Always resolve metamethods for pointers to structs.</li>[m
[31m-  <li>FFI: Correctly propagate alignment when interning nested types.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-  <li>Add allocation sinking and store sinking optimization.</li>[m
[31m-  <li>Constify immutable upvalues.</li>[m
[31m-  <li>Add builtin string to integer or FP number conversion. Improves cross-platform consistency and correctness.</li>[m
[31m-  <li>Create string hash slots in template tables for non-const values, too. Avoids later table resizes.</li>[m
[31m-  <li>Eliminate <tt>HREFK</tt> guard for template table references.</li>[m
[31m-  <li>Add various new FOLD rules.</li>[m
[31m-  <li>Don't use stack unwinding for <tt>lua_yield()</tt> (slow on x64).</li>[m
[31m-  <li>ARM, PPC, MIPS: Improve <tt>XLOAD</tt> operand fusion and register hinting.</li>[m
[31m-  <li>PPC, MIPS: Compile <tt>math.sqrt()</tt> to sqrt instruction, if available.</li>[m
[31m-  <li>FFI: Fold <tt>KPTR</tt> + constant offset in SPLIT pass.</li>[m
[31m-  <li>FFI: Optimize/inline <tt>ffi.copy()</tt> and <tt>ffi.fill()</tt>.</li>[m
[31m-  <li>FFI: Compile and optimize array/struct copies.</li>[m
[31m-  <li>FFI: Compile <tt>ffi.typeof(cdata|ctype)</tt>, <tt>ffi.sizeof()</tt>, <tt>ffi.alignof()</tt>, <tt>ffi.offsetof()</tt> and <tt>ffi.gc()</tt>.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta10">LuaJIT 2.0.0-beta10 &mdash; 2012-05-09</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>The MIPS of LuaJIT is complete. It requires a CPU conforming to the[m
[31m-MIPS32&nbsp;R1 architecture with hardware FPU. O32 hard-fp ABI,[m
[31m-little-endian or big-endian.</li>[m
[31m-<li>Auto-detect target arch via cross-compiler. No need for[m
[31m-<tt>TARGET=arch</tt> anymore.</li>[m
[31m-<li>Make DynASM compatible with Lua 5.2.</li>[m
[31m-<li>From Lua 5.2: Try <tt>__tostring</tt> metamethod on non-string error[m
[31m-messages..</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix parsing of hex literals with exponents.</li>[m
[31m-<li>Fix bytecode dump for certain number constants.</li>[m
[31m-<li>Fix argument type in error message for relative arguments.</li>[m
[31m-<li>Fix argument error handling on Lua stacks without a frame.</li>[m
[31m-<li>Add missing mcode limit check in assembler backend.</li>[m
[31m-<li>Fix compilation on OpenBSD.</li>[m
[31m-<li>Avoid recursive GC steps after GC-triggered trace exit.</li>[m
[31m-<li>Replace <tt>&lt;unwind.h&gt;</tt> definitions with our own.</li>[m
[31m-<li>Fix OSX build issues. Bump minimum required OSX version to 10.4.</li>[m
[31m-<li>Fix discharge order of comparisons in Lua parser.</li>[m
[31m-<li>Ensure running <tt>__gc</tt> of userdata created in <tt>__gc</tt>[m
[31m-at state close.</li>[m
[31m-<li>Limit number of userdata <tt>__gc</tt> separations at state close.</li>[m
[31m-<li>Fix bytecode <tt>JMP</tt> slot range when optimizing[m
[31m-<tt>and</tt>/<tt>or</tt> with constant LHS.</li>[m
[31m-<li>Fix DSE of <tt>USTORE</tt>.</li>[m
[31m-<li>Make <tt>lua_concat()</tt> work from C&nbsp;hook with partial frame.</li>[m
[31m-<li>Add required PHIs for implicit conversions, e.g. via <tt>XREF</tt>[m
[31m-forwarding.</li>[m
[31m-<li>Add more comparison variants to Valgrind suppressions file.</li>[m
[31m-<li>Disable loading bytecode with an extra header (BOM or <tt>#!</tt>).</li>[m
[31m-<li>Fix PHI stack slot syncing.</li>[m
[31m-<li>ARM: Reorder type/value tests to silence Valgrind.</li>[m
[31m-<li>ARM: Fix register allocation for <tt>ldrd</tt>-optimized[m
[31m-<tt>HREFK</tt>.</li>[m
[31m-<li>ARM: Fix conditional branch fixup for <tt>OBAR</tt>.</li>[m
[31m-<li>ARM: Invoke SPLIT pass for <tt>double</tt> args in FFI call.</li>[m
[31m-<li>ARM: Handle all <tt>CALL*</tt> ops with <tt>double</tt> results in[m
[31m-SPLIT pass.</li>[m
[31m-<li>ARM: Fix rejoin of <tt>POW</tt> in SPLIT pass.</li>[m
[31m-<li>ARM: Fix compilation of <tt>math.sinh</tt>, <tt>math.cosh</tt>,[m
[31m-<tt>math.tanh</tt>.</li>[m
[31m-<li>ARM, PPC: Avoid pointless arg clearing in <tt>BC_IFUNCF</tt>.</li>[m
[31m-<li>PPC: Fix resume after yield from hook.</li>[m
[31m-<li>PPC: Fix argument checking for <tt>rawget()</tt>.</li>[m
[31m-<li>PPC: Fix fusion of floating-point <tt>XLOAD</tt>/<tt>XSTORE</tt>.</li>[m
[31m-<li>PPC: Fix <tt>HREFK</tt> code generation for huge tables.</li>[m
[31m-<li>PPC: Use builtin D-Cache/I-Cache sync code.</li>[m
[31m-</ul></li>[m
[31m-<li>FFI library:[m
[31m-<ul>[m
[31m-<li>Ignore empty statements in <tt>ffi.cdef()</tt>.</li>[m
[31m-<li>Ignore number parsing errors while skipping definitions.</li>[m
[31m-<li>Don't touch frame in callbacks with tailcalls to fast functions.</li>[m
[31m-<li>Fix library unloading on POSIX systems.</li>[m
[31m-<li>Finalize cdata before userdata when closing the state.</li>[m
[31m-<li>Change <tt>ffi.load()</tt> library name resolution for Cygwin.</li>[m
[31m-<li>Fix resolving of function name redirects on Windows/x86.</li>[m
[31m-<li>Fix symbol resolving error messages on Windows.</li>[m
[31m-<li>Fix blacklisting of C functions calling callbacks.</li>[m
[31m-<li>Fix result type of pointer difference.</li>[m
[31m-<li>Use correct PC in FFI metamethod error message.</li>[m
[31m-<li>Allow <tt>'typedef _Bool int BOOL;'</tt> for the Windows API.</li>[m
[31m-<li>Don't record test for bool result of call, if ignored.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta9">LuaJIT 2.0.0-beta9 &mdash; 2011-12-14</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>PPC port of LuaJIT is complete. Default is the dual-number port[m
[31m-(usually faster). Single-number port selectable via <tt>src/Makefile</tt>[m
[31m-at build time.</li>[m
[31m-<li>Add FFI callback support.</li>[m
[31m-<li>Extend <tt>-b</tt> to generate <tt>.c</tt>, <tt>.h</tt> or <tt>.obj/.o</tt>[m
[31m-files with embedded bytecode.</li>[m
[31m-<li>Allow loading embedded bytecode with <tt>require()</tt>.</li>[m
[31m-<li>From Lua 5.2: Change to <tt>'\z'</tt> escape. Reject undefined escape[m
[31m-sequences.</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix OSX 10.7 build. Fix <tt>install_name</tt> and versioning on OSX.</li>[m
[31m-<li>Fix iOS build.</li>[m
[31m-<li>Install <tt>dis_arm.lua</tt>, too.</li>[m
[31m-<li>Mark installed shared library as executable.</li>[m
[31m-<li>Add debug option to <tt>msvcbuild.bat</tt> and improve error handling.</li>[m
[31m-<li>Fix data-flow analysis for iterators.</li>[m
[31m-<li>Fix forced unwinding triggered by external unwinder.</li>[m
[31m-<li>Record missing <tt>for</tt> loop slot loads (return to lower frame).</li>[m
[31m-<li>Always use ANSI variants of Windows system functions.</li>[m
[31m-<li>Fix GC barrier for multi-result table constructor (<tt>TSETM</tt>).</li>[m
[31m-<li>Fix/add various FOLD rules.</li>[m
[31m-<li>Add potential PHI for number conversions due to type instability.</li>[m
[31m-<li>Do not eliminate PHIs only referenced from other PHIs.</li>[m
[31m-<li>Correctly anchor implicit number to string conversions in Lua/C API.</li>[m
[31m-<li>Fix various stack limit checks.</li>[m
[31m-<li>x64: Use thread-safe exceptions for external unwinding (GCC platforms).</li>[m
[31m-<li>x64: Fix result type of cdata index conversions.</li>[m
[31m-<li>x64: Fix <tt>math.random()</tt> and <tt>bit.bswap()</tt> code generation.</li>[m
[31m-<li>x64: Fix <tt>lightuserdata</tt> comparisons.</li>[m
[31m-<li>x64: Always extend stack-passed arguments to pointer size.</li>[m
[31m-<li>ARM: Many fixes to code generation backend.</li>[m
[31m-<li>PPC/e500: Fix dispatch for binop metamethods.</li>[m
[31m-<li>PPC/e500: Save/restore condition registers when entering/leaving the VM.</li>[m
[31m-<li>PPC/e500: Fix write barrier in stores of strings to upvalues.</li>[m
[31m-</ul></li>[m
[31m-<li>FFI library:[m
[31m-<ul>[m
[31m-<li>Fix C comment parsing.</li>[m
[31m-<li>Fix snapshot optimization for cdata comparisons.</li>[m
[31m-<li>Fix recording of const/enum lookups in namespaces.</li>[m
[31m-<li>Fix call argument and return handling for <tt>I8/U8/I16/U16</tt> types.</li>[m
[31m-<li>Fix unfused loads of float fields.</li>[m
[31m-<li>Fix <tt>ffi.string()</tt> recording.</li>[m
[31m-<li>Save <tt>GetLastError()</tt> around <tt>ffi.load()</tt> and symbol[m
[31m-resolving, too.</li>[m
[31m-<li>Improve ld script detection in <tt>ffi.load()</tt>.</li>[m
[31m-<li>Record loads/stores to external variables in namespaces.</li>[m
[31m-<li>Compile calls to stdcall, fastcall and vararg functions.</li>[m
[31m-<li>Treat function ctypes like pointers in comparisons.</li>[m
[31m-<li>Resolve <tt>__call</tt> metamethod for pointers, too.</li>[m
[31m-<li>Record C function calls with bool return values.</li>[m
[31m-<li>Record <tt>ffi.errno()</tt>.</li>[m
[31m-<li>x86: Fix number to <tt>uint32_t</tt> conversion rounding.</li>[m
[31m-<li>x86: Fix 64 bit arithmetic in assembler backend.</li>[m
[31m-<li>x64: Fix struct-by-value calling conventions.</li>[m
[31m-<li>ARM: Ensure invocation of SPLIT pass for float conversions.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Display trace types with <tt>-jv</tt> and <tt>-jdump</tt>.</li>[m
[31m-<li>Record isolated calls. But prefer recording loops over calls.</li>[m
[31m-<li>Specialize to prototype for non-monomorphic functions. Solves the[m
[31m-trace-explosion problem for closure-heavy programming styles.</li>[m
[31m-<li>Always generate a portable <tt>vmdef.lua</tt>. Easier for distros.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta8">LuaJIT 2.0.0-beta8 &mdash; 2011-06-23</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>Soft-float ARM port of LuaJIT is complete.</li>[m
[31m-<li>Add support for bytecode loading/saving and <tt>-b</tt> command line[m
[31m-option.</li>[m
[31m-<li>From Lua 5.2: <tt>__len</tt> metamethod for tables[m
[31m-(disabled by default).</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>ARM: Misc. fixes for interpreter.</li>[m
[31m-<li>x86/x64: Fix <tt>bit.*</tt> argument checking in interpreter.</li>[m
[31m-<li>Catch early out-of-memory in memory allocator initialization.</li>[m
[31m-<li>Fix data-flow analysis for paths leading to an upvalue close.</li>[m
[31m-<li>Fix check for missing arguments in <tt>string.format()</tt>.</li>[m
[31m-<li>Fix Solaris/x86 build (note: not a supported target).</li>[m
[31m-<li>Fix recording of loops with instable directions in side traces.</li>[m
[31m-<li>x86/x64: Fix fusion of comparisons with <tt>u8</tt>/<tt>u16</tt>[m
[31m-<tt>XLOAD</tt>.</li>[m
[31m-<li>x86/x64: Fix register allocation for variable shifts.</li>[m
[31m-</ul></li>[m
[31m-<li>FFI library:[m
[31m-<ul>[m
[31m-<li>Add <tt>ffi.errno()</tt>. Save <tt>errno</tt>/<tt>GetLastError()</tt>[m
[31m-around allocations etc.</li>[m
[31m-<li>Fix <tt>__gc</tt> for VLA/VLS cdata objects.</li>[m
[31m-<li>Fix recording of casts from 32 bit cdata pointers to integers.</li>[m
[31m-<li><tt>tonumber(cdata)</tt> returns <tt>nil</tt> for non-numbers.</li>[m
[31m-<li>Show address pointed to for <tt>tostring(pointer)</tt>.</li>[m
[31m-<li>Print <tt>NULL</tt> pointers as <tt>"cdata&lt;... *&gt;: NULL"</tt>.</li>[m
[31m-<li>Support <tt>__tostring</tt> metamethod for pointers to structs, too.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>More tuning for loop unrolling heuristics.</li>[m
[31m-<li>Flatten and compress in-memory debug info (saves ~70%).</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta7">LuaJIT 2.0.0-beta7 &mdash; 2011-05-05</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>ARM port of the LuaJIT interpreter is complete.</li>[m
[31m-<li>FFI library: Add <tt>ffi.gc()</tt>, <tt>ffi.metatype()</tt>,[m
[31m-<tt>ffi.istype()</tt>.</li>[m
[31m-<li>FFI library: Resolve ld script redirection in <tt>ffi.load()</tt>.</li>[m
[31m-<li>From Lua 5.2: <tt>package.searchpath()</tt>, <tt>fp:read("*L")</tt>,[m
[31m-<tt>load(string)</tt>.</li>[m
[31m-<li>From Lua 5.2, disabled by default: empty statement,[m
[31m-<tt>table.unpack()</tt>, modified <tt>coroutine.running()</tt>.</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>FFI library: numerous fixes.</li>[m
[31m-<li>Fix type mismatches in store-to-load forwarding.</li>[m
[31m-<li>Fix error handling within metamethods.</li>[m
[31m-<li>Fix <tt>table.maxn()</tt>.</li>[m
[31m-<li>Improve accuracy of <tt>x^-k</tt> on x64.</li>[m
[31m-<li>Fix code generation for Intel Atom in x64 mode.</li>[m
[31m-<li>Fix narrowing of POW.</li>[m
[31m-<li>Fix recording of retried fast functions.</li>[m
[31m-<li>Fix code generation for <tt>bit.bnot()</tt> and multiplies.</li>[m
[31m-<li>Fix error location within cpcall frames.</li>[m
[31m-<li>Add workaround for old libgcc unwind bug.</li>[m
[31m-<li>Fix <tt>lua_yield()</tt> and <tt>getmetatable(lightuserdata)</tt> on x64.</li>[m
[31m-<li>Misc. fixes for PPC/e500 interpreter.</li>[m
[31m-<li>Fix stack slot updates for down-recursion.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Add dual-number mode (int/double) for the VM. Enabled for ARM.</li>[m
[31m-<li>Improve narrowing of arithmetic operators and <tt>for</tt> loops.</li>[m
[31m-<li>Tune loop unrolling heuristics and increase trace recorder limits.</li>[m
[31m-<li>Eliminate dead slots in snapshots using bytecode data-flow analysis.</li>[m
[31m-<li>Avoid phantom stores to proxy tables.</li>[m
[31m-<li>Optimize lookups in empty proxy tables.</li>[m
[31m-<li>Improve bytecode optimization of <tt>and</tt>/<tt>or</tt> operators.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta6">LuaJIT 2.0.0-beta6 &mdash; 2011-02-11</h2>[m
[31m-<ul>[m
[31m-<li>New features:[m
[31m-<ul>[m
[31m-<li>PowerPC/e500v2 port of the LuaJIT interpreter is complete.</li>[m
[31m-<li>Various minor features from Lua 5.2: Hex escapes in literals,[m
[31m-<tt>'\*'</tt> escape, reversible <tt>string.format("%q",s)</tt>,[m
[31m-<tt>"%g"</tt> pattern, <tt>table.sort</tt> checks callbacks,[m
[31m-<tt>os.exit(status|true|false[,close])</tt>.</li>[m
[31m-<li>Lua 5.2 <tt>__pairs</tt> and <tt>__ipairs</tt> metamethods[m
[31m-(disabled by default).</li>[m
[31m-<li>Initial release of the FFI library.</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix <tt>string.format()</tt> for non-finite numbers.</li>[m
[31m-<li>Fix memory leak when compiled to use the built-in allocator.</li>[m
[31m-<li>x86/x64: Fix unnecessary resize in <tt>TSETM</tt> bytecode.</li>[m
[31m-<li>Fix various GC issues with traces and <tt>jit.flush()</tt>.</li>[m
[31m-<li>x64: Fix fusion of indexes for array references.</li>[m
[31m-<li>x86/x64: Fix stack overflow handling for coroutine results.</li>[m
[31m-<li>Enable low-2GB memory allocation on FreeBSD/x64.</li>[m
[31m-<li>Fix <tt>collectgarbage("count")</tt> result if more than 2GB is in use.</li>[m
[31m-<li>Fix parsing of hex floats.</li>[m
[31m-<li>x86/x64: Fix loop branch inversion with trailing[m
[31m-<tt>HREF+NE/EQ</tt>.</li>[m
[31m-<li>Add <tt>jit.os</tt> string.</li>[m
[31m-<li><tt>coroutine.create()</tt> permits running C functions, too.</li>[m
[31m-<li>Fix OSX build to work with newer ld64 versions.</li>[m
[31m-<li>Fix bytecode optimization of <tt>and</tt>/<tt>or</tt> operators.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Emit specialized bytecode for <tt>pairs()</tt>/<tt>next()</tt>.</li>[m
[31m-<li>Improve bytecode coalescing of <tt>nil</tt> constants.</li>[m
[31m-<li>Compile calls to vararg functions.</li>[m
[31m-<li>Compile <tt>select()</tt>.</li>[m
[31m-<li>Improve alias analysis, esp. for loads from allocations.</li>[m
[31m-<li>Tuning of various compiler heuristics.</li>[m
[31m-<li>Refactor and extend IR conversion instructions.</li>[m
[31m-<li>x86/x64: Various backend enhancements related to the FFI.</li>[m
[31m-<li>Add SPLIT pass to split 64 bit IR instructions for 32 bit CPUs.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta5">LuaJIT 2.0.0-beta5 &mdash; 2010-08-24</h2>[m
[31m-<ul>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix trace exit dispatch to function headers.</li>[m
[31m-<li>Fix Windows and OSX builds with LUAJIT_DISABLE_JIT.</li>[m
[31m-<li>Reorganize and fix placement of generated machine code on x64.</li>[m
[31m-<li>Fix TNEW in x64 interpreter.</li>[m
[31m-<li>Do not eliminate PHIs for values only referenced from side exits.</li>[m
[31m-<li>OS-independent canonicalization of strings for non-finite numbers.</li>[m
[31m-<li>Fix <tt>string.char()</tt> range check on x64.</li>[m
[31m-<li>Fix <tt>tostring()</tt> resolving within <tt>print()</tt>.</li>[m
[31m-<li>Fix error handling for <tt>next()</tt>.</li>[m
[31m-<li>Fix passing of constant arguments to external calls on x64.</li>[m
[31m-<li>Fix interpreter argument check for two-argument SSE math functions.</li>[m
[31m-<li>Fix C frame chain corruption caused by <tt>lua_cpcall()</tt>.</li>[m
[31m-<li>Fix return from <tt>pcall()</tt> within active hook.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Replace on-trace GC frame syncing with interpreter exit.</li>[m
[31m-<li>Improve hash lookup specialization by not removing dead keys during GC.</li>[m
[31m-<li>Turn traces into true GC objects.</li>[m
[31m-<li>Avoid starting a GC cycle immediately after library init.</li>[m
[31m-<li>Add weak guards to improve dead-code elimination.</li>[m
[31m-<li>Speed up string interning.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta4">LuaJIT 2.0.0-beta4 &mdash; 2010-03-28</h2>[m
[31m-<ul>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix precondition for on-trace creation of table keys.</li>[m
[31m-<li>Fix <tt>{f()}</tt> on x64 when table is resized.</li>[m
[31m-<li>Fix folding of ordered comparisons with same references.</li>[m
[31m-<li>Fix snapshot restores for multi-result bytecodes.</li>[m
[31m-<li>Fix potential hang when recording bytecode with nested closures.</li>[m
[31m-<li>Fix recording of <tt>getmetatable()</tt>, <tt>tonumber()</tt> and bad argument types.</li>[m
[31m-<li>Fix SLOAD fusion across returns to lower frames.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Add array bounds check elimination. <tt>-Oabc</tt> is enabled by default.</li>[m
[31m-<li>More tuning for x64, e.g. smaller table objects.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta3">LuaJIT 2.0.0-beta3 &mdash; 2010-03-07</h2>[m
[31m-<ul>[m
[31m-<li>LuaJIT x64 port:[m
[31m-<ul>[m
[31m-<li>Port integrated memory allocator to Linux/x64, Windows/x64 and OSX/x64.</li>[m
[31m-<li>Port interpreter and JIT compiler to x64.</li>[m
[31m-<li>Port DynASM to x64.</li>[m
[31m-<li>Many 32/64 bit cleanups in the VM.</li>[m
[31m-<li>Allow building the interpreter with either x87 or SSE2 arithmetics.</li>[m
[31m-<li>Add external unwinding and C++ exception interop (default on x64).</li>[m
[31m-</ul></li>[m
[31m-<li>Correctness and completeness:[m
[31m-<ul>[m
[31m-<li>Fix constructor bytecode generation for certain conditional values.</li>[m
[31m-<li>Fix some cases of ordered string comparisons.</li>[m
[31m-<li>Fix <tt>lua_tocfunction()</tt>.</li>[m
[31m-<li>Fix cutoff register in JMP bytecode for some conditional expressions.</li>[m
[31m-<li>Fix PHI marking algorithm for references from variant slots.</li>[m
[31m-<li>Fix <tt>package.cpath</tt> for non-default PREFIX.</li>[m
[31m-<li>Fix DWARF2 frame unwind information for interpreter on OSX.</li>[m
[31m-<li>Drive the GC forward on string allocations in the parser.</li>[m
[31m-<li>Implement call/return hooks (zero-cost if disabled).</li>[m
[31m-<li>Implement yield from C hooks.</li>[m
[31m-<li>Disable JIT compiler on older non-SSE2 CPUs instead of aborting.</li>[m
[31m-</ul></li>[m
[31m-<li>Structural and performance enhancements:[m
[31m-<ul>[m
[31m-<li>Compile recursive code (tail-, up- and down-recursion).</li>[m
[31m-<li>Improve heuristics for bytecode penalties and blacklisting.</li>[m
[31m-<li>Split CALL/FUNC recording and clean up fast function call semantics.</li>[m
[31m-<li>Major redesign of internal function call handling.</li>[m
[31m-<li>Improve FOR loop const specialization and integerness checks.</li>[m
[31m-<li>Switch to pre-initialized stacks. Avoid frame-clearing.</li>[m
[31m-<li>Colocation of prototypes and related data: bytecode, constants, debug info.</li>[m
[31m-<li>Cleanup parser and streamline bytecode generation.</li>[m
[31m-<li>Add support for weak IR references to register allocator.</li>[m
[31m-<li>Switch to compressed, extensible snapshots.</li>[m
[31m-<li>Compile returns to frames below the start frame.</li>[m
[31m-<li>Improve alias analysis of upvalues using a disambiguation hash value.</li>[m
[31m-<li>Compile floor/ceil/trunc to SSE2 helper calls or SSE4.1 instructions.</li>[m
[31m-<li>Add generic C call handling to IR and backend.</li>[m
[31m-<li>Improve KNUM fuse vs. load heuristics.</li>[m
[31m-<li>Compile various <tt>io.*()</tt> functions.</li>[m
[31m-<li>Compile <tt>math.sinh()</tt>, <tt>math.cosh()</tt>, <tt>math.tanh()</tt>[m
[31m-and <tt>math.random()</tt>.</li>[m
[31m-</ul></li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta2">LuaJIT 2.0.0-beta2 &mdash; 2009-11-09</h2>[m
[31m-<ul>[m
[31m-<li>Reorganize build system. Build static+shared library on POSIX.</li>[m
[31m-<li>Allow C++ exception conversion on all platforms[m
[31m-using a wrapper function.</li>[m
[31m-<li>Automatically catch C++ exceptions and rethrow Lua error[m
[31m-(DWARF2 only).</li>[m
[31m-<li>Check for the correct x87 FPU precision at strategic points.</li>[m
[31m-<li>Always use wrappers for libm functions.</li>[m
[31m-<li>Resurrect metamethod name strings before copying them.</li>[m
[31m-<li>Mark current trace, even if compiler is idle.</li>[m
[31m-<li>Ensure FILE metatable is created only once.</li>[m
[31m-<li>Fix type comparisons when different integer types are involved.</li>[m
[31m-<li>Fix <tt>getmetatable()</tt> recording.</li>[m
[31m-<li>Fix TDUP with dead keys in template table.</li>[m
[31m-<li><tt>jit.flush(tr)</tt> returns status.[m
[31m-Prevent manual flush of a trace that's still linked.</li>[m
[31m-<li>Improve register allocation heuristics for invariant references.</li>[m
[31m-<li>Compile the push/pop variants of <tt>table.insert()</tt> and[m
[31m-<tt>table.remove()</tt>.</li>[m
[31m-<li>Compatibility with MSVC <tt>link&nbsp/debug</tt>.</li>[m
[31m-<li>Fix <tt>lua_iscfunction()</tt>.</li>[m
[31m-<li>Fix <tt>math.random()</tt> when compiled with <tt>-fpic</tt> (OSX).</li>[m
[31m-<li>Fix <tt>table.maxn()</tt>.</li>[m
[31m-<li>Bump <tt>MACOSX_DEPLOYMENT_TARGET</tt> to <tt>10.4</tt></li>[m
[31m-<li><tt>luaL_check*()</tt> and <tt>luaL_opt*()</tt> now support[m
[31m-negative arguments, too.<br>[m
[31m-This matches the behavior of Lua 5.1, but not the specification.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="LuaJIT-2.0.0-beta1">LuaJIT 2.0.0-beta1 &mdash; 2009-10-31</h2>[m
[31m-<ul>[m
[31m-<li>This is the first public release of LuaJIT 2.0.</li>[m
[31m-<li>The whole VM has been rewritten from the ground up, so there's[m
[31m-no point in listing differences over earlier versions.</li>[m
[31m-</ul>[m
[31m-</div>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/contact.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/contact.html[m
[1mdeleted file mode 100644[m
[1mindex 5262376..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/contact.html[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Contact</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Contact</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-Please send general questions to the[m
[31m-<a href="http://luajit.org/list.html"><span class="ext">&raquo;</span>&nbsp;LuaJIT mailing list</a>.[m
[31m-You can also send any questions you have directly to me:[m
[31m-</p>[m
[31m-[m
[31m-<script type="text/javascript">[m
[31m-<!--[m
[31m-var xS="@-:\" .0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ<abc>defghijklmnopqrstuvwxyz";function xD(s)[m
[31m-{var len=s.length;var r="";for(var i=0;i<len;i++)[m
[31m-{var c=s.charAt(i);var n=xS.indexOf(c);if(n!=-1)c=xS.charAt(69-n);r+=c;}[m
[31m-document.write("<"+"p>"+r+"<"+"/p>\n");}[m
[31m-//-->[m
[31m-</script>[m
[31m-<script type="text/javascript">[m
[31m-<!--[m
[31m-xD("fyZKB8xv\"FJytmz8.KAB0u52D")[m
[31m-//--></script>[m
[31m-<noscript>[m
[31m-<p><img src="img/contact.png" alt="Contact info in image" width="170" height="13">[m
[31m-</p>[m
[31m-</noscript>[m
[31m-[m
[31m-<h2>Copyright</h2>[m
[31m-<p>[m
[31m-All documentation is[m
[31m-Copyright &copy; 2005-2016 Mike Pall.[m
[31m-</p>[m
[31m-[m
[31m-[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_c_api.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_c_api.html[m
[1mdeleted file mode 100644[m
[1mindex e1af3ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_c_api.html[m
[1m+++ /dev/null[m
[36m@@ -1,189 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Lua/C API Extensions</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Lua/C API Extensions</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT adds some extensions to the standard Lua/C API. The LuaJIT include[m
[31m-directory must be in the compiler search path (<tt>-I<i>path</i></tt>)[m
[31m-to be able to include the required header for C code:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-#include "luajit.h"[m
[31m-</pre>[m
[31m-<p>[m
[31m-Or for C++ code:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-#include "lua.hpp"[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="luaJIT_setmode"><tt>luaJIT_setmode(L, idx, mode)</tt>[m
[31m-&mdash; Control VM</h2>[m
[31m-<p>[m
[31m-This is a C API extension to allow control of the VM from C code. The[m
[31m-full prototype of <tt>LuaJIT_setmode</tt> is:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-LUA_API int luaJIT_setmode(lua_State *L, int idx, int mode);[m
[31m-</pre>[m
[31m-<p>[m
[31m-The returned status is either success (<tt>1</tt>) or failure (<tt>0</tt>).[m
[31m-The second argument is either <tt>0</tt> or a stack index (similar to the[m
[31m-other Lua/C API functions).[m
[31m-</p>[m
[31m-<p>[m
[31m-The third argument specifies the mode, which is 'or'ed with a flag.[m
[31m-The flag can be <tt>LUAJIT_MODE_OFF</tt> to turn a feature on,[m
[31m-<tt>LUAJIT_MODE_ON</tt> to turn a feature off, or[m
[31m-<tt>LUAJIT_MODE_FLUSH</tt> to flush cached code.[m
[31m-</p>[m
[31m-<p>[m
[31m-The following modes are defined:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="mode_engine"><tt>luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE|flag)</tt></h3>[m
[31m-<p>[m
[31m-Turn the whole JIT compiler on or off or flush the whole cache of compiled code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="mode_func"><tt>luaJIT_setmode(L, idx, LUAJIT_MODE_FUNC|flag)</tt><br>[m
[31m-<tt>luaJIT_setmode(L, idx, LUAJIT_MODE_ALLFUNC|flag)</tt><br>[m
[31m-<tt>luaJIT_setmode(L, idx, LUAJIT_MODE_ALLSUBFUNC|flag)</tt></h3>[m
[31m-<p>[m
[31m-This sets the mode for the function at the stack index <tt>idx</tt> or[m
[31m-the parent of the calling function (<tt>idx = 0</tt>). It either[m
[31m-enables JIT compilation for a function, disables it and flushes any[m
[31m-already compiled code or only flushes already compiled code. This[m
[31m-applies recursively to all sub-functions of the function with[m
[31m-<tt>LUAJIT_MODE_ALLFUNC</tt> or only to the sub-functions with[m
[31m-<tt>LUAJIT_MODE_ALLSUBFUNC</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="mode_trace"><tt>luaJIT_setmode(L, trace,<br>[m
[31m-&nbsp;&nbsp;LUAJIT_MODE_TRACE|LUAJIT_MODE_FLUSH)</tt></h3>[m
[31m-<p>[m
[31m-Flushes the specified root trace and all of its side traces from the cache.[m
[31m-The code for the trace will be retained as long as there are any other[m
[31m-traces which link to it.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="mode_wrapcfunc"><tt>luaJIT_setmode(L, idx, LUAJIT_MODE_WRAPCFUNC|flag)</tt></h3>[m
[31m-<p>[m
[31m-This mode defines a wrapper function for calls to C functions. If[m
[31m-called with <tt>LUAJIT_MODE_ON</tt>, the stack index at <tt>idx</tt>[m
[31m-must be a <tt>lightuserdata</tt> object holding a pointer to the wrapper[m
[31m-function. From now on all C functions are called through the wrapper[m
[31m-function. If called with <tt>LUAJIT_MODE_OFF</tt> this mode is turned[m
[31m-off and all C functions are directly called.[m
[31m-</p>[m
[31m-<p>[m
[31m-The wrapper function can be used for debugging purposes or to catch[m
[31m-and convert foreign exceptions. But please read the section on[m
[31m-<a href="extensions.html#exceptions">C++&nbsp;exception interoperability</a>[m
[31m-first. Recommended usage can be seen in this C++ code excerpt:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-#include &lt;exception&gt;[m
[31m-#include "lua.hpp"[m
[31m-[m
[31m-// Catch C++ exceptions and convert them to Lua error messages.[m
[31m-// Customize as needed for your own exception classes.[m
[31m-static int wrap_exceptions(lua_State *L, lua_CFunction f)[m
[31m-{[m
[31m-  try {[m
[31m-    return f(L);  // Call wrapped function and return result.[m
[31m-  } catch (const char *s) {  // Catch and convert exceptions.[m
[31m-    lua_pushstring(L, s);[m
[31m-  } catch (std::exception& e) {[m
[31m-    lua_pushstring(L, e.what());[m
[31m-  } catch (...) {[m
[31m-    lua_pushliteral(L, "caught (...)");[m
[31m-  }[m
[31m-  return lua_error(L);  // Rethrow as a Lua error.[m
[31m-}[m
[31m-[m
[31m-static int myinit(lua_State *L)[m
[31m-{[m
[31m-  ...[m
[31m-  // Define wrapper function and enable it.[m
[31m-  lua_pushlightuserdata(L, (void *)wrap_exceptions);[m
[31m-  luaJIT_setmode(L, -1, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_ON);[m
[31m-  lua_pop(L, 1);[m
[31m-  ...[m
[31m-}[m
[31m-</pre>[m
[31m-<p>[m
[31m-Note that you can only define <b>a single global wrapper function</b>,[m
[31m-so be careful when using this mechanism from multiple C++ modules.[m
[31m-Also note that this mechanism is not without overhead.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi.html[m
[1mdeleted file mode 100644[m
[1mindex d814f4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi.html[m
[1m+++ /dev/null[m
[36m@@ -1,332 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>FFI Library</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>FFI Library</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a class="current" href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-[m
[31m-The FFI library allows <b>calling external C&nbsp;functions</b> and[m
[31m-<b>using C&nbsp;data structures</b> from pure Lua code.[m
[31m-[m
[31m-</p>[m
[31m-<p>[m
[31m-[m
[31m-The FFI library largely obviates the need to write tedious manual[m
[31m-Lua/C bindings in C. No need to learn a separate binding language[m
[31m-&mdash; <b>it parses plain C&nbsp;declarations!</b> These can be[m
[31m-cut-n-pasted from C&nbsp;header files or reference manuals. It's up to[m
[31m-the task of binding large libraries without the need for dealing with[m
[31m-fragile binding generators.[m
[31m-[m
[31m-</p>[m
[31m-<p>[m
[31m-The FFI library is tightly integrated into LuaJIT (it's not available[m
[31m-as a separate module). The code generated by the JIT-compiler for[m
[31m-accesses to C&nbsp;data structures from Lua code is on par with the[m
[31m-code a C&nbsp;compiler would generate. Calls to C&nbsp;functions can[m
[31m-be inlined in JIT-compiled code, unlike calls to functions bound via[m
[31m-the classic Lua/C API.[m
[31m-</p>[m
[31m-<p>[m
[31m-This page gives a short introduction to the usage of the FFI library.[m
[31m-<em>Please use the FFI sub-topics in the navigation bar to learn more.</em>[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="call">Motivating Example: Calling External C Functions</h2>[m
[31m-<p>[m
[31m-It's really easy to call an external C&nbsp;library function:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&#9312;[m
[31m-&#9313;[m
[31m-[m
[31m-[m
[31m-&#9314;</span>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">int printf(const char *fmt, ...);</span>[m
[31m-]][m
[31m-ffi.C.printf("Hello %s!", "world")[m
[31m-</pre>[m
[31m-<p>[m
[31m-So, let's pick that apart:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> Load the FFI library.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> Add a C&nbsp;declaration[m
[31m-for the function. The part inside the double-brackets (in green) is[m
[31m-just standard C&nbsp;syntax.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> Call the named[m
[31m-C&nbsp;function &mdash; Yes, it's that simple![m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Actually, what goes on behind the scenes is far from simple: <span[m
[31m-style="color:#4040c0;">&#9314;</span> makes use of the standard[m
[31m-C&nbsp;library namespace <tt>ffi.C</tt>. Indexing this namespace with[m
[31m-a symbol name (<tt>"printf"</tt>) automatically binds it to the[m
[31m-standard C&nbsp;library. The result is a special kind of object which,[m
[31m-when called, runs the <tt>printf</tt> function. The arguments passed[m
[31m-to this function are automatically converted from Lua objects to the[m
[31m-corresponding C&nbsp;types.[m
[31m-</p>[m
[31m-<p>[m
[31m-Ok, so maybe the use of <tt>printf()</tt> wasn't such a spectacular[m
[31m-example. You could have done that with <tt>io.write()</tt> and[m
[31m-<tt>string.format()</tt>, too. But you get the idea ...[m
[31m-</p>[m
[31m-<p>[m
[31m-So here's something to pop up a message box on Windows:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">int MessageBoxA(void *w, const char *txt, const char *cap, int type);</span>[m
[31m-]][m
[31m-ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0)[m
[31m-</pre>[m
[31m-<p>[m
[31m-Bing! Again, that was far too easy, no?[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Compare this with the effort required to bind that function using the[m
[31m-classic Lua/C API: create an extra C&nbsp;file, add a C&nbsp;function[m
[31m-that retrieves and checks the argument types passed from Lua and calls[m
[31m-the actual C&nbsp;function, add a list of module functions and their[m
[31m-names, add a <tt>luaopen_*</tt> function and register all module[m
[31m-functions, compile and link it into a shared library (DLL), move it to[m
[31m-the proper path, add Lua code that loads the module aaaand ... finally[m
[31m-call the binding function. Phew![m
[31m-</p>[m
[31m-[m
[31m-<h2 id="cdata">Motivating Example: Using C Data Structures</h2>[m
[31m-<p>[m
[31m-The FFI library allows you to create and access C&nbsp;data[m
[31m-structures. Of course the main use for this is for interfacing with[m
[31m-C&nbsp;functions. But they can be used stand-alone, too.[m
[31m-</p>[m
[31m-<p>[m
[31m-Lua is built upon high-level data types. They are flexible, extensible[m
[31m-and dynamic. That's why we all love Lua so much. Alas, this can be[m
[31m-inefficient for certain tasks, where you'd really want a low-level[m
[31m-data type. E.g. a large array of a fixed structure needs to be[m
[31m-implemented with a big table holding lots of tiny tables. This imposes[m
[31m-both a substantial memory overhead as well as a performance overhead.[m
[31m-</p>[m
[31m-<p>[m
[31m-Here's a sketch of a library that operates on color images plus a[m
[31m-simple benchmark. First, the plain Lua version:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local floor = math.floor[m
[31m-[m
[31m-local function image_ramp_green(n)[m
[31m-  local img = {}[m
[31m-  local f = 255/(n-1)[m
[31m-  for i=1,n do[m
[31m-    img[i] = { red = 0, green = floor((i-1)*f), blue = 0, alpha = 255 }[m
[31m-  end[m
[31m-  return img[m
[31m-end[m
[31m-[m
[31m-local function image_to_grey(img, n)[m
[31m-  for i=1,n do[m
[31m-    local y = floor(0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue)[m
[31m-    img[i].red = y; img[i].green = y; img[i].blue = y[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local N = 400*400[m
[31m-local img = image_ramp_green(N)[m
[31m-for i=1,1000 do[m
[31m-  image_to_grey(img, N)[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-This creates a table with 160.000 pixels, each of which is a table[m
[31m-holding four number values in the range of 0-255. First an image with[m
[31m-a green ramp is created (1D for simplicity), then the image is[m
[31m-converted to greyscale 1000 times. Yes, that's silly, but I was in[m
[31m-need of a simple example ...[m
[31m-</p>[m
[31m-<p>[m
[31m-And here's the FFI version. The modified parts have been marked in[m
[31m-bold:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&#9312;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9313;[m
[31m-[m
[31m-&#9314;[m
[31m-&#9315;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9314;[m
[31m-&#9316;</span><b>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-</b><span style="color:#00a000;">typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;</span><b>[m
[31m-]]</b>[m
[31m-[m
[31m-local function image_ramp_green(n)[m
[31m-  <b>local img = ffi.new("rgba_pixel[?]", n)</b>[m
[31m-  local f = 255/(n-1)[m
[31m-  for i=<b>0,n-1</b> do[m
[31m-    <b>img[i].green = i*f</b>[m
[31m-    <b>img[i].alpha = 255</b>[m
[31m-  end[m
[31m-  return img[m
[31m-end[m
[31m-[m
[31m-local function image_to_grey(img, n)[m
[31m-  for i=<b>0,n-1</b> do[m
[31m-    local y = <b>0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue</b>[m
[31m-    img[i].red = y; img[i].green = y; img[i].blue = y[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local N = 400*400[m
[31m-local img = image_ramp_green(N)[m
[31m-for i=1,1000 do[m
[31m-  image_to_grey(img, N)[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-Ok, so that wasn't too difficult:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> First, load the FFI[m
[31m-library and declare the low-level data type. Here we choose a[m
[31m-<tt>struct</tt> which holds four byte fields, one for each component[m
[31m-of a 4x8&nbsp;bit RGBA pixel.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> Creating the data[m
[31m-structure with <tt>ffi.new()</tt> is straightforward &mdash; the[m
[31m-<tt>'?'</tt> is a placeholder for the number of elements of a[m
[31m-variable-length array.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> C&nbsp;arrays are[m
[31m-zero-based, so the indexes have to run from <tt>0</tt> to[m
[31m-<tt>n-1</tt>. One might want to allocate one more element instead to[m
[31m-simplify converting legacy code.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9315;</span> Since <tt>ffi.new()</tt>[m
[31m-zero-fills the array by default, we only need to set the green and the[m
[31m-alpha fields.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9316;</span> The calls to[m
[31m-<tt>math.floor()</tt> can be omitted here, because floating-point[m
[31m-numbers are already truncated towards zero when converting them to an[m
[31m-integer. This happens implicitly when the number is stored in the[m
[31m-fields of each pixel.[m
[31m-</p>[m
[31m-<p>[m
[31m-Now let's have a look at the impact of the changes: first, memory[m
[31m-consumption for the image is down from 22&nbsp;Megabytes to[m
[31m-640&nbsp;Kilobytes (400*400*4 bytes). That's a factor of 35x less! So,[m
[31m-yes, tables do have a noticeable overhead. BTW: The original program[m
[31m-would consume 40&nbsp;Megabytes in plain Lua (on x64).[m
[31m-</p>[m
[31m-<p>[m
[31m-Next, performance: the pure Lua version runs in 9.57 seconds (52.9[m
[31m-seconds with the Lua interpreter) and the FFI version runs in 0.48[m
[31m-seconds on my machine (YMMV). That's a factor of 20x faster (110x[m
[31m-faster than the Lua interpreter).[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-The avid reader may notice that converting the pure Lua version over[m
[31m-to use array indexes for the colors (<tt>[1]</tt> instead of[m
[31m-<tt>.red</tt>, <tt>[2]</tt> instead of <tt>.green</tt> etc.) ought to[m
[31m-be more compact and faster. This is certainly true (by a factor of[m
[31m-~1.7x). Switching to a struct-of-arrays would help, too.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-However the resulting code would be less idiomatic and rather[m
[31m-error-prone. And it still doesn't get even close to the performance of[m
[31m-the FFI version of the code. Also, high-level data structures cannot[m
[31m-be easily passed to other C&nbsp;functions, especially I/O functions,[m
[31m-without undue conversion penalties.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_api.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_api.html[m
[1mdeleted file mode 100644[m
[1mindex 6d40596..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_api.html[m
[1m+++ /dev/null[m
[36m@@ -1,570 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>ffi.* API Functions</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.abitable { width: 30em; line-height: 1.2; }[m
[31m-tr.abihead td { font-weight: bold; }[m
[31m-td.abiparam { font-weight: bold; width: 6em; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1><tt>ffi.*</tt> API Functions</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-This page describes the API functions provided by the FFI library in[m
[31m-detail. It's recommended to read through the[m
[31m-<a href="ext_ffi.html">introduction</a> and the[m
[31m-<a href="ext_ffi_tutorial.html">FFI tutorial</a> first.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="glossary">Glossary</h2>[m
[31m-<ul>[m
[31m-<li><b>cdecl</b> &mdash; An abstract C&nbsp;type declaration (a Lua[m
[31m-string).</li>[m
[31m-<li><b>ctype</b> &mdash; A C&nbsp;type object. This is a special kind of[m
[31m-<b>cdata</b> returned by <tt>ffi.typeof()</tt>. It serves as a[m
[31m-<b>cdata</b> <a href="#ffi_new">constructor</a> when called.</li>[m
[31m-<li><b>cdata</b> &mdash; A C&nbsp;data object. It holds a value of the[m
[31m-corresponding <b>ctype</b>.</li>[m
[31m-<li><b>ct</b> &mdash; A C&nbsp;type specification which can be used for[m
[31m-most of the API functions. Either a <b>cdecl</b>, a <b>ctype</b> or a[m
[31m-<b>cdata</b> serving as a template type.</li>[m
[31m-<li><b>cb</b> &mdash; A callback object. This is a C&nbsp;data object[m
[31m-holding a special function pointer. Calling this function from[m
[31m-C&nbsp;code runs an associated Lua function.</li>[m
[31m-<li><b>VLA</b> &mdash; A variable-length array is declared with a[m
[31m-<tt>?</tt> instead of the number of elements, e.g. <tt>"int[?]"</tt>.[m
[31m-The number of elements (<tt>nelem</tt>) must be given when it's[m
[31m-<a href="#ffi_new">created</a>.</li>[m
[31m-<li><b>VLS</b> &mdash; A variable-length struct is a <tt>struct</tt> C[m
[31m-type where the last element is a <b>VLA</b>. The same rules for[m
[31m-declaration and creation apply.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="decl">Declaring and Accessing External Symbols</h2>[m
[31m-<p>[m
[31m-External symbols must be declared first and can then be accessed by[m
[31m-indexing a <a href="ext_ffi_semantics.html#clib">C&nbsp;library[m
[31m-namespace</a>, which automatically binds the symbol to a specific[m
[31m-library.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_cdef"><tt>ffi.cdef(def)</tt></h3>[m
[31m-<p>[m
[31m-Adds multiple C&nbsp;declarations for types or external symbols (named[m
[31m-variables or functions). <tt>def</tt> must be a Lua string. It's[m
[31m-recommended to use the syntactic sugar for string arguments as[m
[31m-follows:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">typedef struct foo { int a, b; } foo_t;  // Declare a struct and typedef.[m
[31m-int dofoo(foo_t *f, int n);  /* Declare an external C function. */</span>[m
[31m-]][m
[31m-</pre>[m
[31m-<p>[m
[31m-The contents of the string (the part in green above) must be a[m
[31m-sequence of[m
[31m-<a href="ext_ffi_semantics.html#clang">C&nbsp;declarations</a>,[m
[31m-separated by semicolons. The trailing semicolon for a single[m
[31m-declaration may be omitted.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note that external symbols are only <em>declared</em>, but they[m
[31m-are <em>not bound</em> to any specific address, yet. Binding is[m
[31m-achieved with C&nbsp;library namespaces (see below).[m
[31m-</p>[m
[31m-<p style="color: #c00000;">[m
[31m-C&nbsp;declarations are not passed through a C&nbsp;pre-processor,[m
[31m-yet. No pre-processor tokens are allowed, except for[m
[31m-<tt>#pragma&nbsp;pack</tt>. Replace <tt>#define</tt> in existing[m
[31m-C&nbsp;header files with <tt>enum</tt>, <tt>static&nbsp;const</tt>[m
[31m-or <tt>typedef</tt> and/or pass the files through an external[m
[31m-C&nbsp;pre-processor (once). Be careful not to include unneeded or[m
[31m-redundant declarations from unrelated header files.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_C"><tt>ffi.C</tt></h3>[m
[31m-<p>[m
[31m-This is the default C&nbsp;library namespace &mdash; note the[m
[31m-uppercase <tt>'C'</tt>. It binds to the default set of symbols or[m
[31m-libraries on the target system. These are more or less the same as a[m
[31m-C&nbsp;compiler would offer by default, without specifying extra link[m
[31m-libraries.[m
[31m-</p>[m
[31m-<p>[m
[31m-On POSIX systems, this binds to symbols in the default or global[m
[31m-namespace. This includes all exported symbols from the executable and[m
[31m-any libraries loaded into the global namespace. This includes at least[m
[31m-<tt>libc</tt>, <tt>libm</tt>, <tt>libdl</tt> (on Linux),[m
[31m-<tt>libgcc</tt> (if compiled with GCC), as well as any exported[m
[31m-symbols from the Lua/C&nbsp;API provided by LuaJIT itself.[m
[31m-</p>[m
[31m-<p>[m
[31m-On Windows systems, this binds to symbols exported from the[m
[31m-<tt>*.exe</tt>, the <tt>lua51.dll</tt> (i.e. the Lua/C&nbsp;API[m
[31m-provided by LuaJIT itself), the C&nbsp;runtime library LuaJIT was linked[m
[31m-with (<tt>msvcrt*.dll</tt>), <tt>kernel32.dll</tt>,[m
[31m-<tt>user32.dll</tt> and <tt>gdi32.dll</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_load"><tt>clib = ffi.load(name [,global])</tt></h3>[m
[31m-<p>[m
[31m-This loads the dynamic library given by <tt>name</tt> and returns[m
[31m-a new C&nbsp;library namespace which binds to its symbols. On POSIX[m
[31m-systems, if <tt>global</tt> is <tt>true</tt>, the library symbols are[m
[31m-loaded into the global namespace, too.[m
[31m-</p>[m
[31m-<p>[m
[31m-If <tt>name</tt> is a path, the library is loaded from this path.[m
[31m-Otherwise <tt>name</tt> is canonicalized in a system-dependent way and[m
[31m-searched in the default search path for dynamic libraries:[m
[31m-</p>[m
[31m-<p>[m
[31m-On POSIX systems, if the name contains no dot, the extension[m
[31m-<tt>.so</tt> is appended. Also, the <tt>lib</tt> prefix is prepended[m
[31m-if necessary. So <tt>ffi.load("z")</tt> looks for <tt>"libz.so"</tt>[m
[31m-in the default shared library search path.[m
[31m-</p>[m
[31m-<p>[m
[31m-On Windows systems, if the name contains no dot, the extension[m
[31m-<tt>.dll</tt> is appended. So <tt>ffi.load("ws2_32")</tt> looks for[m
[31m-<tt>"ws2_32.dll"</tt> in the default DLL search path.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="create">Creating cdata Objects</h2>[m
[31m-<p>[m
[31m-The following API functions create cdata objects (<tt>type()</tt>[m
[31m-returns <tt>"cdata"</tt>). All created cdata objects are[m
[31m-<a href="ext_ffi_semantics.html#gc">garbage collected</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_new"><tt>cdata = ffi.new(ct [,nelem] [,init...])<br>[m
[31m-cdata = <em>ctype</em>([nelem,] [init...])</tt></h3>[m
[31m-<p>[m
[31m-Creates a cdata object for the given <tt>ct</tt>. VLA/VLS types[m
[31m-require the <tt>nelem</tt> argument. The second syntax uses a ctype as[m
[31m-a constructor and is otherwise fully equivalent.[m
[31m-</p>[m
[31m-<p>[m
[31m-The cdata object is initialized according to the[m
[31m-<a href="ext_ffi_semantics.html#init">rules for initializers</a>,[m
[31m-using the optional <tt>init</tt> arguments. Excess initializers cause[m
[31m-an error.[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: if you want to create many objects of one kind,[m
[31m-parse the cdecl only once and get its ctype with[m
[31m-<tt>ffi.typeof()</tt>. Then use the ctype as a constructor repeatedly.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Please note that an anonymous <tt>struct</tt> declaration implicitly[m
[31m-creates a new and distinguished ctype every time you use it for[m
[31m-<tt>ffi.new()</tt>. This is probably <b>not</b> what you want,[m
[31m-especially if you create more than one cdata object. Different anonymous[m
[31m-<tt>structs</tt> are not considered assignment-compatible by the[m
[31m-C&nbsp;standard, even though they may have the same fields! Also, they[m
[31m-are considered different types by the JIT-compiler, which may cause an[m
[31m-excessive number of traces. It's strongly suggested to either declare[m
[31m-a named <tt>struct</tt> or <tt>typedef</tt> with <tt>ffi.cdef()</tt>[m
[31m-or to create a single ctype object for an anonymous <tt>struct</tt>[m
[31m-with <tt>ffi.typeof()</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_typeof"><tt>ctype = ffi.typeof(ct)</tt></h3>[m
[31m-<p>[m
[31m-Creates a ctype object for the given <tt>ct</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-This function is especially useful to parse a cdecl only once and then[m
[31m-use the resulting ctype object as a <a href="#ffi_new">constructor</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_cast"><tt>cdata = ffi.cast(ct, init)</tt></h3>[m
[31m-<p>[m
[31m-Creates a scalar cdata object for the given <tt>ct</tt>. The cdata[m
[31m-object is initialized with <tt>init</tt> using the "cast" variant of[m
[31m-the <a href="ext_ffi_semantics.html#convert">C&nbsp;type conversion[m
[31m-rules</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-This functions is mainly useful to override the pointer compatibility[m
[31m-checks or to convert pointers to addresses or vice versa.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_metatype"><tt>ctype = ffi.metatype(ct, metatable)</tt></h3>[m
[31m-<p>[m
[31m-Creates a ctype object for the given <tt>ct</tt> and associates it with[m
[31m-a metatable. Only <tt>struct</tt>/<tt>union</tt> types, complex numbers[m
[31m-and vectors are allowed. Other types may be wrapped in a[m
[31m-<tt>struct</tt>, if needed.[m
[31m-</p>[m
[31m-<p>[m
[31m-The association with a metatable is permanent and cannot be changed[m
[31m-afterwards. Neither the contents of the <tt>metatable</tt> nor the[m
[31m-contents of an <tt>__index</tt> table (if any) may be modified[m
[31m-afterwards. The associated metatable automatically applies to all uses[m
[31m-of this type, no matter how the objects are created or where they[m
[31m-originate from. Note that pre-defined operations on types have[m
[31m-precedence (e.g. declared field names cannot be overriden).[m
[31m-</p>[m
[31m-<p>[m
[31m-All standard Lua metamethods are implemented. These are called directly,[m
[31m-without shortcuts and on any mix of types. For binary operations, the[m
[31m-left operand is checked first for a valid ctype metamethod. The[m
[31m-<tt>__gc</tt> metamethod only applies to <tt>struct</tt>/<tt>union</tt>[m
[31m-types and performs an implicit <a href="#ffi_gc"><tt>ffi.gc()</tt></a>[m
[31m-call during creation of an instance.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_gc"><tt>cdata = ffi.gc(cdata, finalizer)</tt></h3>[m
[31m-<p>[m
[31m-Associates a finalizer with a pointer or aggregate cdata object. The[m
[31m-cdata object is returned unchanged.[m
[31m-</p>[m
[31m-<p>[m
[31m-This function allows safe integration of unmanaged resources into the[m
[31m-automatic memory management of the LuaJIT garbage collector. Typical[m
[31m-usage:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local p = ffi.gc(ffi.C.malloc(n), ffi.C.free)[m
[31m-...[m
[31m-p = nil -- Last reference to p is gone.[m
[31m--- GC will eventually run finalizer: ffi.C.free(p)[m
[31m-</pre>[m
[31m-<p>[m
[31m-A cdata finalizer works like the <tt>__gc</tt> metamethod for userdata[m
[31m-objects: when the last reference to a cdata object is gone, the[m
[31m-associated finalizer is called with the cdata object as an argument. The[m
[31m-finalizer can be a Lua function or a cdata function or cdata function[m
[31m-pointer. An existing finalizer can be removed by setting a <tt>nil</tt>[m
[31m-finalizer, e.g. right before explicitly deleting a resource:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.C.free(ffi.gc(p, nil)) -- Manually free the memory.[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="info">C&nbsp;Type Information</h2>[m
[31m-<p>[m
[31m-The following API functions return information about C&nbsp;types.[m
[31m-They are most useful for inspecting cdata objects.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_sizeof"><tt>size = ffi.sizeof(ct [,nelem])</tt></h3>[m
[31m-<p>[m
[31m-Returns the size of <tt>ct</tt> in bytes. Returns <tt>nil</tt> if[m
[31m-the size is not known (e.g. for <tt>"void"</tt> or function types).[m
[31m-Requires <tt>nelem</tt> for VLA/VLS types, except for cdata objects.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_alignof"><tt>align = ffi.alignof(ct)</tt></h3>[m
[31m-<p>[m
[31m-Returns the minimum required alignment for <tt>ct</tt> in bytes.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_offsetof"><tt>ofs [,bpos,bsize] = ffi.offsetof(ct, field)</tt></h3>[m
[31m-<p>[m
[31m-Returns the offset (in bytes) of <tt>field</tt> relative to the start[m
[31m-of <tt>ct</tt>, which must be a <tt>struct</tt>. Additionally returns[m
[31m-the position and the field size (in bits) for bit fields.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_istype"><tt>status = ffi.istype(ct, obj)</tt></h3>[m
[31m-<p>[m
[31m-Returns <tt>true</tt> if <tt>obj</tt> has the C&nbsp;type given by[m
[31m-<tt>ct</tt>. Returns <tt>false</tt> otherwise.[m
[31m-</p>[m
[31m-<p>[m
[31m-C&nbsp;type qualifiers (<tt>const</tt> etc.) are ignored. Pointers are[m
[31m-checked with the standard pointer compatibility rules, but without any[m
[31m-special treatment for <tt>void&nbsp;*</tt>. If <tt>ct</tt> specifies a[m
[31m-<tt>struct</tt>/<tt>union</tt>, then a pointer to this type is accepted,[m
[31m-too. Otherwise the types must match exactly.[m
[31m-</p>[m
[31m-<p>[m
[31m-Note: this function accepts all kinds of Lua objects for the[m
[31m-<tt>obj</tt> argument, but always returns <tt>false</tt> for non-cdata[m
[31m-objects.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="util">Utility Functions</h2>[m
[31m-[m
[31m-<h3 id="ffi_errno"><tt>err = ffi.errno([newerr])</tt></h3>[m
[31m-<p>[m
[31m-Returns the error number set by the last C&nbsp;function call which[m
[31m-indicated an error condition. If the optional <tt>newerr</tt> argument[m
[31m-is present, the error number is set to the new value and the previous[m
[31m-value is returned.[m
[31m-</p>[m
[31m-<p>[m
[31m-This function offers a portable and OS-independent way to get and set the[m
[31m-error number. Note that only <em>some</em> C&nbsp;functions set the error[m
[31m-number. And it's only significant if the function actually indicated an[m
[31m-error condition (e.g. with a return value of <tt>-1</tt> or[m
[31m-<tt>NULL</tt>). Otherwise, it may or may not contain any previously set[m
[31m-value.[m
[31m-</p>[m
[31m-<p>[m
[31m-You're advised to call this function only when needed and as close as[m
[31m-possible after the return of the related C&nbsp;function. The[m
[31m-<tt>errno</tt> value is preserved across hooks, memory allocations,[m
[31m-invocations of the JIT compiler and other internal VM activity. The same[m
[31m-applies to the value returned by <tt>GetLastError()</tt> on Windows, but[m
[31m-you need to declare and call it yourself.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_string"><tt>str = ffi.string(ptr [,len])</tt></h3>[m
[31m-<p>[m
[31m-Creates an interned Lua string from the data pointed to by[m
[31m-<tt>ptr</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-If the optional argument <tt>len</tt> is missing, <tt>ptr</tt> is[m
[31m-converted to a <tt>"char&nbsp;*"</tt> and the data is assumed to be[m
[31m-zero-terminated. The length of the string is computed with[m
[31m-<tt>strlen()</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-Otherwise <tt>ptr</tt> is converted to a <tt>"void&nbsp;*"</tt> and[m
[31m-<tt>len</tt> gives the length of the data. The data may contain[m
[31m-embedded zeros and need not be byte-oriented (though this may cause[m
[31m-endianess issues).[m
[31m-</p>[m
[31m-<p>[m
[31m-This function is mainly useful to convert (temporary)[m
[31m-<tt>"const&nbsp;char&nbsp;*"</tt> pointers returned by[m
[31m-C&nbsp;functions to Lua strings and store them or pass them to other[m
[31m-functions expecting a Lua string. The Lua string is an (interned) copy[m
[31m-of the data and bears no relation to the original data area anymore.[m
[31m-Lua strings are 8&nbsp;bit clean and may be used to hold arbitrary,[m
[31m-non-character data.[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: it's faster to pass the length of the string, if[m
[31m-it's known. E.g. when the length is returned by a C&nbsp;call like[m
[31m-<tt>sprintf()</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_copy"><tt>ffi.copy(dst, src, len)<br>[m
[31m-ffi.copy(dst, str)</tt></h3>[m
[31m-<p>[m
[31m-Copies the data pointed to by <tt>src</tt> to <tt>dst</tt>.[m
[31m-<tt>dst</tt> is converted to a <tt>"void&nbsp;*"</tt> and <tt>src</tt>[m
[31m-is converted to a <tt>"const void&nbsp;*"</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-In the first syntax, <tt>len</tt> gives the number of bytes to copy.[m
[31m-Caveat: if <tt>src</tt> is a Lua string, then <tt>len</tt> must not[m
[31m-exceed <tt>#src+1</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-In the second syntax, the source of the copy must be a Lua string. All[m
[31m-bytes of the string <em>plus a zero-terminator</em> are copied to[m
[31m-<tt>dst</tt> (i.e. <tt>#src+1</tt> bytes).[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: <tt>ffi.copy()</tt> may be used as a faster[m
[31m-(inlinable) replacement for the C&nbsp;library functions[m
[31m-<tt>memcpy()</tt>, <tt>strcpy()</tt> and <tt>strncpy()</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_fill"><tt>ffi.fill(dst, len [,c])</tt></h3>[m
[31m-<p>[m
[31m-Fills the data pointed to by <tt>dst</tt> with <tt>len</tt> constant[m
[31m-bytes, given by <tt>c</tt>. If <tt>c</tt> is omitted, the data is[m
[31m-zero-filled.[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: <tt>ffi.fill()</tt> may be used as a faster[m
[31m-(inlinable) replacement for the C&nbsp;library function[m
[31m-<tt>memset(dst,&nbsp;c,&nbsp;len)</tt>. Please note the different[m
[31m-order of arguments![m
[31m-</p>[m
[31m-[m
[31m-<h2 id="target">Target-specific Information</h2>[m
[31m-[m
[31m-<h3 id="ffi_abi"><tt>status = ffi.abi(param)</tt></h3>[m
[31m-<p>[m
[31m-Returns <tt>true</tt> if <tt>param</tt> (a Lua string) applies for the[m
[31m-target ABI (Application Binary Interface). Returns <tt>false</tt>[m
[31m-otherwise. The following parameters are currently defined:[m
[31m-</p>[m
[31m-<table class="abitable">[m
[31m-<tr class="abihead">[m
[31m-<td class="abiparam">Parameter</td>[m
[31m-<td class="abidesc">Description</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="abiparam">32bit</td><td class="abidesc">32 bit architecture</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="abiparam">64bit</td><td class="abidesc">64 bit architecture</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="abiparam">le</td><td class="abidesc">Little-endian architecture</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="abiparam">be</td><td class="abidesc">Big-endian architecture</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="abiparam">fpu</td><td class="abidesc">Target has a hardware FPU</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="abiparam">softfp</td><td class="abidesc">softfp calling conventions</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="abiparam">hardfp</td><td class="abidesc">hardfp calling conventions</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="abiparam">eabi</td><td class="abidesc">EABI variant of the standard ABI</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="abiparam">win</td><td class="abidesc">Windows variant of the standard ABI</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="abiparam">gc64</td><td class="abidesc">64 bit GC references</td></tr>[m
[31m-</table>[m
[31m-[m
[31m-<h3 id="ffi_os"><tt>ffi.os</tt></h3>[m
[31m-<p>[m
[31m-Contains the target OS name. Same contents as[m
[31m-<a href="ext_jit.html#jit_os"><tt>jit.os</tt></a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi_arch"><tt>ffi.arch</tt></h3>[m
[31m-<p>[m
[31m-Contains the target architecture name. Same contents as[m
[31m-<a href="ext_jit.html#jit_arch"><tt>jit.arch</tt></a>.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="callback">Methods for Callbacks</h2>[m
[31m-<p>[m
[31m-The C&nbsp;types for <a href="ext_ffi_semantics.html#callback">callbacks</a>[m
[31m-have some extra methods:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="callback_free"><tt>cb:free()</tt></h3>[m
[31m-<p>[m
[31m-Free the resources associated with a callback. The associated Lua[m
[31m-function is unanchored and may be garbage collected. The callback[m
[31m-function pointer is no longer valid and must not be called anymore[m
[31m-(it may be reused by a subsequently created callback).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="callback_set"><tt>cb:set(func)</tt></h3>[m
[31m-<p>[m
[31m-Associate a new Lua function with a callback. The C&nbsp;type of the[m
[31m-callback and the callback function pointer are unchanged.[m
[31m-</p>[m
[31m-<p>[m
[31m-This method is useful to dynamically switch the receiver of callbacks[m
[31m-without creating a new callback each time and registering it again (e.g.[m
[31m-with a GUI library).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="extended">Extended Standard Library Functions</h2>[m
[31m-<p>[m
[31m-The following standard library functions have been extended to work[m
[31m-with cdata objects:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="tonumber"><tt>n = tonumber(cdata)</tt></h3>[m
[31m-<p>[m
[31m-Converts a number cdata object to a <tt>double</tt> and returns it as[m
[31m-a Lua number. This is particularly useful for boxed 64&nbsp;bit[m
[31m-integer values. Caveat: this conversion may incur a precision loss.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="tostring"><tt>s = tostring(cdata)</tt></h3>[m
[31m-<p>[m
[31m-Returns a string representation of the value of 64&nbsp;bit integers[m
[31m-(<tt><b>"</b>nnn<b>LL"</b></tt> or <tt><b>"</b>nnn<b>ULL"</b></tt>) or[m
[31m-complex numbers (<tt><b>"</b>re&plusmn;im<b>i"</b></tt>). Otherwise[m
[31m-returns a string representation of the C&nbsp;type of a ctype object[m
[31m-(<tt><b>"ctype&lt;</b>type<b>&gt;"</b></tt>) or a cdata object[m
[31m-(<tt><b>"cdata&lt;</b>type<b>&gt;:&nbsp;</b>address"</tt>), unless you[m
[31m-override it with a <tt>__tostring</tt> metamethod (see[m
[31m-<a href="#ffi_metatype"><tt>ffi.metatype()</tt></a>).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="pairs"><tt>iter, obj, start = pairs(cdata)<br>[m
[31m-iter, obj, start = ipairs(cdata)<br></tt></h3>[m
[31m-<p>[m
[31m-Calls the <tt>__pairs</tt> or <tt>__ipairs</tt> metamethod of the[m
[31m-corresponding ctype.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="literals">Extensions to the Lua Parser</h2>[m
[31m-<p>[m
[31m-The parser for Lua source code treats numeric literals with the[m
[31m-suffixes <tt>LL</tt> or <tt>ULL</tt> as signed or unsigned 64&nbsp;bit[m
[31m-integers. Case doesn't matter, but uppercase is recommended for[m
[31m-readability. It handles decimal (<tt>42LL</tt>), hexadecimal[m
[31m-(<tt>0x2aLL</tt>) and binary (<tt>0b101010LL</tt>) literals.[m
[31m-</p>[m
[31m-<p>[m
[31m-The imaginary part of complex numbers can be specified by suffixing[m
[31m-number literals with <tt>i</tt> or <tt>I</tt>, e.g. <tt>12.5i</tt>.[m
[31m-Caveat: you'll need to use <tt>1i</tt> to get an imaginary part with[m
[31m-the value one, since <tt>i</tt> itself still refers to a variable[m
[31m-named <tt>i</tt>.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_semantics.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_semantics.html[m
[1mdeleted file mode 100644[m
[1mindex 15843d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_semantics.html[m
[1m+++ /dev/null[m
[36m@@ -1,1263 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>FFI Semantics</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.convtable { line-height: 1.2; }[m
[31m-tr.convhead td { font-weight: bold; }[m
[31m-td.convop { font-style: italic; width: 40%; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>FFI Semantics</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-This page describes the detailed semantics underlying the FFI library[m
[31m-and its interaction with both Lua and C&nbsp;code.[m
[31m-</p>[m
[31m-<p>[m
[31m-Given that the FFI library is designed to interface with C&nbsp;code[m
[31m-and that declarations can be written in plain C&nbsp;syntax, <b>it[m
[31m-closely follows the C&nbsp;language semantics</b>, wherever possible.[m
[31m-Some minor concessions are needed for smoother interoperation with Lua[m
[31m-language semantics.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please don't be overwhelmed by the contents of this page &mdash; this[m
[31m-is a reference and you may need to consult it, if in doubt. It doesn't[m
[31m-hurt to skim this page, but most of the semantics "just work" as you'd[m
[31m-expect them to work. It should be straightforward to write[m
[31m-applications using the LuaJIT FFI for developers with a C or C++[m
[31m-background.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="clang">C Language Support</h2>[m
[31m-<p>[m
[31m-The FFI library has a built-in C&nbsp;parser with a minimal memory[m
[31m-footprint. It's used by the <a href="ext_ffi_api.html">ffi.* library[m
[31m-functions</a> to declare C&nbsp;types or external symbols.[m
[31m-</p>[m
[31m-<p>[m
[31m-It's only purpose is to parse C&nbsp;declarations, as found e.g. in[m
[31m-C&nbsp;header files. Although it does evaluate constant expressions,[m
[31m-it's <em>not</em> a C&nbsp;compiler. The body of <tt>inline</tt>[m
[31m-C&nbsp;function definitions is simply ignored.[m
[31m-</p>[m
[31m-<p>[m
[31m-Also, this is <em>not</em> a validating C&nbsp;parser. It expects and[m
[31m-accepts correctly formed C&nbsp;declarations, but it may choose to[m
[31m-ignore bad declarations or show rather generic error messages. If in[m
[31m-doubt, please check the input against your favorite C&nbsp;compiler.[m
[31m-</p>[m
[31m-<p>[m
[31m-The C&nbsp;parser complies to the <b>C99 language standard</b> plus[m
[31m-the following extensions:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>The <tt>'\e'</tt> escape in character and string literals.</li>[m
[31m-[m
[31m-<li>The C99/C++ boolean type, declared with the keywords <tt>bool</tt>[m
[31m-or <tt>_Bool</tt>.</li>[m
[31m-[m
[31m-<li>Complex numbers, declared with the keywords <tt>complex</tt> or[m
[31m-<tt>_Complex</tt>.</li>[m
[31m-[m
[31m-<li>Two complex number types: <tt>complex</tt> (aka[m
[31m-<tt>complex&nbsp;double</tt>) and <tt>complex&nbsp;float</tt>.</li>[m
[31m-[m
[31m-<li>Vector types, declared with the GCC <tt>mode</tt> or[m
[31m-<tt>vector_size</tt> attribute.</li>[m
[31m-[m
[31m-<li>Unnamed ('transparent') <tt>struct</tt>/<tt>union</tt> fields[m
[31m-inside a <tt>struct</tt>/<tt>union</tt>.</li>[m
[31m-[m
[31m-<li>Incomplete <tt>enum</tt> declarations, handled like incomplete[m
[31m-<tt>struct</tt> declarations.</li>[m
[31m-[m
[31m-<li>Unnamed <tt>enum</tt> fields inside a[m
[31m-<tt>struct</tt>/<tt>union</tt>. This is similar to a scoped C++[m
[31m-<tt>enum</tt>, except that declared constants are visible in the[m
[31m-global namespace, too.</li>[m
[31m-[m
[31m-<li>Scoped <tt>static&nbsp;const</tt> declarations inside a[m
[31m-<tt>struct</tt>/<tt>union</tt> (from C++).</li>[m
[31m-[m
[31m-<li>Zero-length arrays (<tt>[0]</tt>), empty[m
[31m-<tt>struct</tt>/<tt>union</tt>, variable-length arrays (VLA,[m
[31m-<tt>[?]</tt>) and variable-length structs (VLS, with a trailing[m
[31m-VLA).</li>[m
[31m-[m
[31m-<li>C++ reference types (<tt>int&nbsp;&amp;x</tt>).</li>[m
[31m-[m
[31m-<li>Alternate GCC keywords with '<tt>__</tt>', e.g.[m
[31m-<tt>__const__</tt>.</li>[m
[31m-[m
[31m-<li>GCC <tt>__attribute__</tt> with the following attributes:[m
[31m-<tt>aligned</tt>, <tt>packed</tt>, <tt>mode</tt>,[m
[31m-<tt>vector_size</tt>, <tt>cdecl</tt>, <tt>fastcall</tt>,[m
[31m-<tt>stdcall</tt>, <tt>thiscall</tt>.</li>[m
[31m-[m
[31m-<li>The GCC <tt>__extension__</tt> keyword and the GCC[m
[31m-<tt>__alignof__</tt> operator.</li>[m
[31m-[m
[31m-<li>GCC <tt>__asm__("symname")</tt> symbol name redirection for[m
[31m-function declarations.</li>[m
[31m-[m
[31m-<li>MSVC keywords for fixed-length types: <tt>__int8</tt>,[m
[31m-<tt>__int16</tt>, <tt>__int32</tt> and <tt>__int64</tt>.</li>[m
[31m-[m
[31m-<li>MSVC <tt>__cdecl</tt>, <tt>__fastcall</tt>, <tt>__stdcall</tt>,[m
[31m-<tt>__thiscall</tt>, <tt>__ptr32</tt>, <tt>__ptr64</tt>,[m
[31m-<tt>__declspec(align(n))</tt> and <tt>#pragma&nbsp;pack</tt>.</li>[m
[31m-[m
[31m-<li>All other GCC/MSVC-specific attributes are ignored.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-The following C&nbsp;types are pre-defined by the C&nbsp;parser (like[m
[31m-a <tt>typedef</tt>, except re-declarations will be ignored):[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>Vararg handling: <tt>va_list</tt>, <tt>__builtin_va_list</tt>,[m
[31m-<tt>__gnuc_va_list</tt>.</li>[m
[31m-[m
[31m-<li>From <tt>&lt;stddef.h&gt;</tt>: <tt>ptrdiff_t</tt>,[m
[31m-<tt>size_t</tt>, <tt>wchar_t</tt>.</li>[m
[31m-[m
[31m-<li>From <tt>&lt;stdint.h&gt;</tt>: <tt>int8_t</tt>, <tt>int16_t</tt>,[m
[31m-<tt>int32_t</tt>, <tt>int64_t</tt>, <tt>uint8_t</tt>,[m
[31m-<tt>uint16_t</tt>, <tt>uint32_t</tt>, <tt>uint64_t</tt>,[m
[31m-<tt>intptr_t</tt>, <tt>uintptr_t</tt>.</li>[m
[31m-[m
[31m-<li>From <tt>&lt;unistd.h&gt;</tt> (POSIX): <tt>ssize_t</tt>.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-You're encouraged to use these types in preference to[m
[31m-compiler-specific extensions or target-dependent standard types.[m
[31m-E.g. <tt>char</tt> differs in signedness and <tt>long</tt> differs in[m
[31m-size, depending on the target architecture and platform ABI.[m
[31m-</p>[m
[31m-<p>[m
[31m-The following C&nbsp;features are <b>not</b> supported:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>A declaration must always have a type specifier; it doesn't[m
[31m-default to an <tt>int</tt> type.</li>[m
[31m-[m
[31m-<li>Old-style empty function declarations (K&amp;R) are not allowed.[m
[31m-All C&nbsp;functions must have a proper prototype declaration. A[m
[31m-function declared without parameters (<tt>int&nbsp;foo();</tt>) is[m
[31m-treated as a function taking zero arguments, like in C++.</li>[m
[31m-[m
[31m-<li>The <tt>long double</tt> C&nbsp;type is parsed correctly, but[m
[31m-there's no support for the related conversions, accesses or arithmetic[m
[31m-operations.</li>[m
[31m-[m
[31m-<li>Wide character strings and character literals are not[m
[31m-supported.</li>[m
[31m-[m
[31m-<li><a href="#status">See below</a> for features that are currently[m
[31m-not implemented.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="convert">C Type Conversion Rules</h2>[m
[31m-[m
[31m-<h3 id="convert_tolua">Conversions from C&nbsp;types to Lua objects</h3>[m
[31m-<p>[m
[31m-These conversion rules apply for <em>read accesses</em> to[m
[31m-C&nbsp;types: indexing pointers, arrays or[m
[31m-<tt>struct</tt>/<tt>union</tt> types; reading external variables or[m
[31m-constant values; retrieving return values from C&nbsp;calls:[m
[31m-</p>[m
[31m-<table class="convtable">[m
[31m-<tr class="convhead">[m
[31m-<td class="convin">Input</td>[m
[31m-<td class="convop">Conversion</td>[m
[31m-<td class="convout">Output</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin"><tt>int8_t</tt>, <tt>int16_t</tt></td><td class="convop">&rarr;<sup>sign-ext</sup> <tt>int32_t</tt> &rarr; <tt>double</tt></td><td class="convout">number</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>uint8_t</tt>, <tt>uint16_t</tt></td><td class="convop">&rarr;<sup>zero-ext</sup> <tt>int32_t</tt> &rarr; <tt>double</tt></td><td class="convout">number</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin"><tt>int32_t</tt>, <tt>uint32_t</tt></td><td class="convop">&rarr; <tt>double</tt></td><td class="convout">number</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>int64_t</tt>, <tt>uint64_t</tt></td><td class="convop">boxed value</td><td class="convout">64 bit int cdata</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr; <tt>double</tt></td><td class="convout">number</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin"><tt>bool</tt></td><td class="convop">0 &rarr; <tt>false</tt>, otherwise <tt>true</tt></td><td class="convout">boolean</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin"><tt>enum</tt></td><td class="convop">boxed value</td><td class="convout">enum cdata</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Complex number</td><td class="convop">boxed value</td><td class="convout">complex cdata</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Vector</td><td class="convop">boxed value</td><td class="convout">vector cdata</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Pointer</td><td class="convop">boxed value</td><td class="convout">pointer cdata</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Array</td><td class="convop">boxed reference</td><td class="convout">reference cdata</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">boxed reference</td><td class="convout">reference cdata</td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-Bitfields are treated like their underlying type.[m
[31m-</p>[m
[31m-<p>[m
[31m-Reference types are dereferenced <em>before</em> a conversion can take[m
[31m-place &mdash; the conversion is applied to the C&nbsp;type pointed to[m
[31m-by the reference.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="convert_fromlua">Conversions from Lua objects to C&nbsp;types</h3>[m
[31m-<p>[m
[31m-These conversion rules apply for <em>write accesses</em> to[m
[31m-C&nbsp;types: indexing pointers, arrays or[m
[31m-<tt>struct</tt>/<tt>union</tt> types; initializing cdata objects;[m
[31m-casts to C&nbsp;types; writing to external variables; passing[m
[31m-arguments to C&nbsp;calls:[m
[31m-</p>[m
[31m-<table class="convtable">[m
[31m-<tr class="convhead">[m
[31m-<td class="convin">Input</td>[m
[31m-<td class="convop">Conversion</td>[m
[31m-<td class="convout">Output</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">number</td><td class="convop">&rarr;</td><td class="convout"><tt>double</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">boolean</td><td class="convop"><tt>false</tt> &rarr; 0, <tt>true</tt> &rarr; 1</td><td class="convout"><tt>bool</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">nil</td><td class="convop"><tt>NULL</tt> &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">lightuserdata</td><td class="convop">lightuserdata address &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">userdata</td><td class="convop">userdata payload &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">io.* file</td><td class="convop">get FILE * handle &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">string</td><td class="convop">match against <tt>enum</tt> constant</td><td class="convout"><tt>enum</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">string</td><td class="convop">copy string data + zero-byte</td><td class="convout"><tt>int8_t[]</tt>, <tt>uint8_t[]</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">string</td><td class="convop">string data &rarr;</td><td class="convout"><tt>const char[]</tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin">function</td><td class="convop"><a href="#callback">create callback</a> &rarr;</td><td class="convout">C function type</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout">Array</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout"><tt>struct</tt>/<tt>union</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">cdata</td><td class="convop">cdata payload &rarr;</td><td class="convout">C type</td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-If the result type of this conversion doesn't match the[m
[31m-C&nbsp;type of the destination, the[m
[31m-<a href="#convert_between">conversion rules between C&nbsp;types</a>[m
[31m-are applied.[m
[31m-</p>[m
[31m-<p>[m
[31m-Reference types are immutable after initialization ("no re-seating of[m
[31m-references"). For initialization purposes or when passing values to[m
[31m-reference parameters, they are treated like pointers. Note that unlike[m
[31m-in C++, there's no way to implement automatic reference generation of[m
[31m-variables under the Lua language semantics. If you want to call a[m
[31m-function with a reference parameter, you need to explicitly pass a[m
[31m-one-element array.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="convert_between">Conversions between C&nbsp;types</h3>[m
[31m-<p>[m
[31m-These conversion rules are more or less the same as the standard[m
[31m-C&nbsp;conversion rules. Some rules only apply to casts, or require[m
[31m-pointer or type compatibility:[m
[31m-</p>[m
[31m-<table class="convtable">[m
[31m-<tr class="convhead">[m
[31m-<td class="convin">Input</td>[m
[31m-<td class="convop">Conversion</td>[m
[31m-<td class="convout">Output</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Signed integer</td><td class="convop">&rarr;<sup>narrow or sign-extend</sup></td><td class="convout">Integer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Unsigned integer</td><td class="convop">&rarr;<sup>narrow or zero-extend</sup></td><td class="convout">Integer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Integer</td><td class="convop">&rarr;<sup>round</sup></td><td class="convout"><tt>double</tt>, <tt>float</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup> <tt>int32_t</tt> &rarr;<sup>narrow</sup></td><td class="convout"><tt>(u)int8_t</tt>, <tt>(u)int16_t</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup></td><td class="convout"><tt>(u)int32_t</tt>, <tt>(u)int64_t</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>round</sup></td><td class="convout"><tt>float</tt>, <tt>double</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Number</td><td class="convop">n == 0 &rarr; 0, otherwise 1</td><td class="convout"><tt>bool</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>bool</tt></td><td class="convop"><tt>false</tt> &rarr; 0, <tt>true</tt> &rarr; 1</td><td class="convout">Number</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Complex number</td><td class="convop">convert real part</td><td class="convout">Number</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Number</td><td class="convop">convert real part, imag = 0</td><td class="convout">Complex number</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Complex number</td><td class="convop">convert real and imag part</td><td class="convout">Complex number</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin">Number</td><td class="convop">convert scalar and replicate</td><td class="convout">Vector</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Vector</td><td class="convop">copy (same size)</td><td class="convout">Vector</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">take base address (compat)</td><td class="convout">Pointer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Array</td><td class="convop">take base address (compat)</td><td class="convout">Pointer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Function</td><td class="convop">take function address</td><td class="convout">Function pointer</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Number</td><td class="convop">convert via <tt>uintptr_t</tt> (cast)</td><td class="convout">Pointer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Pointer</td><td class="convop">convert address (compat/cast)</td><td class="convout">Pointer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Pointer</td><td class="convop">convert address (cast)</td><td class="convout">Integer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Array</td><td class="convop">convert base address (cast)</td><td class="convout">Integer</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">Array</td><td class="convop">copy (compat)</td><td class="convout">Array</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">copy (identical type)</td><td class="convout"><tt>struct</tt>/<tt>union</tt></td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-Bitfields or <tt>enum</tt> types are treated like their underlying[m
[31m-type.[m
[31m-</p>[m
[31m-<p>[m
[31m-Conversions not listed above will raise an error. E.g. it's not[m
[31m-possible to convert a pointer to a complex number or vice versa.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="convert_vararg">Conversions for vararg C&nbsp;function arguments</h3>[m
[31m-<p>[m
[31m-The following default conversion rules apply when passing Lua objects[m
[31m-to the variable argument part of vararg C&nbsp;functions:[m
[31m-</p>[m
[31m-<table class="convtable">[m
[31m-<tr class="convhead">[m
[31m-<td class="convin">Input</td>[m
[31m-<td class="convop">Conversion</td>[m
[31m-<td class="convout">Output</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">number</td><td class="convop">&rarr;</td><td class="convout"><tt>double</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">boolean</td><td class="convop"><tt>false</tt> &rarr; 0, <tt>true</tt> &rarr; 1</td><td class="convout"><tt>bool</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin">nil</td><td class="convop"><tt>NULL</tt> &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">userdata</td><td class="convop">userdata payload &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">lightuserdata</td><td class="convop">lightuserdata address &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="convin">string</td><td class="convop">string data &rarr;</td><td class="convout"><tt>const char *</tt></td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="convin"><tt>float</tt> cdata</td><td class="convop">&rarr;</td><td class="convout"><tt>double</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Array cdata</td><td class="convop">take base address</td><td class="convout">Element pointer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin"><tt>struct</tt>/<tt>union</tt> cdata</td><td class="convop">take base address</td><td class="convout"><tt>struct</tt>/<tt>union</tt> pointer</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="convin">Function cdata</td><td class="convop">take function address</td><td class="convout">Function pointer</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="convin">Any other cdata</td><td class="convop">no conversion</td><td class="convout">C type</td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-To pass a Lua object, other than a cdata object, as a specific type,[m
[31m-you need to override the conversion rules: create a temporary cdata[m
[31m-object with a constructor or a cast and initialize it with the value[m
[31m-to pass:[m
[31m-</p>[m
[31m-<p>[m
[31m-Assuming <tt>x</tt> is a Lua number, here's how to pass it as an[m
[31m-integer to a vararg function:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.cdef[[[m
[31m-int printf(const char *fmt, ...);[m
[31m-]][m
[31m-ffi.C.printf("integer value: %d\n", ffi.new("int", x))[m
[31m-</pre>[m
[31m-<p>[m
[31m-If you don't do this, the default Lua number &rarr; <tt>double</tt>[m
[31m-conversion rule applies. A vararg C&nbsp;function expecting an integer[m
[31m-will see a garbled or uninitialized value.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="init">Initializers</h2>[m
[31m-<p>[m
[31m-Creating a cdata object with[m
[31m-<a href="ext_ffi_api.html#ffi_new"><tt>ffi.new()</tt></a> or the[m
[31m-equivalent constructor syntax always initializes its contents, too.[m
[31m-Different rules apply, depending on the number of optional[m
[31m-initializers and the C&nbsp;types involved:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>If no initializers are given, the object is filled with zero bytes.</li>[m
[31m-[m
[31m-<li>Scalar types (numbers and pointers) accept a single initializer.[m
[31m-The Lua object is <a href="#convert_fromlua">converted to the scalar[m
[31m-C&nbsp;type</a>.</li>[m
[31m-[m
[31m-<li>Valarrays (complex numbers and vectors) are treated like scalars[m
[31m-when a single initializer is given. Otherwise they are treated like[m
[31m-regular arrays.</li>[m
[31m-[m
[31m-<li>Aggregate types (arrays and structs) accept either a single cdata[m
[31m-initializer of the same type (copy constructor), a single[m
[31m-<a href="#init_table">table initializer</a>, or a flat list of[m
[31m-initializers.</li>[m
[31m-[m
[31m-<li>The elements of an array are initialized, starting at index zero.[m
[31m-If a single initializer is given for an array, it's repeated for all[m
[31m-remaining elements. This doesn't happen if two or more initializers[m
[31m-are given: all remaining uninitialized elements are filled with zero[m
[31m-bytes.</li>[m
[31m-[m
[31m-<li>Byte arrays may also be initialized with a Lua string. This copies[m
[31m-the whole string plus a terminating zero-byte. The copy stops early only[m
[31m-if the array has a known, fixed size.</li>[m
[31m-[m
[31m-<li>The fields of a <tt>struct</tt> are initialized in the order of[m
[31m-their declaration. Uninitialized fields are filled with zero[m
[31m-bytes.</li>[m
[31m-[m
[31m-<li>Only the first field of a <tt>union</tt> can be initialized with a[m
[31m-flat initializer.</li>[m
[31m-[m
[31m-<li>Elements or fields which are aggregates themselves are initialized[m
[31m-with a <em>single</em> initializer, but this may be a table[m
[31m-initializer or a compatible aggregate.</li>[m
[31m-[m
[31m-<li>Excess initializers cause an error.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="init_table">Table Initializers</h2>[m
[31m-<p>[m
[31m-The following rules apply if a Lua table is used to initialize an[m
[31m-Array or a <tt>struct</tt>/<tt>union</tt>:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>If the table index <tt>[0]</tt> is non-<tt>nil</tt>, then the[m
[31m-table is assumed to be zero-based. Otherwise it's assumed to be[m
[31m-one-based.</li>[m
[31m-[m
[31m-<li>Array elements, starting at index zero, are initialized one-by-one[m
[31m-with the consecutive table elements, starting at either index[m
[31m-<tt>[0]</tt> or <tt>[1]</tt>. This process stops at the first[m
[31m-<tt>nil</tt> table element.</li>[m
[31m-[m
[31m-<li>If exactly one array element was initialized, it's repeated for[m
[31m-all the remaining elements. Otherwise all remaining uninitialized[m
[31m-elements are filled with zero bytes.</li>[m
[31m-[m
[31m-<li>The above logic only applies to arrays with a known fixed size.[m
[31m-A VLA is only initialized with the element(s) given in the table.[m
[31m-Depending on the use case, you may need to explicitly add a[m
[31m-<tt>NULL</tt> or <tt>0</tt> terminator to a VLA.</li>[m
[31m-[m
[31m-<li>A <tt>struct</tt>/<tt>union</tt> can be initialized in the[m
[31m-order of the declaration of its fields. Each field is initialized with[m
[31m-consecutive table elements, starting at either index <tt>[0]</tt>[m
[31m-or <tt>[1]</tt>. This process stops at the first <tt>nil</tt> table[m
[31m-element.</li>[m
[31m-[m
[31m-<li>Otherwise, if neither index <tt>[0]</tt> nor <tt>[1]</tt> is present,[m
[31m-a <tt>struct</tt>/<tt>union</tt> is initialized by looking up each field[m
[31m-name (as a string key) in the table. Each non-<tt>nil</tt> value is[m
[31m-used to initialize the corresponding field.</li>[m
[31m-[m
[31m-<li>Uninitialized fields of a <tt>struct</tt> are filled with zero[m
[31m-bytes, except for the trailing VLA of a VLS.</li>[m
[31m-[m
[31m-<li>Initialization of a <tt>union</tt> stops after one field has been[m
[31m-initialized. If no field has been initialized, the <tt>union</tt> is[m
[31m-filled with zero bytes.</li>[m
[31m-[m
[31m-<li>Elements or fields which are aggregates themselves are initialized[m
[31m-with a <em>single</em> initializer, but this may be a nested table[m
[31m-initializer (or a compatible aggregate).</li>[m
[31m-[m
[31m-<li>Excess initializers for an array cause an error. Excess[m
[31m-initializers for a <tt>struct</tt>/<tt>union</tt> are ignored.[m
[31m-Unrelated table entries are ignored, too.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-Example:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local ffi = require("ffi")[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-struct foo { int a, b; };[m
[31m-union bar { int i; double d; };[m
[31m-struct nested { int x; struct foo y; };[m
[31m-]][m
[31m-[m
[31m-ffi.new("int[3]", {})            --> 0, 0, 0[m
[31m-ffi.new("int[3]", {1})           --> 1, 1, 1[m
[31m-ffi.new("int[3]", {1,2})         --> 1, 2, 0[m
[31m-ffi.new("int[3]", {1,2,3})       --> 1, 2, 3[m
[31m-ffi.new("int[3]", {[0]=1})       --> 1, 1, 1[m
[31m-ffi.new("int[3]", {[0]=1,2})     --> 1, 2, 0[m
[31m-ffi.new("int[3]", {[0]=1,2,3})   --> 1, 2, 3[m
[31m-ffi.new("int[3]", {[0]=1,2,3,4}) --> error: too many initializers[m
[31m-[m
[31m-ffi.new("struct foo", {})            --> a = 0, b = 0[m
[31m-ffi.new("struct foo", {1})           --> a = 1, b = 0[m
[31m-ffi.new("struct foo", {1,2})         --> a = 1, b = 2[m
[31m-ffi.new("struct foo", {[0]=1,2})     --> a = 1, b = 2[m
[31m-ffi.new("struct foo", {b=2})         --> a = 0, b = 2[m
[31m-ffi.new("struct foo", {a=1,b=2,c=3}) --> a = 1, b = 2  'c' is ignored[m
[31m-[m
[31m-ffi.new("union bar", {})        --> i = 0, d = 0.0[m
[31m-ffi.new("union bar", {1})       --> i = 1, d = ?[m
[31m-ffi.new("union bar", {[0]=1,2}) --> i = 1, d = ?    '2' is ignored[m
[31m-ffi.new("union bar", {d=2})     --> i = ?, d = 2.0[m
[31m-[m
[31m-ffi.new("struct nested", {1,{2,3}})     --> x = 1, y.a = 2, y.b = 3[m
[31m-ffi.new("struct nested", {x=1,y={2,3}}) --> x = 1, y.a = 2, y.b = 3[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="cdata_ops">Operations on cdata Objects</h2>[m
[31m-<p>[m
[31m-All of the standard Lua operators can be applied to cdata objects or a[m
[31m-mix of a cdata object and another Lua object. The following list shows[m
[31m-the pre-defined operations.[m
[31m-</p>[m
[31m-<p>[m
[31m-Reference types are dereferenced <em>before</em> performing each of[m
[31m-the operations below &mdash; the operation is applied to the[m
[31m-C&nbsp;type pointed to by the reference.[m
[31m-</p>[m
[31m-<p>[m
[31m-The pre-defined operations are always tried first before deferring to a[m
[31m-metamethod or index table (if any) for the corresponding ctype (except[m
[31m-for <tt>__new</tt>). An error is raised if the metamethod lookup or[m
[31m-index table lookup fails.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="cdata_array">Indexing a cdata object</h3>[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>Indexing a pointer/array</b>: a cdata pointer/array can be[m
[31m-indexed by a cdata number or a Lua number. The element address is[m
[31m-computed as the base address plus the number value multiplied by the[m
[31m-element size in bytes. A read access loads the element value and[m
[31m-<a href="#convert_tolua">converts it to a Lua object</a>. A write[m
[31m-access <a href="#convert_fromlua">converts a Lua object to the element[m
[31m-type</a> and stores the converted value to the element. An error is[m
[31m-raised if the element size is undefined or a write access to a[m
[31m-constant element is attempted.</li>[m
[31m-[m
[31m-<li><b>Dereferencing a <tt>struct</tt>/<tt>union</tt> field</b>: a[m
[31m-cdata <tt>struct</tt>/<tt>union</tt> or a pointer to a[m
[31m-<tt>struct</tt>/<tt>union</tt> can be dereferenced by a string key,[m
[31m-giving the field name. The field address is computed as the base[m
[31m-address plus the relative offset of the field. A read access loads the[m
[31m-field value and <a href="#convert_tolua">converts it to a Lua[m
[31m-object</a>. A write access <a href="#convert_fromlua">converts a Lua[m
[31m-object to the field type</a> and stores the converted value to the[m
[31m-field. An error is raised if a write access to a constant[m
[31m-<tt>struct</tt>/<tt>union</tt> or a constant field is attempted.[m
[31m-Scoped enum constants or static constants are treated like a constant[m
[31m-field.</li>[m
[31m-[m
[31m-<li><b>Indexing a complex number</b>: a complex number can be indexed[m
[31m-either by a cdata number or a Lua number with the values 0 or 1, or by[m
[31m-the strings <tt>"re"</tt> or <tt>"im"</tt>. A read access loads the[m
[31m-real part (<tt>[0]</tt>, <tt>.re</tt>) or the imaginary part[m
[31m-(<tt>[1]</tt>, <tt>.im</tt>) part of a complex number and[m
[31m-<a href="#convert_tolua">converts it to a Lua number</a>. The[m
[31m-sub-parts of a complex number are immutable &mdash; assigning to an[m
[31m-index of a complex number raises an error. Accessing out-of-bound[m
[31m-indexes returns unspecified results, but is guaranteed not to trigger[m
[31m-memory access violations.</li>[m
[31m-[m
[31m-<li><b>Indexing a vector</b>: a vector is treated like an array for[m
[31m-indexing purposes, except the vector elements are immutable &mdash;[m
[31m-assigning to an index of a vector raises an error.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-A ctype object can be indexed with a string key, too. The only[m
[31m-pre-defined operation is reading scoped constants of[m
[31m-<tt>struct</tt>/<tt>union</tt> types. All other accesses defer[m
[31m-to the corresponding metamethods or index tables (if any).[m
[31m-</p>[m
[31m-<p>[m
[31m-Note: since there's (deliberately) no address-of operator, a cdata[m
[31m-object holding a value type is effectively immutable after[m
[31m-initialization. The JIT compiler benefits from this fact when applying[m
[31m-certain optimizations.[m
[31m-</p>[m
[31m-<p>[m
[31m-As a consequence, the <em>elements</em> of complex numbers and[m
[31m-vectors are immutable. But the elements of an aggregate holding these[m
[31m-types <em>may</em> be modified of course. I.e. you cannot assign to[m
[31m-<tt>foo.c.im</tt>, but you can assign a (newly created) complex number[m
[31m-to <tt>foo.c</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-The JIT compiler implements strict aliasing rules: accesses to different[m
[31m-types do <b>not</b> alias, except for differences in signedness (this[m
[31m-applies even to <tt>char</tt> pointers, unlike C99). Type punning[m
[31m-through unions is explicitly detected and allowed.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="cdata_call">Calling a cdata object</h3>[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>Constructor</b>: a ctype object can be called and used as a[m
[31m-<a href="ext_ffi_api.html#ffi_new">constructor</a>. This is equivalent[m
[31m-to <tt>ffi.new(ct, ...)</tt>, unless a <tt>__new</tt> metamethod is[m
[31m-defined. The <tt>__new</tt> metamethod is called with the ctype object[m
[31m-plus any other arguments passed to the contructor. Note that you have to[m
[31m-use <tt>ffi.new</tt> inside of it, since calling <tt>ct(...)</tt> would[m
[31m-cause infinite recursion.</li>[m
[31m-[m
[31m-<li><b>C&nbsp;function call</b>: a cdata function or cdata function[m
[31m-pointer can be called. The passed arguments are[m
[31m-<a href="#convert_fromlua">converted to the C&nbsp;types</a> of the[m
[31m-parameters given by the function declaration. Arguments passed to the[m
[31m-variable argument part of vararg C&nbsp;function use[m
[31m-<a href="#convert_vararg">special conversion rules</a>. This[m
[31m-C&nbsp;function is called and the return value (if any) is[m
[31m-<a href="#convert_tolua">converted to a Lua object</a>.<br>[m
[31m-On Windows/x86 systems, <tt>__stdcall</tt> functions are automatically[m
[31m-detected and a function declared as <tt>__cdecl</tt> (the default) is[m
[31m-silently fixed up after the first call.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h3 id="cdata_arith">Arithmetic on cdata objects</h3>[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>Pointer arithmetic</b>: a cdata pointer/array and a cdata[m
[31m-number or a Lua number can be added or subtracted. The number must be[m
[31m-on the right hand side for a subtraction. The result is a pointer of[m
[31m-the same type with an address plus or minus the number value[m
[31m-multiplied by the element size in bytes. An error is raised if the[m
[31m-element size is undefined.</li>[m
[31m-[m
[31m-<li><b>Pointer difference</b>: two compatible cdata pointers/arrays[m
[31m-can be subtracted. The result is the difference between their[m
[31m-addresses, divided by the element size in bytes. An error is raised if[m
[31m-the element size is undefined or zero.</li>[m
[31m-[m
[31m-<li><b>64&nbsp;bit integer arithmetic</b>: the standard arithmetic[m
[31m-operators (<tt>+&nbsp;-&nbsp;*&nbsp;/&nbsp;%&nbsp;^</tt> and unary[m
[31m-minus) can be applied to two cdata numbers, or a cdata number and a[m
[31m-Lua number. If one of them is an <tt>uint64_t</tt>, the other side is[m
[31m-converted to an <tt>uint64_t</tt> and an unsigned arithmetic operation[m
[31m-is performed. Otherwise both sides are converted to an[m
[31m-<tt>int64_t</tt> and a signed arithmetic operation is performed. The[m
[31m-result is a boxed 64&nbsp;bit cdata object.<br>[m
[31m-[m
[31m-If one of the operands is an <tt>enum</tt> and the other operand is a[m
[31m-string, the string is converted to the value of a matching <tt>enum</tt>[m
[31m-constant before the above conversion.<br>[m
[31m-[m
[31m-These rules ensure that 64&nbsp;bit integers are "sticky". Any[m
[31m-expression involving at least one 64&nbsp;bit integer operand results[m
[31m-in another one. The undefined cases for the division, modulo and power[m
[31m-operators return <tt>2LL&nbsp;^&nbsp;63</tt> or[m
[31m-<tt>2ULL&nbsp;^&nbsp;63</tt>.<br>[m
[31m-[m
[31m-You'll have to explicitly convert a 64&nbsp;bit integer to a Lua[m
[31m-number (e.g. for regular floating-point calculations) with[m
[31m-<tt>tonumber()</tt>. But note this may incur a precision loss.</li>[m
[31m-[m
[31m-<li><b>64&nbsp;bit bitwise operations</b>: the rules for 64&nbsp;bit[m
[31m-arithmetic operators apply analogously.<br>[m
[31m-[m
[31m-Unlike the other <tt>bit.*</tt> operations, <tt>bit.tobit()</tt>[m
[31m-converts a cdata number via <tt>int64_t</tt> to <tt>int32_t</tt> and[m
[31m-returns a Lua number.<br>[m
[31m-[m
[31m-For <tt>bit.band()</tt>, <tt>bit.bor()</tt> and <tt>bit.bxor()</tt>, the[m
[31m-conversion to <tt>int64_t</tt> or <tt>uint64_t</tt> applies to[m
[31m-<em>all</em> arguments, if <em>any</em> argument is a cdata number.<br>[m
[31m-[m
[31m-For all other operations, only the first argument is used to determine[m
[31m-the output type. This implies that a cdata number as a shift count for[m
[31m-shifts and rotates is accepted, but that alone does <em>not</em> cause[m
[31m-a cdata number output.[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h3 id="cdata_comp">Comparisons of cdata objects</h3>[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>Pointer comparison</b>: two compatible cdata pointers/arrays[m
[31m-can be compared. The result is the same as an unsigned comparison of[m
[31m-their addresses. <tt>nil</tt> is treated like a <tt>NULL</tt> pointer,[m
[31m-which is compatible with any other pointer type.</li>[m
[31m-[m
[31m-<li><b>64&nbsp;bit integer comparison</b>: two cdata numbers, or a[m
[31m-cdata number and a Lua number can be compared with each other. If one[m
[31m-of them is an <tt>uint64_t</tt>, the other side is converted to an[m
[31m-<tt>uint64_t</tt> and an unsigned comparison is performed. Otherwise[m
[31m-both sides are converted to an <tt>int64_t</tt> and a signed[m
[31m-comparison is performed.<br>[m
[31m-[m
[31m-If one of the operands is an <tt>enum</tt> and the other operand is a[m
[31m-string, the string is converted to the value of a matching <tt>enum</tt>[m
[31m-constant before the above conversion.<br>[m
[31m-[m
[31m-<li><b>Comparisons for equality/inequality</b> never raise an error.[m
[31m-Even incompatible pointers can be compared for equality by address. Any[m
[31m-other incompatible comparison (also with non-cdata objects) treats the[m
[31m-two sides as unequal.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h3 id="cdata_key">cdata objects as table keys</h3>[m
[31m-<p>[m
[31m-Lua tables may be indexed by cdata objects, but this doesn't provide[m
[31m-any useful semantics &mdash; <b>cdata objects are unsuitable as table[m
[31m-keys!</b>[m
[31m-</p>[m
[31m-<p>[m
[31m-A cdata object is treated like any other garbage-collected object and[m
[31m-is hashed and compared by its address for table indexing. Since[m
[31m-there's no interning for cdata value types, the same value may be[m
[31m-boxed in different cdata objects with different addresses. Thus[m
[31m-<tt>t[1LL+1LL]</tt> and <tt>t[2LL]</tt> usually <b>do not</b> point to[m
[31m-the same hash slot and they certainly <b>do not</b> point to the same[m
[31m-hash slot as <tt>t[2]</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-It would seriously drive up implementation complexity and slow down[m
[31m-the common case, if one were to add extra handling for by-value[m
[31m-hashing and comparisons to Lua tables. Given the ubiquity of their use[m
[31m-inside the VM, this is not acceptable.[m
[31m-</p>[m
[31m-<p>[m
[31m-There are three viable alternatives, if you really need to use cdata[m
[31m-objects as keys:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>If you can get by with the precision of Lua numbers[m
[31m-(52&nbsp;bits), then use <tt>tonumber()</tt> on a cdata number or[m
[31m-combine multiple fields of a cdata aggregate to a Lua number. Then use[m
[31m-the resulting Lua number as a key when indexing tables.<br>[m
[31m-One obvious benefit: <tt>t[tonumber(2LL)]</tt> <b>does</b> point to[m
[31m-the same slot as <tt>t[2]</tt>.</li>[m
[31m-[m
[31m-<li>Otherwise use either <tt>tostring()</tt> on 64&nbsp;bit integers[m
[31m-or complex numbers or combine multiple fields of a cdata aggregate to[m
[31m-a Lua string (e.g. with[m
[31m-<a href="ext_ffi_api.html#ffi_string"><tt>ffi.string()</tt></a>). Then[m
[31m-use the resulting Lua string as a key when indexing tables.</li>[m
[31m-[m
[31m-<li>Create your own specialized hash table implementation using the[m
[31m-C&nbsp;types provided by the FFI library, just like you would in[m
[31m-C&nbsp;code. Ultimately this may give much better performance than the[m
[31m-other alternatives or what a generic by-value hash table could[m
[31m-possibly provide.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="param">Parameterized Types</h2>[m
[31m-<p>[m
[31m-To facilitate some abstractions, the two functions[m
[31m-<a href="ext_ffi_api.html#ffi_typeof"><tt>ffi.typeof</tt></a> and[m
[31m-<a href="ext_ffi_api.html#ffi_cdef"><tt>ffi.cdef</tt></a> support[m
[31m-parameterized types in C&nbsp;declarations. Note: none of the other API[m
[31m-functions taking a cdecl allow this.[m
[31m-</p>[m
[31m-<p>[m
[31m-Any place you can write a <b><tt>typedef</tt> name</b>, an[m
[31m-<b>identifier</b> or a <b>number</b> in a declaration, you can write[m
[31m-<tt>$</tt> (the dollar sign) instead. These placeholders are replaced in[m
[31m-order of appearance with the arguments following the cdecl string:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m--- Declare a struct with a parameterized field type and name:[m
[31m-ffi.cdef([[[m
[31m-typedef struct { $ $; } foo_t;[m
[31m-]], type1, name1)[m
[31m-[m
[31m--- Anonymous struct with dynamic names:[m
[31m-local bar_t = ffi.typeof("struct { int $, $; }", name1, name2)[m
[31m--- Derived pointer type:[m
[31m-local bar_ptr_t = ffi.typeof("$ *", bar_t)[m
[31m-[m
[31m--- Parameterized dimensions work even where a VLA won't work:[m
[31m-local matrix_t = ffi.typeof("uint8_t[$][$]", width, height)[m
[31m-</pre>[m
[31m-<p>[m
[31m-Caveat: this is <em>not</em> simple text substitution! A passed ctype or[m
[31m-cdata object is treated like the underlying type, a passed string is[m
[31m-considered an identifier and a number is considered a number. You must[m
[31m-not mix this up: e.g. passing <tt>"int"</tt> as a string doesn't work in[m
[31m-place of a type, you'd need to use <tt>ffi.typeof("int")</tt> instead.[m
[31m-</p>[m
[31m-<p>[m
[31m-The main use for parameterized types are libraries implementing abstract[m
[31m-data types[m
[31m-(<a href="http://www.freelists.org/post/luajit/ffi-type-of-pointer-to,8"><span class="ext">&raquo;</span>&nbsp;example</a>),[m
[31m-similar to what can be achieved with C++ template metaprogramming.[m
[31m-Another use case are derived types of anonymous structs, which avoids[m
[31m-pollution of the global struct namespace.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note that parameterized types are a nice tool and indispensable[m
[31m-for certain use cases. But you'll want to use them sparingly in regular[m
[31m-code, e.g. when all types are actually fixed.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="gc">Garbage Collection of cdata Objects</h2>[m
[31m-<p>[m
[31m-All explicitly (<tt>ffi.new()</tt>, <tt>ffi.cast()</tt> etc.) or[m
[31m-implicitly (accessors) created cdata objects are garbage collected.[m
[31m-You need to ensure to retain valid references to cdata objects[m
[31m-somewhere on a Lua stack, an upvalue or in a Lua table while they are[m
[31m-still in use. Once the last reference to a cdata object is gone, the[m
[31m-garbage collector will automatically free the memory used by it (at[m
[31m-the end of the next GC cycle).[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note that pointers themselves are cdata objects, however they[m
[31m-are <b>not</b> followed by the garbage collector. So e.g. if you[m
[31m-assign a cdata array to a pointer, you must keep the cdata object[m
[31m-holding the array alive as long as the pointer is still in use:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.cdef[[[m
[31m-typedef struct { int *a; } foo_t;[m
[31m-]][m
[31m-[m
[31m-local s = ffi.new("foo_t", ffi.new("int[10]")) -- <span style="color:#c00000;">WRONG!</span>[m
[31m-[m
[31m-local a = ffi.new("int[10]") -- <span style="color:#00a000;">OK</span>[m
[31m-local s = ffi.new("foo_t", a)[m
[31m--- Now do something with 's', but keep 'a' alive until you're done.[m
[31m-</pre>[m
[31m-<p>[m
[31m-Similar rules apply for Lua strings which are implicitly converted to[m
[31m-<tt>"const&nbsp;char&nbsp;*"</tt>: the string object itself must be[m
[31m-referenced somewhere or it'll be garbage collected eventually. The[m
[31m-pointer will then point to stale data, which may have already been[m
[31m-overwritten. Note that <em>string literals</em> are automatically kept[m
[31m-alive as long as the function containing it (actually its prototype)[m
[31m-is not garbage collected.[m
[31m-</p>[m
[31m-<p>[m
[31m-Objects which are passed as an argument to an external C&nbsp;function[m
[31m-are kept alive until the call returns. So it's generally safe to[m
[31m-create temporary cdata objects in argument lists. This is a common[m
[31m-idiom for <a href="#convert_vararg">passing specific C&nbsp;types to[m
[31m-vararg functions</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-Memory areas returned by C functions (e.g. from <tt>malloc()</tt>)[m
[31m-must be manually managed, of course (or use[m
[31m-<a href="ext_ffi_api.html#ffi_gc"><tt>ffi.gc()</tt></a>). Pointers to[m
[31m-cdata objects are indistinguishable from pointers returned by C[m
[31m-functions (which is one of the reasons why the GC cannot follow them).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="callback">Callbacks</h2>[m
[31m-<p>[m
[31m-The LuaJIT FFI automatically generates special callback functions[m
[31m-whenever a Lua function is converted to a C&nbsp;function pointer. This[m
[31m-associates the generated callback function pointer with the C&nbsp;type[m
[31m-of the function pointer and the Lua function object (closure).[m
[31m-</p>[m
[31m-<p>[m
[31m-This can happen implicitly due to the usual conversions, e.g. when[m
[31m-passing a Lua function to a function pointer argument. Or you can use[m
[31m-<tt>ffi.cast()</tt> to explicitly cast a Lua function to a[m
[31m-C&nbsp;function pointer.[m
[31m-</p>[m
[31m-<p>[m
[31m-Currently only certain C&nbsp;function types can be used as callback[m
[31m-functions. Neither C&nbsp;vararg functions nor functions with[m
[31m-pass-by-value aggregate argument or result types are supported. There[m
[31m-are no restrictions for the kind of Lua functions that can be called[m
[31m-from the callback &mdash; no checks for the proper number of arguments[m
[31m-are made. The return value of the Lua function will be converted to the[m
[31m-result type and an error will be thrown for invalid conversions.[m
[31m-</p>[m
[31m-<p>[m
[31m-It's allowed to throw errors across a callback invocation, but it's not[m
[31m-advisable in general. Do this only if you know the C&nbsp;function, that[m
[31m-called the callback, copes with the forced stack unwinding and doesn't[m
[31m-leak resources.[m
[31m-</p>[m
[31m-<p>[m
[31m-One thing that's not allowed, is to let an FFI call into a C&nbsp;function[m
[31m-get JIT-compiled, which in turn calls a callback, calling into Lua again.[m
[31m-Usually this attempt is caught by the interpreter first and the[m
[31m-C&nbsp;function is blacklisted for compilation.[m
[31m-</p>[m
[31m-<p>[m
[31m-However, this heuristic may fail under specific circumstances: e.g. a[m
[31m-message polling function might not run Lua callbacks right away and the call[m
[31m-gets JIT-compiled. If it later happens to call back into Lua (e.g. a rarely[m
[31m-invoked error callback), you'll get a VM PANIC with the message[m
[31m-<tt>"bad callback"</tt>. Then you'll need to manually turn off[m
[31m-JIT-compilation with[m
[31m-<a href="ext_jit.html#jit_onoff_func"><tt>jit.off()</tt></a> for the[m
[31m-surrounding Lua function that invokes such a message polling function (or[m
[31m-similar).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="callback_resources">Callback resource handling</h3>[m
[31m-<p>[m
[31m-Callbacks take up resources &mdash; you can only have a limited number[m
[31m-of them at the same time (500&nbsp;-&nbsp;1000, depending on the[m
[31m-architecture). The associated Lua functions are anchored to prevent[m
[31m-garbage collection, too.[m
[31m-</p>[m
[31m-<p>[m
[31m-<b>Callbacks due to implicit conversions are permanent!</b> There is no[m
[31m-way to guess their lifetime, since the C&nbsp;side might store the[m
[31m-function pointer for later use (typical for GUI toolkits). The associated[m
[31m-resources cannot be reclaimed until termination:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-ffi.cdef[[[m
[31m-typedef int (__stdcall *WNDENUMPROC)(void *hwnd, intptr_t l);[m
[31m-int EnumWindows(WNDENUMPROC func, intptr_t l);[m
[31m-]][m
[31m-[m
[31m--- Implicit conversion to a callback via function pointer argument.[m
[31m-local count = 0[m
[31m-ffi.C.EnumWindows(function(hwnd, l)[m
[31m-  count = count + 1[m
[31m-  return true[m
[31m-end, 0)[m
[31m--- The callback is permanent and its resources cannot be reclaimed![m
[31m--- Ok, so this may not be a problem, if you do this only once.[m
[31m-</pre>[m
[31m-<p>[m
[31m-Note: this example shows that you <em>must</em> properly declare[m
[31m-<tt>__stdcall</tt> callbacks on Windows/x86 systems. The calling[m
[31m-convention cannot be automatically detected, unlike for[m
[31m-<tt>__stdcall</tt> calls <em>to</em> Windows functions.[m
[31m-</p>[m
[31m-<p>[m
[31m-For some use cases it's necessary to free up the resources or to[m
[31m-dynamically redirect callbacks. Use an explicit cast to a[m
[31m-C&nbsp;function pointer and keep the resulting cdata object. Then use[m
[31m-the <a href="ext_ffi_api.html#callback_free"><tt>cb:free()</tt></a>[m
[31m-or <a href="ext_ffi_api.html#callback_set"><tt>cb:set()</tt></a> methods[m
[31m-on the cdata object:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m--- Explicitly convert to a callback via cast.[m
[31m-local count = 0[m
[31m-local cb = ffi.cast("WNDENUMPROC", function(hwnd, l)[m
[31m-  count = count + 1[m
[31m-  return true[m
[31m-end)[m
[31m-[m
[31m--- Pass it to a C function.[m
[31m-ffi.C.EnumWindows(cb, 0)[m
[31m--- EnumWindows doesn't need the callback after it returns, so free it.[m
[31m-[m
[31m-cb:free()[m
[31m--- The callback function pointer is no longer valid and its resources[m
[31m--- will be reclaimed. The created Lua closure will be garbage collected.[m
[31m-</pre>[m
[31m-[m
[31m-<h3 id="callback_performance">Callback performance</h3>[m
[31m-<p>[m
[31m-<b>Callbacks are slow!</b> First, the C&nbsp;to Lua transition itself[m
[31m-has an unavoidable cost, similar to a <tt>lua_call()</tt> or[m
[31m-<tt>lua_pcall()</tt>. Argument and result marshalling add to that cost.[m
[31m-And finally, neither the C&nbsp;compiler nor LuaJIT can inline or[m
[31m-optimize across the language barrier and hoist repeated computations out[m
[31m-of a callback function.[m
[31m-</p>[m
[31m-<p>[m
[31m-Do not use callbacks for performance-sensitive work: e.g. consider a[m
[31m-numerical integration routine which takes a user-defined function to[m
[31m-integrate over. It's a bad idea to call a user-defined Lua function from[m
[31m-C&nbsp;code millions of times. The callback overhead will be absolutely[m
[31m-detrimental for performance.[m
[31m-</p>[m
[31m-<p>[m
[31m-It's considerably faster to write the numerical integration routine[m
[31m-itself in Lua &mdash; the JIT compiler will be able to inline the[m
[31m-user-defined function and optimize it together with its calling context,[m
[31m-with very competitive performance.[m
[31m-</p>[m
[31m-<p>[m
[31m-As a general guideline: <b>use callbacks only when you must</b>, because[m
[31m-of existing C&nbsp;APIs. E.g. callback performance is irrelevant for a[m
[31m-GUI application, which waits for user input most of the time, anyway.[m
[31m-</p>[m
[31m-<p>[m
[31m-For new designs <b>avoid push-style APIs</b>: a C&nbsp;function repeatedly[m
[31m-calling a callback for each result. Instead <b>use pull-style APIs</b>:[m
[31m-call a C&nbsp;function repeatedly to get a new result. Calls from Lua[m
[31m-to C via the FFI are much faster than the other way round. Most well-designed[m
[31m-libraries already use pull-style APIs (read/write, get/put).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="clib">C Library Namespaces</h2>[m
[31m-<p>[m
[31m-A C&nbsp;library namespace is a special kind of object which allows[m
[31m-access to the symbols contained in shared libraries or the default[m
[31m-symbol namespace. The default[m
[31m-<a href="ext_ffi_api.html#ffi_C"><tt>ffi.C</tt></a> namespace is[m
[31m-automatically created when the FFI library is loaded. C&nbsp;library[m
[31m-namespaces for specific shared libraries may be created with the[m
[31m-<a href="ext_ffi_api.html#ffi_load"><tt>ffi.load()</tt></a> API[m
[31m-function.[m
[31m-</p>[m
[31m-<p>[m
[31m-Indexing a C&nbsp;library namespace object with a symbol name (a Lua[m
[31m-string) automatically binds it to the library. First the symbol type[m
[31m-is resolved &mdash; it must have been declared with[m
[31m-<a href="ext_ffi_api.html#ffi_cdef"><tt>ffi.cdef</tt></a>. Then the[m
[31m-symbol address is resolved by searching for the symbol name in the[m
[31m-associated shared libraries or the default symbol namespace. Finally,[m
[31m-the resulting binding between the symbol name, the symbol type and its[m
[31m-address is cached. Missing symbol declarations or nonexistent symbol[m
[31m-names cause an error.[m
[31m-</p>[m
[31m-<p>[m
[31m-This is what happens on a <b>read access</b> for the different kinds of[m
[31m-symbols:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>External functions: a cdata object with the type of the function[m
[31m-and its address is returned.</li>[m
[31m-[m
[31m-<li>External variables: the symbol address is dereferenced and the[m
[31m-loaded value is <a href="#convert_tolua">converted to a Lua object</a>[m
[31m-and returned.</li>[m
[31m-[m
[31m-<li>Constant values (<tt>static&nbsp;const</tt> or <tt>enum</tt>[m
[31m-constants): the constant is <a href="#convert_tolua">converted to a[m
[31m-Lua object</a> and returned.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-This is what happens on a <b>write access</b>:[m
[31m-</p>[m
[31m-<ul>[m
[31m-[m
[31m-<li>External variables: the value to be written is[m
[31m-<a href="#convert_fromlua">converted to the C&nbsp;type</a> of the[m
[31m-variable and then stored at the symbol address.</li>[m
[31m-[m
[31m-<li>Writing to constant variables or to any other symbol type causes[m
[31m-an error, like any other attempted write to a constant location.</li>[m
[31m-[m
[31m-</ul>[m
[31m-<p>[m
[31m-C&nbsp;library namespaces themselves are garbage collected objects. If[m
[31m-the last reference to the namespace object is gone, the garbage[m
[31m-collector will eventually release the shared library reference and[m
[31m-remove all memory associated with the namespace. Since this may[m
[31m-trigger the removal of the shared library from the memory of the[m
[31m-running process, it's generally <em>not safe</em> to use function[m
[31m-cdata objects obtained from a library if the namespace object may be[m
[31m-unreferenced.[m
[31m-</p>[m
[31m-<p>[m
[31m-Performance notice: the JIT compiler specializes to the identity of[m
[31m-namespace objects and to the strings used to index it. This[m
[31m-effectively turns function cdata objects into constants. It's not[m
[31m-useful and actually counter-productive to explicitly cache these[m
[31m-function objects, e.g. <tt>local strlen = ffi.C.strlen</tt>. OTOH it[m
[31m-<em>is</em> useful to cache the namespace itself, e.g. <tt>local C =[m
[31m-ffi.C</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="policy">No Hand-holding!</h2>[m
[31m-<p>[m
[31m-The FFI library has been designed as <b>a low-level library</b>. The[m
[31m-goal is to interface with C&nbsp;code and C&nbsp;data types with a[m
[31m-minimum of overhead. This means <b>you can do anything you can do[m
[31m-from&nbsp;C</b>: access all memory, overwrite anything in memory, call[m
[31m-machine code at any memory address and so on.[m
[31m-</p>[m
[31m-<p>[m
[31m-The FFI library provides <b>no memory safety</b>, unlike regular Lua[m
[31m-code. It will happily allow you to dereference a <tt>NULL</tt>[m
[31m-pointer, to access arrays out of bounds or to misdeclare[m
[31m-C&nbsp;functions. If you make a mistake, your application might crash,[m
[31m-just like equivalent C&nbsp;code would.[m
[31m-</p>[m
[31m-<p>[m
[31m-This behavior is inevitable, since the goal is to provide full[m
[31m-interoperability with C&nbsp;code. Adding extra safety measures, like[m
[31m-bounds checks, would be futile. There's no way to detect[m
[31m-misdeclarations of C&nbsp;functions, since shared libraries only[m
[31m-provide symbol names, but no type information. Likewise there's no way[m
[31m-to infer the valid range of indexes for a returned pointer.[m
[31m-</p>[m
[31m-<p>[m
[31m-Again: the FFI library is a low-level library. This implies it needs[m
[31m-to be used with care, but it's flexibility and performance often[m
[31m-outweigh this concern. If you're a C or C++ developer, it'll be easy[m
[31m-to apply your existing knowledge. OTOH writing code for the FFI[m
[31m-library is not for the faint of heart and probably shouldn't be the[m
[31m-first exercise for someone with little experience in Lua, C or C++.[m
[31m-</p>[m
[31m-<p>[m
[31m-As a corollary of the above, the FFI library is <b>not safe for use by[m
[31m-untrusted Lua code</b>. If you're sandboxing untrusted Lua code, you[m
[31m-definitely don't want to give this code access to the FFI library or[m
[31m-to <em>any</em> cdata object (except 64&nbsp;bit integers or complex[m
[31m-numbers). Any properly engineered Lua sandbox needs to provide safety[m
[31m-wrappers for many of the standard Lua library functions &mdash;[m
[31m-similar wrappers need to be written for high-level operations on FFI[m
[31m-data types, too.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="status">Current Status</h2>[m
[31m-<p>[m
[31m-The initial release of the FFI library has some limitations and is[m
[31m-missing some features. Most of these will be fixed in future releases.[m
[31m-</p>[m
[31m-<p>[m
[31m-<a href="#clang">C language support</a> is[m
[31m-currently incomplete:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>C&nbsp;declarations are not passed through a C&nbsp;pre-processor,[m
[31m-yet.</li>[m
[31m-<li>The C&nbsp;parser is able to evaluate most constant expressions[m
[31m-commonly found in C&nbsp;header files. However it doesn't handle the[m
[31m-full range of C&nbsp;expression semantics and may fail for some[m
[31m-obscure constructs.</li>[m
[31m-<li><tt>static const</tt> declarations only work for integer types[m
[31m-up to 32&nbsp;bits. Neither declaring string constants nor[m
[31m-floating-point constants is supported.</li>[m
[31m-<li>Packed <tt>struct</tt> bitfields that cross container boundaries[m
[31m-are not implemented.</li>[m
[31m-<li>Native vector types may be defined with the GCC <tt>mode</tt> or[m
[31m-<tt>vector_size</tt> attribute. But no operations other than loading,[m
[31m-storing and initializing them are supported, yet.</li>[m
[31m-<li>The <tt>volatile</tt> type qualifier is currently ignored by[m
[31m-compiled code.</li>[m
[31m-<li><a href="ext_ffi_api.html#ffi_cdef"><tt>ffi.cdef</tt></a> silently[m
[31m-ignores most re-declarations. Note: avoid re-declarations which do not[m
[31m-conform to C99. The implementation will eventually be changed to[m
[31m-perform strict checks.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The JIT compiler already handles a large subset of all FFI operations.[m
[31m-It automatically falls back to the interpreter for unimplemented[m
[31m-operations (you can check for this with the[m
[31m-<a href="running.html#opt_j"><tt>-jv</tt></a> command line option).[m
[31m-The following operations are currently not compiled and may exhibit[m
[31m-suboptimal performance, especially when used in inner loops:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>Bitfield accesses and initializations.</li>[m
[31m-<li>Vector operations.</li>[m
[31m-<li>Table initializers.</li>[m
[31m-<li>Initialization of nested <tt>struct</tt>/<tt>union</tt> types.</li>[m
[31m-<li>Non-default initialization of VLA/VLS or large C&nbsp;types[m
[31m-(&gt; 128&nbsp;bytes or &gt; 16 array elements.</li>[m
[31m-<li>Conversions from lightuserdata to <tt>void&nbsp;*</tt>.</li>[m
[31m-<li>Pointer differences for element sizes that are not a power of[m
[31m-two.</li>[m
[31m-<li>Calls to C&nbsp;functions with aggregates passed or returned by[m
[31m-value.</li>[m
[31m-<li>Calls to ctype metamethods which are not plain functions.</li>[m
[31m-<li>ctype <tt>__newindex</tt> tables and non-string lookups in ctype[m
[31m-<tt>__index</tt> tables.</li>[m
[31m-<li><tt>tostring()</tt> for cdata types.</li>[m
[31m-<li>Calls to <tt>ffi.cdef()</tt>, <tt>ffi.load()</tt> and[m
[31m-<tt>ffi.metatype()</tt>.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-Other missing features:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>Arithmetic for <tt>complex</tt> numbers.</li>[m
[31m-<li>Passing structs by value to vararg C&nbsp;functions.</li>[m
[31m-<li><a href="extensions.html#exceptions">C++ exception interoperability</a>[m
[31m-does not extend to C&nbsp;functions called via the FFI, if the call is[m
[31m-compiled.</li>[m
[31m-</ul>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_tutorial.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_tutorial.html[m
[1mdeleted file mode 100644[m
[1mindex 01200c4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_ffi_tutorial.html[m
[1m+++ /dev/null[m
[36m@@ -1,603 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>FFI Tutorial</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.idiomtable { font-size: 90%; line-height: 1.2; }[m
[31m-table.idiomtable tt { font-size: 100%; }[m
[31m-table.idiomtable td { vertical-align: top; }[m
[31m-tr.idiomhead td { font-weight: bold; }[m
[31m-td.idiomlua b { font-weight: normal; color: #2142bf; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>FFI Tutorial</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a class="current" href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-This page is intended to give you an overview of the features of the FFI[m
[31m-library by presenting a few use cases and guidelines.[m
[31m-</p>[m
[31m-<p>[m
[31m-This page makes no attempt to explain all of the FFI library, though.[m
[31m-You'll want to have a look at the <a href="ext_ffi_api.html">ffi.* API[m
[31m-function reference</a> and the <a href="ext_ffi_semantics.html">FFI[m
[31m-semantics</a> to learn more.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="load">Loading the FFI Library</h2>[m
[31m-<p>[m
[31m-The FFI library is built into LuaJIT by default, but it's not loaded[m
[31m-and initialized by default. The suggested way to use the FFI library[m
[31m-is to add the following to the start of every Lua file that needs one[m
[31m-of its functions:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local ffi = require("ffi")[m
[31m-</pre>[m
[31m-<p>[m
[31m-Please note this doesn't define an <tt>ffi</tt> variable in the table[m
[31m-of globals &mdash; you really need to use the local variable. The[m
[31m-<tt>require</tt> function ensures the library is only loaded once.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Note: If you want to experiment with the FFI from the interactive prompt[m
[31m-of the command line executable, omit the <tt>local</tt>, as it doesn't[m
[31m-preserve local variables across lines.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="sleep">Accessing Standard System Functions</h2>[m
[31m-<p>[m
[31m-The following code explains how to access standard system functions.[m
[31m-We slowly print two lines of dots by sleeping for 10&nbsp;milliseconds[m
[31m-after each dot:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&nbsp;[m
[31m-&#9312;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9313;[m
[31m-&#9314;[m
[31m-&#9315;[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9316;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9317;</span>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">void Sleep(int ms);[m
[31m-int poll(struct pollfd *fds, unsigned long nfds, int timeout);</span>[m
[31m-]][m
[31m-[m
[31m-local sleep[m
[31m-if ffi.os == "Windows" then[m
[31m-  function sleep(s)[m
[31m-    ffi.C.Sleep(s*1000)[m
[31m-  end[m
[31m-else[m
[31m-  function sleep(s)[m
[31m-    ffi.C.poll(nil, 0, s*1000)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-for i=1,160 do[m
[31m-  io.write("."); io.flush()[m
[31m-  sleep(0.01)[m
[31m-end[m
[31m-io.write("\n")[m
[31m-</pre>[m
[31m-<p>[m
[31m-Here's the step-by-step explanation:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> This defines the[m
[31m-C&nbsp;library functions we're going to use. The part inside the[m
[31m-double-brackets (in green) is just standard C&nbsp;syntax. You can[m
[31m-usually get this info from the C&nbsp;header files or the[m
[31m-documentation provided by each C&nbsp;library or C&nbsp;compiler.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> The difficulty we're[m
[31m-facing here, is that there are different standards to choose from.[m
[31m-Windows has a simple <tt>Sleep()</tt> function. On other systems there[m
[31m-are a variety of functions available to achieve sub-second sleeps, but[m
[31m-with no clear consensus. Thankfully <tt>poll()</tt> can be used for[m
[31m-this task, too, and it's present on most non-Windows systems. The[m
[31m-check for <tt>ffi.os</tt> makes sure we use the Windows-specific[m
[31m-function only on Windows systems.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> Here we're wrapping the[m
[31m-call to the C&nbsp;function in a Lua function. This isn't strictly[m
[31m-necessary, but it's helpful to deal with system-specific issues only[m
[31m-in one part of the code. The way we're wrapping it ensures the check[m
[31m-for the OS is only done during initialization and not for every call.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9315;</span> A more subtle point is[m
[31m-that we defined our <tt>sleep()</tt> function (for the sake of this[m
[31m-example) as taking the number of seconds, but accepting fractional[m
[31m-seconds. Multiplying this by 1000 gets us milliseconds, but that still[m
[31m-leaves it a Lua number, which is a floating-point value. Alas, the[m
[31m-<tt>Sleep()</tt> function only accepts an integer value. Luckily for[m
[31m-us, the FFI library automatically performs the conversion when calling[m
[31m-the function (truncating the FP value towards zero, like in C).[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Some readers will notice that <tt>Sleep()</tt> is part of[m
[31m-<tt>KERNEL32.DLL</tt> and is also a <tt>stdcall</tt> function. So how[m
[31m-can this possibly work? The FFI library provides the <tt>ffi.C</tt>[m
[31m-default C&nbsp;library namespace, which allows calling functions from[m
[31m-the default set of libraries, like a C&nbsp;compiler would. Also, the[m
[31m-FFI library automatically detects <tt>stdcall</tt> functions, so you[m
[31m-don't need to declare them as such.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9316;</span> The <tt>poll()</tt>[m
[31m-function takes a couple more arguments we're not going to use. You can[m
[31m-simply use <tt>nil</tt> to pass a <tt>NULL</tt> pointer and <tt>0</tt>[m
[31m-for the <tt>nfds</tt> parameter. Please note that the[m
[31m-number&nbsp;<tt>0</tt> <em>does not convert to a pointer value</em>,[m
[31m-unlike in C++. You really have to pass pointers to pointer arguments[m
[31m-and numbers to number arguments.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-The page on <a href="ext_ffi_semantics.html">FFI semantics</a> has all[m
[31m-of the gory details about[m
[31m-<a href="ext_ffi_semantics.html#convert">conversions between Lua[m
[31m-objects and C&nbsp;types</a>. For the most part you don't have to deal[m
[31m-with this, as it's performed automatically and it's carefully designed[m
[31m-to bridge the semantic differences between Lua and C.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9317;</span> Now that we have defined[m
[31m-our own <tt>sleep()</tt> function, we can just call it from plain Lua[m
[31m-code. That wasn't so bad, huh? Turning these boring animated dots into[m
[31m-a fascinating best-selling game is left as an exercise for the reader.[m
[31m-:-)[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="zlib">Accessing the zlib Compression Library</h2>[m
[31m-<p>[m
[31m-The following code shows how to access the <a[m
[31m-href="http://zlib.net/">zlib</a> compression library from Lua code.[m
[31m-We'll define two convenience wrapper functions that take a string and[m
[31m-compress or uncompress it to another string:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&nbsp;[m
[31m-&#9312;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9313;[m
[31m-[m
[31m-[m
[31m-&#9314;[m
[31m-[m
[31m-&#9315;[m
[31m-[m
[31m-[m
[31m-&#9316;[m
[31m-[m
[31m-[m
[31m-&#9317;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9318;</span>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">unsigned long compressBound(unsigned long sourceLen);[m
[31m-int compress2(uint8_t *dest, unsigned long *destLen,[m
[31m-	      const uint8_t *source, unsigned long sourceLen, int level);[m
[31m-int uncompress(uint8_t *dest, unsigned long *destLen,[m
[31m-	       const uint8_t *source, unsigned long sourceLen);</span>[m
[31m-]][m
[31m-local zlib = ffi.load(ffi.os == "Windows" and "zlib1" or "z")[m
[31m-[m
[31m-local function compress(txt)[m
[31m-  local n = zlib.compressBound(#txt)[m
[31m-  local buf = ffi.new("uint8_t[?]", n)[m
[31m-  local buflen = ffi.new("unsigned long[1]", n)[m
[31m-  local res = zlib.compress2(buf, buflen, txt, #txt, 9)[m
[31m-  assert(res == 0)[m
[31m-  return ffi.string(buf, buflen[0])[m
[31m-end[m
[31m-[m
[31m-local function uncompress(comp, n)[m
[31m-  local buf = ffi.new("uint8_t[?]", n)[m
[31m-  local buflen = ffi.new("unsigned long[1]", n)[m
[31m-  local res = zlib.uncompress(buf, buflen, comp, #comp)[m
[31m-  assert(res == 0)[m
[31m-  return ffi.string(buf, buflen[0])[m
[31m-end[m
[31m-[m
[31m--- Simple test code.[m
[31m-local txt = string.rep("abcd", 1000)[m
[31m-print("Uncompressed size: ", #txt)[m
[31m-local c = compress(txt)[m
[31m-print("Compressed size: ", #c)[m
[31m-local txt2 = uncompress(c, #txt)[m
[31m-assert(txt2 == txt)[m
[31m-</pre>[m
[31m-<p>[m
[31m-Here's the step-by-step explanation:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> This defines some of the[m
[31m-C&nbsp;functions provided by zlib. For the sake of this example, some[m
[31m-type indirections have been reduced and it uses the pre-defined[m
[31m-fixed-size integer types, while still adhering to the zlib API/ABI.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> This loads the zlib shared[m
[31m-library. On POSIX systems it's named <tt>libz.so</tt> and usually[m
[31m-comes pre-installed. Since <tt>ffi.load()</tt> automatically adds any[m
[31m-missing standard prefixes/suffixes, we can simply load the[m
[31m-<tt>"z"</tt> library. On Windows it's named <tt>zlib1.dll</tt> and[m
[31m-you'll have to download it first from the[m
[31m-<a href="http://zlib.net/"><span class="ext">&raquo;</span>&nbsp;zlib site</a>. The check for[m
[31m-<tt>ffi.os</tt> makes sure we pass the right name to[m
[31m-<tt>ffi.load()</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> First, the maximum size of[m
[31m-the compression buffer is obtained by calling the[m
[31m-<tt>zlib.compressBound</tt> function with the length of the[m
[31m-uncompressed string. The next line allocates a byte buffer of this[m
[31m-size. The <tt>[?]</tt> in the type specification indicates a[m
[31m-variable-length array (VLA). The actual number of elements of this[m
[31m-array is given as the 2nd argument to <tt>ffi.new()</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9315;</span> This may look strange at[m
[31m-first, but have a look at the declaration of the <tt>compress2</tt>[m
[31m-function from zlib: the destination length is defined as a pointer![m
[31m-This is because you pass in the maximum buffer size and get back the[m
[31m-actual length that was used.[m
[31m-</p>[m
[31m-<p>[m
[31m-In C you'd pass in the address of a local variable[m
[31m-(<tt>&amp;buflen</tt>). But since there's no address-of operator in[m
[31m-Lua, we'll just pass in a one-element array. Conveniently it can be[m
[31m-initialized with the maximum buffer size in one step. Calling the[m
[31m-actual <tt>zlib.compress2</tt> function is then straightforward.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9316;</span> We want to return the[m
[31m-compressed data as a Lua string, so we'll use <tt>ffi.string()</tt>.[m
[31m-It needs a pointer to the start of the data and the actual length. The[m
[31m-length has been returned in the <tt>buflen</tt> array, so we'll just[m
[31m-get it from there.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Note that since the function returns now, the <tt>buf</tt> and[m
[31m-<tt>buflen</tt> variables will eventually be garbage collected. This[m
[31m-is fine, because <tt>ffi.string()</tt> has copied the contents to a[m
[31m-newly created (interned) Lua string. If you plan to call this function[m
[31m-lots of times, consider reusing the buffers and/or handing back the[m
[31m-results in buffers instead of strings. This will reduce the overhead[m
[31m-for garbage collection and string interning.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9317;</span> The <tt>uncompress</tt>[m
[31m-functions does the exact opposite of the <tt>compress</tt> function.[m
[31m-The compressed data doesn't include the size of the original string,[m
[31m-so this needs to be passed in. Otherwise no surprises here.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9318;</span> The code, that makes use[m
[31m-of the functions we just defined, is just plain Lua code. It doesn't[m
[31m-need to know anything about the LuaJIT FFI &mdash; the convenience[m
[31m-wrapper functions completely hide it.[m
[31m-</p>[m
[31m-<p>[m
[31m-One major advantage of the LuaJIT FFI is that you are now able to[m
[31m-write those wrappers <em>in Lua</em>. And at a fraction of the time it[m
[31m-would cost you to create an extra C&nbsp;module using the Lua/C API.[m
[31m-Many of the simpler C&nbsp;functions can probably be used directly[m
[31m-from your Lua code, without any wrappers.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Side note: the zlib API uses the <tt>long</tt> type for passing[m
[31m-lengths and sizes around. But all those zlib functions actually only[m
[31m-deal with 32&nbsp;bit values. This is an unfortunate choice for a[m
[31m-public API, but may be explained by zlib's history &mdash; we'll just[m
[31m-have to deal with it.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-First, you should know that a <tt>long</tt> is a 64&nbsp;bit type e.g.[m
[31m-on POSIX/x64 systems, but a 32&nbsp;bit type on Windows/x64 and on[m
[31m-32&nbsp;bit systems. Thus a <tt>long</tt> result can be either a plain[m
[31m-Lua number or a boxed 64&nbsp;bit integer cdata object, depending on[m
[31m-the target system.[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Ok, so the <tt>ffi.*</tt> functions generally accept cdata objects[m
[31m-wherever you'd want to use a number. That's why we get a away with[m
[31m-passing <tt>n</tt> to <tt>ffi.string()</tt> above. But other Lua[m
[31m-library functions or modules don't know how to deal with this. So for[m
[31m-maximum portability one needs to use <tt>tonumber()</tt> on returned[m
[31m-<tt>long</tt> results before passing them on. Otherwise the[m
[31m-application might work on some systems, but would fail in a POSIX/x64[m
[31m-environment.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="metatype">Defining Metamethods for a C&nbsp;Type</h2>[m
[31m-<p>[m
[31m-The following code explains how to define metamethods for a C type.[m
[31m-We define a simple point type and add some operations to it:[m
[31m-</p>[m
[31m-<pre class="code mark">[m
[31m-<span class="codemark">&nbsp;[m
[31m-&#9312;[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9313;[m
[31m-[m
[31m-&#9314;[m
[31m-[m
[31m-&#9315;[m
[31m-[m
[31m-[m
[31m-[m
[31m-&#9316;[m
[31m-[m
[31m-&#9317;</span>local ffi = require("ffi")[m
[31m-ffi.cdef[[[m
[31m-<span style="color:#00a000;">typedef struct { double x, y; } point_t;</span>[m
[31m-]][m
[31m-[m
[31m-local point[m
[31m-local mt = {[m
[31m-  __add = function(a, b) return point(a.x+b.x, a.y+b.y) end,[m
[31m-  __len = function(a) return math.sqrt(a.x*a.x + a.y*a.y) end,[m
[31m-  __index = {[m
[31m-    area = function(a) return a.x*a.x + a.y*a.y end,[m
[31m-  },[m
[31m-}[m
[31m-point = ffi.metatype("point_t", mt)[m
[31m-[m
[31m-local a = point(3, 4)[m
[31m-print(a.x, a.y)  --> 3  4[m
[31m-print(#a)        --> 5[m
[31m-print(a:area())  --> 25[m
[31m-local b = a + point(0.5, 8)[m
[31m-print(#b)        --> 12.5[m
[31m-</pre>[m
[31m-<p>[m
[31m-Here's the step-by-step explanation:[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9312;</span> This defines the C&nbsp;type for a[m
[31m-two-dimensional point object.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9313;</span> We have to declare the variable[m
[31m-holding the point constructor first, because it's used inside of a[m
[31m-metamethod.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9314;</span> Let's define an <tt>__add</tt>[m
[31m-metamethod which adds the coordinates of two points and creates a new[m
[31m-point object. For simplicity, this function assumes that both arguments[m
[31m-are points. But it could be any mix of objects, if at least one operand[m
[31m-is of the required type (e.g. adding a point plus a number or vice[m
[31m-versa). Our <tt>__len</tt> metamethod returns the distance of a point to[m
[31m-the origin.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9315;</span> If we run out of operators, we can[m
[31m-define named methods, too. Here the <tt>__index</tt> table defines an[m
[31m-<tt>area</tt> function. For custom indexing needs, one might want to[m
[31m-define <tt>__index</tt> and <tt>__newindex</tt> <em>functions</em> instead.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9316;</span> This associates the metamethods with[m
[31m-our C&nbsp;type. This only needs to be done once. For convenience, a[m
[31m-constructor is returned by[m
[31m-<a href="ext_ffi_api.html#ffi_metatype"><tt>ffi.metatype()</tt></a>.[m
[31m-We're not required to use it, though. The original C&nbsp;type can still[m
[31m-be used e.g. to create an array of points. The metamethods automatically[m
[31m-apply to any and all uses of this type.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note that the association with a metatable is permanent and[m
[31m-<b>the metatable must not be modified afterwards!</b> Ditto for the[m
[31m-<tt>__index</tt> table.[m
[31m-</p>[m
[31m-<p>[m
[31m-<span class="mark">&#9317;</span> Here are some simple usage examples[m
[31m-for the point type and their expected results. The pre-defined[m
[31m-operations (such as <tt>a.x</tt>) can be freely mixed with the newly[m
[31m-defined metamethods. Note that <tt>area</tt> is a method and must be[m
[31m-called with the Lua syntax for methods: <tt>a:area()</tt>, not[m
[31m-<tt>a.area()</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-The C&nbsp;type metamethod mechanism is most useful when used in[m
[31m-conjunction with C&nbsp;libraries that are written in an object-oriented[m
[31m-style. Creators return a pointer to a new instance and methods take an[m
[31m-instance pointer as the first argument. Sometimes you can just point[m
[31m-<tt>__index</tt> to the library namespace and <tt>__gc</tt> to the[m
[31m-destructor and you're done. But often enough you'll want to add[m
[31m-convenience wrappers, e.g. to return actual Lua strings or when[m
[31m-returning multiple values.[m
[31m-</p>[m
[31m-<p>[m
[31m-Some C libraries only declare instance pointers as an opaque[m
[31m-<tt>void&nbsp;*</tt> type. In this case you can use a fake type for all[m
[31m-declarations, e.g. a pointer to a named (incomplete) struct will do:[m
[31m-<tt>typedef struct foo_type *foo_handle</tt>. The C&nbsp;side doesn't[m
[31m-know what you declare with the LuaJIT FFI, but as long as the underlying[m
[31m-types are compatible, everything still works.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="idioms">Translating C&nbsp;Idioms</h2>[m
[31m-<p>[m
[31m-Here's a list of common C&nbsp;idioms and their translation to the[m
[31m-LuaJIT FFI:[m
[31m-</p>[m
[31m-<table class="idiomtable">[m
[31m-<tr class="idiomhead">[m
[31m-<td class="idiomdesc">Idiom</td>[m
[31m-<td class="idiomc">C&nbsp;code</td>[m
[31m-<td class="idiomlua">Lua code</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="idiomdesc">Pointer dereference<br><tt>int *p;</tt></td><td class="idiomc"><tt>x = *p;<br>*p = y;</tt></td><td class="idiomlua"><tt>x = <b>p[0]</b><br><b>p[0]</b> = y</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="idiomdesc">Pointer indexing<br><tt>int i, *p;</tt></td><td class="idiomc"><tt>x = p[i];<br>p[i+1] = y;</tt></td><td class="idiomlua"><tt>x = p[i]<br>p[i+1] = y</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc">Array indexing<br><tt>int i, a[];</tt></td><td class="idiomc"><tt>x = a[i];<br>a[i+1] = y;</tt></td><td class="idiomlua"><tt>x = a[i]<br>a[i+1] = y</tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="idiomdesc"><tt>struct</tt>/<tt>union</tt> dereference<br><tt>struct foo s;</tt></td><td class="idiomc"><tt>x = s.field;<br>s.field = y;</tt></td><td class="idiomlua"><tt>x = s.field<br>s.field = y</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc"><tt>struct</tt>/<tt>union</tt> pointer deref.<br><tt>struct foo *sp;</tt></td><td class="idiomc"><tt>x = sp->field;<br>sp->field = y;</tt></td><td class="idiomlua"><tt>x = <b>s.field</b><br><b>s.field</b> = y</tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="idiomdesc">Pointer arithmetic<br><tt>int i, *p;</tt></td><td class="idiomc"><tt>x = p + i;<br>y = p - i;</tt></td><td class="idiomlua"><tt>x = p + i<br>y = p - i</tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc">Pointer difference<br><tt>int *p1, *p2;</tt></td><td class="idiomc"><tt>x = p1 - p2;</tt></td><td class="idiomlua"><tt>x = p1 - p2</tt></td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="idiomdesc">Array element pointer<br><tt>int i, a[];</tt></td><td class="idiomc"><tt>x = &amp;a[i];</tt></td><td class="idiomlua"><tt>x = <b>a+i</b></tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc">Cast pointer to address<br><tt>int *p;</tt></td><td class="idiomc"><tt>x = (intptr_t)p;</tt></td><td class="idiomlua"><tt>x = <b>tonumber(<br>&nbsp;ffi.cast("intptr_t",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p))</b></tt></td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="idiomdesc">Functions with outargs<br><tt>void foo(int *inoutlen);</tt></td><td class="idiomc"><tt>int len = x;<br>foo(&amp;len);<br>y = len;</tt></td><td class="idiomlua"><tt><b>local len =<br>&nbsp;&nbsp;ffi.new("int[1]", x)<br>foo(len)<br>y = len[0]</b></tt></td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="idiomdesc"><a href="ext_ffi_semantics.html#convert_vararg">Vararg conversions</a><br><tt>int printf(char *fmt, ...);</tt></td><td class="idiomc"><tt>printf("%g", 1.0);<br>printf("%d", 1);<br>&nbsp;</tt></td><td class="idiomlua"><tt>printf("%g", 1);<br>printf("%d",<br>&nbsp;&nbsp;<b>ffi.new("int", 1)</b>)</tt></td></tr>[m
[31m-</table>[m
[31m-[m
[31m-<h2 id="cache">To Cache or Not to Cache</h2>[m
[31m-<p>[m
[31m-It's a common Lua idiom to cache library functions in local variables[m
[31m-or upvalues, e.g.:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local byte, char = string.byte, string.char[m
[31m-local function foo(x)[m
[31m-  return char(byte(x)+1)[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-This replaces several hash-table lookups with a (faster) direct use of[m
[31m-a local or an upvalue. This is less important with LuaJIT, since the[m
[31m-JIT compiler optimizes hash-table lookups a lot and is even able to[m
[31m-hoist most of them out of the inner loops. It can't eliminate[m
[31m-<em>all</em> of them, though, and it saves some typing for often-used[m
[31m-functions. So there's still a place for this, even with LuaJIT.[m
[31m-</p>[m
[31m-<p>[m
[31m-The situation is a bit different with C&nbsp;function calls via the[m
[31m-FFI library. The JIT compiler has special logic to eliminate <em>all[m
[31m-of the lookup overhead</em> for functions resolved from a[m
[31m-<a href="ext_ffi_semantics.html#clib">C&nbsp;library namespace</a>![m
[31m-Thus it's not helpful and actually counter-productive to cache[m
[31m-individual C&nbsp;functions like this:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local <b>funca</b>, <b>funcb</b> = ffi.C.funca, ffi.C.funcb -- <span style="color:#c00000;">Not helpful!</span>[m
[31m-local function foo(x, n)[m
[31m-  for i=1,n do <b>funcb</b>(<b>funca</b>(x, i), 1) end[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-This turns them into indirect calls and generates bigger and slower[m
[31m-machine code. Instead you'll want to cache the namespace itself and[m
[31m-rely on the JIT compiler to eliminate the lookups:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local <b>C</b> = ffi.C          -- <span style="color:#00a000;">Instead use this!</span>[m
[31m-local function foo(x, n)[m
[31m-  for i=1,n do <b>C.funcb</b>(<b>C.funca</b>(x, i), 1) end[m
[31m-end[m
[31m-</pre>[m
[31m-<p>[m
[31m-This generates both shorter and faster code. So <b>don't cache[m
[31m-C&nbsp;functions</b>, but <b>do</b> cache namespaces! Most often the[m
[31m-namespace is already in a local variable at an outer scope, e.g. from[m
[31m-<tt>local&nbsp;lib&nbsp;=&nbsp;ffi.load(...)</tt>. Note that copying[m
[31m-it to a local variable in the function scope is unnecessary.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_jit.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_jit.html[m
[1mdeleted file mode 100644[m
[1mindex 9489c6f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_jit.html[m
[1m+++ /dev/null[m
[36m@@ -1,201 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>jit.* Library</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1><tt>jit.*</tt> Library</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-The functions in this built-in module control the behavior of the JIT[m
[31m-compiler engine. Note that JIT-compilation is fully automatic &mdash;[m
[31m-you probably won't need to use any of the following functions unless[m
[31m-you have special needs.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_onoff"><tt>jit.on()<br>[m
[31m-jit.off()</tt></h3>[m
[31m-<p>[m
[31m-Turns the whole JIT compiler on (default) or off.[m
[31m-</p>[m
[31m-<p>[m
[31m-These functions are typically used with the command line options[m
[31m-<tt>-j on</tt> or <tt>-j off</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_flush"><tt>jit.flush()</tt></h3>[m
[31m-<p>[m
[31m-Flushes the whole cache of compiled code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_onoff_func"><tt>jit.on(func|true [,true|false])<br>[m
[31m-jit.off(func|true [,true|false])<br>[m
[31m-jit.flush(func|true [,true|false])</tt></h3>[m
[31m-<p>[m
[31m-<tt>jit.on</tt> enables JIT compilation for a Lua function (this is[m
[31m-the default).[m
[31m-</p>[m
[31m-<p>[m
[31m-<tt>jit.off</tt> disables JIT compilation for a Lua function and[m
[31m-flushes any already compiled code from the code cache.[m
[31m-</p>[m
[31m-<p>[m
[31m-<tt>jit.flush</tt> flushes the code, but doesn't affect the[m
[31m-enable/disable status.[m
[31m-</p>[m
[31m-<p>[m
[31m-The current function, i.e. the Lua function calling this library[m
[31m-function, can also be specified by passing <tt>true</tt> as the first[m
[31m-argument.[m
[31m-</p>[m
[31m-<p>[m
[31m-If the second argument is <tt>true</tt>, JIT compilation is also[m
[31m-enabled, disabled or flushed recursively for all sub-functions of a[m
[31m-function. With <tt>false</tt> only the sub-functions are affected.[m
[31m-</p>[m
[31m-<p>[m
[31m-The <tt>jit.on</tt> and <tt>jit.off</tt> functions only set a flag[m
[31m-which is checked when the function is about to be compiled. They do[m
[31m-not trigger immediate compilation.[m
[31m-</p>[m
[31m-<p>[m
[31m-Typical usage is <tt>jit.off(true, true)</tt> in the main chunk[m
[31m-of a module to turn off JIT compilation for the whole module for[m
[31m-debugging purposes.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_flush_tr"><tt>jit.flush(tr)</tt></h3>[m
[31m-<p>[m
[31m-Flushes the root trace, specified by its number, and all of its side[m
[31m-traces from the cache. The code for the trace will be retained as long[m
[31m-as there are any other traces which link to it.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_status"><tt>status, ... = jit.status()</tt></h3>[m
[31m-<p>[m
[31m-Returns the current status of the JIT compiler. The first result is[m
[31m-either <tt>true</tt> or <tt>false</tt> if the JIT compiler is turned[m
[31m-on or off. The remaining results are strings for CPU-specific features[m
[31m-and enabled optimizations.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_version"><tt>jit.version</tt></h3>[m
[31m-<p>[m
[31m-Contains the LuaJIT version string.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_version_num"><tt>jit.version_num</tt></h3>[m
[31m-<p>[m
[31m-Contains the version number of the LuaJIT core. Version xx.yy.zz[m
[31m-is represented by the decimal number xxyyzz.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_os"><tt>jit.os</tt></h3>[m
[31m-<p>[m
[31m-Contains the target OS name:[m
[31m-"Windows", "Linux", "OSX", "BSD", "POSIX" or "Other".[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit_arch"><tt>jit.arch</tt></h3>[m
[31m-<p>[m
[31m-Contains the target architecture name:[m
[31m-"x86", "x64", "arm", "ppc", or "mips".[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="jit_opt"><tt>jit.opt.*</tt> &mdash; JIT compiler optimization control</h2>[m
[31m-<p>[m
[31m-This sub-module provides the backend for the <tt>-O</tt> command line[m
[31m-option.[m
[31m-</p>[m
[31m-<p>[m
[31m-You can also use it programmatically, e.g.:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-jit.opt.start(2) -- same as -O2[m
[31m-jit.opt.start("-dce")[m
[31m-jit.opt.start("hotloop=10", "hotexit=2")[m
[31m-</pre>[m
[31m-<p>[m
[31m-Unlike in LuaJIT 1.x, the module is built-in and[m
[31m-<b>optimization is turned on by default!</b>[m
[31m-It's no longer necessary to run <tt>require("jit.opt").start()</tt>,[m
[31m-which was one of the ways to enable optimization.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="jit_util"><tt>jit.util.*</tt> &mdash; JIT compiler introspection</h2>[m
[31m-<p>[m
[31m-This sub-module holds functions to introspect the bytecode, generated[m
[31m-traces, the IR and the generated machine code. The functionality[m
[31m-provided by this module is still in flux and therefore undocumented.[m
[31m-</p>[m
[31m-<p>[m
[31m-The debug modules <tt>-jbc</tt>, <tt>-jv</tt> and <tt>-jdump</tt> make[m
[31m-extensive use of these functions. Please check out their source code,[m
[31m-if you want to know more.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_profiler.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_profiler.html[m
[1mdeleted file mode 100644[m
[1mindex 69ea25d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/ext_profiler.html[m
[1m+++ /dev/null[m
[36m@@ -1,365 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Profiler</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Profiler</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT has an integrated statistical profiler with very low overhead. It[m
[31m-allows sampling the currently executing stack and other parameters in[m
[31m-regular intervals.[m
[31m-</p>[m
[31m-<p>[m
[31m-The integrated profiler can be accessed from three levels:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>The <a href="#hl_profiler">bundled high-level profiler</a>, invoked by the[m
[31m-<a href="#j_p"><tt>-jp</tt></a> command line option.</li>[m
[31m-<li>A <a href="#ll_lua_api">low-level Lua API</a> to control the profiler.</li>[m
[31m-<li>A <a href="#ll_c_api">low-level C API</a> to control the profiler.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="hl_profiler">High-Level Profiler</h2>[m
[31m-<p>[m
[31m-The bundled high-level profiler offers basic profiling functionality. It[m
[31m-generates simple textual summaries or source code annotations. It can be[m
[31m-accessed with the <a href="#j_p"><tt>-jp</tt></a> command line option[m
[31m-or from Lua code by loading the underlying <tt>jit.p</tt> module.[m
[31m-</p>[m
[31m-<p>[m
[31m-To cut to the chase &mdash; run this to get a CPU usage profile by[m
[31m-function name:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-luajit -jp myapp.lua[m
[31m-</pre>[m
[31m-<p>[m
[31m-It's <em>not</em> a stated goal of the bundled profiler to add every[m
[31m-possible option or to cater for special profiling needs. The low-level[m
[31m-profiler APIs are documented below. They may be used by third-party[m
[31m-authors to implement advanced functionality, e.g. IDE integration or[m
[31m-graphical profilers.[m
[31m-</p>[m
[31m-<p>[m
[31m-Note: Sampling works for both interpreted and JIT-compiled code. The[m
[31m-results for JIT-compiled code may sometimes be surprising. LuaJIT[m
[31m-heavily optimizes and inlines Lua code &mdash; there's no simple[m
[31m-one-to-one correspondence between source code lines and the sampled[m
[31m-machine code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="j_p"><tt>-jp=[options[,output]]</tt></h3>[m
[31m-<p>[m
[31m-The <tt>-jp</tt> command line option starts the high-level profiler.[m
[31m-When the application run by the command line terminates, the profiler[m
[31m-stops and writes the results to <tt>stdout</tt> or to the specified[m
[31m-<tt>output</tt> file.[m
[31m-</p>[m
[31m-<p>[m
[31m-The <tt>options</tt> argument specifies how the profiling is to be[m
[31m-performed:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>f</tt> &mdash; Stack dump: function name, otherwise module:line.[m
[31m-This is the default mode.</li>[m
[31m-<li><tt>F</tt> &mdash; Stack dump: ditto, but dump module:name.</li>[m
[31m-<li><tt>l</tt> &mdash; Stack dump: module:line.</li>[m
[31m-<li><tt>&lt;number&gt;</tt> &mdash; stack dump depth (callee &larr;[m
[31m-caller). Default: 1.</li>[m
[31m-<li><tt>-&lt;number&gt;</tt> &mdash; Inverse stack dump depth (caller[m
[31m-&rarr; callee).</li>[m
[31m-<li><tt>s</tt> &mdash; Split stack dump after first stack level. Implies[m
[31m-depth&nbsp;&ge;&nbsp;2 or depth&nbsp;&le;&nbsp;-2.</li>[m
[31m-<li><tt>p</tt> &mdash; Show full path for module names.</li>[m
[31m-<li><tt>v</tt> &mdash; Show VM states.</li>[m
[31m-<li><tt>z</tt> &mdash; Show <a href="#jit_zone">zones</a>.</li>[m
[31m-<li><tt>r</tt> &mdash; Show raw sample counts. Default: show percentages.</li>[m
[31m-<li><tt>a</tt> &mdash; Annotate excerpts from source code files.</li>[m
[31m-<li><tt>A</tt> &mdash; Annotate complete source code files.</li>[m
[31m-<li><tt>G</tt> &mdash; Produce raw output suitable for graphical tools.</li>[m
[31m-<li><tt>m&lt;number&gt;</tt> &mdash; Minimum sample percentage to be shown.[m
[31m-Default: 3%.</li>[m
[31m-<li><tt>i&lt;number&gt;</tt> &mdash; Sampling interval in milliseconds.[m
[31m-Default: 10ms.<br>[m
[31m-Note: The actual sampling precision is OS-dependent.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The default output for <tt>-jp</tt> is a list of the most CPU consuming[m
[31m-spots in the application. Increasing the stack dump depth with (say)[m
[31m-<tt>-jp=2</tt> may help to point out the main callers or callees of[m
[31m-hotspots. But sample aggregation is still flat per unique stack dump.[m
[31m-</p>[m
[31m-<p>[m
[31m-To get a two-level view (split view) of callers/callees, use[m
[31m-<tt>-jp=s</tt> or <tt>-jp=-s</tt>. The percentages shown for the second[m
[31m-level are relative to the first level.[m
[31m-</p>[m
[31m-<p>[m
[31m-To see how much time is spent in each line relative to a function, use[m
[31m-<tt>-jp=fl</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-To see how much time is spent in different VM states or[m
[31m-<a href="#jit_zone">zones</a>, use <tt>-jp=v</tt> or <tt>-jp=z</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-Combinations of <tt>v/z</tt> with <tt>f/F/l</tt> produce two-level[m
[31m-views, e.g. <tt>-jp=vf</tt> or <tt>-jp=fv</tt>. This shows the time[m
[31m-spent in a VM state or zone vs. hotspots. This can be used to answer[m
[31m-questions like "Which time consuming functions are only interpreted?" or[m
[31m-"What's the garbage collector overhead for a specific function?".[m
[31m-</p>[m
[31m-<p>[m
[31m-Multiple options can be combined &mdash; but not all combinations make[m
[31m-sense, see above. E.g. <tt>-jp=3si4m1</tt> samples three stack levels[m
[31m-deep in 4ms intervals and shows a split view of the CPU consuming[m
[31m-functions and their callers with a 1% threshold.[m
[31m-</p>[m
[31m-<p>[m
[31m-Source code annotations produced by <tt>-jp=a</tt> or <tt>-jp=A</tt> are[m
[31m-always flat and at the line level. Obviously, the source code files need[m
[31m-to be readable by the profiler script.[m
[31m-</p>[m
[31m-<p>[m
[31m-The high-level profiler can also be started and stopped from Lua code with:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-require("jit.p").start(options, output)[m
[31m-...[m
[31m-require("jit.p").stop()[m
[31m-</pre>[m
[31m-[m
[31m-<h3 id="jit_zone"><tt>jit.zone</tt> &mdash; Zones</h3>[m
[31m-<p>[m
[31m-Zones can be used to provide information about different parts of an[m
[31m-application to the high-level profiler. E.g. a game could make use of an[m
[31m-<tt>"AI"</tt> zone, a <tt>"PHYS"</tt> zone, etc. Zones are hierarchical,[m
[31m-organized as a stack.[m
[31m-</p>[m
[31m-<p>[m
[31m-The <tt>jit.zone</tt> module needs to be loaded explicitly:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local zone = require("jit.zone")[m
[31m-</pre>[m
[31m-<ul>[m
[31m-<li><tt>zone("name")</tt> pushes a named zone to the zone stack.</li>[m
[31m-<li><tt>zone()</tt> pops the current zone from the zone stack and[m
[31m-returns its name.</li>[m
[31m-<li><tt>zone:get()</tt> returns the current zone name or <tt>nil</tt>.</li>[m
[31m-<li><tt>zone:flush()</tt> flushes the zone stack.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-To show the time spent in each zone use <tt>-jp=z</tt>. To show the time[m
[31m-spent relative to hotspots use e.g. <tt>-jp=zf</tt> or <tt>-jp=fz</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="ll_lua_api">Low-level Lua API</h2>[m
[31m-<p>[m
[31m-The <tt>jit.profile</tt> module gives access to the low-level API of the[m
[31m-profiler from Lua code. This module needs to be loaded explicitly:[m
[31m-<pre class="code">[m
[31m-local profile = require("jit.profile")[m
[31m-</pre>[m
[31m-<p>[m
[31m-This module can be used to implement your own higher-level profiler.[m
[31m-A typical profiling run starts the profiler, captures stack dumps in[m
[31m-the profiler callback, adds them to a hash table to aggregate the number[m
[31m-of samples, stops the profiler and then analyzes all of the captured[m
[31m-stack dumps. Other parameters can be sampled in the profiler callback,[m
[31m-too. But it's important not to spend too much time in the callback,[m
[31m-since this may skew the statistics.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="profile_start"><tt>profile.start(mode, cb)</tt>[m
[31m-&mdash; Start profiler</h3>[m
[31m-<p>[m
[31m-This function starts the profiler. The <tt>mode</tt> argument is a[m
[31m-string holding options:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>f</tt> &mdash; Profile with precision down to the function level.</li>[m
[31m-<li><tt>l</tt> &mdash; Profile with precision down to the line level.</li>[m
[31m-<li><tt>i&lt;number&gt;</tt> &mdash; Sampling interval in milliseconds (default[m
[31m-10ms).</br>[m
[31m-Note: The actual sampling precision is OS-dependent.[m
[31m-</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The <tt>cb</tt> argument is a callback function which is called with[m
[31m-three arguments: <tt>(thread, samples, vmstate)</tt>. The callback is[m
[31m-called on a separate coroutine, the <tt>thread</tt> argument is the[m
[31m-state that holds the stack to sample for profiling. Note: do[m
[31m-<em>not</em> modify the stack of that state or call functions on it.[m
[31m-</p>[m
[31m-<p>[m
[31m-<tt>samples</tt> gives the number of accumulated samples since the last[m
[31m-callback (usually 1).[m
[31m-</p>[m
[31m-<p>[m
[31m-<tt>vmstate</tt> holds the VM state at the time the profiling timer[m
[31m-triggered. This may or may not correspond to the state of the VM when[m
[31m-the profiling callback is called. The state is either <tt>'N'</tt>[m
[31m-native (compiled) code, <tt>'I'</tt> interpreted code, <tt>'C'</tt>[m
[31m-C&nbsp;code, <tt>'G'</tt> the garbage collector, or <tt>'J'</tt> the JIT[m
[31m-compiler.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="profile_stop"><tt>profile.stop()</tt>[m
[31m-&mdash; Stop profiler</h3>[m
[31m-<p>[m
[31m-This function stops the profiler.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="profile_dump"><tt>dump = profile.dumpstack([thread,] fmt, depth)</tt>[m
[31m-&mdash; Dump stack </h3>[m
[31m-<p>[m
[31m-This function allows taking stack dumps in an efficient manner. It[m
[31m-returns a string with a stack dump for the <tt>thread</tt> (coroutine),[m
[31m-formatted according to the <tt>fmt</tt> argument:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>p</tt> &mdash; Preserve the full path for module names. Otherwise[m
[31m-only the file name is used.</li>[m
[31m-<li><tt>f</tt> &mdash; Dump the function name if it can be derived. Otherwise[m
[31m-use module:line.</li>[m
[31m-<li><tt>F</tt> &mdash; Ditto, but dump module:name.</li>[m
[31m-<li><tt>l</tt> &mdash; Dump module:line.</li>[m
[31m-<li><tt>Z</tt> &mdash; Zap the following characters for the last dumped[m
[31m-frame.</li>[m
[31m-<li>All other characters are added verbatim to the output string.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The <tt>depth</tt> argument gives the number of frames to dump, starting[m
[31m-at the topmost frame of the thread. A negative number dumps the frames in[m
[31m-inverse order.[m
[31m-</p>[m
[31m-<p>[m
[31m-The first example prints a list of the current module names and line[m
[31m-numbers of up to 10 frames in separate lines. The second example prints[m
[31m-semicolon-separated function names for all frames (up to 100) in inverse[m
[31m-order:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-print(profile.dumpstack(thread, "l\n", 10))[m
[31m-print(profile.dumpstack(thread, "lZ;", -100))[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="ll_c_api">Low-level C API</h2>[m
[31m-<p>[m
[31m-The profiler can be controlled directly from C&nbsp;code, e.g. for[m
[31m-use by IDEs. The declarations are in <tt>"luajit.h"</tt> (see[m
[31m-<a href="ext_c_api.html">Lua/C API</a> extensions).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="luaJIT_profile_start"><tt>luaJIT_profile_start(L, mode, cb, data)</tt>[m
[31m-&mdash; Start profiler</h3>[m
[31m-<p>[m
[31m-This function starts the profiler. <a href="#profile_start">See[m
[31m-above</a> for a description of the <tt>mode</tt> argument.[m
[31m-</p>[m
[31m-<p>[m
[31m-The <tt>cb</tt> argument is a callback function with the following[m
[31m-declaration:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-typedef void (*luaJIT_profile_callback)(void *data, lua_State *L,[m
[31m-                                        int samples, int vmstate);[m
[31m-</pre>[m
[31m-<p>[m
[31m-<tt>data</tt> is available for use by the callback. <tt>L</tt> is the[m
[31m-state that holds the stack to sample for profiling. Note: do[m
[31m-<em>not</em> modify this stack or call functions on this stack &mdash;[m
[31m-use a separate coroutine for this purpose. <a href="#profile_start">See[m
[31m-above</a> for a description of <tt>samples</tt> and <tt>vmstate</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="luaJIT_profile_stop"><tt>luaJIT_profile_stop(L)</tt>[m
[31m-&mdash; Stop profiler</h3>[m
[31m-<p>[m
[31m-This function stops the profiler.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="luaJIT_profile_dumpstack"><tt>p = luaJIT_profile_dumpstack(L, fmt, depth, len)</tt>[m
[31m-&mdash; Dump stack </h3>[m
[31m-<p>[m
[31m-This function allows taking stack dumps in an efficient manner.[m
[31m-<a href="#profile_dump">See above</a> for a description of <tt>fmt</tt>[m
[31m-and <tt>depth</tt>.[m
[31m-</p>[m
[31m-<p>[m
[31m-This function returns a <tt>const&nbsp;char&nbsp;*</tt> pointing to a[m
[31m-private string buffer of the profiler. The <tt>int&nbsp;*len</tt>[m
[31m-argument returns the length of the output string. The buffer is[m
[31m-overwritten on the next call and deallocated when the profiler stops.[m
[31m-You either need to consume the content immediately or copy it for later[m
[31m-use.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/extensions.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/extensions.html[m
[1mdeleted file mode 100644[m
[1mindex 7f712a6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/extensions.html[m
[1m+++ /dev/null[m
[36m@@ -1,455 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Extensions</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.exc {[m
[31m-  line-height: 1.2;[m
[31m-}[m
[31m-tr.exchead td {[m
[31m-  font-weight: bold;[m
[31m-}[m
[31m-td.excplatform {[m
[31m-  width: 48%;[m
[31m-}[m
[31m-td.exccompiler {[m
[31m-  width: 29%;[m
[31m-}[m
[31m-td.excinterop {[m
[31m-  width: 23%;[m
[31m-}[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Extensions</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a class="current" href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT is fully upwards-compatible with Lua 5.1. It supports all[m
[31m-<a href="http://www.lua.org/manual/5.1/manual.html#5"><span class="ext">&raquo;</span>&nbsp;standard Lua[m
[31m-library functions</a> and the full set of[m
[31m-<a href="http://www.lua.org/manual/5.1/manual.html#3"><span class="ext">&raquo;</span>&nbsp;Lua/C API[m
[31m-functions</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT is also fully ABI-compatible to Lua 5.1 at the linker/dynamic[m
[31m-loader level. This means you can compile a C&nbsp;module against the[m
[31m-standard Lua headers and load the same shared library from either Lua[m
[31m-or LuaJIT.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT extends the standard Lua VM with new functionality and adds[m
[31m-several extension modules. Please note this page is only about[m
[31m-<em>functional</em> enhancements and not about performance enhancements,[m
[31m-such as the optimized VM, the faster interpreter or the JIT compiler.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="modules">Extensions Modules</h2>[m
[31m-<p>[m
[31m-LuaJIT comes with several built-in extension modules:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="bit"><tt>bit.*</tt> &mdash; Bitwise operations</h3>[m
[31m-<p>[m
[31m-LuaJIT supports all bitwise operations as defined by[m
[31m-<a href="http://bitop.luajit.org"><span class="ext">&raquo;</span>&nbsp;Lua BitOp</a>:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-bit.tobit  bit.tohex  bit.bnot    bit.band bit.bor  bit.bxor[m
[31m-bit.lshift bit.rshift bit.arshift bit.rol  bit.ror  bit.bswap[m
[31m-</pre>[m
[31m-<p>[m
[31m-This module is a LuaJIT built-in &mdash; you don't need to download or[m
[31m-install Lua BitOp. The Lua BitOp site has full documentation for all[m
[31m-<a href="http://bitop.luajit.org/api.html"><span class="ext">&raquo;</span>&nbsp;Lua BitOp API functions</a>.[m
[31m-The FFI adds support for[m
[31m-<a href="ext_ffi_semantics.html#cdata_arith">64&nbsp;bit bitwise operations</a>,[m
[31m-using the same API functions.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please make sure to <tt>require</tt> the module before using any of[m
[31m-its functions:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-local bit = require("bit")[m
[31m-</pre>[m
[31m-<p>[m
[31m-An already installed Lua BitOp module is ignored by LuaJIT.[m
[31m-This way you can use bit operations from both Lua and LuaJIT on a[m
[31m-shared installation.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="ffi"><tt>ffi.*</tt> &mdash; FFI library</h3>[m
[31m-<p>[m
[31m-The <a href="ext_ffi.html">FFI library</a> allows calling external[m
[31m-C&nbsp;functions and the use of C&nbsp;data structures from pure Lua[m
[31m-code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="jit"><tt>jit.*</tt> &mdash; JIT compiler control</h3>[m
[31m-<p>[m
[31m-The functions in this module[m
[31m-<a href="ext_jit.html">control the behavior of the JIT compiler engine</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="c_api">C API extensions</h3>[m
[31m-<p>[m
[31m-LuaJIT adds some[m
[31m-<a href="ext_c_api.html">extra functions to the Lua/C API</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="profiler">Profiler</h3>[m
[31m-<p>[m
[31m-LuaJIT has an <a href="ext_profiler.html">integrated profiler</a>.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="library">Enhanced Standard Library Functions</h2>[m
[31m-[m
[31m-<h3 id="xpcall"><tt>xpcall(f, err [,args...])</tt> passes arguments</h3>[m
[31m-<p>[m
[31m-Unlike the standard implementation in Lua 5.1, <tt>xpcall()</tt>[m
[31m-passes any arguments after the error function to the function[m
[31m-which is called in a protected context.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="load"><tt>loadfile()</tt> etc. handle UTF-8 source code</h3>[m
[31m-<p>[m
[31m-Non-ASCII characters are handled transparently by the Lua source code parser.[m
[31m-This allows the use of UTF-8 characters in identifiers and strings.[m
[31m-A UTF-8 BOM is skipped at the start of the source code.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="tostring"><tt>tostring()</tt> etc. canonicalize NaN and &plusmn;Inf</h3>[m
[31m-<p>[m
[31m-All number-to-string conversions consistently convert non-finite numbers[m
[31m-to the same strings on all platforms. NaN results in <tt>"nan"</tt>,[m
[31m-positive infinity results in <tt>"inf"</tt> and negative infinity results[m
[31m-in <tt>"-inf"</tt>.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="tonumber"><tt>tonumber()</tt> etc. use builtin string to number conversion</h3>[m
[31m-<p>[m
[31m-All string-to-number conversions consistently convert integer and[m
[31m-floating-point inputs in decimal, hexadecimal and binary on all platforms.[m
[31m-<tt>strtod()</tt> is <em>not</em> used anymore, which avoids numerous[m
[31m-problems with poor C library implementations. The builtin conversion[m
[31m-function provides full precision according to the IEEE-754 standard, it[m
[31m-works independently of the current locale and it supports hex floating-point[m
[31m-numbers (e.g. <tt>0x1.5p-3</tt>).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="string_dump"><tt>string.dump(f [,strip])</tt> generates portable bytecode</h3>[m
[31m-<p>[m
[31m-An extra argument has been added to <tt>string.dump()</tt>. If set to[m
[31m-<tt>true</tt>, 'stripped' bytecode without debug information is[m
[31m-generated. This speeds up later bytecode loading and reduces memory[m
[31m-usage. See also the[m
[31m-<a href="running.html#opt_b"><tt>-b</tt> command line option</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-The generated bytecode is portable and can be loaded on any architecture[m
[31m-that LuaJIT supports, independent of word size or endianess. However the[m
[31m-bytecode compatibility versions must match. Bytecode stays compatible[m
[31m-for dot releases (x.y.0 &rarr; x.y.1), but may change with major or[m
[31m-minor releases (2.0 &rarr; 2.1) or between any beta release. Foreign[m
[31m-bytecode (e.g. from Lua 5.1) is incompatible and cannot be loaded.[m
[31m-</p>[m
[31m-<p>[m
[31m-Note: <tt>LJ_GC64</tt> mode requires a different frame layout, which implies[m
[31m-a different, incompatible bytecode format for ports that use this mode (e.g.[m
[31m-ARM64). This may be rectified in the future.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="table_new"><tt>table.new(narray, nhash)</tt> allocates a pre-sized table</h3>[m
[31m-<p>[m
[31m-An extra library function <tt>table.new()</tt> can be made available via[m
[31m-<tt>require("table.new")</tt>. This creates a pre-sized table, just like[m
[31m-the C API equivalent <tt>lua_createtable()</tt>. This is useful for big[m
[31m-tables if the final table size is known and automatic table resizing is[m
[31m-too expensive.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="table_clear"><tt>table.clear(tab)</tt> clears a table</h3>[m
[31m-<p>[m
[31m-An extra library function <tt>table.clear()</tt> can be made available[m
[31m-via <tt>require("table.clear")</tt>. This clears all keys and values[m
[31m-from a table, but preserves the allocated array/hash sizes. This is[m
[31m-useful when a table, which is linked from multiple places, needs to be[m
[31m-cleared and/or when recycling a table for use by the same context. This[m
[31m-avoids managing backlinks, saves an allocation and the overhead of[m
[31m-incremental array/hash part growth.[m
[31m-</p>[m
[31m-<p>[m
[31m-Please note this function is meant for very specific situations. In most[m
[31m-cases it's better to replace the (usually single) link with a new table[m
[31m-and let the GC do its work.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="math_random">Enhanced PRNG for <tt>math.random()</tt></h3>[m
[31m-<p>[m
[31m-LuaJIT uses a Tausworthe PRNG with period 2^223 to implement[m
[31m-<tt>math.random()</tt> and <tt>math.randomseed()</tt>. The quality of[m
[31m-the PRNG results is much superior compared to the standard Lua[m
[31m-implementation which uses the platform-specific ANSI rand().[m
[31m-</p>[m
[31m-<p>[m
[31m-The PRNG generates the same sequences from the same seeds on all[m
[31m-platforms and makes use of all bits in the seed argument.[m
[31m-<tt>math.random()</tt> without arguments generates 52 pseudo-random bits[m
[31m-for every call. The result is uniformly distributed between 0.0 and 1.0.[m
[31m-It's correctly scaled up and rounded for <tt>math.random(n&nbsp;[,m])</tt> to[m
[31m-preserve uniformity.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="io"><tt>io.*</tt> functions handle 64&nbsp;bit file offsets</h3>[m
[31m-<p>[m
[31m-The file I/O functions in the standard <tt>io.*</tt> library handle[m
[31m-64&nbsp;bit file offsets. In particular this means it's possible[m
[31m-to open files larger than 2&nbsp;Gigabytes and to reposition or obtain[m
[31m-the current file position for offsets beyond 2&nbsp;GB[m
[31m-(<tt>fp:seek()</tt> method).[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="debug_meta"><tt>debug.*</tt> functions identify metamethods</h3>[m
[31m-<p>[m
[31m-<tt>debug.getinfo()</tt> and <tt>lua_getinfo()</tt> also return information[m
[31m-about invoked metamethods. The <tt>namewhat</tt> field is set to[m
[31m-<tt>"metamethod"</tt> and the <tt>name</tt> field has the name of[m
[31m-the corresponding metamethod (e.g. <tt>"__index"</tt>).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="resumable">Fully Resumable VM</h2>[m
[31m-<p>[m
[31m-The LuaJIT VM is fully resumable. This means you can yield from a[m
[31m-coroutine even across contexts, where this would not possible with[m
[31m-the standard Lua&nbsp;5.1 VM: e.g. you can yield across <tt>pcall()</tt>[m
[31m-and <tt>xpcall()</tt>, across iterators and across metamethods.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="lua52">Extensions from Lua 5.2</h2>[m
[31m-<p>[m
[31m-LuaJIT supports some language and library extensions from Lua&nbsp;5.2.[m
[31m-Features that are unlikely to break existing code are unconditionally[m
[31m-enabled:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>goto</tt> and <tt>::labels::</tt>.</li>[m
[31m-<li>Hex escapes <tt>'\x3F'</tt> and <tt>'\*'</tt> escape in strings.</li>[m
[31m-<li><tt>load(string|reader [, chunkname [,mode [,env]]])</tt>.</li>[m
[31m-<li><tt>loadstring()</tt> is an alias for <tt>load()</tt>.</li>[m
[31m-<li><tt>loadfile(filename [,mode [,env]])</tt>.</li>[m
[31m-<li><tt>math.log(x [,base])</tt>.[m
[31m-<li><tt>string.rep(s, n [,sep])</tt>.[m
[31m-<li><tt>string.format()</tt>: <tt>%q</tt> reversible.[m
[31m-<tt>%s</tt> checks <tt>__tostring</tt>.[m
[31m-<tt>%a</tt> and <tt>"%A</tt> added.</li>[m
[31m-<li>String matching pattern <tt>%g</tt> added.</li>[m
[31m-<li><tt>io.read("*L")</tt>.</li>[m
[31m-<li><tt>io.lines()</tt> and <tt>file:lines()</tt> process[m
[31m-<tt>io.read()</tt> options.</li>[m
[31m-<li><tt>os.exit(status|true|false [,close])</tt>.</li>[m
[31m-<li><tt>package.searchpath(name, path [, sep [, rep]])</tt>.</li>[m
[31m-<li><tt>package.loadlib(name, "*")</tt>.</li>[m
[31m-<li><tt>debug.getinfo()</tt> returns <tt>nparams</tt> and <tt>isvararg</tt>[m
[31m-for option <tt>"u"</tt>.</li>[m
[31m-<li><tt>debug.getlocal()</tt> accepts function instead of level.</li>[m
[31m-<li><tt>debug.getlocal()</tt> and <tt>debug.setlocal()</tt> accept negative[m
[31m-indexes for varargs.</li>[m
[31m-<li><tt>debug.getupvalue()</tt> and <tt>debug.setupvalue()</tt> handle[m
[31m-C&nbsp;functions.</li>[m
[31m-<li><tt>debug.upvalueid()</tt> and <tt>debug.upvaluejoin()</tt>.</li>[m
[31m-<li>Command line option <tt>-E</tt>.</li>[m
[31m-<li>Command line checks <tt>__tostring</tt> for errors.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-Other features are only enabled, if LuaJIT is built with[m
[31m-<tt>-DLUAJIT_ENABLE_LUA52COMPAT</tt>:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>goto</tt> is a keyword and not a valid variable name anymore.</li>[m
[31m-<li><tt>break</tt> can be placed anywhere. Empty statements (<tt>;;</tt>)[m
[31m-are allowed.</li>[m
[31m-<li><tt>__lt</tt>, <tt>__le</tt> are invoked for mixed types.</li>[m
[31m-<li><tt>__len</tt> for tables. <tt>rawlen()</tt> library function.</li>[m
[31m-<li><tt>pairs()</tt> and <tt>ipairs()</tt> check for <tt>__pairs</tt> and[m
[31m-<tt>__ipairs</tt>.</li>[m
[31m-<li><tt>coroutine.running()</tt> returns two results.</li>[m
[31m-<li><tt>table.pack()</tt> and <tt>table.unpack()</tt>[m
[31m-(same as <tt>unpack()</tt>).</li>[m
[31m-<li><tt>io.write()</tt> and <tt>file:write()</tt> return file handle[m
[31m-instead of <tt>true</tt>.</li>[m
[31m-<li><tt>os.execute()</tt> and <tt>pipe:close()</tt> return detailed[m
[31m-exit status.</li>[m
[31m-<li><tt>debug.setmetatable()</tt> returns object.</li>[m
[31m-<li><tt>debug.getuservalue()</tt> and <tt>debug.setuservalue()</tt>.</li>[m
[31m-<li>Remove <tt>math.mod()</tt>, <tt>string.gfind()</tt>.[m
[31m-</ul>[m
[31m-<p>[m
[31m-Note: this provides only partial compatibility with Lua 5.2 at the[m
[31m-language and Lua library level. LuaJIT is API+ABI-compatible with[m
[31m-Lua&nbsp;5.1, which prevents implementing features that would otherwise[m
[31m-break the Lua/C API and ABI (e.g. <tt>_ENV</tt>).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="lua53">Extensions from Lua 5.3</h2>[m
[31m-<p>[m
[31m-LuaJIT supports some extensions from Lua&nbsp;5.3:[m
[31m-<ul>[m
[31m-<li>Unicode escape <tt>'\u{XX...}'</tt> embeds the UTF-8 encoding in string literals.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="exceptions">C++ Exception Interoperability</h2>[m
[31m-<p>[m
[31m-LuaJIT has built-in support for interoperating with C++&nbsp;exceptions.[m
[31m-The available range of features depends on the target platform and[m
[31m-the toolchain used to compile LuaJIT:[m
[31m-</p>[m
[31m-<table class="exc">[m
[31m-<tr class="exchead">[m
[31m-<td class="excplatform">Platform</td>[m
[31m-<td class="exccompiler">Compiler</td>[m
[31m-<td class="excinterop">Interoperability</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="excplatform">POSIX/x64, DWARF2 unwinding</td>[m
[31m-<td class="exccompiler">GCC 4.3+</td>[m
[31m-<td class="excinterop"><b style="color: #00a000;">Full</b></td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="excplatform">Other platforms, DWARF2 unwinding</td>[m
[31m-<td class="exccompiler">GCC</td>[m
[31m-<td class="excinterop"><b style="color: #c06000;">Limited</b></td>[m
[31m-</tr>[m
[31m-<tr class="odd">[m
[31m-<td class="excplatform">Windows/x64</td>[m
[31m-<td class="exccompiler">MSVC or WinSDK</td>[m
[31m-<td class="excinterop"><b style="color: #00a000;">Full</b></td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="excplatform">Windows/x86</td>[m
[31m-<td class="exccompiler">Any</td>[m
[31m-<td class="excinterop"><b style="color: #a00000;">No</b></td>[m
[31m-</tr>[m
[31m-<tr class="odd">[m
[31m-<td class="excplatform">Other platforms</td>[m
[31m-<td class="exccompiler">Other compilers</td>[m
[31m-<td class="excinterop"><b style="color: #a00000;">No</b></td>[m
[31m-</tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-<b style="color: #00a000;">Full interoperability</b> means:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>C++&nbsp;exceptions can be caught on the Lua side with <tt>pcall()</tt>,[m
[31m-<tt>lua_pcall()</tt> etc.</li>[m
[31m-<li>C++&nbsp;exceptions will be converted to the generic Lua error[m
[31m-<tt>"C++&nbsp;exception"</tt>, unless you use the[m
[31m-<a href="ext_c_api.html#mode_wrapcfunc">C&nbsp;call wrapper</a> feature.</li>[m
[31m-<li>It's safe to throw C++&nbsp;exceptions across non-protected Lua frames[m
[31m-on the C&nbsp;stack. The contents of the C++&nbsp;exception object[m
[31m-pass through unmodified.</li>[m
[31m-<li>Lua errors can be caught on the C++ side with <tt>catch(...)</tt>.[m
[31m-The corresponding Lua error message can be retrieved from the Lua stack.</li>[m
[31m-<li>Throwing Lua errors across C++ frames is safe. C++ destructors[m
[31m-will be called.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-<b style="color: #c06000;">Limited interoperability</b> means:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>C++&nbsp;exceptions can be caught on the Lua side with <tt>pcall()</tt>,[m
[31m-<tt>lua_pcall()</tt> etc.</li>[m
[31m-<li>C++&nbsp;exceptions will be converted to the generic Lua error[m
[31m-<tt>"C++&nbsp;exception"</tt>, unless you use the[m
[31m-<a href="ext_c_api.html#mode_wrapcfunc">C&nbsp;call wrapper</a> feature.</li>[m
[31m-<li>C++&nbsp;exceptions will be caught by non-protected Lua frames and[m
[31m-are rethrown as a generic Lua error. The C++&nbsp;exception object will[m
[31m-be destroyed.</li>[m
[31m-<li>Lua errors <b>cannot</b> be caught on the C++ side.</li>[m
[31m-<li>Throwing Lua errors across C++ frames will <b>not</b> call[m
[31m-C++ destructors.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-<b style="color: #a00000;">No interoperability</b> means:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>It's <b>not</b> safe to throw C++&nbsp;exceptions across Lua frames.</li>[m
[31m-<li>C++&nbsp;exceptions <b>cannot</b> be caught on the Lua side.</li>[m
[31m-<li>Lua errors <b>cannot</b> be caught on the C++ side.</li>[m
[31m-<li>Throwing Lua errors across C++ frames will <b>not</b> call[m
[31m-C++ destructors.</li>[m
[31m-<li>Additionally, on Windows/x86 with SEH-based C++&nbsp;exceptions:[m
[31m-it's <b>not</b> safe to throw a Lua error across any frames containing[m
[31m-a C++ function with any try/catch construct or using variables with[m
[31m-(implicit) destructors. This also applies to any functions which may be[m
[31m-inlined in such a function. It doesn't matter whether <tt>lua_error()</tt>[m
[31m-is called inside or outside of a try/catch or whether any object actually[m
[31m-needs to be destroyed: the SEH chain is corrupted and this will eventually[m
[31m-lead to the termination of the process.</li>[m
[31m-</ul>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/faq.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/faq.html[m
[1mdeleted file mode 100644[m
[1mindex 605fdd0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/faq.html[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Frequently Asked Questions (FAQ)</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-dd { margin-left: 1.5em; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Frequently Asked Questions (FAQ)</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a class="current" href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<dl>[m
[31m-<dt>Q: Where can I learn more about LuaJIT and Lua?</dt>[m
[31m-<dd>[m
[31m-<ul style="padding: 0;">[m
[31m-<li>The <a href="http://luajit.org/list.html"><span class="ext">&raquo;</span>&nbsp;LuaJIT mailing list</a> focuses on topics[m
[31m-related to LuaJIT.</li>[m
[31m-<li>The <a href="http://wiki.luajit.org/"><span class="ext">&raquo;</span>&nbsp;LuaJIT wiki</a> gathers community[m
[31m-resources about LuaJIT.</li>[m
[31m-<li>News about Lua itself can be found at the[m
[31m-<a href="http://www.lua.org/lua-l.html"><span class="ext">&raquo;</span>&nbsp;Lua mailing list</a>.[m
[31m-The mailing list archives are worth checking out for older postings[m
[31m-about LuaJIT.</li>[m
[31m-<li>The <a href="http://lua.org"><span class="ext">&raquo;</span>&nbsp;main Lua.org site</a> has complete[m
[31m-<a href="http://www.lua.org/docs.html"><span class="ext">&raquo;</span>&nbsp;documentation</a> of the language[m
[31m-and links to books and papers about Lua.</li>[m
[31m-<li>The community-managed <a href="http://lua-users.org/wiki/"><span class="ext">&raquo;</span>&nbsp;Lua Wiki</a>[m
[31m-has information about diverse topics.</li>[m
[31m-</ul>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Where can I learn more about the compiler technology used by LuaJIT?</dt>[m
[31m-<dd>[m
[31m-I'm planning to write more documentation about the internals of LuaJIT.[m
[31m-In the meantime, please use the following Google Scholar searches[m
[31m-to find relevant papers:<br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=Trace+Compiler"><span class="ext">&raquo;</span>&nbsp;Trace Compiler</a><br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=JIT+Compiler"><span class="ext">&raquo;</span>&nbsp;JIT Compiler</a><br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=Dynamic+Language+Optimizations"><span class="ext">&raquo;</span>&nbsp;Dynamic Language Optimizations</a><br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=SSA+Form"><span class="ext">&raquo;</span>&nbsp;SSA Form</a><br>[m
[31m-Search for: <a href="http://scholar.google.com/scholar?q=Linear+Scan+Register+Allocation"><span class="ext">&raquo;</span>&nbsp;Linear Scan Register Allocation</a><br>[m
[31m-Here is a list of the <a href="http://article.gmane.org/gmane.comp.lang.lua.general/58908"><span class="ext">&raquo;</span>&nbsp;innovative features in LuaJIT</a>.<br>[m
[31m-And, you know, reading the source is of course the only way to enlightenment. :-)[m
[31m-</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Why do I get this error: "attempt to index global 'arg' (a nil value)"?<br>[m
[31m-Q: My vararg functions fail after switching to LuaJIT!</dt>[m
[31m-<dd>LuaJIT is compatible to the Lua 5.1 language standard. It doesn't[m
[31m-support the implicit <tt>arg</tt> parameter for old-style vararg[m
[31m-functions from Lua 5.0.<br>Please convert your code to the[m
[31m-<a href="http://www.lua.org/manual/5.1/manual.html#2.5.9"><span class="ext">&raquo;</span>&nbsp;Lua 5.1[m
[31m-vararg syntax</a>.</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Why do I get this error: "bad FPU precision"?<br>[m
[31m-<dt>Q: I get weird behavior after initializing Direct3D.<br>[m
[31m-<dt>Q: Some FPU operations crash after I load a Delphi DLL.<br>[m
[31m-</dt>[m
[31m-<dd>[m
[31m-[m
[31m-DirectX/Direct3D (up to version 9) sets the x87 FPU to single-precision[m
[31m-mode by default. This violates the Windows ABI and interferes with the[m
[31m-operation of many programs &mdash; LuaJIT is affected, too. Please make[m
[31m-sure you always use the <tt>D3DCREATE_FPU_PRESERVE</tt> flag when[m
[31m-initializing Direct3D.<br>[m
[31m-[m
[31m-Direct3D version 10 or higher do not show this behavior anymore.[m
[31m-Consider testing your application with older versions, too.<br>[m
[31m-[m
[31m-Similarly, the Borland/Delphi runtime modifies the FPU control word and[m
[31m-enables FP exceptions. Of course this violates the Windows ABI, too.[m
[31m-Please check the Delphi docs for the Set8087CW method.[m
[31m-[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Sometimes Ctrl-C fails to stop my Lua program. Why?</dt>[m
[31m-<dd>The interrupt signal handler sets a Lua debug hook. But this is[m
[31m-currently ignored by compiled code (this will eventually be fixed). If[m
[31m-your program is running in a tight loop and never falls back to the[m
[31m-interpreter, the debug hook never runs and can't throw the[m
[31m-"interrupted!" error.<br> In the meantime you have to press Ctrl-C[m
[31m-twice to get stop your program. That's similar to when it's stuck[m
[31m-running inside a C function under the Lua interpreter.</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Why doesn't my favorite power-patch for Lua apply against LuaJIT?</dt>[m
[31m-<dd>Because it's a completely redesigned VM and has very little code[m
[31m-in common with Lua anymore. Also, if the patch introduces changes to[m
[31m-the Lua semantics, these would need to be reflected everywhere in the[m
[31m-VM, from the interpreter up to all stages of the compiler.<br> Please[m
[31m-use only standard Lua language constructs. For many common needs you[m
[31m-can use source transformations or use wrapper or proxy functions.[m
[31m-The compiler will happily optimize away such indirections.</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: Lua runs everywhere. Why doesn't LuaJIT support my CPU?</dt>[m
[31m-<dd>Because it's a compiler &mdash; it needs to generate native[m
[31m-machine code. This means the code generator must be ported to each[m
[31m-architecture. And the fast interpreter is written in assembler and[m
[31m-must be ported, too. This is quite an undertaking.<br>[m
[31m-The <a href="install.html">install documentation</a> shows the supported[m
[31m-architectures. Other architectures will follow based on sufficient user[m
[31m-demand and/or sponsoring.</dd>[m
[31m-</dl>[m
[31m-[m
[31m-<dl>[m
[31m-<dt>Q: When will feature X be added? When will the next version be released?</dt>[m
[31m-<dd>When it's ready.<br>[m
[31m-C'mon, it's open source &mdash; I'm doing it on my own time and you're[m
[31m-getting it for free. You can either contribute a patch or sponsor[m
[31m-the development of certain features, if they are important to you.[m
[31m-</dd>[m
[31m-</dl>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/img/contact.png b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/img/contact.png[m
[1mdeleted file mode 100644[m
[1mindex 9c73dc5..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/img/contact.png and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/install.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/install.html[m
[1mdeleted file mode 100644[m
[1mindex 9921258..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/install.html[m
[1m+++ /dev/null[m
[36m@@ -1,666 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Installation</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.compat {[m
[31m-  line-height: 1.2;[m
[31m-  font-size: 80%;[m
[31m-}[m
[31m-table.compat td {[m
[31m-  border: 1px solid #bfcfff;[m
[31m-  height: 2.5em;[m
[31m-}[m
[31m-table.compat tr.compathead td {[m
[31m-  font-weight: bold;[m
[31m-  border-bottom: 2px solid #bfcfff;[m
[31m-}[m
[31m-tr.compathead td.compatos {[m
[31m-  vertical-align: top;[m
[31m-}[m
[31m-table.compat td.compatcpu {[m
[31m-  width: 18%;[m
[31m-  border-right: 2px solid #bfcfff;[m
[31m-}[m
[31m-td.compatos {[m
[31m-  width: 21%;[m
[31m-  vertical-align: middle;[m
[31m-}[m
[31m-td.compatno {[m
[31m-  background-color: #d0d0d0;[m
[31m-}[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Installation</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a class="current" href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT is only distributed as a source package. This page explains[m
[31m-how to build and install LuaJIT with different operating systems[m
[31m-and C&nbsp;compilers.[m
[31m-</p>[m
[31m-<p>[m
[31m-For the impatient (on POSIX systems):[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make &amp;&amp; sudo make install[m
[31m-</pre>[m
[31m-<p>[m
[31m-LuaJIT currently builds out-of-the box on most systems.[m
[31m-Here's the compatibility matrix for the supported combinations of[m
[31m-operating systems, CPUs and compilers:[m
[31m-</p>[m
[31m-<table class="compat">[m
[31m-<tr class="compathead">[m
[31m-<td class="compatcpu">CPU / OS</td>[m
[31m-<td class="compatos"><a href="#posix">Linux</a> or<br><a href="#android">Android</a></td>[m
[31m-<td class="compatos"><a href="#posix">*BSD, Other</a></td>[m
[31m-<td class="compatos"><a href="#posix">OSX 10.4+</a> or<br><a href="#ios">iOS 3.0+</a></td>[m
[31m-<td class="compatos"><a href="#windows">Windows<br>XP/Vista/7</a></td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="compatcpu">x86 (32 bit)</td>[m
[31m-<td class="compatos">GCC 4.2+</td>[m
[31m-<td class="compatos">GCC 4.2+</td>[m
[31m-<td class="compatos">XCode 5.0+<br>Clang</td>[m
[31m-<td class="compatos">MSVC, MSVC/EE<br>WinSDK<br>MinGW, Cygwin</td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="compatcpu">x64 (64 bit)</td>[m
[31m-<td class="compatos">GCC 4.2+</td>[m
[31m-<td class="compatos">ORBIS (<a href="#ps4">PS4</a>)</td>[m
[31m-<td class="compatos">XCode 5.0+<br>Clang</td>[m
[31m-<td class="compatos">MSVC + SDK v7.0<br>WinSDK v7.0<br>Durango (<a href="#xboxone">Xbox One</a>)</td>[m
[31m-</tr>[m
[31m-<tr class="odd">[m
[31m-<td class="compatcpu"><a href="#cross2">ARMv5+<br>ARM9E+</a></td>[m
[31m-<td class="compatos">GCC 4.2+</td>[m
[31m-<td class="compatos">GCC 4.2+<br>PSP2 (<a href="#psvita">PS VITA</a>)</td>[m
[31m-<td class="compatos">XCode 5.0+<br>Clang</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="compatcpu"><a href="#cross2">ARM64</a></td>[m
[31m-<td class="compatos">GCC 4.8+</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-<td class="compatos">XCode 6.0+<br>Clang 3.5+</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-</tr>[m
[31m-<tr class="odd">[m
[31m-<td class="compatcpu"><a href="#cross2">PPC</a></td>[m
[31m-<td class="compatos">GCC 4.3+</td>[m
[31m-<td class="compatos">GCC 4.3+<br>GCC 4.1 (<a href="#ps3">PS3</a>)</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-<td class="compatos">XEDK (<a href="#xbox360">Xbox 360</a>)</td>[m
[31m-</tr>[m
[31m-<tr class="even">[m
[31m-<td class="compatcpu"><a href="#cross2">MIPS</a></td>[m
[31m-<td class="compatos">GCC 4.3+</td>[m
[31m-<td class="compatos">GCC 4.3+</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-<td class="compatos compatno">&nbsp;</td>[m
[31m-</tr>[m
[31m-</table>[m
[31m-[m
[31m-<h2>Configuring LuaJIT</h2>[m
[31m-<p>[m
[31m-The standard configuration should work fine for most installations.[m
[31m-Usually there is no need to tweak the settings. The following files[m
[31m-hold all user-configurable settings:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>src/luaconf.h</tt> sets some configuration variables.</li>[m
[31m-<li><tt>Makefile</tt> has settings for <b>installing</b> LuaJIT (POSIX[m
[31m-only).</li>[m
[31m-<li><tt>src/Makefile</tt> has settings for <b>compiling</b> LuaJIT[m
[31m-under POSIX, MinGW or Cygwin.</li>[m
[31m-<li><tt>src/msvcbuild.bat</tt> has settings for compiling LuaJIT with[m
[31m-MSVC or WinSDK.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-Please read the instructions given in these files, before changing[m
[31m-any settings.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="posix">POSIX Systems (Linux, OSX, *BSD etc.)</h2>[m
[31m-<h3>Prerequisites</h3>[m
[31m-<p>[m
[31m-Depending on your distribution, you may need to install a package for[m
[31m-GCC, the development headers and/or a complete SDK. E.g. on a current[m
[31m-Debian/Ubuntu, install <tt>libc6-dev</tt> with the package manager.[m
[31m-</p>[m
[31m-<p>[m
[31m-Download the current source package of LuaJIT (pick the .tar.gz),[m
[31m-if you haven't already done so. Move it to a directory of your choice,[m
[31m-open a terminal window and change to this directory. Now unpack the archive[m
[31m-and change to the newly created directory:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-tar zxf LuaJIT-2.0.4.tar.gz[m
[31m-cd LuaJIT-2.0.4</pre>[m
[31m-<h3>Building LuaJIT</h3>[m
[31m-<p>[m
[31m-The supplied Makefiles try to auto-detect the settings needed for your[m
[31m-operating system and your compiler. They need to be run with GNU Make,[m
[31m-which is probably the default on your system, anyway. Simply run:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make[m
[31m-</pre>[m
[31m-<p>[m
[31m-This always builds a native x86, x64 or PPC binary, depending on the host OS[m
[31m-you're running this command on. Check the section on[m
[31m-<a href="#cross">cross-compilation</a> for more options.[m
[31m-</p>[m
[31m-<p>[m
[31m-By default, modules are only searched under the prefix <tt>/usr/local</tt>.[m
[31m-You can add an extra prefix to the search paths by appending the[m
[31m-<tt>PREFIX</tt> option, e.g.:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make PREFIX=/home/myself/lj2[m
[31m-</pre>[m
[31m-<p>[m
[31m-Note for OSX: if the <tt>MACOSX_DEPLOYMENT_TARGET</tt> environment[m
[31m-variable is not set, then it's forced to <tt>10.4</tt>.[m
[31m-</p>[m
[31m-<h3>Installing LuaJIT</h3>[m
[31m-<p>[m
[31m-The top-level Makefile installs LuaJIT by default under[m
[31m-<tt>/usr/local</tt>, i.e. the executable ends up in[m
[31m-<tt>/usr/local/bin</tt> and so on. You need root privileges[m
[31m-to write to this path. So, assuming sudo is installed on your system,[m
[31m-run the following command and enter your sudo password:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-sudo make install[m
[31m-</pre>[m
[31m-<p>[m
[31m-Otherwise specify the directory prefix as an absolute path, e.g.:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make install PREFIX=/home/myself/lj2[m
[31m-</pre>[m
[31m-<p>[m
[31m-Obviously the prefixes given during build and installation need to be the same.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="windows">Windows Systems</h2>[m
[31m-<h3>Prerequisites</h3>[m
[31m-<p>[m
[31m-Either install one of the open source SDKs[m
[31m-(<a href="http://mingw.org/"><span class="ext">&raquo;</span>&nbsp;MinGW</a> or[m
[31m-<a href="http://www.cygwin.com/"><span class="ext">&raquo;</span>&nbsp;Cygwin</a>), which come with a modified[m
[31m-GCC plus the required development headers.[m
[31m-</p>[m
[31m-<p>[m
[31m-Or install Microsoft's Visual C++ (MSVC). The freely downloadable[m
[31m-<a href="http://www.microsoft.com/Express/VC/"><span class="ext">&raquo;</span>&nbsp;Express Edition</a>[m
[31m-works just fine, but only contains an x86 compiler.[m
[31m-</p>[m
[31m-<p>[m
[31m-The freely downloadable[m
[31m-<a href="http://msdn.microsoft.com/en-us/windowsserver/bb980924.aspx"><span class="ext">&raquo;</span>&nbsp;Windows SDK</a>[m
[31m-only comes with command line tools, but this is all you need to build LuaJIT.[m
[31m-It contains x86 and x64 compilers.[m
[31m-</p>[m
[31m-<p>[m
[31m-Next, download the source package and unpack it using an archive manager[m
[31m-(e.g. the Windows Explorer) to a directory of your choice.[m
[31m-</p>[m
[31m-<h3>Building with MSVC</h3>[m
[31m-<p>[m
[31m-Open a "Visual Studio .NET Command Prompt", <tt>cd</tt> to the[m
[31m-directory where you've unpacked the sources and run these commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-msvcbuild[m
[31m-</pre>[m
[31m-<p>[m
[31m-Then follow the installation instructions below.[m
[31m-</p>[m
[31m-<h3>Building with the Windows SDK</h3>[m
[31m-<p>[m
[31m-Open a "Windows SDK Command Shell" and select the x86 compiler:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-setenv /release /x86[m
[31m-</pre>[m
[31m-<p>[m
[31m-Or select the x64 compiler:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-setenv /release /x64[m
[31m-</pre>[m
[31m-<p>[m
[31m-Then <tt>cd</tt> to the directory where you've unpacked the sources[m
[31m-and run these commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-msvcbuild[m
[31m-</pre>[m
[31m-<p>[m
[31m-Then follow the installation instructions below.[m
[31m-</p>[m
[31m-<h3>Building with MinGW or Cygwin</h3>[m
[31m-<p>[m
[31m-Open a command prompt window and make sure the MinGW or Cygwin programs[m
[31m-are in your path. Then <tt>cd</tt> to the directory where[m
[31m-you've unpacked the sources and run this command for MinGW:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-mingw32-make[m
[31m-</pre>[m
[31m-<p>[m
[31m-Or this command for Cygwin:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make[m
[31m-</pre>[m
[31m-<p>[m
[31m-Then follow the installation instructions below.[m
[31m-</p>[m
[31m-<h3>Installing LuaJIT</h3>[m
[31m-<p>[m
[31m-Copy <tt>luajit.exe</tt> and <tt>lua51.dll</tt> (built in the <tt>src</tt>[m
[31m-directory) to a newly created directory (any location is ok).[m
[31m-Add <tt>lua</tt> and <tt>lua\jit</tt> directories below it and copy[m
[31m-all Lua files from the <tt>src\jit</tt> directory of the distribution[m
[31m-to the latter directory.[m
[31m-</p>[m
[31m-<p>[m
[31m-There are no hardcoded[m
[31m-absolute path names &mdash; all modules are loaded relative to the[m
[31m-directory where <tt>luajit.exe</tt> is installed[m
[31m-(see <tt>src/luaconf.h</tt>).[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="cross">Cross-compiling LuaJIT</h2>[m
[31m-<p>[m
[31m-The GNU Makefile-based build system allows cross-compiling on any host[m
[31m-for any supported target, as long as both architectures have the same[m
[31m-pointer size. If you want to cross-compile to any 32 bit target on an[m
[31m-x64 OS, you need to install the multilib development package (e.g.[m
[31m-<tt>libc6-dev-i386</tt> on Debian/Ubuntu) and build a 32 bit host part[m
[31m-(<tt>HOST_CC="gcc -m32"</tt>).[m
[31m-</p>[m
[31m-<p>[m
[31m-You need to specify <tt>TARGET_SYS</tt> whenever the host OS and the[m
[31m-target OS differ, or you'll get assembler or linker errors. E.g. if[m
[31m-you're compiling on a Windows or OSX host for embedded Linux or Android,[m
[31m-you need to add <tt>TARGET_SYS=Linux</tt> to the examples below. For a[m
[31m-minimal target OS, you may need to disable the built-in allocator in[m
[31m-<tt>src/Makefile</tt> and use <tt>TARGET_SYS=Other</tt>. Don't forget to[m
[31m-specify the same <tt>TARGET_SYS</tt> for the install step, too.[m
[31m-</p>[m
[31m-<p>[m
[31m-The examples below only show some popular targets &mdash; please check[m
[31m-the comments in <tt>src/Makefile</tt> for more details.[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-# Cross-compile to a 32 bit binary on a multilib x64 OS[m
[31m-make CC="gcc -m32"[m
[31m-[m
[31m-# Cross-compile on Debian/Ubuntu for Windows (mingw32 package)[m
[31m-make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows[m
[31m-</pre>[m
[31m-<p id="cross2">[m
[31m-The <tt>CROSS</tt> prefix allows specifying a standard GNU cross-compile[m
[31m-toolchain (Binutils, GCC and a matching libc). The prefix may vary[m
[31m-depending on the <tt>--target</tt> the toolchain was built for (note the[m
[31m-<tt>CROSS</tt> prefix has a trailing <tt>"-"</tt>). The examples below[m
[31m-use the canonical toolchain triplets for Linux.[m
[31m-</p>[m
[31m-<p>[m
[31m-Since there's often no easy way to detect CPU features at runtime, it's[m
[31m-important to compile with the proper CPU or architecture settings. You[m
[31m-can specify these when building the toolchain yourself. Or add[m
[31m-<tt>-mcpu=...</tt> or <tt>-march=...</tt> to <tt>TARGET_CFLAGS</tt>. For[m
[31m-ARM it's important to have the correct <tt>-mfloat-abi=...</tt> setting,[m
[31m-too. Otherwise LuaJIT may not run at the full performance of your target[m
[31m-CPU.[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-# ARM soft-float[m
[31m-make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \[m
[31m-     TARGET_CFLAGS="-mfloat-abi=soft"[m
[31m-[m
[31m-# ARM soft-float ABI with VFP (example for Cortex-A8)[m
[31m-make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \[m
[31m-     TARGET_CFLAGS="-mcpu=cortex-a8 -mfloat-abi=softfp"[m
[31m-[m
[31m-# ARM hard-float ABI with VFP (armhf, requires recent toolchain)[m
[31m-make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-[m
[31m-[m
[31m-# ARM64 (requires x64 host)[m
[31m-make CROSS=aarch64-linux-[m
[31m-[m
[31m-# PPC[m
[31m-make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-[m
[31m-[m
[31m-# MIPS big-endian[m
[31m-make HOST_CC="gcc -m32" CROSS=mips-linux-[m
[31m-# MIPS little-endian[m
[31m-make HOST_CC="gcc -m32" CROSS=mipsel-linux-[m
[31m-</pre>[m
[31m-<p>[m
[31m-You can cross-compile for <b id="android">Android</b> using the <a href="http://developer.android.com/sdk/ndk/index.html"><span class="ext">&raquo;</span>&nbsp;Android NDK</a>.[m
[31m-The environment variables need to match the install locations and the[m
[31m-desired target platform. E.g. Android&nbsp;4.0 corresponds to ABI level&nbsp;14.[m
[31m-For details check the folder <tt>docs</tt> in the NDK directory.[m
[31m-</p>[m
[31m-<p>[m
[31m-Only a few common variations for the different CPUs, ABIs and platforms[m
[31m-are listed. Please use your own judgement for which combination you want[m
[31m-to build/deploy or which lowest common denominator you want to pick:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-# Android/ARM, armeabi (ARMv5TE soft-float), Android 2.2+ (Froyo)[m
[31m-NDK=/opt/android/ndk[m
[31m-NDKABI=8[m
[31m-NDKVER=$NDK/toolchains/arm-linux-androideabi-4.6[m
[31m-NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-[m
[31m-NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"[m
[31m-make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"[m
[31m-[m
[31m-# Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.0+ (ICS)[m
[31m-NDK=/opt/android/ndk[m
[31m-NDKABI=14[m
[31m-NDKVER=$NDK/toolchains/arm-linux-androideabi-4.6[m
[31m-NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-[m
[31m-NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"[m
[31m-NDKARCH="-march=armv7-a -mfloat-abi=softfp -Wl,--fix-cortex-a8"[m
[31m-make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF $NDKARCH"[m
[31m-[m
[31m-# Android/MIPS, mips (MIPS32R1 hard-float), Android 4.0+ (ICS)[m
[31m-NDK=/opt/android/ndk[m
[31m-NDKABI=14[m
[31m-NDKVER=$NDK/toolchains/mipsel-linux-android-4.6[m
[31m-NDKP=$NDKVER/prebuilt/linux-x86/bin/mipsel-linux-android-[m
[31m-NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-mips"[m
[31m-make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"[m
[31m-[m
[31m-# Android/x86, x86 (i686 SSE3), Android 4.0+ (ICS)[m
[31m-NDK=/opt/android/ndk[m
[31m-NDKABI=14[m
[31m-NDKVER=$NDK/toolchains/x86-4.6[m
[31m-NDKP=$NDKVER/prebuilt/linux-x86/bin/i686-linux-android-[m
[31m-NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-x86"[m
[31m-make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"[m
[31m-</pre>[m
[31m-<p>[m
[31m-You can cross-compile for <b id="ios">iOS 3.0+</b> (iPhone/iPad) using the <a href="http://developer.apple.com/devcenter/ios/index.action"><span class="ext">&raquo;</span>&nbsp;iOS SDK</a>:[m
[31m-</p>[m
[31m-<p style="font-size: 8pt;">[m
[31m-Note: <b>the JIT compiler is disabled for iOS</b>, because regular iOS Apps[m
[31m-are not allowed to generate code at runtime. You'll only get the performance[m
[31m-of the LuaJIT interpreter on iOS. This is still faster than plain Lua, but[m
[31m-much slower than the JIT compiler. Please complain to Apple, not me.[m
[31m-Or use Android. :-p[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-# iOS/ARM (32 bit)[m
[31m-ISDKP=$(xcrun --sdk iphoneos --show-sdk-path)[m
[31m-ICC=$(xcrun --sdk iphoneos --find clang)[m
[31m-ISDKF="-arch armv7 -isysroot $ISDKP"[m
[31m-make HOST_CC="clang -m32 -arch i386" CROSS="$(dirname $ICC)/" \[m
[31m-     TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS[m
[31m-[m
[31m-# iOS/ARM64[m
[31m-ISDKP=$(xcrun --sdk iphoneos --show-sdk-path)[m
[31m-ICC=$(xcrun --sdk iphoneos --find clang)[m
[31m-ISDKF="-arch arm64 -isysroot $ISDKP"[m
[31m-make CROSS="$(dirname $ICC)/" TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS[m
[31m-</pre>[m
[31m-[m
[31m-<h3 id="consoles">Cross-compiling for consoles</h3>[m
[31m-<p>[m
[31m-Building LuaJIT for consoles requires both a supported host compiler[m
[31m-(x86 or x64) and a cross-compiler (to PPC or ARM) from the official[m
[31m-console SDK.[m
[31m-</p>[m
[31m-<p>[m
[31m-Due to restrictions on consoles, the JIT compiler is disabled and only[m
[31m-the fast interpreter is built. This is still faster than plain Lua,[m
[31m-but much slower than the JIT compiler. The FFI is disabled, too, since[m
[31m-it's not very useful in such an environment.[m
[31m-</p>[m
[31m-<p>[m
[31m-The following commands build a static library <tt>libluajit.a</tt>,[m
[31m-which can be linked against your game, just like the Lua library.[m
[31m-</p>[m
[31m-<p>[m
[31m-To cross-compile for <b id="ps3">PS3</b> from a Linux host (requires[m
[31m-32&nbsp;bit GCC, i.e. multilib Linux/x64) or a Windows host (requires[m
[31m-32&nbsp;bit MinGW), run this command:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make HOST_CC="gcc -m32" CROSS=ppu-lv2-[m
[31m-</pre>[m
[31m-<p>[m
[31m-To cross-compile for <b id="ps4">PS4</b> from a Windows host,[m
[31m-open a "Visual Studio .NET Command Prompt" (64&nbsp;bit host compiler),[m
[31m-<tt>cd</tt> to the directory where you've unpacked the sources and[m
[31m-run the following commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-ps4build[m
[31m-</pre>[m
[31m-<p>[m
[31m-To cross-compile for <b id="psvita">PS Vita</b> from a Windows host,[m
[31m-open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler),[m
[31m-<tt>cd</tt> to the directory where you've unpacked the sources and[m
[31m-run the following commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-psvitabuild[m
[31m-</pre>[m
[31m-<p>[m
[31m-To cross-compile for <b id="xbox360">Xbox 360</b> from a Windows host,[m
[31m-open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler),[m
[31m-<tt>cd</tt> to the directory where you've unpacked the sources and run[m
[31m-the following commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-xedkbuild[m
[31m-</pre>[m
[31m-<p>[m
[31m-To cross-compile for <b id="xboxone">Xbox One</b> from a Windows host,[m
[31m-open a "Visual Studio .NET Command Prompt" (64&nbsp;bit host compiler),[m
[31m-<tt>cd</tt> to the directory where you've unpacked the sources and run[m
[31m-the following commands:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-cd src[m
[31m-xb1build[m
[31m-</pre>[m
[31m-[m
[31m-<h2 id="embed">Embedding LuaJIT</h2>[m
[31m-<p>[m
[31m-LuaJIT is API-compatible with Lua 5.1. If you've already embedded Lua[m
[31m-into your application, you probably don't need to do anything to switch[m
[31m-to LuaJIT, except link with a different library:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>It's strongly suggested to build LuaJIT separately using the supplied[m
[31m-build system. Please do <em>not</em> attempt to integrate the individual[m
[31m-source files into your build tree. You'll most likely get the internal build[m
[31m-dependencies wrong or mess up the compiler flags. Treat LuaJIT like any[m
[31m-other external library and link your application with either the dynamic[m
[31m-or static library, depending on your needs.</li>[m
[31m-<li>If you want to load C modules compiled for plain Lua[m
[31m-with <tt>require()</tt>, you need to make sure the public symbols[m
[31m-(e.g. <tt>lua_pushnumber</tt>) are exported, too:[m
[31m-<ul><li>On POSIX systems you can either link to the shared library[m
[31m-or link the static library into your application. In the latter case[m
[31m-you'll need to export all public symbols from your main executable[m
[31m-(e.g. <tt>-Wl,-E</tt> on Linux) and add the external dependencies[m
[31m-(e.g. <tt>-lm -ldl</tt> on Linux).</li>[m
[31m-<li>Since Windows symbols are bound to a specific DLL name, you need to[m
[31m-link to the <tt>lua51.dll</tt> created by the LuaJIT build (do not rename[m
[31m-the DLL). You may link LuaJIT statically on Windows only if you don't[m
[31m-intend to load Lua/C modules at runtime.[m
[31m-</li></ul>[m
[31m-</li>[m
[31m-<li>[m
[31m-If you're building a 64 bit application on OSX which links directly or[m
[31m-indirectly against LuaJIT, you need to link your main executable[m
[31m-with these flags:[m
[31m-<pre class="code">[m
[31m--pagezero_size 10000 -image_base 100000000[m
[31m-</pre>[m
[31m-Also, it's recommended to <tt>rebase</tt> all (self-compiled) shared libraries[m
[31m-which are loaded at runtime on OSX/x64 (e.g. C extension modules for Lua).[m
[31m-See: <tt>man rebase</tt>[m
[31m-</li>[m
[31m-</ul>[m
[31m-<p>Additional hints for initializing LuaJIT using the C API functions:</p>[m
[31m-<ul>[m
[31m-<li>Here's a[m
[31m-<a href="http://lua-users.org/wiki/SimpleLuaApiExample"><span class="ext">&raquo;</span>&nbsp;simple example</a>[m
[31m-for embedding Lua or LuaJIT into your application.</li>[m
[31m-<li>Make sure you use <tt>luaL_newstate</tt>. Avoid using[m
[31m-<tt>lua_newstate</tt>, since this uses the (slower) default memory[m
[31m-allocator from your system (no support for this on x64).</li>[m
[31m-<li>Make sure you use <tt>luaL_openlibs</tt> and not the old Lua 5.0 style[m
[31m-of calling <tt>luaopen_base</tt> etc. directly.</li>[m
[31m-<li>To change or extend the list of standard libraries to load, copy[m
[31m-<tt>src/lib_init.c</tt> to your project and modify it accordingly.[m
[31m-Make sure the <tt>jit</tt> library is loaded or the JIT compiler[m
[31m-will not be activated.</li>[m
[31m-<li>The <tt>bit.*</tt> module for bitwise operations[m
[31m-is already built-in. There's no need to statically link[m
[31m-<a href="http://bitop.luajit.org/"><span class="ext">&raquo;</span>&nbsp;Lua BitOp</a> to your application.</li>[m
[31m-</ul>[m
[31m-[m
[31m-<h2 id="distro">Hints for Distribution Maintainers</h2>[m
[31m-<p>[m
[31m-The LuaJIT build system has extra provisions for the needs of most[m
[31m-POSIX-based distributions. If you're a package maintainer for[m
[31m-a distribution, <em>please</em> make use of these features and[m
[31m-avoid patching, subverting, autotoolizing or messing up the build system[m
[31m-in unspeakable ways.[m
[31m-</p>[m
[31m-<p>[m
[31m-There should be absolutely no need to patch <tt>luaconf.h</tt> or any[m
[31m-of the Makefiles. And please do not hand-pick files for your packages &mdash;[m
[31m-simply use whatever <tt>make install</tt> creates. There's a reason[m
[31m-for all of the files <em>and</em> directories it creates.[m
[31m-</p>[m
[31m-<p>[m
[31m-The build system uses GNU make and auto-detects most settings based on[m
[31m-the host you're building it on. This should work fine for native builds,[m
[31m-even when sandboxed. You may need to pass some of the following flags to[m
[31m-<em>both</em> the <tt>make</tt> and the <tt>make install</tt> command lines[m
[31m-for a regular distribution build:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>PREFIX</tt> overrides the installation path and should usually[m
[31m-be set to <tt>/usr</tt>. Setting this also changes the module paths and[m
[31m-the paths needed to locate the shared library.</li>[m
[31m-<li><tt>DESTDIR</tt> is an absolute path which allows you to install[m
[31m-to a shadow tree instead of the root tree of the build system.</li>[m
[31m-<li><tt>MULTILIB</tt> sets the architecture-specific library path component[m
[31m-for multilib systems. The default is <tt>lib</tt>.</li>[m
[31m-<li>Have a look at the top-level <tt>Makefile</tt> and <tt>src/Makefile</tt>[m
[31m-for additional variables to tweak. The following variables <em>may</em> be[m
[31m-overridden, but it's <em>not</em> recommended, except for special needs[m
[31m-like cross-builds:[m
[31m-<tt>BUILDMODE, CC, HOST_CC, STATIC_CC, DYNAMIC_CC, CFLAGS, HOST_CFLAGS,[m
[31m-TARGET_CFLAGS, LDFLAGS, HOST_LDFLAGS, TARGET_LDFLAGS, TARGET_SHLDFLAGS,[m
[31m-TARGET_FLAGS, LIBS, HOST_LIBS, TARGET_LIBS, CROSS, HOST_SYS, TARGET_SYS[m
[31m-</tt></li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The build system has a special target for an amalgamated build, i.e.[m
[31m-<tt>make amalg</tt>. This compiles the LuaJIT core as one huge C file[m
[31m-and allows GCC to generate faster and shorter code. Alas, this requires[m
[31m-lots of memory during the build. This may be a problem for some users,[m
[31m-that's why it's not enabled by default. But it shouldn't be a problem for[m
[31m-most build farms. It's recommended that binary distributions use this[m
[31m-target for their LuaJIT builds.[m
[31m-</p>[m
[31m-<p>[m
[31m-The tl;dr version of the above:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-make amalg PREFIX=/usr && \[m
[31m-make install PREFIX=/usr DESTDIR=/tmp/buildroot[m
[31m-</pre>[m
[31m-<p>[m
[31m-Finally, if you encounter any difficulties, please[m
[31m-<a href="contact.html">contact me</a> first, instead of releasing a broken[m
[31m-package onto unsuspecting users. Because they'll usually gonna complain[m
[31m-to me (the upstream) and not you (the package maintainer), anyway.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/luajit.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/luajit.html[m
[1mdeleted file mode 100644[m
[1mindex c7a92b8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/luajit.html[m
[1m+++ /dev/null[m
[36m@@ -1,236 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>LuaJIT</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<meta name="description" content="LuaJIT is a Just-In-Time (JIT) compiler for the Lua language.">[m
[31m-<style type="text/css">[m
[31m-table.feature {[m
[31m-  width: inherit;[m
[31m-  line-height: 1.2;[m
[31m-  margin: 0;[m
[31m-}[m
[31m-table.feature td {[m
[31m-  width: 80px;[m
[31m-  height: 40px;[m
[31m-  vertical-align: middle;[m
[31m-  text-align: center;[m
[31m-  font-weight: bold;[m
[31m-  border: 4px solid #e6ecff;[m
[31m-  border-radius: 12px;[m
[31m-}[m
[31m-table.os td {[m
[31m-  background: #7080d0;[m
[31m-  background-image: linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-  background-image: -moz-linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-  background-image: -webkit-linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-  background-image: -o-linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-  background-image: -ms-linear-gradient(#4060c0 10%, #b0b0ff 95%);[m
[31m-}[m
[31m-table.os1 td {[m
[31m-  color: #ffff80;[m
[31m-}[m
[31m-table.os2 td {[m
[31m-  color: #ffa040;[m
[31m-}[m
[31m-table.os3 td {[m
[31m-  color: #40ffff;[m
[31m-}[m
[31m-table.compiler td {[m
[31m-  color: #2080ff;[m
[31m-  background: #62bf41;[m
[31m-  background-image: linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-  background-image: -moz-linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-  background-image: -webkit-linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-  background-image: -o-linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-  background-image: -ms-linear-gradient(#62bf41 10%, #b0ffb0 95%);[m
[31m-}[m
[31m-table.cpu td {[m
[31m-  color: #ffff00;[m
[31m-  background: #cf7251;[m
[31m-  background-image: linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-  background-image: -moz-linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-  background-image: -webkit-linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-  background-image: -o-linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-  background-image: -ms-linear-gradient(#bf6241 10%, #ffb0b0 95%);[m
[31m-}[m
[31m-table.fcompat td {[m
[31m-  color: #2060e0;[m
[31m-  background: #61cfcf;[m
[31m-  background-image: linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-  background-image: -moz-linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-  background-image: -webkit-linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-  background-image: -o-linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-  background-image: -ms-linear-gradient(#41bfbf 10%, #b0ffff 95%);[m
[31m-}[m
[31m-table.stats td {[m
[31m-  color: #ffffff;[m
[31m-  background: #a0a0a0;[m
[31m-  background-image: linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-  background-image: -moz-linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-  background-image: -webkit-linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-  background-image: -o-linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-  background-image: -ms-linear-gradient(#808080 10%, #d0d0d0 95%);[m
[31m-}[m
[31m-table.stats td.speed {[m
[31m-  color: #ff4020;[m
[31m-}[m
[31m-table.stats td.kb {[m
[31m-  color: #ffff80;[m
[31m-  background: #808080;[m
[31m-  background-image: linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-  background-image: -moz-linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-  background-image: -webkit-linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-  background-image: -o-linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-  background-image: -ms-linear-gradient(#606060 10%, #c0c0c0 95%);[m
[31m-}[m
[31m-table.feature small {[m
[31m-  font-size: 50%;[m
[31m-}[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>LuaJIT</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a class="current" href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT is a <b>Just-In-Time Compiler</b> (JIT) for the[m
[31m-<a href="http://www.lua.org/"><span class="ext">&raquo;</span>&nbsp;Lua</a> programming language.[m
[31m-Lua is a powerful, dynamic and light-weight programming language.[m
[31m-It may be embedded or used as a general-purpose, stand-alone language.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT is Copyright &copy; 2005-2016 Mike Pall, released under the[m
[31m-<a href="http://www.opensource.org/licenses/mit-license.php"><span class="ext">&raquo;</span>&nbsp;MIT open source license</a>.[m
[31m-</p>[m
[31m-<p>[m
[31m-</p>[m
[31m-[m
[31m-<h2>Compatibility</h2>[m
[31m-<table class="feature os os1">[m
[31m-<tr><td>Windows</td><td>Linux</td><td>BSD</td><td>OSX</td><td>POSIX</td></tr>[m
[31m-</table>[m
[31m-<table class="feature os os2">[m
[31m-<tr><td><span style="font-size:90%;">Embedded</span></td><td>Android</td><td>iOS</td></tr>[m
[31m-</table>[m
[31m-<table class="feature os os3">[m
[31m-<tr><td>PS3</td><td>PS4</td><td>PS Vita</td><td>Xbox 360</td><td>Xbox One</td></tr>[m
[31m-</table>[m
[31m-<table class="feature compiler">[m
[31m-<tr><td>GCC</td><td>CLANG<br>LLVM</td><td>MSVC</td></tr>[m
[31m-</table>[m
[31m-<table class="feature cpu">[m
[31m-<tr><td>x86</td><td>x64</td><td>ARM</td><td>ARM64</td><td>PPC</td><td>MIPS</td></tr>[m
[31m-</table>[m
[31m-<table class="feature fcompat">[m
[31m-<tr><td>Lua&nbsp;5.1<br>API+ABI</td><td>+&nbsp;JIT</td><td>+&nbsp;BitOp</td><td>+&nbsp;FFI</td><td>Drop-in<br>DLL/.so</td></tr>[m
[31m-</table>[m
[31m-[m
[31m-<h2>Overview</h2>[m
[31m-<table class="feature stats">[m
[31m-<tr>[m
[31m-<td class="speed">3x<br>-&nbsp;&nbsp;100x</td>[m
[31m-<td class="kb">115&nbsp;<small>KB</small><br>VM</td>[m
[31m-<td class="kb">90&nbsp;<small>KB</small><br>JIT</td>[m
[31m-<td class="kloc">63&nbsp;<small>KLOC</small><br>C</td>[m
[31m-<td class="kloc">24&nbsp;<small>KLOC</small><br>ASM</td>[m
[31m-<td class="kloc">11&nbsp;<small>KLOC</small><br>Lua</td>[m
[31m-</tr>[m
[31m-</table>[m
[31m-<p style="margin-top: 1em;">[m
[31m-LuaJIT has been successfully used as a <b>scripting middleware</b> in[m
[31m-games, appliances, network and graphics apps, numerical simulations,[m
[31m-trading platforms and many other specialty applications. It scales from[m
[31m-embedded devices, smartphones, desktops up to server farms. It combines[m
[31m-high flexibility with <a href="http://luajit.org/performance.html"><span class="ext">&raquo;</span>&nbsp;high performance</a>[m
[31m-and an unmatched <b>low memory footprint</b>.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT has been in continuous development since 2005. It's widely[m
[31m-considered to be <b>one of the fastest dynamic language[m
[31m-implementations</b>. It has outperformed other dynamic languages on many[m
[31m-cross-language benchmarks since its first release &mdash; often by a[m
[31m-substantial margin.[m
[31m-</p>[m
[31m-<p>[m
[31m-For <b>LuaJIT 2.0</b>, the whole VM has been rewritten from the ground up[m
[31m-and relentlessly optimized for performance. It combines a <b>high-speed[m
[31m-interpreter</b>, written in assembler, with a <b>state-of-the-art JIT[m
[31m-compiler</b>.[m
[31m-</p>[m
[31m-<p>[m
[31m-An innovative <b>trace compiler</b> is integrated with advanced,[m
[31m-SSA-based optimizations and highly tuned code generation backends.[m
[31m-A substantial reduction of the overhead associated with dynamic languages[m
[31m-allows it to break into the performance range traditionally reserved for[m
[31m-offline, static language compilers.[m
[31m-</p>[m
[31m-[m
[31m-<h2>More ...</h2>[m
[31m-<p>[m
[31m-Please select a sub-topic in the navigation bar to learn more about LuaJIT.[m
[31m-</p>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/running.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/running.html[m
[1mdeleted file mode 100644[m
[1mindex 28a7326..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/running.html[m
[1m+++ /dev/null[m
[36m@@ -1,309 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Running LuaJIT</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-table.opt {[m
[31m-  line-height: 1.2;[m
[31m-}[m
[31m-tr.opthead td {[m
[31m-  font-weight: bold;[m
[31m-}[m
[31m-td.flag_name {[m
[31m-  width: 4em;[m
[31m-}[m
[31m-td.flag_level {[m
[31m-  width: 2em;[m
[31m-  text-align: center;[m
[31m-}[m
[31m-td.param_name {[m
[31m-  width: 6em;[m
[31m-}[m
[31m-td.param_default {[m
[31m-  width: 4em;[m
[31m-  text-align: right;[m
[31m-}[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Running LuaJIT</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a class="current" href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-LuaJIT has only a single stand-alone executable, called <tt>luajit</tt> on[m
[31m-POSIX systems or <tt>luajit.exe</tt> on Windows. It can be used to run simple[m
[31m-Lua statements or whole Lua applications from the command line. It has an[m
[31m-interactive mode, too.[m
[31m-</p>[m
[31m-[m
[31m-<h2 id="options">Command Line Options</h2>[m
[31m-<p>[m
[31m-The <tt>luajit</tt> stand-alone executable is just a slightly modified[m
[31m-version of the regular <tt>lua</tt> stand-alone executable.[m
[31m-It supports the same basic options, too. <tt>luajit&nbsp;-h</tt>[m
[31m-prints a short list of the available options. Please have a look at the[m
[31m-<a href="http://www.lua.org/manual/5.1/manual.html#6"><span class="ext">&raquo;</span>&nbsp;Lua manual</a>[m
[31m-for details.[m
[31m-</p>[m
[31m-<p>[m
[31m-LuaJIT has some additional options:[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="opt_b"><tt>-b[options] input output</tt></h3>[m
[31m-<p>[m
[31m-This option saves or lists bytecode. The following additional options[m
[31m-are accepted:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>-l</tt> &mdash; Only list bytecode.</li>[m
[31m-<li><tt>-s</tt> &mdash; Strip debug info (this is the default).</li>[m
[31m-<li><tt>-g</tt> &mdash; Keep debug info.</li>[m
[31m-<li><tt>-n name</tt> &mdash; Set module name (default: auto-detect from input name)</li>[m
[31m-<li><tt>-t type</tt> &mdash; Set output file type (default: auto-detect from output name).</li>[m
[31m-<li><tt>-a arch</tt> &mdash; Override architecture for object files (default: native).</li>[m
[31m-<li><tt>-o os</tt> &mdash; Override OS for object files (default: native).</li>[m
[31m-<li><tt>-e chunk</tt> &mdash; Use chunk string as input.</li>[m
[31m-<li><tt>-</tt> (a single minus sign) &mdash; Use stdin as input and/or stdout as output.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The output file type is auto-detected from the extension of the output[m
[31m-file name:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li><tt>c</tt> &mdash; C source file, exported bytecode data.</li>[m
[31m-<li><tt>h</tt> &mdash; C header file, static bytecode data.</li>[m
[31m-<li><tt>obj</tt> or <tt>o</tt> &mdash; Object file, exported bytecode data[m
[31m-(OS- and architecture-specific).</li>[m
[31m-<li><tt>raw</tt> or any other extension &mdash; Raw bytecode file (portable).[m
[31m-</ul>[m
[31m-<p>[m
[31m-Notes:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>See also <a href="extensions.html#string_dump">string.dump()</a>[m
[31m-for information on bytecode portability and compatibility.</li>[m
[31m-<li>A file in raw bytecode format is auto-detected and can be loaded like[m
[31m-any Lua source file. E.g. directly from the command line or with[m
[31m-<tt>loadfile()</tt>, <tt>dofile()</tt> etc.</li>[m
[31m-<li>To statically embed the bytecode of a module in your application,[m
[31m-generate an object file and just link it with your application.</li>[m
[31m-<li>On most ELF-based systems (e.g. Linux) you need to explicitly export the[m
[31m-global symbols when linking your application, e.g. with: <tt>-Wl,-E</tt></li>[m
[31m-<li><tt>require()</tt> tries to load embedded bytecode data from exported[m
[31m-symbols (in <tt>*.exe</tt> or <tt>lua51.dll</tt> on Windows) and from[m
[31m-shared libraries in <tt>package.cpath</tt>.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-Typical usage examples:[m
[31m-</p>[m
[31m-<pre class="code">[m
[31m-luajit -b test.lua test.out                 # Save bytecode to test.out[m
[31m-luajit -bg test.lua test.out                # Keep debug info[m
[31m-luajit -be "print('hello world')" test.out  # Save cmdline script[m
[31m-[m
[31m-luajit -bl test.lua                         # List to stdout[m
[31m-luajit -bl test.lua test.txt                # List to test.txt[m
[31m-luajit -ble "print('hello world')"          # List cmdline script[m
[31m-[m
[31m-luajit -b test.lua test.obj                 # Generate object file[m
[31m-# Link test.obj with your application and load it with require("test")[m
[31m-</pre>[m
[31m-[m
[31m-<h3 id="opt_j"><tt>-j cmd[=arg[,arg...]]</tt></h3>[m
[31m-<p>[m
[31m-This option performs a LuaJIT control command or activates one of the[m
[31m-loadable extension modules. The command is first looked up in the[m
[31m-<tt>jit.*</tt> library. If no matching function is found, a module[m
[31m-named <tt>jit.&lt;cmd&gt;</tt> is loaded and the <tt>start()</tt>[m
[31m-function of the module is called with the specified arguments (if[m
[31m-any). The space between <tt>-j</tt> and <tt>cmd</tt> is optional.[m
[31m-</p>[m
[31m-<p>[m
[31m-Here are the available LuaJIT control commands:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li id="j_on"><tt>-jon</tt> &mdash; Turns the JIT compiler on (default).</li>[m
[31m-<li id="j_off"><tt>-joff</tt> &mdash; Turns the JIT compiler off (only use the interpreter).</li>[m
[31m-<li id="j_flush"><tt>-jflush</tt> &mdash; Flushes the whole cache of compiled code.</li>[m
[31m-<li id="j_v"><tt>-jv</tt> &mdash; Shows verbose information about the progress of the JIT compiler.</li>[m
[31m-<li id="j_dump"><tt>-jdump</tt> &mdash; Dumps the code and structures used in various compiler stages.</li>[m
[31m-<li id="j_p"><tt>-jp</tt> &mdash; Start the <a href="ext_profiler.html">integrated profiler</a>.</li>[m
[31m-</ul>[m
[31m-<p>[m
[31m-The <tt>-jv</tt> and <tt>-jdump</tt> commands are extension modules[m
[31m-written in Lua. They are mainly used for debugging the JIT compiler[m
[31m-itself. For a description of their options and output format, please[m
[31m-read the comment block at the start of their source.[m
[31m-They can be found in the <tt>lib</tt> directory of the source[m
[31m-distribution or installed under the <tt>jit</tt> directory. By default[m
[31m-this is <tt>/usr/local/share/luajit-2.0.4/jit</tt> on POSIX[m
[31m-systems.[m
[31m-</p>[m
[31m-[m
[31m-<h3 id="opt_O"><tt>-O[level]</tt><br>[m
[31m-<tt>-O[+]flag</tt>&nbsp;&nbsp;&nbsp;<tt>-O-flag</tt><br>[m
[31m-<tt>-Oparam=value</tt></h3>[m
[31m-<p>[m
[31m-This options allows fine-tuned control of the optimizations used by[m
[31m-the JIT compiler. This is mainly intended for debugging LuaJIT itself.[m
[31m-Please note that the JIT compiler is extremely fast (we are talking[m
[31m-about the microsecond to millisecond range). Disabling optimizations[m
[31m-doesn't have any visible impact on its overhead, but usually generates[m
[31m-code that runs slower.[m
[31m-</p>[m
[31m-<p>[m
[31m-The first form sets an optimization level &mdash; this enables a[m
[31m-specific mix of optimization flags. <tt>-O0</tt> turns off all[m
[31m-optimizations and higher numbers enable more optimizations. Omitting[m
[31m-the level (i.e. just <tt>-O</tt>) sets the default optimization level,[m
[31m-which is <tt>-O3</tt> in the current version.[m
[31m-</p>[m
[31m-<p>[m
[31m-The second form adds or removes individual optimization flags.[m
[31m-The third form sets a parameter for the VM or the JIT compiler[m
[31m-to a specific value.[m
[31m-</p>[m
[31m-<p>[m
[31m-You can either use this option multiple times (like <tt>-Ocse[m
[31m--O-dce -Ohotloop=10</tt>) or separate several settings with a comma[m
[31m-(like <tt>-O+cse,-dce,hotloop=10</tt>). The settings are applied from[m
[31m-left to right and later settings override earlier ones. You can freely[m
[31m-mix the three forms, but note that setting an optimization level[m
[31m-overrides all earlier flags.[m
[31m-</p>[m
[31m-<p>[m
[31m-Here are the available flags and at what optimization levels they[m
[31m-are enabled:[m
[31m-</p>[m
[31m-<table class="opt">[m
[31m-<tr class="opthead">[m
[31m-<td class="flag_name">Flag</td>[m
[31m-<td class="flag_level">-O1</td>[m
[31m-<td class="flag_level">-O2</td>[m
[31m-<td class="flag_level">-O3</td>[m
[31m-<td class="flag_desc">&nbsp;</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="flag_name">fold</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Constant Folding, Simplifications and Reassociation</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">cse</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Common-Subexpression Elimination</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="flag_name">dce</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Dead-Code Elimination</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">narrow</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Narrowing of numbers to integers</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="flag_name">loop</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_level">&bull;</td><td class="flag_desc">Loop Optimizations (code hoisting)</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">fwd</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Load Forwarding (L2L) and Store Forwarding (S2L)</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="flag_name">dse</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Dead-Store Elimination</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">abc</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Array Bounds Check Elimination</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="flag_name">sink</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Allocation/Store Sinking</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="flag_name">fuse</td><td class="flag_level">&nbsp;</td><td class="flag_level">&nbsp;</td><td class="flag_level">&bull;</td><td class="flag_desc">Fusion of operands into instructions</td></tr>[m
[31m-</table>[m
[31m-<p>[m
[31m-Here are the parameters and their default settings:[m
[31m-</p>[m
[31m-<table class="opt">[m
[31m-<tr class="opthead">[m
[31m-<td class="param_name">Parameter</td>[m
[31m-<td class="param_default">Default</td>[m
[31m-<td class="param_desc">&nbsp;</td>[m
[31m-</tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="param_name">maxtrace</td><td class="param_default">1000</td><td class="param_desc">Max. number of traces in the cache</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">maxrecord</td><td class="param_default">4000</td><td class="param_desc">Max. number of recorded IR instructions</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="param_name">maxirconst</td><td class="param_default">500</td><td class="param_desc">Max. number of IR constants of a trace</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">maxside</td><td class="param_default">100</td><td class="param_desc">Max. number of side traces of a root trace</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="param_name">maxsnap</td><td class="param_default">500</td><td class="param_desc">Max. number of snapshots for a trace</td></tr>[m
[31m-<tr class="even separate">[m
[31m-<td class="param_name">hotloop</td><td class="param_default">56</td><td class="param_desc">Number of iterations to detect a hot loop or hot call</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="param_name">hotexit</td><td class="param_default">10</td><td class="param_desc">Number of taken exits to start a side trace</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">tryside</td><td class="param_default">4</td><td class="param_desc">Number of attempts to compile a side trace</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="param_name">instunroll</td><td class="param_default">4</td><td class="param_desc">Max. unroll factor for instable loops</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">loopunroll</td><td class="param_default">15</td><td class="param_desc">Max. unroll factor for loop ops in side traces</td></tr>[m
[31m-<tr class="odd">[m
[31m-<td class="param_name">callunroll</td><td class="param_default">3</td><td class="param_desc">Max. unroll factor for pseudo-recursive calls</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">recunroll</td><td class="param_default">2</td><td class="param_desc">Min. unroll factor for true recursion</td></tr>[m
[31m-<tr class="odd separate">[m
[31m-<td class="param_name">sizemcode</td><td class="param_default">32</td><td class="param_desc">Size of each machine code area in KBytes (Windows: 64K)</td></tr>[m
[31m-<tr class="even">[m
[31m-<td class="param_name">maxmcode</td><td class="param_default">512</td><td class="param_desc">Max. total size of all machine code areas in KBytes</td></tr>[m
[31m-</table>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/status.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/status.html[m
[1mdeleted file mode 100644[m
[1mindex 6f57db1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/doc/status.html[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Status</title>[m
[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">[m
[31m-<meta name="Author" content="Mike Pall">[m
[31m-<meta name="Copyright" content="Copyright (C) 2005-2016, Mike Pall">[m
[31m-<meta name="Language" content="en">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">[m
[31m-<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">[m
[31m-<style type="text/css">[m
[31m-ul li { padding-bottom: 0.3em; }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<div id="site">[m
[31m-<a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>[m
[31m-</div>[m
[31m-<div id="head">[m
[31m-<h1>Status</h1>[m
[31m-</div>[m
[31m-<div id="nav">[m
[31m-<ul><li>[m
[31m-<a href="luajit.html">LuaJIT</a>[m
[31m-<ul><li>[m
[31m-<a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="install.html">Installation</a>[m
[31m-</li><li>[m
[31m-<a href="running.html">Running</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="extensions.html">Extensions</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi.html">FFI Library</a>[m
[31m-<ul><li>[m
[31m-<a href="ext_ffi_tutorial.html">FFI Tutorial</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_api.html">ffi.* API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_ffi_semantics.html">FFI Semantics</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="ext_jit.html">jit.* Library</a>[m
[31m-</li><li>[m
[31m-<a href="ext_c_api.html">Lua/C API</a>[m
[31m-</li><li>[m
[31m-<a href="ext_profiler.html">Profiler</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a class="current" href="status.html">Status</a>[m
[31m-<ul><li>[m
[31m-<a href="changes.html">Changes</a>[m
[31m-</li></ul>[m
[31m-</li><li>[m
[31m-<a href="faq.html">FAQ</a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>[m
[31m-</li><li>[m
[31m-<a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>[m
[31m-</li></ul>[m
[31m-</div>[m
[31m-<div id="main">[m
[31m-<p>[m
[31m-<span style="color: #0000c0;">LuaJIT&nbsp;2.0</span> is the current[m
[31m-<span style="color: #0000c0;">stable branch</span>. This branch is in[m
[31m-feature-freeze &mdash; new features will only be added to LuaJIT&nbsp;2.1.[m
[31m-</p>[m
[31m-[m
[31m-<h2>Current Status</h2>[m
[31m-<p>[m
[31m-LuaJIT ought to run all Lua&nbsp;5.1-compatible source code just fine.[m
[31m-It's considered a serious bug if the VM crashes or produces unexpected[m
[31m-results &mdash; please report this.[m
[31m-</p>[m
[31m-<p>[m
[31m-Known incompatibilities and issues in LuaJIT&nbsp;2.0:[m
[31m-</p>[m
[31m-<ul>[m
[31m-<li>[m
[31m-There are some differences in <b>implementation-defined</b> behavior.[m
[31m-These either have a good reason, are arbitrary design choices[m
[31m-or are due to quirks in the VM. The latter cases may get fixed if a[m
[31m-demonstrable need is shown.[m
[31m-</li>[m
[31m-<li>[m
[31m-The Lua <b>debug API</b> is missing a couple of features (return[m
[31m-hooks for non-Lua functions) and shows slightly different behavior[m
[31m-in LuaJIT (no per-coroutine hooks, no tail call counting).[m
[31m-</li>[m
[31m-<li>[m
[31m-Some checks are missing in the JIT-compiled code for obscure situations[m
[31m-with <b>open upvalues aliasing</b> one of the SSA slots later on (or[m
[31m-vice versa). Bonus points, if you can find a real world test case for[m
[31m-this.[m
[31m-</li>[m
[31m-<li>[m
[31m-Currently some <b>out-of-memory</b> errors from <b>on-trace code</b> are not[m
[31m-handled correctly. The error may fall through an on-trace[m
[31m-<tt>pcall</tt> or it may be passed on to the function set with[m
[31m-<tt>lua_atpanic</tt> on x64. This issue will be fixed with the new[m
[31m-garbage collector.[m
[31m-</li>[m
[31m-</ul>[m
[31m-<br class="flush">[m
[31m-</div>[m
[31m-<div id="foot">[m
[31m-<hr class="hide">[m
[31m-Copyright &copy; 2005-2016 Mike Pall[m
[31m-<span class="noprint">[m
[31m-&middot;[m
[31m-<a href="contact.html">Contact</a>[m
[31m-</span>[m
[31m-</div>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm.h[m
[1mdeleted file mode 100644[m
[1mindex 0fa69ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm.h[m
[1m+++ /dev/null[m
[36m@@ -1,456 +0,0 @@[m
[31m-/*[m
[31m-** DynASM ARM encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"arm"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. */[m
[31m-enum {[m
[31m-  DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT,[m
[31m-  /* The following actions need a buffer position. */[m
[31m-  DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,[m
[31m-  /* The following actions also have an argument. */[m
[31m-  DASM_REL_PC, DASM_LABEL_PC,[m
[31m-  DASM_IMM, DASM_IMM12, DASM_IMM16, DASM_IMML8, DASM_IMML12, DASM_IMMV8,[m
[31m-  DASM__MAX[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_REL	0x15000000[m
[31m-#define DASM_S_UNDEF_LG		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned int *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-static int dasm_imm12(unsigned int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; i < 16; i++, n = (n << 2) | (n >> 30))[m
[31m-    if (n <= 255) return (int)(n + (i << 8));[m
[31m-  return -1;[m
[31m-}[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    unsigned int ins = *p++;[m
[31m-    unsigned int action = (ins >> 16);[m
[31m-    if (action >= DASM__MAX) {[m
[31m-      ofs += 4;[m
[31m-    } else {[m
[31m-      int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0;[m
[31m-      switch (action) {[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      case DASM_SECTION:[m
[31m-	n = (ins & 255); CK(n < D->maxsection, RANGE_SEC);[m
[31m-	D->section = &D->sections[n]; goto stop;[m
[31m-      case DASM_ESC: p++; ofs += 4; break;[m
[31m-      case DASM_REL_EXT: break;[m
[31m-      case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break;[m
[31m-      case DASM_REL_LG:[m
[31m-	n = (ins & 2047) - 10; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl += 10; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG:[m
[31m-	pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos;[m
[31m-	}[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_IMM:[m
[31m-      case DASM_IMM16:[m
[31m-#ifdef DASM_CHECKS[m
[31m-	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);[m
[31m-	if ((ins & 0x8000))[m
[31m-	  CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-	else[m
[31m-	  CK((n>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMMV8:[m
[31m-	CK((n & 3) == 0, RANGE_I);[m
[31m-	n >>= 2;[m
[31m-      case DASM_IMML8:[m
[31m-      case DASM_IMML12:[m
[31m-	CK(n >= 0 ? ((n>>((ins>>5)&31)) == 0) :[m
[31m-		    (((-n)>>((ins>>5)&31)) == 0), RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM12:[m
[31m-	CK(dasm_imm12((unsigned int)n) != -1, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_REL_EXT: break;[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;[m
[31m-	case DASM_REL_LG: case DASM_REL_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;[m
[31m-	case DASM_IMM: case DASM_IMM12: case DASM_IMM16:[m
[31m-	case DASM_IMML8: case DASM_IMML12: case DASM_IMMV8: pos++; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  char *base = (char *)buffer;[m
[31m-  unsigned int *cp = (unsigned int *)buffer;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: *cp++ = *p++; break;[m
[31m-	case DASM_REL_EXT:[m
[31m-	  n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins&2047), !(ins&2048));[m
[31m-	  goto patchrel;[m
[31m-	case DASM_ALIGN:[m
[31m-	  ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000;[m
[31m-	  break;[m
[31m-	case DASM_REL_LG:[m
[31m-	  CK(n >= 0, UNDEF_LG);[m
[31m-	case DASM_REL_PC:[m
[31m-	  CK(n >= 0, UNDEF_PC);[m
[31m-	  n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) - 4;[m
[31m-	patchrel:[m
[31m-	  if ((ins & 0x800) == 0) {[m
[31m-	    CK((n & 3) == 0 && ((n+0x02000000) >> 26) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n >> 2) & 0x00ffffff);[m
[31m-	  } else if ((ins & 0x1000)) {[m
[31m-	    CK((n & 3) == 0 && -256 <= n && n <= 256, RANGE_REL);[m
[31m-	    goto patchimml8;[m
[31m-	  } else if ((ins & 0x2000) == 0) {[m
[31m-	    CK((n & 3) == 0 && -4096 <= n && n <= 4096, RANGE_REL);[m
[31m-	    goto patchimml;[m
[31m-	  } else {[m
[31m-	    CK((n & 3) == 0 && -1020 <= n && n <= 1020, RANGE_REL);[m
[31m-	    n >>= 2;[m
[31m-	    goto patchimml;[m
[31m-	  }[m
[31m-	  break;[m
[31m-	case DASM_LABEL_LG:[m
[31m-	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);[m
[31m-	  break;[m
[31m-	case DASM_LABEL_PC: break;[m
[31m-	case DASM_IMM:[m
[31m-	  cp[-1] |= ((n>>((ins>>10)&31)) & ((1<<((ins>>5)&31))-1)) << (ins&31);[m
[31m-	  break;[m
[31m-	case DASM_IMM12:[m
[31m-	  cp[-1] |= dasm_imm12((unsigned int)n);[m
[31m-	  break;[m
[31m-	case DASM_IMM16:[m
[31m-	  cp[-1] |= ((n & 0xf000) << 4) | (n & 0x0fff);[m
[31m-	  break;[m
[31m-	case DASM_IMML8: patchimml8:[m
[31m-	  cp[-1] |= n >= 0 ? (0x00800000 | (n & 0x0f) | ((n & 0xf0) << 4)) :[m
[31m-			     ((-n & 0x0f) | ((-n & 0xf0) << 4));[m
[31m-	  break;[m
[31m-	case DASM_IMML12: case DASM_IMMV8: patchimml:[m
[31m-	  cp[-1] |= n >= 0 ? (0x00800000 | n) : (-n);[m
[31m-	  break;[m
[31m-	default: *cp++ = ins; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != (char *)cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm.lua[m
[1mdeleted file mode 100644[m
[1mindex e2ed922..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1125 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM ARM module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	"arm",[m
[31m-  description =	"DynASM ARM module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, setmetatable, rawget = assert, setmetatable, rawget[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local match, gmatch, gsub = _s.match, _s.gmatch, _s.gsub[m
[31m-local concat, sort, insert = table.concat, table.sort, table.insert[m
[31m-local bit = bit or require("bit")[m
[31m-local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift[m
[31m-local ror, tohex = bit.ror, bit.tohex[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  "STOP", "SECTION", "ESC", "REL_EXT",[m
[31m-  "ALIGN", "REL_LG", "LABEL_LG",[m
[31m-  "REL_PC", "LABEL_PC", "IMM", "IMM12", "IMM16", "IMML8", "IMML12", "IMMV8",[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number.[m
[31m-local map_action = {}[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  map_action[name] = n-1[m
[31m-end[m
[31m-[m
[31m--- Action list buffer.[m
[31m-local actlist = {}[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  if nn == 0 then nn = 1; actlist[0] = map_action.STOP end[m
[31m-  out:write("static const unsigned int ", name, "[", nn, "] = {\n")[m
[31m-  for i = 1,nn-1 do[m
[31m-    assert(out:write("0x", tohex(actlist[i]), ",\n"))[m
[31m-  end[m
[31m-  assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add word to action list.[m
[31m-local function wputxw(n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, val, a, num)[m
[31m-  local w = assert(map_action[action], "bad action name `"..action.."'")[m
[31m-  wputxw(w * 0x10000 + (val or 0))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  if #actlist == actargs[1] then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped word.[m
[31m-local function wputw(n)[m
[31m-  if n <= 0x000fffff then waction("ESC") end[m
[31m-  wputxw(n)[m
[31m-end[m
[31m-[m
[31m--- Reserve position for word.[m
[31m-local function wpos()[m
[31m-  local pos = #actlist+1[m
[31m-  actlist[pos] = ""[m
[31m-  return pos[m
[31m-end[m
[31m-[m
[31m--- Store word to reserved position.[m
[31m-local function wputpos(pos, n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  if n <= 0x000fffff then[m
[31m-    insert(actlist, pos+1, n)[m
[31m-    n = map_action.ESC * 0x10000[m
[31m-  end[m
[31m-  actlist[pos] = n[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 20[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 2047 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  ", prefix, t[i], ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = 0[m
[31m-local map_extern_ = {}[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n > 2047 then werror("too many extern labels") end[m
[31m-  next_extern = n + 1[m
[31m-  t[name] = n[m
[31m-  map_extern_[n] = name[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write(format("  %s\n", map_extern_[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write("  \"", map_extern_[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-[m
[31m--- Ext. register name -> int. name.[m
[31m-local map_archdef = { sp = "r13", lr = "r14", pc = "r15", }[m
[31m-[m
[31m--- Int. register name -> ext. name.[m
[31m-local map_reg_rev = { r13 = "sp", r14 = "lr", r15 = "pc", }[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for Dt... macros).[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  return map_reg_rev[s] or s[m
[31m-end[m
[31m-[m
[31m-local map_shift = { lsl = 0, lsr = 1, asr = 2, ror = 3, }[m
[31m-[m
[31m-local map_cond = {[m
[31m-  eq = 0, ne = 1, cs = 2, cc = 3, mi = 4, pl = 5, vs = 6, vc = 7,[m
[31m-  hi = 8, ls = 9, ge = 10, lt = 11, gt = 12, le = 13, al = 14,[m
[31m-  hs = 2, lo = 3,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Template strings for ARM instructions.[m
[31m-local map_op = {[m
[31m-  -- Basic data processing instructions.[m
[31m-  and_3 = "e0000000DNPs",[m
[31m-  eor_3 = "e0200000DNPs",[m
[31m-  sub_3 = "e0400000DNPs",[m
[31m-  rsb_3 = "e0600000DNPs",[m
[31m-  add_3 = "e0800000DNPs",[m
[31m-  adc_3 = "e0a00000DNPs",[m
[31m-  sbc_3 = "e0c00000DNPs",[m
[31m-  rsc_3 = "e0e00000DNPs",[m
[31m-  tst_2 = "e1100000NP",[m
[31m-  teq_2 = "e1300000NP",[m
[31m-  cmp_2 = "e1500000NP",[m
[31m-  cmn_2 = "e1700000NP",[m
[31m-  orr_3 = "e1800000DNPs",[m
[31m-  mov_2 = "e1a00000DPs",[m
[31m-  bic_3 = "e1c00000DNPs",[m
[31m-  mvn_2 = "e1e00000DPs",[m
[31m-[m
[31m-  and_4 = "e0000000DNMps",[m
[31m-  eor_4 = "e0200000DNMps",[m
[31m-  sub_4 = "e0400000DNMps",[m
[31m-  rsb_4 = "e0600000DNMps",[m
[31m-  add_4 = "e0800000DNMps",[m
[31m-  adc_4 = "e0a00000DNMps",[m
[31m-  sbc_4 = "e0c00000DNMps",[m
[31m-  rsc_4 = "e0e00000DNMps",[m
[31m-  tst_3 = "e1100000NMp",[m
[31m-  teq_3 = "e1300000NMp",[m
[31m-  cmp_3 = "e1500000NMp",[m
[31m-  cmn_3 = "e1700000NMp",[m
[31m-  orr_4 = "e1800000DNMps",[m
[31m-  mov_3 = "e1a00000DMps",[m
[31m-  bic_4 = "e1c00000DNMps",[m
[31m-  mvn_3 = "e1e00000DMps",[m
[31m-[m
[31m-  lsl_3 = "e1a00000DMws",[m
[31m-  lsr_3 = "e1a00020DMws",[m
[31m-  asr_3 = "e1a00040DMws",[m
[31m-  ror_3 = "e1a00060DMws",[m
[31m-  rrx_2 = "e1a00060DMs",[m
[31m-[m
[31m-  -- Multiply and multiply-accumulate.[m
[31m-  mul_3 = "e0000090NMSs",[m
[31m-  mla_4 = "e0200090NMSDs",[m
[31m-  umaal_4 = "e0400090DNMSs",	-- v6[m
[31m-  mls_4 = "e0600090DNMSs",	-- v6T2[m
[31m-  umull_4 = "e0800090DNMSs",[m
[31m-  umlal_4 = "e0a00090DNMSs",[m
[31m-  smull_4 = "e0c00090DNMSs",[m
[31m-  smlal_4 = "e0e00090DNMSs",[m
[31m-[m
[31m-  -- Halfword multiply and multiply-accumulate.[m
[31m-  smlabb_4 = "e1000080NMSD",	-- v5TE[m
[31m-  smlatb_4 = "e10000a0NMSD",	-- v5TE[m
[31m-  smlabt_4 = "e10000c0NMSD",	-- v5TE[m
[31m-  smlatt_4 = "e10000e0NMSD",	-- v5TE[m
[31m-  smlawb_4 = "e1200080NMSD",	-- v5TE[m
[31m-  smulwb_3 = "e12000a0NMS",	-- v5TE[m
[31m-  smlawt_4 = "e12000c0NMSD",	-- v5TE[m
[31m-  smulwt_3 = "e12000e0NMS",	-- v5TE[m
[31m-  smlalbb_4 = "e1400080NMSD",	-- v5TE[m
[31m-  smlaltb_4 = "e14000a0NMSD",	-- v5TE[m
[31m-  smlalbt_4 = "e14000c0NMSD",	-- v5TE[m
[31m-  smlaltt_4 = "e14000e0NMSD",	-- v5TE[m
[31m-  smulbb_3 = "e1600080NMS",	-- v5TE[m
[31m-  smultb_3 = "e16000a0NMS",	-- v5TE[m
[31m-  smulbt_3 = "e16000c0NMS",	-- v5TE[m
[31m-  smultt_3 = "e16000e0NMS",	-- v5TE[m
[31m-[m
[31m-  -- Miscellaneous data processing instructions.[m
[31m-  clz_2 = "e16f0f10DM", -- v5T[m
[31m-  rev_2 = "e6bf0f30DM", -- v6[m
[31m-  rev16_2 = "e6bf0fb0DM", -- v6[m
[31m-  revsh_2 = "e6ff0fb0DM", -- v6[m
[31m-  sel_3 = "e6800fb0DNM", -- v6[m
[31m-  usad8_3 = "e780f010NMS", -- v6[m
[31m-  usada8_4 = "e7800010NMSD", -- v6[m
[31m-  rbit_2 = "e6ff0f30DM", -- v6T2[m
[31m-  movw_2 = "e3000000DW", -- v6T2[m
[31m-  movt_2 = "e3400000DW", -- v6T2[m
[31m-  -- Note: the X encodes width-1, not width.[m
[31m-  sbfx_4 = "e7a00050DMvX", -- v6T2[m
[31m-  ubfx_4 = "e7e00050DMvX", -- v6T2[m
[31m-  -- Note: the X encodes the msb field, not the width.[m
[31m-  bfc_3 = "e7c0001fDvX", -- v6T2[m
[31m-  bfi_4 = "e7c00010DMvX", -- v6T2[m
[31m-[m
[31m-  -- Packing and unpacking instructions.[m
[31m-  pkhbt_3 = "e6800010DNM", pkhbt_4 = "e6800010DNMv", -- v6[m
[31m-  pkhtb_3 = "e6800050DNM", pkhtb_4 = "e6800050DNMv", -- v6[m
[31m-  sxtab_3 = "e6a00070DNM", sxtab_4 = "e6a00070DNMv", -- v6[m
[31m-  sxtab16_3 = "e6800070DNM", sxtab16_4 = "e6800070DNMv", -- v6[m
[31m-  sxtah_3 = "e6b00070DNM", sxtah_4 = "e6b00070DNMv", -- v6[m
[31m-  sxtb_2 = "e6af0070DM", sxtb_3 = "e6af0070DMv", -- v6[m
[31m-  sxtb16_2 = "e68f0070DM", sxtb16_3 = "e68f0070DMv", -- v6[m
[31m-  sxth_2 = "e6bf0070DM", sxth_3 = "e6bf0070DMv", -- v6[m
[31m-  uxtab_3 = "e6e00070DNM", uxtab_4 = "e6e00070DNMv", -- v6[m
[31m-  uxtab16_3 = "e6c00070DNM", uxtab16_4 = "e6c00070DNMv", -- v6[m
[31m-  uxtah_3 = "e6f00070DNM", uxtah_4 = "e6f00070DNMv", -- v6[m
[31m-  uxtb_2 = "e6ef0070DM", uxtb_3 = "e6ef0070DMv", -- v6[m
[31m-  uxtb16_2 = "e6cf0070DM", uxtb16_3 = "e6cf0070DMv", -- v6[m
[31m-  uxth_2 = "e6ff0070DM", uxth_3 = "e6ff0070DMv", -- v6[m
[31m-[m
[31m-  -- Saturating instructions.[m
[31m-  qadd_3 = "e1000050DMN",	-- v5TE[m
[31m-  qsub_3 = "e1200050DMN",	-- v5TE[m
[31m-  qdadd_3 = "e1400050DMN",	-- v5TE[m
[31m-  qdsub_3 = "e1600050DMN",	-- v5TE[m
[31m-  -- Note: the X for ssat* encodes sat_imm-1, not sat_imm.[m
[31m-  ssat_3 = "e6a00010DXM", ssat_4 = "e6a00010DXMp", -- v6[m
[31m-  usat_3 = "e6e00010DXM", usat_4 = "e6e00010DXMp", -- v6[m
[31m-  ssat16_3 = "e6a00f30DXM", -- v6[m
[31m-  usat16_3 = "e6e00f30DXM", -- v6[m
[31m-[m
[31m-  -- Parallel addition and subtraction.[m
[31m-  sadd16_3 = "e6100f10DNM", -- v6[m
[31m-  sasx_3 = "e6100f30DNM", -- v6[m
[31m-  ssax_3 = "e6100f50DNM", -- v6[m
[31m-  ssub16_3 = "e6100f70DNM", -- v6[m
[31m-  sadd8_3 = "e6100f90DNM", -- v6[m
[31m-  ssub8_3 = "e6100ff0DNM", -- v6[m
[31m-  qadd16_3 = "e6200f10DNM", -- v6[m
[31m-  qasx_3 = "e6200f30DNM", -- v6[m
[31m-  qsax_3 = "e6200f50DNM", -- v6[m
[31m-  qsub16_3 = "e6200f70DNM", -- v6[m
[31m-  qadd8_3 = "e6200f90DNM", -- v6[m
[31m-  qsub8_3 = "e6200ff0DNM", -- v6[m
[31m-  shadd16_3 = "e6300f10DNM", -- v6[m
[31m-  shasx_3 = "e6300f30DNM", -- v6[m
[31m-  shsax_3 = "e6300f50DNM", -- v6[m
[31m-  shsub16_3 = "e6300f70DNM", -- v6[m
[31m-  shadd8_3 = "e6300f90DNM", -- v6[m
[31m-  shsub8_3 = "e6300ff0DNM", -- v6[m
[31m-  uadd16_3 = "e6500f10DNM", -- v6[m
[31m-  uasx_3 = "e6500f30DNM", -- v6[m
[31m-  usax_3 = "e6500f50DNM", -- v6[m
[31m-  usub16_3 = "e6500f70DNM", -- v6[m
[31m-  uadd8_3 = "e6500f90DNM", -- v6[m
[31m-  usub8_3 = "e6500ff0DNM", -- v6[m
[31m-  uqadd16_3 = "e6600f10DNM", -- v6[m
[31m-  uqasx_3 = "e6600f30DNM", -- v6[m
[31m-  uqsax_3 = "e6600f50DNM", -- v6[m
[31m-  uqsub16_3 = "e6600f70DNM", -- v6[m
[31m-  uqadd8_3 = "e6600f90DNM", -- v6[m
[31m-  uqsub8_3 = "e6600ff0DNM", -- v6[m
[31m-  uhadd16_3 = "e6700f10DNM", -- v6[m
[31m-  uhasx_3 = "e6700f30DNM", -- v6[m
[31m-  uhsax_3 = "e6700f50DNM", -- v6[m
[31m-  uhsub16_3 = "e6700f70DNM", -- v6[m
[31m-  uhadd8_3 = "e6700f90DNM", -- v6[m
[31m-  uhsub8_3 = "e6700ff0DNM", -- v6[m
[31m-[m
[31m-  -- Load/store instructions.[m
[31m-  str_2 = "e4000000DL", str_3 = "e4000000DL", str_4 = "e4000000DL",[m
[31m-  strb_2 = "e4400000DL", strb_3 = "e4400000DL", strb_4 = "e4400000DL",[m
[31m-  ldr_2 = "e4100000DL", ldr_3 = "e4100000DL", ldr_4 = "e4100000DL",[m
[31m-  ldrb_2 = "e4500000DL", ldrb_3 = "e4500000DL", ldrb_4 = "e4500000DL",[m
[31m-  strh_2 = "e00000b0DL", strh_3 = "e00000b0DL",[m
[31m-  ldrh_2 = "e01000b0DL", ldrh_3 = "e01000b0DL",[m
[31m-  ldrd_2 = "e00000d0DL", ldrd_3 = "e00000d0DL", -- v5TE[m
[31m-  ldrsb_2 = "e01000d0DL", ldrsb_3 = "e01000d0DL",[m
[31m-  strd_2 = "e00000f0DL", strd_3 = "e00000f0DL", -- v5TE[m
[31m-  ldrsh_2 = "e01000f0DL", ldrsh_3 = "e01000f0DL",[m
[31m-[m
[31m-  ldm_2 = "e8900000oR", ldmia_2 = "e8900000oR", ldmfd_2 = "e8900000oR",[m
[31m-  ldmda_2 = "e8100000oR", ldmfa_2 = "e8100000oR",[m
[31m-  ldmdb_2 = "e9100000oR", ldmea_2 = "e9100000oR",[m
[31m-  ldmib_2 = "e9900000oR", ldmed_2 = "e9900000oR",[m
[31m-  stm_2 = "e8800000oR", stmia_2 = "e8800000oR", stmfd_2 = "e8800000oR",[m
[31m-  stmda_2 = "e8000000oR", stmfa_2 = "e8000000oR",[m
[31m-  stmdb_2 = "e9000000oR", stmea_2 = "e9000000oR",[m
[31m-  stmib_2 = "e9800000oR", stmed_2 = "e9800000oR",[m
[31m-  pop_1 = "e8bd0000R", push_1 = "e92d0000R",[m
[31m-[m
[31m-  -- Branch instructions.[m
[31m-  b_1 = "ea000000B",[m
[31m-  bl_1 = "eb000000B",[m
[31m-  blx_1 = "e12fff30C",[m
[31m-  bx_1 = "e12fff10M",[m
[31m-[m
[31m-  -- Miscellaneous instructions.[m
[31m-  nop_0 = "e1a00000",[m
[31m-  mrs_1 = "e10f0000D",[m
[31m-  bkpt_1 = "e1200070K", -- v5T[m
[31m-  svc_1 = "ef000000T", swi_1 = "ef000000T",[m
[31m-  ud_0 = "e7f001f0",[m
[31m-[m
[31m-  -- VFP instructions.[m
[31m-  ["vadd.f32_3"] = "ee300a00dnm",[m
[31m-  ["vadd.f64_3"] = "ee300b00Gdnm",[m
[31m-  ["vsub.f32_3"] = "ee300a40dnm",[m
[31m-  ["vsub.f64_3"] = "ee300b40Gdnm",[m
[31m-  ["vmul.f32_3"] = "ee200a00dnm",[m
[31m-  ["vmul.f64_3"] = "ee200b00Gdnm",[m
[31m-  ["vnmul.f32_3"] = "ee200a40dnm",[m
[31m-  ["vnmul.f64_3"] = "ee200b40Gdnm",[m
[31m-  ["vmla.f32_3"] = "ee000a00dnm",[m
[31m-  ["vmla.f64_3"] = "ee000b00Gdnm",[m
[31m-  ["vmls.f32_3"] = "ee000a40dnm",[m
[31m-  ["vmls.f64_3"] = "ee000b40Gdnm",[m
[31m-  ["vnmla.f32_3"] = "ee100a40dnm",[m
[31m-  ["vnmla.f64_3"] = "ee100b40Gdnm",[m
[31m-  ["vnmls.f32_3"] = "ee100a00dnm",[m
[31m-  ["vnmls.f64_3"] = "ee100b00Gdnm",[m
[31m-  ["vdiv.f32_3"] = "ee800a00dnm",[m
[31m-  ["vdiv.f64_3"] = "ee800b00Gdnm",[m
[31m-[m
[31m-  ["vabs.f32_2"] = "eeb00ac0dm",[m
[31m-  ["vabs.f64_2"] = "eeb00bc0Gdm",[m
[31m-  ["vneg.f32_2"] = "eeb10a40dm",[m
[31m-  ["vneg.f64_2"] = "eeb10b40Gdm",[m
[31m-  ["vsqrt.f32_2"] = "eeb10ac0dm",[m
[31m-  ["vsqrt.f64_2"] = "eeb10bc0Gdm",[m
[31m-  ["vcmp.f32_2"] = "eeb40a40dm",[m
[31m-  ["vcmp.f64_2"] = "eeb40b40Gdm",[m
[31m-  ["vcmpe.f32_2"] = "eeb40ac0dm",[m
[31m-  ["vcmpe.f64_2"] = "eeb40bc0Gdm",[m
[31m-  ["vcmpz.f32_1"] = "eeb50a40d",[m
[31m-  ["vcmpz.f64_1"] = "eeb50b40Gd",[m
[31m-  ["vcmpze.f32_1"] = "eeb50ac0d",[m
[31m-  ["vcmpze.f64_1"] = "eeb50bc0Gd",[m
[31m-[m
[31m-  vldr_2 = "ed100a00dl|ed100b00Gdl",[m
[31m-  vstr_2 = "ed000a00dl|ed000b00Gdl",[m
[31m-  vldm_2 = "ec900a00or",[m
[31m-  vldmia_2 = "ec900a00or",[m
[31m-  vldmdb_2 = "ed100a00or",[m
[31m-  vpop_1 = "ecbd0a00r",[m
[31m-  vstm_2 = "ec800a00or",[m
[31m-  vstmia_2 = "ec800a00or",[m
[31m-  vstmdb_2 = "ed000a00or",[m
[31m-  vpush_1 = "ed2d0a00r",[m
[31m-[m
[31m-  ["vmov.f32_2"] = "eeb00a40dm|eeb00a00dY",	-- #imm is VFPv3 only[m
[31m-  ["vmov.f64_2"] = "eeb00b40Gdm|eeb00b00GdY",	-- #imm is VFPv3 only[m
[31m-  vmov_2 = "ee100a10Dn|ee000a10nD",[m
[31m-  vmov_3 = "ec500a10DNm|ec400a10mDN|ec500b10GDNm|ec400b10GmDN",[m
[31m-[m
[31m-  vmrs_0 = "eef1fa10",[m
[31m-  vmrs_1 = "eef10a10D",[m
[31m-  vmsr_1 = "eee10a10D",[m
[31m-[m
[31m-  ["vcvt.s32.f32_2"] = "eebd0ac0dm",[m
[31m-  ["vcvt.s32.f64_2"] = "eebd0bc0dGm",[m
[31m-  ["vcvt.u32.f32_2"] = "eebc0ac0dm",[m
[31m-  ["vcvt.u32.f64_2"] = "eebc0bc0dGm",[m
[31m-  ["vcvtr.s32.f32_2"] = "eebd0a40dm",[m
[31m-  ["vcvtr.s32.f64_2"] = "eebd0b40dGm",[m
[31m-  ["vcvtr.u32.f32_2"] = "eebc0a40dm",[m
[31m-  ["vcvtr.u32.f64_2"] = "eebc0b40dGm",[m
[31m-  ["vcvt.f32.s32_2"] = "eeb80ac0dm",[m
[31m-  ["vcvt.f64.s32_2"] = "eeb80bc0GdFm",[m
[31m-  ["vcvt.f32.u32_2"] = "eeb80a40dm",[m
[31m-  ["vcvt.f64.u32_2"] = "eeb80b40GdFm",[m
[31m-  ["vcvt.f32.f64_2"] = "eeb70bc0dGm",[m
[31m-  ["vcvt.f64.f32_2"] = "eeb70ac0GdFm",[m
[31m-[m
[31m-  -- VFPv4 only:[m
[31m-  ["vfma.f32_3"] = "eea00a00dnm",[m
[31m-  ["vfma.f64_3"] = "eea00b00Gdnm",[m
[31m-  ["vfms.f32_3"] = "eea00a40dnm",[m
[31m-  ["vfms.f64_3"] = "eea00b40Gdnm",[m
[31m-  ["vfnma.f32_3"] = "ee900a40dnm",[m
[31m-  ["vfnma.f64_3"] = "ee900b40Gdnm",[m
[31m-  ["vfnms.f32_3"] = "ee900a00dnm",[m
[31m-  ["vfnms.f64_3"] = "ee900b00Gdnm",[m
[31m-[m
[31m-  -- NYI: Advanced SIMD instructions.[m
[31m-[m
[31m-  -- NYI: I have no need for these instructions right now:[m
[31m-  -- swp, swpb, strex, ldrex, strexd, ldrexd, strexb, ldrexb, strexh, ldrexh[m
[31m-  -- msr, nopv6, yield, wfe, wfi, sev, dbg, bxj, smc, srs, rfe[m
[31m-  -- cps, setend, pli, pld, pldw, clrex, dsb, dmb, isb[m
[31m-  -- stc, ldc, mcr, mcr2, mrc, mrc2, mcrr, mcrr2, mrrc, mrrc2, cdp, cdp2[m
[31m-}[m
[31m-[m
[31m--- Add mnemonics for "s" variants.[m
[31m-do[m
[31m-  local t = {}[m
[31m-  for k,v in pairs(map_op) do[m
[31m-    if sub(v, -1) == "s" then[m
[31m-      local v2 = sub(v, 1, 2)..char(byte(v, 3)+1)..sub(v, 4, -2)[m
[31m-      t[sub(k, 1, -3).."s"..sub(k, -2)] = v2[m
[31m-    end[m
[31m-  end[m
[31m-  for k,v in pairs(t) do[m
[31m-    map_op[k] = v[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function parse_gpr(expr)[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(r1?[0-9])$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    if not reg then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    expr = reg[m
[31m-  end[m
[31m-  local r = match(expr, "^r(1?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 15 then return r, tp end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_gpr_pm(expr)[m
[31m-  local pm, expr2 = match(expr, "^([+-]?)(.*)$")[m
[31m-  return parse_gpr(expr2), (pm == "-")[m
[31m-end[m
[31m-[m
[31m-local function parse_vr(expr, tp)[m
[31m-  local t, r = match(expr, "^([sd])([0-9]+)$")[m
[31m-  if t == tp then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then[m
[31m-      if t == "s" then return shr(r, 1), band(r, 1) end[m
[31m-      return band(r, 15), shr(r, 4)[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_reglist(reglist)[m
[31m-  reglist = match(reglist, "^{%s*([^}]*)}$")[m
[31m-  if not reglist then werror("register list expected") end[m
[31m-  local rr = 0[m
[31m-  for p in gmatch(reglist..",", "%s*([^,]*),") do[m
[31m-    local rbit = shl(1, parse_gpr(gsub(p, "%s+$", "")))[m
[31m-    if band(rr, rbit) ~= 0 then[m
[31m-      werror("duplicate register `"..p.."'")[m
[31m-    end[m
[31m-    rr = rr + rbit[m
[31m-  end[m
[31m-  return rr[m
[31m-end[m
[31m-[m
[31m-local function parse_vrlist(reglist)[m
[31m-  local ta, ra, tb, rb = match(reglist,[m
[31m-			   "^{%s*([sd])([0-9]+)%s*%-%s*([sd])([0-9]+)%s*}$")[m
[31m-  ra, rb = tonumber(ra), tonumber(rb)[m
[31m-  if ta and ta == tb and ra and rb and ra <= 31 and rb <= 31 and ra <= rb then[m
[31m-    local nr = rb+1 - ra[m
[31m-    if ta == "s" then[m
[31m-      return shl(shr(ra,1),12)+shl(band(ra,1),22) + nr[m
[31m-    else[m
[31m-      return shl(band(ra,15),12)+shl(shr(ra,4),22) + nr*2 + 0x100[m
[31m-    end[m
[31m-  end[m
[31m-  werror("register list expected")[m
[31m-end[m
[31m-[m
[31m-local function parse_imm(imm, bits, shift, scale, signed)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n then[m
[31m-      if signed then[m
[31m-	local s = sar(m, bits-1)[m
[31m-	if s == 0 then return shl(m, shift)[m
[31m-	elseif s == -1 then return shl(m + shl(1, bits), shift) end[m
[31m-      else[m
[31m-	if sar(m, bits) == 0 then return shl(m, shift) end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm12(imm)[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    local m = band(n)[m
[31m-    for i=0,-15,-1 do[m
[31m-      if shr(m, 8) == 0 then return m + shl(band(i, 15), 8) end[m
[31m-      m = ror(m, 2)[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM12", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm16(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    if shr(n, 16) == 0 then return band(n, 0x0fff) + shl(band(n, 0xf000), 4) end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM16", 32*16, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm_load(imm, ext)[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    if ext then[m
[31m-      if n >= -255 and n <= 255 then[m
[31m-	local up = 0x00800000[m
[31m-	if n < 0 then n = -n; up = 0 end[m
[31m-	return shl(band(n, 0xf0), 4) + band(n, 0x0f) + up[m
[31m-      end[m
[31m-    else[m
[31m-      if n >= -4095 and n <= 4095 then[m
[31m-	if n >= 0 then return n+0x00800000 end[m
[31m-	return -n[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction(ext and "IMML8" or "IMML12", 32768 + shl(ext and 8 or 12, 5), imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_shift(shift, gprok)[m
[31m-  if shift == "rrx" then[m
[31m-    return 3 * 32[m
[31m-  else[m
[31m-    local s, s2 = match(shift, "^(%S+)%s*(.*)$")[m
[31m-    s = map_shift[s][m
[31m-    if not s then werror("expected shift operand") end[m
[31m-    if sub(s2, 1, 1) == "#" then[m
[31m-      return parse_imm(s2, 5, 7, 0, false) + shl(s, 5)[m
[31m-    else[m
[31m-      if not gprok then werror("expected immediate shift operand") end[m
[31m-      return shl(parse_gpr(s2), 8) + shl(s, 5) + 16[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_label(label, def)[m
[31m-  local prefix = sub(label, 1, 2)[m
[31m-  -- =>label (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "PC", 0, sub(label, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "LG", map_global[sub(label, 3)][m
[31m-  end[m
[31m-  if def then[m
[31m-    -- [1-9] (local label definition)[m
[31m-    if match(label, "^[1-9]$") then[m
[31m-      return "LG", 10+tonumber(label)[m
[31m-    end[m
[31m-  else[m
[31m-    -- [<>][1-9] (local label reference)[m
[31m-    local dir, lnum = match(label, "^([<>])([1-9])$")[m
[31m-    if dir then -- Fwd: 1-9, Bkwd: 11-19.[m
[31m-      return "LG", lnum + (dir == ">" and 0 or 10)[m
[31m-    end[m
[31m-    -- extern label (extern label reference)[m
[31m-    local extname = match(label, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      return "EXT", map_extern[extname][m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad label `"..label.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_load(params, nparams, n, op)[m
[31m-  local oplo = band(op, 255)[m
[31m-  local ext, ldrd = (oplo ~= 0), (oplo == 208)[m
[31m-  local d[m
[31m-  if (ldrd or oplo == 240) then[m
[31m-    d = band(shr(op, 12), 15)[m
[31m-    if band(d, 1) ~= 0 then werror("odd destination register") end[m
[31m-  end[m
[31m-  local pn = params[n][m
[31m-  local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$")[m
[31m-  local p2 = params[n+1][m
[31m-  if not p1 then[m
[31m-    if not p2 then[m
[31m-      if match(pn, "^[<>=%-]") or match(pn, "^extern%s+") then[m
[31m-	local mode, n, s = parse_label(pn, false)[m
[31m-	waction("REL_"..mode, n + (ext and 0x1800 or 0x0800), s, 1)[m
[31m-	return op + 15 * 65536 + 0x01000000 + (ext and 0x00400000 or 0)[m
[31m-      end[m
[31m-      local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$")[m
[31m-      if reg and tailr ~= "" then[m
[31m-	local d, tp = parse_gpr(reg)[m
[31m-	if tp then[m
[31m-	  waction(ext and "IMML8" or "IMML12", 32768 + 32*(ext and 8 or 12),[m
[31m-		  format(tp.ctypefmt, tailr))[m
[31m-	  return op + shl(d, 16) + 0x01000000 + (ext and 0x00400000 or 0)[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("expected address operand")[m
[31m-  end[m
[31m-  if wb == "!" then op = op + 0x00200000 end[m
[31m-  if p2 then[m
[31m-    if wb == "!" then werror("bad use of '!'") end[m
[31m-    local p3 = params[n+2][m
[31m-    op = op + shl(parse_gpr(p1), 16)[m
[31m-    local imm = match(p2, "^#(.*)$")[m
[31m-    if imm then[m
[31m-      local m = parse_imm_load(imm, ext)[m
[31m-      if p3 then werror("too many parameters") end[m
[31m-      op = op + m + (ext and 0x00400000 or 0)[m
[31m-    else[m
[31m-      local m, neg = parse_gpr_pm(p2)[m
[31m-      if ldrd and (m == d or m-1 == d) then werror("register conflict") end[m
[31m-      op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000)[m
[31m-      if p3 then op = op + parse_shift(p3) end[m
[31m-    end[m
[31m-  else[m
[31m-    local p1a, p2 = match(p1, "^([^,%s]*)%s*(.*)$")[m
[31m-    op = op + shl(parse_gpr(p1a), 16) + 0x01000000[m
[31m-    if p2 ~= "" then[m
[31m-      local imm = match(p2, "^,%s*#(.*)$")[m
[31m-      if imm then[m
[31m-	local m = parse_imm_load(imm, ext)[m
[31m-	op = op + m + (ext and 0x00400000 or 0)[m
[31m-      else[m
[31m-	local p2a, p3 = match(p2, "^,%s*([^,%s]*)%s*,?%s*(.*)$")[m
[31m-	local m, neg = parse_gpr_pm(p2a)[m
[31m-	if ldrd and (m == d or m-1 == d) then werror("register conflict") end[m
[31m-	op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000)[m
[31m-	if p3 ~= "" then[m
[31m-	  if ext then werror("too many parameters") end[m
[31m-	  op = op + parse_shift(p3)[m
[31m-	end[m
[31m-      end[m
[31m-    else[m
[31m-      if wb == "!" then werror("bad use of '!'") end[m
[31m-      op = op + (ext and 0x00c00000 or 0x00800000)[m
[31m-    end[m
[31m-  end[m
[31m-  return op[m
[31m-end[m
[31m-[m
[31m-local function parse_vload(q)[m
[31m-  local reg, imm = match(q, "^%[%s*([^,%s]*)%s*(.*)%]$")[m
[31m-  if reg then[m
[31m-    local d = shl(parse_gpr(reg), 16)[m
[31m-    if imm == "" then return d end[m
[31m-    imm = match(imm, "^,%s*#(.*)$")[m
[31m-    if imm then[m
[31m-      local n = tonumber(imm)[m
[31m-      if n then[m
[31m-	if n >= -1020 and n <= 1020 and n%4 == 0 then[m
[31m-	  return d + (n >= 0 and n/4+0x00800000 or -n/4)[m
[31m-	end[m
[31m-	werror("out of range immediate `"..imm.."'")[m
[31m-      else[m
[31m-	waction("IMMV8", 32768 + 32*8, imm)[m
[31m-	return d[m
[31m-      end[m
[31m-    end[m
[31m-  else[m
[31m-    if match(q, "^[<>=%-]") or match(q, "^extern%s+") then[m
[31m-      local mode, n, s = parse_label(q, false)[m
[31m-      waction("REL_"..mode, n + 0x2800, s, 1)[m
[31m-      return 15 * 65536[m
[31m-    end[m
[31m-    local reg, tailr = match(q, "^([%w_:]+)%s*(.*)$")[m
[31m-    if reg and tailr ~= "" then[m
[31m-      local d, tp = parse_gpr(reg)[m
[31m-      if tp then[m
[31m-	waction("IMMV8", 32768 + 32*8, format(tp.ctypefmt, tailr))[m
[31m-	return shl(d, 16)[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("expected address operand")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-local function parse_template(params, template, nparams, pos)[m
[31m-  local op = tonumber(sub(template, 1, 8), 16)[m
[31m-  local n = 1[m
[31m-  local vr = "s"[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for p in gmatch(sub(template, 9), ".") do[m
[31m-    local q = params[n][m
[31m-    if p == "D" then[m
[31m-      op = op + shl(parse_gpr(q), 12); n = n + 1[m
[31m-    elseif p == "N" then[m
[31m-      op = op + shl(parse_gpr(q), 16); n = n + 1[m
[31m-    elseif p == "S" then[m
[31m-      op = op + shl(parse_gpr(q), 8); n = n + 1[m
[31m-    elseif p == "M" then[m
[31m-      op = op + parse_gpr(q); n = n + 1[m
[31m-    elseif p == "d" then[m
[31m-      local r,h = parse_vr(q, vr); op = op+shl(r,12)+shl(h,22); n = n + 1[m
[31m-    elseif p == "n" then[m
[31m-      local r,h = parse_vr(q, vr); op = op+shl(r,16)+shl(h,7); n = n + 1[m
[31m-    elseif p == "m" then[m
[31m-      local r,h = parse_vr(q, vr); op = op+r+shl(h,5); n = n + 1[m
[31m-    elseif p == "P" then[m
[31m-      local imm = match(q, "^#(.*)$")[m
[31m-      if imm then[m
[31m-	op = op + parse_imm12(imm) + 0x02000000[m
[31m-      else[m
[31m-	op = op + parse_gpr(q)[m
[31m-      end[m
[31m-      n = n + 1[m
[31m-    elseif p == "p" then[m
[31m-      op = op + parse_shift(q, true); n = n + 1[m
[31m-    elseif p == "L" then[m
[31m-      op = parse_load(params, nparams, n, op)[m
[31m-    elseif p == "l" then[m
[31m-      op = op + parse_vload(q)[m
[31m-    elseif p == "B" then[m
[31m-      local mode, n, s = parse_label(q, false)[m
[31m-      waction("REL_"..mode, n, s, 1)[m
[31m-    elseif p == "C" then -- blx gpr vs. blx label.[m
[31m-      if match(q, "^([%w_]+):(r1?[0-9])$") or match(q, "^r(1?[0-9])$") then[m
[31m-	op = op + parse_gpr(q)[m
[31m-      else[m
[31m-	if op < 0xe0000000 then werror("unconditional instruction") end[m
[31m-	local mode, n, s = parse_label(q, false)[m
[31m-	waction("REL_"..mode, n, s, 1)[m
[31m-	op = 0xfa000000[m
[31m-      end[m
[31m-    elseif p == "F" then[m
[31m-      vr = "s"[m
[31m-    elseif p == "G" then[m
[31m-      vr = "d"[m
[31m-    elseif p == "o" then[m
[31m-      local r, wb = match(q, "^([^!]*)(!?)$")[m
[31m-      op = op + shl(parse_gpr(r), 16) + (wb == "!" and 0x00200000 or 0)[m
[31m-      n = n + 1[m
[31m-    elseif p == "R" then[m
[31m-      op = op + parse_reglist(q); n = n + 1[m
[31m-    elseif p == "r" then[m
[31m-      op = op + parse_vrlist(q); n = n + 1[m
[31m-    elseif p == "W" then[m
[31m-      op = op + parse_imm16(q); n = n + 1[m
[31m-    elseif p == "v" then[m
[31m-      op = op + parse_imm(q, 5, 7, 0, false); n = n + 1[m
[31m-    elseif p == "w" then[m
[31m-      local imm = match(q, "^#(.*)$")[m
[31m-      if imm then[m
[31m-	op = op + parse_imm(q, 5, 7, 0, false); n = n + 1[m
[31m-      else[m
[31m-	op = op + shl(parse_gpr(q), 8) + 16[m
[31m-      end[m
[31m-    elseif p == "X" then[m
[31m-      op = op + parse_imm(q, 5, 16, 0, false); n = n + 1[m
[31m-    elseif p == "Y" then[m
[31m-      local imm = tonumber(match(q, "^#(.*)$")); n = n + 1[m
[31m-      if not imm or shr(imm, 8) ~= 0 then[m
[31m-	werror("bad immediate operand")[m
[31m-      end[m
[31m-      op = op + shl(band(imm, 0xf0), 12) + band(imm, 0x0f)[m
[31m-    elseif p == "K" then[m
[31m-      local imm = tonumber(match(q, "^#(.*)$")); n = n + 1[m
[31m-      if not imm or shr(imm, 16) ~= 0 then[m
[31m-	werror("bad immediate operand")[m
[31m-      end[m
[31m-      op = op + shl(band(imm, 0xfff0), 4) + band(imm, 0x000f)[m
[31m-    elseif p == "T" then[m
[31m-      op = op + parse_imm(q, 24, 0, 0, false); n = n + 1[m
[31m-    elseif p == "s" then[m
[31m-      -- Ignored.[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-  end[m
[31m-  wputpos(pos, op)[m
[31m-end[m
[31m-[m
[31m-map_op[".template__"] = function(params, template, nparams)[m
[31m-  if not params then return template:gsub("%x%x%x%x%x%x%x%x", "") end[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 3 positions.[m
[31m-  if secpos+3 > maxsecpos then wflush() end[m
[31m-  local pos = wpos()[m
[31m-  local lpos, apos, spos = #actlist, #actargs, secpos[m
[31m-[m
[31m-  local ok, err[m
[31m-  for t in gmatch(template, "[^|]+") do[m
[31m-    ok, err = pcall(parse_template, params, t, nparams, pos)[m
[31m-    if ok then return end[m
[31m-    secpos = spos[m
[31m-    actlist[lpos+1] = nil[m
[31m-    actlist[lpos+2] = nil[m
[31m-    actlist[lpos+3] = nil[m
[31m-    actargs[apos+1] = nil[m
[31m-    actargs[apos+2] = nil[m
[31m-    actargs[apos+3] = nil[m
[31m-  end[m
[31m-  error(err, 0)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_1"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local mode, n, s = parse_label(params[1], true)[m
[31m-  if mode == "EXT" then werror("bad label definition") end[m
[31m-  waction("LABEL_"..mode, n, s, 1)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-map_op[".long_*"] = function(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local n = tonumber(p)[m
[31m-    if not n then werror("bad immediate `"..p.."'") end[m
[31m-    if n < 0 then n = n + 2^32 end[m
[31m-    wputw(n)[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1])[m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION", num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = function(t, k)[m
[31m-    local v = map_coreop[k][m
[31m-    if v then return v end[m
[31m-    local k1, cc, k2 = match(k, "^(.-)(..)([._].*)$")[m
[31m-    local cv = map_cond[cc][m
[31m-    if cv then[m
[31m-      local v = rawget(t, k1..k2)[m
[31m-      if type(v) == "string" then[m
[31m-	local scv = format("%x", cv)[m
[31m-	return gsub(scv..sub(v, 2), "|e", "|"..scv)[m
[31m-      end[m
[31m-    end[m
[31m-  end })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm64.h[m
[1mdeleted file mode 100644[m
[1mindex d64e60a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm64.h[m
[1m+++ /dev/null[m
[36m@@ -1,518 +0,0 @@[m
[31m-/*[m
[31m-** DynASM ARM64 encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"arm64"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. */[m
[31m-enum {[m
[31m-  DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT,[m
[31m-  /* The following actions need a buffer position. */[m
[31m-  DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,[m
[31m-  /* The following actions also have an argument. */[m
[31m-  DASM_REL_PC, DASM_LABEL_PC,[m
[31m-  DASM_IMM, DASM_IMM6, DASM_IMM12, DASM_IMM13W, DASM_IMM13X, DASM_IMML,[m
[31m-  DASM__MAX[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_REL	0x15000000[m
[31m-#define DASM_S_UNDEF_LG		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned int *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-static int dasm_imm12(unsigned int n)[m
[31m-{[m
[31m-  if ((n >> 12) == 0)[m
[31m-    return n;[m
[31m-  else if ((n & 0xff000fff) == 0)[m
[31m-    return (n >> 12) | 0x1000;[m
[31m-  else[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-static int dasm_ffs(unsigned long long x)[m
[31m-{[m
[31m-  int n = -1;[m
[31m-  while (x) { x >>= 1; n++; }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-static int dasm_imm13(int lo, int hi)[m
[31m-{[m
[31m-  int inv = 0, w = 64, s = 0xfff, xa, xb;[m
[31m-  unsigned long long n = (((unsigned long long)hi) << 32) | (unsigned int)lo;[m
[31m-  unsigned long long m = 1ULL, a, b, c;[m
[31m-  if (n & 1) { n = ~n; inv = 1; }[m
[31m-  a = n & -n; b = (n+a)&-(n+a); c = (n+a-b)&-(n+a-b);[m
[31m-  xa = dasm_ffs(a); xb = dasm_ffs(b);[m
[31m-  if (c) {[m
[31m-    w = dasm_ffs(c) - xa;[m
[31m-    if (w == 32) m = 0x0000000100000001UL;[m
[31m-    else if (w == 16) m = 0x0001000100010001UL;[m
[31m-    else if (w == 8) m = 0x0101010101010101UL;[m
[31m-    else if (w == 4) m = 0x1111111111111111UL;[m
[31m-    else if (w == 2) m = 0x5555555555555555UL;[m
[31m-    else return -1;[m
[31m-    s = (-2*w & 0x3f) - 1;[m
[31m-  } else if (!a) {[m
[31m-    return -1;[m
[31m-  } else if (xb == -1) {[m
[31m-    xb = 64;[m
[31m-  }[m
[31m-  if ((b-a) * m != n) return -1;[m
[31m-  if (inv) {[m
[31m-    return ((w - xb) << 6) | (s+w+xa-xb);[m
[31m-  } else {[m
[31m-    return ((w - xa) << 6) | (s+xb-xa);[m
[31m-  }[m
[31m-  return -1;[m
[31m-}[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    unsigned int ins = *p++;[m
[31m-    unsigned int action = (ins >> 16);[m
[31m-    if (action >= DASM__MAX) {[m
[31m-      ofs += 4;[m
[31m-    } else {[m
[31m-      int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0;[m
[31m-      switch (action) {[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      case DASM_SECTION:[m
[31m-	n = (ins & 255); CK(n < D->maxsection, RANGE_SEC);[m
[31m-	D->section = &D->sections[n]; goto stop;[m
[31m-      case DASM_ESC: p++; ofs += 4; break;[m
[31m-      case DASM_REL_EXT: break;[m
[31m-      case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break;[m
[31m-      case DASM_REL_LG:[m
[31m-	n = (ins & 2047) - 10; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl += 10; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG:[m
[31m-	pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos;[m
[31m-	}[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_IMM:[m
[31m-	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);[m
[31m-	n >>= ((ins>>10)&31);[m
[31m-#ifdef DASM_CHECKS[m
[31m-	if ((ins & 0x8000))[m
[31m-	  CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-	else[m
[31m-	  CK((n>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM6:[m
[31m-	CK((n >> 6) == 0, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM12:[m
[31m-	CK(dasm_imm12((unsigned int)n) != -1, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM13W:[m
[31m-	CK(dasm_imm13(n, n) != -1, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMM13X: {[m
[31m-	int m = va_arg(ap, int);[m
[31m-	CK(dasm_imm13(n, m) != -1, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	b[pos++] = m;[m
[31m-	break;[m
[31m-	}[m
[31m-      case DASM_IMML: {[m
[31m-#ifdef DASM_CHECKS[m
[31m-	int scale = (p[-2] >> 30);[m
[31m-	CK((!(n & ((1<<scale)-1)) && (unsigned int)(n>>scale) < 4096) ||[m
[31m-	   (unsigned int)(n+256) < 512, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_REL_EXT: break;[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;[m
[31m-	case DASM_REL_LG: case DASM_REL_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;[m
[31m-	case DASM_IMM: case DASM_IMM6: case DASM_IMM12: case DASM_IMM13W:[m
[31m-	case DASM_IMML: pos++; break;[m
[31m-	case DASM_IMM13X: pos += 2; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  char *base = (char *)buffer;[m
[31m-  unsigned int *cp = (unsigned int *)buffer;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: *cp++ = *p++; break;[m
[31m-	case DASM_REL_EXT:[m
[31m-	  n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins&2047), !(ins&2048));[m
[31m-	  goto patchrel;[m
[31m-	case DASM_ALIGN:[m
[31m-	  ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000;[m
[31m-	  break;[m
[31m-	case DASM_REL_LG:[m
[31m-	  CK(n >= 0, UNDEF_LG);[m
[31m-	case DASM_REL_PC:[m
[31m-	  CK(n >= 0, UNDEF_PC);[m
[31m-	  n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) + 4;[m
[31m-	patchrel:[m
[31m-	  if (!(ins & 0xf800)) {  /* B, BL */[m
[31m-	    CK((n & 3) == 0 && ((n+0x08000000) >> 28) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n >> 2) & 0x03ffffff);[m
[31m-	  } else if ((ins & 0x800)) {  /* B.cond, CBZ, CBNZ, LDR* literal */[m
[31m-	    CK((n & 3) == 0 && ((n+0x00100000) >> 21) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n << 3) & 0x00ffffe0);[m
[31m-	  } else if ((ins & 0x3000) == 0x2000) {  /* ADR */[m
[31m-	    CK(((n+0x00100000) >> 21) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n << 3) & 0x00ffffe0) | ((n & 3) << 29);[m
[31m-	  } else if ((ins & 0x3000) == 0x3000) {  /* ADRP */[m
[31m-	    cp[-1] |= ((n >> 9) & 0x00ffffe0) | (((n >> 12) & 3) << 29);[m
[31m-	  } else if ((ins & 0x1000)) {  /* TBZ, TBNZ */[m
[31m-	    CK((n & 3) == 0 && ((n+0x00008000) >> 16) == 0, RANGE_REL);[m
[31m-	    cp[-1] |= ((n << 3) & 0x0007ffe0);[m
[31m-	  }[m
[31m-	  break;[m
[31m-	case DASM_LABEL_LG:[m
[31m-	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);[m
[31m-	  break;[m
[31m-	case DASM_LABEL_PC: break;[m
[31m-	case DASM_IMM:[m
[31m-	  cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31);[m
[31m-	  break;[m
[31m-	case DASM_IMM6:[m
[31m-	  cp[-1] |= ((n&31) << 19) | ((n&32) << 26);[m
[31m-	  break;[m
[31m-	case DASM_IMM12:[m
[31m-	  cp[-1] |= (dasm_imm12((unsigned int)n) << 10);[m
[31m-	  break;[m
[31m-	case DASM_IMM13W:[m
[31m-	  cp[-1] |= (dasm_imm13(n, n) << 10);[m
[31m-	  break;[m
[31m-	case DASM_IMM13X:[m
[31m-	  cp[-1] |= (dasm_imm13(n, *b++) << 10);[m
[31m-	  break;[m
[31m-	case DASM_IMML: {[m
[31m-	  int scale = (p[-2] >> 30);[m
[31m-	  cp[-1] |= (!(n & ((1<<scale)-1)) && (unsigned int)(n>>scale) < 4096) ?[m
[31m-	    ((n << (10-scale)) | 0x01000000) : ((n & 511) << 12);[m
[31m-	  break;[m
[31m-	  }[m
[31m-	default: *cp++ = ins; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != (char *)cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm64.lua[m
[1mdeleted file mode 100644[m
[1mindex 4a7d8df..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_arm64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1166 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM ARM64 module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	"arm",[m
[31m-  description =	"DynASM ARM64 module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, setmetatable, rawget = assert, setmetatable, rawget[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local match, gmatch, gsub = _s.match, _s.gmatch, _s.gsub[m
[31m-local concat, sort, insert = table.concat, table.sort, table.insert[m
[31m-local bit = bit or require("bit")[m
[31m-local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift[m
[31m-local ror, tohex = bit.ror, bit.tohex[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  "STOP", "SECTION", "ESC", "REL_EXT",[m
[31m-  "ALIGN", "REL_LG", "LABEL_LG",[m
[31m-  "REL_PC", "LABEL_PC", "IMM", "IMM6", "IMM12", "IMM13W", "IMM13X", "IMML",[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number.[m
[31m-local map_action = {}[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  map_action[name] = n-1[m
[31m-end[m
[31m-[m
[31m--- Action list buffer.[m
[31m-local actlist = {}[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  if nn == 0 then nn = 1; actlist[0] = map_action.STOP end[m
[31m-  out:write("static const unsigned int ", name, "[", nn, "] = {\n")[m
[31m-  for i = 1,nn-1 do[m
[31m-    assert(out:write("0x", tohex(actlist[i]), ",\n"))[m
[31m-  end[m
[31m-  assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add word to action list.[m
[31m-local function wputxw(n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, val, a, num)[m
[31m-  local w = assert(map_action[action], "bad action name `"..action.."'")[m
[31m-  wputxw(w * 0x10000 + (val or 0))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  if #actlist == actargs[1] then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped word.[m
[31m-local function wputw(n)[m
[31m-  if n <= 0x000fffff then waction("ESC") end[m
[31m-  wputxw(n)[m
[31m-end[m
[31m-[m
[31m--- Reserve position for word.[m
[31m-local function wpos()[m
[31m-  local pos = #actlist+1[m
[31m-  actlist[pos] = ""[m
[31m-  return pos[m
[31m-end[m
[31m-[m
[31m--- Store word to reserved position.[m
[31m-local function wputpos(pos, n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  if n <= 0x000fffff then[m
[31m-    insert(actlist, pos+1, n)[m
[31m-    n = map_action.ESC * 0x10000[m
[31m-  end[m
[31m-  actlist[pos] = n[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 20[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 2047 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  ", prefix, t[i], ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = 0[m
[31m-local map_extern_ = {}[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n > 2047 then werror("too many extern labels") end[m
[31m-  next_extern = n + 1[m
[31m-  t[name] = n[m
[31m-  map_extern_[n] = name[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write(format("  %s\n", map_extern_[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write("  \"", map_extern_[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-[m
[31m--- Ext. register name -> int. name.[m
[31m-local map_archdef = { xzr = "@x31", wzr = "@w31", lr = "x30", }[m
[31m-[m
[31m--- Int. register name -> ext. name.[m
[31m-local map_reg_rev = { ["@x31"] = "xzr", ["@w31"] = "wzr", x30 = "lr", }[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for Dt... macros).[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  return map_reg_rev[s] or s[m
[31m-end[m
[31m-[m
[31m-local map_shift = { lsl = 0, lsr = 1, asr = 2, }[m
[31m-[m
[31m-local map_extend = {[m
[31m-  uxtb = 0, uxth = 1, uxtw = 2, uxtx = 3,[m
[31m-  sxtb = 4, sxth = 5, sxtw = 6, sxtx = 7,[m
[31m-}[m
[31m-[m
[31m-local map_cond = {[m
[31m-  eq = 0, ne = 1, cs = 2, cc = 3, mi = 4, pl = 5, vs = 6, vc = 7,[m
[31m-  hi = 8, ls = 9, ge = 10, lt = 11, gt = 12, le = 13, al = 14,[m
[31m-  hs = 2, lo = 3,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local parse_reg_type[m
[31m-[m
[31m-local function parse_reg(expr)[m
[31m-  if not expr then werror("expected register name") end[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(@?%l%d+)$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    if not reg then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    expr = reg[m
[31m-  end[m
[31m-  local ok31, rt, r = match(expr, "^(@?)([xwqdshb])([123]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 30 or (r == 31 and ok31 ~= "" or (rt ~= "w" and rt ~= "x")) then[m
[31m-      if not parse_reg_type then[m
[31m-	parse_reg_type = rt[m
[31m-      elseif parse_reg_type ~= rt then[m
[31m-	werror("register size mismatch")[m
[31m-      end[m
[31m-      return r, tp[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_reg_base(expr)[m
[31m-  if expr == "sp" then return 0x3e0 end[m
[31m-  local base, tp = parse_reg(expr)[m
[31m-  if parse_reg_type ~= "x" then werror("bad register type") end[m
[31m-  parse_reg_type = false[m
[31m-  return shl(base, 5), tp[m
[31m-end[m
[31m-[m
[31m-local parse_ctx = {}[m
[31m-[m
[31m-local loadenv = setfenv and function(s)[m
[31m-  local code = loadstring(s, "")[m
[31m-  if code then setfenv(code, parse_ctx) end[m
[31m-  return code[m
[31m-end or function(s)[m
[31m-  return load(s, "", nil, parse_ctx)[m
[31m-end[m
[31m-[m
[31m--- Try to parse simple arithmetic, too, since some basic ops are aliases.[m
[31m-local function parse_number(n)[m
[31m-  local x = tonumber(n)[m
[31m-  if x then return x end[m
[31m-  local code = loadenv("return "..n)[m
[31m-  if code then[m
[31m-    local ok, y = pcall(code)[m
[31m-    if ok then return y end[m
[31m-  end[m
[31m-  return nil[m
[31m-end[m
[31m-[m
[31m-local function parse_imm(imm, bits, shift, scale, signed)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n then[m
[31m-      if signed then[m
[31m-	local s = sar(m, bits-1)[m
[31m-	if s == 0 then return shl(m, shift)[m
[31m-	elseif s == -1 then return shl(m + shl(1, bits), shift) end[m
[31m-      else[m
[31m-	if sar(m, bits) == 0 then return shl(m, shift) end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm12(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    if shr(n, 12) == 0 then[m
[31m-      return shl(n, 10)[m
[31m-    elseif band(n, 0xff000fff) == 0 then[m
[31m-      return shr(n, 2) + 0x00400000[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM12", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm13(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  local r64 = parse_reg_type == "x"[m
[31m-  if n and n % 1 == 0 and n >= 0 and n <= 0xffffffff then[m
[31m-    local inv = false[m
[31m-    if band(n, 1) == 1 then n = bit.bnot(n); inv = true end[m
[31m-    local t = {}[m
[31m-    for i=1,32 do t[i] = band(n, 1); n = shr(n, 1) end[m
[31m-    local b = table.concat(t)[m
[31m-    b = b..(r64 and (inv and "1" or "0"):rep(32) or b)[m
[31m-    local p0, p1, p0a, p1a = b:match("^(0+)(1+)(0*)(1*)")[m
[31m-    if p0 then[m
[31m-      local w = p1a == "" and (r64 and 64 or 32) or #p1+#p0a[m
[31m-      if band(w, w-1) == 0 and b == b:sub(1, w):rep(64/w) then[m
[31m-	local s = band(-2*w, 0x3f) - 1[m
[31m-	if w == 64 then s = s + 0x1000 end[m
[31m-	if inv then[m
[31m-	  return shl(w-#p1-#p0, 16) + shl(s+w-#p1, 10)[m
[31m-	else[m
[31m-	  return shl(w-#p0, 16) + shl(s+#p1, 10)[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  elseif r64 then[m
[31m-    waction("IMM13X", 0, format("(unsigned int)(%s)", imm))[m
[31m-    actargs[#actargs+1] = format("(unsigned int)((unsigned long long)(%s)>>32)", imm)[m
[31m-    return 0[m
[31m-  else[m
[31m-    waction("IMM13W", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm6(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    if n >= 0 and n <= 63 then[m
[31m-      return shl(band(n, 0x1f), 19) + (n >= 32 and 0x80000000 or 0)[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMM6", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_imm_load(imm, scale)[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n and m >= 0 and m < 0x1000 then[m
[31m-      return shl(m, 10) + 0x01000000 -- Scaled, unsigned 12 bit offset.[m
[31m-    elseif n >= -256 and n < 256 then[m
[31m-      return shl(band(n, 511), 12) -- Unscaled, signed 9 bit offset.[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    waction("IMML", 0, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_fpimm(imm)[m
[31m-  imm = match(imm, "^#(.*)$")[m
[31m-  if not imm then werror("expected immediate operand") end[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    local m, e = math.frexp(n)[m
[31m-    local s, e2 = 0, band(e-2, 7)[m
[31m-    if m < 0 then m = -m; s = 0x00100000 end[m
[31m-    m = m*32-16[m
[31m-    if m % 1 == 0 and m >= 0 and m <= 15 and sar(shl(e2, 29), 29)+2 == e then[m
[31m-      return s + shl(e2, 17) + shl(m, 13)[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  else[m
[31m-    werror("NYI fpimm action")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_shift(expr)[m
[31m-  local s, s2 = match(expr, "^(%S+)%s*(.*)$")[m
[31m-  s = map_shift[s][m
[31m-  if not s then werror("expected shift operand") end[m
[31m-  return parse_imm(s2, 6, 10, 0, false) + shl(s, 22)[m
[31m-end[m
[31m-[m
[31m-local function parse_lslx16(expr)[m
[31m-  local n = match(expr, "^lsl%s*#(%d+)$")[m
[31m-  n = tonumber(n)[m
[31m-  if not n then werror("expected shift operand") end[m
[31m-  if band(n, parse_reg_type == "x" and 0xffffffcf or 0xffffffef) ~= 0 then[m
[31m-    werror("bad shift amount")[m
[31m-  end[m
[31m-  return shl(n, 17)[m
[31m-end[m
[31m-[m
[31m-local function parse_extend(expr)[m
[31m-  local s, s2 = match(expr, "^(%S+)%s*(.*)$")[m
[31m-  if s == "lsl" then[m
[31m-    s = parse_reg_type == "x" and 3 or 2[m
[31m-  else[m
[31m-    s = map_extend[s][m
[31m-  end[m
[31m-  if not s then werror("expected extend operand") end[m
[31m-  return (s2 == "" and 0 or parse_imm(s2, 3, 10, 0, false)) + shl(s, 13)[m
[31m-end[m
[31m-[m
[31m-local function parse_cond(expr, inv)[m
[31m-  local c = map_cond[expr][m
[31m-  if not c then werror("expected condition operand") end[m
[31m-  return shl(bit.bxor(c, inv), 12)[m
[31m-end[m
[31m-[m
[31m-local function parse_load(params, nparams, n, op)[m
[31m-  if params[n+2] then werror("too many operands") end[m
[31m-  local pn, p2 = params[n], params[n+1][m
[31m-  local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$")[m
[31m-  if not p1 then[m
[31m-    if not p2 then[m
[31m-      local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$")[m
[31m-      if reg and tailr ~= "" then[m
[31m-	local base, tp = parse_reg_base(reg)[m
[31m-	if tp then[m
[31m-	  waction("IMML", 0, format(tp.ctypefmt, tailr))[m
[31m-	  return op + base[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("expected address operand")[m
[31m-  end[m
[31m-  local scale = shr(op, 30)[m
[31m-  if p2 then[m
[31m-    if wb == "!" then werror("bad use of '!'") end[m
[31m-    op = op + parse_reg_base(p1) + parse_imm(p2, 9, 12, 0, true) + 0x400[m
[31m-  elseif wb == "!" then[m
[31m-    local p1a, p2a = match(p1, "^([^,%s]*)%s*,%s*(.*)$")[m
[31m-    if not p1a then werror("bad use of '!'") end[m
[31m-    op = op + parse_reg_base(p1a) + parse_imm(p2a, 9, 12, 0, true) + 0xc00[m
[31m-  else[m
[31m-    local p1a, p2a = match(p1, "^([^,%s]*)%s*(.*)$")[m
[31m-    op = op + parse_reg_base(p1a)[m
[31m-    if p2a ~= "" then[m
[31m-      local imm = match(p2a, "^,%s*#(.*)$")[m
[31m-      if imm then[m
[31m-	op = op + parse_imm_load(imm, scale)[m
[31m-      else[m
[31m-	local p2b, p3b, p3s = match(p2a, "^,%s*([^,%s]*)%s*,?%s*(%S*)%s*(.*)$")[m
[31m-	op = op + shl(parse_reg(p2b), 16) + 0x00200800[m
[31m-	if parse_reg_type ~= "x" and parse_reg_type ~= "w" then[m
[31m-	  werror("bad index register type")[m
[31m-	end[m
[31m-	if p3b == "" then[m
[31m-	  if parse_reg_type ~= "x" then werror("bad index register type") end[m
[31m-	  op = op + 0x6000[m
[31m-	else[m
[31m-	  if p3s == "" or p3s == "#0" then[m
[31m-	  elseif p3s == "#"..scale then[m
[31m-	    op = op + 0x1000[m
[31m-	  else[m
[31m-	    werror("bad scale")[m
[31m-	  end[m
[31m-	  if parse_reg_type == "x" then[m
[31m-	    if p3b == "lsl" and p3s ~= "" then op = op + 0x6000[m
[31m-	    elseif p3b == "sxtx" then op = op + 0xe000[m
[31m-	    else[m
[31m-	      werror("bad extend/shift specifier")[m
[31m-	    end[m
[31m-	  else[m
[31m-	    if p3b == "uxtw" then op = op + 0x4000[m
[31m-	    elseif p3b == "sxtw" then op = op + 0xc000[m
[31m-	    else[m
[31m-	      werror("bad extend/shift specifier")[m
[31m-	    end[m
[31m-	  end[m
[31m-	end[m
[31m-      end[m
[31m-    else[m
[31m-      if wb == "!" then werror("bad use of '!'") end[m
[31m-      op = op + 0x01000000[m
[31m-    end[m
[31m-  end[m
[31m-  return op[m
[31m-end[m
[31m-[m
[31m-local function parse_load_pair(params, nparams, n, op)[m
[31m-  if params[n+2] then werror("too many operands") end[m
[31m-  local pn, p2 = params[n], params[n+1][m
[31m-  local scale = shr(op, 30) == 0 and 2 or 3[m
[31m-  local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$")[m
[31m-  if not p1 then[m
[31m-    if not p2 then[m
[31m-      local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$")[m
[31m-      if reg and tailr ~= "" then[m
[31m-	local base, tp = parse_reg_base(reg)[m
[31m-	if tp then[m
[31m-	  waction("IMM", 32768+7*32+15+scale*1024, format(tp.ctypefmt, tailr))[m
[31m-	  return op + base + 0x01000000[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("expected address operand")[m
[31m-  end[m
[31m-  if p2 then[m
[31m-    if wb == "!" then werror("bad use of '!'") end[m
[31m-    op = op + 0x00800000[m
[31m-  else[m
[31m-    local p1a, p2a = match(p1, "^([^,%s]*)%s*,%s*(.*)$")[m
[31m-    if p1a then p1, p2 = p1a, p2a else p2 = "#0" end[m
[31m-    op = op + (wb == "!" and 0x01800000 or 0x01000000)[m
[31m-  end[m
[31m-  return op + parse_reg_base(p1) + parse_imm(p2, 7, 15, scale, true)[m
[31m-end[m
[31m-[m
[31m-local function parse_label(label, def)[m
[31m-  local prefix = sub(label, 1, 2)[m
[31m-  -- =>label (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "PC", 0, sub(label, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "LG", map_global[sub(label, 3)][m
[31m-  end[m
[31m-  if def then[m
[31m-    -- [1-9] (local label definition)[m
[31m-    if match(label, "^[1-9]$") then[m
[31m-      return "LG", 10+tonumber(label)[m
[31m-    end[m
[31m-  else[m
[31m-    -- [<>][1-9] (local label reference)[m
[31m-    local dir, lnum = match(label, "^([<>])([1-9])$")[m
[31m-    if dir then -- Fwd: 1-9, Bkwd: 11-19.[m
[31m-      return "LG", lnum + (dir == ">" and 0 or 10)[m
[31m-    end[m
[31m-    -- extern label (extern label reference)[m
[31m-    local extname = match(label, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      return "EXT", map_extern[extname][m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad label `"..label.."'")[m
[31m-end[m
[31m-[m
[31m-local function branch_type(op)[m
[31m-  if band(op, 0x7c000000) == 0x14000000 then return 0 -- B, BL[m
[31m-  elseif shr(op, 24) == 0x54 or band(op, 0x7e000000) == 0x34000000 or[m
[31m-	 band(op, 0x3b000000) == 0x18000000 then[m
[31m-    return 0x800 -- B.cond, CBZ, CBNZ, LDR* literal[m
[31m-  elseif band(op, 0x7e000000) == 0x36000000 then return 0x1000 -- TBZ, TBNZ[m
[31m-  elseif band(op, 0x9f000000) == 0x10000000 then return 0x2000 -- ADR[m
[31m-  elseif band(op, 0x9f000000) == band(0x90000000) then return 0x3000 -- ADRP[m
[31m-  else[m
[31m-    assert(false, "unknown branch type")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_op, op_template[m
[31m-[m
[31m-local function op_alias(opname, f)[m
[31m-  return function(params, nparams)[m
[31m-    if not params then return "-> "..opname:sub(1, -3) end[m
[31m-    f(params, nparams)[m
[31m-    op_template(params, map_op[opname], nparams)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function alias_bfx(p)[m
[31m-  p[4] = "#("..p[3]:sub(2)..")+("..p[4]:sub(2)..")-1"[m
[31m-end[m
[31m-[m
[31m-local function alias_bfiz(p)[m
[31m-  parse_reg(p[1])[m
[31m-  if parse_reg_type == "w" then[m
[31m-    p[3] = "#-("..p[3]:sub(2)..")%32"[m
[31m-    p[4] = "#("..p[4]:sub(2)..")-1"[m
[31m-  else[m
[31m-    p[3] = "#-("..p[3]:sub(2)..")%64"[m
[31m-    p[4] = "#("..p[4]:sub(2)..")-1"[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local alias_lslimm = op_alias("ubfm_4", function(p)[m
[31m-  parse_reg(p[1])[m
[31m-  local sh = p[3]:sub(2)[m
[31m-  if parse_reg_type == "w" then[m
[31m-    p[3] = "#-("..sh..")%32"[m
[31m-    p[4] = "#31-("..sh..")"[m
[31m-  else[m
[31m-    p[3] = "#-("..sh..")%64"[m
[31m-    p[4] = "#63-("..sh..")"[m
[31m-  end[m
[31m-end)[m
[31m-[m
[31m--- Template strings for ARM instructions.[m
[31m-map_op = {[m
[31m-  -- Basic data processing instructions.[m
[31m-  add_3  = "0b000000DNMg|11000000pDpNIg|8b206000pDpNMx",[m
[31m-  add_4  = "0b000000DNMSg|0b200000DNMXg|8b200000pDpNMXx|8b200000pDpNxMwX",[m
[31m-  adds_3 = "2b000000DNMg|31000000DpNIg|ab206000DpNMx",[m
[31m-  adds_4 = "2b000000DNMSg|2b200000DNMXg|ab200000DpNMXx|ab200000DpNxMwX",[m
[31m-  cmn_2  = "2b00001fNMg|3100001fpNIg|ab20601fpNMx",[m
[31m-  cmn_3  = "2b00001fNMSg|2b20001fNMXg|ab20001fpNMXx|ab20001fpNxMwX",[m
[31m-[m
[31m-  sub_3  = "4b000000DNMg|51000000pDpNIg|cb206000pDpNMx",[m
[31m-  sub_4  = "4b000000DNMSg|4b200000DNMXg|cb200000pDpNMXx|cb200000pDpNxMwX",[m
[31m-  subs_3 = "6b000000DNMg|71000000DpNIg|eb206000DpNMx",[m
[31m-  subs_4 = "6b000000DNMSg|6b200000DNMXg|eb200000DpNMXx|eb200000DpNxMwX",[m
[31m-  cmp_2  = "6b00001fNMg|7100001fpNIg|eb20601fpNMx",[m
[31m-  cmp_3  = "6b00001fNMSg|6b20001fNMXg|eb20001fpNMXx|eb20001fpNxMwX",[m
[31m-[m
[31m-  neg_2  = "4b0003e0DMg",[m
[31m-  neg_3  = "4b0003e0DMSg",[m
[31m-  negs_2 = "6b0003e0DMg",[m
[31m-  negs_3 = "6b0003e0DMSg",[m
[31m-[m
[31m-  adc_3  = "1a000000DNMg",[m
[31m-  adcs_3 = "3a000000DNMg",[m
[31m-  sbc_3  = "5a000000DNMg",[m
[31m-  sbcs_3 = "7a000000DNMg",[m
[31m-  ngc_2  = "5a0003e0DMg",[m
[31m-  ngcs_2 = "7a0003e0DMg",[m
[31m-[m
[31m-  and_3  = "0a000000DNMg|12000000pDNig",[m
[31m-  and_4  = "0a000000DNMSg",[m
[31m-  orr_3  = "2a000000DNMg|32000000pDNig",[m
[31m-  orr_4  = "2a000000DNMSg",[m
[31m-  eor_3  = "4a000000DNMg|52000000pDNig",[m
[31m-  eor_4  = "4a000000DNMSg",[m
[31m-  ands_3 = "6a000000DNMg|72000000DNig",[m
[31m-  ands_4 = "6a000000DNMSg",[m
[31m-  tst_2  = "6a00001fNMg|7200001fNig",[m
[31m-  tst_3  = "6a00001fNMSg",[m
[31m-[m
[31m-  bic_3  = "0a200000DNMg",[m
[31m-  bic_4  = "0a200000DNMSg",[m
[31m-  orn_3  = "2a200000DNMg",[m
[31m-  orn_4  = "2a200000DNMSg",[m
[31m-  eon_3  = "4a200000DNMg",[m
[31m-  eon_4  = "4a200000DNMSg",[m
[31m-  bics_3 = "6a200000DNMg",[m
[31m-  bics_4 = "6a200000DNMSg",[m
[31m-[m
[31m-  movn_2 = "12800000DWg",[m
[31m-  movn_3 = "12800000DWRg",[m
[31m-  movz_2 = "52800000DWg",[m
[31m-  movz_3 = "52800000DWRg",[m
[31m-  movk_2 = "72800000DWg",[m
[31m-  movk_3 = "72800000DWRg",[m
[31m-[m
[31m-  -- TODO: this doesn't cover all valid immediates for mov reg, #imm.[m
[31m-  mov_2  = "2a0003e0DMg|52800000DW|320003e0pDig|11000000pDpNg",[m
[31m-  mov_3  = "2a0003e0DMSg",[m
[31m-  mvn_2  = "2a2003e0DMg",[m
[31m-  mvn_3  = "2a2003e0DMSg",[m
[31m-[m
[31m-  adr_2  = "10000000DBx",[m
[31m-  adrp_2 = "90000000DBx",[m
[31m-[m
[31m-  csel_4  = "1a800000DNMCg",[m
[31m-  csinc_4 = "1a800400DNMCg",[m
[31m-  csinv_4 = "5a800000DNMCg",[m
[31m-  csneg_4 = "5a800400DNMCg",[m
[31m-  cset_2  = "1a9f07e0Dcg",[m
[31m-  csetm_2 = "5a9f03e0Dcg",[m
[31m-  cinc_3  = "1a800400DNmcg",[m
[31m-  cinv_3  = "5a800000DNmcg",[m
[31m-  cneg_3  = "5a800400DNmcg",[m
[31m-[m
[31m-  ccmn_4 = "3a400000NMVCg|3a400800N5VCg",[m
[31m-  ccmp_4 = "7a400000NMVCg|7a400800N5VCg",[m
[31m-[m
[31m-  madd_4 = "1b000000DNMAg",[m
[31m-  msub_4 = "1b008000DNMAg",[m
[31m-  mul_3  = "1b007c00DNMg",[m
[31m-  mneg_3 = "1b00fc00DNMg",[m
[31m-[m
[31m-  smaddl_4 = "9b200000DxNMwAx",[m
[31m-  smsubl_4 = "9b208000DxNMwAx",[m
[31m-  smull_3  = "9b207c00DxNMw",[m
[31m-  smnegl_3 = "9b20fc00DxNMw",[m
[31m-  smulh_3  = "9b407c00DNMx",[m
[31m-  umaddl_4 = "9ba00000DxNMwAx",[m
[31m-  umsubl_4 = "9ba08000DxNMwAx",[m
[31m-  umull_3  = "9ba07c00DxNMw",[m
[31m-  umnegl_3 = "9ba0fc00DxNMw",[m
[31m-  umulh_3  = "9bc07c00DNMx",[m
[31m-[m
[31m-  udiv_3 = "1ac00800DNMg",[m
[31m-  sdiv_3 = "1ac00c00DNMg",[m
[31m-[m
[31m-  -- Bit operations.[m
[31m-  sbfm_4 = "13000000DN12w|93400000DN12x",[m
[31m-  bfm_4  = "33000000DN12w|b3400000DN12x",[m
[31m-  ubfm_4 = "53000000DN12w|d3400000DN12x",[m
[31m-  extr_4 = "13800000DNM2w|93c00000DNM2x",[m
[31m-[m
[31m-  sxtb_2 = "13001c00DNw|93401c00DNx",[m
[31m-  sxth_2 = "13003c00DNw|93403c00DNx",[m
[31m-  sxtw_2 = "93407c00DxNw",[m
[31m-  uxtb_2 = "53001c00DNw",[m
[31m-  uxth_2 = "53003c00DNw",[m
[31m-[m
[31m-  sbfx_4  = op_alias("sbfm_4", alias_bfx),[m
[31m-  bfxil_4 = op_alias("bfm_4", alias_bfx),[m
[31m-  ubfx_4  = op_alias("ubfm_4", alias_bfx),[m
[31m-  sbfiz_4 = op_alias("sbfm_4", alias_bfiz),[m
[31m-  bfi_4   = op_alias("bfm_4", alias_bfiz),[m
[31m-  ubfiz_4 = op_alias("ubfm_4", alias_bfiz),[m
[31m-[m
[31m-  lsl_3  = function(params, nparams)[m
[31m-    if params and params[3]:byte() == 35 then[m
[31m-      return alias_lslimm(params, nparams)[m
[31m-    else[m
[31m-      return op_template(params, "1ac02000DNMg", nparams)[m
[31m-    end[m
[31m-  end,[m
[31m-  lsr_3  = "1ac02400DNMg|53007c00DN1w|d340fc00DN1x",[m
[31m-  asr_3  = "1ac02800DNMg|13007c00DN1w|9340fc00DN1x",[m
[31m-  ror_3  = "1ac02c00DNMg|13800000DNm2w|93c00000DNm2x",[m
[31m-[m
[31m-  clz_2   = "5ac01000DNg",[m
[31m-  cls_2   = "5ac01400DNg",[m
[31m-  rbit_2  = "5ac00000DNg",[m
[31m-  rev_2   = "5ac00800DNw|dac00c00DNx",[m
[31m-  rev16_2 = "5ac00400DNg",[m
[31m-  rev32_2 = "dac00800DNx",[m
[31m-[m
[31m-  -- Loads and stores.[m
[31m-  ["strb_*"]  = "38000000DwL",[m
[31m-  ["ldrb_*"]  = "38400000DwL",[m
[31m-  ["ldrsb_*"] = "38c00000DwL|38800000DxL",[m
[31m-  ["strh_*"]  = "78000000DwL",[m
[31m-  ["ldrh_*"]  = "78400000DwL",[m
[31m-  ["ldrsh_*"] = "78c00000DwL|78800000DxL",[m
[31m-  ["str_*"]   = "b8000000DwL|f8000000DxL|bc000000DsL|fc000000DdL",[m
[31m-  ["ldr_*"]   = "18000000DwB|58000000DxB|1c000000DsB|5c000000DdB|b8400000DwL|f8400000DxL|bc400000DsL|fc400000DdL",[m
[31m-  ["ldrsw_*"] = "98000000DxB|b8800000DxL",[m
[31m-  -- NOTE: ldur etc. are handled by ldr et al.[m
[31m-[m
[31m-  ["stp_*"]   = "28000000DAwP|a8000000DAxP|2c000000DAsP|6c000000DAdP",[m
[31m-  ["ldp_*"]   = "28400000DAwP|a8400000DAxP|2c400000DAsP|6c400000DAdP",[m
[31m-  ["ldpsw_*"] = "68400000DAxP",[m
[31m-[m
[31m-  -- Branches.[m
[31m-  b_1    = "14000000B",[m
[31m-  bl_1   = "94000000B",[m
[31m-  blr_1  = "d63f0000Nx",[m
[31m-  br_1   = "d61f0000Nx",[m
[31m-  ret_0  = "d65f03c0",[m
[31m-  ret_1  = "d65f0000Nx",[m
[31m-  -- b.cond is added below.[m
[31m-  cbz_2  = "34000000DBg",[m
[31m-  cbnz_2 = "35000000DBg",[m
[31m-  tbz_3  = "36000000DTBw|36000000DTBx",[m
[31m-  tbnz_3 = "37000000DTBw|37000000DTBx",[m
[31m-[m
[31m-  -- Miscellaneous instructions.[m
[31m-  -- TODO: hlt, hvc, smc, svc, eret, dcps[123], drps, mrs, msr[m
[31m-  -- TODO: sys, sysl, ic, dc, at, tlbi[m
[31m-  -- TODO: hint, yield, wfe, wfi, sev, sevl[m
[31m-  -- TODO: clrex, dsb, dmb, isb[m
[31m-  nop_0  = "d503201f",[m
[31m-  brk_0  = "d4200000",[m
[31m-  brk_1  = "d4200000W",[m
[31m-[m
[31m-  -- Floating point instructions.[m
[31m-  fmov_2  = "1e204000DNf|1e260000DwNs|1e270000DsNw|9e660000DxNd|9e670000DdNx|1e201000DFf",[m
[31m-  fabs_2  = "1e20c000DNf",[m
[31m-  fneg_2  = "1e214000DNf",[m
[31m-  fsqrt_2 = "1e21c000DNf",[m
[31m-[m
[31m-  fcvt_2  = "1e22c000DdNs|1e624000DsNd",[m
[31m-[m
[31m-  -- TODO: half-precision and fixed-point conversions.[m
[31m-  fcvtas_2 = "1e240000DwNs|9e240000DxNs|1e640000DwNd|9e640000DxNd",[m
[31m-  fcvtau_2 = "1e250000DwNs|9e250000DxNs|1e650000DwNd|9e650000DxNd",[m
[31m-  fcvtms_2 = "1e300000DwNs|9e300000DxNs|1e700000DwNd|9e700000DxNd",[m
[31m-  fcvtmu_2 = "1e310000DwNs|9e310000DxNs|1e710000DwNd|9e710000DxNd",[m
[31m-  fcvtns_2 = "1e200000DwNs|9e200000DxNs|1e600000DwNd|9e600000DxNd",[m
[31m-  fcvtnu_2 = "1e210000DwNs|9e210000DxNs|1e610000DwNd|9e610000DxNd",[m
[31m-  fcvtps_2 = "1e280000DwNs|9e280000DxNs|1e680000DwNd|9e680000DxNd",[m
[31m-  fcvtpu_2 = "1e290000DwNs|9e290000DxNs|1e690000DwNd|9e690000DxNd",[m
[31m-  fcvtzs_2 = "1e380000DwNs|9e380000DxNs|1e780000DwNd|9e780000DxNd",[m
[31m-  fcvtzu_2 = "1e390000DwNs|9e390000DxNs|1e790000DwNd|9e790000DxNd",[m
[31m-[m
[31m-  scvtf_2  = "1e220000DsNw|9e220000DsNx|1e620000DdNw|9e620000DdNx",[m
[31m-  ucvtf_2  = "1e230000DsNw|9e230000DsNx|1e630000DdNw|9e630000DdNx",[m
[31m-[m
[31m-  frintn_2 = "1e244000DNf",[m
[31m-  frintp_2 = "1e24c000DNf",[m
[31m-  frintm_2 = "1e254000DNf",[m
[31m-  frintz_2 = "1e25c000DNf",[m
[31m-  frinta_2 = "1e264000DNf",[m
[31m-  frintx_2 = "1e274000DNf",[m
[31m-  frinti_2 = "1e27c000DNf",[m
[31m-[m
[31m-  fadd_3   = "1e202800DNMf",[m
[31m-  fsub_3   = "1e203800DNMf",[m
[31m-  fmul_3   = "1e200800DNMf",[m
[31m-  fnmul_3  = "1e208800DNMf",[m
[31m-  fdiv_3   = "1e201800DNMf",[m
[31m-[m
[31m-  fmadd_4  = "1f000000DNMAf",[m
[31m-  fmsub_4  = "1f008000DNMAf",[m
[31m-  fnmadd_4 = "1f200000DNMAf",[m
[31m-  fnmsub_4 = "1f208000DNMAf",[m
[31m-[m
[31m-  fmax_3   = "1e204800DNMf",[m
[31m-  fmaxnm_3 = "1e206800DNMf",[m
[31m-  fmin_3   = "1e205800DNMf",[m
[31m-  fminnm_3 = "1e207800DNMf",[m
[31m-[m
[31m-  fcmp_2   = "1e202000NMf|1e202008NZf",[m
[31m-  fcmpe_2  = "1e202010NMf|1e202018NZf",[m
[31m-[m
[31m-  fccmp_4  = "1e200400NMVCf",[m
[31m-  fccmpe_4 = "1e200410NMVCf",[m
[31m-[m
[31m-  fcsel_4  = "1e200c00DNMCf",[m
[31m-[m
[31m-  -- TODO: crc32*, aes*, sha*, pmull[m
[31m-  -- TODO: SIMD instructions.[m
[31m-}[m
[31m-[m
[31m-for cond,c in pairs(map_cond) do[m
[31m-  map_op["b"..cond.."_1"] = tohex(0x54000000+c).."B"[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-local function parse_template(params, template, nparams, pos)[m
[31m-  local op = tonumber(sub(template, 1, 8), 16)[m
[31m-  local n = 1[m
[31m-  local rtt = {}[m
[31m-[m
[31m-  parse_reg_type = false[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for p in gmatch(sub(template, 9), ".") do[m
[31m-    local q = params[n][m
[31m-    if p == "D" then[m
[31m-      op = op + parse_reg(q); n = n + 1[m
[31m-    elseif p == "N" then[m
[31m-      op = op + shl(parse_reg(q), 5); n = n + 1[m
[31m-    elseif p == "M" then[m
[31m-      op = op + shl(parse_reg(q), 16); n = n + 1[m
[31m-    elseif p == "A" then[m
[31m-      op = op + shl(parse_reg(q), 10); n = n + 1[m
[31m-    elseif p == "m" then[m
[31m-      op = op + shl(parse_reg(params[n-1]), 16)[m
[31m-[m
[31m-    elseif p == "p" then[m
[31m-      if q == "sp" then params[n] = "@x31" end[m
[31m-    elseif p == "g" then[m
[31m-      if parse_reg_type == "x" then[m
[31m-	op = op + 0x80000000[m
[31m-      elseif parse_reg_type ~= "w" then[m
[31m-	werror("bad register type")[m
[31m-      end[m
[31m-      parse_reg_type = false[m
[31m-    elseif p == "f" then[m
[31m-      if parse_reg_type == "d" then[m
[31m-	op = op + 0x00400000[m
[31m-      elseif parse_reg_type ~= "s" then[m
[31m-	werror("bad register type")[m
[31m-      end[m
[31m-      parse_reg_type = false[m
[31m-    elseif p == "x" or p == "w" or p == "d" or p == "s" then[m
[31m-      if parse_reg_type ~= p then[m
[31m-	werror("register size mismatch")[m
[31m-      end[m
[31m-      parse_reg_type = false[m
[31m-[m
[31m-    elseif p == "L" then[m
[31m-      op = parse_load(params, nparams, n, op)[m
[31m-    elseif p == "P" then[m
[31m-      op = parse_load_pair(params, nparams, n, op)[m
[31m-[m
[31m-    elseif p == "B" then[m
[31m-      local mode, v, s = parse_label(q, false); n = n + 1[m
[31m-      local m = branch_type(op)[m
[31m-      waction("REL_"..mode, v+m, s, 1)[m
[31m-[m
[31m-    elseif p == "I" then[m
[31m-      op = op + parse_imm12(q); n = n + 1[m
[31m-    elseif p == "i" then[m
[31m-      op = op + parse_imm13(q); n = n + 1[m
[31m-    elseif p == "W" then[m
[31m-      op = op + parse_imm(q, 16, 5, 0, false); n = n + 1[m
[31m-    elseif p == "T" then[m
[31m-      op = op + parse_imm6(q); n = n + 1[m
[31m-    elseif p == "1" then[m
[31m-      op = op + parse_imm(q, 6, 16, 0, false); n = n + 1[m
[31m-    elseif p == "2" then[m
[31m-      op = op + parse_imm(q, 6, 10, 0, false); n = n + 1[m
[31m-    elseif p == "5" then[m
[31m-      op = op + parse_imm(q, 5, 16, 0, false); n = n + 1[m
[31m-    elseif p == "V" then[m
[31m-      op = op + parse_imm(q, 4, 0, 0, false); n = n + 1[m
[31m-    elseif p == "F" then[m
[31m-      op = op + parse_fpimm(q); n = n + 1[m
[31m-    elseif p == "Z" then[m
[31m-      if q ~= "#0" and q ~= "#0.0" then werror("expected zero immediate") end[m
[31m-      n = n + 1[m
[31m-[m
[31m-    elseif p == "S" then[m
[31m-      op = op + parse_shift(q); n = n + 1[m
[31m-    elseif p == "X" then[m
[31m-      op = op + parse_extend(q); n = n + 1[m
[31m-    elseif p == "R" then[m
[31m-      op = op + parse_lslx16(q); n = n + 1[m
[31m-    elseif p == "C" then[m
[31m-      op = op + parse_cond(q, 0); n = n + 1[m
[31m-    elseif p == "c" then[m
[31m-      op = op + parse_cond(q, 1); n = n + 1[m
[31m-[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-  end[m
[31m-  wputpos(pos, op)[m
[31m-end[m
[31m-[m
[31m-function op_template(params, template, nparams)[m
[31m-  if not params then return template:gsub("%x%x%x%x%x%x%x%x", "") end[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 3 positions.[m
[31m-  if secpos+3 > maxsecpos then wflush() end[m
[31m-  local pos = wpos()[m
[31m-  local lpos, apos, spos = #actlist, #actargs, secpos[m
[31m-[m
[31m-  local ok, err[m
[31m-  for t in gmatch(template, "[^|]+") do[m
[31m-    ok, err = pcall(parse_template, params, t, nparams, pos)[m
[31m-    if ok then return end[m
[31m-    secpos = spos[m
[31m-    actlist[lpos+1] = nil[m
[31m-    actlist[lpos+2] = nil[m
[31m-    actlist[lpos+3] = nil[m
[31m-    actargs[apos+1] = nil[m
[31m-    actargs[apos+2] = nil[m
[31m-    actargs[apos+3] = nil[m
[31m-  end[m
[31m-  error(err, 0)[m
[31m-end[m
[31m-[m
[31m-map_op[".template__"] = op_template[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_1"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local mode, n, s = parse_label(params[1], true)[m
[31m-  if mode == "EXT" then werror("bad label definition") end[m
[31m-  waction("LABEL_"..mode, n, s, 1)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-map_op[".long_*"] = function(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local n = tonumber(p)[m
[31m-    if not n then werror("bad immediate `"..p.."'") end[m
[31m-    if n < 0 then n = n + 2^32 end[m
[31m-    wputw(n)[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1])[m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION", num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = map_coreop })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_mips.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_mips.h[m
[1mdeleted file mode 100644[m
[1mindex c10528f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_mips.h[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-/*[m
[31m-** DynASM MIPS encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"mips"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. */[m
[31m-enum {[m
[31m-  DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT,[m
[31m-  /* The following actions need a buffer position. */[m
[31m-  DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,[m
[31m-  /* The following actions also have an argument. */[m
[31m-  DASM_REL_PC, DASM_LABEL_PC, DASM_IMM,[m
[31m-  DASM__MAX[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_REL	0x15000000[m
[31m-#define DASM_S_UNDEF_LG		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned int *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    unsigned int ins = *p++;[m
[31m-    unsigned int action = (ins >> 16) - 0xff00;[m
[31m-    if (action >= DASM__MAX) {[m
[31m-      ofs += 4;[m
[31m-    } else {[m
[31m-      int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0;[m
[31m-      switch (action) {[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      case DASM_SECTION:[m
[31m-	n = (ins & 255); CK(n < D->maxsection, RANGE_SEC);[m
[31m-	D->section = &D->sections[n]; goto stop;[m
[31m-      case DASM_ESC: p++; ofs += 4; break;[m
[31m-      case DASM_REL_EXT: break;[m
[31m-      case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break;[m
[31m-      case DASM_REL_LG:[m
[31m-	n = (ins & 2047) - 10; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl += 10; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG:[m
[31m-	pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos;[m
[31m-	}[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_IMM:[m
[31m-#ifdef DASM_CHECKS[m
[31m-	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	n >>= ((ins>>10)&31);[m
[31m-#ifdef DASM_CHECKS[m
[31m-	if (ins & 0x8000)[m
[31m-	  CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-	else[m
[31m-	  CK((n>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16) - 0xff00;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_REL_EXT: break;[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;[m
[31m-	case DASM_REL_LG: case DASM_REL_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;[m
[31m-	case DASM_IMM: pos++; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  char *base = (char *)buffer;[m
[31m-  unsigned int *cp = (unsigned int *)buffer;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16) - 0xff00;[m
[31m-	int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: *cp++ = *p++; break;[m
[31m-	case DASM_REL_EXT:[m
[31m-	  n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1);[m
[31m-	  goto patchrel;[m
[31m-	case DASM_ALIGN:[m
[31m-	  ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000;[m
[31m-	  break;[m
[31m-	case DASM_REL_LG:[m
[31m-	  CK(n >= 0, UNDEF_LG);[m
[31m-	case DASM_REL_PC:[m
[31m-	  CK(n >= 0, UNDEF_PC);[m
[31m-	  n = *DASM_POS2PTR(D, n);[m
[31m-	  if (ins & 2048)[m
[31m-	    n = n - (int)((char *)cp - base);[m
[31m-	  else[m
[31m-	    n = (n + (int)base) & 0x0fffffff;[m
[31m-	patchrel:[m
[31m-	  CK((n & 3) == 0 &&[m
[31m-	     ((n + ((ins & 2048) ? 0x00020000 : 0)) >>[m
[31m-	       ((ins & 2048) ? 18 : 28)) == 0, RANGE_REL);[m
[31m-	  cp[-1] |= ((n>>2) & ((ins & 2048) ? 0x0000ffff: 0x03ffffff));[m
[31m-	  break;[m
[31m-	case DASM_LABEL_LG:[m
[31m-	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);[m
[31m-	  break;[m
[31m-	case DASM_LABEL_PC: break;[m
[31m-	case DASM_IMM:[m
[31m-	  cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31);[m
[31m-	  break;[m
[31m-	default: *cp++ = ins; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != (char *)cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_mips.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_mips.lua[m
[1mdeleted file mode 100644[m
[1mindex c5a5595..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_mips.lua[m
[1m+++ /dev/null[m
[36m@@ -1,953 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM MIPS module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	"mips",[m
[31m-  description =	"DynASM MIPS module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, setmetatable = assert, setmetatable[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local match, gmatch = _s.match, _s.gmatch[m
[31m-local concat, sort = table.concat, table.sort[m
[31m-local bit = bit or require("bit")[m
[31m-local band, shl, sar, tohex = bit.band, bit.lshift, bit.arshift, bit.tohex[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  "STOP", "SECTION", "ESC", "REL_EXT",[m
[31m-  "ALIGN", "REL_LG", "LABEL_LG",[m
[31m-  "REL_PC", "LABEL_PC", "IMM",[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number.[m
[31m-local map_action = {}[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  map_action[name] = n-1[m
[31m-end[m
[31m-[m
[31m--- Action list buffer.[m
[31m-local actlist = {}[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  if nn == 0 then nn = 1; actlist[0] = map_action.STOP end[m
[31m-  out:write("static const unsigned int ", name, "[", nn, "] = {\n")[m
[31m-  for i = 1,nn-1 do[m
[31m-    assert(out:write("0x", tohex(actlist[i]), ",\n"))[m
[31m-  end[m
[31m-  assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add word to action list.[m
[31m-local function wputxw(n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, val, a, num)[m
[31m-  local w = assert(map_action[action], "bad action name `"..action.."'")[m
[31m-  wputxw(0xff000000 + w * 0x10000 + (val or 0))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  if #actlist == actargs[1] then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped word.[m
[31m-local function wputw(n)[m
[31m-  if n >= 0xff000000 then waction("ESC") end[m
[31m-  wputxw(n)[m
[31m-end[m
[31m-[m
[31m--- Reserve position for word.[m
[31m-local function wpos()[m
[31m-  local pos = #actlist+1[m
[31m-  actlist[pos] = ""[m
[31m-  return pos[m
[31m-end[m
[31m-[m
[31m--- Store word to reserved position.[m
[31m-local function wputpos(pos, n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[pos] = n[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 20[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 2047 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  ", prefix, t[i], ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = 0[m
[31m-local map_extern_ = {}[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n > 2047 then werror("too many extern labels") end[m
[31m-  next_extern = n + 1[m
[31m-  t[name] = n[m
[31m-  map_extern_[n] = name[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write(format("  %s\n", map_extern_[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write("  \"", map_extern_[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-local map_archdef = { sp="r29", ra="r31" } -- Ext. register name -> int. name.[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for Dt... macros).[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  if s == "r29" then return "sp"[m
[31m-  elseif s == "r31" then return "ra" end[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Template strings for MIPS instructions.[m
[31m-local map_op = {[m
[31m-  -- First-level opcodes.[m
[31m-  j_1 =		"08000000J",[m
[31m-  jal_1 =	"0c000000J",[m
[31m-  b_1 =		"10000000B",[m
[31m-  beqz_2 =	"10000000SB",[m
[31m-  beq_3 =	"10000000STB",[m
[31m-  bnez_2 =	"14000000SB",[m
[31m-  bne_3 =	"14000000STB",[m
[31m-  blez_2 =	"18000000SB",[m
[31m-  bgtz_2 =	"1c000000SB",[m
[31m-  addi_3 =	"20000000TSI",[m
[31m-  li_2 =	"24000000TI",[m
[31m-  addiu_3 =	"24000000TSI",[m
[31m-  slti_3 =	"28000000TSI",[m
[31m-  sltiu_3 =	"2c000000TSI",[m
[31m-  andi_3 =	"30000000TSU",[m
[31m-  lu_2 =	"34000000TU",[m
[31m-  ori_3 =	"34000000TSU",[m
[31m-  xori_3 =	"38000000TSU",[m
[31m-  lui_2 =	"3c000000TU",[m
[31m-  beqzl_2 =	"50000000SB",[m
[31m-  beql_3 =	"50000000STB",[m
[31m-  bnezl_2 =	"54000000SB",[m
[31m-  bnel_3 =	"54000000STB",[m
[31m-  blezl_2 =	"58000000SB",[m
[31m-  bgtzl_2 =	"5c000000SB",[m
[31m-  lb_2 =	"80000000TO",[m
[31m-  lh_2 =	"84000000TO",[m
[31m-  lwl_2 =	"88000000TO",[m
[31m-  lw_2 =	"8c000000TO",[m
[31m-  lbu_2 =	"90000000TO",[m
[31m-  lhu_2 =	"94000000TO",[m
[31m-  lwr_2 =	"98000000TO",[m
[31m-  sb_2 =	"a0000000TO",[m
[31m-  sh_2 =	"a4000000TO",[m
[31m-  swl_2 =	"a8000000TO",[m
[31m-  sw_2 =	"ac000000TO",[m
[31m-  swr_2 =	"b8000000TO",[m
[31m-  cache_2 =	"bc000000NO",[m
[31m-  ll_2 =	"c0000000TO",[m
[31m-  lwc1_2 =	"c4000000HO",[m
[31m-  pref_2 =	"cc000000NO",[m
[31m-  ldc1_2 =	"d4000000HO",[m
[31m-  sc_2 =	"e0000000TO",[m
[31m-  swc1_2 =	"e4000000HO",[m
[31m-  sdc1_2 =	"f4000000HO",[m
[31m-[m
[31m-  -- Opcode SPECIAL.[m
[31m-  nop_0 =	"00000000",[m
[31m-  sll_3 =	"00000000DTA",[m
[31m-  movf_2 =	"00000001DS",[m
[31m-  movf_3 =	"00000001DSC",[m
[31m-  movt_2 =	"00010001DS",[m
[31m-  movt_3 =	"00010001DSC",[m
[31m-  srl_3 =	"00000002DTA",[m
[31m-  rotr_3 =	"00200002DTA",[m
[31m-  sra_3 =	"00000003DTA",[m
[31m-  sllv_3 =	"00000004DTS",[m
[31m-  srlv_3 =	"00000006DTS",[m
[31m-  rotrv_3 =	"00000046DTS",[m
[31m-  srav_3 =	"00000007DTS",[m
[31m-  jr_1 =	"00000008S",[m
[31m-  jalr_1 =	"0000f809S",[m
[31m-  jalr_2 =	"00000009DS",[m
[31m-  movz_3 =	"0000000aDST",[m
[31m-  movn_3 =	"0000000bDST",[m
[31m-  syscall_0 =	"0000000c",[m
[31m-  syscall_1 =	"0000000cY",[m
[31m-  break_0 =	"0000000d",[m
[31m-  break_1 =	"0000000dY",[m
[31m-  sync_0 =	"0000000f",[m
[31m-  mfhi_1 =	"00000010D",[m
[31m-  mthi_1 =	"00000011S",[m
[31m-  mflo_1 =	"00000012D",[m
[31m-  mtlo_1 =	"00000013S",[m
[31m-  mult_2 =	"00000018ST",[m
[31m-  multu_2 =	"00000019ST",[m
[31m-  div_2 =	"0000001aST",[m
[31m-  divu_2 =	"0000001bST",[m
[31m-  add_3 =	"00000020DST",[m
[31m-  move_2 =	"00000021DS",[m
[31m-  addu_3 =	"00000021DST",[m
[31m-  sub_3 =	"00000022DST",[m
[31m-  negu_2 =	"00000023DT",[m
[31m-  subu_3 =	"00000023DST",[m
[31m-  and_3 =	"00000024DST",[m
[31m-  or_3 =	"00000025DST",[m
[31m-  xor_3 =	"00000026DST",[m
[31m-  not_2 =	"00000027DS",[m
[31m-  nor_3 =	"00000027DST",[m
[31m-  slt_3 =	"0000002aDST",[m
[31m-  sltu_3 =	"0000002bDST",[m
[31m-  tge_2 =	"00000030ST",[m
[31m-  tge_3 =	"00000030STZ",[m
[31m-  tgeu_2 =	"00000031ST",[m
[31m-  tgeu_3 =	"00000031STZ",[m
[31m-  tlt_2 =	"00000032ST",[m
[31m-  tlt_3 =	"00000032STZ",[m
[31m-  tltu_2 =	"00000033ST",[m
[31m-  tltu_3 =	"00000033STZ",[m
[31m-  teq_2 =	"00000034ST",[m
[31m-  teq_3 =	"00000034STZ",[m
[31m-  tne_2 =	"00000036ST",[m
[31m-  tne_3 =	"00000036STZ",[m
[31m-[m
[31m-  -- Opcode REGIMM.[m
[31m-  bltz_2 =	"04000000SB",[m
[31m-  bgez_2 =	"04010000SB",[m
[31m-  bltzl_2 =	"04020000SB",[m
[31m-  bgezl_2 =	"04030000SB",[m
[31m-  tgei_2 =	"04080000SI",[m
[31m-  tgeiu_2 =	"04090000SI",[m
[31m-  tlti_2 =	"040a0000SI",[m
[31m-  tltiu_2 =	"040b0000SI",[m
[31m-  teqi_2 =	"040c0000SI",[m
[31m-  tnei_2 =	"040e0000SI",[m
[31m-  bltzal_2 =	"04100000SB",[m
[31m-  bal_1 =	"04110000B",[m
[31m-  bgezal_2 =	"04110000SB",[m
[31m-  bltzall_2 =	"04120000SB",[m
[31m-  bgezall_2 =	"04130000SB",[m
[31m-  synci_1 =	"041f0000O",[m
[31m-[m
[31m-  -- Opcode SPECIAL2.[m
[31m-  madd_2 =	"70000000ST",[m
[31m-  maddu_2 =	"70000001ST",[m
[31m-  mul_3 =	"70000002DST",[m
[31m-  msub_2 =	"70000004ST",[m
[31m-  msubu_2 =	"70000005ST",[m
[31m-  clz_2 =	"70000020DS=",[m
[31m-  clo_2 =	"70000021DS=",[m
[31m-  sdbbp_0 =	"7000003f",[m
[31m-  sdbbp_1 =	"7000003fY",[m
[31m-[m
[31m-  -- Opcode SPECIAL3.[m
[31m-  ext_4 =	"7c000000TSAM", -- Note: last arg is msbd = size-1[m
[31m-  ins_4 =	"7c000004TSAM", -- Note: last arg is msb = pos+size-1[m
[31m-  wsbh_2 =	"7c0000a0DT",[m
[31m-  seb_2 =	"7c000420DT",[m
[31m-  seh_2 =	"7c000620DT",[m
[31m-  rdhwr_2 =	"7c00003bTD",[m
[31m-[m
[31m-  -- Opcode COP0.[m
[31m-  mfc0_2 =	"40000000TD",[m
[31m-  mfc0_3 =	"40000000TDW",[m
[31m-  mtc0_2 =	"40800000TD",[m
[31m-  mtc0_3 =	"40800000TDW",[m
[31m-  rdpgpr_2 =	"41400000DT",[m
[31m-  di_0 =	"41606000",[m
[31m-  di_1 =	"41606000T",[m
[31m-  ei_0 =	"41606020",[m
[31m-  ei_1 =	"41606020T",[m
[31m-  wrpgpr_2 =	"41c00000DT",[m
[31m-  tlbr_0 =	"42000001",[m
[31m-  tlbwi_0 =	"42000002",[m
[31m-  tlbwr_0 =	"42000006",[m
[31m-  tlbp_0 =	"42000008",[m
[31m-  eret_0 =	"42000018",[m
[31m-  deret_0 =	"4200001f",[m
[31m-  wait_0 =	"42000020",[m
[31m-[m
[31m-  -- Opcode COP1.[m
[31m-  mfc1_2 =	"44000000TG",[m
[31m-  cfc1_2 =	"44400000TG",[m
[31m-  mfhc1_2 =	"44600000TG",[m
[31m-  mtc1_2 =	"44800000TG",[m
[31m-  ctc1_2 =	"44c00000TG",[m
[31m-  mthc1_2 =	"44e00000TG",[m
[31m-[m
[31m-  bc1f_1 =	"45000000B",[m
[31m-  bc1f_2 =	"45000000CB",[m
[31m-  bc1t_1 =	"45010000B",[m
[31m-  bc1t_2 =	"45010000CB",[m
[31m-  bc1fl_1 =	"45020000B",[m
[31m-  bc1fl_2 =	"45020000CB",[m
[31m-  bc1tl_1 =	"45030000B",[m
[31m-  bc1tl_2 =	"45030000CB",[m
[31m-[m
[31m-  ["add.s_3"] =		"46000000FGH",[m
[31m-  ["sub.s_3"] =		"46000001FGH",[m
[31m-  ["mul.s_3"] =		"46000002FGH",[m
[31m-  ["div.s_3"] =		"46000003FGH",[m
[31m-  ["sqrt.s_2"] =	"46000004FG",[m
[31m-  ["abs.s_2"] =		"46000005FG",[m
[31m-  ["mov.s_2"] =		"46000006FG",[m
[31m-  ["neg.s_2"] =		"46000007FG",[m
[31m-  ["round.l.s_2"] =	"46000008FG",[m
[31m-  ["trunc.l.s_2"] =	"46000009FG",[m
[31m-  ["ceil.l.s_2"] =	"4600000aFG",[m
[31m-  ["floor.l.s_2"] =	"4600000bFG",[m
[31m-  ["round.w.s_2"] =	"4600000cFG",[m
[31m-  ["trunc.w.s_2"] =	"4600000dFG",[m
[31m-  ["ceil.w.s_2"] =	"4600000eFG",[m
[31m-  ["floor.w.s_2"] =	"4600000fFG",[m
[31m-  ["movf.s_2"] =	"46000011FG",[m
[31m-  ["movf.s_3"] =	"46000011FGC",[m
[31m-  ["movt.s_2"] =	"46010011FG",[m
[31m-  ["movt.s_3"] =	"46010011FGC",[m
[31m-  ["movz.s_3"] =	"46000012FGT",[m
[31m-  ["movn.s_3"] =	"46000013FGT",[m
[31m-  ["recip.s_2"] =	"46000015FG",[m
[31m-  ["rsqrt.s_2"] =	"46000016FG",[m
[31m-  ["cvt.d.s_2"] =	"46000021FG",[m
[31m-  ["cvt.w.s_2"] =	"46000024FG",[m
[31m-  ["cvt.l.s_2"] =	"46000025FG",[m
[31m-  ["cvt.ps.s_3"] =	"46000026FGH",[m
[31m-  ["c.f.s_2"] =		"46000030GH",[m
[31m-  ["c.f.s_3"] =		"46000030VGH",[m
[31m-  ["c.un.s_2"] =	"46000031GH",[m
[31m-  ["c.un.s_3"] =	"46000031VGH",[m
[31m-  ["c.eq.s_2"] =	"46000032GH",[m
[31m-  ["c.eq.s_3"] =	"46000032VGH",[m
[31m-  ["c.ueq.s_2"] =	"46000033GH",[m
[31m-  ["c.ueq.s_3"] =	"46000033VGH",[m
[31m-  ["c.olt.s_2"] =	"46000034GH",[m
[31m-  ["c.olt.s_3"] =	"46000034VGH",[m
[31m-  ["c.ult.s_2"] =	"46000035GH",[m
[31m-  ["c.ult.s_3"] =	"46000035VGH",[m
[31m-  ["c.ole.s_2"] =	"46000036GH",[m
[31m-  ["c.ole.s_3"] =	"46000036VGH",[m
[31m-  ["c.ule.s_2"] =	"46000037GH",[m
[31m-  ["c.ule.s_3"] =	"46000037VGH",[m
[31m-  ["c.sf.s_2"] =	"46000038GH",[m
[31m-  ["c.sf.s_3"] =	"46000038VGH",[m
[31m-  ["c.ngle.s_2"] =	"46000039GH",[m
[31m-  ["c.ngle.s_3"] =	"46000039VGH",[m
[31m-  ["c.seq.s_2"] =	"4600003aGH",[m
[31m-  ["c.seq.s_3"] =	"4600003aVGH",[m
[31m-  ["c.ngl.s_2"] =	"4600003bGH",[m
[31m-  ["c.ngl.s_3"] =	"4600003bVGH",[m
[31m-  ["c.lt.s_2"] =	"4600003cGH",[m
[31m-  ["c.lt.s_3"] =	"4600003cVGH",[m
[31m-  ["c.nge.s_2"] =	"4600003dGH",[m
[31m-  ["c.nge.s_3"] =	"4600003dVGH",[m
[31m-  ["c.le.s_2"] =	"4600003eGH",[m
[31m-  ["c.le.s_3"] =	"4600003eVGH",[m
[31m-  ["c.ngt.s_2"] =	"4600003fGH",[m
[31m-  ["c.ngt.s_3"] =	"4600003fVGH",[m
[31m-[m
[31m-  ["add.d_3"] =		"46200000FGH",[m
[31m-  ["sub.d_3"] =		"46200001FGH",[m
[31m-  ["mul.d_3"] =		"46200002FGH",[m
[31m-  ["div.d_3"] =		"46200003FGH",[m
[31m-  ["sqrt.d_2"] =	"46200004FG",[m
[31m-  ["abs.d_2"] =		"46200005FG",[m
[31m-  ["mov.d_2"] =		"46200006FG",[m
[31m-  ["neg.d_2"] =		"46200007FG",[m
[31m-  ["round.l.d_2"] =	"46200008FG",[m
[31m-  ["trunc.l.d_2"] =	"46200009FG",[m
[31m-  ["ceil.l.d_2"] =	"4620000aFG",[m
[31m-  ["floor.l.d_2"] =	"4620000bFG",[m
[31m-  ["round.w.d_2"] =	"4620000cFG",[m
[31m-  ["trunc.w.d_2"] =	"4620000dFG",[m
[31m-  ["ceil.w.d_2"] =	"4620000eFG",[m
[31m-  ["floor.w.d_2"] =	"4620000fFG",[m
[31m-  ["movf.d_2"] =	"46200011FG",[m
[31m-  ["movf.d_3"] =	"46200011FGC",[m
[31m-  ["movt.d_2"] =	"46210011FG",[m
[31m-  ["movt.d_3"] =	"46210011FGC",[m
[31m-  ["movz.d_3"] =	"46200012FGT",[m
[31m-  ["movn.d_3"] =	"46200013FGT",[m
[31m-  ["recip.d_2"] =	"46200015FG",[m
[31m-  ["rsqrt.d_2"] =	"46200016FG",[m
[31m-  ["cvt.s.d_2"] =	"46200020FG",[m
[31m-  ["cvt.w.d_2"] =	"46200024FG",[m
[31m-  ["cvt.l.d_2"] =	"46200025FG",[m
[31m-  ["c.f.d_2"] =		"46200030GH",[m
[31m-  ["c.f.d_3"] =		"46200030VGH",[m
[31m-  ["c.un.d_2"] =	"46200031GH",[m
[31m-  ["c.un.d_3"] =	"46200031VGH",[m
[31m-  ["c.eq.d_2"] =	"46200032GH",[m
[31m-  ["c.eq.d_3"] =	"46200032VGH",[m
[31m-  ["c.ueq.d_2"] =	"46200033GH",[m
[31m-  ["c.ueq.d_3"] =	"46200033VGH",[m
[31m-  ["c.olt.d_2"] =	"46200034GH",[m
[31m-  ["c.olt.d_3"] =	"46200034VGH",[m
[31m-  ["c.ult.d_2"] =	"46200035GH",[m
[31m-  ["c.ult.d_3"] =	"46200035VGH",[m
[31m-  ["c.ole.d_2"] =	"46200036GH",[m
[31m-  ["c.ole.d_3"] =	"46200036VGH",[m
[31m-  ["c.ule.d_2"] =	"46200037GH",[m
[31m-  ["c.ule.d_3"] =	"46200037VGH",[m
[31m-  ["c.sf.d_2"] =	"46200038GH",[m
[31m-  ["c.sf.d_3"] =	"46200038VGH",[m
[31m-  ["c.ngle.d_2"] =	"46200039GH",[m
[31m-  ["c.ngle.d_3"] =	"46200039VGH",[m
[31m-  ["c.seq.d_2"] =	"4620003aGH",[m
[31m-  ["c.seq.d_3"] =	"4620003aVGH",[m
[31m-  ["c.ngl.d_2"] =	"4620003bGH",[m
[31m-  ["c.ngl.d_3"] =	"4620003bVGH",[m
[31m-  ["c.lt.d_2"] =	"4620003cGH",[m
[31m-  ["c.lt.d_3"] =	"4620003cVGH",[m
[31m-  ["c.nge.d_2"] =	"4620003dGH",[m
[31m-  ["c.nge.d_3"] =	"4620003dVGH",[m
[31m-  ["c.le.d_2"] =	"4620003eGH",[m
[31m-  ["c.le.d_3"] =	"4620003eVGH",[m
[31m-  ["c.ngt.d_2"] =	"4620003fGH",[m
[31m-  ["c.ngt.d_3"] =	"4620003fVGH",[m
[31m-[m
[31m-  ["add.ps_3"] =	"46c00000FGH",[m
[31m-  ["sub.ps_3"] =	"46c00001FGH",[m
[31m-  ["mul.ps_3"] =	"46c00002FGH",[m
[31m-  ["abs.ps_2"] =	"46c00005FG",[m
[31m-  ["mov.ps_2"] =	"46c00006FG",[m
[31m-  ["neg.ps_2"] =	"46c00007FG",[m
[31m-  ["movf.ps_2"] =	"46c00011FG",[m
[31m-  ["movf.ps_3"] =	"46c00011FGC",[m
[31m-  ["movt.ps_2"] =	"46c10011FG",[m
[31m-  ["movt.ps_3"] =	"46c10011FGC",[m
[31m-  ["movz.ps_3"] =	"46c00012FGT",[m
[31m-  ["movn.ps_3"] =	"46c00013FGT",[m
[31m-  ["cvt.s.pu_2"] =	"46c00020FG",[m
[31m-  ["cvt.s.pl_2"] =	"46c00028FG",[m
[31m-  ["pll.ps_3"] =	"46c0002cFGH",[m
[31m-  ["plu.ps_3"] =	"46c0002dFGH",[m
[31m-  ["pul.ps_3"] =	"46c0002eFGH",[m
[31m-  ["puu.ps_3"] =	"46c0002fFGH",[m
[31m-  ["c.f.ps_2"] =	"46c00030GH",[m
[31m-  ["c.f.ps_3"] =	"46c00030VGH",[m
[31m-  ["c.un.ps_2"] =	"46c00031GH",[m
[31m-  ["c.un.ps_3"] =	"46c00031VGH",[m
[31m-  ["c.eq.ps_2"] =	"46c00032GH",[m
[31m-  ["c.eq.ps_3"] =	"46c00032VGH",[m
[31m-  ["c.ueq.ps_2"] =	"46c00033GH",[m
[31m-  ["c.ueq.ps_3"] =	"46c00033VGH",[m
[31m-  ["c.olt.ps_2"] =	"46c00034GH",[m
[31m-  ["c.olt.ps_3"] =	"46c00034VGH",[m
[31m-  ["c.ult.ps_2"] =	"46c00035GH",[m
[31m-  ["c.ult.ps_3"] =	"46c00035VGH",[m
[31m-  ["c.ole.ps_2"] =	"46c00036GH",[m
[31m-  ["c.ole.ps_3"] =	"46c00036VGH",[m
[31m-  ["c.ule.ps_2"] =	"46c00037GH",[m
[31m-  ["c.ule.ps_3"] =	"46c00037VGH",[m
[31m-  ["c.sf.ps_2"] =	"46c00038GH",[m
[31m-  ["c.sf.ps_3"] =	"46c00038VGH",[m
[31m-  ["c.ngle.ps_2"] =	"46c00039GH",[m
[31m-  ["c.ngle.ps_3"] =	"46c00039VGH",[m
[31m-  ["c.seq.ps_2"] =	"46c0003aGH",[m
[31m-  ["c.seq.ps_3"] =	"46c0003aVGH",[m
[31m-  ["c.ngl.ps_2"] =	"46c0003bGH",[m
[31m-  ["c.ngl.ps_3"] =	"46c0003bVGH",[m
[31m-  ["c.lt.ps_2"] =	"46c0003cGH",[m
[31m-  ["c.lt.ps_3"] =	"46c0003cVGH",[m
[31m-  ["c.nge.ps_2"] =	"46c0003dGH",[m
[31m-  ["c.nge.ps_3"] =	"46c0003dVGH",[m
[31m-  ["c.le.ps_2"] =	"46c0003eGH",[m
[31m-  ["c.le.ps_3"] =	"46c0003eVGH",[m
[31m-  ["c.ngt.ps_2"] =	"46c0003fGH",[m
[31m-  ["c.ngt.ps_3"] =	"46c0003fVGH",[m
[31m-[m
[31m-  ["cvt.s.w_2"] =	"46800020FG",[m
[31m-  ["cvt.d.w_2"] =	"46800021FG",[m
[31m-[m
[31m-  ["cvt.s.l_2"] =	"46a00020FG",[m
[31m-  ["cvt.d.l_2"] =	"46a00021FG",[m
[31m-[m
[31m-  -- Opcode COP1X.[m
[31m-  lwxc1_2 =		"4c000000FX",[m
[31m-  ldxc1_2 =		"4c000001FX",[m
[31m-  luxc1_2 =		"4c000005FX",[m
[31m-  swxc1_2 =		"4c000008FX",[m
[31m-  sdxc1_2 =		"4c000009FX",[m
[31m-  suxc1_2 =		"4c00000dFX",[m
[31m-  prefx_2 =		"4c00000fMX",[m
[31m-  ["alnv.ps_4"] =	"4c00001eFGHS",[m
[31m-  ["madd.s_4"] =	"4c000020FRGH",[m
[31m-  ["madd.d_4"] =	"4c000021FRGH",[m
[31m-  ["madd.ps_4"] =	"4c000026FRGH",[m
[31m-  ["msub.s_4"] =	"4c000028FRGH",[m
[31m-  ["msub.d_4"] =	"4c000029FRGH",[m
[31m-  ["msub.ps_4"] =	"4c00002eFRGH",[m
[31m-  ["nmadd.s_4"] =	"4c000030FRGH",[m
[31m-  ["nmadd.d_4"] =	"4c000031FRGH",[m
[31m-  ["nmadd.ps_4"] =	"4c000036FRGH",[m
[31m-  ["nmsub.s_4"] =	"4c000038FRGH",[m
[31m-  ["nmsub.d_4"] =	"4c000039FRGH",[m
[31m-  ["nmsub.ps_4"] =	"4c00003eFRGH",[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function parse_gpr(expr)[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    if not reg then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    expr = reg[m
[31m-  end[m
[31m-  local r = match(expr, "^r([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r, tp end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_fpr(expr)[m
[31m-  local r = match(expr, "^f([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_imm(imm, bits, shift, scale, signed)[m
[31m-  local n = tonumber(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n then[m
[31m-      if signed then[m
[31m-	local s = sar(m, bits-1)[m
[31m-	if s == 0 then return shl(m, shift)[m
[31m-	elseif s == -1 then return shl(m + shl(1, bits), shift) end[m
[31m-      else[m
[31m-	if sar(m, bits) == 0 then return shl(m, shift) end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  elseif match(imm, "^[rf]([1-3]?[0-9])$") or[m
[31m-	 match(imm, "^([%w_]+):([rf][1-3]?[0-9])$") then[m
[31m-    werror("expected immediate operand, got register")[m
[31m-  else[m
[31m-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_disp(disp)[m
[31m-  local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")[m
[31m-  if imm then[m
[31m-    local r = shl(parse_gpr(reg), 21)[m
[31m-    local extname = match(imm, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      waction("REL_EXT", map_extern[extname], nil, 1)[m
[31m-      return r[m
[31m-    else[m
[31m-      return r + parse_imm(imm, 16, 0, 0, true)[m
[31m-    end[m
[31m-  end[m
[31m-  local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$")[m
[31m-  if reg and tailr ~= "" then[m
[31m-    local r, tp = parse_gpr(reg)[m
[31m-    if tp then[m
[31m-      waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr))[m
[31m-      return shl(r, 21)[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad displacement `"..disp.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_index(idx)[m
[31m-  local rt, rs = match(idx, "^(.*)%(([%w_:]+)%)$")[m
[31m-  if rt then[m
[31m-    rt = parse_gpr(rt)[m
[31m-    rs = parse_gpr(rs)[m
[31m-    return shl(rt, 16) + shl(rs, 21)[m
[31m-  end[m
[31m-  werror("bad index `"..idx.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_label(label, def)[m
[31m-  local prefix = sub(label, 1, 2)[m
[31m-  -- =>label (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "PC", 0, sub(label, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "LG", map_global[sub(label, 3)][m
[31m-  end[m
[31m-  if def then[m
[31m-    -- [1-9] (local label definition)[m
[31m-    if match(label, "^[1-9]$") then[m
[31m-      return "LG", 10+tonumber(label)[m
[31m-    end[m
[31m-  else[m
[31m-    -- [<>][1-9] (local label reference)[m
[31m-    local dir, lnum = match(label, "^([<>])([1-9])$")[m
[31m-    if dir then -- Fwd: 1-9, Bkwd: 11-19.[m
[31m-      return "LG", lnum + (dir == ">" and 0 or 10)[m
[31m-    end[m
[31m-    -- extern label (extern label reference)[m
[31m-    local extname = match(label, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      return "EXT", map_extern[extname][m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad label `"..label.."'")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-map_op[".template__"] = function(params, template, nparams)[m
[31m-  if not params then return sub(template, 9) end[m
[31m-  local op = tonumber(sub(template, 1, 8), 16)[m
[31m-  local n = 1[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 2 positions (ins/ext).[m
[31m-  if secpos+2 > maxsecpos then wflush() end[m
[31m-  local pos = wpos()[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for p in gmatch(sub(template, 9), ".") do[m
[31m-    if p == "D" then[m
[31m-      op = op + shl(parse_gpr(params[n]), 11); n = n + 1[m
[31m-    elseif p == "T" then[m
[31m-      op = op + shl(parse_gpr(params[n]), 16); n = n + 1[m
[31m-    elseif p == "S" then[m
[31m-      op = op + shl(parse_gpr(params[n]), 21); n = n + 1[m
[31m-    elseif p == "F" then[m
[31m-      op = op + shl(parse_fpr(params[n]), 6); n = n + 1[m
[31m-    elseif p == "G" then[m
[31m-      op = op + shl(parse_fpr(params[n]), 11); n = n + 1[m
[31m-    elseif p == "H" then[m
[31m-      op = op + shl(parse_fpr(params[n]), 16); n = n + 1[m
[31m-    elseif p == "R" then[m
[31m-      op = op + shl(parse_fpr(params[n]), 21); n = n + 1[m
[31m-    elseif p == "I" then[m
[31m-      op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1[m
[31m-    elseif p == "U" then[m
[31m-      op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1[m
[31m-    elseif p == "O" then[m
[31m-      op = op + parse_disp(params[n]); n = n + 1[m
[31m-    elseif p == "X" then[m
[31m-      op = op + parse_index(params[n]); n = n + 1[m
[31m-    elseif p == "B" or p == "J" then[m
[31m-      local mode, n, s = parse_label(params[n], false)[m
[31m-      if p == "B" then n = n + 2048 end[m
[31m-      waction("REL_"..mode, n, s, 1)[m
[31m-      n = n + 1[m
[31m-    elseif p == "A" then[m
[31m-      op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1[m
[31m-    elseif p == "M" then[m
[31m-      op = op + parse_imm(params[n], 5, 11, 0, false); n = n + 1[m
[31m-    elseif p == "N" then[m
[31m-      op = op + parse_imm(params[n], 5, 16, 0, false); n = n + 1[m
[31m-    elseif p == "C" then[m
[31m-      op = op + parse_imm(params[n], 3, 18, 0, false); n = n + 1[m
[31m-    elseif p == "V" then[m
[31m-      op = op + parse_imm(params[n], 3, 8, 0, false); n = n + 1[m
[31m-    elseif p == "W" then[m
[31m-      op = op + parse_imm(params[n], 3, 0, 0, false); n = n + 1[m
[31m-    elseif p == "Y" then[m
[31m-      op = op + parse_imm(params[n], 20, 6, 0, false); n = n + 1[m
[31m-    elseif p == "Z" then[m
[31m-      op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1[m
[31m-    elseif p == "=" then[m
[31m-      op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo.[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-  end[m
[31m-  wputpos(pos, op)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_1"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local mode, n, s = parse_label(params[1], true)[m
[31m-  if mode == "EXT" then werror("bad label definition") end[m
[31m-  waction("LABEL_"..mode, n, s, 1)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-map_op[".long_*"] = function(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local n = tonumber(p)[m
[31m-    if not n then werror("bad immediate `"..p.."'") end[m
[31m-    if n < 0 then n = n + 2^32 end[m
[31m-    wputw(n)[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1])[m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION", num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = map_coreop })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex 3f267fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,419 +0,0 @@[m
[31m-/*[m
[31m-** DynASM PPC/PPC64 encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"ppc"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. */[m
[31m-enum {[m
[31m-  DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT,[m
[31m-  /* The following actions need a buffer position. */[m
[31m-  DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG,[m
[31m-  /* The following actions also have an argument. */[m
[31m-  DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM_IMMSH,[m
[31m-  DASM__MAX[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_REL	0x15000000[m
[31m-#define DASM_S_UNDEF_LG		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned int *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    unsigned int ins = *p++;[m
[31m-    unsigned int action = (ins >> 16);[m
[31m-    if (action >= DASM__MAX) {[m
[31m-      ofs += 4;[m
[31m-    } else {[m
[31m-      int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0;[m
[31m-      switch (action) {[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      case DASM_SECTION:[m
[31m-	n = (ins & 255); CK(n < D->maxsection, RANGE_SEC);[m
[31m-	D->section = &D->sections[n]; goto stop;[m
[31m-      case DASM_ESC: p++; ofs += 4; break;[m
[31m-      case DASM_REL_EXT: break;[m
[31m-      case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break;[m
[31m-      case DASM_REL_LG:[m
[31m-	n = (ins & 2047) - 10; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl += 10; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG:[m
[31m-	pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC:[m
[31m-	pl = D->pclabels + n; CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos;[m
[31m-	}[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_IMM:[m
[31m-#ifdef DASM_CHECKS[m
[31m-	CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	n >>= ((ins>>10)&31);[m
[31m-#ifdef DASM_CHECKS[m
[31m-	if (ins & 0x8000)[m
[31m-	  CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-	else[m
[31m-	  CK((n>>((ins>>5)&31)) == 0, RANGE_I);[m
[31m-#endif[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      case DASM_IMMSH:[m
[31m-	CK((n >> 6) == 0, RANGE_I);[m
[31m-	b[pos++] = n;[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_REL_EXT: break;[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break;[m
[31m-	case DASM_REL_LG: case DASM_REL_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break;[m
[31m-	case DASM_IMM: case DASM_IMMSH: pos++; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  char *base = (char *)buffer;[m
[31m-  unsigned int *cp = (unsigned int *)buffer;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      while (1) {[m
[31m-	unsigned int ins = *p++;[m
[31m-	unsigned int action = (ins >> 16);[m
[31m-	int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_STOP: case DASM_SECTION: goto stop;[m
[31m-	case DASM_ESC: *cp++ = *p++; break;[m
[31m-	case DASM_REL_EXT:[m
[31m-	  n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1) - 4;[m
[31m-	  goto patchrel;[m
[31m-	case DASM_ALIGN:[m
[31m-	  ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000;[m
[31m-	  break;[m
[31m-	case DASM_REL_LG:[m
[31m-	  CK(n >= 0, UNDEF_LG);[m
[31m-	case DASM_REL_PC:[m
[31m-	  CK(n >= 0, UNDEF_PC);[m
[31m-	  n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base);[m
[31m-	patchrel:[m
[31m-	  CK((n & 3) == 0 &&[m
[31m-	      (((n+4) + ((ins & 2048) ? 0x00008000 : 0x02000000)) >>[m
[31m-	       ((ins & 2048) ? 16 : 26)) == 0, RANGE_REL);[m
[31m-	  cp[-1] |= ((n+4) & ((ins & 2048) ? 0x0000fffc: 0x03fffffc));[m
[31m-	  break;[m
[31m-	case DASM_LABEL_LG:[m
[31m-	  ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n);[m
[31m-	  break;[m
[31m-	case DASM_LABEL_PC: break;[m
[31m-	case DASM_IMM:[m
[31m-	  cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31);[m
[31m-	  break;[m
[31m-	case DASM_IMMSH:[m
[31m-	  cp[-1] |= (ins & 1) ? ((n&31)<<11)|((n&32)>>4) : ((n&31)<<6)|(n&32);[m
[31m-	  break;[m
[31m-	default: *cp++ = ins; break;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != (char *)cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_ppc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_ppc.lua[m
[1mdeleted file mode 100644[m
[1mindex e2f704e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_ppc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1919 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM PPC/PPC64 module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m---[m
[31m--- Support for various extensions contributed by Caio Souza Oliveira.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	"ppc",[m
[31m-  description =	"DynASM PPC module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, setmetatable = assert, setmetatable[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local match, gmatch = _s.match, _s.gmatch[m
[31m-local concat, sort = table.concat, table.sort[m
[31m-local bit = bit or require("bit")[m
[31m-local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift[m
[31m-local tohex = bit.tohex[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  "STOP", "SECTION", "ESC", "REL_EXT",[m
[31m-  "ALIGN", "REL_LG", "LABEL_LG",[m
[31m-  "REL_PC", "LABEL_PC", "IMM", "IMMSH"[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number.[m
[31m-local map_action = {}[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  map_action[name] = n-1[m
[31m-end[m
[31m-[m
[31m--- Action list buffer.[m
[31m-local actlist = {}[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  if nn == 0 then nn = 1; actlist[0] = map_action.STOP end[m
[31m-  out:write("static const unsigned int ", name, "[", nn, "] = {\n")[m
[31m-  for i = 1,nn-1 do[m
[31m-    assert(out:write("0x", tohex(actlist[i]), ",\n"))[m
[31m-  end[m
[31m-  assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n"))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add word to action list.[m
[31m-local function wputxw(n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, val, a, num)[m
[31m-  local w = assert(map_action[action], "bad action name `"..action.."'")[m
[31m-  wputxw(w * 0x10000 + (val or 0))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  if #actlist == actargs[1] then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true)[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped word.[m
[31m-local function wputw(n)[m
[31m-  if n <= 0xffffff then waction("ESC") end[m
[31m-  wputxw(n)[m
[31m-end[m
[31m-[m
[31m--- Reserve position for word.[m
[31m-local function wpos()[m
[31m-  local pos = #actlist+1[m
[31m-  actlist[pos] = ""[m
[31m-  return pos[m
[31m-end[m
[31m-[m
[31m--- Store word to reserved position.[m
[31m-local function wputpos(pos, n)[m
[31m-  assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range")[m
[31m-  actlist[pos] = n[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 20[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 2047 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  ", prefix, t[i], ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=20,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = 0[m
[31m-local map_extern_ = {}[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n > 2047 then werror("too many extern labels") end[m
[31m-  next_extern = n + 1[m
[31m-  t[name] = n[m
[31m-  map_extern_[n] = name[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write(format("  %s\n", map_extern_[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=0,next_extern-1 do[m
[31m-    out:write("  \"", map_extern_[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-local map_archdef = { sp = "r1" } -- Ext. register name -> int. name.[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for Dt... macros).[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  if s == "r1" then return "sp" end[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-local map_cond = {[m
[31m-  lt = 0, gt = 1, eq = 2, so = 3,[m
[31m-  ge = 4, le = 5, ne = 6, ns = 7,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_op, op_template[m
[31m-[m
[31m-local function op_alias(opname, f)[m
[31m-  return function(params, nparams)[m
[31m-    if not params then return "-> "..opname:sub(1, -3) end[m
[31m-    f(params, nparams)[m
[31m-    op_template(params, map_op[opname], nparams)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Template strings for PPC instructions.[m
[31m-map_op = {[m
[31m-  tdi_3 =	"08000000ARI",[m
[31m-  twi_3 =	"0c000000ARI",[m
[31m-  mulli_3 =	"1c000000RRI",[m
[31m-  subfic_3 =	"20000000RRI",[m
[31m-  cmplwi_3 =	"28000000XRU",[m
[31m-  cmplwi_2 =	"28000000-RU",[m
[31m-  cmpldi_3 =	"28200000XRU",[m
[31m-  cmpldi_2 =	"28200000-RU",[m
[31m-  cmpwi_3 =	"2c000000XRI",[m
[31m-  cmpwi_2 =	"2c000000-RI",[m
[31m-  cmpdi_3 =	"2c200000XRI",[m
[31m-  cmpdi_2 =	"2c200000-RI",[m
[31m-  addic_3 =	"30000000RRI",[m
[31m-  ["addic._3"] = "34000000RRI",[m
[31m-  addi_3 =	"38000000RR0I",[m
[31m-  li_2 =	"38000000RI",[m
[31m-  la_2 =	"38000000RD",[m
[31m-  addis_3 =	"3c000000RR0I",[m
[31m-  lis_2 =	"3c000000RI",[m
[31m-  lus_2 =	"3c000000RU",[m
[31m-  bc_3 =	"40000000AAK",[m
[31m-  bcl_3 =	"40000001AAK",[m
[31m-  bdnz_1 =	"42000000K",[m
[31m-  bdz_1 =	"42400000K",[m
[31m-  sc_0 =	"44000000",[m
[31m-  b_1 =		"48000000J",[m
[31m-  bl_1 =	"48000001J",[m
[31m-  rlwimi_5 =	"50000000RR~AAA.",[m
[31m-  rlwinm_5 =	"54000000RR~AAA.",[m
[31m-  rlwnm_5 =	"5c000000RR~RAA.",[m
[31m-  ori_3 =	"60000000RR~U",[m
[31m-  nop_0 =	"60000000",[m
[31m-  oris_3 =	"64000000RR~U",[m
[31m-  xori_3 =	"68000000RR~U",[m
[31m-  xoris_3 =	"6c000000RR~U",[m
[31m-  ["andi._3"] =	"70000000RR~U",[m
[31m-  ["andis._3"] = "74000000RR~U",[m
[31m-  lwz_2 =	"80000000RD",[m
[31m-  lwzu_2 =	"84000000RD",[m
[31m-  lbz_2 =	"88000000RD",[m
[31m-  lbzu_2 =	"8c000000RD",[m
[31m-  stw_2 =	"90000000RD",[m
[31m-  stwu_2 =	"94000000RD",[m
[31m-  stb_2 =	"98000000RD",[m
[31m-  stbu_2 =	"9c000000RD",[m
[31m-  lhz_2 =	"a0000000RD",[m
[31m-  lhzu_2 =	"a4000000RD",[m
[31m-  lha_2 =	"a8000000RD",[m
[31m-  lhau_2 =	"ac000000RD",[m
[31m-  sth_2 =	"b0000000RD",[m
[31m-  sthu_2 =	"b4000000RD",[m
[31m-  lmw_2 =	"b8000000RD",[m
[31m-  stmw_2 =	"bc000000RD",[m
[31m-  lfs_2 =	"c0000000FD",[m
[31m-  lfsu_2 =	"c4000000FD",[m
[31m-  lfd_2 =	"c8000000FD",[m
[31m-  lfdu_2 =	"cc000000FD",[m
[31m-  stfs_2 =	"d0000000FD",[m
[31m-  stfsu_2 =	"d4000000FD",[m
[31m-  stfd_2 =	"d8000000FD",[m
[31m-  stfdu_2 =	"dc000000FD",[m
[31m-  ld_2 =	"e8000000RD", -- NYI: displacement must be divisible by 4.[m
[31m-  ldu_2 =	"e8000001RD",[m
[31m-  lwa_2 =	"e8000002RD",[m
[31m-  std_2 =	"f8000000RD",[m
[31m-  stdu_2 =	"f8000001RD",[m
[31m-[m
[31m-  subi_3 =	op_alias("addi_3", function(p) p[3] = "-("..p[3]..")" end),[m
[31m-  subis_3 =	op_alias("addis_3", function(p) p[3] = "-("..p[3]..")" end),[m
[31m-  subic_3 =	op_alias("addic_3", function(p) p[3] = "-("..p[3]..")" end),[m
[31m-  ["subic._3"] = op_alias("addic._3", function(p) p[3] = "-("..p[3]..")" end),[m
[31m-[m
[31m-  rotlwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[4] = "0"; p[5] = "31"[m
[31m-  end),[m
[31m-  rotrwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[3] = "32-("..p[3]..")"; p[4] = "0"; p[5] = "31"[m
[31m-  end),[m
[31m-  rotlw_3 =	op_alias("rlwnm_5", function(p)[m
[31m-    p[4] = "0"; p[5] = "31"[m
[31m-  end),[m
[31m-  slwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[5] = "31-("..p[3]..")"; p[4] = "0"[m
[31m-  end),[m
[31m-  srwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[4] = p[3]; p[3] = "32-("..p[3]..")"; p[5] = "31"[m
[31m-  end),[m
[31m-  clrlwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[4] = p[3]; p[3] = "0"; p[5] = "31"[m
[31m-  end),[m
[31m-  clrrwi_3 =	op_alias("rlwinm_5", function(p)[m
[31m-    p[5] = "31-("..p[3]..")"; p[3] = "0"; p[4] = "0"[m
[31m-  end),[m
[31m-[m
[31m-  -- Primary opcode 4:[m
[31m-  mulhhwu_3 =		"10000010RRR.",[m
[31m-  machhwu_3 =		"10000018RRR.",[m
[31m-  mulhhw_3 =		"10000050RRR.",[m
[31m-  nmachhw_3 =		"1000005cRRR.",[m
[31m-  machhwsu_3 =		"10000098RRR.",[m
[31m-  machhws_3 =		"100000d8RRR.",[m
[31m-  nmachhws_3 =		"100000dcRRR.",[m
[31m-  mulchwu_3 =		"10000110RRR.",[m
[31m-  macchwu_3 =		"10000118RRR.",[m
[31m-  mulchw_3 =		"10000150RRR.",[m
[31m-  macchw_3 =		"10000158RRR.",[m
[31m-  nmacchw_3 =		"1000015cRRR.",[m
[31m-  macchwsu_3 =		"10000198RRR.",[m
[31m-  macchws_3 =		"100001d8RRR.",[m
[31m-  nmacchws_3 =		"100001dcRRR.",[m
[31m-  mullhw_3 =		"10000350RRR.",[m
[31m-  maclhw_3 =		"10000358RRR.",[m
[31m-  nmaclhw_3 =		"1000035cRRR.",[m
[31m-  maclhwsu_3 =		"10000398RRR.",[m
[31m-  maclhws_3 =		"100003d8RRR.",[m
[31m-  nmaclhws_3 =		"100003dcRRR.",[m
[31m-  machhwuo_3 =		"10000418RRR.",[m
[31m-  nmachhwo_3 =		"1000045cRRR.",[m
[31m-  machhwsuo_3 =		"10000498RRR.",[m
[31m-  machhwso_3 =		"100004d8RRR.",[m
[31m-  nmachhwso_3 =		"100004dcRRR.",[m
[31m-  macchwuo_3 =		"10000518RRR.",[m
[31m-  macchwo_3 =		"10000558RRR.",[m
[31m-  nmacchwo_3 =		"1000055cRRR.",[m
[31m-  macchwsuo_3 =		"10000598RRR.",[m
[31m-  macchwso_3 =		"100005d8RRR.",[m
[31m-  nmacchwso_3 =		"100005dcRRR.",[m
[31m-  maclhwo_3 =		"10000758RRR.",[m
[31m-  nmaclhwo_3 =		"1000075cRRR.",[m
[31m-  maclhwsuo_3 =		"10000798RRR.",[m
[31m-  maclhwso_3 =		"100007d8RRR.",[m
[31m-  nmaclhwso_3 =		"100007dcRRR.",[m
[31m-[m
[31m-  vaddubm_3 =		"10000000VVV",[m
[31m-  vmaxub_3 =		"10000002VVV",[m
[31m-  vrlb_3 =		"10000004VVV",[m
[31m-  vcmpequb_3 =		"10000006VVV",[m
[31m-  vmuloub_3 =		"10000008VVV",[m
[31m-  vaddfp_3 =		"1000000aVVV",[m
[31m-  vmrghb_3 =		"1000000cVVV",[m
[31m-  vpkuhum_3 =		"1000000eVVV",[m
[31m-  vmhaddshs_4 =		"10000020VVVV",[m
[31m-  vmhraddshs_4 =	"10000021VVVV",[m
[31m-  vmladduhm_4 =		"10000022VVVV",[m
[31m-  vmsumubm_4 =		"10000024VVVV",[m
[31m-  vmsummbm_4 =		"10000025VVVV",[m
[31m-  vmsumuhm_4 =		"10000026VVVV",[m
[31m-  vmsumuhs_4 =		"10000027VVVV",[m
[31m-  vmsumshm_4 =		"10000028VVVV",[m
[31m-  vmsumshs_4 =		"10000029VVVV",[m
[31m-  vsel_4 =		"1000002aVVVV",[m
[31m-  vperm_4 =		"1000002bVVVV",[m
[31m-  vsldoi_4 =		"1000002cVVVP",[m
[31m-  vpermxor_4 =		"1000002dVVVV",[m
[31m-  vmaddfp_4 =		"1000002eVVVV~",[m
[31m-  vnmsubfp_4 =		"1000002fVVVV~",[m
[31m-  vaddeuqm_4 =		"1000003cVVVV",[m
[31m-  vaddecuq_4 =		"1000003dVVVV",[m
[31m-  vsubeuqm_4 =		"1000003eVVVV",[m
[31m-  vsubecuq_4 =		"1000003fVVVV",[m
[31m-  vadduhm_3 =		"10000040VVV",[m
[31m-  vmaxuh_3 =		"10000042VVV",[m
[31m-  vrlh_3 =		"10000044VVV",[m
[31m-  vcmpequh_3 =		"10000046VVV",[m
[31m-  vmulouh_3 =		"10000048VVV",[m
[31m-  vsubfp_3 =		"1000004aVVV",[m
[31m-  vmrghh_3 =		"1000004cVVV",[m
[31m-  vpkuwum_3 =		"1000004eVVV",[m
[31m-  vadduwm_3 =		"10000080VVV",[m
[31m-  vmaxuw_3 =		"10000082VVV",[m
[31m-  vrlw_3 =		"10000084VVV",[m
[31m-  vcmpequw_3 =		"10000086VVV",[m
[31m-  vmulouw_3 =		"10000088VVV",[m
[31m-  vmuluwm_3 =		"10000089VVV",[m
[31m-  vmrghw_3 =		"1000008cVVV",[m
[31m-  vpkuhus_3 =		"1000008eVVV",[m
[31m-  vaddudm_3 =		"100000c0VVV",[m
[31m-  vmaxud_3 =		"100000c2VVV",[m
[31m-  vrld_3 =		"100000c4VVV",[m
[31m-  vcmpeqfp_3 =		"100000c6VVV",[m
[31m-  vcmpequd_3 =		"100000c7VVV",[m
[31m-  vpkuwus_3 =		"100000ceVVV",[m
[31m-  vadduqm_3 =		"10000100VVV",[m
[31m-  vmaxsb_3 =		"10000102VVV",[m
[31m-  vslb_3 =		"10000104VVV",[m
[31m-  vmulosb_3 =		"10000108VVV",[m
[31m-  vrefp_2 =		"1000010aV-V",[m
[31m-  vmrglb_3 =		"1000010cVVV",[m
[31m-  vpkshus_3 =		"1000010eVVV",[m
[31m-  vaddcuq_3 =		"10000140VVV",[m
[31m-  vmaxsh_3 =		"10000142VVV",[m
[31m-  vslh_3 =		"10000144VVV",[m
[31m-  vmulosh_3 =		"10000148VVV",[m
[31m-  vrsqrtefp_2 =		"1000014aV-V",[m
[31m-  vmrglh_3 =		"1000014cVVV",[m
[31m-  vpkswus_3 =		"1000014eVVV",[m
[31m-  vaddcuw_3 =		"10000180VVV",[m
[31m-  vmaxsw_3 =		"10000182VVV",[m
[31m-  vslw_3 =		"10000184VVV",[m
[31m-  vmulosw_3 =		"10000188VVV",[m
[31m-  vexptefp_2 =		"1000018aV-V",[m
[31m-  vmrglw_3 =		"1000018cVVV",[m
[31m-  vpkshss_3 =		"1000018eVVV",[m
[31m-  vmaxsd_3 =		"100001c2VVV",[m
[31m-  vsl_3 =		"100001c4VVV",[m
[31m-  vcmpgefp_3 =		"100001c6VVV",[m
[31m-  vlogefp_2 =		"100001caV-V",[m
[31m-  vpkswss_3 =		"100001ceVVV",[m
[31m-  vadduhs_3 =		"10000240VVV",[m
[31m-  vminuh_3 =		"10000242VVV",[m
[31m-  vsrh_3 =		"10000244VVV",[m
[31m-  vcmpgtuh_3 =		"10000246VVV",[m
[31m-  vmuleuh_3 =		"10000248VVV",[m
[31m-  vrfiz_2 =		"1000024aV-V",[m
[31m-  vsplth_3 =		"1000024cVV3",[m
[31m-  vupkhsh_2 =		"1000024eV-V",[m
[31m-  vminuw_3 =		"10000282VVV",[m
[31m-  vminud_3 =		"100002c2VVV",[m
[31m-  vcmpgtud_3 =		"100002c7VVV",[m
[31m-  vrfim_2 =		"100002caV-V",[m
[31m-  vcmpgtsb_3 =		"10000306VVV",[m
[31m-  vcfux_3 =		"1000030aVVA~",[m
[31m-  vaddshs_3 =		"10000340VVV",[m
[31m-  vminsh_3 =		"10000342VVV",[m
[31m-  vsrah_3 =		"10000344VVV",[m
[31m-  vcmpgtsh_3 =		"10000346VVV",[m
[31m-  vmulesh_3 =		"10000348VVV",[m
[31m-  vcfsx_3 =		"1000034aVVA~",[m
[31m-  vspltish_2 =		"1000034cVS",[m
[31m-  vupkhpx_2 =		"1000034eV-V",[m
[31m-  vaddsws_3 =		"10000380VVV",[m
[31m-  vminsw_3 =		"10000382VVV",[m
[31m-  vsraw_3 =		"10000384VVV",[m
[31m-  vcmpgtsw_3 =		"10000386VVV",[m
[31m-  vmulesw_3 =		"10000388VVV",[m
[31m-  vctuxs_3 =		"1000038aVVA~",[m
[31m-  vspltisw_2 =		"1000038cVS",[m
[31m-  vminsd_3 =		"100003c2VVV",[m
[31m-  vsrad_3 =		"100003c4VVV",[m
[31m-  vcmpbfp_3 =		"100003c6VVV",[m
[31m-  vcmpgtsd_3 =		"100003c7VVV",[m
[31m-  vctsxs_3 =		"100003caVVA~",[m
[31m-  vupklpx_2 =		"100003ceV-V",[m
[31m-  vsububm_3 =		"10000400VVV",[m
[31m-  ["bcdadd._4"] =	"10000401VVVy.",[m
[31m-  vavgub_3 =		"10000402VVV",[m
[31m-  vand_3 =		"10000404VVV",[m
[31m-  ["vcmpequb._3"] =	"10000406VVV",[m
[31m-  vmaxfp_3 =		"1000040aVVV",[m
[31m-  vsubuhm_3 =		"10000440VVV",[m
[31m-  ["bcdsub._4"] =	"10000441VVVy.",[m
[31m-  vavguh_3 =		"10000442VVV",[m
[31m-  vandc_3 =		"10000444VVV",[m
[31m-  ["vcmpequh._3"] =	"10000446VVV",[m
[31m-  vminfp_3 =		"1000044aVVV",[m
[31m-  vpkudum_3 =		"1000044eVVV",[m
[31m-  vsubuwm_3 =		"10000480VVV",[m
[31m-  vavguw_3 =		"10000482VVV",[m
[31m-  vor_3 =		"10000484VVV",[m
[31m-  ["vcmpequw._3"] =	"10000486VVV",[m
[31m-  vpmsumw_3 =		"10000488VVV",[m
[31m-  ["vcmpeqfp._3"] =	"100004c6VVV",[m
[31m-  ["vcmpequd._3"] =	"100004c7VVV",[m
[31m-  vpkudus_3 =		"100004ceVVV",[m
[31m-  vavgsb_3 =		"10000502VVV",[m
[31m-  vavgsh_3 =		"10000542VVV",[m
[31m-  vorc_3 =		"10000544VVV",[m
[31m-  vbpermq_3 =		"1000054cVVV",[m
[31m-  vpksdus_3 =		"1000054eVVV",[m
[31m-  vavgsw_3 =		"10000582VVV",[m
[31m-  vsld_3 =		"100005c4VVV",[m
[31m-  ["vcmpgefp._3"] =	"100005c6VVV",[m
[31m-  vpksdss_3 =		"100005ceVVV",[m
[31m-  vsububs_3 =		"10000600VVV",[m
[31m-  mfvscr_1 =		"10000604V--",[m
[31m-  vsum4ubs_3 =		"10000608VVV",[m
[31m-  vsubuhs_3 =		"10000640VVV",[m
[31m-  mtvscr_1 =		"10000644--V",[m
[31m-  ["vcmpgtuh._3"] =	"10000646VVV",[m
[31m-  vsum4shs_3 =		"10000648VVV",[m
[31m-  vupkhsw_2 =		"1000064eV-V",[m
[31m-  vsubuws_3 =		"10000680VVV",[m
[31m-  vshasigmaw_4 =	"10000682VVYp",[m
[31m-  veqv_3 =		"10000684VVV",[m
[31m-  vsum2sws_3 =		"10000688VVV",[m
[31m-  vmrgow_3 =		"1000068cVVV",[m
[31m-  vshasigmad_4 =	"100006c2VVYp",[m
[31m-  vsrd_3 =		"100006c4VVV",[m
[31m-  ["vcmpgtud._3"] =	"100006c7VVV",[m
[31m-  vupklsw_2 =		"100006ceV-V",[m
[31m-  vupkslw_2 =		"100006ceV-V",[m
[31m-  vsubsbs_3 =		"10000700VVV",[m
[31m-  vclzb_2 =		"10000702V-V",[m
[31m-  vpopcntb_2 =		"10000703V-V",[m
[31m-  ["vcmpgtsb._3"] =	"10000706VVV",[m
[31m-  vsum4sbs_3 =		"10000708VVV",[m
[31m-  vsubshs_3 =		"10000740VVV",[m
[31m-  vclzh_2 =		"10000742V-V",[m
[31m-  vpopcnth_2 =		"10000743V-V",[m
[31m-  ["vcmpgtsh._3"] =	"10000746VVV",[m
[31m-  vsubsws_3 =		"10000780VVV",[m
[31m-  vclzw_2 =		"10000782V-V",[m
[31m-  vpopcntw_2 =		"10000783V-V",[m
[31m-  ["vcmpgtsw._3"] =	"10000786VVV",[m
[31m-  vsumsws_3 =		"10000788VVV",[m
[31m-  vmrgew_3 =		"1000078cVVV",[m
[31m-  vclzd_2 =		"100007c2V-V",[m
[31m-  vpopcntd_2 =		"100007c3V-V",[m
[31m-  ["vcmpbfp._3"] =	"100007c6VVV",[m
[31m-  ["vcmpgtsd._3"] =	"100007c7VVV",[m
[31m-[m
[31m-  -- Primary opcode 19:[m
[31m-  mcrf_2 =	"4c000000XX",[m
[31m-  isync_0 =	"4c00012c",[m
[31m-  crnor_3 =	"4c000042CCC",[m
[31m-  crnot_2 =	"4c000042CC=",[m
[31m-  crandc_3 =	"4c000102CCC",[m
[31m-  crxor_3 =	"4c000182CCC",[m
[31m-  crclr_1 =	"4c000182C==",[m
[31m-  crnand_3 =	"4c0001c2CCC",[m
[31m-  crand_3 =	"4c000202CCC",[m
[31m-  creqv_3 =	"4c000242CCC",[m
[31m-  crset_1 =	"4c000242C==",[m
[31m-  crorc_3 =	"4c000342CCC",[m
[31m-  cror_3 =	"4c000382CCC",[m
[31m-  crmove_2 =	"4c000382CC=",[m
[31m-  bclr_2 =	"4c000020AA",[m
[31m-  bclrl_2 =	"4c000021AA",[m
[31m-  bcctr_2 =	"4c000420AA",[m
[31m-  bcctrl_2 =	"4c000421AA",[m
[31m-  bctar_2 =	"4c000460AA",[m
[31m-  bctarl_2 =	"4c000461AA",[m
[31m-  blr_0 =	"4e800020",[m
[31m-  blrl_0 =	"4e800021",[m
[31m-  bctr_0 =	"4e800420",[m
[31m-  bctrl_0 =	"4e800421",[m
[31m-[m
[31m-  -- Primary opcode 31:[m
[31m-  cmpw_3 =	"7c000000XRR",[m
[31m-  cmpw_2 =	"7c000000-RR",[m
[31m-  cmpd_3 =	"7c200000XRR",[m
[31m-  cmpd_2 =	"7c200000-RR",[m
[31m-  tw_3 =	"7c000008ARR",[m
[31m-  lvsl_3 =	"7c00000cVRR",[m
[31m-  subfc_3 =	"7c000010RRR.",[m
[31m-  subc_3 =	"7c000010RRR~.",[m
[31m-  mulhdu_3 =	"7c000012RRR.",[m
[31m-  addc_3 =	"7c000014RRR.",[m
[31m-  mulhwu_3 =	"7c000016RRR.",[m
[31m-  isel_4 =	"7c00001eRRRC",[m
[31m-  isellt_3 =	"7c00001eRRR",[m
[31m-  iselgt_3 =	"7c00005eRRR",[m
[31m-  iseleq_3 =	"7c00009eRRR",[m
[31m-  mfcr_1 =	"7c000026R",[m
[31m-  mfocrf_2 =	"7c100026RG",[m
[31m-  mtcrf_2 =	"7c000120GR",[m
[31m-  mtocrf_2 =	"7c100120GR",[m
[31m-  lwarx_3 =	"7c000028RR0R",[m
[31m-  ldx_3 =	"7c00002aRR0R",[m
[31m-  lwzx_3 =	"7c00002eRR0R",[m
[31m-  slw_3 =	"7c000030RR~R.",[m
[31m-  cntlzw_2 =	"7c000034RR~",[m
[31m-  sld_3 =	"7c000036RR~R.",[m
[31m-  and_3 =	"7c000038RR~R.",[m
[31m-  cmplw_3 =	"7c000040XRR",[m
[31m-  cmplw_2 =	"7c000040-RR",[m
[31m-  cmpld_3 =	"7c200040XRR",[m
[31m-  cmpld_2 =	"7c200040-RR",[m
[31m-  lvsr_3 =	"7c00004cVRR",[m
[31m-  subf_3 =	"7c000050RRR.",[m
[31m-  sub_3 =	"7c000050RRR~.",[m
[31m-  lbarx_3 =	"7c000068RR0R",[m
[31m-  ldux_3 =	"7c00006aRR0R",[m
[31m-  dcbst_2 =	"7c00006c-RR",[m
[31m-  lwzux_3 =	"7c00006eRR0R",[m
[31m-  cntlzd_2 =	"7c000074RR~",[m
[31m-  andc_3 =	"7c000078RR~R.",[m
[31m-  td_3 =	"7c000088ARR",[m
[31m-  lvewx_3 =	"7c00008eVRR",[m
[31m-  mulhd_3 =	"7c000092RRR.",[m
[31m-  addg6s_3 =	"7c000094RRR",[m
[31m-  mulhw_3 =	"7c000096RRR.",[m
[31m-  dlmzb_3 =	"7c00009cRR~R.",[m
[31m-  ldarx_3 =	"7c0000a8RR0R",[m
[31m-  dcbf_2 =	"7c0000ac-RR",[m
[31m-  lbzx_3 =	"7c0000aeRR0R",[m
[31m-  lvx_3 =	"7c0000ceVRR",[m
[31m-  neg_2 =	"7c0000d0RR.",[m
[31m-  lharx_3 =	"7c0000e8RR0R",[m
[31m-  lbzux_3 =	"7c0000eeRR0R",[m
[31m-  popcntb_2 =	"7c0000f4RR~",[m
[31m-  not_2 =	"7c0000f8RR~%.",[m
[31m-  nor_3 =	"7c0000f8RR~R.",[m
[31m-  stvebx_3 =	"7c00010eVRR",[m
[31m-  subfe_3 =	"7c000110RRR.",[m
[31m-  sube_3 =	"7c000110RRR~.",[m
[31m-  adde_3 =	"7c000114RRR.",[m
[31m-  stdx_3 =	"7c00012aRR0R",[m
[31m-  ["stwcx._3"] =	"7c00012dRR0R.",[m
[31m-  stwx_3 =	"7c00012eRR0R",[m
[31m-  prtyw_2 =	"7c000134RR~",[m
[31m-  stvehx_3 =	"7c00014eVRR",[m
[31m-  stdux_3 =	"7c00016aRR0R",[m
[31m-  ["stqcx._3"] =	"7c00016dR:R0R.",[m
[31m-  stwux_3 =	"7c00016eRR0R",[m
[31m-  prtyd_2 =	"7c000174RR~",[m
[31m-  stvewx_3 =	"7c00018eVRR",[m
[31m-  subfze_2 =	"7c000190RR.",[m
[31m-  addze_2 =	"7c000194RR.",[m
[31m-  ["stdcx._3"] =	"7c0001adRR0R.",[m
[31m-  stbx_3 =	"7c0001aeRR0R",[m
[31m-  stvx_3 =	"7c0001ceVRR",[m
[31m-  subfme_2 =	"7c0001d0RR.",[m
[31m-  mulld_3 =	"7c0001d2RRR.",[m
[31m-  addme_2 =	"7c0001d4RR.",[m
[31m-  mullw_3 =	"7c0001d6RRR.",[m
[31m-  dcbtst_2 =	"7c0001ec-RR",[m
[31m-  stbux_3 =	"7c0001eeRR0R",[m
[31m-  bpermd_3 =	"7c0001f8RR~R",[m
[31m-  lvepxl_3 =	"7c00020eVRR",[m
[31m-  add_3 =	"7c000214RRR.",[m
[31m-  lqarx_3 =	"7c000228R:R0R",[m
[31m-  dcbt_2 =	"7c00022c-RR",[m
[31m-  lhzx_3 =	"7c00022eRR0R",[m
[31m-  cdtbcd_2 =	"7c000234RR~",[m
[31m-  eqv_3 =	"7c000238RR~R.",[m
[31m-  lvepx_3 =	"7c00024eVRR",[m
[31m-  eciwx_3 =	"7c00026cRR0R",[m
[31m-  lhzux_3 =	"7c00026eRR0R",[m
[31m-  cbcdtd_2 =	"7c000274RR~",[m
[31m-  xor_3 =	"7c000278RR~R.",[m
[31m-  mfspefscr_1 =	"7c0082a6R",[m
[31m-  mfxer_1 =	"7c0102a6R",[m
[31m-  mflr_1 =	"7c0802a6R",[m
[31m-  mfctr_1 =	"7c0902a6R",[m
[31m-  lwax_3 =	"7c0002aaRR0R",[m
[31m-  lhax_3 =	"7c0002aeRR0R",[m
[31m-  mftb_1 =	"7c0c42e6R",[m
[31m-  mftbu_1 =	"7c0d42e6R",[m
[31m-  lvxl_3 =	"7c0002ceVRR",[m
[31m-  lwaux_3 =	"7c0002eaRR0R",[m
[31m-  lhaux_3 =	"7c0002eeRR0R",[m
[31m-  popcntw_2 =	"7c0002f4RR~",[m
[31m-  divdeu_3 =	"7c000312RRR.",[m
[31m-  divweu_3 =	"7c000316RRR.",[m
[31m-  sthx_3 =	"7c00032eRR0R",[m
[31m-  orc_3 =	"7c000338RR~R.",[m
[31m-  ecowx_3 =	"7c00036cRR0R",[m
[31m-  sthux_3 =	"7c00036eRR0R",[m
[31m-  or_3 =	"7c000378RR~R.",[m
[31m-  mr_2 =	"7c000378RR~%.",[m
[31m-  divdu_3 =	"7c000392RRR.",[m
[31m-  divwu_3 =	"7c000396RRR.",[m
[31m-  mtspefscr_1 =	"7c0083a6R",[m
[31m-  mtxer_1 =	"7c0103a6R",[m
[31m-  mtlr_1 =	"7c0803a6R",[m
[31m-  mtctr_1 =	"7c0903a6R",[m
[31m-  dcbi_2 =	"7c0003ac-RR",[m
[31m-  nand_3 =	"7c0003b8RR~R.",[m
[31m-  dsn_2 =	"7c0003c6-RR",[m
[31m-  stvxl_3 =	"7c0003ceVRR",[m
[31m-  divd_3 =	"7c0003d2RRR.",[m
[31m-  divw_3 =	"7c0003d6RRR.",[m
[31m-  popcntd_2 =	"7c0003f4RR~",[m
[31m-  cmpb_3 =	"7c0003f8RR~R.",[m
[31m-  mcrxr_1 =	"7c000400X",[m
[31m-  lbdx_3 =	"7c000406RRR",[m
[31m-  subfco_3 =	"7c000410RRR.",[m
[31m-  subco_3 =	"7c000410RRR~.",[m
[31m-  addco_3 =	"7c000414RRR.",[m
[31m-  ldbrx_3 =	"7c000428RR0R",[m
[31m-  lswx_3 =	"7c00042aRR0R",[m
[31m-  lwbrx_3 =	"7c00042cRR0R",[m
[31m-  lfsx_3 =	"7c00042eFR0R",[m
[31m-  srw_3 =	"7c000430RR~R.",[m
[31m-  srd_3 =	"7c000436RR~R.",[m
[31m-  lhdx_3 =	"7c000446RRR",[m
[31m-  subfo_3 =	"7c000450RRR.",[m
[31m-  subo_3 =	"7c000450RRR~.",[m
[31m-  lfsux_3 =	"7c00046eFR0R",[m
[31m-  lwdx_3 =	"7c000486RRR",[m
[31m-  lswi_3 =	"7c0004aaRR0A",[m
[31m-  sync_0 =	"7c0004ac",[m
[31m-  lwsync_0 =	"7c2004ac",[m
[31m-  ptesync_0 =	"7c4004ac",[m
[31m-  lfdx_3 =	"7c0004aeFR0R",[m
[31m-  lddx_3 =	"7c0004c6RRR",[m
[31m-  nego_2 =	"7c0004d0RR.",[m
[31m-  lfdux_3 =	"7c0004eeFR0R",[m
[31m-  stbdx_3 =	"7c000506RRR",[m
[31m-  subfeo_3 =	"7c000510RRR.",[m
[31m-  subeo_3 =	"7c000510RRR~.",[m
[31m-  addeo_3 =	"7c000514RRR.",[m
[31m-  stdbrx_3 =	"7c000528RR0R",[m
[31m-  stswx_3 =	"7c00052aRR0R",[m
[31m-  stwbrx_3 =	"7c00052cRR0R",[m
[31m-  stfsx_3 =	"7c00052eFR0R",[m
[31m-  sthdx_3 =	"7c000546RRR",[m
[31m-  ["stbcx._3"] =	"7c00056dRRR",[m
[31m-  stfsux_3 =	"7c00056eFR0R",[m
[31m-  stwdx_3 =	"7c000586RRR",[m
[31m-  subfzeo_2 =	"7c000590RR.",[m
[31m-  addzeo_2 =	"7c000594RR.",[m
[31m-  stswi_3 =	"7c0005aaRR0A",[m
[31m-  ["sthcx._3"] =	"7c0005adRRR",[m
[31m-  stfdx_3 =	"7c0005aeFR0R",[m
[31m-  stddx_3 =	"7c0005c6RRR",[m
[31m-  subfmeo_2 =	"7c0005d0RR.",[m
[31m-  mulldo_3 =	"7c0005d2RRR.",[m
[31m-  addmeo_2 =	"7c0005d4RR.",[m
[31m-  mullwo_3 =	"7c0005d6RRR.",[m
[31m-  dcba_2 =	"7c0005ec-RR",[m
[31m-  stfdux_3 =	"7c0005eeFR0R",[m
[31m-  stvepxl_3 =	"7c00060eVRR",[m
[31m-  addo_3 =	"7c000614RRR.",[m
[31m-  lhbrx_3 =	"7c00062cRR0R",[m
[31m-  lfdpx_3 =	"7c00062eF:RR",[m
[31m-  sraw_3 =	"7c000630RR~R.",[m
[31m-  srad_3 =	"7c000634RR~R.",[m
[31m-  lfddx_3 =	"7c000646FRR",[m
[31m-  stvepx_3 =	"7c00064eVRR",[m
[31m-  srawi_3 =	"7c000670RR~A.",[m
[31m-  sradi_3 =	"7c000674RR~H.",[m
[31m-  eieio_0 =	"7c0006ac",[m
[31m-  lfiwax_3 =	"7c0006aeFR0R",[m
[31m-  divdeuo_3 =	"7c000712RRR.",[m
[31m-  divweuo_3 =	"7c000716RRR.",[m
[31m-  sthbrx_3 =	"7c00072cRR0R",[m
[31m-  stfdpx_3 =	"7c00072eF:RR",[m
[31m-  extsh_2 =	"7c000734RR~.",[m
[31m-  stfddx_3 =	"7c000746FRR",[m
[31m-  divdeo_3 =	"7c000752RRR.",[m
[31m-  divweo_3 =	"7c000756RRR.",[m
[31m-  extsb_2 =	"7c000774RR~.",[m
[31m-  divduo_3 =	"7c000792RRR.",[m
[31m-  divwou_3 =	"7c000796RRR.",[m
[31m-  icbi_2 =	"7c0007ac-RR",[m
[31m-  stfiwx_3 =	"7c0007aeFR0R",[m
[31m-  extsw_2 =	"7c0007b4RR~.",[m
[31m-  divdo_3 =	"7c0007d2RRR.",[m
[31m-  divwo_3 =	"7c0007d6RRR.",[m
[31m-  dcbz_2 =	"7c0007ec-RR",[m
[31m-[m
[31m-  ["tbegin._1"] =	"7c00051d1",[m
[31m-  ["tbegin._0"] =	"7c00051d",[m
[31m-  ["tend._1"] =		"7c00055dY",[m
[31m-  ["tend._0"] =		"7c00055d",[m
[31m-  ["tendall._0"] =	"7e00055d",[m
[31m-  tcheck_1 =		"7c00059cX",[m
[31m-  ["tsr._1"] =		"7c0005dd1",[m
[31m-  ["tsuspend._0"] =	"7c0005dd",[m
[31m-  ["tresume._0"] =	"7c2005dd",[m
[31m-  ["tabortwc._3"] =	"7c00061dARR",[m
[31m-  ["tabortdc._3"] =	"7c00065dARR",[m
[31m-  ["tabortwci._3"] =	"7c00069dARS",[m
[31m-  ["tabortdci._3"] =	"7c0006ddARS",[m
[31m-  ["tabort._1"] =	"7c00071d-R-",[m
[31m-  ["treclaim._1"] =	"7c00075d-R",[m
[31m-  ["trechkpt._0"] =	"7c0007dd",[m
[31m-[m
[31m-  lxsiwzx_3 =	"7c000018QRR",[m
[31m-  lxsiwax_3 =	"7c000098QRR",[m
[31m-  mfvsrd_2 =	"7c000066-Rq",[m
[31m-  mfvsrwz_2 =	"7c0000e6-Rq",[m
[31m-  stxsiwx_3 =	"7c000118QRR",[m
[31m-  mtvsrd_2 =	"7c000166QR",[m
[31m-  mtvsrwa_2 =	"7c0001a6QR",[m
[31m-  lxvdsx_3 =	"7c000298QRR",[m
[31m-  lxsspx_3 =	"7c000418QRR",[m
[31m-  lxsdx_3 =	"7c000498QRR",[m
[31m-  stxsspx_3 =	"7c000518QRR",[m
[31m-  stxsdx_3 =	"7c000598QRR",[m
[31m-  lxvw4x_3 =	"7c000618QRR",[m
[31m-  lxvd2x_3 =	"7c000698QRR",[m
[31m-  stxvw4x_3 =	"7c000718QRR",[m
[31m-  stxvd2x_3 =	"7c000798QRR",[m
[31m-[m
[31m-  -- Primary opcode 30:[m
[31m-  rldicl_4 =	"78000000RR~HM.",[m
[31m-  rldicr_4 =	"78000004RR~HM.",[m
[31m-  rldic_4 =	"78000008RR~HM.",[m
[31m-  rldimi_4 =	"7800000cRR~HM.",[m
[31m-  rldcl_4 =	"78000010RR~RM.",[m
[31m-  rldcr_4 =	"78000012RR~RM.",[m
[31m-[m
[31m-  rotldi_3 =	op_alias("rldicl_4", function(p)[m
[31m-    p[4] = "0"[m
[31m-  end),[m
[31m-  rotrdi_3 =	op_alias("rldicl_4", function(p)[m
[31m-    p[3] = "64-("..p[3]..")"; p[4] = "0"[m
[31m-  end),[m
[31m-  rotld_3 =	op_alias("rldcl_4", function(p)[m
[31m-    p[4] = "0"[m
[31m-  end),[m
[31m-  sldi_3 =	op_alias("rldicr_4", function(p)[m
[31m-    p[4] = "63-("..p[3]..")"[m
[31m-  end),[m
[31m-  srdi_3 =	op_alias("rldicl_4", function(p)[m
[31m-    p[4] = p[3]; p[3] = "64-("..p[3]..")"[m
[31m-  end),[m
[31m-  clrldi_3 =	op_alias("rldicl_4", function(p)[m
[31m-    p[4] = p[3]; p[3] = "0"[m
[31m-  end),[m
[31m-  clrrdi_3 =	op_alias("rldicr_4", function(p)[m
[31m-    p[4] = "63-("..p[3]..")"; p[3] = "0"[m
[31m-  end),[m
[31m-[m
[31m-  -- Primary opcode 56:[m
[31m-  lq_2 =	"e0000000R:D", -- NYI: displacement must be divisible by 8.[m
[31m-[m
[31m-  -- Primary opcode 57:[m
[31m-  lfdp_2 =	"e4000000F:D", -- NYI: displacement must be divisible by 4.[m
[31m-[m
[31m-  -- Primary opcode 59:[m
[31m-  fdivs_3 =	"ec000024FFF.",[m
[31m-  fsubs_3 =	"ec000028FFF.",[m
[31m-  fadds_3 =	"ec00002aFFF.",[m
[31m-  fsqrts_2 =	"ec00002cF-F.",[m
[31m-  fres_2 =	"ec000030F-F.",[m
[31m-  fmuls_3 =	"ec000032FF-F.",[m
[31m-  frsqrtes_2 =	"ec000034F-F.",[m
[31m-  fmsubs_4 =	"ec000038FFFF~.",[m
[31m-  fmadds_4 =	"ec00003aFFFF~.",[m
[31m-  fnmsubs_4 =	"ec00003cFFFF~.",[m
[31m-  fnmadds_4 =	"ec00003eFFFF~.",[m
[31m-  fcfids_2 =	"ec00069cF-F.",[m
[31m-  fcfidus_2 =	"ec00079cF-F.",[m
[31m-[m
[31m-  dadd_3 =	"ec000004FFF.",[m
[31m-  dqua_4 =	"ec000006FFFZ.",[m
[31m-  dmul_3 =	"ec000044FFF.",[m
[31m-  drrnd_4 =	"ec000046FFFZ.",[m
[31m-  dscli_3 =	"ec000084FF6.",[m
[31m-  dquai_4 =	"ec000086SF~FZ.",[m
[31m-  dscri_3 =	"ec0000c4FF6.",[m
[31m-  drintx_4 =	"ec0000c61F~FZ.",[m
[31m-  dcmpo_3 =	"ec000104XFF",[m
[31m-  dtstex_3 =	"ec000144XFF",[m
[31m-  dtstdc_3 =	"ec000184XF6",[m
[31m-  dtstdg_3 =	"ec0001c4XF6",[m
[31m-  drintn_4 =	"ec0001c61F~FZ.",[m
[31m-  dctdp_2 =	"ec000204F-F.",[m
[31m-  dctfix_2 =	"ec000244F-F.",[m
[31m-  ddedpd_3 =	"ec000284ZF~F.",[m
[31m-  dxex_2 =	"ec0002c4F-F.",[m
[31m-  dsub_3 =	"ec000404FFF.",[m
[31m-  ddiv_3 =	"ec000444FFF.",[m
[31m-  dcmpu_3 =	"ec000504XFF",[m
[31m-  dtstsf_3 =	"ec000544XFF",[m
[31m-  drsp_2 =	"ec000604F-F.",[m
[31m-  dcffix_2 =	"ec000644F-F.",[m
[31m-  denbcd_3 =	"ec000684YF~F.",[m
[31m-  diex_3 =	"ec0006c4FFF.",[m
[31m-[m
[31m-  -- Primary opcode 60:[m
[31m-  xsaddsp_3 =		"f0000000QQQ",[m
[31m-  xsmaddasp_3 =		"f0000008QQQ",[m
[31m-  xxsldwi_4 =		"f0000010QQQz",[m
[31m-  xsrsqrtesp_2 =	"f0000028Q-Q",[m
[31m-  xssqrtsp_2 =		"f000002cQ-Q",[m
[31m-  xxsel_4 =		"f0000030QQQQ",[m
[31m-  xssubsp_3 =		"f0000040QQQ",[m
[31m-  xsmaddmsp_3 =		"f0000048QQQ",[m
[31m-  xxpermdi_4 =		"f0000050QQQz",[m
[31m-  xsresp_2 =		"f0000068Q-Q",[m
[31m-  xsmulsp_3 =		"f0000080QQQ",[m
[31m-  xsmsubasp_3 =		"f0000088QQQ",[m
[31m-  xxmrghw_3 =		"f0000090QQQ",[m
[31m-  xsdivsp_3 =		"f00000c0QQQ",[m
[31m-  xsmsubmsp_3 =		"f00000c8QQQ",[m
[31m-  xsadddp_3 =		"f0000100QQQ",[m
[31m-  xsmaddadp_3 =		"f0000108QQQ",[m
[31m-  xscmpudp_3 =		"f0000118XQQ",[m
[31m-  xscvdpuxws_2 =	"f0000120Q-Q",[m
[31m-  xsrdpi_2 =		"f0000124Q-Q",[m
[31m-  xsrsqrtedp_2 =	"f0000128Q-Q",[m
[31m-  xssqrtdp_2 =		"f000012cQ-Q",[m
[31m-  xssubdp_3 =		"f0000140QQQ",[m
[31m-  xsmaddmdp_3 =		"f0000148QQQ",[m
[31m-  xscmpodp_3 =		"f0000158XQQ",[m
[31m-  xscvdpsxws_2 =	"f0000160Q-Q",[m
[31m-  xsrdpiz_2 =		"f0000164Q-Q",[m
[31m-  xsredp_2 =		"f0000168Q-Q",[m
[31m-  xsmuldp_3 =		"f0000180QQQ",[m
[31m-  xsmsubadp_3 =		"f0000188QQQ",[m
[31m-  xxmrglw_3 =		"f0000190QQQ",[m
[31m-  xsrdpip_2 =		"f00001a4Q-Q",[m
[31m-  xstsqrtdp_2 =		"f00001a8X-Q",[m
[31m-  xsrdpic_2 =		"f00001acQ-Q",[m
[31m-  xsdivdp_3 =		"f00001c0QQQ",[m
[31m-  xsmsubmdp_3 =		"f00001c8QQQ",[m
[31m-  xsrdpim_2 =		"f00001e4Q-Q",[m
[31m-  xstdivdp_3 =		"f00001e8XQQ",[m
[31m-  xvaddsp_3 =		"f0000200QQQ",[m
[31m-  xvmaddasp_3 =		"f0000208QQQ",[m
[31m-  xvcmpeqsp_3 =		"f0000218QQQ",[m
[31m-  xvcvspuxws_2 =	"f0000220Q-Q",[m
[31m-  xvrspi_2 =		"f0000224Q-Q",[m
[31m-  xvrsqrtesp_2 =	"f0000228Q-Q",[m
[31m-  xvsqrtsp_2 =		"f000022cQ-Q",[m
[31m-  xvsubsp_3 =		"f0000240QQQ",[m
[31m-  xvmaddmsp_3 =		"f0000248QQQ",[m
[31m-  xvcmpgtsp_3 =		"f0000258QQQ",[m
[31m-  xvcvspsxws_2 =	"f0000260Q-Q",[m
[31m-  xvrspiz_2 =		"f0000264Q-Q",[m
[31m-  xvresp_2 =		"f0000268Q-Q",[m
[31m-  xvmulsp_3 =		"f0000280QQQ",[m
[31m-  xvmsubasp_3 =		"f0000288QQQ",[m
[31m-  xxspltw_3 =		"f0000290QQg~",[m
[31m-  xvcmpgesp_3 =		"f0000298QQQ",[m
[31m-  xvcvuxwsp_2 =		"f00002a0Q-Q",[m
[31m-  xvrspip_2 =		"f00002a4Q-Q",[m
[31m-  xvtsqrtsp_2 =		"f00002a8X-Q",[m
[31m-  xvrspic_2 =		"f00002acQ-Q",[m
[31m-  xvdivsp_3 =		"f00002c0QQQ",[m
[31m-  xvmsubmsp_3 =		"f00002c8QQQ",[m
[31m-  xvcvsxwsp_2 =		"f00002e0Q-Q",[m
[31m-  xvrspim_2 =		"f00002e4Q-Q",[m
[31m-  xvtdivsp_3 =		"f00002e8XQQ",[m
[31m-  xvadddp_3 =		"f0000300QQQ",[m
[31m-  xvmaddadp_3 =		"f0000308QQQ",[m
[31m-  xvcmpeqdp_3 =		"f0000318QQQ",[m
[31m-  xvcvdpuxws_2 =	"f0000320Q-Q",[m
[31m-  xvrdpi_2 =		"f0000324Q-Q",[m
[31m-  xvrsqrtedp_2 =	"f0000328Q-Q",[m
[31m-  xvsqrtdp_2 =		"f000032cQ-Q",[m
[31m-  xvsubdp_3 =		"f0000340QQQ",[m
[31m-  xvmaddmdp_3 =		"f0000348QQQ",[m
[31m-  xvcmpgtdp_3 =		"f0000358QQQ",[m
[31m-  xvcvdpsxws_2 =	"f0000360Q-Q",[m
[31m-  xvrdpiz_2 =		"f0000364Q-Q",[m
[31m-  xvredp_2 =		"f0000368Q-Q",[m
[31m-  xvmuldp_3 =		"f0000380QQQ",[m
[31m-  xvmsubadp_3 =		"f0000388QQQ",[m
[31m-  xvcmpgedp_3 =		"f0000398QQQ",[m
[31m-  xvcvuxwdp_2 =		"f00003a0Q-Q",[m
[31m-  xvrdpip_2 =		"f00003a4Q-Q",[m
[31m-  xvtsqrtdp_2 =		"f00003a8X-Q",[m
[31m-  xvrdpic_2 =		"f00003acQ-Q",[m
[31m-  xvdivdp_3 =		"f00003c0QQQ",[m
[31m-  xvmsubmdp_3 =		"f00003c8QQQ",[m
[31m-  xvcvsxwdp_2 =		"f00003e0Q-Q",[m
[31m-  xvrdpim_2 =		"f00003e4Q-Q",[m
[31m-  xvtdivdp_3 =		"f00003e8XQQ",[m
[31m-  xsnmaddasp_3 =	"f0000408QQQ",[m
[31m-  xxland_3 =		"f0000410QQQ",[m
[31m-  xscvdpsp_2 =		"f0000424Q-Q",[m
[31m-  xscvdpspn_2 =		"f000042cQ-Q",[m
[31m-  xsnmaddmsp_3 =	"f0000448QQQ",[m
[31m-  xxlandc_3 =		"f0000450QQQ",[m
[31m-  xsrsp_2 =		"f0000464Q-Q",[m
[31m-  xsnmsubasp_3 =	"f0000488QQQ",[m
[31m-  xxlor_3 =		"f0000490QQQ",[m
[31m-  xscvuxdsp_2 =		"f00004a0Q-Q",[m
[31m-  xsnmsubmsp_3 =	"f00004c8QQQ",[m
[31m-  xxlxor_3 =		"f00004d0QQQ",[m
[31m-  xscvsxdsp_2 =		"f00004e0Q-Q",[m
[31m-  xsmaxdp_3 =		"f0000500QQQ",[m
[31m-  xsnmaddadp_3 =	"f0000508QQQ",[m
[31m-  xxlnor_3 =		"f0000510QQQ",[m
[31m-  xscvdpuxds_2 =	"f0000520Q-Q",[m
[31m-  xscvspdp_2 =		"f0000524Q-Q",[m
[31m-  xscvspdpn_2 =		"f000052cQ-Q",[m
[31m-  xsmindp_3 =		"f0000540QQQ",[m
[31m-  xsnmaddmdp_3 =	"f0000548QQQ",[m
[31m-  xxlorc_3 =		"f0000550QQQ",[m
[31m-  xscvdpsxds_2 =	"f0000560Q-Q",[m
[31m-  xsabsdp_2 =		"f0000564Q-Q",[m
[31m-  xscpsgndp_3 =		"f0000580QQQ",[m
[31m-  xsnmsubadp_3 =	"f0000588QQQ",[m
[31m-  xxlnand_3 =		"f0000590QQQ",[m
[31m-  xscvuxddp_2 =		"f00005a0Q-Q",[m
[31m-  xsnabsdp_2 =		"f00005a4Q-Q",[m
[31m-  xsnmsubmdp_3 =	"f00005c8QQQ",[m
[31m-  xxleqv_3 =		"f00005d0QQQ",[m
[31m-  xscvsxddp_2 =		"f00005e0Q-Q",[m
[31m-  xsnegdp_2 =		"f00005e4Q-Q",[m
[31m-  xvmaxsp_3 =		"f0000600QQQ",[m
[31m-  xvnmaddasp_3 =	"f0000608QQQ",[m
[31m-  ["xvcmpeqsp._3"] =	"f0000618QQQ",[m
[31m-  xvcvspuxds_2 =	"f0000620Q-Q",[m
[31m-  xvcvdpsp_2 =		"f0000624Q-Q",[m
[31m-  xvminsp_3 =		"f0000640QQQ",[m
[31m-  xvnmaddmsp_3 =	"f0000648QQQ",[m
[31m-  ["xvcmpgtsp._3"] =	"f0000658QQQ",[m
[31m-  xvcvspsxds_2 =	"f0000660Q-Q",[m
[31m-  xvabssp_2 =		"f0000664Q-Q",[m
[31m-  xvcpsgnsp_3 =		"f0000680QQQ",[m
[31m-  xvnmsubasp_3 =	"f0000688QQQ",[m
[31m-  ["xvcmpgesp._3"] =	"f0000698QQQ",[m
[31m-  xvcvuxdsp_2 =		"f00006a0Q-Q",[m
[31m-  xvnabssp_2 =		"f00006a4Q-Q",[m
[31m-  xvnmsubmsp_3 =	"f00006c8QQQ",[m
[31m-  xvcvsxdsp_2 =		"f00006e0Q-Q",[m
[31m-  xvnegsp_2 =		"f00006e4Q-Q",[m
[31m-  xvmaxdp_3 =		"f0000700QQQ",[m
[31m-  xvnmaddadp_3 =	"f0000708QQQ",[m
[31m-  ["xvcmpeqdp._3"] =	"f0000718QQQ",[m
[31m-  xvcvdpuxds_2 =	"f0000720Q-Q",[m
[31m-  xvcvspdp_2 =		"f0000724Q-Q",[m
[31m-  xvmindp_3 =		"f0000740QQQ",[m
[31m-  xvnmaddmdp_3 =	"f0000748QQQ",[m
[31m-  ["xvcmpgtdp._3"] =	"f0000758QQQ",[m
[31m-  xvcvdpsxds_2 =	"f0000760Q-Q",[m
[31m-  xvabsdp_2 =		"f0000764Q-Q",[m
[31m-  xvcpsgndp_3 =		"f0000780QQQ",[m
[31m-  xvnmsubadp_3 =	"f0000788QQQ",[m
[31m-  ["xvcmpgedp._3"] =	"f0000798QQQ",[m
[31m-  xvcvuxddp_2 =		"f00007a0Q-Q",[m
[31m-  xvnabsdp_2 =		"f00007a4Q-Q",[m
[31m-  xvnmsubmdp_3 =	"f00007c8QQQ",[m
[31m-  xvcvsxddp_2 =		"f00007e0Q-Q",[m
[31m-  xvnegdp_2 =		"f00007e4Q-Q",[m
[31m-[m
[31m-  -- Primary opcode 61:[m
[31m-  stfdp_2 =	"f4000000F:D", -- NYI: displacement must be divisible by 4.[m
[31m-[m
[31m-  -- Primary opcode 62:[m
[31m-  stq_2 =	"f8000002R:D", -- NYI: displacement must be divisible by 8.[m
[31m-[m
[31m-  -- Primary opcode 63:[m
[31m-  fdiv_3 =	"fc000024FFF.",[m
[31m-  fsub_3 =	"fc000028FFF.",[m
[31m-  fadd_3 =	"fc00002aFFF.",[m
[31m-  fsqrt_2 =	"fc00002cF-F.",[m
[31m-  fsel_4 =	"fc00002eFFFF~.",[m
[31m-  fre_2 =	"fc000030F-F.",[m
[31m-  fmul_3 =	"fc000032FF-F.",[m
[31m-  frsqrte_2 =	"fc000034F-F.",[m
[31m-  fmsub_4 =	"fc000038FFFF~.",[m
[31m-  fmadd_4 =	"fc00003aFFFF~.",[m
[31m-  fnmsub_4 =	"fc00003cFFFF~.",[m
[31m-  fnmadd_4 =	"fc00003eFFFF~.",[m
[31m-  fcmpu_3 =	"fc000000XFF",[m
[31m-  fcpsgn_3 =	"fc000010FFF.",[m
[31m-  fcmpo_3 =	"fc000040XFF",[m
[31m-  mtfsb1_1 =	"fc00004cA",[m
[31m-  fneg_2 =	"fc000050F-F.",[m
[31m-  mcrfs_2 =	"fc000080XX",[m
[31m-  mtfsb0_1 =	"fc00008cA",[m
[31m-  fmr_2 =	"fc000090F-F.",[m
[31m-  frsp_2 =	"fc000018F-F.",[m
[31m-  fctiw_2 =	"fc00001cF-F.",[m
[31m-  fctiwz_2 =	"fc00001eF-F.",[m
[31m-  ftdiv_2 =	"fc000100X-F.",[m
[31m-  fctiwu_2 =	"fc00011cF-F.",[m
[31m-  fctiwuz_2 =	"fc00011eF-F.",[m
[31m-  mtfsfi_2 =	"fc00010cAA", -- NYI: upshift.[m
[31m-  fnabs_2 =	"fc000110F-F.",[m
[31m-  ftsqrt_2 =	"fc000140X-F.",[m
[31m-  fabs_2 =	"fc000210F-F.",[m
[31m-  frin_2 =	"fc000310F-F.",[m
[31m-  friz_2 =	"fc000350F-F.",[m
[31m-  frip_2 =	"fc000390F-F.",[m
[31m-  frim_2 =	"fc0003d0F-F.",[m
[31m-  mffs_1 =	"fc00048eF.",[m
[31m-  -- NYI: mtfsf, mtfsb0, mtfsb1.[m
[31m-  fctid_2 =	"fc00065cF-F.",[m
[31m-  fctidz_2 =	"fc00065eF-F.",[m
[31m-  fmrgow_3 =	"fc00068cFFF",[m
[31m-  fcfid_2 =	"fc00069cF-F.",[m
[31m-  fctidu_2 =	"fc00075cF-F.",[m
[31m-  fctiduz_2 =	"fc00075eF-F.",[m
[31m-  fmrgew_3 =	"fc00078cFFF",[m
[31m-  fcfidu_2 =	"fc00079cF-F.",[m
[31m-[m
[31m-  daddq_3 =	"fc000004F:F:F:.",[m
[31m-  dquaq_4 =	"fc000006F:F:F:Z.",[m
[31m-  dmulq_3 =	"fc000044F:F:F:.",[m
[31m-  drrndq_4 =	"fc000046F:F:F:Z.",[m
[31m-  dscliq_3 =	"fc000084F:F:6.",[m
[31m-  dquaiq_4 =	"fc000086SF:~F:Z.",[m
[31m-  dscriq_3 =	"fc0000c4F:F:6.",[m
[31m-  drintxq_4 =	"fc0000c61F:~F:Z.",[m
[31m-  dcmpoq_3 =	"fc000104XF:F:",[m
[31m-  dtstexq_3 =	"fc000144XF:F:",[m
[31m-  dtstdcq_3 =	"fc000184XF:6",[m
[31m-  dtstdgq_3 =	"fc0001c4XF:6",[m
[31m-  drintnq_4 =	"fc0001c61F:~F:Z.",[m
[31m-  dctqpq_2 =	"fc000204F:-F:.",[m
[31m-  dctfixq_2 =	"fc000244F:-F:.",[m
[31m-  ddedpdq_3 =	"fc000284ZF:~F:.",[m
[31m-  dxexq_2 =	"fc0002c4F:-F:.",[m
[31m-  dsubq_3 =	"fc000404F:F:F:.",[m
[31m-  ddivq_3 =	"fc000444F:F:F:.",[m
[31m-  dcmpuq_3 =	"fc000504XF:F:",[m
[31m-  dtstsfq_3 =	"fc000544XF:F:",[m
[31m-  drdpq_2 =	"fc000604F:-F:.",[m
[31m-  dcffixq_2 =	"fc000644F:-F:.",[m
[31m-  denbcdq_3 =	"fc000684YF:~F:.",[m
[31m-  diexq_3 =	"fc0006c4F:FF:.",[m
[31m-[m
[31m-  -- Primary opcode 4, SPE APU extension:[m
[31m-  evaddw_3 =		"10000200RRR",[m
[31m-  evaddiw_3 =		"10000202RAR~",[m
[31m-  evsubw_3 =		"10000204RRR~",[m
[31m-  evsubiw_3 =		"10000206RAR~",[m
[31m-  evabs_2 =		"10000208RR",[m
[31m-  evneg_2 =		"10000209RR",[m
[31m-  evextsb_2 =		"1000020aRR",[m
[31m-  evextsh_2 =		"1000020bRR",[m
[31m-  evrndw_2 =		"1000020cRR",[m
[31m-  evcntlzw_2 =		"1000020dRR",[m
[31m-  evcntlsw_2 =		"1000020eRR",[m
[31m-  brinc_3 =		"1000020fRRR",[m
[31m-  evand_3 =		"10000211RRR",[m
[31m-  evandc_3 =		"10000212RRR",[m
[31m-  evxor_3 =		"10000216RRR",[m
[31m-  evor_3 =		"10000217RRR",[m
[31m-  evmr_2 =		"10000217RR=",[m
[31m-  evnor_3 =		"10000218RRR",[m
[31m-  evnot_2 =		"10000218RR=",[m
[31m-  eveqv_3 =		"10000219RRR",[m
[31m-  evorc_3 =		"1000021bRRR",[m
[31m-  evnand_3 =		"1000021eRRR",[m
[31m-  evsrwu_3 =		"10000220RRR",[m
[31m-  evsrws_3 =		"10000221RRR",[m
[31m-  evsrwiu_3 =		"10000222RRA",[m
[31m-  evsrwis_3 =		"10000223RRA",[m
[31m-  evslw_3 =		"10000224RRR",[m
[31m-  evslwi_3 =		"10000226RRA",[m
[31m-  evrlw_3 =		"10000228RRR",[m
[31m-  evsplati_2 =		"10000229RS",[m
[31m-  evrlwi_3 =		"1000022aRRA",[m
[31m-  evsplatfi_2 =		"1000022bRS",[m
[31m-  evmergehi_3 =		"1000022cRRR",[m
[31m-  evmergelo_3 =		"1000022dRRR",[m
[31m-  evcmpgtu_3 =		"10000230XRR",[m
[31m-  evcmpgtu_2 =		"10000230-RR",[m
[31m-  evcmpgts_3 =		"10000231XRR",[m
[31m-  evcmpgts_2 =		"10000231-RR",[m
[31m-  evcmpltu_3 =		"10000232XRR",[m
[31m-  evcmpltu_2 =		"10000232-RR",[m
[31m-  evcmplts_3 =		"10000233XRR",[m
[31m-  evcmplts_2 =		"10000233-RR",[m
[31m-  evcmpeq_3 =		"10000234XRR",[m
[31m-  evcmpeq_2 =		"10000234-RR",[m
[31m-  evsel_4 =		"10000278RRRW",[m
[31m-  evsel_3 =		"10000278RRR",[m
[31m-  evfsadd_3 =		"10000280RRR",[m
[31m-  evfssub_3 =		"10000281RRR",[m
[31m-  evfsabs_2 =		"10000284RR",[m
[31m-  evfsnabs_2 =		"10000285RR",[m
[31m-  evfsneg_2 =		"10000286RR",[m
[31m-  evfsmul_3 =		"10000288RRR",[m
[31m-  evfsdiv_3 =		"10000289RRR",[m
[31m-  evfscmpgt_3 =		"1000028cXRR",[m
[31m-  evfscmpgt_2 =		"1000028c-RR",[m
[31m-  evfscmplt_3 =		"1000028dXRR",[m
[31m-  evfscmplt_2 =		"1000028d-RR",[m
[31m-  evfscmpeq_3 =		"1000028eXRR",[m
[31m-  evfscmpeq_2 =		"1000028e-RR",[m
[31m-  evfscfui_2 =		"10000290R-R",[m
[31m-  evfscfsi_2 =		"10000291R-R",[m
[31m-  evfscfuf_2 =		"10000292R-R",[m
[31m-  evfscfsf_2 =		"10000293R-R",[m
[31m-  evfsctui_2 =		"10000294R-R",[m
[31m-  evfsctsi_2 =		"10000295R-R",[m
[31m-  evfsctuf_2 =		"10000296R-R",[m
[31m-  evfsctsf_2 =		"10000297R-R",[m
[31m-  evfsctuiz_2 =		"10000298R-R",[m
[31m-  evfsctsiz_2 =		"1000029aR-R",[m
[31m-  evfststgt_3 =		"1000029cXRR",[m
[31m-  evfststgt_2 =		"1000029c-RR",[m
[31m-  evfststlt_3 =		"1000029dXRR",[m
[31m-  evfststlt_2 =		"1000029d-RR",[m
[31m-  evfststeq_3 =		"1000029eXRR",[m
[31m-  evfststeq_2 =		"1000029e-RR",[m
[31m-  efsadd_3 =		"100002c0RRR",[m
[31m-  efssub_3 =		"100002c1RRR",[m
[31m-  efsabs_2 =		"100002c4RR",[m
[31m-  efsnabs_2 =		"100002c5RR",[m
[31m-  efsneg_2 =		"100002c6RR",[m
[31m-  efsmul_3 =		"100002c8RRR",[m
[31m-  efsdiv_3 =		"100002c9RRR",[m
[31m-  efscmpgt_3 =		"100002ccXRR",[m
[31m-  efscmpgt_2 =		"100002cc-RR",[m
[31m-  efscmplt_3 =		"100002cdXRR",[m
[31m-  efscmplt_2 =		"100002cd-RR",[m
[31m-  efscmpeq_3 =		"100002ceXRR",[m
[31m-  efscmpeq_2 =		"100002ce-RR",[m
[31m-  efscfd_2 =		"100002cfR-R",[m
[31m-  efscfui_2 =		"100002d0R-R",[m
[31m-  efscfsi_2 =		"100002d1R-R",[m
[31m-  efscfuf_2 =		"100002d2R-R",[m
[31m-  efscfsf_2 =		"100002d3R-R",[m
[31m-  efsctui_2 =		"100002d4R-R",[m
[31m-  efsctsi_2 =		"100002d5R-R",[m
[31m-  efsctuf_2 =		"100002d6R-R",[m
[31m-  efsctsf_2 =		"100002d7R-R",[m
[31m-  efsctuiz_2 =		"100002d8R-R",[m
[31m-  efsctsiz_2 =		"100002daR-R",[m
[31m-  efststgt_3 =		"100002dcXRR",[m
[31m-  efststgt_2 =		"100002dc-RR",[m
[31m-  efststlt_3 =		"100002ddXRR",[m
[31m-  efststlt_2 =		"100002dd-RR",[m
[31m-  efststeq_3 =		"100002deXRR",[m
[31m-  efststeq_2 =		"100002de-RR",[m
[31m-  efdadd_3 =		"100002e0RRR",[m
[31m-  efdsub_3 =		"100002e1RRR",[m
[31m-  efdcfuid_2 =		"100002e2R-R",[m
[31m-  efdcfsid_2 =		"100002e3R-R",[m
[31m-  efdabs_2 =		"100002e4RR",[m
[31m-  efdnabs_2 =		"100002e5RR",[m
[31m-  efdneg_2 =		"100002e6RR",[m
[31m-  efdmul_3 =		"100002e8RRR",[m
[31m-  efddiv_3 =		"100002e9RRR",[m
[31m-  efdctuidz_2 =		"100002eaR-R",[m
[31m-  efdctsidz_2 =		"100002ebR-R",[m
[31m-  efdcmpgt_3 =		"100002ecXRR",[m
[31m-  efdcmpgt_2 =		"100002ec-RR",[m
[31m-  efdcmplt_3 =		"100002edXRR",[m
[31m-  efdcmplt_2 =		"100002ed-RR",[m
[31m-  efdcmpeq_3 =		"100002eeXRR",[m
[31m-  efdcmpeq_2 =		"100002ee-RR",[m
[31m-  efdcfs_2 =		"100002efR-R",[m
[31m-  efdcfui_2 =		"100002f0R-R",[m
[31m-  efdcfsi_2 =		"100002f1R-R",[m
[31m-  efdcfuf_2 =		"100002f2R-R",[m
[31m-  efdcfsf_2 =		"100002f3R-R",[m
[31m-  efdctui_2 =		"100002f4R-R",[m
[31m-  efdctsi_2 =		"100002f5R-R",[m
[31m-  efdctuf_2 =		"100002f6R-R",[m
[31m-  efdctsf_2 =		"100002f7R-R",[m
[31m-  efdctuiz_2 =		"100002f8R-R",[m
[31m-  efdctsiz_2 =		"100002faR-R",[m
[31m-  efdtstgt_3 =		"100002fcXRR",[m
[31m-  efdtstgt_2 =		"100002fc-RR",[m
[31m-  efdtstlt_3 =		"100002fdXRR",[m
[31m-  efdtstlt_2 =		"100002fd-RR",[m
[31m-  efdtsteq_3 =		"100002feXRR",[m
[31m-  efdtsteq_2 =		"100002fe-RR",[m
[31m-  evlddx_3 =		"10000300RR0R",[m
[31m-  evldd_2 =		"10000301R8",[m
[31m-  evldwx_3 =		"10000302RR0R",[m
[31m-  evldw_2 =		"10000303R8",[m
[31m-  evldhx_3 =		"10000304RR0R",[m
[31m-  evldh_2 =		"10000305R8",[m
[31m-  evlwhex_3 =		"10000310RR0R",[m
[31m-  evlwhe_2 =		"10000311R4",[m
[31m-  evlwhoux_3 =		"10000314RR0R",[m
[31m-  evlwhou_2 =		"10000315R4",[m
[31m-  evlwhosx_3 =		"10000316RR0R",[m
[31m-  evlwhos_2 =		"10000317R4",[m
[31m-  evstddx_3 =		"10000320RR0R",[m
[31m-  evstdd_2 =		"10000321R8",[m
[31m-  evstdwx_3 =		"10000322RR0R",[m
[31m-  evstdw_2 =		"10000323R8",[m
[31m-  evstdhx_3 =		"10000324RR0R",[m
[31m-  evstdh_2 =		"10000325R8",[m
[31m-  evstwhex_3 =		"10000330RR0R",[m
[31m-  evstwhe_2 =		"10000331R4",[m
[31m-  evstwhox_3 =		"10000334RR0R",[m
[31m-  evstwho_2 =		"10000335R4",[m
[31m-  evstwwex_3 =		"10000338RR0R",[m
[31m-  evstwwe_2 =		"10000339R4",[m
[31m-  evstwwox_3 =		"1000033cRR0R",[m
[31m-  evstwwo_2 =		"1000033dR4",[m
[31m-  evmhessf_3 =		"10000403RRR",[m
[31m-  evmhossf_3 =		"10000407RRR",[m
[31m-  evmheumi_3 =		"10000408RRR",[m
[31m-  evmhesmi_3 =		"10000409RRR",[m
[31m-  evmhesmf_3 =		"1000040bRRR",[m
[31m-  evmhoumi_3 =		"1000040cRRR",[m
[31m-  evmhosmi_3 =		"1000040dRRR",[m
[31m-  evmhosmf_3 =		"1000040fRRR",[m
[31m-  evmhessfa_3 =		"10000423RRR",[m
[31m-  evmhossfa_3 =		"10000427RRR",[m
[31m-  evmheumia_3 =		"10000428RRR",[m
[31m-  evmhesmia_3 =		"10000429RRR",[m
[31m-  evmhesmfa_3 =		"1000042bRRR",[m
[31m-  evmhoumia_3 =		"1000042cRRR",[m
[31m-  evmhosmia_3 =		"1000042dRRR",[m
[31m-  evmhosmfa_3 =		"1000042fRRR",[m
[31m-  evmwhssf_3 =		"10000447RRR",[m
[31m-  evmwlumi_3 =		"10000448RRR",[m
[31m-  evmwhumi_3 =		"1000044cRRR",[m
[31m-  evmwhsmi_3 =		"1000044dRRR",[m
[31m-  evmwhsmf_3 =		"1000044fRRR",[m
[31m-  evmwssf_3 =		"10000453RRR",[m
[31m-  evmwumi_3 =		"10000458RRR",[m
[31m-  evmwsmi_3 =		"10000459RRR",[m
[31m-  evmwsmf_3 =		"1000045bRRR",[m
[31m-  evmwhssfa_3 =		"10000467RRR",[m
[31m-  evmwlumia_3 =		"10000468RRR",[m
[31m-  evmwhumia_3 =		"1000046cRRR",[m
[31m-  evmwhsmia_3 =		"1000046dRRR",[m
[31m-  evmwhsmfa_3 =		"1000046fRRR",[m
[31m-  evmwssfa_3 =		"10000473RRR",[m
[31m-  evmwumia_3 =		"10000478RRR",[m
[31m-  evmwsmia_3 =		"10000479RRR",[m
[31m-  evmwsmfa_3 =		"1000047bRRR",[m
[31m-  evmra_2 =		"100004c4RR",[m
[31m-  evdivws_3 =		"100004c6RRR",[m
[31m-  evdivwu_3 =		"100004c7RRR",[m
[31m-  evmwssfaa_3 =		"10000553RRR",[m
[31m-  evmwumiaa_3 =		"10000558RRR",[m
[31m-  evmwsmiaa_3 =		"10000559RRR",[m
[31m-  evmwsmfaa_3 =		"1000055bRRR",[m
[31m-  evmwssfan_3 =		"100005d3RRR",[m
[31m-  evmwumian_3 =		"100005d8RRR",[m
[31m-  evmwsmian_3 =		"100005d9RRR",[m
[31m-  evmwsmfan_3 =		"100005dbRRR",[m
[31m-  evmergehilo_3 =	"1000022eRRR",[m
[31m-  evmergelohi_3 =	"1000022fRRR",[m
[31m-  evlhhesplatx_3 =	"10000308RR0R",[m
[31m-  evlhhesplat_2 =	"10000309R2",[m
[31m-  evlhhousplatx_3 =	"1000030cRR0R",[m
[31m-  evlhhousplat_2 =	"1000030dR2",[m
[31m-  evlhhossplatx_3 =	"1000030eRR0R",[m
[31m-  evlhhossplat_2 =	"1000030fR2",[m
[31m-  evlwwsplatx_3 =	"10000318RR0R",[m
[31m-  evlwwsplat_2 =	"10000319R4",[m
[31m-  evlwhsplatx_3 =	"1000031cRR0R",[m
[31m-  evlwhsplat_2 =	"1000031dR4",[m
[31m-  evaddusiaaw_2 =	"100004c0RR",[m
[31m-  evaddssiaaw_2 =	"100004c1RR",[m
[31m-  evsubfusiaaw_2 =	"100004c2RR",[m
[31m-  evsubfssiaaw_2 =	"100004c3RR",[m
[31m-  evaddumiaaw_2 =	"100004c8RR",[m
[31m-  evaddsmiaaw_2 =	"100004c9RR",[m
[31m-  evsubfumiaaw_2 =	"100004caRR",[m
[31m-  evsubfsmiaaw_2 =	"100004cbRR",[m
[31m-  evmheusiaaw_3 =	"10000500RRR",[m
[31m-  evmhessiaaw_3 =	"10000501RRR",[m
[31m-  evmhessfaaw_3 =	"10000503RRR",[m
[31m-  evmhousiaaw_3 =	"10000504RRR",[m
[31m-  evmhossiaaw_3 =	"10000505RRR",[m
[31m-  evmhossfaaw_3 =	"10000507RRR",[m
[31m-  evmheumiaaw_3 =	"10000508RRR",[m
[31m-  evmhesmiaaw_3 =	"10000509RRR",[m
[31m-  evmhesmfaaw_3 =	"1000050bRRR",[m
[31m-  evmhoumiaaw_3 =	"1000050cRRR",[m
[31m-  evmhosmiaaw_3 =	"1000050dRRR",[m
[31m-  evmhosmfaaw_3 =	"1000050fRRR",[m
[31m-  evmhegumiaa_3 =	"10000528RRR",[m
[31m-  evmhegsmiaa_3 =	"10000529RRR",[m
[31m-  evmhegsmfaa_3 =	"1000052bRRR",[m
[31m-  evmhogumiaa_3 =	"1000052cRRR",[m
[31m-  evmhogsmiaa_3 =	"1000052dRRR",[m
[31m-  evmhogsmfaa_3 =	"1000052fRRR",[m
[31m-  evmwlusiaaw_3 =	"10000540RRR",[m
[31m-  evmwlssiaaw_3 =	"10000541RRR",[m
[31m-  evmwlumiaaw_3 =	"10000548RRR",[m
[31m-  evmwlsmiaaw_3 =	"10000549RRR",[m
[31m-  evmheusianw_3 =	"10000580RRR",[m
[31m-  evmhessianw_3 =	"10000581RRR",[m
[31m-  evmhessfanw_3 =	"10000583RRR",[m
[31m-  evmhousianw_3 =	"10000584RRR",[m
[31m-  evmhossianw_3 =	"10000585RRR",[m
[31m-  evmhossfanw_3 =	"10000587RRR",[m
[31m-  evmheumianw_3 =	"10000588RRR",[m
[31m-  evmhesmianw_3 =	"10000589RRR",[m
[31m-  evmhesmfanw_3 =	"1000058bRRR",[m
[31m-  evmhoumianw_3 =	"1000058cRRR",[m
[31m-  evmhosmianw_3 =	"1000058dRRR",[m
[31m-  evmhosmfanw_3 =	"1000058fRRR",[m
[31m-  evmhegumian_3 =	"100005a8RRR",[m
[31m-  evmhegsmian_3 =	"100005a9RRR",[m
[31m-  evmhegsmfan_3 =	"100005abRRR",[m
[31m-  evmhogumian_3 =	"100005acRRR",[m
[31m-  evmhogsmian_3 =	"100005adRRR",[m
[31m-  evmhogsmfan_3 =	"100005afRRR",[m
[31m-  evmwlusianw_3 =	"100005c0RRR",[m
[31m-  evmwlssianw_3 =	"100005c1RRR",[m
[31m-  evmwlumianw_3 =	"100005c8RRR",[m
[31m-  evmwlsmianw_3 =	"100005c9RRR",[m
[31m-[m
[31m-  -- NYI: Book E instructions.[m
[31m-}[m
[31m-[m
[31m--- Add mnemonics for "." variants.[m
[31m-do[m
[31m-  local t = {}[m
[31m-  for k,v in pairs(map_op) do[m
[31m-    if type(v) == "string" and sub(v, -1) == "." then[m
[31m-      local v2 = sub(v, 1, 7)..char(byte(v, 8)+1)..sub(v, 9, -2)[m
[31m-      t[sub(k, 1, -3).."."..sub(k, -2)] = v2[m
[31m-    end[m
[31m-  end[m
[31m-  for k,v in pairs(t) do[m
[31m-    map_op[k] = v[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Add more branch mnemonics.[m
[31m-for cond,c in pairs(map_cond) do[m
[31m-  local b1 = "b"..cond[m
[31m-  local c1 = shl(band(c, 3), 16) + (c < 4 and 0x01000000 or 0)[m
[31m-  -- bX[l][m
[31m-  map_op[b1.."_1"] = tohex(0x40800000 + c1).."K"[m
[31m-  map_op[b1.."y_1"] = tohex(0x40a00000 + c1).."K"[m
[31m-  map_op[b1.."l_1"] = tohex(0x40800001 + c1).."K"[m
[31m-  map_op[b1.."_2"] = tohex(0x40800000 + c1).."-XK"[m
[31m-  map_op[b1.."y_2"] = tohex(0x40a00000 + c1).."-XK"[m
[31m-  map_op[b1.."l_2"] = tohex(0x40800001 + c1).."-XK"[m
[31m-  -- bXlr[l][m
[31m-  map_op[b1.."lr_0"] = tohex(0x4c800020 + c1)[m
[31m-  map_op[b1.."lrl_0"] = tohex(0x4c800021 + c1)[m
[31m-  map_op[b1.."ctr_0"] = tohex(0x4c800420 + c1)[m
[31m-  map_op[b1.."ctrl_0"] = tohex(0x4c800421 + c1)[m
[31m-  -- bXctr[l][m
[31m-  map_op[b1.."lr_1"] = tohex(0x4c800020 + c1).."-X"[m
[31m-  map_op[b1.."lrl_1"] = tohex(0x4c800021 + c1).."-X"[m
[31m-  map_op[b1.."ctr_1"] = tohex(0x4c800420 + c1).."-X"[m
[31m-  map_op[b1.."ctrl_1"] = tohex(0x4c800421 + c1).."-X"[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function parse_gpr(expr)[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    if not reg then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    expr = reg[m
[31m-  end[m
[31m-  local r = match(expr, "^r([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r, tp end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_fpr(expr)[m
[31m-  local r = match(expr, "^f([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_vr(expr)[m
[31m-  local r = match(expr, "^v([1-3]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 31 then return r end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_vs(expr)[m
[31m-  local r = match(expr, "^vs([1-6]?[0-9])$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    if r <= 63 then return r end[m
[31m-  end[m
[31m-  werror("bad register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_cr(expr)[m
[31m-  local r = match(expr, "^cr([0-7])$")[m
[31m-  if r then return tonumber(r) end[m
[31m-  werror("bad condition register name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_cond(expr)[m
[31m-  local r, cond = match(expr, "^4%*cr([0-7])%+(%w%w)$")[m
[31m-  if r then[m
[31m-    r = tonumber(r)[m
[31m-    local c = map_cond[cond][m
[31m-    if c and c < 4 then return r*4+c end[m
[31m-  end[m
[31m-  werror("bad condition bit name `"..expr.."'")[m
[31m-end[m
[31m-[m
[31m-local parse_ctx = {}[m
[31m-[m
[31m-local loadenv = setfenv and function(s)[m
[31m-  local code = loadstring(s, "")[m
[31m-  if code then setfenv(code, parse_ctx) end[m
[31m-  return code[m
[31m-end or function(s)[m
[31m-  return load(s, "", nil, parse_ctx)[m
[31m-end[m
[31m-[m
[31m--- Try to parse simple arithmetic, too, since some basic ops are aliases.[m
[31m-local function parse_number(n)[m
[31m-  local x = tonumber(n)[m
[31m-  if x then return x end[m
[31m-  local code = loadenv("return "..n)[m
[31m-  if code then[m
[31m-    local ok, y = pcall(code)[m
[31m-    if ok then return y end[m
[31m-  end[m
[31m-  return nil[m
[31m-end[m
[31m-[m
[31m-local function parse_imm(imm, bits, shift, scale, signed)[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    local m = sar(n, scale)[m
[31m-    if shl(m, scale) == n then[m
[31m-      if signed then[m
[31m-	local s = sar(m, bits-1)[m
[31m-	if s == 0 then return shl(m, shift)[m
[31m-	elseif s == -1 then return shl(m + shl(1, bits), shift) end[m
[31m-      else[m
[31m-	if sar(m, bits) == 0 then return shl(m, shift) end[m
[31m-      end[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  elseif match(imm, "^[rfv]([1-3]?[0-9])$") or[m
[31m-	 match(imm, "^vs([1-6]?[0-9])$") or[m
[31m-	 match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then[m
[31m-    werror("expected immediate operand, got register")[m
[31m-  else[m
[31m-    waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm)[m
[31m-    return 0[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_shiftmask(imm, isshift)[m
[31m-  local n = parse_number(imm)[m
[31m-  if n then[m
[31m-    if shr(n, 6) == 0 then[m
[31m-      local lsb = band(n, 31)[m
[31m-      local msb = n - lsb[m
[31m-      return isshift and (shl(lsb, 11)+shr(msb, 4)) or (shl(lsb, 6)+msb)[m
[31m-    end[m
[31m-    werror("out of range immediate `"..imm.."'")[m
[31m-  elseif match(imm, "^r([1-3]?[0-9])$") or[m
[31m-	 match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then[m
[31m-    werror("expected immediate operand, got register")[m
[31m-  else[m
[31m-    waction("IMMSH", isshift and 1 or 0, imm)[m
[31m-    return 0;[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function parse_disp(disp)[m
[31m-  local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")[m
[31m-  if imm then[m
[31m-    local r = parse_gpr(reg)[m
[31m-    if r == 0 then werror("cannot use r0 in displacement") end[m
[31m-    return shl(r, 16) + parse_imm(imm, 16, 0, 0, true)[m
[31m-  end[m
[31m-  local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$")[m
[31m-  if reg and tailr ~= "" then[m
[31m-    local r, tp = parse_gpr(reg)[m
[31m-    if r == 0 then werror("cannot use r0 in displacement") end[m
[31m-    if tp then[m
[31m-      waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr))[m
[31m-      return shl(r, 16)[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad displacement `"..disp.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_u5disp(disp, scale)[m
[31m-  local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$")[m
[31m-  if imm then[m
[31m-    local r = parse_gpr(reg)[m
[31m-    if r == 0 then werror("cannot use r0 in displacement") end[m
[31m-    return shl(r, 16) + parse_imm(imm, 5, 11, scale, false)[m
[31m-  end[m
[31m-  local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$")[m
[31m-  if reg and tailr ~= "" then[m
[31m-    local r, tp = parse_gpr(reg)[m
[31m-    if r == 0 then werror("cannot use r0 in displacement") end[m
[31m-    if tp then[m
[31m-      waction("IMM", scale*1024+5*32+11, format(tp.ctypefmt, tailr))[m
[31m-      return shl(r, 16)[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad displacement `"..disp.."'")[m
[31m-end[m
[31m-[m
[31m-local function parse_label(label, def)[m
[31m-  local prefix = sub(label, 1, 2)[m
[31m-  -- =>label (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "PC", 0, sub(label, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "LG", map_global[sub(label, 3)][m
[31m-  end[m
[31m-  if def then[m
[31m-    -- [1-9] (local label definition)[m
[31m-    if match(label, "^[1-9]$") then[m
[31m-      return "LG", 10+tonumber(label)[m
[31m-    end[m
[31m-  else[m
[31m-    -- [<>][1-9] (local label reference)[m
[31m-    local dir, lnum = match(label, "^([<>])([1-9])$")[m
[31m-    if dir then -- Fwd: 1-9, Bkwd: 11-19.[m
[31m-      return "LG", lnum + (dir == ">" and 0 or 10)[m
[31m-    end[m
[31m-    -- extern label (extern label reference)[m
[31m-    local extname = match(label, "^extern%s+(%S+)$")[m
[31m-    if extname then[m
[31m-      return "EXT", map_extern[extname][m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad label `"..label.."'")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-op_template = function(params, template, nparams)[m
[31m-  if not params then return sub(template, 9) end[m
[31m-  local op = tonumber(sub(template, 1, 8), 16)[m
[31m-  local n, rs = 1, 26[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 3 positions (rlwinm).[m
[31m-  if secpos+3 > maxsecpos then wflush() end[m
[31m-  local pos = wpos()[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for p in gmatch(sub(template, 9), ".") do[m
[31m-    if p == "R" then[m
[31m-      rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1[m
[31m-    elseif p == "F" then[m
[31m-      rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1[m
[31m-    elseif p == "V" then[m
[31m-      rs = rs - 5; op = op + shl(parse_vr(params[n]), rs); n = n + 1[m
[31m-    elseif p == "Q" then[m
[31m-      local vs = parse_vs(params[n]); n = n + 1; rs = rs - 5[m
[31m-      local sh = rs == 6 and 2 or 3 + band(shr(rs, 1), 3)[m
[31m-      op = op + shl(band(vs, 31), rs) + shr(band(vs, 32), sh)[m
[31m-    elseif p == "q" then[m
[31m-      local vs = parse_vs(params[n]); n = n + 1[m
[31m-      op = op + shl(band(vs, 31), 21) + shr(band(vs, 32), 5)[m
[31m-    elseif p == "A" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1[m
[31m-    elseif p == "S" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, true); n = n + 1[m
[31m-    elseif p == "I" then[m
[31m-      op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1[m
[31m-    elseif p == "U" then[m
[31m-      op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1[m
[31m-    elseif p == "D" then[m
[31m-      op = op + parse_disp(params[n]); n = n + 1[m
[31m-    elseif p == "2" then[m
[31m-      op = op + parse_u5disp(params[n], 1); n = n + 1[m
[31m-    elseif p == "4" then[m
[31m-      op = op + parse_u5disp(params[n], 2); n = n + 1[m
[31m-    elseif p == "8" then[m
[31m-      op = op + parse_u5disp(params[n], 3); n = n + 1[m
[31m-    elseif p == "C" then[m
[31m-      rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1[m
[31m-    elseif p == "X" then[m
[31m-      rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1[m
[31m-    elseif p == "1" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 1, rs, 0, false); n = n + 1[m
[31m-    elseif p == "g" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 2, rs, 0, false); n = n + 1[m
[31m-    elseif p == "3" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 3, rs, 0, false); n = n + 1[m
[31m-    elseif p == "P" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1[m
[31m-    elseif p == "p" then[m
[31m-      op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1[m
[31m-    elseif p == "6" then[m
[31m-      rs = rs - 6; op = op + parse_imm(params[n], 6, rs, 0, false); n = n + 1[m
[31m-    elseif p == "Y" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 1, rs+4, 0, false); n = n + 1[m
[31m-    elseif p == "y" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 1, rs+3, 0, false); n = n + 1[m
[31m-    elseif p == "Z" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 2, rs+3, 0, false); n = n + 1[m
[31m-    elseif p == "z" then[m
[31m-      rs = rs - 5; op = op + parse_imm(params[n], 2, rs+2, 0, false); n = n + 1[m
[31m-    elseif p == "W" then[m
[31m-      op = op + parse_cr(params[n]); n = n + 1[m
[31m-    elseif p == "G" then[m
[31m-      op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1[m
[31m-    elseif p == "H" then[m
[31m-      op = op + parse_shiftmask(params[n], true); n = n + 1[m
[31m-    elseif p == "M" then[m
[31m-      op = op + parse_shiftmask(params[n], false); n = n + 1[m
[31m-    elseif p == "J" or p == "K" then[m
[31m-      local mode, n, s = parse_label(params[n], false)[m
[31m-      if p == "K" then n = n + 2048 end[m
[31m-      waction("REL_"..mode, n, s, 1)[m
[31m-      n = n + 1[m
[31m-    elseif p == "0" then[m
[31m-      if band(shr(op, rs), 31) == 0 then werror("cannot use r0") end[m
[31m-    elseif p == "=" or p == "%" then[m
[31m-      local t = band(shr(op, p == "%" and rs+5 or rs), 31)[m
[31m-      rs = rs - 5[m
[31m-      op = op + shl(t, rs)[m
[31m-    elseif p == "~" then[m
[31m-      local mm = shl(31, rs)[m
[31m-      local lo = band(op, mm)[m
[31m-      local hi = band(op, shl(mm, 5))[m
[31m-      op = op - lo - hi + shl(lo, 5) + shr(hi, 5)[m
[31m-    elseif p == ":" then[m
[31m-      if band(shr(op, rs), 1) ~= 0 then werror("register pair expected") end[m
[31m-    elseif p == "-" then[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "." then[m
[31m-      -- Ignored.[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-  end[m
[31m-  wputpos(pos, op)[m
[31m-end[m
[31m-[m
[31m-map_op[".template__"] = op_template[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_1"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local mode, n, s = parse_label(params[1], true)[m
[31m-  if mode == "EXT" then werror("bad label definition") end[m
[31m-  waction("LABEL_"..mode, n, s, 1)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-map_op[".long_*"] = function(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local n = tonumber(p)[m
[31m-    if not n then werror("bad immediate `"..p.."'") end[m
[31m-    if n < 0 then n = n + 2^32 end[m
[31m-    wputw(n)[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1])[m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION", num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = map_coreop })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_proto.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_proto.h[m
[1mdeleted file mode 100644[m
[1mindex 22a654c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_proto.h[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-/*[m
[31m-** DynASM encoding engine prototypes.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#ifndef _DASM_PROTO_H[m
[31m-#define _DASM_PROTO_H[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#define DASM_IDENT	"DynASM 1.4.0"[m
[31m-#define DASM_VERSION	10400	/* 1.4.0 */[m
[31m-[m
[31m-#ifndef Dst_DECL[m
[31m-#define Dst_DECL	dasm_State **Dst[m
[31m-#endif[m
[31m-[m
[31m-#ifndef Dst_REF[m
[31m-#define Dst_REF		(*Dst)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef DASM_FDEF[m
[31m-#define DASM_FDEF	extern[m
[31m-#endif[m
[31m-[m
[31m-#ifndef DASM_M_GROW[m
[31m-#define DASM_M_GROW(ctx, t, p, sz, need) \[m
[31m-  do { \[m
[31m-    size_t _sz = (sz), _need = (need); \[m
[31m-    if (_sz < _need) { \[m
[31m-      if (_sz < 16) _sz = 16; \[m
[31m-      while (_sz < _need) _sz += _sz; \[m
[31m-      (p) = (t *)realloc((p), _sz); \[m
[31m-      if ((p) == NULL) exit(1); \[m
[31m-      (sz) = _sz; \[m
[31m-    } \[m
[31m-  } while(0)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef DASM_M_FREE[m
[31m-#define DASM_M_FREE(ctx, p, sz)	free(p)[m
[31m-#endif[m
[31m-[m
[31m-/* Internal DynASM encoder state. */[m
[31m-typedef struct dasm_State dasm_State;[m
[31m-[m
[31m-[m
[31m-/* Initialize and free DynASM state. */[m
[31m-DASM_FDEF void dasm_init(Dst_DECL, int maxsection);[m
[31m-DASM_FDEF void dasm_free(Dst_DECL);[m
[31m-[m
[31m-/* Setup global array. Must be called before dasm_setup(). */[m
[31m-DASM_FDEF void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl);[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-DASM_FDEF void dasm_growpc(Dst_DECL, unsigned int maxpc);[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-DASM_FDEF void dasm_setup(Dst_DECL, const void *actionlist);[m
[31m-[m
[31m-/* Feed encoder with actions. Calls are generated by pre-processor. */[m
[31m-DASM_FDEF void dasm_put(Dst_DECL, int start, ...);[m
[31m-[m
[31m-/* Link sections and return the resulting size. */[m
[31m-DASM_FDEF int dasm_link(Dst_DECL, size_t *szp);[m
[31m-[m
[31m-/* Encode sections into buffer. */[m
[31m-DASM_FDEF int dasm_encode(Dst_DECL, void *buffer);[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-DASM_FDEF int dasm_getpclabel(Dst_DECL, unsigned int pc);[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-DASM_FDEF int dasm_checkstep(Dst_DECL, int secmatch);[m
[31m-#else[m
[31m-#define dasm_checkstep(a, b)	0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _DASM_PROTO_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x64.lua[m
[1mdeleted file mode 100644[m
[1mindex 2133355..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM x64 module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m--- This module just sets 64 bit mode for the combined x86/x64 module.[m
[31m--- All the interesting stuff is there.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-x64 = true -- Using a global is an ugly, but effective solution.[m
[31m-return require("dasm_x86")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x86.h[m
[1mdeleted file mode 100644[m
[1mindex bf5b729..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,498 +0,0 @@[m
[31m-/*[m
[31m-** DynASM x86 encoding engine.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-** Released under the MIT license. See dynasm.lua for full copyright notice.[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define DASM_ARCH		"x86"[m
[31m-[m
[31m-#ifndef DASM_EXTERN[m
[31m-#define DASM_EXTERN(a,b,c,d)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Action definitions. DASM_STOP must be 255. */[m
[31m-enum {[m
[31m-  DASM_DISP = 233,[m
[31m-  DASM_IMM_S, DASM_IMM_B, DASM_IMM_W, DASM_IMM_D, DASM_IMM_WB, DASM_IMM_DB,[m
[31m-  DASM_VREG, DASM_SPACE, DASM_SETLABEL, DASM_REL_A, DASM_REL_LG, DASM_REL_PC,[m
[31m-  DASM_IMM_LG, DASM_IMM_PC, DASM_LABEL_LG, DASM_LABEL_PC, DASM_ALIGN,[m
[31m-  DASM_EXTERN, DASM_ESC, DASM_MARK, DASM_SECTION, DASM_STOP[m
[31m-};[m
[31m-[m
[31m-/* Maximum number of section buffer positions for a single dasm_put() call. */[m
[31m-#define DASM_MAXSECPOS		25[m
[31m-[m
[31m-/* DynASM encoder status codes. Action list offset or number are or'ed in. */[m
[31m-#define DASM_S_OK		0x00000000[m
[31m-#define DASM_S_NOMEM		0x01000000[m
[31m-#define DASM_S_PHASE		0x02000000[m
[31m-#define DASM_S_MATCH_SEC	0x03000000[m
[31m-#define DASM_S_RANGE_I		0x11000000[m
[31m-#define DASM_S_RANGE_SEC	0x12000000[m
[31m-#define DASM_S_RANGE_LG		0x13000000[m
[31m-#define DASM_S_RANGE_PC		0x14000000[m
[31m-#define DASM_S_RANGE_VREG	0x15000000[m
[31m-#define DASM_S_UNDEF_L		0x21000000[m
[31m-#define DASM_S_UNDEF_PC		0x22000000[m
[31m-[m
[31m-/* Macros to convert positions (8 bit section + 24 bit index). */[m
[31m-#define DASM_POS2IDX(pos)	((pos)&0x00ffffff)[m
[31m-#define DASM_POS2BIAS(pos)	((pos)&0xff000000)[m
[31m-#define DASM_SEC2POS(sec)	((sec)<<24)[m
[31m-#define DASM_POS2SEC(pos)	((pos)>>24)[m
[31m-#define DASM_POS2PTR(D, pos)	(D->sections[DASM_POS2SEC(pos)].rbuf + (pos))[m
[31m-[m
[31m-/* Action list type. */[m
[31m-typedef const unsigned char *dasm_ActList;[m
[31m-[m
[31m-/* Per-section structure. */[m
[31m-typedef struct dasm_Section {[m
[31m-  int *rbuf;		/* Biased buffer pointer (negative section bias). */[m
[31m-  int *buf;		/* True buffer pointer. */[m
[31m-  size_t bsize;		/* Buffer size in bytes. */[m
[31m-  int pos;		/* Biased buffer position. */[m
[31m-  int epos;		/* End of biased buffer position - max single put. */[m
[31m-  int ofs;		/* Byte offset into section. */[m
[31m-} dasm_Section;[m
[31m-[m
[31m-/* Core structure holding the DynASM encoding state. */[m
[31m-struct dasm_State {[m
[31m-  size_t psize;			/* Allocated size of this structure. */[m
[31m-  dasm_ActList actionlist;	/* Current actionlist pointer. */[m
[31m-  int *lglabels;		/* Local/global chain/pos ptrs. */[m
[31m-  size_t lgsize;[m
[31m-  int *pclabels;		/* PC label chains/pos ptrs. */[m
[31m-  size_t pcsize;[m
[31m-  void **globals;		/* Array of globals (bias -10). */[m
[31m-  dasm_Section *section;	/* Pointer to active section. */[m
[31m-  size_t codesize;		/* Total size of all code sections. */[m
[31m-  int maxsection;		/* 0 <= sectionidx < maxsection. */[m
[31m-  int status;			/* Status code. */[m
[31m-  dasm_Section sections[1];	/* All sections. Alloc-extended. */[m
[31m-};[m
[31m-[m
[31m-/* The size of the core structure depends on the max. number of sections. */[m
[31m-#define DASM_PSZ(ms)	(sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section))[m
[31m-[m
[31m-[m
[31m-/* Initialize DynASM state. */[m
[31m-void dasm_init(Dst_DECL, int maxsection)[m
[31m-{[m
[31m-  dasm_State *D;[m
[31m-  size_t psz = 0;[m
[31m-  int i;[m
[31m-  Dst_REF = NULL;[m
[31m-  DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection));[m
[31m-  D = Dst_REF;[m
[31m-  D->psize = psz;[m
[31m-  D->lglabels = NULL;[m
[31m-  D->lgsize = 0;[m
[31m-  D->pclabels = NULL;[m
[31m-  D->pcsize = 0;[m
[31m-  D->globals = NULL;[m
[31m-  D->maxsection = maxsection;[m
[31m-  for (i = 0; i < maxsection; i++) {[m
[31m-    D->sections[i].buf = NULL;  /* Need this for pass3. */[m
[31m-    D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i);[m
[31m-    D->sections[i].bsize = 0;[m
[31m-    D->sections[i].epos = 0;  /* Wrong, but is recalculated after resize. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free DynASM state. */[m
[31m-void dasm_free(Dst_DECL)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  for (i = 0; i < D->maxsection; i++)[m
[31m-    if (D->sections[i].buf)[m
[31m-      DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize);[m
[31m-  if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize);[m
[31m-  if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize);[m
[31m-  DASM_M_FREE(Dst, D, D->psize);[m
[31m-}[m
[31m-[m
[31m-/* Setup global label array. Must be called before dasm_setup(). */[m
[31m-void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  D->globals = gl - 10;  /* Negative bias to compensate for locals. */[m
[31m-  DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int));[m
[31m-}[m
[31m-[m
[31m-/* Grow PC label array. Can be called after dasm_setup(), too. */[m
[31m-void dasm_growpc(Dst_DECL, unsigned int maxpc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  size_t osz = D->pcsize;[m
[31m-  DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int));[m
[31m-  memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz);[m
[31m-}[m
[31m-[m
[31m-/* Setup encoder. */[m
[31m-void dasm_setup(Dst_DECL, const void *actionlist)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int i;[m
[31m-  D->actionlist = (dasm_ActList)actionlist;[m
[31m-  D->status = DASM_S_OK;[m
[31m-  D->section = &D->sections[0];[m
[31m-  memset((void *)D->lglabels, 0, D->lgsize);[m
[31m-  if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize);[m
[31m-  for (i = 0; i < D->maxsection; i++) {[m
[31m-    D->sections[i].pos = DASM_SEC2POS(i);[m
[31m-    D->sections[i].ofs = 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-#define CK(x, st) \[m
[31m-  do { if (!(x)) { \[m
[31m-    D->status = DASM_S_##st|(int)(p-D->actionlist-1); return; } } while (0)[m
[31m-#define CKPL(kind, st) \[m
[31m-  do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \[m
[31m-    D->status=DASM_S_RANGE_##st|(int)(p-D->actionlist-1); return; } } while (0)[m
[31m-#else[m
[31m-#define CK(x, st)	((void)0)[m
[31m-#define CKPL(kind, st)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */[m
[31m-void dasm_put(Dst_DECL, int start, ...)[m
[31m-{[m
[31m-  va_list ap;[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  dasm_ActList p = D->actionlist + start;[m
[31m-  dasm_Section *sec = D->section;[m
[31m-  int pos = sec->pos, ofs = sec->ofs, mrm = -1;[m
[31m-  int *b;[m
[31m-[m
[31m-  if (pos >= sec->epos) {[m
[31m-    DASM_M_GROW(Dst, int, sec->buf, sec->bsize,[m
[31m-      sec->bsize + 2*DASM_MAXSECPOS*sizeof(int));[m
[31m-    sec->rbuf = sec->buf - DASM_POS2BIAS(pos);[m
[31m-    sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos);[m
[31m-  }[m
[31m-[m
[31m-  b = sec->rbuf;[m
[31m-  b[pos++] = start;[m
[31m-[m
[31m-  va_start(ap, start);[m
[31m-  while (1) {[m
[31m-    int action = *p++;[m
[31m-    if (action < DASM_DISP) {[m
[31m-      ofs++;[m
[31m-    } else if (action <= DASM_REL_A) {[m
[31m-      int n = va_arg(ap, int);[m
[31m-      b[pos++] = n;[m
[31m-      switch (action) {[m
[31m-      case DASM_DISP:[m
[31m-	if (n == 0) { if (mrm < 0) mrm = p[-2]; if ((mrm&7) != 5) break; }[m
[31m-      case DASM_IMM_DB: if (((n+128)&-256) == 0) goto ob;[m
[31m-      case DASM_REL_A: /* Assumes ptrdiff_t is int. !x64 */[m
[31m-      case DASM_IMM_D: ofs += 4; break;[m
[31m-      case DASM_IMM_S: CK(((n+128)&-256) == 0, RANGE_I); goto ob;[m
[31m-      case DASM_IMM_B: CK((n&-256) == 0, RANGE_I); ob: ofs++; break;[m
[31m-      case DASM_IMM_WB: if (((n+128)&-256) == 0) goto ob;[m
[31m-      case DASM_IMM_W: CK((n&-65536) == 0, RANGE_I); ofs += 2; break;[m
[31m-      case DASM_SPACE: p++; ofs += n; break;[m
[31m-      case DASM_SETLABEL: b[pos-2] = -0x40000000; break;  /* Neg. label ofs. */[m
[31m-      case DASM_VREG: CK((n&-16) == 0 && (n != 4 || (*p>>5) != 2), RANGE_VREG);[m
[31m-	if (*p < 0x40 && p[1] == DASM_DISP) mrm = n;[m
[31m-	if (*p < 0x20 && (n&7) == 4) ofs++;[m
[31m-	switch ((*p++ >> 3) & 3) {[m
[31m-	case 3: n |= b[pos-3];[m
[31m-	case 2: n |= b[pos-2];[m
[31m-	case 1: if (n <= 7) { b[pos-1] |= 0x10; ofs--; }[m
[31m-	}[m
[31m-	continue;[m
[31m-      }[m
[31m-      mrm = -1;[m
[31m-    } else {[m
[31m-      int *pl, n;[m
[31m-      switch (action) {[m
[31m-      case DASM_REL_LG:[m
[31m-      case DASM_IMM_LG:[m
[31m-	n = *p++; pl = D->lglabels + n;[m
[31m-	/* Bkwd rel or global. */[m
[31m-	if (n <= 246) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; }[m
[31m-	pl -= 246; n = *pl;[m
[31m-	if (n < 0) n = 0;  /* Start new chain for fwd rel if label exists. */[m
[31m-	goto linkrel;[m
[31m-      case DASM_REL_PC:[m
[31m-      case DASM_IMM_PC: pl = D->pclabels + va_arg(ap, int); CKPL(pc, PC);[m
[31m-      putrel:[m
[31m-	n = *pl;[m
[31m-	if (n < 0) {  /* Label exists. Get label pos and store it. */[m
[31m-	  b[pos] = -n;[m
[31m-	} else {[m
[31m-      linkrel:[m
[31m-	  b[pos] = n;  /* Else link to rel chain, anchored at label. */[m
[31m-	  *pl = pos;[m
[31m-	}[m
[31m-	pos++;[m
[31m-	ofs += 4;  /* Maximum offset needed. */[m
[31m-	if (action == DASM_REL_LG || action == DASM_REL_PC)[m
[31m-	  b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_LABEL_LG: pl = D->lglabels + *p++; CKPL(lg, LG); goto putlabel;[m
[31m-      case DASM_LABEL_PC: pl = D->pclabels + va_arg(ap, int); CKPL(pc, PC);[m
[31m-      putlabel:[m
[31m-	n = *pl;  /* n > 0: Collapse rel chain and replace with label pos. */[m
[31m-	while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; }[m
[31m-	*pl = -pos;  /* Label exists now. */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_ALIGN:[m
[31m-	ofs += *p++;  /* Maximum alignment needed (arg is 2**n-1). */[m
[31m-	b[pos++] = ofs;  /* Store pass1 offset estimate. */[m
[31m-	break;[m
[31m-      case DASM_EXTERN: p += 2; ofs += 4; break;[m
[31m-      case DASM_ESC: p++; ofs++; break;[m
[31m-      case DASM_MARK: mrm = p[-2]; break;[m
[31m-      case DASM_SECTION:[m
[31m-	n = *p; CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n];[m
[31m-      case DASM_STOP: goto stop;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-stop:[m
[31m-  va_end(ap);[m
[31m-  sec->pos = pos;[m
[31m-  sec->ofs = ofs;[m
[31m-}[m
[31m-#undef CK[m
[31m-[m
[31m-/* Pass 2: Link sections, shrink branches/aligns, fix label offsets. */[m
[31m-int dasm_link(Dst_DECL, size_t *szp)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  int secnum;[m
[31m-  int ofs = 0;[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-  *szp = 0;[m
[31m-  if (D->status != DASM_S_OK) return D->status;[m
[31m-  {[m
[31m-    int pc;[m
[31m-    for (pc = 0; pc*sizeof(int) < D->pcsize; pc++)[m
[31m-      if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  { /* Handle globals not defined in this translation unit. */[m
[31m-    int idx;[m
[31m-    for (idx = 10; idx*sizeof(int) < D->lgsize; idx++) {[m
[31m-      int n = D->lglabels[idx];[m
[31m-      /* Undefined label: Collapse rel chain and replace with marker (< 0). */[m
[31m-      while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Combine all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->rbuf;[m
[31m-    int pos = DASM_SEC2POS(secnum);[m
[31m-    int lastpos = sec->pos;[m
[31m-[m
[31m-    while (pos != lastpos) {[m
[31m-      dasm_ActList p = D->actionlist + b[pos++];[m
[31m-      while (1) {[m
[31m-	int op, action = *p++;[m
[31m-	switch (action) {[m
[31m-	case DASM_REL_LG: p++; op = p[-3]; goto rel_pc;[m
[31m-	case DASM_REL_PC: op = p[-2]; rel_pc: {[m
[31m-	  int shrink = op == 0xe9 ? 3 : ((op&0xf0) == 0x80 ? 4 : 0);[m
[31m-	  if (shrink) {  /* Shrinkable branch opcode? */[m
[31m-	    int lofs, lpos = b[pos];[m
[31m-	    if (lpos < 0) goto noshrink;  /* Ext global? */[m
[31m-	    lofs = *DASM_POS2PTR(D, lpos);[m
[31m-	    if (lpos > pos) {  /* Fwd label: add cumulative section offsets. */[m
[31m-	      int i;[m
[31m-	      for (i = secnum; i < DASM_POS2SEC(lpos); i++)[m
[31m-		lofs += D->sections[i].ofs;[m
[31m-	    } else {[m
[31m-	      lofs -= ofs;  /* Bkwd label: unfix offset. */[m
[31m-	    }[m
[31m-	    lofs -= b[pos+1];  /* Short branch ok? */[m
[31m-	    if (lofs >= -128-shrink && lofs <= 127) ofs -= shrink;  /* Yes. */[m
[31m-	    else { noshrink: shrink = 0; }  /* No, cannot shrink op. */[m
[31m-	  }[m
[31m-	  b[pos+1] = shrink;[m
[31m-	  pos += 2;[m
[31m-	  break;[m
[31m-	}[m
[31m-	case DASM_SPACE: case DASM_IMM_LG: case DASM_VREG: p++;[m
[31m-	case DASM_DISP: case DASM_IMM_S: case DASM_IMM_B: case DASM_IMM_W:[m
[31m-	case DASM_IMM_D: case DASM_IMM_WB: case DASM_IMM_DB:[m
[31m-	case DASM_SETLABEL: case DASM_REL_A: case DASM_IMM_PC: pos++; break;[m
[31m-	case DASM_LABEL_LG: p++;[m
[31m-	case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */[m
[31m-	case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */[m
[31m-	case DASM_EXTERN: p += 2; break;[m
[31m-	case DASM_ESC: p++; break;[m
[31m-	case DASM_MARK: break;[m
[31m-	case DASM_SECTION: case DASM_STOP: goto stop;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-    ofs += sec->ofs;  /* Next section starts right after current section. */[m
[31m-  }[m
[31m-[m
[31m-  D->codesize = ofs;  /* Total size of all code sections */[m
[31m-  *szp = ofs;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-#define dasmb(x)	*cp++ = (unsigned char)(x)[m
[31m-#ifndef DASM_ALIGNED_WRITES[m
[31m-#define dasmw(x) \[m
[31m-  do { *((unsigned short *)cp) = (unsigned short)(x); cp+=2; } while (0)[m
[31m-#define dasmd(x) \[m
[31m-  do { *((unsigned int *)cp) = (unsigned int)(x); cp+=4; } while (0)[m
[31m-#else[m
[31m-#define dasmw(x)	do { dasmb(x); dasmb((x)>>8); } while (0)[m
[31m-#define dasmd(x)	do { dasmw(x); dasmw((x)>>16); } while (0)[m
[31m-#endif[m
[31m-[m
[31m-/* Pass 3: Encode sections. */[m
[31m-int dasm_encode(Dst_DECL, void *buffer)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  unsigned char *base = (unsigned char *)buffer;[m
[31m-  unsigned char *cp = base;[m
[31m-  int secnum;[m
[31m-[m
[31m-  /* Encode all code sections. No support for data sections (yet). */[m
[31m-  for (secnum = 0; secnum < D->maxsection; secnum++) {[m
[31m-    dasm_Section *sec = D->sections + secnum;[m
[31m-    int *b = sec->buf;[m
[31m-    int *endb = sec->rbuf + sec->pos;[m
[31m-[m
[31m-    while (b != endb) {[m
[31m-      dasm_ActList p = D->actionlist + *b++;[m
[31m-      unsigned char *mark = NULL;[m
[31m-      while (1) {[m
[31m-	int action = *p++;[m
[31m-	int n = (action >= DASM_DISP && action <= DASM_ALIGN) ? *b++ : 0;[m
[31m-	switch (action) {[m
[31m-	case DASM_DISP: if (!mark) mark = cp; {[m
[31m-	  unsigned char *mm = mark;[m
[31m-	  if (*p != DASM_IMM_DB && *p != DASM_IMM_WB) mark = NULL;[m
[31m-	  if (n == 0) { int mrm = mm[-1]&7; if (mrm == 4) mrm = mm[0]&7;[m
[31m-	    if (mrm != 5) { mm[-1] -= 0x80; break; } }[m
[31m-	  if (((n+128) & -256) != 0) goto wd; else mm[-1] -= 0x40;[m
[31m-	}[m
[31m-	case DASM_IMM_S: case DASM_IMM_B: wb: dasmb(n); break;[m
[31m-	case DASM_IMM_DB: if (((n+128)&-256) == 0) {[m
[31m-	    db: if (!mark) mark = cp; mark[-2] += 2; mark = NULL; goto wb;[m
[31m-	  } else mark = NULL;[m
[31m-	case DASM_IMM_D: wd: dasmd(n); break;[m
[31m-	case DASM_IMM_WB: if (((n+128)&-256) == 0) goto db; else mark = NULL;[m
[31m-	case DASM_IMM_W: dasmw(n); break;[m
[31m-	case DASM_VREG: {[m
[31m-	  int t = *p++;[m
[31m-	  unsigned char *ex = cp - (t&7);[m
[31m-	  if ((n & 8) && t < 0xa0) {[m
[31m-	    if (*ex & 0x80) ex[1] ^= 0x20 << (t>>6); else *ex ^= 1 << (t>>6);[m
[31m-	    n &= 7;[m
[31m-	  } else if (n & 0x10) {[m
[31m-	    if (*ex & 0x80) {[m
[31m-	      *ex = 0xc5; ex[1] = (ex[1] & 0x80) | ex[2]; ex += 2;[m
[31m-	    }[m
[31m-	    while (++ex < cp) ex[-1] = *ex;[m
[31m-	    if (mark) mark--;[m
[31m-	    cp--;[m
[31m-	    n &= 7;[m
[31m-	  }[m
[31m-	  if (t >= 0xc0) n <<= 4;[m
[31m-	  else if (t >= 0x40) n <<= 3;[m
[31m-	  else if (n == 4 && t < 0x20) { cp[-1] ^= n; *cp++ = 0x20; }[m
[31m-	  cp[-1] ^= n;[m
[31m-	  break;[m
[31m-	}[m
[31m-	case DASM_REL_LG: p++; if (n >= 0) goto rel_pc;[m
[31m-	  b++; n = (int)(ptrdiff_t)D->globals[-n];[m
[31m-	case DASM_REL_A: rel_a: n -= (int)(ptrdiff_t)(cp+4); goto wd; /* !x64 */[m
[31m-	case DASM_REL_PC: rel_pc: {[m
[31m-	  int shrink = *b++;[m
[31m-	  int *pb = DASM_POS2PTR(D, n); if (*pb < 0) { n = pb[1]; goto rel_a; }[m
[31m-	  n = *pb - ((int)(cp-base) + 4-shrink);[m
[31m-	  if (shrink == 0) goto wd;[m
[31m-	  if (shrink == 4) { cp--; cp[-1] = *cp-0x10; } else cp[-1] = 0xeb;[m
[31m-	  goto wb;[m
[31m-	}[m
[31m-	case DASM_IMM_LG:[m
[31m-	  p++; if (n < 0) { n = (int)(ptrdiff_t)D->globals[-n]; goto wd; }[m
[31m-	case DASM_IMM_PC: {[m
[31m-	  int *pb = DASM_POS2PTR(D, n);[m
[31m-	  n = *pb < 0 ? pb[1] : (*pb + (int)(ptrdiff_t)base);[m
[31m-	  goto wd;[m
[31m-	}[m
[31m-	case DASM_LABEL_LG: {[m
[31m-	  int idx = *p++;[m
[31m-	  if (idx >= 10)[m
[31m-	    D->globals[idx] = (void *)(base + (*p == DASM_SETLABEL ? *b : n));[m
[31m-	  break;[m
[31m-	}[m
[31m-	case DASM_LABEL_PC: case DASM_SETLABEL: break;[m
[31m-	case DASM_SPACE: { int fill = *p++; while (n--) *cp++ = fill; break; }[m
[31m-	case DASM_ALIGN:[m
[31m-	  n = *p++;[m
[31m-	  while (((cp-base) & n)) *cp++ = 0x90; /* nop */[m
[31m-	  break;[m
[31m-	case DASM_EXTERN: n = DASM_EXTERN(Dst, cp, p[1], *p); p += 2; goto wd;[m
[31m-	case DASM_MARK: mark = cp; break;[m
[31m-	case DASM_ESC: action = *p++;[m
[31m-	default: *cp++ = action; break;[m
[31m-	case DASM_SECTION: case DASM_STOP: goto stop;[m
[31m-	}[m
[31m-      }[m
[31m-      stop: (void)0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (base + D->codesize != cp)  /* Check for phase errors. */[m
[31m-    return DASM_S_PHASE;[m
[31m-  return DASM_S_OK;[m
[31m-}[m
[31m-[m
[31m-/* Get PC label offset. */[m
[31m-int dasm_getpclabel(Dst_DECL, unsigned int pc)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (pc*sizeof(int) < D->pcsize) {[m
[31m-    int pos = D->pclabels[pc];[m
[31m-    if (pos < 0) return *DASM_POS2PTR(D, -pos);[m
[31m-    if (pos > 0) return -1;  /* Undefined. */[m
[31m-  }[m
[31m-  return -2;  /* Unused or out of range. */[m
[31m-}[m
[31m-[m
[31m-#ifdef DASM_CHECKS[m
[31m-/* Optional sanity checker to call between isolated encoding steps. */[m
[31m-int dasm_checkstep(Dst_DECL, int secmatch)[m
[31m-{[m
[31m-  dasm_State *D = Dst_REF;[m
[31m-  if (D->status == DASM_S_OK) {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= 9; i++) {[m
[31m-      if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_L|i; break; }[m
[31m-      D->lglabels[i] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  if (D->status == DASM_S_OK && secmatch >= 0 &&[m
[31m-      D->section != &D->sections[secmatch])[m
[31m-    D->status = DASM_S_MATCH_SEC|(int)(D->section-D->sections);[m
[31m-  return D->status;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x86.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x86.lua[m
[1mdeleted file mode 100644[m
[1mindex a5efd98..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dasm_x86.lua[m
[1m+++ /dev/null[m
[36m@@ -1,2274 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM x86/x64 module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See dynasm.lua for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local x64 = x64[m
[31m-[m
[31m--- Module information:[m
[31m-local _info = {[m
[31m-  arch =	x64 and "x64" or "x86",[m
[31m-  description =	"DynASM x86/x64 module",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  license =	"MIT",[m
[31m-}[m
[31m-[m
[31m--- Exported glue functions for the arch-specific module.[m
[31m-local _M = { _info = _info }[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs[m
[31m-local assert, unpack, setmetatable = assert, unpack or table.unpack, setmetatable[m
[31m-local _s = string[m
[31m-local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char[m
[31m-local find, match, gmatch, gsub = _s.find, _s.match, _s.gmatch, _s.gsub[m
[31m-local concat, sort, remove = table.concat, table.sort, table.remove[m
[31m-local bit = bit or require("bit")[m
[31m-local band, bxor, shl, shr = bit.band, bit.bxor, bit.lshift, bit.rshift[m
[31m-[m
[31m--- Inherited tables and callbacks.[m
[31m-local g_opt, g_arch[m
[31m-local wline, werror, wfatal, wwarn[m
[31m-[m
[31m--- Action name list.[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local action_names = {[m
[31m-  -- int arg, 1 buffer pos:[m
[31m-  "DISP",  "IMM_S", "IMM_B", "IMM_W", "IMM_D",  "IMM_WB", "IMM_DB",[m
[31m-  -- action arg (1 byte), int arg, 1 buffer pos (reg/num):[m
[31m-  "VREG", "SPACE",[m
[31m-  -- ptrdiff_t arg, 1 buffer pos (address): !x64[m
[31m-  "SETLABEL", "REL_A",[m
[31m-  -- action arg (1 byte) or int arg, 2 buffer pos (link, offset):[m
[31m-  "REL_LG", "REL_PC",[m
[31m-  -- action arg (1 byte) or int arg, 1 buffer pos (link):[m
[31m-  "IMM_LG", "IMM_PC",[m
[31m-  -- action arg (1 byte) or int arg, 1 buffer pos (offset):[m
[31m-  "LABEL_LG", "LABEL_PC",[m
[31m-  -- action arg (1 byte), 1 buffer pos (offset):[m
[31m-  "ALIGN",[m
[31m-  -- action args (2 bytes), no buffer pos.[m
[31m-  "EXTERN",[m
[31m-  -- action arg (1 byte), no buffer pos.[m
[31m-  "ESC",[m
[31m-  -- no action arg, no buffer pos.[m
[31m-  "MARK",[m
[31m-  -- action arg (1 byte), no buffer pos, terminal action:[m
[31m-  "SECTION",[m
[31m-  -- no args, no buffer pos, terminal action:[m
[31m-  "STOP"[m
[31m-}[m
[31m-[m
[31m--- Maximum number of section buffer positions for dasm_put().[m
[31m--- CHECK: Keep this in sync with the C code![m
[31m-local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines.[m
[31m-[m
[31m--- Action name -> action number (dynamically generated below).[m
[31m-local map_action = {}[m
[31m--- First action number. Everything below does not need to be escaped.[m
[31m-local actfirst = 256-#action_names[m
[31m-[m
[31m--- Action list buffer and string (only used to remove dupes).[m
[31m-local actlist = {}[m
[31m-local actstr = ""[m
[31m-[m
[31m--- Argument list for next dasm_put(). Start with offset 0 into action list.[m
[31m-local actargs = { 0 }[m
[31m-[m
[31m--- Current number of section buffer positions for dasm_put().[m
[31m-local secpos = 1[m
[31m-[m
[31m--- VREG kind encodings, pre-shifted by 5 bits.[m
[31m-local map_vreg = {[m
[31m-  ["modrm.rm.m"] = 0x00,[m
[31m-  ["modrm.rm.r"] = 0x20,[m
[31m-  ["opcode"] =     0x20,[m
[31m-  ["sib.base"] =   0x20,[m
[31m-  ["sib.index"] =  0x40,[m
[31m-  ["modrm.reg"] =  0x80,[m
[31m-  ["vex.v"] =      0xa0,[m
[31m-  ["imm.hi"] =     0xc0,[m
[31m-}[m
[31m-[m
[31m--- Current number of VREG actions contributing to REX/VEX shrinkage.[m
[31m-local vreg_shrink_count = 0[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Compute action numbers for action names.[m
[31m-for n,name in ipairs(action_names) do[m
[31m-  local num = actfirst + n - 1[m
[31m-  map_action[name] = num[m
[31m-end[m
[31m-[m
[31m--- Dump action names and numbers.[m
[31m-local function dumpactions(out)[m
[31m-  out:write("DynASM encoding engine action codes:\n")[m
[31m-  for n,name in ipairs(action_names) do[m
[31m-    local num = map_action[name][m
[31m-    out:write(format("  %-10s %02X  %d\n", name, num, num))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write action list buffer as a huge static C array.[m
[31m-local function writeactions(out, name)[m
[31m-  local nn = #actlist[m
[31m-  local last = actlist[nn] or 255[m
[31m-  actlist[nn] = nil -- Remove last byte.[m
[31m-  if nn == 0 then nn = 1 end[m
[31m-  out:write("static const unsigned char ", name, "[", nn, "] = {\n")[m
[31m-  local s = "  "[m
[31m-  for n,b in ipairs(actlist) do[m
[31m-    s = s..b..","[m
[31m-    if #s >= 75 then[m
[31m-      assert(out:write(s, "\n"))[m
[31m-      s = "  "[m
[31m-    end[m
[31m-  end[m
[31m-  out:write(s, last, "\n};\n\n") -- Add last byte back.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add byte to action list.[m
[31m-local function wputxb(n)[m
[31m-  assert(n >= 0 and n <= 255 and n % 1 == 0, "byte out of range")[m
[31m-  actlist[#actlist+1] = n[m
[31m-end[m
[31m-[m
[31m--- Add action to list with optional arg. Advance buffer pos, too.[m
[31m-local function waction(action, a, num)[m
[31m-  wputxb(assert(map_action[action], "bad action name `"..action.."'"))[m
[31m-  if a then actargs[#actargs+1] = a end[m
[31m-  if a or num then secpos = secpos + (num or 1) end[m
[31m-end[m
[31m-[m
[31m--- Optionally add a VREG action.[m
[31m-local function wvreg(kind, vreg, psz, sk, defer)[m
[31m-  if not vreg then return end[m
[31m-  waction("VREG", vreg)[m
[31m-  local b = assert(map_vreg[kind], "bad vreg kind `"..vreg.."'")[m
[31m-  if b < (sk or 0) then[m
[31m-    vreg_shrink_count = vreg_shrink_count + 1[m
[31m-  end[m
[31m-  if not defer then[m
[31m-    b = b + vreg_shrink_count * 8[m
[31m-    vreg_shrink_count = 0[m
[31m-  end[m
[31m-  wputxb(b + (psz or 0))[m
[31m-end[m
[31m-[m
[31m--- Add call to embedded DynASM C code.[m
[31m-local function wcall(func, args)[m
[31m-  wline(format("dasm_%s(Dst, %s);", func, concat(args, ", ")), true)[m
[31m-end[m
[31m-[m
[31m--- Delete duplicate action list chunks. A tad slow, but so what.[m
[31m-local function dedupechunk(offset)[m
[31m-  local al, as = actlist, actstr[m
[31m-  local chunk = char(unpack(al, offset+1, #al))[m
[31m-  local orig = find(as, chunk, 1, true)[m
[31m-  if orig then[m
[31m-    actargs[1] = orig-1 -- Replace with original offset.[m
[31m-    for i=offset+1,#al do al[i] = nil end -- Kill dupe.[m
[31m-  else[m
[31m-    actstr = as..chunk[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Flush action list (intervening C code or buffer pos overflow).[m
[31m-local function wflush(term)[m
[31m-  local offset = actargs[1][m
[31m-  if #actlist == offset then return end -- Nothing to flush.[m
[31m-  if not term then waction("STOP") end -- Terminate action list.[m
[31m-  dedupechunk(offset)[m
[31m-  wcall("put", actargs) -- Add call to dasm_put().[m
[31m-  actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put().[m
[31m-  secpos = 1 -- The actionlist offset occupies a buffer position, too.[m
[31m-end[m
[31m-[m
[31m--- Put escaped byte.[m
[31m-local function wputb(n)[m
[31m-  if n >= actfirst then waction("ESC") end -- Need to escape byte.[m
[31m-  wputxb(n)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Global label name -> global label number. With auto assignment on 1st use.[m
[31m-local next_global = 10[m
[31m-local map_global = setmetatable({}, { __index = function(t, name)[m
[31m-  if not match(name, "^[%a_][%w_@]*$") then werror("bad global label") end[m
[31m-  local n = next_global[m
[31m-  if n > 246 then werror("too many global labels") end[m
[31m-  next_global = n + 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump global labels.[m
[31m-local function dumpglobals(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("Global labels:\n")[m
[31m-  for i=10,next_global-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label enum.[m
[31m-local function writeglobals(out, prefix)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("enum {\n")[m
[31m-  for i=10,next_global-1 do[m
[31m-    out:write("  ", prefix, gsub(t[i], "@.*", ""), ",\n")[m
[31m-  end[m
[31m-  out:write("  ", prefix, "_MAX\n};\n")[m
[31m-end[m
[31m-[m
[31m--- Write global label names.[m
[31m-local function writeglobalnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_global) do t[n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=10,next_global-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Extern label name -> extern label number. With auto assignment on 1st use.[m
[31m-local next_extern = -1[m
[31m-local map_extern = setmetatable({}, { __index = function(t, name)[m
[31m-  -- No restrictions on the name for now.[m
[31m-  local n = next_extern[m
[31m-  if n < -256 then werror("too many extern labels") end[m
[31m-  next_extern = n - 1[m
[31m-  t[name] = n[m
[31m-  return n[m
[31m-end})[m
[31m-[m
[31m--- Dump extern labels.[m
[31m-local function dumpexterns(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_extern) do t[-n] = name end[m
[31m-  out:write("Extern labels:\n")[m
[31m-  for i=1,-next_extern-1 do[m
[31m-    out:write(format("  %s\n", t[i]))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Write extern label names.[m
[31m-local function writeexternnames(out, name)[m
[31m-  local t = {}[m
[31m-  for name, n in pairs(map_extern) do t[-n] = name end[m
[31m-  out:write("static const char *const ", name, "[] = {\n")[m
[31m-  for i=1,-next_extern-1 do[m
[31m-    out:write("  \"", t[i], "\",\n")[m
[31m-  end[m
[31m-  out:write("  (const char *)0\n};\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arch-specific maps.[m
[31m-local map_archdef = {}		-- Ext. register name -> int. name.[m
[31m-local map_reg_rev = {}		-- Int. register name -> ext. name.[m
[31m-local map_reg_num = {}		-- Int. register name -> register number.[m
[31m-local map_reg_opsize = {}	-- Int. register name -> operand size.[m
[31m-local map_reg_valid_base = {}	-- Int. register name -> valid base register?[m
[31m-local map_reg_valid_index = {}	-- Int. register name -> valid index register?[m
[31m-local map_reg_needrex = {}	-- Int. register name -> need rex vs. no rex.[m
[31m-local reg_list = {}		-- Canonical list of int. register names.[m
[31m-[m
[31m-local map_type = {}		-- Type name -> { ctype, reg }[m
[31m-local ctypenum = 0		-- Type number (for _PTx macros).[m
[31m-[m
[31m-local addrsize = x64 and "q" or "d"	-- Size for address operands.[m
[31m-[m
[31m--- Helper functions to fill register maps.[m
[31m-local function mkrmap(sz, cl, names)[m
[31m-  local cname = format("@%s", sz)[m
[31m-  reg_list[#reg_list+1] = cname[m
[31m-  map_archdef[cl] = cname[m
[31m-  map_reg_rev[cname] = cl[m
[31m-  map_reg_num[cname] = -1[m
[31m-  map_reg_opsize[cname] = sz[m
[31m-  if sz == addrsize or sz == "d" then[m
[31m-    map_reg_valid_base[cname] = true[m
[31m-    map_reg_valid_index[cname] = true[m
[31m-  end[m
[31m-  if names then[m
[31m-    for n,name in ipairs(names) do[m
[31m-      local iname = format("@%s%x", sz, n-1)[m
[31m-      reg_list[#reg_list+1] = iname[m
[31m-      map_archdef[name] = iname[m
[31m-      map_reg_rev[iname] = name[m
[31m-      map_reg_num[iname] = n-1[m
[31m-      map_reg_opsize[iname] = sz[m
[31m-      if sz == "b" and n > 4 then map_reg_needrex[iname] = false end[m
[31m-      if sz == addrsize or sz == "d" then[m
[31m-	map_reg_valid_base[iname] = true[m
[31m-	map_reg_valid_index[iname] = true[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  for i=0,(x64 and sz ~= "f") and 15 or 7 do[m
[31m-    local needrex = sz == "b" and i > 3[m
[31m-    local iname = format("@%s%x%s", sz, i, needrex and "R" or "")[m
[31m-    if needrex then map_reg_needrex[iname] = true end[m
[31m-    local name[m
[31m-    if sz == "o" or sz == "y" then name = format("%s%d", cl, i)[m
[31m-    elseif sz == "f" then name = format("st%d", i)[m
[31m-    else name = format("r%d%s", i, sz == addrsize and "" or sz) end[m
[31m-    map_archdef[name] = iname[m
[31m-    if not map_reg_rev[iname] then[m
[31m-      reg_list[#reg_list+1] = iname[m
[31m-      map_reg_rev[iname] = name[m
[31m-      map_reg_num[iname] = i[m
[31m-      map_reg_opsize[iname] = sz[m
[31m-      if sz == addrsize or sz == "d" then[m
[31m-	map_reg_valid_base[iname] = true[m
[31m-	map_reg_valid_index[iname] = true[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  reg_list[#reg_list+1] = ""[m
[31m-end[m
[31m-[m
[31m--- Integer registers (qword, dword, word and byte sized).[m
[31m-if x64 then[m
[31m-  mkrmap("q", "Rq", {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi"})[m
[31m-end[m
[31m-mkrmap("d", "Rd", {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"})[m
[31m-mkrmap("w", "Rw", {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di"})[m
[31m-mkrmap("b", "Rb", {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"})[m
[31m-map_reg_valid_index[map_archdef.esp] = false[m
[31m-if x64 then map_reg_valid_index[map_archdef.rsp] = false end[m
[31m-if x64 then map_reg_needrex[map_archdef.Rb] = true end[m
[31m-map_archdef["Ra"] = "@"..addrsize[m
[31m-[m
[31m--- FP registers (internally tword sized, but use "f" as operand size).[m
[31m-mkrmap("f", "Rf")[m
[31m-[m
[31m--- SSE registers (oword sized, but qword and dword accessible).[m
[31m-mkrmap("o", "xmm")[m
[31m-[m
[31m--- AVX registers (yword sized, but oword, qword and dword accessible).[m
[31m-mkrmap("y", "ymm")[m
[31m-[m
[31m--- Operand size prefixes to codes.[m
[31m-local map_opsize = {[m
[31m-  byte = "b", word = "w", dword = "d", qword = "q", oword = "o", yword = "y",[m
[31m-  tword = "t", aword = addrsize,[m
[31m-}[m
[31m-[m
[31m--- Operand size code to number.[m
[31m-local map_opsizenum = {[m
[31m-  b = 1, w = 2, d = 4, q = 8, o = 16, y = 32, t = 10,[m
[31m-}[m
[31m-[m
[31m--- Operand size code to name.[m
[31m-local map_opsizename = {[m
[31m-  b = "byte", w = "word", d = "dword", q = "qword", o = "oword", y = "yword",[m
[31m-  t = "tword", f = "fpword",[m
[31m-}[m
[31m-[m
[31m--- Valid index register scale factors.[m
[31m-local map_xsc = {[m
[31m-  ["1"] = 0, ["2"] = 1, ["4"] = 2, ["8"] = 3,[m
[31m-}[m
[31m-[m
[31m--- Condition codes.[m
[31m-local map_cc = {[m
[31m-  o = 0, no = 1, b = 2, nb = 3, e = 4, ne = 5, be = 6, nbe = 7,[m
[31m-  s = 8, ns = 9, p = 10, np = 11, l = 12, nl = 13, le = 14, nle = 15,[m
[31m-  c = 2, nae = 2, nc = 3, ae = 3, z = 4, nz = 5, na = 6, a = 7,[m
[31m-  pe = 10, po = 11, nge = 12, ge = 13, ng = 14, g = 15,[m
[31m-}[m
[31m-[m
[31m-[m
[31m--- Reverse defines for registers.[m
[31m-function _M.revdef(s)[m
[31m-  return gsub(s, "@%w+", map_reg_rev)[m
[31m-end[m
[31m-[m
[31m--- Dump register names and numbers[m
[31m-local function dumpregs(out)[m
[31m-  out:write("Register names, sizes and internal numbers:\n")[m
[31m-  for _,reg in ipairs(reg_list) do[m
[31m-    if reg == "" then[m
[31m-      out:write("\n")[m
[31m-    else[m
[31m-      local name = map_reg_rev[reg][m
[31m-      local num = map_reg_num[reg][m
[31m-      local opsize = map_opsizename[map_reg_opsize[reg]][m
[31m-      out:write(format("  %-5s %-8s %s\n", name, opsize,[m
[31m-		       num < 0 and "(variable)" or num))[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Put action for label arg (IMM_LG, IMM_PC, REL_LG, REL_PC).[m
[31m-local function wputlabel(aprefix, imm, num)[m
[31m-  if type(imm) == "number" then[m
[31m-    if imm < 0 then[m
[31m-      waction("EXTERN")[m
[31m-      wputxb(aprefix == "IMM_" and 0 or 1)[m
[31m-      imm = -imm-1[m
[31m-    else[m
[31m-      waction(aprefix.."LG", nil, num);[m
[31m-    end[m
[31m-    wputxb(imm)[m
[31m-  else[m
[31m-    waction(aprefix.."PC", imm, num)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Put signed byte or arg.[m
[31m-local function wputsbarg(n)[m
[31m-  if type(n) == "number" then[m
[31m-    if n < -128 or n > 127 then[m
[31m-      werror("signed immediate byte out of range")[m
[31m-    end[m
[31m-    if n < 0 then n = n + 256 end[m
[31m-    wputb(n)[m
[31m-  else waction("IMM_S", n) end[m
[31m-end[m
[31m-[m
[31m--- Put unsigned byte or arg.[m
[31m-local function wputbarg(n)[m
[31m-  if type(n) == "number" then[m
[31m-    if n < 0 or n > 255 then[m
[31m-      werror("unsigned immediate byte out of range")[m
[31m-    end[m
[31m-    wputb(n)[m
[31m-  else waction("IMM_B", n) end[m
[31m-end[m
[31m-[m
[31m--- Put unsigned word or arg.[m
[31m-local function wputwarg(n)[m
[31m-  if type(n) == "number" then[m
[31m-    if shr(n, 16) ~= 0 then[m
[31m-      werror("unsigned immediate word out of range")[m
[31m-    end[m
[31m-    wputb(band(n, 255)); wputb(shr(n, 8));[m
[31m-  else waction("IMM_W", n) end[m
[31m-end[m
[31m-[m
[31m--- Put signed or unsigned dword or arg.[m
[31m-local function wputdarg(n)[m
[31m-  local tn = type(n)[m
[31m-  if tn == "number" then[m
[31m-    wputb(band(n, 255))[m
[31m-    wputb(band(shr(n, 8), 255))[m
[31m-    wputb(band(shr(n, 16), 255))[m
[31m-    wputb(shr(n, 24))[m
[31m-  elseif tn == "table" then[m
[31m-    wputlabel("IMM_", n[1], 1)[m
[31m-  else[m
[31m-    waction("IMM_D", n)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Put operand-size dependent number or arg (defaults to dword).[m
[31m-local function wputszarg(sz, n)[m
[31m-  if not sz or sz == "d" or sz == "q" then wputdarg(n)[m
[31m-  elseif sz == "w" then wputwarg(n)[m
[31m-  elseif sz == "b" then wputbarg(n)[m
[31m-  elseif sz == "s" then wputsbarg(n)[m
[31m-  else werror("bad operand size") end[m
[31m-end[m
[31m-[m
[31m--- Put multi-byte opcode with operand-size dependent modifications.[m
[31m-local function wputop(sz, op, rex, vex, vregr, vregxb)[m
[31m-  local psz, sk = 0, nil[m
[31m-  if vex then[m
[31m-    local tail[m
[31m-    if vex.m == 1 and band(rex, 11) == 0 then[m
[31m-      if x64 and vregxb then[m
[31m-	sk = map_vreg["modrm.reg"][m
[31m-      else[m
[31m-	wputb(0xc5)[m
[31m-      tail = shl(bxor(band(rex, 4), 4), 5)[m
[31m-      psz = 3[m
[31m-      end[m
[31m-    end[m
[31m-    if not tail then[m
[31m-      wputb(0xc4)[m
[31m-      wputb(shl(bxor(band(rex, 7), 7), 5) + vex.m)[m
[31m-      tail = shl(band(rex, 8), 4)[m
[31m-      psz = 4[m
[31m-    end[m
[31m-    local reg, vreg = 0, nil[m
[31m-    if vex.v then[m
[31m-      reg = vex.v.reg[m
[31m-      if not reg then werror("bad vex operand") end[m
[31m-      if reg < 0 then reg = 0; vreg = vex.v.vreg end[m
[31m-    end[m
[31m-    if sz == "y" or vex.l then tail = tail + 4 end[m
[31m-    wputb(tail + shl(bxor(reg, 15), 3) + vex.p)[m
[31m-    wvreg("vex.v", vreg)[m
[31m-    rex = 0[m
[31m-    if op >= 256 then werror("bad vex opcode") end[m
[31m-  else[m
[31m-    if rex ~= 0 then[m
[31m-      if not x64 then werror("bad operand size") end[m
[31m-    elseif (vregr or vregxb) and x64 then[m
[31m-      rex = 0x10[m
[31m-      sk = map_vreg["vex.v"][m
[31m-    end[m
[31m-  end[m
[31m-  local r[m
[31m-  if sz == "w" then wputb(102) end[m
[31m-  -- Needs >32 bit numbers, but only for crc32 eax, word [ebx][m
[31m-  if op >= 4294967296 then r = op%4294967296 wputb((op-r)/4294967296) op = r end[m
[31m-  if op >= 16777216 then wputb(shr(op, 24)); op = band(op, 0xffffff) end[m
[31m-  if op >= 65536 then[m
[31m-    if rex ~= 0 then[m
[31m-      local opc3 = band(op, 0xffff00)[m
[31m-      if opc3 == 0x0f3a00 or opc3 == 0x0f3800 then[m
[31m-	wputb(64 + band(rex, 15)); rex = 0; psz = 2[m
[31m-      end[m
[31m-    end[m
[31m-    wputb(shr(op, 16)); op = band(op, 0xffff); psz = psz + 1[m
[31m-  end[m
[31m-  if op >= 256 then[m
[31m-    local b = shr(op, 8)[m
[31m-    if b == 15 and rex ~= 0 then wputb(64 + band(rex, 15)); rex = 0; psz = 2 end[m
[31m-    wputb(b); op = band(op, 255); psz = psz + 1[m
[31m-  end[m
[31m-  if rex ~= 0 then wputb(64 + band(rex, 15)); psz = 2 end[m
[31m-  if sz == "b" then op = op - 1 end[m
[31m-  wputb(op)[m
[31m-  return psz, sk[m
[31m-end[m
[31m-[m
[31m--- Put ModRM or SIB formatted byte.[m
[31m-local function wputmodrm(m, s, rm, vs, vrm)[m
[31m-  assert(m < 4 and s < 16 and rm < 16, "bad modrm operands")[m
[31m-  wputb(shl(m, 6) + shl(band(s, 7), 3) + band(rm, 7))[m
[31m-end[m
[31m-[m
[31m--- Put ModRM/SIB plus optional displacement.[m
[31m-local function wputmrmsib(t, imark, s, vsreg, psz, sk)[m
[31m-  local vreg, vxreg[m
[31m-  local reg, xreg = t.reg, t.xreg[m
[31m-  if reg and reg < 0 then reg = 0; vreg = t.vreg end[m
[31m-  if xreg and xreg < 0 then xreg = 0; vxreg = t.vxreg end[m
[31m-  if s < 0 then s = 0 end[m
[31m-[m
[31m-  -- Register mode.[m
[31m-  if sub(t.mode, 1, 1) == "r" then[m
[31m-    wputmodrm(3, s, reg)[m
[31m-    wvreg("modrm.reg", vsreg, psz+1, sk, vreg)[m
[31m-    wvreg("modrm.rm.r", vreg, psz+1, sk)[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  local disp = t.disp[m
[31m-  local tdisp = type(disp)[m
[31m-  -- No base register?[m
[31m-  if not reg then[m
[31m-    local riprel = false[m
[31m-    if xreg then[m
[31m-      -- Indexed mode with index register only.[m
[31m-      -- [xreg*xsc+disp] -> (0, s, esp) (xsc, xreg, ebp)[m
[31m-      wputmodrm(0, s, 4)[m
[31m-      if imark == "I" then waction("MARK") end[m
[31m-      wvreg("modrm.reg", vsreg, psz+1, sk, vxreg)[m
[31m-      wputmodrm(t.xsc, xreg, 5)[m
[31m-      wvreg("sib.index", vxreg, psz+2, sk)[m
[31m-    else[m
[31m-      -- Pure 32 bit displacement.[m
[31m-      if x64 and tdisp ~= "table" then[m
[31m-	wputmodrm(0, s, 4) -- [disp] -> (0, s, esp) (0, esp, ebp)[m
[31m-	wvreg("modrm.reg", vsreg, psz+1, sk)[m
[31m-	if imark == "I" then waction("MARK") end[m
[31m-	wputmodrm(0, 4, 5)[m
[31m-      else[m
[31m-	riprel = x64[m
[31m-	wputmodrm(0, s, 5) -- [disp|rip-label] -> (0, s, ebp)[m
[31m-	wvreg("modrm.reg", vsreg, psz+1, sk)[m
[31m-	if imark == "I" then waction("MARK") end[m
[31m-      end[m
[31m-    end[m
[31m-    if riprel then -- Emit rip-relative displacement.[m
[31m-      if match("UWSiI", imark) then[m
[31m-	werror("NYI: rip-relative displacement followed by immediate")[m
[31m-      end[m
[31m-      -- The previous byte in the action buffer cannot be 0xe9 or 0x80-0x8f.[m
[31m-      wputlabel("REL_", disp[1], 2)[m
[31m-    else[m
[31m-      wputdarg(disp)[m
[31m-    end[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  local m[m
[31m-  if tdisp == "number" then -- Check displacement size at assembly time.[m
[31m-    if disp == 0 and band(reg, 7) ~= 5 then -- [ebp] -> [ebp+0] (in SIB, too)[m
[31m-      if not vreg then m = 0 end -- Force DISP to allow [Rd(5)] -> [ebp+0][m
[31m-    elseif disp >= -128 and disp <= 127 then m = 1[m
[31m-    else m = 2 end[m
[31m-  elseif tdisp == "table" then[m
[31m-    m = 2[m
[31m-  end[m
[31m-[m
[31m-  -- Index register present or esp as base register: need SIB encoding.[m
[31m-  if xreg or band(reg, 7) == 4 then[m
[31m-    wputmodrm(m or 2, s, 4) -- ModRM.[m
[31m-    if m == nil or imark == "I" then waction("MARK") end[m
[31m-    wvreg("modrm.reg", vsreg, psz+1, sk, vxreg or vreg)[m
[31m-    wputmodrm(t.xsc or 0, xreg or 4, reg) -- SIB.[m
[31m-    wvreg("sib.index", vxreg, psz+2, sk, vreg)[m
[31m-    wvreg("sib.base", vreg, psz+2, sk)[m
[31m-  else[m
[31m-    wputmodrm(m or 2, s, reg) -- ModRM.[m
[31m-    if (imark == "I" and (m == 1 or m == 2)) or[m
[31m-       (m == nil and (vsreg or vreg)) then waction("MARK") end[m
[31m-    wvreg("modrm.reg", vsreg, psz+1, sk, vreg)[m
[31m-    wvreg("modrm.rm.m", vreg, psz+1, sk)[m
[31m-  end[m
[31m-[m
[31m-  -- Put displacement.[m
[31m-  if m == 1 then wputsbarg(disp)[m
[31m-  elseif m == 2 then wputdarg(disp)[m
[31m-  elseif m == nil then waction("DISP", disp) end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Return human-readable operand mode string.[m
[31m-local function opmodestr(op, args)[m
[31m-  local m = {}[m
[31m-  for i=1,#args do[m
[31m-    local a = args[i][m
[31m-    m[#m+1] = sub(a.mode, 1, 1)..(a.opsize or "?")[m
[31m-  end[m
[31m-  return op.." "..concat(m, ",")[m
[31m-end[m
[31m-[m
[31m--- Convert number to valid integer or nil.[m
[31m-local function toint(expr)[m
[31m-  local n = tonumber(expr)[m
[31m-  if n then[m
[31m-    if n % 1 ~= 0 or n < -2147483648 or n > 4294967295 then[m
[31m-      werror("bad integer number `"..expr.."'")[m
[31m-    end[m
[31m-    return n[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Parse immediate expression.[m
[31m-local function immexpr(expr)[m
[31m-  -- &expr (pointer)[m
[31m-  if sub(expr, 1, 1) == "&" then[m
[31m-    return "iPJ", format("(ptrdiff_t)(%s)", sub(expr,2))[m
[31m-  end[m
[31m-[m
[31m-  local prefix = sub(expr, 1, 2)[m
[31m-  -- =>expr (pc label reference)[m
[31m-  if prefix == "=>" then[m
[31m-    return "iJ", sub(expr, 3)[m
[31m-  end[m
[31m-  -- ->name (global label reference)[m
[31m-  if prefix == "->" then[m
[31m-    return "iJ", map_global[sub(expr, 3)][m
[31m-  end[m
[31m-[m
[31m-  -- [<>][1-9] (local label reference)[m
[31m-  local dir, lnum = match(expr, "^([<>])([1-9])$")[m
[31m-  if dir then -- Fwd: 247-255, Bkwd: 1-9.[m
[31m-    return "iJ", lnum + (dir == ">" and 246 or 0)[m
[31m-  end[m
[31m-[m
[31m-  local extname = match(expr, "^extern%s+(%S+)$")[m
[31m-  if extname then[m
[31m-    return "iJ", map_extern[extname][m
[31m-  end[m
[31m-[m
[31m-  -- expr (interpreted as immediate)[m
[31m-  return "iI", expr[m
[31m-end[m
[31m-[m
[31m--- Parse displacement expression: +-num, +-expr, +-opsize*num[m
[31m-local function dispexpr(expr)[m
[31m-  local disp = expr == "" and 0 or toint(expr)[m
[31m-  if disp then return disp end[m
[31m-  local c, dispt = match(expr, "^([+-])%s*(.+)$")[m
[31m-  if c == "+" then[m
[31m-    expr = dispt[m
[31m-  elseif not c then[m
[31m-    werror("bad displacement expression `"..expr.."'")[m
[31m-  end[m
[31m-  local opsize, tailops = match(dispt, "^(%w+)%s*%*%s*(.+)$")[m
[31m-  local ops, imm = map_opsize[opsize], toint(tailops)[m
[31m-  if ops and imm then[m
[31m-    if c == "-" then imm = -imm end[m
[31m-    return imm*map_opsizenum[ops][m
[31m-  end[m
[31m-  local mode, iexpr = immexpr(dispt)[m
[31m-  if mode == "iJ" then[m
[31m-    if c == "-" then werror("cannot invert label reference") end[m
[31m-    return { iexpr }[m
[31m-  end[m
[31m-  return expr -- Need to return original signed expression.[m
[31m-end[m
[31m-[m
[31m--- Parse register or type expression.[m
[31m-local function rtexpr(expr)[m
[31m-  if not expr then return end[m
[31m-  local tname, ovreg = match(expr, "^([%w_]+):(@[%w_]+)$")[m
[31m-  local tp = map_type[tname or expr][m
[31m-  if tp then[m
[31m-    local reg = ovreg or tp.reg[m
[31m-    local rnum = map_reg_num[reg][m
[31m-    if not rnum then[m
[31m-      werror("type `"..(tname or expr).."' needs a register override")[m
[31m-    end[m
[31m-    if not map_reg_valid_base[reg] then[m
[31m-      werror("bad base register override `"..(map_reg_rev[reg] or reg).."'")[m
[31m-    end[m
[31m-    return reg, rnum, tp[m
[31m-  end[m
[31m-  return expr, map_reg_num[expr][m
[31m-end[m
[31m-[m
[31m--- Parse operand and return { mode, opsize, reg, xreg, xsc, disp, imm }.[m
[31m-local function parseoperand(param)[m
[31m-  local t = {}[m
[31m-[m
[31m-  local expr = param[m
[31m-  local opsize, tailops = match(param, "^(%w+)%s*(.+)$")[m
[31m-  if opsize then[m
[31m-    t.opsize = map_opsize[opsize][m
[31m-    if t.opsize then expr = tailops end[m
[31m-  end[m
[31m-[m
[31m-  local br = match(expr, "^%[%s*(.-)%s*%]$")[m
[31m-  repeat[m
[31m-    if br then[m
[31m-      t.mode = "xm"[m
[31m-[m
[31m-      -- [disp][m
[31m-      t.disp = toint(br)[m
[31m-      if t.disp then[m
[31m-	t.mode = x64 and "xm" or "xmO"[m
[31m-	break[m
[31m-      end[m
[31m-[m
[31m-      -- [reg...][m
[31m-      local tp[m
[31m-      local reg, tailr = match(br, "^([@%w_:]+)%s*(.*)$")[m
[31m-      reg, t.reg, tp = rtexpr(reg)[m
[31m-      if not t.reg then[m
[31m-	-- [expr][m
[31m-	t.mode = x64 and "xm" or "xmO"[m
[31m-	t.disp = dispexpr("+"..br)[m
[31m-	break[m
[31m-      end[m
[31m-[m
[31m-      if t.reg == -1 then[m
[31m-	t.vreg, tailr = match(tailr, "^(%b())(.*)$")[m
[31m-	if not t.vreg then werror("bad variable register expression") end[m
[31m-      end[m
[31m-[m
[31m-      -- [xreg*xsc] or [xreg*xsc+-disp] or [xreg*xsc+-expr][m
[31m-      local xsc, tailsc = match(tailr, "^%*%s*([1248])%s*(.*)$")[m
[31m-      if xsc then[m
[31m-	if not map_reg_valid_index[reg] then[m
[31m-	  werror("bad index register `"..map_reg_rev[reg].."'")[m
[31m-	end[m
[31m-	t.xsc = map_xsc[xsc][m
[31m-	t.xreg = t.reg[m
[31m-	t.vxreg = t.vreg[m
[31m-	t.reg = nil[m
[31m-	t.vreg = nil[m
[31m-	t.disp = dispexpr(tailsc)[m
[31m-	break[m
[31m-      end[m
[31m-      if not map_reg_valid_base[reg] then[m
[31m-	werror("bad base register `"..map_reg_rev[reg].."'")[m
[31m-      end[m
[31m-[m
[31m-      -- [reg] or [reg+-disp][m
[31m-      t.disp = toint(tailr) or (tailr == "" and 0)[m
[31m-      if t.disp then break end[m
[31m-[m
[31m-      -- [reg+xreg...][m
[31m-      local xreg, tailx = match(tailr, "^+%s*([@%w_:]+)%s*(.*)$")[m
[31m-      xreg, t.xreg, tp = rtexpr(xreg)[m
[31m-      if not t.xreg then[m
[31m-	-- [reg+-expr][m
[31m-	t.disp = dispexpr(tailr)[m
[31m-	break[m
[31m-      end[m
[31m-      if not map_reg_valid_index[xreg] then[m
[31m-	werror("bad index register `"..map_reg_rev[xreg].."'")[m
[31m-      end[m
[31m-[m
[31m-      if t.xreg == -1 then[m
[31m-	t.vxreg, tailx = match(tailx, "^(%b())(.*)$")[m
[31m-	if not t.vxreg then werror("bad variable register expression") end[m
[31m-      end[m
[31m-[m
[31m-      -- [reg+xreg*xsc...][m
[31m-      local xsc, tailsc = match(tailx, "^%*%s*([1248])%s*(.*)$")[m
[31m-      if xsc then[m
[31m-	t.xsc = map_xsc[xsc][m
[31m-	tailx = tailsc[m
[31m-      end[m
[31m-[m
[31m-      -- [...] or [...+-disp] or [...+-expr][m
[31m-      t.disp = dispexpr(tailx)[m
[31m-    else[m
[31m-      -- imm or opsize*imm[m
[31m-      local imm = toint(expr)[m
[31m-      if not imm and sub(expr, 1, 1) == "*" and t.opsize then[m
[31m-	imm = toint(sub(expr, 2))[m
[31m-	if imm then[m
[31m-	  imm = imm * map_opsizenum[t.opsize][m
[31m-	  t.opsize = nil[m
[31m-	end[m
[31m-      end[m
[31m-      if imm then[m
[31m-	if t.opsize then werror("bad operand size override") end[m
[31m-	local m = "i"[m
[31m-	if imm == 1 then m = m.."1" end[m
[31m-	if imm >= 4294967168 and imm <= 4294967295 then imm = imm-4294967296 end[m
[31m-	if imm >= -128 and imm <= 127 then m = m.."S" end[m
[31m-	t.imm = imm[m
[31m-	t.mode = m[m
[31m-	break[m
[31m-      end[m
[31m-[m
[31m-      local tp[m
[31m-      local reg, tailr = match(expr, "^([@%w_:]+)%s*(.*)$")[m
[31m-      reg, t.reg, tp = rtexpr(reg)[m
[31m-      if t.reg then[m
[31m-	if t.reg == -1 then[m
[31m-	  t.vreg, tailr = match(tailr, "^(%b())(.*)$")[m
[31m-	  if not t.vreg then werror("bad variable register expression") end[m
[31m-	end[m
[31m-	-- reg[m
[31m-	if tailr == "" then[m
[31m-	  if t.opsize then werror("bad operand size override") end[m
[31m-	  t.opsize = map_reg_opsize[reg][m
[31m-	  if t.opsize == "f" then[m
[31m-	    t.mode = t.reg == 0 and "fF" or "f"[m
[31m-	  else[m
[31m-	    if reg == "@w4" or (x64 and reg == "@d4") then[m
[31m-	      wwarn("bad idea, try again with `"..(x64 and "rsp'" or "esp'"))[m
[31m-	    end[m
[31m-	    t.mode = t.reg == 0 and "rmR" or (reg == "@b1" and "rmC" or "rm")[m
[31m-	  end[m
[31m-	  t.needrex = map_reg_needrex[reg][m
[31m-	  break[m
[31m-	end[m
[31m-[m
[31m-	-- type[idx], type[idx].field, type->field -> [reg+offset_expr][m
[31m-	if not tp then werror("bad operand `"..param.."'") end[m
[31m-	t.mode = "xm"[m
[31m-	t.disp = format(tp.ctypefmt, tailr)[m
[31m-      else[m
[31m-	t.mode, t.imm = immexpr(expr)[m
[31m-	if sub(t.mode, -1) == "J" then[m
[31m-	  if t.opsize and t.opsize ~= addrsize then[m
[31m-	    werror("bad operand size override")[m
[31m-	  end[m
[31m-	  t.opsize = addrsize[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-  until true[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- x86 Template String Description[m
[31m--- ===============================[m
[31m---[m
[31m--- Each template string is a list of [match:]pattern pairs,[m
[31m--- separated by "|". The first match wins. No match means a[m
[31m--- bad or unsupported combination of operand modes or sizes.[m
[31m---[m
[31m--- The match part and the ":" is omitted if the operation has[m
[31m--- no operands. Otherwise the first N characters are matched[m
[31m--- against the mode strings of each of the N operands.[m
[31m---[m
[31m--- The mode string for each operand type is (see parseoperand()):[m
[31m---   Integer register: "rm", +"R" for eax, ax, al, +"C" for cl[m
[31m---   FP register:      "f",  +"F" for st0[m
[31m---   Index operand:    "xm", +"O" for [disp] (pure offset)[m
[31m---   Immediate:        "i",  +"S" for signed 8 bit, +"1" for 1,[m
[31m---                     +"I" for arg, +"P" for pointer[m
[31m---   Any:              +"J" for valid jump targets[m
[31m---[m
[31m--- So a match character "m" (mixed) matches both an integer register[m
[31m--- and an index operand (to be encoded with the ModRM/SIB scheme).[m
[31m--- But "r" matches only a register and "x" only an index operand[m
[31m--- (e.g. for FP memory access operations).[m
[31m---[m
[31m--- The operand size match string starts right after the mode match[m
[31m--- characters and ends before the ":". "dwb" or "qdwb" is assumed, if empty.[m
[31m--- The effective data size of the operation is matched against this list.[m
[31m---[m
[31m--- If only the regular "b", "w", "d", "q", "t" operand sizes are[m
[31m--- present, then all operands must be the same size. Unspecified sizes[m
[31m--- are ignored, but at least one operand must have a size or the pattern[m
[31m--- won't match (use the "byte", "word", "dword", "qword", "tword"[m
[31m--- operand size overrides. E.g.: mov dword [eax], 1).[m
[31m---[m
[31m--- If the list has a "1" or "2" prefix, the operand size is taken[m
[31m--- from the respective operand and any other operand sizes are ignored.[m
[31m--- If the list contains only ".", all operand sizes are ignored.[m
[31m--- If the list has a "/" prefix, the concatenated (mixed) operand sizes[m
[31m--- are compared to the match.[m
[31m---[m
[31m--- E.g. "rrdw" matches for either two dword registers or two word[m
[31m--- registers. "Fx2dq" matches an st0 operand plus an index operand[m
[31m--- pointing to a dword (float) or qword (double).[m
[31m---[m
[31m--- Every character after the ":" is part of the pattern string:[m
[31m---   Hex chars are accumulated to form the opcode (left to right).[m
[31m---   "n"       disables the standard opcode mods[m
[31m---             (otherwise: -1 for "b", o16 prefix for "w", rex.w for "q")[m
[31m---   "X"       Force REX.W.[m
[31m---   "r"/"R"   adds the reg. number from the 1st/2nd operand to the opcode.[m
[31m---   "m"/"M"   generates ModRM/SIB from the 1st/2nd operand.[m
[31m---             The spare 3 bits are either filled with the last hex digit or[m
[31m---             the result from a previous "r"/"R". The opcode is restored.[m
[31m---   "u"       Use VEX encoding, vvvv unused.[m
[31m---   "v"/"V"   Use VEX encoding, vvvv from 1st/2nd operand (the operand is[m
[31m---             removed from the list used by future characters).[m
[31m---   "L"       Force VEX.L[m
[31m---[m
[31m--- All of the following characters force a flush of the opcode:[m
[31m---   "o"/"O"   stores a pure 32 bit disp (offset) from the 1st/2nd operand.[m
[31m---   "s"       stores a 4 bit immediate from the last register operand,[m
[31m---             followed by 4 zero bits.[m
[31m---   "S"       stores a signed 8 bit immediate from the last operand.[m
[31m---   "U"       stores an unsigned 8 bit immediate from the last operand.[m
[31m---   "W"       stores an unsigned 16 bit immediate from the last operand.[m
[31m---   "i"       stores an operand sized immediate from the last operand.[m
[31m---   "I"       dito, but generates an action code to optionally modify[m
[31m---             the opcode (+2) for a signed 8 bit immediate.[m
[31m---   "J"       generates one of the REL action codes from the last operand.[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Template strings for x86 instructions. Ordered by first opcode byte.[m
[31m--- Unimplemented opcodes (deliberate omissions) are marked with *.[m
[31m-local map_op = {[m
[31m-  -- 00-05: add...[m
[31m-  -- 06: *push es[m
[31m-  -- 07: *pop es[m
[31m-  -- 08-0D: or...[m
[31m-  -- 0E: *push cs[m
[31m-  -- 0F: two byte opcode prefix[m
[31m-  -- 10-15: adc...[m
[31m-  -- 16: *push ss[m
[31m-  -- 17: *pop ss[m
[31m-  -- 18-1D: sbb...[m
[31m-  -- 1E: *push ds[m
[31m-  -- 1F: *pop ds[m
[31m-  -- 20-25: and...[m
[31m-  es_0 =	"26",[m
[31m-  -- 27: *daa[m
[31m-  -- 28-2D: sub...[m
[31m-  cs_0 =	"2E",[m
[31m-  -- 2F: *das[m
[31m-  -- 30-35: xor...[m
[31m-  ss_0 =	"36",[m
[31m-  -- 37: *aaa[m
[31m-  -- 38-3D: cmp...[m
[31m-  ds_0 =	"3E",[m
[31m-  -- 3F: *aas[m
[31m-  inc_1 =	x64 and "m:FF0m" or "rdw:40r|m:FF0m",[m
[31m-  dec_1 =	x64 and "m:FF1m" or "rdw:48r|m:FF1m",[m
[31m-  push_1 =	(x64 and "rq:n50r|rw:50r|mq:nFF6m|mw:FF6m" or[m
[31m-			 "rdw:50r|mdw:FF6m").."|S.:6AS|ib:n6Ai|i.:68i",[m
[31m-  pop_1 =	x64 and "rq:n58r|rw:58r|mq:n8F0m|mw:8F0m" or "rdw:58r|mdw:8F0m",[m
[31m-  -- 60: *pusha, *pushad, *pushaw[m
[31m-  -- 61: *popa, *popad, *popaw[m
[31m-  -- 62: *bound rdw,x[m
[31m-  -- 63: x86: *arpl mw,rw[m
[31m-  movsxd_2 =	x64 and "rm/qd:63rM",[m
[31m-  fs_0 =	"64",[m
[31m-  gs_0 =	"65",[m
[31m-  o16_0 =	"66",[m
[31m-  a16_0 =	not x64 and "67" or nil,[m
[31m-  a32_0 =	x64 and "67",[m
[31m-  -- 68: push idw[m
[31m-  -- 69: imul rdw,mdw,idw[m
[31m-  -- 6A: push ib[m
[31m-  -- 6B: imul rdw,mdw,S[m
[31m-  -- 6C: *insb[m
[31m-  -- 6D: *insd, *insw[m
[31m-  -- 6E: *outsb[m
[31m-  -- 6F: *outsd, *outsw[m
[31m-  -- 70-7F: jcc lb[m
[31m-  -- 80: add... mb,i[m
[31m-  -- 81: add... mdw,i[m
[31m-  -- 82: *undefined[m
[31m-  -- 83: add... mdw,S[m
[31m-  test_2 =	"mr:85Rm|rm:85rM|Ri:A9ri|mi:F70mi",[m
[31m-  -- 86: xchg rb,mb[m
[31m-  -- 87: xchg rdw,mdw[m
[31m-  -- 88: mov mb,r[m
[31m-  -- 89: mov mdw,r[m
[31m-  -- 8A: mov r,mb[m
[31m-  -- 8B: mov r,mdw[m
[31m-  -- 8C: *mov mdw,seg[m
[31m-  lea_2 =	"rx1dq:8DrM",[m
[31m-  -- 8E: *mov seg,mdw[m
[31m-  -- 8F: pop mdw[m
[31m-  nop_0 =	"90",[m
[31m-  xchg_2 =	"Rrqdw:90R|rRqdw:90r|rm:87rM|mr:87Rm",[m
[31m-  cbw_0 =	"6698",[m
[31m-  cwde_0 =	"98",[m
[31m-  cdqe_0 =	"4898",[m
[31m-  cwd_0 =	"6699",[m
[31m-  cdq_0 =	"99",[m
[31m-  cqo_0 =	"4899",[m
[31m-  -- 9A: *call iw:idw[m
[31m-  wait_0 =	"9B",[m
[31m-  fwait_0 =	"9B",[m
[31m-  pushf_0 =	"9C",[m
[31m-  pushfd_0 =	not x64 and "9C",[m
[31m-  pushfq_0 =	x64 and "9C",[m
[31m-  popf_0 =	"9D",[m
[31m-  popfd_0 =	not x64 and "9D",[m
[31m-  popfq_0 =	x64 and "9D",[m
[31m-  sahf_0 =	"9E",[m
[31m-  lahf_0 =	"9F",[m
[31m-  mov_2 =	"OR:A3o|RO:A1O|mr:89Rm|rm:8BrM|rib:nB0ri|ridw:B8ri|mi:C70mi",[m
[31m-  movsb_0 =	"A4",[m
[31m-  movsw_0 =	"66A5",[m
[31m-  movsd_0 =	"A5",[m
[31m-  cmpsb_0 =	"A6",[m
[31m-  cmpsw_0 =	"66A7",[m
[31m-  cmpsd_0 =	"A7",[m
[31m-  -- A8: test Rb,i[m
[31m-  -- A9: test Rdw,i[m
[31m-  stosb_0 =	"AA",[m
[31m-  stosw_0 =	"66AB",[m
[31m-  stosd_0 =	"AB",[m
[31m-  lodsb_0 =	"AC",[m
[31m-  lodsw_0 =	"66AD",[m
[31m-  lodsd_0 =	"AD",[m
[31m-  scasb_0 =	"AE",[m
[31m-  scasw_0 =	"66AF",[m
[31m-  scasd_0 =	"AF",[m
[31m-  -- B0-B7: mov rb,i[m
[31m-  -- B8-BF: mov rdw,i[m
[31m-  -- C0: rol... mb,i[m
[31m-  -- C1: rol... mdw,i[m
[31m-  ret_1 =	"i.:nC2W",[m
[31m-  ret_0 =	"C3",[m
[31m-  -- C4: *les rdw,mq[m
[31m-  -- C5: *lds rdw,mq[m
[31m-  -- C6: mov mb,i[m
[31m-  -- C7: mov mdw,i[m
[31m-  -- C8: *enter iw,ib[m
[31m-  leave_0 =	"C9",[m
[31m-  -- CA: *retf iw[m
[31m-  -- CB: *retf[m
[31m-  int3_0 =	"CC",[m
[31m-  int_1 =	"i.:nCDU",[m
[31m-  into_0 =	"CE",[m
[31m-  -- CF: *iret[m
[31m-  -- D0: rol... mb,1[m
[31m-  -- D1: rol... mdw,1[m
[31m-  -- D2: rol... mb,cl[m
[31m-  -- D3: rol... mb,cl[m
[31m-  -- D4: *aam ib[m
[31m-  -- D5: *aad ib[m
[31m-  -- D6: *salc[m
[31m-  -- D7: *xlat[m
[31m-  -- D8-DF: floating point ops[m
[31m-  -- E0: *loopne[m
[31m-  -- E1: *loope[m
[31m-  -- E2: *loop[m
[31m-  -- E3: *jcxz, *jecxz[m
[31m-  -- E4: *in Rb,ib[m
[31m-  -- E5: *in Rdw,ib[m
[31m-  -- E6: *out ib,Rb[m
[31m-  -- E7: *out ib,Rdw[m
[31m-  call_1 =	x64 and "mq:nFF2m|J.:E8nJ" or "md:FF2m|J.:E8J",[m
[31m-  jmp_1 =	x64 and "mq:nFF4m|J.:E9nJ" or "md:FF4m|J.:E9J", -- short: EB[m
[31m-  -- EA: *jmp iw:idw[m
[31m-  -- EB: jmp ib[m
[31m-  -- EC: *in Rb,dx[m
[31m-  -- ED: *in Rdw,dx[m
[31m-  -- EE: *out dx,Rb[m
[31m-  -- EF: *out dx,Rdw[m
[31m-  lock_0 =	"F0",[m
[31m-  int1_0 =	"F1",[m
[31m-  repne_0 =	"F2",[m
[31m-  repnz_0 =	"F2",[m
[31m-  rep_0 =	"F3",[m
[31m-  repe_0 =	"F3",[m
[31m-  repz_0 =	"F3",[m
[31m-  -- F4: *hlt[m
[31m-  cmc_0 =	"F5",[m
[31m-  -- F6: test... mb,i; div... mb[m
[31m-  -- F7: test... mdw,i; div... mdw[m
[31m-  clc_0 =	"F8",[m
[31m-  stc_0 =	"F9",[m
[31m-  -- FA: *cli[m
[31m-  cld_0 =	"FC",[m
[31m-  std_0 =	"FD",[m
[31m-  -- FE: inc... mb[m
[31m-  -- FF: inc... mdw[m
[31m-[m
[31m-  -- misc ops[m
[31m-  not_1 =	"m:F72m",[m
[31m-  neg_1 =	"m:F73m",[m
[31m-  mul_1 =	"m:F74m",[m
[31m-  imul_1 =	"m:F75m",[m
[31m-  div_1 =	"m:F76m",[m
[31m-  idiv_1 =	"m:F77m",[m
[31m-[m
[31m-  imul_2 =	"rmqdw:0FAFrM|rIqdw:69rmI|rSqdw:6BrmS|riqdw:69rmi",[m
[31m-  imul_3 =	"rmIqdw:69rMI|rmSqdw:6BrMS|rmiqdw:69rMi",[m
[31m-[m
[31m-  movzx_2 =	"rm/db:0FB6rM|rm/qb:|rm/wb:0FB6rM|rm/dw:0FB7rM|rm/qw:",[m
[31m-  movsx_2 =	"rm/db:0FBErM|rm/qb:|rm/wb:0FBErM|rm/dw:0FBFrM|rm/qw:",[m
[31m-[m
[31m-  bswap_1 =	"rqd:0FC8r",[m
[31m-  bsf_2 =	"rmqdw:0FBCrM",[m
[31m-  bsr_2 =	"rmqdw:0FBDrM",[m
[31m-  bt_2 =	"mrqdw:0FA3Rm|miqdw:0FBA4mU",[m
[31m-  btc_2 =	"mrqdw:0FBBRm|miqdw:0FBA7mU",[m
[31m-  btr_2 =	"mrqdw:0FB3Rm|miqdw:0FBA6mU",[m
[31m-  bts_2 =	"mrqdw:0FABRm|miqdw:0FBA5mU",[m
[31m-[m
[31m-  shld_3 =	"mriqdw:0FA4RmU|mrC/qq:0FA5Rm|mrC/dd:|mrC/ww:",[m
[31m-  shrd_3 =	"mriqdw:0FACRmU|mrC/qq:0FADRm|mrC/dd:|mrC/ww:",[m
[31m-[m
[31m-  rdtsc_0 =	"0F31", -- P1+[m
[31m-  rdpmc_0 =	"0F33", -- P6+[m
[31m-  cpuid_0 =	"0FA2", -- P1+[m
[31m-[m
[31m-  -- floating point ops[m
[31m-  fst_1 =	"ff:DDD0r|xd:D92m|xq:nDD2m",[m
[31m-  fstp_1 =	"ff:DDD8r|xd:D93m|xq:nDD3m|xt:DB7m",[m
[31m-  fld_1 =	"ff:D9C0r|xd:D90m|xq:nDD0m|xt:DB5m",[m
[31m-[m
[31m-  fpop_0 =	"DDD8", -- Alias for fstp st0.[m
[31m-[m
[31m-  fist_1 =	"xw:nDF2m|xd:DB2m",[m
[31m-  fistp_1 =	"xw:nDF3m|xd:DB3m|xq:nDF7m",[m
[31m-  fild_1 =	"xw:nDF0m|xd:DB0m|xq:nDF5m",[m
[31m-[m
[31m-  fxch_0 =	"D9C9",[m
[31m-  fxch_1 =	"ff:D9C8r",[m
[31m-  fxch_2 =	"fFf:D9C8r|Fff:D9C8R",[m
[31m-[m
[31m-  fucom_1 =	"ff:DDE0r",[m
[31m-  fucom_2 =	"Fff:DDE0R",[m
[31m-  fucomp_1 =	"ff:DDE8r",[m
[31m-  fucomp_2 =	"Fff:DDE8R",[m
[31m-  fucomi_1 =	"ff:DBE8r", -- P6+[m
[31m-  fucomi_2 =	"Fff:DBE8R", -- P6+[m
[31m-  fucomip_1 =	"ff:DFE8r", -- P6+[m
[31m-  fucomip_2 =	"Fff:DFE8R", -- P6+[m
[31m-  fcomi_1 =	"ff:DBF0r", -- P6+[m
[31m-  fcomi_2 =	"Fff:DBF0R", -- P6+[m
[31m-  fcomip_1 =	"ff:DFF0r", -- P6+[m
[31m-  fcomip_2 =	"Fff:DFF0R", -- P6+[m
[31m-  fucompp_0 =	"DAE9",[m
[31m-  fcompp_0 =	"DED9",[m
[31m-[m
[31m-  fldenv_1 =	"x.:D94m",[m
[31m-  fnstenv_1 =	"x.:D96m",[m
[31m-  fstenv_1 =	"x.:9BD96m",[m
[31m-  fldcw_1 =	"xw:nD95m",[m
[31m-  fstcw_1 =	"xw:n9BD97m",[m
[31m-  fnstcw_1 =	"xw:nD97m",[m
[31m-  fstsw_1 =	"Rw:n9BDFE0|xw:n9BDD7m",[m
[31m-  fnstsw_1 =	"Rw:nDFE0|xw:nDD7m",[m
[31m-  fclex_0 =	"9BDBE2",[m
[31m-  fnclex_0 =	"DBE2",[m
[31m-[m
[31m-  fnop_0 =	"D9D0",[m
[31m-  -- D9D1-D9DF: unassigned[m
[31m-[m
[31m-  fchs_0 =	"D9E0",[m
[31m-  fabs_0 =	"D9E1",[m
[31m-  -- D9E2: unassigned[m
[31m-  -- D9E3: unassigned[m
[31m-  ftst_0 =	"D9E4",[m
[31m-  fxam_0 =	"D9E5",[m
[31m-  -- D9E6: unassigned[m
[31m-  -- D9E7: unassigned[m
[31m-  fld1_0 =	"D9E8",[m
[31m-  fldl2t_0 =	"D9E9",[m
[31m-  fldl2e_0 =	"D9EA",[m
[31m-  fldpi_0 =	"D9EB",[m
[31m-  fldlg2_0 =	"D9EC",[m
[31m-  fldln2_0 =	"D9ED",[m
[31m-  fldz_0 =	"D9EE",[m
[31m-  -- D9EF: unassigned[m
[31m-[m
[31m-  f2xm1_0 =	"D9F0",[m
[31m-  fyl2x_0 =	"D9F1",[m
[31m-  fptan_0 =	"D9F2",[m
[31m-  fpatan_0 =	"D9F3",[m
[31m-  fxtract_0 =	"D9F4",[m
[31m-  fprem1_0 =	"D9F5",[m
[31m-  fdecstp_0 =	"D9F6",[m
[31m-  fincstp_0 =	"D9F7",[m
[31m-  fprem_0 =	"D9F8",[m
[31m-  fyl2xp1_0 =	"D9F9",[m
[31m-  fsqrt_0 =	"D9FA",[m
[31m-  fsincos_0 =	"D9FB",[m
[31m-  frndint_0 =	"D9FC",[m
[31m-  fscale_0 =	"D9FD",[m
[31m-  fsin_0 =	"D9FE",[m
[31m-  fcos_0 =	"D9FF",[m
[31m-[m
[31m-  -- SSE, SSE2[m
[31m-  andnpd_2 =	"rmo:660F55rM",[m
[31m-  andnps_2 =	"rmo:0F55rM",[m
[31m-  andpd_2 =	"rmo:660F54rM",[m
[31m-  andps_2 =	"rmo:0F54rM",[m
[31m-  clflush_1 =	"x.:0FAE7m",[m
[31m-  cmppd_3 =	"rmio:660FC2rMU",[m
[31m-  cmpps_3 =	"rmio:0FC2rMU",[m
[31m-  cmpsd_3 =	"rrio:F20FC2rMU|rxi/oq:",[m
[31m-  cmpss_3 =	"rrio:F30FC2rMU|rxi/od:",[m
[31m-  comisd_2 =	"rro:660F2FrM|rx/oq:",[m
[31m-  comiss_2 =	"rro:0F2FrM|rx/od:",[m
[31m-  cvtdq2pd_2 =	"rro:F30FE6rM|rx/oq:",[m
[31m-  cvtdq2ps_2 =	"rmo:0F5BrM",[m
[31m-  cvtpd2dq_2 =	"rmo:F20FE6rM",[m
[31m-  cvtpd2ps_2 =	"rmo:660F5ArM",[m
[31m-  cvtpi2pd_2 =	"rx/oq:660F2ArM",[m
[31m-  cvtpi2ps_2 =	"rx/oq:0F2ArM",[m
[31m-  cvtps2dq_2 =	"rmo:660F5BrM",[m
[31m-  cvtps2pd_2 =	"rro:0F5ArM|rx/oq:",[m
[31m-  cvtsd2si_2 =	"rr/do:F20F2DrM|rr/qo:|rx/dq:|rxq:",[m
[31m-  cvtsd2ss_2 =	"rro:F20F5ArM|rx/oq:",[m
[31m-  cvtsi2sd_2 =	"rm/od:F20F2ArM|rm/oq:F20F2ArXM",[m
[31m-  cvtsi2ss_2 =	"rm/od:F30F2ArM|rm/oq:F30F2ArXM",[m
[31m-  cvtss2sd_2 =	"rro:F30F5ArM|rx/od:",[m
[31m-  cvtss2si_2 =	"rr/do:F30F2DrM|rr/qo:|rxd:|rx/qd:",[m
[31m-  cvttpd2dq_2 =	"rmo:660FE6rM",[m
[31m-  cvttps2dq_2 =	"rmo:F30F5BrM",[m
[31m-  cvttsd2si_2 =	"rr/do:F20F2CrM|rr/qo:|rx/dq:|rxq:",[m
[31m-  cvttss2si_2 =	"rr/do:F30F2CrM|rr/qo:|rxd:|rx/qd:",[m
[31m-  fxsave_1 =	"x.:0FAE0m",[m
[31m-  fxrstor_1 =	"x.:0FAE1m",[m
[31m-  ldmxcsr_1 =	"xd:0FAE2m",[m
[31m-  lfence_0 =	"0FAEE8",[m
[31m-  maskmovdqu_2 = "rro:660FF7rM",[m
[31m-  mfence_0 =	"0FAEF0",[m
[31m-  movapd_2 =	"rmo:660F28rM|mro:660F29Rm",[m
[31m-  movaps_2 =	"rmo:0F28rM|mro:0F29Rm",[m
[31m-  movd_2 =	"rm/od:660F6ErM|rm/oq:660F6ErXM|mr/do:660F7ERm|mr/qo:",[m
[31m-  movdqa_2 =	"rmo:660F6FrM|mro:660F7FRm",[m
[31m-  movdqu_2 =	"rmo:F30F6FrM|mro:F30F7FRm",[m
[31m-  movhlps_2 =	"rro:0F12rM",[m
[31m-  movhpd_2 =	"rx/oq:660F16rM|xr/qo:n660F17Rm",[m
[31m-  movhps_2 =	"rx/oq:0F16rM|xr/qo:n0F17Rm",[m
[31m-  movlhps_2 =	"rro:0F16rM",[m
[31m-  movlpd_2 =	"rx/oq:660F12rM|xr/qo:n660F13Rm",[m
[31m-  movlps_2 =	"rx/oq:0F12rM|xr/qo:n0F13Rm",[m
[31m-  movmskpd_2 =	"rr/do:660F50rM",[m
[31m-  movmskps_2 =	"rr/do:0F50rM",[m
[31m-  movntdq_2 =	"xro:660FE7Rm",[m
[31m-  movnti_2 =	"xrqd:0FC3Rm",[m
[31m-  movntpd_2 =	"xro:660F2BRm",[m
[31m-  movntps_2 =	"xro:0F2BRm",[m
[31m-  movq_2 =	"rro:F30F7ErM|rx/oq:|xr/qo:n660FD6Rm",[m
[31m-  movsd_2 =	"rro:F20F10rM|rx/oq:|xr/qo:nF20F11Rm",[m
[31m-  movss_2 =	"rro:F30F10rM|rx/od:|xr/do:F30F11Rm",[m
[31m-  movupd_2 =	"rmo:660F10rM|mro:660F11Rm",[m
[31m-  movups_2 =	"rmo:0F10rM|mro:0F11Rm",[m
[31m-  orpd_2 =	"rmo:660F56rM",[m
[31m-  orps_2 =	"rmo:0F56rM",[m
[31m-  pause_0 =	"F390",[m
[31m-  pextrw_3 =	"rri/do:660FC5rMU|xri/wo:660F3A15nRmU", -- Mem op: SSE4.1 only.[m
[31m-  pinsrw_3 =	"rri/od:660FC4rMU|rxi/ow:",[m
[31m-  pmovmskb_2 =	"rr/do:660FD7rM",[m
[31m-  prefetchnta_1 = "xb:n0F180m",[m
[31m-  prefetcht0_1 = "xb:n0F181m",[m
[31m-  prefetcht1_1 = "xb:n0F182m",[m
[31m-  prefetcht2_1 = "xb:n0F183m",[m
[31m-  pshufd_3 =	"rmio:660F70rMU",[m
[31m-  pshufhw_3 =	"rmio:F30F70rMU",[m
[31m-  pshuflw_3 =	"rmio:F20F70rMU",[m
[31m-  pslld_2 =	"rmo:660FF2rM|rio:660F726mU",[m
[31m-  pslldq_2 =	"rio:660F737mU",[m
[31m-  psllq_2 =	"rmo:660FF3rM|rio:660F736mU",[m
[31m-  psllw_2 =	"rmo:660FF1rM|rio:660F716mU",[m
[31m-  psrad_2 =	"rmo:660FE2rM|rio:660F724mU",[m
[31m-  psraw_2 =	"rmo:660FE1rM|rio:660F714mU",[m
[31m-  psrld_2 =	"rmo:660FD2rM|rio:660F722mU",[m
[31m-  psrldq_2 =	"rio:660F733mU",[m
[31m-  psrlq_2 =	"rmo:660FD3rM|rio:660F732mU",[m
[31m-  psrlw_2 =	"rmo:660FD1rM|rio:660F712mU",[m
[31m-  rcpps_2 =	"rmo:0F53rM",[m
[31m-  rcpss_2 =	"rro:F30F53rM|rx/od:",[m
[31m-  rsqrtps_2 =	"rmo:0F52rM",[m
[31m-  rsqrtss_2 =	"rmo:F30F52rM",[m
[31m-  sfence_0 =	"0FAEF8",[m
[31m-  shufpd_3 =	"rmio:660FC6rMU",[m
[31m-  shufps_3 =	"rmio:0FC6rMU",[m
[31m-  stmxcsr_1 =   "xd:0FAE3m",[m
[31m-  ucomisd_2 =	"rro:660F2ErM|rx/oq:",[m
[31m-  ucomiss_2 =	"rro:0F2ErM|rx/od:",[m
[31m-  unpckhpd_2 =	"rmo:660F15rM",[m
[31m-  unpckhps_2 =	"rmo:0F15rM",[m
[31m-  unpcklpd_2 =	"rmo:660F14rM",[m
[31m-  unpcklps_2 =	"rmo:0F14rM",[m
[31m-  xorpd_2 =	"rmo:660F57rM",[m
[31m-  xorps_2 =	"rmo:0F57rM",[m
[31m-[m
[31m-  -- SSE3 ops[m
[31m-  fisttp_1 =	"xw:nDF1m|xd:DB1m|xq:nDD1m",[m
[31m-  addsubpd_2 =	"rmo:660FD0rM",[m
[31m-  addsubps_2 =	"rmo:F20FD0rM",[m
[31m-  haddpd_2 =	"rmo:660F7CrM",[m
[31m-  haddps_2 =	"rmo:F20F7CrM",[m
[31m-  hsubpd_2 =	"rmo:660F7DrM",[m
[31m-  hsubps_2 =	"rmo:F20F7DrM",[m
[31m-  lddqu_2 =	"rxo:F20FF0rM",[m
[31m-  movddup_2 =	"rmo:F20F12rM",[m
[31m-  movshdup_2 =	"rmo:F30F16rM",[m
[31m-  movsldup_2 =	"rmo:F30F12rM",[m
[31m-[m
[31m-  -- SSSE3 ops[m
[31m-  pabsb_2 =	"rmo:660F381CrM",[m
[31m-  pabsd_2 =	"rmo:660F381ErM",[m
[31m-  pabsw_2 =	"rmo:660F381DrM",[m
[31m-  palignr_3 =	"rmio:660F3A0FrMU",[m
[31m-  phaddd_2 =	"rmo:660F3802rM",[m
[31m-  phaddsw_2 =	"rmo:660F3803rM",[m
[31m-  phaddw_2 =	"rmo:660F3801rM",[m
[31m-  phsubd_2 =	"rmo:660F3806rM",[m
[31m-  phsubsw_2 =	"rmo:660F3807rM",[m
[31m-  phsubw_2 =	"rmo:660F3805rM",[m
[31m-  pmaddubsw_2 =	"rmo:660F3804rM",[m
[31m-  pmulhrsw_2 =	"rmo:660F380BrM",[m
[31m-  pshufb_2 =	"rmo:660F3800rM",[m
[31m-  psignb_2 =	"rmo:660F3808rM",[m
[31m-  psignd_2 =	"rmo:660F380ArM",[m
[31m-  psignw_2 =	"rmo:660F3809rM",[m
[31m-[m
[31m-  -- SSE4.1 ops[m
[31m-  blendpd_3 =	"rmio:660F3A0DrMU",[m
[31m-  blendps_3 =	"rmio:660F3A0CrMU",[m
[31m-  blendvpd_3 =	"rmRo:660F3815rM",[m
[31m-  blendvps_3 =	"rmRo:660F3814rM",[m
[31m-  dppd_3 =	"rmio:660F3A41rMU",[m
[31m-  dpps_3 =	"rmio:660F3A40rMU",[m
[31m-  extractps_3 =	"mri/do:660F3A17RmU|rri/qo:660F3A17RXmU",[m
[31m-  insertps_3 =	"rrio:660F3A41rMU|rxi/od:",[m
[31m-  movntdqa_2 =	"rxo:660F382ArM",[m
[31m-  mpsadbw_3 =	"rmio:660F3A42rMU",[m
[31m-  packusdw_2 =	"rmo:660F382BrM",[m
[31m-  pblendvb_3 =	"rmRo:660F3810rM",[m
[31m-  pblendw_3 =	"rmio:660F3A0ErMU",[m
[31m-  pcmpeqq_2 =	"rmo:660F3829rM",[m
[31m-  pextrb_3 =	"rri/do:660F3A14nRmU|rri/qo:|xri/bo:",[m
[31m-  pextrd_3 =	"mri/do:660F3A16RmU",[m
[31m-  pextrq_3 =	"mri/qo:660F3A16RmU",[m
[31m-  -- pextrw is SSE2, mem operand is SSE4.1 only[m
[31m-  phminposuw_2 = "rmo:660F3841rM",[m
[31m-  pinsrb_3 =	"rri/od:660F3A20nrMU|rxi/ob:",[m
[31m-  pinsrd_3 =	"rmi/od:660F3A22rMU",[m
[31m-  pinsrq_3 =	"rmi/oq:660F3A22rXMU",[m
[31m-  pmaxsb_2 =	"rmo:660F383CrM",[m
[31m-  pmaxsd_2 =	"rmo:660F383DrM",[m
[31m-  pmaxud_2 =	"rmo:660F383FrM",[m
[31m-  pmaxuw_2 =	"rmo:660F383ErM",[m
[31m-  pminsb_2 =	"rmo:660F3838rM",[m
[31m-  pminsd_2 =	"rmo:660F3839rM",[m
[31m-  pminud_2 =	"rmo:660F383BrM",[m
[31m-  pminuw_2 =	"rmo:660F383ArM",[m
[31m-  pmovsxbd_2 =	"rro:660F3821rM|rx/od:",[m
[31m-  pmovsxbq_2 =	"rro:660F3822rM|rx/ow:",[m
[31m-  pmovsxbw_2 =	"rro:660F3820rM|rx/oq:",[m
[31m-  pmovsxdq_2 =	"rro:660F3825rM|rx/oq:",[m
[31m-  pmovsxwd_2 =	"rro:660F3823rM|rx/oq:",[m
[31m-  pmovsxwq_2 =	"rro:660F3824rM|rx/od:",[m
[31m-  pmovzxbd_2 =	"rro:660F3831rM|rx/od:",[m
[31m-  pmovzxbq_2 =	"rro:660F3832rM|rx/ow:",[m
[31m-  pmovzxbw_2 =	"rro:660F3830rM|rx/oq:",[m
[31m-  pmovzxdq_2 =	"rro:660F3835rM|rx/oq:",[m
[31m-  pmovzxwd_2 =	"rro:660F3833rM|rx/oq:",[m
[31m-  pmovzxwq_2 =	"rro:660F3834rM|rx/od:",[m
[31m-  pmuldq_2 =	"rmo:660F3828rM",[m
[31m-  pmulld_2 =	"rmo:660F3840rM",[m
[31m-  ptest_2 =	"rmo:660F3817rM",[m
[31m-  roundpd_3 =	"rmio:660F3A09rMU",[m
[31m-  roundps_3 =	"rmio:660F3A08rMU",[m
[31m-  roundsd_3 =	"rrio:660F3A0BrMU|rxi/oq:",[m
[31m-  roundss_3 =	"rrio:660F3A0ArMU|rxi/od:",[m
[31m-[m
[31m-  -- SSE4.2 ops[m
[31m-  crc32_2 =	"rmqd:F20F38F1rM|rm/dw:66F20F38F1rM|rm/db:F20F38F0rM|rm/qb:",[m
[31m-  pcmpestri_3 =	"rmio:660F3A61rMU",[m
[31m-  pcmpestrm_3 =	"rmio:660F3A60rMU",[m
[31m-  pcmpgtq_2 =	"rmo:660F3837rM",[m
[31m-  pcmpistri_3 =	"rmio:660F3A63rMU",[m
[31m-  pcmpistrm_3 =	"rmio:660F3A62rMU",[m
[31m-  popcnt_2 =	"rmqdw:F30FB8rM",[m
[31m-[m
[31m-  -- SSE4a[m
[31m-  extrq_2 =	"rro:660F79rM",[m
[31m-  extrq_3 =	"riio:660F780mUU",[m
[31m-  insertq_2 =	"rro:F20F79rM",[m
[31m-  insertq_4 =	"rriio:F20F78rMUU",[m
[31m-  lzcnt_2 =	"rmqdw:F30FBDrM",[m
[31m-  movntsd_2 =	"xr/qo:nF20F2BRm",[m
[31m-  movntss_2 =	"xr/do:F30F2BRm",[m
[31m-  -- popcnt is also in SSE4.2[m
[31m-[m
[31m-  -- AES-NI[m
[31m-  aesdec_2 =	"rmo:660F38DErM",[m
[31m-  aesdeclast_2 = "rmo:660F38DFrM",[m
[31m-  aesenc_2 =	"rmo:660F38DCrM",[m
[31m-  aesenclast_2 = "rmo:660F38DDrM",[m
[31m-  aesimc_2 =	"rmo:660F38DBrM",[m
[31m-  aeskeygenassist_3 = "rmio:660F3ADFrMU",[m
[31m-  pclmulqdq_3 =	"rmio:660F3A44rMU",[m
[31m-[m
[31m-   -- AVX FP ops[m
[31m-  vaddsubpd_3 =	"rrmoy:660FVD0rM",[m
[31m-  vaddsubps_3 =	"rrmoy:F20FVD0rM",[m
[31m-  vandpd_3 =	"rrmoy:660FV54rM",[m
[31m-  vandps_3 =	"rrmoy:0FV54rM",[m
[31m-  vandnpd_3 =	"rrmoy:660FV55rM",[m
[31m-  vandnps_3 =	"rrmoy:0FV55rM",[m
[31m-  vblendpd_4 =	"rrmioy:660F3AV0DrMU",[m
[31m-  vblendps_4 =	"rrmioy:660F3AV0CrMU",[m
[31m-  vblendvpd_4 =	"rrmroy:660F3AV4BrMs",[m
[31m-  vblendvps_4 =	"rrmroy:660F3AV4ArMs",[m
[31m-  vbroadcastf128_2 = "rx/yo:660F38u1ArM",[m
[31m-  vcmppd_4 =	"rrmioy:660FVC2rMU",[m
[31m-  vcmpps_4 =	"rrmioy:0FVC2rMU",[m
[31m-  vcmpsd_4 =	"rrrio:F20FVC2rMU|rrxi/ooq:",[m
[31m-  vcmpss_4 =	"rrrio:F30FVC2rMU|rrxi/ood:",[m
[31m-  vcomisd_2 =	"rro:660Fu2FrM|rx/oq:",[m
[31m-  vcomiss_2 =	"rro:0Fu2FrM|rx/od:",[m
[31m-  vcvtdq2pd_2 =	"rro:F30FuE6rM|rx/oq:|rm/yo:",[m
[31m-  vcvtdq2ps_2 =	"rmoy:0Fu5BrM",[m
[31m-  vcvtpd2dq_2 =	"rmoy:F20FuE6rM",[m
[31m-  vcvtpd2ps_2 =	"rmoy:660Fu5ArM",[m
[31m-  vcvtps2dq_2 =	"rmoy:660Fu5BrM",[m
[31m-  vcvtps2pd_2 =	"rro:0Fu5ArM|rx/oq:|rm/yo:",[m
[31m-  vcvtsd2si_2 =	"rr/do:F20Fu2DrM|rx/dq:|rr/qo:|rxq:",[m
[31m-  vcvtsd2ss_3 =	"rrro:F20FV5ArM|rrx/ooq:",[m
[31m-  vcvtsi2sd_3 =	"rrm/ood:F20FV2ArM|rrm/ooq:F20FVX2ArM",[m
[31m-  vcvtsi2ss_3 =	"rrm/ood:F30FV2ArM|rrm/ooq:F30FVX2ArM",[m
[31m-  vcvtss2sd_3 =	"rrro:F30FV5ArM|rrx/ood:",[m
[31m-  vcvtss2si_2 =	"rr/do:F30Fu2DrM|rxd:|rr/qo:|rx/qd:",[m
[31m-  vcvttpd2dq_2 = "rmo:660FuE6rM|rm/oy:660FuLE6rM",[m
[31m-  vcvttps2dq_2 = "rmoy:F30Fu5BrM",[m
[31m-  vcvttsd2si_2 = "rr/do:F20Fu2CrM|rx/dq:|rr/qo:|rxq:",[m
[31m-  vcvttss2si_2 = "rr/do:F30Fu2CrM|rxd:|rr/qo:|rx/qd:",[m
[31m-  vdppd_4 =	"rrmio:660F3AV41rMU",[m
[31m-  vdpps_4 =	"rrmioy:660F3AV40rMU",[m
[31m-  vextractf128_3 = "mri/oy:660F3AuL19RmU",[m
[31m-  vextractps_3 = "mri/do:660F3Au17RmU",[m
[31m-  vhaddpd_3 =	"rrmoy:660FV7CrM",[m
[31m-  vhaddps_3 =	"rrmoy:F20FV7CrM",[m
[31m-  vhsubpd_3 =	"rrmoy:660FV7DrM",[m
[31m-  vhsubps_3 =	"rrmoy:F20FV7DrM",[m
[31m-  vinsertf128_4 = "rrmi/yyo:660F3AV18rMU",[m
[31m-  vinsertps_4 =	"rrrio:660F3AV21rMU|rrxi/ood:",[m
[31m-  vldmxcsr_1 =	"xd:0FuAE2m",[m
[31m-  vmaskmovps_3 = "rrxoy:660F38V2CrM|xrroy:660F38V2ERm",[m
[31m-  vmaskmovpd_3 = "rrxoy:660F38V2DrM|xrroy:660F38V2FRm",[m
[31m-  vmovapd_2 =	"rmoy:660Fu28rM|mroy:660Fu29Rm",[m
[31m-  vmovaps_2 =	"rmoy:0Fu28rM|mroy:0Fu29Rm",[m
[31m-  vmovd_2 =	"rm/od:660Fu6ErM|rm/oq:660FuX6ErM|mr/do:660Fu7ERm|mr/qo:",[m
[31m-  vmovq_2 =	"rro:F30Fu7ErM|rx/oq:|xr/qo:660FuD6Rm",[m
[31m-  vmovddup_2 =	"rmy:F20Fu12rM|rro:|rx/oq:",[m
[31m-  vmovhlps_3 =	"rrro:0FV12rM",[m
[31m-  vmovhpd_2 =	"xr/qo:660Fu17Rm",[m
[31m-  vmovhpd_3 =	"rrx/ooq:660FV16rM",[m
[31m-  vmovhps_2 =	"xr/qo:0Fu17Rm",[m
[31m-  vmovhps_3 =	"rrx/ooq:0FV16rM",[m
[31m-  vmovlhps_3 =	"rrro:0FV16rM",[m
[31m-  vmovlpd_2 =	"xr/qo:660Fu13Rm",[m
[31m-  vmovlpd_3 =	"rrx/ooq:660FV12rM",[m
[31m-  vmovlps_2 =	"xr/qo:0Fu13Rm",[m
[31m-  vmovlps_3 =	"rrx/ooq:0FV12rM",[m
[31m-  vmovmskpd_2 =	"rr/do:660Fu50rM|rr/dy:660FuL50rM",[m
[31m-  vmovmskps_2 =	"rr/do:0Fu50rM|rr/dy:0FuL50rM",[m
[31m-  vmovntpd_2 =	"xroy:660Fu2BRm",[m
[31m-  vmovntps_2 =	"xroy:0Fu2BRm",[m
[31m-  vmovsd_2 =	"rx/oq:F20Fu10rM|xr/qo:F20Fu11Rm",[m
[31m-  vmovsd_3 =	"rrro:F20FV10rM",[m
[31m-  vmovshdup_2 =	"rmoy:F30Fu16rM",[m
[31m-  vmovsldup_2 =	"rmoy:F30Fu12rM",[m
[31m-  vmovss_2 =	"rx/od:F30Fu10rM|xr/do:F30Fu11Rm",[m
[31m-  vmovss_3 =	"rrro:F30FV10rM",[m
[31m-  vmovupd_2 =	"rmoy:660Fu10rM|mroy:660Fu11Rm",[m
[31m-  vmovups_2 =	"rmoy:0Fu10rM|mroy:0Fu11Rm",[m
[31m-  vorpd_3 =	"rrmoy:660FV56rM",[m
[31m-  vorps_3 =	"rrmoy:0FV56rM",[m
[31m-  vpermilpd_3 =	"rrmoy:660F38V0DrM|rmioy:660F3Au05rMU",[m
[31m-  vpermilps_3 =	"rrmoy:660F38V0CrM|rmioy:660F3Au04rMU",[m
[31m-  vperm2f128_4 = "rrmiy:660F3AV06rMU",[m
[31m-  vptestpd_2 =	"rmoy:660F38u0FrM",[m
[31m-  vptestps_2 =	"rmoy:660F38u0ErM",[m
[31m-  vrcpps_2 =	"rmoy:0Fu53rM",[m
[31m-  vrcpss_3 =	"rrro:F30FV53rM|rrx/ood:",[m
[31m-  vrsqrtps_2 =	"rmoy:0Fu52rM",[m
[31m-  vrsqrtss_3 =	"rrro:F30FV52rM|rrx/ood:",[m
[31m-  vroundpd_3 =	"rmioy:660F3AV09rMU",[m
[31m-  vroundps_3 =	"rmioy:660F3AV08rMU",[m
[31m-  vroundsd_4 =	"rrrio:660F3AV0BrMU|rrxi/ooq:",[m
[31m-  vroundss_4 =	"rrrio:660F3AV0ArMU|rrxi/ood:",[m
[31m-  vshufpd_4 =	"rrmioy:660FVC6rMU",[m
[31m-  vshufps_4 =	"rrmioy:0FVC6rMU",[m
[31m-  vsqrtps_2 =	"rmoy:0Fu51rM",[m
[31m-  vsqrtss_2 =	"rro:F30Fu51rM|rx/od:",[m
[31m-  vsqrtpd_2 =	"rmoy:660Fu51rM",[m
[31m-  vsqrtsd_2 =	"rro:F20Fu51rM|rx/oq:",[m
[31m-  vstmxcsr_1 =	"xd:0FuAE3m",[m
[31m-  vucomisd_2 =	"rro:660Fu2ErM|rx/oq:",[m
[31m-  vucomiss_2 =	"rro:0Fu2ErM|rx/od:",[m
[31m-  vunpckhpd_3 =	"rrmoy:660FV15rM",[m
[31m-  vunpckhps_3 =	"rrmoy:0FV15rM",[m
[31m-  vunpcklpd_3 =	"rrmoy:660FV14rM",[m
[31m-  vunpcklps_3 =	"rrmoy:0FV14rM",[m
[31m-  vxorpd_3 =	"rrmoy:660FV57rM",[m
[31m-  vxorps_3 =	"rrmoy:0FV57rM",[m
[31m-  vzeroall_0 =	"0FuL77",[m
[31m-  vzeroupper_0 = "0Fu77",[m
[31m-[m
[31m-  -- AVX2 FP ops[m
[31m-  vbroadcastss_2 = "rx/od:660F38u18rM|rx/yd:|rro:|rr/yo:",[m
[31m-  vbroadcastsd_2 = "rx/yq:660F38u19rM|rr/yo:",[m
[31m-  -- *vgather* (!vsib)[m
[31m-  vpermpd_3 =	"rmiy:660F3AuX01rMU",[m
[31m-  vpermps_3 =	"rrmy:660F38V16rM",[m
[31m-[m
[31m-  -- AVX, AVX2 integer ops[m
[31m-  -- In general, xmm requires AVX, ymm requires AVX2.[m
[31m-  vaesdec_3 =  "rrmo:660F38VDErM",[m
[31m-  vaesdeclast_3 = "rrmo:660F38VDFrM",[m
[31m-  vaesenc_3 =  "rrmo:660F38VDCrM",[m
[31m-  vaesenclast_3 = "rrmo:660F38VDDrM",[m
[31m-  vaesimc_2 =  "rmo:660F38uDBrM",[m
[31m-  vaeskeygenassist_3 = "rmio:660F3AuDFrMU",[m
[31m-  vlddqu_2 =	"rxoy:F20FuF0rM",[m
[31m-  vmaskmovdqu_2 = "rro:660FuF7rM",[m
[31m-  vmovdqa_2 =	"rmoy:660Fu6FrM|mroy:660Fu7FRm",[m
[31m-  vmovdqu_2 =	"rmoy:F30Fu6FrM|mroy:F30Fu7FRm",[m
[31m-  vmovntdq_2 =	"xroy:660FuE7Rm",[m
[31m-  vmovntdqa_2 =	"rxoy:660F38u2ArM",[m
[31m-  vmpsadbw_4 =	"rrmioy:660F3AV42rMU",[m
[31m-  vpabsb_2 =	"rmoy:660F38u1CrM",[m
[31m-  vpabsd_2 =	"rmoy:660F38u1ErM",[m
[31m-  vpabsw_2 =	"rmoy:660F38u1DrM",[m
[31m-  vpackusdw_3 =	"rrmoy:660F38V2BrM",[m
[31m-  vpalignr_4 =	"rrmioy:660F3AV0FrMU",[m
[31m-  vpblendvb_4 =	"rrmroy:660F3AV4CrMs",[m
[31m-  vpblendw_4 =	"rrmioy:660F3AV0ErMU",[m
[31m-  vpclmulqdq_4 = "rrmio:660F3AV44rMU",[m
[31m-  vpcmpeqq_3 =	"rrmoy:660F38V29rM",[m
[31m-  vpcmpestri_3 = "rmio:660F3Au61rMU",[m
[31m-  vpcmpestrm_3 = "rmio:660F3Au60rMU",[m
[31m-  vpcmpgtq_3 =	"rrmoy:660F38V37rM",[m
[31m-  vpcmpistri_3 = "rmio:660F3Au63rMU",[m
[31m-  vpcmpistrm_3 = "rmio:660F3Au62rMU",[m
[31m-  vpextrb_3 =	"rri/do:660F3Au14nRmU|rri/qo:|xri/bo:",[m
[31m-  vpextrw_3 =	"rri/do:660FuC5rMU|xri/wo:660F3Au15nRmU",[m
[31m-  vpextrd_3 =	"mri/do:660F3Au16RmU",[m
[31m-  vpextrq_3 =	"mri/qo:660F3Au16RmU",[m
[31m-  vphaddw_3 =	"rrmoy:660F38V01rM",[m
[31m-  vphaddd_3 =	"rrmoy:660F38V02rM",[m
[31m-  vphaddsw_3 =	"rrmoy:660F38V03rM",[m
[31m-  vphminposuw_2 = "rmo:660F38u41rM",[m
[31m-  vphsubw_3 =	"rrmoy:660F38V05rM",[m
[31m-  vphsubd_3 =	"rrmoy:660F38V06rM",[m
[31m-  vphsubsw_3 =	"rrmoy:660F38V07rM",[m
[31m-  vpinsrb_4 =	"rrri/ood:660F3AV20rMU|rrxi/oob:",[m
[31m-  vpinsrw_4 =	"rrri/ood:660FVC4rMU|rrxi/oow:",[m
[31m-  vpinsrd_4 =	"rrmi/ood:660F3AV22rMU",[m
[31m-  vpinsrq_4 =	"rrmi/ooq:660F3AVX22rMU",[m
[31m-  vpmaddubsw_3 = "rrmoy:660F38V04rM",[m
[31m-  vpmaxsb_3 =	"rrmoy:660F38V3CrM",[m
[31m-  vpmaxsd_3 =	"rrmoy:660F38V3DrM",[m
[31m-  vpmaxuw_3 =	"rrmoy:660F38V3ErM",[m
[31m-  vpmaxud_3 =	"rrmoy:660F38V3FrM",[m
[31m-  vpminsb_3 =	"rrmoy:660F38V38rM",[m
[31m-  vpminsd_3 =	"rrmoy:660F38V39rM",[m
[31m-  vpminuw_3 =	"rrmoy:660F38V3ArM",[m
[31m-  vpminud_3 =	"rrmoy:660F38V3BrM",[m
[31m-  vpmovmskb_2 =	"rr/do:660FuD7rM|rr/dy:660FuLD7rM",[m
[31m-  vpmovsxbw_2 =	"rroy:660F38u20rM|rx/oq:|rx/yo:",[m
[31m-  vpmovsxbd_2 =	"rroy:660F38u21rM|rx/od:|rx/yq:",[m
[31m-  vpmovsxbq_2 =	"rroy:660F38u22rM|rx/ow:|rx/yd:",[m
[31m-  vpmovsxwd_2 =	"rroy:660F38u23rM|rx/oq:|rx/yo:",[m
[31m-  vpmovsxwq_2 =	"rroy:660F38u24rM|rx/od:|rx/yq:",[m
[31m-  vpmovsxdq_2 =	"rroy:660F38u25rM|rx/oq:|rx/yo:",[m
[31m-  vpmovzxbw_2 =	"rroy:660F38u30rM|rx/oq:|rx/yo:",[m
[31m-  vpmovzxbd_2 =	"rroy:660F38u31rM|rx/od:|rx/yq:",[m
[31m-  vpmovzxbq_2 =	"rroy:660F38u32rM|rx/ow:|rx/yd:",[m
[31m-  vpmovzxwd_2 =	"rroy:660F38u33rM|rx/oq:|rx/yo:",[m
[31m-  vpmovzxwq_2 =	"rroy:660F38u34rM|rx/od:|rx/yq:",[m
[31m-  vpmovzxdq_2 =	"rroy:660F38u35rM|rx/oq:|rx/yo:",[m
[31m-  vpmuldq_3 =	"rrmoy:660F38V28rM",[m
[31m-  vpmulhrsw_3 =	"rrmoy:660F38V0BrM",[m
[31m-  vpmulld_3 =	"rrmoy:660F38V40rM",[m
[31m-  vpshufb_3 =	"rrmoy:660F38V00rM",[m
[31m-  vpshufd_3 =	"rmioy:660Fu70rMU",[m
[31m-  vpshufhw_3 =	"rmioy:F30Fu70rMU",[m
[31m-  vpshuflw_3 =	"rmioy:F20Fu70rMU",[m
[31m-  vpsignb_3 =	"rrmoy:660F38V08rM",[m
[31m-  vpsignw_3 =	"rrmoy:660F38V09rM",[m
[31m-  vpsignd_3 =	"rrmoy:660F38V0ArM",[m
[31m-  vpslldq_3 =	"rrioy:660Fv737mU",[m
[31m-  vpsllw_3 =	"rrmoy:660FVF1rM|rrioy:660Fv716mU",[m
[31m-  vpslld_3 =	"rrmoy:660FVF2rM|rrioy:660Fv726mU",[m
[31m-  vpsllq_3 =	"rrmoy:660FVF3rM|rrioy:660Fv736mU",[m
[31m-  vpsraw_3 =	"rrmoy:660FVE1rM|rrioy:660Fv714mU",[m
[31m-  vpsrad_3 =	"rrmoy:660FVE2rM|rrioy:660Fv724mU",[m
[31m-  vpsrldq_3 =	"rrioy:660Fv733mU",[m
[31m-  vpsrlw_3 =	"rrmoy:660FVD1rM|rrioy:660Fv712mU",[m
[31m-  vpsrld_3 =	"rrmoy:660FVD2rM|rrioy:660Fv722mU",[m
[31m-  vpsrlq_3 =	"rrmoy:660FVD3rM|rrioy:660Fv732mU",[m
[31m-  vptest_2 =	"rmoy:660F38u17rM",[m
[31m-[m
[31m-  -- AVX2 integer ops[m
[31m-  vbroadcasti128_2 = "rx/yo:660F38u5ArM",[m
[31m-  vinserti128_4 = "rrmi/yyo:660F3AV38rMU",[m
[31m-  vextracti128_3 = "mri/oy:660F3AuL39RmU",[m
[31m-  vpblendd_4 =	"rrmioy:660F3AV02rMU",[m
[31m-  vpbroadcastb_2 = "rro:660F38u78rM|rx/ob:|rr/yo:|rx/yb:",[m
[31m-  vpbroadcastw_2 = "rro:660F38u79rM|rx/ow:|rr/yo:|rx/yw:",[m
[31m-  vpbroadcastd_2 = "rro:660F38u58rM|rx/od:|rr/yo:|rx/yd:",[m
[31m-  vpbroadcastq_2 = "rro:660F38u59rM|rx/oq:|rr/yo:|rx/yq:",[m
[31m-  vpermd_3 =	"rrmy:660F38V36rM",[m
[31m-  vpermq_3 =	"rmiy:660F3AuX00rMU",[m
[31m-  -- *vpgather* (!vsib)[m
[31m-  vperm2i128_4 = "rrmiy:660F3AV46rMU",[m
[31m-  vpmaskmovd_3 = "rrxoy:660F38V8CrM|xrroy:660F38V8ERm",[m
[31m-  vpmaskmovq_3 = "rrxoy:660F38VX8CrM|xrroy:660F38VX8ERm",[m
[31m-  vpsllvd_3 =	"rrmoy:660F38V47rM",[m
[31m-  vpsllvq_3 =	"rrmoy:660F38VX47rM",[m
[31m-  vpsravd_3 =	"rrmoy:660F38V46rM",[m
[31m-  vpsrlvd_3 =	"rrmoy:660F38V45rM",[m
[31m-  vpsrlvq_3 =	"rrmoy:660F38VX45rM",[m
[31m-[m
[31m-  -- Intel ADX[m
[31m-  adcx_2 =	"rmqd:660F38F6rM",[m
[31m-  adox_2 =	"rmqd:F30F38F6rM",[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Arithmetic ops.[m
[31m-for name,n in pairs{ add = 0, ["or"] = 1, adc = 2, sbb = 3,[m
[31m-		     ["and"] = 4, sub = 5, xor = 6, cmp = 7 } do[m
[31m-  local n8 = shl(n, 3)[m
[31m-  map_op[name.."_2"] = format([m
[31m-    "mr:%02XRm|rm:%02XrM|mI1qdw:81%XmI|mS1qdw:83%XmS|Ri1qdwb:%02Xri|mi1qdwb:81%Xmi",[m
[31m-    1+n8, 3+n8, n, n, 5+n8, n)[m
[31m-end[m
[31m-[m
[31m--- Shift ops.[m
[31m-for name,n in pairs{ rol = 0, ror = 1, rcl = 2, rcr = 3,[m
[31m-		     shl = 4, shr = 5,          sar = 7, sal = 4 } do[m
[31m-  map_op[name.."_2"] = format("m1:D1%Xm|mC1qdwb:D3%Xm|mi:C1%XmU", n, n, n)[m
[31m-end[m
[31m-[m
[31m--- Conditional ops.[m
[31m-for cc,n in pairs(map_cc) do[m
[31m-  map_op["j"..cc.."_1"] = format("J.:n0F8%XJ", n) -- short: 7%X[m
[31m-  map_op["set"..cc.."_1"] = format("mb:n0F9%X2m", n)[m
[31m-  map_op["cmov"..cc.."_2"] = format("rmqdw:0F4%XrM", n) -- P6+[m
[31m-end[m
[31m-[m
[31m--- FP arithmetic ops.[m
[31m-for name,n in pairs{ add = 0, mul = 1, com = 2, comp = 3,[m
[31m-		     sub = 4, subr = 5, div = 6, divr = 7 } do[m
[31m-  local nc = 0xc0 + shl(n, 3)[m
[31m-  local nr = nc + (n < 4 and 0 or (n % 2 == 0 and 8 or -8))[m
[31m-  local fn = "f"..name[m
[31m-  map_op[fn.."_1"] = format("ff:D8%02Xr|xd:D8%Xm|xq:nDC%Xm", nc, n, n)[m
[31m-  if n == 2 or n == 3 then[m
[31m-    map_op[fn.."_2"] = format("Fff:D8%02XR|Fx2d:D8%XM|Fx2q:nDC%XM", nc, n, n)[m
[31m-  else[m
[31m-    map_op[fn.."_2"] = format("Fff:D8%02XR|fFf:DC%02Xr|Fx2d:D8%XM|Fx2q:nDC%XM", nc, nr, n, n)[m
[31m-    map_op[fn.."p_1"] = format("ff:DE%02Xr", nr)[m
[31m-    map_op[fn.."p_2"] = format("fFf:DE%02Xr", nr)[m
[31m-  end[m
[31m-  map_op["fi"..name.."_1"] = format("xd:DA%Xm|xw:nDE%Xm", n, n)[m
[31m-end[m
[31m-[m
[31m--- FP conditional moves.[m
[31m-for cc,n in pairs{ b=0, e=1, be=2, u=3, nb=4, ne=5, nbe=6, nu=7 } do[m
[31m-  local nc = 0xdac0 + shl(band(n, 3), 3) + shl(band(n, 4), 6)[m
[31m-  map_op["fcmov"..cc.."_1"] = format("ff:%04Xr", nc) -- P6+[m
[31m-  map_op["fcmov"..cc.."_2"] = format("Fff:%04XR", nc) -- P6+[m
[31m-end[m
[31m-[m
[31m--- SSE / AVX FP arithmetic ops.[m
[31m-for name,n in pairs{ sqrt = 1, add = 8, mul = 9,[m
[31m-		     sub = 12, min = 13, div = 14, max = 15 } do[m
[31m-  map_op[name.."ps_2"] = format("rmo:0F5%XrM", n)[m
[31m-  map_op[name.."ss_2"] = format("rro:F30F5%XrM|rx/od:", n)[m
[31m-  map_op[name.."pd_2"] = format("rmo:660F5%XrM", n)[m
[31m-  map_op[name.."sd_2"] = format("rro:F20F5%XrM|rx/oq:", n)[m
[31m-  if n ~= 1 then[m
[31m-    map_op["v"..name.."ps_3"] = format("rrmoy:0FV5%XrM", n)[m
[31m-    map_op["v"..name.."ss_3"] = format("rrro:F30FV5%XrM|rrx/ood:", n)[m
[31m-    map_op["v"..name.."pd_3"] = format("rrmoy:660FV5%XrM", n)[m
[31m-    map_op["v"..name.."sd_3"] = format("rrro:F20FV5%XrM|rrx/ooq:", n)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- SSE2 / AVX / AVX2 integer arithmetic ops (66 0F leaf).[m
[31m-for name,n in pairs{[m
[31m-  paddb = 0xFC, paddw = 0xFD, paddd = 0xFE, paddq = 0xD4,[m
[31m-  paddsb = 0xEC, paddsw = 0xED, packssdw = 0x6B,[m
[31m-  packsswb = 0x63, packuswb = 0x67, paddusb = 0xDC,[m
[31m-  paddusw = 0xDD, pand = 0xDB, pandn = 0xDF, pavgb = 0xE0,[m
[31m-  pavgw = 0xE3, pcmpeqb = 0x74, pcmpeqd = 0x76,[m
[31m-  pcmpeqw = 0x75, pcmpgtb = 0x64, pcmpgtd = 0x66,[m
[31m-  pcmpgtw = 0x65, pmaddwd = 0xF5, pmaxsw = 0xEE,[m
[31m-  pmaxub = 0xDE, pminsw = 0xEA, pminub = 0xDA,[m
[31m-  pmulhuw = 0xE4, pmulhw = 0xE5, pmullw = 0xD5,[m
[31m-  pmuludq = 0xF4, por = 0xEB, psadbw = 0xF6, psubb = 0xF8,[m
[31m-  psubw = 0xF9, psubd = 0xFA, psubq = 0xFB, psubsb = 0xE8,[m
[31m-  psubsw = 0xE9, psubusb = 0xD8, psubusw = 0xD9,[m
[31m-  punpckhbw = 0x68, punpckhwd = 0x69, punpckhdq = 0x6A,[m
[31m-  punpckhqdq = 0x6D, punpcklbw = 0x60, punpcklwd = 0x61,[m
[31m-  punpckldq = 0x62, punpcklqdq = 0x6C, pxor = 0xEF[m
[31m-} do[m
[31m-  map_op[name.."_2"] = format("rmo:660F%02XrM", n)[m
[31m-  map_op["v"..name.."_3"] = format("rrmoy:660FV%02XrM", n)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_vexarg = { u = false, v = 1, V = 2 }[m
[31m-[m
[31m--- Process pattern string.[m
[31m-local function dopattern(pat, args, sz, op, needrex)[m
[31m-  local digit, addin, vex[m
[31m-  local opcode = 0[m
[31m-  local szov = sz[m
[31m-  local narg = 1[m
[31m-  local rex = 0[m
[31m-[m
[31m-  -- Limit number of section buffer positions used by a single dasm_put().[m
[31m-  -- A single opcode needs a maximum of 6 positions.[m
[31m-  if secpos+6 > maxsecpos then wflush() end[m
[31m-[m
[31m-  -- Process each character.[m
[31m-  for c in gmatch(pat.."|", ".") do[m
[31m-    if match(c, "%x") then	-- Hex digit.[m
[31m-      digit = byte(c) - 48[m
[31m-      if digit > 48 then digit = digit - 39[m
[31m-      elseif digit > 16 then digit = digit - 7 end[m
[31m-      opcode = opcode*16 + digit[m
[31m-      addin = nil[m
[31m-    elseif c == "n" then	-- Disable operand size mods for opcode.[m
[31m-      szov = nil[m
[31m-    elseif c == "X" then	-- Force REX.W.[m
[31m-      rex = 8[m
[31m-    elseif c == "L" then	-- Force VEX.L.[m
[31m-      vex.l = true[m
[31m-    elseif c == "r" then	-- Merge 1st operand regno. into opcode.[m
[31m-      addin = args[1]; opcode = opcode + (addin.reg % 8)[m
[31m-      if narg < 2 then narg = 2 end[m
[31m-    elseif c == "R" then	-- Merge 2nd operand regno. into opcode.[m
[31m-      addin = args[2]; opcode = opcode + (addin.reg % 8)[m
[31m-      narg = 3[m
[31m-    elseif c == "m" or c == "M" then	-- Encode ModRM/SIB.[m
[31m-      local s[m
[31m-      if addin then[m
[31m-	s = addin.reg[m
[31m-	opcode = opcode - band(s, 7)	-- Undo regno opcode merge.[m
[31m-      else[m
[31m-	s = band(opcode, 15)	-- Undo last digit.[m
[31m-	opcode = shr(opcode, 4)[m
[31m-      end[m
[31m-      local nn = c == "m" and 1 or 2[m
[31m-      local t = args[nn][m
[31m-      if narg <= nn then narg = nn + 1 end[m
[31m-      if szov == "q" and rex == 0 then rex = rex + 8 end[m
[31m-      if t.reg and t.reg > 7 then rex = rex + 1 end[m
[31m-      if t.xreg and t.xreg > 7 then rex = rex + 2 end[m
[31m-      if s > 7 then rex = rex + 4 end[m
[31m-      if needrex then rex = rex + 16 end[m
[31m-      local psz, sk = wputop(szov, opcode, rex, vex, s < 0, t.vreg or t.vxreg)[m
[31m-      opcode = nil[m
[31m-      local imark = sub(pat, -1) -- Force a mark (ugly).[m
[31m-      -- Put ModRM/SIB with regno/last digit as spare.[m
[31m-      wputmrmsib(t, imark, s, addin and addin.vreg, psz, sk)[m
[31m-      addin = nil[m
[31m-    elseif map_vexarg[c] ~= nil then -- Encode using VEX prefix[m
[31m-      local b = band(opcode, 255); opcode = shr(opcode, 8)[m
[31m-      local m = 1[m
[31m-      if b == 0x38 then m = 2[m
[31m-      elseif b == 0x3a then m = 3 end[m
[31m-      if m ~= 1 then b = band(opcode, 255); opcode = shr(opcode, 8) end[m
[31m-      if b ~= 0x0f then[m
[31m-	werror("expected `0F', `0F38', or `0F3A' to precede `"..c..[m
[31m-	  "' in pattern `"..pat.."' for `"..op.."'")[m
[31m-      end[m
[31m-      local v = map_vexarg[c][m
[31m-      if v then v = remove(args, v) end[m
[31m-      b = band(opcode, 255)[m
[31m-      local p = 0[m
[31m-      if b == 0x66 then p = 1[m
[31m-      elseif b == 0xf3 then p = 2[m
[31m-      elseif b == 0xf2 then p = 3 end[m
[31m-      if p ~= 0 then opcode = shr(opcode, 8) end[m
[31m-      if opcode ~= 0 then wputop(nil, opcode, 0); opcode = 0 end[m
[31m-      vex = { m = m, p = p, v = v }[m
[31m-    else[m
[31m-      if opcode then -- Flush opcode.[m
[31m-	if szov == "q" and rex == 0 then rex = rex + 8 end[m
[31m-	if needrex then rex = rex + 16 end[m
[31m-	if addin and addin.reg == -1 then[m
[31m-	  local psz, sk = wputop(szov, opcode - 7, rex, vex, true)[m
[31m-	  wvreg("opcode", addin.vreg, psz, sk)[m
[31m-	else[m
[31m-	  if addin and addin.reg > 7 then rex = rex + 1 end[m
[31m-	  wputop(szov, opcode, rex, vex)[m
[31m-	end[m
[31m-	opcode = nil[m
[31m-      end[m
[31m-      if c == "|" then break end[m
[31m-      if c == "o" then -- Offset (pure 32 bit displacement).[m
[31m-	wputdarg(args[1].disp); if narg < 2 then narg = 2 end[m
[31m-      elseif c == "O" then[m
[31m-	wputdarg(args[2].disp); narg = 3[m
[31m-      else[m
[31m-	-- Anything else is an immediate operand.[m
[31m-	local a = args[narg][m
[31m-	narg = narg + 1[m
[31m-	local mode, imm = a.mode, a.imm[m
[31m-	if mode == "iJ" and not match("iIJ", c) then[m
[31m-	  werror("bad operand size for label")[m
[31m-	end[m
[31m-	if c == "S" then[m
[31m-	  wputsbarg(imm)[m
[31m-	elseif c == "U" then[m
[31m-	  wputbarg(imm)[m
[31m-	elseif c == "W" then[m
[31m-	  wputwarg(imm)[m
[31m-	elseif c == "i" or c == "I" then[m
[31m-	  if mode == "iJ" then[m
[31m-	    wputlabel("IMM_", imm, 1)[m
[31m-	  elseif mode == "iI" and c == "I" then[m
[31m-	    waction(sz == "w" and "IMM_WB" or "IMM_DB", imm)[m
[31m-	  else[m
[31m-	    wputszarg(sz, imm)[m
[31m-	  end[m
[31m-	elseif c == "J" then[m
[31m-	  if mode == "iPJ" then[m
[31m-	    waction("REL_A", imm) -- !x64 (secpos)[m
[31m-	  else[m
[31m-	    wputlabel("REL_", imm, 2)[m
[31m-	  end[m
[31m-	elseif c == "s" then[m
[31m-	  local reg = a.reg[m
[31m-	  if reg < 0 then[m
[31m-	    wputb(0)[m
[31m-	    wvreg("imm.hi", a.vreg)[m
[31m-	  else[m
[31m-	    wputb(shl(reg, 4))[m
[31m-	  end[m
[31m-	else[m
[31m-	  werror("bad char `"..c.."' in pattern `"..pat.."' for `"..op.."'")[m
[31m-	end[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Mapping of operand modes to short names. Suppress output with '#'.[m
[31m-local map_modename = {[m
[31m-  r = "reg", R = "eax", C = "cl", x = "mem", m = "mrm", i = "imm",[m
[31m-  f = "stx", F = "st0", J = "lbl", ["1"] = "1",[m
[31m-  I = "#", S = "#", O = "#",[m
[31m-}[m
[31m-[m
[31m--- Return a table/string showing all possible operand modes.[m
[31m-local function templatehelp(template, nparams)[m
[31m-  if nparams == 0 then return "" end[m
[31m-  local t = {}[m
[31m-  for tm in gmatch(template, "[^%|]+") do[m
[31m-    local s = map_modename[sub(tm, 1, 1)][m
[31m-    s = s..gsub(sub(tm, 2, nparams), ".", function(c)[m
[31m-      return ", "..map_modename[c][m
[31m-    end)[m
[31m-    if not match(s, "#") then t[#t+1] = s end[m
[31m-  end[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m--- Match operand modes against mode match part of template.[m
[31m-local function matchtm(tm, args)[m
[31m-  for i=1,#args do[m
[31m-    if not match(args[i].mode, sub(tm, i, i)) then return end[m
[31m-  end[m
[31m-  return true[m
[31m-end[m
[31m-[m
[31m--- Handle opcodes defined with template strings.[m
[31m-map_op[".template__"] = function(params, template, nparams)[m
[31m-  if not params then return templatehelp(template, nparams) end[m
[31m-  local args = {}[m
[31m-[m
[31m-  -- Zero-operand opcodes have no match part.[m
[31m-  if #params == 0 then[m
[31m-    dopattern(template, args, "d", params.op, nil)[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  -- Determine common operand size (coerce undefined size) or flag as mixed.[m
[31m-  local sz, szmix, needrex[m
[31m-  for i,p in ipairs(params) do[m
[31m-    args[i] = parseoperand(p)[m
[31m-    local nsz = args[i].opsize[m
[31m-    if nsz then[m
[31m-      if sz and sz ~= nsz then szmix = true else sz = nsz end[m
[31m-    end[m
[31m-    local nrex = args[i].needrex[m
[31m-    if nrex ~= nil then[m
[31m-      if needrex == nil then[m
[31m-	needrex = nrex[m
[31m-      elseif needrex ~= nrex then[m
[31m-	werror("bad mix of byte-addressable registers")[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  -- Try all match:pattern pairs (separated by '|').[m
[31m-  local gotmatch, lastpat[m
[31m-  for tm in gmatch(template, "[^%|]+") do[m
[31m-    -- Split off size match (starts after mode match) and pattern string.[m
[31m-    local szm, pat = match(tm, "^(.-):(.*)$", #args+1)[m
[31m-    if pat == "" then pat = lastpat else lastpat = pat end[m
[31m-    if matchtm(tm, args) then[m
[31m-      local prefix = sub(szm, 1, 1)[m
[31m-      if prefix == "/" then -- Exactly match leading operand sizes.[m
[31m-	for i = #szm,1,-1 do[m
[31m-	  if i == 1 then[m
[31m-	    dopattern(pat, args, sz, params.op, needrex) -- Process pattern.[m
[31m-	    return[m
[31m-	  elseif args[i-1].opsize ~= sub(szm, i, i) then[m
[31m-	    break[m
[31m-	  end[m
[31m-	end[m
[31m-      else -- Match common operand size.[m
[31m-	local szp = sz[m
[31m-	if szm == "" then szm = x64 and "qdwb" or "dwb" end -- Default sizes.[m
[31m-	if prefix == "1" then szp = args[1].opsize; szmix = nil[m
[31m-	elseif prefix == "2" then szp = args[2].opsize; szmix = nil end[m
[31m-	if not szmix and (prefix == "." or match(szm, szp or "#")) then[m
[31m-	  dopattern(pat, args, szp, params.op, needrex) -- Process pattern.[m
[31m-	  return[m
[31m-	end[m
[31m-      end[m
[31m-      gotmatch = true[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  local msg = "bad operand mode"[m
[31m-  if gotmatch then[m
[31m-    if szmix then[m
[31m-      msg = "mixed operand size"[m
[31m-    else[m
[31m-      msg = sz and "bad operand size" or "missing operand size"[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  werror(msg.." in `"..opmodestr(params.op, args).."'")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- x64-specific opcode for 64 bit immediates and displacements.[m
[31m-if x64 then[m
[31m-  function map_op.mov64_2(params)[m
[31m-    if not params then return { "reg, imm", "reg, [disp]", "[disp], reg" } end[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-    local opcode, op64, sz, rex, vreg[m
[31m-    local op64 = match(params[1], "^%[%s*(.-)%s*%]$")[m
[31m-    if op64 then[m
[31m-      local a = parseoperand(params[2])[m
[31m-      if a.mode ~= "rmR" then werror("bad operand mode") end[m
[31m-      sz = a.opsize[m
[31m-      rex = sz == "q" and 8 or 0[m
[31m-      opcode = 0xa3[m
[31m-    else[m
[31m-      op64 = match(params[2], "^%[%s*(.-)%s*%]$")[m
[31m-      local a = parseoperand(params[1])[m
[31m-      if op64 then[m
[31m-	if a.mode ~= "rmR" then werror("bad operand mode") end[m
[31m-	sz = a.opsize[m
[31m-	rex = sz == "q" and 8 or 0[m
[31m-	opcode = 0xa1[m
[31m-      else[m
[31m-	if sub(a.mode, 1, 1) ~= "r" or a.opsize ~= "q" then[m
[31m-	  werror("bad operand mode")[m
[31m-	end[m
[31m-	op64 = params[2][m
[31m-	if a.reg == -1 then[m
[31m-	  vreg = a.vreg[m
[31m-	  opcode = 0xb8[m
[31m-	else[m
[31m-	  opcode = 0xb8 + band(a.reg, 7)[m
[31m-	end[m
[31m-	rex = a.reg > 7 and 9 or 8[m
[31m-      end[m
[31m-    end[m
[31m-    local psz, sk = wputop(sz, opcode, rex, nil, vreg)[m
[31m-    wvreg("opcode", vreg, psz, sk)[m
[31m-    waction("IMM_D", format("(unsigned int)(%s)", op64))[m
[31m-    waction("IMM_D", format("(unsigned int)((%s)>>32)", op64))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcodes for data storage.[m
[31m-local function op_data(params)[m
[31m-  if not params then return "imm..." end[m
[31m-  local sz = sub(params.op, 2, 2)[m
[31m-  if sz == "a" then sz = addrsize end[m
[31m-  for _,p in ipairs(params) do[m
[31m-    local a = parseoperand(p)[m
[31m-    if sub(a.mode, 1, 1) ~= "i" or (a.opsize and a.opsize ~= sz) then[m
[31m-      werror("bad mode or size in `"..p.."'")[m
[31m-    end[m
[31m-    if a.mode == "iJ" then[m
[31m-      wputlabel("IMM_", a.imm, 1)[m
[31m-    else[m
[31m-      wputszarg(sz, a.imm)[m
[31m-    end[m
[31m-    if secpos+2 > maxsecpos then wflush() end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-map_op[".byte_*"] = op_data[m
[31m-map_op[".sbyte_*"] = op_data[m
[31m-map_op[".word_*"] = op_data[m
[31m-map_op[".dword_*"] = op_data[m
[31m-map_op[".aword_*"] = op_data[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the action list is to be emitted.[m
[31m-map_op[".actionlist_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeactions(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global enum is to be emitted.[m
[31m-map_op[".globals_1"] = function(params)[m
[31m-  if not params then return "prefix" end[m
[31m-  local prefix = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobals(out, prefix) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the global names are to be emitted.[m
[31m-map_op[".globalnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeglobalnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to mark the position where the extern names are to be emitted.[m
[31m-map_op[".externnames_1"] = function(params)[m
[31m-  if not params then return "cvar" end[m
[31m-  local name = params[1] -- No syntax check. You get to keep the pieces.[m
[31m-  wline(function(out) writeexternnames(out, name) end)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Label pseudo-opcode (converted from trailing colon form).[m
[31m-map_op[".label_2"] = function(params)[m
[31m-  if not params then return "[1-9] | ->global | =>pcexpr  [, addr]" end[m
[31m-  if secpos+2 > maxsecpos then wflush() end[m
[31m-  local a = parseoperand(params[1])[m
[31m-  local mode, imm = a.mode, a.imm[m
[31m-  if type(imm) == "number" and (mode == "iJ" or (imm >= 1 and imm <= 9)) then[m
[31m-    -- Local label (1: ... 9:) or global label (->global:).[m
[31m-    waction("LABEL_LG", nil, 1)[m
[31m-    wputxb(imm)[m
[31m-  elseif mode == "iJ" then[m
[31m-    -- PC label (=>pcexpr:).[m
[31m-    waction("LABEL_PC", imm)[m
[31m-  else[m
[31m-    werror("bad label definition")[m
[31m-  end[m
[31m-  -- SETLABEL must immediately follow LABEL_LG/LABEL_PC.[m
[31m-  local addr = params[2][m
[31m-  if addr then[m
[31m-    local a = parseoperand(addr)[m
[31m-    if a.mode == "iPJ" then[m
[31m-      waction("SETLABEL", a.imm)[m
[31m-    else[m
[31m-      werror("bad label assignment")[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-map_op[".label_1"] = map_op[".label_2"][m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Alignment pseudo-opcode.[m
[31m-map_op[".align_1"] = function(params)[m
[31m-  if not params then return "numpow2" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  local align = tonumber(params[1]) or map_opsizenum[map_opsize[params[1]]][m
[31m-  if align then[m
[31m-    local x = align[m
[31m-    -- Must be a power of 2 in the range (2 ... 256).[m
[31m-    for i=1,8 do[m
[31m-      x = x / 2[m
[31m-      if x == 1 then[m
[31m-	waction("ALIGN", nil, 1)[m
[31m-	wputxb(align-1) -- Action byte is 2**n-1.[m
[31m-	return[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  werror("bad alignment")[m
[31m-end[m
[31m-[m
[31m--- Spacing pseudo-opcode.[m
[31m-map_op[".space_2"] = function(params)[m
[31m-  if not params then return "num [, filler]" end[m
[31m-  if secpos+1 > maxsecpos then wflush() end[m
[31m-  waction("SPACE", params[1])[m
[31m-  local fill = params[2][m
[31m-  if fill then[m
[31m-    fill = tonumber(fill)[m
[31m-    if not fill or fill < 0 or fill > 255 then werror("bad filler") end[m
[31m-  end[m
[31m-  wputxb(fill or 0)[m
[31m-end[m
[31m-map_op[".space_1"] = map_op[".space_2"][m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pseudo-opcode for (primitive) type definitions (map to C types).[m
[31m-map_op[".type_3"] = function(params, nparams)[m
[31m-  if not params then[m
[31m-    return nparams == 2 and "name, ctype" or "name, ctype, reg"[m
[31m-  end[m
[31m-  local name, ctype, reg = params[1], params[2], params[3][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    werror("bad type name `"..name.."'")[m
[31m-  end[m
[31m-  local tp = map_type[name][m
[31m-  if tp then[m
[31m-    werror("duplicate type `"..name.."'")[m
[31m-  end[m
[31m-  if reg and not map_reg_valid_base[reg] then[m
[31m-    werror("bad base register `"..(map_reg_rev[reg] or reg).."'")[m
[31m-  end[m
[31m-  -- Add #type to defines. A bit unclean to put it in map_archdef.[m
[31m-  map_archdef["#"..name] = "sizeof("..ctype..")"[m
[31m-  -- Add new type and emit shortcut define.[m
[31m-  local num = ctypenum + 1[m
[31m-  map_type[name] = {[m
[31m-    ctype = ctype,[m
[31m-    ctypefmt = format("Dt%X(%%s)", num),[m
[31m-    reg = reg,[m
[31m-  }[m
[31m-  wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype))[m
[31m-  ctypenum = num[m
[31m-end[m
[31m-map_op[".type_2"] = map_op[".type_3"][m
[31m-[m
[31m--- Dump type definitions.[m
[31m-local function dumptypes(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_type) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-  out:write("Type definitions:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local tp = map_type[name][m
[31m-    local reg = tp.reg and map_reg_rev[tp.reg] or ""[m
[31m-    out:write(format("  %-20s %-20s %s\n", name, tp.ctype, reg))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Set the current section.[m
[31m-function _M.section(num)[m
[31m-  waction("SECTION")[m
[31m-  wputxb(num)[m
[31m-  wflush(true) -- SECTION is a terminal action.[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function _M.dumparch(out)[m
[31m-  out:write(format("DynASM %s version %s, released %s\n\n",[m
[31m-    _info.arch, _info.version, _info.release))[m
[31m-  dumpregs(out)[m
[31m-  dumpactions(out)[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-function _M.dumpdef(out, lvl)[m
[31m-  dumptypes(out, lvl)[m
[31m-  dumpglobals(out, lvl)[m
[31m-  dumpexterns(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Pass callbacks from/to the DynASM core.[m
[31m-function _M.passcb(wl, we, wf, ww)[m
[31m-  wline, werror, wfatal, wwarn = wl, we, wf, ww[m
[31m-  return wflush[m
[31m-end[m
[31m-[m
[31m--- Setup the arch-specific module.[m
[31m-function _M.setup(arch, opt)[m
[31m-  g_arch, g_opt = arch, opt[m
[31m-end[m
[31m-[m
[31m--- Merge the core maps and the arch-specific maps.[m
[31m-function _M.mergemaps(map_coreop, map_def)[m
[31m-  setmetatable(map_op, { __index = map_coreop })[m
[31m-  setmetatable(map_def, { __index = map_archdef })[m
[31m-  return map_op, map_def[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dynasm.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dynasm.lua[m
[1mdeleted file mode 100644[m
[1mindex 1e5899a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/dynasm/dynasm.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1094 +0,0 @@[m
[31m-------------------------------------------------------------------------------[m
[31m--- DynASM. A dynamic assembler for code generation engines.[m
[31m--- Originally designed and implemented for LuaJIT.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- See below for full copyright notice.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Application information.[m
[31m-local _info = {[m
[31m-  name =	"DynASM",[m
[31m-  description =	"A dynamic assembler for code generation engines",[m
[31m-  version =	"1.4.0",[m
[31m-  vernum =	 10400,[m
[31m-  release =	"2015-10-18",[m
[31m-  author =	"Mike Pall",[m
[31m-  url =		"http://luajit.org/dynasm.html",[m
[31m-  license =	"MIT",[m
[31m-  copyright =	[[[m
[31m-Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining[m
[31m-a copy of this software and associated documentation files (the[m
[31m-"Software"), to deal in the Software without restriction, including[m
[31m-without limitation the rights to use, copy, modify, merge, publish,[m
[31m-distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-permit persons to whom the Software is furnished to do so, subject to[m
[31m-the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be[m
[31m-included in all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-[m
[31m-[ MIT license: http://www.opensource.org/licenses/mit-license.php ][m
[31m-]],[m
[31m-}[m
[31m-[m
[31m--- Cache library functions.[m
[31m-local type, pairs, ipairs = type, pairs, ipairs[m
[31m-local pcall, error, assert = pcall, error, assert[m
[31m-local _s = string[m
[31m-local sub, match, gmatch, gsub = _s.sub, _s.match, _s.gmatch, _s.gsub[m
[31m-local format, rep, upper = _s.format, _s.rep, _s.upper[m
[31m-local _t = table[m
[31m-local insert, remove, concat, sort = _t.insert, _t.remove, _t.concat, _t.sort[m
[31m-local exit = os.exit[m
[31m-local io = io[m
[31m-local stdin, stdout, stderr = io.stdin, io.stdout, io.stderr[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Program options.[m
[31m-local g_opt = {}[m
[31m-[m
[31m--- Global state for current file.[m
[31m-local g_fname, g_curline, g_indent, g_lineno, g_synclineno, g_arch[m
[31m-local g_errcount = 0[m
[31m-[m
[31m--- Write buffer for output file.[m
[31m-local g_wbuffer, g_capbuffer[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Write an output line (or callback function) to the buffer.[m
[31m-local function wline(line, needindent)[m
[31m-  local buf = g_capbuffer or g_wbuffer[m
[31m-  buf[#buf+1] = needindent and g_indent..line or line[m
[31m-  g_synclineno = g_synclineno + 1[m
[31m-end[m
[31m-[m
[31m--- Write assembler line as a comment, if requestd.[m
[31m-local function wcomment(aline)[m
[31m-  if g_opt.comment then[m
[31m-    wline(g_opt.comment..aline..g_opt.endcomment, true)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Resync CPP line numbers.[m
[31m-local function wsync()[m
[31m-  if g_synclineno ~= g_lineno and g_opt.cpp then[m
[31m-    wline("#line "..g_lineno..' "'..g_fname..'"')[m
[31m-    g_synclineno = g_lineno[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Dummy action flush function. Replaced with arch-specific function later.[m
[31m-local function wflush(term)[m
[31m-end[m
[31m-[m
[31m--- Dump all buffered output lines.[m
[31m-local function wdumplines(out, buf)[m
[31m-  for _,line in ipairs(buf) do[m
[31m-    if type(line) == "string" then[m
[31m-      assert(out:write(line, "\n"))[m
[31m-    else[m
[31m-      -- Special callback to dynamically insert lines after end of processing.[m
[31m-      line(out)[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Emit an error. Processing continues with next statement.[m
[31m-local function werror(msg)[m
[31m-  error(format("%s:%s: error: %s:\n%s", g_fname, g_lineno, msg, g_curline), 0)[m
[31m-end[m
[31m-[m
[31m--- Emit a fatal error. Processing stops.[m
[31m-local function wfatal(msg)[m
[31m-  g_errcount = "fatal"[m
[31m-  werror(msg)[m
[31m-end[m
[31m-[m
[31m--- Print a warning. Processing continues.[m
[31m-local function wwarn(msg)[m
[31m-  stderr:write(format("%s:%s: warning: %s:\n%s\n",[m
[31m-    g_fname, g_lineno, msg, g_curline))[m
[31m-end[m
[31m-[m
[31m--- Print caught error message. But suppress excessive errors.[m
[31m-local function wprinterr(...)[m
[31m-  if type(g_errcount) == "number" then[m
[31m-    -- Regular error.[m
[31m-    g_errcount = g_errcount + 1[m
[31m-    if g_errcount < 21 then -- Seems to be a reasonable limit.[m
[31m-      stderr:write(...)[m
[31m-    elseif g_errcount == 21 then[m
[31m-      stderr:write(g_fname,[m
[31m-	":*: warning: too many errors (suppressed further messages).\n")[m
[31m-    end[m
[31m-  else[m
[31m-    -- Fatal error.[m
[31m-    stderr:write(...)[m
[31m-    return true -- Stop processing.[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Map holding all option handlers.[m
[31m-local opt_map = {}[m
[31m-local opt_current[m
[31m-[m
[31m--- Print error and exit with error status.[m
[31m-local function opterror(...)[m
[31m-  stderr:write("dynasm.lua: ERROR: ", ...)[m
[31m-  stderr:write("\n")[m
[31m-  exit(1)[m
[31m-end[m
[31m-[m
[31m--- Get option parameter.[m
[31m-local function optparam(args)[m
[31m-  local argn = args.argn[m
[31m-  local p = args[argn][m
[31m-  if not p then[m
[31m-    opterror("missing parameter for option `", opt_current, "'.")[m
[31m-  end[m
[31m-  args.argn = argn + 1[m
[31m-  return p[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Core pseudo-opcodes.[m
[31m-local map_coreop = {}[m
[31m--- Dummy opcode map. Replaced by arch-specific map.[m
[31m-local map_op = {}[m
[31m-[m
[31m--- Forward declarations.[m
[31m-local dostmt[m
[31m-local readfile[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Map for defines (initially empty, chains to arch-specific map).[m
[31m-local map_def = {}[m
[31m-[m
[31m--- Pseudo-opcode to define a substitution.[m
[31m-map_coreop[".define_2"] = function(params, nparams)[m
[31m-  if not params then return nparams == 1 and "name" or "name, subst" end[m
[31m-  local name, def = params[1], params[2] or "1"[m
[31m-  if not match(name, "^[%a_][%w_]*$") then werror("bad or duplicate define") end[m
[31m-  map_def[name] = def[m
[31m-end[m
[31m-map_coreop[".define_1"] = map_coreop[".define_2"][m
[31m-[m
[31m--- Define a substitution on the command line.[m
[31m-function opt_map.D(args)[m
[31m-  local namesubst = optparam(args)[m
[31m-  local name, subst = match(namesubst, "^([%a_][%w_]*)=(.*)$")[m
[31m-  if name then[m
[31m-    map_def[name] = subst[m
[31m-  elseif match(namesubst, "^[%a_][%w_]*$") then[m
[31m-    map_def[namesubst] = "1"[m
[31m-  else[m
[31m-    opterror("bad define")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Undefine a substitution on the command line.[m
[31m-function opt_map.U(args)[m
[31m-  local name = optparam(args)[m
[31m-  if match(name, "^[%a_][%w_]*$") then[m
[31m-    map_def[name] = nil[m
[31m-  else[m
[31m-    opterror("bad define")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Helper for definesubst.[m
[31m-local gotsubst[m
[31m-[m
[31m-local function definesubst_one(word)[m
[31m-  local subst = map_def[word][m
[31m-  if subst then gotsubst = word; return subst else return word end[m
[31m-end[m
[31m-[m
[31m--- Iteratively substitute defines.[m
[31m-local function definesubst(stmt)[m
[31m-  -- Limit number of iterations.[m
[31m-  for i=1,100 do[m
[31m-    gotsubst = false[m
[31m-    stmt = gsub(stmt, "#?[%w_]+", definesubst_one)[m
[31m-    if not gotsubst then break end[m
[31m-  end[m
[31m-  if gotsubst then wfatal("recursive define involving `"..gotsubst.."'") end[m
[31m-  return stmt[m
[31m-end[m
[31m-[m
[31m--- Dump all defines.[m
[31m-local function dumpdefines(out, lvl)[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_def) do[m
[31m-    t[#t+1] = name[m
[31m-  end[m
[31m-  sort(t)[m
[31m-  out:write("Defines:\n")[m
[31m-  for _,name in ipairs(t) do[m
[31m-    local subst = map_def[name][m
[31m-    if g_arch then subst = g_arch.revdef(subst) end[m
[31m-    out:write(format("  %-20s %s\n", name, subst))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Support variables for conditional assembly.[m
[31m-local condlevel = 0[m
[31m-local condstack = {}[m
[31m-[m
[31m--- Evaluate condition with a Lua expression. Substitutions already performed.[m
[31m-local function cond_eval(cond)[m
[31m-  local func, err[m
[31m-  if setfenv then[m
[31m-    func, err = loadstring("return "..cond, "=expr")[m
[31m-  else[m
[31m-    -- No globals. All unknown identifiers evaluate to nil.[m
[31m-    func, err = load("return "..cond, "=expr", "t", {})[m
[31m-  end[m
[31m-  if func then[m
[31m-    if setfenv then[m
[31m-      setfenv(func, {}) -- No globals. All unknown identifiers evaluate to nil.[m
[31m-    end[m
[31m-    local ok, res = pcall(func)[m
[31m-    if ok then[m
[31m-      if res == 0 then return false end -- Oh well.[m
[31m-      return not not res[m
[31m-    end[m
[31m-    err = res[m
[31m-  end[m
[31m-  wfatal("bad condition: "..err)[m
[31m-end[m
[31m-[m
[31m--- Skip statements until next conditional pseudo-opcode at the same level.[m
[31m-local function stmtskip()[m
[31m-  local dostmt_save = dostmt[m
[31m-  local lvl = 0[m
[31m-  dostmt = function(stmt)[m
[31m-    local op = match(stmt, "^%s*(%S+)")[m
[31m-    if op == ".if" then[m
[31m-      lvl = lvl + 1[m
[31m-    elseif lvl ~= 0 then[m
[31m-      if op == ".endif" then lvl = lvl - 1 end[m
[31m-    elseif op == ".elif" or op == ".else" or op == ".endif" then[m
[31m-      dostmt = dostmt_save[m
[31m-      dostmt(stmt)[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcodes for conditional assembly.[m
[31m-map_coreop[".if_1"] = function(params)[m
[31m-  if not params then return "condition" end[m
[31m-  local lvl = condlevel + 1[m
[31m-  local res = cond_eval(params[1])[m
[31m-  condlevel = lvl[m
[31m-  condstack[lvl] = res[m
[31m-  if not res then stmtskip() end[m
[31m-end[m
[31m-[m
[31m-map_coreop[".elif_1"] = function(params)[m
[31m-  if not params then return "condition" end[m
[31m-  if condlevel == 0 then wfatal(".elif without .if") end[m
[31m-  local lvl = condlevel[m
[31m-  local res = condstack[lvl][m
[31m-  if res then[m
[31m-    if res == "else" then wfatal(".elif after .else") end[m
[31m-  else[m
[31m-    res = cond_eval(params[1])[m
[31m-    if res then[m
[31m-      condstack[lvl] = res[m
[31m-      return[m
[31m-    end[m
[31m-  end[m
[31m-  stmtskip()[m
[31m-end[m
[31m-[m
[31m-map_coreop[".else_0"] = function(params)[m
[31m-  if condlevel == 0 then wfatal(".else without .if") end[m
[31m-  local lvl = condlevel[m
[31m-  local res = condstack[lvl][m
[31m-  condstack[lvl] = "else"[m
[31m-  if res then[m
[31m-    if res == "else" then wfatal(".else after .else") end[m
[31m-    stmtskip()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-map_coreop[".endif_0"] = function(params)[m
[31m-  local lvl = condlevel[m
[31m-  if lvl == 0 then wfatal(".endif without .if") end[m
[31m-  condlevel = lvl - 1[m
[31m-end[m
[31m-[m
[31m--- Check for unfinished conditionals.[m
[31m-local function checkconds()[m
[31m-  if g_errcount ~= "fatal" and condlevel ~= 0 then[m
[31m-    wprinterr(g_fname, ":*: error: unbalanced conditional\n")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Search for a file in the given path and open it for reading.[m
[31m-local function pathopen(path, name)[m
[31m-  local dirsep = package and match(package.path, "\\") and "\\" or "/"[m
[31m-  for _,p in ipairs(path) do[m
[31m-    local fullname = p == "" and name or p..dirsep..name[m
[31m-    local fin = io.open(fullname, "r")[m
[31m-    if fin then[m
[31m-      g_fname = fullname[m
[31m-      return fin[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Include a file.[m
[31m-map_coreop[".include_1"] = function(params)[m
[31m-  if not params then return "filename" end[m
[31m-  local name = params[1][m
[31m-  -- Save state. Ugly, I know. but upvalues are fast.[m
[31m-  local gf, gl, gcl, gi = g_fname, g_lineno, g_curline, g_indent[m
[31m-  -- Read the included file.[m
[31m-  local fatal = readfile(pathopen(g_opt.include, name) or[m
[31m-			 wfatal("include file `"..name.."' not found"))[m
[31m-  -- Restore state.[m
[31m-  g_synclineno = -1[m
[31m-  g_fname, g_lineno, g_curline, g_indent = gf, gl, gcl, gi[m
[31m-  if fatal then wfatal("in include file") end[m
[31m-end[m
[31m-[m
[31m--- Make .include and conditionals initially available, too.[m
[31m-map_op[".include_1"] = map_coreop[".include_1"][m
[31m-map_op[".if_1"] = map_coreop[".if_1"][m
[31m-map_op[".elif_1"] = map_coreop[".elif_1"][m
[31m-map_op[".else_0"] = map_coreop[".else_0"][m
[31m-map_op[".endif_0"] = map_coreop[".endif_0"][m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Support variables for macros.[m
[31m-local mac_capture, mac_lineno, mac_name[m
[31m-local mac_active = {}[m
[31m-local mac_list = {}[m
[31m-[m
[31m--- Pseudo-opcode to define a macro.[m
[31m-map_coreop[".macro_*"] = function(mparams)[m
[31m-  if not mparams then return "name [, params...]" end[m
[31m-  -- Split off and validate macro name.[m
[31m-  local name = remove(mparams, 1)[m
[31m-  if not name then werror("missing macro name") end[m
[31m-  if not (match(name, "^[%a_][%w_%.]*$") or match(name, "^%.[%w_%.]*$")) then[m
[31m-    wfatal("bad macro name `"..name.."'")[m
[31m-  end[m
[31m-  -- Validate macro parameter names.[m
[31m-  local mdup = {}[m
[31m-  for _,mp in ipairs(mparams) do[m
[31m-    if not match(mp, "^[%a_][%w_]*$") then[m
[31m-      wfatal("bad macro parameter name `"..mp.."'")[m
[31m-    end[m
[31m-    if mdup[mp] then wfatal("duplicate macro parameter name `"..mp.."'") end[m
[31m-    mdup[mp] = true[m
[31m-  end[m
[31m-  -- Check for duplicate or recursive macro definitions.[m
[31m-  local opname = name.."_"..#mparams[m
[31m-  if map_op[opname] or map_op[name.."_*"] then[m
[31m-    wfatal("duplicate macro `"..name.."' ("..#mparams.." parameters)")[m
[31m-  end[m
[31m-  if mac_capture then wfatal("recursive macro definition") end[m
[31m-[m
[31m-  -- Enable statement capture.[m
[31m-  local lines = {}[m
[31m-  mac_lineno = g_lineno[m
[31m-  mac_name = name[m
[31m-  mac_capture = function(stmt) -- Statement capture function.[m
[31m-    -- Stop macro definition with .endmacro pseudo-opcode.[m
[31m-    if not match(stmt, "^%s*.endmacro%s*$") then[m
[31m-      lines[#lines+1] = stmt[m
[31m-      return[m
[31m-    end[m
[31m-    mac_capture = nil[m
[31m-    mac_lineno = nil[m
[31m-    mac_name = nil[m
[31m-    mac_list[#mac_list+1] = opname[m
[31m-    -- Add macro-op definition.[m
[31m-    map_op[opname] = function(params)[m
[31m-      if not params then return mparams, lines end[m
[31m-      -- Protect against recursive macro invocation.[m
[31m-      if mac_active[opname] then wfatal("recursive macro invocation") end[m
[31m-      mac_active[opname] = true[m
[31m-      -- Setup substitution map.[m
[31m-      local subst = {}[m
[31m-      for i,mp in ipairs(mparams) do subst[mp] = params[i] end[m
[31m-      local mcom[m
[31m-      if g_opt.maccomment and g_opt.comment then[m
[31m-	mcom = " MACRO "..name.." ("..#mparams..")"[m
[31m-	wcomment("{"..mcom)[m
[31m-      end[m
[31m-      -- Loop through all captured statements[m
[31m-      for _,stmt in ipairs(lines) do[m
[31m-	-- Substitute macro parameters.[m
[31m-	local st = gsub(stmt, "[%w_]+", subst)[m
[31m-	st = definesubst(st)[m
[31m-	st = gsub(st, "%s*%.%.%s*", "") -- Token paste a..b.[m
[31m-	if mcom and sub(st, 1, 1) ~= "|" then wcomment(st) end[m
[31m-	-- Emit statement. Use a protected call for better diagnostics.[m
[31m-	local ok, err = pcall(dostmt, st)[m
[31m-	if not ok then[m
[31m-	  -- Add the captured statement to the error.[m
[31m-	  wprinterr(err, "\n", g_indent, "|  ", stmt,[m
[31m-		    "\t[MACRO ", name, " (", #mparams, ")]\n")[m
[31m-	end[m
[31m-      end[m
[31m-      if mcom then wcomment("}"..mcom) end[m
[31m-      mac_active[opname] = nil[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- An .endmacro pseudo-opcode outside of a macro definition is an error.[m
[31m-map_coreop[".endmacro_0"] = function(params)[m
[31m-  wfatal(".endmacro without .macro")[m
[31m-end[m
[31m-[m
[31m--- Dump all macros and their contents (with -PP only).[m
[31m-local function dumpmacros(out, lvl)[m
[31m-  sort(mac_list)[m
[31m-  out:write("Macros:\n")[m
[31m-  for _,opname in ipairs(mac_list) do[m
[31m-    local name = sub(opname, 1, -3)[m
[31m-    local params, lines = map_op[opname]()[m
[31m-    out:write(format("  %-20s %s\n", name, concat(params, ", ")))[m
[31m-    if lvl > 1 then[m
[31m-      for _,line in ipairs(lines) do[m
[31m-	out:write("  |", line, "\n")[m
[31m-      end[m
[31m-      out:write("\n")[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Check for unfinished macro definitions.[m
[31m-local function checkmacros()[m
[31m-  if mac_capture then[m
[31m-    wprinterr(g_fname, ":", mac_lineno,[m
[31m-	      ": error: unfinished .macro `", mac_name ,"'\n")[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Support variables for captures.[m
[31m-local cap_lineno, cap_name[m
[31m-local cap_buffers = {}[m
[31m-local cap_used = {}[m
[31m-[m
[31m--- Start a capture.[m
[31m-map_coreop[".capture_1"] = function(params)[m
[31m-  if not params then return "name" end[m
[31m-  wflush()[m
[31m-  local name = params[1][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    wfatal("bad capture name `"..name.."'")[m
[31m-  end[m
[31m-  if cap_name then[m
[31m-    wfatal("already capturing to `"..cap_name.."' since line "..cap_lineno)[m
[31m-  end[m
[31m-  cap_name = name[m
[31m-  cap_lineno = g_lineno[m
[31m-  -- Create or continue a capture buffer and start the output line capture.[m
[31m-  local buf = cap_buffers[name][m
[31m-  if not buf then buf = {}; cap_buffers[name] = buf end[m
[31m-  g_capbuffer = buf[m
[31m-  g_synclineno = 0[m
[31m-end[m
[31m-[m
[31m--- Stop a capture.[m
[31m-map_coreop[".endcapture_0"] = function(params)[m
[31m-  wflush()[m
[31m-  if not cap_name then wfatal(".endcapture without a valid .capture") end[m
[31m-  cap_name = nil[m
[31m-  cap_lineno = nil[m
[31m-  g_capbuffer = nil[m
[31m-  g_synclineno = 0[m
[31m-end[m
[31m-[m
[31m--- Dump a capture buffer.[m
[31m-map_coreop[".dumpcapture_1"] = function(params)[m
[31m-  if not params then return "name" end[m
[31m-  wflush()[m
[31m-  local name = params[1][m
[31m-  if not match(name, "^[%a_][%w_]*$") then[m
[31m-    wfatal("bad capture name `"..name.."'")[m
[31m-  end[m
[31m-  cap_used[name] = true[m
[31m-  wline(function(out)[m
[31m-    local buf = cap_buffers[name][m
[31m-    if buf then wdumplines(out, buf) end[m
[31m-  end)[m
[31m-  g_synclineno = 0[m
[31m-end[m
[31m-[m
[31m--- Dump all captures and their buffers (with -PP only).[m
[31m-local function dumpcaptures(out, lvl)[m
[31m-  out:write("Captures:\n")[m
[31m-  for name,buf in pairs(cap_buffers) do[m
[31m-    out:write(format("  %-20s %4s)\n", name, "("..#buf))[m
[31m-    if lvl > 1 then[m
[31m-      local bar = rep("=", 76)[m
[31m-      out:write("  ", bar, "\n")[m
[31m-      for _,line in ipairs(buf) do[m
[31m-	out:write("  ", line, "\n")[m
[31m-      end[m
[31m-      out:write("  ", bar, "\n\n")[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m--- Check for unfinished or unused captures.[m
[31m-local function checkcaptures()[m
[31m-  if cap_name then[m
[31m-    wprinterr(g_fname, ":", cap_lineno,[m
[31m-	      ": error: unfinished .capture `", cap_name,"'\n")[m
[31m-    return[m
[31m-  end[m
[31m-  for name in pairs(cap_buffers) do[m
[31m-    if not cap_used[name] then[m
[31m-      wprinterr(g_fname, ":*: error: missing .dumpcapture ", name ,"\n")[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Sections names.[m
[31m-local map_sections = {}[m
[31m-[m
[31m--- Pseudo-opcode to define code sections.[m
[31m--- TODO: Data sections, BSS sections. Needs extra C code and API.[m
[31m-map_coreop[".section_*"] = function(params)[m
[31m-  if not params then return "name..." end[m
[31m-  if #map_sections > 0 then werror("duplicate section definition") end[m
[31m-  wflush()[m
[31m-  for sn,name in ipairs(params) do[m
[31m-    local opname = "."..name.."_0"[m
[31m-    if not match(name, "^[%a][%w_]*$") or[m
[31m-       map_op[opname] or map_op["."..name.."_*"] then[m
[31m-      werror("bad section name `"..name.."'")[m
[31m-    end[m
[31m-    map_sections[#map_sections+1] = name[m
[31m-    wline(format("#define DASM_SECTION_%s\t%d", upper(name), sn-1))[m
[31m-    map_op[opname] = function(params) g_arch.section(sn-1) end[m
[31m-  end[m
[31m-  wline(format("#define DASM_MAXSECTION\t\t%d", #map_sections))[m
[31m-end[m
[31m-[m
[31m--- Dump all sections.[m
[31m-local function dumpsections(out, lvl)[m
[31m-  out:write("Sections:\n")[m
[31m-  for _,name in ipairs(map_sections) do[m
[31m-    out:write(format("  %s\n", name))[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Replacement for customized Lua, which lacks the package library.[m
[31m-local prefix = ""[m
[31m-if not require then[m
[31m-  function require(name)[m
[31m-    local fp = assert(io.open(prefix..name..".lua"))[m
[31m-    local s = fp:read("*a")[m
[31m-    assert(fp:close())[m
[31m-    return assert(loadstring(s, "@"..name..".lua"))()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Load architecture-specific module.[m
[31m-local function loadarch(arch)[m
[31m-  if not match(arch, "^[%w_]+$") then return "bad arch name" end[m
[31m-  local ok, m_arch = pcall(require, "dasm_"..arch)[m
[31m-  if not ok then return "cannot load module: "..m_arch end[m
[31m-  g_arch = m_arch[m
[31m-  wflush = m_arch.passcb(wline, werror, wfatal, wwarn)[m
[31m-  m_arch.setup(arch, g_opt)[m
[31m-  map_op, map_def = m_arch.mergemaps(map_coreop, map_def)[m
[31m-end[m
[31m-[m
[31m--- Dump architecture description.[m
[31m-function opt_map.dumparch(args)[m
[31m-  local name = optparam(args)[m
[31m-  if not g_arch then[m
[31m-    local err = loadarch(name)[m
[31m-    if err then opterror(err) end[m
[31m-  end[m
[31m-[m
[31m-  local t = {}[m
[31m-  for name in pairs(map_coreop) do t[#t+1] = name end[m
[31m-  for name in pairs(map_op) do t[#t+1] = name end[m
[31m-  sort(t)[m
[31m-[m
[31m-  local out = stdout[m
[31m-  local _arch = g_arch._info[m
[31m-  out:write(format("%s version %s, released %s, %s\n",[m
[31m-    _info.name, _info.version, _info.release, _info.url))[m
[31m-  g_arch.dumparch(out)[m
[31m-[m
[31m-  local pseudo = true[m
[31m-  out:write("Pseudo-Opcodes:\n")[m
[31m-  for _,sname in ipairs(t) do[m
[31m-    local name, nparam = match(sname, "^(.+)_([0-9%*])$")[m
[31m-    if name then[m
[31m-      if pseudo and sub(name, 1, 1) ~= "." then[m
[31m-	out:write("\nOpcodes:\n")[m
[31m-	pseudo = false[m
[31m-      end[m
[31m-      local f = map_op[sname][m
[31m-      local s[m
[31m-      if nparam ~= "*" then nparam = nparam + 0 end[m
[31m-      if nparam == 0 then[m
[31m-	s = ""[m
[31m-      elseif type(f) == "string" then[m
[31m-	s = map_op[".template__"](nil, f, nparam)[m
[31m-      else[m
[31m-	s = f(nil, nparam)[m
[31m-      end[m
[31m-      if type(s) == "table" then[m
[31m-	for _,s2 in ipairs(s) do[m
[31m-	  out:write(format("  %-12s %s\n", name, s2))[m
[31m-	end[m
[31m-      else[m
[31m-	out:write(format("  %-12s %s\n", name, s))[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-  exit(0)[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcode to set the architecture.[m
[31m--- Only initially available (map_op is replaced when called).[m
[31m-map_op[".arch_1"] = function(params)[m
[31m-  if not params then return "name" end[m
[31m-  local err = loadarch(params[1])[m
[31m-  if err then wfatal(err) end[m
[31m-  wline(format("#if DASM_VERSION != %d", _info.vernum))[m
[31m-  wline('#error "Version mismatch between DynASM and included encoding engine"')[m
[31m-  wline("#endif")[m
[31m-end[m
[31m-[m
[31m--- Dummy .arch pseudo-opcode to improve the error report.[m
[31m-map_coreop[".arch_1"] = function(params)[m
[31m-  if not params then return "name" end[m
[31m-  wfatal("duplicate .arch statement")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dummy pseudo-opcode. Don't confuse '.nop' with 'nop'.[m
[31m-map_coreop[".nop_*"] = function(params)[m
[31m-  if not params then return "[ignored...]" end[m
[31m-end[m
[31m-[m
[31m--- Pseudo-opcodes to raise errors.[m
[31m-map_coreop[".error_1"] = function(params)[m
[31m-  if not params then return "message" end[m
[31m-  werror(params[1])[m
[31m-end[m
[31m-[m
[31m-map_coreop[".fatal_1"] = function(params)[m
[31m-  if not params then return "message" end[m
[31m-  wfatal(params[1])[m
[31m-end[m
[31m-[m
[31m--- Dump all user defined elements.[m
[31m-local function dumpdef(out)[m
[31m-  local lvl = g_opt.dumpdef[m
[31m-  if lvl == 0 then return end[m
[31m-  dumpsections(out, lvl)[m
[31m-  dumpdefines(out, lvl)[m
[31m-  if g_arch then g_arch.dumpdef(out, lvl) end[m
[31m-  dumpmacros(out, lvl)[m
[31m-  dumpcaptures(out, lvl)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Helper for splitstmt.[m
[31m-local splitlvl[m
[31m-[m
[31m-local function splitstmt_one(c)[m
[31m-  if c == "(" then[m
[31m-    splitlvl = ")"..splitlvl[m
[31m-  elseif c == "[" then[m
[31m-    splitlvl = "]"..splitlvl[m
[31m-  elseif c == "{" then[m
[31m-    splitlvl = "}"..splitlvl[m
[31m-  elseif c == ")" or c == "]" or c == "}" then[m
[31m-    if sub(splitlvl, 1, 1) ~= c then werror("unbalanced (), [] or {}") end[m
[31m-    splitlvl = sub(splitlvl, 2)[m
[31m-  elseif splitlvl == "" then[m
[31m-    return " \0 "[m
[31m-  end[m
[31m-  return c[m
[31m-end[m
[31m-[m
[31m--- Split statement into (pseudo-)opcode and params.[m
[31m-local function splitstmt(stmt)[m
[31m-  -- Convert label with trailing-colon into .label statement.[m
[31m-  local label = match(stmt, "^%s*(.+):%s*$")[m
[31m-  if label then return ".label", {label} end[m
[31m-[m
[31m-  -- Split at commas and equal signs, but obey parentheses and brackets.[m
[31m-  splitlvl = ""[m
[31m-  stmt = gsub(stmt, "[,%(%)%[%]{}]", splitstmt_one)[m
[31m-  if splitlvl ~= "" then werror("unbalanced () or []") end[m
[31m-[m
[31m-  -- Split off opcode.[m
[31m-  local op, other = match(stmt, "^%s*([^%s%z]+)%s*(.*)$")[m
[31m-  if not op then werror("bad statement syntax") end[m
[31m-[m
[31m-  -- Split parameters.[m
[31m-  local params = {}[m
[31m-  for p in gmatch(other, "%s*(%Z+)%z?") do[m
[31m-    params[#params+1] = gsub(p, "%s+$", "")[m
[31m-  end[m
[31m-  if #params > 16 then werror("too many parameters") end[m
[31m-[m
[31m-  params.op = op[m
[31m-  return op, params[m
[31m-end[m
[31m-[m
[31m--- Process a single statement.[m
[31m-dostmt = function(stmt)[m
[31m-  -- Ignore empty statements.[m
[31m-  if match(stmt, "^%s*$") then return end[m
[31m-[m
[31m-  -- Capture macro defs before substitution.[m
[31m-  if mac_capture then return mac_capture(stmt) end[m
[31m-  stmt = definesubst(stmt)[m
[31m-[m
[31m-  -- Emit C code without parsing the line.[m
[31m-  if sub(stmt, 1, 1) == "|" then[m
[31m-    local tail = sub(stmt, 2)[m
[31m-    wflush()[m
[31m-    if sub(tail, 1, 2) == "//" then wcomment(tail) else wline(tail, true) end[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  -- Split into (pseudo-)opcode and params.[m
[31m-  local op, params = splitstmt(stmt)[m
[31m-[m
[31m-  -- Get opcode handler (matching # of parameters or generic handler).[m
[31m-  local f = map_op[op.."_"..#params] or map_op[op.."_*"][m
[31m-  if not f then[m
[31m-    if not g_arch then wfatal("first statement must be .arch") end[m
[31m-    -- Improve error report.[m
[31m-    for i=0,9 do[m
[31m-      if map_op[op.."_"..i] then[m
[31m-	werror("wrong number of parameters for `"..op.."'")[m
[31m-      end[m
[31m-    end[m
[31m-    werror("unknown statement `"..op.."'")[m
[31m-  end[m
[31m-[m
[31m-  -- Call opcode handler or special handler for template strings.[m
[31m-  if type(f) == "string" then[m
[31m-    map_op[".template__"](params, f)[m
[31m-  else[m
[31m-    f(params)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Process a single line.[m
[31m-local function doline(line)[m
[31m-  if g_opt.flushline then wflush() end[m
[31m-[m
[31m-  -- Assembler line?[m
[31m-  local indent, aline = match(line, "^(%s*)%|(.*)$")[m
[31m-  if not aline then[m
[31m-    -- No, plain C code line, need to flush first.[m
[31m-    wflush()[m
[31m-    wsync()[m
[31m-    wline(line, false)[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  g_indent = indent -- Remember current line indentation.[m
[31m-[m
[31m-  -- Emit C code (even from macros). Avoids echo and line parsing.[m
[31m-  if sub(aline, 1, 1) == "|" then[m
[31m-    if not mac_capture then[m
[31m-      wsync()[m
[31m-    elseif g_opt.comment then[m
[31m-      wsync()[m
[31m-      wcomment(aline)[m
[31m-    end[m
[31m-    dostmt(aline)[m
[31m-    return[m
[31m-  end[m
[31m-[m
[31m-  -- Echo assembler line as a comment.[m
[31m-  if g_opt.comment then[m
[31m-    wsync()[m
[31m-    wcomment(aline)[m
[31m-  end[m
[31m-[m
[31m-  -- Strip assembler comments.[m
[31m-  aline = gsub(aline, "//.*$", "")[m
[31m-[m
[31m-  -- Split line into statements at semicolons.[m
[31m-  if match(aline, ";") then[m
[31m-    for stmt in gmatch(aline, "[^;]+") do dostmt(stmt) end[m
[31m-  else[m
[31m-    dostmt(aline)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Write DynASM header.[m
[31m-local function dasmhead(out)[m
[31m-  out:write(format([[[m
[31m-/*[m
[31m-** This file has been pre-processed with DynASM.[m
[31m-** %s[m
[31m-** DynASM version %s, DynASM %s version %s[m
[31m-** DO NOT EDIT! The original file is in "%s".[m
[31m-*/[m
[31m-[m
[31m-]], _info.url,[m
[31m-    _info.version, g_arch._info.arch, g_arch._info.version,[m
[31m-    g_fname))[m
[31m-end[m
[31m-[m
[31m--- Read input file.[m
[31m-readfile = function(fin)[m
[31m-  g_indent = ""[m
[31m-  g_lineno = 0[m
[31m-  g_synclineno = -1[m
[31m-[m
[31m-  -- Process all lines.[m
[31m-  for line in fin:lines() do[m
[31m-    g_lineno = g_lineno + 1[m
[31m-    g_curline = line[m
[31m-    local ok, err = pcall(doline, line)[m
[31m-    if not ok and wprinterr(err, "\n") then return true end[m
[31m-  end[m
[31m-  wflush()[m
[31m-[m
[31m-  -- Close input file.[m
[31m-  assert(fin == stdin or fin:close())[m
[31m-end[m
[31m-[m
[31m--- Write output file.[m
[31m-local function writefile(outfile)[m
[31m-  local fout[m
[31m-[m
[31m-  -- Open output file.[m
[31m-  if outfile == nil or outfile == "-" then[m
[31m-    fout = stdout[m
[31m-  else[m
[31m-    fout = assert(io.open(outfile, "w"))[m
[31m-  end[m
[31m-[m
[31m-  -- Write all buffered lines[m
[31m-  wdumplines(fout, g_wbuffer)[m
[31m-[m
[31m-  -- Close output file.[m
[31m-  assert(fout == stdout or fout:close())[m
[31m-[m
[31m-  -- Optionally dump definitions.[m
[31m-  dumpdef(fout == stdout and stderr or stdout)[m
[31m-end[m
[31m-[m
[31m--- Translate an input file to an output file.[m
[31m-local function translate(infile, outfile)[m
[31m-  g_wbuffer = {}[m
[31m-  g_indent = ""[m
[31m-  g_lineno = 0[m
[31m-  g_synclineno = -1[m
[31m-[m
[31m-  -- Put header.[m
[31m-  wline(dasmhead)[m
[31m-[m
[31m-  -- Read input file.[m
[31m-  local fin[m
[31m-  if infile == "-" then[m
[31m-    g_fname = "(stdin)"[m
[31m-    fin = stdin[m
[31m-  else[m
[31m-    g_fname = infile[m
[31m-    fin = assert(io.open(infile, "r"))[m
[31m-  end[m
[31m-  readfile(fin)[m
[31m-[m
[31m-  -- Check for errors.[m
[31m-  if not g_arch then[m
[31m-    wprinterr(g_fname, ":*: error: missing .arch directive\n")[m
[31m-  end[m
[31m-  checkconds()[m
[31m-  checkmacros()[m
[31m-  checkcaptures()[m
[31m-[m
[31m-  if g_errcount ~= 0 then[m
[31m-    stderr:write(g_fname, ":*: info: ", g_errcount, " error",[m
[31m-      (type(g_errcount) == "number" and g_errcount > 1) and "s" or "",[m
[31m-      " in input file -- no output file generated.\n")[m
[31m-    dumpdef(stderr)[m
[31m-    exit(1)[m
[31m-  end[m
[31m-[m
[31m-  -- Write output file.[m
[31m-  writefile(outfile)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Print help text.[m
[31m-function opt_map.help()[m
[31m-  stdout:write("DynASM -- ", _info.description, ".\n")[m
[31m-  stdout:write("DynASM ", _info.version, " ", _info.release, "  ", _info.url, "\n")[m
[31m-  stdout:write[[[m
[31m-[m
[31m-Usage: dynasm [OPTION]... INFILE.dasc|-[m
[31m-[m
[31m-  -h, --help           Display this help text.[m
[31m-  -V, --version        Display version and copyright information.[m
[31m-[m
[31m-  -o, --outfile FILE   Output file name (default is stdout).[m
[31m-  -I, --include DIR    Add directory to the include search path.[m
[31m-[m
[31m-  -c, --ccomment       Use /* */ comments for assembler lines.[m
[31m-  -C, --cppcomment     Use // comments for assembler lines (default).[m
[31m-  -N, --nocomment      Suppress assembler lines in output.[m
[31m-  -M, --maccomment     Show macro expansions as comments (default off).[m
[31m-[m
[31m-  -L, --nolineno       Suppress CPP line number information in output.[m
[31m-  -F, --flushline      Flush action list for every line.[m
[31m-[m
[31m-  -D NAME[=SUBST]      Define a substitution.[m
[31m-  -U NAME              Undefine a substitution.[m
[31m-[m
[31m-  -P, --dumpdef        Dump defines, macros, etc. Repeat for more output.[m
[31m-  -A, --dumparch ARCH  Load architecture ARCH and dump description.[m
[31m-]][m
[31m-  exit(0)[m
[31m-end[m
[31m-[m
[31m--- Print version information.[m
[31m-function opt_map.version()[m
[31m-  stdout:write(format("%s version %s, released %s\n%s\n\n%s",[m
[31m-    _info.name, _info.version, _info.release, _info.url, _info.copyright))[m
[31m-  exit(0)[m
[31m-end[m
[31m-[m
[31m--- Misc. options.[m
[31m-function opt_map.outfile(args) g_opt.outfile = optparam(args) end[m
[31m-function opt_map.include(args) insert(g_opt.include, 1, optparam(args)) end[m
[31m-function opt_map.ccomment() g_opt.comment = "/*|"; g_opt.endcomment = " */" end[m
[31m-function opt_map.cppcomment() g_opt.comment = "//|"; g_opt.endcomment = "" end[m
[31m-function opt_map.nocomment() g_opt.comment = false end[m
[31m-function opt_map.maccomment() g_opt.maccomment = true end[m
[31m-function opt_map.nolineno() g_opt.cpp = false end[m
[31m-function opt_map.flushline() g_opt.flushline = true end[m
[31m-function opt_map.dumpdef() g_opt.dumpdef = g_opt.dumpdef + 1 end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Short aliases for long options.[m
[31m-local opt_alias = {[m
[31m-  h = "help", ["?"] = "help", V = "version",[m
[31m-  o = "outfile", I = "include",[m
[31m-  c = "ccomment", C = "cppcomment", N = "nocomment", M = "maccomment",[m
[31m-  L = "nolineno", F = "flushline",[m
[31m-  P = "dumpdef", A = "dumparch",[m
[31m-}[m
[31m-[m
[31m--- Parse single option.[m
[31m-local function parseopt(opt, args)[m
[31m-  opt_current = #opt == 1 and "-"..opt or "--"..opt[m
[31m-  local f = opt_map[opt] or opt_map[opt_alias[opt]][m
[31m-  if not f then[m
[31m-    opterror("unrecognized option `", opt_current, "'. Try `--help'.\n")[m
[31m-  end[m
[31m-  f(args)[m
[31m-end[m
[31m-[m
[31m--- Parse arguments.[m
[31m-local function parseargs(args)[m
[31m-  -- Default options.[m
[31m-  g_opt.comment = "//|"[m
[31m-  g_opt.endcomment = ""[m
[31m-  g_opt.cpp = true[m
[31m-  g_opt.dumpdef = 0[m
[31m-  g_opt.include = { "" }[m
[31m-[m
[31m-  -- Process all option arguments.[m
[31m-  args.argn = 1[m
[31m-  repeat[m
[31m-    local a = args[args.argn][m
[31m-    if not a then break end[m
[31m-    local lopt, opt = match(a, "^%-(%-?)(.+)")[m
[31m-    if not opt then break end[m
[31m-    args.argn = args.argn + 1[m
[31m-    if lopt == "" then[m
[31m-      -- Loop through short options.[m
[31m-      for o in gmatch(opt, ".") do parseopt(o, args) end[m
[31m-    else[m
[31m-      -- Long option.[m
[31m-      parseopt(opt, args)[m
[31m-    end[m
[31m-  until false[m
[31m-[m
[31m-  -- Check for proper number of arguments.[m
[31m-  local nargs = #args - args.argn + 1[m
[31m-  if nargs ~= 1 then[m
[31m-    if nargs == 0 then[m
[31m-      if g_opt.dumpdef > 0 then return dumpdef(stdout) end[m
[31m-    end[m
[31m-    opt_map.help()[m
[31m-  end[m
[31m-[m
[31m-  -- Translate a single input file to a single output file[m
[31m-  -- TODO: Handle multiple files?[m
[31m-  translate(args[args.argn], g_opt.outfile)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Add the directory dynasm.lua resides in to the Lua module search path.[m
[31m-local arg = arg[m
[31m-if arg and arg[0] then[m
[31m-  prefix = match(arg[0], "^(.*[/\\])")[m
[31m-  if package and prefix then package.path = prefix.."?.lua;"..package.path end[m
[31m-end[m
[31m-[m
[31m--- Start DynASM.[m
[31m-parseargs{...}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/etc/luajit.1 b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/etc/luajit.1[m
[1mdeleted file mode 100644[m
[1mindex 11e88c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/etc/luajit.1[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-.TH luajit 1 "" "" "LuaJIT documentation"[m
[31m-.SH NAME[m
[31m-luajit \- Just-In-Time Compiler for the Lua Language[m
[31m-\fB[m
[31m-.SH SYNOPSIS[m
[31m-.B luajit[m
[31m-[\fIoptions\fR]... [\fIscript\fR [\fIargs\fR]...][m
[31m-.SH "WEB SITE"[m
[31m-.IR http://luajit.org[m
[31m-.SH DESCRIPTION[m
[31m-.PP[m
[31m-This is the command-line program to run Lua programs with \fBLuaJIT\fR.[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is a just-in-time (JIT) compiler for the Lua language.[m
[31m-The virtual machine (VM) is based on a fast interpreter combined with[m
[31m-a trace compiler. It can significantly improve the performance of Lua programs.[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is API\- and ABI-compatible with the VM of the standard[m
[31m-Lua\ 5.1 interpreter. When embedding the VM into an application,[m
[31m-the built library can be used as a drop-in replacement.[m
[31m-.SH OPTIONS[m
[31m-.TP[m
[31m-.BI "\-e " chunk[m
[31m-Run the given chunk of Lua code.[m
[31m-.TP[m
[31m-.BI "\-l " library[m
[31m-Load the named library, just like \fBrequire("\fR\fIlibrary\fR\fB")\fR.[m
[31m-.TP[m
[31m-.BI "\-b " ...[m
[31m-Save or list bytecode. Run without arguments to get help on options.[m
[31m-.TP[m
[31m-.BI "\-j " command[m
[31m-Perform LuaJIT control command (optional space after \fB\-j\fR).[m
[31m-.TP[m
[31m-.BI "\-O" [opt][m
[31m-Control LuaJIT optimizations.[m
[31m-.TP[m
[31m-.B "\-i"[m
[31m-Run in interactive mode.[m
[31m-.TP[m
[31m-.B "\-v"[m
[31m-Show \fBLuaJIT\fR version.[m
[31m-.TP[m
[31m-.B "\-E"[m
[31m-Ignore environment variables.[m
[31m-.TP[m
[31m-.B "\-\-"[m
[31m-Stop processing options.[m
[31m-.TP[m
[31m-.B "\-"[m
[31m-Read script from stdin instead.[m
[31m-.PP[m
[31m-After all options are processed, the given \fIscript\fR is run.[m
[31m-The arguments are passed in the global \fIarg\fR table.[m
[31m-.PP[m
[31m-Interactive mode is only entered, if no \fIscript\fR and no \fB\-e\fR[m
[31m-option is given. Interactive mode can be left with EOF (\fICtrl\-Z\fB).[m
[31m-.SH EXAMPLES[m
[31m-.TP[m
[31m-luajit hello.lua world[m
[31m-[m
[31m-Prints "Hello world", assuming \fIhello.lua\fR contains:[m
[31m-.br[m
[31m-  print("Hello", arg[1])[m
[31m-.TP[m
[31m-luajit \-e "local x=0; for i=1,1e9 do x=x+i end; print(x)"[m
[31m-[m
[31m-Calculates the sum of the numbers from 1 to 1000000000.[m
[31m-.br[m
[31m-And finishes in a reasonable amount of time, too.[m
[31m-.TP[m
[31m-luajit \-jv \-e "for i=1,10 do for j=1,10 do for k=1,100 do end end end"[m
[31m-[m
[31m-Runs some nested loops and shows the resulting traces.[m
[31m-.SH COPYRIGHT[m
[31m-.PP[m
[31m-\fBLuaJIT\fR is Copyright \(co 2005-2016 Mike Pall.[m
[31m-.br[m
[31m-\fBLuaJIT\fR is open source software, released under the MIT license.[m
[31m-.SH SEE ALSO[m
[31m-.PP[m
[31m-More details in the provided HTML docs or at:[m
[31m-.IR http://luajit.org[m
[31m-.br[m
[31m-More about the Lua language can be found at:[m
[31m-.IR http://lua.org/docs.html[m
[31m-.PP[m
[31m-lua(1)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/etc/luajit.pc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/etc/luajit.pc[m
[1mdeleted file mode 100644[m
[1mindex 0fdd1ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/etc/luajit.pc[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-# Package information for LuaJIT to be used by pkg-config.[m
[31m-majver=2[m
[31m-minver=1[m
[31m-relver=0[m
[31m-version=${majver}.${minver}.${relver}-beta2[m
[31m-abiver=5.1[m
[31m-[m
[31m-prefix=/usr/local[m
[31m-multilib=lib[m
[31m-exec_prefix=${prefix}[m
[31m-libdir=${exec_prefix}/${multilib}[m
[31m-libname=luajit-${abiver}[m
[31m-includedir=${prefix}/include/luajit-${majver}.${minver}[m
[31m-[m
[31m-INSTALL_LMOD=${prefix}/share/lua/${abiver}[m
[31m-INSTALL_CMOD=${prefix}/${multilib}/lua/${abiver}[m
[31m-[m
[31m-Name: LuaJIT[m
[31m-Description: Just-in-time compiler for Lua[m
[31m-URL: http://luajit.org[m
[31m-Version: ${version}[m
[31m-Requires:[m
[31m-Libs: -L${libdir} -l${libname}[m
[31m-Libs.private: -Wl,-E -lm -ldl[m
[31m-Cflags: -I${includedir}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 1a30573..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-luajit[m
[31m-lj_bcdef.h[m
[31m-lj_ffdef.h[m
[31m-lj_libdef.h[m
[31m-lj_recdef.h[m
[31m-lj_folddef.h[m
[31m-lj_vm.[sS][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f25192..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,712 +0,0 @@[m
[31m-##############################################################################[m
[31m-# LuaJIT Makefile. Requires GNU Make.[m
[31m-#[m
[31m-# Please read doc/install.html before changing any variables![m
[31m-#[m
[31m-# Suitable for POSIX platforms (Linux, *BSD, OSX etc.).[m
[31m-# Also works with MinGW and Cygwin on Windows.[m
[31m-# Please check msvcbuild.bat for building with MSVC on Windows.[m
[31m-#[m
[31m-# Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-##############################################################################[m
[31m-[m
[31m-MAJVER=  2[m
[31m-MINVER=  1[m
[31m-RELVER=  0[m
[31m-ABIVER=  5.1[m
[31m-NODOTABIVER= 51[m
[31m-[m
[31m-##############################################################################[m
[31m-#############################  COMPILER OPTIONS  #############################[m
[31m-##############################################################################[m
[31m-# These options mainly affect the speed of the JIT compiler itself, not the[m
[31m-# speed of the JIT-compiled code. Turn any of the optional settings on by[m
[31m-# removing the '#' in front of them. Make sure you force a full recompile[m
[31m-# with "make clean", followed by "make" if you change any options.[m
[31m-#[m
[31m-DEFAULT_CC = gcc[m
[31m-#[m
[31m-# LuaJIT builds as a native 32 or 64 bit binary by default.[m
[31m-CC= $(DEFAULT_CC)[m
[31m-#[m
[31m-# Use this if you want to force a 32 bit build on a 64 bit multilib OS.[m
[31m-#CC= $(DEFAULT_CC) -m32[m
[31m-#[m
[31m-# Since the assembler part does NOT maintain a frame pointer, it's pointless[m
[31m-# to slow down the C part by not omitting it. Debugging, tracebacks and[m
[31m-# unwinding are not affected -- the assembler part has frame unwind[m
[31m-# information and GCC emits it where needed (x64) or with -g (see CCDEBUG).[m
[31m-CCOPT= -O2 -fomit-frame-pointer[m
[31m-# Use this if you want to generate a smaller binary (but it's slower):[m
[31m-#CCOPT= -Os -fomit-frame-pointer[m
[31m-# Note: it's no longer recommended to use -O3 with GCC 4.x.[m
[31m-# The I-Cache bloat usually outweighs the benefits from aggressive inlining.[m
[31m-#[m
[31m-# Target-specific compiler options:[m
[31m-#[m
[31m-# x86/x64 only: For GCC 4.2 or higher and if you don't intend to distribute[m
[31m-# the binaries to a different machine you could also use: -march=native[m
[31m-#[m
[31m-CCOPT_x86= -march=i686 -msse -msse2 -mfpmath=sse[m
[31m-CCOPT_x64=[m
[31m-CCOPT_arm=[m
[31m-CCOPT_arm64=[m
[31m-CCOPT_ppc=[m
[31m-CCOPT_mips=[m
[31m-#[m
[31m-CCDEBUG=[m
[31m-# Uncomment the next line to generate debug information:[m
[31m-#CCDEBUG= -g[m
[31m-#[m
[31m-CCWARN= -Wall[m
[31m-# Uncomment the next line to enable more warnings:[m
[31m-#CCWARN+= -Wextra -Wdeclaration-after-statement -Wredundant-decls -Wshadow -Wpointer-arith[m
[31m-#[m
[31m-##############################################################################[m
[31m-[m
[31m-##############################################################################[m
[31m-################################  BUILD MODE  ################################[m
[31m-##############################################################################[m
[31m-# The default build mode is mixed mode on POSIX. On Windows this is the same[m
[31m-# as dynamic mode.[m
[31m-#[m
[31m-# Mixed mode creates a static + dynamic library and a statically linked luajit.[m
[31m-BUILDMODE= mixed[m
[31m-#[m
[31m-# Static mode creates a static library and a statically linked luajit.[m
[31m-#BUILDMODE= static[m
[31m-#[m
[31m-# Dynamic mode creates a dynamic library and a dynamically linked luajit.[m
[31m-# Note: this executable will only run when the library is installed![m
[31m-#BUILDMODE= dynamic[m
[31m-#[m
[31m-##############################################################################[m
[31m-[m
[31m-##############################################################################[m
[31m-#################################  FEATURES  #################################[m
[31m-##############################################################################[m
[31m-# Enable/disable these features as needed, but make sure you force a full[m
[31m-# recompile with "make clean", followed by "make".[m
[31m-XCFLAGS=[m
[31m-#[m
[31m-# Permanently disable the FFI extension to reduce the size of the LuaJIT[m
[31m-# executable. But please consider that the FFI library is compiled-in,[m
[31m-# but NOT loaded by default. It only allocates any memory, if you actually[m
[31m-# make use of it.[m
[31m-#XCFLAGS+= -DLUAJIT_DISABLE_FFI[m
[31m-#[m
[31m-# Features from Lua 5.2 that are unlikely to break existing code are[m
[31m-# enabled by default. Some other features that *might* break some existing[m
[31m-# code (e.g. __pairs or os.execute() return values) can be enabled here.[m
[31m-# Note: this does not provide full compatibility with Lua 5.2 at this time.[m
[31m-#XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT[m
[31m-#[m
[31m-# Disable the JIT compiler, i.e. turn LuaJIT into a pure interpreter.[m
[31m-#XCFLAGS+= -DLUAJIT_DISABLE_JIT[m
[31m-#[m
[31m-# Some architectures (e.g. PPC) can use either single-number (1) or[m
[31m-# dual-number (2) mode. Uncomment one of these lines to override the[m
[31m-# default mode. Please see LJ_ARCH_NUMMODE in lj_arch.h for details.[m
[31m-#XCFLAGS+= -DLUAJIT_NUMMODE=1[m
[31m-#XCFLAGS+= -DLUAJIT_NUMMODE=2[m
[31m-#[m
[31m-##############################################################################[m
[31m-[m
[31m-##############################################################################[m
[31m-############################  DEBUGGING SUPPORT  #############################[m
[31m-##############################################################################[m
[31m-# Enable these options as needed, but make sure you force a full recompile[m
[31m-# with "make clean", followed by "make".[m
[31m-# Note that most of these are NOT suitable for benchmarking or release mode![m
[31m-#[m
[31m-# Use the system provided memory allocator (realloc) instead of the[m
[31m-# bundled memory allocator. This is slower, but sometimes helpful for[m
[31m-# debugging. This option cannot be enabled on x64, since realloc usually[m
[31m-# doesn't return addresses in the right address range.[m
[31m-# OTOH this option is mandatory for Valgrind's memcheck tool on x64 and[m
[31m-# the only way to get useful results from it for all other architectures.[m
[31m-#XCFLAGS+= -DLUAJIT_USE_SYSMALLOC[m
[31m-#[m
[31m-# This define is required to run LuaJIT under Valgrind. The Valgrind[m
[31m-# header files must be installed. You should enable debug information, too.[m
[31m-# Use --suppressions=lj.supp to avoid some false positives.[m
[31m-#XCFLAGS+= -DLUAJIT_USE_VALGRIND[m
[31m-#[m
[31m-# This is the client for the GDB JIT API. GDB 7.0 or higher is required[m
[31m-# to make use of it. See lj_gdbjit.c for details. Enabling this causes[m
[31m-# a non-negligible overhead, even when not running under GDB.[m
[31m-#XCFLAGS+= -DLUAJIT_USE_GDBJIT[m
[31m-#[m
[31m-# Turn on assertions for the Lua/C API to debug problems with lua_* calls.[m
[31m-# This is rather slow -- use only while developing C libraries/embeddings.[m
[31m-#XCFLAGS+= -DLUA_USE_APICHECK[m
[31m-#[m
[31m-# Turn on assertions for the whole LuaJIT VM. This significantly slows down[m
[31m-# everything. Use only if you suspect a problem with LuaJIT itself.[m
[31m-#XCFLAGS+= -DLUA_USE_ASSERT[m
[31m-#[m
[31m-##############################################################################[m
[31m-# You probably don't need to change anything below this line![m
[31m-##############################################################################[m
[31m-[m
[31m-##############################################################################[m
[31m-# Host system detection.[m
[31m-##############################################################################[m
[31m-[m
[31m-ifeq (Windows,$(findstring Windows,$(OS))$(MSYSTEM)$(TERM))[m
[31m-  HOST_SYS= Windows[m
[31m-  HOST_RM= del[m
[31m-else[m
[31m-  HOST_SYS:= $(shell uname -s)[m
[31m-  ifneq (,$(findstring MINGW,$(HOST_SYS)))[m
[31m-    HOST_SYS= Windows[m
[31m-    HOST_MSYS= mingw[m
[31m-  endif[m
[31m-  ifneq (,$(findstring CYGWIN,$(HOST_SYS)))[m
[31m-    HOST_SYS= Windows[m
[31m-    HOST_MSYS= cygwin[m
[31m-  endif[m
[31m-  # Use Clang for OSX host.[m
[31m-  ifeq (Darwin,$(HOST_SYS))[m
[31m-    DEFAULT_CC= clang[m
[31m-  endif[m
[31m-endif[m
[31m-[m
[31m-##############################################################################[m
[31m-# Flags and options for host and target.[m
[31m-##############################################################################[m
[31m-[m
[31m-# You can override the following variables at the make command line:[m
[31m-#   CC       HOST_CC       STATIC_CC       DYNAMIC_CC[m
[31m-#   CFLAGS   HOST_CFLAGS   TARGET_CFLAGS[m
[31m-#   LDFLAGS  HOST_LDFLAGS  TARGET_LDFLAGS  TARGET_SHLDFLAGS[m
[31m-#   LIBS     HOST_LIBS     TARGET_LIBS[m
[31m-#   CROSS    HOST_SYS      TARGET_SYS      TARGET_FLAGS[m
[31m-#[m
[31m-# Cross-compilation examples:[m
[31m-#   make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows[m
[31m-#   make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-[m
[31m-[m
[31m-ASOPTIONS= $(CCOPT) $(CCWARN) $(XCFLAGS) $(CFLAGS)[m
[31m-CCOPTIONS= $(CCDEBUG) $(ASOPTIONS)[m
[31m-LDOPTIONS= $(CCDEBUG) $(LDFLAGS)[m
[31m-[m
[31m-HOST_CC= $(CC)[m
[31m-HOST_RM= rm -f[m
[31m-# If left blank, minilua is built and used. You can supply an installed[m
[31m-# copy of (plain) Lua 5.1 or 5.2, plus Lua BitOp. E.g. with: HOST_LUA=lua[m
[31m-HOST_LUA=[m
[31m-[m
[31m-HOST_XCFLAGS= -I.[m
[31m-HOST_XLDFLAGS=[m
[31m-HOST_XLIBS=[m
[31m-HOST_ACFLAGS= $(CCOPTIONS) $(HOST_XCFLAGS) $(TARGET_ARCH) $(HOST_CFLAGS)[m
[31m-HOST_ALDFLAGS= $(LDOPTIONS) $(HOST_XLDFLAGS) $(HOST_LDFLAGS)[m
[31m-HOST_ALIBS= $(HOST_XLIBS) $(LIBS) $(HOST_LIBS)[m
[31m-[m
[31m-STATIC_CC = $(CROSS)$(CC)[m
[31m-DYNAMIC_CC = $(CROSS)$(CC) -fPIC[m
[31m-TARGET_CC= $(STATIC_CC)[m
[31m-TARGET_STCC= $(STATIC_CC)[m
[31m-TARGET_DYNCC= $(DYNAMIC_CC)[m
[31m-TARGET_LD= $(CROSS)$(CC)[m
[31m-TARGET_AR= $(CROSS)ar rcus[m
[31m-TARGET_STRIP= $(CROSS)strip[m
[31m-[m
[31m-TARGET_LIBPATH= $(or $(PREFIX),/usr/local)/$(or $(MULTILIB),lib)[m
[31m-TARGET_SONAME= libluajit-$(ABIVER).so.$(MAJVER)[m
[31m-TARGET_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).dylib[m
[31m-TARGET_DYLIBPATH= $(TARGET_LIBPATH)/$(TARGET_DYLIBNAME)[m
[31m-TARGET_DLLNAME= lua$(NODOTABIVER).dll[m
[31m-TARGET_XSHLDFLAGS= -shared -fPIC -Wl,-soname,$(TARGET_SONAME)[m
[31m-TARGET_DYNXLDOPTS=[m
[31m-[m
[31m-TARGET_LFSFLAGS= -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE[m
[31m-TARGET_XCFLAGS= $(TARGET_LFSFLAGS) -U_FORTIFY_SOURCE[m
[31m-TARGET_XLDFLAGS=[m
[31m-TARGET_XLIBS= -lm[m
[31m-TARGET_TCFLAGS= $(CCOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS)[m
[31m-TARGET_ACFLAGS= $(CCOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS)[m
[31m-TARGET_ASFLAGS= $(ASOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS)[m
[31m-TARGET_ALDFLAGS= $(LDOPTIONS) $(TARGET_XLDFLAGS) $(TARGET_FLAGS) $(TARGET_LDFLAGS)[m
[31m-TARGET_ASHLDFLAGS= $(LDOPTIONS) $(TARGET_XSHLDFLAGS) $(TARGET_FLAGS) $(TARGET_SHLDFLAGS)[m
[31m-TARGET_ALIBS= $(TARGET_XLIBS) $(LIBS) $(TARGET_LIBS)[m
[31m-[m
[31m-TARGET_TESTARCH=$(shell $(TARGET_CC) $(TARGET_TCFLAGS) -E lj_arch.h -dM)[m
[31m-ifneq (,$(findstring LJ_TARGET_X64 ,$(TARGET_TESTARCH)))[m
[31m-  TARGET_LJARCH= x64[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_X86 ,$(TARGET_TESTARCH)))[m
[31m-  TARGET_LJARCH= x86[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_ARM ,$(TARGET_TESTARCH)))[m
[31m-  TARGET_LJARCH= arm[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_ARM64 ,$(TARGET_TESTARCH)))[m
[31m-  TARGET_LJARCH= arm64[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_PPC ,$(TARGET_TESTARCH)))[m
[31m-  ifneq (,$(findstring LJ_LE 1,$(TARGET_TESTARCH)))[m
[31m-    TARGET_ARCH= -DLJ_ARCH_ENDIAN=LUAJIT_LE[m
[31m-  else[m
[31m-    TARGET_ARCH= -DLJ_ARCH_ENDIAN=LUAJIT_BE[m
[31m-  endif[m
[31m-  TARGET_LJARCH= ppc[m
[31m-else[m
[31m-ifneq (,$(findstring LJ_TARGET_MIPS ,$(TARGET_TESTARCH)))[m
[31m-  ifneq (,$(findstring MIPSEL ,$(TARGET_TESTARCH)))[m
[31m-    TARGET_ARCH= -D__MIPSEL__=1[m
[31m-  endif[m
[31m-  TARGET_LJARCH= mips[m
[31m-else[m
[31m-  $(error Unsupported target architecture)[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-[m
[31m-ifneq (,$(findstring LJ_TARGET_PS3 1,$(TARGET_TESTARCH)))[m
[31m-  TARGET_SYS= PS3[m
[31m-  TARGET_ARCH+= -D__CELLOS_LV2__[m
[31m-  TARGET_XCFLAGS+= -DLUAJIT_USE_SYSMALLOC[m
[31m-  TARGET_XLIBS+= -lpthread[m
[31m-endif[m
[31m-[m
[31m-TARGET_XCFLAGS+= $(CCOPT_$(TARGET_LJARCH))[m
[31m-TARGET_ARCH+= $(patsubst %,-DLUAJIT_TARGET=LUAJIT_ARCH_%,$(TARGET_LJARCH))[m
[31m-[m
[31m-ifneq (,$(PREFIX))[m
[31m-ifneq (/usr/local,$(PREFIX))[m
[31m-  TARGET_XCFLAGS+= -DLUA_ROOT=\"$(PREFIX)\"[m
[31m-  ifneq (/usr,$(PREFIX))[m
[31m-    TARGET_DYNXLDOPTS= -Wl,-rpath,$(TARGET_LIBPATH)[m
[31m-  endif[m
[31m-endif[m
[31m-endif[m
[31m-ifneq (,$(MULTILIB))[m
[31m-  TARGET_XCFLAGS+= -DLUA_MULTILIB=\"$(MULTILIB)\"[m
[31m-endif[m
[31m-ifneq (,$(LMULTILIB))[m
[31m-  TARGET_XCFLAGS+= -DLUA_LMULTILIB=\"$(LMULTILIB)\"[m
[31m-endif[m
[31m-[m
[31m-##############################################################################[m
[31m-# Target system detection.[m
[31m-##############################################################################[m
[31m-[m
[31m-TARGET_SYS?= $(HOST_SYS)[m
[31m-ifeq (Windows,$(TARGET_SYS))[m
[31m-  TARGET_STRIP+= --strip-unneeded[m
[31m-  TARGET_XSHLDFLAGS= -shared[m
[31m-  TARGET_DYNXLDOPTS=[m
[31m-else[m
[31m-ifeq (,$(shell $(TARGET_CC) -o /dev/null -c -x c /dev/null -fno-stack-protector 2>/dev/null || echo 1))[m
[31m-  TARGET_XCFLAGS+= -fno-stack-protector[m
[31m-endif[m
[31m-ifeq (Darwin,$(TARGET_SYS))[m
[31m-  ifeq (,$(MACOSX_DEPLOYMENT_TARGET))[m
[31m-    export MACOSX_DEPLOYMENT_TARGET=10.4[m
[31m-  endif[m
[31m-  TARGET_STRIP+= -x[m
[31m-  TARGET_AR+= 2>/dev/null[m
[31m-  TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC[m
[31m-  TARGET_DYNXLDOPTS=[m
[31m-  TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER)[m
[31m-  ifeq (x64,$(TARGET_LJARCH))[m
[31m-    TARGET_XLDFLAGS+= -pagezero_size 10000 -image_base 100000000[m
[31m-    TARGET_XSHLDFLAGS+= -image_base 7fff04c4a000[m
[31m-  endif[m
[31m-else[m
[31m-ifeq (iOS,$(TARGET_SYS))[m
[31m-  TARGET_STRIP+= -x[m
[31m-  TARGET_AR+= 2>/dev/null[m
[31m-  TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC[m
[31m-  TARGET_DYNXLDOPTS=[m
[31m-  TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER)[m
[31m-  ifeq (arm64,$(TARGET_LJARCH))[m
[31m-    TARGET_XCFLAGS+= -fno-omit-frame-pointer[m
[31m-  endif[m
[31m-else[m
[31m-  ifneq (SunOS,$(TARGET_SYS))[m
[31m-    ifneq (PS3,$(TARGET_SYS))[m
[31m-      TARGET_XLDFLAGS+= -Wl,-E[m
[31m-    endif[m
[31m-  endif[m
[31m-  ifeq (Linux,$(TARGET_SYS))[m
[31m-    TARGET_XLIBS+= -ldl[m
[31m-  endif[m
[31m-  ifeq (GNU/kFreeBSD,$(TARGET_SYS))[m
[31m-    TARGET_XLIBS+= -ldl[m
[31m-  endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-[m
[31m-ifneq ($(HOST_SYS),$(TARGET_SYS))[m
[31m-  ifeq (Windows,$(TARGET_SYS))[m
[31m-    HOST_XCFLAGS+= -malign-double -DLUAJIT_OS=LUAJIT_OS_WINDOWS[m
[31m-  else[m
[31m-  ifeq (Linux,$(TARGET_SYS))[m
[31m-    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_LINUX[m
[31m-  else[m
[31m-  ifeq (Darwin,$(TARGET_SYS))[m
[31m-    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX[m
[31m-  else[m
[31m-  ifeq (iOS,$(TARGET_SYS))[m
[31m-    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX[m
[31m-  else[m
[31m-    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OTHER[m
[31m-  endif[m
[31m-  endif[m
[31m-  endif[m
[31m-  endif[m
[31m-endif[m
[31m-[m
[31m-ifneq (,$(CCDEBUG))[m
[31m-  TARGET_STRIP= @:[m
[31m-endif[m
[31m-[m
[31m-##############################################################################[m
[31m-# Files and pathnames.[m
[31m-##############################################################################[m
[31m-[m
[31m-MINILUA_O= host/minilua.o[m
[31m-MINILUA_LIBS= -lm[m
[31m-MINILUA_T= host/minilua[m
[31m-MINILUA_X= $(MINILUA_T)[m
[31m-[m
[31m-ifeq (,$(HOST_LUA))[m
[31m-  HOST_LUA= $(MINILUA_X)[m
[31m-  DASM_DEP= $(MINILUA_T)[m
[31m-endif[m
[31m-[m
[31m-DASM_DIR= ../dynasm[m
[31m-DASM= $(HOST_LUA) $(DASM_DIR)/dynasm.lua[m
[31m-DASM_XFLAGS=[m
[31m-DASM_AFLAGS=[m
[31m-DASM_ARCH= $(TARGET_LJARCH)[m
[31m-[m
[31m-ifneq (,$(findstring LJ_LE 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D ENDIAN_LE[m
[31m-else[m
[31m-  DASM_AFLAGS+= -D ENDIAN_BE[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_ARCH_BITS 64,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D P64[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_HASJIT 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D JIT[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_HASFFI 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D FFI[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_DUALNUM 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D DUALNUM[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_ARCH_HASFPU 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D FPU[m
[31m-  TARGET_ARCH+= -DLJ_ARCH_HASFPU=1[m
[31m-else[m
[31m-  TARGET_ARCH+= -DLJ_ARCH_HASFPU=0[m
[31m-endif[m
[31m-ifeq (,$(findstring LJ_ABI_SOFTFP 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D HFABI[m
[31m-  TARGET_ARCH+= -DLJ_ABI_SOFTFP=0[m
[31m-else[m
[31m-  TARGET_ARCH+= -DLJ_ABI_SOFTFP=1[m
[31m-endif[m
[31m-ifneq (,$(findstring LJ_NO_UNWIND 1,$(TARGET_TESTARCH)))[m
[31m-  DASM_AFLAGS+= -D NO_UNWIND[m
[31m-  TARGET_ARCH+= -DLUAJIT_NO_UNWIND[m
[31m-endif[m
[31m-DASM_AFLAGS+= -D VER=$(subst LJ_ARCH_VERSION_,,$(filter LJ_ARCH_VERSION_%,$(subst LJ_ARCH_VERSION ,LJ_ARCH_VERSION_,$(TARGET_TESTARCH))))[m
[31m-ifeq (Windows,$(TARGET_SYS))[m
[31m-  DASM_AFLAGS+= -D WIN[m
[31m-endif[m
[31m-ifeq (x64,$(TARGET_LJARCH))[m
[31m-  ifeq (,$(findstring LJ_FR2 1,$(TARGET_TESTARCH)))[m
[31m-    DASM_ARCH= x86[m
[31m-  endif[m
[31m-else[m
[31m-ifeq (arm,$(TARGET_LJARCH))[m
[31m-  ifeq (iOS,$(TARGET_SYS))[m
[31m-    DASM_AFLAGS+= -D IOS[m
[31m-  endif[m
[31m-else[m
[31m-ifeq (ppc,$(TARGET_LJARCH))[m
[31m-  ifneq (,$(findstring LJ_ARCH_SQRT 1,$(TARGET_TESTARCH)))[m
[31m-    DASM_AFLAGS+= -D SQRT[m
[31m-  endif[m
[31m-  ifneq (,$(findstring LJ_ARCH_ROUND 1,$(TARGET_TESTARCH)))[m
[31m-    DASM_AFLAGS+= -D ROUND[m
[31m-  endif[m
[31m-  ifneq (,$(findstring LJ_ARCH_PPC32ON64 1,$(TARGET_TESTARCH)))[m
[31m-    DASM_AFLAGS+= -D GPR64[m
[31m-  endif[m
[31m-  ifeq (PS3,$(TARGET_SYS))[m
[31m-    DASM_AFLAGS+= -D PPE -D TOC[m
[31m-  endif[m
[31m-  ifneq (,$(findstring LJ_ARCH_PPC64 ,$(TARGET_TESTARCH)))[m
[31m-    DASM_ARCH= ppc64[m
[31m-  endif[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-[m
[31m-DASM_FLAGS= $(DASM_XFLAGS) $(DASM_AFLAGS)[m
[31m-DASM_DASC= vm_$(DASM_ARCH).dasc[m
[31m-[m
[31m-BUILDVM_O= host/buildvm.o host/buildvm_asm.o host/buildvm_peobj.o \[m
[31m-	   host/buildvm_lib.o host/buildvm_fold.o[m
[31m-BUILDVM_T= host/buildvm[m
[31m-BUILDVM_X= $(BUILDVM_T)[m
[31m-[m
[31m-HOST_O= $(MINILUA_O) $(BUILDVM_O)[m
[31m-HOST_T= $(MINILUA_T) $(BUILDVM_T)[m
[31m-[m
[31m-LJVM_S= lj_vm.S[m
[31m-LJVM_O= lj_vm.o[m
[31m-LJVM_BOUT= $(LJVM_S)[m
[31m-LJVM_MODE= elfasm[m
[31m-[m
[31m-LJLIB_O= lib_base.o lib_math.o lib_bit.o lib_string.o lib_table.o \[m
[31m-	 lib_io.o lib_os.o lib_package.o lib_debug.o lib_jit.o lib_ffi.o[m
[31m-LJLIB_C= $(LJLIB_O:.o=.c)[m
[31m-[m
[31m-LJCORE_O= lj_gc.o lj_err.o lj_char.o lj_bc.o lj_obj.o lj_buf.o \[m
[31m-	  lj_str.o lj_tab.o lj_func.o lj_udata.o lj_meta.o lj_debug.o \[m
[31m-	  lj_state.o lj_dispatch.o lj_vmevent.o lj_vmmath.o lj_strscan.o \[m
[31m-	  lj_strfmt.o lj_strfmt_num.o lj_api.o lj_profile.o \[m
[31m-	  lj_lex.o lj_parse.o lj_bcread.o lj_bcwrite.o lj_load.o \[m
[31m-	  lj_ir.o lj_opt_mem.o lj_opt_fold.o lj_opt_narrow.o \[m
[31m-	  lj_opt_dce.o lj_opt_loop.o lj_opt_split.o lj_opt_sink.o \[m
[31m-	  lj_mcode.o lj_snap.o lj_record.o lj_crecord.o lj_ffrecord.o \[m
[31m-	  lj_asm.o lj_trace.o lj_gdbjit.o \[m
[31m-	  lj_ctype.o lj_cdata.o lj_cconv.o lj_ccall.o lj_ccallback.o \[m
[31m-	  lj_carith.o lj_clib.o lj_cparse.o \[m
[31m-	  lj_lib.o lj_alloc.o lib_aux.o \[m
[31m-	  $(LJLIB_O) lib_init.o[m
[31m-[m
[31m-LJVMCORE_O= $(LJVM_O) $(LJCORE_O)[m
[31m-LJVMCORE_DYNO= $(LJVMCORE_O:.o=_dyn.o)[m
[31m-[m
[31m-LIB_VMDEF= jit/vmdef.lua[m
[31m-LIB_VMDEFP= $(LIB_VMDEF)[m
[31m-[m
[31m-LUAJIT_O= luajit.o[m
[31m-LUAJIT_A= libluajit.a[m
[31m-LUAJIT_SO= libluajit.so[m
[31m-LUAJIT_T= luajit[m
[31m-[m
[31m-ALL_T= $(LUAJIT_T) $(LUAJIT_A) $(LUAJIT_SO) $(HOST_T)[m
[31m-ALL_HDRGEN= lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h \[m
[31m-	    host/buildvm_arch.h[m
[31m-ALL_GEN= $(LJVM_S) $(ALL_HDRGEN) $(LIB_VMDEFP)[m
[31m-WIN_RM= *.obj *.lib *.exp *.dll *.exe *.manifest *.pdb *.ilk[m
[31m-ALL_RM= $(ALL_T) $(ALL_GEN) *.o host/*.o $(WIN_RM)[m
[31m-[m
[31m-##############################################################################[m
[31m-# Build mode handling.[m
[31m-##############################################################################[m
[31m-[m
[31m-# Mixed mode defaults.[m
[31m-TARGET_O= $(LUAJIT_A)[m
[31m-TARGET_T= $(LUAJIT_T) $(LUAJIT_SO)[m
[31m-TARGET_DEP= $(LIB_VMDEF) $(LUAJIT_SO)[m
[31m-[m
[31m-ifeq (Windows,$(TARGET_SYS))[m
[31m-  TARGET_DYNCC= $(STATIC_CC)[m
[31m-  LJVM_MODE= peobj[m
[31m-  LJVM_BOUT= $(LJVM_O)[m
[31m-  LUAJIT_T= luajit.exe[m
[31m-  ifeq (cygwin,$(HOST_MSYS))[m
[31m-    LUAJIT_SO= cyg$(TARGET_DLLNAME)[m
[31m-  else[m
[31m-    LUAJIT_SO= $(TARGET_DLLNAME)[m
[31m-  endif[m
[31m-  # Mixed mode is not supported on Windows. And static mode doesn't work well.[m
[31m-  # C modules cannot be loaded, because they bind to lua51.dll.[m
[31m-  ifneq (static,$(BUILDMODE))[m
[31m-    BUILDMODE= dynamic[m
[31m-    TARGET_XCFLAGS+= -DLUA_BUILD_AS_DLL[m
[31m-  endif[m
[31m-endif[m
[31m-ifeq (Darwin,$(TARGET_SYS))[m
[31m-  LJVM_MODE= machasm[m
[31m-endif[m
[31m-ifeq (iOS,$(TARGET_SYS))[m
[31m-  LJVM_MODE= machasm[m
[31m-endif[m
[31m-ifeq (SunOS,$(TARGET_SYS))[m
[31m-  BUILDMODE= static[m
[31m-endif[m
[31m-ifeq (PS3,$(TARGET_SYS))[m
[31m-  BUILDMODE= static[m
[31m-endif[m
[31m-[m
[31m-ifeq (Windows,$(HOST_SYS))[m
[31m-  MINILUA_T= host/minilua.exe[m
[31m-  BUILDVM_T= host/buildvm.exe[m
[31m-  ifeq (,$(HOST_MSYS))[m
[31m-    MINILUA_X= host\minilua[m
[31m-    BUILDVM_X= host\buildvm[m
[31m-    ALL_RM:= $(subst /,\,$(ALL_RM))[m
[31m-  endif[m
[31m-endif[m
[31m-[m
[31m-ifeq (static,$(BUILDMODE))[m
[31m-  TARGET_DYNCC= @:[m
[31m-  TARGET_T= $(LUAJIT_T)[m
[31m-  TARGET_DEP= $(LIB_VMDEF)[m
[31m-else[m
[31m-ifeq (dynamic,$(BUILDMODE))[m
[31m-  ifneq (Windows,$(TARGET_SYS))[m
[31m-    TARGET_CC= $(DYNAMIC_CC)[m
[31m-  endif[m
[31m-  TARGET_DYNCC= @:[m
[31m-  LJVMCORE_DYNO= $(LJVMCORE_O)[m
[31m-  TARGET_O= $(LUAJIT_SO)[m
[31m-  TARGET_XLDFLAGS+= $(TARGET_DYNXLDOPTS)[m
[31m-else[m
[31m-ifeq (Darwin,$(TARGET_SYS))[m
[31m-  TARGET_DYNCC= @:[m
[31m-  LJVMCORE_DYNO= $(LJVMCORE_O)[m
[31m-endif[m
[31m-ifeq (iOS,$(TARGET_SYS))[m
[31m-  TARGET_DYNCC= @:[m
[31m-  LJVMCORE_DYNO= $(LJVMCORE_O)[m
[31m-endif[m
[31m-endif[m
[31m-endif[m
[31m-[m
[31m-Q= @[m
[31m-E= @echo[m
[31m-#Q=[m
[31m-#E= @:[m
[31m-[m
[31m-##############################################################################[m
[31m-# Make targets.[m
[31m-##############################################################################[m
[31m-[m
[31m-default all:	$(TARGET_T)[m
[31m-[m
[31m-amalg:[m
[31m-	@grep "^[+|]" ljamalg.c[m
[31m-	$(MAKE) all "LJCORE_O=ljamalg.o"[m
[31m-[m
[31m-clean:[m
[31m-	$(HOST_RM) $(ALL_RM)[m
[31m-[m
[31m-libbc:[m
[31m-	./$(LUAJIT_T) host/genlibbc.lua -o host/buildvm_libbc.h $(LJLIB_C)[m
[31m-	$(MAKE) all[m
[31m-[m
[31m-depend:[m
[31m-	@for file in $(ALL_HDRGEN); do \[m
[31m-	  test -f $$file || touch $$file; \[m
[31m-	  done[m
[31m-	@$(HOST_CC) $(HOST_ACFLAGS) -MM *.c host/*.c | \[m
[31m-	  sed -e "s| [^ ]*/dasm_\S*\.h||g" \[m
[31m-	      -e "s|^\([^l ]\)|host/\1|" \[m
[31m-	      -e "s| lj_target_\S*\.h| lj_target_*.h|g" \[m
[31m-	      -e "s| lj_emit_\S*\.h| lj_emit_*.h|g" \[m
[31m-	      -e "s| lj_asm_\S*\.h| lj_asm_*.h|g" >Makefile.dep[m
[31m-	@for file in $(ALL_HDRGEN); do \[m
[31m-	  test -s $$file || $(HOST_RM) $$file; \[m
[31m-	  done[m
[31m-[m
[31m-.PHONY: default all amalg clean libbc depend[m
[31m-[m
[31m-##############################################################################[m
[31m-# Rules for generated files.[m
[31m-##############################################################################[m
[31m-[m
[31m-$(MINILUA_T): $(MINILUA_O)[m
[31m-	$(E) "HOSTLINK  $@"[m
[31m-	$(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(MINILUA_O) $(MINILUA_LIBS) $(HOST_ALIBS)[m
[31m-[m
[31m-host/buildvm_arch.h: $(DASM_DASC) $(DASM_DEP) $(DASM_DIR)/*.lua[m
[31m-	$(E) "DYNASM    $@"[m
[31m-	$(Q)$(DASM) $(DASM_FLAGS) -o $@ $(DASM_DASC)[m
[31m-[m
[31m-host/buildvm.o: $(DASM_DIR)/dasm_*.h[m
[31m-[m
[31m-$(BUILDVM_T): $(BUILDVM_O)[m
[31m-	$(E) "HOSTLINK  $@"[m
[31m-	$(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(BUILDVM_O) $(HOST_ALIBS)[m
[31m-[m
[31m-$(LJVM_BOUT): $(BUILDVM_T)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m $(LJVM_MODE) -o $@[m
[31m-[m
[31m-lj_bcdef.h: $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m bcdef -o $@ $(LJLIB_C)[m
[31m-[m
[31m-lj_ffdef.h: $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m ffdef -o $@ $(LJLIB_C)[m
[31m-[m
[31m-lj_libdef.h: $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m libdef -o $@ $(LJLIB_C)[m
[31m-[m
[31m-lj_recdef.h: $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m recdef -o $@ $(LJLIB_C)[m
[31m-[m
[31m-$(LIB_VMDEF): $(BUILDVM_T) $(LJLIB_C)[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m vmdef -o $(LIB_VMDEFP) $(LJLIB_C)[m
[31m-[m
[31m-lj_folddef.h: $(BUILDVM_T) lj_opt_fold.c[m
[31m-	$(E) "BUILDVM   $@"[m
[31m-	$(Q)$(BUILDVM_X) -m folddef -o $@ lj_opt_fold.c[m
[31m-[m
[31m-##############################################################################[m
[31m-# Object file rules.[m
[31m-##############################################################################[m
[31m-[m
[31m-%.o: %.c[m
[31m-	$(E) "CC        $@"[m
[31m-	$(Q)$(TARGET_DYNCC) $(TARGET_ACFLAGS) -c -o $(@:.o=_dyn.o) $<[m
[31m-	$(Q)$(TARGET_CC) $(TARGET_ACFLAGS) -c -o $@ $<[m
[31m-[m
[31m-%.o: %.S[m
[31m-	$(E) "ASM       $@"[m
[31m-	$(Q)$(TARGET_DYNCC) $(TARGET_ASFLAGS) -c -o $(@:.o=_dyn.o) $<[m
[31m-	$(Q)$(TARGET_CC) $(TARGET_ASFLAGS) -c -o $@ $<[m
[31m-[m
[31m-$(LUAJIT_O):[m
[31m-	$(E) "CC        $@"[m
[31m-	$(Q)$(TARGET_STCC) $(TARGET_ACFLAGS) -c -o $@ $<[m
[31m-[m
[31m-$(HOST_O): %.o: %.c[m
[31m-	$(E) "HOSTCC    $@"[m
[31m-	$(Q)$(HOST_CC) $(HOST_ACFLAGS) -c -o $@ $<[m
[31m-[m
[31m-include Makefile.dep[m
[31m-[m
[31m-##############################################################################[m
[31m-# Target file rules.[m
[31m-##############################################################################[m
[31m-[m
[31m-$(LUAJIT_A): $(LJVMCORE_O)[m
[31m-	$(E) "AR        $@"[m
[31m-	$(Q)$(TARGET_AR) $@ $(LJVMCORE_O)[m
[31m-[m
[31m-# The dependency on _O, but linking with _DYNO is intentional.[m
[31m-$(LUAJIT_SO): $(LJVMCORE_O)[m
[31m-	$(E) "DYNLINK   $@"[m
[31m-	$(Q)$(TARGET_LD) $(TARGET_ASHLDFLAGS) -o $@ $(LJVMCORE_DYNO) $(TARGET_ALIBS)[m
[31m-	$(Q)$(TARGET_STRIP) $@[m
[31m-[m
[31m-$(LUAJIT_T): $(TARGET_O) $(LUAJIT_O) $(TARGET_DEP)[m
[31m-	$(E) "LINK      $@"[m
[31m-	$(Q)$(TARGET_LD) $(TARGET_ALDFLAGS) -o $@ $(LUAJIT_O) $(TARGET_O) $(TARGET_ALIBS)[m
[31m-	$(Q)$(TARGET_STRIP) $@[m
[31m-	$(E) "OK        Successfully built LuaJIT"[m
[31m-[m
[31m-##############################################################################[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/Makefile.dep b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/Makefile.dep[m
[1mdeleted file mode 100644[m
[1mindex 2c329f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/Makefile.dep[m
[1m+++ /dev/null[m
[36m@@ -1,246 +0,0 @@[m
[31m-lib_aux.o: lib_aux.c lua.h luaconf.h lauxlib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_err.h lj_errmsg.h lj_state.h lj_trace.h lj_jit.h lj_ir.h \[m
[31m- lj_dispatch.h lj_bc.h lj_traceerr.h lj_lib.h lj_alloc.h[m
[31m-lib_base.o: lib_base.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h \[m
[31m- lj_tab.h lj_meta.h lj_state.h lj_ctype.h lj_cconv.h lj_bc.h lj_ff.h \[m
[31m- lj_ffdef.h lj_dispatch.h lj_jit.h lj_ir.h lj_char.h lj_strscan.h \[m
[31m- lj_strfmt.h lj_lib.h lj_libdef.h[m
[31m-lib_bit.o: lib_bit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_strscan.h \[m
[31m- lj_strfmt.h lj_ctype.h lj_cdata.h lj_cconv.h lj_carith.h lj_ff.h \[m
[31m- lj_ffdef.h lj_lib.h lj_libdef.h[m
[31m-lib_debug.o: lib_debug.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_lib.h \[m
[31m- lj_libdef.h[m
[31m-lib_ffi.o: lib_ffi.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_meta.h \[m
[31m- lj_ctype.h lj_cparse.h lj_cdata.h lj_cconv.h lj_carith.h lj_ccall.h \[m
[31m- lj_ccallback.h lj_clib.h lj_strfmt.h lj_ff.h lj_ffdef.h lj_lib.h \[m
[31m- lj_libdef.h[m
[31m-lib_init.o: lib_init.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h[m
[31m-lib_io.o: lib_io.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_state.h \[m
[31m- lj_strfmt.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h[m
[31m-lib_jit.o: lib_jit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h \[m
[31m- lj_state.h lj_bc.h lj_ctype.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h \[m
[31m- lj_target.h lj_target_*.h lj_trace.h lj_dispatch.h lj_traceerr.h \[m
[31m- lj_vm.h lj_vmevent.h lj_lib.h luajit.h lj_libdef.h[m
[31m-lib_math.o: lib_math.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_lib.h lj_vm.h lj_libdef.h[m
[31m-lib_os.o: lib_os.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_lib.h \[m
[31m- lj_libdef.h[m
[31m-lib_package.o: lib_package.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_err.h lj_errmsg.h lj_lib.h[m
[31m-lib_string.o: lib_string.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h \[m
[31m- lj_tab.h lj_meta.h lj_state.h lj_ff.h lj_ffdef.h lj_bcdump.h lj_lex.h \[m
[31m- lj_char.h lj_strfmt.h lj_lib.h lj_libdef.h[m
[31m-lib_table.o: lib_table.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \[m
[31m- lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h \[m
[31m- lj_tab.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h[m
[31m-lj_alloc.o: lj_alloc.c lj_def.h lua.h luaconf.h lj_arch.h lj_alloc.h[m
[31m-lj_api.o: lj_api.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_func.h lj_udata.h \[m
[31m- lj_meta.h lj_state.h lj_bc.h lj_frame.h lj_trace.h lj_jit.h lj_ir.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_vm.h lj_strscan.h lj_strfmt.h[m
[31m-lj_asm.o: lj_asm.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h lj_ir.h lj_jit.h \[m
[31m- lj_ircall.h lj_iropt.h lj_mcode.h lj_trace.h lj_dispatch.h lj_traceerr.h \[m
[31m- lj_snap.h lj_asm.h lj_vm.h lj_target.h lj_target_*.h lj_emit_*.h \[m
[31m- lj_asm_*.h[m
[31m-lj_bc.o: lj_bc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_bc.h \[m
[31m- lj_bcdef.h[m
[31m-lj_bcread.o: lj_bcread.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_bc.h \[m
[31m- lj_ctype.h lj_cdata.h lualib.h lj_lex.h lj_bcdump.h lj_state.h \[m
[31m- lj_strfmt.h[m
[31m-lj_bcwrite.o: lj_bcwrite.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_buf.h lj_str.h lj_bc.h lj_ctype.h lj_dispatch.h lj_jit.h \[m
[31m- lj_ir.h lj_strfmt.h lj_bcdump.h lj_lex.h lj_err.h lj_errmsg.h lj_vm.h[m
[31m-lj_buf.o: lj_buf.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_strfmt.h[m
[31m-lj_carith.o: lj_carith.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_meta.h lj_ir.h lj_ctype.h \[m
[31m- lj_cconv.h lj_cdata.h lj_carith.h lj_strscan.h[m
[31m-lj_ccall.o: lj_ccall.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_cconv.h lj_cdata.h \[m
[31m- lj_ccall.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_bc.h \[m
[31m- lj_traceerr.h[m
[31m-lj_ccallback.o: lj_ccallback.c lj_obj.h lua.h luaconf.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_state.h lj_frame.h \[m
[31m- lj_bc.h lj_ctype.h lj_cconv.h lj_ccall.h lj_ccallback.h lj_target.h \[m
[31m- lj_target_*.h lj_mcode.h lj_jit.h lj_ir.h lj_trace.h lj_dispatch.h \[m
[31m- lj_traceerr.h lj_vm.h[m
[31m-lj_cconv.o: lj_cconv.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_gc.h lj_cdata.h lj_cconv.h \[m
[31m- lj_ccallback.h[m
[31m-lj_cdata.o: lj_cdata.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_cconv.h lj_cdata.h[m
[31m-lj_char.o: lj_char.c lj_char.h lj_def.h lua.h luaconf.h[m
[31m-lj_clib.o: lj_clib.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_tab.h lj_str.h lj_udata.h lj_ctype.h lj_cconv.h \[m
[31m- lj_cdata.h lj_clib.h lj_strfmt.h[m
[31m-lj_cparse.o: lj_cparse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_ctype.h lj_cparse.h \[m
[31m- lj_frame.h lj_bc.h lj_vm.h lj_char.h lj_strscan.h lj_strfmt.h[m
[31m-lj_crecord.o: lj_crecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h lj_gc.h \[m
[31m- lj_cdata.h lj_cparse.h lj_cconv.h lj_carith.h lj_clib.h lj_ccall.h \[m
[31m- lj_ff.h lj_ffdef.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_record.h lj_ffrecord.h lj_snap.h \[m
[31m- lj_crecord.h lj_strfmt.h[m
[31m-lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_strfmt.h lj_ctype.h \[m
[31m- lj_ccallback.h lj_buf.h[m
[31m-lj_debug.o: lj_debug.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_debug.h lj_buf.h lj_gc.h lj_str.h lj_tab.h \[m
[31m- lj_state.h lj_frame.h lj_bc.h lj_strfmt.h lj_jit.h lj_ir.h[m
[31m-lj_dispatch.o: lj_dispatch.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_func.h lj_tab.h \[m
[31m- lj_meta.h lj_debug.h lj_state.h lj_frame.h lj_bc.h lj_ff.h lj_ffdef.h \[m
[31m- lj_strfmt.h lj_jit.h lj_ir.h lj_ccallback.h lj_ctype.h lj_trace.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_profile.h lj_vm.h luajit.h[m
[31m-lj_err.o: lj_err.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_err.h \[m
[31m- lj_errmsg.h lj_debug.h lj_str.h lj_func.h lj_state.h lj_frame.h lj_bc.h \[m
[31m- lj_ff.h lj_ffdef.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h \[m
[31m- lj_traceerr.h lj_vm.h lj_strfmt.h[m
[31m-lj_ffrecord.o: lj_ffrecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ff.h \[m
[31m- lj_ffdef.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_record.h lj_ffrecord.h lj_crecord.h \[m
[31m- lj_vm.h lj_strscan.h lj_strfmt.h lj_recdef.h[m
[31m-lj_func.o: lj_func.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_func.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_bc.h \[m
[31m- lj_traceerr.h lj_vm.h[m
[31m-lj_gc.o: lj_gc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_func.h lj_udata.h \[m
[31m- lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_cdata.h lj_trace.h \[m
[31m- lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h[m
[31m-lj_gdbjit.o: lj_gdbjit.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_frame.h lj_bc.h lj_buf.h \[m
[31m- lj_str.h lj_strfmt.h lj_jit.h lj_ir.h lj_dispatch.h[m
[31m-lj_ir.o: lj_ir.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_buf.h lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h \[m
[31m- lj_trace.h lj_dispatch.h lj_bc.h lj_traceerr.h lj_ctype.h lj_cdata.h \[m
[31m- lj_carith.h lj_vm.h lj_strscan.h lj_strfmt.h lj_lib.h[m
[31m-lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_ctype.h lj_cdata.h \[m
[31m- lualib.h lj_state.h lj_lex.h lj_parse.h lj_char.h lj_strscan.h \[m
[31m- lj_strfmt.h[m
[31m-lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \[m
[31m- lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_strscan.h lj_strfmt.h lj_lex.h \[m
[31m- lj_bcdump.h lj_lib.h[m
[31m-lj_load.o: lj_load.c lua.h luaconf.h lauxlib.h lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_func.h \[m
[31m- lj_frame.h lj_bc.h lj_vm.h lj_lex.h lj_bcdump.h lj_parse.h[m
[31m-lj_mcode.o: lj_mcode.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_jit.h lj_ir.h lj_mcode.h lj_trace.h \[m
[31m- lj_dispatch.h lj_bc.h lj_traceerr.h lj_vm.h[m
[31m-lj_meta.o: lj_meta.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_meta.h lj_frame.h \[m
[31m- lj_bc.h lj_vm.h lj_strscan.h lj_strfmt.h lj_lib.h[m
[31m-lj_obj.o: lj_obj.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h[m
[31m-lj_opt_dce.o: lj_opt_dce.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_ir.h lj_jit.h lj_iropt.h[m
[31m-lj_opt_fold.o: lj_opt_fold.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_buf.h lj_gc.h lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_ircall.h \[m
[31m- lj_iropt.h lj_trace.h lj_dispatch.h lj_bc.h lj_traceerr.h lj_ctype.h \[m
[31m- lj_carith.h lj_vm.h lj_strscan.h lj_strfmt.h lj_folddef.h[m
[31m-lj_opt_loop.o: lj_opt_loop.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_ir.h lj_jit.h \[m
[31m- lj_iropt.h lj_trace.h lj_dispatch.h lj_bc.h lj_traceerr.h lj_snap.h \[m
[31m- lj_vm.h[m
[31m-lj_opt_mem.o: lj_opt_mem.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_ircall.h[m
[31m-lj_opt_narrow.o: lj_opt_narrow.c lj_obj.h lua.h luaconf.h lj_def.h \[m
[31m- lj_arch.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \[m
[31m- lj_traceerr.h lj_vm.h lj_strscan.h[m
[31m-lj_opt_sink.o: lj_opt_sink.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_ir.h lj_jit.h lj_iropt.h lj_target.h lj_target_*.h[m
[31m-lj_opt_split.o: lj_opt_split.c lj_obj.h lua.h luaconf.h lj_def.h \[m
[31m- lj_arch.h lj_err.h lj_errmsg.h lj_buf.h lj_gc.h lj_str.h lj_ir.h \[m
[31m- lj_jit.h lj_ircall.h lj_iropt.h lj_vm.h[m
[31m-lj_parse.o: lj_parse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_buf.h lj_str.h lj_tab.h \[m
[31m- lj_func.h lj_state.h lj_bc.h lj_ctype.h lj_strfmt.h lj_lex.h lj_parse.h \[m
[31m- lj_vm.h lj_vmevent.h[m
[31m-lj_profile.o: lj_profile.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_buf.h lj_gc.h lj_str.h lj_frame.h lj_bc.h lj_debug.h lj_dispatch.h \[m
[31m- lj_jit.h lj_ir.h lj_trace.h lj_traceerr.h lj_profile.h luajit.h[m
[31m-lj_record.o: lj_record.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_meta.h lj_frame.h lj_bc.h \[m
[31m- lj_ctype.h lj_gc.h lj_ff.h lj_ffdef.h lj_debug.h lj_ir.h lj_jit.h \[m
[31m- lj_ircall.h lj_iropt.h lj_trace.h lj_dispatch.h lj_traceerr.h \[m
[31m- lj_record.h lj_ffrecord.h lj_snap.h lj_vm.h[m
[31m-lj_snap.o: lj_snap.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_tab.h lj_state.h lj_frame.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h \[m
[31m- lj_trace.h lj_dispatch.h lj_traceerr.h lj_snap.h lj_target.h \[m
[31m- lj_target_*.h lj_ctype.h lj_cdata.h[m
[31m-lj_state.o: lj_state.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h lj_func.h \[m
[31m- lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_trace.h lj_jit.h \[m
[31m- lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h lj_lex.h lj_alloc.h luajit.h[m
[31m-lj_str.o: lj_str.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_str.h lj_char.h[m
[31m-lj_strfmt.o: lj_strfmt.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_buf.h lj_gc.h lj_str.h lj_state.h lj_char.h lj_strfmt.h[m
[31m-lj_strfmt_num.o: lj_strfmt_num.c lj_obj.h lua.h luaconf.h lj_def.h \[m
[31m- lj_arch.h lj_buf.h lj_gc.h lj_str.h lj_strfmt.h[m
[31m-lj_strscan.o: lj_strscan.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_char.h lj_strscan.h[m
[31m-lj_tab.o: lj_tab.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \[m
[31m- lj_err.h lj_errmsg.h lj_tab.h[m
[31m-lj_trace.o: lj_trace.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_frame.h lj_bc.h \[m
[31m- lj_state.h lj_ir.h lj_jit.h lj_iropt.h lj_mcode.h lj_trace.h \[m
[31m- lj_dispatch.h lj_traceerr.h lj_snap.h lj_gdbjit.h lj_record.h lj_asm.h \[m
[31m- lj_vm.h lj_vmevent.h lj_target.h lj_target_*.h[m
[31m-lj_udata.o: lj_udata.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_gc.h lj_udata.h[m
[31m-lj_vmevent.o: lj_vmevent.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_str.h lj_tab.h lj_state.h lj_dispatch.h lj_bc.h lj_jit.h lj_ir.h \[m
[31m- lj_vm.h lj_vmevent.h[m
[31m-lj_vmmath.o: lj_vmmath.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \[m
[31m- lj_ir.h lj_vm.h[m
[31m-ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \[m
[31m- lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_tab.h \[m
[31m- lj_func.h lj_udata.h lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h \[m
[31m- lj_cdata.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h \[m
[31m- lj_vm.h lj_err.c lj_debug.h lj_ff.h lj_ffdef.h lj_strfmt.h lj_char.c \[m
[31m- lj_char.h lj_bc.c lj_bcdef.h lj_obj.c lj_buf.c lj_str.c lj_tab.c \[m
[31m- lj_func.c lj_udata.c lj_meta.c lj_strscan.h lj_lib.h lj_debug.c \[m
[31m- lj_state.c lj_lex.h lj_alloc.h luajit.h lj_dispatch.c lj_ccallback.h \[m
[31m- lj_profile.h lj_vmevent.c lj_vmevent.h lj_vmmath.c lj_strscan.c \[m
[31m- lj_strfmt.c lj_api.c lj_profile.c lj_lex.c lualib.h lj_parse.h \[m
[31m- lj_parse.c lj_bcread.c lj_bcdump.h lj_bcwrite.c lj_load.c lj_ctype.c \[m
[31m- lj_cdata.c lj_cconv.h lj_cconv.c lj_ccall.c lj_ccall.h lj_ccallback.c \[m
[31m- lj_target.h lj_target_*.h lj_mcode.h lj_carith.c lj_carith.h lj_clib.c \[m
[31m- lj_clib.h lj_cparse.c lj_cparse.h lj_lib.c lj_ir.c lj_ircall.h \[m
[31m- lj_iropt.h lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c \[m
[31m- lj_opt_dce.c lj_opt_loop.c lj_snap.h lj_opt_split.c lj_opt_sink.c \[m
[31m- lj_mcode.c lj_snap.c lj_record.c lj_record.h lj_ffrecord.h lj_crecord.c \[m
[31m- lj_crecord.h lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h \[m
[31m- lj_asm_*.h lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c \[m
[31m- lib_base.c lj_libdef.h lib_math.c lib_string.c lib_table.c lib_io.c \[m
[31m- lib_os.c lib_package.c lib_debug.c lib_bit.c lib_jit.c lib_ffi.c \[m
[31m- lib_init.c[m
[31m-luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h[m
[31m-host/buildvm.o: host/buildvm.c host/buildvm.h lj_def.h lua.h luaconf.h \[m
[31m- lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_gc.h lj_obj.h lj_bc.h lj_ir.h \[m
[31m- lj_ircall.h lj_ir.h lj_jit.h lj_frame.h lj_bc.h lj_dispatch.h lj_ctype.h \[m
[31m- lj_gc.h lj_ccall.h lj_ctype.h luajit.h \[m
[31m- host/buildvm_arch.h lj_traceerr.h[m
[31m-host/buildvm_asm.o: host/buildvm_asm.c host/buildvm.h lj_def.h lua.h luaconf.h \[m
[31m- lj_arch.h lj_bc.h lj_def.h lj_arch.h[m
[31m-host/buildvm_fold.o: host/buildvm_fold.c host/buildvm.h lj_def.h lua.h \[m
[31m- luaconf.h lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_ir.h lj_obj.h[m
[31m-host/buildvm_lib.o: host/buildvm_lib.c host/buildvm.h lj_def.h lua.h luaconf.h \[m
[31m- lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_bc.h lj_lib.h lj_obj.h \[m
[31m- host/buildvm_libbc.h[m
[31m-host/buildvm_peobj.o: host/buildvm_peobj.c host/buildvm.h lj_def.h lua.h \[m
[31m- luaconf.h lj_arch.h lj_bc.h lj_def.h lj_arch.h[m
[31m-host/minilua.o: host/minilua.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 762ac2a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-minilua[m
[31m-buildvm[m
[31m-buildvm_arch.h[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/README[m
[1mdeleted file mode 100644[m
[1mindex abfcdaa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/README[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-The files in this directory are only used during the build process of LuaJIT.[m
[31m-For cross-compilation, they must be executed on the host, not on the target.[m
[31m-[m
[31m-These files should NOT be installed![m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm.c[m
[1mdeleted file mode 100644[m
[1mindex 6d9e09e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm.c[m
[1m+++ /dev/null[m
[36m@@ -1,518 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** This is a tool to build the hand-tuned assembler code required for[m
[31m-** LuaJIT's bytecode interpreter. It supports a variety of output formats[m
[31m-** to feed different toolchains (see usage() below).[m
[31m-**[m
[31m-** This tool is not particularly optimized because it's only used while[m
[31m-** _building_ LuaJIT. There's no point in distributing or installing it.[m
[31m-** Only the object code generated by this tool is linked into LuaJIT.[m
[31m-**[m
[31m-** Caveat: some memory is not free'd, error handling is lazy.[m
[31m-** It's a one-shot tool -- any effort fixing this would be wasted.[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#endif[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-#if defined(_WIN32)[m
[31m-#include <fcntl.h>[m
[31m-#include <io.h>[m
[31m-#endif[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* DynASM glue definitions. */[m
[31m-#define Dst		ctx[m
[31m-#define Dst_DECL	BuildCtx *ctx[m
[31m-#define Dst_REF		(ctx->D)[m
[31m-#define DASM_CHECKS	1[m
[31m-[m
[31m-#include "../dynasm/dasm_proto.h"[m
[31m-[m
[31m-/* Glue macros for DynASM. */[m
[31m-static int collect_reloc(BuildCtx *ctx, uint8_t *addr, int idx, int type);[m
[31m-[m
[31m-#define DASM_EXTERN(ctx, addr, idx, type) \[m
[31m-  collect_reloc(ctx, addr, idx, type)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Avoid trouble if cross-compiling for an x86 target. Speed doesn't matter. */[m
[31m-#define DASM_ALIGNED_WRITES	1[m
[31m-[m
[31m-/* Embed architecture-specific DynASM encoder. */[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#include "../dynasm/dasm_x86.h"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#include "../dynasm/dasm_arm.h"[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#include "../dynasm/dasm_arm64.h"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#include "../dynasm/dasm_ppc.h"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#include "../dynasm/dasm_mips.h"[m
[31m-#else[m
[31m-#error "No support for this architecture (yet)"[m
[31m-#endif[m
[31m-[m
[31m-/* Embed generated architecture-specific backend. */[m
[31m-#include "buildvm_arch.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-void owrite(BuildCtx *ctx, const void *ptr, size_t sz)[m
[31m-{[m
[31m-  if (fwrite(ptr, 1, sz, ctx->fp) != sz) {[m
[31m-    fprintf(stderr, "Error: cannot write to output file: %s\n",[m
[31m-	    strerror(errno));[m
[31m-    exit(1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Emit code as raw bytes. Only used for DynASM debugging. */[m
[31m-static void emit_raw(BuildCtx *ctx)[m
[31m-{[m
[31m-  owrite(ctx, ctx->code, ctx->codesz);[m
[31m-}[m
[31m-[m
[31m-/* -- Build machine code -------------------------------------------------- */[m
[31m-[m
[31m-static const char *sym_decorate(BuildCtx *ctx,[m
[31m-				const char *prefix, const char *suffix)[m
[31m-{[m
[31m-  char name[256];[m
[31m-  char *p;[m
[31m-#if LJ_64[m
[31m-  const char *symprefix = ctx->mode == BUILD_machasm ? "_" : "";[m
[31m-#elif LJ_TARGET_XBOX360[m
[31m-  const char *symprefix = "";[m
[31m-#else[m
[31m-  const char *symprefix = ctx->mode != BUILD_elfasm ? "_" : "";[m
[31m-#endif[m
[31m-  sprintf(name, "%s%s%s", symprefix, prefix, suffix);[m
[31m-  p = strchr(name, '@');[m
[31m-  if (p) {[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    if (!LJ_64 && (ctx->mode == BUILD_coffasm || ctx->mode == BUILD_peobj))[m
[31m-      name[0] = '@';[m
[31m-    else[m
[31m-      *p = '\0';[m
[31m-#elif LJ_TARGET_PPC && !LJ_TARGET_CONSOLE[m
[31m-    /* Keep @plt etc. */[m
[31m-#else[m
[31m-    *p = '\0';[m
[31m-#endif[m
[31m-  }[m
[31m-  p = (char *)malloc(strlen(name)+1);  /* MSVC doesn't like strdup. */[m
[31m-  strcpy(p, name);[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-#define NRELOCSYM	(sizeof(extnames)/sizeof(extnames[0])-1)[m
[31m-[m
[31m-static int relocmap[NRELOCSYM];[m
[31m-[m
[31m-/* Collect external relocations. */[m
[31m-static int collect_reloc(BuildCtx *ctx, uint8_t *addr, int idx, int type)[m
[31m-{[m
[31m-  if (ctx->nreloc >= BUILD_MAX_RELOC) {[m
[31m-    fprintf(stderr, "Error: too many relocations, increase BUILD_MAX_RELOC.\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  if (relocmap[idx] < 0) {[m
[31m-    relocmap[idx] = ctx->nrelocsym;[m
[31m-    ctx->relocsym[ctx->nrelocsym] = sym_decorate(ctx, "", extnames[idx]);[m
[31m-    ctx->nrelocsym++;[m
[31m-  }[m
[31m-  ctx->reloc[ctx->nreloc].ofs = (int32_t)(addr - ctx->code);[m
[31m-  ctx->reloc[ctx->nreloc].sym = relocmap[idx];[m
[31m-  ctx->reloc[ctx->nreloc].type = type;[m
[31m-  ctx->nreloc++;[m
[31m-#if LJ_TARGET_XBOX360[m
[31m-  return (int)(ctx->code - addr) + 4;  /* Encode symbol offset of .text. */[m
[31m-#else[m
[31m-  return 0;  /* Encode symbol offset of 0. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Naive insertion sort. Performance doesn't matter here. */[m
[31m-static void sym_insert(BuildCtx *ctx, int32_t ofs,[m
[31m-		       const char *prefix, const char *suffix)[m
[31m-{[m
[31m-  ptrdiff_t i = ctx->nsym++;[m
[31m-  while (i > 0) {[m
[31m-    if (ctx->sym[i-1].ofs <= ofs)[m
[31m-      break;[m
[31m-    ctx->sym[i] = ctx->sym[i-1];[m
[31m-    i--;[m
[31m-  }[m
[31m-  ctx->sym[i].ofs = ofs;[m
[31m-  ctx->sym[i].name = sym_decorate(ctx, prefix, suffix);[m
[31m-}[m
[31m-[m
[31m-/* Build the machine code. */[m
[31m-static int build_code(BuildCtx *ctx)[m
[31m-{[m
[31m-  int status;[m
[31m-  int i;[m
[31m-[m
[31m-  /* Initialize DynASM structures. */[m
[31m-  ctx->nglob = GLOB__MAX;[m
[31m-  ctx->glob = (void **)malloc(ctx->nglob*sizeof(void *));[m
[31m-  memset(ctx->glob, 0, ctx->nglob*sizeof(void *));[m
[31m-  ctx->nreloc = 0;[m
[31m-[m
[31m-  ctx->globnames = globnames;[m
[31m-  ctx->extnames = extnames;[m
[31m-  ctx->relocsym = (const char **)malloc(NRELOCSYM*sizeof(const char *));[m
[31m-  ctx->nrelocsym = 0;[m
[31m-  for (i = 0; i < (int)NRELOCSYM; i++) relocmap[i] = -1;[m
[31m-[m
[31m-  ctx->dasm_ident = DASM_IDENT;[m
[31m-  ctx->dasm_arch = DASM_ARCH;[m
[31m-[m
[31m-  dasm_init(Dst, DASM_MAXSECTION);[m
[31m-  dasm_setupglobal(Dst, ctx->glob, ctx->nglob);[m
[31m-  dasm_setup(Dst, build_actionlist);[m
[31m-[m
[31m-  /* Call arch-specific backend to emit the code. */[m
[31m-  ctx->npc = build_backend(ctx);[m
[31m-[m
[31m-  /* Finalize the code. */[m
[31m-  (void)dasm_checkstep(Dst, -1);[m
[31m-  if ((status = dasm_link(Dst, &ctx->codesz))) return status;[m
[31m-  ctx->code = (uint8_t *)malloc(ctx->codesz);[m
[31m-  if ((status = dasm_encode(Dst, (void *)ctx->code))) return status;[m
[31m-[m
[31m-  /* Allocate symbol table and bytecode offsets. */[m
[31m-  ctx->beginsym = sym_decorate(ctx, "", LABEL_PREFIX "vm_asm_begin");[m
[31m-  ctx->sym = (BuildSym *)malloc((ctx->npc+ctx->nglob+1)*sizeof(BuildSym));[m
[31m-  ctx->nsym = 0;[m
[31m-  ctx->bc_ofs = (int32_t *)malloc(ctx->npc*sizeof(int32_t));[m
[31m-[m
[31m-  /* Collect the opcodes (PC labels). */[m
[31m-  for (i = 0; i < ctx->npc; i++) {[m
[31m-    int32_t ofs = dasm_getpclabel(Dst, i);[m
[31m-    if (ofs < 0) return 0x22000000|i;[m
[31m-    ctx->bc_ofs[i] = ofs;[m
[31m-    if ((LJ_HASJIT ||[m
[31m-	 !(i == BC_JFORI || i == BC_JFORL || i == BC_JITERL || i == BC_JLOOP ||[m
[31m-	   i == BC_IFORL || i == BC_IITERL || i == BC_ILOOP)) &&[m
[31m-	(LJ_HASFFI || i != BC_KCDATA))[m
[31m-      sym_insert(ctx, ofs, LABEL_PREFIX_BC, bc_names[i]);[m
[31m-  }[m
[31m-[m
[31m-  /* Collect the globals (named labels). */[m
[31m-  for (i = 0; i < ctx->nglob; i++) {[m
[31m-    const char *gl = globnames[i];[m
[31m-    int len = (int)strlen(gl);[m
[31m-    if (!ctx->glob[i]) {[m
[31m-      fprintf(stderr, "Error: undefined global %s\n", gl);[m
[31m-      exit(2);[m
[31m-    }[m
[31m-    /* Skip the _Z symbols. */[m
[31m-    if (!(len >= 2 && gl[len-2] == '_' && gl[len-1] == 'Z'))[m
[31m-      sym_insert(ctx, (int32_t)((uint8_t *)(ctx->glob[i]) - ctx->code),[m
[31m-		 LABEL_PREFIX, globnames[i]);[m
[31m-  }[m
[31m-[m
[31m-  /* Close the address range. */[m
[31m-  sym_insert(ctx, (int32_t)ctx->codesz, "", "");[m
[31m-  ctx->nsym--;[m
[31m-[m
[31m-  dasm_free(Dst);[m
[31m-[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Generate VM enums --------------------------------------------------- */[m
[31m-[m
[31m-const char *const bc_names[] = {[m
[31m-#define BCNAME(name, ma, mb, mc, mt)       #name,[m
[31m-BCDEF(BCNAME)[m
[31m-#undef BCNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const ir_names[] = {[m
[31m-#define IRNAME(name, m, m1, m2)	#name,[m
[31m-IRDEF(IRNAME)[m
[31m-#undef IRNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const irt_names[] = {[m
[31m-#define IRTNAME(name, size)	#name,[m
[31m-IRTDEF(IRTNAME)[m
[31m-#undef IRTNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const irfpm_names[] = {[m
[31m-#define FPMNAME(name)		#name,[m
[31m-IRFPMDEF(FPMNAME)[m
[31m-#undef FPMNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const irfield_names[] = {[m
[31m-#define FLNAME(name, ofs)	#name,[m
[31m-IRFLDEF(FLNAME)[m
[31m-#undef FLNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-const char *const ircall_names[] = {[m
[31m-#define IRCALLNAME(cond, name, nargs, kind, type, flags)	#name,[m
[31m-IRCALLDEF(IRCALLNAME)[m
[31m-#undef IRCALLNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-static const char *const trace_errors[] = {[m
[31m-#define TREDEF(name, msg)	msg,[m
[31m-#include "lj_traceerr.h"[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-static const char *lower(char *buf, const char *s)[m
[31m-{[m
[31m-  char *p = buf;[m
[31m-  while (*s) {[m
[31m-    *p++ = (*s >= 'A' && *s <= 'Z') ? *s+0x20 : *s;[m
[31m-    s++;[m
[31m-  }[m
[31m-  *p = '\0';[m
[31m-  return buf;[m
[31m-}[m
[31m-[m
[31m-/* Emit C source code for bytecode-related definitions. */[m
[31m-static void emit_bcdef(BuildCtx *ctx)[m
[31m-{[m
[31m-  int i;[m
[31m-  fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n");[m
[31m-  fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_ofs[] = {\n");[m
[31m-  for (i = 0; i < ctx->npc; i++) {[m
[31m-    if (i != 0)[m
[31m-      fprintf(ctx->fp, ",\n");[m
[31m-    fprintf(ctx->fp, "%d", ctx->bc_ofs[i]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit VM definitions as Lua code for debug modules. */[m
[31m-static void emit_vmdef(BuildCtx *ctx)[m
[31m-{[m
[31m-  char buf[80];[m
[31m-  int i;[m
[31m-  fprintf(ctx->fp, "-- This is a generated file. DO NOT EDIT!\n\n");[m
[31m-  fprintf(ctx->fp, "return {\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "bcnames = \"");[m
[31m-  for (i = 0; bc_names[i]; i++) fprintf(ctx->fp, "%-6s", bc_names[i]);[m
[31m-  fprintf(ctx->fp, "\",\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "irnames = \"");[m
[31m-  for (i = 0; ir_names[i]; i++) fprintf(ctx->fp, "%-6s", ir_names[i]);[m
[31m-  fprintf(ctx->fp, "\",\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "irfpm = { [0]=");[m
[31m-  for (i = 0; irfpm_names[i]; i++)[m
[31m-    fprintf(ctx->fp, "\"%s\", ", lower(buf, irfpm_names[i]));[m
[31m-  fprintf(ctx->fp, "},\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "irfield = { [0]=");[m
[31m-  for (i = 0; irfield_names[i]; i++) {[m
[31m-    char *p;[m
[31m-    lower(buf, irfield_names[i]);[m
[31m-    p = strchr(buf, '_');[m
[31m-    if (p) *p = '.';[m
[31m-    fprintf(ctx->fp, "\"%s\", ", buf);[m
[31m-  }[m
[31m-  fprintf(ctx->fp, "},\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "ircall = {\n[0]=");[m
[31m-  for (i = 0; ircall_names[i]; i++)[m
[31m-    fprintf(ctx->fp, "\"%s\",\n", ircall_names[i]);[m
[31m-  fprintf(ctx->fp, "},\n\n");[m
[31m-[m
[31m-  fprintf(ctx->fp, "traceerr = {\n[0]=");[m
[31m-  for (i = 0; trace_errors[i]; i++)[m
[31m-    fprintf(ctx->fp, "\"%s\",\n", trace_errors[i]);[m
[31m-  fprintf(ctx->fp, "},\n\n");[m
[31m-}[m
[31m-[m
[31m-/* -- Argument parsing ---------------------------------------------------- */[m
[31m-[m
[31m-/* Build mode names. */[m
[31m-static const char *const modenames[] = {[m
[31m-#define BUILDNAME(name)		#name,[m
[31m-BUILDDEF(BUILDNAME)[m
[31m-#undef BUILDNAME[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-/* Print usage information and exit. */[m
[31m-static void usage(void)[m
[31m-{[m
[31m-  int i;[m
[31m-  fprintf(stderr, LUAJIT_VERSION " VM builder.\n");[m
[31m-  fprintf(stderr, LUAJIT_COPYRIGHT ", " LUAJIT_URL "\n");[m
[31m-  fprintf(stderr, "Target architecture: " LJ_ARCH_NAME "\n\n");[m
[31m-  fprintf(stderr, "Usage: buildvm -m mode [-o outfile] [infiles...]\n\n");[m
[31m-  fprintf(stderr, "Available modes:\n");[m
[31m-  for (i = 0; i < BUILD__MAX; i++)[m
[31m-    fprintf(stderr, "  %s\n", modenames[i]);[m
[31m-  exit(1);[m
[31m-}[m
[31m-[m
[31m-/* Parse the output mode name. */[m
[31m-static BuildMode parsemode(const char *mode)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; modenames[i]; i++)[m
[31m-    if (!strcmp(mode, modenames[i]))[m
[31m-      return (BuildMode)i;[m
[31m-  usage();[m
[31m-  return (BuildMode)-1;[m
[31m-}[m
[31m-[m
[31m-/* Parse arguments. */[m
[31m-static void parseargs(BuildCtx *ctx, char **argv)[m
[31m-{[m
[31m-  const char *a;[m
[31m-  int i;[m
[31m-  ctx->mode = (BuildMode)-1;[m
[31m-  ctx->outname = "-";[m
[31m-  for (i = 1; (a = argv[i]) != NULL; i++) {[m
[31m-    if (a[0] != '-')[m
[31m-      break;[m
[31m-    switch (a[1]) {[m
[31m-    case '-':[m
[31m-      if (a[2]) goto err;[m
[31m-      i++;[m
[31m-      goto ok;[m
[31m-    case '\0':[m
[31m-      goto ok;[m
[31m-    case 'm':[m
[31m-      i++;[m
[31m-      if (a[2] || argv[i] == NULL) goto err;[m
[31m-      ctx->mode = parsemode(argv[i]);[m
[31m-      break;[m
[31m-    case 'o':[m
[31m-      i++;[m
[31m-      if (a[2] || argv[i] == NULL) goto err;[m
[31m-      ctx->outname = argv[i];[m
[31m-      break;[m
[31m-    default: err:[m
[31m-      usage();[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-ok:[m
[31m-  ctx->args = argv+i;[m
[31m-  if (ctx->mode == (BuildMode)-1) goto err;[m
[31m-}[m
[31m-[m
[31m-int main(int argc, char **argv)[m
[31m-{[m
[31m-  BuildCtx ctx_;[m
[31m-  BuildCtx *ctx = &ctx_;[m
[31m-  int status, binmode;[m
[31m-[m
[31m-  if (sizeof(void *) != 4*LJ_32+8*LJ_64) {[m
[31m-    fprintf(stderr,"Error: pointer size mismatch in cross-build.\n");[m
[31m-    fprintf(stderr,"Try: make HOST_CC=\"gcc -m32\" CROSS=...\n\n");[m
[31m-    return 1;[m
[31m-  }[m
[31m-[m
[31m-  UNUSED(argc);[m
[31m-  parseargs(ctx, argv);[m
[31m-[m
[31m-  if ((status = build_code(ctx))) {[m
[31m-    fprintf(stderr,"Error: DASM error %08x\n", status);[m
[31m-    return 1;[m
[31m-  }[m
[31m-[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_peobj:[m
[31m-  case BUILD_raw:[m
[31m-    binmode = 1;[m
[31m-    break;[m
[31m-  default:[m
[31m-    binmode = 0;[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  if (ctx->outname[0] == '-' && ctx->outname[1] == '\0') {[m
[31m-    ctx->fp = stdout;[m
[31m-#if defined(_WIN32)[m
[31m-    if (binmode)[m
[31m-      _setmode(_fileno(stdout), _O_BINARY);  /* Yuck. */[m
[31m-#endif[m
[31m-  } else if (!(ctx->fp = fopen(ctx->outname, binmode ? "wb" : "w"))) {[m
[31m-    fprintf(stderr, "Error: cannot open output file '%s': %s\n",[m
[31m-	    ctx->outname, strerror(errno));[m
[31m-    exit(1);[m
[31m-  }[m
[31m-[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-  case BUILD_coffasm:[m
[31m-  case BUILD_machasm:[m
[31m-    emit_asm(ctx);[m
[31m-    emit_asm_debug(ctx);[m
[31m-    break;[m
[31m-  case BUILD_peobj:[m
[31m-    emit_peobj(ctx);[m
[31m-    break;[m
[31m-  case BUILD_raw:[m
[31m-    emit_raw(ctx);[m
[31m-    break;[m
[31m-  case BUILD_bcdef:[m
[31m-    emit_bcdef(ctx);[m
[31m-    emit_lib(ctx);[m
[31m-    break;[m
[31m-  case BUILD_vmdef:[m
[31m-    emit_vmdef(ctx);[m
[31m-    emit_lib(ctx);[m
[31m-    fprintf(ctx->fp, "}\n\n");[m
[31m-    break;[m
[31m-  case BUILD_ffdef:[m
[31m-  case BUILD_libdef:[m
[31m-  case BUILD_recdef:[m
[31m-    emit_lib(ctx);[m
[31m-    break;[m
[31m-  case BUILD_folddef:[m
[31m-    emit_fold(ctx);[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  fflush(ctx->fp);[m
[31m-  if (ferror(ctx->fp)) {[m
[31m-    fprintf(stderr, "Error: cannot write to output file: %s\n",[m
[31m-	    strerror(errno));[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  fclose(ctx->fp);[m
[31m-[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm.h[m
[1mdeleted file mode 100644[m
[1mindex 90d21b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm.h[m
[1m+++ /dev/null[m
[36m@@ -1,105 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _BUILDVM_H[m
[31m-#define _BUILDVM_H[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-#include <errno.h>[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-/* Hardcoded limits. Increase as needed. */[m
[31m-#define BUILD_MAX_RELOC		200	/* Max. number of relocations. */[m
[31m-#define BUILD_MAX_FOLD		4096	/* Max. number of fold rules. */[m
[31m-[m
[31m-/* Prefix for scanned library definitions. */[m
[31m-#define LIBDEF_PREFIX		"LJLIB_"[m
[31m-[m
[31m-/* Prefix for scanned fold definitions. */[m
[31m-#define FOLDDEF_PREFIX		"LJFOLD"[m
[31m-[m
[31m-/* Prefixes for generated labels. */[m
[31m-#define LABEL_PREFIX		"lj_"[m
[31m-#define LABEL_PREFIX_BC		LABEL_PREFIX "BC_"[m
[31m-#define LABEL_PREFIX_FF		LABEL_PREFIX "ff_"[m
[31m-#define LABEL_PREFIX_CF		LABEL_PREFIX "cf_"[m
[31m-#define LABEL_PREFIX_FFH	LABEL_PREFIX "ffh_"[m
[31m-#define LABEL_PREFIX_LIBCF	LABEL_PREFIX "lib_cf_"[m
[31m-#define LABEL_PREFIX_LIBINIT	LABEL_PREFIX "lib_init_"[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-struct dasm_State;[m
[31m-[m
[31m-/* Build modes. */[m
[31m-#define BUILDDEF(_) \[m
[31m-  _(elfasm) _(coffasm) _(machasm) _(peobj) _(raw) \[m
[31m-  _(bcdef) _(ffdef) _(libdef) _(recdef) _(vmdef) \[m
[31m-  _(folddef)[m
[31m-[m
[31m-typedef enum {[m
[31m-#define BUILDENUM(name)		BUILD_##name,[m
[31m-BUILDDEF(BUILDENUM)[m
[31m-#undef BUILDENUM[m
[31m-  BUILD__MAX[m
[31m-} BuildMode;[m
[31m-[m
[31m-/* Code relocation. */[m
[31m-typedef struct BuildReloc {[m
[31m-  int32_t ofs;[m
[31m-  int sym;[m
[31m-  int type;[m
[31m-} BuildReloc;[m
[31m-[m
[31m-typedef struct BuildSym {[m
[31m-  const char *name;[m
[31m-  int32_t ofs;[m
[31m-} BuildSym;[m
[31m-[m
[31m-/* Build context structure. */[m
[31m-typedef struct BuildCtx {[m
[31m-  /* DynASM state pointer. Should be first member. */[m
[31m-  struct dasm_State *D;[m
[31m-  /* Parsed command line. */[m
[31m-  BuildMode mode;[m
[31m-  FILE *fp;[m
[31m-  const char *outname;[m
[31m-  char **args;[m
[31m-  /* Code and symbols generated by DynASM. */[m
[31m-  uint8_t *code;[m
[31m-  size_t codesz;[m
[31m-  int npc, nglob, nsym, nreloc, nrelocsym;[m
[31m-  void **glob;[m
[31m-  BuildSym *sym;[m
[31m-  const char **relocsym;[m
[31m-  int32_t *bc_ofs;[m
[31m-  const char *beginsym;[m
[31m-  /* Strings generated by DynASM. */[m
[31m-  const char *const *globnames;[m
[31m-  const char *const *extnames;[m
[31m-  const char *dasm_ident;[m
[31m-  const char *dasm_arch;[m
[31m-  /* Relocations. */[m
[31m-  BuildReloc reloc[BUILD_MAX_RELOC];[m
[31m-} BuildCtx;[m
[31m-[m
[31m-extern void owrite(BuildCtx *ctx, const void *ptr, size_t sz);[m
[31m-extern void emit_asm(BuildCtx *ctx);[m
[31m-extern void emit_peobj(BuildCtx *ctx);[m
[31m-extern void emit_lib(BuildCtx *ctx);[m
[31m-extern void emit_fold(BuildCtx *ctx);[m
[31m-[m
[31m-extern const char *const bc_names[];[m
[31m-extern const char *const ir_names[];[m
[31m-extern const char *const irt_names[];[m
[31m-extern const char *const irfpm_names[];[m
[31m-extern const char *const irfield_names[];[m
[31m-extern const char *const ircall_names[];[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_asm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_asm.c[m
[1mdeleted file mode 100644[m
[1mindex 28419c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_asm.c[m
[1m+++ /dev/null[m
[36m@@ -1,354 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder: Assembler source code emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_bc.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-/* Emit bytes piecewise as assembler text. */[m
[31m-static void emit_asm_bytes(BuildCtx *ctx, uint8_t *p, int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; i < n; i++) {[m
[31m-    if ((i & 15) == 0)[m
[31m-      fprintf(ctx->fp, "\t.byte %d", p[i]);[m
[31m-    else[m
[31m-      fprintf(ctx->fp, ",%d", p[i]);[m
[31m-    if ((i & 15) == 15) putc('\n', ctx->fp);[m
[31m-  }[m
[31m-  if ((n & 15) != 0) putc('\n', ctx->fp);[m
[31m-}[m
[31m-[m
[31m-/* Emit relocation */[m
[31m-static void emit_asm_reloc(BuildCtx *ctx, int type, const char *sym)[m
[31m-{[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    if (type)[m
[31m-      fprintf(ctx->fp, "\t.long %s-.-4\n", sym);[m
[31m-    else[m
[31m-      fprintf(ctx->fp, "\t.long %s\n", sym);[m
[31m-    break;[m
[31m-  case BUILD_coffasm:[m
[31m-    fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", sym);[m
[31m-    if (type)[m
[31m-      fprintf(ctx->fp, "\t.long %s-.-4\n", sym);[m
[31m-    else[m
[31m-      fprintf(ctx->fp, "\t.long %s\n", sym);[m
[31m-    break;[m
[31m-  default:  /* BUILD_machasm for relative relocations handled below. */[m
[31m-    fprintf(ctx->fp, "\t.long %s\n", sym);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const char *const jccnames[] = {[m
[31m-  "jo", "jno", "jb", "jnb", "jz", "jnz", "jbe", "ja",[m
[31m-  "js", "jns", "jpe", "jpo", "jl", "jge", "jle", "jg"[m
[31m-};[m
[31m-[m
[31m-/* Emit x86/x64 text relocations. */[m
[31m-static void emit_asm_reloc_text(BuildCtx *ctx, uint8_t *cp, int n,[m
[31m-				const char *sym)[m
[31m-{[m
[31m-  const char *opname = NULL;[m
[31m-  if (--n < 0) goto err;[m
[31m-  if (cp[n] == 0xe8) {[m
[31m-    opname = "call";[m
[31m-  } else if (cp[n] == 0xe9) {[m
[31m-    opname = "jmp";[m
[31m-  } else if (cp[n] >= 0x80 && cp[n] <= 0x8f && n > 0 && cp[n-1] == 0x0f) {[m
[31m-    opname = jccnames[cp[n]-0x80];[m
[31m-    n--;[m
[31m-  } else {[m
[31m-err:[m
[31m-    fprintf(stderr, "Error: unsupported opcode for %s symbol relocation.\n",[m
[31m-	    sym);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  emit_asm_bytes(ctx, cp, n);[m
[31m-  if (strncmp(sym+(*sym == '_'), LABEL_PREFIX, sizeof(LABEL_PREFIX)-1)) {[m
[31m-    /* Various fixups for external symbols outside of our binary. */[m
[31m-    if (ctx->mode == BUILD_elfasm) {[m
[31m-      if (LJ_32)[m
[31m-	fprintf(ctx->fp, "#if __PIC__\n\t%s lj_wrap_%s\n#else\n", opname, sym);[m
[31m-      fprintf(ctx->fp, "\t%s %s@PLT\n", opname, sym);[m
[31m-      if (LJ_32)[m
[31m-	fprintf(ctx->fp, "#endif\n");[m
[31m-      return;[m
[31m-    } else if (LJ_32 && ctx->mode == BUILD_machasm) {[m
[31m-      fprintf(ctx->fp, "\t%s L%s$stub\n", opname, sym);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  fprintf(ctx->fp, "\t%s %s\n", opname, sym);[m
[31m-}[m
[31m-#else[m
[31m-/* Emit words piecewise as assembler text. */[m
[31m-static void emit_asm_words(BuildCtx *ctx, uint8_t *p, int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; i < n; i += 4) {[m
[31m-    if ((i & 15) == 0)[m
[31m-      fprintf(ctx->fp, "\t.long 0x%08x", *(uint32_t *)(p+i));[m
[31m-    else[m
[31m-      fprintf(ctx->fp, ",0x%08x", *(uint32_t *)(p+i));[m
[31m-    if ((i & 15) == 12) putc('\n', ctx->fp);[m
[31m-  }[m
[31m-  if ((n & 15) != 0) putc('\n', ctx->fp);[m
[31m-}[m
[31m-[m
[31m-/* Emit relocation as part of an instruction. */[m
[31m-static void emit_asm_wordreloc(BuildCtx *ctx, uint8_t *p, int n,[m
[31m-			       const char *sym)[m
[31m-{[m
[31m-  uint32_t ins;[m
[31m-  emit_asm_words(ctx, p, n-4);[m
[31m-  ins = *(uint32_t *)(p+n-4);[m
[31m-#if LJ_TARGET_ARM[m
[31m-  if ((ins & 0xff000000u) == 0xfa000000u) {[m
[31m-    fprintf(ctx->fp, "\tblx %s\n", sym);[m
[31m-  } else if ((ins & 0x0e000000u) == 0x0a000000u) {[m
[31m-    fprintf(ctx->fp, "\t%s%.2s %s\n", (ins & 0x01000000u) ? "bl" : "b",[m
[31m-	    &"eqnecsccmiplvsvchilsgeltgtle"[2*(ins >> 28)], sym);[m
[31m-  } else {[m
[31m-    fprintf(stderr,[m
[31m-	    "Error: unsupported opcode %08x for %s symbol relocation.\n",[m
[31m-	    ins, sym);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-  if ((ins >> 26) == 0x25u) {[m
[31m-    fprintf(ctx->fp, "\tbl %s\n", sym);[m
[31m-  } else {[m
[31m-    fprintf(stderr,[m
[31m-	    "Error: unsupported opcode %08x for %s symbol relocation.\n",[m
[31m-	    ins, sym);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#if LJ_TARGET_PS3[m
[31m-#define TOCPREFIX "."[m
[31m-#else[m
[31m-#define TOCPREFIX ""[m
[31m-#endif[m
[31m-  if ((ins >> 26) == 16) {[m
[31m-    fprintf(ctx->fp, "\t%s %d, %d, " TOCPREFIX "%s\n",[m
[31m-	    (ins & 1) ? "bcl" : "bc", (ins >> 21) & 31, (ins >> 16) & 31, sym);[m
[31m-  } else if ((ins >> 26) == 18) {[m
[31m-#if LJ_ARCH_PPC64[m
[31m-    const char *suffix = strchr(sym, '@');[m
[31m-    if (suffix && suffix[1] == 'h') {[m
[31m-      fprintf(ctx->fp, "\taddis 11, 2, %s\n", sym);[m
[31m-    } else if (suffix && suffix[1] == 'l') {[m
[31m-      fprintf(ctx->fp, "\tld 12, %s\n", sym);[m
[31m-    } else[m
[31m-#endif[m
[31m-    fprintf(ctx->fp, "\t%s " TOCPREFIX "%s\n", (ins & 1) ? "bl" : "b", sym);[m
[31m-  } else {[m
[31m-    fprintf(stderr,[m
[31m-	    "Error: unsupported opcode %08x for %s symbol relocation.\n",[m
[31m-	    ins, sym);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-  fprintf(stderr,[m
[31m-	  "Error: unsupported opcode %08x for %s symbol relocation.\n",[m
[31m-	  ins, sym);[m
[31m-  exit(1);[m
[31m-#else[m
[31m-#error "missing relocation support for this architecture"[m
[31m-#endif[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_ARM[m
[31m-#define ELFASM_PX	"%%"[m
[31m-#else[m
[31m-#define ELFASM_PX	"@"[m
[31m-#endif[m
[31m-[m
[31m-/* Emit an assembler label. */[m
[31m-static void emit_asm_label(BuildCtx *ctx, const char *name, int size, int isfunc)[m
[31m-{[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-#if LJ_TARGET_PS3[m
[31m-    if (!strncmp(name, "lj_vm_", 6) &&[m
[31m-	strcmp(name, ctx->beginsym) &&[m
[31m-	!strstr(name, "hook")) {[m
[31m-      fprintf(ctx->fp,[m
[31m-	"\n\t.globl %s\n"[m
[31m-	"\t.section \".opd\",\"aw\"\n"[m
[31m-	"%s:\n"[m
[31m-	"\t.long .%s,.TOC.@tocbase32\n"[m
[31m-	"\t.size %s,8\n"[m
[31m-	"\t.previous\n"[m
[31m-	"\t.globl .%s\n"[m
[31m-	"\t.hidden .%s\n"[m
[31m-	"\t.type .%s, " ELFASM_PX "function\n"[m
[31m-	"\t.size .%s, %d\n"[m
[31m-	".%s:\n",[m
[31m-	name, name, name, name, name, name, name, name, size, name);[m
[31m-      break;[m
[31m-    }[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-      "\n\t.globl %s\n"[m
[31m-      "\t.hidden %s\n"[m
[31m-      "\t.type %s, " ELFASM_PX "%s\n"[m
[31m-      "\t.size %s, %d\n"[m
[31m-      "%s:\n",[m
[31m-      name, name, name, isfunc ? "function" : "object", name, size, name);[m
[31m-    break;[m
[31m-  case BUILD_coffasm:[m
[31m-    fprintf(ctx->fp, "\n\t.globl %s\n", name);[m
[31m-    if (isfunc)[m
[31m-      fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", name);[m
[31m-    fprintf(ctx->fp, "%s:\n", name);[m
[31m-    break;[m
[31m-  case BUILD_machasm:[m
[31m-    fprintf(ctx->fp,[m
[31m-      "\n\t.private_extern %s\n"[m
[31m-      "%s:\n", name, name);[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit alignment. */[m
[31m-static void emit_asm_align(BuildCtx *ctx, int bits)[m
[31m-{[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-  case BUILD_coffasm:[m
[31m-    fprintf(ctx->fp, "\t.p2align %d\n", bits);[m
[31m-    break;[m
[31m-  case BUILD_machasm:[m
[31m-    fprintf(ctx->fp, "\t.align %d\n", bits);[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Emit assembler source code. */[m
[31m-void emit_asm(BuildCtx *ctx)[m
[31m-{[m
[31m-  int i, rel;[m
[31m-[m
[31m-  fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch);[m
[31m-#if LJ_ARCH_PPC64[m
[31m-  fprintf(ctx->fp, "\t.abiversion 2\n");[m
[31m-#endif[m
[31m-  fprintf(ctx->fp, "\t.text\n");[m
[31m-  emit_asm_align(ctx, 4);[m
[31m-[m
[31m-#if LJ_TARGET_PS3[m
[31m-  emit_asm_label(ctx, ctx->beginsym, ctx->codesz, 0);[m
[31m-#else[m
[31m-  emit_asm_label(ctx, ctx->beginsym, 0, 0);[m
[31m-#endif[m
[31m-  if (ctx->mode != BUILD_machasm)[m
[31m-    fprintf(ctx->fp, ".Lbegin:\n");[m
[31m-[m
[31m-#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND[m
[31m-  /* This should really be moved into buildvm_arm.dasc. */[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-  fprintf(ctx->fp,[m
[31m-	  ".fnstart\n"[m
[31m-	  ".save {r5, r6, r7, r8, r9, r10, r11, lr}\n"[m
[31m-	  ".vsave {d8-d15}\n"[m
[31m-	  ".save {r4}\n"[m
[31m-	  ".pad #28\n");[m
[31m-#else[m
[31m-  fprintf(ctx->fp,[m
[31m-	  ".fnstart\n"[m
[31m-	  ".save {r4, r5, r6, r7, r8, r9, r10, r11, lr}\n"[m
[31m-	  ".pad #28\n");[m
[31m-#endif[m
[31m-#endif[m
[31m-#if LJ_TARGET_MIPS[m
[31m-  fprintf(ctx->fp, ".set nomips16\n.abicalls\n.set noreorder\n.set nomacro\n");[m
[31m-#endif[m
[31m-[m
[31m-  for (i = rel = 0; i < ctx->nsym; i++) {[m
[31m-    int32_t ofs = ctx->sym[i].ofs;[m
[31m-    int32_t next = ctx->sym[i+1].ofs;[m
[31m-#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND && LJ_HASFFI[m
[31m-    if (!strcmp(ctx->sym[i].name, "lj_vm_ffi_call"))[m
[31m-      fprintf(ctx->fp,[m
[31m-	      ".globl lj_err_unwind_arm\n"[m
[31m-	      ".personality lj_err_unwind_arm\n"[m
[31m-	      ".fnend\n"[m
[31m-	      ".fnstart\n"[m
[31m-	      ".save {r4, r5, r11, lr}\n"[m
[31m-	      ".setfp r11, sp\n");[m
[31m-#endif[m
[31m-    emit_asm_label(ctx, ctx->sym[i].name, next - ofs, 1);[m
[31m-    while (rel < ctx->nreloc && ctx->reloc[rel].ofs <= next) {[m
[31m-      BuildReloc *r = &ctx->reloc[rel];[m
[31m-      int n = r->ofs - ofs;[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-      if (r->type != 0 &&[m
[31m-	  (ctx->mode == BUILD_elfasm || ctx->mode == BUILD_machasm)) {[m
[31m-	emit_asm_reloc_text(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]);[m
[31m-      } else {[m
[31m-	emit_asm_bytes(ctx, ctx->code+ofs, n);[m
[31m-	emit_asm_reloc(ctx, r->type, ctx->relocsym[r->sym]);[m
[31m-      }[m
[31m-      ofs += n+4;[m
[31m-#else[m
[31m-      emit_asm_wordreloc(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]);[m
[31m-      ofs += n;[m
[31m-#endif[m
[31m-      rel++;[m
[31m-    }[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    emit_asm_bytes(ctx, ctx->code+ofs, next-ofs);[m
[31m-#else[m
[31m-    emit_asm_words(ctx, ctx->code+ofs, next-ofs);[m
[31m-#endif[m
[31m-  }[m
[31m-[m
[31m-#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND[m
[31m-  fprintf(ctx->fp,[m
[31m-#if !LJ_HASFFI[m
[31m-	  ".globl lj_err_unwind_arm\n"[m
[31m-	  ".personality lj_err_unwind_arm\n"[m
[31m-#endif[m
[31m-	  ".fnend\n");[m
[31m-#endif[m
[31m-[m
[31m-  fprintf(ctx->fp, "\n");[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-#if !(LJ_TARGET_PS3 || LJ_TARGET_PSVITA)[m
[31m-    fprintf(ctx->fp, "\t.section .note.GNU-stack,\"\"," ELFASM_PX "progbits\n");[m
[31m-#endif[m
[31m-#if LJ_TARGET_PPC && !LJ_TARGET_PS3[m
[31m-    /* Hard-float ABI. */[m
[31m-    fprintf(ctx->fp, "\t.gnu_attribute 4, 1\n");[m
[31m-#endif[m
[31m-    /* fallthrough */[m
[31m-  case BUILD_coffasm:[m
[31m-    fprintf(ctx->fp, "\t.ident \"%s\"\n", ctx->dasm_ident);[m
[31m-    break;[m
[31m-  case BUILD_machasm:[m
[31m-    fprintf(ctx->fp,[m
[31m-      "\t.cstring\n"[m
[31m-      "\t.ascii \"%s\\0\"\n", ctx->dasm_ident);[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-  fprintf(ctx->fp, "\n");[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_fold.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_fold.c[m
[1mdeleted file mode 100644[m
[1mindex e87a0af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_fold.c[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder: IR folding hash table generator.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ir.h"[m
[31m-[m
[31m-/* Context for the folding hash table generator. */[m
[31m-static int lineno;[m
[31m-static uint32_t funcidx;[m
[31m-static uint32_t foldkeys[BUILD_MAX_FOLD];[m
[31m-static uint32_t nkeys;[m
[31m-[m
[31m-/* Try to fill the hash table with keys using the hash parameters. */[m
[31m-static int tryhash(uint32_t *htab, uint32_t sz, uint32_t r, int dorol)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-  if (dorol && ((r & 31) == 0 || (r>>5) == 0))[m
[31m-    return 0;  /* Avoid zero rotates. */[m
[31m-  memset(htab, 0xff, (sz+1)*sizeof(uint32_t));[m
[31m-  for (i = 0; i < nkeys; i++) {[m
[31m-    uint32_t key = foldkeys[i];[m
[31m-    uint32_t k = key & 0xffffff;[m
[31m-    uint32_t h = (dorol ? lj_rol(lj_rol(k, r>>5) - k, r&31) :[m
[31m-			  (((k << (r>>5)) - k) << (r&31))) % sz;[m
[31m-    if (htab[h] != 0xffffffff) {  /* Collision on primary slot. */[m
[31m-      if (htab[h+1] != 0xffffffff) {  /* Collision on secondary slot. */[m
[31m-	/* Try to move the colliding key, if possible. */[m
[31m-	if (h < sz-1 && htab[h+2] == 0xffffffff) {[m
[31m-	  uint32_t k2 = htab[h+1] & 0xffffff;[m
[31m-	  uint32_t h2 = (dorol ? lj_rol(lj_rol(k2, r>>5) - k2, r&31) :[m
[31m-				 (((k2 << (r>>5)) - k2) << (r&31))) % sz;[m
[31m-	  if (h2 != h+1) return 0;  /* Cannot resolve collision. */[m
[31m-	  htab[h+2] = htab[h+1];  /* Move colliding key to secondary slot. */[m
[31m-	} else {[m
[31m-	  return 0;  /* Collision. */[m
[31m-	}[m
[31m-      }[m
[31m-      htab[h+1] = key;[m
[31m-    } else {[m
[31m-      htab[h] = key;[m
[31m-    }[m
[31m-  }[m
[31m-  return 1;  /* Success, all keys could be stored. */[m
[31m-}[m
[31m-[m
[31m-/* Print the generated hash table. */[m
[31m-static void printhash(BuildCtx *ctx, uint32_t *htab, uint32_t sz)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-  fprintf(ctx->fp, "static const uint32_t fold_hash[%d] = {\n0x%08x",[m
[31m-	  sz+1, htab[0]);[m
[31m-  for (i = 1; i < sz+1; i++)[m
[31m-    fprintf(ctx->fp, ",\n0x%08x", htab[i]);[m
[31m-  fprintf(ctx->fp, "\n};\n\n");[m
[31m-}[m
[31m-[m
[31m-/* Exhaustive search for the shortest semi-perfect hash table. */[m
[31m-static void makehash(BuildCtx *ctx)[m
[31m-{[m
[31m-  uint32_t htab[BUILD_MAX_FOLD*2+1];[m
[31m-  uint32_t sz, r;[m
[31m-  /* Search for the smallest hash table with an odd size. */[m
[31m-  for (sz = (nkeys|1); sz < BUILD_MAX_FOLD*2; sz += 2) {[m
[31m-    /* First try all shift hash combinations. */[m
[31m-    for (r = 0; r < 32*32; r++) {[m
[31m-      if (tryhash(htab, sz, r, 0)) {[m
[31m-	printhash(ctx, htab, sz);[m
[31m-	fprintf(ctx->fp,[m
[31m-		"#define fold_hashkey(k)\t(((((k)<<%u)-(k))<<%u)%%%u)\n\n",[m
[31m-		r>>5, r&31, sz);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    /* Then try all rotate hash combinations. */[m
[31m-    for (r = 0; r < 32*32; r++) {[m
[31m-      if (tryhash(htab, sz, r, 1)) {[m
[31m-	printhash(ctx, htab, sz);[m
[31m-	fprintf(ctx->fp,[m
[31m-	  "#define fold_hashkey(k)\t(lj_rol(lj_rol((k),%u)-(k),%u)%%%u)\n\n",[m
[31m-		r>>5, r&31, sz);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  fprintf(stderr, "Error: search for perfect hash failed\n");[m
[31m-  exit(1);[m
[31m-}[m
[31m-[m
[31m-/* Parse one token of a fold rule. */[m
[31m-static uint32_t nexttoken(char **pp, int allowlit, int allowany)[m
[31m-{[m
[31m-  char *p = *pp;[m
[31m-  if (p) {[m
[31m-    uint32_t i;[m
[31m-    char *q = strchr(p, ' ');[m
[31m-    if (q) *q++ = '\0';[m
[31m-    *pp = q;[m
[31m-    if (allowlit && !strncmp(p, "IRFPM_", 6)) {[m
[31m-      for (i = 0; irfpm_names[i]; i++)[m
[31m-	if (!strcmp(irfpm_names[i], p+6))[m
[31m-	  return i;[m
[31m-    } else if (allowlit && !strncmp(p, "IRFL_", 5)) {[m
[31m-      for (i = 0; irfield_names[i]; i++)[m
[31m-	if (!strcmp(irfield_names[i], p+5))[m
[31m-	  return i;[m
[31m-    } else if (allowlit && !strncmp(p, "IRCALL_", 7)) {[m
[31m-      for (i = 0; ircall_names[i]; i++)[m
[31m-	if (!strcmp(ircall_names[i], p+7))[m
[31m-	  return i;[m
[31m-    } else if (allowlit && !strncmp(p, "IRCONV_", 7)) {[m
[31m-      for (i = 0; irt_names[i]; i++) {[m
[31m-	const char *r = strchr(p+7, '_');[m
[31m-	if (r && !strncmp(irt_names[i], p+7, r-(p+7))) {[m
[31m-	  uint32_t j;[m
[31m-	  for (j = 0; irt_names[j]; j++)[m
[31m-	    if (!strcmp(irt_names[j], r+1))[m
[31m-	      return (i << 5) + j;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (allowlit && *p >= '0' && *p <= '9') {[m
[31m-      for (i = 0; *p >= '0' && *p <= '9'; p++)[m
[31m-	i = i*10 + (*p - '0');[m
[31m-      if (*p == '\0')[m
[31m-	return i;[m
[31m-    } else if (allowany && !strcmp("any", p)) {[m
[31m-      return allowany;[m
[31m-    } else {[m
[31m-      for (i = 0; ir_names[i]; i++)[m
[31m-	if (!strcmp(ir_names[i], p))[m
[31m-	  return i;[m
[31m-    }[m
[31m-    fprintf(stderr, "Error: bad fold definition token \"%s\" at line %d\n", p, lineno);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Parse a fold rule. */[m
[31m-static void foldrule(char *p)[m
[31m-{[m
[31m-  uint32_t op = nexttoken(&p, 0, 0);[m
[31m-  uint32_t left = nexttoken(&p, 0, 0x7f);[m
[31m-  uint32_t right = nexttoken(&p, 1, 0x3ff);[m
[31m-  uint32_t key = (funcidx << 24) | (op << 17) | (left << 10) | right;[m
[31m-  uint32_t i;[m
[31m-  if (nkeys >= BUILD_MAX_FOLD) {[m
[31m-    fprintf(stderr, "Error: too many fold rules, increase BUILD_MAX_FOLD.\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  /* Simple insertion sort to detect duplicates. */[m
[31m-  for (i = nkeys; i > 0; i--) {[m
[31m-    if ((foldkeys[i-1]&0xffffff) < (key & 0xffffff))[m
[31m-      break;[m
[31m-    if ((foldkeys[i-1]&0xffffff) == (key & 0xffffff)) {[m
[31m-      fprintf(stderr, "Error: duplicate fold definition at line %d\n", lineno);[m
[31m-      exit(1);[m
[31m-    }[m
[31m-    foldkeys[i] = foldkeys[i-1];[m
[31m-  }[m
[31m-  foldkeys[i] = key;[m
[31m-  nkeys++;[m
[31m-}[m
[31m-[m
[31m-/* Emit C source code for IR folding hash table. */[m
[31m-void emit_fold(BuildCtx *ctx)[m
[31m-{[m
[31m-  char buf[256];  /* We don't care about analyzing lines longer than that. */[m
[31m-  const char *fname = ctx->args[0];[m
[31m-  FILE *fp;[m
[31m-[m
[31m-  if (fname == NULL) {[m
[31m-    fprintf(stderr, "Error: missing input filename\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-[m
[31m-  if (fname[0] == '-' && fname[1] == '\0') {[m
[31m-    fp = stdin;[m
[31m-  } else {[m
[31m-    fp = fopen(fname, "r");[m
[31m-    if (!fp) {[m
[31m-      fprintf(stderr, "Error: cannot open input file '%s': %s\n",[m
[31m-	      fname, strerror(errno));[m
[31m-      exit(1);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n");[m
[31m-  fprintf(ctx->fp, "static const FoldFunc fold_func[] = {\n");[m
[31m-[m
[31m-  lineno = 0;[m
[31m-  funcidx = 0;[m
[31m-  nkeys = 0;[m
[31m-  while (fgets(buf, sizeof(buf), fp) != NULL) {[m
[31m-    lineno++;[m
[31m-    /* The prefix must be at the start of a line, otherwise it's ignored. */[m
[31m-    if (!strncmp(buf, FOLDDEF_PREFIX, sizeof(FOLDDEF_PREFIX)-1)) {[m
[31m-      char *p = buf+sizeof(FOLDDEF_PREFIX)-1;[m
[31m-      char *q = strchr(p, ')');[m
[31m-      if (p[0] == '(' && q) {[m
[31m-	p++;[m
[31m-	*q = '\0';[m
[31m-	foldrule(p);[m
[31m-      } else if ((p[0] == 'F' || p[0] == 'X') && p[1] == '(' && q) {[m
[31m-	p += 2;[m
[31m-	*q = '\0';[m
[31m-	if (funcidx)[m
[31m-	  fprintf(ctx->fp, ",\n");[m
[31m-	if (p[-2] == 'X')[m
[31m-	  fprintf(ctx->fp, "  %s", p);[m
[31m-	else[m
[31m-	  fprintf(ctx->fp, "  fold_%s", p);[m
[31m-	funcidx++;[m
[31m-      } else {[m
[31m-	buf[strlen(buf)-1] = '\0';[m
[31m-	fprintf(stderr, "Error: unknown fold definition tag %s%s at line %d\n",[m
[31m-		FOLDDEF_PREFIX, p, lineno);[m
[31m-	exit(1);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  fclose(fp);[m
[31m-  fprintf(ctx->fp, "\n};\n\n");[m
[31m-[m
[31m-  makehash(ctx);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_lib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_lib.c[m
[1mdeleted file mode 100644[m
[1mindex 1adc3cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_lib.c[m
[1m+++ /dev/null[m
[36m@@ -1,457 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder: library definition compiler.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_lib.h"[m
[31m-#include "buildvm_libbc.h"[m
[31m-[m
[31m-/* Context for library definitions. */[m
[31m-static uint8_t obuf[8192];[m
[31m-static uint8_t *optr;[m
[31m-static char modname[80];[m
[31m-static size_t modnamelen;[m
[31m-static char funcname[80];[m
[31m-static int modstate, regfunc;[m
[31m-static int ffid, recffid, ffasmfunc;[m
[31m-[m
[31m-enum {[m
[31m-  REGFUNC_OK,[m
[31m-  REGFUNC_NOREG,[m
[31m-  REGFUNC_NOREGUV[m
[31m-};[m
[31m-[m
[31m-static void libdef_name(const char *p, int kind)[m
[31m-{[m
[31m-  size_t n = strlen(p);[m
[31m-  if (kind != LIBINIT_STRING) {[m
[31m-    if (n > modnamelen && p[modnamelen] == '_' &&[m
[31m-	!strncmp(p, modname, modnamelen)) {[m
[31m-      p += modnamelen+1;[m
[31m-      n -= modnamelen+1;[m
[31m-    }[m
[31m-  }[m
[31m-  if (n > LIBINIT_MAXSTR) {[m
[31m-    fprintf(stderr, "Error: string too long: '%s'\n",  p);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  if (optr+1+n+2 > obuf+sizeof(obuf)) {  /* +2 for caller. */[m
[31m-    fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  *optr++ = (uint8_t)(n | kind);[m
[31m-  memcpy(optr, p, n);[m
[31m-  optr += n;[m
[31m-}[m
[31m-[m
[31m-static void libdef_endmodule(BuildCtx *ctx)[m
[31m-{[m
[31m-  if (modstate != 0) {[m
[31m-    char line[80];[m
[31m-    const uint8_t *p;[m
[31m-    int n;[m
[31m-    if (modstate == 1)[m
[31m-      fprintf(ctx->fp, "  (lua_CFunction)0");[m
[31m-    fprintf(ctx->fp, "\n};\n");[m
[31m-    fprintf(ctx->fp, "static const uint8_t %s%s[] = {\n",[m
[31m-	    LABEL_PREFIX_LIBINIT, modname);[m
[31m-    line[0] = '\0';[m
[31m-    for (n = 0, p = obuf; p < optr; p++) {[m
[31m-      n += sprintf(line+n, "%d,", *p);[m
[31m-      if (n >= 75) {[m
[31m-	fprintf(ctx->fp, "%s\n", line);[m
[31m-	n = 0;[m
[31m-	line[0] = '\0';[m
[31m-      }[m
[31m-    }[m
[31m-    fprintf(ctx->fp, "%s%d\n};\n#endif\n\n", line, LIBINIT_END);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_module(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    libdef_endmodule(ctx);[m
[31m-    optr = obuf;[m
[31m-    *optr++ = (uint8_t)ffid;[m
[31m-    *optr++ = (uint8_t)ffasmfunc;[m
[31m-    *optr++ = 0;  /* Hash table size. */[m
[31m-    modstate = 1;[m
[31m-    fprintf(ctx->fp, "#ifdef %sMODULE_%s\n", LIBDEF_PREFIX, p);[m
[31m-    fprintf(ctx->fp, "#undef %sMODULE_%s\n", LIBDEF_PREFIX, p);[m
[31m-    fprintf(ctx->fp, "static const lua_CFunction %s%s[] = {\n",[m
[31m-	    LABEL_PREFIX_LIBCF, p);[m
[31m-  }[m
[31m-  modnamelen = strlen(p);[m
[31m-  if (modnamelen > sizeof(modname)-1) {[m
[31m-    fprintf(stderr, "Error: module name too long: '%s'\n", p);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  strcpy(modname, p);[m
[31m-}[m
[31m-[m
[31m-static int find_ffofs(BuildCtx *ctx, const char *name)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 0; i < ctx->nglob; i++) {[m
[31m-    const char *gl = ctx->globnames[i];[m
[31m-    if (gl[0] == 'f' && gl[1] == 'f' && gl[2] == '_' && !strcmp(gl+3, name)) {[m
[31m-      return (int)((uint8_t *)ctx->glob[i] - ctx->code);[m
[31m-    }[m
[31m-  }[m
[31m-  fprintf(stderr, "Error: undefined fast function %s%s\n",[m
[31m-	  LABEL_PREFIX_FF, name);[m
[31m-  exit(1);[m
[31m-}[m
[31m-[m
[31m-static void libdef_func(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  if (arg != LIBINIT_CF)[m
[31m-    ffasmfunc++;[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    if (modstate == 0) {[m
[31m-      fprintf(stderr, "Error: no module for function definition %s\n", p);[m
[31m-      exit(1);[m
[31m-    }[m
[31m-    if (regfunc == REGFUNC_NOREG) {[m
[31m-      if (optr+1 > obuf+sizeof(obuf)) {[m
[31m-	fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-	exit(1);[m
[31m-      }[m
[31m-      *optr++ = LIBINIT_FFID;[m
[31m-    } else {[m
[31m-      if (arg != LIBINIT_ASM_) {[m
[31m-	if (modstate != 1) fprintf(ctx->fp, ",\n");[m
[31m-	modstate = 2;[m
[31m-	fprintf(ctx->fp, "  %s%s", arg ? LABEL_PREFIX_FFH : LABEL_PREFIX_CF, p);[m
[31m-      }[m
[31m-      if (regfunc != REGFUNC_NOREGUV) obuf[2]++;  /* Bump hash table size. */[m
[31m-      libdef_name(regfunc == REGFUNC_NOREGUV ? "" : p, arg);[m
[31m-    }[m
[31m-  } else if (ctx->mode == BUILD_ffdef) {[m
[31m-    fprintf(ctx->fp, "FFDEF(%s)\n", p);[m
[31m-  } else if (ctx->mode == BUILD_recdef) {[m
[31m-    if (strlen(p) > sizeof(funcname)-1) {[m
[31m-      fprintf(stderr, "Error: function name too long: '%s'\n", p);[m
[31m-      exit(1);[m
[31m-    }[m
[31m-    strcpy(funcname, p);[m
[31m-  } else if (ctx->mode == BUILD_vmdef) {[m
[31m-    int i;[m
[31m-    for (i = 1; p[i] && modname[i-1]; i++)[m
[31m-      if (p[i] == '_') p[i] = '.';[m
[31m-    fprintf(ctx->fp, "\"%s\",\n", p);[m
[31m-  } else if (ctx->mode == BUILD_bcdef) {[m
[31m-    if (arg != LIBINIT_CF)[m
[31m-      fprintf(ctx->fp, ",\n%d", find_ffofs(ctx, p));[m
[31m-  }[m
[31m-  ffid++;[m
[31m-  regfunc = REGFUNC_OK;[m
[31m-}[m
[31m-[m
[31m-static uint8_t *libdef_uleb128(uint8_t *p, uint32_t *vv)[m
[31m-{[m
[31m-  uint32_t v = *p++;[m
[31m-  if (v >= 0x80) {[m
[31m-    int sh = 0; v &= 0x7f;[m
[31m-    do { v |= ((*p & 0x7f) << (sh += 7)); } while (*p++ >= 0x80);[m
[31m-  }[m
[31m-  *vv = v;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-static void libdef_fixupbc(uint8_t *p)[m
[31m-{[m
[31m-  uint32_t i, sizebc;[m
[31m-  p += 4;[m
[31m-  p = libdef_uleb128(p, &sizebc);[m
[31m-  p = libdef_uleb128(p, &sizebc);[m
[31m-  p = libdef_uleb128(p, &sizebc);[m
[31m-  for (i = 0; i < sizebc; i++, p += 4) {[m
[31m-    uint8_t op = p[libbc_endian ? 3 : 0];[m
[31m-    uint8_t ra = p[libbc_endian ? 2 : 1];[m
[31m-    uint8_t rc = p[libbc_endian ? 1 : 2];[m
[31m-    uint8_t rb = p[libbc_endian ? 0 : 3];[m
[31m-    if (!LJ_DUALNUM && op == BC_ISTYPE && rc == ~LJ_TNUMX+1) {[m
[31m-      op = BC_ISNUM; rc++;[m
[31m-    }[m
[31m-    p[LJ_ENDIAN_SELECT(0, 3)] = op;[m
[31m-    p[LJ_ENDIAN_SELECT(1, 2)] = ra;[m
[31m-    p[LJ_ENDIAN_SELECT(2, 1)] = rc;[m
[31m-    p[LJ_ENDIAN_SELECT(3, 0)] = rb;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_lua(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    int i;[m
[31m-    for (i = 0; libbc_map[i].name != NULL; i++) {[m
[31m-      if (!strcmp(libbc_map[i].name, p)) {[m
[31m-	int ofs = libbc_map[i].ofs;[m
[31m-	int len = libbc_map[i+1].ofs - ofs;[m
[31m-	obuf[2]++;  /* Bump hash table size. */[m
[31m-	*optr++ = LIBINIT_LUA;[m
[31m-	libdef_name(p, 0);[m
[31m-	memcpy(optr, libbc_code + ofs, len);[m
[31m-	libdef_fixupbc(optr);[m
[31m-	optr += len;[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    fprintf(stderr, "Error: missing libbc definition for %s\n", p);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static uint32_t find_rec(char *name)[m
[31m-{[m
[31m-  char *p = (char *)obuf;[m
[31m-  uint32_t n;[m
[31m-  for (n = 2; *p; n++) {[m
[31m-    if (strcmp(p, name) == 0)[m
[31m-      return n;[m
[31m-    p += strlen(p)+1;[m
[31m-  }[m
[31m-  if (p+strlen(name)+1 >= (char *)obuf+sizeof(obuf)) {[m
[31m-    fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-    exit(1);[m
[31m-  }[m
[31m-  strcpy(p, name);[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-static void libdef_rec(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_recdef) {[m
[31m-    char *q;[m
[31m-    uint32_t n;[m
[31m-    for (; recffid+1 < ffid; recffid++)[m
[31m-      fprintf(ctx->fp, ",\n0");[m
[31m-    recffid = ffid;[m
[31m-    if (*p == '.') p = funcname;[m
[31m-    q = strchr(p, ' ');[m
[31m-    if (q) *q++ = '\0';[m
[31m-    n = find_rec(p);[m
[31m-    if (q)[m
[31m-      fprintf(ctx->fp, ",\n0x%02x00+(%s)", n, q);[m
[31m-    else[m
[31m-      fprintf(ctx->fp, ",\n0x%02x00", n);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void memcpy_endian(void *dst, void *src, size_t n)[m
[31m-{[m
[31m-  union { uint8_t b; uint32_t u; } host_endian;[m
[31m-  host_endian.u = 1;[m
[31m-  if (host_endian.b == LJ_ENDIAN_SELECT(1, 0)) {[m
[31m-    memcpy(dst, src, n);[m
[31m-  } else {[m
[31m-    size_t i;[m
[31m-    for (i = 0; i < n; i++)[m
[31m-      ((uint8_t *)dst)[i] = ((uint8_t *)src)[n-i-1];[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_push(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    int len = (int)strlen(p);[m
[31m-    if (*p == '"') {[m
[31m-      if (len > 1 && p[len-1] == '"') {[m
[31m-	p[len-1] = '\0';[m
[31m-	libdef_name(p+1, LIBINIT_STRING);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else if (*p >= '0' && *p <= '9') {[m
[31m-      char *ep;[m
[31m-      double d = strtod(p, &ep);[m
[31m-      if (*ep == '\0') {[m
[31m-	if (optr+1+sizeof(double) > obuf+sizeof(obuf)) {[m
[31m-	  fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-	  exit(1);[m
[31m-	}[m
[31m-	*optr++ = LIBINIT_NUMBER;[m
[31m-	memcpy_endian(optr, &d, sizeof(double));[m
[31m-	optr += sizeof(double);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else if (!strcmp(p, "lastcl")) {[m
[31m-      if (optr+1 > obuf+sizeof(obuf)) {[m
[31m-	fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-	exit(1);[m
[31m-      }[m
[31m-      *optr++ = LIBINIT_LASTCL;[m
[31m-      return;[m
[31m-    } else if (len > 4 && !strncmp(p, "top-", 4)) {[m
[31m-      if (optr+2 > obuf+sizeof(obuf)) {[m
[31m-	fprintf(stderr, "Error: output buffer overflow\n");[m
[31m-	exit(1);[m
[31m-      }[m
[31m-      *optr++ = LIBINIT_COPY;[m
[31m-      *optr++ = (uint8_t)atoi(p+4);[m
[31m-      return;[m
[31m-    }[m
[31m-    fprintf(stderr, "Error: bad value for %sPUSH(%s)\n", LIBDEF_PREFIX, p);[m
[31m-    exit(1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_set(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(arg);[m
[31m-  if (ctx->mode == BUILD_libdef) {[m
[31m-    if (p[0] == '!' && p[1] == '\0') p[0] = '\0';  /* Set env. */[m
[31m-    libdef_name(p, LIBINIT_STRING);[m
[31m-    *optr++ = LIBINIT_SET;[m
[31m-    obuf[2]++;  /* Bump hash table size. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void libdef_regfunc(BuildCtx *ctx, char *p, int arg)[m
[31m-{[m
[31m-  UNUSED(ctx); UNUSED(p);[m
[31m-  regfunc = arg;[m
[31m-}[m
[31m-[m
[31m-typedef void (*LibDefFunc)(BuildCtx *ctx, char *p, int arg);[m
[31m-[m
[31m-typedef struct LibDefHandler {[m
[31m-  const char *suffix;[m
[31m-  const char *stop;[m
[31m-  const LibDefFunc func;[m
[31m-  const int arg;[m
[31m-} LibDefHandler;[m
[31m-[m
[31m-static const LibDefHandler libdef_handlers[] = {[m
[31m-  { "MODULE_",	" \t\r\n",	libdef_module,		0 },[m
[31m-  { "CF(",	")",		libdef_func,		LIBINIT_CF },[m
[31m-  { "ASM(",	")",		libdef_func,		LIBINIT_ASM },[m
[31m-  { "ASM_(",	")",		libdef_func,		LIBINIT_ASM_ },[m
[31m-  { "LUA(",	")",		libdef_lua,		0 },[m
[31m-  { "REC(",	")",		libdef_rec,		0 },[m
[31m-  { "PUSH(",	")",		libdef_push,		0 },[m
[31m-  { "SET(",	")",		libdef_set,		0 },[m
[31m-  { "NOREGUV",	NULL,		libdef_regfunc,		REGFUNC_NOREGUV },[m
[31m-  { "NOREG",	NULL,		libdef_regfunc,		REGFUNC_NOREG },[m
[31m-  { NULL,	NULL,		(LibDefFunc)0,		0 }[m
[31m-};[m
[31m-[m
[31m-/* Emit C source code for library function definitions. */[m
[31m-void emit_lib(BuildCtx *ctx)[m
[31m-{[m
[31m-  const char *fname;[m
[31m-[m
[31m-  if (ctx->mode == BUILD_ffdef || ctx->mode == BUILD_libdef ||[m
[31m-      ctx->mode == BUILD_recdef)[m
[31m-    fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n");[m
[31m-  else if (ctx->mode == BUILD_vmdef)[m
[31m-    fprintf(ctx->fp, "ffnames = {\n[0]=\"Lua\",\n\"C\",\n");[m
[31m-  if (ctx->mode == BUILD_recdef)[m
[31m-    fprintf(ctx->fp, "static const uint16_t recff_idmap[] = {\n0,\n0x0100");[m
[31m-  recffid = ffid = FF_C+1;[m
[31m-  ffasmfunc = 0;[m
[31m-[m
[31m-  while ((fname = *ctx->args++)) {[m
[31m-    char buf[256];  /* We don't care about analyzing lines longer than that. */[m
[31m-    FILE *fp;[m
[31m-    if (fname[0] == '-' && fname[1] == '\0') {[m
[31m-      fp = stdin;[m
[31m-    } else {[m
[31m-      fp = fopen(fname, "r");[m
[31m-      if (!fp) {[m
[31m-	fprintf(stderr, "Error: cannot open input file '%s': %s\n",[m
[31m-		fname, strerror(errno));[m
[31m-	exit(1);[m
[31m-      }[m
[31m-    }[m
[31m-    modstate = 0;[m
[31m-    regfunc = REGFUNC_OK;[m
[31m-    while (fgets(buf, sizeof(buf), fp) != NULL) {[m
[31m-      char *p;[m
[31m-      /* Simplistic pre-processor. Only handles top-level #if/#endif. */[m
[31m-      if (buf[0] == '#' && buf[1] == 'i' && buf[2] == 'f') {[m
[31m-	int ok = 1;[m
[31m-	if (!strcmp(buf, "#if LJ_52\n"))[m
[31m-	  ok = LJ_52;[m
[31m-	else if (!strcmp(buf, "#if LJ_HASJIT\n"))[m
[31m-	  ok = LJ_HASJIT;[m
[31m-	else if (!strcmp(buf, "#if LJ_HASFFI\n"))[m
[31m-	  ok = LJ_HASFFI;[m
[31m-	if (!ok) {[m
[31m-	  int lvl = 1;[m
[31m-	  while (fgets(buf, sizeof(buf), fp) != NULL) {[m
[31m-	    if (buf[0] == '#' && buf[1] == 'e' && buf[2] == 'n') {[m
[31m-	      if (--lvl == 0) break;[m
[31m-	    } else if (buf[0] == '#' && buf[1] == 'i' && buf[2] == 'f') {[m
[31m-	      lvl++;[m
[31m-	    }[m
[31m-	  }[m
[31m-	  continue;[m
[31m-	}[m
[31m-      }[m
[31m-      for (p = buf; (p = strstr(p, LIBDEF_PREFIX)) != NULL; ) {[m
[31m-	const LibDefHandler *ldh;[m
[31m-	p += sizeof(LIBDEF_PREFIX)-1;[m
[31m-	for (ldh = libdef_handlers; ldh->suffix != NULL; ldh++) {[m
[31m-	  size_t n, len = strlen(ldh->suffix);[m
[31m-	  if (!strncmp(p, ldh->suffix, len)) {[m
[31m-	    p += len;[m
[31m-	    n = ldh->stop ? strcspn(p, ldh->stop) : 0;[m
[31m-	    if (!p[n]) break;[m
[31m-	    p[n] = '\0';[m
[31m-	    ldh->func(ctx, p, ldh->arg);[m
[31m-	    p += n+1;[m
[31m-	    break;[m
[31m-	  }[m
[31m-	}[m
[31m-	if (ldh->suffix == NULL) {[m
[31m-	  buf[strlen(buf)-1] = '\0';[m
[31m-	  fprintf(stderr, "Error: unknown library definition tag %s%s\n",[m
[31m-		  LIBDEF_PREFIX, p);[m
[31m-	  exit(1);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    fclose(fp);[m
[31m-    if (ctx->mode == BUILD_libdef) {[m
[31m-      libdef_endmodule(ctx);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (ctx->mode == BUILD_ffdef) {[m
[31m-    fprintf(ctx->fp, "\n#undef FFDEF\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-      "#ifndef FF_NUM_ASMFUNC\n#define FF_NUM_ASMFUNC %d\n#endif\n\n",[m
[31m-      ffasmfunc);[m
[31m-  } else if (ctx->mode == BUILD_vmdef) {[m
[31m-    fprintf(ctx->fp, "},\n\n");[m
[31m-  } else if (ctx->mode == BUILD_bcdef) {[m
[31m-    int i;[m
[31m-    fprintf(ctx->fp, "\n};\n\n");[m
[31m-    fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_mode[] = {\n");[m
[31m-    fprintf(ctx->fp, "BCDEF(BCMODE)\n");[m
[31m-    for (i = ffasmfunc-1; i > 0; i--)[m
[31m-      fprintf(ctx->fp, "BCMODE_FF,\n");[m
[31m-    fprintf(ctx->fp, "BCMODE_FF\n};\n\n");[m
[31m-  } else if (ctx->mode == BUILD_recdef) {[m
[31m-    char *p = (char *)obuf;[m
[31m-    fprintf(ctx->fp, "\n};\n\n");[m
[31m-    fprintf(ctx->fp, "static const RecordFunc recff_func[] = {\n"[m
[31m-	    "recff_nyi,\n"[m
[31m-	    "recff_c");[m
[31m-    while (*p) {[m
[31m-      fprintf(ctx->fp, ",\nrecff_%s", p);[m
[31m-      p += strlen(p)+1;[m
[31m-    }[m
[31m-    fprintf(ctx->fp, "\n};\n\n");[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_libbc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_libbc.h[m
[1mdeleted file mode 100644[m
[1mindex 45f8f8c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_libbc.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-/* This is a generated file. DO NOT EDIT! */[m
[31m-[m
[31m-static const int libbc_endian = 0;[m
[31m-[m
[31m-static const uint8_t libbc_code[] = {[m
[31m-#if LJ_FR2[m
[31m-0,1,2,0,0,1,2,24,1,0,0,76,1,2,0,241,135,158,166,3,220,203,178,130,4,0,1,2,0,[m
[31m-0,1,2,24,1,0,0,76,1,2,0,243,244,148,165,20,198,190,199,252,3,0,1,2,0,0,0,3,[m
[31m-16,0,5,0,21,1,0,0,76,1,2,0,0,2,10,0,0,0,15,16,0,12,0,16,1,9,0,41,2,1,0,21,3,[m
[31m-0,0,41,4,1,0,77,2,8,128,18,6,1,0,18,8,5,0,59,9,5,0,66,6,3,2,10,6,0,0,88,7,1,[m
[31m-128,76,6,2,0,79,2,248,127,75,0,1,0,0,2,11,0,0,0,16,16,0,12,0,16,1,9,0,43,2,[m
[31m-0,0,18,3,0,0,41,4,0,0,88,5,7,128,18,7,1,0,18,9,5,0,18,10,6,0,66,7,3,2,10,7,[m
[31m-0,0,88,8,1,128,76,7,2,0,70,5,3,3,82,5,247,127,75,0,1,0,0,1,2,0,0,0,3,16,0,12,[m
[31m-0,21,1,0,0,76,1,2,0,0,2,10,0,0,2,30,16,0,12,0,21,2,0,0,11,1,0,0,88,3,7,128,[m
[31m-8,2,0,0,88,3,23,128,59,3,2,0,43,4,0,0,64,4,2,0,76,3,2,0,88,3,18,128,16,1,14,[m
[31m-0,41,3,1,0,3,3,1,0,88,3,14,128,3,1,2,0,88,3,12,128,59,3,1,0,22,4,1,1,18,5,2,[m
[31m-0,41,6,1,0,77,4,4,128,23,8,1,7,59,9,7,0,64,9,8,0,79,4,252,127,43,4,0,0,64,4,[m
[31m-2,0,76,3,2,0,75,0,1,0,0,2,0[m
[31m-#else[m
[31m-0,1,2,0,0,1,2,24,1,0,0,76,1,2,0,241,135,158,166,3,220,203,178,130,4,0,1,2,0,[m
[31m-0,1,2,24,1,0,0,76,1,2,0,243,244,148,165,20,198,190,199,252,3,0,1,2,0,0,0,3,[m
[31m-16,0,5,0,21,1,0,0,76,1,2,0,0,2,9,0,0,0,15,16,0,12,0,16,1,9,0,41,2,1,0,21,3,[m
[31m-0,0,41,4,1,0,77,2,8,128,18,6,1,0,18,7,5,0,59,8,5,0,66,6,3,2,10,6,0,0,88,7,1,[m
[31m-128,76,6,2,0,79,2,248,127,75,0,1,0,0,2,10,0,0,0,16,16,0,12,0,16,1,9,0,43,2,[m
[31m-0,0,18,3,0,0,41,4,0,0,88,5,7,128,18,7,1,0,18,8,5,0,18,9,6,0,66,7,3,2,10,7,0,[m
[31m-0,88,8,1,128,76,7,2,0,70,5,3,3,82,5,247,127,75,0,1,0,0,1,2,0,0,0,3,16,0,12,[m
[31m-0,21,1,0,0,76,1,2,0,0,2,10,0,0,2,30,16,0,12,0,21,2,0,0,11,1,0,0,88,3,7,128,[m
[31m-8,2,0,0,88,3,23,128,59,3,2,0,43,4,0,0,64,4,2,0,76,3,2,0,88,3,18,128,16,1,14,[m
[31m-0,41,3,1,0,3,3,1,0,88,3,14,128,3,1,2,0,88,3,12,128,59,3,1,0,22,4,1,1,18,5,2,[m
[31m-0,41,6,1,0,77,4,4,128,23,8,1,7,59,9,7,0,64,9,8,0,79,4,252,127,43,4,0,0,64,4,[m
[31m-2,0,76,3,2,0,75,0,1,0,0,2,0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-static const struct { const char *name; int ofs; } libbc_map[] = {[m
[31m-{"math_deg",0},[m
[31m-{"math_rad",25},[m
[31m-{"string_len",50},[m
[31m-{"table_foreachi",69},[m
[31m-{"table_foreach",136},[m
[31m-{"table_getn",207},[m
[31m-{"table_remove",226},[m
[31m-{NULL,355}[m
[31m-};[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_peobj.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_peobj.c[m
[1mdeleted file mode 100644[m
[1mindex e8c927d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/buildvm_peobj.c[m
[1m+++ /dev/null[m
[36m@@ -1,368 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM builder: PE object emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Only used for building on Windows, since we cannot assume the presence[m
[31m-** of a suitable assembler. The host and target byte order must match.[m
[31m-*/[m
[31m-[m
[31m-#include "buildvm.h"[m
[31m-#include "lj_bc.h"[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64 || LJ_TARGET_PPC[m
[31m-[m
[31m-/* Context for PE object emitter. */[m
[31m-static char *strtab;[m
[31m-static size_t strtabofs;[m
[31m-[m
[31m-/* -- PE object definitions ----------------------------------------------- */[m
[31m-[m
[31m-/* PE header. */[m
[31m-typedef struct PEheader {[m
[31m-  uint16_t arch;[m
[31m-  uint16_t nsects;[m
[31m-  uint32_t time;[m
[31m-  uint32_t symtabofs;[m
[31m-  uint32_t nsyms;[m
[31m-  uint16_t opthdrsz;[m
[31m-  uint16_t flags;[m
[31m-} PEheader;[m
[31m-[m
[31m-/* PE section. */[m
[31m-typedef struct PEsection {[m
[31m-  char name[8];[m
[31m-  uint32_t vsize;[m
[31m-  uint32_t vaddr;[m
[31m-  uint32_t size;[m
[31m-  uint32_t ofs;[m
[31m-  uint32_t relocofs;[m
[31m-  uint32_t lineofs;[m
[31m-  uint16_t nreloc;[m
[31m-  uint16_t nline;[m
[31m-  uint32_t flags;[m
[31m-} PEsection;[m
[31m-[m
[31m-/* PE relocation. */[m
[31m-typedef struct PEreloc {[m
[31m-  uint32_t vaddr;[m
[31m-  uint32_t symidx;[m
[31m-  uint16_t type;[m
[31m-} PEreloc;[m
[31m-[m
[31m-/* Cannot use sizeof, because it pads up to the max. alignment. */[m
[31m-#define PEOBJ_RELOC_SIZE	(4+4+2)[m
[31m-[m
[31m-/* PE symbol table entry. */[m
[31m-typedef struct PEsym {[m
[31m-  union {[m
[31m-    char name[8];[m
[31m-    uint32_t nameref[2];[m
[31m-  } n;[m
[31m-  uint32_t value;[m
[31m-  int16_t sect;[m
[31m-  uint16_t type;[m
[31m-  uint8_t scl;[m
[31m-  uint8_t naux;[m
[31m-} PEsym;[m
[31m-[m
[31m-/* PE symbol table auxiliary entry for a section. */[m
[31m-typedef struct PEsymaux {[m
[31m-  uint32_t size;[m
[31m-  uint16_t nreloc;[m
[31m-  uint16_t nline;[m
[31m-  uint32_t cksum;[m
[31m-  uint16_t assoc;[m
[31m-  uint8_t comdatsel;[m
[31m-  uint8_t unused[3];[m
[31m-} PEsymaux;[m
[31m-[m
[31m-/* Cannot use sizeof, because it pads up to the max. alignment. */[m
[31m-#define PEOBJ_SYM_SIZE	(8+4+2+2+1+1)[m
[31m-[m
[31m-/* PE object CPU specific defines. */[m
[31m-#if LJ_TARGET_X86[m
[31m-#define PEOBJ_ARCH_TARGET	0x014c[m
[31m-#define PEOBJ_RELOC_REL32	0x14  /* MS: REL32, GNU: DISP32. */[m
[31m-#define PEOBJ_RELOC_DIR32	0x06[m
[31m-#define PEOBJ_RELOC_OFS		0[m
[31m-#define PEOBJ_TEXT_FLAGS	0x60500020  /* 60=r+x, 50=align16, 20=code. */[m
[31m-#elif LJ_TARGET_X64[m
[31m-#define PEOBJ_ARCH_TARGET	0x8664[m
[31m-#define PEOBJ_RELOC_REL32	0x04  /* MS: REL32, GNU: DISP32. */[m
[31m-#define PEOBJ_RELOC_DIR32	0x02[m
[31m-#define PEOBJ_RELOC_ADDR32NB	0x03[m
[31m-#define PEOBJ_RELOC_OFS		0[m
[31m-#define PEOBJ_TEXT_FLAGS	0x60500020  /* 60=r+x, 50=align16, 20=code. */[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#define PEOBJ_ARCH_TARGET	0x01f2[m
[31m-#define PEOBJ_RELOC_REL32	0x06[m
[31m-#define PEOBJ_RELOC_DIR32	0x02[m
[31m-#define PEOBJ_RELOC_OFS		(-4)[m
[31m-#define PEOBJ_TEXT_FLAGS	0x60400020  /* 60=r+x, 40=align8, 20=code. */[m
[31m-#endif[m
[31m-[m
[31m-/* Section numbers (0-based). */[m
[31m-enum {[m
[31m-  PEOBJ_SECT_ABS = -2,[m
[31m-  PEOBJ_SECT_UNDEF = -1,[m
[31m-  PEOBJ_SECT_TEXT,[m
[31m-#if LJ_TARGET_X64[m
[31m-  PEOBJ_SECT_PDATA,[m
[31m-  PEOBJ_SECT_XDATA,[m
[31m-#endif[m
[31m-  PEOBJ_SECT_RDATA_Z,[m
[31m-  PEOBJ_NSECTIONS[m
[31m-};[m
[31m-[m
[31m-/* Symbol types. */[m
[31m-#define PEOBJ_TYPE_NULL		0[m
[31m-#define PEOBJ_TYPE_FUNC		0x20[m
[31m-[m
[31m-/* Symbol storage class. */[m
[31m-#define PEOBJ_SCL_EXTERN	2[m
[31m-#define PEOBJ_SCL_STATIC	3[m
[31m-[m
[31m-/* -- PE object emitter --------------------------------------------------- */[m
[31m-[m
[31m-/* Emit PE object symbol. */[m
[31m-static void emit_peobj_sym(BuildCtx *ctx, const char *name, uint32_t value,[m
[31m-			   int sect, int type, int scl)[m
[31m-{[m
[31m-  PEsym sym;[m
[31m-  size_t len = strlen(name);[m
[31m-  if (!strtab) {  /* Pass 1: only calculate string table length. */[m
[31m-    if (len > 8) strtabofs += len+1;[m
[31m-    return;[m
[31m-  }[m
[31m-  if (len <= 8) {[m
[31m-    memcpy(sym.n.name, name, len);[m
[31m-    memset(sym.n.name+len, 0, 8-len);[m
[31m-  } else {[m
[31m-    sym.n.nameref[0] = 0;[m
[31m-    sym.n.nameref[1] = (uint32_t)strtabofs;[m
[31m-    memcpy(strtab + strtabofs, name, len);[m
[31m-    strtab[strtabofs+len] = 0;[m
[31m-    strtabofs += len+1;[m
[31m-  }[m
[31m-  sym.value = value;[m
[31m-  sym.sect = (int16_t)(sect+1);  /* 1-based section number. */[m
[31m-  sym.type = (uint16_t)type;[m
[31m-  sym.scl = (uint8_t)scl;[m
[31m-  sym.naux = 0;[m
[31m-  owrite(ctx, &sym, PEOBJ_SYM_SIZE);[m
[31m-}[m
[31m-[m
[31m-/* Emit PE object section symbol. */[m
[31m-static void emit_peobj_sym_sect(BuildCtx *ctx, PEsection *pesect, int sect)[m
[31m-{[m
[31m-  PEsym sym;[m
[31m-  PEsymaux aux;[m
[31m-  if (!strtab) return;  /* Pass 1: no output. */[m
[31m-  memcpy(sym.n.name, pesect[sect].name, 8);[m
[31m-  sym.value = 0;[m
[31m-  sym.sect = (int16_t)(sect+1);  /* 1-based section number. */[m
[31m-  sym.type = PEOBJ_TYPE_NULL;[m
[31m-  sym.scl = PEOBJ_SCL_STATIC;[m
[31m-  sym.naux = 1;[m
[31m-  owrite(ctx, &sym, PEOBJ_SYM_SIZE);[m
[31m-  memset(&aux, 0, sizeof(PEsymaux));[m
[31m-  aux.size = pesect[sect].size;[m
[31m-  aux.nreloc = pesect[sect].nreloc;[m
[31m-  owrite(ctx, &aux, PEOBJ_SYM_SIZE);[m
[31m-}[m
[31m-[m
[31m-/* Emit Windows PE object file. */[m
[31m-void emit_peobj(BuildCtx *ctx)[m
[31m-{[m
[31m-  PEheader pehdr;[m
[31m-  PEsection pesect[PEOBJ_NSECTIONS];[m
[31m-  uint32_t sofs;[m
[31m-  int i, nrsym;[m
[31m-  union { uint8_t b; uint32_t u; } host_endian;[m
[31m-[m
[31m-  sofs = sizeof(PEheader) + PEOBJ_NSECTIONS*sizeof(PEsection);[m
[31m-[m
[31m-  /* Fill in PE sections. */[m
[31m-  memset(&pesect, 0, PEOBJ_NSECTIONS*sizeof(PEsection));[m
[31m-  memcpy(pesect[PEOBJ_SECT_TEXT].name, ".text", sizeof(".text")-1);[m
[31m-  pesect[PEOBJ_SECT_TEXT].ofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_TEXT].size = (uint32_t)ctx->codesz);[m
[31m-  pesect[PEOBJ_SECT_TEXT].relocofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_TEXT].nreloc = (uint16_t)ctx->nreloc) * PEOBJ_RELOC_SIZE;[m
[31m-  /* Flags: 60 = read+execute, 50 = align16, 20 = code. */[m
[31m-  pesect[PEOBJ_SECT_TEXT].flags = PEOBJ_TEXT_FLAGS;[m
[31m-[m
[31m-#if LJ_TARGET_X64[m
[31m-  memcpy(pesect[PEOBJ_SECT_PDATA].name, ".pdata", sizeof(".pdata")-1);[m
[31m-  pesect[PEOBJ_SECT_PDATA].ofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_PDATA].size = 6*4);[m
[31m-  pesect[PEOBJ_SECT_PDATA].relocofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_PDATA].nreloc = 6) * PEOBJ_RELOC_SIZE;[m
[31m-  /* Flags: 40 = read, 30 = align4, 40 = initialized data. */[m
[31m-  pesect[PEOBJ_SECT_PDATA].flags = 0x40300040;[m
[31m-[m
[31m-  memcpy(pesect[PEOBJ_SECT_XDATA].name, ".xdata", sizeof(".xdata")-1);[m
[31m-  pesect[PEOBJ_SECT_XDATA].ofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_XDATA].size = 8*2+4+6*2);  /* See below. */[m
[31m-  pesect[PEOBJ_SECT_XDATA].relocofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_XDATA].nreloc = 1) * PEOBJ_RELOC_SIZE;[m
[31m-  /* Flags: 40 = read, 30 = align4, 40 = initialized data. */[m
[31m-  pesect[PEOBJ_SECT_XDATA].flags = 0x40300040;[m
[31m-#endif[m
[31m-[m
[31m-  memcpy(pesect[PEOBJ_SECT_RDATA_Z].name, ".rdata$Z", sizeof(".rdata$Z")-1);[m
[31m-  pesect[PEOBJ_SECT_RDATA_Z].ofs = sofs;[m
[31m-  sofs += (pesect[PEOBJ_SECT_RDATA_Z].size = (uint32_t)strlen(ctx->dasm_ident)+1);[m
[31m-  /* Flags: 40 = read, 30 = align4, 40 = initialized data. */[m
[31m-  pesect[PEOBJ_SECT_RDATA_Z].flags = 0x40300040;[m
[31m-[m
[31m-  /* Fill in PE header. */[m
[31m-  pehdr.arch = PEOBJ_ARCH_TARGET;[m
[31m-  pehdr.nsects = PEOBJ_NSECTIONS;[m
[31m-  pehdr.time = 0;  /* Timestamp is optional. */[m
[31m-  pehdr.symtabofs = sofs;[m
[31m-  pehdr.opthdrsz = 0;[m
[31m-  pehdr.flags = 0;[m
[31m-[m
[31m-  /* Compute the size of the symbol table:[m
[31m-  ** @feat.00 + nsections*2[m
[31m-  ** + asm_start + nsym[m
[31m-  ** + nrsym[m
[31m-  */[m
[31m-  nrsym = ctx->nrelocsym;[m
[31m-  pehdr.nsyms = 1+PEOBJ_NSECTIONS*2 + 1+ctx->nsym + nrsym;[m
[31m-#if LJ_TARGET_X64[m
[31m-  pehdr.nsyms += 1;  /* Symbol for lj_err_unwind_win64. */[m
[31m-#endif[m
[31m-[m
[31m-  /* Write PE object header and all sections. */[m
[31m-  owrite(ctx, &pehdr, sizeof(PEheader));[m
[31m-  owrite(ctx, &pesect, sizeof(PEsection)*PEOBJ_NSECTIONS);[m
[31m-[m
[31m-  /* Write .text section. */[m
[31m-  host_endian.u = 1;[m
[31m-  if (host_endian.b != LJ_ENDIAN_SELECT(1, 0)) {[m
[31m-#if LJ_TARGET_PPC[m
[31m-    uint32_t *p = (uint32_t *)ctx->code;[m
[31m-    int n = (int)(ctx->codesz >> 2);[m
[31m-    for (i = 0; i < n; i++, p++)[m
[31m-      *p = lj_bswap(*p);  /* Byteswap .text section. */[m
[31m-#else[m
[31m-    fprintf(stderr, "Error: different byte order for host and target\n");[m
[31m-    exit(1);[m
[31m-#endif[m
[31m-  }[m
[31m-  owrite(ctx, ctx->code, ctx->codesz);[m
[31m-  for (i = 0; i < ctx->nreloc; i++) {[m
[31m-    PEreloc reloc;[m
[31m-    reloc.vaddr = (uint32_t)ctx->reloc[i].ofs + PEOBJ_RELOC_OFS;[m
[31m-    reloc.symidx = 1+2+ctx->reloc[i].sym;  /* Reloc syms are after .text sym. */[m
[31m-    reloc.type = ctx->reloc[i].type ? PEOBJ_RELOC_REL32 : PEOBJ_RELOC_DIR32;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-  }[m
[31m-[m
[31m-#if LJ_TARGET_X64[m
[31m-  { /* Write .pdata section. */[m
[31m-    uint32_t fcofs = (uint32_t)ctx->sym[ctx->nsym-1].ofs;[m
[31m-    uint32_t pdata[3];  /* Start of .text, end of .text and .xdata. */[m
[31m-    PEreloc reloc;[m
[31m-    pdata[0] = 0; pdata[1] = fcofs; pdata[2] = 0;[m
[31m-    owrite(ctx, &pdata, sizeof(pdata));[m
[31m-    pdata[0] = fcofs; pdata[1] = (uint32_t)ctx->codesz; pdata[2] = 20;[m
[31m-    owrite(ctx, &pdata, sizeof(pdata));[m
[31m-    reloc.vaddr = 0; reloc.symidx = 1+2+nrsym+2+2+1;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 4; reloc.symidx = 1+2+nrsym+2+2+1;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 8; reloc.symidx = 1+2+nrsym+2;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 12; reloc.symidx = 1+2+nrsym+2+2+1;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 16; reloc.symidx = 1+2+nrsym+2+2+1;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-    reloc.vaddr = 20; reloc.symidx = 1+2+nrsym+2;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-  }[m
[31m-  { /* Write .xdata section. */[m
[31m-    uint16_t xdata[8+2+6];[m
[31m-    PEreloc reloc;[m
[31m-    xdata[0] = 0x01|0x08|0x10;  /* Ver. 1, uhandler/ehandler, prolog size 0. */[m
[31m-    xdata[1] = 0x0005;  /* Number of unwind codes, no frame pointer. */[m
[31m-    xdata[2] = 0x4200;  /* Stack offset 4*8+8 = aword*5. */[m
[31m-    xdata[3] = 0x3000;  /* Push rbx. */[m
[31m-    xdata[4] = 0x6000;  /* Push rsi. */[m
[31m-    xdata[5] = 0x7000;  /* Push rdi. */[m
[31m-    xdata[6] = 0x5000;  /* Push rbp. */[m
[31m-    xdata[7] = 0;  /* Alignment. */[m
[31m-    xdata[8] = xdata[9] = 0;  /* Relocated address of exception handler. */[m
[31m-    xdata[10] = 0x01;  /* Ver. 1, no handler, prolog size 0. */[m
[31m-    xdata[11] = 0x1504;  /* Number of unwind codes, fp = rbp, fpofs = 16. */[m
[31m-    xdata[12] = 0x0300;  /* set_fpreg. */[m
[31m-    xdata[13] = 0x0200;  /* stack offset 0*8+8 = aword*1. */[m
[31m-    xdata[14] = 0x3000;  /* Push rbx. */[m
[31m-    xdata[15] = 0x5000;  /* Push rbp. */[m
[31m-    owrite(ctx, &xdata, sizeof(xdata));[m
[31m-    reloc.vaddr = 2*8; reloc.symidx = 1+2+nrsym+2+2;[m
[31m-    reloc.type = PEOBJ_RELOC_ADDR32NB;[m
[31m-    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  /* Write .rdata$Z section. */[m
[31m-  owrite(ctx, ctx->dasm_ident, strlen(ctx->dasm_ident)+1);[m
[31m-[m
[31m-  /* Write symbol table. */[m
[31m-  strtab = NULL;  /* 1st pass: collect string sizes. */[m
[31m-  for (;;) {[m
[31m-    strtabofs = 4;[m
[31m-    /* Mark as SafeSEH compliant. */[m
[31m-    emit_peobj_sym(ctx, "@feat.00", 1,[m
[31m-		   PEOBJ_SECT_ABS, PEOBJ_TYPE_NULL, PEOBJ_SCL_STATIC);[m
[31m-[m
[31m-    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_TEXT);[m
[31m-    for (i = 0; i < nrsym; i++)[m
[31m-      emit_peobj_sym(ctx, ctx->relocsym[i], 0,[m
[31m-		     PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN);[m
[31m-[m
[31m-#if LJ_TARGET_X64[m
[31m-    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_PDATA);[m
[31m-    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_XDATA);[m
[31m-    emit_peobj_sym(ctx, "lj_err_unwind_win64", 0,[m
[31m-		   PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN);[m
[31m-#endif[m
[31m-[m
[31m-    emit_peobj_sym(ctx, ctx->beginsym, 0,[m
[31m-		   PEOBJ_SECT_TEXT, PEOBJ_TYPE_NULL, PEOBJ_SCL_EXTERN);[m
[31m-    for (i = 0; i < ctx->nsym; i++)[m
[31m-      emit_peobj_sym(ctx, ctx->sym[i].name, (uint32_t)ctx->sym[i].ofs,[m
[31m-		     PEOBJ_SECT_TEXT, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN);[m
[31m-[m
[31m-    emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_RDATA_Z);[m
[31m-[m
[31m-    if (strtab)[m
[31m-      break;[m
[31m-    /* 2nd pass: alloc strtab, write syms and copy strings. */[m
[31m-    strtab = (char *)malloc(strtabofs);[m
[31m-    *(uint32_t *)strtab = (uint32_t)strtabofs;[m
[31m-  }[m
[31m-[m
[31m-  /* Write string table. */[m
[31m-  owrite(ctx, strtab, strtabofs);[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-void emit_peobj(BuildCtx *ctx)[m
[31m-{[m
[31m-  UNUSED(ctx);[m
[31m-  fprintf(stderr, "Error: no PE object support for this target\n");[m
[31m-  exit(1);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/genlibbc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/genlibbc.lua[m
[1mdeleted file mode 100644[m
[1mindex 7a17a3d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/genlibbc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,197 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- Lua script to dump the bytecode of the library functions written in Lua.[m
[31m--- The resulting 'buildvm_libbc.h' is used for the build process of LuaJIT.[m
[31m-----------------------------------------------------------------------------[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m-local ffi = require("ffi")[m
[31m-local bit = require("bit")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local bcnames = vmdef.bcnames[m
[31m-[m
[31m-local format = string.format[m
[31m-[m
[31m-local isbe = (string.byte(string.dump(function() end), 5) % 2 == 1)[m
[31m-[m
[31m-local function usage(arg)[m
[31m-  io.stderr:write("Usage: ", arg and arg[0] or "genlibbc",[m
[31m-		  " [-o buildvm_libbc.h] lib_*.c\n")[m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function parse_arg(arg)[m
[31m-  local outfile = "-"[m
[31m-  if not (arg and arg[1]) then[m
[31m-    usage(arg)[m
[31m-  end[m
[31m-  if arg[1] == "-o" then[m
[31m-    outfile = arg[2][m
[31m-    if not outfile then usage(arg) end[m
[31m-    table.remove(arg, 1)[m
[31m-    table.remove(arg, 1)[m
[31m-  end[m
[31m-  return outfile[m
[31m-end[m
[31m-[m
[31m-local function read_files(names)[m
[31m-  local src = ""[m
[31m-  for _,name in ipairs(names) do[m
[31m-    local fp = assert(io.open(name))[m
[31m-    src = src .. fp:read("*a")[m
[31m-    fp:close()[m
[31m-  end[m
[31m-  return src[m
[31m-end[m
[31m-[m
[31m-local function transform_lua(code)[m
[31m-  local fixup = {}[m
[31m-  local n = -30000[m
[31m-  code = string.gsub(code, "CHECK_(%w*)%((.-)%)", function(tp, var)[m
[31m-    n = n + 1[m
[31m-    fixup[n] = { "CHECK", tp }[m
[31m-    return format("%s=%d", var, n)[m
[31m-  end)[m
[31m-  code = string.gsub(code, "PAIRS%((.-)%)", function(var)[m
[31m-    fixup.PAIRS = true[m
[31m-    return format("nil, %s, 0", var)[m
[31m-  end)[m
[31m-  return "return "..code, fixup[m
[31m-end[m
[31m-[m
[31m-local function read_uleb128(p)[m
[31m-  local v = p[0]; p = p + 1[m
[31m-  if v >= 128 then[m
[31m-    local sh = 7; v = v - 128[m
[31m-    repeat[m
[31m-      local r = p[0][m
[31m-      v = v + bit.lshift(bit.band(r, 127), sh)[m
[31m-      sh = sh + 7[m
[31m-      p = p + 1[m
[31m-    until r < 128[m
[31m-  end[m
[31m-  return p, v[m
[31m-end[m
[31m-[m
[31m--- ORDER LJ_T[m
[31m-local name2itype = {[m
[31m-  str = 5, func = 9, tab = 12, int = 14, num = 15[m
[31m-}[m
[31m-[m
[31m-local BC = {}[m
[31m-for i=0,#bcnames/6-1 do[m
[31m-  BC[string.gsub(string.sub(bcnames, i*6+1, i*6+6), " ", "")] = i[m
[31m-end[m
[31m-local xop, xra = isbe and 3 or 0, isbe and 2 or 1[m
[31m-local xrc, xrb = isbe and 1 or 2, isbe and 0 or 3[m
[31m-[m
[31m-local function fixup_dump(dump, fixup)[m
[31m-  local buf = ffi.new("uint8_t[?]", #dump+1, dump)[m
[31m-  local p = buf+5[m
[31m-  local n, sizebc[m
[31m-  p, n = read_uleb128(p)[m
[31m-  local start = p[m
[31m-  p = p + 4[m
[31m-  p = read_uleb128(p)[m
[31m-  p = read_uleb128(p)[m
[31m-  p, sizebc = read_uleb128(p)[m
[31m-  local rawtab = {}[m
[31m-  for i=0,sizebc-1 do[m
[31m-    local op = p[xop][m
[31m-    if op == BC.KSHORT then[m
[31m-      local rd = p[xrc] + 256*p[xrb][m
[31m-      rd = bit.arshift(bit.lshift(rd, 16), 16)[m
[31m-      local f = fixup[rd][m
[31m-      if f then[m
[31m-	if f[1] == "CHECK" then[m
[31m-	  local tp = f[2][m
[31m-	  if tp == "tab" then rawtab[p[xra]] = true end[m
[31m-	  p[xop] = tp == "num" and BC.ISNUM or BC.ISTYPE[m
[31m-	  p[xrb] = 0[m
[31m-	  p[xrc] = name2itype[tp][m
[31m-	else[m
[31m-	  error("unhandled fixup type: "..f[1])[m
[31m-	end[m
[31m-      end[m
[31m-    elseif op == BC.TGETV then[m
[31m-      if rawtab[p[xrb]] then[m
[31m-	p[xop] = BC.TGETR[m
[31m-      end[m
[31m-    elseif op == BC.TSETV then[m
[31m-      if rawtab[p[xrb]] then[m
[31m-	p[xop] = BC.TSETR[m
[31m-      end[m
[31m-    elseif op == BC.ITERC then[m
[31m-      if fixup.PAIRS then[m
[31m-	p[xop] = BC.ITERN[m
[31m-      end[m
[31m-    end[m
[31m-    p = p + 4[m
[31m-  end[m
[31m-  return ffi.string(start, n)[m
[31m-end[m
[31m-[m
[31m-local function find_defs(src)[m
[31m-  local defs = {}[m
[31m-  for name, code in string.gmatch(src, "LJLIB_LUA%(([^)]*)%)%s*/%*(.-)%*/") do[m
[31m-    local env = {}[m
[31m-    local tcode, fixup = transform_lua(code)[m
[31m-    local func = assert(load(tcode, "", nil, env))()[m
[31m-    defs[name] = fixup_dump(string.dump(func, true), fixup)[m
[31m-    defs[#defs+1] = name[m
[31m-  end[m
[31m-  return defs[m
[31m-end[m
[31m-[m
[31m-local function gen_header(defs)[m
[31m-  local t = {}[m
[31m-  local function w(x) t[#t+1] = x end[m
[31m-  w("/* This is a generated file. DO NOT EDIT! */\n\n")[m
[31m-  w("static const int libbc_endian = ") w(isbe and 1 or 0) w(";\n\n")[m
[31m-  local s = ""[m
[31m-  for _,name in ipairs(defs) do[m
[31m-    s = s .. defs[name][m
[31m-  end[m
[31m-  w("static const uint8_t libbc_code[] = {\n")[m
[31m-  local n = 0[m
[31m-  for i=1,#s do[m
[31m-    local x = string.byte(s, i)[m
[31m-    w(x); w(",")[m
[31m-    n = n + (x < 10 and 2 or (x < 100 and 3 or 4))[m
[31m-    if n >= 75 then n = 0; w("\n") end[m
[31m-  end[m
[31m-  w("0\n};\n\n")[m
[31m-  w("static const struct { const char *name; int ofs; } libbc_map[] = {\n")[m
[31m-  local m = 0[m
[31m-  for _,name in ipairs(defs) do[m
[31m-    w('{"'); w(name); w('",'); w(m) w('},\n')[m
[31m-    m = m + #defs[name][m
[31m-  end[m
[31m-  w("{NULL,"); w(m); w("}\n};\n\n")[m
[31m-  return table.concat(t)[m
[31m-end[m
[31m-[m
[31m-local function write_file(name, data)[m
[31m-  if name == "-" then[m
[31m-    assert(io.write(data))[m
[31m-    assert(io.flush())[m
[31m-  else[m
[31m-    local fp = io.open(name)[m
[31m-    if fp then[m
[31m-      local old = fp:read("*a")[m
[31m-      fp:close()[m
[31m-      if data == old then return end[m
[31m-    end[m
[31m-    fp = assert(io.open(name, "w"))[m
[31m-    assert(fp:write(data))[m
[31m-    assert(fp:close())[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local outfile = parse_arg(arg)[m
[31m-local src = read_files(arg)[m
[31m-local defs = find_defs(src)[m
[31m-local hdr = gen_header(defs)[m
[31m-write_file(outfile, hdr)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/genminilua.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/genminilua.lua[m
[1mdeleted file mode 100644[m
[1mindex e9a6829..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/genminilua.lua[m
[1m+++ /dev/null[m
[36m@@ -1,429 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- Lua script to generate a customized, minified version of Lua.[m
[31m--- The resulting 'minilua' is used for the build process of LuaJIT.[m
[31m-----------------------------------------------------------------------------[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m-local sub, match, gsub = string.sub, string.match, string.gsub[m
[31m-[m
[31m-local LUA_VERSION = "5.1.5"[m
[31m-local LUA_SOURCE[m
[31m-[m
[31m-local function usage()[m
[31m-  io.stderr:write("Usage: ", arg and arg[0] or "genminilua",[m
[31m-		  " lua-", LUA_VERSION, "-source-dir\n")[m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function find_sources()[m
[31m-  LUA_SOURCE = arg and arg[1][m
[31m-  if not LUA_SOURCE then usage() end[m
[31m-  if sub(LUA_SOURCE, -1) ~= "/" then LUA_SOURCE = LUA_SOURCE.."/" end[m
[31m-  local fp = io.open(LUA_SOURCE .. "lua.h")[m
[31m-  if not fp then[m
[31m-    LUA_SOURCE = LUA_SOURCE.."src/"[m
[31m-    fp = io.open(LUA_SOURCE .. "lua.h")[m
[31m-    if not fp then usage() end[m
[31m-  end[m
[31m-  local all = fp:read("*a")[m
[31m-  fp:close()[m
[31m-  if not match(all, 'LUA_RELEASE%s*"Lua '..LUA_VERSION..'"') then[m
[31m-    io.stderr:write("Error: version mismatch\n")[m
[31m-    usage()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local LUA_FILES = {[m
[31m-"lmem.c", "lobject.c", "ltm.c", "lfunc.c", "ldo.c", "lstring.c", "ltable.c",[m
[31m-"lgc.c", "lstate.c", "ldebug.c", "lzio.c", "lopcodes.c",[m
[31m-"llex.c", "lcode.c", "lparser.c", "lvm.c", "lapi.c", "lauxlib.c",[m
[31m-"lbaselib.c", "ltablib.c", "liolib.c", "loslib.c", "lstrlib.c", "linit.c",[m
[31m-}[m
[31m-[m
[31m-local REMOVE_LIB = {}[m
[31m-gsub([[[m
[31m-collectgarbage dofile gcinfo getfenv getmetatable load print rawequal rawset[m
[31m-select tostring xpcall[m
[31m-foreach foreachi getn maxn setn[m
[31m-popen tmpfile seek setvbuf __tostring[m
[31m-clock date difftime execute getenv rename setlocale time tmpname[m
[31m-dump gfind len reverse[m
[31m-LUA_LOADLIBNAME LUA_MATHLIBNAME LUA_DBLIBNAME[m
[31m-]], "%S+", function(name)[m
[31m-  REMOVE_LIB[name] = true[m
[31m-end)[m
[31m-[m
[31m-local REMOVE_EXTINC = { ["<assert.h>"] = true, ["<locale.h>"] = true, }[m
[31m-[m
[31m-local CUSTOM_MAIN = [[[m
[31m-typedef unsigned int UB;[m
[31m-static UB barg(lua_State *L,int idx){[m
[31m-union{lua_Number n;U64 b;}bn;[m
[31m-bn.n=lua_tonumber(L,idx)+6755399441055744.0;[m
[31m-if (bn.n==0.0&&!lua_isnumber(L,idx))luaL_typerror(L,idx,"number");[m
[31m-return(UB)bn.b;[m
[31m-}[m
[31m-#define BRET(b) lua_pushnumber(L,(lua_Number)(int)(b));return 1;[m
[31m-static int tobit(lua_State *L){[m
[31m-BRET(barg(L,1))}[m
[31m-static int bnot(lua_State *L){[m
[31m-BRET(~barg(L,1))}[m
[31m-static int band(lua_State *L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b&=barg(L,i);BRET(b)}[m
[31m-static int bor(lua_State *L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b|=barg(L,i);BRET(b)}[m
[31m-static int bxor(lua_State *L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b^=barg(L,i);BRET(b)}[m
[31m-static int lshift(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET(b<<n)}[m
[31m-static int rshift(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET(b>>n)}[m
[31m-static int arshift(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((int)b>>n)}[m
[31m-static int rol(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((b<<n)|(b>>(32-n)))}[m
[31m-static int ror(lua_State *L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((b>>n)|(b<<(32-n)))}[m
[31m-static int bswap(lua_State *L){[m
[31m-UB b=barg(L,1);b=(b>>24)|((b>>8)&0xff00)|((b&0xff00)<<8)|(b<<24);BRET(b)}[m
[31m-static int tohex(lua_State *L){[m
[31m-UB b=barg(L,1);[m
[31m-int n=lua_isnone(L,2)?8:(int)barg(L,2);[m
[31m-const char *hexdigits="0123456789abcdef";[m
[31m-char buf[8];[m
[31m-int i;[m
[31m-if(n<0){n=-n;hexdigits="0123456789ABCDEF";}[m
[31m-if(n>8)n=8;[m
[31m-for(i=(int)n;--i>=0;){buf[i]=hexdigits[b&15];b>>=4;}[m
[31m-lua_pushlstring(L,buf,(size_t)n);[m
[31m-return 1;[m
[31m-}[m
[31m-static const struct luaL_Reg bitlib[] = {[m
[31m-{"tobit",tobit},[m
[31m-{"bnot",bnot},[m
[31m-{"band",band},[m
[31m-{"bor",bor},[m
[31m-{"bxor",bxor},[m
[31m-{"lshift",lshift},[m
[31m-{"rshift",rshift},[m
[31m-{"arshift",arshift},[m
[31m-{"rol",rol},[m
[31m-{"ror",ror},[m
[31m-{"bswap",bswap},[m
[31m-{"tohex",tohex},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-int main(int argc, char **argv){[m
[31m-  lua_State *L = luaL_newstate();[m
[31m-  int i;[m
[31m-  luaL_openlibs(L);[m
[31m-  luaL_register(L, "bit", bitlib);[m
[31m-  if (argc < 2) return sizeof(void *);[m
[31m-  lua_createtable(L, 0, 1);[m
[31m-  lua_pushstring(L, argv[1]);[m
[31m-  lua_rawseti(L, -2, 0);[m
[31m-  lua_setglobal(L, "arg");[m
[31m-  if (luaL_loadfile(L, argv[1]))[m
[31m-    goto err;[m
[31m-  for (i = 2; i < argc; i++)[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-  if (lua_pcall(L, argc - 2, 0, 0)) {[m
[31m-  err:[m
[31m-    fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  lua_close(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-]][m
[31m-[m
[31m-local function read_sources()[m
[31m-  local t = {}[m
[31m-  for i, name in ipairs(LUA_FILES) do[m
[31m-    local fp = assert(io.open(LUA_SOURCE..name, "r"))[m
[31m-    t[i] = fp:read("*a")[m
[31m-    assert(fp:close())[m
[31m-  end[m
[31m-  t[#t+1] = CUSTOM_MAIN[m
[31m-  return table.concat(t)[m
[31m-end[m
[31m-[m
[31m-local includes = {}[m
[31m-[m
[31m-local function merge_includes(src)[m
[31m-  return gsub(src, '#include%s*"([^"]*)"%s*\n', function(name)[m
[31m-    if includes[name] then return "" end[m
[31m-    includes[name] = true[m
[31m-    local fp = assert(io.open(LUA_SOURCE..name, "r"))[m
[31m-    local src = fp:read("*a")[m
[31m-    assert(fp:close())[m
[31m-    src = gsub(src, "#ifndef%s+%w+_h\n#define%s+%w+_h\n", "")[m
[31m-    src = gsub(src, "#endif%s*$", "")[m
[31m-    return merge_includes(src)[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-local function get_license(src)[m
[31m-  return match(src, "/%*+\n%* Copyright %(.-%*/\n")[m
[31m-end[m
[31m-[m
[31m-local function fold_lines(src)[m
[31m-  return gsub(src, "\\\n", " ")[m
[31m-end[m
[31m-[m
[31m-local strings = {}[m
[31m-[m
[31m-local function save_str(str)[m
[31m-  local n = #strings+1[m
[31m-  strings[n] = str[m
[31m-  return "\1"..n.."\2"[m
[31m-end[m
[31m-[m
[31m-local function save_strings(src)[m
[31m-  src = gsub(src, '"[^"\n]*"', save_str)[m
[31m-  return gsub(src, "'[^'\n]*'", save_str)[m
[31m-end[m
[31m-[m
[31m-local function restore_strings(src)[m
[31m-  return gsub(src, "\1(%d+)\2", function(numstr)[m
[31m-    return strings[tonumber(numstr)][m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-local function def_istrue(def)[m
[31m-  return def == "INT_MAX > 2147483640L" or[m
[31m-	 def == "LUAI_BITSINT >= 32" or[m
[31m-	 def == "SIZE_Bx < LUAI_BITSINT-1" or[m
[31m-	 def == "cast" or[m
[31m-	 def == "defined(LUA_CORE)" or[m
[31m-	 def == "MINSTRTABSIZE" or[m
[31m-	 def == "LUA_MINBUFFER" or[m
[31m-	 def == "HARDSTACKTESTS" or[m
[31m-	 def == "UNUSED"[m
[31m-end[m
[31m-[m
[31m-local head, defs = {[[[m
[31m-#ifdef _MSC_VER[m
[31m-typedef unsigned __int64 U64;[m
[31m-#else[m
[31m-typedef unsigned long long U64;[m
[31m-#endif[m
[31m-int _CRT_glob = 0;[m
[31m-]]}, {}[m
[31m-[m
[31m-local function preprocess(src)[m
[31m-  local t = { match(src, "^(.-)#") }[m
[31m-  local lvl, on, oldon = 0, true, {}[m
[31m-  for pp, def, txt in string.gmatch(src, "#(%w+) *([^\n]*)\n([^#]*)") do[m
[31m-    if pp == "if" or pp == "ifdef" or pp == "ifndef" then[m
[31m-      lvl = lvl + 1[m
[31m-      oldon[lvl] = on[m
[31m-      on = def_istrue(def)[m
[31m-    elseif pp == "else" then[m
[31m-      if oldon[lvl] then[m
[31m-	if on == false then on = true else on = false end[m
[31m-      end[m
[31m-    elseif pp == "elif" then[m
[31m-      if oldon[lvl] then[m
[31m-	on = def_istrue(def)[m
[31m-      end[m
[31m-    elseif pp == "endif" then[m
[31m-      on = oldon[lvl][m
[31m-      lvl = lvl - 1[m
[31m-    elseif on then[m
[31m-      if pp == "include" then[m
[31m-	if not head[def] and not REMOVE_EXTINC[def] then[m
[31m-	  head[def] = true[m
[31m-	  head[#head+1] = "#include "..def.."\n"[m
[31m-	end[m
[31m-      elseif pp == "define" then[m
[31m-	local k, sp, v = match(def, "([%w_]+)(%s*)(.*)")[m
[31m-	if k and not (sp == "" and sub(v, 1, 1) == "(") then[m
[31m-	  defs[k] = gsub(v, "%a[%w_]*", function(tok)[m
[31m-	    return defs[tok] or tok[m
[31m-	  end)[m
[31m-	else[m
[31m-	  t[#t+1] = "#define "..def.."\n"[m
[31m-	end[m
[31m-      elseif pp ~= "undef" then[m
[31m-	error("unexpected directive: "..pp.." "..def)[m
[31m-      end[m
[31m-    end[m
[31m-    if on then t[#t+1] = txt end[m
[31m-  end[m
[31m-  return gsub(table.concat(t), "%a[%w_]*", function(tok)[m
[31m-    return defs[tok] or tok[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-local function merge_header(src, license)[m
[31m-  local hdr = string.format([[[m
[31m-/* This is a heavily customized and minimized copy of Lua %s. */[m
[31m-/* It's only used to build LuaJIT. It does NOT have all standard functions! */[m
[31m-]], LUA_VERSION)[m
[31m-  return hdr..license..table.concat(head)..src[m
[31m-end[m
[31m-[m
[31m-local function strip_unused1(src)[m
[31m-  return gsub(src, '(  {"?([%w_]+)"?,%s+%a[%w_]*},\n)', function(line, func)[m
[31m-    return REMOVE_LIB[func] and "" or line[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-local function strip_unused2(src)[m
[31m-  return gsub(src, "Symbolic Execution.-}=", "")[m
[31m-end[m
[31m-[m
[31m-local function strip_unused3(src)[m
[31m-  src = gsub(src, "extern", "static")[m
[31m-  src = gsub(src, "\nstatic([^\n]-)%(([^)]*)%)%(", "\nstatic%1 %2(")[m
[31m-  src = gsub(src, "#define lua_assert[^\n]*\n", "")[m
[31m-  src = gsub(src, "lua_assert%b();?", "")[m
[31m-  src = gsub(src, "default:\n}", "default:;\n}")[m
[31m-  src = gsub(src, "lua_lock%b();", "")[m
[31m-  src = gsub(src, "lua_unlock%b();", "")[m
[31m-  src = gsub(src, "luai_threadyield%b();", "")[m
[31m-  src = gsub(src, "luai_userstateopen%b();", "{}")[m
[31m-  src = gsub(src, "luai_userstate%w+%b();", "")[m
[31m-  src = gsub(src, "%(%(c==.*luaY_parser%)", "luaY_parser")[m
[31m-  src = gsub(src, "trydecpoint%(ls,seminfo%)",[m
[31m-		  "luaX_lexerror(ls,\"malformed number\",TK_NUMBER)")[m
[31m-  src = gsub(src, "int c=luaZ_lookahead%b();", "")[m
[31m-  src = gsub(src, "luaL_register%(L,[^,]*,co_funcs%);\nreturn 2;",[m
[31m-		  "return 1;")[m
[31m-  src = gsub(src, "getfuncname%b():", "NULL:")[m
[31m-  src = gsub(src, "getobjname%b():", "NULL:")[m
[31m-  src = gsub(src, "if%([^\n]*hookmask[^\n]*%)\n[^\n]*\n", "")[m
[31m-  src = gsub(src, "if%([^\n]*hookmask[^\n]*%)%b{}\n", "")[m
[31m-  src = gsub(src, "if%([^\n]*hookmask[^\n]*&&\n[^\n]*%b{}\n", "")[m
[31m-  src = gsub(src, "(twoto%b()%()", "%1(size_t)")[m
[31m-  src = gsub(src, "i<sizenode", "i<(int)sizenode")[m
[31m-  src = gsub(src, "cast%(unsigned int,key%-1%)", "cast(unsigned int,key)-1")[m
[31m-  return gsub(src, "\n\n+", "\n")[m
[31m-end[m
[31m-[m
[31m-local function strip_comments(src)[m
[31m-  return gsub(src, "/%*.-%*/", " ")[m
[31m-end[m
[31m-[m
[31m-local function strip_whitespace(src)[m
[31m-  src = gsub(src, "^%s+", "")[m
[31m-  src = gsub(src, "%s*\n%s*", "\n")[m
[31m-  src = gsub(src, "[ \t]+", " ")[m
[31m-  src = gsub(src, "(%W) ", "%1")[m
[31m-  return gsub(src, " (%W)", "%1")[m
[31m-end[m
[31m-[m
[31m-local function rename_tokens1(src)[m
[31m-  src = gsub(src, "getline", "getline_")[m
[31m-  src = gsub(src, "struct ([%w_]+)", "ZX%1")[m
[31m-  return gsub(src, "union ([%w_]+)", "ZY%1")[m
[31m-end[m
[31m-[m
[31m-local function rename_tokens2(src)[m
[31m-  src = gsub(src, "ZX([%w_]+)", "struct %1")[m
[31m-  return gsub(src, "ZY([%w_]+)", "union %1")[m
[31m-end[m
[31m-[m
[31m-local function func_gather(src)[m
[31m-  local nodes, list = {}, {}[m
[31m-  local pos, len = 1, #src[m
[31m-  while pos < len do[m
[31m-    local d, w = match(src, "^(#define ([%w_]+)[^\n]*\n)", pos)[m
[31m-    if d then[m
[31m-      local n = #list+1[m
[31m-      list[n] = d[m
[31m-      nodes[w] = n[m
[31m-    else[m
[31m-      local s[m
[31m-      d, w, s = match(src, "^(([%w_]+)[^\n]*([{;])\n)", pos)[m
[31m-      if not d then[m
[31m-	d, w, s = match(src, "^(([%w_]+)[^(]*%b()([{;])\n)", pos)[m
[31m-	if not d then d = match(src, "^[^\n]*\n", pos) end[m
[31m-      end[m
[31m-      if s == "{" then[m
[31m-	d = d..sub(match(src, "^%b{}[^;\n]*;?\n", pos+#d-2), 3)[m
[31m-	if sub(d, -2) == "{\n" then[m
[31m-	  d = d..sub(match(src, "^%b{}[^;\n]*;?\n", pos+#d-2), 3)[m
[31m-	end[m
[31m-      end[m
[31m-      local k, v = nil, d[m
[31m-      if w == "typedef" then[m
[31m-	if match(d, "^typedef enum") then[m
[31m-	  head[#head+1] = d[m
[31m-	else[m
[31m-	  k = match(d, "([%w_]+);\n$")[m
[31m-	  if not k then k = match(d, "^.-%(.-([%w_]+)%)%(") end[m
[31m-	end[m
[31m-      elseif w == "enum" then[m
[31m-	head[#head+1] = v[m
[31m-      elseif w ~= nil then[m
[31m-	k = match(d, "^[^\n]-([%w_]+)[(%[=]")[m
[31m-	if k then[m
[31m-	  if w ~= "static" and k ~= "main" then v = "static "..d end[m
[31m-	else[m
[31m-	  k = w[m
[31m-	end[m
[31m-      end[m
[31m-      if w and k then[m
[31m-	local o = nodes[k][m
[31m-	if o then nodes["*"..k] = o end[m
[31m-	local n = #list+1[m
[31m-	list[n] = v[m
[31m-	nodes[k] = n[m
[31m-      end[m
[31m-    end[m
[31m-    pos = pos + #d[m
[31m-  end[m
[31m-  return nodes, list[m
[31m-end[m
[31m-[m
[31m-local function func_visit(nodes, list, used, n)[m
[31m-  local i = nodes[n][m
[31m-  for m in string.gmatch(list[i], "[%w_]+") do[m
[31m-    if nodes[m] then[m
[31m-      local j = used[m][m
[31m-      if not j then[m
[31m-	used[m] = i[m
[31m-	func_visit(nodes, list, used, m)[m
[31m-      elseif i < j then[m
[31m-	used[m] = i[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function func_collect(src)[m
[31m-  local nodes, list = func_gather(src)[m
[31m-  local used = {}[m
[31m-  func_visit(nodes, list, used, "main")[m
[31m-  for n,i in pairs(nodes) do[m
[31m-    local j = used[n][m
[31m-    if j and j < i then used["*"..n] = j end[m
[31m-  end[m
[31m-  for n,i in pairs(nodes) do[m
[31m-    if not used[n] then list[i] = "" end[m
[31m-  end[m
[31m-  return table.concat(list)[m
[31m-end[m
[31m-[m
[31m-find_sources()[m
[31m-local src = read_sources()[m
[31m-src = merge_includes(src)[m
[31m-local license = get_license(src)[m
[31m-src = fold_lines(src)[m
[31m-src = strip_unused1(src)[m
[31m-src = save_strings(src)[m
[31m-src = strip_unused2(src)[m
[31m-src = strip_comments(src)[m
[31m-src = preprocess(src)[m
[31m-src = strip_whitespace(src)[m
[31m-src = strip_unused3(src)[m
[31m-src = rename_tokens1(src)[m
[31m-src = func_collect(src)[m
[31m-src = rename_tokens2(src)[m
[31m-src = restore_strings(src)[m
[31m-src = merge_header(src, license)[m
[31m-io.write(src)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/minilua.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/minilua.c[m
[1mdeleted file mode 100644[m
[1mindex 7915028..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/host/minilua.c[m
[1m+++ /dev/null[m
[36m@@ -1,7770 +0,0 @@[m
[31m-/* This is a heavily customized and minimized copy of Lua 5.1.5. */[m
[31m-/* It's only used to build LuaJIT. It does NOT have all standard functions! */[m
[31m-/******************************************************************************[m
[31m-* Copyright (C) 1994-2012 Lua.org, PUC-Rio.  All rights reserved.[m
[31m-*[m
[31m-* Permission is hereby granted, free of charge, to any person obtaining[m
[31m-* a copy of this software and associated documentation files (the[m
[31m-* "Software"), to deal in the Software without restriction, including[m
[31m-* without limitation the rights to use, copy, modify, merge, publish,[m
[31m-* distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-* permit persons to whom the Software is furnished to do so, subject to[m
[31m-* the following conditions:[m
[31m-*[m
[31m-* The above copyright notice and this permission notice shall be[m
[31m-* included in all copies or substantial portions of the Software.[m
[31m-*[m
[31m-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-******************************************************************************/[m
[31m-#ifdef _MSC_VER[m
[31m-typedef unsigned __int64 U64;[m
[31m-#else[m
[31m-typedef unsigned long long U64;[m
[31m-#endif[m
[31m-int _CRT_glob = 0;[m
[31m-#include <stddef.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <limits.h>[m
[31m-#include <math.h>[m
[31m-#include <ctype.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-#include <setjmp.h>[m
[31m-#include <errno.h>[m
[31m-#include <time.h>[m
[31m-typedef enum{[m
[31m-TM_INDEX,[m
[31m-TM_NEWINDEX,[m
[31m-TM_GC,[m
[31m-TM_MODE,[m
[31m-TM_EQ,[m
[31m-TM_ADD,[m
[31m-TM_SUB,[m
[31m-TM_MUL,[m
[31m-TM_DIV,[m
[31m-TM_MOD,[m
[31m-TM_POW,[m
[31m-TM_UNM,[m
[31m-TM_LEN,[m
[31m-TM_LT,[m
[31m-TM_LE,[m
[31m-TM_CONCAT,[m
[31m-TM_CALL,[m
[31m-TM_N[m
[31m-}TMS;[m
[31m-enum OpMode{iABC,iABx,iAsBx};[m
[31m-typedef enum{[m
[31m-OP_MOVE,[m
[31m-OP_LOADK,[m
[31m-OP_LOADBOOL,[m
[31m-OP_LOADNIL,[m
[31m-OP_GETUPVAL,[m
[31m-OP_GETGLOBAL,[m
[31m-OP_GETTABLE,[m
[31m-OP_SETGLOBAL,[m
[31m-OP_SETUPVAL,[m
[31m-OP_SETTABLE,[m
[31m-OP_NEWTABLE,[m
[31m-OP_SELF,[m
[31m-OP_ADD,[m
[31m-OP_SUB,[m
[31m-OP_MUL,[m
[31m-OP_DIV,[m
[31m-OP_MOD,[m
[31m-OP_POW,[m
[31m-OP_UNM,[m
[31m-OP_NOT,[m
[31m-OP_LEN,[m
[31m-OP_CONCAT,[m
[31m-OP_JMP,[m
[31m-OP_EQ,[m
[31m-OP_LT,[m
[31m-OP_LE,[m
[31m-OP_TEST,[m
[31m-OP_TESTSET,[m
[31m-OP_CALL,[m
[31m-OP_TAILCALL,[m
[31m-OP_RETURN,[m
[31m-OP_FORLOOP,[m
[31m-OP_FORPREP,[m
[31m-OP_TFORLOOP,[m
[31m-OP_SETLIST,[m
[31m-OP_CLOSE,[m
[31m-OP_CLOSURE,[m
[31m-OP_VARARG[m
[31m-}OpCode;[m
[31m-enum OpArgMask{[m
[31m-OpArgN,[m
[31m-OpArgU,[m
[31m-OpArgR,[m
[31m-OpArgK[m
[31m-};[m
[31m-typedef enum{[m
[31m-VVOID,[m
[31m-VNIL,[m
[31m-VTRUE,[m
[31m-VFALSE,[m
[31m-VK,[m
[31m-VKNUM,[m
[31m-VLOCAL,[m
[31m-VUPVAL,[m
[31m-VGLOBAL,[m
[31m-VINDEXED,[m
[31m-VJMP,[m
[31m-VRELOCABLE,[m
[31m-VNONRELOC,[m
[31m-VCALL,[m
[31m-VVARARG[m
[31m-}expkind;[m
[31m-enum RESERVED{[m
[31m-TK_AND=257,TK_BREAK,[m
[31m-TK_DO,TK_ELSE,TK_ELSEIF,TK_END,TK_FALSE,TK_FOR,TK_FUNCTION,[m
[31m-TK_IF,TK_IN,TK_LOCAL,TK_NIL,TK_NOT,TK_OR,TK_REPEAT,[m
[31m-TK_RETURN,TK_THEN,TK_TRUE,TK_UNTIL,TK_WHILE,[m
[31m-TK_CONCAT,TK_DOTS,TK_EQ,TK_GE,TK_LE,TK_NE,TK_NUMBER,[m
[31m-TK_NAME,TK_STRING,TK_EOS[m
[31m-};[m
[31m-typedef enum BinOpr{[m
[31m-OPR_ADD,OPR_SUB,OPR_MUL,OPR_DIV,OPR_MOD,OPR_POW,[m
[31m-OPR_CONCAT,[m
[31m-OPR_NE,OPR_EQ,[m
[31m-OPR_LT,OPR_LE,OPR_GT,OPR_GE,[m
[31m-OPR_AND,OPR_OR,[m
[31m-OPR_NOBINOPR[m
[31m-}BinOpr;[m
[31m-typedef enum UnOpr{OPR_MINUS,OPR_NOT,OPR_LEN,OPR_NOUNOPR}UnOpr;[m
[31m-#define LUA_QL(x)"'"x"'"[m
[31m-#define luai_apicheck(L,o){(void)L;}[m
[31m-#define lua_number2str(s,n)sprintf((s),"%.14g",(n))[m
[31m-#define lua_str2number(s,p)strtod((s),(p))[m
[31m-#define luai_numadd(a,b)((a)+(b))[m
[31m-#define luai_numsub(a,b)((a)-(b))[m
[31m-#define luai_nummul(a,b)((a)*(b))[m
[31m-#define luai_numdiv(a,b)((a)/(b))[m
[31m-#define luai_nummod(a,b)((a)-floor((a)/(b))*(b))[m
[31m-#define luai_numpow(a,b)(pow(a,b))[m
[31m-#define luai_numunm(a)(-(a))[m
[31m-#define luai_numeq(a,b)((a)==(b))[m
[31m-#define luai_numlt(a,b)((a)<(b))[m
[31m-#define luai_numle(a,b)((a)<=(b))[m
[31m-#define luai_numisnan(a)(!luai_numeq((a),(a)))[m
[31m-#define lua_number2int(i,d)((i)=(int)(d))[m
[31m-#define lua_number2integer(i,d)((i)=(lua_Integer)(d))[m
[31m-#define LUAI_THROW(L,c)longjmp((c)->b,1)[m
[31m-#define LUAI_TRY(L,c,a)if(setjmp((c)->b)==0){a}[m
[31m-#define lua_pclose(L,file)((void)((void)L,file),0)[m
[31m-#define lua_upvalueindex(i)((-10002)-(i))[m
[31m-typedef struct lua_State lua_State;[m
[31m-typedef int(*lua_CFunction)(lua_State*L);[m
[31m-typedef const char*(*lua_Reader)(lua_State*L,void*ud,size_t*sz);[m
[31m-typedef void*(*lua_Alloc)(void*ud,void*ptr,size_t osize,size_t nsize);[m
[31m-typedef double lua_Number;[m
[31m-typedef ptrdiff_t lua_Integer;[m
[31m-static void lua_settop(lua_State*L,int idx);[m
[31m-static int lua_type(lua_State*L,int idx);[m
[31m-static const char* lua_tolstring(lua_State*L,int idx,size_t*len);[m
[31m-static size_t lua_objlen(lua_State*L,int idx);[m
[31m-static void lua_pushlstring(lua_State*L,const char*s,size_t l);[m
[31m-static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n);[m
[31m-static void lua_createtable(lua_State*L,int narr,int nrec);[m
[31m-static void lua_setfield(lua_State*L,int idx,const char*k);[m
[31m-#define lua_pop(L,n)lua_settop(L,-(n)-1)[m
[31m-#define lua_newtable(L)lua_createtable(L,0,0)[m
[31m-#define lua_pushcfunction(L,f)lua_pushcclosure(L,(f),0)[m
[31m-#define lua_strlen(L,i)lua_objlen(L,(i))[m
[31m-#define lua_isfunction(L,n)(lua_type(L,(n))==6)[m
[31m-#define lua_istable(L,n)(lua_type(L,(n))==5)[m
[31m-#define lua_isnil(L,n)(lua_type(L,(n))==0)[m
[31m-#define lua_isboolean(L,n)(lua_type(L,(n))==1)[m
[31m-#define lua_isnone(L,n)(lua_type(L,(n))==(-1))[m
[31m-#define lua_isnoneornil(L,n)(lua_type(L,(n))<=0)[m
[31m-#define lua_pushliteral(L,s)lua_pushlstring(L,""s,(sizeof(s)/sizeof(char))-1)[m
[31m-#define lua_setglobal(L,s)lua_setfield(L,(-10002),(s))[m
[31m-#define lua_tostring(L,i)lua_tolstring(L,(i),NULL)[m
[31m-typedef struct lua_Debug lua_Debug;[m
[31m-typedef void(*lua_Hook)(lua_State*L,lua_Debug*ar);[m
[31m-struct lua_Debug{[m
[31m-int event;[m
[31m-const char*name;[m
[31m-const char*namewhat;[m
[31m-const char*what;[m
[31m-const char*source;[m
[31m-int currentline;[m
[31m-int nups;[m
[31m-int linedefined;[m
[31m-int lastlinedefined;[m
[31m-char short_src[60];[m
[31m-int i_ci;[m
[31m-};[m
[31m-typedef unsigned int lu_int32;[m
[31m-typedef size_t lu_mem;[m
[31m-typedef ptrdiff_t l_mem;[m
[31m-typedef unsigned char lu_byte;[m
[31m-#define IntPoint(p)((unsigned int)(lu_mem)(p))[m
[31m-typedef union{double u;void*s;long l;}L_Umaxalign;[m
[31m-typedef double l_uacNumber;[m
[31m-#define check_exp(c,e)(e)[m
[31m-#define UNUSED(x)((void)(x))[m
[31m-#define cast(t,exp)((t)(exp))[m
[31m-#define cast_byte(i)cast(lu_byte,(i))[m
[31m-#define cast_num(i)cast(lua_Number,(i))[m
[31m-#define cast_int(i)cast(int,(i))[m
[31m-typedef lu_int32 Instruction;[m
[31m-#define condhardstacktests(x)((void)0)[m
[31m-typedef union GCObject GCObject;[m
[31m-typedef struct GCheader{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-}GCheader;[m
[31m-typedef union{[m
[31m-GCObject*gc;[m
[31m-void*p;[m
[31m-lua_Number n;[m
[31m-int b;[m
[31m-}Value;[m
[31m-typedef struct lua_TValue{[m
[31m-Value value;int tt;[m
[31m-}TValue;[m
[31m-#define ttisnil(o)(ttype(o)==0)[m
[31m-#define ttisnumber(o)(ttype(o)==3)[m
[31m-#define ttisstring(o)(ttype(o)==4)[m
[31m-#define ttistable(o)(ttype(o)==5)[m
[31m-#define ttisfunction(o)(ttype(o)==6)[m
[31m-#define ttisboolean(o)(ttype(o)==1)[m
[31m-#define ttisuserdata(o)(ttype(o)==7)[m
[31m-#define ttisthread(o)(ttype(o)==8)[m
[31m-#define ttislightuserdata(o)(ttype(o)==2)[m
[31m-#define ttype(o)((o)->tt)[m
[31m-#define gcvalue(o)check_exp(iscollectable(o),(o)->value.gc)[m
[31m-#define pvalue(o)check_exp(ttislightuserdata(o),(o)->value.p)[m
[31m-#define nvalue(o)check_exp(ttisnumber(o),(o)->value.n)[m
[31m-#define rawtsvalue(o)check_exp(ttisstring(o),&(o)->value.gc->ts)[m
[31m-#define tsvalue(o)(&rawtsvalue(o)->tsv)[m
[31m-#define rawuvalue(o)check_exp(ttisuserdata(o),&(o)->value.gc->u)[m
[31m-#define uvalue(o)(&rawuvalue(o)->uv)[m
[31m-#define clvalue(o)check_exp(ttisfunction(o),&(o)->value.gc->cl)[m
[31m-#define hvalue(o)check_exp(ttistable(o),&(o)->value.gc->h)[m
[31m-#define bvalue(o)check_exp(ttisboolean(o),(o)->value.b)[m
[31m-#define thvalue(o)check_exp(ttisthread(o),&(o)->value.gc->th)[m
[31m-#define l_isfalse(o)(ttisnil(o)||(ttisboolean(o)&&bvalue(o)==0))[m
[31m-#define checkconsistency(obj)[m
[31m-#define checkliveness(g,obj)[m
[31m-#define setnilvalue(obj)((obj)->tt=0)[m
[31m-#define setnvalue(obj,x){TValue*i_o=(obj);i_o->value.n=(x);i_o->tt=3;}[m
[31m-#define setbvalue(obj,x){TValue*i_o=(obj);i_o->value.b=(x);i_o->tt=1;}[m
[31m-#define setsvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=4;checkliveness(G(L),i_o);}[m
[31m-#define setuvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=7;checkliveness(G(L),i_o);}[m
[31m-#define setthvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=8;checkliveness(G(L),i_o);}[m
[31m-#define setclvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=6;checkliveness(G(L),i_o);}[m
[31m-#define sethvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=5;checkliveness(G(L),i_o);}[m
[31m-#define setptvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=(8+1);checkliveness(G(L),i_o);}[m
[31m-#define setobj(L,obj1,obj2){const TValue*o2=(obj2);TValue*o1=(obj1);o1->value=o2->value;o1->tt=o2->tt;checkliveness(G(L),o1);}[m
[31m-#define setttype(obj,tt)(ttype(obj)=(tt))[m
[31m-#define iscollectable(o)(ttype(o)>=4)[m
[31m-typedef TValue*StkId;[m
[31m-typedef union TString{[m
[31m-L_Umaxalign dummy;[m
[31m-struct{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-lu_byte reserved;[m
[31m-unsigned int hash;[m
[31m-size_t len;[m
[31m-}tsv;[m
[31m-}TString;[m
[31m-#define getstr(ts)cast(const char*,(ts)+1)[m
[31m-#define svalue(o)getstr(rawtsvalue(o))[m
[31m-typedef union Udata{[m
[31m-L_Umaxalign dummy;[m
[31m-struct{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-struct Table*metatable;[m
[31m-struct Table*env;[m
[31m-size_t len;[m
[31m-}uv;[m
[31m-}Udata;[m
[31m-typedef struct Proto{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-TValue*k;[m
[31m-Instruction*code;[m
[31m-struct Proto**p;[m
[31m-int*lineinfo;[m
[31m-struct LocVar*locvars;[m
[31m-TString**upvalues;[m
[31m-TString*source;[m
[31m-int sizeupvalues;[m
[31m-int sizek;[m
[31m-int sizecode;[m
[31m-int sizelineinfo;[m
[31m-int sizep;[m
[31m-int sizelocvars;[m
[31m-int linedefined;[m
[31m-int lastlinedefined;[m
[31m-GCObject*gclist;[m
[31m-lu_byte nups;[m
[31m-lu_byte numparams;[m
[31m-lu_byte is_vararg;[m
[31m-lu_byte maxstacksize;[m
[31m-}Proto;[m
[31m-typedef struct LocVar{[m
[31m-TString*varname;[m
[31m-int startpc;[m
[31m-int endpc;[m
[31m-}LocVar;[m
[31m-typedef struct UpVal{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-TValue*v;[m
[31m-union{[m
[31m-TValue value;[m
[31m-struct{[m
[31m-struct UpVal*prev;[m
[31m-struct UpVal*next;[m
[31m-}l;[m
[31m-}u;[m
[31m-}UpVal;[m
[31m-typedef struct CClosure{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env;[m
[31m-lua_CFunction f;[m
[31m-TValue upvalue[1];[m
[31m-}CClosure;[m
[31m-typedef struct LClosure{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env;[m
[31m-struct Proto*p;[m
[31m-UpVal*upvals[1];[m
[31m-}LClosure;[m
[31m-typedef union Closure{[m
[31m-CClosure c;[m
[31m-LClosure l;[m
[31m-}Closure;[m
[31m-#define iscfunction(o)(ttype(o)==6&&clvalue(o)->c.isC)[m
[31m-typedef union TKey{[m
[31m-struct{[m
[31m-Value value;int tt;[m
[31m-struct Node*next;[m
[31m-}nk;[m
[31m-TValue tvk;[m
[31m-}TKey;[m
[31m-typedef struct Node{[m
[31m-TValue i_val;[m
[31m-TKey i_key;[m
[31m-}Node;[m
[31m-typedef struct Table{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-lu_byte flags;[m
[31m-lu_byte lsizenode;[m
[31m-struct Table*metatable;[m
[31m-TValue*array;[m
[31m-Node*node;[m
[31m-Node*lastfree;[m
[31m-GCObject*gclist;[m
[31m-int sizearray;[m
[31m-}Table;[m
[31m-#define lmod(s,size)(check_exp((size&(size-1))==0,(cast(int,(s)&((size)-1)))))[m
[31m-#define twoto(x)((size_t)1<<(x))[m
[31m-#define sizenode(t)(twoto((t)->lsizenode))[m
[31m-static const TValue luaO_nilobject_;[m
[31m-#define ceillog2(x)(luaO_log2((x)-1)+1)[m
[31m-static int luaO_log2(unsigned int x);[m
[31m-#define gfasttm(g,et,e)((et)==NULL?NULL:((et)->flags&(1u<<(e)))?NULL:luaT_gettm(et,e,(g)->tmname[e]))[m
[31m-#define fasttm(l,et,e)gfasttm(G(l),et,e)[m
[31m-static const TValue*luaT_gettm(Table*events,TMS event,TString*ename);[m
[31m-#define luaM_reallocv(L,b,on,n,e)((cast(size_t,(n)+1)<=((size_t)(~(size_t)0)-2)/(e))?luaM_realloc_(L,(b),(on)*(e),(n)*(e)):luaM_toobig(L))[m
[31m-#define luaM_freemem(L,b,s)luaM_realloc_(L,(b),(s),0)[m
[31m-#define luaM_free(L,b)luaM_realloc_(L,(b),sizeof(*(b)),0)[m
[31m-#define luaM_freearray(L,b,n,t)luaM_reallocv(L,(b),n,0,sizeof(t))[m
[31m-#define luaM_malloc(L,t)luaM_realloc_(L,NULL,0,(t))[m
[31m-#define luaM_new(L,t)cast(t*,luaM_malloc(L,sizeof(t)))[m
[31m-#define luaM_newvector(L,n,t)cast(t*,luaM_reallocv(L,NULL,0,n,sizeof(t)))[m
[31m-#define luaM_growvector(L,v,nelems,size,t,limit,e)if((nelems)+1>(size))((v)=cast(t*,luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))[m
[31m-#define luaM_reallocvector(L,v,oldn,n,t)((v)=cast(t*,luaM_reallocv(L,v,oldn,n,sizeof(t))))[m
[31m-static void*luaM_realloc_(lua_State*L,void*block,size_t oldsize,[m
[31m-size_t size);[m
[31m-static void*luaM_toobig(lua_State*L);[m
[31m-static void*luaM_growaux_(lua_State*L,void*block,int*size,[m
[31m-size_t size_elem,int limit,[m
[31m-const char*errormsg);[m
[31m-typedef struct Zio ZIO;[m
[31m-#define char2int(c)cast(int,cast(unsigned char,(c)))[m
[31m-#define zgetc(z)(((z)->n--)>0?char2int(*(z)->p++):luaZ_fill(z))[m
[31m-typedef struct Mbuffer{[m
[31m-char*buffer;[m
[31m-size_t n;[m
[31m-size_t buffsize;[m
[31m-}Mbuffer;[m
[31m-#define luaZ_initbuffer(L,buff)((buff)->buffer=NULL,(buff)->buffsize=0)[m
[31m-#define luaZ_buffer(buff)((buff)->buffer)[m
[31m-#define luaZ_sizebuffer(buff)((buff)->buffsize)[m
[31m-#define luaZ_bufflen(buff)((buff)->n)[m
[31m-#define luaZ_resetbuffer(buff)((buff)->n=0)[m
[31m-#define luaZ_resizebuffer(L,buff,size)(luaM_reallocvector(L,(buff)->buffer,(buff)->buffsize,size,char),(buff)->buffsize=size)[m
[31m-#define luaZ_freebuffer(L,buff)luaZ_resizebuffer(L,buff,0)[m
[31m-struct Zio{[m
[31m-size_t n;[m
[31m-const char*p;[m
[31m-lua_Reader reader;[m
[31m-void*data;[m
[31m-lua_State*L;[m
[31m-};[m
[31m-static int luaZ_fill(ZIO*z);[m
[31m-struct lua_longjmp;[m
[31m-#define gt(L)(&L->l_gt)[m
[31m-#define registry(L)(&G(L)->l_registry)[m
[31m-typedef struct stringtable{[m
[31m-GCObject**hash;[m
[31m-lu_int32 nuse;[m
[31m-int size;[m
[31m-}stringtable;[m
[31m-typedef struct CallInfo{[m
[31m-StkId base;[m
[31m-StkId func;[m
[31m-StkId top;[m
[31m-const Instruction*savedpc;[m
[31m-int nresults;[m
[31m-int tailcalls;[m
[31m-}CallInfo;[m
[31m-#define curr_func(L)(clvalue(L->ci->func))[m
[31m-#define ci_func(ci)(clvalue((ci)->func))[m
[31m-#define f_isLua(ci)(!ci_func(ci)->c.isC)[m
[31m-#define isLua(ci)(ttisfunction((ci)->func)&&f_isLua(ci))[m
[31m-typedef struct global_State{[m
[31m-stringtable strt;[m
[31m-lua_Alloc frealloc;[m
[31m-void*ud;[m
[31m-lu_byte currentwhite;[m
[31m-lu_byte gcstate;[m
[31m-int sweepstrgc;[m
[31m-GCObject*rootgc;[m
[31m-GCObject**sweepgc;[m
[31m-GCObject*gray;[m
[31m-GCObject*grayagain;[m
[31m-GCObject*weak;[m
[31m-GCObject*tmudata;[m
[31m-Mbuffer buff;[m
[31m-lu_mem GCthreshold;[m
[31m-lu_mem totalbytes;[m
[31m-lu_mem estimate;[m
[31m-lu_mem gcdept;[m
[31m-int gcpause;[m
[31m-int gcstepmul;[m
[31m-lua_CFunction panic;[m
[31m-TValue l_registry;[m
[31m-struct lua_State*mainthread;[m
[31m-UpVal uvhead;[m
[31m-struct Table*mt[(8+1)];[m
[31m-TString*tmname[TM_N];[m
[31m-}global_State;[m
[31m-struct lua_State{[m
[31m-GCObject*next;lu_byte tt;lu_byte marked;[m
[31m-lu_byte status;[m
[31m-StkId top;[m
[31m-StkId base;[m
[31m-global_State*l_G;[m
[31m-CallInfo*ci;[m
[31m-const Instruction*savedpc;[m
[31m-StkId stack_last;[m
[31m-StkId stack;[m
[31m-CallInfo*end_ci;[m
[31m-CallInfo*base_ci;[m
[31m-int stacksize;[m
[31m-int size_ci;[m
[31m-unsigned short nCcalls;[m
[31m-unsigned short baseCcalls;[m
[31m-lu_byte hookmask;[m
[31m-lu_byte allowhook;[m
[31m-int basehookcount;[m
[31m-int hookcount;[m
[31m-lua_Hook hook;[m
[31m-TValue l_gt;[m
[31m-TValue env;[m
[31m-GCObject*openupval;[m
[31m-GCObject*gclist;[m
[31m-struct lua_longjmp*errorJmp;[m
[31m-ptrdiff_t errfunc;[m
[31m-};[m
[31m-#define G(L)(L->l_G)[m
[31m-union GCObject{[m
[31m-GCheader gch;[m
[31m-union TString ts;[m
[31m-union Udata u;[m
[31m-union Closure cl;[m
[31m-struct Table h;[m
[31m-struct Proto p;[m
[31m-struct UpVal uv;[m
[31m-struct lua_State th;[m
[31m-};[m
[31m-#define rawgco2ts(o)check_exp((o)->gch.tt==4,&((o)->ts))[m
[31m-#define gco2ts(o)(&rawgco2ts(o)->tsv)[m
[31m-#define rawgco2u(o)check_exp((o)->gch.tt==7,&((o)->u))[m
[31m-#define gco2u(o)(&rawgco2u(o)->uv)[m
[31m-#define gco2cl(o)check_exp((o)->gch.tt==6,&((o)->cl))[m
[31m-#define gco2h(o)check_exp((o)->gch.tt==5,&((o)->h))[m
[31m-#define gco2p(o)check_exp((o)->gch.tt==(8+1),&((o)->p))[m
[31m-#define gco2uv(o)check_exp((o)->gch.tt==(8+2),&((o)->uv))[m
[31m-#define ngcotouv(o)check_exp((o)==NULL||(o)->gch.tt==(8+2),&((o)->uv))[m
[31m-#define gco2th(o)check_exp((o)->gch.tt==8,&((o)->th))[m
[31m-#define obj2gco(v)(cast(GCObject*,(v)))[m
[31m-static void luaE_freethread(lua_State*L,lua_State*L1);[m
[31m-#define pcRel(pc,p)(cast(int,(pc)-(p)->code)-1)[m
[31m-#define getline_(f,pc)(((f)->lineinfo)?(f)->lineinfo[pc]:0)[m
[31m-#define resethookcount(L)(L->hookcount=L->basehookcount)[m
[31m-static void luaG_typeerror(lua_State*L,const TValue*o,[m
[31m-const char*opname);[m
[31m-static void luaG_runerror(lua_State*L,const char*fmt,...);[m
[31m-#define luaD_checkstack(L,n)if((char*)L->stack_last-(char*)L->top<=(n)*(int)sizeof(TValue))luaD_growstack(L,n);else condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));[m
[31m-#define incr_top(L){luaD_checkstack(L,1);L->top++;}[m
[31m-#define savestack(L,p)((char*)(p)-(char*)L->stack)[m
[31m-#define restorestack(L,n)((TValue*)((char*)L->stack+(n)))[m
[31m-#define saveci(L,p)((char*)(p)-(char*)L->base_ci)[m
[31m-#define restoreci(L,n)((CallInfo*)((char*)L->base_ci+(n)))[m
[31m-typedef void(*Pfunc)(lua_State*L,void*ud);[m
[31m-static int luaD_poscall(lua_State*L,StkId firstResult);[m
[31m-static void luaD_reallocCI(lua_State*L,int newsize);[m
[31m-static void luaD_reallocstack(lua_State*L,int newsize);[m
[31m-static void luaD_growstack(lua_State*L,int n);[m
[31m-static void luaD_throw(lua_State*L,int errcode);[m
[31m-static void*luaM_growaux_(lua_State*L,void*block,int*size,size_t size_elems,[m
[31m-int limit,const char*errormsg){[m
[31m-void*newblock;[m
[31m-int newsize;[m
[31m-if(*size>=limit/2){[m
[31m-if(*size>=limit)[m
[31m-luaG_runerror(L,errormsg);[m
[31m-newsize=limit;[m
[31m-}[m
[31m-else{[m
[31m-newsize=(*size)*2;[m
[31m-if(newsize<4)[m
[31m-newsize=4;[m
[31m-}[m
[31m-newblock=luaM_reallocv(L,block,*size,newsize,size_elems);[m
[31m-*size=newsize;[m
[31m-return newblock;[m
[31m-}[m
[31m-static void*luaM_toobig(lua_State*L){[m
[31m-luaG_runerror(L,"memory allocation error: block too big");[m
[31m-return NULL;[m
[31m-}[m
[31m-static void*luaM_realloc_(lua_State*L,void*block,size_t osize,size_t nsize){[m
[31m-global_State*g=G(L);[m
[31m-block=(*g->frealloc)(g->ud,block,osize,nsize);[m
[31m-if(block==NULL&&nsize>0)[m
[31m-luaD_throw(L,4);[m
[31m-g->totalbytes=(g->totalbytes-osize)+nsize;[m
[31m-return block;[m
[31m-}[m
[31m-#define resetbits(x,m)((x)&=cast(lu_byte,~(m)))[m
[31m-#define setbits(x,m)((x)|=(m))[m
[31m-#define testbits(x,m)((x)&(m))[m
[31m-#define bitmask(b)(1<<(b))[m
[31m-#define bit2mask(b1,b2)(bitmask(b1)|bitmask(b2))[m
[31m-#define l_setbit(x,b)setbits(x,bitmask(b))[m
[31m-#define resetbit(x,b)resetbits(x,bitmask(b))[m
[31m-#define testbit(x,b)testbits(x,bitmask(b))[m
[31m-#define set2bits(x,b1,b2)setbits(x,(bit2mask(b1,b2)))[m
[31m-#define reset2bits(x,b1,b2)resetbits(x,(bit2mask(b1,b2)))[m
[31m-#define test2bits(x,b1,b2)testbits(x,(bit2mask(b1,b2)))[m
[31m-#define iswhite(x)test2bits((x)->gch.marked,0,1)[m
[31m-#define isblack(x)testbit((x)->gch.marked,2)[m
[31m-#define isgray(x)(!isblack(x)&&!iswhite(x))[m
[31m-#define otherwhite(g)(g->currentwhite^bit2mask(0,1))[m
[31m-#define isdead(g,v)((v)->gch.marked&otherwhite(g)&bit2mask(0,1))[m
[31m-#define changewhite(x)((x)->gch.marked^=bit2mask(0,1))[m
[31m-#define gray2black(x)l_setbit((x)->gch.marked,2)[m
[31m-#define valiswhite(x)(iscollectable(x)&&iswhite(gcvalue(x)))[m
[31m-#define luaC_white(g)cast(lu_byte,(g)->currentwhite&bit2mask(0,1))[m
[31m-#define luaC_checkGC(L){condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));if(G(L)->totalbytes>=G(L)->GCthreshold)luaC_step(L);}[m
[31m-#define luaC_barrier(L,p,v){if(valiswhite(v)&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),gcvalue(v));}[m
[31m-#define luaC_barriert(L,t,v){if(valiswhite(v)&&isblack(obj2gco(t)))luaC_barrierback(L,t);}[m
[31m-#define luaC_objbarrier(L,p,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),obj2gco(o));}[m
[31m-#define luaC_objbarriert(L,t,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(t)))luaC_barrierback(L,t);}[m
[31m-static void luaC_step(lua_State*L);[m
[31m-static void luaC_link(lua_State*L,GCObject*o,lu_byte tt);[m
[31m-static void luaC_linkupval(lua_State*L,UpVal*uv);[m
[31m-static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v);[m
[31m-static void luaC_barrierback(lua_State*L,Table*t);[m
[31m-#define sizestring(s)(sizeof(union TString)+((s)->len+1)*sizeof(char))[m
[31m-#define sizeudata(u)(sizeof(union Udata)+(u)->len)[m
[31m-#define luaS_new(L,s)(luaS_newlstr(L,s,strlen(s)))[m
[31m-#define luaS_newliteral(L,s)(luaS_newlstr(L,""s,(sizeof(s)/sizeof(char))-1))[m
[31m-#define luaS_fix(s)l_setbit((s)->tsv.marked,5)[m
[31m-static TString*luaS_newlstr(lua_State*L,const char*str,size_t l);[m
[31m-#define tostring(L,o)((ttype(o)==4)||(luaV_tostring(L,o)))[m
[31m-#define tonumber(o,n)(ttype(o)==3||(((o)=luaV_tonumber(o,n))!=NULL))[m
[31m-#define equalobj(L,o1,o2)(ttype(o1)==ttype(o2)&&luaV_equalval(L,o1,o2))[m
[31m-static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2);[m
[31m-static const TValue*luaV_tonumber(const TValue*obj,TValue*n);[m
[31m-static int luaV_tostring(lua_State*L,StkId obj);[m
[31m-static void luaV_execute(lua_State*L,int nexeccalls);[m
[31m-static void luaV_concat(lua_State*L,int total,int last);[m
[31m-static const TValue luaO_nilobject_={{NULL},0};[m
[31m-static int luaO_int2fb(unsigned int x){[m
[31m-int e=0;[m
[31m-while(x>=16){[m
[31m-x=(x+1)>>1;[m
[31m-e++;[m
[31m-}[m
[31m-if(x<8)return x;[m
[31m-else return((e+1)<<3)|(cast_int(x)-8);[m
[31m-}[m
[31m-static int luaO_fb2int(int x){[m
[31m-int e=(x>>3)&31;[m
[31m-if(e==0)return x;[m
[31m-else return((x&7)+8)<<(e-1);[m
[31m-}[m
[31m-static int luaO_log2(unsigned int x){[m
[31m-static const lu_byte log_2[256]={[m
[31m-0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,[m
[31m-6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,[m
[31m-7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,[m
[31m-7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,[m
[31m-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8[m
[31m-};[m
[31m-int l=-1;[m
[31m-while(x>=256){l+=8;x>>=8;}[m
[31m-return l+log_2[x];[m
[31m-}[m
[31m-static int luaO_rawequalObj(const TValue*t1,const TValue*t2){[m
[31m-if(ttype(t1)!=ttype(t2))return 0;[m
[31m-else switch(ttype(t1)){[m
[31m-case 0:[m
[31m-return 1;[m
[31m-case 3:[m
[31m-return luai_numeq(nvalue(t1),nvalue(t2));[m
[31m-case 1:[m
[31m-return bvalue(t1)==bvalue(t2);[m
[31m-case 2:[m
[31m-return pvalue(t1)==pvalue(t2);[m
[31m-default:[m
[31m-return gcvalue(t1)==gcvalue(t2);[m
[31m-}[m
[31m-}[m
[31m-static int luaO_str2d(const char*s,lua_Number*result){[m
[31m-char*endptr;[m
[31m-*result=lua_str2number(s,&endptr);[m
[31m-if(endptr==s)return 0;[m
[31m-if(*endptr=='x'||*endptr=='X')[m
[31m-*result=cast_num(strtoul(s,&endptr,16));[m
[31m-if(*endptr=='\0')return 1;[m
[31m-while(isspace(cast(unsigned char,*endptr)))endptr++;[m
[31m-if(*endptr!='\0')return 0;[m
[31m-return 1;[m
[31m-}[m
[31m-static void pushstr(lua_State*L,const char*str){[m
[31m-setsvalue(L,L->top,luaS_new(L,str));[m
[31m-incr_top(L);[m
[31m-}[m
[31m-static const char*luaO_pushvfstring(lua_State*L,const char*fmt,va_list argp){[m
[31m-int n=1;[m
[31m-pushstr(L,"");[m
[31m-for(;;){[m
[31m-const char*e=strchr(fmt,'%');[m
[31m-if(e==NULL)break;[m
[31m-setsvalue(L,L->top,luaS_newlstr(L,fmt,e-fmt));[m
[31m-incr_top(L);[m
[31m-switch(*(e+1)){[m
[31m-case's':{[m
[31m-const char*s=va_arg(argp,char*);[m
[31m-if(s==NULL)s="(null)";[m
[31m-pushstr(L,s);[m
[31m-break;[m
[31m-}[m
[31m-case'c':{[m
[31m-char buff[2];[m
[31m-buff[0]=cast(char,va_arg(argp,int));[m
[31m-buff[1]='\0';[m
[31m-pushstr(L,buff);[m
[31m-break;[m
[31m-}[m
[31m-case'd':{[m
[31m-setnvalue(L->top,cast_num(va_arg(argp,int)));[m
[31m-incr_top(L);[m
[31m-break;[m
[31m-}[m
[31m-case'f':{[m
[31m-setnvalue(L->top,cast_num(va_arg(argp,l_uacNumber)));[m
[31m-incr_top(L);[m
[31m-break;[m
[31m-}[m
[31m-case'p':{[m
[31m-char buff[4*sizeof(void*)+8];[m
[31m-sprintf(buff,"%p",va_arg(argp,void*));[m
[31m-pushstr(L,buff);[m
[31m-break;[m
[31m-}[m
[31m-case'%':{[m
[31m-pushstr(L,"%");[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-char buff[3];[m
[31m-buff[0]='%';[m
[31m-buff[1]=*(e+1);[m
[31m-buff[2]='\0';[m
[31m-pushstr(L,buff);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-n+=2;[m
[31m-fmt=e+2;[m
[31m-}[m
[31m-pushstr(L,fmt);[m
[31m-luaV_concat(L,n+1,cast_int(L->top-L->base)-1);[m
[31m-L->top-=n;[m
[31m-return svalue(L->top-1);[m
[31m-}[m
[31m-static const char*luaO_pushfstring(lua_State*L,const char*fmt,...){[m
[31m-const char*msg;[m
[31m-va_list argp;[m
[31m-va_start(argp,fmt);[m
[31m-msg=luaO_pushvfstring(L,fmt,argp);[m
[31m-va_end(argp);[m
[31m-return msg;[m
[31m-}[m
[31m-static void luaO_chunkid(char*out,const char*source,size_t bufflen){[m
[31m-if(*source=='='){[m
[31m-strncpy(out,source+1,bufflen);[m
[31m-out[bufflen-1]='\0';[m
[31m-}[m
[31m-else{[m
[31m-if(*source=='@'){[m
[31m-size_t l;[m
[31m-source++;[m
[31m-bufflen-=sizeof(" '...' ");[m
[31m-l=strlen(source);[m
[31m-strcpy(out,"");[m
[31m-if(l>bufflen){[m
[31m-source+=(l-bufflen);[m
[31m-strcat(out,"...");[m
[31m-}[m
[31m-strcat(out,source);[m
[31m-}[m
[31m-else{[m
[31m-size_t len=strcspn(source,"\n\r");[m
[31m-bufflen-=sizeof(" [string \"...\"] ");[m
[31m-if(len>bufflen)len=bufflen;[m
[31m-strcpy(out,"[string \"");[m
[31m-if(source[len]!='\0'){[m
[31m-strncat(out,source,len);[m
[31m-strcat(out,"...");[m
[31m-}[m
[31m-else[m
[31m-strcat(out,source);[m
[31m-strcat(out,"\"]");[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-#define gnode(t,i)(&(t)->node[i])[m
[31m-#define gkey(n)(&(n)->i_key.nk)[m
[31m-#define gval(n)(&(n)->i_val)[m
[31m-#define gnext(n)((n)->i_key.nk.next)[m
[31m-#define key2tval(n)(&(n)->i_key.tvk)[m
[31m-static TValue*luaH_setnum(lua_State*L,Table*t,int key);[m
[31m-static const TValue*luaH_getstr(Table*t,TString*key);[m
[31m-static TValue*luaH_set(lua_State*L,Table*t,const TValue*key);[m
[31m-static const char*const luaT_typenames[]={[m
[31m-"nil","boolean","userdata","number",[m
[31m-"string","table","function","userdata","thread",[m
[31m-"proto","upval"[m
[31m-};[m
[31m-static void luaT_init(lua_State*L){[m
[31m-static const char*const luaT_eventname[]={[m
[31m-"__index","__newindex",[m
[31m-"__gc","__mode","__eq",[m
[31m-"__add","__sub","__mul","__div","__mod",[m
[31m-"__pow","__unm","__len","__lt","__le",[m
[31m-"__concat","__call"[m
[31m-};[m
[31m-int i;[m
[31m-for(i=0;i<TM_N;i++){[m
[31m-G(L)->tmname[i]=luaS_new(L,luaT_eventname[i]);[m
[31m-luaS_fix(G(L)->tmname[i]);[m
[31m-}[m
[31m-}[m
[31m-static const TValue*luaT_gettm(Table*events,TMS event,TString*ename){[m
[31m-const TValue*tm=luaH_getstr(events,ename);[m
[31m-if(ttisnil(tm)){[m
[31m-events->flags|=cast_byte(1u<<event);[m
[31m-return NULL;[m
[31m-}[m
[31m-else return tm;[m
[31m-}[m
[31m-static const TValue*luaT_gettmbyobj(lua_State*L,const TValue*o,TMS event){[m
[31m-Table*mt;[m
[31m-switch(ttype(o)){[m
[31m-case 5:[m
[31m-mt=hvalue(o)->metatable;[m
[31m-break;[m
[31m-case 7:[m
[31m-mt=uvalue(o)->metatable;[m
[31m-break;[m
[31m-default:[m
[31m-mt=G(L)->mt[ttype(o)];[m
[31m-}[m
[31m-return(mt?luaH_getstr(mt,G(L)->tmname[event]):(&luaO_nilobject_));[m
[31m-}[m
[31m-#define sizeCclosure(n)(cast(int,sizeof(CClosure))+cast(int,sizeof(TValue)*((n)-1)))[m
[31m-#define sizeLclosure(n)(cast(int,sizeof(LClosure))+cast(int,sizeof(TValue*)*((n)-1)))[m
[31m-static Closure*luaF_newCclosure(lua_State*L,int nelems,Table*e){[m
[31m-Closure*c=cast(Closure*,luaM_malloc(L,sizeCclosure(nelems)));[m
[31m-luaC_link(L,obj2gco(c),6);[m
[31m-c->c.isC=1;[m
[31m-c->c.env=e;[m
[31m-c->c.nupvalues=cast_byte(nelems);[m
[31m-return c;[m
[31m-}[m
[31m-static Closure*luaF_newLclosure(lua_State*L,int nelems,Table*e){[m
[31m-Closure*c=cast(Closure*,luaM_malloc(L,sizeLclosure(nelems)));[m
[31m-luaC_link(L,obj2gco(c),6);[m
[31m-c->l.isC=0;[m
[31m-c->l.env=e;[m
[31m-c->l.nupvalues=cast_byte(nelems);[m
[31m-while(nelems--)c->l.upvals[nelems]=NULL;[m
[31m-return c;[m
[31m-}[m
[31m-static UpVal*luaF_newupval(lua_State*L){[m
[31m-UpVal*uv=luaM_new(L,UpVal);[m
[31m-luaC_link(L,obj2gco(uv),(8+2));[m
[31m-uv->v=&uv->u.value;[m
[31m-setnilvalue(uv->v);[m
[31m-return uv;[m
[31m-}[m
[31m-static UpVal*luaF_findupval(lua_State*L,StkId level){[m
[31m-global_State*g=G(L);[m
[31m-GCObject**pp=&L->openupval;[m
[31m-UpVal*p;[m
[31m-UpVal*uv;[m
[31m-while(*pp!=NULL&&(p=ngcotouv(*pp))->v>=level){[m
[31m-if(p->v==level){[m
[31m-if(isdead(g,obj2gco(p)))[m
[31m-changewhite(obj2gco(p));[m
[31m-return p;[m
[31m-}[m
[31m-pp=&p->next;[m
[31m-}[m
[31m-uv=luaM_new(L,UpVal);[m
[31m-uv->tt=(8+2);[m
[31m-uv->marked=luaC_white(g);[m
[31m-uv->v=level;[m
[31m-uv->next=*pp;[m
[31m-*pp=obj2gco(uv);[m
[31m-uv->u.l.prev=&g->uvhead;[m
[31m-uv->u.l.next=g->uvhead.u.l.next;[m
[31m-uv->u.l.next->u.l.prev=uv;[m
[31m-g->uvhead.u.l.next=uv;[m
[31m-return uv;[m
[31m-}[m
[31m-static void unlinkupval(UpVal*uv){[m
[31m-uv->u.l.next->u.l.prev=uv->u.l.prev;[m
[31m-uv->u.l.prev->u.l.next=uv->u.l.next;[m
[31m-}[m
[31m-static void luaF_freeupval(lua_State*L,UpVal*uv){[m
[31m-if(uv->v!=&uv->u.value)[m
[31m-unlinkupval(uv);[m
[31m-luaM_free(L,uv);[m
[31m-}[m
[31m-static void luaF_close(lua_State*L,StkId level){[m
[31m-UpVal*uv;[m
[31m-global_State*g=G(L);[m
[31m-while(L->openupval!=NULL&&(uv=ngcotouv(L->openupval))->v>=level){[m
[31m-GCObject*o=obj2gco(uv);[m
[31m-L->openupval=uv->next;[m
[31m-if(isdead(g,o))[m
[31m-luaF_freeupval(L,uv);[m
[31m-else{[m
[31m-unlinkupval(uv);[m
[31m-setobj(L,&uv->u.value,uv->v);[m
[31m-uv->v=&uv->u.value;[m
[31m-luaC_linkupval(L,uv);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static Proto*luaF_newproto(lua_State*L){[m
[31m-Proto*f=luaM_new(L,Proto);[m
[31m-luaC_link(L,obj2gco(f),(8+1));[m
[31m-f->k=NULL;[m
[31m-f->sizek=0;[m
[31m-f->p=NULL;[m
[31m-f->sizep=0;[m
[31m-f->code=NULL;[m
[31m-f->sizecode=0;[m
[31m-f->sizelineinfo=0;[m
[31m-f->sizeupvalues=0;[m
[31m-f->nups=0;[m
[31m-f->upvalues=NULL;[m
[31m-f->numparams=0;[m
[31m-f->is_vararg=0;[m
[31m-f->maxstacksize=0;[m
[31m-f->lineinfo=NULL;[m
[31m-f->sizelocvars=0;[m
[31m-f->locvars=NULL;[m
[31m-f->linedefined=0;[m
[31m-f->lastlinedefined=0;[m
[31m-f->source=NULL;[m
[31m-return f;[m
[31m-}[m
[31m-static void luaF_freeproto(lua_State*L,Proto*f){[m
[31m-luaM_freearray(L,f->code,f->sizecode,Instruction);[m
[31m-luaM_freearray(L,f->p,f->sizep,Proto*);[m
[31m-luaM_freearray(L,f->k,f->sizek,TValue);[m
[31m-luaM_freearray(L,f->lineinfo,f->sizelineinfo,int);[m
[31m-luaM_freearray(L,f->locvars,f->sizelocvars,struct LocVar);[m
[31m-luaM_freearray(L,f->upvalues,f->sizeupvalues,TString*);[m
[31m-luaM_free(L,f);[m
[31m-}[m
[31m-static void luaF_freeclosure(lua_State*L,Closure*c){[m
[31m-int size=(c->c.isC)?sizeCclosure(c->c.nupvalues):[m
[31m-sizeLclosure(c->l.nupvalues);[m
[31m-luaM_freemem(L,c,size);[m
[31m-}[m
[31m-#define MASK1(n,p)((~((~(Instruction)0)<<n))<<p)[m
[31m-#define MASK0(n,p)(~MASK1(n,p))[m
[31m-#define GET_OPCODE(i)(cast(OpCode,((i)>>0)&MASK1(6,0)))[m
[31m-#define SET_OPCODE(i,o)((i)=(((i)&MASK0(6,0))|((cast(Instruction,o)<<0)&MASK1(6,0))))[m
[31m-#define GETARG_A(i)(cast(int,((i)>>(0+6))&MASK1(8,0)))[m
[31m-#define SETARG_A(i,u)((i)=(((i)&MASK0(8,(0+6)))|((cast(Instruction,u)<<(0+6))&MASK1(8,(0+6)))))[m
[31m-#define GETARG_B(i)(cast(int,((i)>>(((0+6)+8)+9))&MASK1(9,0)))[m
[31m-#define SETARG_B(i,b)((i)=(((i)&MASK0(9,(((0+6)+8)+9)))|((cast(Instruction,b)<<(((0+6)+8)+9))&MASK1(9,(((0+6)+8)+9)))))[m
[31m-#define GETARG_C(i)(cast(int,((i)>>((0+6)+8))&MASK1(9,0)))[m
[31m-#define SETARG_C(i,b)((i)=(((i)&MASK0(9,((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1(9,((0+6)+8)))))[m
[31m-#define GETARG_Bx(i)(cast(int,((i)>>((0+6)+8))&MASK1((9+9),0)))[m
[31m-#define SETARG_Bx(i,b)((i)=(((i)&MASK0((9+9),((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1((9+9),((0+6)+8)))))[m
[31m-#define GETARG_sBx(i)(GETARG_Bx(i)-(((1<<(9+9))-1)>>1))[m
[31m-#define SETARG_sBx(i,b)SETARG_Bx((i),cast(unsigned int,(b)+(((1<<(9+9))-1)>>1)))[m
[31m-#define CREATE_ABC(o,a,b,c)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,b)<<(((0+6)+8)+9))|(cast(Instruction,c)<<((0+6)+8)))[m
[31m-#define CREATE_ABx(o,a,bc)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,bc)<<((0+6)+8)))[m
[31m-#define ISK(x)((x)&(1<<(9-1)))[m
[31m-#define INDEXK(r)((int)(r)&~(1<<(9-1)))[m
[31m-#define RKASK(x)((x)|(1<<(9-1)))[m
[31m-static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)];[m
[31m-#define getBMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>4)&3))[m
[31m-#define getCMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>2)&3))[m
[31m-#define testTMode(m)(luaP_opmodes[m]&(1<<7))[m
[31m-typedef struct expdesc{[m
[31m-expkind k;[m
[31m-union{[m
[31m-struct{int info,aux;}s;[m
[31m-lua_Number nval;[m
[31m-}u;[m
[31m-int t;[m
[31m-int f;[m
[31m-}expdesc;[m
[31m-typedef struct upvaldesc{[m
[31m-lu_byte k;[m
[31m-lu_byte info;[m
[31m-}upvaldesc;[m
[31m-struct BlockCnt;[m
[31m-typedef struct FuncState{[m
[31m-Proto*f;[m
[31m-Table*h;[m
[31m-struct FuncState*prev;[m
[31m-struct LexState*ls;[m
[31m-struct lua_State*L;[m
[31m-struct BlockCnt*bl;[m
[31m-int pc;[m
[31m-int lasttarget;[m
[31m-int jpc;[m
[31m-int freereg;[m
[31m-int nk;[m
[31m-int np;[m
[31m-short nlocvars;[m
[31m-lu_byte nactvar;[m
[31m-upvaldesc upvalues[60];[m
[31m-unsigned short actvar[200];[m
[31m-}FuncState;[m
[31m-static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,[m
[31m-const char*name);[m
[31m-struct lua_longjmp{[m
[31m-struct lua_longjmp*previous;[m
[31m-jmp_buf b;[m
[31m-volatile int status;[m
[31m-};[m
[31m-static void luaD_seterrorobj(lua_State*L,int errcode,StkId oldtop){[m
[31m-switch(errcode){[m
[31m-case 4:{[m
[31m-setsvalue(L,oldtop,luaS_newliteral(L,"not enough memory"));[m
[31m-break;[m
[31m-}[m
[31m-case 5:{[m
[31m-setsvalue(L,oldtop,luaS_newliteral(L,"error in error handling"));[m
[31m-break;[m
[31m-}[m
[31m-case 3:[m
[31m-case 2:{[m
[31m-setobj(L,oldtop,L->top-1);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-L->top=oldtop+1;[m
[31m-}[m
[31m-static void restore_stack_limit(lua_State*L){[m
[31m-if(L->size_ci>20000){[m
[31m-int inuse=cast_int(L->ci-L->base_ci);[m
[31m-if(inuse+1<20000)[m
[31m-luaD_reallocCI(L,20000);[m
[31m-}[m
[31m-}[m
[31m-static void resetstack(lua_State*L,int status){[m
[31m-L->ci=L->base_ci;[m
[31m-L->base=L->ci->base;[m
[31m-luaF_close(L,L->base);[m
[31m-luaD_seterrorobj(L,status,L->base);[m
[31m-L->nCcalls=L->baseCcalls;[m
[31m-L->allowhook=1;[m
[31m-restore_stack_limit(L);[m
[31m-L->errfunc=0;[m
[31m-L->errorJmp=NULL;[m
[31m-}[m
[31m-static void luaD_throw(lua_State*L,int errcode){[m
[31m-if(L->errorJmp){[m
[31m-L->errorJmp->status=errcode;[m
[31m-LUAI_THROW(L,L->errorJmp);[m
[31m-}[m
[31m-else{[m
[31m-L->status=cast_byte(errcode);[m
[31m-if(G(L)->panic){[m
[31m-resetstack(L,errcode);[m
[31m-G(L)->panic(L);[m
[31m-}[m
[31m-exit(EXIT_FAILURE);[m
[31m-}[m
[31m-}[m
[31m-static int luaD_rawrunprotected(lua_State*L,Pfunc f,void*ud){[m
[31m-struct lua_longjmp lj;[m
[31m-lj.status=0;[m
[31m-lj.previous=L->errorJmp;[m
[31m-L->errorJmp=&lj;[m
[31m-LUAI_TRY(L,&lj,[m
[31m-(*f)(L,ud);[m
[31m-);[m
[31m-L->errorJmp=lj.previous;[m
[31m-return lj.status;[m
[31m-}[m
[31m-static void correctstack(lua_State*L,TValue*oldstack){[m
[31m-CallInfo*ci;[m
[31m-GCObject*up;[m
[31m-L->top=(L->top-oldstack)+L->stack;[m
[31m-for(up=L->openupval;up!=NULL;up=up->gch.next)[m
[31m-gco2uv(up)->v=(gco2uv(up)->v-oldstack)+L->stack;[m
[31m-for(ci=L->base_ci;ci<=L->ci;ci++){[m
[31m-ci->top=(ci->top-oldstack)+L->stack;[m
[31m-ci->base=(ci->base-oldstack)+L->stack;[m
[31m-ci->func=(ci->func-oldstack)+L->stack;[m
[31m-}[m
[31m-L->base=(L->base-oldstack)+L->stack;[m
[31m-}[m
[31m-static void luaD_reallocstack(lua_State*L,int newsize){[m
[31m-TValue*oldstack=L->stack;[m
[31m-int realsize=newsize+1+5;[m
[31m-luaM_reallocvector(L,L->stack,L->stacksize,realsize,TValue);[m
[31m-L->stacksize=realsize;[m
[31m-L->stack_last=L->stack+newsize;[m
[31m-correctstack(L,oldstack);[m
[31m-}[m
[31m-static void luaD_reallocCI(lua_State*L,int newsize){[m
[31m-CallInfo*oldci=L->base_ci;[m
[31m-luaM_reallocvector(L,L->base_ci,L->size_ci,newsize,CallInfo);[m
[31m-L->size_ci=newsize;[m
[31m-L->ci=(L->ci-oldci)+L->base_ci;[m
[31m-L->end_ci=L->base_ci+L->size_ci-1;[m
[31m-}[m
[31m-static void luaD_growstack(lua_State*L,int n){[m
[31m-if(n<=L->stacksize)[m
[31m-luaD_reallocstack(L,2*L->stacksize);[m
[31m-else[m
[31m-luaD_reallocstack(L,L->stacksize+n);[m
[31m-}[m
[31m-static CallInfo*growCI(lua_State*L){[m
[31m-if(L->size_ci>20000)[m
[31m-luaD_throw(L,5);[m
[31m-else{[m
[31m-luaD_reallocCI(L,2*L->size_ci);[m
[31m-if(L->size_ci>20000)[m
[31m-luaG_runerror(L,"stack overflow");[m
[31m-}[m
[31m-return++L->ci;[m
[31m-}[m
[31m-static StkId adjust_varargs(lua_State*L,Proto*p,int actual){[m
[31m-int i;[m
[31m-int nfixargs=p->numparams;[m
[31m-Table*htab=NULL;[m
[31m-StkId base,fixed;[m
[31m-for(;actual<nfixargs;++actual)[m
[31m-setnilvalue(L->top++);[m
[31m-fixed=L->top-actual;[m
[31m-base=L->top;[m
[31m-for(i=0;i<nfixargs;i++){[m
[31m-setobj(L,L->top++,fixed+i);[m
[31m-setnilvalue(fixed+i);[m
[31m-}[m
[31m-if(htab){[m
[31m-sethvalue(L,L->top++,htab);[m
[31m-}[m
[31m-return base;[m
[31m-}[m
[31m-static StkId tryfuncTM(lua_State*L,StkId func){[m
[31m-const TValue*tm=luaT_gettmbyobj(L,func,TM_CALL);[m
[31m-StkId p;[m
[31m-ptrdiff_t funcr=savestack(L,func);[m
[31m-if(!ttisfunction(tm))[m
[31m-luaG_typeerror(L,func,"call");[m
[31m-for(p=L->top;p>func;p--)setobj(L,p,p-1);[m
[31m-incr_top(L);[m
[31m-func=restorestack(L,funcr);[m
[31m-setobj(L,func,tm);[m
[31m-return func;[m
[31m-}[m
[31m-#define inc_ci(L)((L->ci==L->end_ci)?growCI(L):(condhardstacktests(luaD_reallocCI(L,L->size_ci)),++L->ci))[m
[31m-static int luaD_precall(lua_State*L,StkId func,int nresults){[m
[31m-LClosure*cl;[m
[31m-ptrdiff_t funcr;[m
[31m-if(!ttisfunction(func))[m
[31m-func=tryfuncTM(L,func);[m
[31m-funcr=savestack(L,func);[m
[31m-cl=&clvalue(func)->l;[m
[31m-L->ci->savedpc=L->savedpc;[m
[31m-if(!cl->isC){[m
[31m-CallInfo*ci;[m
[31m-StkId st,base;[m
[31m-Proto*p=cl->p;[m
[31m-luaD_checkstack(L,p->maxstacksize);[m
[31m-func=restorestack(L,funcr);[m
[31m-if(!p->is_vararg){[m
[31m-base=func+1;[m
[31m-if(L->top>base+p->numparams)[m
[31m-L->top=base+p->numparams;[m
[31m-}[m
[31m-else{[m
[31m-int nargs=cast_int(L->top-func)-1;[m
[31m-base=adjust_varargs(L,p,nargs);[m
[31m-func=restorestack(L,funcr);[m
[31m-}[m
[31m-ci=inc_ci(L);[m
[31m-ci->func=func;[m
[31m-L->base=ci->base=base;[m
[31m-ci->top=L->base+p->maxstacksize;[m
[31m-L->savedpc=p->code;[m
[31m-ci->tailcalls=0;[m
[31m-ci->nresults=nresults;[m
[31m-for(st=L->top;st<ci->top;st++)[m
[31m-setnilvalue(st);[m
[31m-L->top=ci->top;[m
[31m-return 0;[m
[31m-}[m
[31m-else{[m
[31m-CallInfo*ci;[m
[31m-int n;[m
[31m-luaD_checkstack(L,20);[m
[31m-ci=inc_ci(L);[m
[31m-ci->func=restorestack(L,funcr);[m
[31m-L->base=ci->base=ci->func+1;[m
[31m-ci->top=L->top+20;[m
[31m-ci->nresults=nresults;[m
[31m-n=(*curr_func(L)->c.f)(L);[m
[31m-if(n<0)[m
[31m-return 2;[m
[31m-else{[m
[31m-luaD_poscall(L,L->top-n);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static int luaD_poscall(lua_State*L,StkId firstResult){[m
[31m-StkId res;[m
[31m-int wanted,i;[m
[31m-CallInfo*ci;[m
[31m-ci=L->ci--;[m
[31m-res=ci->func;[m
[31m-wanted=ci->nresults;[m
[31m-L->base=(ci-1)->base;[m
[31m-L->savedpc=(ci-1)->savedpc;[m
[31m-for(i=wanted;i!=0&&firstResult<L->top;i--)[m
[31m-setobj(L,res++,firstResult++);[m
[31m-while(i-->0)[m
[31m-setnilvalue(res++);[m
[31m-L->top=res;[m
[31m-return(wanted-(-1));[m
[31m-}[m
[31m-static void luaD_call(lua_State*L,StkId func,int nResults){[m
[31m-if(++L->nCcalls>=200){[m
[31m-if(L->nCcalls==200)[m
[31m-luaG_runerror(L,"C stack overflow");[m
[31m-else if(L->nCcalls>=(200+(200>>3)))[m
[31m-luaD_throw(L,5);[m
[31m-}[m
[31m-if(luaD_precall(L,func,nResults)==0)[m
[31m-luaV_execute(L,1);[m
[31m-L->nCcalls--;[m
[31m-luaC_checkGC(L);[m
[31m-}[m
[31m-static int luaD_pcall(lua_State*L,Pfunc func,void*u,[m
[31m-ptrdiff_t old_top,ptrdiff_t ef){[m
[31m-int status;[m
[31m-unsigned short oldnCcalls=L->nCcalls;[m
[31m-ptrdiff_t old_ci=saveci(L,L->ci);[m
[31m-lu_byte old_allowhooks=L->allowhook;[m
[31m-ptrdiff_t old_errfunc=L->errfunc;[m
[31m-L->errfunc=ef;[m
[31m-status=luaD_rawrunprotected(L,func,u);[m
[31m-if(status!=0){[m
[31m-StkId oldtop=restorestack(L,old_top);[m
[31m-luaF_close(L,oldtop);[m
[31m-luaD_seterrorobj(L,status,oldtop);[m
[31m-L->nCcalls=oldnCcalls;[m
[31m-L->ci=restoreci(L,old_ci);[m
[31m-L->base=L->ci->base;[m
[31m-L->savedpc=L->ci->savedpc;[m
[31m-L->allowhook=old_allowhooks;[m
[31m-restore_stack_limit(L);[m
[31m-}[m
[31m-L->errfunc=old_errfunc;[m
[31m-return status;[m
[31m-}[m
[31m-struct SParser{[m
[31m-ZIO*z;[m
[31m-Mbuffer buff;[m
[31m-const char*name;[m
[31m-};[m
[31m-static void f_parser(lua_State*L,void*ud){[m
[31m-int i;[m
[31m-Proto*tf;[m
[31m-Closure*cl;[m
[31m-struct SParser*p=cast(struct SParser*,ud);[m
[31m-luaC_checkGC(L);[m
[31m-tf=luaY_parser(L,p->z,[m
[31m-&p->buff,p->name);[m
[31m-cl=luaF_newLclosure(L,tf->nups,hvalue(gt(L)));[m
[31m-cl->l.p=tf;[m
[31m-for(i=0;i<tf->nups;i++)[m
[31m-cl->l.upvals[i]=luaF_newupval(L);[m
[31m-setclvalue(L,L->top,cl);[m
[31m-incr_top(L);[m
[31m-}[m
[31m-static int luaD_protectedparser(lua_State*L,ZIO*z,const char*name){[m
[31m-struct SParser p;[m
[31m-int status;[m
[31m-p.z=z;p.name=name;[m
[31m-luaZ_initbuffer(L,&p.buff);[m
[31m-status=luaD_pcall(L,f_parser,&p,savestack(L,L->top),L->errfunc);[m
[31m-luaZ_freebuffer(L,&p.buff);[m
[31m-return status;[m
[31m-}[m
[31m-static void luaS_resize(lua_State*L,int newsize){[m
[31m-GCObject**newhash;[m
[31m-stringtable*tb;[m
[31m-int i;[m
[31m-if(G(L)->gcstate==2)[m
[31m-return;[m
[31m-newhash=luaM_newvector(L,newsize,GCObject*);[m
[31m-tb=&G(L)->strt;[m
[31m-for(i=0;i<newsize;i++)newhash[i]=NULL;[m
[31m-for(i=0;i<tb->size;i++){[m
[31m-GCObject*p=tb->hash[i];[m
[31m-while(p){[m
[31m-GCObject*next=p->gch.next;[m
[31m-unsigned int h=gco2ts(p)->hash;[m
[31m-int h1=lmod(h,newsize);[m
[31m-p->gch.next=newhash[h1];[m
[31m-newhash[h1]=p;[m
[31m-p=next;[m
[31m-}[m
[31m-}[m
[31m-luaM_freearray(L,tb->hash,tb->size,TString*);[m
[31m-tb->size=newsize;[m
[31m-tb->hash=newhash;[m
[31m-}[m
[31m-static TString*newlstr(lua_State*L,const char*str,size_t l,[m
[31m-unsigned int h){[m
[31m-TString*ts;[m
[31m-stringtable*tb;[m
[31m-if(l+1>(((size_t)(~(size_t)0)-2)-sizeof(TString))/sizeof(char))[m
[31m-luaM_toobig(L);[m
[31m-ts=cast(TString*,luaM_malloc(L,(l+1)*sizeof(char)+sizeof(TString)));[m
[31m-ts->tsv.len=l;[m
[31m-ts->tsv.hash=h;[m
[31m-ts->tsv.marked=luaC_white(G(L));[m
[31m-ts->tsv.tt=4;[m
[31m-ts->tsv.reserved=0;[m
[31m-memcpy(ts+1,str,l*sizeof(char));[m
[31m-((char*)(ts+1))[l]='\0';[m
[31m-tb=&G(L)->strt;[m
[31m-h=lmod(h,tb->size);[m
[31m-ts->tsv.next=tb->hash[h];[m
[31m-tb->hash[h]=obj2gco(ts);[m
[31m-tb->nuse++;[m
[31m-if(tb->nuse>cast(lu_int32,tb->size)&&tb->size<=(INT_MAX-2)/2)[m
[31m-luaS_resize(L,tb->size*2);[m
[31m-return ts;[m
[31m-}[m
[31m-static TString*luaS_newlstr(lua_State*L,const char*str,size_t l){[m
[31m-GCObject*o;[m
[31m-unsigned int h=cast(unsigned int,l);[m
[31m-size_t step=(l>>5)+1;[m
[31m-size_t l1;[m
[31m-for(l1=l;l1>=step;l1-=step)[m
[31m-h=h^((h<<5)+(h>>2)+cast(unsigned char,str[l1-1]));[m
[31m-for(o=G(L)->strt.hash[lmod(h,G(L)->strt.size)];[m
[31m-o!=NULL;[m
[31m-o=o->gch.next){[m
[31m-TString*ts=rawgco2ts(o);[m
[31m-if(ts->tsv.len==l&&(memcmp(str,getstr(ts),l)==0)){[m
[31m-if(isdead(G(L),o))changewhite(o);[m
[31m-return ts;[m
[31m-}[m
[31m-}[m
[31m-return newlstr(L,str,l,h);[m
[31m-}[m
[31m-static Udata*luaS_newudata(lua_State*L,size_t s,Table*e){[m
[31m-Udata*u;[m
[31m-if(s>((size_t)(~(size_t)0)-2)-sizeof(Udata))[m
[31m-luaM_toobig(L);[m
[31m-u=cast(Udata*,luaM_malloc(L,s+sizeof(Udata)));[m
[31m-u->uv.marked=luaC_white(G(L));[m
[31m-u->uv.tt=7;[m
[31m-u->uv.len=s;[m
[31m-u->uv.metatable=NULL;[m
[31m-u->uv.env=e;[m
[31m-u->uv.next=G(L)->mainthread->next;[m
[31m-G(L)->mainthread->next=obj2gco(u);[m
[31m-return u;[m
[31m-}[m
[31m-#define hashpow2(t,n)(gnode(t,lmod((n),sizenode(t))))[m
[31m-#define hashstr(t,str)hashpow2(t,(str)->tsv.hash)[m
[31m-#define hashboolean(t,p)hashpow2(t,p)[m
[31m-#define hashmod(t,n)(gnode(t,((n)%((sizenode(t)-1)|1))))[m
[31m-#define hashpointer(t,p)hashmod(t,IntPoint(p))[m
[31m-static const Node dummynode_={[m
[31m-{{NULL},0},[m
[31m-{{{NULL},0,NULL}}[m
[31m-};[m
[31m-static Node*hashnum(const Table*t,lua_Number n){[m
[31m-unsigned int a[cast_int(sizeof(lua_Number)/sizeof(int))];[m
[31m-int i;[m
[31m-if(luai_numeq(n,0))[m
[31m-return gnode(t,0);[m
[31m-memcpy(a,&n,sizeof(a));[m
[31m-for(i=1;i<cast_int(sizeof(lua_Number)/sizeof(int));i++)a[0]+=a[i];[m
[31m-return hashmod(t,a[0]);[m
[31m-}[m
[31m-static Node*mainposition(const Table*t,const TValue*key){[m
[31m-switch(ttype(key)){[m
[31m-case 3:[m
[31m-return hashnum(t,nvalue(key));[m
[31m-case 4:[m
[31m-return hashstr(t,rawtsvalue(key));[m
[31m-case 1:[m
[31m-return hashboolean(t,bvalue(key));[m
[31m-case 2:[m
[31m-return hashpointer(t,pvalue(key));[m
[31m-default:[m
[31m-return hashpointer(t,gcvalue(key));[m
[31m-}[m
[31m-}[m
[31m-static int arrayindex(const TValue*key){[m
[31m-if(ttisnumber(key)){[m
[31m-lua_Number n=nvalue(key);[m
[31m-int k;[m
[31m-lua_number2int(k,n);[m
[31m-if(luai_numeq(cast_num(k),n))[m
[31m-return k;[m
[31m-}[m
[31m-return-1;[m
[31m-}[m
[31m-static int findindex(lua_State*L,Table*t,StkId key){[m
[31m-int i;[m
[31m-if(ttisnil(key))return-1;[m
[31m-i=arrayindex(key);[m
[31m-if(0<i&&i<=t->sizearray)[m
[31m-return i-1;[m
[31m-else{[m
[31m-Node*n=mainposition(t,key);[m
[31m-do{[m
[31m-if(luaO_rawequalObj(key2tval(n),key)||[m
[31m-(ttype(gkey(n))==(8+3)&&iscollectable(key)&&[m
[31m-gcvalue(gkey(n))==gcvalue(key))){[m
[31m-i=cast_int(n-gnode(t,0));[m
[31m-return i+t->sizearray;[m
[31m-}[m
[31m-else n=gnext(n);[m
[31m-}while(n);[m
[31m-luaG_runerror(L,"invalid key to "LUA_QL("next"));[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-static int luaH_next(lua_State*L,Table*t,StkId key){[m
[31m-int i=findindex(L,t,key);[m
[31m-for(i++;i<t->sizearray;i++){[m
[31m-if(!ttisnil(&t->array[i])){[m
[31m-setnvalue(key,cast_num(i+1));[m
[31m-setobj(L,key+1,&t->array[i]);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-for(i-=t->sizearray;i<(int)sizenode(t);i++){[m
[31m-if(!ttisnil(gval(gnode(t,i)))){[m
[31m-setobj(L,key,key2tval(gnode(t,i)));[m
[31m-setobj(L,key+1,gval(gnode(t,i)));[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-return 0;[m
[31m-}[m
[31m-static int computesizes(int nums[],int*narray){[m
[31m-int i;[m
[31m-int twotoi;[m
[31m-int a=0;[m
[31m-int na=0;[m
[31m-int n=0;[m
[31m-for(i=0,twotoi=1;twotoi/2<*narray;i++,twotoi*=2){[m
[31m-if(nums[i]>0){[m
[31m-a+=nums[i];[m
[31m-if(a>twotoi/2){[m
[31m-n=twotoi;[m
[31m-na=a;[m
[31m-}[m
[31m-}[m
[31m-if(a==*narray)break;[m
[31m-}[m
[31m-*narray=n;[m
[31m-return na;[m
[31m-}[m
[31m-static int countint(const TValue*key,int*nums){[m
[31m-int k=arrayindex(key);[m
[31m-if(0<k&&k<=(1<<(32-2))){[m
[31m-nums[ceillog2(k)]++;[m
[31m-return 1;[m
[31m-}[m
[31m-else[m
[31m-return 0;[m
[31m-}[m
[31m-static int numusearray(const Table*t,int*nums){[m
[31m-int lg;[m
[31m-int ttlg;[m
[31m-int ause=0;[m
[31m-int i=1;[m
[31m-for(lg=0,ttlg=1;lg<=(32-2);lg++,ttlg*=2){[m
[31m-int lc=0;[m
[31m-int lim=ttlg;[m
[31m-if(lim>t->sizearray){[m
[31m-lim=t->sizearray;[m
[31m-if(i>lim)[m
[31m-break;[m
[31m-}[m
[31m-for(;i<=lim;i++){[m
[31m-if(!ttisnil(&t->array[i-1]))[m
[31m-lc++;[m
[31m-}[m
[31m-nums[lg]+=lc;[m
[31m-ause+=lc;[m
[31m-}[m
[31m-return ause;[m
[31m-}[m
[31m-static int numusehash(const Table*t,int*nums,int*pnasize){[m
[31m-int totaluse=0;[m
[31m-int ause=0;[m
[31m-int i=sizenode(t);[m
[31m-while(i--){[m
[31m-Node*n=&t->node[i];[m
[31m-if(!ttisnil(gval(n))){[m
[31m-ause+=countint(key2tval(n),nums);[m
[31m-totaluse++;[m
[31m-}[m
[31m-}[m
[31m-*pnasize+=ause;[m
[31m-return totaluse;[m
[31m-}[m
[31m-static void setarrayvector(lua_State*L,Table*t,int size){[m
[31m-int i;[m
[31m-luaM_reallocvector(L,t->array,t->sizearray,size,TValue);[m
[31m-for(i=t->sizearray;i<size;i++)[m
[31m-setnilvalue(&t->array[i]);[m
[31m-t->sizearray=size;[m
[31m-}[m
[31m-static void setnodevector(lua_State*L,Table*t,int size){[m
[31m-int lsize;[m
[31m-if(size==0){[m
[31m-t->node=cast(Node*,(&dummynode_));[m
[31m-lsize=0;[m
[31m-}[m
[31m-else{[m
[31m-int i;[m
[31m-lsize=ceillog2(size);[m
[31m-if(lsize>(32-2))[m
[31m-luaG_runerror(L,"table overflow");[m
[31m-size=twoto(lsize);[m
[31m-t->node=luaM_newvector(L,size,Node);[m
[31m-for(i=0;i<size;i++){[m
[31m-Node*n=gnode(t,i);[m
[31m-gnext(n)=NULL;[m
[31m-setnilvalue(gkey(n));[m
[31m-setnilvalue(gval(n));[m
[31m-}[m
[31m-}[m
[31m-t->lsizenode=cast_byte(lsize);[m
[31m-t->lastfree=gnode(t,size);[m
[31m-}[m
[31m-static void resize(lua_State*L,Table*t,int nasize,int nhsize){[m
[31m-int i;[m
[31m-int oldasize=t->sizearray;[m
[31m-int oldhsize=t->lsizenode;[m
[31m-Node*nold=t->node;[m
[31m-if(nasize>oldasize)[m
[31m-setarrayvector(L,t,nasize);[m
[31m-setnodevector(L,t,nhsize);[m
[31m-if(nasize<oldasize){[m
[31m-t->sizearray=nasize;[m
[31m-for(i=nasize;i<oldasize;i++){[m
[31m-if(!ttisnil(&t->array[i]))[m
[31m-setobj(L,luaH_setnum(L,t,i+1),&t->array[i]);[m
[31m-}[m
[31m-luaM_reallocvector(L,t->array,oldasize,nasize,TValue);[m
[31m-}[m
[31m-for(i=twoto(oldhsize)-1;i>=0;i--){[m
[31m-Node*old=nold+i;[m
[31m-if(!ttisnil(gval(old)))[m
[31m-setobj(L,luaH_set(L,t,key2tval(old)),gval(old));[m
[31m-}[m
[31m-if(nold!=(&dummynode_))[m
[31m-luaM_freearray(L,nold,twoto(oldhsize),Node);[m
[31m-}[m
[31m-static void luaH_resizearray(lua_State*L,Table*t,int nasize){[m
[31m-int nsize=(t->node==(&dummynode_))?0:sizenode(t);[m
[31m-resize(L,t,nasize,nsize);[m
[31m-}[m
[31m-static void rehash(lua_State*L,Table*t,const TValue*ek){[m
[31m-int nasize,na;[m
[31m-int nums[(32-2)+1];[m
[31m-int i;[m
[31m-int totaluse;[m
[31m-for(i=0;i<=(32-2);i++)nums[i]=0;[m
[31m-nasize=numusearray(t,nums);[m
[31m-totaluse=nasize;[m
[31m-totaluse+=numusehash(t,nums,&nasize);[m
[31m-nasize+=countint(ek,nums);[m
[31m-totaluse++;[m
[31m-na=computesizes(nums,&nasize);[m
[31m-resize(L,t,nasize,totaluse-na);[m
[31m-}[m
[31m-static Table*luaH_new(lua_State*L,int narray,int nhash){[m
[31m-Table*t=luaM_new(L,Table);[m
[31m-luaC_link(L,obj2gco(t),5);[m
[31m-t->metatable=NULL;[m
[31m-t->flags=cast_byte(~0);[m
[31m-t->array=NULL;[m
[31m-t->sizearray=0;[m
[31m-t->lsizenode=0;[m
[31m-t->node=cast(Node*,(&dummynode_));[m
[31m-setarrayvector(L,t,narray);[m
[31m-setnodevector(L,t,nhash);[m
[31m-return t;[m
[31m-}[m
[31m-static void luaH_free(lua_State*L,Table*t){[m
[31m-if(t->node!=(&dummynode_))[m
[31m-luaM_freearray(L,t->node,sizenode(t),Node);[m
[31m-luaM_freearray(L,t->array,t->sizearray,TValue);[m
[31m-luaM_free(L,t);[m
[31m-}[m
[31m-static Node*getfreepos(Table*t){[m
[31m-while(t->lastfree-->t->node){[m
[31m-if(ttisnil(gkey(t->lastfree)))[m
[31m-return t->lastfree;[m
[31m-}[m
[31m-return NULL;[m
[31m-}[m
[31m-static TValue*newkey(lua_State*L,Table*t,const TValue*key){[m
[31m-Node*mp=mainposition(t,key);[m
[31m-if(!ttisnil(gval(mp))||mp==(&dummynode_)){[m
[31m-Node*othern;[m
[31m-Node*n=getfreepos(t);[m
[31m-if(n==NULL){[m
[31m-rehash(L,t,key);[m
[31m-return luaH_set(L,t,key);[m
[31m-}[m
[31m-othern=mainposition(t,key2tval(mp));[m
[31m-if(othern!=mp){[m
[31m-while(gnext(othern)!=mp)othern=gnext(othern);[m
[31m-gnext(othern)=n;[m
[31m-*n=*mp;[m
[31m-gnext(mp)=NULL;[m
[31m-setnilvalue(gval(mp));[m
[31m-}[m
[31m-else{[m
[31m-gnext(n)=gnext(mp);[m
[31m-gnext(mp)=n;[m
[31m-mp=n;[m
[31m-}[m
[31m-}[m
[31m-gkey(mp)->value=key->value;gkey(mp)->tt=key->tt;[m
[31m-luaC_barriert(L,t,key);[m
[31m-return gval(mp);[m
[31m-}[m
[31m-static const TValue*luaH_getnum(Table*t,int key){[m
[31m-if(cast(unsigned int,key)-1<cast(unsigned int,t->sizearray))[m
[31m-return&t->array[key-1];[m
[31m-else{[m
[31m-lua_Number nk=cast_num(key);[m
[31m-Node*n=hashnum(t,nk);[m
[31m-do{[m
[31m-if(ttisnumber(gkey(n))&&luai_numeq(nvalue(gkey(n)),nk))[m
[31m-return gval(n);[m
[31m-else n=gnext(n);[m
[31m-}while(n);[m
[31m-return(&luaO_nilobject_);[m
[31m-}[m
[31m-}[m
[31m-static const TValue*luaH_getstr(Table*t,TString*key){[m
[31m-Node*n=hashstr(t,key);[m
[31m-do{[m
[31m-if(ttisstring(gkey(n))&&rawtsvalue(gkey(n))==key)[m
[31m-return gval(n);[m
[31m-else n=gnext(n);[m
[31m-}while(n);[m
[31m-return(&luaO_nilobject_);[m
[31m-}[m
[31m-static const TValue*luaH_get(Table*t,const TValue*key){[m
[31m-switch(ttype(key)){[m
[31m-case 0:return(&luaO_nilobject_);[m
[31m-case 4:return luaH_getstr(t,rawtsvalue(key));[m
[31m-case 3:{[m
[31m-int k;[m
[31m-lua_Number n=nvalue(key);[m
[31m-lua_number2int(k,n);[m
[31m-if(luai_numeq(cast_num(k),nvalue(key)))[m
[31m-return luaH_getnum(t,k);[m
[31m-}[m
[31m-default:{[m
[31m-Node*n=mainposition(t,key);[m
[31m-do{[m
[31m-if(luaO_rawequalObj(key2tval(n),key))[m
[31m-return gval(n);[m
[31m-else n=gnext(n);[m
[31m-}while(n);[m
[31m-return(&luaO_nilobject_);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static TValue*luaH_set(lua_State*L,Table*t,const TValue*key){[m
[31m-const TValue*p=luaH_get(t,key);[m
[31m-t->flags=0;[m
[31m-if(p!=(&luaO_nilobject_))[m
[31m-return cast(TValue*,p);[m
[31m-else{[m
[31m-if(ttisnil(key))luaG_runerror(L,"table index is nil");[m
[31m-else if(ttisnumber(key)&&luai_numisnan(nvalue(key)))[m
[31m-luaG_runerror(L,"table index is NaN");[m
[31m-return newkey(L,t,key);[m
[31m-}[m
[31m-}[m
[31m-static TValue*luaH_setnum(lua_State*L,Table*t,int key){[m
[31m-const TValue*p=luaH_getnum(t,key);[m
[31m-if(p!=(&luaO_nilobject_))[m
[31m-return cast(TValue*,p);[m
[31m-else{[m
[31m-TValue k;[m
[31m-setnvalue(&k,cast_num(key));[m
[31m-return newkey(L,t,&k);[m
[31m-}[m
[31m-}[m
[31m-static TValue*luaH_setstr(lua_State*L,Table*t,TString*key){[m
[31m-const TValue*p=luaH_getstr(t,key);[m
[31m-if(p!=(&luaO_nilobject_))[m
[31m-return cast(TValue*,p);[m
[31m-else{[m
[31m-TValue k;[m
[31m-setsvalue(L,&k,key);[m
[31m-return newkey(L,t,&k);[m
[31m-}[m
[31m-}[m
[31m-static int unbound_search(Table*t,unsigned int j){[m
[31m-unsigned int i=j;[m
[31m-j++;[m
[31m-while(!ttisnil(luaH_getnum(t,j))){[m
[31m-i=j;[m
[31m-j*=2;[m
[31m-if(j>cast(unsigned int,(INT_MAX-2))){[m
[31m-i=1;[m
[31m-while(!ttisnil(luaH_getnum(t,i)))i++;[m
[31m-return i-1;[m
[31m-}[m
[31m-}[m
[31m-while(j-i>1){[m
[31m-unsigned int m=(i+j)/2;[m
[31m-if(ttisnil(luaH_getnum(t,m)))j=m;[m
[31m-else i=m;[m
[31m-}[m
[31m-return i;[m
[31m-}[m
[31m-static int luaH_getn(Table*t){[m
[31m-unsigned int j=t->sizearray;[m
[31m-if(j>0&&ttisnil(&t->array[j-1])){[m
[31m-unsigned int i=0;[m
[31m-while(j-i>1){[m
[31m-unsigned int m=(i+j)/2;[m
[31m-if(ttisnil(&t->array[m-1]))j=m;[m
[31m-else i=m;[m
[31m-}[m
[31m-return i;[m
[31m-}[m
[31m-else if(t->node==(&dummynode_))[m
[31m-return j;[m
[31m-else return unbound_search(t,j);[m
[31m-}[m
[31m-#define makewhite(g,x)((x)->gch.marked=cast_byte(((x)->gch.marked&cast_byte(~(bitmask(2)|bit2mask(0,1))))|luaC_white(g)))[m
[31m-#define white2gray(x)reset2bits((x)->gch.marked,0,1)[m
[31m-#define black2gray(x)resetbit((x)->gch.marked,2)[m
[31m-#define stringmark(s)reset2bits((s)->tsv.marked,0,1)[m
[31m-#define isfinalized(u)testbit((u)->marked,3)[m
[31m-#define markfinalized(u)l_setbit((u)->marked,3)[m
[31m-#define markvalue(g,o){checkconsistency(o);if(iscollectable(o)&&iswhite(gcvalue(o)))reallymarkobject(g,gcvalue(o));}[m
[31m-#define markobject(g,t){if(iswhite(obj2gco(t)))reallymarkobject(g,obj2gco(t));}[m
[31m-#define setthreshold(g)(g->GCthreshold=(g->estimate/100)*g->gcpause)[m
[31m-static void removeentry(Node*n){[m
[31m-if(iscollectable(gkey(n)))[m
[31m-setttype(gkey(n),(8+3));[m
[31m-}[m
[31m-static void reallymarkobject(global_State*g,GCObject*o){[m
[31m-white2gray(o);[m
[31m-switch(o->gch.tt){[m
[31m-case 4:{[m
[31m-return;[m
[31m-}[m
[31m-case 7:{[m
[31m-Table*mt=gco2u(o)->metatable;[m
[31m-gray2black(o);[m
[31m-if(mt)markobject(g,mt);[m
[31m-markobject(g,gco2u(o)->env);[m
[31m-return;[m
[31m-}[m
[31m-case(8+2):{[m
[31m-UpVal*uv=gco2uv(o);[m
[31m-markvalue(g,uv->v);[m
[31m-if(uv->v==&uv->u.value)[m
[31m-gray2black(o);[m
[31m-return;[m
[31m-}[m
[31m-case 6:{[m
[31m-gco2cl(o)->c.gclist=g->gray;[m
[31m-g->gray=o;[m
[31m-break;[m
[31m-}[m
[31m-case 5:{[m
[31m-gco2h(o)->gclist=g->gray;[m
[31m-g->gray=o;[m
[31m-break;[m
[31m-}[m
[31m-case 8:{[m
[31m-gco2th(o)->gclist=g->gray;[m
[31m-g->gray=o;[m
[31m-break;[m
[31m-}[m
[31m-case(8+1):{[m
[31m-gco2p(o)->gclist=g->gray;[m
[31m-g->gray=o;[m
[31m-break;[m
[31m-}[m
[31m-default:;[m
[31m-}[m
[31m-}[m
[31m-static void marktmu(global_State*g){[m
[31m-GCObject*u=g->tmudata;[m
[31m-if(u){[m
[31m-do{[m
[31m-u=u->gch.next;[m
[31m-makewhite(g,u);[m
[31m-reallymarkobject(g,u);[m
[31m-}while(u!=g->tmudata);[m
[31m-}[m
[31m-}[m
[31m-static size_t luaC_separateudata(lua_State*L,int all){[m
[31m-global_State*g=G(L);[m
[31m-size_t deadmem=0;[m
[31m-GCObject**p=&g->mainthread->next;[m
[31m-GCObject*curr;[m
[31m-while((curr=*p)!=NULL){[m
[31m-if(!(iswhite(curr)||all)||isfinalized(gco2u(curr)))[m
[31m-p=&curr->gch.next;[m
[31m-else if(fasttm(L,gco2u(curr)->metatable,TM_GC)==NULL){[m
[31m-markfinalized(gco2u(curr));[m
[31m-p=&curr->gch.next;[m
[31m-}[m
[31m-else{[m
[31m-deadmem+=sizeudata(gco2u(curr));[m
[31m-markfinalized(gco2u(curr));[m
[31m-*p=curr->gch.next;[m
[31m-if(g->tmudata==NULL)[m
[31m-g->tmudata=curr->gch.next=curr;[m
[31m-else{[m
[31m-curr->gch.next=g->tmudata->gch.next;[m
[31m-g->tmudata->gch.next=curr;[m
[31m-g->tmudata=curr;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-return deadmem;[m
[31m-}[m
[31m-static int traversetable(global_State*g,Table*h){[m
[31m-int i;[m
[31m-int weakkey=0;[m
[31m-int weakvalue=0;[m
[31m-const TValue*mode;[m
[31m-if(h->metatable)[m
[31m-markobject(g,h->metatable);[m
[31m-mode=gfasttm(g,h->metatable,TM_MODE);[m
[31m-if(mode&&ttisstring(mode)){[m
[31m-weakkey=(strchr(svalue(mode),'k')!=NULL);[m
[31m-weakvalue=(strchr(svalue(mode),'v')!=NULL);[m
[31m-if(weakkey||weakvalue){[m
[31m-h->marked&=~(bitmask(3)|bitmask(4));[m
[31m-h->marked|=cast_byte((weakkey<<3)|[m
[31m-(weakvalue<<4));[m
[31m-h->gclist=g->weak;[m
[31m-g->weak=obj2gco(h);[m
[31m-}[m
[31m-}[m
[31m-if(weakkey&&weakvalue)return 1;[m
[31m-if(!weakvalue){[m
[31m-i=h->sizearray;[m
[31m-while(i--)[m
[31m-markvalue(g,&h->array[i]);[m
[31m-}[m
[31m-i=sizenode(h);[m
[31m-while(i--){[m
[31m-Node*n=gnode(h,i);[m
[31m-if(ttisnil(gval(n)))[m
[31m-removeentry(n);[m
[31m-else{[m
[31m-if(!weakkey)markvalue(g,gkey(n));[m
[31m-if(!weakvalue)markvalue(g,gval(n));[m
[31m-}[m
[31m-}[m
[31m-return weakkey||weakvalue;[m
[31m-}[m
[31m-static void traverseproto(global_State*g,Proto*f){[m
[31m-int i;[m
[31m-if(f->source)stringmark(f->source);[m
[31m-for(i=0;i<f->sizek;i++)[m
[31m-markvalue(g,&f->k[i]);[m
[31m-for(i=0;i<f->sizeupvalues;i++){[m
[31m-if(f->upvalues[i])[m
[31m-stringmark(f->upvalues[i]);[m
[31m-}[m
[31m-for(i=0;i<f->sizep;i++){[m
[31m-if(f->p[i])[m
[31m-markobject(g,f->p[i]);[m
[31m-}[m
[31m-for(i=0;i<f->sizelocvars;i++){[m
[31m-if(f->locvars[i].varname)[m
[31m-stringmark(f->locvars[i].varname);[m
[31m-}[m
[31m-}[m
[31m-static void traverseclosure(global_State*g,Closure*cl){[m
[31m-markobject(g,cl->c.env);[m
[31m-if(cl->c.isC){[m
[31m-int i;[m
[31m-for(i=0;i<cl->c.nupvalues;i++)[m
[31m-markvalue(g,&cl->c.upvalue[i]);[m
[31m-}[m
[31m-else{[m
[31m-int i;[m
[31m-markobject(g,cl->l.p);[m
[31m-for(i=0;i<cl->l.nupvalues;i++)[m
[31m-markobject(g,cl->l.upvals[i]);[m
[31m-}[m
[31m-}[m
[31m-static void checkstacksizes(lua_State*L,StkId max){[m
[31m-int ci_used=cast_int(L->ci-L->base_ci);[m
[31m-int s_used=cast_int(max-L->stack);[m
[31m-if(L->size_ci>20000)[m
[31m-return;[m
[31m-if(4*ci_used<L->size_ci&&2*8<L->size_ci)[m
[31m-luaD_reallocCI(L,L->size_ci/2);[m
[31m-condhardstacktests(luaD_reallocCI(L,ci_used+1));[m
[31m-if(4*s_used<L->stacksize&&[m
[31m-2*((2*20)+5)<L->stacksize)[m
[31m-luaD_reallocstack(L,L->stacksize/2);[m
[31m-condhardstacktests(luaD_reallocstack(L,s_used));[m
[31m-}[m
[31m-static void traversestack(global_State*g,lua_State*l){[m
[31m-StkId o,lim;[m
[31m-CallInfo*ci;[m
[31m-markvalue(g,gt(l));[m
[31m-lim=l->top;[m
[31m-for(ci=l->base_ci;ci<=l->ci;ci++){[m
[31m-if(lim<ci->top)lim=ci->top;[m
[31m-}[m
[31m-for(o=l->stack;o<l->top;o++)[m
[31m-markvalue(g,o);[m
[31m-for(;o<=lim;o++)[m
[31m-setnilvalue(o);[m
[31m-checkstacksizes(l,lim);[m
[31m-}[m
[31m-static l_mem propagatemark(global_State*g){[m
[31m-GCObject*o=g->gray;[m
[31m-gray2black(o);[m
[31m-switch(o->gch.tt){[m
[31m-case 5:{[m
[31m-Table*h=gco2h(o);[m
[31m-g->gray=h->gclist;[m
[31m-if(traversetable(g,h))[m
[31m-black2gray(o);[m
[31m-return sizeof(Table)+sizeof(TValue)*h->sizearray+[m
[31m-sizeof(Node)*sizenode(h);[m
[31m-}[m
[31m-case 6:{[m
[31m-Closure*cl=gco2cl(o);[m
[31m-g->gray=cl->c.gclist;[m
[31m-traverseclosure(g,cl);[m
[31m-return(cl->c.isC)?sizeCclosure(cl->c.nupvalues):[m
[31m-sizeLclosure(cl->l.nupvalues);[m
[31m-}[m
[31m-case 8:{[m
[31m-lua_State*th=gco2th(o);[m
[31m-g->gray=th->gclist;[m
[31m-th->gclist=g->grayagain;[m
[31m-g->grayagain=o;[m
[31m-black2gray(o);[m
[31m-traversestack(g,th);[m
[31m-return sizeof(lua_State)+sizeof(TValue)*th->stacksize+[m
[31m-sizeof(CallInfo)*th->size_ci;[m
[31m-}[m
[31m-case(8+1):{[m
[31m-Proto*p=gco2p(o);[m
[31m-g->gray=p->gclist;[m
[31m-traverseproto(g,p);[m
[31m-return sizeof(Proto)+sizeof(Instruction)*p->sizecode+[m
[31m-sizeof(Proto*)*p->sizep+[m
[31m-sizeof(TValue)*p->sizek+[m
[31m-sizeof(int)*p->sizelineinfo+[m
[31m-sizeof(LocVar)*p->sizelocvars+[m
[31m-sizeof(TString*)*p->sizeupvalues;[m
[31m-}[m
[31m-default:return 0;[m
[31m-}[m
[31m-}[m
[31m-static size_t propagateall(global_State*g){[m
[31m-size_t m=0;[m
[31m-while(g->gray)m+=propagatemark(g);[m
[31m-return m;[m
[31m-}[m
[31m-static int iscleared(const TValue*o,int iskey){[m
[31m-if(!iscollectable(o))return 0;[m
[31m-if(ttisstring(o)){[m
[31m-stringmark(rawtsvalue(o));[m
[31m-return 0;[m
[31m-}[m
[31m-return iswhite(gcvalue(o))||[m
[31m-(ttisuserdata(o)&&(!iskey&&isfinalized(uvalue(o))));[m
[31m-}[m
[31m-static void cleartable(GCObject*l){[m
[31m-while(l){[m
[31m-Table*h=gco2h(l);[m
[31m-int i=h->sizearray;[m
[31m-if(testbit(h->marked,4)){[m
[31m-while(i--){[m
[31m-TValue*o=&h->array[i];[m
[31m-if(iscleared(o,0))[m
[31m-setnilvalue(o);[m
[31m-}[m
[31m-}[m
[31m-i=sizenode(h);[m
[31m-while(i--){[m
[31m-Node*n=gnode(h,i);[m
[31m-if(!ttisnil(gval(n))&&[m
[31m-(iscleared(key2tval(n),1)||iscleared(gval(n),0))){[m
[31m-setnilvalue(gval(n));[m
[31m-removeentry(n);[m
[31m-}[m
[31m-}[m
[31m-l=h->gclist;[m
[31m-}[m
[31m-}[m
[31m-static void freeobj(lua_State*L,GCObject*o){[m
[31m-switch(o->gch.tt){[m
[31m-case(8+1):luaF_freeproto(L,gco2p(o));break;[m
[31m-case 6:luaF_freeclosure(L,gco2cl(o));break;[m
[31m-case(8+2):luaF_freeupval(L,gco2uv(o));break;[m
[31m-case 5:luaH_free(L,gco2h(o));break;[m
[31m-case 8:{[m
[31m-luaE_freethread(L,gco2th(o));[m
[31m-break;[m
[31m-}[m
[31m-case 4:{[m
[31m-G(L)->strt.nuse--;[m
[31m-luaM_freemem(L,o,sizestring(gco2ts(o)));[m
[31m-break;[m
[31m-}[m
[31m-case 7:{[m
[31m-luaM_freemem(L,o,sizeudata(gco2u(o)));[m
[31m-break;[m
[31m-}[m
[31m-default:;[m
[31m-}[m
[31m-}[m
[31m-#define sweepwholelist(L,p)sweeplist(L,p,((lu_mem)(~(lu_mem)0)-2))[m
[31m-static GCObject**sweeplist(lua_State*L,GCObject**p,lu_mem count){[m
[31m-GCObject*curr;[m
[31m-global_State*g=G(L);[m
[31m-int deadmask=otherwhite(g);[m
[31m-while((curr=*p)!=NULL&&count-->0){[m
[31m-if(curr->gch.tt==8)[m
[31m-sweepwholelist(L,&gco2th(curr)->openupval);[m
[31m-if((curr->gch.marked^bit2mask(0,1))&deadmask){[m
[31m-makewhite(g,curr);[m
[31m-p=&curr->gch.next;[m
[31m-}[m
[31m-else{[m
[31m-*p=curr->gch.next;[m
[31m-if(curr==g->rootgc)[m
[31m-g->rootgc=curr->gch.next;[m
[31m-freeobj(L,curr);[m
[31m-}[m
[31m-}[m
[31m-return p;[m
[31m-}[m
[31m-static void checkSizes(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-if(g->strt.nuse<cast(lu_int32,g->strt.size/4)&&[m
[31m-g->strt.size>32*2)[m
[31m-luaS_resize(L,g->strt.size/2);[m
[31m-if(luaZ_sizebuffer(&g->buff)>32*2){[m
[31m-size_t newsize=luaZ_sizebuffer(&g->buff)/2;[m
[31m-luaZ_resizebuffer(L,&g->buff,newsize);[m
[31m-}[m
[31m-}[m
[31m-static void GCTM(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-GCObject*o=g->tmudata->gch.next;[m
[31m-Udata*udata=rawgco2u(o);[m
[31m-const TValue*tm;[m
[31m-if(o==g->tmudata)[m
[31m-g->tmudata=NULL;[m
[31m-else[m
[31m-g->tmudata->gch.next=udata->uv.next;[m
[31m-udata->uv.next=g->mainthread->next;[m
[31m-g->mainthread->next=o;[m
[31m-makewhite(g,o);[m
[31m-tm=fasttm(L,udata->uv.metatable,TM_GC);[m
[31m-if(tm!=NULL){[m
[31m-lu_byte oldah=L->allowhook;[m
[31m-lu_mem oldt=g->GCthreshold;[m
[31m-L->allowhook=0;[m
[31m-g->GCthreshold=2*g->totalbytes;[m
[31m-setobj(L,L->top,tm);[m
[31m-setuvalue(L,L->top+1,udata);[m
[31m-L->top+=2;[m
[31m-luaD_call(L,L->top-2,0);[m
[31m-L->allowhook=oldah;[m
[31m-g->GCthreshold=oldt;[m
[31m-}[m
[31m-}[m
[31m-static void luaC_callGCTM(lua_State*L){[m
[31m-while(G(L)->tmudata)[m
[31m-GCTM(L);[m
[31m-}[m
[31m-static void luaC_freeall(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-int i;[m
[31m-g->currentwhite=bit2mask(0,1)|bitmask(6);[m
[31m-sweepwholelist(L,&g->rootgc);[m
[31m-for(i=0;i<g->strt.size;i++)[m
[31m-sweepwholelist(L,&g->strt.hash[i]);[m
[31m-}[m
[31m-static void markmt(global_State*g){[m
[31m-int i;[m
[31m-for(i=0;i<(8+1);i++)[m
[31m-if(g->mt[i])markobject(g,g->mt[i]);[m
[31m-}[m
[31m-static void markroot(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-g->gray=NULL;[m
[31m-g->grayagain=NULL;[m
[31m-g->weak=NULL;[m
[31m-markobject(g,g->mainthread);[m
[31m-markvalue(g,gt(g->mainthread));[m
[31m-markvalue(g,registry(L));[m
[31m-markmt(g);[m
[31m-g->gcstate=1;[m
[31m-}[m
[31m-static void remarkupvals(global_State*g){[m
[31m-UpVal*uv;[m
[31m-for(uv=g->uvhead.u.l.next;uv!=&g->uvhead;uv=uv->u.l.next){[m
[31m-if(isgray(obj2gco(uv)))[m
[31m-markvalue(g,uv->v);[m
[31m-}[m
[31m-}[m
[31m-static void atomic(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-size_t udsize;[m
[31m-remarkupvals(g);[m
[31m-propagateall(g);[m
[31m-g->gray=g->weak;[m
[31m-g->weak=NULL;[m
[31m-markobject(g,L);[m
[31m-markmt(g);[m
[31m-propagateall(g);[m
[31m-g->gray=g->grayagain;[m
[31m-g->grayagain=NULL;[m
[31m-propagateall(g);[m
[31m-udsize=luaC_separateudata(L,0);[m
[31m-marktmu(g);[m
[31m-udsize+=propagateall(g);[m
[31m-cleartable(g->weak);[m
[31m-g->currentwhite=cast_byte(otherwhite(g));[m
[31m-g->sweepstrgc=0;[m
[31m-g->sweepgc=&g->rootgc;[m
[31m-g->gcstate=2;[m
[31m-g->estimate=g->totalbytes-udsize;[m
[31m-}[m
[31m-static l_mem singlestep(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-switch(g->gcstate){[m
[31m-case 0:{[m
[31m-markroot(L);[m
[31m-return 0;[m
[31m-}[m
[31m-case 1:{[m
[31m-if(g->gray)[m
[31m-return propagatemark(g);[m
[31m-else{[m
[31m-atomic(L);[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-case 2:{[m
[31m-lu_mem old=g->totalbytes;[m
[31m-sweepwholelist(L,&g->strt.hash[g->sweepstrgc++]);[m
[31m-if(g->sweepstrgc>=g->strt.size)[m
[31m-g->gcstate=3;[m
[31m-g->estimate-=old-g->totalbytes;[m
[31m-return 10;[m
[31m-}[m
[31m-case 3:{[m
[31m-lu_mem old=g->totalbytes;[m
[31m-g->sweepgc=sweeplist(L,g->sweepgc,40);[m
[31m-if(*g->sweepgc==NULL){[m
[31m-checkSizes(L);[m
[31m-g->gcstate=4;[m
[31m-}[m
[31m-g->estimate-=old-g->totalbytes;[m
[31m-return 40*10;[m
[31m-}[m
[31m-case 4:{[m
[31m-if(g->tmudata){[m
[31m-GCTM(L);[m
[31m-if(g->estimate>100)[m
[31m-g->estimate-=100;[m
[31m-return 100;[m
[31m-}[m
[31m-else{[m
[31m-g->gcstate=0;[m
[31m-g->gcdept=0;[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-default:return 0;[m
[31m-}[m
[31m-}[m
[31m-static void luaC_step(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-l_mem lim=(1024u/100)*g->gcstepmul;[m
[31m-if(lim==0)[m
[31m-lim=(((lu_mem)(~(lu_mem)0)-2)-1)/2;[m
[31m-g->gcdept+=g->totalbytes-g->GCthreshold;[m
[31m-do{[m
[31m-lim-=singlestep(L);[m
[31m-if(g->gcstate==0)[m
[31m-break;[m
[31m-}while(lim>0);[m
[31m-if(g->gcstate!=0){[m
[31m-if(g->gcdept<1024u)[m
[31m-g->GCthreshold=g->totalbytes+1024u;[m
[31m-else{[m
[31m-g->gcdept-=1024u;[m
[31m-g->GCthreshold=g->totalbytes;[m
[31m-}[m
[31m-}[m
[31m-else{[m
[31m-setthreshold(g);[m
[31m-}[m
[31m-}[m
[31m-static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v){[m
[31m-global_State*g=G(L);[m
[31m-if(g->gcstate==1)[m
[31m-reallymarkobject(g,v);[m
[31m-else[m
[31m-makewhite(g,o);[m
[31m-}[m
[31m-static void luaC_barrierback(lua_State*L,Table*t){[m
[31m-global_State*g=G(L);[m
[31m-GCObject*o=obj2gco(t);[m
[31m-black2gray(o);[m
[31m-t->gclist=g->grayagain;[m
[31m-g->grayagain=o;[m
[31m-}[m
[31m-static void luaC_link(lua_State*L,GCObject*o,lu_byte tt){[m
[31m-global_State*g=G(L);[m
[31m-o->gch.next=g->rootgc;[m
[31m-g->rootgc=o;[m
[31m-o->gch.marked=luaC_white(g);[m
[31m-o->gch.tt=tt;[m
[31m-}[m
[31m-static void luaC_linkupval(lua_State*L,UpVal*uv){[m
[31m-global_State*g=G(L);[m
[31m-GCObject*o=obj2gco(uv);[m
[31m-o->gch.next=g->rootgc;[m
[31m-g->rootgc=o;[m
[31m-if(isgray(o)){[m
[31m-if(g->gcstate==1){[m
[31m-gray2black(o);[m
[31m-luaC_barrier(L,uv,uv->v);[m
[31m-}[m
[31m-else{[m
[31m-makewhite(g,o);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-typedef union{[m
[31m-lua_Number r;[m
[31m-TString*ts;[m
[31m-}SemInfo;[m
[31m-typedef struct Token{[m
[31m-int token;[m
[31m-SemInfo seminfo;[m
[31m-}Token;[m
[31m-typedef struct LexState{[m
[31m-int current;[m
[31m-int linenumber;[m
[31m-int lastline;[m
[31m-Token t;[m
[31m-Token lookahead;[m
[31m-struct FuncState*fs;[m
[31m-struct lua_State*L;[m
[31m-ZIO*z;[m
[31m-Mbuffer*buff;[m
[31m-TString*source;[m
[31m-char decpoint;[m
[31m-}LexState;[m
[31m-static void luaX_init(lua_State*L);[m
[31m-static void luaX_lexerror(LexState*ls,const char*msg,int token);[m
[31m-#define state_size(x)(sizeof(x)+0)[m
[31m-#define fromstate(l)(cast(lu_byte*,(l))-0)[m
[31m-#define tostate(l)(cast(lua_State*,cast(lu_byte*,l)+0))[m
[31m-typedef struct LG{[m
[31m-lua_State l;[m
[31m-global_State g;[m
[31m-}LG;[m
[31m-static void stack_init(lua_State*L1,lua_State*L){[m
[31m-L1->base_ci=luaM_newvector(L,8,CallInfo);[m
[31m-L1->ci=L1->base_ci;[m
[31m-L1->size_ci=8;[m
[31m-L1->end_ci=L1->base_ci+L1->size_ci-1;[m
[31m-L1->stack=luaM_newvector(L,(2*20)+5,TValue);[m
[31m-L1->stacksize=(2*20)+5;[m
[31m-L1->top=L1->stack;[m
[31m-L1->stack_last=L1->stack+(L1->stacksize-5)-1;[m
[31m-L1->ci->func=L1->top;[m
[31m-setnilvalue(L1->top++);[m
[31m-L1->base=L1->ci->base=L1->top;[m
[31m-L1->ci->top=L1->top+20;[m
[31m-}[m
[31m-static void freestack(lua_State*L,lua_State*L1){[m
[31m-luaM_freearray(L,L1->base_ci,L1->size_ci,CallInfo);[m
[31m-luaM_freearray(L,L1->stack,L1->stacksize,TValue);[m
[31m-}[m
[31m-static void f_luaopen(lua_State*L,void*ud){[m
[31m-global_State*g=G(L);[m
[31m-UNUSED(ud);[m
[31m-stack_init(L,L);[m
[31m-sethvalue(L,gt(L),luaH_new(L,0,2));[m
[31m-sethvalue(L,registry(L),luaH_new(L,0,2));[m
[31m-luaS_resize(L,32);[m
[31m-luaT_init(L);[m
[31m-luaX_init(L);[m
[31m-luaS_fix(luaS_newliteral(L,"not enough memory"));[m
[31m-g->GCthreshold=4*g->totalbytes;[m
[31m-}[m
[31m-static void preinit_state(lua_State*L,global_State*g){[m
[31m-G(L)=g;[m
[31m-L->stack=NULL;[m
[31m-L->stacksize=0;[m
[31m-L->errorJmp=NULL;[m
[31m-L->hook=NULL;[m
[31m-L->hookmask=0;[m
[31m-L->basehookcount=0;[m
[31m-L->allowhook=1;[m
[31m-resethookcount(L);[m
[31m-L->openupval=NULL;[m
[31m-L->size_ci=0;[m
[31m-L->nCcalls=L->baseCcalls=0;[m
[31m-L->status=0;[m
[31m-L->base_ci=L->ci=NULL;[m
[31m-L->savedpc=NULL;[m
[31m-L->errfunc=0;[m
[31m-setnilvalue(gt(L));[m
[31m-}[m
[31m-static void close_state(lua_State*L){[m
[31m-global_State*g=G(L);[m
[31m-luaF_close(L,L->stack);[m
[31m-luaC_freeall(L);[m
[31m-luaM_freearray(L,G(L)->strt.hash,G(L)->strt.size,TString*);[m
[31m-luaZ_freebuffer(L,&g->buff);[m
[31m-freestack(L,L);[m
[31m-(*g->frealloc)(g->ud,fromstate(L),state_size(LG),0);[m
[31m-}[m
[31m-static void luaE_freethread(lua_State*L,lua_State*L1){[m
[31m-luaF_close(L1,L1->stack);[m
[31m-freestack(L,L1);[m
[31m-luaM_freemem(L,fromstate(L1),state_size(lua_State));[m
[31m-}[m
[31m-static lua_State*lua_newstate(lua_Alloc f,void*ud){[m
[31m-int i;[m
[31m-lua_State*L;[m
[31m-global_State*g;[m
[31m-void*l=(*f)(ud,NULL,0,state_size(LG));[m
[31m-if(l==NULL)return NULL;[m
[31m-L=tostate(l);[m
[31m-g=&((LG*)L)->g;[m
[31m-L->next=NULL;[m
[31m-L->tt=8;[m
[31m-g->currentwhite=bit2mask(0,5);[m
[31m-L->marked=luaC_white(g);[m
[31m-set2bits(L->marked,5,6);[m
[31m-preinit_state(L,g);[m
[31m-g->frealloc=f;[m
[31m-g->ud=ud;[m
[31m-g->mainthread=L;[m
[31m-g->uvhead.u.l.prev=&g->uvhead;[m
[31m-g->uvhead.u.l.next=&g->uvhead;[m
[31m-g->GCthreshold=0;[m
[31m-g->strt.size=0;[m
[31m-g->strt.nuse=0;[m
[31m-g->strt.hash=NULL;[m
[31m-setnilvalue(registry(L));[m
[31m-luaZ_initbuffer(L,&g->buff);[m
[31m-g->panic=NULL;[m
[31m-g->gcstate=0;[m
[31m-g->rootgc=obj2gco(L);[m
[31m-g->sweepstrgc=0;[m
[31m-g->sweepgc=&g->rootgc;[m
[31m-g->gray=NULL;[m
[31m-g->grayagain=NULL;[m
[31m-g->weak=NULL;[m
[31m-g->tmudata=NULL;[m
[31m-g->totalbytes=sizeof(LG);[m
[31m-g->gcpause=200;[m
[31m-g->gcstepmul=200;[m
[31m-g->gcdept=0;[m
[31m-for(i=0;i<(8+1);i++)g->mt[i]=NULL;[m
[31m-if(luaD_rawrunprotected(L,f_luaopen,NULL)!=0){[m
[31m-close_state(L);[m
[31m-L=NULL;[m
[31m-}[m
[31m-else[m
[31m-{}[m
[31m-return L;[m
[31m-}[m
[31m-static void callallgcTM(lua_State*L,void*ud){[m
[31m-UNUSED(ud);[m
[31m-luaC_callGCTM(L);[m
[31m-}[m
[31m-static void lua_close(lua_State*L){[m
[31m-L=G(L)->mainthread;[m
[31m-luaF_close(L,L->stack);[m
[31m-luaC_separateudata(L,1);[m
[31m-L->errfunc=0;[m
[31m-do{[m
[31m-L->ci=L->base_ci;[m
[31m-L->base=L->top=L->ci->base;[m
[31m-L->nCcalls=L->baseCcalls=0;[m
[31m-}while(luaD_rawrunprotected(L,callallgcTM,NULL)!=0);[m
[31m-close_state(L);[m
[31m-}[m
[31m-#define getcode(fs,e)((fs)->f->code[(e)->u.s.info])[m
[31m-#define luaK_codeAsBx(fs,o,A,sBx)luaK_codeABx(fs,o,A,(sBx)+(((1<<(9+9))-1)>>1))[m
[31m-#define luaK_setmultret(fs,e)luaK_setreturns(fs,e,(-1))[m
[31m-static int luaK_codeABx(FuncState*fs,OpCode o,int A,unsigned int Bx);[m
[31m-static int luaK_codeABC(FuncState*fs,OpCode o,int A,int B,int C);[m
[31m-static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults);[m
[31m-static void luaK_patchtohere(FuncState*fs,int list);[m
[31m-static void luaK_concat(FuncState*fs,int*l1,int l2);[m
[31m-static int currentpc(lua_State*L,CallInfo*ci){[m
[31m-if(!isLua(ci))return-1;[m
[31m-if(ci==L->ci)[m
[31m-ci->savedpc=L->savedpc;[m
[31m-return pcRel(ci->savedpc,ci_func(ci)->l.p);[m
[31m-}[m
[31m-static int currentline(lua_State*L,CallInfo*ci){[m
[31m-int pc=currentpc(L,ci);[m
[31m-if(pc<0)[m
[31m-return-1;[m
[31m-else[m
[31m-return getline_(ci_func(ci)->l.p,pc);[m
[31m-}[m
[31m-static int lua_getstack(lua_State*L,int level,lua_Debug*ar){[m
[31m-int status;[m
[31m-CallInfo*ci;[m
[31m-for(ci=L->ci;level>0&&ci>L->base_ci;ci--){[m
[31m-level--;[m
[31m-if(f_isLua(ci))[m
[31m-level-=ci->tailcalls;[m
[31m-}[m
[31m-if(level==0&&ci>L->base_ci){[m
[31m-status=1;[m
[31m-ar->i_ci=cast_int(ci-L->base_ci);[m
[31m-}[m
[31m-else if(level<0){[m
[31m-status=1;[m
[31m-ar->i_ci=0;[m
[31m-}[m
[31m-else status=0;[m
[31m-return status;[m
[31m-}[m
[31m-static Proto*getluaproto(CallInfo*ci){[m
[31m-return(isLua(ci)?ci_func(ci)->l.p:NULL);[m
[31m-}[m
[31m-static void funcinfo(lua_Debug*ar,Closure*cl){[m
[31m-if(cl->c.isC){[m
[31m-ar->source="=[C]";[m
[31m-ar->linedefined=-1;[m
[31m-ar->lastlinedefined=-1;[m
[31m-ar->what="C";[m
[31m-}[m
[31m-else{[m
[31m-ar->source=getstr(cl->l.p->source);[m
[31m-ar->linedefined=cl->l.p->linedefined;[m
[31m-ar->lastlinedefined=cl->l.p->lastlinedefined;[m
[31m-ar->what=(ar->linedefined==0)?"main":"Lua";[m
[31m-}[m
[31m-luaO_chunkid(ar->short_src,ar->source,60);[m
[31m-}[m
[31m-static void info_tailcall(lua_Debug*ar){[m
[31m-ar->name=ar->namewhat="";[m
[31m-ar->what="tail";[m
[31m-ar->lastlinedefined=ar->linedefined=ar->currentline=-1;[m
[31m-ar->source="=(tail call)";[m
[31m-luaO_chunkid(ar->short_src,ar->source,60);[m
[31m-ar->nups=0;[m
[31m-}[m
[31m-static void collectvalidlines(lua_State*L,Closure*f){[m
[31m-if(f==NULL||f->c.isC){[m
[31m-setnilvalue(L->top);[m
[31m-}[m
[31m-else{[m
[31m-Table*t=luaH_new(L,0,0);[m
[31m-int*lineinfo=f->l.p->lineinfo;[m
[31m-int i;[m
[31m-for(i=0;i<f->l.p->sizelineinfo;i++)[m
[31m-setbvalue(luaH_setnum(L,t,lineinfo[i]),1);[m
[31m-sethvalue(L,L->top,t);[m
[31m-}[m
[31m-incr_top(L);[m
[31m-}[m
[31m-static int auxgetinfo(lua_State*L,const char*what,lua_Debug*ar,[m
[31m-Closure*f,CallInfo*ci){[m
[31m-int status=1;[m
[31m-if(f==NULL){[m
[31m-info_tailcall(ar);[m
[31m-return status;[m
[31m-}[m
[31m-for(;*what;what++){[m
[31m-switch(*what){[m
[31m-case'S':{[m
[31m-funcinfo(ar,f);[m
[31m-break;[m
[31m-}[m
[31m-case'l':{[m
[31m-ar->currentline=(ci)?currentline(L,ci):-1;[m
[31m-break;[m
[31m-}[m
[31m-case'u':{[m
[31m-ar->nups=f->c.nupvalues;[m
[31m-break;[m
[31m-}[m
[31m-case'n':{[m
[31m-ar->namewhat=(ci)?NULL:NULL;[m
[31m-if(ar->namewhat==NULL){[m
[31m-ar->namewhat="";[m
[31m-ar->name=NULL;[m
[31m-}[m
[31m-break;[m
[31m-}[m
[31m-case'L':[m
[31m-case'f':[m
[31m-break;[m
[31m-default:status=0;[m
[31m-}[m
[31m-}[m
[31m-return status;[m
[31m-}[m
[31m-static int lua_getinfo(lua_State*L,const char*what,lua_Debug*ar){[m
[31m-int status;[m
[31m-Closure*f=NULL;[m
[31m-CallInfo*ci=NULL;[m
[31m-if(*what=='>'){[m
[31m-StkId func=L->top-1;[m
[31m-luai_apicheck(L,ttisfunction(func));[m
[31m-what++;[m
[31m-f=clvalue(func);[m
[31m-L->top--;[m
[31m-}[m
[31m-else if(ar->i_ci!=0){[m
[31m-ci=L->base_ci+ar->i_ci;[m
[31m-f=clvalue(ci->func);[m
[31m-}[m
[31m-status=auxgetinfo(L,what,ar,f,ci);[m
[31m-if(strchr(what,'f')){[m
[31m-if(f==NULL)setnilvalue(L->top);[m
[31m-else setclvalue(L,L->top,f);[m
[31m-incr_top(L);[m
[31m-}[m
[31m-if(strchr(what,'L'))[m
[31m-collectvalidlines(L,f);[m
[31m-return status;[m
[31m-}[m
[31m-static int isinstack(CallInfo*ci,const TValue*o){[m
[31m-StkId p;[m
[31m-for(p=ci->base;p<ci->top;p++)[m
[31m-if(o==p)return 1;[m
[31m-return 0;[m
[31m-}[m
[31m-static void luaG_typeerror(lua_State*L,const TValue*o,const char*op){[m
[31m-const char*name=NULL;[m
[31m-const char*t=luaT_typenames[ttype(o)];[m
[31m-const char*kind=(isinstack(L->ci,o))?[m
[31m-NULL:[m
[31m-NULL;[m
[31m-if(kind)[m
[31m-luaG_runerror(L,"attempt to %s %s "LUA_QL("%s")" (a %s value)",[m
[31m-op,kind,name,t);[m
[31m-else[m
[31m-luaG_runerror(L,"attempt to %s a %s value",op,t);[m
[31m-}[m
[31m-static void luaG_concaterror(lua_State*L,StkId p1,StkId p2){[m
[31m-if(ttisstring(p1)||ttisnumber(p1))p1=p2;[m
[31m-luaG_typeerror(L,p1,"concatenate");[m
[31m-}[m
[31m-static void luaG_aritherror(lua_State*L,const TValue*p1,const TValue*p2){[m
[31m-TValue temp;[m
[31m-if(luaV_tonumber(p1,&temp)==NULL)[m
[31m-p2=p1;[m
[31m-luaG_typeerror(L,p2,"perform arithmetic on");[m
[31m-}[m
[31m-static int luaG_ordererror(lua_State*L,const TValue*p1,const TValue*p2){[m
[31m-const char*t1=luaT_typenames[ttype(p1)];[m
[31m-const char*t2=luaT_typenames[ttype(p2)];[m
[31m-if(t1[2]==t2[2])[m
[31m-luaG_runerror(L,"attempt to compare two %s values",t1);[m
[31m-else[m
[31m-luaG_runerror(L,"attempt to compare %s with %s",t1,t2);[m
[31m-return 0;[m
[31m-}[m
[31m-static void addinfo(lua_State*L,const char*msg){[m
[31m-CallInfo*ci=L->ci;[m
[31m-if(isLua(ci)){[m
[31m-char buff[60];[m
[31m-int line=currentline(L,ci);[m
[31m-luaO_chunkid(buff,getstr(getluaproto(ci)->source),60);[m
[31m-luaO_pushfstring(L,"%s:%d: %s",buff,line,msg);[m
[31m-}[m
[31m-}[m
[31m-static void luaG_errormsg(lua_State*L){[m
[31m-if(L->errfunc!=0){[m
[31m-StkId errfunc=restorestack(L,L->errfunc);[m
[31m-if(!ttisfunction(errfunc))luaD_throw(L,5);[m
[31m-setobj(L,L->top,L->top-1);[m
[31m-setobj(L,L->top-1,errfunc);[m
[31m-incr_top(L);[m
[31m-luaD_call(L,L->top-2,1);[m
[31m-}[m
[31m-luaD_throw(L,2);[m
[31m-}[m
[31m-static void luaG_runerror(lua_State*L,const char*fmt,...){[m
[31m-va_list argp;[m
[31m-va_start(argp,fmt);[m
[31m-addinfo(L,luaO_pushvfstring(L,fmt,argp));[m
[31m-va_end(argp);[m
[31m-luaG_errormsg(L);[m
[31m-}[m
[31m-static int luaZ_fill(ZIO*z){[m
[31m-size_t size;[m
[31m-lua_State*L=z->L;[m
[31m-const char*buff;[m
[31m-buff=z->reader(L,z->data,&size);[m
[31m-if(buff==NULL||size==0)return(-1);[m
[31m-z->n=size-1;[m
[31m-z->p=buff;[m
[31m-return char2int(*(z->p++));[m
[31m-}[m
[31m-static void luaZ_init(lua_State*L,ZIO*z,lua_Reader reader,void*data){[m
[31m-z->L=L;[m
[31m-z->reader=reader;[m
[31m-z->data=data;[m
[31m-z->n=0;[m
[31m-z->p=NULL;[m
[31m-}[m
[31m-static char*luaZ_openspace(lua_State*L,Mbuffer*buff,size_t n){[m
[31m-if(n>buff->buffsize){[m
[31m-if(n<32)n=32;[m
[31m-luaZ_resizebuffer(L,buff,n);[m
[31m-}[m
[31m-return buff->buffer;[m
[31m-}[m
[31m-#define opmode(t,a,b,c,m)(((t)<<7)|((a)<<6)|((b)<<4)|((c)<<2)|(m))[m
[31m-static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]={[m
[31m-opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgN,iABx)[m
[31m-,opmode(0,1,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgN,iABx)[m
[31m-,opmode(0,1,OpArgR,OpArgK,iABC)[m
[31m-,opmode(0,0,OpArgK,OpArgN,iABx)[m
[31m-,opmode(0,0,OpArgU,OpArgN,iABC)[m
[31m-,opmode(0,0,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgK,OpArgK,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgR,iABC)[m
[31m-,opmode(0,0,OpArgR,OpArgN,iAsBx)[m
[31m-,opmode(1,0,OpArgK,OpArgK,iABC)[m
[31m-,opmode(1,0,OpArgK,OpArgK,iABC)[m
[31m-,opmode(1,0,OpArgK,OpArgK,iABC)[m
[31m-,opmode(1,1,OpArgR,OpArgU,iABC)[m
[31m-,opmode(1,1,OpArgR,OpArgU,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,0,OpArgU,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iAsBx)[m
[31m-,opmode(0,1,OpArgR,OpArgN,iAsBx)[m
[31m-,opmode(1,0,OpArgN,OpArgU,iABC)[m
[31m-,opmode(0,0,OpArgU,OpArgU,iABC)[m
[31m-,opmode(0,0,OpArgN,OpArgN,iABC)[m
[31m-,opmode(0,1,OpArgU,OpArgN,iABx)[m
[31m-,opmode(0,1,OpArgU,OpArgN,iABC)[m
[31m-};[m
[31m-#define next(ls)(ls->current=zgetc(ls->z))[m
[31m-#define currIsNewline(ls)(ls->current=='\n'||ls->current=='\r')[m
[31m-static const char*const luaX_tokens[]={[m
[31m-"and","break","do","else","elseif",[m
[31m-"end","false","for","function","if",[m
[31m-"in","local","nil","not","or","repeat",[m
[31m-"return","then","true","until","while",[m
[31m-"..","...","==",">=","<=","~=",[m
[31m-"<number>","<name>","<string>","<eof>",[m
[31m-NULL[m
[31m-};[m
[31m-#define save_and_next(ls)(save(ls,ls->current),next(ls))[m
[31m-static void save(LexState*ls,int c){[m
[31m-Mbuffer*b=ls->buff;[m
[31m-if(b->n+1>b->buffsize){[m
[31m-size_t newsize;[m
[31m-if(b->buffsize>=((size_t)(~(size_t)0)-2)/2)[m
[31m-luaX_lexerror(ls,"lexical element too long",0);[m
[31m-newsize=b->buffsize*2;[m
[31m-luaZ_resizebuffer(ls->L,b,newsize);[m
[31m-}[m
[31m-b->buffer[b->n++]=cast(char,c);[m
[31m-}[m
[31m-static void luaX_init(lua_State*L){[m
[31m-int i;[m
[31m-for(i=0;i<(cast(int,TK_WHILE-257+1));i++){[m
[31m-TString*ts=luaS_new(L,luaX_tokens[i]);[m
[31m-luaS_fix(ts);[m
[31m-ts->tsv.reserved=cast_byte(i+1);[m
[31m-}[m
[31m-}[m
[31m-static const char*luaX_token2str(LexState*ls,int token){[m
[31m-if(token<257){[m
[31m-return(iscntrl(token))?luaO_pushfstring(ls->L,"char(%d)",token):[m
[31m-luaO_pushfstring(ls->L,"%c",token);[m
[31m-}[m
[31m-else[m
[31m-return luaX_tokens[token-257];[m
[31m-}[m
[31m-static const char*txtToken(LexState*ls,int token){[m
[31m-switch(token){[m
[31m-case TK_NAME:[m
[31m-case TK_STRING:[m
[31m-case TK_NUMBER:[m
[31m-save(ls,'\0');[m
[31m-return luaZ_buffer(ls->buff);[m
[31m-default:[m
[31m-return luaX_token2str(ls,token);[m
[31m-}[m
[31m-}[m
[31m-static void luaX_lexerror(LexState*ls,const char*msg,int token){[m
[31m-char buff[80];[m
[31m-luaO_chunkid(buff,getstr(ls->source),80);[m
[31m-msg=luaO_pushfstring(ls->L,"%s:%d: %s",buff,ls->linenumber,msg);[m
[31m-if(token)[m
[31m-luaO_pushfstring(ls->L,"%s near "LUA_QL("%s"),msg,txtToken(ls,token));[m
[31m-luaD_throw(ls->L,3);[m
[31m-}[m
[31m-static void luaX_syntaxerror(LexState*ls,const char*msg){[m
[31m-luaX_lexerror(ls,msg,ls->t.token);[m
[31m-}[m
[31m-static TString*luaX_newstring(LexState*ls,const char*str,size_t l){[m
[31m-lua_State*L=ls->L;[m
[31m-TString*ts=luaS_newlstr(L,str,l);[m
[31m-TValue*o=luaH_setstr(L,ls->fs->h,ts);[m
[31m-if(ttisnil(o)){[m
[31m-setbvalue(o,1);[m
[31m-luaC_checkGC(L);[m
[31m-}[m
[31m-return ts;[m
[31m-}[m
[31m-static void inclinenumber(LexState*ls){[m
[31m-int old=ls->current;[m
[31m-next(ls);[m
[31m-if(currIsNewline(ls)&&ls->current!=old)[m
[31m-next(ls);[m
[31m-if(++ls->linenumber>=(INT_MAX-2))[m
[31m-luaX_syntaxerror(ls,"chunk has too many lines");[m
[31m-}[m
[31m-static void luaX_setinput(lua_State*L,LexState*ls,ZIO*z,TString*source){[m
[31m-ls->decpoint='.';[m
[31m-ls->L=L;[m
[31m-ls->lookahead.token=TK_EOS;[m
[31m-ls->z=z;[m
[31m-ls->fs=NULL;[m
[31m-ls->linenumber=1;[m
[31m-ls->lastline=1;[m
[31m-ls->source=source;[m
[31m-luaZ_resizebuffer(ls->L,ls->buff,32);[m
[31m-next(ls);[m
[31m-}[m
[31m-static int check_next(LexState*ls,const char*set){[m
[31m-if(!strchr(set,ls->current))[m
[31m-return 0;[m
[31m-save_and_next(ls);[m
[31m-return 1;[m
[31m-}[m
[31m-static void buffreplace(LexState*ls,char from,char to){[m
[31m-size_t n=luaZ_bufflen(ls->buff);[m
[31m-char*p=luaZ_buffer(ls->buff);[m
[31m-while(n--)[m
[31m-if(p[n]==from)p[n]=to;[m
[31m-}[m
[31m-static void read_numeral(LexState*ls,SemInfo*seminfo){[m
[31m-do{[m
[31m-save_and_next(ls);[m
[31m-}while(isdigit(ls->current)||ls->current=='.');[m
[31m-if(check_next(ls,"Ee"))[m
[31m-check_next(ls,"+-");[m
[31m-while(isalnum(ls->current)||ls->current=='_')[m
[31m-save_and_next(ls);[m
[31m-save(ls,'\0');[m
[31m-buffreplace(ls,'.',ls->decpoint);[m
[31m-if(!luaO_str2d(luaZ_buffer(ls->buff),&seminfo->r))[m
[31m-luaX_lexerror(ls,"malformed number",TK_NUMBER);[m
[31m-}[m
[31m-static int skip_sep(LexState*ls){[m
[31m-int count=0;[m
[31m-int s=ls->current;[m
[31m-save_and_next(ls);[m
[31m-while(ls->current=='='){[m
[31m-save_and_next(ls);[m
[31m-count++;[m
[31m-}[m
[31m-return(ls->current==s)?count:(-count)-1;[m
[31m-}[m
[31m-static void read_long_string(LexState*ls,SemInfo*seminfo,int sep){[m
[31m-int cont=0;[m
[31m-(void)(cont);[m
[31m-save_and_next(ls);[m
[31m-if(currIsNewline(ls))[m
[31m-inclinenumber(ls);[m
[31m-for(;;){[m
[31m-switch(ls->current){[m
[31m-case(-1):[m
[31m-luaX_lexerror(ls,(seminfo)?"unfinished long string":[m
[31m-"unfinished long comment",TK_EOS);[m
[31m-break;[m
[31m-case']':{[m
[31m-if(skip_sep(ls)==sep){[m
[31m-save_and_next(ls);[m
[31m-goto endloop;[m
[31m-}[m
[31m-break;[m
[31m-}[m
[31m-case'\n':[m
[31m-case'\r':{[m
[31m-save(ls,'\n');[m
[31m-inclinenumber(ls);[m
[31m-if(!seminfo)luaZ_resetbuffer(ls->buff);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-if(seminfo)save_and_next(ls);[m
[31m-else next(ls);[m
[31m-}[m
[31m-}[m
[31m-}endloop:[m
[31m-if(seminfo)[m
[31m-seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+(2+sep),[m
[31m-luaZ_bufflen(ls->buff)-2*(2+sep));[m
[31m-}[m
[31m-static void read_string(LexState*ls,int del,SemInfo*seminfo){[m
[31m-save_and_next(ls);[m
[31m-while(ls->current!=del){[m
[31m-switch(ls->current){[m
[31m-case(-1):[m
[31m-luaX_lexerror(ls,"unfinished string",TK_EOS);[m
[31m-continue;[m
[31m-case'\n':[m
[31m-case'\r':[m
[31m-luaX_lexerror(ls,"unfinished string",TK_STRING);[m
[31m-continue;[m
[31m-case'\\':{[m
[31m-int c;[m
[31m-next(ls);[m
[31m-switch(ls->current){[m
[31m-case'a':c='\a';break;[m
[31m-case'b':c='\b';break;[m
[31m-case'f':c='\f';break;[m
[31m-case'n':c='\n';break;[m
[31m-case'r':c='\r';break;[m
[31m-case't':c='\t';break;[m
[31m-case'v':c='\v';break;[m
[31m-case'\n':[m
[31m-case'\r':save(ls,'\n');inclinenumber(ls);continue;[m
[31m-case(-1):continue;[m
[31m-default:{[m
[31m-if(!isdigit(ls->current))[m
[31m-save_and_next(ls);[m
[31m-else{[m
[31m-int i=0;[m
[31m-c=0;[m
[31m-do{[m
[31m-c=10*c+(ls->current-'0');[m
[31m-next(ls);[m
[31m-}while(++i<3&&isdigit(ls->current));[m
[31m-if(c>UCHAR_MAX)[m
[31m-luaX_lexerror(ls,"escape sequence too large",TK_STRING);[m
[31m-save(ls,c);[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-}[m
[31m-save(ls,c);[m
[31m-next(ls);[m
[31m-continue;[m
[31m-}[m
[31m-default:[m
[31m-save_and_next(ls);[m
[31m-}[m
[31m-}[m
[31m-save_and_next(ls);[m
[31m-seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+1,[m
[31m-luaZ_bufflen(ls->buff)-2);[m
[31m-}[m
[31m-static int llex(LexState*ls,SemInfo*seminfo){[m
[31m-luaZ_resetbuffer(ls->buff);[m
[31m-for(;;){[m
[31m-switch(ls->current){[m
[31m-case'\n':[m
[31m-case'\r':{[m
[31m-inclinenumber(ls);[m
[31m-continue;[m
[31m-}[m
[31m-case'-':{[m
[31m-next(ls);[m
[31m-if(ls->current!='-')return'-';[m
[31m-next(ls);[m
[31m-if(ls->current=='['){[m
[31m-int sep=skip_sep(ls);[m
[31m-luaZ_resetbuffer(ls->buff);[m
[31m-if(sep>=0){[m
[31m-read_long_string(ls,NULL,sep);[m
[31m-luaZ_resetbuffer(ls->buff);[m
[31m-continue;[m
[31m-}[m
[31m-}[m
[31m-while(!currIsNewline(ls)&&ls->current!=(-1))[m
[31m-next(ls);[m
[31m-continue;[m
[31m-}[m
[31m-case'[':{[m
[31m-int sep=skip_sep(ls);[m
[31m-if(sep>=0){[m
[31m-read_long_string(ls,seminfo,sep);[m
[31m-return TK_STRING;[m
[31m-}[m
[31m-else if(sep==-1)return'[';[m
[31m-else luaX_lexerror(ls,"invalid long string delimiter",TK_STRING);[m
[31m-}[m
[31m-case'=':{[m
[31m-next(ls);[m
[31m-if(ls->current!='=')return'=';[m
[31m-else{next(ls);return TK_EQ;}[m
[31m-}[m
[31m-case'<':{[m
[31m-next(ls);[m
[31m-if(ls->current!='=')return'<';[m
[31m-else{next(ls);return TK_LE;}[m
[31m-}[m
[31m-case'>':{[m
[31m-next(ls);[m
[31m-if(ls->current!='=')return'>';[m
[31m-else{next(ls);return TK_GE;}[m
[31m-}[m
[31m-case'~':{[m
[31m-next(ls);[m
[31m-if(ls->current!='=')return'~';[m
[31m-else{next(ls);return TK_NE;}[m
[31m-}[m
[31m-case'"':[m
[31m-case'\'':{[m
[31m-read_string(ls,ls->current,seminfo);[m
[31m-return TK_STRING;[m
[31m-}[m
[31m-case'.':{[m
[31m-save_and_next(ls);[m
[31m-if(check_next(ls,".")){[m
[31m-if(check_next(ls,"."))[m
[31m-return TK_DOTS;[m
[31m-else return TK_CONCAT;[m
[31m-}[m
[31m-else if(!isdigit(ls->current))return'.';[m
[31m-else{[m
[31m-read_numeral(ls,seminfo);[m
[31m-return TK_NUMBER;[m
[31m-}[m
[31m-}[m
[31m-case(-1):{[m
[31m-return TK_EOS;[m
[31m-}[m
[31m-default:{[m
[31m-if(isspace(ls->current)){[m
[31m-next(ls);[m
[31m-continue;[m
[31m-}[m
[31m-else if(isdigit(ls->current)){[m
[31m-read_numeral(ls,seminfo);[m
[31m-return TK_NUMBER;[m
[31m-}[m
[31m-else if(isalpha(ls->current)||ls->current=='_'){[m
[31m-TString*ts;[m
[31m-do{[m
[31m-save_and_next(ls);[m
[31m-}while(isalnum(ls->current)||ls->current=='_');[m
[31m-ts=luaX_newstring(ls,luaZ_buffer(ls->buff),[m
[31m-luaZ_bufflen(ls->buff));[m
[31m-if(ts->tsv.reserved>0)[m
[31m-return ts->tsv.reserved-1+257;[m
[31m-else{[m
[31m-seminfo->ts=ts;[m
[31m-return TK_NAME;[m
[31m-}[m
[31m-}[m
[31m-else{[m
[31m-int c=ls->current;[m
[31m-next(ls);[m
[31m-return c;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void luaX_next(LexState*ls){[m
[31m-ls->lastline=ls->linenumber;[m
[31m-if(ls->lookahead.token!=TK_EOS){[m
[31m-ls->t=ls->lookahead;[m
[31m-ls->lookahead.token=TK_EOS;[m
[31m-}[m
[31m-else[m
[31m-ls->t.token=llex(ls,&ls->t.seminfo);[m
[31m-}[m
[31m-static void luaX_lookahead(LexState*ls){[m
[31m-ls->lookahead.token=llex(ls,&ls->lookahead.seminfo);[m
[31m-}[m
[31m-#define hasjumps(e)((e)->t!=(e)->f)[m
[31m-static int isnumeral(expdesc*e){[m
[31m-return(e->k==VKNUM&&e->t==(-1)&&e->f==(-1));[m
[31m-}[m
[31m-static void luaK_nil(FuncState*fs,int from,int n){[m
[31m-Instruction*previous;[m
[31m-if(fs->pc>fs->lasttarget){[m
[31m-if(fs->pc==0){[m
[31m-if(from>=fs->nactvar)[m
[31m-return;[m
[31m-}[m
[31m-else{[m
[31m-previous=&fs->f->code[fs->pc-1];[m
[31m-if(GET_OPCODE(*previous)==OP_LOADNIL){[m
[31m-int pfrom=GETARG_A(*previous);[m
[31m-int pto=GETARG_B(*previous);[m
[31m-if(pfrom<=from&&from<=pto+1){[m
[31m-if(from+n-1>pto)[m
[31m-SETARG_B(*previous,from+n-1);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-luaK_codeABC(fs,OP_LOADNIL,from,from+n-1,0);[m
[31m-}[m
[31m-static int luaK_jump(FuncState*fs){[m
[31m-int jpc=fs->jpc;[m
[31m-int j;[m
[31m-fs->jpc=(-1);[m
[31m-j=luaK_codeAsBx(fs,OP_JMP,0,(-1));[m
[31m-luaK_concat(fs,&j,jpc);[m
[31m-return j;[m
[31m-}[m
[31m-static void luaK_ret(FuncState*fs,int first,int nret){[m
[31m-luaK_codeABC(fs,OP_RETURN,first,nret+1,0);[m
[31m-}[m
[31m-static int condjump(FuncState*fs,OpCode op,int A,int B,int C){[m
[31m-luaK_codeABC(fs,op,A,B,C);[m
[31m-return luaK_jump(fs);[m
[31m-}[m
[31m-static void fixjump(FuncState*fs,int pc,int dest){[m
[31m-Instruction*jmp=&fs->f->code[pc];[m
[31m-int offset=dest-(pc+1);[m
[31m-if(abs(offset)>(((1<<(9+9))-1)>>1))[m
[31m-luaX_syntaxerror(fs->ls,"control structure too long");[m
[31m-SETARG_sBx(*jmp,offset);[m
[31m-}[m
[31m-static int luaK_getlabel(FuncState*fs){[m
[31m-fs->lasttarget=fs->pc;[m
[31m-return fs->pc;[m
[31m-}[m
[31m-static int getjump(FuncState*fs,int pc){[m
[31m-int offset=GETARG_sBx(fs->f->code[pc]);[m
[31m-if(offset==(-1))[m
[31m-return(-1);[m
[31m-else[m
[31m-return(pc+1)+offset;[m
[31m-}[m
[31m-static Instruction*getjumpcontrol(FuncState*fs,int pc){[m
[31m-Instruction*pi=&fs->f->code[pc];[m
[31m-if(pc>=1&&testTMode(GET_OPCODE(*(pi-1))))[m
[31m-return pi-1;[m
[31m-else[m
[31m-return pi;[m
[31m-}[m
[31m-static int need_value(FuncState*fs,int list){[m
[31m-for(;list!=(-1);list=getjump(fs,list)){[m
[31m-Instruction i=*getjumpcontrol(fs,list);[m
[31m-if(GET_OPCODE(i)!=OP_TESTSET)return 1;[m
[31m-}[m
[31m-return 0;[m
[31m-}[m
[31m-static int patchtestreg(FuncState*fs,int node,int reg){[m
[31m-Instruction*i=getjumpcontrol(fs,node);[m
[31m-if(GET_OPCODE(*i)!=OP_TESTSET)[m
[31m-return 0;[m
[31m-if(reg!=((1<<8)-1)&&reg!=GETARG_B(*i))[m
[31m-SETARG_A(*i,reg);[m
[31m-else[m
[31m-*i=CREATE_ABC(OP_TEST,GETARG_B(*i),0,GETARG_C(*i));[m
[31m-return 1;[m
[31m-}[m
[31m-static void removevalues(FuncState*fs,int list){[m
[31m-for(;list!=(-1);list=getjump(fs,list))[m
[31m-patchtestreg(fs,list,((1<<8)-1));[m
[31m-}[m
[31m-static void patchlistaux(FuncState*fs,int list,int vtarget,int reg,[m
[31m-int dtarget){[m
[31m-while(list!=(-1)){[m
[31m-int next=getjump(fs,list);[m
[31m-if(patchtestreg(fs,list,reg))[m
[31m-fixjump(fs,list,vtarget);[m
[31m-else[m
[31m-fixjump(fs,list,dtarget);[m
[31m-list=next;[m
[31m-}[m
[31m-}[m
[31m-static void dischargejpc(FuncState*fs){[m
[31m-patchlistaux(fs,fs->jpc,fs->pc,((1<<8)-1),fs->pc);[m
[31m-fs->jpc=(-1);[m
[31m-}[m
[31m-static void luaK_patchlist(FuncState*fs,int list,int target){[m
[31m-if(target==fs->pc)[m
[31m-luaK_patchtohere(fs,list);[m
[31m-else{[m
[31m-patchlistaux(fs,list,target,((1<<8)-1),target);[m
[31m-}[m
[31m-}[m
[31m-static void luaK_patchtohere(FuncState*fs,int list){[m
[31m-luaK_getlabel(fs);[m
[31m-luaK_concat(fs,&fs->jpc,list);[m
[31m-}[m
[31m-static void luaK_concat(FuncState*fs,int*l1,int l2){[m
[31m-if(l2==(-1))return;[m
[31m-else if(*l1==(-1))[m
[31m-*l1=l2;[m
[31m-else{[m
[31m-int list=*l1;[m
[31m-int next;[m
[31m-while((next=getjump(fs,list))!=(-1))[m
[31m-list=next;[m
[31m-fixjump(fs,list,l2);[m
[31m-}[m
[31m-}[m
[31m-static void luaK_checkstack(FuncState*fs,int n){[m
[31m-int newstack=fs->freereg+n;[m
[31m-if(newstack>fs->f->maxstacksize){[m
[31m-if(newstack>=250)[m
[31m-luaX_syntaxerror(fs->ls,"function or expression too complex");[m
[31m-fs->f->maxstacksize=cast_byte(newstack);[m
[31m-}[m
[31m-}[m
[31m-static void luaK_reserveregs(FuncState*fs,int n){[m
[31m-luaK_checkstack(fs,n);[m
[31m-fs->freereg+=n;[m
[31m-}[m
[31m-static void freereg(FuncState*fs,int reg){[m
[31m-if(!ISK(reg)&&reg>=fs->nactvar){[m
[31m-fs->freereg--;[m
[31m-}[m
[31m-}[m
[31m-static void freeexp(FuncState*fs,expdesc*e){[m
[31m-if(e->k==VNONRELOC)[m
[31m-freereg(fs,e->u.s.info);[m
[31m-}[m
[31m-static int addk(FuncState*fs,TValue*k,TValue*v){[m
[31m-lua_State*L=fs->L;[m
[31m-TValue*idx=luaH_set(L,fs->h,k);[m
[31m-Proto*f=fs->f;[m
[31m-int oldsize=f->sizek;[m
[31m-if(ttisnumber(idx)){[m
[31m-return cast_int(nvalue(idx));[m
[31m-}[m
[31m-else{[m
[31m-setnvalue(idx,cast_num(fs->nk));[m
[31m-luaM_growvector(L,f->k,fs->nk,f->sizek,TValue,[m
[31m-((1<<(9+9))-1),"constant table overflow");[m
[31m-while(oldsize<f->sizek)setnilvalue(&f->k[oldsize++]);[m
[31m-setobj(L,&f->k[fs->nk],v);[m
[31m-luaC_barrier(L,f,v);[m
[31m-return fs->nk++;[m
[31m-}[m
[31m-}[m
[31m-static int luaK_stringK(FuncState*fs,TString*s){[m
[31m-TValue o;[m
[31m-setsvalue(fs->L,&o,s);[m
[31m-return addk(fs,&o,&o);[m
[31m-}[m
[31m-static int luaK_numberK(FuncState*fs,lua_Number r){[m
[31m-TValue o;[m
[31m-setnvalue(&o,r);[m
[31m-return addk(fs,&o,&o);[m
[31m-}[m
[31m-static int boolK(FuncState*fs,int b){[m
[31m-TValue o;[m
[31m-setbvalue(&o,b);[m
[31m-return addk(fs,&o,&o);[m
[31m-}[m
[31m-static int nilK(FuncState*fs){[m
[31m-TValue k,v;[m
[31m-setnilvalue(&v);[m
[31m-sethvalue(fs->L,&k,fs->h);[m
[31m-return addk(fs,&k,&v);[m
[31m-}[m
[31m-static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults){[m
[31m-if(e->k==VCALL){[m
[31m-SETARG_C(getcode(fs,e),nresults+1);[m
[31m-}[m
[31m-else if(e->k==VVARARG){[m
[31m-SETARG_B(getcode(fs,e),nresults+1);[m
[31m-SETARG_A(getcode(fs,e),fs->freereg);[m
[31m-luaK_reserveregs(fs,1);[m
[31m-}[m
[31m-}[m
[31m-static void luaK_setoneret(FuncState*fs,expdesc*e){[m
[31m-if(e->k==VCALL){[m
[31m-e->k=VNONRELOC;[m
[31m-e->u.s.info=GETARG_A(getcode(fs,e));[m
[31m-}[m
[31m-else if(e->k==VVARARG){[m
[31m-SETARG_B(getcode(fs,e),2);[m
[31m-e->k=VRELOCABLE;[m
[31m-}[m
[31m-}[m
[31m-static void luaK_dischargevars(FuncState*fs,expdesc*e){[m
[31m-switch(e->k){[m
[31m-case VLOCAL:{[m
[31m-e->k=VNONRELOC;[m
[31m-break;[m
[31m-}[m
[31m-case VUPVAL:{[m
[31m-e->u.s.info=luaK_codeABC(fs,OP_GETUPVAL,0,e->u.s.info,0);[m
[31m-e->k=VRELOCABLE;[m
[31m-break;[m
[31m-}[m
[31m-case VGLOBAL:{[m
[31m-e->u.s.info=luaK_codeABx(fs,OP_GETGLOBAL,0,e->u.s.info);[m
[31m-e->k=VRELOCABLE;[m
[31m-break;[m
[31m-}[m
[31m-case VINDEXED:{[m
[31m-freereg(fs,e->u.s.aux);[m
[31m-freereg(fs,e->u.s.info);[m
[31m-e->u.s.info=luaK_codeABC(fs,OP_GETTABLE,0,e->u.s.info,e->u.s.aux);[m
[31m-e->k=VRELOCABLE;[m
[31m-break;[m
[31m-}[m
[31m-case VVARARG:[m
[31m-case VCALL:{[m
[31m-luaK_setoneret(fs,e);[m
[31m-break;[m
[31m-}[m
[31m-default:break;[m
[31m-}[m
[31m-}[m
[31m-static int code_label(FuncState*fs,int A,int b,int jump){[m
[31m-luaK_getlabel(fs);[m
[31m-return luaK_codeABC(fs,OP_LOADBOOL,A,b,jump);[m
[31m-}[m
[31m-static void discharge2reg(FuncState*fs,expdesc*e,int reg){[m
[31m-luaK_dischargevars(fs,e);[m
[31m-switch(e->k){[m
[31m-case VNIL:{[m
[31m-luaK_nil(fs,reg,1);[m
[31m-break;[m
[31m-}[m
[31m-case VFALSE:case VTRUE:{[m
[31m-luaK_codeABC(fs,OP_LOADBOOL,reg,e->k==VTRUE,0);[m
[31m-break;[m
[31m-}[m
[31m-case VK:{[m
[31m-luaK_codeABx(fs,OP_LOADK,reg,e->u.s.info);[m
[31m-break;[m
[31m-}[m
[31m-case VKNUM:{[m
[31m-luaK_codeABx(fs,OP_LOADK,reg,luaK_numberK(fs,e->u.nval));[m
[31m-break;[m
[31m-}[m
[31m-case VRELOCABLE:{[m
[31m-Instruction*pc=&getcode(fs,e);[m
[31m-SETARG_A(*pc,reg);[m
[31m-break;[m
[31m-}[m
[31m-case VNONRELOC:{[m
[31m-if(reg!=e->u.s.info)[m
[31m-luaK_codeABC(fs,OP_MOVE,reg,e->u.s.info,0);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-e->u.s.info=reg;[m
[31m-e->k=VNONRELOC;[m
[31m-}[m
[31m-static void discharge2anyreg(FuncState*fs,expdesc*e){[m
[31m-if(e->k!=VNONRELOC){[m
[31m-luaK_reserveregs(fs,1);[m
[31m-discharge2reg(fs,e,fs->freereg-1);[m
[31m-}[m
[31m-}[m
[31m-static void exp2reg(FuncState*fs,expdesc*e,int reg){[m
[31m-discharge2reg(fs,e,reg);[m
[31m-if(e->k==VJMP)[m
[31m-luaK_concat(fs,&e->t,e->u.s.info);[m
[31m-if(hasjumps(e)){[m
[31m-int final;[m
[31m-int p_f=(-1);[m
[31m-int p_t=(-1);[m
[31m-if(need_value(fs,e->t)||need_value(fs,e->f)){[m
[31m-int fj=(e->k==VJMP)?(-1):luaK_jump(fs);[m
[31m-p_f=code_label(fs,reg,0,1);[m
[31m-p_t=code_label(fs,reg,1,0);[m
[31m-luaK_patchtohere(fs,fj);[m
[31m-}[m
[31m-final=luaK_getlabel(fs);[m
[31m-patchlistaux(fs,e->f,final,reg,p_f);[m
[31m-patchlistaux(fs,e->t,final,reg,p_t);[m
[31m-}[m
[31m-e->f=e->t=(-1);[m
[31m-e->u.s.info=reg;[m
[31m-e->k=VNONRELOC;[m
[31m-}[m
[31m-static void luaK_exp2nextreg(FuncState*fs,expdesc*e){[m
[31m-luaK_dischargevars(fs,e);[m
[31m-freeexp(fs,e);[m
[31m-luaK_reserveregs(fs,1);[m
[31m-exp2reg(fs,e,fs->freereg-1);[m
[31m-}[m
[31m-static int luaK_exp2anyreg(FuncState*fs,expdesc*e){[m
[31m-luaK_dischargevars(fs,e);[m
[31m-if(e->k==VNONRELOC){[m
[31m-if(!hasjumps(e))return e->u.s.info;[m
[31m-if(e->u.s.info>=fs->nactvar){[m
[31m-exp2reg(fs,e,e->u.s.info);[m
[31m-return e->u.s.info;[m
[31m-}[m
[31m-}[m
[31m-luaK_exp2nextreg(fs,e);[m
[31m-return e->u.s.info;[m
[31m-}[m
[31m-static void luaK_exp2val(FuncState*fs,expdesc*e){[m
[31m-if(hasjumps(e))[m
[31m-luaK_exp2anyreg(fs,e);[m
[31m-else[m
[31m-luaK_dischargevars(fs,e);[m
[31m-}[m
[31m-static int luaK_exp2RK(FuncState*fs,expdesc*e){[m
[31m-luaK_exp2val(fs,e);[m
[31m-switch(e->k){[m
[31m-case VKNUM:[m
[31m-case VTRUE:[m
[31m-case VFALSE:[m
[31m-case VNIL:{[m
[31m-if(fs->nk<=((1<<(9-1))-1)){[m
[31m-e->u.s.info=(e->k==VNIL)?nilK(fs):[m
[31m-(e->k==VKNUM)?luaK_numberK(fs,e->u.nval):[m
[31m-boolK(fs,(e->k==VTRUE));[m
[31m-e->k=VK;[m
[31m-return RKASK(e->u.s.info);[m
[31m-}[m
[31m-else break;[m
[31m-}[m
[31m-case VK:{[m
[31m-if(e->u.s.info<=((1<<(9-1))-1))[m
[31m-return RKASK(e->u.s.info);[m
[31m-else break;[m
[31m-}[m
[31m-default:break;[m
[31m-}[m
[31m-return luaK_exp2anyreg(fs,e);[m
[31m-}[m
[31m-static void luaK_storevar(FuncState*fs,expdesc*var,expdesc*ex){[m
[31m-switch(var->k){[m
[31m-case VLOCAL:{[m
[31m-freeexp(fs,ex);[m
[31m-exp2reg(fs,ex,var->u.s.info);[m
[31m-return;[m
[31m-}[m
[31m-case VUPVAL:{[m
[31m-int e=luaK_exp2anyreg(fs,ex);[m
[31m-luaK_codeABC(fs,OP_SETUPVAL,e,var->u.s.info,0);[m
[31m-break;[m
[31m-}[m
[31m-case VGLOBAL:{[m
[31m-int e=luaK_exp2anyreg(fs,ex);[m
[31m-luaK_codeABx(fs,OP_SETGLOBAL,e,var->u.s.info);[m
[31m-break;[m
[31m-}[m
[31m-case VINDEXED:{[m
[31m-int e=luaK_exp2RK(fs,ex);[m
[31m-luaK_codeABC(fs,OP_SETTABLE,var->u.s.info,var->u.s.aux,e);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-freeexp(fs,ex);[m
[31m-}[m
[31m-static void luaK_self(FuncState*fs,expdesc*e,expdesc*key){[m
[31m-int func;[m
[31m-luaK_exp2anyreg(fs,e);[m
[31m-freeexp(fs,e);[m
[31m-func=fs->freereg;[m
[31m-luaK_reserveregs(fs,2);[m
[31m-luaK_codeABC(fs,OP_SELF,func,e->u.s.info,luaK_exp2RK(fs,key));[m
[31m-freeexp(fs,key);[m
[31m-e->u.s.info=func;[m
[31m-e->k=VNONRELOC;[m
[31m-}[m
[31m-static void invertjump(FuncState*fs,expdesc*e){[m
[31m-Instruction*pc=getjumpcontrol(fs,e->u.s.info);[m
[31m-SETARG_A(*pc,!(GETARG_A(*pc)));[m
[31m-}[m
[31m-static int jumponcond(FuncState*fs,expdesc*e,int cond){[m
[31m-if(e->k==VRELOCABLE){[m
[31m-Instruction ie=getcode(fs,e);[m
[31m-if(GET_OPCODE(ie)==OP_NOT){[m
[31m-fs->pc--;[m
[31m-return condjump(fs,OP_TEST,GETARG_B(ie),0,!cond);[m
[31m-}[m
[31m-}[m
[31m-discharge2anyreg(fs,e);[m
[31m-freeexp(fs,e);[m
[31m-return condjump(fs,OP_TESTSET,((1<<8)-1),e->u.s.info,cond);[m
[31m-}[m
[31m-static void luaK_goiftrue(FuncState*fs,expdesc*e){[m
[31m-int pc;[m
[31m-luaK_dischargevars(fs,e);[m
[31m-switch(e->k){[m
[31m-case VK:case VKNUM:case VTRUE:{[m
[31m-pc=(-1);[m
[31m-break;[m
[31m-}[m
[31m-case VJMP:{[m
[31m-invertjump(fs,e);[m
[31m-pc=e->u.s.info;[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-pc=jumponcond(fs,e,0);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-luaK_concat(fs,&e->f,pc);[m
[31m-luaK_patchtohere(fs,e->t);[m
[31m-e->t=(-1);[m
[31m-}[m
[31m-static void luaK_goiffalse(FuncState*fs,expdesc*e){[m
[31m-int pc;[m
[31m-luaK_dischargevars(fs,e);[m
[31m-switch(e->k){[m
[31m-case VNIL:case VFALSE:{[m
[31m-pc=(-1);[m
[31m-break;[m
[31m-}[m
[31m-case VJMP:{[m
[31m-pc=e->u.s.info;[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-pc=jumponcond(fs,e,1);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-luaK_concat(fs,&e->t,pc);[m
[31m-luaK_patchtohere(fs,e->f);[m
[31m-e->f=(-1);[m
[31m-}[m
[31m-static void codenot(FuncState*fs,expdesc*e){[m
[31m-luaK_dischargevars(fs,e);[m
[31m-switch(e->k){[m
[31m-case VNIL:case VFALSE:{[m
[31m-e->k=VTRUE;[m
[31m-break;[m
[31m-}[m
[31m-case VK:case VKNUM:case VTRUE:{[m
[31m-e->k=VFALSE;[m
[31m-break;[m
[31m-}[m
[31m-case VJMP:{[m
[31m-invertjump(fs,e);[m
[31m-break;[m
[31m-}[m
[31m-case VRELOCABLE:[m
[31m-case VNONRELOC:{[m
[31m-discharge2anyreg(fs,e);[m
[31m-freeexp(fs,e);[m
[31m-e->u.s.info=luaK_codeABC(fs,OP_NOT,0,e->u.s.info,0);[m
[31m-e->k=VRELOCABLE;[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-{int temp=e->f;e->f=e->t;e->t=temp;}[m
[31m-removevalues(fs,e->f);[m
[31m-removevalues(fs,e->t);[m
[31m-}[m
[31m-static void luaK_indexed(FuncState*fs,expdesc*t,expdesc*k){[m
[31m-t->u.s.aux=luaK_exp2RK(fs,k);[m
[31m-t->k=VINDEXED;[m
[31m-}[m
[31m-static int constfolding(OpCode op,expdesc*e1,expdesc*e2){[m
[31m-lua_Number v1,v2,r;[m
[31m-if(!isnumeral(e1)||!isnumeral(e2))return 0;[m
[31m-v1=e1->u.nval;[m
[31m-v2=e2->u.nval;[m
[31m-switch(op){[m
[31m-case OP_ADD:r=luai_numadd(v1,v2);break;[m
[31m-case OP_SUB:r=luai_numsub(v1,v2);break;[m
[31m-case OP_MUL:r=luai_nummul(v1,v2);break;[m
[31m-case OP_DIV:[m
[31m-if(v2==0)return 0;[m
[31m-r=luai_numdiv(v1,v2);break;[m
[31m-case OP_MOD:[m
[31m-if(v2==0)return 0;[m
[31m-r=luai_nummod(v1,v2);break;[m
[31m-case OP_POW:r=luai_numpow(v1,v2);break;[m
[31m-case OP_UNM:r=luai_numunm(v1);break;[m
[31m-case OP_LEN:return 0;[m
[31m-default:r=0;break;[m
[31m-}[m
[31m-if(luai_numisnan(r))return 0;[m
[31m-e1->u.nval=r;[m
[31m-return 1;[m
[31m-}[m
[31m-static void codearith(FuncState*fs,OpCode op,expdesc*e1,expdesc*e2){[m
[31m-if(constfolding(op,e1,e2))[m
[31m-return;[m
[31m-else{[m
[31m-int o2=(op!=OP_UNM&&op!=OP_LEN)?luaK_exp2RK(fs,e2):0;[m
[31m-int o1=luaK_exp2RK(fs,e1);[m
[31m-if(o1>o2){[m
[31m-freeexp(fs,e1);[m
[31m-freeexp(fs,e2);[m
[31m-}[m
[31m-else{[m
[31m-freeexp(fs,e2);[m
[31m-freeexp(fs,e1);[m
[31m-}[m
[31m-e1->u.s.info=luaK_codeABC(fs,op,0,o1,o2);[m
[31m-e1->k=VRELOCABLE;[m
[31m-}[m
[31m-}[m
[31m-static void codecomp(FuncState*fs,OpCode op,int cond,expdesc*e1,[m
[31m-expdesc*e2){[m
[31m-int o1=luaK_exp2RK(fs,e1);[m
[31m-int o2=luaK_exp2RK(fs,e2);[m
[31m-freeexp(fs,e2);[m
[31m-freeexp(fs,e1);[m
[31m-if(cond==0&&op!=OP_EQ){[m
[31m-int temp;[m
[31m-temp=o1;o1=o2;o2=temp;[m
[31m-cond=1;[m
[31m-}[m
[31m-e1->u.s.info=condjump(fs,op,cond,o1,o2);[m
[31m-e1->k=VJMP;[m
[31m-}[m
[31m-static void luaK_prefix(FuncState*fs,UnOpr op,expdesc*e){[m
[31m-expdesc e2;[m
[31m-e2.t=e2.f=(-1);e2.k=VKNUM;e2.u.nval=0;[m
[31m-switch(op){[m
[31m-case OPR_MINUS:{[m
[31m-if(!isnumeral(e))[m
[31m-luaK_exp2anyreg(fs,e);[m
[31m-codearith(fs,OP_UNM,e,&e2);[m
[31m-break;[m
[31m-}[m
[31m-case OPR_NOT:codenot(fs,e);break;[m
[31m-case OPR_LEN:{[m
[31m-luaK_exp2anyreg(fs,e);[m
[31m-codearith(fs,OP_LEN,e,&e2);[m
[31m-break;[m
[31m-}[m
[31m-default:;[m
[31m-}[m
[31m-}[m
[31m-static void luaK_infix(FuncState*fs,BinOpr op,expdesc*v){[m
[31m-switch(op){[m
[31m-case OPR_AND:{[m
[31m-luaK_goiftrue(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-case OPR_OR:{[m
[31m-luaK_goiffalse(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-case OPR_CONCAT:{[m
[31m-luaK_exp2nextreg(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-case OPR_ADD:case OPR_SUB:case OPR_MUL:case OPR_DIV:[m
[31m-case OPR_MOD:case OPR_POW:{[m
[31m-if(!isnumeral(v))luaK_exp2RK(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-luaK_exp2RK(fs,v);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void luaK_posfix(FuncState*fs,BinOpr op,expdesc*e1,expdesc*e2){[m
[31m-switch(op){[m
[31m-case OPR_AND:{[m
[31m-luaK_dischargevars(fs,e2);[m
[31m-luaK_concat(fs,&e2->f,e1->f);[m
[31m-*e1=*e2;[m
[31m-break;[m
[31m-}[m
[31m-case OPR_OR:{[m
[31m-luaK_dischargevars(fs,e2);[m
[31m-luaK_concat(fs,&e2->t,e1->t);[m
[31m-*e1=*e2;[m
[31m-break;[m
[31m-}[m
[31m-case OPR_CONCAT:{[m
[31m-luaK_exp2val(fs,e2);[m
[31m-if(e2->k==VRELOCABLE&&GET_OPCODE(getcode(fs,e2))==OP_CONCAT){[m
[31m-freeexp(fs,e1);[m
[31m-SETARG_B(getcode(fs,e2),e1->u.s.info);[m
[31m-e1->k=VRELOCABLE;e1->u.s.info=e2->u.s.info;[m
[31m-}[m
[31m-else{[m
[31m-luaK_exp2nextreg(fs,e2);[m
[31m-codearith(fs,OP_CONCAT,e1,e2);[m
[31m-}[m
[31m-break;[m
[31m-}[m
[31m-case OPR_ADD:codearith(fs,OP_ADD,e1,e2);break;[m
[31m-case OPR_SUB:codearith(fs,OP_SUB,e1,e2);break;[m
[31m-case OPR_MUL:codearith(fs,OP_MUL,e1,e2);break;[m
[31m-case OPR_DIV:codearith(fs,OP_DIV,e1,e2);break;[m
[31m-case OPR_MOD:codearith(fs,OP_MOD,e1,e2);break;[m
[31m-case OPR_POW:codearith(fs,OP_POW,e1,e2);break;[m
[31m-case OPR_EQ:codecomp(fs,OP_EQ,1,e1,e2);break;[m
[31m-case OPR_NE:codecomp(fs,OP_EQ,0,e1,e2);break;[m
[31m-case OPR_LT:codecomp(fs,OP_LT,1,e1,e2);break;[m
[31m-case OPR_LE:codecomp(fs,OP_LE,1,e1,e2);break;[m
[31m-case OPR_GT:codecomp(fs,OP_LT,0,e1,e2);break;[m
[31m-case OPR_GE:codecomp(fs,OP_LE,0,e1,e2);break;[m
[31m-default:;[m
[31m-}[m
[31m-}[m
[31m-static void luaK_fixline(FuncState*fs,int line){[m
[31m-fs->f->lineinfo[fs->pc-1]=line;[m
[31m-}[m
[31m-static int luaK_code(FuncState*fs,Instruction i,int line){[m
[31m-Proto*f=fs->f;[m
[31m-dischargejpc(fs);[m
[31m-luaM_growvector(fs->L,f->code,fs->pc,f->sizecode,Instruction,[m
[31m-(INT_MAX-2),"code size overflow");[m
[31m-f->code[fs->pc]=i;[m
[31m-luaM_growvector(fs->L,f->lineinfo,fs->pc,f->sizelineinfo,int,[m
[31m-(INT_MAX-2),"code size overflow");[m
[31m-f->lineinfo[fs->pc]=line;[m
[31m-return fs->pc++;[m
[31m-}[m
[31m-static int luaK_codeABC(FuncState*fs,OpCode o,int a,int b,int c){[m
[31m-return luaK_code(fs,CREATE_ABC(o,a,b,c),fs->ls->lastline);[m
[31m-}[m
[31m-static int luaK_codeABx(FuncState*fs,OpCode o,int a,unsigned int bc){[m
[31m-return luaK_code(fs,CREATE_ABx(o,a,bc),fs->ls->lastline);[m
[31m-}[m
[31m-static void luaK_setlist(FuncState*fs,int base,int nelems,int tostore){[m
[31m-int c=(nelems-1)/50+1;[m
[31m-int b=(tostore==(-1))?0:tostore;[m
[31m-if(c<=((1<<9)-1))[m
[31m-luaK_codeABC(fs,OP_SETLIST,base,b,c);[m
[31m-else{[m
[31m-luaK_codeABC(fs,OP_SETLIST,base,b,0);[m
[31m-luaK_code(fs,cast(Instruction,c),fs->ls->lastline);[m
[31m-}[m
[31m-fs->freereg=base+1;[m
[31m-}[m
[31m-#define hasmultret(k)((k)==VCALL||(k)==VVARARG)[m
[31m-#define getlocvar(fs,i)((fs)->f->locvars[(fs)->actvar[i]])[m
[31m-#define luaY_checklimit(fs,v,l,m)if((v)>(l))errorlimit(fs,l,m)[m
[31m-typedef struct BlockCnt{[m
[31m-struct BlockCnt*previous;[m
[31m-int breaklist;[m
[31m-lu_byte nactvar;[m
[31m-lu_byte upval;[m
[31m-lu_byte isbreakable;[m
[31m-}BlockCnt;[m
[31m-static void chunk(LexState*ls);[m
[31m-static void expr(LexState*ls,expdesc*v);[m
[31m-static void anchor_token(LexState*ls){[m
[31m-if(ls->t.token==TK_NAME||ls->t.token==TK_STRING){[m
[31m-TString*ts=ls->t.seminfo.ts;[m
[31m-luaX_newstring(ls,getstr(ts),ts->tsv.len);[m
[31m-}[m
[31m-}[m
[31m-static void error_expected(LexState*ls,int token){[m
[31m-luaX_syntaxerror(ls,[m
[31m-luaO_pushfstring(ls->L,LUA_QL("%s")" expected",luaX_token2str(ls,token)));[m
[31m-}[m
[31m-static void errorlimit(FuncState*fs,int limit,const char*what){[m
[31m-const char*msg=(fs->f->linedefined==0)?[m
[31m-luaO_pushfstring(fs->L,"main function has more than %d %s",limit,what):[m
[31m-luaO_pushfstring(fs->L,"function at line %d has more than %d %s",[m
[31m-fs->f->linedefined,limit,what);[m
[31m-luaX_lexerror(fs->ls,msg,0);[m
[31m-}[m
[31m-static int testnext(LexState*ls,int c){[m
[31m-if(ls->t.token==c){[m
[31m-luaX_next(ls);[m
[31m-return 1;[m
[31m-}[m
[31m-else return 0;[m
[31m-}[m
[31m-static void check(LexState*ls,int c){[m
[31m-if(ls->t.token!=c)[m
[31m-error_expected(ls,c);[m
[31m-}[m
[31m-static void checknext(LexState*ls,int c){[m
[31m-check(ls,c);[m
[31m-luaX_next(ls);[m
[31m-}[m
[31m-#define check_condition(ls,c,msg){if(!(c))luaX_syntaxerror(ls,msg);}[m
[31m-static void check_match(LexState*ls,int what,int who,int where){[m
[31m-if(!testnext(ls,what)){[m
[31m-if(where==ls->linenumber)[m
[31m-error_expected(ls,what);[m
[31m-else{[m
[31m-luaX_syntaxerror(ls,luaO_pushfstring(ls->L,[m
[31m-LUA_QL("%s")" expected (to close "LUA_QL("%s")" at line %d)",[m
[31m-luaX_token2str(ls,what),luaX_token2str(ls,who),where));[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static TString*str_checkname(LexState*ls){[m
[31m-TString*ts;[m
[31m-check(ls,TK_NAME);[m
[31m-ts=ls->t.seminfo.ts;[m
[31m-luaX_next(ls);[m
[31m-return ts;[m
[31m-}[m
[31m-static void init_exp(expdesc*e,expkind k,int i){[m
[31m-e->f=e->t=(-1);[m
[31m-e->k=k;[m
[31m-e->u.s.info=i;[m
[31m-}[m
[31m-static void codestring(LexState*ls,expdesc*e,TString*s){[m
[31m-init_exp(e,VK,luaK_stringK(ls->fs,s));[m
[31m-}[m
[31m-static void checkname(LexState*ls,expdesc*e){[m
[31m-codestring(ls,e,str_checkname(ls));[m
[31m-}[m
[31m-static int registerlocalvar(LexState*ls,TString*varname){[m
[31m-FuncState*fs=ls->fs;[m
[31m-Proto*f=fs->f;[m
[31m-int oldsize=f->sizelocvars;[m
[31m-luaM_growvector(ls->L,f->locvars,fs->nlocvars,f->sizelocvars,[m
[31m-LocVar,SHRT_MAX,"too many local variables");[m
[31m-while(oldsize<f->sizelocvars)f->locvars[oldsize++].varname=NULL;[m
[31m-f->locvars[fs->nlocvars].varname=varname;[m
[31m-luaC_objbarrier(ls->L,f,varname);[m
[31m-return fs->nlocvars++;[m
[31m-}[m
[31m-#define new_localvarliteral(ls,v,n)new_localvar(ls,luaX_newstring(ls,""v,(sizeof(v)/sizeof(char))-1),n)[m
[31m-static void new_localvar(LexState*ls,TString*name,int n){[m
[31m-FuncState*fs=ls->fs;[m
[31m-luaY_checklimit(fs,fs->nactvar+n+1,200,"local variables");[m
[31m-fs->actvar[fs->nactvar+n]=cast(unsigned short,registerlocalvar(ls,name));[m
[31m-}[m
[31m-static void adjustlocalvars(LexState*ls,int nvars){[m
[31m-FuncState*fs=ls->fs;[m
[31m-fs->nactvar=cast_byte(fs->nactvar+nvars);[m
[31m-for(;nvars;nvars--){[m
[31m-getlocvar(fs,fs->nactvar-nvars).startpc=fs->pc;[m
[31m-}[m
[31m-}[m
[31m-static void removevars(LexState*ls,int tolevel){[m
[31m-FuncState*fs=ls->fs;[m
[31m-while(fs->nactvar>tolevel)[m
[31m-getlocvar(fs,--fs->nactvar).endpc=fs->pc;[m
[31m-}[m
[31m-static int indexupvalue(FuncState*fs,TString*name,expdesc*v){[m
[31m-int i;[m
[31m-Proto*f=fs->f;[m
[31m-int oldsize=f->sizeupvalues;[m
[31m-for(i=0;i<f->nups;i++){[m
[31m-if(fs->upvalues[i].k==v->k&&fs->upvalues[i].info==v->u.s.info){[m
[31m-return i;[m
[31m-}[m
[31m-}[m
[31m-luaY_checklimit(fs,f->nups+1,60,"upvalues");[m
[31m-luaM_growvector(fs->L,f->upvalues,f->nups,f->sizeupvalues,[m
[31m-TString*,(INT_MAX-2),"");[m
[31m-while(oldsize<f->sizeupvalues)f->upvalues[oldsize++]=NULL;[m
[31m-f->upvalues[f->nups]=name;[m
[31m-luaC_objbarrier(fs->L,f,name);[m
[31m-fs->upvalues[f->nups].k=cast_byte(v->k);[m
[31m-fs->upvalues[f->nups].info=cast_byte(v->u.s.info);[m
[31m-return f->nups++;[m
[31m-}[m
[31m-static int searchvar(FuncState*fs,TString*n){[m
[31m-int i;[m
[31m-for(i=fs->nactvar-1;i>=0;i--){[m
[31m-if(n==getlocvar(fs,i).varname)[m
[31m-return i;[m
[31m-}[m
[31m-return-1;[m
[31m-}[m
[31m-static void markupval(FuncState*fs,int level){[m
[31m-BlockCnt*bl=fs->bl;[m
[31m-while(bl&&bl->nactvar>level)bl=bl->previous;[m
[31m-if(bl)bl->upval=1;[m
[31m-}[m
[31m-static int singlevaraux(FuncState*fs,TString*n,expdesc*var,int base){[m
[31m-if(fs==NULL){[m
[31m-init_exp(var,VGLOBAL,((1<<8)-1));[m
[31m-return VGLOBAL;[m
[31m-}[m
[31m-else{[m
[31m-int v=searchvar(fs,n);[m
[31m-if(v>=0){[m
[31m-init_exp(var,VLOCAL,v);[m
[31m-if(!base)[m
[31m-markupval(fs,v);[m
[31m-return VLOCAL;[m
[31m-}[m
[31m-else{[m
[31m-if(singlevaraux(fs->prev,n,var,0)==VGLOBAL)[m
[31m-return VGLOBAL;[m
[31m-var->u.s.info=indexupvalue(fs,n,var);[m
[31m-var->k=VUPVAL;[m
[31m-return VUPVAL;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void singlevar(LexState*ls,expdesc*var){[m
[31m-TString*varname=str_checkname(ls);[m
[31m-FuncState*fs=ls->fs;[m
[31m-if(singlevaraux(fs,varname,var,1)==VGLOBAL)[m
[31m-var->u.s.info=luaK_stringK(fs,varname);[m
[31m-}[m
[31m-static void adjust_assign(LexState*ls,int nvars,int nexps,expdesc*e){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int extra=nvars-nexps;[m
[31m-if(hasmultret(e->k)){[m
[31m-extra++;[m
[31m-if(extra<0)extra=0;[m
[31m-luaK_setreturns(fs,e,extra);[m
[31m-if(extra>1)luaK_reserveregs(fs,extra-1);[m
[31m-}[m
[31m-else{[m
[31m-if(e->k!=VVOID)luaK_exp2nextreg(fs,e);[m
[31m-if(extra>0){[m
[31m-int reg=fs->freereg;[m
[31m-luaK_reserveregs(fs,extra);[m
[31m-luaK_nil(fs,reg,extra);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void enterlevel(LexState*ls){[m
[31m-if(++ls->L->nCcalls>200)[m
[31m-luaX_lexerror(ls,"chunk has too many syntax levels",0);[m
[31m-}[m
[31m-#define leavelevel(ls)((ls)->L->nCcalls--)[m
[31m-static void enterblock(FuncState*fs,BlockCnt*bl,lu_byte isbreakable){[m
[31m-bl->breaklist=(-1);[m
[31m-bl->isbreakable=isbreakable;[m
[31m-bl->nactvar=fs->nactvar;[m
[31m-bl->upval=0;[m
[31m-bl->previous=fs->bl;[m
[31m-fs->bl=bl;[m
[31m-}[m
[31m-static void leaveblock(FuncState*fs){[m
[31m-BlockCnt*bl=fs->bl;[m
[31m-fs->bl=bl->previous;[m
[31m-removevars(fs->ls,bl->nactvar);[m
[31m-if(bl->upval)[m
[31m-luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0);[m
[31m-fs->freereg=fs->nactvar;[m
[31m-luaK_patchtohere(fs,bl->breaklist);[m
[31m-}[m
[31m-static void pushclosure(LexState*ls,FuncState*func,expdesc*v){[m
[31m-FuncState*fs=ls->fs;[m
[31m-Proto*f=fs->f;[m
[31m-int oldsize=f->sizep;[m
[31m-int i;[m
[31m-luaM_growvector(ls->L,f->p,fs->np,f->sizep,Proto*,[m
[31m-((1<<(9+9))-1),"constant table overflow");[m
[31m-while(oldsize<f->sizep)f->p[oldsize++]=NULL;[m
[31m-f->p[fs->np++]=func->f;[m
[31m-luaC_objbarrier(ls->L,f,func->f);[m
[31m-init_exp(v,VRELOCABLE,luaK_codeABx(fs,OP_CLOSURE,0,fs->np-1));[m
[31m-for(i=0;i<func->f->nups;i++){[m
[31m-OpCode o=(func->upvalues[i].k==VLOCAL)?OP_MOVE:OP_GETUPVAL;[m
[31m-luaK_codeABC(fs,o,0,func->upvalues[i].info,0);[m
[31m-}[m
[31m-}[m
[31m-static void open_func(LexState*ls,FuncState*fs){[m
[31m-lua_State*L=ls->L;[m
[31m-Proto*f=luaF_newproto(L);[m
[31m-fs->f=f;[m
[31m-fs->prev=ls->fs;[m
[31m-fs->ls=ls;[m
[31m-fs->L=L;[m
[31m-ls->fs=fs;[m
[31m-fs->pc=0;[m
[31m-fs->lasttarget=-1;[m
[31m-fs->jpc=(-1);[m
[31m-fs->freereg=0;[m
[31m-fs->nk=0;[m
[31m-fs->np=0;[m
[31m-fs->nlocvars=0;[m
[31m-fs->nactvar=0;[m
[31m-fs->bl=NULL;[m
[31m-f->source=ls->source;[m
[31m-f->maxstacksize=2;[m
[31m-fs->h=luaH_new(L,0,0);[m
[31m-sethvalue(L,L->top,fs->h);[m
[31m-incr_top(L);[m
[31m-setptvalue(L,L->top,f);[m
[31m-incr_top(L);[m
[31m-}[m
[31m-static void close_func(LexState*ls){[m
[31m-lua_State*L=ls->L;[m
[31m-FuncState*fs=ls->fs;[m
[31m-Proto*f=fs->f;[m
[31m-removevars(ls,0);[m
[31m-luaK_ret(fs,0,0);[m
[31m-luaM_reallocvector(L,f->code,f->sizecode,fs->pc,Instruction);[m
[31m-f->sizecode=fs->pc;[m
[31m-luaM_reallocvector(L,f->lineinfo,f->sizelineinfo,fs->pc,int);[m
[31m-f->sizelineinfo=fs->pc;[m
[31m-luaM_reallocvector(L,f->k,f->sizek,fs->nk,TValue);[m
[31m-f->sizek=fs->nk;[m
[31m-luaM_reallocvector(L,f->p,f->sizep,fs->np,Proto*);[m
[31m-f->sizep=fs->np;[m
[31m-luaM_reallocvector(L,f->locvars,f->sizelocvars,fs->nlocvars,LocVar);[m
[31m-f->sizelocvars=fs->nlocvars;[m
[31m-luaM_reallocvector(L,f->upvalues,f->sizeupvalues,f->nups,TString*);[m
[31m-f->sizeupvalues=f->nups;[m
[31m-ls->fs=fs->prev;[m
[31m-if(fs)anchor_token(ls);[m
[31m-L->top-=2;[m
[31m-}[m
[31m-static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,const char*name){[m
[31m-struct LexState lexstate;[m
[31m-struct FuncState funcstate;[m
[31m-lexstate.buff=buff;[m
[31m-luaX_setinput(L,&lexstate,z,luaS_new(L,name));[m
[31m-open_func(&lexstate,&funcstate);[m
[31m-funcstate.f->is_vararg=2;[m
[31m-luaX_next(&lexstate);[m
[31m-chunk(&lexstate);[m
[31m-check(&lexstate,TK_EOS);[m
[31m-close_func(&lexstate);[m
[31m-return funcstate.f;[m
[31m-}[m
[31m-static void field(LexState*ls,expdesc*v){[m
[31m-FuncState*fs=ls->fs;[m
[31m-expdesc key;[m
[31m-luaK_exp2anyreg(fs,v);[m
[31m-luaX_next(ls);[m
[31m-checkname(ls,&key);[m
[31m-luaK_indexed(fs,v,&key);[m
[31m-}[m
[31m-static void yindex(LexState*ls,expdesc*v){[m
[31m-luaX_next(ls);[m
[31m-expr(ls,v);[m
[31m-luaK_exp2val(ls->fs,v);[m
[31m-checknext(ls,']');[m
[31m-}[m
[31m-struct ConsControl{[m
[31m-expdesc v;[m
[31m-expdesc*t;[m
[31m-int nh;[m
[31m-int na;[m
[31m-int tostore;[m
[31m-};[m
[31m-static void recfield(LexState*ls,struct ConsControl*cc){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int reg=ls->fs->freereg;[m
[31m-expdesc key,val;[m
[31m-int rkkey;[m
[31m-if(ls->t.token==TK_NAME){[m
[31m-luaY_checklimit(fs,cc->nh,(INT_MAX-2),"items in a constructor");[m
[31m-checkname(ls,&key);[m
[31m-}[m
[31m-else[m
[31m-yindex(ls,&key);[m
[31m-cc->nh++;[m
[31m-checknext(ls,'=');[m
[31m-rkkey=luaK_exp2RK(fs,&key);[m
[31m-expr(ls,&val);[m
[31m-luaK_codeABC(fs,OP_SETTABLE,cc->t->u.s.info,rkkey,luaK_exp2RK(fs,&val));[m
[31m-fs->freereg=reg;[m
[31m-}[m
[31m-static void closelistfield(FuncState*fs,struct ConsControl*cc){[m
[31m-if(cc->v.k==VVOID)return;[m
[31m-luaK_exp2nextreg(fs,&cc->v);[m
[31m-cc->v.k=VVOID;[m
[31m-if(cc->tostore==50){[m
[31m-luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore);[m
[31m-cc->tostore=0;[m
[31m-}[m
[31m-}[m
[31m-static void lastlistfield(FuncState*fs,struct ConsControl*cc){[m
[31m-if(cc->tostore==0)return;[m
[31m-if(hasmultret(cc->v.k)){[m
[31m-luaK_setmultret(fs,&cc->v);[m
[31m-luaK_setlist(fs,cc->t->u.s.info,cc->na,(-1));[m
[31m-cc->na--;[m
[31m-}[m
[31m-else{[m
[31m-if(cc->v.k!=VVOID)[m
[31m-luaK_exp2nextreg(fs,&cc->v);[m
[31m-luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore);[m
[31m-}[m
[31m-}[m
[31m-static void listfield(LexState*ls,struct ConsControl*cc){[m
[31m-expr(ls,&cc->v);[m
[31m-luaY_checklimit(ls->fs,cc->na,(INT_MAX-2),"items in a constructor");[m
[31m-cc->na++;[m
[31m-cc->tostore++;[m
[31m-}[m
[31m-static void constructor(LexState*ls,expdesc*t){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int line=ls->linenumber;[m
[31m-int pc=luaK_codeABC(fs,OP_NEWTABLE,0,0,0);[m
[31m-struct ConsControl cc;[m
[31m-cc.na=cc.nh=cc.tostore=0;[m
[31m-cc.t=t;[m
[31m-init_exp(t,VRELOCABLE,pc);[m
[31m-init_exp(&cc.v,VVOID,0);[m
[31m-luaK_exp2nextreg(ls->fs,t);[m
[31m-checknext(ls,'{');[m
[31m-do{[m
[31m-if(ls->t.token=='}')break;[m
[31m-closelistfield(fs,&cc);[m
[31m-switch(ls->t.token){[m
[31m-case TK_NAME:{[m
[31m-luaX_lookahead(ls);[m
[31m-if(ls->lookahead.token!='=')[m
[31m-listfield(ls,&cc);[m
[31m-else[m
[31m-recfield(ls,&cc);[m
[31m-break;[m
[31m-}[m
[31m-case'[':{[m
[31m-recfield(ls,&cc);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-listfield(ls,&cc);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-}while(testnext(ls,',')||testnext(ls,';'));[m
[31m-check_match(ls,'}','{',line);[m
[31m-lastlistfield(fs,&cc);[m
[31m-SETARG_B(fs->f->code[pc],luaO_int2fb(cc.na));[m
[31m-SETARG_C(fs->f->code[pc],luaO_int2fb(cc.nh));[m
[31m-}[m
[31m-static void parlist(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-Proto*f=fs->f;[m
[31m-int nparams=0;[m
[31m-f->is_vararg=0;[m
[31m-if(ls->t.token!=')'){[m
[31m-do{[m
[31m-switch(ls->t.token){[m
[31m-case TK_NAME:{[m
[31m-new_localvar(ls,str_checkname(ls),nparams++);[m
[31m-break;[m
[31m-}[m
[31m-case TK_DOTS:{[m
[31m-luaX_next(ls);[m
[31m-f->is_vararg|=2;[m
[31m-break;[m
[31m-}[m
[31m-default:luaX_syntaxerror(ls,"<name> or "LUA_QL("...")" expected");[m
[31m-}[m
[31m-}while(!f->is_vararg&&testnext(ls,','));[m
[31m-}[m
[31m-adjustlocalvars(ls,nparams);[m
[31m-f->numparams=cast_byte(fs->nactvar-(f->is_vararg&1));[m
[31m-luaK_reserveregs(fs,fs->nactvar);[m
[31m-}[m
[31m-static void body(LexState*ls,expdesc*e,int needself,int line){[m
[31m-FuncState new_fs;[m
[31m-open_func(ls,&new_fs);[m
[31m-new_fs.f->linedefined=line;[m
[31m-checknext(ls,'(');[m
[31m-if(needself){[m
[31m-new_localvarliteral(ls,"self",0);[m
[31m-adjustlocalvars(ls,1);[m
[31m-}[m
[31m-parlist(ls);[m
[31m-checknext(ls,')');[m
[31m-chunk(ls);[m
[31m-new_fs.f->lastlinedefined=ls->linenumber;[m
[31m-check_match(ls,TK_END,TK_FUNCTION,line);[m
[31m-close_func(ls);[m
[31m-pushclosure(ls,&new_fs,e);[m
[31m-}[m
[31m-static int explist1(LexState*ls,expdesc*v){[m
[31m-int n=1;[m
[31m-expr(ls,v);[m
[31m-while(testnext(ls,',')){[m
[31m-luaK_exp2nextreg(ls->fs,v);[m
[31m-expr(ls,v);[m
[31m-n++;[m
[31m-}[m
[31m-return n;[m
[31m-}[m
[31m-static void funcargs(LexState*ls,expdesc*f){[m
[31m-FuncState*fs=ls->fs;[m
[31m-expdesc args;[m
[31m-int base,nparams;[m
[31m-int line=ls->linenumber;[m
[31m-switch(ls->t.token){[m
[31m-case'(':{[m
[31m-if(line!=ls->lastline)[m
[31m-luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)");[m
[31m-luaX_next(ls);[m
[31m-if(ls->t.token==')')[m
[31m-args.k=VVOID;[m
[31m-else{[m
[31m-explist1(ls,&args);[m
[31m-luaK_setmultret(fs,&args);[m
[31m-}[m
[31m-check_match(ls,')','(',line);[m
[31m-break;[m
[31m-}[m
[31m-case'{':{[m
[31m-constructor(ls,&args);[m
[31m-break;[m
[31m-}[m
[31m-case TK_STRING:{[m
[31m-codestring(ls,&args,ls->t.seminfo.ts);[m
[31m-luaX_next(ls);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-luaX_syntaxerror(ls,"function arguments expected");[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-base=f->u.s.info;[m
[31m-if(hasmultret(args.k))[m
[31m-nparams=(-1);[m
[31m-else{[m
[31m-if(args.k!=VVOID)[m
[31m-luaK_exp2nextreg(fs,&args);[m
[31m-nparams=fs->freereg-(base+1);[m
[31m-}[m
[31m-init_exp(f,VCALL,luaK_codeABC(fs,OP_CALL,base,nparams+1,2));[m
[31m-luaK_fixline(fs,line);[m
[31m-fs->freereg=base+1;[m
[31m-}[m
[31m-static void prefixexp(LexState*ls,expdesc*v){[m
[31m-switch(ls->t.token){[m
[31m-case'(':{[m
[31m-int line=ls->linenumber;[m
[31m-luaX_next(ls);[m
[31m-expr(ls,v);[m
[31m-check_match(ls,')','(',line);[m
[31m-luaK_dischargevars(ls->fs,v);[m
[31m-return;[m
[31m-}[m
[31m-case TK_NAME:{[m
[31m-singlevar(ls,v);[m
[31m-return;[m
[31m-}[m
[31m-default:{[m
[31m-luaX_syntaxerror(ls,"unexpected symbol");[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void primaryexp(LexState*ls,expdesc*v){[m
[31m-FuncState*fs=ls->fs;[m
[31m-prefixexp(ls,v);[m
[31m-for(;;){[m
[31m-switch(ls->t.token){[m
[31m-case'.':{[m
[31m-field(ls,v);[m
[31m-break;[m
[31m-}[m
[31m-case'[':{[m
[31m-expdesc key;[m
[31m-luaK_exp2anyreg(fs,v);[m
[31m-yindex(ls,&key);[m
[31m-luaK_indexed(fs,v,&key);[m
[31m-break;[m
[31m-}[m
[31m-case':':{[m
[31m-expdesc key;[m
[31m-luaX_next(ls);[m
[31m-checkname(ls,&key);[m
[31m-luaK_self(fs,v,&key);[m
[31m-funcargs(ls,v);[m
[31m-break;[m
[31m-}[m
[31m-case'(':case TK_STRING:case'{':{[m
[31m-luaK_exp2nextreg(fs,v);[m
[31m-funcargs(ls,v);[m
[31m-break;[m
[31m-}[m
[31m-default:return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void simpleexp(LexState*ls,expdesc*v){[m
[31m-switch(ls->t.token){[m
[31m-case TK_NUMBER:{[m
[31m-init_exp(v,VKNUM,0);[m
[31m-v->u.nval=ls->t.seminfo.r;[m
[31m-break;[m
[31m-}[m
[31m-case TK_STRING:{[m
[31m-codestring(ls,v,ls->t.seminfo.ts);[m
[31m-break;[m
[31m-}[m
[31m-case TK_NIL:{[m
[31m-init_exp(v,VNIL,0);[m
[31m-break;[m
[31m-}[m
[31m-case TK_TRUE:{[m
[31m-init_exp(v,VTRUE,0);[m
[31m-break;[m
[31m-}[m
[31m-case TK_FALSE:{[m
[31m-init_exp(v,VFALSE,0);[m
[31m-break;[m
[31m-}[m
[31m-case TK_DOTS:{[m
[31m-FuncState*fs=ls->fs;[m
[31m-check_condition(ls,fs->f->is_vararg,[m
[31m-"cannot use "LUA_QL("...")" outside a vararg function");[m
[31m-fs->f->is_vararg&=~4;[m
[31m-init_exp(v,VVARARG,luaK_codeABC(fs,OP_VARARG,0,1,0));[m
[31m-break;[m
[31m-}[m
[31m-case'{':{[m
[31m-constructor(ls,v);[m
[31m-return;[m
[31m-}[m
[31m-case TK_FUNCTION:{[m
[31m-luaX_next(ls);[m
[31m-body(ls,v,0,ls->linenumber);[m
[31m-return;[m
[31m-}[m
[31m-default:{[m
[31m-primaryexp(ls,v);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-luaX_next(ls);[m
[31m-}[m
[31m-static UnOpr getunopr(int op){[m
[31m-switch(op){[m
[31m-case TK_NOT:return OPR_NOT;[m
[31m-case'-':return OPR_MINUS;[m
[31m-case'#':return OPR_LEN;[m
[31m-default:return OPR_NOUNOPR;[m
[31m-}[m
[31m-}[m
[31m-static BinOpr getbinopr(int op){[m
[31m-switch(op){[m
[31m-case'+':return OPR_ADD;[m
[31m-case'-':return OPR_SUB;[m
[31m-case'*':return OPR_MUL;[m
[31m-case'/':return OPR_DIV;[m
[31m-case'%':return OPR_MOD;[m
[31m-case'^':return OPR_POW;[m
[31m-case TK_CONCAT:return OPR_CONCAT;[m
[31m-case TK_NE:return OPR_NE;[m
[31m-case TK_EQ:return OPR_EQ;[m
[31m-case'<':return OPR_LT;[m
[31m-case TK_LE:return OPR_LE;[m
[31m-case'>':return OPR_GT;[m
[31m-case TK_GE:return OPR_GE;[m
[31m-case TK_AND:return OPR_AND;[m
[31m-case TK_OR:return OPR_OR;[m
[31m-default:return OPR_NOBINOPR;[m
[31m-}[m
[31m-}[m
[31m-static const struct{[m
[31m-lu_byte left;[m
[31m-lu_byte right;[m
[31m-}priority[]={[m
[31m-{6,6},{6,6},{7,7},{7,7},{7,7},[m
[31m-{10,9},{5,4},[m
[31m-{3,3},{3,3},[m
[31m-{3,3},{3,3},{3,3},{3,3},[m
[31m-{2,2},{1,1}[m
[31m-};[m
[31m-static BinOpr subexpr(LexState*ls,expdesc*v,unsigned int limit){[m
[31m-BinOpr op;[m
[31m-UnOpr uop;[m
[31m-enterlevel(ls);[m
[31m-uop=getunopr(ls->t.token);[m
[31m-if(uop!=OPR_NOUNOPR){[m
[31m-luaX_next(ls);[m
[31m-subexpr(ls,v,8);[m
[31m-luaK_prefix(ls->fs,uop,v);[m
[31m-}[m
[31m-else simpleexp(ls,v);[m
[31m-op=getbinopr(ls->t.token);[m
[31m-while(op!=OPR_NOBINOPR&&priority[op].left>limit){[m
[31m-expdesc v2;[m
[31m-BinOpr nextop;[m
[31m-luaX_next(ls);[m
[31m-luaK_infix(ls->fs,op,v);[m
[31m-nextop=subexpr(ls,&v2,priority[op].right);[m
[31m-luaK_posfix(ls->fs,op,v,&v2);[m
[31m-op=nextop;[m
[31m-}[m
[31m-leavelevel(ls);[m
[31m-return op;[m
[31m-}[m
[31m-static void expr(LexState*ls,expdesc*v){[m
[31m-subexpr(ls,v,0);[m
[31m-}[m
[31m-static int block_follow(int token){[m
[31m-switch(token){[m
[31m-case TK_ELSE:case TK_ELSEIF:case TK_END:[m
[31m-case TK_UNTIL:case TK_EOS:[m
[31m-return 1;[m
[31m-default:return 0;[m
[31m-}[m
[31m-}[m
[31m-static void block(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-BlockCnt bl;[m
[31m-enterblock(fs,&bl,0);[m
[31m-chunk(ls);[m
[31m-leaveblock(fs);[m
[31m-}[m
[31m-struct LHS_assign{[m
[31m-struct LHS_assign*prev;[m
[31m-expdesc v;[m
[31m-};[m
[31m-static void check_conflict(LexState*ls,struct LHS_assign*lh,expdesc*v){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int extra=fs->freereg;[m
[31m-int conflict=0;[m
[31m-for(;lh;lh=lh->prev){[m
[31m-if(lh->v.k==VINDEXED){[m
[31m-if(lh->v.u.s.info==v->u.s.info){[m
[31m-conflict=1;[m
[31m-lh->v.u.s.info=extra;[m
[31m-}[m
[31m-if(lh->v.u.s.aux==v->u.s.info){[m
[31m-conflict=1;[m
[31m-lh->v.u.s.aux=extra;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-if(conflict){[m
[31m-luaK_codeABC(fs,OP_MOVE,fs->freereg,v->u.s.info,0);[m
[31m-luaK_reserveregs(fs,1);[m
[31m-}[m
[31m-}[m
[31m-static void assignment(LexState*ls,struct LHS_assign*lh,int nvars){[m
[31m-expdesc e;[m
[31m-check_condition(ls,VLOCAL<=lh->v.k&&lh->v.k<=VINDEXED,[m
[31m-"syntax error");[m
[31m-if(testnext(ls,',')){[m
[31m-struct LHS_assign nv;[m
[31m-nv.prev=lh;[m
[31m-primaryexp(ls,&nv.v);[m
[31m-if(nv.v.k==VLOCAL)[m
[31m-check_conflict(ls,lh,&nv.v);[m
[31m-luaY_checklimit(ls->fs,nvars,200-ls->L->nCcalls,[m
[31m-"variables in assignment");[m
[31m-assignment(ls,&nv,nvars+1);[m
[31m-}[m
[31m-else{[m
[31m-int nexps;[m
[31m-checknext(ls,'=');[m
[31m-nexps=explist1(ls,&e);[m
[31m-if(nexps!=nvars){[m
[31m-adjust_assign(ls,nvars,nexps,&e);[m
[31m-if(nexps>nvars)[m
[31m-ls->fs->freereg-=nexps-nvars;[m
[31m-}[m
[31m-else{[m
[31m-luaK_setoneret(ls->fs,&e);[m
[31m-luaK_storevar(ls->fs,&lh->v,&e);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-init_exp(&e,VNONRELOC,ls->fs->freereg-1);[m
[31m-luaK_storevar(ls->fs,&lh->v,&e);[m
[31m-}[m
[31m-static int cond(LexState*ls){[m
[31m-expdesc v;[m
[31m-expr(ls,&v);[m
[31m-if(v.k==VNIL)v.k=VFALSE;[m
[31m-luaK_goiftrue(ls->fs,&v);[m
[31m-return v.f;[m
[31m-}[m
[31m-static void breakstat(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-BlockCnt*bl=fs->bl;[m
[31m-int upval=0;[m
[31m-while(bl&&!bl->isbreakable){[m
[31m-upval|=bl->upval;[m
[31m-bl=bl->previous;[m
[31m-}[m
[31m-if(!bl)[m
[31m-luaX_syntaxerror(ls,"no loop to break");[m
[31m-if(upval)[m
[31m-luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0);[m
[31m-luaK_concat(fs,&bl->breaklist,luaK_jump(fs));[m
[31m-}[m
[31m-static void whilestat(LexState*ls,int line){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int whileinit;[m
[31m-int condexit;[m
[31m-BlockCnt bl;[m
[31m-luaX_next(ls);[m
[31m-whileinit=luaK_getlabel(fs);[m
[31m-condexit=cond(ls);[m
[31m-enterblock(fs,&bl,1);[m
[31m-checknext(ls,TK_DO);[m
[31m-block(ls);[m
[31m-luaK_patchlist(fs,luaK_jump(fs),whileinit);[m
[31m-check_match(ls,TK_END,TK_WHILE,line);[m
[31m-leaveblock(fs);[m
[31m-luaK_patchtohere(fs,condexit);[m
[31m-}[m
[31m-static void repeatstat(LexState*ls,int line){[m
[31m-int condexit;[m
[31m-FuncState*fs=ls->fs;[m
[31m-int repeat_init=luaK_getlabel(fs);[m
[31m-BlockCnt bl1,bl2;[m
[31m-enterblock(fs,&bl1,1);[m
[31m-enterblock(fs,&bl2,0);[m
[31m-luaX_next(ls);[m
[31m-chunk(ls);[m
[31m-check_match(ls,TK_UNTIL,TK_REPEAT,line);[m
[31m-condexit=cond(ls);[m
[31m-if(!bl2.upval){[m
[31m-leaveblock(fs);[m
[31m-luaK_patchlist(ls->fs,condexit,repeat_init);[m
[31m-}[m
[31m-else{[m
[31m-breakstat(ls);[m
[31m-luaK_patchtohere(ls->fs,condexit);[m
[31m-leaveblock(fs);[m
[31m-luaK_patchlist(ls->fs,luaK_jump(fs),repeat_init);[m
[31m-}[m
[31m-leaveblock(fs);[m
[31m-}[m
[31m-static int exp1(LexState*ls){[m
[31m-expdesc e;[m
[31m-int k;[m
[31m-expr(ls,&e);[m
[31m-k=e.k;[m
[31m-luaK_exp2nextreg(ls->fs,&e);[m
[31m-return k;[m
[31m-}[m
[31m-static void forbody(LexState*ls,int base,int line,int nvars,int isnum){[m
[31m-BlockCnt bl;[m
[31m-FuncState*fs=ls->fs;[m
[31m-int prep,endfor;[m
[31m-adjustlocalvars(ls,3);[m
[31m-checknext(ls,TK_DO);[m
[31m-prep=isnum?luaK_codeAsBx(fs,OP_FORPREP,base,(-1)):luaK_jump(fs);[m
[31m-enterblock(fs,&bl,0);[m
[31m-adjustlocalvars(ls,nvars);[m
[31m-luaK_reserveregs(fs,nvars);[m
[31m-block(ls);[m
[31m-leaveblock(fs);[m
[31m-luaK_patchtohere(fs,prep);[m
[31m-endfor=(isnum)?luaK_codeAsBx(fs,OP_FORLOOP,base,(-1)):[m
[31m-luaK_codeABC(fs,OP_TFORLOOP,base,0,nvars);[m
[31m-luaK_fixline(fs,line);[m
[31m-luaK_patchlist(fs,(isnum?endfor:luaK_jump(fs)),prep+1);[m
[31m-}[m
[31m-static void fornum(LexState*ls,TString*varname,int line){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int base=fs->freereg;[m
[31m-new_localvarliteral(ls,"(for index)",0);[m
[31m-new_localvarliteral(ls,"(for limit)",1);[m
[31m-new_localvarliteral(ls,"(for step)",2);[m
[31m-new_localvar(ls,varname,3);[m
[31m-checknext(ls,'=');[m
[31m-exp1(ls);[m
[31m-checknext(ls,',');[m
[31m-exp1(ls);[m
[31m-if(testnext(ls,','))[m
[31m-exp1(ls);[m
[31m-else{[m
[31m-luaK_codeABx(fs,OP_LOADK,fs->freereg,luaK_numberK(fs,1));[m
[31m-luaK_reserveregs(fs,1);[m
[31m-}[m
[31m-forbody(ls,base,line,1,1);[m
[31m-}[m
[31m-static void forlist(LexState*ls,TString*indexname){[m
[31m-FuncState*fs=ls->fs;[m
[31m-expdesc e;[m
[31m-int nvars=0;[m
[31m-int line;[m
[31m-int base=fs->freereg;[m
[31m-new_localvarliteral(ls,"(for generator)",nvars++);[m
[31m-new_localvarliteral(ls,"(for state)",nvars++);[m
[31m-new_localvarliteral(ls,"(for control)",nvars++);[m
[31m-new_localvar(ls,indexname,nvars++);[m
[31m-while(testnext(ls,','))[m
[31m-new_localvar(ls,str_checkname(ls),nvars++);[m
[31m-checknext(ls,TK_IN);[m
[31m-line=ls->linenumber;[m
[31m-adjust_assign(ls,3,explist1(ls,&e),&e);[m
[31m-luaK_checkstack(fs,3);[m
[31m-forbody(ls,base,line,nvars-3,0);[m
[31m-}[m
[31m-static void forstat(LexState*ls,int line){[m
[31m-FuncState*fs=ls->fs;[m
[31m-TString*varname;[m
[31m-BlockCnt bl;[m
[31m-enterblock(fs,&bl,1);[m
[31m-luaX_next(ls);[m
[31m-varname=str_checkname(ls);[m
[31m-switch(ls->t.token){[m
[31m-case'=':fornum(ls,varname,line);break;[m
[31m-case',':case TK_IN:forlist(ls,varname);break;[m
[31m-default:luaX_syntaxerror(ls,LUA_QL("=")" or "LUA_QL("in")" expected");[m
[31m-}[m
[31m-check_match(ls,TK_END,TK_FOR,line);[m
[31m-leaveblock(fs);[m
[31m-}[m
[31m-static int test_then_block(LexState*ls){[m
[31m-int condexit;[m
[31m-luaX_next(ls);[m
[31m-condexit=cond(ls);[m
[31m-checknext(ls,TK_THEN);[m
[31m-block(ls);[m
[31m-return condexit;[m
[31m-}[m
[31m-static void ifstat(LexState*ls,int line){[m
[31m-FuncState*fs=ls->fs;[m
[31m-int flist;[m
[31m-int escapelist=(-1);[m
[31m-flist=test_then_block(ls);[m
[31m-while(ls->t.token==TK_ELSEIF){[m
[31m-luaK_concat(fs,&escapelist,luaK_jump(fs));[m
[31m-luaK_patchtohere(fs,flist);[m
[31m-flist=test_then_block(ls);[m
[31m-}[m
[31m-if(ls->t.token==TK_ELSE){[m
[31m-luaK_concat(fs,&escapelist,luaK_jump(fs));[m
[31m-luaK_patchtohere(fs,flist);[m
[31m-luaX_next(ls);[m
[31m-block(ls);[m
[31m-}[m
[31m-else[m
[31m-luaK_concat(fs,&escapelist,flist);[m
[31m-luaK_patchtohere(fs,escapelist);[m
[31m-check_match(ls,TK_END,TK_IF,line);[m
[31m-}[m
[31m-static void localfunc(LexState*ls){[m
[31m-expdesc v,b;[m
[31m-FuncState*fs=ls->fs;[m
[31m-new_localvar(ls,str_checkname(ls),0);[m
[31m-init_exp(&v,VLOCAL,fs->freereg);[m
[31m-luaK_reserveregs(fs,1);[m
[31m-adjustlocalvars(ls,1);[m
[31m-body(ls,&b,0,ls->linenumber);[m
[31m-luaK_storevar(fs,&v,&b);[m
[31m-getlocvar(fs,fs->nactvar-1).startpc=fs->pc;[m
[31m-}[m
[31m-static void localstat(LexState*ls){[m
[31m-int nvars=0;[m
[31m-int nexps;[m
[31m-expdesc e;[m
[31m-do{[m
[31m-new_localvar(ls,str_checkname(ls),nvars++);[m
[31m-}while(testnext(ls,','));[m
[31m-if(testnext(ls,'='))[m
[31m-nexps=explist1(ls,&e);[m
[31m-else{[m
[31m-e.k=VVOID;[m
[31m-nexps=0;[m
[31m-}[m
[31m-adjust_assign(ls,nvars,nexps,&e);[m
[31m-adjustlocalvars(ls,nvars);[m
[31m-}[m
[31m-static int funcname(LexState*ls,expdesc*v){[m
[31m-int needself=0;[m
[31m-singlevar(ls,v);[m
[31m-while(ls->t.token=='.')[m
[31m-field(ls,v);[m
[31m-if(ls->t.token==':'){[m
[31m-needself=1;[m
[31m-field(ls,v);[m
[31m-}[m
[31m-return needself;[m
[31m-}[m
[31m-static void funcstat(LexState*ls,int line){[m
[31m-int needself;[m
[31m-expdesc v,b;[m
[31m-luaX_next(ls);[m
[31m-needself=funcname(ls,&v);[m
[31m-body(ls,&b,needself,line);[m
[31m-luaK_storevar(ls->fs,&v,&b);[m
[31m-luaK_fixline(ls->fs,line);[m
[31m-}[m
[31m-static void exprstat(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-struct LHS_assign v;[m
[31m-primaryexp(ls,&v.v);[m
[31m-if(v.v.k==VCALL)[m
[31m-SETARG_C(getcode(fs,&v.v),1);[m
[31m-else{[m
[31m-v.prev=NULL;[m
[31m-assignment(ls,&v,1);[m
[31m-}[m
[31m-}[m
[31m-static void retstat(LexState*ls){[m
[31m-FuncState*fs=ls->fs;[m
[31m-expdesc e;[m
[31m-int first,nret;[m
[31m-luaX_next(ls);[m
[31m-if(block_follow(ls->t.token)||ls->t.token==';')[m
[31m-first=nret=0;[m
[31m-else{[m
[31m-nret=explist1(ls,&e);[m
[31m-if(hasmultret(e.k)){[m
[31m-luaK_setmultret(fs,&e);[m
[31m-if(e.k==VCALL&&nret==1){[m
[31m-SET_OPCODE(getcode(fs,&e),OP_TAILCALL);[m
[31m-}[m
[31m-first=fs->nactvar;[m
[31m-nret=(-1);[m
[31m-}[m
[31m-else{[m
[31m-if(nret==1)[m
[31m-first=luaK_exp2anyreg(fs,&e);[m
[31m-else{[m
[31m-luaK_exp2nextreg(fs,&e);[m
[31m-first=fs->nactvar;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-luaK_ret(fs,first,nret);[m
[31m-}[m
[31m-static int statement(LexState*ls){[m
[31m-int line=ls->linenumber;[m
[31m-switch(ls->t.token){[m
[31m-case TK_IF:{[m
[31m-ifstat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_WHILE:{[m
[31m-whilestat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_DO:{[m
[31m-luaX_next(ls);[m
[31m-block(ls);[m
[31m-check_match(ls,TK_END,TK_DO,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_FOR:{[m
[31m-forstat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_REPEAT:{[m
[31m-repeatstat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_FUNCTION:{[m
[31m-funcstat(ls,line);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_LOCAL:{[m
[31m-luaX_next(ls);[m
[31m-if(testnext(ls,TK_FUNCTION))[m
[31m-localfunc(ls);[m
[31m-else[m
[31m-localstat(ls);[m
[31m-return 0;[m
[31m-}[m
[31m-case TK_RETURN:{[m
[31m-retstat(ls);[m
[31m-return 1;[m
[31m-}[m
[31m-case TK_BREAK:{[m
[31m-luaX_next(ls);[m
[31m-breakstat(ls);[m
[31m-return 1;[m
[31m-}[m
[31m-default:{[m
[31m-exprstat(ls);[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void chunk(LexState*ls){[m
[31m-int islast=0;[m
[31m-enterlevel(ls);[m
[31m-while(!islast&&!block_follow(ls->t.token)){[m
[31m-islast=statement(ls);[m
[31m-testnext(ls,';');[m
[31m-ls->fs->freereg=ls->fs->nactvar;[m
[31m-}[m
[31m-leavelevel(ls);[m
[31m-}[m
[31m-static const TValue*luaV_tonumber(const TValue*obj,TValue*n){[m
[31m-lua_Number num;[m
[31m-if(ttisnumber(obj))return obj;[m
[31m-if(ttisstring(obj)&&luaO_str2d(svalue(obj),&num)){[m
[31m-setnvalue(n,num);[m
[31m-return n;[m
[31m-}[m
[31m-else[m
[31m-return NULL;[m
[31m-}[m
[31m-static int luaV_tostring(lua_State*L,StkId obj){[m
[31m-if(!ttisnumber(obj))[m
[31m-return 0;[m
[31m-else{[m
[31m-char s[32];[m
[31m-lua_Number n=nvalue(obj);[m
[31m-lua_number2str(s,n);[m
[31m-setsvalue(L,obj,luaS_new(L,s));[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static void callTMres(lua_State*L,StkId res,const TValue*f,[m
[31m-const TValue*p1,const TValue*p2){[m
[31m-ptrdiff_t result=savestack(L,res);[m
[31m-setobj(L,L->top,f);[m
[31m-setobj(L,L->top+1,p1);[m
[31m-setobj(L,L->top+2,p2);[m
[31m-luaD_checkstack(L,3);[m
[31m-L->top+=3;[m
[31m-luaD_call(L,L->top-3,1);[m
[31m-res=restorestack(L,result);[m
[31m-L->top--;[m
[31m-setobj(L,res,L->top);[m
[31m-}[m
[31m-static void callTM(lua_State*L,const TValue*f,const TValue*p1,[m
[31m-const TValue*p2,const TValue*p3){[m
[31m-setobj(L,L->top,f);[m
[31m-setobj(L,L->top+1,p1);[m
[31m-setobj(L,L->top+2,p2);[m
[31m-setobj(L,L->top+3,p3);[m
[31m-luaD_checkstack(L,4);[m
[31m-L->top+=4;[m
[31m-luaD_call(L,L->top-4,0);[m
[31m-}[m
[31m-static void luaV_gettable(lua_State*L,const TValue*t,TValue*key,StkId val){[m
[31m-int loop;[m
[31m-for(loop=0;loop<100;loop++){[m
[31m-const TValue*tm;[m
[31m-if(ttistable(t)){[m
[31m-Table*h=hvalue(t);[m
[31m-const TValue*res=luaH_get(h,key);[m
[31m-if(!ttisnil(res)||[m
[31m-(tm=fasttm(L,h->metatable,TM_INDEX))==NULL){[m
[31m-setobj(L,val,res);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_INDEX)))[m
[31m-luaG_typeerror(L,t,"index");[m
[31m-if(ttisfunction(tm)){[m
[31m-callTMres(L,val,tm,t,key);[m
[31m-return;[m
[31m-}[m
[31m-t=tm;[m
[31m-}[m
[31m-luaG_runerror(L,"loop in gettable");[m
[31m-}[m
[31m-static void luaV_settable(lua_State*L,const TValue*t,TValue*key,StkId val){[m
[31m-int loop;[m
[31m-TValue temp;[m
[31m-for(loop=0;loop<100;loop++){[m
[31m-const TValue*tm;[m
[31m-if(ttistable(t)){[m
[31m-Table*h=hvalue(t);[m
[31m-TValue*oldval=luaH_set(L,h,key);[m
[31m-if(!ttisnil(oldval)||[m
[31m-(tm=fasttm(L,h->metatable,TM_NEWINDEX))==NULL){[m
[31m-setobj(L,oldval,val);[m
[31m-h->flags=0;[m
[31m-luaC_barriert(L,h,val);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_NEWINDEX)))[m
[31m-luaG_typeerror(L,t,"index");[m
[31m-if(ttisfunction(tm)){[m
[31m-callTM(L,tm,t,key,val);[m
[31m-return;[m
[31m-}[m
[31m-setobj(L,&temp,tm);[m
[31m-t=&temp;[m
[31m-}[m
[31m-luaG_runerror(L,"loop in settable");[m
[31m-}[m
[31m-static int call_binTM(lua_State*L,const TValue*p1,const TValue*p2,[m
[31m-StkId res,TMS event){[m
[31m-const TValue*tm=luaT_gettmbyobj(L,p1,event);[m
[31m-if(ttisnil(tm))[m
[31m-tm=luaT_gettmbyobj(L,p2,event);[m
[31m-if(ttisnil(tm))return 0;[m
[31m-callTMres(L,res,tm,p1,p2);[m
[31m-return 1;[m
[31m-}[m
[31m-static const TValue*get_compTM(lua_State*L,Table*mt1,Table*mt2,[m
[31m-TMS event){[m
[31m-const TValue*tm1=fasttm(L,mt1,event);[m
[31m-const TValue*tm2;[m
[31m-if(tm1==NULL)return NULL;[m
[31m-if(mt1==mt2)return tm1;[m
[31m-tm2=fasttm(L,mt2,event);[m
[31m-if(tm2==NULL)return NULL;[m
[31m-if(luaO_rawequalObj(tm1,tm2))[m
[31m-return tm1;[m
[31m-return NULL;[m
[31m-}[m
[31m-static int call_orderTM(lua_State*L,const TValue*p1,const TValue*p2,[m
[31m-TMS event){[m
[31m-const TValue*tm1=luaT_gettmbyobj(L,p1,event);[m
[31m-const TValue*tm2;[m
[31m-if(ttisnil(tm1))return-1;[m
[31m-tm2=luaT_gettmbyobj(L,p2,event);[m
[31m-if(!luaO_rawequalObj(tm1,tm2))[m
[31m-return-1;[m
[31m-callTMres(L,L->top,tm1,p1,p2);[m
[31m-return!l_isfalse(L->top);[m
[31m-}[m
[31m-static int l_strcmp(const TString*ls,const TString*rs){[m
[31m-const char*l=getstr(ls);[m
[31m-size_t ll=ls->tsv.len;[m
[31m-const char*r=getstr(rs);[m
[31m-size_t lr=rs->tsv.len;[m
[31m-for(;;){[m
[31m-int temp=strcoll(l,r);[m
[31m-if(temp!=0)return temp;[m
[31m-else{[m
[31m-size_t len=strlen(l);[m
[31m-if(len==lr)[m
[31m-return(len==ll)?0:1;[m
[31m-else if(len==ll)[m
[31m-return-1;[m
[31m-len++;[m
[31m-l+=len;ll-=len;r+=len;lr-=len;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static int luaV_lessthan(lua_State*L,const TValue*l,const TValue*r){[m
[31m-int res;[m
[31m-if(ttype(l)!=ttype(r))[m
[31m-return luaG_ordererror(L,l,r);[m
[31m-else if(ttisnumber(l))[m
[31m-return luai_numlt(nvalue(l),nvalue(r));[m
[31m-else if(ttisstring(l))[m
[31m-return l_strcmp(rawtsvalue(l),rawtsvalue(r))<0;[m
[31m-else if((res=call_orderTM(L,l,r,TM_LT))!=-1)[m
[31m-return res;[m
[31m-return luaG_ordererror(L,l,r);[m
[31m-}[m
[31m-static int lessequal(lua_State*L,const TValue*l,const TValue*r){[m
[31m-int res;[m
[31m-if(ttype(l)!=ttype(r))[m
[31m-return luaG_ordererror(L,l,r);[m
[31m-else if(ttisnumber(l))[m
[31m-return luai_numle(nvalue(l),nvalue(r));[m
[31m-else if(ttisstring(l))[m
[31m-return l_strcmp(rawtsvalue(l),rawtsvalue(r))<=0;[m
[31m-else if((res=call_orderTM(L,l,r,TM_LE))!=-1)[m
[31m-return res;[m
[31m-else if((res=call_orderTM(L,r,l,TM_LT))!=-1)[m
[31m-return!res;[m
[31m-return luaG_ordererror(L,l,r);[m
[31m-}[m
[31m-static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2){[m
[31m-const TValue*tm;[m
[31m-switch(ttype(t1)){[m
[31m-case 0:return 1;[m
[31m-case 3:return luai_numeq(nvalue(t1),nvalue(t2));[m
[31m-case 1:return bvalue(t1)==bvalue(t2);[m
[31m-case 2:return pvalue(t1)==pvalue(t2);[m
[31m-case 7:{[m
[31m-if(uvalue(t1)==uvalue(t2))return 1;[m
[31m-tm=get_compTM(L,uvalue(t1)->metatable,uvalue(t2)->metatable,[m
[31m-TM_EQ);[m
[31m-break;[m
[31m-}[m
[31m-case 5:{[m
[31m-if(hvalue(t1)==hvalue(t2))return 1;[m
[31m-tm=get_compTM(L,hvalue(t1)->metatable,hvalue(t2)->metatable,TM_EQ);[m
[31m-break;[m
[31m-}[m
[31m-default:return gcvalue(t1)==gcvalue(t2);[m
[31m-}[m
[31m-if(tm==NULL)return 0;[m
[31m-callTMres(L,L->top,tm,t1,t2);[m
[31m-return!l_isfalse(L->top);[m
[31m-}[m
[31m-static void luaV_concat(lua_State*L,int total,int last){[m
[31m-do{[m
[31m-StkId top=L->base+last+1;[m
[31m-int n=2;[m
[31m-if(!(ttisstring(top-2)||ttisnumber(top-2))||!tostring(L,top-1)){[m
[31m-if(!call_binTM(L,top-2,top-1,top-2,TM_CONCAT))[m
[31m-luaG_concaterror(L,top-2,top-1);[m
[31m-}else if(tsvalue(top-1)->len==0)[m
[31m-(void)tostring(L,top-2);[m
[31m-else{[m
[31m-size_t tl=tsvalue(top-1)->len;[m
[31m-char*buffer;[m
[31m-int i;[m
[31m-for(n=1;n<total&&tostring(L,top-n-1);n++){[m
[31m-size_t l=tsvalue(top-n-1)->len;[m
[31m-if(l>=((size_t)(~(size_t)0)-2)-tl)luaG_runerror(L,"string length overflow");[m
[31m-tl+=l;[m
[31m-}[m
[31m-buffer=luaZ_openspace(L,&G(L)->buff,tl);[m
[31m-tl=0;[m
[31m-for(i=n;i>0;i--){[m
[31m-size_t l=tsvalue(top-i)->len;[m
[31m-memcpy(buffer+tl,svalue(top-i),l);[m
[31m-tl+=l;[m
[31m-}[m
[31m-setsvalue(L,top-n,luaS_newlstr(L,buffer,tl));[m
[31m-}[m
[31m-total-=n-1;[m
[31m-last-=n-1;[m
[31m-}while(total>1);[m
[31m-}[m
[31m-static void Arith(lua_State*L,StkId ra,const TValue*rb,[m
[31m-const TValue*rc,TMS op){[m
[31m-TValue tempb,tempc;[m
[31m-const TValue*b,*c;[m
[31m-if((b=luaV_tonumber(rb,&tempb))!=NULL&&[m
[31m-(c=luaV_tonumber(rc,&tempc))!=NULL){[m
[31m-lua_Number nb=nvalue(b),nc=nvalue(c);[m
[31m-switch(op){[m
[31m-case TM_ADD:setnvalue(ra,luai_numadd(nb,nc));break;[m
[31m-case TM_SUB:setnvalue(ra,luai_numsub(nb,nc));break;[m
[31m-case TM_MUL:setnvalue(ra,luai_nummul(nb,nc));break;[m
[31m-case TM_DIV:setnvalue(ra,luai_numdiv(nb,nc));break;[m
[31m-case TM_MOD:setnvalue(ra,luai_nummod(nb,nc));break;[m
[31m-case TM_POW:setnvalue(ra,luai_numpow(nb,nc));break;[m
[31m-case TM_UNM:setnvalue(ra,luai_numunm(nb));break;[m
[31m-default:break;[m
[31m-}[m
[31m-}[m
[31m-else if(!call_binTM(L,rb,rc,ra,op))[m
[31m-luaG_aritherror(L,rb,rc);[m
[31m-}[m
[31m-#define runtime_check(L,c){if(!(c))break;}[m
[31m-#define RA(i)(base+GETARG_A(i))[m
[31m-#define RB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgR,base+GETARG_B(i))[m
[31m-#define RKB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_B(i))?k+INDEXK(GETARG_B(i)):base+GETARG_B(i))[m
[31m-#define RKC(i)check_exp(getCMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_C(i))?k+INDEXK(GETARG_C(i)):base+GETARG_C(i))[m
[31m-#define KBx(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,k+GETARG_Bx(i))[m
[31m-#define dojump(L,pc,i){(pc)+=(i);}[m
[31m-#define Protect(x){L->savedpc=pc;{x;};base=L->base;}[m
[31m-#define arith_op(op,tm){TValue*rb=RKB(i);TValue*rc=RKC(i);if(ttisnumber(rb)&&ttisnumber(rc)){lua_Number nb=nvalue(rb),nc=nvalue(rc);setnvalue(ra,op(nb,nc));}else Protect(Arith(L,ra,rb,rc,tm));}[m
[31m-static void luaV_execute(lua_State*L,int nexeccalls){[m
[31m-LClosure*cl;[m
[31m-StkId base;[m
[31m-TValue*k;[m
[31m-const Instruction*pc;[m
[31m-reentry:[m
[31m-pc=L->savedpc;[m
[31m-cl=&clvalue(L->ci->func)->l;[m
[31m-base=L->base;[m
[31m-k=cl->p->k;[m
[31m-for(;;){[m
[31m-const Instruction i=*pc++;[m
[31m-StkId ra;[m
[31m-ra=RA(i);[m
[31m-switch(GET_OPCODE(i)){[m
[31m-case OP_MOVE:{[m
[31m-setobj(L,ra,RB(i));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LOADK:{[m
[31m-setobj(L,ra,KBx(i));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LOADBOOL:{[m
[31m-setbvalue(ra,GETARG_B(i));[m
[31m-if(GETARG_C(i))pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LOADNIL:{[m
[31m-TValue*rb=RB(i);[m
[31m-do{[m
[31m-setnilvalue(rb--);[m
[31m-}while(rb>=ra);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_GETUPVAL:{[m
[31m-int b=GETARG_B(i);[m
[31m-setobj(L,ra,cl->upvals[b]->v);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_GETGLOBAL:{[m
[31m-TValue g;[m
[31m-TValue*rb=KBx(i);[m
[31m-sethvalue(L,&g,cl->env);[m
[31m-Protect(luaV_gettable(L,&g,rb,ra));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_GETTABLE:{[m
[31m-Protect(luaV_gettable(L,RB(i),RKC(i),ra));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SETGLOBAL:{[m
[31m-TValue g;[m
[31m-sethvalue(L,&g,cl->env);[m
[31m-Protect(luaV_settable(L,&g,KBx(i),ra));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SETUPVAL:{[m
[31m-UpVal*uv=cl->upvals[GETARG_B(i)];[m
[31m-setobj(L,uv->v,ra);[m
[31m-luaC_barrier(L,uv,ra);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SETTABLE:{[m
[31m-Protect(luaV_settable(L,ra,RKB(i),RKC(i)));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_NEWTABLE:{[m
[31m-int b=GETARG_B(i);[m
[31m-int c=GETARG_C(i);[m
[31m-sethvalue(L,ra,luaH_new(L,luaO_fb2int(b),luaO_fb2int(c)));[m
[31m-Protect(luaC_checkGC(L));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SELF:{[m
[31m-StkId rb=RB(i);[m
[31m-setobj(L,ra+1,rb);[m
[31m-Protect(luaV_gettable(L,rb,RKC(i),ra));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_ADD:{[m
[31m-arith_op(luai_numadd,TM_ADD);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SUB:{[m
[31m-arith_op(luai_numsub,TM_SUB);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_MUL:{[m
[31m-arith_op(luai_nummul,TM_MUL);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_DIV:{[m
[31m-arith_op(luai_numdiv,TM_DIV);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_MOD:{[m
[31m-arith_op(luai_nummod,TM_MOD);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_POW:{[m
[31m-arith_op(luai_numpow,TM_POW);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_UNM:{[m
[31m-TValue*rb=RB(i);[m
[31m-if(ttisnumber(rb)){[m
[31m-lua_Number nb=nvalue(rb);[m
[31m-setnvalue(ra,luai_numunm(nb));[m
[31m-}[m
[31m-else{[m
[31m-Protect(Arith(L,ra,rb,rb,TM_UNM));[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-case OP_NOT:{[m
[31m-int res=l_isfalse(RB(i));[m
[31m-setbvalue(ra,res);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LEN:{[m
[31m-const TValue*rb=RB(i);[m
[31m-switch(ttype(rb)){[m
[31m-case 5:{[m
[31m-setnvalue(ra,cast_num(luaH_getn(hvalue(rb))));[m
[31m-break;[m
[31m-}[m
[31m-case 4:{[m
[31m-setnvalue(ra,cast_num(tsvalue(rb)->len));[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-Protect([m
[31m-if(!call_binTM(L,rb,(&luaO_nilobject_),ra,TM_LEN))[m
[31m-luaG_typeerror(L,rb,"get length of");[m
[31m-)[m
[31m-}[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-case OP_CONCAT:{[m
[31m-int b=GETARG_B(i);[m
[31m-int c=GETARG_C(i);[m
[31m-Protect(luaV_concat(L,c-b+1,c);luaC_checkGC(L));[m
[31m-setobj(L,RA(i),base+b);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_JMP:{[m
[31m-dojump(L,pc,GETARG_sBx(i));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_EQ:{[m
[31m-TValue*rb=RKB(i);[m
[31m-TValue*rc=RKC(i);[m
[31m-Protect([m
[31m-if(equalobj(L,rb,rc)==GETARG_A(i))[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-)[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LT:{[m
[31m-Protect([m
[31m-if(luaV_lessthan(L,RKB(i),RKC(i))==GETARG_A(i))[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-)[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_LE:{[m
[31m-Protect([m
[31m-if(lessequal(L,RKB(i),RKC(i))==GETARG_A(i))[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-)[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_TEST:{[m
[31m-if(l_isfalse(ra)!=GETARG_C(i))[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_TESTSET:{[m
[31m-TValue*rb=RB(i);[m
[31m-if(l_isfalse(rb)!=GETARG_C(i)){[m
[31m-setobj(L,ra,rb);[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-}[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_CALL:{[m
[31m-int b=GETARG_B(i);[m
[31m-int nresults=GETARG_C(i)-1;[m
[31m-if(b!=0)L->top=ra+b;[m
[31m-L->savedpc=pc;[m
[31m-switch(luaD_precall(L,ra,nresults)){[m
[31m-case 0:{[m
[31m-nexeccalls++;[m
[31m-goto reentry;[m
[31m-}[m
[31m-case 1:{[m
[31m-if(nresults>=0)L->top=L->ci->top;[m
[31m-base=L->base;[m
[31m-continue;[m
[31m-}[m
[31m-default:{[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-case OP_TAILCALL:{[m
[31m-int b=GETARG_B(i);[m
[31m-if(b!=0)L->top=ra+b;[m
[31m-L->savedpc=pc;[m
[31m-switch(luaD_precall(L,ra,(-1))){[m
[31m-case 0:{[m
[31m-CallInfo*ci=L->ci-1;[m
[31m-int aux;[m
[31m-StkId func=ci->func;[m
[31m-StkId pfunc=(ci+1)->func;[m
[31m-if(L->openupval)luaF_close(L,ci->base);[m
[31m-L->base=ci->base=ci->func+((ci+1)->base-pfunc);[m
[31m-for(aux=0;pfunc+aux<L->top;aux++)[m
[31m-setobj(L,func+aux,pfunc+aux);[m
[31m-ci->top=L->top=func+aux;[m
[31m-ci->savedpc=L->savedpc;[m
[31m-ci->tailcalls++;[m
[31m-L->ci--;[m
[31m-goto reentry;[m
[31m-}[m
[31m-case 1:{[m
[31m-base=L->base;[m
[31m-continue;[m
[31m-}[m
[31m-default:{[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-case OP_RETURN:{[m
[31m-int b=GETARG_B(i);[m
[31m-if(b!=0)L->top=ra+b-1;[m
[31m-if(L->openupval)luaF_close(L,base);[m
[31m-L->savedpc=pc;[m
[31m-b=luaD_poscall(L,ra);[m
[31m-if(--nexeccalls==0)[m
[31m-return;[m
[31m-else{[m
[31m-if(b)L->top=L->ci->top;[m
[31m-goto reentry;[m
[31m-}[m
[31m-}[m
[31m-case OP_FORLOOP:{[m
[31m-lua_Number step=nvalue(ra+2);[m
[31m-lua_Number idx=luai_numadd(nvalue(ra),step);[m
[31m-lua_Number limit=nvalue(ra+1);[m
[31m-if(luai_numlt(0,step)?luai_numle(idx,limit)[m
[31m-:luai_numle(limit,idx)){[m
[31m-dojump(L,pc,GETARG_sBx(i));[m
[31m-setnvalue(ra,idx);[m
[31m-setnvalue(ra+3,idx);[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-case OP_FORPREP:{[m
[31m-const TValue*init=ra;[m
[31m-const TValue*plimit=ra+1;[m
[31m-const TValue*pstep=ra+2;[m
[31m-L->savedpc=pc;[m
[31m-if(!tonumber(init,ra))[m
[31m-luaG_runerror(L,LUA_QL("for")" initial value must be a number");[m
[31m-else if(!tonumber(plimit,ra+1))[m
[31m-luaG_runerror(L,LUA_QL("for")" limit must be a number");[m
[31m-else if(!tonumber(pstep,ra+2))[m
[31m-luaG_runerror(L,LUA_QL("for")" step must be a number");[m
[31m-setnvalue(ra,luai_numsub(nvalue(ra),nvalue(pstep)));[m
[31m-dojump(L,pc,GETARG_sBx(i));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_TFORLOOP:{[m
[31m-StkId cb=ra+3;[m
[31m-setobj(L,cb+2,ra+2);[m
[31m-setobj(L,cb+1,ra+1);[m
[31m-setobj(L,cb,ra);[m
[31m-L->top=cb+3;[m
[31m-Protect(luaD_call(L,cb,GETARG_C(i)));[m
[31m-L->top=L->ci->top;[m
[31m-cb=RA(i)+3;[m
[31m-if(!ttisnil(cb)){[m
[31m-setobj(L,cb-1,cb);[m
[31m-dojump(L,pc,GETARG_sBx(*pc));[m
[31m-}[m
[31m-pc++;[m
[31m-continue;[m
[31m-}[m
[31m-case OP_SETLIST:{[m
[31m-int n=GETARG_B(i);[m
[31m-int c=GETARG_C(i);[m
[31m-int last;[m
[31m-Table*h;[m
[31m-if(n==0){[m
[31m-n=cast_int(L->top-ra)-1;[m
[31m-L->top=L->ci->top;[m
[31m-}[m
[31m-if(c==0)c=cast_int(*pc++);[m
[31m-runtime_check(L,ttistable(ra));[m
[31m-h=hvalue(ra);[m
[31m-last=((c-1)*50)+n;[m
[31m-if(last>h->sizearray)[m
[31m-luaH_resizearray(L,h,last);[m
[31m-for(;n>0;n--){[m
[31m-TValue*val=ra+n;[m
[31m-setobj(L,luaH_setnum(L,h,last--),val);[m
[31m-luaC_barriert(L,h,val);[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-case OP_CLOSE:{[m
[31m-luaF_close(L,ra);[m
[31m-continue;[m
[31m-}[m
[31m-case OP_CLOSURE:{[m
[31m-Proto*p;[m
[31m-Closure*ncl;[m
[31m-int nup,j;[m
[31m-p=cl->p->p[GETARG_Bx(i)];[m
[31m-nup=p->nups;[m
[31m-ncl=luaF_newLclosure(L,nup,cl->env);[m
[31m-ncl->l.p=p;[m
[31m-for(j=0;j<nup;j++,pc++){[m
[31m-if(GET_OPCODE(*pc)==OP_GETUPVAL)[m
[31m-ncl->l.upvals[j]=cl->upvals[GETARG_B(*pc)];[m
[31m-else{[m
[31m-ncl->l.upvals[j]=luaF_findupval(L,base+GETARG_B(*pc));[m
[31m-}[m
[31m-}[m
[31m-setclvalue(L,ra,ncl);[m
[31m-Protect(luaC_checkGC(L));[m
[31m-continue;[m
[31m-}[m
[31m-case OP_VARARG:{[m
[31m-int b=GETARG_B(i)-1;[m
[31m-int j;[m
[31m-CallInfo*ci=L->ci;[m
[31m-int n=cast_int(ci->base-ci->func)-cl->p->numparams-1;[m
[31m-if(b==(-1)){[m
[31m-Protect(luaD_checkstack(L,n));[m
[31m-ra=RA(i);[m
[31m-b=n;[m
[31m-L->top=ra+n;[m
[31m-}[m
[31m-for(j=0;j<b;j++){[m
[31m-if(j<n){[m
[31m-setobj(L,ra+j,ci->base-n+j);[m
[31m-}[m
[31m-else{[m
[31m-setnilvalue(ra+j);[m
[31m-}[m
[31m-}[m
[31m-continue;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-#define api_checknelems(L,n)luai_apicheck(L,(n)<=(L->top-L->base))[m
[31m-#define api_checkvalidindex(L,i)luai_apicheck(L,(i)!=(&luaO_nilobject_))[m
[31m-#define api_incr_top(L){luai_apicheck(L,L->top<L->ci->top);L->top++;}[m
[31m-static TValue*index2adr(lua_State*L,int idx){[m
[31m-if(idx>0){[m
[31m-TValue*o=L->base+(idx-1);[m
[31m-luai_apicheck(L,idx<=L->ci->top-L->base);[m
[31m-if(o>=L->top)return cast(TValue*,(&luaO_nilobject_));[m
[31m-else return o;[m
[31m-}[m
[31m-else if(idx>(-10000)){[m
[31m-luai_apicheck(L,idx!=0&&-idx<=L->top-L->base);[m
[31m-return L->top+idx;[m
[31m-}[m
[31m-else switch(idx){[m
[31m-case(-10000):return registry(L);[m
[31m-case(-10001):{[m
[31m-Closure*func=curr_func(L);[m
[31m-sethvalue(L,&L->env,func->c.env);[m
[31m-return&L->env;[m
[31m-}[m
[31m-case(-10002):return gt(L);[m
[31m-default:{[m
[31m-Closure*func=curr_func(L);[m
[31m-idx=(-10002)-idx;[m
[31m-return(idx<=func->c.nupvalues)[m
[31m-?&func->c.upvalue[idx-1][m
[31m-:cast(TValue*,(&luaO_nilobject_));[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static Table*getcurrenv(lua_State*L){[m
[31m-if(L->ci==L->base_ci)[m
[31m-return hvalue(gt(L));[m
[31m-else{[m
[31m-Closure*func=curr_func(L);[m
[31m-return func->c.env;[m
[31m-}[m
[31m-}[m
[31m-static int lua_checkstack(lua_State*L,int size){[m
[31m-int res=1;[m
[31m-if(size>8000||(L->top-L->base+size)>8000)[m
[31m-res=0;[m
[31m-else if(size>0){[m
[31m-luaD_checkstack(L,size);[m
[31m-if(L->ci->top<L->top+size)[m
[31m-L->ci->top=L->top+size;[m
[31m-}[m
[31m-return res;[m
[31m-}[m
[31m-static lua_CFunction lua_atpanic(lua_State*L,lua_CFunction panicf){[m
[31m-lua_CFunction old;[m
[31m-old=G(L)->panic;[m
[31m-G(L)->panic=panicf;[m
[31m-return old;[m
[31m-}[m
[31m-static int lua_gettop(lua_State*L){[m
[31m-return cast_int(L->top-L->base);[m
[31m-}[m
[31m-static void lua_settop(lua_State*L,int idx){[m
[31m-if(idx>=0){[m
[31m-luai_apicheck(L,idx<=L->stack_last-L->base);[m
[31m-while(L->top<L->base+idx)[m
[31m-setnilvalue(L->top++);[m
[31m-L->top=L->base+idx;[m
[31m-}[m
[31m-else{[m
[31m-luai_apicheck(L,-(idx+1)<=(L->top-L->base));[m
[31m-L->top+=idx+1;[m
[31m-}[m
[31m-}[m
[31m-static void lua_remove(lua_State*L,int idx){[m
[31m-StkId p;[m
[31m-p=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,p);[m
[31m-while(++p<L->top)setobj(L,p-1,p);[m
[31m-L->top--;[m
[31m-}[m
[31m-static void lua_insert(lua_State*L,int idx){[m
[31m-StkId p;[m
[31m-StkId q;[m
[31m-p=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,p);[m
[31m-for(q=L->top;q>p;q--)setobj(L,q,q-1);[m
[31m-setobj(L,p,L->top);[m
[31m-}[m
[31m-static void lua_replace(lua_State*L,int idx){[m
[31m-StkId o;[m
[31m-if(idx==(-10001)&&L->ci==L->base_ci)[m
[31m-luaG_runerror(L,"no calling environment");[m
[31m-api_checknelems(L,1);[m
[31m-o=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,o);[m
[31m-if(idx==(-10001)){[m
[31m-Closure*func=curr_func(L);[m
[31m-luai_apicheck(L,ttistable(L->top-1));[m
[31m-func->c.env=hvalue(L->top-1);[m
[31m-luaC_barrier(L,func,L->top-1);[m
[31m-}[m
[31m-else{[m
[31m-setobj(L,o,L->top-1);[m
[31m-if(idx<(-10002))[m
[31m-luaC_barrier(L,curr_func(L),L->top-1);[m
[31m-}[m
[31m-L->top--;[m
[31m-}[m
[31m-static void lua_pushvalue(lua_State*L,int idx){[m
[31m-setobj(L,L->top,index2adr(L,idx));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static int lua_type(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-return(o==(&luaO_nilobject_))?(-1):ttype(o);[m
[31m-}[m
[31m-static const char*lua_typename(lua_State*L,int t){[m
[31m-UNUSED(L);[m
[31m-return(t==(-1))?"no value":luaT_typenames[t];[m
[31m-}[m
[31m-static int lua_iscfunction(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-return iscfunction(o);[m
[31m-}[m
[31m-static int lua_isnumber(lua_State*L,int idx){[m
[31m-TValue n;[m
[31m-const TValue*o=index2adr(L,idx);[m
[31m-return tonumber(o,&n);[m
[31m-}[m
[31m-static int lua_isstring(lua_State*L,int idx){[m
[31m-int t=lua_type(L,idx);[m
[31m-return(t==4||t==3);[m
[31m-}[m
[31m-static int lua_rawequal(lua_State*L,int index1,int index2){[m
[31m-StkId o1=index2adr(L,index1);[m
[31m-StkId o2=index2adr(L,index2);[m
[31m-return(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0[m
[31m-:luaO_rawequalObj(o1,o2);[m
[31m-}[m
[31m-static int lua_lessthan(lua_State*L,int index1,int index2){[m
[31m-StkId o1,o2;[m
[31m-int i;[m
[31m-o1=index2adr(L,index1);[m
[31m-o2=index2adr(L,index2);[m
[31m-i=(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0[m
[31m-:luaV_lessthan(L,o1,o2);[m
[31m-return i;[m
[31m-}[m
[31m-static lua_Number lua_tonumber(lua_State*L,int idx){[m
[31m-TValue n;[m
[31m-const TValue*o=index2adr(L,idx);[m
[31m-if(tonumber(o,&n))[m
[31m-return nvalue(o);[m
[31m-else[m
[31m-return 0;[m
[31m-}[m
[31m-static lua_Integer lua_tointeger(lua_State*L,int idx){[m
[31m-TValue n;[m
[31m-const TValue*o=index2adr(L,idx);[m
[31m-if(tonumber(o,&n)){[m
[31m-lua_Integer res;[m
[31m-lua_Number num=nvalue(o);[m
[31m-lua_number2integer(res,num);[m
[31m-return res;[m
[31m-}[m
[31m-else[m
[31m-return 0;[m
[31m-}[m
[31m-static int lua_toboolean(lua_State*L,int idx){[m
[31m-const TValue*o=index2adr(L,idx);[m
[31m-return!l_isfalse(o);[m
[31m-}[m
[31m-static const char*lua_tolstring(lua_State*L,int idx,size_t*len){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-if(!ttisstring(o)){[m
[31m-if(!luaV_tostring(L,o)){[m
[31m-if(len!=NULL)*len=0;[m
[31m-return NULL;[m
[31m-}[m
[31m-luaC_checkGC(L);[m
[31m-o=index2adr(L,idx);[m
[31m-}[m
[31m-if(len!=NULL)*len=tsvalue(o)->len;[m
[31m-return svalue(o);[m
[31m-}[m
[31m-static size_t lua_objlen(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-switch(ttype(o)){[m
[31m-case 4:return tsvalue(o)->len;[m
[31m-case 7:return uvalue(o)->len;[m
[31m-case 5:return luaH_getn(hvalue(o));[m
[31m-case 3:{[m
[31m-size_t l;[m
[31m-l=(luaV_tostring(L,o)?tsvalue(o)->len:0);[m
[31m-return l;[m
[31m-}[m
[31m-default:return 0;[m
[31m-}[m
[31m-}[m
[31m-static lua_CFunction lua_tocfunction(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-return(!iscfunction(o))?NULL:clvalue(o)->c.f;[m
[31m-}[m
[31m-static void*lua_touserdata(lua_State*L,int idx){[m
[31m-StkId o=index2adr(L,idx);[m
[31m-switch(ttype(o)){[m
[31m-case 7:return(rawuvalue(o)+1);[m
[31m-case 2:return pvalue(o);[m
[31m-default:return NULL;[m
[31m-}[m
[31m-}[m
[31m-static void lua_pushnil(lua_State*L){[m
[31m-setnilvalue(L->top);[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushnumber(lua_State*L,lua_Number n){[m
[31m-setnvalue(L->top,n);[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushinteger(lua_State*L,lua_Integer n){[m
[31m-setnvalue(L->top,cast_num(n));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushlstring(lua_State*L,const char*s,size_t len){[m
[31m-luaC_checkGC(L);[m
[31m-setsvalue(L,L->top,luaS_newlstr(L,s,len));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushstring(lua_State*L,const char*s){[m
[31m-if(s==NULL)[m
[31m-lua_pushnil(L);[m
[31m-else[m
[31m-lua_pushlstring(L,s,strlen(s));[m
[31m-}[m
[31m-static const char*lua_pushvfstring(lua_State*L,const char*fmt,[m
[31m-va_list argp){[m
[31m-const char*ret;[m
[31m-luaC_checkGC(L);[m
[31m-ret=luaO_pushvfstring(L,fmt,argp);[m
[31m-return ret;[m
[31m-}[m
[31m-static const char*lua_pushfstring(lua_State*L,const char*fmt,...){[m
[31m-const char*ret;[m
[31m-va_list argp;[m
[31m-luaC_checkGC(L);[m
[31m-va_start(argp,fmt);[m
[31m-ret=luaO_pushvfstring(L,fmt,argp);[m
[31m-va_end(argp);[m
[31m-return ret;[m
[31m-}[m
[31m-static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n){[m
[31m-Closure*cl;[m
[31m-luaC_checkGC(L);[m
[31m-api_checknelems(L,n);[m
[31m-cl=luaF_newCclosure(L,n,getcurrenv(L));[m
[31m-cl->c.f=fn;[m
[31m-L->top-=n;[m
[31m-while(n--)[m
[31m-setobj(L,&cl->c.upvalue[n],L->top+n);[m
[31m-setclvalue(L,L->top,cl);[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_pushboolean(lua_State*L,int b){[m
[31m-setbvalue(L->top,(b!=0));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static int lua_pushthread(lua_State*L){[m
[31m-setthvalue(L,L->top,L);[m
[31m-api_incr_top(L);[m
[31m-return(G(L)->mainthread==L);[m
[31m-}[m
[31m-static void lua_gettable(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-t=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,t);[m
[31m-luaV_gettable(L,t,L->top-1,L->top-1);[m
[31m-}[m
[31m-static void lua_getfield(lua_State*L,int idx,const char*k){[m
[31m-StkId t;[m
[31m-TValue key;[m
[31m-t=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,t);[m
[31m-setsvalue(L,&key,luaS_new(L,k));[m
[31m-luaV_gettable(L,t,&key,L->top);[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_rawget(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-t=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(t));[m
[31m-setobj(L,L->top-1,luaH_get(hvalue(t),L->top-1));[m
[31m-}[m
[31m-static void lua_rawgeti(lua_State*L,int idx,int n){[m
[31m-StkId o;[m
[31m-o=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(o));[m
[31m-setobj(L,L->top,luaH_getnum(hvalue(o),n));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_createtable(lua_State*L,int narray,int nrec){[m
[31m-luaC_checkGC(L);[m
[31m-sethvalue(L,L->top,luaH_new(L,narray,nrec));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static int lua_getmetatable(lua_State*L,int objindex){[m
[31m-const TValue*obj;[m
[31m-Table*mt=NULL;[m
[31m-int res;[m
[31m-obj=index2adr(L,objindex);[m
[31m-switch(ttype(obj)){[m
[31m-case 5:[m
[31m-mt=hvalue(obj)->metatable;[m
[31m-break;[m
[31m-case 7:[m
[31m-mt=uvalue(obj)->metatable;[m
[31m-break;[m
[31m-default:[m
[31m-mt=G(L)->mt[ttype(obj)];[m
[31m-break;[m
[31m-}[m
[31m-if(mt==NULL)[m
[31m-res=0;[m
[31m-else{[m
[31m-sethvalue(L,L->top,mt);[m
[31m-api_incr_top(L);[m
[31m-res=1;[m
[31m-}[m
[31m-return res;[m
[31m-}[m
[31m-static void lua_getfenv(lua_State*L,int idx){[m
[31m-StkId o;[m
[31m-o=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,o);[m
[31m-switch(ttype(o)){[m
[31m-case 6:[m
[31m-sethvalue(L,L->top,clvalue(o)->c.env);[m
[31m-break;[m
[31m-case 7:[m
[31m-sethvalue(L,L->top,uvalue(o)->env);[m
[31m-break;[m
[31m-case 8:[m
[31m-setobj(L,L->top,gt(thvalue(o)));[m
[31m-break;[m
[31m-default:[m
[31m-setnilvalue(L->top);[m
[31m-break;[m
[31m-}[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-static void lua_settable(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-api_checknelems(L,2);[m
[31m-t=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,t);[m
[31m-luaV_settable(L,t,L->top-2,L->top-1);[m
[31m-L->top-=2;[m
[31m-}[m
[31m-static void lua_setfield(lua_State*L,int idx,const char*k){[m
[31m-StkId t;[m
[31m-TValue key;[m
[31m-api_checknelems(L,1);[m
[31m-t=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,t);[m
[31m-setsvalue(L,&key,luaS_new(L,k));[m
[31m-luaV_settable(L,t,&key,L->top-1);[m
[31m-L->top--;[m
[31m-}[m
[31m-static void lua_rawset(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-api_checknelems(L,2);[m
[31m-t=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(t));[m
[31m-setobj(L,luaH_set(L,hvalue(t),L->top-2),L->top-1);[m
[31m-luaC_barriert(L,hvalue(t),L->top-1);[m
[31m-L->top-=2;[m
[31m-}[m
[31m-static void lua_rawseti(lua_State*L,int idx,int n){[m
[31m-StkId o;[m
[31m-api_checknelems(L,1);[m
[31m-o=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(o));[m
[31m-setobj(L,luaH_setnum(L,hvalue(o),n),L->top-1);[m
[31m-luaC_barriert(L,hvalue(o),L->top-1);[m
[31m-L->top--;[m
[31m-}[m
[31m-static int lua_setmetatable(lua_State*L,int objindex){[m
[31m-TValue*obj;[m
[31m-Table*mt;[m
[31m-api_checknelems(L,1);[m
[31m-obj=index2adr(L,objindex);[m
[31m-api_checkvalidindex(L,obj);[m
[31m-if(ttisnil(L->top-1))[m
[31m-mt=NULL;[m
[31m-else{[m
[31m-luai_apicheck(L,ttistable(L->top-1));[m
[31m-mt=hvalue(L->top-1);[m
[31m-}[m
[31m-switch(ttype(obj)){[m
[31m-case 5:{[m
[31m-hvalue(obj)->metatable=mt;[m
[31m-if(mt)[m
[31m-luaC_objbarriert(L,hvalue(obj),mt);[m
[31m-break;[m
[31m-}[m
[31m-case 7:{[m
[31m-uvalue(obj)->metatable=mt;[m
[31m-if(mt)[m
[31m-luaC_objbarrier(L,rawuvalue(obj),mt);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-G(L)->mt[ttype(obj)]=mt;[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-L->top--;[m
[31m-return 1;[m
[31m-}[m
[31m-static int lua_setfenv(lua_State*L,int idx){[m
[31m-StkId o;[m
[31m-int res=1;[m
[31m-api_checknelems(L,1);[m
[31m-o=index2adr(L,idx);[m
[31m-api_checkvalidindex(L,o);[m
[31m-luai_apicheck(L,ttistable(L->top-1));[m
[31m-switch(ttype(o)){[m
[31m-case 6:[m
[31m-clvalue(o)->c.env=hvalue(L->top-1);[m
[31m-break;[m
[31m-case 7:[m
[31m-uvalue(o)->env=hvalue(L->top-1);[m
[31m-break;[m
[31m-case 8:[m
[31m-sethvalue(L,gt(thvalue(o)),hvalue(L->top-1));[m
[31m-break;[m
[31m-default:[m
[31m-res=0;[m
[31m-break;[m
[31m-}[m
[31m-if(res)luaC_objbarrier(L,gcvalue(o),hvalue(L->top-1));[m
[31m-L->top--;[m
[31m-return res;[m
[31m-}[m
[31m-#define adjustresults(L,nres){if(nres==(-1)&&L->top>=L->ci->top)L->ci->top=L->top;}[m
[31m-#define checkresults(L,na,nr)luai_apicheck(L,(nr)==(-1)||(L->ci->top-L->top>=(nr)-(na)))[m
[31m-static void lua_call(lua_State*L,int nargs,int nresults){[m
[31m-StkId func;[m
[31m-api_checknelems(L,nargs+1);[m
[31m-checkresults(L,nargs,nresults);[m
[31m-func=L->top-(nargs+1);[m
[31m-luaD_call(L,func,nresults);[m
[31m-adjustresults(L,nresults);[m
[31m-}[m
[31m-struct CallS{[m
[31m-StkId func;[m
[31m-int nresults;[m
[31m-};[m
[31m-static void f_call(lua_State*L,void*ud){[m
[31m-struct CallS*c=cast(struct CallS*,ud);[m
[31m-luaD_call(L,c->func,c->nresults);[m
[31m-}[m
[31m-static int lua_pcall(lua_State*L,int nargs,int nresults,int errfunc){[m
[31m-struct CallS c;[m
[31m-int status;[m
[31m-ptrdiff_t func;[m
[31m-api_checknelems(L,nargs+1);[m
[31m-checkresults(L,nargs,nresults);[m
[31m-if(errfunc==0)[m
[31m-func=0;[m
[31m-else{[m
[31m-StkId o=index2adr(L,errfunc);[m
[31m-api_checkvalidindex(L,o);[m
[31m-func=savestack(L,o);[m
[31m-}[m
[31m-c.func=L->top-(nargs+1);[m
[31m-c.nresults=nresults;[m
[31m-status=luaD_pcall(L,f_call,&c,savestack(L,c.func),func);[m
[31m-adjustresults(L,nresults);[m
[31m-return status;[m
[31m-}[m
[31m-static int lua_load(lua_State*L,lua_Reader reader,void*data,[m
[31m-const char*chunkname){[m
[31m-ZIO z;[m
[31m-int status;[m
[31m-if(!chunkname)chunkname="?";[m
[31m-luaZ_init(L,&z,reader,data);[m
[31m-status=luaD_protectedparser(L,&z,chunkname);[m
[31m-return status;[m
[31m-}[m
[31m-static int lua_error(lua_State*L){[m
[31m-api_checknelems(L,1);[m
[31m-luaG_errormsg(L);[m
[31m-return 0;[m
[31m-}[m
[31m-static int lua_next(lua_State*L,int idx){[m
[31m-StkId t;[m
[31m-int more;[m
[31m-t=index2adr(L,idx);[m
[31m-luai_apicheck(L,ttistable(t));[m
[31m-more=luaH_next(L,hvalue(t),L->top-1);[m
[31m-if(more){[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-else[m
[31m-L->top-=1;[m
[31m-return more;[m
[31m-}[m
[31m-static void lua_concat(lua_State*L,int n){[m
[31m-api_checknelems(L,n);[m
[31m-if(n>=2){[m
[31m-luaC_checkGC(L);[m
[31m-luaV_concat(L,n,cast_int(L->top-L->base)-1);[m
[31m-L->top-=(n-1);[m
[31m-}[m
[31m-else if(n==0){[m
[31m-setsvalue(L,L->top,luaS_newlstr(L,"",0));[m
[31m-api_incr_top(L);[m
[31m-}[m
[31m-}[m
[31m-static void*lua_newuserdata(lua_State*L,size_t size){[m
[31m-Udata*u;[m
[31m-luaC_checkGC(L);[m
[31m-u=luaS_newudata(L,size,getcurrenv(L));[m
[31m-setuvalue(L,L->top,u);[m
[31m-api_incr_top(L);[m
[31m-return u+1;[m
[31m-}[m
[31m-#define luaL_getn(L,i)((int)lua_objlen(L,i))[m
[31m-#define luaL_setn(L,i,j)((void)0)[m
[31m-typedef struct luaL_Reg{[m
[31m-const char*name;[m
[31m-lua_CFunction func;[m
[31m-}luaL_Reg;[m
[31m-static void luaI_openlib(lua_State*L,const char*libname,[m
[31m-const luaL_Reg*l,int nup);[m
[31m-static int luaL_argerror(lua_State*L,int numarg,const char*extramsg);[m
[31m-static const char* luaL_checklstring(lua_State*L,int numArg,[m
[31m-size_t*l);[m
[31m-static const char* luaL_optlstring(lua_State*L,int numArg,[m
[31m-const char*def,size_t*l);[m
[31m-static lua_Integer luaL_checkinteger(lua_State*L,int numArg);[m
[31m-static lua_Integer luaL_optinteger(lua_State*L,int nArg,[m
[31m-lua_Integer def);[m
[31m-static int luaL_error(lua_State*L,const char*fmt,...);[m
[31m-static const char* luaL_findtable(lua_State*L,int idx,[m
[31m-const char*fname,int szhint);[m
[31m-#define luaL_argcheck(L,cond,numarg,extramsg)((void)((cond)||luaL_argerror(L,(numarg),(extramsg))))[m
[31m-#define luaL_checkstring(L,n)(luaL_checklstring(L,(n),NULL))[m
[31m-#define luaL_optstring(L,n,d)(luaL_optlstring(L,(n),(d),NULL))[m
[31m-#define luaL_checkint(L,n)((int)luaL_checkinteger(L,(n)))[m
[31m-#define luaL_optint(L,n,d)((int)luaL_optinteger(L,(n),(d)))[m
[31m-#define luaL_typename(L,i)lua_typename(L,lua_type(L,(i)))[m
[31m-#define luaL_getmetatable(L,n)(lua_getfield(L,(-10000),(n)))[m
[31m-#define luaL_opt(L,f,n,d)(lua_isnoneornil(L,(n))?(d):f(L,(n)))[m
[31m-typedef struct luaL_Buffer{[m
[31m-char*p;[m
[31m-int lvl;[m
[31m-lua_State*L;[m
[31m-char buffer[BUFSIZ];[m
[31m-}luaL_Buffer;[m
[31m-#define luaL_addchar(B,c)((void)((B)->p<((B)->buffer+BUFSIZ)||luaL_prepbuffer(B)),(*(B)->p++=(char)(c)))[m
[31m-#define luaL_addsize(B,n)((B)->p+=(n))[m
[31m-static char* luaL_prepbuffer(luaL_Buffer*B);[m
[31m-static int luaL_argerror(lua_State*L,int narg,const char*extramsg){[m
[31m-lua_Debug ar;[m
[31m-if(!lua_getstack(L,0,&ar))[m
[31m-return luaL_error(L,"bad argument #%d (%s)",narg,extramsg);[m
[31m-lua_getinfo(L,"n",&ar);[m
[31m-if(strcmp(ar.namewhat,"method")==0){[m
[31m-narg--;[m
[31m-if(narg==0)[m
[31m-return luaL_error(L,"calling "LUA_QL("%s")" on bad self (%s)",[m
[31m-ar.name,extramsg);[m
[31m-}[m
[31m-if(ar.name==NULL)[m
[31m-ar.name="?";[m
[31m-return luaL_error(L,"bad argument #%d to "LUA_QL("%s")" (%s)",[m
[31m-narg,ar.name,extramsg);[m
[31m-}[m
[31m-static int luaL_typerror(lua_State*L,int narg,const char*tname){[m
[31m-const char*msg=lua_pushfstring(L,"%s expected, got %s",[m
[31m-tname,luaL_typename(L,narg));[m
[31m-return luaL_argerror(L,narg,msg);[m
[31m-}[m
[31m-static void tag_error(lua_State*L,int narg,int tag){[m
[31m-luaL_typerror(L,narg,lua_typename(L,tag));[m
[31m-}[m
[31m-static void luaL_where(lua_State*L,int level){[m
[31m-lua_Debug ar;[m
[31m-if(lua_getstack(L,level,&ar)){[m
[31m-lua_getinfo(L,"Sl",&ar);[m
[31m-if(ar.currentline>0){[m
[31m-lua_pushfstring(L,"%s:%d: ",ar.short_src,ar.currentline);[m
[31m-return;[m
[31m-}[m
[31m-}[m
[31m-lua_pushliteral(L,"");[m
[31m-}[m
[31m-static int luaL_error(lua_State*L,const char*fmt,...){[m
[31m-va_list argp;[m
[31m-va_start(argp,fmt);[m
[31m-luaL_where(L,1);[m
[31m-lua_pushvfstring(L,fmt,argp);[m
[31m-va_end(argp);[m
[31m-lua_concat(L,2);[m
[31m-return lua_error(L);[m
[31m-}[m
[31m-static int luaL_newmetatable(lua_State*L,const char*tname){[m
[31m-lua_getfield(L,(-10000),tname);[m
[31m-if(!lua_isnil(L,-1))[m
[31m-return 0;[m
[31m-lua_pop(L,1);[m
[31m-lua_newtable(L);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_setfield(L,(-10000),tname);[m
[31m-return 1;[m
[31m-}[m
[31m-static void*luaL_checkudata(lua_State*L,int ud,const char*tname){[m
[31m-void*p=lua_touserdata(L,ud);[m
[31m-if(p!=NULL){[m
[31m-if(lua_getmetatable(L,ud)){[m
[31m-lua_getfield(L,(-10000),tname);[m
[31m-if(lua_rawequal(L,-1,-2)){[m
[31m-lua_pop(L,2);[m
[31m-return p;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-luaL_typerror(L,ud,tname);[m
[31m-return NULL;[m
[31m-}[m
[31m-static void luaL_checkstack(lua_State*L,int space,const char*mes){[m
[31m-if(!lua_checkstack(L,space))[m
[31m-luaL_error(L,"stack overflow (%s)",mes);[m
[31m-}[m
[31m-static void luaL_checktype(lua_State*L,int narg,int t){[m
[31m-if(lua_type(L,narg)!=t)[m
[31m-tag_error(L,narg,t);[m
[31m-}[m
[31m-static void luaL_checkany(lua_State*L,int narg){[m
[31m-if(lua_type(L,narg)==(-1))[m
[31m-luaL_argerror(L,narg,"value expected");[m
[31m-}[m
[31m-static const char*luaL_checklstring(lua_State*L,int narg,size_t*len){[m
[31m-const char*s=lua_tolstring(L,narg,len);[m
[31m-if(!s)tag_error(L,narg,4);[m
[31m-return s;[m
[31m-}[m
[31m-static const char*luaL_optlstring(lua_State*L,int narg,[m
[31m-const char*def,size_t*len){[m
[31m-if(lua_isnoneornil(L,narg)){[m
[31m-if(len)[m
[31m-*len=(def?strlen(def):0);[m
[31m-return def;[m
[31m-}[m
[31m-else return luaL_checklstring(L,narg,len);[m
[31m-}[m
[31m-static lua_Number luaL_checknumber(lua_State*L,int narg){[m
[31m-lua_Number d=lua_tonumber(L,narg);[m
[31m-if(d==0&&!lua_isnumber(L,narg))[m
[31m-tag_error(L,narg,3);[m
[31m-return d;[m
[31m-}[m
[31m-static lua_Integer luaL_checkinteger(lua_State*L,int narg){[m
[31m-lua_Integer d=lua_tointeger(L,narg);[m
[31m-if(d==0&&!lua_isnumber(L,narg))[m
[31m-tag_error(L,narg,3);[m
[31m-return d;[m
[31m-}[m
[31m-static lua_Integer luaL_optinteger(lua_State*L,int narg,[m
[31m-lua_Integer def){[m
[31m-return luaL_opt(L,luaL_checkinteger,narg,def);[m
[31m-}[m
[31m-static int luaL_getmetafield(lua_State*L,int obj,const char*event){[m
[31m-if(!lua_getmetatable(L,obj))[m
[31m-return 0;[m
[31m-lua_pushstring(L,event);[m
[31m-lua_rawget(L,-2);[m
[31m-if(lua_isnil(L,-1)){[m
[31m-lua_pop(L,2);[m
[31m-return 0;[m
[31m-}[m
[31m-else{[m
[31m-lua_remove(L,-2);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static void luaL_register(lua_State*L,const char*libname,[m
[31m-const luaL_Reg*l){[m
[31m-luaI_openlib(L,libname,l,0);[m
[31m-}[m
[31m-static int libsize(const luaL_Reg*l){[m
[31m-int size=0;[m
[31m-for(;l->name;l++)size++;[m
[31m-return size;[m
[31m-}[m
[31m-static void luaI_openlib(lua_State*L,const char*libname,[m
[31m-const luaL_Reg*l,int nup){[m
[31m-if(libname){[m
[31m-int size=libsize(l);[m
[31m-luaL_findtable(L,(-10000),"_LOADED",1);[m
[31m-lua_getfield(L,-1,libname);[m
[31m-if(!lua_istable(L,-1)){[m
[31m-lua_pop(L,1);[m
[31m-if(luaL_findtable(L,(-10002),libname,size)!=NULL)[m
[31m-luaL_error(L,"name conflict for module "LUA_QL("%s"),libname);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_setfield(L,-3,libname);[m
[31m-}[m
[31m-lua_remove(L,-2);[m
[31m-lua_insert(L,-(nup+1));[m
[31m-}[m
[31m-for(;l->name;l++){[m
[31m-int i;[m
[31m-for(i=0;i<nup;i++)[m
[31m-lua_pushvalue(L,-nup);[m
[31m-lua_pushcclosure(L,l->func,nup);[m
[31m-lua_setfield(L,-(nup+2),l->name);[m
[31m-}[m
[31m-lua_pop(L,nup);[m
[31m-}[m
[31m-static const char*luaL_findtable(lua_State*L,int idx,[m
[31m-const char*fname,int szhint){[m
[31m-const char*e;[m
[31m-lua_pushvalue(L,idx);[m
[31m-do{[m
[31m-e=strchr(fname,'.');[m
[31m-if(e==NULL)e=fname+strlen(fname);[m
[31m-lua_pushlstring(L,fname,e-fname);[m
[31m-lua_rawget(L,-2);[m
[31m-if(lua_isnil(L,-1)){[m
[31m-lua_pop(L,1);[m
[31m-lua_createtable(L,0,(*e=='.'?1:szhint));[m
[31m-lua_pushlstring(L,fname,e-fname);[m
[31m-lua_pushvalue(L,-2);[m
[31m-lua_settable(L,-4);[m
[31m-}[m
[31m-else if(!lua_istable(L,-1)){[m
[31m-lua_pop(L,2);[m
[31m-return fname;[m
[31m-}[m
[31m-lua_remove(L,-2);[m
[31m-fname=e+1;[m
[31m-}while(*e=='.');[m
[31m-return NULL;[m
[31m-}[m
[31m-#define bufflen(B)((B)->p-(B)->buffer)[m
[31m-#define bufffree(B)((size_t)(BUFSIZ-bufflen(B)))[m
[31m-static int emptybuffer(luaL_Buffer*B){[m
[31m-size_t l=bufflen(B);[m
[31m-if(l==0)return 0;[m
[31m-else{[m
[31m-lua_pushlstring(B->L,B->buffer,l);[m
[31m-B->p=B->buffer;[m
[31m-B->lvl++;[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static void adjuststack(luaL_Buffer*B){[m
[31m-if(B->lvl>1){[m
[31m-lua_State*L=B->L;[m
[31m-int toget=1;[m
[31m-size_t toplen=lua_strlen(L,-1);[m
[31m-do{[m
[31m-size_t l=lua_strlen(L,-(toget+1));[m
[31m-if(B->lvl-toget+1>=(20/2)||toplen>l){[m
[31m-toplen+=l;[m
[31m-toget++;[m
[31m-}[m
[31m-else break;[m
[31m-}while(toget<B->lvl);[m
[31m-lua_concat(L,toget);[m
[31m-B->lvl=B->lvl-toget+1;[m
[31m-}[m
[31m-}[m
[31m-static char*luaL_prepbuffer(luaL_Buffer*B){[m
[31m-if(emptybuffer(B))[m
[31m-adjuststack(B);[m
[31m-return B->buffer;[m
[31m-}[m
[31m-static void luaL_addlstring(luaL_Buffer*B,const char*s,size_t l){[m
[31m-while(l--)[m
[31m-luaL_addchar(B,*s++);[m
[31m-}[m
[31m-static void luaL_pushresult(luaL_Buffer*B){[m
[31m-emptybuffer(B);[m
[31m-lua_concat(B->L,B->lvl);[m
[31m-B->lvl=1;[m
[31m-}[m
[31m-static void luaL_addvalue(luaL_Buffer*B){[m
[31m-lua_State*L=B->L;[m
[31m-size_t vl;[m
[31m-const char*s=lua_tolstring(L,-1,&vl);[m
[31m-if(vl<=bufffree(B)){[m
[31m-memcpy(B->p,s,vl);[m
[31m-B->p+=vl;[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-else{[m
[31m-if(emptybuffer(B))[m
[31m-lua_insert(L,-2);[m
[31m-B->lvl++;[m
[31m-adjuststack(B);[m
[31m-}[m
[31m-}[m
[31m-static void luaL_buffinit(lua_State*L,luaL_Buffer*B){[m
[31m-B->L=L;[m
[31m-B->p=B->buffer;[m
[31m-B->lvl=0;[m
[31m-}[m
[31m-typedef struct LoadF{[m
[31m-int extraline;[m
[31m-FILE*f;[m
[31m-char buff[BUFSIZ];[m
[31m-}LoadF;[m
[31m-static const char*getF(lua_State*L,void*ud,size_t*size){[m
[31m-LoadF*lf=(LoadF*)ud;[m
[31m-(void)L;[m
[31m-if(lf->extraline){[m
[31m-lf->extraline=0;[m
[31m-*size=1;[m
[31m-return"\n";[m
[31m-}[m
[31m-if(feof(lf->f))return NULL;[m
[31m-*size=fread(lf->buff,1,sizeof(lf->buff),lf->f);[m
[31m-return(*size>0)?lf->buff:NULL;[m
[31m-}[m
[31m-static int errfile(lua_State*L,const char*what,int fnameindex){[m
[31m-const char*serr=strerror(errno);[m
[31m-const char*filename=lua_tostring(L,fnameindex)+1;[m
[31m-lua_pushfstring(L,"cannot %s %s: %s",what,filename,serr);[m
[31m-lua_remove(L,fnameindex);[m
[31m-return(5+1);[m
[31m-}[m
[31m-static int luaL_loadfile(lua_State*L,const char*filename){[m
[31m-LoadF lf;[m
[31m-int status,readstatus;[m
[31m-int c;[m
[31m-int fnameindex=lua_gettop(L)+1;[m
[31m-lf.extraline=0;[m
[31m-if(filename==NULL){[m
[31m-lua_pushliteral(L,"=stdin");[m
[31m-lf.f=stdin;[m
[31m-}[m
[31m-else{[m
[31m-lua_pushfstring(L,"@%s",filename);[m
[31m-lf.f=fopen(filename,"r");[m
[31m-if(lf.f==NULL)return errfile(L,"open",fnameindex);[m
[31m-}[m
[31m-c=getc(lf.f);[m
[31m-if(c=='#'){[m
[31m-lf.extraline=1;[m
[31m-while((c=getc(lf.f))!=EOF&&c!='\n');[m
[31m-if(c=='\n')c=getc(lf.f);[m
[31m-}[m
[31m-if(c=="\033Lua"[0]&&filename){[m
[31m-lf.f=freopen(filename,"rb",lf.f);[m
[31m-if(lf.f==NULL)return errfile(L,"reopen",fnameindex);[m
[31m-while((c=getc(lf.f))!=EOF&&c!="\033Lua"[0]);[m
[31m-lf.extraline=0;[m
[31m-}[m
[31m-ungetc(c,lf.f);[m
[31m-status=lua_load(L,getF,&lf,lua_tostring(L,-1));[m
[31m-readstatus=ferror(lf.f);[m
[31m-if(filename)fclose(lf.f);[m
[31m-if(readstatus){[m
[31m-lua_settop(L,fnameindex);[m
[31m-return errfile(L,"read",fnameindex);[m
[31m-}[m
[31m-lua_remove(L,fnameindex);[m
[31m-return status;[m
[31m-}[m
[31m-typedef struct LoadS{[m
[31m-const char*s;[m
[31m-size_t size;[m
[31m-}LoadS;[m
[31m-static const char*getS(lua_State*L,void*ud,size_t*size){[m
[31m-LoadS*ls=(LoadS*)ud;[m
[31m-(void)L;[m
[31m-if(ls->size==0)return NULL;[m
[31m-*size=ls->size;[m
[31m-ls->size=0;[m
[31m-return ls->s;[m
[31m-}[m
[31m-static int luaL_loadbuffer(lua_State*L,const char*buff,size_t size,[m
[31m-const char*name){[m
[31m-LoadS ls;[m
[31m-ls.s=buff;[m
[31m-ls.size=size;[m
[31m-return lua_load(L,getS,&ls,name);[m
[31m-}[m
[31m-static void*l_alloc(void*ud,void*ptr,size_t osize,size_t nsize){[m
[31m-(void)ud;[m
[31m-(void)osize;[m
[31m-if(nsize==0){[m
[31m-free(ptr);[m
[31m-return NULL;[m
[31m-}[m
[31m-else[m
[31m-return realloc(ptr,nsize);[m
[31m-}[m
[31m-static int panic(lua_State*L){[m
[31m-(void)L;[m
[31m-fprintf(stderr,"PANIC: unprotected error in call to Lua API (%s)\n",[m
[31m-lua_tostring(L,-1));[m
[31m-return 0;[m
[31m-}[m
[31m-static lua_State*luaL_newstate(void){[m
[31m-lua_State*L=lua_newstate(l_alloc,NULL);[m
[31m-if(L)lua_atpanic(L,&panic);[m
[31m-return L;[m
[31m-}[m
[31m-static int luaB_tonumber(lua_State*L){[m
[31m-int base=luaL_optint(L,2,10);[m
[31m-if(base==10){[m
[31m-luaL_checkany(L,1);[m
[31m-if(lua_isnumber(L,1)){[m
[31m-lua_pushnumber(L,lua_tonumber(L,1));[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-else{[m
[31m-const char*s1=luaL_checkstring(L,1);[m
[31m-char*s2;[m
[31m-unsigned long n;[m
[31m-luaL_argcheck(L,2<=base&&base<=36,2,"base out of range");[m
[31m-n=strtoul(s1,&s2,base);[m
[31m-if(s1!=s2){[m
[31m-while(isspace((unsigned char)(*s2)))s2++;[m
[31m-if(*s2=='\0'){[m
[31m-lua_pushnumber(L,(lua_Number)n);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-lua_pushnil(L);[m
[31m-return 1;[m
[31m-}[m
[31m-static int luaB_error(lua_State*L){[m
[31m-int level=luaL_optint(L,2,1);[m
[31m-lua_settop(L,1);[m
[31m-if(lua_isstring(L,1)&&level>0){[m
[31m-luaL_where(L,level);[m
[31m-lua_pushvalue(L,1);[m
[31m-lua_concat(L,2);[m
[31m-}[m
[31m-return lua_error(L);[m
[31m-}[m
[31m-static int luaB_setmetatable(lua_State*L){[m
[31m-int t=lua_type(L,2);[m
[31m-luaL_checktype(L,1,5);[m
[31m-luaL_argcheck(L,t==0||t==5,2,[m
[31m-"nil or table expected");[m
[31m-if(luaL_getmetafield(L,1,"__metatable"))[m
[31m-luaL_error(L,"cannot change a protected metatable");[m
[31m-lua_settop(L,2);[m
[31m-lua_setmetatable(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-static void getfunc(lua_State*L,int opt){[m
[31m-if(lua_isfunction(L,1))lua_pushvalue(L,1);[m
[31m-else{[m
[31m-lua_Debug ar;[m
[31m-int level=opt?luaL_optint(L,1,1):luaL_checkint(L,1);[m
[31m-luaL_argcheck(L,level>=0,1,"level must be non-negative");[m
[31m-if(lua_getstack(L,level,&ar)==0)[m
[31m-luaL_argerror(L,1,"invalid level");[m
[31m-lua_getinfo(L,"f",&ar);[m
[31m-if(lua_isnil(L,-1))[m
[31m-luaL_error(L,"no function environment for tail call at level %d",[m
[31m-level);[m
[31m-}[m
[31m-}[m
[31m-static int luaB_setfenv(lua_State*L){[m
[31m-luaL_checktype(L,2,5);[m
[31m-getfunc(L,0);[m
[31m-lua_pushvalue(L,2);[m
[31m-if(lua_isnumber(L,1)&&lua_tonumber(L,1)==0){[m
[31m-lua_pushthread(L);[m
[31m-lua_insert(L,-2);[m
[31m-lua_setfenv(L,-2);[m
[31m-return 0;[m
[31m-}[m
[31m-else if(lua_iscfunction(L,-2)||lua_setfenv(L,-2)==0)[m
[31m-luaL_error(L,[m
[31m-LUA_QL("setfenv")" cannot change environment of given object");[m
[31m-return 1;[m
[31m-}[m
[31m-static int luaB_rawget(lua_State*L){[m
[31m-luaL_checktype(L,1,5);[m
[31m-luaL_checkany(L,2);[m
[31m-lua_settop(L,2);[m
[31m-lua_rawget(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-static int luaB_type(lua_State*L){[m
[31m-luaL_checkany(L,1);[m
[31m-lua_pushstring(L,luaL_typename(L,1));[m
[31m-return 1;[m
[31m-}[m
[31m-static int luaB_next(lua_State*L){[m
[31m-luaL_checktype(L,1,5);[m
[31m-lua_settop(L,2);[m
[31m-if(lua_next(L,1))[m
[31m-return 2;[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static int luaB_pairs(lua_State*L){[m
[31m-luaL_checktype(L,1,5);[m
[31m-lua_pushvalue(L,lua_upvalueindex(1));[m
[31m-lua_pushvalue(L,1);[m
[31m-lua_pushnil(L);[m
[31m-return 3;[m
[31m-}[m
[31m-static int ipairsaux(lua_State*L){[m
[31m-int i=luaL_checkint(L,2);[m
[31m-luaL_checktype(L,1,5);[m
[31m-i++;[m
[31m-lua_pushinteger(L,i);[m
[31m-lua_rawgeti(L,1,i);[m
[31m-return(lua_isnil(L,-1))?0:2;[m
[31m-}[m
[31m-static int luaB_ipairs(lua_State*L){[m
[31m-luaL_checktype(L,1,5);[m
[31m-lua_pushvalue(L,lua_upvalueindex(1));[m
[31m-lua_pushvalue(L,1);[m
[31m-lua_pushinteger(L,0);[m
[31m-return 3;[m
[31m-}[m
[31m-static int load_aux(lua_State*L,int status){[m
[31m-if(status==0)[m
[31m-return 1;[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-lua_insert(L,-2);[m
[31m-return 2;[m
[31m-}[m
[31m-}[m
[31m-static int luaB_loadstring(lua_State*L){[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-const char*chunkname=luaL_optstring(L,2,s);[m
[31m-return load_aux(L,luaL_loadbuffer(L,s,l,chunkname));[m
[31m-}[m
[31m-static int luaB_loadfile(lua_State*L){[m
[31m-const char*fname=luaL_optstring(L,1,NULL);[m
[31m-return load_aux(L,luaL_loadfile(L,fname));[m
[31m-}[m
[31m-static int luaB_assert(lua_State*L){[m
[31m-luaL_checkany(L,1);[m
[31m-if(!lua_toboolean(L,1))[m
[31m-return luaL_error(L,"%s",luaL_optstring(L,2,"assertion failed!"));[m
[31m-return lua_gettop(L);[m
[31m-}[m
[31m-static int luaB_unpack(lua_State*L){[m
[31m-int i,e,n;[m
[31m-luaL_checktype(L,1,5);[m
[31m-i=luaL_optint(L,2,1);[m
[31m-e=luaL_opt(L,luaL_checkint,3,luaL_getn(L,1));[m
[31m-if(i>e)return 0;[m
[31m-n=e-i+1;[m
[31m-if(n<=0||!lua_checkstack(L,n))[m
[31m-return luaL_error(L,"too many results to unpack");[m
[31m-lua_rawgeti(L,1,i);[m
[31m-while(i++<e)[m
[31m-lua_rawgeti(L,1,i);[m
[31m-return n;[m
[31m-}[m
[31m-static int luaB_pcall(lua_State*L){[m
[31m-int status;[m
[31m-luaL_checkany(L,1);[m
[31m-status=lua_pcall(L,lua_gettop(L)-1,(-1),0);[m
[31m-lua_pushboolean(L,(status==0));[m
[31m-lua_insert(L,1);[m
[31m-return lua_gettop(L);[m
[31m-}[m
[31m-static int luaB_newproxy(lua_State*L){[m
[31m-lua_settop(L,1);[m
[31m-lua_newuserdata(L,0);[m
[31m-if(lua_toboolean(L,1)==0)[m
[31m-return 1;[m
[31m-else if(lua_isboolean(L,1)){[m
[31m-lua_newtable(L);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_pushboolean(L,1);[m
[31m-lua_rawset(L,lua_upvalueindex(1));[m
[31m-}[m
[31m-else{[m
[31m-int validproxy=0;[m
[31m-if(lua_getmetatable(L,1)){[m
[31m-lua_rawget(L,lua_upvalueindex(1));[m
[31m-validproxy=lua_toboolean(L,-1);[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-luaL_argcheck(L,validproxy,1,"boolean or proxy expected");[m
[31m-lua_getmetatable(L,1);[m
[31m-}[m
[31m-lua_setmetatable(L,2);[m
[31m-return 1;[m
[31m-}[m
[31m-static const luaL_Reg base_funcs[]={[m
[31m-{"assert",luaB_assert},[m
[31m-{"error",luaB_error},[m
[31m-{"loadfile",luaB_loadfile},[m
[31m-{"loadstring",luaB_loadstring},[m
[31m-{"next",luaB_next},[m
[31m-{"pcall",luaB_pcall},[m
[31m-{"rawget",luaB_rawget},[m
[31m-{"setfenv",luaB_setfenv},[m
[31m-{"setmetatable",luaB_setmetatable},[m
[31m-{"tonumber",luaB_tonumber},[m
[31m-{"type",luaB_type},[m
[31m-{"unpack",luaB_unpack},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static void auxopen(lua_State*L,const char*name,[m
[31m-lua_CFunction f,lua_CFunction u){[m
[31m-lua_pushcfunction(L,u);[m
[31m-lua_pushcclosure(L,f,1);[m
[31m-lua_setfield(L,-2,name);[m
[31m-}[m
[31m-static void base_open(lua_State*L){[m
[31m-lua_pushvalue(L,(-10002));[m
[31m-lua_setglobal(L,"_G");[m
[31m-luaL_register(L,"_G",base_funcs);[m
[31m-lua_pushliteral(L,"Lua 5.1");[m
[31m-lua_setglobal(L,"_VERSION");[m
[31m-auxopen(L,"ipairs",luaB_ipairs,ipairsaux);[m
[31m-auxopen(L,"pairs",luaB_pairs,luaB_next);[m
[31m-lua_createtable(L,0,1);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_setmetatable(L,-2);[m
[31m-lua_pushliteral(L,"kv");[m
[31m-lua_setfield(L,-2,"__mode");[m
[31m-lua_pushcclosure(L,luaB_newproxy,1);[m
[31m-lua_setglobal(L,"newproxy");[m
[31m-}[m
[31m-static int luaopen_base(lua_State*L){[m
[31m-base_open(L);[m
[31m-return 1;[m
[31m-}[m
[31m-#define aux_getn(L,n)(luaL_checktype(L,n,5),luaL_getn(L,n))[m
[31m-static int tinsert(lua_State*L){[m
[31m-int e=aux_getn(L,1)+1;[m
[31m-int pos;[m
[31m-switch(lua_gettop(L)){[m
[31m-case 2:{[m
[31m-pos=e;[m
[31m-break;[m
[31m-}[m
[31m-case 3:{[m
[31m-int i;[m
[31m-pos=luaL_checkint(L,2);[m
[31m-if(pos>e)e=pos;[m
[31m-for(i=e;i>pos;i--){[m
[31m-lua_rawgeti(L,1,i-1);[m
[31m-lua_rawseti(L,1,i);[m
[31m-}[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-return luaL_error(L,"wrong number of arguments to "LUA_QL("insert"));[m
[31m-}[m
[31m-}[m
[31m-luaL_setn(L,1,e);[m
[31m-lua_rawseti(L,1,pos);[m
[31m-return 0;[m
[31m-}[m
[31m-static int tremove(lua_State*L){[m
[31m-int e=aux_getn(L,1);[m
[31m-int pos=luaL_optint(L,2,e);[m
[31m-if(!(1<=pos&&pos<=e))[m
[31m-return 0;[m
[31m-luaL_setn(L,1,e-1);[m
[31m-lua_rawgeti(L,1,pos);[m
[31m-for(;pos<e;pos++){[m
[31m-lua_rawgeti(L,1,pos+1);[m
[31m-lua_rawseti(L,1,pos);[m
[31m-}[m
[31m-lua_pushnil(L);[m
[31m-lua_rawseti(L,1,e);[m
[31m-return 1;[m
[31m-}[m
[31m-static void addfield(lua_State*L,luaL_Buffer*b,int i){[m
[31m-lua_rawgeti(L,1,i);[m
[31m-if(!lua_isstring(L,-1))[m
[31m-luaL_error(L,"invalid value (%s) at index %d in table for "[m
[31m-LUA_QL("concat"),luaL_typename(L,-1),i);[m
[31m-luaL_addvalue(b);[m
[31m-}[m
[31m-static int tconcat(lua_State*L){[m
[31m-luaL_Buffer b;[m
[31m-size_t lsep;[m
[31m-int i,last;[m
[31m-const char*sep=luaL_optlstring(L,2,"",&lsep);[m
[31m-luaL_checktype(L,1,5);[m
[31m-i=luaL_optint(L,3,1);[m
[31m-last=luaL_opt(L,luaL_checkint,4,luaL_getn(L,1));[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(;i<last;i++){[m
[31m-addfield(L,&b,i);[m
[31m-luaL_addlstring(&b,sep,lsep);[m
[31m-}[m
[31m-if(i==last)[m
[31m-addfield(L,&b,i);[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static void set2(lua_State*L,int i,int j){[m
[31m-lua_rawseti(L,1,i);[m
[31m-lua_rawseti(L,1,j);[m
[31m-}[m
[31m-static int sort_comp(lua_State*L,int a,int b){[m
[31m-if(!lua_isnil(L,2)){[m
[31m-int res;[m
[31m-lua_pushvalue(L,2);[m
[31m-lua_pushvalue(L,a-1);[m
[31m-lua_pushvalue(L,b-2);[m
[31m-lua_call(L,2,1);[m
[31m-res=lua_toboolean(L,-1);[m
[31m-lua_pop(L,1);[m
[31m-return res;[m
[31m-}[m
[31m-else[m
[31m-return lua_lessthan(L,a,b);[m
[31m-}[m
[31m-static void auxsort(lua_State*L,int l,int u){[m
[31m-while(l<u){[m
[31m-int i,j;[m
[31m-lua_rawgeti(L,1,l);[m
[31m-lua_rawgeti(L,1,u);[m
[31m-if(sort_comp(L,-1,-2))[m
[31m-set2(L,l,u);[m
[31m-else[m
[31m-lua_pop(L,2);[m
[31m-if(u-l==1)break;[m
[31m-i=(l+u)/2;[m
[31m-lua_rawgeti(L,1,i);[m
[31m-lua_rawgeti(L,1,l);[m
[31m-if(sort_comp(L,-2,-1))[m
[31m-set2(L,i,l);[m
[31m-else{[m
[31m-lua_pop(L,1);[m
[31m-lua_rawgeti(L,1,u);[m
[31m-if(sort_comp(L,-1,-2))[m
[31m-set2(L,i,u);[m
[31m-else[m
[31m-lua_pop(L,2);[m
[31m-}[m
[31m-if(u-l==2)break;[m
[31m-lua_rawgeti(L,1,i);[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_rawgeti(L,1,u-1);[m
[31m-set2(L,i,u-1);[m
[31m-i=l;j=u-1;[m
[31m-for(;;){[m
[31m-while(lua_rawgeti(L,1,++i),sort_comp(L,-1,-2)){[m
[31m-if(i>u)luaL_error(L,"invalid order function for sorting");[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-while(lua_rawgeti(L,1,--j),sort_comp(L,-3,-1)){[m
[31m-if(j<l)luaL_error(L,"invalid order function for sorting");[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-if(j<i){[m
[31m-lua_pop(L,3);[m
[31m-break;[m
[31m-}[m
[31m-set2(L,i,j);[m
[31m-}[m
[31m-lua_rawgeti(L,1,u-1);[m
[31m-lua_rawgeti(L,1,i);[m
[31m-set2(L,u-1,i);[m
[31m-if(i-l<u-i){[m
[31m-j=l;i=i-1;l=i+2;[m
[31m-}[m
[31m-else{[m
[31m-j=i+1;i=u;u=j-2;[m
[31m-}[m
[31m-auxsort(L,j,i);[m
[31m-}[m
[31m-}[m
[31m-static int sort(lua_State*L){[m
[31m-int n=aux_getn(L,1);[m
[31m-luaL_checkstack(L,40,"");[m
[31m-if(!lua_isnoneornil(L,2))[m
[31m-luaL_checktype(L,2,6);[m
[31m-lua_settop(L,2);[m
[31m-auxsort(L,1,n);[m
[31m-return 0;[m
[31m-}[m
[31m-static const luaL_Reg tab_funcs[]={[m
[31m-{"concat",tconcat},[m
[31m-{"insert",tinsert},[m
[31m-{"remove",tremove},[m
[31m-{"sort",sort},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static int luaopen_table(lua_State*L){[m
[31m-luaL_register(L,"table",tab_funcs);[m
[31m-return 1;[m
[31m-}[m
[31m-static const char*const fnames[]={"input","output"};[m
[31m-static int pushresult(lua_State*L,int i,const char*filename){[m
[31m-int en=errno;[m
[31m-if(i){[m
[31m-lua_pushboolean(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-if(filename)[m
[31m-lua_pushfstring(L,"%s: %s",filename,strerror(en));[m
[31m-else[m
[31m-lua_pushfstring(L,"%s",strerror(en));[m
[31m-lua_pushinteger(L,en);[m
[31m-return 3;[m
[31m-}[m
[31m-}[m
[31m-static void fileerror(lua_State*L,int arg,const char*filename){[m
[31m-lua_pushfstring(L,"%s: %s",filename,strerror(errno));[m
[31m-luaL_argerror(L,arg,lua_tostring(L,-1));[m
[31m-}[m
[31m-#define tofilep(L)((FILE**)luaL_checkudata(L,1,"FILE*"))[m
[31m-static int io_type(lua_State*L){[m
[31m-void*ud;[m
[31m-luaL_checkany(L,1);[m
[31m-ud=lua_touserdata(L,1);[m
[31m-lua_getfield(L,(-10000),"FILE*");[m
[31m-if(ud==NULL||!lua_getmetatable(L,1)||!lua_rawequal(L,-2,-1))[m
[31m-lua_pushnil(L);[m
[31m-else if(*((FILE**)ud)==NULL)[m
[31m-lua_pushliteral(L,"closed file");[m
[31m-else[m
[31m-lua_pushliteral(L,"file");[m
[31m-return 1;[m
[31m-}[m
[31m-static FILE*tofile(lua_State*L){[m
[31m-FILE**f=tofilep(L);[m
[31m-if(*f==NULL)[m
[31m-luaL_error(L,"attempt to use a closed file");[m
[31m-return*f;[m
[31m-}[m
[31m-static FILE**newfile(lua_State*L){[m
[31m-FILE**pf=(FILE**)lua_newuserdata(L,sizeof(FILE*));[m
[31m-*pf=NULL;[m
[31m-luaL_getmetatable(L,"FILE*");[m
[31m-lua_setmetatable(L,-2);[m
[31m-return pf;[m
[31m-}[m
[31m-static int io_noclose(lua_State*L){[m
[31m-lua_pushnil(L);[m
[31m-lua_pushliteral(L,"cannot close standard file");[m
[31m-return 2;[m
[31m-}[m
[31m-static int io_pclose(lua_State*L){[m
[31m-FILE**p=tofilep(L);[m
[31m-int ok=lua_pclose(L,*p);[m
[31m-*p=NULL;[m
[31m-return pushresult(L,ok,NULL);[m
[31m-}[m
[31m-static int io_fclose(lua_State*L){[m
[31m-FILE**p=tofilep(L);[m
[31m-int ok=(fclose(*p)==0);[m
[31m-*p=NULL;[m
[31m-return pushresult(L,ok,NULL);[m
[31m-}[m
[31m-static int aux_close(lua_State*L){[m
[31m-lua_getfenv(L,1);[m
[31m-lua_getfield(L,-1,"__close");[m
[31m-return(lua_tocfunction(L,-1))(L);[m
[31m-}[m
[31m-static int io_close(lua_State*L){[m
[31m-if(lua_isnone(L,1))[m
[31m-lua_rawgeti(L,(-10001),2);[m
[31m-tofile(L);[m
[31m-return aux_close(L);[m
[31m-}[m
[31m-static int io_gc(lua_State*L){[m
[31m-FILE*f=*tofilep(L);[m
[31m-if(f!=NULL)[m
[31m-aux_close(L);[m
[31m-return 0;[m
[31m-}[m
[31m-static int io_open(lua_State*L){[m
[31m-const char*filename=luaL_checkstring(L,1);[m
[31m-const char*mode=luaL_optstring(L,2,"r");[m
[31m-FILE**pf=newfile(L);[m
[31m-*pf=fopen(filename,mode);[m
[31m-return(*pf==NULL)?pushresult(L,0,filename):1;[m
[31m-}[m
[31m-static FILE*getiofile(lua_State*L,int findex){[m
[31m-FILE*f;[m
[31m-lua_rawgeti(L,(-10001),findex);[m
[31m-f=*(FILE**)lua_touserdata(L,-1);[m
[31m-if(f==NULL)[m
[31m-luaL_error(L,"standard %s file is closed",fnames[findex-1]);[m
[31m-return f;[m
[31m-}[m
[31m-static int g_iofile(lua_State*L,int f,const char*mode){[m
[31m-if(!lua_isnoneornil(L,1)){[m
[31m-const char*filename=lua_tostring(L,1);[m
[31m-if(filename){[m
[31m-FILE**pf=newfile(L);[m
[31m-*pf=fopen(filename,mode);[m
[31m-if(*pf==NULL)[m
[31m-fileerror(L,1,filename);[m
[31m-}[m
[31m-else{[m
[31m-tofile(L);[m
[31m-lua_pushvalue(L,1);[m
[31m-}[m
[31m-lua_rawseti(L,(-10001),f);[m
[31m-}[m
[31m-lua_rawgeti(L,(-10001),f);[m
[31m-return 1;[m
[31m-}[m
[31m-static int io_input(lua_State*L){[m
[31m-return g_iofile(L,1,"r");[m
[31m-}[m
[31m-static int io_output(lua_State*L){[m
[31m-return g_iofile(L,2,"w");[m
[31m-}[m
[31m-static int io_readline(lua_State*L);[m
[31m-static void aux_lines(lua_State*L,int idx,int toclose){[m
[31m-lua_pushvalue(L,idx);[m
[31m-lua_pushboolean(L,toclose);[m
[31m-lua_pushcclosure(L,io_readline,2);[m
[31m-}[m
[31m-static int f_lines(lua_State*L){[m
[31m-tofile(L);[m
[31m-aux_lines(L,1,0);[m
[31m-return 1;[m
[31m-}[m
[31m-static int io_lines(lua_State*L){[m
[31m-if(lua_isnoneornil(L,1)){[m
[31m-lua_rawgeti(L,(-10001),1);[m
[31m-return f_lines(L);[m
[31m-}[m
[31m-else{[m
[31m-const char*filename=luaL_checkstring(L,1);[m
[31m-FILE**pf=newfile(L);[m
[31m-*pf=fopen(filename,"r");[m
[31m-if(*pf==NULL)[m
[31m-fileerror(L,1,filename);[m
[31m-aux_lines(L,lua_gettop(L),1);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-static int read_number(lua_State*L,FILE*f){[m
[31m-lua_Number d;[m
[31m-if(fscanf(f,"%lf",&d)==1){[m
[31m-lua_pushnumber(L,d);[m
[31m-return 1;[m
[31m-}[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-static int test_eof(lua_State*L,FILE*f){[m
[31m-int c=getc(f);[m
[31m-ungetc(c,f);[m
[31m-lua_pushlstring(L,NULL,0);[m
[31m-return(c!=EOF);[m
[31m-}[m
[31m-static int read_line(lua_State*L,FILE*f){[m
[31m-luaL_Buffer b;[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(;;){[m
[31m-size_t l;[m
[31m-char*p=luaL_prepbuffer(&b);[m
[31m-if(fgets(p,BUFSIZ,f)==NULL){[m
[31m-luaL_pushresult(&b);[m
[31m-return(lua_objlen(L,-1)>0);[m
[31m-}[m
[31m-l=strlen(p);[m
[31m-if(l==0||p[l-1]!='\n')[m
[31m-luaL_addsize(&b,l);[m
[31m-else{[m
[31m-luaL_addsize(&b,l-1);[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static int read_chars(lua_State*L,FILE*f,size_t n){[m
[31m-size_t rlen;[m
[31m-size_t nr;[m
[31m-luaL_Buffer b;[m
[31m-luaL_buffinit(L,&b);[m
[31m-rlen=BUFSIZ;[m
[31m-do{[m
[31m-char*p=luaL_prepbuffer(&b);[m
[31m-if(rlen>n)rlen=n;[m
[31m-nr=fread(p,sizeof(char),rlen,f);[m
[31m-luaL_addsize(&b,nr);[m
[31m-n-=nr;[m
[31m-}while(n>0&&nr==rlen);[m
[31m-luaL_pushresult(&b);[m
[31m-return(n==0||lua_objlen(L,-1)>0);[m
[31m-}[m
[31m-static int g_read(lua_State*L,FILE*f,int first){[m
[31m-int nargs=lua_gettop(L)-1;[m
[31m-int success;[m
[31m-int n;[m
[31m-clearerr(f);[m
[31m-if(nargs==0){[m
[31m-success=read_line(L,f);[m
[31m-n=first+1;[m
[31m-}[m
[31m-else{[m
[31m-luaL_checkstack(L,nargs+20,"too many arguments");[m
[31m-success=1;[m
[31m-for(n=first;nargs--&&success;n++){[m
[31m-if(lua_type(L,n)==3){[m
[31m-size_t l=(size_t)lua_tointeger(L,n);[m
[31m-success=(l==0)?test_eof(L,f):read_chars(L,f,l);[m
[31m-}[m
[31m-else{[m
[31m-const char*p=lua_tostring(L,n);[m
[31m-luaL_argcheck(L,p&&p[0]=='*',n,"invalid option");[m
[31m-switch(p[1]){[m
[31m-case'n':[m
[31m-success=read_number(L,f);[m
[31m-break;[m
[31m-case'l':[m
[31m-success=read_line(L,f);[m
[31m-break;[m
[31m-case'a':[m
[31m-read_chars(L,f,~((size_t)0));[m
[31m-success=1;[m
[31m-break;[m
[31m-default:[m
[31m-return luaL_argerror(L,n,"invalid format");[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-if(ferror(f))[m
[31m-return pushresult(L,0,NULL);[m
[31m-if(!success){[m
[31m-lua_pop(L,1);[m
[31m-lua_pushnil(L);[m
[31m-}[m
[31m-return n-first;[m
[31m-}[m
[31m-static int io_read(lua_State*L){[m
[31m-return g_read(L,getiofile(L,1),1);[m
[31m-}[m
[31m-static int f_read(lua_State*L){[m
[31m-return g_read(L,tofile(L),2);[m
[31m-}[m
[31m-static int io_readline(lua_State*L){[m
[31m-FILE*f=*(FILE**)lua_touserdata(L,lua_upvalueindex(1));[m
[31m-int sucess;[m
[31m-if(f==NULL)[m
[31m-luaL_error(L,"file is already closed");[m
[31m-sucess=read_line(L,f);[m
[31m-if(ferror(f))[m
[31m-return luaL_error(L,"%s",strerror(errno));[m
[31m-if(sucess)return 1;[m
[31m-else{[m
[31m-if(lua_toboolean(L,lua_upvalueindex(2))){[m
[31m-lua_settop(L,0);[m
[31m-lua_pushvalue(L,lua_upvalueindex(1));[m
[31m-aux_close(L);[m
[31m-}[m
[31m-return 0;[m
[31m-}[m
[31m-}[m
[31m-static int g_write(lua_State*L,FILE*f,int arg){[m
[31m-int nargs=lua_gettop(L)-1;[m
[31m-int status=1;[m
[31m-for(;nargs--;arg++){[m
[31m-if(lua_type(L,arg)==3){[m
[31m-status=status&&[m
[31m-fprintf(f,"%.14g",lua_tonumber(L,arg))>0;[m
[31m-}[m
[31m-else{[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,arg,&l);[m
[31m-status=status&&(fwrite(s,sizeof(char),l,f)==l);[m
[31m-}[m
[31m-}[m
[31m-return pushresult(L,status,NULL);[m
[31m-}[m
[31m-static int io_write(lua_State*L){[m
[31m-return g_write(L,getiofile(L,2),1);[m
[31m-}[m
[31m-static int f_write(lua_State*L){[m
[31m-return g_write(L,tofile(L),2);[m
[31m-}[m
[31m-static int io_flush(lua_State*L){[m
[31m-return pushresult(L,fflush(getiofile(L,2))==0,NULL);[m
[31m-}[m
[31m-static int f_flush(lua_State*L){[m
[31m-return pushresult(L,fflush(tofile(L))==0,NULL);[m
[31m-}[m
[31m-static const luaL_Reg iolib[]={[m
[31m-{"close",io_close},[m
[31m-{"flush",io_flush},[m
[31m-{"input",io_input},[m
[31m-{"lines",io_lines},[m
[31m-{"open",io_open},[m
[31m-{"output",io_output},[m
[31m-{"read",io_read},[m
[31m-{"type",io_type},[m
[31m-{"write",io_write},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static const luaL_Reg flib[]={[m
[31m-{"close",io_close},[m
[31m-{"flush",f_flush},[m
[31m-{"lines",f_lines},[m
[31m-{"read",f_read},[m
[31m-{"write",f_write},[m
[31m-{"__gc",io_gc},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static void createmeta(lua_State*L){[m
[31m-luaL_newmetatable(L,"FILE*");[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_setfield(L,-2,"__index");[m
[31m-luaL_register(L,NULL,flib);[m
[31m-}[m
[31m-static void createstdfile(lua_State*L,FILE*f,int k,const char*fname){[m
[31m-*newfile(L)=f;[m
[31m-if(k>0){[m
[31m-lua_pushvalue(L,-1);[m
[31m-lua_rawseti(L,(-10001),k);[m
[31m-}[m
[31m-lua_pushvalue(L,-2);[m
[31m-lua_setfenv(L,-2);[m
[31m-lua_setfield(L,-3,fname);[m
[31m-}[m
[31m-static void newfenv(lua_State*L,lua_CFunction cls){[m
[31m-lua_createtable(L,0,1);[m
[31m-lua_pushcfunction(L,cls);[m
[31m-lua_setfield(L,-2,"__close");[m
[31m-}[m
[31m-static int luaopen_io(lua_State*L){[m
[31m-createmeta(L);[m
[31m-newfenv(L,io_fclose);[m
[31m-lua_replace(L,(-10001));[m
[31m-luaL_register(L,"io",iolib);[m
[31m-newfenv(L,io_noclose);[m
[31m-createstdfile(L,stdin,1,"stdin");[m
[31m-createstdfile(L,stdout,2,"stdout");[m
[31m-createstdfile(L,stderr,0,"stderr");[m
[31m-lua_pop(L,1);[m
[31m-lua_getfield(L,-1,"popen");[m
[31m-newfenv(L,io_pclose);[m
[31m-lua_setfenv(L,-2);[m
[31m-lua_pop(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-static int os_pushresult(lua_State*L,int i,const char*filename){[m
[31m-int en=errno;[m
[31m-if(i){[m
[31m-lua_pushboolean(L,1);[m
[31m-return 1;[m
[31m-}[m
[31m-else{[m
[31m-lua_pushnil(L);[m
[31m-lua_pushfstring(L,"%s: %s",filename,strerror(en));[m
[31m-lua_pushinteger(L,en);[m
[31m-return 3;[m
[31m-}[m
[31m-}[m
[31m-static int os_remove(lua_State*L){[m
[31m-const char*filename=luaL_checkstring(L,1);[m
[31m-return os_pushresult(L,remove(filename)==0,filename);[m
[31m-}[m
[31m-static int os_exit(lua_State*L){[m
[31m-exit(luaL_optint(L,1,EXIT_SUCCESS));[m
[31m-}[m
[31m-static const luaL_Reg syslib[]={[m
[31m-{"exit",os_exit},[m
[31m-{"remove",os_remove},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static int luaopen_os(lua_State*L){[m
[31m-luaL_register(L,"os",syslib);[m
[31m-return 1;[m
[31m-}[m
[31m-#define uchar(c)((unsigned char)(c))[m
[31m-static ptrdiff_t posrelat(ptrdiff_t pos,size_t len){[m
[31m-if(pos<0)pos+=(ptrdiff_t)len+1;[m
[31m-return(pos>=0)?pos:0;[m
[31m-}[m
[31m-static int str_sub(lua_State*L){[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-ptrdiff_t start=posrelat(luaL_checkinteger(L,2),l);[m
[31m-ptrdiff_t end=posrelat(luaL_optinteger(L,3,-1),l);[m
[31m-if(start<1)start=1;[m
[31m-if(end>(ptrdiff_t)l)end=(ptrdiff_t)l;[m
[31m-if(start<=end)[m
[31m-lua_pushlstring(L,s+start-1,end-start+1);[m
[31m-else lua_pushliteral(L,"");[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_lower(lua_State*L){[m
[31m-size_t l;[m
[31m-size_t i;[m
[31m-luaL_Buffer b;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(i=0;i<l;i++)[m
[31m-luaL_addchar(&b,tolower(uchar(s[i])));[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_upper(lua_State*L){[m
[31m-size_t l;[m
[31m-size_t i;[m
[31m-luaL_Buffer b;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(i=0;i<l;i++)[m
[31m-luaL_addchar(&b,toupper(uchar(s[i])));[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_rep(lua_State*L){[m
[31m-size_t l;[m
[31m-luaL_Buffer b;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-int n=luaL_checkint(L,2);[m
[31m-luaL_buffinit(L,&b);[m
[31m-while(n-->0)[m
[31m-luaL_addlstring(&b,s,l);[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_byte(lua_State*L){[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,1,&l);[m
[31m-ptrdiff_t posi=posrelat(luaL_optinteger(L,2,1),l);[m
[31m-ptrdiff_t pose=posrelat(luaL_optinteger(L,3,posi),l);[m
[31m-int n,i;[m
[31m-if(posi<=0)posi=1;[m
[31m-if((size_t)pose>l)pose=l;[m
[31m-if(posi>pose)return 0;[m
[31m-n=(int)(pose-posi+1);[m
[31m-if(posi+n<=pose)[m
[31m-luaL_error(L,"string slice too long");[m
[31m-luaL_checkstack(L,n,"string slice too long");[m
[31m-for(i=0;i<n;i++)[m
[31m-lua_pushinteger(L,uchar(s[posi+i-1]));[m
[31m-return n;[m
[31m-}[m
[31m-static int str_char(lua_State*L){[m
[31m-int n=lua_gettop(L);[m
[31m-int i;[m
[31m-luaL_Buffer b;[m
[31m-luaL_buffinit(L,&b);[m
[31m-for(i=1;i<=n;i++){[m
[31m-int c=luaL_checkint(L,i);[m
[31m-luaL_argcheck(L,uchar(c)==c,i,"invalid value");[m
[31m-luaL_addchar(&b,uchar(c));[m
[31m-}[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-typedef struct MatchState{[m
[31m-const char*src_init;[m
[31m-const char*src_end;[m
[31m-lua_State*L;[m
[31m-int level;[m
[31m-struct{[m
[31m-const char*init;[m
[31m-ptrdiff_t len;[m
[31m-}capture[32];[m
[31m-}MatchState;[m
[31m-static int check_capture(MatchState*ms,int l){[m
[31m-l-='1';[m
[31m-if(l<0||l>=ms->level||ms->capture[l].len==(-1))[m
[31m-return luaL_error(ms->L,"invalid capture index");[m
[31m-return l;[m
[31m-}[m
[31m-static int capture_to_close(MatchState*ms){[m
[31m-int level=ms->level;[m
[31m-for(level--;level>=0;level--)[m
[31m-if(ms->capture[level].len==(-1))return level;[m
[31m-return luaL_error(ms->L,"invalid pattern capture");[m
[31m-}[m
[31m-static const char*classend(MatchState*ms,const char*p){[m
[31m-switch(*p++){[m
[31m-case'%':{[m
[31m-if(*p=='\0')[m
[31m-luaL_error(ms->L,"malformed pattern (ends with "LUA_QL("%%")")");[m
[31m-return p+1;[m
[31m-}[m
[31m-case'[':{[m
[31m-if(*p=='^')p++;[m
[31m-do{[m
[31m-if(*p=='\0')[m
[31m-luaL_error(ms->L,"malformed pattern (missing "LUA_QL("]")")");[m
[31m-if(*(p++)=='%'&&*p!='\0')[m
[31m-p++;[m
[31m-}while(*p!=']');[m
[31m-return p+1;[m
[31m-}[m
[31m-default:{[m
[31m-return p;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static int match_class(int c,int cl){[m
[31m-int res;[m
[31m-switch(tolower(cl)){[m
[31m-case'a':res=isalpha(c);break;[m
[31m-case'c':res=iscntrl(c);break;[m
[31m-case'd':res=isdigit(c);break;[m
[31m-case'l':res=islower(c);break;[m
[31m-case'p':res=ispunct(c);break;[m
[31m-case's':res=isspace(c);break;[m
[31m-case'u':res=isupper(c);break;[m
[31m-case'w':res=isalnum(c);break;[m
[31m-case'x':res=isxdigit(c);break;[m
[31m-case'z':res=(c==0);break;[m
[31m-default:return(cl==c);[m
[31m-}[m
[31m-return(islower(cl)?res:!res);[m
[31m-}[m
[31m-static int matchbracketclass(int c,const char*p,const char*ec){[m
[31m-int sig=1;[m
[31m-if(*(p+1)=='^'){[m
[31m-sig=0;[m
[31m-p++;[m
[31m-}[m
[31m-while(++p<ec){[m
[31m-if(*p=='%'){[m
[31m-p++;[m
[31m-if(match_class(c,uchar(*p)))[m
[31m-return sig;[m
[31m-}[m
[31m-else if((*(p+1)=='-')&&(p+2<ec)){[m
[31m-p+=2;[m
[31m-if(uchar(*(p-2))<=c&&c<=uchar(*p))[m
[31m-return sig;[m
[31m-}[m
[31m-else if(uchar(*p)==c)return sig;[m
[31m-}[m
[31m-return!sig;[m
[31m-}[m
[31m-static int singlematch(int c,const char*p,const char*ep){[m
[31m-switch(*p){[m
[31m-case'.':return 1;[m
[31m-case'%':return match_class(c,uchar(*(p+1)));[m
[31m-case'[':return matchbracketclass(c,p,ep-1);[m
[31m-default:return(uchar(*p)==c);[m
[31m-}[m
[31m-}[m
[31m-static const char*match(MatchState*ms,const char*s,const char*p);[m
[31m-static const char*matchbalance(MatchState*ms,const char*s,[m
[31m-const char*p){[m
[31m-if(*p==0||*(p+1)==0)[m
[31m-luaL_error(ms->L,"unbalanced pattern");[m
[31m-if(*s!=*p)return NULL;[m
[31m-else{[m
[31m-int b=*p;[m
[31m-int e=*(p+1);[m
[31m-int cont=1;[m
[31m-while(++s<ms->src_end){[m
[31m-if(*s==e){[m
[31m-if(--cont==0)return s+1;[m
[31m-}[m
[31m-else if(*s==b)cont++;[m
[31m-}[m
[31m-}[m
[31m-return NULL;[m
[31m-}[m
[31m-static const char*max_expand(MatchState*ms,const char*s,[m
[31m-const char*p,const char*ep){[m
[31m-ptrdiff_t i=0;[m
[31m-while((s+i)<ms->src_end&&singlematch(uchar(*(s+i)),p,ep))[m
[31m-i++;[m
[31m-while(i>=0){[m
[31m-const char*res=match(ms,(s+i),ep+1);[m
[31m-if(res)return res;[m
[31m-i--;[m
[31m-}[m
[31m-return NULL;[m
[31m-}[m
[31m-static const char*min_expand(MatchState*ms,const char*s,[m
[31m-const char*p,const char*ep){[m
[31m-for(;;){[m
[31m-const char*res=match(ms,s,ep+1);[m
[31m-if(res!=NULL)[m
[31m-return res;[m
[31m-else if(s<ms->src_end&&singlematch(uchar(*s),p,ep))[m
[31m-s++;[m
[31m-else return NULL;[m
[31m-}[m
[31m-}[m
[31m-static const char*start_capture(MatchState*ms,const char*s,[m
[31m-const char*p,int what){[m
[31m-const char*res;[m
[31m-int level=ms->level;[m
[31m-if(level>=32)luaL_error(ms->L,"too many captures");[m
[31m-ms->capture[level].init=s;[m
[31m-ms->capture[level].len=what;[m
[31m-ms->level=level+1;[m
[31m-if((res=match(ms,s,p))==NULL)[m
[31m-ms->level--;[m
[31m-return res;[m
[31m-}[m
[31m-static const char*end_capture(MatchState*ms,const char*s,[m
[31m-const char*p){[m
[31m-int l=capture_to_close(ms);[m
[31m-const char*res;[m
[31m-ms->capture[l].len=s-ms->capture[l].init;[m
[31m-if((res=match(ms,s,p))==NULL)[m
[31m-ms->capture[l].len=(-1);[m
[31m-return res;[m
[31m-}[m
[31m-static const char*match_capture(MatchState*ms,const char*s,int l){[m
[31m-size_t len;[m
[31m-l=check_capture(ms,l);[m
[31m-len=ms->capture[l].len;[m
[31m-if((size_t)(ms->src_end-s)>=len&&[m
[31m-memcmp(ms->capture[l].init,s,len)==0)[m
[31m-return s+len;[m
[31m-else return NULL;[m
[31m-}[m
[31m-static const char*match(MatchState*ms,const char*s,const char*p){[m
[31m-init:[m
[31m-switch(*p){[m
[31m-case'(':{[m
[31m-if(*(p+1)==')')[m
[31m-return start_capture(ms,s,p+2,(-2));[m
[31m-else[m
[31m-return start_capture(ms,s,p+1,(-1));[m
[31m-}[m
[31m-case')':{[m
[31m-return end_capture(ms,s,p+1);[m
[31m-}[m
[31m-case'%':{[m
[31m-switch(*(p+1)){[m
[31m-case'b':{[m
[31m-s=matchbalance(ms,s,p+2);[m
[31m-if(s==NULL)return NULL;[m
[31m-p+=4;goto init;[m
[31m-}[m
[31m-case'f':{[m
[31m-const char*ep;char previous;[m
[31m-p+=2;[m
[31m-if(*p!='[')[m
[31m-luaL_error(ms->L,"missing "LUA_QL("[")" after "[m
[31m-LUA_QL("%%f")" in pattern");[m
[31m-ep=classend(ms,p);[m
[31m-previous=(s==ms->src_init)?'\0':*(s-1);[m
[31m-if(matchbracketclass(uchar(previous),p,ep-1)||[m
[31m-!matchbracketclass(uchar(*s),p,ep-1))return NULL;[m
[31m-p=ep;goto init;[m
[31m-}[m
[31m-default:{[m
[31m-if(isdigit(uchar(*(p+1)))){[m
[31m-s=match_capture(ms,s,uchar(*(p+1)));[m
[31m-if(s==NULL)return NULL;[m
[31m-p+=2;goto init;[m
[31m-}[m
[31m-goto dflt;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-case'\0':{[m
[31m-return s;[m
[31m-}[m
[31m-case'$':{[m
[31m-if(*(p+1)=='\0')[m
[31m-return(s==ms->src_end)?s:NULL;[m
[31m-else goto dflt;[m
[31m-}[m
[31m-default:dflt:{[m
[31m-const char*ep=classend(ms,p);[m
[31m-int m=s<ms->src_end&&singlematch(uchar(*s),p,ep);[m
[31m-switch(*ep){[m
[31m-case'?':{[m
[31m-const char*res;[m
[31m-if(m&&((res=match(ms,s+1,ep+1))!=NULL))[m
[31m-return res;[m
[31m-p=ep+1;goto init;[m
[31m-}[m
[31m-case'*':{[m
[31m-return max_expand(ms,s,p,ep);[m
[31m-}[m
[31m-case'+':{[m
[31m-return(m?max_expand(ms,s+1,p,ep):NULL);[m
[31m-}[m
[31m-case'-':{[m
[31m-return min_expand(ms,s,p,ep);[m
[31m-}[m
[31m-default:{[m
[31m-if(!m)return NULL;[m
[31m-s++;p=ep;goto init;[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static const char*lmemfind(const char*s1,size_t l1,[m
[31m-const char*s2,size_t l2){[m
[31m-if(l2==0)return s1;[m
[31m-else if(l2>l1)return NULL;[m
[31m-else{[m
[31m-const char*init;[m
[31m-l2--;[m
[31m-l1=l1-l2;[m
[31m-while(l1>0&&(init=(const char*)memchr(s1,*s2,l1))!=NULL){[m
[31m-init++;[m
[31m-if(memcmp(init,s2+1,l2)==0)[m
[31m-return init-1;[m
[31m-else{[m
[31m-l1-=init-s1;[m
[31m-s1=init;[m
[31m-}[m
[31m-}[m
[31m-return NULL;[m
[31m-}[m
[31m-}[m
[31m-static void push_onecapture(MatchState*ms,int i,const char*s,[m
[31m-const char*e){[m
[31m-if(i>=ms->level){[m
[31m-if(i==0)[m
[31m-lua_pushlstring(ms->L,s,e-s);[m
[31m-else[m
[31m-luaL_error(ms->L,"invalid capture index");[m
[31m-}[m
[31m-else{[m
[31m-ptrdiff_t l=ms->capture[i].len;[m
[31m-if(l==(-1))luaL_error(ms->L,"unfinished capture");[m
[31m-if(l==(-2))[m
[31m-lua_pushinteger(ms->L,ms->capture[i].init-ms->src_init+1);[m
[31m-else[m
[31m-lua_pushlstring(ms->L,ms->capture[i].init,l);[m
[31m-}[m
[31m-}[m
[31m-static int push_captures(MatchState*ms,const char*s,const char*e){[m
[31m-int i;[m
[31m-int nlevels=(ms->level==0&&s)?1:ms->level;[m
[31m-luaL_checkstack(ms->L,nlevels,"too many captures");[m
[31m-for(i=0;i<nlevels;i++)[m
[31m-push_onecapture(ms,i,s,e);[m
[31m-return nlevels;[m
[31m-}[m
[31m-static int str_find_aux(lua_State*L,int find){[m
[31m-size_t l1,l2;[m
[31m-const char*s=luaL_checklstring(L,1,&l1);[m
[31m-const char*p=luaL_checklstring(L,2,&l2);[m
[31m-ptrdiff_t init=posrelat(luaL_optinteger(L,3,1),l1)-1;[m
[31m-if(init<0)init=0;[m
[31m-else if((size_t)(init)>l1)init=(ptrdiff_t)l1;[m
[31m-if(find&&(lua_toboolean(L,4)||[m
[31m-strpbrk(p,"^$*+?.([%-")==NULL)){[m
[31m-const char*s2=lmemfind(s+init,l1-init,p,l2);[m
[31m-if(s2){[m
[31m-lua_pushinteger(L,s2-s+1);[m
[31m-lua_pushinteger(L,s2-s+l2);[m
[31m-return 2;[m
[31m-}[m
[31m-}[m
[31m-else{[m
[31m-MatchState ms;[m
[31m-int anchor=(*p=='^')?(p++,1):0;[m
[31m-const char*s1=s+init;[m
[31m-ms.L=L;[m
[31m-ms.src_init=s;[m
[31m-ms.src_end=s+l1;[m
[31m-do{[m
[31m-const char*res;[m
[31m-ms.level=0;[m
[31m-if((res=match(&ms,s1,p))!=NULL){[m
[31m-if(find){[m
[31m-lua_pushinteger(L,s1-s+1);[m
[31m-lua_pushinteger(L,res-s);[m
[31m-return push_captures(&ms,NULL,0)+2;[m
[31m-}[m
[31m-else[m
[31m-return push_captures(&ms,s1,res);[m
[31m-}[m
[31m-}while(s1++<ms.src_end&&!anchor);[m
[31m-}[m
[31m-lua_pushnil(L);[m
[31m-return 1;[m
[31m-}[m
[31m-static int str_find(lua_State*L){[m
[31m-return str_find_aux(L,1);[m
[31m-}[m
[31m-static int str_match(lua_State*L){[m
[31m-return str_find_aux(L,0);[m
[31m-}[m
[31m-static int gmatch_aux(lua_State*L){[m
[31m-MatchState ms;[m
[31m-size_t ls;[m
[31m-const char*s=lua_tolstring(L,lua_upvalueindex(1),&ls);[m
[31m-const char*p=lua_tostring(L,lua_upvalueindex(2));[m
[31m-const char*src;[m
[31m-ms.L=L;[m
[31m-ms.src_init=s;[m
[31m-ms.src_end=s+ls;[m
[31m-for(src=s+(size_t)lua_tointeger(L,lua_upvalueindex(3));[m
[31m-src<=ms.src_end;[m
[31m-src++){[m
[31m-const char*e;[m
[31m-ms.level=0;[m
[31m-if((e=match(&ms,src,p))!=NULL){[m
[31m-lua_Integer newstart=e-s;[m
[31m-if(e==src)newstart++;[m
[31m-lua_pushinteger(L,newstart);[m
[31m-lua_replace(L,lua_upvalueindex(3));[m
[31m-return push_captures(&ms,src,e);[m
[31m-}[m
[31m-}[m
[31m-return 0;[m
[31m-}[m
[31m-static int gmatch(lua_State*L){[m
[31m-luaL_checkstring(L,1);[m
[31m-luaL_checkstring(L,2);[m
[31m-lua_settop(L,2);[m
[31m-lua_pushinteger(L,0);[m
[31m-lua_pushcclosure(L,gmatch_aux,3);[m
[31m-return 1;[m
[31m-}[m
[31m-static void add_s(MatchState*ms,luaL_Buffer*b,const char*s,[m
[31m-const char*e){[m
[31m-size_t l,i;[m
[31m-const char*news=lua_tolstring(ms->L,3,&l);[m
[31m-for(i=0;i<l;i++){[m
[31m-if(news[i]!='%')[m
[31m-luaL_addchar(b,news[i]);[m
[31m-else{[m
[31m-i++;[m
[31m-if(!isdigit(uchar(news[i])))[m
[31m-luaL_addchar(b,news[i]);[m
[31m-else if(news[i]=='0')[m
[31m-luaL_addlstring(b,s,e-s);[m
[31m-else{[m
[31m-push_onecapture(ms,news[i]-'1',s,e);[m
[31m-luaL_addvalue(b);[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-}[m
[31m-static void add_value(MatchState*ms,luaL_Buffer*b,const char*s,[m
[31m-const char*e){[m
[31m-lua_State*L=ms->L;[m
[31m-switch(lua_type(L,3)){[m
[31m-case 3:[m
[31m-case 4:{[m
[31m-add_s(ms,b,s,e);[m
[31m-return;[m
[31m-}[m
[31m-case 6:{[m
[31m-int n;[m
[31m-lua_pushvalue(L,3);[m
[31m-n=push_captures(ms,s,e);[m
[31m-lua_call(L,n,1);[m
[31m-break;[m
[31m-}[m
[31m-case 5:{[m
[31m-push_onecapture(ms,0,s,e);[m
[31m-lua_gettable(L,3);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-if(!lua_toboolean(L,-1)){[m
[31m-lua_pop(L,1);[m
[31m-lua_pushlstring(L,s,e-s);[m
[31m-}[m
[31m-else if(!lua_isstring(L,-1))[m
[31m-luaL_error(L,"invalid replacement value (a %s)",luaL_typename(L,-1));[m
[31m-luaL_addvalue(b);[m
[31m-}[m
[31m-static int str_gsub(lua_State*L){[m
[31m-size_t srcl;[m
[31m-const char*src=luaL_checklstring(L,1,&srcl);[m
[31m-const char*p=luaL_checkstring(L,2);[m
[31m-int tr=lua_type(L,3);[m
[31m-int max_s=luaL_optint(L,4,srcl+1);[m
[31m-int anchor=(*p=='^')?(p++,1):0;[m
[31m-int n=0;[m
[31m-MatchState ms;[m
[31m-luaL_Buffer b;[m
[31m-luaL_argcheck(L,tr==3||tr==4||[m
[31m-tr==6||tr==5,3,[m
[31m-"string/function/table expected");[m
[31m-luaL_buffinit(L,&b);[m
[31m-ms.L=L;[m
[31m-ms.src_init=src;[m
[31m-ms.src_end=src+srcl;[m
[31m-while(n<max_s){[m
[31m-const char*e;[m
[31m-ms.level=0;[m
[31m-e=match(&ms,src,p);[m
[31m-if(e){[m
[31m-n++;[m
[31m-add_value(&ms,&b,src,e);[m
[31m-}[m
[31m-if(e&&e>src)[m
[31m-src=e;[m
[31m-else if(src<ms.src_end)[m
[31m-luaL_addchar(&b,*src++);[m
[31m-else break;[m
[31m-if(anchor)break;[m
[31m-}[m
[31m-luaL_addlstring(&b,src,ms.src_end-src);[m
[31m-luaL_pushresult(&b);[m
[31m-lua_pushinteger(L,n);[m
[31m-return 2;[m
[31m-}[m
[31m-static void addquoted(lua_State*L,luaL_Buffer*b,int arg){[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,arg,&l);[m
[31m-luaL_addchar(b,'"');[m
[31m-while(l--){[m
[31m-switch(*s){[m
[31m-case'"':case'\\':case'\n':{[m
[31m-luaL_addchar(b,'\\');[m
[31m-luaL_addchar(b,*s);[m
[31m-break;[m
[31m-}[m
[31m-case'\r':{[m
[31m-luaL_addlstring(b,"\\r",2);[m
[31m-break;[m
[31m-}[m
[31m-case'\0':{[m
[31m-luaL_addlstring(b,"\\000",4);[m
[31m-break;[m
[31m-}[m
[31m-default:{[m
[31m-luaL_addchar(b,*s);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-s++;[m
[31m-}[m
[31m-luaL_addchar(b,'"');[m
[31m-}[m
[31m-static const char*scanformat(lua_State*L,const char*strfrmt,char*form){[m
[31m-const char*p=strfrmt;[m
[31m-while(*p!='\0'&&strchr("-+ #0",*p)!=NULL)p++;[m
[31m-if((size_t)(p-strfrmt)>=sizeof("-+ #0"))[m
[31m-luaL_error(L,"invalid format (repeated flags)");[m
[31m-if(isdigit(uchar(*p)))p++;[m
[31m-if(isdigit(uchar(*p)))p++;[m
[31m-if(*p=='.'){[m
[31m-p++;[m
[31m-if(isdigit(uchar(*p)))p++;[m
[31m-if(isdigit(uchar(*p)))p++;[m
[31m-}[m
[31m-if(isdigit(uchar(*p)))[m
[31m-luaL_error(L,"invalid format (width or precision too long)");[m
[31m-*(form++)='%';[m
[31m-strncpy(form,strfrmt,p-strfrmt+1);[m
[31m-form+=p-strfrmt+1;[m
[31m-*form='\0';[m
[31m-return p;[m
[31m-}[m
[31m-static void addintlen(char*form){[m
[31m-size_t l=strlen(form);[m
[31m-char spec=form[l-1];[m
[31m-strcpy(form+l-1,"l");[m
[31m-form[l+sizeof("l")-2]=spec;[m
[31m-form[l+sizeof("l")-1]='\0';[m
[31m-}[m
[31m-static int str_format(lua_State*L){[m
[31m-int top=lua_gettop(L);[m
[31m-int arg=1;[m
[31m-size_t sfl;[m
[31m-const char*strfrmt=luaL_checklstring(L,arg,&sfl);[m
[31m-const char*strfrmt_end=strfrmt+sfl;[m
[31m-luaL_Buffer b;[m
[31m-luaL_buffinit(L,&b);[m
[31m-while(strfrmt<strfrmt_end){[m
[31m-if(*strfrmt!='%')[m
[31m-luaL_addchar(&b,*strfrmt++);[m
[31m-else if(*++strfrmt=='%')[m
[31m-luaL_addchar(&b,*strfrmt++);[m
[31m-else{[m
[31m-char form[(sizeof("-+ #0")+sizeof("l")+10)];[m
[31m-char buff[512];[m
[31m-if(++arg>top)[m
[31m-luaL_argerror(L,arg,"no value");[m
[31m-strfrmt=scanformat(L,strfrmt,form);[m
[31m-switch(*strfrmt++){[m
[31m-case'c':{[m
[31m-sprintf(buff,form,(int)luaL_checknumber(L,arg));[m
[31m-break;[m
[31m-}[m
[31m-case'd':case'i':{[m
[31m-addintlen(form);[m
[31m-sprintf(buff,form,(long)luaL_checknumber(L,arg));[m
[31m-break;[m
[31m-}[m
[31m-case'o':case'u':case'x':case'X':{[m
[31m-addintlen(form);[m
[31m-sprintf(buff,form,(unsigned long)luaL_checknumber(L,arg));[m
[31m-break;[m
[31m-}[m
[31m-case'e':case'E':case'f':[m
[31m-case'g':case'G':{[m
[31m-sprintf(buff,form,(double)luaL_checknumber(L,arg));[m
[31m-break;[m
[31m-}[m
[31m-case'q':{[m
[31m-addquoted(L,&b,arg);[m
[31m-continue;[m
[31m-}[m
[31m-case's':{[m
[31m-size_t l;[m
[31m-const char*s=luaL_checklstring(L,arg,&l);[m
[31m-if(!strchr(form,'.')&&l>=100){[m
[31m-lua_pushvalue(L,arg);[m
[31m-luaL_addvalue(&b);[m
[31m-continue;[m
[31m-}[m
[31m-else{[m
[31m-sprintf(buff,form,s);[m
[31m-break;[m
[31m-}[m
[31m-}[m
[31m-default:{[m
[31m-return luaL_error(L,"invalid option "LUA_QL("%%%c")" to "[m
[31m-LUA_QL("format"),*(strfrmt-1));[m
[31m-}[m
[31m-}[m
[31m-luaL_addlstring(&b,buff,strlen(buff));[m
[31m-}[m
[31m-}[m
[31m-luaL_pushresult(&b);[m
[31m-return 1;[m
[31m-}[m
[31m-static const luaL_Reg strlib[]={[m
[31m-{"byte",str_byte},[m
[31m-{"char",str_char},[m
[31m-{"find",str_find},[m
[31m-{"format",str_format},[m
[31m-{"gmatch",gmatch},[m
[31m-{"gsub",str_gsub},[m
[31m-{"lower",str_lower},[m
[31m-{"match",str_match},[m
[31m-{"rep",str_rep},[m
[31m-{"sub",str_sub},[m
[31m-{"upper",str_upper},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static void createmetatable(lua_State*L){[m
[31m-lua_createtable(L,0,1);[m
[31m-lua_pushliteral(L,"");[m
[31m-lua_pushvalue(L,-2);[m
[31m-lua_setmetatable(L,-2);[m
[31m-lua_pop(L,1);[m
[31m-lua_pushvalue(L,-2);[m
[31m-lua_setfield(L,-2,"__index");[m
[31m-lua_pop(L,1);[m
[31m-}[m
[31m-static int luaopen_string(lua_State*L){[m
[31m-luaL_register(L,"string",strlib);[m
[31m-createmetatable(L);[m
[31m-return 1;[m
[31m-}[m
[31m-static const luaL_Reg lualibs[]={[m
[31m-{"",luaopen_base},[m
[31m-{"table",luaopen_table},[m
[31m-{"io",luaopen_io},[m
[31m-{"os",luaopen_os},[m
[31m-{"string",luaopen_string},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-static void luaL_openlibs(lua_State*L){[m
[31m-const luaL_Reg*lib=lualibs;[m
[31m-for(;lib->func;lib++){[m
[31m-lua_pushcfunction(L,lib->func);[m
[31m-lua_pushstring(L,lib->name);[m
[31m-lua_call(L,1,0);[m
[31m-}[m
[31m-}[m
[31m-typedef unsigned int UB;[m
[31m-static UB barg(lua_State*L,int idx){[m
[31m-union{lua_Number n;U64 b;}bn;[m
[31m-bn.n=lua_tonumber(L,idx)+6755399441055744.0;[m
[31m-if(bn.n==0.0&&!lua_isnumber(L,idx))luaL_typerror(L,idx,"number");[m
[31m-return(UB)bn.b;[m
[31m-}[m
[31m-#define BRET(b)lua_pushnumber(L,(lua_Number)(int)(b));return 1;[m
[31m-static int tobit(lua_State*L){[m
[31m-BRET(barg(L,1))}[m
[31m-static int bnot(lua_State*L){[m
[31m-BRET(~barg(L,1))}[m
[31m-static int band(lua_State*L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b&=barg(L,i);BRET(b)}[m
[31m-static int bor(lua_State*L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b|=barg(L,i);BRET(b)}[m
[31m-static int bxor(lua_State*L){[m
[31m-int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b^=barg(L,i);BRET(b)}[m
[31m-static int lshift(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET(b<<n)}[m
[31m-static int rshift(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET(b>>n)}[m
[31m-static int arshift(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((int)b>>n)}[m
[31m-static int rol(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((b<<n)|(b>>(32-n)))}[m
[31m-static int ror(lua_State*L){[m
[31m-UB b=barg(L,1),n=barg(L,2)&31;BRET((b>>n)|(b<<(32-n)))}[m
[31m-static int bswap(lua_State*L){[m
[31m-UB b=barg(L,1);b=(b>>24)|((b>>8)&0xff00)|((b&0xff00)<<8)|(b<<24);BRET(b)}[m
[31m-static int tohex(lua_State*L){[m
[31m-UB b=barg(L,1);[m
[31m-int n=lua_isnone(L,2)?8:(int)barg(L,2);[m
[31m-const char*hexdigits="0123456789abcdef";[m
[31m-char buf[8];[m
[31m-int i;[m
[31m-if(n<0){n=-n;hexdigits="0123456789ABCDEF";}[m
[31m-if(n>8)n=8;[m
[31m-for(i=(int)n;--i>=0;){buf[i]=hexdigits[b&15];b>>=4;}[m
[31m-lua_pushlstring(L,buf,(size_t)n);[m
[31m-return 1;[m
[31m-}[m
[31m-static const struct luaL_Reg bitlib[]={[m
[31m-{"tobit",tobit},[m
[31m-{"bnot",bnot},[m
[31m-{"band",band},[m
[31m-{"bor",bor},[m
[31m-{"bxor",bxor},[m
[31m-{"lshift",lshift},[m
[31m-{"rshift",rshift},[m
[31m-{"arshift",arshift},[m
[31m-{"rol",rol},[m
[31m-{"ror",ror},[m
[31m-{"bswap",bswap},[m
[31m-{"tohex",tohex},[m
[31m-{NULL,NULL}[m
[31m-};[m
[31m-int main(int argc,char**argv){[m
[31m-lua_State*L=luaL_newstate();[m
[31m-int i;[m
[31m-luaL_openlibs(L);[m
[31m-luaL_register(L,"bit",bitlib);[m
[31m-if(argc<2)return sizeof(void*);[m
[31m-lua_createtable(L,0,1);[m
[31m-lua_pushstring(L,argv[1]);[m
[31m-lua_rawseti(L,-2,0);[m
[31m-lua_setglobal(L,"arg");[m
[31m-if(luaL_loadfile(L,argv[1]))[m
[31m-goto err;[m
[31m-for(i=2;i<argc;i++)[m
[31m-lua_pushstring(L,argv[i]);[m
[31m-if(lua_pcall(L,argc-2,0,0)){[m
[31m-err:[m
[31m-fprintf(stderr,"Error: %s\n",lua_tostring(L,-1));[m
[31m-return 1;[m
[31m-}[m
[31m-lua_close(L);[m
[31m-return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 500e285..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-vmdef.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/bc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/bc.lua[m
[1mdeleted file mode 100644[m
[1mindex a8cb849..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/bc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT bytecode listing module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module lists the bytecode of a Lua function. If it's loaded by -jbc[m
[31m--- it hooks into the parser and lists all functions of a chunk as they[m
[31m--- are parsed.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jbc -e 'local x=0; for i=1,1e6 do x=x+i end; print(x)'[m
[31m---   luajit -jbc=- foo.lua[m
[31m---   luajit -jbc=foo.list foo.lua[m
[31m---[m
[31m--- Default output is to stderr. To redirect the output to a file, pass a[m
[31m--- filename as an argument (use '-' for stdout) or set the environment[m
[31m--- variable LUAJIT_LISTFILE. The file is overwritten every time the module[m
[31m--- is started.[m
[31m---[m
[31m--- This module can also be used programmatically:[m
[31m---[m
[31m---   local bc = require("jit.bc")[m
[31m---[m
[31m---   local function foo() print("hello") end[m
[31m---[m
[31m---   bc.dump(foo)           --> -- BYTECODE -- [...][m
[31m---   print(bc.line(foo, 2)) --> 0002    KSTR     1   1      ; "hello"[m
[31m---[m
[31m---   local out = {[m
[31m---     -- Do something with each line:[m
[31m---     write = function(t, ...) io.write(...) end,[m
[31m---     close = function(t) end,[m
[31m---     flush = function(t) end,[m
[31m---   }[m
[31m---   bc.dump(foo, out)[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local bit = require("bit")[m
[31m-local sub, gsub, format = string.sub, string.gsub, string.format[m
[31m-local byte, band, shr = string.byte, bit.band, bit.rshift[m
[31m-local funcinfo, funcbc, funck = jutil.funcinfo, jutil.funcbc, jutil.funck[m
[31m-local funcuvname = jutil.funcuvname[m
[31m-local bcnames = vmdef.bcnames[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function ctlsub(c)[m
[31m-  if c == "\n" then return "\\n"[m
[31m-  elseif c == "\r" then return "\\r"[m
[31m-  elseif c == "\t" then return "\\t"[m
[31m-  else return format("\\%03d", byte(c))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Return one bytecode line.[m
[31m-local function bcline(func, pc, prefix)[m
[31m-  local ins, m = funcbc(func, pc)[m
[31m-  if not ins then return end[m
[31m-  local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128)[m
[31m-  local a = band(shr(ins, 8), 0xff)[m
[31m-  local oidx = 6*band(ins, 0xff)[m
[31m-  local op = sub(bcnames, oidx+1, oidx+6)[m
[31m-  local s = format("%04d %s %-6s %3s ",[m
[31m-    pc, prefix or "  ", op, ma == 0 and "" or a)[m
[31m-  local d = shr(ins, 16)[m
[31m-  if mc == 13*128 then -- BCMjump[m
[31m-    return format("%s=> %04d\n", s, pc+d-0x7fff)[m
[31m-  end[m
[31m-  if mb ~= 0 then[m
[31m-    d = band(d, 0xff)[m
[31m-  elseif mc == 0 then[m
[31m-    return s.."\n"[m
[31m-  end[m
[31m-  local kc[m
[31m-  if mc == 10*128 then -- BCMstr[m
[31m-    kc = funck(func, -d-1)[m
[31m-    kc = format(#kc > 40 and '"%.40s"~' or '"%s"', gsub(kc, "%c", ctlsub))[m
[31m-  elseif mc == 9*128 then -- BCMnum[m
[31m-    kc = funck(func, d)[m
[31m-    if op == "TSETM " then kc = kc - 2^52 end[m
[31m-  elseif mc == 12*128 then -- BCMfunc[m
[31m-    local fi = funcinfo(funck(func, -d-1))[m
[31m-    if fi.ffid then[m
[31m-      kc = vmdef.ffnames[fi.ffid][m
[31m-    else[m
[31m-      kc = fi.loc[m
[31m-    end[m
[31m-  elseif mc == 5*128 then -- BCMuv[m
[31m-    kc = funcuvname(func, d)[m
[31m-  end[m
[31m-  if ma == 5 then -- BCMuv[m
[31m-    local ka = funcuvname(func, a)[m
[31m-    if kc then kc = ka.." ; "..kc else kc = ka end[m
[31m-  end[m
[31m-  if mb ~= 0 then[m
[31m-    local b = shr(ins, 24)[m
[31m-    if kc then return format("%s%3d %3d  ; %s\n", s, b, d, kc) end[m
[31m-    return format("%s%3d %3d\n", s, b, d)[m
[31m-  end[m
[31m-  if kc then return format("%s%3d      ; %s\n", s, d, kc) end[m
[31m-  if mc == 7*128 and d > 32767 then d = d - 65536 end -- BCMlits[m
[31m-  return format("%s%3d\n", s, d)[m
[31m-end[m
[31m-[m
[31m--- Collect branch targets of a function.[m
[31m-local function bctargets(func)[m
[31m-  local target = {}[m
[31m-  for pc=1,1000000000 do[m
[31m-    local ins, m = funcbc(func, pc)[m
[31m-    if not ins then break end[m
[31m-    if band(m, 15*128) == 13*128 then target[pc+shr(ins, 16)-0x7fff] = true end[m
[31m-  end[m
[31m-  return target[m
[31m-end[m
[31m-[m
[31m--- Dump bytecode instructions of a function.[m
[31m-local function bcdump(func, out, all)[m
[31m-  if not out then out = stdout end[m
[31m-  local fi = funcinfo(func)[m
[31m-  if all and fi.children then[m
[31m-    for n=-1,-1000000000,-1 do[m
[31m-      local k = funck(func, n)[m
[31m-      if not k then break end[m
[31m-      if type(k) == "proto" then bcdump(k, out, true) end[m
[31m-    end[m
[31m-  end[m
[31m-  out:write(format("-- BYTECODE -- %s-%d\n", fi.loc, fi.lastlinedefined))[m
[31m-  local target = bctargets(func)[m
[31m-  for pc=1,1000000000 do[m
[31m-    local s = bcline(func, pc, target[pc] and "=>")[m
[31m-    if not s then break end[m
[31m-    out:write(s)[m
[31m-  end[m
[31m-  out:write("\n")[m
[31m-  out:flush()[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Active flag and output file handle.[m
[31m-local active, out[m
[31m-[m
[31m--- List handler.[m
[31m-local function h_list(func)[m
[31m-  return bcdump(func, out)[m
[31m-end[m
[31m-[m
[31m--- Detach list handler.[m
[31m-local function bclistoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(h_list)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach list handler.[m
[31m-local function bcliston(outfile)[m
[31m-  if active then bclistoff() end[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_LISTFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stderr[m
[31m-  end[m
[31m-  jit.attach(h_list, "bc")[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  line = bcline,[m
[31m-  dump = bcdump,[m
[31m-  targets = bctargets,[m
[31m-  on = bcliston,[m
[31m-  off = bclistoff,[m
[31m-  start = bcliston -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/bcsave.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/bcsave.lua[m
[1mdeleted file mode 100644[m
[1mindex d0968b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/bcsave.lua[m
[1m+++ /dev/null[m
[36m@@ -1,661 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT module to save/list bytecode.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module saves or lists the bytecode for an input file.[m
[31m--- It's run by the -b command line option.[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local bit = require("bit")[m
[31m-[m
[31m--- Symbol name prefix for LuaJIT bytecode.[m
[31m-local LJBC_PREFIX = "luaJIT_BC_"[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function usage()[m
[31m-  io.stderr:write[[[m
[31m-Save LuaJIT bytecode: luajit -b[options] input output[m
[31m-  -l        Only list bytecode.[m
[31m-  -s        Strip debug info (default).[m
[31m-  -g        Keep debug info.[m
[31m-  -n name   Set module name (default: auto-detect from input name).[m
[31m-  -t type   Set output file type (default: auto-detect from output name).[m
[31m-  -a arch   Override architecture for object files (default: native).[m
[31m-  -o os     Override OS for object files (default: native).[m
[31m-  -e chunk  Use chunk string as input.[m
[31m-  --        Stop handling options.[m
[31m-  -         Use stdin as input and/or stdout as output.[m
[31m-[m
[31m-File types: c h obj o raw (default)[m
[31m-]][m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function check(ok, ...)[m
[31m-  if ok then return ok, ... end[m
[31m-  io.stderr:write("luajit: ", ...)[m
[31m-  io.stderr:write("\n")[m
[31m-  os.exit(1)[m
[31m-end[m
[31m-[m
[31m-local function readfile(input)[m
[31m-  if type(input) == "function" then return input end[m
[31m-  if input == "-" then input = nil end[m
[31m-  return check(loadfile(input))[m
[31m-end[m
[31m-[m
[31m-local function savefile(name, mode)[m
[31m-  if name == "-" then return io.stdout end[m
[31m-  return check(io.open(name, mode))[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_type = {[m
[31m-  raw = "raw", c = "c", h = "h", o = "obj", obj = "obj",[m
[31m-}[m
[31m-[m
[31m-local map_arch = {[m
[31m-  x86 = true, x64 = true, arm = true, arm64 = true, ppc = true,[m
[31m-  mips = true, mipsel = true,[m
[31m-}[m
[31m-[m
[31m-local map_os = {[m
[31m-  linux = true, windows = true, osx = true, freebsd = true, netbsd = true,[m
[31m-  openbsd = true, dragonfly = true, solaris = true,[m
[31m-}[m
[31m-[m
[31m-local function checkarg(str, map, err)[m
[31m-  str = string.lower(str)[m
[31m-  local s = check(map[str], "unknown ", err)[m
[31m-  return s == true and str or s[m
[31m-end[m
[31m-[m
[31m-local function detecttype(str)[m
[31m-  local ext = string.match(string.lower(str), "%.(%a+)$")[m
[31m-  return map_type[ext] or "raw"[m
[31m-end[m
[31m-[m
[31m-local function checkmodname(str)[m
[31m-  check(string.match(str, "^[%w_.%-]+$"), "bad module name")[m
[31m-  return string.gsub(str, "[%.%-]", "_")[m
[31m-end[m
[31m-[m
[31m-local function detectmodname(str)[m
[31m-  if type(str) == "string" then[m
[31m-    local tail = string.match(str, "[^/\\]+$")[m
[31m-    if tail then str = tail end[m
[31m-    local head = string.match(str, "^(.*)%.[^.]*$")[m
[31m-    if head then str = head end[m
[31m-    str = string.match(str, "^[%w_.%-]+")[m
[31m-  else[m
[31m-    str = nil[m
[31m-  end[m
[31m-  check(str, "cannot derive module name, use -n name")[m
[31m-  return string.gsub(str, "[%.%-]", "_")[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function bcsave_tail(fp, output, s)[m
[31m-  local ok, err = fp:write(s)[m
[31m-  if ok and output ~= "-" then ok, err = fp:close() end[m
[31m-  check(ok, "cannot write ", output, ": ", err)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_raw(output, s)[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_c(ctx, output, s)[m
[31m-  local fp = savefile(output, "w")[m
[31m-  if ctx.type == "c" then[m
[31m-    fp:write(string.format([[[m
[31m-#ifdef _cplusplus[m
[31m-extern "C"[m
[31m-#endif[m
[31m-#ifdef _WIN32[m
[31m-__declspec(dllexport)[m
[31m-#endif[m
[31m-const char %s%s[] = {[m
[31m-]], LJBC_PREFIX, ctx.modname))[m
[31m-  else[m
[31m-    fp:write(string.format([[[m
[31m-#define %s%s_SIZE %d[m
[31m-static const char %s%s[] = {[m
[31m-]], LJBC_PREFIX, ctx.modname, #s, LJBC_PREFIX, ctx.modname))[m
[31m-  end[m
[31m-  local t, n, m = {}, 0, 0[m
[31m-  for i=1,#s do[m
[31m-    local b = tostring(string.byte(s, i))[m
[31m-    m = m + #b + 1[m
[31m-    if m > 78 then[m
[31m-      fp:write(table.concat(t, ",", 1, n), ",\n")[m
[31m-      n, m = 0, #b + 1[m
[31m-    end[m
[31m-    n = n + 1[m
[31m-    t[n] = b[m
[31m-  end[m
[31m-  bcsave_tail(fp, output, table.concat(t, ",", 1, n).."\n};\n")[m
[31m-end[m
[31m-[m
[31m-local function bcsave_elfobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct {[m
[31m-  uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7];[m
[31m-  uint16_t type, machine;[m
[31m-  uint32_t version;[m
[31m-  uint32_t entry, phofs, shofs;[m
[31m-  uint32_t flags;[m
[31m-  uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx;[m
[31m-} ELF32header;[m
[31m-typedef struct {[m
[31m-  uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7];[m
[31m-  uint16_t type, machine;[m
[31m-  uint32_t version;[m
[31m-  uint64_t entry, phofs, shofs;[m
[31m-  uint32_t flags;[m
[31m-  uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx;[m
[31m-} ELF64header;[m
[31m-typedef struct {[m
[31m-  uint32_t name, type, flags, addr, ofs, size, link, info, align, entsize;[m
[31m-} ELF32sectheader;[m
[31m-typedef struct {[m
[31m-  uint32_t name, type;[m
[31m-  uint64_t flags, addr, ofs, size;[m
[31m-  uint32_t link, info;[m
[31m-  uint64_t align, entsize;[m
[31m-} ELF64sectheader;[m
[31m-typedef struct {[m
[31m-  uint32_t name, value, size;[m
[31m-  uint8_t info, other;[m
[31m-  uint16_t sectidx;[m
[31m-} ELF32symbol;[m
[31m-typedef struct {[m
[31m-  uint32_t name;[m
[31m-  uint8_t info, other;[m
[31m-  uint16_t sectidx;[m
[31m-  uint64_t value, size;[m
[31m-} ELF64symbol;[m
[31m-typedef struct {[m
[31m-  ELF32header hdr;[m
[31m-  ELF32sectheader sect[6];[m
[31m-  ELF32symbol sym[2];[m
[31m-  uint8_t space[4096];[m
[31m-} ELF32obj;[m
[31m-typedef struct {[m
[31m-  ELF64header hdr;[m
[31m-  ELF64sectheader sect[6];[m
[31m-  ELF64symbol sym[2];[m
[31m-  uint8_t space[4096];[m
[31m-} ELF64obj;[m
[31m-]][m
[31m-  local symname = LJBC_PREFIX..ctx.modname[m
[31m-  local is64, isbe = false, false[m
[31m-  if ctx.arch == "x64" or ctx.arch == "arm64" then[m
[31m-    is64 = true[m
[31m-  elseif ctx.arch == "ppc" or ctx.arch == "mips" then[m
[31m-    isbe = true[m
[31m-  end[m
[31m-[m
[31m-  -- Handle different host/target endianess.[m
[31m-  local function f32(x) return x end[m
[31m-  local f16, fofs = f32, f32[m
[31m-  if ffi.abi("be") ~= isbe then[m
[31m-    f32 = bit.bswap[m
[31m-    function f16(x) return bit.rshift(bit.bswap(x), 16) end[m
[31m-    if is64 then[m
[31m-      local two32 = ffi.cast("int64_t", 2^32)[m
[31m-      function fofs(x) return bit.bswap(x)*two32 end[m
[31m-    else[m
[31m-      fofs = f32[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  -- Create ELF object and fill in header.[m
[31m-  local o = ffi.new(is64 and "ELF64obj" or "ELF32obj")[m
[31m-  local hdr = o.hdr[m
[31m-  if ctx.os == "bsd" or ctx.os == "other" then -- Determine native hdr.eosabi.[m
[31m-    local bf = assert(io.open("/bin/ls", "rb"))[m
[31m-    local bs = bf:read(9)[m
[31m-    bf:close()[m
[31m-    ffi.copy(o, bs, 9)[m
[31m-    check(hdr.emagic[0] == 127, "no support for writing native object files")[m
[31m-  else[m
[31m-    hdr.emagic = "\127ELF"[m
[31m-    hdr.eosabi = ({ freebsd=9, netbsd=2, openbsd=12, solaris=6 })[ctx.os] or 0[m
[31m-  end[m
[31m-  hdr.eclass = is64 and 2 or 1[m
[31m-  hdr.eendian = isbe and 2 or 1[m
[31m-  hdr.eversion = 1[m
[31m-  hdr.type = f16(1)[m
[31m-  hdr.machine = f16(({ x86=3, x64=62, arm=40, arm64=183, ppc=20, mips=8, mipsel=8 })[ctx.arch])[m
[31m-  if ctx.arch == "mips" or ctx.arch == "mipsel" then[m
[31m-    hdr.flags = 0x50001006[m
[31m-  end[m
[31m-  hdr.version = f32(1)[m
[31m-  hdr.shofs = fofs(ffi.offsetof(o, "sect"))[m
[31m-  hdr.ehsize = f16(ffi.sizeof(hdr))[m
[31m-  hdr.shentsize = f16(ffi.sizeof(o.sect[0]))[m
[31m-  hdr.shnum = f16(6)[m
[31m-  hdr.shstridx = f16(2)[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  local sofs, ofs = ffi.offsetof(o, "space"), 1[m
[31m-  for i,name in ipairs{[m
[31m-      ".symtab", ".shstrtab", ".strtab", ".rodata", ".note.GNU-stack",[m
[31m-    } do[m
[31m-    local sect = o.sect[i][m
[31m-    sect.align = fofs(1)[m
[31m-    sect.name = f32(ofs)[m
[31m-    ffi.copy(o.space+ofs, name)[m
[31m-    ofs = ofs + #name+1[m
[31m-  end[m
[31m-  o.sect[1].type = f32(2) -- .symtab[m
[31m-  o.sect[1].link = f32(3)[m
[31m-  o.sect[1].info = f32(1)[m
[31m-  o.sect[1].align = fofs(8)[m
[31m-  o.sect[1].ofs = fofs(ffi.offsetof(o, "sym"))[m
[31m-  o.sect[1].entsize = fofs(ffi.sizeof(o.sym[0]))[m
[31m-  o.sect[1].size = fofs(ffi.sizeof(o.sym))[m
[31m-  o.sym[1].name = f32(1)[m
[31m-  o.sym[1].sectidx = f16(4)[m
[31m-  o.sym[1].size = fofs(#s)[m
[31m-  o.sym[1].info = 17[m
[31m-  o.sect[2].type = f32(3) -- .shstrtab[m
[31m-  o.sect[2].ofs = fofs(sofs)[m
[31m-  o.sect[2].size = fofs(ofs)[m
[31m-  o.sect[3].type = f32(3) -- .strtab[m
[31m-  o.sect[3].ofs = fofs(sofs + ofs)[m
[31m-  o.sect[3].size = fofs(#symname+1)[m
[31m-  ffi.copy(o.space+ofs+1, symname)[m
[31m-  ofs = ofs + #symname + 2[m
[31m-  o.sect[4].type = f32(1) -- .rodata[m
[31m-  o.sect[4].flags = fofs(2)[m
[31m-  o.sect[4].ofs = fofs(sofs + ofs)[m
[31m-  o.sect[4].size = fofs(#s)[m
[31m-  o.sect[5].type = f32(1) -- .note.GNU-stack[m
[31m-  o.sect[5].ofs = fofs(sofs + ofs + #s)[m
[31m-[m
[31m-  -- Write ELF object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_peobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct {[m
[31m-  uint16_t arch, nsects;[m
[31m-  uint32_t time, symtabofs, nsyms;[m
[31m-  uint16_t opthdrsz, flags;[m
[31m-} PEheader;[m
[31m-typedef struct {[m
[31m-  char name[8];[m
[31m-  uint32_t vsize, vaddr, size, ofs, relocofs, lineofs;[m
[31m-  uint16_t nreloc, nline;[m
[31m-  uint32_t flags;[m
[31m-} PEsection;[m
[31m-typedef struct __attribute((packed)) {[m
[31m-  union {[m
[31m-    char name[8];[m
[31m-    uint32_t nameref[2];[m
[31m-  };[m
[31m-  uint32_t value;[m
[31m-  int16_t sect;[m
[31m-  uint16_t type;[m
[31m-  uint8_t scl, naux;[m
[31m-} PEsym;[m
[31m-typedef struct __attribute((packed)) {[m
[31m-  uint32_t size;[m
[31m-  uint16_t nreloc, nline;[m
[31m-  uint32_t cksum;[m
[31m-  uint16_t assoc;[m
[31m-  uint8_t comdatsel, unused[3];[m
[31m-} PEsymaux;[m
[31m-typedef struct {[m
[31m-  PEheader hdr;[m
[31m-  PEsection sect[2];[m
[31m-  // Must be an even number of symbol structs.[m
[31m-  PEsym sym0;[m
[31m-  PEsymaux sym0aux;[m
[31m-  PEsym sym1;[m
[31m-  PEsymaux sym1aux;[m
[31m-  PEsym sym2;[m
[31m-  PEsym sym3;[m
[31m-  uint32_t strtabsize;[m
[31m-  uint8_t space[4096];[m
[31m-} PEobj;[m
[31m-]][m
[31m-  local symname = LJBC_PREFIX..ctx.modname[m
[31m-  local is64 = false[m
[31m-  if ctx.arch == "x86" then[m
[31m-    symname = "_"..symname[m
[31m-  elseif ctx.arch == "x64" then[m
[31m-    is64 = true[m
[31m-  end[m
[31m-  local symexport = "   /EXPORT:"..symname..",DATA "[m
[31m-[m
[31m-  -- The file format is always little-endian. Swap if the host is big-endian.[m
[31m-  local function f32(x) return x end[m
[31m-  local f16 = f32[m
[31m-  if ffi.abi("be") then[m
[31m-    f32 = bit.bswap[m
[31m-    function f16(x) return bit.rshift(bit.bswap(x), 16) end[m
[31m-  end[m
[31m-[m
[31m-  -- Create PE object and fill in header.[m
[31m-  local o = ffi.new("PEobj")[m
[31m-  local hdr = o.hdr[m
[31m-  hdr.arch = f16(({ x86=0x14c, x64=0x8664, arm=0x1c0, ppc=0x1f2, mips=0x366, mipsel=0x366 })[ctx.arch])[m
[31m-  hdr.nsects = f16(2)[m
[31m-  hdr.symtabofs = f32(ffi.offsetof(o, "sym0"))[m
[31m-  hdr.nsyms = f32(6)[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  o.sect[0].name = ".drectve"[m
[31m-  o.sect[0].size = f32(#symexport)[m
[31m-  o.sect[0].flags = f32(0x00100a00)[m
[31m-  o.sym0.sect = f16(1)[m
[31m-  o.sym0.scl = 3[m
[31m-  o.sym0.name = ".drectve"[m
[31m-  o.sym0.naux = 1[m
[31m-  o.sym0aux.size = f32(#symexport)[m
[31m-  o.sect[1].name = ".rdata"[m
[31m-  o.sect[1].size = f32(#s)[m
[31m-  o.sect[1].flags = f32(0x40300040)[m
[31m-  o.sym1.sect = f16(2)[m
[31m-  o.sym1.scl = 3[m
[31m-  o.sym1.name = ".rdata"[m
[31m-  o.sym1.naux = 1[m
[31m-  o.sym1aux.size = f32(#s)[m
[31m-  o.sym2.sect = f16(2)[m
[31m-  o.sym2.scl = 2[m
[31m-  o.sym2.nameref[1] = f32(4)[m
[31m-  o.sym3.sect = f16(-1)[m
[31m-  o.sym3.scl = 2[m
[31m-  o.sym3.value = f32(1)[m
[31m-  o.sym3.name = "@feat.00" -- Mark as SafeSEH compliant.[m
[31m-  ffi.copy(o.space, symname)[m
[31m-  local ofs = #symname + 1[m
[31m-  o.strtabsize = f32(ofs + 4)[m
[31m-  o.sect[0].ofs = f32(ffi.offsetof(o, "space") + ofs)[m
[31m-  ffi.copy(o.space + ofs, symexport)[m
[31m-  ofs = ofs + #symexport[m
[31m-  o.sect[1].ofs = f32(ffi.offsetof(o, "space") + ofs)[m
[31m-[m
[31m-  -- Write PE object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_machobj(ctx, output, s, ffi)[m
[31m-  ffi.cdef[[[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags;[m
[31m-} mach_header;[m
[31m-typedef struct[m
[31m-{[m
[31m-  mach_header; uint32_t reserved;[m
[31m-} mach_header_64;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize;[m
[31m-  char segname[16];[m
[31m-  uint32_t vmaddr, vmsize, fileoff, filesize;[m
[31m-  uint32_t maxprot, initprot, nsects, flags;[m
[31m-} mach_segment_command;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize;[m
[31m-  char segname[16];[m
[31m-  uint64_t vmaddr, vmsize, fileoff, filesize;[m
[31m-  uint32_t maxprot, initprot, nsects, flags;[m
[31m-} mach_segment_command_64;[m
[31m-typedef struct {[m
[31m-  char sectname[16], segname[16];[m
[31m-  uint32_t addr, size;[m
[31m-  uint32_t offset, align, reloff, nreloc, flags;[m
[31m-  uint32_t reserved1, reserved2;[m
[31m-} mach_section;[m
[31m-typedef struct {[m
[31m-  char sectname[16], segname[16];[m
[31m-  uint64_t addr, size;[m
[31m-  uint32_t offset, align, reloff, nreloc, flags;[m
[31m-  uint32_t reserved1, reserved2, reserved3;[m
[31m-} mach_section_64;[m
[31m-typedef struct {[m
[31m-  uint32_t cmd, cmdsize, symoff, nsyms, stroff, strsize;[m
[31m-} mach_symtab_command;[m
[31m-typedef struct {[m
[31m-  int32_t strx;[m
[31m-  uint8_t type, sect;[m
[31m-  int16_t desc;[m
[31m-  uint32_t value;[m
[31m-} mach_nlist;[m
[31m-typedef struct {[m
[31m-  uint32_t strx;[m
[31m-  uint8_t type, sect;[m
[31m-  uint16_t desc;[m
[31m-  uint64_t value;[m
[31m-} mach_nlist_64;[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t magic, nfat_arch;[m
[31m-} mach_fat_header;[m
[31m-typedef struct[m
[31m-{[m
[31m-  uint32_t cputype, cpusubtype, offset, size, align;[m
[31m-} mach_fat_arch;[m
[31m-typedef struct {[m
[31m-  struct {[m
[31m-    mach_header hdr;[m
[31m-    mach_segment_command seg;[m
[31m-    mach_section sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[1];[m
[31m-  mach_nlist sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_obj;[m
[31m-typedef struct {[m
[31m-  struct {[m
[31m-    mach_header_64 hdr;[m
[31m-    mach_segment_command_64 seg;[m
[31m-    mach_section_64 sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[1];[m
[31m-  mach_nlist_64 sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_obj_64;[m
[31m-typedef struct {[m
[31m-  mach_fat_header fat;[m
[31m-  mach_fat_arch fat_arch[2];[m
[31m-  struct {[m
[31m-    mach_header hdr;[m
[31m-    mach_segment_command seg;[m
[31m-    mach_section sec;[m
[31m-    mach_symtab_command sym;[m
[31m-  } arch[2];[m
[31m-  mach_nlist sym_entry;[m
[31m-  uint8_t space[4096];[m
[31m-} mach_fat_obj;[m
[31m-]][m
[31m-  local symname = '_'..LJBC_PREFIX..ctx.modname[m
[31m-  local isfat, is64, align, mobj = false, false, 4, "mach_obj"[m
[31m-  if ctx.arch == "x64" then[m
[31m-    is64, align, mobj = true, 8, "mach_obj_64"[m
[31m-  elseif ctx.arch == "arm" then[m
[31m-    isfat, mobj = true, "mach_fat_obj"[m
[31m-  elseif ctx.arch == "arm64" then[m
[31m-    is64, align, isfat, mobj = true, 8, true, "mach_fat_obj"[m
[31m-  else[m
[31m-    check(ctx.arch == "x86", "unsupported architecture for OSX")[m
[31m-  end[m
[31m-  local function aligned(v, a) return bit.band(v+a-1, -a) end[m
[31m-  local be32 = bit.bswap -- Mach-O FAT is BE, supported archs are LE.[m
[31m-[m
[31m-  -- Create Mach-O object and fill in header.[m
[31m-  local o = ffi.new(mobj)[m
[31m-  local mach_size = aligned(ffi.offsetof(o, "space")+#symname+2, align)[m
[31m-  local cputype = ({ x86={7}, x64={0x01000007}, arm={7,12}, arm64={0x01000007,0x0100000c} })[ctx.arch][m
[31m-  local cpusubtype = ({ x86={3}, x64={3}, arm={3,9}, arm64={3,0} })[ctx.arch][m
[31m-  if isfat then[m
[31m-    o.fat.magic = be32(0xcafebabe)[m
[31m-    o.fat.nfat_arch = be32(#cpusubtype)[m
[31m-  end[m
[31m-[m
[31m-  -- Fill in sections and symbols.[m
[31m-  for i=0,#cpusubtype-1 do[m
[31m-    local ofs = 0[m
[31m-    if isfat then[m
[31m-      local a = o.fat_arch[i][m
[31m-      a.cputype = be32(cputype[i+1])[m
[31m-      a.cpusubtype = be32(cpusubtype[i+1])[m
[31m-      -- Subsequent slices overlap each other to share data.[m
[31m-      ofs = ffi.offsetof(o, "arch") + i*ffi.sizeof(o.arch[0])[m
[31m-      a.offset = be32(ofs)[m
[31m-      a.size = be32(mach_size-ofs+#s)[m
[31m-    end[m
[31m-    local a = o.arch[i][m
[31m-    a.hdr.magic = is64 and 0xfeedfacf or 0xfeedface[m
[31m-    a.hdr.cputype = cputype[i+1][m
[31m-    a.hdr.cpusubtype = cpusubtype[i+1][m
[31m-    a.hdr.filetype = 1[m
[31m-    a.hdr.ncmds = 2[m
[31m-    a.hdr.sizeofcmds = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)+ffi.sizeof(a.sym)[m
[31m-    a.seg.cmd = is64 and 0x19 or 0x1[m
[31m-    a.seg.cmdsize = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)[m
[31m-    a.seg.vmsize = #s[m
[31m-    a.seg.fileoff = mach_size-ofs[m
[31m-    a.seg.filesize = #s[m
[31m-    a.seg.maxprot = 1[m
[31m-    a.seg.initprot = 1[m
[31m-    a.seg.nsects = 1[m
[31m-    ffi.copy(a.sec.sectname, "__data")[m
[31m-    ffi.copy(a.sec.segname, "__DATA")[m
[31m-    a.sec.size = #s[m
[31m-    a.sec.offset = mach_size-ofs[m
[31m-    a.sym.cmd = 2[m
[31m-    a.sym.cmdsize = ffi.sizeof(a.sym)[m
[31m-    a.sym.symoff = ffi.offsetof(o, "sym_entry")-ofs[m
[31m-    a.sym.nsyms = 1[m
[31m-    a.sym.stroff = ffi.offsetof(o, "sym_entry")+ffi.sizeof(o.sym_entry)-ofs[m
[31m-    a.sym.strsize = aligned(#symname+2, align)[m
[31m-  end[m
[31m-  o.sym_entry.type = 0xf[m
[31m-  o.sym_entry.sect = 1[m
[31m-  o.sym_entry.strx = 1[m
[31m-  ffi.copy(o.space+1, symname)[m
[31m-[m
[31m-  -- Write Macho-O object file.[m
[31m-  local fp = savefile(output, "wb")[m
[31m-  fp:write(ffi.string(o, mach_size))[m
[31m-  bcsave_tail(fp, output, s)[m
[31m-end[m
[31m-[m
[31m-local function bcsave_obj(ctx, output, s)[m
[31m-  local ok, ffi = pcall(require, "ffi")[m
[31m-  check(ok, "FFI library required to write this file type")[m
[31m-  if ctx.os == "windows" then[m
[31m-    return bcsave_peobj(ctx, output, s, ffi)[m
[31m-  elseif ctx.os == "osx" then[m
[31m-    return bcsave_machobj(ctx, output, s, ffi)[m
[31m-  else[m
[31m-    return bcsave_elfobj(ctx, output, s, ffi)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function bclist(input, output)[m
[31m-  local f = readfile(input)[m
[31m-  require("jit.bc").dump(f, savefile(output, "w"), true)[m
[31m-end[m
[31m-[m
[31m-local function bcsave(ctx, input, output)[m
[31m-  local f = readfile(input)[m
[31m-  local s = string.dump(f, ctx.strip)[m
[31m-  local t = ctx.type[m
[31m-  if not t then[m
[31m-    t = detecttype(output)[m
[31m-    ctx.type = t[m
[31m-  end[m
[31m-  if t == "raw" then[m
[31m-    bcsave_raw(output, s)[m
[31m-  else[m
[31m-    if not ctx.modname then ctx.modname = detectmodname(input) end[m
[31m-    if t == "obj" then[m
[31m-      bcsave_obj(ctx, output, s)[m
[31m-    else[m
[31m-      bcsave_c(ctx, output, s)[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function docmd(...)[m
[31m-  local arg = {...}[m
[31m-  local n = 1[m
[31m-  local list = false[m
[31m-  local ctx = {[m
[31m-    strip = true, arch = jit.arch, os = string.lower(jit.os),[m
[31m-    type = false, modname = false,[m
[31m-  }[m
[31m-  while n <= #arg do[m
[31m-    local a = arg[n][m
[31m-    if type(a) == "string" and string.sub(a, 1, 1) == "-" and a ~= "-" then[m
[31m-      table.remove(arg, n)[m
[31m-      if a == "--" then break end[m
[31m-      for m=2,#a do[m
[31m-	local opt = string.sub(a, m, m)[m
[31m-	if opt == "l" then[m
[31m-	  list = true[m
[31m-	elseif opt == "s" then[m
[31m-	  ctx.strip = true[m
[31m-	elseif opt == "g" then[m
[31m-	  ctx.strip = false[m
[31m-	else[m
[31m-	  if arg[n] == nil or m ~= #a then usage() end[m
[31m-	  if opt == "e" then[m
[31m-	    if n ~= 1 then usage() end[m
[31m-	    arg[1] = check(loadstring(arg[1]))[m
[31m-	  elseif opt == "n" then[m
[31m-	    ctx.modname = checkmodname(table.remove(arg, n))[m
[31m-	  elseif opt == "t" then[m
[31m-	    ctx.type = checkarg(table.remove(arg, n), map_type, "file type")[m
[31m-	  elseif opt == "a" then[m
[31m-	    ctx.arch = checkarg(table.remove(arg, n), map_arch, "architecture")[m
[31m-	  elseif opt == "o" then[m
[31m-	    ctx.os = checkarg(table.remove(arg, n), map_os, "OS name")[m
[31m-	  else[m
[31m-	    usage()[m
[31m-	  end[m
[31m-	end[m
[31m-      end[m
[31m-    else[m
[31m-      n = n + 1[m
[31m-    end[m
[31m-  end[m
[31m-  if list then[m
[31m-    if #arg == 0 or #arg > 2 then usage() end[m
[31m-    bclist(arg[1], arg[2] or "-")[m
[31m-  else[m
[31m-    if #arg ~= 2 then usage() end[m
[31m-    bcsave(ctx, arg[1], arg[2])[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  start = docmd -- Process -b command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_arm.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_arm.lua[m
[1mdeleted file mode 100644[m
[1mindex 1296d81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_arm.lua[m
[1m+++ /dev/null[m
[36m@@ -1,689 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT ARM disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles most user-mode ARMv7 instructions[m
[31m--- NYI: Advanced SIMD and VFP instructions.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, ror, tohex = bit.band, bit.bor, bit.ror, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_loadc = {[m
[31m-  shift = 8, mask = 15,[m
[31m-  [10] = {[m
[31m-    shift = 20, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovFmDN", "vstmFNdr",[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vstrFdl",[m
[31m-	{ shift = 16, mask = 15, [13] = "vpushFdr", _ = "vstmdbFNdr", }[m
[31m-      },[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovFDNm",[m
[31m-      { shift = 16, mask = 15, [13] = "vpopFdr", _ = "vldmFNdr", },[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vldrFdl", "vldmdbFNdr",[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  [11] = {[m
[31m-    shift = 20, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovGmDN", "vstmGNdr",[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vstrGdl",[m
[31m-	{ shift = 16, mask = 15, [13] = "vpushGdr", _ = "vstmdbGNdr", }[m
[31m-      },[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 23, mask = 3,[m
[31m-      [0] = "vmovGDNm",[m
[31m-      { shift = 16, mask = 15, [13] = "vpopGdr", _ = "vldmGNdr", },[m
[31m-      _ = {[m
[31m-	shift = 21, mask = 1,[m
[31m-	[0] = "vldrGdl", "vldmdbGNdr",[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 0, mask = 0 -- NYI ldc, mcrr, mrrc.[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_vfps = {[m
[31m-  shift = 6, mask = 0x2c001,[m
[31m-  [0] = "vmlaF.dnm", "vmlsF.dnm",[m
[31m-  [0x04000] = "vnmlsF.dnm", [0x04001] = "vnmlaF.dnm",[m
[31m-  [0x08000] = "vmulF.dnm", [0x08001] = "vnmulF.dnm",[m
[31m-  [0x0c000] = "vaddF.dnm", [0x0c001] = "vsubF.dnm",[m
[31m-  [0x20000] = "vdivF.dnm",[m
[31m-  [0x24000] = "vfnmsF.dnm", [0x24001] = "vfnmaF.dnm",[m
[31m-  [0x28000] = "vfmaF.dnm", [0x28001] = "vfmsF.dnm",[m
[31m-  [0x2c000] = "vmovF.dY",[m
[31m-  [0x2c001] = {[m
[31m-    shift = 7, mask = 0x1e01,[m
[31m-    [0] = "vmovF.dm", "vabsF.dm",[m
[31m-    [0x0200] = "vnegF.dm", [0x0201] = "vsqrtF.dm",[m
[31m-    [0x0800] = "vcmpF.dm", [0x0801] = "vcmpeF.dm",[m
[31m-    [0x0a00] = "vcmpzF.d", [0x0a01] = "vcmpzeF.d",[m
[31m-    [0x0e01] = "vcvtG.dF.m",[m
[31m-    [0x1000] = "vcvt.f32.u32Fdm", [0x1001] = "vcvt.f32.s32Fdm",[m
[31m-    [0x1800] = "vcvtr.u32F.dm", [0x1801] = "vcvt.u32F.dm",[m
[31m-    [0x1a00] = "vcvtr.s32F.dm", [0x1a01] = "vcvt.s32F.dm",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_vfpd = {[m
[31m-  shift = 6, mask = 0x2c001,[m
[31m-  [0] = "vmlaG.dnm", "vmlsG.dnm",[m
[31m-  [0x04000] = "vnmlsG.dnm", [0x04001] = "vnmlaG.dnm",[m
[31m-  [0x08000] = "vmulG.dnm", [0x08001] = "vnmulG.dnm",[m
[31m-  [0x0c000] = "vaddG.dnm", [0x0c001] = "vsubG.dnm",[m
[31m-  [0x20000] = "vdivG.dnm",[m
[31m-  [0x24000] = "vfnmsG.dnm", [0x24001] = "vfnmaG.dnm",[m
[31m-  [0x28000] = "vfmaG.dnm", [0x28001] = "vfmsG.dnm",[m
[31m-  [0x2c000] = "vmovG.dY",[m
[31m-  [0x2c001] = {[m
[31m-    shift = 7, mask = 0x1e01,[m
[31m-    [0] = "vmovG.dm", "vabsG.dm",[m
[31m-    [0x0200] = "vnegG.dm", [0x0201] = "vsqrtG.dm",[m
[31m-    [0x0800] = "vcmpG.dm", [0x0801] = "vcmpeG.dm",[m
[31m-    [0x0a00] = "vcmpzG.d", [0x0a01] = "vcmpzeG.d",[m
[31m-    [0x0e01] = "vcvtF.dG.m",[m
[31m-    [0x1000] = "vcvt.f64.u32GdFm", [0x1001] = "vcvt.f64.s32GdFm",[m
[31m-    [0x1800] = "vcvtr.u32FdG.m", [0x1801] = "vcvt.u32FdG.m",[m
[31m-    [0x1a00] = "vcvtr.s32FdG.m", [0x1a01] = "vcvt.s32FdG.m",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_datac = {[m
[31m-  shift = 24, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 4, mask = 1,[m
[31m-    [0] = {[m
[31m-      shift = 8, mask = 15,[m
[31m-      [10] = map_vfps,[m
[31m-      [11] = map_vfpd,[m
[31m-      -- NYI cdp, mcr, mrc.[m
[31m-    },[m
[31m-    {[m
[31m-      shift = 8, mask = 15,[m
[31m-      [10] = {[m
[31m-	shift = 20, mask = 15,[m
[31m-	[0] = "vmovFnD", "vmovFDn",[m
[31m-	[14] = "vmsrD",[m
[31m-	[15] = { shift = 12, mask = 15, [15] = "vmrs", _ = "vmrsD", },[m
[31m-      },[m
[31m-    },[m
[31m-  },[m
[31m-  "svcT",[m
[31m-}[m
[31m-[m
[31m-local map_loadcu = {[m
[31m-  shift = 0, mask = 0, -- NYI unconditional CP load/store.[m
[31m-}[m
[31m-[m
[31m-local map_datacu = {[m
[31m-  shift = 0, mask = 0, -- NYI unconditional CP data.[m
[31m-}[m
[31m-[m
[31m-local map_simddata = {[m
[31m-  shift = 0, mask = 0, -- NYI SIMD data.[m
[31m-}[m
[31m-[m
[31m-local map_simdload = {[m
[31m-  shift = 0, mask = 0, -- NYI SIMD load/store, preload.[m
[31m-}[m
[31m-[m
[31m-local map_preload = {[m
[31m-  shift = 0, mask = 0, -- NYI preload.[m
[31m-}[m
[31m-[m
[31m-local map_media = {[m
[31m-  shift = 20, mask = 31,[m
[31m-  [0] = false,[m
[31m-  { --01[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "sadd16DNM", "sasxDNM", "ssaxDNM", "ssub16DNM",[m
[31m-    "sadd8DNM", false, false, "ssub8DNM",[m
[31m-  },[m
[31m-  { --02[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "qadd16DNM", "qasxDNM", "qsaxDNM", "qsub16DNM",[m
[31m-    "qadd8DNM", false, false, "qsub8DNM",[m
[31m-  },[m
[31m-  { --03[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "shadd16DNM", "shasxDNM", "shsaxDNM", "shsub16DNM",[m
[31m-    "shadd8DNM", false, false, "shsub8DNM",[m
[31m-  },[m
[31m-  false,[m
[31m-  { --05[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uadd16DNM", "uasxDNM", "usaxDNM", "usub16DNM",[m
[31m-    "uadd8DNM", false, false, "usub8DNM",[m
[31m-  },[m
[31m-  { --06[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uqadd16DNM", "uqasxDNM", "uqsaxDNM", "uqsub16DNM",[m
[31m-    "uqadd8DNM", false, false, "uqsub8DNM",[m
[31m-  },[m
[31m-  { --07[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "uhadd16DNM", "uhasxDNM", "uhsaxDNM", "uhsub16DNM",[m
[31m-    "uhadd8DNM", false, false, "uhsub8DNM",[m
[31m-  },[m
[31m-  { --08[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "pkhbtDNMU", false, "pkhtbDNMU",[m
[31m-    { shift = 16, mask = 15, [15] = "sxtb16DMU", _ = "sxtab16DNMU", },[m
[31m-    "pkhbtDNMU", "selDNM", "pkhtbDNMU",[m
[31m-  },[m
[31m-  false,[m
[31m-  { --0a[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "ssatDxMu", "ssat16DxM", "ssatDxMu",[m
[31m-    { shift = 16, mask = 15, [15] = "sxtbDMU", _ = "sxtabDNMU", },[m
[31m-    "ssatDxMu", false, "ssatDxMu",[m
[31m-  },[m
[31m-  { --0b[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "ssatDxMu", "revDM", "ssatDxMu",[m
[31m-    { shift = 16, mask = 15, [15] = "sxthDMU", _ = "sxtahDNMU", },[m
[31m-    "ssatDxMu", "rev16DM", "ssatDxMu",[m
[31m-  },[m
[31m-  { --0c[m
[31m-    shift = 5, mask = 7,[m
[31m-    [3] = { shift = 16, mask = 15, [15] = "uxtb16DMU", _ = "uxtab16DNMU", },[m
[31m-  },[m
[31m-  false,[m
[31m-  { --0e[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "usatDwMu", "usat16DwM", "usatDwMu",[m
[31m-    { shift = 16, mask = 15, [15] = "uxtbDMU", _ = "uxtabDNMU", },[m
[31m-    "usatDwMu", false, "usatDwMu",[m
[31m-  },[m
[31m-  { --0f[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "usatDwMu", "rbitDM", "usatDwMu",[m
[31m-    { shift = 16, mask = 15, [15] = "uxthDMU", _ = "uxtahDNMU", },[m
[31m-    "usatDwMu", "revshDM", "usatDwMu",[m
[31m-  },[m
[31m-  { --10[m
[31m-    shift = 12, mask = 15,[m
[31m-    [15] = {[m
[31m-      shift = 5, mask = 7,[m
[31m-      "smuadNMS", "smuadxNMS", "smusdNMS", "smusdxNMS",[m
[31m-    },[m
[31m-    _ = {[m
[31m-      shift = 5, mask = 7,[m
[31m-      [0] = "smladNMSD", "smladxNMSD", "smlsdNMSD", "smlsdxNMSD",[m
[31m-    },[m
[31m-  },[m
[31m-  false, false, false,[m
[31m-  { --14[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = "smlaldDNMS", "smlaldxDNMS", "smlsldDNMS", "smlsldxDNMS",[m
[31m-  },[m
[31m-  { --15[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = { shift = 12, mask = 15, [15] = "smmulNMS", _ = "smmlaNMSD", },[m
[31m-    { shift = 12, mask = 15, [15] = "smmulrNMS", _ = "smmlarNMSD", },[m
[31m-    false, false, false, false,[m
[31m-    "smmlsNMSD", "smmlsrNMSD",[m
[31m-  },[m
[31m-  false, false,[m
[31m-  { --18[m
[31m-    shift = 5, mask = 7,[m
[31m-    [0] = { shift = 12, mask = 15, [15] = "usad8NMS", _ = "usada8NMSD", },[m
[31m-  },[m
[31m-  false,[m
[31m-  { --1a[m
[31m-    shift = 5, mask = 3, [2] = "sbfxDMvw",[m
[31m-  },[m
[31m-  { --1b[m
[31m-    shift = 5, mask = 3, [2] = "sbfxDMvw",[m
[31m-  },[m
[31m-  { --1c[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 0, mask = 15, [15] = "bfcDvX", _ = "bfiDMvX", },[m
[31m-  },[m
[31m-  { --1d[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 0, mask = 15, [15] = "bfcDvX", _ = "bfiDMvX", },[m
[31m-  },[m
[31m-  { --1e[m
[31m-    shift = 5, mask = 3, [2] = "ubfxDMvw",[m
[31m-  },[m
[31m-  { --1f[m
[31m-    shift = 5, mask = 3, [2] = "ubfxDMvw",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_load = {[m
[31m-  shift = 21, mask = 9,[m
[31m-  {[m
[31m-    shift = 20, mask = 5,[m
[31m-    [0] = "strtDL", "ldrtDL", [4] = "strbtDL", [5] = "ldrbtDL",[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 20, mask = 5,[m
[31m-    [0] = "strDL", "ldrDL", [4] = "strbDL", [5] = "ldrbDL",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_load1 = {[m
[31m-  shift = 4, mask = 1,[m
[31m-  [0] = map_load, map_media,[m
[31m-}[m
[31m-[m
[31m-local map_loadm = {[m
[31m-  shift = 20, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 23, mask = 3,[m
[31m-    [0] = "stmdaNR", "stmNR",[m
[31m-    { shift = 16, mask = 63, [45] = "pushR", _ = "stmdbNR", }, "stmibNR",[m
[31m-  },[m
[31m-  {[m
[31m-    shift = 23, mask = 3,[m
[31m-    [0] = "ldmdaNR", { shift = 16, mask = 63, [61] = "popR", _ = "ldmNR", },[m
[31m-    "ldmdbNR", "ldmibNR",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_data = {[m
[31m-  shift = 21, mask = 15,[m
[31m-  [0] = "andDNPs", "eorDNPs", "subDNPs", "rsbDNPs",[m
[31m-  "addDNPs", "adcDNPs", "sbcDNPs", "rscDNPs",[m
[31m-  "tstNP", "teqNP", "cmpNP", "cmnNP",[m
[31m-  "orrDNPs", "movDPs", "bicDNPs", "mvnDPs",[m
[31m-}[m
[31m-[m
[31m-local map_mul = {[m
[31m-  shift = 21, mask = 7,[m
[31m-  [0] = "mulNMSs", "mlaNMSDs", "umaalDNMS", "mlsDNMS",[m
[31m-  "umullDNMSs", "umlalDNMSs", "smullDNMSs", "smlalDNMSs",[m
[31m-}[m
[31m-[m
[31m-local map_sync = {[m
[31m-  shift = 20, mask = 15, -- NYI: brackets around N. R(D+1) for ldrexd/strexd.[m
[31m-  [0] = "swpDMN", false, false, false,[m
[31m-  "swpbDMN", false, false, false,[m
[31m-  "strexDMN", "ldrexDN", "strexdDN", "ldrexdDN",[m
[31m-  "strexbDMN", "ldrexbDN", "strexhDN", "ldrexhDN",[m
[31m-}[m
[31m-[m
[31m-local map_mulh = {[m
[31m-  shift = 21, mask = 3,[m
[31m-  [0] = { shift = 5, mask = 3,[m
[31m-    [0] = "smlabbNMSD", "smlatbNMSD", "smlabtNMSD", "smlattNMSD", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smlawbNMSD", "smulwbNMS", "smlawtNMSD", "smulwtNMS", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smlalbbDNMS", "smlaltbDNMS", "smlalbtDNMS", "smlalttDNMS", },[m
[31m-  { shift = 5, mask = 3,[m
[31m-    [0] = "smulbbNMS", "smultbNMS", "smulbtNMS", "smulttNMS", },[m
[31m-}[m
[31m-[m
[31m-local map_misc = {[m
[31m-  shift = 4, mask = 7,[m
[31m-  -- NYI: decode PSR bits of msr.[m
[31m-  [0] = { shift = 21, mask = 1, [0] = "mrsD", "msrM", },[m
[31m-  { shift = 21, mask = 3, "bxM", false, "clzDM", },[m
[31m-  { shift = 21, mask = 3, "bxjM", },[m
[31m-  { shift = 21, mask = 3, "blxM", },[m
[31m-  false,[m
[31m-  { shift = 21, mask = 3, [0] = "qaddDMN", "qsubDMN", "qdaddDMN", "qdsubDMN", },[m
[31m-  false,[m
[31m-  { shift = 21, mask = 3, "bkptK", },[m
[31m-}[m
[31m-[m
[31m-local map_datar = {[m
[31m-  shift = 4, mask = 9,[m
[31m-  [9] = {[m
[31m-    shift = 5, mask = 3,[m
[31m-    [0] = { shift = 24, mask = 1, [0] = map_mul, map_sync, },[m
[31m-    { shift = 20, mask = 1, [0] = "strhDL", "ldrhDL", },[m
[31m-    { shift = 20, mask = 1, [0] = "ldrdDL", "ldrsbDL", },[m
[31m-    { shift = 20, mask = 1, [0] = "strdDL", "ldrshDL", },[m
[31m-  },[m
[31m-  _ = {[m
[31m-    shift = 20, mask = 25,[m
[31m-    [16] = { shift = 7, mask = 1, [0] = map_misc, map_mulh, },[m
[31m-    _ = {[m
[31m-      shift = 0, mask = 0xffffffff,[m
[31m-      [bor(0xe1a00000)] = "nop",[m
[31m-      _ = map_data,[m
[31m-    }[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_datai = {[m
[31m-  shift = 20, mask = 31, -- NYI: decode PSR bits of msr. Decode imm12.[m
[31m-  [16] = "movwDW", [20] = "movtDW",[m
[31m-  [18] = { shift = 0, mask = 0xf00ff, [0] = "nopv6", _ = "msrNW", },[m
[31m-  [22] = "msrNW",[m
[31m-  _ = map_data,[m
[31m-}[m
[31m-[m
[31m-local map_branch = {[m
[31m-  shift = 24, mask = 1,[m
[31m-  [0] = "bB", "blB"[m
[31m-}[m
[31m-[m
[31m-local map_condins = {[m
[31m-  [0] = map_datar, map_datai, map_load, map_load1,[m
[31m-  map_loadm, map_branch, map_loadc, map_datac[m
[31m-}[m
[31m-[m
[31m--- NYI: setend.[m
[31m-local map_uncondins = {[m
[31m-  [0] = false, map_simddata, map_simdload, map_preload,[m
[31m-  false, "blxB", map_loadcu, map_datacu,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",[m
[31m-}[m
[31m-[m
[31m-local map_cond = {[m
[31m-  [0] = "eq", "ne", "hs", "lo", "mi", "pl", "vs", "vc",[m
[31m-  "hi", "ls", "ge", "lt", "gt", "le", "al",[m
[31m-}[m
[31m-[m
[31m-local map_shift = { [0] = "lsl", "lsr", "asr", "ror", }[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then[m
[31m-      extra = "\t->"..sym[m
[31m-    elseif band(ctx.op, 0x0e000000) ~= 0x0a000000 then[m
[31m-      extra = "\t; 0x"..tohex(ctx.rel)[m
[31m-    end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-5s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-5s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m--- Format operand 2 of load/store opcodes.[m
[31m-local function fmtload(ctx, op, pos)[m
[31m-  local base = map_gpr[band(rshift(op, 16), 15)][m
[31m-  local x, ofs[m
[31m-  local ext = (band(op, 0x04000000) == 0)[m
[31m-  if not ext and band(op, 0x02000000) == 0 then[m
[31m-    ofs = band(op, 4095)[m
[31m-    if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-    if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-    ofs = "#"..ofs[m
[31m-  elseif ext and band(op, 0x00400000) ~= 0 then[m
[31m-    ofs = band(op, 15) + band(rshift(op, 4), 0xf0)[m
[31m-    if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-    if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-    ofs = "#"..ofs[m
[31m-  else[m
[31m-    ofs = map_gpr[band(op, 15)][m
[31m-    if ext or band(op, 0xfe0) == 0 then[m
[31m-    elseif band(op, 0xfe0) == 0x60 then[m
[31m-      ofs = format("%s, rrx", ofs)[m
[31m-    else[m
[31m-      local sh = band(rshift(op, 7), 31)[m
[31m-      if sh == 0 then sh = 32 end[m
[31m-      ofs = format("%s, %s #%d", ofs, map_shift[band(rshift(op, 5), 3)], sh)[m
[31m-    end[m
[31m-    if band(op, 0x00800000) == 0 then ofs = "-"..ofs end[m
[31m-  end[m
[31m-  if ofs == "#0" then[m
[31m-    x = format("[%s]", base)[m
[31m-  elseif band(op, 0x01000000) == 0 then[m
[31m-    x = format("[%s], %s", base, ofs)[m
[31m-  else[m
[31m-    x = format("[%s, %s]", base, ofs)[m
[31m-  end[m
[31m-  if band(op, 0x01200000) == 0x01200000 then x = x.."!" end[m
[31m-  return x[m
[31m-end[m
[31m-[m
[31m--- Format operand 2 of vector load/store opcodes.[m
[31m-local function fmtvload(ctx, op, pos)[m
[31m-  local base = map_gpr[band(rshift(op, 16), 15)][m
[31m-  local ofs = band(op, 255)*4[m
[31m-  if band(op, 0x00800000) == 0 then ofs = -ofs end[m
[31m-  if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end[m
[31m-  if ofs == 0 then[m
[31m-    return format("[%s]", base)[m
[31m-  else[m
[31m-    return format("[%s, #%d]", base, ofs)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function fmtvr(op, vr, sh0, sh1)[m
[31m-  if vr == "s" then[m
[31m-    return format("s%d", 2*band(rshift(op, sh0), 15)+band(rshift(op, sh1), 1))[m
[31m-  else[m
[31m-    return format("d%d", band(rshift(op, sh0), 15)+band(rshift(op, sh1-4), 16))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  local op = bor(lshift(b3, 24), lshift(b2, 16), lshift(b1, 8), b0)[m
[31m-  local operands = {}[m
[31m-  local suffix = ""[m
[31m-  local last, name, pat[m
[31m-  local vr[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local cond = rshift(op, 28)[m
[31m-  local opat[m
[31m-  if cond == 15 then[m
[31m-    opat = map_uncondins[band(rshift(op, 25), 7)][m
[31m-  else[m
[31m-    if cond ~= 14 then suffix = map_cond[cond] end[m
[31m-    opat = map_condins[band(rshift(op, 25), 7)][m
[31m-  end[m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)] or opat._[m
[31m-  end[m
[31m-  name, pat = match(opat, "^([a-z0-9]*)(.*)")[m
[31m-  if sub(pat, 1, 1) == "." then[m
[31m-    local s2, p2 = match(pat, "^([a-z0-9.]*)(.*)")[m
[31m-    suffix = suffix..s2[m
[31m-    pat = p2[m
[31m-  end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "D" then[m
[31m-      x = map_gpr[band(rshift(op, 12), 15)][m
[31m-    elseif p == "N" then[m
[31m-      x = map_gpr[band(rshift(op, 16), 15)][m
[31m-    elseif p == "S" then[m
[31m-      x = map_gpr[band(rshift(op, 8), 15)][m
[31m-    elseif p == "M" then[m
[31m-      x = map_gpr[band(op, 15)][m
[31m-    elseif p == "d" then[m
[31m-      x = fmtvr(op, vr, 12, 22)[m
[31m-    elseif p == "n" then[m
[31m-      x = fmtvr(op, vr, 16, 7)[m
[31m-    elseif p == "m" then[m
[31m-      x = fmtvr(op, vr, 0, 5)[m
[31m-    elseif p == "P" then[m
[31m-      if band(op, 0x02000000) ~= 0 then[m
[31m-	x = ror(band(op, 255), 2*band(rshift(op, 8), 15))[m
[31m-      else[m
[31m-	x = map_gpr[band(op, 15)][m
[31m-	if band(op, 0xff0) ~= 0 then[m
[31m-	  operands[#operands+1] = x[m
[31m-	  local s = map_shift[band(rshift(op, 5), 3)][m
[31m-	  local r = nil[m
[31m-	  if band(op, 0xf90) == 0 then[m
[31m-	    if s == "ror" then s = "rrx" else r = "#32" end[m
[31m-	  elseif band(op, 0x10) == 0 then[m
[31m-	    r = "#"..band(rshift(op, 7), 31)[m
[31m-	  else[m
[31m-	    r = map_gpr[band(rshift(op, 8), 15)][m
[31m-	  end[m
[31m-	  if name == "mov" then name = s; x = r[m
[31m-	  elseif r then x = format("%s %s", s, r)[m
[31m-	  else x = s end[m
[31m-	end[m
[31m-      end[m
[31m-    elseif p == "L" then[m
[31m-      x = fmtload(ctx, op, pos)[m
[31m-    elseif p == "l" then[m
[31m-      x = fmtvload(ctx, op, pos)[m
[31m-    elseif p == "B" then[m
[31m-      local addr = ctx.addr + pos + 8 + arshift(lshift(op, 8), 6)[m
[31m-      if cond == 15 then addr = addr + band(rshift(op, 23), 2) end[m
[31m-      ctx.rel = addr[m
[31m-      x = "0x"..tohex(addr)[m
[31m-    elseif p == "F" then[m
[31m-      vr = "s"[m
[31m-    elseif p == "G" then[m
[31m-      vr = "d"[m
[31m-    elseif p == "." then[m
[31m-      suffix = suffix..(vr == "s" and ".f32" or ".f64")[m
[31m-    elseif p == "R" then[m
[31m-      if band(op, 0x00200000) ~= 0 and #operands == 1 then[m
[31m-	operands[1] = operands[1].."!"[m
[31m-      end[m
[31m-      local t = {}[m
[31m-      for i=0,15 do[m
[31m-	if band(rshift(op, i), 1) == 1 then t[#t+1] = map_gpr[i] end[m
[31m-      end[m
[31m-      x = "{"..concat(t, ", ").."}"[m
[31m-    elseif p == "r" then[m
[31m-      if band(op, 0x00200000) ~= 0 and #operands == 2 then[m
[31m-	operands[1] = operands[1].."!"[m
[31m-      end[m
[31m-      local s = tonumber(sub(last, 2))[m
[31m-      local n = band(op, 255)[m
[31m-      if vr == "d" then n = rshift(n, 1) end[m
[31m-      operands[#operands] = format("{%s-%s%d}", last, vr, s+n-1)[m
[31m-    elseif p == "W" then[m
[31m-      x = band(op, 0x0fff) + band(rshift(op, 4), 0xf000)[m
[31m-    elseif p == "T" then[m
[31m-      x = "#0x"..tohex(band(op, 0x00ffffff), 6)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "u" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-      if band(op, 0x40) == 0 then[m
[31m-	if x == 0 then x = nil else x = "lsl #"..x end[m
[31m-      else[m
[31m-	if x == 0 then x = "asr #32" else x = "asr #"..x end[m
[31m-      end[m
[31m-    elseif p == "v" then[m
[31m-      x = band(rshift(op, 7), 31)[m
[31m-    elseif p == "w" then[m
[31m-      x = band(rshift(op, 16), 31)[m
[31m-    elseif p == "x" then[m
[31m-      x = band(rshift(op, 16), 31) + 1[m
[31m-    elseif p == "X" then[m
[31m-      x = band(rshift(op, 16), 31) - last + 1[m
[31m-    elseif p == "Y" then[m
[31m-      x = band(rshift(op, 12), 0xf0) + band(op, 0x0f)[m
[31m-    elseif p == "K" then[m
[31m-      x = "#0x"..tohex(band(rshift(op, 4), 0x0000fff0) + band(op, 15), 4)[m
[31m-    elseif p == "s" then[m
[31m-      if band(op, 0x00100000) ~= 0 then suffix = "s"..suffix end[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then[m
[31m-      last = x[m
[31m-      if type(x) == "number" then x = "#"..x end[m
[31m-      operands[#operands+1] = x[m
[31m-    end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name..suffix, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  ctx.pos = ofs[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 16 then return map_gpr[r] end[m
[31m-  return "d"..(r-16)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  disass = disass,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_mips.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_mips.lua[m
[1mdeleted file mode 100644[m
[1mindex 2bf8b38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_mips.lua[m
[1m+++ /dev/null[m
[36m@@ -1,428 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT MIPS disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT/X license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles all standard MIPS32R1/R2 instructions.[m
[31m--- Default mode is big-endian, but see: dis_mipsel.lua[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, tohex = bit.band, bit.bor, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Primary and extended opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_movci = { shift = 16, mask = 1, [0] = "movfDSC", "movtDSC", }[m
[31m-local map_srl = { shift = 21, mask = 1, [0] = "srlDTA", "rotrDTA", }[m
[31m-local map_srlv = { shift = 6, mask = 1, [0] = "srlvDTS", "rotrvDTS", }[m
[31m-[m
[31m-local map_special = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = { shift = 0, mask = -1, [0] = "nop", _ = "sllDTA" },[m
[31m-  map_movci,	map_srl,	"sraDTA",[m
[31m-  "sllvDTS",	false,		map_srlv,	"sravDTS",[m
[31m-  "jrS",	"jalrD1S",	"movzDST",	"movnDST",[m
[31m-  "syscallY",	"breakY",	false,		"sync",[m
[31m-  "mfhiD",	"mthiS",	"mfloD",	"mtloS",[m
[31m-  false,	false,		false,		false,[m
[31m-  "multST",	"multuST",	"divST",	"divuST",[m
[31m-  false,	false,		false,		false,[m
[31m-  "addDST",	"addu|moveDST0", "subDST",	"subu|neguDS0T",[m
[31m-  "andDST",	"orDST",	"xorDST",	"nor|notDST0",[m
[31m-  false,	false,		"sltDST",	"sltuDST",[m
[31m-  false,	false,		false,		false,[m
[31m-  "tgeSTZ",	"tgeuSTZ",	"tltSTZ",	"tltuSTZ",[m
[31m-  "teqSTZ",	false,		"tneSTZ",[m
[31m-}[m
[31m-[m
[31m-local map_special2 = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "maddST", "madduST",	"mulDST",	false,[m
[31m-  "msubST",	"msubuST",[m
[31m-  [32] = "clzDS", [33] = "cloDS",[m
[31m-  [63] = "sdbbpY",[m
[31m-}[m
[31m-[m
[31m-local map_bshfl = {[m
[31m-  shift = 6, mask = 31,[m
[31m-  [2] = "wsbhDT",[m
[31m-  [16] = "sebDT",[m
[31m-  [24] = "sehDT",[m
[31m-}[m
[31m-[m
[31m-local map_special3 = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "extTSAK", [4] = "insTSAL",[m
[31m-  [32] = map_bshfl,[m
[31m-  [59] = "rdhwrTD",[m
[31m-}[m
[31m-[m
[31m-local map_regimm = {[m
[31m-  shift = 16, mask = 31,[m
[31m-  [0] = "bltzSB",	"bgezSB",	"bltzlSB",	"bgezlSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  "tgeiSI",	"tgeiuSI",	"tltiSI",	"tltiuSI",[m
[31m-  "teqiSI",	false,		"tneiSI",	false,[m
[31m-  "bltzalSB",	"bgezalSB",	"bltzallSB",	"bgezallSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		"synciSO",[m
[31m-}[m
[31m-[m
[31m-local map_cop0 = {[m
[31m-  shift = 25, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 21, mask = 15,[m
[31m-    [0] = "mfc0TDW", [4] = "mtc0TDW",[m
[31m-    [10] = "rdpgprDT",[m
[31m-    [11] = { shift = 5, mask = 1, [0] = "diT0", "eiT0", },[m
[31m-    [14] = "wrpgprDT",[m
[31m-  }, {[m
[31m-    shift = 0, mask = 63,[m
[31m-    [1] = "tlbr", [2] = "tlbwi", [6] = "tlbwr", [8] = "tlbp",[m
[31m-    [24] = "eret", [31] = "deret",[m
[31m-    [32] = "wait",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_cop1s = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.sFGH",	"sub.sFGH",	"mul.sFGH",	"div.sFGH",[m
[31m-  "sqrt.sFG",		"abs.sFG",	"mov.sFG",	"neg.sFG",[m
[31m-  "round.l.sFG",	"trunc.l.sFG",	"ceil.l.sFG",	"floor.l.sFG",[m
[31m-  "round.w.sFG",	"trunc.w.sFG",	"ceil.w.sFG",	"floor.w.sFG",[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.sFGC", "movt.sFGC" },[m
[31m-  "movz.sFGT",	"movn.sFGT",[m
[31m-  false,	"recip.sFG",	"rsqrt.sFG",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	"cvt.d.sFG",	false,		false,[m
[31m-  "cvt.w.sFG",	"cvt.l.sFG",	"cvt.ps.sFGH",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "c.f.sVGH",	"c.un.sVGH",	"c.eq.sVGH",	"c.ueq.sVGH",[m
[31m-  "c.olt.sVGH",	"c.ult.sVGH",	"c.ole.sVGH",	"c.ule.sVGH",[m
[31m-  "c.sf.sVGH",	"c.ngle.sVGH",	"c.seq.sVGH",	"c.ngl.sVGH",[m
[31m-  "c.lt.sVGH",	"c.nge.sVGH",	"c.le.sVGH",	"c.ngt.sVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1d = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.dFGH",	"sub.dFGH",	"mul.dFGH",	"div.dFGH",[m
[31m-  "sqrt.dFG",		"abs.dFG",	"mov.dFG",	"neg.dFG",[m
[31m-  "round.l.dFG",	"trunc.l.dFG",	"ceil.l.dFG",	"floor.l.dFG",[m
[31m-  "round.w.dFG",	"trunc.w.dFG",	"ceil.w.dFG",	"floor.w.dFG",[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.dFGC", "movt.dFGC" },[m
[31m-  "movz.dFGT",	"movn.dFGT",[m
[31m-  false,	"recip.dFG",	"rsqrt.dFG",	false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.dFG",	false,		false,		false,[m
[31m-  "cvt.w.dFG",	"cvt.l.dFG",	false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "c.f.dVGH",	"c.un.dVGH",	"c.eq.dVGH",	"c.ueq.dVGH",[m
[31m-  "c.olt.dVGH",	"c.ult.dVGH",	"c.ole.dVGH",	"c.ule.dVGH",[m
[31m-  "c.df.dVGH",	"c.ngle.dVGH",	"c.deq.dVGH",	"c.ngl.dVGH",[m
[31m-  "c.lt.dVGH",	"c.nge.dVGH",	"c.le.dVGH",	"c.ngt.dVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1ps = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "add.psFGH",	"sub.psFGH",	"mul.psFGH",	false,[m
[31m-  false,		"abs.psFG",	"mov.psFG",	"neg.psFG",[m
[31m-  false,		false,		false,		false,[m
[31m-  false,		false,		false,		false,[m
[31m-  false,[m
[31m-  { shift = 16, mask = 1, [0] = "movf.psFGC", "movt.psFGC" },[m
[31m-  "movz.psFGT",	"movn.psFGT",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.puFG",	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  "cvt.s.plFG",	false,		false,		false,[m
[31m-  "pll.psFGH",	"plu.psFGH",	"pul.psFGH",	"puu.psFGH",[m
[31m-  "c.f.psVGH",	"c.un.psVGH",	"c.eq.psVGH",	"c.ueq.psVGH",[m
[31m-  "c.olt.psVGH", "c.ult.psVGH",	"c.ole.psVGH",	"c.ule.psVGH",[m
[31m-  "c.psf.psVGH", "c.ngle.psVGH", "c.pseq.psVGH", "c.ngl.psVGH",[m
[31m-  "c.lt.psVGH",	"c.nge.psVGH",	"c.le.psVGH",	"c.ngt.psVGH",[m
[31m-}[m
[31m-[m
[31m-local map_cop1w = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [32] = "cvt.s.wFG", [33] = "cvt.d.wFG",[m
[31m-}[m
[31m-[m
[31m-local map_cop1l = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [32] = "cvt.s.lFG", [33] = "cvt.d.lFG",[m
[31m-}[m
[31m-[m
[31m-local map_cop1bc = {[m
[31m-  shift = 16, mask = 3,[m
[31m-  [0] = "bc1fCB", "bc1tCB",	"bc1flCB",	"bc1tlCB",[m
[31m-}[m
[31m-[m
[31m-local map_cop1 = {[m
[31m-  shift = 21, mask = 31,[m
[31m-  [0] = "mfc1TG", false,	"cfc1TG",	"mfhc1TG",[m
[31m-  "mtc1TG",	false,		"ctc1TG",	"mthc1TG",[m
[31m-  map_cop1bc,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  map_cop1s,	map_cop1d,	false,		false,[m
[31m-  map_cop1w,	map_cop1l,	map_cop1ps,[m
[31m-}[m
[31m-[m
[31m-local map_cop1x = {[m
[31m-  shift = 0, mask = 63,[m
[31m-  [0] = "lwxc1FSX",	"ldxc1FSX",	false,		false,[m
[31m-  false,	"luxc1FSX",	false,		false,[m
[31m-  "swxc1FSX",	"sdxc1FSX",	false,		false,[m
[31m-  false,	"suxc1FSX",	false,		"prefxMSX",[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		false,		false,[m
[31m-  false,	false,		"alnv.psFGHS",	false,[m
[31m-  "madd.sFRGH",	"madd.dFRGH",	false,		false,[m
[31m-  false,	false,		"madd.psFRGH",	false,[m
[31m-  "msub.sFRGH",	"msub.dFRGH",	false,		false,[m
[31m-  false,	false,		"msub.psFRGH",	false,[m
[31m-  "nmadd.sFRGH", "nmadd.dFRGH",	false,		false,[m
[31m-  false,	false,		"nmadd.psFRGH",	false,[m
[31m-  "nmsub.sFRGH", "nmsub.dFRGH",	false,		false,[m
[31m-  false,	false,		"nmsub.psFRGH",	false,[m
[31m-}[m
[31m-[m
[31m-local map_pri = {[m
[31m-  [0] = map_special,	map_regimm,	"jJ",	"jalJ",[m
[31m-  "beq|beqz|bST00B",	"bne|bnezST0B",		"blezSB",	"bgtzSB",[m
[31m-  "addiTSI",	"addiu|liTS0I",	"sltiTSI",	"sltiuTSI",[m
[31m-  "andiTSU",	"ori|liTS0U",	"xoriTSU",	"luiTU",[m
[31m-  map_cop0,	map_cop1,	false,		map_cop1x,[m
[31m-  "beql|beqzlST0B",	"bnel|bnezlST0B",	"blezlSB",	"bgtzlSB",[m
[31m-  false,	false,		false,		false,[m
[31m-  map_special2,	false,		false,		map_special3,[m
[31m-  "lbTSO",	"lhTSO",	"lwlTSO",	"lwTSO",[m
[31m-  "lbuTSO",	"lhuTSO",	"lwrTSO",	false,[m
[31m-  "sbTSO",	"shTSO",	"swlTSO",	"swTSO",[m
[31m-  false,	false,		"swrTSO",	"cacheNSO",[m
[31m-  "llTSO",	"lwc1HSO",	"lwc2TSO",	"prefNSO",[m
[31m-  false,	"ldc1HSO",	"ldc2TSO",	false,[m
[31m-  "scTSO",	"swc1HSO",	"swc2TSO",	false,[m
[31m-  false,	"sdc1HSO",	"sdc2TSO",	false,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",[m
[31m-  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",[m
[31m-  "r24", "r25", "r26", "r27", "r28", "sp", "r30", "ra",[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then extra = "\t->"..sym end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m-local function get_be(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  return bor(lshift(b0, 24), lshift(b1, 16), lshift(b2, 8), b3)[m
[31m-end[m
[31m-[m
[31m-local function get_le(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  return bor(lshift(b3, 24), lshift(b2, 16), lshift(b1, 8), b0)[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local op = ctx:get()[m
[31m-  local operands = {}[m
[31m-  local last = nil[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local opat = map_pri[rshift(op, 26)][m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)] or opat._[m
[31m-  end[m
[31m-  local name, pat = match(opat, "^([a-z0-9_.]*)(.*)")[m
[31m-  local altname, pat2 = match(pat, "|([a-z0-9_.|]*)(.*)")[m
[31m-  if altname then pat = pat2 end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "S" then[m
[31m-      x = map_gpr[band(rshift(op, 21), 31)][m
[31m-    elseif p == "T" then[m
[31m-      x = map_gpr[band(rshift(op, 16), 31)][m
[31m-    elseif p == "D" then[m
[31m-      x = map_gpr[band(rshift(op, 11), 31)][m
[31m-    elseif p == "F" then[m
[31m-      x = "f"..band(rshift(op, 6), 31)[m
[31m-    elseif p == "G" then[m
[31m-      x = "f"..band(rshift(op, 11), 31)[m
[31m-    elseif p == "H" then[m
[31m-      x = "f"..band(rshift(op, 16), 31)[m
[31m-    elseif p == "R" then[m
[31m-      x = "f"..band(rshift(op, 21), 31)[m
[31m-    elseif p == "A" then[m
[31m-      x = band(rshift(op, 6), 31)[m
[31m-    elseif p == "M" then[m
[31m-      x = band(rshift(op, 11), 31)[m
[31m-    elseif p == "N" then[m
[31m-      x = band(rshift(op, 16), 31)[m
[31m-    elseif p == "C" then[m
[31m-      x = band(rshift(op, 18), 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "K" then[m
[31m-      x = band(rshift(op, 11), 31) + 1[m
[31m-    elseif p == "L" then[m
[31m-      x = band(rshift(op, 11), 31) - last + 1[m
[31m-    elseif p == "I" then[m
[31m-      x = arshift(lshift(op, 16), 16)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(op, 0xffff)[m
[31m-    elseif p == "O" then[m
[31m-      local disp = arshift(lshift(op, 16), 16)[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p == "X" then[m
[31m-      local index = map_gpr[band(rshift(op, 16), 31)][m
[31m-      operands[#operands] = format("%s(%s)", index, last)[m
[31m-    elseif p == "B" then[m
[31m-      x = ctx.addr + ctx.pos + arshift(lshift(op, 16), 16)*4 + 4[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "J" then[m
[31m-      x = band(ctx.addr + ctx.pos, 0xf0000000) + band(op, 0x03ffffff)*4[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "V" then[m
[31m-      x = band(rshift(op, 8), 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "W" then[m
[31m-      x = band(op, 7)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "Y" then[m
[31m-      x = band(rshift(op, 6), 0x000fffff)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "Z" then[m
[31m-      x = band(rshift(op, 6), 1023)[m
[31m-      if x == 0 then x = nil end[m
[31m-    elseif p == "0" then[m
[31m-      if last == "r0" or last == 0 then[m
[31m-	local n = #operands[m
[31m-	operands[n] = nil[m
[31m-	last = operands[n-1][m
[31m-	if altname then[m
[31m-	  local a1, a2 = match(altname, "([^|]*)|(.*)")[m
[31m-	  if a1 then name, altname = a1, a2[m
[31m-	  else name = altname end[m
[31m-	end[m
[31m-      end[m
[31m-    elseif p == "1" then[m
[31m-      if last == "ra" then[m
[31m-	operands[#operands] = nil[m
[31m-      end[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then operands[#operands+1] = x; last = x end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  stop = stop - stop % 4[m
[31m-  ctx.pos = ofs - ofs % 4[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  ctx.get = get_be[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m-local function create_el(code, addr, out)[m
[31m-  local ctx = create(code, addr, out)[m
[31m-  ctx.get = get_le[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m-local function disass_el(code, addr, out)[m
[31m-  create_el(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 32 then return map_gpr[r] end[m
[31m-  return "f"..(r-32)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  create_el = create_el,[m
[31m-  disass = disass,[m
[31m-  disass_el = disass_el,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_mipsel.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_mipsel.lua[m
[1mdeleted file mode 100644[m
[1mindex 3f2f6ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_mipsel.lua[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT MIPSEL disassembler wrapper module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This module just exports the little-endian functions from the[m
[31m--- MIPS disassembler module. All the interesting stuff is there.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local dis_mips = require((string.match(..., ".*%.") or "").."dis_mips")[m
[31m-return {[m
[31m-  create = dis_mips.create_el,[m
[31m-  disass = dis_mips.disass_el,[m
[31m-  regname = dis_mips.regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_ppc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_ppc.lua[m
[1mdeleted file mode 100644[m
[1mindex 30f51ec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_ppc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,591 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT PPC disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT/X license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- It disassembles all common, non-privileged 32/64 bit PowerPC instructions[m
[31m--- plus the e500 SPE instructions and some Cell/Xenon extensions.[m
[31m---[m
[31m--- NYI: VMX, VMX128[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local concat = table.concat[m
[31m-local bit = require("bit")[m
[31m-local band, bor, tohex = bit.band, bit.bor, bit.tohex[m
[31m-local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m--- Primary and extended opcode maps[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_crops = {[m
[31m-  shift = 1, mask = 1023,[m
[31m-  [0] = "mcrfXX",[m
[31m-  [33] = "crnor|crnotCCC=", [129] = "crandcCCC",[m
[31m-  [193] = "crxor|crclrCCC%", [225] = "crnandCCC",[m
[31m-  [257] = "crandCCC", [289] = "creqv|crsetCCC%",[m
[31m-  [417] = "crorcCCC", [449] = "cror|crmoveCCC=",[m
[31m-  [16] = "b_lrKB", [528] = "b_ctrKB",[m
[31m-  [150] = "isync",[m
[31m-}[m
[31m-[m
[31m-local map_rlwinm = setmetatable({[m
[31m-  shift = 0, mask = -1,[m
[31m-},[m
[31m-{ __index = function(t, x)[m
[31m-    local rot = band(rshift(x, 11), 31)[m
[31m-    local mb = band(rshift(x, 6), 31)[m
[31m-    local me = band(rshift(x, 1), 31)[m
[31m-    if mb == 0 and me == 31-rot then[m
[31m-      return "slwiRR~A."[m
[31m-    elseif me == 31 and mb == 32-rot then[m
[31m-      return "srwiRR~-A."[m
[31m-    else[m
[31m-      return "rlwinmRR~AAA."[m
[31m-    end[m
[31m-  end[m
[31m-})[m
[31m-[m
[31m-local map_rld = {[m
[31m-  shift = 2, mask = 7,[m
[31m-  [0] = "rldiclRR~HM.", "rldicrRR~HM.", "rldicRR~HM.", "rldimiRR~HM.",[m
[31m-  {[m
[31m-    shift = 1, mask = 1,[m
[31m-    [0] = "rldclRR~RM.", "rldcrRR~RM.",[m
[31m-  },[m
[31m-}[m
[31m-[m
[31m-local map_ext = setmetatable({[m
[31m-  shift = 1, mask = 1023,[m
[31m-[m
[31m-  [0] = "cmp_YLRR", [32] = "cmpl_YLRR",[m
[31m-  [4] = "twARR", [68] = "tdARR",[m
[31m-[m
[31m-  [8] = "subfcRRR.", [40] = "subfRRR.",[m
[31m-  [104] = "negRR.", [136] = "subfeRRR.",[m
[31m-  [200] = "subfzeRR.", [232] = "subfmeRR.",[m
[31m-  [520] = "subfcoRRR.", [552] = "subfoRRR.",[m
[31m-  [616] = "negoRR.", [648] = "subfeoRRR.",[m
[31m-  [712] = "subfzeoRR.", [744] = "subfmeoRR.",[m
[31m-[m
[31m-  [9] = "mulhduRRR.", [73] = "mulhdRRR.", [233] = "mulldRRR.",[m
[31m-  [457] = "divduRRR.", [489] = "divdRRR.",[m
[31m-  [745] = "mulldoRRR.",[m
[31m-  [969] = "divduoRRR.", [1001] = "divdoRRR.",[m
[31m-[m
[31m-  [10] = "addcRRR.", [138] = "addeRRR.",[m
[31m-  [202] = "addzeRR.", [234] = "addmeRR.", [266] = "addRRR.",[m
[31m-  [522] = "addcoRRR.", [650] = "addeoRRR.",[m
[31m-  [714] = "addzeoRR.", [746] = "addmeoRR.", [778] = "addoRRR.",[m
[31m-[m
[31m-  [11] = "mulhwuRRR.", [75] = "mulhwRRR.", [235] = "mullwRRR.",[m
[31m-  [459] = "divwuRRR.", [491] = "divwRRR.",[m
[31m-  [747] = "mullwoRRR.",[m
[31m-  [971] = "divwouRRR.", [1003] = "divwoRRR.",[m
[31m-[m
[31m-  [15] = "iselltRRR", [47] = "iselgtRRR", [79] = "iseleqRRR",[m
[31m-[m
[31m-  [144] = { shift = 20, mask = 1, [0] = "mtcrfRZ~", "mtocrfRZ~", },[m
[31m-  [19] = { shift = 20, mask = 1, [0] = "mfcrR", "mfocrfRZ", },[m
[31m-  [371] = { shift = 11, mask = 1023, [392] = "mftbR", [424] = "mftbuR", },[m
[31m-  [339] = {[m
[31m-    shift = 11, mask = 1023,[m
[31m-    [32] = "mferR", [256] = "mflrR", [288] = "mfctrR", [16] = "mfspefscrR",[m
[31m-  },[m
[31m-  [467] = {[m
[31m-    shift = 11, mask = 1023,[m
[31m-    [32] = "mtxerR", [256] = "mtlrR", [288] = "mtctrR", [16] = "mtspefscrR",[m
[31m-  },[m
[31m-[m
[31m-  [20] = "lwarxRR0R", [84] = "ldarxRR0R",[m
[31m-[m
[31m-  [21] = "ldxRR0R", [53] = "lduxRRR",[m
[31m-  [149] = "stdxRR0R", [181] = "stduxRRR",[m
[31m-  [341] = "lwaxRR0R", [373] = "lwauxRRR",[m
[31m-[m
[31m-  [23] = "lwzxRR0R", [55] = "lwzuxRRR",[m
[31m-  [87] = "lbzxRR0R", [119] = "lbzuxRRR",[m
[31m-  [151] = "stwxRR0R", [183] = "stwuxRRR",[m
[31m-  [215] = "stbxRR0R", [247] = "stbuxRRR",[m
[31m-  [279] = "lhzxRR0R", [311] = "lhzuxRRR",[m
[31m-  [343] = "lhaxRR0R", [375] = "lhauxRRR",[m
[31m-  [407] = "sthxRR0R", [439] = "sthuxRRR",[m
[31m-[m
[31m-  [54] = "dcbst-R0R", [86] = "dcbf-R0R",[m
[31m-  [150] = "stwcxRR0R.", [214] = "stdcxRR0R.",[m
[31m-  [246] = "dcbtst-R0R", [278] = "dcbt-R0R",[m
[31m-  [310] = "eciwxRR0R", [438] = "ecowxRR0R",[m
[31m-  [470] = "dcbi-RR",[m
[31m-[m
[31m-  [598] = {[m
[31m-    shift = 21, mask = 3,[m
[31m-    [0] = "sync", "lwsync", "ptesync",[m
[31m-  },[m
[31m-  [758] = "dcba-RR",[m
[31m-  [854] = "eieio", [982] = "icbi-R0R", [1014] = "dcbz-R0R",[m
[31m-[m
[31m-  [26] = "cntlzwRR~", [58] = "cntlzdRR~",[m
[31m-  [122] = "popcntbRR~",[m
[31m-  [154] = "prtywRR~", [186] = "prtydRR~",[m
[31m-[m
[31m-  [28] = "andRR~R.", [60] = "andcRR~R.", [124] = "nor|notRR~R=.",[m
[31m-  [284] = "eqvRR~R.", [316] = "xorRR~R.",[m
[31m-  [412] = "orcRR~R.", [444] = "or|mrRR~R=.", [476] = "nandRR~R.",[m
[31m-  [508] = "cmpbRR~R",[m
[31m-[m
[31m-  [512] = "mcrxrX",[m
[31m-[m
[31m-  [532] = "ldbrxRR0R", [660] = "stdbrxRR0R",[m
[31m-[m
[31m-  [533] = "lswxRR0R", [597] = "lswiRR0A",[m
[31m-  [661] = "stswxRR0R", [725] = "stswiRR0A",[m
[31m-[m
[31m-  [534] = "lwbrxRR0R", [662] = "stwbrxRR0R",[m
[31m-  [790] = "lhbrxRR0R", [918] = "sthbrxRR0R",[m
[31m-[m
[31m-  [535] = "lfsxFR0R", [567] = "lfsuxFRR",[m
[31m-  [599] = "lfdxFR0R", [631] = "lfduxFRR",[m
[31m-  [663] = "stfsxFR0R", [695] = "stfsuxFRR",[m
[31m-  [727] = "stfdxFR0R", [759] = "stfduxFR0R",[m
[31m-  [855] = "lfiwaxFR0R",[m
[31m-  [983] = "stfiwxFR0R",[m
[31m-[m
[31m-  [24] = "slwRR~R.",[m
[31m-[m
[31m-  [27] = "sldRR~R.", [536] = "srwRR~R.",[m
[31m-  [792] = "srawRR~R.", [824] = "srawiRR~A.",[m
[31m-[m
[31m-  [794] = "sradRR~R.", [826] = "sradiRR~H.", [827] = "sradiRR~H.",[m
[31m-  [922] = "extshRR~.", [954] = "extsbRR~.", [986] = "extswRR~.",[m
[31m-[m
[31m-  [539] = "srdRR~R.",[m
[31m-},[m
[31m-{ __index = function(t, x)[m
[31m-    if band(x, 31) == 15 then return "iselRRRC" end[m
[31m-  end[m
[31m-})[m
[31m-[m
[31m-local map_ld = {[m
[31m-  shift = 0, mask = 3,[m
[31m-  [0] = "ldRRE", "lduRRE", "lwaRRE",[m
[31m-}[m
[31m-[m
[31m-local map_std = {[m
[31m-  shift = 0, mask = 3,[m
[31m-  [0] = "stdRRE", "stduRRE",[m
[31m-}[m
[31m-[m
[31m-local map_fps = {[m
[31m-  shift = 5, mask = 1,[m
[31m-  {[m
[31m-    shift = 1, mask = 15,[m
[31m-    [0] = false, false, "fdivsFFF.", false,[m
[31m-    "fsubsFFF.", "faddsFFF.", "fsqrtsF-F.", false,[m
[31m-    "fresF-F.", "fmulsFF-F.", "frsqrtesF-F.", false,[m
[31m-    "fmsubsFFFF~.", "fmaddsFFFF~.", "fnmsubsFFFF~.", "fnmaddsFFFF~.",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_fpd = {[m
[31m-  shift = 5, mask = 1,[m
[31m-  [0] = {[m
[31m-    shift = 1, mask = 1023,[m
[31m-    [0] = "fcmpuXFF", [32] = "fcmpoXFF", [64] = "mcrfsXX",[m
[31m-    [38] = "mtfsb1A.", [70] = "mtfsb0A.", [134] = "mtfsfiA>>-A>",[m
[31m-    [8] = "fcpsgnFFF.", [40] = "fnegF-F.", [72] = "fmrF-F.",[m
[31m-    [136] = "fnabsF-F.", [264] = "fabsF-F.",[m
[31m-    [12] = "frspF-F.",[m
[31m-    [14] = "fctiwF-F.", [15] = "fctiwzF-F.",[m
[31m-    [583] = "mffsF.", [711] = "mtfsfZF.",[m
[31m-    [392] = "frinF-F.", [424] = "frizF-F.",[m
[31m-    [456] = "fripF-F.", [488] = "frimF-F.",[m
[31m-    [814] = "fctidF-F.", [815] = "fctidzF-F.", [846] = "fcfidF-F.",[m
[31m-  },[m
[31m-  {[m
[31m-    shift = 1, mask = 15,[m
[31m-    [0] = false, false, "fdivFFF.", false,[m
[31m-    "fsubFFF.", "faddFFF.", "fsqrtF-F.", "fselFFFF~.",[m
[31m-    "freF-F.", "fmulFF-F.", "frsqrteF-F.", false,[m
[31m-    "fmsubFFFF~.", "fmaddFFFF~.", "fnmsubFFFF~.", "fnmaddFFFF~.",[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-local map_spe = {[m
[31m-  shift = 0, mask = 2047,[m
[31m-[m
[31m-  [512] = "evaddwRRR", [514] = "evaddiwRAR~",[m
[31m-  [516] = "evsubwRRR~", [518] = "evsubiwRAR~",[m
[31m-  [520] = "evabsRR", [521] = "evnegRR",[m
[31m-  [522] = "evextsbRR", [523] = "evextshRR", [524] = "evrndwRR",[m
[31m-  [525] = "evcntlzwRR", [526] = "evcntlswRR",[m
[31m-[m
[31m-  [527] = "brincRRR",[m
[31m-[m
[31m-  [529] = "evandRRR", [530] = "evandcRRR", [534] = "evxorRRR",[m
[31m-  [535] = "evor|evmrRRR=", [536] = "evnor|evnotRRR=",[m
[31m-  [537] = "eveqvRRR", [539] = "evorcRRR", [542] = "evnandRRR",[m
[31m-[m
[31m-  [544] = "evsrwuRRR", [545] = "evsrwsRRR",[m
[31m-  [546] = "evsrwiuRRA", [547] = "evsrwisRRA",[m
[31m-  [548] = "evslwRRR", [550] = "evslwiRRA",[m
[31m-  [552] = "evrlwRRR", [553] = "evsplatiRS",[m
[31m-  [554] = "evrlwiRRA", [555] = "evsplatfiRS",[m
[31m-  [556] = "evmergehiRRR", [557] = "evmergeloRRR",[m
[31m-  [558] = "evmergehiloRRR", [559] = "evmergelohiRRR",[m
[31m-[m
[31m-  [560] = "evcmpgtuYRR", [561] = "evcmpgtsYRR",[m
[31m-  [562] = "evcmpltuYRR", [563] = "evcmpltsYRR",[m
[31m-  [564] = "evcmpeqYRR",[m
[31m-[m
[31m-  [632] = "evselRRR", [633] = "evselRRRW",[m
[31m-  [634] = "evselRRRW", [635] = "evselRRRW",[m
[31m-  [636] = "evselRRRW", [637] = "evselRRRW",[m
[31m-  [638] = "evselRRRW", [639] = "evselRRRW",[m
[31m-[m
[31m-  [640] = "evfsaddRRR", [641] = "evfssubRRR",[m
[31m-  [644] = "evfsabsRR", [645] = "evfsnabsRR", [646] = "evfsnegRR",[m
[31m-  [648] = "evfsmulRRR", [649] = "evfsdivRRR",[m
[31m-  [652] = "evfscmpgtYRR", [653] = "evfscmpltYRR", [654] = "evfscmpeqYRR",[m
[31m-  [656] = "evfscfuiR-R", [657] = "evfscfsiR-R",[m
[31m-  [658] = "evfscfufR-R", [659] = "evfscfsfR-R",[m
[31m-  [660] = "evfsctuiR-R", [661] = "evfsctsiR-R",[m
[31m-  [662] = "evfsctufR-R", [663] = "evfsctsfR-R",[m
[31m-  [664] = "evfsctuizR-R", [666] = "evfsctsizR-R",[m
[31m-  [668] = "evfststgtYRR", [669] = "evfststltYRR", [670] = "evfststeqYRR",[m
[31m-[m
[31m-  [704] = "efsaddRRR", [705] = "efssubRRR",[m
[31m-  [708] = "efsabsRR", [709] = "efsnabsRR", [710] = "efsnegRR",[m
[31m-  [712] = "efsmulRRR", [713] = "efsdivRRR",[m
[31m-  [716] = "efscmpgtYRR", [717] = "efscmpltYRR", [718] = "efscmpeqYRR",[m
[31m-  [719] = "efscfdR-R",[m
[31m-  [720] = "efscfuiR-R", [721] = "efscfsiR-R",[m
[31m-  [722] = "efscfufR-R", [723] = "efscfsfR-R",[m
[31m-  [724] = "efsctuiR-R", [725] = "efsctsiR-R",[m
[31m-  [726] = "efsctufR-R", [727] = "efsctsfR-R",[m
[31m-  [728] = "efsctuizR-R", [730] = "efsctsizR-R",[m
[31m-  [732] = "efststgtYRR", [733] = "efststltYRR", [734] = "efststeqYRR",[m
[31m-[m
[31m-  [736] = "efdaddRRR", [737] = "efdsubRRR",[m
[31m-  [738] = "efdcfuidR-R", [739] = "efdcfsidR-R",[m
[31m-  [740] = "efdabsRR", [741] = "efdnabsRR", [742] = "efdnegRR",[m
[31m-  [744] = "efdmulRRR", [745] = "efddivRRR",[m
[31m-  [746] = "efdctuidzR-R", [747] = "efdctsidzR-R",[m
[31m-  [748] = "efdcmpgtYRR", [749] = "efdcmpltYRR", [750] = "efdcmpeqYRR",[m
[31m-  [751] = "efdcfsR-R",[m
[31m-  [752] = "efdcfuiR-R", [753] = "efdcfsiR-R",[m
[31m-  [754] = "efdcfufR-R", [755] = "efdcfsfR-R",[m
[31m-  [756] = "efdctuiR-R", [757] = "efdctsiR-R",[m
[31m-  [758] = "efdctufR-R", [759] = "efdctsfR-R",[m
[31m-  [760] = "efdctuizR-R", [762] = "efdctsizR-R",[m
[31m-  [764] = "efdtstgtYRR", [765] = "efdtstltYRR", [766] = "efdtsteqYRR",[m
[31m-[m
[31m-  [768] = "evlddxRR0R", [769] = "evlddRR8",[m
[31m-  [770] = "evldwxRR0R", [771] = "evldwRR8",[m
[31m-  [772] = "evldhxRR0R", [773] = "evldhRR8",[m
[31m-  [776] = "evlhhesplatxRR0R", [777] = "evlhhesplatRR2",[m
[31m-  [780] = "evlhhousplatxRR0R", [781] = "evlhhousplatRR2",[m
[31m-  [782] = "evlhhossplatxRR0R", [783] = "evlhhossplatRR2",[m
[31m-  [784] = "evlwhexRR0R", [785] = "evlwheRR4",[m
[31m-  [788] = "evlwhouxRR0R", [789] = "evlwhouRR4",[m
[31m-  [790] = "evlwhosxRR0R", [791] = "evlwhosRR4",[m
[31m-  [792] = "evlwwsplatxRR0R", [793] = "evlwwsplatRR4",[m
[31m-  [796] = "evlwhsplatxRR0R", [797] = "evlwhsplatRR4",[m
[31m-[m
[31m-  [800] = "evstddxRR0R", [801] = "evstddRR8",[m
[31m-  [802] = "evstdwxRR0R", [803] = "evstdwRR8",[m
[31m-  [804] = "evstdhxRR0R", [805] = "evstdhRR8",[m
[31m-  [816] = "evstwhexRR0R", [817] = "evstwheRR4",[m
[31m-  [820] = "evstwhoxRR0R", [821] = "evstwhoRR4",[m
[31m-  [824] = "evstwwexRR0R", [825] = "evstwweRR4",[m
[31m-  [828] = "evstwwoxRR0R", [829] = "evstwwoRR4",[m
[31m-[m
[31m-  [1027] = "evmhessfRRR", [1031] = "evmhossfRRR", [1032] = "evmheumiRRR",[m
[31m-  [1033] = "evmhesmiRRR", [1035] = "evmhesmfRRR", [1036] = "evmhoumiRRR",[m
[31m-  [1037] = "evmhosmiRRR", [1039] = "evmhosmfRRR", [1059] = "evmhessfaRRR",[m
[31m-  [1063] = "evmhossfaRRR", [1064] = "evmheumiaRRR", [1065] = "evmhesmiaRRR",[m
[31m-  [1067] = "evmhesmfaRRR", [1068] = "evmhoumiaRRR", [1069] = "evmhosmiaRRR",[m
[31m-  [1071] = "evmhosmfaRRR", [1095] = "evmwhssfRRR", [1096] = "evmwlumiRRR",[m
[31m-  [1100] = "evmwhumiRRR", [1101] = "evmwhsmiRRR", [1103] = "evmwhsmfRRR",[m
[31m-  [1107] = "evmwssfRRR", [1112] = "evmwumiRRR", [1113] = "evmwsmiRRR",[m
[31m-  [1115] = "evmwsmfRRR", [1127] = "evmwhssfaRRR", [1128] = "evmwlumiaRRR",[m
[31m-  [1132] = "evmwhumiaRRR", [1133] = "evmwhsmiaRRR", [1135] = "evmwhsmfaRRR",[m
[31m-  [1139] = "evmwssfaRRR", [1144] = "evmwumiaRRR", [1145] = "evmwsmiaRRR",[m
[31m-  [1147] = "evmwsmfaRRR",[m
[31m-[m
[31m-  [1216] = "evaddusiaawRR", [1217] = "evaddssiaawRR",[m
[31m-  [1218] = "evsubfusiaawRR", [1219] = "evsubfssiaawRR",[m
[31m-  [1220] = "evmraRR",[m
[31m-  [1222] = "evdivwsRRR", [1223] = "evdivwuRRR",[m
[31m-  [1224] = "evaddumiaawRR", [1225] = "evaddsmiaawRR",[m
[31m-  [1226] = "evsubfumiaawRR", [1227] = "evsubfsmiaawRR",[m
[31m-[m
[31m-  [1280] = "evmheusiaawRRR", [1281] = "evmhessiaawRRR",[m
[31m-  [1283] = "evmhessfaawRRR", [1284] = "evmhousiaawRRR",[m
[31m-  [1285] = "evmhossiaawRRR", [1287] = "evmhossfaawRRR",[m
[31m-  [1288] = "evmheumiaawRRR", [1289] = "evmhesmiaawRRR",[m
[31m-  [1291] = "evmhesmfaawRRR", [1292] = "evmhoumiaawRRR",[m
[31m-  [1293] = "evmhosmiaawRRR", [1295] = "evmhosmfaawRRR",[m
[31m-  [1320] = "evmhegumiaaRRR", [1321] = "evmhegsmiaaRRR",[m
[31m-  [1323] = "evmhegsmfaaRRR", [1324] = "evmhogumiaaRRR",[m
[31m-  [1325] = "evmhogsmiaaRRR", [1327] = "evmhogsmfaaRRR",[m
[31m-  [1344] = "evmwlusiaawRRR", [1345] = "evmwlssiaawRRR",[m
[31m-  [1352] = "evmwlumiaawRRR", [1353] = "evmwlsmiaawRRR",[m
[31m-  [1363] = "evmwssfaaRRR", [1368] = "evmwumiaaRRR",[m
[31m-  [1369] = "evmwsmiaaRRR", [1371] = "evmwsmfaaRRR",[m
[31m-  [1408] = "evmheusianwRRR", [1409] = "evmhessianwRRR",[m
[31m-  [1411] = "evmhessfanwRRR", [1412] = "evmhousianwRRR",[m
[31m-  [1413] = "evmhossianwRRR", [1415] = "evmhossfanwRRR",[m
[31m-  [1416] = "evmheumianwRRR", [1417] = "evmhesmianwRRR",[m
[31m-  [1419] = "evmhesmfanwRRR", [1420] = "evmhoumianwRRR",[m
[31m-  [1421] = "evmhosmianwRRR", [1423] = "evmhosmfanwRRR",[m
[31m-  [1448] = "evmhegumianRRR", [1449] = "evmhegsmianRRR",[m
[31m-  [1451] = "evmhegsmfanRRR", [1452] = "evmhogumianRRR",[m
[31m-  [1453] = "evmhogsmianRRR", [1455] = "evmhogsmfanRRR",[m
[31m-  [1472] = "evmwlusianwRRR", [1473] = "evmwlssianwRRR",[m
[31m-  [1480] = "evmwlumianwRRR", [1481] = "evmwlsmianwRRR",[m
[31m-  [1491] = "evmwssfanRRR", [1496] = "evmwumianRRR",[m
[31m-  [1497] = "evmwsmianRRR", [1499] = "evmwsmfanRRR",[m
[31m-}[m
[31m-[m
[31m-local map_pri = {[m
[31m-  [0] = false,	false,		"tdiARI",	"twiARI",[m
[31m-  map_spe,	false,		false,		"mulliRRI",[m
[31m-  "subficRRI",	false,		"cmpl_iYLRU",	"cmp_iYLRI",[m
[31m-  "addicRRI",	"addic.RRI",	"addi|liRR0I",	"addis|lisRR0I",[m
[31m-  "b_KBJ",	"sc",		 "bKJ",		map_crops,[m
[31m-  "rlwimiRR~AAA.", map_rlwinm,	false,		"rlwnmRR~RAA.",[m
[31m-  "oriNRR~U",	"orisRR~U",	"xoriRR~U",	"xorisRR~U",[m
[31m-  "andi.RR~U",	"andis.RR~U",	map_rld,	map_ext,[m
[31m-  "lwzRRD",	"lwzuRRD",	"lbzRRD",	"lbzuRRD",[m
[31m-  "stwRRD",	"stwuRRD",	"stbRRD",	"stbuRRD",[m
[31m-  "lhzRRD",	"lhzuRRD",	"lhaRRD",	"lhauRRD",[m
[31m-  "sthRRD",	"sthuRRD",	"lmwRRD",	"stmwRRD",[m
[31m-  "lfsFRD",	"lfsuFRD",	"lfdFRD",	"lfduFRD",[m
[31m-  "stfsFRD",	"stfsuFRD",	"stfdFRD",	"stfduFRD",[m
[31m-  false,	false,		map_ld,		map_fps,[m
[31m-  false,	false,		map_std,	map_fpd,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local map_gpr = {[m
[31m-  [0] = "r0", "sp", "r2", "r3", "r4", "r5", "r6", "r7",[m
[31m-  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",[m
[31m-  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",[m
[31m-  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",[m
[31m-}[m
[31m-[m
[31m-local map_cond = { [0] = "lt", "gt", "eq", "so", "ge", "le", "ne", "ns", }[m
[31m-[m
[31m--- Format a condition bit.[m
[31m-local function condfmt(cond)[m
[31m-  if cond <= 3 then[m
[31m-    return map_cond[band(cond, 3)][m
[31m-  else[m
[31m-    return format("4*cr%d+%s", rshift(cond, 2), map_cond[band(cond, 3)])[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local pos = ctx.pos[m
[31m-  local extra = ""[m
[31m-  if ctx.rel then[m
[31m-    local sym = ctx.symtab[ctx.rel][m
[31m-    if sym then extra = "\t->"..sym end[m
[31m-  end[m
[31m-  if ctx.hexdump > 0 then[m
[31m-    ctx.out(format("%08x  %s  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra))[m
[31m-  else[m
[31m-    ctx.out(format("%08x  %-7s %s%s\n",[m
[31m-	    ctx.addr+pos, text, concat(operands, ", "), extra))[m
[31m-  end[m
[31m-  ctx.pos = pos + 4[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  return putop(ctx, ".long", { "0x"..tohex(ctx.op) })[m
[31m-end[m
[31m-[m
[31m--- Disassemble a single instruction.[m
[31m-local function disass_ins(ctx)[m
[31m-  local pos = ctx.pos[m
[31m-  local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4)[m
[31m-  local op = bor(lshift(b0, 24), lshift(b1, 16), lshift(b2, 8), b3)[m
[31m-  local operands = {}[m
[31m-  local last = nil[m
[31m-  local rs = 21[m
[31m-  ctx.op = op[m
[31m-  ctx.rel = nil[m
[31m-[m
[31m-  local opat = map_pri[rshift(b0, 2)][m
[31m-  while type(opat) ~= "string" do[m
[31m-    if not opat then return unknown(ctx) end[m
[31m-    opat = opat[band(rshift(op, opat.shift), opat.mask)][m
[31m-  end[m
[31m-  local name, pat = match(opat, "^([a-z0-9_.]*)(.*)")[m
[31m-  local altname, pat2 = match(pat, "|([a-z0-9_.]*)(.*)")[m
[31m-  if altname then pat = pat2 end[m
[31m-[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "R" then[m
[31m-      x = map_gpr[band(rshift(op, rs), 31)][m
[31m-      rs = rs - 5[m
[31m-    elseif p == "F" then[m
[31m-      x = "f"..band(rshift(op, rs), 31)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "A" then[m
[31m-      x = band(rshift(op, rs), 31)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "S" then[m
[31m-      x = arshift(lshift(op, 27-rs), 27)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "I" then[m
[31m-      x = arshift(lshift(op, 16), 16)[m
[31m-    elseif p == "U" then[m
[31m-      x = band(op, 0xffff)[m
[31m-    elseif p == "D" or p == "E" then[m
[31m-      local disp = arshift(lshift(op, 16), 16)[m
[31m-      if p == "E" then disp = band(disp, -4) end[m
[31m-      if last == "r0" then last = "0" end[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p >= "2" and p <= "8" then[m
[31m-      local disp = band(rshift(op, rs), 31) * p[m
[31m-      if last == "r0" then last = "0" end[m
[31m-      operands[#operands] = format("%d(%s)", disp, last)[m
[31m-    elseif p == "H" then[m
[31m-      x = band(rshift(op, rs), 31) + lshift(band(op, 2), 4)[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "M" then[m
[31m-      x = band(rshift(op, rs), 31) + band(op, 0x20)[m
[31m-    elseif p == "C" then[m
[31m-      x = condfmt(band(rshift(op, rs), 31))[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "B" then[m
[31m-      local bo = rshift(op, 21)[m
[31m-      local cond = band(rshift(op, 16), 31)[m
[31m-      local cn = ""[m
[31m-      rs = rs - 10[m
[31m-      if band(bo, 4) == 0 then[m
[31m-	cn = band(bo, 2) == 0 and "dnz" or "dz"[m
[31m-	if band(bo, 0x10) == 0 then[m
[31m-	  cn = cn..(band(bo, 8) == 0 and "f" or "t")[m
[31m-	end[m
[31m-	if band(bo, 0x10) == 0 then x = condfmt(cond) end[m
[31m-	name = name..(band(bo, 1) == band(rshift(op, 15), 1) and "-" or "+")[m
[31m-      elseif band(bo, 0x10) == 0 then[m
[31m-	cn = map_cond[band(cond, 3) + (band(bo, 8) == 0 and 4 or 0)][m
[31m-	if cond > 3 then x = "cr"..rshift(cond, 2) end[m
[31m-	name = name..(band(bo, 1) == band(rshift(op, 15), 1) and "-" or "+")[m
[31m-      end[m
[31m-      name = gsub(name, "_", cn)[m
[31m-    elseif p == "J" then[m
[31m-      x = arshift(lshift(op, 27-rs), 29-rs)*4[m
[31m-      if band(op, 2) == 0 then x = ctx.addr + pos + x end[m
[31m-      ctx.rel = x[m
[31m-      x = "0x"..tohex(x)[m
[31m-    elseif p == "K" then[m
[31m-      if band(op, 1) ~= 0 then name = name.."l" end[m
[31m-      if band(op, 2) ~= 0 then name = name.."a" end[m
[31m-    elseif p == "X" or p == "Y" then[m
[31m-      x = band(rshift(op, rs+2), 7)[m
[31m-      if x == 0 and p == "Y" then x = nil else x = "cr"..x end[m
[31m-      rs = rs - 5[m
[31m-    elseif p == "W" then[m
[31m-      x = "cr"..band(op, 7)[m
[31m-    elseif p == "Z" then[m
[31m-      x = band(rshift(op, rs-4), 255)[m
[31m-      rs = rs - 10[m
[31m-    elseif p == ">" then[m
[31m-      operands[#operands] = rshift(operands[#operands], 1)[m
[31m-    elseif p == "0" then[m
[31m-      if last == "r0" then[m
[31m-	operands[#operands] = nil[m
[31m-	if altname then name = altname end[m
[31m-      end[m
[31m-    elseif p == "L" then[m
[31m-      name = gsub(name, "_", band(op, 0x00200000) ~= 0 and "d" or "w")[m
[31m-    elseif p == "." then[m
[31m-      if band(op, 1) == 1 then name = name.."." end[m
[31m-    elseif p == "N" then[m
[31m-      if op == 0x60000000 then name = "nop"; break end[m
[31m-    elseif p == "~" then[m
[31m-      local n = #operands[m
[31m-      operands[n-1],  operands[n] = operands[n], operands[n-1][m
[31m-    elseif p == "=" then[m
[31m-      local n = #operands[m
[31m-      if last == operands[n-1] then[m
[31m-	operands[n] = nil[m
[31m-	name = altname[m
[31m-      end[m
[31m-    elseif p == "%" then[m
[31m-      local n = #operands[m
[31m-      if last == operands[n-1] and last == operands[n-2] then[m
[31m-	operands[n] = nil[m
[31m-	operands[n-1] = nil[m
[31m-	name = altname[m
[31m-      end[m
[31m-    elseif p == "-" then[m
[31m-      rs = rs - 5[m
[31m-    else[m
[31m-      assert(false)[m
[31m-    end[m
[31m-    if x then operands[#operands+1] = x; last = x end[m
[31m-  end[m
[31m-[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  stop = stop - stop % 4[m
[31m-  ctx.pos = ofs - ofs % 4[m
[31m-  ctx.rel = nil[m
[31m-  while ctx.pos < stop do disass_ins(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = addr or 0[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 8[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 32 then return map_gpr[r] end[m
[31m-  return "f"..(r-32)[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  disass = disass,[m
[31m-  regname = regname[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_x64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_x64.lua[m
[1mdeleted file mode 100644[m
[1mindex 077b1b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_x64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT x64 disassembler wrapper module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This module just exports the 64 bit functions from the combined[m
[31m--- x86/x64 disassembler module. All the interesting stuff is there.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local dis_x86 = require((string.match(..., ".*%.") or "").."dis_x86")[m
[31m-return {[m
[31m-  create = dis_x86.create64,[m
[31m-  disass = dis_x86.disass64,[m
[31m-  regname = dis_x86.regname64[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_x86.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_x86.lua[m
[1mdeleted file mode 100644[m
[1mindex 0bbd198..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dis_x86.lua[m
[1m+++ /dev/null[m
[36m@@ -1,931 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT x86/x64 disassembler module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m--- This is a helper module used by the LuaJIT machine code dumper module.[m
[31m---[m
[31m--- Sending small code snippets to an external disassembler and mixing the[m
[31m--- output with our own stuff was too fragile. So I had to bite the bullet[m
[31m--- and write yet another x86 disassembler. Oh well ...[m
[31m---[m
[31m--- The output format is very similar to what ndisasm generates. But it has[m
[31m--- been developed independently by looking at the opcode tables from the[m
[31m--- Intel and AMD manuals. The supported instruction set is quite extensive[m
[31m--- and reflects what a current generation Intel or AMD CPU implements in[m
[31m--- 32 bit and 64 bit mode. Yes, this includes MMX, SSE, SSE2, SSE3, SSSE3,[m
[31m--- SSE4.1, SSE4.2, SSE4a, AVX, AVX2 and even privileged and hypervisor[m
[31m--- (VMX/SVM) instructions.[m
[31m---[m
[31m--- Notes:[m
[31m--- * The (useless) a16 prefix, 3DNow and pre-586 opcodes are unsupported.[m
[31m--- * No attempt at optimization has been made -- it's fast enough for my needs.[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local type = type[m
[31m-local sub, byte, format = string.sub, string.byte, string.format[m
[31m-local match, gmatch, gsub = string.match, string.gmatch, string.gsub[m
[31m-local lower, rep = string.lower, string.rep[m
[31m-local bit = require("bit")[m
[31m-local tohex = bit.tohex[m
[31m-[m
[31m--- Map for 1st opcode byte in 32 bit mode. Ugly? Well ... read on.[m
[31m-local map_opc1_32 = {[m
[31m---0x[m
[31m-[0]="addBmr","addVmr","addBrm","addVrm","addBai","addVai","push es","pop es",[m
[31m-"orBmr","orVmr","orBrm","orVrm","orBai","orVai","push cs","opc2*",[m
[31m---1x[m
[31m-"adcBmr","adcVmr","adcBrm","adcVrm","adcBai","adcVai","push ss","pop ss",[m
[31m-"sbbBmr","sbbVmr","sbbBrm","sbbVrm","sbbBai","sbbVai","push ds","pop ds",[m
[31m---2x[m
[31m-"andBmr","andVmr","andBrm","andVrm","andBai","andVai","es:seg","daa",[m
[31m-"subBmr","subVmr","subBrm","subVrm","subBai","subVai","cs:seg","das",[m
[31m---3x[m
[31m-"xorBmr","xorVmr","xorBrm","xorVrm","xorBai","xorVai","ss:seg","aaa",[m
[31m-"cmpBmr","cmpVmr","cmpBrm","cmpVrm","cmpBai","cmpVai","ds:seg","aas",[m
[31m---4x[m
[31m-"incVR","incVR","incVR","incVR","incVR","incVR","incVR","incVR",[m
[31m-"decVR","decVR","decVR","decVR","decVR","decVR","decVR","decVR",[m
[31m---5x[m
[31m-"pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR",[m
[31m-"popUR","popUR","popUR","popUR","popUR","popUR","popUR","popUR",[m
[31m---6x[m
[31m-"sz*pushaw,pusha","sz*popaw,popa","boundVrm","arplWmr",[m
[31m-"fs:seg","gs:seg","o16:","a16",[m
[31m-"pushUi","imulVrmi","pushBs","imulVrms",[m
[31m-"insb","insVS","outsb","outsVS",[m
[31m---7x[m
[31m-"joBj","jnoBj","jbBj","jnbBj","jzBj","jnzBj","jbeBj","jaBj",[m
[31m-"jsBj","jnsBj","jpeBj","jpoBj","jlBj","jgeBj","jleBj","jgBj",[m
[31m---8x[m
[31m-"arith!Bmi","arith!Vmi","arith!Bmi","arith!Vms",[m
[31m-"testBmr","testVmr","xchgBrm","xchgVrm",[m
[31m-"movBmr","movVmr","movBrm","movVrm",[m
[31m-"movVmg","leaVrm","movWgm","popUm",[m
[31m---9x[m
[31m-"nop*xchgVaR|pause|xchgWaR|repne nop","xchgVaR","xchgVaR","xchgVaR",[m
[31m-"xchgVaR","xchgVaR","xchgVaR","xchgVaR",[m
[31m-"sz*cbw,cwde,cdqe","sz*cwd,cdq,cqo","call farViw","wait",[m
[31m-"sz*pushfw,pushf","sz*popfw,popf","sahf","lahf",[m
[31m---Ax[m
[31m-"movBao","movVao","movBoa","movVoa",[m
[31m-"movsb","movsVS","cmpsb","cmpsVS",[m
[31m-"testBai","testVai","stosb","stosVS",[m
[31m-"lodsb","lodsVS","scasb","scasVS",[m
[31m---Bx[m
[31m-"movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi",[m
[31m-"movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI",[m
[31m---Cx[m
[31m-"shift!Bmu","shift!Vmu","retBw","ret","vex*3$lesVrm","vex*2$ldsVrm","movBmi","movVmi",[m
[31m-"enterBwu","leave","retfBw","retf","int3","intBu","into","iretVS",[m
[31m---Dx[m
[31m-"shift!Bm1","shift!Vm1","shift!Bmc","shift!Vmc","aamBu","aadBu","salc","xlatb",[m
[31m-"fp*0","fp*1","fp*2","fp*3","fp*4","fp*5","fp*6","fp*7",[m
[31m---Ex[m
[31m-"loopneBj","loopeBj","loopBj","sz*jcxzBj,jecxzBj,jrcxzBj",[m
[31m-"inBau","inVau","outBua","outVua",[m
[31m-"callVj","jmpVj","jmp farViw","jmpBj","inBad","inVad","outBda","outVda",[m
[31m---Fx[m
[31m-"lock:","int1","repne:rep","rep:","hlt","cmc","testb!Bm","testv!Vm",[m
[31m-"clc","stc","cli","sti","cld","std","incb!Bm","incd!Vm",[m
[31m-}[m
[31m-assert(#map_opc1_32 == 255)[m
[31m-[m
[31m--- Map for 1st opcode byte in 64 bit mode (overrides only).[m
[31m-local map_opc1_64 = setmetatable({[m
[31m-  [0x06]=false, [0x07]=false, [0x0e]=false,[m
[31m-  [0x16]=false, [0x17]=false, [0x1e]=false, [0x1f]=false,[m
[31m-  [0x27]=false, [0x2f]=false, [0x37]=false, [0x3f]=false,[m
[31m-  [0x60]=false, [0x61]=false, [0x62]=false, [0x63]="movsxdVrDmt", [0x67]="a32:",[m
[31m-  [0x40]="rex*",   [0x41]="rex*b",   [0x42]="rex*x",   [0x43]="rex*xb",[m
[31m-  [0x44]="rex*r",  [0x45]="rex*rb",  [0x46]="rex*rx",  [0x47]="rex*rxb",[m
[31m-  [0x48]="rex*w",  [0x49]="rex*wb",  [0x4a]="rex*wx",  [0x4b]="rex*wxb",[m
[31m-  [0x4c]="rex*wr", [0x4d]="rex*wrb", [0x4e]="rex*wrx", [0x4f]="rex*wrxb",[m
[31m-  [0x82]=false, [0x9a]=false, [0xc4]="vex*3", [0xc5]="vex*2", [0xce]=false,[m
[31m-  [0xd4]=false, [0xd5]=false, [0xd6]=false, [0xea]=false,[m
[31m-}, { __index = map_opc1_32 })[m
[31m-[m
[31m--- Map for 2nd opcode byte (0F xx). True CISC hell. Hey, I told you.[m
[31m--- Prefix dependent MMX/SSE opcodes: (none)|rep|o16|repne, -|F3|66|F2[m
[31m-local map_opc2 = {[m
[31m---0x[m
[31m-[0]="sldt!Dmp","sgdt!Ump","larVrm","lslVrm",nil,"syscall","clts","sysret",[m
[31m-"invd","wbinvd",nil,"ud1",nil,"$prefetch!Bm","femms","3dnowMrmu",[m
[31m---1x[m
[31m-"movupsXrm|movssXrvm|movupdXrm|movsdXrvm",[m
[31m-"movupsXmr|movssXmvr|movupdXmr|movsdXmvr",[m
[31m-"movhlpsXrm$movlpsXrm|movsldupXrm|movlpdXrm|movddupXrm",[m
[31m-"movlpsXmr||movlpdXmr",[m
[31m-"unpcklpsXrvm||unpcklpdXrvm",[m
[31m-"unpckhpsXrvm||unpckhpdXrvm",[m
[31m-"movlhpsXrm$movhpsXrm|movshdupXrm|movhpdXrm",[m
[31m-"movhpsXmr||movhpdXmr",[m
[31m-"$prefetcht!Bm","hintnopVm","hintnopVm","hintnopVm",[m
[31m-"hintnopVm","hintnopVm","hintnopVm","hintnopVm",[m
[31m---2x[m
[31m-"movUmx$","movUmy$","movUxm$","movUym$","movUmz$",nil,"movUzm$",nil,[m
[31m-"movapsXrm||movapdXrm",[m
[31m-"movapsXmr||movapdXmr",[m
[31m-"cvtpi2psXrMm|cvtsi2ssXrvVmt|cvtpi2pdXrMm|cvtsi2sdXrvVmt",[m
[31m-"movntpsXmr|movntssXmr|movntpdXmr|movntsdXmr",[m
[31m-"cvttps2piMrXm|cvttss2siVrXm|cvttpd2piMrXm|cvttsd2siVrXm",[m
[31m-"cvtps2piMrXm|cvtss2siVrXm|cvtpd2piMrXm|cvtsd2siVrXm",[m
[31m-"ucomissXrm||ucomisdXrm",[m
[31m-"comissXrm||comisdXrm",[m
[31m---3x[m
[31m-"wrmsr","rdtsc","rdmsr","rdpmc","sysenter","sysexit",nil,"getsec",[m
[31m-"opc3*38",nil,"opc3*3a",nil,nil,nil,nil,nil,[m
[31m---4x[m
[31m-"cmovoVrm","cmovnoVrm","cmovbVrm","cmovnbVrm",[m
[31m-"cmovzVrm","cmovnzVrm","cmovbeVrm","cmovaVrm",[m
[31m-"cmovsVrm","cmovnsVrm","cmovpeVrm","cmovpoVrm",[m
[31m-"cmovlVrm","cmovgeVrm","cmovleVrm","cmovgVrm",[m
[31m---5x[m
[31m-"movmskpsVrXm$||movmskpdVrXm$","sqrtpsXrm|sqrtssXrm|sqrtpdXrm|sqrtsdXrm",[m
[31m-"rsqrtpsXrm|rsqrtssXrvm","rcppsXrm|rcpssXrvm",[m
[31m-"andpsXrvm||andpdXrvm","andnpsXrvm||andnpdXrvm",[m
[31m-"orpsXrvm||orpdXrvm","xorpsXrvm||xorpdXrvm",[m
[31m-"addpsXrvm|addssXrvm|addpdXrvm|addsdXrvm","mulpsXrvm|mulssXrvm|mulpdXrvm|mulsdXrvm",[m
[31m-"cvtps2pdXrm|cvtss2sdXrvm|cvtpd2psXrm|cvtsd2ssXrvm",[m
[31m-"cvtdq2psXrm|cvttps2dqXrm|cvtps2dqXrm",[m
[31m-"subpsXrvm|subssXrvm|subpdXrvm|subsdXrvm","minpsXrvm|minssXrvm|minpdXrvm|minsdXrvm",[m
[31m-"divpsXrvm|divssXrvm|divpdXrvm|divsdXrvm","maxpsXrvm|maxssXrvm|maxpdXrvm|maxsdXrvm",[m
[31m---6x[m
[31m-"punpcklbwPrvm","punpcklwdPrvm","punpckldqPrvm","packsswbPrvm",[m
[31m-"pcmpgtbPrvm","pcmpgtwPrvm","pcmpgtdPrvm","packuswbPrvm",[m
[31m-"punpckhbwPrvm","punpckhwdPrvm","punpckhdqPrvm","packssdwPrvm",[m
[31m-"||punpcklqdqXrvm","||punpckhqdqXrvm",[m
[31m-"movPrVSm","movqMrm|movdquXrm|movdqaXrm",[m
[31m---7x[m
[31m-"pshufwMrmu|pshufhwXrmu|pshufdXrmu|pshuflwXrmu","pshiftw!Pvmu",[m
[31m-"pshiftd!Pvmu","pshiftq!Mvmu||pshiftdq!Xvmu",[m
[31m-"pcmpeqbPrvm","pcmpeqwPrvm","pcmpeqdPrvm","emms*|",[m
[31m-"vmreadUmr||extrqXmuu$|insertqXrmuu$","vmwriteUrm||extrqXrm$|insertqXrm$",[m
[31m-nil,nil,[m
[31m-"||haddpdXrvm|haddpsXrvm","||hsubpdXrvm|hsubpsXrvm",[m
[31m-"movVSmMr|movqXrm|movVSmXr","movqMmr|movdquXmr|movdqaXmr",[m
[31m---8x[m
[31m-"joVj","jnoVj","jbVj","jnbVj","jzVj","jnzVj","jbeVj","jaVj",[m
[31m-"jsVj","jnsVj","jpeVj","jpoVj","jlVj","jgeVj","jleVj","jgVj",[m
[31m---9x[m
[31m-"setoBm","setnoBm","setbBm","setnbBm","setzBm","setnzBm","setbeBm","setaBm",[m
[31m-"setsBm","setnsBm","setpeBm","setpoBm","setlBm","setgeBm","setleBm","setgBm",[m
[31m---Ax[m
[31m-"push fs","pop fs","cpuid","btVmr","shldVmru","shldVmrc",nil,nil,[m
[31m-"push gs","pop gs","rsm","btsVmr","shrdVmru","shrdVmrc","fxsave!Dmp","imulVrm",[m
[31m---Bx[m
[31m-"cmpxchgBmr","cmpxchgVmr","$lssVrm","btrVmr",[m
[31m-"$lfsVrm","$lgsVrm","movzxVrBmt","movzxVrWmt",[m
[31m-"|popcntVrm","ud2Dp","bt!Vmu","btcVmr",[m
[31m-"bsfVrm","bsrVrm|lzcntVrm|bsrWrm","movsxVrBmt","movsxVrWmt",[m
[31m---Cx[m
[31m-"xaddBmr","xaddVmr",[m
[31m-"cmppsXrvmu|cmpssXrvmu|cmppdXrvmu|cmpsdXrvmu","$movntiVmr|",[m
[31m-"pinsrwPrvWmu","pextrwDrPmu",[m
[31m-"shufpsXrvmu||shufpdXrvmu","$cmpxchg!Qmp",[m
[31m-"bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR",[m
[31m---Dx[m
[31m-"||addsubpdXrvm|addsubpsXrvm","psrlwPrvm","psrldPrvm","psrlqPrvm",[m
[31m-"paddqPrvm","pmullwPrvm",[m
[31m-"|movq2dqXrMm|movqXmr|movdq2qMrXm$","pmovmskbVrMm||pmovmskbVrXm",[m
[31m-"psubusbPrvm","psubuswPrvm","pminubPrvm","pandPrvm",[m
[31m-"paddusbPrvm","padduswPrvm","pmaxubPrvm","pandnPrvm",[m
[31m---Ex[m
[31m-"pavgbPrvm","psrawPrvm","psradPrvm","pavgwPrvm",[m
[31m-"pmulhuwPrvm","pmulhwPrvm",[m
[31m-"|cvtdq2pdXrm|cvttpd2dqXrm|cvtpd2dqXrm","$movntqMmr||$movntdqXmr",[m
[31m-"psubsbPrvm","psubswPrvm","pminswPrvm","porPrvm",[m
[31m-"paddsbPrvm","paddswPrvm","pmaxswPrvm","pxorPrvm",[m
[31m---Fx[m
[31m-"|||lddquXrm","psllwPrvm","pslldPrvm","psllqPrvm",[m
[31m-"pmuludqPrvm","pmaddwdPrvm","psadbwPrvm","maskmovqMrm||maskmovdquXrm$",[m
[31m-"psubbPrvm","psubwPrvm","psubdPrvm","psubqPrvm",[m
[31m-"paddbPrvm","paddwPrvm","padddPrvm","ud",[m
[31m-}[m
[31m-assert(map_opc2[255] == "ud")[m
[31m-[m
[31m--- Map for three-byte opcodes. Can't wait for their next invention.[m
[31m-local map_opc3 = {[m
[31m-["38"] = { -- [66] 0f 38 xx[m
[31m---0x[m
[31m-[0]="pshufbPrvm","phaddwPrvm","phadddPrvm","phaddswPrvm",[m
[31m-"pmaddubswPrvm","phsubwPrvm","phsubdPrvm","phsubswPrvm",[m
[31m-"psignbPrvm","psignwPrvm","psigndPrvm","pmulhrswPrvm",[m
[31m-"||permilpsXrvm","||permilpdXrvm",nil,nil,[m
[31m---1x[m
[31m-"||pblendvbXrma",nil,nil,nil,[m
[31m-"||blendvpsXrma","||blendvpdXrma","||permpsXrvm","||ptestXrm",[m
[31m-"||broadcastssXrm","||broadcastsdXrm","||broadcastf128XrlXm",nil,[m
[31m-"pabsbPrm","pabswPrm","pabsdPrm",nil,[m
[31m---2x[m
[31m-"||pmovsxbwXrm","||pmovsxbdXrm","||pmovsxbqXrm","||pmovsxwdXrm",[m
[31m-"||pmovsxwqXrm","||pmovsxdqXrm",nil,nil,[m
[31m-"||pmuldqXrvm","||pcmpeqqXrvm","||$movntdqaXrm","||packusdwXrvm",[m
[31m-"||maskmovpsXrvm","||maskmovpdXrvm","||maskmovpsXmvr","||maskmovpdXmvr",[m
[31m---3x[m
[31m-"||pmovzxbwXrm","||pmovzxbdXrm","||pmovzxbqXrm","||pmovzxwdXrm",[m
[31m-"||pmovzxwqXrm","||pmovzxdqXrm","||permdXrvm","||pcmpgtqXrvm",[m
[31m-"||pminsbXrvm","||pminsdXrvm","||pminuwXrvm","||pminudXrvm",[m
[31m-"||pmaxsbXrvm","||pmaxsdXrvm","||pmaxuwXrvm","||pmaxudXrvm",[m
[31m---4x[m
[31m-"||pmulddXrvm","||phminposuwXrm",nil,nil,[m
[31m-nil,"||psrlvVSXrvm","||psravdXrvm","||psllvVSXrvm",[m
[31m---5x[m
[31m-[0x58] = "||pbroadcastdXrlXm",[0x59] = "||pbroadcastqXrlXm",[m
[31m-[0x5a] = "||broadcasti128XrlXm",[m
[31m---7x[m
[31m-[0x78] = "||pbroadcastbXrlXm",[0x79] = "||pbroadcastwXrlXm",[m
[31m---8x[m
[31m-[0x8c] = "||pmaskmovXrvVSm",[m
[31m-[0x8e] = "||pmaskmovVSmXvr",[m
[31m---Dx[m
[31m-[0xdc] = "||aesencXrvm", [0xdd] = "||aesenclastXrvm",[m
[31m-[0xde] = "||aesdecXrvm", [0xdf] = "||aesdeclastXrvm",[m
[31m---Fx[m
[31m-[0xf0] = "|||crc32TrBmt",[0xf1] = "|||crc32TrVmt",[m
[31m-[0xf7] = "| sarxVrmv| shlxVrmv| shrxVrmv",[m
[31m-},[m
[31m-[m
[31m-["3a"] = { -- [66] 0f 3a xx[m
[31m---0x[m
[31m-[0x00]="||permqXrmu","||permpdXrmu","||pblenddXrvmu",nil,[m
[31m-"||permilpsXrmu","||permilpdXrmu","||perm2f128Xrvmu",nil,[m
[31m-"||roundpsXrmu","||roundpdXrmu","||roundssXrvmu","||roundsdXrvmu",[m
[31m-"||blendpsXrvmu","||blendpdXrvmu","||pblendwXrvmu","palignrPrvmu",[m
[31m---1x[m
[31m-nil,nil,nil,nil,[m
[31m-"||pextrbVmXru","||pextrwVmXru","||pextrVmSXru","||extractpsVmXru",[m
[31m-"||insertf128XrvlXmu","||extractf128XlXmYru",nil,nil,[m
[31m-nil,nil,nil,nil,[m
[31m---2x[m
[31m-"||pinsrbXrvVmu","||insertpsXrvmu","||pinsrXrvVmuS",nil,[m
[31m---3x[m
[31m-[0x38] = "||inserti128Xrvmu",[0x39] = "||extracti128XlXmYru",[m
[31m---4x[m
[31m-[0x40] = "||dppsXrvmu",[m
[31m-[0x41] = "||dppdXrvmu",[m
[31m-[0x42] = "||mpsadbwXrvmu",[m
[31m-[0x44] = "||pclmulqdqXrvmu",[m
[31m-[0x46] = "||perm2i128Xrvmu",[m
[31m-[0x4a] = "||blendvpsXrvmb",[0x4b] = "||blendvpdXrvmb",[m
[31m-[0x4c] = "||pblendvbXrvmb",[m
[31m---6x[m
[31m-[0x60] = "||pcmpestrmXrmu",[0x61] = "||pcmpestriXrmu",[m
[31m-[0x62] = "||pcmpistrmXrmu",[0x63] = "||pcmpistriXrmu",[m
[31m-[0xdf] = "||aeskeygenassistXrmu",[m
[31m---Fx[m
[31m-[0xf0] = "||| rorxVrmu",[m
[31m-},[m
[31m-}[m
[31m-[m
[31m--- Map for VMX/SVM opcodes 0F 01 C0-FF (sgdt group with register operands).[m
[31m-local map_opcvm = {[m
[31m-[0xc1]="vmcall",[0xc2]="vmlaunch",[0xc3]="vmresume",[0xc4]="vmxoff",[m
[31m-[0xc8]="monitor",[0xc9]="mwait",[m
[31m-[0xd8]="vmrun",[0xd9]="vmmcall",[0xda]="vmload",[0xdb]="vmsave",[m
[31m-[0xdc]="stgi",[0xdd]="clgi",[0xde]="skinit",[0xdf]="invlpga",[m
[31m-[0xf8]="swapgs",[0xf9]="rdtscp",[m
[31m-}[m
[31m-[m
[31m--- Map for FP opcodes. And you thought stack machines are simple?[m
[31m-local map_opcfp = {[m
[31m--- D8-DF 00-BF: opcodes with a memory operand.[m
[31m--- D8[m
[31m-[0]="faddFm","fmulFm","fcomFm","fcompFm","fsubFm","fsubrFm","fdivFm","fdivrFm",[m
[31m-"fldFm",nil,"fstFm","fstpFm","fldenvVm","fldcwWm","fnstenvVm","fnstcwWm",[m
[31m--- DA[m
[31m-"fiaddDm","fimulDm","ficomDm","ficompDm",[m
[31m-"fisubDm","fisubrDm","fidivDm","fidivrDm",[m
[31m--- DB[m
[31m-"fildDm","fisttpDm","fistDm","fistpDm",nil,"fld twordFmp",nil,"fstp twordFmp",[m
[31m--- DC[m
[31m-"faddGm","fmulGm","fcomGm","fcompGm","fsubGm","fsubrGm","fdivGm","fdivrGm",[m
[31m--- DD[m
[31m-"fldGm","fisttpQm","fstGm","fstpGm","frstorDmp",nil,"fnsaveDmp","fnstswWm",[m
[31m--- DE[m
[31m-"fiaddWm","fimulWm","ficomWm","ficompWm",[m
[31m-"fisubWm","fisubrWm","fidivWm","fidivrWm",[m
[31m--- DF[m
[31m-"fildWm","fisttpWm","fistWm","fistpWm",[m
[31m-"fbld twordFmp","fildQm","fbstp twordFmp","fistpQm",[m
[31m--- xx C0-FF: opcodes with a pseudo-register operand.[m
[31m--- D8[m
[31m-"faddFf","fmulFf","fcomFf","fcompFf","fsubFf","fsubrFf","fdivFf","fdivrFf",[m
[31m--- D9[m
[31m-"fldFf","fxchFf",{"fnop"},nil,[m
[31m-{"fchs","fabs",nil,nil,"ftst","fxam"},[m
[31m-{"fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz"},[m
[31m-{"f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp"},[m
[31m-{"fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos"},[m
[31m--- DA[m
[31m-"fcmovbFf","fcmoveFf","fcmovbeFf","fcmovuFf",nil,{nil,"fucompp"},nil,nil,[m
[31m--- DB[m
[31m-"fcmovnbFf","fcmovneFf","fcmovnbeFf","fcmovnuFf",[m
[31m-{nil,nil,"fnclex","fninit"},"fucomiFf","fcomiFf",nil,[m
[31m--- DC[m
[31m-"fadd toFf","fmul toFf",nil,nil,[m
[31m-"fsub toFf","fsubr toFf","fdivr toFf","fdiv toFf",[m
[31m--- DD[m
[31m-"ffreeFf",nil,"fstFf","fstpFf","fucomFf","fucompFf",nil,nil,[m
[31m--- DE[m
[31m-"faddpFf","fmulpFf",nil,{nil,"fcompp"},[m
[31m-"fsubrpFf","fsubpFf","fdivrpFf","fdivpFf",[m
[31m--- DF[m
[31m-nil,nil,nil,nil,{"fnstsw ax"},"fucomipFf","fcomipFf",nil,[m
[31m-}[m
[31m-assert(map_opcfp[126] == "fcomipFf")[m
[31m-[m
[31m--- Map for opcode groups. The subkey is sp from the ModRM byte.[m
[31m-local map_opcgroup = {[m
[31m-  arith = { "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" },[m
[31m-  shift = { "rol", "ror", "rcl", "rcr", "shl", "shr", "sal", "sar" },[m
[31m-  testb = { "testBmi", "testBmi", "not", "neg", "mul", "imul", "div", "idiv" },[m
[31m-  testv = { "testVmi", "testVmi", "not", "neg", "mul", "imul", "div", "idiv" },[m
[31m-  incb = { "inc", "dec" },[m
[31m-  incd = { "inc", "dec", "callUmp", "$call farDmp",[m
[31m-	   "jmpUmp", "$jmp farDmp", "pushUm" },[m
[31m-  sldt = { "sldt", "str", "lldt", "ltr", "verr", "verw" },[m
[31m-  sgdt = { "vm*$sgdt", "vm*$sidt", "$lgdt", "vm*$lidt",[m
[31m-	   "smsw", nil, "lmsw", "vm*$invlpg" },[m
[31m-  bt = { nil, nil, nil, nil, "bt", "bts", "btr", "btc" },[m
[31m-  cmpxchg = { nil, "sz*,cmpxchg8bQmp,cmpxchg16bXmp", nil, nil,[m
[31m-	      nil, nil, "vmptrld|vmxon|vmclear", "vmptrst" },[m
[31m-  pshiftw = { nil, nil, "psrlw", nil, "psraw", nil, "psllw" },[m
[31m-  pshiftd = { nil, nil, "psrld", nil, "psrad", nil, "pslld" },[m
[31m-  pshiftq = { nil, nil, "psrlq", nil, nil, nil, "psllq" },[m
[31m-  pshiftdq = { nil, nil, "psrlq", "psrldq", nil, nil, "psllq", "pslldq" },[m
[31m-  fxsave = { "$fxsave", "$fxrstor", "$ldmxcsr", "$stmxcsr",[m
[31m-	     nil, "lfenceDp$", "mfenceDp$", "sfenceDp$clflush" },[m
[31m-  prefetch = { "prefetch", "prefetchw" },[m
[31m-  prefetcht = { "prefetchnta", "prefetcht0", "prefetcht1", "prefetcht2" },[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Maps for register names.[m
[31m-local map_regs = {[m
[31m-  B = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",[m
[31m-	"r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" },[m
[31m-  B64 = { "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",[m
[31m-	  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" },[m
[31m-  W = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",[m
[31m-	"r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" },[m
[31m-  D = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",[m
[31m-	"r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" },[m
[31m-  Q = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",[m
[31m-	"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" },[m
[31m-  M = { "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",[m
[31m-	"mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7" }, -- No x64 ext![m
[31m-  X = { "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",[m
[31m-	"xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" },[m
[31m-  Y = { "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",[m
[31m-	"ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15" },[m
[31m-}[m
[31m-local map_segregs = { "es", "cs", "ss", "ds", "fs", "gs", "segr6", "segr7" }[m
[31m-[m
[31m--- Maps for size names.[m
[31m-local map_sz2n = {[m
[31m-  B = 1, W = 2, D = 4, Q = 8, M = 8, X = 16, Y = 32,[m
[31m-}[m
[31m-local map_sz2prefix = {[m
[31m-  B = "byte", W = "word", D = "dword",[m
[31m-  Q = "qword",[m
[31m-  M = "qword", X = "xword", Y = "yword",[m
[31m-  F = "dword", G = "qword", -- No need for sizes/register names for these two.[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Output a nicely formatted line with an opcode and operands.[m
[31m-local function putop(ctx, text, operands)[m
[31m-  local code, pos, hex = ctx.code, ctx.pos, ""[m
[31m-  local hmax = ctx.hexdump[m
[31m-  if hmax > 0 then[m
[31m-    for i=ctx.start,pos-1 do[m
[31m-      hex = hex..format("%02X", byte(code, i, i))[m
[31m-    end[m
[31m-    if #hex > hmax then hex = sub(hex, 1, hmax)..". "[m
[31m-    else hex = hex..rep(" ", hmax-#hex+2) end[m
[31m-  end[m
[31m-  if operands then text = text.." "..operands end[m
[31m-  if ctx.o16 then text = "o16 "..text; ctx.o16 = false end[m
[31m-  if ctx.a32 then text = "a32 "..text; ctx.a32 = false end[m
[31m-  if ctx.rep then text = ctx.rep.." "..text; ctx.rep = false end[m
[31m-  if ctx.rex then[m
[31m-    local t = (ctx.rexw and "w" or "")..(ctx.rexr and "r" or "")..[m
[31m-	      (ctx.rexx and "x" or "")..(ctx.rexb and "b" or "")..[m
[31m-	      (ctx.vexl and "l" or "")[m
[31m-    if ctx.vexv and ctx.vexv ~= 0 then t = t.."v"..ctx.vexv end[m
[31m-    if t ~= "" then text = ctx.rex.."."..t.." "..gsub(text, "^ ", "")[m
[31m-    elseif ctx.rex == "vex" then text = gsub("v"..text, "^v ", "") end[m
[31m-    ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false[m
[31m-    ctx.rex = false; ctx.vexl = false; ctx.vexv = false[m
[31m-  end[m
[31m-  if ctx.seg then[m
[31m-    local text2, n = gsub(text, "%[", "["..ctx.seg..":")[m
[31m-    if n == 0 then text = ctx.seg.." "..text else text = text2 end[m
[31m-    ctx.seg = false[m
[31m-  end[m
[31m-  if ctx.lock then text = "lock "..text; ctx.lock = false end[m
[31m-  local imm = ctx.imm[m
[31m-  if imm then[m
[31m-    local sym = ctx.symtab[imm][m
[31m-    if sym then text = text.."\t->"..sym end[m
[31m-  end[m
[31m-  ctx.out(format("%08x  %s%s\n", ctx.addr+ctx.start, hex, text))[m
[31m-  ctx.mrm = false[m
[31m-  ctx.vexv = false[m
[31m-  ctx.start = pos[m
[31m-  ctx.imm = nil[m
[31m-end[m
[31m-[m
[31m--- Clear all prefix flags.[m
[31m-local function clearprefixes(ctx)[m
[31m-  ctx.o16 = false; ctx.seg = false; ctx.lock = false; ctx.rep = false[m
[31m-  ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false[m
[31m-  ctx.rex = false; ctx.a32 = false; ctx.vexl = false[m
[31m-end[m
[31m-[m
[31m--- Fallback for incomplete opcodes at the end.[m
[31m-local function incomplete(ctx)[m
[31m-  ctx.pos = ctx.stop+1[m
[31m-  clearprefixes(ctx)[m
[31m-  return putop(ctx, "(incomplete)")[m
[31m-end[m
[31m-[m
[31m--- Fallback for unknown opcodes.[m
[31m-local function unknown(ctx)[m
[31m-  clearprefixes(ctx)[m
[31m-  return putop(ctx, "(unknown)")[m
[31m-end[m
[31m-[m
[31m--- Return an immediate of the specified size.[m
[31m-local function getimm(ctx, pos, n)[m
[31m-  if pos+n-1 > ctx.stop then return incomplete(ctx) end[m
[31m-  local code = ctx.code[m
[31m-  if n == 1 then[m
[31m-    local b1 = byte(code, pos, pos)[m
[31m-    return b1[m
[31m-  elseif n == 2 then[m
[31m-    local b1, b2 = byte(code, pos, pos+1)[m
[31m-    return b1+b2*256[m
[31m-  else[m
[31m-    local b1, b2, b3, b4 = byte(code, pos, pos+3)[m
[31m-    local imm = b1+b2*256+b3*65536+b4*16777216[m
[31m-    ctx.imm = imm[m
[31m-    return imm[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Process pattern string and generate the operands.[m
[31m-local function putpat(ctx, name, pat)[m
[31m-  local operands, regs, sz, mode, sp, rm, sc, rx, sdisp[m
[31m-  local code, pos, stop, vexl = ctx.code, ctx.pos, ctx.stop, ctx.vexl[m
[31m-[m
[31m-  -- Chars used: 1DFGIMPQRSTUVWXYabcdfgijlmoprstuvwxyz[m
[31m-  for p in gmatch(pat, ".") do[m
[31m-    local x = nil[m
[31m-    if p == "V" or p == "U" then[m
[31m-      if ctx.rexw then sz = "Q"; ctx.rexw = false[m
[31m-      elseif ctx.o16 then sz = "W"; ctx.o16 = false[m
[31m-      elseif p == "U" and ctx.x64 then sz = "Q"[m
[31m-      else sz = "D" end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "T" then[m
[31m-      if ctx.rexw then sz = "Q"; ctx.rexw = false else sz = "D" end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "B" then[m
[31m-      sz = "B"[m
[31m-      regs = ctx.rex and map_regs.B64 or map_regs.B[m
[31m-    elseif match(p, "[WDQMXYFG]") then[m
[31m-      sz = p[m
[31m-      if sz == "X" and vexl then sz = "Y"; ctx.vexl = false end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "P" then[m
[31m-      sz = ctx.o16 and "X" or "M"; ctx.o16 = false[m
[31m-      if sz == "X" and vexl then sz = "Y"; ctx.vexl = false end[m
[31m-      regs = map_regs[sz][m
[31m-    elseif p == "S" then[m
[31m-      name = name..lower(sz)[m
[31m-    elseif p == "s" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = imm <= 127 and format("+0x%02x", imm)[m
[31m-		     or format("-0x%02x", 256-imm)[m
[31m-      pos = pos+1[m
[31m-    elseif p == "u" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = format("0x%02x", imm)[m
[31m-      pos = pos+1[m
[31m-    elseif p == "b" then[m
[31m-      local imm = getimm(ctx, pos, 1); if not imm then return end[m
[31m-      x = regs[imm/16+1][m
[31m-      pos = pos+1[m
[31m-    elseif p == "w" then[m
[31m-      local imm = getimm(ctx, pos, 2); if not imm then return end[m
[31m-      x = format("0x%x", imm)[m
[31m-      pos = pos+2[m
[31m-    elseif p == "o" then -- [offset][m
[31m-      if ctx.x64 then[m
[31m-	local imm1 = getimm(ctx, pos, 4); if not imm1 then return end[m
[31m-	local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end[m
[31m-	x = format("[0x%08x%08x]", imm2, imm1)[m
[31m-	pos = pos+8[m
[31m-      else[m
[31m-	local imm = getimm(ctx, pos, 4); if not imm then return end[m
[31m-	x = format("[0x%08x]", imm)[m
[31m-	pos = pos+4[m
[31m-      end[m
[31m-    elseif p == "i" or p == "I" then[m
[31m-      local n = map_sz2n[sz][m
[31m-      if n == 8 and ctx.x64 and p == "I" then[m
[31m-	local imm1 = getimm(ctx, pos, 4); if not imm1 then return end[m
[31m-	local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end[m
[31m-	x = format("0x%08x%08x", imm2, imm1)[m
[31m-      else[m
[31m-	if n == 8 then n = 4 end[m
[31m-	local imm = getimm(ctx, pos, n); if not imm then return end[m
[31m-	if sz == "Q" and (imm < 0 or imm > 0x7fffffff) then[m
[31m-	  imm = (0xffffffff+1)-imm[m
[31m-	  x = format(imm > 65535 and "-0x%08x" or "-0x%x", imm)[m
[31m-	else[m
[31m-	  x = format(imm > 65535 and "0x%08x" or "0x%x", imm)[m
[31m-	end[m
[31m-      end[m
[31m-      pos = pos+n[m
[31m-    elseif p == "j" then[m
[31m-      local n = map_sz2n[sz][m
[31m-      if n == 8 then n = 4 end[m
[31m-      local imm = getimm(ctx, pos, n); if not imm then return end[m
[31m-      if sz == "B" and imm > 127 then imm = imm-256[m
[31m-      elseif imm > 2147483647 then imm = imm-4294967296 end[m
[31m-      pos = pos+n[m
[31m-      imm = imm + pos + ctx.addr[m
[31m-      if imm > 4294967295 and not ctx.x64 then imm = imm-4294967296 end[m
[31m-      ctx.imm = imm[m
[31m-      if sz == "W" then[m
[31m-	x = format("word 0x%04x", imm%65536)[m
[31m-      elseif ctx.x64 then[m
[31m-	local lo = imm % 0x1000000[m
[31m-	x = format("0x%02x%06x", (imm-lo) / 0x1000000, lo)[m
[31m-      else[m
[31m-	x = "0x"..tohex(imm)[m
[31m-      end[m
[31m-    elseif p == "R" then[m
[31m-      local r = byte(code, pos-1, pos-1)%8[m
[31m-      if ctx.rexb then r = r + 8; ctx.rexb = false end[m
[31m-      x = regs[r+1][m
[31m-    elseif p == "a" then x = regs[1][m
[31m-    elseif p == "c" then x = "cl"[m
[31m-    elseif p == "d" then x = "dx"[m
[31m-    elseif p == "1" then x = "1"[m
[31m-    else[m
[31m-      if not mode then[m
[31m-	mode = ctx.mrm[m
[31m-	if not mode then[m
[31m-	  if pos > stop then return incomplete(ctx) end[m
[31m-	  mode = byte(code, pos, pos)[m
[31m-	  pos = pos+1[m
[31m-	end[m
[31m-	rm = mode%8; mode = (mode-rm)/8[m
[31m-	sp = mode%8; mode = (mode-sp)/8[m
[31m-	sdisp = ""[m
[31m-	if mode < 3 then[m
[31m-	  if rm == 4 then[m
[31m-	    if pos > stop then return incomplete(ctx) end[m
[31m-	    sc = byte(code, pos, pos)[m
[31m-	    pos = pos+1[m
[31m-	    rm = sc%8; sc = (sc-rm)/8[m
[31m-	    rx = sc%8; sc = (sc-rx)/8[m
[31m-	    if ctx.rexx then rx = rx + 8; ctx.rexx = false end[m
[31m-	    if rx == 4 then rx = nil end[m
[31m-	  end[m
[31m-	  if mode > 0 or rm == 5 then[m
[31m-	    local dsz = mode[m
[31m-	    if dsz ~= 1 then dsz = 4 end[m
[31m-	    local disp = getimm(ctx, pos, dsz); if not disp then return end[m
[31m-	    if mode == 0 then rm = nil end[m
[31m-	    if rm or rx or (not sc and ctx.x64 and not ctx.a32) then[m
[31m-	      if dsz == 1 and disp > 127 then[m
[31m-		sdisp = format("-0x%x", 256-disp)[m
[31m-	      elseif disp >= 0 and disp <= 0x7fffffff then[m
[31m-		sdisp = format("+0x%x", disp)[m
[31m-	      else[m
[31m-		sdisp = format("-0x%x", (0xffffffff+1)-disp)[m
[31m-	      end[m
[31m-	    else[m
[31m-	      sdisp = format(ctx.x64 and not ctx.a32 and[m
[31m-		not (disp >= 0 and disp <= 0x7fffffff)[m
[31m-		and "0xffffffff%08x" or "0x%08x", disp)[m
[31m-	    end[m
[31m-	    pos = pos+dsz[m
[31m-	  end[m
[31m-	end[m
[31m-	if rm and ctx.rexb then rm = rm + 8; ctx.rexb = false end[m
[31m-	if ctx.rexr then sp = sp + 8; ctx.rexr = false end[m
[31m-      end[m
[31m-      if p == "m" then[m
[31m-	if mode == 3 then x = regs[rm+1][m
[31m-	else[m
[31m-	  local aregs = ctx.a32 and map_regs.D or ctx.aregs[m
[31m-	  local srm, srx = "", ""[m
[31m-	  if rm then srm = aregs[rm+1][m
[31m-	  elseif not sc and ctx.x64 and not ctx.a32 then srm = "rip" end[m
[31m-	  ctx.a32 = false[m
[31m-	  if rx then[m
[31m-	    if rm then srm = srm.."+" end[m
[31m-	    srx = aregs[rx+1][m
[31m-	    if sc > 0 then srx = srx.."*"..(2^sc) end[m
[31m-	  end[m
[31m-	  x = format("[%s%s%s]", srm, srx, sdisp)[m
[31m-	end[m
[31m-	if mode < 3 and[m
[31m-	   (not match(pat, "[aRrgp]") or match(pat, "t")) then -- Yuck.[m
[31m-	  x = map_sz2prefix[sz].." "..x[m
[31m-	end[m
[31m-      elseif p == "r" then x = regs[sp+1][m
[31m-      elseif p == "g" then x = map_segregs[sp+1][m
[31m-      elseif p == "p" then -- Suppress prefix.[m
[31m-      elseif p == "f" then x = "st"..rm[m
[31m-      elseif p == "x" then[m
[31m-	if sp == 0 and ctx.lock and not ctx.x64 then[m
[31m-	  x = "CR8"; ctx.lock = false[m
[31m-	else[m
[31m-	  x = "CR"..sp[m
[31m-	end[m
[31m-      elseif p == "v" then[m
[31m-	if ctx.vexv then[m
[31m-	  x = regs[ctx.vexv+1]; ctx.vexv = false[m
[31m-	end[m
[31m-      elseif p == "y" then x = "DR"..sp[m
[31m-      elseif p == "z" then x = "TR"..sp[m
[31m-      elseif p == "l" then vexl = false[m
[31m-      elseif p == "t" then[m
[31m-      else[m
[31m-	error("bad pattern `"..pat.."'")[m
[31m-      end[m
[31m-    end[m
[31m-    if x then operands = operands and operands..", "..x or x end[m
[31m-  end[m
[31m-  ctx.pos = pos[m
[31m-  return putop(ctx, name, operands)[m
[31m-end[m
[31m-[m
[31m--- Forward declaration.[m
[31m-local map_act[m
[31m-[m
[31m--- Fetch and cache MRM byte.[m
[31m-local function getmrm(ctx)[m
[31m-  local mrm = ctx.mrm[m
[31m-  if not mrm then[m
[31m-    local pos = ctx.pos[m
[31m-    if pos > ctx.stop then return nil end[m
[31m-    mrm = byte(ctx.code, pos, pos)[m
[31m-    ctx.pos = pos+1[m
[31m-    ctx.mrm = mrm[m
[31m-  end[m
[31m-  return mrm[m
[31m-end[m
[31m-[m
[31m--- Dispatch to handler depending on pattern.[m
[31m-local function dispatch(ctx, opat, patgrp)[m
[31m-  if not opat then return unknown(ctx) end[m
[31m-  if match(opat, "%|") then -- MMX/SSE variants depending on prefix.[m
[31m-    local p[m
[31m-    if ctx.rep then[m
[31m-      p = ctx.rep=="rep" and "%|([^%|]*)" or "%|[^%|]*%|[^%|]*%|([^%|]*)"[m
[31m-      ctx.rep = false[m
[31m-    elseif ctx.o16 then p = "%|[^%|]*%|([^%|]*)"; ctx.o16 = false[m
[31m-    else p = "^[^%|]*" end[m
[31m-    opat = match(opat, p)[m
[31m-    if not opat then return unknown(ctx) end[m
[31m---    ctx.rep = false; ctx.o16 = false[m
[31m-    --XXX fails for 66 f2 0f 38 f1 06  crc32 eax,WORD PTR [esi][m
[31m-    --XXX remove in branches?[m
[31m-  end[m
[31m-  if match(opat, "%$") then -- reg$mem variants.[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    opat = match(opat, mrm >= 192 and "^[^%$]*" or "%$(.*)")[m
[31m-    if opat == "" then return unknown(ctx) end[m
[31m-  end[m
[31m-  if opat == "" then return unknown(ctx) end[m
[31m-  local name, pat = match(opat, "^([a-z0-9 ]*)(.*)")[m
[31m-  if pat == "" and patgrp then pat = patgrp end[m
[31m-  return map_act[sub(pat, 1, 1)](ctx, name, pat)[m
[31m-end[m
[31m-[m
[31m--- Get a pattern from an opcode map and dispatch to handler.[m
[31m-local function dispatchmap(ctx, opcmap)[m
[31m-  local pos = ctx.pos[m
[31m-  local opat = opcmap[byte(ctx.code, pos, pos)][m
[31m-  pos = pos + 1[m
[31m-  ctx.pos = pos[m
[31m-  return dispatch(ctx, opat)[m
[31m-end[m
[31m-[m
[31m--- Map for action codes. The key is the first char after the name.[m
[31m-map_act = {[m
[31m-  -- Simple opcodes without operands.[m
[31m-  [""] = function(ctx, name, pat)[m
[31m-    return putop(ctx, name)[m
[31m-  end,[m
[31m-[m
[31m-  -- Operand size chars fall right through.[m
[31m-  B = putpat, W = putpat, D = putpat, Q = putpat,[m
[31m-  V = putpat, U = putpat, T = putpat,[m
[31m-  M = putpat, X = putpat, P = putpat,[m
[31m-  F = putpat, G = putpat, Y = putpat,[m
[31m-[m
[31m-  -- Collect prefixes.[m
[31m-  [":"] = function(ctx, name, pat)[m
[31m-    ctx[pat == ":" and name or sub(pat, 2)] = name[m
[31m-    if ctx.pos - ctx.start > 5 then return unknown(ctx) end -- Limit #prefixes.[m
[31m-  end,[m
[31m-[m
[31m-  -- Chain to special handler specified by name.[m
[31m-  ["*"] = function(ctx, name, pat)[m
[31m-    return map_act[name](ctx, name, sub(pat, 2))[m
[31m-  end,[m
[31m-[m
[31m-  -- Use named subtable for opcode group.[m
[31m-  ["!"] = function(ctx, name, pat)[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    return dispatch(ctx, map_opcgroup[name][((mrm-(mrm%8))/8)%8+1], sub(pat, 2))[m
[31m-  end,[m
[31m-[m
[31m-  -- o16,o32[,o64] variants.[m
[31m-  sz = function(ctx, name, pat)[m
[31m-    if ctx.o16 then ctx.o16 = false[m
[31m-    else[m
[31m-      pat = match(pat, ",(.*)")[m
[31m-      if ctx.rexw then[m
[31m-	local p = match(pat, ",(.*)")[m
[31m-	if p then pat = p; ctx.rexw = false end[m
[31m-      end[m
[31m-    end[m
[31m-    pat = match(pat, "^[^,]*")[m
[31m-    return dispatch(ctx, pat)[m
[31m-  end,[m
[31m-[m
[31m-  -- Two-byte opcode dispatch.[m
[31m-  opc2 = function(ctx, name, pat)[m
[31m-    return dispatchmap(ctx, map_opc2)[m
[31m-  end,[m
[31m-[m
[31m-  -- Three-byte opcode dispatch.[m
[31m-  opc3 = function(ctx, name, pat)[m
[31m-    return dispatchmap(ctx, map_opc3[pat])[m
[31m-  end,[m
[31m-[m
[31m-  -- VMX/SVM dispatch.[m
[31m-  vm = function(ctx, name, pat)[m
[31m-    return dispatch(ctx, map_opcvm[ctx.mrm])[m
[31m-  end,[m
[31m-[m
[31m-  -- Floating point opcode dispatch.[m
[31m-  fp = function(ctx, name, pat)[m
[31m-    local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end[m
[31m-    local rm = mrm%8[m
[31m-    local idx = pat*8 + ((mrm-rm)/8)%8[m
[31m-    if mrm >= 192 then idx = idx + 64 end[m
[31m-    local opat = map_opcfp[idx][m
[31m-    if type(opat) == "table" then opat = opat[rm+1] end[m
[31m-    return dispatch(ctx, opat)[m
[31m-  end,[m
[31m-[m
[31m-  -- REX prefix.[m
[31m-  rex = function(ctx, name, pat)[m
[31m-    if ctx.rex then return unknown(ctx) end -- Only 1 REX or VEX prefix allowed.[m
[31m-    for p in gmatch(pat, ".") do ctx["rex"..p] = true end[m
[31m-    ctx.rex = "rex"[m
[31m-  end,[m
[31m-[m
[31m-  -- VEX prefix.[m
[31m-  vex = function(ctx, name, pat)[m
[31m-    if ctx.rex then return unknown(ctx) end -- Only 1 REX or VEX prefix allowed.[m
[31m-    ctx.rex = "vex"[m
[31m-    local pos = ctx.pos[m
[31m-    if ctx.mrm then[m
[31m-      ctx.mrm = nil[m
[31m-      pos = pos-1[m
[31m-    end[m
[31m-    local b = byte(ctx.code, pos, pos)[m
[31m-    if not b then return incomplete(ctx) end[m
[31m-    pos = pos+1[m
[31m-    if b < 128 then ctx.rexr = true end[m
[31m-    local m = 1[m
[31m-    if pat == "3" then[m
[31m-      m = b%32; b = (b-m)/32[m
[31m-      local nb = b%2; b = (b-nb)/2[m
[31m-      if nb == 0 then ctx.rexb = true end[m
[31m-      local nx = b%2; b = (b-nx)/2[m
[31m-      if nx == 0 then ctx.rexx = true end[m
[31m-      b = byte(ctx.code, pos, pos)[m
[31m-      if not b then return incomplete(ctx) end[m
[31m-      pos = pos+1[m
[31m-      if b >= 128 then ctx.rexw = true end[m
[31m-    end[m
[31m-    ctx.pos = pos[m
[31m-    local map[m
[31m-    if m == 1 then map = map_opc2[m
[31m-    elseif m == 2 then map = map_opc3["38"][m
[31m-    elseif m == 3 then map = map_opc3["3a"][m
[31m-    else return unknown(ctx) end[m
[31m-    local p = b%4; b = (b-p)/4[m
[31m-    if p == 1 then ctx.o16 = "o16"[m
[31m-    elseif p == 2 then ctx.rep = "rep"[m
[31m-    elseif p == 3 then ctx.rep = "repne" end[m
[31m-    local l = b%2; b = (b-l)/2[m
[31m-    if l ~= 0 then ctx.vexl = true end[m
[31m-    ctx.vexv = (-1-b)%16[m
[31m-    return dispatchmap(ctx, map)[m
[31m-  end,[m
[31m-[m
[31m-  -- Special case for nop with REX prefix.[m
[31m-  nop = function(ctx, name, pat)[m
[31m-    return dispatch(ctx, ctx.rex and pat or "nop")[m
[31m-  end,[m
[31m-[m
[31m-  -- Special case for 0F 77.[m
[31m-  emms = function(ctx, name, pat)[m
[31m-    if ctx.rex ~= "vex" then[m
[31m-      return putop(ctx, "emms")[m
[31m-    elseif ctx.vexl then[m
[31m-      ctx.vexl = false[m
[31m-      return putop(ctx, "zeroall")[m
[31m-    else[m
[31m-      return putop(ctx, "zeroupper")[m
[31m-    end[m
[31m-  end,[m
[31m-}[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Disassemble a block of code.[m
[31m-local function disass_block(ctx, ofs, len)[m
[31m-  if not ofs then ofs = 0 end[m
[31m-  local stop = len and ofs+len or #ctx.code[m
[31m-  ofs = ofs + 1[m
[31m-  ctx.start = ofs[m
[31m-  ctx.pos = ofs[m
[31m-  ctx.stop = stop[m
[31m-  ctx.imm = nil[m
[31m-  ctx.mrm = false[m
[31m-  clearprefixes(ctx)[m
[31m-  while ctx.pos <= stop do dispatchmap(ctx, ctx.map1) end[m
[31m-  if ctx.pos ~= ctx.start then incomplete(ctx) end[m
[31m-end[m
[31m-[m
[31m--- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).[m
[31m-local function create(code, addr, out)[m
[31m-  local ctx = {}[m
[31m-  ctx.code = code[m
[31m-  ctx.addr = (addr or 0) - 1[m
[31m-  ctx.out = out or io.write[m
[31m-  ctx.symtab = {}[m
[31m-  ctx.disass = disass_block[m
[31m-  ctx.hexdump = 16[m
[31m-  ctx.x64 = false[m
[31m-  ctx.map1 = map_opc1_32[m
[31m-  ctx.aregs = map_regs.D[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m-local function create64(code, addr, out)[m
[31m-  local ctx = create(code, addr, out)[m
[31m-  ctx.x64 = true[m
[31m-  ctx.map1 = map_opc1_64[m
[31m-  ctx.aregs = map_regs.Q[m
[31m-  return ctx[m
[31m-end[m
[31m-[m
[31m--- Simple API: disassemble code (a string) at address and output via out.[m
[31m-local function disass(code, addr, out)[m
[31m-  create(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m-local function disass64(code, addr, out)[m
[31m-  create64(code, addr, out):disass()[m
[31m-end[m
[31m-[m
[31m--- Return register name for RID.[m
[31m-local function regname(r)[m
[31m-  if r < 8 then return map_regs.D[r+1] end[m
[31m-  return map_regs.X[r-7][m
[31m-end[m
[31m-[m
[31m-local function regname64(r)[m
[31m-  if r < 16 then return map_regs.Q[r+1] end[m
[31m-  return map_regs.X[r-15][m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  create = create,[m
[31m-  create64 = create64,[m
[31m-  disass = disass,[m
[31m-  disass64 = disass64,[m
[31m-  regname = regname,[m
[31m-  regname64 = regname64[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dump.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dump.lua[m
[1mdeleted file mode 100644[m
[1mindex 6531c6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/dump.lua[m
[1m+++ /dev/null[m
[36m@@ -1,710 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT compiler dump module.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module can be used to debug the JIT compiler itself. It dumps the[m
[31m--- code representations and structures used in various compiler stages.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jdump -e "local x=0; for i=1,1e6 do x=x+i end; print(x)"[m
[31m---   luajit -jdump=im -e "for i=1,1000 do for j=1,1000 do end end" | less -R[m
[31m---   luajit -jdump=is myapp.lua | less -R[m
[31m---   luajit -jdump=-b myapp.lua[m
[31m---   luajit -jdump=+aH,myapp.html myapp.lua[m
[31m---   luajit -jdump=ixT,myapp.dump myapp.lua[m
[31m---[m
[31m--- The first argument specifies the dump mode. The second argument gives[m
[31m--- the output file name. Default output is to stdout, unless the environment[m
[31m--- variable LUAJIT_DUMPFILE is set. The file is overwritten every time the[m
[31m--- module is started.[m
[31m---[m
[31m--- Different features can be turned on or off with the dump mode. If the[m
[31m--- mode starts with a '+', the following features are added to the default[m
[31m--- set of features; a '-' removes them. Otherwise the features are replaced.[m
[31m---[m
[31m--- The following dump features are available (* marks the default):[m
[31m---[m
[31m---  * t  Print a line for each started, ended or aborted trace (see also -jv).[m
[31m---  * b  Dump the traced bytecode.[m
[31m---  * i  Dump the IR (intermediate representation).[m
[31m---    r  Augment the IR with register/stack slots.[m
[31m---    s  Dump the snapshot map.[m
[31m---  * m  Dump the generated machine code.[m
[31m---    x  Print each taken trace exit.[m
[31m---    X  Print each taken trace exit and the contents of all registers.[m
[31m---    a  Print the IR of aborted traces, too.[m
[31m---[m
[31m--- The output format can be set with the following characters:[m
[31m---[m
[31m---    T  Plain text output.[m
[31m---    A  ANSI-colored text output[m
[31m---    H  Colorized HTML + CSS output.[m
[31m---[m
[31m--- The default output format is plain text. It's set to ANSI-colored text[m
[31m--- if the COLORTERM variable is set. Note: this is independent of any output[m
[31m--- redirection, which is actually considered a feature.[m
[31m---[m
[31m--- You probably want to use less -R to enjoy viewing ANSI-colored text from[m
[31m--- a pipe or a file. Add this to your ~/.bashrc: export LESS="-R"[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local funcinfo, funcbc = jutil.funcinfo, jutil.funcbc[m
[31m-local traceinfo, traceir, tracek = jutil.traceinfo, jutil.traceir, jutil.tracek[m
[31m-local tracemc, tracesnap = jutil.tracemc, jutil.tracesnap[m
[31m-local traceexitstub, ircalladdr = jutil.traceexitstub, jutil.ircalladdr[m
[31m-local bit = require("bit")[m
[31m-local band, shl, shr, tohex = bit.band, bit.lshift, bit.rshift, bit.tohex[m
[31m-local sub, gsub, format = string.sub, string.gsub, string.format[m
[31m-local byte, char, rep = string.byte, string.char, string.rep[m
[31m-local type, tostring = type, tostring[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m--- Load other modules on-demand.[m
[31m-local bcline, disass[m
[31m-[m
[31m--- Active flag, output file handle and dump mode.[m
[31m-local active, out, dumpmode[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local symtabmt = { __index = false }[m
[31m-local symtab = {}[m
[31m-local nexitsym = 0[m
[31m-[m
[31m--- Fill nested symbol table with per-trace exit stub addresses.[m
[31m-local function fillsymtab_tr(tr, nexit)[m
[31m-  local t = {}[m
[31m-  symtabmt.__index = t[m
[31m-  if jit.arch == "mips" or jit.arch == "mipsel" then[m
[31m-    t[traceexitstub(tr, 0)] = "exit"[m
[31m-    return[m
[31m-  end[m
[31m-  for i=0,nexit-1 do[m
[31m-    local addr = traceexitstub(tr, i)[m
[31m-    if addr < 0 then addr = addr + 2^32 end[m
[31m-    t[addr] = tostring(i)[m
[31m-  end[m
[31m-  local addr = traceexitstub(tr, nexit)[m
[31m-  if addr then t[addr] = "stack_check" end[m
[31m-end[m
[31m-[m
[31m--- Fill symbol table with trace exit stub addresses.[m
[31m-local function fillsymtab(tr, nexit)[m
[31m-  local t = symtab[m
[31m-  if nexitsym == 0 then[m
[31m-    local ircall = vmdef.ircall[m
[31m-    for i=0,#ircall do[m
[31m-      local addr = ircalladdr(i)[m
[31m-      if addr ~= 0 then[m
[31m-	if addr < 0 then addr = addr + 2^32 end[m
[31m-	t[addr] = ircall[i][m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-  if nexitsym == 1000000 then -- Per-trace exit stubs.[m
[31m-    fillsymtab_tr(tr, nexit)[m
[31m-  elseif nexit > nexitsym then -- Shared exit stubs.[m
[31m-    for i=nexitsym,nexit-1 do[m
[31m-      local addr = traceexitstub(i)[m
[31m-      if addr == nil then -- Fall back to per-trace exit stubs.[m
[31m-	fillsymtab_tr(tr, nexit)[m
[31m-	setmetatable(symtab, symtabmt)[m
[31m-	nexit = 1000000[m
[31m-	break[m
[31m-      end[m
[31m-      if addr < 0 then addr = addr + 2^32 end[m
[31m-      t[addr] = tostring(i)[m
[31m-    end[m
[31m-    nexitsym = nexit[m
[31m-  end[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m-local function dumpwrite(s)[m
[31m-  out:write(s)[m
[31m-end[m
[31m-[m
[31m--- Disassemble machine code.[m
[31m-local function dump_mcode(tr)[m
[31m-  local info = traceinfo(tr)[m
[31m-  if not info then return end[m
[31m-  local mcode, addr, loop = tracemc(tr)[m
[31m-  if not mcode then return end[m
[31m-  if not disass then disass = require("jit.dis_"..jit.arch) end[m
[31m-  if addr < 0 then addr = addr + 2^32 end[m
[31m-  out:write("---- TRACE ", tr, " mcode ", #mcode, "\n")[m
[31m-  local ctx = disass.create(mcode, addr, dumpwrite)[m
[31m-  ctx.hexdump = 0[m
[31m-  ctx.symtab = fillsymtab(tr, info.nexit)[m
[31m-  if loop ~= 0 then[m
[31m-    symtab[addr+loop] = "LOOP"[m
[31m-    ctx:disass(0, loop)[m
[31m-    out:write("->LOOP:\n")[m
[31m-    ctx:disass(loop, #mcode-loop)[m
[31m-    symtab[addr+loop] = nil[m
[31m-  else[m
[31m-    ctx:disass(0, #mcode)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local irtype_text = {[m
[31m-  [0] = "nil",[m
[31m-  "fal",[m
[31m-  "tru",[m
[31m-  "lud",[m
[31m-  "str",[m
[31m-  "p32",[m
[31m-  "thr",[m
[31m-  "pro",[m
[31m-  "fun",[m
[31m-  "p64",[m
[31m-  "cdt",[m
[31m-  "tab",[m
[31m-  "udt",[m
[31m-  "flt",[m
[31m-  "num",[m
[31m-  "i8 ",[m
[31m-  "u8 ",[m
[31m-  "i16",[m
[31m-  "u16",[m
[31m-  "int",[m
[31m-  "u32",[m
[31m-  "i64",[m
[31m-  "u64",[m
[31m-  "sfp",[m
[31m-}[m
[31m-[m
[31m-local colortype_ansi = {[m
[31m-  [0] = "%s",[m
[31m-  "%s",[m
[31m-  "%s",[m
[31m-  "\027[36m%s\027[m",[m
[31m-  "\027[32m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[1m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[1m%s\027[m",[m
[31m-  "%s",[m
[31m-  "\027[33m%s\027[m",[m
[31m-  "\027[31m%s\027[m",[m
[31m-  "\027[36m%s\027[m",[m
[31m-  "\027[34m%s\027[m",[m
[31m-  "\027[34m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-  "\027[35m%s\027[m",[m
[31m-}[m
[31m-[m
[31m-local function colorize_text(s, t)[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-local function colorize_ansi(s, t)[m
[31m-  return format(colortype_ansi[t], s)[m
[31m-end[m
[31m-[m
[31m-local irtype_ansi = setmetatable({},[m
[31m-  { __index = function(tab, t)[m
[31m-      local s = colorize_ansi(irtype_text[t], t); tab[t] = s; return s; end })[m
[31m-[m
[31m-local html_escape = { ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;", }[m
[31m-[m
[31m-local function colorize_html(s, t)[m
[31m-  s = gsub(s, "[<>&]", html_escape)[m
[31m-  return format('<span class="irt_%s">%s</span>', irtype_text[t], s)[m
[31m-end[m
[31m-[m
[31m-local irtype_html = setmetatable({},[m
[31m-  { __index = function(tab, t)[m
[31m-      local s = colorize_html(irtype_text[t], t); tab[t] = s; return s; end })[m
[31m-[m
[31m-local header_html = [[[m
[31m-<style type="text/css">[m
[31m-background { background: #ffffff; color: #000000; }[m
[31m-pre.ljdump {[m
[31m-font-size: 10pt;[m
[31m-background: #f0f4ff;[m
[31m-color: #000000;[m
[31m-border: 1px solid #bfcfff;[m
[31m-padding: 0.5em;[m
[31m-margin-left: 2em;[m
[31m-margin-right: 2em;[m
[31m-}[m
[31m-span.irt_str { color: #00a000; }[m
[31m-span.irt_thr, span.irt_fun { color: #404040; font-weight: bold; }[m
[31m-span.irt_tab { color: #c00000; }[m
[31m-span.irt_udt, span.irt_lud { color: #00c0c0; }[m
[31m-span.irt_num { color: #4040c0; }[m
[31m-span.irt_int, span.irt_i8, span.irt_u8, span.irt_i16, span.irt_u16 { color: #b040b0; }[m
[31m-</style>[m
[31m-]][m
[31m-[m
[31m-local colorize, irtype[m
[31m-[m
[31m--- Lookup tables to convert some literals into names.[m
[31m-local litname = {[m
[31m-  ["SLOAD "] = setmetatable({}, { __index = function(t, mode)[m
[31m-    local s = ""[m
[31m-    if band(mode, 1) ~= 0 then s = s.."P" end[m
[31m-    if band(mode, 2) ~= 0 then s = s.."F" end[m
[31m-    if band(mode, 4) ~= 0 then s = s.."T" end[m
[31m-    if band(mode, 8) ~= 0 then s = s.."C" end[m
[31m-    if band(mode, 16) ~= 0 then s = s.."R" end[m
[31m-    if band(mode, 32) ~= 0 then s = s.."I" end[m
[31m-    t[mode] = s[m
[31m-    return s[m
[31m-  end}),[m
[31m-  ["XLOAD "] = { [0] = "", "R", "V", "RV", "U", "RU", "VU", "RVU", },[m
[31m-  ["CONV  "] = setmetatable({}, { __index = function(t, mode)[m
[31m-    local s = irtype[band(mode, 31)][m
[31m-    s = irtype[band(shr(mode, 5), 31)].."."..s[m
[31m-    if band(mode, 0x800) ~= 0 then s = s.." sext" end[m
[31m-    local c = shr(mode, 14)[m
[31m-    if c == 2 then s = s.." index" elseif c == 3 then s = s.." check" end[m
[31m-    t[mode] = s[m
[31m-    return s[m
[31m-  end}),[m
[31m-  ["FLOAD "] = vmdef.irfield,[m
[31m-  ["FREF  "] = vmdef.irfield,[m
[31m-  ["FPMATH"] = vmdef.irfpm,[m
[31m-  ["BUFHDR"] = { [0] = "RESET", "APPEND" },[m
[31m-  ["TOSTR "] = { [0] = "INT", "NUM", "CHAR" },[m
[31m-}[m
[31m-[m
[31m-local function ctlsub(c)[m
[31m-  if c == "\n" then return "\\n"[m
[31m-  elseif c == "\r" then return "\\r"[m
[31m-  elseif c == "\t" then return "\\t"[m
[31m-  else return format("\\%03d", byte(c))[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function fmtfunc(func, pc)[m
[31m-  local fi = funcinfo(func, pc)[m
[31m-  if fi.loc then[m
[31m-    return fi.loc[m
[31m-  elseif fi.ffid then[m
[31m-    return vmdef.ffnames[fi.ffid][m
[31m-  elseif fi.addr then[m
[31m-    return format("C:%x", fi.addr)[m
[31m-  else[m
[31m-    return "(?)"[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-local function formatk(tr, idx)[m
[31m-  local k, t, slot = tracek(tr, idx)[m
[31m-  local tn = type(k)[m
[31m-  local s[m
[31m-  if tn == "number" then[m
[31m-    if k == 2^52+2^51 then[m
[31m-      s = "bias"[m
[31m-    else[m
[31m-      s = format("%+.14g", k)[m
[31m-    end[m
[31m-  elseif tn == "string" then[m
[31m-    s = format(#k > 20 and '"%.20s"~' or '"%s"', gsub(k, "%c", ctlsub))[m
[31m-  elseif tn == "function" then[m
[31m-    s = fmtfunc(k)[m
[31m-  elseif tn == "table" then[m
[31m-    s = format("{%p}", k)[m
[31m-  elseif tn == "userdata" then[m
[31m-    if t == 12 then[m
[31m-      s = format("userdata:%p", k)[m
[31m-    else[m
[31m-      s = format("[%p]", k)[m
[31m-      if s == "[NULL]" then s = "NULL" end[m
[31m-    end[m
[31m-  elseif t == 21 then -- int64_t[m
[31m-    s = sub(tostring(k), 1, -3)[m
[31m-    if sub(s, 1, 1) ~= "-" then s = "+"..s end[m
[31m-  else[m
[31m-    s = tostring(k) -- For primitives.[m
[31m-  end[m
[31m-  s = colorize(format("%-4s", s), t)[m
[31m-  if slot then[m
[31m-    s = format("%s @%d", s, slot)[m
[31m-  end[m
[31m-  return s[m
[31m-end[m
[31m-[m
[31m-local function printsnap(tr, snap)[m
[31m-  local n = 2[m
[31m-  for s=0,snap[1]-1 do[m
[31m-    local sn = snap[n][m
[31m-    if shr(sn, 24) == s then[m
[31m-      n = n + 1[m
[31m-      local ref = band(sn, 0xffff) - 0x8000 -- REF_BIAS[m
[31m-      if ref < 0 then[m
[31m-	out:write(formatk(tr, ref))[m
[31m-      elseif band(sn, 0x80000) ~= 0 then -- SNAP_SOFTFPNUM[m
[31m-	out:write(colorize(format("%04d/%04d", ref, ref+1), 14))[m
[31m-      else[m
[31m-	local m, ot, op1, op2 = traceir(tr, ref)[m
[31m-	out:write(colorize(format("%04d", ref), band(ot, 31)))[m
[31m-      end[m
[31m-      out:write(band(sn, 0x10000) == 0 and " " or "|") -- SNAP_FRAME[m
[31m-    else[m
[31m-      out:write("---- ")[m
[31m-    end[m
[31m-  end[m
[31m-  out:write("]\n")[m
[31m-end[m
[31m-[m
[31m--- Dump snapshots (not interleaved with IR).[m
[31m-local function dump_snap(tr)[m
[31m-  out:write("---- TRACE ", tr, " snapshots\n")[m
[31m-  for i=0,1000000000 do[m
[31m-    local snap = tracesnap(tr, i)[m
[31m-    if not snap then break end[m
[31m-    out:write(format("#%-3d %04d [ ", i, snap[0]))[m
[31m-    printsnap(tr, snap)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Return a register name or stack slot for a rid/sp location.[m
[31m-local function ridsp_name(ridsp, ins)[m
[31m-  if not disass then disass = require("jit.dis_"..jit.arch) end[m
[31m-  local rid, slot = band(ridsp, 0xff), shr(ridsp, 8)[m
[31m-  if rid == 253 or rid == 254 then[m
[31m-    return (slot == 0 or slot == 255) and " {sink" or format(" {%04d", ins-slot)[m
[31m-  end[m
[31m-  if ridsp > 255 then return format("[%x]", slot*4) end[m
[31m-  if rid < 128 then return disass.regname(rid) end[m
[31m-  return ""[m
[31m-end[m
[31m-[m
[31m--- Dump CALL* function ref and return optional ctype.[m
[31m-local function dumpcallfunc(tr, ins)[m
[31m-  local ctype[m
[31m-  if ins > 0 then[m
[31m-    local m, ot, op1, op2 = traceir(tr, ins)[m
[31m-    if band(ot, 31) == 0 then -- nil type means CARG(func, ctype).[m
[31m-      ins = op1[m
[31m-      ctype = formatk(tr, op2)[m
[31m-    end[m
[31m-  end[m
[31m-  if ins < 0 then[m
[31m-    out:write(format("[0x%x](", tonumber((tracek(tr, ins)))))[m
[31m-  else[m
[31m-    out:write(format("%04d (", ins))[m
[31m-  end[m
[31m-  return ctype[m
[31m-end[m
[31m-[m
[31m--- Recursively gather CALL* args and dump them.[m
[31m-local function dumpcallargs(tr, ins)[m
[31m-  if ins < 0 then[m
[31m-    out:write(formatk(tr, ins))[m
[31m-  else[m
[31m-    local m, ot, op1, op2 = traceir(tr, ins)[m
[31m-    local oidx = 6*shr(ot, 8)[m
[31m-    local op = sub(vmdef.irnames, oidx+1, oidx+6)[m
[31m-    if op == "CARG  " then[m
[31m-      dumpcallargs(tr, op1)[m
[31m-      if op2 < 0 then[m
[31m-	out:write(" ", formatk(tr, op2))[m
[31m-      else[m
[31m-	out:write(" ", format("%04d", op2))[m
[31m-      end[m
[31m-    else[m
[31m-      out:write(format("%04d", ins))[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Dump IR and interleaved snapshots.[m
[31m-local function dump_ir(tr, dumpsnap, dumpreg)[m
[31m-  local info = traceinfo(tr)[m
[31m-  if not info then return end[m
[31m-  local nins = info.nins[m
[31m-  out:write("---- TRACE ", tr, " IR\n")[m
[31m-  local irnames = vmdef.irnames[m
[31m-  local snapref = 65536[m
[31m-  local snap, snapno[m
[31m-  if dumpsnap then[m
[31m-    snap = tracesnap(tr, 0)[m
[31m-    snapref = snap[0][m
[31m-    snapno = 0[m
[31m-  end[m
[31m-  for ins=1,nins do[m
[31m-    if ins >= snapref then[m
[31m-      if dumpreg then[m
[31m-	out:write(format("....              SNAP   #%-3d [ ", snapno))[m
[31m-      else[m
[31m-	out:write(format("....        SNAP   #%-3d [ ", snapno))[m
[31m-      end[m
[31m-      printsnap(tr, snap)[m
[31m-      snapno = snapno + 1[m
[31m-      snap = tracesnap(tr, snapno)[m
[31m-      snapref = snap and snap[0] or 65536[m
[31m-    end[m
[31m-    local m, ot, op1, op2, ridsp = traceir(tr, ins)[m
[31m-    local oidx, t = 6*shr(ot, 8), band(ot, 31)[m
[31m-    local op = sub(irnames, oidx+1, oidx+6)[m
[31m-    if op == "LOOP  " then[m
[31m-      if dumpreg then[m
[31m-	out:write(format("%04d ------------ LOOP ------------\n", ins))[m
[31m-      else[m
[31m-	out:write(format("%04d ------ LOOP ------------\n", ins))[m
[31m-      end[m
[31m-    elseif op ~= "NOP   " and op ~= "CARG  " and[m
[31m-	   (dumpreg or op ~= "RENAME") then[m
[31m-      local rid = band(ridsp, 255)[m
[31m-      if dumpreg then[m
[31m-	out:write(format("%04d %-6s", ins, ridsp_name(ridsp, ins)))[m
[31m-      else[m
[31m-	out:write(format("%04d ", ins))[m
[31m-      end[m
[31m-      out:write(format("%s%s %s %s ",[m
[31m-		       (rid == 254 or rid == 253) and "}" or[m
[31m-		       (band(ot, 128) == 0 and " " or ">"),[m
[31m-		       band(ot, 64) == 0 and " " or "+",[m
[31m-		       irtype[t], op))[m
[31m-      local m1, m2 = band(m, 3), band(m, 3*4)[m
[31m-      if sub(op, 1, 4) == "CALL" then[m
[31m-	local ctype[m
[31m-	if m2 == 1*4 then -- op2 == IRMlit[m
[31m-	  out:write(format("%-10s  (", vmdef.ircall[op2]))[m
[31m-	else[m
[31m-	  ctype = dumpcallfunc(tr, op2)[m
[31m-	end[m
[31m-	if op1 ~= -1 then dumpcallargs(tr, op1) end[m
[31m-	out:write(")")[m
[31m-	if ctype then out:write(" ctype ", ctype) end[m
[31m-      elseif op == "CNEW  " and op2 == -1 then[m
[31m-	out:write(formatk(tr, op1))[m
[31m-      elseif m1 ~= 3 then -- op1 != IRMnone[m
[31m-	if op1 < 0 then[m
[31m-	  out:write(formatk(tr, op1))[m
[31m-	else[m
[31m-	  out:write(format(m1 == 0 and "%04d" or "#%-3d", op1))[m
[31m-	end[m
[31m-	if m2 ~= 3*4 then -- op2 != IRMnone[m
[31m-	  if m2 == 1*4 then -- op2 == IRMlit[m
[31m-	    local litn = litname[op][m
[31m-	    if litn and litn[op2] then[m
[31m-	      out:write("  ", litn[op2])[m
[31m-	    elseif op == "UREFO " or op == "UREFC " then[m
[31m-	      out:write(format("  #%-3d", shr(op2, 8)))[m
[31m-	    else[m
[31m-	      out:write(format("  #%-3d", op2))[m
[31m-	    end[m
[31m-	  elseif op2 < 0 then[m
[31m-	    out:write("  ", formatk(tr, op2))[m
[31m-	  else[m
[31m-	    out:write(format("  %04d", op2))[m
[31m-	  end[m
[31m-	end[m
[31m-      end[m
[31m-      out:write("\n")[m
[31m-    end[m
[31m-  end[m
[31m-  if snap then[m
[31m-    if dumpreg then[m
[31m-      out:write(format("....              SNAP   #%-3d [ ", snapno))[m
[31m-    else[m
[31m-      out:write(format("....        SNAP   #%-3d [ ", snapno))[m
[31m-    end[m
[31m-    printsnap(tr, snap)[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local recprefix = ""[m
[31m-local recdepth = 0[m
[31m-[m
[31m--- Format trace error message.[m
[31m-local function fmterr(err, info)[m
[31m-  if type(err) == "number" then[m
[31m-    if type(info) == "function" then info = fmtfunc(info) end[m
[31m-    err = format(vmdef.traceerr[err], info)[m
[31m-  end[m
[31m-  return err[m
[31m-end[m
[31m-[m
[31m--- Dump trace states.[m
[31m-local function dump_trace(what, tr, func, pc, otr, oex)[m
[31m-  if what == "stop" or (what == "abort" and dumpmode.a) then[m
[31m-    if dumpmode.i then dump_ir(tr, dumpmode.s, dumpmode.r and what == "stop")[m
[31m-    elseif dumpmode.s then dump_snap(tr) end[m
[31m-    if dumpmode.m then dump_mcode(tr) end[m
[31m-  end[m
[31m-  if what == "start" then[m
[31m-    if dumpmode.H then out:write('<pre class="ljdump">\n') end[m
[31m-    out:write("---- TRACE ", tr, " ", what)[m
[31m-    if otr then out:write(" ", otr, "/", oex) end[m
[31m-    out:write(" ", fmtfunc(func, pc), "\n")[m
[31m-  elseif what == "stop" or what == "abort" then[m
[31m-    out:write("---- TRACE ", tr, " ", what)[m
[31m-    if what == "abort" then[m
[31m-      out:write(" ", fmtfunc(func, pc), " -- ", fmterr(otr, oex), "\n")[m
[31m-    else[m
[31m-      local info = traceinfo(tr)[m
[31m-      local link, ltype = info.link, info.linktype[m
[31m-      if link == tr or link == 0 then[m
[31m-	out:write(" -> ", ltype, "\n")[m
[31m-      elseif ltype == "root" then[m
[31m-	out:write(" -> ", link, "\n")[m
[31m-      else[m
[31m-	out:write(" -> ", link, " ", ltype, "\n")[m
[31m-      end[m
[31m-    end[m
[31m-    if dumpmode.H then out:write("</pre>\n\n") else out:write("\n") end[m
[31m-  else[m
[31m-    if what == "flush" then symtab, nexitsym = {}, 0 end[m
[31m-    out:write("---- TRACE ", what, "\n\n")[m
[31m-  end[m
[31m-  out:flush()[m
[31m-end[m
[31m-[m
[31m--- Dump recorded bytecode.[m
[31m-local function dump_record(tr, func, pc, depth, callee)[m
[31m-  if depth ~= recdepth then[m
[31m-    recdepth = depth[m
[31m-    recprefix = rep(" .", depth)[m
[31m-  end[m
[31m-  local line[m
[31m-  if pc >= 0 then[m
[31m-    line = bcline(func, pc, recprefix)[m
[31m-    if dumpmode.H then line = gsub(line, "[<>&]", html_escape) end[m
[31m-    if pc > 0 then[m
[31m-      line = sub(line, 1, -2) .. "       (" .. fmtfunc(func, pc) .. ")\n"[m
[31m-    end[m
[31m-  else[m
[31m-    line = "0000 "..recprefix.." FUNCC      \n"[m
[31m-    callee = func[m
[31m-  end[m
[31m-  if pc <= 0 then[m
[31m-    out:write(sub(line, 1, -2), "         ; ", fmtfunc(func), "\n")[m
[31m-  else[m
[31m-    out:write(line)[m
[31m-  end[m
[31m-  if pc >= 0 and band(funcbc(func, pc), 0xff) < 16 then -- ORDER BC[m
[31m-    out:write(bcline(func, pc+1, recprefix)) -- Write JMP for cond.[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Dump taken trace exits.[m
[31m-local function dump_texit(tr, ex, ngpr, nfpr, ...)[m
[31m-  out:write("---- TRACE ", tr, " exit ", ex, "\n")[m
[31m-  if dumpmode.X then[m
[31m-    local regs = {...}[m
[31m-    if jit.arch == "x64" then[m
[31m-      for i=1,ngpr do[m
[31m-	out:write(format(" %016x", regs[i]))[m
[31m-	if i % 4 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    else[m
[31m-      for i=1,ngpr do[m
[31m-	out:write(" ", tohex(regs[i]))[m
[31m-	if i % 8 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    end[m
[31m-    if jit.arch == "mips" or jit.arch == "mipsel" then[m
[31m-      for i=1,nfpr,2 do[m
[31m-	out:write(format(" %+17.14g", regs[ngpr+i]))[m
[31m-	if i % 8 == 7 then out:write("\n") end[m
[31m-      end[m
[31m-    else[m
[31m-      for i=1,nfpr do[m
[31m-	out:write(format(" %+17.14g", regs[ngpr+i]))[m
[31m-	if i % 4 == 0 then out:write("\n") end[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Detach dump handlers.[m
[31m-local function dumpoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(dump_texit)[m
[31m-    jit.attach(dump_record)[m
[31m-    jit.attach(dump_trace)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach dump handlers.[m
[31m-local function dumpon(opt, outfile)[m
[31m-  if active then dumpoff() end[m
[31m-[m
[31m-  local colormode = os.getenv("COLORTERM") and "A" or "T"[m
[31m-  if opt then[m
[31m-    opt = gsub(opt, "[TAH]", function(mode) colormode = mode; return ""; end)[m
[31m-  end[m
[31m-[m
[31m-  local m = { t=true, b=true, i=true, m=true, }[m
[31m-  if opt and opt ~= "" then[m
[31m-    local o = sub(opt, 1, 1)[m
[31m-    if o ~= "+" and o ~= "-" then m = {} end[m
[31m-    for i=1,#opt do m[sub(opt, i, i)] = (o ~= "-") end[m
[31m-  end[m
[31m-  dumpmode = m[m
[31m-[m
[31m-  if m.t or m.b or m.i or m.s or m.m then[m
[31m-    jit.attach(dump_trace, "trace")[m
[31m-  end[m
[31m-  if m.b then[m
[31m-    jit.attach(dump_record, "record")[m
[31m-    if not bcline then bcline = require("jit.bc").line end[m
[31m-  end[m
[31m-  if m.x or m.X then[m
[31m-    jit.attach(dump_texit, "texit")[m
[31m-  end[m
[31m-[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_DUMPFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stdout[m
[31m-  end[m
[31m-[m
[31m-  m[colormode] = true[m
[31m-  if colormode == "A" then[m
[31m-    colorize = colorize_ansi[m
[31m-    irtype = irtype_ansi[m
[31m-  elseif colormode == "H" then[m
[31m-    colorize = colorize_html[m
[31m-    irtype = irtype_html[m
[31m-    out:write(header_html)[m
[31m-  else[m
[31m-    colorize = colorize_text[m
[31m-    irtype = irtype_text[m
[31m-  end[m
[31m-[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  on = dumpon,[m
[31m-  off = dumpoff,[m
[31m-  start = dumpon -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/p.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/p.lua[m
[1mdeleted file mode 100644[m
[1mindex 5323728..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/p.lua[m
[1m+++ /dev/null[m
[36m@@ -1,310 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT profiler.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module is a simple command line interface to the built-in[m
[31m--- low-overhead profiler of LuaJIT.[m
[31m---[m
[31m--- The lower-level API of the profiler is accessible via the "jit.profile"[m
[31m--- module or the luaJIT_profile_* C API.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jp myapp.lua[m
[31m---   luajit -jp=s myapp.lua[m
[31m---   luajit -jp=-s myapp.lua[m
[31m---   luajit -jp=vl myapp.lua[m
[31m---   luajit -jp=G,profile.txt myapp.lua[m
[31m---[m
[31m--- The following dump features are available:[m
[31m---[m
[31m---   f  Stack dump: function name, otherwise module:line. Default mode.[m
[31m---   F  Stack dump: ditto, but always prepend module.[m
[31m---   l  Stack dump: module:line.[m
[31m---   <number> stack dump depth (callee < caller). Default: 1.[m
[31m---   -<number> Inverse stack dump depth (caller > callee).[m
[31m---   s  Split stack dump after first stack level. Implies abs(depth) >= 2.[m
[31m---   p  Show full path for module names.[m
[31m---   v  Show VM states. Can be combined with stack dumps, e.g. vf or fv.[m
[31m---   z  Show zones. Can be combined with stack dumps, e.g. zf or fz.[m
[31m---   r  Show raw sample counts. Default: show percentages.[m
[31m---   a  Annotate excerpts from source code files.[m
[31m---   A  Annotate complete source code files.[m
[31m---   G  Produce raw output suitable for graphical tools (e.g. flame graphs).[m
[31m---   m<number> Minimum sample percentage to be shown. Default: 3.[m
[31m---   i<number> Sampling interval in milliseconds. Default: 10.[m
[31m---[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local profile = require("jit.profile")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local math = math[m
[31m-local pairs, ipairs, tonumber, floor = pairs, ipairs, tonumber, math.floor[m
[31m-local sort, format = table.sort, string.format[m
[31m-local stdout = io.stdout[m
[31m-local zone -- Load jit.zone module on demand.[m
[31m-[m
[31m--- Output file handle.[m
[31m-local out[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local prof_ud[m
[31m-local prof_states, prof_split, prof_min, prof_raw, prof_fmt, prof_depth[m
[31m-local prof_ann, prof_count1, prof_count2, prof_samples[m
[31m-[m
[31m-local map_vmmode = {[m
[31m-  N = "Compiled",[m
[31m-  I = "Interpreted",[m
[31m-  C = "C code",[m
[31m-  G = "Garbage Collector",[m
[31m-  J = "JIT Compiler",[m
[31m-}[m
[31m-[m
[31m--- Profiler callback.[m
[31m-local function prof_cb(th, samples, vmmode)[m
[31m-  prof_samples = prof_samples + samples[m
[31m-  local key_stack, key_stack2, key_state[m
[31m-  -- Collect keys for sample.[m
[31m-  if prof_states then[m
[31m-    if prof_states == "v" then[m
[31m-      key_state = map_vmmode[vmmode] or vmmode[m
[31m-    else[m
[31m-      key_state = zone:get() or "(none)"[m
[31m-    end[m
[31m-  end[m
[31m-  if prof_fmt then[m
[31m-    key_stack = profile.dumpstack(th, prof_fmt, prof_depth)[m
[31m-    key_stack = key_stack:gsub("%[builtin#(%d+)%]", function(x)[m
[31m-      return vmdef.ffnames[tonumber(x)][m
[31m-    end)[m
[31m-    if prof_split == 2 then[m
[31m-      local k1, k2 = key_stack:match("(.-) [<>] (.*)")[m
[31m-      if k2 then key_stack, key_stack2 = k1, k2 end[m
[31m-    elseif prof_split == 3 then[m
[31m-      key_stack2 = profile.dumpstack(th, "l", 1)[m
[31m-    end[m
[31m-  end[m
[31m-  -- Order keys.[m
[31m-  local k1, k2[m
[31m-  if prof_split == 1 then[m
[31m-    if key_state then[m
[31m-      k1 = key_state[m
[31m-      if key_stack then k2 = key_stack end[m
[31m-    end[m
[31m-  elseif key_stack then[m
[31m-    k1 = key_stack[m
[31m-    if key_stack2 then k2 = key_stack2 elseif key_state then k2 = key_state end[m
[31m-  end[m
[31m-  -- Coalesce samples in one or two levels.[m
[31m-  if k1 then[m
[31m-    local t1 = prof_count1[m
[31m-    t1[k1] = (t1[k1] or 0) + samples[m
[31m-    if k2 then[m
[31m-      local t2 = prof_count2[m
[31m-      local t3 = t2[k1][m
[31m-      if not t3 then t3 = {}; t2[k1] = t3 end[m
[31m-      t3[k2] = (t3[k2] or 0) + samples[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Show top N list.[m
[31m-local function prof_top(count1, count2, samples, indent)[m
[31m-  local t, n = {}, 0[m
[31m-  for k, v in pairs(count1) do[m
[31m-    n = n + 1[m
[31m-    t[n] = k[m
[31m-  end[m
[31m-  sort(t, function(a, b) return count1[a] > count1[b] end)[m
[31m-  for i=1,n do[m
[31m-    local k = t[i][m
[31m-    local v = count1[k][m
[31m-    local pct = floor(v*100/samples + 0.5)[m
[31m-    if pct < prof_min then break end[m
[31m-    if not prof_raw then[m
[31m-      out:write(format("%s%2d%%  %s\n", indent, pct, k))[m
[31m-    elseif prof_raw == "r" then[m
[31m-      out:write(format("%s%5d  %s\n", indent, v, k))[m
[31m-    else[m
[31m-      out:write(format("%s %d\n", k, v))[m
[31m-    end[m
[31m-    if count2 then[m
[31m-      local r = count2[k][m
[31m-      if r then[m
[31m-	prof_top(r, nil, v, (prof_split == 3 or prof_split == 1) and "  -- " or[m
[31m-			    (prof_depth < 0 and "  -> " or "  <- "))[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Annotate source code[m
[31m-local function prof_annotate(count1, samples)[m
[31m-  local files = {}[m
[31m-  local ms = 0[m
[31m-  for k, v in pairs(count1) do[m
[31m-    local pct = floor(v*100/samples + 0.5)[m
[31m-    ms = math.max(ms, v)[m
[31m-    if pct >= prof_min then[m
[31m-      local file, line = k:match("^(.*):(%d+)$")[m
[31m-      local fl = files[file][m
[31m-      if not fl then fl = {}; files[file] = fl; files[#files+1] = file end[m
[31m-      line = tonumber(line)[m
[31m-      fl[line] = prof_raw and v or pct[m
[31m-    end[m
[31m-  end[m
[31m-  sort(files)[m
[31m-  local fmtv, fmtn = " %3d%% | %s\n", "      | %s\n"[m
[31m-  if prof_raw then[m
[31m-    local n = math.max(5, math.ceil(math.log10(ms)))[m
[31m-    fmtv = "%"..n.."d | %s\n"[m
[31m-    fmtn = (" "):rep(n).." | %s\n"[m
[31m-  end[m
[31m-  local ann = prof_ann[m
[31m-  for _, file in ipairs(files) do[m
[31m-    local f0 = file:byte()[m
[31m-    if f0 == 40 or f0 == 91 then[m
[31m-      out:write(format("\n====== %s ======\n[Cannot annotate non-file]\n", file))[m
[31m-      break[m
[31m-    end[m
[31m-    local fp, err = io.open(file)[m
[31m-    if not fp then[m
[31m-      out:write(format("====== ERROR: %s: %s\n", file, err))[m
[31m-      break[m
[31m-    end[m
[31m-    out:write(format("\n====== %s ======\n", file))[m
[31m-    local fl = files[file][m
[31m-    local n, show = 1, false[m
[31m-    if ann ~= 0 then[m
[31m-      for i=1,ann do[m
[31m-	if fl[i] then show = true; out:write("@@ 1 @@\n"); break end[m
[31m-      end[m
[31m-    end[m
[31m-    for line in fp:lines() do[m
[31m-      if line:byte() == 27 then[m
[31m-	out:write("[Cannot annotate bytecode file]\n")[m
[31m-	break[m
[31m-      end[m
[31m-      local v = fl[n][m
[31m-      if ann ~= 0 then[m
[31m-	local v2 = fl[n+ann][m
[31m-	if show then[m
[31m-	  if v2 then show = n+ann elseif v then show = n[m
[31m-	  elseif show+ann < n then show = false end[m
[31m-	elseif v2 then[m
[31m-	  show = n+ann[m
[31m-	  out:write(format("@@ %d @@\n", n))[m
[31m-	end[m
[31m-	if not show then goto next end[m
[31m-      end[m
[31m-      if v then[m
[31m-	out:write(format(fmtv, v, line))[m
[31m-      else[m
[31m-	out:write(format(fmtn, line))[m
[31m-      end[m
[31m-    ::next::[m
[31m-      n = n + 1[m
[31m-    end[m
[31m-    fp:close()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Finish profiling and dump result.[m
[31m-local function prof_finish()[m
[31m-  if prof_ud then[m
[31m-    profile.stop()[m
[31m-    local samples = prof_samples[m
[31m-    if samples == 0 then[m
[31m-      if prof_raw ~= true then out:write("[No samples collected]\n") end[m
[31m-      return[m
[31m-    end[m
[31m-    if prof_ann then[m
[31m-      prof_annotate(prof_count1, samples)[m
[31m-    else[m
[31m-      prof_top(prof_count1, prof_count2, samples, "")[m
[31m-    end[m
[31m-    prof_count1 = nil[m
[31m-    prof_count2 = nil[m
[31m-    prof_ud = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Start profiling.[m
[31m-local function prof_start(mode)[m
[31m-  local interval = ""[m
[31m-  mode = mode:gsub("i%d*", function(s) interval = s; return "" end)[m
[31m-  prof_min = 3[m
[31m-  mode = mode:gsub("m(%d+)", function(s) prof_min = tonumber(s); return "" end)[m
[31m-  prof_depth = 1[m
[31m-  mode = mode:gsub("%-?%d+", function(s) prof_depth = tonumber(s); return "" end)[m
[31m-  local m = {}[m
[31m-  for c in mode:gmatch(".") do m[c] = c end[m
[31m-  prof_states = m.z or m.v[m
[31m-  if prof_states == "z" then zone = require("jit.zone") end[m
[31m-  local scope = m.l or m.f or m.F or (prof_states and "" or "f")[m
[31m-  local flags = (m.p or "")[m
[31m-  prof_raw = m.r[m
[31m-  if m.s then[m
[31m-    prof_split = 2[m
[31m-    if prof_depth == -1 or m["-"] then prof_depth = -2[m
[31m-    elseif prof_depth == 1 then prof_depth = 2 end[m
[31m-  elseif mode:find("[fF].*l") then[m
[31m-    scope = "l"[m
[31m-    prof_split = 3[m
[31m-  else[m
[31m-    prof_split = (scope == "" or mode:find("[zv].*[lfF]")) and 1 or 0[m
[31m-  end[m
[31m-  prof_ann = m.A and 0 or (m.a and 3)[m
[31m-  if prof_ann then[m
[31m-    scope = "l"[m
[31m-    prof_fmt = "pl"[m
[31m-    prof_split = 0[m
[31m-    prof_depth = 1[m
[31m-  elseif m.G and scope ~= "" then[m
[31m-    prof_fmt = flags..scope.."Z;"[m
[31m-    prof_depth = -100[m
[31m-    prof_raw = true[m
[31m-    prof_min = 0[m
[31m-  elseif scope == "" then[m
[31m-    prof_fmt = false[m
[31m-  else[m
[31m-    local sc = prof_split == 3 and m.f or m.F or scope[m
[31m-    prof_fmt = flags..sc..(prof_depth >= 0 and "Z < " or "Z > ")[m
[31m-  end[m
[31m-  prof_count1 = {}[m
[31m-  prof_count2 = {}[m
[31m-  prof_samples = 0[m
[31m-  profile.start(scope:lower()..interval, prof_cb)[m
[31m-  prof_ud = newproxy(true)[m
[31m-  getmetatable(prof_ud).__gc = prof_finish[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local function start(mode, outfile)[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_PROFILEFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stdout[m
[31m-  end[m
[31m-  prof_start(mode or "f")[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  start = start, -- For -j command line option.[m
[31m-  stop = prof_finish[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/v.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/v.lua[m
[1mdeleted file mode 100644[m
[1mindex 60c8b05..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/v.lua[m
[1m+++ /dev/null[m
[36m@@ -1,170 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- Verbose mode of the LuaJIT compiler.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module shows verbose information about the progress of the[m
[31m--- JIT compiler. It prints one line for each generated trace. This module[m
[31m--- is useful to see which code has been compiled or where the compiler[m
[31m--- punts and falls back to the interpreter.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   luajit -jv -e "for i=1,1000 do for j=1,1000 do end end"[m
[31m---   luajit -jv=myapp.out myapp.lua[m
[31m---[m
[31m--- Default output is to stderr. To redirect the output to a file, pass a[m
[31m--- filename as an argument (use '-' for stdout) or set the environment[m
[31m--- variable LUAJIT_VERBOSEFILE. The file is overwritten every time the[m
[31m--- module is started.[m
[31m---[m
[31m--- The output from the first example should look like this:[m
[31m---[m
[31m--- [TRACE   1 (command line):1 loop][m
[31m--- [TRACE   2 (1/3) (command line):1 -> 1][m
[31m---[m
[31m--- The first number in each line is the internal trace number. Next are[m
[31m--- the file name ('(command line)') and the line number (':1') where the[m
[31m--- trace has started. Side traces also show the parent trace number and[m
[31m--- the exit number where they are attached to in parentheses ('(1/3)').[m
[31m--- An arrow at the end shows where the trace links to ('-> 1'), unless[m
[31m--- it loops to itself.[m
[31m---[m
[31m--- In this case the inner loop gets hot and is traced first, generating[m
[31m--- a root trace. Then the last exit from the 1st trace gets hot, too,[m
[31m--- and triggers generation of the 2nd trace. The side trace follows the[m
[31m--- path along the outer loop and *around* the inner loop, back to its[m
[31m--- start, and then links to the 1st trace. Yes, this may seem unusual,[m
[31m--- if you know how traditional compilers work. Trace compilers are full[m
[31m--- of surprises like this -- have fun! :-)[m
[31m---[m
[31m--- Aborted traces are shown like this:[m
[31m---[m
[31m--- [TRACE --- foo.lua:44 -- leaving loop in root trace at foo:lua:50][m
[31m---[m
[31m--- Don't worry -- trace aborts are quite common, even in programs which[m
[31m--- can be fully compiled. The compiler may retry several times until it[m
[31m--- finds a suitable trace.[m
[31m---[m
[31m--- Of course this doesn't work with features that are not-yet-implemented[m
[31m--- (NYI error messages). The VM simply falls back to the interpreter. This[m
[31m--- may not matter at all if the particular trace is not very high up in[m
[31m--- the CPU usage profile. Oh, and the interpreter is quite fast, too.[m
[31m---[m
[31m--- Also check out the -jdump module, which prints all the gory details.[m
[31m---[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Cache some library functions and objects.[m
[31m-local jit = require("jit")[m
[31m-assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")[m
[31m-local jutil = require("jit.util")[m
[31m-local vmdef = require("jit.vmdef")[m
[31m-local funcinfo, traceinfo = jutil.funcinfo, jutil.traceinfo[m
[31m-local type, format = type, string.format[m
[31m-local stdout, stderr = io.stdout, io.stderr[m
[31m-[m
[31m--- Active flag and output file handle.[m
[31m-local active, out[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m-local startloc, startex[m
[31m-[m
[31m-local function fmtfunc(func, pc)[m
[31m-  local fi = funcinfo(func, pc)[m
[31m-  if fi.loc then[m
[31m-    return fi.loc[m
[31m-  elseif fi.ffid then[m
[31m-    return vmdef.ffnames[fi.ffid][m
[31m-  elseif fi.addr then[m
[31m-    return format("C:%x", fi.addr)[m
[31m-  else[m
[31m-    return "(?)"[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Format trace error message.[m
[31m-local function fmterr(err, info)[m
[31m-  if type(err) == "number" then[m
[31m-    if type(info) == "function" then info = fmtfunc(info) end[m
[31m-    err = format(vmdef.traceerr[err], info)[m
[31m-  end[m
[31m-  return err[m
[31m-end[m
[31m-[m
[31m--- Dump trace states.[m
[31m-local function dump_trace(what, tr, func, pc, otr, oex)[m
[31m-  if what == "start" then[m
[31m-    startloc = fmtfunc(func, pc)[m
[31m-    startex = otr and "("..otr.."/"..oex..") " or ""[m
[31m-  else[m
[31m-    if what == "abort" then[m
[31m-      local loc = fmtfunc(func, pc)[m
[31m-      if loc ~= startloc then[m
[31m-	out:write(format("[TRACE --- %s%s -- %s at %s]\n",[m
[31m-	  startex, startloc, fmterr(otr, oex), loc))[m
[31m-      else[m
[31m-	out:write(format("[TRACE --- %s%s -- %s]\n",[m
[31m-	  startex, startloc, fmterr(otr, oex)))[m
[31m-      end[m
[31m-    elseif what == "stop" then[m
[31m-      local info = traceinfo(tr)[m
[31m-      local link, ltype = info.link, info.linktype[m
[31m-      if ltype == "interpreter" then[m
[31m-	out:write(format("[TRACE %3s %s%s -- fallback to interpreter]\n",[m
[31m-	  tr, startex, startloc))[m
[31m-      elseif ltype == "stitch" then[m
[31m-	out:write(format("[TRACE %3s %s%s %s %s]\n",[m
[31m-	  tr, startex, startloc, ltype, fmtfunc(func, pc)))[m
[31m-      elseif link == tr or link == 0 then[m
[31m-	out:write(format("[TRACE %3s %s%s %s]\n",[m
[31m-	  tr, startex, startloc, ltype))[m
[31m-      elseif ltype == "root" then[m
[31m-	out:write(format("[TRACE %3s %s%s -> %d]\n",[m
[31m-	  tr, startex, startloc, link))[m
[31m-      else[m
[31m-	out:write(format("[TRACE %3s %s%s -> %d %s]\n",[m
[31m-	  tr, startex, startloc, link, ltype))[m
[31m-      end[m
[31m-    else[m
[31m-      out:write(format("[TRACE %s]\n", what))[m
[31m-    end[m
[31m-    out:flush()[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-------------------------------------------------------------------------------[m
[31m-[m
[31m--- Detach dump handlers.[m
[31m-local function dumpoff()[m
[31m-  if active then[m
[31m-    active = false[m
[31m-    jit.attach(dump_trace)[m
[31m-    if out and out ~= stdout and out ~= stderr then out:close() end[m
[31m-    out = nil[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- Open the output file and attach dump handlers.[m
[31m-local function dumpon(outfile)[m
[31m-  if active then dumpoff() end[m
[31m-  if not outfile then outfile = os.getenv("LUAJIT_VERBOSEFILE") end[m
[31m-  if outfile then[m
[31m-    out = outfile == "-" and stdout or assert(io.open(outfile, "w"))[m
[31m-  else[m
[31m-    out = stderr[m
[31m-  end[m
[31m-  jit.attach(dump_trace, "trace")[m
[31m-  active = true[m
[31m-end[m
[31m-[m
[31m--- Public module functions.[m
[31m-return {[m
[31m-  on = dumpon,[m
[31m-  off = dumpoff,[m
[31m-  start = dumpon -- For -j command line option.[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/zone.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/zone.lua[m
[1mdeleted file mode 100644[m
[1mindex f5f9656..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/jit/zone.lua[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-----------------------------------------------------------------------------[m
[31m--- LuaJIT profiler zones.[m
[31m---[m
[31m--- Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m--- Released under the MIT license. See Copyright Notice in luajit.h[m
[31m-----------------------------------------------------------------------------[m
[31m---[m
[31m--- This module implements a simple hierarchical zone model.[m
[31m---[m
[31m--- Example usage:[m
[31m---[m
[31m---   local zone = require("jit.zone")[m
[31m---   zone("AI")[m
[31m---   ...[m
[31m---     zone("A*")[m
[31m---     ...[m
[31m---     print(zone:get()) --> "A*"[m
[31m---     ...[m
[31m---     zone()[m
[31m---   ...[m
[31m---   print(zone:get()) --> "AI"[m
[31m---   ...[m
[31m---   zone()[m
[31m---[m
[31m-----------------------------------------------------------------------------[m
[31m-[m
[31m-local remove = table.remove[m
[31m-[m
[31m-return setmetatable({[m
[31m-  flush = function(t)[m
[31m-    for i=#t,1,-1 do t[i] = nil end[m
[31m-  end,[m
[31m-  get = function(t)[m
[31m-    return t[#t][m
[31m-  end[m
[31m-}, {[m
[31m-  __call = function(t, zone)[m
[31m-    if zone then[m
[31m-      t[#t+1] = zone[m
[31m-    else[m
[31m-      return (assert(remove(t), "empty zone stack"))[m
[31m-    end[m
[31m-  end[m
[31m-})[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lauxlib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lauxlib.h[m
[1mdeleted file mode 100644[m
[1mindex fed1491..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lauxlib.h[m
[1m+++ /dev/null[m
[36m@@ -1,167 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions for building Lua libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lauxlib_h[m
[31m-#define lauxlib_h[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-#define luaL_getn(L,i)          ((int)lua_objlen(L, i))[m
[31m-#define luaL_setn(L,i,j)        ((void)0)  /* no op! */[m
[31m-[m
[31m-/* extra error code for `luaL_load' */[m
[31m-#define LUA_ERRFILE     (LUA_ERRERR+1)[m
[31m-[m
[31m-typedef struct luaL_Reg {[m
[31m-  const char *name;[m
[31m-  lua_CFunction func;[m
[31m-} luaL_Reg;[m
[31m-[m
[31m-LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l, int nup);[m
[31m-LUALIB_API void (luaL_register) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l);[m
[31m-LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);[m
[31m-LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);[m
[31m-LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,[m
[31m-                                                          size_t *l);[m
[31m-LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,[m
[31m-                                          const char *def, size_t *l);[m
[31m-LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);[m
[31m-[m
[31m-LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,[m
[31m-                                          lua_Integer def);[m
[31m-[m
[31m-LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);[m
[31m-LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);[m
[31m-LUALIB_API void (luaL_checkany) (lua_State *L, int narg);[m
[31m-[m
[31m-LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);[m
[31m-LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);[m
[31m-[m
[31m-LUALIB_API void (luaL_where) (lua_State *L, int lvl);[m
[31m-LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);[m
[31m-[m
[31m-LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,[m
[31m-                                   const char *const lst[]);[m
[31m-[m
[31m-LUALIB_API int (luaL_ref) (lua_State *L, int t);[m
[31m-LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);[m
[31m-[m
[31m-LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);[m
[31m-LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,[m
[31m-                                  const char *name);[m
[31m-LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);[m
[31m-[m
[31m-LUALIB_API lua_State *(luaL_newstate) (void);[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,[m
[31m-                                                  const char *r);[m
[31m-[m
[31m-LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,[m
[31m-                                         const char *fname, int szhint);[m
[31m-[m
[31m-/* From Lua 5.2. */[m
[31m-LUALIB_API int luaL_fileresult(lua_State *L, int stat, const char *fname);[m
[31m-LUALIB_API int luaL_execresult(lua_State *L, int stat);[m
[31m-LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,[m
[31m-				 const char *mode);[m
[31m-LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,[m
[31m-				   const char *name, const char *mode);[m
[31m-LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,[m
[31m-				int level);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define luaL_argcheck(L, cond,numarg,extramsg)	\[m
[31m-		((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))[m
[31m-#define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))[m
[31m-#define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))[m
[31m-#define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))[m
[31m-#define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))[m
[31m-[m
[31m-#define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))[m
[31m-[m
[31m-#define luaL_dofile(L, fn) \[m
[31m-	(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_dostring(L, s) \[m
[31m-	(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))[m
[31m-[m
[31m-#define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Generic Buffer manipulation[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct luaL_Buffer {[m
[31m-  char *p;			/* current position in buffer */[m
[31m-  int lvl;  /* number of strings in the stack (level) */[m
[31m-  lua_State *L;[m
[31m-  char buffer[LUAL_BUFFERSIZE];[m
[31m-} luaL_Buffer;[m
[31m-[m
[31m-#define luaL_addchar(B,c) \[m
[31m-  ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \[m
[31m-   (*(B)->p++ = (char)(c)))[m
[31m-[m
[31m-/* compatibility only */[m
[31m-#define luaL_putchar(B,c)	luaL_addchar(B,c)[m
[31m-[m
[31m-#define luaL_addsize(B,n)	((B)->p += (n))[m
[31m-[m
[31m-LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);[m
[31m-LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);[m
[31m-LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);[m
[31m-LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-/* compatibility with ref system */[m
[31m-[m
[31m-/* pre-defined references */[m
[31m-#define LUA_NOREF       (-2)[m
[31m-#define LUA_REFNIL      (-1)[m
[31m-[m
[31m-#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \[m
[31m-      (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))[m
[31m-[m
[31m-#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-[m
[31m-#define luaL_reg	luaL_Reg[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_aux.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_aux.c[m
[1mdeleted file mode 100644[m
[1mindex 0e61d95..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_aux.c[m
[1m+++ /dev/null[m
[36m@@ -1,356 +0,0 @@[m
[31m-/*[m
[31m-** Auxiliary library for the Lua/C API.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major parts taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lib_aux_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-#if LJ_TARGET_POSIX[m
[31m-#include <sys/wait.h>[m
[31m-#endif[m
[31m-[m
[31m-/* -- I/O error handling -------------------------------------------------- */[m
[31m-[m
[31m-LUALIB_API int luaL_fileresult(lua_State *L, int stat, const char *fname)[m
[31m-{[m
[31m-  if (stat) {[m
[31m-    setboolV(L->top++, 1);[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    int en = errno;  /* Lua API calls may change this value. */[m
[31m-    setnilV(L->top++);[m
[31m-    if (fname)[m
[31m-      lua_pushfstring(L, "%s: %s", fname, strerror(en));[m
[31m-    else[m
[31m-      lua_pushfstring(L, "%s", strerror(en));[m
[31m-    setintV(L->top++, en);[m
[31m-    lj_trace_abort(G(L));[m
[31m-    return 3;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_execresult(lua_State *L, int stat)[m
[31m-{[m
[31m-  if (stat != -1) {[m
[31m-#if LJ_TARGET_POSIX[m
[31m-    if (WIFSIGNALED(stat)) {[m
[31m-      stat = WTERMSIG(stat);[m
[31m-      setnilV(L->top++);[m
[31m-      lua_pushliteral(L, "signal");[m
[31m-    } else {[m
[31m-      if (WIFEXITED(stat))[m
[31m-	stat = WEXITSTATUS(stat);[m
[31m-      if (stat == 0)[m
[31m-	setboolV(L->top++, 1);[m
[31m-      else[m
[31m-	setnilV(L->top++);[m
[31m-      lua_pushliteral(L, "exit");[m
[31m-    }[m
[31m-#else[m
[31m-    if (stat == 0)[m
[31m-      setboolV(L->top++, 1);[m
[31m-    else[m
[31m-      setnilV(L->top++);[m
[31m-    lua_pushliteral(L, "exit");[m
[31m-#endif[m
[31m-    setintV(L->top++, stat);[m
[31m-    return 3;[m
[31m-  }[m
[31m-  return luaL_fileresult(L, 0, NULL);[m
[31m-}[m
[31m-[m
[31m-/* -- Module registration ------------------------------------------------- */[m
[31m-[m
[31m-LUALIB_API const char *luaL_findtable(lua_State *L, int idx,[m
[31m-				      const char *fname, int szhint)[m
[31m-{[m
[31m-  const char *e;[m
[31m-  lua_pushvalue(L, idx);[m
[31m-  do {[m
[31m-    e = strchr(fname, '.');[m
[31m-    if (e == NULL) e = fname + strlen(fname);[m
[31m-    lua_pushlstring(L, fname, (size_t)(e - fname));[m
[31m-    lua_rawget(L, -2);[m
[31m-    if (lua_isnil(L, -1)) {  /* no such field? */[m
[31m-      lua_pop(L, 1);  /* remove this nil */[m
[31m-      lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */[m
[31m-      lua_pushlstring(L, fname, (size_t)(e - fname));[m
[31m-      lua_pushvalue(L, -2);[m
[31m-      lua_settable(L, -4);  /* set new table into field */[m
[31m-    } else if (!lua_istable(L, -1)) {  /* field has a non-table value? */[m
[31m-      lua_pop(L, 2);  /* remove table and value */[m
[31m-      return fname;  /* return problematic part of the name */[m
[31m-    }[m
[31m-    lua_remove(L, -2);  /* remove previous table */[m
[31m-    fname = e + 1;[m
[31m-  } while (*e == '.');[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static int libsize(const luaL_Reg *l)[m
[31m-{[m
[31m-  int size = 0;[m
[31m-  for (; l->name; l++) size++;[m
[31m-  return size;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_openlib(lua_State *L, const char *libname,[m
[31m-			     const luaL_Reg *l, int nup)[m
[31m-{[m
[31m-  lj_lib_checkfpu(L);[m
[31m-  if (libname) {[m
[31m-    int size = libsize(l);[m
[31m-    /* check whether lib already exists */[m
[31m-    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);[m
[31m-    lua_getfield(L, -1, libname);  /* get _LOADED[libname] */[m
[31m-    if (!lua_istable(L, -1)) {  /* not found? */[m
[31m-      lua_pop(L, 1);  /* remove previous result */[m
[31m-      /* try global variable (and create one if it does not exist) */[m
[31m-      if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL)[m
[31m-	lj_err_callerv(L, LJ_ERR_BADMODN, libname);[m
[31m-      lua_pushvalue(L, -1);[m
[31m-      lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */[m
[31m-    }[m
[31m-    lua_remove(L, -2);  /* remove _LOADED table */[m
[31m-    lua_insert(L, -(nup+1));  /* move library table to below upvalues */[m
[31m-  }[m
[31m-  for (; l->name; l++) {[m
[31m-    int i;[m
[31m-    for (i = 0; i < nup; i++)  /* copy upvalues to the top */[m
[31m-      lua_pushvalue(L, -nup);[m
[31m-    lua_pushcclosure(L, l->func, nup);[m
[31m-    lua_setfield(L, -(nup+2), l->name);[m
[31m-  }[m
[31m-  lua_pop(L, nup);  /* remove upvalues */[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_register(lua_State *L, const char *libname,[m
[31m-			      const luaL_Reg *l)[m
[31m-{[m
[31m-  luaL_openlib(L, libname, l, 0);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API const char *luaL_gsub(lua_State *L, const char *s,[m
[31m-				 const char *p, const char *r)[m
[31m-{[m
[31m-  const char *wild;[m
[31m-  size_t l = strlen(p);[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while ((wild = strstr(s, p)) != NULL) {[m
[31m-    luaL_addlstring(&b, s, (size_t)(wild - s));  /* push prefix */[m
[31m-    luaL_addstring(&b, r);  /* push replacement in place of pattern */[m
[31m-    s = wild + l;  /* continue after `p' */[m
[31m-  }[m
[31m-  luaL_addstring(&b, s);  /* push last suffix */[m
[31m-  luaL_pushresult(&b);[m
[31m-  return lua_tostring(L, -1);[m
[31m-}[m
[31m-[m
[31m-/* -- Buffer handling ----------------------------------------------------- */[m
[31m-[m
[31m-#define bufflen(B)	((size_t)((B)->p - (B)->buffer))[m
[31m-#define bufffree(B)	((size_t)(LUAL_BUFFERSIZE - bufflen(B)))[m
[31m-[m
[31m-static int emptybuffer(luaL_Buffer *B)[m
[31m-{[m
[31m-  size_t l = bufflen(B);[m
[31m-  if (l == 0)[m
[31m-    return 0;  /* put nothing on stack */[m
[31m-  lua_pushlstring(B->L, B->buffer, l);[m
[31m-  B->p = B->buffer;[m
[31m-  B->lvl++;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static void adjuststack(luaL_Buffer *B)[m
[31m-{[m
[31m-  if (B->lvl > 1) {[m
[31m-    lua_State *L = B->L;[m
[31m-    int toget = 1;  /* number of levels to concat */[m
[31m-    size_t toplen = lua_strlen(L, -1);[m
[31m-    do {[m
[31m-      size_t l = lua_strlen(L, -(toget+1));[m
[31m-      if (!(B->lvl - toget + 1 >= LUA_MINSTACK/2 || toplen > l))[m
[31m-	break;[m
[31m-      toplen += l;[m
[31m-      toget++;[m
[31m-    } while (toget < B->lvl);[m
[31m-    lua_concat(L, toget);[m
[31m-    B->lvl = B->lvl - toget + 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API char *luaL_prepbuffer(luaL_Buffer *B)[m
[31m-{[m
[31m-  if (emptybuffer(B))[m
[31m-    adjuststack(B);[m
[31m-  return B->buffer;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_addlstring(luaL_Buffer *B, const char *s, size_t l)[m
[31m-{[m
[31m-  while (l--)[m
[31m-    luaL_addchar(B, *s++);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_addstring(luaL_Buffer *B, const char *s)[m
[31m-{[m
[31m-  luaL_addlstring(B, s, strlen(s));[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_pushresult(luaL_Buffer *B)[m
[31m-{[m
[31m-  emptybuffer(B);[m
[31m-  lua_concat(B->L, B->lvl);[m
[31m-  B->lvl = 1;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_addvalue(luaL_Buffer *B)[m
[31m-{[m
[31m-  lua_State *L = B->L;[m
[31m-  size_t vl;[m
[31m-  const char *s = lua_tolstring(L, -1, &vl);[m
[31m-  if (vl <= bufffree(B)) {  /* fit into buffer? */[m
[31m-    memcpy(B->p, s, vl);  /* put it there */[m
[31m-    B->p += vl;[m
[31m-    lua_pop(L, 1);  /* remove from stack */[m
[31m-  } else {[m
[31m-    if (emptybuffer(B))[m
[31m-      lua_insert(L, -2);  /* put buffer before new value */[m
[31m-    B->lvl++;  /* add new value into B stack */[m
[31m-    adjuststack(B);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_buffinit(lua_State *L, luaL_Buffer *B)[m
[31m-{[m
[31m-  B->L = L;[m
[31m-  B->p = B->buffer;[m
[31m-  B->lvl = 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Reference management ------------------------------------------------ */[m
[31m-[m
[31m-#define FREELIST_REF	0[m
[31m-[m
[31m-/* Convert a stack index to an absolute index. */[m
[31m-#define abs_index(L, i) \[m
[31m-  ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : lua_gettop(L) + (i) + 1)[m
[31m-[m
[31m-LUALIB_API int luaL_ref(lua_State *L, int t)[m
[31m-{[m
[31m-  int ref;[m
[31m-  t = abs_index(L, t);[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-    lua_pop(L, 1);  /* remove from stack */[m
[31m-    return LUA_REFNIL;  /* `nil' has a unique fixed reference */[m
[31m-  }[m
[31m-  lua_rawgeti(L, t, FREELIST_REF);  /* get first free element */[m
[31m-  ref = (int)lua_tointeger(L, -1);  /* ref = t[FREELIST_REF] */[m
[31m-  lua_pop(L, 1);  /* remove it from stack */[m
[31m-  if (ref != 0) {  /* any free element? */[m
[31m-    lua_rawgeti(L, t, ref);  /* remove it from list */[m
[31m-    lua_rawseti(L, t, FREELIST_REF);  /* (t[FREELIST_REF] = t[ref]) */[m
[31m-  } else {  /* no free elements */[m
[31m-    ref = (int)lua_objlen(L, t);[m
[31m-    ref++;  /* create new reference */[m
[31m-  }[m
[31m-  lua_rawseti(L, t, ref);[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_unref(lua_State *L, int t, int ref)[m
[31m-{[m
[31m-  if (ref >= 0) {[m
[31m-    t = abs_index(L, t);[m
[31m-    lua_rawgeti(L, t, FREELIST_REF);[m
[31m-    lua_rawseti(L, t, ref);  /* t[ref] = t[FREELIST_REF] */[m
[31m-    lua_pushinteger(L, ref);[m
[31m-    lua_rawseti(L, t, FREELIST_REF);  /* t[FREELIST_REF] = ref */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Default allocator and panic function -------------------------------- */[m
[31m-[m
[31m-static int panic(lua_State *L)[m
[31m-{[m
[31m-  const char *s = lua_tostring(L, -1);[m
[31m-  fputs("PANIC: unprotected error in call to Lua API (", stderr);[m
[31m-  fputs(s ? s : "?", stderr);[m
[31m-  fputc(')', stderr); fputc('\n', stderr);[m
[31m-  fflush(stderr);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#ifdef LUAJIT_USE_SYSMALLOC[m
[31m-[m
[31m-#if LJ_64 && !defined(LUAJIT_USE_VALGRIND)[m
[31m-#error "Must use builtin allocator for 64 bit target"[m
[31m-#endif[m
[31m-[m
[31m-static void *mem_alloc(void *ud, void *ptr, size_t osize, size_t nsize)[m
[31m-{[m
[31m-  (void)ud;[m
[31m-  (void)osize;[m
[31m-  if (nsize == 0) {[m
[31m-    free(ptr);[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    return realloc(ptr, nsize);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_State *luaL_newstate(void)[m
[31m-{[m
[31m-  lua_State *L = lua_newstate(mem_alloc, NULL);[m
[31m-  if (L) G(L)->panic = panic;[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#include "lj_alloc.h"[m
[31m-[m
[31m-LUALIB_API lua_State *luaL_newstate(void)[m
[31m-{[m
[31m-  lua_State *L;[m
[31m-  void *ud = lj_alloc_create();[m
[31m-  if (ud == NULL) return NULL;[m
[31m-#if LJ_64[m
[31m-  L = lj_state_newstate(lj_alloc_f, ud);[m
[31m-#else[m
[31m-  L = lua_newstate(lj_alloc_f, ud);[m
[31m-#endif[m
[31m-  if (L) G(L)->panic = panic;[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[31m-#if LJ_64[m
[31m-LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)[m
[31m-{[m
[31m-  UNUSED(f); UNUSED(ud);[m
[31m-  fputs("Must use luaL_newstate() for 64 bit target\n", stderr);[m
[31m-  return NULL;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_base.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_base.c[m
[1mdeleted file mode 100644[m
[1mindex 6107bde..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_base.c[m
[1m+++ /dev/null[m
[36m@@ -1,663 +0,0 @@[m
[31m-/*[m
[31m-** Base and coroutine library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lib_base_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#endif[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* -- Base library: checks ------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_base[m
[31m-[m
[31m-LJLIB_ASM(assert)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCstr *s;[m
[31m-  lj_lib_checkany(L, 1);[m
[31m-  s = lj_lib_optstr(L, 2);[m
[31m-  if (s)[m
[31m-    lj_err_callermsg(L, strdata(s));[m
[31m-  else[m
[31m-    lj_err_caller(L, LJ_ERR_ASSERT);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-/* ORDER LJ_T */[m
[31m-LJLIB_PUSH("nil")[m
[31m-LJLIB_PUSH("boolean")[m
[31m-LJLIB_PUSH(top-1)  /* boolean */[m
[31m-LJLIB_PUSH("userdata")[m
[31m-LJLIB_PUSH("string")[m
[31m-LJLIB_PUSH("upval")[m
[31m-LJLIB_PUSH("thread")[m
[31m-LJLIB_PUSH("proto")[m
[31m-LJLIB_PUSH("function")[m
[31m-LJLIB_PUSH("trace")[m
[31m-LJLIB_PUSH("cdata")[m
[31m-LJLIB_PUSH("table")[m
[31m-LJLIB_PUSH(top-9)  /* userdata */[m
[31m-LJLIB_PUSH("number")[m
[31m-LJLIB_ASM_(type)		LJLIB_REC(.)[m
[31m-/* Recycle the lj_lib_checkany(L, 1) from assert. */[m
[31m-[m
[31m-/* -- Base library: iterators --------------------------------------------- */[m
[31m-[m
[31m-/* This solves a circular dependency problem -- change FF_next_N as needed. */[m
[31m-LJ_STATIC_ASSERT((int)FF_next == FF_next_N);[m
[31m-[m
[31m-LJLIB_ASM(next)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 1);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-#if LJ_52 || LJ_HASFFI[m
[31m-static int ffh_pairs(lua_State *L, MMS mm)[m
[31m-{[m
[31m-  TValue *o = lj_lib_checkany(L, 1);[m
[31m-  cTValue *mo = lj_meta_lookup(L, o, mm);[m
[31m-  if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) {[m
[31m-    L->top = o+1;  /* Only keep one argument. */[m
[31m-    copyTV(L, L->base-1-LJ_FR2, mo);  /* Replace callable. */[m
[31m-    return FFH_TAILCALL;[m
[31m-  } else {[m
[31m-    if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE);[m
[31m-    if (LJ_FR2) { copyTV(L, o-1, o); o--; }[m
[31m-    setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1)));[m
[31m-    if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0);[m
[31m-    return FFH_RES(3);[m
[31m-  }[m
[31m-}[m
[31m-#else[m
[31m-#define ffh_pairs(L, mm)	(lj_lib_checktab(L, 1), FFH_UNREACHABLE)[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_PUSH(lastcl)[m
[31m-LJLIB_ASM(pairs)		LJLIB_REC(xpairs 0)[m
[31m-{[m
[31m-  return ffh_pairs(L, MM_pairs);[m
[31m-}[m
[31m-[m
[31m-LJLIB_NOREGUV LJLIB_ASM(ipairs_aux)	LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 1);[m
[31m-  lj_lib_checkint(L, 2);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(lastcl)[m
[31m-LJLIB_ASM(ipairs)		LJLIB_REC(xpairs 1)[m
[31m-{[m
[31m-  return ffh_pairs(L, MM_ipairs);[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: getters and setters ----------------------------------- */[m
[31m-[m
[31m-LJLIB_ASM_(getmetatable)	LJLIB_REC(.)[m
[31m-/* Recycle the lj_lib_checkany(L, 1) from assert. */[m
[31m-[m
[31m-LJLIB_ASM(setmetatable)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  GCtab *mt = lj_lib_checktabornil(L, 2);[m
[31m-  if (!tvisnil(lj_meta_lookup(L, L->base, MM_metatable)))[m
[31m-    lj_err_caller(L, LJ_ERR_PROTMT);[m
[31m-  setgcref(t->metatable, obj2gco(mt));[m
[31m-  if (mt) { lj_gc_objbarriert(L, t, mt); }[m
[31m-  settabV(L, L->base-1-LJ_FR2, t);[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(getfenv)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  cTValue *o = L->base;[m
[31m-  if (!(o < L->top && tvisfunc(o))) {[m
[31m-    int level = lj_lib_optint(L, 1, 1);[m
[31m-    o = lj_debug_frame(L, level, &level);[m
[31m-    if (o == NULL)[m
[31m-      lj_err_arg(L, 1, LJ_ERR_INVLVL);[m
[31m-    if (LJ_FR2) o--;[m
[31m-  }[m
[31m-  fn = &gcval(o)->fn;[m
[31m-  settabV(L, L->top++, isluafunc(fn) ? tabref(fn->l.env) : tabref(L->env));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(setfenv)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  GCtab *t = lj_lib_checktab(L, 2);[m
[31m-  cTValue *o = L->base;[m
[31m-  if (!(o < L->top && tvisfunc(o))) {[m
[31m-    int level = lj_lib_checkint(L, 1);[m
[31m-    if (level == 0) {[m
[31m-      /* NOBARRIER: A thread (i.e. L) is never black. */[m
[31m-      setgcref(L->env, obj2gco(t));[m
[31m-      return 0;[m
[31m-    }[m
[31m-    o = lj_debug_frame(L, level, &level);[m
[31m-    if (o == NULL)[m
[31m-      lj_err_arg(L, 1, LJ_ERR_INVLVL);[m
[31m-    if (LJ_FR2) o--;[m
[31m-  }[m
[31m-  fn = &gcval(o)->fn;[m
[31m-  if (!isluafunc(fn))[m
[31m-    lj_err_caller(L, LJ_ERR_SETFENV);[m
[31m-  setgcref(fn->l.env, obj2gco(t));[m
[31m-  lj_gc_objbarrier(L, obj2gco(fn), t);[m
[31m-  setfuncV(L, L->top++, fn);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(rawget)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 1);[m
[31m-  lj_lib_checkany(L, 2);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(rawset)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 1);[m
[31m-  lj_lib_checkany(L, 2);[m
[31m-  L->top = 1+lj_lib_checkany(L, 3);[m
[31m-  lua_rawset(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(rawequal)		LJLIB_REC(.)[m
[31m-{[m
[31m-  cTValue *o1 = lj_lib_checkany(L, 1);[m
[31m-  cTValue *o2 = lj_lib_checkany(L, 2);[m
[31m-  setboolV(L->top-1, lj_obj_equal(o1, o2));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#if LJ_52[m
[31m-LJLIB_CF(rawlen)		LJLIB_REC(.)[m
[31m-{[m
[31m-  cTValue *o = L->base;[m
[31m-  int32_t len;[m
[31m-  if (L->top > o && tvisstr(o))[m
[31m-    len = (int32_t)strV(o)->len;[m
[31m-  else[m
[31m-    len = (int32_t)lj_tab_len(lj_lib_checktab(L, 1));[m
[31m-  setintV(L->top-1, len);[m
[31m-  return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_CF(unpack)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  int32_t n, i = lj_lib_optint(L, 2, 1);[m
[31m-  int32_t e = (L->base+3-1 < L->top && !tvisnil(L->base+3-1)) ?[m
[31m-	      lj_lib_checkint(L, 3) : (int32_t)lj_tab_len(t);[m
[31m-  if (i > e) return 0;[m
[31m-  n = e - i + 1;[m
[31m-  if (n <= 0 || !lua_checkstack(L, n))[m
[31m-    lj_err_caller(L, LJ_ERR_UNPACK);[m
[31m-  do {[m
[31m-    cTValue *tv = lj_tab_getint(t, i);[m
[31m-    if (tv) {[m
[31m-      copyTV(L, L->top++, tv);[m
[31m-    } else {[m
[31m-      setnilV(L->top++);[m
[31m-    }[m
[31m-  } while (i++ < e);[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(select)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int32_t n = (int32_t)(L->top - L->base);[m
[31m-  if (n >= 1 && tvisstr(L->base) && *strVdata(L->base) == '#') {[m
[31m-    setintV(L->top-1, n-1);[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    int32_t i = lj_lib_checkint(L, 1);[m
[31m-    if (i < 0) i = n + i; else if (i > n) i = n;[m
[31m-    if (i < 1)[m
[31m-      lj_err_arg(L, 1, LJ_ERR_IDXRNG);[m
[31m-    return n - i;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: conversions ------------------------------------------- */[m
[31m-[m
[31m-LJLIB_ASM(tonumber)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int32_t base = lj_lib_optint(L, 2, 10);[m
[31m-  if (base == 10) {[m
[31m-    TValue *o = lj_lib_checkany(L, 1);[m
[31m-    if (lj_strscan_numberobj(o)) {[m
[31m-      copyTV(L, L->base-1-LJ_FR2, o);[m
[31m-      return FFH_RES(1);[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (tviscdata(o)) {[m
[31m-      CTState *cts = ctype_cts(L);[m
[31m-      CType *ct = lj_ctype_rawref(cts, cdataV(o)->ctypeid);[m
[31m-      if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-      if (ctype_isnum(ct->info) || ctype_iscomplex(ct->info)) {[m
[31m-	if (LJ_DUALNUM && ctype_isinteger_or_bool(ct->info) &&[m
[31m-	    ct->size <= 4 && !(ct->size == 4 && (ct->info & CTF_UNSIGNED))) {[m
[31m-	  int32_t i;[m
[31m-	  lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT32), (uint8_t *)&i, o, 0);[m
[31m-	  setintV(L->base-1-LJ_FR2, i);[m
[31m-	  return FFH_RES(1);[m
[31m-	}[m
[31m-	lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE),[m
[31m-		       (uint8_t *)&(L->base-1-LJ_FR2)->n, o, 0);[m
[31m-	return FFH_RES(1);[m
[31m-      }[m
[31m-    }[m
[31m-#endif[m
[31m-  } else {[m
[31m-    const char *p = strdata(lj_lib_checkstr(L, 1));[m
[31m-    char *ep;[m
[31m-    unsigned long ul;[m
[31m-    if (base < 2 || base > 36)[m
[31m-      lj_err_arg(L, 2, LJ_ERR_BASERNG);[m
[31m-    ul = strtoul(p, &ep, base);[m
[31m-    if (p != ep) {[m
[31m-      while (lj_char_isspace((unsigned char)(*ep))) ep++;[m
[31m-      if (*ep == '\0') {[m
[31m-	if (LJ_DUALNUM && LJ_LIKELY(ul < 0x80000000u))[m
[31m-	  setintV(L->base-1-LJ_FR2, (int32_t)ul);[m
[31m-	else[m
[31m-	  setnumV(L->base-1-LJ_FR2, (lua_Number)ul);[m
[31m-	return FFH_RES(1);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  setnilV(L->base-1-LJ_FR2);[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(tostring)		LJLIB_REC(.)[m
[31m-{[m
[31m-  TValue *o = lj_lib_checkany(L, 1);[m
[31m-  cTValue *mo;[m
[31m-  L->top = o+1;  /* Only keep one argument. */[m
[31m-  if (!tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) {[m
[31m-    copyTV(L, L->base-1-LJ_FR2, mo);  /* Replace callable. */[m
[31m-    return FFH_TAILCALL;[m
[31m-  }[m
[31m-  lj_gc_check(L);[m
[31m-  setstrV(L, L->base-1-LJ_FR2, lj_strfmt_obj(L, L->base));[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: throw and catch errors -------------------------------- */[m
[31m-[m
[31m-LJLIB_CF(error)[m
[31m-{[m
[31m-  int32_t level = lj_lib_optint(L, 2, 1);[m
[31m-  lua_settop(L, 1);[m
[31m-  if (lua_isstring(L, 1) && level > 0) {[m
[31m-    luaL_where(L, level);[m
[31m-    lua_pushvalue(L, 1);[m
[31m-    lua_concat(L, 2);[m
[31m-  }[m
[31m-  return lua_error(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(pcall)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checkany(L, 1);[m
[31m-  lj_lib_checkfunc(L, 2);  /* For xpcall only. */[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-LJLIB_ASM_(xpcall)		LJLIB_REC(.)[m
[31m-[m
[31m-/* -- Base library: load Lua code ----------------------------------------- */[m
[31m-[m
[31m-static int load_aux(lua_State *L, int status, int envarg)[m
[31m-{[m
[31m-  if (status == 0) {[m
[31m-    if (tvistab(L->base+envarg-1)) {[m
[31m-      GCfunc *fn = funcV(L->top-1);[m
[31m-      GCtab *t = tabV(L->base+envarg-1);[m
[31m-      setgcref(fn->c.env, obj2gco(t));[m
[31m-      lj_gc_objbarrier(L, fn, t);[m
[31m-    }[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    setnilV(L->top-2);[m
[31m-    return 2;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(loadfile)[m
[31m-{[m
[31m-  GCstr *fname = lj_lib_optstr(L, 1);[m
[31m-  GCstr *mode = lj_lib_optstr(L, 2);[m
[31m-  int status;[m
[31m-  lua_settop(L, 3);  /* Ensure env arg exists. */[m
[31m-  status = luaL_loadfilex(L, fname ? strdata(fname) : NULL,[m
[31m-			  mode ? strdata(mode) : NULL);[m
[31m-  return load_aux(L, status, 3);[m
[31m-}[m
[31m-[m
[31m-static const char *reader_func(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-  UNUSED(ud);[m
[31m-  luaL_checkstack(L, 2, "too many nested functions");[m
[31m-  copyTV(L, L->top++, L->base);[m
[31m-  lua_call(L, 0, 1);  /* Call user-supplied function. */[m
[31m-  L->top--;[m
[31m-  if (tvisnil(L->top)) {[m
[31m-    *size = 0;[m
[31m-    return NULL;[m
[31m-  } else if (tvisstr(L->top) || tvisnumber(L->top)) {[m
[31m-    copyTV(L, L->base+4, L->top);  /* Anchor string in reserved stack slot. */[m
[31m-    return lua_tolstring(L, 5, size);[m
[31m-  } else {[m
[31m-    lj_err_caller(L, LJ_ERR_RDRSTR);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(load)[m
[31m-{[m
[31m-  GCstr *name = lj_lib_optstr(L, 2);[m
[31m-  GCstr *mode = lj_lib_optstr(L, 3);[m
[31m-  int status;[m
[31m-  if (L->base < L->top && (tvisstr(L->base) || tvisnumber(L->base))) {[m
[31m-    GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-    lua_settop(L, 4);  /* Ensure env arg exists. */[m
[31m-    status = luaL_loadbufferx(L, strdata(s), s->len, strdata(name ? name : s),[m
[31m-			      mode ? strdata(mode) : NULL);[m
[31m-  } else {[m
[31m-    lj_lib_checkfunc(L, 1);[m
[31m-    lua_settop(L, 5);  /* Reserve a slot for the string from the reader. */[m
[31m-    status = lua_loadx(L, reader_func, NULL, name ? strdata(name) : "=(load)",[m
[31m-		       mode ? strdata(mode) : NULL);[m
[31m-  }[m
[31m-  return load_aux(L, status, 4);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(loadstring)[m
[31m-{[m
[31m-  return lj_cf_load(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(dofile)[m
[31m-{[m
[31m-  GCstr *fname = lj_lib_optstr(L, 1);[m
[31m-  setnilV(L->top);[m
[31m-  L->top = L->base+1;[m
[31m-  if (luaL_loadfile(L, fname ? strdata(fname) : NULL) != 0)[m
[31m-    lua_error(L);[m
[31m-  lua_call(L, 0, LUA_MULTRET);[m
[31m-  return (int)(L->top - L->base) - 1;[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: GC control -------------------------------------------- */[m
[31m-[m
[31m-LJLIB_CF(gcinfo)[m
[31m-{[m
[31m-  setintV(L->top++, (int32_t)(G(L)->gc.total >> 10));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(collectgarbage)[m
[31m-{[m
[31m-  int opt = lj_lib_checkopt(L, 1, LUA_GCCOLLECT,  /* ORDER LUA_GC* */[m
[31m-    "\4stop\7restart\7collect\5count\1\377\4step\10setpause\12setstepmul\1\377\11isrunning");[m
[31m-  int32_t data = lj_lib_optint(L, 2, 0);[m
[31m-  if (opt == LUA_GCCOUNT) {[m
[31m-    setnumV(L->top, (lua_Number)G(L)->gc.total/1024.0);[m
[31m-  } else {[m
[31m-    int res = lua_gc(L, opt, data);[m
[31m-    if (opt == LUA_GCSTEP || opt == LUA_GCISRUNNING)[m
[31m-      setboolV(L->top, res);[m
[31m-    else[m
[31m-      setintV(L->top, res);[m
[31m-  }[m
[31m-  L->top++;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* -- Base library: miscellaneous functions ------------------------------- */[m
[31m-[m
[31m-LJLIB_PUSH(top-2)  /* Upvalue holds weak table. */[m
[31m-LJLIB_CF(newproxy)[m
[31m-{[m
[31m-  lua_settop(L, 1);[m
[31m-  lua_newuserdata(L, 0);[m
[31m-  if (lua_toboolean(L, 1) == 0) {  /* newproxy(): without metatable. */[m
[31m-    return 1;[m
[31m-  } else if (lua_isboolean(L, 1)) {  /* newproxy(true): with metatable. */[m
[31m-    lua_newtable(L);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_rawset(L, lua_upvalueindex(1));  /* Remember mt in weak table. */[m
[31m-  } else {  /* newproxy(proxy): inherit metatable. */[m
[31m-    int validproxy = 0;[m
[31m-    if (lua_getmetatable(L, 1)) {[m
[31m-      lua_rawget(L, lua_upvalueindex(1));[m
[31m-      validproxy = lua_toboolean(L, -1);[m
[31m-      lua_pop(L, 1);[m
[31m-    }[m
[31m-    if (!validproxy)[m
[31m-      lj_err_arg(L, 1, LJ_ERR_NOPROXY);[m
[31m-    lua_getmetatable(L, 1);[m
[31m-  }[m
[31m-  lua_setmetatable(L, 2);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH("tostring")[m
[31m-LJLIB_CF(print)[m
[31m-{[m
[31m-  ptrdiff_t i, nargs = L->top - L->base;[m
[31m-  cTValue *tv = lj_tab_getstr(tabref(L->env), strV(lj_lib_upvalue(L, 1)));[m
[31m-  int shortcut;[m
[31m-  if (tv && !tvisnil(tv)) {[m
[31m-    copyTV(L, L->top++, tv);[m
[31m-  } else {[m
[31m-    setstrV(L, L->top++, strV(lj_lib_upvalue(L, 1)));[m
[31m-    lua_gettable(L, LUA_GLOBALSINDEX);[m
[31m-    tv = L->top-1;[m
[31m-  }[m
[31m-  shortcut = (tvisfunc(tv) && funcV(tv)->c.ffid == FF_tostring);[m
[31m-  for (i = 0; i < nargs; i++) {[m
[31m-    cTValue *o = &L->base[i];[m
[31m-    const char *str;[m
[31m-    size_t size;[m
[31m-    MSize len;[m
[31m-    if (shortcut && (str = lj_strfmt_wstrnum(L, o, &len)) != NULL) {[m
[31m-      size = len;[m
[31m-    } else {[m
[31m-      copyTV(L, L->top+1, o);[m
[31m-      copyTV(L, L->top, L->top-1);[m
[31m-      L->top += 2;[m
[31m-      lua_call(L, 1, 1);[m
[31m-      str = lua_tolstring(L, -1, &size);[m
[31m-      if (!str)[m
[31m-	lj_err_caller(L, LJ_ERR_PRTOSTR);[m
[31m-      L->top--;[m
[31m-    }[m
[31m-    if (i)[m
[31m-      putchar('\t');[m
[31m-    fwrite(str, 1, size, stdout);[m
[31m-  }[m
[31m-  putchar('\n');[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-3)[m
[31m-LJLIB_SET(_VERSION)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- Coroutine library --------------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_coroutine[m
[31m-[m
[31m-LJLIB_CF(coroutine_status)[m
[31m-{[m
[31m-  const char *s;[m
[31m-  lua_State *co;[m
[31m-  if (!(L->top > L->base && tvisthread(L->base)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_NOCORO);[m
[31m-  co = threadV(L->base);[m
[31m-  if (co == L) s = "running";[m
[31m-  else if (co->status == LUA_YIELD) s = "suspended";[m
[31m-  else if (co->status != 0) s = "dead";[m
[31m-  else if (co->base > tvref(co->stack)+1+LJ_FR2) s = "normal";[m
[31m-  else if (co->top == co->base) s = "dead";[m
[31m-  else s = "suspended";[m
[31m-  lua_pushstring(L, s);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(coroutine_running)[m
[31m-{[m
[31m-#if LJ_52[m
[31m-  int ismain = lua_pushthread(L);[m
[31m-  setboolV(L->top++, ismain);[m
[31m-  return 2;[m
[31m-#else[m
[31m-  if (lua_pushthread(L))[m
[31m-    setnilV(L->top++);[m
[31m-  return 1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(coroutine_create)[m
[31m-{[m
[31m-  lua_State *L1;[m
[31m-  if (!(L->base < L->top && tvisfunc(L->base)))[m
[31m-    lj_err_argt(L, 1, LUA_TFUNCTION);[m
[31m-  L1 = lua_newthread(L);[m
[31m-  setfuncV(L, L1->top++, funcV(L->base));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(coroutine_yield)[m
[31m-{[m
[31m-  lj_err_caller(L, LJ_ERR_CYIELD);[m
[31m-  return FFH_UNREACHABLE;[m
[31m-}[m
[31m-[m
[31m-static int ffh_resume(lua_State *L, lua_State *co, int wrap)[m
[31m-{[m
[31m-  if (co->cframe != NULL || co->status > LUA_YIELD ||[m
[31m-      (co->status == 0 && co->top == co->base)) {[m
[31m-    ErrMsg em = co->cframe ? LJ_ERR_CORUN : LJ_ERR_CODEAD;[m
[31m-    if (wrap) lj_err_caller(L, em);[m
[31m-    setboolV(L->base-1-LJ_FR2, 0);[m
[31m-    setstrV(L, L->base-LJ_FR2, lj_err_str(L, em));[m
[31m-    return FFH_RES(2);[m
[31m-  }[m
[31m-  lj_state_growstack(co, (MSize)(L->top - L->base));[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(coroutine_resume)[m
[31m-{[m
[31m-  if (!(L->top > L->base && tvisthread(L->base)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_NOCORO);[m
[31m-  return ffh_resume(L, threadV(L->base), 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_NOREG LJLIB_ASM(coroutine_wrap_aux)[m
[31m-{[m
[31m-  return ffh_resume(L, threadV(lj_lib_upvalue(L, 1)), 1);[m
[31m-}[m
[31m-[m
[31m-/* Inline declarations. */[m
[31m-LJ_ASMF void lj_ff_coroutine_wrap_aux(void);[m
[31m-#if !(LJ_TARGET_MIPS && defined(ljamalg_c))[m
[31m-LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L,[m
[31m-							  lua_State *co);[m
[31m-#endif[m
[31m-[m
[31m-/* Error handler, called from assembler VM. */[m
[31m-void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L, lua_State *co)[m
[31m-{[m
[31m-  co->top--; copyTV(L, L->top, co->top); L->top++;[m
[31m-  if (tvisstr(L->top-1))[m
[31m-    lj_err_callermsg(L, strVdata(L->top-1));[m
[31m-  else[m
[31m-    lj_err_run(L);[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static void setpc_wrap_aux(lua_State *L, GCfunc *fn);[m
[31m-[m
[31m-LJLIB_CF(coroutine_wrap)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  lj_cf_coroutine_create(L);[m
[31m-  fn = lj_lib_pushcc(L, lj_ffh_coroutine_wrap_aux, FF_coroutine_wrap_aux, 1);[m
[31m-  setpc_wrap_aux(L, fn);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* Fix the PC of wrap_aux. Really ugly workaround. */[m
[31m-static void setpc_wrap_aux(lua_State *L, GCfunc *fn)[m
[31m-{[m
[31m-  setmref(fn->c.pc, &L2GG(L)->bcff[lj_lib_init_coroutine[1]+2]);[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void newproxy_weaktable(lua_State *L)[m
[31m-{[m
[31m-  /* NOBARRIER: The table is new (marked white). */[m
[31m-  GCtab *t = lj_tab_new(L, 0, 1);[m
[31m-  settabV(L, L->top++, t);[m
[31m-  setgcref(t->metatable, obj2gco(t));[m
[31m-  setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")),[m
[31m-	    lj_str_newlit(L, "kv"));[m
[31m-  t->nomm = (uint8_t)(~(1u<<MM_mode));[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaopen_base(lua_State *L)[m
[31m-{[m
[31m-  /* NOBARRIER: Table and value are the same. */[m
[31m-  GCtab *env = tabref(L->env);[m
[31m-  settabV(L, lj_tab_setstr(L, env, lj_str_newlit(L, "_G")), env);[m
[31m-  lua_pushliteral(L, LUA_VERSION);  /* top-3. */[m
[31m-  newproxy_weaktable(L);  /* top-2. */[m
[31m-  LJ_LIB_REG(L, "_G", base);[m
[31m-  LJ_LIB_REG(L, LUA_COLIBNAME, coroutine);[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_bit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_bit.c[m
[1mdeleted file mode 100644[m
[1mindex 1344d24..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_bit.c[m
[1m+++ /dev/null[m
[36m@@ -1,180 +0,0 @@[m
[31m-/*[m
[31m-** Bit manipulation library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_bit_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_carith.h"[m
[31m-#endif[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_bit[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static int bit_result64(lua_State *L, CTypeID id, uint64_t x)[m
[31m-{[m
[31m-  GCcdata *cd = lj_cdata_new_(L, id, 8);[m
[31m-  *(uint64_t *)cdataptr(cd) = x;[m
[31m-  setcdataV(L, L->base-1-LJ_FR2, cd);[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-#else[m
[31m-static int32_t bit_checkbit(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && lj_strscan_numberobj(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else {[m
[31m-    int32_t i = lj_num2bit(numV(o));[m
[31m-    if (LJ_DUALNUM) setintV(o, i);[m
[31m-    return i;[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_ASM(bit_tobit)		LJLIB_REC(bit_tobit)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0;[m
[31m-  setintV(L->base-1-LJ_FR2, (int32_t)lj_carith_check64(L, 1, &id));[m
[31m-  return FFH_RES(1);[m
[31m-#else[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(bit_bnot)		LJLIB_REC(bit_unary IR_BNOT)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0;[m
[31m-  uint64_t x = lj_carith_check64(L, 1, &id);[m
[31m-  return id ? bit_result64(L, id, ~x) : FFH_RETRY;[m
[31m-#else[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(bit_bswap)		LJLIB_REC(bit_unary IR_BSWAP)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0;[m
[31m-  uint64_t x = lj_carith_check64(L, 1, &id);[m
[31m-  return id ? bit_result64(L, id, lj_bswap64(x)) : FFH_RETRY;[m
[31m-#else[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(bit_lshift)		LJLIB_REC(bit_shift IR_BSHL)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0, id2 = 0;[m
[31m-  uint64_t x = lj_carith_check64(L, 1, &id);[m
[31m-  int32_t sh = (int32_t)lj_carith_check64(L, 2, &id2);[m
[31m-  if (id) {[m
[31m-    x = lj_carith_shift64(x, sh, curr_func(L)->c.ffid - (int)FF_bit_lshift);[m
[31m-    return bit_result64(L, id, x);[m
[31m-  }[m
[31m-  if (id2) setintV(L->base+1, sh);[m
[31m-  return FFH_RETRY;[m
[31m-#else[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  bit_checkbit(L, 2);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-LJLIB_ASM_(bit_rshift)		LJLIB_REC(bit_shift IR_BSHR)[m
[31m-LJLIB_ASM_(bit_arshift)		LJLIB_REC(bit_shift IR_BSAR)[m
[31m-LJLIB_ASM_(bit_rol)		LJLIB_REC(bit_shift IR_BROL)[m
[31m-LJLIB_ASM_(bit_ror)		LJLIB_REC(bit_shift IR_BROR)[m
[31m-[m
[31m-LJLIB_ASM(bit_band)		LJLIB_REC(bit_nary IR_BAND)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0;[m
[31m-  TValue *o = L->base, *top = L->top;[m
[31m-  int i = 0;[m
[31m-  do { lj_carith_check64(L, ++i, &id); } while (++o < top);[m
[31m-  if (id) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    int op = curr_func(L)->c.ffid - (int)FF_bit_bor;[m
[31m-    uint64_t x, y = op >= 0 ? 0 : ~(uint64_t)0;[m
[31m-    o = L->base;[m
[31m-    do {[m
[31m-      lj_cconv_ct_tv(cts, ct, (uint8_t *)&x, o, 0);[m
[31m-      if (op < 0) y &= x; else if (op == 0) y |= x; else y ^= x;[m
[31m-    } while (++o < top);[m
[31m-    return bit_result64(L, id, y);[m
[31m-  }[m
[31m-  return FFH_RETRY;[m
[31m-#else[m
[31m-  int i = 0;[m
[31m-  do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top);[m
[31m-  return FFH_RETRY;[m
[31m-#endif[m
[31m-}[m
[31m-LJLIB_ASM_(bit_bor)		LJLIB_REC(bit_nary IR_BOR)[m
[31m-LJLIB_ASM_(bit_bxor)		LJLIB_REC(bit_nary IR_BXOR)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-LJLIB_CF(bit_tohex)		LJLIB_REC(.)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  CTypeID id = 0, id2 = 0;[m
[31m-  uint64_t b = lj_carith_check64(L, 1, &id);[m
[31m-  int32_t n = L->base+1>=L->top ? (id ? 16 : 8) :[m
[31m-				  (int32_t)lj_carith_check64(L, 2, &id2);[m
[31m-#else[m
[31m-  uint32_t b = (uint32_t)bit_checkbit(L, 1);[m
[31m-  int32_t n = L->base+1>=L->top ? 8 : bit_checkbit(L, 2);[m
[31m-#endif[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  SFormat sf = (STRFMT_UINT|STRFMT_T_HEX);[m
[31m-  if (n < 0) { n = -n; sf |= STRFMT_F_UPPER; }[m
[31m-  sf |= ((SFormat)((n+1)&255) << STRFMT_SH_PREC);[m
[31m-#if LJ_HASFFI[m
[31m-  if (n < 16) b &= ((uint64_t)1 << 4*n)-1;[m
[31m-#else[m
[31m-  if (n < 8) b &= (1u << 4*n)-1;[m
[31m-#endif[m
[31m-  sb = lj_strfmt_putfxint(sb, sf, b);[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sb));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_bit(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, LUA_BITLIBNAME, bit);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_debug.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_debug.c[m
[1mdeleted file mode 100644[m
[1mindex cda7137..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_debug.c[m
[1m+++ /dev/null[m
[36m@@ -1,405 +0,0 @@[m
[31m-/*[m
[31m-** Debug library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_debug_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_debug[m
[31m-[m
[31m-LJLIB_CF(debug_getregistry)[m
[31m-{[m
[31m-  copyTV(L, L->top++, registry(L));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getmetatable)	LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checkany(L, 1);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    setnilV(L->top-1);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setmetatable)[m
[31m-{[m
[31m-  lj_lib_checktabornil(L, 2);[m
[31m-  L->top = L->base+2;[m
[31m-  lua_setmetatable(L, 1);[m
[31m-#if !LJ_52[m
[31m-  setboolV(L->top-1, 1);[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getfenv)[m
[31m-{[m
[31m-  lj_lib_checkany(L, 1);[m
[31m-  lua_getfenv(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setfenv)[m
[31m-{[m
[31m-  lj_lib_checktab(L, 2);[m
[31m-  L->top = L->base+2;[m
[31m-  if (!lua_setfenv(L, 1))[m
[31m-    lj_err_caller(L, LJ_ERR_SETFENV);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void settabss(lua_State *L, const char *i, const char *v)[m
[31m-{[m
[31m-  lua_pushstring(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-static void settabsi(lua_State *L, const char *i, int v)[m
[31m-{[m
[31m-  lua_pushinteger(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-static void settabsb(lua_State *L, const char *i, int v)[m
[31m-{[m
[31m-  lua_pushboolean(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-static lua_State *getthread(lua_State *L, int *arg)[m
[31m-{[m
[31m-  if (L->base < L->top && tvisthread(L->base)) {[m
[31m-    *arg = 1;[m
[31m-    return threadV(L->base);[m
[31m-  } else {[m
[31m-    *arg = 0;[m
[31m-    return L;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void treatstackoption(lua_State *L, lua_State *L1, const char *fname)[m
[31m-{[m
[31m-  if (L == L1) {[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_remove(L, -3);[m
[31m-  }[m
[31m-  else[m
[31m-    lua_xmove(L1, L, 1);[m
[31m-  lua_setfield(L, -2, fname);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getinfo)[m
[31m-{[m
[31m-  lj_Debug ar;[m
[31m-  int arg, opt_f = 0, opt_L = 0;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  const char *options = luaL_optstring(L, arg+2, "flnSu");[m
[31m-  if (lua_isnumber(L, arg+1)) {[m
[31m-    if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), (lua_Debug *)&ar)) {[m
[31m-      setnilV(L->top-1);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  } else if (L->base+arg < L->top && tvisfunc(L->base+arg)) {[m
[31m-    options = lua_pushfstring(L, ">%s", options);[m
[31m-    setfuncV(L1, L1->top++, funcV(L->base+arg));[m
[31m-  } else {[m
[31m-    lj_err_arg(L, arg+1, LJ_ERR_NOFUNCL);[m
[31m-  }[m
[31m-  if (!lj_debug_getinfo(L1, options, &ar, 1))[m
[31m-    lj_err_arg(L, arg+2, LJ_ERR_INVOPT);[m
[31m-  lua_createtable(L, 0, 16);  /* Create result table. */[m
[31m-  for (; *options; options++) {[m
[31m-    switch (*options) {[m
[31m-    case 'S':[m
[31m-      settabss(L, "source", ar.source);[m
[31m-      settabss(L, "short_src", ar.short_src);[m
[31m-      settabsi(L, "linedefined", ar.linedefined);[m
[31m-      settabsi(L, "lastlinedefined", ar.lastlinedefined);[m
[31m-      settabss(L, "what", ar.what);[m
[31m-      break;[m
[31m-    case 'l':[m
[31m-      settabsi(L, "currentline", ar.currentline);[m
[31m-      break;[m
[31m-    case 'u':[m
[31m-      settabsi(L, "nups", ar.nups);[m
[31m-      settabsi(L, "nparams", ar.nparams);[m
[31m-      settabsb(L, "isvararg", ar.isvararg);[m
[31m-      break;[m
[31m-    case 'n':[m
[31m-      settabss(L, "name", ar.name);[m
[31m-      settabss(L, "namewhat", ar.namewhat);[m
[31m-      break;[m
[31m-    case 'f': opt_f = 1; break;[m
[31m-    case 'L': opt_L = 1; break;[m
[31m-    default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  if (opt_L) treatstackoption(L, L1, "activelines");[m
[31m-  if (opt_f) treatstackoption(L, L1, "func");[m
[31m-  return 1;  /* Return result table. */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getlocal)[m
[31m-{[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  const char *name;[m
[31m-  int slot = lj_lib_checkint(L, arg+2);[m
[31m-  if (tvisfunc(L->base+arg)) {[m
[31m-    L->top = L->base+arg+1;[m
[31m-    lua_pushstring(L, lua_getlocal(L, NULL, slot));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  if (!lua_getstack(L1, lj_lib_checkint(L, arg+1), &ar))[m
[31m-    lj_err_arg(L, arg+1, LJ_ERR_LVLRNG);[m
[31m-  name = lua_getlocal(L1, &ar, slot);[m
[31m-  if (name) {[m
[31m-    lua_xmove(L1, L, 1);[m
[31m-    lua_pushstring(L, name);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    return 2;[m
[31m-  } else {[m
[31m-    setnilV(L->top-1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setlocal)[m
[31m-{[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  TValue *tv;[m
[31m-  if (!lua_getstack(L1, lj_lib_checkint(L, arg+1), &ar))[m
[31m-    lj_err_arg(L, arg+1, LJ_ERR_LVLRNG);[m
[31m-  tv = lj_lib_checkany(L, arg+3);[m
[31m-  copyTV(L1, L1->top++, tv);[m
[31m-  lua_pushstring(L, lua_setlocal(L1, &ar, lj_lib_checkint(L, arg+2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int debug_getupvalue(lua_State *L, int get)[m
[31m-{[m
[31m-  int32_t n = lj_lib_checkint(L, 2);[m
[31m-  const char *name;[m
[31m-  lj_lib_checkfunc(L, 1);[m
[31m-  name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n);[m
[31m-  if (name) {[m
[31m-    lua_pushstring(L, name);[m
[31m-    if (!get) return 1;[m
[31m-    copyTV(L, L->top, L->top-2);[m
[31m-    L->top++;[m
[31m-    return 2;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_getupvalue)[m
[31m-{[m
[31m-  return debug_getupvalue(L, 1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setupvalue)[m
[31m-{[m
[31m-  lj_lib_checkany(L, 3);[m
[31m-  return debug_getupvalue(L, 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_upvalueid)[m
[31m-{[m
[31m-  GCfunc *fn = lj_lib_checkfunc(L, 1);[m
[31m-  int32_t n = lj_lib_checkint(L, 2) - 1;[m
[31m-  if ((uint32_t)n >= fn->l.nupvalues)[m
[31m-    lj_err_arg(L, 2, LJ_ERR_IDXRNG);[m
[31m-  setlightudV(L->top-1, isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :[m
[31m-					(void *)&fn->c.upvalue[n]);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_upvaluejoin)[m
[31m-{[m
[31m-  GCfunc *fn[2];[m
[31m-  GCRef *p[2];[m
[31m-  int i;[m
[31m-  for (i = 0; i < 2; i++) {[m
[31m-    int32_t n;[m
[31m-    fn[i] = lj_lib_checkfunc(L, 2*i+1);[m
[31m-    if (!isluafunc(fn[i]))[m
[31m-      lj_err_arg(L, 2*i+1, LJ_ERR_NOLFUNC);[m
[31m-    n = lj_lib_checkint(L, 2*i+2) - 1;[m
[31m-    if ((uint32_t)n >= fn[i]->l.nupvalues)[m
[31m-      lj_err_arg(L, 2*i+2, LJ_ERR_IDXRNG);[m
[31m-    p[i] = &fn[i]->l.uvptr[n];[m
[31m-  }[m
[31m-  setgcrefr(*p[0], *p[1]);[m
[31m-  lj_gc_objbarrier(L, fn[0], gcref(*p[1]));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#if LJ_52[m
[31m-LJLIB_CF(debug_getuservalue)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (o < L->top && tvisudata(o))[m
[31m-    settabV(L, o, tabref(udataV(o)->env));[m
[31m-  else[m
[31m-    setnilV(o);[m
[31m-  L->top = o+1;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_setuservalue)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (!(o < L->top && tvisudata(o)))[m
[31m-    lj_err_argt(L, 1, LUA_TUSERDATA);[m
[31m-  if (!(o+1 < L->top && tvistab(o+1)))[m
[31m-    lj_err_argt(L, 2, LUA_TTABLE);[m
[31m-  L->top = o+2;[m
[31m-  lua_setfenv(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static const char KEY_HOOK = 'h';[m
[31m-[m
[31m-static void hookf(lua_State *L, lua_Debug *ar)[m
[31m-{[m
[31m-  static const char *const hooknames[] =[m
[31m-    {"call", "return", "line", "count", "tail return"};[m
[31m-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-  lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-  if (lua_isfunction(L, -1)) {[m
[31m-    lua_pushstring(L, hooknames[(int)ar->event]);[m
[31m-    if (ar->currentline >= 0)[m
[31m-      lua_pushinteger(L, ar->currentline);[m
[31m-    else lua_pushnil(L);[m
[31m-    lua_call(L, 2, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int makemask(const char *smask, int count)[m
[31m-{[m
[31m-  int mask = 0;[m
[31m-  if (strchr(smask, 'c')) mask |= LUA_MASKCALL;[m
[31m-  if (strchr(smask, 'r')) mask |= LUA_MASKRET;[m
[31m-  if (strchr(smask, 'l')) mask |= LUA_MASKLINE;[m
[31m-  if (count > 0) mask |= LUA_MASKCOUNT;[m
[31m-  return mask;[m
[31m-}[m
[31m-[m
[31m-static char *unmakemask(int mask, char *smask)[m
[31m-{[m
[31m-  int i = 0;[m
[31m-  if (mask & LUA_MASKCALL) smask[i++] = 'c';[m
[31m-  if (mask & LUA_MASKRET) smask[i++] = 'r';[m
[31m-  if (mask & LUA_MASKLINE) smask[i++] = 'l';[m
[31m-  smask[i] = '\0';[m
[31m-  return smask;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_sethook)[m
[31m-{[m
[31m-  int arg, mask, count;[m
[31m-  lua_Hook func;[m
[31m-  (void)getthread(L, &arg);[m
[31m-  if (lua_isnoneornil(L, arg+1)) {[m
[31m-    lua_settop(L, arg+1);[m
[31m-    func = NULL; mask = 0; count = 0;  /* turn off hooks */[m
[31m-  } else {[m
[31m-    const char *smask = luaL_checkstring(L, arg+2);[m
[31m-    luaL_checktype(L, arg+1, LUA_TFUNCTION);[m
[31m-    count = luaL_optint(L, arg+3, 0);[m
[31m-    func = hookf; mask = makemask(smask, count);[m
[31m-  }[m
[31m-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-  lua_pushvalue(L, arg+1);[m
[31m-  lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-  lua_sethook(L, func, mask, count);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(debug_gethook)[m
[31m-{[m
[31m-  char buff[5];[m
[31m-  int mask = lua_gethookmask(L);[m
[31m-  lua_Hook hook = lua_gethook(L);[m
[31m-  if (hook != NULL && hook != hookf) {  /* external hook? */[m
[31m-    lua_pushliteral(L, "external hook");[m
[31m-  } else {[m
[31m-    lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);   /* get hook */[m
[31m-  }[m
[31m-  lua_pushstring(L, unmakemask(mask, buff));[m
[31m-  lua_pushinteger(L, lua_gethookcount(L));[m
[31m-  return 3;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-LJLIB_CF(debug_debug)[m
[31m-{[m
[31m-  for (;;) {[m
[31m-    char buffer[250];[m
[31m-    fputs("lua_debug> ", stderr);[m
[31m-    if (fgets(buffer, sizeof(buffer), stdin) == 0 ||[m
[31m-	strcmp(buffer, "cont\n") == 0)[m
[31m-      return 0;[m
[31m-    if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||[m
[31m-	lua_pcall(L, 0, 0, 0)) {[m
[31m-      fputs(lua_tostring(L, -1), stderr);[m
[31m-      fputs("\n", stderr);[m
[31m-    }[m
[31m-    lua_settop(L, 0);  /* remove eventual returns */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LEVELS1	12	/* size of the first part of the stack */[m
[31m-#define LEVELS2	10	/* size of the second part of the stack */[m
[31m-[m
[31m-LJLIB_CF(debug_traceback)[m
[31m-{[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  const char *msg = lua_tostring(L, arg+1);[m
[31m-  if (msg == NULL && L->top > L->base+arg)[m
[31m-    L->top = L->base+arg+1;[m
[31m-  else[m
[31m-    luaL_traceback(L, L1, msg, lj_lib_optint(L, arg+2, (L == L1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_debug(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, LUA_DBLIBNAME, debug);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_ffi.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_ffi.c[m
[1mdeleted file mode 100644[m
[1mindex 1feee21..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_ffi.c[m
[1m+++ /dev/null[m
[36m@@ -1,869 +0,0 @@[m
[31m-/*[m
[31m-** FFI library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_ffi_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include <errno.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cparse.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_carith.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#include "lj_ccallback.h"[m
[31m-#include "lj_clib.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* -- C type checks ------------------------------------------------------- */[m
[31m-[m
[31m-/* Check first argument for a C type and returns its ID. */[m
[31m-static CTypeID ffi_checkctype(lua_State *L, CTState *cts, TValue *param)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (!(o < L->top)) {[m
[31m-  err_argtype:[m
[31m-    lj_err_argtype(L, 1, "C type");[m
[31m-  }[m
[31m-  if (tvisstr(o)) {  /* Parse an abstract C type declaration. */[m
[31m-    GCstr *s = strV(o);[m
[31m-    CPState cp;[m
[31m-    int errcode;[m
[31m-    cp.L = L;[m
[31m-    cp.cts = cts;[m
[31m-    cp.srcname = strdata(s);[m
[31m-    cp.p = strdata(s);[m
[31m-    cp.param = param;[m
[31m-    cp.mode = CPARSE_MODE_ABSTRACT|CPARSE_MODE_NOIMPLICIT;[m
[31m-    errcode = lj_cparse(&cp);[m
[31m-    if (errcode) lj_err_throw(L, errcode);  /* Propagate errors. */[m
[31m-    return cp.val.id;[m
[31m-  } else {[m
[31m-    GCcdata *cd;[m
[31m-    if (!tviscdata(o)) goto err_argtype;[m
[31m-    if (param && param < L->top) lj_err_arg(L, 1, LJ_ERR_FFI_NUMPARAM);[m
[31m-    cd = cdataV(o);[m
[31m-    return cd->ctypeid == CTID_CTYPEID ? *(CTypeID *)cdataptr(cd) : cd->ctypeid;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Check argument for C data and return it. */[m
[31m-static GCcdata *ffi_checkcdata(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && tviscdata(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TCDATA);[m
[31m-  return cdataV(o);[m
[31m-}[m
[31m-[m
[31m-/* Convert argument to C pointer. */[m
[31m-static void *ffi_checkptr(lua_State *L, int narg, CTypeID id)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  void *p;[m
[31m-  if (o >= L->top)[m
[31m-    lj_err_arg(L, narg, LJ_ERR_NOVAL);[m
[31m-  lj_cconv_ct_tv(cts, ctype_get(cts, id), (uint8_t *)&p, o, CCF_ARG(narg));[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Convert argument to int32_t. */[m
[31m-static int32_t ffi_checkint(lua_State *L, int narg)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  int32_t i;[m
[31m-  if (o >= L->top)[m
[31m-    lj_err_arg(L, narg, LJ_ERR_NOVAL);[m
[31m-  lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT32), (uint8_t *)&i, o,[m
[31m-		 CCF_ARG(narg));[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-/* -- C type metamethods -------------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_ffi_meta[m
[31m-[m
[31m-/* Handle ctype __index/__newindex metamethods. */[m
[31m-static int ffi_index_meta(lua_State *L, CTState *cts, CType *ct, MMS mm)[m
[31m-{[m
[31m-  CTypeID id = ctype_typeid(cts, ct);[m
[31m-  cTValue *tv = lj_ctype_meta(cts, id, mm);[m
[31m-  TValue *base = L->base;[m
[31m-  if (!tv) {[m
[31m-    const char *s;[m
[31m-  err_index:[m
[31m-    s = strdata(lj_ctype_repr(L, id, NULL));[m
[31m-    if (tvisstr(L->base+1)) {[m
[31m-      lj_err_callerv(L, LJ_ERR_FFI_BADMEMBER, s, strVdata(L->base+1));[m
[31m-    } else {[m
[31m-      const char *key = tviscdata(L->base+1) ?[m
[31m-	strdata(lj_ctype_repr(L, cdataV(L->base+1)->ctypeid, NULL)) :[m
[31m-	lj_typename(L->base+1);[m
[31m-      lj_err_callerv(L, LJ_ERR_FFI_BADIDXW, s, key);[m
[31m-    }[m
[31m-  }[m
[31m-  if (!tvisfunc(tv)) {[m
[31m-    if (mm == MM_index) {[m
[31m-      cTValue *o = lj_meta_tget(L, tv, base+1);[m
[31m-      if (o) {[m
[31m-	if (tvisnil(o)) goto err_index;[m
[31m-	copyTV(L, L->top-1, o);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    } else {[m
[31m-      TValue *o = lj_meta_tset(L, tv, base+1);[m
[31m-      if (o) {[m
[31m-	copyTV(L, o, base+2);[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    copyTV(L, base, L->top);[m
[31m-    tv = L->top-1-LJ_FR2;[m
[31m-  }[m
[31m-  return lj_meta_tailcall(L, tv);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___index)	LJLIB_REC(cdata_index 0)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTInfo qual = 0;[m
[31m-  CType *ct;[m
[31m-  uint8_t *p;[m
[31m-  TValue *o = L->base;[m
[31m-  if (!(o+1 < L->top && tviscdata(o)))  /* Also checks for presence of key. */[m
[31m-    lj_err_argt(L, 1, LUA_TCDATA);[m
[31m-  ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual);[m
[31m-  if ((qual & 1))[m
[31m-    return ffi_index_meta(L, cts, ct, MM_index);[m
[31m-  if (lj_cdata_get(cts, ct, L->top-1, p))[m
[31m-    lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___newindex)	LJLIB_REC(cdata_index 1)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTInfo qual = 0;[m
[31m-  CType *ct;[m
[31m-  uint8_t *p;[m
[31m-  TValue *o = L->base;[m
[31m-  if (!(o+2 < L->top && tviscdata(o)))  /* Also checks for key and value. */[m
[31m-    lj_err_argt(L, 1, LUA_TCDATA);[m
[31m-  ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual);[m
[31m-  if ((qual & 1)) {[m
[31m-    if ((qual & CTF_CONST))[m
[31m-      lj_err_caller(L, LJ_ERR_FFI_WRCONST);[m
[31m-    return ffi_index_meta(L, cts, ct, MM_newindex);[m
[31m-  }[m
[31m-  lj_cdata_set(cts, ct, p, o+2, qual);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Common handler for cdata arithmetic. */[m
[31m-static int ffi_arith(lua_State *L)[m
[31m-{[m
[31m-  MMS mm = (MMS)(curr_func(L)->c.ffid - (int)FF_ffi_meta___eq + (int)MM_eq);[m
[31m-  return lj_carith_op(L, mm);[m
[31m-}[m
[31m-[m
[31m-/* The following functions must be in contiguous ORDER MM. */[m
[31m-LJLIB_CF(ffi_meta___eq)		LJLIB_REC(cdata_arith MM_eq)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___len)	LJLIB_REC(cdata_arith MM_len)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___lt)		LJLIB_REC(cdata_arith MM_lt)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___le)		LJLIB_REC(cdata_arith MM_le)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___concat)	LJLIB_REC(cdata_arith MM_concat)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static int lj_cf_ffi_new(lua_State *L);[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___call)	LJLIB_REC(cdata_call)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  GCcdata *cd = ffi_checkcdata(L, 1);[m
[31m-  CTypeID id = cd->ctypeid;[m
[31m-  CType *ct;[m
[31m-  cTValue *tv;[m
[31m-  MMS mm = MM_call;[m
[31m-  if (cd->ctypeid == CTID_CTYPEID) {[m
[31m-    id = *(CTypeID *)cdataptr(cd);[m
[31m-    mm = MM_new;[m
[31m-  } else {[m
[31m-    int ret = lj_ccall_func(L, cd);[m
[31m-    if (ret >= 0)[m
[31m-      return ret;[m
[31m-  }[m
[31m-  /* Handle ctype __call/__new metamethod. */[m
[31m-  ct = ctype_raw(cts, id);[m
[31m-  if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-  tv = lj_ctype_meta(cts, id, mm);[m
[31m-  if (tv)[m
[31m-    return lj_meta_tailcall(L, tv);[m
[31m-  else if (mm == MM_call)[m
[31m-    lj_err_callerv(L, LJ_ERR_FFI_BADCALL, strdata(lj_ctype_repr(L, id, NULL)));[m
[31m-  return lj_cf_ffi_new(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___add)	LJLIB_REC(cdata_arith MM_add)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___sub)	LJLIB_REC(cdata_arith MM_sub)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___mul)	LJLIB_REC(cdata_arith MM_mul)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___div)	LJLIB_REC(cdata_arith MM_div)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___mod)	LJLIB_REC(cdata_arith MM_mod)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___pow)	LJLIB_REC(cdata_arith MM_pow)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___unm)	LJLIB_REC(cdata_arith MM_unm)[m
[31m-{[m
[31m-  return ffi_arith(L);[m
[31m-}[m
[31m-/* End of contiguous ORDER MM. */[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___tostring)[m
[31m-{[m
[31m-  GCcdata *cd = ffi_checkcdata(L, 1);[m
[31m-  const char *msg = "cdata<%s>: %p";[m
[31m-  CTypeID id = cd->ctypeid;[m
[31m-  void *p = cdataptr(cd);[m
[31m-  if (id == CTID_CTYPEID) {[m
[31m-    msg = "ctype<%s>";[m
[31m-    id = *(CTypeID *)p;[m
[31m-  } else {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    CType *ct = ctype_raw(cts, id);[m
[31m-    if (ctype_isref(ct->info)) {[m
[31m-      p = *(void **)p;[m
[31m-      ct = ctype_rawchild(cts, ct);[m
[31m-    }[m
[31m-    if (ctype_iscomplex(ct->info)) {[m
[31m-      setstrV(L, L->top-1, lj_ctype_repr_complex(L, cdataptr(cd), ct->size));[m
[31m-      goto checkgc;[m
[31m-    } else if (ct->size == 8 && ctype_isinteger(ct->info)) {[m
[31m-      setstrV(L, L->top-1, lj_ctype_repr_int64(L, *(uint64_t *)cdataptr(cd),[m
[31m-					       (ct->info & CTF_UNSIGNED)));[m
[31m-      goto checkgc;[m
[31m-    } else if (ctype_isfunc(ct->info)) {[m
[31m-      p = *(void **)p;[m
[31m-    } else if (ctype_isenum(ct->info)) {[m
[31m-      msg = "cdata<%s>: %d";[m
[31m-      p = (void *)(uintptr_t)*(uint32_t **)p;[m
[31m-    } else {[m
[31m-      if (ctype_isptr(ct->info)) {[m
[31m-	p = cdata_getptr(p, ct->size);[m
[31m-	ct = ctype_rawchild(cts, ct);[m
[31m-      }[m
[31m-      if (ctype_isstruct(ct->info) || ctype_isvector(ct->info)) {[m
[31m-	/* Handle ctype __tostring metamethod. */[m
[31m-	cTValue *tv = lj_ctype_meta(cts, ctype_typeid(cts, ct), MM_tostring);[m
[31m-	if (tv)[m
[31m-	  return lj_meta_tailcall(L, tv);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lj_strfmt_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), p);[m
[31m-checkgc:[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int ffi_pairs(lua_State *L, MMS mm)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkcdata(L, 1)->ctypeid;[m
[31m-  CType *ct = ctype_raw(cts, id);[m
[31m-  cTValue *tv;[m
[31m-  if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-  tv = lj_ctype_meta(cts, id, mm);[m
[31m-  if (!tv)[m
[31m-    lj_err_callerv(L, LJ_ERR_FFI_BADMM, strdata(lj_ctype_repr(L, id, NULL)),[m
[31m-		   strdata(mmname_str(G(L), mm)));[m
[31m-  return lj_meta_tailcall(L, tv);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___pairs)[m
[31m-{[m
[31m-  return ffi_pairs(L, MM_pairs);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_meta___ipairs)[m
[31m-{[m
[31m-  return ffi_pairs(L, MM_ipairs);[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH("ffi") LJLIB_SET(__metatable)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- C library metamethods ----------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_ffi_clib[m
[31m-[m
[31m-/* Index C library by a name. */[m
[31m-static TValue *ffi_clib_index(lua_State *L)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  CLibrary *cl;[m
[31m-  if (!(o < L->top && tvisudata(o) && udataV(o)->udtype == UDTYPE_FFI_CLIB))[m
[31m-    lj_err_argt(L, 1, LUA_TUSERDATA);[m
[31m-  cl = (CLibrary *)uddata(udataV(o));[m
[31m-  if (!(o+1 < L->top && tvisstr(o+1)))[m
[31m-    lj_err_argt(L, 2, LUA_TSTRING);[m
[31m-  return lj_clib_index(L, cl, strV(o+1));[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_clib___index)	LJLIB_REC(clib_index 1)[m
[31m-{[m
[31m-  TValue *tv = ffi_clib_index(L);[m
[31m-  if (tviscdata(tv)) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    GCcdata *cd = cdataV(tv);[m
[31m-    CType *s = ctype_get(cts, cd->ctypeid);[m
[31m-    if (ctype_isextern(s->info)) {[m
[31m-      CTypeID sid = ctype_cid(s->info);[m
[31m-      void *sp = *(void **)cdataptr(cd);[m
[31m-      CType *ct = ctype_raw(cts, sid);[m
[31m-      if (lj_cconv_tv_ct(cts, ct, sid, L->top-1, sp))[m
[31m-	lj_gc_check(L);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  copyTV(L, L->top-1, tv);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_clib___newindex)	LJLIB_REC(clib_index 0)[m
[31m-{[m
[31m-  TValue *tv = ffi_clib_index(L);[m
[31m-  TValue *o = L->base+2;[m
[31m-  if (o < L->top && tviscdata(tv)) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    GCcdata *cd = cdataV(tv);[m
[31m-    CType *d = ctype_get(cts, cd->ctypeid);[m
[31m-    if (ctype_isextern(d->info)) {[m
[31m-      CTInfo qual = 0;[m
[31m-      for (;;) {  /* Skip attributes and collect qualifiers. */[m
[31m-	d = ctype_child(cts, d);[m
[31m-	if (!ctype_isattrib(d->info)) break;[m
[31m-	if (ctype_attrib(d->info) == CTA_QUAL) qual |= d->size;[m
[31m-      }[m
[31m-      if (!((d->info|qual) & CTF_CONST)) {[m
[31m-	lj_cconv_ct_tv(cts, d, *(void **)cdataptr(cd), o, 0);[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_caller(L, LJ_ERR_FFI_WRCONST);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_clib___gc)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (o < L->top && tvisudata(o) && udataV(o)->udtype == UDTYPE_FFI_CLIB)[m
[31m-    lj_clib_unload((CLibrary *)uddata(udataV(o)));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- Callback function metamethods --------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_ffi_callback[m
[31m-[m
[31m-static int ffi_callback_set(lua_State *L, GCfunc *fn)[m
[31m-{[m
[31m-  GCcdata *cd = ffi_checkcdata(L, 1);[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  if (ctype_isptr(ct->info) && (LJ_32 || ct->size == 8)) {[m
[31m-    MSize slot = lj_ccallback_ptr2slot(cts, *(void **)cdataptr(cd));[m
[31m-    if (slot < cts->cb.sizeid && cts->cb.cbid[slot] != 0) {[m
[31m-      GCtab *t = cts->miscmap;[m
[31m-      TValue *tv = lj_tab_setint(L, t, (int32_t)slot);[m
[31m-      if (fn) {[m
[31m-	setfuncV(L, tv, fn);[m
[31m-	lj_gc_anybarriert(L, t);[m
[31m-      } else {[m
[31m-	setnilV(tv);[m
[31m-	cts->cb.cbid[slot] = 0;[m
[31m-	cts->cb.topid = slot < cts->cb.topid ? slot : cts->cb.topid;[m
[31m-      }[m
[31m-      return 0;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_caller(L, LJ_ERR_FFI_BADCBACK);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_callback_free)[m
[31m-{[m
[31m-  return ffi_callback_set(L, NULL);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_callback_set)[m
[31m-{[m
[31m-  GCfunc *fn = lj_lib_checkfunc(L, 2);[m
[31m-  return ffi_callback_set(L, fn);[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-1) LJLIB_SET(__index)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- FFI library functions ----------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_ffi[m
[31m-[m
[31m-LJLIB_CF(ffi_cdef)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  CPState cp;[m
[31m-  int errcode;[m
[31m-  cp.L = L;[m
[31m-  cp.cts = ctype_cts(L);[m
[31m-  cp.srcname = strdata(s);[m
[31m-  cp.p = strdata(s);[m
[31m-  cp.param = L->base+1;[m
[31m-  cp.mode = CPARSE_MODE_MULTI|CPARSE_MODE_DIRECT;[m
[31m-  errcode = lj_cparse(&cp);[m
[31m-  if (errcode) lj_err_throw(L, errcode);  /* Propagate errors. */[m
[31m-  lj_gc_check(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_new)	LJLIB_REC(.)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  CType *ct = ctype_raw(cts, id);[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  TValue *o = L->base+1;[m
[31m-  GCcdata *cd;[m
[31m-  if ((info & CTF_VLA)) {[m
[31m-    o++;[m
[31m-    sz = lj_ctype_vlsize(cts, ct, (CTSize)ffi_checkint(L, 2));[m
[31m-  }[m
[31m-  if (sz == CTSIZE_INVALID)[m
[31m-    lj_err_arg(L, 1, LJ_ERR_FFI_INVSIZE);[m
[31m-  cd = lj_cdata_newx(cts, id, sz, info);[m
[31m-  setcdataV(L, o-1, cd);  /* Anchor the uninitialized cdata. */[m
[31m-  lj_cconv_ct_init(cts, ct, sz, cdataptr(cd),[m
[31m-		   o, (MSize)(L->top - o));  /* Initialize cdata. */[m
[31m-  if (ctype_isstruct(ct->info)) {[m
[31m-    /* Handle ctype __gc metamethod. Use the fast lookup here. */[m
[31m-    cTValue *tv = lj_tab_getinth(cts->miscmap, -(int32_t)id);[m
[31m-    if (tv && tvistab(tv) && (tv = lj_meta_fast(L, tabV(tv), MM_gc))) {[m
[31m-      GCtab *t = cts->finalizer;[m
[31m-      if (gcref(t->metatable)) {[m
[31m-	/* Add to finalizer table, if still enabled. */[m
[31m-	copyTV(L, lj_tab_set(L, t, o-1), tv);[m
[31m-	lj_gc_anybarriert(L, t);[m
[31m-	cd->marked |= LJ_GC_CDATA_FIN;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  L->top = o;  /* Only return the cdata itself. */[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_cast)	LJLIB_REC(ffi_new)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  CType *d = ctype_raw(cts, id);[m
[31m-  TValue *o = lj_lib_checkany(L, 2);[m
[31m-  L->top = o+1;  /* Make sure this is the last item on the stack. */[m
[31m-  if (!(ctype_isnum(d->info) || ctype_isptr(d->info) || ctype_isenum(d->info)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE);[m
[31m-  if (!(tviscdata(o) && cdataV(o)->ctypeid == id)) {[m
[31m-    GCcdata *cd = lj_cdata_new(cts, id, d->size);[m
[31m-    lj_cconv_ct_tv(cts, d, cdataptr(cd), o, CCF_CAST);[m
[31m-    setcdataV(L, o, cd);[m
[31m-    lj_gc_check(L);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_typeof)	LJLIB_REC(.)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, L->base+1);[m
[31m-  GCcdata *cd = lj_cdata_new(cts, CTID_CTYPEID, 4);[m
[31m-  *(CTypeID *)cdataptr(cd) = id;[m
[31m-  setcdataV(L, L->top-1, cd);[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Internal and unsupported API. */[m
[31m-LJLIB_CF(ffi_typeinfo)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = (CTypeID)ffi_checkint(L, 1);[m
[31m-  if (id > 0 && id < cts->top) {[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, 0, 4);  /* Increment hash size if fields are added. */[m
[31m-    t = tabV(L->top-1);[m
[31m-    setintV(lj_tab_setstr(L, t, lj_str_newlit(L, "info")), (int32_t)ct->info);[m
[31m-    if (ct->size != CTSIZE_INVALID)[m
[31m-      setintV(lj_tab_setstr(L, t, lj_str_newlit(L, "size")), (int32_t)ct->size);[m
[31m-    if (ct->sib)[m
[31m-      setintV(lj_tab_setstr(L, t, lj_str_newlit(L, "sib")), (int32_t)ct->sib);[m
[31m-    if (gcref(ct->name)) {[m
[31m-      GCstr *s = gco2str(gcref(ct->name));[m
[31m-      setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "name")), s);[m
[31m-    }[m
[31m-    lj_gc_check(L);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_istype)	LJLIB_REC(.)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id1 = ffi_checkctype(L, cts, NULL);[m
[31m-  TValue *o = lj_lib_checkany(L, 2);[m
[31m-  int b = 0;[m
[31m-  if (tviscdata(o)) {[m
[31m-    GCcdata *cd = cdataV(o);[m
[31m-    CTypeID id2 = cd->ctypeid == CTID_CTYPEID ? *(CTypeID *)cdataptr(cd) :[m
[31m-						cd->ctypeid;[m
[31m-    CType *ct1 = lj_ctype_rawref(cts, id1);[m
[31m-    CType *ct2 = lj_ctype_rawref(cts, id2);[m
[31m-    if (ct1 == ct2) {[m
[31m-      b = 1;[m
[31m-    } else if (ctype_type(ct1->info) == ctype_type(ct2->info) &&[m
[31m-	       ct1->size == ct2->size) {[m
[31m-      if (ctype_ispointer(ct1->info))[m
[31m-	b = lj_cconv_compatptr(cts, ct1, ct2, CCF_IGNQUAL);[m
[31m-      else if (ctype_isnum(ct1->info) || ctype_isvoid(ct1->info))[m
[31m-	b = (((ct1->info ^ ct2->info) & ~(CTF_QUAL|CTF_LONG)) == 0);[m
[31m-    } else if (ctype_isstruct(ct1->info) && ctype_isptr(ct2->info) &&[m
[31m-	       ct1 == ctype_rawchild(cts, ct2)) {[m
[31m-      b = 1;[m
[31m-    }[m
[31m-  }[m
[31m-  setboolV(L->top-1, b);[m
[31m-  setboolV(&G(L)->tmptv2, b);  /* Remember for trace recorder. */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_sizeof)	LJLIB_REC(ffi_xof FF_ffi_sizeof)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  CTSize sz;[m
[31m-  if (LJ_UNLIKELY(tviscdata(L->base) && cdataisv(cdataV(L->base)))) {[m
[31m-    sz = cdatavlen(cdataV(L->base));[m
[31m-  } else {[m
[31m-    CType *ct = lj_ctype_rawref(cts, id);[m
[31m-    if (ctype_isvltype(ct->info))[m
[31m-      sz = lj_ctype_vlsize(cts, ct, (CTSize)ffi_checkint(L, 2));[m
[31m-    else[m
[31m-      sz = ctype_hassize(ct->info) ? ct->size : CTSIZE_INVALID;[m
[31m-    if (LJ_UNLIKELY(sz == CTSIZE_INVALID)) {[m
[31m-      setnilV(L->top-1);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  setintV(L->top-1, (int32_t)sz);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_alignof)	LJLIB_REC(ffi_xof FF_ffi_alignof)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  CTSize sz = 0;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  setintV(L->top-1, 1 << ctype_align(info));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_offsetof)	LJLIB_REC(ffi_xof FF_ffi_offsetof)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  GCstr *name = lj_lib_checkstr(L, 2);[m
[31m-  CType *ct = lj_ctype_rawref(cts, id);[m
[31m-  CTSize ofs;[m
[31m-  if (ctype_isstruct(ct->info) && ct->size != CTSIZE_INVALID) {[m
[31m-    CType *fct = lj_ctype_getfield(cts, ct, name, &ofs);[m
[31m-    if (fct) {[m
[31m-      setintV(L->top-1, ofs);[m
[31m-      if (ctype_isfield(fct->info)) {[m
[31m-	return 1;[m
[31m-      } else if (ctype_isbitfield(fct->info)) {[m
[31m-	setintV(L->top++, ctype_bitpos(fct->info));[m
[31m-	setintV(L->top++, ctype_bitbsz(fct->info));[m
[31m-	return 3;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_errno)	LJLIB_REC(.)[m
[31m-{[m
[31m-  int err = errno;[m
[31m-  if (L->top > L->base)[m
[31m-    errno = ffi_checkint(L, 1);[m
[31m-  setintV(L->top++, err);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_string)	LJLIB_REC(.)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  TValue *o = lj_lib_checkany(L, 1);[m
[31m-  const char *p;[m
[31m-  size_t len;[m
[31m-  if (o+1 < L->top && !tvisnil(o+1)) {[m
[31m-    len = (size_t)ffi_checkint(L, 2);[m
[31m-    lj_cconv_ct_tv(cts, ctype_get(cts, CTID_P_CVOID), (uint8_t *)&p, o,[m
[31m-		   CCF_ARG(1));[m
[31m-  } else {[m
[31m-    lj_cconv_ct_tv(cts, ctype_get(cts, CTID_P_CCHAR), (uint8_t *)&p, o,[m
[31m-		   CCF_ARG(1));[m
[31m-    len = strlen(p);[m
[31m-  }[m
[31m-  L->top = o+1;  /* Make sure this is the last item on the stack. */[m
[31m-  setstrV(L, o, lj_str_new(L, p, len));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_copy)	LJLIB_REC(.)[m
[31m-{[m
[31m-  void *dp = ffi_checkptr(L, 1, CTID_P_VOID);[m
[31m-  void *sp = ffi_checkptr(L, 2, CTID_P_CVOID);[m
[31m-  TValue *o = L->base+1;[m
[31m-  CTSize len;[m
[31m-  if (tvisstr(o) && o+1 >= L->top)[m
[31m-    len = strV(o)->len+1;  /* Copy Lua string including trailing '\0'. */[m
[31m-  else[m
[31m-    len = (CTSize)ffi_checkint(L, 3);[m
[31m-  memcpy(dp, sp, len);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(ffi_fill)	LJLIB_REC(.)[m
[31m-{[m
[31m-  void *dp = ffi_checkptr(L, 1, CTID_P_VOID);[m
[31m-  CTSize len = (CTSize)ffi_checkint(L, 2);[m
[31m-  int32_t fill = 0;[m
[31m-  if (L->base+2 < L->top && !tvisnil(L->base+2)) fill = ffi_checkint(L, 3);[m
[31m-  memset(dp, fill, len);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#define H_(le, be)	LJ_ENDIAN_SELECT(0x##le, 0x##be)[m
[31m-[m
[31m-/* Test ABI string. */[m
[31m-LJLIB_CF(ffi_abi)	LJLIB_REC(.)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  int b = 0;[m
[31m-  switch (s->hash) {[m
[31m-#if LJ_64[m
[31m-  case H_(849858eb,ad35fd06): b = 1; break;  /* 64bit */[m
[31m-#else[m
[31m-  case H_(662d3c79,d0e22477): b = 1; break;  /* 32bit */[m
[31m-#endif[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-  case H_(e33ee463,e33ee463): b = 1; break;  /* fpu */[m
[31m-#endif[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-  case H_(61211a23,c2e8c81c): b = 1; break;  /* softfp */[m
[31m-#else[m
[31m-  case H_(539417a8,8ce0812f): b = 1; break;  /* hardfp */[m
[31m-#endif[m
[31m-#if LJ_ABI_EABI[m
[31m-  case H_(2182df8f,f2ed1152): b = 1; break;  /* eabi */[m
[31m-#endif[m
[31m-#if LJ_ABI_WIN[m
[31m-  case H_(4ab624a8,4ab624a8): b = 1; break;  /* win */[m
[31m-#endif[m
[31m-  case H_(3af93066,1f001464): b = 1; break;  /* le/be */[m
[31m-#if LJ_GC64[m
[31m-  case H_(9e89d2c9,13c83c92): b = 1; break;  /* gc64 */[m
[31m-#endif[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-  setboolV(L->top-1, b);[m
[31m-  setboolV(&G(L)->tmptv2, b);  /* Remember for trace recorder. */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#undef H_[m
[31m-[m
[31m-LJLIB_PUSH(top-8) LJLIB_SET(!)  /* Store reference to miscmap table. */[m
[31m-[m
[31m-LJLIB_CF(ffi_metatype)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CTypeID id = ffi_checkctype(L, cts, NULL);[m
[31m-  GCtab *mt = lj_lib_checktab(L, 2);[m
[31m-  GCtab *t = cts->miscmap;[m
[31m-  CType *ct = ctype_get(cts, id);  /* Only allow raw types. */[m
[31m-  TValue *tv;[m
[31m-  GCcdata *cd;[m
[31m-  if (!(ctype_isstruct(ct->info) || ctype_iscomplex(ct->info) ||[m
[31m-	ctype_isvector(ct->info)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE);[m
[31m-  tv = lj_tab_setinth(L, t, -(int32_t)id);[m
[31m-  if (!tvisnil(tv))[m
[31m-    lj_err_caller(L, LJ_ERR_PROTMT);[m
[31m-  settabV(L, tv, mt);[m
[31m-  lj_gc_anybarriert(L, t);[m
[31m-  cd = lj_cdata_new(cts, CTID_CTYPEID, 4);[m
[31m-  *(CTypeID *)cdataptr(cd) = id;[m
[31m-  setcdataV(L, L->top-1, cd);[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-7) LJLIB_SET(!)  /* Store reference to finalizer table. */[m
[31m-[m
[31m-LJLIB_CF(ffi_gc)	LJLIB_REC(.)[m
[31m-{[m
[31m-  GCcdata *cd = ffi_checkcdata(L, 1);[m
[31m-  TValue *fin = lj_lib_checkany(L, 2);[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  if (!(ctype_isptr(ct->info) || ctype_isstruct(ct->info) ||[m
[31m-	ctype_isrefarray(ct->info)))[m
[31m-    lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE);[m
[31m-  lj_cdata_setfin(L, cd, gcval(fin), itype(fin));[m
[31m-  L->top = L->base+1;  /* Pass through the cdata object. */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-5) LJLIB_SET(!)  /* Store clib metatable in func environment. */[m
[31m-[m
[31m-LJLIB_CF(ffi_load)[m
[31m-{[m
[31m-  GCstr *name = lj_lib_checkstr(L, 1);[m
[31m-  int global = (L->base+1 < L->top && tvistruecond(L->base+1));[m
[31m-  lj_clib_load(L, tabref(curr_func(L)->c.env), name, global);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-4) LJLIB_SET(C)[m
[31m-LJLIB_PUSH(top-3) LJLIB_SET(os)[m
[31m-LJLIB_PUSH(top-2) LJLIB_SET(arch)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Create special weak-keyed finalizer table. */[m
[31m-static GCtab *ffi_finalizer(lua_State *L)[m
[31m-{[m
[31m-  /* NOBARRIER: The table is new (marked white). */[m
[31m-  GCtab *t = lj_tab_new(L, 0, 1);[m
[31m-  settabV(L, L->top++, t);[m
[31m-  setgcref(t->metatable, obj2gco(t));[m
[31m-  setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")),[m
[31m-	  lj_str_newlit(L, "K"));[m
[31m-  t->nomm = (uint8_t)(~(1u<<MM_mode));[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* Register FFI module as loaded. */[m
[31m-static void ffi_register_module(lua_State *L)[m
[31m-{[m
[31m-  cTValue *tmp = lj_tab_getstr(tabV(registry(L)), lj_str_newlit(L, "_LOADED"));[m
[31m-  if (tmp && tvistab(tmp)) {[m
[31m-    GCtab *t = tabV(tmp);[m
[31m-    copyTV(L, lj_tab_setstr(L, t, lj_str_newlit(L, LUA_FFILIBNAME)), L->top-1);[m
[31m-    lj_gc_anybarriert(L, t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaopen_ffi(lua_State *L)[m
[31m-{[m
[31m-  CTState *cts = lj_ctype_init(L);[m
[31m-  settabV(L, L->top++, (cts->miscmap = lj_tab_new(L, 0, 1)));[m
[31m-  cts->finalizer = ffi_finalizer(L);[m
[31m-  LJ_LIB_REG(L, NULL, ffi_meta);[m
[31m-  /* NOBARRIER: basemt is a GC root. */[m
[31m-  setgcref(basemt_it(G(L), LJ_TCDATA), obj2gco(tabV(L->top-1)));[m
[31m-  LJ_LIB_REG(L, NULL, ffi_clib);[m
[31m-  LJ_LIB_REG(L, NULL, ffi_callback);[m
[31m-  /* NOBARRIER: the key is new and lj_tab_newkey() handles the barrier. */[m
[31m-  settabV(L, lj_tab_setstr(L, cts->miscmap, &cts->g->strempty), tabV(L->top-1));[m
[31m-  L->top--;[m
[31m-  lj_clib_default(L, tabV(L->top-1));  /* Create ffi.C default namespace. */[m
[31m-  lua_pushliteral(L, LJ_OS_NAME);[m
[31m-  lua_pushliteral(L, LJ_ARCH_NAME);[m
[31m-  LJ_LIB_REG(L, NULL, ffi);  /* Note: no global "ffi" created! */[m
[31m-  ffi_register_module(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_init.c[m
[1mdeleted file mode 100644[m
[1mindex 63c2ace..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-/*[m
[31m-** Library initialization.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major parts taken verbatim from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_init_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-static const luaL_Reg lj_lib_load[] = {[m
[31m-  { "",			luaopen_base },[m
[31m-  { LUA_LOADLIBNAME,	luaopen_package },[m
[31m-  { LUA_TABLIBNAME,	luaopen_table },[m
[31m-  { LUA_IOLIBNAME,	luaopen_io },[m
[31m-  { LUA_OSLIBNAME,	luaopen_os },[m
[31m-  { LUA_STRLIBNAME,	luaopen_string },[m
[31m-  { LUA_MATHLIBNAME,	luaopen_math },[m
[31m-  { LUA_DBLIBNAME,	luaopen_debug },[m
[31m-  { LUA_BITLIBNAME,	luaopen_bit },[m
[31m-  { LUA_JITLIBNAME,	luaopen_jit },[m
[31m-  { NULL,		NULL }[m
[31m-};[m
[31m-[m
[31m-static const luaL_Reg lj_lib_preload[] = {[m
[31m-#if LJ_HASFFI[m
[31m-  { LUA_FFILIBNAME,	luaopen_ffi },[m
[31m-#endif[m
[31m-  { NULL,		NULL }[m
[31m-};[m
[31m-[m
[31m-LUALIB_API void luaL_openlibs(lua_State *L)[m
[31m-{[m
[31m-  const luaL_Reg *lib;[m
[31m-  for (lib = lj_lib_load; lib->func; lib++) {[m
[31m-    lua_pushcfunction(L, lib->func);[m
[31m-    lua_pushstring(L, lib->name);[m
[31m-    lua_call(L, 1, 0);[m
[31m-  }[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD",[m
[31m-		 sizeof(lj_lib_preload)/sizeof(lj_lib_preload[0])-1);[m
[31m-  for (lib = lj_lib_preload; lib->func; lib++) {[m
[31m-    lua_pushcfunction(L, lib->func);[m
[31m-    lua_setfield(L, -2, lib->name);[m
[31m-  }[m
[31m-  lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_io.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_io.c[m
[1mdeleted file mode 100644[m
[1mindex 31f0ea9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_io.c[m
[1m+++ /dev/null[m
[36m@@ -1,540 +0,0 @@[m
[31m-/*[m
[31m-** I/O library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lib_io_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* Userdata payload for I/O file. */[m
[31m-typedef struct IOFileUD {[m
[31m-  FILE *fp;		/* File handle. */[m
[31m-  uint32_t type;	/* File type. */[m
[31m-} IOFileUD;[m
[31m-[m
[31m-#define IOFILE_TYPE_FILE	0	/* Regular file. */[m
[31m-#define IOFILE_TYPE_PIPE	1	/* Pipe. */[m
[31m-#define IOFILE_TYPE_STDF	2	/* Standard file handle. */[m
[31m-#define IOFILE_TYPE_MASK	3[m
[31m-[m
[31m-#define IOFILE_FLAG_CLOSE	4	/* Close after io.lines() iterator. */[m
[31m-[m
[31m-#define IOSTDF_UD(L, id)	(&gcref(G(L)->gcroot[(id)])->ud)[m
[31m-#define IOSTDF_IOF(L, id)	((IOFileUD *)uddata(IOSTDF_UD(L, (id))))[m
[31m-[m
[31m-/* -- Open/close helpers -------------------------------------------------- */[m
[31m-[m
[31m-static IOFileUD *io_tofilep(lua_State *L)[m
[31m-{[m
[31m-  if (!(L->base < L->top && tvisudata(L->base) &&[m
[31m-	udataV(L->base)->udtype == UDTYPE_IO_FILE))[m
[31m-    lj_err_argtype(L, 1, "FILE*");[m
[31m-  return (IOFileUD *)uddata(udataV(L->base));[m
[31m-}[m
[31m-[m
[31m-static IOFileUD *io_tofile(lua_State *L)[m
[31m-{[m
[31m-  IOFileUD *iof = io_tofilep(L);[m
[31m-  if (iof->fp == NULL)[m
[31m-    lj_err_caller(L, LJ_ERR_IOCLFL);[m
[31m-  return iof;[m
[31m-}[m
[31m-[m
[31m-static FILE *io_stdfile(lua_State *L, ptrdiff_t id)[m
[31m-{[m
[31m-  IOFileUD *iof = IOSTDF_IOF(L, id);[m
[31m-  if (iof->fp == NULL)[m
[31m-    lj_err_caller(L, LJ_ERR_IOSTDCL);[m
[31m-  return iof->fp;[m
[31m-}[m
[31m-[m
[31m-static IOFileUD *io_file_new(lua_State *L)[m
[31m-{[m
[31m-  IOFileUD *iof = (IOFileUD *)lua_newuserdata(L, sizeof(IOFileUD));[m
[31m-  GCudata *ud = udataV(L->top-1);[m
[31m-  ud->udtype = UDTYPE_IO_FILE;[m
[31m-  /* NOBARRIER: The GCudata is new (marked white). */[m
[31m-  setgcrefr(ud->metatable, curr_func(L)->c.env);[m
[31m-  iof->fp = NULL;[m
[31m-  iof->type = IOFILE_TYPE_FILE;[m
[31m-  return iof;[m
[31m-}[m
[31m-[m
[31m-static IOFileUD *io_file_open(lua_State *L, const char *mode)[m
[31m-{[m
[31m-  const char *fname = strdata(lj_lib_checkstr(L, 1));[m
[31m-  IOFileUD *iof = io_file_new(L);[m
[31m-  iof->fp = fopen(fname, mode);[m
[31m-  if (iof->fp == NULL)[m
[31m-    luaL_argerror(L, 1, lj_strfmt_pushf(L, "%s: %s", fname, strerror(errno)));[m
[31m-  return iof;[m
[31m-}[m
[31m-[m
[31m-static int io_file_close(lua_State *L, IOFileUD *iof)[m
[31m-{[m
[31m-  int ok;[m
[31m-  if ((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_FILE) {[m
[31m-    ok = (fclose(iof->fp) == 0);[m
[31m-  } else if ((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_PIPE) {[m
[31m-    int stat = -1;[m
[31m-#if LJ_TARGET_POSIX[m
[31m-    stat = pclose(iof->fp);[m
[31m-#elif LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE[m
[31m-    stat = _pclose(iof->fp);[m
[31m-#else[m
[31m-    lua_assert(0);[m
[31m-    return 0;[m
[31m-#endif[m
[31m-#if LJ_52[m
[31m-    iof->fp = NULL;[m
[31m-    return luaL_execresult(L, stat);[m
[31m-#else[m
[31m-    ok = (stat != -1);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    lua_assert((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_STDF);[m
[31m-    setnilV(L->top++);[m
[31m-    lua_pushliteral(L, "cannot close standard file");[m
[31m-    return 2;[m
[31m-  }[m
[31m-  iof->fp = NULL;[m
[31m-  return luaL_fileresult(L, ok, NULL);[m
[31m-}[m
[31m-[m
[31m-/* -- Read/write helpers -------------------------------------------------- */[m
[31m-[m
[31m-static int io_file_readnum(lua_State *L, FILE *fp)[m
[31m-{[m
[31m-  lua_Number d;[m
[31m-  if (fscanf(fp, LUA_NUMBER_SCAN, &d) == 1) {[m
[31m-    if (LJ_DUALNUM) {[m
[31m-      int32_t i = lj_num2int(d);[m
[31m-      if (d == (lua_Number)i && !tvismzero((cTValue *)&d)) {[m
[31m-	setintV(L->top++, i);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    setnumV(L->top++, d);[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    setnilV(L->top++);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int io_file_readline(lua_State *L, FILE *fp, MSize chop)[m
[31m-{[m
[31m-  MSize m = LUAL_BUFFERSIZE, n = 0, ok = 0;[m
[31m-  char *buf;[m
[31m-  for (;;) {[m
[31m-    buf = lj_buf_tmp(L, m);[m
[31m-    if (fgets(buf+n, m-n, fp) == NULL) break;[m
[31m-    n += (MSize)strlen(buf+n);[m
[31m-    ok |= n;[m
[31m-    if (n && buf[n-1] == '\n') { n -= chop; break; }[m
[31m-    if (n >= m - 64) m += m;[m
[31m-  }[m
[31m-  setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n));[m
[31m-  lj_gc_check(L);[m
[31m-  return (int)ok;[m
[31m-}[m
[31m-[m
[31m-static void io_file_readall(lua_State *L, FILE *fp)[m
[31m-{[m
[31m-  MSize m, n;[m
[31m-  for (m = LUAL_BUFFERSIZE, n = 0; ; m += m) {[m
[31m-    char *buf = lj_buf_tmp(L, m);[m
[31m-    n += (MSize)fread(buf+n, 1, m-n, fp);[m
[31m-    if (n != m) {[m
[31m-      setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n));[m
[31m-      lj_gc_check(L);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int io_file_readlen(lua_State *L, FILE *fp, MSize m)[m
[31m-{[m
[31m-  if (m) {[m
[31m-    char *buf = lj_buf_tmp(L, m);[m
[31m-    MSize n = (MSize)fread(buf, 1, m, fp);[m
[31m-    setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n));[m
[31m-    lj_gc_check(L);[m
[31m-    return (n > 0 || m == 0);[m
[31m-  } else {[m
[31m-    int c = getc(fp);[m
[31m-    ungetc(c, fp);[m
[31m-    setstrV(L, L->top++, &G(L)->strempty);[m
[31m-    return (c != EOF);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int io_file_read(lua_State *L, FILE *fp, int start)[m
[31m-{[m
[31m-  int ok, n, nargs = (int)(L->top - L->base) - start;[m
[31m-  clearerr(fp);[m
[31m-  if (nargs == 0) {[m
[31m-    ok = io_file_readline(L, fp, 1);[m
[31m-    n = start+1;  /* Return 1 result. */[m
[31m-  } else {[m
[31m-    /* The results plus the buffers go on top of the args. */[m
[31m-    luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments");[m
[31m-    ok = 1;[m
[31m-    for (n = start; nargs-- && ok; n++) {[m
[31m-      if (tvisstr(L->base+n)) {[m
[31m-	const char *p = strVdata(L->base+n);[m
[31m-	if (p[0] != '*')[m
[31m-	  lj_err_arg(L, n+1, LJ_ERR_INVOPT);[m
[31m-	if (p[1] == 'n')[m
[31m-	  ok = io_file_readnum(L, fp);[m
[31m-	else if ((p[1] & ~0x20) == 'L')[m
[31m-	  ok = io_file_readline(L, fp, (p[1] == 'l'));[m
[31m-	else if (p[1] == 'a')[m
[31m-	  io_file_readall(L, fp);[m
[31m-	else[m
[31m-	  lj_err_arg(L, n+1, LJ_ERR_INVFMT);[m
[31m-      } else if (tvisnumber(L->base+n)) {[m
[31m-	ok = io_file_readlen(L, fp, (MSize)lj_lib_checkint(L, n+1));[m
[31m-      } else {[m
[31m-	lj_err_arg(L, n+1, LJ_ERR_INVOPT);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (ferror(fp))[m
[31m-    return luaL_fileresult(L, 0, NULL);[m
[31m-  if (!ok)[m
[31m-    setnilV(L->top-1);  /* Replace last result with nil. */[m
[31m-  return n - start;[m
[31m-}[m
[31m-[m
[31m-static int io_file_write(lua_State *L, FILE *fp, int start)[m
[31m-{[m
[31m-  cTValue *tv;[m
[31m-  int status = 1;[m
[31m-  for (tv = L->base+start; tv < L->top; tv++) {[m
[31m-    MSize len;[m
[31m-    const char *p = lj_strfmt_wstrnum(L, tv, &len);[m
[31m-    if (!p)[m
[31m-      lj_err_argt(L, (int)(tv - L->base) + 1, LUA_TSTRING);[m
[31m-    status = status && (fwrite(p, 1, len, fp) == len);[m
[31m-  }[m
[31m-  if (LJ_52 && status) {[m
[31m-    L->top = L->base+1;[m
[31m-    if (start == 0)[m
[31m-      setudataV(L, L->base, IOSTDF_UD(L, GCROOT_IO_OUTPUT));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return luaL_fileresult(L, status, NULL);[m
[31m-}[m
[31m-[m
[31m-static int io_file_iter(lua_State *L)[m
[31m-{[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  IOFileUD *iof = uddata(udataV(&fn->c.upvalue[0]));[m
[31m-  int n = fn->c.nupvalues - 1;[m
[31m-  if (iof->fp == NULL)[m
[31m-    lj_err_caller(L, LJ_ERR_IOCLFL);[m
[31m-  L->top = L->base;[m
[31m-  if (n) {  /* Copy upvalues with options to stack. */[m
[31m-    if (n > LUAI_MAXCSTACK)[m
[31m-      lj_err_caller(L, LJ_ERR_STKOV);[m
[31m-    lj_state_checkstack(L, (MSize)n);[m
[31m-    memcpy(L->top, &fn->c.upvalue[1], n*sizeof(TValue));[m
[31m-    L->top += n;[m
[31m-  }[m
[31m-  n = io_file_read(L, iof->fp, 0);[m
[31m-  if (ferror(iof->fp))[m
[31m-    lj_err_callermsg(L, strVdata(L->top-2));[m
[31m-  if (tvisnil(L->base) && (iof->type & IOFILE_FLAG_CLOSE)) {[m
[31m-    io_file_close(L, iof);  /* Return values are ignored. */[m
[31m-    return 0;[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-static int io_file_lines(lua_State *L)[m
[31m-{[m
[31m-  int n = (int)(L->top - L->base);[m
[31m-  if (n > LJ_MAX_UPVAL)[m
[31m-    lj_err_caller(L, LJ_ERR_UNPACK);[m
[31m-  lua_pushcclosure(L, io_file_iter, n);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* -- I/O file methods ---------------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_io_method[m
[31m-[m
[31m-LJLIB_CF(io_method_close)[m
[31m-{[m
[31m-  IOFileUD *iof = L->base < L->top ? io_tofile(L) :[m
[31m-		  IOSTDF_IOF(L, GCROOT_IO_OUTPUT);[m
[31m-  return io_file_close(L, iof);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_read)[m
[31m-{[m
[31m-  return io_file_read(L, io_tofile(L)->fp, 1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_write)		LJLIB_REC(io_write 0)[m
[31m-{[m
[31m-  return io_file_write(L, io_tofile(L)->fp, 1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_flush)		LJLIB_REC(io_flush 0)[m
[31m-{[m
[31m-  return luaL_fileresult(L, fflush(io_tofile(L)->fp) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_seek)[m
[31m-{[m
[31m-  FILE *fp = io_tofile(L)->fp;[m
[31m-  int opt = lj_lib_checkopt(L, 2, 1, "\3set\3cur\3end");[m
[31m-  int64_t ofs = 0;[m
[31m-  cTValue *o;[m
[31m-  int res;[m
[31m-  if (opt == 0) opt = SEEK_SET;[m
[31m-  else if (opt == 1) opt = SEEK_CUR;[m
[31m-  else if (opt == 2) opt = SEEK_END;[m
[31m-  o = L->base+2;[m
[31m-  if (o < L->top) {[m
[31m-    if (tvisint(o))[m
[31m-      ofs = (int64_t)intV(o);[m
[31m-    else if (tvisnum(o))[m
[31m-      ofs = (int64_t)numV(o);[m
[31m-    else if (!tvisnil(o))[m
[31m-      lj_err_argt(L, 3, LUA_TNUMBER);[m
[31m-  }[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  res = fseeko(fp, ofs, opt);[m
[31m-#elif _MSC_VER >= 1400[m
[31m-  res = _fseeki64(fp, ofs, opt);[m
[31m-#elif defined(__MINGW32__)[m
[31m-  res = fseeko64(fp, ofs, opt);[m
[31m-#else[m
[31m-  res = fseek(fp, (long)ofs, opt);[m
[31m-#endif[m
[31m-  if (res)[m
[31m-    return luaL_fileresult(L, 0, NULL);[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  ofs = ftello(fp);[m
[31m-#elif _MSC_VER >= 1400[m
[31m-  ofs = _ftelli64(fp);[m
[31m-#elif defined(__MINGW32__)[m
[31m-  ofs = ftello64(fp);[m
[31m-#else[m
[31m-  ofs = (int64_t)ftell(fp);[m
[31m-#endif[m
[31m-  setint64V(L->top-1, ofs);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_setvbuf)[m
[31m-{[m
[31m-  FILE *fp = io_tofile(L)->fp;[m
[31m-  int opt = lj_lib_checkopt(L, 2, -1, "\4full\4line\2no");[m
[31m-  size_t sz = (size_t)lj_lib_optint(L, 3, LUAL_BUFFERSIZE);[m
[31m-  if (opt == 0) opt = _IOFBF;[m
[31m-  else if (opt == 1) opt = _IOLBF;[m
[31m-  else if (opt == 2) opt = _IONBF;[m
[31m-  return luaL_fileresult(L, setvbuf(fp, NULL, opt, sz) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method_lines)[m
[31m-{[m
[31m-  io_tofile(L);[m
[31m-  return io_file_lines(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method___gc)[m
[31m-{[m
[31m-  IOFileUD *iof = io_tofilep(L);[m
[31m-  if (iof->fp != NULL && (iof->type & IOFILE_TYPE_MASK) != IOFILE_TYPE_STDF)[m
[31m-    io_file_close(L, iof);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_method___tostring)[m
[31m-{[m
[31m-  IOFileUD *iof = io_tofilep(L);[m
[31m-  if (iof->fp != NULL)[m
[31m-    lua_pushfstring(L, "file (%p)", iof->fp);[m
[31m-  else[m
[31m-    lua_pushliteral(L, "file (closed)");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-1) LJLIB_SET(__index)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- I/O library functions ----------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_io[m
[31m-[m
[31m-LJLIB_PUSH(top-2) LJLIB_SET(!)  /* Set environment. */[m
[31m-[m
[31m-LJLIB_CF(io_open)[m
[31m-{[m
[31m-  const char *fname = strdata(lj_lib_checkstr(L, 1));[m
[31m-  GCstr *s = lj_lib_optstr(L, 2);[m
[31m-  const char *mode = s ? strdata(s) : "r";[m
[31m-  IOFileUD *iof = io_file_new(L);[m
[31m-  iof->fp = fopen(fname, mode);[m
[31m-  return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, fname);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_popen)[m
[31m-{[m
[31m-#if LJ_TARGET_POSIX || (LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE)[m
[31m-  const char *fname = strdata(lj_lib_checkstr(L, 1));[m
[31m-  GCstr *s = lj_lib_optstr(L, 2);[m
[31m-  const char *mode = s ? strdata(s) : "r";[m
[31m-  IOFileUD *iof = io_file_new(L);[m
[31m-  iof->type = IOFILE_TYPE_PIPE;[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  fflush(NULL);[m
[31m-  iof->fp = popen(fname, mode);[m
[31m-#else[m
[31m-  iof->fp = _popen(fname, mode);[m
[31m-#endif[m
[31m-  return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, fname);[m
[31m-#else[m
[31m-  return luaL_error(L, LUA_QL("popen") " not supported");[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_tmpfile)[m
[31m-{[m
[31m-  IOFileUD *iof = io_file_new(L);[m
[31m-#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PSVITA[m
[31m-  iof->fp = NULL; errno = ENOSYS;[m
[31m-#else[m
[31m-  iof->fp = tmpfile();[m
[31m-#endif[m
[31m-  return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, NULL);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_close)[m
[31m-{[m
[31m-  return lj_cf_io_method_close(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_read)[m
[31m-{[m
[31m-  return io_file_read(L, io_stdfile(L, GCROOT_IO_INPUT), 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_write)		LJLIB_REC(io_write GCROOT_IO_OUTPUT)[m
[31m-{[m
[31m-  return io_file_write(L, io_stdfile(L, GCROOT_IO_OUTPUT), 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_flush)		LJLIB_REC(io_flush GCROOT_IO_OUTPUT)[m
[31m-{[m
[31m-  return luaL_fileresult(L, fflush(io_stdfile(L, GCROOT_IO_OUTPUT)) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-static int io_std_getset(lua_State *L, ptrdiff_t id, const char *mode)[m
[31m-{[m
[31m-  if (L->base < L->top && !tvisnil(L->base)) {[m
[31m-    if (tvisudata(L->base)) {[m
[31m-      io_tofile(L);[m
[31m-      L->top = L->base+1;[m
[31m-    } else {[m
[31m-      io_file_open(L, mode);[m
[31m-    }[m
[31m-    /* NOBARRIER: The standard I/O handles are GC roots. */[m
[31m-    setgcref(G(L)->gcroot[id], gcV(L->top-1));[m
[31m-  } else {[m
[31m-    setudataV(L, L->top++, IOSTDF_UD(L, id));[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_input)[m
[31m-{[m
[31m-  return io_std_getset(L, GCROOT_IO_INPUT, "r");[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_output)[m
[31m-{[m
[31m-  return io_std_getset(L, GCROOT_IO_OUTPUT, "w");[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_lines)[m
[31m-{[m
[31m-  if (L->base == L->top) setnilV(L->top++);[m
[31m-  if (!tvisnil(L->base)) {  /* io.lines(fname) */[m
[31m-    IOFileUD *iof = io_file_open(L, "r");[m
[31m-    iof->type = IOFILE_TYPE_FILE|IOFILE_FLAG_CLOSE;[m
[31m-    L->top--;[m
[31m-    setudataV(L, L->base, udataV(L->top));[m
[31m-  } else {  /* io.lines() iterates over stdin. */[m
[31m-    setudataV(L, L->base, IOSTDF_UD(L, GCROOT_IO_INPUT));[m
[31m-  }[m
[31m-  return io_file_lines(L);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(io_type)[m
[31m-{[m
[31m-  cTValue *o = lj_lib_checkany(L, 1);[m
[31m-  if (!(tvisudata(o) && udataV(o)->udtype == UDTYPE_IO_FILE))[m
[31m-    setnilV(L->top++);[m
[31m-  else if (((IOFileUD *)uddata(udataV(o)))->fp != NULL)[m
[31m-    lua_pushliteral(L, "file");[m
[31m-  else[m
[31m-    lua_pushliteral(L, "closed file");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static GCobj *io_std_new(lua_State *L, FILE *fp, const char *name)[m
[31m-{[m
[31m-  IOFileUD *iof = (IOFileUD *)lua_newuserdata(L, sizeof(IOFileUD));[m
[31m-  GCudata *ud = udataV(L->top-1);[m
[31m-  ud->udtype = UDTYPE_IO_FILE;[m
[31m-  /* NOBARRIER: The GCudata is new (marked white). */[m
[31m-  setgcref(ud->metatable, gcV(L->top-3));[m
[31m-  iof->fp = fp;[m
[31m-  iof->type = IOFILE_TYPE_STDF;[m
[31m-  lua_setfield(L, -2, name);[m
[31m-  return obj2gco(ud);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaopen_io(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, NULL, io_method);[m
[31m-  copyTV(L, L->top, L->top-1); L->top++;[m
[31m-  lua_setfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE);[m
[31m-  LJ_LIB_REG(L, LUA_IOLIBNAME, io);[m
[31m-  setgcref(G(L)->gcroot[GCROOT_IO_INPUT], io_std_new(L, stdin, "stdin"));[m
[31m-  setgcref(G(L)->gcroot[GCROOT_IO_OUTPUT], io_std_new(L, stdout, "stdout"));[m
[31m-  io_std_new(L, stderr, "stderr");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_jit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_jit.c[m
[1mdeleted file mode 100644[m
[1mindex c6330c4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_jit.c[m
[1m+++ /dev/null[m
[36m@@ -1,772 +0,0 @@[m
[31m-/*[m
[31m-** JIT library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_jit_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_target.h"[m
[31m-#endif[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_vmevent.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-/* -- jit.* functions ----------------------------------------------------- */[m
[31m-[m
[31m-#define LJLIB_MODULE_jit[m
[31m-[m
[31m-static int setjitmode(lua_State *L, int mode)[m
[31m-{[m
[31m-  int idx = 0;[m
[31m-  if (L->base == L->top || tvisnil(L->base)) {  /* jit.on/off/flush([nil]) */[m
[31m-    mode |= LUAJIT_MODE_ENGINE;[m
[31m-  } else {[m
[31m-    /* jit.on/off/flush(func|proto, nil|true|false) */[m
[31m-    if (tvisfunc(L->base) || tvisproto(L->base))[m
[31m-      idx = 1;[m
[31m-    else if (!tvistrue(L->base))  /* jit.on/off/flush(true, nil|true|false) */[m
[31m-      goto err;[m
[31m-    if (L->base+1 < L->top && tvisbool(L->base+1))[m
[31m-      mode |= boolV(L->base+1) ? LUAJIT_MODE_ALLFUNC : LUAJIT_MODE_ALLSUBFUNC;[m
[31m-    else[m
[31m-      mode |= LUAJIT_MODE_FUNC;[m
[31m-  }[m
[31m-  if (luaJIT_setmode(L, idx, mode) != 1) {[m
[31m-    if ((mode & LUAJIT_MODE_MASK) == LUAJIT_MODE_ENGINE)[m
[31m-      lj_err_caller(L, LJ_ERR_NOJIT);[m
[31m-  err:[m
[31m-    lj_err_argt(L, 1, LUA_TFUNCTION);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(jit_on)[m
[31m-{[m
[31m-  return setjitmode(L, LUAJIT_MODE_ON);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(jit_off)[m
[31m-{[m
[31m-  return setjitmode(L, LUAJIT_MODE_OFF);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(jit_flush)[m
[31m-{[m
[31m-#if LJ_HASJIT[m
[31m-  if (L->base < L->top && tvisnumber(L->base)) {[m
[31m-    int traceno = lj_lib_checkint(L, 1);[m
[31m-    luaJIT_setmode(L, traceno, LUAJIT_MODE_FLUSH|LUAJIT_MODE_TRACE);[m
[31m-    return 0;[m
[31m-  }[m
[31m-#endif[m
[31m-  return setjitmode(L, LUAJIT_MODE_FLUSH);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Push a string for every flag bit that is set. */[m
[31m-static void flagbits_to_strings(lua_State *L, uint32_t flags, uint32_t base,[m
[31m-				const char *str)[m
[31m-{[m
[31m-  for (; *str; base <<= 1, str += 1+*str)[m
[31m-    if (flags & base)[m
[31m-      setstrV(L, L->top++, lj_str_new(L, str+1, *(uint8_t *)str));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_CF(jit_status)[m
[31m-{[m
[31m-#if LJ_HASJIT[m
[31m-  jit_State *J = L2J(L);[m
[31m-  L->top = L->base;[m
[31m-  setboolV(L->top++, (J->flags & JIT_F_ON) ? 1 : 0);[m
[31m-  flagbits_to_strings(L, J->flags, JIT_F_CPU_FIRST, JIT_F_CPUSTRING);[m
[31m-  flagbits_to_strings(L, J->flags, JIT_F_OPT_FIRST, JIT_F_OPTSTRING);[m
[31m-  return (int)(L->top - L->base);[m
[31m-#else[m
[31m-  setboolV(L->top++, 0);[m
[31m-  return 1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(jit_attach)[m
[31m-{[m
[31m-#ifdef LUAJIT_DISABLE_VMEVENT[m
[31m-  luaL_error(L, "vmevent API disabled");[m
[31m-#else[m
[31m-  GCfunc *fn = lj_lib_checkfunc(L, 1);[m
[31m-  GCstr *s = lj_lib_optstr(L, 2);[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, LJ_VMEVENTS_REGKEY, LJ_VMEVENTS_HSIZE);[m
[31m-  if (s) {  /* Attach to given event. */[m
[31m-    const uint8_t *p = (const uint8_t *)strdata(s);[m
[31m-    uint32_t h = s->len;[m
[31m-    while (*p) h = h ^ (lj_rol(h, 6) + *p++);[m
[31m-    lua_pushvalue(L, 1);[m
[31m-    lua_rawseti(L, -2, VMEVENT_HASHIDX(h));[m
[31m-    G(L)->vmevmask = VMEVENT_NOCACHE;  /* Invalidate cache. */[m
[31m-  } else {  /* Detach if no event given. */[m
[31m-    setnilV(L->top++);[m
[31m-    while (lua_next(L, -2)) {[m
[31m-      L->top--;[m
[31m-      if (tvisfunc(L->top) && funcV(L->top) == fn) {[m
[31m-	setnilV(lj_tab_set(L, tabV(L->top-2), L->top-1));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_PUSH(top-5) LJLIB_SET(os)[m
[31m-LJLIB_PUSH(top-4) LJLIB_SET(arch)[m
[31m-LJLIB_PUSH(top-3) LJLIB_SET(version_num)[m
[31m-LJLIB_PUSH(top-2) LJLIB_SET(version)[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-/* -- jit.util.* functions ------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_jit_util[m
[31m-[m
[31m-/* -- Reflection API for Lua functions ------------------------------------ */[m
[31m-[m
[31m-/* Return prototype of first argument (Lua function or prototype object) */[m
[31m-static GCproto *check_Lproto(lua_State *L, int nolua)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  if (L->top > o) {[m
[31m-    if (tvisproto(o)) {[m
[31m-      return protoV(o);[m
[31m-    } else if (tvisfunc(o)) {[m
[31m-      if (isluafunc(funcV(o)))[m
[31m-	return funcproto(funcV(o));[m
[31m-      else if (nolua)[m
[31m-	return NULL;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_argt(L, 1, LUA_TFUNCTION);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-static void setintfield(lua_State *L, GCtab *t, const char *name, int32_t val)[m
[31m-{[m
[31m-  setintV(lj_tab_setstr(L, t, lj_str_newz(L, name)), val);[m
[31m-}[m
[31m-[m
[31m-/* local info = jit.util.funcinfo(func [,pc]) */[m
[31m-LJLIB_CF(jit_util_funcinfo)[m
[31m-{[m
[31m-  GCproto *pt = check_Lproto(L, 1);[m
[31m-  if (pt) {[m
[31m-    BCPos pc = (BCPos)lj_lib_optint(L, 2, 0);[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, 0, 16);  /* Increment hash size if fields are added. */[m
[31m-    t = tabV(L->top-1);[m
[31m-    setintfield(L, t, "linedefined", pt->firstline);[m
[31m-    setintfield(L, t, "lastlinedefined", pt->firstline + pt->numline);[m
[31m-    setintfield(L, t, "stackslots", pt->framesize);[m
[31m-    setintfield(L, t, "params", pt->numparams);[m
[31m-    setintfield(L, t, "bytecodes", (int32_t)pt->sizebc);[m
[31m-    setintfield(L, t, "gcconsts", (int32_t)pt->sizekgc);[m
[31m-    setintfield(L, t, "nconsts", (int32_t)pt->sizekn);[m
[31m-    setintfield(L, t, "upvalues", (int32_t)pt->sizeuv);[m
[31m-    if (pc < pt->sizebc)[m
[31m-      setintfield(L, t, "currentline", lj_debug_line(pt, pc));[m
[31m-    lua_pushboolean(L, (pt->flags & PROTO_VARARG));[m
[31m-    lua_setfield(L, -2, "isvararg");[m
[31m-    lua_pushboolean(L, (pt->flags & PROTO_CHILD));[m
[31m-    lua_setfield(L, -2, "children");[m
[31m-    setstrV(L, L->top++, proto_chunkname(pt));[m
[31m-    lua_setfield(L, -2, "source");[m
[31m-    lj_debug_pushloc(L, pt, pc);[m
[31m-    lua_setfield(L, -2, "loc");[m
[31m-  } else {[m
[31m-    GCfunc *fn = funcV(L->base);[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, 0, 4);  /* Increment hash size if fields are added. */[m
[31m-    t = tabV(L->top-1);[m
[31m-    if (!iscfunc(fn))[m
[31m-      setintfield(L, t, "ffid", fn->c.ffid);[m
[31m-    setintptrV(lj_tab_setstr(L, t, lj_str_newlit(L, "addr")),[m
[31m-	       (intptr_t)(void *)fn->c.f);[m
[31m-    setintfield(L, t, "upvalues", fn->c.nupvalues);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* local ins, m = jit.util.funcbc(func, pc) */[m
[31m-LJLIB_CF(jit_util_funcbc)[m
[31m-{[m
[31m-  GCproto *pt = check_Lproto(L, 0);[m
[31m-  BCPos pc = (BCPos)lj_lib_checkint(L, 2);[m
[31m-  if (pc < pt->sizebc) {[m
[31m-    BCIns ins = proto_bc(pt)[pc];[m
[31m-    BCOp op = bc_op(ins);[m
[31m-    lua_assert(op < BC__MAX);[m
[31m-    setintV(L->top, ins);[m
[31m-    setintV(L->top+1, lj_bc_mode[op]);[m
[31m-    L->top += 2;[m
[31m-    return 2;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local k = jit.util.funck(func, idx) */[m
[31m-LJLIB_CF(jit_util_funck)[m
[31m-{[m
[31m-  GCproto *pt = check_Lproto(L, 0);[m
[31m-  ptrdiff_t idx = (ptrdiff_t)lj_lib_checkint(L, 2);[m
[31m-  if (idx >= 0) {[m
[31m-    if (idx < (ptrdiff_t)pt->sizekn) {[m
[31m-      copyTV(L, L->top-1, proto_knumtv(pt, idx));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (~idx < (ptrdiff_t)pt->sizekgc) {[m
[31m-      GCobj *gc = proto_kgc(pt, idx);[m
[31m-      setgcV(L, L->top-1, gc, ~gc->gch.gct);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local name = jit.util.funcuvname(func, idx) */[m
[31m-LJLIB_CF(jit_util_funcuvname)[m
[31m-{[m
[31m-  GCproto *pt = check_Lproto(L, 0);[m
[31m-  uint32_t idx = (uint32_t)lj_lib_checkint(L, 2);[m
[31m-  if (idx < pt->sizeuv) {[m
[31m-    setstrV(L, L->top-1, lj_str_newz(L, lj_debug_uvname(pt, idx)));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Reflection API for traces ------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-/* Check trace argument. Must not throw for non-existent trace numbers. */[m
[31m-static GCtrace *jit_checktrace(lua_State *L)[m
[31m-{[m
[31m-  TraceNo tr = (TraceNo)lj_lib_checkint(L, 1);[m
[31m-  jit_State *J = L2J(L);[m
[31m-  if (tr > 0 && tr < J->sizetrace)[m
[31m-    return traceref(J, tr);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Names of link types. ORDER LJ_TRLINK */[m
[31m-static const char *const jit_trlinkname[] = {[m
[31m-  "none", "root", "loop", "tail-recursion", "up-recursion", "down-recursion",[m
[31m-  "interpreter", "return", "stitch"[m
[31m-};[m
[31m-[m
[31m-/* local info = jit.util.traceinfo(tr) */[m
[31m-LJLIB_CF(jit_util_traceinfo)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  if (T) {[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, 0, 8);  /* Increment hash size if fields are added. */[m
[31m-    t = tabV(L->top-1);[m
[31m-    setintfield(L, t, "nins", (int32_t)T->nins - REF_BIAS - 1);[m
[31m-    setintfield(L, t, "nk", REF_BIAS - (int32_t)T->nk);[m
[31m-    setintfield(L, t, "link", T->link);[m
[31m-    setintfield(L, t, "nexit", T->nsnap);[m
[31m-    setstrV(L, L->top++, lj_str_newz(L, jit_trlinkname[T->linktype]));[m
[31m-    lua_setfield(L, -2, "linktype");[m
[31m-    /* There are many more fields. Add them only when needed. */[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local m, ot, op1, op2, prev = jit.util.traceir(tr, idx) */[m
[31m-LJLIB_CF(jit_util_traceir)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  IRRef ref = (IRRef)lj_lib_checkint(L, 2) + REF_BIAS;[m
[31m-  if (T && ref >= REF_BIAS && ref < T->nins) {[m
[31m-    IRIns *ir = &T->ir[ref];[m
[31m-    int32_t m = lj_ir_mode[ir->o];[m
[31m-    setintV(L->top-2, m);[m
[31m-    setintV(L->top-1, ir->ot);[m
[31m-    setintV(L->top++, (int32_t)ir->op1 - (irm_op1(m)==IRMref ? REF_BIAS : 0));[m
[31m-    setintV(L->top++, (int32_t)ir->op2 - (irm_op2(m)==IRMref ? REF_BIAS : 0));[m
[31m-    setintV(L->top++, ir->prev);[m
[31m-    return 5;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local k, t [, slot] = jit.util.tracek(tr, idx) */[m
[31m-LJLIB_CF(jit_util_tracek)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  IRRef ref = (IRRef)lj_lib_checkint(L, 2) + REF_BIAS;[m
[31m-  if (T && ref >= T->nk && ref < REF_BIAS) {[m
[31m-    IRIns *ir = &T->ir[ref];[m
[31m-    int32_t slot = -1;[m
[31m-    if (ir->o == IR_KSLOT) {[m
[31m-      slot = ir->op2;[m
[31m-      ir = &T->ir[ir->op1];[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (ir->o == IR_KINT64 && !ctype_ctsG(G(L))) {[m
[31m-      ptrdiff_t oldtop = savestack(L, L->top);[m
[31m-      luaopen_ffi(L);  /* Load FFI library on-demand. */[m
[31m-      L->top = restorestack(L, oldtop);[m
[31m-    }[m
[31m-#endif[m
[31m-    lj_ir_kvalue(L, L->top-2, ir);[m
[31m-    setintV(L->top-1, (int32_t)irt_type(ir->t));[m
[31m-    if (slot == -1)[m
[31m-      return 2;[m
[31m-    setintV(L->top++, slot);[m
[31m-    return 3;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local snap = jit.util.tracesnap(tr, sn) */[m
[31m-LJLIB_CF(jit_util_tracesnap)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  SnapNo sn = (SnapNo)lj_lib_checkint(L, 2);[m
[31m-  if (T && sn < T->nsnap) {[m
[31m-    SnapShot *snap = &T->snap[sn];[m
[31m-    SnapEntry *map = &T->snapmap[snap->mapofs];[m
[31m-    MSize n, nent = snap->nent;[m
[31m-    GCtab *t;[m
[31m-    lua_createtable(L, nent+2, 0);[m
[31m-    t = tabV(L->top-1);[m
[31m-    setintV(lj_tab_setint(L, t, 0), (int32_t)snap->ref - REF_BIAS);[m
[31m-    setintV(lj_tab_setint(L, t, 1), (int32_t)snap->nslots);[m
[31m-    for (n = 0; n < nent; n++)[m
[31m-      setintV(lj_tab_setint(L, t, (int32_t)(n+2)), (int32_t)map[n]);[m
[31m-    setintV(lj_tab_setint(L, t, (int32_t)(nent+2)), (int32_t)SNAP(255, 0, 0));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local mcode, addr, loop = jit.util.tracemc(tr) */[m
[31m-LJLIB_CF(jit_util_tracemc)[m
[31m-{[m
[31m-  GCtrace *T = jit_checktrace(L);[m
[31m-  if (T && T->mcode != NULL) {[m
[31m-    setstrV(L, L->top-1, lj_str_new(L, (const char *)T->mcode, T->szmcode));[m
[31m-    setintptrV(L->top++, (intptr_t)(void *)T->mcode);[m
[31m-    setintV(L->top++, T->mcloop);[m
[31m-    return 3;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local addr = jit.util.traceexitstub([tr,] exitno) */[m
[31m-LJLIB_CF(jit_util_traceexitstub)[m
[31m-{[m
[31m-#ifdef EXITSTUBS_PER_GROUP[m
[31m-  ExitNo exitno = (ExitNo)lj_lib_checkint(L, 1);[m
[31m-  jit_State *J = L2J(L);[m
[31m-  if (exitno < EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR) {[m
[31m-    setintptrV(L->top-1, (intptr_t)(void *)exitstub_addr(J, exitno));[m
[31m-    return 1;[m
[31m-  }[m
[31m-#else[m
[31m-  if (L->top > L->base+1) {  /* Don't throw for one-argument variant. */[m
[31m-    GCtrace *T = jit_checktrace(L);[m
[31m-    ExitNo exitno = (ExitNo)lj_lib_checkint(L, 2);[m
[31m-    ExitNo maxexit = T->root ? T->nsnap+1 : T->nsnap;[m
[31m-    if (T && T->mcode != NULL && exitno < maxexit) {[m
[31m-      setintptrV(L->top-1, (intptr_t)(void *)exitstub_trace_addr(T, exitno));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* local addr = jit.util.ircalladdr(idx) */[m
[31m-LJLIB_CF(jit_util_ircalladdr)[m
[31m-{[m
[31m-  uint32_t idx = (uint32_t)lj_lib_checkint(L, 1);[m
[31m-  if (idx < IRCALL__MAX) {[m
[31m-    setintptrV(L->top-1, (intptr_t)(void *)lj_ir_callinfo[idx].func);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-static int luaopen_jit_util(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, NULL, jit_util);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* -- jit.opt module ------------------------------------------------------ */[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#define LJLIB_MODULE_jit_opt[m
[31m-[m
[31m-/* Parse optimization level. */[m
[31m-static int jitopt_level(jit_State *J, const char *str)[m
[31m-{[m
[31m-  if (str[0] >= '0' && str[0] <= '9' && str[1] == '\0') {[m
[31m-    uint32_t flags;[m
[31m-    if (str[0] == '0') flags = JIT_F_OPT_0;[m
[31m-    else if (str[0] == '1') flags = JIT_F_OPT_1;[m
[31m-    else if (str[0] == '2') flags = JIT_F_OPT_2;[m
[31m-    else flags = JIT_F_OPT_3;[m
[31m-    J->flags = (J->flags & ~JIT_F_OPT_MASK) | flags;[m
[31m-    return 1;  /* Ok. */[m
[31m-  }[m
[31m-  return 0;  /* No match. */[m
[31m-}[m
[31m-[m
[31m-/* Parse optimization flag. */[m
[31m-static int jitopt_flag(jit_State *J, const char *str)[m
[31m-{[m
[31m-  const char *lst = JIT_F_OPTSTRING;[m
[31m-  uint32_t opt;[m
[31m-  int set = 1;[m
[31m-  if (str[0] == '+') {[m
[31m-    str++;[m
[31m-  } else if (str[0] == '-') {[m
[31m-    str++;[m
[31m-    set = 0;[m
[31m-  } else if (str[0] == 'n' && str[1] == 'o') {[m
[31m-    str += str[2] == '-' ? 3 : 2;[m
[31m-    set = 0;[m
[31m-  }[m
[31m-  for (opt = JIT_F_OPT_FIRST; ; opt <<= 1) {[m
[31m-    size_t len = *(const uint8_t *)lst;[m
[31m-    if (len == 0)[m
[31m-      break;[m
[31m-    if (strncmp(str, lst+1, len) == 0 && str[len] == '\0') {[m
[31m-      if (set) J->flags |= opt; else J->flags &= ~opt;[m
[31m-      return 1;  /* Ok. */[m
[31m-    }[m
[31m-    lst += 1+len;[m
[31m-  }[m
[31m-  return 0;  /* No match. */[m
[31m-}[m
[31m-[m
[31m-/* Parse optimization parameter. */[m
[31m-static int jitopt_param(jit_State *J, const char *str)[m
[31m-{[m
[31m-  const char *lst = JIT_P_STRING;[m
[31m-  int i;[m
[31m-  for (i = 0; i < JIT_P__MAX; i++) {[m
[31m-    size_t len = *(const uint8_t *)lst;[m
[31m-    lua_assert(len != 0);[m
[31m-    if (strncmp(str, lst+1, len) == 0 && str[len] == '=') {[m
[31m-      int32_t n = 0;[m
[31m-      const char *p = &str[len+1];[m
[31m-      while (*p >= '0' && *p <= '9')[m
[31m-	n = n*10 + (*p++ - '0');[m
[31m-      if (*p) return 0;  /* Malformed number. */[m
[31m-      J->param[i] = n;[m
[31m-      if (i == JIT_P_hotloop)[m
[31m-	lj_dispatch_init_hotcount(J2G(J));[m
[31m-      return 1;  /* Ok. */[m
[31m-    }[m
[31m-    lst += 1+len;[m
[31m-  }[m
[31m-  return 0;  /* No match. */[m
[31m-}[m
[31m-[m
[31m-/* jit.opt.start(flags...) */[m
[31m-LJLIB_CF(jit_opt_start)[m
[31m-{[m
[31m-  jit_State *J = L2J(L);[m
[31m-  int nargs = (int)(L->top - L->base);[m
[31m-  if (nargs == 0) {[m
[31m-    J->flags = (J->flags & ~JIT_F_OPT_MASK) | JIT_F_OPT_DEFAULT;[m
[31m-  } else {[m
[31m-    int i;[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-      const char *str = strdata(lj_lib_checkstr(L, i));[m
[31m-      if (!jitopt_level(J, str) &&[m
[31m-	  !jitopt_flag(J, str) &&[m
[31m-	  !jitopt_param(J, str))[m
[31m-	lj_err_callerv(L, LJ_ERR_JITOPT, str);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- jit.profile module -------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-[m
[31m-#define LJLIB_MODULE_jit_profile[m
[31m-[m
[31m-/* Not loaded by default, use: local profile = require("jit.profile") */[m
[31m-[m
[31m-static const char KEY_PROFILE_THREAD = 't';[m
[31m-static const char KEY_PROFILE_FUNC = 'f';[m
[31m-[m
[31m-static void jit_profile_callback(lua_State *L2, lua_State *L, int samples,[m
[31m-				 int vmstate)[m
[31m-{[m
[31m-  TValue key;[m
[31m-  cTValue *tv;[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_FUNC);[m
[31m-  tv = lj_tab_get(L, tabV(registry(L)), &key);[m
[31m-  if (tvisfunc(tv)) {[m
[31m-    char vmst = (char)vmstate;[m
[31m-    int status;[m
[31m-    setfuncV(L2, L2->top++, funcV(tv));[m
[31m-    setthreadV(L2, L2->top++, L);[m
[31m-    setintV(L2->top++, samples);[m
[31m-    setstrV(L2, L2->top++, lj_str_new(L2, &vmst, 1));[m
[31m-    status = lua_pcall(L2, 3, 0, 0);  /* callback(thread, samples, vmstate) */[m
[31m-    if (status) {[m
[31m-      if (G(L2)->panic) G(L2)->panic(L2);[m
[31m-      exit(EXIT_FAILURE);[m
[31m-    }[m
[31m-    lj_trace_abort(G(L2));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* profile.start(mode, cb) */[m
[31m-LJLIB_CF(jit_profile_start)[m
[31m-{[m
[31m-  GCtab *registry = tabV(registry(L));[m
[31m-  GCstr *mode = lj_lib_optstr(L, 1);[m
[31m-  GCfunc *func = lj_lib_checkfunc(L, 2);[m
[31m-  lua_State *L2 = lua_newthread(L);  /* Thread that runs profiler callback. */[m
[31m-  TValue key;[m
[31m-  /* Anchor thread and function in registry. */[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_THREAD);[m
[31m-  setthreadV(L, lj_tab_set(L, registry, &key), L2);[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_FUNC);[m
[31m-  setfuncV(L, lj_tab_set(L, registry, &key), func);[m
[31m-  lj_gc_anybarriert(L, registry);[m
[31m-  luaJIT_profile_start(L, mode ? strdata(mode) : "",[m
[31m-		       (luaJIT_profile_callback)jit_profile_callback, L2);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* profile.stop() */[m
[31m-LJLIB_CF(jit_profile_stop)[m
[31m-{[m
[31m-  GCtab *registry;[m
[31m-  TValue key;[m
[31m-  luaJIT_profile_stop(L);[m
[31m-  registry = tabV(registry(L));[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_THREAD);[m
[31m-  setnilV(lj_tab_set(L, registry, &key));[m
[31m-  setlightudV(&key, (void *)&KEY_PROFILE_FUNC);[m
[31m-  setnilV(lj_tab_set(L, registry, &key));[m
[31m-  lj_gc_anybarriert(L, registry);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* dump = profile.dumpstack([thread,] fmt, depth) */[m
[31m-LJLIB_CF(jit_profile_dumpstack)[m
[31m-{[m
[31m-  lua_State *L2 = L;[m
[31m-  int arg = 0;[m
[31m-  size_t len;[m
[31m-  int depth;[m
[31m-  GCstr *fmt;[m
[31m-  const char *p;[m
[31m-  if (L->top > L->base && tvisthread(L->base)) {[m
[31m-    L2 = threadV(L->base);[m
[31m-    arg = 1;[m
[31m-  }[m
[31m-  fmt = lj_lib_checkstr(L, arg+1);[m
[31m-  depth = lj_lib_checkint(L, arg+2);[m
[31m-  p = luaJIT_profile_dumpstack(L2, strdata(fmt), depth, &len);[m
[31m-  lua_pushlstring(L, p, len);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-static int luaopen_jit_profile(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, NULL, jit_profile);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- JIT compiler initialization ----------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Default values for JIT parameters. */[m
[31m-static const int32_t jit_param_default[JIT_P__MAX+1] = {[m
[31m-#define JIT_PARAMINIT(len, name, value)	(value),[m
[31m-JIT_PARAMDEF(JIT_PARAMINIT)[m
[31m-#undef JIT_PARAMINIT[m
[31m-  0[m
[31m-};[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_ARM && LJ_TARGET_LINUX[m
[31m-#include <sys/utsname.h>[m
[31m-#endif[m
[31m-[m
[31m-/* Arch-dependent CPU detection. */[m
[31m-static uint32_t jit_cpudetect(lua_State *L)[m
[31m-{[m
[31m-  uint32_t flags = 0;[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  uint32_t vendor[4];[m
[31m-  uint32_t features[4];[m
[31m-  if (lj_vm_cpuid(0, vendor) && lj_vm_cpuid(1, features)) {[m
[31m-#if !LJ_HASJIT[m
[31m-#define JIT_F_SSE2	2[m
[31m-#endif[m
[31m-    flags |= ((features[3] >> 26)&1) * JIT_F_SSE2;[m
[31m-#if LJ_HASJIT[m
[31m-    flags |= ((features[2] >> 0)&1) * JIT_F_SSE3;[m
[31m-    flags |= ((features[2] >> 19)&1) * JIT_F_SSE4_1;[m
[31m-    if (vendor[2] == 0x6c65746e) {  /* Intel. */[m
[31m-      if ((features[0] & 0x0fff0ff0) == 0x000106c0)  /* Atom. */[m
[31m-	flags |= JIT_F_LEA_AGU;[m
[31m-    } else if (vendor[2] == 0x444d4163) {  /* AMD. */[m
[31m-      uint32_t fam = (features[0] & 0x0ff00f00);[m
[31m-      if (fam >= 0x00000f00)  /* K8, K10. */[m
[31m-	flags |= JIT_F_PREFER_IMUL;[m
[31m-    }[m
[31m-    if (vendor[0] >= 7) {[m
[31m-      uint32_t xfeatures[4];[m
[31m-      lj_vm_cpuid(7, xfeatures);[m
[31m-      flags |= ((xfeatures[1] >> 8)&1) * JIT_F_BMI2;[m
[31m-    }[m
[31m-#endif[m
[31m-  }[m
[31m-  /* Check for required instruction set support on x86 (unnecessary on x64). */[m
[31m-#if LJ_TARGET_X86[m
[31m-  if (!(flags & JIT_F_SSE2))[m
[31m-    luaL_error(L, "CPU with SSE2 required");[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#if LJ_HASJIT[m
[31m-  int ver = LJ_ARCH_VERSION;  /* Compile-time ARM CPU detection. */[m
[31m-#if LJ_TARGET_LINUX[m
[31m-  if (ver < 70) {  /* Runtime ARM CPU detection. */[m
[31m-    struct utsname ut;[m
[31m-    uname(&ut);[m
[31m-    if (strncmp(ut.machine, "armv", 4) == 0) {[m
[31m-      if (ut.machine[4] >= '7')[m
[31m-	ver = 70;[m
[31m-      else if (ut.machine[4] == '6')[m
[31m-	ver = 60;[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  flags |= ver >= 70 ? JIT_F_ARMV7 :[m
[31m-	   ver >= 61 ? JIT_F_ARMV6T2_ :[m
[31m-	   ver >= 60 ? JIT_F_ARMV6_ : 0;[m
[31m-  flags |= LJ_ARCH_HASFPU == 0 ? 0 : ver >= 70 ? JIT_F_VFPV3 : JIT_F_VFPV2;[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-  /* No optional CPU features to detect (for now). */[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#if LJ_HASJIT[m
[31m-#if LJ_ARCH_SQRT[m
[31m-  flags |= JIT_F_SQRT;[m
[31m-#endif[m
[31m-#if LJ_ARCH_ROUND[m
[31m-  flags |= JIT_F_ROUND;[m
[31m-#endif[m
[31m-#endif[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#if LJ_HASJIT[m
[31m-  /* Compile-time MIPS CPU detection. */[m
[31m-#if LJ_ARCH_VERSION >= 20[m
[31m-  flags |= JIT_F_MIPS32R2;[m
[31m-#endif[m
[31m-  /* Runtime MIPS CPU detection. */[m
[31m-#if defined(__GNUC__)[m
[31m-  if (!(flags & JIT_F_MIPS32R2)) {[m
[31m-    int x;[m
[31m-    /* On MIPS32R1 rotr is treated as srl. rotr r2,r2,1 -> srl r2,r2,1. */[m
[31m-    __asm__("li $2, 1\n\t.long 0x00221042\n\tmove %0, $2" : "=r"(x) : : "$2");[m
[31m-    if (x) flags |= JIT_F_MIPS32R2;  /* Either 0x80000000 (R2) or 0 (R1). */[m
[31m-  }[m
[31m-#endif[m
[31m-#endif[m
[31m-#else[m
[31m-#error "Missing CPU detection for this architecture"[m
[31m-#endif[m
[31m-  UNUSED(L);[m
[31m-  return flags;[m
[31m-}[m
[31m-[m
[31m-/* Initialize JIT compiler. */[m
[31m-static void jit_init(lua_State *L)[m
[31m-{[m
[31m-  uint32_t flags = jit_cpudetect(L);[m
[31m-#if LJ_HASJIT[m
[31m-  jit_State *J = L2J(L);[m
[31m-  J->flags = flags | JIT_F_ON | JIT_F_OPT_DEFAULT;[m
[31m-  memcpy(J->param, jit_param_default, sizeof(J->param));[m
[31m-  lj_dispatch_update(G(L));[m
[31m-#else[m
[31m-  UNUSED(flags);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaopen_jit(lua_State *L)[m
[31m-{[m
[31m-  jit_init(L);[m
[31m-  lua_pushliteral(L, LJ_OS_NAME);[m
[31m-  lua_pushliteral(L, LJ_ARCH_NAME);[m
[31m-  lua_pushinteger(L, LUAJIT_VERSION_NUM);[m
[31m-  lua_pushliteral(L, LUAJIT_VERSION);[m
[31m-  LJ_LIB_REG(L, LUA_JITLIBNAME, jit);[m
[31m-#if LJ_HASPROFILE[m
[31m-  lj_lib_prereg(L, LUA_JITLIBNAME ".profile", luaopen_jit_profile,[m
[31m-		tabref(L->env));[m
[31m-#endif[m
[31m-#ifndef LUAJIT_DISABLE_JITUTIL[m
[31m-  lj_lib_prereg(L, LUA_JITLIBNAME ".util", luaopen_jit_util, tabref(L->env));[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-  LJ_LIB_REG(L, "jit.opt", jit_opt);[m
[31m-#endif[m
[31m-  L->top -= 2;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_math.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_math.c[m
[1mdeleted file mode 100644[m
[1mindex f90dd33..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_math.c[m
[1m+++ /dev/null[m
[36m@@ -1,230 +0,0 @@[m
[31m-/*[m
[31m-** Math library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <math.h>[m
[31m-[m
[31m-#define lib_math_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_lib.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_math[m
[31m-[m
[31m-LJLIB_ASM(math_abs)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checknumber(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(math_floor)		LJLIB_REC(math_round IRFPM_FLOOR)[m
[31m-LJLIB_ASM_(math_ceil)		LJLIB_REC(math_round IRFPM_CEIL)[m
[31m-[m
[31m-LJLIB_ASM(math_sqrt)		LJLIB_REC(math_unary IRFPM_SQRT)[m
[31m-{[m
[31m-  lj_lib_checknum(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(math_log10)		LJLIB_REC(math_unary IRFPM_LOG10)[m
[31m-LJLIB_ASM_(math_exp)		LJLIB_REC(math_unary IRFPM_EXP)[m
[31m-LJLIB_ASM_(math_sin)		LJLIB_REC(math_unary IRFPM_SIN)[m
[31m-LJLIB_ASM_(math_cos)		LJLIB_REC(math_unary IRFPM_COS)[m
[31m-LJLIB_ASM_(math_tan)		LJLIB_REC(math_unary IRFPM_TAN)[m
[31m-LJLIB_ASM_(math_asin)		LJLIB_REC(math_atrig FF_math_asin)[m
[31m-LJLIB_ASM_(math_acos)		LJLIB_REC(math_atrig FF_math_acos)[m
[31m-LJLIB_ASM_(math_atan)		LJLIB_REC(math_atrig FF_math_atan)[m
[31m-LJLIB_ASM_(math_sinh)		LJLIB_REC(math_htrig IRCALL_sinh)[m
[31m-LJLIB_ASM_(math_cosh)		LJLIB_REC(math_htrig IRCALL_cosh)[m
[31m-LJLIB_ASM_(math_tanh)		LJLIB_REC(math_htrig IRCALL_tanh)[m
[31m-LJLIB_ASM_(math_frexp)[m
[31m-LJLIB_ASM_(math_modf)		LJLIB_REC(.)[m
[31m-[m
[31m-LJLIB_ASM(math_log)		LJLIB_REC(math_log)[m
[31m-{[m
[31m-  double x = lj_lib_checknum(L, 1);[m
[31m-  if (L->base+1 < L->top) {[m
[31m-    double y = lj_lib_checknum(L, 2);[m
[31m-#ifdef LUAJIT_NO_LOG2[m
[31m-    x = log(x); y = 1.0 / log(y);[m
[31m-#else[m
[31m-    x = lj_vm_log2(x); y = 1.0 / lj_vm_log2(y);[m
[31m-#endif[m
[31m-    setnumV(L->base-1-LJ_FR2, x*y);  /* Do NOT join the expression to x / y. */[m
[31m-    return FFH_RES(1);[m
[31m-  }[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-[m
[31m-LJLIB_LUA(math_deg) /* function(x) return x * 57.29577951308232 end */[m
[31m-LJLIB_LUA(math_rad) /* function(x) return x * 0.017453292519943295 end */[m
[31m-[m
[31m-LJLIB_ASM(math_atan2)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checknum(L, 1);[m
[31m-  lj_lib_checknum(L, 2);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(math_pow)		LJLIB_REC(.)[m
[31m-LJLIB_ASM_(math_fmod)[m
[31m-[m
[31m-LJLIB_ASM(math_ldexp)		LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_lib_checknum(L, 1);[m
[31m-#if LJ_DUALNUM && !LJ_TARGET_X86ORX64[m
[31m-  lj_lib_checkint(L, 2);[m
[31m-#else[m
[31m-  lj_lib_checknum(L, 2);[m
[31m-#endif[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(math_min)		LJLIB_REC(math_minmax IR_MIN)[m
[31m-{[m
[31m-  int i = 0;[m
[31m-  do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(math_max)		LJLIB_REC(math_minmax IR_MAX)[m
[31m-[m
[31m-LJLIB_PUSH(3.14159265358979323846) LJLIB_SET(pi)[m
[31m-LJLIB_PUSH(1e310) LJLIB_SET(huge)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* This implements a Tausworthe PRNG with period 2^223. Based on:[m
[31m-**   Tables of maximally-equidistributed combined LFSR generators,[m
[31m-**   Pierre L'Ecuyer, 1991, table 3, 1st entry.[m
[31m-** Full-period ME-CF generator with L=64, J=4, k=223, N1=49.[m
[31m-*/[m
[31m-[m
[31m-/* PRNG state. */[m
[31m-struct RandomState {[m
[31m-  uint64_t gen[4];	/* State of the 4 LFSR generators. */[m
[31m-  int valid;		/* State is valid. */[m
[31m-};[m
[31m-[m
[31m-/* Union needed for bit-pattern conversion between uint64_t and double. */[m
[31m-typedef union { uint64_t u64; double d; } U64double;[m
[31m-[m
[31m-/* Update generator i and compute a running xor of all states. */[m
[31m-#define TW223_GEN(i, k, q, s) \[m
[31m-  z = rs->gen[i]; \[m
[31m-  z = (((z<<q)^z) >> (k-s)) ^ ((z&((uint64_t)(int64_t)-1 << (64-k)))<<s); \[m
[31m-  r ^= z; rs->gen[i] = z;[m
[31m-[m
[31m-/* PRNG step function. Returns a double in the range 1.0 <= d < 2.0. */[m
[31m-LJ_NOINLINE uint64_t LJ_FASTCALL lj_math_random_step(RandomState *rs)[m
[31m-{[m
[31m-  uint64_t z, r = 0;[m
[31m-  TW223_GEN(0, 63, 31, 18)[m
[31m-  TW223_GEN(1, 58, 19, 28)[m
[31m-  TW223_GEN(2, 55, 24,  7)[m
[31m-  TW223_GEN(3, 47, 21,  8)[m
[31m-  return (r & U64x(000fffff,ffffffff)) | U64x(3ff00000,00000000);[m
[31m-}[m
[31m-[m
[31m-/* PRNG initialization function. */[m
[31m-static void random_init(RandomState *rs, double d)[m
[31m-{[m
[31m-  uint32_t r = 0x11090601;  /* 64-k[i] as four 8 bit constants. */[m
[31m-  int i;[m
[31m-  for (i = 0; i < 4; i++) {[m
[31m-    U64double u;[m
[31m-    uint32_t m = 1u << (r&255);[m
[31m-    r >>= 8;[m
[31m-    u.d = d = d * 3.14159265358979323846 + 2.7182818284590452354;[m
[31m-    if (u.u64 < m) u.u64 += m;  /* Ensure k[i] MSB of gen[i] are non-zero. */[m
[31m-    rs->gen[i] = u.u64;[m
[31m-  }[m
[31m-  rs->valid = 1;[m
[31m-  for (i = 0; i < 10; i++)[m
[31m-    lj_math_random_step(rs);[m
[31m-}[m
[31m-[m
[31m-/* PRNG extract function. */[m
[31m-LJLIB_PUSH(top-2)  /* Upvalue holds userdata with RandomState. */[m
[31m-LJLIB_CF(math_random)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int n = (int)(L->top - L->base);[m
[31m-  RandomState *rs = (RandomState *)(uddata(udataV(lj_lib_upvalue(L, 1))));[m
[31m-  U64double u;[m
[31m-  double d;[m
[31m-  if (LJ_UNLIKELY(!rs->valid)) random_init(rs, 0.0);[m
[31m-  u.u64 = lj_math_random_step(rs);[m
[31m-  d = u.d - 1.0;[m
[31m-  if (n > 0) {[m
[31m-#if LJ_DUALNUM[m
[31m-    int isint = 1;[m
[31m-    double r1;[m
[31m-    lj_lib_checknumber(L, 1);[m
[31m-    if (tvisint(L->base)) {[m
[31m-      r1 = (lua_Number)intV(L->base);[m
[31m-    } else {[m
[31m-      isint = 0;[m
[31m-      r1 = numV(L->base);[m
[31m-    }[m
[31m-#else[m
[31m-    double r1 = lj_lib_checknum(L, 1);[m
[31m-#endif[m
[31m-    if (n == 1) {[m
[31m-      d = lj_vm_floor(d*r1) + 1.0;  /* d is an int in range [1, r1] */[m
[31m-    } else {[m
[31m-#if LJ_DUALNUM[m
[31m-      double r2;[m
[31m-      lj_lib_checknumber(L, 2);[m
[31m-      if (tvisint(L->base+1)) {[m
[31m-	r2 = (lua_Number)intV(L->base+1);[m
[31m-      } else {[m
[31m-	isint = 0;[m
[31m-	r2 = numV(L->base+1);[m
[31m-      }[m
[31m-#else[m
[31m-      double r2 = lj_lib_checknum(L, 2);[m
[31m-#endif[m
[31m-      d = lj_vm_floor(d*(r2-r1+1.0)) + r1;  /* d is an int in range [r1, r2] */[m
[31m-    }[m
[31m-#if LJ_DUALNUM[m
[31m-    if (isint) {[m
[31m-      setintV(L->top-1, lj_num2int(d));[m
[31m-      return 1;[m
[31m-    }[m
[31m-#endif[m
[31m-  }  /* else: d is a double in range [0, 1] */[m
[31m-  setnumV(L->top++, d);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* PRNG seed function. */[m
[31m-LJLIB_PUSH(top-2)  /* Upvalue holds userdata with RandomState. */[m
[31m-LJLIB_CF(math_randomseed)[m
[31m-{[m
[31m-  RandomState *rs = (RandomState *)(uddata(udataV(lj_lib_upvalue(L, 1))));[m
[31m-  random_init(rs, lj_lib_checknum(L, 1));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_math(lua_State *L)[m
[31m-{[m
[31m-  RandomState *rs;[m
[31m-  rs = (RandomState *)lua_newuserdata(L, sizeof(RandomState));[m
[31m-  rs->valid = 0;  /* Use lazy initialization to save some time on startup. */[m
[31m-  LJ_LIB_REG(L, LUA_MATHLIBNAME, math);[m
[31m-#if defined(LUA_COMPAT_MOD) && !LJ_52[m
[31m-  lua_getfield(L, -1, "fmod");[m
[31m-  lua_setfield(L, -2, "mod");[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_os.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_os.c[m
[1mdeleted file mode 100644[m
[1mindex 941c2a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_os.c[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-/*[m
[31m-** OS library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <time.h>[m
[31m-[m
[31m-#define lib_os_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-#if LJ_TARGET_POSIX[m
[31m-#include <unistd.h>[m
[31m-#else[m
[31m-#include <stdio.h>[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_TARGET_PSVITA[m
[31m-#include <locale.h>[m
[31m-#endif[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_os[m
[31m-[m
[31m-LJLIB_CF(os_execute)[m
[31m-{[m
[31m-#if LJ_NO_SYSTEM[m
[31m-#if LJ_52[m
[31m-  errno = ENOSYS;[m
[31m-  return luaL_fileresult(L, 0, NULL);[m
[31m-#else[m
[31m-  lua_pushinteger(L, -1);[m
[31m-  return 1;[m
[31m-#endif[m
[31m-#else[m
[31m-  const char *cmd = luaL_optstring(L, 1, NULL);[m
[31m-  int stat = system(cmd);[m
[31m-#if LJ_52[m
[31m-  if (cmd)[m
[31m-    return luaL_execresult(L, stat);[m
[31m-  setboolV(L->top++, 1);[m
[31m-#else[m
[31m-  setintV(L->top++, stat);[m
[31m-#endif[m
[31m-  return 1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_remove)[m
[31m-{[m
[31m-  const char *filename = luaL_checkstring(L, 1);[m
[31m-  return luaL_fileresult(L, remove(filename) == 0, filename);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_rename)[m
[31m-{[m
[31m-  const char *fromname = luaL_checkstring(L, 1);[m
[31m-  const char *toname = luaL_checkstring(L, 2);[m
[31m-  return luaL_fileresult(L, rename(fromname, toname) == 0, fromname);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_tmpname)[m
[31m-{[m
[31m-#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PSVITA[m
[31m-  lj_err_caller(L, LJ_ERR_OSUNIQF);[m
[31m-  return 0;[m
[31m-#else[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  char buf[15+1];[m
[31m-  int fp;[m
[31m-  strcpy(buf, "/tmp/lua_XXXXXX");[m
[31m-  fp = mkstemp(buf);[m
[31m-  if (fp != -1)[m
[31m-    close(fp);[m
[31m-  else[m
[31m-    lj_err_caller(L, LJ_ERR_OSUNIQF);[m
[31m-#else[m
[31m-  char buf[L_tmpnam];[m
[31m-  if (tmpnam(buf) == NULL)[m
[31m-    lj_err_caller(L, LJ_ERR_OSUNIQF);[m
[31m-#endif[m
[31m-  lua_pushstring(L, buf);[m
[31m-  return 1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_getenv)[m
[31m-{[m
[31m-#if LJ_TARGET_CONSOLE[m
[31m-  lua_pushnil(L);[m
[31m-#else[m
[31m-  lua_pushstring(L, getenv(luaL_checkstring(L, 1)));  /* if NULL push nil */[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_exit)[m
[31m-{[m
[31m-  int status;[m
[31m-  if (L->base < L->top && tvisbool(L->base))[m
[31m-    status = boolV(L->base) ? EXIT_SUCCESS : EXIT_FAILURE;[m
[31m-  else[m
[31m-    status = lj_lib_optint(L, 1, EXIT_SUCCESS);[m
[31m-  if (L->base+1 < L->top && tvistruecond(L->base+1))[m
[31m-    lua_close(L);[m
[31m-  exit(status);[m
[31m-  return 0;  /* Unreachable. */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_clock)[m
[31m-{[m
[31m-  setnumV(L->top++, ((lua_Number)clock())*(1.0/(lua_Number)CLOCKS_PER_SEC));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void setfield(lua_State *L, const char *key, int value)[m
[31m-{[m
[31m-  lua_pushinteger(L, value);[m
[31m-  lua_setfield(L, -2, key);[m
[31m-}[m
[31m-[m
[31m-static void setboolfield(lua_State *L, const char *key, int value)[m
[31m-{[m
[31m-  if (value < 0)  /* undefined? */[m
[31m-    return;  /* does not set field */[m
[31m-  lua_pushboolean(L, value);[m
[31m-  lua_setfield(L, -2, key);[m
[31m-}[m
[31m-[m
[31m-static int getboolfield(lua_State *L, const char *key)[m
[31m-{[m
[31m-  int res;[m
[31m-  lua_getfield(L, -1, key);[m
[31m-  res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1);[m
[31m-  lua_pop(L, 1);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-static int getfield(lua_State *L, const char *key, int d)[m
[31m-{[m
[31m-  int res;[m
[31m-  lua_getfield(L, -1, key);[m
[31m-  if (lua_isnumber(L, -1)) {[m
[31m-    res = (int)lua_tointeger(L, -1);[m
[31m-  } else {[m
[31m-    if (d < 0)[m
[31m-      lj_err_callerv(L, LJ_ERR_OSDATEF, key);[m
[31m-    res = d;[m
[31m-  }[m
[31m-  lua_pop(L, 1);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_date)[m
[31m-{[m
[31m-  const char *s = luaL_optstring(L, 1, "%c");[m
[31m-  time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL));[m
[31m-  struct tm *stm;[m
[31m-#if LJ_TARGET_POSIX[m
[31m-  struct tm rtm;[m
[31m-#endif[m
[31m-  if (*s == '!') {  /* UTC? */[m
[31m-    s++;  /* Skip '!' */[m
[31m-#if LJ_TARGET_POSIX[m
[31m-    stm = gmtime_r(&t, &rtm);[m
[31m-#else[m
[31m-    stm = gmtime(&t);[m
[31m-#endif[m
[31m-  } else {[m
[31m-#if LJ_TARGET_POSIX[m
[31m-    stm = localtime_r(&t, &rtm);[m
[31m-#else[m
[31m-    stm = localtime(&t);[m
[31m-#endif[m
[31m-  }[m
[31m-  if (stm == NULL) {  /* Invalid date? */[m
[31m-    setnilV(L->top++);[m
[31m-  } else if (strcmp(s, "*t") == 0) {[m
[31m-    lua_createtable(L, 0, 9);  /* 9 = number of fields */[m
[31m-    setfield(L, "sec", stm->tm_sec);[m
[31m-    setfield(L, "min", stm->tm_min);[m
[31m-    setfield(L, "hour", stm->tm_hour);[m
[31m-    setfield(L, "day", stm->tm_mday);[m
[31m-    setfield(L, "month", stm->tm_mon+1);[m
[31m-    setfield(L, "year", stm->tm_year+1900);[m
[31m-    setfield(L, "wday", stm->tm_wday+1);[m
[31m-    setfield(L, "yday", stm->tm_yday+1);[m
[31m-    setboolfield(L, "isdst", stm->tm_isdst);[m
[31m-  } else if (*s) {[m
[31m-    SBuf *sb = &G(L)->tmpbuf;[m
[31m-    MSize sz = 0;[m
[31m-    const char *q;[m
[31m-    for (q = s; *q; q++)[m
[31m-      sz += (*q == '%') ? 30 : 1;  /* Overflow doesn't matter. */[m
[31m-    setsbufL(sb, L);[m
[31m-    for (;;) {[m
[31m-      char *buf = lj_buf_need(sb, sz);[m
[31m-      size_t len = strftime(buf, sbufsz(sb), s, stm);[m
[31m-      if (len) {[m
[31m-	setstrV(L, L->top++, lj_str_new(L, buf, len));[m
[31m-	lj_gc_check(L);[m
[31m-	break;[m
[31m-      }[m
[31m-      sz += (sz|1);[m
[31m-    }[m
[31m-  } else {[m
[31m-    setstrV(L, L->top++, &G(L)->strempty);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_time)[m
[31m-{[m
[31m-  time_t t;[m
[31m-  if (lua_isnoneornil(L, 1)) {  /* called without args? */[m
[31m-    t = time(NULL);  /* get current time */[m
[31m-  } else {[m
[31m-    struct tm ts;[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-    lua_settop(L, 1);  /* make sure table is at the top */[m
[31m-    ts.tm_sec = getfield(L, "sec", 0);[m
[31m-    ts.tm_min = getfield(L, "min", 0);[m
[31m-    ts.tm_hour = getfield(L, "hour", 12);[m
[31m-    ts.tm_mday = getfield(L, "day", -1);[m
[31m-    ts.tm_mon = getfield(L, "month", -1) - 1;[m
[31m-    ts.tm_year = getfield(L, "year", -1) - 1900;[m
[31m-    ts.tm_isdst = getboolfield(L, "isdst");[m
[31m-    t = mktime(&ts);[m
[31m-  }[m
[31m-  if (t == (time_t)(-1))[m
[31m-    lua_pushnil(L);[m
[31m-  else[m
[31m-    lua_pushnumber(L, (lua_Number)t);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(os_difftime)[m
[31m-{[m
[31m-  lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)),[m
[31m-			     (time_t)(luaL_optnumber(L, 2, (lua_Number)0))));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-LJLIB_CF(os_setlocale)[m
[31m-{[m
[31m-#if LJ_TARGET_PSVITA[m
[31m-  lua_pushliteral(L, "C");[m
[31m-#else[m
[31m-  GCstr *s = lj_lib_optstr(L, 1);[m
[31m-  const char *str = s ? strdata(s) : NULL;[m
[31m-  int opt = lj_lib_checkopt(L, 2, 6,[m
[31m-    "\5ctype\7numeric\4time\7collate\10monetary\1\377\3all");[m
[31m-  if (opt == 0) opt = LC_CTYPE;[m
[31m-  else if (opt == 1) opt = LC_NUMERIC;[m
[31m-  else if (opt == 2) opt = LC_TIME;[m
[31m-  else if (opt == 3) opt = LC_COLLATE;[m
[31m-  else if (opt == 4) opt = LC_MONETARY;[m
[31m-  else if (opt == 6) opt = LC_ALL;[m
[31m-  lua_pushstring(L, setlocale(opt, str));[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_os(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, LUA_OSLIBNAME, os);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_package.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_package.c[m
[1mdeleted file mode 100644[m
[1mindex 8c336b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_package.c[m
[1m+++ /dev/null[m
[36m@@ -1,610 +0,0 @@[m
[31m-/*[m
[31m-** Package library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2012 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_package_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Error codes for ll_loadfunc. */[m
[31m-#define PACKAGE_ERR_LIB		1[m
[31m-#define PACKAGE_ERR_FUNC	2[m
[31m-#define PACKAGE_ERR_LOAD	3[m
[31m-[m
[31m-/* Redefined in platform specific part. */[m
[31m-#define PACKAGE_LIB_FAIL	"open"[m
[31m-#define setprogdir(L)		((void)0)[m
[31m-[m
[31m-/* Symbol name prefixes. */[m
[31m-#define SYMPREFIX_CF		"luaopen_%s"[m
[31m-#define SYMPREFIX_BC		"luaJIT_BC_%s"[m
[31m-[m
[31m-#if LJ_TARGET_DLOPEN[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-static void ll_unloadlib(void *lib)[m
[31m-{[m
[31m-  dlclose(lib);[m
[31m-}[m
[31m-[m
[31m-static void *ll_load(lua_State *L, const char *path, int gl)[m
[31m-{[m
[31m-  void *lib = dlopen(path, RTLD_NOW | (gl ? RTLD_GLOBAL : RTLD_LOCAL));[m
[31m-  if (lib == NULL) lua_pushstring(L, dlerror());[m
[31m-  return lib;[m
[31m-}[m
[31m-[m
[31m-static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym)[m
[31m-{[m
[31m-  lua_CFunction f = (lua_CFunction)dlsym(lib, sym);[m
[31m-  if (f == NULL) lua_pushstring(L, dlerror());[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-static const char *ll_bcsym(void *lib, const char *sym)[m
[31m-{[m
[31m-#if defined(RTLD_DEFAULT)[m
[31m-  if (lib == NULL) lib = RTLD_DEFAULT;[m
[31m-#elif LJ_TARGET_OSX || LJ_TARGET_BSD[m
[31m-  if (lib == NULL) lib = (void *)(intptr_t)-2;[m
[31m-#endif[m
[31m-  return (const char *)dlsym(lib, sym);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS[m
[31m-#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS  4[m
[31m-#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT  2[m
[31m-BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*);[m
[31m-#endif[m
[31m-[m
[31m-#undef setprogdir[m
[31m-[m
[31m-static void setprogdir(lua_State *L)[m
[31m-{[m
[31m-  char buff[MAX_PATH + 1];[m
[31m-  char *lb;[m
[31m-  DWORD nsize = sizeof(buff);[m
[31m-  DWORD n = GetModuleFileNameA(NULL, buff, nsize);[m
[31m-  if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) {[m
[31m-    luaL_error(L, "unable to get ModuleFileName");[m
[31m-  } else {[m
[31m-    *lb = '\0';[m
[31m-    luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff);[m
[31m-    lua_remove(L, -2);  /* remove original string */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void pusherror(lua_State *L)[m
[31m-{[m
[31m-  DWORD error = GetLastError();[m
[31m-#if LJ_TARGET_XBOXONE[m
[31m-  wchar_t wbuffer[128];[m
[31m-  char buffer[128*2];[m
[31m-  if (FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-      NULL, error, 0, wbuffer, sizeof(wbuffer)/sizeof(wchar_t), NULL) &&[m
[31m-      WideCharToMultiByte(CP_ACP, 0, wbuffer, 128, buffer, 128*2, NULL, NULL))[m
[31m-#else[m
[31m-  char buffer[128];[m
[31m-  if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-      NULL, error, 0, buffer, sizeof(buffer), NULL))[m
[31m-#endif[m
[31m-    lua_pushstring(L, buffer);[m
[31m-  else[m
[31m-    lua_pushfstring(L, "system error %d\n", error);[m
[31m-}[m
[31m-[m
[31m-static void ll_unloadlib(void *lib)[m
[31m-{[m
[31m-  FreeLibrary((HINSTANCE)lib);[m
[31m-}[m
[31m-[m
[31m-static void *ll_load(lua_State *L, const char *path, int gl)[m
[31m-{[m
[31m-  HINSTANCE lib = LoadLibraryExA(path, NULL, 0);[m
[31m-  if (lib == NULL) pusherror(L);[m
[31m-  UNUSED(gl);[m
[31m-  return lib;[m
[31m-}[m
[31m-[m
[31m-static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym)[m
[31m-{[m
[31m-  lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym);[m
[31m-  if (f == NULL) pusherror(L);[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-static const char *ll_bcsym(void *lib, const char *sym)[m
[31m-{[m
[31m-  if (lib) {[m
[31m-    return (const char *)GetProcAddress((HINSTANCE)lib, sym);[m
[31m-  } else {[m
[31m-    HINSTANCE h = GetModuleHandleA(NULL);[m
[31m-    const char *p = (const char *)GetProcAddress(h, sym);[m
[31m-    if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,[m
[31m-					(const char *)ll_bcsym, &h))[m
[31m-      p = (const char *)GetProcAddress(h, sym);[m
[31m-    return p;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#undef PACKAGE_LIB_FAIL[m
[31m-#define PACKAGE_LIB_FAIL	"absent"[m
[31m-[m
[31m-#define DLMSG	"dynamic libraries not enabled; no support for target OS"[m
[31m-[m
[31m-static void ll_unloadlib(void *lib)[m
[31m-{[m
[31m-  UNUSED(lib);[m
[31m-}[m
[31m-[m
[31m-static void *ll_load(lua_State *L, const char *path, int gl)[m
[31m-{[m
[31m-  UNUSED(path); UNUSED(gl);[m
[31m-  lua_pushliteral(L, DLMSG);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym)[m
[31m-{[m
[31m-  UNUSED(lib); UNUSED(sym);[m
[31m-  lua_pushliteral(L, DLMSG);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static const char *ll_bcsym(void *lib, const char *sym)[m
[31m-{[m
[31m-  UNUSED(lib); UNUSED(sym);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void **ll_register(lua_State *L, const char *path)[m
[31m-{[m
[31m-  void **plib;[m
[31m-  lua_pushfstring(L, "LOADLIB: %s", path);[m
[31m-  lua_gettable(L, LUA_REGISTRYINDEX);  /* check library in registry? */[m
[31m-  if (!lua_isnil(L, -1)) {  /* is there an entry? */[m
[31m-    plib = (void **)lua_touserdata(L, -1);[m
[31m-  } else {  /* no entry yet; create one */[m
[31m-    lua_pop(L, 1);[m
[31m-    plib = (void **)lua_newuserdata(L, sizeof(void *));[m
[31m-    *plib = NULL;[m
[31m-    luaL_getmetatable(L, "_LOADLIB");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-    lua_pushfstring(L, "LOADLIB: %s", path);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_settable(L, LUA_REGISTRYINDEX);[m
[31m-  }[m
[31m-  return plib;[m
[31m-}[m
[31m-[m
[31m-static const char *mksymname(lua_State *L, const char *modname,[m
[31m-			     const char *prefix)[m
[31m-{[m
[31m-  const char *funcname;[m
[31m-  const char *mark = strchr(modname, *LUA_IGMARK);[m
[31m-  if (mark) modname = mark + 1;[m
[31m-  funcname = luaL_gsub(L, modname, ".", "_");[m
[31m-  funcname = lua_pushfstring(L, prefix, funcname);[m
[31m-  lua_remove(L, -2);  /* remove 'gsub' result */[m
[31m-  return funcname;[m
[31m-}[m
[31m-[m
[31m-static int ll_loadfunc(lua_State *L, const char *path, const char *name, int r)[m
[31m-{[m
[31m-  void **reg = ll_register(L, path);[m
[31m-  if (*reg == NULL) *reg = ll_load(L, path, (*name == '*'));[m
[31m-  if (*reg == NULL) {[m
[31m-    return PACKAGE_ERR_LIB;  /* Unable to load library. */[m
[31m-  } else if (*name == '*') {  /* Only load library into global namespace. */[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    return 0;[m
[31m-  } else {[m
[31m-    const char *sym = r ? name : mksymname(L, name, SYMPREFIX_CF);[m
[31m-    lua_CFunction f = ll_sym(L, *reg, sym);[m
[31m-    if (f) {[m
[31m-      lua_pushcfunction(L, f);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    if (!r) {[m
[31m-      const char *bcdata = ll_bcsym(*reg, mksymname(L, name, SYMPREFIX_BC));[m
[31m-      lua_pop(L, 1);[m
[31m-      if (bcdata) {[m
[31m-	if (luaL_loadbuffer(L, bcdata, LJ_MAX_BUF, name) != 0)[m
[31m-	  return PACKAGE_ERR_LOAD;[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    return PACKAGE_ERR_FUNC;  /* Unable to find function. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loadlib(lua_State *L)[m
[31m-{[m
[31m-  const char *path = luaL_checkstring(L, 1);[m
[31m-  const char *init = luaL_checkstring(L, 2);[m
[31m-  int st = ll_loadfunc(L, path, init, 1);[m
[31m-  if (st == 0) {  /* no errors? */[m
[31m-    return 1;  /* return the loaded function */[m
[31m-  } else {  /* error; error message is on stack top */[m
[31m-    lua_pushnil(L);[m
[31m-    lua_insert(L, -2);[m
[31m-    lua_pushstring(L, (st == PACKAGE_ERR_LIB) ?  PACKAGE_LIB_FAIL : "init");[m
[31m-    return 3;  /* return nil, error message, and where */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_unloadlib(lua_State *L)[m
[31m-{[m
[31m-  void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB");[m
[31m-  if (*lib) ll_unloadlib(*lib);[m
[31m-  *lib = NULL;  /* mark library as closed */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static int readable(const char *filename)[m
[31m-{[m
[31m-  FILE *f = fopen(filename, "r");  /* try to open file */[m
[31m-  if (f == NULL) return 0;  /* open failed */[m
[31m-  fclose(f);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static const char *pushnexttemplate(lua_State *L, const char *path)[m
[31m-{[m
[31m-  const char *l;[m
[31m-  while (*path == *LUA_PATHSEP) path++;  /* skip separators */[m
[31m-  if (*path == '\0') return NULL;  /* no more templates */[m
[31m-  l = strchr(path, *LUA_PATHSEP);  /* find next separator */[m
[31m-  if (l == NULL) l = path + strlen(path);[m
[31m-  lua_pushlstring(L, path, (size_t)(l - path));  /* template */[m
[31m-  return l;[m
[31m-}[m
[31m-[m
[31m-static const char *searchpath (lua_State *L, const char *name,[m
[31m-			       const char *path, const char *sep,[m
[31m-			       const char *dirsep)[m
[31m-{[m
[31m-  luaL_Buffer msg;  /* to build error message */[m
[31m-  luaL_buffinit(L, &msg);[m
[31m-  if (*sep != '\0')  /* non-empty separator? */[m
[31m-    name = luaL_gsub(L, name, sep, dirsep);  /* replace it by 'dirsep' */[m
[31m-  while ((path = pushnexttemplate(L, path)) != NULL) {[m
[31m-    const char *filename = luaL_gsub(L, lua_tostring(L, -1),[m
[31m-				     LUA_PATH_MARK, name);[m
[31m-    lua_remove(L, -2);  /* remove path template */[m
[31m-    if (readable(filename))  /* does file exist and is readable? */[m
[31m-      return filename;  /* return that file name */[m
[31m-    lua_pushfstring(L, "\n\tno file " LUA_QS, filename);[m
[31m-    lua_remove(L, -2);  /* remove file name */[m
[31m-    luaL_addvalue(&msg);  /* concatenate error msg. entry */[m
[31m-  }[m
[31m-  luaL_pushresult(&msg);  /* create error message */[m
[31m-  return NULL;  /* not found */[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_searchpath(lua_State *L)[m
[31m-{[m
[31m-  const char *f = searchpath(L, luaL_checkstring(L, 1),[m
[31m-				luaL_checkstring(L, 2),[m
[31m-				luaL_optstring(L, 3, "."),[m
[31m-				luaL_optstring(L, 4, LUA_DIRSEP));[m
[31m-  if (f != NULL) {[m
[31m-    return 1;[m
[31m-  } else {  /* error message is on top of the stack */[m
[31m-    lua_pushnil(L);[m
[31m-    lua_insert(L, -2);[m
[31m-    return 2;  /* return nil + error message */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const char *findfile(lua_State *L, const char *name,[m
[31m-			    const char *pname)[m
[31m-{[m
[31m-  const char *path;[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, pname);[m
[31m-  path = lua_tostring(L, -1);[m
[31m-  if (path == NULL)[m
[31m-    luaL_error(L, LUA_QL("package.%s") " must be a string", pname);[m
[31m-  return searchpath(L, name, path, ".", LUA_DIRSEP);[m
[31m-}[m
[31m-[m
[31m-static void loaderror(lua_State *L, const char *filename)[m
[31m-{[m
[31m-  luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s",[m
[31m-	     lua_tostring(L, 1), filename, lua_tostring(L, -1));[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loader_lua(lua_State *L)[m
[31m-{[m
[31m-  const char *filename;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  filename = findfile(L, name, "path");[m
[31m-  if (filename == NULL) return 1;  /* library not found in this path */[m
[31m-  if (luaL_loadfile(L, filename) != 0)[m
[31m-    loaderror(L, filename);[m
[31m-  return 1;  /* library loaded successfully */[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loader_c(lua_State *L)[m
[31m-{[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  const char *filename = findfile(L, name, "cpath");[m
[31m-  if (filename == NULL) return 1;  /* library not found in this path */[m
[31m-  if (ll_loadfunc(L, filename, name, 0) != 0)[m
[31m-    loaderror(L, filename);[m
[31m-  return 1;  /* library loaded successfully */[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loader_croot(lua_State *L)[m
[31m-{[m
[31m-  const char *filename;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  const char *p = strchr(name, '.');[m
[31m-  int st;[m
[31m-  if (p == NULL) return 0;  /* is root */[m
[31m-  lua_pushlstring(L, name, (size_t)(p - name));[m
[31m-  filename = findfile(L, lua_tostring(L, -1), "cpath");[m
[31m-  if (filename == NULL) return 1;  /* root not found */[m
[31m-  if ((st = ll_loadfunc(L, filename, name, 0)) != 0) {[m
[31m-    if (st != PACKAGE_ERR_FUNC) loaderror(L, filename);  /* real error */[m
[31m-    lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS,[m
[31m-		    name, filename);[m
[31m-    return 1;  /* function not found */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_loader_preload(lua_State *L)[m
[31m-{[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, "preload");[m
[31m-  if (!lua_istable(L, -1))[m
[31m-    luaL_error(L, LUA_QL("package.preload") " must be a table");[m
[31m-  lua_getfield(L, -1, name);[m
[31m-  if (lua_isnil(L, -1)) {  /* Not found? */[m
[31m-    const char *bcname = mksymname(L, name, SYMPREFIX_BC);[m
[31m-    const char *bcdata = ll_bcsym(NULL, bcname);[m
[31m-    if (bcdata == NULL || luaL_loadbuffer(L, bcdata, LJ_MAX_BUF, name) != 0)[m
[31m-      lua_pushfstring(L, "\n\tno field package.preload['%s']", name);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static const int sentinel_ = 0;[m
[31m-#define sentinel	((void *)&sentinel_)[m
[31m-[m
[31m-static int lj_cf_package_require(lua_State *L)[m
[31m-{[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  int i;[m
[31m-  lua_settop(L, 1);  /* _LOADED table will be at index 2 */[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, 2, name);[m
[31m-  if (lua_toboolean(L, -1)) {  /* is it there? */[m
[31m-    if (lua_touserdata(L, -1) == sentinel)  /* check loops */[m
[31m-      luaL_error(L, "loop or previous error loading module " LUA_QS, name);[m
[31m-    return 1;  /* package is already loaded */[m
[31m-  }[m
[31m-  /* else must load it; iterate over available loaders */[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, "loaders");[m
[31m-  if (!lua_istable(L, -1))[m
[31m-    luaL_error(L, LUA_QL("package.loaders") " must be a table");[m
[31m-  lua_pushliteral(L, "");  /* error message accumulator */[m
[31m-  for (i = 1; ; i++) {[m
[31m-    lua_rawgeti(L, -2, i);  /* get a loader */[m
[31m-    if (lua_isnil(L, -1))[m
[31m-      luaL_error(L, "module " LUA_QS " not found:%s",[m
[31m-		 name, lua_tostring(L, -2));[m
[31m-    lua_pushstring(L, name);[m
[31m-    lua_call(L, 1, 1);  /* call it */[m
[31m-    if (lua_isfunction(L, -1))  /* did it find module? */[m
[31m-      break;  /* module loaded successfully */[m
[31m-    else if (lua_isstring(L, -1))  /* loader returned error message? */[m
[31m-      lua_concat(L, 2);  /* accumulate it */[m
[31m-    else[m
[31m-      lua_pop(L, 1);[m
[31m-  }[m
[31m-  lua_pushlightuserdata(L, sentinel);[m
[31m-  lua_setfield(L, 2, name);  /* _LOADED[name] = sentinel */[m
[31m-  lua_pushstring(L, name);  /* pass name as argument to module */[m
[31m-  lua_call(L, 1, 1);  /* run loaded module */[m
[31m-  if (!lua_isnil(L, -1))  /* non-nil return? */[m
[31m-    lua_setfield(L, 2, name);  /* _LOADED[name] = returned value */[m
[31m-  lua_getfield(L, 2, name);[m
[31m-  if (lua_touserdata(L, -1) == sentinel) {   /* module did not set a value? */[m
[31m-    lua_pushboolean(L, 1);  /* use true as result */[m
[31m-    lua_pushvalue(L, -1);  /* extra copy to be returned */[m
[31m-    lua_setfield(L, 2, name);  /* _LOADED[name] = true */[m
[31m-  }[m
[31m-  lj_lib_checkfpu(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void setfenv(lua_State *L)[m
[31m-{[m
[31m-  lua_Debug ar;[m
[31m-  if (lua_getstack(L, 1, &ar) == 0 ||[m
[31m-      lua_getinfo(L, "f", &ar) == 0 ||  /* get calling function */[m
[31m-      lua_iscfunction(L, -1))[m
[31m-    luaL_error(L, LUA_QL("module") " not called from a Lua function");[m
[31m-  lua_pushvalue(L, -2);[m
[31m-  lua_setfenv(L, -2);[m
[31m-  lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-static void dooptions(lua_State *L, int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 2; i <= n; i++) {[m
[31m-    lua_pushvalue(L, i);  /* get option (a function) */[m
[31m-    lua_pushvalue(L, -2);  /* module */[m
[31m-    lua_call(L, 1, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void modinit(lua_State *L, const char *modname)[m
[31m-{[m
[31m-  const char *dot;[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_setfield(L, -2, "_M");  /* module._M = module */[m
[31m-  lua_pushstring(L, modname);[m
[31m-  lua_setfield(L, -2, "_NAME");[m
[31m-  dot = strrchr(modname, '.');  /* look for last dot in module name */[m
[31m-  if (dot == NULL) dot = modname; else dot++;[m
[31m-  /* set _PACKAGE as package name (full module name minus last part) */[m
[31m-  lua_pushlstring(L, modname, (size_t)(dot - modname));[m
[31m-  lua_setfield(L, -2, "_PACKAGE");[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_module(lua_State *L)[m
[31m-{[m
[31m-  const char *modname = luaL_checkstring(L, 1);[m
[31m-  int loaded = lua_gettop(L) + 1;  /* index of _LOADED table */[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, loaded, modname);  /* get _LOADED[modname] */[m
[31m-  if (!lua_istable(L, -1)) {  /* not found? */[m
[31m-    lua_pop(L, 1);  /* remove previous result */[m
[31m-    /* try global variable (and create one if it does not exist) */[m
[31m-    if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL)[m
[31m-      lj_err_callerv(L, LJ_ERR_BADMODN, modname);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, loaded, modname);  /* _LOADED[modname] = new table */[m
[31m-  }[m
[31m-  /* check whether table already has a _NAME field */[m
[31m-  lua_getfield(L, -1, "_NAME");[m
[31m-  if (!lua_isnil(L, -1)) {  /* is table an initialized module? */[m
[31m-    lua_pop(L, 1);[m
[31m-  } else {  /* no; initialize it */[m
[31m-    lua_pop(L, 1);[m
[31m-    modinit(L, modname);[m
[31m-  }[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  setfenv(L);[m
[31m-  dooptions(L, loaded - 1);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int lj_cf_package_seeall(lua_State *L)[m
[31m-{[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    lua_createtable(L, 0, 1); /* create new metatable */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setmetatable(L, 1);[m
[31m-  }[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  lua_setfield(L, -2, "__index");  /* mt.__index = _G */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define AUXMARK		"\1"[m
[31m-[m
[31m-static void setpath(lua_State *L, const char *fieldname, const char *envname,[m
[31m-		    const char *def, int noenv)[m
[31m-{[m
[31m-#if LJ_TARGET_CONSOLE[m
[31m-  const char *path = NULL;[m
[31m-  UNUSED(envname);[m
[31m-#else[m
[31m-  const char *path = getenv(envname);[m
[31m-#endif[m
[31m-  if (path == NULL || noenv) {[m
[31m-    lua_pushstring(L, def);[m
[31m-  } else {[m
[31m-    path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP,[m
[31m-			      LUA_PATHSEP AUXMARK LUA_PATHSEP);[m
[31m-    luaL_gsub(L, path, AUXMARK, def);[m
[31m-    lua_remove(L, -2);[m
[31m-  }[m
[31m-  setprogdir(L);[m
[31m-  lua_setfield(L, -2, fieldname);[m
[31m-}[m
[31m-[m
[31m-static const luaL_Reg package_lib[] = {[m
[31m-  { "loadlib",	lj_cf_package_loadlib },[m
[31m-  { "searchpath",  lj_cf_package_searchpath },[m
[31m-  { "seeall",	lj_cf_package_seeall },[m
[31m-  { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static const luaL_Reg package_global[] = {[m
[31m-  { "module",	lj_cf_package_module },[m
[31m-  { "require",	lj_cf_package_require },[m
[31m-  { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static const lua_CFunction package_loaders[] =[m
[31m-{[m
[31m-  lj_cf_package_loader_preload,[m
[31m-  lj_cf_package_loader_lua,[m
[31m-  lj_cf_package_loader_c,[m
[31m-  lj_cf_package_loader_croot,[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-LUALIB_API int luaopen_package(lua_State *L)[m
[31m-{[m
[31m-  int i;[m
[31m-  int noenv;[m
[31m-  luaL_newmetatable(L, "_LOADLIB");[m
[31m-  lj_lib_pushcf(L, lj_cf_package_unloadlib, 1);[m
[31m-  lua_setfield(L, -2, "__gc");[m
[31m-  luaL_register(L, LUA_LOADLIBNAME, package_lib);[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_replace(L, LUA_ENVIRONINDEX);[m
[31m-  lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0);[m
[31m-  for (i = 0; package_loaders[i] != NULL; i++) {[m
[31m-    lj_lib_pushcf(L, package_loaders[i], 1);[m
[31m-    lua_rawseti(L, -2, i+1);[m
[31m-  }[m
[31m-  lua_setfield(L, -2, "loaders");[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");[m
[31m-  noenv = lua_toboolean(L, -1);[m
[31m-  lua_pop(L, 1);[m
[31m-  setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT, noenv);[m
[31m-  setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT, noenv);[m
[31m-  lua_pushliteral(L, LUA_PATH_CONFIG);[m
[31m-  lua_setfield(L, -2, "config");[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);[m
[31m-  lua_setfield(L, -2, "loaded");[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD", 4);[m
[31m-  lua_setfield(L, -2, "preload");[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  luaL_register(L, NULL, package_global);[m
[31m-  lua_pop(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_string.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_string.c[m
[1mdeleted file mode 100644[m
[1mindex 46b54a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_string.c[m
[1m+++ /dev/null[m
[36m@@ -1,752 +0,0 @@[m
[31m-/*[m
[31m-** String library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_string_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_string[m
[31m-[m
[31m-LJLIB_LUA(string_len) /*[m
[31m-  function(s)[m
[31m-    CHECK_str(s)[m
[31m-    return #s[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_ASM(string_byte)		LJLIB_REC(string_range 0)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  int32_t len = (int32_t)s->len;[m
[31m-  int32_t start = lj_lib_optint(L, 2, 1);[m
[31m-  int32_t stop = lj_lib_optint(L, 3, start);[m
[31m-  int32_t n, i;[m
[31m-  const unsigned char *p;[m
[31m-  if (stop < 0) stop += len+1;[m
[31m-  if (start < 0) start += len+1;[m
[31m-  if (start <= 0) start = 1;[m
[31m-  if (stop > len) stop = len;[m
[31m-  if (start > stop) return FFH_RES(0);  /* Empty interval: return no results. */[m
[31m-  start--;[m
[31m-  n = stop - start;[m
[31m-  if ((uint32_t)n > LUAI_MAXCSTACK)[m
[31m-    lj_err_caller(L, LJ_ERR_STRSLC);[m
[31m-  lj_state_checkstack(L, (MSize)n);[m
[31m-  p = (const unsigned char *)strdata(s) + start;[m
[31m-  for (i = 0; i < n; i++)[m
[31m-    setintV(L->base + i-1-LJ_FR2, p[i]);[m
[31m-  return FFH_RES(n);[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(string_char)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int i, nargs = (int)(L->top - L->base);[m
[31m-  char *buf = lj_buf_tmp(L, (MSize)nargs);[m
[31m-  for (i = 1; i <= nargs; i++) {[m
[31m-    int32_t k = lj_lib_checkint(L, i);[m
[31m-    if (!checku8(k))[m
[31m-      lj_err_arg(L, i, LJ_ERR_BADVAL);[m
[31m-    buf[i-1] = (char)k;[m
[31m-  }[m
[31m-  setstrV(L, L->base-1-LJ_FR2, lj_str_new(L, buf, (size_t)nargs));[m
[31m-  return FFH_RES(1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(string_sub)		LJLIB_REC(string_range 1)[m
[31m-{[m
[31m-  lj_lib_checkstr(L, 1);[m
[31m-  lj_lib_checkint(L, 2);[m
[31m-  setintV(L->base+2, lj_lib_optint(L, 3, -1));[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_rep)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  int32_t rep = lj_lib_checkint(L, 2);[m
[31m-  GCstr *sep = lj_lib_optstr(L, 3);[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  if (sep && rep > 1) {[m
[31m-    GCstr *s2 = lj_buf_cat2str(L, sep, s);[m
[31m-    lj_buf_reset(sb);[m
[31m-    lj_buf_putstr(sb, s);[m
[31m-    s = s2;[m
[31m-    rep--;[m
[31m-  }[m
[31m-  sb = lj_buf_putstr_rep(sb, s, rep);[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sb));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_ASM(string_reverse)  LJLIB_REC(string_op IRCALL_lj_buf_putstr_reverse)[m
[31m-{[m
[31m-  lj_lib_checkstr(L, 1);[m
[31m-  return FFH_RETRY;[m
[31m-}[m
[31m-LJLIB_ASM_(string_lower)  LJLIB_REC(string_op IRCALL_lj_buf_putstr_lower)[m
[31m-LJLIB_ASM_(string_upper)  LJLIB_REC(string_op IRCALL_lj_buf_putstr_upper)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static int writer_buf(lua_State *L, const void *p, size_t size, void *sb)[m
[31m-{[m
[31m-  lj_buf_putmem((SBuf *)sb, p, (MSize)size);[m
[31m-  UNUSED(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_dump)[m
[31m-{[m
[31m-  GCfunc *fn = lj_lib_checkfunc(L, 1);[m
[31m-  int strip = L->base+1 < L->top && tvistruecond(L->base+1);[m
[31m-  SBuf *sb = lj_buf_tmp_(L);  /* Assumes lj_bcwrite() doesn't use tmpbuf. */[m
[31m-  L->top = L->base+1;[m
[31m-  if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip))[m
[31m-    lj_err_caller(L, LJ_ERR_STRDUMP);[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sb));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* macro to `unsign' a character */[m
[31m-#define uchar(c)        ((unsigned char)(c))[m
[31m-[m
[31m-#define CAP_UNFINISHED	(-1)[m
[31m-#define CAP_POSITION	(-2)[m
[31m-[m
[31m-typedef struct MatchState {[m
[31m-  const char *src_init;  /* init of source string */[m
[31m-  const char *src_end;  /* end (`\0') of source string */[m
[31m-  lua_State *L;[m
[31m-  int level;  /* total number of captures (finished or unfinished) */[m
[31m-  int depth;[m
[31m-  struct {[m
[31m-    const char *init;[m
[31m-    ptrdiff_t len;[m
[31m-  } capture[LUA_MAXCAPTURES];[m
[31m-} MatchState;[m
[31m-[m
[31m-#define L_ESC		'%'[m
[31m-[m
[31m-static int check_capture(MatchState *ms, int l)[m
[31m-{[m
[31m-  l -= '1';[m
[31m-  if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)[m
[31m-    lj_err_caller(ms->L, LJ_ERR_STRCAPI);[m
[31m-  return l;[m
[31m-}[m
[31m-[m
[31m-static int capture_to_close(MatchState *ms)[m
[31m-{[m
[31m-  int level = ms->level;[m
[31m-  for (level--; level>=0; level--)[m
[31m-    if (ms->capture[level].len == CAP_UNFINISHED) return level;[m
[31m-  lj_err_caller(ms->L, LJ_ERR_STRPATC);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-static const char *classend(MatchState *ms, const char *p)[m
[31m-{[m
[31m-  switch (*p++) {[m
[31m-  case L_ESC:[m
[31m-    if (*p == '\0')[m
[31m-      lj_err_caller(ms->L, LJ_ERR_STRPATE);[m
[31m-    return p+1;[m
[31m-  case '[':[m
[31m-    if (*p == '^') p++;[m
[31m-    do {  /* look for a `]' */[m
[31m-      if (*p == '\0')[m
[31m-	lj_err_caller(ms->L, LJ_ERR_STRPATM);[m
[31m-      if (*(p++) == L_ESC && *p != '\0')[m
[31m-	p++;  /* skip escapes (e.g. `%]') */[m
[31m-    } while (*p != ']');[m
[31m-    return p+1;[m
[31m-  default:[m
[31m-    return p;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const unsigned char match_class_map[32] = {[m
[31m-  0,LJ_CHAR_ALPHA,0,LJ_CHAR_CNTRL,LJ_CHAR_DIGIT,0,0,LJ_CHAR_GRAPH,0,0,0,0,[m
[31m-  LJ_CHAR_LOWER,0,0,0,LJ_CHAR_PUNCT,0,0,LJ_CHAR_SPACE,0,[m
[31m-  LJ_CHAR_UPPER,0,LJ_CHAR_ALNUM,LJ_CHAR_XDIGIT,0,0,0,0,0,0,0[m
[31m-};[m
[31m-[m
[31m-static int match_class(int c, int cl)[m
[31m-{[m
[31m-  if ((cl & 0xc0) == 0x40) {[m
[31m-    int t = match_class_map[(cl&0x1f)];[m
[31m-    if (t) {[m
[31m-      t = lj_char_isa(c, t);[m
[31m-      return (cl & 0x20) ? t : !t;[m
[31m-    }[m
[31m-    if (cl == 'z') return c == 0;[m
[31m-    if (cl == 'Z') return c != 0;[m
[31m-  }[m
[31m-  return (cl == c);[m
[31m-}[m
[31m-[m
[31m-static int matchbracketclass(int c, const char *p, const char *ec)[m
[31m-{[m
[31m-  int sig = 1;[m
[31m-  if (*(p+1) == '^') {[m
[31m-    sig = 0;[m
[31m-    p++;  /* skip the `^' */[m
[31m-  }[m
[31m-  while (++p < ec) {[m
[31m-    if (*p == L_ESC) {[m
[31m-      p++;[m
[31m-      if (match_class(c, uchar(*p)))[m
[31m-	return sig;[m
[31m-    }[m
[31m-    else if ((*(p+1) == '-') && (p+2 < ec)) {[m
[31m-      p+=2;[m
[31m-      if (uchar(*(p-2)) <= c && c <= uchar(*p))[m
[31m-	return sig;[m
[31m-    }[m
[31m-    else if (uchar(*p) == c) return sig;[m
[31m-  }[m
[31m-  return !sig;[m
[31m-}[m
[31m-[m
[31m-static int singlematch(int c, const char *p, const char *ep)[m
[31m-{[m
[31m-  switch (*p) {[m
[31m-  case '.': return 1;  /* matches any char */[m
[31m-  case L_ESC: return match_class(c, uchar(*(p+1)));[m
[31m-  case '[': return matchbracketclass(c, p, ep-1);[m
[31m-  default:  return (uchar(*p) == c);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const char *match(MatchState *ms, const char *s, const char *p);[m
[31m-[m
[31m-static const char *matchbalance(MatchState *ms, const char *s, const char *p)[m
[31m-{[m
[31m-  if (*p == 0 || *(p+1) == 0)[m
[31m-    lj_err_caller(ms->L, LJ_ERR_STRPATU);[m
[31m-  if (*s != *p) {[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    int b = *p;[m
[31m-    int e = *(p+1);[m
[31m-    int cont = 1;[m
[31m-    while (++s < ms->src_end) {[m
[31m-      if (*s == e) {[m
[31m-	if (--cont == 0) return s+1;[m
[31m-      } else if (*s == b) {[m
[31m-	cont++;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* string ends out of balance */[m
[31m-}[m
[31m-[m
[31m-static const char *max_expand(MatchState *ms, const char *s,[m
[31m-			      const char *p, const char *ep)[m
[31m-{[m
[31m-  ptrdiff_t i = 0;  /* counts maximum expand for item */[m
[31m-  while ((s+i)<ms->src_end && singlematch(uchar(*(s+i)), p, ep))[m
[31m-    i++;[m
[31m-  /* keeps trying to match with the maximum repetitions */[m
[31m-  while (i>=0) {[m
[31m-    const char *res = match(ms, (s+i), ep+1);[m
[31m-    if (res) return res;[m
[31m-    i--;  /* else didn't match; reduce 1 repetition to try again */[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static const char *min_expand(MatchState *ms, const char *s,[m
[31m-			      const char *p, const char *ep)[m
[31m-{[m
[31m-  for (;;) {[m
[31m-    const char *res = match(ms, s, ep+1);[m
[31m-    if (res != NULL)[m
[31m-      return res;[m
[31m-    else if (s<ms->src_end && singlematch(uchar(*s), p, ep))[m
[31m-      s++;  /* try with one more repetition */[m
[31m-    else[m
[31m-      return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static const char *start_capture(MatchState *ms, const char *s,[m
[31m-				 const char *p, int what)[m
[31m-{[m
[31m-  const char *res;[m
[31m-  int level = ms->level;[m
[31m-  if (level >= LUA_MAXCAPTURES) lj_err_caller(ms->L, LJ_ERR_STRCAPN);[m
[31m-  ms->capture[level].init = s;[m
[31m-  ms->capture[level].len = what;[m
[31m-  ms->level = level+1;[m
[31m-  if ((res=match(ms, s, p)) == NULL)  /* match failed? */[m
[31m-    ms->level--;  /* undo capture */[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-static const char *end_capture(MatchState *ms, const char *s,[m
[31m-			       const char *p)[m
[31m-{[m
[31m-  int l = capture_to_close(ms);[m
[31m-  const char *res;[m
[31m-  ms->capture[l].len = s - ms->capture[l].init;  /* close capture */[m
[31m-  if ((res = match(ms, s, p)) == NULL)  /* match failed? */[m
[31m-    ms->capture[l].len = CAP_UNFINISHED;  /* undo capture */[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-static const char *match_capture(MatchState *ms, const char *s, int l)[m
[31m-{[m
[31m-  size_t len;[m
[31m-  l = check_capture(ms, l);[m
[31m-  len = (size_t)ms->capture[l].len;[m
[31m-  if ((size_t)(ms->src_end-s) >= len &&[m
[31m-      memcmp(ms->capture[l].init, s, len) == 0)[m
[31m-    return s+len;[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-static const char *match(MatchState *ms, const char *s, const char *p)[m
[31m-{[m
[31m-  if (++ms->depth > LJ_MAX_XLEVEL)[m
[31m-    lj_err_caller(ms->L, LJ_ERR_STRPATX);[m
[31m-  init: /* using goto's to optimize tail recursion */[m
[31m-  switch (*p) {[m
[31m-  case '(':  /* start capture */[m
[31m-    if (*(p+1) == ')')  /* position capture? */[m
[31m-      s = start_capture(ms, s, p+2, CAP_POSITION);[m
[31m-    else[m
[31m-      s = start_capture(ms, s, p+1, CAP_UNFINISHED);[m
[31m-    break;[m
[31m-  case ')':  /* end capture */[m
[31m-    s = end_capture(ms, s, p+1);[m
[31m-    break;[m
[31m-  case L_ESC:[m
[31m-    switch (*(p+1)) {[m
[31m-    case 'b':  /* balanced string? */[m
[31m-      s = matchbalance(ms, s, p+2);[m
[31m-      if (s == NULL) break;[m
[31m-      p+=4;[m
[31m-      goto init;  /* else s = match(ms, s, p+4); */[m
[31m-    case 'f': {  /* frontier? */[m
[31m-      const char *ep; char previous;[m
[31m-      p += 2;[m
[31m-      if (*p != '[')[m
[31m-	lj_err_caller(ms->L, LJ_ERR_STRPATB);[m
[31m-      ep = classend(ms, p);  /* points to what is next */[m
[31m-      previous = (s == ms->src_init) ? '\0' : *(s-1);[m
[31m-      if (matchbracketclass(uchar(previous), p, ep-1) ||[m
[31m-	 !matchbracketclass(uchar(*s), p, ep-1)) { s = NULL; break; }[m
[31m-      p=ep;[m
[31m-      goto init;  /* else s = match(ms, s, ep); */[m
[31m-      }[m
[31m-    default:[m
[31m-      if (lj_char_isdigit(uchar(*(p+1)))) {  /* capture results (%0-%9)? */[m
[31m-	s = match_capture(ms, s, uchar(*(p+1)));[m
[31m-	if (s == NULL) break;[m
[31m-	p+=2;[m
[31m-	goto init;  /* else s = match(ms, s, p+2) */[m
[31m-      }[m
[31m-      goto dflt;  /* case default */[m
[31m-    }[m
[31m-    break;[m
[31m-  case '\0':  /* end of pattern */[m
[31m-    break;  /* match succeeded */[m
[31m-  case '$':[m
[31m-    /* is the `$' the last char in pattern? */[m
[31m-    if (*(p+1) != '\0') goto dflt;[m
[31m-    if (s != ms->src_end) s = NULL;  /* check end of string */[m
[31m-    break;[m
[31m-  default: dflt: {  /* it is a pattern item */[m
[31m-    const char *ep = classend(ms, p);  /* points to what is next */[m
[31m-    int m = s<ms->src_end && singlematch(uchar(*s), p, ep);[m
[31m-    switch (*ep) {[m
[31m-    case '?': {  /* optional */[m
[31m-      const char *res;[m
[31m-      if (m && ((res=match(ms, s+1, ep+1)) != NULL)) {[m
[31m-	s = res;[m
[31m-	break;[m
[31m-      }[m
[31m-      p=ep+1;[m
[31m-      goto init;  /* else s = match(ms, s, ep+1); */[m
[31m-      }[m
[31m-    case '*':  /* 0 or more repetitions */[m
[31m-      s = max_expand(ms, s, p, ep);[m
[31m-      break;[m
[31m-    case '+':  /* 1 or more repetitions */[m
[31m-      s = (m ? max_expand(ms, s+1, p, ep) : NULL);[m
[31m-      break;[m
[31m-    case '-':  /* 0 or more repetitions (minimum) */[m
[31m-      s = min_expand(ms, s, p, ep);[m
[31m-      break;[m
[31m-    default:[m
[31m-      if (m) { s++; p=ep; goto init; }  /* else s = match(ms, s+1, ep); */[m
[31m-      s = NULL;[m
[31m-      break;[m
[31m-    }[m
[31m-    break;[m
[31m-    }[m
[31m-  }[m
[31m-  ms->depth--;[m
[31m-  return s;[m
[31m-}[m
[31m-[m
[31m-static void push_onecapture(MatchState *ms, int i, const char *s, const char *e)[m
[31m-{[m
[31m-  if (i >= ms->level) {[m
[31m-    if (i == 0)  /* ms->level == 0, too */[m
[31m-      lua_pushlstring(ms->L, s, (size_t)(e - s));  /* add whole match */[m
[31m-    else[m
[31m-      lj_err_caller(ms->L, LJ_ERR_STRCAPI);[m
[31m-  } else {[m
[31m-    ptrdiff_t l = ms->capture[i].len;[m
[31m-    if (l == CAP_UNFINISHED) lj_err_caller(ms->L, LJ_ERR_STRCAPU);[m
[31m-    if (l == CAP_POSITION)[m
[31m-      lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1);[m
[31m-    else[m
[31m-      lua_pushlstring(ms->L, ms->capture[i].init, (size_t)l);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int push_captures(MatchState *ms, const char *s, const char *e)[m
[31m-{[m
[31m-  int i;[m
[31m-  int nlevels = (ms->level == 0 && s) ? 1 : ms->level;[m
[31m-  luaL_checkstack(ms->L, nlevels, "too many captures");[m
[31m-  for (i = 0; i < nlevels; i++)[m
[31m-    push_onecapture(ms, i, s, e);[m
[31m-  return nlevels;  /* number of strings pushed */[m
[31m-}[m
[31m-[m
[31m-static int str_find_aux(lua_State *L, int find)[m
[31m-{[m
[31m-  GCstr *s = lj_lib_checkstr(L, 1);[m
[31m-  GCstr *p = lj_lib_checkstr(L, 2);[m
[31m-  int32_t start = lj_lib_optint(L, 3, 1);[m
[31m-  MSize st;[m
[31m-  if (start < 0) start += (int32_t)s->len; else start--;[m
[31m-  if (start < 0) start = 0;[m
[31m-  st = (MSize)start;[m
[31m-  if (st > s->len) {[m
[31m-#if LJ_52[m
[31m-    setnilV(L->top-1);[m
[31m-    return 1;[m
[31m-#else[m
[31m-    st = s->len;[m
[31m-#endif[m
[31m-  }[m
[31m-  if (find && ((L->base+3 < L->top && tvistruecond(L->base+3)) ||[m
[31m-	       !lj_str_haspattern(p))) {  /* Search for fixed string. */[m
[31m-    const char *q = lj_str_find(strdata(s)+st, strdata(p), s->len-st, p->len);[m
[31m-    if (q) {[m
[31m-      setintV(L->top-2, (int32_t)(q-strdata(s)) + 1);[m
[31m-      setintV(L->top-1, (int32_t)(q-strdata(s)) + (int32_t)p->len);[m
[31m-      return 2;[m
[31m-    }[m
[31m-  } else {  /* Search for pattern. */[m
[31m-    MatchState ms;[m
[31m-    const char *pstr = strdata(p);[m
[31m-    const char *sstr = strdata(s) + st;[m
[31m-    int anchor = 0;[m
[31m-    if (*pstr == '^') { pstr++; anchor = 1; }[m
[31m-    ms.L = L;[m
[31m-    ms.src_init = strdata(s);[m
[31m-    ms.src_end = strdata(s) + s->len;[m
[31m-    do {  /* Loop through string and try to match the pattern. */[m
[31m-      const char *q;[m
[31m-      ms.level = ms.depth = 0;[m
[31m-      q = match(&ms, sstr, pstr);[m
[31m-      if (q) {[m
[31m-	if (find) {[m
[31m-	  setintV(L->top++, (int32_t)(sstr-(strdata(s)-1)));[m
[31m-	  setintV(L->top++, (int32_t)(q-strdata(s)));[m
[31m-	  return push_captures(&ms, NULL, NULL) + 2;[m
[31m-	} else {[m
[31m-	  return push_captures(&ms, sstr, q);[m
[31m-	}[m
[31m-      }[m
[31m-    } while (sstr++ < ms.src_end && !anchor);[m
[31m-  }[m
[31m-  setnilV(L->top-1);  /* Not found. */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_find)		LJLIB_REC(.)[m
[31m-{[m
[31m-  return str_find_aux(L, 1);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_match)[m
[31m-{[m
[31m-  return str_find_aux(L, 0);[m
[31m-}[m
[31m-[m
[31m-LJLIB_NOREG LJLIB_CF(string_gmatch_aux)[m
[31m-{[m
[31m-  const char *p = strVdata(lj_lib_upvalue(L, 2));[m
[31m-  GCstr *str = strV(lj_lib_upvalue(L, 1));[m
[31m-  const char *s = strdata(str);[m
[31m-  TValue *tvpos = lj_lib_upvalue(L, 3);[m
[31m-  const char *src = s + tvpos->u32.lo;[m
[31m-  MatchState ms;[m
[31m-  ms.L = L;[m
[31m-  ms.src_init = s;[m
[31m-  ms.src_end = s + str->len;[m
[31m-  for (; src <= ms.src_end; src++) {[m
[31m-    const char *e;[m
[31m-    ms.level = ms.depth = 0;[m
[31m-    if ((e = match(&ms, src, p)) != NULL) {[m
[31m-      int32_t pos = (int32_t)(e - s);[m
[31m-      if (e == src) pos++;  /* Ensure progress for empty match. */[m
[31m-      tvpos->u32.lo = (uint32_t)pos;[m
[31m-      return push_captures(&ms, src, e);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* not found */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_gmatch)[m
[31m-{[m
[31m-  lj_lib_checkstr(L, 1);[m
[31m-  lj_lib_checkstr(L, 2);[m
[31m-  L->top = L->base+3;[m
[31m-  (L->top-1)->u64 = 0;[m
[31m-  lj_lib_pushcc(L, lj_cf_string_gmatch_aux, FF_string_gmatch_aux, 3);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static void add_s(MatchState *ms, luaL_Buffer *b, const char *s, const char *e)[m
[31m-{[m
[31m-  size_t l, i;[m
[31m-  const char *news = lua_tolstring(ms->L, 3, &l);[m
[31m-  for (i = 0; i < l; i++) {[m
[31m-    if (news[i] != L_ESC) {[m
[31m-      luaL_addchar(b, news[i]);[m
[31m-    } else {[m
[31m-      i++;  /* skip ESC */[m
[31m-      if (!lj_char_isdigit(uchar(news[i]))) {[m
[31m-	luaL_addchar(b, news[i]);[m
[31m-      } else if (news[i] == '0') {[m
[31m-	luaL_addlstring(b, s, (size_t)(e - s));[m
[31m-      } else {[m
[31m-	push_onecapture(ms, news[i] - '1', s, e);[m
[31m-	luaL_addvalue(b);  /* add capture to accumulated result */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void add_value(MatchState *ms, luaL_Buffer *b,[m
[31m-		      const char *s, const char *e)[m
[31m-{[m
[31m-  lua_State *L = ms->L;[m
[31m-  switch (lua_type(L, 3)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-    case LUA_TSTRING: {[m
[31m-      add_s(ms, b, s, e);[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TFUNCTION: {[m
[31m-      int n;[m
[31m-      lua_pushvalue(L, 3);[m
[31m-      n = push_captures(ms, s, e);[m
[31m-      lua_call(L, n, 1);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TTABLE: {[m
[31m-      push_onecapture(ms, 0, s, e);[m
[31m-      lua_gettable(L, 3);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  if (!lua_toboolean(L, -1)) {  /* nil or false? */[m
[31m-    lua_pop(L, 1);[m
[31m-    lua_pushlstring(L, s, (size_t)(e - s));  /* keep original text */[m
[31m-  } else if (!lua_isstring(L, -1)) {[m
[31m-    lj_err_callerv(L, LJ_ERR_STRGSRV, luaL_typename(L, -1));[m
[31m-  }[m
[31m-  luaL_addvalue(b);  /* add result to accumulator */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_gsub)[m
[31m-{[m
[31m-  size_t srcl;[m
[31m-  const char *src = luaL_checklstring(L, 1, &srcl);[m
[31m-  const char *p = luaL_checkstring(L, 2);[m
[31m-  int  tr = lua_type(L, 3);[m
[31m-  int max_s = luaL_optint(L, 4, (int)(srcl+1));[m
[31m-  int anchor = (*p == '^') ? (p++, 1) : 0;[m
[31m-  int n = 0;[m
[31m-  MatchState ms;[m
[31m-  luaL_Buffer b;[m
[31m-  if (!(tr == LUA_TNUMBER || tr == LUA_TSTRING ||[m
[31m-	tr == LUA_TFUNCTION || tr == LUA_TTABLE))[m
[31m-    lj_err_arg(L, 3, LJ_ERR_NOSFT);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  ms.L = L;[m
[31m-  ms.src_init = src;[m
[31m-  ms.src_end = src+srcl;[m
[31m-  while (n < max_s) {[m
[31m-    const char *e;[m
[31m-    ms.level = ms.depth = 0;[m
[31m-    e = match(&ms, src, p);[m
[31m-    if (e) {[m
[31m-      n++;[m
[31m-      add_value(&ms, &b, src, e);[m
[31m-    }[m
[31m-    if (e && e>src) /* non empty match? */[m
[31m-      src = e;  /* skip it */[m
[31m-    else if (src < ms.src_end)[m
[31m-      luaL_addchar(&b, *src++);[m
[31m-    else[m
[31m-      break;[m
[31m-    if (anchor)[m
[31m-      break;[m
[31m-  }[m
[31m-  luaL_addlstring(&b, src, (size_t)(ms.src_end-src));[m
[31m-  luaL_pushresult(&b);[m
[31m-  lua_pushinteger(L, n);  /* number of substitutions */[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Emulate tostring() inline. */[m
[31m-static GCstr *string_fmt_tostring(lua_State *L, int arg, int retry)[m
[31m-{[m
[31m-  TValue *o = L->base+arg-1;[m
[31m-  cTValue *mo;[m
[31m-  lua_assert(o < L->top);  /* Caller already checks for existence. */[m
[31m-  if (LJ_LIKELY(tvisstr(o)))[m
[31m-    return strV(o);[m
[31m-  if (retry != 2 && !tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) {[m
[31m-    copyTV(L, L->top++, mo);[m
[31m-    copyTV(L, L->top++, o);[m
[31m-    lua_call(L, 1, 1);[m
[31m-    copyTV(L, L->base+arg-1, --L->top);[m
[31m-    return NULL;  /* Buffer may be overwritten, retry. */[m
[31m-  }[m
[31m-  return lj_strfmt_obj(L, o);[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(string_format)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int arg, top = (int)(L->top - L->base);[m
[31m-  GCstr *fmt;[m
[31m-  SBuf *sb;[m
[31m-  FormatState fs;[m
[31m-  SFormat sf;[m
[31m-  int retry = 0;[m
[31m-again:[m
[31m-  arg = 1;[m
[31m-  sb = lj_buf_tmp_(L);[m
[31m-  fmt = lj_lib_checkstr(L, arg);[m
[31m-  lj_strfmt_init(&fs, strdata(fmt), fmt->len);[m
[31m-  while ((sf = lj_strfmt_parse(&fs)) != STRFMT_EOF) {[m
[31m-    if (sf == STRFMT_LIT) {[m
[31m-      lj_buf_putmem(sb, fs.str, fs.len);[m
[31m-    } else if (sf == STRFMT_ERR) {[m
[31m-      lj_err_callerv(L, LJ_ERR_STRFMT, strdata(lj_str_new(L, fs.str, fs.len)));[m
[31m-    } else {[m
[31m-      if (++arg > top)[m
[31m-	luaL_argerror(L, arg, lj_obj_typename[0]);[m
[31m-      switch (STRFMT_TYPE(sf)) {[m
[31m-      case STRFMT_INT:[m
[31m-	if (tvisint(L->base+arg-1)) {[m
[31m-	  int32_t k = intV(L->base+arg-1);[m
[31m-	  if (sf == STRFMT_INT)[m
[31m-	    lj_strfmt_putint(sb, k);  /* Shortcut for plain %d. */[m
[31m-	  else[m
[31m-	    lj_strfmt_putfxint(sb, sf, k);[m
[31m-	} else {[m
[31m-	  lj_strfmt_putfnum_int(sb, sf, lj_lib_checknum(L, arg));[m
[31m-	}[m
[31m-	break;[m
[31m-      case STRFMT_UINT:[m
[31m-	if (tvisint(L->base+arg-1))[m
[31m-	  lj_strfmt_putfxint(sb, sf, intV(L->base+arg-1));[m
[31m-	else[m
[31m-	  lj_strfmt_putfnum_uint(sb, sf, lj_lib_checknum(L, arg));[m
[31m-	break;[m
[31m-      case STRFMT_NUM:[m
[31m-	lj_strfmt_putfnum(sb, sf, lj_lib_checknum(L, arg));[m
[31m-	break;[m
[31m-      case STRFMT_STR: {[m
[31m-	GCstr *str = string_fmt_tostring(L, arg, retry);[m
[31m-	if (str == NULL)[m
[31m-	  retry = 1;[m
[31m-	else if ((sf & STRFMT_T_QUOTED))[m
[31m-	  lj_strfmt_putquoted(sb, str);  /* No formatting. */[m
[31m-	else[m
[31m-	  lj_strfmt_putfstr(sb, sf, str);[m
[31m-	break;[m
[31m-	}[m
[31m-      case STRFMT_CHAR:[m
[31m-	lj_strfmt_putfchar(sb, sf, lj_lib_checkint(L, arg));[m
[31m-	break;[m
[31m-      case STRFMT_PTR:  /* No formatting. */[m
[31m-	lj_strfmt_putptr(sb, lj_obj_ptr(L->base+arg-1));[m
[31m-	break;[m
[31m-      default:[m
[31m-	lua_assert(0);[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (retry++ == 1) goto again;[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sb));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_string(lua_State *L)[m
[31m-{[m
[31m-  GCtab *mt;[m
[31m-  global_State *g;[m
[31m-  LJ_LIB_REG(L, LUA_STRLIBNAME, string);[m
[31m-#if defined(LUA_COMPAT_GFIND) && !LJ_52[m
[31m-  lua_getfield(L, -1, "gmatch");[m
[31m-  lua_setfield(L, -2, "gfind");[m
[31m-#endif[m
[31m-  mt = lj_tab_new(L, 0, 1);[m
[31m-  /* NOBARRIER: basemt is a GC root. */[m
[31m-  g = G(L);[m
[31m-  setgcref(basemt_it(g, LJ_TSTR), obj2gco(mt));[m
[31m-  settabV(L, lj_tab_setstr(L, mt, mmname_str(g, MM_index)), tabV(L->top-1));[m
[31m-  mt->nomm = (uint8_t)(~(1u<<MM_index));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_table.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_table.c[m
[1mdeleted file mode 100644[m
[1mindex f9a3693..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lib_table.c[m
[1m+++ /dev/null[m
[36m@@ -1,307 +0,0 @@[m
[31m-/*[m
[31m-** Table library.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lib_table_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#define LJLIB_MODULE_table[m
[31m-[m
[31m-LJLIB_LUA(table_foreachi) /*[m
[31m-  function(t, f)[m
[31m-    CHECK_tab(t)[m
[31m-    CHECK_func(f)[m
[31m-    for i=1,#t do[m
[31m-      local r = f(i, t[i])[m
[31m-      if r ~= nil then return r end[m
[31m-    end[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_LUA(table_foreach) /*[m
[31m-  function(t, f)[m
[31m-    CHECK_tab(t)[m
[31m-    CHECK_func(f)[m
[31m-    for k, v in PAIRS(t) do[m
[31m-      local r = f(k, v)[m
[31m-      if r ~= nil then return r end[m
[31m-    end[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_LUA(table_getn) /*[m
[31m-  function(t)[m
[31m-    CHECK_tab(t)[m
[31m-    return #t[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_CF(table_maxn)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  TValue *array = tvref(t->array);[m
[31m-  Node *node;[m
[31m-  lua_Number m = 0;[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = (ptrdiff_t)t->asize - 1; i >= 0; i--)[m
[31m-    if (!tvisnil(&array[i])) {[m
[31m-      m = (lua_Number)(int32_t)i;[m
[31m-      break;[m
[31m-    }[m
[31m-  node = noderef(t->node);[m
[31m-  for (i = (ptrdiff_t)t->hmask; i >= 0; i--)[m
[31m-    if (!tvisnil(&node[i].val) && tvisnumber(&node[i].key)) {[m
[31m-      lua_Number n = numberVnum(&node[i].key);[m
[31m-      if (n > m) m = n;[m
[31m-    }[m
[31m-  setnumV(L->top-1, m);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(table_insert)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  int32_t n, i = (int32_t)lj_tab_len(t) + 1;[m
[31m-  int nargs = (int)((char *)L->top - (char *)L->base);[m
[31m-  if (nargs != 2*sizeof(TValue)) {[m
[31m-    if (nargs != 3*sizeof(TValue))[m
[31m-      lj_err_caller(L, LJ_ERR_TABINS);[m
[31m-    /* NOBARRIER: This just moves existing elements around. */[m
[31m-    for (n = lj_lib_checkint(L, 2); i > n; i--) {[m
[31m-      /* The set may invalidate the get pointer, so need to do it first! */[m
[31m-      TValue *dst = lj_tab_setint(L, t, i);[m
[31m-      cTValue *src = lj_tab_getint(t, i-1);[m
[31m-      if (src) {[m
[31m-	copyTV(L, dst, src);[m
[31m-      } else {[m
[31m-	setnilV(dst);[m
[31m-      }[m
[31m-    }[m
[31m-    i = n;[m
[31m-  }[m
[31m-  {[m
[31m-    TValue *dst = lj_tab_setint(L, t, i);[m
[31m-    copyTV(L, dst, L->top-1);  /* Set new value. */[m
[31m-    lj_gc_barriert(L, t, dst);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LJLIB_LUA(table_remove) /*[m
[31m-  function(t, pos)[m
[31m-    CHECK_tab(t)[m
[31m-    local len = #t[m
[31m-    if pos == nil then[m
[31m-      if len ~= 0 then[m
[31m-	local old = t[len][m
[31m-	t[len] = nil[m
[31m-	return old[m
[31m-      end[m
[31m-    else[m
[31m-      CHECK_int(pos)[m
[31m-      if pos >= 1 and pos <= len then[m
[31m-	local old = t[pos][m
[31m-	for i=pos+1,len do[m
[31m-	  t[i-1] = t[i][m
[31m-	end[m
[31m-	t[len] = nil[m
[31m-	return old[m
[31m-      end[m
[31m-    end[m
[31m-  end[m
[31m-*/[m
[31m-[m
[31m-LJLIB_CF(table_concat)		LJLIB_REC(.)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  GCstr *sep = lj_lib_optstr(L, 2);[m
[31m-  int32_t i = lj_lib_optint(L, 3, 1);[m
[31m-  int32_t e = (L->base+3 < L->top && !tvisnil(L->base+3)) ?[m
[31m-	      lj_lib_checkint(L, 4) : (int32_t)lj_tab_len(t);[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  SBuf *sbx = lj_buf_puttab(sb, t, sep, i, e);[m
[31m-  if (LJ_UNLIKELY(!sbx)) {  /* Error: bad element type. */[m
[31m-    int32_t idx = (int32_t)(intptr_t)sbufP(sb);[m
[31m-    cTValue *o = lj_tab_getint(t, idx);[m
[31m-    lj_err_callerv(L, LJ_ERR_TABCAT,[m
[31m-		   lj_obj_itypename[o ? itypemap(o) : ~LJ_TNIL], idx);[m
[31m-  }[m
[31m-  setstrV(L, L->top-1, lj_buf_str(L, sbx));[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-static void set2(lua_State *L, int i, int j)[m
[31m-{[m
[31m-  lua_rawseti(L, 1, i);[m
[31m-  lua_rawseti(L, 1, j);[m
[31m-}[m
[31m-[m
[31m-static int sort_comp(lua_State *L, int a, int b)[m
[31m-{[m
[31m-  if (!lua_isnil(L, 2)) {  /* function? */[m
[31m-    int res;[m
[31m-    lua_pushvalue(L, 2);[m
[31m-    lua_pushvalue(L, a-1);  /* -1 to compensate function */[m
[31m-    lua_pushvalue(L, b-2);  /* -2 to compensate function and `a' */[m
[31m-    lua_call(L, 2, 1);[m
[31m-    res = lua_toboolean(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-    return res;[m
[31m-  } else {  /* a < b? */[m
[31m-    return lua_lessthan(L, a, b);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void auxsort(lua_State *L, int l, int u)[m
[31m-{[m
[31m-  while (l < u) {  /* for tail recursion */[m
[31m-    int i, j;[m
[31m-    /* sort elements a[l], a[(l+u)/2] and a[u] */[m
[31m-    lua_rawgeti(L, 1, l);[m
[31m-    lua_rawgeti(L, 1, u);[m
[31m-    if (sort_comp(L, -1, -2))  /* a[u] < a[l]? */[m
[31m-      set2(L, l, u);  /* swap a[l] - a[u] */[m
[31m-    else[m
[31m-      lua_pop(L, 2);[m
[31m-    if (u-l == 1) break;  /* only 2 elements */[m
[31m-    i = (l+u)/2;[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-    lua_rawgeti(L, 1, l);[m
[31m-    if (sort_comp(L, -2, -1)) {  /* a[i]<a[l]? */[m
[31m-      set2(L, i, l);[m
[31m-    } else {[m
[31m-      lua_pop(L, 1);  /* remove a[l] */[m
[31m-      lua_rawgeti(L, 1, u);[m
[31m-      if (sort_comp(L, -1, -2))  /* a[u]<a[i]? */[m
[31m-	set2(L, i, u);[m
[31m-      else[m
[31m-	lua_pop(L, 2);[m
[31m-    }[m
[31m-    if (u-l == 2) break;  /* only 3 elements */[m
[31m-    lua_rawgeti(L, 1, i);  /* Pivot */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_rawgeti(L, 1, u-1);[m
[31m-    set2(L, i, u-1);[m
[31m-    /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */[m
[31m-    i = l; j = u-1;[m
[31m-    for (;;) {  /* invariant: a[l..i] <= P <= a[j..u] */[m
[31m-      /* repeat ++i until a[i] >= P */[m
[31m-      while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {[m
[31m-	if (i>=u) lj_err_caller(L, LJ_ERR_TABSORT);[m
[31m-	lua_pop(L, 1);  /* remove a[i] */[m
[31m-      }[m
[31m-      /* repeat --j until a[j] <= P */[m
[31m-      while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {[m
[31m-	if (j<=l) lj_err_caller(L, LJ_ERR_TABSORT);[m
[31m-	lua_pop(L, 1);  /* remove a[j] */[m
[31m-      }[m
[31m-      if (j<i) {[m
[31m-	lua_pop(L, 3);  /* pop pivot, a[i], a[j] */[m
[31m-	break;[m
[31m-      }[m
[31m-      set2(L, i, j);[m
[31m-    }[m
[31m-    lua_rawgeti(L, 1, u-1);[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-    set2(L, u-1, i);  /* swap pivot (a[u-1]) with a[i] */[m
[31m-    /* a[l..i-1] <= a[i] == P <= a[i+1..u] */[m
[31m-    /* adjust so that smaller half is in [j..i] and larger one in [l..u] */[m
[31m-    if (i-l < u-i) {[m
[31m-      j=l; i=i-1; l=i+2;[m
[31m-    } else {[m
[31m-      j=i+1; i=u; u=j-2;[m
[31m-    }[m
[31m-    auxsort(L, j, i);  /* call recursively the smaller one */[m
[31m-  }  /* repeat the routine for the larger one */[m
[31m-}[m
[31m-[m
[31m-LJLIB_CF(table_sort)[m
[31m-{[m
[31m-  GCtab *t = lj_lib_checktab(L, 1);[m
[31m-  int32_t n = (int32_t)lj_tab_len(t);[m
[31m-  lua_settop(L, 2);[m
[31m-  if (!tvisnil(L->base+1))[m
[31m-    lj_lib_checkfunc(L, 2);[m
[31m-  auxsort(L, 1, n);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#if LJ_52[m
[31m-LJLIB_PUSH("n")[m
[31m-LJLIB_CF(table_pack)[m
[31m-{[m
[31m-  TValue *array, *base = L->base;[m
[31m-  MSize i, n = (uint32_t)(L->top - base);[m
[31m-  GCtab *t = lj_tab_new(L, n ? n+1 : 0, 1);[m
[31m-  /* NOBARRIER: The table is new (marked white). */[m
[31m-  setintV(lj_tab_setstr(L, t, strV(lj_lib_upvalue(L, 1))), (int32_t)n);[m
[31m-  for (array = tvref(t->array) + 1, i = 0; i < n; i++)[m
[31m-    copyTV(L, &array[i], &base[i]);[m
[31m-  settabV(L, base, t);[m
[31m-  L->top = base+1;[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-LJLIB_NOREG LJLIB_CF(table_new)		LJLIB_REC(.)[m
[31m-{[m
[31m-  int32_t a = lj_lib_checkint(L, 1);[m
[31m-  int32_t h = lj_lib_checkint(L, 2);[m
[31m-  lua_createtable(L, a, h);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LJLIB_NOREG LJLIB_CF(table_clear)	LJLIB_REC(.)[m
[31m-{[m
[31m-  lj_tab_clear(lj_lib_checktab(L, 1));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int luaopen_table_new(lua_State *L)[m
[31m-{[m
[31m-  return lj_lib_postreg(L, lj_cf_table_new, FF_table_new, "new");[m
[31m-}[m
[31m-[m
[31m-static int luaopen_table_clear(lua_State *L)[m
[31m-{[m
[31m-  return lj_lib_postreg(L, lj_cf_table_clear, FF_table_clear, "clear");[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#include "lj_libdef.h"[m
[31m-[m
[31m-LUALIB_API int luaopen_table(lua_State *L)[m
[31m-{[m
[31m-  LJ_LIB_REG(L, LUA_TABLIBNAME, table);[m
[31m-#if LJ_52[m
[31m-  lua_getglobal(L, "unpack");[m
[31m-  lua_setfield(L, -2, "unpack");[m
[31m-#endif[m
[31m-  lj_lib_prereg(L, LUA_TABLIBNAME ".new", luaopen_table_new, tabV(L->top-1));[m
[31m-  lj_lib_prereg(L, LUA_TABLIBNAME ".clear", luaopen_table_clear, tabV(L->top-1));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj.supp b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj.supp[m
[1mdeleted file mode 100644[m
[1mindex acb9e78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj.supp[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_fastcmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_fastcmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_fastcmp[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_alloc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_alloc.c[m
[1mdeleted file mode 100644[m
[1mindex 5d0834e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_alloc.c[m
[1m+++ /dev/null[m
[36m@@ -1,1483 +0,0 @@[m
[31m-/*[m
[31m-** Bundled memory allocator.[m
[31m-**[m
[31m-** Beware: this is a HEAVILY CUSTOMIZED version of dlmalloc.[m
[31m-** The original bears the following remark:[m
[31m-**[m
[31m-**   This is a version (aka dlmalloc) of malloc/free/realloc written by[m
[31m-**   Doug Lea and released to the public domain, as explained at[m
[31m-**   http://creativecommons.org/licenses/publicdomain.[m
[31m-**[m
[31m-**   * Version pre-2.8.4 Wed Mar 29 19:46:29 2006    (dl at gee)[m
[31m-**[m
[31m-** No additional copyright is claimed over the customizations.[m
[31m-** Please do NOT bother the original author about this version here![m
[31m-**[m
[31m-** If you want to use dlmalloc in another project, you should get[m
[31m-** the original from: ftp://gee.cs.oswego.edu/pub/misc/[m
[31m-** For thread-safe derivatives, take a look at:[m
[31m-** - ptmalloc: http://www.malloc.de/[m
[31m-** - nedmalloc: http://www.nedprod.com/programs/portable/nedmalloc/[m
[31m-*/[m
[31m-[m
[31m-#define lj_alloc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-/* To get the mremap prototype. Must be defined before any system includes. */[m
[31m-#if defined(__linux__) && !defined(_GNU_SOURCE)[m
[31m-#define _GNU_SOURCE[m
[31m-#endif[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-#include "lj_alloc.h"[m
[31m-[m
[31m-#ifndef LUAJIT_USE_SYSMALLOC[m
[31m-[m
[31m-#define MAX_SIZE_T		(~(size_t)0)[m
[31m-#define MALLOC_ALIGNMENT	((size_t)8U)[m
[31m-[m
[31m-#define DEFAULT_GRANULARITY	((size_t)128U * (size_t)1024U)[m
[31m-#define DEFAULT_TRIM_THRESHOLD	((size_t)2U * (size_t)1024U * (size_t)1024U)[m
[31m-#define DEFAULT_MMAP_THRESHOLD	((size_t)128U * (size_t)1024U)[m
[31m-#define MAX_RELEASE_CHECK_RATE	255[m
[31m-[m
[31m-/* ------------------- size_t and alignment properties -------------------- */[m
[31m-[m
[31m-/* The byte and bit size of a size_t */[m
[31m-#define SIZE_T_SIZE		(sizeof(size_t))[m
[31m-#define SIZE_T_BITSIZE		(sizeof(size_t) << 3)[m
[31m-[m
[31m-/* Some constants coerced to size_t */[m
[31m-/* Annoying but necessary to avoid errors on some platforms */[m
[31m-#define SIZE_T_ZERO		((size_t)0)[m
[31m-#define SIZE_T_ONE		((size_t)1)[m
[31m-#define SIZE_T_TWO		((size_t)2)[m
[31m-#define TWO_SIZE_T_SIZES	(SIZE_T_SIZE<<1)[m
[31m-#define FOUR_SIZE_T_SIZES	(SIZE_T_SIZE<<2)[m
[31m-#define SIX_SIZE_T_SIZES	(FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)[m
[31m-[m
[31m-/* The bit mask value corresponding to MALLOC_ALIGNMENT */[m
[31m-#define CHUNK_ALIGN_MASK	(MALLOC_ALIGNMENT - SIZE_T_ONE)[m
[31m-[m
[31m-/* the number of bytes to offset an address to align it */[m
[31m-#define align_offset(A)\[m
[31m- ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\[m
[31m-  ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))[m
[31m-[m
[31m-/* -------------------------- MMAP support ------------------------------- */[m
[31m-[m
[31m-#define MFAIL			((void *)(MAX_SIZE_T))[m
[31m-#define CMFAIL			((char *)(MFAIL)) /* defined for convenience */[m
[31m-[m
[31m-#define IS_DIRECT_BIT		(SIZE_T_ONE)[m
[31m-[m
[31m-[m
[31m-/* Determine system-specific block allocation method. */[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#define LJ_ALLOC_VIRTUALALLOC	1[m
[31m-[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define LJ_ALLOC_NTAVM		1[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#include <errno.h>[m
[31m-/* If this include fails, then rebuild with: -DLUAJIT_USE_SYSMALLOC */[m
[31m-#include <sys/mman.h>[m
[31m-[m
[31m-#define LJ_ALLOC_MMAP		1[m
[31m-[m
[31m-#if LJ_64[m
[31m-[m
[31m-#define LJ_ALLOC_MMAP_PROBE	1[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define LJ_ALLOC_MBITS		47	/* 128 TB in LJ_GC64 mode. */[m
[31m-#elif LJ_TARGET_X64 && LJ_HASJIT[m
[31m-/* Due to limitations in the x64 compiler backend. */[m
[31m-#define LJ_ALLOC_MBITS		31	/* 2 GB on x64 with !LJ_GC64. */[m
[31m-#else[m
[31m-#define LJ_ALLOC_MBITS		32	/* 4 GB on other archs with !LJ_GC64. */[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_64 && !LJ_GC64 && defined(MAP_32BIT)[m
[31m-#define LJ_ALLOC_MMAP32		1[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_LINUX[m
[31m-#define LJ_ALLOC_MREMAP		1[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if LJ_ALLOC_VIRTUALALLOC[m
[31m-[m
[31m-#if LJ_ALLOC_NTAVM[m
[31m-/* Undocumented, but hey, that's what we all love so much about Windows. */[m
[31m-typedef long (*PNTAVM)(HANDLE handle, void **addr, ULONG zbits,[m
[31m-		       size_t *size, ULONG alloctype, ULONG prot);[m
[31m-static PNTAVM ntavm;[m
[31m-[m
[31m-/* Number of top bits of the lower 32 bits of an address that must be zero.[m
[31m-** Apparently 0 gives us full 64 bit addresses and 1 gives us the lower 2GB.[m
[31m-*/[m
[31m-#define NTAVM_ZEROBITS		1[m
[31m-[m
[31m-static void init_mmap(void)[m
[31m-{[m
[31m-  ntavm = (PNTAVM)GetProcAddress(GetModuleHandleA("ntdll.dll"),[m
[31m-				 "NtAllocateVirtualMemory");[m
[31m-}[m
[31m-#define INIT_MMAP()	init_mmap()[m
[31m-[m
[31m-/* Win64 32 bit MMAP via NtAllocateVirtualMemory. */[m
[31m-static void *CALL_MMAP(size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  void *ptr = NULL;[m
[31m-  long st = ntavm(INVALID_HANDLE_VALUE, &ptr, NTAVM_ZEROBITS, &size,[m
[31m-		  MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);[m
[31m-  SetLastError(olderr);[m
[31m-  return st == 0 ? ptr : MFAIL;[m
[31m-}[m
[31m-[m
[31m-/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */[m
[31m-static void *DIRECT_MMAP(size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  void *ptr = NULL;[m
[31m-  long st = ntavm(INVALID_HANDLE_VALUE, &ptr, NTAVM_ZEROBITS, &size,[m
[31m-		  MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE);[m
[31m-  SetLastError(olderr);[m
[31m-  return st == 0 ? ptr : MFAIL;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* Win32 MMAP via VirtualAlloc */[m
[31m-static void *CALL_MMAP(size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);[m
[31m-  SetLastError(olderr);[m
[31m-  return ptr ? ptr : MFAIL;[m
[31m-}[m
[31m-[m
[31m-/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */[m
[31m-static void *DIRECT_MMAP(size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,[m
[31m-			   PAGE_READWRITE);[m
[31m-  SetLastError(olderr);[m
[31m-  return ptr ? ptr : MFAIL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* This function supports releasing coalesed segments */[m
[31m-static int CALL_MUNMAP(void *ptr, size_t size)[m
[31m-{[m
[31m-  DWORD olderr = GetLastError();[m
[31m-  MEMORY_BASIC_INFORMATION minfo;[m
[31m-  char *cptr = (char *)ptr;[m
[31m-  while (size) {[m
[31m-    if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)[m
[31m-      return -1;[m
[31m-    if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||[m
[31m-	minfo.State != MEM_COMMIT || minfo.RegionSize > size)[m
[31m-      return -1;[m
[31m-    if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)[m
[31m-      return -1;[m
[31m-    cptr += minfo.RegionSize;[m
[31m-    size -= minfo.RegionSize;[m
[31m-  }[m
[31m-  SetLastError(olderr);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#elif LJ_ALLOC_MMAP[m
[31m-[m
[31m-#define MMAP_PROT		(PROT_READ|PROT_WRITE)[m
[31m-#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)[m
[31m-#define MAP_ANONYMOUS		MAP_ANON[m
[31m-#endif[m
[31m-#define MMAP_FLAGS		(MAP_PRIVATE|MAP_ANONYMOUS)[m
[31m-[m
[31m-#if LJ_ALLOC_MMAP_PROBE[m
[31m-[m
[31m-#define LJ_ALLOC_MMAP_PROBE_MAX		30[m
[31m-#define LJ_ALLOC_MMAP_PROBE_LINEAR	5[m
[31m-[m
[31m-#define LJ_ALLOC_MMAP_PROBE_LOWER	((uintptr_t)0x4000)[m
[31m-[m
[31m-/* No point in a giant ifdef mess. Just try to open /dev/urandom.[m
[31m-** It doesn't really matter if this fails, since we get some ASLR bits from[m
[31m-** every unsuitable allocation, too. And we prefer linear allocation, anyway.[m
[31m-*/[m
[31m-#include <fcntl.h>[m
[31m-#include <unistd.h>[m
[31m-[m
[31m-static uintptr_t mmap_probe_seed(void)[m
[31m-{[m
[31m-  uintptr_t val;[m
[31m-  int fd = open("/dev/urandom", O_RDONLY);[m
[31m-  if (fd != -1) {[m
[31m-    int ok = ((size_t)read(fd, &val, sizeof(val)) == sizeof(val));[m
[31m-    (void)close(fd);[m
[31m-    if (ok) return val;[m
[31m-  }[m
[31m-  return 1;  /* Punt. */[m
[31m-}[m
[31m-[m
[31m-static void *mmap_probe(size_t size)[m
[31m-{[m
[31m-  /* Hint for next allocation. Doesn't need to be thread-safe. */[m
[31m-  static uintptr_t hint_addr = 0;[m
[31m-  static uintptr_t hint_prng = 0;[m
[31m-  int olderr = errno;[m
[31m-  int retry;[m
[31m-  for (retry = 0; retry < LJ_ALLOC_MMAP_PROBE_MAX; retry++) {[m
[31m-    void *p = mmap((void *)hint_addr, size, MMAP_PROT, MMAP_FLAGS, -1, 0);[m
[31m-    uintptr_t addr = (uintptr_t)p;[m
[31m-    if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER) {[m
[31m-      /* We got a suitable address. Bump the hint address. */[m
[31m-      hint_addr = addr + size;[m
[31m-      errno = olderr;[m
[31m-      return p;[m
[31m-    }[m
[31m-    if (p != MFAIL) {[m
[31m-      munmap(p, size);[m
[31m-    } else if (errno == ENOMEM) {[m
[31m-      return MFAIL;[m
[31m-    }[m
[31m-    if (hint_addr) {[m
[31m-      /* First, try linear probing. */[m
[31m-      if (retry < LJ_ALLOC_MMAP_PROBE_LINEAR) {[m
[31m-	hint_addr += 0x1000000;[m
[31m-	if (((hint_addr + size) >> LJ_ALLOC_MBITS) != 0)[m
[31m-	  hint_addr = 0;[m
[31m-	continue;[m
[31m-      } else if (retry == LJ_ALLOC_MMAP_PROBE_LINEAR) {[m
[31m-	/* Next, try a no-hint probe to get back an ASLR address. */[m
[31m-	hint_addr = 0;[m
[31m-	continue;[m
[31m-      }[m
[31m-    }[m
[31m-    /* Finally, try pseudo-random probing. */[m
[31m-    if (LJ_UNLIKELY(hint_prng == 0)) {[m
[31m-      hint_prng = mmap_probe_seed();[m
[31m-    }[m
[31m-    /* The unsuitable address we got has some ASLR PRNG bits. */[m
[31m-    hint_addr ^= addr & ~((uintptr_t)(LJ_PAGESIZE-1));[m
[31m-    do {  /* The PRNG itself is very weak, but see above. */[m
[31m-      hint_prng = hint_prng * 1103515245 + 12345;[m
[31m-      hint_addr ^= hint_prng * (uintptr_t)LJ_PAGESIZE;[m
[31m-      hint_addr &= (((uintptr_t)1 << LJ_ALLOC_MBITS)-1);[m
[31m-    } while (hint_addr < LJ_ALLOC_MMAP_PROBE_LOWER);[m
[31m-  }[m
[31m-  errno = olderr;[m
[31m-  return MFAIL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_ALLOC_MMAP32[m
[31m-[m
[31m-#if defined(__sun__)[m
[31m-#define LJ_ALLOC_MMAP32_START	((uintptr_t)0x1000)[m
[31m-#else[m
[31m-#define LJ_ALLOC_MMAP32_START	((uintptr_t)0)[m
[31m-#endif[m
[31m-[m
[31m-static void *mmap_map32(size_t size)[m
[31m-{[m
[31m-#if LJ_ALLOC_MMAP_PROBE[m
[31m-  static int fallback = 0;[m
[31m-  if (fallback)[m
[31m-    return mmap_probe(size);[m
[31m-#endif[m
[31m-  {[m
[31m-    int olderr = errno;[m
[31m-    void *ptr = mmap((void *)LJ_ALLOC_MMAP32_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);[m
[31m-    errno = olderr;[m
[31m-    /* This only allows 1GB on Linux. So fallback to probing to get 2GB. */[m
[31m-#if LJ_ALLOC_MMAP_PROBE[m
[31m-    if (ptr == MFAIL) {[m
[31m-      fallback = 1;[m
[31m-      return mmap_probe(size);[m
[31m-    }[m
[31m-#endif[m
[31m-    return ptr;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_ALLOC_MMAP32[m
[31m-#define CALL_MMAP(size)		mmap_map32(size)[m
[31m-#elif LJ_ALLOC_MMAP_PROBE[m
[31m-#define CALL_MMAP(size)		mmap_probe(size)[m
[31m-#else[m
[31m-static void *CALL_MMAP(size_t size)[m
[31m-{[m
[31m-  int olderr = errno;[m
[31m-  void *ptr = mmap(NULL, size, MMAP_PROT, MMAP_FLAGS, -1, 0);[m
[31m-  errno = olderr;[m
[31m-  return ptr;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4[m
[31m-[m
[31m-#include <sys/resource.h>[m
[31m-[m
[31m-static void init_mmap(void)[m
[31m-{[m
[31m-  struct rlimit rlim;[m
[31m-  rlim.rlim_cur = rlim.rlim_max = 0x10000;[m
[31m-  setrlimit(RLIMIT_DATA, &rlim);  /* Ignore result. May fail later. */[m
[31m-}[m
[31m-#define INIT_MMAP()	init_mmap()[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-static int CALL_MUNMAP(void *ptr, size_t size)[m
[31m-{[m
[31m-  int olderr = errno;[m
[31m-  int ret = munmap(ptr, size);[m
[31m-  errno = olderr;[m
[31m-  return ret;[m
[31m-}[m
[31m-[m
[31m-#if LJ_ALLOC_MREMAP[m
[31m-/* Need to define _GNU_SOURCE to get the mremap prototype. */[m
[31m-static void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz, int flags)[m
[31m-{[m
[31m-  int olderr = errno;[m
[31m-  ptr = mremap(ptr, osz, nsz, flags);[m
[31m-  errno = olderr;[m
[31m-  return ptr;[m
[31m-}[m
[31m-[m
[31m-#define CALL_MREMAP(addr, osz, nsz, mv) CALL_MREMAP_((addr), (osz), (nsz), (mv))[m
[31m-#define CALL_MREMAP_NOMOVE	0[m
[31m-#define CALL_MREMAP_MAYMOVE	1[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define CALL_MREMAP_MV		CALL_MREMAP_NOMOVE[m
[31m-#else[m
[31m-#define CALL_MREMAP_MV		CALL_MREMAP_MAYMOVE[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef INIT_MMAP[m
[31m-#define INIT_MMAP()		((void)0)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef DIRECT_MMAP[m
[31m-#define DIRECT_MMAP(s)		CALL_MMAP(s)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CALL_MREMAP[m
[31m-#define CALL_MREMAP(addr, osz, nsz, mv) ((void)osz, MFAIL)[m
[31m-#endif[m
[31m-[m
[31m-/* -----------------------  Chunk representations ------------------------ */[m
[31m-[m
[31m-struct malloc_chunk {[m
[31m-  size_t               prev_foot;  /* Size of previous chunk (if free).  */[m
[31m-  size_t               head;       /* Size and inuse bits. */[m
[31m-  struct malloc_chunk *fd;         /* double links -- used only if free. */[m
[31m-  struct malloc_chunk *bk;[m
[31m-};[m
[31m-[m
[31m-typedef struct malloc_chunk  mchunk;[m
[31m-typedef struct malloc_chunk *mchunkptr;[m
[31m-typedef struct malloc_chunk *sbinptr;  /* The type of bins of chunks */[m
[31m-typedef size_t bindex_t;               /* Described below */[m
[31m-typedef unsigned int binmap_t;         /* Described below */[m
[31m-typedef unsigned int flag_t;           /* The type of various bit flag sets */[m
[31m-[m
[31m-/* ------------------- Chunks sizes and alignments ----------------------- */[m
[31m-[m
[31m-#define MCHUNK_SIZE		(sizeof(mchunk))[m
[31m-[m
[31m-#define CHUNK_OVERHEAD		(SIZE_T_SIZE)[m
[31m-[m
[31m-/* Direct chunks need a second word of overhead ... */[m
[31m-#define DIRECT_CHUNK_OVERHEAD	(TWO_SIZE_T_SIZES)[m
[31m-/* ... and additional padding for fake next-chunk at foot */[m
[31m-#define DIRECT_FOOT_PAD		(FOUR_SIZE_T_SIZES)[m
[31m-[m
[31m-/* The smallest size we can malloc is an aligned minimal chunk */[m
[31m-#define MIN_CHUNK_SIZE\[m
[31m-  ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)[m
[31m-[m
[31m-/* conversion from malloc headers to user pointers, and back */[m
[31m-#define chunk2mem(p)		((void *)((char *)(p) + TWO_SIZE_T_SIZES))[m
[31m-#define mem2chunk(mem)		((mchunkptr)((char *)(mem) - TWO_SIZE_T_SIZES))[m
[31m-/* chunk associated with aligned address A */[m
[31m-#define align_as_chunk(A)	(mchunkptr)((A) + align_offset(chunk2mem(A)))[m
[31m-[m
[31m-/* Bounds on request (not chunk) sizes. */[m
[31m-#define MAX_REQUEST		((~MIN_CHUNK_SIZE+1) << 2)[m
[31m-#define MIN_REQUEST		(MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)[m
[31m-[m
[31m-/* pad request bytes into a usable size */[m
[31m-#define pad_request(req) \[m
[31m-   (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)[m
[31m-[m
[31m-/* pad request, checking for minimum (but not maximum) */[m
[31m-#define request2size(req) \[m
[31m-  (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))[m
[31m-[m
[31m-/* ------------------ Operations on head and foot fields ----------------- */[m
[31m-[m
[31m-#define PINUSE_BIT		(SIZE_T_ONE)[m
[31m-#define CINUSE_BIT		(SIZE_T_TWO)[m
[31m-#define INUSE_BITS		(PINUSE_BIT|CINUSE_BIT)[m
[31m-[m
[31m-/* Head value for fenceposts */[m
[31m-#define FENCEPOST_HEAD		(INUSE_BITS|SIZE_T_SIZE)[m
[31m-[m
[31m-/* extraction of fields from head words */[m
[31m-#define cinuse(p)		((p)->head & CINUSE_BIT)[m
[31m-#define pinuse(p)		((p)->head & PINUSE_BIT)[m
[31m-#define chunksize(p)		((p)->head & ~(INUSE_BITS))[m
[31m-[m
[31m-#define clear_pinuse(p)		((p)->head &= ~PINUSE_BIT)[m
[31m-#define clear_cinuse(p)		((p)->head &= ~CINUSE_BIT)[m
[31m-[m
[31m-/* Treat space at ptr +/- offset as a chunk */[m
[31m-#define chunk_plus_offset(p, s)		((mchunkptr)(((char *)(p)) + (s)))[m
[31m-#define chunk_minus_offset(p, s)	((mchunkptr)(((char *)(p)) - (s)))[m
[31m-[m
[31m-/* Ptr to next or previous physical malloc_chunk. */[m
[31m-#define next_chunk(p)	((mchunkptr)(((char *)(p)) + ((p)->head & ~INUSE_BITS)))[m
[31m-#define prev_chunk(p)	((mchunkptr)(((char *)(p)) - ((p)->prev_foot) ))[m
[31m-[m
[31m-/* extract next chunk's pinuse bit */[m
[31m-#define next_pinuse(p)	((next_chunk(p)->head) & PINUSE_BIT)[m
[31m-[m
[31m-/* Get/set size at footer */[m
[31m-#define get_foot(p, s)	(((mchunkptr)((char *)(p) + (s)))->prev_foot)[m
[31m-#define set_foot(p, s)	(((mchunkptr)((char *)(p) + (s)))->prev_foot = (s))[m
[31m-[m
[31m-/* Set size, pinuse bit, and foot */[m
[31m-#define set_size_and_pinuse_of_free_chunk(p, s)\[m
[31m-  ((p)->head = (s|PINUSE_BIT), set_foot(p, s))[m
[31m-[m
[31m-/* Set size, pinuse bit, foot, and clear next pinuse */[m
[31m-#define set_free_with_pinuse(p, s, n)\[m
[31m-  (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))[m
[31m-[m
[31m-#define is_direct(p)\[m
[31m-  (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_DIRECT_BIT))[m
[31m-[m
[31m-/* Get the internal overhead associated with chunk p */[m
[31m-#define overhead_for(p)\[m
[31m- (is_direct(p)? DIRECT_CHUNK_OVERHEAD : CHUNK_OVERHEAD)[m
[31m-[m
[31m-/* ---------------------- Overlaid data structures ----------------------- */[m
[31m-[m
[31m-struct malloc_tree_chunk {[m
[31m-  /* The first four fields must be compatible with malloc_chunk */[m
[31m-  size_t                    prev_foot;[m
[31m-  size_t                    head;[m
[31m-  struct malloc_tree_chunk *fd;[m
[31m-  struct malloc_tree_chunk *bk;[m
[31m-[m
[31m-  struct malloc_tree_chunk *child[2];[m
[31m-  struct malloc_tree_chunk *parent;[m
[31m-  bindex_t                  index;[m
[31m-};[m
[31m-[m
[31m-typedef struct malloc_tree_chunk  tchunk;[m
[31m-typedef struct malloc_tree_chunk *tchunkptr;[m
[31m-typedef struct malloc_tree_chunk *tbinptr; /* The type of bins of trees */[m
[31m-[m
[31m-/* A little helper macro for trees */[m
[31m-#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])[m
[31m-[m
[31m-/* ----------------------------- Segments -------------------------------- */[m
[31m-[m
[31m-struct malloc_segment {[m
[31m-  char        *base;             /* base address */[m
[31m-  size_t       size;             /* allocated size */[m
[31m-  struct malloc_segment *next;   /* ptr to next segment */[m
[31m-};[m
[31m-[m
[31m-typedef struct malloc_segment  msegment;[m
[31m-typedef struct malloc_segment *msegmentptr;[m
[31m-[m
[31m-/* ---------------------------- malloc_state ----------------------------- */[m
[31m-[m
[31m-/* Bin types, widths and sizes */[m
[31m-#define NSMALLBINS		(32U)[m
[31m-#define NTREEBINS		(32U)[m
[31m-#define SMALLBIN_SHIFT		(3U)[m
[31m-#define SMALLBIN_WIDTH		(SIZE_T_ONE << SMALLBIN_SHIFT)[m
[31m-#define TREEBIN_SHIFT		(8U)[m
[31m-#define MIN_LARGE_SIZE		(SIZE_T_ONE << TREEBIN_SHIFT)[m
[31m-#define MAX_SMALL_SIZE		(MIN_LARGE_SIZE - SIZE_T_ONE)[m
[31m-#define MAX_SMALL_REQUEST  (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)[m
[31m-[m
[31m-struct malloc_state {[m
[31m-  binmap_t   smallmap;[m
[31m-  binmap_t   treemap;[m
[31m-  size_t     dvsize;[m
[31m-  size_t     topsize;[m
[31m-  mchunkptr  dv;[m
[31m-  mchunkptr  top;[m
[31m-  size_t     trim_check;[m
[31m-  size_t     release_checks;[m
[31m-  mchunkptr  smallbins[(NSMALLBINS+1)*2];[m
[31m-  tbinptr    treebins[NTREEBINS];[m
[31m-  msegment   seg;[m
[31m-};[m
[31m-[m
[31m-typedef struct malloc_state *mstate;[m
[31m-[m
[31m-#define is_initialized(M)	((M)->top != 0)[m
[31m-[m
[31m-/* -------------------------- system alloc setup ------------------------- */[m
[31m-[m
[31m-/* page-align a size */[m
[31m-#define page_align(S)\[m
[31m- (((S) + (LJ_PAGESIZE - SIZE_T_ONE)) & ~(LJ_PAGESIZE - SIZE_T_ONE))[m
[31m-[m
[31m-/* granularity-align a size */[m
[31m-#define granularity_align(S)\[m
[31m-  (((S) + (DEFAULT_GRANULARITY - SIZE_T_ONE))\[m
[31m-   & ~(DEFAULT_GRANULARITY - SIZE_T_ONE))[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-#define mmap_align(S)	granularity_align(S)[m
[31m-#else[m
[31m-#define mmap_align(S)	page_align(S)[m
[31m-#endif[m
[31m-[m
[31m-/*  True if segment S holds address A */[m
[31m-#define segment_holds(S, A)\[m
[31m-  ((char *)(A) >= S->base && (char *)(A) < S->base + S->size)[m
[31m-[m
[31m-/* Return segment holding given address */[m
[31m-static msegmentptr segment_holding(mstate m, char *addr)[m
[31m-{[m
[31m-  msegmentptr sp = &m->seg;[m
[31m-  for (;;) {[m
[31m-    if (addr >= sp->base && addr < sp->base + sp->size)[m
[31m-      return sp;[m
[31m-    if ((sp = sp->next) == 0)[m
[31m-      return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return true if segment contains a segment link */[m
[31m-static int has_segment_link(mstate m, msegmentptr ss)[m
[31m-{[m
[31m-  msegmentptr sp = &m->seg;[m
[31m-  for (;;) {[m
[31m-    if ((char *)sp >= ss->base && (char *)sp < ss->base + ss->size)[m
[31m-      return 1;[m
[31m-    if ((sp = sp->next) == 0)[m
[31m-      return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-  TOP_FOOT_SIZE is padding at the end of a segment, including space[m
[31m-  that may be needed to place segment records and fenceposts when new[m
[31m-  noncontiguous segments are added.[m
[31m-*/[m
[31m-#define TOP_FOOT_SIZE\[m
[31m-  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)[m
[31m-[m
[31m-/* ---------------------------- Indexing Bins ---------------------------- */[m
[31m-[m
[31m-#define is_small(s)		(((s) >> SMALLBIN_SHIFT) < NSMALLBINS)[m
[31m-#define small_index(s)		((s)  >> SMALLBIN_SHIFT)[m
[31m-#define small_index2size(i)	((i)  << SMALLBIN_SHIFT)[m
[31m-#define MIN_SMALL_INDEX		(small_index(MIN_CHUNK_SIZE))[m
[31m-[m
[31m-/* addressing by index. See above about smallbin repositioning */[m
[31m-#define smallbin_at(M, i)	((sbinptr)((char *)&((M)->smallbins[(i)<<1])))[m
[31m-#define treebin_at(M,i)		(&((M)->treebins[i]))[m
[31m-[m
[31m-/* assign tree index for size S to variable I */[m
[31m-#define compute_tree_index(S, I)\[m
[31m-{\[m
[31m-  unsigned int X = (unsigned int)(S >> TREEBIN_SHIFT);\[m
[31m-  if (X == 0) {\[m
[31m-    I = 0;\[m
[31m-  } else if (X > 0xFFFF) {\[m
[31m-    I = NTREEBINS-1;\[m
[31m-  } else {\[m
[31m-    unsigned int K = lj_fls(X);\[m
[31m-    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-/* Bit representing maximum resolved size in a treebin at i */[m
[31m-#define bit_for_tree_index(i) \[m
[31m-   (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)[m
[31m-[m
[31m-/* Shift placing maximum resolved bit in a treebin at i as sign bit */[m
[31m-#define leftshift_for_tree_index(i) \[m
[31m-   ((i == NTREEBINS-1)? 0 : \[m
[31m-    ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))[m
[31m-[m
[31m-/* The size of the smallest chunk held in bin with index i */[m
[31m-#define minsize_for_tree_index(i) \[m
[31m-   ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  \[m
[31m-   (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))[m
[31m-[m
[31m-/* ------------------------ Operations on bin maps ----------------------- */[m
[31m-[m
[31m-/* bit corresponding to given index */[m
[31m-#define idx2bit(i)		((binmap_t)(1) << (i))[m
[31m-[m
[31m-/* Mark/Clear bits with given index */[m
[31m-#define mark_smallmap(M,i)	((M)->smallmap |=  idx2bit(i))[m
[31m-#define clear_smallmap(M,i)	((M)->smallmap &= ~idx2bit(i))[m
[31m-#define smallmap_is_marked(M,i)	((M)->smallmap &   idx2bit(i))[m
[31m-[m
[31m-#define mark_treemap(M,i)	((M)->treemap  |=  idx2bit(i))[m
[31m-#define clear_treemap(M,i)	((M)->treemap  &= ~idx2bit(i))[m
[31m-#define treemap_is_marked(M,i)	((M)->treemap  &   idx2bit(i))[m
[31m-[m
[31m-/* mask with all bits to left of least bit of x on */[m
[31m-#define left_bits(x)		((x<<1) | (~(x<<1)+1))[m
[31m-[m
[31m-/* Set cinuse bit and pinuse bit of next chunk */[m
[31m-#define set_inuse(M,p,s)\[m
[31m-  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\[m
[31m-  ((mchunkptr)(((char *)(p)) + (s)))->head |= PINUSE_BIT)[m
[31m-[m
[31m-/* Set cinuse and pinuse of this chunk and pinuse of next chunk */[m
[31m-#define set_inuse_and_pinuse(M,p,s)\[m
[31m-  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\[m
[31m-  ((mchunkptr)(((char *)(p)) + (s)))->head |= PINUSE_BIT)[m
[31m-[m
[31m-/* Set size, cinuse and pinuse bit of this chunk */[m
[31m-#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\[m
[31m-  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))[m
[31m-[m
[31m-/* ----------------------- Operations on smallbins ----------------------- */[m
[31m-[m
[31m-/* Link a free chunk into a smallbin  */[m
[31m-#define insert_small_chunk(M, P, S) {\[m
[31m-  bindex_t I = small_index(S);\[m
[31m-  mchunkptr B = smallbin_at(M, I);\[m
[31m-  mchunkptr F = B;\[m
[31m-  if (!smallmap_is_marked(M, I))\[m
[31m-    mark_smallmap(M, I);\[m
[31m-  else\[m
[31m-    F = B->fd;\[m
[31m-  B->fd = P;\[m
[31m-  F->bk = P;\[m
[31m-  P->fd = F;\[m
[31m-  P->bk = B;\[m
[31m-}[m
[31m-[m
[31m-/* Unlink a chunk from a smallbin  */[m
[31m-#define unlink_small_chunk(M, P, S) {\[m
[31m-  mchunkptr F = P->fd;\[m
[31m-  mchunkptr B = P->bk;\[m
[31m-  bindex_t I = small_index(S);\[m
[31m-  if (F == B) {\[m
[31m-    clear_smallmap(M, I);\[m
[31m-  } else {\[m
[31m-    F->bk = B;\[m
[31m-    B->fd = F;\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-/* Unlink the first chunk from a smallbin */[m
[31m-#define unlink_first_small_chunk(M, B, P, I) {\[m
[31m-  mchunkptr F = P->fd;\[m
[31m-  if (B == F) {\[m
[31m-    clear_smallmap(M, I);\[m
[31m-  } else {\[m
[31m-    B->fd = F;\[m
[31m-    F->bk = B;\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-/* Replace dv node, binning the old one */[m
[31m-/* Used only when dvsize known to be small */[m
[31m-#define replace_dv(M, P, S) {\[m
[31m-  size_t DVS = M->dvsize;\[m
[31m-  if (DVS != 0) {\[m
[31m-    mchunkptr DV = M->dv;\[m
[31m-    insert_small_chunk(M, DV, DVS);\[m
[31m-  }\[m
[31m-  M->dvsize = S;\[m
[31m-  M->dv = P;\[m
[31m-}[m
[31m-[m
[31m-/* ------------------------- Operations on trees ------------------------- */[m
[31m-[m
[31m-/* Insert chunk into tree */[m
[31m-#define insert_large_chunk(M, X, S) {\[m
[31m-  tbinptr *H;\[m
[31m-  bindex_t I;\[m
[31m-  compute_tree_index(S, I);\[m
[31m-  H = treebin_at(M, I);\[m
[31m-  X->index = I;\[m
[31m-  X->child[0] = X->child[1] = 0;\[m
[31m-  if (!treemap_is_marked(M, I)) {\[m
[31m-    mark_treemap(M, I);\[m
[31m-    *H = X;\[m
[31m-    X->parent = (tchunkptr)H;\[m
[31m-    X->fd = X->bk = X;\[m
[31m-  } else {\[m
[31m-    tchunkptr T = *H;\[m
[31m-    size_t K = S << leftshift_for_tree_index(I);\[m
[31m-    for (;;) {\[m
[31m-      if (chunksize(T) != S) {\[m
[31m-	tchunkptr *C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\[m
[31m-	K <<= 1;\[m
[31m-	if (*C != 0) {\[m
[31m-	  T = *C;\[m
[31m-	} else {\[m
[31m-	  *C = X;\[m
[31m-	  X->parent = T;\[m
[31m-	  X->fd = X->bk = X;\[m
[31m-	  break;\[m
[31m-	}\[m
[31m-      } else {\[m
[31m-	tchunkptr F = T->fd;\[m
[31m-	T->fd = F->bk = X;\[m
[31m-	X->fd = F;\[m
[31m-	X->bk = T;\[m
[31m-	X->parent = 0;\[m
[31m-	break;\[m
[31m-      }\[m
[31m-    }\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-#define unlink_large_chunk(M, X) {\[m
[31m-  tchunkptr XP = X->parent;\[m
[31m-  tchunkptr R;\[m
[31m-  if (X->bk != X) {\[m
[31m-    tchunkptr F = X->fd;\[m
[31m-    R = X->bk;\[m
[31m-    F->bk = R;\[m
[31m-    R->fd = F;\[m
[31m-  } else {\[m
[31m-    tchunkptr *RP;\[m
[31m-    if (((R = *(RP = &(X->child[1]))) != 0) ||\[m
[31m-	((R = *(RP = &(X->child[0]))) != 0)) {\[m
[31m-      tchunkptr *CP;\[m
[31m-      while ((*(CP = &(R->child[1])) != 0) ||\[m
[31m-	     (*(CP = &(R->child[0])) != 0)) {\[m
[31m-	R = *(RP = CP);\[m
[31m-      }\[m
[31m-      *RP = 0;\[m
[31m-    }\[m
[31m-  }\[m
[31m-  if (XP != 0) {\[m
[31m-    tbinptr *H = treebin_at(M, X->index);\[m
[31m-    if (X == *H) {\[m
[31m-      if ((*H = R) == 0) \[m
[31m-	clear_treemap(M, X->index);\[m
[31m-    } else {\[m
[31m-      if (XP->child[0] == X) \[m
[31m-	XP->child[0] = R;\[m
[31m-      else \[m
[31m-	XP->child[1] = R;\[m
[31m-    }\[m
[31m-    if (R != 0) {\[m
[31m-      tchunkptr C0, C1;\[m
[31m-      R->parent = XP;\[m
[31m-      if ((C0 = X->child[0]) != 0) {\[m
[31m-	R->child[0] = C0;\[m
[31m-	C0->parent = R;\[m
[31m-      }\[m
[31m-      if ((C1 = X->child[1]) != 0) {\[m
[31m-	R->child[1] = C1;\[m
[31m-	C1->parent = R;\[m
[31m-      }\[m
[31m-    }\[m
[31m-  }\[m
[31m-}[m
[31m-[m
[31m-/* Relays to large vs small bin operations */[m
[31m-[m
[31m-#define insert_chunk(M, P, S)\[m
[31m-  if (is_small(S)) { insert_small_chunk(M, P, S)\[m
[31m-  } else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }[m
[31m-[m
[31m-#define unlink_chunk(M, P, S)\[m
[31m-  if (is_small(S)) { unlink_small_chunk(M, P, S)\[m
[31m-  } else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }[m
[31m-[m
[31m-/* -----------------------  Direct-mmapping chunks ----------------------- */[m
[31m-[m
[31m-static void *direct_alloc(size_t nb)[m
[31m-{[m
[31m-  size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);[m
[31m-  if (LJ_LIKELY(mmsize > nb)) {     /* Check for wrap around 0 */[m
[31m-    char *mm = (char *)(DIRECT_MMAP(mmsize));[m
[31m-    if (mm != CMFAIL) {[m
[31m-      size_t offset = align_offset(chunk2mem(mm));[m
[31m-      size_t psize = mmsize - offset - DIRECT_FOOT_PAD;[m
[31m-      mchunkptr p = (mchunkptr)(mm + offset);[m
[31m-      p->prev_foot = offset | IS_DIRECT_BIT;[m
[31m-      p->head = psize|CINUSE_BIT;[m
[31m-      chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;[m
[31m-      chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;[m
[31m-      return chunk2mem(p);[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static mchunkptr direct_resize(mchunkptr oldp, size_t nb)[m
[31m-{[m
[31m-  size_t oldsize = chunksize(oldp);[m
[31m-  if (is_small(nb)) /* Can't shrink direct regions below small size */[m
[31m-    return NULL;[m
[31m-  /* Keep old chunk if big enough but not too big */[m
[31m-  if (oldsize >= nb + SIZE_T_SIZE &&[m
[31m-      (oldsize - nb) <= (DEFAULT_GRANULARITY >> 1)) {[m
[31m-    return oldp;[m
[31m-  } else {[m
[31m-    size_t offset = oldp->prev_foot & ~IS_DIRECT_BIT;[m
[31m-    size_t oldmmsize = oldsize + offset + DIRECT_FOOT_PAD;[m
[31m-    size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);[m
[31m-    char *cp = (char *)CALL_MREMAP((char *)oldp - offset,[m
[31m-				   oldmmsize, newmmsize, CALL_MREMAP_MV);[m
[31m-    if (cp != CMFAIL) {[m
[31m-      mchunkptr newp = (mchunkptr)(cp + offset);[m
[31m-      size_t psize = newmmsize - offset - DIRECT_FOOT_PAD;[m
[31m-      newp->head = psize|CINUSE_BIT;[m
[31m-      chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;[m
[31m-      chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;[m
[31m-      return newp;[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -------------------------- mspace management -------------------------- */[m
[31m-[m
[31m-/* Initialize top chunk and its size */[m
[31m-static void init_top(mstate m, mchunkptr p, size_t psize)[m
[31m-{[m
[31m-  /* Ensure alignment */[m
[31m-  size_t offset = align_offset(chunk2mem(p));[m
[31m-  p = (mchunkptr)((char *)p + offset);[m
[31m-  psize -= offset;[m
[31m-[m
[31m-  m->top = p;[m
[31m-  m->topsize = psize;[m
[31m-  p->head = psize | PINUSE_BIT;[m
[31m-  /* set size of fake trailing chunk holding overhead space only once */[m
[31m-  chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;[m
[31m-  m->trim_check = DEFAULT_TRIM_THRESHOLD; /* reset on each update */[m
[31m-}[m
[31m-[m
[31m-/* Initialize bins for a new mstate that is otherwise zeroed out */[m
[31m-static void init_bins(mstate m)[m
[31m-{[m
[31m-  /* Establish circular links for smallbins */[m
[31m-  bindex_t i;[m
[31m-  for (i = 0; i < NSMALLBINS; i++) {[m
[31m-    sbinptr bin = smallbin_at(m,i);[m
[31m-    bin->fd = bin->bk = bin;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocate chunk and prepend remainder with chunk in successor base. */[m
[31m-static void *prepend_alloc(mstate m, char *newbase, char *oldbase, size_t nb)[m
[31m-{[m
[31m-  mchunkptr p = align_as_chunk(newbase);[m
[31m-  mchunkptr oldfirst = align_as_chunk(oldbase);[m
[31m-  size_t psize = (size_t)((char *)oldfirst - (char *)p);[m
[31m-  mchunkptr q = chunk_plus_offset(p, nb);[m
[31m-  size_t qsize = psize - nb;[m
[31m-  set_size_and_pinuse_of_inuse_chunk(m, p, nb);[m
[31m-[m
[31m-  /* consolidate remainder with first chunk of old base */[m
[31m-  if (oldfirst == m->top) {[m
[31m-    size_t tsize = m->topsize += qsize;[m
[31m-    m->top = q;[m
[31m-    q->head = tsize | PINUSE_BIT;[m
[31m-  } else if (oldfirst == m->dv) {[m
[31m-    size_t dsize = m->dvsize += qsize;[m
[31m-    m->dv = q;[m
[31m-    set_size_and_pinuse_of_free_chunk(q, dsize);[m
[31m-  } else {[m
[31m-    if (!cinuse(oldfirst)) {[m
[31m-      size_t nsize = chunksize(oldfirst);[m
[31m-      unlink_chunk(m, oldfirst, nsize);[m
[31m-      oldfirst = chunk_plus_offset(oldfirst, nsize);[m
[31m-      qsize += nsize;[m
[31m-    }[m
[31m-    set_free_with_pinuse(q, qsize, oldfirst);[m
[31m-    insert_chunk(m, q, qsize);[m
[31m-  }[m
[31m-[m
[31m-  return chunk2mem(p);[m
[31m-}[m
[31m-[m
[31m-/* Add a segment to hold a new noncontiguous region */[m
[31m-static void add_segment(mstate m, char *tbase, size_t tsize)[m
[31m-{[m
[31m-  /* Determine locations and sizes of segment, fenceposts, old top */[m
[31m-  char *old_top = (char *)m->top;[m
[31m-  msegmentptr oldsp = segment_holding(m, old_top);[m
[31m-  char *old_end = oldsp->base + oldsp->size;[m
[31m-  size_t ssize = pad_request(sizeof(struct malloc_segment));[m
[31m-  char *rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);[m
[31m-  size_t offset = align_offset(chunk2mem(rawsp));[m
[31m-  char *asp = rawsp + offset;[m
[31m-  char *csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;[m
[31m-  mchunkptr sp = (mchunkptr)csp;[m
[31m-  msegmentptr ss = (msegmentptr)(chunk2mem(sp));[m
[31m-  mchunkptr tnext = chunk_plus_offset(sp, ssize);[m
[31m-  mchunkptr p = tnext;[m
[31m-[m
[31m-  /* reset top to new space */[m
[31m-  init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);[m
[31m-[m
[31m-  /* Set up segment record */[m
[31m-  set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);[m
[31m-  *ss = m->seg; /* Push current record */[m
[31m-  m->seg.base = tbase;[m
[31m-  m->seg.size = tsize;[m
[31m-  m->seg.next = ss;[m
[31m-[m
[31m-  /* Insert trailing fenceposts */[m
[31m-  for (;;) {[m
[31m-    mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);[m
[31m-    p->head = FENCEPOST_HEAD;[m
[31m-    if ((char *)(&(nextp->head)) < old_end)[m
[31m-      p = nextp;[m
[31m-    else[m
[31m-      break;[m
[31m-  }[m
[31m-[m
[31m-  /* Insert the rest of old top into a bin as an ordinary free chunk */[m
[31m-  if (csp != old_top) {[m
[31m-    mchunkptr q = (mchunkptr)old_top;[m
[31m-    size_t psize = (size_t)(csp - old_top);[m
[31m-    mchunkptr tn = chunk_plus_offset(q, psize);[m
[31m-    set_free_with_pinuse(q, psize, tn);[m
[31m-    insert_chunk(m, q, psize);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -------------------------- System allocation -------------------------- */[m
[31m-[m
[31m-static void *alloc_sys(mstate m, size_t nb)[m
[31m-{[m
[31m-  char *tbase = CMFAIL;[m
[31m-  size_t tsize = 0;[m
[31m-[m
[31m-  /* Directly map large chunks */[m
[31m-  if (LJ_UNLIKELY(nb >= DEFAULT_MMAP_THRESHOLD)) {[m
[31m-    void *mem = direct_alloc(nb);[m
[31m-    if (mem != 0)[m
[31m-      return mem;[m
[31m-  }[m
[31m-[m
[31m-  {[m
[31m-    size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE;[m
[31m-    size_t rsize = granularity_align(req);[m
[31m-    if (LJ_LIKELY(rsize > nb)) { /* Fail if wraps around zero */[m
[31m-      char *mp = (char *)(CALL_MMAP(rsize));[m
[31m-      if (mp != CMFAIL) {[m
[31m-	tbase = mp;[m
[31m-	tsize = rsize;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (tbase != CMFAIL) {[m
[31m-    msegmentptr sp = &m->seg;[m
[31m-    /* Try to merge with an existing segment */[m
[31m-    while (sp != 0 && tbase != sp->base + sp->size)[m
[31m-      sp = sp->next;[m
[31m-    if (sp != 0 && segment_holds(sp, m->top)) { /* append */[m
[31m-      sp->size += tsize;[m
[31m-      init_top(m, m->top, m->topsize + tsize);[m
[31m-    } else {[m
[31m-      sp = &m->seg;[m
[31m-      while (sp != 0 && sp->base != tbase + tsize)[m
[31m-	sp = sp->next;[m
[31m-      if (sp != 0) {[m
[31m-	char *oldbase = sp->base;[m
[31m-	sp->base = tbase;[m
[31m-	sp->size += tsize;[m
[31m-	return prepend_alloc(m, tbase, oldbase, nb);[m
[31m-      } else {[m
[31m-	add_segment(m, tbase, tsize);[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    if (nb < m->topsize) { /* Allocate from new or extended top space */[m
[31m-      size_t rsize = m->topsize -= nb;[m
[31m-      mchunkptr p = m->top;[m
[31m-      mchunkptr r = m->top = chunk_plus_offset(p, nb);[m
[31m-      r->head = rsize | PINUSE_BIT;[m
[31m-      set_size_and_pinuse_of_inuse_chunk(m, p, nb);[m
[31m-      return chunk2mem(p);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -----------------------  system deallocation -------------------------- */[m
[31m-[m
[31m-/* Unmap and unlink any mmapped segments that don't contain used chunks */[m
[31m-static size_t release_unused_segments(mstate m)[m
[31m-{[m
[31m-  size_t released = 0;[m
[31m-  size_t nsegs = 0;[m
[31m-  msegmentptr pred = &m->seg;[m
[31m-  msegmentptr sp = pred->next;[m
[31m-  while (sp != 0) {[m
[31m-    char *base = sp->base;[m
[31m-    size_t size = sp->size;[m
[31m-    msegmentptr next = sp->next;[m
[31m-    nsegs++;[m
[31m-    {[m
[31m-      mchunkptr p = align_as_chunk(base);[m
[31m-      size_t psize = chunksize(p);[m
[31m-      /* Can unmap if first chunk holds entire segment and not pinned */[m
[31m-      if (!cinuse(p) && (char *)p + psize >= base + size - TOP_FOOT_SIZE) {[m
[31m-	tchunkptr tp = (tchunkptr)p;[m
[31m-	if (p == m->dv) {[m
[31m-	  m->dv = 0;[m
[31m-	  m->dvsize = 0;[m
[31m-	} else {[m
[31m-	  unlink_large_chunk(m, tp);[m
[31m-	}[m
[31m-	if (CALL_MUNMAP(base, size) == 0) {[m
[31m-	  released += size;[m
[31m-	  /* unlink obsoleted record */[m
[31m-	  sp = pred;[m
[31m-	  sp->next = next;[m
[31m-	} else { /* back out if cannot unmap */[m
[31m-	  insert_large_chunk(m, tp, psize);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    pred = sp;[m
[31m-    sp = next;[m
[31m-  }[m
[31m-  /* Reset check counter */[m
[31m-  m->release_checks = nsegs > MAX_RELEASE_CHECK_RATE ?[m
[31m-		      nsegs : MAX_RELEASE_CHECK_RATE;[m
[31m-  return released;[m
[31m-}[m
[31m-[m
[31m-static int alloc_trim(mstate m, size_t pad)[m
[31m-{[m
[31m-  size_t released = 0;[m
[31m-  if (pad < MAX_REQUEST && is_initialized(m)) {[m
[31m-    pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */[m
[31m-[m
[31m-    if (m->topsize > pad) {[m
[31m-      /* Shrink top space in granularity-size units, keeping at least one */[m
[31m-      size_t unit = DEFAULT_GRANULARITY;[m
[31m-      size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -[m
[31m-		      SIZE_T_ONE) * unit;[m
[31m-      msegmentptr sp = segment_holding(m, (char *)m->top);[m
[31m-[m
[31m-      if (sp->size >= extra &&[m
[31m-	  !has_segment_link(m, sp)) { /* can't shrink if pinned */[m
[31m-	size_t newsize = sp->size - extra;[m
[31m-	/* Prefer mremap, fall back to munmap */[m
[31m-	if ((CALL_MREMAP(sp->base, sp->size, newsize, CALL_MREMAP_NOMOVE) != MFAIL) ||[m
[31m-	    (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {[m
[31m-	  released = extra;[m
[31m-	}[m
[31m-      }[m
[31m-[m
[31m-      if (released != 0) {[m
[31m-	sp->size -= released;[m
[31m-	init_top(m, m->top, m->topsize - released);[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Unmap any unused mmapped segments */[m
[31m-    released += release_unused_segments(m);[m
[31m-[m
[31m-    /* On failure, disable autotrim to avoid repeated failed future calls */[m
[31m-    if (released == 0 && m->topsize > m->trim_check)[m
[31m-      m->trim_check = MAX_SIZE_T;[m
[31m-  }[m
[31m-[m
[31m-  return (released != 0)? 1 : 0;[m
[31m-}[m
[31m-[m
[31m-/* ---------------------------- malloc support --------------------------- */[m
[31m-[m
[31m-/* allocate a large request from the best fitting chunk in a treebin */[m
[31m-static void *tmalloc_large(mstate m, size_t nb)[m
[31m-{[m
[31m-  tchunkptr v = 0;[m
[31m-  size_t rsize = ~nb+1; /* Unsigned negation */[m
[31m-  tchunkptr t;[m
[31m-  bindex_t idx;[m
[31m-  compute_tree_index(nb, idx);[m
[31m-[m
[31m-  if ((t = *treebin_at(m, idx)) != 0) {[m
[31m-    /* Traverse tree for this bin looking for node with size == nb */[m
[31m-    size_t sizebits = nb << leftshift_for_tree_index(idx);[m
[31m-    tchunkptr rst = 0;  /* The deepest untaken right subtree */[m
[31m-    for (;;) {[m
[31m-      tchunkptr rt;[m
[31m-      size_t trem = chunksize(t) - nb;[m
[31m-      if (trem < rsize) {[m
[31m-	v = t;[m
[31m-	if ((rsize = trem) == 0)[m
[31m-	  break;[m
[31m-      }[m
[31m-      rt = t->child[1];[m
[31m-      t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];[m
[31m-      if (rt != 0 && rt != t)[m
[31m-	rst = rt;[m
[31m-      if (t == 0) {[m
[31m-	t = rst; /* set t to least subtree holding sizes > nb */[m
[31m-	break;[m
[31m-      }[m
[31m-      sizebits <<= 1;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */[m
[31m-    binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;[m
[31m-    if (leftbits != 0)[m
[31m-      t = *treebin_at(m, lj_ffs(leftbits));[m
[31m-  }[m
[31m-[m
[31m-  while (t != 0) { /* find smallest of tree or subtree */[m
[31m-    size_t trem = chunksize(t) - nb;[m
[31m-    if (trem < rsize) {[m
[31m-      rsize = trem;[m
[31m-      v = t;[m
[31m-    }[m
[31m-    t = leftmost_child(t);[m
[31m-  }[m
[31m-[m
[31m-  /*  If dv is a better fit, return NULL so malloc will use it */[m
[31m-  if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {[m
[31m-    mchunkptr r = chunk_plus_offset(v, nb);[m
[31m-    unlink_large_chunk(m, v);[m
[31m-    if (rsize < MIN_CHUNK_SIZE) {[m
[31m-      set_inuse_and_pinuse(m, v, (rsize + nb));[m
[31m-    } else {[m
[31m-      set_size_and_pinuse_of_inuse_chunk(m, v, nb);[m
[31m-      set_size_and_pinuse_of_free_chunk(r, rsize);[m
[31m-      insert_chunk(m, r, rsize);[m
[31m-    }[m
[31m-    return chunk2mem(v);[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* allocate a small request from the best fitting chunk in a treebin */[m
[31m-static void *tmalloc_small(mstate m, size_t nb)[m
[31m-{[m
[31m-  tchunkptr t, v;[m
[31m-  mchunkptr r;[m
[31m-  size_t rsize;[m
[31m-  bindex_t i = lj_ffs(m->treemap);[m
[31m-[m
[31m-  v = t = *treebin_at(m, i);[m
[31m-  rsize = chunksize(t) - nb;[m
[31m-[m
[31m-  while ((t = leftmost_child(t)) != 0) {[m
[31m-    size_t trem = chunksize(t) - nb;[m
[31m-    if (trem < rsize) {[m
[31m-      rsize = trem;[m
[31m-      v = t;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  r = chunk_plus_offset(v, nb);[m
[31m-  unlink_large_chunk(m, v);[m
[31m-  if (rsize < MIN_CHUNK_SIZE) {[m
[31m-    set_inuse_and_pinuse(m, v, (rsize + nb));[m
[31m-  } else {[m
[31m-    set_size_and_pinuse_of_inuse_chunk(m, v, nb);[m
[31m-    set_size_and_pinuse_of_free_chunk(r, rsize);[m
[31m-    replace_dv(m, r, rsize);[m
[31m-  }[m
[31m-  return chunk2mem(v);[m
[31m-}[m
[31m-[m
[31m-/* ----------------------------------------------------------------------- */[m
[31m-[m
[31m-void *lj_alloc_create(void)[m
[31m-{[m
[31m-  size_t tsize = DEFAULT_GRANULARITY;[m
[31m-  char *tbase;[m
[31m-  INIT_MMAP();[m
[31m-  tbase = (char *)(CALL_MMAP(tsize));[m
[31m-  if (tbase != CMFAIL) {[m
[31m-    size_t msize = pad_request(sizeof(struct malloc_state));[m
[31m-    mchunkptr mn;[m
[31m-    mchunkptr msp = align_as_chunk(tbase);[m
[31m-    mstate m = (mstate)(chunk2mem(msp));[m
[31m-    memset(m, 0, msize);[m
[31m-    msp->head = (msize|PINUSE_BIT|CINUSE_BIT);[m
[31m-    m->seg.base = tbase;[m
[31m-    m->seg.size = tsize;[m
[31m-    m->release_checks = MAX_RELEASE_CHECK_RATE;[m
[31m-    init_bins(m);[m
[31m-    mn = next_chunk(mem2chunk(m));[m
[31m-    init_top(m, mn, (size_t)((tbase + tsize) - (char *)mn) - TOP_FOOT_SIZE);[m
[31m-    return m;[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-void lj_alloc_destroy(void *msp)[m
[31m-{[m
[31m-  mstate ms = (mstate)msp;[m
[31m-  msegmentptr sp = &ms->seg;[m
[31m-  while (sp != 0) {[m
[31m-    char *base = sp->base;[m
[31m-    size_t size = sp->size;[m
[31m-    sp = sp->next;[m
[31m-    CALL_MUNMAP(base, size);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE void *lj_alloc_malloc(void *msp, size_t nsize)[m
[31m-{[m
[31m-  mstate ms = (mstate)msp;[m
[31m-  void *mem;[m
[31m-  size_t nb;[m
[31m-  if (nsize <= MAX_SMALL_REQUEST) {[m
[31m-    bindex_t idx;[m
[31m-    binmap_t smallbits;[m
[31m-    nb = (nsize < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(nsize);[m
[31m-    idx = small_index(nb);[m
[31m-    smallbits = ms->smallmap >> idx;[m
[31m-[m
[31m-    if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */[m
[31m-      mchunkptr b, p;[m
[31m-      idx += ~smallbits & 1;       /* Uses next bin if idx empty */[m
[31m-      b = smallbin_at(ms, idx);[m
[31m-      p = b->fd;[m
[31m-      unlink_first_small_chunk(ms, b, p, idx);[m
[31m-      set_inuse_and_pinuse(ms, p, small_index2size(idx));[m
[31m-      mem = chunk2mem(p);[m
[31m-      return mem;[m
[31m-    } else if (nb > ms->dvsize) {[m
[31m-      if (smallbits != 0) { /* Use chunk in next nonempty smallbin */[m
[31m-	mchunkptr b, p, r;[m
[31m-	size_t rsize;[m
[31m-	binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));[m
[31m-	bindex_t i = lj_ffs(leftbits);[m
[31m-	b = smallbin_at(ms, i);[m
[31m-	p = b->fd;[m
[31m-	unlink_first_small_chunk(ms, b, p, i);[m
[31m-	rsize = small_index2size(i) - nb;[m
[31m-	/* Fit here cannot be remainderless if 4byte sizes */[m
[31m-	if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) {[m
[31m-	  set_inuse_and_pinuse(ms, p, small_index2size(i));[m
[31m-	} else {[m
[31m-	  set_size_and_pinuse_of_inuse_chunk(ms, p, nb);[m
[31m-	  r = chunk_plus_offset(p, nb);[m
[31m-	  set_size_and_pinuse_of_free_chunk(r, rsize);[m
[31m-	  replace_dv(ms, r, rsize);[m
[31m-	}[m
[31m-	mem = chunk2mem(p);[m
[31m-	return mem;[m
[31m-      } else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {[m
[31m-	return mem;[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (nsize >= MAX_REQUEST) {[m
[31m-    nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */[m
[31m-  } else {[m
[31m-    nb = pad_request(nsize);[m
[31m-    if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {[m
[31m-      return mem;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (nb <= ms->dvsize) {[m
[31m-    size_t rsize = ms->dvsize - nb;[m
[31m-    mchunkptr p = ms->dv;[m
[31m-    if (rsize >= MIN_CHUNK_SIZE) { /* split dv */[m
[31m-      mchunkptr r = ms->dv = chunk_plus_offset(p, nb);[m
[31m-      ms->dvsize = rsize;[m
[31m-      set_size_and_pinuse_of_free_chunk(r, rsize);[m
[31m-      set_size_and_pinuse_of_inuse_chunk(ms, p, nb);[m
[31m-    } else { /* exhaust dv */[m
[31m-      size_t dvs = ms->dvsize;[m
[31m-      ms->dvsize = 0;[m
[31m-      ms->dv = 0;[m
[31m-      set_inuse_and_pinuse(ms, p, dvs);[m
[31m-    }[m
[31m-    mem = chunk2mem(p);[m
[31m-    return mem;[m
[31m-  } else if (nb < ms->topsize) { /* Split top */[m
[31m-    size_t rsize = ms->topsize -= nb;[m
[31m-    mchunkptr p = ms->top;[m
[31m-    mchunkptr r = ms->top = chunk_plus_offset(p, nb);[m
[31m-    r->head = rsize | PINUSE_BIT;[m
[31m-    set_size_and_pinuse_of_inuse_chunk(ms, p, nb);[m
[31m-    mem = chunk2mem(p);[m
[31m-    return mem;[m
[31m-  }[m
[31m-  return alloc_sys(ms, nb);[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE void *lj_alloc_free(void *msp, void *ptr)[m
[31m-{[m
[31m-  if (ptr != 0) {[m
[31m-    mchunkptr p = mem2chunk(ptr);[m
[31m-    mstate fm = (mstate)msp;[m
[31m-    size_t psize = chunksize(p);[m
[31m-    mchunkptr next = chunk_plus_offset(p, psize);[m
[31m-    if (!pinuse(p)) {[m
[31m-      size_t prevsize = p->prev_foot;[m
[31m-      if ((prevsize & IS_DIRECT_BIT) != 0) {[m
[31m-	prevsize &= ~IS_DIRECT_BIT;[m
[31m-	psize += prevsize + DIRECT_FOOT_PAD;[m
[31m-	CALL_MUNMAP((char *)p - prevsize, psize);[m
[31m-	return NULL;[m
[31m-      } else {[m
[31m-	mchunkptr prev = chunk_minus_offset(p, prevsize);[m
[31m-	psize += prevsize;[m
[31m-	p = prev;[m
[31m-	/* consolidate backward */[m
[31m-	if (p != fm->dv) {[m
[31m-	  unlink_chunk(fm, p, prevsize);[m
[31m-	} else if ((next->head & INUSE_BITS) == INUSE_BITS) {[m
[31m-	  fm->dvsize = psize;[m
[31m-	  set_free_with_pinuse(p, psize, next);[m
[31m-	  return NULL;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    if (!cinuse(next)) {  /* consolidate forward */[m
[31m-      if (next == fm->top) {[m
[31m-	size_t tsize = fm->topsize += psize;[m
[31m-	fm->top = p;[m
[31m-	p->head = tsize | PINUSE_BIT;[m
[31m-	if (p == fm->dv) {[m
[31m-	  fm->dv = 0;[m
[31m-	  fm->dvsize = 0;[m
[31m-	}[m
[31m-	if (tsize > fm->trim_check)[m
[31m-	  alloc_trim(fm, 0);[m
[31m-	return NULL;[m
[31m-      } else if (next == fm->dv) {[m
[31m-	size_t dsize = fm->dvsize += psize;[m
[31m-	fm->dv = p;[m
[31m-	set_size_and_pinuse_of_free_chunk(p, dsize);[m
[31m-	return NULL;[m
[31m-      } else {[m
[31m-	size_t nsize = chunksize(next);[m
[31m-	psize += nsize;[m
[31m-	unlink_chunk(fm, next, nsize);[m
[31m-	set_size_and_pinuse_of_free_chunk(p, psize);[m
[31m-	if (p == fm->dv) {[m
[31m-	  fm->dvsize = psize;[m
[31m-	  return NULL;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      set_free_with_pinuse(p, psize, next);[m
[31m-    }[m
[31m-[m
[31m-    if (is_small(psize)) {[m
[31m-      insert_small_chunk(fm, p, psize);[m
[31m-    } else {[m
[31m-      tchunkptr tp = (tchunkptr)p;[m
[31m-      insert_large_chunk(fm, tp, psize);[m
[31m-      if (--fm->release_checks == 0)[m
[31m-	release_unused_segments(fm);[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE void *lj_alloc_realloc(void *msp, void *ptr, size_t nsize)[m
[31m-{[m
[31m-  if (nsize >= MAX_REQUEST) {[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    mstate m = (mstate)msp;[m
[31m-    mchunkptr oldp = mem2chunk(ptr);[m
[31m-    size_t oldsize = chunksize(oldp);[m
[31m-    mchunkptr next = chunk_plus_offset(oldp, oldsize);[m
[31m-    mchunkptr newp = 0;[m
[31m-    size_t nb = request2size(nsize);[m
[31m-[m
[31m-    /* Try to either shrink or extend into top. Else malloc-copy-free */[m
[31m-    if (is_direct(oldp)) {[m
[31m-      newp = direct_resize(oldp, nb);  /* this may return NULL. */[m
[31m-    } else if (oldsize >= nb) { /* already big enough */[m
[31m-      size_t rsize = oldsize - nb;[m
[31m-      newp = oldp;[m
[31m-      if (rsize >= MIN_CHUNK_SIZE) {[m
[31m-	mchunkptr rem = chunk_plus_offset(newp, nb);[m
[31m-	set_inuse(m, newp, nb);[m
[31m-	set_inuse(m, rem, rsize);[m
[31m-	lj_alloc_free(m, chunk2mem(rem));[m
[31m-      }[m
[31m-    } else if (next == m->top && oldsize + m->topsize > nb) {[m
[31m-      /* Expand into top */[m
[31m-      size_t newsize = oldsize + m->topsize;[m
[31m-      size_t newtopsize = newsize - nb;[m
[31m-      mchunkptr newtop = chunk_plus_offset(oldp, nb);[m
[31m-      set_inuse(m, oldp, nb);[m
[31m-      newtop->head = newtopsize |PINUSE_BIT;[m
[31m-      m->top = newtop;[m
[31m-      m->topsize = newtopsize;[m
[31m-      newp = oldp;[m
[31m-    }[m
[31m-[m
[31m-    if (newp != 0) {[m
[31m-      return chunk2mem(newp);[m
[31m-    } else {[m
[31m-      void *newmem = lj_alloc_malloc(m, nsize);[m
[31m-      if (newmem != 0) {[m
[31m-	size_t oc = oldsize - overhead_for(oldp);[m
[31m-	memcpy(newmem, ptr, oc < nsize ? oc : nsize);[m
[31m-	lj_alloc_free(m, ptr);[m
[31m-      }[m
[31m-      return newmem;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void *lj_alloc_f(void *msp, void *ptr, size_t osize, size_t nsize)[m
[31m-{[m
[31m-  (void)osize;[m
[31m-  if (nsize == 0) {[m
[31m-    return lj_alloc_free(msp, ptr);[m
[31m-  } else if (ptr == NULL) {[m
[31m-    return lj_alloc_malloc(msp, nsize);[m
[31m-  } else {[m
[31m-    return lj_alloc_realloc(msp, ptr, nsize);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_alloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_alloc.h[m
[1mdeleted file mode 100644[m
[1mindex f87a7cf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_alloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-/*[m
[31m-** Bundled memory allocator.[m
[31m-** Donated to the public domain.[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_ALLOC_H[m
[31m-#define _LJ_ALLOC_H[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-[m
[31m-#ifndef LUAJIT_USE_SYSMALLOC[m
[31m-LJ_FUNC void *lj_alloc_create(void);[m
[31m-LJ_FUNC void lj_alloc_destroy(void *msp);[m
[31m-LJ_FUNC void *lj_alloc_f(void *msp, void *ptr, size_t osize, size_t nsize);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_api.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_api.c[m
[1mdeleted file mode 100644[m
[1mindex 0fbb925..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_api.c[m
[1m+++ /dev/null[m
[36m@@ -1,1213 +0,0 @@[m
[31m-/*[m
[31m-** Public Lua/C API.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_api_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_udata.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- Common helper functions --------------------------------------------- */[m
[31m-[m
[31m-#define api_checknelems(L, n)		api_check(L, (n) <= (L->top - L->base))[m
[31m-#define api_checkvalidindex(L, i)	api_check(L, (i) != niltv(L))[m
[31m-[m
[31m-static TValue *index2adr(lua_State *L, int idx)[m
[31m-{[m
[31m-  if (idx > 0) {[m
[31m-    TValue *o = L->base + (idx - 1);[m
[31m-    return o < L->top ? o : niltv(L);[m
[31m-  } else if (idx > LUA_REGISTRYINDEX) {[m
[31m-    api_check(L, idx != 0 && -idx <= L->top - L->base);[m
[31m-    return L->top + idx;[m
[31m-  } else if (idx == LUA_GLOBALSINDEX) {[m
[31m-    TValue *o = &G(L)->tmptv;[m
[31m-    settabV(L, o, tabref(L->env));[m
[31m-    return o;[m
[31m-  } else if (idx == LUA_REGISTRYINDEX) {[m
[31m-    return registry(L);[m
[31m-  } else {[m
[31m-    GCfunc *fn = curr_func(L);[m
[31m-    api_check(L, fn->c.gct == ~LJ_TFUNC && !isluafunc(fn));[m
[31m-    if (idx == LUA_ENVIRONINDEX) {[m
[31m-      TValue *o = &G(L)->tmptv;[m
[31m-      settabV(L, o, tabref(fn->c.env));[m
[31m-      return o;[m
[31m-    } else {[m
[31m-      idx = LUA_GLOBALSINDEX - idx;[m
[31m-      return idx <= fn->c.nupvalues ? &fn->c.upvalue[idx-1] : niltv(L);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static TValue *stkindex2adr(lua_State *L, int idx)[m
[31m-{[m
[31m-  if (idx > 0) {[m
[31m-    TValue *o = L->base + (idx - 1);[m
[31m-    return o < L->top ? o : niltv(L);[m
[31m-  } else {[m
[31m-    api_check(L, idx != 0 && -idx <= L->top - L->base);[m
[31m-    return L->top + idx;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static GCtab *getcurrenv(lua_State *L)[m
[31m-{[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  return fn->c.gct == ~LJ_TFUNC ? tabref(fn->c.env) : tabref(L->env);[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous API functions ----------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_status(lua_State *L)[m
[31m-{[m
[31m-  return L->status;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_checkstack(lua_State *L, int size)[m
[31m-{[m
[31m-  if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) {[m
[31m-    return 0;  /* Stack overflow. */[m
[31m-  } else if (size > 0) {[m
[31m-    lj_state_checkstack(L, (MSize)size);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_checkstack(lua_State *L, int size, const char *msg)[m
[31m-{[m
[31m-  if (!lua_checkstack(L, size))[m
[31m-    lj_err_callerv(L, LJ_ERR_STKOVM, msg);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_xmove(lua_State *from, lua_State *to, int n)[m
[31m-{[m
[31m-  TValue *f, *t;[m
[31m-  if (from == to) return;[m
[31m-  api_checknelems(from, n);[m
[31m-  api_check(from, G(from) == G(to));[m
[31m-  lj_state_checkstack(to, (MSize)n);[m
[31m-  f = from->top;[m
[31m-  t = to->top = to->top + n;[m
[31m-  while (--n >= 0) copyTV(to, --t, --f);[m
[31m-  from->top = f;[m
[31m-}[m
[31m-[m
[31m-/* -- Stack manipulation -------------------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_gettop(lua_State *L)[m
[31m-{[m
[31m-  return (int)(L->top - L->base);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_settop(lua_State *L, int idx)[m
[31m-{[m
[31m-  if (idx >= 0) {[m
[31m-    api_check(L, idx <= tvref(L->maxstack) - L->base);[m
[31m-    if (L->base + idx > L->top) {[m
[31m-      if (L->base + idx >= tvref(L->maxstack))[m
[31m-	lj_state_growstack(L, (MSize)idx - (MSize)(L->top - L->base));[m
[31m-      do { setnilV(L->top++); } while (L->top < L->base + idx);[m
[31m-    } else {[m
[31m-      L->top = L->base + idx;[m
[31m-    }[m
[31m-  } else {[m
[31m-    api_check(L, -(idx+1) <= (L->top - L->base));[m
[31m-    L->top += idx+1;  /* Shrinks top (idx < 0). */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_remove(lua_State *L, int idx)[m
[31m-{[m
[31m-  TValue *p = stkindex2adr(L, idx);[m
[31m-  api_checkvalidindex(L, p);[m
[31m-  while (++p < L->top) copyTV(L, p-1, p);[m
[31m-  L->top--;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_insert(lua_State *L, int idx)[m
[31m-{[m
[31m-  TValue *q, *p = stkindex2adr(L, idx);[m
[31m-  api_checkvalidindex(L, p);[m
[31m-  for (q = L->top; q > p; q--) copyTV(L, q, q-1);[m
[31m-  copyTV(L, p, L->top);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_replace(lua_State *L, int idx)[m
[31m-{[m
[31m-  api_checknelems(L, 1);[m
[31m-  if (idx == LUA_GLOBALSINDEX) {[m
[31m-    api_check(L, tvistab(L->top-1));[m
[31m-    /* NOBARRIER: A thread (i.e. L) is never black. */[m
[31m-    setgcref(L->env, obj2gco(tabV(L->top-1)));[m
[31m-  } else if (idx == LUA_ENVIRONINDEX) {[m
[31m-    GCfunc *fn = curr_func(L);[m
[31m-    if (fn->c.gct != ~LJ_TFUNC)[m
[31m-      lj_err_msg(L, LJ_ERR_NOENV);[m
[31m-    api_check(L, tvistab(L->top-1));[m
[31m-    setgcref(fn->c.env, obj2gco(tabV(L->top-1)));[m
[31m-    lj_gc_barrier(L, fn, L->top-1);[m
[31m-  } else {[m
[31m-    TValue *o = index2adr(L, idx);[m
[31m-    api_checkvalidindex(L, o);[m
[31m-    copyTV(L, o, L->top-1);[m
[31m-    if (idx < LUA_GLOBALSINDEX)  /* Need a barrier for upvalues. */[m
[31m-      lj_gc_barrier(L, curr_func(L), L->top-1);[m
[31m-  }[m
[31m-  L->top--;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushvalue(lua_State *L, int idx)[m
[31m-{[m
[31m-  copyTV(L, L->top, index2adr(L, idx));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-/* -- Stack getters ------------------------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_type(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  if (tvisnumber(o)) {[m
[31m-    return LUA_TNUMBER;[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-  } else if (tvislightud(o)) {[m
[31m-    return LUA_TLIGHTUSERDATA;[m
[31m-#endif[m
[31m-  } else if (o == niltv(L)) {[m
[31m-    return LUA_TNONE;[m
[31m-  } else {  /* Magic internal/external tag conversion. ORDER LJ_T */[m
[31m-    uint32_t t = ~itype(o);[m
[31m-#if LJ_64[m
[31m-    int tt = (int)((U64x(75a06,98042110) >> 4*t) & 15u);[m
[31m-#else[m
[31m-    int tt = (int)(((t < 8 ? 0x98042110u : 0x75a06u) >> 4*(t&7)) & 15u);[m
[31m-#endif[m
[31m-    lua_assert(tt != LUA_TNIL || tvisnil(o));[m
[31m-    return tt;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_checktype(lua_State *L, int idx, int tt)[m
[31m-{[m
[31m-  if (lua_type(L, idx) != tt)[m
[31m-    lj_err_argt(L, idx, tt);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_checkany(lua_State *L, int idx)[m
[31m-{[m
[31m-  if (index2adr(L, idx) == niltv(L))[m
[31m-    lj_err_arg(L, idx, LJ_ERR_NOVAL);[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_typename(lua_State *L, int t)[m
[31m-{[m
[31m-  UNUSED(L);[m
[31m-  return lj_obj_typename[t+1];[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_iscfunction(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return tvisfunc(o) && !isluafunc(funcV(o));[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_isnumber(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  return (tvisnumber(o) || (tvisstr(o) && lj_strscan_number(strV(o), &tmp)));[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_isstring(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return (tvisstr(o) || tvisnumber(o));[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_isuserdata(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return (tvisudata(o) || tvislightud(o));[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_rawequal(lua_State *L, int idx1, int idx2)[m
[31m-{[m
[31m-  cTValue *o1 = index2adr(L, idx1);[m
[31m-  cTValue *o2 = index2adr(L, idx2);[m
[31m-  return (o1 == niltv(L) || o2 == niltv(L)) ? 0 : lj_obj_equal(o1, o2);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_equal(lua_State *L, int idx1, int idx2)[m
[31m-{[m
[31m-  cTValue *o1 = index2adr(L, idx1);[m
[31m-  cTValue *o2 = index2adr(L, idx2);[m
[31m-  if (tvisint(o1) && tvisint(o2)) {[m
[31m-    return intV(o1) == intV(o2);[m
[31m-  } else if (tvisnumber(o1) && tvisnumber(o2)) {[m
[31m-    return numberVnum(o1) == numberVnum(o2);[m
[31m-  } else if (itype(o1) != itype(o2)) {[m
[31m-    return 0;[m
[31m-  } else if (tvispri(o1)) {[m
[31m-    return o1 != niltv(L) && o2 != niltv(L);[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-  } else if (tvislightud(o1)) {[m
[31m-    return o1->u64 == o2->u64;[m
[31m-#endif[m
[31m-  } else if (gcrefeq(o1->gcr, o2->gcr)) {[m
[31m-    return 1;[m
[31m-  } else if (!tvistabud(o1)) {[m
[31m-    return 0;[m
[31m-  } else {[m
[31m-    TValue *base = lj_meta_equal(L, gcV(o1), gcV(o2), 0);[m
[31m-    if ((uintptr_t)base <= 1) {[m
[31m-      return (int)(uintptr_t)base;[m
[31m-    } else {[m
[31m-      L->top = base+2;[m
[31m-      lj_vm_call(L, base, 1+1);[m
[31m-      L->top -= 2+LJ_FR2;[m
[31m-      return tvistruecond(L->top+1+LJ_FR2);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_lessthan(lua_State *L, int idx1, int idx2)[m
[31m-{[m
[31m-  cTValue *o1 = index2adr(L, idx1);[m
[31m-  cTValue *o2 = index2adr(L, idx2);[m
[31m-  if (o1 == niltv(L) || o2 == niltv(L)) {[m
[31m-    return 0;[m
[31m-  } else if (tvisint(o1) && tvisint(o2)) {[m
[31m-    return intV(o1) < intV(o2);[m
[31m-  } else if (tvisnumber(o1) && tvisnumber(o2)) {[m
[31m-    return numberVnum(o1) < numberVnum(o2);[m
[31m-  } else {[m
[31m-    TValue *base = lj_meta_comp(L, o1, o2, 0);[m
[31m-    if ((uintptr_t)base <= 1) {[m
[31m-      return (int)(uintptr_t)base;[m
[31m-    } else {[m
[31m-      L->top = base+2;[m
[31m-      lj_vm_call(L, base, 1+1);[m
[31m-      L->top -= 2+LJ_FR2;[m
[31m-      return tvistruecond(L->top+1+LJ_FR2);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_Number lua_tonumber(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  if (LJ_LIKELY(tvisnumber(o)))[m
[31m-    return numberVnum(o);[m
[31m-  else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp))[m
[31m-    return numV(&tmp);[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  if (LJ_LIKELY(tvisnumber(o)))[m
[31m-    return numberVnum(o);[m
[31m-  else if (!(tvisstr(o) && lj_strscan_num(strV(o), &tmp)))[m
[31m-    lj_err_argt(L, idx, LUA_TNUMBER);[m
[31m-  return numV(&tmp);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_Number luaL_optnumber(lua_State *L, int idx, lua_Number def)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  if (LJ_LIKELY(tvisnumber(o)))[m
[31m-    return numberVnum(o);[m
[31m-  else if (tvisnil(o))[m
[31m-    return def;[m
[31m-  else if (!(tvisstr(o) && lj_strscan_num(strV(o), &tmp)))[m
[31m-    lj_err_argt(L, idx, LUA_TNUMBER);[m
[31m-  return numV(&tmp);[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  lua_Number n;[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else if (LJ_LIKELY(tvisnum(o))) {[m
[31m-    n = numV(o);[m
[31m-  } else {[m
[31m-    if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))[m
[31m-      return 0;[m
[31m-    if (tvisint(&tmp))[m
[31m-      return (lua_Integer)intV(&tmp);[m
[31m-    n = numV(&tmp);[m
[31m-  }[m
[31m-#if LJ_64[m
[31m-  return (lua_Integer)n;[m
[31m-#else[m
[31m-  return lj_num2int(n);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  lua_Number n;[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else if (LJ_LIKELY(tvisnum(o))) {[m
[31m-    n = numV(o);[m
[31m-  } else {[m
[31m-    if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))[m
[31m-      lj_err_argt(L, idx, LUA_TNUMBER);[m
[31m-    if (tvisint(&tmp))[m
[31m-      return (lua_Integer)intV(&tmp);[m
[31m-    n = numV(&tmp);[m
[31m-  }[m
[31m-#if LJ_64[m
[31m-  return (lua_Integer)n;[m
[31m-#else[m
[31m-  return lj_num2int(n);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LUALIB_API lua_Integer luaL_optinteger(lua_State *L, int idx, lua_Integer def)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  TValue tmp;[m
[31m-  lua_Number n;[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else if (LJ_LIKELY(tvisnum(o))) {[m
[31m-    n = numV(o);[m
[31m-  } else if (tvisnil(o)) {[m
[31m-    return def;[m
[31m-  } else {[m
[31m-    if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))[m
[31m-      lj_err_argt(L, idx, LUA_TNUMBER);[m
[31m-    if (tvisint(&tmp))[m
[31m-      return (lua_Integer)intV(&tmp);[m
[31m-    n = numV(&tmp);[m
[31m-  }[m
[31m-#if LJ_64[m
[31m-  return (lua_Integer)n;[m
[31m-#else[m
[31m-  return lj_num2int(n);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_toboolean(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return tvistruecond(o);[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_tolstring(lua_State *L, int idx, size_t *len)[m
[31m-{[m
[31m-  TValue *o = index2adr(L, idx);[m
[31m-  GCstr *s;[m
[31m-  if (LJ_LIKELY(tvisstr(o))) {[m
[31m-    s = strV(o);[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    lj_gc_check(L);[m
[31m-    o = index2adr(L, idx);  /* GC may move the stack. */[m
[31m-    s = lj_strfmt_number(L, o);[m
[31m-    setstrV(L, o, s);[m
[31m-  } else {[m
[31m-    if (len != NULL) *len = 0;[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  if (len != NULL) *len = s->len;[m
[31m-  return strdata(s);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API const char *luaL_checklstring(lua_State *L, int idx, size_t *len)[m
[31m-{[m
[31m-  TValue *o = index2adr(L, idx);[m
[31m-  GCstr *s;[m
[31m-  if (LJ_LIKELY(tvisstr(o))) {[m
[31m-    s = strV(o);[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    lj_gc_check(L);[m
[31m-    o = index2adr(L, idx);  /* GC may move the stack. */[m
[31m-    s = lj_strfmt_number(L, o);[m
[31m-    setstrV(L, o, s);[m
[31m-  } else {[m
[31m-    lj_err_argt(L, idx, LUA_TSTRING);[m
[31m-  }[m
[31m-  if (len != NULL) *len = s->len;[m
[31m-  return strdata(s);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API const char *luaL_optlstring(lua_State *L, int idx,[m
[31m-				       const char *def, size_t *len)[m
[31m-{[m
[31m-  TValue *o = index2adr(L, idx);[m
[31m-  GCstr *s;[m
[31m-  if (LJ_LIKELY(tvisstr(o))) {[m
[31m-    s = strV(o);[m
[31m-  } else if (tvisnil(o)) {[m
[31m-    if (len != NULL) *len = def ? strlen(def) : 0;[m
[31m-    return def;[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    lj_gc_check(L);[m
[31m-    o = index2adr(L, idx);  /* GC may move the stack. */[m
[31m-    s = lj_strfmt_number(L, o);[m
[31m-    setstrV(L, o, s);[m
[31m-  } else {[m
[31m-    lj_err_argt(L, idx, LUA_TSTRING);[m
[31m-  }[m
[31m-  if (len != NULL) *len = s->len;[m
[31m-  return strdata(s);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_checkoption(lua_State *L, int idx, const char *def,[m
[31m-				const char *const lst[])[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  const char *s = lua_tolstring(L, idx, NULL);[m
[31m-  if (s == NULL && (s = def) == NULL)[m
[31m-    lj_err_argt(L, idx, LUA_TSTRING);[m
[31m-  for (i = 0; lst[i]; i++)[m
[31m-    if (strcmp(lst[i], s) == 0)[m
[31m-      return (int)i;[m
[31m-  lj_err_argv(L, idx, LJ_ERR_INVOPTM, s);[m
[31m-}[m
[31m-[m
[31m-LUA_API size_t lua_objlen(lua_State *L, int idx)[m
[31m-{[m
[31m-  TValue *o = index2adr(L, idx);[m
[31m-  if (tvisstr(o)) {[m
[31m-    return strV(o)->len;[m
[31m-  } else if (tvistab(o)) {[m
[31m-    return (size_t)lj_tab_len(tabV(o));[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    return udataV(o)->len;[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    GCstr *s = lj_strfmt_number(L, o);[m
[31m-    setstrV(L, o, s);[m
[31m-    return s->len;[m
[31m-  } else {[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_CFunction lua_tocfunction(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  if (tvisfunc(o)) {[m
[31m-    BCOp op = bc_op(*mref(funcV(o)->c.pc, BCIns));[m
[31m-    if (op == BC_FUNCC || op == BC_FUNCCW)[m
[31m-      return funcV(o)->c.f;[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-LUA_API void *lua_touserdata(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  if (tvisudata(o))[m
[31m-    return uddata(udataV(o));[m
[31m-  else if (tvislightud(o))[m
[31m-    return lightudV(o);[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_State *lua_tothread(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  return (!tvisthread(o)) ? NULL : threadV(o);[m
[31m-}[m
[31m-[m
[31m-LUA_API const void *lua_topointer(lua_State *L, int idx)[m
[31m-{[m
[31m-  return lj_obj_ptr(index2adr(L, idx));[m
[31m-}[m
[31m-[m
[31m-/* -- Stack setters (object creation) ------------------------------------- */[m
[31m-[m
[31m-LUA_API void lua_pushnil(lua_State *L)[m
[31m-{[m
[31m-  setnilV(L->top);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushnumber(lua_State *L, lua_Number n)[m
[31m-{[m
[31m-  setnumV(L->top, n);[m
[31m-  if (LJ_UNLIKELY(tvisnan(L->top)))[m
[31m-    setnanV(L->top);  /* Canonicalize injected NaNs. */[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushinteger(lua_State *L, lua_Integer n)[m
[31m-{[m
[31m-  setintptrV(L->top, n);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushlstring(lua_State *L, const char *str, size_t len)[m
[31m-{[m
[31m-  GCstr *s;[m
[31m-  lj_gc_check(L);[m
[31m-  s = lj_str_new(L, str, len);[m
[31m-  setstrV(L, L->top, s);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushstring(lua_State *L, const char *str)[m
[31m-{[m
[31m-  if (str == NULL) {[m
[31m-    setnilV(L->top);[m
[31m-  } else {[m
[31m-    GCstr *s;[m
[31m-    lj_gc_check(L);[m
[31m-    s = lj_str_newz(L, str);[m
[31m-    setstrV(L, L->top, s);[m
[31m-  }[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_pushvfstring(lua_State *L, const char *fmt,[m
[31m-				     va_list argp)[m
[31m-{[m
[31m-  lj_gc_check(L);[m
[31m-  return lj_strfmt_pushvf(L, fmt, argp);[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_pushfstring(lua_State *L, const char *fmt, ...)[m
[31m-{[m
[31m-  const char *ret;[m
[31m-  va_list argp;[m
[31m-  lj_gc_check(L);[m
[31m-  va_start(argp, fmt);[m
[31m-  ret = lj_strfmt_pushvf(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  return ret;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushcclosure(lua_State *L, lua_CFunction f, int n)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  lj_gc_check(L);[m
[31m-  api_checknelems(L, n);[m
[31m-  fn = lj_func_newC(L, (MSize)n, getcurrenv(L));[m
[31m-  fn->c.f = f;[m
[31m-  L->top -= n;[m
[31m-  while (n--)[m
[31m-    copyTV(L, &fn->c.upvalue[n], L->top+n);[m
[31m-  setfuncV(L, L->top, fn);[m
[31m-  lua_assert(iswhite(obj2gco(fn)));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushboolean(lua_State *L, int b)[m
[31m-{[m
[31m-  setboolV(L->top, (b != 0));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_pushlightuserdata(lua_State *L, void *p)[m
[31m-{[m
[31m-  setlightudV(L->top, checklightudptr(L, p));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_createtable(lua_State *L, int narray, int nrec)[m
[31m-{[m
[31m-  lj_gc_check(L);[m
[31m-  settabV(L, L->top, lj_tab_new_ah(L, narray, nrec));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_newmetatable(lua_State *L, const char *tname)[m
[31m-{[m
[31m-  GCtab *regt = tabV(registry(L));[m
[31m-  TValue *tv = lj_tab_setstr(L, regt, lj_str_newz(L, tname));[m
[31m-  if (tvisnil(tv)) {[m
[31m-    GCtab *mt = lj_tab_new(L, 0, 1);[m
[31m-    settabV(L, tv, mt);[m
[31m-    settabV(L, L->top++, mt);[m
[31m-    lj_gc_anybarriert(L, regt);[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    copyTV(L, L->top++, tv);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_pushthread(lua_State *L)[m
[31m-{[m
[31m-  setthreadV(L, L->top, L);[m
[31m-  incr_top(L);[m
[31m-  return (mainthread(G(L)) == L);[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_State *lua_newthread(lua_State *L)[m
[31m-{[m
[31m-  lua_State *L1;[m
[31m-  lj_gc_check(L);[m
[31m-  L1 = lj_state_new(L);[m
[31m-  setthreadV(L, L->top, L1);[m
[31m-  incr_top(L);[m
[31m-  return L1;[m
[31m-}[m
[31m-[m
[31m-LUA_API void *lua_newuserdata(lua_State *L, size_t size)[m
[31m-{[m
[31m-  GCudata *ud;[m
[31m-  lj_gc_check(L);[m
[31m-  if (size > LJ_MAX_UDATA)[m
[31m-    lj_err_msg(L, LJ_ERR_UDATAOV);[m
[31m-  ud = lj_udata_new(L, (MSize)size, getcurrenv(L));[m
[31m-  setudataV(L, L->top, ud);[m
[31m-  incr_top(L);[m
[31m-  return uddata(ud);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_concat(lua_State *L, int n)[m
[31m-{[m
[31m-  api_checknelems(L, n);[m
[31m-  if (n >= 2) {[m
[31m-    n--;[m
[31m-    do {[m
[31m-      TValue *top = lj_meta_cat(L, L->top-1, -n);[m
[31m-      if (top == NULL) {[m
[31m-	L->top -= n;[m
[31m-	break;[m
[31m-      }[m
[31m-      n -= (int)(L->top - top);[m
[31m-      L->top = top+2;[m
[31m-      lj_vm_call(L, top, 1+1);[m
[31m-      L->top -= 1+LJ_FR2;[m
[31m-      copyTV(L, L->top-1, L->top+LJ_FR2);[m
[31m-    } while (--n > 0);[m
[31m-  } else if (n == 0) {  /* Push empty string. */[m
[31m-    setstrV(L, L->top, &G(L)->strempty);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  /* else n == 1: nothing to do. */[m
[31m-}[m
[31m-[m
[31m-/* -- Object getters ------------------------------------------------------ */[m
[31m-[m
[31m-LUA_API void lua_gettable(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *v, *t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  v = lj_meta_tget(L, t, L->top-1);[m
[31m-  if (v == NULL) {[m
[31m-    L->top += 2;[m
[31m-    lj_vm_call(L, L->top-2, 1+1);[m
[31m-    L->top -= 2+LJ_FR2;[m
[31m-    v = L->top+1+LJ_FR2;[m
[31m-  }[m
[31m-  copyTV(L, L->top-1, v);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_getfield(lua_State *L, int idx, const char *k)[m
[31m-{[m
[31m-  cTValue *v, *t = index2adr(L, idx);[m
[31m-  TValue key;[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  setstrV(L, &key, lj_str_newz(L, k));[m
[31m-  v = lj_meta_tget(L, t, &key);[m
[31m-  if (v == NULL) {[m
[31m-    L->top += 2;[m
[31m-    lj_vm_call(L, L->top-2, 1+1);[m
[31m-    L->top -= 2+LJ_FR2;[m
[31m-    v = L->top+1+LJ_FR2;[m
[31m-  }[m
[31m-  copyTV(L, L->top, v);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_rawget(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *t = index2adr(L, idx);[m
[31m-  api_check(L, tvistab(t));[m
[31m-  copyTV(L, L->top-1, lj_tab_get(L, tabV(t), L->top-1));[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_rawgeti(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  cTValue *v, *t = index2adr(L, idx);[m
[31m-  api_check(L, tvistab(t));[m
[31m-  v = lj_tab_getint(tabV(t), n);[m
[31m-  if (v) {[m
[31m-    copyTV(L, L->top, v);[m
[31m-  } else {[m
[31m-    setnilV(L->top);[m
[31m-  }[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_getmetatable(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  GCtab *mt = NULL;[m
[31m-  if (tvistab(o))[m
[31m-    mt = tabref(tabV(o)->metatable);[m
[31m-  else if (tvisudata(o))[m
[31m-    mt = tabref(udataV(o)->metatable);[m
[31m-  else[m
[31m-    mt = tabref(basemt_obj(G(L), o));[m
[31m-  if (mt == NULL)[m
[31m-    return 0;[m
[31m-  settabV(L, L->top, mt);[m
[31m-  incr_top(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_getmetafield(lua_State *L, int idx, const char *field)[m
[31m-{[m
[31m-  if (lua_getmetatable(L, idx)) {[m
[31m-    cTValue *tv = lj_tab_getstr(tabV(L->top-1), lj_str_newz(L, field));[m
[31m-    if (tv && !tvisnil(tv)) {[m
[31m-      copyTV(L, L->top-1, tv);[m
[31m-      return 1;[m
[31m-    }[m
[31m-    L->top--;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_getfenv(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  if (tvisfunc(o)) {[m
[31m-    settabV(L, L->top, tabref(funcV(o)->c.env));[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    settabV(L, L->top, tabref(udataV(o)->env));[m
[31m-  } else if (tvisthread(o)) {[m
[31m-    settabV(L, L->top, tabref(threadV(o)->env));[m
[31m-  } else {[m
[31m-    setnilV(L->top);[m
[31m-  }[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_next(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *t = index2adr(L, idx);[m
[31m-  int more;[m
[31m-  api_check(L, tvistab(t));[m
[31m-  more = lj_tab_next(L, tabV(t), L->top-1);[m
[31m-  if (more) {[m
[31m-    incr_top(L);  /* Return new key and value slot. */[m
[31m-  } else {  /* End of traversal. */[m
[31m-    L->top--;  /* Remove key slot. */[m
[31m-  }[m
[31m-  return more;[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_getupvalue(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  TValue *val;[m
[31m-  const char *name = lj_debug_uvnamev(index2adr(L, idx), (uint32_t)(n-1), &val);[m
[31m-  if (name) {[m
[31m-    copyTV(L, L->top, val);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-LUA_API void *lua_upvalueid(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  GCfunc *fn = funcV(index2adr(L, idx));[m
[31m-  n--;[m
[31m-  api_check(L, (uint32_t)n < fn->l.nupvalues);[m
[31m-  return isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :[m
[31m-			 (void *)&fn->c.upvalue[n];[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_upvaluejoin(lua_State *L, int idx1, int n1, int idx2, int n2)[m
[31m-{[m
[31m-  GCfunc *fn1 = funcV(index2adr(L, idx1));[m
[31m-  GCfunc *fn2 = funcV(index2adr(L, idx2));[m
[31m-  n1--; n2--;[m
[31m-  api_check(L, isluafunc(fn1) && (uint32_t)n1 < fn1->l.nupvalues);[m
[31m-  api_check(L, isluafunc(fn2) && (uint32_t)n2 < fn2->l.nupvalues);[m
[31m-  setgcrefr(fn1->l.uvptr[n1], fn2->l.uvptr[n2]);[m
[31m-  lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1]));[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  if (tvisudata(o)) {[m
[31m-    GCudata *ud = udataV(o);[m
[31m-    cTValue *tv = lj_tab_getstr(tabV(registry(L)), lj_str_newz(L, tname));[m
[31m-    if (tv && tvistab(tv) && tabV(tv) == tabref(ud->metatable))[m
[31m-      return uddata(ud);[m
[31m-  }[m
[31m-  lj_err_argtype(L, idx, tname);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-/* -- Object setters ------------------------------------------------------ */[m
[31m-[m
[31m-LUA_API void lua_settable(lua_State *L, int idx)[m
[31m-{[m
[31m-  TValue *o;[m
[31m-  cTValue *t = index2adr(L, idx);[m
[31m-  api_checknelems(L, 2);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  o = lj_meta_tset(L, t, L->top-2);[m
[31m-  if (o) {[m
[31m-    /* NOBARRIER: lj_meta_tset ensures the table is not black. */[m
[31m-    L->top -= 2;[m
[31m-    copyTV(L, o, L->top+1);[m
[31m-  } else {[m
[31m-    TValue *base = L->top;[m
[31m-    copyTV(L, base+2, base-3-2*LJ_FR2);[m
[31m-    L->top = base+3;[m
[31m-    lj_vm_call(L, base, 0+1);[m
[31m-    L->top -= 3+LJ_FR2;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_setfield(lua_State *L, int idx, const char *k)[m
[31m-{[m
[31m-  TValue *o;[m
[31m-  TValue key;[m
[31m-  cTValue *t = index2adr(L, idx);[m
[31m-  api_checknelems(L, 1);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  setstrV(L, &key, lj_str_newz(L, k));[m
[31m-  o = lj_meta_tset(L, t, &key);[m
[31m-  if (o) {[m
[31m-    /* NOBARRIER: lj_meta_tset ensures the table is not black. */[m
[31m-    copyTV(L, o, --L->top);[m
[31m-  } else {[m
[31m-    TValue *base = L->top;[m
[31m-    copyTV(L, base+2, base-3-2*LJ_FR2);[m
[31m-    L->top = base+3;[m
[31m-    lj_vm_call(L, base, 0+1);[m
[31m-    L->top -= 2+LJ_FR2;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_rawset(lua_State *L, int idx)[m
[31m-{[m
[31m-  GCtab *t = tabV(index2adr(L, idx));[m
[31m-  TValue *dst, *key;[m
[31m-  api_checknelems(L, 2);[m
[31m-  key = L->top-2;[m
[31m-  dst = lj_tab_set(L, t, key);[m
[31m-  copyTV(L, dst, key+1);[m
[31m-  lj_gc_anybarriert(L, t);[m
[31m-  L->top = key;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_rawseti(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  GCtab *t = tabV(index2adr(L, idx));[m
[31m-  TValue *dst, *src;[m
[31m-  api_checknelems(L, 1);[m
[31m-  dst = lj_tab_setint(L, t, n);[m
[31m-  src = L->top-1;[m
[31m-  copyTV(L, dst, src);[m
[31m-  lj_gc_barriert(L, t, dst);[m
[31m-  L->top = src;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_setmetatable(lua_State *L, int idx)[m
[31m-{[m
[31m-  global_State *g;[m
[31m-  GCtab *mt;[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  api_checknelems(L, 1);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  if (tvisnil(L->top-1)) {[m
[31m-    mt = NULL;[m
[31m-  } else {[m
[31m-    api_check(L, tvistab(L->top-1));[m
[31m-    mt = tabV(L->top-1);[m
[31m-  }[m
[31m-  g = G(L);[m
[31m-  if (tvistab(o)) {[m
[31m-    setgcref(tabV(o)->metatable, obj2gco(mt));[m
[31m-    if (mt)[m
[31m-      lj_gc_objbarriert(L, tabV(o), mt);[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    setgcref(udataV(o)->metatable, obj2gco(mt));[m
[31m-    if (mt)[m
[31m-      lj_gc_objbarrier(L, udataV(o), mt);[m
[31m-  } else {[m
[31m-    /* Flush cache, since traces specialize to basemt. But not during __gc. */[m
[31m-    if (lj_trace_flushall(L))[m
[31m-      lj_err_caller(L, LJ_ERR_NOGCMM);[m
[31m-    if (tvisbool(o)) {[m
[31m-      /* NOBARRIER: basemt is a GC root. */[m
[31m-      setgcref(basemt_it(g, LJ_TTRUE), obj2gco(mt));[m
[31m-      setgcref(basemt_it(g, LJ_TFALSE), obj2gco(mt));[m
[31m-    } else {[m
[31m-      /* NOBARRIER: basemt is a GC root. */[m
[31m-      setgcref(basemt_obj(g, o), obj2gco(mt));[m
[31m-    }[m
[31m-  }[m
[31m-  L->top--;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_setfenv(lua_State *L, int idx)[m
[31m-{[m
[31m-  cTValue *o = index2adr(L, idx);[m
[31m-  GCtab *t;[m
[31m-  api_checknelems(L, 1);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  api_check(L, tvistab(L->top-1));[m
[31m-  t = tabV(L->top-1);[m
[31m-  if (tvisfunc(o)) {[m
[31m-    setgcref(funcV(o)->c.env, obj2gco(t));[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    setgcref(udataV(o)->env, obj2gco(t));[m
[31m-  } else if (tvisthread(o)) {[m
[31m-    setgcref(threadV(o)->env, obj2gco(t));[m
[31m-  } else {[m
[31m-    L->top--;[m
[31m-    return 0;[m
[31m-  }[m
[31m-  lj_gc_objbarrier(L, gcV(o), t);[m
[31m-  L->top--;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_setupvalue(lua_State *L, int idx, int n)[m
[31m-{[m
[31m-  cTValue *f = index2adr(L, idx);[m
[31m-  TValue *val;[m
[31m-  const char *name;[m
[31m-  api_checknelems(L, 1);[m
[31m-  name = lj_debug_uvnamev(f, (uint32_t)(n-1), &val);[m
[31m-  if (name) {[m
[31m-    L->top--;[m
[31m-    copyTV(L, val, L->top);[m
[31m-    lj_gc_barrier(L, funcV(f), L->top);[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_FR2[m
[31m-static TValue *api_call_base(lua_State *L, int nargs)[m
[31m-{[m
[31m-  TValue *o = L->top, *base = o - nargs;[m
[31m-  L->top = o+1;[m
[31m-  for (; o > base; o--) copyTV(L, o, o-1);[m
[31m-  setnilV(o);[m
[31m-  return o+1;[m
[31m-}[m
[31m-#else[m
[31m-#define api_call_base(L, nargs)	(L->top - (nargs))[m
[31m-#endif[m
[31m-[m
[31m-LUA_API void lua_call(lua_State *L, int nargs, int nresults)[m
[31m-{[m
[31m-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);[m
[31m-  api_checknelems(L, nargs+1);[m
[31m-  lj_vm_call(L, api_call_base(L, nargs), nresults+1);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_pcall(lua_State *L, int nargs, int nresults, int errfunc)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  uint8_t oldh = hook_save(g);[m
[31m-  ptrdiff_t ef;[m
[31m-  int status;[m
[31m-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);[m
[31m-  api_checknelems(L, nargs+1);[m
[31m-  if (errfunc == 0) {[m
[31m-    ef = 0;[m
[31m-  } else {[m
[31m-    cTValue *o = stkindex2adr(L, errfunc);[m
[31m-    api_checkvalidindex(L, o);[m
[31m-    ef = savestack(L, o);[m
[31m-  }[m
[31m-  status = lj_vm_pcall(L, api_call_base(L, nargs), nresults+1, ef);[m
[31m-  if (status) hook_restore(g, oldh);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-static TValue *cpcall(lua_State *L, lua_CFunction func, void *ud)[m
[31m-{[m
[31m-  GCfunc *fn = lj_func_newC(L, 0, getcurrenv(L));[m
[31m-  TValue *top = L->top;[m
[31m-  fn->c.f = func;[m
[31m-  setfuncV(L, top++, fn);[m
[31m-  if (LJ_FR2) setnilV(top++);[m
[31m-  setlightudV(top++, checklightudptr(L, ud));[m
[31m-  cframe_nres(L->cframe) = 1+0;  /* Zero results. */[m
[31m-  L->top = top;[m
[31m-  return top-1;  /* Now call the newly allocated C function. */[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  uint8_t oldh = hook_save(g);[m
[31m-  int status;[m
[31m-  api_check(L, L->status == 0 || L->status == LUA_ERRERR);[m
[31m-  status = lj_vm_cpcall(L, func, ud, cpcall);[m
[31m-  if (status) hook_restore(g, oldh);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_callmeta(lua_State *L, int idx, const char *field)[m
[31m-{[m
[31m-  if (luaL_getmetafield(L, idx, field)) {[m
[31m-    TValue *top = L->top--;[m
[31m-    if (LJ_FR2) setnilV(top++);[m
[31m-    copyTV(L, top++, index2adr(L, idx));[m
[31m-    L->top = top;[m
[31m-    lj_vm_call(L, top-1, 1+1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Coroutine yield and resume ------------------------------------------ */[m
[31m-[m
[31m-LUA_API int lua_yield(lua_State *L, int nresults)[m
[31m-{[m
[31m-  void *cf = L->cframe;[m
[31m-  global_State *g = G(L);[m
[31m-  if (cframe_canyield(cf)) {[m
[31m-    cf = cframe_raw(cf);[m
[31m-    if (!hook_active(g)) {  /* Regular yield: move results down if needed. */[m
[31m-      cTValue *f = L->top - nresults;[m
[31m-      if (f > L->base) {[m
[31m-	TValue *t = L->base;[m
[31m-	while (--nresults >= 0) copyTV(L, t++, f++);[m
[31m-	L->top = t;[m
[31m-      }[m
[31m-      L->cframe = NULL;[m
[31m-      L->status = LUA_YIELD;[m
[31m-      return -1;[m
[31m-    } else {  /* Yield from hook: add a pseudo-frame. */[m
[31m-      TValue *top = L->top;[m
[31m-      hook_leave(g);[m
[31m-      (top++)->u64 = cframe_multres(cf);[m
[31m-      setcont(top, lj_cont_hook);[m
[31m-      if (LJ_FR2) top++;[m
[31m-      setframe_pc(top, cframe_pc(cf)-1);[m
[31m-      if (LJ_FR2) top++;[m
[31m-      setframe_gc(top, obj2gco(L), LJ_TTHREAD);[m
[31m-      setframe_ftsz(top, ((char *)(top+1)-(char *)L->base)+FRAME_CONT);[m
[31m-      L->top = L->base = top+1;[m
[31m-#if LJ_TARGET_X64[m
[31m-      lj_err_throw(L, LUA_YIELD);[m
[31m-#else[m
[31m-      L->cframe = NULL;[m
[31m-      L->status = LUA_YIELD;[m
[31m-      lj_vm_unwind_c(cf, LUA_YIELD);[m
[31m-#endif[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_msg(L, LJ_ERR_CYIELD);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_resume(lua_State *L, int nargs)[m
[31m-{[m
[31m-  if (L->cframe == NULL && L->status <= LUA_YIELD)[m
[31m-    return lj_vm_resume(L,[m
[31m-      L->status == 0 ? api_call_base(L, nargs) : L->top - nargs,[m
[31m-      0, 0);[m
[31m-  L->top = L->base;[m
[31m-  setstrV(L, L->top, lj_err_str(L, LJ_ERR_COSUSP));[m
[31m-  incr_top(L);[m
[31m-  return LUA_ERRRUN;[m
[31m-}[m
[31m-[m
[31m-/* -- GC and memory management -------------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_gc(lua_State *L, int what, int data)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  int res = 0;[m
[31m-  switch (what) {[m
[31m-  case LUA_GCSTOP:[m
[31m-    g->gc.threshold = LJ_MAX_MEM;[m
[31m-    break;[m
[31m-  case LUA_GCRESTART:[m
[31m-    g->gc.threshold = data == -1 ? (g->gc.total/100)*g->gc.pause : g->gc.total;[m
[31m-    break;[m
[31m-  case LUA_GCCOLLECT:[m
[31m-    lj_gc_fullgc(L);[m
[31m-    break;[m
[31m-  case LUA_GCCOUNT:[m
[31m-    res = (int)(g->gc.total >> 10);[m
[31m-    break;[m
[31m-  case LUA_GCCOUNTB:[m
[31m-    res = (int)(g->gc.total & 0x3ff);[m
[31m-    break;[m
[31m-  case LUA_GCSTEP: {[m
[31m-    GCSize a = (GCSize)data << 10;[m
[31m-    g->gc.threshold = (a <= g->gc.total) ? (g->gc.total - a) : 0;[m
[31m-    while (g->gc.total >= g->gc.threshold)[m
[31m-      if (lj_gc_step(L) > 0) {[m
[31m-	res = 1;[m
[31m-	break;[m
[31m-      }[m
[31m-    break;[m
[31m-  }[m
[31m-  case LUA_GCSETPAUSE:[m
[31m-    res = (int)(g->gc.pause);[m
[31m-    g->gc.pause = (MSize)data;[m
[31m-    break;[m
[31m-  case LUA_GCSETSTEPMUL:[m
[31m-    res = (int)(g->gc.stepmul);[m
[31m-    g->gc.stepmul = (MSize)data;[m
[31m-    break;[m
[31m-  case LUA_GCISRUNNING:[m
[31m-    res = (g->gc.threshold != LJ_MAX_MEM);[m
[31m-    break;[m
[31m-  default:[m
[31m-    res = -1;  /* Invalid option. */[m
[31m-  }[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_Alloc lua_getallocf(lua_State *L, void **ud)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  if (ud) *ud = g->allocd;[m
[31m-  return g->allocf;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_setallocf(lua_State *L, lua_Alloc f, void *ud)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  g->allocd = ud;[m
[31m-  g->allocf = f;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_arch.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_arch.h[m
[1mdeleted file mode 100644[m
[1mindex b7105a9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_arch.h[m
[1m+++ /dev/null[m
[36m@@ -1,538 +0,0 @@[m
[31m-/*[m
[31m-** Target architecture selection.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_ARCH_H[m
[31m-#define _LJ_ARCH_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-/* Target endianess. */[m
[31m-#define LUAJIT_LE	0[m
[31m-#define LUAJIT_BE	1[m
[31m-[m
[31m-/* Target architectures. */[m
[31m-#define LUAJIT_ARCH_X86		1[m
[31m-#define LUAJIT_ARCH_x86		1[m
[31m-#define LUAJIT_ARCH_X64		2[m
[31m-#define LUAJIT_ARCH_x64		2[m
[31m-#define LUAJIT_ARCH_ARM		3[m
[31m-#define LUAJIT_ARCH_arm		3[m
[31m-#define LUAJIT_ARCH_ARM64	4[m
[31m-#define LUAJIT_ARCH_arm64	4[m
[31m-#define LUAJIT_ARCH_PPC		5[m
[31m-#define LUAJIT_ARCH_ppc		5[m
[31m-#define LUAJIT_ARCH_MIPS	6[m
[31m-#define LUAJIT_ARCH_mips	6[m
[31m-[m
[31m-/* Target OS. */[m
[31m-#define LUAJIT_OS_OTHER		0[m
[31m-#define LUAJIT_OS_WINDOWS	1[m
[31m-#define LUAJIT_OS_LINUX		2[m
[31m-#define LUAJIT_OS_OSX		3[m
[31m-#define LUAJIT_OS_BSD		4[m
[31m-#define LUAJIT_OS_POSIX		5[m
[31m-[m
[31m-/* Select native target if no target defined. */[m
[31m-#ifndef LUAJIT_TARGET[m
[31m-[m
[31m-#if defined(__i386) || defined(__i386__) || defined(_M_IX86)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_X86[m
[31m-#elif defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_X64[m
[31m-#elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_ARM[m
[31m-#elif defined(__aarch64__)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_ARM64[m
[31m-#elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_PPC[m
[31m-#elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS)[m
[31m-#define LUAJIT_TARGET	LUAJIT_ARCH_MIPS[m
[31m-#else[m
[31m-#error "No support for this architecture (yet)"[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Select native OS if no target OS defined. */[m
[31m-#ifndef LUAJIT_OS[m
[31m-[m
[31m-#if defined(_WIN32) && !defined(_XBOX_VER)[m
[31m-#define LUAJIT_OS	LUAJIT_OS_WINDOWS[m
[31m-#elif defined(__linux__)[m
[31m-#define LUAJIT_OS	LUAJIT_OS_LINUX[m
[31m-#elif defined(__MACH__) && defined(__APPLE__)[m
[31m-#define LUAJIT_OS	LUAJIT_OS_OSX[m
[31m-#elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \[m
[31m-       defined(__NetBSD__) || defined(__OpenBSD__) || \[m
[31m-       defined(__DragonFly__)) && !defined(__ORBIS__)[m
[31m-#define LUAJIT_OS	LUAJIT_OS_BSD[m
[31m-#elif (defined(__sun__) && defined(__svr4__))[m
[31m-#define LUAJIT_OS	LUAJIT_OS_POSIX[m
[31m-#elif defined(__CYGWIN__)[m
[31m-#define LJ_TARGET_CYGWIN	1[m
[31m-#define LUAJIT_OS	LUAJIT_OS_POSIX[m
[31m-#else[m
[31m-#define LUAJIT_OS	LUAJIT_OS_OTHER[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Set target OS properties. */[m
[31m-#if LUAJIT_OS == LUAJIT_OS_WINDOWS[m
[31m-#define LJ_OS_NAME	"Windows"[m
[31m-#elif LUAJIT_OS == LUAJIT_OS_LINUX[m
[31m-#define LJ_OS_NAME	"Linux"[m
[31m-#elif LUAJIT_OS == LUAJIT_OS_OSX[m
[31m-#define LJ_OS_NAME	"OSX"[m
[31m-#elif LUAJIT_OS == LUAJIT_OS_BSD[m
[31m-#define LJ_OS_NAME	"BSD"[m
[31m-#elif LUAJIT_OS == LUAJIT_OS_POSIX[m
[31m-#define LJ_OS_NAME	"POSIX"[m
[31m-#else[m
[31m-#define LJ_OS_NAME	"Other"[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_TARGET_WINDOWS	(LUAJIT_OS == LUAJIT_OS_WINDOWS)[m
[31m-#define LJ_TARGET_LINUX		(LUAJIT_OS == LUAJIT_OS_LINUX)[m
[31m-#define LJ_TARGET_OSX		(LUAJIT_OS == LUAJIT_OS_OSX)[m
[31m-#define LJ_TARGET_IOS		(LJ_TARGET_OSX && (LUAJIT_TARGET == LUAJIT_ARCH_ARM || LUAJIT_TARGET == LUAJIT_ARCH_ARM64))[m
[31m-#define LJ_TARGET_POSIX		(LUAJIT_OS > LUAJIT_OS_WINDOWS)[m
[31m-#define LJ_TARGET_DLOPEN	LJ_TARGET_POSIX[m
[31m-[m
[31m-#ifdef __CELLOS_LV2__[m
[31m-#define LJ_TARGET_PS3		1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#endif[m
[31m-[m
[31m-#ifdef __ORBIS__[m
[31m-#define LJ_TARGET_PS4		1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#undef NULL[m
[31m-#define NULL ((void*)0)[m
[31m-#endif[m
[31m-[m
[31m-#ifdef __psp2__[m
[31m-#define LJ_TARGET_PSVITA	1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#endif[m
[31m-[m
[31m-#if _XBOX_VER >= 200[m
[31m-#define LJ_TARGET_XBOX360	1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#endif[m
[31m-[m
[31m-#ifdef _DURANGO[m
[31m-#define LJ_TARGET_XBOXONE	1[m
[31m-#define LJ_TARGET_CONSOLE	1[m
[31m-#define LJ_TARGET_GC64		1[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_NUMMODE_SINGLE	0	/* Single-number mode only. */[m
[31m-#define LJ_NUMMODE_SINGLE_DUAL	1	/* Default to single-number mode. */[m
[31m-#define LJ_NUMMODE_DUAL		2	/* Dual-number mode only. */[m
[31m-#define LJ_NUMMODE_DUAL_SINGLE	3	/* Default to dual-number mode. */[m
[31m-[m
[31m-/* Set target architecture properties. */[m
[31m-#if LUAJIT_TARGET == LUAJIT_ARCH_X86[m
[31m-[m
[31m-#define LJ_ARCH_NAME		"x86"[m
[31m-#define LJ_ARCH_BITS		32[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN[m
[31m-#define LJ_ABI_WIN		1[m
[31m-#else[m
[31m-#define LJ_ABI_WIN		0[m
[31m-#endif[m
[31m-#define LJ_TARGET_X86		1[m
[31m-#define LJ_TARGET_X86ORX64	1[m
[31m-#define LJ_TARGET_EHRETREG	0[m
[31m-#define LJ_TARGET_MASKSHIFT	1[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNALIGNED	1[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_SINGLE_DUAL[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_X64[m
[31m-[m
[31m-#define LJ_ARCH_NAME		"x64"[m
[31m-#define LJ_ARCH_BITS		64[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN[m
[31m-#define LJ_ABI_WIN		1[m
[31m-#else[m
[31m-#define LJ_ABI_WIN		0[m
[31m-#endif[m
[31m-#define LJ_TARGET_X64		1[m
[31m-#define LJ_TARGET_X86ORX64	1[m
[31m-#define LJ_TARGET_EHRETREG	0[m
[31m-#define LJ_TARGET_JUMPRANGE	31	/* +-2^31 = +-2GB */[m
[31m-#define LJ_TARGET_MASKSHIFT	1[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNALIGNED	1[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_SINGLE_DUAL[m
[31m-#ifdef LUAJIT_ENABLE_GC64[m
[31m-#define LJ_TARGET_GC64		1[m
[31m-#endif[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM[m
[31m-[m
[31m-#define LJ_ARCH_NAME		"arm"[m
[31m-#define LJ_ARCH_BITS		32[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#if !defined(LJ_ARCH_HASFPU) && __SOFTFP__[m
[31m-#define LJ_ARCH_HASFPU		0[m
[31m-#endif[m
[31m-#if !defined(LJ_ABI_SOFTFP) && !__ARM_PCS_VFP[m
[31m-#define LJ_ABI_SOFTFP		1[m
[31m-#endif[m
[31m-#define LJ_ABI_EABI		1[m
[31m-#define LJ_TARGET_ARM		1[m
[31m-#define LJ_TARGET_EHRETREG	0[m
[31m-#define LJ_TARGET_JUMPRANGE	25	/* +-2^25 = +-32MB */[m
[31m-#define LJ_TARGET_MASKSHIFT	0[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL[m
[31m-[m
[31m-#if __ARM_ARCH____ARM_ARCH_8__ || __ARM_ARCH_8A__[m
[31m-#define LJ_ARCH_VERSION		80[m
[31m-#elif __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__[m
[31m-#define LJ_ARCH_VERSION		70[m
[31m-#elif __ARM_ARCH_6T2__[m
[31m-#define LJ_ARCH_VERSION		61[m
[31m-#elif __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__[m
[31m-#define LJ_ARCH_VERSION		60[m
[31m-#else[m
[31m-#define LJ_ARCH_VERSION		50[m
[31m-#endif[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM64[m
[31m-[m
[31m-#define LJ_ARCH_NAME		"arm64"[m
[31m-#define LJ_ARCH_BITS		64[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#define LJ_TARGET_ARM64		1[m
[31m-#define LJ_TARGET_EHRETREG	0[m
[31m-#define LJ_TARGET_JUMPRANGE	27	/* +-2^27 = +-128MB */[m
[31m-#define LJ_TARGET_MASKSHIFT	1[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */[m
[31m-#define LJ_TARGET_GC64		1[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL[m
[31m-#define LJ_ARCH_NOJIT		1	/* NYI */[m
[31m-[m
[31m-#define LJ_ARCH_VERSION		80[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_PPC[m
[31m-[m
[31m-#ifndef LJ_ARCH_ENDIAN[m
[31m-#if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#else[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_BE[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if _LP64[m
[31m-#define LJ_ARCH_BITS		64[m
[31m-#if LJ_ARCH_ENDIAN == LUAJIT_LE[m
[31m-#define LJ_ARCH_NAME		"ppc64le"[m
[31m-#else[m
[31m-#define LJ_ARCH_NAME		"ppc64"[m
[31m-#endif[m
[31m-#else[m
[31m-#define LJ_ARCH_BITS		32[m
[31m-#define LJ_ARCH_NAME		"ppc"[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_TARGET_PPC		1[m
[31m-#define LJ_TARGET_EHRETREG	3[m
[31m-#define LJ_TARGET_JUMPRANGE	25	/* +-2^25 = +-32MB */[m
[31m-#define LJ_TARGET_MASKSHIFT	0[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNIFYROT	1	/* Want only IR_BROL. */[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL_SINGLE[m
[31m-[m
[31m-#if LJ_TARGET_CONSOLE[m
[31m-#define LJ_ARCH_PPC32ON64	1[m
[31m-#define LJ_ARCH_NOFFI		1[m
[31m-#elif LJ_ARCH_BITS == 64[m
[31m-#define LJ_ARCH_PPC64		1[m
[31m-#define LJ_TARGET_GC64		1[m
[31m-#define LJ_ARCH_NOJIT		1	/* NYI */[m
[31m-#endif[m
[31m-[m
[31m-#if _ARCH_PWR7[m
[31m-#define LJ_ARCH_VERSION		70[m
[31m-#elif _ARCH_PWR6[m
[31m-#define LJ_ARCH_VERSION		60[m
[31m-#elif _ARCH_PWR5X[m
[31m-#define LJ_ARCH_VERSION		51[m
[31m-#elif _ARCH_PWR5[m
[31m-#define LJ_ARCH_VERSION		50[m
[31m-#elif _ARCH_PWR4[m
[31m-#define LJ_ARCH_VERSION		40[m
[31m-#else[m
[31m-#define LJ_ARCH_VERSION		0[m
[31m-#endif[m
[31m-#if _ARCH_PPCSQ[m
[31m-#define LJ_ARCH_SQRT		1[m
[31m-#endif[m
[31m-#if _ARCH_PWR5X[m
[31m-#define LJ_ARCH_ROUND		1[m
[31m-#endif[m
[31m-#if __PPU__[m
[31m-#define LJ_ARCH_CELL		1[m
[31m-#endif[m
[31m-#if LJ_TARGET_XBOX360[m
[31m-#define LJ_ARCH_XENON		1[m
[31m-#endif[m
[31m-[m
[31m-#elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS[m
[31m-[m
[31m-#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL)[m
[31m-#define LJ_ARCH_NAME		"mipsel"[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_LE[m
[31m-#else[m
[31m-#define LJ_ARCH_NAME		"mips"[m
[31m-#define LJ_ARCH_ENDIAN		LUAJIT_BE[m
[31m-#endif[m
[31m-[m
[31m-#if !defined(LJ_ARCH_HASFPU)[m
[31m-#ifdef __mips_soft_float[m
[31m-#define LJ_ARCH_HASFPU		0[m
[31m-#else[m
[31m-#define LJ_ARCH_HASFPU		1[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Temporarily disable features until the code has been merged. */[m
[31m-#if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__[m
[31m-#define LUAJIT_NO_UNWIND	1[m
[31m-#endif[m
[31m-[m
[31m-#if !defined(LJ_ABI_SOFTFP)[m
[31m-#ifdef __mips_soft_float[m
[31m-#define LJ_ABI_SOFTFP		1[m
[31m-#else[m
[31m-#define LJ_ABI_SOFTFP		0[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_ARCH_BITS		32[m
[31m-#define LJ_TARGET_MIPS		1[m
[31m-#define LJ_TARGET_EHRETREG	4[m
[31m-#define LJ_TARGET_JUMPRANGE	27	/* 2*2^27 = 256MB-aligned region */[m
[31m-#define LJ_TARGET_MASKSHIFT	1[m
[31m-#define LJ_TARGET_MASKROT	1[m
[31m-#define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */[m
[31m-#define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL[m
[31m-[m
[31m-#if _MIPS_ARCH_MIPS32R2[m
[31m-#define LJ_ARCH_VERSION		20[m
[31m-#else[m
[31m-#define LJ_ARCH_VERSION		10[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-#error "No target architecture defined"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef LJ_PAGESIZE[m
[31m-#define LJ_PAGESIZE		4096[m
[31m-#endif[m
[31m-[m
[31m-/* Check for minimum required compiler versions. */[m
[31m-#if defined(__GNUC__)[m
[31m-#if LJ_TARGET_X86[m
[31m-#if (__GNUC__ < 3) || ((__GNUC__ == 3) && __GNUC_MINOR__ < 4)[m
[31m-#error "Need at least GCC 3.4 or newer"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_X64[m
[31m-#if 0 && __GNUC__ < 4[m
[31m-#error "Need at least GCC 4.0 or newer"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)[m
[31m-#error "Need at least GCC 4.2 or newer"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#if __clang__[m
[31m-#if (__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)[m
[31m-#error "Need at least Clang 3.5 or newer"[m
[31m-#endif[m
[31m-#else[m
[31m-#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 8)[m
[31m-#error "Need at least GCC 4.8 or newer"[m
[31m-#endif[m
[31m-#endif[m
[31m-#elif !LJ_TARGET_PS3[m
[31m-#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3)[m
[31m-#error "Need at least GCC 4.3 or newer"[m
[31m-#endif[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Check target-specific constraints. */[m
[31m-#ifndef _BUILDVM_H[m
[31m-#if LJ_TARGET_X64[m
[31m-#if __USING_SJLJ_EXCEPTIONS__[m
[31m-#error "Need a C compiler with native exception handling on x64"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#if defined(__ARMEB__)[m
[31m-#error "No support for big-endian ARM"[m
[31m-#endif[m
[31m-#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__[m
[31m-#error "No support for Cortex-M CPUs"[m
[31m-#endif[m
[31m-#if !(__ARM_EABI__ || LJ_TARGET_IOS)[m
[31m-#error "Only ARM EABI or iOS 3.0+ ABI is supported"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#if defined(__AARCH64EB__)[m
[31m-#error "No support for big-endian ARM64"[m
[31m-#endif[m
[31m-#if defined(_ILP32)[m
[31m-#error "No support for ILP32 model on ARM64"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE)[m
[31m-#error "No support for PowerPC CPUs without double-precision FPU"[m
[31m-#endif[m
[31m-#if !LJ_ARCH_PPC64 && LJ_ARCH_ENDIAN == LUAJIT_LE[m
[31m-#error "No support for little-endian PPC32"[m
[31m-#endif[m
[31m-#if LJ_ARCH_PPC64[m
[31m-#error "No support for PowerPC 64 bit mode (yet)"[m
[31m-#endif[m
[31m-#ifdef __NO_FPRS__[m
[31m-#error "No support for PPC/e500 anymore (use LuaJIT 2.0)"[m
[31m-#endif[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#if defined(_LP64)[m
[31m-#error "No support for MIPS64"[m
[31m-#endif[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Enable or disable the dual-number mode for the VM. */[m
[31m-#if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \[m
[31m-    (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL && LUAJIT_NUMMODE == 1)[m
[31m-#error "No support for this number mode on this architecture"[m
[31m-#endif[m
[31m-#if LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL || \[m
[31m-    (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL_SINGLE && LUAJIT_NUMMODE != 1) || \[m
[31m-    (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE_DUAL && LUAJIT_NUMMODE == 2)[m
[31m-#define LJ_DUALNUM		1[m
[31m-#else[m
[31m-#define LJ_DUALNUM		0[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_IOS || LJ_TARGET_CONSOLE[m
[31m-/* Runtime code generation is restricted on iOS. Complain to Apple, not me. */[m
[31m-/* Ditto for the consoles. Complain to Sony or MS, not me. */[m
[31m-#ifndef LUAJIT_ENABLE_JIT[m
[31m-#define LJ_OS_NOJIT		1[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* 64 bit GC references. */[m
[31m-#if LJ_TARGET_GC64[m
[31m-#define LJ_GC64			1[m
[31m-#else[m
[31m-#define LJ_GC64			0[m
[31m-#endif[m
[31m-[m
[31m-/* 2-slot frame info. */[m
[31m-#if LJ_GC64[m
[31m-#define LJ_FR2			1[m
[31m-#else[m
[31m-#define LJ_FR2			0[m
[31m-#endif[m
[31m-[m
[31m-/* Disable or enable the JIT compiler. */[m
[31m-#if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) || LJ_FR2 || LJ_GC64[m
[31m-#define LJ_HASJIT		0[m
[31m-#else[m
[31m-#define LJ_HASJIT		1[m
[31m-#endif[m
[31m-[m
[31m-/* Disable or enable the FFI extension. */[m
[31m-#if defined(LUAJIT_DISABLE_FFI) || defined(LJ_ARCH_NOFFI)[m
[31m-#define LJ_HASFFI		0[m
[31m-#else[m
[31m-#define LJ_HASFFI		1[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUAJIT_DISABLE_PROFILE)[m
[31m-#define LJ_HASPROFILE		0[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-#define LJ_HASPROFILE		1[m
[31m-#define LJ_PROFILE_SIGPROF	1[m
[31m-#elif LJ_TARGET_PS3[m
[31m-#define LJ_HASPROFILE		1[m
[31m-#define LJ_PROFILE_PTHREAD	1[m
[31m-#elif LJ_TARGET_WINDOWS || LJ_TARGET_XBOX360[m
[31m-#define LJ_HASPROFILE		1[m
[31m-#define LJ_PROFILE_WTHREAD	1[m
[31m-#else[m
[31m-#define LJ_HASPROFILE		0[m
[31m-#endif[m
[31m-[m
[31m-#ifndef LJ_ARCH_HASFPU[m
[31m-#define LJ_ARCH_HASFPU		1[m
[31m-#endif[m
[31m-#ifndef LJ_ABI_SOFTFP[m
[31m-#define LJ_ABI_SOFTFP		0[m
[31m-#endif[m
[31m-#define LJ_SOFTFP		(!LJ_ARCH_HASFPU)[m
[31m-[m
[31m-#if LJ_ARCH_ENDIAN == LUAJIT_BE[m
[31m-#define LJ_LE			0[m
[31m-#define LJ_BE			1[m
[31m-#define LJ_ENDIAN_SELECT(le, be)	be[m
[31m-#define LJ_ENDIAN_LOHI(lo, hi)		hi lo[m
[31m-#else[m
[31m-#define LJ_LE			1[m
[31m-#define LJ_BE			0[m
[31m-#define LJ_ENDIAN_SELECT(le, be)	le[m
[31m-#define LJ_ENDIAN_LOHI(lo, hi)		lo hi[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_ARCH_BITS == 32[m
[31m-#define LJ_32			1[m
[31m-#define LJ_64			0[m
[31m-#else[m
[31m-#define LJ_32			0[m
[31m-#define LJ_64			1[m
[31m-#endif[m
[31m-[m
[31m-#ifndef LJ_TARGET_UNALIGNED[m
[31m-#define LJ_TARGET_UNALIGNED	0[m
[31m-#endif[m
[31m-[m
[31m-/* Various workarounds for embedded operating systems or weak C runtimes. */[m
[31m-#if defined(__ANDROID__) || defined(__symbian__) || LJ_TARGET_XBOX360 || LJ_TARGET_WINDOWS[m
[31m-#define LUAJIT_NO_LOG2[m
[31m-#endif[m
[31m-#if defined(__symbian__) || LJ_TARGET_WINDOWS[m
[31m-#define LUAJIT_NO_EXP2[m
[31m-#endif[m
[31m-#if LJ_TARGET_CONSOLE || (LJ_TARGET_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0)[m
[31m-#define LJ_NO_SYSTEM		1[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4[m
[31m-#define LJ_NO_UNWIND		1[m
[31m-#endif[m
[31m-[m
[31m-/* Compatibility with Lua 5.1 vs. 5.2. */[m
[31m-#ifdef LUAJIT_ENABLE_LUA52COMPAT[m
[31m-#define LJ_52			1[m
[31m-#else[m
[31m-#define LJ_52			0[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm.c[m
[1mdeleted file mode 100644[m
[1mindex 94d7bfc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm.c[m
[1m+++ /dev/null[m
[36m@@ -1,2288 +0,0 @@[m
[31m-/*[m
[31m-** IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_asm_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_frame.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_mcode.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_asm.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_target.h"[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-#include <stdio.h>[m
[31m-#endif[m
[31m-[m
[31m-/* -- Assembler state and common macros ----------------------------------- */[m
[31m-[m
[31m-/* Assembler state. */[m
[31m-typedef struct ASMState {[m
[31m-  RegCost cost[RID_MAX];  /* Reference and blended allocation cost for regs. */[m
[31m-[m
[31m-  MCode *mcp;		/* Current MCode pointer (grows down). */[m
[31m-  MCode *mclim;		/* Lower limit for MCode memory + red zone. */[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  MCode *mcp_prev;	/* Red zone overflow check. */[m
[31m-#endif[m
[31m-[m
[31m-  IRIns *ir;		/* Copy of pointer to IR instructions/constants. */[m
[31m-  jit_State *J;		/* JIT compiler state. */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  x86ModRM mrm;		/* Fused x86 address operand. */[m
[31m-#endif[m
[31m-[m
[31m-  RegSet freeset;	/* Set of free registers. */[m
[31m-  RegSet modset;	/* Set of registers modified inside the loop. */[m
[31m-  RegSet weakset;	/* Set of weakly referenced registers. */[m
[31m-  RegSet phiset;	/* Set of PHI registers. */[m
[31m-[m
[31m-  uint32_t flags;	/* Copy of JIT compiler flags. */[m
[31m-  int loopinv;		/* Loop branch inversion (0:no, 1:yes, 2:yes+CC_P). */[m
[31m-[m
[31m-  int32_t evenspill;	/* Next even spill slot. */[m
[31m-  int32_t oddspill;	/* Next odd spill slot (or 0). */[m
[31m-[m
[31m-  IRRef curins;		/* Reference of current instruction. */[m
[31m-  IRRef stopins;	/* Stop assembly before hitting this instruction. */[m
[31m-  IRRef orignins;	/* Original T->nins. */[m
[31m-[m
[31m-  IRRef snapref;	/* Current snapshot is active after this reference. */[m
[31m-  IRRef snaprename;	/* Rename highwater mark for snapshot check. */[m
[31m-  SnapNo snapno;	/* Current snapshot number. */[m
[31m-  SnapNo loopsnapno;	/* Loop snapshot number. */[m
[31m-[m
[31m-  IRRef fuseref;	/* Fusion limit (loopref, 0 or FUSE_DISABLED). */[m
[31m-  IRRef sectref;	/* Section base reference (loopref or 0). */[m
[31m-  IRRef loopref;	/* Reference of LOOP instruction (or 0). */[m
[31m-[m
[31m-  BCReg topslot;	/* Number of slots for stack check (unless 0). */[m
[31m-  int32_t gcsteps;	/* Accumulated number of GC steps (per section). */[m
[31m-[m
[31m-  GCtrace *T;		/* Trace to assemble. */[m
[31m-  GCtrace *parent;	/* Parent trace (or NULL). */[m
[31m-[m
[31m-  MCode *mcbot;		/* Bottom of reserved MCode. */[m
[31m-  MCode *mctop;		/* Top of generated MCode. */[m
[31m-  MCode *mcloop;	/* Pointer to loop MCode (or NULL). */[m
[31m-  MCode *invmcp;	/* Points to invertible loop branch (or NULL). */[m
[31m-  MCode *flagmcp;	/* Pending opportunity to merge flag setting ins. */[m
[31m-  MCode *realign;	/* Realign loop if not NULL. */[m
[31m-[m
[31m-#ifdef RID_NUM_KREF[m
[31m-  int32_t krefk[RID_NUM_KREF];[m
[31m-#endif[m
[31m-  IRRef1 phireg[RID_MAX];  /* PHI register references. */[m
[31m-  uint16_t parentmap[LJ_MAX_JSLOTS];  /* Parent instruction to RegSP map. */[m
[31m-} ASMState;[m
[31m-[m
[31m-#define IR(ref)			(&as->ir[(ref)])[m
[31m-[m
[31m-#define ASMREF_TMP1		REF_TRUE	/* Temp. register. */[m
[31m-#define ASMREF_TMP2		REF_FALSE	/* Temp. register. */[m
[31m-#define ASMREF_L		REF_NIL		/* Stores register for L. */[m
[31m-[m
[31m-/* Check for variant to invariant references. */[m
[31m-#define iscrossref(as, ref)	((ref) < as->sectref)[m
[31m-[m
[31m-/* Inhibit memory op fusion from variant to invariant references. */[m
[31m-#define FUSE_DISABLED		(~(IRRef)0)[m
[31m-#define mayfuse(as, ref)	((ref) > as->fuseref)[m
[31m-#define neverfuse(as)		(as->fuseref == FUSE_DISABLED)[m
[31m-#define canfuse(as, ir)		(!neverfuse(as) && !irt_isphi((ir)->t))[m
[31m-#define opisfusableload(o) \[m
[31m-  ((o) == IR_ALOAD || (o) == IR_HLOAD || (o) == IR_ULOAD || \[m
[31m-   (o) == IR_FLOAD || (o) == IR_XLOAD || (o) == IR_SLOAD || (o) == IR_VLOAD)[m
[31m-[m
[31m-/* Sparse limit checks using a red zone before the actual limit. */[m
[31m-#define MCLIM_REDZONE	64[m
[31m-[m
[31m-static LJ_NORET LJ_NOINLINE void asm_mclimit(ASMState *as)[m
[31m-{[m
[31m-  lj_mcode_limiterr(as->J, (size_t)(as->mctop - as->mcp + 4*MCLIM_REDZONE));[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void checkmclim(ASMState *as)[m
[31m-{[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  if (as->mcp + MCLIM_REDZONE < as->mcp_prev) {[m
[31m-    IRIns *ir = IR(as->curins+1);[m
[31m-    fprintf(stderr, "RED ZONE OVERFLOW: %p IR %04d  %02d %04d %04d\n", as->mcp,[m
[31m-	    as->curins+1-REF_BIAS, ir->o, ir->op1-REF_BIAS, ir->op2-REF_BIAS);[m
[31m-    lua_assert(0);[m
[31m-  }[m
[31m-#endif[m
[31m-  if (LJ_UNLIKELY(as->mcp < as->mclim)) asm_mclimit(as);[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  as->mcp_prev = as->mcp;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#ifdef RID_NUM_KREF[m
[31m-#define ra_iskref(ref)		((ref) < RID_NUM_KREF)[m
[31m-#define ra_krefreg(ref)		((Reg)(RID_MIN_KREF + (Reg)(ref)))[m
[31m-#define ra_krefk(as, ref)	(as->krefk[(ref)])[m
[31m-[m
[31m-static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, int32_t k)[m
[31m-{[m
[31m-  IRRef ref = (IRRef)(r - RID_MIN_KREF);[m
[31m-  as->krefk[ref] = k;[m
[31m-  as->cost[r] = REGCOST(ref, ref);[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-#define ra_iskref(ref)		0[m
[31m-#define ra_krefreg(ref)		RID_MIN_GPR[m
[31m-#define ra_krefk(as, ref)	0[m
[31m-#endif[m
[31m-[m
[31m-/* Arch-specific field offsets. */[m
[31m-static const uint8_t field_ofs[IRFL__MAX+1] = {[m
[31m-#define FLOFS(name, ofs)	(uint8_t)(ofs),[m
[31m-IRFLDEF(FLOFS)[m
[31m-#undef FLOFS[m
[31m-  0[m
[31m-};[m
[31m-[m
[31m-/* -- Target-specific instruction emitter --------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#include "lj_emit_x86.h"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#include "lj_emit_arm.h"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#include "lj_emit_ppc.h"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#include "lj_emit_mips.h"[m
[31m-#else[m
[31m-#error "Missing instruction emitter for target CPU"[m
[31m-#endif[m
[31m-[m
[31m-/* Generic load/store of register from/to stack slot. */[m
[31m-#define emit_spload(as, ir, r, ofs) \[m
[31m-  emit_loadofs(as, ir, (r), RID_SP, (ofs))[m
[31m-#define emit_spstore(as, ir, r, ofs) \[m
[31m-  emit_storeofs(as, ir, (r), RID_SP, (ofs))[m
[31m-[m
[31m-/* -- Register allocator debugging ---------------------------------------- */[m
[31m-[m
[31m-/* #define LUAJIT_DEBUG_RA */[m
[31m-[m
[31m-#ifdef LUAJIT_DEBUG_RA[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#define RIDNAME(name)	#name,[m
[31m-static const char *const ra_regname[] = {[m
[31m-  GPRDEF(RIDNAME)[m
[31m-  FPRDEF(RIDNAME)[m
[31m-  VRIDDEF(RIDNAME)[m
[31m-  NULL[m
[31m-};[m
[31m-#undef RIDNAME[m
[31m-[m
[31m-static char ra_dbg_buf[65536];[m
[31m-static char *ra_dbg_p;[m
[31m-static char *ra_dbg_merge;[m
[31m-static MCode *ra_dbg_mcp;[m
[31m-[m
[31m-static void ra_dstart(void)[m
[31m-{[m
[31m-  ra_dbg_p = ra_dbg_buf;[m
[31m-  ra_dbg_merge = NULL;[m
[31m-  ra_dbg_mcp = NULL;[m
[31m-}[m
[31m-[m
[31m-static void ra_dflush(void)[m
[31m-{[m
[31m-  fwrite(ra_dbg_buf, 1, (size_t)(ra_dbg_p-ra_dbg_buf), stdout);[m
[31m-  ra_dstart();[m
[31m-}[m
[31m-[m
[31m-static void ra_dprintf(ASMState *as, const char *fmt, ...)[m
[31m-{[m
[31m-  char *p;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  p = ra_dbg_mcp == as->mcp ? ra_dbg_merge : ra_dbg_p;[m
[31m-  ra_dbg_mcp = NULL;[m
[31m-  p += sprintf(p, "%08x  \e[36m%04d ", (uintptr_t)as->mcp, as->curins-REF_BIAS);[m
[31m-  for (;;) {[m
[31m-    const char *e = strchr(fmt, '$');[m
[31m-    if (e == NULL) break;[m
[31m-    memcpy(p, fmt, (size_t)(e-fmt));[m
[31m-    p += e-fmt;[m
[31m-    if (e[1] == 'r') {[m
[31m-      Reg r = va_arg(argp, Reg) & RID_MASK;[m
[31m-      if (r <= RID_MAX) {[m
[31m-	const char *q;[m
[31m-	for (q = ra_regname[r]; *q; q++)[m
[31m-	  *p++ = *q >= 'A' && *q <= 'Z' ? *q + 0x20 : *q;[m
[31m-      } else {[m
[31m-	*p++ = '?';[m
[31m-	lua_assert(0);[m
[31m-      }[m
[31m-    } else if (e[1] == 'f' || e[1] == 'i') {[m
[31m-      IRRef ref;[m
[31m-      if (e[1] == 'f')[m
[31m-	ref = va_arg(argp, IRRef);[m
[31m-      else[m
[31m-	ref = va_arg(argp, IRIns *) - as->ir;[m
[31m-      if (ref >= REF_BIAS)[m
[31m-	p += sprintf(p, "%04d", ref - REF_BIAS);[m
[31m-      else[m
[31m-	p += sprintf(p, "K%03d", REF_BIAS - ref);[m
[31m-    } else if (e[1] == 's') {[m
[31m-      uint32_t slot = va_arg(argp, uint32_t);[m
[31m-      p += sprintf(p, "[sp+0x%x]", sps_scale(slot));[m
[31m-    } else if (e[1] == 'x') {[m
[31m-      p += sprintf(p, "%08x", va_arg(argp, int32_t));[m
[31m-    } else {[m
[31m-      lua_assert(0);[m
[31m-    }[m
[31m-    fmt = e+2;[m
[31m-  }[m
[31m-  va_end(argp);[m
[31m-  while (*fmt)[m
[31m-    *p++ = *fmt++;[m
[31m-  *p++ = '\e'; *p++ = '['; *p++ = 'm'; *p++ = '\n';[m
[31m-  if (p > ra_dbg_buf+sizeof(ra_dbg_buf)-256) {[m
[31m-    fwrite(ra_dbg_buf, 1, (size_t)(p-ra_dbg_buf), stdout);[m
[31m-    p = ra_dbg_buf;[m
[31m-  }[m
[31m-  ra_dbg_p = p;[m
[31m-}[m
[31m-[m
[31m-#define RA_DBG_START()	ra_dstart()[m
[31m-#define RA_DBG_FLUSH()	ra_dflush()[m
[31m-#define RA_DBG_REF() \[m
[31m-  do { char *_p = ra_dbg_p; ra_dprintf(as, ""); \[m
[31m-       ra_dbg_merge = _p; ra_dbg_mcp = as->mcp; } while (0)[m
[31m-#define RA_DBGX(x)	ra_dprintf x[m
[31m-[m
[31m-#else[m
[31m-#define RA_DBG_START()	((void)0)[m
[31m-#define RA_DBG_FLUSH()	((void)0)[m
[31m-#define RA_DBG_REF()	((void)0)[m
[31m-#define RA_DBGX(x)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Register allocator -------------------------------------------------- */[m
[31m-[m
[31m-#define ra_free(as, r)		rset_set(as->freeset, (r))[m
[31m-#define ra_modified(as, r)	rset_set(as->modset, (r))[m
[31m-#define ra_weak(as, r)		rset_set(as->weakset, (r))[m
[31m-#define ra_noweak(as, r)	rset_clear(as->weakset, (r))[m
[31m-[m
[31m-#define ra_used(ir)		(ra_hasreg((ir)->r) || ra_hasspill((ir)->s))[m
[31m-[m
[31m-/* Setup register allocator. */[m
[31m-static void ra_setup(ASMState *as)[m
[31m-{[m
[31m-  Reg r;[m
[31m-  /* Initially all regs (except the stack pointer) are free for use. */[m
[31m-  as->freeset = RSET_INIT;[m
[31m-  as->modset = RSET_EMPTY;[m
[31m-  as->weakset = RSET_EMPTY;[m
[31m-  as->phiset = RSET_EMPTY;[m
[31m-  memset(as->phireg, 0, sizeof(as->phireg));[m
[31m-  for (r = RID_MIN_GPR; r < RID_MAX; r++)[m
[31m-    as->cost[r] = REGCOST(~0u, 0u);[m
[31m-}[m
[31m-[m
[31m-/* Rematerialize constants. */[m
[31m-static Reg ra_rematk(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  Reg r;[m
[31m-  if (ra_iskref(ref)) {[m
[31m-    r = ra_krefreg(ref);[m
[31m-    lua_assert(!rset_test(as->freeset, r));[m
[31m-    ra_free(as, r);[m
[31m-    ra_modified(as, r);[m
[31m-    emit_loadi(as, r, ra_krefk(as, ref));[m
[31m-    return r;[m
[31m-  }[m
[31m-  ir = IR(ref);[m
[31m-  r = ir->r;[m
[31m-  lua_assert(ra_hasreg(r) && !ra_hasspill(ir->s));[m
[31m-  ra_free(as, r);[m
[31m-  ra_modified(as, r);[m
[31m-  ir->r = RID_INIT;  /* Do not keep any hint. */[m
[31m-  RA_DBGX((as, "remat     $i $r", ir, r));[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (ir->o == IR_KNUM) {[m
[31m-    emit_loadn(as, r, ir_knum(ir));[m
[31m-  } else[m
[31m-#endif[m
[31m-  if (emit_canremat(REF_BASE) && ir->o == IR_BASE) {[m
[31m-    ra_sethint(ir->r, RID_BASE);  /* Restore BASE register hint. */[m
[31m-    emit_getgl(as, r, jit_base);[m
[31m-  } else if (emit_canremat(ASMREF_L) && ir->o == IR_KPRI) {[m
[31m-    lua_assert(irt_isnil(ir->t));  /* REF_NIL stores ASMREF_L register. */[m
[31m-    emit_getgl(as, r, cur_L);[m
[31m-#if LJ_64[m
[31m-  } else if (ir->o == IR_KINT64) {[m
[31m-    emit_loadu64(as, r, ir_kint64(ir)->u64);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||[m
[31m-	       ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL);[m
[31m-    emit_loadi(as, r, ir->i);[m
[31m-  }[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Force a spill. Allocate a new spill slot if needed. */[m
[31m-static int32_t ra_spill(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t slot = ir->s;[m
[31m-  lua_assert(ir >= as->ir + REF_TRUE);[m
[31m-  if (!ra_hasspill(slot)) {[m
[31m-    if (irt_is64(ir->t)) {[m
[31m-      slot = as->evenspill;[m
[31m-      as->evenspill += 2;[m
[31m-    } else if (as->oddspill) {[m
[31m-      slot = as->oddspill;[m
[31m-      as->oddspill = 0;[m
[31m-    } else {[m
[31m-      slot = as->evenspill;[m
[31m-      as->oddspill = slot+1;[m
[31m-      as->evenspill += 2;[m
[31m-    }[m
[31m-    if (as->evenspill > 256)[m
[31m-      lj_trace_err(as->J, LJ_TRERR_SPILLOV);[m
[31m-    ir->s = (uint8_t)slot;[m
[31m-  }[m
[31m-  return sps_scale(slot);[m
[31m-}[m
[31m-[m
[31m-/* Release the temporarily allocated register in ASMREF_TMP1/ASMREF_TMP2. */[m
[31m-static Reg ra_releasetmp(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  Reg r = ir->r;[m
[31m-  lua_assert(ra_hasreg(r) && !ra_hasspill(ir->s));[m
[31m-  ra_free(as, r);[m
[31m-  ra_modified(as, r);[m
[31m-  ir->r = RID_INIT;[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Restore a register (marked as free). Rematerialize or force a spill. */[m
[31m-static Reg ra_restore(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  if (emit_canremat(ref)) {[m
[31m-    return ra_rematk(as, ref);[m
[31m-  } else {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    int32_t ofs = ra_spill(as, ir);  /* Force a spill slot. */[m
[31m-    Reg r = ir->r;[m
[31m-    lua_assert(ra_hasreg(r));[m
[31m-    ra_sethint(ir->r, r);  /* Keep hint. */[m
[31m-    ra_free(as, r);[m
[31m-    if (!rset_test(as->weakset, r)) {  /* Only restore non-weak references. */[m
[31m-      ra_modified(as, r);[m
[31m-      RA_DBGX((as, "restore   $i $r", ir, r));[m
[31m-      emit_spload(as, ir, r, ofs);[m
[31m-    }[m
[31m-    return r;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Save a register to a spill slot. */[m
[31m-static void ra_save(ASMState *as, IRIns *ir, Reg r)[m
[31m-{[m
[31m-  RA_DBGX((as, "save      $i $r", ir, r));[m
[31m-  emit_spstore(as, ir, r, sps_scale(ir->s));[m
[31m-}[m
[31m-[m
[31m-#define MINCOST(name) \[m
[31m-  if (rset_test(RSET_ALL, RID_##name) && \[m
[31m-      LJ_LIKELY(allow&RID2RSET(RID_##name)) && as->cost[RID_##name] < cost) \[m
[31m-    cost = as->cost[RID_##name];[m
[31m-[m
[31m-/* Evict the register with the lowest cost, forcing a restore. */[m
[31m-static Reg ra_evict(ASMState *as, RegSet allow)[m
[31m-{[m
[31m-  IRRef ref;[m
[31m-  RegCost cost = ~(RegCost)0;[m
[31m-  lua_assert(allow != RSET_EMPTY);[m
[31m-  if (RID_NUM_FPR == 0 || allow < RID2RSET(RID_MAX_GPR)) {[m
[31m-    GPRDEF(MINCOST)[m
[31m-  } else {[m
[31m-    FPRDEF(MINCOST)[m
[31m-  }[m
[31m-  ref = regcost_ref(cost);[m
[31m-  lua_assert(ra_iskref(ref) || (ref >= as->T->nk && ref < as->T->nins));[m
[31m-  /* Preferably pick any weak ref instead of a non-weak, non-const ref. */[m
[31m-  if (!irref_isk(ref) && (as->weakset & allow)) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (!rset_test(as->weakset, ir->r))[m
[31m-      ref = regcost_ref(as->cost[rset_pickbot((as->weakset & allow))]);[m
[31m-  }[m
[31m-  return ra_restore(as, ref);[m
[31m-}[m
[31m-[m
[31m-/* Pick any register (marked as free). Evict on-demand. */[m
[31m-static Reg ra_pick(ASMState *as, RegSet allow)[m
[31m-{[m
[31m-  RegSet pick = as->freeset & allow;[m
[31m-  if (!pick)[m
[31m-    return ra_evict(as, allow);[m
[31m-  else[m
[31m-    return rset_picktop(pick);[m
[31m-}[m
[31m-[m
[31m-/* Get a scratch register (marked as free). */[m
[31m-static Reg ra_scratch(ASMState *as, RegSet allow)[m
[31m-{[m
[31m-  Reg r = ra_pick(as, allow);[m
[31m-  ra_modified(as, r);[m
[31m-  RA_DBGX((as, "scratch        $r", r));[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Evict all registers from a set (if not free). */[m
[31m-static void ra_evictset(ASMState *as, RegSet drop)[m
[31m-{[m
[31m-  RegSet work;[m
[31m-  as->modset |= drop;[m
[31m-#if !LJ_SOFTFP[m
[31m-  work = (drop & ~as->freeset) & RSET_FPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    rset_clear(work, r);[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-#endif[m
[31m-  work = (drop & ~as->freeset);[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    rset_clear(work, r);[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Evict (rematerialize) all registers allocated to constants. */[m
[31m-static void ra_evictk(ASMState *as)[m
[31m-{[m
[31m-  RegSet work;[m
[31m-#if !LJ_SOFTFP[m
[31m-  work = ~as->freeset & RSET_FPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    if (emit_canremat(ref) && irref_isk(ref)) {[m
[31m-      ra_rematk(as, ref);[m
[31m-      checkmclim(as);[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-#endif[m
[31m-  work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    if (emit_canremat(ref) && irref_isk(ref)) {[m
[31m-      ra_rematk(as, ref);[m
[31m-      checkmclim(as);[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#ifdef RID_NUM_KREF[m
[31m-/* Allocate a register for a constant. */[m
[31m-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow)[m
[31m-{[m
[31m-  /* First try to find a register which already holds the same constant. */[m
[31m-  RegSet pick, work = ~as->freeset & RSET_GPR;[m
[31m-  Reg r;[m
[31m-  while (work) {[m
[31m-    IRRef ref;[m
[31m-    r = rset_pickbot(work);[m
[31m-    ref = regcost_ref(as->cost[r]);[m
[31m-    if (ref < ASMREF_L &&[m
[31m-	k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i))[m
[31m-      return r;[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  pick = as->freeset & allow;[m
[31m-  if (pick) {[m
[31m-    /* Constants should preferably get unmodified registers. */[m
[31m-    if ((pick & ~as->modset))[m
[31m-      pick &= ~as->modset;[m
[31m-    r = rset_pickbot(pick);  /* Reduce conflicts with inverse allocation. */[m
[31m-  } else {[m
[31m-    r = ra_evict(as, allow);[m
[31m-  }[m
[31m-  RA_DBGX((as, "allock    $x $r", k, r));[m
[31m-  ra_setkref(as, r, k);[m
[31m-  rset_clear(as->freeset, r);[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate a specific register for a constant. */[m
[31m-static void ra_allockreg(ASMState *as, int32_t k, Reg r)[m
[31m-{[m
[31m-  Reg kr = ra_allock(as, k, RID2RSET(r));[m
[31m-  if (kr != r) {[m
[31m-    IRIns irdummy;[m
[31m-    irdummy.t.irt = IRT_INT;[m
[31m-    ra_scratch(as, RID2RSET(r));[m
[31m-    emit_movrr(as, &irdummy, r, kr);[m
[31m-  }[m
[31m-}[m
[31m-#else[m
[31m-#define ra_allockreg(as, k, r)		emit_loadi(as, (r), (k))[m
[31m-#endif[m
[31m-[m
[31m-/* Allocate a register for ref from the allowed set of registers.[m
[31m-** Note: this function assumes the ref does NOT have a register yet![m
[31m-** Picks an optimal register, sets the cost and marks the register as non-free.[m
[31m-*/[m
[31m-static Reg ra_allocref(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  RegSet pick = as->freeset & allow;[m
[31m-  Reg r;[m
[31m-  lua_assert(ra_noreg(ir->r));[m
[31m-  if (pick) {[m
[31m-    /* First check register hint from propagation or PHI. */[m
[31m-    if (ra_hashint(ir->r)) {[m
[31m-      r = ra_gethint(ir->r);[m
[31m-      if (rset_test(pick, r))  /* Use hint register if possible. */[m
[31m-	goto found;[m
[31m-      /* Rematerialization is cheaper than missing a hint. */[m
[31m-      if (rset_test(allow, r) && emit_canremat(regcost_ref(as->cost[r]))) {[m
[31m-	ra_rematk(as, regcost_ref(as->cost[r]));[m
[31m-	goto found;[m
[31m-      }[m
[31m-      RA_DBGX((as, "hintmiss  $f $r", ref, r));[m
[31m-    }[m
[31m-    /* Invariants should preferably get unmodified registers. */[m
[31m-    if (ref < as->loopref && !irt_isphi(ir->t)) {[m
[31m-      if ((pick & ~as->modset))[m
[31m-	pick &= ~as->modset;[m
[31m-      r = rset_pickbot(pick);  /* Reduce conflicts with inverse allocation. */[m
[31m-    } else {[m
[31m-      /* We've got plenty of regs, so get callee-save regs if possible. */[m
[31m-      if (RID_NUM_GPR > 8 && (pick & ~RSET_SCRATCH))[m
[31m-	pick &= ~RSET_SCRATCH;[m
[31m-      r = rset_picktop(pick);[m
[31m-    }[m
[31m-  } else {[m
[31m-    r = ra_evict(as, allow);[m
[31m-  }[m
[31m-found:[m
[31m-  RA_DBGX((as, "alloc     $f $r", ref, r));[m
[31m-  ir->r = (uint8_t)r;[m
[31m-  rset_clear(as->freeset, r);[m
[31m-  ra_noweak(as, r);[m
[31m-  as->cost[r] = REGCOST_REF_T(ref, irt_t(ir->t));[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate a register on-demand. */[m
[31m-static Reg ra_alloc1(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  /* Note: allow is ignored if the register is already allocated. */[m
[31m-  if (ra_noreg(r)) r = ra_allocref(as, ref, allow);[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Rename register allocation and emit move. */[m
[31m-static void ra_rename(ASMState *as, Reg down, Reg up)[m
[31m-{[m
[31m-  IRRef ren, ref = regcost_ref(as->cost[up] = as->cost[down]);[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  ir->r = (uint8_t)up;[m
[31m-  as->cost[down] = 0;[m
[31m-  lua_assert((down < RID_MAX_GPR) == (up < RID_MAX_GPR));[m
[31m-  lua_assert(!rset_test(as->freeset, down) && rset_test(as->freeset, up));[m
[31m-  ra_free(as, down);  /* 'down' is free ... */[m
[31m-  ra_modified(as, down);[m
[31m-  rset_clear(as->freeset, up);  /* ... and 'up' is now allocated. */[m
[31m-  ra_noweak(as, up);[m
[31m-  RA_DBGX((as, "rename    $f $r $r", regcost_ref(as->cost[up]), down, up));[m
[31m-  emit_movrr(as, ir, down, up);  /* Backwards codegen needs inverse move. */[m
[31m-  if (!ra_hasspill(IR(ref)->s)) {  /* Add the rename to the IR. */[m
[31m-    lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), ref, as->snapno);[m
[31m-    ren = tref_ref(lj_ir_emit(as->J));[m
[31m-    as->ir = as->T->ir;  /* The IR may have been reallocated. */[m
[31m-    IR(ren)->r = (uint8_t)down;[m
[31m-    IR(ren)->s = SPS_NONE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Pick a destination register (marked as free).[m
[31m-** Caveat: allow is ignored if there's already a destination register.[m
[31m-** Use ra_destreg() to get a specific register.[m
[31m-*/[m
[31m-static Reg ra_dest(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  Reg dest = ir->r;[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    ra_free(as, dest);[m
[31m-    ra_modified(as, dest);[m
[31m-  } else {[m
[31m-    if (ra_hashint(dest) && rset_test((as->freeset&allow), ra_gethint(dest))) {[m
[31m-      dest = ra_gethint(dest);[m
[31m-      ra_modified(as, dest);[m
[31m-      RA_DBGX((as, "dest           $r", dest));[m
[31m-    } else {[m
[31m-      dest = ra_scratch(as, allow);[m
[31m-    }[m
[31m-    ir->r = dest;[m
[31m-  }[m
[31m-  if (LJ_UNLIKELY(ra_hasspill(ir->s))) ra_save(as, ir, dest);[m
[31m-  return dest;[m
[31m-}[m
[31m-[m
[31m-/* Force a specific destination register (marked as free). */[m
[31m-static void ra_destreg(ASMState *as, IRIns *ir, Reg r)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RID2RSET(r));[m
[31m-  if (dest != r) {[m
[31m-    lua_assert(rset_test(as->freeset, r));[m
[31m-    ra_modified(as, r);[m
[31m-    emit_movrr(as, ir, dest, r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-/* Propagate dest register to left reference. Emit moves as needed.[m
[31m-** This is a required fixup step for all 2-operand machine instructions.[m
[31m-*/[m
[31m-static void ra_left(ASMState *as, Reg dest, IRRef lref)[m
[31m-{[m
[31m-  IRIns *ir = IR(lref);[m
[31m-  Reg left = ir->r;[m
[31m-  if (ra_noreg(left)) {[m
[31m-    if (irref_isk(lref)) {[m
[31m-      if (ir->o == IR_KNUM) {[m
[31m-	cTValue *tv = ir_knum(ir);[m
[31m-	/* FP remat needs a load except for +0. Still better than eviction. */[m
[31m-	if (tvispzero(tv) || !(as->freeset & RSET_FPR)) {[m
[31m-	  emit_loadn(as, dest, tv);[m
[31m-	  return;[m
[31m-	}[m
[31m-#if LJ_64[m
[31m-      } else if (ir->o == IR_KINT64) {[m
[31m-	emit_loadu64(as, dest, ir_kint64(ir)->u64);[m
[31m-	return;[m
[31m-#endif[m
[31m-      } else if (ir->o != IR_KPRI) {[m
[31m-	lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||[m
[31m-		   ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL);[m
[31m-	emit_loadi(as, dest, ir->i);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!ra_hashint(left) && !iscrossref(as, lref))[m
[31m-      ra_sethint(ir->r, dest);  /* Propagate register hint. */[m
[31m-    left = ra_allocref(as, lref, dest < RID_MAX_GPR ? RSET_GPR : RSET_FPR);[m
[31m-  }[m
[31m-  ra_noweak(as, left);[m
[31m-  /* Move needed for true 3-operand instruction: y=a+b ==> y=a; y+=b. */[m
[31m-  if (dest != left) {[m
[31m-    /* Use register renaming if dest is the PHI reg. */[m
[31m-    if (irt_isphi(ir->t) && as->phireg[dest] == lref) {[m
[31m-      ra_modified(as, left);[m
[31m-      ra_rename(as, left, dest);[m
[31m-    } else {[m
[31m-      emit_movrr(as, ir, dest, left);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-#else[m
[31m-/* Similar to ra_left, except we override any hints. */[m
[31m-static void ra_leftov(ASMState *as, Reg dest, IRRef lref)[m
[31m-{[m
[31m-  IRIns *ir = IR(lref);[m
[31m-  Reg left = ir->r;[m
[31m-  if (ra_noreg(left)) {[m
[31m-    ra_sethint(ir->r, dest);  /* Propagate register hint. */[m
[31m-    left = ra_allocref(as, lref,[m
[31m-		       (LJ_SOFTFP || dest < RID_MAX_GPR) ? RSET_GPR : RSET_FPR);[m
[31m-  }[m
[31m-  ra_noweak(as, left);[m
[31m-  if (dest != left) {[m
[31m-    /* Use register renaming if dest is the PHI reg. */[m
[31m-    if (irt_isphi(ir->t) && as->phireg[dest] == lref) {[m
[31m-      ra_modified(as, left);[m
[31m-      ra_rename(as, left, dest);[m
[31m-    } else {[m
[31m-      emit_movrr(as, ir, dest, left);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_64[m
[31m-/* Force a RID_RETLO/RID_RETHI destination register pair (marked as free). */[m
[31m-static void ra_destpair(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg destlo = ir->r, desthi = (ir+1)->r;[m
[31m-  /* First spill unrelated refs blocking the destination registers. */[m
[31m-  if (!rset_test(as->freeset, RID_RETLO) &&[m
[31m-      destlo != RID_RETLO && desthi != RID_RETLO)[m
[31m-    ra_restore(as, regcost_ref(as->cost[RID_RETLO]));[m
[31m-  if (!rset_test(as->freeset, RID_RETHI) &&[m
[31m-      destlo != RID_RETHI && desthi != RID_RETHI)[m
[31m-    ra_restore(as, regcost_ref(as->cost[RID_RETHI]));[m
[31m-  /* Next free the destination registers (if any). */[m
[31m-  if (ra_hasreg(destlo)) {[m
[31m-    ra_free(as, destlo);[m
[31m-    ra_modified(as, destlo);[m
[31m-  } else {[m
[31m-    destlo = RID_RETLO;[m
[31m-  }[m
[31m-  if (ra_hasreg(desthi)) {[m
[31m-    ra_free(as, desthi);[m
[31m-    ra_modified(as, desthi);[m
[31m-  } else {[m
[31m-    desthi = RID_RETHI;[m
[31m-  }[m
[31m-  /* Check for conflicts and shuffle the registers as needed. */[m
[31m-  if (destlo == RID_RETHI) {[m
[31m-    if (desthi == RID_RETLO) {[m
[31m-#if LJ_TARGET_X86[m
[31m-      *--as->mcp = XI_XCHGa + RID_RETHI;[m
[31m-#else[m
[31m-      emit_movrr(as, ir, RID_RETHI, RID_TMP);[m
[31m-      emit_movrr(as, ir, RID_RETLO, RID_RETHI);[m
[31m-      emit_movrr(as, ir, RID_TMP, RID_RETLO);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      emit_movrr(as, ir, RID_RETHI, RID_RETLO);[m
[31m-      if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI);[m
[31m-    }[m
[31m-  } else if (desthi == RID_RETLO) {[m
[31m-    emit_movrr(as, ir, RID_RETLO, RID_RETHI);[m
[31m-    if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO);[m
[31m-  } else {[m
[31m-    if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI);[m
[31m-    if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO);[m
[31m-  }[m
[31m-  /* Restore spill slots (if any). */[m
[31m-  if (ra_hasspill((ir+1)->s)) ra_save(as, ir+1, RID_RETHI);[m
[31m-  if (ra_hasspill(ir->s)) ra_save(as, ir, RID_RETLO);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Snapshot handling --------- ----------------------------------------- */[m
[31m-[m
[31m-/* Can we rematerialize a KNUM instead of forcing a spill? */[m
[31m-static int asm_snap_canremat(ASMState *as)[m
[31m-{[m
[31m-  Reg r;[m
[31m-  for (r = RID_MIN_FPR; r < RID_MAX_FPR; r++)[m
[31m-    if (irref_isk(regcost_ref(as->cost[r])))[m
[31m-      return 1;[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a sunk store corresponds to an allocation. */[m
[31m-static int asm_sunk_store(ASMState *as, IRIns *ira, IRIns *irs)[m
[31m-{[m
[31m-  if (irs->s == 255) {[m
[31m-    if (irs->o == IR_ASTORE || irs->o == IR_HSTORE ||[m
[31m-	irs->o == IR_FSTORE || irs->o == IR_XSTORE) {[m
[31m-      IRIns *irk = IR(irs->op1);[m
[31m-      if (irk->o == IR_AREF || irk->o == IR_HREFK)[m
[31m-	irk = IR(irk->op1);[m
[31m-      return (IR(irk->op1) == ira);[m
[31m-    }[m
[31m-    return 0;[m
[31m-  } else {[m
[31m-    return (ira + irs->s == irs);  /* Quick check. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocate register or spill slot for a ref that escapes to a snapshot. */[m
[31m-static void asm_snap_alloc1(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (!irref_isk(ref) && (!(ra_used(ir) || ir->r == RID_SUNK))) {[m
[31m-    if (ir->r == RID_SINK) {[m
[31m-      ir->r = RID_SUNK;[m
[31m-#if LJ_HASFFI[m
[31m-      if (ir->o == IR_CNEWI) {  /* Allocate CNEWI value. */[m
[31m-	asm_snap_alloc1(as, ir->op2);[m
[31m-	if (LJ_32 && (ir+1)->o == IR_HIOP)[m
[31m-	  asm_snap_alloc1(as, (ir+1)->op2);[m
[31m-      } else[m
[31m-#endif[m
[31m-      {  /* Allocate stored values for TNEW, TDUP and CNEW. */[m
[31m-	IRIns *irs;[m
[31m-	lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP || ir->o == IR_CNEW);[m
[31m-	for (irs = IR(as->snapref-1); irs > ir; irs--)[m
[31m-	  if (irs->r == RID_SINK && asm_sunk_store(as, ir, irs)) {[m
[31m-	    lua_assert(irs->o == IR_ASTORE || irs->o == IR_HSTORE ||[m
[31m-		       irs->o == IR_FSTORE || irs->o == IR_XSTORE);[m
[31m-	    asm_snap_alloc1(as, irs->op2);[m
[31m-	    if (LJ_32 && (irs+1)->o == IR_HIOP)[m
[31m-	      asm_snap_alloc1(as, (irs+1)->op2);[m
[31m-	  }[m
[31m-      }[m
[31m-    } else {[m
[31m-      RegSet allow;[m
[31m-      if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT) {[m
[31m-	IRIns *irc;[m
[31m-	for (irc = IR(as->curins); irc > ir; irc--)[m
[31m-	  if ((irc->op1 == ref || irc->op2 == ref) &&[m
[31m-	      !(irc->r == RID_SINK || irc->r == RID_SUNK))[m
[31m-	    goto nosink;  /* Don't sink conversion if result is used. */[m
[31m-	asm_snap_alloc1(as, ir->op1);[m
[31m-	return;[m
[31m-      }[m
[31m-    nosink:[m
[31m-      allow = (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR;[m
[31m-      if ((as->freeset & allow) ||[m
[31m-	       (allow == RSET_FPR && asm_snap_canremat(as))) {[m
[31m-	/* Get a weak register if we have a free one or can rematerialize. */[m
[31m-	Reg r = ra_allocref(as, ref, allow);  /* Allocate a register. */[m
[31m-	if (!irt_isphi(ir->t))[m
[31m-	  ra_weak(as, r);  /* But mark it as weakly referenced. */[m
[31m-	checkmclim(as);[m
[31m-	RA_DBGX((as, "snapreg   $f $r", ref, ir->r));[m
[31m-      } else {[m
[31m-	ra_spill(as, ir);  /* Otherwise force a spill slot. */[m
[31m-	RA_DBGX((as, "snapspill $f $s", ref, ir->s));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocate refs escaping to a snapshot. */[m
[31m-static void asm_snap_alloc(ASMState *as)[m
[31m-{[m
[31m-  SnapShot *snap = &as->T->snap[as->snapno];[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    if (!irref_isk(ref)) {[m
[31m-      asm_snap_alloc1(as, ref);[m
[31m-      if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) {[m
[31m-	lua_assert(irt_type(IR(ref+1)->t) == IRT_SOFTFP);[m
[31m-	asm_snap_alloc1(as, ref+1);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* All guards for a snapshot use the same exitno. This is currently the[m
[31m-** same as the snapshot number. Since the exact origin of the exit cannot[m
[31m-** be determined, all guards for the same snapshot must exit with the same[m
[31m-** RegSP mapping.[m
[31m-** A renamed ref which has been used in a prior guard for the same snapshot[m
[31m-** would cause an inconsistency. The easy way out is to force a spill slot.[m
[31m-*/[m
[31m-static int asm_snap_checkrename(ASMState *as, IRRef ren)[m
[31m-{[m
[31m-  SnapShot *snap = &as->T->snap[as->snapno];[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    if (ref == ren || (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && ++ref == ren)) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      ra_spill(as, ir);  /* Register renamed, so force a spill slot. */[m
[31m-      RA_DBGX((as, "snaprensp $f $s", ref, ir->s));[m
[31m-      return 1;  /* Found. */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* Not found. */[m
[31m-}[m
[31m-[m
[31m-/* Prepare snapshot for next guard instruction. */[m
[31m-static void asm_snap_prep(ASMState *as)[m
[31m-{[m
[31m-  if (as->curins < as->snapref) {[m
[31m-    do {[m
[31m-      if (as->snapno == 0) return;  /* Called by sunk stores before snap #0. */[m
[31m-      as->snapno--;[m
[31m-      as->snapref = as->T->snap[as->snapno].ref;[m
[31m-    } while (as->curins < as->snapref);[m
[31m-    asm_snap_alloc(as);[m
[31m-    as->snaprename = as->T->nins;[m
[31m-  } else {[m
[31m-    /* Process any renames above the highwater mark. */[m
[31m-    for (; as->snaprename < as->T->nins; as->snaprename++) {[m
[31m-      IRIns *ir = IR(as->snaprename);[m
[31m-      if (asm_snap_checkrename(as, ir->op1))[m
[31m-	ir->op2 = REF_BIAS-1;  /* Kill rename. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous helpers ----------------------------------------------- */[m
[31m-[m
[31m-/* Calculate stack adjustment. */[m
[31m-static int32_t asm_stack_adjust(ASMState *as)[m
[31m-{[m
[31m-  if (as->evenspill <= SPS_FIXED)[m
[31m-    return 0;[m
[31m-  return sps_scale(sps_align(as->evenspill));[m
[31m-}[m
[31m-[m
[31m-/* Must match with hash*() in lj_tab.c. */[m
[31m-static uint32_t ir_khash(IRIns *ir)[m
[31m-{[m
[31m-  uint32_t lo, hi;[m
[31m-  if (irt_isstr(ir->t)) {[m
[31m-    return ir_kstr(ir)->hash;[m
[31m-  } else if (irt_isnum(ir->t)) {[m
[31m-    lo = ir_knum(ir)->u32.lo;[m
[31m-    hi = ir_knum(ir)->u32.hi << 1;[m
[31m-  } else if (irt_ispri(ir->t)) {[m
[31m-    lua_assert(!irt_isnil(ir->t));[m
[31m-    return irt_type(ir->t)-IRT_FALSE;[m
[31m-  } else {[m
[31m-    lua_assert(irt_isgcv(ir->t));[m
[31m-    lo = u32ptr(ir_kgc(ir));[m
[31m-    hi = lo + HASH_BIAS;[m
[31m-  }[m
[31m-  return hashrot(lo, hi);[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args);[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci);[m
[31m-[m
[31m-static void asm_snew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_new];[m
[31m-  IRRef args[3];[m
[31m-  args[0] = ASMREF_L;  /* lua_State *L    */[m
[31m-  args[1] = ir->op1;   /* const char *str */[m
[31m-  args[2] = ir->op2;   /* size_t len      */[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCstr * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-static void asm_tnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_new1];[m
[31m-  IRRef args[2];[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L    */[m
[31m-  args[1] = ASMREF_TMP1;  /* uint32_t ahsize */[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCtab * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  ra_allockreg(as, ir->op1 | (ir->op2 << 24), ra_releasetmp(as, ASMREF_TMP1));[m
[31m-}[m
[31m-[m
[31m-static void asm_tdup(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_dup];[m
[31m-  IRRef args[2];[m
[31m-  args[0] = ASMREF_L;  /* lua_State *L    */[m
[31m-  args[1] = ir->op1;   /* const GCtab *kt */[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCtab * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-static void asm_gc_check(ASMState *as);[m
[31m-[m
[31m-/* Explicit GC step. */[m
[31m-static void asm_gcstep(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *ira;[m
[31m-  for (ira = IR(as->stopins+1); ira < ir; ira++)[m
[31m-    if ((ira->o == IR_TNEW || ira->o == IR_TDUP ||[m
[31m-	 (LJ_HASFFI && (ira->o == IR_CNEW || ira->o == IR_CNEWI))) &&[m
[31m-	ra_used(ira))[m
[31m-      as->gcsteps++;[m
[31m-  if (as->gcsteps)[m
[31m-    asm_gc_check(as);[m
[31m-  as->gcsteps = 0x80000000;  /* Prevent implicit GC check further up. */[m
[31m-}[m
[31m-[m
[31m-/* -- Buffer operations --------------------------------------------------- */[m
[31m-[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref);[m
[31m-[m
[31m-static void asm_bufhdr(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg sb = ra_dest(as, ir, RSET_GPR);[m
[31m-  if ((ir->op2 & IRBUFHDR_APPEND)) {[m
[31m-    /* Rematerialize const buffer pointer instead of likely spill. */[m
[31m-    IRIns *irp = IR(ir->op1);[m
[31m-    if (!(ra_hasreg(irp->r) || irp == ir-1 ||[m
[31m-	  (irp == ir-2 && !ra_used(ir-1)))) {[m
[31m-      while (!(irp->o == IR_BUFHDR && !(irp->op2 & IRBUFHDR_APPEND)))[m
[31m-	irp = IR(irp->op1);[m
[31m-      if (irref_isk(irp->op1)) {[m
[31m-	ra_weak(as, ra_allocref(as, ir->op1, RSET_GPR));[m
[31m-	ir = irp;[m
[31m-      }[m
[31m-    }[m
[31m-  } else {[m
[31m-    Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, sb));[m
[31m-    /* Passing ir isn't strictly correct, but it's an IRT_P32, too. */[m
[31m-    emit_storeofs(as, ir, tmp, sb, offsetof(SBuf, p));[m
[31m-    emit_loadofs(as, ir, tmp, sb, offsetof(SBuf, b));[m
[31m-  }[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  ra_left(as, sb, ir->op1);[m
[31m-#else[m
[31m-  ra_leftov(as, sb, ir->op1);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static void asm_bufput(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_buf_putstr];[m
[31m-  IRRef args[3];[m
[31m-  IRIns *irs;[m
[31m-  int kchar = -1;[m
[31m-  args[0] = ir->op1;  /* SBuf * */[m
[31m-  args[1] = ir->op2;  /* GCstr * */[m
[31m-  irs = IR(ir->op2);[m
[31m-  lua_assert(irt_isstr(irs->t));[m
[31m-  if (irs->o == IR_KGC) {[m
[31m-    GCstr *s = ir_kstr(irs);[m
[31m-    if (s->len == 1) {  /* Optimize put of single-char string constant. */[m
[31m-      kchar = strdata(s)[0];[m
[31m-      args[1] = ASMREF_TMP1;  /* int, truncated to char */[m
[31m-      ci = &lj_ir_callinfo[IRCALL_lj_buf_putchar];[m
[31m-    }[m
[31m-  } else if (mayfuse(as, ir->op2) && ra_noreg(irs->r)) {[m
[31m-    if (irs->o == IR_TOSTR) {  /* Fuse number to string conversions. */[m
[31m-      if (irs->op2 == IRTOSTR_NUM) {[m
[31m-	args[1] = ASMREF_TMP1;  /* TValue * */[m
[31m-	ci = &lj_ir_callinfo[IRCALL_lj_strfmt_putnum];[m
[31m-      } else {[m
[31m-	lua_assert(irt_isinteger(IR(irs->op1)->t));[m
[31m-	args[1] = irs->op1;  /* int */[m
[31m-	if (irs->op2 == IRTOSTR_INT)[m
[31m-	  ci = &lj_ir_callinfo[IRCALL_lj_strfmt_putint];[m
[31m-	else[m
[31m-	  ci = &lj_ir_callinfo[IRCALL_lj_buf_putchar];[m
[31m-      }[m
[31m-    } else if (irs->o == IR_SNEW) {  /* Fuse string allocation. */[m
[31m-      args[1] = irs->op1;  /* const void * */[m
[31m-      args[2] = irs->op2;  /* MSize */[m
[31m-      ci = &lj_ir_callinfo[IRCALL_lj_buf_putmem];[m
[31m-    }[m
[31m-  }[m
[31m-  asm_setupresult(as, ir, ci);  /* SBuf * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  if (args[1] == ASMREF_TMP1) {[m
[31m-    Reg tmp = ra_releasetmp(as, ASMREF_TMP1);[m
[31m-    if (kchar == -1)[m
[31m-      asm_tvptr(as, tmp, irs->op1);[m
[31m-    else[m
[31m-      ra_allockreg(as, kchar, tmp);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_bufstr(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_buf_tostr];[m
[31m-  IRRef args[1];[m
[31m-  args[0] = ir->op1;  /* SBuf *sb */[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCstr * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-static void asm_tostr(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci;[m
[31m-  IRRef args[2];[m
[31m-  args[0] = ASMREF_L;[m
[31m-  as->gcsteps++;[m
[31m-  if (ir->op2 == IRTOSTR_NUM) {[m
[31m-    args[1] = ASMREF_TMP1;  /* cTValue * */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_strfmt_num];[m
[31m-  } else {[m
[31m-    args[1] = ir->op1;  /* int32_t k */[m
[31m-    if (ir->op2 == IRTOSTR_INT)[m
[31m-      ci = &lj_ir_callinfo[IRCALL_lj_strfmt_int];[m
[31m-    else[m
[31m-      ci = &lj_ir_callinfo[IRCALL_lj_strfmt_char];[m
[31m-  }[m
[31m-  asm_setupresult(as, ir, ci);  /* GCstr * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  if (ir->op2 == IRTOSTR_NUM)[m
[31m-    asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op1);[m
[31m-}[m
[31m-[m
[31m-#if LJ_32 && LJ_HASFFI && !LJ_SOFTFP && !LJ_TARGET_X86[m
[31m-static void asm_conv64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK);[m
[31m-  IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH);[m
[31m-  IRCallID id;[m
[31m-  IRRef args[2];[m
[31m-  lua_assert((ir-1)->o == IR_CONV && ir->o == IR_HIOP);[m
[31m-  args[LJ_BE] = (ir-1)->op1;[m
[31m-  args[LJ_LE] = ir->op1;[m
[31m-  if (st == IRT_NUM || st == IRT_FLOAT) {[m
[31m-    id = IRCALL_fp64_d2l + ((st == IRT_FLOAT) ? 2 : 0) + (dt - IRT_I64);[m
[31m-    ir--;[m
[31m-  } else {[m
[31m-    id = IRCALL_fp64_l2d + ((dt == IRT_FLOAT) ? 2 : 0) + (st - IRT_I64);[m
[31m-  }[m
[31m-  {[m
[31m-#if LJ_TARGET_ARM && !LJ_ABI_SOFTFP[m
[31m-    CCallInfo cim = lj_ir_callinfo[id], *ci = &cim;[m
[31m-    cim.flags |= CCI_VARARG;  /* These calls don't use the hard-float ABI! */[m
[31m-#else[m
[31m-    const CCallInfo *ci = &lj_ir_callinfo[id];[m
[31m-#endif[m
[31m-    asm_setupresult(as, ir, ci);[m
[31m-    asm_gencall(as, ci, args);[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-static void asm_newref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_newkey];[m
[31m-  IRRef args[3];[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ir->op1;      /* GCtab *t     */[m
[31m-  args[2] = ASMREF_TMP1;  /* cTValue *key */[m
[31m-  asm_setupresult(as, ir, ci);  /* TValue * */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op2);[m
[31m-}[m
[31m-[m
[31m-static void asm_lref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg r = ra_dest(as, ir, RSET_GPR);[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  ra_left(as, r, ASMREF_L);[m
[31m-#else[m
[31m-  ra_leftov(as, r, ASMREF_L);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Collect arguments from CALL* and CARG instructions. */[m
[31m-static void asm_collectargs(ASMState *as, IRIns *ir,[m
[31m-			    const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n = CCI_XNARGS(ci);[m
[31m-  lua_assert(n <= CCI_NARGS_MAX*2);  /* Account for split args. */[m
[31m-  if ((ci->flags & CCI_L)) { *args++ = ASMREF_L; n--; }[m
[31m-  while (n-- > 1) {[m
[31m-    ir = IR(ir->op1);[m
[31m-    lua_assert(ir->o == IR_CARG);[m
[31m-    args[n] = ir->op2 == REF_NIL ? 0 : ir->op2;[m
[31m-  }[m
[31m-  args[0] = ir->op1 == REF_NIL ? 0 : ir->op1;[m
[31m-  lua_assert(IR(ir->op1)->o != IR_CARG);[m
[31m-}[m
[31m-[m
[31m-/* Reconstruct CCallInfo flags for CALLX*. */[m
[31m-static uint32_t asm_callx_flags(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  uint32_t nargs = 0;[m
[31m-  if (ir->op1 != REF_NIL) {  /* Count number of arguments first. */[m
[31m-    IRIns *ira = IR(ir->op1);[m
[31m-    nargs++;[m
[31m-    while (ira->o == IR_CARG) { nargs++; ira = IR(ira->op1); }[m
[31m-  }[m
[31m-#if LJ_HASFFI[m
[31m-  if (IR(ir->op2)->o == IR_CARG) {  /* Copy calling convention info. */[m
[31m-    CTypeID id = (CTypeID)IR(IR(ir->op2)->op2)->i;[m
[31m-    CType *ct = ctype_get(ctype_ctsG(J2G(as->J)), id);[m
[31m-    nargs |= ((ct->info & CTF_VARARG) ? CCI_VARARG : 0);[m
[31m-#if LJ_TARGET_X86[m
[31m-    nargs |= (ctype_cconv(ct->info) << CCI_CC_SHIFT);[m
[31m-#endif[m
[31m-  }[m
[31m-#endif[m
[31m-  return (nargs | (ir->t.irt << CCI_OTSHIFT));[m
[31m-}[m
[31m-[m
[31m-static void asm_callid(ASMState *as, IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[id];[m
[31m-  IRRef args[2];[m
[31m-  args[0] = ir->op1;[m
[31m-  args[1] = ir->op2;[m
[31m-  asm_setupresult(as, ir, ci);[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-static void asm_call(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX];[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[ir->op2];[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  asm_setupresult(as, ir, ci);[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_fppow(ASMState *as, IRIns *ir, IRRef lref, IRRef rref)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_pow];[m
[31m-  IRRef args[2];[m
[31m-  args[0] = lref;[m
[31m-  args[1] = rref;[m
[31m-  asm_setupresult(as, ir, ci);[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-[m
[31m-static int asm_fpjoin_pow(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *irp = IR(ir->op1);[m
[31m-  if (irp == ir-1 && irp->o == IR_MUL && !ra_used(irp)) {[m
[31m-    IRIns *irpp = IR(irp->op1);[m
[31m-    if (irpp == ir-2 && irpp->o == IR_FPMATH &&[m
[31m-	irpp->op2 == IRFPM_LOG2 && !ra_used(irpp)) {[m
[31m-      asm_fppow(as, ir, irpp->op1, irp->op2);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- PHI and loop handling ----------------------------------------------- */[m
[31m-[m
[31m-/* Break a PHI cycle by renaming to a free register (evict if needed). */[m
[31m-static void asm_phi_break(ASMState *as, RegSet blocked, RegSet blockedby,[m
[31m-			  RegSet allow)[m
[31m-{[m
[31m-  RegSet candidates = blocked & allow;[m
[31m-  if (candidates) {  /* If this register file has candidates. */[m
[31m-    /* Note: the set for ra_pick cannot be empty, since each register file[m
[31m-    ** has some registers never allocated to PHIs.[m
[31m-    */[m
[31m-    Reg down, up = ra_pick(as, ~blocked & allow);  /* Get a free register. */[m
[31m-    if (candidates & ~blockedby)  /* Optimize shifts, else it's a cycle. */[m
[31m-      candidates = candidates & ~blockedby;[m
[31m-    down = rset_picktop(candidates);  /* Pick candidate PHI register. */[m
[31m-    ra_rename(as, down, up);  /* And rename it to the free register. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* PHI register shuffling.[m
[31m-**[m
[31m-** The allocator tries hard to preserve PHI register assignments across[m
[31m-** the loop body. Most of the time this loop does nothing, since there[m
[31m-** are no register mismatches.[m
[31m-**[m
[31m-** If a register mismatch is detected and ...[m
[31m-** - the register is currently free: rename it.[m
[31m-** - the register is blocked by an invariant: restore/remat and rename it.[m
[31m-** - Otherwise the register is used by another PHI, so mark it as blocked.[m
[31m-**[m
[31m-** The renames are order-sensitive, so just retry the loop if a register[m
[31m-** is marked as blocked, but has been freed in the meantime. A cycle is[m
[31m-** detected if all of the blocked registers are allocated. To break the[m
[31m-** cycle rename one of them to a free register and retry.[m
[31m-**[m
[31m-** Note that PHI spill slots are kept in sync and don't need to be shuffled.[m
[31m-*/[m
[31m-static void asm_phi_shuffle(ASMState *as)[m
[31m-{[m
[31m-  RegSet work;[m
[31m-[m
[31m-  /* Find and resolve PHI register mismatches. */[m
[31m-  for (;;) {[m
[31m-    RegSet blocked = RSET_EMPTY;[m
[31m-    RegSet blockedby = RSET_EMPTY;[m
[31m-    RegSet phiset = as->phiset;[m
[31m-    while (phiset) {  /* Check all left PHI operand registers. */[m
[31m-      Reg r = rset_pickbot(phiset);[m
[31m-      IRIns *irl = IR(as->phireg[r]);[m
[31m-      Reg left = irl->r;[m
[31m-      if (r != left) {  /* Mismatch? */[m
[31m-	if (!rset_test(as->freeset, r)) {  /* PHI register blocked? */[m
[31m-	  IRRef ref = regcost_ref(as->cost[r]);[m
[31m-	  /* Blocked by other PHI (w/reg)? */[m
[31m-	  if (!ra_iskref(ref) && irt_ismarked(IR(ref)->t)) {[m
[31m-	    rset_set(blocked, r);[m
[31m-	    if (ra_hasreg(left))[m
[31m-	      rset_set(blockedby, left);[m
[31m-	    left = RID_NONE;[m
[31m-	  } else {  /* Otherwise grab register from invariant. */[m
[31m-	    ra_restore(as, ref);[m
[31m-	    checkmclim(as);[m
[31m-	  }[m
[31m-	}[m
[31m-	if (ra_hasreg(left)) {[m
[31m-	  ra_rename(as, left, r);[m
[31m-	  checkmclim(as);[m
[31m-	}[m
[31m-      }[m
[31m-      rset_clear(phiset, r);[m
[31m-    }[m
[31m-    if (!blocked) break;  /* Finished. */[m
[31m-    if (!(as->freeset & blocked)) {  /* Break cycles if none are free. */[m
[31m-      asm_phi_break(as, blocked, blockedby, RSET_GPR);[m
[31m-      if (!LJ_SOFTFP) asm_phi_break(as, blocked, blockedby, RSET_FPR);[m
[31m-      checkmclim(as);[m
[31m-    }  /* Else retry some more renames. */[m
[31m-  }[m
[31m-[m
[31m-  /* Restore/remat invariants whose registers are modified inside the loop. */[m
[31m-#if !LJ_SOFTFP[m
[31m-  work = as->modset & ~(as->freeset | as->phiset) & RSET_FPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    rset_clear(work, r);[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-#endif[m
[31m-  work = as->modset & ~(as->freeset | as->phiset);[m
[31m-  while (work) {[m
[31m-    Reg r = rset_pickbot(work);[m
[31m-    ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    rset_clear(work, r);[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-[m
[31m-  /* Allocate and save all unsaved PHI regs and clear marks. */[m
[31m-  work = as->phiset;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef lref = as->phireg[r];[m
[31m-    IRIns *ir = IR(lref);[m
[31m-    if (ra_hasspill(ir->s)) {  /* Left PHI gained a spill slot? */[m
[31m-      irt_clearmark(ir->t);  /* Handled here, so clear marker now. */[m
[31m-      ra_alloc1(as, lref, RID2RSET(r));[m
[31m-      ra_save(as, ir, r);  /* Save to spill slot inside the loop. */[m
[31m-      checkmclim(as);[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Copy unsynced left/right PHI spill slots. Rarely needed. */[m
[31m-static void asm_phi_copyspill(ASMState *as)[m
[31m-{[m
[31m-  int need = 0;[m
[31m-  IRIns *ir;[m
[31m-  for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--)[m
[31m-    if (ra_hasspill(ir->s) && ra_hasspill(IR(ir->op1)->s))[m
[31m-      need |= irt_isfp(ir->t) ? 2 : 1;  /* Unsynced spill slot? */[m
[31m-  if ((need & 1)) {  /* Copy integer spill slots. */[m
[31m-#if !LJ_TARGET_X86ORX64[m
[31m-    Reg r = RID_TMP;[m
[31m-#else[m
[31m-    Reg r = RID_RET;[m
[31m-    if ((as->freeset & RSET_GPR))[m
[31m-      r = rset_pickbot((as->freeset & RSET_GPR));[m
[31m-    else[m
[31m-      emit_spload(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);[m
[31m-#endif[m
[31m-    for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) {[m
[31m-      if (ra_hasspill(ir->s)) {[m
[31m-	IRIns *irl = IR(ir->op1);[m
[31m-	if (ra_hasspill(irl->s) && !irt_isfp(ir->t)) {[m
[31m-	  emit_spstore(as, irl, r, sps_scale(irl->s));[m
[31m-	  emit_spload(as, ir, r, sps_scale(ir->s));[m
[31m-	  checkmclim(as);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    if (!rset_test(as->freeset, r))[m
[31m-      emit_spstore(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);[m
[31m-#endif[m
[31m-  }[m
[31m-#if !LJ_SOFTFP[m
[31m-  if ((need & 2)) {  /* Copy FP spill slots. */[m
[31m-#if LJ_TARGET_X86[m
[31m-    Reg r = RID_XMM0;[m
[31m-#else[m
[31m-    Reg r = RID_FPRET;[m
[31m-#endif[m
[31m-    if ((as->freeset & RSET_FPR))[m
[31m-      r = rset_pickbot((as->freeset & RSET_FPR));[m
[31m-    if (!rset_test(as->freeset, r))[m
[31m-      emit_spload(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);[m
[31m-    for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) {[m
[31m-      if (ra_hasspill(ir->s)) {[m
[31m-	IRIns *irl = IR(ir->op1);[m
[31m-	if (ra_hasspill(irl->s) && irt_isfp(ir->t)) {[m
[31m-	  emit_spstore(as, irl, r, sps_scale(irl->s));[m
[31m-	  emit_spload(as, ir, r, sps_scale(ir->s));[m
[31m-	  checkmclim(as);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    if (!rset_test(as->freeset, r))[m
[31m-      emit_spstore(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Emit renames for left PHIs which are only spilled outside the loop. */[m
[31m-static void asm_phi_fixup(ASMState *as)[m
[31m-{[m
[31m-  RegSet work = as->phiset;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef lref = as->phireg[r];[m
[31m-    IRIns *ir = IR(lref);[m
[31m-    if (irt_ismarked(ir->t)) {[m
[31m-      irt_clearmark(ir->t);[m
[31m-      /* Left PHI gained a spill slot before the loop? */[m
[31m-      if (ra_hasspill(ir->s)) {[m
[31m-	IRRef ren;[m
[31m-	lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno);[m
[31m-	ren = tref_ref(lj_ir_emit(as->J));[m
[31m-	as->ir = as->T->ir;  /* The IR may have been reallocated. */[m
[31m-	IR(ren)->r = (uint8_t)r;[m
[31m-	IR(ren)->s = SPS_NONE;[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup right PHI reference. */[m
[31m-static void asm_phi(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = ((!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR) &[m
[31m-		 ~as->phiset;[m
[31m-  RegSet afree = (as->freeset & allow);[m
[31m-  IRIns *irl = IR(ir->op1);[m
[31m-  IRIns *irr = IR(ir->op2);[m
[31m-  if (ir->r == RID_SINK)  /* Sink PHI. */[m
[31m-    return;[m
[31m-  /* Spill slot shuffling is not implemented yet (but rarely needed). */[m
[31m-  if (ra_hasspill(irl->s) || ra_hasspill(irr->s))[m
[31m-    lj_trace_err(as->J, LJ_TRERR_NYIPHI);[m
[31m-  /* Leave at least one register free for non-PHIs (and PHI cycle breaking). */[m
[31m-  if ((afree & (afree-1))) {  /* Two or more free registers? */[m
[31m-    Reg r;[m
[31m-    if (ra_noreg(irr->r)) {  /* Get a register for the right PHI. */[m
[31m-      r = ra_allocref(as, ir->op2, allow);[m
[31m-    } else {  /* Duplicate right PHI, need a copy (rare). */[m
[31m-      r = ra_scratch(as, allow);[m
[31m-      emit_movrr(as, irr, r, irr->r);[m
[31m-    }[m
[31m-    ir->r = (uint8_t)r;[m
[31m-    rset_set(as->phiset, r);[m
[31m-    as->phireg[r] = (IRRef1)ir->op1;[m
[31m-    irt_setmark(irl->t);  /* Marks left PHIs _with_ register. */[m
[31m-    if (ra_noreg(irl->r))[m
[31m-      ra_sethint(irl->r, r); /* Set register hint for left PHI. */[m
[31m-  } else {  /* Otherwise allocate a spill slot. */[m
[31m-    /* This is overly restrictive, but it triggers only on synthetic code. */[m
[31m-    if (ra_hasreg(irl->r) || ra_hasreg(irr->r))[m
[31m-      lj_trace_err(as->J, LJ_TRERR_NYIPHI);[m
[31m-    ra_spill(as, ir);[m
[31m-    irr->s = ir->s;  /* Set right PHI spill slot. Sync left slot later. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_loop_fixup(ASMState *as);[m
[31m-[m
[31m-/* Middle part of a loop. */[m
[31m-static void asm_loop(ASMState *as)[m
[31m-{[m
[31m-  MCode *mcspill;[m
[31m-  /* LOOP is a guard, so the snapno is up to date. */[m
[31m-  as->loopsnapno = as->snapno;[m
[31m-  if (as->gcsteps)[m
[31m-    asm_gc_check(as);[m
[31m-  /* LOOP marks the transition from the variant to the invariant part. */[m
[31m-  as->flagmcp = as->invmcp = NULL;[m
[31m-  as->sectref = 0;[m
[31m-  if (!neverfuse(as)) as->fuseref = 0;[m
[31m-  asm_phi_shuffle(as);[m
[31m-  mcspill = as->mcp;[m
[31m-  asm_phi_copyspill(as);[m
[31m-  asm_loop_fixup(as);[m
[31m-  as->mcloop = as->mcp;[m
[31m-  RA_DBGX((as, "===== LOOP ====="));[m
[31m-  if (!as->realign) RA_DBG_FLUSH();[m
[31m-  if (as->mcp != mcspill)[m
[31m-    emit_jmp(as, mcspill);[m
[31m-}[m
[31m-[m
[31m-/* -- Target-specific assembler ------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#include "lj_asm_x86.h"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#include "lj_asm_arm.h"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#include "lj_asm_ppc.h"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#include "lj_asm_mips.h"[m
[31m-#else[m
[31m-#error "Missing assembler for target CPU"[m
[31m-#endif[m
[31m-[m
[31m-/* -- Instruction dispatch ------------------------------------------------ */[m
[31m-[m
[31m-/* Assemble a single instruction. */[m
[31m-static void asm_ir(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  switch ((IROp)ir->o) {[m
[31m-  /* Miscellaneous ops. */[m
[31m-  case IR_LOOP: asm_loop(as); break;[m
[31m-  case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break;[m
[31m-  case IR_USE:[m
[31m-    ra_alloc1(as, ir->op1, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); break;[m
[31m-  case IR_PHI: asm_phi(as, ir); break;[m
[31m-  case IR_HIOP: asm_hiop(as, ir); break;[m
[31m-  case IR_GCSTEP: asm_gcstep(as, ir); break;[m
[31m-  case IR_PROF: asm_prof(as, ir); break;[m
[31m-[m
[31m-  /* Guarded assertions. */[m
[31m-  case IR_LT: case IR_GE: case IR_LE: case IR_GT:[m
[31m-  case IR_ULT: case IR_UGE: case IR_ULE: case IR_UGT:[m
[31m-  case IR_ABC:[m
[31m-    asm_comp(as, ir);[m
[31m-    break;[m
[31m-  case IR_EQ: case IR_NE:[m
[31m-    if ((ir-1)->o == IR_HREF && ir->op1 == as->curins-1) {[m
[31m-      as->curins--;[m
[31m-      asm_href(as, ir-1, (IROp)ir->o);[m
[31m-    } else {[m
[31m-      asm_equal(as, ir);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case IR_RETF: asm_retf(as, ir); break;[m
[31m-[m
[31m-  /* Bit ops. */[m
[31m-  case IR_BNOT: asm_bnot(as, ir); break;[m
[31m-  case IR_BSWAP: asm_bswap(as, ir); break;[m
[31m-  case IR_BAND: asm_band(as, ir); break;[m
[31m-  case IR_BOR: asm_bor(as, ir); break;[m
[31m-  case IR_BXOR: asm_bxor(as, ir); break;[m
[31m-  case IR_BSHL: asm_bshl(as, ir); break;[m
[31m-  case IR_BSHR: asm_bshr(as, ir); break;[m
[31m-  case IR_BSAR: asm_bsar(as, ir); break;[m
[31m-  case IR_BROL: asm_brol(as, ir); break;[m
[31m-  case IR_BROR: asm_bror(as, ir); break;[m
[31m-[m
[31m-  /* Arithmetic ops. */[m
[31m-  case IR_ADD: asm_add(as, ir); break;[m
[31m-  case IR_SUB: asm_sub(as, ir); break;[m
[31m-  case IR_MUL: asm_mul(as, ir); break;[m
[31m-  case IR_MOD: asm_mod(as, ir); break;[m
[31m-  case IR_NEG: asm_neg(as, ir); break;[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_DIV: case IR_POW: case IR_ABS:[m
[31m-  case IR_ATAN2: case IR_LDEXP: case IR_FPMATH: case IR_TOBIT:[m
[31m-    lua_assert(0);  /* Unused for LJ_SOFTFP. */[m
[31m-    break;[m
[31m-#else[m
[31m-  case IR_DIV: asm_div(as, ir); break;[m
[31m-  case IR_POW: asm_pow(as, ir); break;[m
[31m-  case IR_ABS: asm_abs(as, ir); break;[m
[31m-  case IR_ATAN2: asm_atan2(as, ir); break;[m
[31m-  case IR_LDEXP: asm_ldexp(as, ir); break;[m
[31m-  case IR_FPMATH: asm_fpmath(as, ir); break;[m
[31m-  case IR_TOBIT: asm_tobit(as, ir); break;[m
[31m-#endif[m
[31m-  case IR_MIN: asm_min(as, ir); break;[m
[31m-  case IR_MAX: asm_max(as, ir); break;[m
[31m-[m
[31m-  /* Overflow-checking arithmetic ops. */[m
[31m-  case IR_ADDOV: asm_addov(as, ir); break;[m
[31m-  case IR_SUBOV: asm_subov(as, ir); break;[m
[31m-  case IR_MULOV: asm_mulov(as, ir); break;[m
[31m-[m
[31m-  /* Memory references. */[m
[31m-  case IR_AREF: asm_aref(as, ir); break;[m
[31m-  case IR_HREF: asm_href(as, ir, 0); break;[m
[31m-  case IR_HREFK: asm_hrefk(as, ir); break;[m
[31m-  case IR_NEWREF: asm_newref(as, ir); break;[m
[31m-  case IR_UREFO: case IR_UREFC: asm_uref(as, ir); break;[m
[31m-  case IR_FREF: asm_fref(as, ir); break;[m
[31m-  case IR_STRREF: asm_strref(as, ir); break;[m
[31m-  case IR_LREF: asm_lref(as, ir); break;[m
[31m-[m
[31m-  /* Loads and stores. */[m
[31m-  case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-    asm_ahuvload(as, ir);[m
[31m-    break;[m
[31m-  case IR_FLOAD: asm_fload(as, ir); break;[m
[31m-  case IR_XLOAD: asm_xload(as, ir); break;[m
[31m-  case IR_SLOAD: asm_sload(as, ir); break;[m
[31m-[m
[31m-  case IR_ASTORE: case IR_HSTORE: case IR_USTORE: asm_ahustore(as, ir); break;[m
[31m-  case IR_FSTORE: asm_fstore(as, ir); break;[m
[31m-  case IR_XSTORE: asm_xstore(as, ir); break;[m
[31m-[m
[31m-  /* Allocations. */[m
[31m-  case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break;[m
[31m-  case IR_TNEW: asm_tnew(as, ir); break;[m
[31m-  case IR_TDUP: asm_tdup(as, ir); break;[m
[31m-  case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break;[m
[31m-[m
[31m-  /* Buffer operations. */[m
[31m-  case IR_BUFHDR: asm_bufhdr(as, ir); break;[m
[31m-  case IR_BUFPUT: asm_bufput(as, ir); break;[m
[31m-  case IR_BUFSTR: asm_bufstr(as, ir); break;[m
[31m-[m
[31m-  /* Write barriers. */[m
[31m-  case IR_TBAR: asm_tbar(as, ir); break;[m
[31m-  case IR_OBAR: asm_obar(as, ir); break;[m
[31m-[m
[31m-  /* Type conversions. */[m
[31m-  case IR_CONV: asm_conv(as, ir); break;[m
[31m-  case IR_TOSTR: asm_tostr(as, ir); break;[m
[31m-  case IR_STRTO: asm_strto(as, ir); break;[m
[31m-[m
[31m-  /* Calls. */[m
[31m-  case IR_CALLA:[m
[31m-    as->gcsteps++;[m
[31m-    /* fallthrough */[m
[31m-  case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break;[m
[31m-  case IR_CALLXS: asm_callx(as, ir); break;[m
[31m-  case IR_CARG: break;[m
[31m-[m
[31m-  default:[m
[31m-    setintV(&as->J->errinfo, ir->o);[m
[31m-    lj_trace_err_info(as->J, LJ_TRERR_NYIIR);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Head of a root trace. */[m
[31m-static void asm_head_root(ASMState *as)[m
[31m-{[m
[31m-  int32_t spadj;[m
[31m-  asm_head_root_base(as);[m
[31m-  emit_setvmstate(as, (int32_t)as->T->traceno);[m
[31m-  spadj = asm_stack_adjust(as);[m
[31m-  as->T->spadjust = (uint16_t)spadj;[m
[31m-  emit_spsub(as, spadj);[m
[31m-  /* Root traces assume a checked stack for the starting proto. */[m
[31m-  as->T->topslot = gcref(as->T->startpt)->pt.framesize;[m
[31m-}[m
[31m-[m
[31m-/* Head of a side trace.[m
[31m-**[m
[31m-** The current simplistic algorithm requires that all slots inherited[m
[31m-** from the parent are live in a register between pass 2 and pass 3. This[m
[31m-** avoids the complexity of stack slot shuffling. But of course this may[m
[31m-** overflow the register set in some cases and cause the dreaded error:[m
[31m-** "NYI: register coalescing too complex". A refined algorithm is needed.[m
[31m-*/[m
[31m-static void asm_head_side(ASMState *as)[m
[31m-{[m
[31m-  IRRef1 sloadins[RID_MAX];[m
[31m-  RegSet allow = RSET_ALL;  /* Inverse of all coalesced registers. */[m
[31m-  RegSet live = RSET_EMPTY;  /* Live parent registers. */[m
[31m-  IRIns *irp = &as->parent->ir[REF_BASE];  /* Parent base. */[m
[31m-  int32_t spadj, spdelta;[m
[31m-  int pass2 = 0;[m
[31m-  int pass3 = 0;[m
[31m-  IRRef i;[m
[31m-[m
[31m-  if (as->snapno && as->topslot > as->parent->topslot) {[m
[31m-    /* Force snap #0 alloc to prevent register overwrite in stack check. */[m
[31m-    as->snapno = 0;[m
[31m-    asm_snap_alloc(as);[m
[31m-  }[m
[31m-  allow = asm_head_side_base(as, irp, allow);[m
[31m-[m
[31m-  /* Scan all parent SLOADs and collect register dependencies. */[m
[31m-  for (i = as->stopins; i > REF_BASE; i--) {[m
[31m-    IRIns *ir = IR(i);[m
[31m-    RegSP rs;[m
[31m-    lua_assert((ir->o == IR_SLOAD && (ir->op2 & IRSLOAD_PARENT)) ||[m
[31m-	       (LJ_SOFTFP && ir->o == IR_HIOP) || ir->o == IR_PVAL);[m
[31m-    rs = as->parentmap[i - REF_FIRST];[m
[31m-    if (ra_hasreg(ir->r)) {[m
[31m-      rset_clear(allow, ir->r);[m
[31m-      if (ra_hasspill(ir->s)) {[m
[31m-	ra_save(as, ir, ir->r);[m
[31m-	checkmclim(as);[m
[31m-      }[m
[31m-    } else if (ra_hasspill(ir->s)) {[m
[31m-      irt_setmark(ir->t);[m
[31m-      pass2 = 1;[m
[31m-    }[m
[31m-    if (ir->r == rs) {  /* Coalesce matching registers right now. */[m
[31m-      ra_free(as, ir->r);[m
[31m-    } else if (ra_hasspill(regsp_spill(rs))) {[m
[31m-      if (ra_hasreg(ir->r))[m
[31m-	pass3 = 1;[m
[31m-    } else if (ra_used(ir)) {[m
[31m-      sloadins[rs] = (IRRef1)i;[m
[31m-      rset_set(live, rs);  /* Block live parent register. */[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Calculate stack frame adjustment. */[m
[31m-  spadj = asm_stack_adjust(as);[m
[31m-  spdelta = spadj - (int32_t)as->parent->spadjust;[m
[31m-  if (spdelta < 0) {  /* Don't shrink the stack frame. */[m
[31m-    spadj = (int32_t)as->parent->spadjust;[m
[31m-    spdelta = 0;[m
[31m-  }[m
[31m-  as->T->spadjust = (uint16_t)spadj;[m
[31m-[m
[31m-  /* Reload spilled target registers. */[m
[31m-  if (pass2) {[m
[31m-    for (i = as->stopins; i > REF_BASE; i--) {[m
[31m-      IRIns *ir = IR(i);[m
[31m-      if (irt_ismarked(ir->t)) {[m
[31m-	RegSet mask;[m
[31m-	Reg r;[m
[31m-	RegSP rs;[m
[31m-	irt_clearmark(ir->t);[m
[31m-	rs = as->parentmap[i - REF_FIRST];[m
[31m-	if (!ra_hasspill(regsp_spill(rs)))[m
[31m-	  ra_sethint(ir->r, rs);  /* Hint may be gone, set it again. */[m
[31m-	else if (sps_scale(regsp_spill(rs))+spdelta == sps_scale(ir->s))[m
[31m-	  continue;  /* Same spill slot, do nothing. */[m
[31m-	mask = ((!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR) & allow;[m
[31m-	if (mask == RSET_EMPTY)[m
[31m-	  lj_trace_err(as->J, LJ_TRERR_NYICOAL);[m
[31m-	r = ra_allocref(as, i, mask);[m
[31m-	ra_save(as, ir, r);[m
[31m-	rset_clear(allow, r);[m
[31m-	if (r == rs) {  /* Coalesce matching registers right now. */[m
[31m-	  ra_free(as, r);[m
[31m-	  rset_clear(live, r);[m
[31m-	} else if (ra_hasspill(regsp_spill(rs))) {[m
[31m-	  pass3 = 1;[m
[31m-	}[m
[31m-	checkmclim(as);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Store trace number and adjust stack frame relative to the parent. */[m
[31m-  emit_setvmstate(as, (int32_t)as->T->traceno);[m
[31m-  emit_spsub(as, spdelta);[m
[31m-[m
[31m-#if !LJ_TARGET_X86ORX64[m
[31m-  /* Restore BASE register from parent spill slot. */[m
[31m-  if (ra_hasspill(irp->s))[m
[31m-    emit_spload(as, IR(REF_BASE), IR(REF_BASE)->r, sps_scale(irp->s));[m
[31m-#endif[m
[31m-[m
[31m-  /* Restore target registers from parent spill slots. */[m
[31m-  if (pass3) {[m
[31m-    RegSet work = ~as->freeset & RSET_ALL;[m
[31m-    while (work) {[m
[31m-      Reg r = rset_pickbot(work);[m
[31m-      IRRef ref = regcost_ref(as->cost[r]);[m
[31m-      RegSP rs = as->parentmap[ref - REF_FIRST];[m
[31m-      rset_clear(work, r);[m
[31m-      if (ra_hasspill(regsp_spill(rs))) {[m
[31m-	int32_t ofs = sps_scale(regsp_spill(rs));[m
[31m-	ra_free(as, r);[m
[31m-	emit_spload(as, IR(ref), r, ofs);[m
[31m-	checkmclim(as);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Shuffle registers to match up target regs with parent regs. */[m
[31m-  for (;;) {[m
[31m-    RegSet work;[m
[31m-[m
[31m-    /* Repeatedly coalesce free live registers by moving to their target. */[m
[31m-    while ((work = as->freeset & live) != RSET_EMPTY) {[m
[31m-      Reg rp = rset_pickbot(work);[m
[31m-      IRIns *ir = IR(sloadins[rp]);[m
[31m-      rset_clear(live, rp);[m
[31m-      rset_clear(allow, rp);[m
[31m-      ra_free(as, ir->r);[m
[31m-      emit_movrr(as, ir, ir->r, rp);[m
[31m-      checkmclim(as);[m
[31m-    }[m
[31m-[m
[31m-    /* We're done if no live registers remain. */[m
[31m-    if (live == RSET_EMPTY)[m
[31m-      break;[m
[31m-[m
[31m-    /* Break cycles by renaming one target to a temp. register. */[m
[31m-    if (live & RSET_GPR) {[m
[31m-      RegSet tmpset = as->freeset & ~live & allow & RSET_GPR;[m
[31m-      if (tmpset == RSET_EMPTY)[m
[31m-	lj_trace_err(as->J, LJ_TRERR_NYICOAL);[m
[31m-      ra_rename(as, rset_pickbot(live & RSET_GPR), rset_pickbot(tmpset));[m
[31m-    }[m
[31m-    if (!LJ_SOFTFP && (live & RSET_FPR)) {[m
[31m-      RegSet tmpset = as->freeset & ~live & allow & RSET_FPR;[m
[31m-      if (tmpset == RSET_EMPTY)[m
[31m-	lj_trace_err(as->J, LJ_TRERR_NYICOAL);[m
[31m-      ra_rename(as, rset_pickbot(live & RSET_FPR), rset_pickbot(tmpset));[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-    /* Continue with coalescing to fix up the broken cycle(s). */[m
[31m-  }[m
[31m-[m
[31m-  /* Inherit top stack slot already checked by parent trace. */[m
[31m-  as->T->topslot = as->parent->topslot;[m
[31m-  if (as->topslot > as->T->topslot) {  /* Need to check for higher slot? */[m
[31m-#ifdef EXITSTATE_CHECKEXIT[m
[31m-    /* Highest exit + 1 indicates stack check. */[m
[31m-    ExitNo exitno = as->T->nsnap;[m
[31m-#else[m
[31m-    /* Reuse the parent exit in the context of the parent trace. */[m
[31m-    ExitNo exitno = as->J->exitno;[m
[31m-#endif[m
[31m-    as->T->topslot = (uint8_t)as->topslot;  /* Remember for child traces. */[m
[31m-    asm_stack_check(as, as->topslot, irp, allow & RSET_GPR, exitno);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Get base slot for a snapshot. */[m
[31m-static BCReg asm_baseslot(ASMState *as, SnapShot *snap, int *gotframe)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  MSize n;[m
[31m-  for (n = snap->nent; n > 0; n--) {[m
[31m-    SnapEntry sn = map[n-1];[m
[31m-    if ((sn & SNAP_FRAME)) {[m
[31m-      *gotframe = 1;[m
[31m-      return snap_slot(sn);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Link to another trace. */[m
[31m-static void asm_tail_link(ASMState *as)[m
[31m-{[m
[31m-  SnapNo snapno = as->T->nsnap-1;  /* Last snapshot. */[m
[31m-  SnapShot *snap = &as->T->snap[snapno];[m
[31m-  int gotframe = 0;[m
[31m-  BCReg baseslot = asm_baseslot(as, snap, &gotframe);[m
[31m-[m
[31m-  as->topslot = snap->topslot;[m
[31m-  checkmclim(as);[m
[31m-  ra_allocref(as, REF_BASE, RID2RSET(RID_BASE));[m
[31m-[m
[31m-  if (as->T->link == 0) {[m
[31m-    /* Setup fixed registers for exit to interpreter. */[m
[31m-    const BCIns *pc = snap_pc(as->T->snapmap[snap->mapofs + snap->nent]);[m
[31m-    int32_t mres;[m
[31m-    if (bc_op(*pc) == BC_JLOOP) {  /* NYI: find a better way to do this. */[m
[31m-      BCIns *retpc = &traceref(as->J, bc_d(*pc))->startins;[m
[31m-      if (bc_isret(bc_op(*retpc)))[m
[31m-	pc = retpc;[m
[31m-    }[m
[31m-    ra_allockreg(as, i32ptr(J2GG(as->J)->dispatch), RID_DISPATCH);[m
[31m-    ra_allockreg(as, i32ptr(pc), RID_LPC);[m
[31m-    mres = (int32_t)(snap->nslots - baseslot);[m
[31m-    switch (bc_op(*pc)) {[m
[31m-    case BC_CALLM: case BC_CALLMT:[m
[31m-      mres -= (int32_t)(1 + LJ_FR2 + bc_a(*pc) + bc_c(*pc)); break;[m
[31m-    case BC_RETM: mres -= (int32_t)(bc_a(*pc) + bc_d(*pc)); break;[m
[31m-    case BC_TSETM: mres -= (int32_t)bc_a(*pc); break;[m
[31m-    default: if (bc_op(*pc) < BC_FUNCF) mres = 0; break;[m
[31m-    }[m
[31m-    ra_allockreg(as, mres, RID_RET);  /* Return MULTRES or 0. */[m
[31m-  } else if (baseslot) {[m
[31m-    /* Save modified BASE for linking to trace with higher start frame. */[m
[31m-    emit_setgl(as, RID_BASE, jit_base);[m
[31m-  }[m
[31m-  emit_addptr(as, RID_BASE, 8*(int32_t)baseslot);[m
[31m-[m
[31m-  /* Sync the interpreter state with the on-trace state. */[m
[31m-  asm_stack_restore(as, snap);[m
[31m-[m
[31m-  /* Root traces that add frames need to check the stack at the end. */[m
[31m-  if (!as->parent && gotframe)[m
[31m-    asm_stack_check(as, as->topslot, NULL, as->freeset & RSET_GPR, snapno);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Clear reg/sp for all instructions and add register hints. */[m
[31m-static void asm_setup_regsp(ASMState *as)[m
[31m-{[m
[31m-  GCtrace *T = as->T;[m
[31m-  int sink = T->sinktags;[m
[31m-  IRRef nins = T->nins;[m
[31m-  IRIns *ir, *lastir;[m
[31m-  int inloop;[m
[31m-#if LJ_TARGET_ARM[m
[31m-  uint32_t rload = 0xa6402a64;[m
[31m-#endif[m
[31m-[m
[31m-  ra_setup(as);[m
[31m-[m
[31m-  /* Clear reg/sp for constants. */[m
[31m-  for (ir = IR(T->nk), lastir = IR(REF_BASE); ir < lastir; ir++)[m
[31m-    ir->prev = REGSP_INIT;[m
[31m-[m
[31m-  /* REF_BASE is used for implicit references to the BASE register. */[m
[31m-  lastir->prev = REGSP_HINT(RID_BASE);[m
[31m-[m
[31m-  ir = IR(nins-1);[m
[31m-  if (ir->o == IR_RENAME) {[m
[31m-    do { ir--; nins--; } while (ir->o == IR_RENAME);[m
[31m-    T->nins = nins;  /* Remove any renames left over from ASM restart. */[m
[31m-  }[m
[31m-  as->snaprename = nins;[m
[31m-  as->snapref = nins;[m
[31m-  as->snapno = T->nsnap;[m
[31m-[m
[31m-  as->stopins = REF_BASE;[m
[31m-  as->orignins = nins;[m
[31m-  as->curins = nins;[m
[31m-[m
[31m-  /* Setup register hints for parent link instructions. */[m
[31m-  ir = IR(REF_FIRST);[m
[31m-  if (as->parent) {[m
[31m-    uint16_t *p;[m
[31m-    lastir = lj_snap_regspmap(as->parent, as->J->exitno, ir);[m
[31m-    if (lastir - ir > LJ_MAX_JSLOTS)[m
[31m-      lj_trace_err(as->J, LJ_TRERR_NYICOAL);[m
[31m-    as->stopins = (IRRef)((lastir-1) - as->ir);[m
[31m-    for (p = as->parentmap; ir < lastir; ir++) {[m
[31m-      RegSP rs = ir->prev;[m
[31m-      *p++ = (uint16_t)rs;  /* Copy original parent RegSP to parentmap. */[m
[31m-      if (!ra_hasspill(regsp_spill(rs)))[m
[31m-	ir->prev = (uint16_t)REGSP_HINT(regsp_reg(rs));[m
[31m-      else[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  inloop = 0;[m
[31m-  as->evenspill = SPS_FIRST;[m
[31m-  for (lastir = IR(nins); ir < lastir; ir++) {[m
[31m-    if (sink) {[m
[31m-      if (ir->r == RID_SINK)[m
[31m-	continue;[m
[31m-      if (ir->r == RID_SUNK) {  /* Revert after ASM restart. */[m
[31m-	ir->r = RID_SINK;[m
[31m-	continue;[m
[31m-      }[m
[31m-    }[m
[31m-    switch (ir->o) {[m
[31m-    case IR_LOOP:[m
[31m-      inloop = 1;[m
[31m-      break;[m
[31m-#if LJ_TARGET_ARM[m
[31m-    case IR_SLOAD:[m
[31m-      if (!((ir->op2 & IRSLOAD_TYPECHECK) || (ir+1)->o == IR_HIOP))[m
[31m-	break;[m
[31m-      /* fallthrough */[m
[31m-    case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-      if (!LJ_SOFTFP && irt_isnum(ir->t)) break;[m
[31m-      ir->prev = (uint16_t)REGSP_HINT((rload & 15));[m
[31m-      rload = lj_ror(rload, 4);[m
[31m-      continue;[m
[31m-#endif[m
[31m-    case IR_CALLXS: {[m
[31m-      CCallInfo ci;[m
[31m-      ci.flags = asm_callx_flags(as, ir);[m
[31m-      ir->prev = asm_setup_call_slots(as, ir, &ci);[m
[31m-      if (inloop)[m
[31m-	as->modset |= RSET_SCRATCH;[m
[31m-      continue;[m
[31m-      }[m
[31m-    case IR_CALLN: case IR_CALLA: case IR_CALLL: case IR_CALLS: {[m
[31m-      const CCallInfo *ci = &lj_ir_callinfo[ir->op2];[m
[31m-      ir->prev = asm_setup_call_slots(as, ir, ci);[m
[31m-      if (inloop)[m
[31m-	as->modset |= (ci->flags & CCI_NOFPRCLOBBER) ?[m
[31m-		      (RSET_SCRATCH & ~RSET_FPR) : RSET_SCRATCH;[m
[31m-      continue;[m
[31m-      }[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-    case IR_HIOP:[m
[31m-      switch ((ir-1)->o) {[m
[31m-#if LJ_SOFTFP && LJ_TARGET_ARM[m
[31m-      case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-	if (ra_hashint((ir-1)->r)) {[m
[31m-	  ir->prev = (ir-1)->prev + 1;[m
[31m-	  continue;[m
[31m-	}[m
[31m-	break;[m
[31m-#endif[m
[31m-#if !LJ_SOFTFP && LJ_NEED_FP64[m
[31m-      case IR_CONV:[m
[31m-	if (irt_isfp((ir-1)->t)) {[m
[31m-	  ir->prev = REGSP_HINT(RID_FPRET);[m
[31m-	  continue;[m
[31m-	}[m
[31m-	/* fallthrough */[m
[31m-#endif[m
[31m-      case IR_CALLN: case IR_CALLXS:[m
[31m-#if LJ_SOFTFP[m
[31m-      case IR_MIN: case IR_MAX:[m
[31m-#endif[m
[31m-	(ir-1)->prev = REGSP_HINT(RID_RETLO);[m
[31m-	ir->prev = REGSP_HINT(RID_RETHI);[m
[31m-	continue;[m
[31m-      default:[m
[31m-	break;[m
[31m-      }[m
[31m-      break;[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-    case IR_MIN: case IR_MAX:[m
[31m-      if ((ir+1)->o != IR_HIOP) break;[m
[31m-      /* fallthrough */[m
[31m-#endif[m
[31m-    /* C calls evict all scratch regs and return results in RID_RET. */[m
[31m-    case IR_SNEW: case IR_XSNEW: case IR_NEWREF: case IR_BUFPUT:[m
[31m-      if (REGARG_NUMGPR < 3 && as->evenspill < 3)[m
[31m-	as->evenspill = 3;  /* lj_str_new and lj_tab_newkey need 3 args. */[m
[31m-#if LJ_TARGET_X86 && LJ_HASFFI[m
[31m-      if (0) {[m
[31m-    case IR_CNEW:[m
[31m-	if (ir->op2 != REF_NIL && as->evenspill < 4)[m
[31m-	  as->evenspill = 4;  /* lj_cdata_newv needs 4 args. */[m
[31m-      }[m
[31m-#else[m
[31m-    case IR_CNEW:[m
[31m-#endif[m
[31m-    case IR_TNEW: case IR_TDUP: case IR_CNEWI: case IR_TOSTR:[m
[31m-    case IR_BUFSTR:[m
[31m-      ir->prev = REGSP_HINT(RID_RET);[m
[31m-      if (inloop)[m
[31m-	as->modset = RSET_SCRATCH;[m
[31m-      continue;[m
[31m-    case IR_STRTO: case IR_OBAR:[m
[31m-      if (inloop)[m
[31m-	as->modset = RSET_SCRATCH;[m
[31m-      break;[m
[31m-#if !LJ_SOFTFP[m
[31m-    case IR_ATAN2:[m
[31m-#if LJ_TARGET_X86[m
[31m-      if (as->evenspill < 4)  /* Leave room to call atan2(). */[m
[31m-	as->evenspill = 4;[m
[31m-#endif[m
[31m-#if !LJ_TARGET_X86ORX64[m
[31m-    case IR_LDEXP:[m
[31m-#endif[m
[31m-#endif[m
[31m-    case IR_POW:[m
[31m-      if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-	if (inloop)[m
[31m-	  as->modset |= RSET_SCRATCH;[m
[31m-#if LJ_TARGET_X86[m
[31m-	break;[m
[31m-#else[m
[31m-	ir->prev = REGSP_HINT(RID_FPRET);[m
[31m-	continue;[m
[31m-#endif[m
[31m-      }[m
[31m-      /* fallthrough for integer POW */[m
[31m-    case IR_DIV: case IR_MOD:[m
[31m-      if (!irt_isnum(ir->t)) {[m
[31m-	ir->prev = REGSP_HINT(RID_RET);[m
[31m-	if (inloop)[m
[31m-	  as->modset |= (RSET_SCRATCH & RSET_GPR);[m
[31m-	continue;[m
[31m-      }[m
[31m-      break;[m
[31m-    case IR_FPMATH:[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-      if (ir->op2 <= IRFPM_TRUNC) {[m
[31m-	if (!(as->flags & JIT_F_SSE4_1)) {[m
[31m-	  ir->prev = REGSP_HINT(RID_XMM0);[m
[31m-	  if (inloop)[m
[31m-	    as->modset |= RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX);[m
[31m-	  continue;[m
[31m-	}[m
[31m-	break;[m
[31m-      } else if (ir->op2 == IRFPM_EXP2 && !LJ_64) {[m
[31m-	if (as->evenspill < 4)  /* Leave room to call pow(). */[m
[31m-	  as->evenspill = 4;[m
[31m-      }[m
[31m-#endif[m
[31m-      if (inloop)[m
[31m-	as->modset |= RSET_SCRATCH;[m
[31m-#if LJ_TARGET_X86[m
[31m-      break;[m
[31m-#else[m
[31m-      ir->prev = REGSP_HINT(RID_FPRET);[m
[31m-      continue;[m
[31m-#endif[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    /* Non-constant shift counts need to be in RID_ECX on x86/x64. */[m
[31m-    case IR_BSHL: case IR_BSHR: case IR_BSAR:[m
[31m-      if ((as->flags & JIT_F_BMI2))  /* Except if BMI2 is available. */[m
[31m-	break;[m
[31m-    case IR_BROL: case IR_BROR:[m
[31m-      if (!irref_isk(ir->op2) && !ra_hashint(IR(ir->op2)->r)) {[m
[31m-	IR(ir->op2)->r = REGSP_HINT(RID_ECX);[m
[31m-	if (inloop)[m
[31m-	  rset_set(as->modset, RID_ECX);[m
[31m-      }[m
[31m-      break;[m
[31m-#endif[m
[31m-    /* Do not propagate hints across type conversions or loads. */[m
[31m-    case IR_TOBIT:[m
[31m-    case IR_XLOAD:[m
[31m-#if !LJ_TARGET_ARM[m
[31m-    case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-#endif[m
[31m-      break;[m
[31m-    case IR_CONV:[m
[31m-      if (irt_isfp(ir->t) || (ir->op2 & IRCONV_SRCMASK) == IRT_NUM ||[m
[31m-	  (ir->op2 & IRCONV_SRCMASK) == IRT_FLOAT)[m
[31m-	break;[m
[31m-      /* fallthrough */[m
[31m-    default:[m
[31m-      /* Propagate hints across likely 'op reg, imm' or 'op reg'. */[m
[31m-      if (irref_isk(ir->op2) && !irref_isk(ir->op1) &&[m
[31m-	  ra_hashint(regsp_reg(IR(ir->op1)->prev))) {[m
[31m-	ir->prev = IR(ir->op1)->prev;[m
[31m-	continue;[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-    ir->prev = REGSP_INIT;[m
[31m-  }[m
[31m-  if ((as->evenspill & 1))[m
[31m-    as->oddspill = as->evenspill++;[m
[31m-  else[m
[31m-    as->oddspill = 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Assembler core ------------------------------------------------------ */[m
[31m-[m
[31m-/* Assemble a trace. */[m
[31m-void lj_asm_trace(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  ASMState as_;[m
[31m-  ASMState *as = &as_;[m
[31m-  MCode *origtop;[m
[31m-[m
[31m-  /* Ensure an initialized instruction beyond the last one for HIOP checks. */[m
[31m-  J->cur.nins = lj_ir_nextins(J);[m
[31m-  J->cur.ir[J->cur.nins].o = IR_NOP;[m
[31m-[m
[31m-  /* Setup initial state. Copy some fields to reduce indirections. */[m
[31m-  as->J = J;[m
[31m-  as->T = T;[m
[31m-  as->ir = T->ir;[m
[31m-  as->flags = J->flags;[m
[31m-  as->loopref = J->loopref;[m
[31m-  as->realign = NULL;[m
[31m-  as->loopinv = 0;[m
[31m-  as->parent = J->parent ? traceref(J, J->parent) : NULL;[m
[31m-[m
[31m-  /* Reserve MCode memory. */[m
[31m-  as->mctop = origtop = lj_mcode_reserve(J, &as->mcbot);[m
[31m-  as->mcp = as->mctop;[m
[31m-  as->mclim = as->mcbot + MCLIM_REDZONE;[m
[31m-  asm_setup_target(as);[m
[31m-[m
[31m-  do {[m
[31m-    as->mcp = as->mctop;[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-    as->mcp_prev = as->mcp;[m
[31m-#endif[m
[31m-    as->curins = T->nins;[m
[31m-    RA_DBG_START();[m
[31m-    RA_DBGX((as, "===== STOP ====="));[m
[31m-[m
[31m-    /* General trace setup. Emit tail of trace. */[m
[31m-    asm_tail_prep(as);[m
[31m-    as->mcloop = NULL;[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->topslot = 0;[m
[31m-    as->gcsteps = 0;[m
[31m-    as->sectref = as->loopref;[m
[31m-    as->fuseref = (as->flags & JIT_F_OPT_FUSE) ? as->loopref : FUSE_DISABLED;[m
[31m-    asm_setup_regsp(as);[m
[31m-    if (!as->loopref)[m
[31m-      asm_tail_link(as);[m
[31m-[m
[31m-    /* Assemble a trace in linear backwards order. */[m
[31m-    for (as->curins--; as->curins > as->stopins; as->curins--) {[m
[31m-      IRIns *ir = IR(as->curins);[m
[31m-      lua_assert(!(LJ_32 && irt_isint64(ir->t)));  /* Handled by SPLIT. */[m
[31m-      if (!ra_used(ir) && !ir_sideeff(ir) && (as->flags & JIT_F_OPT_DCE))[m
[31m-	continue;  /* Dead-code elimination can be soooo easy. */[m
[31m-      if (irt_isguard(ir->t))[m
[31m-	asm_snap_prep(as);[m
[31m-      RA_DBG_REF();[m
[31m-      checkmclim(as);[m
[31m-      asm_ir(as, ir);[m
[31m-    }[m
[31m-  } while (as->realign);  /* Retry in case the MCode needs to be realigned. */[m
[31m-[m
[31m-  /* Emit head of trace. */[m
[31m-  RA_DBG_REF();[m
[31m-  checkmclim(as);[m
[31m-  if (as->gcsteps > 0) {[m
[31m-    as->curins = as->T->snap[0].ref;[m
[31m-    asm_snap_prep(as);  /* The GC check is a guard. */[m
[31m-    asm_gc_check(as);[m
[31m-  }[m
[31m-  ra_evictk(as);[m
[31m-  if (as->parent)[m
[31m-    asm_head_side(as);[m
[31m-  else[m
[31m-    asm_head_root(as);[m
[31m-  asm_phi_fixup(as);[m
[31m-[m
[31m-  RA_DBGX((as, "===== START ===="));[m
[31m-  RA_DBG_FLUSH();[m
[31m-  if (as->freeset != RSET_ALL)[m
[31m-    lj_trace_err(as->J, LJ_TRERR_BADRA);  /* Ouch! Should never happen. */[m
[31m-[m
[31m-  /* Set trace entry point before fixing up tail to allow link to self. */[m
[31m-  T->mcode = as->mcp;[m
[31m-  T->mcloop = as->mcloop ? (MSize)((char *)as->mcloop - (char *)as->mcp) : 0;[m
[31m-  if (!as->loopref)[m
[31m-    asm_tail_fixup(as, T->link);  /* Note: this may change as->mctop! */[m
[31m-  T->szmcode = (MSize)((char *)as->mctop - (char *)as->mcp);[m
[31m-  lj_mcode_sync(T->mcode, origtop);[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm.h[m
[1mdeleted file mode 100644[m
[1mindex 9f4654e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-/*[m
[31m-** IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_ASM_H[m
[31m-#define _LJ_ASM_H[m
[31m-[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC void lj_asm_trace(jit_State *J, GCtrace *T);[m
[31m-LJ_FUNC void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno,[m
[31m-			      MCode *target);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_arm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_arm.h[m
[1mdeleted file mode 100644[m
[1mindex ff4068a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_arm.h[m
[1m+++ /dev/null[m
[36m@@ -1,2207 +0,0 @@[m
[31m-/*[m
[31m-** ARM IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Register allocator extensions --------------------------------------- */[m
[31m-[m
[31m-/* Allocate a register with a hint. */[m
[31m-static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  if (ra_noreg(r)) {[m
[31m-    if (!ra_hashint(r) && !iscrossref(as, ref))[m
[31m-      ra_sethint(IR(ref)->r, hint);  /* Propagate register hint. */[m
[31m-    r = ra_allocref(as, ref, allow);[m
[31m-  }[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate a scratch register pair. */[m
[31m-static Reg ra_scratchpair(ASMState *as, RegSet allow)[m
[31m-{[m
[31m-  RegSet pick1 = as->freeset & allow;[m
[31m-  RegSet pick2 = pick1 & (pick1 >> 1) & RSET_GPREVEN;[m
[31m-  Reg r;[m
[31m-  if (pick2) {[m
[31m-    r = rset_picktop(pick2);[m
[31m-  } else {[m
[31m-    RegSet pick = pick1 & (allow >> 1) & RSET_GPREVEN;[m
[31m-    if (pick) {[m
[31m-      r = rset_picktop(pick);[m
[31m-      ra_restore(as, regcost_ref(as->cost[r+1]));[m
[31m-    } else {[m
[31m-      pick = pick1 & (allow << 1) & RSET_GPRODD;[m
[31m-      if (pick) {[m
[31m-	r = ra_restore(as, regcost_ref(as->cost[rset_picktop(pick)-1]));[m
[31m-      } else {[m
[31m-	r = ra_evict(as, allow & (allow >> 1) & RSET_GPREVEN);[m
[31m-	ra_restore(as, regcost_ref(as->cost[r+1]));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(rset_test(RSET_GPREVEN, r));[m
[31m-  ra_modified(as, r);[m
[31m-  ra_modified(as, r+1);[m
[31m-  RA_DBGX((as, "scratchpair    $r $r", r, r+1));[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-/* Allocate two source registers for three-operand instructions. */[m
[31m-static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-  Reg left = irl->r, right = irr->r;[m
[31m-  if (ra_hasreg(left)) {[m
[31m-    ra_noweak(as, left);[m
[31m-    if (ra_noreg(right))[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(allow, left));[m
[31m-    else[m
[31m-      ra_noweak(as, right);[m
[31m-  } else if (ra_hasreg(right)) {[m
[31m-    ra_noweak(as, right);[m
[31m-    left = ra_allocref(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else if (ra_hashint(right)) {[m
[31m-    right = ra_allocref(as, ir->op2, allow);[m
[31m-    left = ra_alloc1(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else {[m
[31m-    left = ra_allocref(as, ir->op1, allow);[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(allow, left));[m
[31m-  }[m
[31m-  return left | (right << 8);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Guard handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Generate an exit stub group at the bottom of the reserved MCode memory. */[m
[31m-static MCode *asm_exitstub_gen(ASMState *as, ExitNo group)[m
[31m-{[m
[31m-  MCode *mxp = as->mcbot;[m
[31m-  int i;[m
[31m-  if (mxp + 4*4+4*EXITSTUBS_PER_GROUP >= as->mctop)[m
[31m-    asm_mclimit(as);[m
[31m-  /* str lr, [sp]; bl ->vm_exit_handler; .long DISPATCH_address, group. */[m
[31m-  *mxp++ = ARMI_STR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_LR)|ARMF_N(RID_SP);[m
[31m-  *mxp = ARMI_BL|((((MCode *)(void *)lj_vm_exit_handler-mxp)-2)&0x00ffffffu);[m
[31m-  mxp++;[m
[31m-  *mxp++ = (MCode)i32ptr(J2GG(as->J)->dispatch);  /* DISPATCH address */[m
[31m-  *mxp++ = group*EXITSTUBS_PER_GROUP;[m
[31m-  for (i = 0; i < EXITSTUBS_PER_GROUP; i++)[m
[31m-    *mxp++ = ARMI_B|((-6-i)&0x00ffffffu);[m
[31m-  lj_mcode_sync(as->mcbot, mxp);[m
[31m-  lj_mcode_commitbot(as->J, mxp);[m
[31m-  as->mcbot = mxp;[m
[31m-  as->mclim = as->mcbot + MCLIM_REDZONE;[m
[31m-  return mxp - EXITSTUBS_PER_GROUP;[m
[31m-}[m
[31m-[m
[31m-/* Setup all needed exit stubs. */[m
[31m-static void asm_exitstub_setup(ASMState *as, ExitNo nexits)[m
[31m-{[m
[31m-  ExitNo i;[m
[31m-  if (nexits >= EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR)[m
[31m-    lj_trace_err(as->J, LJ_TRERR_SNAPOV);[m
[31m-  for (i = 0; i < (nexits+EXITSTUBS_PER_GROUP-1)/EXITSTUBS_PER_GROUP; i++)[m
[31m-    if (as->J->exitstubgroup[i] == NULL)[m
[31m-      as->J->exitstubgroup[i] = asm_exitstub_gen(as, i);[m
[31m-}[m
[31m-[m
[31m-/* Emit conditional branch to exit for guard. */[m
[31m-static void asm_guardcc(ASMState *as, ARMCC cc)[m
[31m-{[m
[31m-  MCode *target = exitstub_addr(as->J, as->snapno);[m
[31m-  MCode *p = as->mcp;[m
[31m-  if (LJ_UNLIKELY(p == as->invmcp)) {[m
[31m-    as->loopinv = 1;[m
[31m-    *p = ARMI_BL | ((target-p-2) & 0x00ffffffu);[m
[31m-    emit_branch(as, ARMF_CC(ARMI_B, cc^1), p+1);[m
[31m-    return;[m
[31m-  }[m
[31m-  emit_branch(as, ARMF_CC(ARMI_BL, cc), target);[m
[31m-}[m
[31m-[m
[31m-/* -- Operand fusion ------------------------------------------------------ */[m
[31m-[m
[31m-/* Limit linear search to this distance. Avoids O(n^2) behavior. */[m
[31m-#define CONFLICT_SEARCH_LIM	31[m
[31m-[m
[31m-/* Check if there's no conflicting instruction between curins and ref. */[m
[31m-static int noconflict(ASMState *as, IRRef ref, IROp conflict)[m
[31m-{[m
[31m-  IRIns *ir = as->ir;[m
[31m-  IRRef i = as->curins;[m
[31m-  if (i > ref + CONFLICT_SEARCH_LIM)[m
[31m-    return 0;  /* Give up, ref is too far away. */[m
[31m-  while (--i > ref)[m
[31m-    if (ir[i].o == conflict)[m
[31m-      return 0;  /* Conflict found. */[m
[31m-  return 1;  /* Ok, no conflict. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse the array base of colocated arrays. */[m
[31m-static int32_t asm_fuseabase(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE &&[m
[31m-      !neverfuse(as) && noconflict(as, ref, IR_NEWREF))[m
[31m-    return (int32_t)sizeof(GCtab);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Fuse array/hash/upvalue reference into register+offset operand. */[m
[31m-static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow,[m
[31m-			  int lim)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r)) {[m
[31m-    if (ir->o == IR_AREF) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	if (irref_isk(ir->op2)) {[m
[31m-	  IRRef tab = IR(ir->op1)->op1;[m
[31m-	  int32_t ofs = asm_fuseabase(as, tab);[m
[31m-	  IRRef refa = ofs ? tab : ir->op1;[m
[31m-	  ofs += 8*IR(ir->op2)->i;[m
[31m-	  if (ofs > -lim && ofs < lim) {[m
[31m-	    *ofsp = ofs;[m
[31m-	    return ra_alloc1(as, refa, allow);[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_HREFK) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node));[m
[31m-	if (ofs < lim) {[m
[31m-	  *ofsp = ofs;[m
[31m-	  return ra_alloc1(as, ir->op1, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_UREFC) {[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-	int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv);[m
[31m-	*ofsp = (ofs & 255);  /* Mask out less bits to allow LDRD. */[m
[31m-	return ra_allock(as, (ofs & ~255), allow);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  *ofsp = 0;[m
[31m-  return ra_alloc1(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-/* Fuse m operand into arithmetic/logic instructions. */[m
[31m-static uint32_t asm_fuseopm(ASMState *as, ARMIns ai, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_hasreg(ir->r)) {[m
[31m-    ra_noweak(as, ir->r);[m
[31m-    return ARMF_M(ir->r);[m
[31m-  } else if (irref_isk(ref)) {[m
[31m-    uint32_t k = emit_isk12(ai, ir->i);[m
[31m-    if (k)[m
[31m-      return k;[m
[31m-  } else if (mayfuse(as, ref)) {[m
[31m-    if (ir->o >= IR_BSHL && ir->o <= IR_BROR) {[m
[31m-      Reg m = ra_alloc1(as, ir->op1, allow);[m
[31m-      ARMShift sh = ir->o == IR_BSHL ? ARMSH_LSL :[m
[31m-		    ir->o == IR_BSHR ? ARMSH_LSR :[m
[31m-		    ir->o == IR_BSAR ? ARMSH_ASR : ARMSH_ROR;[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	return m | ARMF_SH(sh, (IR(ir->op2)->i & 31));[m
[31m-      } else {[m
[31m-	Reg s = ra_alloc1(as, ir->op2, rset_exclude(allow, m));[m
[31m-	return m | ARMF_RSH(sh, s);[m
[31m-      }[m
[31m-    } else if (ir->o == IR_ADD && ir->op1 == ir->op2) {[m
[31m-      Reg m = ra_alloc1(as, ir->op1, allow);[m
[31m-      return m | ARMF_SH(ARMSH_LSL, 1);[m
[31m-    }[m
[31m-  }[m
[31m-  return ra_allocref(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-/* Fuse shifts into loads/stores. Only bother with BSHL 2 => lsl #2. */[m
[31m-static IRRef asm_fuselsl2(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r) && mayfuse(as, ref) && ir->o == IR_BSHL &&[m
[31m-      irref_isk(ir->op2) && IR(ir->op2)->i == 2)[m
[31m-    return ir->op1;[m
[31m-  return 0;  /* No fusion. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse XLOAD/XSTORE reference into load/store operand. */[m
[31m-static void asm_fusexref(ASMState *as, ARMIns ai, Reg rd, IRRef ref,[m
[31m-			 RegSet allow, int32_t ofs)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  Reg base;[m
[31m-  if (ra_noreg(ir->r) && canfuse(as, ir)) {[m
[31m-    int32_t lim = (!LJ_SOFTFP && (ai & 0x08000000)) ? 1024 :[m
[31m-		   (ai & 0x04000000) ? 4096 : 256;[m
[31m-    if (ir->o == IR_ADD) {[m
[31m-      int32_t ofs2;[m
[31m-      if (irref_isk(ir->op2) &&[m
[31m-	  (ofs2 = ofs + IR(ir->op2)->i) > -lim && ofs2 < lim &&[m
[31m-	  (!(!LJ_SOFTFP && (ai & 0x08000000)) || !(ofs2 & 3))) {[m
[31m-	ofs = ofs2;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (ofs == 0 && !(!LJ_SOFTFP && (ai & 0x08000000))) {[m
[31m-	IRRef lref = ir->op1, rref = ir->op2;[m
[31m-	Reg rn, rm;[m
[31m-	if ((ai & 0x04000000)) {[m
[31m-	  IRRef sref = asm_fuselsl2(as, rref);[m
[31m-	  if (sref) {[m
[31m-	    rref = sref;[m
[31m-	    ai |= ARMF_SH(ARMSH_LSL, 2);[m
[31m-	  } else if ((sref = asm_fuselsl2(as, lref)) != 0) {[m
[31m-	    lref = rref;[m
[31m-	    rref = sref;[m
[31m-	    ai |= ARMF_SH(ARMSH_LSL, 2);[m
[31m-	  }[m
[31m-	}[m
[31m-	rn = ra_alloc1(as, lref, allow);[m
[31m-	rm = ra_alloc1(as, rref, rset_exclude(allow, rn));[m
[31m-	if ((ai & 0x04000000)) ai |= ARMI_LS_R;[m
[31m-	emit_dnm(as, ai|ARMI_LS_P|ARMI_LS_U, rd, rn, rm);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_STRREF && !(!LJ_SOFTFP && (ai & 0x08000000))) {[m
[31m-      lua_assert(ofs == 0);[m
[31m-      ofs = (int32_t)sizeof(GCstr);[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	ofs += IR(ir->op2)->i;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (irref_isk(ir->op1)) {[m
[31m-	ofs += IR(ir->op1)->i;[m
[31m-	ref = ir->op2;[m
[31m-      } else {[m
[31m-	/* NYI: Fuse ADD with constant. */[m
[31m-	Reg rn = ra_alloc1(as, ir->op1, allow);[m
[31m-	uint32_t m = asm_fuseopm(as, 0, ir->op2, rset_exclude(allow, rn));[m
[31m-	if ((ai & 0x04000000))[m
[31m-	  emit_lso(as, ai, rd, rd, ofs);[m
[31m-	else[m
[31m-	  emit_lsox(as, ai, rd, rd, ofs);[m
[31m-	emit_dn(as, ARMI_ADD^m, rd, rn);[m
[31m-	return;[m
[31m-      }[m
[31m-      if (ofs <= -lim || ofs >= lim) {[m
[31m-	Reg rn = ra_alloc1(as, ref, allow);[m
[31m-	Reg rm = ra_allock(as, ofs, rset_exclude(allow, rn));[m
[31m-	if ((ai & 0x04000000)) ai |= ARMI_LS_R;[m
[31m-	emit_dnm(as, ai|ARMI_LS_P|ARMI_LS_U, rd, rn, rm);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ref, allow);[m
[31m-#if !LJ_SOFTFP[m
[31m-  if ((ai & 0x08000000))[m
[31m-    emit_vlso(as, ai, rd, base, ofs);[m
[31m-  else[m
[31m-#endif[m
[31m-  if ((ai & 0x04000000))[m
[31m-    emit_lso(as, ai, rd, base, ofs);[m
[31m-  else[m
[31m-    emit_lsox(as, ai, rd, base, ofs);[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-/* Fuse to multiply-add/sub instruction. */[m
[31m-static int asm_fusemadd(ASMState *as, IRIns *ir, ARMIns ai, ARMIns air)[m
[31m-{[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  IRIns *irm;[m
[31m-  if (lref != rref &&[m
[31m-      ((mayfuse(as, lref) && (irm = IR(lref), irm->o == IR_MUL) &&[m
[31m-	ra_noreg(irm->r)) ||[m
[31m-       (mayfuse(as, rref) && (irm = IR(rref), irm->o == IR_MUL) &&[m
[31m-	(rref = lref, ai = air, ra_noreg(irm->r))))) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg add = ra_hintalloc(as, rref, dest, RSET_FPR);[m
[31m-    Reg right, left = ra_alloc2(as, irm,[m
[31m-			rset_exclude(rset_exclude(RSET_FPR, dest), add));[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_dnm(as, ai, (dest & 15), (left & 15), (right & 15));[m
[31m-    if (dest != add) emit_dm(as, ARMI_VMOV_D, (dest & 15), (add & 15));[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Generate a call to a C function. */[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n, nargs = CCI_XNARGS(ci);[m
[31m-  int32_t ofs = 0;[m
[31m-#if LJ_SOFTFP[m
[31m-  Reg gpr = REGARG_FIRSTGPR;[m
[31m-#else[m
[31m-  Reg gpr, fpr = REGARG_FIRSTFPR, fprodd = 0;[m
[31m-#endif[m
[31m-  if ((void *)ci->func)[m
[31m-    emit_call(as, (void *)ci->func);[m
[31m-#if !LJ_SOFTFP[m
[31m-  for (gpr = REGARG_FIRSTGPR; gpr <= REGARG_LASTGPR; gpr++)[m
[31m-    as->cost[gpr] = REGCOST(~0u, ASMREF_L);[m
[31m-  gpr = REGARG_FIRSTGPR;[m
[31m-#endif[m
[31m-  for (n = 0; n < nargs; n++) {  /* Setup args. */[m
[31m-    IRRef ref = args[n];[m
[31m-    IRIns *ir = IR(ref);[m
[31m-#if !LJ_SOFTFP[m
[31m-    if (ref && irt_isfp(ir->t)) {[m
[31m-      RegSet of = as->freeset;[m
[31m-      Reg src;[m
[31m-      if (!LJ_ABI_SOFTFP && !(ci->flags & CCI_VARARG)) {[m
[31m-	if (irt_isnum(ir->t)) {[m
[31m-	  if (fpr <= REGARG_LASTFPR) {[m
[31m-	    ra_leftov(as, fpr, ref);[m
[31m-	    fpr++;[m
[31m-	    continue;[m
[31m-	  }[m
[31m-	} else if (fprodd) {  /* Ick. */[m
[31m-	  src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-	  emit_dm(as, ARMI_VMOV_S, (fprodd & 15), (src & 15) | 0x00400000);[m
[31m-	  fprodd = 0;[m
[31m-	  continue;[m
[31m-	} else if (fpr <= REGARG_LASTFPR) {[m
[31m-	  ra_leftov(as, fpr, ref);[m
[31m-	  fprodd = fpr++;[m
[31m-	  continue;[m
[31m-	}[m
[31m-	/* Workaround to protect argument GPRs from being used for remat. */[m
[31m-	as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1);[m
[31m-	src = ra_alloc1(as, ref, RSET_FPR);  /* May alloc GPR to remat FPR. */[m
[31m-	as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1));[m
[31m-	fprodd = 0;[m
[31m-	goto stackfp;[m
[31m-      }[m
[31m-      /* Workaround to protect argument GPRs from being used for remat. */[m
[31m-      as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1);[m
[31m-      src = ra_alloc1(as, ref, RSET_FPR);  /* May alloc GPR to remat FPR. */[m
[31m-      as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1));[m
[31m-      if (irt_isnum(ir->t)) gpr = (gpr+1) & ~1u;[m
[31m-      if (gpr <= REGARG_LASTGPR) {[m
[31m-	lua_assert(rset_test(as->freeset, gpr));  /* Must have been evicted. */[m
[31m-	if (irt_isnum(ir->t)) {[m
[31m-	  lua_assert(rset_test(as->freeset, gpr+1));  /* Ditto. */[m
[31m-	  emit_dnm(as, ARMI_VMOV_RR_D, gpr, gpr+1, (src & 15));[m
[31m-	  gpr += 2;[m
[31m-	} else {[m
[31m-	  emit_dn(as, ARMI_VMOV_R_S, gpr, (src & 15));[m
[31m-	  gpr++;[m
[31m-	}[m
[31m-      } else {[m
[31m-      stackfp:[m
[31m-	if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4;[m
[31m-	emit_spstore(as, ir, src, ofs);[m
[31m-	ofs += irt_isnum(ir->t) ? 8 : 4;[m
[31m-      }[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-      if (gpr <= REGARG_LASTGPR) {[m
[31m-	lua_assert(rset_test(as->freeset, gpr));  /* Must have been evicted. */[m
[31m-	if (ref) ra_leftov(as, gpr, ref);[m
[31m-	gpr++;[m
[31m-      } else {[m
[31m-	if (ref) {[m
[31m-	  Reg r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-	  emit_spstore(as, ir, r, ofs);[m
[31m-	}[m
[31m-	ofs += 4;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup result reg/sp for call. Evict scratch regs. */[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  int hiop = ((ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  if (hiop && ra_hasreg((ir+1)->r))[m
[31m-    rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);  /* Evictions must be performed first. */[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert(!irt_ispri(ir->t));[m
[31m-    if (!LJ_SOFTFP && irt_isfp(ir->t)) {[m
[31m-      if (LJ_ABI_SOFTFP || (ci->flags & (CCI_CASTU64|CCI_VARARG))) {[m
[31m-	Reg dest = (ra_dest(as, ir, RSET_FPR) & 15);[m
[31m-	if (irt_isnum(ir->t))[m
[31m-	  emit_dnm(as, ARMI_VMOV_D_RR, RID_RETLO, RID_RETHI, dest);[m
[31m-	else[m
[31m-	  emit_dn(as, ARMI_VMOV_S_R, RID_RET, dest);[m
[31m-      } else {[m
[31m-	ra_destreg(as, ir, RID_FPRET);[m
[31m-      }[m
[31m-    } else if (hiop) {[m
[31m-      ra_destpair(as, ir);[m
[31m-    } else {[m
[31m-      ra_destreg(as, ir, RID_RET);[m
[31m-    }[m
[31m-  }[m
[31m-  UNUSED(ci);[m
[31m-}[m
[31m-[m
[31m-static void asm_callx(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  CCallInfo ci;[m
[31m-  IRRef func;[m
[31m-  IRIns *irf;[m
[31m-  ci.flags = asm_callx_flags(as, ir);[m
[31m-  asm_collectargs(as, ir, &ci, args);[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-  func = ir->op2; irf = IR(func);[m
[31m-  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }[m
[31m-  if (irref_isk(func)) {  /* Call to constant address. */[m
[31m-    ci.func = (ASMFunction)(void *)(irf->i);[m
[31m-  } else {  /* Need a non-argument register for indirect calls. */[m
[31m-    Reg freg = ra_alloc1(as, func, RSET_RANGE(RID_R4, RID_R12+1));[m
[31m-    emit_m(as, ARMI_BLXr, freg);[m
[31m-    ci.func = (ASMFunction)(void *)0;[m
[31m-  }[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-[m
[31m-/* -- Returns ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Return to lower frame. Guard that it goes to the right spot. */[m
[31m-static void asm_retf(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  void *pc = ir_kptr(IR(ir->op2));[m
[31m-  int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));[m
[31m-  as->topslot -= (BCReg)delta;[m
[31m-  if ((int32_t)as->topslot < 0) as->topslot = 0;[m
[31m-  irt_setmark(IR(REF_BASE)->t);  /* Children must not coalesce with BASE reg. */[m
[31m-  /* Need to force a spill on REF_BASE now to update the stack slot. */[m
[31m-  emit_lso(as, ARMI_STR, base, RID_SP, ra_spill(as, IR(REF_BASE)));[m
[31m-  emit_setgl(as, base, jit_base);[m
[31m-  emit_addptr(as, base, -8*delta);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_nm(as, ARMI_CMP, RID_TMP,[m
[31m-	  ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base)));[m
[31m-  emit_lso(as, ARMI_LDR, RID_TMP, base, -4);[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_tointg(ASMState *as, IRIns *ir, Reg left)[m
[31m-{[m
[31m-  Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_d(as, ARMI_VMRS, 0);[m
[31m-  emit_dm(as, ARMI_VCMP_D, (tmp & 15), (left & 15));[m
[31m-  emit_dm(as, ARMI_VCVT_F64_S32, (tmp & 15), (tmp & 15));[m
[31m-  emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15));[m
[31m-  emit_dm(as, ARMI_VCVT_S32_F64, (tmp & 15), (left & 15));[m
[31m-}[m
[31m-[m
[31m-static void asm_tobit(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg left = ra_alloc1(as, ir->op1, allow);[m
[31m-  Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left));[m
[31m-  Reg tmp = ra_scratch(as, rset_clear(allow, right));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15));[m
[31m-  emit_dnm(as, ARMI_VADD_D, (tmp & 15), (left & 15), (right & 15));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_conv(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-#if !LJ_SOFTFP[m
[31m-  int stfp = (st == IRT_NUM || st == IRT_FLOAT);[m
[31m-#endif[m
[31m-  IRRef lref = ir->op1;[m
[31m-  /* 64 bit integer conversions are handled by SPLIT. */[m
[31m-  lua_assert(!irt_isint64(ir->t) && !(st == IRT_I64 || st == IRT_U64));[m
[31m-#if LJ_SOFTFP[m
[31m-  /* FP conversions are handled by SPLIT. */[m
[31m-  lua_assert(!irt_isfp(ir->t) && !(st == IRT_NUM || st == IRT_FLOAT));[m
[31m-  /* Can't check for same types: SPLIT uses CONV int.int + BXOR for sfp NEG. */[m
[31m-#else[m
[31m-  lua_assert(irt_type(ir->t) != st);[m
[31m-  if (irt_isfp(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    if (stfp) {  /* FP to FP conversion. */[m
[31m-      emit_dm(as, st == IRT_NUM ? ARMI_VCVT_F32_F64 : ARMI_VCVT_F64_F32,[m
[31m-	      (dest & 15), (ra_alloc1(as, lref, RSET_FPR) & 15));[m
[31m-    } else {  /* Integer to FP conversion. */[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      ARMIns ai = irt_isfloat(ir->t) ?[m
[31m-	(st == IRT_INT ? ARMI_VCVT_F32_S32 : ARMI_VCVT_F32_U32) :[m
[31m-	(st == IRT_INT ? ARMI_VCVT_F64_S32 : ARMI_VCVT_F64_U32);[m
[31m-      emit_dm(as, ai, (dest & 15), (dest & 15));[m
[31m-      emit_dn(as, ARMI_VMOV_S_R, left, (dest & 15));[m
[31m-    }[m
[31m-  } else if (stfp) {  /* FP to integer conversion. */[m
[31m-    if (irt_isguard(ir->t)) {[m
[31m-      /* Checked conversions are only supported from number to int. */[m
[31m-      lua_assert(irt_isint(ir->t) && st == IRT_NUM);[m
[31m-      asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else {[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_FPR);[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      ARMIns ai;[m
[31m-      emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15));[m
[31m-      ai = irt_isint(ir->t) ?[m
[31m-	(st == IRT_NUM ? ARMI_VCVT_S32_F64 : ARMI_VCVT_S32_F32) :[m
[31m-	(st == IRT_NUM ? ARMI_VCVT_U32_F64 : ARMI_VCVT_U32_F32);[m
[31m-      emit_dm(as, ai, (tmp & 15), (left & 15));[m
[31m-    }[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));[m
[31m-      if ((as->flags & JIT_F_ARMV6)) {[m
[31m-	ARMIns ai = st == IRT_I8 ? ARMI_SXTB :[m
[31m-		    st == IRT_U8 ? ARMI_UXTB :[m
[31m-		    st == IRT_I16 ? ARMI_SXTH : ARMI_UXTH;[m
[31m-	emit_dm(as, ai, dest, left);[m
[31m-      } else if (st == IRT_U8) {[m
[31m-	emit_dn(as, ARMI_AND|ARMI_K12|255, dest, left);[m
[31m-      } else {[m
[31m-	uint32_t shift = st == IRT_I8 ? 24 : 16;[m
[31m-	ARMShift sh = st == IRT_U16 ? ARMSH_LSR : ARMSH_ASR;[m
[31m-	emit_dm(as, ARMI_MOV|ARMF_SH(sh, shift), dest, RID_TMP);[m
[31m-	emit_dm(as, ARMI_MOV|ARMF_SH(ARMSH_LSL, shift), RID_TMP, left);[m
[31m-      }[m
[31m-    } else {  /* Handle 32/32 bit no-op (cast). */[m
[31m-      ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_strto(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];[m
[31m-  IRRef args[2];[m
[31m-  Reg rlo = 0, rhi = 0, tmp;[m
[31m-  int destused = ra_used(ir);[m
[31m-  int32_t ofs = 0;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-#if LJ_SOFTFP[m
[31m-  if (destused) {[m
[31m-    if (ra_hasspill(ir->s) && ra_hasspill((ir+1)->s) &&[m
[31m-	(ir->s & 1) == 0 && ir->s + 1 == (ir+1)->s) {[m
[31m-      int i;[m
[31m-      for (i = 0; i < 2; i++) {[m
[31m-	Reg r = (ir+i)->r;[m
[31m-	if (ra_hasreg(r)) {[m
[31m-	  ra_free(as, r);[m
[31m-	  ra_modified(as, r);[m
[31m-	  emit_spload(as, ir+i, r, sps_scale((ir+i)->s));[m
[31m-	}[m
[31m-      }[m
[31m-      ofs = sps_scale(ir->s);[m
[31m-      destused = 0;[m
[31m-    } else {[m
[31m-      rhi = ra_dest(as, ir+1, RSET_GPR);[m
[31m-      rlo = ra_dest(as, ir, rset_exclude(RSET_GPR, rhi));[m
[31m-    }[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_EQ);[m
[31m-  if (destused) {[m
[31m-    emit_lso(as, ARMI_LDR, rhi, RID_SP, 4);[m
[31m-    emit_lso(as, ARMI_LDR, rlo, RID_SP, 0);[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(rhi);[m
[31m-  if (destused) {[m
[31m-    if (ra_hasspill(ir->s)) {[m
[31m-      ofs = sps_scale(ir->s);[m
[31m-      destused = 0;[m
[31m-      if (ra_hasreg(ir->r)) {[m
[31m-	ra_free(as, ir->r);[m
[31m-	ra_modified(as, ir->r);[m
[31m-	emit_spload(as, ir, ir->r, ofs);[m
[31m-      }[m
[31m-    } else {[m
[31m-      rlo = ra_dest(as, ir, RSET_FPR);[m
[31m-    }[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_EQ);[m
[31m-  if (destused)[m
[31m-    emit_vlso(as, ARMI_VLDR_D, rlo, RID_SP, 0);[m
[31m-#endif[m
[31m-  emit_n(as, ARMI_CMP|ARMI_K12|0, RID_RET);  /* Test return status. */[m
[31m-  args[0] = ir->op1;      /* GCstr *str */[m
[31m-  args[1] = ASMREF_TMP1;  /* TValue *n  */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  tmp = ra_releasetmp(as, ASMREF_TMP1);[m
[31m-  if (ofs == 0)[m
[31m-    emit_dm(as, ARMI_MOV, tmp, RID_SP);[m
[31m-  else[m
[31m-    emit_opk(as, ARMI_ADD, tmp, RID_SP, ofs, RSET_GPR);[m
[31m-}[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-/* Get pointer to TValue. */[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (irref_isk(ref)) {[m
[31m-      /* Use the number constant itself as a TValue. */[m
[31m-      ra_allockreg(as, i32ptr(ir_knum(ir)), dest);[m
[31m-    } else {[m
[31m-#if LJ_SOFTFP[m
[31m-      lua_assert(0);[m
[31m-#else[m
[31m-      /* Otherwise force a spill and use the spill slot. */[m
[31m-      emit_opk(as, ARMI_ADD, dest, RID_SP, ra_spill(as, ir), RSET_GPR);[m
[31m-#endif[m
[31m-    }[m
[31m-  } else {[m
[31m-    /* Otherwise use [sp] and [sp+4] to hold the TValue. */[m
[31m-    RegSet allow = rset_exclude(RSET_GPR, dest);[m
[31m-    Reg type;[m
[31m-    emit_dm(as, ARMI_MOV, dest, RID_SP);[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, allow);[m
[31m-      emit_lso(as, ARMI_STR, src, RID_SP, 0);[m
[31m-    }[m
[31m-    if (LJ_SOFTFP && (ir+1)->o == IR_HIOP)[m
[31m-      type = ra_alloc1(as, ref+1, allow);[m
[31m-    else[m
[31m-      type = ra_allock(as, irt_toitype(ir->t), allow);[m
[31m-    emit_lso(as, ARMI_STR, type, RID_SP, 4);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_aref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx, base;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    IRRef tab = IR(ir->op1)->op1;[m
[31m-    int32_t ofs = asm_fuseabase(as, tab);[m
[31m-    IRRef refa = ofs ? tab : ir->op1;[m
[31m-    uint32_t k = emit_isk12(ARMI_ADD, ofs + 8*IR(ir->op2)->i);[m
[31m-    if (k) {[m
[31m-      base = ra_alloc1(as, refa, RSET_GPR);[m
[31m-      emit_dn(as, ARMI_ADD^k, dest, base);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));[m
[31m-  emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 3), dest, base, idx);[m
[31m-}[m
[31m-[m
[31m-/* Inlined hash lookup. Specialized for key type and for const keys.[m
[31m-** The equivalent C code is:[m
[31m-**   Node *n = hashkey(t, key);[m
[31m-**   do {[m
[31m-**     if (lj_obj_equal(&n->key, key)) return &n->val;[m
[31m-**   } while ((n = nextnode(n)));[m
[31m-**   return niltv(L);[m
[31m-*/[m
[31m-static void asm_href(ASMState *as, IRIns *ir, IROp merge)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int destused = ra_used(ir);[m
[31m-  Reg dest = ra_dest(as, ir, allow);[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));[m
[31m-  Reg key = 0, keyhi = 0, keynumhi = RID_NONE, tmp = RID_TMP;[m
[31m-  IRRef refkey = ir->op2;[m
[31m-  IRIns *irkey = IR(refkey);[m
[31m-  IRType1 kt = irkey->t;[m
[31m-  int32_t k = 0, khi = emit_isk12(ARMI_CMP, irt_toitype(kt));[m
[31m-  uint32_t khash;[m
[31m-  MCLabel l_end, l_loop;[m
[31m-  rset_clear(allow, tab);[m
[31m-  if (!irref_isk(refkey) || irt_isstr(kt)) {[m
[31m-#if LJ_SOFTFP[m
[31m-    key = ra_alloc1(as, refkey, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-    if (irkey[1].o == IR_HIOP) {[m
[31m-      if (ra_hasreg((irkey+1)->r)) {[m
[31m-	keynumhi = (irkey+1)->r;[m
[31m-	keyhi = RID_TMP;[m
[31m-	ra_noweak(as, keynumhi);[m
[31m-      } else {[m
[31m-	keyhi = keynumhi = ra_allocref(as, refkey+1, allow);[m
[31m-      }[m
[31m-      rset_clear(allow, keynumhi);[m
[31m-      khi = 0;[m
[31m-    }[m
[31m-#else[m
[31m-    if (irt_isnum(kt)) {[m
[31m-      key = ra_scratch(as, allow);[m
[31m-      rset_clear(allow, key);[m
[31m-      keyhi = keynumhi = ra_scratch(as, allow);[m
[31m-      rset_clear(allow, keyhi);[m
[31m-      khi = 0;[m
[31m-    } else {[m
[31m-      key = ra_alloc1(as, refkey, allow);[m
[31m-      rset_clear(allow, key);[m
[31m-    }[m
[31m-#endif[m
[31m-  } else if (irt_isnum(kt)) {[m
[31m-    int32_t val = (int32_t)ir_knum(irkey)->u32.lo;[m
[31m-    k = emit_isk12(ARMI_CMP, val);[m
[31m-    if (!k) {[m
[31m-      key = ra_allock(as, val, allow);[m
[31m-      rset_clear(allow, key);[m
[31m-    }[m
[31m-    val = (int32_t)ir_knum(irkey)->u32.hi;[m
[31m-    khi = emit_isk12(ARMI_CMP, val);[m
[31m-    if (!khi) {[m
[31m-      keyhi = ra_allock(as, val, allow);[m
[31m-      rset_clear(allow, keyhi);[m
[31m-    }[m
[31m-  } else if (!irt_ispri(kt)) {[m
[31m-    k = emit_isk12(ARMI_CMP, irkey->i);[m
[31m-    if (!k) {[m
[31m-      key = ra_alloc1(as, refkey, allow);[m
[31m-      rset_clear(allow, key);[m
[31m-    }[m
[31m-  }[m
[31m-  if (!irt_ispri(kt))[m
[31m-    tmp = ra_scratchpair(as, allow);[m
[31m-[m
[31m-  /* Key not found in chain: jump to exit (if merged) or load niltv. */[m
[31m-  l_end = emit_label(as);[m
[31m-  as->invmcp = NULL;[m
[31m-  if (merge == IR_NE)[m
[31m-    asm_guardcc(as, CC_AL);[m
[31m-  else if (destused)[m
[31m-    emit_loada(as, dest, niltvg(J2G(as->J)));[m
[31m-[m
[31m-  /* Follow hash chain until the end. */[m
[31m-  l_loop = --as->mcp;[m
[31m-  emit_n(as, ARMI_CMP|ARMI_K12|0, dest);[m
[31m-  emit_lso(as, ARMI_LDR, dest, dest, (int32_t)offsetof(Node, next));[m
[31m-[m
[31m-  /* Type and value comparison. */[m
[31m-  if (merge == IR_EQ)[m
[31m-    asm_guardcc(as, CC_EQ);[m
[31m-  else[m
[31m-    emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end);[m
[31m-  if (!irt_ispri(kt)) {[m
[31m-    emit_nm(as, ARMF_CC(ARMI_CMP, CC_EQ)^k, tmp, key);[m
[31m-    emit_nm(as, ARMI_CMP^khi, tmp+1, keyhi);[m
[31m-    emit_lsox(as, ARMI_LDRD, tmp, dest, (int32_t)offsetof(Node, key));[m
[31m-  } else {[m
[31m-    emit_n(as, ARMI_CMP^khi, tmp);[m
[31m-    emit_lso(as, ARMI_LDR, tmp, dest, (int32_t)offsetof(Node, key.it));[m
[31m-  }[m
[31m-  *l_loop = ARMF_CC(ARMI_B, CC_NE) | ((as->mcp-l_loop-2) & 0x00ffffffu);[m
[31m-[m
[31m-  /* Load main position relative to tab->node into dest. */[m
[31m-  khash = irref_isk(refkey) ? ir_khash(irkey) : 1;[m
[31m-  if (khash == 0) {[m
[31m-    emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-  } else {[m
[31m-    emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 3), dest, dest, tmp);[m
[31m-    emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 1), tmp, tmp, tmp);[m
[31m-    if (irt_isstr(kt)) {  /* Fetch of str->hash is cheaper than ra_allock. */[m
[31m-      emit_dnm(as, ARMI_AND, tmp, tmp+1, RID_TMP);[m
[31m-      emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-      emit_lso(as, ARMI_LDR, tmp+1, key, (int32_t)offsetof(GCstr, hash));[m
[31m-      emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-    } else if (irref_isk(refkey)) {[m
[31m-      emit_opk(as, ARMI_AND, tmp, RID_TMP, (int32_t)khash,[m
[31m-	       rset_exclude(rset_exclude(RSET_GPR, tab), dest));[m
[31m-      emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-      emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-    } else {  /* Must match with hash*() in lj_tab.c. */[m
[31m-      if (ra_hasreg(keynumhi)) {  /* Canonicalize +-0.0 to 0.0. */[m
[31m-	if (keyhi == RID_TMP)[m
[31m-	  emit_dm(as, ARMF_CC(ARMI_MOV, CC_NE), keyhi, keynumhi);[m
[31m-	emit_d(as, ARMF_CC(ARMI_MOV, CC_EQ)|ARMI_K12|0, keyhi);[m
[31m-      }[m
[31m-      emit_dnm(as, ARMI_AND, tmp, tmp, RID_TMP);[m
[31m-      emit_dnm(as, ARMI_SUB|ARMF_SH(ARMSH_ROR, 32-HASH_ROT3), tmp, tmp, tmp+1);[m
[31m-      emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-      emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_ROR, 32-((HASH_ROT2+HASH_ROT1)&31)),[m
[31m-	       tmp, tmp+1, tmp);[m
[31m-      emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-      emit_dnm(as, ARMI_SUB|ARMF_SH(ARMSH_ROR, 32-HASH_ROT1), tmp+1, tmp+1, tmp);[m
[31m-      if (ra_hasreg(keynumhi)) {[m
[31m-	emit_dnm(as, ARMI_EOR, tmp+1, tmp, key);[m
[31m-	emit_dnm(as, ARMI_ORR|ARMI_S, RID_TMP, tmp, key);  /* Test for +-0.0. */[m
[31m-	emit_dnm(as, ARMI_ADD, tmp, keynumhi, keynumhi);[m
[31m-#if !LJ_SOFTFP[m
[31m-	emit_dnm(as, ARMI_VMOV_RR_D, key, keynumhi,[m
[31m-		 (ra_alloc1(as, refkey, RSET_FPR) & 15));[m
[31m-#endif[m
[31m-      } else {[m
[31m-	emit_dnm(as, ARMI_EOR, tmp+1, tmp, key);[m
[31m-	emit_opk(as, ARMI_ADD, tmp, key, (int32_t)HASH_BIAS,[m
[31m-		 rset_exclude(rset_exclude(RSET_GPR, tab), key));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_hrefk(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *kslot = IR(ir->op2);[m
[31m-  IRIns *irkey = IR(kslot->op1);[m
[31m-  int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node));[m
[31m-  int32_t kofs = ofs + (int32_t)offsetof(Node, key);[m
[31m-  Reg dest = (ra_used(ir) || ofs > 4095) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;[m
[31m-  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg key = RID_NONE, type = RID_TMP, idx = node;[m
[31m-  RegSet allow = rset_exclude(RSET_GPR, node);[m
[31m-  lua_assert(ofs % sizeof(Node) == 0);[m
[31m-  if (ofs > 4095) {[m
[31m-    idx = dest;[m
[31m-    rset_clear(allow, dest);[m
[31m-    kofs = (int32_t)offsetof(Node, key);[m
[31m-  } else if (ra_hasreg(dest)) {[m
[31m-    emit_opk(as, ARMI_ADD, dest, node, ofs, allow);[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  if (!irt_ispri(irkey->t)) {[m
[31m-    RegSet even = (as->freeset & allow);[m
[31m-    even = even & (even >> 1) & RSET_GPREVEN;[m
[31m-    if (even) {[m
[31m-      key = ra_scratch(as, even);[m
[31m-      if (rset_test(as->freeset, key+1)) {[m
[31m-	type = key+1;[m
[31m-	ra_modified(as, type);[m
[31m-      }[m
[31m-    } else {[m
[31m-      key = ra_scratch(as, allow);[m
[31m-    }[m
[31m-    rset_clear(allow, key);[m
[31m-  }[m
[31m-  rset_clear(allow, type);[m
[31m-  if (irt_isnum(irkey->t)) {[m
[31m-    emit_opk(as, ARMF_CC(ARMI_CMP, CC_EQ), 0, type,[m
[31m-	     (int32_t)ir_knum(irkey)->u32.hi, allow);[m
[31m-    emit_opk(as, ARMI_CMP, 0, key,[m
[31m-	     (int32_t)ir_knum(irkey)->u32.lo, allow);[m
[31m-  } else {[m
[31m-    if (ra_hasreg(key))[m
[31m-      emit_opk(as, ARMF_CC(ARMI_CMP, CC_EQ), 0, key, irkey->i, allow);[m
[31m-    emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype(irkey->t), type);[m
[31m-  }[m
[31m-  emit_lso(as, ARMI_LDR, type, idx, kofs+4);[m
[31m-  if (ra_hasreg(key)) emit_lso(as, ARMI_LDR, key, idx, kofs);[m
[31m-  if (ofs > 4095)[m
[31m-    emit_opk(as, ARMI_ADD, dest, node, ofs, RSET_GPR);[m
[31m-}[m
[31m-[m
[31m-static void asm_uref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* NYI: Check that UREFO is still open and not aliasing a slot. */[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-    MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;[m
[31m-    emit_lsptr(as, ARMI_LDR, dest, v);[m
[31m-  } else {[m
[31m-    Reg uv = ra_scratch(as, RSET_GPR);[m
[31m-    Reg func = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (ir->o == IR_UREFC) {[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_n(as, ARMI_CMP|ARMI_K12|1, RID_TMP);[m
[31m-      emit_opk(as, ARMI_ADD, dest, uv,[m
[31m-	       (int32_t)offsetof(GCupval, tv), RSET_GPR);[m
[31m-      emit_lso(as, ARMI_LDRB, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));[m
[31m-    } else {[m
[31m-      emit_lso(as, ARMI_LDR, dest, uv, (int32_t)offsetof(GCupval, v));[m
[31m-    }[m
[31m-    emit_lso(as, ARMI_LDR, uv, func,[m
[31m-	     (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(as); UNUSED(ir);[m
[31m-  lua_assert(!ra_used(ir));[m
[31m-}[m
[31m-[m
[31m-static void asm_strref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRRef ref = ir->op2, refk = ir->op1;[m
[31m-  Reg r;[m
[31m-  if (irref_isk(ref)) {[m
[31m-    IRRef tmp = refk; refk = ref; ref = tmp;[m
[31m-  } else if (!irref_isk(refk)) {[m
[31m-    uint32_t k, m = ARMI_K12|sizeof(GCstr);[m
[31m-    Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    IRIns *irr = IR(ir->op2);[m
[31m-    if (ra_hasreg(irr->r)) {[m
[31m-      ra_noweak(as, irr->r);[m
[31m-      right = irr->r;[m
[31m-    } else if (mayfuse(as, irr->op2) &&[m
[31m-	       irr->o == IR_ADD && irref_isk(irr->op2) &&[m
[31m-	       (k = emit_isk12(ARMI_ADD,[m
[31m-			       (int32_t)sizeof(GCstr) + IR(irr->op2)->i))) {[m
[31m-      m = k;[m
[31m-      right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left));[m
[31m-    } else {[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    }[m
[31m-    emit_dn(as, ARMI_ADD^m, dest, dest);[m
[31m-    emit_dnm(as, ARMI_ADD, dest, left, right);[m
[31m-    return;[m
[31m-  }[m
[31m-  r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-  emit_opk(as, ARMI_ADD, dest, r,[m
[31m-	   sizeof(GCstr) + IR(refk)->i, rset_exclude(RSET_GPR, r));[m
[31m-}[m
[31m-[m
[31m-/* -- Loads and stores ---------------------------------------------------- */[m
[31m-[m
[31m-static ARMIns asm_fxloadins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: return ARMI_LDRSB;[m
[31m-  case IRT_U8: return ARMI_LDRB;[m
[31m-  case IRT_I16: return ARMI_LDRSH;[m
[31m-  case IRT_U16: return ARMI_LDRH;[m
[31m-  case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VLDR_D;[m
[31m-  case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VLDR_S;[m
[31m-  default: return ARMI_LDR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static ARMIns asm_fxstoreins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: case IRT_U8: return ARMI_STRB;[m
[31m-  case IRT_I16: case IRT_U16: return ARMI_STRH;[m
[31m-  case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VSTR_D;[m
[31m-  case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VSTR_S;[m
[31m-  default: return ARMI_STR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  ARMIns ai = asm_fxloadins(ir);[m
[31m-  int32_t ofs;[m
[31m-  if (ir->op2 == IRFL_TAB_ARRAY) {[m
[31m-    ofs = asm_fuseabase(as, ir->op1);[m
[31m-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */[m
[31m-      emit_dn(as, ARMI_ADD|ARMI_K12|ofs, dest, idx);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  ofs = field_ofs[ir->op2];[m
[31m-  if ((ai & 0x04000000))[m
[31m-    emit_lso(as, ai, dest, idx, ofs);[m
[31m-  else[m
[31m-    emit_lsox(as, ai, dest, idx, ofs);[m
[31m-}[m
[31m-[m
[31m-static void asm_fstore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-    IRIns *irf = IR(ir->op1);[m
[31m-    Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src));[m
[31m-    int32_t ofs = field_ofs[irf->op2];[m
[31m-    ARMIns ai = asm_fxstoreins(ir);[m
[31m-    if ((ai & 0x04000000))[m
[31m-      emit_lso(as, ai, src, idx, ofs);[m
[31m-    else[m
[31m-      emit_lsox(as, ai, src, idx, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_xload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir,[m
[31m-		     (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-  lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED));[m
[31m-  asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0);[m
[31m-}[m
[31m-[m
[31m-static void asm_xstore_(ASMState *as, IRIns *ir, int32_t ofs)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2,[m
[31m-			(!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-    asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1,[m
[31m-		 rset_exclude(RSET_GPR, src), ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_xstore(as, ir)	asm_xstore_(as, ir, 0)[m
[31m-[m
[31m-static void asm_ahuvload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);[m
[31m-  Reg dest = RID_NONE, type = RID_NONE, idx;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int32_t ofs = 0;[m
[31m-  if (hiop && ra_used(ir+1)) {[m
[31m-    type = ra_dest(as, ir+1, allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||[m
[31m-	       irt_isint(ir->t) || irt_isaddr(ir->t));[m
[31m-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);[m
[31m-    rset_clear(allow, dest);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow,[m
[31m-		       (!LJ_SOFTFP && t == IRT_NUM) ? 1024 : 4096);[m
[31m-  if (!hiop || type == RID_NONE) {[m
[31m-    rset_clear(allow, idx);[m
[31m-    if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 &&[m
[31m-	rset_test((as->freeset & allow), dest+1)) {[m
[31m-      type = dest+1;[m
[31m-      ra_modified(as, type);[m
[31m-    } else {[m
[31m-      type = RID_TMP;[m
[31m-    }[m
[31m-  }[m
[31m-  asm_guardcc(as, t == IRT_NUM ? CC_HS : CC_NE);[m
[31m-  emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype_(t), type);[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-#if !LJ_SOFTFP[m
[31m-    if (t == IRT_NUM)[m
[31m-      emit_vlso(as, ARMI_VLDR_D, dest, idx, ofs);[m
[31m-    else[m
[31m-#endif[m
[31m-      emit_lso(as, ARMI_LDR, dest, idx, ofs);[m
[31m-  }[m
[31m-  emit_lso(as, ARMI_LDR, type, idx, ofs+4);[m
[31m-}[m
[31m-[m
[31m-static void asm_ahustore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    RegSet allow = RSET_GPR;[m
[31m-    Reg idx, src = RID_NONE, type = RID_NONE;[m
[31m-    int32_t ofs = 0;[m
[31m-#if !LJ_SOFTFP[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-      src = ra_alloc1(as, ir->op2, RSET_FPR);[m
[31m-      idx = asm_fuseahuref(as, ir->op1, &ofs, allow, 1024);[m
[31m-      emit_vlso(as, ARMI_VSTR_D, src, idx, ofs);[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-      int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-      if (!irt_ispri(ir->t)) {[m
[31m-	src = ra_alloc1(as, ir->op2, allow);[m
[31m-	rset_clear(allow, src);[m
[31m-      }[m
[31m-      if (hiop)[m
[31m-	type = ra_alloc1(as, (ir+1)->op2, allow);[m
[31m-      else[m
[31m-	type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-      idx = asm_fuseahuref(as, ir->op1, &ofs, rset_exclude(allow, type), 4096);[m
[31m-      if (ra_hasreg(src)) emit_lso(as, ARMI_STR, src, idx, ofs);[m
[31m-      emit_lso(as, ARMI_STR, type, idx, ofs+4);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);[m
[31m-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);[m
[31m-  Reg dest = RID_NONE, type = RID_NONE, base;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */[m
[31m-  lua_assert(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_CONVERT));  /* Handled by LJ_SOFTFP SPLIT. */[m
[31m-  if (hiop && ra_used(ir+1)) {[m
[31m-    type = ra_dest(as, ir+1, allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-#else[m
[31m-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(ir->t) && t == IRT_INT) {[m
[31m-    dest = ra_scratch(as, RSET_FPR);[m
[31m-    asm_tointg(as, ir, dest);[m
[31m-    t = IRT_NUM;  /* Continue with a regular number type check. */[m
[31m-  } else[m
[31m-#endif[m
[31m-  if (ra_used(ir)) {[m
[31m-    Reg tmp = RID_NONE;[m
[31m-    if ((ir->op2 & IRSLOAD_CONVERT))[m
[31m-      tmp = ra_scratch(as, t == IRT_INT ? RSET_FPR : RSET_GPR);[m
[31m-    lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||[m
[31m-	       irt_isint(ir->t) || irt_isaddr(ir->t));[m
[31m-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);[m
[31m-    rset_clear(allow, dest);[m
[31m-    base = ra_alloc1(as, REF_BASE, allow);[m
[31m-    if ((ir->op2 & IRSLOAD_CONVERT)) {[m
[31m-      if (t == IRT_INT) {[m
[31m-	emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15));[m
[31m-	emit_dm(as, ARMI_VCVT_S32_F64, (tmp & 15), (tmp & 15));[m
[31m-	t = IRT_NUM;  /* Check for original type. */[m
[31m-      } else {[m
[31m-	emit_dm(as, ARMI_VCVT_F64_S32, (dest & 15), (dest & 15));[m
[31m-	emit_dn(as, ARMI_VMOV_S_R, tmp, (dest & 15));[m
[31m-	t = IRT_INT;  /* Check for original type. */[m
[31m-      }[m
[31m-      dest = tmp;[m
[31m-    }[m
[31m-    goto dotypecheck;[m
[31m-  }[m
[31m-  base = ra_alloc1(as, REF_BASE, allow);[m
[31m-dotypecheck:[m
[31m-  rset_clear(allow, base);[m
[31m-  if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-    if (ra_noreg(type)) {[m
[31m-      if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 &&[m
[31m-	  rset_test((as->freeset & allow), dest+1)) {[m
[31m-	type = dest+1;[m
[31m-	ra_modified(as, type);[m
[31m-      } else {[m
[31m-	type = RID_TMP;[m
[31m-      }[m
[31m-    }[m
[31m-    asm_guardcc(as, t == IRT_NUM ? CC_HS : CC_NE);[m
[31m-    emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype_(t), type);[m
[31m-  }[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-#if !LJ_SOFTFP[m
[31m-    if (t == IRT_NUM) {[m
[31m-      if (ofs < 1024) {[m
[31m-	emit_vlso(as, ARMI_VLDR_D, dest, base, ofs);[m
[31m-      } else {[m
[31m-	if (ra_hasreg(type)) emit_lso(as, ARMI_LDR, type, base, ofs+4);[m
[31m-	emit_vlso(as, ARMI_VLDR_D, dest, RID_TMP, 0);[m
[31m-	emit_opk(as, ARMI_ADD, RID_TMP, base, ofs, allow);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else[m
[31m-#endif[m
[31m-      emit_lso(as, ARMI_LDR, dest, base, ofs);[m
[31m-  }[m
[31m-  if (ra_hasreg(type)) emit_lso(as, ARMI_LDR, type, base, ofs+4);[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_cnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(as->J));[m
[31m-  CTypeID id = (CTypeID)IR(ir->op1)->i;[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco];[m
[31m-  IRRef args[4];[m
[31m-  RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL));[m
[31m-[m
[31m-  as->gcsteps++;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  if (ra_used(ir))[m
[31m-    ra_destreg(as, ir, RID_RET);  /* GCcdata * */[m
[31m-[m
[31m-  /* Initialize immutable cdata object. */[m
[31m-  if (ir->o == IR_CNEWI) {[m
[31m-    int32_t ofs = sizeof(GCcdata);[m
[31m-    lua_assert(sz == 4 || sz == 8);[m
[31m-    if (sz == 8) {[m
[31m-      ofs += 4; ir++;[m
[31m-      lua_assert(ir->o == IR_HIOP);[m
[31m-    }[m
[31m-    for (;;) {[m
[31m-      Reg r = ra_alloc1(as, ir->op2, allow);[m
[31m-      emit_lso(as, ARMI_STR, r, RID_RET, ofs);[m
[31m-      rset_clear(allow, r);[m
[31m-      if (ofs == sizeof(GCcdata)) break;[m
[31m-      ofs -= 4; ir--;[m
[31m-    }[m
[31m-  } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];[m
[31m-    args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-    args[1] = ir->op1;      /* CTypeID id   */[m
[31m-    args[2] = ir->op2;      /* CTSize sz    */[m
[31m-    args[3] = ASMREF_TMP1;  /* CTSize align */[m
[31m-    asm_gencall(as, ci, args);[m
[31m-    emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)ctype_align(info));[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */[m
[31m-  {[m
[31m-    uint32_t k = emit_isk12(ARMI_MOV, id);[m
[31m-    Reg r = k ? RID_R1 : ra_allock(as, id, allow);[m
[31m-    emit_lso(as, ARMI_STRB, RID_TMP, RID_RET, offsetof(GCcdata, gct));[m
[31m-    emit_lsox(as, ARMI_STRH, r, RID_RET, offsetof(GCcdata, ctypeid));[m
[31m-    emit_d(as, ARMI_MOV|ARMI_K12|~LJ_TCDATA, RID_TMP);[m
[31m-    if (k) emit_d(as, ARMI_MOV^k, RID_R1);[m
[31m-  }[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ASMREF_TMP1;  /* MSize size   */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)),[m
[31m-	       ra_releasetmp(as, ASMREF_TMP1));[m
[31m-}[m
[31m-#else[m
[31m-#define asm_cnew(as, ir)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-static void asm_tbar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg link = ra_scratch(as, rset_exclude(RSET_GPR, tab));[m
[31m-  Reg gr = ra_allock(as, i32ptr(J2G(as->J)),[m
[31m-		     rset_exclude(rset_exclude(RSET_GPR, tab), link));[m
[31m-  Reg mark = RID_TMP;[m
[31m-  MCLabel l_end = emit_label(as);[m
[31m-  emit_lso(as, ARMI_STR, link, tab, (int32_t)offsetof(GCtab, gclist));[m
[31m-  emit_lso(as, ARMI_STRB, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-  emit_lso(as, ARMI_STR, tab, gr,[m
[31m-	   (int32_t)offsetof(global_State, gc.grayagain));[m
[31m-  emit_dn(as, ARMI_BIC|ARMI_K12|LJ_GC_BLACK, mark, mark);[m
[31m-  emit_lso(as, ARMI_LDR, link, gr,[m
[31m-	   (int32_t)offsetof(global_State, gc.grayagain));[m
[31m-  emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end);[m
[31m-  emit_n(as, ARMI_TST|ARMI_K12|LJ_GC_BLACK, mark);[m
[31m-  emit_lso(as, ARMI_LDRB, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-}[m
[31m-[m
[31m-static void asm_obar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg obj, val, tmp;[m
[31m-  /* No need for other object barriers (yet). */[m
[31m-  lua_assert(IR(ir->op1)->o == IR_UREFC);[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ir->op1;      /* TValue *tv      */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  if ((l_end[-1] >> 28) == CC_AL)[m
[31m-    l_end[-1] = ARMF_CC(l_end[-1], CC_NE);[m
[31m-  else[m
[31m-    emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end);[m
[31m-  ra_allockreg(as, i32ptr(J2G(as->J)), ra_releasetmp(as, ASMREF_TMP1));[m
[31m-  obj = IR(ir->op1)->r;[m
[31m-  tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_n(as, ARMF_CC(ARMI_TST, CC_NE)|ARMI_K12|LJ_GC_BLACK, tmp);[m
[31m-  emit_n(as, ARMI_TST|ARMI_K12|LJ_GC_WHITES, RID_TMP);[m
[31m-  val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_lso(as, ARMI_LDRB, tmp, obj,[m
[31m-	   (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));[m
[31m-  emit_lso(as, ARMI_LDRB, RID_TMP, val, (int32_t)offsetof(GChead, marked));[m
[31m-}[m
[31m-[m
[31m-/* -- Arithmetic and logic operations ------------------------------------- */[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_fparith(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  emit_dnm(as, ai, (dest & 15), (left & 15), (right & 15));[m
[31m-}[m
[31m-[m
[31m-static void asm_fpunary(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR);[m
[31m-  emit_dm(as, ai, (dest & 15), (left & 15));[m
[31m-}[m
[31m-[m
[31m-static void asm_callround(ASMState *as, IRIns *ir, int id)[m
[31m-{[m
[31m-  /* The modified regs must match with the *.dasc implementation. */[m
[31m-  RegSet drop = RID2RSET(RID_R0)|RID2RSET(RID_R1)|RID2RSET(RID_R2)|[m
[31m-		RID2RSET(RID_R3)|RID2RSET(RID_R12);[m
[31m-  RegSet of;[m
[31m-  Reg dest, src;[m
[31m-  ra_evictset(as, drop);[m
[31m-  dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  emit_dnm(as, ARMI_VMOV_D_RR, RID_RETLO, RID_RETHI, (dest & 15));[m
[31m-  emit_call(as, id == IRFPM_FLOOR ? (void *)lj_vm_floor_sf :[m
[31m-		id == IRFPM_CEIL ? (void *)lj_vm_ceil_sf :[m
[31m-				   (void *)lj_vm_trunc_sf);[m
[31m-  /* Workaround to protect argument GPRs from being used for remat. */[m
[31m-  of = as->freeset;[m
[31m-  as->freeset &= ~RSET_RANGE(RID_R0, RID_R1+1);[m
[31m-  as->cost[RID_R0] = as->cost[RID_R1] = REGCOST(~0u, ASMREF_L);[m
[31m-  src = ra_alloc1(as, ir->op1, RSET_FPR);  /* May alloc GPR to remat FPR. */[m
[31m-  as->freeset |= (of & RSET_RANGE(RID_R0, RID_R1+1));[m
[31m-  emit_dnm(as, ARMI_VMOV_RR_D, RID_R0, RID_R1, (src & 15));[m
[31m-}[m
[31m-[m
[31m-static void asm_fpmath(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir))[m
[31m-    return;[m
[31m-  if (ir->op2 <= IRFPM_TRUNC)[m
[31m-    asm_callround(as, ir, ir->op2);[m
[31m-  else if (ir->op2 == IRFPM_SQRT)[m
[31m-    asm_fpunary(as, ir, ARMI_VSQRT_D);[m
[31m-  else[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static int asm_swapops(ASMState *as, IRRef lref, IRRef rref)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  if (irref_isk(rref))[m
[31m-    return 0;  /* Don't swap constants to the left. */[m
[31m-  if (irref_isk(lref))[m
[31m-    return 1;  /* But swap constants to the right. */[m
[31m-  ir = IR(rref);[m
[31m-  if ((ir->o >= IR_BSHL && ir->o <= IR_BROR) ||[m
[31m-      (ir->o == IR_ADD && ir->op1 == ir->op2))[m
[31m-    return 0;  /* Don't swap fusable operands to the left. */[m
[31m-  ir = IR(lref);[m
[31m-  if ((ir->o >= IR_BSHL && ir->o <= IR_BROR) ||[m
[31m-      (ir->o == IR_ADD && ir->op1 == ir->op2))[m
[31m-    return 1;  /* But swap fusable operands to the right. */[m
[31m-  return 0;  /* Otherwise don't swap. */[m
[31m-}[m
[31m-[m
[31m-static void asm_intop(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  Reg left, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  uint32_t m;[m
[31m-  if (asm_swapops(as, lref, rref)) {[m
[31m-    IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-    if ((ai & ~ARMI_S) == ARMI_SUB || (ai & ~ARMI_S) == ARMI_SBC)[m
[31m-      ai ^= (ARMI_SUB^ARMI_RSB);[m
[31m-  }[m
[31m-  left = ra_hintalloc(as, lref, dest, RSET_GPR);[m
[31m-  m = asm_fuseopm(as, ai, rref, rset_exclude(RSET_GPR, left));[m
[31m-  if (irt_isguard(ir->t)) {  /* For IR_ADDOV etc. */[m
[31m-    asm_guardcc(as, CC_VS);[m
[31m-    ai |= ARMI_S;[m
[31m-  }[m
[31m-  emit_dn(as, ai^m, dest, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_intop_s(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  if (as->flagmcp == as->mcp) {  /* Drop cmp r, #0. */[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    ai |= ARMI_S;[m
[31m-  }[m
[31m-  asm_intop(as, ir, ai);[m
[31m-}[m
[31m-[m
[31m-static void asm_intneg(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  emit_dn(as, ai|ARMI_K12|0, dest, left);[m
[31m-}[m
[31m-[m
[31m-/* NYI: use add/shift for MUL(OV) with constants. FOLD only does 2^k. */[m
[31m-static void asm_intmul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, dest));[m
[31m-  Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  Reg tmp = RID_NONE;[m
[31m-  /* ARMv5 restriction: dest != left and dest_hi != left. */[m
[31m-  if (dest == left && left != right) { left = right; right = dest; }[m
[31m-  if (irt_isguard(ir->t)) {  /* IR_MULOV */[m
[31m-    if (!(as->flags & JIT_F_ARMV6) && dest == left)[m
[31m-      tmp = left = ra_scratch(as, rset_exclude(RSET_GPR, left));[m
[31m-    asm_guardcc(as, CC_NE);[m
[31m-    emit_nm(as, ARMI_TEQ|ARMF_SH(ARMSH_ASR, 31), RID_TMP, dest);[m
[31m-    emit_dnm(as, ARMI_SMULL|ARMF_S(right), dest, RID_TMP, left);[m
[31m-  } else {[m
[31m-    if (!(as->flags & JIT_F_ARMV6) && dest == left) tmp = left = RID_TMP;[m
[31m-    emit_nm(as, ARMI_MUL|ARMF_S(right), dest, left);[m
[31m-  }[m
[31m-  /* Only need this for the dest == left == right case. */[m
[31m-  if (ra_hasreg(tmp)) emit_dm(as, ARMI_MOV, tmp, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_add(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (!asm_fusemadd(as, ir, ARMI_VMLA_D, ARMI_VMLA_D))[m
[31m-      asm_fparith(as, ir, ARMI_VADD_D);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  asm_intop_s(as, ir, ARMI_ADD);[m
[31m-}[m
[31m-[m
[31m-static void asm_sub(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (!asm_fusemadd(as, ir, ARMI_VNMLS_D, ARMI_VMLS_D))[m
[31m-      asm_fparith(as, ir, ARMI_VSUB_D);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  asm_intop_s(as, ir, ARMI_SUB);[m
[31m-}[m
[31m-[m
[31m-static void asm_mul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, ARMI_VMUL_D);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  asm_intmul(as, ir);[m
[31m-}[m
[31m-[m
[31m-#define asm_addov(as, ir)	asm_add(as, ir)[m
[31m-#define asm_subov(as, ir)	asm_sub(as, ir)[m
[31m-#define asm_mulov(as, ir)	asm_mul(as, ir)[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-#define asm_div(as, ir)		asm_fparith(as, ir, ARMI_VDIV_D)[m
[31m-#define asm_pow(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_powi)[m
[31m-#define asm_abs(as, ir)		asm_fpunary(as, ir, ARMI_VABS_D)[m
[31m-#define asm_atan2(as, ir)	asm_callid(as, ir, IRCALL_atan2)[m
[31m-#define asm_ldexp(as, ir)	asm_callid(as, ir, IRCALL_ldexp)[m
[31m-#endif[m
[31m-[m
[31m-#define asm_mod(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_modi)[m
[31m-[m
[31m-static void asm_neg(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fpunary(as, ir, ARMI_VNEG_D);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  asm_intneg(as, ir, ARMI_RSB);[m
[31m-}[m
[31m-[m
[31m-static void asm_bitop(ASMState *as, IRIns *ir, ARMIns ai)[m
[31m-{[m
[31m-  if (as->flagmcp == as->mcp) {  /* Try to drop cmp r, #0. */[m
[31m-    uint32_t cc = (as->mcp[1] >> 28);[m
[31m-    as->flagmcp = NULL;[m
[31m-    if (cc <= CC_NE) {[m
[31m-      as->mcp++;[m
[31m-      ai |= ARMI_S;[m
[31m-    } else if (cc == CC_GE) {[m
[31m-      *++as->mcp ^= ((CC_GE^CC_PL) << 28);[m
[31m-      ai |= ARMI_S;[m
[31m-    } else if (cc == CC_LT) {[m
[31m-      *++as->mcp ^= ((CC_LT^CC_MI) << 28);[m
[31m-      ai |= ARMI_S;[m
[31m-    }  /* else: other conds don't work with bit ops. */[m
[31m-  }[m
[31m-  if (ir->op2 == 0) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    uint32_t m = asm_fuseopm(as, ai, ir->op1, RSET_GPR);[m
[31m-    emit_d(as, ai^m, dest);[m
[31m-  } else {[m
[31m-    /* NYI: Turn BAND !k12 into uxtb, uxth or bfc or shl+shr. */[m
[31m-    asm_intop(as, ir, ai);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_bnot(as, ir)	asm_bitop(as, ir, ARMI_MVN)[m
[31m-[m
[31m-static void asm_bswap(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if ((as->flags & JIT_F_ARMV6)) {[m
[31m-    emit_dm(as, ARMI_REV, dest, left);[m
[31m-  } else {[m
[31m-    Reg tmp2 = dest;[m
[31m-    if (tmp2 == left)[m
[31m-      tmp2 = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, dest), left));[m
[31m-    emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_LSR, 8), dest, tmp2, RID_TMP);[m
[31m-    emit_dm(as, ARMI_MOV|ARMF_SH(ARMSH_ROR, 8), tmp2, left);[m
[31m-    emit_dn(as, ARMI_BIC|ARMI_K12|256*8|255, RID_TMP, RID_TMP);[m
[31m-    emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_ROR, 16), RID_TMP, left, left);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_band(as, ir)	asm_bitop(as, ir, ARMI_AND)[m
[31m-#define asm_bor(as, ir)		asm_bitop(as, ir, ARMI_ORR)[m
[31m-#define asm_bxor(as, ir)	asm_bitop(as, ir, ARMI_EOR)[m
[31m-[m
[31m-static void asm_bitshift(ASMState *as, IRIns *ir, ARMShift sh)[m
[31m-{[m
[31m-  if (irref_isk(ir->op2)) {  /* Constant shifts. */[m
[31m-    /* NYI: Turn SHL+SHR or BAND+SHR into uxtb, uxth or ubfx. */[m
[31m-    /* NYI: Turn SHL+ASR into sxtb, sxth or sbfx. */[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    int32_t shift = (IR(ir->op2)->i & 31);[m
[31m-    emit_dm(as, ARMI_MOV|ARMF_SH(sh, shift), dest, left);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_dm(as, ARMI_MOV|ARMF_RSH(sh, right), dest, left);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_bshl(as, ir)	asm_bitshift(as, ir, ARMSH_LSL)[m
[31m-#define asm_bshr(as, ir)	asm_bitshift(as, ir, ARMSH_LSR)[m
[31m-#define asm_bsar(as, ir)	asm_bitshift(as, ir, ARMSH_ASR)[m
[31m-#define asm_bror(as, ir)	asm_bitshift(as, ir, ARMSH_ROR)[m
[31m-#define asm_brol(as, ir)	lua_assert(0)[m
[31m-[m
[31m-static void asm_intmin_max(ASMState *as, IRIns *ir, int cc)[m
[31m-{[m
[31m-  uint32_t kcmp = 0, kmov = 0;[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  Reg right = 0;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    kcmp = emit_isk12(ARMI_CMP, IR(ir->op2)->i);[m
[31m-    if (kcmp) kmov = emit_isk12(ARMI_MOV, IR(ir->op2)->i);[m
[31m-  }[m
[31m-  if (!kmov) {[m
[31m-    kcmp = 0;[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  }[m
[31m-  if (kmov || dest != right) {[m
[31m-    emit_dm(as, ARMF_CC(ARMI_MOV, cc)^kmov, dest, right);[m
[31m-    cc ^= 1;  /* Must use opposite conditions for paired moves. */[m
[31m-  } else {[m
[31m-    cc ^= (CC_LT^CC_GT);  /* Otherwise may swap CC_LT <-> CC_GT. */[m
[31m-  }[m
[31m-  if (dest != left) emit_dm(as, ARMF_CC(ARMI_MOV, cc), dest, left);[m
[31m-  emit_nm(as, ARMI_CMP^kcmp, left, right);[m
[31m-}[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-static void asm_sfpmin_max(ASMState *as, IRIns *ir, int cc)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_softfp_cmp];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  Reg r;[m
[31m-  IRRef args[4];[m
[31m-  args[0] = ir->op1; args[1] = (ir+1)->op1;[m
[31m-  args[2] = ir->op2; args[3] = (ir+1)->op2;[m
[31m-  /* __aeabi_cdcmple preserves r0-r3. */[m
[31m-  if (ra_hasreg(ir->r)) rset_clear(drop, ir->r);[m
[31m-  if (ra_hasreg((ir+1)->r)) rset_clear(drop, (ir+1)->r);[m
[31m-  if (!rset_test(as->freeset, RID_R2) &&[m
[31m-      regcost_ref(as->cost[RID_R2]) == args[2]) rset_clear(drop, RID_R2);[m
[31m-  if (!rset_test(as->freeset, RID_R3) &&[m
[31m-      regcost_ref(as->cost[RID_R3]) == args[3]) rset_clear(drop, RID_R3);[m
[31m-  ra_evictset(as, drop);[m
[31m-  ra_destpair(as, ir);[m
[31m-  emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETHI, RID_R3);[m
[31m-  emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETLO, RID_R2);[m
[31m-  emit_call(as, (void *)ci->func);[m
[31m-  for (r = RID_R0; r <= RID_R3; r++)[m
[31m-    ra_leftov(as, r, args[r-RID_R0]);[m
[31m-}[m
[31m-#else[m
[31m-static void asm_fpmin_max(ASMState *as, IRIns *ir, int cc)[m
[31m-{[m
[31m-  Reg dest = (ra_dest(as, ir, RSET_FPR) & 15);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-  right = ((left >> 8) & 15); left &= 15;[m
[31m-  if (dest != left) emit_dm(as, ARMF_CC(ARMI_VMOV_D, cc^1), dest, left);[m
[31m-  if (dest != right) emit_dm(as, ARMF_CC(ARMI_VMOV_D, cc), dest, right);[m
[31m-  emit_d(as, ARMI_VMRS, 0);[m
[31m-  emit_dm(as, ARMI_VCMP_D, left, right);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_min_max(ASMState *as, IRIns *ir, int cc, int fcc)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  UNUSED(fcc);[m
[31m-#else[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fpmin_max(as, ir, fcc);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_intmin_max(as, ir, cc);[m
[31m-}[m
[31m-[m
[31m-#define asm_min(as, ir)		asm_min_max(as, ir, CC_GT, CC_HI)[m
[31m-#define asm_max(as, ir)		asm_min_max(as, ir, CC_LT, CC_LO)[m
[31m-[m
[31m-/* -- Comparisons --------------------------------------------------------- */[m
[31m-[m
[31m-/* Map of comparisons to flags. ORDER IR. */[m
[31m-static const uint8_t asm_compmap[IR_ABC+1] = {[m
[31m-  /* op  FP swp  int cc   FP cc */[m
[31m-  /* LT       */ CC_GE + (CC_HS << 4),[m
[31m-  /* GE    x  */ CC_LT + (CC_HI << 4),[m
[31m-  /* LE       */ CC_GT + (CC_HI << 4),[m
[31m-  /* GT    x  */ CC_LE + (CC_HS << 4),[m
[31m-  /* ULT   x  */ CC_HS + (CC_LS << 4),[m
[31m-  /* UGE      */ CC_LO + (CC_LO << 4),[m
[31m-  /* ULE   x  */ CC_HI + (CC_LO << 4),[m
[31m-  /* UGT      */ CC_LS + (CC_LS << 4),[m
[31m-  /* EQ       */ CC_NE + (CC_NE << 4),[m
[31m-  /* NE       */ CC_EQ + (CC_EQ << 4),[m
[31m-  /* ABC      */ CC_LS + (CC_LS << 4)  /* Same as UGT. */[m
[31m-};[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-/* FP comparisons. */[m
[31m-static void asm_sfpcomp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_softfp_cmp];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  Reg r;[m
[31m-  IRRef args[4];[m
[31m-  int swp = (((ir->o ^ (ir->o >> 2)) & ~(ir->o >> 3) & 1) << 1);[m
[31m-  args[swp^0] = ir->op1; args[swp^1] = (ir+1)->op1;[m
[31m-  args[swp^2] = ir->op2; args[swp^3] = (ir+1)->op2;[m
[31m-  /* __aeabi_cdcmple preserves r0-r3. This helps to reduce spills. */[m
[31m-  for (r = RID_R0; r <= RID_R3; r++)[m
[31m-    if (!rset_test(as->freeset, r) &&[m
[31m-	regcost_ref(as->cost[r]) == args[r-RID_R0]) rset_clear(drop, r);[m
[31m-  ra_evictset(as, drop);[m
[31m-  asm_guardcc(as, (asm_compmap[ir->o] >> 4));[m
[31m-  emit_call(as, (void *)ci->func);[m
[31m-  for (r = RID_R0; r <= RID_R3; r++)[m
[31m-    ra_leftov(as, r, args[r-RID_R0]);[m
[31m-}[m
[31m-#else[m
[31m-/* FP comparisons. */[m
[31m-static void asm_fpcomp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg left, right;[m
[31m-  ARMIns ai;[m
[31m-  int swp = ((ir->o ^ (ir->o >> 2)) & ~(ir->o >> 3) & 1);[m
[31m-  if (!swp && irref_isk(ir->op2) && ir_knum(IR(ir->op2))->u64 == 0) {[m
[31m-    left = (ra_alloc1(as, ir->op1, RSET_FPR) & 15);[m
[31m-    right = 0;[m
[31m-    ai = ARMI_VCMPZ_D;[m
[31m-  } else {[m
[31m-    left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    if (swp) {[m
[31m-      right = (left & 15); left = ((left >> 8) & 15);[m
[31m-    } else {[m
[31m-      right = ((left >> 8) & 15); left &= 15;[m
[31m-    }[m
[31m-    ai = ARMI_VCMP_D;[m
[31m-  }[m
[31m-  asm_guardcc(as, (asm_compmap[ir->o] >> 4));[m
[31m-  emit_d(as, ARMI_VMRS, 0);[m
[31m-  emit_dm(as, ai, left, right);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Integer comparisons. */[m
[31m-static void asm_intcomp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  ARMCC cc = (asm_compmap[ir->o] & 15);[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  Reg left;[m
[31m-  uint32_t m;[m
[31m-  int cmpprev0 = 0;[m
[31m-  lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t));[m
[31m-  if (asm_swapops(as, lref, rref)) {[m
[31m-    Reg tmp = lref; lref = rref; rref = tmp;[m
[31m-    if (cc >= CC_GE) cc ^= 7;  /* LT <-> GT, LE <-> GE */[m
[31m-    else if (cc > CC_NE) cc ^= 11;  /* LO <-> HI, LS <-> HS */[m
[31m-  }[m
[31m-  if (irref_isk(rref) && IR(rref)->i == 0) {[m
[31m-    IRIns *irl = IR(lref);[m
[31m-    cmpprev0 = (irl+1 == ir);[m
[31m-    /* Combine comp(BAND(left, right), 0) into tst left, right. */[m
[31m-    if (cmpprev0 && irl->o == IR_BAND && !ra_used(irl)) {[m
[31m-      IRRef blref = irl->op1, brref = irl->op2;[m
[31m-      uint32_t m2 = 0;[m
[31m-      Reg bleft;[m
[31m-      if (asm_swapops(as, blref, brref)) {[m
[31m-	Reg tmp = blref; blref = brref; brref = tmp;[m
[31m-      }[m
[31m-      if (irref_isk(brref)) {[m
[31m-	m2 = emit_isk12(ARMI_AND, IR(brref)->i);[m
[31m-	if ((m2 & (ARMI_AND^ARMI_BIC)))[m
[31m-	  goto notst;  /* Not beneficial if we miss a constant operand. */[m
[31m-      }[m
[31m-      if (cc == CC_GE) cc = CC_PL;[m
[31m-      else if (cc == CC_LT) cc = CC_MI;[m
[31m-      else if (cc > CC_NE) goto notst;  /* Other conds don't work with tst. */[m
[31m-      bleft = ra_alloc1(as, blref, RSET_GPR);[m
[31m-      if (!m2) m2 = asm_fuseopm(as, 0, brref, rset_exclude(RSET_GPR, bleft));[m
[31m-      asm_guardcc(as, cc);[m
[31m-      emit_n(as, ARMI_TST^m2, bleft);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-notst:[m
[31m-  left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-  m = asm_fuseopm(as, ARMI_CMP, rref, rset_exclude(RSET_GPR, left));[m
[31m-  asm_guardcc(as, cc);[m
[31m-  emit_n(as, ARMI_CMP^m, left);[m
[31m-  /* Signed comparison with zero and referencing previous ins? */[m
[31m-  if (cmpprev0 && (cc <= CC_NE || cc >= CC_GE))[m
[31m-    as->flagmcp = as->mcp;  /* Allow elimination of the compare. */[m
[31m-}[m
[31m-[m
[31m-static void asm_comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fpcomp(as, ir);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_intcomp(as, ir);[m
[31m-}[m
[31m-[m
[31m-#define asm_equal(as, ir)	asm_comp(as, ir)[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* 64 bit integer comparisons. */[m
[31m-static void asm_int64comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int signedcomp = (ir->o <= IR_GT);[m
[31m-  ARMCC cclo, cchi;[m
[31m-  Reg leftlo, lefthi;[m
[31m-  uint32_t mlo, mhi;[m
[31m-  RegSet allow = RSET_GPR, oldfree;[m
[31m-[m
[31m-  /* Always use unsigned comparison for loword. */[m
[31m-  cclo = asm_compmap[ir->o + (signedcomp ? 4 : 0)] & 15;[m
[31m-  leftlo = ra_alloc1(as, ir->op1, allow);[m
[31m-  oldfree = as->freeset;[m
[31m-  mlo = asm_fuseopm(as, ARMI_CMP, ir->op2, rset_clear(allow, leftlo));[m
[31m-  allow &= ~(oldfree & ~as->freeset);  /* Update for allocs of asm_fuseopm. */[m
[31m-[m
[31m-  /* Use signed or unsigned comparison for hiword. */[m
[31m-  cchi = asm_compmap[ir->o] & 15;[m
[31m-  lefthi = ra_alloc1(as, (ir+1)->op1, allow);[m
[31m-  mhi = asm_fuseopm(as, ARMI_CMP, (ir+1)->op2, rset_clear(allow, lefthi));[m
[31m-[m
[31m-  /* All register allocations must be performed _before_ this point. */[m
[31m-  if (signedcomp) {[m
[31m-    MCLabel l_around = emit_label(as);[m
[31m-    asm_guardcc(as, cclo);[m
[31m-    emit_n(as, ARMI_CMP^mlo, leftlo);[m
[31m-    emit_branch(as, ARMF_CC(ARMI_B, CC_NE), l_around);[m
[31m-    if (cchi == CC_GE || cchi == CC_LE) cchi ^= 6;  /* GE -> GT, LE -> LT */[m
[31m-    asm_guardcc(as, cchi);[m
[31m-  } else {[m
[31m-    asm_guardcc(as, cclo);[m
[31m-    emit_n(as, ARMF_CC(ARMI_CMP, CC_EQ)^mlo, leftlo);[m
[31m-  }[m
[31m-  emit_n(as, ARMI_CMP^mhi, lefthi);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */[m
[31m-[m
[31m-/* Hiword op of a split 64 bit op. Previous op must be the loword op. */[m
[31m-static void asm_hiop(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_HASFFI || LJ_SOFTFP[m
[31m-  /* HIOP is marked as a store because it needs its own DCE logic. */[m
[31m-  int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */[m
[31m-  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;[m
[31m-  if ((ir-1)->o <= IR_NE) {  /* 64 bit integer or FP comparisons. ORDER IR. */[m
[31m-    as->curins--;  /* Always skip the loword comparison. */[m
[31m-#if LJ_SOFTFP[m
[31m-    if (!irt_isint(ir->t)) {[m
[31m-      asm_sfpcomp(as, ir-1);[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-    asm_int64comp(as, ir-1);[m
[31m-#endif[m
[31m-    return;[m
[31m-#if LJ_SOFTFP[m
[31m-  } else if ((ir-1)->o == IR_MIN || (ir-1)->o == IR_MAX) {[m
[31m-    as->curins--;  /* Always skip the loword min/max. */[m
[31m-    if (uselo || usehi)[m
[31m-      asm_sfpmin_max(as, ir-1, (ir-1)->o == IR_MIN ? CC_HI : CC_LO);[m
[31m-    return;[m
[31m-#elif LJ_HASFFI[m
[31m-  } else if ((ir-1)->o == IR_CONV) {[m
[31m-    as->curins--;  /* Always skip the CONV. */[m
[31m-    if (usehi || uselo)[m
[31m-      asm_conv64(as, ir);[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else if ((ir-1)->o == IR_XSTORE) {[m
[31m-    if ((ir-1)->r != RID_SINK)[m
[31m-      asm_xstore_(as, ir, 4);[m
[31m-    return;[m
[31m-  }[m
[31m-  if (!usehi) return;  /* Skip unused hiword op for all remaining ops. */[m
[31m-  switch ((ir-1)->o) {[m
[31m-#if LJ_HASFFI[m
[31m-  case IR_ADD:[m
[31m-    as->curins--;[m
[31m-    asm_intop(as, ir, ARMI_ADC);[m
[31m-    asm_intop(as, ir-1, ARMI_ADD|ARMI_S);[m
[31m-    break;[m
[31m-  case IR_SUB:[m
[31m-    as->curins--;[m
[31m-    asm_intop(as, ir, ARMI_SBC);[m
[31m-    asm_intop(as, ir-1, ARMI_SUB|ARMI_S);[m
[31m-    break;[m
[31m-  case IR_NEG:[m
[31m-    as->curins--;[m
[31m-    asm_intneg(as, ir, ARMI_RSC);[m
[31m-    asm_intneg(as, ir-1, ARMI_RSB|ARMI_S);[m
[31m-    break;[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-  case IR_STRTO:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RSET_GPR);  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-#endif[m
[31m-  case IR_CALLN:[m
[31m-  case IR_CALLS:[m
[31m-  case IR_CALLXS:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RID2RSET(RID_RETLO));  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_TOSTR:[m
[31m-#endif[m
[31m-  case IR_CNEWI:[m
[31m-    /* Nothing to do here. Handled by lo op itself. */[m
[31m-    break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(as); UNUSED(ir); lua_assert(0);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_prof(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_n(as, ARMI_TST|ARMI_K12|HOOK_PROFILE, RID_TMP);[m
[31m-  emit_lsptr(as, ARMI_LDRB, RID_TMP, (void *)&J2G(as->J)->hookmask);[m
[31m-}[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check Lua stack size for overflow. Use exit handler as fallback. */[m
[31m-static void asm_stack_check(ASMState *as, BCReg topslot,[m
[31m-			    IRIns *irp, RegSet allow, ExitNo exitno)[m
[31m-{[m
[31m-  Reg pbase;[m
[31m-  uint32_t k;[m
[31m-  if (irp) {[m
[31m-    if (!ra_hasspill(irp->s)) {[m
[31m-      pbase = irp->r;[m
[31m-      lua_assert(ra_hasreg(pbase));[m
[31m-    } else if (allow) {[m
[31m-      pbase = rset_pickbot(allow);[m
[31m-    } else {[m
[31m-      pbase = RID_RET;[m
[31m-      emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0);  /* Restore temp. register. */[m
[31m-    }[m
[31m-  } else {[m
[31m-    pbase = RID_BASE;[m
[31m-  }[m
[31m-  emit_branch(as, ARMF_CC(ARMI_BL, CC_LS), exitstub_addr(as->J, exitno));[m
[31m-  k = emit_isk12(0, (int32_t)(8*topslot));[m
[31m-  lua_assert(k);[m
[31m-  emit_n(as, ARMI_CMP^k, RID_TMP);[m
[31m-  emit_dnm(as, ARMI_SUB, RID_TMP, RID_TMP, pbase);[m
[31m-  emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP,[m
[31m-	   (int32_t)offsetof(lua_State, maxstack));[m
[31m-  if (irp) {  /* Must not spill arbitrary registers in head of side trace. */[m
[31m-    int32_t i = i32ptr(&J2G(as->J)->cur_L);[m
[31m-    if (ra_hasspill(irp->s))[m
[31m-      emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s));[m
[31m-    emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095));[m
[31m-    if (ra_hasspill(irp->s) && !allow)[m
[31m-      emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0);  /* Save temp. register. */[m
[31m-    emit_loadi(as, RID_TMP, (i & ~4095));[m
[31m-  } else {[m
[31m-    emit_getgl(as, RID_TMP, cur_L);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Restore Lua stack from on-trace state. */[m
[31m-static void asm_stack_restore(ASMState *as, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  /* Store the value of all modified slots to the Lua stack. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    int32_t ofs = 8*((int32_t)s-1);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if ((sn & SNAP_NORESTORE))[m
[31m-      continue;[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-#if LJ_SOFTFP[m
[31m-      RegSet odd = rset_exclude(RSET_GPRODD, RID_BASE);[m
[31m-      Reg tmp;[m
[31m-      lua_assert(irref_isk(ref));  /* LJ_SOFTFP: must be a number constant. */[m
[31m-      tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.lo,[m
[31m-		      rset_exclude(RSET_GPREVEN, RID_BASE));[m
[31m-      emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs);[m
[31m-      if (rset_test(as->freeset, tmp+1)) odd = RID2RSET(tmp+1);[m
[31m-      tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.hi, odd);[m
[31m-      emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs+4);[m
[31m-#else[m
[31m-      Reg src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-      emit_vlso(as, ARMI_VSTR_D, src, RID_BASE, ofs);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      RegSet odd = rset_exclude(RSET_GPRODD, RID_BASE);[m
[31m-      Reg type;[m
[31m-      lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));[m
[31m-      if (!irt_ispri(ir->t)) {[m
[31m-	Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPREVEN, RID_BASE));[m
[31m-	emit_lso(as, ARMI_STR, src, RID_BASE, ofs);[m
[31m-	if (rset_test(as->freeset, src+1)) odd = RID2RSET(src+1);[m
[31m-      }[m
[31m-      if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	if (s == 0) continue;  /* Do not overwrite link to previous frame. */[m
[31m-	type = ra_allock(as, (int32_t)(*flinks--), odd);[m
[31m-#if LJ_SOFTFP[m
[31m-      } else if ((sn & SNAP_SOFTFPNUM)) {[m
[31m-	type = ra_alloc1(as, ref+1, rset_exclude(RSET_GPRODD, RID_BASE));[m
[31m-#endif[m
[31m-      } else {[m
[31m-	type = ra_allock(as, (int32_t)irt_toitype(ir->t), odd);[m
[31m-      }[m
[31m-      emit_lso(as, ARMI_STR, type, RID_BASE, ofs+4);[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-}[m
[31m-[m
[31m-/* -- GC handling --------------------------------------------------------- */[m
[31m-[m
[31m-/* Check GC threshold and do one or more GC steps. */[m
[31m-static void asm_gc_check(ASMState *as)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg tmp1, tmp2;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */[m
[31m-  asm_guardcc(as, CC_NE);  /* Assumes asm_snap_prep() already done. */[m
[31m-  emit_n(as, ARMI_CMP|ARMI_K12|0, RID_RET);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ASMREF_TMP2;  /* MSize steps     */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  tmp1 = ra_releasetmp(as, ASMREF_TMP1);[m
[31m-  tmp2 = ra_releasetmp(as, ASMREF_TMP2);[m
[31m-  emit_loadi(as, tmp2, as->gcsteps);[m
[31m-  /* Jump around GC step if GC total < GC threshold. */[m
[31m-  emit_branch(as, ARMF_CC(ARMI_B, CC_LS), l_end);[m
[31m-  emit_nm(as, ARMI_CMP, RID_TMP, tmp2);[m
[31m-  emit_lso(as, ARMI_LDR, tmp2, tmp1,[m
[31m-	   (int32_t)offsetof(global_State, gc.threshold));[m
[31m-  emit_lso(as, ARMI_LDR, RID_TMP, tmp1,[m
[31m-	   (int32_t)offsetof(global_State, gc.total));[m
[31m-  ra_allockreg(as, i32ptr(J2G(as->J)), tmp1);[m
[31m-  as->gcsteps = 0;[m
[31m-  checkmclim(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Loop handling ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the loop branch. */[m
[31m-static void asm_loop_fixup(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target = as->mcp;[m
[31m-  if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-    /* asm_guardcc already inverted the bcc and patched the final bl. */[m
[31m-    p[-2] |= ((uint32_t)(target-p) & 0x00ffffffu);[m
[31m-  } else {[m
[31m-    p[-1] = ARMI_B | ((uint32_t)((target-p)-1) & 0x00ffffffu);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Reload L register from g->cur_L. */[m
[31m-static void asm_head_lreg(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir = IR(ASMREF_L);[m
[31m-  if (ra_used(ir)) {[m
[31m-    Reg r = ra_dest(as, ir, RSET_GPR);[m
[31m-    emit_getgl(as, r, cur_L);[m
[31m-    ra_evictk(as);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Coalesce BASE register for a root trace. */[m
[31m-static void asm_head_root_base(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  asm_head_lreg(as);[m
[31m-  ir = IR(REF_BASE);[m
[31m-  if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t)))[m
[31m-    ra_spill(as, ir);[m
[31m-  ra_destreg(as, ir, RID_BASE);[m
[31m-}[m
[31m-[m
[31m-/* Coalesce BASE register for a side trace. */[m
[31m-static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  asm_head_lreg(as);[m
[31m-  ir = IR(REF_BASE);[m
[31m-  if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t)))[m
[31m-    ra_spill(as, ir);[m
[31m-  if (ra_hasspill(irp->s)) {[m
[31m-    rset_clear(allow, ra_dest(as, ir, allow));[m
[31m-  } else {[m
[31m-    Reg r = irp->r;[m
[31m-    lua_assert(ra_hasreg(r));[m
[31m-    rset_clear(allow, r);[m
[31m-    if (r != ir->r && !rset_test(as->freeset, r))[m
[31m-      ra_restore(as, regcost_ref(as->cost[r]));[m
[31m-    ra_destreg(as, ir, r);[m
[31m-  }[m
[31m-  return allow;[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the tail code. */[m
[31m-static void asm_tail_fixup(ASMState *as, TraceNo lnk)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target;[m
[31m-  int32_t spadj = as->T->spadjust;[m
[31m-  if (spadj == 0) {[m
[31m-    as->mctop = --p;[m
[31m-  } else {[m
[31m-    /* Patch stack adjustment. */[m
[31m-    uint32_t k = emit_isk12(ARMI_ADD, spadj);[m
[31m-    lua_assert(k);[m
[31m-    p[-2] = (ARMI_ADD^k) | ARMF_D(RID_SP) | ARMF_N(RID_SP);[m
[31m-  }[m
[31m-  /* Patch exit branch. */[m
[31m-  target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;[m
[31m-  p[-1] = ARMI_B|(((target-p)-1)&0x00ffffffu);[m
[31m-}[m
[31m-[m
[31m-/* Prepare tail of code. */[m
[31m-static void asm_tail_prep(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop - 1;  /* Leave room for exit branch. */[m
[31m-  if (as->loopref) {[m
[31m-    as->invmcp = as->mcp = p;[m
[31m-  } else {[m
[31m-    as->mcp = p-1;  /* Leave room for stack pointer adjustment. */[m
[31m-    as->invmcp = NULL;[m
[31m-  }[m
[31m-  *p = 0;  /* Prevent load/store merging. */[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Ensure there are enough stack slots for call arguments. */[m
[31m-static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  uint32_t i, nargs = CCI_XNARGS(ci);[m
[31m-  int nslots = 0, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR, fprodd = 0;[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  for (i = 0; i < nargs; i++) {[m
[31m-    if (!LJ_SOFTFP && args[i] && irt_isfp(IR(args[i])->t)) {[m
[31m-      if (!LJ_ABI_SOFTFP && !(ci->flags & CCI_VARARG)) {[m
[31m-	if (irt_isnum(IR(args[i])->t)) {[m
[31m-	  if (nfpr > 0) nfpr--;[m
[31m-	  else fprodd = 0, nslots = (nslots + 3) & ~1;[m
[31m-	} else {[m
[31m-	  if (fprodd) fprodd--;[m
[31m-	  else if (nfpr > 0) fprodd = 1, nfpr--;[m
[31m-	  else nslots++;[m
[31m-	}[m
[31m-      } else if (irt_isnum(IR(args[i])->t)) {[m
[31m-	ngpr &= ~1;[m
[31m-	if (ngpr > 0) ngpr -= 2; else nslots += 2;[m
[31m-      } else {[m
[31m-	if (ngpr > 0) ngpr--; else nslots++;[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (ngpr > 0) ngpr--; else nslots++;[m
[31m-    }[m
[31m-  }[m
[31m-  if (nslots > as->evenspill)  /* Leave room for args in stack slots. */[m
[31m-    as->evenspill = nslots;[m
[31m-  return REGSP_HINT(RID_RET);[m
[31m-}[m
[31m-[m
[31m-static void asm_setup_target(ASMState *as)[m
[31m-{[m
[31m-  /* May need extra exit for asm_stack_check on side traces. */[m
[31m-  asm_exitstub_setup(as, as->T->nsnap + (as->parent ? 1 : 0));[m
[31m-}[m
[31m-[m
[31m-/* -- Trace patching ------------------------------------------------------ */[m
[31m-[m
[31m-/* Patch exit jumps of existing machine code to a new target. */[m
[31m-void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)[m
[31m-{[m
[31m-  MCode *p = T->mcode;[m
[31m-  MCode *pe = (MCode *)((char *)p + T->szmcode);[m
[31m-  MCode *cstart = NULL, *cend = p;[m
[31m-  MCode *mcarea = lj_mcode_patch(J, p, 0);[m
[31m-  MCode *px = exitstub_addr(J, exitno) - 2;[m
[31m-  for (; p < pe; p++) {[m
[31m-    /* Look for bl_cc exitstub, replace with b_cc target. */[m
[31m-    uint32_t ins = *p;[m
[31m-    if ((ins & 0x0f000000u) == 0x0b000000u && ins < 0xf0000000u &&[m
[31m-	((ins ^ (px-p)) & 0x00ffffffu) == 0) {[m
[31m-      *p = (ins & 0xfe000000u) | (((target-p)-2) & 0x00ffffffu);[m
[31m-      cend = p+1;[m
[31m-      if (!cstart) cstart = p;[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(cstart != NULL);[m
[31m-  lj_mcode_sync(cstart, cend);[m
[31m-  lj_mcode_patch(J, mcarea, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_mips.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_mips.h[m
[1mdeleted file mode 100644[m
[1mindex 7bd72fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_mips.h[m
[1m+++ /dev/null[m
[36m@@ -1,2098 +0,0 @@[m
[31m-/*[m
[31m-** MIPS IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Register allocator extensions --------------------------------------- */[m
[31m-[m
[31m-/* Allocate a register with a hint. */[m
[31m-static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  if (ra_noreg(r)) {[m
[31m-    if (!ra_hashint(r) && !iscrossref(as, ref))[m
[31m-      ra_sethint(IR(ref)->r, hint);  /* Propagate register hint. */[m
[31m-    r = ra_allocref(as, ref, allow);[m
[31m-  }[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate a register or RID_ZERO. */[m
[31m-static Reg ra_alloc1z(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  if (ra_noreg(r)) {[m
[31m-    if (!(allow & RSET_FPR) && irref_isk(ref) && IR(ref)->i == 0)[m
[31m-      return RID_ZERO;[m
[31m-    r = ra_allocref(as, ref, allow);[m
[31m-  } else {[m
[31m-    ra_noweak(as, r);[m
[31m-  }[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate two source registers for three-operand instructions. */[m
[31m-static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-  Reg left = irl->r, right = irr->r;[m
[31m-  if (ra_hasreg(left)) {[m
[31m-    ra_noweak(as, left);[m
[31m-    if (ra_noreg(right))[m
[31m-      right = ra_alloc1z(as, ir->op2, rset_exclude(allow, left));[m
[31m-    else[m
[31m-      ra_noweak(as, right);[m
[31m-  } else if (ra_hasreg(right)) {[m
[31m-    ra_noweak(as, right);[m
[31m-    left = ra_alloc1z(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else if (ra_hashint(right)) {[m
[31m-    right = ra_alloc1z(as, ir->op2, allow);[m
[31m-    left = ra_alloc1z(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else {[m
[31m-    left = ra_alloc1z(as, ir->op1, allow);[m
[31m-    right = ra_alloc1z(as, ir->op2, rset_exclude(allow, left));[m
[31m-  }[m
[31m-  return left | (right << 8);[m
[31m-}[m
[31m-[m
[31m-/* -- Guard handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Need some spare long-range jump slots, for out-of-range branches. */[m
[31m-#define MIPS_SPAREJUMP		4[m
[31m-[m
[31m-/* Setup spare long-range jump slots per mcarea. */[m
[31m-static void asm_sparejump_setup(ASMState *as)[m
[31m-{[m
[31m-  MCode *mxp = as->mcbot;[m
[31m-  /* Assumes sizeof(MCLink) == 8. */[m
[31m-  if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == 8) {[m
[31m-    lua_assert(MIPSI_NOP == 0);[m
[31m-    memset(mxp+2, 0, MIPS_SPAREJUMP*8);[m
[31m-    mxp += MIPS_SPAREJUMP*2;[m
[31m-    lua_assert(mxp < as->mctop);[m
[31m-    lj_mcode_sync(as->mcbot, mxp);[m
[31m-    lj_mcode_commitbot(as->J, mxp);[m
[31m-    as->mcbot = mxp;[m
[31m-    as->mclim = as->mcbot + MCLIM_REDZONE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup exit stub after the end of each trace. */[m
[31m-static void asm_exitstub_setup(ASMState *as)[m
[31m-{[m
[31m-  MCode *mxp = as->mctop;[m
[31m-  /* sw TMP, 0(sp); j ->vm_exit_handler; li TMP, traceno */[m
[31m-  *--mxp = MIPSI_LI|MIPSF_T(RID_TMP)|as->T->traceno;[m
[31m-  *--mxp = MIPSI_J|((((uintptr_t)(void *)lj_vm_exit_handler)>>2)&0x03ffffffu);[m
[31m-  lua_assert(((uintptr_t)mxp ^ (uintptr_t)(void *)lj_vm_exit_handler)>>28 == 0);[m
[31m-  *--mxp = MIPSI_SW|MIPSF_T(RID_TMP)|MIPSF_S(RID_SP)|0;[m
[31m-  as->mctop = mxp;[m
[31m-}[m
[31m-[m
[31m-/* Keep this in-sync with exitstub_trace_addr(). */[m
[31m-#define asm_exitstub_addr(as)	((as)->mctop)[m
[31m-[m
[31m-/* Emit conditional branch to exit for guard. */[m
[31m-static void asm_guard(ASMState *as, MIPSIns mi, Reg rs, Reg rt)[m
[31m-{[m
[31m-  MCode *target = asm_exitstub_addr(as);[m
[31m-  MCode *p = as->mcp;[m
[31m-  if (LJ_UNLIKELY(p == as->invmcp)) {[m
[31m-    as->invmcp = NULL;[m
[31m-    as->loopinv = 1;[m
[31m-    as->mcp = p+1;[m
[31m-    mi = mi ^ ((mi>>28) == 1 ? 0x04000000u : 0x00010000u);  /* Invert cond. */[m
[31m-    target = p;  /* Patch target later in asm_loop_fixup. */[m
[31m-  }[m
[31m-  emit_ti(as, MIPSI_LI, RID_TMP, as->snapno);[m
[31m-  emit_branch(as, mi, rs, rt, target);[m
[31m-}[m
[31m-[m
[31m-/* -- Operand fusion ------------------------------------------------------ */[m
[31m-[m
[31m-/* Limit linear search to this distance. Avoids O(n^2) behavior. */[m
[31m-#define CONFLICT_SEARCH_LIM	31[m
[31m-[m
[31m-/* Check if there's no conflicting instruction between curins and ref. */[m
[31m-static int noconflict(ASMState *as, IRRef ref, IROp conflict)[m
[31m-{[m
[31m-  IRIns *ir = as->ir;[m
[31m-  IRRef i = as->curins;[m
[31m-  if (i > ref + CONFLICT_SEARCH_LIM)[m
[31m-    return 0;  /* Give up, ref is too far away. */[m
[31m-  while (--i > ref)[m
[31m-    if (ir[i].o == conflict)[m
[31m-      return 0;  /* Conflict found. */[m
[31m-  return 1;  /* Ok, no conflict. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse the array base of colocated arrays. */[m
[31m-static int32_t asm_fuseabase(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE &&[m
[31m-      !neverfuse(as) && noconflict(as, ref, IR_NEWREF))[m
[31m-    return (int32_t)sizeof(GCtab);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Fuse array/hash/upvalue reference into register+offset operand. */[m
[31m-static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r)) {[m
[31m-    if (ir->o == IR_AREF) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	if (irref_isk(ir->op2)) {[m
[31m-	  IRRef tab = IR(ir->op1)->op1;[m
[31m-	  int32_t ofs = asm_fuseabase(as, tab);[m
[31m-	  IRRef refa = ofs ? tab : ir->op1;[m
[31m-	  ofs += 8*IR(ir->op2)->i;[m
[31m-	  if (checki16(ofs)) {[m
[31m-	    *ofsp = ofs;[m
[31m-	    return ra_alloc1(as, refa, allow);[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_HREFK) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node));[m
[31m-	if (checki16(ofs)) {[m
[31m-	  *ofsp = ofs;[m
[31m-	  return ra_alloc1(as, ir->op1, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_UREFC) {[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-	int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv);[m
[31m-	int32_t jgl = (intptr_t)J2G(as->J);[m
[31m-	if ((uint32_t)(ofs-jgl) < 65536) {[m
[31m-	  *ofsp = ofs-jgl-32768;[m
[31m-	  return RID_JGL;[m
[31m-	} else {[m
[31m-	  *ofsp = (int16_t)ofs;[m
[31m-	  return ra_allock(as, ofs-(int16_t)ofs, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  *ofsp = 0;[m
[31m-  return ra_alloc1(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-/* Fuse XLOAD/XSTORE reference into load/store operand. */[m
[31m-static void asm_fusexref(ASMState *as, MIPSIns mi, Reg rt, IRRef ref,[m
[31m-			 RegSet allow, int32_t ofs)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  Reg base;[m
[31m-  if (ra_noreg(ir->r) && canfuse(as, ir)) {[m
[31m-    if (ir->o == IR_ADD) {[m
[31m-      int32_t ofs2;[m
[31m-      if (irref_isk(ir->op2) && (ofs2 = ofs + IR(ir->op2)->i, checki16(ofs2))) {[m
[31m-	ref = ir->op1;[m
[31m-	ofs = ofs2;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_STRREF) {[m
[31m-      int32_t ofs2 = 65536;[m
[31m-      lua_assert(ofs == 0);[m
[31m-      ofs = (int32_t)sizeof(GCstr);[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	ofs2 = ofs + IR(ir->op2)->i;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (irref_isk(ir->op1)) {[m
[31m-	ofs2 = ofs + IR(ir->op1)->i;[m
[31m-	ref = ir->op2;[m
[31m-      }[m
[31m-      if (!checki16(ofs2)) {[m
[31m-	/* NYI: Fuse ADD with constant. */[m
[31m-	Reg right, left = ra_alloc2(as, ir, allow);[m
[31m-	right = (left >> 8); left &= 255;[m
[31m-	emit_hsi(as, mi, rt, RID_TMP, ofs);[m
[31m-	emit_dst(as, MIPSI_ADDU, RID_TMP, left, right);[m
[31m-	return;[m
[31m-      }[m
[31m-      ofs = ofs2;[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ref, allow);[m
[31m-  emit_hsi(as, mi, rt, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Generate a call to a C function. */[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n, nargs = CCI_XNARGS(ci);[m
[31m-  int32_t ofs = 16;[m
[31m-#if LJ_SOFTFP[m
[31m-  Reg gpr = REGARG_FIRSTGPR;[m
[31m-#else[m
[31m-  Reg gpr, fpr = REGARG_FIRSTFPR;[m
[31m-#endif[m
[31m-  if ((void *)ci->func)[m
[31m-    emit_call(as, (void *)ci->func, 1);[m
[31m-#if !LJ_SOFTFP[m
[31m-  for (gpr = REGARG_FIRSTGPR; gpr <= REGARG_LASTGPR; gpr++)[m
[31m-    as->cost[gpr] = REGCOST(~0u, ASMREF_L);[m
[31m-  gpr = REGARG_FIRSTGPR;[m
[31m-#endif[m
[31m-  for (n = 0; n < nargs; n++) {  /* Setup args. */[m
[31m-    IRRef ref = args[n];[m
[31m-    if (ref) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-#if !LJ_SOFTFP[m
[31m-      if (irt_isfp(ir->t) && fpr <= REGARG_LASTFPR &&[m
[31m-	  !(ci->flags & CCI_VARARG)) {[m
[31m-	lua_assert(rset_test(as->freeset, fpr));  /* Already evicted. */[m
[31m-	ra_leftov(as, fpr, ref);[m
[31m-	fpr += 2;[m
[31m-	gpr += irt_isnum(ir->t) ? 2 : 1;[m
[31m-      } else[m
[31m-#endif[m
[31m-      {[m
[31m-#if !LJ_SOFTFP[m
[31m-	fpr = REGARG_LASTFPR+1;[m
[31m-#endif[m
[31m-	if (irt_isnum(ir->t)) gpr = (gpr+1) & ~1;[m
[31m-	if (gpr <= REGARG_LASTGPR) {[m
[31m-	  lua_assert(rset_test(as->freeset, gpr));  /* Already evicted. */[m
[31m-#if !LJ_SOFTFP[m
[31m-	  if (irt_isfp(ir->t)) {[m
[31m-	    RegSet of = as->freeset;[m
[31m-	    Reg r;[m
[31m-	    /* Workaround to protect argument GPRs from being used for remat. */[m
[31m-	    as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1);[m
[31m-	    r = ra_alloc1(as, ref, RSET_FPR);[m
[31m-	    as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1));[m
[31m-	    if (irt_isnum(ir->t)) {[m
[31m-	      emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?0:1), r+1);[m
[31m-	      emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?1:0), r);[m
[31m-	      lua_assert(rset_test(as->freeset, gpr+1));  /* Already evicted. */[m
[31m-	      gpr += 2;[m
[31m-	    } else if (irt_isfloat(ir->t)) {[m
[31m-	      emit_tg(as, MIPSI_MFC1, gpr, r);[m
[31m-	      gpr++;[m
[31m-	    }[m
[31m-	  } else[m
[31m-#endif[m
[31m-	  {[m
[31m-	    ra_leftov(as, gpr, ref);[m
[31m-	    gpr++;[m
[31m-	  }[m
[31m-	} else {[m
[31m-	  Reg r = ra_alloc1z(as, ref, !LJ_SOFTFP && irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);[m
[31m-	  if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4;[m
[31m-	  emit_spstore(as, ir, r, ofs);[m
[31m-	  ofs += irt_isnum(ir->t) ? 8 : 4;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-#if !LJ_SOFTFP[m
[31m-      fpr = REGARG_LASTFPR+1;[m
[31m-#endif[m
[31m-      if (gpr <= REGARG_LASTGPR)[m
[31m-	gpr++;[m
[31m-      else[m
[31m-	ofs += 4;[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup result reg/sp for call. Evict scratch regs. */[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  int hiop = ((ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));[m
[31m-#if !LJ_SOFTFP[m
[31m-  if ((ci->flags & CCI_NOFPRCLOBBER))[m
[31m-    drop &= ~RSET_FPR;[m
[31m-#endif[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  if (hiop && ra_hasreg((ir+1)->r))[m
[31m-    rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);  /* Evictions must be performed first. */[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert(!irt_ispri(ir->t));[m
[31m-    if (!LJ_SOFTFP && irt_isfp(ir->t)) {[m
[31m-      if ((ci->flags & CCI_CASTU64)) {[m
[31m-	int32_t ofs = sps_scale(ir->s);[m
[31m-	Reg dest = ir->r;[m
[31m-	if (ra_hasreg(dest)) {[m
[31m-	  ra_free(as, dest);[m
[31m-	  ra_modified(as, dest);[m
[31m-	  emit_tg(as, MIPSI_MTC1, RID_RETHI, dest+1);[m
[31m-	  emit_tg(as, MIPSI_MTC1, RID_RETLO, dest);[m
[31m-	}[m
[31m-	if (ofs) {[m
[31m-	  emit_tsi(as, MIPSI_SW, RID_RETLO, RID_SP, ofs+(LJ_BE?4:0));[m
[31m-	  emit_tsi(as, MIPSI_SW, RID_RETHI, RID_SP, ofs+(LJ_BE?0:4));[m
[31m-	}[m
[31m-      } else {[m
[31m-	ra_destreg(as, ir, RID_FPRET);[m
[31m-      }[m
[31m-    } else if (hiop) {[m
[31m-      ra_destpair(as, ir);[m
[31m-    } else {[m
[31m-      ra_destreg(as, ir, RID_RET);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_callx(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  CCallInfo ci;[m
[31m-  IRRef func;[m
[31m-  IRIns *irf;[m
[31m-  ci.flags = asm_callx_flags(as, ir);[m
[31m-  asm_collectargs(as, ir, &ci, args);[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-  func = ir->op2; irf = IR(func);[m
[31m-  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }[m
[31m-  if (irref_isk(func)) {  /* Call to constant address. */[m
[31m-    ci.func = (ASMFunction)(void *)(irf->i);[m
[31m-  } else {  /* Need specific register for indirect calls. */[m
[31m-    Reg r = ra_alloc1(as, func, RID2RSET(RID_CFUNCADDR));[m
[31m-    MCode *p = as->mcp;[m
[31m-    if (r == RID_CFUNCADDR)[m
[31m-      *--p = MIPSI_NOP;[m
[31m-    else[m
[31m-      *--p = MIPSI_MOVE | MIPSF_D(RID_CFUNCADDR) | MIPSF_S(r);[m
[31m-    *--p = MIPSI_JALR | MIPSF_S(r);[m
[31m-    as->mcp = p;[m
[31m-    ci.func = (ASMFunction)(void *)0;[m
[31m-  }[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_callround(ASMState *as, IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  /* The modified regs must match with the *.dasc implementation. */[m
[31m-  RegSet drop = RID2RSET(RID_R1)|RID2RSET(RID_R12)|RID2RSET(RID_FPRET)|[m
[31m-		RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(REGARG_FIRSTFPR);[m
[31m-  if (ra_hasreg(ir->r)) rset_clear(drop, ir->r);[m
[31m-  ra_evictset(as, drop);[m
[31m-  ra_destreg(as, ir, RID_FPRET);[m
[31m-  emit_call(as, (void *)lj_ir_callinfo[id].func, 0);[m
[31m-  ra_leftov(as, REGARG_FIRSTFPR, ir->op1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Returns ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Return to lower frame. Guard that it goes to the right spot. */[m
[31m-static void asm_retf(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  void *pc = ir_kptr(IR(ir->op2));[m
[31m-  int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));[m
[31m-  as->topslot -= (BCReg)delta;[m
[31m-  if ((int32_t)as->topslot < 0) as->topslot = 0;[m
[31m-  irt_setmark(IR(REF_BASE)->t);  /* Children must not coalesce with BASE reg. */[m
[31m-  emit_setgl(as, base, jit_base);[m
[31m-  emit_addptr(as, base, -8*delta);[m
[31m-  asm_guard(as, MIPSI_BNE, RID_TMP,[m
[31m-	    ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base)));[m
[31m-  emit_tsi(as, MIPSI_LW, RID_TMP, base, -8);[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_tointg(ASMState *as, IRIns *ir, Reg left)[m
[31m-{[m
[31m-  Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_guard(as, MIPSI_BC1F, 0, 0);[m
[31m-  emit_fgh(as, MIPSI_C_EQ_D, 0, tmp, left);[m
[31m-  emit_fg(as, MIPSI_CVT_D_W, tmp, tmp);[m
[31m-  emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-  emit_fg(as, MIPSI_CVT_W_D, tmp, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_tobit(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, allow);[m
[31m-  Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left));[m
[31m-  Reg tmp = ra_scratch(as, rset_clear(allow, right));[m
[31m-  emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-  emit_fgh(as, MIPSI_ADD_D, tmp, left, right);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_conv(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-#if !LJ_SOFTFP[m
[31m-  int stfp = (st == IRT_NUM || st == IRT_FLOAT);[m
[31m-#endif[m
[31m-  IRRef lref = ir->op1;[m
[31m-  lua_assert(!(irt_isint64(ir->t) ||[m
[31m-	       (st == IRT_I64 || st == IRT_U64))); /* Handled by SPLIT. */[m
[31m-#if LJ_SOFTFP[m
[31m-  /* FP conversions are handled by SPLIT. */[m
[31m-  lua_assert(!irt_isfp(ir->t) && !(st == IRT_NUM || st == IRT_FLOAT));[m
[31m-  /* Can't check for same types: SPLIT uses CONV int.int + BXOR for sfp NEG. */[m
[31m-#else[m
[31m-  lua_assert(irt_type(ir->t) != st);[m
[31m-  if (irt_isfp(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    if (stfp) {  /* FP to FP conversion. */[m
[31m-      emit_fg(as, st == IRT_NUM ? MIPSI_CVT_S_D : MIPSI_CVT_D_S,[m
[31m-	      dest, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else if (st == IRT_U32) {  /* U32 to FP conversion. */[m
[31m-      /* y = (x ^ 0x8000000) + 2147483648.0 */[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, dest));[m
[31m-      emit_fgh(as, irt_isfloat(ir->t) ? MIPSI_ADD_S : MIPSI_ADD_D,[m
[31m-	       dest, dest, tmp);[m
[31m-      emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W,[m
[31m-	      dest, dest);[m
[31m-      if (irt_isfloat(ir->t))[m
[31m-	emit_lsptr(as, MIPSI_LWC1, (tmp & 31),[m
[31m-		   (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)),[m
[31m-		   RSET_GPR);[m
[31m-      else[m
[31m-	emit_lsptr(as, MIPSI_LDC1, (tmp & 31),[m
[31m-		   (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)),[m
[31m-		   RSET_GPR);[m
[31m-      emit_tg(as, MIPSI_MTC1, RID_TMP, dest);[m
[31m-      emit_dst(as, MIPSI_XOR, RID_TMP, RID_TMP, left);[m
[31m-      emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000);[m
[31m-    } else {  /* Integer to FP conversion. */[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W,[m
[31m-	      dest, dest);[m
[31m-      emit_tg(as, MIPSI_MTC1, left, dest);[m
[31m-    }[m
[31m-  } else if (stfp) {  /* FP to integer conversion. */[m
[31m-    if (irt_isguard(ir->t)) {[m
[31m-      /* Checked conversions are only supported from number to int. */[m
[31m-      lua_assert(irt_isint(ir->t) && st == IRT_NUM);[m
[31m-      asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_FPR);[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-      if (irt_isu32(ir->t)) {[m
[31m-	/* y = (int)floor(x - 2147483648.0) ^ 0x80000000 */[m
[31m-	emit_dst(as, MIPSI_XOR, dest, dest, RID_TMP);[m
[31m-	emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000);[m
[31m-	emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-	emit_fg(as, st == IRT_FLOAT ? MIPSI_FLOOR_W_S : MIPSI_FLOOR_W_D,[m
[31m-		tmp, tmp);[m
[31m-	emit_fgh(as, st == IRT_FLOAT ? MIPSI_SUB_S : MIPSI_SUB_D,[m
[31m-		 tmp, left, tmp);[m
[31m-	if (st == IRT_FLOAT)[m
[31m-	  emit_lsptr(as, MIPSI_LWC1, (tmp & 31),[m
[31m-		     (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)),[m
[31m-		     RSET_GPR);[m
[31m-	else[m
[31m-	  emit_lsptr(as, MIPSI_LDC1, (tmp & 31),[m
[31m-		     (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)),[m
[31m-		     RSET_GPR);[m
[31m-      } else {[m
[31m-	emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-	emit_fg(as, st == IRT_FLOAT ? MIPSI_TRUNC_W_S : MIPSI_TRUNC_W_D,[m
[31m-		tmp, left);[m
[31m-      }[m
[31m-    }[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */[m
[31m-      Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-      lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));[m
[31m-      if ((ir->op2 & IRCONV_SEXT)) {[m
[31m-	if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-	  emit_dst(as, st == IRT_I8 ? MIPSI_SEB : MIPSI_SEH, dest, 0, left);[m
[31m-	} else {[m
[31m-	  uint32_t shift = st == IRT_I8 ? 24 : 16;[m
[31m-	  emit_dta(as, MIPSI_SRA, dest, dest, shift);[m
[31m-	  emit_dta(as, MIPSI_SLL, dest, left, shift);[m
[31m-	}[m
[31m-      } else {[m
[31m-	emit_tsi(as, MIPSI_ANDI, dest, left,[m
[31m-		 (int32_t)(st == IRT_U8 ? 0xff : 0xffff));[m
[31m-      }[m
[31m-    } else {  /* 32/64 bit integer conversions. */[m
[31m-      /* Only need to handle 32/32 bit no-op (cast) on 32 bit archs. */[m
[31m-      ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_strto(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];[m
[31m-  IRRef args[2];[m
[31m-  int32_t ofs = 0;[m
[31m-#if LJ_SOFTFP[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  if (ra_used(ir)) {[m
[31m-    if (ra_hasspill(ir->s) && ra_hasspill((ir+1)->s) &&[m
[31m-	(ir->s & 1) == LJ_BE && (ir->s ^ 1) == (ir+1)->s) {[m
[31m-      int i;[m
[31m-      for (i = 0; i < 2; i++) {[m
[31m-	Reg r = (ir+i)->r;[m
[31m-	if (ra_hasreg(r)) {[m
[31m-	  ra_free(as, r);[m
[31m-	  ra_modified(as, r);[m
[31m-	  emit_spload(as, ir+i, r, sps_scale((ir+i)->s));[m
[31m-	}[m
[31m-      }[m
[31m-      ofs = sps_scale(ir->s & ~1);[m
[31m-    } else {[m
[31m-      Reg rhi = ra_dest(as, ir+1, RSET_GPR);[m
[31m-      Reg rlo = ra_dest(as, ir, rset_exclude(RSET_GPR, rhi));[m
[31m-      emit_tsi(as, MIPSI_LW, rhi, RID_SP, ofs+(LJ_BE?0:4));[m
[31m-      emit_tsi(as, MIPSI_LW, rlo, RID_SP, ofs+(LJ_BE?4:0));[m
[31m-    }[m
[31m-  }[m
[31m-#else[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  if (ra_hasreg(ir->r)) rset_set(drop, ir->r);  /* Spill dest reg (if any). */[m
[31m-  ra_evictset(as, drop);[m
[31m-  ofs = sps_scale(ir->s);[m
[31m-#endif[m
[31m-  asm_guard(as, MIPSI_BEQ, RID_RET, RID_ZERO);  /* Test return status. */[m
[31m-  args[0] = ir->op1;      /* GCstr *str */[m
[31m-  args[1] = ASMREF_TMP1;  /* TValue *n  */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  /* Store the result to the spill slot or temp slots. */[m
[31m-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1),[m
[31m-	   RID_SP, ofs);[m
[31m-}[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-/* Get pointer to TValue. */[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (irref_isk(ref))  /* Use the number constant itself as a TValue. */[m
[31m-      ra_allockreg(as, i32ptr(ir_knum(ir)), dest);[m
[31m-    else  /* Otherwise force a spill and use the spill slot. */[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, RID_SP, ra_spill(as, ir));[m
[31m-  } else {[m
[31m-    /* Otherwise use g->tmptv to hold the TValue. */[m
[31m-    RegSet allow = rset_exclude(RSET_GPR, dest);[m
[31m-    Reg type;[m
[31m-    emit_tsi(as, MIPSI_ADDIU, dest, RID_JGL, (int32_t)(offsetof(global_State, tmptv)-32768));[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, allow);[m
[31m-      emit_setgl(as, src, tmptv.gcr);[m
[31m-    }[m
[31m-    if (LJ_SOFTFP && (ir+1)->o == IR_HIOP)[m
[31m-      type = ra_alloc1(as, ref+1, allow);[m
[31m-    else[m
[31m-      type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-    emit_setgl(as, type, tmptv.it);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_aref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx, base;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    IRRef tab = IR(ir->op1)->op1;[m
[31m-    int32_t ofs = asm_fuseabase(as, tab);[m
[31m-    IRRef refa = ofs ? tab : ir->op1;[m
[31m-    ofs += 8*IR(ir->op2)->i;[m
[31m-    if (checki16(ofs)) {[m
[31m-      base = ra_alloc1(as, refa, RSET_GPR);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, base, ofs);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));[m
[31m-  emit_dst(as, MIPSI_ADDU, dest, RID_TMP, base);[m
[31m-  emit_dta(as, MIPSI_SLL, RID_TMP, idx, 3);[m
[31m-}[m
[31m-[m
[31m-/* Inlined hash lookup. Specialized for key type and for const keys.[m
[31m-** The equivalent C code is:[m
[31m-**   Node *n = hashkey(t, key);[m
[31m-**   do {[m
[31m-**     if (lj_obj_equal(&n->key, key)) return &n->val;[m
[31m-**   } while ((n = nextnode(n)));[m
[31m-**   return niltv(L);[m
[31m-*/[m
[31m-static void asm_href(ASMState *as, IRIns *ir, IROp merge)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int destused = ra_used(ir);[m
[31m-  Reg dest = ra_dest(as, ir, allow);[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));[m
[31m-  Reg key = RID_NONE, type = RID_NONE, tmpnum = RID_NONE, tmp1 = RID_TMP, tmp2;[m
[31m-  IRRef refkey = ir->op2;[m
[31m-  IRIns *irkey = IR(refkey);[m
[31m-  IRType1 kt = irkey->t;[m
[31m-  uint32_t khash;[m
[31m-  MCLabel l_end, l_loop, l_next;[m
[31m-[m
[31m-  rset_clear(allow, tab);[m
[31m-#if LJ_SOFTFP[m
[31m-  if (!irref_isk(refkey)) {[m
[31m-    key = ra_alloc1(as, refkey, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-    if (irkey[1].o == IR_HIOP) {[m
[31m-      if (ra_hasreg((irkey+1)->r)) {[m
[31m-	type = tmpnum = (irkey+1)->r;[m
[31m-	tmp1 = ra_scratch(as, allow);[m
[31m-	rset_clear(allow, tmp1);[m
[31m-	ra_noweak(as, tmpnum);[m
[31m-      } else {[m
[31m-	type = tmpnum = ra_allocref(as, refkey+1, allow);[m
[31m-      }[m
[31m-      rset_clear(allow, tmpnum);[m
[31m-    } else {[m
[31m-      type = ra_allock(as, (int32_t)irt_toitype(irkey->t), allow);[m
[31m-      rset_clear(allow, type);[m
[31m-    }[m
[31m-  }[m
[31m-#else[m
[31m-  if (irt_isnum(kt)) {[m
[31m-    key = ra_alloc1(as, refkey, RSET_FPR);[m
[31m-    tmpnum = ra_scratch(as, rset_exclude(RSET_FPR, key));[m
[31m-  } else if (!irt_ispri(kt)) {[m
[31m-    key = ra_alloc1(as, refkey, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-    type = ra_allock(as, (int32_t)irt_toitype(irkey->t), allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-#endif[m
[31m-  tmp2 = ra_scratch(as, allow);[m
[31m-  rset_clear(allow, tmp2);[m
[31m-[m
[31m-  /* Key not found in chain: jump to exit (if merged) or load niltv. */[m
[31m-  l_end = emit_label(as);[m
[31m-  as->invmcp = NULL;[m
[31m-  if (merge == IR_NE)[m
[31m-    asm_guard(as, MIPSI_B, RID_ZERO, RID_ZERO);[m
[31m-  else if (destused)[m
[31m-    emit_loada(as, dest, niltvg(J2G(as->J)));[m
[31m-  /* Follow hash chain until the end. */[m
[31m-  emit_move(as, dest, tmp2);[m
[31m-  l_loop = --as->mcp;[m
[31m-  emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, next));[m
[31m-  l_next = emit_label(as);[m
[31m-[m
[31m-  /* Type and value comparison. */[m
[31m-  if (merge == IR_EQ) {  /* Must match asm_guard(). */[m
[31m-    emit_ti(as, MIPSI_LI, RID_TMP, as->snapno);[m
[31m-    l_end = asm_exitstub_addr(as);[m
[31m-  }[m
[31m-  if (!LJ_SOFTFP && irt_isnum(kt)) {[m
[31m-    emit_branch(as, MIPSI_BC1T, 0, 0, l_end);[m
[31m-    emit_fgh(as, MIPSI_C_EQ_D, 0, tmpnum, key);[m
[31m-    *--as->mcp = MIPSI_NOP;  /* Avoid NaN comparison overhead. */[m
[31m-    emit_branch(as, MIPSI_BEQ, tmp2, RID_ZERO, l_next);[m
[31m-    emit_tsi(as, MIPSI_SLTIU, tmp2, tmp2, (int32_t)LJ_TISNUM);[m
[31m-    emit_hsi(as, MIPSI_LDC1, tmpnum, dest, (int32_t)offsetof(Node, key.n));[m
[31m-  } else {[m
[31m-    if (irt_ispri(kt)) {[m
[31m-      emit_branch(as, MIPSI_BEQ, tmp2, type, l_end);[m
[31m-    } else {[m
[31m-      emit_branch(as, MIPSI_BEQ, tmp1, key, l_end);[m
[31m-      emit_tsi(as, MIPSI_LW, tmp1, dest, (int32_t)offsetof(Node, key.gcr));[m
[31m-      emit_branch(as, MIPSI_BNE, tmp2, type, l_next);[m
[31m-    }[m
[31m-  }[m
[31m-  emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, key.it));[m
[31m-  *l_loop = MIPSI_BNE | MIPSF_S(tmp2) | ((as->mcp-l_loop-1) & 0xffffu);[m
[31m-[m
[31m-  /* Load main position relative to tab->node into dest. */[m
[31m-  khash = irref_isk(refkey) ? ir_khash(irkey) : 1;[m
[31m-  if (khash == 0) {[m
[31m-    emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-  } else {[m
[31m-    Reg tmphash = tmp1;[m
[31m-    if (irref_isk(refkey))[m
[31m-      tmphash = ra_allock(as, khash, allow);[m
[31m-    emit_dst(as, MIPSI_ADDU, dest, dest, tmp1);[m
[31m-    lua_assert(sizeof(Node) == 24);[m
[31m-    emit_dst(as, MIPSI_SUBU, tmp1, tmp2, tmp1);[m
[31m-    emit_dta(as, MIPSI_SLL, tmp1, tmp1, 3);[m
[31m-    emit_dta(as, MIPSI_SLL, tmp2, tmp1, 5);[m
[31m-    emit_dst(as, MIPSI_AND, tmp1, tmp2, tmphash);[m
[31m-    emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-    emit_tsi(as, MIPSI_LW, tmp2, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-    if (irref_isk(refkey)) {[m
[31m-      /* Nothing to do. */[m
[31m-    } else if (irt_isstr(kt)) {[m
[31m-      emit_tsi(as, MIPSI_LW, tmp1, key, (int32_t)offsetof(GCstr, hash));[m
[31m-    } else {  /* Must match with hash*() in lj_tab.c. */[m
[31m-      emit_dst(as, MIPSI_SUBU, tmp1, tmp1, tmp2);[m
[31m-      emit_rotr(as, tmp2, tmp2, dest, (-HASH_ROT3)&31);[m
[31m-      emit_dst(as, MIPSI_XOR, tmp1, tmp1, tmp2);[m
[31m-      emit_rotr(as, tmp1, tmp1, dest, (-HASH_ROT2-HASH_ROT1)&31);[m
[31m-      emit_dst(as, MIPSI_SUBU, tmp2, tmp2, dest);[m
[31m-      if (LJ_SOFTFP ? (irkey[1].o == IR_HIOP) : irt_isnum(kt)) {[m
[31m-	emit_dst(as, MIPSI_XOR, tmp2, tmp2, tmp1);[m
[31m-	if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-	  emit_dta(as, MIPSI_ROTR, dest, tmp1, (-HASH_ROT1)&31);[m
[31m-	} else {[m
[31m-	  emit_dst(as, MIPSI_OR, dest, dest, tmp1);[m
[31m-	  emit_dta(as, MIPSI_SLL, tmp1, tmp1, HASH_ROT1);[m
[31m-	  emit_dta(as, MIPSI_SRL, dest, tmp1, (-HASH_ROT1)&31);[m
[31m-	}[m
[31m-	emit_dst(as, MIPSI_ADDU, tmp1, tmp1, tmp1);[m
[31m-#if LJ_SOFTFP[m
[31m-	emit_ds(as, MIPSI_MOVE, tmp1, type);[m
[31m-	emit_ds(as, MIPSI_MOVE, tmp2, key);[m
[31m-#else[m
[31m-	emit_tg(as, MIPSI_MFC1, tmp2, key);[m
[31m-	emit_tg(as, MIPSI_MFC1, tmp1, key+1);[m
[31m-#endif[m
[31m-      } else {[m
[31m-	emit_dst(as, MIPSI_XOR, tmp2, key, tmp1);[m
[31m-	emit_rotr(as, dest, tmp1, tmp2, (-HASH_ROT1)&31);[m
[31m-	emit_dst(as, MIPSI_ADDU, tmp1, key, ra_allock(as, HASH_BIAS, allow));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_hrefk(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *kslot = IR(ir->op2);[m
[31m-  IRIns *irkey = IR(kslot->op1);[m
[31m-  int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node));[m
[31m-  int32_t kofs = ofs + (int32_t)offsetof(Node, key);[m
[31m-  Reg dest = (ra_used(ir)||ofs > 32736) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;[m
[31m-  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg key = RID_NONE, type = RID_TMP, idx = node;[m
[31m-  RegSet allow = rset_exclude(RSET_GPR, node);[m
[31m-  int32_t lo, hi;[m
[31m-  lua_assert(ofs % sizeof(Node) == 0);[m
[31m-  if (ofs > 32736) {[m
[31m-    idx = dest;[m
[31m-    rset_clear(allow, dest);[m
[31m-    kofs = (int32_t)offsetof(Node, key);[m
[31m-  } else if (ra_hasreg(dest)) {[m
[31m-    emit_tsi(as, MIPSI_ADDIU, dest, node, ofs);[m
[31m-  }[m
[31m-  if (!irt_ispri(irkey->t)) {[m
[31m-    key = ra_scratch(as, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-  }[m
[31m-  if (irt_isnum(irkey->t)) {[m
[31m-    lo = (int32_t)ir_knum(irkey)->u32.lo;[m
[31m-    hi = (int32_t)ir_knum(irkey)->u32.hi;[m
[31m-  } else {[m
[31m-    lo = irkey->i;[m
[31m-    hi = irt_toitype(irkey->t);[m
[31m-    if (!ra_hasreg(key))[m
[31m-      goto nolo;[m
[31m-  }[m
[31m-  asm_guard(as, MIPSI_BNE, key, lo ? ra_allock(as, lo, allow) : RID_ZERO);[m
[31m-nolo:[m
[31m-  asm_guard(as, MIPSI_BNE, type, hi ? ra_allock(as, hi, allow) : RID_ZERO);[m
[31m-  if (ra_hasreg(key)) emit_tsi(as, MIPSI_LW, key, idx, kofs+(LJ_BE?4:0));[m
[31m-  emit_tsi(as, MIPSI_LW, type, idx, kofs+(LJ_BE?0:4));[m
[31m-  if (ofs > 32736)[m
[31m-    emit_tsi(as, MIPSI_ADDU, dest, node, ra_allock(as, ofs, allow));[m
[31m-}[m
[31m-[m
[31m-static void asm_uref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* NYI: Check that UREFO is still open and not aliasing a slot. */[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-    MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;[m
[31m-    emit_lsptr(as, MIPSI_LW, dest, v, RSET_GPR);[m
[31m-  } else {[m
[31m-    Reg uv = ra_scratch(as, RSET_GPR);[m
[31m-    Reg func = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (ir->o == IR_UREFC) {[m
[31m-      asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, uv, (int32_t)offsetof(GCupval, tv));[m
[31m-      emit_tsi(as, MIPSI_LBU, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));[m
[31m-    } else {[m
[31m-      emit_tsi(as, MIPSI_LW, dest, uv, (int32_t)offsetof(GCupval, v));[m
[31m-    }[m
[31m-    emit_tsi(as, MIPSI_LW, uv, func,[m
[31m-	     (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(as); UNUSED(ir);[m
[31m-  lua_assert(!ra_used(ir));[m
[31m-}[m
[31m-[m
[31m-static void asm_strref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRRef ref = ir->op2, refk = ir->op1;[m
[31m-  int32_t ofs = (int32_t)sizeof(GCstr);[m
[31m-  Reg r;[m
[31m-  if (irref_isk(ref)) {[m
[31m-    IRRef tmp = refk; refk = ref; ref = tmp;[m
[31m-  } else if (!irref_isk(refk)) {[m
[31m-    Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    IRIns *irr = IR(ir->op2);[m
[31m-    if (ra_hasreg(irr->r)) {[m
[31m-      ra_noweak(as, irr->r);[m
[31m-      right = irr->r;[m
[31m-    } else if (mayfuse(as, irr->op2) &&[m
[31m-	       irr->o == IR_ADD && irref_isk(irr->op2) &&[m
[31m-	       checki16(ofs + IR(irr->op2)->i)) {[m
[31m-      ofs += IR(irr->op2)->i;[m
[31m-      right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left));[m
[31m-    } else {[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    }[m
[31m-    emit_tsi(as, MIPSI_ADDIU, dest, dest, ofs);[m
[31m-    emit_dst(as, MIPSI_ADDU, dest, left, right);[m
[31m-    return;[m
[31m-  }[m
[31m-  r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-  ofs += IR(refk)->i;[m
[31m-  if (checki16(ofs))[m
[31m-    emit_tsi(as, MIPSI_ADDIU, dest, r, ofs);[m
[31m-  else[m
[31m-    emit_dst(as, MIPSI_ADDU, dest, r,[m
[31m-	     ra_allock(as, ofs, rset_exclude(RSET_GPR, r)));[m
[31m-}[m
[31m-[m
[31m-/* -- Loads and stores ---------------------------------------------------- */[m
[31m-[m
[31m-static MIPSIns asm_fxloadins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: return MIPSI_LB;[m
[31m-  case IRT_U8: return MIPSI_LBU;[m
[31m-  case IRT_I16: return MIPSI_LH;[m
[31m-  case IRT_U16: return MIPSI_LHU;[m
[31m-  case IRT_NUM: lua_assert(!LJ_SOFTFP); return MIPSI_LDC1;[m
[31m-  case IRT_FLOAT: if (!LJ_SOFTFP) return MIPSI_LWC1;[m
[31m-  default: return MIPSI_LW;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static MIPSIns asm_fxstoreins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: case IRT_U8: return MIPSI_SB;[m
[31m-  case IRT_I16: case IRT_U16: return MIPSI_SH;[m
[31m-  case IRT_NUM: lua_assert(!LJ_SOFTFP); return MIPSI_SDC1;[m
[31m-  case IRT_FLOAT: if (!LJ_SOFTFP) return MIPSI_SWC1;[m
[31m-  default: return MIPSI_SW;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  MIPSIns mi = asm_fxloadins(ir);[m
[31m-  int32_t ofs;[m
[31m-  if (ir->op2 == IRFL_TAB_ARRAY) {[m
[31m-    ofs = asm_fuseabase(as, ir->op1);[m
[31m-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, idx, ofs);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  ofs = field_ofs[ir->op2];[m
[31m-  lua_assert(!irt_isfp(ir->t));[m
[31m-  emit_tsi(as, mi, dest, idx, ofs);[m
[31m-}[m
[31m-[m
[31m-static void asm_fstore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1z(as, ir->op2, RSET_GPR);[m
[31m-    IRIns *irf = IR(ir->op1);[m
[31m-    Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src));[m
[31m-    int32_t ofs = field_ofs[irf->op2];[m
[31m-    MIPSIns mi = asm_fxstoreins(ir);[m
[31m-    lua_assert(!irt_isfp(ir->t));[m
[31m-    emit_tsi(as, mi, src, idx, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_xload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir,[m
[31m-    (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-  lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED));[m
[31m-  asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0);[m
[31m-}[m
[31m-[m
[31m-static void asm_xstore_(ASMState *as, IRIns *ir, int32_t ofs)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1z(as, ir->op2,[m
[31m-      (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-    asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1,[m
[31m-		 rset_exclude(RSET_GPR, src), ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_xstore(as, ir)	asm_xstore_(as, ir, 0)[m
[31m-[m
[31m-static void asm_ahuvload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);[m
[31m-  Reg dest = RID_NONE, type = RID_TMP, idx;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int32_t ofs = 0;[m
[31m-  if (hiop && ra_used(ir+1)) {[m
[31m-    type = ra_dest(as, ir+1, allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||[m
[31m-	       irt_isint(ir->t) || irt_isaddr(ir->t));[m
[31m-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);[m
[31m-    rset_clear(allow, dest);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);[m
[31m-  rset_clear(allow, idx);[m
[31m-  if (t == IRT_NUM) {[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-    emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);[m
[31m-  } else {[m
[31m-    asm_guard(as, MIPSI_BNE, type, ra_allock(as, irt_toitype_(t), allow));[m
[31m-  }[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    if (!LJ_SOFTFP && t == IRT_NUM)[m
[31m-      emit_hsi(as, MIPSI_LDC1, dest, idx, ofs);[m
[31m-    else[m
[31m-      emit_tsi(as, MIPSI_LW, dest, idx, ofs+(LJ_BE?4:0));[m
[31m-  }[m
[31m-  emit_tsi(as, MIPSI_LW, type, idx, ofs+(LJ_BE?0:4));[m
[31m-}[m
[31m-[m
[31m-static void asm_ahustore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg idx, src = RID_NONE, type = RID_NONE;[m
[31m-  int32_t ofs = 0;[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    src = ra_alloc1(as, ir->op2, RSET_FPR);[m
[31m-  } else {[m
[31m-    int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      src = ra_alloc1(as, ir->op2, allow);[m
[31m-      rset_clear(allow, src);[m
[31m-    }[m
[31m-    if (hiop)[m
[31m-      type = ra_alloc1(as, (ir+1)->op2, allow);[m
[31m-    else[m
[31m-      type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    emit_hsi(as, MIPSI_SDC1, src, idx, ofs);[m
[31m-  } else {[m
[31m-    if (ra_hasreg(src))[m
[31m-      emit_tsi(as, MIPSI_SW, src, idx, ofs+(LJ_BE?4:0));[m
[31m-    emit_tsi(as, MIPSI_SW, type, idx, ofs+(LJ_BE?0:4));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);[m
[31m-  int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);[m
[31m-  IRType t = hiop ? IRT_NUM : irt_type(ir->t);[m
[31m-  Reg dest = RID_NONE, type = RID_NONE, base;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */[m
[31m-  lua_assert(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_CONVERT));  /* Handled by LJ_SOFTFP SPLIT. */[m
[31m-  if (hiop && ra_used(ir+1)) {[m
[31m-    type = ra_dest(as, ir+1, allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-#else[m
[31m-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(ir->t) && t == IRT_INT) {[m
[31m-    dest = ra_scratch(as, RSET_FPR);[m
[31m-    asm_tointg(as, ir, dest);[m
[31m-    t = IRT_NUM;  /* Continue with a regular number type check. */[m
[31m-  } else[m
[31m-#endif[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||[m
[31m-	       irt_isint(ir->t) || irt_isaddr(ir->t));[m
[31m-    dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);[m
[31m-    rset_clear(allow, dest);[m
[31m-    base = ra_alloc1(as, REF_BASE, allow);[m
[31m-    rset_clear(allow, base);[m
[31m-    if (!LJ_SOFTFP && (ir->op2 & IRSLOAD_CONVERT)) {[m
[31m-      if (t == IRT_INT) {[m
[31m-	Reg tmp = ra_scratch(as, RSET_FPR);[m
[31m-	emit_tg(as, MIPSI_MFC1, dest, tmp);[m
[31m-	emit_fg(as, MIPSI_TRUNC_W_D, tmp, tmp);[m
[31m-	dest = tmp;[m
[31m-	t = IRT_NUM;  /* Check for original type. */[m
[31m-      } else {[m
[31m-	Reg tmp = ra_scratch(as, RSET_GPR);[m
[31m-	emit_fg(as, MIPSI_CVT_D_W, dest, dest);[m
[31m-	emit_tg(as, MIPSI_MTC1, tmp, dest);[m
[31m-	dest = tmp;[m
[31m-	t = IRT_INT;  /* Check for original type. */[m
[31m-      }[m
[31m-    }[m
[31m-    goto dotypecheck;[m
[31m-  }[m
[31m-  base = ra_alloc1(as, REF_BASE, allow);[m
[31m-  rset_clear(allow, base);[m
[31m-dotypecheck:[m
[31m-  if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-    if (ra_noreg(type)) {[m
[31m-      if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 &&[m
[31m-	  rset_test((as->freeset & allow), dest+1)) {[m
[31m-	type = dest+1;[m
[31m-	ra_modified(as, type);[m
[31m-      } else {[m
[31m-	type = RID_TMP;[m
[31m-      }[m
[31m-    }[m
[31m-    if (t == IRT_NUM) {[m
[31m-      asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-      emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);[m
[31m-    } else {[m
[31m-      Reg ktype = ra_allock(as, irt_toitype_(t), allow);[m
[31m-      asm_guard(as, MIPSI_BNE, type, ktype);[m
[31m-    }[m
[31m-  }[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    if (!LJ_SOFTFP && t == IRT_NUM)[m
[31m-      emit_hsi(as, MIPSI_LDC1, dest, base, ofs);[m
[31m-    else[m
[31m-      emit_tsi(as, MIPSI_LW, dest, base, ofs ^ (LJ_BE?4:0));[m
[31m-  }[m
[31m-  if (ra_hasreg(type))[m
[31m-    emit_tsi(as, MIPSI_LW, type, base, ofs ^ (LJ_BE?0:4));[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_cnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(as->J));[m
[31m-  CTypeID id = (CTypeID)IR(ir->op1)->i;[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco];[m
[31m-  IRRef args[4];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL));[m
[31m-[m
[31m-  as->gcsteps++;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  if (ra_used(ir))[m
[31m-    ra_destreg(as, ir, RID_RET);  /* GCcdata * */[m
[31m-[m
[31m-  /* Initialize immutable cdata object. */[m
[31m-  if (ir->o == IR_CNEWI) {[m
[31m-    RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-    int32_t ofs = sizeof(GCcdata);[m
[31m-    lua_assert(sz == 4 || sz == 8);[m
[31m-    if (sz == 8) {[m
[31m-      ofs += 4;[m
[31m-      lua_assert((ir+1)->o == IR_HIOP);[m
[31m-      if (LJ_LE) ir++;[m
[31m-    }[m
[31m-    for (;;) {[m
[31m-      Reg r = ra_alloc1z(as, ir->op2, allow);[m
[31m-      emit_tsi(as, MIPSI_SW, r, RID_RET, ofs);[m
[31m-      rset_clear(allow, r);[m
[31m-      if (ofs == sizeof(GCcdata)) break;[m
[31m-      ofs -= 4; if (LJ_BE) ir++; else ir--;[m
[31m-    }[m
[31m-  } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];[m
[31m-    args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-    args[1] = ir->op1;      /* CTypeID id   */[m
[31m-    args[2] = ir->op2;      /* CTSize sz    */[m
[31m-    args[3] = ASMREF_TMP1;  /* CTSize align */[m
[31m-    asm_gencall(as, ci, args);[m
[31m-    emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)ctype_align(info));[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */[m
[31m-  emit_tsi(as, MIPSI_SB, RID_RET+1, RID_RET, offsetof(GCcdata, gct));[m
[31m-  emit_tsi(as, MIPSI_SH, RID_TMP, RID_RET, offsetof(GCcdata, ctypeid));[m
[31m-  emit_ti(as, MIPSI_LI, RID_RET+1, ~LJ_TCDATA);[m
[31m-  emit_ti(as, MIPSI_LI, RID_TMP, id); /* Lower 16 bit used. Sign-ext ok. */[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ASMREF_TMP1;  /* MSize size   */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)),[m
[31m-	       ra_releasetmp(as, ASMREF_TMP1));[m
[31m-}[m
[31m-#else[m
[31m-#define asm_cnew(as, ir)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-static void asm_tbar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg mark = ra_scratch(as, rset_exclude(RSET_GPR, tab));[m
[31m-  Reg link = RID_TMP;[m
[31m-  MCLabel l_end = emit_label(as);[m
[31m-  emit_tsi(as, MIPSI_SW, link, tab, (int32_t)offsetof(GCtab, gclist));[m
[31m-  emit_tsi(as, MIPSI_SB, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-  emit_setgl(as, tab, gc.grayagain);[m
[31m-  emit_getgl(as, link, gc.grayagain);[m
[31m-  emit_dst(as, MIPSI_XOR, mark, mark, RID_TMP);  /* Clear black bit. */[m
[31m-  emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);[m
[31m-  emit_tsi(as, MIPSI_ANDI, RID_TMP, mark, LJ_GC_BLACK);[m
[31m-  emit_tsi(as, MIPSI_LBU, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-}[m
[31m-[m
[31m-static void asm_obar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg obj, val, tmp;[m
[31m-  /* No need for other object barriers (yet). */[m
[31m-  lua_assert(IR(ir->op1)->o == IR_UREFC);[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ir->op1;      /* TValue *tv      */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);[m
[31m-  obj = IR(ir->op1)->r;[m
[31m-  tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);[m
[31m-  emit_tsi(as, MIPSI_ANDI, tmp, tmp, LJ_GC_BLACK);[m
[31m-  emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);[m
[31m-  emit_tsi(as, MIPSI_ANDI, RID_TMP, RID_TMP, LJ_GC_WHITES);[m
[31m-  val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_tsi(as, MIPSI_LBU, tmp, obj,[m
[31m-	   (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));[m
[31m-  emit_tsi(as, MIPSI_LBU, RID_TMP, val, (int32_t)offsetof(GChead, marked));[m
[31m-}[m
[31m-[m
[31m-/* -- Arithmetic and logic operations ------------------------------------- */[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void asm_fparith(ASMState *as, IRIns *ir, MIPSIns mi)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  emit_fgh(as, mi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_fpunary(ASMState *as, IRIns *ir, MIPSIns mi)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR);[m
[31m-  emit_fg(as, mi, dest, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_fpmath(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir))[m
[31m-    return;[m
[31m-  if (ir->op2 <= IRFPM_TRUNC)[m
[31m-    asm_callround(as, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-  else if (ir->op2 == IRFPM_SQRT)[m
[31m-    asm_fpunary(as, ir, MIPSI_SQRT_D);[m
[31m-  else[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_add(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, MIPSI_ADD_D);[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      int32_t k = IR(ir->op2)->i;[m
[31m-      if (checki16(k)) {[m
[31m-	emit_tsi(as, MIPSI_ADDIU, dest, left, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_dst(as, MIPSI_ADDU, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sub(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, MIPSI_SUB_D);[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_dst(as, MIPSI_SUBU, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_mul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, MIPSI_MUL_D);[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_dst(as, MIPSI_MUL, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_div(as, ir)		asm_fparith(as, ir, MIPSI_DIV_D)[m
[31m-#define asm_mod(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_modi)[m
[31m-#define asm_pow(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_powi)[m
[31m-[m
[31m-static void asm_neg(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if !LJ_SOFTFP[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fpunary(as, ir, MIPSI_NEG_D);[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_abs(as, ir)		asm_fpunary(as, ir, MIPSI_ABS_D)[m
[31m-#define asm_atan2(as, ir)	asm_callid(as, ir, IRCALL_atan2)[m
[31m-#define asm_ldexp(as, ir)	asm_callid(as, ir, IRCALL_ldexp)[m
[31m-[m
[31m-static void asm_arithov(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg right, left, tmp, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int k = IR(ir->op2)->i;[m
[31m-    if (ir->o == IR_SUBOV) k = -k;[m
[31m-    if (checki16(k)) {  /* (dest < left) == (k >= 0 ? 1 : 0) */[m
[31m-      left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-      asm_guard(as, k >= 0 ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-      emit_dst(as, MIPSI_SLT, RID_TMP, dest, dest == left ? RID_TMP : left);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, left, k);[m
[31m-      if (dest == left) emit_move(as, RID_TMP, left);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  tmp = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_GPR, left),[m
[31m-						 right), dest));[m
[31m-  asm_guard(as, MIPSI_BLTZ, RID_TMP, 0);[m
[31m-  emit_dst(as, MIPSI_AND, RID_TMP, RID_TMP, tmp);[m
[31m-  if (ir->o == IR_ADDOV) {  /* ((dest^left) & (dest^right)) < 0 */[m
[31m-    emit_dst(as, MIPSI_XOR, RID_TMP, dest, dest == right ? RID_TMP : right);[m
[31m-  } else {  /* ((dest^left) & (dest^~right)) < 0 */[m
[31m-    emit_dst(as, MIPSI_XOR, RID_TMP, RID_TMP, dest);[m
[31m-    emit_dst(as, MIPSI_NOR, RID_TMP, dest == right ? RID_TMP : right, RID_ZERO);[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_XOR, tmp, dest, dest == left ? RID_TMP : left);[m
[31m-  emit_dst(as, ir->o == IR_ADDOV ? MIPSI_ADDU : MIPSI_SUBU, dest, left, right);[m
[31m-  if (dest == left || dest == right)[m
[31m-    emit_move(as, RID_TMP, dest == left ? left : right);[m
[31m-}[m
[31m-[m
[31m-#define asm_addov(as, ir)	asm_arithov(as, ir)[m
[31m-#define asm_subov(as, ir)	asm_arithov(as, ir)[m
[31m-[m
[31m-static void asm_mulov(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg tmp, right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  tmp = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_GPR, left),[m
[31m-						 right), dest));[m
[31m-  asm_guard(as, MIPSI_BNE, RID_TMP, tmp);[m
[31m-  emit_dta(as, MIPSI_SRA, RID_TMP, dest, 31);[m
[31m-  emit_dst(as, MIPSI_MFHI, tmp, 0, 0);[m
[31m-  emit_dst(as, MIPSI_MFLO, dest, 0, 0);[m
[31m-  emit_dst(as, MIPSI_MULT, 0, left, right);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_add64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (k == 0) {[m
[31m-      emit_dst(as, MIPSI_ADDU, dest, left, RID_TMP);[m
[31m-      goto loarith;[m
[31m-    } else if (checki16(k)) {[m
[31m-      emit_dst(as, MIPSI_ADDU, dest, dest, RID_TMP);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, left, k);[m
[31m-      goto loarith;[m
[31m-    }[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_ADDU, dest, dest, RID_TMP);[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_dst(as, MIPSI_ADDU, dest, left, right);[m
[31m-loarith:[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (k == 0) {[m
[31m-      if (dest != left)[m
[31m-	emit_move(as, dest, left);[m
[31m-      return;[m
[31m-    } else if (checki16(k)) {[m
[31m-      if (dest == left) {[m
[31m-	Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, left));[m
[31m-	emit_move(as, dest, tmp);[m
[31m-	dest = tmp;[m
[31m-      }[m
[31m-      emit_dst(as, MIPSI_SLTU, RID_TMP, dest, left);[m
[31m-      emit_tsi(as, MIPSI_ADDIU, dest, left, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  if (dest == left && dest == right) {[m
[31m-    Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right));[m
[31m-    emit_move(as, dest, tmp);[m
[31m-    dest = tmp;[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP, dest, dest == left ? right : left);[m
[31m-  emit_dst(as, MIPSI_ADDU, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_sub64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, dest, RID_TMP);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, left, right);[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  if (dest == left) {[m
[31m-    Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right));[m
[31m-    emit_move(as, dest, tmp);[m
[31m-    dest = tmp;[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP, left, dest);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_neg64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, dest, RID_TMP);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left);[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP, RID_ZERO, dest);[m
[31m-  emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_bnot(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg left, right, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRIns *irl = IR(ir->op1);[m
[31m-  if (mayfuse(as, ir->op1) && irl->o == IR_BOR) {[m
[31m-    left = ra_alloc2(as, irl, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-  } else {[m
[31m-    left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    right = RID_ZERO;[m
[31m-  }[m
[31m-  emit_dst(as, MIPSI_NOR, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_bswap(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-    emit_dta(as, MIPSI_ROTR, dest, RID_TMP, 16);[m
[31m-    emit_dst(as, MIPSI_WSBH, RID_TMP, 0, left);[m
[31m-  } else {[m
[31m-    Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), dest));[m
[31m-    emit_dst(as, MIPSI_OR, dest, dest, tmp);[m
[31m-    emit_dst(as, MIPSI_OR, dest, dest, RID_TMP);[m
[31m-    emit_tsi(as, MIPSI_ANDI, dest, dest, 0xff00);[m
[31m-    emit_dta(as, MIPSI_SLL, RID_TMP, RID_TMP, 8);[m
[31m-    emit_dta(as, MIPSI_SRL, dest, left, 8);[m
[31m-    emit_tsi(as, MIPSI_ANDI, RID_TMP, left, 0xff00);[m
[31m-    emit_dst(as, MIPSI_OR, tmp, tmp, RID_TMP);[m
[31m-    emit_dta(as, MIPSI_SRL, tmp, left, 24);[m
[31m-    emit_dta(as, MIPSI_SLL, RID_TMP, left, 24);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_bitop(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (checku16(k)) {[m
[31m-      emit_tsi(as, mik, dest, left, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_dst(as, mi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-#define asm_band(as, ir)	asm_bitop(as, ir, MIPSI_AND, MIPSI_ANDI)[m
[31m-#define asm_bor(as, ir)		asm_bitop(as, ir, MIPSI_OR, MIPSI_ORI)[m
[31m-#define asm_bxor(as, ir)	asm_bitop(as, ir, MIPSI_XOR, MIPSI_XORI)[m
[31m-[m
[31m-static void asm_bitshift(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {  /* Constant shifts. */[m
[31m-    uint32_t shift = (uint32_t)(IR(ir->op2)->i & 31);[m
[31m-    emit_dta(as, mik, dest, ra_hintalloc(as, ir->op1, dest, RSET_GPR), shift);[m
[31m-  } else {[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_dst(as, mi, dest, right, left);  /* Shift amount is in rs. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_bshl(as, ir)	asm_bitshift(as, ir, MIPSI_SLLV, MIPSI_SLL)[m
[31m-#define asm_bshr(as, ir)	asm_bitshift(as, ir, MIPSI_SRLV, MIPSI_SRL)[m
[31m-#define asm_bsar(as, ir)	asm_bitshift(as, ir, MIPSI_SRAV, MIPSI_SRA)[m
[31m-#define asm_brol(as, ir)	lua_assert(0)[m
[31m-[m
[31m-static void asm_bror(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-    asm_bitshift(as, ir, MIPSI_ROTRV, MIPSI_ROTR);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (irref_isk(ir->op2)) {  /* Constant shifts. */[m
[31m-      uint32_t shift = (uint32_t)(IR(ir->op2)->i & 31);[m
[31m-      Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-      emit_rotr(as, dest, left, RID_TMP, shift);[m
[31m-    } else {[m
[31m-      Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-      right = (left >> 8); left &= 255;[m
[31m-      emit_dst(as, MIPSI_OR, dest, dest, RID_TMP);[m
[31m-      emit_dst(as, MIPSI_SRLV, dest, right, left);[m
[31m-      emit_dst(as, MIPSI_SLLV, RID_TMP, RID_TMP, left);[m
[31m-      emit_dst(as, MIPSI_SUBU, RID_TMP, ra_allock(as, 32, RSET_GPR), right);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-static void asm_sfpmin_max(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CCallInfo ci = lj_ir_callinfo[(IROp)ir->o == IR_MIN ? IRCALL_lj_vm_sfmin : IRCALL_lj_vm_sfmax];[m
[31m-  IRRef args[4];[m
[31m-  args[0^LJ_BE] = ir->op1;[m
[31m-  args[1^LJ_BE] = (ir+1)->op1;[m
[31m-  args[2^LJ_BE] = ir->op2;[m
[31m-  args[3^LJ_BE] = (ir+1)->op2;[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-  emit_call(as, (void *)ci.func, 0);[m
[31m-  ci.func = NULL;[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_min_max(ASMState *as, IRIns *ir, int ismax)[m
[31m-{[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    if (dest == left) {[m
[31m-      emit_fg(as, MIPSI_MOVT_D, dest, right);[m
[31m-    } else {[m
[31m-      emit_fg(as, MIPSI_MOVF_D, dest, left);[m
[31m-      if (dest != right) emit_fg(as, MIPSI_MOV_D, dest, right);[m
[31m-    }[m
[31m-    emit_fgh(as, MIPSI_C_OLT_D, 0, ismax ? left : right, ismax ? right : left);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    if (dest == left) {[m
[31m-      emit_dst(as, MIPSI_MOVN, dest, right, RID_TMP);[m
[31m-    } else {[m
[31m-      emit_dst(as, MIPSI_MOVZ, dest, left, RID_TMP);[m
[31m-      if (dest != right) emit_move(as, dest, right);[m
[31m-    }[m
[31m-    emit_dst(as, MIPSI_SLT, RID_TMP,[m
[31m-	     ismax ? left : right, ismax ? right : left);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_min(as, ir)		asm_min_max(as, ir, 0)[m
[31m-#define asm_max(as, ir)		asm_min_max(as, ir, 1)[m
[31m-[m
[31m-/* -- Comparisons --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-/* SFP comparisons. */[m
[31m-static void asm_sfpcomp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_softfp_cmp];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  Reg r;[m
[31m-  IRRef args[4];[m
[31m-  args[LJ_LE ? 0 : 1] = ir->op1; args[LJ_LE ? 1 : 0] = (ir+1)->op1;[m
[31m-  args[LJ_LE ? 2 : 3] = ir->op2; args[LJ_LE ? 3 : 2] = (ir+1)->op2;[m
[31m-[m
[31m-  for (r = REGARG_FIRSTGPR; r <= REGARG_FIRSTGPR+3; r++) {[m
[31m-    if (!rset_test(as->freeset, r) &&[m
[31m-	regcost_ref(as->cost[r]) == args[r-REGARG_FIRSTGPR])[m
[31m-      rset_clear(drop, r);[m
[31m-  }[m
[31m-  ra_evictset(as, drop);[m
[31m-[m
[31m-  asm_setupresult(as, ir, ci);[m
[31m-[m
[31m-  switch ((IROp)ir->o) {[m
[31m-  case IR_LT:[m
[31m-    asm_guard(as, MIPSI_BGEZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_ULT:[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_TMP);[m
[31m-    emit_loadi(as, RID_TMP, 1);[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_ZERO);[m
[31m-    break;[m
[31m-  case IR_GE:[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_TMP);[m
[31m-    emit_loadi(as, RID_TMP, 2);[m
[31m-    asm_guard(as, MIPSI_BLTZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_LE:[m
[31m-    asm_guard(as, MIPSI_BGTZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_GT:[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_TMP);[m
[31m-    emit_loadi(as, RID_TMP, 2);[m
[31m-    asm_guard(as, MIPSI_BLEZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_UGE:[m
[31m-    asm_guard(as, MIPSI_BLTZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_ULE:[m
[31m-    asm_guard(as, MIPSI_BEQ, RID_RET, RID_TMP);[m
[31m-    emit_loadi(as, RID_TMP, 1);[m
[31m-    break;[m
[31m-  case IR_UGT: case IR_ABC:[m
[31m-    asm_guard(as, MIPSI_BLEZ, RID_RET, 0);[m
[31m-    break;[m
[31m-  case IR_EQ: case IR_NE:[m
[31m-    asm_guard(as, (ir->o & 1) ? MIPSI_BEQ : MIPSI_BNE, RID_RET, RID_ZERO);[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-  asm_gencall(as, ci, args);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* ORDER IR: LT GE LE GT  ULT UGE ULE UGT. */[m
[31m-  IROp op = ir->o;[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    asm_guard(as, (op&1) ? MIPSI_BC1T : MIPSI_BC1F, 0, 0);[m
[31m-    emit_fgh(as, MIPSI_C_OLT_D + ((op&3) ^ ((op>>2)&1)), 0, left, right);[m
[31m-  } else {[m
[31m-    Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (op == IR_ABC) op = IR_UGT;[m
[31m-    if ((op&4) == 0 && irref_isk(ir->op2) && IR(ir->op2)->i == 0) {[m
[31m-      MIPSIns mi = (op&2) ? ((op&1) ? MIPSI_BLEZ : MIPSI_BGTZ) :[m
[31m-			    ((op&1) ? MIPSI_BLTZ : MIPSI_BGEZ);[m
[31m-      asm_guard(as, mi, left, 0);[m
[31m-    } else {[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	int32_t k = IR(ir->op2)->i;[m
[31m-	if ((op&2)) k++;[m
[31m-	if (checki16(k)) {[m
[31m-	  asm_guard(as, (op&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-	  emit_tsi(as, (op&4) ? MIPSI_SLTIU : MIPSI_SLTI,[m
[31m-		   RID_TMP, left, k);[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-      right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-      asm_guard(as, ((op^(op>>1))&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-      emit_dst(as, (op&4) ? MIPSI_SLTU : MIPSI_SLT,[m
[31m-	       RID_TMP, (op&2) ? right : left, (op&2) ? left : right);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_equal(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg right, left = ra_alloc2(as, ir, (!LJ_SOFTFP && irt_isnum(ir->t)) ? RSET_FPR : RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  if (!LJ_SOFTFP && irt_isnum(ir->t)) {[m
[31m-    asm_guard(as, (ir->o & 1) ? MIPSI_BC1T : MIPSI_BC1F, 0, 0);[m
[31m-    emit_fgh(as, MIPSI_C_EQ_D, 0, left, right);[m
[31m-  } else {[m
[31m-    asm_guard(as, (ir->o & 1) ? MIPSI_BEQ : MIPSI_BNE, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* 64 bit integer comparisons. */[m
[31m-static void asm_comp64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* ORDER IR: LT GE LE GT  ULT UGE ULE UGT. */[m
[31m-  IROp op = (ir-1)->o;[m
[31m-  MCLabel l_end;[m
[31m-  Reg rightlo, leftlo, righthi, lefthi = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  righthi = (lefthi >> 8); lefthi &= 255;[m
[31m-  leftlo = ra_alloc2(as, ir-1,[m
[31m-		     rset_exclude(rset_exclude(RSET_GPR, lefthi), righthi));[m
[31m-  rightlo = (leftlo >> 8); leftlo &= 255;[m
[31m-  asm_guard(as, ((op^(op>>1))&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);[m
[31m-  l_end = emit_label(as);[m
[31m-  if (lefthi != righthi)[m
[31m-    emit_dst(as, (op&4) ? MIPSI_SLTU : MIPSI_SLT, RID_TMP,[m
[31m-	     (op&2) ? righthi : lefthi, (op&2) ? lefthi : righthi);[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP,[m
[31m-	   (op&2) ? rightlo : leftlo, (op&2) ? leftlo : rightlo);[m
[31m-  if (lefthi != righthi)[m
[31m-    emit_branch(as, MIPSI_BEQ, lefthi, righthi, l_end);[m
[31m-}[m
[31m-[m
[31m-static void asm_comp64eq(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tmp, right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  asm_guard(as, ((ir-1)->o & 1) ? MIPSI_BEQ : MIPSI_BNE, RID_TMP, RID_ZERO);[m
[31m-  tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right));[m
[31m-  emit_dst(as, MIPSI_OR, RID_TMP, RID_TMP, tmp);[m
[31m-  emit_dst(as, MIPSI_XOR, tmp, left, right);[m
[31m-  left = ra_alloc2(as, ir-1, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  emit_dst(as, MIPSI_XOR, RID_TMP, left, right);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */[m
[31m-[m
[31m-/* Hiword op of a split 64 bit op. Previous op must be the loword op. */[m
[31m-static void asm_hiop(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_HASFFI || LJ_SOFTFP[m
[31m-  /* HIOP is marked as a store because it needs its own DCE logic. */[m
[31m-  int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */[m
[31m-  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;[m
[31m-  if ((ir-1)->o == IR_CONV) {  /* Conversions to/from 64 bit. */[m
[31m-    as->curins--;  /* Always skip the CONV. */[m
[31m-#if LJ_HASFFI && !LJ_SOFTFP[m
[31m-    if (usehi || uselo)[m
[31m-      asm_conv64(as, ir);[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else if ((ir-1)->o < IR_EQ) {  /* 64 bit integer comparisons. ORDER IR. */[m
[31m-    as->curins--;  /* Always skip the loword comparison. */[m
[31m-#if LJ_SOFTFP[m
[31m-    if (!irt_isint(ir->t)) {[m
[31m-      asm_sfpcomp(as, ir-1);[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-    asm_comp64(as, ir);[m
[31m-#endif[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o <= IR_NE) {  /* 64 bit integer comparisons. ORDER IR. */[m
[31m-    as->curins--;  /* Always skip the loword comparison. */[m
[31m-#if LJ_SOFTFP[m
[31m-    if (!irt_isint(ir->t)) {[m
[31m-      asm_sfpcomp(as, ir-1);[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-    asm_comp64eq(as, ir);[m
[31m-#endif[m
[31m-    return;[m
[31m-#if LJ_SOFTFP[m
[31m-  } else if ((ir-1)->o == IR_MIN || (ir-1)->o == IR_MAX) {[m
[31m-      as->curins--;  /* Always skip the loword min/max. */[m
[31m-    if (uselo || usehi)[m
[31m-      asm_sfpmin_max(as, ir-1);[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else if ((ir-1)->o == IR_XSTORE) {[m
[31m-    as->curins--;  /* Handle both stores here. */[m
[31m-    if ((ir-1)->r != RID_SINK) {[m
[31m-      asm_xstore_(as, ir, LJ_LE ? 4 : 0);[m
[31m-      asm_xstore_(as, ir-1, LJ_LE ? 0 : 4);[m
[31m-    }[m
[31m-    return;[m
[31m-  }[m
[31m-  if (!usehi) return;  /* Skip unused hiword op for all remaining ops. */[m
[31m-  switch ((ir-1)->o) {[m
[31m-#if LJ_HASFFI[m
[31m-  case IR_ADD: as->curins--; asm_add64(as, ir); break;[m
[31m-  case IR_SUB: as->curins--; asm_sub64(as, ir); break;[m
[31m-  case IR_NEG: as->curins--; asm_neg64(as, ir); break;[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-  case IR_STRTO:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RSET_GPR);  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-#endif[m
[31m-  case IR_CALLN:[m
[31m-  case IR_CALLS:[m
[31m-  case IR_CALLXS:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RID2RSET(RID_RETLO));  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-#if LJ_SOFTFP[m
[31m-  case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_TOSTR:[m
[31m-#endif[m
[31m-  case IR_CNEWI:[m
[31m-    /* Nothing to do here. Handled by lo op itself. */[m
[31m-    break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(as); UNUSED(ir); lua_assert(0);  /* Unused without FFI. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_prof(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  asm_guard(as, MIPSI_BNE, RID_TMP, RID_ZERO);[m
[31m-  emit_tsi(as, MIPSI_ANDI, RID_TMP, RID_TMP, HOOK_PROFILE);[m
[31m-  emit_lsglptr(as, MIPSI_LBU, RID_TMP,[m
[31m-	       (int32_t)offsetof(global_State, hookmask));[m
[31m-}[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check Lua stack size for overflow. Use exit handler as fallback. */[m
[31m-static void asm_stack_check(ASMState *as, BCReg topslot,[m
[31m-			    IRIns *irp, RegSet allow, ExitNo exitno)[m
[31m-{[m
[31m-  /* Try to get an unused temp. register, otherwise spill/restore RID_RET*. */[m
[31m-  Reg tmp, pbase = irp ? (ra_hasreg(irp->r) ? irp->r : RID_TMP) : RID_BASE;[m
[31m-  ExitNo oldsnap = as->snapno;[m
[31m-  rset_clear(allow, pbase);[m
[31m-  tmp = allow ? rset_pickbot(allow) :[m
[31m-		(pbase == RID_RETHI ? RID_RETLO : RID_RETHI);[m
[31m-  as->snapno = exitno;[m
[31m-  asm_guard(as, MIPSI_BNE, RID_TMP, RID_ZERO);[m
[31m-  as->snapno = oldsnap;[m
[31m-  if (allow == RSET_EMPTY)  /* Restore temp. register. */[m
[31m-    emit_tsi(as, MIPSI_LW, tmp, RID_SP, 0);[m
[31m-  else[m
[31m-    ra_modified(as, tmp);[m
[31m-  emit_tsi(as, MIPSI_SLTIU, RID_TMP, RID_TMP, (int32_t)(8*topslot));[m
[31m-  emit_dst(as, MIPSI_SUBU, RID_TMP, tmp, pbase);[m
[31m-  emit_tsi(as, MIPSI_LW, tmp, tmp, offsetof(lua_State, maxstack));[m
[31m-  if (pbase == RID_TMP)[m
[31m-    emit_getgl(as, RID_TMP, jit_base);[m
[31m-  emit_getgl(as, tmp, cur_L);[m
[31m-  if (allow == RSET_EMPTY)  /* Spill temp. register. */[m
[31m-    emit_tsi(as, MIPSI_SW, tmp, RID_SP, 0);[m
[31m-}[m
[31m-[m
[31m-/* Restore Lua stack from on-trace state. */[m
[31m-static void asm_stack_restore(ASMState *as, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  /* Store the value of all modified slots to the Lua stack. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    int32_t ofs = 8*((int32_t)s-1);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if ((sn & SNAP_NORESTORE))[m
[31m-      continue;[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-#if LJ_SOFTFP[m
[31m-      Reg tmp;[m
[31m-      RegSet allow = rset_exclude(RSET_GPR, RID_BASE);[m
[31m-      lua_assert(irref_isk(ref));  /* LJ_SOFTFP: must be a number constant. */[m
[31m-      tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.lo, allow);[m
[31m-      emit_tsi(as, MIPSI_SW, tmp, RID_BASE, ofs+(LJ_BE?4:0));[m
[31m-      if (rset_test(as->freeset, tmp+1)) allow = RID2RSET(tmp+1);[m
[31m-      tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.hi, allow);[m
[31m-      emit_tsi(as, MIPSI_SW, tmp, RID_BASE, ofs+(LJ_BE?0:4));[m
[31m-#else[m
[31m-      Reg src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-      emit_hsi(as, MIPSI_SDC1, src, RID_BASE, ofs);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      Reg type;[m
[31m-      RegSet allow = rset_exclude(RSET_GPR, RID_BASE);[m
[31m-      lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));[m
[31m-      if (!irt_ispri(ir->t)) {[m
[31m-	Reg src = ra_alloc1(as, ref, allow);[m
[31m-	rset_clear(allow, src);[m
[31m-	emit_tsi(as, MIPSI_SW, src, RID_BASE, ofs+(LJ_BE?4:0));[m
[31m-      }[m
[31m-      if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	if (s == 0) continue;  /* Do not overwrite link to previous frame. */[m
[31m-	type = ra_allock(as, (int32_t)(*flinks--), allow);[m
[31m-#if LJ_SOFTFP[m
[31m-      } else if ((sn & SNAP_SOFTFPNUM)) {[m
[31m-	type = ra_alloc1(as, ref+1, rset_exclude(RSET_GPR, RID_BASE));[m
[31m-#endif[m
[31m-      } else {[m
[31m-	type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-      }[m
[31m-      emit_tsi(as, MIPSI_SW, type, RID_BASE, ofs+(LJ_BE?0:4));[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-}[m
[31m-[m
[31m-/* -- GC handling --------------------------------------------------------- */[m
[31m-[m
[31m-/* Check GC threshold and do one or more GC steps. */[m
[31m-static void asm_gc_check(ASMState *as)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg tmp;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */[m
[31m-  /* Assumes asm_snap_prep() already done. */[m
[31m-  asm_guard(as, MIPSI_BNE, RID_RET, RID_ZERO);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ASMREF_TMP2;  /* MSize steps     */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);[m
[31m-  tmp = ra_releasetmp(as, ASMREF_TMP2);[m
[31m-  emit_loadi(as, tmp, as->gcsteps);[m
[31m-  /* Jump around GC step if GC total < GC threshold. */[m
[31m-  emit_branch(as, MIPSI_BNE, RID_TMP, RID_ZERO, l_end);[m
[31m-  emit_dst(as, MIPSI_SLTU, RID_TMP, RID_TMP, tmp);[m
[31m-  emit_getgl(as, tmp, gc.threshold);[m
[31m-  emit_getgl(as, RID_TMP, gc.total);[m
[31m-  as->gcsteps = 0;[m
[31m-  checkmclim(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Loop handling ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the loop branch. */[m
[31m-static void asm_loop_fixup(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target = as->mcp;[m
[31m-  p[-1] = MIPSI_NOP;[m
[31m-  if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-    /* asm_guard already inverted the cond branch. Only patch the target. */[m
[31m-    p[-3] |= ((target-p+2) & 0x0000ffffu);[m
[31m-  } else {[m
[31m-    p[-2] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Coalesce BASE register for a root trace. */[m
[31m-static void asm_head_root_base(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (as->loopinv) as->mctop--;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (r != RID_BASE)[m
[31m-      emit_move(as, r, RID_BASE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Coalesce BASE register for a side trace. */[m
[31m-static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (as->loopinv) as->mctop--;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (irp->r == r) {[m
[31m-      rset_clear(allow, r);  /* Mark same BASE register as coalesced. */[m
[31m-    } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) {[m
[31m-      rset_clear(allow, irp->r);[m
[31m-      emit_move(as, r, irp->r);  /* Move from coalesced parent reg. */[m
[31m-    } else {[m
[31m-      emit_getgl(as, r, jit_base);  /* Otherwise reload BASE. */[m
[31m-    }[m
[31m-  }[m
[31m-  return allow;[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the tail code. */[m
[31m-static void asm_tail_fixup(ASMState *as, TraceNo lnk)[m
[31m-{[m
[31m-  MCode *target = lnk ? traceref(as->J,lnk)->mcode : (MCode *)lj_vm_exit_interp;[m
[31m-  int32_t spadj = as->T->spadjust;[m
[31m-  MCode *p = as->mctop-1;[m
[31m-  *p = spadj ? (MIPSI_ADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP;[m
[31m-  p[-1] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);[m
[31m-}[m
[31m-[m
[31m-/* Prepare tail of code. */[m
[31m-static void asm_tail_prep(ASMState *as)[m
[31m-{[m
[31m-  as->mcp = as->mctop-2;  /* Leave room for branch plus nop or stack adj. */[m
[31m-  as->invmcp = as->loopref ? as->mcp : NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Ensure there are enough stack slots for call arguments. */[m
[31m-static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  uint32_t i, nargs = CCI_XNARGS(ci);[m
[31m-  int nslots = 4, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  for (i = 0; i < nargs; i++) {[m
[31m-    if (!LJ_SOFTFP && args[i] && irt_isfp(IR(args[i])->t) &&[m
[31m-	nfpr > 0 && !(ci->flags & CCI_VARARG)) {[m
[31m-      nfpr--;[m
[31m-      ngpr -= irt_isnum(IR(args[i])->t) ? 2 : 1;[m
[31m-    } else if (!LJ_SOFTFP && args[i] && irt_isnum(IR(args[i])->t)) {[m
[31m-      nfpr = 0;[m
[31m-      ngpr = ngpr & ~1;[m
[31m-      if (ngpr > 0) ngpr -= 2; else nslots = (nslots+3) & ~1;[m
[31m-    } else {[m
[31m-      nfpr = 0;[m
[31m-      if (ngpr > 0) ngpr--; else nslots++;[m
[31m-    }[m
[31m-  }[m
[31m-  if (nslots > as->evenspill)  /* Leave room for args in stack slots. */[m
[31m-    as->evenspill = nslots;[m
[31m-  return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET);[m
[31m-}[m
[31m-[m
[31m-static void asm_setup_target(ASMState *as)[m
[31m-{[m
[31m-  asm_sparejump_setup(as);[m
[31m-  asm_exitstub_setup(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace patching ------------------------------------------------------ */[m
[31m-[m
[31m-/* Patch exit jumps of existing machine code to a new target. */[m
[31m-void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)[m
[31m-{[m
[31m-  MCode *p = T->mcode;[m
[31m-  MCode *pe = (MCode *)((char *)p + T->szmcode);[m
[31m-  MCode *px = exitstub_trace_addr(T, exitno);[m
[31m-  MCode *cstart = NULL, *cstop = NULL;[m
[31m-  MCode *mcarea = lj_mcode_patch(J, p, 0);[m
[31m-  MCode exitload = MIPSI_LI | MIPSF_T(RID_TMP) | exitno;[m
[31m-  MCode tjump = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);[m
[31m-  for (p++; p < pe; p++) {[m
[31m-    if (*p == exitload) {  /* Look for load of exit number. */[m
[31m-      if (((p[-1] ^ (px-p)) & 0xffffu) == 0) {  /* Look for exitstub branch. */[m
[31m-	ptrdiff_t delta = target - p;[m
[31m-	if (((delta + 0x8000) >> 16) == 0) {  /* Patch in-range branch. */[m
[31m-	patchbranch:[m
[31m-	  p[-1] = (p[-1] & 0xffff0000u) | (delta & 0xffffu);[m
[31m-	  *p = MIPSI_NOP;  /* Replace the load of the exit number. */[m
[31m-	  cstop = p;[m
[31m-	  if (!cstart) cstart = p-1;[m
[31m-	} else {  /* Branch out of range. Use spare jump slot in mcarea. */[m
[31m-	  int i;[m
[31m-	  for (i = 2; i < 2+MIPS_SPAREJUMP*2; i += 2) {[m
[31m-	    if (mcarea[i] == tjump) {[m
[31m-	      delta = mcarea+i - p;[m
[31m-	      goto patchbranch;[m
[31m-	    } else if (mcarea[i] == MIPSI_NOP) {[m
[31m-	      mcarea[i] = tjump;[m
[31m-	      cstart = mcarea+i;[m
[31m-	      delta = mcarea+i - p;[m
[31m-	      goto patchbranch;[m
[31m-	    }[m
[31m-	  }[m
[31m-	  /* Ignore jump slot overflow. Child trace is simply not attached. */[m
[31m-	}[m
[31m-      } else if (p+1 == pe) {[m
[31m-	/* Patch NOP after code for inverted loop branch. Use of J is ok. */[m
[31m-	lua_assert(p[1] == MIPSI_NOP);[m
[31m-	p[1] = tjump;[m
[31m-	*p = MIPSI_NOP;  /* Replace the load of the exit number. */[m
[31m-	cstop = p+2;[m
[31m-	if (!cstart) cstart = p+1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (cstart) lj_mcode_sync(cstart, cstop);[m
[31m-  lj_mcode_patch(J, mcarea, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex 0ebed40..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,2015 +0,0 @@[m
[31m-/*[m
[31m-** PPC IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Register allocator extensions --------------------------------------- */[m
[31m-[m
[31m-/* Allocate a register with a hint. */[m
[31m-static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow)[m
[31m-{[m
[31m-  Reg r = IR(ref)->r;[m
[31m-  if (ra_noreg(r)) {[m
[31m-    if (!ra_hashint(r) && !iscrossref(as, ref))[m
[31m-      ra_sethint(IR(ref)->r, hint);  /* Propagate register hint. */[m
[31m-    r = ra_allocref(as, ref, allow);[m
[31m-  }[m
[31m-  ra_noweak(as, r);[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-/* Allocate two source registers for three-operand instructions. */[m
[31m-static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-  Reg left = irl->r, right = irr->r;[m
[31m-  if (ra_hasreg(left)) {[m
[31m-    ra_noweak(as, left);[m
[31m-    if (ra_noreg(right))[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(allow, left));[m
[31m-    else[m
[31m-      ra_noweak(as, right);[m
[31m-  } else if (ra_hasreg(right)) {[m
[31m-    ra_noweak(as, right);[m
[31m-    left = ra_allocref(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else if (ra_hashint(right)) {[m
[31m-    right = ra_allocref(as, ir->op2, allow);[m
[31m-    left = ra_alloc1(as, ir->op1, rset_exclude(allow, right));[m
[31m-  } else {[m
[31m-    left = ra_allocref(as, ir->op1, allow);[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(allow, left));[m
[31m-  }[m
[31m-  return left | (right << 8);[m
[31m-}[m
[31m-[m
[31m-/* -- Guard handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Setup exit stubs after the end of each trace. */[m
[31m-static void asm_exitstub_setup(ASMState *as, ExitNo nexits)[m
[31m-{[m
[31m-  ExitNo i;[m
[31m-  MCode *mxp = as->mctop;[m
[31m-  if (mxp - (nexits + 3 + MCLIM_REDZONE) < as->mclim)[m
[31m-    asm_mclimit(as);[m
[31m-  /* 1: mflr r0; bl ->vm_exit_handler; li r0, traceno; bl <1; bl <1; ... */[m
[31m-  for (i = nexits-1; (int32_t)i >= 0; i--)[m
[31m-    *--mxp = PPCI_BL|(((-3-i)&0x00ffffffu)<<2);[m
[31m-  *--mxp = PPCI_LI|PPCF_T(RID_TMP)|as->T->traceno;  /* Read by exit handler. */[m
[31m-  mxp--;[m
[31m-  *mxp = PPCI_BL|((((MCode *)(void *)lj_vm_exit_handler-mxp)&0x00ffffffu)<<2);[m
[31m-  *--mxp = PPCI_MFLR|PPCF_T(RID_TMP);[m
[31m-  as->mctop = mxp;[m
[31m-}[m
[31m-[m
[31m-static MCode *asm_exitstub_addr(ASMState *as, ExitNo exitno)[m
[31m-{[m
[31m-  /* Keep this in-sync with exitstub_trace_addr(). */[m
[31m-  return as->mctop + exitno + 3;[m
[31m-}[m
[31m-[m
[31m-/* Emit conditional branch to exit for guard. */[m
[31m-static void asm_guardcc(ASMState *as, PPCCC cc)[m
[31m-{[m
[31m-  MCode *target = asm_exitstub_addr(as, as->snapno);[m
[31m-  MCode *p = as->mcp;[m
[31m-  if (LJ_UNLIKELY(p == as->invmcp)) {[m
[31m-    as->loopinv = 1;[m
[31m-    *p = PPCI_B | (((target-p) & 0x00ffffffu) << 2);[m
[31m-    emit_condbranch(as, PPCI_BC, cc^4, p);[m
[31m-    return;[m
[31m-  }[m
[31m-  emit_condbranch(as, PPCI_BC, cc, target);[m
[31m-}[m
[31m-[m
[31m-/* -- Operand fusion ------------------------------------------------------ */[m
[31m-[m
[31m-/* Limit linear search to this distance. Avoids O(n^2) behavior. */[m
[31m-#define CONFLICT_SEARCH_LIM	31[m
[31m-[m
[31m-/* Check if there's no conflicting instruction between curins and ref. */[m
[31m-static int noconflict(ASMState *as, IRRef ref, IROp conflict)[m
[31m-{[m
[31m-  IRIns *ir = as->ir;[m
[31m-  IRRef i = as->curins;[m
[31m-  if (i > ref + CONFLICT_SEARCH_LIM)[m
[31m-    return 0;  /* Give up, ref is too far away. */[m
[31m-  while (--i > ref)[m
[31m-    if (ir[i].o == conflict)[m
[31m-      return 0;  /* Conflict found. */[m
[31m-  return 1;  /* Ok, no conflict. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse the array base of colocated arrays. */[m
[31m-static int32_t asm_fuseabase(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE &&[m
[31m-      !neverfuse(as) && noconflict(as, ref, IR_NEWREF))[m
[31m-    return (int32_t)sizeof(GCtab);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Indicates load/store indexed is ok. */[m
[31m-#define AHUREF_LSX	((int32_t)0x80000000)[m
[31m-[m
[31m-/* Fuse array/hash/upvalue reference into register+offset operand. */[m
[31m-static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r)) {[m
[31m-    if (ir->o == IR_AREF) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	if (irref_isk(ir->op2)) {[m
[31m-	  IRRef tab = IR(ir->op1)->op1;[m
[31m-	  int32_t ofs = asm_fuseabase(as, tab);[m
[31m-	  IRRef refa = ofs ? tab : ir->op1;[m
[31m-	  ofs += 8*IR(ir->op2)->i;[m
[31m-	  if (checki16(ofs)) {[m
[31m-	    *ofsp = ofs;[m
[31m-	    return ra_alloc1(as, refa, allow);[m
[31m-	  }[m
[31m-	}[m
[31m-	if (*ofsp == AHUREF_LSX) {[m
[31m-	  Reg base = ra_alloc1(as, ir->op1, allow);[m
[31m-	  Reg idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));[m
[31m-	  return base | (idx << 8);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_HREFK) {[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node));[m
[31m-	if (checki16(ofs)) {[m
[31m-	  *ofsp = ofs;[m
[31m-	  return ra_alloc1(as, ir->op1, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (ir->o == IR_UREFC) {[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-	int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv);[m
[31m-	int32_t jgl = (intptr_t)J2G(as->J);[m
[31m-	if ((uint32_t)(ofs-jgl) < 65536) {[m
[31m-	  *ofsp = ofs-jgl-32768;[m
[31m-	  return RID_JGL;[m
[31m-	} else {[m
[31m-	  *ofsp = (int16_t)ofs;[m
[31m-	  return ra_allock(as, ofs-(int16_t)ofs, allow);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  *ofsp = 0;[m
[31m-  return ra_alloc1(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-/* Fuse XLOAD/XSTORE reference into load/store operand. */[m
[31m-static void asm_fusexref(ASMState *as, PPCIns pi, Reg rt, IRRef ref,[m
[31m-			 RegSet allow, int32_t ofs)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  Reg base;[m
[31m-  if (ra_noreg(ir->r) && canfuse(as, ir)) {[m
[31m-    if (ir->o == IR_ADD) {[m
[31m-      int32_t ofs2;[m
[31m-      if (irref_isk(ir->op2) && (ofs2 = ofs + IR(ir->op2)->i, checki16(ofs2))) {[m
[31m-	ofs = ofs2;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (ofs == 0) {[m
[31m-	Reg right, left = ra_alloc2(as, ir, allow);[m
[31m-	right = (left >> 8); left &= 255;[m
[31m-	emit_fab(as, PPCI_LWZX | ((pi >> 20) & 0x780), rt, left, right);[m
[31m-	return;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_STRREF) {[m
[31m-      lua_assert(ofs == 0);[m
[31m-      ofs = (int32_t)sizeof(GCstr);[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	ofs += IR(ir->op2)->i;[m
[31m-	ref = ir->op1;[m
[31m-      } else if (irref_isk(ir->op1)) {[m
[31m-	ofs += IR(ir->op1)->i;[m
[31m-	ref = ir->op2;[m
[31m-      } else {[m
[31m-	/* NYI: Fuse ADD with constant. */[m
[31m-	Reg tmp, right, left = ra_alloc2(as, ir, allow);[m
[31m-	right = (left >> 8); left &= 255;[m
[31m-	tmp = ra_scratch(as, rset_exclude(rset_exclude(allow, left), right));[m
[31m-	emit_fai(as, pi, rt, tmp, ofs);[m
[31m-	emit_tab(as, PPCI_ADD, tmp, left, right);[m
[31m-	return;[m
[31m-      }[m
[31m-      if (!checki16(ofs)) {[m
[31m-	Reg left = ra_alloc1(as, ref, allow);[m
[31m-	Reg right = ra_allock(as, ofs, rset_exclude(allow, left));[m
[31m-	emit_fab(as, PPCI_LWZX | ((pi >> 20) & 0x780), rt, left, right);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ref, allow);[m
[31m-  emit_fai(as, pi, rt, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Fuse XLOAD/XSTORE reference into indexed-only load/store operand. */[m
[31m-static void asm_fusexrefx(ASMState *as, PPCIns pi, Reg rt, IRRef ref,[m
[31m-			  RegSet allow)[m
[31m-{[m
[31m-  IRIns *ira = IR(ref);[m
[31m-  Reg right, left;[m
[31m-  if (canfuse(as, ira) && ira->o == IR_ADD && ra_noreg(ira->r)) {[m
[31m-    left = ra_alloc2(as, ira, allow);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-  } else {[m
[31m-    right = ra_alloc1(as, ref, allow);[m
[31m-    left = RID_R0;[m
[31m-  }[m
[31m-  emit_tab(as, pi, rt, left, right);[m
[31m-}[m
[31m-[m
[31m-/* Fuse to multiply-add/sub instruction. */[m
[31m-static int asm_fusemadd(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pir)[m
[31m-{[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  IRIns *irm;[m
[31m-  if (lref != rref &&[m
[31m-      ((mayfuse(as, lref) && (irm = IR(lref), irm->o == IR_MUL) &&[m
[31m-	ra_noreg(irm->r)) ||[m
[31m-       (mayfuse(as, rref) && (irm = IR(rref), irm->o == IR_MUL) &&[m
[31m-	(rref = lref, pi = pir, ra_noreg(irm->r))))) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg add = ra_alloc1(as, rref, RSET_FPR);[m
[31m-    Reg right, left = ra_alloc2(as, irm, rset_exclude(RSET_FPR, add));[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    emit_facb(as, pi, dest, left, right, add);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Generate a call to a C function. */[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n, nargs = CCI_XNARGS(ci);[m
[31m-  int32_t ofs = 8;[m
[31m-  Reg gpr = REGARG_FIRSTGPR, fpr = REGARG_FIRSTFPR;[m
[31m-  if ((void *)ci->func)[m
[31m-    emit_call(as, (void *)ci->func);[m
[31m-  for (n = 0; n < nargs; n++) {  /* Setup args. */[m
[31m-    IRRef ref = args[n];[m
[31m-    if (ref) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      if (irt_isfp(ir->t)) {[m
[31m-	if (fpr <= REGARG_LASTFPR) {[m
[31m-	  lua_assert(rset_test(as->freeset, fpr));  /* Already evicted. */[m
[31m-	  ra_leftov(as, fpr, ref);[m
[31m-	  fpr++;[m
[31m-	} else {[m
[31m-	  Reg r = ra_alloc1(as, ref, RSET_FPR);[m
[31m-	  if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4;[m
[31m-	  emit_spstore(as, ir, r, ofs);[m
[31m-	  ofs += irt_isnum(ir->t) ? 8 : 4;[m
[31m-	}[m
[31m-      } else {[m
[31m-	if (gpr <= REGARG_LASTGPR) {[m
[31m-	  lua_assert(rset_test(as->freeset, gpr));  /* Already evicted. */[m
[31m-	  ra_leftov(as, gpr, ref);[m
[31m-	  gpr++;[m
[31m-	} else {[m
[31m-	  Reg r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-	  emit_spstore(as, ir, r, ofs);[m
[31m-	  ofs += 4;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (gpr <= REGARG_LASTGPR)[m
[31m-	gpr++;[m
[31m-      else[m
[31m-	ofs += 4;[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  if ((ci->flags & CCI_VARARG))  /* Vararg calls need to know about FPR use. */[m
[31m-    emit_tab(as, fpr == REGARG_FIRSTFPR ? PPCI_CRXOR : PPCI_CREQV, 6, 6, 6);[m
[31m-}[m
[31m-[m
[31m-/* Setup result reg/sp for call. Evict scratch regs. */[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  int hiop = ((ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));[m
[31m-  if ((ci->flags & CCI_NOFPRCLOBBER))[m
[31m-    drop &= ~RSET_FPR;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  if (hiop && ra_hasreg((ir+1)->r))[m
[31m-    rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);  /* Evictions must be performed first. */[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert(!irt_ispri(ir->t));[m
[31m-    if (irt_isfp(ir->t)) {[m
[31m-      if ((ci->flags & CCI_CASTU64)) {[m
[31m-	/* Use spill slot or temp slots. */[m
[31m-	int32_t ofs = ir->s ? sps_scale(ir->s) : SPOFS_TMP;[m
[31m-	Reg dest = ir->r;[m
[31m-	if (ra_hasreg(dest)) {[m
[31m-	  ra_free(as, dest);[m
[31m-	  ra_modified(as, dest);[m
[31m-	  emit_fai(as, PPCI_LFD, dest, RID_SP, ofs);[m
[31m-	}[m
[31m-	emit_tai(as, PPCI_STW, RID_RETHI, RID_SP, ofs);[m
[31m-	emit_tai(as, PPCI_STW, RID_RETLO, RID_SP, ofs+4);[m
[31m-      } else {[m
[31m-	ra_destreg(as, ir, RID_FPRET);[m
[31m-      }[m
[31m-#if LJ_32[m
[31m-    } else if (hiop) {[m
[31m-      ra_destpair(as, ir);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      ra_destreg(as, ir, RID_RET);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_callx(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  CCallInfo ci;[m
[31m-  IRRef func;[m
[31m-  IRIns *irf;[m
[31m-  ci.flags = asm_callx_flags(as, ir);[m
[31m-  asm_collectargs(as, ir, &ci, args);[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-  func = ir->op2; irf = IR(func);[m
[31m-  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }[m
[31m-  if (irref_isk(func)) {  /* Call to constant address. */[m
[31m-    ci.func = (ASMFunction)(void *)(intptr_t)(irf->i);[m
[31m-  } else {  /* Need a non-argument register for indirect calls. */[m
[31m-    RegSet allow = RSET_GPR & ~RSET_RANGE(RID_R0, REGARG_LASTGPR+1);[m
[31m-    Reg freg = ra_alloc1(as, func, allow);[m
[31m-    *--as->mcp = PPCI_BCTRL;[m
[31m-    *--as->mcp = PPCI_MTCTR | PPCF_T(freg);[m
[31m-    ci.func = (ASMFunction)(void *)0;[m
[31m-  }[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-[m
[31m-/* -- Returns ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Return to lower frame. Guard that it goes to the right spot. */[m
[31m-static void asm_retf(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  void *pc = ir_kptr(IR(ir->op2));[m
[31m-  int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));[m
[31m-  as->topslot -= (BCReg)delta;[m
[31m-  if ((int32_t)as->topslot < 0) as->topslot = 0;[m
[31m-  irt_setmark(IR(REF_BASE)->t);  /* Children must not coalesce with BASE reg. */[m
[31m-  emit_setgl(as, base, jit_base);[m
[31m-  emit_addptr(as, base, -8*delta);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_ab(as, PPCI_CMPW, RID_TMP,[m
[31m-	  ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base)));[m
[31m-  emit_tai(as, PPCI_LWZ, RID_TMP, base, -8);[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-static void asm_tointg(ASMState *as, IRIns *ir, Reg left)[m
[31m-{[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg tmp = ra_scratch(as, rset_clear(allow, left));[m
[31m-  Reg fbias = ra_scratch(as, rset_clear(allow, tmp));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg hibias = ra_allock(as, 0x43300000, rset_exclude(RSET_GPR, dest));[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_fab(as, PPCI_FCMPU, 0, tmp, left);[m
[31m-  emit_fab(as, PPCI_FSUB, tmp, tmp, fbias);[m
[31m-  emit_fai(as, PPCI_LFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-  emit_tai(as, PPCI_STW, RID_TMP, RID_SP, SPOFS_TMPLO);[m
[31m-  emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI);[m
[31m-  emit_asi(as, PPCI_XORIS, RID_TMP, dest, 0x8000);[m
[31m-  emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);[m
[31m-  emit_lsptr(as, PPCI_LFS, (fbias & 31),[m
[31m-	     (void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)),[m
[31m-	     RSET_GPR);[m
[31m-  emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-  emit_fb(as, PPCI_FCTIWZ, tmp, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_tobit(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, allow);[m
[31m-  Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left));[m
[31m-  Reg tmp = ra_scratch(as, rset_clear(allow, right));[m
[31m-  emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);[m
[31m-  emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-  emit_fab(as, PPCI_FADD, tmp, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_conv(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-  int stfp = (st == IRT_NUM || st == IRT_FLOAT);[m
[31m-  IRRef lref = ir->op1;[m
[31m-  lua_assert(irt_type(ir->t) != st);[m
[31m-  lua_assert(!(irt_isint64(ir->t) ||[m
[31m-	       (st == IRT_I64 || st == IRT_U64))); /* Handled by SPLIT. */[m
[31m-  if (irt_isfp(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    if (stfp) {  /* FP to FP conversion. */[m
[31m-      if (st == IRT_NUM)  /* double -> float conversion. */[m
[31m-	emit_fb(as, PPCI_FRSP, dest, ra_alloc1(as, lref, RSET_FPR));[m
[31m-      else  /* float -> double conversion is a no-op on PPC. */[m
[31m-	ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    } else {  /* Integer to FP conversion. */[m
[31m-      /* IRT_INT: Flip hibit, bias with 2^52, subtract 2^52+2^31. */[m
[31m-      /* IRT_U32: Bias with 2^52, subtract 2^52. */[m
[31m-      RegSet allow = RSET_GPR;[m
[31m-      Reg left = ra_alloc1(as, lref, allow);[m
[31m-      Reg hibias = ra_allock(as, 0x43300000, rset_clear(allow, left));[m
[31m-      Reg fbias = ra_scratch(as, rset_exclude(RSET_FPR, dest));[m
[31m-      const float *kbias;[m
[31m-      if (irt_isfloat(ir->t)) emit_fb(as, PPCI_FRSP, dest, dest);[m
[31m-      emit_fab(as, PPCI_FSUB, dest, dest, fbias);[m
[31m-      emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP);[m
[31m-      kbias = (const float *)lj_ir_k64_find(as->J, U64x(59800004,59800000));[m
[31m-      if (st == IRT_U32) kbias++;[m
[31m-      emit_lsptr(as, PPCI_LFS, (fbias & 31), (void *)kbias,[m
[31m-		 rset_clear(allow, hibias));[m
[31m-      emit_tai(as, PPCI_STW, st == IRT_U32 ? left : RID_TMP,[m
[31m-	       RID_SP, SPOFS_TMPLO);[m
[31m-      emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI);[m
[31m-      if (st != IRT_U32) emit_asi(as, PPCI_XORIS, RID_TMP, left, 0x8000);[m
[31m-    }[m
[31m-  } else if (stfp) {  /* FP to integer conversion. */[m
[31m-    if (irt_isguard(ir->t)) {[m
[31m-      /* Checked conversions are only supported from number to int. */[m
[31m-      lua_assert(irt_isint(ir->t) && st == IRT_NUM);[m
[31m-      asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_FPR);[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-      if (irt_isu32(ir->t)) {[m
[31m-	/* Convert both x and x-2^31 to int and merge results. */[m
[31m-	Reg tmpi = ra_scratch(as, rset_exclude(RSET_GPR, dest));[m
[31m-	emit_asb(as, PPCI_OR, dest, dest, tmpi);  /* Select with mask idiom. */[m
[31m-	emit_asb(as, PPCI_AND, tmpi, tmpi, RID_TMP);[m
[31m-	emit_asb(as, PPCI_ANDC, dest, dest, RID_TMP);[m
[31m-	emit_tai(as, PPCI_LWZ, tmpi, RID_SP, SPOFS_TMPLO);  /* tmp = (int)(x) */[m
[31m-	emit_tai(as, PPCI_ADDIS, dest, dest, 0x8000);  /* dest += 2^31 */[m
[31m-	emit_asb(as, PPCI_SRAWI, RID_TMP, dest, 31);  /* mask = -(dest < 0) */[m
[31m-	emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-	emit_tai(as, PPCI_LWZ, dest,[m
[31m-		 RID_SP, SPOFS_TMPLO);  /* dest = (int)(x-2^31) */[m
[31m-	emit_fb(as, PPCI_FCTIWZ, tmp, left);[m
[31m-	emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-	emit_fb(as, PPCI_FCTIWZ, tmp, tmp);[m
[31m-	emit_fab(as, PPCI_FSUB, tmp, left, tmp);[m
[31m-	emit_lsptr(as, PPCI_LFS, (tmp & 31),[m
[31m-		   (void *)lj_ir_k64_find(as->J, U64x(4f000000,00000000)),[m
[31m-		   RSET_GPR);[m
[31m-      } else {[m
[31m-	emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);[m
[31m-	emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP);[m
[31m-	emit_fb(as, PPCI_FCTIWZ, tmp, left);[m
[31m-      }[m
[31m-    }[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */[m
[31m-      Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-      lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));[m
[31m-      if ((ir->op2 & IRCONV_SEXT))[m
[31m-	emit_as(as, st == IRT_I8 ? PPCI_EXTSB : PPCI_EXTSH, dest, left);[m
[31m-      else[m
[31m-	emit_rot(as, PPCI_RLWINM, dest, left, 0, st == IRT_U8 ? 24 : 16, 31);[m
[31m-    } else {  /* 32/64 bit integer conversions. */[m
[31m-      /* Only need to handle 32/32 bit no-op (cast) on 32 bit archs. */[m
[31m-      ra_leftov(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_strto(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];[m
[31m-  IRRef args[2];[m
[31m-  int32_t ofs;[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  if (ra_hasreg(ir->r)) rset_set(drop, ir->r);  /* Spill dest reg (if any). */[m
[31m-  ra_evictset(as, drop);[m
[31m-  asm_guardcc(as, CC_EQ);[m
[31m-  emit_ai(as, PPCI_CMPWI, RID_RET, 0);  /* Test return status. */[m
[31m-  args[0] = ir->op1;      /* GCstr *str */[m
[31m-  args[1] = ASMREF_TMP1;  /* TValue *n  */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  /* Store the result to the spill slot or temp slots. */[m
[31m-  ofs = ir->s ? sps_scale(ir->s) : SPOFS_TMP;[m
[31m-  emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_SP, ofs);[m
[31m-}[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-/* Get pointer to TValue. */[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (irref_isk(ref))  /* Use the number constant itself as a TValue. */[m
[31m-      ra_allockreg(as, i32ptr(ir_knum(ir)), dest);[m
[31m-    else  /* Otherwise force a spill and use the spill slot. */[m
[31m-      emit_tai(as, PPCI_ADDI, dest, RID_SP, ra_spill(as, ir));[m
[31m-  } else {[m
[31m-    /* Otherwise use g->tmptv to hold the TValue. */[m
[31m-    RegSet allow = rset_exclude(RSET_GPR, dest);[m
[31m-    Reg type;[m
[31m-    emit_tai(as, PPCI_ADDI, dest, RID_JGL, (int32_t)offsetof(global_State, tmptv)-32768);[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, allow);[m
[31m-      emit_setgl(as, src, tmptv.gcr);[m
[31m-    }[m
[31m-    type = ra_allock(as, irt_toitype(ir->t), allow);[m
[31m-    emit_setgl(as, type, tmptv.it);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_aref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx, base;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    IRRef tab = IR(ir->op1)->op1;[m
[31m-    int32_t ofs = asm_fuseabase(as, tab);[m
[31m-    IRRef refa = ofs ? tab : ir->op1;[m
[31m-    ofs += 8*IR(ir->op2)->i;[m
[31m-    if (checki16(ofs)) {[m
[31m-      base = ra_alloc1(as, refa, RSET_GPR);[m
[31m-      emit_tai(as, PPCI_ADDI, dest, base, ofs);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  base = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));[m
[31m-  emit_tab(as, PPCI_ADD, dest, RID_TMP, base);[m
[31m-  emit_slwi(as, RID_TMP, idx, 3);[m
[31m-}[m
[31m-[m
[31m-/* Inlined hash lookup. Specialized for key type and for const keys.[m
[31m-** The equivalent C code is:[m
[31m-**   Node *n = hashkey(t, key);[m
[31m-**   do {[m
[31m-**     if (lj_obj_equal(&n->key, key)) return &n->val;[m
[31m-**   } while ((n = nextnode(n)));[m
[31m-**   return niltv(L);[m
[31m-*/[m
[31m-static void asm_href(ASMState *as, IRIns *ir, IROp merge)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int destused = ra_used(ir);[m
[31m-  Reg dest = ra_dest(as, ir, allow);[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));[m
[31m-  Reg key = RID_NONE, tmp1 = RID_TMP, tmp2;[m
[31m-  Reg tisnum = RID_NONE, tmpnum = RID_NONE;[m
[31m-  IRRef refkey = ir->op2;[m
[31m-  IRIns *irkey = IR(refkey);[m
[31m-  IRType1 kt = irkey->t;[m
[31m-  uint32_t khash;[m
[31m-  MCLabel l_end, l_loop, l_next;[m
[31m-[m
[31m-  rset_clear(allow, tab);[m
[31m-  if (irt_isnum(kt)) {[m
[31m-    key = ra_alloc1(as, refkey, RSET_FPR);[m
[31m-    tmpnum = ra_scratch(as, rset_exclude(RSET_FPR, key));[m
[31m-    tisnum = ra_allock(as, (int32_t)LJ_TISNUM, allow);[m
[31m-    rset_clear(allow, tisnum);[m
[31m-  } else if (!irt_ispri(kt)) {[m
[31m-    key = ra_alloc1(as, refkey, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-  }[m
[31m-  tmp2 = ra_scratch(as, allow);[m
[31m-  rset_clear(allow, tmp2);[m
[31m-[m
[31m-  /* Key not found in chain: jump to exit (if merged) or load niltv. */[m
[31m-  l_end = emit_label(as);[m
[31m-  as->invmcp = NULL;[m
[31m-  if (merge == IR_NE)[m
[31m-    asm_guardcc(as, CC_EQ);[m
[31m-  else if (destused)[m
[31m-    emit_loada(as, dest, niltvg(J2G(as->J)));[m
[31m-[m
[31m-  /* Follow hash chain until the end. */[m
[31m-  l_loop = --as->mcp;[m
[31m-  emit_ai(as, PPCI_CMPWI, dest, 0);[m
[31m-  emit_tai(as, PPCI_LWZ, dest, dest, (int32_t)offsetof(Node, next));[m
[31m-  l_next = emit_label(as);[m
[31m-[m
[31m-  /* Type and value comparison. */[m
[31m-  if (merge == IR_EQ)[m
[31m-    asm_guardcc(as, CC_EQ);[m
[31m-  else[m
[31m-    emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end);[m
[31m-  if (irt_isnum(kt)) {[m
[31m-    emit_fab(as, PPCI_FCMPU, 0, tmpnum, key);[m
[31m-    emit_condbranch(as, PPCI_BC, CC_GE, l_next);[m
[31m-    emit_ab(as, PPCI_CMPLW, tmp1, tisnum);[m
[31m-    emit_fai(as, PPCI_LFD, tmpnum, dest, (int32_t)offsetof(Node, key.n));[m
[31m-  } else {[m
[31m-    if (!irt_ispri(kt)) {[m
[31m-      emit_ab(as, PPCI_CMPW, tmp2, key);[m
[31m-      emit_condbranch(as, PPCI_BC, CC_NE, l_next);[m
[31m-    }[m
[31m-    emit_ai(as, PPCI_CMPWI, tmp1, irt_toitype(irkey->t));[m
[31m-    if (!irt_ispri(kt))[m
[31m-      emit_tai(as, PPCI_LWZ, tmp2, dest, (int32_t)offsetof(Node, key.gcr));[m
[31m-  }[m
[31m-  emit_tai(as, PPCI_LWZ, tmp1, dest, (int32_t)offsetof(Node, key.it));[m
[31m-  *l_loop = PPCI_BC | PPCF_Y | PPCF_CC(CC_NE) |[m
[31m-	    (((char *)as->mcp-(char *)l_loop) & 0xffffu);[m
[31m-[m
[31m-  /* Load main position relative to tab->node into dest. */[m
[31m-  khash = irref_isk(refkey) ? ir_khash(irkey) : 1;[m
[31m-  if (khash == 0) {[m
[31m-    emit_tai(as, PPCI_LWZ, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-  } else {[m
[31m-    Reg tmphash = tmp1;[m
[31m-    if (irref_isk(refkey))[m
[31m-      tmphash = ra_allock(as, khash, allow);[m
[31m-    emit_tab(as, PPCI_ADD, dest, dest, tmp1);[m
[31m-    emit_tai(as, PPCI_MULLI, tmp1, tmp1, sizeof(Node));[m
[31m-    emit_asb(as, PPCI_AND, tmp1, tmp2, tmphash);[m
[31m-    emit_tai(as, PPCI_LWZ, dest, tab, (int32_t)offsetof(GCtab, node));[m
[31m-    emit_tai(as, PPCI_LWZ, tmp2, tab, (int32_t)offsetof(GCtab, hmask));[m
[31m-    if (irref_isk(refkey)) {[m
[31m-      /* Nothing to do. */[m
[31m-    } else if (irt_isstr(kt)) {[m
[31m-      emit_tai(as, PPCI_LWZ, tmp1, key, (int32_t)offsetof(GCstr, hash));[m
[31m-    } else {  /* Must match with hash*() in lj_tab.c. */[m
[31m-      emit_tab(as, PPCI_SUBF, tmp1, tmp2, tmp1);[m
[31m-      emit_rotlwi(as, tmp2, tmp2, HASH_ROT3);[m
[31m-      emit_asb(as, PPCI_XOR, tmp1, tmp1, tmp2);[m
[31m-      emit_rotlwi(as, tmp1, tmp1, (HASH_ROT2+HASH_ROT1)&31);[m
[31m-      emit_tab(as, PPCI_SUBF, tmp2, dest, tmp2);[m
[31m-      if (irt_isnum(kt)) {[m
[31m-	int32_t ofs = ra_spill(as, irkey);[m
[31m-	emit_asb(as, PPCI_XOR, tmp2, tmp2, tmp1);[m
[31m-	emit_rotlwi(as, dest, tmp1, HASH_ROT1);[m
[31m-	emit_tab(as, PPCI_ADD, tmp1, tmp1, tmp1);[m
[31m-	emit_tai(as, PPCI_LWZ, tmp2, RID_SP, ofs+4);[m
[31m-	emit_tai(as, PPCI_LWZ, tmp1, RID_SP, ofs);[m
[31m-      } else {[m
[31m-	emit_asb(as, PPCI_XOR, tmp2, key, tmp1);[m
[31m-	emit_rotlwi(as, dest, tmp1, HASH_ROT1);[m
[31m-	emit_tai(as, PPCI_ADDI, tmp1, tmp2, HASH_BIAS);[m
[31m-	emit_tai(as, PPCI_ADDIS, tmp2, key, (HASH_BIAS + 32768)>>16);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_hrefk(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *kslot = IR(ir->op2);[m
[31m-  IRIns *irkey = IR(kslot->op1);[m
[31m-  int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node));[m
[31m-  int32_t kofs = ofs + (int32_t)offsetof(Node, key);[m
[31m-  Reg dest = (ra_used(ir)||ofs > 32736) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;[m
[31m-  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg key = RID_NONE, type = RID_TMP, idx = node;[m
[31m-  RegSet allow = rset_exclude(RSET_GPR, node);[m
[31m-  lua_assert(ofs % sizeof(Node) == 0);[m
[31m-  if (ofs > 32736) {[m
[31m-    idx = dest;[m
[31m-    rset_clear(allow, dest);[m
[31m-    kofs = (int32_t)offsetof(Node, key);[m
[31m-  } else if (ra_hasreg(dest)) {[m
[31m-    emit_tai(as, PPCI_ADDI, dest, node, ofs);[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  if (!irt_ispri(irkey->t)) {[m
[31m-    key = ra_scratch(as, allow);[m
[31m-    rset_clear(allow, key);[m
[31m-  }[m
[31m-  rset_clear(allow, type);[m
[31m-  if (irt_isnum(irkey->t)) {[m
[31m-    emit_cmpi(as, key, (int32_t)ir_knum(irkey)->u32.lo);[m
[31m-    asm_guardcc(as, CC_NE);[m
[31m-    emit_cmpi(as, type, (int32_t)ir_knum(irkey)->u32.hi);[m
[31m-  } else {[m
[31m-    if (ra_hasreg(key)) {[m
[31m-      emit_cmpi(as, key, irkey->i);  /* May use RID_TMP, i.e. type. */[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-    }[m
[31m-    emit_ai(as, PPCI_CMPWI, type, irt_toitype(irkey->t));[m
[31m-  }[m
[31m-  if (ra_hasreg(key)) emit_tai(as, PPCI_LWZ, key, idx, kofs+4);[m
[31m-  emit_tai(as, PPCI_LWZ, type, idx, kofs);[m
[31m-  if (ofs > 32736) {[m
[31m-    emit_tai(as, PPCI_ADDIS, dest, dest, (ofs + 32768) >> 16);[m
[31m-    emit_tai(as, PPCI_ADDI, dest, node, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_uref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* NYI: Check that UREFO is still open and not aliasing a slot. */[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-    MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;[m
[31m-    emit_lsptr(as, PPCI_LWZ, dest, v, RSET_GPR);[m
[31m-  } else {[m
[31m-    Reg uv = ra_scratch(as, RSET_GPR);[m
[31m-    Reg func = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (ir->o == IR_UREFC) {[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_ai(as, PPCI_CMPWI, RID_TMP, 1);[m
[31m-      emit_tai(as, PPCI_ADDI, dest, uv, (int32_t)offsetof(GCupval, tv));[m
[31m-      emit_tai(as, PPCI_LBZ, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));[m
[31m-    } else {[m
[31m-      emit_tai(as, PPCI_LWZ, dest, uv, (int32_t)offsetof(GCupval, v));[m
[31m-    }[m
[31m-    emit_tai(as, PPCI_LWZ, uv, func,[m
[31m-	     (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(as); UNUSED(ir);[m
[31m-  lua_assert(!ra_used(ir));[m
[31m-}[m
[31m-[m
[31m-static void asm_strref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRRef ref = ir->op2, refk = ir->op1;[m
[31m-  int32_t ofs = (int32_t)sizeof(GCstr);[m
[31m-  Reg r;[m
[31m-  if (irref_isk(ref)) {[m
[31m-    IRRef tmp = refk; refk = ref; ref = tmp;[m
[31m-  } else if (!irref_isk(refk)) {[m
[31m-    Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    IRIns *irr = IR(ir->op2);[m
[31m-    if (ra_hasreg(irr->r)) {[m
[31m-      ra_noweak(as, irr->r);[m
[31m-      right = irr->r;[m
[31m-    } else if (mayfuse(as, irr->op2) &&[m
[31m-	       irr->o == IR_ADD && irref_isk(irr->op2) &&[m
[31m-	       checki16(ofs + IR(irr->op2)->i)) {[m
[31m-      ofs += IR(irr->op2)->i;[m
[31m-      right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left));[m
[31m-    } else {[m
[31m-      right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    }[m
[31m-    emit_tai(as, PPCI_ADDI, dest, dest, ofs);[m
[31m-    emit_tab(as, PPCI_ADD, dest, left, right);[m
[31m-    return;[m
[31m-  }[m
[31m-  r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-  ofs += IR(refk)->i;[m
[31m-  if (checki16(ofs))[m
[31m-    emit_tai(as, PPCI_ADDI, dest, r, ofs);[m
[31m-  else[m
[31m-    emit_tab(as, PPCI_ADD, dest, r,[m
[31m-	     ra_allock(as, ofs, rset_exclude(RSET_GPR, r)));[m
[31m-}[m
[31m-[m
[31m-/* -- Loads and stores ---------------------------------------------------- */[m
[31m-[m
[31m-static PPCIns asm_fxloadins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: return PPCI_LBZ;  /* Needs sign-extension. */[m
[31m-  case IRT_U8: return PPCI_LBZ;[m
[31m-  case IRT_I16: return PPCI_LHA;[m
[31m-  case IRT_U16: return PPCI_LHZ;[m
[31m-  case IRT_NUM: return PPCI_LFD;[m
[31m-  case IRT_FLOAT: return PPCI_LFS;[m
[31m-  default: return PPCI_LWZ;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static PPCIns asm_fxstoreins(IRIns *ir)[m
[31m-{[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: case IRT_U8: return PPCI_STB;[m
[31m-  case IRT_I16: case IRT_U16: return PPCI_STH;[m
[31m-  case IRT_NUM: return PPCI_STFD;[m
[31m-  case IRT_FLOAT: return PPCI_STFS;[m
[31m-  default: return PPCI_STW;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  PPCIns pi = asm_fxloadins(ir);[m
[31m-  int32_t ofs;[m
[31m-  if (ir->op2 == IRFL_TAB_ARRAY) {[m
[31m-    ofs = asm_fuseabase(as, ir->op1);[m
[31m-    if (ofs) {  /* Turn the t->array load into an add for colocated arrays. */[m
[31m-      emit_tai(as, PPCI_ADDI, dest, idx, ofs);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  ofs = field_ofs[ir->op2];[m
[31m-  lua_assert(!irt_isi8(ir->t));[m
[31m-  emit_tai(as, pi, dest, idx, ofs);[m
[31m-}[m
[31m-[m
[31m-static void asm_fstore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r != RID_SINK) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-    IRIns *irf = IR(ir->op1);[m
[31m-    Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src));[m
[31m-    int32_t ofs = field_ofs[irf->op2];[m
[31m-    PPCIns pi = asm_fxstoreins(ir);[m
[31m-    emit_tai(as, pi, src, idx, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_xload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);[m
[31m-  lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED));[m
[31m-  if (irt_isi8(ir->t))[m
[31m-    emit_as(as, PPCI_EXTSB, dest, dest);[m
[31m-  asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0);[m
[31m-}[m
[31m-[m
[31m-static void asm_xstore_(ASMState *as, IRIns *ir, int32_t ofs)[m
[31m-{[m
[31m-  IRIns *irb;[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  if (ofs == 0 && mayfuse(as, ir->op2) && (irb = IR(ir->op2))->o == IR_BSWAP &&[m
[31m-      ra_noreg(irb->r) && (irt_isint(ir->t) || irt_isu32(ir->t))) {[m
[31m-    /* Fuse BSWAP with XSTORE to stwbrx. */[m
[31m-    Reg src = ra_alloc1(as, irb->op1, RSET_GPR);[m
[31m-    asm_fusexrefx(as, PPCI_STWBRX, src, ir->op1, rset_exclude(RSET_GPR, src));[m
[31m-  } else {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);[m
[31m-    asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1,[m
[31m-		 rset_exclude(RSET_GPR, src), ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_xstore(as, ir)	asm_xstore_(as, ir, 0)[m
[31m-[m
[31m-static void asm_ahuvload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType1 t = ir->t;[m
[31m-  Reg dest = RID_NONE, type = RID_TMP, tmp = RID_TMP, idx;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int32_t ofs = AHUREF_LSX;[m
[31m-  if (ra_used(ir)) {[m
[31m-    lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t));[m
[31m-    if (!irt_isnum(t)) ofs = 0;[m
[31m-    dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : RSET_GPR);[m
[31m-    rset_clear(allow, dest);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);[m
[31m-  if (irt_isnum(t)) {[m
[31m-    Reg tisnum = ra_allock(as, (int32_t)LJ_TISNUM, rset_exclude(allow, idx));[m
[31m-    asm_guardcc(as, CC_GE);[m
[31m-    emit_ab(as, PPCI_CMPLW, type, tisnum);[m
[31m-    if (ra_hasreg(dest)) {[m
[31m-      if (ofs == AHUREF_LSX) {[m
[31m-	tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR,[m
[31m-						       (idx&255)), (idx>>8)));[m
[31m-	emit_fab(as, PPCI_LFDX, dest, (idx&255), tmp);[m
[31m-      } else {[m
[31m-	emit_fai(as, PPCI_LFD, dest, idx, ofs);[m
[31m-      }[m
[31m-    }[m
[31m-  } else {[m
[31m-    asm_guardcc(as, CC_NE);[m
[31m-    emit_ai(as, PPCI_CMPWI, type, irt_toitype(t));[m
[31m-    if (ra_hasreg(dest)) emit_tai(as, PPCI_LWZ, dest, idx, ofs+4);[m
[31m-  }[m
[31m-  if (ofs == AHUREF_LSX) {[m
[31m-    emit_tab(as, PPCI_LWZX, type, (idx&255), tmp);[m
[31m-    emit_slwi(as, tmp, (idx>>8), 3);[m
[31m-  } else {[m
[31m-    emit_tai(as, PPCI_LWZ, type, idx, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_ahustore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg idx, src = RID_NONE, type = RID_NONE;[m
[31m-  int32_t ofs = AHUREF_LSX;[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    src = ra_alloc1(as, ir->op2, RSET_FPR);[m
[31m-  } else {[m
[31m-    if (!irt_ispri(ir->t)) {[m
[31m-      src = ra_alloc1(as, ir->op2, allow);[m
[31m-      rset_clear(allow, src);[m
[31m-      ofs = 0;[m
[31m-    }[m
[31m-    type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-    rset_clear(allow, type);[m
[31m-  }[m
[31m-  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (ofs == AHUREF_LSX) {[m
[31m-      emit_fab(as, PPCI_STFDX, src, (idx&255), RID_TMP);[m
[31m-      emit_slwi(as, RID_TMP, (idx>>8), 3);[m
[31m-    } else {[m
[31m-      emit_fai(as, PPCI_STFD, src, idx, ofs);[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (ra_hasreg(src))[m
[31m-      emit_tai(as, PPCI_STW, src, idx, ofs+4);[m
[31m-    if (ofs == AHUREF_LSX) {[m
[31m-      emit_tab(as, PPCI_STWX, type, (idx&255), RID_TMP);[m
[31m-      emit_slwi(as, RID_TMP, (idx>>8), 3);[m
[31m-    } else {[m
[31m-      emit_tai(as, PPCI_STW, type, idx, ofs);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 0 : 4);[m
[31m-  IRType1 t = ir->t;[m
[31m-  Reg dest = RID_NONE, type = RID_NONE, base;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */[m
[31m-  lua_assert(irt_isguard(t) || !(ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-  lua_assert(LJ_DUALNUM ||[m
[31m-	     !irt_isint(t) || (ir->op2 & (IRSLOAD_CONVERT|IRSLOAD_FRAME)));[m
[31m-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) {[m
[31m-    dest = ra_scratch(as, RSET_FPR);[m
[31m-    asm_tointg(as, ir, dest);[m
[31m-    t.irt = IRT_NUM;  /* Continue with a regular number type check. */[m
[31m-  } else if (ra_used(ir)) {[m
[31m-    lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t));[m
[31m-    dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : RSET_GPR);[m
[31m-    rset_clear(allow, dest);[m
[31m-    base = ra_alloc1(as, REF_BASE, allow);[m
[31m-    rset_clear(allow, base);[m
[31m-    if ((ir->op2 & IRSLOAD_CONVERT)) {[m
[31m-      if (irt_isint(t)) {[m
[31m-	emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO);[m
[31m-	dest = ra_scratch(as, RSET_FPR);[m
[31m-	emit_fai(as, PPCI_STFD, dest, RID_SP, SPOFS_TMP);[m
[31m-	emit_fb(as, PPCI_FCTIWZ, dest, dest);[m
[31m-	t.irt = IRT_NUM;  /* Check for original type. */[m
[31m-      } else {[m
[31m-	Reg tmp = ra_scratch(as, allow);[m
[31m-	Reg hibias = ra_allock(as, 0x43300000, rset_clear(allow, tmp));[m
[31m-	Reg fbias = ra_scratch(as, rset_exclude(RSET_FPR, dest));[m
[31m-	emit_fab(as, PPCI_FSUB, dest, dest, fbias);[m
[31m-	emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP);[m
[31m-	emit_lsptr(as, PPCI_LFS, (fbias & 31),[m
[31m-		   (void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)),[m
[31m-		   rset_clear(allow, hibias));[m
[31m-	emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPLO);[m
[31m-	emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI);[m
[31m-	emit_asi(as, PPCI_XORIS, tmp, tmp, 0x8000);[m
[31m-	dest = tmp;[m
[31m-	t.irt = IRT_INT;  /* Check for original type. */[m
[31m-      }[m
[31m-    }[m
[31m-    goto dotypecheck;[m
[31m-  }[m
[31m-  base = ra_alloc1(as, REF_BASE, allow);[m
[31m-  rset_clear(allow, base);[m
[31m-dotypecheck:[m
[31m-  if (irt_isnum(t)) {[m
[31m-    if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-      Reg tisnum = ra_allock(as, (int32_t)LJ_TISNUM, allow);[m
[31m-      asm_guardcc(as, CC_GE);[m
[31m-      emit_ab(as, PPCI_CMPLW, RID_TMP, tisnum);[m
[31m-      type = RID_TMP;[m
[31m-    }[m
[31m-    if (ra_hasreg(dest)) emit_fai(as, PPCI_LFD, dest, base, ofs-4);[m
[31m-  } else {[m
[31m-    if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_ai(as, PPCI_CMPWI, RID_TMP, irt_toitype(t));[m
[31m-      type = RID_TMP;[m
[31m-    }[m
[31m-    if (ra_hasreg(dest)) emit_tai(as, PPCI_LWZ, dest, base, ofs);[m
[31m-  }[m
[31m-  if (ra_hasreg(type)) emit_tai(as, PPCI_LWZ, type, base, ofs-4);[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_cnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(as->J));[m
[31m-  CTypeID id = (CTypeID)IR(ir->op1)->i;[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco];[m
[31m-  IRRef args[4];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL));[m
[31m-[m
[31m-  as->gcsteps++;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  if (ra_used(ir))[m
[31m-    ra_destreg(as, ir, RID_RET);  /* GCcdata * */[m
[31m-[m
[31m-  /* Initialize immutable cdata object. */[m
[31m-  if (ir->o == IR_CNEWI) {[m
[31m-    RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-    int32_t ofs = sizeof(GCcdata);[m
[31m-    lua_assert(sz == 4 || sz == 8);[m
[31m-    if (sz == 8) {[m
[31m-      ofs += 4;[m
[31m-      lua_assert((ir+1)->o == IR_HIOP);[m
[31m-    }[m
[31m-    for (;;) {[m
[31m-      Reg r = ra_alloc1(as, ir->op2, allow);[m
[31m-      emit_tai(as, PPCI_STW, r, RID_RET, ofs);[m
[31m-      rset_clear(allow, r);[m
[31m-      if (ofs == sizeof(GCcdata)) break;[m
[31m-      ofs -= 4; ir++;[m
[31m-    }[m
[31m-  } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];[m
[31m-    args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-    args[1] = ir->op1;      /* CTypeID id   */[m
[31m-    args[2] = ir->op2;      /* CTSize sz    */[m
[31m-    args[3] = ASMREF_TMP1;  /* CTSize align */[m
[31m-    asm_gencall(as, ci, args);[m
[31m-    emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)ctype_align(info));[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */[m
[31m-  emit_tai(as, PPCI_STB, RID_RET+1, RID_RET, offsetof(GCcdata, gct));[m
[31m-  emit_tai(as, PPCI_STH, RID_TMP, RID_RET, offsetof(GCcdata, ctypeid));[m
[31m-  emit_ti(as, PPCI_LI, RID_RET+1, ~LJ_TCDATA);[m
[31m-  emit_ti(as, PPCI_LI, RID_TMP, id);  /* Lower 16 bit used. Sign-ext ok. */[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ASMREF_TMP1;  /* MSize size   */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)),[m
[31m-	       ra_releasetmp(as, ASMREF_TMP1));[m
[31m-}[m
[31m-#else[m
[31m-#define asm_cnew(as, ir)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-static void asm_tbar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg mark = ra_scratch(as, rset_exclude(RSET_GPR, tab));[m
[31m-  Reg link = RID_TMP;[m
[31m-  MCLabel l_end = emit_label(as);[m
[31m-  emit_tai(as, PPCI_STW, link, tab, (int32_t)offsetof(GCtab, gclist));[m
[31m-  emit_tai(as, PPCI_STB, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-  emit_setgl(as, tab, gc.grayagain);[m
[31m-  lua_assert(LJ_GC_BLACK == 0x04);[m
[31m-  emit_rot(as, PPCI_RLWINM, mark, mark, 0, 30, 28);  /* Clear black bit. */[m
[31m-  emit_getgl(as, link, gc.grayagain);[m
[31m-  emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end);[m
[31m-  emit_asi(as, PPCI_ANDIDOT, RID_TMP, mark, LJ_GC_BLACK);[m
[31m-  emit_tai(as, PPCI_LBZ, mark, tab, (int32_t)offsetof(GCtab, marked));[m
[31m-}[m
[31m-[m
[31m-static void asm_obar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg obj, val, tmp;[m
[31m-  /* No need for other object barriers (yet). */[m
[31m-  lua_assert(IR(ir->op1)->o == IR_UREFC);[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ir->op1;      /* TValue *tv      */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);[m
[31m-  obj = IR(ir->op1)->r;[m
[31m-  tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end);[m
[31m-  emit_asi(as, PPCI_ANDIDOT, tmp, tmp, LJ_GC_BLACK);[m
[31m-  emit_condbranch(as, PPCI_BC, CC_EQ, l_end);[m
[31m-  emit_asi(as, PPCI_ANDIDOT, RID_TMP, RID_TMP, LJ_GC_WHITES);[m
[31m-  val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj));[m
[31m-  emit_tai(as, PPCI_LBZ, tmp, obj,[m
[31m-	   (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));[m
[31m-  emit_tai(as, PPCI_LBZ, RID_TMP, val, (int32_t)offsetof(GChead, marked));[m
[31m-}[m
[31m-[m
[31m-/* -- Arithmetic and logic operations ------------------------------------- */[m
[31m-[m
[31m-static void asm_fparith(ASMState *as, IRIns *ir, PPCIns pi)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  if (pi == PPCI_FMUL)[m
[31m-    emit_fac(as, pi, dest, left, right);[m
[31m-  else[m
[31m-    emit_fab(as, pi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_fpunary(ASMState *as, IRIns *ir, PPCIns pi)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR);[m
[31m-  emit_fb(as, pi, dest, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_fpmath(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir))[m
[31m-    return;[m
[31m-  if (ir->op2 == IRFPM_SQRT && (as->flags & JIT_F_SQRT))[m
[31m-    asm_fpunary(as, ir, PPCI_FSQRT);[m
[31m-  else[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-}[m
[31m-[m
[31m-static void asm_add(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (!asm_fusemadd(as, ir, PPCI_FMADD, PPCI_FMADD))[m
[31m-      asm_fparith(as, ir, PPCI_FADD);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    PPCIns pi;[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      int32_t k = IR(ir->op2)->i;[m
[31m-      if (checki16(k)) {[m
[31m-	pi = PPCI_ADDI;[m
[31m-	/* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-	if (as->flagmcp == as->mcp) {[m
[31m-	  as->flagmcp = NULL;[m
[31m-	  as->mcp++;[m
[31m-	  pi = PPCI_ADDICDOT;[m
[31m-	}[m
[31m-	emit_tai(as, pi, dest, left, k);[m
[31m-	return;[m
[31m-      } else if ((k & 0xffff) == 0) {[m
[31m-	emit_tai(as, PPCI_ADDIS, dest, left, (k >> 16));[m
[31m-	return;[m
[31m-      } else if (!as->sectref) {[m
[31m-	emit_tai(as, PPCI_ADDIS, dest, dest, (k + 32768) >> 16);[m
[31m-	emit_tai(as, PPCI_ADDI, dest, left, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    pi = PPCI_ADD;[m
[31m-    /* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-    if (as->flagmcp == as->mcp) {[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp++;[m
[31m-      pi |= PPCF_DOT;[m
[31m-    }[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_tab(as, pi, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sub(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    if (!asm_fusemadd(as, ir, PPCI_FMSUB, PPCI_FNMSUB))[m
[31m-      asm_fparith(as, ir, PPCI_FSUB);[m
[31m-  } else {[m
[31m-    PPCIns pi = PPCI_SUBF;[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg left, right;[m
[31m-    if (irref_isk(ir->op1)) {[m
[31m-      int32_t k = IR(ir->op1)->i;[m
[31m-      if (checki16(k)) {[m
[31m-	right = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-	emit_tai(as, PPCI_SUBFIC, dest, right, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    /* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-    if (as->flagmcp == as->mcp) {[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp++;[m
[31m-      pi |= PPCF_DOT;[m
[31m-    }[m
[31m-    left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_tab(as, pi, dest, right, left);  /* Subtract right _from_ left. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_mul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fparith(as, ir, PPCI_FMUL);[m
[31m-  } else {[m
[31m-    PPCIns pi = PPCI_MULLW;[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      int32_t k = IR(ir->op2)->i;[m
[31m-      if (checki16(k)) {[m
[31m-	emit_tai(as, PPCI_MULLI, dest, left, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    /* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-    if (as->flagmcp == as->mcp) {[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp++;[m
[31m-      pi |= PPCF_DOT;[m
[31m-    }[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_tab(as, pi, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_div(as, ir)		asm_fparith(as, ir, PPCI_FDIV)[m
[31m-#define asm_mod(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_modi)[m
[31m-#define asm_pow(as, ir)		asm_callid(as, ir, IRCALL_lj_vm_powi)[m
[31m-[m
[31m-static void asm_neg(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    asm_fpunary(as, ir, PPCI_FNEG);[m
[31m-  } else {[m
[31m-    Reg dest, left;[m
[31m-    PPCIns pi = PPCI_NEG;[m
[31m-    if (as->flagmcp == as->mcp) {[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp++;[m
[31m-      pi |= PPCF_DOT;[m
[31m-    }[m
[31m-    dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-    emit_tab(as, pi, dest, left, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_abs(as, ir)		asm_fpunary(as, ir, PPCI_FABS)[m
[31m-#define asm_atan2(as, ir)	asm_callid(as, ir, IRCALL_atan2)[m
[31m-#define asm_ldexp(as, ir)	asm_callid(as, ir, IRCALL_ldexp)[m
[31m-[m
[31m-static void asm_arithov(ASMState *as, IRIns *ir, PPCIns pi)[m
[31m-{[m
[31m-  Reg dest, left, right;[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_SO);[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-  right = (left >> 8); left &= 255;[m
[31m-  if (pi == PPCI_SUBFO) { Reg tmp = left; left = right; right = tmp; }[m
[31m-  emit_tab(as, pi|PPCF_DOT, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-#define asm_addov(as, ir)	asm_arithov(as, ir, PPCI_ADDO)[m
[31m-#define asm_subov(as, ir)	asm_arithov(as, ir, PPCI_SUBFO)[m
[31m-#define asm_mulov(as, ir)	asm_arithov(as, ir, PPCI_MULLWO)[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_add64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  PPCIns pi = PPCI_ADDE;[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (k == 0)[m
[31m-      pi = PPCI_ADDZE;[m
[31m-    else if (k == -1)[m
[31m-      pi = PPCI_ADDME;[m
[31m-    else[m
[31m-      goto needright;[m
[31m-    right = 0;[m
[31m-  } else {[m
[31m-  needright:[m
[31m-    right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  }[m
[31m-  emit_tab(as, pi, dest, left, right);[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (checki16(k)) {[m
[31m-      emit_tai(as, PPCI_ADDIC, dest, left, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_tab(as, PPCI_ADDC, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_sub64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left, right = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-  PPCIns pi = PPCI_SUBFE;[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    int32_t k = IR(ir->op1)->i;[m
[31m-    if (k == 0)[m
[31m-      pi = PPCI_SUBFZE;[m
[31m-    else if (k == -1)[m
[31m-      pi = PPCI_SUBFME;[m
[31m-    else[m
[31m-      goto needleft;[m
[31m-    left = 0;[m
[31m-  } else {[m
[31m-  needleft:[m
[31m-    left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, right));[m
[31m-  }[m
[31m-  emit_tab(as, pi, dest, right, left);  /* Subtract right _from_ left. */[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  right = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    int32_t k = IR(ir->op1)->i;[m
[31m-    if (checki16(k)) {[m
[31m-      emit_tai(as, PPCI_SUBFIC, dest, right, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, right));[m
[31m-  emit_tab(as, PPCI_SUBFC, dest, right, left);[m
[31m-}[m
[31m-[m
[31m-static void asm_neg64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  emit_tab(as, PPCI_SUBFZE, dest, left, 0);[m
[31m-  ir--;[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  emit_tai(as, PPCI_SUBFIC, dest, left, 0);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_bnot(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest, left, right;[m
[31m-  PPCIns pi = PPCI_NOR;[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    pi |= PPCF_DOT;[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (mayfuse(as, ir->op1)) {[m
[31m-    IRIns *irl = IR(ir->op1);[m
[31m-    if (irl->o == IR_BAND)[m
[31m-      pi ^= (PPCI_NOR ^ PPCI_NAND);[m
[31m-    else if (irl->o == IR_BXOR)[m
[31m-      pi ^= (PPCI_NOR ^ PPCI_EQV);[m
[31m-    else if (irl->o != IR_BOR)[m
[31m-      goto nofuse;[m
[31m-    left = ra_hintalloc(as, irl->op1, dest, RSET_GPR);[m
[31m-    right = ra_alloc1(as, irl->op2, rset_exclude(RSET_GPR, left));[m
[31m-  } else {[m
[31m-nofuse:[m
[31m-    left = right = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  }[m
[31m-  emit_asb(as, pi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_bswap(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRIns *irx;[m
[31m-  if (mayfuse(as, ir->op1) && (irx = IR(ir->op1))->o == IR_XLOAD &&[m
[31m-      ra_noreg(irx->r) && (irt_isint(irx->t) || irt_isu32(irx->t))) {[m
[31m-    /* Fuse BSWAP with XLOAD to lwbrx. */[m
[31m-    asm_fusexrefx(as, PPCI_LWBRX, dest, irx->op1, RSET_GPR);[m
[31m-  } else {[m
[31m-    Reg left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    Reg tmp = dest;[m
[31m-    if (tmp == left) {[m
[31m-      tmp = RID_TMP;[m
[31m-      emit_mr(as, dest, RID_TMP);[m
[31m-    }[m
[31m-    emit_rot(as, PPCI_RLWIMI, tmp, left, 24, 16, 23);[m
[31m-    emit_rot(as, PPCI_RLWIMI, tmp, left, 24, 0, 7);[m
[31m-    emit_rotlwi(as, tmp, left, 8);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fuse BAND with contiguous bitmask and a shift to rlwinm. */[m
[31m-static void asm_fuseandsh(ASMState *as, PPCIns pi, int32_t mask, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  Reg left;[m
[31m-  if (mayfuse(as, ref) && (ir = IR(ref), ra_noreg(ir->r)) &&[m
[31m-      irref_isk(ir->op2) && ir->o >= IR_BSHL && ir->o <= IR_BROR) {[m
[31m-    int32_t sh = (IR(ir->op2)->i & 31);[m
[31m-    switch (ir->o) {[m
[31m-    case IR_BSHL:[m
[31m-      if ((mask & ((1u<<sh)-1))) goto nofuse;[m
[31m-      break;[m
[31m-    case IR_BSHR:[m
[31m-      if ((mask & ~((~0u)>>sh))) goto nofuse;[m
[31m-      sh = ((32-sh)&31);[m
[31m-      break;[m
[31m-    case IR_BROL:[m
[31m-      break;[m
[31m-    default:[m
[31m-      goto nofuse;[m
[31m-    }[m
[31m-    left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    *--as->mcp = pi | PPCF_T(left) | PPCF_B(sh);[m
[31m-    return;[m
[31m-  }[m
[31m-nofuse:[m
[31m-  left = ra_alloc1(as, ref, RSET_GPR);[m
[31m-  *--as->mcp = pi | PPCF_T(left);[m
[31m-}[m
[31m-[m
[31m-static void asm_band(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest, left, right;[m
[31m-  IRRef lref = ir->op1;[m
[31m-  PPCIns dot = 0;[m
[31m-  IRRef op2;[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    dot = PPCF_DOT;[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    if (k) {[m
[31m-      /* First check for a contiguous bitmask as used by rlwinm. */[m
[31m-      uint32_t s1 = lj_ffs((uint32_t)k);[m
[31m-      uint32_t k1 = ((uint32_t)k >> s1);[m
[31m-      if ((k1 & (k1+1)) == 0) {[m
[31m-	asm_fuseandsh(as, PPCI_RLWINM|dot | PPCF_A(dest) |[m
[31m-			  PPCF_MB(31-lj_fls((uint32_t)k)) | PPCF_ME(31-s1),[m
[31m-			  k, lref);[m
[31m-	return;[m
[31m-      }[m
[31m-      if (~(uint32_t)k) {[m
[31m-	uint32_t s2 = lj_ffs(~(uint32_t)k);[m
[31m-	uint32_t k2 = (~(uint32_t)k >> s2);[m
[31m-	if ((k2 & (k2+1)) == 0) {[m
[31m-	  asm_fuseandsh(as, PPCI_RLWINM|dot | PPCF_A(dest) |[m
[31m-			    PPCF_MB(32-s2) | PPCF_ME(30-lj_fls(~(uint32_t)k)),[m
[31m-			    k, lref);[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    if (checku16(k)) {[m
[31m-      left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      emit_asi(as, PPCI_ANDIDOT, dest, left, k);[m
[31m-      return;[m
[31m-    } else if ((k & 0xffff) == 0) {[m
[31m-      left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      emit_asi(as, PPCI_ANDISDOT, dest, left, (k >> 16));[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  op2 = ir->op2;[m
[31m-  if (mayfuse(as, op2) && IR(op2)->o == IR_BNOT && ra_noreg(IR(op2)->r)) {[m
[31m-    dot ^= (PPCI_AND ^ PPCI_ANDC);[m
[31m-    op2 = IR(op2)->op1;[m
[31m-  }[m
[31m-  left = ra_hintalloc(as, lref, dest, RSET_GPR);[m
[31m-  right = ra_alloc1(as, op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_asb(as, PPCI_AND ^ dot, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_bitop(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pik)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    int32_t k = IR(ir->op2)->i;[m
[31m-    Reg tmp = left;[m
[31m-    if ((checku16(k) || (k & 0xffff) == 0) || (tmp = dest, !as->sectref)) {[m
[31m-      if (!checku16(k)) {[m
[31m-	emit_asi(as, pik ^ (PPCI_ORI ^ PPCI_ORIS), dest, tmp, (k >> 16));[m
[31m-	if ((k & 0xffff) == 0) return;[m
[31m-      }[m
[31m-      emit_asi(as, pik, dest, left, k);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  /* May fail due to spills/restores above, but simplifies the logic. */[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    pi |= PPCF_DOT;[m
[31m-  }[m
[31m-  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-  emit_asb(as, pi, dest, left, right);[m
[31m-}[m
[31m-[m
[31m-#define asm_bor(as, ir)		asm_bitop(as, ir, PPCI_OR, PPCI_ORI)[m
[31m-#define asm_bxor(as, ir)	asm_bitop(as, ir, PPCI_XOR, PPCI_XORI)[m
[31m-[m
[31m-static void asm_bitshift(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pik)[m
[31m-{[m
[31m-  Reg dest, left;[m
[31m-  Reg dot = 0;[m
[31m-  if (as->flagmcp == as->mcp) {[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->mcp++;[m
[31m-    dot = PPCF_DOT;[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  left = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  if (irref_isk(ir->op2)) {  /* Constant shifts. */[m
[31m-    int32_t shift = (IR(ir->op2)->i & 31);[m
[31m-    if (pik == 0)  /* SLWI */[m
[31m-      emit_rot(as, PPCI_RLWINM|dot, dest, left, shift, 0, 31-shift);[m
[31m-    else if (pik == 1)  /* SRWI */[m
[31m-      emit_rot(as, PPCI_RLWINM|dot, dest, left, (32-shift)&31, shift, 31);[m
[31m-    else[m
[31m-      emit_asb(as, pik|dot, dest, left, shift);[m
[31m-  } else {[m
[31m-    Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));[m
[31m-    emit_asb(as, pi|dot, dest, left, right);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_bshl(as, ir)	asm_bitshift(as, ir, PPCI_SLW, 0)[m
[31m-#define asm_bshr(as, ir)	asm_bitshift(as, ir, PPCI_SRW, 1)[m
[31m-#define asm_bsar(as, ir)	asm_bitshift(as, ir, PPCI_SRAW, PPCI_SRAWI)[m
[31m-#define asm_brol(as, ir) \[m
[31m-  asm_bitshift(as, ir, PPCI_RLWNM|PPCF_MB(0)|PPCF_ME(31), \[m
[31m-		       PPCI_RLWINM|PPCF_MB(0)|PPCF_ME(31))[m
[31m-#define asm_bror(as, ir)	lua_assert(0)[m
[31m-[m
[31m-static void asm_min_max(ASMState *as, IRIns *ir, int ismax)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg tmp = dest;[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    if (tmp == left || tmp == right)[m
[31m-      tmp = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_FPR,[m
[31m-					dest), left), right));[m
[31m-    emit_facb(as, PPCI_FSEL, dest, tmp,[m
[31m-	      ismax ? left : right, ismax ? right : left);[m
[31m-    emit_fab(as, PPCI_FSUB, tmp, left, right);[m
[31m-  } else {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    Reg tmp1 = RID_TMP, tmp2 = dest;[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_GPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    if (tmp2 == left || tmp2 == right)[m
[31m-      tmp2 = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_GPR,[m
[31m-					 dest), left), right));[m
[31m-    emit_tab(as, PPCI_ADD, dest, tmp2, right);[m
[31m-    emit_asb(as, ismax ? PPCI_ANDC : PPCI_AND, tmp2, tmp2, tmp1);[m
[31m-    emit_tab(as, PPCI_SUBFE, tmp1, tmp1, tmp1);[m
[31m-    emit_tab(as, PPCI_SUBFC, tmp2, tmp2, tmp1);[m
[31m-    emit_asi(as, PPCI_XORIS, tmp2, right, 0x8000);[m
[31m-    emit_asi(as, PPCI_XORIS, tmp1, left, 0x8000);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_min(as, ir)		asm_min_max(as, ir, 0)[m
[31m-#define asm_max(as, ir)		asm_min_max(as, ir, 1)[m
[31m-[m
[31m-/* -- Comparisons --------------------------------------------------------- */[m
[31m-[m
[31m-#define CC_UNSIGNED	0x08	/* Unsigned integer comparison. */[m
[31m-#define CC_TWO		0x80	/* Check two flags for FP comparison. */[m
[31m-[m
[31m-/* Map of comparisons to flags. ORDER IR. */[m
[31m-static const uint8_t asm_compmap[IR_ABC+1] = {[m
[31m-  /* op     int cc                 FP cc */[m
[31m-  /* LT  */ CC_GE               + (CC_GE<<4),[m
[31m-  /* GE  */ CC_LT               + (CC_LE<<4) + CC_TWO,[m
[31m-  /* LE  */ CC_GT               + (CC_GE<<4) + CC_TWO,[m
[31m-  /* GT  */ CC_LE               + (CC_LE<<4),[m
[31m-  /* ULT */ CC_GE + CC_UNSIGNED + (CC_GT<<4) + CC_TWO,[m
[31m-  /* UGE */ CC_LT + CC_UNSIGNED + (CC_LT<<4),[m
[31m-  /* ULE */ CC_GT + CC_UNSIGNED + (CC_GT<<4),[m
[31m-  /* UGT */ CC_LE + CC_UNSIGNED + (CC_LT<<4) + CC_TWO,[m
[31m-  /* EQ  */ CC_NE               + (CC_NE<<4),[m
[31m-  /* NE  */ CC_EQ               + (CC_EQ<<4),[m
[31m-  /* ABC */ CC_LE + CC_UNSIGNED + (CC_LT<<4) + CC_TWO  /* Same as UGT. */[m
[31m-};[m
[31m-[m
[31m-static void asm_intcomp_(ASMState *as, IRRef lref, IRRef rref, Reg cr, PPCCC cc)[m
[31m-{[m
[31m-  Reg right, left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-  if (irref_isk(rref)) {[m
[31m-    int32_t k = IR(rref)->i;[m
[31m-    if ((cc & CC_UNSIGNED) == 0) {  /* Signed comparison with constant. */[m
[31m-      if (checki16(k)) {[m
[31m-	emit_tai(as, PPCI_CMPWI, cr, left, k);[m
[31m-	/* Signed comparison with zero and referencing previous ins? */[m
[31m-	if (k == 0 && lref == as->curins-1)[m
[31m-	  as->flagmcp = as->mcp;  /* Allow elimination of the compare. */[m
[31m-	return;[m
[31m-      } else if ((cc & 3) == (CC_EQ & 3)) {  /* Use CMPLWI for EQ or NE. */[m
[31m-	if (checku16(k)) {[m
[31m-	  emit_tai(as, PPCI_CMPLWI, cr, left, k);[m
[31m-	  return;[m
[31m-	} else if (!as->sectref && ra_noreg(IR(rref)->r)) {[m
[31m-	  emit_tai(as, PPCI_CMPLWI, cr, RID_TMP, k);[m
[31m-	  emit_asi(as, PPCI_XORIS, RID_TMP, left, (k >> 16));[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {  /* Unsigned comparison with constant. */[m
[31m-      if (checku16(k)) {[m
[31m-	emit_tai(as, PPCI_CMPLWI, cr, left, k);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  right = ra_alloc1(as, rref, rset_exclude(RSET_GPR, left));[m
[31m-  emit_tab(as, (cc & CC_UNSIGNED) ? PPCI_CMPLW : PPCI_CMPW, cr, left, right);[m
[31m-}[m
[31m-[m
[31m-static void asm_comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  PPCCC cc = asm_compmap[ir->o];[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    Reg right, left = ra_alloc2(as, ir, RSET_FPR);[m
[31m-    right = (left >> 8); left &= 255;[m
[31m-    asm_guardcc(as, (cc >> 4));[m
[31m-    if ((cc & CC_TWO))[m
[31m-      emit_tab(as, PPCI_CROR, ((cc>>4)&3), ((cc>>4)&3), (CC_EQ&3));[m
[31m-    emit_fab(as, PPCI_FCMPU, 0, left, right);[m
[31m-  } else {[m
[31m-    IRRef lref = ir->op1, rref = ir->op2;[m
[31m-    if (irref_isk(lref) && !irref_isk(rref)) {[m
[31m-      /* Swap constants to the right (only for ABC). */[m
[31m-      IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-      if ((cc & 2) == 0) cc ^= 1;  /* LT <-> GT, LE <-> GE */[m
[31m-    }[m
[31m-    asm_guardcc(as, cc);[m
[31m-    asm_intcomp_(as, lref, rref, 0, cc);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_equal(as, ir)	asm_comp(as, ir)[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* 64 bit integer comparisons. */[m
[31m-static void asm_comp64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  PPCCC cc = asm_compmap[(ir-1)->o];[m
[31m-  if ((cc&3) == (CC_EQ&3)) {[m
[31m-    asm_guardcc(as, cc);[m
[31m-    emit_tab(as, (cc&4) ? PPCI_CRAND : PPCI_CROR,[m
[31m-	     (CC_EQ&3), (CC_EQ&3), 4+(CC_EQ&3));[m
[31m-  } else {[m
[31m-    asm_guardcc(as, CC_EQ);[m
[31m-    emit_tab(as, PPCI_CROR, (CC_EQ&3), (CC_EQ&3), ((cc^~(cc>>2))&1));[m
[31m-    emit_tab(as, (cc&4) ? PPCI_CRAND : PPCI_CRANDC,[m
[31m-	     (CC_EQ&3), (CC_EQ&3), 4+(cc&3));[m
[31m-  }[m
[31m-  /* Loword comparison sets cr1 and is unsigned, except for equality. */[m
[31m-  asm_intcomp_(as, (ir-1)->op1, (ir-1)->op2, 4,[m
[31m-	       cc | ((cc&3) == (CC_EQ&3) ? 0 : CC_UNSIGNED));[m
[31m-  /* Hiword comparison sets cr0. */[m
[31m-  asm_intcomp_(as, ir->op1, ir->op2, 0, cc);[m
[31m-  as->flagmcp = NULL;  /* Doesn't work here. */[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */[m
[31m-[m
[31m-/* Hiword op of a split 64 bit op. Previous op must be the loword op. */[m
[31m-static void asm_hiop(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  /* HIOP is marked as a store because it needs its own DCE logic. */[m
[31m-  int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */[m
[31m-  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;[m
[31m-  if ((ir-1)->o == IR_CONV) {  /* Conversions to/from 64 bit. */[m
[31m-    as->curins--;  /* Always skip the CONV. */[m
[31m-    if (usehi || uselo)[m
[31m-      asm_conv64(as, ir);[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o <= IR_NE) {  /* 64 bit integer comparisons. ORDER IR. */[m
[31m-    as->curins--;  /* Always skip the loword comparison. */[m
[31m-    asm_comp64(as, ir);[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o == IR_XSTORE) {[m
[31m-    as->curins--;  /* Handle both stores here. */[m
[31m-    if ((ir-1)->r != RID_SINK) {[m
[31m-      asm_xstore_(as, ir, 0);[m
[31m-      asm_xstore_(as, ir-1, 4);[m
[31m-    }[m
[31m-    return;[m
[31m-  }[m
[31m-  if (!usehi) return;  /* Skip unused hiword op for all remaining ops. */[m
[31m-  switch ((ir-1)->o) {[m
[31m-  case IR_ADD: as->curins--; asm_add64(as, ir); break;[m
[31m-  case IR_SUB: as->curins--; asm_sub64(as, ir); break;[m
[31m-  case IR_NEG: as->curins--; asm_neg64(as, ir); break;[m
[31m-  case IR_CALLN:[m
[31m-  case IR_CALLXS:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RID2RSET(RID_RETLO));  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-  case IR_CNEWI:[m
[31m-    /* Nothing to do here. Handled by lo op itself. */[m
[31m-    break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(as); UNUSED(ir); lua_assert(0);  /* Unused without FFI. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_prof(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_asi(as, PPCI_ANDIDOT, RID_TMP, RID_TMP, HOOK_PROFILE);[m
[31m-  emit_lsglptr(as, PPCI_LBZ, RID_TMP,[m
[31m-	       (int32_t)offsetof(global_State, hookmask));[m
[31m-}[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check Lua stack size for overflow. Use exit handler as fallback. */[m
[31m-static void asm_stack_check(ASMState *as, BCReg topslot,[m
[31m-			    IRIns *irp, RegSet allow, ExitNo exitno)[m
[31m-{[m
[31m-  /* Try to get an unused temp. register, otherwise spill/restore RID_RET*. */[m
[31m-  Reg tmp, pbase = irp ? (ra_hasreg(irp->r) ? irp->r : RID_TMP) : RID_BASE;[m
[31m-  rset_clear(allow, pbase);[m
[31m-  tmp = allow ? rset_pickbot(allow) :[m
[31m-		(pbase == RID_RETHI ? RID_RETLO : RID_RETHI);[m
[31m-  emit_condbranch(as, PPCI_BC, CC_LT, asm_exitstub_addr(as, exitno));[m
[31m-  if (allow == RSET_EMPTY)  /* Restore temp. register. */[m
[31m-    emit_tai(as, PPCI_LWZ, tmp, RID_SP, SPOFS_TMPW);[m
[31m-  else[m
[31m-    ra_modified(as, tmp);[m
[31m-  emit_ai(as, PPCI_CMPLWI, RID_TMP, (int32_t)(8*topslot));[m
[31m-  emit_tab(as, PPCI_SUBF, RID_TMP, pbase, tmp);[m
[31m-  emit_tai(as, PPCI_LWZ, tmp, tmp, offsetof(lua_State, maxstack));[m
[31m-  if (pbase == RID_TMP)[m
[31m-    emit_getgl(as, RID_TMP, jit_base);[m
[31m-  emit_getgl(as, tmp, cur_L);[m
[31m-  if (allow == RSET_EMPTY)  /* Spill temp. register. */[m
[31m-    emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPW);[m
[31m-}[m
[31m-[m
[31m-/* Restore Lua stack from on-trace state. */[m
[31m-static void asm_stack_restore(ASMState *as, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  /* Store the value of all modified slots to the Lua stack. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    int32_t ofs = 8*((int32_t)s-1);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if ((sn & SNAP_NORESTORE))[m
[31m-      continue;[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-      emit_fai(as, PPCI_STFD, src, RID_BASE, ofs);[m
[31m-    } else {[m
[31m-      Reg type;[m
[31m-      RegSet allow = rset_exclude(RSET_GPR, RID_BASE);[m
[31m-      lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));[m
[31m-      if (!irt_ispri(ir->t)) {[m
[31m-	Reg src = ra_alloc1(as, ref, allow);[m
[31m-	rset_clear(allow, src);[m
[31m-	emit_tai(as, PPCI_STW, src, RID_BASE, ofs+4);[m
[31m-      }[m
[31m-      if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	if (s == 0) continue;  /* Do not overwrite link to previous frame. */[m
[31m-	type = ra_allock(as, (int32_t)(*flinks--), allow);[m
[31m-      } else {[m
[31m-	type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);[m
[31m-      }[m
[31m-      emit_tai(as, PPCI_STW, type, RID_BASE, ofs);[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-}[m
[31m-[m
[31m-/* -- GC handling --------------------------------------------------------- */[m
[31m-[m
[31m-/* Check GC threshold and do one or more GC steps. */[m
[31m-static void asm_gc_check(ASMState *as)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg tmp;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */[m
[31m-  asm_guardcc(as, CC_NE);  /* Assumes asm_snap_prep() already done. */[m
[31m-  emit_ai(as, PPCI_CMPWI, RID_RET, 0);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ASMREF_TMP2;  /* MSize steps     */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);[m
[31m-  tmp = ra_releasetmp(as, ASMREF_TMP2);[m
[31m-  emit_loadi(as, tmp, as->gcsteps);[m
[31m-  /* Jump around GC step if GC total < GC threshold. */[m
[31m-  emit_condbranch(as, PPCI_BC|PPCF_Y, CC_LT, l_end);[m
[31m-  emit_ab(as, PPCI_CMPLW, RID_TMP, tmp);[m
[31m-  emit_getgl(as, tmp, gc.threshold);[m
[31m-  emit_getgl(as, RID_TMP, gc.total);[m
[31m-  as->gcsteps = 0;[m
[31m-  checkmclim(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Loop handling ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the loop branch. */[m
[31m-static void asm_loop_fixup(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target = as->mcp;[m
[31m-  if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-    /* asm_guardcc already inverted the cond branch and patched the final b. */[m
[31m-    p[-2] = (p[-2] & (0xffff0000u & ~PPCF_Y)) | (((target-p+2) & 0x3fffu) << 2);[m
[31m-  } else {[m
[31m-    p[-1] = PPCI_B|(((target-p+1)&0x00ffffffu)<<2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Coalesce BASE register for a root trace. */[m
[31m-static void asm_head_root_base(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (r != RID_BASE)[m
[31m-      emit_mr(as, r, RID_BASE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Coalesce BASE register for a side trace. */[m
[31m-static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (irp->r == r) {[m
[31m-      rset_clear(allow, r);  /* Mark same BASE register as coalesced. */[m
[31m-    } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) {[m
[31m-      rset_clear(allow, irp->r);[m
[31m-      emit_mr(as, r, irp->r);  /* Move from coalesced parent reg. */[m
[31m-    } else {[m
[31m-      emit_getgl(as, r, jit_base);  /* Otherwise reload BASE. */[m
[31m-    }[m
[31m-  }[m
[31m-  return allow;[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the tail code. */[m
[31m-static void asm_tail_fixup(ASMState *as, TraceNo lnk)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target;[m
[31m-  int32_t spadj = as->T->spadjust;[m
[31m-  if (spadj == 0) {[m
[31m-    *--p = PPCI_NOP;[m
[31m-    *--p = PPCI_NOP;[m
[31m-    as->mctop = p;[m
[31m-  } else {[m
[31m-    /* Patch stack adjustment. */[m
[31m-    lua_assert(checki16(CFRAME_SIZE+spadj));[m
[31m-    p[-3] = PPCI_ADDI | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | (CFRAME_SIZE+spadj);[m
[31m-    p[-2] = PPCI_STWU | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | spadj;[m
[31m-  }[m
[31m-  /* Patch exit branch. */[m
[31m-  target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;[m
[31m-  p[-1] = PPCI_B|(((target-p+1)&0x00ffffffu)<<2);[m
[31m-}[m
[31m-[m
[31m-/* Prepare tail of code. */[m
[31m-static void asm_tail_prep(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop - 1;  /* Leave room for exit branch. */[m
[31m-  if (as->loopref) {[m
[31m-    as->invmcp = as->mcp = p;[m
[31m-  } else {[m
[31m-    as->mcp = p-2;  /* Leave room for stack pointer adjustment. */[m
[31m-    as->invmcp = NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Ensure there are enough stack slots for call arguments. */[m
[31m-static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  uint32_t i, nargs = CCI_XNARGS(ci);[m
[31m-  int nslots = 2, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  for (i = 0; i < nargs; i++)[m
[31m-    if (args[i] && irt_isfp(IR(args[i])->t)) {[m
[31m-      if (nfpr > 0) nfpr--; else nslots = (nslots+3) & ~1;[m
[31m-    } else {[m
[31m-      if (ngpr > 0) ngpr--; else nslots++;[m
[31m-    }[m
[31m-  if (nslots > as->evenspill)  /* Leave room for args in stack slots. */[m
[31m-    as->evenspill = nslots;[m
[31m-  return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET);[m
[31m-}[m
[31m-[m
[31m-static void asm_setup_target(ASMState *as)[m
[31m-{[m
[31m-  asm_exitstub_setup(as, as->T->nsnap + (as->parent ? 1 : 0));[m
[31m-}[m
[31m-[m
[31m-/* -- Trace patching ------------------------------------------------------ */[m
[31m-[m
[31m-/* Patch exit jumps of existing machine code to a new target. */[m
[31m-void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)[m
[31m-{[m
[31m-  MCode *p = T->mcode;[m
[31m-  MCode *pe = (MCode *)((char *)p + T->szmcode);[m
[31m-  MCode *px = exitstub_trace_addr(T, exitno);[m
[31m-  MCode *cstart = NULL;[m
[31m-  MCode *mcarea = lj_mcode_patch(J, p, 0);[m
[31m-  int clearso = 0;[m
[31m-  for (; p < pe; p++) {[m
[31m-    /* Look for exitstub branch, try to replace with branch to target. */[m
[31m-    uint32_t ins = *p;[m
[31m-    if ((ins & 0xfc000000u) == 0x40000000u &&[m
[31m-	((ins ^ ((char *)px-(char *)p)) & 0xffffu) == 0) {[m
[31m-      ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-      if (((ins >> 16) & 3) == (CC_SO&3)) {[m
[31m-	clearso = sizeof(MCode);[m
[31m-	delta -= sizeof(MCode);[m
[31m-      }[m
[31m-      /* Many, but not all short-range branches can be patched directly. */[m
[31m-      if (((delta + 0x8000) >> 16) == 0) {[m
[31m-	*p = (ins & 0xffdf0000u) | ((uint32_t)delta & 0xffffu) |[m
[31m-	     ((delta & 0x8000) * (PPCF_Y/0x8000));[m
[31m-	if (!cstart) cstart = p;[m
[31m-      }[m
[31m-    } else if ((ins & 0xfc000000u) == PPCI_B &&[m
[31m-	       ((ins ^ ((char *)px-(char *)p)) & 0x03ffffffu) == 0) {[m
[31m-      ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-      lua_assert(((delta + 0x02000000) >> 26) == 0);[m
[31m-      *p = PPCI_B | ((uint32_t)delta & 0x03ffffffu);[m
[31m-      if (!cstart) cstart = p;[m
[31m-    }[m
[31m-  }[m
[31m-  {  /* Always patch long-range branch in exit stub itself. */[m
[31m-    ptrdiff_t delta = (char *)target - (char *)px - clearso;[m
[31m-    lua_assert(((delta + 0x02000000) >> 26) == 0);[m
[31m-    *px = PPCI_B | ((uint32_t)delta & 0x03ffffffu);[m
[31m-  }[m
[31m-  if (!cstart) cstart = px;[m
[31m-  lj_mcode_sync(cstart, px+1);[m
[31m-  if (clearso) {  /* Extend the current trace. Ugly workaround. */[m
[31m-    MCode *pp = J->cur.mcode;[m
[31m-    J->cur.szmcode += sizeof(MCode);[m
[31m-    *--pp = PPCI_MCRXR;  /* Clear SO flag. */[m
[31m-    J->cur.mcode = pp;[m
[31m-    lj_mcode_sync(pp, pp+1);[m
[31m-  }[m
[31m-  lj_mcode_patch(J, mcarea, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_x86.h[m
[1mdeleted file mode 100644[m
[1mindex 651d703..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_asm_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,2745 +0,0 @@[m
[31m-/*[m
[31m-** x86/x64 IR assembler (SSA IR -> machine code).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Guard handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Generate an exit stub group at the bottom of the reserved MCode memory. */[m
[31m-static MCode *asm_exitstub_gen(ASMState *as, ExitNo group)[m
[31m-{[m
[31m-  ExitNo i, groupofs = (group*EXITSTUBS_PER_GROUP) & 0xff;[m
[31m-  MCode *mxp = as->mcbot;[m
[31m-  MCode *mxpstart = mxp;[m
[31m-  if (mxp + (2+2)*EXITSTUBS_PER_GROUP+8+5 >= as->mctop)[m
[31m-    asm_mclimit(as);[m
[31m-  /* Push low byte of exitno for each exit stub. */[m
[31m-  *mxp++ = XI_PUSHi8; *mxp++ = (MCode)groupofs;[m
[31m-  for (i = 1; i < EXITSTUBS_PER_GROUP; i++) {[m
[31m-    *mxp++ = XI_JMPs; *mxp++ = (MCode)((2+2)*(EXITSTUBS_PER_GROUP - i) - 2);[m
[31m-    *mxp++ = XI_PUSHi8; *mxp++ = (MCode)(groupofs + i);[m
[31m-  }[m
[31m-  /* Push the high byte of the exitno for each exit stub group. */[m
[31m-  *mxp++ = XI_PUSHi8; *mxp++ = (MCode)((group*EXITSTUBS_PER_GROUP)>>8);[m
[31m-  /* Store DISPATCH at original stack slot 0. Account for the two push ops. */[m
[31m-  *mxp++ = XI_MOVmi;[m
[31m-  *mxp++ = MODRM(XM_OFS8, 0, RID_ESP);[m
[31m-  *mxp++ = MODRM(XM_SCALE1, RID_ESP, RID_ESP);[m
[31m-  *mxp++ = 2*sizeof(void *);[m
[31m-  *(int32_t *)mxp = ptr2addr(J2GG(as->J)->dispatch); mxp += 4;[m
[31m-  /* Jump to exit handler which fills in the ExitState. */[m
[31m-  *mxp++ = XI_JMP; mxp += 4;[m
[31m-  *((int32_t *)(mxp-4)) = jmprel(mxp, (MCode *)(void *)lj_vm_exit_handler);[m
[31m-  /* Commit the code for this group (even if assembly fails later on). */[m
[31m-  lj_mcode_commitbot(as->J, mxp);[m
[31m-  as->mcbot = mxp;[m
[31m-  as->mclim = as->mcbot + MCLIM_REDZONE;[m
[31m-  return mxpstart;[m
[31m-}[m
[31m-[m
[31m-/* Setup all needed exit stubs. */[m
[31m-static void asm_exitstub_setup(ASMState *as, ExitNo nexits)[m
[31m-{[m
[31m-  ExitNo i;[m
[31m-  if (nexits >= EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR)[m
[31m-    lj_trace_err(as->J, LJ_TRERR_SNAPOV);[m
[31m-  for (i = 0; i < (nexits+EXITSTUBS_PER_GROUP-1)/EXITSTUBS_PER_GROUP; i++)[m
[31m-    if (as->J->exitstubgroup[i] == NULL)[m
[31m-      as->J->exitstubgroup[i] = asm_exitstub_gen(as, i);[m
[31m-}[m
[31m-[m
[31m-/* Emit conditional branch to exit for guard.[m
[31m-** It's important to emit this *after* all registers have been allocated,[m
[31m-** because rematerializations may invalidate the flags.[m
[31m-*/[m
[31m-static void asm_guardcc(ASMState *as, int cc)[m
[31m-{[m
[31m-  MCode *target = exitstub_addr(as->J, as->snapno);[m
[31m-  MCode *p = as->mcp;[m
[31m-  if (LJ_UNLIKELY(p == as->invmcp)) {[m
[31m-    as->loopinv = 1;[m
[31m-    *(int32_t *)(p+1) = jmprel(p+5, target);[m
[31m-    target = p;[m
[31m-    cc ^= 1;[m
[31m-    if (as->realign) {[m
[31m-      emit_sjcc(as, cc, target);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  emit_jcc(as, cc, target);[m
[31m-}[m
[31m-[m
[31m-/* -- Memory operand fusion ----------------------------------------------- */[m
[31m-[m
[31m-/* Limit linear search to this distance. Avoids O(n^2) behavior. */[m
[31m-#define CONFLICT_SEARCH_LIM	31[m
[31m-[m
[31m-/* Check if a reference is a signed 32 bit constant. */[m
[31m-static int asm_isk32(ASMState *as, IRRef ref, int32_t *k)[m
[31m-{[m
[31m-  if (irref_isk(ref)) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (ir->o != IR_KINT64) {[m
[31m-      *k = ir->i;[m
[31m-      return 1;[m
[31m-    } else if (checki32((int64_t)ir_kint64(ir)->u64)) {[m
[31m-      *k = (int32_t)ir_kint64(ir)->u64;[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check if there's no conflicting instruction between curins and ref.[m
[31m-** Also avoid fusing loads if there are multiple references.[m
[31m-*/[m
[31m-static int noconflict(ASMState *as, IRRef ref, IROp conflict, int noload)[m
[31m-{[m
[31m-  IRIns *ir = as->ir;[m
[31m-  IRRef i = as->curins;[m
[31m-  if (i > ref + CONFLICT_SEARCH_LIM)[m
[31m-    return 0;  /* Give up, ref is too far away. */[m
[31m-  while (--i > ref) {[m
[31m-    if (ir[i].o == conflict)[m
[31m-      return 0;  /* Conflict found. */[m
[31m-    else if (!noload && (ir[i].op1 == ref || ir[i].op2 == ref))[m
[31m-      return 0;[m
[31m-  }[m
[31m-  return 1;  /* Ok, no conflict. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse array base into memory operand. */[m
[31m-static IRRef asm_fuseabase(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *irb = IR(ref);[m
[31m-  as->mrm.ofs = 0;[m
[31m-  if (irb->o == IR_FLOAD) {[m
[31m-    IRIns *ira = IR(irb->op1);[m
[31m-    lua_assert(irb->op2 == IRFL_TAB_ARRAY);[m
[31m-    /* We can avoid the FLOAD of t->array for colocated arrays. */[m
[31m-    if (ira->o == IR_TNEW && ira->op1 <= LJ_MAX_COLOSIZE &&[m
[31m-	!neverfuse(as) && noconflict(as, irb->op1, IR_NEWREF, 1)) {[m
[31m-      as->mrm.ofs = (int32_t)sizeof(GCtab);  /* Ofs to colocated array. */[m
[31m-      return irb->op1;  /* Table obj. */[m
[31m-    }[m
[31m-  } else if (irb->o == IR_ADD && irref_isk(irb->op2)) {[m
[31m-    /* Fuse base offset (vararg load). */[m
[31m-    as->mrm.ofs = IR(irb->op2)->i;[m
[31m-    return irb->op1;[m
[31m-  }[m
[31m-  return ref;  /* Otherwise use the given array base. */[m
[31m-}[m
[31m-[m
[31m-/* Fuse array reference into memory operand. */[m
[31m-static void asm_fusearef(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irx;[m
[31m-  lua_assert(ir->o == IR_AREF);[m
[31m-  as->mrm.base = (uint8_t)ra_alloc1(as, asm_fuseabase(as, ir->op1), allow);[m
[31m-  irx = IR(ir->op2);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    as->mrm.ofs += 8*irx->i;[m
[31m-    as->mrm.idx = RID_NONE;[m
[31m-  } else {[m
[31m-    rset_clear(allow, as->mrm.base);[m
[31m-    as->mrm.scale = XM_SCALE8;[m
[31m-    /* Fuse a constant ADD (e.g. t[i+1]) into the offset.[m
[31m-    ** Doesn't help much without ABCelim, but reduces register pressure.[m
[31m-    */[m
[31m-    if (!LJ_64 &&  /* Has bad effects with negative index on x64. */[m
[31m-	mayfuse(as, ir->op2) && ra_noreg(irx->r) &&[m
[31m-	irx->o == IR_ADD && irref_isk(irx->op2)) {[m
[31m-      as->mrm.ofs += 8*IR(irx->op2)->i;[m
[31m-      as->mrm.idx = (uint8_t)ra_alloc1(as, irx->op1, allow);[m
[31m-    } else {[m
[31m-      as->mrm.idx = (uint8_t)ra_alloc1(as, ir->op2, allow);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fuse array/hash/upvalue reference into memory operand.[m
[31m-** Caveat: this may allocate GPRs for the base/idx registers. Be sure to[m
[31m-** pass the final allow mask, excluding any GPRs used for other inputs.[m
[31m-** In particular: 2-operand GPR instructions need to call ra_dest() first![m
[31m-*/[m
[31m-static void asm_fuseahuref(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_noreg(ir->r)) {[m
[31m-    switch ((IROp)ir->o) {[m
[31m-    case IR_AREF:[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	asm_fusearef(as, ir, allow);[m
[31m-	return;[m
[31m-      }[m
[31m-      break;[m
[31m-    case IR_HREFK:[m
[31m-      if (mayfuse(as, ref)) {[m
[31m-	as->mrm.base = (uint8_t)ra_alloc1(as, ir->op1, allow);[m
[31m-	as->mrm.ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node));[m
[31m-	as->mrm.idx = RID_NONE;[m
[31m-	return;[m
[31m-      }[m
[31m-      break;[m
[31m-    case IR_UREFC:[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-	GCupval *uv = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv;[m
[31m-	as->mrm.ofs = ptr2addr(&uv->tv);[m
[31m-	as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-	return;[m
[31m-      }[m
[31m-      break;[m
[31m-    default:[m
[31m-      lua_assert(ir->o == IR_HREF || ir->o == IR_NEWREF || ir->o == IR_UREFO ||[m
[31m-		 ir->o == IR_KKPTR);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  as->mrm.base = (uint8_t)ra_alloc1(as, ref, allow);[m
[31m-  as->mrm.ofs = 0;[m
[31m-  as->mrm.idx = RID_NONE;[m
[31m-}[m
[31m-[m
[31m-/* Fuse FLOAD/FREF reference into memory operand. */[m
[31m-static void asm_fusefref(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  lua_assert(ir->o == IR_FLOAD || ir->o == IR_FREF);[m
[31m-  as->mrm.ofs = field_ofs[ir->op2];[m
[31m-  as->mrm.idx = RID_NONE;[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    as->mrm.ofs += IR(ir->op1)->i;[m
[31m-    as->mrm.base = RID_NONE;[m
[31m-  } else {[m
[31m-    as->mrm.base = (uint8_t)ra_alloc1(as, ir->op1, allow);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fuse string reference into memory operand. */[m
[31m-static void asm_fusestrref(ASMState *as, IRIns *ir, RegSet allow)[m
[31m-{[m
[31m-  IRIns *irr;[m
[31m-  lua_assert(ir->o == IR_STRREF);[m
[31m-  as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-  as->mrm.scale = XM_SCALE1;[m
[31m-  as->mrm.ofs = sizeof(GCstr);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    as->mrm.ofs += IR(ir->op1)->i;[m
[31m-  } else {[m
[31m-    Reg r = ra_alloc1(as, ir->op1, allow);[m
[31m-    rset_clear(allow, r);[m
[31m-    as->mrm.base = (uint8_t)r;[m
[31m-  }[m
[31m-  irr = IR(ir->op2);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    as->mrm.ofs += irr->i;[m
[31m-  } else {[m
[31m-    Reg r;[m
[31m-    /* Fuse a constant add into the offset, e.g. string.sub(s, i+10). */[m
[31m-    if (!LJ_64 &&  /* Has bad effects with negative index on x64. */[m
[31m-	mayfuse(as, ir->op2) && irr->o == IR_ADD && irref_isk(irr->op2)) {[m
[31m-      as->mrm.ofs += IR(irr->op2)->i;[m
[31m-      r = ra_alloc1(as, irr->op1, allow);[m
[31m-    } else {[m
[31m-      r = ra_alloc1(as, ir->op2, allow);[m
[31m-    }[m
[31m-    if (as->mrm.base == RID_NONE)[m
[31m-      as->mrm.base = (uint8_t)r;[m
[31m-    else[m
[31m-      as->mrm.idx = (uint8_t)r;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fusexref(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  as->mrm.idx = RID_NONE;[m
[31m-  if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {[m
[31m-    as->mrm.ofs = ir->i;[m
[31m-    as->mrm.base = RID_NONE;[m
[31m-  } else if (ir->o == IR_STRREF) {[m
[31m-    asm_fusestrref(as, ir, allow);[m
[31m-  } else {[m
[31m-    as->mrm.ofs = 0;[m
[31m-    if (canfuse(as, ir) && ir->o == IR_ADD && ra_noreg(ir->r)) {[m
[31m-      /* Gather (base+idx*sz)+ofs as emitted by cdata ptr/array indexing. */[m
[31m-      IRIns *irx;[m
[31m-      IRRef idx;[m
[31m-      Reg r;[m
[31m-      if (asm_isk32(as, ir->op2, &as->mrm.ofs)) {  /* Recognize x+ofs. */[m
[31m-	ref = ir->op1;[m
[31m-	ir = IR(ref);[m
[31m-	if (!(ir->o == IR_ADD && canfuse(as, ir) && ra_noreg(ir->r)))[m
[31m-	  goto noadd;[m
[31m-      }[m
[31m-      as->mrm.scale = XM_SCALE1;[m
[31m-      idx = ir->op1;[m
[31m-      ref = ir->op2;[m
[31m-      irx = IR(idx);[m
[31m-      if (!(irx->o == IR_BSHL || irx->o == IR_ADD)) {  /* Try other operand. */[m
[31m-	idx = ir->op2;[m
[31m-	ref = ir->op1;[m
[31m-	irx = IR(idx);[m
[31m-      }[m
[31m-      if (canfuse(as, irx) && ra_noreg(irx->r)) {[m
[31m-	if (irx->o == IR_BSHL && irref_isk(irx->op2) && IR(irx->op2)->i <= 3) {[m
[31m-	  /* Recognize idx<<b with b = 0-3, corresponding to sz = (1),2,4,8. */[m
[31m-	  idx = irx->op1;[m
[31m-	  as->mrm.scale = (uint8_t)(IR(irx->op2)->i << 6);[m
[31m-	} else if (irx->o == IR_ADD && irx->op1 == irx->op2) {[m
[31m-	  /* FOLD does idx*2 ==> idx<<1 ==> idx+idx. */[m
[31m-	  idx = irx->op1;[m
[31m-	  as->mrm.scale = XM_SCALE2;[m
[31m-	}[m
[31m-      }[m
[31m-      r = ra_alloc1(as, idx, allow);[m
[31m-      rset_clear(allow, r);[m
[31m-      as->mrm.idx = (uint8_t)r;[m
[31m-    }[m
[31m-  noadd:[m
[31m-    as->mrm.base = (uint8_t)ra_alloc1(as, ref, allow);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fuse load into memory operand. */[m
[31m-static Reg asm_fuseload(ASMState *as, IRRef ref, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ra_hasreg(ir->r)) {[m
[31m-    if (allow != RSET_EMPTY) {  /* Fast path. */[m
[31m-      ra_noweak(as, ir->r);[m
[31m-      return ir->r;[m
[31m-    }[m
[31m-  fusespill:[m
[31m-    /* Force a spill if only memory operands are allowed (asm_x87load). */[m
[31m-    as->mrm.base = RID_ESP;[m
[31m-    as->mrm.ofs = ra_spill(as, ir);[m
[31m-    as->mrm.idx = RID_NONE;[m
[31m-    return RID_MRM;[m
[31m-  }[m
[31m-  if (ir->o == IR_KNUM) {[m
[31m-    RegSet avail = as->freeset & ~as->modset & RSET_FPR;[m
[31m-    lua_assert(allow != RSET_EMPTY);[m
[31m-    if (!(avail & (avail-1))) {  /* Fuse if less than two regs available. */[m
[31m-      as->mrm.ofs = ptr2addr(ir_knum(ir));[m
[31m-      as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-      return RID_MRM;[m
[31m-    }[m
[31m-  } else if (ir->o == IR_KINT64) {[m
[31m-    RegSet avail = as->freeset & ~as->modset & RSET_GPR;[m
[31m-    lua_assert(allow != RSET_EMPTY);[m
[31m-    if (!(avail & (avail-1))) {  /* Fuse if less than two regs available. */[m
[31m-      as->mrm.ofs = ptr2addr(ir_kint64(ir));[m
[31m-      as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-      return RID_MRM;[m
[31m-    }[m
[31m-  } else if (mayfuse(as, ref)) {[m
[31m-    RegSet xallow = (allow & RSET_GPR) ? allow : RSET_GPR;[m
[31m-    if (ir->o == IR_SLOAD) {[m
[31m-      if (!(ir->op2 & (IRSLOAD_PARENT|IRSLOAD_CONVERT)) &&[m
[31m-	  noconflict(as, ref, IR_RETF, 0)) {[m
[31m-	as->mrm.base = (uint8_t)ra_alloc1(as, REF_BASE, xallow);[m
[31m-	as->mrm.ofs = 8*((int32_t)ir->op1-1) + ((ir->op2&IRSLOAD_FRAME)?4:0);[m
[31m-	as->mrm.idx = RID_NONE;[m
[31m-	return RID_MRM;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_FLOAD) {[m
[31m-      /* Generic fusion is only ok for 32 bit operand (but see asm_comp). */[m
[31m-      if ((irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t)) &&[m
[31m-	  noconflict(as, ref, IR_FSTORE, 0)) {[m
[31m-	asm_fusefref(as, ir, xallow);[m
[31m-	return RID_MRM;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_ALOAD || ir->o == IR_HLOAD || ir->o == IR_ULOAD) {[m
[31m-      if (noconflict(as, ref, ir->o + IRDELTA_L2S, 0)) {[m
[31m-	asm_fuseahuref(as, ir->op1, xallow);[m
[31m-	return RID_MRM;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_XLOAD) {[m
[31m-      /* Generic fusion is not ok for 8/16 bit operands (but see asm_comp).[m
[31m-      ** Fusing unaligned memory operands is ok on x86 (except for SIMD types).[m
[31m-      */[m
[31m-      if ((!irt_typerange(ir->t, IRT_I8, IRT_U16)) &&[m
[31m-	  noconflict(as, ref, IR_XSTORE, 0)) {[m
[31m-	asm_fusexref(as, ir->op1, xallow);[m
[31m-	return RID_MRM;[m
[31m-      }[m
[31m-    } else if (ir->o == IR_VLOAD) {[m
[31m-      asm_fuseahuref(as, ir->op1, xallow);[m
[31m-      return RID_MRM;[m
[31m-    }[m
[31m-  }[m
[31m-  if (!(as->freeset & allow) && !irref_isk(ref) &&[m
[31m-      (allow == RSET_EMPTY || ra_hasspill(ir->s) || iscrossref(as, ref)))[m
[31m-    goto fusespill;[m
[31m-  return ra_allocref(as, ref, allow);[m
[31m-}[m
[31m-[m
[31m-#if LJ_64[m
[31m-/* Don't fuse a 32 bit load into a 64 bit operation. */[m
[31m-static Reg asm_fuseloadm(ASMState *as, IRRef ref, RegSet allow, int is64)[m
[31m-{[m
[31m-  if (is64 && !irt_is64(IR(ref)->t))[m
[31m-    return ra_alloc1(as, ref, allow);[m
[31m-  return asm_fuseload(as, ref, allow);[m
[31m-}[m
[31m-#else[m
[31m-#define asm_fuseloadm(as, ref, allow, is64)  asm_fuseload(as, (ref), (allow))[m
[31m-#endif[m
[31m-[m
[31m-/* -- Calls --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Count the required number of stack slots for a call. */[m
[31m-static int asm_count_call_slots(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t i, nargs = CCI_XNARGS(ci);[m
[31m-  int nslots = 0;[m
[31m-#if LJ_64[m
[31m-  if (LJ_ABI_WIN) {[m
[31m-    nslots = (int)(nargs*2);  /* Only matters for more than four args. */[m
[31m-  } else {[m
[31m-    int ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;[m
[31m-    for (i = 0; i < nargs; i++)[m
[31m-      if (args[i] && irt_isfp(IR(args[i])->t)) {[m
[31m-	if (nfpr > 0) nfpr--; else nslots += 2;[m
[31m-      } else {[m
[31m-	if (ngpr > 0) ngpr--; else nslots += 2;[m
[31m-      }[m
[31m-  }[m
[31m-#else[m
[31m-  int ngpr = 0;[m
[31m-  if ((ci->flags & CCI_CC_MASK) == CCI_CC_FASTCALL)[m
[31m-    ngpr = 2;[m
[31m-  else if ((ci->flags & CCI_CC_MASK) == CCI_CC_THISCALL)[m
[31m-    ngpr = 1;[m
[31m-  for (i = 0; i < nargs; i++)[m
[31m-    if (args[i] && irt_isfp(IR(args[i])->t)) {[m
[31m-      nslots += irt_isnum(IR(args[i])->t) ? 2 : 1;[m
[31m-    } else {[m
[31m-      if (ngpr > 0) ngpr--; else nslots++;[m
[31m-    }[m
[31m-#endif[m
[31m-  return nslots;[m
[31m-}[m
[31m-[m
[31m-/* Generate a call to a C function. */[m
[31m-static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)[m
[31m-{[m
[31m-  uint32_t n, nargs = CCI_XNARGS(ci);[m
[31m-  int32_t ofs = STACKARG_OFS;[m
[31m-#if LJ_64[m
[31m-  uint32_t gprs = REGARG_GPRS;[m
[31m-  Reg fpr = REGARG_FIRSTFPR;[m
[31m-#if !LJ_ABI_WIN[m
[31m-  MCode *patchnfpr = NULL;[m
[31m-#endif[m
[31m-#else[m
[31m-  uint32_t gprs = 0;[m
[31m-  if ((ci->flags & CCI_CC_MASK) != CCI_CC_CDECL) {[m
[31m-    if ((ci->flags & CCI_CC_MASK) == CCI_CC_THISCALL)[m
[31m-      gprs = (REGARG_GPRS & 31);[m
[31m-    else if ((ci->flags & CCI_CC_MASK) == CCI_CC_FASTCALL)[m
[31m-      gprs = REGARG_GPRS;[m
[31m-  }[m
[31m-#endif[m
[31m-  if ((void *)ci->func)[m
[31m-    emit_call(as, ci->func);[m
[31m-#if LJ_64[m
[31m-  if ((ci->flags & CCI_VARARG)) {  /* Special handling for vararg calls. */[m
[31m-#if LJ_ABI_WIN[m
[31m-    for (n = 0; n < 4 && n < nargs; n++) {[m
[31m-      IRIns *ir = IR(args[n]);[m
[31m-      if (irt_isfp(ir->t))  /* Duplicate FPRs in GPRs. */[m
[31m-	emit_rr(as, XO_MOVDto, (irt_isnum(ir->t) ? REX_64 : 0) | (fpr+n),[m
[31m-		((gprs >> (n*5)) & 31));  /* Either MOVD or MOVQ. */[m
[31m-    }[m
[31m-#else[m
[31m-    patchnfpr = --as->mcp;  /* Indicate number of used FPRs in register al. */[m
[31m-    *--as->mcp = XI_MOVrib | RID_EAX;[m
[31m-#endif[m
[31m-  }[m
[31m-#endif[m
[31m-  for (n = 0; n < nargs; n++) {  /* Setup args. */[m
[31m-    IRRef ref = args[n];[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    Reg r;[m
[31m-#if LJ_64 && LJ_ABI_WIN[m
[31m-    /* Windows/x64 argument registers are strictly positional. */[m
[31m-    r = irt_isfp(ir->t) ? (fpr <= REGARG_LASTFPR ? fpr : 0) : (gprs & 31);[m
[31m-    fpr++; gprs >>= 5;[m
[31m-#elif LJ_64[m
[31m-    /* POSIX/x64 argument registers are used in order of appearance. */[m
[31m-    if (irt_isfp(ir->t)) {[m
[31m-      r = fpr <= REGARG_LASTFPR ? fpr++ : 0;[m
[31m-    } else {[m
[31m-      r = gprs & 31; gprs >>= 5;[m
[31m-    }[m
[31m-#else[m
[31m-    if (ref && irt_isfp(ir->t)) {[m
[31m-      r = 0;[m
[31m-    } else {[m
[31m-      r = gprs & 31; gprs >>= 5;[m
[31m-      if (!ref) continue;[m
[31m-    }[m
[31m-#endif[m
[31m-    if (r) {  /* Argument is in a register. */[m
[31m-      if (r < RID_MAX_GPR && ref < ASMREF_TMP1) {[m
[31m-#if LJ_64[m
[31m-	if (ir->o == IR_KINT64)[m
[31m-	  emit_loadu64(as, r, ir_kint64(ir)->u64);[m
[31m-	else[m
[31m-#endif[m
[31m-	  emit_loadi(as, r, ir->i);[m
[31m-      } else {[m
[31m-	lua_assert(rset_test(as->freeset, r));  /* Must have been evicted. */[m
[31m-	if (ra_hasreg(ir->r)) {[m
[31m-	  ra_noweak(as, ir->r);[m
[31m-	  emit_movrr(as, ir, r, ir->r);[m
[31m-	} else {[m
[31m-	  ra_allocref(as, ref, RID2RSET(r));[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (irt_isfp(ir->t)) {  /* FP argument is on stack. */[m
[31m-      lua_assert(!(irt_isfloat(ir->t) && irref_isk(ref)));  /* No float k. */[m
[31m-      if (LJ_32 && (ofs & 4) && irref_isk(ref)) {[m
[31m-	/* Split stores for unaligned FP consts. */[m
[31m-	emit_movmroi(as, RID_ESP, ofs, (int32_t)ir_knum(ir)->u32.lo);[m
[31m-	emit_movmroi(as, RID_ESP, ofs+4, (int32_t)ir_knum(ir)->u32.hi);[m
[31m-      } else {[m
[31m-	r = ra_alloc1(as, ref, RSET_FPR);[m
[31m-	emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSDto : XO_MOVSSto,[m
[31m-		  r, RID_ESP, ofs);[m
[31m-      }[m
[31m-      ofs += (LJ_32 && irt_isfloat(ir->t)) ? 4 : 8;[m
[31m-    } else {  /* Non-FP argument is on stack. */[m
[31m-      if (LJ_32 && ref < ASMREF_TMP1) {[m
[31m-	emit_movmroi(as, RID_ESP, ofs, ir->i);[m
[31m-      } else {[m
[31m-	r = ra_alloc1(as, ref, RSET_GPR);[m
[31m-	emit_movtomro(as, REX_64 + r, RID_ESP, ofs);[m
[31m-      }[m
[31m-      ofs += sizeof(intptr_t);[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-#if LJ_64 && !LJ_ABI_WIN[m
[31m-  if (patchnfpr) *patchnfpr = fpr - REGARG_FIRSTFPR;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Setup result reg/sp for call. Evict scratch regs. */[m
[31m-static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  int hiop = (LJ_32 && (ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));[m
[31m-  if ((ci->flags & CCI_NOFPRCLOBBER))[m
[31m-    drop &= ~RSET_FPR;[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  if (hiop && ra_hasreg((ir+1)->r))[m
[31m-    rset_clear(drop, (ir+1)->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);  /* Evictions must be performed first. */[m
[31m-  if (ra_used(ir)) {[m
[31m-    if (irt_isfp(ir->t)) {[m
[31m-      int32_t ofs = sps_scale(ir->s);  /* Use spill slot or temp slots. */[m
[31m-#if LJ_64[m
[31m-      if ((ci->flags & CCI_CASTU64)) {[m
[31m-	Reg dest = ir->r;[m
[31m-	if (ra_hasreg(dest)) {[m
[31m-	  ra_free(as, dest);[m
[31m-	  ra_modified(as, dest);[m
[31m-	  emit_rr(as, XO_MOVD, dest|REX_64, RID_RET);  /* Really MOVQ. */[m
[31m-	}[m
[31m-	if (ofs) emit_movtomro(as, RID_RET|REX_64, RID_ESP, ofs);[m
[31m-      } else {[m
[31m-	ra_destreg(as, ir, RID_FPRET);[m
[31m-      }[m
[31m-#else[m
[31m-      /* Number result is in x87 st0 for x86 calling convention. */[m
[31m-      Reg dest = ir->r;[m
[31m-      if (ra_hasreg(dest)) {[m
[31m-	ra_free(as, dest);[m
[31m-	ra_modified(as, dest);[m
[31m-	emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSD : XO_MOVSS,[m
[31m-		  dest, RID_ESP, ofs);[m
[31m-      }[m
[31m-      if ((ci->flags & CCI_CASTU64)) {[m
[31m-	emit_movtomro(as, RID_RETLO, RID_ESP, ofs);[m
[31m-	emit_movtomro(as, RID_RETHI, RID_ESP, ofs+4);[m
[31m-      } else {[m
[31m-	emit_rmro(as, irt_isnum(ir->t) ? XO_FSTPq : XO_FSTPd,[m
[31m-		  irt_isnum(ir->t) ? XOg_FSTPq : XOg_FSTPd, RID_ESP, ofs);[m
[31m-      }[m
[31m-#endif[m
[31m-#if LJ_32[m
[31m-    } else if (hiop) {[m
[31m-      ra_destpair(as, ir);[m
[31m-#endif[m
[31m-    } else {[m
[31m-      lua_assert(!irt_ispri(ir->t));[m
[31m-      ra_destreg(as, ir, RID_RET);[m
[31m-    }[m
[31m-  } else if (LJ_32 && irt_isfp(ir->t) && !(ci->flags & CCI_CASTU64)) {[m
[31m-    emit_x87op(as, XI_FPOP);  /* Pop unused result from x87 st0. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return a constant function pointer or NULL for indirect calls. */[m
[31m-static void *asm_callx_func(ASMState *as, IRIns *irf, IRRef func)[m
[31m-{[m
[31m-#if LJ_32[m
[31m-  UNUSED(as);[m
[31m-  if (irref_isk(func))[m
[31m-    return (void *)irf->i;[m
[31m-#else[m
[31m-  if (irref_isk(func)) {[m
[31m-    MCode *p;[m
[31m-    if (irf->o == IR_KINT64)[m
[31m-      p = (MCode *)(void *)ir_k64(irf)->u64;[m
[31m-    else[m
[31m-      p = (MCode *)(void *)(uintptr_t)(uint32_t)irf->i;[m
[31m-    if (p - as->mcp == (int32_t)(p - as->mcp))[m
[31m-      return p;  /* Call target is still in +-2GB range. */[m
[31m-    /* Avoid the indirect case of emit_call(). Try to hoist func addr. */[m
[31m-  }[m
[31m-#endif[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static void asm_callx(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  CCallInfo ci;[m
[31m-  IRRef func;[m
[31m-  IRIns *irf;[m
[31m-  int32_t spadj = 0;[m
[31m-  ci.flags = asm_callx_flags(as, ir);[m
[31m-  asm_collectargs(as, ir, &ci, args);[m
[31m-  asm_setupresult(as, ir, &ci);[m
[31m-#if LJ_32[m
[31m-  /* Have to readjust stack after non-cdecl calls due to callee cleanup. */[m
[31m-  if ((ci.flags & CCI_CC_MASK) != CCI_CC_CDECL)[m
[31m-    spadj = 4 * asm_count_call_slots(as, &ci, args);[m
[31m-#endif[m
[31m-  func = ir->op2; irf = IR(func);[m
[31m-  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }[m
[31m-  ci.func = (ASMFunction)asm_callx_func(as, irf, func);[m
[31m-  if (!(void *)ci.func) {[m
[31m-    /* Use a (hoistable) non-scratch register for indirect calls. */[m
[31m-    RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-    Reg r = ra_alloc1(as, func, allow);[m
[31m-    if (LJ_32) emit_spsub(as, spadj);  /* Above code may cause restores! */[m
[31m-    emit_rr(as, XO_GROUP5, XOg_CALL, r);[m
[31m-  } else if (LJ_32) {[m
[31m-    emit_spsub(as, spadj);[m
[31m-  }[m
[31m-  asm_gencall(as, &ci, args);[m
[31m-}[m
[31m-[m
[31m-/* -- Returns ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Return to lower frame. Guard that it goes to the right spot. */[m
[31m-static void asm_retf(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  void *pc = ir_kptr(IR(ir->op2));[m
[31m-  int32_t delta = 1+LJ_FR2+bc_a(*((const BCIns *)pc - 1));[m
[31m-  as->topslot -= (BCReg)delta;[m
[31m-  if ((int32_t)as->topslot < 0) as->topslot = 0;[m
[31m-  irt_setmark(IR(REF_BASE)->t);  /* Children must not coalesce with BASE reg. */[m
[31m-  emit_setgl(as, base, jit_base);[m
[31m-  emit_addptr(as, base, -8*delta);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_gmroi(as, XG_ARITHi(XOg_CMP), base, -4, ptr2addr(pc));[m
[31m-}[m
[31m-[m
[31m-/* -- Type conversions ---------------------------------------------------- */[m
[31m-[m
[31m-static void asm_tointg(ASMState *as, IRIns *ir, Reg left)[m
[31m-{[m
[31m-  Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_guardcc(as, CC_P);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_rr(as, XO_UCOMISD, left, tmp);[m
[31m-  emit_rr(as, XO_CVTSI2SD, tmp, dest);[m
[31m-  emit_rr(as, XO_XORPS, tmp, tmp);  /* Avoid partial register stall. */[m
[31m-  emit_rr(as, XO_CVTTSD2SI, dest, left);[m
[31m-  /* Can't fuse since left is needed twice. */[m
[31m-}[m
[31m-[m
[31m-static void asm_tobit(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  Reg tmp = ra_noreg(IR(ir->op1)->r) ?[m
[31m-	      ra_alloc1(as, ir->op1, RSET_FPR) :[m
[31m-	      ra_scratch(as, RSET_FPR);[m
[31m-  Reg right = asm_fuseload(as, ir->op2, rset_exclude(RSET_FPR, tmp));[m
[31m-  emit_rr(as, XO_MOVDto, tmp, dest);[m
[31m-  emit_mrm(as, XO_ADDSD, tmp, right);[m
[31m-  ra_left(as, tmp, ir->op1);[m
[31m-}[m
[31m-[m
[31m-static void asm_conv(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-  int st64 = (st == IRT_I64 || st == IRT_U64 || (LJ_64 && st == IRT_P64));[m
[31m-  int stfp = (st == IRT_NUM || st == IRT_FLOAT);[m
[31m-  IRRef lref = ir->op1;[m
[31m-  lua_assert(irt_type(ir->t) != st);[m
[31m-  lua_assert(!(LJ_32 && (irt_isint64(ir->t) || st64)));  /* Handled by SPLIT. */[m
[31m-  if (irt_isfp(ir->t)) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    if (stfp) {  /* FP to FP conversion. */[m
[31m-      Reg left = asm_fuseload(as, lref, RSET_FPR);[m
[31m-      emit_mrm(as, st == IRT_NUM ? XO_CVTSD2SS : XO_CVTSS2SD, dest, left);[m
[31m-      if (left == dest) return;  /* Avoid the XO_XORPS. */[m
[31m-    } else if (LJ_32 && st == IRT_U32) {  /* U32 to FP conversion on x86. */[m
[31m-      /* number = (2^52+2^51 .. u32) - (2^52+2^51) */[m
[31m-      cTValue *k = lj_ir_k64_find(as->J, U64x(43380000,00000000));[m
[31m-      Reg bias = ra_scratch(as, rset_exclude(RSET_FPR, dest));[m
[31m-      if (irt_isfloat(ir->t))[m
[31m-	emit_rr(as, XO_CVTSD2SS, dest, dest);[m
[31m-      emit_rr(as, XO_SUBSD, dest, bias);  /* Subtract 2^52+2^51 bias. */[m
[31m-      emit_rr(as, XO_XORPS, dest, bias);  /* Merge bias and integer. */[m
[31m-      emit_loadn(as, bias, k);[m
[31m-      emit_mrm(as, XO_MOVD, dest, asm_fuseload(as, lref, RSET_GPR));[m
[31m-      return;[m
[31m-    } else {  /* Integer to FP conversion. */[m
[31m-      Reg left = (LJ_64 && (st == IRT_U32 || st == IRT_U64)) ?[m
[31m-		 ra_alloc1(as, lref, RSET_GPR) :[m
[31m-		 asm_fuseloadm(as, lref, RSET_GPR, st64);[m
[31m-      if (LJ_64 && st == IRT_U64) {[m
[31m-	MCLabel l_end = emit_label(as);[m
[31m-	const void *k = lj_ir_k64_find(as->J, U64x(43f00000,00000000));[m
[31m-	emit_rma(as, XO_ADDSD, dest, k);  /* Add 2^64 to compensate. */[m
[31m-	emit_sjcc(as, CC_NS, l_end);[m
[31m-	emit_rr(as, XO_TEST, left|REX_64, left);  /* Check if u64 >= 2^63. */[m
[31m-      }[m
[31m-      emit_mrm(as, irt_isnum(ir->t) ? XO_CVTSI2SD : XO_CVTSI2SS,[m
[31m-	       dest|((LJ_64 && (st64 || st == IRT_U32)) ? REX_64 : 0), left);[m
[31m-    }[m
[31m-    emit_rr(as, XO_XORPS, dest, dest);  /* Avoid partial register stall. */[m
[31m-  } else if (stfp) {  /* FP to integer conversion. */[m
[31m-    if (irt_isguard(ir->t)) {[m
[31m-      /* Checked conversions are only supported from number to int. */[m
[31m-      lua_assert(irt_isint(ir->t) && st == IRT_NUM);[m
[31m-      asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR));[m
[31m-    } else {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      x86Op op = st == IRT_NUM ? XO_CVTTSD2SI : XO_CVTTSS2SI;[m
[31m-      if (LJ_64 ? irt_isu64(ir->t) : irt_isu32(ir->t)) {[m
[31m-	/* LJ_64: For inputs >= 2^63 add -2^64, convert again. */[m
[31m-	/* LJ_32: For inputs >= 2^31 add -2^31, convert again and add 2^31. */[m
[31m-	Reg tmp = ra_noreg(IR(lref)->r) ? ra_alloc1(as, lref, RSET_FPR) :[m
[31m-					  ra_scratch(as, RSET_FPR);[m
[31m-	MCLabel l_end = emit_label(as);[m
[31m-	if (LJ_32)[m
[31m-	  emit_gri(as, XG_ARITHi(XOg_ADD), dest, (int32_t)0x80000000);[m
[31m-	emit_rr(as, op, dest|REX_64, tmp);[m
[31m-	if (st == IRT_NUM)[m
[31m-	  emit_rma(as, XO_ADDSD, tmp, lj_ir_k64_find(as->J,[m
[31m-		   LJ_64 ? U64x(c3f00000,00000000) : U64x(c1e00000,00000000)));[m
[31m-	else[m
[31m-	  emit_rma(as, XO_ADDSS, tmp, lj_ir_k64_find(as->J,[m
[31m-		   LJ_64 ? U64x(00000000,df800000) : U64x(00000000,cf000000)));[m
[31m-	emit_sjcc(as, CC_NS, l_end);[m
[31m-	emit_rr(as, XO_TEST, dest|REX_64, dest);  /* Check if dest negative. */[m
[31m-	emit_rr(as, op, dest|REX_64, tmp);[m
[31m-	ra_left(as, tmp, lref);[m
[31m-      } else {[m
[31m-	Reg left = asm_fuseload(as, lref, RSET_FPR);[m
[31m-	if (LJ_64 && irt_isu32(ir->t))[m
[31m-	  emit_rr(as, XO_MOV, dest, dest);  /* Zero hiword. */[m
[31m-	emit_mrm(as, op,[m
[31m-		 dest|((LJ_64 &&[m
[31m-			(irt_is64(ir->t) || irt_isu32(ir->t))) ? REX_64 : 0),[m
[31m-		 left);[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (st >= IRT_I8 && st <= IRT_U16) {  /* Extend to 32 bit integer. */[m
[31m-    Reg left, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    RegSet allow = RSET_GPR;[m
[31m-    x86Op op;[m
[31m-    lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));[m
[31m-    if (st == IRT_I8) {[m
[31m-      op = XO_MOVSXb; allow = RSET_GPR8; dest |= FORCE_REX;[m
[31m-    } else if (st == IRT_U8) {[m
[31m-      op = XO_MOVZXb; allow = RSET_GPR8; dest |= FORCE_REX;[m
[31m-    } else if (st == IRT_I16) {[m
[31m-      op = XO_MOVSXw;[m
[31m-    } else {[m
[31m-      op = XO_MOVZXw;[m
[31m-    }[m
[31m-    left = asm_fuseload(as, lref, allow);[m
[31m-    /* Add extra MOV if source is already in wrong register. */[m
[31m-    if (!LJ_64 && left != RID_MRM && !rset_test(allow, left)) {[m
[31m-      Reg tmp = ra_scratch(as, allow);[m
[31m-      emit_rr(as, op, dest, tmp);[m
[31m-      emit_rr(as, XO_MOV, tmp, left);[m
[31m-    } else {[m
[31m-      emit_mrm(as, op, dest, left);[m
[31m-    }[m
[31m-  } else {  /* 32/64 bit integer conversions. */[m
[31m-    if (LJ_32) {  /* Only need to handle 32/32 bit no-op (cast) on x86. */[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      ra_left(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-    } else if (irt_is64(ir->t)) {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      if (st64 || !(ir->op2 & IRCONV_SEXT)) {[m
[31m-	/* 64/64 bit no-op (cast) or 32 to 64 bit zero extension. */[m
[31m-	ra_left(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-      } else {  /* 32 to 64 bit sign extension. */[m
[31m-	Reg left = asm_fuseload(as, lref, RSET_GPR);[m
[31m-	emit_mrm(as, XO_MOVSXd, dest|REX_64, left);[m
[31m-      }[m
[31m-    } else {[m
[31m-      Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-      if (st64) {[m
[31m-	Reg left = asm_fuseload(as, lref, RSET_GPR);[m
[31m-	/* This is either a 32 bit reg/reg mov which zeroes the hiword[m
[31m-	** or a load of the loword from a 64 bit address.[m
[31m-	*/[m
[31m-	emit_mrm(as, XO_MOV, dest, left);[m
[31m-      } else {  /* 32/32 bit no-op (cast). */[m
[31m-	ra_left(as, dest, lref);  /* Do nothing, but may need to move regs. */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-/* No SSE conversions to/from 64 bit on x86, so resort to ugly x87 code. */[m
[31m-[m
[31m-/* 64 bit integer to FP conversion in 32 bit mode. */[m
[31m-static void asm_conv_fp_int64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg hi = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg lo = ra_alloc1(as, (ir-1)->op1, rset_exclude(RSET_GPR, hi));[m
[31m-  int32_t ofs = sps_scale(ir->s);  /* Use spill slot or temp slots. */[m
[31m-  Reg dest = ir->r;[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    ra_free(as, dest);[m
[31m-    ra_modified(as, dest);[m
[31m-    emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSD : XO_MOVSS, dest, RID_ESP, ofs);[m
[31m-  }[m
[31m-  emit_rmro(as, irt_isnum(ir->t) ? XO_FSTPq : XO_FSTPd,[m
[31m-	    irt_isnum(ir->t) ? XOg_FSTPq : XOg_FSTPd, RID_ESP, ofs);[m
[31m-  if (((ir-1)->op2 & IRCONV_SRCMASK) == IRT_U64) {[m
[31m-    /* For inputs in [2^63,2^64-1] add 2^64 to compensate. */[m
[31m-    MCLabel l_end = emit_label(as);[m
[31m-    emit_rma(as, XO_FADDq, XOg_FADDq,[m
[31m-	     lj_ir_k64_find(as->J, U64x(43f00000,00000000)));[m
[31m-    emit_sjcc(as, CC_NS, l_end);[m
[31m-    emit_rr(as, XO_TEST, hi, hi);  /* Check if u64 >= 2^63. */[m
[31m-  } else {[m
[31m-    lua_assert(((ir-1)->op2 & IRCONV_SRCMASK) == IRT_I64);[m
[31m-  }[m
[31m-  emit_rmro(as, XO_FILDq, XOg_FILDq, RID_ESP, 0);[m
[31m-  /* NYI: Avoid narrow-to-wide store-to-load forwarding stall. */[m
[31m-  emit_rmro(as, XO_MOVto, hi, RID_ESP, 4);[m
[31m-  emit_rmro(as, XO_MOVto, lo, RID_ESP, 0);[m
[31m-}[m
[31m-[m
[31m-/* FP to 64 bit integer conversion in 32 bit mode. */[m
[31m-static void asm_conv_int64_fp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK);[m
[31m-  IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH);[m
[31m-  Reg lo, hi;[m
[31m-  lua_assert(st == IRT_NUM || st == IRT_FLOAT);[m
[31m-  lua_assert(dt == IRT_I64 || dt == IRT_U64);[m
[31m-  hi = ra_dest(as, ir, RSET_GPR);[m
[31m-  lo = ra_dest(as, ir-1, rset_exclude(RSET_GPR, hi));[m
[31m-  if (ra_used(ir-1)) emit_rmro(as, XO_MOV, lo, RID_ESP, 0);[m
[31m-  /* NYI: Avoid wide-to-narrow store-to-load forwarding stall. */[m
[31m-  if (!(as->flags & JIT_F_SSE3)) {  /* Set FPU rounding mode to default. */[m
[31m-    emit_rmro(as, XO_FLDCW, XOg_FLDCW, RID_ESP, 4);[m
[31m-    emit_rmro(as, XO_MOVto, lo, RID_ESP, 4);[m
[31m-    emit_gri(as, XG_ARITHi(XOg_AND), lo, 0xf3ff);[m
[31m-  }[m
[31m-  if (dt == IRT_U64) {[m
[31m-    /* For inputs in [2^63,2^64-1] add -2^64 and convert again. */[m
[31m-    MCLabel l_pop, l_end = emit_label(as);[m
[31m-    emit_x87op(as, XI_FPOP);[m
[31m-    l_pop = emit_label(as);[m
[31m-    emit_sjmp(as, l_end);[m
[31m-    emit_rmro(as, XO_MOV, hi, RID_ESP, 4);[m
[31m-    if ((as->flags & JIT_F_SSE3))[m
[31m-      emit_rmro(as, XO_FISTTPq, XOg_FISTTPq, RID_ESP, 0);[m
[31m-    else[m
[31m-      emit_rmro(as, XO_FISTPq, XOg_FISTPq, RID_ESP, 0);[m
[31m-    emit_rma(as, XO_FADDq, XOg_FADDq,[m
[31m-	     lj_ir_k64_find(as->J, U64x(c3f00000,00000000)));[m
[31m-    emit_sjcc(as, CC_NS, l_pop);[m
[31m-    emit_rr(as, XO_TEST, hi, hi);  /* Check if out-of-range (2^63). */[m
[31m-  }[m
[31m-  emit_rmro(as, XO_MOV, hi, RID_ESP, 4);[m
[31m-  if ((as->flags & JIT_F_SSE3)) {  /* Truncation is easy with SSE3. */[m
[31m-    emit_rmro(as, XO_FISTTPq, XOg_FISTTPq, RID_ESP, 0);[m
[31m-  } else {  /* Otherwise set FPU rounding mode to truncate before the store. */[m
[31m-    emit_rmro(as, XO_FISTPq, XOg_FISTPq, RID_ESP, 0);[m
[31m-    emit_rmro(as, XO_FLDCW, XOg_FLDCW, RID_ESP, 0);[m
[31m-    emit_rmro(as, XO_MOVtow, lo, RID_ESP, 0);[m
[31m-    emit_rmro(as, XO_ARITHw(XOg_OR), lo, RID_ESP, 0);[m
[31m-    emit_loadi(as, lo, 0xc00);[m
[31m-    emit_rmro(as, XO_FNSTCW, XOg_FNSTCW, RID_ESP, 0);[m
[31m-  }[m
[31m-  if (dt == IRT_U64)[m
[31m-    emit_x87op(as, XI_FDUP);[m
[31m-  emit_mrm(as, st == IRT_NUM ? XO_FLDq : XO_FLDd,[m
[31m-	   st == IRT_NUM ? XOg_FLDq: XOg_FLDd,[m
[31m-	   asm_fuseload(as, ir->op1, RSET_EMPTY));[m
[31m-}[m
[31m-[m
[31m-static void asm_conv64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isfp(ir->t))[m
[31m-    asm_conv_fp_int64(as, ir);[m
[31m-  else[m
[31m-    asm_conv_int64_fp(as, ir);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_strto(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* Force a spill slot for the destination register (if any). */[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];[m
[31m-  IRRef args[2];[m
[31m-  RegSet drop = RSET_SCRATCH;[m
[31m-  if ((drop & RSET_FPR) != RSET_FPR && ra_hasreg(ir->r))[m
[31m-    rset_set(drop, ir->r);  /* WIN64 doesn't spill all FPRs. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  asm_guardcc(as, CC_E);[m
[31m-  emit_rr(as, XO_TEST, RID_RET, RID_RET);  /* Test return status. */[m
[31m-  args[0] = ir->op1;      /* GCstr *str */[m
[31m-  args[1] = ASMREF_TMP1;  /* TValue *n  */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  /* Store the result to the spill slot or temp slots. */[m
[31m-  emit_rmro(as, XO_LEA, ra_releasetmp(as, ASMREF_TMP1)|REX_64,[m
[31m-	    RID_ESP, sps_scale(ir->s));[m
[31m-}[m
[31m-[m
[31m-/* -- Memory references --------------------------------------------------- */[m
[31m-[m
[31m-/* Get pointer to TValue. */[m
[31m-static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    /* For numbers use the constant itself or a spill slot as a TValue. */[m
[31m-    if (irref_isk(ref))[m
[31m-      emit_loada(as, dest, ir_knum(ir));[m
[31m-    else[m
[31m-      emit_rmro(as, XO_LEA, dest|REX_64, RID_ESP, ra_spill(as, ir));[m
[31m-  } else {[m
[31m-    /* Otherwise use g->tmptv to hold the TValue. */[m
[31m-    if (!irref_isk(ref)) {[m
[31m-      Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, dest));[m
[31m-      emit_movtomro(as, REX_64IR(ir, src), dest, 0);[m
[31m-    } else if (!irt_ispri(ir->t)) {[m
[31m-      emit_movmroi(as, dest, 0, ir->i);[m
[31m-    }[m
[31m-    if (!(LJ_64 && irt_islightud(ir->t)))[m
[31m-      emit_movmroi(as, dest, 4, irt_toitype(ir->t));[m
[31m-    emit_loada(as, dest, &J2G(as->J)->tmptv);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_aref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_fusearef(as, ir, RSET_GPR);[m
[31m-  if (!(as->mrm.idx == RID_NONE && as->mrm.ofs == 0))[m
[31m-    emit_mrm(as, XO_LEA, dest, RID_MRM);[m
[31m-  else if (as->mrm.base != dest)[m
[31m-    emit_rr(as, XO_MOV, dest, as->mrm.base);[m
[31m-}[m
[31m-[m
[31m-/* Inlined hash lookup. Specialized for key type and for const keys.[m
[31m-** The equivalent C code is:[m
[31m-**   Node *n = hashkey(t, key);[m
[31m-**   do {[m
[31m-**     if (lj_obj_equal(&n->key, key)) return &n->val;[m
[31m-**   } while ((n = nextnode(n)));[m
[31m-**   return niltv(L);[m
[31m-*/[m
[31m-static void asm_href(ASMState *as, IRIns *ir, IROp merge)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  int destused = ra_used(ir);[m
[31m-  Reg dest = ra_dest(as, ir, allow);[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));[m
[31m-  Reg key = RID_NONE, tmp = RID_NONE;[m
[31m-  IRIns *irkey = IR(ir->op2);[m
[31m-  int isk = irref_isk(ir->op2);[m
[31m-  IRType1 kt = irkey->t;[m
[31m-  uint32_t khash;[m
[31m-  MCLabel l_end, l_loop, l_next;[m
[31m-[m
[31m-  if (!isk) {[m
[31m-    rset_clear(allow, tab);[m
[31m-    key = ra_alloc1(as, ir->op2, irt_isnum(kt) ? RSET_FPR : allow);[m
[31m-    if (!irt_isstr(kt))[m
[31m-      tmp = ra_scratch(as, rset_exclude(allow, key));[m
[31m-  }[m
[31m-[m
[31m-  /* Key not found in chain: jump to exit (if merged) or load niltv. */[m
[31m-  l_end = emit_label(as);[m
[31m-  if (merge == IR_NE)[m
[31m-    asm_guardcc(as, CC_E);  /* XI_JMP is not found by lj_asm_patchexit. */[m
[31m-  else if (destused)[m
[31m-    emit_loada(as, dest, niltvg(J2G(as->J)));[m
[31m-[m
[31m-  /* Follow hash chain until the end. */[m
[31m-  l_loop = emit_sjcc_label(as, CC_NZ);[m
[31m-  emit_rr(as, XO_TEST, dest, dest);[m
[31m-  emit_rmro(as, XO_MOV, dest, dest, offsetof(Node, next));[m
[31m-  l_next = emit_label(as);[m
[31m-[m
[31m-  /* Type and value comparison. */[m
[31m-  if (merge == IR_EQ)[m
[31m-    asm_guardcc(as, CC_E);[m
[31m-  else[m
[31m-    emit_sjcc(as, CC_E, l_end);[m
[31m-  if (irt_isnum(kt)) {[m
[31m-    if (isk) {[m
[31m-      /* Assumes -0.0 is already canonicalized to +0.0. */[m
[31m-      emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.u32.lo),[m
[31m-		 (int32_t)ir_knum(irkey)->u32.lo);[m
[31m-      emit_sjcc(as, CC_NE, l_next);[m
[31m-      emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.u32.hi),[m
[31m-		 (int32_t)ir_knum(irkey)->u32.hi);[m
[31m-    } else {[m
[31m-      emit_sjcc(as, CC_P, l_next);[m
[31m-      emit_rmro(as, XO_UCOMISD, key, dest, offsetof(Node, key.n));[m
[31m-      emit_sjcc(as, CC_AE, l_next);[m
[31m-      /* The type check avoids NaN penalties and complaints from Valgrind. */[m
[31m-#if LJ_64[m
[31m-      emit_u32(as, LJ_TISNUM);[m
[31m-      emit_rmro(as, XO_ARITHi, XOg_CMP, dest, offsetof(Node, key.it));[m
[31m-#else[m
[31m-      emit_i8(as, LJ_TISNUM);[m
[31m-      emit_rmro(as, XO_ARITHi8, XOg_CMP, dest, offsetof(Node, key.it));[m
[31m-#endif[m
[31m-    }[m
[31m-#if LJ_64[m
[31m-  } else if (irt_islightud(kt)) {[m
[31m-    emit_rmro(as, XO_CMP, key|REX_64, dest, offsetof(Node, key.u64));[m
[31m-#endif[m
[31m-  } else {[m
[31m-    if (!irt_ispri(kt)) {[m
[31m-      lua_assert(irt_isaddr(kt));[m
[31m-      if (isk)[m
[31m-	emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.gcr),[m
[31m-		   ptr2addr(ir_kgc(irkey)));[m
[31m-      else[m
[31m-	emit_rmro(as, XO_CMP, key, dest, offsetof(Node, key.gcr));[m
[31m-      emit_sjcc(as, CC_NE, l_next);[m
[31m-    }[m
[31m-    lua_assert(!irt_isnil(kt));[m
[31m-    emit_i8(as, irt_toitype(kt));[m
[31m-    emit_rmro(as, XO_ARITHi8, XOg_CMP, dest, offsetof(Node, key.it));[m
[31m-  }[m
[31m-  emit_sfixup(as, l_loop);[m
[31m-  checkmclim(as);[m
[31m-[m
[31m-  /* Load main position relative to tab->node into dest. */[m
[31m-  khash = isk ? ir_khash(irkey) : 1;[m
[31m-  if (khash == 0) {[m
[31m-    emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, node));[m
[31m-  } else {[m
[31m-    emit_rmro(as, XO_ARITH(XOg_ADD), dest, tab, offsetof(GCtab, node));[m
[31m-    if ((as->flags & JIT_F_PREFER_IMUL)) {[m
[31m-      emit_i8(as, sizeof(Node));[m
[31m-      emit_rr(as, XO_IMULi8, dest, dest);[m
[31m-    } else {[m
[31m-      emit_shifti(as, XOg_SHL, dest, 3);[m
[31m-      emit_rmrxo(as, XO_LEA, dest, dest, dest, XM_SCALE2, 0);[m
[31m-    }[m
[31m-    if (isk) {[m
[31m-      emit_gri(as, XG_ARITHi(XOg_AND), dest, (int32_t)khash);[m
[31m-      emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, hmask));[m
[31m-    } else if (irt_isstr(kt)) {[m
[31m-      emit_rmro(as, XO_ARITH(XOg_AND), dest, key, offsetof(GCstr, hash));[m
[31m-      emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, hmask));[m
[31m-    } else {  /* Must match with hashrot() in lj_tab.c. */[m
[31m-      emit_rmro(as, XO_ARITH(XOg_AND), dest, tab, offsetof(GCtab, hmask));[m
[31m-      emit_rr(as, XO_ARITH(XOg_SUB), dest, tmp);[m
[31m-      emit_shifti(as, XOg_ROL, tmp, HASH_ROT3);[m
[31m-      emit_rr(as, XO_ARITH(XOg_XOR), dest, tmp);[m
[31m-      emit_shifti(as, XOg_ROL, dest, HASH_ROT2);[m
[31m-      emit_rr(as, XO_ARITH(XOg_SUB), tmp, dest);[m
[31m-      emit_shifti(as, XOg_ROL, dest, HASH_ROT1);[m
[31m-      emit_rr(as, XO_ARITH(XOg_XOR), tmp, dest);[m
[31m-      if (irt_isnum(kt)) {[m
[31m-	emit_rr(as, XO_ARITH(XOg_ADD), dest, dest);[m
[31m-#if LJ_64[m
[31m-	emit_shifti(as, XOg_SHR|REX_64, dest, 32);[m
[31m-	emit_rr(as, XO_MOV, tmp, dest);[m
[31m-	emit_rr(as, XO_MOVDto, key|REX_64, dest);[m
[31m-#else[m
[31m-	emit_rmro(as, XO_MOV, dest, RID_ESP, ra_spill(as, irkey)+4);[m
[31m-	emit_rr(as, XO_MOVDto, key, tmp);[m
[31m-#endif[m
[31m-      } else {[m
[31m-	emit_rr(as, XO_MOV, tmp, key);[m
[31m-	emit_rmro(as, XO_LEA, dest, key, HASH_BIAS);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_hrefk(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *kslot = IR(ir->op2);[m
[31m-  IRIns *irkey = IR(kslot->op1);[m
[31m-  int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node));[m
[31m-  Reg dest = ra_used(ir) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;[m
[31m-  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-#if !LJ_64 || defined(LUAJIT_USE_VALGRIND)[m
[31m-  MCLabel l_exit;[m
[31m-#endif[m
[31m-  lua_assert(ofs % sizeof(Node) == 0);[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    if (ofs != 0) {[m
[31m-      if (dest == node && !(as->flags & JIT_F_LEA_AGU))[m
[31m-	emit_gri(as, XG_ARITHi(XOg_ADD), dest, ofs);[m
[31m-      else[m
[31m-	emit_rmro(as, XO_LEA, dest, node, ofs);[m
[31m-    } else if (dest != node) {[m
[31m-      emit_rr(as, XO_MOV, dest, node);[m
[31m-    }[m
[31m-  }[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-#if LJ_64 && !defined(LUAJIT_USE_VALGRIND)[m
[31m-  if (!irt_ispri(irkey->t)) {[m
[31m-    Reg key = ra_scratch(as, rset_exclude(RSET_GPR, node));[m
[31m-    emit_rmro(as, XO_CMP, key|REX_64, node,[m
[31m-	       ofs + (int32_t)offsetof(Node, key.u64));[m
[31m-    lua_assert(irt_isnum(irkey->t) || irt_isgcv(irkey->t));[m
[31m-    /* Assumes -0.0 is already canonicalized to +0.0. */[m
[31m-    emit_loadu64(as, key, irt_isnum(irkey->t) ? ir_knum(irkey)->u64 :[m
[31m-			  ((uint64_t)irt_toitype(irkey->t) << 32) |[m
[31m-			  (uint64_t)(uint32_t)ptr2addr(ir_kgc(irkey)));[m
[31m-  } else {[m
[31m-    lua_assert(!irt_isnil(irkey->t));[m
[31m-    emit_i8(as, irt_toitype(irkey->t));[m
[31m-    emit_rmro(as, XO_ARITHi8, XOg_CMP, node,[m
[31m-	      ofs + (int32_t)offsetof(Node, key.it));[m
[31m-  }[m
[31m-#else[m
[31m-  l_exit = emit_label(as);[m
[31m-  if (irt_isnum(irkey->t)) {[m
[31m-    /* Assumes -0.0 is already canonicalized to +0.0. */[m
[31m-    emit_gmroi(as, XG_ARITHi(XOg_CMP), node,[m
[31m-	       ofs + (int32_t)offsetof(Node, key.u32.lo),[m
[31m-	       (int32_t)ir_knum(irkey)->u32.lo);[m
[31m-    emit_sjcc(as, CC_NE, l_exit);[m
[31m-    emit_gmroi(as, XG_ARITHi(XOg_CMP), node,[m
[31m-	       ofs + (int32_t)offsetof(Node, key.u32.hi),[m
[31m-	       (int32_t)ir_knum(irkey)->u32.hi);[m
[31m-  } else {[m
[31m-    if (!irt_ispri(irkey->t)) {[m
[31m-      lua_assert(irt_isgcv(irkey->t));[m
[31m-      emit_gmroi(as, XG_ARITHi(XOg_CMP), node,[m
[31m-		 ofs + (int32_t)offsetof(Node, key.gcr),[m
[31m-		 ptr2addr(ir_kgc(irkey)));[m
[31m-      emit_sjcc(as, CC_NE, l_exit);[m
[31m-    }[m
[31m-    lua_assert(!irt_isnil(irkey->t));[m
[31m-    emit_i8(as, irt_toitype(irkey->t));[m
[31m-    emit_rmro(as, XO_ARITHi8, XOg_CMP, node,[m
[31m-	      ofs + (int32_t)offsetof(Node, key.it));[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static void asm_uref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* NYI: Check that UREFO is still open and not aliasing a slot. */[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  if (irref_isk(ir->op1)) {[m
[31m-    GCfunc *fn = ir_kfunc(IR(ir->op1));[m
[31m-    MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;[m
[31m-    emit_rma(as, XO_MOV, dest, v);[m
[31m-  } else {[m
[31m-    Reg uv = ra_scratch(as, RSET_GPR);[m
[31m-    Reg func = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-    if (ir->o == IR_UREFC) {[m
[31m-      emit_rmro(as, XO_LEA, dest, uv, offsetof(GCupval, tv));[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_i8(as, 1);[m
[31m-      emit_rmro(as, XO_ARITHib, XOg_CMP, uv, offsetof(GCupval, closed));[m
[31m-    } else {[m
[31m-      emit_rmro(as, XO_MOV, dest, uv, offsetof(GCupval, v));[m
[31m-    }[m
[31m-    emit_rmro(as, XO_MOV, uv, func,[m
[31m-	      (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_fusefref(as, ir, RSET_GPR);[m
[31m-  emit_mrm(as, XO_LEA, dest, RID_MRM);[m
[31m-}[m
[31m-[m
[31m-static void asm_strref(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  asm_fusestrref(as, ir, RSET_GPR);[m
[31m-  if (as->mrm.base == RID_NONE)[m
[31m-    emit_loadi(as, dest, as->mrm.ofs);[m
[31m-  else if (as->mrm.base == dest && as->mrm.idx == RID_NONE)[m
[31m-    emit_gri(as, XG_ARITHi(XOg_ADD), dest, as->mrm.ofs);[m
[31m-  else[m
[31m-    emit_mrm(as, XO_LEA, dest, RID_MRM);[m
[31m-}[m
[31m-[m
[31m-/* -- Loads and stores ---------------------------------------------------- */[m
[31m-[m
[31m-static void asm_fxload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);[m
[31m-  x86Op xo;[m
[31m-  if (ir->o == IR_FLOAD)[m
[31m-    asm_fusefref(as, ir, RSET_GPR);[m
[31m-  else[m
[31m-    asm_fusexref(as, ir->op1, RSET_GPR);[m
[31m-  /* ir->op2 is ignored -- unaligned loads are ok on x86. */[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_I8: xo = XO_MOVSXb; break;[m
[31m-  case IRT_U8: xo = XO_MOVZXb; break;[m
[31m-  case IRT_I16: xo = XO_MOVSXw; break;[m
[31m-  case IRT_U16: xo = XO_MOVZXw; break;[m
[31m-  case IRT_NUM: xo = XO_MOVSD; break;[m
[31m-  case IRT_FLOAT: xo = XO_MOVSS; break;[m
[31m-  default:[m
[31m-    if (LJ_64 && irt_is64(ir->t))[m
[31m-      dest |= REX_64;[m
[31m-    else[m
[31m-      lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t));[m
[31m-    xo = XO_MOV;[m
[31m-    break;[m
[31m-  }[m
[31m-  emit_mrm(as, xo, dest, RID_MRM);[m
[31m-}[m
[31m-[m
[31m-#define asm_fload(as, ir)	asm_fxload(as, ir)[m
[31m-#define asm_xload(as, ir)	asm_fxload(as, ir)[m
[31m-[m
[31m-static void asm_fxstore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg src = RID_NONE, osrc = RID_NONE;[m
[31m-  int32_t k = 0;[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  /* The IRT_I16/IRT_U16 stores should never be simplified for constant[m
[31m-  ** values since mov word [mem], imm16 has a length-changing prefix.[m
[31m-  */[m
[31m-  if (irt_isi16(ir->t) || irt_isu16(ir->t) || irt_isfp(ir->t) ||[m
[31m-      !asm_isk32(as, ir->op2, &k)) {[m
[31m-    RegSet allow8 = irt_isfp(ir->t) ? RSET_FPR :[m
[31m-		    (irt_isi8(ir->t) || irt_isu8(ir->t)) ? RSET_GPR8 : RSET_GPR;[m
[31m-    src = osrc = ra_alloc1(as, ir->op2, allow8);[m
[31m-    if (!LJ_64 && !rset_test(allow8, src)) {  /* Already in wrong register. */[m
[31m-      rset_clear(allow, osrc);[m
[31m-      src = ra_scratch(as, allow8);[m
[31m-    }[m
[31m-    rset_clear(allow, src);[m
[31m-  }[m
[31m-  if (ir->o == IR_FSTORE) {[m
[31m-    asm_fusefref(as, IR(ir->op1), allow);[m
[31m-  } else {[m
[31m-    asm_fusexref(as, ir->op1, allow);[m
[31m-    if (LJ_32 && ir->o == IR_HIOP) as->mrm.ofs += 4;[m
[31m-  }[m
[31m-  if (ra_hasreg(src)) {[m
[31m-    x86Op xo;[m
[31m-    switch (irt_type(ir->t)) {[m
[31m-    case IRT_I8: case IRT_U8: xo = XO_MOVtob; src |= FORCE_REX; break;[m
[31m-    case IRT_I16: case IRT_U16: xo = XO_MOVtow; break;[m
[31m-    case IRT_NUM: xo = XO_MOVSDto; break;[m
[31m-    case IRT_FLOAT: xo = XO_MOVSSto; break;[m
[31m-#if LJ_64[m
[31m-    case IRT_LIGHTUD: lua_assert(0);  /* NYI: mask 64 bit lightuserdata. */[m
[31m-#endif[m
[31m-    default:[m
[31m-      if (LJ_64 && irt_is64(ir->t))[m
[31m-	src |= REX_64;[m
[31m-      else[m
[31m-	lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t));[m
[31m-      xo = XO_MOVto;[m
[31m-      break;[m
[31m-    }[m
[31m-    emit_mrm(as, xo, src, RID_MRM);[m
[31m-    if (!LJ_64 && src != osrc) {[m
[31m-      ra_noweak(as, osrc);[m
[31m-      emit_rr(as, XO_MOV, src, osrc);[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (irt_isi8(ir->t) || irt_isu8(ir->t)) {[m
[31m-      emit_i8(as, k);[m
[31m-      emit_mrm(as, XO_MOVmib, 0, RID_MRM);[m
[31m-    } else {[m
[31m-      lua_assert(irt_is64(ir->t) || irt_isint(ir->t) || irt_isu32(ir->t) ||[m
[31m-		 irt_isaddr(ir->t));[m
[31m-      emit_i32(as, k);[m
[31m-      emit_mrm(as, XO_MOVmi, REX_64IR(ir, 0), RID_MRM);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_fstore(as, ir)	asm_fxstore(as, ir)[m
[31m-#define asm_xstore(as, ir)	asm_fxstore(as, ir)[m
[31m-[m
[31m-#if LJ_64[m
[31m-static Reg asm_load_lightud64(ASMState *as, IRIns *ir, int typecheck)[m
[31m-{[m
[31m-  if (ra_used(ir) || typecheck) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    if (typecheck) {[m
[31m-      Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, dest));[m
[31m-      asm_guardcc(as, CC_NE);[m
[31m-      emit_i8(as, -2);[m
[31m-      emit_rr(as, XO_ARITHi8, XOg_CMP, tmp);[m
[31m-      emit_shifti(as, XOg_SAR|REX_64, tmp, 47);[m
[31m-      emit_rr(as, XO_MOV, tmp|REX_64, dest);[m
[31m-    }[m
[31m-    return dest;[m
[31m-  } else {[m
[31m-    return RID_NONE;[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void asm_ahuvload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  lua_assert(irt_isnum(ir->t) || irt_ispri(ir->t) || irt_isaddr(ir->t) ||[m
[31m-	     (LJ_DUALNUM && irt_isint(ir->t)));[m
[31m-#if LJ_64[m
[31m-  if (irt_islightud(ir->t)) {[m
[31m-    Reg dest = asm_load_lightud64(as, ir, 1);[m
[31m-    if (ra_hasreg(dest)) {[m
[31m-      asm_fuseahuref(as, ir->op1, RSET_GPR);[m
[31m-      emit_mrm(as, XO_MOV, dest|REX_64, RID_MRM);[m
[31m-    }[m
[31m-    return;[m
[31m-  } else[m
[31m-#endif[m
[31m-  if (ra_used(ir)) {[m
[31m-    RegSet allow = irt_isnum(ir->t) ? RSET_FPR : RSET_GPR;[m
[31m-    Reg dest = ra_dest(as, ir, allow);[m
[31m-    asm_fuseahuref(as, ir->op1, RSET_GPR);[m
[31m-    emit_mrm(as, dest < RID_MAX_GPR ? XO_MOV : XO_MOVSD, dest, RID_MRM);[m
[31m-  } else {[m
[31m-    asm_fuseahuref(as, ir->op1, RSET_GPR);[m
[31m-  }[m
[31m-  /* Always do the type check, even if the load result is unused. */[m
[31m-  as->mrm.ofs += 4;[m
[31m-  asm_guardcc(as, irt_isnum(ir->t) ? CC_AE : CC_NE);[m
[31m-  if (LJ_64 && irt_type(ir->t) >= IRT_NUM) {[m
[31m-    lua_assert(irt_isinteger(ir->t) || irt_isnum(ir->t));[m
[31m-    emit_u32(as, LJ_TISNUM);[m
[31m-    emit_mrm(as, XO_ARITHi, XOg_CMP, RID_MRM);[m
[31m-  } else {[m
[31m-    emit_i8(as, irt_toitype(ir->t));[m
[31m-    emit_mrm(as, XO_ARITHi8, XOg_CMP, RID_MRM);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_ahustore(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (ir->r == RID_SINK)[m
[31m-    return;[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, RSET_FPR);[m
[31m-    asm_fuseahuref(as, ir->op1, RSET_GPR);[m
[31m-    emit_mrm(as, XO_MOVSDto, src, RID_MRM);[m
[31m-#if LJ_64[m
[31m-  } else if (irt_islightud(ir->t)) {[m
[31m-    Reg src = ra_alloc1(as, ir->op2, RSET_GPR);[m
[31m-    asm_fuseahuref(as, ir->op1, rset_exclude(RSET_GPR, src));[m
[31m-    emit_mrm(as, XO_MOVto, src|REX_64, RID_MRM);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    IRIns *irr = IR(ir->op2);[m
[31m-    RegSet allow = RSET_GPR;[m
[31m-    Reg src = RID_NONE;[m
[31m-    if (!irref_isk(ir->op2)) {[m
[31m-      src = ra_alloc1(as, ir->op2, allow);[m
[31m-      rset_clear(allow, src);[m
[31m-    }[m
[31m-    asm_fuseahuref(as, ir->op1, allow);[m
[31m-    if (ra_hasreg(src)) {[m
[31m-      emit_mrm(as, XO_MOVto, src, RID_MRM);[m
[31m-    } else if (!irt_ispri(irr->t)) {[m
[31m-      lua_assert(irt_isaddr(ir->t) || (LJ_DUALNUM && irt_isinteger(ir->t)));[m
[31m-      emit_i32(as, irr->i);[m
[31m-      emit_mrm(as, XO_MOVmi, 0, RID_MRM);[m
[31m-    }[m
[31m-    as->mrm.ofs += 4;[m
[31m-    emit_i32(as, (int32_t)irt_toitype(ir->t));[m
[31m-    emit_mrm(as, XO_MOVmi, 0, RID_MRM);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_sload(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);[m
[31m-  IRType1 t = ir->t;[m
[31m-  Reg base;[m
[31m-  lua_assert(!(ir->op2 & IRSLOAD_PARENT));  /* Handled by asm_head_side(). */[m
[31m-  lua_assert(irt_isguard(t) || !(ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-  lua_assert(LJ_DUALNUM ||[m
[31m-	     !irt_isint(t) || (ir->op2 & (IRSLOAD_CONVERT|IRSLOAD_FRAME)));[m
[31m-  if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) {[m
[31m-    Reg left = ra_scratch(as, RSET_FPR);[m
[31m-    asm_tointg(as, ir, left);  /* Frees dest reg. Do this before base alloc. */[m
[31m-    base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-    emit_rmro(as, XO_MOVSD, left, base, ofs);[m
[31m-    t.irt = IRT_NUM;  /* Continue with a regular number type check. */[m
[31m-#if LJ_64[m
[31m-  } else if (irt_islightud(t)) {[m
[31m-    Reg dest = asm_load_lightud64(as, ir, (ir->op2 & IRSLOAD_TYPECHECK));[m
[31m-    if (ra_hasreg(dest)) {[m
[31m-      base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-      emit_rmro(as, XO_MOV, dest|REX_64, base, ofs);[m
[31m-    }[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else if (ra_used(ir)) {[m
[31m-    RegSet allow = irt_isnum(t) ? RSET_FPR : RSET_GPR;[m
[31m-    Reg dest = ra_dest(as, ir, allow);[m
[31m-    base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-    lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t));[m
[31m-    if ((ir->op2 & IRSLOAD_CONVERT)) {[m
[31m-      t.irt = irt_isint(t) ? IRT_NUM : IRT_INT;  /* Check for original type. */[m
[31m-      emit_rmro(as, irt_isint(t) ? XO_CVTSI2SD : XO_CVTTSD2SI, dest, base, ofs);[m
[31m-    } else {[m
[31m-      emit_rmro(as, irt_isnum(t) ? XO_MOVSD : XO_MOV, dest, base, ofs);[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (!(ir->op2 & IRSLOAD_TYPECHECK))[m
[31m-      return;  /* No type check: avoid base alloc. */[m
[31m-    base = ra_alloc1(as, REF_BASE, RSET_GPR);[m
[31m-  }[m
[31m-  if ((ir->op2 & IRSLOAD_TYPECHECK)) {[m
[31m-    /* Need type check, even if the load result is unused. */[m
[31m-    asm_guardcc(as, irt_isnum(t) ? CC_AE : CC_NE);[m
[31m-    if (LJ_64 && irt_type(t) >= IRT_NUM) {[m
[31m-      lua_assert(irt_isinteger(t) || irt_isnum(t));[m
[31m-      emit_u32(as, LJ_TISNUM);[m
[31m-      emit_rmro(as, XO_ARITHi, XOg_CMP, base, ofs+4);[m
[31m-    } else {[m
[31m-      emit_i8(as, irt_toitype(t));[m
[31m-      emit_rmro(as, XO_ARITHi8, XOg_CMP, base, ofs+4);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Allocations --------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static void asm_cnew(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(as->J));[m
[31m-  CTypeID id = (CTypeID)IR(ir->op1)->i;[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco];[m
[31m-  IRRef args[4];[m
[31m-  lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL));[m
[31m-[m
[31m-  as->gcsteps++;[m
[31m-  asm_setupresult(as, ir, ci);  /* GCcdata * */[m
[31m-[m
[31m-  /* Initialize immutable cdata object. */[m
[31m-  if (ir->o == IR_CNEWI) {[m
[31m-    RegSet allow = (RSET_GPR & ~RSET_SCRATCH);[m
[31m-#if LJ_64[m
[31m-    Reg r64 = sz == 8 ? REX_64 : 0;[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      IRIns *irk = IR(ir->op2);[m
[31m-      uint64_t k = irk->o == IR_KINT64 ? ir_k64(irk)->u64 :[m
[31m-					 (uint64_t)(uint32_t)irk->i;[m
[31m-      if (sz == 4 || checki32((int64_t)k)) {[m
[31m-	emit_i32(as, (int32_t)k);[m
[31m-	emit_rmro(as, XO_MOVmi, r64, RID_RET, sizeof(GCcdata));[m
[31m-      } else {[m
[31m-	emit_movtomro(as, RID_ECX + r64, RID_RET, sizeof(GCcdata));[m
[31m-	emit_loadu64(as, RID_ECX, k);[m
[31m-      }[m
[31m-    } else {[m
[31m-      Reg r = ra_alloc1(as, ir->op2, allow);[m
[31m-      emit_movtomro(as, r + r64, RID_RET, sizeof(GCcdata));[m
[31m-    }[m
[31m-#else[m
[31m-    int32_t ofs = sizeof(GCcdata);[m
[31m-    if (sz == 8) {[m
[31m-      ofs += 4; ir++;[m
[31m-      lua_assert(ir->o == IR_HIOP);[m
[31m-    }[m
[31m-    do {[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	emit_movmroi(as, RID_RET, ofs, IR(ir->op2)->i);[m
[31m-      } else {[m
[31m-	Reg r = ra_alloc1(as, ir->op2, allow);[m
[31m-	emit_movtomro(as, r, RID_RET, ofs);[m
[31m-	rset_clear(allow, r);[m
[31m-      }[m
[31m-      if (ofs == sizeof(GCcdata)) break;[m
[31m-      ofs -= 4; ir--;[m
[31m-    } while (1);[m
[31m-#endif[m
[31m-    lua_assert(sz == 4 || sz == 8);[m
[31m-  } else if (ir->op2 != REF_NIL) {  /* Create VLA/VLS/aligned cdata. */[m
[31m-    ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];[m
[31m-    args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-    args[1] = ir->op1;      /* CTypeID id   */[m
[31m-    args[2] = ir->op2;      /* CTSize sz    */[m
[31m-    args[3] = ASMREF_TMP1;  /* CTSize align */[m
[31m-    asm_gencall(as, ci, args);[m
[31m-    emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)ctype_align(info));[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Combine initialization of marked, gct and ctypeid. */[m
[31m-  emit_movtomro(as, RID_ECX, RID_RET, offsetof(GCcdata, marked));[m
[31m-  emit_gri(as, XG_ARITHi(XOg_OR), RID_ECX,[m
[31m-	   (int32_t)((~LJ_TCDATA<<8)+(id<<16)));[m
[31m-  emit_gri(as, XG_ARITHi(XOg_AND), RID_ECX, LJ_GC_WHITES);[m
[31m-  emit_opgl(as, XO_MOVZXb, RID_ECX, gc.currentwhite);[m
[31m-[m
[31m-  args[0] = ASMREF_L;     /* lua_State *L */[m
[31m-  args[1] = ASMREF_TMP1;  /* MSize size   */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)(sz+sizeof(GCcdata)));[m
[31m-}[m
[31m-#else[m
[31m-#define asm_cnew(as, ir)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-static void asm_tbar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg tab = ra_alloc1(as, ir->op1, RSET_GPR);[m
[31m-  Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, tab));[m
[31m-  MCLabel l_end = emit_label(as);[m
[31m-  emit_movtomro(as, tmp, tab, offsetof(GCtab, gclist));[m
[31m-  emit_setgl(as, tab, gc.grayagain);[m
[31m-  emit_getgl(as, tmp, gc.grayagain);[m
[31m-  emit_i8(as, ~LJ_GC_BLACK);[m
[31m-  emit_rmro(as, XO_ARITHib, XOg_AND, tab, offsetof(GCtab, marked));[m
[31m-  emit_sjcc(as, CC_Z, l_end);[m
[31m-  emit_i8(as, LJ_GC_BLACK);[m
[31m-  emit_rmro(as, XO_GROUP3b, XOg_TEST, tab, offsetof(GCtab, marked));[m
[31m-}[m
[31m-[m
[31m-static void asm_obar(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg obj;[m
[31m-  /* No need for other object barriers (yet). */[m
[31m-  lua_assert(IR(ir->op1)->o == IR_UREFC);[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ir->op1;      /* TValue *tv      */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  emit_loada(as, ra_releasetmp(as, ASMREF_TMP1), J2G(as->J));[m
[31m-  obj = IR(ir->op1)->r;[m
[31m-  emit_sjcc(as, CC_Z, l_end);[m
[31m-  emit_i8(as, LJ_GC_WHITES);[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    GCobj *vp = ir_kgc(IR(ir->op2));[m
[31m-    emit_rma(as, XO_GROUP3b, XOg_TEST, &vp->gch.marked);[m
[31m-  } else {[m
[31m-    Reg val = ra_alloc1(as, ir->op2, rset_exclude(RSET_SCRATCH&RSET_GPR, obj));[m
[31m-    emit_rmro(as, XO_GROUP3b, XOg_TEST, val, (int32_t)offsetof(GChead, marked));[m
[31m-  }[m
[31m-  emit_sjcc(as, CC_Z, l_end);[m
[31m-  emit_i8(as, LJ_GC_BLACK);[m
[31m-  emit_rmro(as, XO_GROUP3b, XOg_TEST, obj,[m
[31m-	    (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));[m
[31m-}[m
[31m-[m
[31m-/* -- FP/int arithmetic and logic operations ------------------------------ */[m
[31m-[m
[31m-/* Load reference onto x87 stack. Force a spill to memory if needed. */[m
[31m-static void asm_x87load(ASMState *as, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_KNUM) {[m
[31m-    cTValue *tv = ir_knum(ir);[m
[31m-    if (tvispzero(tv))  /* Use fldz only for +0. */[m
[31m-      emit_x87op(as, XI_FLDZ);[m
[31m-    else if (tvispone(tv))[m
[31m-      emit_x87op(as, XI_FLD1);[m
[31m-    else[m
[31m-      emit_rma(as, XO_FLDq, XOg_FLDq, tv);[m
[31m-  } else if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT && !ra_used(ir) &&[m
[31m-	     !irref_isk(ir->op1) && mayfuse(as, ir->op1)) {[m
[31m-    IRIns *iri = IR(ir->op1);[m
[31m-    emit_rmro(as, XO_FILDd, XOg_FILDd, RID_ESP, ra_spill(as, iri));[m
[31m-  } else {[m
[31m-    emit_mrm(as, XO_FLDq, XOg_FLDq, asm_fuseload(as, ref, RSET_EMPTY));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void asm_fpmath(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRFPMathOp fpm = (IRFPMathOp)ir->op2;[m
[31m-  if (fpm == IRFPM_SQRT) {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-    Reg left = asm_fuseload(as, ir->op1, RSET_FPR);[m
[31m-    emit_mrm(as, XO_SQRTSD, dest, left);[m
[31m-  } else if (fpm <= IRFPM_TRUNC) {[m
[31m-    if (as->flags & JIT_F_SSE4_1) {  /* SSE4.1 has a rounding instruction. */[m
[31m-      Reg dest = ra_dest(as, ir, RSET_FPR);[m
[31m-      Reg left = asm_fuseload(as, ir->op1, RSET_FPR);[m
[31m-      /* ROUNDSD has a 4-byte opcode which doesn't fit in x86Op.[m
[31m-      ** Let's pretend it's a 3-byte opcode, and compensate afterwards.[m
[31m-      ** This is atrocious, but the alternatives are much worse.[m
[31m-      */[m
[31m-      /* Round down/up/trunc == 1001/1010/1011. */[m
[31m-      emit_i8(as, 0x09 + fpm);[m
[31m-      emit_mrm(as, XO_ROUNDSD, dest, left);[m
[31m-      if (LJ_64 && as->mcp[1] != (MCode)(XO_ROUNDSD >> 16)) {[m
[31m-	as->mcp[0] = as->mcp[1]; as->mcp[1] = 0x0f;  /* Swap 0F and REX. */[m
[31m-      }[m
[31m-      *--as->mcp = 0x66;  /* 1st byte of ROUNDSD opcode. */[m
[31m-    } else {  /* Call helper functions for SSE2 variant. */[m
[31m-      /* The modified regs must match with the *.dasc implementation. */[m
[31m-      RegSet drop = RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX);[m
[31m-      if (ra_hasreg(ir->r))[m
[31m-	rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-      ra_evictset(as, drop);[m
[31m-      ra_destreg(as, ir, RID_XMM0);[m
[31m-      emit_call(as, fpm == IRFPM_FLOOR ? lj_vm_floor_sse :[m
[31m-		    fpm == IRFPM_CEIL ? lj_vm_ceil_sse : lj_vm_trunc_sse);[m
[31m-      ra_left(as, RID_XMM0, ir->op1);[m
[31m-    }[m
[31m-  } else if (fpm == IRFPM_EXP2 && asm_fpjoin_pow(as, ir)) {[m
[31m-    /* Rejoined to pow(). */[m
[31m-  } else {[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_floor + fpm);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_atan2(as, ir)	asm_callid(as, ir, IRCALL_atan2)[m
[31m-[m
[31m-static void asm_ldexp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  int32_t ofs = sps_scale(ir->s);  /* Use spill slot or temp slots. */[m
[31m-  Reg dest = ir->r;[m
[31m-  if (ra_hasreg(dest)) {[m
[31m-    ra_free(as, dest);[m
[31m-    ra_modified(as, dest);[m
[31m-    emit_rmro(as, XO_MOVSD, dest, RID_ESP, ofs);[m
[31m-  }[m
[31m-  emit_rmro(as, XO_FSTPq, XOg_FSTPq, RID_ESP, ofs);[m
[31m-  emit_x87op(as, XI_FPOP1);[m
[31m-  emit_x87op(as, XI_FSCALE);[m
[31m-  asm_x87load(as, ir->op1);[m
[31m-  asm_x87load(as, ir->op2);[m
[31m-}[m
[31m-[m
[31m-static void asm_fppowi(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  /* The modified regs must match with the *.dasc implementation. */[m
[31m-  RegSet drop = RSET_RANGE(RID_XMM0, RID_XMM1+1)|RID2RSET(RID_EAX);[m
[31m-  if (ra_hasreg(ir->r))[m
[31m-    rset_clear(drop, ir->r);  /* Dest reg handled below. */[m
[31m-  ra_evictset(as, drop);[m
[31m-  ra_destreg(as, ir, RID_XMM0);[m
[31m-  emit_call(as, lj_vm_powi_sse);[m
[31m-  ra_left(as, RID_XMM0, ir->op1);[m
[31m-  ra_left(as, RID_EAX, ir->op2);[m
[31m-}[m
[31m-[m
[31m-static void asm_pow(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_64 && LJ_HASFFI[m
[31m-  if (!irt_isnum(ir->t))[m
[31m-    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 :[m
[31m-					  IRCALL_lj_carith_powu64);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_fppowi(as, ir);[m
[31m-}[m
[31m-[m
[31m-static int asm_swapops(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1);[m
[31m-  IRIns *irr = IR(ir->op2);[m
[31m-  lua_assert(ra_noreg(irr->r));[m
[31m-  if (!irm_iscomm(lj_ir_mode[ir->o]))[m
[31m-    return 0;  /* Can't swap non-commutative operations. */[m
[31m-  if (irref_isk(ir->op2))[m
[31m-    return 0;  /* Don't swap constants to the left. */[m
[31m-  if (ra_hasreg(irl->r))[m
[31m-    return 1;  /* Swap if left already has a register. */[m
[31m-  if (ra_samehint(ir->r, irr->r))[m
[31m-    return 1;  /* Swap if dest and right have matching hints. */[m
[31m-  if (as->curins > as->loopref) {  /* In variant part? */[m
[31m-    if (ir->op2 < as->loopref && !irt_isphi(irr->t))[m
[31m-      return 0;  /* Keep invariants on the right. */[m
[31m-    if (ir->op1 < as->loopref && !irt_isphi(irl->t))[m
[31m-      return 1;  /* Swap invariants to the right. */[m
[31m-  }[m
[31m-  if (opisfusableload(irl->o))[m
[31m-    return 1;  /* Swap fusable loads to the right. */[m
[31m-  return 0;  /* Otherwise don't swap. */[m
[31m-}[m
[31m-[m
[31m-static void asm_fparith(ASMState *as, IRIns *ir, x86Op xo)[m
[31m-{[m
[31m-  IRRef lref = ir->op1;[m
[31m-  IRRef rref = ir->op2;[m
[31m-  RegSet allow = RSET_FPR;[m
[31m-  Reg dest;[m
[31m-  Reg right = IR(rref)->r;[m
[31m-  if (ra_hasreg(right)) {[m
[31m-    rset_clear(allow, right);[m
[31m-    ra_noweak(as, right);[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, allow);[m
[31m-  if (lref == rref) {[m
[31m-    right = dest;[m
[31m-  } else if (ra_noreg(right)) {[m
[31m-    if (asm_swapops(as, ir)) {[m
[31m-      IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-    }[m
[31m-    right = asm_fuseload(as, rref, rset_clear(allow, dest));[m
[31m-  }[m
[31m-  emit_mrm(as, xo, dest, right);[m
[31m-  ra_left(as, dest, lref);[m
[31m-}[m
[31m-[m
[31m-static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa)[m
[31m-{[m
[31m-  IRRef lref = ir->op1;[m
[31m-  IRRef rref = ir->op2;[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg dest, right;[m
[31m-  int32_t k = 0;[m
[31m-  if (as->flagmcp == as->mcp) {  /* Drop test r,r instruction. */[m
[31m-    MCode *p = as->mcp + ((LJ_64 && *as->mcp < XI_TESTb) ? 3 : 2);[m
[31m-    if ((p[1] & 15) < 14) {[m
[31m-      if ((p[1] & 15) >= 12) p[1] -= 4;  /* L <->S, NL <-> NS */[m
[31m-      as->flagmcp = NULL;[m
[31m-      as->mcp = p;[m
[31m-    }  /* else: cannot transform LE/NLE to cc without use of OF. */[m
[31m-  }[m
[31m-  right = IR(rref)->r;[m
[31m-  if (ra_hasreg(right)) {[m
[31m-    rset_clear(allow, right);[m
[31m-    ra_noweak(as, right);[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, allow);[m
[31m-  if (lref == rref) {[m
[31m-    right = dest;[m
[31m-  } else if (ra_noreg(right) && !asm_isk32(as, rref, &k)) {[m
[31m-    if (asm_swapops(as, ir)) {[m
[31m-      IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-    }[m
[31m-    right = asm_fuseloadm(as, rref, rset_clear(allow, dest), irt_is64(ir->t));[m
[31m-  }[m
[31m-  if (irt_isguard(ir->t))  /* For IR_ADDOV etc. */[m
[31m-    asm_guardcc(as, CC_O);[m
[31m-  if (xa != XOg_X_IMUL) {[m
[31m-    if (ra_hasreg(right))[m
[31m-      emit_mrm(as, XO_ARITH(xa), REX_64IR(ir, dest), right);[m
[31m-    else[m
[31m-      emit_gri(as, XG_ARITHi(xa), REX_64IR(ir, dest), k);[m
[31m-  } else if (ra_hasreg(right)) {  /* IMUL r, mrm. */[m
[31m-    emit_mrm(as, XO_IMUL, REX_64IR(ir, dest), right);[m
[31m-  } else {  /* IMUL r, r, k. */[m
[31m-    /* NYI: use lea/shl/add/sub (FOLD only does 2^k) depending on CPU. */[m
[31m-    Reg left = asm_fuseloadm(as, lref, RSET_GPR, irt_is64(ir->t));[m
[31m-    x86Op xo;[m
[31m-    if (checki8(k)) { emit_i8(as, k); xo = XO_IMULi8;[m
[31m-    } else { emit_i32(as, k); xo = XO_IMULi; }[m
[31m-    emit_mrm(as, xo, REX_64IR(ir, dest), left);[m
[31m-    return;[m
[31m-  }[m
[31m-  ra_left(as, dest, lref);[m
[31m-}[m
[31m-[m
[31m-/* LEA is really a 4-operand ADD with an independent destination register,[m
[31m-** up to two source registers and an immediate. One register can be scaled[m
[31m-** by 1, 2, 4 or 8. This can be used to avoid moves or to fuse several[m
[31m-** instructions.[m
[31m-**[m
[31m-** Currently only a few common cases are supported:[m
[31m-** - 3-operand ADD:    y = a+b; y = a+k   with a and b already allocated[m
[31m-** - Left ADD fusion:  y = (a+b)+k; y = (a+k)+b[m
[31m-** - Right ADD fusion: y = a+(b+k)[m
[31m-** The ommited variants have already been reduced by FOLD.[m
[31m-**[m
[31m-** There are more fusion opportunities, like gathering shifts or joining[m
[31m-** common references. But these are probably not worth the trouble, since[m
[31m-** array indexing is not decomposed and already makes use of all fields[m
[31m-** of the ModRM operand.[m
[31m-*/[m
[31m-static int asm_lea(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  IRIns *irl = IR(ir->op1);[m
[31m-  IRIns *irr = IR(ir->op2);[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg dest;[m
[31m-  as->mrm.base = as->mrm.idx = RID_NONE;[m
[31m-  as->mrm.scale = XM_SCALE1;[m
[31m-  as->mrm.ofs = 0;[m
[31m-  if (ra_hasreg(irl->r)) {[m
[31m-    rset_clear(allow, irl->r);[m
[31m-    ra_noweak(as, irl->r);[m
[31m-    as->mrm.base = irl->r;[m
[31m-    if (irref_isk(ir->op2) || ra_hasreg(irr->r)) {[m
[31m-      /* The PHI renaming logic does a better job in some cases. */[m
[31m-      if (ra_hasreg(ir->r) &&[m
[31m-	  ((irt_isphi(irl->t) && as->phireg[ir->r] == ir->op1) ||[m
[31m-	   (irt_isphi(irr->t) && as->phireg[ir->r] == ir->op2)))[m
[31m-	return 0;[m
[31m-      if (irref_isk(ir->op2)) {[m
[31m-	as->mrm.ofs = irr->i;[m
[31m-      } else {[m
[31m-	rset_clear(allow, irr->r);[m
[31m-	ra_noweak(as, irr->r);[m
[31m-	as->mrm.idx = irr->r;[m
[31m-      }[m
[31m-    } else if (irr->o == IR_ADD && mayfuse(as, ir->op2) &&[m
[31m-	       irref_isk(irr->op2)) {[m
[31m-      Reg idx = ra_alloc1(as, irr->op1, allow);[m
[31m-      rset_clear(allow, idx);[m
[31m-      as->mrm.idx = (uint8_t)idx;[m
[31m-      as->mrm.ofs = IR(irr->op2)->i;[m
[31m-    } else {[m
[31m-      return 0;[m
[31m-    }[m
[31m-  } else if (ir->op1 != ir->op2 && irl->o == IR_ADD && mayfuse(as, ir->op1) &&[m
[31m-	     (irref_isk(ir->op2) || irref_isk(irl->op2))) {[m
[31m-    Reg idx, base = ra_alloc1(as, irl->op1, allow);[m
[31m-    rset_clear(allow, base);[m
[31m-    as->mrm.base = (uint8_t)base;[m
[31m-    if (irref_isk(ir->op2)) {[m
[31m-      as->mrm.ofs = irr->i;[m
[31m-      idx = ra_alloc1(as, irl->op2, allow);[m
[31m-    } else {[m
[31m-      as->mrm.ofs = IR(irl->op2)->i;[m
[31m-      idx = ra_alloc1(as, ir->op2, allow);[m
[31m-    }[m
[31m-    rset_clear(allow, idx);[m
[31m-    as->mrm.idx = (uint8_t)idx;[m
[31m-  } else {[m
[31m-    return 0;[m
[31m-  }[m
[31m-  dest = ra_dest(as, ir, allow);[m
[31m-  emit_mrm(as, XO_LEA, dest, RID_MRM);[m
[31m-  return 1;  /* Success. */[m
[31m-}[m
[31m-[m
[31m-static void asm_add(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_ADDSD);[m
[31m-  else if ((as->flags & JIT_F_LEA_AGU) || as->flagmcp == as->mcp ||[m
[31m-	   irt_is64(ir->t) || !asm_lea(as, ir))[m
[31m-    asm_intarith(as, ir, XOg_ADD);[m
[31m-}[m
[31m-[m
[31m-static void asm_sub(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_SUBSD);[m
[31m-  else  /* Note: no need for LEA trick here. i-k is encoded as i+(-k). */[m
[31m-    asm_intarith(as, ir, XOg_SUB);[m
[31m-}[m
[31m-[m
[31m-static void asm_mul(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_MULSD);[m
[31m-  else[m
[31m-    asm_intarith(as, ir, XOg_X_IMUL);[m
[31m-}[m
[31m-[m
[31m-static void asm_div(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_64 && LJ_HASFFI[m
[31m-  if (!irt_isnum(ir->t))[m
[31m-    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 :[m
[31m-					  IRCALL_lj_carith_divu64);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_fparith(as, ir, XO_DIVSD);[m
[31m-}[m
[31m-[m
[31m-static void asm_mod(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_64 && LJ_HASFFI[m
[31m-  if (!irt_isint(ir->t))[m
[31m-    asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 :[m
[31m-					  IRCALL_lj_carith_modu64);[m
[31m-  else[m
[31m-#endif[m
[31m-    asm_callid(as, ir, IRCALL_lj_vm_modi);[m
[31m-}[m
[31m-[m
[31m-static void asm_neg_not(ASMState *as, IRIns *ir, x86Group3 xg)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  emit_rr(as, XO_GROUP3, REX_64IR(ir, xg), dest);[m
[31m-  ra_left(as, dest, ir->op1);[m
[31m-}[m
[31m-[m
[31m-static void asm_neg(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_XORPS);[m
[31m-  else[m
[31m-    asm_neg_not(as, ir, XOg_NEG);[m
[31m-}[m
[31m-[m
[31m-#define asm_abs(as, ir)		asm_fparith(as, ir, XO_ANDPS)[m
[31m-[m
[31m-static void asm_intmin_max(ASMState *as, IRIns *ir, int cc)[m
[31m-{[m
[31m-  Reg right, dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  IRRef lref = ir->op1, rref = ir->op2;[m
[31m-  if (irref_isk(rref)) { lref = rref; rref = ir->op1; }[m
[31m-  right = ra_alloc1(as, rref, rset_exclude(RSET_GPR, dest));[m
[31m-  emit_rr(as, XO_CMOV + (cc<<24), REX_64IR(ir, dest), right);[m
[31m-  emit_rr(as, XO_CMP, REX_64IR(ir, dest), right);[m
[31m-  ra_left(as, dest, lref);[m
[31m-}[m
[31m-[m
[31m-static void asm_min(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_MINSD);[m
[31m-  else[m
[31m-    asm_intmin_max(as, ir, CC_G);[m
[31m-}[m
[31m-[m
[31m-static void asm_max(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  if (irt_isnum(ir->t))[m
[31m-    asm_fparith(as, ir, XO_MAXSD);[m
[31m-  else[m
[31m-    asm_intmin_max(as, ir, CC_L);[m
[31m-}[m
[31m-[m
[31m-/* Note: don't use LEA for overflow-checking arithmetic! */[m
[31m-#define asm_addov(as, ir)	asm_intarith(as, ir, XOg_ADD)[m
[31m-#define asm_subov(as, ir)	asm_intarith(as, ir, XOg_SUB)[m
[31m-#define asm_mulov(as, ir)	asm_intarith(as, ir, XOg_X_IMUL)[m
[31m-[m
[31m-#define asm_bnot(as, ir)	asm_neg_not(as, ir, XOg_NOT)[m
[31m-[m
[31m-static void asm_bswap(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-  as->mcp = emit_op(XO_BSWAP + ((dest&7) << 24),[m
[31m-		    REX_64IR(ir, 0), dest, 0, as->mcp, 1);[m
[31m-  ra_left(as, dest, ir->op1);[m
[31m-}[m
[31m-[m
[31m-#define asm_band(as, ir)	asm_intarith(as, ir, XOg_AND)[m
[31m-#define asm_bor(as, ir)		asm_intarith(as, ir, XOg_OR)[m
[31m-#define asm_bxor(as, ir)	asm_intarith(as, ir, XOg_XOR)[m
[31m-[m
[31m-static void asm_bitshift(ASMState *as, IRIns *ir, x86Shift xs, x86Op xv)[m
[31m-{[m
[31m-  IRRef rref = ir->op2;[m
[31m-  IRIns *irr = IR(rref);[m
[31m-  Reg dest;[m
[31m-  if (irref_isk(rref)) {  /* Constant shifts. */[m
[31m-    int shift;[m
[31m-    dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    shift = irr->i & (irt_is64(ir->t) ? 63 : 31);[m
[31m-    if (!xv && shift && (as->flags & JIT_F_BMI2)) {[m
[31m-      Reg left = asm_fuseloadm(as, ir->op1, RSET_GPR, irt_is64(ir->t));[m
[31m-      if (left != dest) {  /* BMI2 rotate right by constant. */[m
[31m-	emit_i8(as, xs == XOg_ROL ? -shift : shift);[m
[31m-	emit_mrm(as, VEX_64IR(ir, XV_RORX), dest, left);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    switch (shift) {[m
[31m-    case 0: break;[m
[31m-    case 1: emit_rr(as, XO_SHIFT1, REX_64IR(ir, xs), dest); break;[m
[31m-    default: emit_shifti(as, REX_64IR(ir, xs), dest, shift); break;[m
[31m-    }[m
[31m-  } else if ((as->flags & JIT_F_BMI2) && xv) {	/* BMI2 variable shifts. */[m
[31m-    Reg left, right;[m
[31m-    dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    right = ra_alloc1(as, rref, RSET_GPR);[m
[31m-    left = asm_fuseloadm(as, ir->op1, rset_exclude(RSET_GPR, right),[m
[31m-			 irt_is64(ir->t));[m
[31m-    emit_mrm(as, VEX_64IR(ir, xv) ^ (right << 19), dest, left);[m
[31m-    return;[m
[31m-  } else {  /* Variable shifts implicitly use register cl (i.e. ecx). */[m
[31m-    Reg right;[m
[31m-    dest = ra_dest(as, ir, rset_exclude(RSET_GPR, RID_ECX));[m
[31m-    if (dest == RID_ECX) {[m
[31m-      dest = ra_scratch(as, rset_exclude(RSET_GPR, RID_ECX));[m
[31m-      emit_rr(as, XO_MOV, RID_ECX, dest);[m
[31m-    }[m
[31m-    right = irr->r;[m
[31m-    if (ra_noreg(right))[m
[31m-      right = ra_allocref(as, rref, RID2RSET(RID_ECX));[m
[31m-    else if (right != RID_ECX)[m
[31m-      ra_scratch(as, RID2RSET(RID_ECX));[m
[31m-    emit_rr(as, XO_SHIFTcl, REX_64IR(ir, xs), dest);[m
[31m-    ra_noweak(as, right);[m
[31m-    if (right != RID_ECX)[m
[31m-      emit_rr(as, XO_MOV, RID_ECX, right);[m
[31m-  }[m
[31m-  ra_left(as, dest, ir->op1);[m
[31m-  /*[m
[31m-  ** Note: avoid using the flags resulting from a shift or rotate![m
[31m-  ** All of them cause a partial flag stall, except for r,1 shifts[m
[31m-  ** (but not rotates). And a shift count of 0 leaves the flags unmodified.[m
[31m-  */[m
[31m-}[m
[31m-[m
[31m-#define asm_bshl(as, ir)	asm_bitshift(as, ir, XOg_SHL, XV_SHLX)[m
[31m-#define asm_bshr(as, ir)	asm_bitshift(as, ir, XOg_SHR, XV_SHRX)[m
[31m-#define asm_bsar(as, ir)	asm_bitshift(as, ir, XOg_SAR, XV_SARX)[m
[31m-#define asm_brol(as, ir)	asm_bitshift(as, ir, XOg_ROL, 0)[m
[31m-#define asm_bror(as, ir)	asm_bitshift(as, ir, XOg_ROR, 0)[m
[31m-[m
[31m-/* -- Comparisons --------------------------------------------------------- */[m
[31m-[m
[31m-/* Virtual flags for unordered FP comparisons. */[m
[31m-#define VCC_U	0x1000		/* Unordered. */[m
[31m-#define VCC_P	0x2000		/* Needs extra CC_P branch. */[m
[31m-#define VCC_S	0x4000		/* Swap avoids CC_P branch. */[m
[31m-#define VCC_PS	(VCC_P|VCC_S)[m
[31m-[m
[31m-/* Map of comparisons to flags. ORDER IR. */[m
[31m-#define COMPFLAGS(ci, cin, cu, cf)	((ci)+((cu)<<4)+((cin)<<8)+(cf))[m
[31m-static const uint16_t asm_compmap[IR_ABC+1] = {[m
[31m-  /*                 signed non-eq unsigned flags */[m
[31m-  /* LT  */ COMPFLAGS(CC_GE, CC_G,  CC_AE, VCC_PS),[m
[31m-  /* GE  */ COMPFLAGS(CC_L,  CC_L,  CC_B,  0),[m
[31m-  /* LE  */ COMPFLAGS(CC_G,  CC_G,  CC_A,  VCC_PS),[m
[31m-  /* GT  */ COMPFLAGS(CC_LE, CC_L,  CC_BE, 0),[m
[31m-  /* ULT */ COMPFLAGS(CC_AE, CC_A,  CC_AE, VCC_U),[m
[31m-  /* UGE */ COMPFLAGS(CC_B,  CC_B,  CC_B,  VCC_U|VCC_PS),[m
[31m-  /* ULE */ COMPFLAGS(CC_A,  CC_A,  CC_A,  VCC_U),[m
[31m-  /* UGT */ COMPFLAGS(CC_BE, CC_B,  CC_BE, VCC_U|VCC_PS),[m
[31m-  /* EQ  */ COMPFLAGS(CC_NE, CC_NE, CC_NE, VCC_P),[m
[31m-  /* NE  */ COMPFLAGS(CC_E,  CC_E,  CC_E,  VCC_U|VCC_P),[m
[31m-  /* ABC */ COMPFLAGS(CC_BE, CC_B,  CC_BE, VCC_U|VCC_PS)  /* Same as UGT. */[m
[31m-};[m
[31m-[m
[31m-/* FP and integer comparisons. */[m
[31m-static void asm_comp(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  uint32_t cc = asm_compmap[ir->o];[m
[31m-  if (irt_isnum(ir->t)) {[m
[31m-    IRRef lref = ir->op1;[m
[31m-    IRRef rref = ir->op2;[m
[31m-    Reg left, right;[m
[31m-    MCLabel l_around;[m
[31m-    /*[m
[31m-    ** An extra CC_P branch is required to preserve ordered/unordered[m
[31m-    ** semantics for FP comparisons. This can be avoided by swapping[m
[31m-    ** the operands and inverting the condition (except for EQ and UNE).[m
[31m-    ** So always try to swap if possible.[m
[31m-    **[m
[31m-    ** Another option would be to swap operands to achieve better memory[m
[31m-    ** operand fusion. But it's unlikely that this outweighs the cost[m
[31m-    ** of the extra branches.[m
[31m-    */[m
[31m-    if (cc & VCC_S) {  /* Swap? */[m
[31m-      IRRef tmp = lref; lref = rref; rref = tmp;[m
[31m-      cc ^= (VCC_PS|(5<<4));  /* A <-> B, AE <-> BE, PS <-> none */[m
[31m-    }[m
[31m-    left = ra_alloc1(as, lref, RSET_FPR);[m
[31m-    right = asm_fuseload(as, rref, rset_exclude(RSET_FPR, left));[m
[31m-    l_around = emit_label(as);[m
[31m-    asm_guardcc(as, cc >> 4);[m
[31m-    if (cc & VCC_P) {  /* Extra CC_P branch required? */[m
[31m-      if (!(cc & VCC_U)) {[m
[31m-	asm_guardcc(as, CC_P);  /* Branch to exit for ordered comparisons. */[m
[31m-      } else if (l_around != as->invmcp) {[m
[31m-	emit_sjcc(as, CC_P, l_around);  /* Branch around for unordered. */[m
[31m-      } else {[m
[31m-	/* Patched to mcloop by asm_loop_fixup. */[m
[31m-	as->loopinv = 2;[m
[31m-	if (as->realign)[m
[31m-	  emit_sjcc(as, CC_P, as->mcp);[m
[31m-	else[m
[31m-	  emit_jcc(as, CC_P, as->mcp);[m
[31m-      }[m
[31m-    }[m
[31m-    emit_mrm(as, XO_UCOMISD, left, right);[m
[31m-  } else {[m
[31m-    IRRef lref = ir->op1, rref = ir->op2;[m
[31m-    IROp leftop = (IROp)(IR(lref)->o);[m
[31m-    Reg r64 = REX_64IR(ir, 0);[m
[31m-    int32_t imm = 0;[m
[31m-    lua_assert(irt_is64(ir->t) || irt_isint(ir->t) ||[m
[31m-	       irt_isu32(ir->t) || irt_isaddr(ir->t) || irt_isu8(ir->t));[m
[31m-    /* Swap constants (only for ABC) and fusable loads to the right. */[m
[31m-    if (irref_isk(lref) || (!irref_isk(rref) && opisfusableload(leftop))) {[m
[31m-      if ((cc & 0xc) == 0xc) cc ^= 0x53;  /* L <-> G, LE <-> GE */[m
[31m-      else if ((cc & 0xa) == 0x2) cc ^= 0x55;  /* A <-> B, AE <-> BE */[m
[31m-      lref = ir->op2; rref = ir->op1;[m
[31m-    }[m
[31m-    if (asm_isk32(as, rref, &imm)) {[m
[31m-      IRIns *irl = IR(lref);[m
[31m-      /* Check wether we can use test ins. Not for unsigned, since CF=0. */[m
[31m-      int usetest = (imm == 0 && (cc & 0xa) != 0x2);[m
[31m-      if (usetest && irl->o == IR_BAND && irl+1 == ir && !ra_used(irl)) {[m
[31m-	/* Combine comp(BAND(ref, r/imm), 0) into test mrm, r/imm. */[m
[31m-	Reg right, left = RID_NONE;[m
[31m-	RegSet allow = RSET_GPR;[m
[31m-	if (!asm_isk32(as, irl->op2, &imm)) {[m
[31m-	  left = ra_alloc1(as, irl->op2, allow);[m
[31m-	  rset_clear(allow, left);[m
[31m-	} else {  /* Try to Fuse IRT_I8/IRT_U8 loads, too. See below. */[m
[31m-	  IRIns *irll = IR(irl->op1);[m
[31m-	  if (opisfusableload((IROp)irll->o) &&[m
[31m-	      (irt_isi8(irll->t) || irt_isu8(irll->t))) {[m
[31m-	    IRType1 origt = irll->t;  /* Temporarily flip types. */[m
[31m-	    irll->t.irt = (irll->t.irt & ~IRT_TYPE) | IRT_INT;[m
[31m-	    as->curins--;  /* Skip to BAND to avoid failing in noconflict(). */[m
[31m-	    right = asm_fuseload(as, irl->op1, RSET_GPR);[m
[31m-	    as->curins++;[m
[31m-	    irll->t = origt;[m
[31m-	    if (right != RID_MRM) goto test_nofuse;[m
[31m-	    /* Fusion succeeded, emit test byte mrm, imm8. */[m
[31m-	    asm_guardcc(as, cc);[m
[31m-	    emit_i8(as, (imm & 0xff));[m
[31m-	    emit_mrm(as, XO_GROUP3b, XOg_TEST, RID_MRM);[m
[31m-	    return;[m
[31m-	  }[m
[31m-	}[m
[31m-	as->curins--;  /* Skip to BAND to avoid failing in noconflict(). */[m
[31m-	right = asm_fuseloadm(as, irl->op1, allow, r64);[m
[31m-	as->curins++;  /* Undo the above. */[m
[31m-      test_nofuse:[m
[31m-	asm_guardcc(as, cc);[m
[31m-	if (ra_noreg(left)) {[m
[31m-	  emit_i32(as, imm);[m
[31m-	  emit_mrm(as, XO_GROUP3, r64 + XOg_TEST, right);[m
[31m-	} else {[m
[31m-	  emit_mrm(as, XO_TEST, r64 + left, right);[m
[31m-	}[m
[31m-      } else {[m
[31m-	Reg left;[m
[31m-	if (opisfusableload((IROp)irl->o) &&[m
[31m-	    ((irt_isu8(irl->t) && checku8(imm)) ||[m
[31m-	     ((irt_isi8(irl->t) || irt_isi16(irl->t)) && checki8(imm)) ||[m
[31m-	     (irt_isu16(irl->t) && checku16(imm) && checki8((int16_t)imm)))) {[m
[31m-	  /* Only the IRT_INT case is fused by asm_fuseload.[m
[31m-	  ** The IRT_I8/IRT_U8 loads and some IRT_I16/IRT_U16 loads[m
[31m-	  ** are handled here.[m
[31m-	  ** Note that cmp word [mem], imm16 should not be generated,[m
[31m-	  ** since it has a length-changing prefix. Compares of a word[m
[31m-	  ** against a sign-extended imm8 are ok, however.[m
[31m-	  */[m
[31m-	  IRType1 origt = irl->t;  /* Temporarily flip types. */[m
[31m-	  irl->t.irt = (irl->t.irt & ~IRT_TYPE) | IRT_INT;[m
[31m-	  left = asm_fuseload(as, lref, RSET_GPR);[m
[31m-	  irl->t = origt;[m
[31m-	  if (left == RID_MRM) {  /* Fusion succeeded? */[m
[31m-	    if (irt_isu8(irl->t) || irt_isu16(irl->t))[m
[31m-	      cc >>= 4;  /* Need unsigned compare. */[m
[31m-	    asm_guardcc(as, cc);[m
[31m-	    emit_i8(as, imm);[m
[31m-	    emit_mrm(as, (irt_isi8(origt) || irt_isu8(origt)) ?[m
[31m-			 XO_ARITHib : XO_ARITHiw8, r64 + XOg_CMP, RID_MRM);[m
[31m-	    return;[m
[31m-	  }  /* Otherwise handle register case as usual. */[m
[31m-	} else {[m
[31m-	  left = asm_fuseloadm(as, lref,[m
[31m-			       irt_isu8(ir->t) ? RSET_GPR8 : RSET_GPR, r64);[m
[31m-	}[m
[31m-	asm_guardcc(as, cc);[m
[31m-	if (usetest && left != RID_MRM) {[m
[31m-	  /* Use test r,r instead of cmp r,0. */[m
[31m-	  x86Op xo = XO_TEST;[m
[31m-	  if (irt_isu8(ir->t)) {[m
[31m-	    lua_assert(ir->o == IR_EQ || ir->o == IR_NE);[m
[31m-	    xo = XO_TESTb;[m
[31m-	    if (!rset_test(RSET_RANGE(RID_EAX, RID_EBX+1), left)) {[m
[31m-	      if (LJ_64) {[m
[31m-		left |= FORCE_REX;[m
[31m-	      } else {[m
[31m-		emit_i32(as, 0xff);[m
[31m-		emit_mrm(as, XO_GROUP3, XOg_TEST, left);[m
[31m-		return;[m
[31m-	      }[m
[31m-	    }[m
[31m-	  }[m
[31m-	  emit_rr(as, xo, r64 + left, left);[m
[31m-	  if (irl+1 == ir)  /* Referencing previous ins? */[m
[31m-	    as->flagmcp = as->mcp;  /* Set flag to drop test r,r if possible. */[m
[31m-	} else {[m
[31m-	  emit_gmrmi(as, XG_ARITHi(XOg_CMP), r64 + left, imm);[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      Reg left = ra_alloc1(as, lref, RSET_GPR);[m
[31m-      Reg right = asm_fuseloadm(as, rref, rset_exclude(RSET_GPR, left), r64);[m
[31m-      asm_guardcc(as, cc);[m
[31m-      emit_mrm(as, XO_CMP, r64 + left, right);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define asm_equal(as, ir)	asm_comp(as, ir)[m
[31m-[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-/* 64 bit integer comparisons in 32 bit mode. */[m
[31m-static void asm_comp_int64(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  uint32_t cc = asm_compmap[(ir-1)->o];[m
[31m-  RegSet allow = RSET_GPR;[m
[31m-  Reg lefthi = RID_NONE, leftlo = RID_NONE;[m
[31m-  Reg righthi = RID_NONE, rightlo = RID_NONE;[m
[31m-  MCLabel l_around;[m
[31m-  x86ModRM mrm;[m
[31m-[m
[31m-  as->curins--;  /* Skip loword ins. Avoids failing in noconflict(), too. */[m
[31m-[m
[31m-  /* Allocate/fuse hiword operands. */[m
[31m-  if (irref_isk(ir->op2)) {[m
[31m-    lefthi = asm_fuseload(as, ir->op1, allow);[m
[31m-  } else {[m
[31m-    lefthi = ra_alloc1(as, ir->op1, allow);[m
[31m-    rset_clear(allow, lefthi);[m
[31m-    righthi = asm_fuseload(as, ir->op2, allow);[m
[31m-    if (righthi == RID_MRM) {[m
[31m-      if (as->mrm.base != RID_NONE) rset_clear(allow, as->mrm.base);[m
[31m-      if (as->mrm.idx != RID_NONE) rset_clear(allow, as->mrm.idx);[m
[31m-    } else {[m
[31m-      rset_clear(allow, righthi);[m
[31m-    }[m
[31m-  }[m
[31m-  mrm = as->mrm;  /* Save state for hiword instruction. */[m
[31m-[m
[31m-  /* Allocate/fuse loword operands. */[m
[31m-  if (irref_isk((ir-1)->op2)) {[m
[31m-    leftlo = asm_fuseload(as, (ir-1)->op1, allow);[m
[31m-  } else {[m
[31m-    leftlo = ra_alloc1(as, (ir-1)->op1, allow);[m
[31m-    rset_clear(allow, leftlo);[m
[31m-    rightlo = asm_fuseload(as, (ir-1)->op2, allow);[m
[31m-  }[m
[31m-[m
[31m-  /* All register allocations must be performed _before_ this point. */[m
[31m-  l_around = emit_label(as);[m
[31m-  as->invmcp = as->flagmcp = NULL;  /* Cannot use these optimizations. */[m
[31m-[m
[31m-  /* Loword comparison and branch. */[m
[31m-  asm_guardcc(as, cc >> 4);  /* Always use unsigned compare for loword. */[m
[31m-  if (ra_noreg(rightlo)) {[m
[31m-    int32_t imm = IR((ir-1)->op2)->i;[m
[31m-    if (imm == 0 && ((cc >> 4) & 0xa) != 0x2 && leftlo != RID_MRM)[m
[31m-      emit_rr(as, XO_TEST, leftlo, leftlo);[m
[31m-    else[m
[31m-      emit_gmrmi(as, XG_ARITHi(XOg_CMP), leftlo, imm);[m
[31m-  } else {[m
[31m-    emit_mrm(as, XO_CMP, leftlo, rightlo);[m
[31m-  }[m
[31m-[m
[31m-  /* Hiword comparison and branches. */[m
[31m-  if ((cc & 15) != CC_NE)[m
[31m-    emit_sjcc(as, CC_NE, l_around);  /* Hiword unequal: skip loword compare. */[m
[31m-  if ((cc & 15) != CC_E)[m
[31m-    asm_guardcc(as, cc >> 8);  /* Hiword compare without equality check. */[m
[31m-  as->mrm = mrm;  /* Restore state. */[m
[31m-  if (ra_noreg(righthi)) {[m
[31m-    int32_t imm = IR(ir->op2)->i;[m
[31m-    if (imm == 0 && (cc & 0xa) != 0x2 && lefthi != RID_MRM)[m
[31m-      emit_rr(as, XO_TEST, lefthi, lefthi);[m
[31m-    else[m
[31m-      emit_gmrmi(as, XG_ARITHi(XOg_CMP), lefthi, imm);[m
[31m-  } else {[m
[31m-    emit_mrm(as, XO_CMP, lefthi, righthi);[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */[m
[31m-[m
[31m-/* Hiword op of a split 64 bit op. Previous op must be the loword op. */[m
[31m-static void asm_hiop(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-  /* HIOP is marked as a store because it needs its own DCE logic. */[m
[31m-  int uselo = ra_used(ir-1), usehi = ra_used(ir);  /* Loword/hiword used? */[m
[31m-  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;[m
[31m-  if ((ir-1)->o == IR_CONV) {  /* Conversions to/from 64 bit. */[m
[31m-    as->curins--;  /* Always skip the CONV. */[m
[31m-    if (usehi || uselo)[m
[31m-      asm_conv64(as, ir);[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o <= IR_NE) {  /* 64 bit integer comparisons. ORDER IR. */[m
[31m-    asm_comp_int64(as, ir);[m
[31m-    return;[m
[31m-  } else if ((ir-1)->o == IR_XSTORE) {[m
[31m-    if ((ir-1)->r != RID_SINK)[m
[31m-      asm_fxstore(as, ir);[m
[31m-    return;[m
[31m-  }[m
[31m-  if (!usehi) return;  /* Skip unused hiword op for all remaining ops. */[m
[31m-  switch ((ir-1)->o) {[m
[31m-  case IR_ADD:[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->curins--;[m
[31m-    asm_intarith(as, ir, XOg_ADC);[m
[31m-    asm_intarith(as, ir-1, XOg_ADD);[m
[31m-    break;[m
[31m-  case IR_SUB:[m
[31m-    as->flagmcp = NULL;[m
[31m-    as->curins--;[m
[31m-    asm_intarith(as, ir, XOg_SBB);[m
[31m-    asm_intarith(as, ir-1, XOg_SUB);[m
[31m-    break;[m
[31m-  case IR_NEG: {[m
[31m-    Reg dest = ra_dest(as, ir, RSET_GPR);[m
[31m-    emit_rr(as, XO_GROUP3, XOg_NEG, dest);[m
[31m-    emit_i8(as, 0);[m
[31m-    emit_rr(as, XO_ARITHi8, XOg_ADC, dest);[m
[31m-    ra_left(as, dest, ir->op1);[m
[31m-    as->curins--;[m
[31m-    asm_neg_not(as, ir-1, XOg_NEG);[m
[31m-    break;[m
[31m-    }[m
[31m-  case IR_CALLN:[m
[31m-  case IR_CALLXS:[m
[31m-    if (!uselo)[m
[31m-      ra_allocref(as, ir->op1, RID2RSET(RID_RETLO));  /* Mark lo op as used. */[m
[31m-    break;[m
[31m-  case IR_CNEWI:[m
[31m-    /* Nothing to do here. Handled by CNEWI itself. */[m
[31m-    break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(as); UNUSED(ir); lua_assert(0);  /* Unused on x64 or without FFI. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-static void asm_prof(ASMState *as, IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  asm_guardcc(as, CC_NE);[m
[31m-  emit_i8(as, HOOK_PROFILE);[m
[31m-  emit_rma(as, XO_GROUP3b, XOg_TEST, &J2G(as->J)->hookmask);[m
[31m-}[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check Lua stack size for overflow. Use exit handler as fallback. */[m
[31m-static void asm_stack_check(ASMState *as, BCReg topslot,[m
[31m-			    IRIns *irp, RegSet allow, ExitNo exitno)[m
[31m-{[m
[31m-  /* Try to get an unused temp. register, otherwise spill/restore eax. */[m
[31m-  Reg pbase = irp ? irp->r : RID_BASE;[m
[31m-  Reg r = allow ? rset_pickbot(allow) : RID_EAX;[m
[31m-  emit_jcc(as, CC_B, exitstub_addr(as->J, exitno));[m
[31m-  if (allow == RSET_EMPTY)  /* Restore temp. register. */[m
[31m-    emit_rmro(as, XO_MOV, r|REX_64, RID_ESP, 0);[m
[31m-  else[m
[31m-    ra_modified(as, r);[m
[31m-  emit_gri(as, XG_ARITHi(XOg_CMP), r, (int32_t)(8*topslot));[m
[31m-  if (ra_hasreg(pbase) && pbase != r)[m
[31m-    emit_rr(as, XO_ARITH(XOg_SUB), r, pbase);[m
[31m-  else[m
[31m-    emit_rmro(as, XO_ARITH(XOg_SUB), r, RID_NONE,[m
[31m-	      ptr2addr(&J2G(as->J)->jit_base));[m
[31m-  emit_rmro(as, XO_MOV, r, r, offsetof(lua_State, maxstack));[m
[31m-  emit_getgl(as, r, cur_L);[m
[31m-  if (allow == RSET_EMPTY)  /* Spill temp. register. */[m
[31m-    emit_rmro(as, XO_MOVto, r|REX_64, RID_ESP, 0);[m
[31m-}[m
[31m-[m
[31m-/* Restore Lua stack from on-trace state. */[m
[31m-static void asm_stack_restore(ASMState *as, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &as->T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  /* Store the value of all modified slots to the Lua stack. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    int32_t ofs = 8*((int32_t)s-1);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if ((sn & SNAP_NORESTORE))[m
[31m-      continue;[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-      Reg src = ra_alloc1(as, ref, RSET_FPR);[m
[31m-      emit_rmro(as, XO_MOVSDto, src, RID_BASE, ofs);[m
[31m-    } else {[m
[31m-      lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) ||[m
[31m-		 (LJ_DUALNUM && irt_isinteger(ir->t)));[m
[31m-      if (!irref_isk(ref)) {[m
[31m-	Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, RID_BASE));[m
[31m-	emit_movtomro(as, REX_64IR(ir, src), RID_BASE, ofs);[m
[31m-      } else if (!irt_ispri(ir->t)) {[m
[31m-	emit_movmroi(as, RID_BASE, ofs, ir->i);[m
[31m-      }[m
[31m-      if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	if (s != 0)  /* Do not overwrite link to previous frame. */[m
[31m-	  emit_movmroi(as, RID_BASE, ofs+4, (int32_t)(*flinks--));[m
[31m-      } else {[m
[31m-	if (!(LJ_64 && irt_islightud(ir->t)))[m
[31m-	  emit_movmroi(as, RID_BASE, ofs+4, irt_toitype(ir->t));[m
[31m-      }[m
[31m-    }[m
[31m-    checkmclim(as);[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-}[m
[31m-[m
[31m-/* -- GC handling --------------------------------------------------------- */[m
[31m-[m
[31m-/* Check GC threshold and do one or more GC steps. */[m
[31m-static void asm_gc_check(ASMState *as)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit];[m
[31m-  IRRef args[2];[m
[31m-  MCLabel l_end;[m
[31m-  Reg tmp;[m
[31m-  ra_evictset(as, RSET_SCRATCH);[m
[31m-  l_end = emit_label(as);[m
[31m-  /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */[m
[31m-  asm_guardcc(as, CC_NE);  /* Assumes asm_snap_prep() already done. */[m
[31m-  emit_rr(as, XO_TEST, RID_RET, RID_RET);[m
[31m-  args[0] = ASMREF_TMP1;  /* global_State *g */[m
[31m-  args[1] = ASMREF_TMP2;  /* MSize steps     */[m
[31m-  asm_gencall(as, ci, args);[m
[31m-  tmp = ra_releasetmp(as, ASMREF_TMP1);[m
[31m-  emit_loada(as, tmp, J2G(as->J));[m
[31m-  emit_loadi(as, ra_releasetmp(as, ASMREF_TMP2), as->gcsteps);[m
[31m-  /* Jump around GC step if GC total < GC threshold. */[m
[31m-  emit_sjcc(as, CC_B, l_end);[m
[31m-  emit_opgl(as, XO_ARITH(XOg_CMP), tmp, gc.threshold);[m
[31m-  emit_getgl(as, tmp, gc.total);[m
[31m-  as->gcsteps = 0;[m
[31m-  checkmclim(as);[m
[31m-}[m
[31m-[m
[31m-/* -- Loop handling ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the loop branch. */[m
[31m-static void asm_loop_fixup(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target = as->mcp;[m
[31m-  if (as->realign) {  /* Realigned loops use short jumps. */[m
[31m-    as->realign = NULL;  /* Stop another retry. */[m
[31m-    lua_assert(((intptr_t)target & 15) == 0);[m
[31m-    if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-      p -= 5;[m
[31m-      p[0] = XI_JMP;[m
[31m-      lua_assert(target - p >= -128);[m
[31m-      p[-1] = (MCode)(target - p);  /* Patch sjcc. */[m
[31m-      if (as->loopinv == 2)[m
[31m-	p[-3] = (MCode)(target - p + 2);  /* Patch opt. short jp. */[m
[31m-    } else {[m
[31m-      lua_assert(target - p >= -128);[m
[31m-      p[-1] = (MCode)(int8_t)(target - p);  /* Patch short jmp. */[m
[31m-      p[-2] = XI_JMPs;[m
[31m-    }[m
[31m-  } else {[m
[31m-    MCode *newloop;[m
[31m-    p[-5] = XI_JMP;[m
[31m-    if (as->loopinv) {  /* Inverted loop branch? */[m
[31m-      /* asm_guardcc already inverted the jcc and patched the jmp. */[m
[31m-      p -= 5;[m
[31m-      newloop = target+4;[m
[31m-      *(int32_t *)(p-4) = (int32_t)(target - p);  /* Patch jcc. */[m
[31m-      if (as->loopinv == 2) {[m
[31m-	*(int32_t *)(p-10) = (int32_t)(target - p + 6);  /* Patch opt. jp. */[m
[31m-	newloop = target+8;[m
[31m-      }[m
[31m-    } else {  /* Otherwise just patch jmp. */[m
[31m-      *(int32_t *)(p-4) = (int32_t)(target - p);[m
[31m-      newloop = target+3;[m
[31m-    }[m
[31m-    /* Realign small loops and shorten the loop branch. */[m
[31m-    if (newloop >= p - 128) {[m
[31m-      as->realign = newloop;  /* Force a retry and remember alignment. */[m
[31m-      as->curins = as->stopins;  /* Abort asm_trace now. */[m
[31m-      as->T->nins = as->orignins;  /* Remove any added renames. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Head of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Coalesce BASE register for a root trace. */[m
[31m-static void asm_head_root_base(ASMState *as)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (r != RID_BASE)[m
[31m-      emit_rr(as, XO_MOV, r, RID_BASE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Coalesce or reload BASE register for a side trace. */[m
[31m-static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)[m
[31m-{[m
[31m-  IRIns *ir = IR(REF_BASE);[m
[31m-  Reg r = ir->r;[m
[31m-  if (ra_hasreg(r)) {[m
[31m-    ra_free(as, r);[m
[31m-    if (rset_test(as->modset, r) || irt_ismarked(ir->t))[m
[31m-      ir->r = RID_INIT;  /* No inheritance for modified BASE register. */[m
[31m-    if (irp->r == r) {[m
[31m-      rset_clear(allow, r);  /* Mark same BASE register as coalesced. */[m
[31m-    } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) {[m
[31m-      rset_clear(allow, irp->r);[m
[31m-      emit_rr(as, XO_MOV, r, irp->r);  /* Move from coalesced parent reg. */[m
[31m-    } else {[m
[31m-      emit_getgl(as, r, jit_base);  /* Otherwise reload BASE. */[m
[31m-    }[m
[31m-  }[m
[31m-  return allow;[m
[31m-}[m
[31m-[m
[31m-/* -- Tail of trace ------------------------------------------------------- */[m
[31m-[m
[31m-/* Fixup the tail code. */[m
[31m-static void asm_tail_fixup(ASMState *as, TraceNo lnk)[m
[31m-{[m
[31m-  /* Note: don't use as->mcp swap + emit_*: emit_op overwrites more bytes. */[m
[31m-  MCode *p = as->mctop;[m
[31m-  MCode *target, *q;[m
[31m-  int32_t spadj = as->T->spadjust;[m
[31m-  if (spadj == 0) {[m
[31m-    p -= ((as->flags & JIT_F_LEA_AGU) ? 7 : 6) + (LJ_64 ? 1 : 0);[m
[31m-  } else {[m
[31m-    MCode *p1;[m
[31m-    /* Patch stack adjustment. */[m
[31m-    if (checki8(spadj)) {[m
[31m-      p -= 3;[m
[31m-      p1 = p-6;[m
[31m-      *p1 = (MCode)spadj;[m
[31m-    } else {[m
[31m-      p1 = p-9;[m
[31m-      *(int32_t *)p1 = spadj;[m
[31m-    }[m
[31m-    if ((as->flags & JIT_F_LEA_AGU)) {[m
[31m-#if LJ_64[m
[31m-      p1[-4] = 0x48;[m
[31m-#endif[m
[31m-      p1[-3] = (MCode)XI_LEA;[m
[31m-      p1[-2] = MODRM(checki8(spadj) ? XM_OFS8 : XM_OFS32, RID_ESP, RID_ESP);[m
[31m-      p1[-1] = MODRM(XM_SCALE1, RID_ESP, RID_ESP);[m
[31m-    } else {[m
[31m-#if LJ_64[m
[31m-      p1[-3] = 0x48;[m
[31m-#endif[m
[31m-      p1[-2] = (MCode)(checki8(spadj) ? XI_ARITHi8 : XI_ARITHi);[m
[31m-      p1[-1] = MODRM(XM_REG, XOg_ADD, RID_ESP);[m
[31m-    }[m
[31m-  }[m
[31m-  /* Patch exit branch. */[m
[31m-  target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;[m
[31m-  *(int32_t *)(p-4) = jmprel(p, target);[m
[31m-  p[-5] = XI_JMP;[m
[31m-  /* Drop unused mcode tail. Fill with NOPs to make the prefetcher happy. */[m
[31m-  for (q = as->mctop-1; q >= p; q--)[m
[31m-    *q = XI_NOP;[m
[31m-  as->mctop = p;[m
[31m-}[m
[31m-[m
[31m-/* Prepare tail of code. */[m
[31m-static void asm_tail_prep(ASMState *as)[m
[31m-{[m
[31m-  MCode *p = as->mctop;[m
[31m-  /* Realign and leave room for backwards loop branch or exit branch. */[m
[31m-  if (as->realign) {[m
[31m-    int i = ((int)(intptr_t)as->realign) & 15;[m
[31m-    /* Fill unused mcode tail with NOPs to make the prefetcher happy. */[m
[31m-    while (i-- > 0)[m
[31m-      *--p = XI_NOP;[m
[31m-    as->mctop = p;[m
[31m-    p -= (as->loopinv ? 5 : 2);  /* Space for short/near jmp. */[m
[31m-  } else {[m
[31m-    p -= 5;  /* Space for exit branch (near jmp). */[m
[31m-  }[m
[31m-  if (as->loopref) {[m
[31m-    as->invmcp = as->mcp = p;[m
[31m-  } else {[m
[31m-    /* Leave room for ESP adjustment: add esp, imm or lea esp, [esp+imm] */[m
[31m-    as->mcp = p - (((as->flags & JIT_F_LEA_AGU) ? 7 : 6)  + (LJ_64 ? 1 : 0));[m
[31m-    as->invmcp = NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Trace setup --------------------------------------------------------- */[m
[31m-[m
[31m-/* Ensure there are enough stack slots for call arguments. */[m
[31m-static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)[m
[31m-{[m
[31m-  IRRef args[CCI_NARGS_MAX*2];[m
[31m-  int nslots;[m
[31m-  asm_collectargs(as, ir, ci, args);[m
[31m-  nslots = asm_count_call_slots(as, ci, args);[m
[31m-  if (nslots > as->evenspill)  /* Leave room for args in stack slots. */[m
[31m-    as->evenspill = nslots;[m
[31m-#if LJ_64[m
[31m-  return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET);[m
[31m-#else[m
[31m-  return irt_isfp(ir->t) ? REGSP_INIT : REGSP_HINT(RID_RET);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Target-specific setup. */[m
[31m-static void asm_setup_target(ASMState *as)[m
[31m-{[m
[31m-  asm_exitstub_setup(as, as->T->nsnap);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace patching ------------------------------------------------------ */[m
[31m-[m
[31m-static const uint8_t map_op1[256] = {[m
[31m-0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x20,[m
[31m-0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x51,0x51,[m
[31m-0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,[m
[31m-0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,0x92,0x92,0x92,0x92,0x52,0x45,0x10,0x51,[m
[31m-#if LJ_64[m
[31m-0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,[m
[31m-#else[m
[31m-0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,[m
[31m-#endif[m
[31m-0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,[m
[31m-0x51,0x51,0x92,0x92,0x10,0x10,0x12,0x11,0x45,0x86,0x52,0x93,0x51,0x51,0x51,0x51,[m
[31m-0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,[m
[31m-0x93,0x86,0x93,0x93,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,[m
[31m-0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x47,0x51,0x51,0x51,0x51,0x51,[m
[31m-#if LJ_64[m
[31m-0x59,0x59,0x59,0x59,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51,[m
[31m-#else[m
[31m-0x55,0x55,0x55,0x55,0x51,0x51,0x51,0x51,0x52,0x45,0x51,0x51,0x51,0x51,0x51,0x51,[m
[31m-#endif[m
[31m-0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,[m
[31m-0x93,0x93,0x53,0x51,0x70,0x71,0x93,0x86,0x54,0x51,0x53,0x51,0x51,0x52,0x51,0x51,[m
[31m-0x92,0x92,0x92,0x92,0x52,0x52,0x51,0x51,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,[m
[31m-0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x45,0x45,0x47,0x52,0x51,0x51,0x51,0x51,[m
[31m-0x10,0x51,0x10,0x10,0x51,0x51,0x63,0x66,0x51,0x51,0x51,0x51,0x51,0x51,0x92,0x92[m
[31m-};[m
[31m-[m
[31m-static const uint8_t map_op2[256] = {[m
[31m-0x93,0x93,0x93,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x93,0x52,0x94,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x34,0x51,0x35,0x51,0x51,0x51,0x51,0x51,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x53,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x94,0x54,0x54,0x54,0x93,0x93,0x93,0x52,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x52,0x52,0x52,0x93,0x94,0x93,0x51,0x51,0x52,0x52,0x52,0x93,0x94,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x94,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x94,0x93,0x94,0x94,0x94,0x93,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,[m
[31m-0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x52[m
[31m-};[m
[31m-[m
[31m-static uint32_t asm_x86_inslen(const uint8_t* p)[m
[31m-{[m
[31m-  uint32_t result = 0;[m
[31m-  uint32_t prefixes = 0;[m
[31m-  uint32_t x = map_op1[*p];[m
[31m-  for (;;) {[m
[31m-    switch (x >> 4) {[m
[31m-    case 0: return result + x + (prefixes & 4);[m
[31m-    case 1: prefixes |= x; x = map_op1[*++p]; result++; break;[m
[31m-    case 2: x = map_op2[*++p]; break;[m
[31m-    case 3: p++; goto mrm;[m
[31m-    case 4: result -= (prefixes & 2);  /* fallthrough */[m
[31m-    case 5: return result + (x & 15);[m
[31m-    case 6:  /* Group 3. */[m
[31m-      if (p[1] & 0x38) x = 2;[m
[31m-      else if ((prefixes & 2) && (x == 0x66)) x = 4;[m
[31m-      goto mrm;[m
[31m-    case 7: /* VEX c4/c5. */[m
[31m-      if (LJ_32 && p[1] < 0xc0) {[m
[31m-	x = 2;[m
[31m-	goto mrm;[m
[31m-      }[m
[31m-      if (x == 0x70) {[m
[31m-	x = *++p & 0x1f;[m
[31m-	result++;[m
[31m-	if (x >= 2) {[m
[31m-	  p += 2;[m
[31m-	  result += 2;[m
[31m-	  goto mrm;[m
[31m-	}[m
[31m-      }[m
[31m-      p++;[m
[31m-      result++;[m
[31m-      x = map_op2[*++p];[m
[31m-      break;[m
[31m-    case 8: result -= (prefixes & 2);  /* fallthrough */[m
[31m-    case 9: mrm:  /* ModR/M and possibly SIB. */[m
[31m-      result += (x & 15);[m
[31m-      x = *++p;[m
[31m-      switch (x >> 6) {[m
[31m-      case 0: if ((x & 7) == 5) return result + 4; break;[m
[31m-      case 1: result++; break;[m
[31m-      case 2: result += 4; break;[m
[31m-      case 3: return result;[m
[31m-      }[m
[31m-      if ((x & 7) == 4) {[m
[31m-	result++;[m
[31m-	if (x < 0x40 && (p[1] & 7) == 5) result += 4;[m
[31m-      }[m
[31m-      return result;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Patch exit jumps of existing machine code to a new target. */[m
[31m-void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)[m
[31m-{[m
[31m-  MCode *p = T->mcode;[m
[31m-  MCode *mcarea = lj_mcode_patch(J, p, 0);[m
[31m-  MSize len = T->szmcode;[m
[31m-  MCode *px = exitstub_addr(J, exitno) - 6;[m
[31m-  MCode *pe = p+len-6;[m
[31m-  uint32_t stateaddr = u32ptr(&J2G(J)->vmstate);[m
[31m-  if (len > 5 && p[len-5] == XI_JMP && p+len-6 + *(int32_t *)(p+len-4) == px)[m
[31m-    *(int32_t *)(p+len-4) = jmprel(p+len, target);[m
[31m-  /* Do not patch parent exit for a stack check. Skip beyond vmstate update. */[m
[31m-  for (; p < pe; p += asm_x86_inslen(p))[m
[31m-    if (*(uint32_t *)(p+(LJ_64 ? 3 : 2)) == stateaddr && p[0] == XI_MOVmi)[m
[31m-      break;[m
[31m-  lua_assert(p < pe);[m
[31m-  for (; p < pe; p += asm_x86_inslen(p))[m
[31m-    if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px)[m
[31m-      *(int32_t *)(p+2) = jmprel(p+6, target);[m
[31m-  lj_mcode_sync(T->mcode, T->mcode + T->szmcode);[m
[31m-  lj_mcode_patch(J, mcarea, 1);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bc.c[m
[1mdeleted file mode 100644[m
[1mindex f038769..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bc.c[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode instruction modes.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_bc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_bc.h"[m
[31m-[m
[31m-/* Bytecode offsets and bytecode instruction modes. */[m
[31m-#include "lj_bcdef.h"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bc.h[m
[1mdeleted file mode 100644[m
[1mindex 7882606..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bc.h[m
[1m+++ /dev/null[m
[36m@@ -1,265 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode instruction format.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_BC_H[m
[31m-#define _LJ_BC_H[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-/* Bytecode instruction format, 32 bit wide, fields of 8 or 16 bit:[m
[31m-**[m
[31m-** +----+----+----+----+[m
[31m-** | B  | C  | A  | OP | Format ABC[m
[31m-** +----+----+----+----+[m
[31m-** |    D    | A  | OP | Format AD[m
[31m-** +--------------------[m
[31m-** MSB               LSB[m
[31m-**[m
[31m-** In-memory instructions are always stored in host byte order.[m
[31m-*/[m
[31m-[m
[31m-/* Operand ranges and related constants. */[m
[31m-#define BCMAX_A		0xff[m
[31m-#define BCMAX_B		0xff[m
[31m-#define BCMAX_C		0xff[m
[31m-#define BCMAX_D		0xffff[m
[31m-#define BCBIAS_J	0x8000[m
[31m-#define NO_REG		BCMAX_A[m
[31m-#define NO_JMP		(~(BCPos)0)[m
[31m-[m
[31m-/* Macros to get instruction fields. */[m
[31m-#define bc_op(i)	((BCOp)((i)&0xff))[m
[31m-#define bc_a(i)		((BCReg)(((i)>>8)&0xff))[m
[31m-#define bc_b(i)		((BCReg)((i)>>24))[m
[31m-#define bc_c(i)		((BCReg)(((i)>>16)&0xff))[m
[31m-#define bc_d(i)		((BCReg)((i)>>16))[m
[31m-#define bc_j(i)		((ptrdiff_t)bc_d(i)-BCBIAS_J)[m
[31m-[m
[31m-/* Macros to set instruction fields. */[m
[31m-#define setbc_byte(p, x, ofs) \[m
[31m-  ((uint8_t *)(p))[LJ_ENDIAN_SELECT(ofs, 3-ofs)] = (uint8_t)(x)[m
[31m-#define setbc_op(p, x)	setbc_byte(p, (x), 0)[m
[31m-#define setbc_a(p, x)	setbc_byte(p, (x), 1)[m
[31m-#define setbc_b(p, x)	setbc_byte(p, (x), 3)[m
[31m-#define setbc_c(p, x)	setbc_byte(p, (x), 2)[m
[31m-#define setbc_d(p, x) \[m
[31m-  ((uint16_t *)(p))[LJ_ENDIAN_SELECT(1, 0)] = (uint16_t)(x)[m
[31m-#define setbc_j(p, x)	setbc_d(p, (BCPos)((int32_t)(x)+BCBIAS_J))[m
[31m-[m
[31m-/* Macros to compose instructions. */[m
[31m-#define BCINS_ABC(o, a, b, c) \[m
[31m-  (((BCIns)(o))|((BCIns)(a)<<8)|((BCIns)(b)<<24)|((BCIns)(c)<<16))[m
[31m-#define BCINS_AD(o, a, d) \[m
[31m-  (((BCIns)(o))|((BCIns)(a)<<8)|((BCIns)(d)<<16))[m
[31m-#define BCINS_AJ(o, a, j)	BCINS_AD(o, a, (BCPos)((int32_t)(j)+BCBIAS_J))[m
[31m-[m
[31m-/* Bytecode instruction definition. Order matters, see below.[m
[31m-**[m
[31m-** (name, filler, Amode, Bmode, Cmode or Dmode, metamethod)[m
[31m-**[m
[31m-** The opcode name suffixes specify the type for RB/RC or RD:[m
[31m-** V = variable slot[m
[31m-** S = string const[m
[31m-** N = number const[m
[31m-** P = primitive type (~itype)[m
[31m-** B = unsigned byte literal[m
[31m-** M = multiple args/results[m
[31m-*/[m
[31m-#define BCDEF(_) \[m
[31m-  /* Comparison ops. ORDER OPR. */ \[m
[31m-  _(ISLT,	var,	___,	var,	lt) \[m
[31m-  _(ISGE,	var,	___,	var,	lt) \[m
[31m-  _(ISLE,	var,	___,	var,	le) \[m
[31m-  _(ISGT,	var,	___,	var,	le) \[m
[31m-  \[m
[31m-  _(ISEQV,	var,	___,	var,	eq) \[m
[31m-  _(ISNEV,	var,	___,	var,	eq) \[m
[31m-  _(ISEQS,	var,	___,	str,	eq) \[m
[31m-  _(ISNES,	var,	___,	str,	eq) \[m
[31m-  _(ISEQN,	var,	___,	num,	eq) \[m
[31m-  _(ISNEN,	var,	___,	num,	eq) \[m
[31m-  _(ISEQP,	var,	___,	pri,	eq) \[m
[31m-  _(ISNEP,	var,	___,	pri,	eq) \[m
[31m-  \[m
[31m-  /* Unary test and copy ops. */ \[m
[31m-  _(ISTC,	dst,	___,	var,	___) \[m
[31m-  _(ISFC,	dst,	___,	var,	___) \[m
[31m-  _(IST,	___,	___,	var,	___) \[m
[31m-  _(ISF,	___,	___,	var,	___) \[m
[31m-  _(ISTYPE,	var,	___,	lit,	___) \[m
[31m-  _(ISNUM,	var,	___,	lit,	___) \[m
[31m-  \[m
[31m-  /* Unary ops. */ \[m
[31m-  _(MOV,	dst,	___,	var,	___) \[m
[31m-  _(NOT,	dst,	___,	var,	___) \[m
[31m-  _(UNM,	dst,	___,	var,	unm) \[m
[31m-  _(LEN,	dst,	___,	var,	len) \[m
[31m-  \[m
[31m-  /* Binary ops. ORDER OPR. VV last, POW must be next. */ \[m
[31m-  _(ADDVN,	dst,	var,	num,	add) \[m
[31m-  _(SUBVN,	dst,	var,	num,	sub) \[m
[31m-  _(MULVN,	dst,	var,	num,	mul) \[m
[31m-  _(DIVVN,	dst,	var,	num,	div) \[m
[31m-  _(MODVN,	dst,	var,	num,	mod) \[m
[31m-  \[m
[31m-  _(ADDNV,	dst,	var,	num,	add) \[m
[31m-  _(SUBNV,	dst,	var,	num,	sub) \[m
[31m-  _(MULNV,	dst,	var,	num,	mul) \[m
[31m-  _(DIVNV,	dst,	var,	num,	div) \[m
[31m-  _(MODNV,	dst,	var,	num,	mod) \[m
[31m-  \[m
[31m-  _(ADDVV,	dst,	var,	var,	add) \[m
[31m-  _(SUBVV,	dst,	var,	var,	sub) \[m
[31m-  _(MULVV,	dst,	var,	var,	mul) \[m
[31m-  _(DIVVV,	dst,	var,	var,	div) \[m
[31m-  _(MODVV,	dst,	var,	var,	mod) \[m
[31m-  \[m
[31m-  _(POW,	dst,	var,	var,	pow) \[m
[31m-  _(CAT,	dst,	rbase,	rbase,	concat) \[m
[31m-  \[m
[31m-  /* Constant ops. */ \[m
[31m-  _(KSTR,	dst,	___,	str,	___) \[m
[31m-  _(KCDATA,	dst,	___,	cdata,	___) \[m
[31m-  _(KSHORT,	dst,	___,	lits,	___) \[m
[31m-  _(KNUM,	dst,	___,	num,	___) \[m
[31m-  _(KPRI,	dst,	___,	pri,	___) \[m
[31m-  _(KNIL,	base,	___,	base,	___) \[m
[31m-  \[m
[31m-  /* Upvalue and function ops. */ \[m
[31m-  _(UGET,	dst,	___,	uv,	___) \[m
[31m-  _(USETV,	uv,	___,	var,	___) \[m
[31m-  _(USETS,	uv,	___,	str,	___) \[m
[31m-  _(USETN,	uv,	___,	num,	___) \[m
[31m-  _(USETP,	uv,	___,	pri,	___) \[m
[31m-  _(UCLO,	rbase,	___,	jump,	___) \[m
[31m-  _(FNEW,	dst,	___,	func,	gc) \[m
[31m-  \[m
[31m-  /* Table ops. */ \[m
[31m-  _(TNEW,	dst,	___,	lit,	gc) \[m
[31m-  _(TDUP,	dst,	___,	tab,	gc) \[m
[31m-  _(GGET,	dst,	___,	str,	index) \[m
[31m-  _(GSET,	var,	___,	str,	newindex) \[m
[31m-  _(TGETV,	dst,	var,	var,	index) \[m
[31m-  _(TGETS,	dst,	var,	str,	index) \[m
[31m-  _(TGETB,	dst,	var,	lit,	index) \[m
[31m-  _(TGETR,	dst,	var,	var,	index) \[m
[31m-  _(TSETV,	var,	var,	var,	newindex) \[m
[31m-  _(TSETS,	var,	var,	str,	newindex) \[m
[31m-  _(TSETB,	var,	var,	lit,	newindex) \[m
[31m-  _(TSETM,	base,	___,	num,	newindex) \[m
[31m-  _(TSETR,	var,	var,	var,	newindex) \[m
[31m-  \[m
[31m-  /* Calls and vararg handling. T = tail call. */ \[m
[31m-  _(CALLM,	base,	lit,	lit,	call) \[m
[31m-  _(CALL,	base,	lit,	lit,	call) \[m
[31m-  _(CALLMT,	base,	___,	lit,	call) \[m
[31m-  _(CALLT,	base,	___,	lit,	call) \[m
[31m-  _(ITERC,	base,	lit,	lit,	call) \[m
[31m-  _(ITERN,	base,	lit,	lit,	call) \[m
[31m-  _(VARG,	base,	lit,	lit,	___) \[m
[31m-  _(ISNEXT,	base,	___,	jump,	___) \[m
[31m-  \[m
[31m-  /* Returns. */ \[m
[31m-  _(RETM,	base,	___,	lit,	___) \[m
[31m-  _(RET,	rbase,	___,	lit,	___) \[m
[31m-  _(RET0,	rbase,	___,	lit,	___) \[m
[31m-  _(RET1,	rbase,	___,	lit,	___) \[m
[31m-  \[m
[31m-  /* Loops and branches. I/J = interp/JIT, I/C/L = init/call/loop. */ \[m
[31m-  _(FORI,	base,	___,	jump,	___) \[m
[31m-  _(JFORI,	base,	___,	jump,	___) \[m
[31m-  \[m
[31m-  _(FORL,	base,	___,	jump,	___) \[m
[31m-  _(IFORL,	base,	___,	jump,	___) \[m
[31m-  _(JFORL,	base,	___,	lit,	___) \[m
[31m-  \[m
[31m-  _(ITERL,	base,	___,	jump,	___) \[m
[31m-  _(IITERL,	base,	___,	jump,	___) \[m
[31m-  _(JITERL,	base,	___,	lit,	___) \[m
[31m-  \[m
[31m-  _(LOOP,	rbase,	___,	jump,	___) \[m
[31m-  _(ILOOP,	rbase,	___,	jump,	___) \[m
[31m-  _(JLOOP,	rbase,	___,	lit,	___) \[m
[31m-  \[m
[31m-  _(JMP,	rbase,	___,	jump,	___) \[m
[31m-  \[m
[31m-  /* Function headers. I/J = interp/JIT, F/V/C = fixarg/vararg/C func. */ \[m
[31m-  _(FUNCF,	rbase,	___,	___,	___) \[m
[31m-  _(IFUNCF,	rbase,	___,	___,	___) \[m
[31m-  _(JFUNCF,	rbase,	___,	lit,	___) \[m
[31m-  _(FUNCV,	rbase,	___,	___,	___) \[m
[31m-  _(IFUNCV,	rbase,	___,	___,	___) \[m
[31m-  _(JFUNCV,	rbase,	___,	lit,	___) \[m
[31m-  _(FUNCC,	rbase,	___,	___,	___) \[m
[31m-  _(FUNCCW,	rbase,	___,	___,	___)[m
[31m-[m
[31m-/* Bytecode opcode numbers. */[m
[31m-typedef enum {[m
[31m-#define BCENUM(name, ma, mb, mc, mt)	BC_##name,[m
[31m-BCDEF(BCENUM)[m
[31m-#undef BCENUM[m
[31m-  BC__MAX[m
[31m-} BCOp;[m
[31m-[m
[31m-LJ_STATIC_ASSERT((int)BC_ISEQV+1 == (int)BC_ISNEV);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISEQV^1) == (int)BC_ISNEV);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISEQS^1) == (int)BC_ISNES);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISEQN^1) == (int)BC_ISNEN);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISEQP^1) == (int)BC_ISNEP);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISLT^1) == (int)BC_ISGE);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISLE^1) == (int)BC_ISGT);[m
[31m-LJ_STATIC_ASSERT(((int)BC_ISLT^3) == (int)BC_ISGT);[m
[31m-LJ_STATIC_ASSERT((int)BC_IST-(int)BC_ISTC == (int)BC_ISF-(int)BC_ISFC);[m
[31m-LJ_STATIC_ASSERT((int)BC_CALLT-(int)BC_CALL == (int)BC_CALLMT-(int)BC_CALLM);[m
[31m-LJ_STATIC_ASSERT((int)BC_CALLMT + 1 == (int)BC_CALLT);[m
[31m-LJ_STATIC_ASSERT((int)BC_RETM + 1 == (int)BC_RET);[m
[31m-LJ_STATIC_ASSERT((int)BC_FORL + 1 == (int)BC_IFORL);[m
[31m-LJ_STATIC_ASSERT((int)BC_FORL + 2 == (int)BC_JFORL);[m
[31m-LJ_STATIC_ASSERT((int)BC_ITERL + 1 == (int)BC_IITERL);[m
[31m-LJ_STATIC_ASSERT((int)BC_ITERL + 2 == (int)BC_JITERL);[m
[31m-LJ_STATIC_ASSERT((int)BC_LOOP + 1 == (int)BC_ILOOP);[m
[31m-LJ_STATIC_ASSERT((int)BC_LOOP + 2 == (int)BC_JLOOP);[m
[31m-LJ_STATIC_ASSERT((int)BC_FUNCF + 1 == (int)BC_IFUNCF);[m
[31m-LJ_STATIC_ASSERT((int)BC_FUNCF + 2 == (int)BC_JFUNCF);[m
[31m-LJ_STATIC_ASSERT((int)BC_FUNCV + 1 == (int)BC_IFUNCV);[m
[31m-LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV);[m
[31m-[m
[31m-/* This solves a circular dependency problem, change as needed. */[m
[31m-#define FF_next_N	4[m
[31m-[m
[31m-/* Stack slots used by FORI/FORL, relative to operand A. */[m
[31m-enum {[m
[31m-  FORL_IDX, FORL_STOP, FORL_STEP, FORL_EXT[m
[31m-};[m
[31m-[m
[31m-/* Bytecode operand modes. ORDER BCMode */[m
[31m-typedef enum {[m
[31m-  BCMnone, BCMdst, BCMbase, BCMvar, BCMrbase, BCMuv,  /* Mode A must be <= 7 */[m
[31m-  BCMlit, BCMlits, BCMpri, BCMnum, BCMstr, BCMtab, BCMfunc, BCMjump, BCMcdata,[m
[31m-  BCM_max[m
[31m-} BCMode;[m
[31m-#define BCM___		BCMnone[m
[31m-[m
[31m-#define bcmode_a(op)	((BCMode)(lj_bc_mode[op] & 7))[m
[31m-#define bcmode_b(op)	((BCMode)((lj_bc_mode[op]>>3) & 15))[m
[31m-#define bcmode_c(op)	((BCMode)((lj_bc_mode[op]>>7) & 15))[m
[31m-#define bcmode_d(op)	bcmode_c(op)[m
[31m-#define bcmode_hasd(op)	((lj_bc_mode[op] & (15<<3)) == (BCMnone<<3))[m
[31m-#define bcmode_mm(op)	((MMS)(lj_bc_mode[op]>>11))[m
[31m-[m
[31m-#define BCMODE(name, ma, mb, mc, mm) \[m
[31m-  (BCM##ma|(BCM##mb<<3)|(BCM##mc<<7)|(MM_##mm<<11)),[m
[31m-#define BCMODE_FF	0[m
[31m-[m
[31m-static LJ_AINLINE int bc_isret(BCOp op)[m
[31m-{[m
[31m-  return (op == BC_RETM || op == BC_RET || op == BC_RET0 || op == BC_RET1);[m
[31m-}[m
[31m-[m
[31m-LJ_DATA const uint16_t lj_bc_mode[];[m
[31m-LJ_DATA const uint16_t lj_bc_ofs[];[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcdump.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcdump.h[m
[1mdeleted file mode 100644[m
[1mindex 3752f15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcdump.h[m
[1m+++ /dev/null[m
[36m@@ -1,68 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode dump definitions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_BCDUMP_H[m
[31m-#define _LJ_BCDUMP_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_lex.h"[m
[31m-[m
[31m-/* -- Bytecode dump format ------------------------------------------------ */[m
[31m-[m
[31m-/*[m
[31m-** dump   = header proto+ 0U[m
[31m-** header = ESC 'L' 'J' versionB flagsU [namelenU nameB*][m
[31m-** proto  = lengthU pdata[m
[31m-** pdata  = phead bcinsW* uvdataH* kgc* knum* [debugB*][m
[31m-** phead  = flagsB numparamsB framesizeB numuvB numkgcU numknU numbcU[m
[31m-**          [debuglenU [firstlineU numlineU]][m
[31m-** kgc    = kgctypeU { ktab | (loU hiU) | (rloU rhiU iloU ihiU) | strB* }[m
[31m-** knum   = intU0 | (loU1 hiU)[m
[31m-** ktab   = narrayU nhashU karray* khash*[m
[31m-** karray = ktabk[m
[31m-** khash  = ktabk ktabk[m
[31m-** ktabk  = ktabtypeU { intU | (loU hiU) | strB* }[m
[31m-**[m
[31m-** B = 8 bit, H = 16 bit, W = 32 bit, U = ULEB128 of W, U0/U1 = ULEB128 of W+1[m
[31m-*/[m
[31m-[m
[31m-/* Bytecode dump header. */[m
[31m-#define BCDUMP_HEAD1		0x1b[m
[31m-#define BCDUMP_HEAD2		0x4c[m
[31m-#define BCDUMP_HEAD3		0x4a[m
[31m-[m
[31m-/* If you perform *any* kind of private modifications to the bytecode itself[m
[31m-** or to the dump format, you *must* set BCDUMP_VERSION to 0x80 or higher.[m
[31m-*/[m
[31m-#define BCDUMP_VERSION		2[m
[31m-[m
[31m-/* Compatibility flags. */[m
[31m-#define BCDUMP_F_BE		0x01[m
[31m-#define BCDUMP_F_STRIP		0x02[m
[31m-#define BCDUMP_F_FFI		0x04[m
[31m-#define BCDUMP_F_FR2		0x08[m
[31m-[m
[31m-#define BCDUMP_F_KNOWN		(BCDUMP_F_FR2*2-1)[m
[31m-[m
[31m-/* Type codes for the GC constants of a prototype. Plus length for strings. */[m
[31m-enum {[m
[31m-  BCDUMP_KGC_CHILD, BCDUMP_KGC_TAB, BCDUMP_KGC_I64, BCDUMP_KGC_U64,[m
[31m-  BCDUMP_KGC_COMPLEX, BCDUMP_KGC_STR[m
[31m-};[m
[31m-[m
[31m-/* Type codes for the keys/values of a constant table. */[m
[31m-enum {[m
[31m-  BCDUMP_KTAB_NIL, BCDUMP_KTAB_FALSE, BCDUMP_KTAB_TRUE,[m
[31m-  BCDUMP_KTAB_INT, BCDUMP_KTAB_NUM, BCDUMP_KTAB_STR[m
[31m-};[m
[31m-[m
[31m-/* -- Bytecode reader/writer ---------------------------------------------- */[m
[31m-[m
[31m-LJ_FUNC int lj_bcwrite(lua_State *L, GCproto *pt, lua_Writer writer,[m
[31m-		       void *data, int strip);[m
[31m-LJ_FUNC GCproto *lj_bcread_proto(LexState *ls);[m
[31m-LJ_FUNC GCproto *lj_bcread(LexState *ls);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcread.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcread.c[m
[1mdeleted file mode 100644[m
[1mindex 455c9d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcread.c[m
[1m+++ /dev/null[m
[36m@@ -1,457 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode reader.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_bcread_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lualib.h"[m
[31m-#endif[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Reuse some lexer fields for our own purposes. */[m
[31m-#define bcread_flags(ls)	ls->level[m
[31m-#define bcread_swap(ls) \[m
[31m-  ((bcread_flags(ls) & BCDUMP_F_BE) != LJ_BE*BCDUMP_F_BE)[m
[31m-#define bcread_oldtop(L, ls)	restorestack(L, ls->lastline)[m
[31m-#define bcread_savetop(L, ls, top) \[m
[31m-  ls->lastline = (BCLine)savestack(L, (top))[m
[31m-[m
[31m-/* -- Input buffer handling ----------------------------------------------- */[m
[31m-[m
[31m-/* Throw reader error. */[m
[31m-static LJ_NOINLINE void bcread_error(LexState *ls, ErrMsg em)[m
[31m-{[m
[31m-  lua_State *L = ls->L;[m
[31m-  const char *name = ls->chunkarg;[m
[31m-  if (*name == BCDUMP_HEAD1) name = "(binary)";[m
[31m-  else if (*name == '@' || *name == '=') name++;[m
[31m-  lj_strfmt_pushf(L, "%s: %s", name, err2msg(em));[m
[31m-  lj_err_throw(L, LUA_ERRSYNTAX);[m
[31m-}[m
[31m-[m
[31m-/* Refill buffer. */[m
[31m-static LJ_NOINLINE void bcread_fill(LexState *ls, MSize len, int need)[m
[31m-{[m
[31m-  lua_assert(len != 0);[m
[31m-  if (len > LJ_MAX_BUF || ls->c < 0)[m
[31m-    bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-  do {[m
[31m-    const char *buf;[m
[31m-    size_t sz;[m
[31m-    char *p = sbufB(&ls->sb);[m
[31m-    MSize n = (MSize)(ls->pe - ls->p);[m
[31m-    if (n) {  /* Copy remainder to buffer. */[m
[31m-      if (sbuflen(&ls->sb)) {  /* Move down in buffer. */[m
[31m-	lua_assert(ls->pe == sbufP(&ls->sb));[m
[31m-	if (ls->p != p) memmove(p, ls->p, n);[m
[31m-      } else {  /* Copy from buffer provided by reader. */[m
[31m-	p = lj_buf_need(&ls->sb, len);[m
[31m-	memcpy(p, ls->p, n);[m
[31m-      }[m
[31m-      ls->p = p;[m
[31m-      ls->pe = p + n;[m
[31m-    }[m
[31m-    setsbufP(&ls->sb, p + n);[m
[31m-    buf = ls->rfunc(ls->L, ls->rdata, &sz);  /* Get more data from reader. */[m
[31m-    if (buf == NULL || sz == 0) {  /* EOF? */[m
[31m-      if (need) bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-      ls->c = -1;  /* Only bad if we get called again. */[m
[31m-      break;[m
[31m-    }[m
[31m-    if (n) {  /* Append to buffer. */[m
[31m-      n += (MSize)sz;[m
[31m-      p = lj_buf_need(&ls->sb, n < len ? len : n);[m
[31m-      memcpy(sbufP(&ls->sb), buf, sz);[m
[31m-      setsbufP(&ls->sb, p + n);[m
[31m-      ls->p = p;[m
[31m-      ls->pe = p + n;[m
[31m-    } else {  /* Return buffer provided by reader. */[m
[31m-      ls->p = buf;[m
[31m-      ls->pe = buf + sz;[m
[31m-    }[m
[31m-  } while (ls->p + len > ls->pe);[m
[31m-}[m
[31m-[m
[31m-/* Need a certain number of bytes. */[m
[31m-static LJ_AINLINE void bcread_need(LexState *ls, MSize len)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(ls->p + len > ls->pe))[m
[31m-    bcread_fill(ls, len, 1);[m
[31m-}[m
[31m-[m
[31m-/* Want to read up to a certain number of bytes, but may need less. */[m
[31m-static LJ_AINLINE void bcread_want(LexState *ls, MSize len)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(ls->p + len > ls->pe))[m
[31m-    bcread_fill(ls, len, 0);[m
[31m-}[m
[31m-[m
[31m-/* Return memory block from buffer. */[m
[31m-static LJ_AINLINE uint8_t *bcread_mem(LexState *ls, MSize len)[m
[31m-{[m
[31m-  uint8_t *p = (uint8_t *)ls->p;[m
[31m-  ls->p += len;[m
[31m-  lua_assert(ls->p <= ls->pe);[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Copy memory block from buffer. */[m
[31m-static void bcread_block(LexState *ls, void *q, MSize len)[m
[31m-{[m
[31m-  memcpy(q, bcread_mem(ls, len), len);[m
[31m-}[m
[31m-[m
[31m-/* Read byte from buffer. */[m
[31m-static LJ_AINLINE uint32_t bcread_byte(LexState *ls)[m
[31m-{[m
[31m-  lua_assert(ls->p < ls->pe);[m
[31m-  return (uint32_t)(uint8_t)*ls->p++;[m
[31m-}[m
[31m-[m
[31m-/* Read ULEB128 value from buffer. */[m
[31m-static LJ_AINLINE uint32_t bcread_uleb128(LexState *ls)[m
[31m-{[m
[31m-  uint32_t v = lj_buf_ruleb128(&ls->p);[m
[31m-  lua_assert(ls->p <= ls->pe);[m
[31m-  return v;[m
[31m-}[m
[31m-[m
[31m-/* Read top 32 bits of 33 bit ULEB128 value from buffer. */[m
[31m-static uint32_t bcread_uleb128_33(LexState *ls)[m
[31m-{[m
[31m-  const uint8_t *p = (const uint8_t *)ls->p;[m
[31m-  uint32_t v = (*p++ >> 1);[m
[31m-  if (LJ_UNLIKELY(v >= 0x40)) {[m
[31m-    int sh = -1;[m
[31m-    v &= 0x3f;[m
[31m-    do {[m
[31m-     v |= ((*p & 0x7f) << (sh += 7));[m
[31m-   } while (*p++ >= 0x80);[m
[31m-  }[m
[31m-  ls->p = (char *)p;[m
[31m-  lua_assert(ls->p <= ls->pe);[m
[31m-  return v;[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode reader ----------------------------------------------------- */[m
[31m-[m
[31m-/* Read debug info of a prototype. */[m
[31m-static void bcread_dbg(LexState *ls, GCproto *pt, MSize sizedbg)[m
[31m-{[m
[31m-  void *lineinfo = (void *)proto_lineinfo(pt);[m
[31m-  bcread_block(ls, lineinfo, sizedbg);[m
[31m-  /* Swap lineinfo if the endianess differs. */[m
[31m-  if (bcread_swap(ls) && pt->numline >= 256) {[m
[31m-    MSize i, n = pt->sizebc-1;[m
[31m-    if (pt->numline < 65536) {[m
[31m-      uint16_t *p = (uint16_t *)lineinfo;[m
[31m-      for (i = 0; i < n; i++) p[i] = (uint16_t)((p[i] >> 8)|(p[i] << 8));[m
[31m-    } else {[m
[31m-      uint32_t *p = (uint32_t *)lineinfo;[m
[31m-      for (i = 0; i < n; i++) p[i] = lj_bswap(p[i]);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Find pointer to varinfo. */[m
[31m-static const void *bcread_varinfo(GCproto *pt)[m
[31m-{[m
[31m-  const uint8_t *p = proto_uvinfo(pt);[m
[31m-  MSize n = pt->sizeuv;[m
[31m-  if (n) while (*p++ || --n) ;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Read a single constant key/value of a template table. */[m
[31m-static void bcread_ktabk(LexState *ls, TValue *o)[m
[31m-{[m
[31m-  MSize tp = bcread_uleb128(ls);[m
[31m-  if (tp >= BCDUMP_KTAB_STR) {[m
[31m-    MSize len = tp - BCDUMP_KTAB_STR;[m
[31m-    const char *p = (const char *)bcread_mem(ls, len);[m
[31m-    setstrV(ls->L, o, lj_str_new(ls->L, p, len));[m
[31m-  } else if (tp == BCDUMP_KTAB_INT) {[m
[31m-    setintV(o, (int32_t)bcread_uleb128(ls));[m
[31m-  } else if (tp == BCDUMP_KTAB_NUM) {[m
[31m-    o->u32.lo = bcread_uleb128(ls);[m
[31m-    o->u32.hi = bcread_uleb128(ls);[m
[31m-  } else {[m
[31m-    lua_assert(tp <= BCDUMP_KTAB_TRUE);[m
[31m-    setpriV(o, ~tp);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read a template table. */[m
[31m-static GCtab *bcread_ktab(LexState *ls)[m
[31m-{[m
[31m-  MSize narray = bcread_uleb128(ls);[m
[31m-  MSize nhash = bcread_uleb128(ls);[m
[31m-  GCtab *t = lj_tab_new(ls->L, narray, hsize2hbits(nhash));[m
[31m-  if (narray) {  /* Read array entries. */[m
[31m-    MSize i;[m
[31m-    TValue *o = tvref(t->array);[m
[31m-    for (i = 0; i < narray; i++, o++)[m
[31m-      bcread_ktabk(ls, o);[m
[31m-  }[m
[31m-  if (nhash) {  /* Read hash entries. */[m
[31m-    MSize i;[m
[31m-    for (i = 0; i < nhash; i++) {[m
[31m-      TValue key;[m
[31m-      bcread_ktabk(ls, &key);[m
[31m-      lua_assert(!tvisnil(&key));[m
[31m-      bcread_ktabk(ls, lj_tab_set(ls->L, t, &key));[m
[31m-    }[m
[31m-  }[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* Read GC constants of a prototype. */[m
[31m-static void bcread_kgc(LexState *ls, GCproto *pt, MSize sizekgc)[m
[31m-{[m
[31m-  MSize i;[m
[31m-  GCRef *kr = mref(pt->k, GCRef) - (ptrdiff_t)sizekgc;[m
[31m-  for (i = 0; i < sizekgc; i++, kr++) {[m
[31m-    MSize tp = bcread_uleb128(ls);[m
[31m-    if (tp >= BCDUMP_KGC_STR) {[m
[31m-      MSize len = tp - BCDUMP_KGC_STR;[m
[31m-      const char *p = (const char *)bcread_mem(ls, len);[m
[31m-      setgcref(*kr, obj2gco(lj_str_new(ls->L, p, len)));[m
[31m-    } else if (tp == BCDUMP_KGC_TAB) {[m
[31m-      setgcref(*kr, obj2gco(bcread_ktab(ls)));[m
[31m-#if LJ_HASFFI[m
[31m-    } else if (tp != BCDUMP_KGC_CHILD) {[m
[31m-      CTypeID id = tp == BCDUMP_KGC_COMPLEX ? CTID_COMPLEX_DOUBLE :[m
[31m-		   tp == BCDUMP_KGC_I64 ? CTID_INT64 : CTID_UINT64;[m
[31m-      CTSize sz = tp == BCDUMP_KGC_COMPLEX ? 16 : 8;[m
[31m-      GCcdata *cd = lj_cdata_new_(ls->L, id, sz);[m
[31m-      TValue *p = (TValue *)cdataptr(cd);[m
[31m-      setgcref(*kr, obj2gco(cd));[m
[31m-      p[0].u32.lo = bcread_uleb128(ls);[m
[31m-      p[0].u32.hi = bcread_uleb128(ls);[m
[31m-      if (tp == BCDUMP_KGC_COMPLEX) {[m
[31m-	p[1].u32.lo = bcread_uleb128(ls);[m
[31m-	p[1].u32.hi = bcread_uleb128(ls);[m
[31m-      }[m
[31m-#endif[m
[31m-    } else {[m
[31m-      lua_State *L = ls->L;[m
[31m-      lua_assert(tp == BCDUMP_KGC_CHILD);[m
[31m-      if (L->top <= bcread_oldtop(L, ls))  /* Stack underflow? */[m
[31m-	bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-      L->top--;[m
[31m-      setgcref(*kr, obj2gco(protoV(L->top)));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read number constants of a prototype. */[m
[31m-static void bcread_knum(LexState *ls, GCproto *pt, MSize sizekn)[m
[31m-{[m
[31m-  MSize i;[m
[31m-  TValue *o = mref(pt->k, TValue);[m
[31m-  for (i = 0; i < sizekn; i++, o++) {[m
[31m-    int isnum = (ls->p[0] & 1);[m
[31m-    uint32_t lo = bcread_uleb128_33(ls);[m
[31m-    if (isnum) {[m
[31m-      o->u32.lo = lo;[m
[31m-      o->u32.hi = bcread_uleb128(ls);[m
[31m-    } else {[m
[31m-      setintV(o, lo);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read bytecode instructions. */[m
[31m-static void bcread_bytecode(LexState *ls, GCproto *pt, MSize sizebc)[m
[31m-{[m
[31m-  BCIns *bc = proto_bc(pt);[m
[31m-  bc[0] = BCINS_AD((pt->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF,[m
[31m-		   pt->framesize, 0);[m
[31m-  bcread_block(ls, bc+1, (sizebc-1)*(MSize)sizeof(BCIns));[m
[31m-  /* Swap bytecode instructions if the endianess differs. */[m
[31m-  if (bcread_swap(ls)) {[m
[31m-    MSize i;[m
[31m-    for (i = 1; i < sizebc; i++) bc[i] = lj_bswap(bc[i]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read upvalue refs. */[m
[31m-static void bcread_uv(LexState *ls, GCproto *pt, MSize sizeuv)[m
[31m-{[m
[31m-  if (sizeuv) {[m
[31m-    uint16_t *uv = proto_uv(pt);[m
[31m-    bcread_block(ls, uv, sizeuv*2);[m
[31m-    /* Swap upvalue refs if the endianess differs. */[m
[31m-    if (bcread_swap(ls)) {[m
[31m-      MSize i;[m
[31m-      for (i = 0; i < sizeuv; i++)[m
[31m-	uv[i] = (uint16_t)((uv[i] >> 8)|(uv[i] << 8));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Read a prototype. */[m
[31m-GCproto *lj_bcread_proto(LexState *ls)[m
[31m-{[m
[31m-  GCproto *pt;[m
[31m-  MSize framesize, numparams, flags, sizeuv, sizekgc, sizekn, sizebc, sizept;[m
[31m-  MSize ofsk, ofsuv, ofsdbg;[m
[31m-  MSize sizedbg = 0;[m
[31m-  BCLine firstline = 0, numline = 0;[m
[31m-[m
[31m-  /* Read prototype header. */[m
[31m-  flags = bcread_byte(ls);[m
[31m-  numparams = bcread_byte(ls);[m
[31m-  framesize = bcread_byte(ls);[m
[31m-  sizeuv = bcread_byte(ls);[m
[31m-  sizekgc = bcread_uleb128(ls);[m
[31m-  sizekn = bcread_uleb128(ls);[m
[31m-  sizebc = bcread_uleb128(ls) + 1;[m
[31m-  if (!(bcread_flags(ls) & BCDUMP_F_STRIP)) {[m
[31m-    sizedbg = bcread_uleb128(ls);[m
[31m-    if (sizedbg) {[m
[31m-      firstline = bcread_uleb128(ls);[m
[31m-      numline = bcread_uleb128(ls);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Calculate total size of prototype including all colocated arrays. */[m
[31m-  sizept = (MSize)sizeof(GCproto) +[m
[31m-	   sizebc*(MSize)sizeof(BCIns) +[m
[31m-	   sizekgc*(MSize)sizeof(GCRef);[m
[31m-  sizept = (sizept + (MSize)sizeof(TValue)-1) & ~((MSize)sizeof(TValue)-1);[m
[31m-  ofsk = sizept; sizept += sizekn*(MSize)sizeof(TValue);[m
[31m-  ofsuv = sizept; sizept += ((sizeuv+1)&~1)*2;[m
[31m-  ofsdbg = sizept; sizept += sizedbg;[m
[31m-[m
[31m-  /* Allocate prototype object and initialize its fields. */[m
[31m-  pt = (GCproto *)lj_mem_newgco(ls->L, (MSize)sizept);[m
[31m-  pt->gct = ~LJ_TPROTO;[m
[31m-  pt->numparams = (uint8_t)numparams;[m
[31m-  pt->framesize = (uint8_t)framesize;[m
[31m-  pt->sizebc = sizebc;[m
[31m-  setmref(pt->k, (char *)pt + ofsk);[m
[31m-  setmref(pt->uv, (char *)pt + ofsuv);[m
[31m-  pt->sizekgc = 0;  /* Set to zero until fully initialized. */[m
[31m-  pt->sizekn = sizekn;[m
[31m-  pt->sizept = sizept;[m
[31m-  pt->sizeuv = (uint8_t)sizeuv;[m
[31m-  pt->flags = (uint8_t)flags;[m
[31m-  pt->trace = 0;[m
[31m-  setgcref(pt->chunkname, obj2gco(ls->chunkname));[m
[31m-[m
[31m-  /* Close potentially uninitialized gap between bc and kgc. */[m
[31m-  *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(sizekgc+1)) = 0;[m
[31m-[m
[31m-  /* Read bytecode instructions and upvalue refs. */[m
[31m-  bcread_bytecode(ls, pt, sizebc);[m
[31m-  bcread_uv(ls, pt, sizeuv);[m
[31m-[m
[31m-  /* Read constants. */[m
[31m-  bcread_kgc(ls, pt, sizekgc);[m
[31m-  pt->sizekgc = sizekgc;[m
[31m-  bcread_knum(ls, pt, sizekn);[m
[31m-[m
[31m-  /* Read and initialize debug info. */[m
[31m-  pt->firstline = firstline;[m
[31m-  pt->numline = numline;[m
[31m-  if (sizedbg) {[m
[31m-    MSize sizeli = (sizebc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2);[m
[31m-    setmref(pt->lineinfo, (char *)pt + ofsdbg);[m
[31m-    setmref(pt->uvinfo, (char *)pt + ofsdbg + sizeli);[m
[31m-    bcread_dbg(ls, pt, sizedbg);[m
[31m-    setmref(pt->varinfo, bcread_varinfo(pt));[m
[31m-  } else {[m
[31m-    setmref(pt->lineinfo, NULL);[m
[31m-    setmref(pt->uvinfo, NULL);[m
[31m-    setmref(pt->varinfo, NULL);[m
[31m-  }[m
[31m-  return pt;[m
[31m-}[m
[31m-[m
[31m-/* Read and check header of bytecode dump. */[m
[31m-static int bcread_header(LexState *ls)[m
[31m-{[m
[31m-  uint32_t flags;[m
[31m-  bcread_want(ls, 3+5+5);[m
[31m-  if (bcread_byte(ls) != BCDUMP_HEAD2 ||[m
[31m-      bcread_byte(ls) != BCDUMP_HEAD3 ||[m
[31m-      bcread_byte(ls) != BCDUMP_VERSION) return 0;[m
[31m-  bcread_flags(ls) = flags = bcread_uleb128(ls);[m
[31m-  if ((flags & ~(BCDUMP_F_KNOWN)) != 0) return 0;[m
[31m-  if ((flags & BCDUMP_F_FR2) != LJ_FR2*BCDUMP_F_FR2) return 0;[m
[31m-  if ((flags & BCDUMP_F_FFI)) {[m
[31m-#if LJ_HASFFI[m
[31m-    lua_State *L = ls->L;[m
[31m-    if (!ctype_ctsG(G(L))) {[m
[31m-      ptrdiff_t oldtop = savestack(L, L->top);[m
[31m-      luaopen_ffi(L);  /* Load FFI library on-demand. */[m
[31m-      L->top = restorestack(L, oldtop);[m
[31m-    }[m
[31m-#else[m
[31m-    return 0;[m
[31m-#endif[m
[31m-  }[m
[31m-  if ((flags & BCDUMP_F_STRIP)) {[m
[31m-    ls->chunkname = lj_str_newz(ls->L, ls->chunkarg);[m
[31m-  } else {[m
[31m-    MSize len = bcread_uleb128(ls);[m
[31m-    bcread_need(ls, len);[m
[31m-    ls->chunkname = lj_str_new(ls->L, (const char *)bcread_mem(ls, len), len);[m
[31m-  }[m
[31m-  return 1;  /* Ok. */[m
[31m-}[m
[31m-[m
[31m-/* Read a bytecode dump. */[m
[31m-GCproto *lj_bcread(LexState *ls)[m
[31m-{[m
[31m-  lua_State *L = ls->L;[m
[31m-  lua_assert(ls->c == BCDUMP_HEAD1);[m
[31m-  bcread_savetop(L, ls, L->top);[m
[31m-  lj_buf_reset(&ls->sb);[m
[31m-  /* Check for a valid bytecode dump header. */[m
[31m-  if (!bcread_header(ls))[m
[31m-    bcread_error(ls, LJ_ERR_BCFMT);[m
[31m-  for (;;) {  /* Process all prototypes in the bytecode dump. */[m
[31m-    GCproto *pt;[m
[31m-    MSize len;[m
[31m-    const char *startp;[m
[31m-    /* Read length. */[m
[31m-    if (ls->p < ls->pe && ls->p[0] == 0) {  /* Shortcut EOF. */[m
[31m-      ls->p++;[m
[31m-      break;[m
[31m-    }[m
[31m-    bcread_want(ls, 5);[m
[31m-    len = bcread_uleb128(ls);[m
[31m-    if (!len) break;  /* EOF */[m
[31m-    bcread_need(ls, len);[m
[31m-    startp = ls->p;[m
[31m-    pt = lj_bcread_proto(ls);[m
[31m-    if (ls->p != startp + len)[m
[31m-      bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-    setprotoV(L, L->top, pt);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  if ((int32_t)(2*(uint32_t)(ls->pe - ls->p)) > 0 ||[m
[31m-      L->top-1 != bcread_oldtop(L, ls))[m
[31m-    bcread_error(ls, LJ_ERR_BCBAD);[m
[31m-  /* Pop off last prototype. */[m
[31m-  L->top--;[m
[31m-  return protoV(L->top);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcwrite.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcwrite.c[m
[1mdeleted file mode 100644[m
[1mindex 4728305..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_bcwrite.c[m
[1m+++ /dev/null[m
[36m@@ -1,361 +0,0 @@[m
[31m-/*[m
[31m-** Bytecode writer.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_bcwrite_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_jit.h"[m
[31m-#endif[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* Context for bytecode writer. */[m
[31m-typedef struct BCWriteCtx {[m
[31m-  SBuf sb;			/* Output buffer. */[m
[31m-  GCproto *pt;			/* Root prototype. */[m
[31m-  lua_Writer wfunc;		/* Writer callback. */[m
[31m-  void *wdata;			/* Writer callback data. */[m
[31m-  int strip;			/* Strip debug info. */[m
[31m-  int status;			/* Status from writer callback. */[m
[31m-} BCWriteCtx;[m
[31m-[m
[31m-/* -- Bytecode writer ----------------------------------------------------- */[m
[31m-[m
[31m-/* Write a single constant key/value of a template table. */[m
[31m-static void bcwrite_ktabk(BCWriteCtx *ctx, cTValue *o, int narrow)[m
[31m-{[m
[31m-  char *p = lj_buf_more(&ctx->sb, 1+10);[m
[31m-  if (tvisstr(o)) {[m
[31m-    const GCstr *str = strV(o);[m
[31m-    MSize len = str->len;[m
[31m-    p = lj_buf_more(&ctx->sb, 5+len);[m
[31m-    p = lj_strfmt_wuleb128(p, BCDUMP_KTAB_STR+len);[m
[31m-    p = lj_buf_wmem(p, strdata(str), len);[m
[31m-  } else if (tvisint(o)) {[m
[31m-    *p++ = BCDUMP_KTAB_INT;[m
[31m-    p = lj_strfmt_wuleb128(p, intV(o));[m
[31m-  } else if (tvisnum(o)) {[m
[31m-    if (!LJ_DUALNUM && narrow) {  /* Narrow number constants to integers. */[m
[31m-      lua_Number num = numV(o);[m
[31m-      int32_t k = lj_num2int(num);[m
[31m-      if (num == (lua_Number)k) {  /* -0 is never a constant. */[m
[31m-	*p++ = BCDUMP_KTAB_INT;[m
[31m-	p = lj_strfmt_wuleb128(p, k);[m
[31m-	setsbufP(&ctx->sb, p);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-    *p++ = BCDUMP_KTAB_NUM;[m
[31m-    p = lj_strfmt_wuleb128(p, o->u32.lo);[m
[31m-    p = lj_strfmt_wuleb128(p, o->u32.hi);[m
[31m-  } else {[m
[31m-    lua_assert(tvispri(o));[m
[31m-    *p++ = BCDUMP_KTAB_NIL+~itype(o);[m
[31m-  }[m
[31m-  setsbufP(&ctx->sb, p);[m
[31m-}[m
[31m-[m
[31m-/* Write a template table. */[m
[31m-static void bcwrite_ktab(BCWriteCtx *ctx, char *p, const GCtab *t)[m
[31m-{[m
[31m-  MSize narray = 0, nhash = 0;[m
[31m-  if (t->asize > 0) {  /* Determine max. length of array part. */[m
[31m-    ptrdiff_t i;[m
[31m-    TValue *array = tvref(t->array);[m
[31m-    for (i = (ptrdiff_t)t->asize-1; i >= 0; i--)[m
[31m-      if (!tvisnil(&array[i]))[m
[31m-	break;[m
[31m-    narray = (MSize)(i+1);[m
[31m-  }[m
[31m-  if (t->hmask > 0) {  /* Count number of used hash slots. */[m
[31m-    MSize i, hmask = t->hmask;[m
[31m-    Node *node = noderef(t->node);[m
[31m-    for (i = 0; i <= hmask; i++)[m
[31m-      nhash += !tvisnil(&node[i].val);[m
[31m-  }[m
[31m-  /* Write number of array slots and hash slots. */[m
[31m-  p = lj_strfmt_wuleb128(p, narray);[m
[31m-  p = lj_strfmt_wuleb128(p, nhash);[m
[31m-  setsbufP(&ctx->sb, p);[m
[31m-  if (narray) {  /* Write array entries (may contain nil). */[m
[31m-    MSize i;[m
[31m-    TValue *o = tvref(t->array);[m
[31m-    for (i = 0; i < narray; i++, o++)[m
[31m-      bcwrite_ktabk(ctx, o, 1);[m
[31m-  }[m
[31m-  if (nhash) {  /* Write hash entries. */[m
[31m-    MSize i = nhash;[m
[31m-    Node *node = noderef(t->node) + t->hmask;[m
[31m-    for (;; node--)[m
[31m-      if (!tvisnil(&node->val)) {[m
[31m-	bcwrite_ktabk(ctx, &node->key, 0);[m
[31m-	bcwrite_ktabk(ctx, &node->val, 1);[m
[31m-	if (--i == 0) break;[m
[31m-      }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Write GC constants of a prototype. */[m
[31m-static void bcwrite_kgc(BCWriteCtx *ctx, GCproto *pt)[m
[31m-{[m
[31m-  MSize i, sizekgc = pt->sizekgc;[m
[31m-  GCRef *kr = mref(pt->k, GCRef) - (ptrdiff_t)sizekgc;[m
[31m-  for (i = 0; i < sizekgc; i++, kr++) {[m
[31m-    GCobj *o = gcref(*kr);[m
[31m-    MSize tp, need = 1;[m
[31m-    char *p;[m
[31m-    /* Determine constant type and needed size. */[m
[31m-    if (o->gch.gct == ~LJ_TSTR) {[m
[31m-      tp = BCDUMP_KGC_STR + gco2str(o)->len;[m
[31m-      need = 5+gco2str(o)->len;[m
[31m-    } else if (o->gch.gct == ~LJ_TPROTO) {[m
[31m-      lua_assert((pt->flags & PROTO_CHILD));[m
[31m-      tp = BCDUMP_KGC_CHILD;[m
[31m-#if LJ_HASFFI[m
[31m-    } else if (o->gch.gct == ~LJ_TCDATA) {[m
[31m-      CTypeID id = gco2cd(o)->ctypeid;[m
[31m-      need = 1+4*5;[m
[31m-      if (id == CTID_INT64) {[m
[31m-	tp = BCDUMP_KGC_I64;[m
[31m-      } else if (id == CTID_UINT64) {[m
[31m-	tp = BCDUMP_KGC_U64;[m
[31m-      } else {[m
[31m-	lua_assert(id == CTID_COMPLEX_DOUBLE);[m
[31m-	tp = BCDUMP_KGC_COMPLEX;[m
[31m-      }[m
[31m-#endif[m
[31m-    } else {[m
[31m-      lua_assert(o->gch.gct == ~LJ_TTAB);[m
[31m-      tp = BCDUMP_KGC_TAB;[m
[31m-      need = 1+2*5;[m
[31m-    }[m
[31m-    /* Write constant type. */[m
[31m-    p = lj_buf_more(&ctx->sb, need);[m
[31m-    p = lj_strfmt_wuleb128(p, tp);[m
[31m-    /* Write constant data (if any). */[m
[31m-    if (tp >= BCDUMP_KGC_STR) {[m
[31m-      p = lj_buf_wmem(p, strdata(gco2str(o)), gco2str(o)->len);[m
[31m-    } else if (tp == BCDUMP_KGC_TAB) {[m
[31m-      bcwrite_ktab(ctx, p, gco2tab(o));[m
[31m-      continue;[m
[31m-#if LJ_HASFFI[m
[31m-    } else if (tp != BCDUMP_KGC_CHILD) {[m
[31m-      cTValue *q = (TValue *)cdataptr(gco2cd(o));[m
[31m-      p = lj_strfmt_wuleb128(p, q[0].u32.lo);[m
[31m-      p = lj_strfmt_wuleb128(p, q[0].u32.hi);[m
[31m-      if (tp == BCDUMP_KGC_COMPLEX) {[m
[31m-	p = lj_strfmt_wuleb128(p, q[1].u32.lo);[m
[31m-	p = lj_strfmt_wuleb128(p, q[1].u32.hi);[m
[31m-      }[m
[31m-#endif[m
[31m-    }[m
[31m-    setsbufP(&ctx->sb, p);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Write number constants of a prototype. */[m
[31m-static void bcwrite_knum(BCWriteCtx *ctx, GCproto *pt)[m
[31m-{[m
[31m-  MSize i, sizekn = pt->sizekn;[m
[31m-  cTValue *o = mref(pt->k, TValue);[m
[31m-  char *p = lj_buf_more(&ctx->sb, 10*sizekn);[m
[31m-  for (i = 0; i < sizekn; i++, o++) {[m
[31m-    int32_t k;[m
[31m-    if (tvisint(o)) {[m
[31m-      k = intV(o);[m
[31m-      goto save_int;[m
[31m-    } else {[m
[31m-      /* Write a 33 bit ULEB128 for the int (lsb=0) or loword (lsb=1). */[m
[31m-      if (!LJ_DUALNUM) {  /* Narrow number constants to integers. */[m
[31m-	lua_Number num = numV(o);[m
[31m-	k = lj_num2int(num);[m
[31m-	if (num == (lua_Number)k) {  /* -0 is never a constant. */[m
[31m-	save_int:[m
[31m-	  p = lj_strfmt_wuleb128(p, 2*(uint32_t)k | ((uint32_t)k&0x80000000u));[m
[31m-	  if (k < 0)[m
[31m-	    p[-1] = (p[-1] & 7) | ((k>>27) & 0x18);[m
[31m-	  continue;[m
[31m-	}[m
[31m-      }[m
[31m-      p = lj_strfmt_wuleb128(p, 1+(2*o->u32.lo | (o->u32.lo & 0x80000000u)));[m
[31m-      if (o->u32.lo >= 0x80000000u)[m
[31m-	p[-1] = (p[-1] & 7) | ((o->u32.lo>>27) & 0x18);[m
[31m-      p = lj_strfmt_wuleb128(p, o->u32.hi);[m
[31m-    }[m
[31m-  }[m
[31m-  setsbufP(&ctx->sb, p);[m
[31m-}[m
[31m-[m
[31m-/* Write bytecode instructions. */[m
[31m-static char *bcwrite_bytecode(BCWriteCtx *ctx, char *p, GCproto *pt)[m
[31m-{[m
[31m-  MSize nbc = pt->sizebc-1;  /* Omit the [JI]FUNC* header. */[m
[31m-#if LJ_HASJIT[m
[31m-  uint8_t *q = (uint8_t *)p;[m
[31m-#endif[m
[31m-  p = lj_buf_wmem(p, proto_bc(pt)+1, nbc*(MSize)sizeof(BCIns));[m
[31m-  UNUSED(ctx);[m
[31m-#if LJ_HASJIT[m
[31m-  /* Unpatch modified bytecode containing ILOOP/JLOOP etc. */[m
[31m-  if ((pt->flags & PROTO_ILOOP) || pt->trace) {[m
[31m-    jit_State *J = L2J(sbufL(&ctx->sb));[m
[31m-    MSize i;[m
[31m-    for (i = 0; i < nbc; i++, q += sizeof(BCIns)) {[m
[31m-      BCOp op = (BCOp)q[LJ_ENDIAN_SELECT(0, 3)];[m
[31m-      if (op == BC_IFORL || op == BC_IITERL || op == BC_ILOOP ||[m
[31m-	  op == BC_JFORI) {[m
[31m-	q[LJ_ENDIAN_SELECT(0, 3)] = (uint8_t)(op-BC_IFORL+BC_FORL);[m
[31m-      } else if (op == BC_JFORL || op == BC_JITERL || op == BC_JLOOP) {[m
[31m-	BCReg rd = q[LJ_ENDIAN_SELECT(2, 1)] + (q[LJ_ENDIAN_SELECT(3, 0)] << 8);[m
[31m-	BCIns ins = traceref(J, rd)->startins;[m
[31m-	q[LJ_ENDIAN_SELECT(0, 3)] = (uint8_t)(op-BC_JFORL+BC_FORL);[m
[31m-	q[LJ_ENDIAN_SELECT(2, 1)] = bc_c(ins);[m
[31m-	q[LJ_ENDIAN_SELECT(3, 0)] = bc_b(ins);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Write prototype. */[m
[31m-static void bcwrite_proto(BCWriteCtx *ctx, GCproto *pt)[m
[31m-{[m
[31m-  MSize sizedbg = 0;[m
[31m-  char *p;[m
[31m-[m
[31m-  /* Recursively write children of prototype. */[m
[31m-  if ((pt->flags & PROTO_CHILD)) {[m
[31m-    ptrdiff_t i, n = pt->sizekgc;[m
[31m-    GCRef *kr = mref(pt->k, GCRef) - 1;[m
[31m-    for (i = 0; i < n; i++, kr--) {[m
[31m-      GCobj *o = gcref(*kr);[m
[31m-      if (o->gch.gct == ~LJ_TPROTO)[m
[31m-	bcwrite_proto(ctx, gco2pt(o));[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Start writing the prototype info to a buffer. */[m
[31m-  p = lj_buf_need(&ctx->sb,[m
[31m-		  5+4+6*5+(pt->sizebc-1)*(MSize)sizeof(BCIns)+pt->sizeuv*2);[m
[31m-  p += 5;  /* Leave room for final size. */[m
[31m-[m
[31m-  /* Write prototype header. */[m
[31m-  *p++ = (pt->flags & (PROTO_CHILD|PROTO_VARARG|PROTO_FFI));[m
[31m-  *p++ = pt->numparams;[m
[31m-  *p++ = pt->framesize;[m
[31m-  *p++ = pt->sizeuv;[m
[31m-  p = lj_strfmt_wuleb128(p, pt->sizekgc);[m
[31m-  p = lj_strfmt_wuleb128(p, pt->sizekn);[m
[31m-  p = lj_strfmt_wuleb128(p, pt->sizebc-1);[m
[31m-  if (!ctx->strip) {[m
[31m-    if (proto_lineinfo(pt))[m
[31m-      sizedbg = pt->sizept - (MSize)((char *)proto_lineinfo(pt) - (char *)pt);[m
[31m-    p = lj_strfmt_wuleb128(p, sizedbg);[m
[31m-    if (sizedbg) {[m
[31m-      p = lj_strfmt_wuleb128(p, pt->firstline);[m
[31m-      p = lj_strfmt_wuleb128(p, pt->numline);[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Write bytecode instructions and upvalue refs. */[m
[31m-  p = bcwrite_bytecode(ctx, p, pt);[m
[31m-  p = lj_buf_wmem(p, proto_uv(pt), pt->sizeuv*2);[m
[31m-  setsbufP(&ctx->sb, p);[m
[31m-[m
[31m-  /* Write constants. */[m
[31m-  bcwrite_kgc(ctx, pt);[m
[31m-  bcwrite_knum(ctx, pt);[m
[31m-[m
[31m-  /* Write debug info, if not stripped. */[m
[31m-  if (sizedbg) {[m
[31m-    p = lj_buf_more(&ctx->sb, sizedbg);[m
[31m-    p = lj_buf_wmem(p, proto_lineinfo(pt), sizedbg);[m
[31m-    setsbufP(&ctx->sb, p);[m
[31m-  }[m
[31m-[m
[31m-  /* Pass buffer to writer function. */[m
[31m-  if (ctx->status == 0) {[m
[31m-    MSize n = sbuflen(&ctx->sb) - 5;[m
[31m-    MSize nn = (lj_fls(n)+8)*9 >> 6;[m
[31m-    char *q = sbufB(&ctx->sb) + (5 - nn);[m
[31m-    p = lj_strfmt_wuleb128(q, n);  /* Fill in final size. */[m
[31m-    lua_assert(p == sbufB(&ctx->sb) + 5);[m
[31m-    ctx->status = ctx->wfunc(sbufL(&ctx->sb), q, nn+n, ctx->wdata);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Write header of bytecode dump. */[m
[31m-static void bcwrite_header(BCWriteCtx *ctx)[m
[31m-{[m
[31m-  GCstr *chunkname = proto_chunkname(ctx->pt);[m
[31m-  const char *name = strdata(chunkname);[m
[31m-  MSize len = chunkname->len;[m
[31m-  char *p = lj_buf_need(&ctx->sb, 5+5+len);[m
[31m-  *p++ = BCDUMP_HEAD1;[m
[31m-  *p++ = BCDUMP_HEAD2;[m
[31m-  *p++ = BCDUMP_HEAD3;[m
[31m-  *p++ = BCDUMP_VERSION;[m
[31m-  *p++ = (ctx->strip ? BCDUMP_F_STRIP : 0) +[m
[31m-	 LJ_BE*BCDUMP_F_BE +[m
[31m-	 ((ctx->pt->flags & PROTO_FFI) ? BCDUMP_F_FFI : 0) +[m
[31m-	 LJ_FR2*BCDUMP_F_FR2;[m
[31m-  if (!ctx->strip) {[m
[31m-    p = lj_strfmt_wuleb128(p, len);[m
[31m-    p = lj_buf_wmem(p, name, len);[m
[31m-  }[m
[31m-  ctx->status = ctx->wfunc(sbufL(&ctx->sb), sbufB(&ctx->sb),[m
[31m-			   (MSize)(p - sbufB(&ctx->sb)), ctx->wdata);[m
[31m-}[m
[31m-[m
[31m-/* Write footer of bytecode dump. */[m
[31m-static void bcwrite_footer(BCWriteCtx *ctx)[m
[31m-{[m
[31m-  if (ctx->status == 0) {[m
[31m-    uint8_t zero = 0;[m
[31m-    ctx->status = ctx->wfunc(sbufL(&ctx->sb), &zero, 1, ctx->wdata);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Protected callback for bytecode writer. */[m
[31m-static TValue *cpwriter(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  BCWriteCtx *ctx = (BCWriteCtx *)ud;[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  lj_buf_need(&ctx->sb, 1024);  /* Avoids resize for most prototypes. */[m
[31m-  bcwrite_header(ctx);[m
[31m-  bcwrite_proto(ctx, ctx->pt);[m
[31m-  bcwrite_footer(ctx);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Write bytecode for a prototype. */[m
[31m-int lj_bcwrite(lua_State *L, GCproto *pt, lua_Writer writer, void *data,[m
[31m-	      int strip)[m
[31m-{[m
[31m-  BCWriteCtx ctx;[m
[31m-  int status;[m
[31m-  ctx.pt = pt;[m
[31m-  ctx.wfunc = writer;[m
[31m-  ctx.wdata = data;[m
[31m-  ctx.strip = strip;[m
[31m-  ctx.status = 0;[m
[31m-  lj_buf_init(L, &ctx.sb);[m
[31m-  status = lj_vm_cpcall(L, NULL, &ctx, cpwriter);[m
[31m-  if (status == 0) status = ctx.status;[m
[31m-  lj_buf_free(G(sbufL(&ctx.sb)), &ctx.sb);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_buf.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_buf.c[m
[1mdeleted file mode 100644[m
[1mindex 6251b07..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_buf.c[m
[1m+++ /dev/null[m
[36m@@ -1,232 +0,0 @@[m
[31m-/*[m
[31m-** Buffer handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_buf_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- Buffer management --------------------------------------------------- */[m
[31m-[m
[31m-static void buf_grow(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  MSize osz = sbufsz(sb), len = sbuflen(sb), nsz = osz;[m
[31m-  char *b;[m
[31m-  if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF;[m
[31m-  while (nsz < sz) nsz += nsz;[m
[31m-  b = (char *)lj_mem_realloc(sbufL(sb), sbufB(sb), osz, nsz);[m
[31m-  setmref(sb->b, b);[m
[31m-  setmref(sb->p, b + len);[m
[31m-  setmref(sb->e, b + nsz);[m
[31m-}[m
[31m-[m
[31m-LJ_NOINLINE char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  lua_assert(sz > sbufsz(sb));[m
[31m-  if (LJ_UNLIKELY(sz > LJ_MAX_BUF))[m
[31m-    lj_err_mem(sbufL(sb));[m
[31m-  buf_grow(sb, sz);[m
[31m-  return sbufB(sb);[m
[31m-}[m
[31m-[m
[31m-LJ_NOINLINE char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  MSize len = sbuflen(sb);[m
[31m-  lua_assert(sz > sbufleft(sb));[m
[31m-  if (LJ_UNLIKELY(sz > LJ_MAX_BUF || len + sz > LJ_MAX_BUF))[m
[31m-    lj_err_mem(sbufL(sb));[m
[31m-  buf_grow(sb, len + sz);[m
[31m-  return sbufP(sb);[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb)[m
[31m-{[m
[31m-  char *b = sbufB(sb);[m
[31m-  MSize osz = (MSize)(sbufE(sb) - b);[m
[31m-  if (osz > 2*LJ_MIN_SBUF) {[m
[31m-    MSize n = (MSize)(sbufP(sb) - b);[m
[31m-    b = lj_mem_realloc(L, b, osz, (osz >> 1));[m
[31m-    setmref(sb->b, b);[m
[31m-    setmref(sb->p, b + n);[m
[31m-    setmref(sb->e, b + (osz >> 1));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz)[m
[31m-{[m
[31m-  SBuf *sb = &G(L)->tmpbuf;[m
[31m-  setsbufL(sb, L);[m
[31m-  return lj_buf_need(sb, sz);[m
[31m-}[m
[31m-[m
[31m-/* -- Low-level buffer put operations ------------------------------------- */[m
[31m-[m
[31m-SBuf *lj_buf_putmem(SBuf *sb, const void *q, MSize len)[m
[31m-{[m
[31m-  char *p = lj_buf_more(sb, len);[m
[31m-  p = lj_buf_wmem(p, q, len);[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c)[m
[31m-{[m
[31m-  char *p = lj_buf_more(sb, 1);[m
[31m-  *p++ = (char)c;[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putstr(SBuf *sb, GCstr *s)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  char *p = lj_buf_more(sb, len);[m
[31m-  p = lj_buf_wmem(p, strdata(s), len);[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* -- High-level buffer put operations ------------------------------------ */[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  char *p = lj_buf_more(sb, len), *e = p+len;[m
[31m-  const char *q = strdata(s)+len-1;[m
[31m-  while (p < e)[m
[31m-    *p++ = *q--;[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  char *p = lj_buf_more(sb, len), *e = p+len;[m
[31m-  const char *q = strdata(s);[m
[31m-  for (; p < e; p++, q++) {[m
[31m-    uint32_t c = *(unsigned char *)q;[m
[31m-#if LJ_TARGET_PPC[m
[31m-    *p = c + ((c >= 'A' && c <= 'Z') << 5);[m
[31m-#else[m
[31m-    if (c >= 'A' && c <= 'Z') c += 0x20;[m
[31m-    *p = c;[m
[31m-#endif[m
[31m-  }[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  char *p = lj_buf_more(sb, len), *e = p+len;[m
[31m-  const char *q = strdata(s);[m
[31m-  for (; p < e; p++, q++) {[m
[31m-    uint32_t c = *(unsigned char *)q;[m
[31m-#if LJ_TARGET_PPC[m
[31m-    *p = c - ((c >= 'a' && c <= 'z') << 5);[m
[31m-#else[m
[31m-    if (c >= 'a' && c <= 'z') c -= 0x20;[m
[31m-    *p = c;[m
[31m-#endif[m
[31m-  }[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf *lj_buf_putstr_rep(SBuf *sb, GCstr *s, int32_t rep)[m
[31m-{[m
[31m-  MSize len = s->len;[m
[31m-  if (rep > 0 && len) {[m
[31m-    uint64_t tlen = (uint64_t)rep * len;[m
[31m-    char *p;[m
[31m-    if (LJ_UNLIKELY(tlen > LJ_MAX_STR))[m
[31m-      lj_err_mem(sbufL(sb));[m
[31m-    p = lj_buf_more(sb, (MSize)tlen);[m
[31m-    if (len == 1) {  /* Optimize a common case. */[m
[31m-      uint32_t c = strdata(s)[0];[m
[31m-      do { *p++ = c; } while (--rep > 0);[m
[31m-    } else {[m
[31m-      const char *e = strdata(s) + len;[m
[31m-      do {[m
[31m-	const char *q = strdata(s);[m
[31m-	do { *p++ = *q++; } while (q < e);[m
[31m-      } while (--rep > 0);[m
[31m-    }[m
[31m-    setsbufP(sb, p);[m
[31m-  }[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-SBuf *lj_buf_puttab(SBuf *sb, GCtab *t, GCstr *sep, int32_t i, int32_t e)[m
[31m-{[m
[31m-  MSize seplen = sep ? sep->len : 0;[m
[31m-  if (i <= e) {[m
[31m-    for (;;) {[m
[31m-      cTValue *o = lj_tab_getint(t, i);[m
[31m-      char *p;[m
[31m-      if (!o) {[m
[31m-      badtype:  /* Error: bad element type. */[m
[31m-	setsbufP(sb, (void *)(intptr_t)i);  /* Store failing index. */[m
[31m-	return NULL;[m
[31m-      } else if (tvisstr(o)) {[m
[31m-	MSize len = strV(o)->len;[m
[31m-	p = lj_buf_wmem(lj_buf_more(sb, len + seplen), strVdata(o), len);[m
[31m-      } else if (tvisint(o)) {[m
[31m-	p = lj_strfmt_wint(lj_buf_more(sb, STRFMT_MAXBUF_INT+seplen), intV(o));[m
[31m-      } else if (tvisnum(o)) {[m
[31m-	p = lj_buf_more(lj_strfmt_putfnum(sb, STRFMT_G14, numV(o)), seplen);[m
[31m-      } else {[m
[31m-	goto badtype;[m
[31m-      }[m
[31m-      if (i++ == e) {[m
[31m-	setsbufP(sb, p);[m
[31m-	break;[m
[31m-      }[m
[31m-      if (seplen) p = lj_buf_wmem(p, strdata(sep), seplen);[m
[31m-      setsbufP(sb, p);[m
[31m-    }[m
[31m-  }[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous buffer operations ------------------------------------- */[m
[31m-[m
[31m-GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb)[m
[31m-{[m
[31m-  return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb));[m
[31m-}[m
[31m-[m
[31m-/* Concatenate two strings. */[m
[31m-GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2)[m
[31m-{[m
[31m-  MSize len1 = s1->len, len2 = s2->len;[m
[31m-  char *buf = lj_buf_tmp(L, len1 + len2);[m
[31m-  memcpy(buf, strdata(s1), len1);[m
[31m-  memcpy(buf+len1, strdata(s2), len2);[m
[31m-  return lj_str_new(L, buf, len1 + len2);[m
[31m-}[m
[31m-[m
[31m-/* Read ULEB128 from buffer. */[m
[31m-uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp)[m
[31m-{[m
[31m-  const uint8_t *p = (const uint8_t *)*pp;[m
[31m-  uint32_t v = *p++;[m
[31m-  if (LJ_UNLIKELY(v >= 0x80)) {[m
[31m-    int sh = 0;[m
[31m-    v &= 0x7f;[m
[31m-    do { v |= ((*p & 0x7f) << (sh += 7)); } while (*p++ >= 0x80);[m
[31m-  }[m
[31m-  *pp = (const char *)p;[m
[31m-  return v;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_buf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_buf.h[m
[1mdeleted file mode 100644[m
[1mindex fb632ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_buf.h[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-/*[m
[31m-** Buffer handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_BUF_H[m
[31m-#define _LJ_BUF_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_str.h"[m
[31m-[m
[31m-/* Resizable string buffers. Struct definition in lj_obj.h. */[m
[31m-#define sbufB(sb)	(mref((sb)->b, char))[m
[31m-#define sbufP(sb)	(mref((sb)->p, char))[m
[31m-#define sbufE(sb)	(mref((sb)->e, char))[m
[31m-#define sbufL(sb)	(mref((sb)->L, lua_State))[m
[31m-#define sbufsz(sb)	((MSize)(sbufE((sb)) - sbufB((sb))))[m
[31m-#define sbuflen(sb)	((MSize)(sbufP((sb)) - sbufB((sb))))[m
[31m-#define sbufleft(sb)	((MSize)(sbufE((sb)) - sbufP((sb))))[m
[31m-#define setsbufP(sb, q)	(setmref((sb)->p, (q)))[m
[31m-#define setsbufL(sb, l)	(setmref((sb)->L, (l)))[m
[31m-[m
[31m-/* Buffer management */[m
[31m-LJ_FUNC char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz);[m
[31m-LJ_FUNC char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb);[m
[31m-LJ_FUNC char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz);[m
[31m-[m
[31m-static LJ_AINLINE void lj_buf_init(lua_State *L, SBuf *sb)[m
[31m-{[m
[31m-  setsbufL(sb, L);[m
[31m-  setmref(sb->p, NULL); setmref(sb->e, NULL); setmref(sb->b, NULL);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void lj_buf_reset(SBuf *sb)[m
[31m-{[m
[31m-  setmrefr(sb->p, sb->b);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE SBuf *lj_buf_tmp_(lua_State *L)[m
[31m-{[m
[31m-  SBuf *sb = &G(L)->tmpbuf;[m
[31m-  setsbufL(sb, L);[m
[31m-  lj_buf_reset(sb);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb)[m
[31m-{[m
[31m-  lj_mem_free(g, sbufB(sb), sbufsz(sb));[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE char *lj_buf_need(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(sz > sbufsz(sb)))[m
[31m-    return lj_buf_need2(sb, sz);[m
[31m-  return sbufB(sb);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE char *lj_buf_more(SBuf *sb, MSize sz)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(sz > sbufleft(sb)))[m
[31m-    return lj_buf_more2(sb, sz);[m
[31m-  return sbufP(sb);[m
[31m-}[m
[31m-[m
[31m-/* Low-level buffer put operations */[m
[31m-LJ_FUNC SBuf *lj_buf_putmem(SBuf *sb, const void *q, MSize len);[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c);[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_buf_putstr(SBuf *sb, GCstr *s);[m
[31m-[m
[31m-static LJ_AINLINE char *lj_buf_wmem(char *p, const void *q, MSize len)[m
[31m-{[m
[31m-  return (char *)memcpy(p, q, len) + len;[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void lj_buf_putb(SBuf *sb, int c)[m
[31m-{[m
[31m-  char *p = lj_buf_more(sb, 1);[m
[31m-  *p++ = (char)c;[m
[31m-  setsbufP(sb, p);[m
[31m-}[m
[31m-[m
[31m-/* High-level buffer put operations */[m
[31m-LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s);[m
[31m-LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s);[m
[31m-LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s);[m
[31m-LJ_FUNC SBuf *lj_buf_putstr_rep(SBuf *sb, GCstr *s, int32_t rep);[m
[31m-LJ_FUNC SBuf *lj_buf_puttab(SBuf *sb, GCtab *t, GCstr *sep,[m
[31m-			    int32_t i, int32_t e);[m
[31m-[m
[31m-/* Miscellaneous buffer operations */[m
[31m-LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb);[m
[31m-LJ_FUNC GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2);[m
[31m-LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp);[m
[31m-[m
[31m-static LJ_AINLINE GCstr *lj_buf_str(lua_State *L, SBuf *sb)[m
[31m-{[m
[31m-  return lj_str_new(L, sbufB(sb), sbuflen(sb));[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_carith.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_carith.c[m
[1mdeleted file mode 100644[m
[1mindex 6102dca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_carith.c[m
[1m+++ /dev/null[m
[36m@@ -1,429 +0,0 @@[m
[31m-/*[m
[31m-** C data arithmetic.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_carith.h"[m
[31m-#include "lj_strscan.h"[m
[31m-[m
[31m-/* -- C data arithmetic --------------------------------------------------- */[m
[31m-[m
[31m-/* Binary operands of an operator converted to ctypes. */[m
[31m-typedef struct CDArith {[m
[31m-  uint8_t *p[2];[m
[31m-  CType *ct[2];[m
[31m-} CDArith;[m
[31m-[m
[31m-/* Check arguments for arithmetic metamethods. */[m
[31m-static int carith_checkarg(lua_State *L, CTState *cts, CDArith *ca)[m
[31m-{[m
[31m-  TValue *o = L->base;[m
[31m-  int ok = 1;[m
[31m-  MSize i;[m
[31m-  if (o+1 >= L->top)[m
[31m-    lj_err_argt(L, 1, LUA_TCDATA);[m
[31m-  for (i = 0; i < 2; i++, o++) {[m
[31m-    if (tviscdata(o)) {[m
[31m-      GCcdata *cd = cdataV(o);[m
[31m-      CTypeID id = (CTypeID)cd->ctypeid;[m
[31m-      CType *ct = ctype_raw(cts, id);[m
[31m-      uint8_t *p = (uint8_t *)cdataptr(cd);[m
[31m-      if (ctype_isptr(ct->info)) {[m
[31m-	p = (uint8_t *)cdata_getptr(p, ct->size);[m
[31m-	if (ctype_isref(ct->info)) ct = ctype_rawchild(cts, ct);[m
[31m-      } else if (ctype_isfunc(ct->info)) {[m
[31m-	p = (uint8_t *)*(void **)p;[m
[31m-	ct = ctype_get(cts,[m
[31m-	  lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR));[m
[31m-      }[m
[31m-      if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-      ca->ct[i] = ct;[m
[31m-      ca->p[i] = p;[m
[31m-    } else if (tvisint(o)) {[m
[31m-      ca->ct[i] = ctype_get(cts, CTID_INT32);[m
[31m-      ca->p[i] = (uint8_t *)&o->i;[m
[31m-    } else if (tvisnum(o)) {[m
[31m-      ca->ct[i] = ctype_get(cts, CTID_DOUBLE);[m
[31m-      ca->p[i] = (uint8_t *)&o->n;[m
[31m-    } else if (tvisnil(o)) {[m
[31m-      ca->ct[i] = ctype_get(cts, CTID_P_VOID);[m
[31m-      ca->p[i] = (uint8_t *)0;[m
[31m-    } else if (tvisstr(o)) {[m
[31m-      TValue *o2 = i == 0 ? o+1 : o-1;[m
[31m-      CType *ct = ctype_raw(cts, cdataV(o2)->ctypeid);[m
[31m-      ca->ct[i] = NULL;[m
[31m-      ca->p[i] = (uint8_t *)strVdata(o);[m
[31m-      ok = 0;[m
[31m-      if (ctype_isenum(ct->info)) {[m
[31m-	CTSize ofs;[m
[31m-	CType *cct = lj_ctype_getfield(cts, ct, strV(o), &ofs);[m
[31m-	if (cct && ctype_isconstval(cct->info)) {[m
[31m-	  ca->ct[i] = ctype_child(cts, cct);[m
[31m-	  ca->p[i] = (uint8_t *)&cct->size;  /* Assumes ct does not grow. */[m
[31m-	  ok = 1;[m
[31m-	} else {[m
[31m-	  ca->ct[1-i] = ct;  /* Use enum to improve error message. */[m
[31m-	  ca->p[1-i] = NULL;[m
[31m-	  break;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      ca->ct[i] = NULL;[m
[31m-      ca->p[i] = (void *)(intptr_t)1;  /* To make it unequal. */[m
[31m-      ok = 0;[m
[31m-    }[m
[31m-  }[m
[31m-  return ok;[m
[31m-}[m
[31m-[m
[31m-/* Pointer arithmetic. */[m
[31m-static int carith_ptr(lua_State *L, CTState *cts, CDArith *ca, MMS mm)[m
[31m-{[m
[31m-  CType *ctp = ca->ct[0];[m
[31m-  uint8_t *pp = ca->p[0];[m
[31m-  ptrdiff_t idx;[m
[31m-  CTSize sz;[m
[31m-  CTypeID id;[m
[31m-  GCcdata *cd;[m
[31m-  if (ctype_isptr(ctp->info) || ctype_isrefarray(ctp->info)) {[m
[31m-    if ((mm == MM_sub || mm == MM_eq || mm == MM_lt || mm == MM_le) &&[m
[31m-	(ctype_isptr(ca->ct[1]->info) || ctype_isrefarray(ca->ct[1]->info))) {[m
[31m-      uint8_t *pp2 = ca->p[1];[m
[31m-      if (mm == MM_eq) {  /* Pointer equality. Incompatible pointers are ok. */[m
[31m-	setboolV(L->top-1, (pp == pp2));[m
[31m-	return 1;[m
[31m-      }[m
[31m-      if (!lj_cconv_compatptr(cts, ctp, ca->ct[1], CCF_IGNQUAL))[m
[31m-	return 0;[m
[31m-      if (mm == MM_sub) {  /* Pointer difference. */[m
[31m-	intptr_t diff;[m
[31m-	sz = lj_ctype_size(cts, ctype_cid(ctp->info));  /* Element size. */[m
[31m-	if (sz == 0 || sz == CTSIZE_INVALID)[m
[31m-	  return 0;[m
[31m-	diff = ((intptr_t)pp - (intptr_t)pp2) / (int32_t)sz;[m
[31m-	/* All valid pointer differences on x64 are in (-2^47, +2^47),[m
[31m-	** which fits into a double without loss of precision.[m
[31m-	*/[m
[31m-	setintptrV(L->top-1, (int32_t)diff);[m
[31m-	return 1;[m
[31m-      } else if (mm == MM_lt) {  /* Pointer comparison (unsigned). */[m
[31m-	setboolV(L->top-1, ((uintptr_t)pp < (uintptr_t)pp2));[m
[31m-	return 1;[m
[31m-      } else {[m
[31m-	lua_assert(mm == MM_le);[m
[31m-	setboolV(L->top-1, ((uintptr_t)pp <= (uintptr_t)pp2));[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!((mm == MM_add || mm == MM_sub) && ctype_isnum(ca->ct[1]->info)))[m
[31m-      return 0;[m
[31m-    lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ca->ct[1],[m
[31m-		   (uint8_t *)&idx, ca->p[1], 0);[m
[31m-    if (mm == MM_sub) idx = -idx;[m
[31m-  } else if (mm == MM_add && ctype_isnum(ctp->info) &&[m
[31m-      (ctype_isptr(ca->ct[1]->info) || ctype_isrefarray(ca->ct[1]->info))) {[m
[31m-    /* Swap pointer and index. */[m
[31m-    ctp = ca->ct[1]; pp = ca->p[1];[m
[31m-    lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ca->ct[0],[m
[31m-		   (uint8_t *)&idx, ca->p[0], 0);[m
[31m-  } else {[m
[31m-    return 0;[m
[31m-  }[m
[31m-  sz = lj_ctype_size(cts, ctype_cid(ctp->info));  /* Element size. */[m
[31m-  if (sz == CTSIZE_INVALID)[m
[31m-    return 0;[m
[31m-  pp += idx*(int32_t)sz;  /* Compute pointer + index. */[m
[31m-  id = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ctp->info)),[m
[31m-		       CTSIZE_PTR);[m
[31m-  cd = lj_cdata_new(cts, id, CTSIZE_PTR);[m
[31m-  *(uint8_t **)cdataptr(cd) = pp;[m
[31m-  setcdataV(L, L->top-1, cd);[m
[31m-  lj_gc_check(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* 64 bit integer arithmetic. */[m
[31m-static int carith_int64(lua_State *L, CTState *cts, CDArith *ca, MMS mm)[m
[31m-{[m
[31m-  if (ctype_isnum(ca->ct[0]->info) && ca->ct[0]->size <= 8 &&[m
[31m-      ctype_isnum(ca->ct[1]->info) && ca->ct[1]->size <= 8) {[m
[31m-    CTypeID id = (((ca->ct[0]->info & CTF_UNSIGNED) && ca->ct[0]->size == 8) ||[m
[31m-		  ((ca->ct[1]->info & CTF_UNSIGNED) && ca->ct[1]->size == 8)) ?[m
[31m-		 CTID_UINT64 : CTID_INT64;[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    GCcdata *cd;[m
[31m-    uint64_t u0, u1, *up;[m
[31m-    lj_cconv_ct_ct(cts, ct, ca->ct[0], (uint8_t *)&u0, ca->p[0], 0);[m
[31m-    if (mm != MM_unm)[m
[31m-      lj_cconv_ct_ct(cts, ct, ca->ct[1], (uint8_t *)&u1, ca->p[1], 0);[m
[31m-    switch (mm) {[m
[31m-    case MM_eq:[m
[31m-      setboolV(L->top-1, (u0 == u1));[m
[31m-      return 1;[m
[31m-    case MM_lt:[m
[31m-      setboolV(L->top-1,[m
[31m-	       id == CTID_INT64 ? ((int64_t)u0 < (int64_t)u1) : (u0 < u1));[m
[31m-      return 1;[m
[31m-    case MM_le:[m
[31m-      setboolV(L->top-1,[m
[31m-	       id == CTID_INT64 ? ((int64_t)u0 <= (int64_t)u1) : (u0 <= u1));[m
[31m-      return 1;[m
[31m-    default: break;[m
[31m-    }[m
[31m-    cd = lj_cdata_new(cts, id, 8);[m
[31m-    up = (uint64_t *)cdataptr(cd);[m
[31m-    setcdataV(L, L->top-1, cd);[m
[31m-    switch (mm) {[m
[31m-    case MM_add: *up = u0 + u1; break;[m
[31m-    case MM_sub: *up = u0 - u1; break;[m
[31m-    case MM_mul: *up = u0 * u1; break;[m
[31m-    case MM_div:[m
[31m-      if (id == CTID_INT64)[m
[31m-	*up = (uint64_t)lj_carith_divi64((int64_t)u0, (int64_t)u1);[m
[31m-      else[m
[31m-	*up = lj_carith_divu64(u0, u1);[m
[31m-      break;[m
[31m-    case MM_mod:[m
[31m-      if (id == CTID_INT64)[m
[31m-	*up = (uint64_t)lj_carith_modi64((int64_t)u0, (int64_t)u1);[m
[31m-      else[m
[31m-	*up = lj_carith_modu64(u0, u1);[m
[31m-      break;[m
[31m-    case MM_pow:[m
[31m-      if (id == CTID_INT64)[m
[31m-	*up = (uint64_t)lj_carith_powi64((int64_t)u0, (int64_t)u1);[m
[31m-      else[m
[31m-	*up = lj_carith_powu64(u0, u1);[m
[31m-      break;[m
[31m-    case MM_unm: *up = (uint64_t)-(int64_t)u0; break;[m
[31m-    default: lua_assert(0); break;[m
[31m-    }[m
[31m-    lj_gc_check(L);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Handle ctype arithmetic metamethods. */[m
[31m-static int lj_carith_meta(lua_State *L, CTState *cts, CDArith *ca, MMS mm)[m
[31m-{[m
[31m-  cTValue *tv = NULL;[m
[31m-  if (tviscdata(L->base)) {[m
[31m-    CTypeID id = cdataV(L->base)->ctypeid;[m
[31m-    CType *ct = ctype_raw(cts, id);[m
[31m-    if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-    tv = lj_ctype_meta(cts, id, mm);[m
[31m-  }[m
[31m-  if (!tv && L->base+1 < L->top && tviscdata(L->base+1)) {[m
[31m-    CTypeID id = cdataV(L->base+1)->ctypeid;[m
[31m-    CType *ct = ctype_raw(cts, id);[m
[31m-    if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-    tv = lj_ctype_meta(cts, id, mm);[m
[31m-  }[m
[31m-  if (!tv) {[m
[31m-    const char *repr[2];[m
[31m-    int i, isenum = -1, isstr = -1;[m
[31m-    if (mm == MM_eq) {  /* Equality checks never raise an error. */[m
[31m-      int eq = ca->p[0] == ca->p[1];[m
[31m-      setboolV(L->top-1, eq);[m
[31m-      setboolV(&G(L)->tmptv2, eq);  /* Remember for trace recorder. */[m
[31m-      return 1;[m
[31m-    }[m
[31m-    for (i = 0; i < 2; i++) {[m
[31m-      if (ca->ct[i] && tviscdata(L->base+i)) {[m
[31m-	if (ctype_isenum(ca->ct[i]->info)) isenum = i;[m
[31m-	repr[i] = strdata(lj_ctype_repr(L, ctype_typeid(cts, ca->ct[i]), NULL));[m
[31m-      } else {[m
[31m-	if (tvisstr(&L->base[i])) isstr = i;[m
[31m-	repr[i] = lj_typename(&L->base[i]);[m
[31m-      }[m
[31m-    }[m
[31m-    if ((isenum ^ isstr) == 1)[m
[31m-      lj_err_callerv(L, LJ_ERR_FFI_BADCONV, repr[isstr], repr[isenum]);[m
[31m-    lj_err_callerv(L, mm == MM_len ? LJ_ERR_FFI_BADLEN :[m
[31m-		      mm == MM_concat ? LJ_ERR_FFI_BADCONCAT :[m
[31m-		      mm < MM_add ? LJ_ERR_FFI_BADCOMP : LJ_ERR_FFI_BADARITH,[m
[31m-		   repr[0], repr[1]);[m
[31m-  }[m
[31m-  return lj_meta_tailcall(L, tv);[m
[31m-}[m
[31m-[m
[31m-/* Arithmetic operators for cdata. */[m
[31m-int lj_carith_op(lua_State *L, MMS mm)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CDArith ca;[m
[31m-  if (carith_checkarg(L, cts, &ca)) {[m
[31m-    if (carith_int64(L, cts, &ca, mm) || carith_ptr(L, cts, &ca, mm)) {[m
[31m-      copyTV(L, &G(L)->tmptv2, L->top-1);  /* Remember for trace recorder. */[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return lj_carith_meta(L, cts, &ca, mm);[m
[31m-}[m
[31m-[m
[31m-/* -- 64 bit bit operations helpers --------------------------------------- */[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define B64DEF(name) \[m
[31m-  static LJ_AINLINE uint64_t lj_carith_##name(uint64_t x, int32_t sh)[m
[31m-#else[m
[31m-/* Not inlined on 32 bit archs, since some of these are quite lengthy. */[m
[31m-#define B64DEF(name) \[m
[31m-  uint64_t LJ_NOINLINE lj_carith_##name(uint64_t x, int32_t sh)[m
[31m-#endif[m
[31m-[m
[31m-B64DEF(shl64) { return x << (sh&63); }[m
[31m-B64DEF(shr64) { return x >> (sh&63); }[m
[31m-B64DEF(sar64) { return (uint64_t)((int64_t)x >> (sh&63)); }[m
[31m-B64DEF(rol64) { return lj_rol(x, (sh&63)); }[m
[31m-B64DEF(ror64) { return lj_ror(x, (sh&63)); }[m
[31m-[m
[31m-#undef B64DEF[m
[31m-[m
[31m-uint64_t lj_carith_shift64(uint64_t x, int32_t sh, int op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case IR_BSHL-IR_BSHL: x = lj_carith_shl64(x, sh); break;[m
[31m-  case IR_BSHR-IR_BSHL: x = lj_carith_shr64(x, sh); break;[m
[31m-  case IR_BSAR-IR_BSHL: x = lj_carith_sar64(x, sh); break;[m
[31m-  case IR_BROL-IR_BSHL: x = lj_carith_rol64(x, sh); break;[m
[31m-  case IR_BROR-IR_BSHL: x = lj_carith_ror64(x, sh); break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-  return x;[m
[31m-}[m
[31m-[m
[31m-/* Equivalent to lj_lib_checkbit(), but handles cdata. */[m
[31m-uint64_t lj_carith_check64(lua_State *L, int narg, CTypeID *id)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (o >= L->top) {[m
[31m-  err:[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-  } else if (LJ_LIKELY(tvisnumber(o))) {[m
[31m-    /* Handled below. */[m
[31m-  } else if (tviscdata(o)) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    uint8_t *sp = (uint8_t *)cdataptr(cdataV(o));[m
[31m-    CTypeID sid = cdataV(o)->ctypeid;[m
[31m-    CType *s = ctype_get(cts, sid);[m
[31m-    uint64_t x;[m
[31m-    if (ctype_isref(s->info)) {[m
[31m-      sp = *(void **)sp;[m
[31m-      sid = ctype_cid(s->info);[m
[31m-    }[m
[31m-    s = ctype_raw(cts, sid);[m
[31m-    if (ctype_isenum(s->info)) s = ctype_child(cts, s);[m
[31m-    if ((s->info & (CTMASK_NUM|CTF_BOOL|CTF_FP|CTF_UNSIGNED)) ==[m
[31m-	CTINFO(CT_NUM, CTF_UNSIGNED) && s->size == 8)[m
[31m-      *id = CTID_UINT64;  /* Use uint64_t, since it has the highest rank. */[m
[31m-    else if (!*id)[m
[31m-      *id = CTID_INT64;  /* Use int64_t, unless already set. */[m
[31m-    lj_cconv_ct_ct(cts, ctype_get(cts, *id), s,[m
[31m-		   (uint8_t *)&x, sp, CCF_ARG(narg));[m
[31m-    return x;[m
[31m-  } else if (!(tvisstr(o) && lj_strscan_number(strV(o), o))) {[m
[31m-    goto err;[m
[31m-  }[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return (uint32_t)intV(o);[m
[31m-  } else {[m
[31m-    int32_t i = lj_num2bit(numV(o));[m
[31m-    if (LJ_DUALNUM) setintV(o, i);[m
[31m-    return (uint32_t)i;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* -- 64 bit integer arithmetic helpers ----------------------------------- */[m
[31m-[m
[31m-#if LJ_32 && LJ_HASJIT[m
[31m-/* Signed/unsigned 64 bit multiplication. */[m
[31m-int64_t lj_carith_mul64(int64_t a, int64_t b)[m
[31m-{[m
[31m-  return a * b;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Unsigned 64 bit division. */[m
[31m-uint64_t lj_carith_divu64(uint64_t a, uint64_t b)[m
[31m-{[m
[31m-  if (b == 0) return U64x(80000000,00000000);[m
[31m-  return a / b;[m
[31m-}[m
[31m-[m
[31m-/* Signed 64 bit division. */[m
[31m-int64_t lj_carith_divi64(int64_t a, int64_t b)[m
[31m-{[m
[31m-  if (b == 0 || (a == (int64_t)U64x(80000000,00000000) && b == -1))[m
[31m-    return U64x(80000000,00000000);[m
[31m-  return a / b;[m
[31m-}[m
[31m-[m
[31m-/* Unsigned 64 bit modulo. */[m
[31m-uint64_t lj_carith_modu64(uint64_t a, uint64_t b)[m
[31m-{[m
[31m-  if (b == 0) return U64x(80000000,00000000);[m
[31m-  return a % b;[m
[31m-}[m
[31m-[m
[31m-/* Signed 64 bit modulo. */[m
[31m-int64_t lj_carith_modi64(int64_t a, int64_t b)[m
[31m-{[m
[31m-  if (b == 0) return U64x(80000000,00000000);[m
[31m-  if (a == (int64_t)U64x(80000000,00000000) && b == -1) return 0;[m
[31m-  return a % b;[m
[31m-}[m
[31m-[m
[31m-/* Unsigned 64 bit x^k. */[m
[31m-uint64_t lj_carith_powu64(uint64_t x, uint64_t k)[m
[31m-{[m
[31m-  uint64_t y;[m
[31m-  if (k == 0)[m
[31m-    return 1;[m
[31m-  for (; (k & 1) == 0; k >>= 1) x *= x;[m
[31m-  y = x;[m
[31m-  if ((k >>= 1) != 0) {[m
[31m-    for (;;) {[m
[31m-      x *= x;[m
[31m-      if (k == 1) break;[m
[31m-      if (k & 1) y *= x;[m
[31m-      k >>= 1;[m
[31m-    }[m
[31m-    y *= x;[m
[31m-  }[m
[31m-  return y;[m
[31m-}[m
[31m-[m
[31m-/* Signed 64 bit x^k. */[m
[31m-int64_t lj_carith_powi64(int64_t x, int64_t k)[m
[31m-{[m
[31m-  if (k == 0)[m
[31m-    return 1;[m
[31m-  if (k < 0) {[m
[31m-    if (x == 0)[m
[31m-      return U64x(7fffffff,ffffffff);[m
[31m-    else if (x == 1)[m
[31m-      return 1;[m
[31m-    else if (x == -1)[m
[31m-      return (k & 1) ? -1 : 1;[m
[31m-    else[m
[31m-      return 0;[m
[31m-  }[m
[31m-  return (int64_t)lj_carith_powu64((uint64_t)x, (uint64_t)k);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_carith.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_carith.h[m
[1mdeleted file mode 100644[m
[1mindex b3bdff8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_carith.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-/*[m
[31m-** C data arithmetic.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CARITH_H[m
[31m-#define _LJ_CARITH_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-LJ_FUNC int lj_carith_op(lua_State *L, MMS mm);[m
[31m-[m
[31m-#if LJ_32[m
[31m-LJ_FUNC uint64_t lj_carith_shl64(uint64_t x, int32_t sh);[m
[31m-LJ_FUNC uint64_t lj_carith_shr64(uint64_t x, int32_t sh);[m
[31m-LJ_FUNC uint64_t lj_carith_sar64(uint64_t x, int32_t sh);[m
[31m-LJ_FUNC uint64_t lj_carith_rol64(uint64_t x, int32_t sh);[m
[31m-LJ_FUNC uint64_t lj_carith_ror64(uint64_t x, int32_t sh);[m
[31m-#endif[m
[31m-LJ_FUNC uint64_t lj_carith_shift64(uint64_t x, int32_t sh, int op);[m
[31m-LJ_FUNC uint64_t lj_carith_check64(lua_State *L, int narg, CTypeID *id);[m
[31m-[m
[31m-#if LJ_32 && LJ_HASJIT[m
[31m-LJ_FUNC int64_t lj_carith_mul64(int64_t x, int64_t k);[m
[31m-#endif[m
[31m-LJ_FUNC uint64_t lj_carith_divu64(uint64_t a, uint64_t b);[m
[31m-LJ_FUNC int64_t lj_carith_divi64(int64_t a, int64_t b);[m
[31m-LJ_FUNC uint64_t lj_carith_modu64(uint64_t a, uint64_t b);[m
[31m-LJ_FUNC int64_t lj_carith_modi64(int64_t a, int64_t b);[m
[31m-LJ_FUNC uint64_t lj_carith_powu64(uint64_t x, uint64_t k);[m
[31m-LJ_FUNC int64_t lj_carith_powi64(int64_t x, int64_t k);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccall.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccall.c[m
[1mdeleted file mode 100644[m
[1mindex eb7c1ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccall.c[m
[1m+++ /dev/null[m
[36m@@ -1,1007 +0,0 @@[m
[31m-/*[m
[31m-** FFI C call handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#include "lj_trace.h"[m
[31m-[m
[31m-/* Target-specific handling of register arguments. */[m
[31m-#if LJ_TARGET_X86[m
[31m-/* -- x86 calling conventions --------------------------------------------- */[m
[31m-[m
[31m-#if LJ_ABI_WIN[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  /* Return structs bigger than 8 by reference (on stack only). */ \[m
[31m-  cc->retref = (sz > 8); \[m
[31m-  if (cc->retref) cc->stack[nsp++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET CCALL_HANDLE_STRUCTRET[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#if LJ_TARGET_OSX[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  /* Return structs of size 1, 2, 4 or 8 in registers. */ \[m
[31m-  cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \[m
[31m-  if (cc->retref) { \[m
[31m-    if (ngpr < maxgpr) \[m
[31m-      cc->gpr[ngpr++] = (GPRArg)dp; \[m
[31m-    else \[m
[31m-      cc->stack[nsp++] = (GPRArg)dp; \[m
[31m-  } else {  /* Struct with single FP field ends up in FPR. */ \[m
[31m-    cc->resx87 = ccall_classify_struct(cts, ctr); \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  if (cc->resx87) sp = (uint8_t *)&cc->fpr[0]; \[m
[31m-  memcpy(dp, sp, ctr->size);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = 1;  /* Return all structs by reference (in reg or on stack). */ \[m
[31m-  if (ngpr < maxgpr) \[m
[31m-    cc->gpr[ngpr++] = (GPRArg)dp; \[m
[31m-  else \[m
[31m-    cc->stack[nsp++] = (GPRArg)dp;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Return complex float in GPRs and complex double by reference. */ \[m
[31m-  cc->retref = (sz > 8); \[m
[31m-  if (cc->retref) { \[m
[31m-    if (ngpr < maxgpr) \[m
[31m-      cc->gpr[ngpr++] = (GPRArg)dp; \[m
[31m-    else \[m
[31m-      cc->stack[nsp++] = (GPRArg)dp; \[m
[31m-  }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (!cc->retref) \[m
[31m-    *(int64_t *)dp = *(int64_t *)sp;  /* Copy complex float from GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  ngpr = maxgpr;  /* Pass all structs by value on the stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  isfp = 1;  /* Pass complex by value on stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (!isfp) {  /* Only non-FP values may be passed in registers. */ \[m
[31m-    if (n > 1) {  /* Anything > 32 bit is passed on the stack. */ \[m
[31m-      if (!LJ_ABI_WIN) ngpr = maxgpr;  /* Prevent reordering. */ \[m
[31m-    } else if (ngpr + 1 <= maxgpr) { \[m
[31m-      dp = &cc->gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_X64 && LJ_ABI_WIN[m
[31m-/* -- Windows/x64 calling conventions ------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  /* Return structs of size 1, 2, 4 or 8 in a GPR. */ \[m
[31m-  cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \[m
[31m-  if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET CCALL_HANDLE_STRUCTRET[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (!cc->retref) \[m
[31m-    *(int64_t *)dp = *(int64_t *)sp;  /* Copy complex float from GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  /* Pass structs of size 1, 2, 4 or 8 in a GPR by value. */ \[m
[31m-  if (!(sz == 1 || sz == 2 || sz == 4 || sz == 8)) { \[m
[31m-    rp = cdataptr(lj_cdata_new(cts, did, sz)); \[m
[31m-    sz = CTSIZE_PTR;  /* Pass all other structs by reference. */ \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex float in a GPR and complex double by reference. */ \[m
[31m-  if (sz != 2*sizeof(float)) { \[m
[31m-    rp = cdataptr(lj_cdata_new(cts, did, sz)); \[m
[31m-    sz = CTSIZE_PTR; \[m
[31m-  }[m
[31m-[m
[31m-/* Windows/x64 argument registers are strictly positional (use ngpr). */[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (ngpr < maxgpr) { dp = &cc->fpr[ngpr++]; nfpr = ngpr; goto done; } \[m
[31m-  } else { \[m
[31m-    if (ngpr < maxgpr) { dp = &cc->gpr[ngpr++]; goto done; } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_X64[m
[31m-/* -- POSIX/x64 calling conventions --------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  int rcl[2]; rcl[0] = rcl[1] = 0; \[m
[31m-  if (ccall_classify_struct(cts, ctr, rcl, 0)) { \[m
[31m-    cc->retref = 1;  /* Return struct by reference. */ \[m
[31m-    cc->gpr[ngpr++] = (GPRArg)dp; \[m
[31m-  } else { \[m
[31m-    cc->retref = 0;  /* Return small structs in registers. */ \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  int rcl[2]; rcl[0] = rcl[1] = 0; \[m
[31m-  ccall_classify_struct(cts, ctr, rcl, 0); \[m
[31m-  ccall_struct_ret(cc, rcl, dp, ctr->size);[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Complex values are returned in one or two FPRs. */ \[m
[31m-  cc->retref = 0;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from FPR. */ \[m
[31m-    *(int64_t *)dp = cc->fpr[0].l[0]; \[m
[31m-  } else {  /* Copy non-contiguous complex double from FPRs. */ \[m
[31m-    ((int64_t *)dp)[0] = cc->fpr[0].l[0]; \[m
[31m-    ((int64_t *)dp)[1] = cc->fpr[1].l[0]; \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  int rcl[2]; rcl[0] = rcl[1] = 0; \[m
[31m-  if (!ccall_classify_struct(cts, d, rcl, 0)) { \[m
[31m-    cc->nsp = nsp; cc->ngpr = ngpr; cc->nfpr = nfpr; \[m
[31m-    if (ccall_struct_arg(cc, cts, d, rcl, o, narg)) goto err_nyi; \[m
[31m-    nsp = cc->nsp; ngpr = cc->ngpr; nfpr = cc->nfpr; \[m
[31m-    continue; \[m
[31m-  }  /* Pass all other structs by value on stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  isfp = 2;  /* Pass complex in FPRs or on stack. Needs postprocessing. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (isfp) {  /* Try to pass argument in FPRs. */ \[m
[31m-    int n2 = ctype_isvector(d->info) ? 1 : n; \[m
[31m-    if (nfpr + n2 <= CCALL_NARG_FPR) { \[m
[31m-      dp = &cc->fpr[nfpr]; \[m
[31m-      nfpr += n2; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    /* Note that reordering is explicitly allowed in the x64 ABI. */ \[m
[31m-    if (n <= 2 && ngpr + n <= maxgpr) { \[m
[31m-      dp = &cc->gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_ARM[m
[31m-/* -- ARM calling conventions --------------------------------------------- */[m
[31m-[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  /* Return structs of size <= 4 in a GPR. */ \[m
[31m-  cc->retref = !(sz <= 4); \[m
[31m-  if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  cc->retref = 1;  /* Return all complex values by reference. */ \[m
[31m-  cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  UNUSED(dp); /* Nothing to do. */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  /* Pass all structs by value in registers and/or on the stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex by value in 2 or 4 GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG_FP1[m
[31m-#define CCALL_HANDLE_REGARG_FP2[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = !ccall_classify_struct(cts, ctr, ct); \[m
[31m-  if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  if (ccall_classify_struct(cts, ctr, ct) > 1) sp = (uint8_t *)&cc->fpr[0]; \[m
[31m-  memcpy(dp, sp, ctr->size);[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  if (!(ct->info & CTF_VARARG)) cc->retref = 0;  /* Return complex in FPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (!(ct->info & CTF_VARARG)) memcpy(dp, &cc->fpr[0], ctr->size);[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  isfp = (ccall_classify_struct(cts, d, ct) > 1);[m
[31m-  /* Pass all structs by value in registers and/or on the stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  isfp = 1;  /* Pass complex by value in FPRs or on stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG_FP1 \[m
[31m-  if (isfp && !(ct->info & CTF_VARARG)) { \[m
[31m-    if ((d->info & CTF_ALIGN) > CTALIGN_PTR) { \[m
[31m-      if (nfpr + (n >> 1) <= CCALL_NARG_FPR) { \[m
[31m-	dp = &cc->fpr[nfpr]; \[m
[31m-	nfpr += (n >> 1); \[m
[31m-	goto done; \[m
[31m-      } \[m
[31m-    } else { \[m
[31m-      if (sz > 1 && fprodd != nfpr) fprodd = 0; \[m
[31m-      if (fprodd) { \[m
[31m-	if (2*nfpr+n <= 2*CCALL_NARG_FPR+1) { \[m
[31m-	  dp = (void *)&cc->fpr[fprodd-1].f[1]; \[m
[31m-	  nfpr += (n >> 1); \[m
[31m-	  if ((n & 1)) fprodd = 0; else fprodd = nfpr-1; \[m
[31m-	  goto done; \[m
[31m-	} \[m
[31m-      } else { \[m
[31m-	if (2*nfpr+n <= 2*CCALL_NARG_FPR) { \[m
[31m-	  dp = (void *)&cc->fpr[nfpr]; \[m
[31m-	  nfpr += (n >> 1); \[m
[31m-	  if ((n & 1)) fprodd = ++nfpr; else fprodd = 0; \[m
[31m-	  goto done; \[m
[31m-	} \[m
[31m-      } \[m
[31m-    } \[m
[31m-    fprodd = 0;  /* No reordering after the first FP value is on stack. */ \[m
[31m-  } else {[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG_FP2	}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  CCALL_HANDLE_REGARG_FP1 \[m
[31m-  if ((d->info & CTF_ALIGN) > CTALIGN_PTR) { \[m
[31m-    if (ngpr < maxgpr) \[m
[31m-      ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-  } \[m
[31m-  if (ngpr < maxgpr) { \[m
[31m-    dp = &cc->gpr[ngpr]; \[m
[31m-    if (ngpr + n > maxgpr) { \[m
[31m-      nsp += ngpr + n - maxgpr;  /* Assumes contiguous gpr/stack fields. */ \[m
[31m-      if (nsp > CCALL_MAXSTACK) goto err_nyi;  /* Too many arguments. */ \[m
[31m-      ngpr = maxgpr; \[m
[31m-    } else { \[m
[31m-      ngpr += n; \[m
[31m-    } \[m
[31m-    goto done; \[m
[31m-  } CCALL_HANDLE_REGARG_FP2[m
[31m-[m
[31m-#define CCALL_HANDLE_RET \[m
[31m-  if ((ct->info & CTF_VARARG)) sp = (uint8_t *)&cc->gpr[0];[m
[31m-[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-/* -- ARM64 calling conventions ------------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = !ccall_classify_struct(cts, ctr); \[m
[31m-  if (cc->retref) cc->retp = dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  unsigned int cl = ccall_classify_struct(cts, ctr); \[m
[31m-  if ((cl & 4)) { /* Combine float HFA from separate registers. */ \[m
[31m-    CTSize i = (cl >> 8) - 1; \[m
[31m-    do { ((uint32_t *)dp)[i] = cc->fpr[i].u32; } while (i--); \[m
[31m-  } else { \[m
[31m-    if (cl > 1) sp = (uint8_t *)&cc->fpr[0]; \[m
[31m-    memcpy(dp, sp, ctr->size); \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Complex values are returned in one or two FPRs. */ \[m
[31m-  cc->retref = 0;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from FPRs. */ \[m
[31m-    ((float *)dp)[0] = cc->fpr[0].f; \[m
[31m-    ((float *)dp)[1] = cc->fpr[1].f; \[m
[31m-  } else {  /* Copy complex double from FPRs. */ \[m
[31m-    ((double *)dp)[0] = cc->fpr[0].d; \[m
[31m-    ((double *)dp)[1] = cc->fpr[1].d; \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  unsigned int cl = ccall_classify_struct(cts, d); \[m
[31m-  if (cl == 0) {  /* Pass struct by reference. */ \[m
[31m-    rp = cdataptr(lj_cdata_new(cts, did, sz)); \[m
[31m-    sz = CTSIZE_PTR; \[m
[31m-  } else if (cl > 1) {  /* Pass struct in FPRs or on stack. */ \[m
[31m-    isfp = (cl & 4) ? 2 : 1; \[m
[31m-  }  /* else: Pass struct in GPRs or on stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex by value in separate (!) FPRs or on stack. */ \[m
[31m-  isfp = ctr->size == 2*sizeof(float) ? 2 : 1;[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (LJ_TARGET_IOS && isva) { \[m
[31m-    /* IOS: All variadic arguments are on the stack. */ \[m
[31m-  } else if (isfp) {  /* Try to pass argument in FPRs. */ \[m
[31m-    int n2 = ctype_isvector(d->info) ? 1 : n*isfp; \[m
[31m-    if (nfpr + n2 <= CCALL_NARG_FPR) { \[m
[31m-      dp = &cc->fpr[nfpr]; \[m
[31m-      nfpr += n2; \[m
[31m-      goto done; \[m
[31m-    } else { \[m
[31m-      nfpr = CCALL_NARG_FPR;  /* Prevent reordering. */ \[m
[31m-      if (LJ_TARGET_IOS && d->size < 8) goto err_nyi; \[m
[31m-    } \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    if (!LJ_TARGET_IOS && (d->info & CTF_ALIGN) > CTALIGN_PTR) \[m
[31m-      ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      dp = &cc->gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } else { \[m
[31m-      ngpr = maxgpr;  /* Prevent reordering. */ \[m
[31m-      if (LJ_TARGET_IOS && d->size < 8) goto err_nyi; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_PPC[m
[31m-/* -- PPC calling conventions --------------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = 1;  /* Return all structs by reference. */ \[m
[31m-  cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Complex values are returned in 2 or 4 GPRs. */ \[m
[31m-  cc->retref = 0;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  memcpy(dp, sp, ctr->size);  /* Copy complex from GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  rp = cdataptr(lj_cdata_new(cts, did, sz)); \[m
[31m-  sz = CTSIZE_PTR;  /* Pass all structs by reference. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex by value in 2 or 4 GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (isfp) {  /* Try to pass argument in FPRs. */ \[m
[31m-    if (nfpr + 1 <= CCALL_NARG_FPR) { \[m
[31m-      dp = &cc->fpr[nfpr]; \[m
[31m-      nfpr += 1; \[m
[31m-      d = ctype_get(cts, CTID_DOUBLE);  /* FPRs always hold doubles. */ \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    if (n > 1) { \[m
[31m-      lua_assert(n == 2 || n == 4);  /* int64_t or complex (float). */ \[m
[31m-      if (ctype_isinteger(d->info)) \[m
[31m-	ngpr = (ngpr + 1u) & ~1u;  /* Align int64_t to regpair. */ \[m
[31m-      else if (ngpr + n > maxgpr) \[m
[31m-	ngpr = maxgpr;  /* Prevent reordering. */ \[m
[31m-    } \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      dp = &cc->gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#define CCALL_HANDLE_RET \[m
[31m-  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \[m
[31m-    ctr = ctype_get(cts, CTID_DOUBLE);  /* FPRs always hold doubles. */[m
[31m-[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-/* -- MIPS calling conventions -------------------------------------------- */[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTRET \[m
[31m-  cc->retref = 1;  /* Return all structs by reference. */ \[m
[31m-  cc->gpr[ngpr++] = (GPRArg)dp;[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXRET \[m
[31m-  /* Complex values are returned in 1 or 2 FPRs. */ \[m
[31m-  cc->retref = 0;[m
[31m-[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from GPRs. */ \[m
[31m-    ((intptr_t *)dp)[0] = cc->gpr[0]; \[m
[31m-    ((intptr_t *)dp)[1] = cc->gpr[1]; \[m
[31m-  } else {  /* Copy complex double from GPRs. */ \[m
[31m-    ((intptr_t *)dp)[0] = cc->gpr[0]; \[m
[31m-    ((intptr_t *)dp)[1] = cc->gpr[1]; \[m
[31m-    ((intptr_t *)dp)[2] = cc->gpr[2]; \[m
[31m-    ((intptr_t *)dp)[3] = cc->gpr[3]; \[m
[31m-  }[m
[31m-#else[m
[31m-#define CCALL_HANDLE_COMPLEXRET2 \[m
[31m-  if (ctr->size == 2*sizeof(float)) {  /* Copy complex float from FPRs. */ \[m
[31m-    ((float *)dp)[0] = cc->fpr[0].f; \[m
[31m-    ((float *)dp)[1] = cc->fpr[1].f; \[m
[31m-  } else {  /* Copy complex double from FPRs. */ \[m
[31m-    ((double *)dp)[0] = cc->fpr[0].d; \[m
[31m-    ((double *)dp)[1] = cc->fpr[1].d; \[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_HANDLE_STRUCTARG \[m
[31m-  /* Pass all structs by value in registers and/or on the stack. */[m
[31m-[m
[31m-#define CCALL_HANDLE_COMPLEXARG \[m
[31m-  /* Pass complex by value in 2 or 4 GPRs. */[m
[31m-[m
[31m-#define CCALL_HANDLE_GPR \[m
[31m-  if ((d->info & CTF_ALIGN) > CTALIGN_PTR) \[m
[31m-    ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-  if (ngpr < maxgpr) { \[m
[31m-    dp = &cc->gpr[ngpr]; \[m
[31m-    if (ngpr + n > maxgpr) { \[m
[31m-     nsp += ngpr + n - maxgpr;  /* Assumes contiguous gpr/stack fields. */ \[m
[31m-     if (nsp > CCALL_MAXSTACK) goto err_nyi;  /* Too many arguments. */ \[m
[31m-     ngpr = maxgpr; \[m
[31m-    } else { \[m
[31m-     ngpr += n; \[m
[31m-    } \[m
[31m-    goto done; \[m
[31m-  }[m
[31m-[m
[31m-#if !LJ_ABI_SOFTFP	/* MIPS32 hard-float */[m
[31m-#define CCALL_HANDLE_REGARG \[m
[31m-  if (isfp && nfpr < CCALL_NARG_FPR && !(ct->info & CTF_VARARG)) { \[m
[31m-    /* Try to pass argument in FPRs. */ \[m
[31m-    dp = n == 1 ? (void *)&cc->fpr[nfpr].f : (void *)&cc->fpr[nfpr].d; \[m
[31m-    nfpr++; ngpr += n; \[m
[31m-    goto done; \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    nfpr = CCALL_NARG_FPR; \[m
[31m-    CCALL_HANDLE_GPR \[m
[31m-  }[m
[31m-#else			/* MIPS32 soft-float */[m
[31m-#define CCALL_HANDLE_REGARG CCALL_HANDLE_GPR[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_ABI_SOFTFP[m
[31m-/* On MIPS64 soft-float, position of float return values is endian-dependant. */[m
[31m-#define CCALL_HANDLE_RET \[m
[31m-  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \[m
[31m-    sp = (uint8_t *)&cc->fpr[0].f;[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-#error "Missing calling convention definitions for this architecture"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CCALL_HANDLE_STRUCTRET2[m
[31m-#define CCALL_HANDLE_STRUCTRET2 \[m
[31m-  memcpy(dp, sp, ctr->size);  /* Copy struct return value from GPRs. */[m
[31m-#endif[m
[31m-[m
[31m-/* -- x86 OSX ABI struct classification ----------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86 && LJ_TARGET_OSX[m
[31m-[m
[31m-/* Check for struct with single FP field. */[m
[31m-static int ccall_classify_struct(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTSize sz = ct->size;[m
[31m-  if (!(sz == sizeof(float) || sz == sizeof(double))) return 0;[m
[31m-  if ((ct->info & CTF_UNION)) return 0;[m
[31m-  while (ct->sib) {[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isfield(ct->info)) {[m
[31m-      CType *sct = ctype_rawchild(cts, ct);[m
[31m-      if (ctype_isfp(sct->info)) {[m
[31m-	if (sct->size == sz)[m
[31m-	  return (sz >> 2);  /* Return 1 for float or 2 for double. */[m
[31m-      } else if (ctype_isstruct(sct->info)) {[m
[31m-	if (sct->size)[m
[31m-	  return ccall_classify_struct(cts, sct);[m
[31m-      } else {[m
[31m-	break;[m
[31m-      }[m
[31m-    } else if (ctype_isbitfield(ct->info)) {[m
[31m-      break;[m
[31m-    } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {[m
[31m-      CType *sct = ctype_rawchild(cts, ct);[m
[31m-      if (sct->size)[m
[31m-	return ccall_classify_struct(cts, sct);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- x64 struct classification ------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X64 && !LJ_ABI_WIN[m
[31m-[m
[31m-/* Register classes for x64 struct classification. */[m
[31m-#define CCALL_RCL_INT	1[m
[31m-#define CCALL_RCL_SSE	2[m
[31m-#define CCALL_RCL_MEM	4[m
[31m-/* NYI: classify vectors. */[m
[31m-[m
[31m-static int ccall_classify_struct(CTState *cts, CType *ct, int *rcl, CTSize ofs);[m
[31m-[m
[31m-/* Classify a C type. */[m
[31m-static void ccall_classify_ct(CTState *cts, CType *ct, int *rcl, CTSize ofs)[m
[31m-{[m
[31m-  if (ctype_isarray(ct->info)) {[m
[31m-    CType *cct = ctype_rawchild(cts, ct);[m
[31m-    CTSize eofs, esz = cct->size, asz = ct->size;[m
[31m-    for (eofs = 0; eofs < asz; eofs += esz)[m
[31m-      ccall_classify_ct(cts, cct, rcl, ofs+eofs);[m
[31m-  } else if (ctype_isstruct(ct->info)) {[m
[31m-    ccall_classify_struct(cts, ct, rcl, ofs);[m
[31m-  } else {[m
[31m-    int cl = ctype_isfp(ct->info) ? CCALL_RCL_SSE : CCALL_RCL_INT;[m
[31m-    lua_assert(ctype_hassize(ct->info));[m
[31m-    if ((ofs & (ct->size-1))) cl = CCALL_RCL_MEM;  /* Unaligned. */[m
[31m-    rcl[(ofs >= 8)] |= cl;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Recursively classify a struct based on its fields. */[m
[31m-static int ccall_classify_struct(CTState *cts, CType *ct, int *rcl, CTSize ofs)[m
[31m-{[m
[31m-  if (ct->size > 16) return CCALL_RCL_MEM;  /* Too big, gets memory class. */[m
[31m-  while (ct->sib) {[m
[31m-    CTSize fofs;[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    fofs = ofs+ct->size;[m
[31m-    if (ctype_isfield(ct->info))[m
[31m-      ccall_classify_ct(cts, ctype_rawchild(cts, ct), rcl, fofs);[m
[31m-    else if (ctype_isbitfield(ct->info))[m
[31m-      rcl[(fofs >= 8)] |= CCALL_RCL_INT;  /* NYI: unaligned bitfields? */[m
[31m-    else if (ctype_isxattrib(ct->info, CTA_SUBTYPE))[m
[31m-      ccall_classify_struct(cts, ctype_rawchild(cts, ct), rcl, fofs);[m
[31m-  }[m
[31m-  return ((rcl[0]|rcl[1]) & CCALL_RCL_MEM);  /* Memory class? */[m
[31m-}[m
[31m-[m
[31m-/* Try to split up a small struct into registers. */[m
[31m-static int ccall_struct_reg(CCallState *cc, GPRArg *dp, int *rcl)[m
[31m-{[m
[31m-  MSize ngpr = cc->ngpr, nfpr = cc->nfpr;[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < 2; i++) {[m
[31m-    lua_assert(!(rcl[i] & CCALL_RCL_MEM));[m
[31m-    if ((rcl[i] & CCALL_RCL_INT)) {  /* Integer class takes precedence. */[m
[31m-      if (ngpr >= CCALL_NARG_GPR) return 1;  /* Register overflow. */[m
[31m-      cc->gpr[ngpr++] = dp[i];[m
[31m-    } else if ((rcl[i] & CCALL_RCL_SSE)) {[m
[31m-      if (nfpr >= CCALL_NARG_FPR) return 1;  /* Register overflow. */[m
[31m-      cc->fpr[nfpr++].l[0] = dp[i];[m
[31m-    }[m
[31m-  }[m
[31m-  cc->ngpr = ngpr; cc->nfpr = nfpr;[m
[31m-  return 0;  /* Ok. */[m
[31m-}[m
[31m-[m
[31m-/* Pass a small struct argument. */[m
[31m-static int ccall_struct_arg(CCallState *cc, CTState *cts, CType *d, int *rcl,[m
[31m-			    TValue *o, int narg)[m
[31m-{[m
[31m-  GPRArg dp[2];[m
[31m-  dp[0] = dp[1] = 0;[m
[31m-  /* Convert to temp. struct. */[m
[31m-  lj_cconv_ct_tv(cts, d, (uint8_t *)dp, o, CCF_ARG(narg));[m
[31m-  if (ccall_struct_reg(cc, dp, rcl)) {  /* Register overflow? Pass on stack. */[m
[31m-    MSize nsp = cc->nsp, n = rcl[1] ? 2 : 1;[m
[31m-    if (nsp + n > CCALL_MAXSTACK) return 1;  /* Too many arguments. */[m
[31m-    cc->nsp = nsp + n;[m
[31m-    memcpy(&cc->stack[nsp], dp, n*CTSIZE_PTR);[m
[31m-  }[m
[31m-  return 0;  /* Ok. */[m
[31m-}[m
[31m-[m
[31m-/* Combine returned small struct. */[m
[31m-static void ccall_struct_ret(CCallState *cc, int *rcl, uint8_t *dp, CTSize sz)[m
[31m-{[m
[31m-  GPRArg sp[2];[m
[31m-  MSize ngpr = 0, nfpr = 0;[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < 2; i++) {[m
[31m-    if ((rcl[i] & CCALL_RCL_INT)) {  /* Integer class takes precedence. */[m
[31m-      sp[i] = cc->gpr[ngpr++];[m
[31m-    } else if ((rcl[i] & CCALL_RCL_SSE)) {[m
[31m-      sp[i] = cc->fpr[nfpr++].l[0];[m
[31m-    }[m
[31m-  }[m
[31m-  memcpy(dp, sp, sz);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- ARM hard-float ABI struct classification ---------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_ARM && !LJ_ABI_SOFTFP[m
[31m-[m
[31m-/* Classify a struct based on its fields. */[m
[31m-static unsigned int ccall_classify_struct(CTState *cts, CType *ct, CType *ctf)[m
[31m-{[m
[31m-  CTSize sz = ct->size;[m
[31m-  unsigned int r = 0, n = 0, isu = (ct->info & CTF_UNION);[m
[31m-  if ((ctf->info & CTF_VARARG)) goto noth;[m
[31m-  while (ct->sib) {[m
[31m-    CType *sct;[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isfield(ct->info)) {[m
[31m-      sct = ctype_rawchild(cts, ct);[m
[31m-      if (ctype_isfp(sct->info)) {[m
[31m-	r |= sct->size;[m
[31m-	if (!isu) n++; else if (n == 0) n = 1;[m
[31m-      } else if (ctype_iscomplex(sct->info)) {[m
[31m-	r |= (sct->size >> 1);[m
[31m-	if (!isu) n += 2; else if (n < 2) n = 2;[m
[31m-      } else if (ctype_isstruct(sct->info)) {[m
[31m-	goto substruct;[m
[31m-      } else {[m
[31m-	goto noth;[m
[31m-      }[m
[31m-    } else if (ctype_isbitfield(ct->info)) {[m
[31m-      goto noth;[m
[31m-    } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {[m
[31m-      sct = ctype_rawchild(cts, ct);[m
[31m-    substruct:[m
[31m-      if (sct->size > 0) {[m
[31m-	unsigned int s = ccall_classify_struct(cts, sct, ctf);[m
[31m-	if (s <= 1) goto noth;[m
[31m-	r |= (s & 255);[m
[31m-	if (!isu) n += (s >> 8); else if (n < (s >>8)) n = (s >> 8);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if ((r == 4 || r == 8) && n <= 4)[m
[31m-    return r + (n << 8);[m
[31m-noth:  /* Not a homogeneous float/double aggregate. */[m
[31m-  return (sz <= 4);  /* Return structs of size <= 4 in a GPR. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- ARM64 ABI struct classification ------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_ARM64[m
[31m-[m
[31m-/* Classify a struct based on its fields. */[m
[31m-static unsigned int ccall_classify_struct(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTSize sz = ct->size;[m
[31m-  unsigned int r = 0, n = 0, isu = (ct->info & CTF_UNION);[m
[31m-  while (ct->sib) {[m
[31m-    CType *sct;[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isfield(ct->info)) {[m
[31m-      sct = ctype_rawchild(cts, ct);[m
[31m-      if (ctype_isfp(sct->info)) {[m
[31m-	r |= sct->size;[m
[31m-	if (!isu) n++; else if (n == 0) n = 1;[m
[31m-      } else if (ctype_iscomplex(sct->info)) {[m
[31m-	r |= (sct->size >> 1);[m
[31m-	if (!isu) n += 2; else if (n < 2) n = 2;[m
[31m-      } else if (ctype_isstruct(sct->info)) {[m
[31m-	goto substruct;[m
[31m-      } else {[m
[31m-	goto noth;[m
[31m-      }[m
[31m-    } else if (ctype_isbitfield(ct->info)) {[m
[31m-      goto noth;[m
[31m-    } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {[m
[31m-      sct = ctype_rawchild(cts, ct);[m
[31m-    substruct:[m
[31m-      if (sct->size > 0) {[m
[31m-	unsigned int s = ccall_classify_struct(cts, sct);[m
[31m-	if (s <= 1) goto noth;[m
[31m-	r |= (s & 255);[m
[31m-	if (!isu) n += (s >> 8); else if (n < (s >>8)) n = (s >> 8);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if ((r == 4 || r == 8) && n <= 4)[m
[31m-    return r + (n << 8);[m
[31m-noth:  /* Not a homogeneous float/double aggregate. */[m
[31m-  return (sz <= 16);  /* Return structs of size <= 16 in GPRs. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- Common C call handling ---------------------------------------------- */[m
[31m-[m
[31m-/* Infer the destination CTypeID for a vararg argument. */[m
[31m-CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o)[m
[31m-{[m
[31m-  if (tvisnumber(o)) {[m
[31m-    return CTID_DOUBLE;[m
[31m-  } else if (tviscdata(o)) {[m
[31m-    CTypeID id = cdataV(o)->ctypeid;[m
[31m-    CType *s = ctype_get(cts, id);[m
[31m-    if (ctype_isrefarray(s->info)) {[m
[31m-      return lj_ctype_intern(cts,[m
[31m-	       CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(s->info)), CTSIZE_PTR);[m
[31m-    } else if (ctype_isstruct(s->info) || ctype_isfunc(s->info)) {[m
[31m-      /* NYI: how to pass a struct by value in a vararg argument? */[m
[31m-      return lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR);[m
[31m-    } else if (ctype_isfp(s->info) && s->size == sizeof(float)) {[m
[31m-      return CTID_DOUBLE;[m
[31m-    } else {[m
[31m-      return id;[m
[31m-    }[m
[31m-  } else if (tvisstr(o)) {[m
[31m-    return CTID_P_CCHAR;[m
[31m-  } else if (tvisbool(o)) {[m
[31m-    return CTID_BOOL;[m
[31m-  } else {[m
[31m-    return CTID_P_VOID;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Setup arguments for C call. */[m
[31m-static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,[m
[31m-			  CCallState *cc)[m
[31m-{[m
[31m-  int gcsteps = 0;[m
[31m-  TValue *o, *top = L->top;[m
[31m-  CTypeID fid;[m
[31m-  CType *ctr;[m
[31m-  MSize maxgpr, ngpr = 0, nsp = 0, narg;[m
[31m-#if CCALL_NARG_FPR[m
[31m-  MSize nfpr = 0;[m
[31m-#if LJ_TARGET_ARM[m
[31m-  MSize fprodd = 0;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-  /* Clear unused regs to get some determinism in case of misdeclaration. */[m
[31m-  memset(cc->gpr, 0, sizeof(cc->gpr));[m
[31m-#if CCALL_NUM_FPR[m
[31m-  memset(cc->fpr, 0, sizeof(cc->fpr));[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_X86[m
[31m-  /* x86 has several different calling conventions. */[m
[31m-  cc->resx87 = 0;[m
[31m-  switch (ctype_cconv(ct->info)) {[m
[31m-  case CTCC_FASTCALL: maxgpr = 2; break;[m
[31m-  case CTCC_THISCALL: maxgpr = 1; break;[m
[31m-  default: maxgpr = 0; break;[m
[31m-  }[m
[31m-#else[m
[31m-  maxgpr = CCALL_NARG_GPR;[m
[31m-#endif[m
[31m-[m
[31m-  /* Perform required setup for some result types. */[m
[31m-  ctr = ctype_rawchild(cts, ct);[m
[31m-  if (ctype_isvector(ctr->info)) {[m
[31m-    if (!(CCALL_VECTOR_REG && (ctr->size == 8 || ctr->size == 16)))[m
[31m-      goto err_nyi;[m
[31m-  } else if (ctype_iscomplex(ctr->info) || ctype_isstruct(ctr->info)) {[m
[31m-    /* Preallocate cdata object and anchor it after arguments. */[m
[31m-    CTSize sz = ctr->size;[m
[31m-    GCcdata *cd = lj_cdata_new(cts, ctype_cid(ct->info), sz);[m
[31m-    void *dp = cdataptr(cd);[m
[31m-    setcdataV(L, L->top++, cd);[m
[31m-    if (ctype_isstruct(ctr->info)) {[m
[31m-      CCALL_HANDLE_STRUCTRET[m
[31m-    } else {[m
[31m-      CCALL_HANDLE_COMPLEXRET[m
[31m-    }[m
[31m-#if LJ_TARGET_X86[m
[31m-  } else if (ctype_isfp(ctr->info)) {[m
[31m-    cc->resx87 = ctr->size == sizeof(float) ? 1 : 2;[m
[31m-#endif[m
[31m-  }[m
[31m-[m
[31m-  /* Skip initial attributes. */[m
[31m-  fid = ct->sib;[m
[31m-  while (fid) {[m
[31m-    CType *ctf = ctype_get(cts, fid);[m
[31m-    if (!ctype_isattrib(ctf->info)) break;[m
[31m-    fid = ctf->sib;[m
[31m-  }[m
[31m-[m
[31m-  /* Walk through all passed arguments. */[m
[31m-  for (o = L->base+1, narg = 1; o < top; o++, narg++) {[m
[31m-    CTypeID did;[m
[31m-    CType *d;[m
[31m-    CTSize sz;[m
[31m-    MSize n, isfp = 0, isva = 0;[m
[31m-    void *dp, *rp = NULL;[m
[31m-[m
[31m-    if (fid) {  /* Get argument type from field. */[m
[31m-      CType *ctf = ctype_get(cts, fid);[m
[31m-      fid = ctf->sib;[m
[31m-      lua_assert(ctype_isfield(ctf->info));[m
[31m-      did = ctype_cid(ctf->info);[m
[31m-    } else {[m
[31m-      if (!(ct->info & CTF_VARARG))[m
[31m-	lj_err_caller(L, LJ_ERR_FFI_NUMARG);  /* Too many arguments. */[m
[31m-      did = lj_ccall_ctid_vararg(cts, o);  /* Infer vararg type. */[m
[31m-      isva = 1;[m
[31m-    }[m
[31m-    d = ctype_raw(cts, did);[m
[31m-    sz = d->size;[m
[31m-[m
[31m-    /* Find out how (by value/ref) and where (GPR/FPR) to pass an argument. */[m
[31m-    if (ctype_isnum(d->info)) {[m
[31m-      if (sz > 8) goto err_nyi;[m
[31m-      if ((d->info & CTF_FP))[m
[31m-	isfp = 1;[m
[31m-    } else if (ctype_isvector(d->info)) {[m
[31m-      if (CCALL_VECTOR_REG && (sz == 8 || sz == 16))[m
[31m-	isfp = 1;[m
[31m-      else[m
[31m-	goto err_nyi;[m
[31m-    } else if (ctype_isstruct(d->info)) {[m
[31m-      CCALL_HANDLE_STRUCTARG[m
[31m-    } else if (ctype_iscomplex(d->info)) {[m
[31m-      CCALL_HANDLE_COMPLEXARG[m
[31m-    } else {[m
[31m-      sz = CTSIZE_PTR;[m
[31m-    }[m
[31m-    sz = (sz + CTSIZE_PTR-1) & ~(CTSIZE_PTR-1);[m
[31m-    n = sz / CTSIZE_PTR;  /* Number of GPRs or stack slots needed. */[m
[31m-[m
[31m-    CCALL_HANDLE_REGARG  /* Handle register arguments. */[m
[31m-[m
[31m-    /* Otherwise pass argument on stack. */[m
[31m-    if (CCALL_ALIGN_STACKARG && !rp && (d->info & CTF_ALIGN) > CTALIGN_PTR) {[m
[31m-      MSize align = (1u << ctype_align(d->info-CTALIGN_PTR)) -1;[m
[31m-      nsp = (nsp + align) & ~align;  /* Align argument on stack. */[m
[31m-    }[m
[31m-    if (nsp + n > CCALL_MAXSTACK) {  /* Too many arguments. */[m
[31m-    err_nyi:[m
[31m-      lj_err_caller(L, LJ_ERR_FFI_NYICALL);[m
[31m-    }[m
[31m-    dp = &cc->stack[nsp];[m
[31m-    nsp += n;[m
[31m-    isva = 0;[m
[31m-[m
[31m-  done:[m
[31m-    if (rp) {  /* Pass by reference. */[m
[31m-      gcsteps++;[m
[31m-      *(void **)dp = rp;[m
[31m-      dp = rp;[m
[31m-    }[m
[31m-    lj_cconv_ct_tv(cts, d, (uint8_t *)dp, o, CCF_ARG(narg));[m
[31m-    /* Extend passed integers to 32 bits at least. */[m
[31m-    if (ctype_isinteger_or_bool(d->info) && d->size < 4) {[m
[31m-      if (d->info & CTF_UNSIGNED)[m
[31m-	*(uint32_t *)dp = d->size == 1 ? (uint32_t)*(uint8_t *)dp :[m
[31m-					 (uint32_t)*(uint16_t *)dp;[m
[31m-      else[m
[31m-	*(int32_t *)dp = d->size == 1 ? (int32_t)*(int8_t *)dp :[m
[31m-					(int32_t)*(int16_t *)dp;[m
[31m-    }[m
[31m-#if LJ_TARGET_X64 && LJ_ABI_WIN[m
[31m-    if (isva) {  /* Windows/x64 mirrors varargs in both register sets. */[m
[31m-      if (nfpr == ngpr)[m
[31m-	cc->gpr[ngpr-1] = cc->fpr[ngpr-1].l[0];[m
[31m-      else[m
[31m-	cc->fpr[ngpr-1].l[0] = cc->gpr[ngpr-1];[m
[31m-    }[m
[31m-#else[m
[31m-    UNUSED(isva);[m
[31m-#endif[m
[31m-#if LJ_TARGET_X64 && !LJ_ABI_WIN[m
[31m-    if (isfp == 2 && n == 2 && (uint8_t *)dp == (uint8_t *)&cc->fpr[nfpr-2]) {[m
[31m-      cc->fpr[nfpr-1].d[0] = cc->fpr[nfpr-2].d[1];  /* Split complex double. */[m
[31m-      cc->fpr[nfpr-2].d[1] = 0;[m
[31m-    }[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-    if (isfp == 2 && (uint8_t *)dp < (uint8_t *)cc->stack) {[m
[31m-      /* Split float HFA or complex float into separate registers. */[m
[31m-      CTSize i = (sz >> 2) - 1;[m
[31m-      do { ((uint64_t *)dp)[i] = ((uint32_t *)dp)[i]; } while (i--);[m
[31m-    }[m
[31m-#else[m
[31m-    UNUSED(isfp);[m
[31m-#endif[m
[31m-  }[m
[31m-  if (fid) lj_err_caller(L, LJ_ERR_FFI_NUMARG);  /* Too few arguments. */[m
[31m-[m
[31m-#if LJ_TARGET_X64 || LJ_TARGET_PPC[m
[31m-  cc->nfpr = nfpr;  /* Required for vararg functions. */[m
[31m-#endif[m
[31m-  cc->nsp = nsp;[m
[31m-  cc->spadj = (CCALL_SPS_FREE + CCALL_SPS_EXTRA)*CTSIZE_PTR;[m
[31m-  if (nsp > CCALL_SPS_FREE)[m
[31m-    cc->spadj += (((nsp-CCALL_SPS_FREE)*CTSIZE_PTR + 15u) & ~15u);[m
[31m-  return gcsteps;[m
[31m-}[m
[31m-[m
[31m-/* Get results from C call. */[m
[31m-static int ccall_get_results(lua_State *L, CTState *cts, CType *ct,[m
[31m-			     CCallState *cc, int *ret)[m
[31m-{[m
[31m-  CType *ctr = ctype_rawchild(cts, ct);[m
[31m-  uint8_t *sp = (uint8_t *)&cc->gpr[0];[m
[31m-  if (ctype_isvoid(ctr->info)) {[m
[31m-    *ret = 0;  /* Zero results. */[m
[31m-    return 0;  /* No additional GC step. */[m
[31m-  }[m
[31m-  *ret = 1;  /* One result. */[m
[31m-  if (ctype_isstruct(ctr->info)) {[m
[31m-    /* Return cdata object which is already on top of stack. */[m
[31m-    if (!cc->retref) {[m
[31m-      void *dp = cdataptr(cdataV(L->top-1));  /* Use preallocated object. */[m
[31m-      CCALL_HANDLE_STRUCTRET2[m
[31m-    }[m
[31m-    return 1;  /* One GC step. */[m
[31m-  }[m
[31m-  if (ctype_iscomplex(ctr->info)) {[m
[31m-    /* Return cdata object which is already on top of stack. */[m
[31m-    void *dp = cdataptr(cdataV(L->top-1));  /* Use preallocated object. */[m
[31m-    CCALL_HANDLE_COMPLEXRET2[m
[31m-    return 1;  /* One GC step. */[m
[31m-  }[m
[31m-  if (LJ_BE && ctype_isinteger_or_bool(ctr->info) && ctr->size < CTSIZE_PTR)[m
[31m-    sp += (CTSIZE_PTR - ctr->size);[m
[31m-#if CCALL_NUM_FPR[m
[31m-  if (ctype_isfp(ctr->info) || ctype_isvector(ctr->info))[m
[31m-    sp = (uint8_t *)&cc->fpr[0];[m
[31m-#endif[m
[31m-#ifdef CCALL_HANDLE_RET[m
[31m-  CCALL_HANDLE_RET[m
[31m-#endif[m
[31m-  /* No reference types end up here, so there's no need for the CTypeID. */[m
[31m-  lua_assert(!(ctype_isrefarray(ctr->info) || ctype_isstruct(ctr->info)));[m
[31m-  return lj_cconv_tv_ct(cts, ctr, 0, L->top-1, sp);[m
[31m-}[m
[31m-[m
[31m-/* Call C function. */[m
[31m-int lj_ccall_func(lua_State *L, GCcdata *cd)[m
[31m-{[m
[31m-  CTState *cts = ctype_cts(L);[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  CTSize sz = CTSIZE_PTR;[m
[31m-  if (ctype_isptr(ct->info)) {[m
[31m-    sz = ct->size;[m
[31m-    ct = ctype_rawchild(cts, ct);[m
[31m-  }[m
[31m-  if (ctype_isfunc(ct->info)) {[m
[31m-    CCallState cc;[m
[31m-    int gcsteps, ret;[m
[31m-    cc.func = (void (*)(void))cdata_getptr(cdataptr(cd), sz);[m
[31m-    gcsteps = ccall_set_args(L, cts, ct, &cc);[m
[31m-    ct = (CType *)((intptr_t)ct-(intptr_t)cts->tab);[m
[31m-    cts->cb.slot = ~0u;[m
[31m-    lj_vm_ffi_call(&cc);[m
[31m-    if (cts->cb.slot != ~0u) {  /* Blacklist function that called a callback. */[m
[31m-      TValue tv;[m
[31m-      setlightudV(&tv, (void *)cc.func);[m
[31m-      setboolV(lj_tab_set(L, cts->miscmap, &tv), 1);[m
[31m-    }[m
[31m-    ct = (CType *)((intptr_t)ct+(intptr_t)cts->tab);  /* May be reallocated. */[m
[31m-    gcsteps += ccall_get_results(L, cts, ct, &cc, &ret);[m
[31m-#if LJ_TARGET_X86 && LJ_ABI_WIN[m
[31m-    /* Automatically detect __stdcall and fix up C function declaration. */[m
[31m-    if (cc.spadj && ctype_cconv(ct->info) == CTCC_CDECL) {[m
[31m-      CTF_INSERT(ct->info, CCONV, CTCC_STDCALL);[m
[31m-      lj_trace_abort(G(L));[m
[31m-    }[m
[31m-#endif[m
[31m-    while (gcsteps-- > 0)[m
[31m-      lj_gc_check(L);[m
[31m-    return ret;[m
[31m-  }[m
[31m-  return -1;  /* Not a function. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccall.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccall.h[m
[1mdeleted file mode 100644[m
[1mindex a77afae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccall.h[m
[1m+++ /dev/null[m
[36m@@ -1,178 +0,0 @@[m
[31m-/*[m
[31m-** FFI C call handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CCALL_H[m
[31m-#define _LJ_CCALL_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* -- C calling conventions ----------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-[m
[31m-#if LJ_TARGET_X86[m
[31m-#define CCALL_NARG_GPR		2	/* For fastcall arguments. */[m
[31m-#define CCALL_NARG_FPR		0[m
[31m-#define CCALL_NRET_GPR		2[m
[31m-#define CCALL_NRET_FPR		1	/* For FP results on x87 stack. */[m
[31m-#define CCALL_ALIGN_STACKARG	0	/* Don't align argument on stack. */[m
[31m-#elif LJ_ABI_WIN[m
[31m-#define CCALL_NARG_GPR		4[m
[31m-#define CCALL_NARG_FPR		4[m
[31m-#define CCALL_NRET_GPR		1[m
[31m-#define CCALL_NRET_FPR		1[m
[31m-#define CCALL_SPS_EXTRA		4[m
[31m-#else[m
[31m-#define CCALL_NARG_GPR		6[m
[31m-#define CCALL_NARG_FPR		8[m
[31m-#define CCALL_NRET_GPR		2[m
[31m-#define CCALL_NRET_FPR		2[m
[31m-#define CCALL_VECTOR_REG	1	/* Pass vectors in registers. */[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_SPS_FREE		1[m
[31m-#define CCALL_ALIGN_CALLSTATE	16[m
[31m-[m
[31m-typedef LJ_ALIGN(16) union FPRArg {[m
[31m-  double d[2];[m
[31m-  float f[4];[m
[31m-  uint8_t b[16];[m
[31m-  uint16_t s[8];[m
[31m-  int i[4];[m
[31m-  int64_t l[2];[m
[31m-} FPRArg;[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-[m
[31m-#elif LJ_TARGET_ARM[m
[31m-[m
[31m-#define CCALL_NARG_GPR		4[m
[31m-#define CCALL_NRET_GPR		2	/* For softfp double. */[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-#define CCALL_NARG_FPR		0[m
[31m-#define CCALL_NRET_FPR		0[m
[31m-#else[m
[31m-#define CCALL_NARG_FPR		8[m
[31m-#define CCALL_NRET_FPR		4[m
[31m-#endif[m
[31m-#define CCALL_SPS_FREE		0[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-typedef union FPRArg {[m
[31m-  double d;[m
[31m-  float f[2];[m
[31m-} FPRArg;[m
[31m-[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-[m
[31m-#define CCALL_NARG_GPR		8[m
[31m-#define CCALL_NRET_GPR		2[m
[31m-#define CCALL_NARG_FPR		8[m
[31m-#define CCALL_NRET_FPR		4[m
[31m-#define CCALL_SPS_FREE		0[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-typedef union FPRArg {[m
[31m-  double d;[m
[31m-  float f;[m
[31m-  uint32_t u32;[m
[31m-} FPRArg;[m
[31m-[m
[31m-#elif LJ_TARGET_PPC[m
[31m-[m
[31m-#define CCALL_NARG_GPR		8[m
[31m-#define CCALL_NARG_FPR		8[m
[31m-#define CCALL_NRET_GPR		4	/* For complex double. */[m
[31m-#define CCALL_NRET_FPR		1[m
[31m-#define CCALL_SPS_EXTRA		4[m
[31m-#define CCALL_SPS_FREE		0[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-typedef double FPRArg;[m
[31m-[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-[m
[31m-#define CCALL_NARG_GPR		4[m
[31m-#define CCALL_NARG_FPR		(LJ_ABI_SOFTFP ? 0 : 2)[m
[31m-#define CCALL_NRET_GPR		2[m
[31m-#define CCALL_NRET_FPR		(LJ_ABI_SOFTFP ? 0 : 2)[m
[31m-#define CCALL_SPS_EXTRA		7[m
[31m-#define CCALL_SPS_FREE		1[m
[31m-[m
[31m-typedef intptr_t GPRArg;[m
[31m-typedef union FPRArg {[m
[31m-  double d;[m
[31m-  struct { LJ_ENDIAN_LOHI(float f; , float g;) };[m
[31m-} FPRArg;[m
[31m-[m
[31m-#else[m
[31m-#error "Missing calling convention definitions for this architecture"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CCALL_SPS_EXTRA[m
[31m-#define CCALL_SPS_EXTRA		0[m
[31m-#endif[m
[31m-#ifndef CCALL_VECTOR_REG[m
[31m-#define CCALL_VECTOR_REG	0[m
[31m-#endif[m
[31m-#ifndef CCALL_ALIGN_STACKARG[m
[31m-#define CCALL_ALIGN_STACKARG	1[m
[31m-#endif[m
[31m-#ifndef CCALL_ALIGN_CALLSTATE[m
[31m-#define CCALL_ALIGN_CALLSTATE	8[m
[31m-#endif[m
[31m-[m
[31m-#define CCALL_NUM_GPR \[m
[31m-  (CCALL_NARG_GPR > CCALL_NRET_GPR ? CCALL_NARG_GPR : CCALL_NRET_GPR)[m
[31m-#define CCALL_NUM_FPR \[m
[31m-  (CCALL_NARG_FPR > CCALL_NRET_FPR ? CCALL_NARG_FPR : CCALL_NRET_FPR)[m
[31m-[m
[31m-/* Check against constants in lj_ctype.h. */[m
[31m-LJ_STATIC_ASSERT(CCALL_NUM_GPR <= CCALL_MAX_GPR);[m
[31m-LJ_STATIC_ASSERT(CCALL_NUM_FPR <= CCALL_MAX_FPR);[m
[31m-[m
[31m-#define CCALL_MAXSTACK		32[m
[31m-[m
[31m-/* -- C call state -------------------------------------------------------- */[m
[31m-[m
[31m-typedef LJ_ALIGN(CCALL_ALIGN_CALLSTATE) struct CCallState {[m
[31m-  void (*func)(void);		/* Pointer to called function. */[m
[31m-  uint32_t spadj;		/* Stack pointer adjustment. */[m
[31m-  uint8_t nsp;			/* Number of stack slots. */[m
[31m-  uint8_t retref;		/* Return value by reference. */[m
[31m-#if LJ_TARGET_X64[m
[31m-  uint8_t ngpr;			/* Number of arguments in GPRs. */[m
[31m-  uint8_t nfpr;			/* Number of arguments in FPRs. */[m
[31m-#elif LJ_TARGET_X86[m
[31m-  uint8_t resx87;		/* Result on x87 stack: 1:float, 2:double. */[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-  void *retp;			/* Aggregate return pointer in x8. */[m
[31m-#elif LJ_TARGET_PPC[m
[31m-  uint8_t nfpr;			/* Number of arguments in FPRs. */[m
[31m-#endif[m
[31m-#if LJ_32[m
[31m-  int32_t align1;[m
[31m-#endif[m
[31m-#if CCALL_NUM_FPR[m
[31m-  FPRArg fpr[CCALL_NUM_FPR];	/* Arguments/results in FPRs. */[m
[31m-#endif[m
[31m-  GPRArg gpr[CCALL_NUM_GPR];	/* Arguments/results in GPRs. */[m
[31m-  GPRArg stack[CCALL_MAXSTACK];	/* Stack slots. */[m
[31m-} CCallState;[m
[31m-[m
[31m-/* -- C call handling ----------------------------------------------------- */[m
[31m-[m
[31m-/* Really belongs to lj_vm.h. */[m
[31m-LJ_ASMF void LJ_FASTCALL lj_vm_ffi_call(CCallState *cc);[m
[31m-[m
[31m-LJ_FUNC CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o);[m
[31m-LJ_FUNC int lj_ccall_func(lua_State *L, GCcdata *cd);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccallback.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccallback.c[m
[1mdeleted file mode 100644[m
[1mindex 43c29e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccallback.c[m
[1m+++ /dev/null[m
[36m@@ -1,721 +0,0 @@[m
[31m-/*[m
[31m-** FFI C callback handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#include "lj_ccallback.h"[m
[31m-#include "lj_target.h"[m
[31m-#include "lj_mcode.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* -- Target-specific handling of callback slots -------------------------- */[m
[31m-[m
[31m-#define CALLBACK_MCODE_SIZE	(LJ_PAGESIZE * LJ_NUM_CBPAGE)[m
[31m-[m
[31m-#if LJ_OS_NOJIT[m
[31m-[m
[31m-/* Callbacks disabled. */[m
[31m-#define CALLBACK_SLOT2OFS(slot)	(0*(slot))[m
[31m-#define CALLBACK_OFS2SLOT(ofs)	(0*(ofs))[m
[31m-#define CALLBACK_MAX_SLOT	0[m
[31m-[m
[31m-#elif LJ_TARGET_X86ORX64[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD	(LJ_64 ? 8 : 0)[m
[31m-#define CALLBACK_MCODE_GROUP	(-2+1+2+(LJ_GC64 ? 10 : 5)+(LJ_64 ? 6 : 5))[m
[31m-[m
[31m-#define CALLBACK_SLOT2OFS(slot) \[m
[31m-  (CALLBACK_MCODE_HEAD + CALLBACK_MCODE_GROUP*((slot)/32) + 4*(slot))[m
[31m-[m
[31m-static MSize CALLBACK_OFS2SLOT(MSize ofs)[m
[31m-{[m
[31m-  MSize group;[m
[31m-  ofs -= CALLBACK_MCODE_HEAD;[m
[31m-  group = ofs / (32*4 + CALLBACK_MCODE_GROUP);[m
[31m-  return (ofs % (32*4 + CALLBACK_MCODE_GROUP))/4 + group*32;[m
[31m-}[m
[31m-[m
[31m-#define CALLBACK_MAX_SLOT \[m
[31m-  (((CALLBACK_MCODE_SIZE-CALLBACK_MCODE_HEAD)/(CALLBACK_MCODE_GROUP+4*32))*32)[m
[31m-[m
[31m-#elif LJ_TARGET_ARM[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD		32[m
[31m-[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD		32[m
[31m-[m
[31m-#elif LJ_TARGET_PPC[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD		24[m
[31m-[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-[m
[31m-#define CALLBACK_MCODE_HEAD		24[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* Missing support for this architecture. */[m
[31m-#define CALLBACK_SLOT2OFS(slot)	(0*(slot))[m
[31m-#define CALLBACK_OFS2SLOT(ofs)	(0*(ofs))[m
[31m-#define CALLBACK_MAX_SLOT	0[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CALLBACK_SLOT2OFS[m
[31m-#define CALLBACK_SLOT2OFS(slot)		(CALLBACK_MCODE_HEAD + 8*(slot))[m
[31m-#define CALLBACK_OFS2SLOT(ofs)		(((ofs)-CALLBACK_MCODE_HEAD)/8)[m
[31m-#define CALLBACK_MAX_SLOT		(CALLBACK_OFS2SLOT(CALLBACK_MCODE_SIZE))[m
[31m-#endif[m
[31m-[m
[31m-/* Convert callback slot number to callback function pointer. */[m
[31m-static void *callback_slot2ptr(CTState *cts, MSize slot)[m
[31m-{[m
[31m-  return (uint8_t *)cts->cb.mcode + CALLBACK_SLOT2OFS(slot);[m
[31m-}[m
[31m-[m
[31m-/* Convert callback function pointer to slot number. */[m
[31m-MSize lj_ccallback_ptr2slot(CTState *cts, void *p)[m
[31m-{[m
[31m-  uintptr_t ofs = (uintptr_t)((uint8_t *)p -(uint8_t *)cts->cb.mcode);[m
[31m-  if (ofs < CALLBACK_MCODE_SIZE) {[m
[31m-    MSize slot = CALLBACK_OFS2SLOT((MSize)ofs);[m
[31m-    if (CALLBACK_SLOT2OFS(slot) == (MSize)ofs)[m
[31m-      return slot;[m
[31m-  }[m
[31m-  return ~0u;  /* Not a known callback function pointer. */[m
[31m-}[m
[31m-[m
[31m-/* Initialize machine code for callback function pointers. */[m
[31m-#if LJ_OS_NOJIT[m
[31m-/* Disabled callback support. */[m
[31m-#define callback_mcode_init(g, p)	UNUSED(p)[m
[31m-#elif LJ_TARGET_X86ORX64[m
[31m-static void callback_mcode_init(global_State *g, uint8_t *page)[m
[31m-{[m
[31m-  uint8_t *p = page;[m
[31m-  uint8_t *target = (uint8_t *)(void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-#if LJ_64[m
[31m-  *(void **)p = target; p += 8;[m
[31m-#endif[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    /* mov al, slot; jmp group */[m
[31m-    *p++ = XI_MOVrib | RID_EAX; *p++ = (uint8_t)slot;[m
[31m-    if ((slot & 31) == 31 || slot == CALLBACK_MAX_SLOT-1) {[m
[31m-      /* push ebp/rbp; mov ah, slot>>8; mov ebp, &g. */[m
[31m-      *p++ = XI_PUSH + RID_EBP;[m
[31m-      *p++ = XI_MOVrib | (RID_EAX+4); *p++ = (uint8_t)(slot >> 8);[m
[31m-#if LJ_GC64[m
[31m-      *p++ = 0x48; *p++ = XI_MOVri | RID_EBP;[m
[31m-      *(uint64_t *)p = (uint64_t)(g); p += 8;[m
[31m-#else[m
[31m-      *p++ = XI_MOVri | RID_EBP;[m
[31m-      *(int32_t *)p = i32ptr(g); p += 4;[m
[31m-#endif[m
[31m-#if LJ_64[m
[31m-      /* jmp [rip-pageofs] where lj_vm_ffi_callback is stored. */[m
[31m-      *p++ = XI_GROUP5; *p++ = XM_OFS0 + (XOg_JMP<<3) + RID_EBP;[m
[31m-      *(int32_t *)p = (int32_t)(page-(p+4)); p += 4;[m
[31m-#else[m
[31m-      /* jmp lj_vm_ffi_callback. */[m
[31m-      *p++ = XI_JMP; *(int32_t *)p = target-(p+4); p += 4;[m
[31m-#endif[m
[31m-    } else {[m
[31m-      *p++ = XI_JMPs; *p++ = (uint8_t)((2+2)*(31-(slot&31)) - 2);[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#elif LJ_TARGET_ARM[m
[31m-static void callback_mcode_init(global_State *g, uint32_t *page)[m
[31m-{[m
[31m-  uint32_t *p = page;[m
[31m-  void *target = (void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-  /* This must match with the saveregs macro in buildvm_arm.dasc. */[m
[31m-  *p++ = ARMI_SUB|ARMF_D(RID_R12)|ARMF_N(RID_R12)|ARMF_M(RID_PC);[m
[31m-  *p++ = ARMI_PUSH|ARMF_N(RID_SP)|RSET_RANGE(RID_R4,RID_R11+1)|RID2RSET(RID_LR);[m
[31m-  *p++ = ARMI_SUB|ARMI_K12|ARMF_D(RID_R12)|ARMF_N(RID_R12)|CALLBACK_MCODE_HEAD;[m
[31m-  *p++ = ARMI_STR|ARMI_LS_P|ARMI_LS_W|ARMF_D(RID_R12)|ARMF_N(RID_SP)|(CFRAME_SIZE-4*9);[m
[31m-  *p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_R12)|ARMF_N(RID_PC);[m
[31m-  *p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_PC)|ARMF_N(RID_PC);[m
[31m-  *p++ = u32ptr(g);[m
[31m-  *p++ = u32ptr(target);[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    *p++ = ARMI_MOV|ARMF_D(RID_R12)|ARMF_M(RID_PC);[m
[31m-    *p = ARMI_B | ((page-p-2) & 0x00ffffffu);[m
[31m-    p++;[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-static void callback_mcode_init(global_State *g, uint32_t *page)[m
[31m-{[m
[31m-  uint32_t *p = page;[m
[31m-  void *target = (void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-  *p++ = A64I_LDRLx | A64F_D(RID_X11) | A64F_S19(4);[m
[31m-  *p++ = A64I_LDRLx | A64F_D(RID_X10) | A64F_S19(5);[m
[31m-  *p++ = A64I_BR | A64F_N(RID_X11);[m
[31m-  *p++ = A64I_NOP;[m
[31m-  ((void **)p)[0] = target;[m
[31m-  ((void **)p)[1] = g;[m
[31m-  p += 4;[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    *p++ = A64I_MOVZw | A64F_D(RID_X9) | A64F_U16(slot);[m
[31m-    *p = A64I_B | A64F_S26((page-p) & 0x03ffffffu);[m
[31m-    p++;[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#elif LJ_TARGET_PPC[m
[31m-static void callback_mcode_init(global_State *g, uint32_t *page)[m
[31m-{[m
[31m-  uint32_t *p = page;[m
[31m-  void *target = (void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-  *p++ = PPCI_LIS | PPCF_T(RID_TMP) | (u32ptr(target) >> 16);[m
[31m-  *p++ = PPCI_LIS | PPCF_T(RID_R12) | (u32ptr(g) >> 16);[m
[31m-  *p++ = PPCI_ORI | PPCF_A(RID_TMP)|PPCF_T(RID_TMP) | (u32ptr(target) & 0xffff);[m
[31m-  *p++ = PPCI_ORI | PPCF_A(RID_R12)|PPCF_T(RID_R12) | (u32ptr(g) & 0xffff);[m
[31m-  *p++ = PPCI_MTCTR | PPCF_T(RID_TMP);[m
[31m-  *p++ = PPCI_BCTR;[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    *p++ = PPCI_LI | PPCF_T(RID_R11) | slot;[m
[31m-    *p = PPCI_B | (((page-p) & 0x00ffffffu) << 2);[m
[31m-    p++;[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-static void callback_mcode_init(global_State *g, uint32_t *page)[m
[31m-{[m
[31m-  uint32_t *p = page;[m
[31m-  void *target = (void *)lj_vm_ffi_callback;[m
[31m-  MSize slot;[m
[31m-  *p++ = MIPSI_SW | MIPSF_T(RID_R1)|MIPSF_S(RID_SP) | 0;[m
[31m-  *p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (u32ptr(target) >> 16);[m
[31m-  *p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (u32ptr(g) >> 16);[m
[31m-  *p++ = MIPSI_ORI | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) |(u32ptr(target)&0xffff);[m
[31m-  *p++ = MIPSI_JR | MIPSF_S(RID_R3);[m
[31m-  *p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | (u32ptr(g)&0xffff);[m
[31m-  for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {[m
[31m-    *p = MIPSI_B | ((page-p-1) & 0x0000ffffu);[m
[31m-    p++;[m
[31m-    *p++ = MIPSI_LI | MIPSF_T(RID_R1) | slot;[m
[31m-  }[m
[31m-  lua_assert(p - page <= CALLBACK_MCODE_SIZE);[m
[31m-}[m
[31m-#else[m
[31m-/* Missing support for this architecture. */[m
[31m-#define callback_mcode_init(g, p)	UNUSED(p)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Machine code management --------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-[m
[31m-#include <sys/mman.h>[m
[31m-#ifndef MAP_ANONYMOUS[m
[31m-#define MAP_ANONYMOUS   MAP_ANON[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Allocate and initialize area for callback function pointers. */[m
[31m-static void callback_mcode_new(CTState *cts)[m
[31m-{[m
[31m-  size_t sz = (size_t)CALLBACK_MCODE_SIZE;[m
[31m-  void *p;[m
[31m-  if (CALLBACK_MAX_SLOT == 0)[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  p = VirtualAlloc(NULL, sz, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);[m
[31m-  if (!p)[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-  p = mmap(NULL, sz, (PROT_READ|PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS,[m
[31m-	   -1, 0);[m
[31m-  if (p == MAP_FAILED)[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);[m
[31m-#else[m
[31m-  /* Fallback allocator. Fails if memory is not executable by default. */[m
[31m-  p = lj_mem_new(cts->L, sz);[m
[31m-#endif[m
[31m-  cts->cb.mcode = p;[m
[31m-  callback_mcode_init(cts->g, p);[m
[31m-  lj_mcode_sync(p, (char *)p + sz);[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  {[m
[31m-    DWORD oprot;[m
[31m-    VirtualProtect(p, sz, PAGE_EXECUTE_READ, &oprot);[m
[31m-  }[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-  mprotect(p, sz, (PROT_READ|PROT_EXEC));[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Free area for callback function pointers. */[m
[31m-void lj_ccallback_mcode_free(CTState *cts)[m
[31m-{[m
[31m-  size_t sz = (size_t)CALLBACK_MCODE_SIZE;[m
[31m-  void *p = cts->cb.mcode;[m
[31m-  if (p == NULL) return;[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  VirtualFree(p, 0, MEM_RELEASE);[m
[31m-  UNUSED(sz);[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-  munmap(p, sz);[m
[31m-#else[m
[31m-  lj_mem_free(cts->g, p, sz);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- C callback entry ---------------------------------------------------- */[m
[31m-[m
[31m-/* Target-specific handling of register arguments. Similar to lj_ccall.c. */[m
[31m-#if LJ_TARGET_X86[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (!isfp) {  /* Only non-FP values may be passed in registers. */ \[m
[31m-    if (n > 1) {  /* Anything > 32 bit is passed on the stack. */ \[m
[31m-      if (!LJ_ABI_WIN) ngpr = maxgpr;  /* Prevent reordering. */ \[m
[31m-    } else if (ngpr + 1 <= maxgpr) { \[m
[31m-      sp = &cts->cb.gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_X64 && LJ_ABI_WIN[m
[31m-[m
[31m-/* Windows/x64 argument registers are strictly positional (use ngpr). */[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (ngpr < maxgpr) { sp = &cts->cb.fpr[ngpr++]; UNUSED(nfpr); goto done; } \[m
[31m-  } else { \[m
[31m-    if (ngpr < maxgpr) { sp = &cts->cb.gpr[ngpr++]; goto done; } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_X64[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (nfpr + n <= CCALL_NARG_FPR) { \[m
[31m-      sp = &cts->cb.fpr[nfpr]; \[m
[31m-      nfpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  } else { \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      sp = &cts->cb.gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_ARM[m
[31m-[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG_FP1	UNUSED(isfp);[m
[31m-#define CALLBACK_HANDLE_REGARG_FP2[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG_FP1 \[m
[31m-  if (isfp) { \[m
[31m-    if (n == 1) { \[m
[31m-      if (fprodd) { \[m
[31m-	sp = &cts->cb.fpr[fprodd-1]; \[m
[31m-	fprodd = 0; \[m
[31m-	goto done; \[m
[31m-      } else if (nfpr + 1 <= CCALL_NARG_FPR) { \[m
[31m-	sp = &cts->cb.fpr[nfpr++]; \[m
[31m-	fprodd = nfpr; \[m
[31m-	goto done; \[m
[31m-      } \[m
[31m-    } else { \[m
[31m-      if (nfpr + 1 <= CCALL_NARG_FPR) { \[m
[31m-	sp = &cts->cb.fpr[nfpr++]; \[m
[31m-	goto done; \[m
[31m-      } \[m
[31m-    } \[m
[31m-    fprodd = 0;  /* No reordering after the first FP value is on stack. */ \[m
[31m-  } else {[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG_FP2	}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  CALLBACK_HANDLE_REGARG_FP1 \[m
[31m-  if (n > 1) ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-  if (ngpr + n <= maxgpr) { \[m
[31m-    sp = &cts->cb.gpr[ngpr]; \[m
[31m-    ngpr += n; \[m
[31m-    goto done; \[m
[31m-  } CALLBACK_HANDLE_REGARG_FP2[m
[31m-[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (nfpr + n <= CCALL_NARG_FPR) { \[m
[31m-      sp = &cts->cb.fpr[nfpr]; \[m
[31m-      nfpr += n; \[m
[31m-      goto done; \[m
[31m-    } else { \[m
[31m-      nfpr = CCALL_NARG_FPR;  /* Prevent reordering. */ \[m
[31m-    } \[m
[31m-  } else { \[m
[31m-    if (!LJ_TARGET_IOS && n > 1) \[m
[31m-      ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      sp = &cts->cb.gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } else { \[m
[31m-      ngpr = CCALL_NARG_GPR;  /* Prevent reordering. */ \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#elif LJ_TARGET_PPC[m
[31m-[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp) { \[m
[31m-    if (nfpr + 1 <= CCALL_NARG_FPR) { \[m
[31m-      sp = &cts->cb.fpr[nfpr++]; \[m
[31m-      cta = ctype_get(cts, CTID_DOUBLE);  /* FPRs always hold doubles. */ \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    if (n > 1) { \[m
[31m-      lua_assert(ctype_isinteger(cta->info) && n == 2);  /* int64_t. */ \[m
[31m-      ngpr = (ngpr + 1u) & ~1u;  /* Align int64_t to regpair. */ \[m
[31m-    } \[m
[31m-    if (ngpr + n <= maxgpr) { \[m
[31m-      sp = &cts->cb.gpr[ngpr]; \[m
[31m-      ngpr += n; \[m
[31m-      goto done; \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-#define CALLBACK_HANDLE_RET \[m
[31m-  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \[m
[31m-    *(double *)dp = *(float *)dp;  /* FPRs always hold doubles. */[m
[31m-[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-[m
[31m-#define CALLBACK_HANDLE_GPR \[m
[31m-  if (n > 1) ngpr = (ngpr + 1u) & ~1u;  /* Align to regpair. */ \[m
[31m-  if (ngpr + n <= maxgpr) { \[m
[31m-    sp = &cts->cb.gpr[ngpr]; \[m
[31m-    ngpr += n; \[m
[31m-    goto done; \[m
[31m-  }[m
[31m-[m
[31m-#if !LJ_ABI_SOFTFP	/* MIPS32 hard-float */[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  if (isfp && nfpr < CCALL_NARG_FPR) {  /* Try to pass argument in FPRs. */ \[m
[31m-    sp = (void *)((uint8_t *)&cts->cb.fpr[nfpr] + ((LJ_BE && n==1) ? 4 : 0)); \[m
[31m-    nfpr++; ngpr += n; \[m
[31m-    goto done; \[m
[31m-  } else {  /* Try to pass argument in GPRs. */ \[m
[31m-    nfpr = CCALL_NARG_FPR; \[m
[31m-    CALLBACK_HANDLE_GPR \[m
[31m-  }[m
[31m-#else			/* MIPS32 soft-float */[m
[31m-#define CALLBACK_HANDLE_REGARG \[m
[31m-  CALLBACK_HANDLE_GPR \[m
[31m-  UNUSED(isfp);[m
[31m-#endif[m
[31m-[m
[31m-#define CALLBACK_HANDLE_RET \[m
[31m-  if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \[m
[31m-    ((float *)dp)[1] = *(float *)dp;[m
[31m-[m
[31m-#else[m
[31m-#error "Missing calling convention definitions for this architecture"[m
[31m-#endif[m
[31m-[m
[31m-/* Convert and push callback arguments to Lua stack. */[m
[31m-static void callback_conv_args(CTState *cts, lua_State *L)[m
[31m-{[m
[31m-  TValue *o = L->top;[m
[31m-  intptr_t *stack = cts->cb.stack;[m
[31m-  MSize slot = cts->cb.slot;[m
[31m-  CTypeID id = 0, rid, fid;[m
[31m-  int gcsteps = 0;[m
[31m-  CType *ct;[m
[31m-  GCfunc *fn;[m
[31m-  int fntp;[m
[31m-  MSize ngpr = 0, nsp = 0, maxgpr = CCALL_NARG_GPR;[m
[31m-#if CCALL_NARG_FPR[m
[31m-  MSize nfpr = 0;[m
[31m-#if LJ_TARGET_ARM[m
[31m-  MSize fprodd = 0;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-  if (slot < cts->cb.sizeid && (id = cts->cb.cbid[slot]) != 0) {[m
[31m-    ct = ctype_get(cts, id);[m
[31m-    rid = ctype_cid(ct->info);  /* Return type. x86: +(spadj<<16). */[m
[31m-    fn = funcV(lj_tab_getint(cts->miscmap, (int32_t)slot));[m
[31m-    fntp = LJ_TFUNC;[m
[31m-  } else {  /* Must set up frame first, before throwing the error. */[m
[31m-    ct = NULL;[m
[31m-    rid = 0;[m
[31m-    fn = (GCfunc *)L;[m
[31m-    fntp = LJ_TTHREAD;[m
[31m-  }[m
[31m-  /* Continuation returns from callback. */[m
[31m-  if (LJ_FR2) {[m
[31m-    (o++)->u64 = LJ_CONT_FFI_CALLBACK;[m
[31m-    (o++)->u64 = rid;[m
[31m-    o++;[m
[31m-  } else {[m
[31m-    o->u32.lo = LJ_CONT_FFI_CALLBACK;[m
[31m-    o->u32.hi = rid;[m
[31m-    o++;[m
[31m-  }[m
[31m-  setframe_gc(o, obj2gco(fn), fntp);[m
[31m-  setframe_ftsz(o, ((char *)(o+1) - (char *)L->base) + FRAME_CONT);[m
[31m-  L->top = L->base = ++o;[m
[31m-  if (!ct)[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_BADCBACK);[m
[31m-  if (isluafunc(fn))[m
[31m-    setcframe_pc(L->cframe, proto_bc(funcproto(fn))+1);[m
[31m-  lj_state_checkstack(L, LUA_MINSTACK);  /* May throw. */[m
[31m-  o = L->base;  /* Might have been reallocated. */[m
[31m-[m
[31m-#if LJ_TARGET_X86[m
[31m-  /* x86 has several different calling conventions. */[m
[31m-  switch (ctype_cconv(ct->info)) {[m
[31m-  case CTCC_FASTCALL: maxgpr = 2; break;[m
[31m-  case CTCC_THISCALL: maxgpr = 1; break;[m
[31m-  default: maxgpr = 0; break;[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  fid = ct->sib;[m
[31m-  while (fid) {[m
[31m-    CType *ctf = ctype_get(cts, fid);[m
[31m-    if (!ctype_isattrib(ctf->info)) {[m
[31m-      CType *cta;[m
[31m-      void *sp;[m
[31m-      CTSize sz;[m
[31m-      int isfp;[m
[31m-      MSize n;[m
[31m-      lua_assert(ctype_isfield(ctf->info));[m
[31m-      cta = ctype_rawchild(cts, ctf);[m
[31m-      isfp = ctype_isfp(cta->info);[m
[31m-      sz = (cta->size + CTSIZE_PTR-1) & ~(CTSIZE_PTR-1);[m
[31m-      n = sz / CTSIZE_PTR;  /* Number of GPRs or stack slots needed. */[m
[31m-[m
[31m-      CALLBACK_HANDLE_REGARG  /* Handle register arguments. */[m
[31m-[m
[31m-      /* Otherwise pass argument on stack. */[m
[31m-      if (CCALL_ALIGN_STACKARG && LJ_32 && sz == 8)[m
[31m-	nsp = (nsp + 1) & ~1u;  /* Align 64 bit argument on stack. */[m
[31m-      sp = &stack[nsp];[m
[31m-      nsp += n;[m
[31m-[m
[31m-    done:[m
[31m-      if (LJ_BE && cta->size < CTSIZE_PTR)[m
[31m-	sp = (void *)((uint8_t *)sp + CTSIZE_PTR-cta->size);[m
[31m-      gcsteps += lj_cconv_tv_ct(cts, cta, 0, o++, sp);[m
[31m-    }[m
[31m-    fid = ctf->sib;[m
[31m-  }[m
[31m-  L->top = o;[m
[31m-#if LJ_TARGET_X86[m
[31m-  /* Store stack adjustment for returns from non-cdecl callbacks. */[m
[31m-  if (ctype_cconv(ct->info) != CTCC_CDECL) {[m
[31m-#if LJ_FR2[m
[31m-    (L->base-3)->u64 |= (nsp << (16+2));[m
[31m-#else[m
[31m-    (L->base-2)->u32.hi |= (nsp << (16+2));[m
[31m-#endif[m
[31m-  }[m
[31m-#endif[m
[31m-  while (gcsteps-- > 0)[m
[31m-    lj_gc_check(L);[m
[31m-}[m
[31m-[m
[31m-/* Convert Lua object to callback result. */[m
[31m-static void callback_conv_result(CTState *cts, lua_State *L, TValue *o)[m
[31m-{[m
[31m-#if LJ_FR2[m
[31m-  CType *ctr = ctype_raw(cts, (uint16_t)(L->base-3)->u64);[m
[31m-#else[m
[31m-  CType *ctr = ctype_raw(cts, (uint16_t)(L->base-2)->u32.hi);[m
[31m-#endif[m
[31m-#if LJ_TARGET_X86[m
[31m-  cts->cb.gpr[2] = 0;[m
[31m-#endif[m
[31m-  if (!ctype_isvoid(ctr->info)) {[m
[31m-    uint8_t *dp = (uint8_t *)&cts->cb.gpr[0];[m
[31m-#if CCALL_NUM_FPR[m
[31m-    if (ctype_isfp(ctr->info))[m
[31m-      dp = (uint8_t *)&cts->cb.fpr[0];[m
[31m-#endif[m
[31m-    lj_cconv_ct_tv(cts, ctr, dp, o, 0);[m
[31m-#ifdef CALLBACK_HANDLE_RET[m
[31m-    CALLBACK_HANDLE_RET[m
[31m-#endif[m
[31m-    /* Extend returned integers to (at least) 32 bits. */[m
[31m-    if (ctype_isinteger_or_bool(ctr->info) && ctr->size < 4) {[m
[31m-      if (ctr->info & CTF_UNSIGNED)[m
[31m-	*(uint32_t *)dp = ctr->size == 1 ? (uint32_t)*(uint8_t *)dp :[m
[31m-					   (uint32_t)*(uint16_t *)dp;[m
[31m-      else[m
[31m-	*(int32_t *)dp = ctr->size == 1 ? (int32_t)*(int8_t *)dp :[m
[31m-					  (int32_t)*(int16_t *)dp;[m
[31m-    }[m
[31m-#if LJ_TARGET_X86[m
[31m-    if (ctype_isfp(ctr->info))[m
[31m-      cts->cb.gpr[2] = ctr->size == sizeof(float) ? 1 : 2;[m
[31m-#endif[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Enter callback. */[m
[31m-lua_State * LJ_FASTCALL lj_ccallback_enter(CTState *cts, void *cf)[m
[31m-{[m
[31m-  lua_State *L = cts->L;[m
[31m-  global_State *g = cts->g;[m
[31m-  lua_assert(L != NULL);[m
[31m-  if (tvref(g->jit_base)) {[m
[31m-    setstrV(L, L->top++, lj_err_str(L, LJ_ERR_FFI_BADCBACK));[m
[31m-    if (g->panic) g->panic(L);[m
[31m-    exit(EXIT_FAILURE);[m
[31m-  }[m
[31m-  lj_trace_abort(g);  /* Never record across callback. */[m
[31m-  /* Setup C frame. */[m
[31m-  cframe_prev(cf) = L->cframe;[m
[31m-  setcframe_L(cf, L);[m
[31m-  cframe_errfunc(cf) = -1;[m
[31m-  cframe_nres(cf) = 0;[m
[31m-  L->cframe = cf;[m
[31m-  callback_conv_args(cts, L);[m
[31m-  return L;  /* Now call the function on this stack. */[m
[31m-}[m
[31m-[m
[31m-/* Leave callback. */[m
[31m-void LJ_FASTCALL lj_ccallback_leave(CTState *cts, TValue *o)[m
[31m-{[m
[31m-  lua_State *L = cts->L;[m
[31m-  GCfunc *fn;[m
[31m-  TValue *obase = L->base;[m
[31m-  L->base = L->top;  /* Keep continuation frame for throwing errors. */[m
[31m-  if (o >= L->base) {[m
[31m-    /* PC of RET* is lost. Point to last line for result conv. errors. */[m
[31m-    fn = curr_func(L);[m
[31m-    if (isluafunc(fn)) {[m
[31m-      GCproto *pt = funcproto(fn);[m
[31m-      setcframe_pc(L->cframe, proto_bc(pt)+pt->sizebc+1);[m
[31m-    }[m
[31m-  }[m
[31m-  callback_conv_result(cts, L, o);[m
[31m-  /* Finally drop C frame and continuation frame. */[m
[31m-  L->top -= 2+2*LJ_FR2;[m
[31m-  L->base = obase;[m
[31m-  L->cframe = cframe_prev(L->cframe);[m
[31m-  cts->cb.slot = 0;  /* Blacklist C function that called the callback. */[m
[31m-}[m
[31m-[m
[31m-/* -- C callback management ----------------------------------------------- */[m
[31m-[m
[31m-/* Get an unused slot in the callback slot table. */[m
[31m-static MSize callback_slot_new(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTypeID id = ctype_typeid(cts, ct);[m
[31m-  CTypeID1 *cbid = cts->cb.cbid;[m
[31m-  MSize top;[m
[31m-  for (top = cts->cb.topid; top < cts->cb.sizeid; top++)[m
[31m-    if (LJ_LIKELY(cbid[top] == 0))[m
[31m-      goto found;[m
[31m-#if CALLBACK_MAX_SLOT[m
[31m-  if (top >= CALLBACK_MAX_SLOT)[m
[31m-#endif[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);[m
[31m-  if (!cts->cb.mcode)[m
[31m-    callback_mcode_new(cts);[m
[31m-  lj_mem_growvec(cts->L, cbid, cts->cb.sizeid, CALLBACK_MAX_SLOT, CTypeID1);[m
[31m-  cts->cb.cbid = cbid;[m
[31m-  memset(cbid+top, 0, (cts->cb.sizeid-top)*sizeof(CTypeID1));[m
[31m-found:[m
[31m-  cbid[top] = id;[m
[31m-  cts->cb.topid = top+1;[m
[31m-  return top;[m
[31m-}[m
[31m-[m
[31m-/* Check for function pointer and supported argument/result types. */[m
[31m-static CType *callback_checkfunc(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  int narg = 0;[m
[31m-  if (!ctype_isptr(ct->info) || (LJ_64 && ct->size != CTSIZE_PTR))[m
[31m-    return NULL;[m
[31m-  ct = ctype_rawchild(cts, ct);[m
[31m-  if (ctype_isfunc(ct->info)) {[m
[31m-    CType *ctr = ctype_rawchild(cts, ct);[m
[31m-    CTypeID fid = ct->sib;[m
[31m-    if (!(ctype_isvoid(ctr->info) || ctype_isenum(ctr->info) ||[m
[31m-	  ctype_isptr(ctr->info) || (ctype_isnum(ctr->info) && ctr->size <= 8)))[m
[31m-      return NULL;[m
[31m-    if ((ct->info & CTF_VARARG))[m
[31m-      return NULL;[m
[31m-    while (fid) {[m
[31m-      CType *ctf = ctype_get(cts, fid);[m
[31m-      if (!ctype_isattrib(ctf->info)) {[m
[31m-	CType *cta;[m
[31m-	lua_assert(ctype_isfield(ctf->info));[m
[31m-	cta = ctype_rawchild(cts, ctf);[m
[31m-	if (!(ctype_isenum(cta->info) || ctype_isptr(cta->info) ||[m
[31m-	      (ctype_isnum(cta->info) && cta->size <= 8)) ||[m
[31m-	    ++narg >= LUA_MINSTACK-3)[m
[31m-	  return NULL;[m
[31m-      }[m
[31m-      fid = ctf->sib;[m
[31m-    }[m
[31m-    return ct;[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Create a new callback and return the callback function pointer. */[m
[31m-void *lj_ccallback_new(CTState *cts, CType *ct, GCfunc *fn)[m
[31m-{[m
[31m-  ct = callback_checkfunc(cts, ct);[m
[31m-  if (ct) {[m
[31m-    MSize slot = callback_slot_new(cts, ct);[m
[31m-    GCtab *t = cts->miscmap;[m
[31m-    setfuncV(cts->L, lj_tab_setint(cts->L, t, (int32_t)slot), fn);[m
[31m-    lj_gc_anybarriert(cts->L, t);[m
[31m-    return callback_slot2ptr(cts, slot);[m
[31m-  }[m
[31m-  return NULL;  /* Bad conversion. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccallback.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccallback.h[m
[1mdeleted file mode 100644[m
[1mindex 99c778d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ccallback.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-/*[m
[31m-** FFI C callback handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CCALLBACK_H[m
[31m-#define _LJ_CCALLBACK_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* Really belongs to lj_vm.h. */[m
[31m-LJ_ASMF void lj_vm_ffi_callback(void);[m
[31m-[m
[31m-LJ_FUNC MSize lj_ccallback_ptr2slot(CTState *cts, void *p);[m
[31m-LJ_FUNCA lua_State * LJ_FASTCALL lj_ccallback_enter(CTState *cts, void *cf);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_ccallback_leave(CTState *cts, TValue *o);[m
[31m-LJ_FUNC void *lj_ccallback_new(CTState *cts, CType *ct, GCfunc *fn);[m
[31m-LJ_FUNC void lj_ccallback_mcode_free(CTState *cts);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cconv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cconv.c[m
[1mdeleted file mode 100644[m
[1mindex 81f3c87..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cconv.c[m
[1m+++ /dev/null[m
[36m@@ -1,752 +0,0 @@[m
[31m-/*[m
[31m-** C type conversions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_ccallback.h"[m
[31m-[m
[31m-/* -- Conversion errors --------------------------------------------------- */[m
[31m-[m
[31m-/* Bad conversion. */[m
[31m-LJ_NORET static void cconv_err_conv(CTState *cts, CType *d, CType *s,[m
[31m-				    CTInfo flags)[m
[31m-{[m
[31m-  const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL));[m
[31m-  const char *src;[m
[31m-  if ((flags & CCF_FROMTV))[m
[31m-    src = lj_obj_typename[1+(ctype_isnum(s->info) ? LUA_TNUMBER :[m
[31m-			     ctype_isarray(s->info) ? LUA_TSTRING : LUA_TNIL)];[m
[31m-  else[m
[31m-    src = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, s), NULL));[m
[31m-  if (CCF_GETARG(flags))[m
[31m-    lj_err_argv(cts->L, CCF_GETARG(flags), LJ_ERR_FFI_BADCONV, src, dst);[m
[31m-  else[m
[31m-    lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst);[m
[31m-}[m
[31m-[m
[31m-/* Bad conversion from TValue. */[m
[31m-LJ_NORET static void cconv_err_convtv(CTState *cts, CType *d, TValue *o,[m
[31m-				      CTInfo flags)[m
[31m-{[m
[31m-  const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL));[m
[31m-  const char *src = lj_typename(o);[m
[31m-  if (CCF_GETARG(flags))[m
[31m-    lj_err_argv(cts->L, CCF_GETARG(flags), LJ_ERR_FFI_BADCONV, src, dst);[m
[31m-  else[m
[31m-    lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst);[m
[31m-}[m
[31m-[m
[31m-/* Initializer overflow. */[m
[31m-LJ_NORET static void cconv_err_initov(CTState *cts, CType *d)[m
[31m-{[m
[31m-  const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL));[m
[31m-  lj_err_callerv(cts->L, LJ_ERR_FFI_INITOV, dst);[m
[31m-}[m
[31m-[m
[31m-/* -- C type compatibility checks ----------------------------------------- */[m
[31m-[m
[31m-/* Get raw type and qualifiers for a child type. Resolves enums, too. */[m
[31m-static CType *cconv_childqual(CTState *cts, CType *ct, CTInfo *qual)[m
[31m-{[m
[31m-  ct = ctype_child(cts, ct);[m
[31m-  for (;;) {[m
[31m-    if (ctype_isattrib(ct->info)) {[m
[31m-      if (ctype_attrib(ct->info) == CTA_QUAL) *qual |= ct->size;[m
[31m-    } else if (!ctype_isenum(ct->info)) {[m
[31m-      break;[m
[31m-    }[m
[31m-    ct = ctype_child(cts, ct);[m
[31m-  }[m
[31m-  *qual |= (ct->info & CTF_QUAL);[m
[31m-  return ct;[m
[31m-}[m
[31m-[m
[31m-/* Check for compatible types when converting to a pointer.[m
[31m-** Note: these checks are more relaxed than what C99 mandates.[m
[31m-*/[m
[31m-int lj_cconv_compatptr(CTState *cts, CType *d, CType *s, CTInfo flags)[m
[31m-{[m
[31m-  if (!((flags & CCF_CAST) || d == s)) {[m
[31m-    CTInfo dqual = 0, squal = 0;[m
[31m-    d = cconv_childqual(cts, d, &dqual);[m
[31m-    if (!ctype_isstruct(s->info))[m
[31m-      s = cconv_childqual(cts, s, &squal);[m
[31m-    if ((flags & CCF_SAME)) {[m
[31m-      if (dqual != squal)[m
[31m-	return 0;  /* Different qualifiers. */[m
[31m-    } else if (!(flags & CCF_IGNQUAL)) {[m
[31m-      if ((dqual & squal) != squal)[m
[31m-	return 0;  /* Discarded qualifiers. */[m
[31m-      if (ctype_isvoid(d->info) || ctype_isvoid(s->info))[m
[31m-	return 1;  /* Converting to/from void * is always ok. */[m
[31m-    }[m
[31m-    if (ctype_type(d->info) != ctype_type(s->info) ||[m
[31m-	d->size != s->size)[m
[31m-      return 0;  /* Different type or different size. */[m
[31m-    if (ctype_isnum(d->info)) {[m
[31m-      if (((d->info ^ s->info) & (CTF_BOOL|CTF_FP)))[m
[31m-	return 0;  /* Different numeric types. */[m
[31m-    } else if (ctype_ispointer(d->info)) {[m
[31m-      /* Check child types for compatibility. */[m
[31m-      return lj_cconv_compatptr(cts, d, s, flags|CCF_SAME);[m
[31m-    } else if (ctype_isstruct(d->info)) {[m
[31m-      if (d != s)[m
[31m-	return 0;  /* Must be exact same type for struct/union. */[m
[31m-    } else if (ctype_isfunc(d->info)) {[m
[31m-      /* NYI: structural equality of functions. */[m
[31m-    }[m
[31m-  }[m
[31m-  return 1;  /* Types are compatible. */[m
[31m-}[m
[31m-[m
[31m-/* -- C type to C type conversion ----------------------------------------- */[m
[31m-[m
[31m-/* Convert C type to C type. Caveat: expects to get the raw CType![m
[31m-**[m
[31m-** Note: This is only used by the interpreter and not optimized at all.[m
[31m-** The JIT compiler will do a much better job specializing for each case.[m
[31m-*/[m
[31m-void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,[m
[31m-		    uint8_t *dp, uint8_t *sp, CTInfo flags)[m
[31m-{[m
[31m-  CTSize dsize = d->size, ssize = s->size;[m
[31m-  CTInfo dinfo = d->info, sinfo = s->info;[m
[31m-  void *tmpptr;[m
[31m-[m
[31m-  lua_assert(!ctype_isenum(dinfo) && !ctype_isenum(sinfo));[m
[31m-  lua_assert(!ctype_isattrib(dinfo) && !ctype_isattrib(sinfo));[m
[31m-[m
[31m-  if (ctype_type(dinfo) > CT_MAYCONVERT || ctype_type(sinfo) > CT_MAYCONVERT)[m
[31m-    goto err_conv;[m
[31m-[m
[31m-  /* Some basic sanity checks. */[m
[31m-  lua_assert(!ctype_isnum(dinfo) || dsize > 0);[m
[31m-  lua_assert(!ctype_isnum(sinfo) || ssize > 0);[m
[31m-  lua_assert(!ctype_isbool(dinfo) || dsize == 1 || dsize == 4);[m
[31m-  lua_assert(!ctype_isbool(sinfo) || ssize == 1 || ssize == 4);[m
[31m-  lua_assert(!ctype_isinteger(dinfo) || (1u<<lj_fls(dsize)) == dsize);[m
[31m-  lua_assert(!ctype_isinteger(sinfo) || (1u<<lj_fls(ssize)) == ssize);[m
[31m-[m
[31m-  switch (cconv_idx2(dinfo, sinfo)) {[m
[31m-  /* Destination is a bool. */[m
[31m-  case CCX(B, B):[m
[31m-    /* Source operand is already normalized. */[m
[31m-    if (dsize == 1) *dp = *sp; else *(int *)dp = *sp;[m
[31m-    break;[m
[31m-  case CCX(B, I): {[m
[31m-    MSize i;[m
[31m-    uint8_t b = 0;[m
[31m-    for (i = 0; i < ssize; i++) b |= sp[i];[m
[31m-    b = (b != 0);[m
[31m-    if (dsize == 1) *dp = b; else *(int *)dp = b;[m
[31m-    break;[m
[31m-    }[m
[31m-  case CCX(B, F): {[m
[31m-    uint8_t b;[m
[31m-    if (ssize == sizeof(double)) b = (*(double *)sp != 0);[m
[31m-    else if (ssize == sizeof(float)) b = (*(float *)sp != 0);[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    if (dsize == 1) *dp = b; else *(int *)dp = b;[m
[31m-    break;[m
[31m-    }[m
[31m-[m
[31m-  /* Destination is an integer. */[m
[31m-  case CCX(I, B):[m
[31m-  case CCX(I, I):[m
[31m-  conv_I_I:[m
[31m-    if (dsize > ssize) {  /* Zero-extend or sign-extend LSB. */[m
[31m-#if LJ_LE[m
[31m-      uint8_t fill = (!(sinfo & CTF_UNSIGNED) && (sp[ssize-1]&0x80)) ? 0xff : 0;[m
[31m-      memcpy(dp, sp, ssize);[m
[31m-      memset(dp + ssize, fill, dsize-ssize);[m
[31m-#else[m
[31m-      uint8_t fill = (!(sinfo & CTF_UNSIGNED) && (sp[0]&0x80)) ? 0xff : 0;[m
[31m-      memset(dp, fill, dsize-ssize);[m
[31m-      memcpy(dp + (dsize-ssize), sp, ssize);[m
[31m-#endif[m
[31m-    } else {  /* Copy LSB. */[m
[31m-#if LJ_LE[m
[31m-      memcpy(dp, sp, dsize);[m
[31m-#else[m
[31m-      memcpy(dp, sp + (ssize-dsize), dsize);[m
[31m-#endif[m
[31m-    }[m
[31m-    break;[m
[31m-  case CCX(I, F): {[m
[31m-    double n;  /* Always convert via double. */[m
[31m-  conv_I_F:[m
[31m-    /* Convert source to double. */[m
[31m-    if (ssize == sizeof(double)) n = *(double *)sp;[m
[31m-    else if (ssize == sizeof(float)) n = (double)*(float *)sp;[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    /* Then convert double to integer. */[m
[31m-    /* The conversion must exactly match the semantics of JIT-compiled code! */[m
[31m-    if (dsize < 4 || (dsize == 4 && !(dinfo & CTF_UNSIGNED))) {[m
[31m-      int32_t i = (int32_t)n;[m
[31m-      if (dsize == 4) *(int32_t *)dp = i;[m
[31m-      else if (dsize == 2) *(int16_t *)dp = (int16_t)i;[m
[31m-      else *(int8_t *)dp = (int8_t)i;[m
[31m-    } else if (dsize == 4) {[m
[31m-      *(uint32_t *)dp = (uint32_t)n;[m
[31m-    } else if (dsize == 8) {[m
[31m-      if (!(dinfo & CTF_UNSIGNED))[m
[31m-	*(int64_t *)dp = (int64_t)n;[m
[31m-      else[m
[31m-	*(uint64_t *)dp = lj_num2u64(n);[m
[31m-    } else {[m
[31m-      goto err_conv;  /* NYI: conversion to >64 bit integers. */[m
[31m-    }[m
[31m-    break;[m
[31m-    }[m
[31m-  case CCX(I, C):[m
[31m-    s = ctype_child(cts, s);[m
[31m-    sinfo = s->info;[m
[31m-    ssize = s->size;[m
[31m-    goto conv_I_F;  /* Just convert re. */[m
[31m-  case CCX(I, P):[m
[31m-    if (!(flags & CCF_CAST)) goto err_conv;[m
[31m-    sinfo = CTINFO(CT_NUM, CTF_UNSIGNED);[m
[31m-    goto conv_I_I;[m
[31m-  case CCX(I, A):[m
[31m-    if (!(flags & CCF_CAST)) goto err_conv;[m
[31m-    sinfo = CTINFO(CT_NUM, CTF_UNSIGNED);[m
[31m-    ssize = CTSIZE_PTR;[m
[31m-    tmpptr = sp;[m
[31m-    sp = (uint8_t *)&tmpptr;[m
[31m-    goto conv_I_I;[m
[31m-[m
[31m-  /* Destination is a floating-point number. */[m
[31m-  case CCX(F, B):[m
[31m-  case CCX(F, I): {[m
[31m-    double n;  /* Always convert via double. */[m
[31m-  conv_F_I:[m
[31m-    /* First convert source to double. */[m
[31m-    /* The conversion must exactly match the semantics of JIT-compiled code! */[m
[31m-    if (ssize < 4 || (ssize == 4 && !(sinfo & CTF_UNSIGNED))) {[m
[31m-      int32_t i;[m
[31m-      if (ssize == 4) {[m
[31m-	i = *(int32_t *)sp;[m
[31m-      } else if (!(sinfo & CTF_UNSIGNED)) {[m
[31m-	if (ssize == 2) i = *(int16_t *)sp;[m
[31m-	else i = *(int8_t *)sp;[m
[31m-      } else {[m
[31m-	if (ssize == 2) i = *(uint16_t *)sp;[m
[31m-	else i = *(uint8_t *)sp;[m
[31m-      }[m
[31m-      n = (double)i;[m
[31m-    } else if (ssize == 4) {[m
[31m-      n = (double)*(uint32_t *)sp;[m
[31m-    } else if (ssize == 8) {[m
[31m-      if (!(sinfo & CTF_UNSIGNED)) n = (double)*(int64_t *)sp;[m
[31m-      else n = (double)*(uint64_t *)sp;[m
[31m-    } else {[m
[31m-      goto err_conv;  /* NYI: conversion from >64 bit integers. */[m
[31m-    }[m
[31m-    /* Convert double to destination. */[m
[31m-    if (dsize == sizeof(double)) *(double *)dp = n;[m
[31m-    else if (dsize == sizeof(float)) *(float *)dp = (float)n;[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    break;[m
[31m-    }[m
[31m-  case CCX(F, F): {[m
[31m-    double n;  /* Always convert via double. */[m
[31m-  conv_F_F:[m
[31m-    if (ssize == dsize) goto copyval;[m
[31m-    /* Convert source to double. */[m
[31m-    if (ssize == sizeof(double)) n = *(double *)sp;[m
[31m-    else if (ssize == sizeof(float)) n = (double)*(float *)sp;[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    /* Convert double to destination. */[m
[31m-    if (dsize == sizeof(double)) *(double *)dp = n;[m
[31m-    else if (dsize == sizeof(float)) *(float *)dp = (float)n;[m
[31m-    else goto err_conv;  /* NYI: long double. */[m
[31m-    break;[m
[31m-    }[m
[31m-  case CCX(F, C):[m
[31m-    s = ctype_child(cts, s);[m
[31m-    sinfo = s->info;[m
[31m-    ssize = s->size;[m
[31m-    goto conv_F_F;  /* Ignore im, and convert from re. */[m
[31m-[m
[31m-  /* Destination is a complex number. */[m
[31m-  case CCX(C, I):[m
[31m-    d = ctype_child(cts, d);[m
[31m-    dinfo = d->info;[m
[31m-    dsize = d->size;[m
[31m-    memset(dp + dsize, 0, dsize);  /* Clear im. */[m
[31m-    goto conv_F_I;  /* Convert to re. */[m
[31m-  case CCX(C, F):[m
[31m-    d = ctype_child(cts, d);[m
[31m-    dinfo = d->info;[m
[31m-    dsize = d->size;[m
[31m-    memset(dp + dsize, 0, dsize);  /* Clear im. */[m
[31m-    goto conv_F_F;  /* Convert to re. */[m
[31m-[m
[31m-  case CCX(C, C):[m
[31m-    if (dsize != ssize) {  /* Different types: convert re/im separately. */[m
[31m-      CType *dc = ctype_child(cts, d);[m
[31m-      CType *sc = ctype_child(cts, s);[m
[31m-      lj_cconv_ct_ct(cts, dc, sc, dp, sp, flags);[m
[31m-      lj_cconv_ct_ct(cts, dc, sc, dp + dc->size, sp + sc->size, flags);[m
[31m-      return;[m
[31m-    }[m
[31m-    goto copyval;  /* Otherwise this is easy. */[m
[31m-[m
[31m-  /* Destination is a vector. */[m
[31m-  case CCX(V, I):[m
[31m-  case CCX(V, F):[m
[31m-  case CCX(V, C): {[m
[31m-    CType *dc = ctype_child(cts, d);[m
[31m-    CTSize esize;[m
[31m-    /* First convert the scalar to the first element. */[m
[31m-    lj_cconv_ct_ct(cts, dc, s, dp, sp, flags);[m
[31m-    /* Then replicate it to the other elements (splat). */[m
[31m-    for (sp = dp, esize = dc->size; dsize > esize; dsize -= esize) {[m
[31m-      dp += esize;[m
[31m-      memcpy(dp, sp, esize);[m
[31m-    }[m
[31m-    break;[m
[31m-    }[m
[31m-[m
[31m-  case CCX(V, V):[m
[31m-    /* Copy same-sized vectors, even for different lengths/element-types. */[m
[31m-    if (dsize != ssize) goto err_conv;[m
[31m-    goto copyval;[m
[31m-[m
[31m-  /* Destination is a pointer. */[m
[31m-  case CCX(P, I):[m
[31m-    if (!(flags & CCF_CAST)) goto err_conv;[m
[31m-    dinfo = CTINFO(CT_NUM, CTF_UNSIGNED);[m
[31m-    goto conv_I_I;[m
[31m-[m
[31m-  case CCX(P, F):[m
[31m-    if (!(flags & CCF_CAST) || !(flags & CCF_FROMTV)) goto err_conv;[m
[31m-    /* The signed conversion is cheaper. x64 really has 47 bit pointers. */[m
[31m-    dinfo = CTINFO(CT_NUM, (LJ_64 && dsize == 8) ? 0 : CTF_UNSIGNED);[m
[31m-    goto conv_I_F;[m
[31m-[m
[31m-  case CCX(P, P):[m
[31m-    if (!lj_cconv_compatptr(cts, d, s, flags)) goto err_conv;[m
[31m-    cdata_setptr(dp, dsize, cdata_getptr(sp, ssize));[m
[31m-    break;[m
[31m-[m
[31m-  case CCX(P, A):[m
[31m-  case CCX(P, S):[m
[31m-    if (!lj_cconv_compatptr(cts, d, s, flags)) goto err_conv;[m
[31m-    cdata_setptr(dp, dsize, sp);[m
[31m-    break;[m
[31m-[m
[31m-  /* Destination is an array. */[m
[31m-  case CCX(A, A):[m
[31m-    if ((flags & CCF_CAST) || (d->info & CTF_VLA) || dsize != ssize ||[m
[31m-	d->size == CTSIZE_INVALID || !lj_cconv_compatptr(cts, d, s, flags))[m
[31m-      goto err_conv;[m
[31m-    goto copyval;[m
[31m-[m
[31m-  /* Destination is a struct/union. */[m
[31m-  case CCX(S, S):[m
[31m-    if ((flags & CCF_CAST) || (d->info & CTF_VLA) || d != s)[m
[31m-      goto err_conv;  /* Must be exact same type. */[m
[31m-copyval:  /* Copy value. */[m
[31m-    lua_assert(dsize == ssize);[m
[31m-    memcpy(dp, sp, dsize);[m
[31m-    break;[m
[31m-[m
[31m-  default:[m
[31m-  err_conv:[m
[31m-    cconv_err_conv(cts, d, s, flags);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- C type to TValue conversion ----------------------------------------- */[m
[31m-[m
[31m-/* Convert C type to TValue. Caveat: expects to get the raw CType! */[m
[31m-int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,[m
[31m-		   TValue *o, uint8_t *sp)[m
[31m-{[m
[31m-  CTInfo sinfo = s->info;[m
[31m-  if (ctype_isnum(sinfo)) {[m
[31m-    if (!ctype_isbool(sinfo)) {[m
[31m-      if (ctype_isinteger(sinfo) && s->size > 4) goto copyval;[m
[31m-      if (LJ_DUALNUM && ctype_isinteger(sinfo)) {[m
[31m-	int32_t i;[m
[31m-	lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT32), s,[m
[31m-		       (uint8_t *)&i, sp, 0);[m
[31m-	if ((sinfo & CTF_UNSIGNED) && i < 0)[m
[31m-	  setnumV(o, (lua_Number)(uint32_t)i);[m
[31m-	else[m
[31m-	  setintV(o, i);[m
[31m-      } else {[m
[31m-	lj_cconv_ct_ct(cts, ctype_get(cts, CTID_DOUBLE), s,[m
[31m-		       (uint8_t *)&o->n, sp, 0);[m
[31m-	/* Numbers are NOT canonicalized here! Beware of uninitialized data. */[m
[31m-	lua_assert(tvisnum(o));[m
[31m-      }[m
[31m-    } else {[m
[31m-      uint32_t b = s->size == 1 ? (*sp != 0) : (*(int *)sp != 0);[m
[31m-      setboolV(o, b);[m
[31m-      setboolV(&cts->g->tmptv2, b);  /* Remember for trace recorder. */[m
[31m-    }[m
[31m-    return 0;[m
[31m-  } else if (ctype_isrefarray(sinfo) || ctype_isstruct(sinfo)) {[m
[31m-    /* Create reference. */[m
[31m-    setcdataV(cts->L, o, lj_cdata_newref(cts, sp, sid));[m
[31m-    return 1;  /* Need GC step. */[m
[31m-  } else {[m
[31m-    GCcdata *cd;[m
[31m-    CTSize sz;[m
[31m-  copyval:  /* Copy value. */[m
[31m-    sz = s->size;[m
[31m-    lua_assert(sz != CTSIZE_INVALID);[m
[31m-    /* Attributes are stripped, qualifiers are kept (but mostly ignored). */[m
[31m-    cd = lj_cdata_new(cts, ctype_typeid(cts, s), sz);[m
[31m-    setcdataV(cts->L, o, cd);[m
[31m-    memcpy(cdataptr(cd), sp, sz);[m
[31m-    return 1;  /* Need GC step. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Convert bitfield to TValue. */[m
[31m-int lj_cconv_tv_bf(CTState *cts, CType *s, TValue *o, uint8_t *sp)[m
[31m-{[m
[31m-  CTInfo info = s->info;[m
[31m-  CTSize pos, bsz;[m
[31m-  uint32_t val;[m
[31m-  lua_assert(ctype_isbitfield(info));[m
[31m-  /* NYI: packed bitfields may cause misaligned reads. */[m
[31m-  switch (ctype_bitcsz(info)) {[m
[31m-  case 4: val = *(uint32_t *)sp; break;[m
[31m-  case 2: val = *(uint16_t *)sp; break;[m
[31m-  case 1: val = *(uint8_t *)sp; break;[m
[31m-  default: lua_assert(0); val = 0; break;[m
[31m-  }[m
[31m-  /* Check if a packed bitfield crosses a container boundary. */[m
[31m-  pos = ctype_bitpos(info);[m
[31m-  bsz = ctype_bitbsz(info);[m
[31m-  lua_assert(pos < 8*ctype_bitcsz(info));[m
[31m-  lua_assert(bsz > 0 && bsz <= 8*ctype_bitcsz(info));[m
[31m-  if (pos + bsz > 8*ctype_bitcsz(info))[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_NYIPACKBIT);[m
[31m-  if (!(info & CTF_BOOL)) {[m
[31m-    CTSize shift = 32 - bsz;[m
[31m-    if (!(info & CTF_UNSIGNED)) {[m
[31m-      setintV(o, (int32_t)(val << (shift-pos)) >> shift);[m
[31m-    } else {[m
[31m-      val = (val << (shift-pos)) >> shift;[m
[31m-      if (!LJ_DUALNUM || (int32_t)val < 0)[m
[31m-	setnumV(o, (lua_Number)(uint32_t)val);[m
[31m-      else[m
[31m-	setintV(o, (int32_t)val);[m
[31m-    }[m
[31m-  } else {[m
[31m-    lua_assert(bsz == 1);[m
[31m-    setboolV(o, (val >> pos) & 1);[m
[31m-  }[m
[31m-  return 0;  /* No GC step needed. */[m
[31m-}[m
[31m-[m
[31m-/* -- TValue to C type conversion ----------------------------------------- */[m
[31m-[m
[31m-/* Convert table to array. */[m
[31m-static void cconv_array_tab(CTState *cts, CType *d,[m
[31m-			    uint8_t *dp, GCtab *t, CTInfo flags)[m
[31m-{[m
[31m-  int32_t i;[m
[31m-  CType *dc = ctype_rawchild(cts, d);  /* Array element type. */[m
[31m-  CTSize size = d->size, esize = dc->size, ofs = 0;[m
[31m-  for (i = 0; ; i++) {[m
[31m-    TValue *tv = (TValue *)lj_tab_getint(t, i);[m
[31m-    if (!tv || tvisnil(tv)) {[m
[31m-      if (i == 0) continue;  /* Try again for 1-based tables. */[m
[31m-      break;  /* Stop at first nil. */[m
[31m-    }[m
[31m-    if (ofs >= size)[m
[31m-      cconv_err_initov(cts, d);[m
[31m-    lj_cconv_ct_tv(cts, dc, dp + ofs, tv, flags);[m
[31m-    ofs += esize;[m
[31m-  }[m
[31m-  if (size != CTSIZE_INVALID) {  /* Only fill up arrays with known size. */[m
[31m-    if (ofs == esize) {  /* Replicate a single element. */[m
[31m-      for (; ofs < size; ofs += esize) memcpy(dp + ofs, dp, esize);[m
[31m-    } else {  /* Otherwise fill the remainder with zero. */[m
[31m-      memset(dp + ofs, 0, size - ofs);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Convert table to sub-struct/union. */[m
[31m-static void cconv_substruct_tab(CTState *cts, CType *d, uint8_t *dp,[m
[31m-				GCtab *t, int32_t *ip, CTInfo flags)[m
[31m-{[m
[31m-  CTypeID id = d->sib;[m
[31m-  while (id) {[m
[31m-    CType *df = ctype_get(cts, id);[m
[31m-    id = df->sib;[m
[31m-    if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) {[m
[31m-      TValue *tv;[m
[31m-      int32_t i = *ip, iz = i;[m
[31m-      if (!gcref(df->name)) continue;  /* Ignore unnamed fields. */[m
[31m-      if (i >= 0) {[m
[31m-      retry:[m
[31m-	tv = (TValue *)lj_tab_getint(t, i);[m
[31m-	if (!tv || tvisnil(tv)) {[m
[31m-	  if (i == 0) { i = 1; goto retry; }  /* 1-based tables. */[m
[31m-	  if (iz == 0) { *ip = i = -1; goto tryname; }  /* Init named fields. */[m
[31m-	  break;  /* Stop at first nil. */[m
[31m-	}[m
[31m-	*ip = i + 1;[m
[31m-      } else {[m
[31m-      tryname:[m
[31m-	tv = (TValue *)lj_tab_getstr(t, gco2str(gcref(df->name)));[m
[31m-	if (!tv || tvisnil(tv)) continue;[m
[31m-      }[m
[31m-      if (ctype_isfield(df->info))[m
[31m-	lj_cconv_ct_tv(cts, ctype_rawchild(cts, df), dp+df->size, tv, flags);[m
[31m-      else[m
[31m-	lj_cconv_bf_tv(cts, df, dp+df->size, tv);[m
[31m-      if ((d->info & CTF_UNION)) break;[m
[31m-    } else if (ctype_isxattrib(df->info, CTA_SUBTYPE)) {[m
[31m-      cconv_substruct_tab(cts, ctype_rawchild(cts, df),[m
[31m-			  dp+df->size, t, ip, flags);[m
[31m-    }  /* Ignore all other entries in the chain. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Convert table to struct/union. */[m
[31m-static void cconv_struct_tab(CTState *cts, CType *d,[m
[31m-			     uint8_t *dp, GCtab *t, CTInfo flags)[m
[31m-{[m
[31m-  int32_t i = 0;[m
[31m-  memset(dp, 0, d->size);  /* Much simpler to clear the struct first. */[m
[31m-  cconv_substruct_tab(cts, d, dp, t, &i, flags);[m
[31m-}[m
[31m-[m
[31m-/* Convert TValue to C type. Caveat: expects to get the raw CType! */[m
[31m-void lj_cconv_ct_tv(CTState *cts, CType *d,[m
[31m-		    uint8_t *dp, TValue *o, CTInfo flags)[m
[31m-{[m
[31m-  CTypeID sid = CTID_P_VOID;[m
[31m-  CType *s;[m
[31m-  void *tmpptr;[m
[31m-  uint8_t tmpbool, *sp = (uint8_t *)&tmpptr;[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    sp = (uint8_t *)&o->i;[m
[31m-    sid = CTID_INT32;[m
[31m-    flags |= CCF_FROMTV;[m
[31m-  } else if (LJ_LIKELY(tvisnum(o))) {[m
[31m-    sp = (uint8_t *)&o->n;[m
[31m-    sid = CTID_DOUBLE;[m
[31m-    flags |= CCF_FROMTV;[m
[31m-  } else if (tviscdata(o)) {[m
[31m-    sp = cdataptr(cdataV(o));[m
[31m-    sid = cdataV(o)->ctypeid;[m
[31m-    s = ctype_get(cts, sid);[m
[31m-    if (ctype_isref(s->info)) {  /* Resolve reference for value. */[m
[31m-      lua_assert(s->size == CTSIZE_PTR);[m
[31m-      sp = *(void **)sp;[m
[31m-      sid = ctype_cid(s->info);[m
[31m-    }[m
[31m-    s = ctype_raw(cts, sid);[m
[31m-    if (ctype_isfunc(s->info)) {[m
[31m-      sid = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|sid), CTSIZE_PTR);[m
[31m-    } else {[m
[31m-      if (ctype_isenum(s->info)) s = ctype_child(cts, s);[m
[31m-      goto doconv;[m
[31m-    }[m
[31m-  } else if (tvisstr(o)) {[m
[31m-    GCstr *str = strV(o);[m
[31m-    if (ctype_isenum(d->info)) {  /* Match string against enum constant. */[m
[31m-      CTSize ofs;[m
[31m-      CType *cct = lj_ctype_getfield(cts, d, str, &ofs);[m
[31m-      if (!cct || !ctype_isconstval(cct->info))[m
[31m-	goto err_conv;[m
[31m-      lua_assert(d->size == 4);[m
[31m-      sp = (uint8_t *)&cct->size;[m
[31m-      sid = ctype_cid(cct->info);[m
[31m-    } else if (ctype_isrefarray(d->info)) {  /* Copy string to array. */[m
[31m-      CType *dc = ctype_rawchild(cts, d);[m
[31m-      CTSize sz = str->len+1;[m
[31m-      if (!ctype_isinteger(dc->info) || dc->size != 1)[m
[31m-	goto err_conv;[m
[31m-      if (d->size != 0 && d->size < sz)[m
[31m-	sz = d->size;[m
[31m-      memcpy(dp, strdata(str), sz);[m
[31m-      return;[m
[31m-    } else {  /* Otherwise pass it as a const char[]. */[m
[31m-      sp = (uint8_t *)strdata(str);[m
[31m-      sid = CTID_A_CCHAR;[m
[31m-      flags |= CCF_FROMTV;[m
[31m-    }[m
[31m-  } else if (tvistab(o)) {[m
[31m-    if (ctype_isarray(d->info)) {[m
[31m-      cconv_array_tab(cts, d, dp, tabV(o), flags);[m
[31m-      return;[m
[31m-    } else if (ctype_isstruct(d->info)) {[m
[31m-      cconv_struct_tab(cts, d, dp, tabV(o), flags);[m
[31m-      return;[m
[31m-    } else {[m
[31m-      goto err_conv;[m
[31m-    }[m
[31m-  } else if (tvisbool(o)) {[m
[31m-    tmpbool = boolV(o);[m
[31m-    sp = &tmpbool;[m
[31m-    sid = CTID_BOOL;[m
[31m-  } else if (tvisnil(o)) {[m
[31m-    tmpptr = (void *)0;[m
[31m-    flags |= CCF_FROMTV;[m
[31m-  } else if (tvisudata(o)) {[m
[31m-    GCudata *ud = udataV(o);[m
[31m-    tmpptr = uddata(ud);[m
[31m-    if (ud->udtype == UDTYPE_IO_FILE)[m
[31m-      tmpptr = *(void **)tmpptr;[m
[31m-  } else if (tvislightud(o)) {[m
[31m-    tmpptr = lightudV(o);[m
[31m-  } else if (tvisfunc(o)) {[m
[31m-    void *p = lj_ccallback_new(cts, d, funcV(o));[m
[31m-    if (p) {[m
[31m-      *(void **)dp = p;[m
[31m-      return;[m
[31m-    }[m
[31m-    goto err_conv;[m
[31m-  } else {[m
[31m-  err_conv:[m
[31m-    cconv_err_convtv(cts, d, o, flags);[m
[31m-  }[m
[31m-  s = ctype_get(cts, sid);[m
[31m-doconv:[m
[31m-  if (ctype_isenum(d->info)) d = ctype_child(cts, d);[m
[31m-  lj_cconv_ct_ct(cts, d, s, dp, sp, flags);[m
[31m-}[m
[31m-[m
[31m-/* Convert TValue to bitfield. */[m
[31m-void lj_cconv_bf_tv(CTState *cts, CType *d, uint8_t *dp, TValue *o)[m
[31m-{[m
[31m-  CTInfo info = d->info;[m
[31m-  CTSize pos, bsz;[m
[31m-  uint32_t val, mask;[m
[31m-  lua_assert(ctype_isbitfield(info));[m
[31m-  if ((info & CTF_BOOL)) {[m
[31m-    uint8_t tmpbool;[m
[31m-    lua_assert(ctype_bitbsz(info) == 1);[m
[31m-    lj_cconv_ct_tv(cts, ctype_get(cts, CTID_BOOL), &tmpbool, o, 0);[m
[31m-    val = tmpbool;[m
[31m-  } else {[m
[31m-    CTypeID did = (info & CTF_UNSIGNED) ? CTID_UINT32 : CTID_INT32;[m
[31m-    lj_cconv_ct_tv(cts, ctype_get(cts, did), (uint8_t *)&val, o, 0);[m
[31m-  }[m
[31m-  pos = ctype_bitpos(info);[m
[31m-  bsz = ctype_bitbsz(info);[m
[31m-  lua_assert(pos < 8*ctype_bitcsz(info));[m
[31m-  lua_assert(bsz > 0 && bsz <= 8*ctype_bitcsz(info));[m
[31m-  /* Check if a packed bitfield crosses a container boundary. */[m
[31m-  if (pos + bsz > 8*ctype_bitcsz(info))[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_NYIPACKBIT);[m
[31m-  mask = ((1u << bsz) - 1u) << pos;[m
[31m-  val = (val << pos) & mask;[m
[31m-  /* NYI: packed bitfields may cause misaligned reads/writes. */[m
[31m-  switch (ctype_bitcsz(info)) {[m
[31m-  case 4: *(uint32_t *)dp = (*(uint32_t *)dp & ~mask) | (uint32_t)val; break;[m
[31m-  case 2: *(uint16_t *)dp = (*(uint16_t *)dp & ~mask) | (uint16_t)val; break;[m
[31m-  case 1: *(uint8_t *)dp = (*(uint8_t *)dp & ~mask) | (uint8_t)val; break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Initialize C type with TValues -------------------------------------- */[m
[31m-[m
[31m-/* Initialize an array with TValues. */[m
[31m-static void cconv_array_init(CTState *cts, CType *d, CTSize sz, uint8_t *dp,[m
[31m-			     TValue *o, MSize len)[m
[31m-{[m
[31m-  CType *dc = ctype_rawchild(cts, d);  /* Array element type. */[m
[31m-  CTSize ofs, esize = dc->size;[m
[31m-  MSize i;[m
[31m-  if (len*esize > sz)[m
[31m-    cconv_err_initov(cts, d);[m
[31m-  for (i = 0, ofs = 0; i < len; i++, ofs += esize)[m
[31m-    lj_cconv_ct_tv(cts, dc, dp + ofs, o + i, 0);[m
[31m-  if (ofs == esize) {  /* Replicate a single element. */[m
[31m-    for (; ofs < sz; ofs += esize) memcpy(dp + ofs, dp, esize);[m
[31m-  } else {  /* Otherwise fill the remainder with zero. */[m
[31m-    memset(dp + ofs, 0, sz - ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Initialize a sub-struct/union with TValues. */[m
[31m-static void cconv_substruct_init(CTState *cts, CType *d, uint8_t *dp,[m
[31m-				 TValue *o, MSize len, MSize *ip)[m
[31m-{[m
[31m-  CTypeID id = d->sib;[m
[31m-  while (id) {[m
[31m-    CType *df = ctype_get(cts, id);[m
[31m-    id = df->sib;[m
[31m-    if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) {[m
[31m-      MSize i = *ip;[m
[31m-      if (!gcref(df->name)) continue;  /* Ignore unnamed fields. */[m
[31m-      if (i >= len) break;[m
[31m-      *ip = i + 1;[m
[31m-      if (ctype_isfield(df->info))[m
[31m-	lj_cconv_ct_tv(cts, ctype_rawchild(cts, df), dp+df->size, o + i, 0);[m
[31m-      else[m
[31m-	lj_cconv_bf_tv(cts, df, dp+df->size, o + i);[m
[31m-      if ((d->info & CTF_UNION)) break;[m
[31m-    } else if (ctype_isxattrib(df->info, CTA_SUBTYPE)) {[m
[31m-      cconv_substruct_init(cts, ctype_rawchild(cts, df),[m
[31m-			   dp+df->size, o, len, ip);[m
[31m-      if ((d->info & CTF_UNION)) break;[m
[31m-    }  /* Ignore all other entries in the chain. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Initialize a struct/union with TValues. */[m
[31m-static void cconv_struct_init(CTState *cts, CType *d, CTSize sz, uint8_t *dp,[m
[31m-			      TValue *o, MSize len)[m
[31m-{[m
[31m-  MSize i = 0;[m
[31m-  memset(dp, 0, sz);  /* Much simpler to clear the struct first. */[m
[31m-  cconv_substruct_init(cts, d, dp, o, len, &i);[m
[31m-  if (i < len)[m
[31m-    cconv_err_initov(cts, d);[m
[31m-}[m
[31m-[m
[31m-/* Check whether to use a multi-value initializer.[m
[31m-** This is true if an aggregate is to be initialized with a value.[m
[31m-** Valarrays are treated as values here so ct_tv handles (V|C, I|F).[m
[31m-*/[m
[31m-int lj_cconv_multi_init(CTState *cts, CType *d, TValue *o)[m
[31m-{[m
[31m-  if (!(ctype_isrefarray(d->info) || ctype_isstruct(d->info)))[m
[31m-    return 0;  /* Destination is not an aggregate. */[m
[31m-  if (tvistab(o) || (tvisstr(o) && !ctype_isstruct(d->info)))[m
[31m-    return 0;  /* Initializer is not a value. */[m
[31m-  if (tviscdata(o) && lj_ctype_rawref(cts, cdataV(o)->ctypeid) == d)[m
[31m-    return 0;  /* Source and destination are identical aggregates. */[m
[31m-  return 1;  /* Otherwise the initializer is a value. */[m
[31m-}[m
[31m-[m
[31m-/* Initialize C type with TValues. Caveat: expects to get the raw CType! */[m
[31m-void lj_cconv_ct_init(CTState *cts, CType *d, CTSize sz,[m
[31m-		      uint8_t *dp, TValue *o, MSize len)[m
[31m-{[m
[31m-  if (len == 0)[m
[31m-    memset(dp, 0, sz);[m
[31m-  else if (len == 1 && !lj_cconv_multi_init(cts, d, o))[m
[31m-    lj_cconv_ct_tv(cts, d, dp, o, 0);[m
[31m-  else if (ctype_isarray(d->info))  /* Also handles valarray init with len>1. */[m
[31m-    cconv_array_init(cts, d, sz, dp, o, len);[m
[31m-  else if (ctype_isstruct(d->info))[m
[31m-    cconv_struct_init(cts, d, sz, dp, o, len);[m
[31m-  else[m
[31m-    cconv_err_initov(cts, d);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cconv.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cconv.h[m
[1mdeleted file mode 100644[m
[1mindex 35e72cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cconv.h[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-/*[m
[31m-** C type conversions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CCONV_H[m
[31m-#define _LJ_CCONV_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* Compressed C type index. ORDER CCX. */[m
[31m-enum {[m
[31m-  CCX_B,	/* Bool. */[m
[31m-  CCX_I,	/* Integer. */[m
[31m-  CCX_F,	/* Floating-point number. */[m
[31m-  CCX_C,	/* Complex. */[m
[31m-  CCX_V,	/* Vector. */[m
[31m-  CCX_P,	/* Pointer. */[m
[31m-  CCX_A,	/* Refarray. */[m
[31m-  CCX_S		/* Struct/union. */[m
[31m-};[m
[31m-[m
[31m-/* Convert C type info to compressed C type index. ORDER CT. ORDER CCX. */[m
[31m-static LJ_AINLINE uint32_t cconv_idx(CTInfo info)[m
[31m-{[m
[31m-  uint32_t idx = ((info >> 26) & 15u);  /* Dispatch bits. */[m
[31m-  lua_assert(ctype_type(info) <= CT_MAYCONVERT);[m
[31m-#if LJ_64[m
[31m-  idx = ((uint32_t)(U64x(f436fff5,fff7f021) >> 4*idx) & 15u);[m
[31m-#else[m
[31m-  idx = (((idx < 8 ? 0xfff7f021u : 0xf436fff5) >> 4*(idx & 7u)) & 15u);[m
[31m-#endif[m
[31m-  lua_assert(idx < 8);[m
[31m-  return idx;[m
[31m-}[m
[31m-[m
[31m-#define cconv_idx2(dinfo, sinfo) \[m
[31m-  ((cconv_idx((dinfo)) << 3) + cconv_idx((sinfo)))[m
[31m-[m
[31m-#define CCX(dst, src)		((CCX_##dst << 3) + CCX_##src)[m
[31m-[m
[31m-/* Conversion flags. */[m
[31m-#define CCF_CAST	0x00000001u[m
[31m-#define CCF_FROMTV	0x00000002u[m
[31m-#define CCF_SAME	0x00000004u[m
[31m-#define CCF_IGNQUAL	0x00000008u[m
[31m-[m
[31m-#define CCF_ARG_SHIFT	8[m
[31m-#define CCF_ARG(n)	((n) << CCF_ARG_SHIFT)[m
[31m-#define CCF_GETARG(f)	((f) >> CCF_ARG_SHIFT)[m
[31m-[m
[31m-LJ_FUNC int lj_cconv_compatptr(CTState *cts, CType *d, CType *s, CTInfo flags);[m
[31m-LJ_FUNC void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,[m
[31m-			    uint8_t *dp, uint8_t *sp, CTInfo flags);[m
[31m-LJ_FUNC int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,[m
[31m-			   TValue *o, uint8_t *sp);[m
[31m-LJ_FUNC int lj_cconv_tv_bf(CTState *cts, CType *s, TValue *o, uint8_t *sp);[m
[31m-LJ_FUNC void lj_cconv_ct_tv(CTState *cts, CType *d,[m
[31m-			    uint8_t *dp, TValue *o, CTInfo flags);[m
[31m-LJ_FUNC void lj_cconv_bf_tv(CTState *cts, CType *d, uint8_t *dp, TValue *o);[m
[31m-LJ_FUNC int lj_cconv_multi_init(CTState *cts, CType *d, TValue *o);[m
[31m-LJ_FUNC void lj_cconv_ct_init(CTState *cts, CType *d, CTSize sz,[m
[31m-			      uint8_t *dp, TValue *o, MSize len);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cdata.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cdata.c[m
[1mdeleted file mode 100644[m
[1mindex 05e27da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cdata.c[m
[1m+++ /dev/null[m
[36m@@ -1,297 +0,0 @@[m
[31m-/*[m
[31m-** C data management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_cdata.h"[m
[31m-[m
[31m-/* -- C data allocation --------------------------------------------------- */[m
[31m-[m
[31m-/* Allocate a new C data object holding a reference to another object. */[m
[31m-GCcdata *lj_cdata_newref(CTState *cts, const void *p, CTypeID id)[m
[31m-{[m
[31m-  CTypeID refid = lj_ctype_intern(cts, CTINFO_REF(id), CTSIZE_PTR);[m
[31m-  GCcdata *cd = lj_cdata_new(cts, refid, CTSIZE_PTR);[m
[31m-  *(const void **)cdataptr(cd) = p;[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-/* Allocate variable-sized or specially aligned C data object. */[m
[31m-GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, CTSize align)[m
[31m-{[m
[31m-  global_State *g;[m
[31m-  MSize extra = sizeof(GCcdataVar) + sizeof(GCcdata) +[m
[31m-		(align > CT_MEMALIGN ? (1u<<align) - (1u<<CT_MEMALIGN) : 0);[m
[31m-  char *p = lj_mem_newt(L, extra + sz, char);[m
[31m-  uintptr_t adata = (uintptr_t)p + sizeof(GCcdataVar) + sizeof(GCcdata);[m
[31m-  uintptr_t almask = (1u << align) - 1u;[m
[31m-  GCcdata *cd = (GCcdata *)(((adata + almask) & ~almask) - sizeof(GCcdata));[m
[31m-  lua_assert((char *)cd - p < 65536);[m
[31m-  cdatav(cd)->offset = (uint16_t)((char *)cd - p);[m
[31m-  cdatav(cd)->extra = extra;[m
[31m-  cdatav(cd)->len = sz;[m
[31m-  g = G(L);[m
[31m-  setgcrefr(cd->nextgc, g->gc.root);[m
[31m-  setgcref(g->gc.root, obj2gco(cd));[m
[31m-  newwhite(g, obj2gco(cd));[m
[31m-  cd->marked |= 0x80;[m
[31m-  cd->gct = ~LJ_TCDATA;[m
[31m-  cd->ctypeid = id;[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-/* Allocate arbitrary C data object. */[m
[31m-GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz, CTInfo info)[m
[31m-{[m
[31m-  if (!(info & CTF_VLA) && ctype_align(info) <= CT_MEMALIGN)[m
[31m-    return lj_cdata_new(cts, id, sz);[m
[31m-  else[m
[31m-    return lj_cdata_newv(cts->L, id, sz, ctype_align(info));[m
[31m-}[m
[31m-[m
[31m-/* Free a C data object. */[m
[31m-void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(cd->marked & LJ_GC_CDATA_FIN)) {[m
[31m-    GCobj *root;[m
[31m-    makewhite(g, obj2gco(cd));[m
[31m-    markfinalized(obj2gco(cd));[m
[31m-    if ((root = gcref(g->gc.mmudata)) != NULL) {[m
[31m-      setgcrefr(cd->nextgc, root->gch.nextgc);[m
[31m-      setgcref(root->gch.nextgc, obj2gco(cd));[m
[31m-      setgcref(g->gc.mmudata, obj2gco(cd));[m
[31m-    } else {[m
[31m-      setgcref(cd->nextgc, obj2gco(cd));[m
[31m-      setgcref(g->gc.mmudata, obj2gco(cd));[m
[31m-    }[m
[31m-  } else if (LJ_LIKELY(!cdataisv(cd))) {[m
[31m-    CType *ct = ctype_raw(ctype_ctsG(g), cd->ctypeid);[m
[31m-    CTSize sz = ctype_hassize(ct->info) ? ct->size : CTSIZE_PTR;[m
[31m-    lua_assert(ctype_hassize(ct->info) || ctype_isfunc(ct->info) ||[m
[31m-	       ctype_isextern(ct->info));[m
[31m-    lj_mem_free(g, cd, sizeof(GCcdata) + sz);[m
[31m-  } else {[m
[31m-    lj_mem_free(g, memcdatav(cd), sizecdatav(cd));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj, uint32_t it)[m
[31m-{[m
[31m-  GCtab *t = ctype_ctsG(G(L))->finalizer;[m
[31m-  if (gcref(t->metatable)) {[m
[31m-    /* Add cdata to finalizer table, if still enabled. */[m
[31m-    TValue *tv, tmp;[m
[31m-    setcdataV(L, &tmp, cd);[m
[31m-    lj_gc_anybarriert(L, t);[m
[31m-    tv = lj_tab_set(L, t, &tmp);[m
[31m-    setgcV(L, tv, obj, it);[m
[31m-    if (!tvisnil(tv))[m
[31m-      cd->marked |= LJ_GC_CDATA_FIN;[m
[31m-    else[m
[31m-      cd->marked &= ~LJ_GC_CDATA_FIN;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- C data indexing ----------------------------------------------------- */[m
[31m-[m
[31m-/* Index C data by a TValue. Return CType and pointer. */[m
[31m-CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key, uint8_t **pp,[m
[31m-		      CTInfo *qual)[m
[31m-{[m
[31m-  uint8_t *p = (uint8_t *)cdataptr(cd);[m
[31m-  CType *ct = ctype_get(cts, cd->ctypeid);[m
[31m-  ptrdiff_t idx;[m
[31m-[m
[31m-  /* Resolve reference for cdata object. */[m
[31m-  if (ctype_isref(ct->info)) {[m
[31m-    lua_assert(ct->size == CTSIZE_PTR);[m
[31m-    p = *(uint8_t **)p;[m
[31m-    ct = ctype_child(cts, ct);[m
[31m-  }[m
[31m-[m
[31m-collect_attrib:[m
[31m-  /* Skip attributes and collect qualifiers. */[m
[31m-  while (ctype_isattrib(ct->info)) {[m
[31m-    if (ctype_attrib(ct->info) == CTA_QUAL) *qual |= ct->size;[m
[31m-    ct = ctype_child(cts, ct);[m
[31m-  }[m
[31m-  lua_assert(!ctype_isref(ct->info));  /* Interning rejects refs to refs. */[m
[31m-[m
[31m-  if (tvisint(key)) {[m
[31m-    idx = (ptrdiff_t)intV(key);[m
[31m-    goto integer_key;[m
[31m-  } else if (tvisnum(key)) {  /* Numeric key. */[m
[31m-#ifdef _MSC_VER[m
[31m-    /* Workaround for MSVC bug. */[m
[31m-    volatile[m
[31m-#endif[m
[31m-    lua_Number n = numV(key);[m
[31m-    idx = LJ_64 ? (ptrdiff_t)n : (ptrdiff_t)lj_num2int(n);[m
[31m-  integer_key:[m
[31m-    if (ctype_ispointer(ct->info)) {[m
[31m-      CTSize sz = lj_ctype_size(cts, ctype_cid(ct->info));  /* Element size. */[m
[31m-      if (sz == CTSIZE_INVALID)[m
[31m-	lj_err_caller(cts->L, LJ_ERR_FFI_INVSIZE);[m
[31m-      if (ctype_isptr(ct->info)) {[m
[31m-	p = (uint8_t *)cdata_getptr(p, ct->size);[m
[31m-      } else if ((ct->info & (CTF_VECTOR|CTF_COMPLEX))) {[m
[31m-	if ((ct->info & CTF_COMPLEX)) idx &= 1;[m
[31m-	*qual |= CTF_CONST;  /* Valarray elements are constant. */[m
[31m-      }[m
[31m-      *pp = p + idx*(int32_t)sz;[m
[31m-      return ct;[m
[31m-    }[m
[31m-  } else if (tviscdata(key)) {  /* Integer cdata key. */[m
[31m-    GCcdata *cdk = cdataV(key);[m
[31m-    CType *ctk = ctype_raw(cts, cdk->ctypeid);[m
[31m-    if (ctype_isenum(ctk->info)) ctk = ctype_child(cts, ctk);[m
[31m-    if (ctype_isinteger(ctk->info)) {[m
[31m-      lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ctk,[m
[31m-		     (uint8_t *)&idx, cdataptr(cdk), 0);[m
[31m-      goto integer_key;[m
[31m-    }[m
[31m-  } else if (tvisstr(key)) {  /* String key. */[m
[31m-    GCstr *name = strV(key);[m
[31m-    if (ctype_isstruct(ct->info)) {[m
[31m-      CTSize ofs;[m
[31m-      CType *fct = lj_ctype_getfieldq(cts, ct, name, &ofs, qual);[m
[31m-      if (fct) {[m
[31m-	*pp = p + ofs;[m
[31m-	return fct;[m
[31m-      }[m
[31m-    } else if (ctype_iscomplex(ct->info)) {[m
[31m-      if (name->len == 2) {[m
[31m-	*qual |= CTF_CONST;  /* Complex fields are constant. */[m
[31m-	if (strdata(name)[0] == 'r' && strdata(name)[1] == 'e') {[m
[31m-	  *pp = p;[m
[31m-	  return ct;[m
[31m-	} else if (strdata(name)[0] == 'i' && strdata(name)[1] == 'm') {[m
[31m-	  *pp = p + (ct->size >> 1);[m
[31m-	  return ct;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (cd->ctypeid == CTID_CTYPEID) {[m
[31m-      /* Allow indexing a (pointer to) struct constructor to get constants. */[m
[31m-      CType *sct = ctype_raw(cts, *(CTypeID *)p);[m
[31m-      if (ctype_isptr(sct->info))[m
[31m-	sct = ctype_rawchild(cts, sct);[m
[31m-      if (ctype_isstruct(sct->info)) {[m
[31m-	CTSize ofs;[m
[31m-	CType *fct = lj_ctype_getfield(cts, sct, name, &ofs);[m
[31m-	if (fct && ctype_isconstval(fct->info))[m
[31m-	  return fct;[m
[31m-      }[m
[31m-      ct = sct;  /* Allow resolving metamethods for constructors, too. */[m
[31m-    }[m
[31m-  }[m
[31m-  if (ctype_isptr(ct->info)) {  /* Automatically perform '->'. */[m
[31m-    if (ctype_isstruct(ctype_rawchild(cts, ct)->info)) {[m
[31m-      p = (uint8_t *)cdata_getptr(p, ct->size);[m
[31m-      ct = ctype_child(cts, ct);[m
[31m-      goto collect_attrib;[m
[31m-    }[m
[31m-  }[m
[31m-  *qual |= 1;  /* Lookup failed. */[m
[31m-  return ct;  /* But return the resolved raw type. */[m
[31m-}[m
[31m-[m
[31m-/* -- C data getters ------------------------------------------------------ */[m
[31m-[m
[31m-/* Get constant value and convert to TValue. */[m
[31m-static void cdata_getconst(CTState *cts, TValue *o, CType *ct)[m
[31m-{[m
[31m-  CType *ctt = ctype_child(cts, ct);[m
[31m-  lua_assert(ctype_isinteger(ctt->info) && ctt->size <= 4);[m
[31m-  /* Constants are already zero-extended/sign-extended to 32 bits. */[m
[31m-  if ((ctt->info & CTF_UNSIGNED) && (int32_t)ct->size < 0)[m
[31m-    setnumV(o, (lua_Number)(uint32_t)ct->size);[m
[31m-  else[m
[31m-    setintV(o, (int32_t)ct->size);[m
[31m-}[m
[31m-[m
[31m-/* Get C data value and convert to TValue. */[m
[31m-int lj_cdata_get(CTState *cts, CType *s, TValue *o, uint8_t *sp)[m
[31m-{[m
[31m-  CTypeID sid;[m
[31m-[m
[31m-  if (ctype_isconstval(s->info)) {[m
[31m-    cdata_getconst(cts, o, s);[m
[31m-    return 0;  /* No GC step needed. */[m
[31m-  } else if (ctype_isbitfield(s->info)) {[m
[31m-    return lj_cconv_tv_bf(cts, s, o, sp);[m
[31m-  }[m
[31m-[m
[31m-  /* Get child type of pointer/array/field. */[m
[31m-  lua_assert(ctype_ispointer(s->info) || ctype_isfield(s->info));[m
[31m-  sid = ctype_cid(s->info);[m
[31m-  s = ctype_get(cts, sid);[m
[31m-[m
[31m-  /* Resolve reference for field. */[m
[31m-  if (ctype_isref(s->info)) {[m
[31m-    lua_assert(s->size == CTSIZE_PTR);[m
[31m-    sp = *(uint8_t **)sp;[m
[31m-    sid = ctype_cid(s->info);[m
[31m-    s = ctype_get(cts, sid);[m
[31m-  }[m
[31m-[m
[31m-  /* Skip attributes. */[m
[31m-  while (ctype_isattrib(s->info))[m
[31m-    s = ctype_child(cts, s);[m
[31m-[m
[31m-  return lj_cconv_tv_ct(cts, s, sid, o, sp);[m
[31m-}[m
[31m-[m
[31m-/* -- C data setters ------------------------------------------------------ */[m
[31m-[m
[31m-/* Convert TValue and set C data value. */[m
[31m-void lj_cdata_set(CTState *cts, CType *d, uint8_t *dp, TValue *o, CTInfo qual)[m
[31m-{[m
[31m-  if (ctype_isconstval(d->info)) {[m
[31m-    goto err_const;[m
[31m-  } else if (ctype_isbitfield(d->info)) {[m
[31m-    if (((d->info|qual) & CTF_CONST)) goto err_const;[m
[31m-    lj_cconv_bf_tv(cts, d, dp, o);[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Get child type of pointer/array/field. */[m
[31m-  lua_assert(ctype_ispointer(d->info) || ctype_isfield(d->info));[m
[31m-  d = ctype_child(cts, d);[m
[31m-[m
[31m-  /* Resolve reference for field. */[m
[31m-  if (ctype_isref(d->info)) {[m
[31m-    lua_assert(d->size == CTSIZE_PTR);[m
[31m-    dp = *(uint8_t **)dp;[m
[31m-    d = ctype_child(cts, d);[m
[31m-  }[m
[31m-[m
[31m-  /* Skip attributes and collect qualifiers. */[m
[31m-  for (;;) {[m
[31m-    if (ctype_isattrib(d->info)) {[m
[31m-      if (ctype_attrib(d->info) == CTA_QUAL) qual |= d->size;[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-    d = ctype_child(cts, d);[m
[31m-  }[m
[31m-[m
[31m-  lua_assert(ctype_hassize(d->info) && !ctype_isvoid(d->info));[m
[31m-[m
[31m-  if (((d->info|qual) & CTF_CONST)) {[m
[31m-  err_const:[m
[31m-    lj_err_caller(cts->L, LJ_ERR_FFI_WRCONST);[m
[31m-  }[m
[31m-[m
[31m-  lj_cconv_ct_tv(cts, d, dp, o, 0);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cdata.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cdata.h[m
[1mdeleted file mode 100644[m
[1mindex ee5b740..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cdata.h[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-/*[m
[31m-** C data management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CDATA_H[m
[31m-#define _LJ_CDATA_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* Get C data pointer. */[m
[31m-static LJ_AINLINE void *cdata_getptr(void *p, CTSize sz)[m
[31m-{[m
[31m-  if (LJ_64 && sz == 4) {  /* Support 32 bit pointers on 64 bit targets. */[m
[31m-    return ((void *)(uintptr_t)*(uint32_t *)p);[m
[31m-  } else {[m
[31m-    lua_assert(sz == CTSIZE_PTR);[m
[31m-    return *(void **)p;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Set C data pointer. */[m
[31m-static LJ_AINLINE void cdata_setptr(void *p, CTSize sz, const void *v)[m
[31m-{[m
[31m-  if (LJ_64 && sz == 4) {  /* Support 32 bit pointers on 64 bit targets. */[m
[31m-    *(uint32_t *)p = (uint32_t)(uintptr_t)v;[m
[31m-  } else {[m
[31m-    lua_assert(sz == CTSIZE_PTR);[m
[31m-    *(void **)p = (void *)v;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocate fixed-size C data object. */[m
[31m-static LJ_AINLINE GCcdata *lj_cdata_new(CTState *cts, CTypeID id, CTSize sz)[m
[31m-{[m
[31m-  GCcdata *cd;[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  CType *ct = ctype_raw(cts, id);[m
[31m-  lua_assert((ctype_hassize(ct->info) ? ct->size : CTSIZE_PTR) == sz);[m
[31m-#endif[m
[31m-  cd = (GCcdata *)lj_mem_newgco(cts->L, sizeof(GCcdata) + sz);[m
[31m-  cd->gct = ~LJ_TCDATA;[m
[31m-  cd->ctypeid = ctype_check(cts, id);[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-/* Variant which works without a valid CTState. */[m
[31m-static LJ_AINLINE GCcdata *lj_cdata_new_(lua_State *L, CTypeID id, CTSize sz)[m
[31m-{[m
[31m-  GCcdata *cd = (GCcdata *)lj_mem_newgco(L, sizeof(GCcdata) + sz);[m
[31m-  cd->gct = ~LJ_TCDATA;[m
[31m-  cd->ctypeid = id;[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id);[m
[31m-LJ_FUNC GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz,[m
[31m-			       CTSize align);[m
[31m-LJ_FUNC GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz,[m
[31m-			       CTInfo info);[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd);[m
[31m-LJ_FUNC void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj,[m
[31m-			     uint32_t it);[m
[31m-[m
[31m-LJ_FUNC CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key,[m
[31m-			      uint8_t **pp, CTInfo *qual);[m
[31m-LJ_FUNC int lj_cdata_get(CTState *cts, CType *s, TValue *o, uint8_t *sp);[m
[31m-LJ_FUNC void lj_cdata_set(CTState *cts, CType *d, uint8_t *dp, TValue *o,[m
[31m-			  CTInfo qual);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_char.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_char.c[m
[1mdeleted file mode 100644[m
[1mindex 11f23ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_char.c[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/*[m
[31m-** Character types.[m
[31m-** Donated to the public domain.[m
[31m-**[m
[31m-** This is intended to replace the problematic libc single-byte NLS functions.[m
[31m-** These just don't make sense anymore with UTF-8 locales becoming the norm[m
[31m-** on POSIX systems. It never worked too well on Windows systems since hardly[m
[31m-** anyone bothered to call setlocale().[m
[31m-**[m
[31m-** This table is hardcoded for ASCII. Identifiers include the characters[m
[31m-** 128-255, too. This allows for the use of all non-ASCII chars as identifiers[m
[31m-** in the lexer. This is a broad definition, but works well in practice[m
[31m-** for both UTF-8 locales and most single-byte locales (such as ISO-8859-*).[m
[31m-**[m
[31m-** If you really need proper character types for UTF-8 strings, please use[m
[31m-** an add-on library such as slnunicode: http://luaforge.net/projects/sln/[m
[31m-*/[m
[31m-[m
[31m-#define lj_char_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_char.h"[m
[31m-[m
[31m-LJ_DATADEF const uint8_t lj_char_bits[257] = {[m
[31m-    0,[m
[31m-    1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  3,  3,  3,  3,  1,  1,[m
[31m-    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,[m
[31m-    2,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,[m
[31m-  152,152,152,152,152,152,152,152,152,152,  4,  4,  4,  4,  4,  4,[m
[31m-    4,176,176,176,176,176,176,160,160,160,160,160,160,160,160,160,[m
[31m-  160,160,160,160,160,160,160,160,160,160,160,  4,  4,  4,  4,132,[m
[31m-    4,208,208,208,208,208,208,192,192,192,192,192,192,192,192,192,[m
[31m-  192,192,192,192,192,192,192,192,192,192,192,  4,  4,  4,  4,  1,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,[m
[31m-  128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128[m
[31m-};[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_char.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_char.h[m
[1mdeleted file mode 100644[m
[1mindex c3c86d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_char.h[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-/*[m
[31m-** Character types.[m
[31m-** Donated to the public domain.[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CHAR_H[m
[31m-#define _LJ_CHAR_H[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-[m
[31m-#define LJ_CHAR_CNTRL	0x01[m
[31m-#define LJ_CHAR_SPACE	0x02[m
[31m-#define LJ_CHAR_PUNCT	0x04[m
[31m-#define LJ_CHAR_DIGIT	0x08[m
[31m-#define LJ_CHAR_XDIGIT	0x10[m
[31m-#define LJ_CHAR_UPPER	0x20[m
[31m-#define LJ_CHAR_LOWER	0x40[m
[31m-#define LJ_CHAR_IDENT	0x80[m
[31m-#define LJ_CHAR_ALPHA	(LJ_CHAR_LOWER|LJ_CHAR_UPPER)[m
[31m-#define LJ_CHAR_ALNUM	(LJ_CHAR_ALPHA|LJ_CHAR_DIGIT)[m
[31m-#define LJ_CHAR_GRAPH	(LJ_CHAR_ALNUM|LJ_CHAR_PUNCT)[m
[31m-[m
[31m-/* Only pass -1 or 0..255 to these macros. Never pass a signed char! */[m
[31m-#define lj_char_isa(c, t)	((lj_char_bits+1)[(c)] & t)[m
[31m-#define lj_char_iscntrl(c)	lj_char_isa((c), LJ_CHAR_CNTRL)[m
[31m-#define lj_char_isspace(c)	lj_char_isa((c), LJ_CHAR_SPACE)[m
[31m-#define lj_char_ispunct(c)	lj_char_isa((c), LJ_CHAR_PUNCT)[m
[31m-#define lj_char_isdigit(c)	lj_char_isa((c), LJ_CHAR_DIGIT)[m
[31m-#define lj_char_isxdigit(c)	lj_char_isa((c), LJ_CHAR_XDIGIT)[m
[31m-#define lj_char_isupper(c)	lj_char_isa((c), LJ_CHAR_UPPER)[m
[31m-#define lj_char_islower(c)	lj_char_isa((c), LJ_CHAR_LOWER)[m
[31m-#define lj_char_isident(c)	lj_char_isa((c), LJ_CHAR_IDENT)[m
[31m-#define lj_char_isalpha(c)	lj_char_isa((c), LJ_CHAR_ALPHA)[m
[31m-#define lj_char_isalnum(c)	lj_char_isa((c), LJ_CHAR_ALNUM)[m
[31m-#define lj_char_isgraph(c)	lj_char_isa((c), LJ_CHAR_GRAPH)[m
[31m-[m
[31m-#define lj_char_toupper(c)	((c) - (lj_char_islower(c) >> 1))[m
[31m-#define lj_char_tolower(c)	((c) + lj_char_isupper(c))[m
[31m-[m
[31m-LJ_DATA const uint8_t lj_char_bits[257];[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_clib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_clib.c[m
[1mdeleted file mode 100644[m
[1mindex 8398e80..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_clib.c[m
[1m+++ /dev/null[m
[36m@@ -1,418 +0,0 @@[m
[31m-/*[m
[31m-** FFI C library loader.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_udata.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_clib.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- OS-specific functions ----------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_DLOPEN[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#if defined(RTLD_DEFAULT)[m
[31m-#define CLIB_DEFHANDLE	RTLD_DEFAULT[m
[31m-#elif LJ_TARGET_OSX || LJ_TARGET_BSD[m
[31m-#define CLIB_DEFHANDLE	((void *)(intptr_t)-2)[m
[31m-#else[m
[31m-#define CLIB_DEFHANDLE	NULL[m
[31m-#endif[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void clib_error_(lua_State *L)[m
[31m-{[m
[31m-  lj_err_callermsg(L, dlerror());[m
[31m-}[m
[31m-[m
[31m-#define clib_error(L, fmt, name)	clib_error_(L)[m
[31m-[m
[31m-#if LJ_TARGET_CYGWIN[m
[31m-#define CLIB_SOPREFIX	"cyg"[m
[31m-#else[m
[31m-#define CLIB_SOPREFIX	"lib"[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_OSX[m
[31m-#define CLIB_SOEXT	"%s.dylib"[m
[31m-#elif LJ_TARGET_CYGWIN[m
[31m-#define CLIB_SOEXT	"%s.dll"[m
[31m-#else[m
[31m-#define CLIB_SOEXT	"%s.so"[m
[31m-#endif[m
[31m-[m
[31m-static const char *clib_extname(lua_State *L, const char *name)[m
[31m-{[m
[31m-  if (!strchr(name, '/')[m
[31m-#if LJ_TARGET_CYGWIN[m
[31m-      && !strchr(name, '\\')[m
[31m-#endif[m
[31m-     ) {[m
[31m-    if (!strchr(name, '.')) {[m
[31m-      name = lj_strfmt_pushf(L, CLIB_SOEXT, name);[m
[31m-      L->top--;[m
[31m-#if LJ_TARGET_CYGWIN[m
[31m-    } else {[m
[31m-      return name;[m
[31m-#endif[m
[31m-    }[m
[31m-    if (!(name[0] == CLIB_SOPREFIX[0] && name[1] == CLIB_SOPREFIX[1] &&[m
[31m-	  name[2] == CLIB_SOPREFIX[2])) {[m
[31m-      name = lj_strfmt_pushf(L, CLIB_SOPREFIX "%s", name);[m
[31m-      L->top--;[m
[31m-    }[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-/* Check for a recognized ld script line. */[m
[31m-static const char *clib_check_lds(lua_State *L, const char *buf)[m
[31m-{[m
[31m-  char *p, *e;[m
[31m-  if ((!strncmp(buf, "GROUP", 5) || !strncmp(buf, "INPUT", 5)) &&[m
[31m-      (p = strchr(buf, '('))) {[m
[31m-    while (*++p == ' ') ;[m
[31m-    for (e = p; *e && *e != ' ' && *e != ')'; e++) ;[m
[31m-    return strdata(lj_str_new(L, p, e-p));[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Quick and dirty solution to resolve shared library name from ld script. */[m
[31m-static const char *clib_resolve_lds(lua_State *L, const char *name)[m
[31m-{[m
[31m-  FILE *fp = fopen(name, "r");[m
[31m-  const char *p = NULL;[m
[31m-  if (fp) {[m
[31m-    char buf[256];[m
[31m-    if (fgets(buf, sizeof(buf), fp)) {[m
[31m-      if (!strncmp(buf, "/* GNU ld script", 16)) {  /* ld script magic? */[m
[31m-	while (fgets(buf, sizeof(buf), fp)) {  /* Check all lines. */[m
[31m-	  p = clib_check_lds(L, buf);[m
[31m-	  if (p) break;[m
[31m-	}[m
[31m-      } else {  /* Otherwise check only the first line. */[m
[31m-	p = clib_check_lds(L, buf);[m
[31m-      }[m
[31m-    }[m
[31m-    fclose(fp);[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-static void *clib_loadlib(lua_State *L, const char *name, int global)[m
[31m-{[m
[31m-  void *h = dlopen(clib_extname(L, name),[m
[31m-		   RTLD_LAZY | (global?RTLD_GLOBAL:RTLD_LOCAL));[m
[31m-  if (!h) {[m
[31m-    const char *e, *err = dlerror();[m
[31m-    if (*err == '/' && (e = strchr(err, ':')) &&[m
[31m-	(name = clib_resolve_lds(L, strdata(lj_str_new(L, err, e-err))))) {[m
[31m-      h = dlopen(name, RTLD_LAZY | (global?RTLD_GLOBAL:RTLD_LOCAL));[m
[31m-      if (h) return h;[m
[31m-      err = dlerror();[m
[31m-    }[m
[31m-    lj_err_callermsg(L, err);[m
[31m-  }[m
[31m-  return h;[m
[31m-}[m
[31m-[m
[31m-static void clib_unloadlib(CLibrary *cl)[m
[31m-{[m
[31m-  if (cl->handle && cl->handle != CLIB_DEFHANDLE)[m
[31m-    dlclose(cl->handle);[m
[31m-}[m
[31m-[m
[31m-static void *clib_getsym(CLibrary *cl, const char *name)[m
[31m-{[m
[31m-  void *p = dlsym(cl->handle, name);[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-#elif LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS[m
[31m-#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS	4[m
[31m-#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT	2[m
[31m-BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*);[m
[31m-#endif[m
[31m-[m
[31m-#define CLIB_DEFHANDLE	((void *)-1)[m
[31m-[m
[31m-/* Default libraries. */[m
[31m-enum {[m
[31m-  CLIB_HANDLE_EXE,[m
[31m-  CLIB_HANDLE_DLL,[m
[31m-  CLIB_HANDLE_CRT,[m
[31m-  CLIB_HANDLE_KERNEL32,[m
[31m-  CLIB_HANDLE_USER32,[m
[31m-  CLIB_HANDLE_GDI32,[m
[31m-  CLIB_HANDLE_MAX[m
[31m-};[m
[31m-[m
[31m-static void *clib_def_handle[CLIB_HANDLE_MAX];[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt,[m
[31m-					    const char *name)[m
[31m-{[m
[31m-  DWORD err = GetLastError();[m
[31m-#if LJ_TARGET_XBOXONE[m
[31m-  wchar_t wbuf[128];[m
[31m-  char buf[128*2];[m
[31m-  if (!FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-		      NULL, err, 0, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL) ||[m
[31m-      !WideCharToMultiByte(CP_ACP, 0, wbuf, 128, buf, 128*2, NULL, NULL))[m
[31m-#else[m
[31m-  char buf[128];[m
[31m-  if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-		      NULL, err, 0, buf, sizeof(buf), NULL))[m
[31m-#endif[m
[31m-    buf[0] = '\0';[m
[31m-  lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, buf));[m
[31m-}[m
[31m-[m
[31m-static int clib_needext(const char *s)[m
[31m-{[m
[31m-  while (*s) {[m
[31m-    if (*s == '/' || *s == '\\' || *s == '.') return 0;[m
[31m-    s++;[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static const char *clib_extname(lua_State *L, const char *name)[m
[31m-{[m
[31m-  if (clib_needext(name)) {[m
[31m-    name = lj_strfmt_pushf(L, "%s.dll", name);[m
[31m-    L->top--;[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-static void *clib_loadlib(lua_State *L, const char *name, int global)[m
[31m-{[m
[31m-  DWORD oldwerr = GetLastError();[m
[31m-  void *h = (void *)LoadLibraryExA(clib_extname(L, name), NULL, 0);[m
[31m-  if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name);[m
[31m-  SetLastError(oldwerr);[m
[31m-  UNUSED(global);[m
[31m-  return h;[m
[31m-}[m
[31m-[m
[31m-static void clib_unloadlib(CLibrary *cl)[m
[31m-{[m
[31m-  if (cl->handle == CLIB_DEFHANDLE) {[m
[31m-    MSize i;[m
[31m-    for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) {[m
[31m-      void *h = clib_def_handle[i];[m
[31m-      if (h) {[m
[31m-	clib_def_handle[i] = NULL;[m
[31m-	FreeLibrary((HINSTANCE)h);[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (cl->handle) {[m
[31m-    FreeLibrary((HINSTANCE)cl->handle);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void *clib_getsym(CLibrary *cl, const char *name)[m
[31m-{[m
[31m-  void *p = NULL;[m
[31m-  if (cl->handle == CLIB_DEFHANDLE) {  /* Search default libraries. */[m
[31m-    MSize i;[m
[31m-    for (i = 0; i < CLIB_HANDLE_MAX; i++) {[m
[31m-      HINSTANCE h = (HINSTANCE)clib_def_handle[i];[m
[31m-      if (!(void *)h) {  /* Resolve default library handles (once). */[m
[31m-	switch (i) {[m
[31m-	case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break;[m
[31m-	case CLIB_HANDLE_DLL:[m
[31m-	  GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,[m
[31m-			     (const char *)clib_def_handle, &h);[m
[31m-	  break;[m
[31m-	case CLIB_HANDLE_CRT:[m
[31m-	  GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,[m
[31m-			     (const char *)&_fmode, &h);[m
[31m-	  break;[m
[31m-	case CLIB_HANDLE_KERNEL32: h = LoadLibraryExA("kernel32.dll", NULL, 0); break;[m
[31m-	case CLIB_HANDLE_USER32: h = LoadLibraryExA("user32.dll", NULL, 0); break;[m
[31m-	case CLIB_HANDLE_GDI32: h = LoadLibraryExA("gdi32.dll", NULL, 0); break;[m
[31m-	}[m
[31m-	if (!h) continue;[m
[31m-	clib_def_handle[i] = (void *)h;[m
[31m-      }[m
[31m-      p = (void *)GetProcAddress(h, name);[m
[31m-      if (p) break;[m
[31m-    }[m
[31m-  } else {[m
[31m-    p = (void *)GetProcAddress((HINSTANCE)cl->handle, name);[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define CLIB_DEFHANDLE	NULL[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt,[m
[31m-					    const char *name)[m
[31m-{[m
[31m-  lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, "no support for this OS"));[m
[31m-}[m
[31m-[m
[31m-static void *clib_loadlib(lua_State *L, const char *name, int global)[m
[31m-{[m
[31m-  lj_err_callermsg(L, "no support for loading dynamic libraries for this OS");[m
[31m-  UNUSED(name); UNUSED(global);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static void clib_unloadlib(CLibrary *cl)[m
[31m-{[m
[31m-  UNUSED(cl);[m
[31m-}[m
[31m-[m
[31m-static void *clib_getsym(CLibrary *cl, const char *name)[m
[31m-{[m
[31m-  UNUSED(cl); UNUSED(name);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- C library indexing -------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86 && LJ_ABI_WIN[m
[31m-/* Compute argument size for fastcall/stdcall functions. */[m
[31m-static CTSize clib_func_argsize(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTSize n = 0;[m
[31m-  while (ct->sib) {[m
[31m-    CType *d;[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isfield(ct->info)) {[m
[31m-      d = ctype_rawchild(cts, ct);[m
[31m-      n += ((d->size + 3) & ~3);[m
[31m-    }[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Get redirected or mangled external symbol. */[m
[31m-static const char *clib_extsym(CTState *cts, CType *ct, GCstr *name)[m
[31m-{[m
[31m-  if (ct->sib) {[m
[31m-    CType *ctf = ctype_get(cts, ct->sib);[m
[31m-    if (ctype_isxattrib(ctf->info, CTA_REDIR))[m
[31m-      return strdata(gco2str(gcref(ctf->name)));[m
[31m-  }[m
[31m-  return strdata(name);[m
[31m-}[m
[31m-[m
[31m-/* Index a C library by name. */[m
[31m-TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)[m
[31m-{[m
[31m-  TValue *tv = lj_tab_setstr(L, cl->cache, name);[m
[31m-  if (LJ_UNLIKELY(tvisnil(tv))) {[m
[31m-    CTState *cts = ctype_cts(L);[m
[31m-    CType *ct;[m
[31m-    CTypeID id = lj_ctype_getname(cts, &ct, name, CLNS_INDEX);[m
[31m-    if (!id)[m
[31m-      lj_err_callerv(L, LJ_ERR_FFI_NODECL, strdata(name));[m
[31m-    if (ctype_isconstval(ct->info)) {[m
[31m-      CType *ctt = ctype_child(cts, ct);[m
[31m-      lua_assert(ctype_isinteger(ctt->info) && ctt->size <= 4);[m
[31m-      if ((ctt->info & CTF_UNSIGNED) && (int32_t)ct->size < 0)[m
[31m-	setnumV(tv, (lua_Number)(uint32_t)ct->size);[m
[31m-      else[m
[31m-	setintV(tv, (int32_t)ct->size);[m
[31m-    } else {[m
[31m-      const char *sym = clib_extsym(cts, ct, name);[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-      DWORD oldwerr = GetLastError();[m
[31m-#endif[m
[31m-      void *p = clib_getsym(cl, sym);[m
[31m-      GCcdata *cd;[m
[31m-      lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info));[m
[31m-#if LJ_TARGET_X86 && LJ_ABI_WIN[m
[31m-      /* Retry with decorated name for fastcall/stdcall functions. */[m
[31m-      if (!p && ctype_isfunc(ct->info)) {[m
[31m-	CTInfo cconv = ctype_cconv(ct->info);[m
[31m-	if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) {[m
[31m-	  CTSize sz = clib_func_argsize(cts, ct);[m
[31m-	  const char *symd = lj_strfmt_pushf(L,[m
[31m-			       cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d",[m
[31m-			       sym, sz);[m
[31m-	  L->top--;[m
[31m-	  p = clib_getsym(cl, symd);[m
[31m-	}[m
[31m-      }[m
[31m-#endif[m
[31m-      if (!p)[m
[31m-	clib_error(L, "cannot resolve symbol " LUA_QS ": %s", sym);[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-      SetLastError(oldwerr);[m
[31m-#endif[m
[31m-      cd = lj_cdata_new(cts, id, CTSIZE_PTR);[m
[31m-      *(void **)cdataptr(cd) = p;[m
[31m-      setcdataV(L, tv, cd);[m
[31m-    }[m
[31m-  }[m
[31m-  return tv;[m
[31m-}[m
[31m-[m
[31m-/* -- C library management ------------------------------------------------ */[m
[31m-[m
[31m-/* Create a new CLibrary object and push it on the stack. */[m
[31m-static CLibrary *clib_new(lua_State *L, GCtab *mt)[m
[31m-{[m
[31m-  GCtab *t = lj_tab_new(L, 0, 0);[m
[31m-  GCudata *ud = lj_udata_new(L, sizeof(CLibrary), t);[m
[31m-  CLibrary *cl = (CLibrary *)uddata(ud);[m
[31m-  cl->cache = t;[m
[31m-  ud->udtype = UDTYPE_FFI_CLIB;[m
[31m-  /* NOBARRIER: The GCudata is new (marked white). */[m
[31m-  setgcref(ud->metatable, obj2gco(mt));[m
[31m-  setudataV(L, L->top++, ud);[m
[31m-  return cl;[m
[31m-}[m
[31m-[m
[31m-/* Load a C library. */[m
[31m-void lj_clib_load(lua_State *L, GCtab *mt, GCstr *name, int global)[m
[31m-{[m
[31m-  void *handle = clib_loadlib(L, strdata(name), global);[m
[31m-  CLibrary *cl = clib_new(L, mt);[m
[31m-  cl->handle = handle;[m
[31m-}[m
[31m-[m
[31m-/* Unload a C library. */[m
[31m-void lj_clib_unload(CLibrary *cl)[m
[31m-{[m
[31m-  clib_unloadlib(cl);[m
[31m-  cl->handle = NULL;[m
[31m-}[m
[31m-[m
[31m-/* Create the default C library object. */[m
[31m-void lj_clib_default(lua_State *L, GCtab *mt)[m
[31m-{[m
[31m-  CLibrary *cl = clib_new(L, mt);[m
[31m-  cl->handle = CLIB_DEFHANDLE;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_clib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_clib.h[m
[1mdeleted file mode 100644[m
[1mindex ce3ab85..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_clib.h[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-/*[m
[31m-** FFI C library loader.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CLIB_H[m
[31m-#define _LJ_CLIB_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* Namespace for C library indexing. */[m
[31m-#define CLNS_INDEX	((1u<<CT_FUNC)|(1u<<CT_EXTERN)|(1u<<CT_CONSTVAL))[m
[31m-[m
[31m-/* C library namespace. */[m
[31m-typedef struct CLibrary {[m
[31m-  void *handle;		/* Opaque handle for dynamic library loader. */[m
[31m-  GCtab *cache;		/* Cache for resolved symbols. Anchored in ud->env. */[m
[31m-} CLibrary;[m
[31m-[m
[31m-LJ_FUNC TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name);[m
[31m-LJ_FUNC void lj_clib_load(lua_State *L, GCtab *mt, GCstr *name, int global);[m
[31m-LJ_FUNC void lj_clib_unload(CLibrary *cl);[m
[31m-LJ_FUNC void lj_clib_default(lua_State *L, GCtab *mt);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cparse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cparse.c[m
[1mdeleted file mode 100644[m
[1mindex 16d2cb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cparse.c[m
[1m+++ /dev/null[m
[36m@@ -1,1888 +0,0 @@[m
[31m-/*[m
[31m-** C declaration parser.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cparse.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/*[m
[31m-** Important note: this is NOT a validating C parser! This is a minimal[m
[31m-** C declaration parser, solely for use by the LuaJIT FFI.[m
[31m-**[m
[31m-** It ought to return correct results for properly formed C declarations,[m
[31m-** but it may accept some invalid declarations, too (and return nonsense).[m
[31m-** Also, it shows rather generic error messages to avoid unnecessary bloat.[m
[31m-** If in doubt, please check the input against your favorite C compiler.[m
[31m-*/[m
[31m-[m
[31m-/* -- C lexer ------------------------------------------------------------- */[m
[31m-[m
[31m-/* C lexer token names. */[m
[31m-static const char *const ctoknames[] = {[m
[31m-#define CTOKSTR(name, str)	str,[m
[31m-CTOKDEF(CTOKSTR)[m
[31m-#undef CTOKSTR[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-LJ_NORET static void cp_err(CPState *cp, ErrMsg em);[m
[31m-[m
[31m-static const char *cp_tok2str(CPState *cp, CPToken tok)[m
[31m-{[m
[31m-  lua_assert(tok < CTOK_FIRSTDECL);[m
[31m-  if (tok > CTOK_OFS)[m
[31m-    return ctoknames[tok-CTOK_OFS-1];[m
[31m-  else if (!lj_char_iscntrl(tok))[m
[31m-    return lj_strfmt_pushf(cp->L, "%c", tok);[m
[31m-  else[m
[31m-    return lj_strfmt_pushf(cp->L, "char(%d)", tok);[m
[31m-}[m
[31m-[m
[31m-/* End-of-line? */[m
[31m-static LJ_AINLINE int cp_iseol(CPChar c)[m
[31m-{[m
[31m-  return (c == '\n' || c == '\r');[m
[31m-}[m
[31m-[m
[31m-/* Peek next raw character. */[m
[31m-static LJ_AINLINE CPChar cp_rawpeek(CPState *cp)[m
[31m-{[m
[31m-  return (CPChar)(uint8_t)(*cp->p);[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE CPChar cp_get_bs(CPState *cp);[m
[31m-[m
[31m-/* Get next character. */[m
[31m-static LJ_AINLINE CPChar cp_get(CPState *cp)[m
[31m-{[m
[31m-  cp->c = (CPChar)(uint8_t)(*cp->p++);[m
[31m-  if (LJ_LIKELY(cp->c != '\\')) return cp->c;[m
[31m-  return cp_get_bs(cp);[m
[31m-}[m
[31m-[m
[31m-/* Transparently skip backslash-escaped line breaks. */[m
[31m-static LJ_NOINLINE CPChar cp_get_bs(CPState *cp)[m
[31m-{[m
[31m-  CPChar c2, c = cp_rawpeek(cp);[m
[31m-  if (!cp_iseol(c)) return cp->c;[m
[31m-  cp->p++;[m
[31m-  c2 = cp_rawpeek(cp);[m
[31m-  if (cp_iseol(c2) && c2 != c) cp->p++;[m
[31m-  cp->linenumber++;[m
[31m-  return cp_get(cp);[m
[31m-}[m
[31m-[m
[31m-/* Save character in buffer. */[m
[31m-static LJ_AINLINE void cp_save(CPState *cp, CPChar c)[m
[31m-{[m
[31m-  lj_buf_putb(&cp->sb, c);[m
[31m-}[m
[31m-[m
[31m-/* Skip line break. Handles "\n", "\r", "\r\n" or "\n\r". */[m
[31m-static void cp_newline(CPState *cp)[m
[31m-{[m
[31m-  CPChar c = cp_rawpeek(cp);[m
[31m-  if (cp_iseol(c) && c != cp->c) cp->p++;[m
[31m-  cp->linenumber++;[m
[31m-}[m
[31m-[m
[31m-LJ_NORET static void cp_errmsg(CPState *cp, CPToken tok, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *msg, *tokstr;[m
[31m-  lua_State *L;[m
[31m-  va_list argp;[m
[31m-  if (tok == 0) {[m
[31m-    tokstr = NULL;[m
[31m-  } else if (tok == CTOK_IDENT || tok == CTOK_INTEGER || tok == CTOK_STRING ||[m
[31m-	     tok >= CTOK_FIRSTDECL) {[m
[31m-    if (sbufP(&cp->sb) == sbufB(&cp->sb)) cp_save(cp, '$');[m
[31m-    cp_save(cp, '\0');[m
[31m-    tokstr = sbufB(&cp->sb);[m
[31m-  } else {[m
[31m-    tokstr = cp_tok2str(cp, tok);[m
[31m-  }[m
[31m-  L = cp->L;[m
[31m-  va_start(argp, em);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  va_end(argp);[m
[31m-  if (tokstr)[m
[31m-    msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tokstr);[m
[31m-  if (cp->linenumber > 1)[m
[31m-    msg = lj_strfmt_pushf(L, "%s at line %d", msg, cp->linenumber);[m
[31m-  lj_err_callermsg(L, msg);[m
[31m-}[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void cp_err_token(CPState *cp, CPToken tok)[m
[31m-{[m
[31m-  cp_errmsg(cp, cp->tok, LJ_ERR_XTOKEN, cp_tok2str(cp, tok));[m
[31m-}[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void cp_err_badidx(CPState *cp, CType *ct)[m
[31m-{[m
[31m-  GCstr *s = lj_ctype_repr(cp->cts->L, ctype_typeid(cp->cts, ct), NULL);[m
[31m-  cp_errmsg(cp, 0, LJ_ERR_FFI_BADIDX, strdata(s));[m
[31m-}[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void cp_err(CPState *cp, ErrMsg em)[m
[31m-{[m
[31m-  cp_errmsg(cp, 0, em);[m
[31m-}[m
[31m-[m
[31m-/* -- Main lexical scanner ------------------------------------------------ */[m
[31m-[m
[31m-/* Parse number literal. Only handles int32_t/uint32_t right now. */[m
[31m-static CPToken cp_number(CPState *cp)[m
[31m-{[m
[31m-  StrScanFmt fmt;[m
[31m-  TValue o;[m
[31m-  do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp)));[m
[31m-  cp_save(cp, '\0');[m
[31m-  fmt = lj_strscan_scan((const uint8_t *)sbufB(&cp->sb), &o, STRSCAN_OPT_C);[m
[31m-  if (fmt == STRSCAN_INT) cp->val.id = CTID_INT32;[m
[31m-  else if (fmt == STRSCAN_U32) cp->val.id = CTID_UINT32;[m
[31m-  else if (!(cp->mode & CPARSE_MODE_SKIP))[m
[31m-    cp_errmsg(cp, CTOK_INTEGER, LJ_ERR_XNUMBER);[m
[31m-  cp->val.u32 = (uint32_t)o.i;[m
[31m-  return CTOK_INTEGER;[m
[31m-}[m
[31m-[m
[31m-/* Parse identifier or keyword. */[m
[31m-static CPToken cp_ident(CPState *cp)[m
[31m-{[m
[31m-  do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp)));[m
[31m-  cp->str = lj_buf_str(cp->L, &cp->sb);[m
[31m-  cp->val.id = lj_ctype_getname(cp->cts, &cp->ct, cp->str, cp->tmask);[m
[31m-  if (ctype_type(cp->ct->info) == CT_KW)[m
[31m-    return ctype_cid(cp->ct->info);[m
[31m-  return CTOK_IDENT;[m
[31m-}[m
[31m-[m
[31m-/* Parse parameter. */[m
[31m-static CPToken cp_param(CPState *cp)[m
[31m-{[m
[31m-  CPChar c = cp_get(cp);[m
[31m-  TValue *o = cp->param;[m
[31m-  if (lj_char_isident(c) || c == '$')  /* Reserve $xyz for future extensions. */[m
[31m-    cp_errmsg(cp, c, LJ_ERR_XSYNTAX);[m
[31m-  if (!o || o >= cp->L->top)[m
[31m-    cp_err(cp, LJ_ERR_FFI_NUMPARAM);[m
[31m-  cp->param = o+1;[m
[31m-  if (tvisstr(o)) {[m
[31m-    cp->str = strV(o);[m
[31m-    cp->val.id = 0;[m
[31m-    cp->ct = &cp->cts->tab[0];[m
[31m-    return CTOK_IDENT;[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    cp->val.i32 = numberVint(o);[m
[31m-    cp->val.id = CTID_INT32;[m
[31m-    return CTOK_INTEGER;[m
[31m-  } else {[m
[31m-    GCcdata *cd;[m
[31m-    if (!tviscdata(o))[m
[31m-      lj_err_argtype(cp->L, (int)(o-cp->L->base)+1, "type parameter");[m
[31m-    cd = cdataV(o);[m
[31m-    if (cd->ctypeid == CTID_CTYPEID)[m
[31m-      cp->val.id = *(CTypeID *)cdataptr(cd);[m
[31m-    else[m
[31m-      cp->val.id = cd->ctypeid;[m
[31m-    return '$';[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse string or character constant. */[m
[31m-static CPToken cp_string(CPState *cp)[m
[31m-{[m
[31m-  CPChar delim = cp->c;[m
[31m-  cp_get(cp);[m
[31m-  while (cp->c != delim) {[m
[31m-    CPChar c = cp->c;[m
[31m-    if (c == '\0') cp_errmsg(cp, CTOK_EOF, LJ_ERR_XSTR);[m
[31m-    if (c == '\\') {[m
[31m-      c = cp_get(cp);[m
[31m-      switch (c) {[m
[31m-      case '\0': cp_errmsg(cp, CTOK_EOF, LJ_ERR_XSTR); break;[m
[31m-      case 'a': c = '\a'; break;[m
[31m-      case 'b': c = '\b'; break;[m
[31m-      case 'f': c = '\f'; break;[m
[31m-      case 'n': c = '\n'; break;[m
[31m-      case 'r': c = '\r'; break;[m
[31m-      case 't': c = '\t'; break;[m
[31m-      case 'v': c = '\v'; break;[m
[31m-      case 'e': c = 27; break;[m
[31m-      case 'x':[m
[31m-	c = 0;[m
[31m-	while (lj_char_isxdigit(cp_get(cp)))[m
[31m-	  c = (c<<4) + (lj_char_isdigit(cp->c) ? cp->c-'0' : (cp->c&15)+9);[m
[31m-	cp_save(cp, (c & 0xff));[m
[31m-	continue;[m
[31m-      default:[m
[31m-	if (lj_char_isdigit(c)) {[m
[31m-	  c -= '0';[m
[31m-	  if (lj_char_isdigit(cp_get(cp))) {[m
[31m-	    c = c*8 + (cp->c - '0');[m
[31m-	    if (lj_char_isdigit(cp_get(cp))) {[m
[31m-	      c = c*8 + (cp->c - '0');[m
[31m-	      cp_get(cp);[m
[31m-	    }[m
[31m-	  }[m
[31m-	  cp_save(cp, (c & 0xff));[m
[31m-	  continue;[m
[31m-	}[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-    cp_save(cp, c);[m
[31m-    cp_get(cp);[m
[31m-  }[m
[31m-  cp_get(cp);[m
[31m-  if (delim == '"') {[m
[31m-    cp->str = lj_buf_str(cp->L, &cp->sb);[m
[31m-    return CTOK_STRING;[m
[31m-  } else {[m
[31m-    if (sbuflen(&cp->sb) != 1) cp_err_token(cp, '\'');[m
[31m-    cp->val.i32 = (int32_t)(char)*sbufB(&cp->sb);[m
[31m-    cp->val.id = CTID_INT32;[m
[31m-    return CTOK_INTEGER;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Skip C comment. */[m
[31m-static void cp_comment_c(CPState *cp)[m
[31m-{[m
[31m-  do {[m
[31m-    if (cp_get(cp) == '*') {[m
[31m-      do {[m
[31m-	if (cp_get(cp) == '/') { cp_get(cp); return; }[m
[31m-      } while (cp->c == '*');[m
[31m-    }[m
[31m-    if (cp_iseol(cp->c)) cp_newline(cp);[m
[31m-  } while (cp->c != '\0');[m
[31m-}[m
[31m-[m
[31m-/* Skip C++ comment. */[m
[31m-static void cp_comment_cpp(CPState *cp)[m
[31m-{[m
[31m-  while (!cp_iseol(cp_get(cp)) && cp->c != '\0')[m
[31m-    ;[m
[31m-}[m
[31m-[m
[31m-/* Lexical scanner for C. Only a minimal subset is implemented. */[m
[31m-static CPToken cp_next_(CPState *cp)[m
[31m-{[m
[31m-  lj_buf_reset(&cp->sb);[m
[31m-  for (;;) {[m
[31m-    if (lj_char_isident(cp->c))[m
[31m-      return lj_char_isdigit(cp->c) ? cp_number(cp) : cp_ident(cp);[m
[31m-    switch (cp->c) {[m
[31m-    case '\n': case '\r': cp_newline(cp);  /* fallthrough. */[m
[31m-    case ' ': case '\t': case '\v': case '\f': cp_get(cp); break;[m
[31m-    case '"': case '\'': return cp_string(cp);[m
[31m-    case '/':[m
[31m-      if (cp_get(cp) == '*') cp_comment_c(cp);[m
[31m-      else if (cp->c == '/') cp_comment_cpp(cp);[m
[31m-      else return '/';[m
[31m-      break;[m
[31m-    case '|':[m
[31m-      if (cp_get(cp) != '|') return '|';[m
[31m-      cp_get(cp); return CTOK_OROR;[m
[31m-    case '&':[m
[31m-      if (cp_get(cp) != '&') return '&';[m
[31m-      cp_get(cp); return CTOK_ANDAND;[m
[31m-    case '=':[m
[31m-      if (cp_get(cp) != '=') return '=';[m
[31m-      cp_get(cp); return CTOK_EQ;[m
[31m-    case '!':[m
[31m-      if (cp_get(cp) != '=') return '!';[m
[31m-      cp_get(cp); return CTOK_NE;[m
[31m-    case '<':[m
[31m-      if (cp_get(cp) == '=') { cp_get(cp); return CTOK_LE; }[m
[31m-      else if (cp->c == '<') { cp_get(cp); return CTOK_SHL; }[m
[31m-      return '<';[m
[31m-    case '>':[m
[31m-      if (cp_get(cp) == '=') { cp_get(cp); return CTOK_GE; }[m
[31m-      else if (cp->c == '>') { cp_get(cp); return CTOK_SHR; }[m
[31m-      return '>';[m
[31m-    case '-':[m
[31m-      if (cp_get(cp) != '>') return '-';[m
[31m-      cp_get(cp); return CTOK_DEREF;[m
[31m-    case '$':[m
[31m-      return cp_param(cp);[m
[31m-    case '\0': return CTOK_EOF;[m
[31m-    default: { CPToken c = cp->c; cp_get(cp); return c; }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static LJ_NOINLINE CPToken cp_next(CPState *cp)[m
[31m-{[m
[31m-  return (cp->tok = cp_next_(cp));[m
[31m-}[m
[31m-[m
[31m-/* -- C parser ------------------------------------------------------------ */[m
[31m-[m
[31m-/* Namespaces for resolving identifiers. */[m
[31m-#define CPNS_DEFAULT \[m
[31m-  ((1u<<CT_KW)|(1u<<CT_TYPEDEF)|(1u<<CT_FUNC)|(1u<<CT_EXTERN)|(1u<<CT_CONSTVAL))[m
[31m-#define CPNS_STRUCT	((1u<<CT_KW)|(1u<<CT_STRUCT)|(1u<<CT_ENUM))[m
[31m-[m
[31m-typedef CTypeID CPDeclIdx;	/* Index into declaration stack. */[m
[31m-typedef uint32_t CPscl;		/* Storage class flags. */[m
[31m-[m
[31m-/* Type declaration context. */[m
[31m-typedef struct CPDecl {[m
[31m-  CPDeclIdx top;	/* Top of declaration stack. */[m
[31m-  CPDeclIdx pos;	/* Insertion position in declaration chain. */[m
[31m-  CPDeclIdx specpos;	/* Saved position for declaration specifier. */[m
[31m-  uint32_t mode;	/* Declarator mode. */[m
[31m-  CPState *cp;		/* C parser state. */[m
[31m-  GCstr *name;		/* Name of declared identifier (if direct). */[m
[31m-  GCstr *redir;		/* Redirected symbol name. */[m
[31m-  CTypeID nameid;	/* Existing typedef for declared identifier. */[m
[31m-  CTInfo attr;		/* Attributes. */[m
[31m-  CTInfo fattr;		/* Function attributes. */[m
[31m-  CTInfo specattr;	/* Saved attributes. */[m
[31m-  CTInfo specfattr;	/* Saved function attributes. */[m
[31m-  CTSize bits;		/* Field size in bits (if any). */[m
[31m-  CType stack[CPARSE_MAX_DECLSTACK];  /* Type declaration stack. */[m
[31m-} CPDecl;[m
[31m-[m
[31m-/* Forward declarations. */[m
[31m-static CPscl cp_decl_spec(CPState *cp, CPDecl *decl, CPscl scl);[m
[31m-static void cp_declarator(CPState *cp, CPDecl *decl);[m
[31m-static CTypeID cp_decl_abstract(CPState *cp);[m
[31m-[m
[31m-/* Initialize C parser state. Caller must set up: L, p, srcname, mode. */[m
[31m-static void cp_init(CPState *cp)[m
[31m-{[m
[31m-  cp->linenumber = 1;[m
[31m-  cp->depth = 0;[m
[31m-  cp->curpack = 0;[m
[31m-  cp->packstack[0] = 255;[m
[31m-  lj_buf_init(cp->L, &cp->sb);[m
[31m-  lua_assert(cp->p != NULL);[m
[31m-  cp_get(cp);  /* Read-ahead first char. */[m
[31m-  cp->tok = 0;[m
[31m-  cp->tmask = CPNS_DEFAULT;[m
[31m-  cp_next(cp);  /* Read-ahead first token. */[m
[31m-}[m
[31m-[m
[31m-/* Cleanup C parser state. */[m
[31m-static void cp_cleanup(CPState *cp)[m
[31m-{[m
[31m-  global_State *g = G(cp->L);[m
[31m-  lj_buf_free(g, &cp->sb);[m
[31m-}[m
[31m-[m
[31m-/* Check and consume optional token. */[m
[31m-static int cp_opt(CPState *cp, CPToken tok)[m
[31m-{[m
[31m-  if (cp->tok == tok) { cp_next(cp); return 1; }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check and consume token. */[m
[31m-static void cp_check(CPState *cp, CPToken tok)[m
[31m-{[m
[31m-  if (cp->tok != tok) cp_err_token(cp, tok);[m
[31m-  cp_next(cp);[m
[31m-}[m
[31m-[m
[31m-/* Check if the next token may start a type declaration. */[m
[31m-static int cp_istypedecl(CPState *cp)[m
[31m-{[m
[31m-  if (cp->tok >= CTOK_FIRSTDECL && cp->tok <= CTOK_LASTDECL) return 1;[m
[31m-  if (cp->tok == CTOK_IDENT && ctype_istypedef(cp->ct->info)) return 1;[m
[31m-  if (cp->tok == '$') return 1;[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant expression evaluator --------------------------------------- */[m
[31m-[m
[31m-/* Forward declarations. */[m
[31m-static void cp_expr_unary(CPState *cp, CPValue *k);[m
[31m-static void cp_expr_sub(CPState *cp, CPValue *k, int pri);[m
[31m-[m
[31m-/* Please note that type handling is very weak here. Most ops simply[m
[31m-** assume integer operands. Accessors are only needed to compute types and[m
[31m-** return synthetic values. The only purpose of the expression evaluator[m
[31m-** is to compute the values of constant expressions one would typically[m
[31m-** find in C header files. And again: this is NOT a validating C parser![m
[31m-*/[m
[31m-[m
[31m-/* Parse comma separated expression and return last result. */[m
[31m-static void cp_expr_comma(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  do { cp_expr_sub(cp, k, 0); } while (cp_opt(cp, ','));[m
[31m-}[m
[31m-[m
[31m-/* Parse sizeof/alignof operator. */[m
[31m-static void cp_expr_sizeof(CPState *cp, CPValue *k, int wantsz)[m
[31m-{[m
[31m-  CTSize sz;[m
[31m-  CTInfo info;[m
[31m-  if (cp_opt(cp, '(')) {[m
[31m-    if (cp_istypedecl(cp))[m
[31m-      k->id = cp_decl_abstract(cp);[m
[31m-    else[m
[31m-      cp_expr_comma(cp, k);[m
[31m-    cp_check(cp, ')');[m
[31m-  } else {[m
[31m-    cp_expr_unary(cp, k);[m
[31m-  }[m
[31m-  info = lj_ctype_info(cp->cts, k->id, &sz);[m
[31m-  if (wantsz) {[m
[31m-    if (sz != CTSIZE_INVALID)[m
[31m-      k->u32 = sz;[m
[31m-    else if (k->id != CTID_A_CCHAR)  /* Special case for sizeof("string"). */[m
[31m-      cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-  } else {[m
[31m-    k->u32 = 1u << ctype_align(info);[m
[31m-  }[m
[31m-  k->id = CTID_UINT32;  /* Really size_t. */[m
[31m-}[m
[31m-[m
[31m-/* Parse prefix operators. */[m
[31m-static void cp_expr_prefix(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  if (cp->tok == CTOK_INTEGER) {[m
[31m-    *k = cp->val; cp_next(cp);[m
[31m-  } else if (cp_opt(cp, '+')) {[m
[31m-    cp_expr_unary(cp, k);  /* Nothing to do (well, integer promotion). */[m
[31m-  } else if (cp_opt(cp, '-')) {[m
[31m-    cp_expr_unary(cp, k); k->i32 = -k->i32;[m
[31m-  } else if (cp_opt(cp, '~')) {[m
[31m-    cp_expr_unary(cp, k); k->i32 = ~k->i32;[m
[31m-  } else if (cp_opt(cp, '!')) {[m
[31m-    cp_expr_unary(cp, k); k->i32 = !k->i32; k->id = CTID_INT32;[m
[31m-  } else if (cp_opt(cp, '(')) {[m
[31m-    if (cp_istypedecl(cp)) {  /* Cast operator. */[m
[31m-      CTypeID id = cp_decl_abstract(cp);[m
[31m-      cp_check(cp, ')');[m
[31m-      cp_expr_unary(cp, k);[m
[31m-      k->id = id;  /* No conversion performed. */[m
[31m-    } else {  /* Sub-expression. */[m
[31m-      cp_expr_comma(cp, k);[m
[31m-      cp_check(cp, ')');[m
[31m-    }[m
[31m-  } else if (cp_opt(cp, '*')) {  /* Indirection. */[m
[31m-    CType *ct;[m
[31m-    cp_expr_unary(cp, k);[m
[31m-    ct = lj_ctype_rawref(cp->cts, k->id);[m
[31m-    if (!ctype_ispointer(ct->info))[m
[31m-      cp_err_badidx(cp, ct);[m
[31m-    k->u32 = 0; k->id = ctype_cid(ct->info);[m
[31m-  } else if (cp_opt(cp, '&')) {  /* Address operator. */[m
[31m-    cp_expr_unary(cp, k);[m
[31m-    k->id = lj_ctype_intern(cp->cts, CTINFO(CT_PTR, CTALIGN_PTR+k->id),[m
[31m-			    CTSIZE_PTR);[m
[31m-  } else if (cp_opt(cp, CTOK_SIZEOF)) {[m
[31m-    cp_expr_sizeof(cp, k, 1);[m
[31m-  } else if (cp_opt(cp, CTOK_ALIGNOF)) {[m
[31m-    cp_expr_sizeof(cp, k, 0);[m
[31m-  } else if (cp->tok == CTOK_IDENT) {[m
[31m-    if (ctype_type(cp->ct->info) == CT_CONSTVAL) {[m
[31m-      k->u32 = cp->ct->size; k->id = ctype_cid(cp->ct->info);[m
[31m-    } else if (ctype_type(cp->ct->info) == CT_EXTERN) {[m
[31m-      k->u32 = cp->val.id; k->id = ctype_cid(cp->ct->info);[m
[31m-    } else if (ctype_type(cp->ct->info) == CT_FUNC) {[m
[31m-      k->u32 = cp->val.id; k->id = cp->val.id;[m
[31m-    } else {[m
[31m-      goto err_expr;[m
[31m-    }[m
[31m-    cp_next(cp);[m
[31m-  } else if (cp->tok == CTOK_STRING) {[m
[31m-    CTSize sz = cp->str->len;[m
[31m-    while (cp_next(cp) == CTOK_STRING)[m
[31m-      sz += cp->str->len;[m
[31m-    k->u32 = sz + 1;[m
[31m-    k->id = CTID_A_CCHAR;[m
[31m-  } else {[m
[31m-  err_expr:[m
[31m-    cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse postfix operators. */[m
[31m-static void cp_expr_postfix(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  for (;;) {[m
[31m-    CType *ct;[m
[31m-    if (cp_opt(cp, '[')) {  /* Array/pointer index. */[m
[31m-      CPValue k2;[m
[31m-      cp_expr_comma(cp, &k2);[m
[31m-      ct = lj_ctype_rawref(cp->cts, k->id);[m
[31m-      if (!ctype_ispointer(ct->info)) {[m
[31m-	ct = lj_ctype_rawref(cp->cts, k2.id);[m
[31m-	if (!ctype_ispointer(ct->info))[m
[31m-	  cp_err_badidx(cp, ct);[m
[31m-      }[m
[31m-      cp_check(cp, ']');[m
[31m-      k->u32 = 0;[m
[31m-    } else if (cp->tok == '.' || cp->tok == CTOK_DEREF) {  /* Struct deref. */[m
[31m-      CTSize ofs;[m
[31m-      CType *fct;[m
[31m-      ct = lj_ctype_rawref(cp->cts, k->id);[m
[31m-      if (cp->tok == CTOK_DEREF) {[m
[31m-	if (!ctype_ispointer(ct->info))[m
[31m-	  cp_err_badidx(cp, ct);[m
[31m-	ct = lj_ctype_rawref(cp->cts, ctype_cid(ct->info));[m
[31m-      }[m
[31m-      cp_next(cp);[m
[31m-      if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT);[m
[31m-      if (!ctype_isstruct(ct->info) || ct->size == CTSIZE_INVALID ||[m
[31m-	  !(fct = lj_ctype_getfield(cp->cts, ct, cp->str, &ofs)) ||[m
[31m-	  ctype_isbitfield(fct->info)) {[m
[31m-	GCstr *s = lj_ctype_repr(cp->cts->L, ctype_typeid(cp->cts, ct), NULL);[m
[31m-	cp_errmsg(cp, 0, LJ_ERR_FFI_BADMEMBER, strdata(s), strdata(cp->str));[m
[31m-      }[m
[31m-      ct = fct;[m
[31m-      k->u32 = ctype_isconstval(ct->info) ? ct->size : 0;[m
[31m-      cp_next(cp);[m
[31m-    } else {[m
[31m-      return;[m
[31m-    }[m
[31m-    k->id = ctype_cid(ct->info);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse infix operators. */[m
[31m-static void cp_expr_infix(CPState *cp, CPValue *k, int pri)[m
[31m-{[m
[31m-  CPValue k2;[m
[31m-  k2.u32 = 0; k2.id = 0;  /* Silence the compiler. */[m
[31m-  for (;;) {[m
[31m-    switch (pri) {[m
[31m-    case 0:[m
[31m-      if (cp_opt(cp, '?')) {[m
[31m-	CPValue k3;[m
[31m-	cp_expr_comma(cp, &k2);  /* Right-associative. */[m
[31m-	cp_check(cp, ':');[m
[31m-	cp_expr_sub(cp, &k3, 0);[m
[31m-	k->u32 = k->u32 ? k2.u32 : k3.u32;[m
[31m-	k->id = k2.id > k3.id ? k2.id : k3.id;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 1:[m
[31m-      if (cp_opt(cp, CTOK_OROR)) {[m
[31m-	cp_expr_sub(cp, &k2, 2); k->i32 = k->u32 || k2.u32; k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 2:[m
[31m-      if (cp_opt(cp, CTOK_ANDAND)) {[m
[31m-	cp_expr_sub(cp, &k2, 3); k->i32 = k->u32 && k2.u32; k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 3:[m
[31m-      if (cp_opt(cp, '|')) {[m
[31m-	cp_expr_sub(cp, &k2, 4); k->u32 = k->u32 | k2.u32; goto arith_result;[m
[31m-      }[m
[31m-    case 4:[m
[31m-      if (cp_opt(cp, '^')) {[m
[31m-	cp_expr_sub(cp, &k2, 5); k->u32 = k->u32 ^ k2.u32; goto arith_result;[m
[31m-      }[m
[31m-    case 5:[m
[31m-      if (cp_opt(cp, '&')) {[m
[31m-	cp_expr_sub(cp, &k2, 6); k->u32 = k->u32 & k2.u32; goto arith_result;[m
[31m-      }[m
[31m-    case 6:[m
[31m-      if (cp_opt(cp, CTOK_EQ)) {[m
[31m-	cp_expr_sub(cp, &k2, 7); k->i32 = k->u32 == k2.u32; k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, CTOK_NE)) {[m
[31m-	cp_expr_sub(cp, &k2, 7); k->i32 = k->u32 != k2.u32; k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 7:[m
[31m-      if (cp_opt(cp, '<')) {[m
[31m-	cp_expr_sub(cp, &k2, 8);[m
[31m-	if (k->id == CTID_INT32 && k2.id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 < k2.i32;[m
[31m-	else[m
[31m-	  k->i32 = k->u32 < k2.u32;[m
[31m-	k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, '>')) {[m
[31m-	cp_expr_sub(cp, &k2, 8);[m
[31m-	if (k->id == CTID_INT32 && k2.id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 > k2.i32;[m
[31m-	else[m
[31m-	  k->i32 = k->u32 > k2.u32;[m
[31m-	k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, CTOK_LE)) {[m
[31m-	cp_expr_sub(cp, &k2, 8);[m
[31m-	if (k->id == CTID_INT32 && k2.id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 <= k2.i32;[m
[31m-	else[m
[31m-	  k->i32 = k->u32 <= k2.u32;[m
[31m-	k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, CTOK_GE)) {[m
[31m-	cp_expr_sub(cp, &k2, 8);[m
[31m-	if (k->id == CTID_INT32 && k2.id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 >= k2.i32;[m
[31m-	else[m
[31m-	  k->i32 = k->u32 >= k2.u32;[m
[31m-	k->id = CTID_INT32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 8:[m
[31m-      if (cp_opt(cp, CTOK_SHL)) {[m
[31m-	cp_expr_sub(cp, &k2, 9); k->u32 = k->u32 << k2.u32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, CTOK_SHR)) {[m
[31m-	cp_expr_sub(cp, &k2, 9);[m
[31m-	if (k->id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 >> k2.i32;[m
[31m-	else[m
[31m-	  k->u32 = k->u32 >> k2.u32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    case 9:[m
[31m-      if (cp_opt(cp, '+')) {[m
[31m-	cp_expr_sub(cp, &k2, 10); k->u32 = k->u32 + k2.u32;[m
[31m-      arith_result:[m
[31m-	if (k2.id > k->id) k->id = k2.id;  /* Trivial promotion to unsigned. */[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, '-')) {[m
[31m-	cp_expr_sub(cp, &k2, 10); k->u32 = k->u32 - k2.u32; goto arith_result;[m
[31m-      }[m
[31m-    case 10:[m
[31m-      if (cp_opt(cp, '*')) {[m
[31m-	cp_expr_unary(cp, &k2); k->u32 = k->u32 * k2.u32; goto arith_result;[m
[31m-      } else if (cp_opt(cp, '/')) {[m
[31m-	cp_expr_unary(cp, &k2);[m
[31m-	if (k2.id > k->id) k->id = k2.id;  /* Trivial promotion to unsigned. */[m
[31m-	if (k2.u32 == 0 ||[m
[31m-	    (k->id == CTID_INT32 && k->u32 == 0x80000000u && k2.i32 == -1))[m
[31m-	  cp_err(cp, LJ_ERR_BADVAL);[m
[31m-	if (k->id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 / k2.i32;[m
[31m-	else[m
[31m-	  k->u32 = k->u32 / k2.u32;[m
[31m-	continue;[m
[31m-      } else if (cp_opt(cp, '%')) {[m
[31m-	cp_expr_unary(cp, &k2);[m
[31m-	if (k2.id > k->id) k->id = k2.id;  /* Trivial promotion to unsigned. */[m
[31m-	if (k2.u32 == 0 ||[m
[31m-	    (k->id == CTID_INT32 && k->u32 == 0x80000000u && k2.i32 == -1))[m
[31m-	  cp_err(cp, LJ_ERR_BADVAL);[m
[31m-	if (k->id == CTID_INT32)[m
[31m-	  k->i32 = k->i32 % k2.i32;[m
[31m-	else[m
[31m-	  k->u32 = k->u32 % k2.u32;[m
[31m-	continue;[m
[31m-      }[m
[31m-    default:[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse and evaluate unary expression. */[m
[31m-static void cp_expr_unary(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  if (++cp->depth > CPARSE_MAX_DECLDEPTH) cp_err(cp, LJ_ERR_XLEVELS);[m
[31m-  cp_expr_prefix(cp, k);[m
[31m-  cp_expr_postfix(cp, k);[m
[31m-  cp->depth--;[m
[31m-}[m
[31m-[m
[31m-/* Parse and evaluate sub-expression. */[m
[31m-static void cp_expr_sub(CPState *cp, CPValue *k, int pri)[m
[31m-{[m
[31m-  cp_expr_unary(cp, k);[m
[31m-  cp_expr_infix(cp, k, pri);[m
[31m-}[m
[31m-[m
[31m-/* Parse constant integer expression. */[m
[31m-static void cp_expr_kint(CPState *cp, CPValue *k)[m
[31m-{[m
[31m-  CType *ct;[m
[31m-  cp_expr_sub(cp, k, 0);[m
[31m-  ct = ctype_raw(cp->cts, k->id);[m
[31m-  if (!ctype_isinteger(ct->info)) cp_err(cp, LJ_ERR_BADVAL);[m
[31m-}[m
[31m-[m
[31m-/* Parse (non-negative) size expression. */[m
[31m-static CTSize cp_expr_ksize(CPState *cp)[m
[31m-{[m
[31m-  CPValue k;[m
[31m-  cp_expr_kint(cp, &k);[m
[31m-  if (k.u32 >= 0x80000000u) cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-  return k.u32;[m
[31m-}[m
[31m-[m
[31m-/* -- Type declaration stack management ----------------------------------- */[m
[31m-[m
[31m-/* Add declaration element behind the insertion position. */[m
[31m-static CPDeclIdx cp_add(CPDecl *decl, CTInfo info, CTSize size)[m
[31m-{[m
[31m-  CPDeclIdx top = decl->top;[m
[31m-  if (top >= CPARSE_MAX_DECLSTACK) cp_err(decl->cp, LJ_ERR_XLEVELS);[m
[31m-  decl->stack[top].info = info;[m
[31m-  decl->stack[top].size = size;[m
[31m-  decl->stack[top].sib = 0;[m
[31m-  setgcrefnull(decl->stack[top].name);[m
[31m-  decl->stack[top].next = decl->stack[decl->pos].next;[m
[31m-  decl->stack[decl->pos].next = (CTypeID1)top;[m
[31m-  decl->top = top+1;[m
[31m-  return top;[m
[31m-}[m
[31m-[m
[31m-/* Push declaration element before the insertion position. */[m
[31m-static CPDeclIdx cp_push(CPDecl *decl, CTInfo info, CTSize size)[m
[31m-{[m
[31m-  return (decl->pos = cp_add(decl, info, size));[m
[31m-}[m
[31m-[m
[31m-/* Push or merge attributes. */[m
[31m-static void cp_push_attributes(CPDecl *decl)[m
[31m-{[m
[31m-  CType *ct = &decl->stack[decl->pos];[m
[31m-  if (ctype_isfunc(ct->info)) {  /* Ok to modify in-place. */[m
[31m-#if LJ_TARGET_X86[m
[31m-    if ((decl->fattr & CTFP_CCONV))[m
[31m-      ct->info = (ct->info & (CTMASK_NUM|CTF_VARARG|CTMASK_CID)) +[m
[31m-		 (decl->fattr & ~CTMASK_CID);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    if ((decl->attr & CTFP_ALIGNED) && !(decl->mode & CPARSE_MODE_FIELD))[m
[31m-      cp_push(decl, CTINFO(CT_ATTRIB, CTATTRIB(CTA_ALIGN)),[m
[31m-	      ctype_align(decl->attr));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Push unrolled type to declaration stack and merge qualifiers. */[m
[31m-static void cp_push_type(CPDecl *decl, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_get(decl->cp->cts, id);[m
[31m-  CTInfo info = ct->info;[m
[31m-  CTSize size = ct->size;[m
[31m-  switch (ctype_type(info)) {[m
[31m-  case CT_STRUCT: case CT_ENUM:[m
[31m-    cp_push(decl, CTINFO(CT_TYPEDEF, id), 0);  /* Don't copy unique types. */[m
[31m-    if ((decl->attr & CTF_QUAL)) {  /* Push unmerged qualifiers. */[m
[31m-      cp_push(decl, CTINFO(CT_ATTRIB, CTATTRIB(CTA_QUAL)),[m
[31m-	      (decl->attr & CTF_QUAL));[m
[31m-      decl->attr &= ~CTF_QUAL;[m
[31m-    }[m
[31m-    break;[m
[31m-  case CT_ATTRIB:[m
[31m-    if (ctype_isxattrib(info, CTA_QUAL))[m
[31m-      decl->attr &= ~size;  /* Remove redundant qualifiers. */[m
[31m-    cp_push_type(decl, ctype_cid(info));  /* Unroll. */[m
[31m-    cp_push(decl, info & ~CTMASK_CID, size);  /* Copy type. */[m
[31m-    break;[m
[31m-  case CT_ARRAY:[m
[31m-    if ((ct->info & (CTF_VECTOR|CTF_COMPLEX))) {[m
[31m-      info |= (decl->attr & CTF_QUAL);[m
[31m-      decl->attr &= ~CTF_QUAL;[m
[31m-    }[m
[31m-    cp_push_type(decl, ctype_cid(info));  /* Unroll. */[m
[31m-    cp_push(decl, info & ~CTMASK_CID, size);  /* Copy type. */[m
[31m-    decl->stack[decl->pos].sib = 1;  /* Mark as already checked and sized. */[m
[31m-    /* Note: this is not copied to the ct->sib in the C type table. */[m
[31m-    break;[m
[31m-  case CT_FUNC:[m
[31m-    /* Copy type, link parameters (shared). */[m
[31m-    decl->stack[cp_push(decl, info, size)].sib = ct->sib;[m
[31m-    break;[m
[31m-  default:[m
[31m-    /* Copy type, merge common qualifiers. */[m
[31m-    cp_push(decl, info|(decl->attr & CTF_QUAL), size);[m
[31m-    decl->attr &= ~CTF_QUAL;[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Consume the declaration element chain and intern the C type. */[m
[31m-static CTypeID cp_decl_intern(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  CTypeID id = 0;[m
[31m-  CPDeclIdx idx = 0;[m
[31m-  CTSize csize = CTSIZE_INVALID;[m
[31m-  CTSize cinfo = 0;[m
[31m-  do {[m
[31m-    CType *ct = &decl->stack[idx];[m
[31m-    CTInfo info = ct->info;[m
[31m-    CTInfo size = ct->size;[m
[31m-    /* The cid is already part of info for copies of pointers/functions. */[m
[31m-    idx = ct->next;[m
[31m-    if (ctype_istypedef(info)) {[m
[31m-      lua_assert(id == 0);[m
[31m-      id = ctype_cid(info);[m
[31m-      /* Always refetch info/size, since struct/enum may have been completed. */[m
[31m-      cinfo = ctype_get(cp->cts, id)->info;[m
[31m-      csize = ctype_get(cp->cts, id)->size;[m
[31m-      lua_assert(ctype_isstruct(cinfo) || ctype_isenum(cinfo));[m
[31m-    } else if (ctype_isfunc(info)) {  /* Intern function. */[m
[31m-      CType *fct;[m
[31m-      CTypeID fid;[m
[31m-      CTypeID sib;[m
[31m-      if (id) {[m
[31m-	CType *refct = ctype_raw(cp->cts, id);[m
[31m-	/* Reject function or refarray return types. */[m
[31m-	if (ctype_isfunc(refct->info) || ctype_isrefarray(refct->info))[m
[31m-	  cp_err(cp, LJ_ERR_FFI_INVTYPE);[m
[31m-      }[m
[31m-      /* No intervening attributes allowed, skip forward. */[m
[31m-      while (idx) {[m
[31m-	CType *ctn = &decl->stack[idx];[m
[31m-	if (!ctype_isattrib(ctn->info)) break;[m
[31m-	idx = ctn->next;  /* Skip attribute. */[m
[31m-      }[m
[31m-      sib = ct->sib;  /* Next line may reallocate the C type table. */[m
[31m-      fid = lj_ctype_new(cp->cts, &fct);[m
[31m-      csize = CTSIZE_INVALID;[m
[31m-      fct->info = cinfo = info + id;[m
[31m-      fct->size = size;[m
[31m-      fct->sib = sib;[m
[31m-      id = fid;[m
[31m-    } else if (ctype_isattrib(info)) {[m
[31m-      if (ctype_isxattrib(info, CTA_QUAL))[m
[31m-	cinfo |= size;[m
[31m-      else if (ctype_isxattrib(info, CTA_ALIGN))[m
[31m-	CTF_INSERT(cinfo, ALIGN, size);[m
[31m-      id = lj_ctype_intern(cp->cts, info+id, size);[m
[31m-      /* Inherit csize/cinfo from original type. */[m
[31m-    } else {[m
[31m-      if (ctype_isnum(info)) {  /* Handle mode/vector-size attributes. */[m
[31m-	lua_assert(id == 0);[m
[31m-	if (!(info & CTF_BOOL)) {[m
[31m-	  CTSize msize = ctype_msizeP(decl->attr);[m
[31m-	  CTSize vsize = ctype_vsizeP(decl->attr);[m
[31m-	  if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) {[m
[31m-	    CTSize malign = lj_fls(msize);[m
[31m-	    if (malign > 4) malign = 4;  /* Limit alignment. */[m
[31m-	    CTF_INSERT(info, ALIGN, malign);[m
[31m-	    size = msize;  /* Override size via mode. */[m
[31m-	  }[m
[31m-	  if (vsize) {  /* Vector size set? */[m
[31m-	    CTSize esize = lj_fls(size);[m
[31m-	    if (vsize >= esize) {[m
[31m-	      /* Intern the element type first. */[m
[31m-	      id = lj_ctype_intern(cp->cts, info, size);[m
[31m-	      /* Then create a vector (array) with vsize alignment. */[m
[31m-	      size = (1u << vsize);[m
[31m-	      if (vsize > 4) vsize = 4;  /* Limit alignment. */[m
[31m-	      if (ctype_align(info) > vsize) vsize = ctype_align(info);[m
[31m-	      info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR +[m
[31m-				      CTALIGN(vsize));[m
[31m-	    }[m
[31m-	  }[m
[31m-	}[m
[31m-      } else if (ctype_isptr(info)) {[m
[31m-	/* Reject pointer/ref to ref. */[m
[31m-	if (id && ctype_isref(ctype_raw(cp->cts, id)->info))[m
[31m-	  cp_err(cp, LJ_ERR_FFI_INVTYPE);[m
[31m-	if (ctype_isref(info)) {[m
[31m-	  info &= ~CTF_VOLATILE;  /* Refs are always const, never volatile. */[m
[31m-	  /* No intervening attributes allowed, skip forward. */[m
[31m-	  while (idx) {[m
[31m-	    CType *ctn = &decl->stack[idx];[m
[31m-	    if (!ctype_isattrib(ctn->info)) break;[m
[31m-	    idx = ctn->next;  /* Skip attribute. */[m
[31m-	  }[m
[31m-	}[m
[31m-      } else if (ctype_isarray(info)) {  /* Check for valid array size etc. */[m
[31m-	if (ct->sib == 0) {  /* Only check/size arrays not copied by unroll. */[m
[31m-	  if (ctype_isref(cinfo))  /* Reject arrays of refs. */[m
[31m-	    cp_err(cp, LJ_ERR_FFI_INVTYPE);[m
[31m-	  /* Reject VLS or unknown-sized types. */[m
[31m-	  if (ctype_isvltype(cinfo) || csize == CTSIZE_INVALID)[m
[31m-	    cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-	  /* a[] and a[?] keep their invalid size. */[m
[31m-	  if (size != CTSIZE_INVALID) {[m
[31m-	    uint64_t xsz = (uint64_t)size * csize;[m
[31m-	    if (xsz >= 0x80000000u) cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-	    size = (CTSize)xsz;[m
[31m-	  }[m
[31m-	}[m
[31m-	if ((cinfo & CTF_ALIGN) > (info & CTF_ALIGN))  /* Find max. align. */[m
[31m-	  info = (info & ~CTF_ALIGN) | (cinfo & CTF_ALIGN);[m
[31m-	info |= (cinfo & CTF_QUAL);  /* Inherit qual. */[m
[31m-      } else {[m
[31m-	lua_assert(ctype_isvoid(info));[m
[31m-      }[m
[31m-      csize = size;[m
[31m-      cinfo = info+id;[m
[31m-      id = lj_ctype_intern(cp->cts, info+id, size);[m
[31m-    }[m
[31m-  } while (idx);[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-/* -- C declaration parser ------------------------------------------------ */[m
[31m-[m
[31m-#define H_(le, be)	LJ_ENDIAN_SELECT(0x##le, 0x##be)[m
[31m-[m
[31m-/* Reset declaration state to declaration specifier. */[m
[31m-static void cp_decl_reset(CPDecl *decl)[m
[31m-{[m
[31m-  decl->pos = decl->specpos;[m
[31m-  decl->top = decl->specpos+1;[m
[31m-  decl->stack[decl->specpos].next = 0;[m
[31m-  decl->attr = decl->specattr;[m
[31m-  decl->fattr = decl->specfattr;[m
[31m-  decl->name = NULL;[m
[31m-  decl->redir = NULL;[m
[31m-}[m
[31m-[m
[31m-/* Parse constant initializer. */[m
[31m-/* NYI: FP constants and strings as initializers. */[m
[31m-static CTypeID cp_decl_constinit(CPState *cp, CType **ctp, CTypeID ctypeid)[m
[31m-{[m
[31m-  CType *ctt = ctype_get(cp->cts, ctypeid);[m
[31m-  CTInfo info;[m
[31m-  CTSize size;[m
[31m-  CPValue k;[m
[31m-  CTypeID constid;[m
[31m-  while (ctype_isattrib(ctt->info)) {  /* Skip attributes. */[m
[31m-    ctypeid = ctype_cid(ctt->info);  /* Update ID, too. */[m
[31m-    ctt = ctype_get(cp->cts, ctypeid);[m
[31m-  }[m
[31m-  info = ctt->info;[m
[31m-  size = ctt->size;[m
[31m-  if (!ctype_isinteger(info) || !(info & CTF_CONST) || size > 4)[m
[31m-    cp_err(cp, LJ_ERR_FFI_INVTYPE);[m
[31m-  cp_check(cp, '=');[m
[31m-  cp_expr_sub(cp, &k, 0);[m
[31m-  constid = lj_ctype_new(cp->cts, ctp);[m
[31m-  (*ctp)->info = CTINFO(CT_CONSTVAL, CTF_CONST|ctypeid);[m
[31m-  k.u32 <<= 8*(4-size);[m
[31m-  if ((info & CTF_UNSIGNED))[m
[31m-    k.u32 >>= 8*(4-size);[m
[31m-  else[m
[31m-    k.u32 = (uint32_t)((int32_t)k.u32 >> 8*(4-size));[m
[31m-  (*ctp)->size = k.u32;[m
[31m-  return constid;[m
[31m-}[m
[31m-[m
[31m-/* Parse size in parentheses as part of attribute. */[m
[31m-static CTSize cp_decl_sizeattr(CPState *cp)[m
[31m-{[m
[31m-  CTSize sz;[m
[31m-  uint32_t oldtmask = cp->tmask;[m
[31m-  cp->tmask = CPNS_DEFAULT;  /* Required for expression evaluator. */[m
[31m-  cp_check(cp, '(');[m
[31m-  sz = cp_expr_ksize(cp);[m
[31m-  cp->tmask = oldtmask;[m
[31m-  cp_check(cp, ')');[m
[31m-  return sz;[m
[31m-}[m
[31m-[m
[31m-/* Parse alignment attribute. */[m
[31m-static void cp_decl_align(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  CTSize al = 4;  /* Unspecified alignment is 16 bytes. */[m
[31m-  if (cp->tok == '(') {[m
[31m-    al = cp_decl_sizeattr(cp);[m
[31m-    al = al ? lj_fls(al) : 0;[m
[31m-  }[m
[31m-  CTF_INSERT(decl->attr, ALIGN, al);[m
[31m-  decl->attr |= CTFP_ALIGNED;[m
[31m-}[m
[31m-[m
[31m-/* Parse GCC asm("name") redirect. */[m
[31m-static void cp_decl_asm(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  UNUSED(decl);[m
[31m-  cp_next(cp);[m
[31m-  cp_check(cp, '(');[m
[31m-  if (cp->tok == CTOK_STRING) {[m
[31m-    GCstr *str = cp->str;[m
[31m-    while (cp_next(cp) == CTOK_STRING) {[m
[31m-      lj_strfmt_pushf(cp->L, "%s%s", strdata(str), strdata(cp->str));[m
[31m-      cp->L->top--;[m
[31m-      str = strV(cp->L->top);[m
[31m-    }[m
[31m-    decl->redir = str;[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-}[m
[31m-[m
[31m-/* Parse GCC __attribute__((mode(...))). */[m
[31m-static void cp_decl_mode(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  cp_check(cp, '(');[m
[31m-  if (cp->tok == CTOK_IDENT) {[m
[31m-    const char *s = strdata(cp->str);[m
[31m-    CTSize sz = 0, vlen = 0;[m
[31m-    if (s[0] == '_' && s[1] == '_') s += 2;[m
[31m-    if (*s == 'V') {[m
[31m-      s++;[m
[31m-      vlen = *s++ - '0';[m
[31m-      if (*s >= '0' && *s <= '9')[m
[31m-	vlen = vlen*10 + (*s++ - '0');[m
[31m-    }[m
[31m-    switch (*s++) {[m
[31m-    case 'Q': sz = 1; break;[m
[31m-    case 'H': sz = 2; break;[m
[31m-    case 'S': sz = 4; break;[m
[31m-    case 'D': sz = 8; break;[m
[31m-    case 'T': sz = 16; break;[m
[31m-    case 'O': sz = 32; break;[m
[31m-    default: goto bad_size;[m
[31m-    }[m
[31m-    if (*s == 'I' || *s == 'F') {[m
[31m-      CTF_INSERT(decl->attr, MSIZEP, sz);[m
[31m-      if (vlen) CTF_INSERT(decl->attr, VSIZEP, lj_fls(vlen*sz));[m
[31m-    }[m
[31m-  bad_size:[m
[31m-    cp_next(cp);[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-}[m
[31m-[m
[31m-/* Parse GCC __attribute__((...)). */[m
[31m-static void cp_decl_gccattribute(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  cp_next(cp);[m
[31m-  cp_check(cp, '(');[m
[31m-  cp_check(cp, '(');[m
[31m-  while (cp->tok != ')') {[m
[31m-    if (cp->tok == CTOK_IDENT) {[m
[31m-      GCstr *attrstr = cp->str;[m
[31m-      cp_next(cp);[m
[31m-      switch (attrstr->hash) {[m
[31m-      case H_(64a9208e,8ce14319): case H_(8e6331b2,95a282af):  /* aligned */[m
[31m-	cp_decl_align(cp, decl);[m
[31m-	break;[m
[31m-      case H_(42eb47de,f0ede26c): case H_(29f48a09,cf383e0c):  /* packed */[m
[31m-	decl->attr |= CTFP_PACKED;[m
[31m-	break;[m
[31m-      case H_(0a84eef6,8dfab04c): case H_(995cf92c,d5696591):  /* mode */[m
[31m-	cp_decl_mode(cp, decl);[m
[31m-	break;[m
[31m-      case H_(0ab31997,2d5213fa): case H_(bf875611,200e9990):  /* vector_size */[m
[31m-	{[m
[31m-	  CTSize vsize = cp_decl_sizeattr(cp);[m
[31m-	  if (vsize) CTF_INSERT(decl->attr, VSIZEP, lj_fls(vsize));[m
[31m-	}[m
[31m-	break;[m
[31m-#if LJ_TARGET_X86[m
[31m-      case H_(5ad22db8,c689b848): case H_(439150fa,65ea78cb):  /* regparm */[m
[31m-	CTF_INSERT(decl->fattr, REGPARM, cp_decl_sizeattr(cp));[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(18fc0b98,7ff4c074): case H_(4e62abed,0a747424):  /* cdecl */[m
[31m-	CTF_INSERT(decl->fattr, CCONV, CTCC_CDECL);[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(72b2e41b,494c5a44): case H_(f2356d59,f25fc9bd):  /* thiscall */[m
[31m-	CTF_INSERT(decl->fattr, CCONV, CTCC_THISCALL);[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(0d0ffc42,ab746f88): case H_(21c54ba1,7f0ca7e3):  /* fastcall */[m
[31m-	CTF_INSERT(decl->fattr, CCONV, CTCC_FASTCALL);[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(ef76b040,9412e06a): case H_(de56697b,c750e6e1):  /* stdcall */[m
[31m-	CTF_INSERT(decl->fattr, CCONV, CTCC_STDCALL);[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-      case H_(ea78b622,f234bd8e): case H_(252ffb06,8d50f34b):  /* sseregparm */[m
[31m-	decl->fattr |= CTF_SSEREGPARM;[m
[31m-	decl->fattr |= CTFP_CCONV;[m
[31m-	break;[m
[31m-#endif[m
[31m-      default:  /* Skip all other attributes. */[m
[31m-	goto skip_attr;[m
[31m-      }[m
[31m-    } else if (cp->tok >= CTOK_FIRSTDECL) {  /* For __attribute((const)) etc. */[m
[31m-      cp_next(cp);[m
[31m-    skip_attr:[m
[31m-      if (cp_opt(cp, '(')) {[m
[31m-	while (cp->tok != ')' && cp->tok != CTOK_EOF) cp_next(cp);[m
[31m-	cp_check(cp, ')');[m
[31m-      }[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-    if (!cp_opt(cp, ',')) break;[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-  cp_check(cp, ')');[m
[31m-}[m
[31m-[m
[31m-/* Parse MSVC __declspec(...). */[m
[31m-static void cp_decl_msvcattribute(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  cp_next(cp);[m
[31m-  cp_check(cp, '(');[m
[31m-  while (cp->tok == CTOK_IDENT) {[m
[31m-    GCstr *attrstr = cp->str;[m
[31m-    cp_next(cp);[m
[31m-    switch (attrstr->hash) {[m
[31m-    case H_(bc2395fa,98f267f8):  /* align */[m
[31m-      cp_decl_align(cp, decl);[m
[31m-      break;[m
[31m-    default:  /* Ignore all other attributes. */[m
[31m-      if (cp_opt(cp, '(')) {[m
[31m-	while (cp->tok != ')' && cp->tok != CTOK_EOF) cp_next(cp);[m
[31m-	cp_check(cp, ')');[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-}[m
[31m-[m
[31m-/* Parse declaration attributes (and common qualifiers). */[m
[31m-static void cp_decl_attributes(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  for (;;) {[m
[31m-    switch (cp->tok) {[m
[31m-    case CTOK_CONST: decl->attr |= CTF_CONST; break;[m
[31m-    case CTOK_VOLATILE: decl->attr |= CTF_VOLATILE; break;[m
[31m-    case CTOK_RESTRICT: break;  /* Ignore. */[m
[31m-    case CTOK_EXTENSION: break;  /* Ignore. */[m
[31m-    case CTOK_ATTRIBUTE: cp_decl_gccattribute(cp, decl); continue;[m
[31m-    case CTOK_ASM: cp_decl_asm(cp, decl); continue;[m
[31m-    case CTOK_DECLSPEC: cp_decl_msvcattribute(cp, decl); continue;[m
[31m-    case CTOK_CCDECL:[m
[31m-#if LJ_TARGET_X86[m
[31m-      CTF_INSERT(decl->fattr, CCONV, cp->ct->size);[m
[31m-      decl->fattr |= CTFP_CCONV;[m
[31m-#endif[m
[31m-      break;[m
[31m-    case CTOK_PTRSZ:[m
[31m-#if LJ_64[m
[31m-      CTF_INSERT(decl->attr, MSIZEP, cp->ct->size);[m
[31m-#endif[m
[31m-      break;[m
[31m-    default: return;[m
[31m-    }[m
[31m-    cp_next(cp);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse struct/union/enum name. */[m
[31m-static CTypeID cp_struct_name(CPState *cp, CPDecl *sdecl, CTInfo info)[m
[31m-{[m
[31m-  CTypeID sid;[m
[31m-  CType *ct;[m
[31m-  cp->tmask = CPNS_STRUCT;[m
[31m-  cp_next(cp);[m
[31m-  cp_decl_attributes(cp, sdecl);[m
[31m-  cp->tmask = CPNS_DEFAULT;[m
[31m-  if (cp->tok != '{') {[m
[31m-    if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT);[m
[31m-    if (cp->val.id) {  /* Name of existing struct/union/enum. */[m
[31m-      sid = cp->val.id;[m
[31m-      ct = cp->ct;[m
[31m-      if ((ct->info ^ info) & (CTMASK_NUM|CTF_UNION))  /* Wrong type. */[m
[31m-	cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(gco2str(gcref(ct->name))));[m
[31m-    } else {  /* Create named, incomplete struct/union/enum. */[m
[31m-      if ((cp->mode & CPARSE_MODE_NOIMPLICIT))[m
[31m-	cp_errmsg(cp, 0, LJ_ERR_FFI_BADTAG, strdata(cp->str));[m
[31m-      sid = lj_ctype_new(cp->cts, &ct);[m
[31m-      ct->info = info;[m
[31m-      ct->size = CTSIZE_INVALID;[m
[31m-      ctype_setname(ct, cp->str);[m
[31m-      lj_ctype_addname(cp->cts, ct, sid);[m
[31m-    }[m
[31m-    cp_next(cp);[m
[31m-  } else {  /* Create anonymous, incomplete struct/union/enum. */[m
[31m-    sid = lj_ctype_new(cp->cts, &ct);[m
[31m-    ct->info = info;[m
[31m-    ct->size = CTSIZE_INVALID;[m
[31m-  }[m
[31m-  if (cp->tok == '{') {[m
[31m-    if (ct->size != CTSIZE_INVALID || ct->sib)[m
[31m-      cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(gco2str(gcref(ct->name))));[m
[31m-    ct->sib = 1;  /* Indicate the type is currently being defined. */[m
[31m-  }[m
[31m-  return sid;[m
[31m-}[m
[31m-[m
[31m-/* Determine field alignment. */[m
[31m-static CTSize cp_field_align(CPState *cp, CType *ct, CTInfo info)[m
[31m-{[m
[31m-  CTSize align = ctype_align(info);[m
[31m-  UNUSED(cp); UNUSED(ct);[m
[31m-#if (LJ_TARGET_X86 && !LJ_ABI_WIN) || (LJ_TARGET_ARM && __APPLE__)[m
[31m-  /* The SYSV i386 and iOS ABIs limit alignment of non-vector fields to 2^2. */[m
[31m-  if (align > 2 && !(info & CTFP_ALIGNED)) {[m
[31m-    if (ctype_isarray(info) && !(info & CTF_VECTOR)) {[m
[31m-      do {[m
[31m-	ct = ctype_rawchild(cp->cts, ct);[m
[31m-	info = ct->info;[m
[31m-      } while (ctype_isarray(info) && !(info & CTF_VECTOR));[m
[31m-    }[m
[31m-    if (ctype_isnum(info) || ctype_isenum(info))[m
[31m-      align = 2;[m
[31m-  }[m
[31m-#endif[m
[31m-  return align;[m
[31m-}[m
[31m-[m
[31m-/* Layout struct/union fields. */[m
[31m-static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr)[m
[31m-{[m
[31m-  CTSize bofs = 0, bmaxofs = 0;  /* Bit offset and max. bit offset. */[m
[31m-  CTSize maxalign = ctype_align(sattr);[m
[31m-  CType *sct = ctype_get(cp->cts, sid);[m
[31m-  CTInfo sinfo = sct->info;[m
[31m-  CTypeID fieldid = sct->sib;[m
[31m-  while (fieldid) {[m
[31m-    CType *ct = ctype_get(cp->cts, fieldid);[m
[31m-    CTInfo attr = ct->size;  /* Field declaration attributes (temp.). */[m
[31m-[m
[31m-    if (ctype_isfield(ct->info) ||[m
[31m-	(ctype_isxattrib(ct->info, CTA_SUBTYPE) && attr)) {[m
[31m-      CTSize align, amask;  /* Alignment (pow2) and alignment mask (bits). */[m
[31m-      CTSize sz;[m
[31m-      CTInfo info = lj_ctype_info(cp->cts, ctype_cid(ct->info), &sz);[m
[31m-      CTSize bsz, csz = 8*sz;  /* Field size and container size (in bits). */[m
[31m-      sinfo |= (info & (CTF_QUAL|CTF_VLA));  /* Merge pseudo-qualifiers. */[m
[31m-[m
[31m-      /* Check for size overflow and determine alignment. */[m
[31m-      if (sz >= 0x20000000u || bofs + csz < bofs || (info & CTF_VLA)) {[m
[31m-	if (!(sz == CTSIZE_INVALID && ctype_isarray(info) &&[m
[31m-	      !(sinfo & CTF_UNION)))[m
[31m-	  cp_err(cp, LJ_ERR_FFI_INVSIZE);[m
[31m-	csz = sz = 0;  /* Treat a[] and a[?] as zero-sized. */[m
[31m-      }[m
[31m-      align = cp_field_align(cp, ct, info);[m
[31m-      if (((attr|sattr) & CTFP_PACKED) ||[m
[31m-	  ((attr & CTFP_ALIGNED) && ctype_align(attr) > align))[m
[31m-	align = ctype_align(attr);[m
[31m-      if (cp->packstack[cp->curpack] < align)[m
[31m-	align = cp->packstack[cp->curpack];[m
[31m-      if (align > maxalign) maxalign = align;[m
[31m-      amask = (8u << align) - 1;[m
[31m-[m
[31m-      bsz = ctype_bitcsz(ct->info);  /* Bitfield size (temp.). */[m
[31m-      if (bsz == CTBSZ_FIELD || !ctype_isfield(ct->info)) {[m
[31m-	bsz = csz;  /* Regular fields or subtypes always fill the container. */[m
[31m-	bofs = (bofs + amask) & ~amask;  /* Start new aligned field. */[m
[31m-	ct->size = (bofs >> 3);  /* Store field offset. */[m
[31m-      } else {  /* Bitfield. */[m
[31m-	if (bsz == 0 || (attr & CTFP_ALIGNED) ||[m
[31m-	    (!((attr|sattr) & CTFP_PACKED) && (bofs & amask) + bsz > csz))[m
[31m-	  bofs = (bofs + amask) & ~amask;  /* Start new aligned field. */[m
[31m-[m
[31m-	/* Prefer regular field over bitfield. */[m
[31m-	if (bsz == csz && (bofs & amask) == 0) {[m
[31m-	  ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info));[m
[31m-	  ct->size = (bofs >> 3);  /* Store field offset. */[m
[31m-	} else {[m
[31m-	  ct->info = CTINFO(CT_BITFIELD,[m
[31m-	    (info & (CTF_QUAL|CTF_UNSIGNED|CTF_BOOL)) +[m
[31m-	    (csz << (CTSHIFT_BITCSZ-3)) + (bsz << CTSHIFT_BITBSZ));[m
[31m-#if LJ_BE[m
[31m-	  ct->info += ((csz - (bofs & (csz-1)) - bsz) << CTSHIFT_BITPOS);[m
[31m-#else[m
[31m-	  ct->info += ((bofs & (csz-1)) << CTSHIFT_BITPOS);[m
[31m-#endif[m
[31m-	  ct->size = ((bofs & ~(csz-1)) >> 3);  /* Store container offset. */[m
[31m-	}[m
[31m-      }[m
[31m-[m
[31m-      /* Determine next offset or max. offset. */[m
[31m-      if ((sinfo & CTF_UNION)) {[m
[31m-	if (bsz > bmaxofs) bmaxofs = bsz;[m
[31m-      } else {[m
[31m-	bofs += bsz;[m
[31m-      }[m
[31m-    }  /* All other fields in the chain are already set up. */[m
[31m-[m
[31m-    fieldid = ct->sib;[m
[31m-  }[m
[31m-[m
[31m-  /* Complete struct/union. */[m
[31m-  sct->info = sinfo + CTALIGN(maxalign);[m
[31m-  bofs = (sinfo & CTF_UNION) ? bmaxofs : bofs;[m
[31m-  maxalign = (8u << maxalign) - 1;[m
[31m-  sct->size = (((bofs + maxalign) & ~maxalign) >> 3);[m
[31m-}[m
[31m-[m
[31m-/* Parse struct/union declaration. */[m
[31m-static CTypeID cp_decl_struct(CPState *cp, CPDecl *sdecl, CTInfo sinfo)[m
[31m-{[m
[31m-  CTypeID sid = cp_struct_name(cp, sdecl, sinfo);[m
[31m-  if (cp_opt(cp, '{')) {  /* Struct/union definition. */[m
[31m-    CTypeID lastid = sid;[m
[31m-    int lastdecl = 0;[m
[31m-    while (cp->tok != '}') {[m
[31m-      CPDecl decl;[m
[31m-      CPscl scl = cp_decl_spec(cp, &decl, CDF_STATIC);[m
[31m-      decl.mode = scl ? CPARSE_MODE_DIRECT :[m
[31m-	CPARSE_MODE_DIRECT|CPARSE_MODE_ABSTRACT|CPARSE_MODE_FIELD;[m
[31m-[m
[31m-      for (;;) {[m
[31m-	CTypeID ctypeid;[m
[31m-[m
[31m-	if (lastdecl) cp_err_token(cp, '}');[m
[31m-[m
[31m-	/* Parse field declarator. */[m
[31m-	decl.bits = CTSIZE_INVALID;[m
[31m-	cp_declarator(cp, &decl);[m
[31m-	ctypeid = cp_decl_intern(cp, &decl);[m
[31m-[m
[31m-	if ((scl & CDF_STATIC)) {  /* Static constant in struct namespace. */[m
[31m-	  CType *ct;[m
[31m-	  CTypeID fieldid = cp_decl_constinit(cp, &ct, ctypeid);[m
[31m-	  ctype_get(cp->cts, lastid)->sib = fieldid;[m
[31m-	  lastid = fieldid;[m
[31m-	  ctype_setname(ct, decl.name);[m
[31m-	} else {[m
[31m-	  CTSize bsz = CTBSZ_FIELD;  /* Temp. for layout phase. */[m
[31m-	  CType *ct;[m
[31m-	  CTypeID fieldid = lj_ctype_new(cp->cts, &ct);  /* Do this first. */[m
[31m-	  CType *tct = ctype_raw(cp->cts, ctypeid);[m
[31m-[m
[31m-	  if (decl.bits == CTSIZE_INVALID) {  /* Regular field. */[m
[31m-	    if (ctype_isarray(tct->info) && tct->size == CTSIZE_INVALID)[m
[31m-	      lastdecl = 1;  /* a[] or a[?] must be the last declared field. */[m
[31m-[m
[31m-	    /* Accept transparent struct/union/enum. */[m
[31m-	    if (!decl.name) {[m
[31m-	      if (!((ctype_isstruct(tct->info) && !(tct->info & CTF_VLA)) ||[m
[31m-		    ctype_isenum(tct->info)))[m
[31m-		cp_err_token(cp, CTOK_IDENT);[m
[31m-	      ct->info = CTINFO(CT_ATTRIB, CTATTRIB(CTA_SUBTYPE) + ctypeid);[m
[31m-	      ct->size = ctype_isstruct(tct->info) ?[m
[31m-			 (decl.attr|0x80000000u) : 0;  /* For layout phase. */[m
[31m-	      goto add_field;[m
[31m-	    }[m
[31m-	  } else {  /* Bitfield. */[m
[31m-	    bsz = decl.bits;[m
[31m-	    if (!ctype_isinteger_or_bool(tct->info) ||[m
[31m-		(bsz == 0 && decl.name) || 8*tct->size > CTBSZ_MAX ||[m
[31m-		bsz > ((tct->info & CTF_BOOL) ? 1 : 8*tct->size))[m
[31m-	      cp_errmsg(cp, ':', LJ_ERR_BADVAL);[m
[31m-	  }[m
[31m-[m
[31m-	  /* Create temporary field for layout phase. */[m
[31m-	  ct->info = CTINFO(CT_FIELD, ctypeid + (bsz << CTSHIFT_BITCSZ));[m
[31m-	  ct->size = decl.attr;[m
[31m-	  if (decl.name) ctype_setname(ct, decl.name);[m
[31m-[m
[31m-	add_field:[m
[31m-	  ctype_get(cp->cts, lastid)->sib = fieldid;[m
[31m-	  lastid = fieldid;[m
[31m-	}[m
[31m-	if (!cp_opt(cp, ',')) break;[m
[31m-	cp_decl_reset(&decl);[m
[31m-      }[m
[31m-      cp_check(cp, ';');[m
[31m-    }[m
[31m-    cp_check(cp, '}');[m
[31m-    ctype_get(cp->cts, lastid)->sib = 0;  /* Drop sib = 1 for empty structs. */[m
[31m-    cp_decl_attributes(cp, sdecl);  /* Layout phase needs postfix attributes. */[m
[31m-    cp_struct_layout(cp, sid, sdecl->attr);[m
[31m-  }[m
[31m-  return sid;[m
[31m-}[m
[31m-[m
[31m-/* Parse enum declaration. */[m
[31m-static CTypeID cp_decl_enum(CPState *cp, CPDecl *sdecl)[m
[31m-{[m
[31m-  CTypeID eid = cp_struct_name(cp, sdecl, CTINFO(CT_ENUM, CTID_VOID));[m
[31m-  CTInfo einfo = CTINFO(CT_ENUM, CTALIGN(2) + CTID_UINT32);[m
[31m-  CTSize esize = 4;  /* Only 32 bit enums are supported. */[m
[31m-  if (cp_opt(cp, '{')) {  /* Enum definition. */[m
[31m-    CPValue k;[m
[31m-    CTypeID lastid = eid;[m
[31m-    k.u32 = 0;[m
[31m-    k.id = CTID_INT32;[m
[31m-    do {[m
[31m-      GCstr *name = cp->str;[m
[31m-      if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT);[m
[31m-      if (cp->val.id) cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(name));[m
[31m-      cp_next(cp);[m
[31m-      if (cp_opt(cp, '=')) {[m
[31m-	cp_expr_kint(cp, &k);[m
[31m-	if (k.id == CTID_UINT32) {[m
[31m-	  /* C99 says that enum constants are always (signed) integers.[m
[31m-	  ** But since unsigned constants like 0x80000000 are quite common,[m
[31m-	  ** those are left as uint32_t.[m
[31m-	  */[m
[31m-	  if (k.i32 >= 0) k.id = CTID_INT32;[m
[31m-	} else {[m
[31m-	  /* OTOH it's common practice and even mandated by some ABIs[m
[31m-	  ** that the enum type itself is unsigned, unless there are any[m
[31m-	  ** negative constants.[m
[31m-	  */[m
[31m-	  k.id = CTID_INT32;[m
[31m-	  if (k.i32 < 0) einfo = CTINFO(CT_ENUM, CTALIGN(2) + CTID_INT32);[m
[31m-	}[m
[31m-      }[m
[31m-      /* Add named enum constant. */[m
[31m-      {[m
[31m-	CType *ct;[m
[31m-	CTypeID constid = lj_ctype_new(cp->cts, &ct);[m
[31m-	ctype_get(cp->cts, lastid)->sib = constid;[m
[31m-	lastid = constid;[m
[31m-	ctype_setname(ct, name);[m
[31m-	ct->info = CTINFO(CT_CONSTVAL, CTF_CONST|k.id);[m
[31m-	ct->size = k.u32++;[m
[31m-	if (k.u32 == 0x80000000u) k.id = CTID_UINT32;[m
[31m-	lj_ctype_addname(cp->cts, ct, constid);[m
[31m-      }[m
[31m-      if (!cp_opt(cp, ',')) break;[m
[31m-    } while (cp->tok != '}');  /* Trailing ',' is ok. */[m
[31m-    cp_check(cp, '}');[m
[31m-    /* Complete enum. */[m
[31m-    ctype_get(cp->cts, eid)->info = einfo;[m
[31m-    ctype_get(cp->cts, eid)->size = esize;[m
[31m-  }[m
[31m-  return eid;[m
[31m-}[m
[31m-[m
[31m-/* Parse declaration specifiers. */[m
[31m-static CPscl cp_decl_spec(CPState *cp, CPDecl *decl, CPscl scl)[m
[31m-{[m
[31m-  uint32_t cds = 0, sz = 0;[m
[31m-  CTypeID tdef = 0;[m
[31m-[m
[31m-  decl->cp = cp;[m
[31m-  decl->mode = cp->mode;[m
[31m-  decl->name = NULL;[m
[31m-  decl->redir = NULL;[m
[31m-  decl->attr = 0;[m
[31m-  decl->fattr = 0;[m
[31m-  decl->pos = decl->top = 0;[m
[31m-  decl->stack[0].next = 0;[m
[31m-[m
[31m-  for (;;) {  /* Parse basic types. */[m
[31m-    cp_decl_attributes(cp, decl);[m
[31m-    if (cp->tok >= CTOK_FIRSTDECL && cp->tok <= CTOK_LASTDECLFLAG) {[m
[31m-      uint32_t cbit;[m
[31m-      if (cp->ct->size) {[m
[31m-	if (sz) goto end_decl;[m
[31m-	sz = cp->ct->size;[m
[31m-      }[m
[31m-      cbit = (1u << (cp->tok - CTOK_FIRSTDECL));[m
[31m-      cds = cds | cbit | ((cbit & cds & CDF_LONG) << 1);[m
[31m-      if (cp->tok >= CTOK_FIRSTSCL) {[m
[31m-	if (!(scl & cbit)) cp_errmsg(cp, cp->tok, LJ_ERR_FFI_BADSCL);[m
[31m-      } else if (tdef) {[m
[31m-	goto end_decl;[m
[31m-      }[m
[31m-      cp_next(cp);[m
[31m-      continue;[m
[31m-    }[m
[31m-    if (sz || tdef ||[m
[31m-	(cds & (CDF_SHORT|CDF_LONG|CDF_SIGNED|CDF_UNSIGNED|CDF_COMPLEX)))[m
[31m-      break;[m
[31m-    switch (cp->tok) {[m
[31m-    case CTOK_STRUCT:[m
[31m-      tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, 0));[m
[31m-      continue;[m
[31m-    case CTOK_UNION:[m
[31m-      tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, CTF_UNION));[m
[31m-      continue;[m
[31m-    case CTOK_ENUM:[m
[31m-      tdef = cp_decl_enum(cp, decl);[m
[31m-      continue;[m
[31m-    case CTOK_IDENT:[m
[31m-      if (ctype_istypedef(cp->ct->info)) {[m
[31m-	tdef = ctype_cid(cp->ct->info);  /* Get typedef. */[m
[31m-	cp_next(cp);[m
[31m-	continue;[m
[31m-      }[m
[31m-      break;[m
[31m-    case '$':[m
[31m-      tdef = cp->val.id;[m
[31m-      cp_next(cp);[m
[31m-      continue;[m
[31m-    default:[m
[31m-      break;[m
[31m-    }[m
[31m-    break;[m
[31m-  }[m
[31m-end_decl:[m
[31m-[m
[31m-  if ((cds & CDF_COMPLEX))  /* Use predefined complex types. */[m
[31m-    tdef = sz == 4 ? CTID_COMPLEX_FLOAT : CTID_COMPLEX_DOUBLE;[m
[31m-[m
[31m-  if (tdef) {[m
[31m-    cp_push_type(decl, tdef);[m
[31m-  } else if ((cds & CDF_VOID)) {[m
[31m-    cp_push(decl, CTINFO(CT_VOID, (decl->attr & CTF_QUAL)), CTSIZE_INVALID);[m
[31m-    decl->attr &= ~CTF_QUAL;[m
[31m-  } else {[m
[31m-    /* Determine type info and size. */[m
[31m-    CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0);[m
[31m-    if ((cds & CDF_BOOL)) {[m
[31m-      if ((cds & ~(CDF_SCL|CDF_BOOL|CDF_INT|CDF_SIGNED|CDF_UNSIGNED)))[m
[31m-	cp_errmsg(cp, 0, LJ_ERR_FFI_INVTYPE);[m
[31m-      info |= CTF_BOOL;[m
[31m-      if (!(cds & CDF_SIGNED)) info |= CTF_UNSIGNED;[m
[31m-      if (!sz) {[m
[31m-	sz = 1;[m
[31m-      }[m
[31m-    } else if ((cds & CDF_FP)) {[m
[31m-      info = CTINFO(CT_NUM, CTF_FP);[m
[31m-      if ((cds & CDF_LONG)) sz = sizeof(long double);[m
[31m-    } else if ((cds & CDF_CHAR)) {[m
[31m-      if ((cds & (CDF_CHAR|CDF_SIGNED|CDF_UNSIGNED)) == CDF_CHAR)[m
[31m-	info |= CTF_UCHAR;  /* Handle platforms where char is unsigned. */[m
[31m-    } else if ((cds & CDF_SHORT)) {[m
[31m-      sz = sizeof(short);[m
[31m-    } else if ((cds & CDF_LONGLONG)) {[m
[31m-      sz = 8;[m
[31m-    } else if ((cds & CDF_LONG)) {[m
[31m-      info |= CTF_LONG;[m
[31m-      sz = sizeof(long);[m
[31m-    } else if (!sz) {[m
[31m-      if (!(cds & (CDF_SIGNED|CDF_UNSIGNED)))[m
[31m-	cp_errmsg(cp, cp->tok, LJ_ERR_FFI_DECLSPEC);[m
[31m-      sz = sizeof(int);[m
[31m-    }[m
[31m-    lua_assert(sz != 0);[m
[31m-    info += CTALIGN(lj_fls(sz));  /* Use natural alignment. */[m
[31m-    info += (decl->attr & CTF_QUAL);  /* Merge qualifiers. */[m
[31m-    cp_push(decl, info, sz);[m
[31m-    decl->attr &= ~CTF_QUAL;[m
[31m-  }[m
[31m-  decl->specpos = decl->pos;[m
[31m-  decl->specattr = decl->attr;[m
[31m-  decl->specfattr = decl->fattr;[m
[31m-  return (cds & CDF_SCL);  /* Return storage class. */[m
[31m-}[m
[31m-[m
[31m-/* Parse array declaration. */[m
[31m-static void cp_decl_array(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  CTInfo info = CTINFO(CT_ARRAY, 0);[m
[31m-  CTSize nelem = CTSIZE_INVALID;  /* Default size for a[] or a[?]. */[m
[31m-  cp_decl_attributes(cp, decl);[m
[31m-  if (cp_opt(cp, '?'))[m
[31m-    info |= CTF_VLA;  /* Create variable-length array a[?]. */[m
[31m-  else if (cp->tok != ']')[m
[31m-    nelem = cp_expr_ksize(cp);[m
[31m-  cp_check(cp, ']');[m
[31m-  cp_add(decl, info, nelem);[m
[31m-}[m
[31m-[m
[31m-/* Parse function declaration. */[m
[31m-static void cp_decl_func(CPState *cp, CPDecl *fdecl)[m
[31m-{[m
[31m-  CTSize nargs = 0;[m
[31m-  CTInfo info = CTINFO(CT_FUNC, 0);[m
[31m-  CTypeID lastid = 0, anchor = 0;[m
[31m-  if (cp->tok != ')') {[m
[31m-    do {[m
[31m-      CPDecl decl;[m
[31m-      CTypeID ctypeid, fieldid;[m
[31m-      CType *ct;[m
[31m-      if (cp_opt(cp, '.')) {  /* Vararg function. */[m
[31m-	cp_check(cp, '.');  /* Workaround for the minimalistic lexer. */[m
[31m-	cp_check(cp, '.');[m
[31m-	info |= CTF_VARARG;[m
[31m-	break;[m
[31m-      }[m
[31m-      cp_decl_spec(cp, &decl, CDF_REGISTER);[m
[31m-      decl.mode = CPARSE_MODE_DIRECT|CPARSE_MODE_ABSTRACT;[m
[31m-      cp_declarator(cp, &decl);[m
[31m-      ctypeid = cp_decl_intern(cp, &decl);[m
[31m-      ct = ctype_raw(cp->cts, ctypeid);[m
[31m-      if (ctype_isvoid(ct->info))[m
[31m-	break;[m
[31m-      else if (ctype_isrefarray(ct->info))[m
[31m-	ctypeid = lj_ctype_intern(cp->cts,[m
[31m-	  CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ct->info)), CTSIZE_PTR);[m
[31m-      else if (ctype_isfunc(ct->info))[m
[31m-	ctypeid = lj_ctype_intern(cp->cts,[m
[31m-	  CTINFO(CT_PTR, CTALIGN_PTR|ctypeid), CTSIZE_PTR);[m
[31m-      /* Add new parameter. */[m
[31m-      fieldid = lj_ctype_new(cp->cts, &ct);[m
[31m-      if (anchor)[m
[31m-	ctype_get(cp->cts, lastid)->sib = fieldid;[m
[31m-      else[m
[31m-	anchor = fieldid;[m
[31m-      lastid = fieldid;[m
[31m-      if (decl.name) ctype_setname(ct, decl.name);[m
[31m-      ct->info = CTINFO(CT_FIELD, ctypeid);[m
[31m-      ct->size = nargs++;[m
[31m-    } while (cp_opt(cp, ','));[m
[31m-  }[m
[31m-  cp_check(cp, ')');[m
[31m-  if (cp_opt(cp, '{')) {  /* Skip function definition. */[m
[31m-    int level = 1;[m
[31m-    cp->mode |= CPARSE_MODE_SKIP;[m
[31m-    for (;;) {[m
[31m-      if (cp->tok == '{') level++;[m
[31m-      else if (cp->tok == '}' && --level == 0) break;[m
[31m-      else if (cp->tok == CTOK_EOF) cp_err_token(cp, '}');[m
[31m-      cp_next(cp);[m
[31m-    }[m
[31m-    cp->mode &= ~CPARSE_MODE_SKIP;[m
[31m-    cp->tok = ';';  /* Ok for cp_decl_multi(), error in cp_decl_single(). */[m
[31m-  }[m
[31m-  info |= (fdecl->fattr & ~CTMASK_CID);[m
[31m-  fdecl->fattr = 0;[m
[31m-  fdecl->stack[cp_add(fdecl, info, nargs)].sib = anchor;[m
[31m-}[m
[31m-[m
[31m-/* Parse declarator. */[m
[31m-static void cp_declarator(CPState *cp, CPDecl *decl)[m
[31m-{[m
[31m-  if (++cp->depth > CPARSE_MAX_DECLDEPTH) cp_err(cp, LJ_ERR_XLEVELS);[m
[31m-[m
[31m-  for (;;) {  /* Head of declarator. */[m
[31m-    if (cp_opt(cp, '*')) {  /* Pointer. */[m
[31m-      CTSize sz;[m
[31m-      CTInfo info;[m
[31m-      cp_decl_attributes(cp, decl);[m
[31m-      sz = CTSIZE_PTR;[m
[31m-      info = CTINFO(CT_PTR, CTALIGN_PTR);[m
[31m-#if LJ_64[m
[31m-      if (ctype_msizeP(decl->attr) == 4) {[m
[31m-	sz = 4;[m
[31m-	info = CTINFO(CT_PTR, CTALIGN(2));[m
[31m-      }[m
[31m-#endif[m
[31m-      info += (decl->attr & (CTF_QUAL|CTF_REF));[m
[31m-      decl->attr &= ~(CTF_QUAL|(CTMASK_MSIZEP<<CTSHIFT_MSIZEP));[m
[31m-      cp_push(decl, info, sz);[m
[31m-    } else if (cp_opt(cp, '&') || cp_opt(cp, CTOK_ANDAND)) {  /* Reference. */[m
[31m-      decl->attr &= ~(CTF_QUAL|(CTMASK_MSIZEP<<CTSHIFT_MSIZEP));[m
[31m-      cp_push(decl, CTINFO_REF(0), CTSIZE_PTR);[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if (cp_opt(cp, '(')) {  /* Inner declarator. */[m
[31m-    CPDeclIdx pos;[m
[31m-    cp_decl_attributes(cp, decl);[m
[31m-    /* Resolve ambiguity between inner declarator and 1st function parameter. */[m
[31m-    if ((decl->mode & CPARSE_MODE_ABSTRACT) &&[m
[31m-	(cp->tok == ')' || cp_istypedecl(cp))) goto func_decl;[m
[31m-    pos = decl->pos;[m
[31m-    cp_declarator(cp, decl);[m
[31m-    cp_check(cp, ')');[m
[31m-    decl->pos = pos;[m
[31m-  } else if (cp->tok == CTOK_IDENT) {  /* Direct declarator. */[m
[31m-    if (!(decl->mode & CPARSE_MODE_DIRECT)) cp_err_token(cp, CTOK_EOF);[m
[31m-    decl->name = cp->str;[m
[31m-    decl->nameid = cp->val.id;[m
[31m-    cp_next(cp);[m
[31m-  } else {  /* Abstract declarator. */[m
[31m-    if (!(decl->mode & CPARSE_MODE_ABSTRACT)) cp_err_token(cp, CTOK_IDENT);[m
[31m-  }[m
[31m-[m
[31m-  for (;;) {  /* Tail of declarator. */[m
[31m-    if (cp_opt(cp, '[')) {  /* Array. */[m
[31m-      cp_decl_array(cp, decl);[m
[31m-    } else if (cp_opt(cp, '(')) {  /* Function. */[m
[31m-    func_decl:[m
[31m-      cp_decl_func(cp, decl);[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  if ((decl->mode & CPARSE_MODE_FIELD) && cp_opt(cp, ':'))  /* Field width. */[m
[31m-    decl->bits = cp_expr_ksize(cp);[m
[31m-[m
[31m-  /* Process postfix attributes. */[m
[31m-  cp_decl_attributes(cp, decl);[m
[31m-  cp_push_attributes(decl);[m
[31m-[m
[31m-  cp->depth--;[m
[31m-}[m
[31m-[m
[31m-/* Parse an abstract type declaration and return it's C type ID. */[m
[31m-static CTypeID cp_decl_abstract(CPState *cp)[m
[31m-{[m
[31m-  CPDecl decl;[m
[31m-  cp_decl_spec(cp, &decl, 0);[m
[31m-  decl.mode = CPARSE_MODE_ABSTRACT;[m
[31m-  cp_declarator(cp, &decl);[m
[31m-  return cp_decl_intern(cp, &decl);[m
[31m-}[m
[31m-[m
[31m-/* Handle pragmas. */[m
[31m-static void cp_pragma(CPState *cp, BCLine pragmaline)[m
[31m-{[m
[31m-  cp_next(cp);[m
[31m-  if (cp->tok == CTOK_IDENT &&[m
[31m-      cp->str->hash == H_(e79b999f,42ca3e85))  {  /* pack */[m
[31m-    cp_next(cp);[m
[31m-    cp_check(cp, '(');[m
[31m-    if (cp->tok == CTOK_IDENT) {[m
[31m-      if (cp->str->hash == H_(738e923c,a1b65954)) {  /* push */[m
[31m-	if (cp->curpack < CPARSE_MAX_PACKSTACK) {[m
[31m-	  cp->packstack[cp->curpack+1] = cp->packstack[cp->curpack];[m
[31m-	  cp->curpack++;[m
[31m-	}[m
[31m-      } else if (cp->str->hash == H_(6c71cf27,6c71cf27)) {  /* pop */[m
[31m-	if (cp->curpack > 0) cp->curpack--;[m
[31m-      } else {[m
[31m-	cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL);[m
[31m-      }[m
[31m-      cp_next(cp);[m
[31m-      if (!cp_opt(cp, ',')) goto end_pack;[m
[31m-    }[m
[31m-    if (cp->tok == CTOK_INTEGER) {[m
[31m-      cp->packstack[cp->curpack] = cp->val.u32 ? lj_fls(cp->val.u32) : 0;[m
[31m-      cp_next(cp);[m
[31m-    } else {[m
[31m-      cp->packstack[cp->curpack] = 255;[m
[31m-    }[m
[31m-  end_pack:[m
[31m-    cp_check(cp, ')');[m
[31m-  } else {  /* Ignore all other pragmas. */[m
[31m-    while (cp->tok != CTOK_EOF && cp->linenumber == pragmaline)[m
[31m-      cp_next(cp);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Handle line number. */[m
[31m-static void cp_line(CPState *cp, BCLine hashline)[m
[31m-{[m
[31m-  BCLine newline = cp->val.u32;[m
[31m-  /* TODO: Handle file name and include it in error messages. */[m
[31m-  while (cp->tok != CTOK_EOF && cp->linenumber == hashline)[m
[31m-    cp_next(cp);[m
[31m-  cp->linenumber = newline;[m
[31m-}[m
[31m-[m
[31m-/* Parse multiple C declarations of types or extern identifiers. */[m
[31m-static void cp_decl_multi(CPState *cp)[m
[31m-{[m
[31m-  int first = 1;[m
[31m-  while (cp->tok != CTOK_EOF) {[m
[31m-    CPDecl decl;[m
[31m-    CPscl scl;[m
[31m-    if (cp_opt(cp, ';')) {  /* Skip empty statements. */[m
[31m-      first = 0;[m
[31m-      continue;[m
[31m-    }[m
[31m-    if (cp->tok == '#') {  /* Workaround, since we have no preprocessor, yet. */[m
[31m-      BCLine hashline = cp->linenumber;[m
[31m-      CPToken tok = cp_next(cp);[m
[31m-      if (tok == CTOK_INTEGER) {[m
[31m-	cp_line(cp, hashline);[m
[31m-	continue;[m
[31m-      } else if (tok == CTOK_IDENT &&[m
[31m-		 cp->str->hash == H_(187aab88,fcb60b42)) { /* line */[m
[31m-	if (cp_next(cp) != CTOK_INTEGER) cp_err_token(cp, tok);[m
[31m-	cp_line(cp, hashline);[m
[31m-	continue;[m
[31m-      } else if (tok == CTOK_IDENT &&[m
[31m-	  cp->str->hash == H_(f5e6b4f8,1d509107)) { /* pragma */[m
[31m-	cp_pragma(cp, hashline);[m
[31m-	continue;[m
[31m-      } else {[m
[31m-	cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL);[m
[31m-      }[m
[31m-    }[m
[31m-    scl = cp_decl_spec(cp, &decl, CDF_TYPEDEF|CDF_EXTERN|CDF_STATIC);[m
[31m-    if ((cp->tok == ';' || cp->tok == CTOK_EOF) &&[m
[31m-	ctype_istypedef(decl.stack[0].info)) {[m
[31m-      CTInfo info = ctype_rawchild(cp->cts, &decl.stack[0])->info;[m
[31m-      if (ctype_isstruct(info) || ctype_isenum(info))[m
[31m-	goto decl_end;  /* Accept empty declaration of struct/union/enum. */[m
[31m-    }[m
[31m-    for (;;) {[m
[31m-      CTypeID ctypeid;[m
[31m-      cp_declarator(cp, &decl);[m
[31m-      ctypeid = cp_decl_intern(cp, &decl);[m
[31m-      if (decl.name && !decl.nameid) {  /* NYI: redeclarations are ignored. */[m
[31m-	CType *ct;[m
[31m-	CTypeID id;[m
[31m-	if ((scl & CDF_TYPEDEF)) {  /* Create new typedef. */[m
[31m-	  id = lj_ctype_new(cp->cts, &ct);[m
[31m-	  ct->info = CTINFO(CT_TYPEDEF, ctypeid);[m
[31m-	  goto noredir;[m
[31m-	} else if (ctype_isfunc(ctype_get(cp->cts, ctypeid)->info)) {[m
[31m-	  /* Treat both static and extern function declarations as extern. */[m
[31m-	  ct = ctype_get(cp->cts, ctypeid);[m
[31m-	  /* We always get new anonymous functions (typedefs are copied). */[m
[31m-	  lua_assert(gcref(ct->name) == NULL);[m
[31m-	  id = ctypeid;  /* Just name it. */[m
[31m-	} else if ((scl & CDF_STATIC)) {  /* Accept static constants. */[m
[31m-	  id = cp_decl_constinit(cp, &ct, ctypeid);[m
[31m-	  goto noredir;[m
[31m-	} else {  /* External references have extern or no storage class. */[m
[31m-	  id = lj_ctype_new(cp->cts, &ct);[m
[31m-	  ct->info = CTINFO(CT_EXTERN, ctypeid);[m
[31m-	}[m
[31m-	if (decl.redir) {  /* Add attribute for redirected symbol name. */[m
[31m-	  CType *cta;[m
[31m-	  CTypeID aid = lj_ctype_new(cp->cts, &cta);[m
[31m-	  ct = ctype_get(cp->cts, id);  /* Table may have been reallocated. */[m
[31m-	  cta->info = CTINFO(CT_ATTRIB, CTATTRIB(CTA_REDIR));[m
[31m-	  cta->sib = ct->sib;[m
[31m-	  ct->sib = aid;[m
[31m-	  ctype_setname(cta, decl.redir);[m
[31m-	}[m
[31m-      noredir:[m
[31m-	ctype_setname(ct, decl.name);[m
[31m-	lj_ctype_addname(cp->cts, ct, id);[m
[31m-      }[m
[31m-      if (!cp_opt(cp, ',')) break;[m
[31m-      cp_decl_reset(&decl);[m
[31m-    }[m
[31m-  decl_end:[m
[31m-    if (cp->tok == CTOK_EOF && first) break;  /* May omit ';' for 1 decl. */[m
[31m-    first = 0;[m
[31m-    cp_check(cp, ';');[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse a single C type declaration. */[m
[31m-static void cp_decl_single(CPState *cp)[m
[31m-{[m
[31m-  CPDecl decl;[m
[31m-  cp_decl_spec(cp, &decl, 0);[m
[31m-  cp_declarator(cp, &decl);[m
[31m-  cp->val.id = cp_decl_intern(cp, &decl);[m
[31m-  if (cp->tok != CTOK_EOF) cp_err_token(cp, CTOK_EOF);[m
[31m-}[m
[31m-[m
[31m-#undef H_[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Protected callback for C parser. */[m
[31m-static TValue *cpcparser(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  CPState *cp = (CPState *)ud;[m
[31m-  UNUSED(dummy);[m
[31m-  cframe_errfunc(L->cframe) = -1;  /* Inherit error function. */[m
[31m-  cp_init(cp);[m
[31m-  if ((cp->mode & CPARSE_MODE_MULTI))[m
[31m-    cp_decl_multi(cp);[m
[31m-  else[m
[31m-    cp_decl_single(cp);[m
[31m-  if (cp->param && cp->param != cp->L->top)[m
[31m-    cp_err(cp, LJ_ERR_FFI_NUMPARAM);[m
[31m-  lua_assert(cp->depth == 0);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* C parser. */[m
[31m-int lj_cparse(CPState *cp)[m
[31m-{[m
[31m-  LJ_CTYPE_SAVE(cp->cts);[m
[31m-  int errcode = lj_vm_cpcall(cp->L, NULL, cp, cpcparser);[m
[31m-  if (errcode)[m
[31m-    LJ_CTYPE_RESTORE(cp->cts);[m
[31m-  cp_cleanup(cp);[m
[31m-  return errcode;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cparse.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cparse.h[m
[1mdeleted file mode 100644[m
[1mindex bfd1a9b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_cparse.h[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-/*[m
[31m-** C declaration parser.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CPARSE_H[m
[31m-#define _LJ_CPARSE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ctype.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* C parser limits. */[m
[31m-#define CPARSE_MAX_BUF		32768	/* Max. token buffer size. */[m
[31m-#define CPARSE_MAX_DECLSTACK	100	/* Max. declaration stack depth. */[m
[31m-#define CPARSE_MAX_DECLDEPTH	20	/* Max. recursive declaration depth. */[m
[31m-#define CPARSE_MAX_PACKSTACK	7	/* Max. pack pragma stack depth. */[m
[31m-[m
[31m-/* Flags for C parser mode. */[m
[31m-#define CPARSE_MODE_MULTI	1	/* Process multiple declarations. */[m
[31m-#define CPARSE_MODE_ABSTRACT	2	/* Accept abstract declarators. */[m
[31m-#define CPARSE_MODE_DIRECT	4	/* Accept direct declarators. */[m
[31m-#define CPARSE_MODE_FIELD	8	/* Accept field width in bits, too. */[m
[31m-#define CPARSE_MODE_NOIMPLICIT	16	/* Reject implicit declarations. */[m
[31m-#define CPARSE_MODE_SKIP	32	/* Skip definitions, ignore errors. */[m
[31m-[m
[31m-typedef int CPChar;	/* C parser character. Unsigned ext. from char. */[m
[31m-typedef int CPToken;	/* C parser token. */[m
[31m-[m
[31m-/* C parser internal value representation. */[m
[31m-typedef struct CPValue {[m
[31m-  union {[m
[31m-    int32_t i32;	/* Value for CTID_INT32. */[m
[31m-    uint32_t u32;	/* Value for CTID_UINT32. */[m
[31m-  };[m
[31m-  CTypeID id;		/* C Type ID of the value. */[m
[31m-} CPValue;[m
[31m-[m
[31m-/* C parser state. */[m
[31m-typedef struct CPState {[m
[31m-  CPChar c;		/* Current character. */[m
[31m-  CPToken tok;		/* Current token. */[m
[31m-  CPValue val;		/* Token value. */[m
[31m-  GCstr *str;		/* Interned string of identifier/keyword. */[m
[31m-  CType *ct;		/* C type table entry. */[m
[31m-  const char *p;	/* Current position in input buffer. */[m
[31m-  SBuf sb;		/* String buffer for tokens. */[m
[31m-  lua_State *L;		/* Lua state. */[m
[31m-  CTState *cts;		/* C type state. */[m
[31m-  TValue *param;	/* C type parameters. */[m
[31m-  const char *srcname;	/* Current source name. */[m
[31m-  BCLine linenumber;	/* Input line counter. */[m
[31m-  int depth;		/* Recursive declaration depth. */[m
[31m-  uint32_t tmask;	/* Type mask for next identifier. */[m
[31m-  uint32_t mode;	/* C parser mode. */[m
[31m-  uint8_t packstack[CPARSE_MAX_PACKSTACK];  /* Stack for pack pragmas. */[m
[31m-  uint8_t curpack;	/* Current position in pack pragma stack. */[m
[31m-} CPState;[m
[31m-[m
[31m-LJ_FUNC int lj_cparse(CPState *cp);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_crecord.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_crecord.c[m
[1mdeleted file mode 100644[m
[1mindex c0f7e3d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_crecord.c[m
[1m+++ /dev/null[m
[36m@@ -1,1834 +0,0 @@[m
[31m-/*[m
[31m-** Trace recorder for C data operations.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_ffrecord_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT && LJ_HASFFI[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_cparse.h"[m
[31m-#include "lj_cconv.h"[m
[31m-#include "lj_carith.h"[m
[31m-#include "lj_clib.h"[m
[31m-#include "lj_ccall.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_record.h"[m
[31m-#include "lj_ffrecord.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_crecord.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-#define emitconv(a, dt, st, flags) \[m
[31m-  emitir(IRT(IR_CONV, (dt)), (a), (st)|((dt) << 5)|(flags))[m
[31m-[m
[31m-/* -- C type checks ------------------------------------------------------- */[m
[31m-[m
[31m-static GCcdata *argv2cdata(jit_State *J, TRef tr, cTValue *o)[m
[31m-{[m
[31m-  GCcdata *cd;[m
[31m-  TRef trtypeid;[m
[31m-  if (!tref_iscdata(tr))[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  cd = cdataV(o);[m
[31m-  /* Specialize to the CTypeID. */[m
[31m-  trtypeid = emitir(IRT(IR_FLOAD, IRT_U16), tr, IRFL_CDATA_CTYPEID);[m
[31m-  emitir(IRTG(IR_EQ, IRT_INT), trtypeid, lj_ir_kint(J, (int32_t)cd->ctypeid));[m
[31m-  return cd;[m
[31m-}[m
[31m-[m
[31m-/* Specialize to the CTypeID held by a cdata constructor. */[m
[31m-static CTypeID crec_constructor(jit_State *J, GCcdata *cd, TRef tr)[m
[31m-{[m
[31m-  CTypeID id;[m
[31m-  lua_assert(tref_iscdata(tr) && cd->ctypeid == CTID_CTYPEID);[m
[31m-  id = *(CTypeID *)cdataptr(cd);[m
[31m-  tr = emitir(IRT(IR_FLOAD, IRT_INT), tr, IRFL_CDATA_INT);[m
[31m-  emitir(IRTG(IR_EQ, IRT_INT), tr, lj_ir_kint(J, (int32_t)id));[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-static CTypeID argv2ctype(jit_State *J, TRef tr, cTValue *o)[m
[31m-{[m
[31m-  if (tref_isstr(tr)) {[m
[31m-    GCstr *s = strV(o);[m
[31m-    CPState cp;[m
[31m-    CTypeID oldtop;[m
[31m-    /* Specialize to the string containing the C type declaration. */[m
[31m-    emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, s));[m
[31m-    cp.L = J->L;[m
[31m-    cp.cts = ctype_ctsG(J2G(J));[m
[31m-    oldtop = cp.cts->top;[m
[31m-    cp.srcname = strdata(s);[m
[31m-    cp.p = strdata(s);[m
[31m-    cp.param = NULL;[m
[31m-    cp.mode = CPARSE_MODE_ABSTRACT|CPARSE_MODE_NOIMPLICIT;[m
[31m-    if (lj_cparse(&cp) || cp.cts->top > oldtop)  /* Avoid new struct defs. */[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    return cp.val.id;[m
[31m-  } else {[m
[31m-    GCcdata *cd = argv2cdata(J, tr, o);[m
[31m-    return cd->ctypeid == CTID_CTYPEID ? crec_constructor(J, cd, tr) :[m
[31m-					cd->ctypeid;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Convert CType to IRType (if possible). */[m
[31m-static IRType crec_ct2irt(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-  if (LJ_LIKELY(ctype_isnum(ct->info))) {[m
[31m-    if ((ct->info & CTF_FP)) {[m
[31m-      if (ct->size == sizeof(double))[m
[31m-	return IRT_NUM;[m
[31m-      else if (ct->size == sizeof(float))[m
[31m-	return IRT_FLOAT;[m
[31m-    } else {[m
[31m-      uint32_t b = lj_fls(ct->size);[m
[31m-      if (b <= 3)[m
[31m-	return IRT_I8 + 2*b + ((ct->info & CTF_UNSIGNED) ? 1 : 0);[m
[31m-    }[m
[31m-  } else if (ctype_isptr(ct->info)) {[m
[31m-    return (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32;[m
[31m-  } else if (ctype_iscomplex(ct->info)) {[m
[31m-    if (ct->size == 2*sizeof(double))[m
[31m-      return IRT_NUM;[m
[31m-    else if (ct->size == 2*sizeof(float))[m
[31m-      return IRT_FLOAT;[m
[31m-  }[m
[31m-  return IRT_CDATA;[m
[31m-}[m
[31m-[m
[31m-/* -- Optimized memory fill and copy -------------------------------------- */[m
[31m-[m
[31m-/* Maximum length and unroll of inlined copy/fill. */[m
[31m-#define CREC_COPY_MAXUNROLL		16[m
[31m-#define CREC_COPY_MAXLEN		128[m
[31m-[m
[31m-#define CREC_FILL_MAXUNROLL		16[m
[31m-[m
[31m-/* Number of windowed registers used for optimized memory copy. */[m
[31m-#if LJ_TARGET_X86[m
[31m-#define CREC_COPY_REGWIN		2[m
[31m-#elif LJ_TARGET_PPC || LJ_TARGET_MIPS[m
[31m-#define CREC_COPY_REGWIN		8[m
[31m-#else[m
[31m-#define CREC_COPY_REGWIN		4[m
[31m-#endif[m
[31m-[m
[31m-/* List of memory offsets for copy/fill. */[m
[31m-typedef struct CRecMemList {[m
[31m-  CTSize ofs;		/* Offset in bytes. */[m
[31m-  IRType tp;		/* Type of load/store. */[m
[31m-  TRef trofs;		/* TRef of interned offset. */[m
[31m-  TRef trval;		/* TRef of load value. */[m
[31m-} CRecMemList;[m
[31m-[m
[31m-/* Generate copy list for element-wise struct copy. */[m
[31m-static MSize crec_copy_struct(CRecMemList *ml, CTState *cts, CType *ct)[m
[31m-{[m
[31m-  CTypeID fid = ct->sib;[m
[31m-  MSize mlp = 0;[m
[31m-  while (fid) {[m
[31m-    CType *df = ctype_get(cts, fid);[m
[31m-    fid = df->sib;[m
[31m-    if (ctype_isfield(df->info)) {[m
[31m-      CType *cct;[m
[31m-      IRType tp;[m
[31m-      if (!gcref(df->name)) continue;  /* Ignore unnamed fields. */[m
[31m-      cct = ctype_rawchild(cts, df);  /* Field type. */[m
[31m-      tp = crec_ct2irt(cts, cct);[m
[31m-      if (tp == IRT_CDATA) return 0;  /* NYI: aggregates. */[m
[31m-      if (mlp >= CREC_COPY_MAXUNROLL) return 0;[m
[31m-      ml[mlp].ofs = df->size;[m
[31m-      ml[mlp].tp = tp;[m
[31m-      mlp++;[m
[31m-      if (ctype_iscomplex(cct->info)) {[m
[31m-	if (mlp >= CREC_COPY_MAXUNROLL) return 0;[m
[31m-	ml[mlp].ofs = df->size + (cct->size >> 1);[m
[31m-	ml[mlp].tp = tp;[m
[31m-	mlp++;[m
[31m-      }[m
[31m-    } else if (!ctype_isconstval(df->info)) {[m
[31m-      /* NYI: bitfields and sub-structures. */[m
[31m-      return 0;[m
[31m-    }[m
[31m-  }[m
[31m-  return mlp;[m
[31m-}[m
[31m-[m
[31m-/* Generate unrolled copy list, from highest to lowest step size/alignment. */[m
[31m-static MSize crec_copy_unroll(CRecMemList *ml, CTSize len, CTSize step,[m
[31m-			      IRType tp)[m
[31m-{[m
[31m-  CTSize ofs = 0;[m
[31m-  MSize mlp = 0;[m
[31m-  if (tp == IRT_CDATA) tp = IRT_U8 + 2*lj_fls(step);[m
[31m-  do {[m
[31m-    while (ofs + step <= len) {[m
[31m-      if (mlp >= CREC_COPY_MAXUNROLL) return 0;[m
[31m-      ml[mlp].ofs = ofs;[m
[31m-      ml[mlp].tp = tp;[m
[31m-      mlp++;[m
[31m-      ofs += step;[m
[31m-    }[m
[31m-    step >>= 1;[m
[31m-    tp -= 2;[m
[31m-  } while (ofs < len);[m
[31m-  return mlp;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** Emit copy list with windowed loads/stores.[m
[31m-** LJ_TARGET_UNALIGNED: may emit unaligned loads/stores (not marked as such).[m
[31m-*/[m
[31m-static void crec_copy_emit(jit_State *J, CRecMemList *ml, MSize mlp,[m
[31m-			   TRef trdst, TRef trsrc)[m
[31m-{[m
[31m-  MSize i, j, rwin = 0;[m
[31m-  for (i = 0, j = 0; i < mlp; ) {[m
[31m-    TRef trofs = lj_ir_kintp(J, ml[i].ofs);[m
[31m-    TRef trsptr = emitir(IRT(IR_ADD, IRT_PTR), trsrc, trofs);[m
[31m-    ml[i].trval = emitir(IRT(IR_XLOAD, ml[i].tp), trsptr, 0);[m
[31m-    ml[i].trofs = trofs;[m
[31m-    i++;[m
[31m-    rwin += (LJ_SOFTFP && ml[i].tp == IRT_NUM) ? 2 : 1;[m
[31m-    if (rwin >= CREC_COPY_REGWIN || i >= mlp) {  /* Flush buffered stores. */[m
[31m-      rwin = 0;[m
[31m-      for ( ; j < i; j++) {[m
[31m-	TRef trdptr = emitir(IRT(IR_ADD, IRT_PTR), trdst, ml[j].trofs);[m
[31m-	emitir(IRT(IR_XSTORE, ml[j].tp), trdptr, ml[j].trval);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Optimized memory copy. */[m
[31m-static void crec_copy(jit_State *J, TRef trdst, TRef trsrc, TRef trlen,[m
[31m-		      CType *ct)[m
[31m-{[m
[31m-  if (tref_isk(trlen)) {  /* Length must be constant. */[m
[31m-    CRecMemList ml[CREC_COPY_MAXUNROLL];[m
[31m-    MSize mlp = 0;[m
[31m-    CTSize step = 1, len = (CTSize)IR(tref_ref(trlen))->i;[m
[31m-    IRType tp = IRT_CDATA;[m
[31m-    int needxbar = 0;[m
[31m-    if (len == 0) return;  /* Shortcut. */[m
[31m-    if (len > CREC_COPY_MAXLEN) goto fallback;[m
[31m-    if (ct) {[m
[31m-      CTState *cts = ctype_ctsG(J2G(J));[m
[31m-      lua_assert(ctype_isarray(ct->info) || ctype_isstruct(ct->info));[m
[31m-      if (ctype_isarray(ct->info)) {[m
[31m-	CType *cct = ctype_rawchild(cts, ct);[m
[31m-	tp = crec_ct2irt(cts, cct);[m
[31m-	if (tp == IRT_CDATA) goto rawcopy;[m
[31m-	step = lj_ir_type_size[tp];[m
[31m-	lua_assert((len & (step-1)) == 0);[m
[31m-      } else if ((ct->info & CTF_UNION)) {[m
[31m-	step = (1u << ctype_align(ct->info));[m
[31m-	goto rawcopy;[m
[31m-      } else {[m
[31m-	mlp = crec_copy_struct(ml, cts, ct);[m
[31m-	goto emitcopy;[m
[31m-      }[m
[31m-    } else {[m
[31m-    rawcopy:[m
[31m-      needxbar = 1;[m
[31m-      if (LJ_TARGET_UNALIGNED || step >= CTSIZE_PTR)[m
[31m-	step = CTSIZE_PTR;[m
[31m-    }[m
[31m-    mlp = crec_copy_unroll(ml, len, step, tp);[m
[31m-  emitcopy:[m
[31m-    if (mlp) {[m
[31m-      crec_copy_emit(J, ml, mlp, trdst, trsrc);[m
[31m-      if (needxbar)[m
[31m-	emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-fallback:[m
[31m-  /* Call memcpy. Always needs a barrier to disable alias analysis. */[m
[31m-  lj_ir_call(J, IRCALL_memcpy, trdst, trsrc, trlen);[m
[31m-  emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);[m
[31m-}[m
[31m-[m
[31m-/* Generate unrolled fill list, from highest to lowest step size/alignment. */[m
[31m-static MSize crec_fill_unroll(CRecMemList *ml, CTSize len, CTSize step)[m
[31m-{[m
[31m-  CTSize ofs = 0;[m
[31m-  MSize mlp = 0;[m
[31m-  IRType tp = IRT_U8 + 2*lj_fls(step);[m
[31m-  do {[m
[31m-    while (ofs + step <= len) {[m
[31m-      if (mlp >= CREC_COPY_MAXUNROLL) return 0;[m
[31m-      ml[mlp].ofs = ofs;[m
[31m-      ml[mlp].tp = tp;[m
[31m-      mlp++;[m
[31m-      ofs += step;[m
[31m-    }[m
[31m-    step >>= 1;[m
[31m-    tp -= 2;[m
[31m-  } while (ofs < len);[m
[31m-  return mlp;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** Emit stores for fill list.[m
[31m-** LJ_TARGET_UNALIGNED: may emit unaligned stores (not marked as such).[m
[31m-*/[m
[31m-static void crec_fill_emit(jit_State *J, CRecMemList *ml, MSize mlp,[m
[31m-			   TRef trdst, TRef trfill)[m
[31m-{[m
[31m-  MSize i;[m
[31m-  for (i = 0; i < mlp; i++) {[m
[31m-    TRef trofs = lj_ir_kintp(J, ml[i].ofs);[m
[31m-    TRef trdptr = emitir(IRT(IR_ADD, IRT_PTR), trdst, trofs);[m
[31m-    emitir(IRT(IR_XSTORE, ml[i].tp), trdptr, trfill);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Optimized memory fill. */[m
[31m-static void crec_fill(jit_State *J, TRef trdst, TRef trlen, TRef trfill,[m
[31m-		      CTSize step)[m
[31m-{[m
[31m-  if (tref_isk(trlen)) {  /* Length must be constant. */[m
[31m-    CRecMemList ml[CREC_FILL_MAXUNROLL];[m
[31m-    MSize mlp;[m
[31m-    CTSize len = (CTSize)IR(tref_ref(trlen))->i;[m
[31m-    if (len == 0) return;  /* Shortcut. */[m
[31m-    if (LJ_TARGET_UNALIGNED || step >= CTSIZE_PTR)[m
[31m-      step = CTSIZE_PTR;[m
[31m-    if (step * CREC_FILL_MAXUNROLL < len) goto fallback;[m
[31m-    mlp = crec_fill_unroll(ml, len, step);[m
[31m-    if (!mlp) goto fallback;[m
[31m-    if (tref_isk(trfill) || ml[0].tp != IRT_U8)[m
[31m-      trfill = emitconv(trfill, IRT_INT, IRT_U8, 0);[m
[31m-    if (ml[0].tp != IRT_U8) {  /* Scatter U8 to U16/U32/U64. */[m
[31m-      if (CTSIZE_PTR == 8 && ml[0].tp == IRT_U64) {[m
[31m-	if (tref_isk(trfill))  /* Pointless on x64 with zero-extended regs. */[m
[31m-	  trfill = emitconv(trfill, IRT_U64, IRT_U32, 0);[m
[31m-	trfill = emitir(IRT(IR_MUL, IRT_U64), trfill,[m
[31m-			lj_ir_kint64(J, U64x(01010101,01010101)));[m
[31m-      } else {[m
[31m-	trfill = emitir(IRTI(IR_MUL), trfill,[m
[31m-		   lj_ir_kint(J, ml[0].tp == IRT_U16 ? 0x0101 : 0x01010101));[m
[31m-      }[m
[31m-    }[m
[31m-    crec_fill_emit(J, ml, mlp, trdst, trfill);[m
[31m-  } else {[m
[31m-fallback:[m
[31m-    /* Call memset. Always needs a barrier to disable alias analysis. */[m
[31m-    lj_ir_call(J, IRCALL_memset, trdst, trfill, trlen);  /* Note: arg order! */[m
[31m-  }[m
[31m-  emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);[m
[31m-}[m
[31m-[m
[31m-/* -- Convert C type to C type -------------------------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** This code mirrors the code in lj_cconv.c. It performs the same steps[m
[31m-** for the trace recorder that lj_cconv.c does for the interpreter.[m
[31m-**[m
[31m-** One major difference is that we can get away with much fewer checks[m
[31m-** here. E.g. checks for casts, constness or correct types can often be[m
[31m-** omitted, even if they might fail. The interpreter subsequently throws[m
[31m-** an error, which aborts the trace.[m
[31m-**[m
[31m-** All operations are specialized to their C types, so the on-trace[m
[31m-** outcome must be the same as the outcome in the interpreter. If the[m
[31m-** interpreter doesn't throw an error, then the trace is correct, too.[m
[31m-** Care must be taken not to generate invalid (temporary) IR or to[m
[31m-** trigger asserts.[m
[31m-*/[m
[31m-[m
[31m-/* Determine whether a passed number or cdata number is non-zero. */[m
[31m-static int crec_isnonzero(CType *s, void *p)[m
[31m-{[m
[31m-  if (p == (void *)0)[m
[31m-    return 0;[m
[31m-  if (p == (void *)1)[m
[31m-    return 1;[m
[31m-  if ((s->info & CTF_FP)) {[m
[31m-    if (s->size == sizeof(float))[m
[31m-      return (*(float *)p != 0);[m
[31m-    else[m
[31m-      return (*(double *)p != 0);[m
[31m-  } else {[m
[31m-    if (s->size == 1)[m
[31m-      return (*(uint8_t *)p != 0);[m
[31m-    else if (s->size == 2)[m
[31m-      return (*(uint16_t *)p != 0);[m
[31m-    else if (s->size == 4)[m
[31m-      return (*(uint32_t *)p != 0);[m
[31m-    else[m
[31m-      return (*(uint64_t *)p != 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static TRef crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp,[m
[31m-		       void *svisnz)[m
[31m-{[m
[31m-  IRType dt = crec_ct2irt(ctype_ctsG(J2G(J)), d);[m
[31m-  IRType st = crec_ct2irt(ctype_ctsG(J2G(J)), s);[m
[31m-  CTSize dsize = d->size, ssize = s->size;[m
[31m-  CTInfo dinfo = d->info, sinfo = s->info;[m
[31m-[m
[31m-  if (ctype_type(dinfo) > CT_MAYCONVERT || ctype_type(sinfo) > CT_MAYCONVERT)[m
[31m-    goto err_conv;[m
[31m-[m
[31m-  /*[m
[31m-  ** Note: Unlike lj_cconv_ct_ct(), sp holds the _value_ of pointers and[m
[31m-  ** numbers up to 8 bytes. Otherwise sp holds a pointer.[m
[31m-  */[m
[31m-[m
[31m-  switch (cconv_idx2(dinfo, sinfo)) {[m
[31m-  /* Destination is a bool. */[m
[31m-  case CCX(B, B):[m
[31m-    goto xstore;  /* Source operand is already normalized. */[m
[31m-  case CCX(B, I):[m
[31m-  case CCX(B, F):[m
[31m-    if (st != IRT_CDATA) {[m
[31m-      /* Specialize to the result of a comparison against 0. */[m
[31m-      TRef zero = (st == IRT_NUM  || st == IRT_FLOAT) ? lj_ir_knum(J, 0) :[m
[31m-		  (st == IRT_I64 || st == IRT_U64) ? lj_ir_kint64(J, 0) :[m
[31m-		  lj_ir_kint(J, 0);[m
[31m-      int isnz = crec_isnonzero(s, svisnz);[m
[31m-      emitir(IRTG(isnz ? IR_NE : IR_EQ, st), sp, zero);[m
[31m-      sp = lj_ir_kint(J, isnz);[m
[31m-      goto xstore;[m
[31m-    }[m
[31m-    goto err_nyi;[m
[31m-[m
[31m-  /* Destination is an integer. */[m
[31m-  case CCX(I, B):[m
[31m-  case CCX(I, I):[m
[31m-  conv_I_I:[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    /* Extend 32 to 64 bit integer. */[m
[31m-    if (dsize == 8 && ssize < 8 && !(LJ_64 && (sinfo & CTF_UNSIGNED)))[m
[31m-      sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st,[m
[31m-		    (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT);[m
[31m-    else if (dsize < 8 && ssize == 8)  /* Truncate from 64 bit integer. */[m
[31m-      sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0);[m
[31m-    else if (st == IRT_INT)[m
[31m-      sp = lj_opt_narrow_toint(J, sp);[m
[31m-  xstore:[m
[31m-    if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J);[m
[31m-    if (dp == 0) return sp;[m
[31m-    emitir(IRT(IR_XSTORE, dt), dp, sp);[m
[31m-    break;[m
[31m-  case CCX(I, C):[m
[31m-    sp = emitir(IRT(IR_XLOAD, st), sp, 0);  /* Load re. */[m
[31m-    /* fallthrough */[m
[31m-  case CCX(I, F):[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, IRCONV_ANY);[m
[31m-    goto xstore;[m
[31m-  case CCX(I, P):[m
[31m-  case CCX(I, A):[m
[31m-    sinfo = CTINFO(CT_NUM, CTF_UNSIGNED);[m
[31m-    ssize = CTSIZE_PTR;[m
[31m-    st = IRT_UINTP;[m
[31m-    if (((dsize ^ ssize) & 8) == 0) {  /* Must insert no-op type conversion. */[m
[31m-      sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, IRT_PTR, 0);[m
[31m-      goto xstore;[m
[31m-    }[m
[31m-    goto conv_I_I;[m
[31m-[m
[31m-  /* Destination is a floating-point number. */[m
[31m-  case CCX(F, B):[m
[31m-  case CCX(F, I):[m
[31m-  conv_F_I:[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st, 0);[m
[31m-    goto xstore;[m
[31m-  case CCX(F, C):[m
[31m-    sp = emitir(IRT(IR_XLOAD, st), sp, 0);  /* Load re. */[m
[31m-    /* fallthrough */[m
[31m-  case CCX(F, F):[m
[31m-  conv_F_F:[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    if (dt != st) sp = emitconv(sp, dt, st, 0);[m
[31m-    goto xstore;[m
[31m-[m
[31m-  /* Destination is a complex number. */[m
[31m-  case CCX(C, I):[m
[31m-  case CCX(C, F):[m
[31m-    {  /* Clear im. */[m
[31m-      TRef ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, (dsize >> 1)));[m
[31m-      emitir(IRT(IR_XSTORE, dt), ptr, lj_ir_knum(J, 0));[m
[31m-    }[m
[31m-    /* Convert to re. */[m
[31m-    if ((sinfo & CTF_FP)) goto conv_F_F; else goto conv_F_I;[m
[31m-[m
[31m-  case CCX(C, C):[m
[31m-    if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;[m
[31m-    {[m
[31m-      TRef re, im, ptr;[m
[31m-      re = emitir(IRT(IR_XLOAD, st), sp, 0);[m
[31m-      ptr = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, (ssize >> 1)));[m
[31m-      im = emitir(IRT(IR_XLOAD, st), ptr, 0);[m
[31m-      if (dt != st) {[m
[31m-	re = emitconv(re, dt, st, 0);[m
[31m-	im = emitconv(im, dt, st, 0);[m
[31m-      }[m
[31m-      emitir(IRT(IR_XSTORE, dt), dp, re);[m
[31m-      ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, (dsize >> 1)));[m
[31m-      emitir(IRT(IR_XSTORE, dt), ptr, im);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* Destination is a vector. */[m
[31m-  case CCX(V, I):[m
[31m-  case CCX(V, F):[m
[31m-  case CCX(V, C):[m
[31m-  case CCX(V, V):[m
[31m-    goto err_nyi;[m
[31m-[m
[31m-  /* Destination is a pointer. */[m
[31m-  case CCX(P, P):[m
[31m-  case CCX(P, A):[m
[31m-  case CCX(P, S):[m
[31m-    /* There are only 32 bit pointers/addresses on 32 bit machines.[m
[31m-    ** Also ok on x64, since all 32 bit ops clear the upper part of the reg.[m
[31m-    */[m
[31m-    goto xstore;[m
[31m-  case CCX(P, I):[m
[31m-    if (st == IRT_CDATA) goto err_nyi;[m
[31m-    if (!LJ_64 && ssize == 8)  /* Truncate from 64 bit integer. */[m
[31m-      sp = emitconv(sp, IRT_U32, st, 0);[m
[31m-    goto xstore;[m
[31m-  case CCX(P, F):[m
[31m-    if (st == IRT_CDATA) goto err_nyi;[m
[31m-    /* The signed conversion is cheaper. x64 really has 47 bit pointers. */[m
[31m-    sp = emitconv(sp, (LJ_64 && dsize == 8) ? IRT_I64 : IRT_U32,[m
[31m-		  st, IRCONV_ANY);[m
[31m-    goto xstore;[m
[31m-[m
[31m-  /* Destination is an array. */[m
[31m-  case CCX(A, A):[m
[31m-  /* Destination is a struct/union. */[m
[31m-  case CCX(S, S):[m
[31m-    if (dp == 0) goto err_conv;[m
[31m-    crec_copy(J, dp, sp, lj_ir_kint(J, dsize), d);[m
[31m-    break;[m
[31m-[m
[31m-  default:[m
[31m-  err_conv:[m
[31m-  err_nyi:[m
[31m-    lj_trace_err(J, LJ_TRERR_NYICONV);[m
[31m-    break;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* -- Convert C type to TValue (load) ------------------------------------- */[m
[31m-[m
[31m-static TRef crec_tv_ct(jit_State *J, CType *s, CTypeID sid, TRef sp)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  IRType t = crec_ct2irt(cts, s);[m
[31m-  CTInfo sinfo = s->info;[m
[31m-  if (ctype_isnum(sinfo)) {[m
[31m-    TRef tr;[m
[31m-    if (t == IRT_CDATA)[m
[31m-      goto err_nyi;  /* NYI: copyval of >64 bit integers. */[m
[31m-    tr = emitir(IRT(IR_XLOAD, t), sp, 0);[m
[31m-    if (t == IRT_FLOAT || t == IRT_U32) {  /* Keep uint32_t/float as numbers. */[m
[31m-      return emitconv(tr, IRT_NUM, t, 0);[m
[31m-    } else if (t == IRT_I64 || t == IRT_U64) {  /* Box 64 bit integer. */[m
[31m-      sp = tr;[m
[31m-      lj_needsplit(J);[m
[31m-    } else if ((sinfo & CTF_BOOL)) {[m
[31m-      /* Assume not equal to zero. Fixup and emit pending guard later. */[m
[31m-      lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0));[m
[31m-      J->postproc = LJ_POST_FIXGUARD;[m
[31m-      return TREF_TRUE;[m
[31m-    } else {[m
[31m-      return tr;[m
[31m-    }[m
[31m-  } else if (ctype_isptr(sinfo) || ctype_isenum(sinfo)) {[m
[31m-    sp = emitir(IRT(IR_XLOAD, t), sp, 0);  /* Box pointers and enums. */[m
[31m-  } else if (ctype_isrefarray(sinfo) || ctype_isstruct(sinfo)) {[m
[31m-    cts->L = J->L;[m
[31m-    sid = lj_ctype_intern(cts, CTINFO_REF(sid), CTSIZE_PTR);  /* Create ref. */[m
[31m-  } else if (ctype_iscomplex(sinfo)) {  /* Unbox/box complex. */[m
[31m-    ptrdiff_t esz = (ptrdiff_t)(s->size >> 1);[m
[31m-    TRef ptr, tr1, tr2, dp;[m
[31m-    dp = emitir(IRTG(IR_CNEW, IRT_CDATA), lj_ir_kint(J, sid), TREF_NIL);[m
[31m-    tr1 = emitir(IRT(IR_XLOAD, t), sp, 0);[m
[31m-    ptr = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, esz));[m
[31m-    tr2 = emitir(IRT(IR_XLOAD, t), ptr, 0);[m
[31m-    ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-    emitir(IRT(IR_XSTORE, t), ptr, tr1);[m
[31m-    ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, sizeof(GCcdata)+esz));[m
[31m-    emitir(IRT(IR_XSTORE, t), ptr, tr2);[m
[31m-    return dp;[m
[31m-  } else {[m
[31m-    /* NYI: copyval of vectors. */[m
[31m-  err_nyi:[m
[31m-    lj_trace_err(J, LJ_TRERR_NYICONV);[m
[31m-  }[m
[31m-  /* Box pointer, ref, enum or 64 bit integer. */[m
[31m-  return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, sid), sp);[m
[31m-}[m
[31m-[m
[31m-/* -- Convert TValue to C type (store) ------------------------------------ */[m
[31m-[m
[31m-static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID sid = CTID_P_VOID;[m
[31m-  void *svisnz = 0;[m
[31m-  CType *s;[m
[31m-  if (LJ_LIKELY(tref_isinteger(sp))) {[m
[31m-    sid = CTID_INT32;[m
[31m-    svisnz = (void *)(intptr_t)(tvisint(sval)?(intV(sval)!=0):!tviszero(sval));[m
[31m-  } else if (tref_isnum(sp)) {[m
[31m-    sid = CTID_DOUBLE;[m
[31m-    svisnz = (void *)(intptr_t)(tvisint(sval)?(intV(sval)!=0):!tviszero(sval));[m
[31m-  } else if (tref_isbool(sp)) {[m
[31m-    sp = lj_ir_kint(J, tref_istrue(sp) ? 1 : 0);[m
[31m-    sid = CTID_BOOL;[m
[31m-  } else if (tref_isnil(sp)) {[m
[31m-    sp = lj_ir_kptr(J, NULL);[m
[31m-  } else if (tref_isudata(sp)) {[m
[31m-    GCudata *ud = udataV(sval);[m
[31m-    if (ud->udtype == UDTYPE_IO_FILE) {[m
[31m-      TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), sp, IRFL_UDATA_UDTYPE);[m
[31m-      emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE));[m
[31m-      sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_UDATA_FILE);[m
[31m-    } else {[m
[31m-      sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCudata)));[m
[31m-    }[m
[31m-  } else if (tref_isstr(sp)) {[m
[31m-    if (ctype_isenum(d->info)) {  /* Match string against enum constant. */[m
[31m-      GCstr *str = strV(sval);[m
[31m-      CTSize ofs;[m
[31m-      CType *cct = lj_ctype_getfield(cts, d, str, &ofs);[m
[31m-      /* Specialize to the name of the enum constant. */[m
[31m-      emitir(IRTG(IR_EQ, IRT_STR), sp, lj_ir_kstr(J, str));[m
[31m-      if (cct && ctype_isconstval(cct->info)) {[m
[31m-	lua_assert(ctype_child(cts, cct)->size == 4);[m
[31m-	svisnz = (void *)(intptr_t)(ofs != 0);[m
[31m-	sp = lj_ir_kint(J, (int32_t)ofs);[m
[31m-	sid = ctype_cid(cct->info);[m
[31m-      }  /* else: interpreter will throw. */[m
[31m-    } else if (ctype_isrefarray(d->info)) {  /* Copy string to array. */[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);  /* NYI */[m
[31m-    } else {  /* Otherwise pass the string data as a const char[]. */[m
[31m-      /* Don't use STRREF. It folds with SNEW, which loses the trailing NUL. */[m
[31m-      sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCstr)));[m
[31m-      sid = CTID_A_CCHAR;[m
[31m-    }[m
[31m-  } else if (tref_islightud(sp)) {[m
[31m-#if LJ_64[m
[31m-    sp = emitir(IRT(IR_BAND, IRT_P64), sp,[m
[31m-		lj_ir_kint64(J, U64x(00007fff,ffffffff)));[m
[31m-#endif[m
[31m-  } else {  /* NYI: tref_istab(sp). */[m
[31m-    IRType t;[m
[31m-    sid = argv2cdata(J, sp, sval)->ctypeid;[m
[31m-    s = ctype_raw(cts, sid);[m
[31m-    svisnz = cdataptr(cdataV(sval));[m
[31m-    if (ctype_isfunc(s->info)) {[m
[31m-      sid = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|sid), CTSIZE_PTR);[m
[31m-      s = ctype_get(cts, sid);[m
[31m-      t = IRT_PTR;[m
[31m-    } else {[m
[31m-      t = crec_ct2irt(cts, s);[m
[31m-    }[m
[31m-    if (ctype_isptr(s->info)) {[m
[31m-      sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_PTR);[m
[31m-      if (ctype_isref(s->info)) {[m
[31m-	svisnz = *(void **)svisnz;[m
[31m-	s = ctype_rawchild(cts, s);[m
[31m-	if (ctype_isenum(s->info)) s = ctype_child(cts, s);[m
[31m-	t = crec_ct2irt(cts, s);[m
[31m-      } else {[m
[31m-	goto doconv;[m
[31m-      }[m
[31m-    } else if (t == IRT_I64 || t == IRT_U64) {[m
[31m-      sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT64);[m
[31m-      lj_needsplit(J);[m
[31m-      goto doconv;[m
[31m-    } else if (t == IRT_INT || t == IRT_U32) {[m
[31m-      if (ctype_isenum(s->info)) s = ctype_child(cts, s);[m
[31m-      sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT);[m
[31m-      goto doconv;[m
[31m-    } else {[m
[31m-      sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-    }[m
[31m-    if (ctype_isnum(s->info) && t != IRT_CDATA)[m
[31m-      sp = emitir(IRT(IR_XLOAD, t), sp, 0);  /* Load number value. */[m
[31m-    goto doconv;[m
[31m-  }[m
[31m-  s = ctype_get(cts, sid);[m
[31m-doconv:[m
[31m-  if (ctype_isenum(d->info)) d = ctype_child(cts, d);[m
[31m-  return crec_ct_ct(J, d, s, dp, sp, svisnz);[m
[31m-}[m
[31m-[m
[31m-/* -- C data metamethods -------------------------------------------------- */[m
[31m-[m
[31m-/* This would be rather difficult in FOLD, so do it here:[m
[31m-** (base+k)+(idx*sz)+ofs ==> (base+idx*sz)+(ofs+k)[m
[31m-** (base+(idx+k)*sz)+ofs ==> (base+idx*sz)+(ofs+k*sz)[m
[31m-*/[m
[31m-static TRef crec_reassoc_ofs(jit_State *J, TRef tr, ptrdiff_t *ofsp, MSize sz)[m
[31m-{[m
[31m-  IRIns *ir = IR(tref_ref(tr));[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && irref_isk(ir->op2) &&[m
[31m-      (ir->o == IR_ADD || ir->o == IR_ADDOV || ir->o == IR_SUBOV)) {[m
[31m-    IRIns *irk = IR(ir->op2);[m
[31m-    ptrdiff_t k;[m
[31m-    if (LJ_64 && irk->o == IR_KINT64)[m
[31m-      k = (ptrdiff_t)ir_kint64(irk)->u64 * sz;[m
[31m-    else[m
[31m-      k = (ptrdiff_t)irk->i * sz;[m
[31m-    if (ir->o == IR_SUBOV) *ofsp -= k; else *ofsp += k;[m
[31m-    tr = ir->op1;  /* Not a TRef, but the caller doesn't care. */[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Record ctype __index/__newindex metamethods. */[m
[31m-static void crec_index_meta(jit_State *J, CTState *cts, CType *ct,[m
[31m-			    RecordFFData *rd)[m
[31m-{[m
[31m-  CTypeID id = ctype_typeid(cts, ct);[m
[31m-  cTValue *tv = lj_ctype_meta(cts, id, rd->data ? MM_newindex : MM_index);[m
[31m-  if (!tv)[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  if (tvisfunc(tv)) {[m
[31m-    J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;[m
[31m-    rd->nres = -1;  /* Pending tailcall. */[m
[31m-  } else if (rd->data == 0 && tvistab(tv) && tref_isstr(J->base[1])) {[m
[31m-    /* Specialize to result of __index lookup. */[m
[31m-    cTValue *o = lj_tab_get(J->L, tabV(tv), &rd->argv[1]);[m
[31m-    J->base[0] = lj_record_constify(J, o);[m
[31m-    if (!J->base[0])[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    /* Always specialize to the key. */[m
[31m-    emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, strV(&rd->argv[1])));[m
[31m-  } else {[m
[31m-    /* NYI: resolving of non-function metamethods. */[m
[31m-    /* NYI: non-string keys for __index table. */[m
[31m-    /* NYI: stores to __newindex table. */[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef idx, ptr = J->base[0];[m
[31m-  ptrdiff_t ofs = sizeof(GCcdata);[m
[31m-  GCcdata *cd = argv2cdata(J, ptr, &rd->argv[0]);[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  CTypeID sid = 0;[m
[31m-[m
[31m-  /* Resolve pointer or reference for cdata object. */[m
[31m-  if (ctype_isptr(ct->info)) {[m
[31m-    IRType t = (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32;[m
[31m-    if (ctype_isref(ct->info)) ct = ctype_rawchild(cts, ct);[m
[31m-    ptr = emitir(IRT(IR_FLOAD, t), ptr, IRFL_CDATA_PTR);[m
[31m-    ofs = 0;[m
[31m-    ptr = crec_reassoc_ofs(J, ptr, &ofs, 1);[m
[31m-  }[m
[31m-[m
[31m-again:[m
[31m-  idx = J->base[1];[m
[31m-  if (tref_isnumber(idx)) {[m
[31m-    idx = lj_opt_narrow_cindex(J, idx);[m
[31m-    if (ctype_ispointer(ct->info)) {[m
[31m-      CTSize sz;[m
[31m-  integer_key:[m
[31m-      if ((ct->info & CTF_COMPLEX))[m
[31m-	idx = emitir(IRT(IR_BAND, IRT_INTP), idx, lj_ir_kintp(J, 1));[m
[31m-      sz = lj_ctype_size(cts, (sid = ctype_cid(ct->info)));[m
[31m-      idx = crec_reassoc_ofs(J, idx, &ofs, sz);[m
[31m-#if LJ_TARGET_ARM || LJ_TARGET_PPC[m
[31m-      /* Hoist base add to allow fusion of index/shift into operands. */[m
[31m-      if (LJ_LIKELY(J->flags & JIT_F_OPT_LOOP) && ofs[m
[31m-#if LJ_TARGET_ARM[m
[31m-	  && (sz == 1 || sz == 4)[m
[31m-#endif[m
[31m-	  ) {[m
[31m-	ptr = emitir(IRT(IR_ADD, IRT_PTR), ptr, lj_ir_kintp(J, ofs));[m
[31m-	ofs = 0;[m
[31m-      }[m
[31m-#endif[m
[31m-      idx = emitir(IRT(IR_MUL, IRT_INTP), idx, lj_ir_kintp(J, sz));[m
[31m-      ptr = emitir(IRT(IR_ADD, IRT_PTR), idx, ptr);[m
[31m-    }[m
[31m-  } else if (tref_iscdata(idx)) {[m
[31m-    GCcdata *cdk = cdataV(&rd->argv[1]);[m
[31m-    CType *ctk = ctype_raw(cts, cdk->ctypeid);[m
[31m-    IRType t = crec_ct2irt(cts, ctk);[m
[31m-    if (ctype_ispointer(ct->info) && t >= IRT_I8 && t <= IRT_U64) {[m
[31m-      if (ctk->size == 8) {[m
[31m-	idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT64);[m
[31m-      } else if (ctk->size == 4) {[m
[31m-	idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT);[m
[31m-      } else {[m
[31m-	idx = emitir(IRT(IR_ADD, IRT_PTR), idx,[m
[31m-		     lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-	idx = emitir(IRT(IR_XLOAD, t), idx, 0);[m
[31m-      }[m
[31m-      if (LJ_64 && ctk->size < sizeof(intptr_t) && !(ctk->info & CTF_UNSIGNED))[m
[31m-	idx = emitconv(idx, IRT_INTP, IRT_INT, IRCONV_SEXT);[m
[31m-      if (!LJ_64 && ctk->size > sizeof(intptr_t)) {[m
[31m-	idx = emitconv(idx, IRT_INTP, t, 0);[m
[31m-	lj_needsplit(J);[m
[31m-      }[m
[31m-      goto integer_key;[m
[31m-    }[m
[31m-  } else if (tref_isstr(idx)) {[m
[31m-    GCstr *name = strV(&rd->argv[1]);[m
[31m-    if (cd && cd->ctypeid == CTID_CTYPEID)[m
[31m-      ct = ctype_raw(cts, crec_constructor(J, cd, ptr));[m
[31m-    if (ctype_isstruct(ct->info)) {[m
[31m-      CTSize fofs;[m
[31m-      CType *fct;[m
[31m-      fct = lj_ctype_getfield(cts, ct, name, &fofs);[m
[31m-      if (fct) {[m
[31m-	/* Always specialize to the field name. */[m
[31m-	emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name));[m
[31m-	if (ctype_isconstval(fct->info)) {[m
[31m-	  if (fct->size >= 0x80000000u &&[m
[31m-	      (ctype_child(cts, fct)->info & CTF_UNSIGNED)) {[m
[31m-	    J->base[0] = lj_ir_knum(J, (lua_Number)(uint32_t)fct->size);[m
[31m-	    return;[m
[31m-	  }[m
[31m-	  J->base[0] = lj_ir_kint(J, (int32_t)fct->size);[m
[31m-	  return;  /* Interpreter will throw for newindex. */[m
[31m-	} else if (ctype_isbitfield(fct->info)) {[m
[31m-	  lj_trace_err(J, LJ_TRERR_NYICONV);[m
[31m-	} else {[m
[31m-	  lua_assert(ctype_isfield(fct->info));[m
[31m-	  sid = ctype_cid(fct->info);[m
[31m-	}[m
[31m-	ofs += (ptrdiff_t)fofs;[m
[31m-      }[m
[31m-    } else if (ctype_iscomplex(ct->info)) {[m
[31m-      if (name->len == 2 &&[m
[31m-	  ((strdata(name)[0] == 'r' && strdata(name)[1] == 'e') ||[m
[31m-	   (strdata(name)[0] == 'i' && strdata(name)[1] == 'm'))) {[m
[31m-	/* Always specialize to the field name. */[m
[31m-	emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name));[m
[31m-	if (strdata(name)[0] == 'i') ofs += (ct->size >> 1);[m
[31m-	sid = ctype_cid(ct->info);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (!sid) {[m
[31m-    if (ctype_isptr(ct->info)) {  /* Automatically perform '->'. */[m
[31m-      CType *cct = ctype_rawchild(cts, ct);[m
[31m-      if (ctype_isstruct(cct->info)) {[m
[31m-	ct = cct;[m
[31m-	cd = NULL;[m
[31m-	if (tref_isstr(idx)) goto again;[m
[31m-      }[m
[31m-    }[m
[31m-    crec_index_meta(J, cts, ct, rd);[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  if (ofs)[m
[31m-    ptr = emitir(IRT(IR_ADD, IRT_PTR), ptr, lj_ir_kintp(J, ofs));[m
[31m-[m
[31m-  /* Resolve reference for field. */[m
[31m-  ct = ctype_get(cts, sid);[m
[31m-  if (ctype_isref(ct->info)) {[m
[31m-    ptr = emitir(IRT(IR_XLOAD, IRT_PTR), ptr, 0);[m
[31m-    sid = ctype_cid(ct->info);[m
[31m-    ct = ctype_get(cts, sid);[m
[31m-  }[m
[31m-[m
[31m-  while (ctype_isattrib(ct->info))[m
[31m-    ct = ctype_child(cts, ct);  /* Skip attributes. */[m
[31m-[m
[31m-  if (rd->data == 0) {  /* __index metamethod. */[m
[31m-    J->base[0] = crec_tv_ct(J, ct, sid, ptr);[m
[31m-  } else {  /* __newindex metamethod. */[m
[31m-    rd->nres = 0;[m
[31m-    J->needsnap = 1;[m
[31m-    crec_ct_tv(J, ct, ptr, J->base[2], &rd->argv[2]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record setting a finalizer. */[m
[31m-static void crec_finalizer(jit_State *J, TRef trcd, TRef trfin, cTValue *fin)[m
[31m-{[m
[31m-  if (tvisgcv(fin)) {[m
[31m-    if (!trfin) trfin = lj_ir_kptr(J, gcval(fin));[m
[31m-  } else if (tvisnil(fin)) {[m
[31m-    trfin = lj_ir_kptr(J, NULL);[m
[31m-  } else {[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-  lj_ir_call(J, IRCALL_lj_cdata_setfin, trcd,[m
[31m-	     trfin, lj_ir_kint(J, (int32_t)itype(fin)));[m
[31m-  J->needsnap = 1;[m
[31m-}[m
[31m-[m
[31m-/* Record cdata allocation. */[m
[31m-static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTSize sz;[m
[31m-  CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-  CType *d = ctype_raw(cts, id);[m
[31m-  TRef trcd, trid = lj_ir_kint(J, id);[m
[31m-  cTValue *fin;[m
[31m-  /* Use special instruction to box pointer or 32/64 bit integer. */[m
[31m-  if (ctype_isptr(info) || (ctype_isinteger(info) && (sz == 4 || sz == 8))) {[m
[31m-    TRef sp = J->base[1] ? crec_ct_tv(J, d, 0, J->base[1], &rd->argv[1]) :[m
[31m-	      ctype_isptr(info) ? lj_ir_kptr(J, NULL) :[m
[31m-	      sz == 4 ? lj_ir_kint(J, 0) :[m
[31m-	      (lj_needsplit(J), lj_ir_kint64(J, 0));[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), trid, sp);[m
[31m-    return;[m
[31m-  } else {[m
[31m-    TRef trsz = TREF_NIL;[m
[31m-    if ((info & CTF_VLA)) {  /* Calculate VLA/VLS size at runtime. */[m
[31m-      CTSize sz0, sz1;[m
[31m-      if (!J->base[1] || J->base[2])[m
[31m-	lj_trace_err(J, LJ_TRERR_NYICONV);  /* NYI: init VLA/VLS. */[m
[31m-      trsz = crec_ct_tv(J, ctype_get(cts, CTID_INT32), 0,[m
[31m-			J->base[1], &rd->argv[1]);[m
[31m-      sz0 = lj_ctype_vlsize(cts, d, 0);[m
[31m-      sz1 = lj_ctype_vlsize(cts, d, 1);[m
[31m-      trsz = emitir(IRTGI(IR_MULOV), trsz, lj_ir_kint(J, (int32_t)(sz1-sz0)));[m
[31m-      trsz = emitir(IRTGI(IR_ADDOV), trsz, lj_ir_kint(J, (int32_t)sz0));[m
[31m-      J->base[1] = 0;  /* Simplify logic below. */[m
[31m-    } else if (ctype_align(info) > CT_MEMALIGN) {[m
[31m-      trsz = lj_ir_kint(J, sz);[m
[31m-    }[m
[31m-    trcd = emitir(IRTG(IR_CNEW, IRT_CDATA), trid, trsz);[m
[31m-    if (sz > 128 || (info & CTF_VLA)) {[m
[31m-      TRef dp;[m
[31m-      CTSize align;[m
[31m-    special:  /* Only handle bulk zero-fill for large/VLA/VLS types. */[m
[31m-      if (J->base[1])[m
[31m-	lj_trace_err(J, LJ_TRERR_NYICONV);  /* NYI: init large/VLA/VLS types. */[m
[31m-      dp = emitir(IRT(IR_ADD, IRT_PTR), trcd, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-      if (trsz == TREF_NIL) trsz = lj_ir_kint(J, sz);[m
[31m-      align = ctype_align(info);[m
[31m-      if (align < CT_MEMALIGN) align = CT_MEMALIGN;[m
[31m-      crec_fill(J, dp, trsz, lj_ir_kint(J, 0), (1u << align));[m
[31m-    } else if (J->base[1] && !J->base[2] &&[m
[31m-	!lj_cconv_multi_init(cts, d, &rd->argv[1])) {[m
[31m-      goto single_init;[m
[31m-    } else if (ctype_isarray(d->info)) {[m
[31m-      CType *dc = ctype_rawchild(cts, d);  /* Array element type. */[m
[31m-      CTSize ofs, esize = dc->size;[m
[31m-      TRef sp = 0;[m
[31m-      TValue tv;[m
[31m-      TValue *sval = &tv;[m
[31m-      MSize i;[m
[31m-      tv.u64 = 0;[m
[31m-      if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info)) ||[m
[31m-	  esize * CREC_FILL_MAXUNROLL < sz)[m
[31m-	goto special;[m
[31m-      for (i = 1, ofs = 0; ofs < sz; ofs += esize) {[m
[31m-	TRef dp = emitir(IRT(IR_ADD, IRT_PTR), trcd,[m
[31m-			 lj_ir_kintp(J, ofs + sizeof(GCcdata)));[m
[31m-	if (J->base[i]) {[m
[31m-	  sp = J->base[i];[m
[31m-	  sval = &rd->argv[i];[m
[31m-	  i++;[m
[31m-	} else if (i != 2) {[m
[31m-	  sp = ctype_isnum(dc->info) ? lj_ir_kint(J, 0) : TREF_NIL;[m
[31m-	}[m
[31m-	crec_ct_tv(J, dc, dp, sp, sval);[m
[31m-      }[m
[31m-    } else if (ctype_isstruct(d->info)) {[m
[31m-      CTypeID fid = d->sib;[m
[31m-      MSize i = 1;[m
[31m-      while (fid) {[m
[31m-	CType *df = ctype_get(cts, fid);[m
[31m-	fid = df->sib;[m
[31m-	if (ctype_isfield(df->info)) {[m
[31m-	  CType *dc;[m
[31m-	  TRef sp, dp;[m
[31m-	  TValue tv;[m
[31m-	  TValue *sval = &tv;[m
[31m-	  setintV(&tv, 0);[m
[31m-	  if (!gcref(df->name)) continue;  /* Ignore unnamed fields. */[m
[31m-	  dc = ctype_rawchild(cts, df);  /* Field type. */[m
[31m-	  if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info) ||[m
[31m-		ctype_isenum(dc->info)))[m
[31m-	    lj_trace_err(J, LJ_TRERR_NYICONV);  /* NYI: init aggregates. */[m
[31m-	  if (J->base[i]) {[m
[31m-	    sp = J->base[i];[m
[31m-	    sval = &rd->argv[i];[m
[31m-	    i++;[m
[31m-	  } else {[m
[31m-	    sp = ctype_isptr(dc->info) ? TREF_NIL : lj_ir_kint(J, 0);[m
[31m-	  }[m
[31m-	  dp = emitir(IRT(IR_ADD, IRT_PTR), trcd,[m
[31m-		      lj_ir_kintp(J, df->size + sizeof(GCcdata)));[m
[31m-	  crec_ct_tv(J, dc, dp, sp, sval);[m
[31m-	} else if (!ctype_isconstval(df->info)) {[m
[31m-	  /* NYI: init bitfields and sub-structures. */[m
[31m-	  lj_trace_err(J, LJ_TRERR_NYICONV);[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      TRef dp;[m
[31m-    single_init:[m
[31m-      dp = emitir(IRT(IR_ADD, IRT_PTR), trcd, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-      if (J->base[1]) {[m
[31m-	crec_ct_tv(J, d, dp, J->base[1], &rd->argv[1]);[m
[31m-      } else {[m
[31m-	TValue tv;[m
[31m-	tv.u64 = 0;[m
[31m-	crec_ct_tv(J, d, dp, lj_ir_kint(J, 0), &tv);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  J->base[0] = trcd;[m
[31m-  /* Handle __gc metamethod. */[m
[31m-  fin = lj_ctype_meta(cts, id, MM_gc);[m
[31m-  if (fin)[m
[31m-    crec_finalizer(J, trcd, 0, fin);[m
[31m-}[m
[31m-[m
[31m-/* Record argument conversions. */[m
[31m-static TRef crec_call_args(jit_State *J, RecordFFData *rd,[m
[31m-			   CTState *cts, CType *ct)[m
[31m-{[m
[31m-  TRef args[CCI_NARGS_MAX];[m
[31m-  CTypeID fid;[m
[31m-  MSize i, n;[m
[31m-  TRef tr, *base;[m
[31m-  cTValue *o;[m
[31m-#if LJ_TARGET_X86[m
[31m-#if LJ_ABI_WIN[m
[31m-  TRef *arg0 = NULL, *arg1 = NULL;[m
[31m-#endif[m
[31m-  int ngpr = 0;[m
[31m-  if (ctype_cconv(ct->info) == CTCC_THISCALL)[m
[31m-    ngpr = 1;[m
[31m-  else if (ctype_cconv(ct->info) == CTCC_FASTCALL)[m
[31m-    ngpr = 2;[m
[31m-#endif[m
[31m-[m
[31m-  /* Skip initial attributes. */[m
[31m-  fid = ct->sib;[m
[31m-  while (fid) {[m
[31m-    CType *ctf = ctype_get(cts, fid);[m
[31m-    if (!ctype_isattrib(ctf->info)) break;[m
[31m-    fid = ctf->sib;[m
[31m-  }[m
[31m-  args[0] = TREF_NIL;[m
[31m-  for (n = 0, base = J->base+1, o = rd->argv+1; *base; n++, base++, o++) {[m
[31m-    CTypeID did;[m
[31m-    CType *d;[m
[31m-[m
[31m-    if (n >= CCI_NARGS_MAX)[m
[31m-      lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-[m
[31m-    if (fid) {  /* Get argument type from field. */[m
[31m-      CType *ctf = ctype_get(cts, fid);[m
[31m-      fid = ctf->sib;[m
[31m-      lua_assert(ctype_isfield(ctf->info));[m
[31m-      did = ctype_cid(ctf->info);[m
[31m-    } else {[m
[31m-      if (!(ct->info & CTF_VARARG))[m
[31m-	lj_trace_err(J, LJ_TRERR_NYICALL);  /* Too many arguments. */[m
[31m-      did = lj_ccall_ctid_vararg(cts, o);  /* Infer vararg type. */[m
[31m-    }[m
[31m-    d = ctype_raw(cts, did);[m
[31m-    if (!(ctype_isnum(d->info) || ctype_isptr(d->info) ||[m
[31m-	  ctype_isenum(d->info)))[m
[31m-      lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-    tr = crec_ct_tv(J, d, 0, *base, o);[m
[31m-    if (ctype_isinteger_or_bool(d->info)) {[m
[31m-      if (d->size < 4) {[m
[31m-	if ((d->info & CTF_UNSIGNED))[m
[31m-	  tr = emitconv(tr, IRT_INT, d->size==1 ? IRT_U8 : IRT_U16, 0);[m
[31m-	else[m
[31m-	  tr = emitconv(tr, IRT_INT, d->size==1 ? IRT_I8 : IRT_I16,IRCONV_SEXT);[m
[31m-      }[m
[31m-    } else if (LJ_SOFTFP && ctype_isfp(d->info) && d->size > 4) {[m
[31m-      lj_needsplit(J);[m
[31m-    }[m
[31m-#if LJ_TARGET_X86[m
[31m-    /* 64 bit args must not end up in registers for fastcall/thiscall. */[m
[31m-#if LJ_ABI_WIN[m
[31m-    if (!ctype_isfp(d->info)) {[m
[31m-      /* Sigh, the Windows/x86 ABI allows reordering across 64 bit args. */[m
[31m-      if (tref_typerange(tr, IRT_I64, IRT_U64)) {[m
[31m-	if (ngpr) {[m
[31m-	  arg0 = &args[n]; args[n++] = TREF_NIL; ngpr--;[m
[31m-	  if (ngpr) {[m
[31m-	    arg1 = &args[n]; args[n++] = TREF_NIL; ngpr--;[m
[31m-	  }[m
[31m-	}[m
[31m-      } else {[m
[31m-	if (arg0) { *arg0 = tr; arg0 = NULL; n--; continue; }[m
[31m-	if (arg1) { *arg1 = tr; arg1 = NULL; n--; continue; }[m
[31m-	if (ngpr) ngpr--;[m
[31m-      }[m
[31m-    }[m
[31m-#else[m
[31m-    if (!ctype_isfp(d->info) && ngpr) {[m
[31m-      if (tref_typerange(tr, IRT_I64, IRT_U64)) {[m
[31m-	/* No reordering for other x86 ABIs. Simply add alignment args. */[m
[31m-	do { args[n++] = TREF_NIL; } while (--ngpr);[m
[31m-      } else {[m
[31m-	ngpr--;[m
[31m-      }[m
[31m-    }[m
[31m-#endif[m
[31m-#endif[m
[31m-    args[n] = tr;[m
[31m-  }[m
[31m-  tr = args[0];[m
[31m-  for (i = 1; i < n; i++)[m
[31m-    tr = emitir(IRT(IR_CARG, IRT_NIL), tr, args[i]);[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Create a snapshot for the caller, simulating a 'false' return value. */[m
[31m-static void crec_snap_caller(jit_State *J)[m
[31m-{[m
[31m-  lua_State *L = J->L;[m
[31m-  TValue *base = L->base, *top = L->top;[m
[31m-  const BCIns *pc = J->pc;[m
[31m-  TRef ftr = J->base[-1];[m
[31m-  ptrdiff_t delta;[m
[31m-  if (!frame_islua(base-1) || J->framedepth <= 0)[m
[31m-    lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-  J->pc = frame_pc(base-1); delta = 1+LJ_FR2+bc_a(J->pc[-1]);[m
[31m-  L->top = base; L->base = base - delta;[m
[31m-  J->base[-1] = TREF_FALSE;[m
[31m-  J->base -= delta; J->baseslot -= (BCReg)delta;[m
[31m-  J->maxslot = (BCReg)delta; J->framedepth--;[m
[31m-  lj_snap_add(J);[m
[31m-  L->base = base; L->top = top;[m
[31m-  J->framedepth++; J->maxslot = 1;[m
[31m-  J->base += delta; J->baseslot += (BCReg)delta;[m
[31m-  J->base[-1] = ftr; J->pc = pc;[m
[31m-}[m
[31m-[m
[31m-/* Record function call. */[m
[31m-static int crec_call(jit_State *J, RecordFFData *rd, GCcdata *cd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CType *ct = ctype_raw(cts, cd->ctypeid);[m
[31m-  IRType tp = IRT_PTR;[m
[31m-  if (ctype_isptr(ct->info)) {[m
[31m-    tp = (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32;[m
[31m-    ct = ctype_rawchild(cts, ct);[m
[31m-  }[m
[31m-  if (ctype_isfunc(ct->info)) {[m
[31m-    TRef func = emitir(IRT(IR_FLOAD, tp), J->base[0], IRFL_CDATA_PTR);[m
[31m-    CType *ctr = ctype_rawchild(cts, ct);[m
[31m-    IRType t = crec_ct2irt(cts, ctr);[m
[31m-    TRef tr;[m
[31m-    TValue tv;[m
[31m-    /* Check for blacklisted C functions that might call a callback. */[m
[31m-    setlightudV(&tv,[m
[31m-		cdata_getptr(cdataptr(cd), (LJ_64 && tp == IRT_P64) ? 8 : 4));[m
[31m-    if (tvistrue(lj_tab_get(J->L, cts->miscmap, &tv)))[m
[31m-      lj_trace_err(J, LJ_TRERR_BLACKL);[m
[31m-    if (ctype_isvoid(ctr->info)) {[m
[31m-      t = IRT_NIL;[m
[31m-      rd->nres = 0;[m
[31m-    } else if (!(ctype_isnum(ctr->info) || ctype_isptr(ctr->info) ||[m
[31m-		 ctype_isenum(ctr->info)) || t == IRT_CDATA) {[m
[31m-      lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-    }[m
[31m-    if ((ct->info & CTF_VARARG)[m
[31m-#if LJ_TARGET_X86[m
[31m-	|| ctype_cconv(ct->info) != CTCC_CDECL[m
[31m-#endif[m
[31m-	)[m
[31m-      func = emitir(IRT(IR_CARG, IRT_NIL), func,[m
[31m-		    lj_ir_kint(J, ctype_typeid(cts, ct)));[m
[31m-    tr = emitir(IRT(IR_CALLXS, t), crec_call_args(J, rd, cts, ct), func);[m
[31m-    if (ctype_isbool(ctr->info)) {[m
[31m-      if (frame_islua(J->L->base-1) && bc_b(frame_pc(J->L->base-1)[-1]) == 1) {[m
[31m-	/* Don't check result if ignored. */[m
[31m-	tr = TREF_NIL;[m
[31m-      } else {[m
[31m-	crec_snap_caller(J);[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-	/* Note: only the x86/x64 backend supports U8 and only for EQ(tr, 0). */[m
[31m-	lj_ir_set(J, IRTG(IR_NE, IRT_U8), tr, lj_ir_kint(J, 0));[m
[31m-#else[m
[31m-	lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0));[m
[31m-#endif[m
[31m-	J->postproc = LJ_POST_FIXGUARDSNAP;[m
[31m-	tr = TREF_TRUE;[m
[31m-      }[m
[31m-    } else if (t == IRT_PTR || (LJ_64 && t == IRT_P32) ||[m
[31m-	       t == IRT_I64 || t == IRT_U64 || ctype_isenum(ctr->info)) {[m
[31m-      TRef trid = lj_ir_kint(J, ctype_cid(ct->info));[m
[31m-      tr = emitir(IRTG(IR_CNEWI, IRT_CDATA), trid, tr);[m
[31m-      if (t == IRT_I64 || t == IRT_U64) lj_needsplit(J);[m
[31m-    } else if (t == IRT_FLOAT || t == IRT_U32) {[m
[31m-      tr = emitconv(tr, IRT_NUM, t, 0);[m
[31m-    } else if (t == IRT_I8 || t == IRT_I16) {[m
[31m-      tr = emitconv(tr, IRT_INT, t, IRCONV_SEXT);[m
[31m-    } else if (t == IRT_U8 || t == IRT_U16) {[m
[31m-      tr = emitconv(tr, IRT_INT, t, 0);[m
[31m-    }[m
[31m-    J->base[0] = tr;[m
[31m-    J->needsnap = 1;[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  GCcdata *cd = argv2cdata(J, J->base[0], &rd->argv[0]);[m
[31m-  CTypeID id = cd->ctypeid;[m
[31m-  CType *ct;[m
[31m-  cTValue *tv;[m
[31m-  MMS mm = MM_call;[m
[31m-  if (id == CTID_CTYPEID) {[m
[31m-    id = crec_constructor(J, cd, J->base[0]);[m
[31m-    mm = MM_new;[m
[31m-  } else if (crec_call(J, rd, cd)) {[m
[31m-    return;[m
[31m-  }[m
[31m-  /* Record ctype __call/__new metamethod. */[m
[31m-  ct = ctype_raw(cts, id);[m
[31m-  tv = lj_ctype_meta(cts, ctype_isptr(ct->info) ? ctype_cid(ct->info) : id, mm);[m
[31m-  if (tv) {[m
[31m-    if (tvisfunc(tv)) {[m
[31m-      J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;[m
[31m-      rd->nres = -1;  /* Pending tailcall. */[m
[31m-      return;[m
[31m-    }[m
[31m-  } else if (mm == MM_new) {[m
[31m-    crec_alloc(J, rd, id);[m
[31m-    return;[m
[31m-  }[m
[31m-  /* No metamethod or NYI: non-function metamethods. */[m
[31m-  lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-}[m
[31m-[m
[31m-static TRef crec_arith_int64(jit_State *J, TRef *sp, CType **s, MMS mm)[m
[31m-{[m
[31m-  if (ctype_isnum(s[0]->info) && ctype_isnum(s[1]->info)) {[m
[31m-    IRType dt;[m
[31m-    CTypeID id;[m
[31m-    TRef tr;[m
[31m-    MSize i;[m
[31m-    IROp op;[m
[31m-    lj_needsplit(J);[m
[31m-    if (((s[0]->info & CTF_UNSIGNED) && s[0]->size == 8) ||[m
[31m-	((s[1]->info & CTF_UNSIGNED) && s[1]->size == 8)) {[m
[31m-      dt = IRT_U64; id = CTID_UINT64;[m
[31m-    } else {[m
[31m-      dt = IRT_I64; id = CTID_INT64;[m
[31m-      if (mm < MM_add &&[m
[31m-	  !((s[0]->info | s[1]->info) & CTF_FP) &&[m
[31m-	  s[0]->size == 4 && s[1]->size == 4) {  /* Try to narrow comparison. */[m
[31m-	if (!((s[0]->info ^ s[1]->info) & CTF_UNSIGNED) ||[m
[31m-	    (tref_isk(sp[1]) && IR(tref_ref(sp[1]))->i >= 0)) {[m
[31m-	  dt = (s[0]->info & CTF_UNSIGNED) ? IRT_U32 : IRT_INT;[m
[31m-	  goto comp;[m
[31m-	} else if (tref_isk(sp[0]) && IR(tref_ref(sp[0]))->i >= 0) {[m
[31m-	  dt = (s[1]->info & CTF_UNSIGNED) ? IRT_U32 : IRT_INT;[m
[31m-	  goto comp;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    for (i = 0; i < 2; i++) {[m
[31m-      IRType st = tref_type(sp[i]);[m
[31m-      if (st == IRT_NUM || st == IRT_FLOAT)[m
[31m-	sp[i] = emitconv(sp[i], dt, st, IRCONV_ANY);[m
[31m-      else if (!(st == IRT_I64 || st == IRT_U64))[m
[31m-	sp[i] = emitconv(sp[i], dt, IRT_INT,[m
[31m-			 (s[i]->info & CTF_UNSIGNED) ? 0 : IRCONV_SEXT);[m
[31m-    }[m
[31m-    if (mm < MM_add) {[m
[31m-    comp:[m
[31m-      /* Assume true comparison. Fixup and emit pending guard later. */[m
[31m-      if (mm == MM_eq) {[m
[31m-	op = IR_EQ;[m
[31m-      } else {[m
[31m-	op = mm == MM_lt ? IR_LT : IR_LE;[m
[31m-	if (dt == IRT_U32 || dt == IRT_U64)[m
[31m-	  op += (IR_ULT-IR_LT);[m
[31m-      }[m
[31m-      lj_ir_set(J, IRTG(op, dt), sp[0], sp[1]);[m
[31m-      J->postproc = LJ_POST_FIXGUARD;[m
[31m-      return TREF_TRUE;[m
[31m-    } else {[m
[31m-      tr = emitir(IRT(mm+(int)IR_ADD-(int)MM_add, dt), sp[0], sp[1]);[m
[31m-    }[m
[31m-    return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static TRef crec_arith_ptr(jit_State *J, TRef *sp, CType **s, MMS mm)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CType *ctp = s[0];[m
[31m-  if (ctype_isptr(ctp->info) || ctype_isrefarray(ctp->info)) {[m
[31m-    if ((mm == MM_sub || mm == MM_eq || mm == MM_lt || mm == MM_le) &&[m
[31m-	(ctype_isptr(s[1]->info) || ctype_isrefarray(s[1]->info))) {[m
[31m-      if (mm == MM_sub) {  /* Pointer difference. */[m
[31m-	TRef tr;[m
[31m-	CTSize sz = lj_ctype_size(cts, ctype_cid(ctp->info));[m
[31m-	if (sz == 0 || (sz & (sz-1)) != 0)[m
[31m-	  return 0;  /* NYI: integer division. */[m
[31m-	tr = emitir(IRT(IR_SUB, IRT_INTP), sp[0], sp[1]);[m
[31m-	tr = emitir(IRT(IR_BSAR, IRT_INTP), tr, lj_ir_kint(J, lj_fls(sz)));[m
[31m-#if LJ_64[m
[31m-	tr = emitconv(tr, IRT_NUM, IRT_INTP, 0);[m
[31m-#endif[m
[31m-	return tr;[m
[31m-      } else {  /* Pointer comparison (unsigned). */[m
[31m-	/* Assume true comparison. Fixup and emit pending guard later. */[m
[31m-	IROp op = mm == MM_eq ? IR_EQ : mm == MM_lt ? IR_ULT : IR_ULE;[m
[31m-	lj_ir_set(J, IRTG(op, IRT_PTR), sp[0], sp[1]);[m
[31m-	J->postproc = LJ_POST_FIXGUARD;[m
[31m-	return TREF_TRUE;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!((mm == MM_add || mm == MM_sub) && ctype_isnum(s[1]->info)))[m
[31m-      return 0;[m
[31m-  } else if (mm == MM_add && ctype_isnum(ctp->info) &&[m
[31m-	     (ctype_isptr(s[1]->info) || ctype_isrefarray(s[1]->info))) {[m
[31m-    TRef tr = sp[0]; sp[0] = sp[1]; sp[1] = tr;  /* Swap pointer and index. */[m
[31m-    ctp = s[1];[m
[31m-  } else {[m
[31m-    return 0;[m
[31m-  }[m
[31m-  {[m
[31m-    TRef tr = sp[1];[m
[31m-    IRType t = tref_type(tr);[m
[31m-    CTSize sz = lj_ctype_size(cts, ctype_cid(ctp->info));[m
[31m-    CTypeID id;[m
[31m-#if LJ_64[m
[31m-    if (t == IRT_NUM || t == IRT_FLOAT)[m
[31m-      tr = emitconv(tr, IRT_INTP, t, IRCONV_ANY);[m
[31m-    else if (!(t == IRT_I64 || t == IRT_U64))[m
[31m-      tr = emitconv(tr, IRT_INTP, IRT_INT,[m
[31m-		    ((t - IRT_I8) & 1) ? 0 : IRCONV_SEXT);[m
[31m-#else[m
[31m-    if (!tref_typerange(sp[1], IRT_I8, IRT_U32)) {[m
[31m-      tr = emitconv(tr, IRT_INTP, t,[m
[31m-		    (t == IRT_NUM || t == IRT_FLOAT) ? IRCONV_ANY : 0);[m
[31m-    }[m
[31m-#endif[m
[31m-    tr = emitir(IRT(IR_MUL, IRT_INTP), tr, lj_ir_kintp(J, sz));[m
[31m-    tr = emitir(IRT(mm+(int)IR_ADD-(int)MM_add, IRT_PTR), sp[0], tr);[m
[31m-    id = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ctp->info)),[m
[31m-			 CTSIZE_PTR);[m
[31m-    return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record ctype arithmetic metamethods. */[m
[31m-static TRef crec_arith_meta(jit_State *J, TRef *sp, CType **s, CTState *cts,[m
[31m-			    RecordFFData *rd)[m
[31m-{[m
[31m-  cTValue *tv = NULL;[m
[31m-  if (J->base[0]) {[m
[31m-    if (tviscdata(&rd->argv[0])) {[m
[31m-      CTypeID id = argv2cdata(J, J->base[0], &rd->argv[0])->ctypeid;[m
[31m-      CType *ct = ctype_raw(cts, id);[m
[31m-      if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-      tv = lj_ctype_meta(cts, id, (MMS)rd->data);[m
[31m-    }[m
[31m-    if (!tv && J->base[1] && tviscdata(&rd->argv[1])) {[m
[31m-      CTypeID id = argv2cdata(J, J->base[1], &rd->argv[1])->ctypeid;[m
[31m-      CType *ct = ctype_raw(cts, id);[m
[31m-      if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);[m
[31m-      tv = lj_ctype_meta(cts, id, (MMS)rd->data);[m
[31m-    }[m
[31m-  }[m
[31m-  if (tv) {[m
[31m-    if (tvisfunc(tv)) {[m
[31m-      J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME;[m
[31m-      rd->nres = -1;  /* Pending tailcall. */[m
[31m-      return 0;[m
[31m-    }  /* NYI: non-function metamethods. */[m
[31m-  } else if ((MMS)rd->data == MM_eq) {  /* Fallback cdata pointer comparison. */[m
[31m-    if (sp[0] && sp[1] && ctype_isnum(s[0]->info) == ctype_isnum(s[1]->info)) {[m
[31m-      /* Assume true comparison. Fixup and emit pending guard later. */[m
[31m-      lj_ir_set(J, IRTG(IR_EQ, IRT_PTR), sp[0], sp[1]);[m
[31m-      J->postproc = LJ_POST_FIXGUARD;[m
[31m-      return TREF_TRUE;[m
[31m-    } else {[m
[31m-      return TREF_FALSE;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef sp[2];[m
[31m-  CType *s[2];[m
[31m-  MSize i;[m
[31m-  for (i = 0; i < 2; i++) {[m
[31m-    TRef tr = J->base[i];[m
[31m-    CType *ct = ctype_get(cts, CTID_DOUBLE);[m
[31m-    if (!tr) {[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    } else if (tref_iscdata(tr)) {[m
[31m-      CTypeID id = argv2cdata(J, tr, &rd->argv[i])->ctypeid;[m
[31m-      IRType t;[m
[31m-      ct = ctype_raw(cts, id);[m
[31m-      t = crec_ct2irt(cts, ct);[m
[31m-      if (ctype_isptr(ct->info)) {  /* Resolve pointer or reference. */[m
[31m-	tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_PTR);[m
[31m-	if (ctype_isref(ct->info)) {[m
[31m-	  ct = ctype_rawchild(cts, ct);[m
[31m-	  t = crec_ct2irt(cts, ct);[m
[31m-	}[m
[31m-      } else if (t == IRT_I64 || t == IRT_U64) {[m
[31m-	tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_INT64);[m
[31m-	lj_needsplit(J);[m
[31m-	goto ok;[m
[31m-      } else if (t == IRT_INT || t == IRT_U32) {[m
[31m-	tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_INT);[m
[31m-	if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-	goto ok;[m
[31m-      } else if (ctype_isfunc(ct->info)) {[m
[31m-	tr = emitir(IRT(IR_FLOAD, IRT_PTR), tr, IRFL_CDATA_PTR);[m
[31m-	ct = ctype_get(cts,[m
[31m-	  lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR));[m
[31m-	goto ok;[m
[31m-      } else {[m
[31m-	tr = emitir(IRT(IR_ADD, IRT_PTR), tr, lj_ir_kintp(J, sizeof(GCcdata)));[m
[31m-      }[m
[31m-      if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-      if (ctype_isnum(ct->info)) {[m
[31m-	if (t == IRT_CDATA) {[m
[31m-	  tr = 0;[m
[31m-	} else {[m
[31m-	  if (t == IRT_I64 || t == IRT_U64) lj_needsplit(J);[m
[31m-	  tr = emitir(IRT(IR_XLOAD, t), tr, 0);[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (tref_isnil(tr)) {[m
[31m-      tr = lj_ir_kptr(J, NULL);[m
[31m-      ct = ctype_get(cts, CTID_P_VOID);[m
[31m-    } else if (tref_isinteger(tr)) {[m
[31m-      ct = ctype_get(cts, CTID_INT32);[m
[31m-    } else if (tref_isstr(tr)) {[m
[31m-      TRef tr2 = J->base[1-i];[m
[31m-      CTypeID id = argv2cdata(J, tr2, &rd->argv[1-i])->ctypeid;[m
[31m-      ct = ctype_raw(cts, id);[m
[31m-      if (ctype_isenum(ct->info)) {  /* Match string against enum constant. */[m
[31m-	GCstr *str = strV(&rd->argv[i]);[m
[31m-	CTSize ofs;[m
[31m-	CType *cct = lj_ctype_getfield(cts, ct, str, &ofs);[m
[31m-	if (cct && ctype_isconstval(cct->info)) {[m
[31m-	  /* Specialize to the name of the enum constant. */[m
[31m-	  emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, str));[m
[31m-	  ct = ctype_child(cts, cct);[m
[31m-	  tr = lj_ir_kint(J, (int32_t)ofs);[m
[31m-	} else {  /* Interpreter will throw or return false. */[m
[31m-	  ct = ctype_get(cts, CTID_P_VOID);[m
[31m-	}[m
[31m-      } else if (ctype_isptr(ct->info)) {[m
[31m-	tr = emitir(IRT(IR_ADD, IRT_PTR), tr, lj_ir_kintp(J, sizeof(GCstr)));[m
[31m-      } else {[m
[31m-	ct = ctype_get(cts, CTID_P_VOID);[m
[31m-      }[m
[31m-    } else if (!tref_isnum(tr)) {[m
[31m-      tr = 0;[m
[31m-      ct = ctype_get(cts, CTID_P_VOID);[m
[31m-    }[m
[31m-  ok:[m
[31m-    s[i] = ct;[m
[31m-    sp[i] = tr;[m
[31m-  }[m
[31m-  {[m
[31m-    TRef tr;[m
[31m-    if (!(tr = crec_arith_int64(J, sp, s, (MMS)rd->data)) &&[m
[31m-	!(tr = crec_arith_ptr(J, sp, s, (MMS)rd->data)) &&[m
[31m-	!(tr = crec_arith_meta(J, sp, s, cts, rd)))[m
[31m-      return;[m
[31m-    J->base[0] = tr;[m
[31m-    /* Fixup cdata comparisons, too. Avoids some cdata escapes. */[m
[31m-    if (J->postproc == LJ_POST_FIXGUARD && frame_iscont(J->L->base-1) &&[m
[31m-	!irt_isguard(J->guardemit)) {[m
[31m-      const BCIns *pc = frame_contpc(J->L->base-1) - 1;[m
[31m-      if (bc_op(*pc) <= BC_ISNEP) {[m
[31m-	J2G(J)->tmptv.u64 = (uint64_t)(uintptr_t)pc;[m
[31m-	J->postproc = LJ_POST_FIXCOMP;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- C library namespace metamethods ------------------------------------- */[m
[31m-[m
[31m-void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  if (tref_isudata(J->base[0]) && tref_isstr(J->base[1]) &&[m
[31m-      udataV(&rd->argv[0])->udtype == UDTYPE_FFI_CLIB) {[m
[31m-    CLibrary *cl = (CLibrary *)uddata(udataV(&rd->argv[0]));[m
[31m-    GCstr *name = strV(&rd->argv[1]);[m
[31m-    CType *ct;[m
[31m-    CTypeID id = lj_ctype_getname(cts, &ct, name, CLNS_INDEX);[m
[31m-    cTValue *tv = lj_tab_getstr(cl->cache, name);[m
[31m-    rd->nres = rd->data;[m
[31m-    if (id && tv && !tvisnil(tv)) {[m
[31m-      /* Specialize to the symbol name and make the result a constant. */[m
[31m-      emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, name));[m
[31m-      if (ctype_isconstval(ct->info)) {[m
[31m-	if (ct->size >= 0x80000000u &&[m
[31m-	    (ctype_child(cts, ct)->info & CTF_UNSIGNED))[m
[31m-	  J->base[0] = lj_ir_knum(J, (lua_Number)(uint32_t)ct->size);[m
[31m-	else[m
[31m-	  J->base[0] = lj_ir_kint(J, (int32_t)ct->size);[m
[31m-      } else if (ctype_isextern(ct->info)) {[m
[31m-	CTypeID sid = ctype_cid(ct->info);[m
[31m-	void *sp = *(void **)cdataptr(cdataV(tv));[m
[31m-	TRef ptr;[m
[31m-	ct = ctype_raw(cts, sid);[m
[31m-	if (LJ_64 && !checkptr32(sp))[m
[31m-	  ptr = lj_ir_kintp(J, (uintptr_t)sp);[m
[31m-	else[m
[31m-	  ptr = lj_ir_kptr(J, sp);[m
[31m-	if (rd->data) {[m
[31m-	  J->base[0] = crec_tv_ct(J, ct, sid, ptr);[m
[31m-	} else {[m
[31m-	  J->needsnap = 1;[m
[31m-	  crec_ct_tv(J, ct, ptr, J->base[2], &rd->argv[2]);[m
[31m-	}[m
[31m-      } else {[m
[31m-	J->base[0] = lj_ir_kgc(J, obj2gco(cdataV(tv)), IRT_CDATA);[m
[31m-      }[m
[31m-    } else {[m
[31m-      lj_trace_err(J, LJ_TRERR_NOCACHE);[m
[31m-    }[m
[31m-  }  /* else: interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-/* -- FFI library functions ----------------------------------------------- */[m
[31m-[m
[31m-static TRef crec_toint(jit_State *J, CTState *cts, TRef sp, TValue *sval)[m
[31m-{[m
[31m-  return crec_ct_tv(J, ctype_get(cts, CTID_INT32), 0, sp, sval);[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  crec_alloc(J, rd, argv2ctype(J, J->base[0], &rd->argv[0]));[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  UNUSED(rd);[m
[31m-  if (J->base[0])[m
[31m-    lj_trace_err(J, LJ_TRERR_NYICALL);[m
[31m-  J->base[0] = lj_ir_call(J, IRCALL_lj_vm_errno);[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tr) {[m
[31m-    TRef trlen = J->base[1];[m
[31m-    if (!tref_isnil(trlen)) {[m
[31m-      trlen = crec_toint(J, cts, trlen, &rd->argv[1]);[m
[31m-      tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CVOID), 0, tr, &rd->argv[0]);[m
[31m-    } else {[m
[31m-      tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CCHAR), 0, tr, &rd->argv[0]);[m
[31m-      trlen = lj_ir_call(J, IRCALL_strlen, tr);[m
[31m-    }[m
[31m-    J->base[0] = emitir(IRT(IR_XSNEW, IRT_STR), tr, trlen);[m
[31m-  }  /* else: interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef trdst = J->base[0], trsrc = J->base[1], trlen = J->base[2];[m
[31m-  if (trdst && trsrc && (trlen || tref_isstr(trsrc))) {[m
[31m-    trdst = crec_ct_tv(J, ctype_get(cts, CTID_P_VOID), 0, trdst, &rd->argv[0]);[m
[31m-    trsrc = crec_ct_tv(J, ctype_get(cts, CTID_P_CVOID), 0, trsrc, &rd->argv[1]);[m
[31m-    if (trlen) {[m
[31m-      trlen = crec_toint(J, cts, trlen, &rd->argv[2]);[m
[31m-    } else {[m
[31m-      trlen = emitir(IRTI(IR_FLOAD), J->base[1], IRFL_STR_LEN);[m
[31m-      trlen = emitir(IRTI(IR_ADD), trlen, lj_ir_kint(J, 1));[m
[31m-    }[m
[31m-    rd->nres = 0;[m
[31m-    crec_copy(J, trdst, trsrc, trlen, NULL);[m
[31m-  }  /* else: interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef trdst = J->base[0], trlen = J->base[1], trfill = J->base[2];[m
[31m-  if (trdst && trlen) {[m
[31m-    CTSize step = 1;[m
[31m-    if (tviscdata(&rd->argv[0])) {  /* Get alignment of original destination. */[m
[31m-      CTSize sz;[m
[31m-      CType *ct = ctype_raw(cts, cdataV(&rd->argv[0])->ctypeid);[m
[31m-      if (ctype_isptr(ct->info))[m
[31m-	ct = ctype_rawchild(cts, ct);[m
[31m-      step = (1u<<ctype_align(lj_ctype_info(cts, ctype_typeid(cts, ct), &sz)));[m
[31m-    }[m
[31m-    trdst = crec_ct_tv(J, ctype_get(cts, CTID_P_VOID), 0, trdst, &rd->argv[0]);[m
[31m-    trlen = crec_toint(J, cts, trlen, &rd->argv[1]);[m
[31m-    if (trfill)[m
[31m-      trfill = crec_toint(J, cts, trfill, &rd->argv[2]);[m
[31m-    else[m
[31m-      trfill = lj_ir_kint(J, 0);[m
[31m-    rd->nres = 0;[m
[31m-    crec_fill(J, trdst, trlen, trfill, step);[m
[31m-  }  /* else: interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (tref_iscdata(J->base[0])) {[m
[31m-    TRef trid = lj_ir_kint(J, argv2ctype(J, J->base[0], &rd->argv[0]));[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA),[m
[31m-			lj_ir_kint(J, CTID_CTYPEID), trid);[m
[31m-  } else {[m
[31m-    setfuncV(J->L, &J->errinfo, J->fn);[m
[31m-    lj_trace_err_info(J, LJ_TRERR_NYIFFU);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  argv2ctype(J, J->base[0], &rd->argv[0]);[m
[31m-  if (tref_iscdata(J->base[1])) {[m
[31m-    argv2ctype(J, J->base[1], &rd->argv[1]);[m
[31m-    J->postproc = LJ_POST_FIXBOOL;[m
[31m-    J->base[0] = TREF_TRUE;[m
[31m-  } else {[m
[31m-    J->base[0] = TREF_FALSE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (tref_isstr(J->base[0])) {[m
[31m-    /* Specialize to the ABI string to make the boolean result a constant. */[m
[31m-    emitir(IRTG(IR_EQ, IRT_STR), J->base[0], lj_ir_kstr(J, strV(&rd->argv[0])));[m
[31m-    J->postproc = LJ_POST_FIXBOOL;[m
[31m-    J->base[0] = TREF_TRUE;[m
[31m-  } else {[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record ffi.sizeof(), ffi.alignof(), ffi.offsetof(). */[m
[31m-void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTypeID id = argv2ctype(J, J->base[0], &rd->argv[0]);[m
[31m-  if (rd->data == FF_ffi_sizeof) {[m
[31m-    CType *ct = lj_ctype_rawref(ctype_ctsG(J2G(J)), id);[m
[31m-    if (ctype_isvltype(ct->info))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  } else if (rd->data == FF_ffi_offsetof) {  /* Specialize to the field name. */[m
[31m-    if (!tref_isstr(J->base[1]))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, strV(&rd->argv[1])));[m
[31m-    rd->nres = 3;  /* Just in case. */[m
[31m-  }[m
[31m-  J->postproc = LJ_POST_FIXCONST;[m
[31m-  J->base[0] = J->base[1] = J->base[2] = TREF_NIL;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  argv2cdata(J, J->base[0], &rd->argv[0]);[m
[31m-  if (!J->base[1])[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  crec_finalizer(J, J->base[0], J->base[1], &rd->argv[1]);[m
[31m-}[m
[31m-[m
[31m-/* -- 64 bit bit.* library functions -------------------------------------- */[m
[31m-[m
[31m-/* Determine bit operation type from argument type. */[m
[31m-static CTypeID crec_bit64_type(CTState *cts, cTValue *tv)[m
[31m-{[m
[31m-  if (tviscdata(tv)) {[m
[31m-    CType *ct = lj_ctype_rawref(cts, cdataV(tv)->ctypeid);[m
[31m-    if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-    if ((ct->info & (CTMASK_NUM|CTF_BOOL|CTF_FP|CTF_UNSIGNED)) ==[m
[31m-	CTINFO(CT_NUM, CTF_UNSIGNED) && ct->size == 8)[m
[31m-      return CTID_UINT64;  /* Use uint64_t, since it has the highest rank. */[m
[31m-    return CTID_INT64;  /* Otherwise use int64_t. */[m
[31m-  }[m
[31m-  return 0;  /* Use regular 32 bit ops. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL recff_bit64_tobit(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  TRef tr = crec_ct_tv(J, ctype_get(cts, CTID_INT64), 0,[m
[31m-		       J->base[0], &rd->argv[0]);[m
[31m-  if (!tref_isinteger(tr))[m
[31m-    tr = emitconv(tr, IRT_INT, tref_type(tr), 0);[m
[31m-  J->base[0] = tr;[m
[31m-}[m
[31m-[m
[31m-int LJ_FASTCALL recff_bit64_unary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID id = crec_bit64_type(cts, &rd->argv[0]);[m
[31m-  if (id) {[m
[31m-    TRef tr = crec_ct_tv(J, ctype_get(cts, id), 0, J->base[0], &rd->argv[0]);[m
[31m-    tr = emitir(IRT(rd->data, id-CTID_INT64+IRT_I64), tr, 0);[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-int LJ_FASTCALL recff_bit64_nary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID id = 0;[m
[31m-  MSize i;[m
[31m-  for (i = 0; J->base[i] != 0; i++) {[m
[31m-    CTypeID aid = crec_bit64_type(cts, &rd->argv[i]);[m
[31m-    if (id < aid) id = aid;  /* Determine highest type rank of all arguments. */[m
[31m-  }[m
[31m-  if (id) {[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    uint32_t ot = IRT(rd->data, id-CTID_INT64+IRT_I64);[m
[31m-    TRef tr = crec_ct_tv(J, ct, 0, J->base[0], &rd->argv[0]);[m
[31m-    for (i = 1; J->base[i] != 0; i++) {[m
[31m-      TRef tr2 = crec_ct_tv(J, ct, 0, J->base[i], &rd->argv[i]);[m
[31m-      tr = emitir(ot, tr, tr2);[m
[31m-    }[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-int LJ_FASTCALL recff_bit64_shift(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID id;[m
[31m-  TRef tsh = 0;[m
[31m-  if (J->base[0] && tref_iscdata(J->base[1])) {[m
[31m-    tsh = crec_ct_tv(J, ctype_get(cts, CTID_INT64), 0,[m
[31m-		     J->base[1], &rd->argv[1]);[m
[31m-    if (!tref_isinteger(tsh))[m
[31m-      tsh = emitconv(tsh, IRT_INT, tref_type(tsh), 0);[m
[31m-    J->base[1] = tsh;[m
[31m-  }[m
[31m-  id = crec_bit64_type(cts, &rd->argv[0]);[m
[31m-  if (id) {[m
[31m-    TRef tr = crec_ct_tv(J, ctype_get(cts, id), 0, J->base[0], &rd->argv[0]);[m
[31m-    uint32_t op = rd->data;[m
[31m-    if (!tsh) tsh = lj_opt_narrow_tobit(J, J->base[1]);[m
[31m-    if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) &&[m
[31m-	!tref_isk(tsh))[m
[31m-      tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 63));[m
[31m-#ifdef LJ_TARGET_UNIFYROT[m
[31m-      if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) {[m
[31m-	op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR;[m
[31m-	tsh = emitir(IRTI(IR_NEG), tsh, tsh);[m
[31m-      }[m
[31m-#endif[m
[31m-    tr = emitir(IRT(op, id-CTID_INT64+IRT_I64), tr, tsh);[m
[31m-    J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-TRef recff_bit64_tohex(jit_State *J, RecordFFData *rd, TRef hdr)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CTypeID id = crec_bit64_type(cts, &rd->argv[0]);[m
[31m-  TRef tr, trsf = J->base[1];[m
[31m-  SFormat sf = (STRFMT_UINT|STRFMT_T_HEX);[m
[31m-  int32_t n;[m
[31m-  if (trsf) {[m
[31m-    CTypeID id2 = 0;[m
[31m-    n = (int32_t)lj_carith_check64(J->L, 2, &id2);[m
[31m-    if (id2)[m
[31m-      trsf = crec_ct_tv(J, ctype_get(cts, CTID_INT32), 0, trsf, &rd->argv[1]);[m
[31m-    else[m
[31m-      trsf = lj_opt_narrow_tobit(J, trsf);[m
[31m-    emitir(IRTGI(IR_EQ), trsf, lj_ir_kint(J, n));  /* Specialize to n. */[m
[31m-  } else {[m
[31m-    n = id ? 16 : 8;[m
[31m-  }[m
[31m-  if (n < 0) { n = -n; sf |= STRFMT_F_UPPER; }[m
[31m-  sf |= ((SFormat)((n+1)&255) << STRFMT_SH_PREC);[m
[31m-  if (id) {[m
[31m-    tr = crec_ct_tv(J, ctype_get(cts, id), 0, J->base[0], &rd->argv[0]);[m
[31m-    if (n < 16)[m
[31m-      tr = emitir(IRT(IR_BAND, IRT_U64), tr,[m
[31m-		  lj_ir_kint64(J, ((uint64_t)1 << 4*n)-1));[m
[31m-  } else {[m
[31m-    tr = lj_opt_narrow_tobit(J, J->base[0]);[m
[31m-    if (n < 8)[m
[31m-      tr = emitir(IRTI(IR_BAND), tr, lj_ir_kint(J, (int32_t)((1u << 4*n)-1)));[m
[31m-    tr = emitconv(tr, IRT_U64, IRT_INT, 0);  /* No sign-extension. */[m
[31m-    lj_needsplit(J);[m
[31m-  }[m
[31m-  return lj_ir_call(J, IRCALL_lj_strfmt_putfxint, hdr, lj_ir_kint(J, sf), tr);[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous library functions ------------------------------------- */[m
[31m-[m
[31m-void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(J2G(J));[m
[31m-  CType *d, *ct = lj_ctype_rawref(cts, cdataV(&rd->argv[0])->ctypeid);[m
[31m-  if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct);[m
[31m-  if (ctype_isnum(ct->info) || ctype_iscomplex(ct->info)) {[m
[31m-    if (ctype_isinteger_or_bool(ct->info) && ct->size <= 4 &&[m
[31m-	!(ct->size == 4 && (ct->info & CTF_UNSIGNED)))[m
[31m-      d = ctype_get(cts, CTID_INT32);[m
[31m-    else[m
[31m-      d = ctype_get(cts, CTID_DOUBLE);[m
[31m-    J->base[0] = crec_ct_tv(J, d, 0, J->base[0], &rd->argv[0]);[m
[31m-  } else {[m
[31m-    J->base[0] = TREF_NIL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef emitir[m
[31m-#undef emitconv[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_crecord.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_crecord.h[m
[1mdeleted file mode 100644[m
[1mindex 7a05881..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_crecord.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-/*[m
[31m-** Trace recorder for C data operations.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CRECORD_H[m
[31m-#define _LJ_CRECORD_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ffrecord.h"[m
[31m-[m
[31m-#if LJ_HASJIT && LJ_HASFFI[m
[31m-LJ_FUNC void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd);[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL recff_bit64_tobit(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC int LJ_FASTCALL recff_bit64_unary(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC int LJ_FASTCALL recff_bit64_nary(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC int LJ_FASTCALL recff_bit64_shift(jit_State *J, RecordFFData *rd);[m
[31m-LJ_FUNC TRef recff_bit64_tohex(jit_State *J, RecordFFData *rd, TRef hdr);[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ctype.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ctype.c[m
[1mdeleted file mode 100644[m
[1mindex bc47cc5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ctype.c[m
[1m+++ /dev/null[m
[36m@@ -1,637 +0,0 @@[m
[31m-/*[m
[31m-** C type management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_ccallback.h"[m
[31m-#include "lj_buf.h"[m
[31m-[m
[31m-/* -- C type definitions -------------------------------------------------- */[m
[31m-[m
[31m-/* Predefined typedefs. */[m
[31m-#define CTTDDEF(_) \[m
[31m-  /* Vararg handling. */ \[m
[31m-  _("va_list",			P_VOID) \[m
[31m-  _("__builtin_va_list",	P_VOID) \[m
[31m-  _("__gnuc_va_list",		P_VOID) \[m
[31m-  /* From stddef.h. */ \[m
[31m-  _("ptrdiff_t",		INT_PSZ) \[m
[31m-  _("size_t",			UINT_PSZ) \[m
[31m-  _("wchar_t",			WCHAR) \[m
[31m-  /* Subset of stdint.h. */ \[m
[31m-  _("int8_t",			INT8) \[m
[31m-  _("int16_t",			INT16) \[m
[31m-  _("int32_t",			INT32) \[m
[31m-  _("int64_t",			INT64) \[m
[31m-  _("uint8_t",			UINT8) \[m
[31m-  _("uint16_t",			UINT16) \[m
[31m-  _("uint32_t",			UINT32) \[m
[31m-  _("uint64_t",			UINT64) \[m
[31m-  _("intptr_t",			INT_PSZ) \[m
[31m-  _("uintptr_t",		UINT_PSZ) \[m
[31m-  /* From POSIX. */ \[m
[31m-  _("ssize_t",			INT_PSZ) \[m
[31m-  /* End of typedef list. */[m
[31m-[m
[31m-/* Keywords (only the ones we actually care for). */[m
[31m-#define CTKWDEF(_) \[m
[31m-  /* Type specifiers. */ \[m
[31m-  _("void",		-1,	CTOK_VOID) \[m
[31m-  _("_Bool",		0,	CTOK_BOOL) \[m
[31m-  _("bool",		1,	CTOK_BOOL) \[m
[31m-  _("char",		1,	CTOK_CHAR) \[m
[31m-  _("int",		4,	CTOK_INT) \[m
[31m-  _("__int8",		1,	CTOK_INT) \[m
[31m-  _("__int16",		2,	CTOK_INT) \[m
[31m-  _("__int32",		4,	CTOK_INT) \[m
[31m-  _("__int64",		8,	CTOK_INT) \[m
[31m-  _("float",		4,	CTOK_FP) \[m
[31m-  _("double",		8,	CTOK_FP) \[m
[31m-  _("long",		0,	CTOK_LONG) \[m
[31m-  _("short",		0,	CTOK_SHORT) \[m
[31m-  _("_Complex",		0,	CTOK_COMPLEX) \[m
[31m-  _("complex",		0,	CTOK_COMPLEX) \[m
[31m-  _("__complex",	0,	CTOK_COMPLEX) \[m
[31m-  _("__complex__",	0,	CTOK_COMPLEX) \[m
[31m-  _("signed",		0,	CTOK_SIGNED) \[m
[31m-  _("__signed",		0,	CTOK_SIGNED) \[m
[31m-  _("__signed__",	0,	CTOK_SIGNED) \[m
[31m-  _("unsigned",		0,	CTOK_UNSIGNED) \[m
[31m-  /* Type qualifiers. */ \[m
[31m-  _("const",		0,	CTOK_CONST) \[m
[31m-  _("__const",		0,	CTOK_CONST) \[m
[31m-  _("__const__",	0,	CTOK_CONST) \[m
[31m-  _("volatile",		0,	CTOK_VOLATILE) \[m
[31m-  _("__volatile",	0,	CTOK_VOLATILE) \[m
[31m-  _("__volatile__",	0,	CTOK_VOLATILE) \[m
[31m-  _("restrict",		0,	CTOK_RESTRICT) \[m
[31m-  _("__restrict",	0,	CTOK_RESTRICT) \[m
[31m-  _("__restrict__",	0,	CTOK_RESTRICT) \[m
[31m-  _("inline",		0,	CTOK_INLINE) \[m
[31m-  _("__inline",		0,	CTOK_INLINE) \[m
[31m-  _("__inline__",	0,	CTOK_INLINE) \[m
[31m-  /* Storage class specifiers. */ \[m
[31m-  _("typedef",		0,	CTOK_TYPEDEF) \[m
[31m-  _("extern",		0,	CTOK_EXTERN) \[m
[31m-  _("static",		0,	CTOK_STATIC) \[m
[31m-  _("auto",		0,	CTOK_AUTO) \[m
[31m-  _("register",		0,	CTOK_REGISTER) \[m
[31m-  /* GCC Attributes. */ \[m
[31m-  _("__extension__",	0,	CTOK_EXTENSION) \[m
[31m-  _("__attribute",	0,	CTOK_ATTRIBUTE) \[m
[31m-  _("__attribute__",	0,	CTOK_ATTRIBUTE) \[m
[31m-  _("asm",		0,	CTOK_ASM) \[m
[31m-  _("__asm",		0,	CTOK_ASM) \[m
[31m-  _("__asm__",		0,	CTOK_ASM) \[m
[31m-  /* MSVC Attributes. */ \[m
[31m-  _("__declspec",	0,	CTOK_DECLSPEC) \[m
[31m-  _("__cdecl",		CTCC_CDECL,	CTOK_CCDECL) \[m
[31m-  _("__thiscall",	CTCC_THISCALL,	CTOK_CCDECL) \[m
[31m-  _("__fastcall",	CTCC_FASTCALL,	CTOK_CCDECL) \[m
[31m-  _("__stdcall",	CTCC_STDCALL,	CTOK_CCDECL) \[m
[31m-  _("__ptr32",		4,	CTOK_PTRSZ) \[m
[31m-  _("__ptr64",		8,	CTOK_PTRSZ) \[m
[31m-  /* Other type specifiers. */ \[m
[31m-  _("struct",		0,	CTOK_STRUCT) \[m
[31m-  _("union",		0,	CTOK_UNION) \[m
[31m-  _("enum",		0,	CTOK_ENUM) \[m
[31m-  /* Operators. */ \[m
[31m-  _("sizeof",		0,	CTOK_SIZEOF) \[m
[31m-  _("__alignof",	0,	CTOK_ALIGNOF) \[m
[31m-  _("__alignof__",	0,	CTOK_ALIGNOF) \[m
[31m-  /* End of keyword list. */[m
[31m-[m
[31m-/* Type info for predefined types. Size merged in. */[m
[31m-static CTInfo lj_ctype_typeinfo[] = {[m
[31m-#define CTTYINFODEF(id, sz, ct, info)	CTINFO((ct),(((sz)&0x3fu)<<10)+(info)),[m
[31m-#define CTTDINFODEF(name, id)		CTINFO(CT_TYPEDEF, CTID_##id),[m
[31m-#define CTKWINFODEF(name, sz, kw)	CTINFO(CT_KW,(((sz)&0x3fu)<<10)+(kw)),[m
[31m-CTTYDEF(CTTYINFODEF)[m
[31m-CTTDDEF(CTTDINFODEF)[m
[31m-CTKWDEF(CTKWINFODEF)[m
[31m-#undef CTTYINFODEF[m
[31m-#undef CTTDINFODEF[m
[31m-#undef CTKWINFODEF[m
[31m-  0[m
[31m-};[m
[31m-[m
[31m-/* Predefined type names collected in a single string. */[m
[31m-static const char * const lj_ctype_typenames =[m
[31m-#define CTTDNAMEDEF(name, id)		name "\0"[m
[31m-#define CTKWNAMEDEF(name, sz, cds)	name "\0"[m
[31m-CTTDDEF(CTTDNAMEDEF)[m
[31m-CTKWDEF(CTKWNAMEDEF)[m
[31m-#undef CTTDNAMEDEF[m
[31m-#undef CTKWNAMEDEF[m
[31m-;[m
[31m-[m
[31m-#define CTTYPEINFO_NUM		(sizeof(lj_ctype_typeinfo)/sizeof(CTInfo)-1)[m
[31m-#ifdef LUAJIT_CTYPE_CHECK_ANCHOR[m
[31m-#define CTTYPETAB_MIN		CTTYPEINFO_NUM[m
[31m-#else[m
[31m-#define CTTYPETAB_MIN		128[m
[31m-#endif[m
[31m-[m
[31m-/* -- C type interning ---------------------------------------------------- */[m
[31m-[m
[31m-#define ct_hashtype(info, size)	(hashrot(info, size) & CTHASH_MASK)[m
[31m-#define ct_hashname(name) \[m
[31m-  (hashrot(u32ptr(name), u32ptr(name) + HASH_BIAS) & CTHASH_MASK)[m
[31m-[m
[31m-/* Create new type element. */[m
[31m-CTypeID lj_ctype_new(CTState *cts, CType **ctp)[m
[31m-{[m
[31m-  CTypeID id = cts->top;[m
[31m-  CType *ct;[m
[31m-  lua_assert(cts->L);[m
[31m-  if (LJ_UNLIKELY(id >= cts->sizetab)) {[m
[31m-    if (id >= CTID_MAX) lj_err_msg(cts->L, LJ_ERR_TABOV);[m
[31m-#ifdef LUAJIT_CTYPE_CHECK_ANCHOR[m
[31m-    ct = lj_mem_newvec(cts->L, id+1, CType);[m
[31m-    memcpy(ct, cts->tab, id*sizeof(CType));[m
[31m-    memset(cts->tab, 0, id*sizeof(CType));[m
[31m-    lj_mem_freevec(cts->g, cts->tab, cts->sizetab, CType);[m
[31m-    cts->tab = ct;[m
[31m-    cts->sizetab = id+1;[m
[31m-#else[m
[31m-    lj_mem_growvec(cts->L, cts->tab, cts->sizetab, CTID_MAX, CType);[m
[31m-#endif[m
[31m-  }[m
[31m-  cts->top = id+1;[m
[31m-  *ctp = ct = &cts->tab[id];[m
[31m-  ct->info = 0;[m
[31m-  ct->size = 0;[m
[31m-  ct->sib = 0;[m
[31m-  ct->next = 0;[m
[31m-  setgcrefnull(ct->name);[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-/* Intern a type element. */[m
[31m-CTypeID lj_ctype_intern(CTState *cts, CTInfo info, CTSize size)[m
[31m-{[m
[31m-  uint32_t h = ct_hashtype(info, size);[m
[31m-  CTypeID id = cts->hash[h];[m
[31m-  lua_assert(cts->L);[m
[31m-  while (id) {[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    if (ct->info == info && ct->size == size)[m
[31m-      return id;[m
[31m-    id = ct->next;[m
[31m-  }[m
[31m-  id = cts->top;[m
[31m-  if (LJ_UNLIKELY(id >= cts->sizetab)) {[m
[31m-    if (id >= CTID_MAX) lj_err_msg(cts->L, LJ_ERR_TABOV);[m
[31m-    lj_mem_growvec(cts->L, cts->tab, cts->sizetab, CTID_MAX, CType);[m
[31m-  }[m
[31m-  cts->top = id+1;[m
[31m-  cts->tab[id].info = info;[m
[31m-  cts->tab[id].size = size;[m
[31m-  cts->tab[id].sib = 0;[m
[31m-  cts->tab[id].next = cts->hash[h];[m
[31m-  setgcrefnull(cts->tab[id].name);[m
[31m-  cts->hash[h] = (CTypeID1)id;[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-/* Add type element to hash table. */[m
[31m-static void ctype_addtype(CTState *cts, CType *ct, CTypeID id)[m
[31m-{[m
[31m-  uint32_t h = ct_hashtype(ct->info, ct->size);[m
[31m-  ct->next = cts->hash[h];[m
[31m-  cts->hash[h] = (CTypeID1)id;[m
[31m-}[m
[31m-[m
[31m-/* Add named element to hash table. */[m
[31m-void lj_ctype_addname(CTState *cts, CType *ct, CTypeID id)[m
[31m-{[m
[31m-  uint32_t h = ct_hashname(gcref(ct->name));[m
[31m-  ct->next = cts->hash[h];[m
[31m-  cts->hash[h] = (CTypeID1)id;[m
[31m-}[m
[31m-[m
[31m-/* Get a C type by name, matching the type mask. */[m
[31m-CTypeID lj_ctype_getname(CTState *cts, CType **ctp, GCstr *name, uint32_t tmask)[m
[31m-{[m
[31m-  CTypeID id = cts->hash[ct_hashname(name)];[m
[31m-  while (id) {[m
[31m-    CType *ct = ctype_get(cts, id);[m
[31m-    if (gcref(ct->name) == obj2gco(name) &&[m
[31m-	((tmask >> ctype_type(ct->info)) & 1)) {[m
[31m-      *ctp = ct;[m
[31m-      return id;[m
[31m-    }[m
[31m-    id = ct->next;[m
[31m-  }[m
[31m-  *ctp = &cts->tab[0];  /* Simplify caller logic. ctype_get() would assert. */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Get a struct/union/enum/function field by name. */[m
[31m-CType *lj_ctype_getfieldq(CTState *cts, CType *ct, GCstr *name, CTSize *ofs,[m
[31m-			  CTInfo *qual)[m
[31m-{[m
[31m-  while (ct->sib) {[m
[31m-    ct = ctype_get(cts, ct->sib);[m
[31m-    if (gcref(ct->name) == obj2gco(name)) {[m
[31m-      *ofs = ct->size;[m
[31m-      return ct;[m
[31m-    }[m
[31m-    if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) {[m
[31m-      CType *fct, *cct = ctype_child(cts, ct);[m
[31m-      CTInfo q = 0;[m
[31m-      while (ctype_isattrib(cct->info)) {[m
[31m-	if (ctype_attrib(cct->info) == CTA_QUAL) q |= cct->size;[m
[31m-	cct = ctype_child(cts, cct);[m
[31m-      }[m
[31m-      fct = lj_ctype_getfieldq(cts, cct, name, ofs, qual);[m
[31m-      if (fct) {[m
[31m-	if (qual) *qual |= q;[m
[31m-	*ofs += ct->size;[m
[31m-	return fct;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* Not found. */[m
[31m-}[m
[31m-[m
[31m-/* -- C type information -------------------------------------------------- */[m
[31m-[m
[31m-/* Follow references and get raw type for a C type ID. */[m
[31m-CType *lj_ctype_rawref(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_get(cts, id);[m
[31m-  while (ctype_isattrib(ct->info) || ctype_isref(ct->info))[m
[31m-    ct = ctype_child(cts, ct);[m
[31m-  return ct;[m
[31m-}[m
[31m-[m
[31m-/* Get size for a C type ID. Does NOT support VLA/VLS. */[m
[31m-CTSize lj_ctype_size(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_raw(cts, id);[m
[31m-  return ctype_hassize(ct->info) ? ct->size : CTSIZE_INVALID;[m
[31m-}[m
[31m-[m
[31m-/* Get size for a variable-length C type. Does NOT support other C types. */[m
[31m-CTSize lj_ctype_vlsize(CTState *cts, CType *ct, CTSize nelem)[m
[31m-{[m
[31m-  uint64_t xsz = 0;[m
[31m-  if (ctype_isstruct(ct->info)) {[m
[31m-    CTypeID arrid = 0, fid = ct->sib;[m
[31m-    xsz = ct->size;  /* Add the struct size. */[m
[31m-    while (fid) {[m
[31m-      CType *ctf = ctype_get(cts, fid);[m
[31m-      if (ctype_type(ctf->info) == CT_FIELD)[m
[31m-	arrid = ctype_cid(ctf->info);  /* Remember last field of VLS. */[m
[31m-      fid = ctf->sib;[m
[31m-    }[m
[31m-    ct = ctype_raw(cts, arrid);[m
[31m-  }[m
[31m-  lua_assert(ctype_isvlarray(ct->info));  /* Must be a VLA. */[m
[31m-  ct = ctype_rawchild(cts, ct);  /* Get array element. */[m
[31m-  lua_assert(ctype_hassize(ct->info));[m
[31m-  /* Calculate actual size of VLA and check for overflow. */[m
[31m-  xsz += (uint64_t)ct->size * nelem;[m
[31m-  return xsz < 0x80000000u ? (CTSize)xsz : CTSIZE_INVALID;[m
[31m-}[m
[31m-[m
[31m-/* Get type, qualifiers, size and alignment for a C type ID. */[m
[31m-CTInfo lj_ctype_info(CTState *cts, CTypeID id, CTSize *szp)[m
[31m-{[m
[31m-  CTInfo qual = 0;[m
[31m-  CType *ct = ctype_get(cts, id);[m
[31m-  for (;;) {[m
[31m-    CTInfo info = ct->info;[m
[31m-    if (ctype_isenum(info)) {[m
[31m-      /* Follow child. Need to look at its attributes, too. */[m
[31m-    } else if (ctype_isattrib(info)) {[m
[31m-      if (ctype_isxattrib(info, CTA_QUAL))[m
[31m-	qual |= ct->size;[m
[31m-      else if (ctype_isxattrib(info, CTA_ALIGN) && !(qual & CTFP_ALIGNED))[m
[31m-	qual |= CTFP_ALIGNED + CTALIGN(ct->size);[m
[31m-    } else {[m
[31m-      if (!(qual & CTFP_ALIGNED)) qual |= (info & CTF_ALIGN);[m
[31m-      qual |= (info & ~(CTF_ALIGN|CTMASK_CID));[m
[31m-      lua_assert(ctype_hassize(info) || ctype_isfunc(info));[m
[31m-      *szp = ctype_isfunc(info) ? CTSIZE_INVALID : ct->size;[m
[31m-      break;[m
[31m-    }[m
[31m-    ct = ctype_get(cts, ctype_cid(info));[m
[31m-  }[m
[31m-  return qual;[m
[31m-}[m
[31m-[m
[31m-/* Get ctype metamethod. */[m
[31m-cTValue *lj_ctype_meta(CTState *cts, CTypeID id, MMS mm)[m
[31m-{[m
[31m-  CType *ct = ctype_get(cts, id);[m
[31m-  cTValue *tv;[m
[31m-  while (ctype_isattrib(ct->info) || ctype_isref(ct->info)) {[m
[31m-    id = ctype_cid(ct->info);[m
[31m-    ct = ctype_get(cts, id);[m
[31m-  }[m
[31m-  if (ctype_isptr(ct->info) &&[m
[31m-      ctype_isfunc(ctype_get(cts, ctype_cid(ct->info))->info))[m
[31m-    tv = lj_tab_getstr(cts->miscmap, &cts->g->strempty);[m
[31m-  else[m
[31m-    tv = lj_tab_getinth(cts->miscmap, -(int32_t)id);[m
[31m-  if (tv && tvistab(tv) &&[m
[31m-      (tv = lj_tab_getstr(tabV(tv), mmname_str(cts->g, mm))) && !tvisnil(tv))[m
[31m-    return tv;[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- C type representation ----------------------------------------------- */[m
[31m-[m
[31m-/* Fixed max. length of a C type representation. */[m
[31m-#define CTREPR_MAX		512[m
[31m-[m
[31m-typedef struct CTRepr {[m
[31m-  char *pb, *pe;[m
[31m-  CTState *cts;[m
[31m-  lua_State *L;[m
[31m-  int needsp;[m
[31m-  int ok;[m
[31m-  char buf[CTREPR_MAX];[m
[31m-} CTRepr;[m
[31m-[m
[31m-/* Prepend string. */[m
[31m-static void ctype_prepstr(CTRepr *ctr, const char *str, MSize len)[m
[31m-{[m
[31m-  char *p = ctr->pb;[m
[31m-  if (ctr->buf + len+1 > p) { ctr->ok = 0; return; }[m
[31m-  if (ctr->needsp) *--p = ' ';[m
[31m-  ctr->needsp = 1;[m
[31m-  p -= len;[m
[31m-  while (len-- > 0) p[len] = str[len];[m
[31m-  ctr->pb = p;[m
[31m-}[m
[31m-[m
[31m-#define ctype_preplit(ctr, str)	ctype_prepstr((ctr), "" str, sizeof(str)-1)[m
[31m-[m
[31m-/* Prepend char. */[m
[31m-static void ctype_prepc(CTRepr *ctr, int c)[m
[31m-{[m
[31m-  if (ctr->buf >= ctr->pb) { ctr->ok = 0; return; }[m
[31m-  *--ctr->pb = c;[m
[31m-}[m
[31m-[m
[31m-/* Prepend number. */[m
[31m-static void ctype_prepnum(CTRepr *ctr, uint32_t n)[m
[31m-{[m
[31m-  char *p = ctr->pb;[m
[31m-  if (ctr->buf + 10+1 > p) { ctr->ok = 0; return; }[m
[31m-  do { *--p = (char)('0' + n % 10); } while (n /= 10);[m
[31m-  ctr->pb = p;[m
[31m-  ctr->needsp = 0;[m
[31m-}[m
[31m-[m
[31m-/* Append char. */[m
[31m-static void ctype_appc(CTRepr *ctr, int c)[m
[31m-{[m
[31m-  if (ctr->pe >= ctr->buf + CTREPR_MAX) { ctr->ok = 0; return; }[m
[31m-  *ctr->pe++ = c;[m
[31m-}[m
[31m-[m
[31m-/* Append number. */[m
[31m-static void ctype_appnum(CTRepr *ctr, uint32_t n)[m
[31m-{[m
[31m-  char buf[10];[m
[31m-  char *p = buf+sizeof(buf);[m
[31m-  char *q = ctr->pe;[m
[31m-  if (q > ctr->buf + CTREPR_MAX - 10) { ctr->ok = 0; return; }[m
[31m-  do { *--p = (char)('0' + n % 10); } while (n /= 10);[m
[31m-  do { *q++ = *p++; } while (p < buf+sizeof(buf));[m
[31m-  ctr->pe = q;[m
[31m-}[m
[31m-[m
[31m-/* Prepend qualifiers. */[m
[31m-static void ctype_prepqual(CTRepr *ctr, CTInfo info)[m
[31m-{[m
[31m-  if ((info & CTF_VOLATILE)) ctype_preplit(ctr, "volatile");[m
[31m-  if ((info & CTF_CONST)) ctype_preplit(ctr, "const");[m
[31m-}[m
[31m-[m
[31m-/* Prepend named type. */[m
[31m-static void ctype_preptype(CTRepr *ctr, CType *ct, CTInfo qual, const char *t)[m
[31m-{[m
[31m-  if (gcref(ct->name)) {[m
[31m-    GCstr *str = gco2str(gcref(ct->name));[m
[31m-    ctype_prepstr(ctr, strdata(str), str->len);[m
[31m-  } else {[m
[31m-    if (ctr->needsp) ctype_prepc(ctr, ' ');[m
[31m-    ctype_prepnum(ctr, ctype_typeid(ctr->cts, ct));[m
[31m-    ctr->needsp = 1;[m
[31m-  }[m
[31m-  ctype_prepstr(ctr, t, (MSize)strlen(t));[m
[31m-  ctype_prepqual(ctr, qual);[m
[31m-}[m
[31m-[m
[31m-static void ctype_repr(CTRepr *ctr, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_get(ctr->cts, id);[m
[31m-  CTInfo qual = 0;[m
[31m-  int ptrto = 0;[m
[31m-  for (;;) {[m
[31m-    CTInfo info = ct->info;[m
[31m-    CTSize size = ct->size;[m
[31m-    switch (ctype_type(info)) {[m
[31m-    case CT_NUM:[m
[31m-      if ((info & CTF_BOOL)) {[m
[31m-	ctype_preplit(ctr, "bool");[m
[31m-      } else if ((info & CTF_FP)) {[m
[31m-	if (size == sizeof(double)) ctype_preplit(ctr, "double");[m
[31m-	else if (size == sizeof(float)) ctype_preplit(ctr, "float");[m
[31m-	else ctype_preplit(ctr, "long double");[m
[31m-      } else if (size == 1) {[m
[31m-	if (!((info ^ CTF_UCHAR) & CTF_UNSIGNED)) ctype_preplit(ctr, "char");[m
[31m-	else if (CTF_UCHAR) ctype_preplit(ctr, "signed char");[m
[31m-	else ctype_preplit(ctr, "unsigned char");[m
[31m-      } else if (size < 8) {[m
[31m-	if (size == 4) ctype_preplit(ctr, "int");[m
[31m-	else ctype_preplit(ctr, "short");[m
[31m-	if ((info & CTF_UNSIGNED)) ctype_preplit(ctr, "unsigned");[m
[31m-      } else {[m
[31m-	ctype_preplit(ctr, "_t");[m
[31m-	ctype_prepnum(ctr, size*8);[m
[31m-	ctype_preplit(ctr, "int");[m
[31m-	if ((info & CTF_UNSIGNED)) ctype_prepc(ctr, 'u');[m
[31m-      }[m
[31m-      ctype_prepqual(ctr, (qual|info));[m
[31m-      return;[m
[31m-    case CT_VOID:[m
[31m-      ctype_preplit(ctr, "void");[m
[31m-      ctype_prepqual(ctr, (qual|info));[m
[31m-      return;[m
[31m-    case CT_STRUCT:[m
[31m-      ctype_preptype(ctr, ct, qual, (info & CTF_UNION) ? "union" : "struct");[m
[31m-      return;[m
[31m-    case CT_ENUM:[m
[31m-      if (id == CTID_CTYPEID) {[m
[31m-	ctype_preplit(ctr, "ctype");[m
[31m-	return;[m
[31m-      }[m
[31m-      ctype_preptype(ctr, ct, qual, "enum");[m
[31m-      return;[m
[31m-    case CT_ATTRIB:[m
[31m-      if (ctype_attrib(info) == CTA_QUAL) qual |= size;[m
[31m-      break;[m
[31m-    case CT_PTR:[m
[31m-      if ((info & CTF_REF)) {[m
[31m-	ctype_prepc(ctr, '&');[m
[31m-      } else {[m
[31m-	ctype_prepqual(ctr, (qual|info));[m
[31m-	if (LJ_64 && size == 4) ctype_preplit(ctr, "__ptr32");[m
[31m-	ctype_prepc(ctr, '*');[m
[31m-      }[m
[31m-      qual = 0;[m
[31m-      ptrto = 1;[m
[31m-      ctr->needsp = 1;[m
[31m-      break;[m
[31m-    case CT_ARRAY:[m
[31m-      if (ctype_isrefarray(info)) {[m
[31m-	ctr->needsp = 1;[m
[31m-	if (ptrto) { ptrto = 0; ctype_prepc(ctr, '('); ctype_appc(ctr, ')'); }[m
[31m-	ctype_appc(ctr, '[');[m
[31m-	if (size != CTSIZE_INVALID) {[m
[31m-	  CTSize csize = ctype_child(ctr->cts, ct)->size;[m
[31m-	  ctype_appnum(ctr, csize ? size/csize : 0);[m
[31m-	} else if ((info & CTF_VLA)) {[m
[31m-	  ctype_appc(ctr, '?');[m
[31m-	}[m
[31m-	ctype_appc(ctr, ']');[m
[31m-      } else if ((info & CTF_COMPLEX)) {[m
[31m-	if (size == 2*sizeof(float)) ctype_preplit(ctr, "float");[m
[31m-	ctype_preplit(ctr, "complex");[m
[31m-	return;[m
[31m-      } else {[m
[31m-	ctype_preplit(ctr, ")))");[m
[31m-	ctype_prepnum(ctr, size);[m
[31m-	ctype_preplit(ctr, "__attribute__((vector_size(");[m
[31m-      }[m
[31m-      break;[m
[31m-    case CT_FUNC:[m
[31m-      ctr->needsp = 1;[m
[31m-      if (ptrto) { ptrto = 0; ctype_prepc(ctr, '('); ctype_appc(ctr, ')'); }[m
[31m-      ctype_appc(ctr, '(');[m
[31m-      ctype_appc(ctr, ')');[m
[31m-      break;[m
[31m-    default:[m
[31m-      lua_assert(0);[m
[31m-      break;[m
[31m-    }[m
[31m-    ct = ctype_get(ctr->cts, ctype_cid(info));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return a printable representation of a C type. */[m
[31m-GCstr *lj_ctype_repr(lua_State *L, CTypeID id, GCstr *name)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  CTRepr ctr;[m
[31m-  ctr.pb = ctr.pe = &ctr.buf[CTREPR_MAX/2];[m
[31m-  ctr.cts = ctype_ctsG(g);[m
[31m-  ctr.L = L;[m
[31m-  ctr.ok = 1;[m
[31m-  ctr.needsp = 0;[m
[31m-  if (name) ctype_prepstr(&ctr, strdata(name), name->len);[m
[31m-  ctype_repr(&ctr, id);[m
[31m-  if (LJ_UNLIKELY(!ctr.ok)) return lj_str_newlit(L, "?");[m
[31m-  return lj_str_new(L, ctr.pb, ctr.pe - ctr.pb);[m
[31m-}[m
[31m-[m
[31m-/* Convert int64_t/uint64_t to string with 'LL' or 'ULL' suffix. */[m
[31m-GCstr *lj_ctype_repr_int64(lua_State *L, uint64_t n, int isunsigned)[m
[31m-{[m
[31m-  char buf[1+20+3];[m
[31m-  char *p = buf+sizeof(buf);[m
[31m-  int sign = 0;[m
[31m-  *--p = 'L'; *--p = 'L';[m
[31m-  if (isunsigned) {[m
[31m-    *--p = 'U';[m
[31m-  } else if ((int64_t)n < 0) {[m
[31m-    n = (uint64_t)-(int64_t)n;[m
[31m-    sign = 1;[m
[31m-  }[m
[31m-  do { *--p = (char)('0' + n % 10); } while (n /= 10);[m
[31m-  if (sign) *--p = '-';[m
[31m-  return lj_str_new(L, p, (size_t)(buf+sizeof(buf)-p));[m
[31m-}[m
[31m-[m
[31m-/* Convert complex to string with 'i' or 'I' suffix. */[m
[31m-GCstr *lj_ctype_repr_complex(lua_State *L, void *sp, CTSize size)[m
[31m-{[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  TValue re, im;[m
[31m-  if (size == 2*sizeof(double)) {[m
[31m-    re.n = *(double *)sp; im.n = ((double *)sp)[1];[m
[31m-  } else {[m
[31m-    re.n = (double)*(float *)sp; im.n = (double)((float *)sp)[1];[m
[31m-  }[m
[31m-  lj_strfmt_putfnum(sb, STRFMT_G14, re.n);[m
[31m-  if (!(im.u32.hi & 0x80000000u) || im.n != im.n) lj_buf_putchar(sb, '+');[m
[31m-  lj_strfmt_putfnum(sb, STRFMT_G14, im.n);[m
[31m-  lj_buf_putchar(sb, sbufP(sb)[-1] >= 'a' ? 'I' : 'i');[m
[31m-  return lj_buf_str(L, sb);[m
[31m-}[m
[31m-[m
[31m-/* -- C type state -------------------------------------------------------- */[m
[31m-[m
[31m-/* Initialize C type table and state. */[m
[31m-CTState *lj_ctype_init(lua_State *L)[m
[31m-{[m
[31m-  CTState *cts = lj_mem_newt(L, sizeof(CTState), CTState);[m
[31m-  CType *ct = lj_mem_newvec(L, CTTYPETAB_MIN, CType);[m
[31m-  const char *name = lj_ctype_typenames;[m
[31m-  CTypeID id;[m
[31m-  memset(cts, 0, sizeof(CTState));[m
[31m-  cts->tab = ct;[m
[31m-  cts->sizetab = CTTYPETAB_MIN;[m
[31m-  cts->top = CTTYPEINFO_NUM;[m
[31m-  cts->L = NULL;[m
[31m-  cts->g = G(L);[m
[31m-  for (id = 0; id < CTTYPEINFO_NUM; id++, ct++) {[m
[31m-    CTInfo info = lj_ctype_typeinfo[id];[m
[31m-    ct->size = (CTSize)((int32_t)(info << 16) >> 26);[m
[31m-    ct->info = info & 0xffff03ffu;[m
[31m-    ct->sib = 0;[m
[31m-    if (ctype_type(info) == CT_KW || ctype_istypedef(info)) {[m
[31m-      size_t len = strlen(name);[m
[31m-      GCstr *str = lj_str_new(L, name, len);[m
[31m-      ctype_setname(ct, str);[m
[31m-      name += len+1;[m
[31m-      lj_ctype_addname(cts, ct, id);[m
[31m-    } else {[m
[31m-      setgcrefnull(ct->name);[m
[31m-      ct->next = 0;[m
[31m-      if (!ctype_isenum(info)) ctype_addtype(cts, ct, id);[m
[31m-    }[m
[31m-  }[m
[31m-  setmref(G(L)->ctype_state, cts);[m
[31m-  return cts;[m
[31m-}[m
[31m-[m
[31m-/* Free C type table and state. */[m
[31m-void lj_ctype_freestate(global_State *g)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(g);[m
[31m-  if (cts) {[m
[31m-    lj_ccallback_mcode_free(cts);[m
[31m-    lj_mem_freevec(g, cts->tab, cts->sizetab, CType);[m
[31m-    lj_mem_freevec(g, cts->cb.cbid, cts->cb.sizeid, CTypeID1);[m
[31m-    lj_mem_freet(g, cts);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ctype.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ctype.h[m
[1mdeleted file mode 100644[m
[1mindex e9b426f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ctype.h[m
[1m+++ /dev/null[m
[36m@@ -1,461 +0,0 @@[m
[31m-/*[m
[31m-** C type management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_CTYPE_H[m
[31m-#define _LJ_CTYPE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-[m
[31m-/* -- C type definitions -------------------------------------------------- */[m
[31m-[m
[31m-/* C type numbers. Highest 4 bits of C type info. ORDER CT. */[m
[31m-enum {[m
[31m-  /* Externally visible types. */[m
[31m-  CT_NUM,		/* Integer or floating-point numbers. */[m
[31m-  CT_STRUCT,		/* Struct or union. */[m
[31m-  CT_PTR,		/* Pointer or reference. */[m
[31m-  CT_ARRAY,		/* Array or complex type. */[m
[31m-  CT_MAYCONVERT = CT_ARRAY,[m
[31m-  CT_VOID,		/* Void type. */[m
[31m-  CT_ENUM,		/* Enumeration. */[m
[31m-  CT_HASSIZE = CT_ENUM,  /* Last type where ct->size holds the actual size. */[m
[31m-  CT_FUNC,		/* Function. */[m
[31m-  CT_TYPEDEF,		/* Typedef. */[m
[31m-  CT_ATTRIB,		/* Miscellaneous attributes. */[m
[31m-  /* Internal element types. */[m
[31m-  CT_FIELD,		/* Struct/union field or function parameter. */[m
[31m-  CT_BITFIELD,		/* Struct/union bitfield. */[m
[31m-  CT_CONSTVAL,		/* Constant value. */[m
[31m-  CT_EXTERN,		/* External reference. */[m
[31m-  CT_KW			/* Keyword. */[m
[31m-};[m
[31m-[m
[31m-LJ_STATIC_ASSERT(((int)CT_PTR & (int)CT_ARRAY) == CT_PTR);[m
[31m-LJ_STATIC_ASSERT(((int)CT_STRUCT & (int)CT_ARRAY) == CT_STRUCT);[m
[31m-[m
[31m-/*[m
[31m-**  ---------- info ------------[m
[31m-** |type      flags...  A   cid | size   |  sib  | next  | name  |[m
[31m-** +----------------------------+--------+-------+-------+-------+--[m
[31m-** |NUM       BFvcUL..  A       | size   |       | type  |       |[m
[31m-** |STRUCT    ..vcU..V  A       | size   | field | name? | name? |[m
[31m-** |PTR       ..vcR...  A   cid | size   |       | type  |       |[m
[31m-** |ARRAY     VCvc...V  A   cid | size   |       | type  |       |[m
[31m-** |VOID      ..vc....  A       | size   |       | type  |       |[m
[31m-** |ENUM                A   cid | size   | const | name? | name? |[m
[31m-** |FUNC      ....VS.. cc   cid | nargs  | field | name? | name? |[m
[31m-** |TYPEDEF                 cid |        |       | name  | name  |[m
[31m-** |ATTRIB        attrnum   cid | attr   | sib?  | type? |       |[m
[31m-** |FIELD                   cid | offset | field |       | name? |[m
[31m-** |BITFIELD  B.vcU csz bsz pos | offset | field |       | name? |[m
[31m-** |CONSTVAL     c          cid | value  | const | name  | name  |[m
[31m-** |EXTERN                  cid |        | sib?  | name  | name  |[m
[31m-** |KW                      tok | size   |       | name  | name  |[m
[31m-** +----------------------------+--------+-------+-------+-------+--[m
[31m-**        ^^  ^^--- bits used for C type conversion dispatch[m
[31m-*/[m
[31m-[m
[31m-/* C type info flags.     TFFArrrr  */[m
[31m-#define CTF_BOOL	0x08000000u	/* Boolean: NUM, BITFIELD. */[m
[31m-#define CTF_FP		0x04000000u	/* Floating-point: NUM. */[m
[31m-#define CTF_CONST	0x02000000u	/* Const qualifier. */[m
[31m-#define CTF_VOLATILE	0x01000000u	/* Volatile qualifier. */[m
[31m-#define CTF_UNSIGNED	0x00800000u	/* Unsigned: NUM, BITFIELD. */[m
[31m-#define CTF_LONG	0x00400000u	/* Long: NUM. */[m
[31m-#define CTF_VLA		0x00100000u	/* Variable-length: ARRAY, STRUCT. */[m
[31m-#define CTF_REF		0x00800000u	/* Reference: PTR. */[m
[31m-#define CTF_VECTOR	0x08000000u	/* Vector: ARRAY. */[m
[31m-#define CTF_COMPLEX	0x04000000u	/* Complex: ARRAY. */[m
[31m-#define CTF_UNION	0x00800000u	/* Union: STRUCT. */[m
[31m-#define CTF_VARARG	0x00800000u	/* Vararg: FUNC. */[m
[31m-#define CTF_SSEREGPARM	0x00400000u	/* SSE register parameters: FUNC. */[m
[31m-[m
[31m-#define CTF_QUAL	(CTF_CONST|CTF_VOLATILE)[m
[31m-#define CTF_ALIGN	(CTMASK_ALIGN<<CTSHIFT_ALIGN)[m
[31m-#define CTF_UCHAR	((char)-1 > 0 ? CTF_UNSIGNED : 0)[m
[31m-[m
[31m-/* Flags used in parser.  .F.Ammvf   cp->attr  */[m
[31m-#define CTFP_ALIGNED	0x00000001u	/* cp->attr + ALIGN */[m
[31m-#define CTFP_PACKED	0x00000002u	/* cp->attr */[m
[31m-/*                        ...C...f   cp->fattr */[m
[31m-#define CTFP_CCONV	0x00000001u	/* cp->fattr + CCONV/[SSE]REGPARM */[m
[31m-[m
[31m-/* C type info bitfields. */[m
[31m-#define CTMASK_CID	0x0000ffffu	/* Max. 65536 type IDs. */[m
[31m-#define CTMASK_NUM	0xf0000000u	/* Max. 16 type numbers. */[m
[31m-#define CTSHIFT_NUM	28[m
[31m-#define CTMASK_ALIGN	15		/* Max. alignment is 2^15. */[m
[31m-#define CTSHIFT_ALIGN	16[m
[31m-#define CTMASK_ATTRIB	255		/* Max. 256 attributes. */[m
[31m-#define CTSHIFT_ATTRIB	16[m
[31m-#define CTMASK_CCONV	3		/* Max. 4 calling conventions. */[m
[31m-#define CTSHIFT_CCONV	16[m
[31m-#define CTMASK_REGPARM	3		/* Max. 0-3 regparms. */[m
[31m-#define CTSHIFT_REGPARM	18[m
[31m-/* Bitfields only used in parser. */[m
[31m-#define CTMASK_VSIZEP	15		/* Max. vector size is 2^15. */[m
[31m-#define CTSHIFT_VSIZEP	4[m
[31m-#define CTMASK_MSIZEP	255		/* Max. type size (via mode) is 128. */[m
[31m-#define CTSHIFT_MSIZEP	8[m
[31m-[m
[31m-/* Info bits for BITFIELD. Max. size of bitfield is 64 bits. */[m
[31m-#define CTBSZ_MAX	32		/* Max. size of bitfield is 32 bit. */[m
[31m-#define CTBSZ_FIELD	127		/* Temp. marker for regular field. */[m
[31m-#define CTMASK_BITPOS	127[m
[31m-#define CTMASK_BITBSZ	127[m
[31m-#define CTMASK_BITCSZ	127[m
[31m-#define CTSHIFT_BITPOS	0[m
[31m-#define CTSHIFT_BITBSZ	8[m
[31m-#define CTSHIFT_BITCSZ	16[m
[31m-[m
[31m-#define CTF_INSERT(info, field, val) \[m
[31m-  info = (info & ~(CTMASK_##field<<CTSHIFT_##field)) | \[m
[31m-	  (((CTSize)(val) & CTMASK_##field) << CTSHIFT_##field)[m
[31m-[m
[31m-/* Calling conventions. ORDER CC */[m
[31m-enum { CTCC_CDECL, CTCC_THISCALL, CTCC_FASTCALL, CTCC_STDCALL };[m
[31m-[m
[31m-/* Attribute numbers. */[m
[31m-enum {[m
[31m-  CTA_NONE,		/* Ignored attribute. Must be zero. */[m
[31m-  CTA_QUAL,		/* Unmerged qualifiers. */[m
[31m-  CTA_ALIGN,		/* Alignment override. */[m
[31m-  CTA_SUBTYPE,		/* Transparent sub-type. */[m
[31m-  CTA_REDIR,		/* Redirected symbol name. */[m
[31m-  CTA_BAD,		/* To catch bad IDs. */[m
[31m-  CTA__MAX[m
[31m-};[m
[31m-[m
[31m-/* Special sizes. */[m
[31m-#define CTSIZE_INVALID	0xffffffffu[m
[31m-[m
[31m-typedef uint32_t CTInfo;	/* Type info. */[m
[31m-typedef uint32_t CTSize;	/* Type size. */[m
[31m-typedef uint32_t CTypeID;	/* Type ID. */[m
[31m-typedef uint16_t CTypeID1;	/* Minimum-sized type ID. */[m
[31m-[m
[31m-/* C type table element. */[m
[31m-typedef struct CType {[m
[31m-  CTInfo info;		/* Type info. */[m
[31m-  CTSize size;		/* Type size or other info. */[m
[31m-  CTypeID1 sib;		/* Sibling element. */[m
[31m-  CTypeID1 next;	/* Next element in hash chain. */[m
[31m-  GCRef name;		/* Element name (GCstr). */[m
[31m-} CType;[m
[31m-[m
[31m-#define CTHASH_SIZE	128	/* Number of hash anchors. */[m
[31m-#define CTHASH_MASK	(CTHASH_SIZE-1)[m
[31m-[m
[31m-/* Simplify target-specific configuration. Checked in lj_ccall.h. */[m
[31m-#define CCALL_MAX_GPR		8[m
[31m-#define CCALL_MAX_FPR		8[m
[31m-[m
[31m-typedef LJ_ALIGN(8) union FPRCBArg { double d; float f[2]; } FPRCBArg;[m
[31m-[m
[31m-/* C callback state. Defined here, to avoid dragging in lj_ccall.h. */[m
[31m-[m
[31m-typedef LJ_ALIGN(8) struct CCallback {[m
[31m-  FPRCBArg fpr[CCALL_MAX_FPR];	/* Arguments/results in FPRs. */[m
[31m-  intptr_t gpr[CCALL_MAX_GPR];	/* Arguments/results in GPRs. */[m
[31m-  intptr_t *stack;		/* Pointer to arguments on stack. */[m
[31m-  void *mcode;			/* Machine code for callback func. pointers. */[m
[31m-  CTypeID1 *cbid;		/* Callback type table. */[m
[31m-  MSize sizeid;			/* Size of callback type table. */[m
[31m-  MSize topid;			/* Highest unused callback type table slot. */[m
[31m-  MSize slot;			/* Current callback slot. */[m
[31m-} CCallback;[m
[31m-[m
[31m-/* C type state. */[m
[31m-typedef struct CTState {[m
[31m-  CType *tab;		/* C type table. */[m
[31m-  CTypeID top;		/* Current top of C type table. */[m
[31m-  MSize sizetab;	/* Size of C type table. */[m
[31m-  lua_State *L;		/* Lua state (needed for errors and allocations). */[m
[31m-  global_State *g;	/* Global state. */[m
[31m-  GCtab *finalizer;	/* Map of cdata to finalizer. */[m
[31m-  GCtab *miscmap;	/* Map of -CTypeID to metatable and cb slot to func. */[m
[31m-  CCallback cb;		/* Temporary callback state. */[m
[31m-  CTypeID1 hash[CTHASH_SIZE];  /* Hash anchors for C type table. */[m
[31m-} CTState;[m
[31m-[m
[31m-#define CTINFO(ct, flags)	(((CTInfo)(ct) << CTSHIFT_NUM) + (flags))[m
[31m-#define CTALIGN(al)		((CTSize)(al) << CTSHIFT_ALIGN)[m
[31m-#define CTATTRIB(at)		((CTInfo)(at) << CTSHIFT_ATTRIB)[m
[31m-[m
[31m-#define ctype_type(info)	((info) >> CTSHIFT_NUM)[m
[31m-#define ctype_cid(info)		((CTypeID)((info) & CTMASK_CID))[m
[31m-#define ctype_align(info)	(((info) >> CTSHIFT_ALIGN) & CTMASK_ALIGN)[m
[31m-#define ctype_attrib(info)	(((info) >> CTSHIFT_ATTRIB) & CTMASK_ATTRIB)[m
[31m-#define ctype_bitpos(info)	(((info) >> CTSHIFT_BITPOS) & CTMASK_BITPOS)[m
[31m-#define ctype_bitbsz(info)	(((info) >> CTSHIFT_BITBSZ) & CTMASK_BITBSZ)[m
[31m-#define ctype_bitcsz(info)	(((info) >> CTSHIFT_BITCSZ) & CTMASK_BITCSZ)[m
[31m-#define ctype_vsizeP(info)	(((info) >> CTSHIFT_VSIZEP) & CTMASK_VSIZEP)[m
[31m-#define ctype_msizeP(info)	(((info) >> CTSHIFT_MSIZEP) & CTMASK_MSIZEP)[m
[31m-#define ctype_cconv(info)	(((info) >> CTSHIFT_CCONV) & CTMASK_CCONV)[m
[31m-[m
[31m-/* Simple type checks. */[m
[31m-#define ctype_isnum(info)	(ctype_type((info)) == CT_NUM)[m
[31m-#define ctype_isvoid(info)	(ctype_type((info)) == CT_VOID)[m
[31m-#define ctype_isptr(info)	(ctype_type((info)) == CT_PTR)[m
[31m-#define ctype_isarray(info)	(ctype_type((info)) == CT_ARRAY)[m
[31m-#define ctype_isstruct(info)	(ctype_type((info)) == CT_STRUCT)[m
[31m-#define ctype_isfunc(info)	(ctype_type((info)) == CT_FUNC)[m
[31m-#define ctype_isenum(info)	(ctype_type((info)) == CT_ENUM)[m
[31m-#define ctype_istypedef(info)	(ctype_type((info)) == CT_TYPEDEF)[m
[31m-#define ctype_isattrib(info)	(ctype_type((info)) == CT_ATTRIB)[m
[31m-#define ctype_isfield(info)	(ctype_type((info)) == CT_FIELD)[m
[31m-#define ctype_isbitfield(info)	(ctype_type((info)) == CT_BITFIELD)[m
[31m-#define ctype_isconstval(info)	(ctype_type((info)) == CT_CONSTVAL)[m
[31m-#define ctype_isextern(info)	(ctype_type((info)) == CT_EXTERN)[m
[31m-#define ctype_hassize(info)	(ctype_type((info)) <= CT_HASSIZE)[m
[31m-[m
[31m-/* Combined type and flag checks. */[m
[31m-#define ctype_isinteger(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_BOOL|CTF_FP)) == CTINFO(CT_NUM, 0))[m
[31m-#define ctype_isinteger_or_bool(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_FP)) == CTINFO(CT_NUM, 0))[m
[31m-#define ctype_isbool(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_BOOL)) == CTINFO(CT_NUM, CTF_BOOL))[m
[31m-#define ctype_isfp(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_FP)) == CTINFO(CT_NUM, CTF_FP))[m
[31m-[m
[31m-#define ctype_ispointer(info) \[m
[31m-  ((ctype_type(info) >> 1) == (CT_PTR >> 1))  /* Pointer or array. */[m
[31m-#define ctype_isref(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_REF)) == CTINFO(CT_PTR, CTF_REF))[m
[31m-[m
[31m-#define ctype_isrefarray(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_VECTOR|CTF_COMPLEX)) == CTINFO(CT_ARRAY, 0))[m
[31m-#define ctype_isvector(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_VECTOR)) == CTINFO(CT_ARRAY, CTF_VECTOR))[m
[31m-#define ctype_iscomplex(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_COMPLEX)) == CTINFO(CT_ARRAY, CTF_COMPLEX))[m
[31m-[m
[31m-#define ctype_isvltype(info) \[m
[31m-  (((info) & ((CTMASK_NUM|CTF_VLA) - (2u<<CTSHIFT_NUM))) == \[m
[31m-   CTINFO(CT_STRUCT, CTF_VLA))  /* VL array or VL struct. */[m
[31m-#define ctype_isvlarray(info) \[m
[31m-  (((info) & (CTMASK_NUM|CTF_VLA)) == CTINFO(CT_ARRAY, CTF_VLA))[m
[31m-[m
[31m-#define ctype_isxattrib(info, at) \[m
[31m-  (((info) & (CTMASK_NUM|CTATTRIB(CTMASK_ATTRIB))) == \[m
[31m-   CTINFO(CT_ATTRIB, CTATTRIB(at)))[m
[31m-[m
[31m-/* Target-dependent sizes and alignments. */[m
[31m-#if LJ_64[m
[31m-#define CTSIZE_PTR	8[m
[31m-#define CTALIGN_PTR	CTALIGN(3)[m
[31m-#else[m
[31m-#define CTSIZE_PTR	4[m
[31m-#define CTALIGN_PTR	CTALIGN(2)[m
[31m-#endif[m
[31m-[m
[31m-#define CTINFO_REF(ref) \[m
[31m-  CTINFO(CT_PTR, (CTF_CONST|CTF_REF|CTALIGN_PTR) + (ref))[m
[31m-[m
[31m-#define CT_MEMALIGN	3	/* Alignment guaranteed by memory allocator. */[m
[31m-[m
[31m-/* -- Predefined types ---------------------------------------------------- */[m
[31m-[m
[31m-/* Target-dependent types. */[m
[31m-#if LJ_TARGET_PPC[m
[31m-#define CTTYDEFP(_) \[m
[31m-  _(LINT32,		4,	CT_NUM, CTF_LONG|CTALIGN(2))[m
[31m-#else[m
[31m-#define CTTYDEFP(_)[m
[31m-#endif[m
[31m-[m
[31m-/* Common types. */[m
[31m-#define CTTYDEF(_) \[m
[31m-  _(NONE,		0,	CT_ATTRIB, CTATTRIB(CTA_BAD)) \[m
[31m-  _(VOID,		-1,	CT_VOID, CTALIGN(0)) \[m
[31m-  _(CVOID,		-1,	CT_VOID, CTF_CONST|CTALIGN(0)) \[m
[31m-  _(BOOL,		1,	CT_NUM, CTF_BOOL|CTF_UNSIGNED|CTALIGN(0)) \[m
[31m-  _(CCHAR,		1,	CT_NUM, CTF_CONST|CTF_UCHAR|CTALIGN(0)) \[m
[31m-  _(INT8,		1,	CT_NUM, CTALIGN(0)) \[m
[31m-  _(UINT8,		1,	CT_NUM, CTF_UNSIGNED|CTALIGN(0)) \[m
[31m-  _(INT16,		2,	CT_NUM, CTALIGN(1)) \[m
[31m-  _(UINT16,		2,	CT_NUM, CTF_UNSIGNED|CTALIGN(1)) \[m
[31m-  _(INT32,		4,	CT_NUM, CTALIGN(2)) \[m
[31m-  _(UINT32,		4,	CT_NUM, CTF_UNSIGNED|CTALIGN(2)) \[m
[31m-  _(INT64,		8,	CT_NUM, CTF_LONG|CTALIGN(3)) \[m
[31m-  _(UINT64,		8,	CT_NUM, CTF_UNSIGNED|CTF_LONG|CTALIGN(3)) \[m
[31m-  _(FLOAT,		4,	CT_NUM, CTF_FP|CTALIGN(2)) \[m
[31m-  _(DOUBLE,		8,	CT_NUM, CTF_FP|CTALIGN(3)) \[m
[31m-  _(COMPLEX_FLOAT,	8,	CT_ARRAY, CTF_COMPLEX|CTALIGN(2)|CTID_FLOAT) \[m
[31m-  _(COMPLEX_DOUBLE,	16,	CT_ARRAY, CTF_COMPLEX|CTALIGN(3)|CTID_DOUBLE) \[m
[31m-  _(P_VOID,	CTSIZE_PTR,	CT_PTR, CTALIGN_PTR|CTID_VOID) \[m
[31m-  _(P_CVOID,	CTSIZE_PTR,	CT_PTR, CTALIGN_PTR|CTID_CVOID) \[m
[31m-  _(P_CCHAR,	CTSIZE_PTR,	CT_PTR, CTALIGN_PTR|CTID_CCHAR) \[m
[31m-  _(A_CCHAR,		-1,	CT_ARRAY, CTF_CONST|CTALIGN(0)|CTID_CCHAR) \[m
[31m-  _(CTYPEID,		4,	CT_ENUM, CTALIGN(2)|CTID_INT32) \[m
[31m-  CTTYDEFP(_) \[m
[31m-  /* End of type list. */[m
[31m-[m
[31m-/* Public predefined type IDs. */[m
[31m-enum {[m
[31m-#define CTTYIDDEF(id, sz, ct, info)	CTID_##id,[m
[31m-CTTYDEF(CTTYIDDEF)[m
[31m-#undef CTTYIDDEF[m
[31m-  /* Predefined typedefs and keywords follow. */[m
[31m-  CTID_MAX = 65536[m
[31m-};[m
[31m-[m
[31m-/* Target-dependent type IDs. */[m
[31m-#if LJ_64[m
[31m-#define CTID_INT_PSZ	CTID_INT64[m
[31m-#define CTID_UINT_PSZ	CTID_UINT64[m
[31m-#else[m
[31m-#define CTID_INT_PSZ	CTID_INT32[m
[31m-#define CTID_UINT_PSZ	CTID_UINT32[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_ABI_WIN[m
[31m-#define CTID_WCHAR	CTID_UINT16[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#define CTID_WCHAR	CTID_LINT32[m
[31m-#else[m
[31m-#define CTID_WCHAR	CTID_INT32[m
[31m-#endif[m
[31m-[m
[31m-/* -- C tokens and keywords ----------------------------------------------- */[m
[31m-[m
[31m-/* C lexer keywords. */[m
[31m-#define CTOKDEF(_) \[m
[31m-  _(IDENT, "<identifier>") _(STRING, "<string>") \[m
[31m-  _(INTEGER, "<integer>") _(EOF, "<eof>") \[m
[31m-  _(OROR, "||") _(ANDAND, "&&") _(EQ, "==") _(NE, "!=") \[m
[31m-  _(LE, "<=") _(GE, ">=") _(SHL, "<<") _(SHR, ">>") _(DEREF, "->")[m
[31m-[m
[31m-/* Simple declaration specifiers. */[m
[31m-#define CDSDEF(_) \[m
[31m-  _(VOID) _(BOOL) _(CHAR) _(INT) _(FP) \[m
[31m-  _(LONG) _(LONGLONG) _(SHORT) _(COMPLEX) _(SIGNED) _(UNSIGNED) \[m
[31m-  _(CONST) _(VOLATILE) _(RESTRICT) _(INLINE) \[m
[31m-  _(TYPEDEF) _(EXTERN) _(STATIC) _(AUTO) _(REGISTER)[m
[31m-[m
[31m-/* C keywords. */[m
[31m-#define CKWDEF(_) \[m
[31m-  CDSDEF(_) _(EXTENSION) _(ASM) _(ATTRIBUTE) \[m
[31m-  _(DECLSPEC) _(CCDECL) _(PTRSZ) \[m
[31m-  _(STRUCT) _(UNION) _(ENUM) \[m
[31m-  _(SIZEOF) _(ALIGNOF)[m
[31m-[m
[31m-/* C token numbers. */[m
[31m-enum {[m
[31m-  CTOK_OFS = 255,[m
[31m-#define CTOKNUM(name, sym)	CTOK_##name,[m
[31m-#define CKWNUM(name)		CTOK_##name,[m
[31m-CTOKDEF(CTOKNUM)[m
[31m-CKWDEF(CKWNUM)[m
[31m-#undef CTOKNUM[m
[31m-#undef CKWNUM[m
[31m-  CTOK_FIRSTDECL = CTOK_VOID,[m
[31m-  CTOK_FIRSTSCL = CTOK_TYPEDEF,[m
[31m-  CTOK_LASTDECLFLAG = CTOK_REGISTER,[m
[31m-  CTOK_LASTDECL = CTOK_ENUM[m
[31m-};[m
[31m-[m
[31m-/* Declaration specifier flags. */[m
[31m-enum {[m
[31m-#define CDSFLAG(name)	CDF_##name = (1u << (CTOK_##name - CTOK_FIRSTDECL)),[m
[31m-CDSDEF(CDSFLAG)[m
[31m-#undef CDSFLAG[m
[31m-  CDF__END[m
[31m-};[m
[31m-[m
[31m-#define CDF_SCL  (CDF_TYPEDEF|CDF_EXTERN|CDF_STATIC|CDF_AUTO|CDF_REGISTER)[m
[31m-[m
[31m-/* -- C type management --------------------------------------------------- */[m
[31m-[m
[31m-#define ctype_ctsG(g)		(mref((g)->ctype_state, CTState))[m
[31m-[m
[31m-/* Get C type state. */[m
[31m-static LJ_AINLINE CTState *ctype_cts(lua_State *L)[m
[31m-{[m
[31m-  CTState *cts = ctype_ctsG(G(L));[m
[31m-  cts->L = L;  /* Save L for errors and allocations. */[m
[31m-  return cts;[m
[31m-}[m
[31m-[m
[31m-/* Save and restore state of C type table. */[m
[31m-#define LJ_CTYPE_SAVE(cts)	CTState savects_ = *(cts)[m
[31m-#define LJ_CTYPE_RESTORE(cts) \[m
[31m-  ((cts)->top = savects_.top, \[m
[31m-   memcpy((cts)->hash, savects_.hash, sizeof(savects_.hash)))[m
[31m-[m
[31m-/* Check C type ID for validity when assertions are enabled. */[m
[31m-static LJ_AINLINE CTypeID ctype_check(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  lua_assert(id > 0 && id < cts->top); UNUSED(cts);[m
[31m-  return id;[m
[31m-}[m
[31m-[m
[31m-/* Get C type for C type ID. */[m
[31m-static LJ_AINLINE CType *ctype_get(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  return &cts->tab[ctype_check(cts, id)];[m
[31m-}[m
[31m-[m
[31m-/* Get C type ID for a C type. */[m
[31m-#define ctype_typeid(cts, ct)	((CTypeID)((ct) - (cts)->tab))[m
[31m-[m
[31m-/* Get child C type. */[m
[31m-static LJ_AINLINE CType *ctype_child(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  lua_assert(!(ctype_isvoid(ct->info) || ctype_isstruct(ct->info) ||[m
[31m-	     ctype_isbitfield(ct->info)));  /* These don't have children. */[m
[31m-  return ctype_get(cts, ctype_cid(ct->info));[m
[31m-}[m
[31m-[m
[31m-/* Get raw type for a C type ID. */[m
[31m-static LJ_AINLINE CType *ctype_raw(CTState *cts, CTypeID id)[m
[31m-{[m
[31m-  CType *ct = ctype_get(cts, id);[m
[31m-  while (ctype_isattrib(ct->info)) ct = ctype_child(cts, ct);[m
[31m-  return ct;[m
[31m-}[m
[31m-[m
[31m-/* Get raw type of the child of a C type. */[m
[31m-static LJ_AINLINE CType *ctype_rawchild(CTState *cts, CType *ct)[m
[31m-{[m
[31m-  do { ct = ctype_child(cts, ct); } while (ctype_isattrib(ct->info));[m
[31m-  return ct;[m
[31m-}[m
[31m-[m
[31m-/* Set the name of a C type table element. */[m
[31m-static LJ_AINLINE void ctype_setname(CType *ct, GCstr *s)[m
[31m-{[m
[31m-  /* NOBARRIER: mark string as fixed -- the C type table is never collected. */[m
[31m-  fixstring(s);[m
[31m-  setgcref(ct->name, obj2gco(s));[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC CTypeID lj_ctype_new(CTState *cts, CType **ctp);[m
[31m-LJ_FUNC CTypeID lj_ctype_intern(CTState *cts, CTInfo info, CTSize size);[m
[31m-LJ_FUNC void lj_ctype_addname(CTState *cts, CType *ct, CTypeID id);[m
[31m-LJ_FUNC CTypeID lj_ctype_getname(CTState *cts, CType **ctp, GCstr *name,[m
[31m-				 uint32_t tmask);[m
[31m-LJ_FUNC CType *lj_ctype_getfieldq(CTState *cts, CType *ct, GCstr *name,[m
[31m-				  CTSize *ofs, CTInfo *qual);[m
[31m-#define lj_ctype_getfield(cts, ct, name, ofs) \[m
[31m-  lj_ctype_getfieldq((cts), (ct), (name), (ofs), NULL)[m
[31m-LJ_FUNC CType *lj_ctype_rawref(CTState *cts, CTypeID id);[m
[31m-LJ_FUNC CTSize lj_ctype_size(CTState *cts, CTypeID id);[m
[31m-LJ_FUNC CTSize lj_ctype_vlsize(CTState *cts, CType *ct, CTSize nelem);[m
[31m-LJ_FUNC CTInfo lj_ctype_info(CTState *cts, CTypeID id, CTSize *szp);[m
[31m-LJ_FUNC cTValue *lj_ctype_meta(CTState *cts, CTypeID id, MMS mm);[m
[31m-LJ_FUNC GCstr *lj_ctype_repr(lua_State *L, CTypeID id, GCstr *name);[m
[31m-LJ_FUNC GCstr *lj_ctype_repr_int64(lua_State *L, uint64_t n, int isunsigned);[m
[31m-LJ_FUNC GCstr *lj_ctype_repr_complex(lua_State *L, void *sp, CTSize size);[m
[31m-LJ_FUNC CTState *lj_ctype_init(lua_State *L);[m
[31m-LJ_FUNC void lj_ctype_freestate(global_State *g);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_debug.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_debug.c[m
[1mdeleted file mode 100644[m
[1mindex 30d1601..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_debug.c[m
[1m+++ /dev/null[m
[36m@@ -1,824 +0,0 @@[m
[31m-/*[m
[31m-** Debugging and introspection.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_debug_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#endif[m
[31m-[m
[31m-/* -- Frames -------------------------------------------------------------- */[m
[31m-[m
[31m-/* Get frame corresponding to a level. */[m
[31m-cTValue *lj_debug_frame(lua_State *L, int level, int *size)[m
[31m-{[m
[31m-  cTValue *frame, *nextframe, *bot = tvref(L->stack)+LJ_FR2;[m
[31m-  /* Traverse frames backwards. */[m
[31m-  for (nextframe = frame = L->base-1; frame > bot; ) {[m
[31m-    if (frame_gc(frame) == obj2gco(L))[m
[31m-      level++;  /* Skip dummy frames. See lj_err_optype_call(). */[m
[31m-    if (level-- == 0) {[m
[31m-      *size = (int)(nextframe - frame);[m
[31m-      return frame;  /* Level found. */[m
[31m-    }[m
[31m-    nextframe = frame;[m
[31m-    if (frame_islua(frame)) {[m
[31m-      frame = frame_prevl(frame);[m
[31m-    } else {[m
[31m-      if (frame_isvarg(frame))[m
[31m-	level++;  /* Skip vararg pseudo-frame. */[m
[31m-      frame = frame_prevd(frame);[m
[31m-    }[m
[31m-  }[m
[31m-  *size = level;[m
[31m-  return NULL;  /* Level not found. */[m
[31m-}[m
[31m-[m
[31m-/* Invalid bytecode position. */[m
[31m-#define NO_BCPOS	(~(BCPos)0)[m
[31m-[m
[31m-/* Return bytecode position for function/frame or NO_BCPOS. */[m
[31m-static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe)[m
[31m-{[m
[31m-  const BCIns *ins;[m
[31m-  GCproto *pt;[m
[31m-  BCPos pos;[m
[31m-  lua_assert(fn->c.gct == ~LJ_TFUNC || fn->c.gct == ~LJ_TTHREAD);[m
[31m-  if (!isluafunc(fn)) {  /* Cannot derive a PC for non-Lua functions. */[m
[31m-    return NO_BCPOS;[m
[31m-  } else if (nextframe == NULL) {  /* Lua function on top. */[m
[31m-    void *cf = cframe_raw(L->cframe);[m
[31m-    if (cf == NULL || (char *)cframe_pc(cf) == (char *)cframe_L(cf))[m
[31m-      return NO_BCPOS;[m
[31m-    ins = cframe_pc(cf);  /* Only happens during error/hook handling. */[m
[31m-  } else {[m
[31m-    if (frame_islua(nextframe)) {[m
[31m-      ins = frame_pc(nextframe);[m
[31m-    } else if (frame_iscont(nextframe)) {[m
[31m-      ins = frame_contpc(nextframe);[m
[31m-    } else {[m
[31m-      /* Lua function below errfunc/gc/hook: find cframe to get the PC. */[m
[31m-      void *cf = cframe_raw(L->cframe);[m
[31m-      TValue *f = L->base-1;[m
[31m-      for (;;) {[m
[31m-	if (cf == NULL)[m
[31m-	  return NO_BCPOS;[m
[31m-	while (cframe_nres(cf) < 0) {[m
[31m-	  if (f >= restorestack(L, -cframe_nres(cf)))[m
[31m-	    break;[m
[31m-	  cf = cframe_raw(cframe_prev(cf));[m
[31m-	  if (cf == NULL)[m
[31m-	    return NO_BCPOS;[m
[31m-	}[m
[31m-	if (f < nextframe)[m
[31m-	  break;[m
[31m-	if (frame_islua(f)) {[m
[31m-	  f = frame_prevl(f);[m
[31m-	} else {[m
[31m-	  if (frame_isc(f) || (frame_iscont(f) && frame_iscont_fficb(f)))[m
[31m-	    cf = cframe_raw(cframe_prev(cf));[m
[31m-	  f = frame_prevd(f);[m
[31m-	}[m
[31m-      }[m
[31m-      ins = cframe_pc(cf);[m
[31m-    }[m
[31m-  }[m
[31m-  pt = funcproto(fn);[m
[31m-  pos = proto_bcpos(pt, ins) - 1;[m
[31m-#if LJ_HASJIT[m
[31m-  if (pos > pt->sizebc) {  /* Undo the effects of lj_trace_exit for JLOOP. */[m
[31m-    GCtrace *T = (GCtrace *)((char *)(ins-1) - offsetof(GCtrace, startins));[m
[31m-    lua_assert(bc_isret(bc_op(ins[-1])));[m
[31m-    pos = proto_bcpos(pt, mref(T->startpc, const BCIns));[m
[31m-  }[m
[31m-#endif[m
[31m-  return pos;[m
[31m-}[m
[31m-[m
[31m-/* -- Line numbers -------------------------------------------------------- */[m
[31m-[m
[31m-/* Get line number for a bytecode position. */[m
[31m-BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc)[m
[31m-{[m
[31m-  const void *lineinfo = proto_lineinfo(pt);[m
[31m-  if (pc <= pt->sizebc && lineinfo) {[m
[31m-    BCLine first = pt->firstline;[m
[31m-    if (pc == pt->sizebc) return first + pt->numline;[m
[31m-    if (pc-- == 0) return first;[m
[31m-    if (pt->numline < 256)[m
[31m-      return first + (BCLine)((const uint8_t *)lineinfo)[pc];[m
[31m-    else if (pt->numline < 65536)[m
[31m-      return first + (BCLine)((const uint16_t *)lineinfo)[pc];[m
[31m-    else[m
[31m-      return first + (BCLine)((const uint32_t *)lineinfo)[pc];[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Get line number for function/frame. */[m
[31m-static BCLine debug_frameline(lua_State *L, GCfunc *fn, cTValue *nextframe)[m
[31m-{[m
[31m-  BCPos pc = debug_framepc(L, fn, nextframe);[m
[31m-  if (pc != NO_BCPOS) {[m
[31m-    GCproto *pt = funcproto(fn);[m
[31m-    lua_assert(pc <= pt->sizebc);[m
[31m-    return lj_debug_line(pt, pc);[m
[31m-  }[m
[31m-  return -1;[m
[31m-}[m
[31m-[m
[31m-/* -- Variable names ------------------------------------------------------ */[m
[31m-[m
[31m-/* Get name of a local variable from slot number and PC. */[m
[31m-static const char *debug_varname(const GCproto *pt, BCPos pc, BCReg slot)[m
[31m-{[m
[31m-  const char *p = (const char *)proto_varinfo(pt);[m
[31m-  if (p) {[m
[31m-    BCPos lastpc = 0;[m
[31m-    for (;;) {[m
[31m-      const char *name = p;[m
[31m-      uint32_t vn = *(const uint8_t *)p;[m
[31m-      BCPos startpc, endpc;[m
[31m-      if (vn < VARNAME__MAX) {[m
[31m-	if (vn == VARNAME_END) break;  /* End of varinfo. */[m
[31m-      } else {[m
[31m-	do { p++; } while (*(const uint8_t *)p);  /* Skip over variable name. */[m
[31m-      }[m
[31m-      p++;[m
[31m-      lastpc = startpc = lastpc + lj_buf_ruleb128(&p);[m
[31m-      if (startpc > pc) break;[m
[31m-      endpc = startpc + lj_buf_ruleb128(&p);[m
[31m-      if (pc < endpc && slot-- == 0) {[m
[31m-	if (vn < VARNAME__MAX) {[m
[31m-#define VARNAMESTR(name, str)	str "\0"[m
[31m-	  name = VARNAMEDEF(VARNAMESTR);[m
[31m-#undef VARNAMESTR[m
[31m-	  if (--vn) while (*name++ || --vn) ;[m
[31m-	}[m
[31m-	return name;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Get name of local variable from 1-based slot number and function/frame. */[m
[31m-static TValue *debug_localname(lua_State *L, const lua_Debug *ar,[m
[31m-			       const char **name, BCReg slot1)[m
[31m-{[m
[31m-  uint32_t offset = (uint32_t)ar->i_ci & 0xffff;[m
[31m-  uint32_t size = (uint32_t)ar->i_ci >> 16;[m
[31m-  TValue *frame = tvref(L->stack) + offset;[m
[31m-  TValue *nextframe = size ? frame + size : NULL;[m
[31m-  GCfunc *fn = frame_func(frame);[m
[31m-  BCPos pc = debug_framepc(L, fn, nextframe);[m
[31m-  if (!nextframe) nextframe = L->top+LJ_FR2;[m
[31m-  if ((int)slot1 < 0) {  /* Negative slot number is for varargs. */[m
[31m-    if (pc != NO_BCPOS) {[m
[31m-      GCproto *pt = funcproto(fn);[m
[31m-      if ((pt->flags & PROTO_VARARG)) {[m
[31m-	slot1 = pt->numparams + (BCReg)(-(int)slot1);[m
[31m-	if (frame_isvarg(frame)) {  /* Vararg frame has been set up? (pc!=0) */[m
[31m-	  nextframe = frame;[m
[31m-	  frame = frame_prevd(frame);[m
[31m-	}[m
[31m-	if (frame + slot1+LJ_FR2 < nextframe) {[m
[31m-	  *name = "(*vararg)";[m
[31m-	  return frame+slot1;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  if (pc != NO_BCPOS &&[m
[31m-      (*name = debug_varname(funcproto(fn), pc, slot1-1)) != NULL)[m
[31m-    ;[m
[31m-  else if (slot1 > 0 && frame + slot1+LJ_FR2 < nextframe)[m
[31m-    *name = "(*temporary)";[m
[31m-  return frame+slot1;[m
[31m-}[m
[31m-[m
[31m-/* Get name of upvalue. */[m
[31m-const char *lj_debug_uvname(GCproto *pt, uint32_t idx)[m
[31m-{[m
[31m-  const uint8_t *p = proto_uvinfo(pt);[m
[31m-  lua_assert(idx < pt->sizeuv);[m
[31m-  if (!p) return "";[m
[31m-  if (idx) while (*p++ || --idx) ;[m
[31m-  return (const char *)p;[m
[31m-}[m
[31m-[m
[31m-/* Get name and value of upvalue. */[m
[31m-const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp)[m
[31m-{[m
[31m-  if (tvisfunc(o)) {[m
[31m-    GCfunc *fn = funcV(o);[m
[31m-    if (isluafunc(fn)) {[m
[31m-      GCproto *pt = funcproto(fn);[m
[31m-      if (idx < pt->sizeuv) {[m
[31m-	*tvp = uvval(&gcref(fn->l.uvptr[idx])->uv);[m
[31m-	return lj_debug_uvname(pt, idx);[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (idx < fn->c.nupvalues) {[m
[31m-	*tvp = &fn->c.upvalue[idx];[m
[31m-	return "";[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Deduce name of an object from slot number and PC. */[m
[31m-const char *lj_debug_slotname(GCproto *pt, const BCIns *ip, BCReg slot,[m
[31m-			      const char **name)[m
[31m-{[m
[31m-  const char *lname;[m
[31m-restart:[m
[31m-  lname = debug_varname(pt, proto_bcpos(pt, ip), slot);[m
[31m-  if (lname != NULL) { *name = lname; return "local"; }[m
[31m-  while (--ip > proto_bc(pt)) {[m
[31m-    BCIns ins = *ip;[m
[31m-    BCOp op = bc_op(ins);[m
[31m-    BCReg ra = bc_a(ins);[m
[31m-    if (bcmode_a(op) == BCMbase) {[m
[31m-      if (slot >= ra && (op != BC_KNIL || slot <= bc_d(ins)))[m
[31m-	return NULL;[m
[31m-    } else if (bcmode_a(op) == BCMdst && ra == slot) {[m
[31m-      switch (bc_op(ins)) {[m
[31m-      case BC_MOV:[m
[31m-	if (ra == slot) { slot = bc_d(ins); goto restart; }[m
[31m-	break;[m
[31m-      case BC_GGET:[m
[31m-	*name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_d(ins))));[m
[31m-	return "global";[m
[31m-      case BC_TGETS:[m
[31m-	*name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_c(ins))));[m
[31m-	if (ip > proto_bc(pt)) {[m
[31m-	  BCIns insp = ip[-1];[m
[31m-	  if (bc_op(insp) == BC_MOV && bc_a(insp) == ra+1+LJ_FR2 &&[m
[31m-	      bc_d(insp) == bc_b(ins))[m
[31m-	    return "method";[m
[31m-	}[m
[31m-	return "field";[m
[31m-      case BC_UGET:[m
[31m-	*name = lj_debug_uvname(pt, bc_d(ins));[m
[31m-	return "upvalue";[m
[31m-      default:[m
[31m-	return NULL;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Deduce function name from caller of a frame. */[m
[31m-const char *lj_debug_funcname(lua_State *L, cTValue *frame, const char **name)[m
[31m-{[m
[31m-  cTValue *pframe;[m
[31m-  GCfunc *fn;[m
[31m-  BCPos pc;[m
[31m-  if (frame <= tvref(L->stack)+LJ_FR2)[m
[31m-    return NULL;[m
[31m-  if (frame_isvarg(frame))[m
[31m-    frame = frame_prevd(frame);[m
[31m-  pframe = frame_prev(frame);[m
[31m-  fn = frame_func(pframe);[m
[31m-  pc = debug_framepc(L, fn, frame);[m
[31m-  if (pc != NO_BCPOS) {[m
[31m-    GCproto *pt = funcproto(fn);[m
[31m-    const BCIns *ip = &proto_bc(pt)[check_exp(pc < pt->sizebc, pc)];[m
[31m-    MMS mm = bcmode_mm(bc_op(*ip));[m
[31m-    if (mm == MM_call) {[m
[31m-      BCReg slot = bc_a(*ip);[m
[31m-      if (bc_op(*ip) == BC_ITERC) slot -= 3;[m
[31m-      return lj_debug_slotname(pt, ip, slot, name);[m
[31m-    } else if (mm != MM__MAX) {[m
[31m-      *name = strdata(mmname_str(G(L), mm));[m
[31m-      return "metamethod";[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- Source code locations ----------------------------------------------- */[m
[31m-[m
[31m-/* Generate shortened source name. */[m
[31m-void lj_debug_shortname(char *out, GCstr *str, BCLine line)[m
[31m-{[m
[31m-  const char *src = strdata(str);[m
[31m-  if (*src == '=') {[m
[31m-    strncpy(out, src+1, LUA_IDSIZE);  /* Remove first char. */[m
[31m-    out[LUA_IDSIZE-1] = '\0';  /* Ensures null termination. */[m
[31m-  } else if (*src == '@') {  /* Output "source", or "...source". */[m
[31m-    size_t len = str->len-1;[m
[31m-    src++;  /* Skip the `@' */[m
[31m-    if (len >= LUA_IDSIZE) {[m
[31m-      src += len-(LUA_IDSIZE-4);  /* Get last part of file name. */[m
[31m-      *out++ = '.'; *out++ = '.'; *out++ = '.';[m
[31m-    }[m
[31m-    strcpy(out, src);[m
[31m-  } else {  /* Output [string "string"] or [builtin:name]. */[m
[31m-    size_t len;  /* Length, up to first control char. */[m
[31m-    for (len = 0; len < LUA_IDSIZE-12; len++)[m
[31m-      if (((const unsigned char *)src)[len] < ' ') break;[m
[31m-    strcpy(out, line == ~(BCLine)0 ? "[builtin:" : "[string \""); out += 9;[m
[31m-    if (src[len] != '\0') {  /* Must truncate? */[m
[31m-      if (len > LUA_IDSIZE-15) len = LUA_IDSIZE-15;[m
[31m-      strncpy(out, src, len); out += len;[m
[31m-      strcpy(out, "..."); out += 3;[m
[31m-    } else {[m
[31m-      strcpy(out, src); out += len;[m
[31m-    }[m
[31m-    strcpy(out, line == ~(BCLine)0 ? "]" : "\"]");[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Add current location of a frame to error message. */[m
[31m-void lj_debug_addloc(lua_State *L, const char *msg,[m
[31m-		     cTValue *frame, cTValue *nextframe)[m
[31m-{[m
[31m-  if (frame) {[m
[31m-    GCfunc *fn = frame_func(frame);[m
[31m-    if (isluafunc(fn)) {[m
[31m-      BCLine line = debug_frameline(L, fn, nextframe);[m
[31m-      if (line >= 0) {[m
[31m-	GCproto *pt = funcproto(fn);[m
[31m-	char buf[LUA_IDSIZE];[m
[31m-	lj_debug_shortname(buf, proto_chunkname(pt), pt->firstline);[m
[31m-	lj_strfmt_pushf(L, "%s:%d: %s", buf, line, msg);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lj_strfmt_pushf(L, "%s", msg);[m
[31m-}[m
[31m-[m
[31m-/* Push location string for a bytecode position to Lua stack. */[m
[31m-void lj_debug_pushloc(lua_State *L, GCproto *pt, BCPos pc)[m
[31m-{[m
[31m-  GCstr *name = proto_chunkname(pt);[m
[31m-  const char *s = strdata(name);[m
[31m-  MSize i, len = name->len;[m
[31m-  BCLine line = lj_debug_line(pt, pc);[m
[31m-  if (pt->firstline == ~(BCLine)0) {[m
[31m-    lj_strfmt_pushf(L, "builtin:%s", s);[m
[31m-  } else if (*s == '@') {[m
[31m-    s++; len--;[m
[31m-    for (i = len; i > 0; i--)[m
[31m-      if (s[i] == '/' || s[i] == '\\') {[m
[31m-	s += i+1;[m
[31m-	break;[m
[31m-      }[m
[31m-    lj_strfmt_pushf(L, "%s:%d", s, line);[m
[31m-  } else if (len > 40) {[m
[31m-    lj_strfmt_pushf(L, "%p:%d", pt, line);[m
[31m-  } else if (*s == '=') {[m
[31m-    lj_strfmt_pushf(L, "%s:%d", s+1, line);[m
[31m-  } else {[m
[31m-    lj_strfmt_pushf(L, "\"%s\":%d", s, line);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Public debug API ---------------------------------------------------- */[m
[31m-[m
[31m-/* lua_getupvalue() and lua_setupvalue() are in lj_api.c. */[m
[31m-[m
[31m-LUA_API const char *lua_getlocal(lua_State *L, const lua_Debug *ar, int n)[m
[31m-{[m
[31m-  const char *name = NULL;[m
[31m-  if (ar) {[m
[31m-    TValue *o = debug_localname(L, ar, &name, (BCReg)n);[m
[31m-    if (name) {[m
[31m-      copyTV(L, L->top, o);[m
[31m-      incr_top(L);[m
[31m-    }[m
[31m-  } else if (tvisfunc(L->top-1) && isluafunc(funcV(L->top-1))) {[m
[31m-    name = debug_varname(funcproto(funcV(L->top-1)), 0, (BCReg)n-1);[m
[31m-  }[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-LUA_API const char *lua_setlocal(lua_State *L, const lua_Debug *ar, int n)[m
[31m-{[m
[31m-  const char *name = NULL;[m
[31m-  TValue *o = debug_localname(L, ar, &name, (BCReg)n);[m
[31m-  if (name)[m
[31m-    copyTV(L, o, L->top-1);[m
[31m-  L->top--;[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-int lj_debug_getinfo(lua_State *L, const char *what, lj_Debug *ar, int ext)[m
[31m-{[m
[31m-  int opt_f = 0, opt_L = 0;[m
[31m-  TValue *frame = NULL;[m
[31m-  TValue *nextframe = NULL;[m
[31m-  GCfunc *fn;[m
[31m-  if (*what == '>') {[m
[31m-    TValue *func = L->top - 1;[m
[31m-    api_check(L, tvisfunc(func));[m
[31m-    fn = funcV(func);[m
[31m-    L->top--;[m
[31m-    what++;[m
[31m-  } else {[m
[31m-    uint32_t offset = (uint32_t)ar->i_ci & 0xffff;[m
[31m-    uint32_t size = (uint32_t)ar->i_ci >> 16;[m
[31m-    lua_assert(offset != 0);[m
[31m-    frame = tvref(L->stack) + offset;[m
[31m-    if (size) nextframe = frame + size;[m
[31m-    lua_assert(frame <= tvref(L->maxstack) &&[m
[31m-	       (!nextframe || nextframe <= tvref(L->maxstack)));[m
[31m-    fn = frame_func(frame);[m
[31m-    lua_assert(fn->c.gct == ~LJ_TFUNC);[m
[31m-  }[m
[31m-  for (; *what; what++) {[m
[31m-    if (*what == 'S') {[m
[31m-      if (isluafunc(fn)) {[m
[31m-	GCproto *pt = funcproto(fn);[m
[31m-	BCLine firstline = pt->firstline;[m
[31m-	GCstr *name = proto_chunkname(pt);[m
[31m-	ar->source = strdata(name);[m
[31m-	lj_debug_shortname(ar->short_src, name, pt->firstline);[m
[31m-	ar->linedefined = (int)firstline;[m
[31m-	ar->lastlinedefined = (int)(firstline + pt->numline);[m
[31m-	ar->what = (firstline || !pt->numline) ? "Lua" : "main";[m
[31m-      } else {[m
[31m-	ar->source = "=[C]";[m
[31m-	ar->short_src[0] = '[';[m
[31m-	ar->short_src[1] = 'C';[m
[31m-	ar->short_src[2] = ']';[m
[31m-	ar->short_src[3] = '\0';[m
[31m-	ar->linedefined = -1;[m
[31m-	ar->lastlinedefined = -1;[m
[31m-	ar->what = "C";[m
[31m-      }[m
[31m-    } else if (*what == 'l') {[m
[31m-      ar->currentline = frame ? debug_frameline(L, fn, nextframe) : -1;[m
[31m-    } else if (*what == 'u') {[m
[31m-      ar->nups = fn->c.nupvalues;[m
[31m-      if (ext) {[m
[31m-	if (isluafunc(fn)) {[m
[31m-	  GCproto *pt = funcproto(fn);[m
[31m-	  ar->nparams = pt->numparams;[m
[31m-	  ar->isvararg = !!(pt->flags & PROTO_VARARG);[m
[31m-	} else {[m
[31m-	  ar->nparams = 0;[m
[31m-	  ar->isvararg = 1;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (*what == 'n') {[m
[31m-      ar->namewhat = frame ? lj_debug_funcname(L, frame, &ar->name) : NULL;[m
[31m-      if (ar->namewhat == NULL) {[m
[31m-	ar->namewhat = "";[m
[31m-	ar->name = NULL;[m
[31m-      }[m
[31m-    } else if (*what == 'f') {[m
[31m-      opt_f = 1;[m
[31m-    } else if (*what == 'L') {[m
[31m-      opt_L = 1;[m
[31m-    } else {[m
[31m-      return 0;  /* Bad option. */[m
[31m-    }[m
[31m-  }[m
[31m-  if (opt_f) {[m
[31m-    setfuncV(L, L->top, fn);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  if (opt_L) {[m
[31m-    if (isluafunc(fn)) {[m
[31m-      GCtab *t = lj_tab_new(L, 0, 0);[m
[31m-      GCproto *pt = funcproto(fn);[m
[31m-      const void *lineinfo = proto_lineinfo(pt);[m
[31m-      if (lineinfo) {[m
[31m-	BCLine first = pt->firstline;[m
[31m-	int sz = pt->numline < 256 ? 1 : pt->numline < 65536 ? 2 : 4;[m
[31m-	MSize i, szl = pt->sizebc-1;[m
[31m-	for (i = 0; i < szl; i++) {[m
[31m-	  BCLine line = first +[m
[31m-	    (sz == 1 ? (BCLine)((const uint8_t *)lineinfo)[i] :[m
[31m-	     sz == 2 ? (BCLine)((const uint16_t *)lineinfo)[i] :[m
[31m-	     (BCLine)((const uint32_t *)lineinfo)[i]);[m
[31m-	  setboolV(lj_tab_setint(L, t, line), 1);[m
[31m-	}[m
[31m-      }[m
[31m-      settabV(L, L->top, t);[m
[31m-    } else {[m
[31m-      setnilV(L->top);[m
[31m-    }[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  return 1;  /* Ok. */[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar)[m
[31m-{[m
[31m-  return lj_debug_getinfo(L, what, (lj_Debug *)ar, 0);[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_getstack(lua_State *L, int level, lua_Debug *ar)[m
[31m-{[m
[31m-  int size;[m
[31m-  cTValue *frame = lj_debug_frame(L, level, &size);[m
[31m-  if (frame) {[m
[31m-    ar->i_ci = (size << 16) + (int)(frame - tvref(L->stack));[m
[31m-    return 1;[m
[31m-  } else {[m
[31m-    ar->i_ci = level - size;[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-/* Put the chunkname into a buffer. */[m
[31m-static int debug_putchunkname(SBuf *sb, GCproto *pt, int pathstrip)[m
[31m-{[m
[31m-  GCstr *name = proto_chunkname(pt);[m
[31m-  const char *p = strdata(name);[m
[31m-  if (pt->firstline == ~(BCLine)0) {[m
[31m-    lj_buf_putmem(sb, "[builtin:", 9);[m
[31m-    lj_buf_putstr(sb, name);[m
[31m-    lj_buf_putb(sb, ']');[m
[31m-    return 0;[m
[31m-  }[m
[31m-  if (*p == '=' || *p == '@') {[m
[31m-    MSize len = name->len-1;[m
[31m-    p++;[m
[31m-    if (pathstrip) {[m
[31m-      int i;[m
[31m-      for (i = len-1; i >= 0; i--)[m
[31m-	if (p[i] == '/' || p[i] == '\\') {[m
[31m-	  len -= i+1;[m
[31m-	  p = p+i+1;[m
[31m-	  break;[m
[31m-	}[m
[31m-    }[m
[31m-    lj_buf_putmem(sb, p, len);[m
[31m-  } else {[m
[31m-    lj_buf_putmem(sb, "[string]", 8);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Put a compact stack dump into a buffer. */[m
[31m-void lj_debug_dumpstack(lua_State *L, SBuf *sb, const char *fmt, int depth)[m
[31m-{[m
[31m-  int level = 0, dir = 1, pathstrip = 1;[m
[31m-  MSize lastlen = 0;[m
[31m-  if (depth < 0) { level = ~depth; depth = dir = -1; }  /* Reverse frames. */[m
[31m-  while (level != depth) {  /* Loop through all frame. */[m
[31m-    int size;[m
[31m-    cTValue *frame = lj_debug_frame(L, level, &size);[m
[31m-    if (frame) {[m
[31m-      cTValue *nextframe = size ? frame+size : NULL;[m
[31m-      GCfunc *fn = frame_func(frame);[m
[31m-      const uint8_t *p = (const uint8_t *)fmt;[m
[31m-      int c;[m
[31m-      while ((c = *p++)) {[m
[31m-	switch (c) {[m
[31m-	case 'p':  /* Preserve full path. */[m
[31m-	  pathstrip = 0;[m
[31m-	  break;[m
[31m-	case 'F': case 'f': {  /* Dump function name. */[m
[31m-	  const char *name;[m
[31m-	  const char *what = lj_debug_funcname(L, frame, &name);[m
[31m-	  if (what) {[m
[31m-	    if (c == 'F' && isluafunc(fn)) {  /* Dump module:name for 'F'. */[m
[31m-	      GCproto *pt = funcproto(fn);[m
[31m-	      if (pt->firstline != ~(BCLine)0) {  /* Not a bytecode builtin. */[m
[31m-		debug_putchunkname(sb, pt, pathstrip);[m
[31m-		lj_buf_putb(sb, ':');[m
[31m-	      }[m
[31m-	    }[m
[31m-	    lj_buf_putmem(sb, name, (MSize)strlen(name));[m
[31m-	    break;[m
[31m-	  }  /* else: can't derive a name, dump module:line. */[m
[31m-	  }[m
[31m-	  /* fallthrough */[m
[31m-	case 'l':  /* Dump module:line. */[m
[31m-	  if (isluafunc(fn)) {[m
[31m-	    GCproto *pt = funcproto(fn);[m
[31m-	    if (debug_putchunkname(sb, pt, pathstrip)) {[m
[31m-	      /* Regular Lua function. */[m
[31m-	      BCLine line = c == 'l' ? debug_frameline(L, fn, nextframe) :[m
[31m-				       pt->firstline;[m
[31m-	      lj_buf_putb(sb, ':');[m
[31m-	      lj_strfmt_putint(sb, line >= 0 ? line : pt->firstline);[m
[31m-	    }[m
[31m-	  } else if (isffunc(fn)) {  /* Dump numbered builtins. */[m
[31m-	    lj_buf_putmem(sb, "[builtin#", 9);[m
[31m-	    lj_strfmt_putint(sb, fn->c.ffid);[m
[31m-	    lj_buf_putb(sb, ']');[m
[31m-	  } else {  /* Dump C function address. */[m
[31m-	    lj_buf_putb(sb, '@');[m
[31m-	    lj_strfmt_putptr(sb, fn->c.f);[m
[31m-	  }[m
[31m-	  break;[m
[31m-	case 'Z':  /* Zap trailing separator. */[m
[31m-	  lastlen = sbuflen(sb);[m
[31m-	  break;[m
[31m-	default:[m
[31m-	  lj_buf_putb(sb, c);[m
[31m-	  break;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (dir == 1) {[m
[31m-      break;[m
[31m-    } else {[m
[31m-      level -= size;  /* Reverse frame order: quickly skip missing level. */[m
[31m-    }[m
[31m-    level += dir;[m
[31m-  }[m
[31m-  if (lastlen)[m
[31m-    setsbufP(sb, sbufB(sb) + lastlen);  /* Zap trailing separator. */[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Number of frames for the leading and trailing part of a traceback. */[m
[31m-#define TRACEBACK_LEVELS1	12[m
[31m-#define TRACEBACK_LEVELS2	10[m
[31m-[m
[31m-LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,[m
[31m-				int level)[m
[31m-{[m
[31m-  int top = (int)(L->top - L->base);[m
[31m-  int lim = TRACEBACK_LEVELS1;[m
[31m-  lua_Debug ar;[m
[31m-  if (msg) lua_pushfstring(L, "%s\n", msg);[m
[31m-  lua_pushliteral(L, "stack traceback:");[m
[31m-  while (lua_getstack(L1, level++, &ar)) {[m
[31m-    GCfunc *fn;[m
[31m-    if (level > lim) {[m
[31m-      if (!lua_getstack(L1, level + TRACEBACK_LEVELS2, &ar)) {[m
[31m-	level--;[m
[31m-      } else {[m
[31m-	lua_pushliteral(L, "\n\t...");[m
[31m-	lua_getstack(L1, -10, &ar);[m
[31m-	level = ar.i_ci - TRACEBACK_LEVELS2;[m
[31m-      }[m
[31m-      lim = 2147483647;[m
[31m-      continue;[m
[31m-    }[m
[31m-    lua_getinfo(L1, "Snlf", &ar);[m
[31m-    fn = funcV(L1->top-1); L1->top--;[m
[31m-    if (isffunc(fn) && !*ar.namewhat)[m
[31m-      lua_pushfstring(L, "\n\t[builtin#%d]:", fn->c.ffid);[m
[31m-    else[m
[31m-      lua_pushfstring(L, "\n\t%s:", ar.short_src);[m
[31m-    if (ar.currentline > 0)[m
[31m-      lua_pushfstring(L, "%d:", ar.currentline);[m
[31m-    if (*ar.namewhat) {[m
[31m-      lua_pushfstring(L, " in function " LUA_QS, ar.name);[m
[31m-    } else {[m
[31m-      if (*ar.what == 'm') {[m
[31m-	lua_pushliteral(L, " in main chunk");[m
[31m-      } else if (*ar.what == 'C') {[m
[31m-	lua_pushfstring(L, " at %p", fn->c.f);[m
[31m-      } else {[m
[31m-	lua_pushfstring(L, " in function <%s:%d>",[m
[31m-			ar.short_src, ar.linedefined);[m
[31m-      }[m
[31m-    }[m
[31m-    if ((int)(L->top - L->base) - top >= 15)[m
[31m-      lua_concat(L, (int)(L->top - L->base) - top);[m
[31m-  }[m
[31m-  lua_concat(L, (int)(L->top - L->base) - top);[m
[31m-}[m
[31m-[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-[m
[31m-#include "lj_dispatch.h"[m
[31m-[m
[31m-#define MAX_TRACE_EVENTS  64[m
[31m-[m
[31m-enum {[m
[31m-    LJ_TRACE_EVENT_ENTER,[m
[31m-    LJ_TRACE_EVENT_EXIT,[m
[31m-    LJ_TRACE_EVENT_START[m
[31m-};[m
[31m-[m
[31m-typedef struct {[m
[31m-    int              event;[m
[31m-    unsigned         traceno;[m
[31m-    unsigned         exitno;[m
[31m-    int              directexit;[m
[31m-    const BCIns     *ins;[m
[31m-    lua_State       *thread;[m
[31m-    GCfunc          *fn;[m
[31m-} lj_trace_event_record_t;[m
[31m-[m
[31m-static lj_trace_event_record_t lj_trace_events[MAX_TRACE_EVENTS];[m
[31m-[m
[31m-static int  rb_start = 0;[m
[31m-static int  rb_end = 0;[m
[31m-static int  rb_full = 0;[m
[31m-[m
[31m-static void[m
[31m-lj_trace_log_event(lj_trace_event_record_t *rec)[m
[31m-{[m
[31m-  lj_trace_events[rb_end] = *rec;[m
[31m-[m
[31m-  if (rb_full) {[m
[31m-    rb_end++;[m
[31m-    if (rb_end == MAX_TRACE_EVENTS) {[m
[31m-      rb_end = 0;[m
[31m-    }[m
[31m-    rb_start = rb_end;[m
[31m-[m
[31m-  } else {[m
[31m-    rb_end++;[m
[31m-    if (rb_end == MAX_TRACE_EVENTS) {[m
[31m-      rb_end = 0;[m
[31m-      rb_full = MAX_TRACE_EVENTS;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static GCfunc*[m
[31m-lj_debug_top_frame_fn(lua_State *L, const BCIns *pc)[m
[31m-{[m
[31m-  int size;[m
[31m-  cTValue *frame;[m
[31m-[m
[31m-  frame = lj_debug_frame(L, 0, &size);[m
[31m-  if (frame == NULL) {[m
[31m-    return NULL;[m
[31m-  }[m
[31m-[m
[31m-  return frame_func(frame);[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL[m
[31m-lj_log_trace_start_record(lua_State *L, unsigned traceno, const BCIns *pc,[m
[31m-  GCfunc *fn)[m
[31m-{[m
[31m-  lj_trace_event_record_t  r;[m
[31m-[m
[31m-  r.event = LJ_TRACE_EVENT_START;[m
[31m-  r.thread = L;[m
[31m-  r.ins = pc;[m
[31m-  r.traceno = traceno;[m
[31m-  r.fn = fn;[m
[31m-[m
[31m-  lj_trace_log_event(&r);[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL[m
[31m-lj_log_trace_entry(lua_State *L, unsigned traceno, const BCIns *pc)[m
[31m-{[m
[31m-  lj_trace_event_record_t  r;[m
[31m-[m
[31m-  r.event = LJ_TRACE_EVENT_ENTER;[m
[31m-  r.thread = L;[m
[31m-  r.ins = pc;[m
[31m-  r.traceno = traceno;[m
[31m-  r.fn = lj_debug_top_frame_fn(L, pc);[m
[31m-[m
[31m-  lj_trace_log_event(&r);[m
[31m-}[m
[31m-[m
[31m-static void[m
[31m-lj_log_trace_exit_helper(lua_State *L, int vmstate, const BCIns *pc, int direct)[m
[31m-{[m
[31m-  if (vmstate >= 0) {[m
[31m-    lj_trace_event_record_t  r;[m
[31m-[m
[31m-    jit_State *J = L2J(L);[m
[31m-[m
[31m-    r.event = LJ_TRACE_EVENT_EXIT;[m
[31m-    r.thread = L;[m
[31m-    r.ins = pc;[m
[31m-    r.traceno = vmstate;[m
[31m-    r.exitno = J->exitno;[m
[31m-    r.directexit = direct;[m
[31m-    r.fn = lj_debug_top_frame_fn(L, pc);[m
[31m-[m
[31m-    lj_trace_log_event(&r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL[m
[31m-lj_log_trace_normal_exit(lua_State *L, int vmstate, const BCIns *pc)[m
[31m-{[m
[31m-  lj_log_trace_exit_helper(L, vmstate, pc, 0);[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL[m
[31m-lj_log_trace_direct_exit(lua_State *L, int vmstate, const BCIns *pc)[m
[31m-{[m
[31m-  lj_log_trace_exit_helper(L, vmstate, pc, 1);[m
[31m-}[m
[31m-[m
[31m-#endif  /* LUA_USE_TRACE_LOGS */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_debug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_debug.h[m
[1mdeleted file mode 100644[m
[1mindex 8ccc809..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_debug.h[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-/*[m
[31m-** Debugging and introspection.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_DEBUG_H[m
[31m-#define _LJ_DEBUG_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-typedef struct lj_Debug {[m
[31m-  /* Common fields. Must be in the same order as in lua.h. */[m
[31m-  int event;[m
[31m-  const char *name;[m
[31m-  const char *namewhat;[m
[31m-  const char *what;[m
[31m-  const char *source;[m
[31m-  int currentline;[m
[31m-  int nups;[m
[31m-  int linedefined;[m
[31m-  int lastlinedefined;[m
[31m-  char short_src[LUA_IDSIZE];[m
[31m-  int i_ci;[m
[31m-  /* Extended fields. Only valid if lj_debug_getinfo() is called with ext = 1.*/[m
[31m-  int nparams;[m
[31m-  int isvararg;[m
[31m-} lj_Debug;[m
[31m-[m
[31m-LJ_FUNC cTValue *lj_debug_frame(lua_State *L, int level, int *size);[m
[31m-LJ_FUNC BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc);[m
[31m-LJ_FUNC const char *lj_debug_uvname(GCproto *pt, uint32_t idx);[m
[31m-LJ_FUNC const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp);[m
[31m-LJ_FUNC const char *lj_debug_slotname(GCproto *pt, const BCIns *pc,[m
[31m-				      BCReg slot, const char **name);[m
[31m-LJ_FUNC const char *lj_debug_funcname(lua_State *L, cTValue *frame,[m
[31m-				      const char **name);[m
[31m-LJ_FUNC void lj_debug_shortname(char *out, GCstr *str, BCLine line);[m
[31m-LJ_FUNC void lj_debug_addloc(lua_State *L, const char *msg,[m
[31m-			     cTValue *frame, cTValue *nextframe);[m
[31m-LJ_FUNC void lj_debug_pushloc(lua_State *L, GCproto *pt, BCPos pc);[m
[31m-LJ_FUNC int lj_debug_getinfo(lua_State *L, const char *what, lj_Debug *ar,[m
[31m-			     int ext);[m
[31m-#if LJ_HASPROFILE[m
[31m-LJ_FUNC void lj_debug_dumpstack(lua_State *L, SBuf *sb, const char *fmt,[m
[31m-				int depth);[m
[31m-#endif[m
[31m-[m
[31m-/* Fixed internal variable names. */[m
[31m-#define VARNAMEDEF(_) \[m
[31m-  _(FOR_IDX, "(for index)") \[m
[31m-  _(FOR_STOP, "(for limit)") \[m
[31m-  _(FOR_STEP, "(for step)") \[m
[31m-  _(FOR_GEN, "(for generator)") \[m
[31m-  _(FOR_STATE, "(for state)") \[m
[31m-  _(FOR_CTL, "(for control)")[m
[31m-[m
[31m-enum {[m
[31m-  VARNAME_END,[m
[31m-#define VARNAMEENUM(name, str)	VARNAME_##name,[m
[31m-  VARNAMEDEF(VARNAMEENUM)[m
[31m-#undef VARNAMEENUM[m
[31m-  VARNAME__MAX[m
[31m-};[m
[31m-[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-LJ_FUNC void LJ_FASTCALL lj_log_trace_direct_exit(lua_State *L,[m
[31m-  int vmstate, const BCIns *pc);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_log_trace_normal_exit(lua_State *L,[m
[31m-  int vmstate, const BCIns *pc);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_log_trace_entry(lua_State *L,[m
[31m-  unsigned traceno, const BCIns *pc);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_log_trace_start_record(lua_State *L, unsigned traceno,[m
[31m-  const BCIns *pc, GCfunc *fn);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_def.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_def.h[m
[1mdeleted file mode 100644[m
[1mindex 29d3fdd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_def.h[m
[1m+++ /dev/null[m
[36m@@ -1,365 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT common internal definitions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_DEF_H[m
[31m-#define _LJ_DEF_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#if defined(_MSC_VER)[m
[31m-/* MSVC is stuck in the last century and doesn't have C99's stdint.h. */[m
[31m-typedef __int8 int8_t;[m
[31m-typedef __int16 int16_t;[m
[31m-typedef __int32 int32_t;[m
[31m-typedef __int64 int64_t;[m
[31m-typedef unsigned __int8 uint8_t;[m
[31m-typedef unsigned __int16 uint16_t;[m
[31m-typedef unsigned __int32 uint32_t;[m
[31m-typedef unsigned __int64 uint64_t;[m
[31m-#ifdef _WIN64[m
[31m-typedef __int64 intptr_t;[m
[31m-typedef unsigned __int64 uintptr_t;[m
[31m-#else[m
[31m-typedef __int32 intptr_t;[m
[31m-typedef unsigned __int32 uintptr_t;[m
[31m-#endif[m
[31m-#elif defined(__symbian__)[m
[31m-/* Cough. */[m
[31m-typedef signed char int8_t;[m
[31m-typedef short int int16_t;[m
[31m-typedef int int32_t;[m
[31m-typedef long long int64_t;[m
[31m-typedef unsigned char uint8_t;[m
[31m-typedef unsigned short int uint16_t;[m
[31m-typedef unsigned int uint32_t;[m
[31m-typedef unsigned long long uint64_t;[m
[31m-typedef int intptr_t;[m
[31m-typedef unsigned int uintptr_t;[m
[31m-#else[m
[31m-#include <stdint.h>[m
[31m-#endif[m
[31m-[m
[31m-/* Needed everywhere. */[m
[31m-#include <string.h>[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-/* Various VM limits. */[m
[31m-#define LJ_MAX_MEM32	0x7fffff00	/* Max. 32 bit memory allocation. */[m
[31m-#define LJ_MAX_MEM64	((uint64_t)1<<47)  /* Max. 64 bit memory allocation. */[m
[31m-/* Max. total memory allocation. */[m
[31m-#define LJ_MAX_MEM	(LJ_GC64 ? LJ_MAX_MEM64 : LJ_MAX_MEM32)[m
[31m-#define LJ_MAX_ALLOC	LJ_MAX_MEM	/* Max. individual allocation length. */[m
[31m-#define LJ_MAX_STR	LJ_MAX_MEM32	/* Max. string length. */[m
[31m-#define LJ_MAX_BUF	LJ_MAX_MEM32	/* Max. buffer length. */[m
[31m-#define LJ_MAX_UDATA	LJ_MAX_MEM32	/* Max. userdata length. */[m
[31m-[m
[31m-#define LJ_MAX_STRTAB	(1<<26)		/* Max. string table size. */[m
[31m-#define LJ_MAX_HBITS	26		/* Max. hash bits. */[m
[31m-#define LJ_MAX_ABITS	28		/* Max. bits of array key. */[m
[31m-#define LJ_MAX_ASIZE	((1<<(LJ_MAX_ABITS-1))+1)  /* Max. array part size. */[m
[31m-#define LJ_MAX_COLOSIZE	16		/* Max. elems for colocated array. */[m
[31m-[m
[31m-#define LJ_MAX_LINE	LJ_MAX_MEM32	/* Max. source code line number. */[m
[31m-#define LJ_MAX_XLEVEL	200		/* Max. syntactic nesting level. */[m
[31m-#define LJ_MAX_BCINS	(1<<26)		/* Max. # of bytecode instructions. */[m
[31m-#define LJ_MAX_SLOTS	250		/* Max. # of slots in a Lua func. */[m
[31m-#define LJ_MAX_LOCVAR	200		/* Max. # of local variables. */[m
[31m-#define LJ_MAX_UPVAL	60		/* Max. # of upvalues. */[m
[31m-[m
[31m-#define LJ_MAX_IDXCHAIN	100		/* __index/__newindex chain limit. */[m
[31m-#define LJ_STACK_EXTRA	(5+2*LJ_FR2)	/* Extra stack space (metamethods). */[m
[31m-[m
[31m-#define LJ_NUM_CBPAGE	1		/* Number of FFI callback pages. */[m
[31m-[m
[31m-/* Minimum table/buffer sizes. */[m
[31m-#define LJ_MIN_GLOBAL	6		/* Min. global table size (hbits). */[m
[31m-#define LJ_MIN_REGISTRY	2		/* Min. registry size (hbits). */[m
[31m-#define LJ_MIN_STRTAB	256		/* Min. string table size (pow2). */[m
[31m-#define LJ_MIN_SBUF	32		/* Min. string buffer length. */[m
[31m-#define LJ_MIN_VECSZ	8		/* Min. size for growable vectors. */[m
[31m-#define LJ_MIN_IRSZ	32		/* Min. size for growable IR. */[m
[31m-#define LJ_MIN_K64SZ	16		/* Min. size for chained K64Array. */[m
[31m-[m
[31m-/* JIT compiler limits. */[m
[31m-#define LJ_MAX_JSLOTS	250		/* Max. # of stack slots for a trace. */[m
[31m-#define LJ_MAX_PHI	64		/* Max. # of PHIs for a loop. */[m
[31m-#define LJ_MAX_EXITSTUBGR	16	/* Max. # of exit stub groups. */[m
[31m-[m
[31m-/* Various macros. */[m
[31m-#ifndef UNUSED[m
[31m-#define UNUSED(x)	((void)(x))	/* to avoid warnings */[m
[31m-#endif[m
[31m-[m
[31m-#define U64x(hi, lo)	(((uint64_t)0x##hi << 32) + (uint64_t)0x##lo)[m
[31m-#define i32ptr(p)	((int32_t)(intptr_t)(void *)(p))[m
[31m-#define u32ptr(p)	((uint32_t)(intptr_t)(void *)(p))[m
[31m-[m
[31m-#define checki8(x)	((x) == (int32_t)(int8_t)(x))[m
[31m-#define checku8(x)	((x) == (int32_t)(uint8_t)(x))[m
[31m-#define checki16(x)	((x) == (int32_t)(int16_t)(x))[m
[31m-#define checku16(x)	((x) == (int32_t)(uint16_t)(x))[m
[31m-#define checki32(x)	((x) == (int32_t)(x))[m
[31m-#define checku32(x)	((x) == (uint32_t)(x))[m
[31m-#define checkptr32(x)	((uintptr_t)(x) == (uint32_t)(uintptr_t)(x))[m
[31m-#define checkptr47(x)	(((uint64_t)(x) >> 47) == 0)[m
[31m-#if LJ_GC64[m
[31m-#define checkptrGC(x)	(checkptr47((x)))[m
[31m-#elif LJ_64[m
[31m-#define checkptrGC(x)	(checkptr32((x)))[m
[31m-#else[m
[31m-#define checkptrGC(x)	1[m
[31m-#endif[m
[31m-[m
[31m-/* Every half-decent C compiler transforms this into a rotate instruction. */[m
[31m-#define lj_rol(x, n)	(((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1))))[m
[31m-#define lj_ror(x, n)	(((x)<<(-(int)(n)&(8*sizeof(x)-1))) | ((x)>>(n)))[m
[31m-[m
[31m-/* A really naive Bloom filter. But sufficient for our needs. */[m
[31m-typedef uintptr_t BloomFilter;[m
[31m-#define BLOOM_MASK	(8*sizeof(BloomFilter) - 1)[m
[31m-#define bloombit(x)	((uintptr_t)1 << ((x) & BLOOM_MASK))[m
[31m-#define bloomset(b, x)	((b) |= bloombit((x)))[m
[31m-#define bloomtest(b, x)	((b) & bloombit((x)))[m
[31m-[m
[31m-#if defined(__GNUC__) || defined(__psp2__)[m
[31m-[m
[31m-#define LJ_NORET	__attribute__((noreturn))[m
[31m-#define LJ_ALIGN(n)	__attribute__((aligned(n)))[m
[31m-#define LJ_INLINE	inline[m
[31m-#define LJ_AINLINE	inline __attribute__((always_inline))[m
[31m-#define LJ_NOINLINE	__attribute__((noinline))[m
[31m-[m
[31m-#if defined(__ELF__) || defined(__MACH__) || defined(__psp2__)[m
[31m-#if !((defined(__sun__) && defined(__svr4__)) || defined(__CELLOS_LV2__))[m
[31m-#define LJ_NOAPI	extern __attribute__((visibility("hidden")))[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Note: it's only beneficial to use fastcall on x86 and then only for up to[m
[31m-** two non-FP args. The amalgamated compile covers all LJ_FUNC cases. Only[m
[31m-** indirect calls and related tail-called C functions are marked as fastcall.[m
[31m-*/[m
[31m-#if defined(__i386__)[m
[31m-#define LJ_FASTCALL	__attribute__((fastcall))[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_LIKELY(x)	__builtin_expect(!!(x), 1)[m
[31m-#define LJ_UNLIKELY(x)	__builtin_expect(!!(x), 0)[m
[31m-[m
[31m-#define lj_ffs(x)	((uint32_t)__builtin_ctz(x))[m
[31m-/* Don't ask ... */[m
[31m-#if defined(__INTEL_COMPILER) && (defined(__i386__) || defined(__x86_64__))[m
[31m-static LJ_AINLINE uint32_t lj_fls(uint32_t x)[m
[31m-{[m
[31m-  uint32_t r; __asm__("bsrl %1, %0" : "=r" (r) : "rm" (x) : "cc"); return r;[m
[31m-}[m
[31m-#else[m
[31m-#define lj_fls(x)	((uint32_t)(__builtin_clz(x)^31))[m
[31m-#endif[m
[31m-[m
[31m-#if defined(__arm__)[m
[31m-static LJ_AINLINE uint32_t lj_bswap(uint32_t x)[m
[31m-{[m
[31m-#if defined(__psp2__)[m
[31m-  return __builtin_rev(x);[m
[31m-#else[m
[31m-  uint32_t r;[m
[31m-#if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\[m
[31m-    __ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__[m
[31m-  __asm__("rev %0, %1" : "=r" (r) : "r" (x));[m
[31m-  return r;[m
[31m-#else[m
[31m-#ifdef __thumb__[m
[31m-  r = x ^ lj_ror(x, 16);[m
[31m-#else[m
[31m-  __asm__("eor %0, %1, %1, ror #16" : "=r" (r) : "r" (x));[m
[31m-#endif[m
[31m-  return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8);[m
[31m-#endif[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));[m
[31m-}[m
[31m-#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)[m
[31m-static LJ_AINLINE uint32_t lj_bswap(uint32_t x)[m
[31m-{[m
[31m-  return (uint32_t)__builtin_bswap32((int32_t)x);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  return (uint64_t)__builtin_bswap64((int64_t)x);[m
[31m-}[m
[31m-#elif defined(__i386__) || defined(__x86_64__)[m
[31m-static LJ_AINLINE uint32_t lj_bswap(uint32_t x)[m
[31m-{[m
[31m-  uint32_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;[m
[31m-}[m
[31m-[m
[31m-#if defined(__i386__)[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));[m
[31m-}[m
[31m-#else[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  uint64_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;[m
[31m-}[m
[31m-#endif[m
[31m-#else[m
[31m-static LJ_AINLINE uint32_t lj_bswap(uint32_t x)[m
[31m-{[m
[31m-  return (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)[m
[31m-{[m
[31m-  return (uint64_t)lj_bswap((uint32_t)(x >> 32)) |[m
[31m-	 ((uint64_t)lj_bswap((uint32_t)x) << 32);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-typedef union __attribute__((packed)) Unaligned16 {[m
[31m-  uint16_t u;[m
[31m-  uint8_t b[2];[m
[31m-} Unaligned16;[m
[31m-[m
[31m-typedef union __attribute__((packed)) Unaligned32 {[m
[31m-  uint32_t u;[m
[31m-  uint8_t b[4];[m
[31m-} Unaligned32;[m
[31m-[m
[31m-/* Unaligned load of uint16_t. */[m
[31m-static LJ_AINLINE uint16_t lj_getu16(const void *p)[m
[31m-{[m
[31m-  return ((const Unaligned16 *)p)->u;[m
[31m-}[m
[31m-[m
[31m-/* Unaligned load of uint32_t. */[m
[31m-static LJ_AINLINE uint32_t lj_getu32(const void *p)[m
[31m-{[m
[31m-  return ((const Unaligned32 *)p)->u;[m
[31m-}[m
[31m-[m
[31m-#elif defined(_MSC_VER)[m
[31m-[m
[31m-#define LJ_NORET	__declspec(noreturn)[m
[31m-#define LJ_ALIGN(n)	__declspec(align(n))[m
[31m-#define LJ_INLINE	__inline[m
[31m-#define LJ_AINLINE	__forceinline[m
[31m-#define LJ_NOINLINE	__declspec(noinline)[m
[31m-#if defined(_M_IX86)[m
[31m-#define LJ_FASTCALL	__fastcall[m
[31m-#endif[m
[31m-[m
[31m-#ifdef _M_PPC[m
[31m-unsigned int _CountLeadingZeros(long);[m
[31m-#pragma intrinsic(_CountLeadingZeros)[m
[31m-static LJ_AINLINE uint32_t lj_fls(uint32_t x)[m
[31m-{[m
[31m-  return _CountLeadingZeros(x) ^ 31;[m
[31m-}[m
[31m-#else[m
[31m-unsigned char _BitScanForward(uint32_t *, unsigned long);[m
[31m-unsigned char _BitScanReverse(uint32_t *, unsigned long);[m
[31m-#pragma intrinsic(_BitScanForward)[m
[31m-#pragma intrinsic(_BitScanReverse)[m
[31m-[m
[31m-static LJ_AINLINE uint32_t lj_ffs(uint32_t x)[m
[31m-{[m
[31m-  uint32_t r; _BitScanForward(&r, x); return r;[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint32_t lj_fls(uint32_t x)[m
[31m-{[m
[31m-  uint32_t r; _BitScanReverse(&r, x); return r;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-unsigned long _byteswap_ulong(unsigned long);[m
[31m-uint64_t _byteswap_uint64(uint64_t);[m
[31m-#define lj_bswap(x)	(_byteswap_ulong((x)))[m
[31m-#define lj_bswap64(x)	(_byteswap_uint64((x)))[m
[31m-[m
[31m-#if defined(_M_PPC) && defined(LUAJIT_NO_UNALIGNED)[m
[31m-/*[m
[31m-** Replacement for unaligned loads on Xbox 360. Disabled by default since it's[m
[31m-** usually more costly than the occasional stall when crossing a cache-line.[m
[31m-*/[m
[31m-static LJ_AINLINE uint16_t lj_getu16(const void *v)[m
[31m-{[m
[31m-  const uint8_t *p = (const uint8_t *)v;[m
[31m-  return (uint16_t)((p[0]<<8) | p[1]);[m
[31m-}[m
[31m-static LJ_AINLINE uint32_t lj_getu32(const void *v)[m
[31m-{[m
[31m-  const uint8_t *p = (const uint8_t *)v;[m
[31m-  return (uint32_t)((p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]);[m
[31m-}[m
[31m-#else[m
[31m-/* Unaligned loads are generally ok on x86/x64. */[m
[31m-#define lj_getu16(p)	(*(uint16_t *)(p))[m
[31m-#define lj_getu32(p)	(*(uint32_t *)(p))[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-#error "missing defines for your compiler"[m
[31m-#endif[m
[31m-[m
[31m-/* Optional defines. */[m
[31m-#ifndef LJ_FASTCALL[m
[31m-#define LJ_FASTCALL[m
[31m-#endif[m
[31m-#ifndef LJ_NORET[m
[31m-#define LJ_NORET[m
[31m-#endif[m
[31m-#ifndef LJ_NOAPI[m
[31m-#define LJ_NOAPI	extern[m
[31m-#endif[m
[31m-#ifndef LJ_LIKELY[m
[31m-#define LJ_LIKELY(x)	(x)[m
[31m-#define LJ_UNLIKELY(x)	(x)[m
[31m-#endif[m
[31m-[m
[31m-/* Attributes for internal functions. */[m
[31m-#define LJ_DATA		LJ_NOAPI[m
[31m-#define LJ_DATADEF[m
[31m-#define LJ_ASMF		LJ_NOAPI[m
[31m-#define LJ_FUNCA	LJ_NOAPI[m
[31m-#if defined(ljamalg_c)[m
[31m-#define LJ_FUNC		static[m
[31m-#else[m
[31m-#define LJ_FUNC		LJ_NOAPI[m
[31m-#endif[m
[31m-#define LJ_FUNC_NORET	LJ_FUNC LJ_NORET[m
[31m-#define LJ_FUNCA_NORET	LJ_FUNCA LJ_NORET[m
[31m-#define LJ_ASMF_NORET	LJ_ASMF LJ_NORET[m
[31m-[m
[31m-/* Runtime assertions. */[m
[31m-#ifdef lua_assert[m
[31m-#define check_exp(c, e)		(lua_assert(c), (e))[m
[31m-#define api_check(l, e)		lua_assert(e)[m
[31m-#else[m
[31m-#define lua_assert(c)		((void)0)[m
[31m-#define check_exp(c, e)		(e)[m
[31m-#define api_check		luai_apicheck[m
[31m-#endif[m
[31m-[m
[31m-/* Static assertions. */[m
[31m-#define LJ_ASSERT_NAME2(name, line)	name ## line[m
[31m-#define LJ_ASSERT_NAME(line)		LJ_ASSERT_NAME2(lj_assert_, line)[m
[31m-#ifdef __COUNTER__[m
[31m-#define LJ_STATIC_ASSERT(cond) \[m
[31m-  extern void LJ_ASSERT_NAME(__COUNTER__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])[m
[31m-#else[m
[31m-#define LJ_STATIC_ASSERT(cond) \[m
[31m-  extern void LJ_ASSERT_NAME(__LINE__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_dispatch.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_dispatch.c[m
[1mdeleted file mode 100644[m
[1mindex 36b920a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_dispatch.c[m
[1m+++ /dev/null[m
[36m@@ -1,557 +0,0 @@[m
[31m-/*[m
[31m-** Instruction dispatch handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_dispatch_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ccallback.h"[m
[31m-#endif[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#if LJ_HASPROFILE[m
[31m-#include "lj_profile.h"[m
[31m-#endif[m
[31m-#include "lj_vm.h"[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-/* Bump GG_NUM_ASMFF in lj_dispatch.h as needed. Ugly. */[m
[31m-LJ_STATIC_ASSERT(GG_NUM_ASMFF == FF_NUM_ASMFUNC);[m
[31m-[m
[31m-/* -- Dispatch table management ------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_MIPS[m
[31m-#include <math.h>[m
[31m-LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L,[m
[31m-							  lua_State *co);[m
[31m-#if !LJ_HASJIT[m
[31m-#define lj_dispatch_stitch	lj_dispatch_ins[m
[31m-#endif[m
[31m-#if !LJ_HASPROFILE[m
[31m-#define lj_dispatch_profile	lj_dispatch_ins[m
[31m-#endif[m
[31m-[m
[31m-#define GOTFUNC(name)	(ASMFunction)name,[m
[31m-static const ASMFunction dispatch_got[] = {[m
[31m-  GOTDEF(GOTFUNC)[m
[31m-};[m
[31m-#undef GOTFUNC[m
[31m-#endif[m
[31m-[m
[31m-/* Initialize instruction dispatch table and hot counters. */[m
[31m-void lj_dispatch_init(GG_State *GG)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-  ASMFunction *disp = GG->dispatch;[m
[31m-  for (i = 0; i < GG_LEN_SDISP; i++)[m
[31m-    disp[GG_LEN_DDISP+i] = disp[i] = makeasmfunc(lj_bc_ofs[i]);[m
[31m-  for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)[m
[31m-    disp[i] = makeasmfunc(lj_bc_ofs[i]);[m
[31m-  /* The JIT engine is off by default. luaopen_jit() turns it on. */[m
[31m-  disp[BC_FORL] = disp[BC_IFORL];[m
[31m-  disp[BC_ITERL] = disp[BC_IITERL];[m
[31m-  disp[BC_LOOP] = disp[BC_ILOOP];[m
[31m-  disp[BC_FUNCF] = disp[BC_IFUNCF];[m
[31m-  disp[BC_FUNCV] = disp[BC_IFUNCV];[m
[31m-  GG->g.bc_cfunc_ext = GG->g.bc_cfunc_int = BCINS_AD(BC_FUNCC, LUA_MINSTACK, 0);[m
[31m-  for (i = 0; i < GG_NUM_ASMFF; i++)[m
[31m-    GG->bcff[i] = BCINS_AD(BC__MAX+i, 0, 0);[m
[31m-#if LJ_TARGET_MIPS[m
[31m-  memcpy(GG->got, dispatch_got, LJ_GOT__MAX*4);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Initialize hotcount table. */[m
[31m-void lj_dispatch_init_hotcount(global_State *g)[m
[31m-{[m
[31m-  int32_t hotloop = G2J(g)->param[JIT_P_hotloop];[m
[31m-  HotCount start = (HotCount)(hotloop*HOTCOUNT_LOOP - 1);[m
[31m-  HotCount *hotcount = G2GG(g)->hotcount;[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < HOTCOUNT_SIZE; i++)[m
[31m-    hotcount[i] = start;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Internal dispatch mode bits. */[m
[31m-#define DISPMODE_CALL	0x01	/* Override call dispatch. */[m
[31m-#define DISPMODE_RET	0x02	/* Override return dispatch. */[m
[31m-#define DISPMODE_INS	0x04	/* Override instruction dispatch. */[m
[31m-#define DISPMODE_JIT	0x10	/* JIT compiler on. */[m
[31m-#define DISPMODE_REC	0x20	/* Recording active. */[m
[31m-#define DISPMODE_PROF	0x40	/* Profiling active. */[m
[31m-[m
[31m-/* Update dispatch table depending on various flags. */[m
[31m-void lj_dispatch_update(global_State *g)[m
[31m-{[m
[31m-  uint8_t oldmode = g->dispatchmode;[m
[31m-  uint8_t mode = 0;[m
[31m-#if LJ_HASJIT[m
[31m-  mode |= (G2J(g)->flags & JIT_F_ON) ? DISPMODE_JIT : 0;[m
[31m-  mode |= G2J(g)->state != LJ_TRACE_IDLE ?[m
[31m-	    (DISPMODE_REC|DISPMODE_INS|DISPMODE_CALL) : 0;[m
[31m-#endif[m
[31m-#if LJ_HASPROFILE[m
[31m-  mode |= (g->hookmask & HOOK_PROFILE) ? (DISPMODE_PROF|DISPMODE_INS) : 0;[m
[31m-#endif[m
[31m-  mode |= (g->hookmask & (LUA_MASKLINE|LUA_MASKCOUNT)) ? DISPMODE_INS : 0;[m
[31m-  mode |= (g->hookmask & LUA_MASKCALL) ? DISPMODE_CALL : 0;[m
[31m-  mode |= (g->hookmask & LUA_MASKRET) ? DISPMODE_RET : 0;[m
[31m-  if (oldmode != mode) {  /* Mode changed? */[m
[31m-    ASMFunction *disp = G2GG(g)->dispatch;[m
[31m-    ASMFunction f_forl, f_iterl, f_loop, f_funcf, f_funcv;[m
[31m-    g->dispatchmode = mode;[m
[31m-[m
[31m-    /* Hotcount if JIT is on, but not while recording. */[m
[31m-    if ((mode & (DISPMODE_JIT|DISPMODE_REC)) == DISPMODE_JIT) {[m
[31m-      f_forl = makeasmfunc(lj_bc_ofs[BC_FORL]);[m
[31m-      f_iterl = makeasmfunc(lj_bc_ofs[BC_ITERL]);[m
[31m-      f_loop = makeasmfunc(lj_bc_ofs[BC_LOOP]);[m
[31m-      f_funcf = makeasmfunc(lj_bc_ofs[BC_FUNCF]);[m
[31m-      f_funcv = makeasmfunc(lj_bc_ofs[BC_FUNCV]);[m
[31m-    } else {  /* Otherwise use the non-hotcounting instructions. */[m
[31m-      f_forl = disp[GG_LEN_DDISP+BC_IFORL];[m
[31m-      f_iterl = disp[GG_LEN_DDISP+BC_IITERL];[m
[31m-      f_loop = disp[GG_LEN_DDISP+BC_ILOOP];[m
[31m-      f_funcf = makeasmfunc(lj_bc_ofs[BC_IFUNCF]);[m
[31m-      f_funcv = makeasmfunc(lj_bc_ofs[BC_IFUNCV]);[m
[31m-    }[m
[31m-    /* Init static counting instruction dispatch first (may be copied below). */[m
[31m-    disp[GG_LEN_DDISP+BC_FORL] = f_forl;[m
[31m-    disp[GG_LEN_DDISP+BC_ITERL] = f_iterl;[m
[31m-    disp[GG_LEN_DDISP+BC_LOOP] = f_loop;[m
[31m-[m
[31m-    /* Set dynamic instruction dispatch. */[m
[31m-    if ((oldmode ^ mode) & (DISPMODE_PROF|DISPMODE_REC|DISPMODE_INS)) {[m
[31m-      /* Need to update the whole table. */[m
[31m-      if (!(mode & DISPMODE_INS)) {  /* No ins dispatch? */[m
[31m-	/* Copy static dispatch table to dynamic dispatch table. */[m
[31m-	memcpy(&disp[0], &disp[GG_LEN_DDISP], GG_LEN_SDISP*sizeof(ASMFunction));[m
[31m-	/* Overwrite with dynamic return dispatch. */[m
[31m-	if ((mode & DISPMODE_RET)) {[m
[31m-	  disp[BC_RETM] = lj_vm_rethook;[m
[31m-	  disp[BC_RET] = lj_vm_rethook;[m
[31m-	  disp[BC_RET0] = lj_vm_rethook;[m
[31m-	  disp[BC_RET1] = lj_vm_rethook;[m
[31m-	}[m
[31m-      } else {[m
[31m-	/* The recording dispatch also checks for hooks. */[m
[31m-	ASMFunction f = (mode & DISPMODE_PROF) ? lj_vm_profhook :[m
[31m-			(mode & DISPMODE_REC) ? lj_vm_record : lj_vm_inshook;[m
[31m-	uint32_t i;[m
[31m-	for (i = 0; i < GG_LEN_SDISP; i++)[m
[31m-	  disp[i] = f;[m
[31m-      }[m
[31m-    } else if (!(mode & DISPMODE_INS)) {[m
[31m-      /* Otherwise set dynamic counting ins. */[m
[31m-      disp[BC_FORL] = f_forl;[m
[31m-      disp[BC_ITERL] = f_iterl;[m
[31m-      disp[BC_LOOP] = f_loop;[m
[31m-      /* Set dynamic return dispatch. */[m
[31m-      if ((mode & DISPMODE_RET)) {[m
[31m-	disp[BC_RETM] = lj_vm_rethook;[m
[31m-	disp[BC_RET] = lj_vm_rethook;[m
[31m-	disp[BC_RET0] = lj_vm_rethook;[m
[31m-	disp[BC_RET1] = lj_vm_rethook;[m
[31m-      } else {[m
[31m-	disp[BC_RETM] = disp[GG_LEN_DDISP+BC_RETM];[m
[31m-	disp[BC_RET] = disp[GG_LEN_DDISP+BC_RET];[m
[31m-	disp[BC_RET0] = disp[GG_LEN_DDISP+BC_RET0];[m
[31m-	disp[BC_RET1] = disp[GG_LEN_DDISP+BC_RET1];[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Set dynamic call dispatch. */[m
[31m-    if ((oldmode ^ mode) & DISPMODE_CALL) {  /* Update the whole table? */[m
[31m-      uint32_t i;[m
[31m-      if ((mode & DISPMODE_CALL) == 0) {  /* No call hooks? */[m
[31m-	for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)[m
[31m-	  disp[i] = makeasmfunc(lj_bc_ofs[i]);[m
[31m-      } else {[m
[31m-	for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++)[m
[31m-	  disp[i] = lj_vm_callhook;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!(mode & DISPMODE_CALL)) {  /* Overwrite dynamic counting ins. */[m
[31m-      disp[BC_FUNCF] = f_funcf;[m
[31m-      disp[BC_FUNCV] = f_funcv;[m
[31m-    }[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-    /* Reset hotcounts for JIT off to on transition. */[m
[31m-    if ((mode & DISPMODE_JIT) && !(oldmode & DISPMODE_JIT))[m
[31m-      lj_dispatch_init_hotcount(g);[m
[31m-#endif[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- JIT mode setting ---------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Set JIT mode for a single prototype. */[m
[31m-static void setptmode(global_State *g, GCproto *pt, int mode)[m
[31m-{[m
[31m-  if ((mode & LUAJIT_MODE_ON)) {  /* (Re-)enable JIT compilation. */[m
[31m-    pt->flags &= ~PROTO_NOJIT;[m
[31m-    lj_trace_reenableproto(pt);  /* Unpatch all ILOOP etc. bytecodes. */[m
[31m-  } else {  /* Flush and/or disable JIT compilation. */[m
[31m-    if (!(mode & LUAJIT_MODE_FLUSH))[m
[31m-      pt->flags |= PROTO_NOJIT;[m
[31m-    lj_trace_flushproto(g, pt);  /* Flush all traces of prototype. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Recursively set the JIT mode for all children of a prototype. */[m
[31m-static void setptmode_all(global_State *g, GCproto *pt, int mode)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  if (!(pt->flags & PROTO_CHILD)) return;[m
[31m-  for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) {[m
[31m-    GCobj *o = proto_kgc(pt, i);[m
[31m-    if (o->gch.gct == ~LJ_TPROTO) {[m
[31m-      setptmode(g, gco2pt(o), mode);[m
[31m-      setptmode_all(g, gco2pt(o), mode);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Public API function: control the JIT engine. */[m
[31m-int luaJIT_setmode(lua_State *L, int idx, int mode)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  int mm = mode & LUAJIT_MODE_MASK;[m
[31m-  lj_trace_abort(g);  /* Abort recording on any state change. */[m
[31m-  /* Avoid pulling the rug from under our own feet. */[m
[31m-  if ((g->hookmask & HOOK_GC))[m
[31m-    lj_err_caller(L, LJ_ERR_NOGCMM);[m
[31m-  switch (mm) {[m
[31m-#if LJ_HASJIT[m
[31m-  case LUAJIT_MODE_ENGINE:[m
[31m-    if ((mode & LUAJIT_MODE_FLUSH)) {[m
[31m-      lj_trace_flushall(L);[m
[31m-    } else {[m
[31m-      if (!(mode & LUAJIT_MODE_ON))[m
[31m-	G2J(g)->flags &= ~(uint32_t)JIT_F_ON;[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-      else if ((G2J(g)->flags & JIT_F_SSE2))[m
[31m-	G2J(g)->flags |= (uint32_t)JIT_F_ON;[m
[31m-      else[m
[31m-	return 0;  /* Don't turn on JIT compiler without SSE2 support. */[m
[31m-#else[m
[31m-      else[m
[31m-	G2J(g)->flags |= (uint32_t)JIT_F_ON;[m
[31m-#endif[m
[31m-      lj_dispatch_update(g);[m
[31m-    }[m
[31m-    break;[m
[31m-  case LUAJIT_MODE_FUNC:[m
[31m-  case LUAJIT_MODE_ALLFUNC:[m
[31m-  case LUAJIT_MODE_ALLSUBFUNC: {[m
[31m-    cTValue *tv = idx == 0 ? frame_prev(L->base-1) :[m
[31m-		  idx > 0 ? L->base + (idx-1) : L->top + idx;[m
[31m-    GCproto *pt;[m
[31m-    if ((idx == 0 || tvisfunc(tv)) && isluafunc(&gcval(tv)->fn))[m
[31m-      pt = funcproto(&gcval(tv)->fn);  /* Cannot use funcV() for frame slot. */[m
[31m-    else if (tvisproto(tv))[m
[31m-      pt = protoV(tv);[m
[31m-    else[m
[31m-      return 0;  /* Failed. */[m
[31m-    if (mm != LUAJIT_MODE_ALLSUBFUNC)[m
[31m-      setptmode(g, pt, mode);[m
[31m-    if (mm != LUAJIT_MODE_FUNC)[m
[31m-      setptmode_all(g, pt, mode);[m
[31m-    break;[m
[31m-    }[m
[31m-  case LUAJIT_MODE_TRACE:[m
[31m-    if (!(mode & LUAJIT_MODE_FLUSH))[m
[31m-      return 0;  /* Failed. */[m
[31m-    lj_trace_flush(G2J(g), idx);[m
[31m-    break;[m
[31m-#else[m
[31m-  case LUAJIT_MODE_ENGINE:[m
[31m-  case LUAJIT_MODE_FUNC:[m
[31m-  case LUAJIT_MODE_ALLFUNC:[m
[31m-  case LUAJIT_MODE_ALLSUBFUNC:[m
[31m-    UNUSED(idx);[m
[31m-    if ((mode & LUAJIT_MODE_ON))[m
[31m-      return 0;  /* Failed. */[m
[31m-    break;[m
[31m-#endif[m
[31m-  case LUAJIT_MODE_WRAPCFUNC:[m
[31m-    if ((mode & LUAJIT_MODE_ON)) {[m
[31m-      if (idx != 0) {[m
[31m-	cTValue *tv = idx > 0 ? L->base + (idx-1) : L->top + idx;[m
[31m-	if (tvislightud(tv))[m
[31m-	  g->wrapf = (lua_CFunction)lightudV(tv);[m
[31m-	else[m
[31m-	  return 0;  /* Failed. */[m
[31m-      } else {[m
[31m-	return 0;  /* Failed. */[m
[31m-      }[m
[31m-      g->bc_cfunc_ext = BCINS_AD(BC_FUNCCW, 0, 0);[m
[31m-    } else {[m
[31m-      g->bc_cfunc_ext = BCINS_AD(BC_FUNCC, 0, 0);[m
[31m-    }[m
[31m-    break;[m
[31m-  default:[m
[31m-    return 0;  /* Failed. */[m
[31m-  }[m
[31m-  return 1;  /* OK. */[m
[31m-}[m
[31m-[m
[31m-/* Enforce (dynamic) linker error for version mismatches. See luajit.c. */[m
[31m-LUA_API void LUAJIT_VERSION_SYM(void)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-/* -- Hooks --------------------------------------------------------------- */[m
[31m-[m
[31m-/* This function can be called asynchronously (e.g. during a signal). */[m
[31m-LUA_API int lua_sethook(lua_State *L, lua_Hook func, int mask, int count)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  mask &= HOOK_EVENTMASK;[m
[31m-  if (func == NULL || mask == 0) { mask = 0; func = NULL; }  /* Consistency. */[m
[31m-  g->hookf = func;[m
[31m-  g->hookcount = g->hookcstart = (int32_t)count;[m
[31m-  g->hookmask = (uint8_t)((g->hookmask & ~HOOK_EVENTMASK) | mask);[m
[31m-  lj_trace_abort(g);  /* Abort recording on any hook change. */[m
[31m-  lj_dispatch_update(g);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-LUA_API lua_Hook lua_gethook(lua_State *L)[m
[31m-{[m
[31m-  return G(L)->hookf;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_gethookmask(lua_State *L)[m
[31m-{[m
[31m-  return G(L)->hookmask & HOOK_EVENTMASK;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_gethookcount(lua_State *L)[m
[31m-{[m
[31m-  return (int)G(L)->hookcstart;[m
[31m-}[m
[31m-[m
[31m-/* Call a hook. */[m
[31m-static void callhook(lua_State *L, int event, BCLine line)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lua_Hook hookf = g->hookf;[m
[31m-  if (hookf && !hook_active(g)) {[m
[31m-    lua_Debug ar;[m
[31m-    lj_trace_abort(g);  /* Abort recording on any hook call. */[m
[31m-    ar.event = event;[m
[31m-    ar.currentline = line;[m
[31m-    /* Top frame, nextframe = NULL. */[m
[31m-    ar.i_ci = (int)((L->base-1) - tvref(L->stack));[m
[31m-    lj_state_checkstack(L, 1+LUA_MINSTACK);[m
[31m-#if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF[m
[31m-    lj_profile_hook_enter(g);[m
[31m-#else[m
[31m-    hook_enter(g);[m
[31m-#endif[m
[31m-    hookf(L, &ar);[m
[31m-    lua_assert(hook_active(g));[m
[31m-    setgcref(g->cur_L, obj2gco(L));[m
[31m-#if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF[m
[31m-    lj_profile_hook_leave(g);[m
[31m-#else[m
[31m-    hook_leave(g);[m
[31m-#endif[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Dispatch callbacks -------------------------------------------------- */[m
[31m-[m
[31m-/* Calculate number of used stack slots in the current frame. */[m
[31m-static BCReg cur_topslot(GCproto *pt, const BCIns *pc, uint32_t nres)[m
[31m-{[m
[31m-  BCIns ins = pc[-1];[m
[31m-  if (bc_op(ins) == BC_UCLO)[m
[31m-    ins = pc[bc_j(ins)];[m
[31m-  switch (bc_op(ins)) {[m
[31m-  case BC_CALLM: case BC_CALLMT: return bc_a(ins) + bc_c(ins) + nres-1+1+LJ_FR2;[m
[31m-  case BC_RETM: return bc_a(ins) + bc_d(ins) + nres-1;[m
[31m-  case BC_TSETM: return bc_a(ins) + nres-1;[m
[31m-  default: return pt->framesize;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Instruction dispatch. Used by instr/line/return hooks or when recording. */[m
[31m-void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  GCproto *pt = funcproto(fn);[m
[31m-  void *cf = cframe_raw(L->cframe);[m
[31m-  const BCIns *oldpc = cframe_pc(cf);[m
[31m-  global_State *g = G(L);[m
[31m-  BCReg slots;[m
[31m-  setcframe_pc(cf, pc);[m
[31m-  slots = cur_topslot(pt, pc, cframe_multres_n(cf));[m
[31m-  L->top = L->base + slots;  /* Fix top. */[m
[31m-#if LJ_HASJIT[m
[31m-  {[m
[31m-    jit_State *J = G2J(g);[m
[31m-    if (J->state != LJ_TRACE_IDLE) {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-      ptrdiff_t delta = L->top - L->base;[m
[31m-#endif[m
[31m-      J->L = L;[m
[31m-      lj_trace_ins(J, pc-1);  /* The interpreter bytecode PC is offset by 1. */[m
[31m-      lua_assert(L->top - L->base == delta);[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  if ((g->hookmask & LUA_MASKCOUNT) && g->hookcount == 0) {[m
[31m-    g->hookcount = g->hookcstart;[m
[31m-    callhook(L, LUA_HOOKCOUNT, -1);[m
[31m-    L->top = L->base + slots;  /* Fix top again. */[m
[31m-  }[m
[31m-  if ((g->hookmask & LUA_MASKLINE)) {[m
[31m-    BCPos npc = proto_bcpos(pt, pc) - 1;[m
[31m-    BCPos opc = proto_bcpos(pt, oldpc) - 1;[m
[31m-    BCLine line = lj_debug_line(pt, npc);[m
[31m-    if (pc <= oldpc || opc >= pt->sizebc || line != lj_debug_line(pt, opc)) {[m
[31m-      callhook(L, LUA_HOOKLINE, line);[m
[31m-      L->top = L->base + slots;  /* Fix top again. */[m
[31m-    }[m
[31m-  }[m
[31m-  if ((g->hookmask & LUA_MASKRET) && bc_isret(bc_op(pc[-1])))[m
[31m-    callhook(L, LUA_HOOKRET, -1);[m
[31m-  ERRNO_RESTORE[m
[31m-}[m
[31m-[m
[31m-/* Initialize call. Ensure stack space and return # of missing parameters. */[m
[31m-static int call_init(lua_State *L, GCfunc *fn)[m
[31m-{[m
[31m-  if (isluafunc(fn)) {[m
[31m-    GCproto *pt = funcproto(fn);[m
[31m-    int numparams = pt->numparams;[m
[31m-    int gotparams = (int)(L->top - L->base);[m
[31m-    int need = pt->framesize;[m
[31m-    if ((pt->flags & PROTO_VARARG)) need += 1+gotparams;[m
[31m-    lj_state_checkstack(L, (MSize)need);[m
[31m-    numparams -= gotparams;[m
[31m-    return numparams >= 0 ? numparams : 0;[m
[31m-  } else {[m
[31m-    lj_state_checkstack(L, LUA_MINSTACK);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Call dispatch. Used by call hooks, hot calls or when recording. */[m
[31m-ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns *pc)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  BCOp op;[m
[31m-  global_State *g = G(L);[m
[31m-#if LJ_HASJIT[m
[31m-  jit_State *J = G2J(g);[m
[31m-#endif[m
[31m-  int missing = call_init(L, fn);[m
[31m-#if LJ_HASJIT[m
[31m-  J->L = L;[m
[31m-  if ((uintptr_t)pc & 1) {  /* Marker for hot call. */[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-    ptrdiff_t delta = L->top - L->base;[m
[31m-#endif[m
[31m-    pc = (const BCIns *)((uintptr_t)pc & ~(uintptr_t)1);[m
[31m-    lj_trace_hot(J, pc);[m
[31m-    lua_assert(L->top - L->base == delta);[m
[31m-    goto out;[m
[31m-  } else if (J->state != LJ_TRACE_IDLE &&[m
[31m-	     !(g->hookmask & (HOOK_GC|HOOK_VMEVENT))) {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-    ptrdiff_t delta = L->top - L->base;[m
[31m-#endif[m
[31m-    /* Record the FUNC* bytecodes, too. */[m
[31m-    lj_trace_ins(J, pc-1);  /* The interpreter bytecode PC is offset by 1. */[m
[31m-    lua_assert(L->top - L->base == delta);[m
[31m-  }[m
[31m-#endif[m
[31m-  if ((g->hookmask & LUA_MASKCALL)) {[m
[31m-    int i;[m
[31m-    for (i = 0; i < missing; i++)  /* Add missing parameters. */[m
[31m-      setnilV(L->top++);[m
[31m-    callhook(L, LUA_HOOKCALL, -1);[m
[31m-    /* Preserve modifications of missing parameters by lua_setlocal(). */[m
[31m-    while (missing-- > 0 && tvisnil(L->top - 1))[m
[31m-      L->top--;[m
[31m-  }[m
[31m-#if LJ_HASJIT[m
[31m-out:[m
[31m-#endif[m
[31m-  op = bc_op(pc[-1]);  /* Get FUNC* op. */[m
[31m-#if LJ_HASJIT[m
[31m-  /* Use the non-hotcounting variants if JIT is off or while recording. */[m
[31m-  if ((!(J->flags & JIT_F_ON) || J->state != LJ_TRACE_IDLE) &&[m
[31m-      (op == BC_FUNCF || op == BC_FUNCV))[m
[31m-    op = (BCOp)((int)op+(int)BC_IFUNCF-(int)BC_FUNCF);[m
[31m-#endif[m
[31m-  ERRNO_RESTORE[m
[31m-  return makeasmfunc(lj_bc_ofs[op]);  /* Return static dispatch target. */[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Stitch a new trace. */[m
[31m-void LJ_FASTCALL lj_dispatch_stitch(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  lua_State *L = J->L;[m
[31m-  void *cf = cframe_raw(L->cframe);[m
[31m-  const BCIns *oldpc = cframe_pc(cf);[m
[31m-  setcframe_pc(cf, pc);[m
[31m-  /* Before dispatch, have to bias PC by 1. */[m
[31m-  L->top = L->base + cur_topslot(curr_proto(L), pc+1, cframe_multres_n(cf));[m
[31m-  lj_trace_stitch(J, pc-1);  /* Point to the CALL instruction. */[m
[31m-  setcframe_pc(cf, oldpc);[m
[31m-  ERRNO_RESTORE[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-/* Profile dispatch. */[m
[31m-void LJ_FASTCALL lj_dispatch_profile(lua_State *L, const BCIns *pc)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  GCfunc *fn = curr_func(L);[m
[31m-  GCproto *pt = funcproto(fn);[m
[31m-  void *cf = cframe_raw(L->cframe);[m
[31m-  const BCIns *oldpc = cframe_pc(cf);[m
[31m-  global_State *g;[m
[31m-  setcframe_pc(cf, pc);[m
[31m-  L->top = L->base + cur_topslot(pt, pc, cframe_multres_n(cf));[m
[31m-  lj_profile_interpreter(L);[m
[31m-  setcframe_pc(cf, oldpc);[m
[31m-  g = G(L);[m
[31m-  setgcref(g->cur_L, obj2gco(L));[m
[31m-  setvmstate(g, INTERP);[m
[31m-  ERRNO_RESTORE[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_dispatch.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_dispatch.h[m
[1mdeleted file mode 100644[m
[1mindex 8270807..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_dispatch.h[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-/*[m
[31m-** Instruction dispatch handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_DISPATCH_H[m
[31m-#define _LJ_DISPATCH_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_MIPS[m
[31m-/* Need our own global offset table for the dreaded MIPS calling conventions. */[m
[31m-[m
[31m-#ifndef _LJ_VM_H[m
[31m-LJ_ASMF int32_t LJ_FASTCALL lj_vm_modi(int32_t a, int32_t b);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-#ifndef _LJ_IRCALL_H[m
[31m-extern double __adddf3(double a, double b);[m
[31m-extern double __subdf3(double a, double b);[m
[31m-extern double __muldf3(double a, double b);[m
[31m-extern double __divdf3(double a, double b);[m
[31m-#endif[m
[31m-#define SFGOTDEF(_)	_(sqrt) _(__adddf3) _(__subdf3) _(__muldf3) _(__divdf3)[m
[31m-#else[m
[31m-#define SFGOTDEF(_)[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-#define JITGOTDEF(_)	_(lj_trace_exit) _(lj_trace_hot)[m
[31m-#else[m
[31m-#define JITGOTDEF(_)[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-#define FFIGOTDEF(_) \[m
[31m-  _(lj_meta_equal_cd) _(lj_ccallback_enter) _(lj_ccallback_leave)[m
[31m-#else[m
[31m-#define FFIGOTDEF(_)[m
[31m-#endif[m
[31m-#define GOTDEF(_) \[m
[31m-  _(floor) _(ceil) _(trunc) _(log) _(log10) _(exp) _(sin) _(cos) _(tan) \[m
[31m-  _(asin) _(acos) _(atan) _(sinh) _(cosh) _(tanh) _(frexp) _(modf) _(atan2) \[m
[31m-  _(pow) _(fmod) _(ldexp) _(lj_vm_modi) \[m
[31m-  _(lj_dispatch_call) _(lj_dispatch_ins) _(lj_dispatch_stitch) \[m
[31m-  _(lj_dispatch_profile) _(lj_err_throw) \[m
[31m-  _(lj_ffh_coroutine_wrap_err) _(lj_func_closeuv) _(lj_func_newL_gc) \[m
[31m-  _(lj_gc_barrieruv) _(lj_gc_step) _(lj_gc_step_fixtop) _(lj_meta_arith) \[m
[31m-  _(lj_meta_call) _(lj_meta_cat) _(lj_meta_comp) _(lj_meta_equal) \[m
[31m-  _(lj_meta_for) _(lj_meta_istype) _(lj_meta_len) _(lj_meta_tget) \[m
[31m-  _(lj_meta_tset) _(lj_state_growstack) _(lj_strfmt_number) \[m
[31m-  _(lj_str_new) _(lj_tab_dup) _(lj_tab_get) _(lj_tab_getinth) _(lj_tab_len) \[m
[31m-  _(lj_tab_new) _(lj_tab_newkey) _(lj_tab_next) _(lj_tab_reasize) \[m
[31m-  _(lj_tab_setinth) _(lj_buf_putstr_reverse) _(lj_buf_putstr_lower) \[m
[31m-  _(lj_buf_putstr_upper) _(lj_buf_tostr) \[m
[31m-  JITGOTDEF(_) FFIGOTDEF(_) SFGOTDEF(_)[m
[31m-[m
[31m-enum {[m
[31m-#define GOTENUM(name) LJ_GOT_##name,[m
[31m-GOTDEF(GOTENUM)[m
[31m-#undef GOTENUM[m
[31m-  LJ_GOT__MAX[m
[31m-};[m
[31m-#endif[m
[31m-[m
[31m-/* Type of hot counter. Must match the code in the assembler VM. */[m
[31m-/* 16 bits are sufficient. Only 0.0015% overhead with maximum slot penalty. */[m
[31m-typedef uint16_t HotCount;[m
[31m-[m
[31m-/* Number of hot counter hash table entries (must be a power of two). */[m
[31m-#define HOTCOUNT_SIZE		64[m
[31m-#define HOTCOUNT_PCMASK		((HOTCOUNT_SIZE-1)*sizeof(HotCount))[m
[31m-[m
[31m-/* Hotcount decrements. */[m
[31m-#define HOTCOUNT_LOOP		2[m
[31m-#define HOTCOUNT_CALL		1[m
[31m-[m
[31m-/* This solves a circular dependency problem -- bump as needed. Sigh. */[m
[31m-#define GG_NUM_ASMFF	57[m
[31m-[m
[31m-#define GG_LEN_DDISP	(BC__MAX + GG_NUM_ASMFF)[m
[31m-#define GG_LEN_SDISP	BC_FUNCF[m
[31m-#define GG_LEN_DISP	(GG_LEN_DDISP + GG_LEN_SDISP)[m
[31m-[m
[31m-/* Global state, main thread and extra fields are allocated together. */[m
[31m-typedef struct GG_State {[m
[31m-  lua_State L;				/* Main thread. */[m
[31m-  global_State g;			/* Global state. */[m
[31m-#if LJ_TARGET_MIPS[m
[31m-  ASMFunction got[LJ_GOT__MAX];		/* Global offset table. */[m
[31m-#endif[m
[31m-#if LJ_HASJIT[m
[31m-  jit_State J;				/* JIT state. */[m
[31m-  HotCount hotcount[HOTCOUNT_SIZE];	/* Hot counters. */[m
[31m-#endif[m
[31m-  ASMFunction dispatch[GG_LEN_DISP];	/* Instruction dispatch tables. */[m
[31m-  BCIns bcff[GG_NUM_ASMFF];		/* Bytecode for ASM fast functions. */[m
[31m-} GG_State;[m
[31m-[m
[31m-#define GG_OFS(field)	((int)offsetof(GG_State, field))[m
[31m-#define G2GG(gl)	((GG_State *)((char *)(gl) - GG_OFS(g)))[m
[31m-#define J2GG(j)		((GG_State *)((char *)(j) - GG_OFS(J)))[m
[31m-#define L2GG(L)		(G2GG(G(L)))[m
[31m-#define J2G(J)		(&J2GG(J)->g)[m
[31m-#define G2J(gl)		(&G2GG(gl)->J)[m
[31m-#define L2J(L)		(&L2GG(L)->J)[m
[31m-#define GG_G2DISP	(GG_OFS(dispatch) - GG_OFS(g))[m
[31m-#define GG_DISP2G	(GG_OFS(g) - GG_OFS(dispatch))[m
[31m-#define GG_DISP2J	(GG_OFS(J) - GG_OFS(dispatch))[m
[31m-#define GG_DISP2HOT	(GG_OFS(hotcount) - GG_OFS(dispatch))[m
[31m-#define GG_DISP2STATIC	(GG_LEN_DDISP*(int)sizeof(ASMFunction))[m
[31m-[m
[31m-#define hotcount_get(gg, pc) \[m
[31m-  (gg)->hotcount[(u32ptr(pc)>>2) & (HOTCOUNT_SIZE-1)][m
[31m-#define hotcount_set(gg, pc, val) \[m
[31m-  (hotcount_get((gg), (pc)) = (HotCount)(val))[m
[31m-[m
[31m-/* Dispatch table management. */[m
[31m-LJ_FUNC void lj_dispatch_init(GG_State *GG);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC void lj_dispatch_init_hotcount(global_State *g);[m
[31m-#endif[m
[31m-LJ_FUNC void lj_dispatch_update(global_State *g);[m
[31m-[m
[31m-/* Instruction dispatch callback for hooks or when recording. */[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc);[m
[31m-LJ_FUNCA ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns*pc);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_dispatch_stitch(jit_State *J, const BCIns *pc);[m
[31m-#endif[m
[31m-#if LJ_HASPROFILE[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_dispatch_profile(lua_State *L, const BCIns *pc);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASFFI && !defined(_BUILDVM_H)[m
[31m-/* Save/restore errno and GetLastError() around hooks, exits and recording. */[m
[31m-#include <errno.h>[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-#define ERRNO_SAVE	int olderr = errno; DWORD oldwerr = GetLastError();[m
[31m-#define ERRNO_RESTORE	errno = olderr; SetLastError(oldwerr);[m
[31m-#else[m
[31m-#define ERRNO_SAVE	int olderr = errno;[m
[31m-#define ERRNO_RESTORE	errno = olderr;[m
[31m-#endif[m
[31m-#else[m
[31m-#define ERRNO_SAVE[m
[31m-#define ERRNO_RESTORE[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_arm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_arm.h[m
[1mdeleted file mode 100644[m
[1mindex 47fee5f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_arm.h[m
[1m+++ /dev/null[m
[36m@@ -1,356 +0,0 @@[m
[31m-/*[m
[31m-** ARM instruction emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Constant encoding --------------------------------------------------- */[m
[31m-[m
[31m-static uint8_t emit_invai[16] = {[m
[31m-  /* AND */ (ARMI_AND^ARMI_BIC) >> 21,[m
[31m-  /* EOR */ 0,[m
[31m-  /* SUB */ (ARMI_SUB^ARMI_ADD) >> 21,[m
[31m-  /* RSB */ 0,[m
[31m-  /* ADD */ (ARMI_ADD^ARMI_SUB) >> 21,[m
[31m-  /* ADC */ (ARMI_ADC^ARMI_SBC) >> 21,[m
[31m-  /* SBC */ (ARMI_SBC^ARMI_ADC) >> 21,[m
[31m-  /* RSC */ 0,[m
[31m-  /* TST */ 0,[m
[31m-  /* TEQ */ 0,[m
[31m-  /* CMP */ (ARMI_CMP^ARMI_CMN) >> 21,[m
[31m-  /* CMN */ (ARMI_CMN^ARMI_CMP) >> 21,[m
[31m-  /* ORR */ 0,[m
[31m-  /* MOV */ (ARMI_MOV^ARMI_MVN) >> 21,[m
[31m-  /* BIC */ (ARMI_BIC^ARMI_AND) >> 21,[m
[31m-  /* MVN */ (ARMI_MVN^ARMI_MOV) >> 21[m
[31m-};[m
[31m-[m
[31m-/* Encode constant in K12 format for data processing instructions. */[m
[31m-static uint32_t emit_isk12(ARMIns ai, int32_t n)[m
[31m-{[m
[31m-  uint32_t invai, i, m = (uint32_t)n;[m
[31m-  /* K12: unsigned 8 bit value, rotated in steps of two bits. */[m
[31m-  for (i = 0; i < 4096; i += 256, m = lj_rol(m, 2))[m
[31m-    if (m <= 255) return ARMI_K12|m|i;[m
[31m-  /* Otherwise try negation/complement with the inverse instruction. */[m
[31m-  invai = emit_invai[((ai >> 21) & 15)];[m
[31m-  if (!invai) return 0;  /* Failed. No inverse instruction. */[m
[31m-  m = ~(uint32_t)n;[m
[31m-  if (invai == ((ARMI_SUB^ARMI_ADD) >> 21) ||[m
[31m-      invai == (ARMI_CMP^ARMI_CMN) >> 21) m++;[m
[31m-  for (i = 0; i < 4096; i += 256, m = lj_rol(m, 2))[m
[31m-    if (m <= 255) return ARMI_K12|(invai<<21)|m|i;[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* -- Emit basic instructions --------------------------------------------- */[m
[31m-[m
[31m-static void emit_dnm(ASMState *as, ARMIns ai, Reg rd, Reg rn, Reg rm)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_D(rd) | ARMF_N(rn) | ARMF_M(rm);[m
[31m-}[m
[31m-[m
[31m-static void emit_dm(ASMState *as, ARMIns ai, Reg rd, Reg rm)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_D(rd) | ARMF_M(rm);[m
[31m-}[m
[31m-[m
[31m-static void emit_dn(ASMState *as, ARMIns ai, Reg rd, Reg rn)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_D(rd) | ARMF_N(rn);[m
[31m-}[m
[31m-[m
[31m-static void emit_nm(ASMState *as, ARMIns ai, Reg rn, Reg rm)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_N(rn) | ARMF_M(rm);[m
[31m-}[m
[31m-[m
[31m-static void emit_d(ASMState *as, ARMIns ai, Reg rd)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_D(rd);[m
[31m-}[m
[31m-[m
[31m-static void emit_n(ASMState *as, ARMIns ai, Reg rn)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_N(rn);[m
[31m-}[m
[31m-[m
[31m-static void emit_m(ASMState *as, ARMIns ai, Reg rm)[m
[31m-{[m
[31m-  *--as->mcp = ai | ARMF_M(rm);[m
[31m-}[m
[31m-[m
[31m-static void emit_lsox(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)[m
[31m-{[m
[31m-  lua_assert(ofs >= -255 && ofs <= 255);[m
[31m-  if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;[m
[31m-  *--as->mcp = ai | ARMI_LS_P | ARMI_LSX_I | ARMF_D(rd) | ARMF_N(rn) |[m
[31m-	       ((ofs & 0xf0) << 4) | (ofs & 0x0f);[m
[31m-}[m
[31m-[m
[31m-static void emit_lso(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)[m
[31m-{[m
[31m-  lua_assert(ofs >= -4095 && ofs <= 4095);[m
[31m-  /* Combine LDR/STR pairs to LDRD/STRD. */[m
[31m-  if (*as->mcp == (ai|ARMI_LS_P|ARMI_LS_U|ARMF_D(rd^1)|ARMF_N(rn)|(ofs^4)) &&[m
[31m-      (ai & ~(ARMI_LDR^ARMI_STR)) == ARMI_STR && rd != rn &&[m
[31m-      (uint32_t)ofs <= 252 && !(ofs & 3) && !((rd ^ (ofs >>2)) & 1) &&[m
[31m-      as->mcp != as->mcloop) {[m
[31m-    as->mcp++;[m
[31m-    emit_lsox(as, ai == ARMI_LDR ? ARMI_LDRD : ARMI_STRD, rd&~1, rn, ofs&~4);[m
[31m-    return;[m
[31m-  }[m
[31m-  if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;[m
[31m-  *--as->mcp = ai | ARMI_LS_P | ARMF_D(rd) | ARMF_N(rn) | ofs;[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-static void emit_vlso(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)[m
[31m-{[m
[31m-  lua_assert(ofs >= -1020 && ofs <= 1020 && (ofs&3) == 0);[m
[31m-  if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;[m
[31m-  *--as->mcp = ai | ARMI_LS_P | ARMF_D(rd & 15) | ARMF_N(rn) | (ofs >> 2);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Emit loads/stores --------------------------------------------------- */[m
[31m-[m
[31m-/* Prefer spills of BASE/L. */[m
[31m-#define emit_canremat(ref)	((ref) < ASMREF_L)[m
[31m-[m
[31m-/* Try to find a one step delta relative to another constant. */[m
[31m-static int emit_kdelta1(ASMState *as, Reg d, int32_t i)[m
[31m-{[m
[31m-  RegSet work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    lua_assert(r != d);[m
[31m-    if (emit_canremat(ref)) {[m
[31m-      int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);[m
[31m-      uint32_t k = emit_isk12(ARMI_ADD, delta);[m
[31m-      if (k) {[m
[31m-	if (k == ARMI_K12)[m
[31m-	  emit_dm(as, ARMI_MOV, d, r);[m
[31m-	else[m
[31m-	  emit_dn(as, ARMI_ADD^k, d, r);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* Try to find a two step delta relative to another constant. */[m
[31m-static int emit_kdelta2(ASMState *as, Reg d, int32_t i)[m
[31m-{[m
[31m-  RegSet work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    lua_assert(r != d);[m
[31m-    if (emit_canremat(ref)) {[m
[31m-      int32_t other = ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i;[m
[31m-      if (other) {[m
[31m-	int32_t delta = i - other;[m
[31m-	uint32_t sh, inv = 0, k2, k;[m
[31m-	if (delta < 0) { delta = -delta; inv = ARMI_ADD^ARMI_SUB; }[m
[31m-	sh = lj_ffs(delta) & ~1;[m
[31m-	k2 = emit_isk12(0, delta & (255 << sh));[m
[31m-	k = emit_isk12(0, delta & ~(255 << sh));[m
[31m-	if (k) {[m
[31m-	  emit_dn(as, ARMI_ADD^k2^inv, d, d);[m
[31m-	  emit_dn(as, ARMI_ADD^k^inv, d, r);[m
[31m-	  return 1;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* Load a 32 bit constant into a GPR. */[m
[31m-static void emit_loadi(ASMState *as, Reg r, int32_t i)[m
[31m-{[m
[31m-  uint32_t k = emit_isk12(ARMI_MOV, i);[m
[31m-  lua_assert(rset_test(as->freeset, r) || r == RID_TMP);[m
[31m-  if (k) {[m
[31m-    /* Standard K12 constant. */[m
[31m-    emit_d(as, ARMI_MOV^k, r);[m
[31m-  } else if ((as->flags & JIT_F_ARMV6T2) && (uint32_t)i < 0x00010000u) {[m
[31m-    /* 16 bit loword constant for ARMv6T2. */[m
[31m-    emit_d(as, ARMI_MOVW|(i & 0x0fff)|((i & 0xf000)<<4), r);[m
[31m-  } else if (emit_kdelta1(as, r, i)) {[m
[31m-    /* One step delta relative to another constant. */[m
[31m-  } else if ((as->flags & JIT_F_ARMV6T2)) {[m
[31m-    /* 32 bit hiword/loword constant for ARMv6T2. */[m
[31m-    emit_d(as, ARMI_MOVT|((i>>16) & 0x0fff)|(((i>>16) & 0xf000)<<4), r);[m
[31m-    emit_d(as, ARMI_MOVW|(i & 0x0fff)|((i & 0xf000)<<4), r);[m
[31m-  } else if (emit_kdelta2(as, r, i)) {[m
[31m-    /* Two step delta relative to another constant. */[m
[31m-  } else {[m
[31m-    /* Otherwise construct the constant with up to 4 instructions. */[m
[31m-    /* NYI: use mvn+bic, use pc-relative loads. */[m
[31m-    for (;;) {[m
[31m-      uint32_t sh = lj_ffs(i) & ~1;[m
[31m-      int32_t m = i & (255 << sh);[m
[31m-      i &= ~(255 << sh);[m
[31m-      if (i == 0) {[m
[31m-	emit_d(as, ARMI_MOV ^ emit_isk12(0, m), r);[m
[31m-	break;[m
[31m-      }[m
[31m-      emit_dn(as, ARMI_ORR ^ emit_isk12(0, m), r, r);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))[m
[31m-[m
[31m-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);[m
[31m-[m
[31m-/* Get/set from constant pointer. */[m
[31m-static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p)[m
[31m-{[m
[31m-  int32_t i = i32ptr(p);[m
[31m-  emit_lso(as, ai, r, ra_allock(as, (i & ~4095), rset_exclude(RSET_GPR, r)),[m
[31m-	   (i & 4095));[m
[31m-}[m
[31m-[m
[31m-#if !LJ_SOFTFP[m
[31m-/* Load a number constant into an FPR. */[m
[31m-static void emit_loadn(ASMState *as, Reg r, cTValue *tv)[m
[31m-{[m
[31m-  int32_t i;[m
[31m-  if ((as->flags & JIT_F_VFPV3) && !tv->u32.lo) {[m
[31m-    uint32_t hi = tv->u32.hi;[m
[31m-    uint32_t b = ((hi >> 22) & 0x1ff);[m
[31m-    if (!(hi & 0xffff) && (b == 0x100 || b == 0x0ff)) {[m
[31m-      *--as->mcp = ARMI_VMOVI_D | ARMF_D(r & 15) |[m
[31m-		   ((tv->u32.hi >> 12) & 0x00080000) |[m
[31m-		   ((tv->u32.hi >> 4) & 0x00070000) |[m
[31m-		   ((tv->u32.hi >> 16) & 0x0000000f);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  i = i32ptr(tv);[m
[31m-  emit_vlso(as, ARMI_VLDR_D, r,[m
[31m-	    ra_allock(as, (i & ~1020), RSET_GPR), (i & 1020));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Get/set global_State fields. */[m
[31m-#define emit_getgl(as, r, field) \[m
[31m-  emit_lsptr(as, ARMI_LDR, (r), (void *)&J2G(as->J)->field)[m
[31m-#define emit_setgl(as, r, field) \[m
[31m-  emit_lsptr(as, ARMI_STR, (r), (void *)&J2G(as->J)->field)[m
[31m-[m
[31m-/* Trace number is determined from pc of exit instruction. */[m
[31m-#define emit_setvmstate(as, i)		UNUSED(i)[m
[31m-[m
[31m-/* -- Emit control-flow instructions -------------------------------------- */[m
[31m-[m
[31m-/* Label for internal jumps. */[m
[31m-typedef MCode *MCLabel;[m
[31m-[m
[31m-/* Return label pointing to current PC. */[m
[31m-#define emit_label(as)		((as)->mcp)[m
[31m-[m
[31m-static void emit_branch(ASMState *as, ARMIns ai, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  ptrdiff_t delta = (target - p) - 1;[m
[31m-  lua_assert(((delta + 0x00800000) >> 24) == 0);[m
[31m-  *--p = ai | ((uint32_t)delta & 0x00ffffffu);[m
[31m-  as->mcp = p;[m
[31m-}[m
[31m-[m
[31m-#define emit_jmp(as, target) emit_branch(as, ARMI_B, (target))[m
[31m-[m
[31m-static void emit_call(ASMState *as, void *target)[m
[31m-{[m
[31m-  MCode *p = --as->mcp;[m
[31m-  ptrdiff_t delta = ((char *)target - (char *)p) - 8;[m
[31m-  if ((((delta>>2) + 0x00800000) >> 24) == 0) {[m
[31m-    if ((delta & 1))[m
[31m-      *p = ARMI_BLX | ((uint32_t)(delta>>2) & 0x00ffffffu) | ((delta&2) << 27);[m
[31m-    else[m
[31m-      *p = ARMI_BL | ((uint32_t)(delta>>2) & 0x00ffffffu);[m
[31m-  } else {  /* Target out of range: need indirect call. But don't use R0-R3. */[m
[31m-    Reg r = ra_allock(as, i32ptr(target), RSET_RANGE(RID_R4, RID_R12+1));[m
[31m-    *p = ARMI_BLXr | ARMF_M(r);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Emit generic operations --------------------------------------------- */[m
[31m-[m
[31m-/* Generic move between two regs. */[m
[31m-static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!irt_isnum(ir->t)); UNUSED(ir);[m
[31m-#else[m
[31m-  if (dst >= RID_MAX_GPR) {[m
[31m-    emit_dm(as, irt_isnum(ir->t) ? ARMI_VMOV_D : ARMI_VMOV_S,[m
[31m-	    (dst & 15), (src & 15));[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  if (as->mcp != as->mcloop) {  /* Swap early registers for loads/stores. */[m
[31m-    MCode ins = *as->mcp, swp = (src^dst);[m
[31m-    if ((ins & 0x0c000000) == 0x04000000 && (ins & 0x02000010) != 0x02000010) {[m
[31m-      if (!((ins ^ (dst << 16)) & 0x000f0000))[m
[31m-	*as->mcp = ins ^ (swp << 16);  /* Swap N in load/store. */[m
[31m-      if (!(ins & 0x00100000) && !((ins ^ (dst << 12)) & 0x0000f000))[m
[31m-	*as->mcp = ins ^ (swp << 12);  /* Swap D in store. */[m
[31m-    }[m
[31m-  }[m
[31m-  emit_dm(as, ARMI_MOV, dst, src);[m
[31m-}[m
[31m-[m
[31m-/* Generic load of register with base and (small) offset address. */[m
[31m-static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!irt_isnum(ir->t)); UNUSED(ir);[m
[31m-#else[m
[31m-  if (r >= RID_MAX_GPR)[m
[31m-    emit_vlso(as, irt_isnum(ir->t) ? ARMI_VLDR_D : ARMI_VLDR_S, r, base, ofs);[m
[31m-  else[m
[31m-#endif[m
[31m-    emit_lso(as, ARMI_LDR, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Generic store of register with base and (small) offset address. */[m
[31m-static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  lua_assert(!irt_isnum(ir->t)); UNUSED(ir);[m
[31m-#else[m
[31m-  if (r >= RID_MAX_GPR)[m
[31m-    emit_vlso(as, irt_isnum(ir->t) ? ARMI_VSTR_D : ARMI_VSTR_S, r, base, ofs);[m
[31m-  else[m
[31m-#endif[m
[31m-    emit_lso(as, ARMI_STR, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Emit an arithmetic/logic operation with a constant operand. */[m
[31m-static void emit_opk(ASMState *as, ARMIns ai, Reg dest, Reg src,[m
[31m-		     int32_t i, RegSet allow)[m
[31m-{[m
[31m-  uint32_t k = emit_isk12(ai, i);[m
[31m-  if (k)[m
[31m-    emit_dn(as, ai^k, dest, src);[m
[31m-  else[m
[31m-    emit_dnm(as, ai, dest, src, ra_allock(as, i, allow));[m
[31m-}[m
[31m-[m
[31m-/* Add offset to pointer. */[m
[31m-static void emit_addptr(ASMState *as, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs)[m
[31m-    emit_opk(as, ARMI_ADD, r, r, ofs, rset_exclude(RSET_GPR, r));[m
[31m-}[m
[31m-[m
[31m-#define emit_spsub(as, ofs)	emit_addptr(as, RID_SP, -(ofs))[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_mips.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_mips.h[m
[1mdeleted file mode 100644[m
[1mindex fdebe94..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_mips.h[m
[1m+++ /dev/null[m
[36m@@ -1,213 +0,0 @@[m
[31m-/*[m
[31m-** MIPS instruction emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Emit basic instructions --------------------------------------------- */[m
[31m-[m
[31m-static void emit_dst(ASMState *as, MIPSIns mi, Reg rd, Reg rs, Reg rt)[m
[31m-{[m
[31m-  *--as->mcp = mi | MIPSF_D(rd) | MIPSF_S(rs) | MIPSF_T(rt);[m
[31m-}[m
[31m-[m
[31m-static void emit_dta(ASMState *as, MIPSIns mi, Reg rd, Reg rt, uint32_t a)[m
[31m-{[m
[31m-  *--as->mcp = mi | MIPSF_D(rd) | MIPSF_T(rt) | MIPSF_A(a);[m
[31m-}[m
[31m-[m
[31m-#define emit_ds(as, mi, rd, rs)		emit_dst(as, (mi), (rd), (rs), 0)[m
[31m-#define emit_tg(as, mi, rt, rg)		emit_dst(as, (mi), (rg)&31, 0, (rt))[m
[31m-[m
[31m-static void emit_tsi(ASMState *as, MIPSIns mi, Reg rt, Reg rs, int32_t i)[m
[31m-{[m
[31m-  *--as->mcp = mi | MIPSF_T(rt) | MIPSF_S(rs) | (i & 0xffff);[m
[31m-}[m
[31m-[m
[31m-#define emit_ti(as, mi, rt, i)		emit_tsi(as, (mi), (rt), 0, (i))[m
[31m-#define emit_hsi(as, mi, rh, rs, i)	emit_tsi(as, (mi), (rh) & 31, (rs), (i))[m
[31m-[m
[31m-static void emit_fgh(ASMState *as, MIPSIns mi, Reg rf, Reg rg, Reg rh)[m
[31m-{[m
[31m-  *--as->mcp = mi | MIPSF_F(rf&31) | MIPSF_G(rg&31) | MIPSF_H(rh&31);[m
[31m-}[m
[31m-[m
[31m-#define emit_fg(as, mi, rf, rg)		emit_fgh(as, (mi), (rf), (rg), 0)[m
[31m-[m
[31m-static void emit_rotr(ASMState *as, Reg dest, Reg src, Reg tmp, uint32_t shift)[m
[31m-{[m
[31m-  if ((as->flags & JIT_F_MIPS32R2)) {[m
[31m-    emit_dta(as, MIPSI_ROTR, dest, src, shift);[m
[31m-  } else {[m
[31m-    emit_dst(as, MIPSI_OR, dest, dest, tmp);[m
[31m-    emit_dta(as, MIPSI_SLL, dest, src, (-shift)&31);[m
[31m-    emit_dta(as, MIPSI_SRL, tmp, src, shift);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Emit loads/stores --------------------------------------------------- */[m
[31m-[m
[31m-/* Prefer rematerialization of BASE/L from global_State over spills. */[m
[31m-#define emit_canremat(ref)	((ref) <= REF_BASE)[m
[31m-[m
[31m-/* Try to find a one step delta relative to another constant. */[m
[31m-static int emit_kdelta1(ASMState *as, Reg t, int32_t i)[m
[31m-{[m
[31m-  RegSet work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    lua_assert(r != t);[m
[31m-    if (ref < ASMREF_L) {[m
[31m-      int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);[m
[31m-      if (checki16(delta)) {[m
[31m-	emit_tsi(as, MIPSI_ADDIU, t, r, delta);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* Load a 32 bit constant into a GPR. */[m
[31m-static void emit_loadi(ASMState *as, Reg r, int32_t i)[m
[31m-{[m
[31m-  if (checki16(i)) {[m
[31m-    emit_ti(as, MIPSI_LI, r, i);[m
[31m-  } else {[m
[31m-    if ((i & 0xffff)) {[m
[31m-      int32_t jgl = i32ptr(J2G(as->J));[m
[31m-      if ((uint32_t)(i-jgl) < 65536) {[m
[31m-	emit_tsi(as, MIPSI_ADDIU, r, RID_JGL, i-jgl-32768);[m
[31m-	return;[m
[31m-      } else if (emit_kdelta1(as, r, i)) {[m
[31m-	return;[m
[31m-      } else if ((i >> 16) == 0) {[m
[31m-	emit_tsi(as, MIPSI_ORI, r, RID_ZERO, i);[m
[31m-	return;[m
[31m-      }[m
[31m-      emit_tsi(as, MIPSI_ORI, r, r, i);[m
[31m-    }[m
[31m-    emit_ti(as, MIPSI_LUI, r, (i >> 16));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))[m
[31m-[m
[31m-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);[m
[31m-static void ra_allockreg(ASMState *as, int32_t k, Reg r);[m
[31m-[m
[31m-/* Get/set from constant pointer. */[m
[31m-static void emit_lsptr(ASMState *as, MIPSIns mi, Reg r, void *p, RegSet allow)[m
[31m-{[m
[31m-  int32_t jgl = i32ptr(J2G(as->J));[m
[31m-  int32_t i = i32ptr(p);[m
[31m-  Reg base;[m
[31m-  if ((uint32_t)(i-jgl) < 65536) {[m
[31m-    i = i-jgl-32768;[m
[31m-    base = RID_JGL;[m
[31m-  } else {[m
[31m-    base = ra_allock(as, i-(int16_t)i, allow);[m
[31m-  }[m
[31m-  emit_tsi(as, mi, r, base, i);[m
[31m-}[m
[31m-[m
[31m-#define emit_loadn(as, r, tv) \[m
[31m-  emit_lsptr(as, MIPSI_LDC1, ((r) & 31), (void *)(tv), RSET_GPR)[m
[31m-[m
[31m-/* Get/set global_State fields. */[m
[31m-static void emit_lsglptr(ASMState *as, MIPSIns mi, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  emit_tsi(as, mi, r, RID_JGL, ofs-32768);[m
[31m-}[m
[31m-[m
[31m-#define emit_getgl(as, r, field) \[m
[31m-  emit_lsglptr(as, MIPSI_LW, (r), (int32_t)offsetof(global_State, field))[m
[31m-#define emit_setgl(as, r, field) \[m
[31m-  emit_lsglptr(as, MIPSI_SW, (r), (int32_t)offsetof(global_State, field))[m
[31m-[m
[31m-/* Trace number is determined from per-trace exit stubs. */[m
[31m-#define emit_setvmstate(as, i)		UNUSED(i)[m
[31m-[m
[31m-/* -- Emit control-flow instructions -------------------------------------- */[m
[31m-[m
[31m-/* Label for internal jumps. */[m
[31m-typedef MCode *MCLabel;[m
[31m-[m
[31m-/* Return label pointing to current PC. */[m
[31m-#define emit_label(as)		((as)->mcp)[m
[31m-[m
[31m-static void emit_branch(ASMState *as, MIPSIns mi, Reg rs, Reg rt, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  ptrdiff_t delta = target - p;[m
[31m-  lua_assert(((delta + 0x8000) >> 16) == 0);[m
[31m-  *--p = mi | MIPSF_S(rs) | MIPSF_T(rt) | ((uint32_t)delta & 0xffffu);[m
[31m-  as->mcp = p;[m
[31m-}[m
[31m-[m
[31m-static void emit_jmp(ASMState *as, MCode *target)[m
[31m-{[m
[31m-  *--as->mcp = MIPSI_NOP;[m
[31m-  emit_branch(as, MIPSI_B, RID_ZERO, RID_ZERO, (target));[m
[31m-}[m
[31m-[m
[31m-static void emit_call(ASMState *as, void *target, int needcfa)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  *--p = MIPSI_NOP;[m
[31m-  if ((((uintptr_t)target ^ (uintptr_t)p) >> 28) == 0) {[m
[31m-    *--p = MIPSI_JAL | (((uintptr_t)target >>2) & 0x03ffffffu);[m
[31m-  } else {  /* Target out of range: need indirect call. */[m
[31m-    *--p = MIPSI_JALR | MIPSF_S(RID_CFUNCADDR);[m
[31m-    needcfa = 1;[m
[31m-  }[m
[31m-  as->mcp = p;[m
[31m-  if (needcfa) ra_allockreg(as, i32ptr(target), RID_CFUNCADDR);[m
[31m-}[m
[31m-[m
[31m-/* -- Emit generic operations --------------------------------------------- */[m
[31m-[m
[31m-#define emit_move(as, dst, src) \[m
[31m-  emit_ds(as, MIPSI_MOVE, (dst), (src))[m
[31m-[m
[31m-/* Generic move between two regs. */[m
[31m-static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)[m
[31m-{[m
[31m-  if (dst < RID_MAX_GPR)[m
[31m-    emit_move(as, dst, src);[m
[31m-  else[m
[31m-    emit_fg(as, irt_isnum(ir->t) ? MIPSI_MOV_D : MIPSI_MOV_S, dst, src);[m
[31m-}[m
[31m-[m
[31m-/* Generic load of register with base and (small) offset address. */[m
[31m-static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_tsi(as, MIPSI_LW, r, base, ofs);[m
[31m-  else[m
[31m-    emit_tsi(as, irt_isnum(ir->t) ? MIPSI_LDC1 : MIPSI_LWC1,[m
[31m-	     (r & 31), base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Generic store of register with base and (small) offset address. */[m
[31m-static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_tsi(as, MIPSI_SW, r, base, ofs);[m
[31m-  else[m
[31m-    emit_tsi(as, irt_isnum(ir->t) ? MIPSI_SDC1 : MIPSI_SWC1,[m
[31m-	     (r&31), base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Add offset to pointer. */[m
[31m-static void emit_addptr(ASMState *as, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs) {[m
[31m-    lua_assert(checki16(ofs));[m
[31m-    emit_tsi(as, MIPSI_ADDIU, r, r, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_spsub(as, ofs)	emit_addptr(as, RID_SP, -(ofs))[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex 4eb933e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,238 +0,0 @@[m
[31m-/*[m
[31m-** PPC instruction emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Emit basic instructions --------------------------------------------- */[m
[31m-[m
[31m-static void emit_tab(ASMState *as, PPCIns pi, Reg rt, Reg ra, Reg rb)[m
[31m-{[m
[31m-  *--as->mcp = pi | PPCF_T(rt) | PPCF_A(ra) | PPCF_B(rb);[m
[31m-}[m
[31m-[m
[31m-#define emit_asb(as, pi, ra, rs, rb)	emit_tab(as, (pi), (rs), (ra), (rb))[m
[31m-#define emit_as(as, pi, ra, rs)		emit_tab(as, (pi), (rs), (ra), 0)[m
[31m-#define emit_ab(as, pi, ra, rb)		emit_tab(as, (pi), 0, (ra), (rb))[m
[31m-[m
[31m-static void emit_tai(ASMState *as, PPCIns pi, Reg rt, Reg ra, int32_t i)[m
[31m-{[m
[31m-  *--as->mcp = pi | PPCF_T(rt) | PPCF_A(ra) | (i & 0xffff);[m
[31m-}[m
[31m-[m
[31m-#define emit_ti(as, pi, rt, i)		emit_tai(as, (pi), (rt), 0, (i))[m
[31m-#define emit_ai(as, pi, ra, i)		emit_tai(as, (pi), 0, (ra), (i))[m
[31m-#define emit_asi(as, pi, ra, rs, i)	emit_tai(as, (pi), (rs), (ra), (i))[m
[31m-[m
[31m-#define emit_fab(as, pi, rf, ra, rb) \[m
[31m-  emit_tab(as, (pi), (rf)&31, (ra)&31, (rb)&31)[m
[31m-#define emit_fb(as, pi, rf, rb)		emit_tab(as, (pi), (rf)&31, 0, (rb)&31)[m
[31m-#define emit_fac(as, pi, rf, ra, rc) \[m
[31m-  emit_tab(as, (pi) | PPCF_C((rc) & 31), (rf)&31, (ra)&31, 0)[m
[31m-#define emit_facb(as, pi, rf, ra, rc, rb) \[m
[31m-  emit_tab(as, (pi) | PPCF_C((rc) & 31), (rf)&31, (ra)&31, (rb)&31)[m
[31m-#define emit_fai(as, pi, rf, ra, i)	emit_tai(as, (pi), (rf)&31, (ra), (i))[m
[31m-[m
[31m-static void emit_rot(ASMState *as, PPCIns pi, Reg ra, Reg rs,[m
[31m-		     int32_t n, int32_t b, int32_t e)[m
[31m-{[m
[31m-  *--as->mcp = pi | PPCF_T(rs) | PPCF_A(ra) | PPCF_B(n) |[m
[31m-	       PPCF_MB(b) | PPCF_ME(e);[m
[31m-}[m
[31m-[m
[31m-static void emit_slwi(ASMState *as, Reg ra, Reg rs, int32_t n)[m
[31m-{[m
[31m-  lua_assert(n >= 0 && n < 32);[m
[31m-  emit_rot(as, PPCI_RLWINM, ra, rs, n, 0, 31-n);[m
[31m-}[m
[31m-[m
[31m-static void emit_rotlwi(ASMState *as, Reg ra, Reg rs, int32_t n)[m
[31m-{[m
[31m-  lua_assert(n >= 0 && n < 32);[m
[31m-  emit_rot(as, PPCI_RLWINM, ra, rs, n, 0, 31);[m
[31m-}[m
[31m-[m
[31m-/* -- Emit loads/stores --------------------------------------------------- */[m
[31m-[m
[31m-/* Prefer rematerialization of BASE/L from global_State over spills. */[m
[31m-#define emit_canremat(ref)	((ref) <= REF_BASE)[m
[31m-[m
[31m-/* Try to find a one step delta relative to another constant. */[m
[31m-static int emit_kdelta1(ASMState *as, Reg t, int32_t i)[m
[31m-{[m
[31m-  RegSet work = ~as->freeset & RSET_GPR;[m
[31m-  while (work) {[m
[31m-    Reg r = rset_picktop(work);[m
[31m-    IRRef ref = regcost_ref(as->cost[r]);[m
[31m-    lua_assert(r != t);[m
[31m-    if (ref < ASMREF_L) {[m
[31m-      int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);[m
[31m-      if (checki16(delta)) {[m
[31m-	emit_tai(as, PPCI_ADDI, t, r, delta);[m
[31m-	return 1;[m
[31m-      }[m
[31m-    }[m
[31m-    rset_clear(work, r);[m
[31m-  }[m
[31m-  return 0;  /* Failed. */[m
[31m-}[m
[31m-[m
[31m-/* Load a 32 bit constant into a GPR. */[m
[31m-static void emit_loadi(ASMState *as, Reg r, int32_t i)[m
[31m-{[m
[31m-  if (checki16(i)) {[m
[31m-    emit_ti(as, PPCI_LI, r, i);[m
[31m-  } else {[m
[31m-    if ((i & 0xffff)) {[m
[31m-      int32_t jgl = i32ptr(J2G(as->J));[m
[31m-      if ((uint32_t)(i-jgl) < 65536) {[m
[31m-	emit_tai(as, PPCI_ADDI, r, RID_JGL, i-jgl-32768);[m
[31m-	return;[m
[31m-      } else if (emit_kdelta1(as, r, i)) {[m
[31m-	return;[m
[31m-      }[m
[31m-      emit_asi(as, PPCI_ORI, r, r, i);[m
[31m-    }[m
[31m-    emit_ti(as, PPCI_LIS, r, (i >> 16));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_loada(as, r, addr)		emit_loadi(as, (r), i32ptr((addr)))[m
[31m-[m
[31m-static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);[m
[31m-[m
[31m-/* Get/set from constant pointer. */[m
[31m-static void emit_lsptr(ASMState *as, PPCIns pi, Reg r, void *p, RegSet allow)[m
[31m-{[m
[31m-  int32_t jgl = i32ptr(J2G(as->J));[m
[31m-  int32_t i = i32ptr(p);[m
[31m-  Reg base;[m
[31m-  if ((uint32_t)(i-jgl) < 65536) {[m
[31m-    i = i-jgl-32768;[m
[31m-    base = RID_JGL;[m
[31m-  } else {[m
[31m-    base = ra_allock(as, i-(int16_t)i, allow);[m
[31m-  }[m
[31m-  emit_tai(as, pi, r, base, i);[m
[31m-}[m
[31m-[m
[31m-#define emit_loadn(as, r, tv) \[m
[31m-  emit_lsptr(as, PPCI_LFD, ((r) & 31), (void *)(tv), RSET_GPR)[m
[31m-[m
[31m-/* Get/set global_State fields. */[m
[31m-static void emit_lsglptr(ASMState *as, PPCIns pi, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  emit_tai(as, pi, r, RID_JGL, ofs-32768);[m
[31m-}[m
[31m-[m
[31m-#define emit_getgl(as, r, field) \[m
[31m-  emit_lsglptr(as, PPCI_LWZ, (r), (int32_t)offsetof(global_State, field))[m
[31m-#define emit_setgl(as, r, field) \[m
[31m-  emit_lsglptr(as, PPCI_STW, (r), (int32_t)offsetof(global_State, field))[m
[31m-[m
[31m-/* Trace number is determined from per-trace exit stubs. */[m
[31m-#define emit_setvmstate(as, i)		UNUSED(i)[m
[31m-[m
[31m-/* -- Emit control-flow instructions -------------------------------------- */[m
[31m-[m
[31m-/* Label for internal jumps. */[m
[31m-typedef MCode *MCLabel;[m
[31m-[m
[31m-/* Return label pointing to current PC. */[m
[31m-#define emit_label(as)		((as)->mcp)[m
[31m-[m
[31m-static void emit_condbranch(ASMState *as, PPCIns pi, PPCCC cc, MCode *target)[m
[31m-{[m
[31m-  MCode *p = --as->mcp;[m
[31m-  ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-  lua_assert(((delta + 0x8000) >> 16) == 0);[m
[31m-  pi ^= (delta & 0x8000) * (PPCF_Y/0x8000);[m
[31m-  *p = pi | PPCF_CC(cc) | ((uint32_t)delta & 0xffffu);[m
[31m-}[m
[31m-[m
[31m-static void emit_jmp(ASMState *as, MCode *target)[m
[31m-{[m
[31m-  MCode *p = --as->mcp;[m
[31m-  ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-  *p = PPCI_B | (delta & 0x03fffffcu);[m
[31m-}[m
[31m-[m
[31m-static void emit_call(ASMState *as, void *target)[m
[31m-{[m
[31m-  MCode *p = --as->mcp;[m
[31m-  ptrdiff_t delta = (char *)target - (char *)p;[m
[31m-  if ((((delta>>2) + 0x00800000) >> 24) == 0) {[m
[31m-    *p = PPCI_BL | (delta & 0x03fffffcu);[m
[31m-  } else {  /* Target out of range: need indirect call. Don't use arg reg. */[m
[31m-    RegSet allow = RSET_GPR & ~RSET_RANGE(RID_R0, REGARG_LASTGPR+1);[m
[31m-    Reg r = ra_allock(as, i32ptr(target), allow);[m
[31m-    *p = PPCI_BCTRL;[m
[31m-    p[-1] = PPCI_MTCTR | PPCF_T(r);[m
[31m-    as->mcp = p-1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Emit generic operations --------------------------------------------- */[m
[31m-[m
[31m-#define emit_mr(as, dst, src) \[m
[31m-  emit_asb(as, PPCI_MR, (dst), (src), (src))[m
[31m-[m
[31m-/* Generic move between two regs. */[m
[31m-static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  if (dst < RID_MAX_GPR)[m
[31m-    emit_mr(as, dst, src);[m
[31m-  else[m
[31m-    emit_fb(as, PPCI_FMR, dst, src);[m
[31m-}[m
[31m-[m
[31m-/* Generic load of register with base and (small) offset address. */[m
[31m-static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_tai(as, PPCI_LWZ, r, base, ofs);[m
[31m-  else[m
[31m-    emit_fai(as, irt_isnum(ir->t) ? PPCI_LFD : PPCI_LFS, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Generic store of register with base and (small) offset address. */[m
[31m-static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_tai(as, PPCI_STW, r, base, ofs);[m
[31m-  else[m
[31m-    emit_fai(as, irt_isnum(ir->t) ? PPCI_STFD : PPCI_STFS, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Emit a compare (for equality) with a constant operand. */[m
[31m-static void emit_cmpi(ASMState *as, Reg r, int32_t k)[m
[31m-{[m
[31m-  if (checki16(k)) {[m
[31m-    emit_ai(as, PPCI_CMPWI, r, k);[m
[31m-  } else if (checku16(k)) {[m
[31m-    emit_ai(as, PPCI_CMPLWI, r, k);[m
[31m-  } else {[m
[31m-    emit_ai(as, PPCI_CMPLWI, RID_TMP, k);[m
[31m-    emit_asi(as, PPCI_XORIS, RID_TMP, r, (k >> 16));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Add offset to pointer. */[m
[31m-static void emit_addptr(ASMState *as, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs) {[m
[31m-    emit_tai(as, PPCI_ADDI, r, r, ofs);[m
[31m-    if (!checki16(ofs))[m
[31m-      emit_tai(as, PPCI_ADDIS, r, r, (ofs + 32768) >> 16);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void emit_spsub(ASMState *as, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs) {[m
[31m-    emit_tai(as, PPCI_STWU, RID_TMP, RID_SP, -ofs);[m
[31m-    emit_tai(as, PPCI_ADDI, RID_TMP, RID_SP,[m
[31m-	     CFRAME_SIZE + (as->parent ? as->parent->spadjust : 0));[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_x86.h[m
[1mdeleted file mode 100644[m
[1mindex cbaf4e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_emit_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,473 +0,0 @@[m
[31m-/*[m
[31m-** x86/x64 instruction emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* -- Emit basic instructions --------------------------------------------- */[m
[31m-[m
[31m-#define MODRM(mode, r1, r2)	((MCode)((mode)+(((r1)&7)<<3)+((r2)&7)))[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define REXRB(p, rr, rb) \[m
[31m-    { MCode rex = 0x40 + (((rr)>>1)&4) + (((rb)>>3)&1); \[m
[31m-      if (rex != 0x40) *--(p) = rex; }[m
[31m-#define FORCE_REX		0x200[m
[31m-#define REX_64			(FORCE_REX|0x080000)[m
[31m-#define VEX_64			0x800000[m
[31m-#else[m
[31m-#define REXRB(p, rr, rb)	((void)0)[m
[31m-#define FORCE_REX		0[m
[31m-#define REX_64			0[m
[31m-#define VEX_64			0[m
[31m-#endif[m
[31m-[m
[31m-#define emit_i8(as, i)		(*--as->mcp = (MCode)(i))[m
[31m-#define emit_i32(as, i)		(*(int32_t *)(as->mcp-4) = (i), as->mcp -= 4)[m
[31m-#define emit_u32(as, u)		(*(uint32_t *)(as->mcp-4) = (u), as->mcp -= 4)[m
[31m-[m
[31m-#define emit_x87op(as, xo) \[m
[31m-  (*(uint16_t *)(as->mcp-2) = (uint16_t)(xo), as->mcp -= 2)[m
[31m-[m
[31m-/* op */[m
[31m-static LJ_AINLINE MCode *emit_op(x86Op xo, Reg rr, Reg rb, Reg rx,[m
[31m-				 MCode *p, int delta)[m
[31m-{[m
[31m-  int n = (int8_t)xo;[m
[31m-  if (n == -60) {  /* VEX-encoded instruction */[m
[31m-#if LJ_64[m
[31m-    xo ^= (((rr>>1)&4)+((rx>>2)&2)+((rb>>3)&1))<<13;[m
[31m-#endif[m
[31m-    *(uint32_t *)(p+delta-5) = (uint32_t)xo;[m
[31m-    return p+delta-5;[m
[31m-  }[m
[31m-#if defined(__GNUC__)[m
[31m-  if (__builtin_constant_p(xo) && n == -2)[m
[31m-    p[delta-2] = (MCode)(xo >> 24);[m
[31m-  else if (__builtin_constant_p(xo) && n == -3)[m
[31m-    *(uint16_t *)(p+delta-3) = (uint16_t)(xo >> 16);[m
[31m-  else[m
[31m-#endif[m
[31m-    *(uint32_t *)(p+delta-5) = (uint32_t)xo;[m
[31m-  p += n + delta;[m
[31m-#if LJ_64[m
[31m-  {[m
[31m-    uint32_t rex = 0x40 + ((rr>>1)&(4+(FORCE_REX>>1)))+((rx>>2)&2)+((rb>>3)&1);[m
[31m-    if (rex != 0x40) {[m
[31m-      rex |= (rr >> 16);[m
[31m-      if (n == -4) { *p = (MCode)rex; rex = (MCode)(xo >> 8); }[m
[31m-      else if ((xo & 0xffffff) == 0x6600fd) { *p = (MCode)rex; rex = 0x66; }[m
[31m-      *--p = (MCode)rex;[m
[31m-    }[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(rr); UNUSED(rb); UNUSED(rx);[m
[31m-#endif[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* op + modrm */[m
[31m-#define emit_opm(xo, mode, rr, rb, p, delta) \[m
[31m-  (p[(delta)-1] = MODRM((mode), (rr), (rb)), \[m
[31m-   emit_op((xo), (rr), (rb), 0, (p), (delta)))[m
[31m-[m
[31m-/* op + modrm + sib */[m
[31m-#define emit_opmx(xo, mode, scale, rr, rb, rx, p) \[m
[31m-  (p[-1] = MODRM((scale), (rx), (rb)), \[m
[31m-   p[-2] = MODRM((mode), (rr), RID_ESP), \[m
[31m-   emit_op((xo), (rr), (rb), (rx), (p), -1))[m
[31m-[m
[31m-/* op r1, r2 */[m
[31m-static void emit_rr(ASMState *as, x86Op xo, Reg r1, Reg r2)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  as->mcp = emit_opm(xo, XM_REG, r1, r2, p, 0);[m
[31m-}[m
[31m-[m
[31m-#if LJ_64 && defined(LUA_USE_ASSERT)[m
[31m-/* [addr] is sign-extended in x64 and must be in lower 2G (not 4G). */[m
[31m-static int32_t ptr2addr(const void *p)[m
[31m-{[m
[31m-  lua_assert((uintptr_t)p < (uintptr_t)0x80000000);[m
[31m-  return i32ptr(p);[m
[31m-}[m
[31m-#else[m
[31m-#define ptr2addr(p)	(i32ptr((p)))[m
[31m-#endif[m
[31m-[m
[31m-/* op r, [addr] */[m
[31m-static void emit_rma(ASMState *as, x86Op xo, Reg rr, const void *addr)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  *(int32_t *)(p-4) = ptr2addr(addr);[m
[31m-#if LJ_64[m
[31m-  p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP);[m
[31m-  as->mcp = emit_opm(xo, XM_OFS0, rr, RID_ESP, p, -5);[m
[31m-#else[m
[31m-  as->mcp = emit_opm(xo, XM_OFS0, rr, RID_EBP, p, -4);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* op r, [base+ofs] */[m
[31m-static void emit_rmro(ASMState *as, x86Op xo, Reg rr, Reg rb, int32_t ofs)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  x86Mode mode;[m
[31m-  if (ra_hasreg(rb)) {[m
[31m-    if (ofs == 0 && (rb&7) != RID_EBP) {[m
[31m-      mode = XM_OFS0;[m
[31m-    } else if (checki8(ofs)) {[m
[31m-      *--p = (MCode)ofs;[m
[31m-      mode = XM_OFS8;[m
[31m-    } else {[m
[31m-      p -= 4;[m
[31m-      *(int32_t *)p = ofs;[m
[31m-      mode = XM_OFS32;[m
[31m-    }[m
[31m-    if ((rb&7) == RID_ESP)[m
[31m-      *--p = MODRM(XM_SCALE1, RID_ESP, RID_ESP);[m
[31m-  } else {[m
[31m-    *(int32_t *)(p-4) = ofs;[m
[31m-#if LJ_64[m
[31m-    p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP);[m
[31m-    p -= 5;[m
[31m-    rb = RID_ESP;[m
[31m-#else[m
[31m-    p -= 4;[m
[31m-    rb = RID_EBP;[m
[31m-#endif[m
[31m-    mode = XM_OFS0;[m
[31m-  }[m
[31m-  as->mcp = emit_opm(xo, mode, rr, rb, p, 0);[m
[31m-}[m
[31m-[m
[31m-/* op r, [base+idx*scale+ofs] */[m
[31m-static void emit_rmrxo(ASMState *as, x86Op xo, Reg rr, Reg rb, Reg rx,[m
[31m-		       x86Mode scale, int32_t ofs)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  x86Mode mode;[m
[31m-  if (ofs == 0 && (rb&7) != RID_EBP) {[m
[31m-    mode = XM_OFS0;[m
[31m-  } else if (checki8(ofs)) {[m
[31m-    mode = XM_OFS8;[m
[31m-    *--p = (MCode)ofs;[m
[31m-  } else {[m
[31m-    mode = XM_OFS32;[m
[31m-    p -= 4;[m
[31m-    *(int32_t *)p = ofs;[m
[31m-  }[m
[31m-  as->mcp = emit_opmx(xo, mode, scale, rr, rb, rx, p);[m
[31m-}[m
[31m-[m
[31m-/* op r, i */[m
[31m-static void emit_gri(ASMState *as, x86Group xg, Reg rb, int32_t i)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  x86Op xo;[m
[31m-  if (checki8(i)) {[m
[31m-    *--p = (MCode)i;[m
[31m-    xo = XG_TOXOi8(xg);[m
[31m-  } else {[m
[31m-    p -= 4;[m
[31m-    *(int32_t *)p = i;[m
[31m-    xo = XG_TOXOi(xg);[m
[31m-  }[m
[31m-  as->mcp = emit_opm(xo, XM_REG, (Reg)(xg & 7) | (rb & REX_64), rb, p, 0);[m
[31m-}[m
[31m-[m
[31m-/* op [base+ofs], i */[m
[31m-static void emit_gmroi(ASMState *as, x86Group xg, Reg rb, int32_t ofs,[m
[31m-		       int32_t i)[m
[31m-{[m
[31m-  x86Op xo;[m
[31m-  if (checki8(i)) {[m
[31m-    emit_i8(as, i);[m
[31m-    xo = XG_TOXOi8(xg);[m
[31m-  } else {[m
[31m-    emit_i32(as, i);[m
[31m-    xo = XG_TOXOi(xg);[m
[31m-  }[m
[31m-  emit_rmro(as, xo, (Reg)(xg & 7), rb, ofs);[m
[31m-}[m
[31m-[m
[31m-#define emit_shifti(as, xg, r, i) \[m
[31m-  (emit_i8(as, (i)), emit_rr(as, XO_SHIFTi, (Reg)(xg), (r)))[m
[31m-[m
[31m-/* op r, rm/mrm */[m
[31m-static void emit_mrm(ASMState *as, x86Op xo, Reg rr, Reg rb)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  x86Mode mode = XM_REG;[m
[31m-  if (rb == RID_MRM) {[m
[31m-    rb = as->mrm.base;[m
[31m-    if (rb == RID_NONE) {[m
[31m-      rb = RID_EBP;[m
[31m-      mode = XM_OFS0;[m
[31m-      p -= 4;[m
[31m-      *(int32_t *)p = as->mrm.ofs;[m
[31m-      if (as->mrm.idx != RID_NONE)[m
[31m-	goto mrmidx;[m
[31m-#if LJ_64[m
[31m-      *--p = MODRM(XM_SCALE1, RID_ESP, RID_EBP);[m
[31m-      rb = RID_ESP;[m
[31m-#endif[m
[31m-    } else {[m
[31m-      if (as->mrm.ofs == 0 && (rb&7) != RID_EBP) {[m
[31m-	mode = XM_OFS0;[m
[31m-      } else if (checki8(as->mrm.ofs)) {[m
[31m-	*--p = (MCode)as->mrm.ofs;[m
[31m-	mode = XM_OFS8;[m
[31m-      } else {[m
[31m-	p -= 4;[m
[31m-	*(int32_t *)p = as->mrm.ofs;[m
[31m-	mode = XM_OFS32;[m
[31m-      }[m
[31m-      if (as->mrm.idx != RID_NONE) {[m
[31m-      mrmidx:[m
[31m-	as->mcp = emit_opmx(xo, mode, as->mrm.scale, rr, rb, as->mrm.idx, p);[m
[31m-	return;[m
[31m-      }[m
[31m-      if ((rb&7) == RID_ESP)[m
[31m-	*--p = MODRM(XM_SCALE1, RID_ESP, RID_ESP);[m
[31m-    }[m
[31m-  }[m
[31m-  as->mcp = emit_opm(xo, mode, rr, rb, p, 0);[m
[31m-}[m
[31m-[m
[31m-/* op rm/mrm, i */[m
[31m-static void emit_gmrmi(ASMState *as, x86Group xg, Reg rb, int32_t i)[m
[31m-{[m
[31m-  x86Op xo;[m
[31m-  if (checki8(i)) {[m
[31m-    emit_i8(as, i);[m
[31m-    xo = XG_TOXOi8(xg);[m
[31m-  } else {[m
[31m-    emit_i32(as, i);[m
[31m-    xo = XG_TOXOi(xg);[m
[31m-  }[m
[31m-  emit_mrm(as, xo, (Reg)(xg & 7) | (rb & REX_64), (rb & ~REX_64));[m
[31m-}[m
[31m-[m
[31m-/* -- Emit loads/stores --------------------------------------------------- */[m
[31m-[m
[31m-/* mov [base+ofs], i */[m
[31m-static void emit_movmroi(ASMState *as, Reg base, int32_t ofs, int32_t i)[m
[31m-{[m
[31m-  emit_i32(as, i);[m
[31m-  emit_rmro(as, XO_MOVmi, 0, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* mov [base+ofs], r */[m
[31m-#define emit_movtomro(as, r, base, ofs) \[m
[31m-  emit_rmro(as, XO_MOVto, (r), (base), (ofs))[m
[31m-[m
[31m-/* Get/set global_State fields. */[m
[31m-#define emit_opgl(as, xo, r, field) \[m
[31m-  emit_rma(as, (xo), (r), (void *)&J2G(as->J)->field)[m
[31m-#define emit_getgl(as, r, field)	emit_opgl(as, XO_MOV, (r), field)[m
[31m-#define emit_setgl(as, r, field)	emit_opgl(as, XO_MOVto, (r), field)[m
[31m-[m
[31m-#define emit_setvmstate(as, i) \[m
[31m-  (emit_i32(as, i), emit_opgl(as, XO_MOVmi, 0, vmstate))[m
[31m-[m
[31m-/* mov r, i / xor r, r */[m
[31m-static void emit_loadi(ASMState *as, Reg r, int32_t i)[m
[31m-{[m
[31m-  /* XOR r,r is shorter, but modifies the flags. This is bad for HIOP. */[m
[31m-  if (i == 0 && !(LJ_32 && (IR(as->curins)->o == IR_HIOP ||[m
[31m-			    (as->curins+1 < as->T->nins &&[m
[31m-			     IR(as->curins+1)->o == IR_HIOP)))) {[m
[31m-    emit_rr(as, XO_ARITH(XOg_XOR), r, r);[m
[31m-  } else {[m
[31m-    MCode *p = as->mcp;[m
[31m-    *(int32_t *)(p-4) = i;[m
[31m-    p[-5] = (MCode)(XI_MOVri+(r&7));[m
[31m-    p -= 5;[m
[31m-    REXRB(p, 0, r);[m
[31m-    as->mcp = p;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* mov r, addr */[m
[31m-#define emit_loada(as, r, addr) \[m
[31m-  emit_loadi(as, (r), ptr2addr((addr)))[m
[31m-[m
[31m-#if LJ_64[m
[31m-/* mov r, imm64 or shorter 32 bit extended load. */[m
[31m-static void emit_loadu64(ASMState *as, Reg r, uint64_t u64)[m
[31m-{[m
[31m-  if (checku32(u64)) {  /* 32 bit load clears upper 32 bits. */[m
[31m-    emit_loadi(as, r, (int32_t)u64);[m
[31m-  } else if (checki32((int64_t)u64)) {  /* Sign-extended 32 bit load. */[m
[31m-    MCode *p = as->mcp;[m
[31m-    *(int32_t *)(p-4) = (int32_t)u64;[m
[31m-    as->mcp = emit_opm(XO_MOVmi, XM_REG, REX_64, r, p, -4);[m
[31m-  } else {  /* Full-size 64 bit load. */[m
[31m-    MCode *p = as->mcp;[m
[31m-    *(uint64_t *)(p-8) = u64;[m
[31m-    p[-9] = (MCode)(XI_MOVri+(r&7));[m
[31m-    p[-10] = 0x48 + ((r>>3)&1);[m
[31m-    p -= 10;[m
[31m-    as->mcp = p;[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* movsd r, [&tv->n] / xorps r, r */[m
[31m-static void emit_loadn(ASMState *as, Reg r, cTValue *tv)[m
[31m-{[m
[31m-  if (tvispzero(tv))  /* Use xor only for +0. */[m
[31m-    emit_rr(as, XO_XORPS, r, r);[m
[31m-  else[m
[31m-    emit_rma(as, XO_MOVSD, r, &tv->n);[m
[31m-}[m
[31m-[m
[31m-/* -- Emit control-flow instructions -------------------------------------- */[m
[31m-[m
[31m-/* Label for short jumps. */[m
[31m-typedef MCode *MCLabel;[m
[31m-[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-/* jmp short target */[m
[31m-static void emit_sjmp(ASMState *as, MCLabel target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  ptrdiff_t delta = target - p;[m
[31m-  lua_assert(delta == (int8_t)delta);[m
[31m-  p[-1] = (MCode)(int8_t)delta;[m
[31m-  p[-2] = XI_JMPs;[m
[31m-  as->mcp = p - 2;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* jcc short target */[m
[31m-static void emit_sjcc(ASMState *as, int cc, MCLabel target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  ptrdiff_t delta = target - p;[m
[31m-  lua_assert(delta == (int8_t)delta);[m
[31m-  p[-1] = (MCode)(int8_t)delta;[m
[31m-  p[-2] = (MCode)(XI_JCCs+(cc&15));[m
[31m-  as->mcp = p - 2;[m
[31m-}[m
[31m-[m
[31m-/* jcc short (pending target) */[m
[31m-static MCLabel emit_sjcc_label(ASMState *as, int cc)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  p[-1] = 0;[m
[31m-  p[-2] = (MCode)(XI_JCCs+(cc&15));[m
[31m-  as->mcp = p - 2;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Fixup jcc short target. */[m
[31m-static void emit_sfixup(ASMState *as, MCLabel source)[m
[31m-{[m
[31m-  source[-1] = (MCode)(as->mcp-source);[m
[31m-}[m
[31m-[m
[31m-/* Return label pointing to current PC. */[m
[31m-#define emit_label(as)		((as)->mcp)[m
[31m-[m
[31m-/* Compute relative 32 bit offset for jump and call instructions. */[m
[31m-static LJ_AINLINE int32_t jmprel(MCode *p, MCode *target)[m
[31m-{[m
[31m-  ptrdiff_t delta = target - p;[m
[31m-  lua_assert(delta == (int32_t)delta);[m
[31m-  return (int32_t)delta;[m
[31m-}[m
[31m-[m
[31m-/* jcc target */[m
[31m-static void emit_jcc(ASMState *as, int cc, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  *(int32_t *)(p-4) = jmprel(p, target);[m
[31m-  p[-5] = (MCode)(XI_JCCn+(cc&15));[m
[31m-  p[-6] = 0x0f;[m
[31m-  as->mcp = p - 6;[m
[31m-}[m
[31m-[m
[31m-/* jmp target */[m
[31m-static void emit_jmp(ASMState *as, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-  *(int32_t *)(p-4) = jmprel(p, target);[m
[31m-  p[-5] = XI_JMP;[m
[31m-  as->mcp = p - 5;[m
[31m-}[m
[31m-[m
[31m-/* call target */[m
[31m-static void emit_call_(ASMState *as, MCode *target)[m
[31m-{[m
[31m-  MCode *p = as->mcp;[m
[31m-#if LJ_64[m
[31m-  if (target-p != (int32_t)(target-p)) {[m
[31m-    /* Assumes RID_RET is never an argument to calls and always clobbered. */[m
[31m-    emit_rr(as, XO_GROUP5, XOg_CALL, RID_RET);[m
[31m-    emit_loadu64(as, RID_RET, (uint64_t)target);[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  *(int32_t *)(p-4) = jmprel(p, target);[m
[31m-  p[-5] = XI_CALL;[m
[31m-  as->mcp = p - 5;[m
[31m-}[m
[31m-[m
[31m-#define emit_call(as, f)	emit_call_(as, (MCode *)(void *)(f))[m
[31m-[m
[31m-/* -- Emit generic operations --------------------------------------------- */[m
[31m-[m
[31m-/* Use 64 bit operations to handle 64 bit IR types. */[m
[31m-#if LJ_64[m
[31m-#define REX_64IR(ir, r)		((r) + (irt_is64((ir)->t) ? REX_64 : 0))[m
[31m-#define VEX_64IR(ir, r)		((r) + (irt_is64((ir)->t) ? VEX_64 : 0))[m
[31m-#else[m
[31m-#define REX_64IR(ir, r)		(r)[m
[31m-#define VEX_64IR(ir, r)		(r)[m
[31m-#endif[m
[31m-[m
[31m-/* Generic move between two regs. */[m
[31m-static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)[m
[31m-{[m
[31m-  UNUSED(ir);[m
[31m-  if (dst < RID_MAX_GPR)[m
[31m-    emit_rr(as, XO_MOV, REX_64IR(ir, dst), src);[m
[31m-  else[m
[31m-    emit_rr(as, XO_MOVAPS, dst, src);[m
[31m-}[m
[31m-[m
[31m-/* Generic load of register with base and (small) offset address. */[m
[31m-static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_rmro(as, XO_MOV, REX_64IR(ir, r), base, ofs);[m
[31m-  else[m
[31m-    emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSD : XO_MOVSS, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Generic store of register with base and (small) offset address. */[m
[31m-static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)[m
[31m-{[m
[31m-  if (r < RID_MAX_GPR)[m
[31m-    emit_rmro(as, XO_MOVto, REX_64IR(ir, r), base, ofs);[m
[31m-  else[m
[31m-    emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSDto : XO_MOVSSto, r, base, ofs);[m
[31m-}[m
[31m-[m
[31m-/* Add offset to pointer. */[m
[31m-static void emit_addptr(ASMState *as, Reg r, int32_t ofs)[m
[31m-{[m
[31m-  if (ofs) {[m
[31m-    if ((as->flags & JIT_F_LEA_AGU))[m
[31m-      emit_rmro(as, XO_LEA, r, r, ofs);[m
[31m-    else[m
[31m-      emit_gri(as, XG_ARITHi(XOg_ADD), r, ofs);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define emit_spsub(as, ofs)	emit_addptr(as, RID_ESP|REX_64, -(ofs))[m
[31m-[m
[31m-/* Prefer rematerialization of BASE/L from global_State over spills. */[m
[31m-#define emit_canremat(ref)	((ref) <= REF_BASE)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_err.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_err.c[m
[1mdeleted file mode 100644[m
[1mindex 36f96a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_err.c[m
[1m+++ /dev/null[m
[36m@@ -1,832 +0,0 @@[m
[31m-/*[m
[31m-** Error handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_err_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/*[m
[31m-** LuaJIT can either use internal or external frame unwinding:[m
[31m-**[m
[31m-** - Internal frame unwinding (INT) is free-standing and doesn't require[m
[31m-**   any OS or library support.[m
[31m-**[m
[31m-** - External frame unwinding (EXT) uses the system-provided unwind handler.[m
[31m-**[m
[31m-** Pros and Cons:[m
[31m-**[m
[31m-** - EXT requires unwind tables for *all* functions on the C stack between[m
[31m-**   the pcall/catch and the error/throw. This is the default on x64,[m
[31m-**   but needs to be manually enabled on x86/PPC for non-C++ code.[m
[31m-**[m
[31m-** - INT is faster when actually throwing errors (but this happens rarely).[m
[31m-**   Setting up error handlers is zero-cost in any case.[m
[31m-**[m
[31m-** - EXT provides full interoperability with C++ exceptions. You can throw[m
[31m-**   Lua errors or C++ exceptions through a mix of Lua frames and C++ frames.[m
[31m-**   C++ destructors are called as needed. C++ exceptions caught by pcall[m
[31m-**   are converted to the string "C++ exception". Lua errors can be caught[m
[31m-**   with catch (...) in C++.[m
[31m-**[m
[31m-** - INT has only limited support for automatically catching C++ exceptions[m
[31m-**   on POSIX systems using DWARF2 stack unwinding. Other systems may use[m
[31m-**   the wrapper function feature. Lua errors thrown through C++ frames[m
[31m-**   cannot be caught by C++ code and C++ destructors are not run.[m
[31m-**[m
[31m-** EXT is the default on x64 systems, INT is the default on all other systems.[m
[31m-**[m
[31m-** EXT can be manually enabled on POSIX systems using GCC and DWARF2 stack[m
[31m-** unwinding with -DLUAJIT_UNWIND_EXTERNAL. *All* C code must be compiled[m
[31m-** with -funwind-tables (or -fexceptions). This includes LuaJIT itself (set[m
[31m-** TARGET_CFLAGS), all of your C/Lua binding code, all loadable C modules[m
[31m-** and all C libraries that have callbacks which may be used to call back[m
[31m-** into Lua. C++ code must *not* be compiled with -fno-exceptions.[m
[31m-**[m
[31m-** EXT cannot be enabled on WIN32 since system exceptions use code-driven SEH.[m
[31m-** EXT is mandatory on WIN64 since the calling convention has an abundance[m
[31m-** of callee-saved registers (rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15).[m
[31m-** The POSIX/x64 interpreter only saves r12/r13 for INT (e.g. PS4).[m
[31m-*/[m
[31m-[m
[31m-#if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND[m
[31m-#define LJ_UNWIND_EXT	1[m
[31m-#elif LJ_TARGET_X64 && LJ_TARGET_WINDOWS[m
[31m-#define LJ_UNWIND_EXT	1[m
[31m-#endif[m
[31m-[m
[31m-/* -- Error messages ------------------------------------------------------ */[m
[31m-[m
[31m-/* Error message strings. */[m
[31m-LJ_DATADEF const char *lj_err_allmsg =[m
[31m-#define ERRDEF(name, msg)	msg "\0"[m
[31m-#include "lj_errmsg.h"[m
[31m-;[m
[31m-[m
[31m-/* -- Internal frame unwinding -------------------------------------------- */[m
[31m-[m
[31m-/* Unwind Lua stack and move error message to new top. */[m
[31m-LJ_NOINLINE static void unwindstack(lua_State *L, TValue *top)[m
[31m-{[m
[31m-  lj_func_closeuv(L, top);[m
[31m-  if (top < L->top-1) {[m
[31m-    copyTV(L, top, L->top-1);[m
[31m-    L->top = top+1;[m
[31m-  }[m
[31m-  lj_state_relimitstack(L);[m
[31m-}[m
[31m-[m
[31m-/* Unwind until stop frame. Optionally cleanup frames. */[m
[31m-static void *err_unwind(lua_State *L, void *stopcf, int errcode)[m
[31m-{[m
[31m-  TValue *frame = L->base-1;[m
[31m-  void *cf = L->cframe;[m
[31m-  while (cf) {[m
[31m-    int32_t nres = cframe_nres(cframe_raw(cf));[m
[31m-    if (nres < 0) {  /* C frame without Lua frame? */[m
[31m-      TValue *top = restorestack(L, -nres);[m
[31m-      if (frame < top) {  /* Frame reached? */[m
[31m-	if (errcode) {[m
[31m-	  L->base = frame+1;[m
[31m-	  L->cframe = cframe_prev(cf);[m
[31m-	  unwindstack(L, top);[m
[31m-	}[m
[31m-	return cf;[m
[31m-      }[m
[31m-    }[m
[31m-    if (frame <= tvref(L->stack)+LJ_FR2)[m
[31m-      break;[m
[31m-    switch (frame_typep(frame)) {[m
[31m-    case FRAME_LUA:  /* Lua frame. */[m
[31m-    case FRAME_LUAP:[m
[31m-      frame = frame_prevl(frame);[m
[31m-      break;[m
[31m-    case FRAME_C:  /* C frame. */[m
[31m-    unwind_c:[m
[31m-#if LJ_UNWIND_EXT[m
[31m-      if (errcode) {[m
[31m-	L->base = frame_prevd(frame) + 1;[m
[31m-	L->cframe = cframe_prev(cf);[m
[31m-	unwindstack(L, frame - LJ_FR2);[m
[31m-      } else if (cf != stopcf) {[m
[31m-	cf = cframe_prev(cf);[m
[31m-	frame = frame_prevd(frame);[m
[31m-	break;[m
[31m-      }[m
[31m-      return NULL;  /* Continue unwinding. */[m
[31m-#else[m
[31m-      UNUSED(stopcf);[m
[31m-      cf = cframe_prev(cf);[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-#endif[m
[31m-    case FRAME_CP:  /* Protected C frame. */[m
[31m-      if (cframe_canyield(cf)) {  /* Resume? */[m
[31m-	if (errcode) {[m
[31m-	  hook_leave(G(L));  /* Assumes nobody uses coroutines inside hooks. */[m
[31m-	  L->cframe = NULL;[m
[31m-	  L->status = (uint8_t)errcode;[m
[31m-	}[m
[31m-	return cf;[m
[31m-      }[m
[31m-      if (errcode) {[m
[31m-	L->base = frame_prevd(frame) + 1;[m
[31m-	L->cframe = cframe_prev(cf);[m
[31m-	unwindstack(L, frame - LJ_FR2);[m
[31m-      }[m
[31m-      return cf;[m
[31m-    case FRAME_CONT:  /* Continuation frame. */[m
[31m-      if (frame_iscont_fficb(frame))[m
[31m-	goto unwind_c;[m
[31m-    case FRAME_VARG:  /* Vararg frame. */[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-    case FRAME_PCALL:  /* FF pcall() frame. */[m
[31m-    case FRAME_PCALLH:  /* FF pcall() frame inside hook. */[m
[31m-      if (errcode) {[m
[31m-	if (errcode == LUA_YIELD) {[m
[31m-	  frame = frame_prevd(frame);[m
[31m-	  break;[m
[31m-	}[m
[31m-	if (frame_typep(frame) == FRAME_PCALL)[m
[31m-	  hook_leave(G(L));[m
[31m-	L->base = frame_prevd(frame) + 1;[m
[31m-	L->cframe = cf;[m
[31m-	unwindstack(L, L->base);[m
[31m-      }[m
[31m-      return (void *)((intptr_t)cf | CFRAME_UNWIND_FF);[m
[31m-    }[m
[31m-  }[m
[31m-  /* No C frame. */[m
[31m-  if (errcode) {[m
[31m-    L->base = tvref(L->stack)+1+LJ_FR2;[m
[31m-    L->cframe = NULL;[m
[31m-    unwindstack(L, L->base);[m
[31m-    if (G(L)->panic)[m
[31m-      G(L)->panic(L);[m
[31m-    exit(EXIT_FAILURE);[m
[31m-  }[m
[31m-  return L;  /* Anything non-NULL will do. */[m
[31m-}[m
[31m-[m
[31m-/* -- External frame unwinding -------------------------------------------- */[m
[31m-[m
[31m-#if defined(__GNUC__) && !LJ_NO_UNWIND && !LJ_ABI_WIN[m
[31m-[m
[31m-/*[m
[31m-** We have to use our own definitions instead of the mandatory (!) unwind.h,[m
[31m-** since various OS, distros and compilers mess up the header installation.[m
[31m-*/[m
[31m-[m
[31m-typedef struct _Unwind_Context _Unwind_Context;[m
[31m-[m
[31m-#define _URC_OK			0[m
[31m-#define _URC_FATAL_PHASE1_ERROR	3[m
[31m-#define _URC_HANDLER_FOUND	6[m
[31m-#define _URC_INSTALL_CONTEXT	7[m
[31m-#define _URC_CONTINUE_UNWIND	8[m
[31m-#define _URC_FAILURE		9[m
[31m-[m
[31m-#define LJ_UEXCLASS		0x4c55414a49543200ULL	/* LUAJIT2\0 */[m
[31m-#define LJ_UEXCLASS_MAKE(c)	(LJ_UEXCLASS | (uint64_t)(c))[m
[31m-#define LJ_UEXCLASS_CHECK(cl)	(((cl) ^ LJ_UEXCLASS) <= 0xff)[m
[31m-#define LJ_UEXCLASS_ERRCODE(cl)	((int)((cl) & 0xff))[m
[31m-[m
[31m-#if !LJ_TARGET_ARM[m
[31m-[m
[31m-typedef struct _Unwind_Exception[m
[31m-{[m
[31m-  uint64_t exclass;[m
[31m-  void (*excleanup)(int, struct _Unwind_Exception *);[m
[31m-  uintptr_t p1, p2;[m
[31m-} __attribute__((__aligned__)) _Unwind_Exception;[m
[31m-[m
[31m-extern uintptr_t _Unwind_GetCFA(_Unwind_Context *);[m
[31m-extern void _Unwind_SetGR(_Unwind_Context *, int, uintptr_t);[m
[31m-extern void _Unwind_SetIP(_Unwind_Context *, uintptr_t);[m
[31m-extern void _Unwind_DeleteException(_Unwind_Exception *);[m
[31m-extern int _Unwind_RaiseException(_Unwind_Exception *);[m
[31m-[m
[31m-#define _UA_SEARCH_PHASE	1[m
[31m-#define _UA_CLEANUP_PHASE	2[m
[31m-#define _UA_HANDLER_FRAME	4[m
[31m-#define _UA_FORCE_UNWIND	8[m
[31m-[m
[31m-/* DWARF2 personality handler referenced from interpreter .eh_frame. */[m
[31m-LJ_FUNCA int lj_err_unwind_dwarf(int version, int actions,[m
[31m-  uint64_t uexclass, _Unwind_Exception *uex, _Unwind_Context *ctx)[m
[31m-{[m
[31m-  void *cf;[m
[31m-  lua_State *L;[m
[31m-  if (version != 1)[m
[31m-    return _URC_FATAL_PHASE1_ERROR;[m
[31m-  UNUSED(uexclass);[m
[31m-  cf = (void *)_Unwind_GetCFA(ctx);[m
[31m-  L = cframe_L(cf);[m
[31m-  if ((actions & _UA_SEARCH_PHASE)) {[m
[31m-#if LJ_UNWIND_EXT[m
[31m-    if (err_unwind(L, cf, 0) == NULL)[m
[31m-      return _URC_CONTINUE_UNWIND;[m
[31m-#endif[m
[31m-    if (!LJ_UEXCLASS_CHECK(uexclass)) {[m
[31m-      setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));[m
[31m-    }[m
[31m-    return _URC_HANDLER_FOUND;[m
[31m-  }[m
[31m-  if ((actions & _UA_CLEANUP_PHASE)) {[m
[31m-    int errcode;[m
[31m-    if (LJ_UEXCLASS_CHECK(uexclass)) {[m
[31m-      errcode = LJ_UEXCLASS_ERRCODE(uexclass);[m
[31m-    } else {[m
[31m-      if ((actions & _UA_HANDLER_FRAME))[m
[31m-	_Unwind_DeleteException(uex);[m
[31m-      errcode = LUA_ERRRUN;[m
[31m-    }[m
[31m-#if LJ_UNWIND_EXT[m
[31m-    cf = err_unwind(L, cf, errcode);[m
[31m-    if ((actions & _UA_FORCE_UNWIND)) {[m
[31m-      return _URC_CONTINUE_UNWIND;[m
[31m-    } else if (cf) {[m
[31m-      _Unwind_SetGR(ctx, LJ_TARGET_EHRETREG, errcode);[m
[31m-      _Unwind_SetIP(ctx, (uintptr_t)(cframe_unwind_ff(cf) ?[m
[31m-				     lj_vm_unwind_ff_eh :[m
[31m-				     lj_vm_unwind_c_eh));[m
[31m-      return _URC_INSTALL_CONTEXT;[m
[31m-    }[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    else if ((actions & _UA_HANDLER_FRAME)) {[m
[31m-      /* Workaround for ancient libgcc bug. Still present in RHEL 5.5. :-/[m
[31m-      ** Real fix: http://gcc.gnu.org/viewcvs/trunk/gcc/unwind-dw2.c?r1=121165&r2=124837&pathrev=153877&diff_format=h[m
[31m-      */[m
[31m-      _Unwind_SetGR(ctx, LJ_TARGET_EHRETREG, errcode);[m
[31m-      _Unwind_SetIP(ctx, (uintptr_t)lj_vm_unwind_rethrow);[m
[31m-      return _URC_INSTALL_CONTEXT;[m
[31m-    }[m
[31m-#endif[m
[31m-#else[m
[31m-    /* This is not the proper way to escape from the unwinder. We get away with[m
[31m-    ** it on non-x64 because the interpreter restores all callee-saved regs.[m
[31m-    */[m
[31m-    lj_err_throw(L, errcode);[m
[31m-#endif[m
[31m-  }[m
[31m-  return _URC_CONTINUE_UNWIND;[m
[31m-}[m
[31m-[m
[31m-#if LJ_UNWIND_EXT[m
[31m-#if LJ_TARGET_OSX || defined(__OpenBSD__)[m
[31m-/* Sorry, no thread safety for OSX. Complain to Apple, not me. */[m
[31m-static _Unwind_Exception static_uex;[m
[31m-#else[m
[31m-static __thread _Unwind_Exception static_uex;[m
[31m-#endif[m
[31m-[m
[31m-/* Raise DWARF2 exception. */[m
[31m-static void err_raise_ext(int errcode)[m
[31m-{[m
[31m-  static_uex.exclass = LJ_UEXCLASS_MAKE(errcode);[m
[31m-  static_uex.excleanup = NULL;[m
[31m-  _Unwind_RaiseException(&static_uex);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#else /* LJ_TARGET_ARM */[m
[31m-[m
[31m-#define _US_VIRTUAL_UNWIND_FRAME	0[m
[31m-#define _US_UNWIND_FRAME_STARTING	1[m
[31m-#define _US_ACTION_MASK			3[m
[31m-#define _US_FORCE_UNWIND		8[m
[31m-[m
[31m-typedef struct _Unwind_Control_Block _Unwind_Control_Block;[m
[31m-[m
[31m-struct _Unwind_Control_Block {[m
[31m-  uint64_t exclass;[m
[31m-  uint32_t misc[20];[m
[31m-};[m
[31m-[m
[31m-extern int _Unwind_RaiseException(_Unwind_Control_Block *);[m
[31m-extern int __gnu_unwind_frame(_Unwind_Control_Block *, _Unwind_Context *);[m
[31m-extern int _Unwind_VRS_Set(_Unwind_Context *, int, uint32_t, int, void *);[m
[31m-extern int _Unwind_VRS_Get(_Unwind_Context *, int, uint32_t, int, void *);[m
[31m-[m
[31m-static inline uint32_t _Unwind_GetGR(_Unwind_Context *ctx, int r)[m
[31m-{[m
[31m-  uint32_t v;[m
[31m-  _Unwind_VRS_Get(ctx, 0, r, 0, &v);[m
[31m-  return v;[m
[31m-}[m
[31m-[m
[31m-static inline void _Unwind_SetGR(_Unwind_Context *ctx, int r, uint32_t v)[m
[31m-{[m
[31m-  _Unwind_VRS_Set(ctx, 0, r, 0, &v);[m
[31m-}[m
[31m-[m
[31m-extern void lj_vm_unwind_ext(void);[m
[31m-[m
[31m-/* ARM unwinder personality handler referenced from interpreter .ARM.extab. */[m
[31m-LJ_FUNCA int lj_err_unwind_arm(int state, _Unwind_Control_Block *ucb,[m
[31m-			       _Unwind_Context *ctx)[m
[31m-{[m
[31m-  void *cf = (void *)_Unwind_GetGR(ctx, 13);[m
[31m-  lua_State *L = cframe_L(cf);[m
[31m-  int errcode;[m
[31m-[m
[31m-  switch ((state & _US_ACTION_MASK)) {[m
[31m-  case _US_VIRTUAL_UNWIND_FRAME:[m
[31m-    if ((state & _US_FORCE_UNWIND)) break;[m
[31m-    return _URC_HANDLER_FOUND;[m
[31m-  case _US_UNWIND_FRAME_STARTING:[m
[31m-    if (LJ_UEXCLASS_CHECK(ucb->exclass)) {[m
[31m-      errcode = LJ_UEXCLASS_ERRCODE(ucb->exclass);[m
[31m-    } else {[m
[31m-      errcode = LUA_ERRRUN;[m
[31m-      setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));[m
[31m-    }[m
[31m-    cf = err_unwind(L, cf, errcode);[m
[31m-    if ((state & _US_FORCE_UNWIND) || cf == NULL) break;[m
[31m-    _Unwind_SetGR(ctx, 15, (uint32_t)lj_vm_unwind_ext);[m
[31m-    _Unwind_SetGR(ctx, 0, (uint32_t)ucb);[m
[31m-    _Unwind_SetGR(ctx, 1, (uint32_t)errcode);[m
[31m-    _Unwind_SetGR(ctx, 2, cframe_unwind_ff(cf) ?[m
[31m-			    (uint32_t)lj_vm_unwind_ff_eh :[m
[31m-			    (uint32_t)lj_vm_unwind_c_eh);[m
[31m-    return _URC_INSTALL_CONTEXT;[m
[31m-  default:[m
[31m-    return _URC_FAILURE;[m
[31m-  }[m
[31m-  if (__gnu_unwind_frame(ucb, ctx) != _URC_OK)[m
[31m-    return _URC_FAILURE;[m
[31m-  return _URC_CONTINUE_UNWIND;[m
[31m-}[m
[31m-[m
[31m-#if LJ_UNWIND_EXT[m
[31m-static __thread _Unwind_Control_Block static_uex;[m
[31m-[m
[31m-static void err_raise_ext(int errcode)[m
[31m-{[m
[31m-  memset(&static_uex, 0, sizeof(static_uex));[m
[31m-  static_uex.exclass = LJ_UEXCLASS_MAKE(errcode);[m
[31m-  _Unwind_RaiseException(&static_uex);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif /* LJ_TARGET_ARM */[m
[31m-[m
[31m-#elif LJ_TARGET_X64 && LJ_ABI_WIN[m
[31m-[m
[31m-/*[m
[31m-** Someone in Redmond owes me several days of my life. A lot of this is[m
[31m-** undocumented or just plain wrong on MSDN. Some of it can be gathered[m
[31m-** from 3rd party docs or must be found by trial-and-error. They really[m
[31m-** don't want you to write your own language-specific exception handler[m
[31m-** or to interact gracefully with MSVC. :-([m
[31m-**[m
[31m-** Apparently MSVC doesn't call C++ destructors for foreign exceptions[m
[31m-** unless you compile your C++ code with /EHa. Unfortunately this means[m
[31m-** catch (...) also catches things like access violations. The use of[m
[31m-** _set_se_translator doesn't really help, because it requires /EHa, too.[m
[31m-*/[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-/* Taken from: http://www.nynaeve.net/?p=99 */[m
[31m-typedef struct UndocumentedDispatcherContext {[m
[31m-  ULONG64 ControlPc;[m
[31m-  ULONG64 ImageBase;[m
[31m-  PRUNTIME_FUNCTION FunctionEntry;[m
[31m-  ULONG64 EstablisherFrame;[m
[31m-  ULONG64 TargetIp;[m
[31m-  PCONTEXT ContextRecord;[m
[31m-  void (*LanguageHandler)(void);[m
[31m-  PVOID HandlerData;[m
[31m-  PUNWIND_HISTORY_TABLE HistoryTable;[m
[31m-  ULONG ScopeIndex;[m
[31m-  ULONG Fill0;[m
[31m-} UndocumentedDispatcherContext;[m
[31m-[m
[31m-/* Another wild guess. */[m
[31m-extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);[m
[31m-[m
[31m-#ifdef MINGW_SDK_INIT[m
[31m-/* Workaround for broken MinGW64 declaration. */[m
[31m-VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");[m
[31m-#define RtlUnwindEx RtlUnwindEx_FIXED[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_MSVC_EXCODE		((DWORD)0xe06d7363)[m
[31m-#define LJ_GCC_EXCODE		((DWORD)0x20474343)[m
[31m-[m
[31m-#define LJ_EXCODE		((DWORD)0xe24c4a00)[m
[31m-#define LJ_EXCODE_MAKE(c)	(LJ_EXCODE | (DWORD)(c))[m
[31m-#define LJ_EXCODE_CHECK(cl)	(((cl) ^ LJ_EXCODE) <= 0xff)[m
[31m-#define LJ_EXCODE_ERRCODE(cl)	((int)((cl) & 0xff))[m
[31m-[m
[31m-/* Win64 exception handler for interpreter frame. */[m
[31m-LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,[m
[31m-  void *cf, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)[m
[31m-{[m
[31m-  lua_State *L = cframe_L(cf);[m
[31m-  int errcode = LJ_EXCODE_CHECK(rec->ExceptionCode) ?[m
[31m-		LJ_EXCODE_ERRCODE(rec->ExceptionCode) : LUA_ERRRUN;[m
[31m-  if ((rec->ExceptionFlags & 6)) {  /* EH_UNWINDING|EH_EXIT_UNWIND */[m
[31m-    /* Unwind internal frames. */[m
[31m-    err_unwind(L, cf, errcode);[m
[31m-  } else {[m
[31m-    void *cf2 = err_unwind(L, cf, 0);[m
[31m-    if (cf2) {  /* We catch it, so start unwinding the upper frames. */[m
[31m-      if (rec->ExceptionCode == LJ_MSVC_EXCODE ||[m
[31m-	  rec->ExceptionCode == LJ_GCC_EXCODE) {[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-	__DestructExceptionObject(rec, 1);[m
[31m-#endif[m
[31m-	setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));[m
[31m-      } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) {[m
[31m-	/* Don't catch access violations etc. */[m
[31m-	return ExceptionContinueSearch;[m
[31m-      }[m
[31m-      /* Unwind the stack and call all handlers for all lower C frames[m
[31m-      ** (including ourselves) again with EH_UNWINDING set. Then set[m
[31m-      ** rsp = cf, rax = errcode and jump to the specified target.[m
[31m-      */[m
[31m-      RtlUnwindEx(cf, (void *)((cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ?[m
[31m-			       lj_vm_unwind_ff_eh :[m
[31m-			       lj_vm_unwind_c_eh),[m
[31m-		  rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable);[m
[31m-      /* RtlUnwindEx should never return. */[m
[31m-    }[m
[31m-  }[m
[31m-  return ExceptionContinueSearch;[m
[31m-}[m
[31m-[m
[31m-/* Raise Windows exception. */[m
[31m-static void err_raise_ext(int errcode)[m
[31m-{[m
[31m-  RaiseException(LJ_EXCODE_MAKE(errcode), 1 /* EH_NONCONTINUABLE */, 0, NULL);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- Error handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Throw error. Find catch frame, unwind stack and continue. */[m
[31m-LJ_NOINLINE void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lj_trace_abort(g);[m
[31m-  g->saved_jit_base = g->jit_base;[m
[31m-  setmref(g->jit_base, NULL);[m
[31m-  L->status = 0;[m
[31m-#if LJ_UNWIND_EXT[m
[31m-  err_raise_ext(errcode);[m
[31m-  /*[m
[31m-  ** A return from this function signals a corrupt C stack that cannot be[m
[31m-  ** unwound. We have no choice but to call the panic function and exit.[m
[31m-  **[m
[31m-  ** Usually this is caused by a C function without unwind information.[m
[31m-  ** This should never happen on x64, but may happen if you've manually[m
[31m-  ** enabled LUAJIT_UNWIND_EXTERNAL and forgot to recompile *every*[m
[31m-  ** non-C++ file with -funwind-tables.[m
[31m-  */[m
[31m-  if (G(L)->panic)[m
[31m-    G(L)->panic(L);[m
[31m-#else[m
[31m-  {[m
[31m-    void *cf = err_unwind(L, NULL, errcode);[m
[31m-    if (cframe_unwind_ff(cf))[m
[31m-      lj_vm_unwind_ff(cframe_raw(cf));[m
[31m-    else[m
[31m-      lj_vm_unwind_c(cframe_raw(cf), errcode);[m
[31m-  }[m
[31m-#endif[m
[31m-  exit(EXIT_FAILURE);[m
[31m-}[m
[31m-[m
[31m-/* Return string object for error message. */[m
[31m-LJ_NOINLINE GCstr *lj_err_str(lua_State *L, ErrMsg em)[m
[31m-{[m
[31m-  return lj_str_newz(L, err2msg(em));[m
[31m-}[m
[31m-[m
[31m-/* Out-of-memory error. */[m
[31m-LJ_NOINLINE void lj_err_mem(lua_State *L)[m
[31m-{[m
[31m-  if (L->status == LUA_ERRERR+1)  /* Don't touch the stack during lua_open. */[m
[31m-    lj_vm_unwind_c(L->cframe, LUA_ERRMEM);[m
[31m-  setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRMEM));[m
[31m-  lj_err_throw(L, LUA_ERRMEM);[m
[31m-}[m
[31m-[m
[31m-/* Find error function for runtime errors. Requires an extra stack traversal. */[m
[31m-static ptrdiff_t finderrfunc(lua_State *L)[m
[31m-{[m
[31m-  cTValue *frame = L->base-1, *bot = tvref(L->stack)+LJ_FR2;[m
[31m-  void *cf = L->cframe;[m
[31m-  while (frame > bot && cf) {[m
[31m-    while (cframe_nres(cframe_raw(cf)) < 0) {  /* cframe without frame? */[m
[31m-      if (frame >= restorestack(L, -cframe_nres(cf)))[m
[31m-	break;[m
[31m-      if (cframe_errfunc(cf) >= 0)  /* Error handler not inherited (-1)? */[m
[31m-	return cframe_errfunc(cf);[m
[31m-      cf = cframe_prev(cf);  /* Else unwind cframe and continue searching. */[m
[31m-      if (cf == NULL)[m
[31m-	return 0;[m
[31m-    }[m
[31m-    switch (frame_typep(frame)) {[m
[31m-    case FRAME_LUA:[m
[31m-    case FRAME_LUAP:[m
[31m-      frame = frame_prevl(frame);[m
[31m-      break;[m
[31m-    case FRAME_C:[m
[31m-      cf = cframe_prev(cf);[m
[31m-      /* fallthrough */[m
[31m-    case FRAME_VARG:[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-    case FRAME_CONT:[m
[31m-      if (frame_iscont_fficb(frame))[m
[31m-	cf = cframe_prev(cf);[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-    case FRAME_CP:[m
[31m-      if (cframe_canyield(cf)) return 0;[m
[31m-      if (cframe_errfunc(cf) >= 0)[m
[31m-	return cframe_errfunc(cf);[m
[31m-      frame = frame_prevd(frame);[m
[31m-      break;[m
[31m-    case FRAME_PCALL:[m
[31m-    case FRAME_PCALLH:[m
[31m-      if (frame_func(frame_prevd(frame))->c.ffid == FF_xpcall)[m
[31m-	return savestack(L, frame_prevd(frame)+1);  /* xpcall's errorfunc. */[m
[31m-      return 0;[m
[31m-    default:[m
[31m-      lua_assert(0);[m
[31m-      return 0;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Runtime error. */[m
[31m-LJ_NOINLINE void lj_err_run(lua_State *L)[m
[31m-{[m
[31m-  ptrdiff_t ef = finderrfunc(L);[m
[31m-  if (ef) {[m
[31m-    TValue *errfunc = restorestack(L, ef);[m
[31m-    TValue *top = L->top;[m
[31m-    lj_trace_abort(G(L));[m
[31m-    if (!tvisfunc(errfunc) || L->status == LUA_ERRERR) {[m
[31m-      setstrV(L, top-1, lj_err_str(L, LJ_ERR_ERRERR));[m
[31m-      lj_err_throw(L, LUA_ERRERR);[m
[31m-    }[m
[31m-    L->status = LUA_ERRERR;[m
[31m-    copyTV(L, top+LJ_FR2, top-1);[m
[31m-    copyTV(L, top-1, errfunc);[m
[31m-    if (LJ_FR2) setnilV(top++);[m
[31m-    L->top = top+1;[m
[31m-    lj_vm_call(L, top, 1+1);  /* Stack: |errfunc|msg| -> |msg| */[m
[31m-  }[m
[31m-  lj_err_throw(L, LUA_ERRRUN);[m
[31m-}[m
[31m-[m
[31m-/* Formatted runtime error message. */[m
[31m-LJ_NORET LJ_NOINLINE static void err_msgv(lua_State *L, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, em);[m
[31m-  if (curr_funcisL(L)) L->top = curr_topL(L);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  va_end(argp);[m
[31m-  lj_debug_addloc(L, msg, L->base-1, NULL);[m
[31m-  lj_err_run(L);[m
[31m-}[m
[31m-[m
[31m-/* Non-vararg variant for better calling conventions. */[m
[31m-LJ_NOINLINE void lj_err_msg(lua_State *L, ErrMsg em)[m
[31m-{[m
[31m-  err_msgv(L, em);[m
[31m-}[m
[31m-[m
[31m-/* Lexer error. */[m
[31m-LJ_NOINLINE void lj_err_lex(lua_State *L, GCstr *src, const char *tok,[m
[31m-			    BCLine line, ErrMsg em, va_list argp)[m
[31m-{[m
[31m-  char buff[LUA_IDSIZE];[m
[31m-  const char *msg;[m
[31m-  lj_debug_shortname(buff, src, line);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  msg = lj_strfmt_pushf(L, "%s:%d: %s", buff, line, msg);[m
[31m-  if (tok)[m
[31m-    lj_strfmt_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tok);[m
[31m-  lj_err_throw(L, LUA_ERRSYNTAX);[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for operands. */[m
[31m-LJ_NOINLINE void lj_err_optype(lua_State *L, cTValue *o, ErrMsg opm)[m
[31m-{[m
[31m-  const char *tname = lj_typename(o);[m
[31m-  const char *opname = err2msg(opm);[m
[31m-  if (curr_funcisL(L)) {[m
[31m-    GCproto *pt = curr_proto(L);[m
[31m-    const BCIns *pc = cframe_Lpc(L) - 1;[m
[31m-    const char *oname = NULL;[m
[31m-    const char *kind = lj_debug_slotname(pt, pc, (BCReg)(o-L->base), &oname);[m
[31m-    if (kind)[m
[31m-      err_msgv(L, LJ_ERR_BADOPRT, opname, kind, oname, tname);[m
[31m-  }[m
[31m-  err_msgv(L, LJ_ERR_BADOPRV, opname, tname);[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for ordered comparisons. */[m
[31m-LJ_NOINLINE void lj_err_comp(lua_State *L, cTValue *o1, cTValue *o2)[m
[31m-{[m
[31m-  const char *t1 = lj_typename(o1);[m
[31m-  const char *t2 = lj_typename(o2);[m
[31m-  err_msgv(L, t1 == t2 ? LJ_ERR_BADCMPV : LJ_ERR_BADCMPT, t1, t2);[m
[31m-  /* This assumes the two "boolean" entries are commoned by the C compiler. */[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for __call. */[m
[31m-LJ_NOINLINE void lj_err_optype_call(lua_State *L, TValue *o)[m
[31m-{[m
[31m-  /* Gross hack if lua_[p]call or pcall/xpcall fail for a non-callable object:[m
[31m-  ** L->base still points to the caller. So add a dummy frame with L instead[m
[31m-  ** of a function. See lua_getstack().[m
[31m-  */[m
[31m-  const BCIns *pc = cframe_Lpc(L);[m
[31m-  if (((ptrdiff_t)pc & FRAME_TYPE) != FRAME_LUA) {[m
[31m-    const char *tname = lj_typename(o);[m
[31m-    if (LJ_FR2) o++;[m
[31m-    setframe_pc(o, pc);[m
[31m-    setframe_gc(o, obj2gco(L), LJ_TTHREAD);[m
[31m-    L->top = L->base = o+1;[m
[31m-    err_msgv(L, LJ_ERR_BADCALL, tname);[m
[31m-  }[m
[31m-  lj_err_optype(L, o, LJ_ERR_OPCALL);[m
[31m-}[m
[31m-[m
[31m-/* Error in context of caller. */[m
[31m-LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg)[m
[31m-{[m
[31m-  TValue *frame = L->base-1;[m
[31m-  TValue *pframe = NULL;[m
[31m-  if (frame_islua(frame)) {[m
[31m-    pframe = frame_prevl(frame);[m
[31m-  } else if (frame_iscont(frame)) {[m
[31m-    if (frame_iscont_fficb(frame)) {[m
[31m-      pframe = frame;[m
[31m-      frame = NULL;[m
[31m-    } else {[m
[31m-      pframe = frame_prevd(frame);[m
[31m-#if LJ_HASFFI[m
[31m-      /* Remove frame for FFI metamethods. */[m
[31m-      if (frame_func(frame)->c.ffid >= FF_ffi_meta___index &&[m
[31m-	  frame_func(frame)->c.ffid <= FF_ffi_meta___tostring) {[m
[31m-	L->base = pframe+1;[m
[31m-	L->top = frame;[m
[31m-	setcframe_pc(cframe_raw(L->cframe), frame_contpc(frame));[m
[31m-      }[m
[31m-#endif[m
[31m-    }[m
[31m-  }[m
[31m-  lj_debug_addloc(L, msg, pframe, frame);[m
[31m-  lj_err_run(L);[m
[31m-}[m
[31m-[m
[31m-/* Formatted error in context of caller. */[m
[31m-LJ_NOINLINE void lj_err_callerv(lua_State *L, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, em);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  va_end(argp);[m
[31m-  lj_err_callermsg(L, msg);[m
[31m-}[m
[31m-[m
[31m-/* Error in context of caller. */[m
[31m-LJ_NOINLINE void lj_err_caller(lua_State *L, ErrMsg em)[m
[31m-{[m
[31m-  lj_err_callermsg(L, err2msg(em));[m
[31m-}[m
[31m-[m
[31m-/* Argument error message. */[m
[31m-LJ_NORET LJ_NOINLINE static void err_argmsg(lua_State *L, int narg,[m
[31m-					    const char *msg)[m
[31m-{[m
[31m-  const char *fname = "?";[m
[31m-  const char *ftype = lj_debug_funcname(L, L->base - 1, &fname);[m
[31m-  if (narg < 0 && narg > LUA_REGISTRYINDEX)[m
[31m-    narg = (int)(L->top - L->base) + narg + 1;[m
[31m-  if (ftype && ftype[3] == 'h' && --narg == 0)  /* Check for "method". */[m
[31m-    msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADSELF), fname, msg);[m
[31m-  else[m
[31m-    msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADARG), narg, fname, msg);[m
[31m-  lj_err_callermsg(L, msg);[m
[31m-}[m
[31m-[m
[31m-/* Formatted argument error. */[m
[31m-LJ_NOINLINE void lj_err_argv(lua_State *L, int narg, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, em);[m
[31m-  msg = lj_strfmt_pushvf(L, err2msg(em), argp);[m
[31m-  va_end(argp);[m
[31m-  err_argmsg(L, narg, msg);[m
[31m-}[m
[31m-[m
[31m-/* Argument error. */[m
[31m-LJ_NOINLINE void lj_err_arg(lua_State *L, int narg, ErrMsg em)[m
[31m-{[m
[31m-  err_argmsg(L, narg, err2msg(em));[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for arguments. */[m
[31m-LJ_NOINLINE void lj_err_argtype(lua_State *L, int narg, const char *xname)[m
[31m-{[m
[31m-  const char *tname, *msg;[m
[31m-  if (narg <= LUA_REGISTRYINDEX) {[m
[31m-    if (narg >= LUA_GLOBALSINDEX) {[m
[31m-      tname = lj_obj_itypename[~LJ_TTAB];[m
[31m-    } else {[m
[31m-      GCfunc *fn = curr_func(L);[m
[31m-      int idx = LUA_GLOBALSINDEX - narg;[m
[31m-      if (idx <= fn->c.nupvalues)[m
[31m-	tname = lj_typename(&fn->c.upvalue[idx-1]);[m
[31m-      else[m
[31m-	tname = lj_obj_typename[0];[m
[31m-    }[m
[31m-  } else {[m
[31m-    TValue *o = narg < 0 ? L->top + narg : L->base + narg-1;[m
[31m-    tname = o < L->top ? lj_typename(o) : lj_obj_typename[0];[m
[31m-  }[m
[31m-  msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADTYPE), xname, tname);[m
[31m-  err_argmsg(L, narg, msg);[m
[31m-}[m
[31m-[m
[31m-/* Typecheck error for arguments. */[m
[31m-LJ_NOINLINE void lj_err_argt(lua_State *L, int narg, int tt)[m
[31m-{[m
[31m-  lj_err_argtype(L, narg, lj_obj_typename[tt+1]);[m
[31m-}[m
[31m-[m
[31m-/* -- Public error handling API ------------------------------------------- */[m
[31m-[m
[31m-LUA_API lua_CFunction lua_atpanic(lua_State *L, lua_CFunction panicf)[m
[31m-{[m
[31m-  lua_CFunction old = G(L)->panic;[m
[31m-  G(L)->panic = panicf;[m
[31m-  return old;[m
[31m-}[m
[31m-[m
[31m-/* Forwarders for the public API (C calling convention and no LJ_NORET). */[m
[31m-LUA_API int lua_error(lua_State *L)[m
[31m-{[m
[31m-  lj_err_run(L);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_argerror(lua_State *L, int narg, const char *msg)[m
[31m-{[m
[31m-  err_argmsg(L, narg, msg);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_typerror(lua_State *L, int narg, const char *xname)[m
[31m-{[m
[31m-  lj_err_argtype(L, narg, xname);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-LUALIB_API void luaL_where(lua_State *L, int level)[m
[31m-{[m
[31m-  int size;[m
[31m-  cTValue *frame = lj_debug_frame(L, level, &size);[m
[31m-  lj_debug_addloc(L, "", frame, size ? frame+size : NULL);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_error(lua_State *L, const char *fmt, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  msg = lj_strfmt_pushvf(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  lj_err_callermsg(L, msg);[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_err.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_err.h[m
[1mdeleted file mode 100644[m
[1mindex 6c75761..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_err.h[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-/*[m
[31m-** Error handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_ERR_H[m
[31m-#define _LJ_ERR_H[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-typedef enum {[m
[31m-#define ERRDEF(name, msg) \[m
[31m-  LJ_ERR_##name, LJ_ERR_##name##_ = LJ_ERR_##name + sizeof(msg)-1,[m
[31m-#include "lj_errmsg.h"[m
[31m-  LJ_ERR__MAX[m
[31m-} ErrMsg;[m
[31m-[m
[31m-LJ_DATA const char *lj_err_allmsg;[m
[31m-#define err2msg(em)	(lj_err_allmsg+(int)(em))[m
[31m-[m
[31m-LJ_FUNC GCstr *lj_err_str(lua_State *L, ErrMsg em);[m
[31m-LJ_FUNCA_NORET void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode);[m
[31m-LJ_FUNC_NORET void lj_err_mem(lua_State *L);[m
[31m-LJ_FUNC_NORET void lj_err_run(lua_State *L);[m
[31m-LJ_FUNC_NORET void lj_err_msg(lua_State *L, ErrMsg em);[m
[31m-LJ_FUNC_NORET void lj_err_lex(lua_State *L, GCstr *src, const char *tok,[m
[31m-			      BCLine line, ErrMsg em, va_list argp);[m
[31m-LJ_FUNC_NORET void lj_err_optype(lua_State *L, cTValue *o, ErrMsg opm);[m
[31m-LJ_FUNC_NORET void lj_err_comp(lua_State *L, cTValue *o1, cTValue *o2);[m
[31m-LJ_FUNC_NORET void lj_err_optype_call(lua_State *L, TValue *o);[m
[31m-LJ_FUNC_NORET void lj_err_callermsg(lua_State *L, const char *msg);[m
[31m-LJ_FUNC_NORET void lj_err_callerv(lua_State *L, ErrMsg em, ...);[m
[31m-LJ_FUNC_NORET void lj_err_caller(lua_State *L, ErrMsg em);[m
[31m-LJ_FUNC_NORET void lj_err_arg(lua_State *L, int narg, ErrMsg em);[m
[31m-LJ_FUNC_NORET void lj_err_argv(lua_State *L, int narg, ErrMsg em, ...);[m
[31m-LJ_FUNC_NORET void lj_err_argtype(lua_State *L, int narg, const char *xname);[m
[31m-LJ_FUNC_NORET void lj_err_argt(lua_State *L, int narg, int tt);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_errmsg.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_errmsg.h[m
[1mdeleted file mode 100644[m
[1mindex 0ed8f4e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_errmsg.h[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-/*[m
[31m-** VM error messages.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* This file may be included multiple times with different ERRDEF macros. */[m
[31m-[m
[31m-/* Basic error handling. */[m
[31m-ERRDEF(ERRMEM,	"not enough memory")[m
[31m-ERRDEF(ERRERR,	"error in error handling")[m
[31m-ERRDEF(ERRCPP,	"C++ exception")[m
[31m-[m
[31m-/* Allocations. */[m
[31m-ERRDEF(STROV,	"string length overflow")[m
[31m-ERRDEF(UDATAOV,	"userdata length overflow")[m
[31m-ERRDEF(STKOV,	"stack overflow")[m
[31m-ERRDEF(STKOVM,	"stack overflow (%s)")[m
[31m-ERRDEF(TABOV,	"table overflow")[m
[31m-[m
[31m-/* Table indexing. */[m
[31m-ERRDEF(NANIDX,	"table index is NaN")[m
[31m-ERRDEF(NILIDX,	"table index is nil")[m
[31m-ERRDEF(NEXTIDX,	"invalid key to " LUA_QL("next"))[m
[31m-[m
[31m-/* Metamethod resolving. */[m
[31m-ERRDEF(BADCALL,	"attempt to call a %s value")[m
[31m-ERRDEF(BADOPRT,	"attempt to %s %s " LUA_QS " (a %s value)")[m
[31m-ERRDEF(BADOPRV,	"attempt to %s a %s value")[m
[31m-ERRDEF(BADCMPT,	"attempt to compare %s with %s")[m
[31m-ERRDEF(BADCMPV,	"attempt to compare two %s values")[m
[31m-ERRDEF(GETLOOP,	"loop in gettable")[m
[31m-ERRDEF(SETLOOP,	"loop in settable")[m
[31m-ERRDEF(OPCALL,	"call")[m
[31m-ERRDEF(OPINDEX,	"index")[m
[31m-ERRDEF(OPARITH,	"perform arithmetic on")[m
[31m-ERRDEF(OPCAT,	"concatenate")[m
[31m-ERRDEF(OPLEN,	"get length of")[m
[31m-[m
[31m-/* Type checks. */[m
[31m-ERRDEF(BADSELF,	"calling " LUA_QS " on bad self (%s)")[m
[31m-ERRDEF(BADARG,	"bad argument #%d to " LUA_QS " (%s)")[m
[31m-ERRDEF(BADTYPE,	"%s expected, got %s")[m
[31m-ERRDEF(BADVAL,	"invalid value")[m
[31m-ERRDEF(NOVAL,	"value expected")[m
[31m-ERRDEF(NOCORO,	"coroutine expected")[m
[31m-ERRDEF(NOTABN,	"nil or table expected")[m
[31m-ERRDEF(NOLFUNC,	"Lua function expected")[m
[31m-ERRDEF(NOFUNCL,	"function or level expected")[m
[31m-ERRDEF(NOSFT,	"string/function/table expected")[m
[31m-ERRDEF(NOPROXY,	"boolean or proxy expected")[m
[31m-ERRDEF(FORINIT,	LUA_QL("for") " initial value must be a number")[m
[31m-ERRDEF(FORLIM,	LUA_QL("for") " limit must be a number")[m
[31m-ERRDEF(FORSTEP,	LUA_QL("for") " step must be a number")[m
[31m-[m
[31m-/* C API checks. */[m
[31m-ERRDEF(NOENV,	"no calling environment")[m
[31m-ERRDEF(CYIELD,	"attempt to yield across C-call boundary")[m
[31m-ERRDEF(BADLU,	"bad light userdata pointer")[m
[31m-ERRDEF(NOGCMM,	"bad action while in __gc metamethod")[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-ERRDEF(BADFPU,	"bad FPU precision (use D3DCREATE_FPU_PRESERVE with DirectX)")[m
[31m-#endif[m
[31m-[m
[31m-/* Standard library function errors. */[m
[31m-ERRDEF(ASSERT,	"assertion failed!")[m
[31m-ERRDEF(PROTMT,	"cannot change a protected metatable")[m
[31m-ERRDEF(UNPACK,	"too many results to unpack")[m
[31m-ERRDEF(RDRSTR,	"reader function must return a string")[m
[31m-ERRDEF(PRTOSTR,	LUA_QL("tostring") " must return a string to " LUA_QL("print"))[m
[31m-ERRDEF(IDXRNG,	"index out of range")[m
[31m-ERRDEF(BASERNG,	"base out of range")[m
[31m-ERRDEF(LVLRNG,	"level out of range")[m
[31m-ERRDEF(INVLVL,	"invalid level")[m
[31m-ERRDEF(INVOPT,	"invalid option")[m
[31m-ERRDEF(INVOPTM,	"invalid option " LUA_QS)[m
[31m-ERRDEF(INVFMT,	"invalid format")[m
[31m-ERRDEF(SETFENV,	LUA_QL("setfenv") " cannot change environment of given object")[m
[31m-ERRDEF(CORUN,	"cannot resume running coroutine")[m
[31m-ERRDEF(CODEAD,	"cannot resume dead coroutine")[m
[31m-ERRDEF(COSUSP,	"cannot resume non-suspended coroutine")[m
[31m-ERRDEF(TABINS,	"wrong number of arguments to " LUA_QL("insert"))[m
[31m-ERRDEF(TABCAT,	"invalid value (%s) at index %d in table for " LUA_QL("concat"))[m
[31m-ERRDEF(TABSORT,	"invalid order function for sorting")[m
[31m-ERRDEF(IOCLFL,	"attempt to use a closed file")[m
[31m-ERRDEF(IOSTDCL,	"standard file is closed")[m
[31m-ERRDEF(OSUNIQF,	"unable to generate a unique filename")[m
[31m-ERRDEF(OSDATEF,	"field " LUA_QS " missing in date table")[m
[31m-ERRDEF(STRDUMP,	"unable to dump given function")[m
[31m-ERRDEF(STRSLC,	"string slice too long")[m
[31m-ERRDEF(STRPATB,	"missing " LUA_QL("[") " after " LUA_QL("%f") " in pattern")[m
[31m-ERRDEF(STRPATC,	"invalid pattern capture")[m
[31m-ERRDEF(STRPATE,	"malformed pattern (ends with " LUA_QL("%") ")")[m
[31m-ERRDEF(STRPATM,	"malformed pattern (missing " LUA_QL("]") ")")[m
[31m-ERRDEF(STRPATU,	"unbalanced pattern")[m
[31m-ERRDEF(STRPATX,	"pattern too complex")[m
[31m-ERRDEF(STRCAPI,	"invalid capture index")[m
[31m-ERRDEF(STRCAPN,	"too many captures")[m
[31m-ERRDEF(STRCAPU,	"unfinished capture")[m
[31m-ERRDEF(STRFMT,	"invalid option " LUA_QS " to " LUA_QL("format"))[m
[31m-ERRDEF(STRGSRV,	"invalid replacement value (a %s)")[m
[31m-ERRDEF(BADMODN,	"name conflict for module " LUA_QS)[m
[31m-#if LJ_HASJIT[m
[31m-ERRDEF(JITPROT,	"runtime code generation failed, restricted kernel?")[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-ERRDEF(NOJIT,	"JIT compiler disabled, CPU does not support SSE2")[m
[31m-#else[m
[31m-ERRDEF(NOJIT,	"JIT compiler disabled")[m
[31m-#endif[m
[31m-#elif defined(LJ_ARCH_NOJIT)[m
[31m-ERRDEF(NOJIT,	"no JIT compiler for this architecture (yet)")[m
[31m-#else[m
[31m-ERRDEF(NOJIT,	"JIT compiler permanently disabled by build option")[m
[31m-#endif[m
[31m-ERRDEF(JITOPT,	"unknown or malformed optimization flag " LUA_QS)[m
[31m-[m
[31m-/* Lexer/parser errors. */[m
[31m-ERRDEF(XMODE,	"attempt to load chunk with wrong mode")[m
[31m-ERRDEF(XNEAR,	"%s near " LUA_QS)[m
[31m-ERRDEF(XLINES,	"chunk has too many lines")[m
[31m-ERRDEF(XLEVELS,	"chunk has too many syntax levels")[m
[31m-ERRDEF(XNUMBER,	"malformed number")[m
[31m-ERRDEF(XLSTR,	"unfinished long string")[m
[31m-ERRDEF(XLCOM,	"unfinished long comment")[m
[31m-ERRDEF(XSTR,	"unfinished string")[m
[31m-ERRDEF(XESC,	"invalid escape sequence")[m
[31m-ERRDEF(XLDELIM,	"invalid long string delimiter")[m
[31m-ERRDEF(XTOKEN,	LUA_QS " expected")[m
[31m-ERRDEF(XJUMP,	"control structure too long")[m
[31m-ERRDEF(XSLOTS,	"function or expression too complex")[m
[31m-ERRDEF(XLIMC,	"chunk has more than %d local variables")[m
[31m-ERRDEF(XLIMM,	"main function has more than %d %s")[m
[31m-ERRDEF(XLIMF,	"function at line %d has more than %d %s")[m
[31m-ERRDEF(XMATCH,	LUA_QS " expected (to close " LUA_QS " at line %d)")[m
[31m-ERRDEF(XFIXUP,	"function too long for return fixup")[m
[31m-ERRDEF(XPARAM,	"<name> or " LUA_QL("...") " expected")[m
[31m-#if !LJ_52[m
[31m-ERRDEF(XAMBIG,	"ambiguous syntax (function call x new statement)")[m
[31m-#endif[m
[31m-ERRDEF(XFUNARG,	"function arguments expected")[m
[31m-ERRDEF(XSYMBOL,	"unexpected symbol")[m
[31m-ERRDEF(XDOTS,	"cannot use " LUA_QL("...") " outside a vararg function")[m
[31m-ERRDEF(XSYNTAX,	"syntax error")[m
[31m-ERRDEF(XFOR,	LUA_QL("=") " or " LUA_QL("in") " expected")[m
[31m-ERRDEF(XBREAK,	"no loop to break")[m
[31m-ERRDEF(XLUNDEF,	"undefined label " LUA_QS)[m
[31m-ERRDEF(XLDUP,	"duplicate label " LUA_QS)[m
[31m-ERRDEF(XGSCOPE,	"<goto %s> jumps into the scope of local " LUA_QS)[m
[31m-[m
[31m-/* Bytecode reader errors. */[m
[31m-ERRDEF(BCFMT,	"cannot load incompatible bytecode")[m
[31m-ERRDEF(BCBAD,	"cannot load malformed bytecode")[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* FFI errors. */[m
[31m-ERRDEF(FFI_INVTYPE,	"invalid C type")[m
[31m-ERRDEF(FFI_INVSIZE,	"size of C type is unknown or too large")[m
[31m-ERRDEF(FFI_BADSCL,	"bad storage class")[m
[31m-ERRDEF(FFI_DECLSPEC,	"declaration specifier expected")[m
[31m-ERRDEF(FFI_BADTAG,	"undeclared or implicit tag " LUA_QS)[m
[31m-ERRDEF(FFI_REDEF,	"attempt to redefine " LUA_QS)[m
[31m-ERRDEF(FFI_NUMPARAM,	"wrong number of type parameters")[m
[31m-ERRDEF(FFI_INITOV,	"too many initializers for " LUA_QS)[m
[31m-ERRDEF(FFI_BADCONV,	"cannot convert " LUA_QS " to " LUA_QS)[m
[31m-ERRDEF(FFI_BADLEN,	"attempt to get length of " LUA_QS)[m
[31m-ERRDEF(FFI_BADCONCAT,	"attempt to concatenate " LUA_QS " and " LUA_QS)[m
[31m-ERRDEF(FFI_BADARITH,	"attempt to perform arithmetic on " LUA_QS " and " LUA_QS)[m
[31m-ERRDEF(FFI_BADCOMP,	"attempt to compare " LUA_QS " with " LUA_QS)[m
[31m-ERRDEF(FFI_BADCALL,	LUA_QS " is not callable")[m
[31m-ERRDEF(FFI_NUMARG,	"wrong number of arguments for function call")[m
[31m-ERRDEF(FFI_BADMEMBER,	LUA_QS " has no member named " LUA_QS)[m
[31m-ERRDEF(FFI_BADIDX,	LUA_QS " cannot be indexed")[m
[31m-ERRDEF(FFI_BADIDXW,	LUA_QS " cannot be indexed with " LUA_QS)[m
[31m-ERRDEF(FFI_BADMM,	LUA_QS " has no " LUA_QS " metamethod")[m
[31m-ERRDEF(FFI_WRCONST,	"attempt to write to constant location")[m
[31m-ERRDEF(FFI_NODECL,	"missing declaration for symbol " LUA_QS)[m
[31m-ERRDEF(FFI_BADCBACK,	"bad callback")[m
[31m-#if LJ_OS_NOJIT[m
[31m-ERRDEF(FFI_CBACKOV,	"no support for callbacks on this OS")[m
[31m-#else[m
[31m-ERRDEF(FFI_CBACKOV,	"too many callbacks")[m
[31m-#endif[m
[31m-ERRDEF(FFI_NYIPACKBIT,	"NYI: packed bit fields")[m
[31m-ERRDEF(FFI_NYICALL,	"NYI: cannot call this C function (yet)")[m
[31m-#endif[m
[31m-[m
[31m-#undef ERRDEF[m
[31m-[m
[31m-/* Detecting unused error messages:[m
[31m-   awk -F, '/^ERRDEF/ { gsub(/ERRDEF./, ""); printf "grep -q LJ_ERR_%s *.[ch] || echo %s\n", $1, $1}' lj_errmsg.h | sh[m
[31m-*/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ff.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ff.h[m
[1mdeleted file mode 100644[m
[1mindex 9af3b12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ff.h[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-/*[m
[31m-** Fast function IDs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_FF_H[m
[31m-#define _LJ_FF_H[m
[31m-[m
[31m-/* Fast function ID. */[m
[31m-typedef enum {[m
[31m-  FF_LUA_ = FF_LUA,	/* Lua function (must be 0). */[m
[31m-  FF_C_ = FF_C,		/* Regular C function (must be 1). */[m
[31m-#define FFDEF(name)	FF_##name,[m
[31m-#include "lj_ffdef.h"[m
[31m-  FF__MAX[m
[31m-} FastFunc;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ffrecord.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ffrecord.c[m
[1mdeleted file mode 100644[m
[1mindex 942ecdb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ffrecord.c[m
[1m+++ /dev/null[m
[36m@@ -1,1209 +0,0 @@[m
[31m-/*[m
[31m-** Fast function call recorder.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_ffrecord_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ff.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_record.h"[m
[31m-#include "lj_ffrecord.h"[m
[31m-#include "lj_crecord.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* -- Fast function recording handlers ------------------------------------ */[m
[31m-[m
[31m-/* Conventions for fast function call handlers:[m
[31m-**[m
[31m-** The argument slots start at J->base[0]. All of them are guaranteed to be[m
[31m-** valid and type-specialized references. J->base[J->maxslot] is set to 0[m
[31m-** as a sentinel. The runtime argument values start at rd->argv[0].[m
[31m-**[m
[31m-** In general fast functions should check for presence of all of their[m
[31m-** arguments and for the correct argument types. Some simplifications[m
[31m-** are allowed if the interpreter throws instead. But even if recording[m
[31m-** is aborted, the generated IR must be consistent (no zero-refs).[m
[31m-**[m
[31m-** The number of results in rd->nres is set to 1. Handlers that return[m
[31m-** a different number of results need to override it. A negative value[m
[31m-** prevents return processing (e.g. for pending calls).[m
[31m-**[m
[31m-** Results need to be stored starting at J->base[0]. Return processing[m
[31m-** moves them to the right slots later.[m
[31m-**[m
[31m-** The per-ffid auxiliary data is the value of the 2nd part of the[m
[31m-** LJLIB_REC() annotation. This allows handling similar functionality[m
[31m-** in a common handler.[m
[31m-*/[m
[31m-[m
[31m-/* Type of handler to record a fast function. */[m
[31m-typedef void (LJ_FASTCALL *RecordFunc)(jit_State *J, RecordFFData *rd);[m
[31m-[m
[31m-/* Get runtime value of int argument. */[m
[31m-static int32_t argv2int(jit_State *J, TValue *o)[m
[31m-{[m
[31m-  if (!lj_strscan_numberobj(o))[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  return tvisint(o) ? intV(o) : lj_num2int(numV(o));[m
[31m-}[m
[31m-[m
[31m-/* Get runtime value of string argument. */[m
[31m-static GCstr *argv2str(jit_State *J, TValue *o)[m
[31m-{[m
[31m-  if (LJ_LIKELY(tvisstr(o))) {[m
[31m-    return strV(o);[m
[31m-  } else {[m
[31m-    GCstr *s;[m
[31m-    if (!tvisnumber(o))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    s = lj_strfmt_number(J->L, o);[m
[31m-    setstrV(J->L, o, s);[m
[31m-    return s;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return number of results wanted by caller. */[m
[31m-static ptrdiff_t results_wanted(jit_State *J)[m
[31m-{[m
[31m-  TValue *frame = J->L->base-1;[m
[31m-  if (frame_islua(frame))[m
[31m-    return (ptrdiff_t)bc_b(frame_pc(frame)[-1]) - 1;[m
[31m-  else[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-/* Trace stitching: add continuation below frame to start a new trace. */[m
[31m-static void recff_stitch(jit_State *J)[m
[31m-{[m
[31m-  ASMFunction cont = lj_cont_stitch;[m
[31m-  lua_State *L = J->L;[m
[31m-  TValue *base = L->base;[m
[31m-  const BCIns *pc = frame_pc(base-1);[m
[31m-  TValue *pframe = frame_prevl(base-1);[m
[31m-[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle frame shift. */[m
[31m-  /* Move func + args up in Lua stack and insert continuation. */[m
[31m-  memmove(&base[1], &base[-1], sizeof(TValue)*(J->maxslot+1));[m
[31m-  setframe_ftsz(base+1, ((char *)(base+1) - (char *)pframe) + FRAME_CONT);[m
[31m-  setcont(base, cont);[m
[31m-  setframe_pc(base, pc);[m
[31m-  setnilV(base-1);  /* Incorrect, but rec_check_slots() won't run anymore. */[m
[31m-  L->base += 2;[m
[31m-  L->top += 2;[m
[31m-[m
[31m-  /* Ditto for the IR. */[m
[31m-  memmove(&J->base[1], &J->base[-1], sizeof(TRef)*(J->maxslot+1));[m
[31m-  J->base[0] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;[m
[31m-  J->ktracep = lj_ir_k64_reserve(J);[m
[31m-  lua_assert(irt_toitype_(IRT_P64) == LJ_TTRACE);[m
[31m-  J->base[-1] = emitir(IRT(IR_XLOAD, IRT_P64), lj_ir_kptr(J, &J->ktracep->gcr), 0);[m
[31m-  J->base += 2;[m
[31m-  J->baseslot += 2;[m
[31m-  J->framedepth++;[m
[31m-[m
[31m-  lj_record_stop(J, LJ_TRLINK_STITCH, 0);[m
[31m-[m
[31m-  /* Undo Lua stack changes. */[m
[31m-  memmove(&base[-1], &base[1], sizeof(TValue)*(J->maxslot+1));[m
[31m-  setframe_pc(base-1, pc);[m
[31m-  L->base -= 2;[m
[31m-  L->top -= 2;[m
[31m-}[m
[31m-[m
[31m-/* Fallback handler for fast functions that are not recorded (yet). */[m
[31m-static void LJ_FASTCALL recff_nyi(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (J->cur.nins < (IRRef)J->param[JIT_P_minstitch] + REF_BASE) {[m
[31m-    lj_trace_err_info(J, LJ_TRERR_TRACEUV);[m
[31m-  } else {[m
[31m-    /* Can only stitch from Lua call. */[m
[31m-    if (J->framedepth && frame_islua(J->L->base-1)) {[m
[31m-      BCOp op = bc_op(*frame_pc(J->L->base-1));[m
[31m-      /* Stitched trace cannot start with *M op with variable # of args. */[m
[31m-      if (!(op == BC_CALLM || op == BC_CALLMT ||[m
[31m-	    op == BC_RETM || op == BC_TSETM)) {[m
[31m-	switch (J->fn->c.ffid) {[m
[31m-	case FF_error:[m
[31m-	case FF_debug_sethook:[m
[31m-	case FF_jit_flush:[m
[31m-	  break;  /* Don't stitch across special builtins. */[m
[31m-	default:[m
[31m-	  recff_stitch(J);  /* Use trace stitching. */[m
[31m-	  rd->nres = -1;[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    /* Otherwise stop trace and return to interpreter. */[m
[31m-    lj_record_stop(J, LJ_TRLINK_RETURN, 0);[m
[31m-    rd->nres = -1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fallback handler for unsupported variants of fast functions. */[m
[31m-#define recff_nyiu	recff_nyi[m
[31m-[m
[31m-/* Must stop the trace for classic C functions with arbitrary side-effects. */[m
[31m-#define recff_c		recff_nyi[m
[31m-[m
[31m-/* Emit BUFHDR for the global temporary buffer. */[m
[31m-static TRef recff_bufhdr(jit_State *J)[m
[31m-{[m
[31m-  return emitir(IRT(IR_BUFHDR, IRT_P32),[m
[31m-		lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);[m
[31m-}[m
[31m-[m
[31m-/* -- Base library fast functions ----------------------------------------- */[m
[31m-[m
[31m-static void LJ_FASTCALL recff_assert(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  /* Arguments already specialized. The interpreter throws for nil/false. */[m
[31m-  rd->nres = J->maxslot;  /* Pass through all arguments. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_type(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  /* Arguments already specialized. Result is a constant string. Neat, huh? */[m
[31m-  uint32_t t;[m
[31m-  if (tvisnumber(&rd->argv[0]))[m
[31m-    t = ~LJ_TNUMX;[m
[31m-  else if (LJ_64 && !LJ_GC64 && tvislightud(&rd->argv[0]))[m
[31m-    t = ~LJ_TLIGHTUD;[m
[31m-  else[m
[31m-    t = ~itype(&rd->argv[0]);[m
[31m-  J->base[0] = lj_ir_kstr(J, strV(&J->fn->c.upvalue[t]));[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_getmetatable(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tr) {[m
[31m-    RecordIndex ix;[m
[31m-    ix.tab = tr;[m
[31m-    copyTV(J->L, &ix.tabv, &rd->argv[0]);[m
[31m-    if (lj_record_mm_lookup(J, &ix, MM_metatable))[m
[31m-      J->base[0] = ix.mobj;[m
[31m-    else[m
[31m-      J->base[0] = ix.mt;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_setmetatable(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  TRef mt = J->base[1];[m
[31m-  if (tref_istab(tr) && (tref_istab(mt) || (mt && tref_isnil(mt)))) {[m
[31m-    TRef fref, mtref;[m
[31m-    RecordIndex ix;[m
[31m-    ix.tab = tr;[m
[31m-    copyTV(J->L, &ix.tabv, &rd->argv[0]);[m
[31m-    lj_record_mm_lookup(J, &ix, MM_metatable); /* Guard for no __metatable. */[m
[31m-    fref = emitir(IRT(IR_FREF, IRT_P32), tr, IRFL_TAB_META);[m
[31m-    mtref = tref_isnil(mt) ? lj_ir_knull(J, IRT_TAB) : mt;[m
[31m-    emitir(IRT(IR_FSTORE, IRT_TAB), fref, mtref);[m
[31m-    if (!tref_isnil(mt))[m
[31m-      emitir(IRT(IR_TBAR, IRT_TAB), tr, 0);[m
[31m-    J->base[0] = tr;[m
[31m-    J->needsnap = 1;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_rawget(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0]; ix.key = J->base[1];[m
[31m-  if (tref_istab(ix.tab) && ix.key) {[m
[31m-    ix.val = 0; ix.idxchain = 0;[m
[31m-    settabV(J->L, &ix.tabv, tabV(&rd->argv[0]));[m
[31m-    copyTV(J->L, &ix.keyv, &rd->argv[1]);[m
[31m-    J->base[0] = lj_record_idx(J, &ix);[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_rawset(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0]; ix.key = J->base[1]; ix.val = J->base[2];[m
[31m-  if (tref_istab(ix.tab) && ix.key && ix.val) {[m
[31m-    ix.idxchain = 0;[m
[31m-    settabV(J->L, &ix.tabv, tabV(&rd->argv[0]));[m
[31m-    copyTV(J->L, &ix.keyv, &rd->argv[1]);[m
[31m-    copyTV(J->L, &ix.valv, &rd->argv[2]);[m
[31m-    lj_record_idx(J, &ix);[m
[31m-    /* Pass through table at J->base[0] as result. */[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_rawequal(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tra = J->base[0];[m
[31m-  TRef trb = J->base[1];[m
[31m-  if (tra && trb) {[m
[31m-    int diff = lj_record_objcmp(J, tra, trb, &rd->argv[0], &rd->argv[1]);[m
[31m-    J->base[0] = diff ? TREF_FALSE : TREF_TRUE;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-#if LJ_52[m
[31m-static void LJ_FASTCALL recff_rawlen(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_isstr(tr))[m
[31m-    J->base[0] = emitir(IRTI(IR_FLOAD), tr, IRFL_STR_LEN);[m
[31m-  else if (tref_istab(tr))[m
[31m-    J->base[0] = lj_ir_call(J, IRCALL_lj_tab_len, tr);[m
[31m-  /* else: Interpreter will throw. */[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Determine mode of select() call. */[m
[31m-int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv)[m
[31m-{[m
[31m-  if (tref_isstr(tr) && *strVdata(tv) == '#') {  /* select('#', ...) */[m
[31m-    if (strV(tv)->len == 1) {[m
[31m-      emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, strV(tv)));[m
[31m-    } else {[m
[31m-      TRef trptr = emitir(IRT(IR_STRREF, IRT_P32), tr, lj_ir_kint(J, 0));[m
[31m-      TRef trchar = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY);[m
[31m-      emitir(IRTG(IR_EQ, IRT_INT), trchar, lj_ir_kint(J, '#'));[m
[31m-    }[m
[31m-    return 0;[m
[31m-  } else {  /* select(n, ...) */[m
[31m-    int32_t start = argv2int(J, tv);[m
[31m-    if (start == 0) lj_trace_err(J, LJ_TRERR_BADTYPE);  /* A bit misleading. */[m
[31m-    return start;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_select(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tr) {[m
[31m-    ptrdiff_t start = lj_ffrecord_select_mode(J, tr, &rd->argv[0]);[m
[31m-    if (start == 0) {  /* select('#', ...) */[m
[31m-      J->base[0] = lj_ir_kint(J, J->maxslot - 1);[m
[31m-    } else if (tref_isk(tr)) {  /* select(k, ...) */[m
[31m-      ptrdiff_t n = (ptrdiff_t)J->maxslot;[m
[31m-      if (start < 0) start += n;[m
[31m-      else if (start > n) start = n;[m
[31m-      rd->nres = n - start;[m
[31m-      if (start >= 1) {[m
[31m-	ptrdiff_t i;[m
[31m-	for (i = 0; i < n - start; i++)[m
[31m-	  J->base[i] = J->base[start+i];[m
[31m-      }  /* else: Interpreter will throw. */[m
[31m-    } else {[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_tonumber(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  TRef base = J->base[1];[m
[31m-  if (tr && !tref_isnil(base)) {[m
[31m-    base = lj_opt_narrow_toint(J, base);[m
[31m-    if (!tref_isk(base) || IR(tref_ref(base))->i != 10) {[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  if (tref_isnumber_str(tr)) {[m
[31m-    if (tref_isstr(tr)) {[m
[31m-      TValue tmp;[m
[31m-      if (!lj_strscan_num(strV(&rd->argv[0]), &tmp)) {[m
[31m-	recff_nyiu(J, rd);  /* Would need an inverted STRTO for this case. */[m
[31m-	return;[m
[31m-      }[m
[31m-      tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-  } else if (tref_iscdata(tr)) {[m
[31m-    lj_crecord_tonumber(J, rd);[m
[31m-    return;[m
[31m-#endif[m
[31m-  } else {[m
[31m-    tr = TREF_NIL;[m
[31m-  }[m
[31m-  J->base[0] = tr;[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static TValue *recff_metacall_cp(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  jit_State *J = (jit_State *)ud;[m
[31m-  lj_record_tailcall(J, 0, 1);[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static int recff_metacall(jit_State *J, RecordFFData *rd, MMS mm)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0];[m
[31m-  copyTV(J->L, &ix.tabv, &rd->argv[0]);[m
[31m-  if (lj_record_mm_lookup(J, &ix, mm)) {  /* Has metamethod? */[m
[31m-    int errcode;[m
[31m-    TValue argv0;[m
[31m-    /* Temporarily insert metamethod below object. */[m
[31m-    J->base[1] = J->base[0];[m
[31m-    J->base[0] = ix.mobj;[m
[31m-    copyTV(J->L, &argv0, &rd->argv[0]);[m
[31m-    copyTV(J->L, &rd->argv[1], &rd->argv[0]);[m
[31m-    copyTV(J->L, &rd->argv[0], &ix.mobjv);[m
[31m-    /* Need to protect lj_record_tailcall because it may throw. */[m
[31m-    errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp);[m
[31m-    /* Always undo Lua stack changes to avoid confusing the interpreter. */[m
[31m-    copyTV(J->L, &rd->argv[0], &argv0);[m
[31m-    if (errcode)[m
[31m-      lj_err_throw(J->L, errcode);  /* Propagate errors. */[m
[31m-    rd->nres = -1;  /* Pending call. */[m
[31m-    return 1;  /* Tailcalled to metamethod. */[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_tostring(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_isstr(tr)) {[m
[31m-    /* Ignore __tostring in the string base metatable. */[m
[31m-    /* Pass on result in J->base[0]. */[m
[31m-  } else if (tr && !recff_metacall(J, rd, MM_tostring)) {[m
[31m-    if (tref_isnumber(tr)) {[m
[31m-      J->base[0] = emitir(IRT(IR_TOSTR, IRT_STR), tr,[m
[31m-			  tref_isnum(tr) ? IRTOSTR_NUM : IRTOSTR_INT);[m
[31m-    } else if (tref_ispri(tr)) {[m
[31m-      J->base[0] = lj_ir_kstr(J, lj_strfmt_obj(J->L, &rd->argv[0]));[m
[31m-    } else {[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_ipairs_aux(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0];[m
[31m-  if (tref_istab(ix.tab)) {[m
[31m-    if (!tvisnumber(&rd->argv[1]))  /* No support for string coercion. */[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    setintV(&ix.keyv, numberVint(&rd->argv[1])+1);[m
[31m-    settabV(J->L, &ix.tabv, tabV(&rd->argv[0]));[m
[31m-    ix.val = 0; ix.idxchain = 0;[m
[31m-    ix.key = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-    J->base[0] = ix.key = emitir(IRTI(IR_ADD), ix.key, lj_ir_kint(J, 1));[m
[31m-    J->base[1] = lj_record_idx(J, &ix);[m
[31m-    rd->nres = tref_isnil(J->base[1]) ? 0 : 2;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_xpairs(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (!((LJ_52 || (LJ_HASFFI && tref_iscdata(tr))) &&[m
[31m-	recff_metacall(J, rd, MM_pairs + rd->data))) {[m
[31m-    if (tref_istab(tr)) {[m
[31m-      J->base[0] = lj_ir_kfunc(J, funcV(&J->fn->c.upvalue[0]));[m
[31m-      J->base[1] = tr;[m
[31m-      J->base[2] = rd->data ? lj_ir_kint(J, 0) : TREF_NIL;[m
[31m-      rd->nres = 3;[m
[31m-    }  /* else: Interpreter will throw. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_pcall(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (J->maxslot >= 1) {[m
[31m-    lj_record_call(J, 0, J->maxslot - 1);[m
[31m-    rd->nres = -1;  /* Pending call. */[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static TValue *recff_xpcall_cp(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  jit_State *J = (jit_State *)ud;[m
[31m-  lj_record_call(J, 1, J->maxslot - 2);[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_xpcall(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  if (J->maxslot >= 2) {[m
[31m-    TValue argv0, argv1;[m
[31m-    TRef tmp;[m
[31m-    int errcode;[m
[31m-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-    /* Swap function and traceback. */[m
[31m-    tmp = J->base[0]; J->base[0] = J->base[1]; J->base[1] = tmp;[m
[31m-    copyTV(J->L, &argv0, &rd->argv[0]);[m
[31m-    copyTV(J->L, &argv1, &rd->argv[1]);[m
[31m-    copyTV(J->L, &rd->argv[0], &argv1);[m
[31m-    copyTV(J->L, &rd->argv[1], &argv0);[m
[31m-    /* Need to protect lj_record_call because it may throw. */[m
[31m-    errcode = lj_vm_cpcall(J->L, NULL, J, recff_xpcall_cp);[m
[31m-    /* Always undo Lua stack swap to avoid confusing the interpreter. */[m
[31m-    copyTV(J->L, &rd->argv[0], &argv0);[m
[31m-    copyTV(J->L, &rd->argv[1], &argv1);[m
[31m-    if (errcode)[m
[31m-      lj_err_throw(J->L, errcode);  /* Propagate errors. */[m
[31m-    rd->nres = -1;  /* Pending call. */[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_getfenv(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  /* Only support getfenv(0) for now. */[m
[31m-  if (tref_isint(tr) && tref_isk(tr) && IR(tref_ref(tr))->i == 0) {[m
[31m-    TRef trl = emitir(IRT(IR_LREF, IRT_THREAD), 0, 0);[m
[31m-    J->base[0] = emitir(IRT(IR_FLOAD, IRT_TAB), trl, IRFL_THREAD_ENV);[m
[31m-    return;[m
[31m-  }[m
[31m-  recff_nyiu(J, rd);[m
[31m-}[m
[31m-[m
[31m-/* -- Math library fast functions ----------------------------------------- */[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_abs(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-  J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_knum_abs(J));[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record rounding functions math.floor and math.ceil. */[m
[31m-static void LJ_FASTCALL recff_math_round(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (!tref_isinteger(tr)) {  /* Pass through integers unmodified. */[m
[31m-    tr = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, tr), rd->data);[m
[31m-    /* Result is integral (or NaN/Inf), but may not fit an int32_t. */[m
[31m-    if (LJ_DUALNUM) {  /* Try to narrow using a guarded conversion to int. */[m
[31m-      lua_Number n = lj_vm_foldfpm(numberVnum(&rd->argv[0]), rd->data);[m
[31m-      if (n == (lua_Number)lj_num2int(n))[m
[31m-	tr = emitir(IRTGI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_CHECK);[m
[31m-    }[m
[31m-    J->base[0] = tr;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record unary math.* functions, mapped to IR_FPMATH opcode. */[m
[31m-static void LJ_FASTCALL recff_math_unary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  J->base[0] = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, J->base[0]), rd->data);[m
[31m-}[m
[31m-[m
[31m-/* Record math.log. */[m
[31m-static void LJ_FASTCALL recff_math_log(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-  if (J->base[1]) {[m
[31m-#ifdef LUAJIT_NO_LOG2[m
[31m-    uint32_t fpm = IRFPM_LOG;[m
[31m-#else[m
[31m-    uint32_t fpm = IRFPM_LOG2;[m
[31m-#endif[m
[31m-    TRef trb = lj_ir_tonum(J, J->base[1]);[m
[31m-    tr = emitir(IRTN(IR_FPMATH), tr, fpm);[m
[31m-    trb = emitir(IRTN(IR_FPMATH), trb, fpm);[m
[31m-    trb = emitir(IRTN(IR_DIV), lj_ir_knum_one(J), trb);[m
[31m-    tr = emitir(IRTN(IR_MUL), tr, trb);[m
[31m-  } else {[m
[31m-    tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_LOG);[m
[31m-  }[m
[31m-  J->base[0] = tr;[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record math.atan2. */[m
[31m-static void LJ_FASTCALL recff_math_atan2(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-  TRef tr2 = lj_ir_tonum(J, J->base[1]);[m
[31m-  J->base[0] = emitir(IRTN(IR_ATAN2), tr, tr2);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record math.ldexp. */[m
[31m-static void LJ_FASTCALL recff_math_ldexp(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  TRef tr2 = lj_ir_tonum(J, J->base[1]);[m
[31m-#else[m
[31m-  TRef tr2 = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-#endif[m
[31m-  J->base[0] = emitir(IRTN(IR_LDEXP), tr, tr2);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record math.asin, math.acos, math.atan. */[m
[31m-static void LJ_FASTCALL recff_math_atrig(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef y = lj_ir_tonum(J, J->base[0]);[m
[31m-  TRef x = lj_ir_knum_one(J);[m
[31m-  uint32_t ffid = rd->data;[m
[31m-  if (ffid != FF_math_atan) {[m
[31m-    TRef tmp = emitir(IRTN(IR_MUL), y, y);[m
[31m-    tmp = emitir(IRTN(IR_SUB), x, tmp);[m
[31m-    tmp = emitir(IRTN(IR_FPMATH), tmp, IRFPM_SQRT);[m
[31m-    if (ffid == FF_math_asin) { x = tmp; } else { x = y; y = tmp; }[m
[31m-  }[m
[31m-  J->base[0] = emitir(IRTN(IR_ATAN2), y, x);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_htrig(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonum(J, J->base[0]);[m
[31m-  J->base[0] = emitir(IRTN(IR_CALLN), tr, rd->data);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_modf(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_isinteger(tr)) {[m
[31m-    J->base[0] = tr;[m
[31m-    J->base[1] = lj_ir_kint(J, 0);[m
[31m-  } else {[m
[31m-    TRef trt;[m
[31m-    tr = lj_ir_tonum(J, tr);[m
[31m-    trt = emitir(IRTN(IR_FPMATH), tr, IRFPM_TRUNC);[m
[31m-    J->base[0] = trt;[m
[31m-    J->base[1] = emitir(IRTN(IR_SUB), tr, trt);[m
[31m-  }[m
[31m-  rd->nres = 2;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  J->base[0] = lj_opt_narrow_pow(J, J->base[0], J->base[1],[m
[31m-				 &rd->argv[0], &rd->argv[1]);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_minmax(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = lj_ir_tonumber(J, J->base[0]);[m
[31m-  uint32_t op = rd->data;[m
[31m-  BCReg i;[m
[31m-  for (i = 1; J->base[i] != 0; i++) {[m
[31m-    TRef tr2 = lj_ir_tonumber(J, J->base[i]);[m
[31m-    IRType t = IRT_INT;[m
[31m-    if (!(tref_isinteger(tr) && tref_isinteger(tr2))) {[m
[31m-      if (tref_isinteger(tr)) tr = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT);[m
[31m-      if (tref_isinteger(tr2)) tr2 = emitir(IRTN(IR_CONV), tr2, IRCONV_NUM_INT);[m
[31m-      t = IRT_NUM;[m
[31m-    }[m
[31m-    tr = emitir(IRT(op, t), tr, tr2);[m
[31m-  }[m
[31m-  J->base[0] = tr;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_math_random(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  GCudata *ud = udataV(&J->fn->c.upvalue[0]);[m
[31m-  TRef tr, one;[m
[31m-  lj_ir_kgc(J, obj2gco(ud), IRT_UDATA);  /* Prevent collection. */[m
[31m-  tr = lj_ir_call(J, IRCALL_lj_math_random_step, lj_ir_kptr(J, uddata(ud)));[m
[31m-  one = lj_ir_knum_one(J);[m
[31m-  tr = emitir(IRTN(IR_SUB), tr, one);[m
[31m-  if (J->base[0]) {[m
[31m-    TRef tr1 = lj_ir_tonum(J, J->base[0]);[m
[31m-    if (J->base[1]) {  /* d = floor(d*(r2-r1+1.0)) + r1 */[m
[31m-      TRef tr2 = lj_ir_tonum(J, J->base[1]);[m
[31m-      tr2 = emitir(IRTN(IR_SUB), tr2, tr1);[m
[31m-      tr2 = emitir(IRTN(IR_ADD), tr2, one);[m
[31m-      tr = emitir(IRTN(IR_MUL), tr, tr2);[m
[31m-      tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_FLOOR);[m
[31m-      tr = emitir(IRTN(IR_ADD), tr, tr1);[m
[31m-    } else {  /* d = floor(d*r1) + 1.0 */[m
[31m-      tr = emitir(IRTN(IR_MUL), tr, tr1);[m
[31m-      tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_FLOOR);[m
[31m-      tr = emitir(IRTN(IR_ADD), tr, one);[m
[31m-    }[m
[31m-  }[m
[31m-  J->base[0] = tr;[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* -- Bit library fast functions ------------------------------------------ */[m
[31m-[m
[31m-/* Record bit.tobit. */[m
[31m-static void LJ_FASTCALL recff_bit_tobit(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-#if LJ_HASFFI[m
[31m-  if (tref_iscdata(tr)) { recff_bit64_tobit(J, rd); return; }[m
[31m-#endif[m
[31m-  J->base[0] = lj_opt_narrow_tobit(J, tr);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-/* Record unary bit.bnot, bit.bswap. */[m
[31m-static void LJ_FASTCALL recff_bit_unary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (recff_bit64_unary(J, rd))[m
[31m-    return;[m
[31m-#endif[m
[31m-  J->base[0] = emitir(IRTI(rd->data), lj_opt_narrow_tobit(J, J->base[0]), 0);[m
[31m-}[m
[31m-[m
[31m-/* Record N-ary bit.band, bit.bor, bit.bxor. */[m
[31m-static void LJ_FASTCALL recff_bit_nary(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (recff_bit64_nary(J, rd))[m
[31m-    return;[m
[31m-#endif[m
[31m-  {[m
[31m-    TRef tr = lj_opt_narrow_tobit(J, J->base[0]);[m
[31m-    uint32_t ot = IRTI(rd->data);[m
[31m-    BCReg i;[m
[31m-    for (i = 1; J->base[i] != 0; i++)[m
[31m-      tr = emitir(ot, tr, lj_opt_narrow_tobit(J, J->base[i]));[m
[31m-    J->base[0] = tr;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record bit shifts. */[m
[31m-static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (recff_bit64_shift(J, rd))[m
[31m-    return;[m
[31m-#endif[m
[31m-  {[m
[31m-    TRef tr = lj_opt_narrow_tobit(J, J->base[0]);[m
[31m-    TRef tsh = lj_opt_narrow_tobit(J, J->base[1]);[m
[31m-    IROp op = (IROp)rd->data;[m
[31m-    if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) &&[m
[31m-	!tref_isk(tsh))[m
[31m-      tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31));[m
[31m-#ifdef LJ_TARGET_UNIFYROT[m
[31m-    if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) {[m
[31m-      op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR;[m
[31m-      tsh = emitir(IRTI(IR_NEG), tsh, tsh);[m
[31m-    }[m
[31m-#endif[m
[31m-    J->base[0] = emitir(IRTI(op), tr, tsh);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_bit_tohex(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  TRef hdr = recff_bufhdr(J);[m
[31m-  TRef tr = recff_bit64_tohex(J, rd, hdr);[m
[31m-  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-#else[m
[31m-  recff_nyiu(J, rd);  /* Don't bother working around this NYI. */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- String library fast functions --------------------------------------- */[m
[31m-[m
[31m-/* Specialize to relative starting position for string. */[m
[31m-static TRef recff_string_start(jit_State *J, GCstr *s, int32_t *st, TRef tr,[m
[31m-			       TRef trlen, TRef tr0)[m
[31m-{[m
[31m-  int32_t start = *st;[m
[31m-  if (start < 0) {[m
[31m-    emitir(IRTGI(IR_LT), tr, tr0);[m
[31m-    tr = emitir(IRTI(IR_ADD), trlen, tr);[m
[31m-    start = start + (int32_t)s->len;[m
[31m-    emitir(start < 0 ? IRTGI(IR_LT) : IRTGI(IR_GE), tr, tr0);[m
[31m-    if (start < 0) {[m
[31m-      tr = tr0;[m
[31m-      start = 0;[m
[31m-    }[m
[31m-  } else if (start == 0) {[m
[31m-    emitir(IRTGI(IR_EQ), tr, tr0);[m
[31m-    tr = tr0;[m
[31m-  } else {[m
[31m-    tr = emitir(IRTI(IR_ADD), tr, lj_ir_kint(J, -1));[m
[31m-    emitir(IRTGI(IR_GE), tr, tr0);[m
[31m-    start--;[m
[31m-  }[m
[31m-  *st = start;[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Handle string.byte (rd->data = 0) and string.sub (rd->data = 1). */[m
[31m-static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef trstr = lj_ir_tostr(J, J->base[0]);[m
[31m-  TRef trlen = emitir(IRTI(IR_FLOAD), trstr, IRFL_STR_LEN);[m
[31m-  TRef tr0 = lj_ir_kint(J, 0);[m
[31m-  TRef trstart, trend;[m
[31m-  GCstr *str = argv2str(J, &rd->argv[0]);[m
[31m-  int32_t start, end;[m
[31m-  if (rd->data) {  /* string.sub(str, start [,end]) */[m
[31m-    start = argv2int(J, &rd->argv[1]);[m
[31m-    trstart = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-    trend = J->base[2];[m
[31m-    if (tref_isnil(trend)) {[m
[31m-      trend = lj_ir_kint(J, -1);[m
[31m-      end = -1;[m
[31m-    } else {[m
[31m-      trend = lj_opt_narrow_toint(J, trend);[m
[31m-      end = argv2int(J, &rd->argv[2]);[m
[31m-    }[m
[31m-  } else {  /* string.byte(str, [,start [,end]]) */[m
[31m-    if (tref_isnil(J->base[1])) {[m
[31m-      start = 1;[m
[31m-      trstart = lj_ir_kint(J, 1);[m
[31m-    } else {[m
[31m-      start = argv2int(J, &rd->argv[1]);[m
[31m-      trstart = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-    }[m
[31m-    if (J->base[1] && !tref_isnil(J->base[2])) {[m
[31m-      trend = lj_opt_narrow_toint(J, J->base[2]);[m
[31m-      end = argv2int(J, &rd->argv[2]);[m
[31m-    } else {[m
[31m-      trend = trstart;[m
[31m-      end = start;[m
[31m-    }[m
[31m-  }[m
[31m-  if (end < 0) {[m
[31m-    emitir(IRTGI(IR_LT), trend, tr0);[m
[31m-    trend = emitir(IRTI(IR_ADD), emitir(IRTI(IR_ADD), trlen, trend),[m
[31m-		   lj_ir_kint(J, 1));[m
[31m-    end = end+(int32_t)str->len+1;[m
[31m-  } else if ((MSize)end <= str->len) {[m
[31m-    emitir(IRTGI(IR_ULE), trend, trlen);[m
[31m-  } else {[m
[31m-    emitir(IRTGI(IR_UGT), trend, trlen);[m
[31m-    end = (int32_t)str->len;[m
[31m-    trend = trlen;[m
[31m-  }[m
[31m-  trstart = recff_string_start(J, str, &start, trstart, trlen, tr0);[m
[31m-  if (rd->data) {  /* Return string.sub result. */[m
[31m-    if (end - start >= 0) {[m
[31m-      /* Also handle empty range here, to avoid extra traces. */[m
[31m-      TRef trptr, trslen = emitir(IRTI(IR_SUB), trend, trstart);[m
[31m-      emitir(IRTGI(IR_GE), trslen, tr0);[m
[31m-      trptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);[m
[31m-      J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, trslen);[m
[31m-    } else {  /* Range underflow: return empty string. */[m
[31m-      emitir(IRTGI(IR_LT), trend, trstart);[m
[31m-      J->base[0] = lj_ir_kstr(J, &J2G(J)->strempty);[m
[31m-    }[m
[31m-  } else {  /* Return string.byte result(s). */[m
[31m-    ptrdiff_t i, len = end - start;[m
[31m-    if (len > 0) {[m
[31m-      TRef trslen = emitir(IRTI(IR_SUB), trend, trstart);[m
[31m-      emitir(IRTGI(IR_EQ), trslen, lj_ir_kint(J, (int32_t)len));[m
[31m-      if (J->baseslot + len > LJ_MAX_JSLOTS)[m
[31m-	lj_trace_err_info(J, LJ_TRERR_STACKOV);[m
[31m-      rd->nres = len;[m
[31m-      for (i = 0; i < len; i++) {[m
[31m-	TRef tmp = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, (int32_t)i));[m
[31m-	tmp = emitir(IRT(IR_STRREF, IRT_P32), trstr, tmp);[m
[31m-	J->base[i] = emitir(IRT(IR_XLOAD, IRT_U8), tmp, IRXLOAD_READONLY);[m
[31m-      }[m
[31m-    } else {  /* Empty range or range underflow: return no results. */[m
[31m-      emitir(IRTGI(IR_LE), trend, trstart);[m
[31m-      rd->nres = 0;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef k255 = lj_ir_kint(J, 255);[m
[31m-  BCReg i;[m
[31m-  for (i = 0; J->base[i] != 0; i++) {  /* Convert char values to strings. */[m
[31m-    TRef tr = lj_opt_narrow_toint(J, J->base[i]);[m
[31m-    emitir(IRTGI(IR_ULE), tr, k255);[m
[31m-    J->base[i] = emitir(IRT(IR_TOSTR, IRT_STR), tr, IRTOSTR_CHAR);[m
[31m-  }[m
[31m-  if (i > 1) {  /* Concatenate the strings, if there's more than one. */[m
[31m-    TRef hdr = recff_bufhdr(J), tr = hdr;[m
[31m-    for (i = 0; J->base[i] != 0; i++)[m
[31m-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]);[m
[31m-    J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-  }[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_rep(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef str = lj_ir_tostr(J, J->base[0]);[m
[31m-  TRef rep = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-  TRef hdr, tr, str2 = 0;[m
[31m-  if (!tref_isnil(J->base[2])) {[m
[31m-    TRef sep = lj_ir_tostr(J, J->base[2]);[m
[31m-    int32_t vrep = argv2int(J, &rd->argv[1]);[m
[31m-    emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1));[m
[31m-    if (vrep > 1) {[m
[31m-      TRef hdr2 = recff_bufhdr(J);[m
[31m-      TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), hdr2, sep);[m
[31m-      tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), tr2, str);[m
[31m-      str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2);[m
[31m-    }[m
[31m-  }[m
[31m-  tr = hdr = recff_bufhdr(J);[m
[31m-  if (str2) {[m
[31m-    tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, str);[m
[31m-    str = str2;[m
[31m-    rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1));[m
[31m-  }[m
[31m-  tr = lj_ir_call(J, IRCALL_lj_buf_putstr_rep, tr, str, rep);[m
[31m-  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_op(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef str = lj_ir_tostr(J, J->base[0]);[m
[31m-  TRef hdr = recff_bufhdr(J);[m
[31m-  TRef tr = lj_ir_call(J, rd->data, hdr, str);[m
[31m-  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef trstr = lj_ir_tostr(J, J->base[0]);[m
[31m-  TRef trpat = lj_ir_tostr(J, J->base[1]);[m
[31m-  TRef trlen = emitir(IRTI(IR_FLOAD), trstr, IRFL_STR_LEN);[m
[31m-  TRef tr0 = lj_ir_kint(J, 0);[m
[31m-  TRef trstart;[m
[31m-  GCstr *str = argv2str(J, &rd->argv[0]);[m
[31m-  GCstr *pat = argv2str(J, &rd->argv[1]);[m
[31m-  int32_t start;[m
[31m-  J->needsnap = 1;[m
[31m-  if (tref_isnil(J->base[2])) {[m
[31m-    trstart = lj_ir_kint(J, 1);[m
[31m-    start = 1;[m
[31m-  } else {[m
[31m-    trstart = lj_opt_narrow_toint(J, J->base[2]);[m
[31m-    start = argv2int(J, &rd->argv[2]);[m
[31m-  }[m
[31m-  trstart = recff_string_start(J, str, &start, trstart, trlen, tr0);[m
[31m-  if ((MSize)start <= str->len) {[m
[31m-    emitir(IRTGI(IR_ULE), trstart, trlen);[m
[31m-  } else {[m
[31m-    emitir(IRTGI(IR_UGT), trstart, trlen);[m
[31m-#if LJ_52[m
[31m-    J->base[0] = TREF_NIL;[m
[31m-    return;[m
[31m-#else[m
[31m-    trstart = trlen;[m
[31m-    start = str->len;[m
[31m-#endif[m
[31m-  }[m
[31m-  /* Fixed arg or no pattern matching chars? (Specialized to pattern string.) */[m
[31m-  if ((J->base[2] && tref_istruecond(J->base[3])) ||[m
[31m-      (emitir(IRTG(IR_EQ, IRT_STR), trpat, lj_ir_kstr(J, pat)),[m
[31m-       !lj_str_haspattern(pat))) {  /* Search for fixed string. */[m
[31m-    TRef trsptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);[m
[31m-    TRef trpptr = emitir(IRT(IR_STRREF, IRT_P32), trpat, tr0);[m
[31m-    TRef trslen = emitir(IRTI(IR_SUB), trlen, trstart);[m
[31m-    TRef trplen = emitir(IRTI(IR_FLOAD), trpat, IRFL_STR_LEN);[m
[31m-    TRef tr = lj_ir_call(J, IRCALL_lj_str_find, trsptr, trpptr, trslen, trplen);[m
[31m-    TRef trp0 = lj_ir_kkptr(J, NULL);[m
[31m-    if (lj_str_find(strdata(str)+(MSize)start, strdata(pat),[m
[31m-		    str->len-(MSize)start, pat->len)) {[m
[31m-      TRef pos;[m
[31m-      emitir(IRTG(IR_NE, IRT_P32), tr, trp0);[m
[31m-      pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_P32), trstr, tr0));[m
[31m-      J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));[m
[31m-      J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);[m
[31m-      rd->nres = 2;[m
[31m-    } else {[m
[31m-      emitir(IRTG(IR_EQ, IRT_P32), tr, trp0);[m
[31m-      J->base[0] = TREF_NIL;[m
[31m-    }[m
[31m-  } else {  /* Search for pattern. */[m
[31m-    recff_nyiu(J, rd);[m
[31m-    return;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef trfmt = lj_ir_tostr(J, J->base[0]);[m
[31m-  GCstr *fmt = argv2str(J, &rd->argv[0]);[m
[31m-  int arg = 1;[m
[31m-  TRef hdr, tr;[m
[31m-  FormatState fs;[m
[31m-  SFormat sf;[m
[31m-  /* Specialize to the format string. */[m
[31m-  emitir(IRTG(IR_EQ, IRT_STR), trfmt, lj_ir_kstr(J, fmt));[m
[31m-  tr = hdr = recff_bufhdr(J);[m
[31m-  lj_strfmt_init(&fs, strdata(fmt), fmt->len);[m
[31m-  while ((sf = lj_strfmt_parse(&fs)) != STRFMT_EOF) {  /* Parse format. */[m
[31m-    TRef tra = sf == STRFMT_LIT ? 0 : J->base[arg++];[m
[31m-    TRef trsf = lj_ir_kint(J, (int32_t)sf);[m
[31m-    IRCallID id;[m
[31m-    switch (STRFMT_TYPE(sf)) {[m
[31m-    case STRFMT_LIT:[m
[31m-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,[m
[31m-		  lj_ir_kstr(J, lj_str_new(J->L, fs.str, fs.len)));[m
[31m-      break;[m
[31m-    case STRFMT_INT:[m
[31m-      id = IRCALL_lj_strfmt_putfnum_int;[m
[31m-    handle_int:[m
[31m-      if (!tref_isinteger(tra))[m
[31m-	goto handle_num;[m
[31m-      if (sf == STRFMT_INT) { /* Shortcut for plain %d. */[m
[31m-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,[m
[31m-		    emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_INT));[m
[31m-      } else {[m
[31m-#if LJ_HASFFI[m
[31m-	tra = emitir(IRT(IR_CONV, IRT_U64), tra,[m
[31m-		     (IRT_INT|(IRT_U64<<5)|IRCONV_SEXT));[m
[31m-	tr = lj_ir_call(J, IRCALL_lj_strfmt_putfxint, tr, trsf, tra);[m
[31m-	lj_needsplit(J);[m
[31m-#else[m
[31m-	recff_nyiu(J, rd);  /* Don't bother working around this NYI. */[m
[31m-	return;[m
[31m-#endif[m
[31m-      }[m
[31m-      break;[m
[31m-    case STRFMT_UINT:[m
[31m-      id = IRCALL_lj_strfmt_putfnum_uint;[m
[31m-      goto handle_int;[m
[31m-    case STRFMT_NUM:[m
[31m-      id = IRCALL_lj_strfmt_putfnum;[m
[31m-    handle_num:[m
[31m-      tra = lj_ir_tonum(J, tra);[m
[31m-      tr = lj_ir_call(J, id, tr, trsf, tra);[m
[31m-      if (LJ_SOFTFP) lj_needsplit(J);[m
[31m-      break;[m
[31m-    case STRFMT_STR:[m
[31m-      if (!tref_isstr(tra)) {[m
[31m-	recff_nyiu(J, rd);  /* NYI: __tostring and non-string types for %s. */[m
[31m-	return;[m
[31m-      }[m
[31m-      if (sf == STRFMT_STR)  /* Shortcut for plain %s. */[m
[31m-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, tra);[m
[31m-      else if ((sf & STRFMT_T_QUOTED))[m
[31m-	tr = lj_ir_call(J, IRCALL_lj_strfmt_putquoted, tr, tra);[m
[31m-      else[m
[31m-	tr = lj_ir_call(J, IRCALL_lj_strfmt_putfstr, tr, trsf, tra);[m
[31m-      break;[m
[31m-    case STRFMT_CHAR:[m
[31m-      tra = lj_opt_narrow_toint(J, tra);[m
[31m-      if (sf == STRFMT_CHAR)  /* Shortcut for plain %c. */[m
[31m-	tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,[m
[31m-		    emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_CHAR));[m
[31m-      else[m
[31m-	tr = lj_ir_call(J, IRCALL_lj_strfmt_putfchar, tr, trsf, tra);[m
[31m-      break;[m
[31m-    case STRFMT_PTR:  /* NYI */[m
[31m-    case STRFMT_ERR:[m
[31m-    default:[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-}[m
[31m-[m
[31m-/* -- Table library fast functions ---------------------------------------- */[m
[31m-[m
[31m-static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = J->base[0];[m
[31m-  ix.val = J->base[1];[m
[31m-  rd->nres = 0;[m
[31m-  if (tref_istab(ix.tab) && ix.val) {[m
[31m-    if (!J->base[2]) {  /* Simple push: t[#t+1] = v */[m
[31m-      TRef trlen = lj_ir_call(J, IRCALL_lj_tab_len, ix.tab);[m
[31m-      GCtab *t = tabV(&rd->argv[0]);[m
[31m-      ix.key = emitir(IRTI(IR_ADD), trlen, lj_ir_kint(J, 1));[m
[31m-      settabV(J->L, &ix.tabv, t);[m
[31m-      setintV(&ix.keyv, lj_tab_len(t) + 1);[m
[31m-      ix.idxchain = 0;[m
[31m-      lj_record_idx(J, &ix);  /* Set new value. */[m
[31m-    } else {  /* Complex case: insert in the middle. */[m
[31m-      recff_nyiu(J, rd);[m
[31m-      return;[m
[31m-    }[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_table_concat(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tab = J->base[0];[m
[31m-  if (tref_istab(tab)) {[m
[31m-    TRef sep = !tref_isnil(J->base[1]) ?[m
[31m-	       lj_ir_tostr(J, J->base[1]) : lj_ir_knull(J, IRT_STR);[m
[31m-    TRef tri = (J->base[1] && !tref_isnil(J->base[2])) ?[m
[31m-	       lj_opt_narrow_toint(J, J->base[2]) : lj_ir_kint(J, 1);[m
[31m-    TRef tre = (J->base[1] && J->base[2] && !tref_isnil(J->base[3])) ?[m
[31m-	       lj_opt_narrow_toint(J, J->base[3]) :[m
[31m-	       lj_ir_call(J, IRCALL_lj_tab_len, tab);[m
[31m-    TRef hdr = recff_bufhdr(J);[m
[31m-    TRef tr = lj_ir_call(J, IRCALL_lj_buf_puttab, hdr, tab, sep, tri, tre);[m
[31m-    emitir(IRTG(IR_NE, IRT_PTR), tr, lj_ir_kptr(J, NULL));[m
[31m-    J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_table_new(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tra = lj_opt_narrow_toint(J, J->base[0]);[m
[31m-  TRef trh = lj_opt_narrow_toint(J, J->base[1]);[m
[31m-  J->base[0] = lj_ir_call(J, IRCALL_lj_tab_new_ah, tra, trh);[m
[31m-  UNUSED(rd);[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_table_clear(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_istab(tr)) {[m
[31m-    rd->nres = 0;[m
[31m-    lj_ir_call(J, IRCALL_lj_tab_clear, tr);[m
[31m-    J->needsnap = 1;[m
[31m-  }  /* else: Interpreter will throw. */[m
[31m-}[m
[31m-[m
[31m-/* -- I/O library fast functions ------------------------------------------ */[m
[31m-[m
[31m-/* Get FILE* for I/O function. Any I/O error aborts recording, so there's[m
[31m-** no need to encode the alternate cases for any of the guards.[m
[31m-*/[m
[31m-static TRef recff_io_fp(jit_State *J, TRef *udp, int32_t id)[m
[31m-{[m
[31m-  TRef tr, ud, fp;[m
[31m-  if (id) {  /* io.func() */[m
[31m-    tr = lj_ir_kptr(J, &J2G(J)->gcroot[id]);[m
[31m-    ud = emitir(IRT(IR_XLOAD, IRT_UDATA), tr, 0);[m
[31m-  } else {  /* fp:method() */[m
[31m-    ud = J->base[0];[m
[31m-    if (!tref_isudata(ud))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    tr = emitir(IRT(IR_FLOAD, IRT_U8), ud, IRFL_UDATA_UDTYPE);[m
[31m-    emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE));[m
[31m-  }[m
[31m-  *udp = ud;[m
[31m-  fp = emitir(IRT(IR_FLOAD, IRT_PTR), ud, IRFL_UDATA_FILE);[m
[31m-  emitir(IRTG(IR_NE, IRT_PTR), fp, lj_ir_knull(J, IRT_PTR));[m
[31m-  return fp;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef ud, fp = recff_io_fp(J, &ud, rd->data);[m
[31m-  TRef zero = lj_ir_kint(J, 0);[m
[31m-  TRef one = lj_ir_kint(J, 1);[m
[31m-  ptrdiff_t i = rd->data == 0 ? 1 : 0;[m
[31m-  for (; J->base[i]; i++) {[m
[31m-    TRef str = lj_ir_tostr(J, J->base[i]);[m
[31m-    TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero);[m
[31m-    TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);[m
[31m-    if (tref_isk(len) && IR(tref_ref(len))->i == 1) {[m
[31m-      IRIns *irs = IR(tref_ref(str));[m
[31m-      TRef tr = (irs->o == IR_TOSTR && irs->op2 == IRTOSTR_CHAR) ?[m
[31m-		irs->op1 :[m
[31m-		emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY);[m
[31m-      tr = lj_ir_call(J, IRCALL_fputc, tr, fp);[m
[31m-      if (results_wanted(J) != 0)  /* Check result only if not ignored. */[m
[31m-	emitir(IRTGI(IR_NE), tr, lj_ir_kint(J, -1));[m
[31m-    } else {[m
[31m-      TRef tr = lj_ir_call(J, IRCALL_fwrite, buf, one, len, fp);[m
[31m-      if (results_wanted(J) != 0)  /* Check result only if not ignored. */[m
[31m-	emitir(IRTGI(IR_EQ), tr, len);[m
[31m-    }[m
[31m-  }[m
[31m-  J->base[0] = LJ_52 ? ud : TREF_TRUE;[m
[31m-}[m
[31m-[m
[31m-static void LJ_FASTCALL recff_io_flush(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  TRef ud, fp = recff_io_fp(J, &ud, rd->data);[m
[31m-  TRef tr = lj_ir_call(J, IRCALL_fflush, fp);[m
[31m-  if (results_wanted(J) != 0)  /* Check result only if not ignored. */[m
[31m-    emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, 0));[m
[31m-  J->base[0] = TREF_TRUE;[m
[31m-}[m
[31m-[m
[31m-/* -- Debug library fast functions ---------------------------------------- */[m
[31m-[m
[31m-static void LJ_FASTCALL recff_debug_getmetatable(jit_State *J, RecordFFData *rd)[m
[31m-{[m
[31m-  GCtab *mt;[m
[31m-  TRef mtref;[m
[31m-  TRef tr = J->base[0];[m
[31m-  if (tref_istab(tr)) {[m
[31m-    mt = tabref(tabV(&rd->argv[0])->metatable);[m
[31m-    mtref = emitir(IRT(IR_FLOAD, IRT_TAB), tr, IRFL_TAB_META);[m
[31m-  } else if (tref_isudata(tr)) {[m
[31m-    mt = tabref(udataV(&rd->argv[0])->metatable);[m
[31m-    mtref = emitir(IRT(IR_FLOAD, IRT_TAB), tr, IRFL_UDATA_META);[m
[31m-  } else {[m
[31m-    mt = tabref(basemt_obj(J2G(J), &rd->argv[0]));[m
[31m-    J->base[0] = mt ? lj_ir_ktab(J, mt) : TREF_NIL;[m
[31m-    return;[m
[31m-  }[m
[31m-  emitir(IRTG(mt ? IR_NE : IR_EQ, IRT_TAB), mtref, lj_ir_knull(J, IRT_TAB));[m
[31m-  J->base[0] = mt ? mtref : TREF_NIL;[m
[31m-}[m
[31m-[m
[31m-/* -- Record calls to fast functions -------------------------------------- */[m
[31m-[m
[31m-#include "lj_recdef.h"[m
[31m-[m
[31m-static uint32_t recdef_lookup(GCfunc *fn)[m
[31m-{[m
[31m-  if (fn->c.ffid < sizeof(recff_idmap)/sizeof(recff_idmap[0]))[m
[31m-    return recff_idmap[fn->c.ffid];[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/* Record entry to a fast function or C function. */[m
[31m-void lj_ffrecord_func(jit_State *J)[m
[31m-{[m
[31m-  RecordFFData rd;[m
[31m-  uint32_t m = recdef_lookup(J->fn);[m
[31m-  rd.data = m & 0xff;[m
[31m-  rd.nres = 1;  /* Default is one result. */[m
[31m-  rd.argv = J->L->base;[m
[31m-  J->base[J->maxslot] = 0;  /* Mark end of arguments. */[m
[31m-  (recff_func[m >> 8])(J, &rd);  /* Call recff_* handler. */[m
[31m-  if (rd.nres >= 0) {[m
[31m-    if (J->postproc == LJ_POST_NONE) J->postproc = LJ_POST_FFRETRY;[m
[31m-    lj_record_ret(J, 0, rd.nres);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ffrecord.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ffrecord.h[m
[1mdeleted file mode 100644[m
[1mindex 7a188be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ffrecord.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-/*[m
[31m-** Fast function call recorder.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_FFRECORD_H[m
[31m-#define _LJ_FFRECORD_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Data used by handlers to record a fast function. */[m
[31m-typedef struct RecordFFData {[m
[31m-  TValue *argv;		/* Runtime argument values. */[m
[31m-  ptrdiff_t nres;	/* Number of returned results (defaults to 1). */[m
[31m-  uint32_t data;	/* Per-ffid auxiliary data (opcode, literal etc.). */[m
[31m-} RecordFFData;[m
[31m-[m
[31m-LJ_FUNC int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv);[m
[31m-LJ_FUNC void lj_ffrecord_func(jit_State *J);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_frame.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_frame.h[m
[1mdeleted file mode 100644[m
[1mindex fc0e281..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_frame.h[m
[1m+++ /dev/null[m
[36m@@ -1,270 +0,0 @@[m
[31m-/*[m
[31m-** Stack frames.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_FRAME_H[m
[31m-#define _LJ_FRAME_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_bc.h"[m
[31m-[m
[31m-/* -- Lua stack frame ----------------------------------------------------- */[m
[31m-[m
[31m-/* Frame type markers in LSB of PC (4-byte aligned) or delta (8-byte aligned:[m
[31m-**[m
[31m-**    PC  00  Lua frame[m
[31m-** delta 001  C frame[m
[31m-** delta 010  Continuation frame[m
[31m-** delta 011  Lua vararg frame[m
[31m-** delta 101  cpcall() frame[m
[31m-** delta 110  ff pcall() frame[m
[31m-** delta 111  ff pcall() frame with active hook[m
[31m-*/[m
[31m-enum {[m
[31m-  FRAME_LUA, FRAME_C, FRAME_CONT, FRAME_VARG,[m
[31m-  FRAME_LUAP, FRAME_CP, FRAME_PCALL, FRAME_PCALLH[m
[31m-};[m
[31m-#define FRAME_TYPE		3[m
[31m-#define FRAME_P			4[m
[31m-#define FRAME_TYPEP		(FRAME_TYPE|FRAME_P)[m
[31m-[m
[31m-/* Macros to access and modify Lua frames. */[m
[31m-#if LJ_FR2[m
[31m-/* Two-slot frame info, required for 64 bit PC/GCRef:[m
[31m-**[m
[31m-**                   base-2  base-1      |  base  base+1 ...[m
[31m-**                  [func   PC/delta/ft] | [slots ...][m
[31m-**                  ^-- frame            | ^-- base   ^-- top[m
[31m-**[m
[31m-** Continuation frames:[m
[31m-**[m
[31m-**   base-4  base-3  base-2  base-1      |  base  base+1 ...[m
[31m-**  [cont      PC ] [func   PC/delta/ft] | [slots ...][m
[31m-**                  ^-- frame            | ^-- base   ^-- top[m
[31m-*/[m
[31m-#define frame_gc(f)		(gcval((f)-1))[m
[31m-#define frame_ftsz(f)		((ptrdiff_t)(f)->ftsz)[m
[31m-#define frame_pc(f)		((const BCIns *)frame_ftsz(f))[m
[31m-#define setframe_gc(f, p, tp)	(setgcVraw((f)-1, (p), (tp)))[m
[31m-#define setframe_ftsz(f, sz)	((f)->ftsz = (sz))[m
[31m-#define setframe_pc(f, pc)	((f)->ftsz = (int64_t)(intptr_t)(pc))[m
[31m-#else[m
[31m-/* One-slot frame info, sufficient for 32 bit PC/GCRef:[m
[31m-**[m
[31m-**              base-1              |  base  base+1 ...[m
[31m-**              lo     hi           |[m
[31m-**             [func | PC/delta/ft] | [slots ...][m
[31m-**             ^-- frame            | ^-- base   ^-- top[m
[31m-**[m
[31m-** Continuation frames:[m
[31m-**[m
[31m-**  base-2      base-1              |  base  base+1 ...[m
[31m-**  lo     hi   lo     hi           |[m
[31m-** [cont | PC] [func | PC/delta/ft] | [slots ...][m
[31m-**             ^-- frame            | ^-- base   ^-- top[m
[31m-*/[m
[31m-#define frame_gc(f)		(gcref((f)->fr.func))[m
[31m-#define frame_ftsz(f)		((ptrdiff_t)(f)->fr.tp.ftsz)[m
[31m-#define frame_pc(f)		(mref((f)->fr.tp.pcr, const BCIns))[m
[31m-#define setframe_gc(f, p, tp)	(setgcref((f)->fr.func, (p)), UNUSED(tp))[m
[31m-#define setframe_ftsz(f, sz)	((f)->fr.tp.ftsz = (int32_t)(sz))[m
[31m-#define setframe_pc(f, pc)	(setmref((f)->fr.tp.pcr, (pc)))[m
[31m-#endif[m
[31m-[m
[31m-#define frame_type(f)		(frame_ftsz(f) & FRAME_TYPE)[m
[31m-#define frame_typep(f)		(frame_ftsz(f) & FRAME_TYPEP)[m
[31m-#define frame_islua(f)		(frame_type(f) == FRAME_LUA)[m
[31m-#define frame_isc(f)		(frame_type(f) == FRAME_C)[m
[31m-#define frame_iscont(f)		(frame_typep(f) == FRAME_CONT)[m
[31m-#define frame_isvarg(f)		(frame_typep(f) == FRAME_VARG)[m
[31m-#define frame_ispcall(f)	((frame_ftsz(f) & 6) == FRAME_PCALL)[m
[31m-[m
[31m-#define frame_func(f)		(&frame_gc(f)->fn)[m
[31m-#define frame_delta(f)		(frame_ftsz(f) >> 3)[m
[31m-#define frame_sized(f)		(frame_ftsz(f) & ~FRAME_TYPEP)[m
[31m-[m
[31m-enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK };  /* Special continuations. */[m
[31m-[m
[31m-#if LJ_FR2[m
[31m-#define frame_contpc(f)		(frame_pc((f)-2))[m
[31m-#define frame_contv(f)		(((f)-3)->u64)[m
[31m-#else[m
[31m-#define frame_contpc(f)		(frame_pc((f)-1))[m
[31m-#define frame_contv(f)		(((f)-1)->u32.lo)[m
[31m-#endif[m
[31m-#if LJ_FR2[m
[31m-#define frame_contf(f)		((ASMFunction)(uintptr_t)((f)-3)->u64)[m
[31m-#elif LJ_64[m
[31m-#define frame_contf(f) \[m
[31m-  ((ASMFunction)(void *)((intptr_t)lj_vm_asm_begin + \[m
[31m-			 (intptr_t)(int32_t)((f)-1)->u32.lo))[m
[31m-#else[m
[31m-#define frame_contf(f)		((ASMFunction)gcrefp(((f)-1)->gcr, void))[m
[31m-#endif[m
[31m-#define frame_iscont_fficb(f) \[m
[31m-  (LJ_HASFFI && frame_contv(f) == LJ_CONT_FFI_CALLBACK)[m
[31m-[m
[31m-#define frame_prevl(f)		((f) - (1+LJ_FR2+bc_a(frame_pc(f)[-1])))[m
[31m-#define frame_prevd(f)		((TValue *)((char *)(f) - frame_sized(f)))[m
[31m-#define frame_prev(f)		(frame_islua(f)?frame_prevl(f):frame_prevd(f))[m
[31m-/* Note: this macro does not skip over FRAME_VARG. */[m
[31m-[m
[31m-/* -- C stack frame ------------------------------------------------------- */[m
[31m-[m
[31m-/* Macros to access and modify the C stack frame chain. */[m
[31m-[m
[31m-/* These definitions must match with the arch-specific *.dasc files. */[m
[31m-#if LJ_TARGET_X86[m
[31m-#define CFRAME_OFS_ERRF		(15*4)[m
[31m-#define CFRAME_OFS_NRES		(14*4)[m
[31m-#define CFRAME_OFS_PREV		(13*4)[m
[31m-#define CFRAME_OFS_L		(12*4)[m
[31m-#define CFRAME_OFS_PC		(6*4)[m
[31m-#define CFRAME_OFS_MULTRES	(5*4)[m
[31m-#define CFRAME_SIZE		(12*4)[m
[31m-#define CFRAME_SHIFT_MULTRES	0[m
[31m-#elif LJ_TARGET_X64[m
[31m-#if LJ_ABI_WIN[m
[31m-#define CFRAME_OFS_PREV		(13*8)[m
[31m-#if LJ_GC64[m
[31m-#define CFRAME_OFS_PC		(12*8)[m
[31m-#define CFRAME_OFS_L		(11*8)[m
[31m-#define CFRAME_OFS_ERRF		(21*4)[m
[31m-#define CFRAME_OFS_NRES		(20*4)[m
[31m-#define CFRAME_OFS_MULTRES	(8*4)[m
[31m-#else[m
[31m-#define CFRAME_OFS_PC		(25*4)[m
[31m-#define CFRAME_OFS_L		(24*4)[m
[31m-#define CFRAME_OFS_ERRF		(23*4)[m
[31m-#define CFRAME_OFS_NRES		(22*4)[m
[31m-#define CFRAME_OFS_MULTRES	(21*4)[m
[31m-#endif[m
[31m-#define CFRAME_SIZE		(10*8)[m
[31m-#define CFRAME_SIZE_JIT		(CFRAME_SIZE + 9*16 + 4*8)[m
[31m-#define CFRAME_SHIFT_MULTRES	0[m
[31m-#else[m
[31m-#define CFRAME_OFS_PREV		(4*8)[m
[31m-#if LJ_GC64[m
[31m-#define CFRAME_OFS_PC		(3*8)[m
[31m-#define CFRAME_OFS_L		(2*8)[m
[31m-#define CFRAME_OFS_ERRF		(3*4)[m
[31m-#define CFRAME_OFS_NRES		(2*4)[m
[31m-#define CFRAME_OFS_MULTRES	(0*4)[m
[31m-#else[m
[31m-#define CFRAME_OFS_PC		(7*4)[m
[31m-#define CFRAME_OFS_L		(6*4)[m
[31m-#define CFRAME_OFS_ERRF		(5*4)[m
[31m-#define CFRAME_OFS_NRES		(4*4)[m
[31m-#define CFRAME_OFS_MULTRES	(1*4)[m
[31m-#endif[m
[31m-#if LJ_NO_UNWIND[m
[31m-#define CFRAME_SIZE		(12*8)[m
[31m-#else[m
[31m-#define CFRAME_SIZE		(10*8)[m
[31m-#endif[m
[31m-#define CFRAME_SIZE_JIT		(CFRAME_SIZE + 16)[m
[31m-#define CFRAME_SHIFT_MULTRES	0[m
[31m-#endif[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#define CFRAME_OFS_ERRF		24[m
[31m-#define CFRAME_OFS_NRES		20[m
[31m-#define CFRAME_OFS_PREV		16[m
[31m-#define CFRAME_OFS_L		12[m
[31m-#define CFRAME_OFS_PC		8[m
[31m-#define CFRAME_OFS_MULTRES	4[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-#define CFRAME_SIZE		128[m
[31m-#else[m
[31m-#define CFRAME_SIZE		64[m
[31m-#endif[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#define CFRAME_OFS_ERRF		196[m
[31m-#define CFRAME_OFS_NRES		200[m
[31m-#define CFRAME_OFS_PREV		160[m
[31m-#define CFRAME_OFS_L		176[m
[31m-#define CFRAME_OFS_PC		168[m
[31m-#define CFRAME_OFS_MULTRES	192[m
[31m-#define CFRAME_SIZE		208[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#if LJ_TARGET_XBOX360[m
[31m-#define CFRAME_OFS_ERRF		424[m
[31m-#define CFRAME_OFS_NRES		420[m
[31m-#define CFRAME_OFS_PREV		400[m
[31m-#define CFRAME_OFS_L		416[m
[31m-#define CFRAME_OFS_PC		412[m
[31m-#define CFRAME_OFS_MULTRES	408[m
[31m-#define CFRAME_SIZE		384[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#elif LJ_ARCH_PPC32ON64[m
[31m-#define CFRAME_OFS_ERRF		472[m
[31m-#define CFRAME_OFS_NRES		468[m
[31m-#define CFRAME_OFS_PREV		448[m
[31m-#define CFRAME_OFS_L		464[m
[31m-#define CFRAME_OFS_PC		460[m
[31m-#define CFRAME_OFS_MULTRES	456[m
[31m-#define CFRAME_SIZE		400[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#else[m
[31m-#define CFRAME_OFS_ERRF		48[m
[31m-#define CFRAME_OFS_NRES		44[m
[31m-#define CFRAME_OFS_PREV		40[m
[31m-#define CFRAME_OFS_L		36[m
[31m-#define CFRAME_OFS_PC		32[m
[31m-#define CFRAME_OFS_MULTRES	28[m
[31m-#define CFRAME_SIZE		272[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#endif[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-#define CFRAME_OFS_ERRF		124[m
[31m-#define CFRAME_OFS_NRES		120[m
[31m-#define CFRAME_OFS_PREV		116[m
[31m-#define CFRAME_OFS_L		112[m
[31m-#define CFRAME_OFS_PC		20[m
[31m-#define CFRAME_OFS_MULTRES	16[m
[31m-#define CFRAME_SIZE		112[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#else[m
[31m-#define CFRAME_OFS_ERRF		76[m
[31m-#define CFRAME_OFS_NRES		72[m
[31m-#define CFRAME_OFS_PREV		68[m
[31m-#define CFRAME_OFS_L		64[m
[31m-#define CFRAME_OFS_PC		20[m
[31m-#define CFRAME_OFS_MULTRES	16[m
[31m-#define CFRAME_SIZE		64[m
[31m-#define CFRAME_SHIFT_MULTRES	3[m
[31m-#endif[m
[31m-#else[m
[31m-#error "Missing CFRAME_* definitions for this architecture"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CFRAME_SIZE_JIT[m
[31m-#define CFRAME_SIZE_JIT		CFRAME_SIZE[m
[31m-#endif[m
[31m-[m
[31m-#define CFRAME_RESUME		1[m
[31m-#define CFRAME_UNWIND_FF	2  /* Only used in unwinder. */[m
[31m-#define CFRAME_RAWMASK		(~(intptr_t)(CFRAME_RESUME|CFRAME_UNWIND_FF))[m
[31m-[m
[31m-#define cframe_errfunc(cf)	(*(int32_t *)(((char *)(cf))+CFRAME_OFS_ERRF))[m
[31m-#define cframe_nres(cf)		(*(int32_t *)(((char *)(cf))+CFRAME_OFS_NRES))[m
[31m-#define cframe_prev(cf)		(*(void **)(((char *)(cf))+CFRAME_OFS_PREV))[m
[31m-#define cframe_multres(cf)  (*(uint32_t *)(((char *)(cf))+CFRAME_OFS_MULTRES))[m
[31m-#define cframe_multres_n(cf)	(cframe_multres((cf)) >> CFRAME_SHIFT_MULTRES)[m
[31m-#define cframe_L(cf) \[m
[31m-  (&gcref(*(GCRef *)(((char *)(cf))+CFRAME_OFS_L))->th)[m
[31m-#define cframe_pc(cf) \[m
[31m-  (mref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), const BCIns))[m
[31m-#define setcframe_L(cf, L) \[m
[31m-  (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_L), (L)))[m
[31m-#define setcframe_pc(cf, pc) \[m
[31m-  (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), (pc)))[m
[31m-#define cframe_canyield(cf)	((intptr_t)(cf) & CFRAME_RESUME)[m
[31m-#define cframe_unwind_ff(cf)	((intptr_t)(cf) & CFRAME_UNWIND_FF)[m
[31m-#define cframe_raw(cf)		((void *)((intptr_t)(cf) & CFRAME_RAWMASK))[m
[31m-#define cframe_Lpc(L)		cframe_pc(cframe_raw(L->cframe))[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_func.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_func.c[m
[1mdeleted file mode 100644[m
[1mindex 431a56d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_func.c[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-/*[m
[31m-** Function handling (prototypes, functions and upvalues).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_func_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* -- Prototypes ---------------------------------------------------------- */[m
[31m-[m
[31m-void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt)[m
[31m-{[m
[31m-  lj_mem_free(g, pt, pt->sizept);[m
[31m-}[m
[31m-[m
[31m-/* -- Upvalues ------------------------------------------------------------ */[m
[31m-[m
[31m-static void unlinkuv(GCupval *uv)[m
[31m-{[m
[31m-  lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv);[m
[31m-  setgcrefr(uvnext(uv)->prev, uv->prev);[m
[31m-  setgcrefr(uvprev(uv)->next, uv->next);[m
[31m-}[m
[31m-[m
[31m-/* Find existing open upvalue for a stack slot or create a new one. */[m
[31m-static GCupval *func_finduv(lua_State *L, TValue *slot)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCRef *pp = &L->openupval;[m
[31m-  GCupval *p;[m
[31m-  GCupval *uv;[m
[31m-  /* Search the sorted list of open upvalues. */[m
[31m-  while (gcref(*pp) != NULL && uvval((p = gco2uv(gcref(*pp)))) >= slot) {[m
[31m-    lua_assert(!p->closed && uvval(p) != &p->tv);[m
[31m-    if (uvval(p) == slot) {  /* Found open upvalue pointing to same slot? */[m
[31m-      if (isdead(g, obj2gco(p)))  /* Resurrect it, if it's dead. */[m
[31m-	flipwhite(obj2gco(p));[m
[31m-      return p;[m
[31m-    }[m
[31m-    pp = &p->nextgc;[m
[31m-  }[m
[31m-  /* No matching upvalue found. Create a new one. */[m
[31m-  uv = lj_mem_newt(L, sizeof(GCupval), GCupval);[m
[31m-  newwhite(g, uv);[m
[31m-  uv->gct = ~LJ_TUPVAL;[m
[31m-  uv->closed = 0;  /* Still open. */[m
[31m-  setmref(uv->v, slot);  /* Pointing to the stack slot. */[m
[31m-  /* NOBARRIER: The GCupval is new (marked white) and open. */[m
[31m-  setgcrefr(uv->nextgc, *pp);  /* Insert into sorted list of open upvalues. */[m
[31m-  setgcref(*pp, obj2gco(uv));[m
[31m-  setgcref(uv->prev, obj2gco(&g->uvhead));  /* Insert into GC list, too. */[m
[31m-  setgcrefr(uv->next, g->uvhead.next);[m
[31m-  setgcref(uvnext(uv)->prev, obj2gco(uv));[m
[31m-  setgcref(g->uvhead.next, obj2gco(uv));[m
[31m-  lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv);[m
[31m-  return uv;[m
[31m-}[m
[31m-[m
[31m-/* Create an empty and closed upvalue. */[m
[31m-static GCupval *func_emptyuv(lua_State *L)[m
[31m-{[m
[31m-  GCupval *uv = (GCupval *)lj_mem_newgco(L, sizeof(GCupval));[m
[31m-  uv->gct = ~LJ_TUPVAL;[m
[31m-  uv->closed = 1;[m
[31m-  setnilV(&uv->tv);[m
[31m-  setmref(uv->v, &uv->tv);[m
[31m-  return uv;[m
[31m-}[m
[31m-[m
[31m-/* Close all open upvalues pointing to some stack level or above. */[m
[31m-void LJ_FASTCALL lj_func_closeuv(lua_State *L, TValue *level)[m
[31m-{[m
[31m-  GCupval *uv;[m
[31m-  global_State *g = G(L);[m
[31m-  while (gcref(L->openupval) != NULL &&[m
[31m-	 uvval((uv = gco2uv(gcref(L->openupval)))) >= level) {[m
[31m-    GCobj *o = obj2gco(uv);[m
[31m-    lua_assert(!isblack(o) && !uv->closed && uvval(uv) != &uv->tv);[m
[31m-    setgcrefr(L->openupval, uv->nextgc);  /* No longer in open list. */[m
[31m-    if (isdead(g, o)) {[m
[31m-      lj_func_freeuv(g, uv);[m
[31m-    } else {[m
[31m-      unlinkuv(uv);[m
[31m-      lj_gc_closeuv(g, uv);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_func_freeuv(global_State *g, GCupval *uv)[m
[31m-{[m
[31m-  if (!uv->closed)[m
[31m-    unlinkuv(uv);[m
[31m-  lj_mem_freet(g, uv);[m
[31m-}[m
[31m-[m
[31m-/* -- Functions (closures) ------------------------------------------------ */[m
[31m-[m
[31m-GCfunc *lj_func_newC(lua_State *L, MSize nelems, GCtab *env)[m
[31m-{[m
[31m-  GCfunc *fn = (GCfunc *)lj_mem_newgco(L, sizeCfunc(nelems));[m
[31m-  fn->c.gct = ~LJ_TFUNC;[m
[31m-  fn->c.ffid = FF_C;[m
[31m-  fn->c.nupvalues = (uint8_t)nelems;[m
[31m-  /* NOBARRIER: The GCfunc is new (marked white). */[m
[31m-  setmref(fn->c.pc, &G(L)->bc_cfunc_ext);[m
[31m-  setgcref(fn->c.env, obj2gco(env));[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-static GCfunc *func_newL(lua_State *L, GCproto *pt, GCtab *env)[m
[31m-{[m
[31m-  uint32_t count;[m
[31m-  GCfunc *fn = (GCfunc *)lj_mem_newgco(L, sizeLfunc((MSize)pt->sizeuv));[m
[31m-  fn->l.gct = ~LJ_TFUNC;[m
[31m-  fn->l.ffid = FF_LUA;[m
[31m-  fn->l.nupvalues = 0;  /* Set to zero until upvalues are initialized. */[m
[31m-  /* NOBARRIER: Really a setgcref. But the GCfunc is new (marked white). */[m
[31m-  setmref(fn->l.pc, proto_bc(pt));[m
[31m-  setgcref(fn->l.env, obj2gco(env));[m
[31m-  /* Saturating 3 bit counter (0..7) for created closures. */[m
[31m-  count = (uint32_t)pt->flags + PROTO_CLCOUNT;[m
[31m-  pt->flags = (uint8_t)(count - ((count >> PROTO_CLC_BITS) & PROTO_CLCOUNT));[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-/* Create a new Lua function with empty upvalues. */[m
[31m-GCfunc *lj_func_newL_empty(lua_State *L, GCproto *pt, GCtab *env)[m
[31m-{[m
[31m-  GCfunc *fn = func_newL(L, pt, env);[m
[31m-  MSize i, nuv = pt->sizeuv;[m
[31m-  /* NOBARRIER: The GCfunc is new (marked white). */[m
[31m-  for (i = 0; i < nuv; i++) {[m
[31m-    GCupval *uv = func_emptyuv(L);[m
[31m-    uv->dhash = (uint32_t)(uintptr_t)pt ^ ((uint32_t)proto_uv(pt)[i] << 24);[m
[31m-    setgcref(fn->l.uvptr[i], obj2gco(uv));[m
[31m-  }[m
[31m-  fn->l.nupvalues = (uint8_t)nuv;[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-/* Do a GC check and create a new Lua function with inherited upvalues. */[m
[31m-GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  GCRef *puv;[m
[31m-  MSize i, nuv;[m
[31m-  TValue *base;[m
[31m-  lj_gc_check_fixtop(L);[m
[31m-  fn = func_newL(L, pt, tabref(parent->env));[m
[31m-  /* NOBARRIER: The GCfunc is new (marked white). */[m
[31m-  puv = parent->uvptr;[m
[31m-  nuv = pt->sizeuv;[m
[31m-  base = L->base;[m
[31m-  for (i = 0; i < nuv; i++) {[m
[31m-    uint32_t v = proto_uv(pt)[i];[m
[31m-    GCupval *uv;[m
[31m-    if ((v & PROTO_UV_LOCAL)) {[m
[31m-      uv = func_finduv(L, base + (v & 0xff));[m
[31m-      uv->immutable = ((v / PROTO_UV_IMMUTABLE) & 1);[m
[31m-      uv->dhash = (uint32_t)(uintptr_t)mref(parent->pc, char) ^ (v << 24);[m
[31m-    } else {[m
[31m-      uv = &gcref(puv[v])->uv;[m
[31m-    }[m
[31m-    setgcref(fn->l.uvptr[i], obj2gco(uv));[m
[31m-  }[m
[31m-  fn->l.nupvalues = (uint8_t)nuv;[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_func_free(global_State *g, GCfunc *fn)[m
[31m-{[m
[31m-  MSize size = isluafunc(fn) ? sizeLfunc((MSize)fn->l.nupvalues) :[m
[31m-			       sizeCfunc((MSize)fn->c.nupvalues);[m
[31m-  lj_mem_free(g, fn, size);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_func.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_func.h[m
[1mdeleted file mode 100644[m
[1mindex e0c3c55..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_func.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-/*[m
[31m-** Function handling (prototypes, functions and upvalues).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_FUNC_H[m
[31m-#define _LJ_FUNC_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Prototypes. */[m
[31m-LJ_FUNC void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt);[m
[31m-[m
[31m-/* Upvalues. */[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_func_closeuv(lua_State *L, TValue *level);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_func_freeuv(global_State *g, GCupval *uv);[m
[31m-[m
[31m-/* Functions (closures). */[m
[31m-LJ_FUNC GCfunc *lj_func_newC(lua_State *L, MSize nelems, GCtab *env);[m
[31m-LJ_FUNC GCfunc *lj_func_newL_empty(lua_State *L, GCproto *pt, GCtab *env);[m
[31m-LJ_FUNCA GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_func_free(global_State *g, GCfunc *c);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gc.c[m
[1mdeleted file mode 100644[m
[1mindex 53f1d97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gc.c[m
[1m+++ /dev/null[m
[36m@@ -1,845 +0,0 @@[m
[31m-/*[m
[31m-** Garbage collector.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_gc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_udata.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#endif[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-#define GCSTEPSIZE	1024u[m
[31m-#define GCSWEEPMAX	40[m
[31m-#define GCSWEEPCOST	10[m
[31m-#define GCFINALIZECOST	100[m
[31m-[m
[31m-/* Macros to set GCobj colors and flags. */[m
[31m-#define white2gray(x)		((x)->gch.marked &= (uint8_t)~LJ_GC_WHITES)[m
[31m-#define gray2black(x)		((x)->gch.marked |= LJ_GC_BLACK)[m
[31m-#define isfinalized(u)		((u)->marked & LJ_GC_FINALIZED)[m
[31m-[m
[31m-/* -- Mark phase ---------------------------------------------------------- */[m
[31m-[m
[31m-/* Mark a TValue (if needed). */[m
[31m-#define gc_marktv(g, tv) \[m
[31m-  { lua_assert(!tvisgcv(tv) || (~itype(tv) == gcval(tv)->gch.gct)); \[m
[31m-    if (tviswhite(tv)) gc_mark(g, gcV(tv)); }[m
[31m-[m
[31m-/* Mark a GCobj (if needed). */[m
[31m-#define gc_markobj(g, o) \[m
[31m-  { if (iswhite(obj2gco(o))) gc_mark(g, obj2gco(o)); }[m
[31m-[m
[31m-/* Mark a string object. */[m
[31m-#define gc_mark_str(s)		((s)->marked &= (uint8_t)~LJ_GC_WHITES)[m
[31m-[m
[31m-/* Mark a white GCobj. */[m
[31m-static void gc_mark(global_State *g, GCobj *o)[m
[31m-{[m
[31m-  int gct = o->gch.gct;[m
[31m-  lua_assert(iswhite(o) && !isdead(g, o));[m
[31m-  white2gray(o);[m
[31m-  if (LJ_UNLIKELY(gct == ~LJ_TUDATA)) {[m
[31m-    GCtab *mt = tabref(gco2ud(o)->metatable);[m
[31m-    gray2black(o);  /* Userdata are never gray. */[m
[31m-    if (mt) gc_markobj(g, mt);[m
[31m-    gc_markobj(g, tabref(gco2ud(o)->env));[m
[31m-  } else if (LJ_UNLIKELY(gct == ~LJ_TUPVAL)) {[m
[31m-    GCupval *uv = gco2uv(o);[m
[31m-    gc_marktv(g, uvval(uv));[m
[31m-    if (uv->closed)[m
[31m-      gray2black(o);  /* Closed upvalues are never gray. */[m
[31m-  } else if (gct != ~LJ_TSTR && gct != ~LJ_TCDATA) {[m
[31m-    lua_assert(gct == ~LJ_TFUNC || gct == ~LJ_TTAB ||[m
[31m-	       gct == ~LJ_TTHREAD || gct == ~LJ_TPROTO || gct == ~LJ_TTRACE);[m
[31m-    setgcrefr(o->gch.gclist, g->gc.gray);[m
[31m-    setgcref(g->gc.gray, o);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Mark GC roots. */[m
[31m-static void gc_mark_gcroot(global_State *g)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = 0; i < GCROOT_MAX; i++)[m
[31m-    if (gcref(g->gcroot[i]) != NULL)[m
[31m-      gc_markobj(g, gcref(g->gcroot[i]));[m
[31m-}[m
[31m-[m
[31m-/* Start a GC cycle and mark the root set. */[m
[31m-static void gc_mark_start(global_State *g)[m
[31m-{[m
[31m-  setgcrefnull(g->gc.gray);[m
[31m-  setgcrefnull(g->gc.grayagain);[m
[31m-  setgcrefnull(g->gc.weak);[m
[31m-  gc_markobj(g, mainthread(g));[m
[31m-  gc_markobj(g, tabref(mainthread(g)->env));[m
[31m-  gc_marktv(g, &g->registrytv);[m
[31m-  gc_mark_gcroot(g);[m
[31m-  g->gc.state = GCSpropagate;[m
[31m-}[m
[31m-[m
[31m-/* Mark open upvalues. */[m
[31m-static void gc_mark_uv(global_State *g)[m
[31m-{[m
[31m-  GCupval *uv;[m
[31m-  for (uv = uvnext(&g->uvhead); uv != &g->uvhead; uv = uvnext(uv)) {[m
[31m-    lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv);[m
[31m-    if (isgray(obj2gco(uv)))[m
[31m-      gc_marktv(g, uvval(uv));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Mark userdata in mmudata list. */[m
[31m-static void gc_mark_mmudata(global_State *g)[m
[31m-{[m
[31m-  GCobj *root = gcref(g->gc.mmudata);[m
[31m-  GCobj *u = root;[m
[31m-  if (u) {[m
[31m-    do {[m
[31m-      u = gcnext(u);[m
[31m-      makewhite(g, u);  /* Could be from previous GC. */[m
[31m-      gc_mark(g, u);[m
[31m-    } while (u != root);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Separate userdata objects to be finalized to mmudata list. */[m
[31m-size_t lj_gc_separateudata(global_State *g, int all)[m
[31m-{[m
[31m-  size_t m = 0;[m
[31m-  GCRef *p = &mainthread(g)->nextgc;[m
[31m-  GCobj *o;[m
[31m-  while ((o = gcref(*p)) != NULL) {[m
[31m-    if (!(iswhite(o) || all) || isfinalized(gco2ud(o))) {[m
[31m-      p = &o->gch.nextgc;  /* Nothing to do. */[m
[31m-    } else if (!lj_meta_fastg(g, tabref(gco2ud(o)->metatable), MM_gc)) {[m
[31m-      markfinalized(o);  /* Done, as there's no __gc metamethod. */[m
[31m-      p = &o->gch.nextgc;[m
[31m-    } else {  /* Otherwise move userdata to be finalized to mmudata list. */[m
[31m-      m += sizeudata(gco2ud(o));[m
[31m-      markfinalized(o);[m
[31m-      *p = o->gch.nextgc;[m
[31m-      if (gcref(g->gc.mmudata)) {  /* Link to end of mmudata list. */[m
[31m-	GCobj *root = gcref(g->gc.mmudata);[m
[31m-	setgcrefr(o->gch.nextgc, root->gch.nextgc);[m
[31m-	setgcref(root->gch.nextgc, o);[m
[31m-	setgcref(g->gc.mmudata, o);[m
[31m-      } else {  /* Create circular list. */[m
[31m-	setgcref(o->gch.nextgc, o);[m
[31m-	setgcref(g->gc.mmudata, o);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return m;[m
[31m-}[m
[31m-[m
[31m-/* -- Propagation phase --------------------------------------------------- */[m
[31m-[m
[31m-/* Traverse a table. */[m
[31m-static int gc_traverse_tab(global_State *g, GCtab *t)[m
[31m-{[m
[31m-  int weak = 0;[m
[31m-  cTValue *mode;[m
[31m-  GCtab *mt = tabref(t->metatable);[m
[31m-  if (mt)[m
[31m-    gc_markobj(g, mt);[m
[31m-  mode = lj_meta_fastg(g, mt, MM_mode);[m
[31m-  if (mode && tvisstr(mode)) {  /* Valid __mode field? */[m
[31m-    const char *modestr = strVdata(mode);[m
[31m-    int c;[m
[31m-    while ((c = *modestr++)) {[m
[31m-      if (c == 'k') weak |= LJ_GC_WEAKKEY;[m
[31m-      else if (c == 'v') weak |= LJ_GC_WEAKVAL;[m
[31m-      else if (c == 'K') weak = (int)(~0u & ~LJ_GC_WEAKVAL);[m
[31m-    }[m
[31m-    if (weak > 0) {  /* Weak tables are cleared in the atomic phase. */[m
[31m-      t->marked = (uint8_t)((t->marked & ~LJ_GC_WEAK) | weak);[m
[31m-      setgcrefr(t->gclist, g->gc.weak);[m
[31m-      setgcref(g->gc.weak, obj2gco(t));[m
[31m-    }[m
[31m-  }[m
[31m-  if (weak == LJ_GC_WEAK)  /* Nothing to mark if both keys/values are weak. */[m
[31m-    return 1;[m
[31m-  if (!(weak & LJ_GC_WEAKVAL)) {  /* Mark array part. */[m
[31m-    MSize i, asize = t->asize;[m
[31m-    for (i = 0; i < asize; i++)[m
[31m-      gc_marktv(g, arrayslot(t, i));[m
[31m-  }[m
[31m-  if (t->hmask > 0) {  /* Mark hash part. */[m
[31m-    Node *node = noderef(t->node);[m
[31m-    MSize i, hmask = t->hmask;[m
[31m-    for (i = 0; i <= hmask; i++) {[m
[31m-      Node *n = &node[i];[m
[31m-      if (!tvisnil(&n->val)) {  /* Mark non-empty slot. */[m
[31m-	lua_assert(!tvisnil(&n->key));[m
[31m-	if (!(weak & LJ_GC_WEAKKEY)) gc_marktv(g, &n->key);[m
[31m-	if (!(weak & LJ_GC_WEAKVAL)) gc_marktv(g, &n->val);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return weak;[m
[31m-}[m
[31m-[m
[31m-/* Traverse a function. */[m
[31m-static void gc_traverse_func(global_State *g, GCfunc *fn)[m
[31m-{[m
[31m-  gc_markobj(g, tabref(fn->c.env));[m
[31m-  if (isluafunc(fn)) {[m
[31m-    uint32_t i;[m
[31m-    lua_assert(fn->l.nupvalues <= funcproto(fn)->sizeuv);[m
[31m-    gc_markobj(g, funcproto(fn));[m
[31m-    for (i = 0; i < fn->l.nupvalues; i++)  /* Mark Lua function upvalues. */[m
[31m-      gc_markobj(g, &gcref(fn->l.uvptr[i])->uv);[m
[31m-  } else {[m
[31m-    uint32_t i;[m
[31m-    for (i = 0; i < fn->c.nupvalues; i++)  /* Mark C function upvalues. */[m
[31m-      gc_marktv(g, &fn->c.upvalue[i]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Mark a trace. */[m
[31m-static void gc_marktrace(global_State *g, TraceNo traceno)[m
[31m-{[m
[31m-  GCobj *o = obj2gco(traceref(G2J(g), traceno));[m
[31m-  lua_assert(traceno != G2J(g)->cur.traceno);[m
[31m-  if (iswhite(o)) {[m
[31m-    white2gray(o);[m
[31m-    setgcrefr(o->gch.gclist, g->gc.gray);[m
[31m-    setgcref(g->gc.gray, o);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Traverse a trace. */[m
[31m-static void gc_traverse_trace(global_State *g, GCtrace *T)[m
[31m-{[m
[31m-  IRRef ref;[m
[31m-  if (T->traceno == 0) return;[m
[31m-  for (ref = T->nk; ref < REF_TRUE; ref++) {[m
[31m-    IRIns *ir = &T->ir[ref];[m
[31m-    if (ir->o == IR_KGC)[m
[31m-      gc_markobj(g, ir_kgc(ir));[m
[31m-  }[m
[31m-  if (T->link) gc_marktrace(g, T->link);[m
[31m-  if (T->nextroot) gc_marktrace(g, T->nextroot);[m
[31m-  if (T->nextside) gc_marktrace(g, T->nextside);[m
[31m-  gc_markobj(g, gcref(T->startpt));[m
[31m-}[m
[31m-[m
[31m-/* The current trace is a GC root while not anchored in the prototype (yet). */[m
[31m-#define gc_traverse_curtrace(g)	gc_traverse_trace(g, &G2J(g)->cur)[m
[31m-#else[m
[31m-#define gc_traverse_curtrace(g)	UNUSED(g)[m
[31m-#endif[m
[31m-[m
[31m-/* Traverse a prototype. */[m
[31m-static void gc_traverse_proto(global_State *g, GCproto *pt)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  gc_mark_str(proto_chunkname(pt));[m
[31m-  for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++)  /* Mark collectable consts. */[m
[31m-    gc_markobj(g, proto_kgc(pt, i));[m
[31m-#if LJ_HASJIT[m
[31m-  if (pt->trace) gc_marktrace(g, pt->trace);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Traverse the frame structure of a stack. */[m
[31m-static MSize gc_traverse_frames(global_State *g, lua_State *th)[m
[31m-{[m
[31m-  TValue *frame, *top = th->top-1, *bot = tvref(th->stack);[m
[31m-  /* Note: extra vararg frame not skipped, marks function twice (harmless). */[m
[31m-  for (frame = th->base-1; frame > bot+LJ_FR2; frame = frame_prev(frame)) {[m
[31m-    GCfunc *fn = frame_func(frame);[m
[31m-    TValue *ftop = frame;[m
[31m-    if (isluafunc(fn)) ftop += funcproto(fn)->framesize;[m
[31m-    if (ftop > top) top = ftop;[m
[31m-    if (!LJ_FR2) gc_markobj(g, fn);  /* Need to mark hidden function (or L). */[m
[31m-  }[m
[31m-  top++;  /* Correct bias of -1 (frame == base-1). */[m
[31m-  if (top > tvref(th->maxstack)) top = tvref(th->maxstack);[m
[31m-  return (MSize)(top - bot);  /* Return minimum needed stack size. */[m
[31m-}[m
[31m-[m
[31m-/* Traverse a thread object. */[m
[31m-static void gc_traverse_thread(global_State *g, lua_State *th)[m
[31m-{[m
[31m-  TValue *o, *top = th->top;[m
[31m-  for (o = tvref(th->stack)+1+LJ_FR2; o < top; o++)[m
[31m-    gc_marktv(g, o);[m
[31m-  if (g->gc.state == GCSatomic) {[m
[31m-    top = tvref(th->stack) + th->stacksize;[m
[31m-    for (; o < top; o++)  /* Clear unmarked slots. */[m
[31m-      setnilV(o);[m
[31m-  }[m
[31m-  gc_markobj(g, tabref(th->env));[m
[31m-  lj_state_shrinkstack(th, gc_traverse_frames(g, th));[m
[31m-}[m
[31m-[m
[31m-/* Propagate one gray object. Traverse it and turn it black. */[m
[31m-static size_t propagatemark(global_State *g)[m
[31m-{[m
[31m-  GCobj *o = gcref(g->gc.gray);[m
[31m-  int gct = o->gch.gct;[m
[31m-  lua_assert(isgray(o));[m
[31m-  gray2black(o);[m
[31m-  setgcrefr(g->gc.gray, o->gch.gclist);  /* Remove from gray list. */[m
[31m-  if (LJ_LIKELY(gct == ~LJ_TTAB)) {[m
[31m-    GCtab *t = gco2tab(o);[m
[31m-    if (gc_traverse_tab(g, t) > 0)[m
[31m-      black2gray(o);  /* Keep weak tables gray. */[m
[31m-    return sizeof(GCtab) + sizeof(TValue) * t->asize +[m
[31m-			   sizeof(Node) * (t->hmask + 1);[m
[31m-  } else if (LJ_LIKELY(gct == ~LJ_TFUNC)) {[m
[31m-    GCfunc *fn = gco2func(o);[m
[31m-    gc_traverse_func(g, fn);[m
[31m-    return isluafunc(fn) ? sizeLfunc((MSize)fn->l.nupvalues) :[m
[31m-			   sizeCfunc((MSize)fn->c.nupvalues);[m
[31m-  } else if (LJ_LIKELY(gct == ~LJ_TPROTO)) {[m
[31m-    GCproto *pt = gco2pt(o);[m
[31m-    gc_traverse_proto(g, pt);[m
[31m-    return pt->sizept;[m
[31m-  } else if (LJ_LIKELY(gct == ~LJ_TTHREAD)) {[m
[31m-    lua_State *th = gco2th(o);[m
[31m-    setgcrefr(th->gclist, g->gc.grayagain);[m
[31m-    setgcref(g->gc.grayagain, o);[m
[31m-    black2gray(o);  /* Threads are never black. */[m
[31m-    gc_traverse_thread(g, th);[m
[31m-    return sizeof(lua_State) + sizeof(TValue) * th->stacksize;[m
[31m-  } else {[m
[31m-#if LJ_HASJIT[m
[31m-    GCtrace *T = gco2trace(o);[m
[31m-    gc_traverse_trace(g, T);[m
[31m-    return ((sizeof(GCtrace)+7)&~7) + (T->nins-T->nk)*sizeof(IRIns) +[m
[31m-	   T->nsnap*sizeof(SnapShot) + T->nsnapmap*sizeof(SnapEntry);[m
[31m-#else[m
[31m-    lua_assert(0);[m
[31m-    return 0;[m
[31m-#endif[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Propagate all gray objects. */[m
[31m-static size_t gc_propagate_gray(global_State *g)[m
[31m-{[m
[31m-  size_t m = 0;[m
[31m-  while (gcref(g->gc.gray) != NULL)[m
[31m-    m += propagatemark(g);[m
[31m-  return m;[m
[31m-}[m
[31m-[m
[31m-/* -- Sweep phase --------------------------------------------------------- */[m
[31m-[m
[31m-/* Type of GC free functions. */[m
[31m-typedef void (LJ_FASTCALL *GCFreeFunc)(global_State *g, GCobj *o);[m
[31m-[m
[31m-/* GC free functions for LJ_TSTR .. LJ_TUDATA. ORDER LJ_T */[m
[31m-static const GCFreeFunc gc_freefunc[] = {[m
[31m-  (GCFreeFunc)lj_str_free,[m
[31m-  (GCFreeFunc)lj_func_freeuv,[m
[31m-  (GCFreeFunc)lj_state_free,[m
[31m-  (GCFreeFunc)lj_func_freeproto,[m
[31m-  (GCFreeFunc)lj_func_free,[m
[31m-#if LJ_HASJIT[m
[31m-  (GCFreeFunc)lj_trace_free,[m
[31m-#else[m
[31m-  (GCFreeFunc)0,[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-  (GCFreeFunc)lj_cdata_free,[m
[31m-#else[m
[31m-  (GCFreeFunc)0,[m
[31m-#endif[m
[31m-  (GCFreeFunc)lj_tab_free,[m
[31m-  (GCFreeFunc)lj_udata_free[m
[31m-};[m
[31m-[m
[31m-/* Full sweep of a GC list. */[m
[31m-#define gc_fullsweep(g, p)	gc_sweep(g, (p), ~(uint32_t)0)[m
[31m-[m
[31m-/* Partial sweep of a GC list. */[m
[31m-static GCRef *gc_sweep(global_State *g, GCRef *p, uint32_t lim)[m
[31m-{[m
[31m-  /* Mask with other white and LJ_GC_FIXED. Or LJ_GC_SFIXED on shutdown. */[m
[31m-  int ow = otherwhite(g);[m
[31m-  GCobj *o;[m
[31m-  while ((o = gcref(*p)) != NULL && lim-- > 0) {[m
[31m-    if (o->gch.gct == ~LJ_TTHREAD)  /* Need to sweep open upvalues, too. */[m
[31m-      gc_fullsweep(g, &gco2th(o)->openupval);[m
[31m-    if (((o->gch.marked ^ LJ_GC_WHITES) & ow)) {  /* Black or current white? */[m
[31m-      lua_assert(!isdead(g, o) || (o->gch.marked & LJ_GC_FIXED));[m
[31m-      makewhite(g, o);  /* Value is alive, change to the current white. */[m
[31m-      p = &o->gch.nextgc;[m
[31m-    } else {  /* Otherwise value is dead, free it. */[m
[31m-      lua_assert(isdead(g, o) || ow == LJ_GC_SFIXED);[m
[31m-      setgcrefr(*p, o->gch.nextgc);[m
[31m-      if (o == gcref(g->gc.root))[m
[31m-	setgcrefr(g->gc.root, o->gch.nextgc);  /* Adjust list anchor. */[m
[31m-      gc_freefunc[o->gch.gct - ~LJ_TSTR](g, o);[m
[31m-    }[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Check whether we can clear a key or a value slot from a table. */[m
[31m-static int gc_mayclear(cTValue *o, int val)[m
[31m-{[m
[31m-  if (tvisgcv(o)) {  /* Only collectable objects can be weak references. */[m
[31m-    if (tvisstr(o)) {  /* But strings cannot be used as weak references. */[m
[31m-      gc_mark_str(strV(o));  /* And need to be marked. */[m
[31m-      return 0;[m
[31m-    }[m
[31m-    if (iswhite(gcV(o)))[m
[31m-      return 1;  /* Object is about to be collected. */[m
[31m-    if (tvisudata(o) && val && isfinalized(udataV(o)))[m
[31m-      return 1;  /* Finalized userdata is dropped only from values. */[m
[31m-  }[m
[31m-  return 0;  /* Cannot clear. */[m
[31m-}[m
[31m-[m
[31m-/* Clear collected entries from weak tables. */[m
[31m-static void gc_clearweak(GCobj *o)[m
[31m-{[m
[31m-  while (o) {[m
[31m-    GCtab *t = gco2tab(o);[m
[31m-    lua_assert((t->marked & LJ_GC_WEAK));[m
[31m-    if ((t->marked & LJ_GC_WEAKVAL)) {[m
[31m-      MSize i, asize = t->asize;[m
[31m-      for (i = 0; i < asize; i++) {[m
[31m-	/* Clear array slot when value is about to be collected. */[m
[31m-	TValue *tv = arrayslot(t, i);[m
[31m-	if (gc_mayclear(tv, 1))[m
[31m-	  setnilV(tv);[m
[31m-      }[m
[31m-    }[m
[31m-    if (t->hmask > 0) {[m
[31m-      Node *node = noderef(t->node);[m
[31m-      MSize i, hmask = t->hmask;[m
[31m-      for (i = 0; i <= hmask; i++) {[m
[31m-	Node *n = &node[i];[m
[31m-	/* Clear hash slot when key or value is about to be collected. */[m
[31m-	if (!tvisnil(&n->val) && (gc_mayclear(&n->key, 0) ||[m
[31m-				  gc_mayclear(&n->val, 1)))[m
[31m-	  setnilV(&n->val);[m
[31m-      }[m
[31m-    }[m
[31m-    o = gcref(t->gclist);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Call a userdata or cdata finalizer. */[m
[31m-static void gc_call_finalizer(global_State *g, lua_State *L,[m
[31m-			      cTValue *mo, GCobj *o)[m
[31m-{[m
[31m-  /* Save and restore lots of state around the __gc callback. */[m
[31m-  uint8_t oldh = hook_save(g);[m
[31m-  GCSize oldt = g->gc.threshold;[m
[31m-  int errcode;[m
[31m-  TValue *top;[m
[31m-  lj_trace_abort(g);[m
[31m-  hook_entergc(g);  /* Disable hooks and new traces during __gc. */[m
[31m-  g->gc.threshold = LJ_MAX_MEM;  /* Prevent GC steps. */[m
[31m-  top = L->top;[m
[31m-  copyTV(L, top++, mo);[m
[31m-  if (LJ_FR2) setnilV(top++);[m
[31m-  setgcV(L, top, o, ~o->gch.gct);[m
[31m-  L->top = top+1;[m
[31m-  errcode = lj_vm_pcall(L, top, 1+0, -1);  /* Stack: |mo|o| -> | */[m
[31m-  hook_restore(g, oldh);[m
[31m-  g->gc.threshold = oldt;  /* Restore GC threshold. */[m
[31m-  if (errcode)[m
[31m-    lj_err_throw(L, errcode);  /* Propagate errors. */[m
[31m-}[m
[31m-[m
[31m-/* Finalize one userdata or cdata object from the mmudata list. */[m
[31m-static void gc_finalize(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCobj *o = gcnext(gcref(g->gc.mmudata));[m
[31m-  cTValue *mo;[m
[31m-  lua_assert(tvref(g->jit_base) == NULL);  /* Must not be called on trace. */[m
[31m-  /* Unchain from list of userdata to be finalized. */[m
[31m-  if (o == gcref(g->gc.mmudata))[m
[31m-    setgcrefnull(g->gc.mmudata);[m
[31m-  else[m
[31m-    setgcrefr(gcref(g->gc.mmudata)->gch.nextgc, o->gch.nextgc);[m
[31m-#if LJ_HASFFI[m
[31m-  if (o->gch.gct == ~LJ_TCDATA) {[m
[31m-    TValue tmp, *tv;[m
[31m-    /* Add cdata back to the GC list and make it white. */[m
[31m-    setgcrefr(o->gch.nextgc, g->gc.root);[m
[31m-    setgcref(g->gc.root, o);[m
[31m-    makewhite(g, o);[m
[31m-    o->gch.marked &= (uint8_t)~LJ_GC_CDATA_FIN;[m
[31m-    /* Resolve finalizer. */[m
[31m-    setcdataV(L, &tmp, gco2cd(o));[m
[31m-    tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp);[m
[31m-    if (!tvisnil(tv)) {[m
[31m-      g->gc.nocdatafin = 0;[m
[31m-      copyTV(L, &tmp, tv);[m
[31m-      setnilV(tv);  /* Clear entry in finalizer table. */[m
[31m-      gc_call_finalizer(g, L, &tmp, o);[m
[31m-    }[m
[31m-    return;[m
[31m-  }[m
[31m-#endif[m
[31m-  /* Add userdata back to the main userdata list and make it white. */[m
[31m-  setgcrefr(o->gch.nextgc, mainthread(g)->nextgc);[m
[31m-  setgcref(mainthread(g)->nextgc, o);[m
[31m-  makewhite(g, o);[m
[31m-  /* Resolve the __gc metamethod. */[m
[31m-  mo = lj_meta_fastg(g, tabref(gco2ud(o)->metatable), MM_gc);[m
[31m-  if (mo)[m
[31m-    gc_call_finalizer(g, L, mo, o);[m
[31m-}[m
[31m-[m
[31m-/* Finalize all userdata objects from mmudata list. */[m
[31m-void lj_gc_finalize_udata(lua_State *L)[m
[31m-{[m
[31m-  while (gcref(G(L)->gc.mmudata) != NULL)[m
[31m-    gc_finalize(L);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Finalize all cdata objects from finalizer table. */[m
[31m-void lj_gc_finalize_cdata(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  CTState *cts = ctype_ctsG(g);[m
[31m-  if (cts) {[m
[31m-    GCtab *t = cts->finalizer;[m
[31m-    Node *node = noderef(t->node);[m
[31m-    ptrdiff_t i;[m
[31m-    setgcrefnull(t->metatable);  /* Mark finalizer table as disabled. */[m
[31m-    for (i = (ptrdiff_t)t->hmask; i >= 0; i--)[m
[31m-      if (!tvisnil(&node[i].val) && tviscdata(&node[i].key)) {[m
[31m-	GCobj *o = gcV(&node[i].key);[m
[31m-	TValue tmp;[m
[31m-	makewhite(g, o);[m
[31m-	o->gch.marked &= (uint8_t)~LJ_GC_CDATA_FIN;[m
[31m-	copyTV(L, &tmp, &node[i].val);[m
[31m-	setnilV(&node[i].val);[m
[31m-	gc_call_finalizer(g, L, &tmp, o);[m
[31m-      }[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Free all remaining GC objects. */[m
[31m-void lj_gc_freeall(global_State *g)[m
[31m-{[m
[31m-  MSize i, strmask;[m
[31m-  /* Free everything, except super-fixed objects (the main thread). */[m
[31m-  g->gc.currentwhite = LJ_GC_WHITES | LJ_GC_SFIXED;[m
[31m-  gc_fullsweep(g, &g->gc.root);[m
[31m-  strmask = g->strmask;[m
[31m-  for (i = 0; i <= strmask; i++)  /* Free all string hash chains. */[m
[31m-    gc_fullsweep(g, &g->strhash[i]);[m
[31m-}[m
[31m-[m
[31m-/* -- Collector ----------------------------------------------------------- */[m
[31m-[m
[31m-/* Atomic part of the GC cycle, transitioning from mark to sweep phase. */[m
[31m-static void atomic(global_State *g, lua_State *L)[m
[31m-{[m
[31m-  size_t udsize;[m
[31m-[m
[31m-  gc_mark_uv(g);  /* Need to remark open upvalues (the thread may be dead). */[m
[31m-  gc_propagate_gray(g);  /* Propagate any left-overs. */[m
[31m-[m
[31m-  setgcrefr(g->gc.gray, g->gc.weak);  /* Empty the list of weak tables. */[m
[31m-  setgcrefnull(g->gc.weak);[m
[31m-  lua_assert(!iswhite(obj2gco(mainthread(g))));[m
[31m-  gc_markobj(g, L);  /* Mark running thread. */[m
[31m-  gc_traverse_curtrace(g);  /* Traverse current trace. */[m
[31m-  gc_mark_gcroot(g);  /* Mark GC roots (again). */[m
[31m-  gc_propagate_gray(g);  /* Propagate all of the above. */[m
[31m-[m
[31m-  setgcrefr(g->gc.gray, g->gc.grayagain);  /* Empty the 2nd chance list. */[m
[31m-  setgcrefnull(g->gc.grayagain);[m
[31m-  gc_propagate_gray(g);  /* Propagate it. */[m
[31m-[m
[31m-  udsize = lj_gc_separateudata(g, 0);  /* Separate userdata to be finalized. */[m
[31m-  gc_mark_mmudata(g);  /* Mark them. */[m
[31m-  udsize += gc_propagate_gray(g);  /* And propagate the marks. */[m
[31m-[m
[31m-  /* All marking done, clear weak tables. */[m
[31m-  gc_clearweak(gcref(g->gc.weak));[m
[31m-[m
[31m-  lj_buf_shrink(L, &g->tmpbuf);  /* Shrink temp buffer. */[m
[31m-[m
[31m-  /* Prepare for sweep phase. */[m
[31m-  g->gc.currentwhite = (uint8_t)otherwhite(g);  /* Flip current white. */[m
[31m-  g->strempty.marked = g->gc.currentwhite;[m
[31m-  setmref(g->gc.sweep, &g->gc.root);[m
[31m-  g->gc.estimate = g->gc.total - (GCSize)udsize;  /* Initial estimate. */[m
[31m-}[m
[31m-[m
[31m-/* GC state machine. Returns a cost estimate for each step performed. */[m
[31m-static size_t gc_onestep(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  switch (g->gc.state) {[m
[31m-  case GCSpause:[m
[31m-    gc_mark_start(g);  /* Start a new GC cycle by marking all GC roots. */[m
[31m-    return 0;[m
[31m-  case GCSpropagate:[m
[31m-    if (gcref(g->gc.gray) != NULL)[m
[31m-      return propagatemark(g);  /* Propagate one gray object. */[m
[31m-    g->gc.state = GCSatomic;  /* End of mark phase. */[m
[31m-    return 0;[m
[31m-  case GCSatomic:[m
[31m-    if (tvref(g->jit_base))  /* Don't run atomic phase on trace. */[m
[31m-      return LJ_MAX_MEM;[m
[31m-    atomic(g, L);[m
[31m-    g->gc.state = GCSsweepstring;  /* Start of sweep phase. */[m
[31m-    g->gc.sweepstr = 0;[m
[31m-    return 0;[m
[31m-  case GCSsweepstring: {[m
[31m-    GCSize old = g->gc.total;[m
[31m-    gc_fullsweep(g, &g->strhash[g->gc.sweepstr++]);  /* Sweep one chain. */[m
[31m-    if (g->gc.sweepstr > g->strmask)[m
[31m-      g->gc.state = GCSsweep;  /* All string hash chains sweeped. */[m
[31m-    lua_assert(old >= g->gc.total);[m
[31m-    g->gc.estimate -= old - g->gc.total;[m
[31m-    return GCSWEEPCOST;[m
[31m-    }[m
[31m-  case GCSsweep: {[m
[31m-    GCSize old = g->gc.total;[m
[31m-    setmref(g->gc.sweep, gc_sweep(g, mref(g->gc.sweep, GCRef), GCSWEEPMAX));[m
[31m-    lua_assert(old >= g->gc.total);[m
[31m-    g->gc.estimate -= old - g->gc.total;[m
[31m-    if (gcref(*mref(g->gc.sweep, GCRef)) == NULL) {[m
[31m-      if (g->strnum <= (g->strmask >> 2) && g->strmask > LJ_MIN_STRTAB*2-1)[m
[31m-	lj_str_resize(L, g->strmask >> 1);  /* Shrink string table. */[m
[31m-      if (gcref(g->gc.mmudata)) {  /* Need any finalizations? */[m
[31m-	g->gc.state = GCSfinalize;[m
[31m-#if LJ_HASFFI[m
[31m-	g->gc.nocdatafin = 1;[m
[31m-#endif[m
[31m-      } else {  /* Otherwise skip this phase to help the JIT. */[m
[31m-	g->gc.state = GCSpause;  /* End of GC cycle. */[m
[31m-	g->gc.debt = 0;[m
[31m-      }[m
[31m-    }[m
[31m-    return GCSWEEPMAX*GCSWEEPCOST;[m
[31m-    }[m
[31m-  case GCSfinalize:[m
[31m-    if (gcref(g->gc.mmudata) != NULL) {[m
[31m-      if (tvref(g->jit_base))  /* Don't call finalizers on trace. */[m
[31m-	return LJ_MAX_MEM;[m
[31m-      gc_finalize(L);  /* Finalize one userdata object. */[m
[31m-      if (g->gc.estimate > GCFINALIZECOST)[m
[31m-	g->gc.estimate -= GCFINALIZECOST;[m
[31m-      return GCFINALIZECOST;[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (!g->gc.nocdatafin) lj_tab_rehash(L, ctype_ctsG(g)->finalizer);[m
[31m-#endif[m
[31m-    g->gc.state = GCSpause;  /* End of GC cycle. */[m
[31m-    g->gc.debt = 0;[m
[31m-    return 0;[m
[31m-  default:[m
[31m-    lua_assert(0);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Perform a limited amount of incremental GC steps. */[m
[31m-int LJ_FASTCALL lj_gc_step(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCSize lim;[m
[31m-  int32_t ostate = g->vmstate;[m
[31m-  setvmstate(g, GC);[m
[31m-  lim = (GCSTEPSIZE/100) * g->gc.stepmul;[m
[31m-  if (lim == 0)[m
[31m-    lim = LJ_MAX_MEM;[m
[31m-  if (g->gc.total > g->gc.threshold)[m
[31m-    g->gc.debt += g->gc.total - g->gc.threshold;[m
[31m-  do {[m
[31m-    lim -= (GCSize)gc_onestep(L);[m
[31m-    if (g->gc.state == GCSpause) {[m
[31m-      g->gc.threshold = (g->gc.estimate/100) * g->gc.pause;[m
[31m-      g->vmstate = ostate;[m
[31m-      return 1;  /* Finished a GC cycle. */[m
[31m-    }[m
[31m-  } while (sizeof(lim) == 8 ? ((int64_t)lim > 0) : ((int32_t)lim > 0));[m
[31m-  if (g->gc.debt < GCSTEPSIZE) {[m
[31m-    g->gc.threshold = g->gc.total + GCSTEPSIZE;[m
[31m-    g->vmstate = ostate;[m
[31m-    return -1;[m
[31m-  } else {[m
[31m-    g->gc.debt -= GCSTEPSIZE;[m
[31m-    g->gc.threshold = g->gc.total;[m
[31m-    g->vmstate = ostate;[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Ditto, but fix the stack top first. */[m
[31m-void LJ_FASTCALL lj_gc_step_fixtop(lua_State *L)[m
[31m-{[m
[31m-  if (curr_funcisL(L)) L->top = curr_topL(L);[m
[31m-  lj_gc_step(L);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Perform multiple GC steps. Called from JIT-compiled code. */[m
[31m-int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps)[m
[31m-{[m
[31m-  lua_State *L = gco2th(gcref(g->cur_L));[m
[31m-  L->base = tvref(G(L)->jit_base);[m
[31m-  L->top = curr_topL(L);[m
[31m-  while (steps-- > 0 && lj_gc_step(L) == 0)[m
[31m-    ;[m
[31m-  /* Return 1 to force a trace exit. */[m
[31m-  return (G(L)->gc.state == GCSatomic || G(L)->gc.state == GCSfinalize);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Perform a full GC cycle. */[m
[31m-void lj_gc_fullgc(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  int32_t ostate = g->vmstate;[m
[31m-  setvmstate(g, GC);[m
[31m-  if (g->gc.state <= GCSatomic) {  /* Caught somewhere in the middle. */[m
[31m-    setmref(g->gc.sweep, &g->gc.root);  /* Sweep everything (preserving it). */[m
[31m-    setgcrefnull(g->gc.gray);  /* Reset lists from partial propagation. */[m
[31m-    setgcrefnull(g->gc.grayagain);[m
[31m-    setgcrefnull(g->gc.weak);[m
[31m-    g->gc.state = GCSsweepstring;  /* Fast forward to the sweep phase. */[m
[31m-    g->gc.sweepstr = 0;[m
[31m-  }[m
[31m-  while (g->gc.state == GCSsweepstring || g->gc.state == GCSsweep)[m
[31m-    gc_onestep(L);  /* Finish sweep. */[m
[31m-  lua_assert(g->gc.state == GCSfinalize || g->gc.state == GCSpause);[m
[31m-  /* Now perform a full GC. */[m
[31m-  g->gc.state = GCSpause;[m
[31m-  do { gc_onestep(L); } while (g->gc.state != GCSpause);[m
[31m-  g->gc.threshold = (g->gc.estimate/100) * g->gc.pause;[m
[31m-  g->vmstate = ostate;[m
[31m-}[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-/* Move the GC propagation frontier forward. */[m
[31m-void lj_gc_barrierf(global_State *g, GCobj *o, GCobj *v)[m
[31m-{[m
[31m-  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));[m
[31m-  lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause);[m
[31m-  lua_assert(o->gch.gct != ~LJ_TTAB);[m
[31m-  /* Preserve invariant during propagation. Otherwise it doesn't matter. */[m
[31m-  if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic)[m
[31m-    gc_mark(g, v);  /* Move frontier forward. */[m
[31m-  else[m
[31m-    makewhite(g, o);  /* Make it white to avoid the following barrier. */[m
[31m-}[m
[31m-[m
[31m-/* Specialized barrier for closed upvalue. Pass &uv->tv. */[m
[31m-void LJ_FASTCALL lj_gc_barrieruv(global_State *g, TValue *tv)[m
[31m-{[m
[31m-#define TV2MARKED(x) \[m
[31m-  (*((uint8_t *)(x) - offsetof(GCupval, tv) + offsetof(GCupval, marked)))[m
[31m-  if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic)[m
[31m-    gc_mark(g, gcV(tv));[m
[31m-  else[m
[31m-    TV2MARKED(tv) = (TV2MARKED(tv) & (uint8_t)~LJ_GC_COLORS) | curwhite(g);[m
[31m-#undef TV2MARKED[m
[31m-}[m
[31m-[m
[31m-/* Close upvalue. Also needs a write barrier. */[m
[31m-void lj_gc_closeuv(global_State *g, GCupval *uv)[m
[31m-{[m
[31m-  GCobj *o = obj2gco(uv);[m
[31m-  /* Copy stack slot to upvalue itself and point to the copy. */[m
[31m-  copyTV(mainthread(g), &uv->tv, uvval(uv));[m
[31m-  setmref(uv->v, &uv->tv);[m
[31m-  uv->closed = 1;[m
[31m-  setgcrefr(o->gch.nextgc, g->gc.root);[m
[31m-  setgcref(g->gc.root, o);[m
[31m-  if (isgray(o)) {  /* A closed upvalue is never gray, so fix this. */[m
[31m-    if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) {[m
[31m-      gray2black(o);  /* Make it black and preserve invariant. */[m
[31m-      if (tviswhite(&uv->tv))[m
[31m-	lj_gc_barrierf(g, o, gcV(&uv->tv));[m
[31m-    } else {[m
[31m-      makewhite(g, o);  /* Make it white, i.e. sweep the upvalue. */[m
[31m-      lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Mark a trace if it's saved during the propagation phase. */[m
[31m-void lj_gc_barriertrace(global_State *g, uint32_t traceno)[m
[31m-{[m
[31m-  if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic)[m
[31m-    gc_marktrace(g, traceno);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Allocator ----------------------------------------------------------- */[m
[31m-[m
[31m-/* Call pluggable memory allocator to allocate or resize a fragment. */[m
[31m-void *lj_mem_realloc(lua_State *L, void *p, GCSize osz, GCSize nsz)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lua_assert((osz == 0) == (p == NULL));[m
[31m-  p = g->allocf(g->allocd, p, osz, nsz);[m
[31m-  if (p == NULL && nsz > 0)[m
[31m-    lj_err_mem(L);[m
[31m-  lua_assert((nsz == 0) == (p == NULL));[m
[31m-  lua_assert(checkptrGC(p));[m
[31m-  g->gc.total = (g->gc.total - osz) + nsz;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Allocate new GC object and link it to the root set. */[m
[31m-void * LJ_FASTCALL lj_mem_newgco(lua_State *L, GCSize size)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCobj *o = (GCobj *)g->allocf(g->allocd, NULL, 0, size);[m
[31m-  if (o == NULL)[m
[31m-    lj_err_mem(L);[m
[31m-  lua_assert(checkptrGC(o));[m
[31m-  g->gc.total += size;[m
[31m-  setgcrefr(o->gch.nextgc, g->gc.root);[m
[31m-  setgcref(g->gc.root, o);[m
[31m-  newwhite(g, o);[m
[31m-  return o;[m
[31m-}[m
[31m-[m
[31m-/* Resize growable vector. */[m
[31m-void *lj_mem_grow(lua_State *L, void *p, MSize *szp, MSize lim, MSize esz)[m
[31m-{[m
[31m-  MSize sz = (*szp) << 1;[m
[31m-  if (sz < LJ_MIN_VECSZ)[m
[31m-    sz = LJ_MIN_VECSZ;[m
[31m-  if (sz > lim)[m
[31m-    sz = lim;[m
[31m-  p = lj_mem_realloc(L, p, (*szp)*esz, sz*esz);[m
[31m-  *szp = sz;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gc.h[m
[1mdeleted file mode 100644[m
[1mindex eee09af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gc.h[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-/*[m
[31m-** Garbage collector.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_GC_H[m
[31m-#define _LJ_GC_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Garbage collector states. Order matters. */[m
[31m-enum {[m
[31m-  GCSpause, GCSpropagate, GCSatomic, GCSsweepstring, GCSsweep, GCSfinalize[m
[31m-};[m
[31m-[m
[31m-/* Bitmasks for marked field of GCobj. */[m
[31m-#define LJ_GC_WHITE0	0x01[m
[31m-#define LJ_GC_WHITE1	0x02[m
[31m-#define LJ_GC_BLACK	0x04[m
[31m-#define LJ_GC_FINALIZED	0x08[m
[31m-#define LJ_GC_WEAKKEY	0x08[m
[31m-#define LJ_GC_WEAKVAL	0x10[m
[31m-#define LJ_GC_CDATA_FIN	0x10[m
[31m-#define LJ_GC_FIXED	0x20[m
[31m-#define LJ_GC_SFIXED	0x40[m
[31m-[m
[31m-#define LJ_GC_WHITES	(LJ_GC_WHITE0 | LJ_GC_WHITE1)[m
[31m-#define LJ_GC_COLORS	(LJ_GC_WHITES | LJ_GC_BLACK)[m
[31m-#define LJ_GC_WEAK	(LJ_GC_WEAKKEY | LJ_GC_WEAKVAL)[m
[31m-[m
[31m-/* Macros to test and set GCobj colors. */[m
[31m-#define iswhite(x)	((x)->gch.marked & LJ_GC_WHITES)[m
[31m-#define isblack(x)	((x)->gch.marked & LJ_GC_BLACK)[m
[31m-#define isgray(x)	(!((x)->gch.marked & (LJ_GC_BLACK|LJ_GC_WHITES)))[m
[31m-#define tviswhite(x)	(tvisgcv(x) && iswhite(gcV(x)))[m
[31m-#define otherwhite(g)	(g->gc.currentwhite ^ LJ_GC_WHITES)[m
[31m-#define isdead(g, v)	((v)->gch.marked & otherwhite(g) & LJ_GC_WHITES)[m
[31m-[m
[31m-#define curwhite(g)	((g)->gc.currentwhite & LJ_GC_WHITES)[m
[31m-#define newwhite(g, x)	(obj2gco(x)->gch.marked = (uint8_t)curwhite(g))[m
[31m-#define makewhite(g, x) \[m
[31m-  ((x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g))[m
[31m-#define flipwhite(x)	((x)->gch.marked ^= LJ_GC_WHITES)[m
[31m-#define black2gray(x)	((x)->gch.marked &= (uint8_t)~LJ_GC_BLACK)[m
[31m-#define fixstring(s)	((s)->marked |= LJ_GC_FIXED)[m
[31m-#define markfinalized(x)	((x)->gch.marked |= LJ_GC_FINALIZED)[m
[31m-[m
[31m-/* Collector. */[m
[31m-LJ_FUNC size_t lj_gc_separateudata(global_State *g, int all);[m
[31m-LJ_FUNC void lj_gc_finalize_udata(lua_State *L);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC void lj_gc_finalize_cdata(lua_State *L);[m
[31m-#else[m
[31m-#define lj_gc_finalize_cdata(L)		UNUSED(L)[m
[31m-#endif[m
[31m-LJ_FUNC void lj_gc_freeall(global_State *g);[m
[31m-LJ_FUNCA int LJ_FASTCALL lj_gc_step(lua_State *L);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_gc_step_fixtop(lua_State *L);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps);[m
[31m-#endif[m
[31m-LJ_FUNC void lj_gc_fullgc(lua_State *L);[m
[31m-[m
[31m-/* GC check: drive collector forward if the GC threshold has been reached. */[m
[31m-#define lj_gc_check(L) \[m
[31m-  { if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) \[m
[31m-      lj_gc_step(L); }[m
[31m-#define lj_gc_check_fixtop(L) \[m
[31m-  { if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) \[m
[31m-      lj_gc_step_fixtop(L); }[m
[31m-[m
[31m-/* Write barriers. */[m
[31m-LJ_FUNC void lj_gc_barrierf(global_State *g, GCobj *o, GCobj *v);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_gc_barrieruv(global_State *g, TValue *tv);[m
[31m-LJ_FUNC void lj_gc_closeuv(global_State *g, GCupval *uv);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC void lj_gc_barriertrace(global_State *g, uint32_t traceno);[m
[31m-#endif[m
[31m-[m
[31m-/* Move the GC propagation frontier back for tables (make it gray again). */[m
[31m-static LJ_AINLINE void lj_gc_barrierback(global_State *g, GCtab *t)[m
[31m-{[m
[31m-  GCobj *o = obj2gco(t);[m
[31m-  lua_assert(isblack(o) && !isdead(g, o));[m
[31m-  lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause);[m
[31m-  black2gray(o);[m
[31m-  setgcrefr(t->gclist, g->gc.grayagain);[m
[31m-  setgcref(g->gc.grayagain, o);[m
[31m-}[m
[31m-[m
[31m-/* Barrier for stores to table objects. TValue and GCobj variant. */[m
[31m-#define lj_gc_anybarriert(L, t)  \[m
[31m-  { if (LJ_UNLIKELY(isblack(obj2gco(t)))) lj_gc_barrierback(G(L), (t)); }[m
[31m-#define lj_gc_barriert(L, t, tv) \[m
[31m-  { if (tviswhite(tv) && isblack(obj2gco(t))) \[m
[31m-      lj_gc_barrierback(G(L), (t)); }[m
[31m-#define lj_gc_objbarriert(L, t, o)  \[m
[31m-  { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) \[m
[31m-      lj_gc_barrierback(G(L), (t)); }[m
[31m-[m
[31m-/* Barrier for stores to any other object. TValue and GCobj variant. */[m
[31m-#define lj_gc_barrier(L, p, tv) \[m
[31m-  { if (tviswhite(tv) && isblack(obj2gco(p))) \[m
[31m-      lj_gc_barrierf(G(L), obj2gco(p), gcV(tv)); }[m
[31m-#define lj_gc_objbarrier(L, p, o) \[m
[31m-  { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \[m
[31m-      lj_gc_barrierf(G(L), obj2gco(p), obj2gco(o)); }[m
[31m-[m
[31m-/* Allocator. */[m
[31m-LJ_FUNC void *lj_mem_realloc(lua_State *L, void *p, GCSize osz, GCSize nsz);[m
[31m-LJ_FUNC void * LJ_FASTCALL lj_mem_newgco(lua_State *L, GCSize size);[m
[31m-LJ_FUNC void *lj_mem_grow(lua_State *L, void *p,[m
[31m-			  MSize *szp, MSize lim, MSize esz);[m
[31m-[m
[31m-#define lj_mem_new(L, s)	lj_mem_realloc(L, NULL, 0, (s))[m
[31m-[m
[31m-static LJ_AINLINE void lj_mem_free(global_State *g, void *p, size_t osize)[m
[31m-{[m
[31m-  g->gc.total -= (GCSize)osize;[m
[31m-  g->allocf(g->allocd, p, osize, 0);[m
[31m-}[m
[31m-[m
[31m-#define lj_mem_newvec(L, n, t)	((t *)lj_mem_new(L, (GCSize)((n)*sizeof(t))))[m
[31m-#define lj_mem_reallocvec(L, p, on, n, t) \[m
[31m-  ((p) = (t *)lj_mem_realloc(L, p, (on)*sizeof(t), (GCSize)((n)*sizeof(t))))[m
[31m-#define lj_mem_growvec(L, p, n, m, t) \[m
[31m-  ((p) = (t *)lj_mem_grow(L, (p), &(n), (m), (MSize)sizeof(t)))[m
[31m-#define lj_mem_freevec(g, p, n, t)	lj_mem_free(g, (p), (n)*sizeof(t))[m
[31m-[m
[31m-#define lj_mem_newobj(L, t)	((t *)lj_mem_newgco(L, sizeof(t)))[m
[31m-#define lj_mem_newt(L, s, t)	((t *)lj_mem_new(L, (s)))[m
[31m-#define lj_mem_freet(g, p)	lj_mem_free(g, (p), sizeof(*(p)))[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gdbjit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gdbjit.c[m
[1mdeleted file mode 100644[m
[1mindex 8b72be7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gdbjit.c[m
[1m+++ /dev/null[m
[36m@@ -1,805 +0,0 @@[m
[31m-/*[m
[31m-** Client for the GDB JIT API.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_gdbjit_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-[m
[31m-/* This is not compiled in by default.[m
[31m-** Enable with -DLUAJIT_USE_GDBJIT in the Makefile and recompile everything.[m
[31m-*/[m
[31m-#ifdef LUAJIT_USE_GDBJIT[m
[31m-[m
[31m-/* The GDB JIT API allows JIT compilers to pass debug information about[m
[31m-** JIT-compiled code back to GDB. You need at least GDB 7.0 or higher[m
[31m-** to see it in action.[m
[31m-**[m
[31m-** This is a passive API, so it works even when not running under GDB[m
[31m-** or when attaching to an already running process. Alas, this implies[m
[31m-** enabling it always has a non-negligible overhead -- do not use in[m
[31m-** release mode![m
[31m-**[m
[31m-** The LuaJIT GDB JIT client is rather minimal at the moment. It gives[m
[31m-** each trace a symbol name and adds a source location and frame unwind[m
[31m-** information. Obviously LuaJIT itself and any embedding C application[m
[31m-** should be compiled with debug symbols, too (see the Makefile).[m
[31m-**[m
[31m-** Traces are named TRACE_1, TRACE_2, ... these correspond to the trace[m
[31m-** numbers from -jv or -jdump. Use "break TRACE_1" or "tbreak TRACE_1" etc.[m
[31m-** to set breakpoints on specific traces (even ahead of their creation).[m
[31m-**[m
[31m-** The source location for each trace allows listing the corresponding[m
[31m-** source lines with the GDB command "list" (but only if the Lua source[m
[31m-** has been loaded from a file). Currently this is always set to the[m
[31m-** location where the trace has been started.[m
[31m-**[m
[31m-** Frame unwind information can be inspected with the GDB command[m
[31m-** "info frame". This also allows proper backtraces across JIT-compiled[m
[31m-** code with the GDB command "bt".[m
[31m-**[m
[31m-** You probably want to add the following settings to a .gdbinit file[m
[31m-** (or add them to ~/.gdbinit):[m
[31m-**   set disassembly-flavor intel[m
[31m-**   set breakpoint pending on[m
[31m-**[m
[31m-** Here's a sample GDB session:[m
[31m-** ------------------------------------------------------------------------[m
[31m-[m
[31m-$ cat >x.lua[m
[31m-for outer=1,100 do[m
[31m-  for inner=1,100 do end[m
[31m-end[m
[31m-^D[m
[31m-[m
[31m-$ luajit -jv x.lua[m
[31m-[TRACE   1 x.lua:2][m
[31m-[TRACE   2 (1/3) x.lua:1 -> 1][m
[31m-[m
[31m-$ gdb --quiet --args luajit x.lua[m
[31m-(gdb) tbreak TRACE_1[m
[31m-Function "TRACE_1" not defined.[m
[31m-Temporary breakpoint 1 (TRACE_1) pending.[m
[31m-(gdb) run[m
[31m-Starting program: luajit x.lua[m
[31m-[m
[31m-Temporary breakpoint 1, TRACE_1 () at x.lua:2[m
[31m-2	  for inner=1,100 do end[m
[31m-(gdb) list[m
[31m-1	for outer=1,100 do[m
[31m-2	  for inner=1,100 do end[m
[31m-3	end[m
[31m-(gdb) bt[m
[31m-#0  TRACE_1 () at x.lua:2[m
[31m-#1  0x08053690 in lua_pcall [...][m
[31m-[...][m
[31m-#7  0x0806ff90 in main [...][m
[31m-(gdb) disass TRACE_1[m
[31m-Dump of assembler code for function TRACE_1:[m
[31m-0xf7fd9fba <TRACE_1+0>:	mov    DWORD PTR ds:0xf7e0e2a0,0x1[m
[31m-0xf7fd9fc4 <TRACE_1+10>:	movsd  xmm7,QWORD PTR [edx+0x20][m
[31m-[...][m
[31m-0xf7fd9ff8 <TRACE_1+62>:	jmp    0xf7fd2014[m
[31m-End of assembler dump.[m
[31m-(gdb) tbreak TRACE_2[m
[31m-Function "TRACE_2" not defined.[m
[31m-Temporary breakpoint 2 (TRACE_2) pending.[m
[31m-(gdb) cont[m
[31m-Continuing.[m
[31m-[m
[31m-Temporary breakpoint 2, TRACE_2 () at x.lua:1[m
[31m-1	for outer=1,100 do[m
[31m-(gdb) info frame[m
[31m-Stack level 0, frame at 0xffffd7c0:[m
[31m- eip = 0xf7fd9f60 in TRACE_2 (x.lua:1); saved eip 0x8053690[m
[31m- called by frame at 0xffffd7e0[m
[31m- source language unknown.[m
[31m- Arglist at 0xffffd78c, args:[m
[31m- Locals at 0xffffd78c, Previous frame's sp is 0xffffd7c0[m
[31m- Saved registers:[m
[31m-  ebx at 0xffffd7ac, ebp at 0xffffd7b8, esi at 0xffffd7b0, edi at 0xffffd7b4,[m
[31m-  eip at 0xffffd7bc[m
[31m-(gdb)[m
[31m-[m
[31m-** ------------------------------------------------------------------------[m
[31m-*/[m
[31m-[m
[31m-/* -- GDB JIT API --------------------------------------------------------- */[m
[31m-[m
[31m-/* GDB JIT actions. */[m
[31m-enum {[m
[31m-  GDBJIT_NOACTION = 0,[m
[31m-  GDBJIT_REGISTER,[m
[31m-  GDBJIT_UNREGISTER[m
[31m-};[m
[31m-[m
[31m-/* GDB JIT entry. */[m
[31m-typedef struct GDBJITentry {[m
[31m-  struct GDBJITentry *next_entry;[m
[31m-  struct GDBJITentry *prev_entry;[m
[31m-  const char *symfile_addr;[m
[31m-  uint64_t symfile_size;[m
[31m-} GDBJITentry;[m
[31m-[m
[31m-/* GDB JIT descriptor. */[m
[31m-typedef struct GDBJITdesc {[m
[31m-  uint32_t version;[m
[31m-  uint32_t action_flag;[m
[31m-  GDBJITentry *relevant_entry;[m
[31m-  GDBJITentry *first_entry;[m
[31m-} GDBJITdesc;[m
[31m-[m
[31m-GDBJITdesc __jit_debug_descriptor = {[m
[31m-  1, GDBJIT_NOACTION, NULL, NULL[m
[31m-};[m
[31m-[m
[31m-/* GDB sets a breakpoint at this function. */[m
[31m-void LJ_NOINLINE __jit_debug_register_code()[m
[31m-{[m
[31m-  __asm__ __volatile__("");[m
[31m-};[m
[31m-[m
[31m-/* -- In-memory ELF object definitions ------------------------------------ */[m
[31m-[m
[31m-/* ELF definitions. */[m
[31m-typedef struct ELFheader {[m
[31m-  uint8_t emagic[4];[m
[31m-  uint8_t eclass;[m
[31m-  uint8_t eendian;[m
[31m-  uint8_t eversion;[m
[31m-  uint8_t eosabi;[m
[31m-  uint8_t eabiversion;[m
[31m-  uint8_t epad[7];[m
[31m-  uint16_t type;[m
[31m-  uint16_t machine;[m
[31m-  uint32_t version;[m
[31m-  uintptr_t entry;[m
[31m-  uintptr_t phofs;[m
[31m-  uintptr_t shofs;[m
[31m-  uint32_t flags;[m
[31m-  uint16_t ehsize;[m
[31m-  uint16_t phentsize;[m
[31m-  uint16_t phnum;[m
[31m-  uint16_t shentsize;[m
[31m-  uint16_t shnum;[m
[31m-  uint16_t shstridx;[m
[31m-} ELFheader;[m
[31m-[m
[31m-typedef struct ELFsectheader {[m
[31m-  uint32_t name;[m
[31m-  uint32_t type;[m
[31m-  uintptr_t flags;[m
[31m-  uintptr_t addr;[m
[31m-  uintptr_t ofs;[m
[31m-  uintptr_t size;[m
[31m-  uint32_t link;[m
[31m-  uint32_t info;[m
[31m-  uintptr_t align;[m
[31m-  uintptr_t entsize;[m
[31m-} ELFsectheader;[m
[31m-[m
[31m-#define ELFSECT_IDX_ABS		0xfff1[m
[31m-[m
[31m-enum {[m
[31m-  ELFSECT_TYPE_PROGBITS = 1,[m
[31m-  ELFSECT_TYPE_SYMTAB = 2,[m
[31m-  ELFSECT_TYPE_STRTAB = 3,[m
[31m-  ELFSECT_TYPE_NOBITS = 8[m
[31m-};[m
[31m-[m
[31m-#define ELFSECT_FLAGS_WRITE	1[m
[31m-#define ELFSECT_FLAGS_ALLOC	2[m
[31m-#define ELFSECT_FLAGS_EXEC	4[m
[31m-[m
[31m-typedef struct ELFsymbol {[m
[31m-#if LJ_64[m
[31m-  uint32_t name;[m
[31m-  uint8_t info;[m
[31m-  uint8_t other;[m
[31m-  uint16_t sectidx;[m
[31m-  uintptr_t value;[m
[31m-  uint64_t size;[m
[31m-#else[m
[31m-  uint32_t name;[m
[31m-  uintptr_t value;[m
[31m-  uint32_t size;[m
[31m-  uint8_t info;[m
[31m-  uint8_t other;[m
[31m-  uint16_t sectidx;[m
[31m-#endif[m
[31m-} ELFsymbol;[m
[31m-[m
[31m-enum {[m
[31m-  ELFSYM_TYPE_FUNC = 2,[m
[31m-  ELFSYM_TYPE_FILE = 4,[m
[31m-  ELFSYM_BIND_LOCAL = 0 << 4,[m
[31m-  ELFSYM_BIND_GLOBAL = 1 << 4,[m
[31m-};[m
[31m-[m
[31m-/* DWARF definitions. */[m
[31m-#define DW_CIE_VERSION	1[m
[31m-[m
[31m-enum {[m
[31m-  DW_CFA_nop = 0x0,[m
[31m-  DW_CFA_offset_extended = 0x5,[m
[31m-  DW_CFA_def_cfa = 0xc,[m
[31m-  DW_CFA_def_cfa_offset = 0xe,[m
[31m-  DW_CFA_offset_extended_sf = 0x11,[m
[31m-  DW_CFA_advance_loc = 0x40,[m
[31m-  DW_CFA_offset = 0x80[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_EH_PE_udata4 = 3,[m
[31m-  DW_EH_PE_textrel = 0x20[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_TAG_compile_unit = 0x11[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_children_no = 0,[m
[31m-  DW_children_yes = 1[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_AT_name = 0x03,[m
[31m-  DW_AT_stmt_list = 0x10,[m
[31m-  DW_AT_low_pc = 0x11,[m
[31m-  DW_AT_high_pc = 0x12[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_FORM_addr = 0x01,[m
[31m-  DW_FORM_data4 = 0x06,[m
[31m-  DW_FORM_string = 0x08[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_LNS_extended_op = 0,[m
[31m-  DW_LNS_copy = 1,[m
[31m-  DW_LNS_advance_pc = 2,[m
[31m-  DW_LNS_advance_line = 3[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  DW_LNE_end_sequence = 1,[m
[31m-  DW_LNE_set_address = 2[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-#if LJ_TARGET_X86[m
[31m-  DW_REG_AX, DW_REG_CX, DW_REG_DX, DW_REG_BX,[m
[31m-  DW_REG_SP, DW_REG_BP, DW_REG_SI, DW_REG_DI,[m
[31m-  DW_REG_RA,[m
[31m-#elif LJ_TARGET_X64[m
[31m-  /* Yes, the order is strange, but correct. */[m
[31m-  DW_REG_AX, DW_REG_DX, DW_REG_CX, DW_REG_BX,[m
[31m-  DW_REG_SI, DW_REG_DI, DW_REG_BP, DW_REG_SP,[m
[31m-  DW_REG_8, DW_REG_9, DW_REG_10, DW_REG_11,[m
[31m-  DW_REG_12, DW_REG_13, DW_REG_14, DW_REG_15,[m
[31m-  DW_REG_RA,[m
[31m-#elif LJ_TARGET_ARM[m
[31m-  DW_REG_SP = 13,[m
[31m-  DW_REG_RA = 14,[m
[31m-#elif LJ_TARGET_PPC[m
[31m-  DW_REG_SP = 1,[m
[31m-  DW_REG_RA = 65,[m
[31m-  DW_REG_CR = 70,[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-  DW_REG_SP = 29,[m
[31m-  DW_REG_RA = 31,[m
[31m-#else[m
[31m-#error "Unsupported target architecture"[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-/* Minimal list of sections for the in-memory ELF object. */[m
[31m-enum {[m
[31m-  GDBJIT_SECT_NULL,[m
[31m-  GDBJIT_SECT_text,[m
[31m-  GDBJIT_SECT_eh_frame,[m
[31m-  GDBJIT_SECT_shstrtab,[m
[31m-  GDBJIT_SECT_strtab,[m
[31m-  GDBJIT_SECT_symtab,[m
[31m-  GDBJIT_SECT_debug_info,[m
[31m-  GDBJIT_SECT_debug_abbrev,[m
[31m-  GDBJIT_SECT_debug_line,[m
[31m-  GDBJIT_SECT__MAX[m
[31m-};[m
[31m-[m
[31m-enum {[m
[31m-  GDBJIT_SYM_UNDEF,[m
[31m-  GDBJIT_SYM_FILE,[m
[31m-  GDBJIT_SYM_FUNC,[m
[31m-  GDBJIT_SYM__MAX[m
[31m-};[m
[31m-[m
[31m-/* In-memory ELF object. */[m
[31m-typedef struct GDBJITobj {[m
[31m-  ELFheader hdr;			/* ELF header. */[m
[31m-  ELFsectheader sect[GDBJIT_SECT__MAX];	/* ELF sections. */[m
[31m-  ELFsymbol sym[GDBJIT_SYM__MAX];	/* ELF symbol table. */[m
[31m-  uint8_t space[4096];			/* Space for various section data. */[m
[31m-} GDBJITobj;[m
[31m-[m
[31m-/* Combined structure for GDB JIT entry and ELF object. */[m
[31m-typedef struct GDBJITentryobj {[m
[31m-  GDBJITentry entry;[m
[31m-  size_t sz;[m
[31m-  GDBJITobj obj;[m
[31m-} GDBJITentryobj;[m
[31m-[m
[31m-/* Template for in-memory ELF header. */[m
[31m-static const ELFheader elfhdr_template = {[m
[31m-  .emagic = { 0x7f, 'E', 'L', 'F' },[m
[31m-  .eclass = LJ_64 ? 2 : 1,[m
[31m-  .eendian = LJ_ENDIAN_SELECT(1, 2),[m
[31m-  .eversion = 1,[m
[31m-#if LJ_TARGET_LINUX[m
[31m-  .eosabi = 0,  /* Nope, it's not 3. */[m
[31m-#elif defined(__FreeBSD__)[m
[31m-  .eosabi = 9,[m
[31m-#elif defined(__NetBSD__)[m
[31m-  .eosabi = 2,[m
[31m-#elif defined(__OpenBSD__)[m
[31m-  .eosabi = 12,[m
[31m-#elif defined(__DragonFly__)[m
[31m-  .eosabi = 0,[m
[31m-#elif (defined(__sun__) && defined(__svr4__))[m
[31m-  .eosabi = 6,[m
[31m-#else[m
[31m-  .eosabi = 0,[m
[31m-#endif[m
[31m-  .eabiversion = 0,[m
[31m-  .epad = { 0, 0, 0, 0, 0, 0, 0 },[m
[31m-  .type = 1,[m
[31m-#if LJ_TARGET_X86[m
[31m-  .machine = 3,[m
[31m-#elif LJ_TARGET_X64[m
[31m-  .machine = 62,[m
[31m-#elif LJ_TARGET_ARM[m
[31m-  .machine = 40,[m
[31m-#elif LJ_TARGET_PPC[m
[31m-  .machine = 20,[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-  .machine = 8,[m
[31m-#else[m
[31m-#error "Unsupported target architecture"[m
[31m-#endif[m
[31m-  .version = 1,[m
[31m-  .entry = 0,[m
[31m-  .phofs = 0,[m
[31m-  .shofs = offsetof(GDBJITobj, sect),[m
[31m-  .flags = 0,[m
[31m-  .ehsize = sizeof(ELFheader),[m
[31m-  .phentsize = 0,[m
[31m-  .phnum = 0,[m
[31m-  .shentsize = sizeof(ELFsectheader),[m
[31m-  .shnum = GDBJIT_SECT__MAX,[m
[31m-  .shstridx = GDBJIT_SECT_shstrtab[m
[31m-};[m
[31m-[m
[31m-/* -- In-memory ELF object generation ------------------------------------- */[m
[31m-[m
[31m-/* Context for generating the ELF object for the GDB JIT API. */[m
[31m-typedef struct GDBJITctx {[m
[31m-  uint8_t *p;		/* Pointer to next address in obj.space. */[m
[31m-  uint8_t *startp;	/* Pointer to start address in obj.space. */[m
[31m-  GCtrace *T;		/* Generate symbols for this trace. */[m
[31m-  uintptr_t mcaddr;	/* Machine code address. */[m
[31m-  MSize szmcode;	/* Size of machine code. */[m
[31m-  MSize spadjp;		/* Stack adjustment for parent trace or interpreter. */[m
[31m-  MSize spadj;		/* Stack adjustment for trace itself. */[m
[31m-  BCLine lineno;	/* Starting line number. */[m
[31m-  const char *filename;	/* Starting file name. */[m
[31m-  size_t objsize;	/* Final size of ELF object. */[m
[31m-  GDBJITobj obj;	/* In-memory ELF object. */[m
[31m-} GDBJITctx;[m
[31m-[m
[31m-/* Add a zero-terminated string. */[m
[31m-static uint32_t gdbjit_strz(GDBJITctx *ctx, const char *str)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-  uint32_t ofs = (uint32_t)(p - ctx->startp);[m
[31m-  do {[m
[31m-    *p++ = (uint8_t)*str;[m
[31m-  } while (*str++);[m
[31m-  ctx->p = p;[m
[31m-  return ofs;[m
[31m-}[m
[31m-[m
[31m-/* Append a decimal number. */[m
[31m-static void gdbjit_catnum(GDBJITctx *ctx, uint32_t n)[m
[31m-{[m
[31m-  if (n >= 10) { uint32_t m = n / 10; n = n % 10; gdbjit_catnum(ctx, m); }[m
[31m-  *ctx->p++ = '0' + n;[m
[31m-}[m
[31m-[m
[31m-/* Add a SLEB128 value. */[m
[31m-static void gdbjit_sleb128(GDBJITctx *ctx, int32_t v)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-  for (; (uint32_t)(v+0x40) >= 0x80; v >>= 7)[m
[31m-    *p++ = (uint8_t)((v & 0x7f) | 0x80);[m
[31m-  *p++ = (uint8_t)(v & 0x7f);[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-/* Shortcuts to generate DWARF structures. */[m
[31m-#define DB(x)		(*p++ = (x))[m
[31m-#define DI8(x)		(*(int8_t *)p = (x), p++)[m
[31m-#define DU16(x)		(*(uint16_t *)p = (x), p += 2)[m
[31m-#define DU32(x)		(*(uint32_t *)p = (x), p += 4)[m
[31m-#define DADDR(x)	(*(uintptr_t *)p = (x), p += sizeof(uintptr_t))[m
[31m-#define DUV(x)		(p = (uint8_t *)lj_strfmt_wuleb128((char *)p, (x)))[m
[31m-#define DSV(x)		(ctx->p = p, gdbjit_sleb128(ctx, (x)), p = ctx->p)[m
[31m-#define DSTR(str)	(ctx->p = p, gdbjit_strz(ctx, (str)), p = ctx->p)[m
[31m-#define DALIGNNOP(s)	while ((uintptr_t)p & ((s)-1)) *p++ = DW_CFA_nop[m
[31m-#define DSECT(name, stmt) \[m
[31m-  { uint32_t *szp_##name = (uint32_t *)p; p += 4; stmt \[m
[31m-    *szp_##name = (uint32_t)((p-(uint8_t *)szp_##name)-4); } \[m
[31m-[m
[31m-/* Initialize ELF section headers. */[m
[31m-static void LJ_FASTCALL gdbjit_secthdr(GDBJITctx *ctx)[m
[31m-{[m
[31m-  ELFsectheader *sect;[m
[31m-[m
[31m-  *ctx->p++ = '\0';  /* Empty string at start of string table. */[m
[31m-[m
[31m-#define SECTDEF(id, tp, al) \[m
[31m-  sect = &ctx->obj.sect[GDBJIT_SECT_##id]; \[m
[31m-  sect->name = gdbjit_strz(ctx, "." #id); \[m
[31m-  sect->type = ELFSECT_TYPE_##tp; \[m
[31m-  sect->align = (al)[m
[31m-[m
[31m-  SECTDEF(text, NOBITS, 16);[m
[31m-  sect->flags = ELFSECT_FLAGS_ALLOC|ELFSECT_FLAGS_EXEC;[m
[31m-  sect->addr = ctx->mcaddr;[m
[31m-  sect->ofs = 0;[m
[31m-  sect->size = ctx->szmcode;[m
[31m-[m
[31m-  SECTDEF(eh_frame, PROGBITS, sizeof(uintptr_t));[m
[31m-  sect->flags = ELFSECT_FLAGS_ALLOC;[m
[31m-[m
[31m-  SECTDEF(shstrtab, STRTAB, 1);[m
[31m-  SECTDEF(strtab, STRTAB, 1);[m
[31m-[m
[31m-  SECTDEF(symtab, SYMTAB, sizeof(uintptr_t));[m
[31m-  sect->ofs = offsetof(GDBJITobj, sym);[m
[31m-  sect->size = sizeof(ctx->obj.sym);[m
[31m-  sect->link = GDBJIT_SECT_strtab;[m
[31m-  sect->entsize = sizeof(ELFsymbol);[m
[31m-  sect->info = GDBJIT_SYM_FUNC;[m
[31m-[m
[31m-  SECTDEF(debug_info, PROGBITS, 1);[m
[31m-  SECTDEF(debug_abbrev, PROGBITS, 1);[m
[31m-  SECTDEF(debug_line, PROGBITS, 1);[m
[31m-[m
[31m-#undef SECTDEF[m
[31m-}[m
[31m-[m
[31m-/* Initialize symbol table. */[m
[31m-static void LJ_FASTCALL gdbjit_symtab(GDBJITctx *ctx)[m
[31m-{[m
[31m-  ELFsymbol *sym;[m
[31m-[m
[31m-  *ctx->p++ = '\0';  /* Empty string at start of string table. */[m
[31m-[m
[31m-  sym = &ctx->obj.sym[GDBJIT_SYM_FILE];[m
[31m-  sym->name = gdbjit_strz(ctx, "JIT mcode");[m
[31m-  sym->sectidx = ELFSECT_IDX_ABS;[m
[31m-  sym->info = ELFSYM_TYPE_FILE|ELFSYM_BIND_LOCAL;[m
[31m-[m
[31m-  sym = &ctx->obj.sym[GDBJIT_SYM_FUNC];[m
[31m-  sym->name = gdbjit_strz(ctx, "TRACE_"); ctx->p--;[m
[31m-  gdbjit_catnum(ctx, ctx->T->traceno); *ctx->p++ = '\0';[m
[31m-  sym->sectidx = GDBJIT_SECT_text;[m
[31m-  sym->value = 0;[m
[31m-  sym->size = ctx->szmcode;[m
[31m-  sym->info = ELFSYM_TYPE_FUNC|ELFSYM_BIND_GLOBAL;[m
[31m-}[m
[31m-[m
[31m-/* Initialize .eh_frame section. */[m
[31m-static void LJ_FASTCALL gdbjit_ehframe(GDBJITctx *ctx)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-  uint8_t *framep = p;[m
[31m-[m
[31m-  /* Emit DWARF EH CIE. */[m
[31m-  DSECT(CIE,[m
[31m-    DU32(0);			/* Offset to CIE itself. */[m
[31m-    DB(DW_CIE_VERSION);[m
[31m-    DSTR("zR");			/* Augmentation. */[m
[31m-    DUV(1);			/* Code alignment factor. */[m
[31m-    DSV(-(int32_t)sizeof(uintptr_t));  /* Data alignment factor. */[m
[31m-    DB(DW_REG_RA);		/* Return address register. */[m
[31m-    DB(1); DB(DW_EH_PE_textrel|DW_EH_PE_udata4);  /* Augmentation data. */[m
[31m-    DB(DW_CFA_def_cfa); DUV(DW_REG_SP); DUV(sizeof(uintptr_t));[m
[31m-#if LJ_TARGET_PPC[m
[31m-    DB(DW_CFA_offset_extended_sf); DB(DW_REG_RA); DSV(-1);[m
[31m-#else[m
[31m-    DB(DW_CFA_offset|DW_REG_RA); DUV(1);[m
[31m-#endif[m
[31m-    DALIGNNOP(sizeof(uintptr_t));[m
[31m-  )[m
[31m-[m
[31m-  /* Emit DWARF EH FDE. */[m
[31m-  DSECT(FDE,[m
[31m-    DU32((uint32_t)(p-framep));	/* Offset to CIE. */[m
[31m-    DU32(0);			/* Machine code offset relative to .text. */[m
[31m-    DU32(ctx->szmcode);		/* Machine code length. */[m
[31m-    DB(0);			/* Augmentation data. */[m
[31m-    /* Registers saved in CFRAME. */[m
[31m-#if LJ_TARGET_X86[m
[31m-    DB(DW_CFA_offset|DW_REG_BP); DUV(2);[m
[31m-    DB(DW_CFA_offset|DW_REG_DI); DUV(3);[m
[31m-    DB(DW_CFA_offset|DW_REG_SI); DUV(4);[m
[31m-    DB(DW_CFA_offset|DW_REG_BX); DUV(5);[m
[31m-#elif LJ_TARGET_X64[m
[31m-    DB(DW_CFA_offset|DW_REG_BP); DUV(2);[m
[31m-    DB(DW_CFA_offset|DW_REG_BX); DUV(3);[m
[31m-    DB(DW_CFA_offset|DW_REG_15); DUV(4);[m
[31m-    DB(DW_CFA_offset|DW_REG_14); DUV(5);[m
[31m-    /* Extra registers saved for JIT-compiled code. */[m
[31m-    DB(DW_CFA_offset|DW_REG_13); DUV(LJ_GC64 ? 10 : 9);[m
[31m-    DB(DW_CFA_offset|DW_REG_12); DUV(LJ_GC64 ? 11 : 10);[m
[31m-#elif LJ_TARGET_ARM[m
[31m-    {[m
[31m-      int i;[m
[31m-      for (i = 11; i >= 4; i--) { DB(DW_CFA_offset|i); DUV(2+(11-i)); }[m
[31m-    }[m
[31m-#elif LJ_TARGET_PPC[m
[31m-    {[m
[31m-      int i;[m
[31m-      DB(DW_CFA_offset_extended); DB(DW_REG_CR); DUV(55);[m
[31m-      for (i = 14; i <= 31; i++) {[m
[31m-	DB(DW_CFA_offset|i); DUV(37+(31-i));[m
[31m-	DB(DW_CFA_offset|32|i); DUV(2+2*(31-i));[m
[31m-      }[m
[31m-    }[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-    {[m
[31m-      int i;[m
[31m-      DB(DW_CFA_offset|30); DUV(2);[m
[31m-      for (i = 23; i >= 16; i--) { DB(DW_CFA_offset|i); DUV(26-i); }[m
[31m-      for (i = 30; i >= 20; i -= 2) { DB(DW_CFA_offset|32|i); DUV(42-i); }[m
[31m-    }[m
[31m-#else[m
[31m-#error "Unsupported target architecture"[m
[31m-#endif[m
[31m-    if (ctx->spadjp != ctx->spadj) {  /* Parent/interpreter stack frame size. */[m
[31m-      DB(DW_CFA_def_cfa_offset); DUV(ctx->spadjp);[m
[31m-      DB(DW_CFA_advance_loc|1);  /* Only an approximation. */[m
[31m-    }[m
[31m-    DB(DW_CFA_def_cfa_offset); DUV(ctx->spadj);  /* Trace stack frame size. */[m
[31m-    DALIGNNOP(sizeof(uintptr_t));[m
[31m-  )[m
[31m-[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-/* Initialize .debug_info section. */[m
[31m-static void LJ_FASTCALL gdbjit_debuginfo(GDBJITctx *ctx)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-[m
[31m-  DSECT(info,[m
[31m-    DU16(2);			/* DWARF version. */[m
[31m-    DU32(0);			/* Abbrev offset. */[m
[31m-    DB(sizeof(uintptr_t));	/* Pointer size. */[m
[31m-[m
[31m-    DUV(1);			/* Abbrev #1: DW_TAG_compile_unit. */[m
[31m-    DSTR(ctx->filename);	/* DW_AT_name. */[m
[31m-    DADDR(ctx->mcaddr);		/* DW_AT_low_pc. */[m
[31m-    DADDR(ctx->mcaddr + ctx->szmcode);  /* DW_AT_high_pc. */[m
[31m-    DU32(0);			/* DW_AT_stmt_list. */[m
[31m-  )[m
[31m-[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-/* Initialize .debug_abbrev section. */[m
[31m-static void LJ_FASTCALL gdbjit_debugabbrev(GDBJITctx *ctx)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-[m
[31m-  /* Abbrev #1: DW_TAG_compile_unit. */[m
[31m-  DUV(1); DUV(DW_TAG_compile_unit);[m
[31m-  DB(DW_children_no);[m
[31m-  DUV(DW_AT_name);	DUV(DW_FORM_string);[m
[31m-  DUV(DW_AT_low_pc);	DUV(DW_FORM_addr);[m
[31m-  DUV(DW_AT_high_pc);	DUV(DW_FORM_addr);[m
[31m-  DUV(DW_AT_stmt_list);	DUV(DW_FORM_data4);[m
[31m-  DB(0); DB(0);[m
[31m-[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-#define DLNE(op, s)	(DB(DW_LNS_extended_op), DUV(1+(s)), DB((op)))[m
[31m-[m
[31m-/* Initialize .debug_line section. */[m
[31m-static void LJ_FASTCALL gdbjit_debugline(GDBJITctx *ctx)[m
[31m-{[m
[31m-  uint8_t *p = ctx->p;[m
[31m-[m
[31m-  DSECT(line,[m
[31m-    DU16(2);			/* DWARF version. */[m
[31m-    DSECT(header,[m
[31m-      DB(1);			/* Minimum instruction length. */[m
[31m-      DB(1);			/* is_stmt. */[m
[31m-      DI8(0);			/* Line base for special opcodes. */[m
[31m-      DB(2);			/* Line range for special opcodes. */[m
[31m-      DB(3+1);			/* Opcode base at DW_LNS_advance_line+1. */[m
[31m-      DB(0); DB(1); DB(1);	/* Standard opcode lengths. */[m
[31m-      /* Directory table. */[m
[31m-      DB(0);[m
[31m-      /* File name table. */[m
[31m-      DSTR(ctx->filename); DUV(0); DUV(0); DUV(0);[m
[31m-      DB(0);[m
[31m-    )[m
[31m-[m
[31m-    DLNE(DW_LNE_set_address, sizeof(uintptr_t)); DADDR(ctx->mcaddr);[m
[31m-    if (ctx->lineno) {[m
[31m-      DB(DW_LNS_advance_line); DSV(ctx->lineno-1);[m
[31m-    }[m
[31m-    DB(DW_LNS_copy);[m
[31m-    DB(DW_LNS_advance_pc); DUV(ctx->szmcode);[m
[31m-    DLNE(DW_LNE_end_sequence, 0);[m
[31m-  )[m
[31m-[m
[31m-  ctx->p = p;[m
[31m-}[m
[31m-[m
[31m-#undef DLNE[m
[31m-[m
[31m-/* Undef shortcuts. */[m
[31m-#undef DB[m
[31m-#undef DI8[m
[31m-#undef DU16[m
[31m-#undef DU32[m
[31m-#undef DADDR[m
[31m-#undef DUV[m
[31m-#undef DSV[m
[31m-#undef DSTR[m
[31m-#undef DALIGNNOP[m
[31m-#undef DSECT[m
[31m-[m
[31m-/* Type of a section initializer callback. */[m
[31m-typedef void (LJ_FASTCALL *GDBJITinitf)(GDBJITctx *ctx);[m
[31m-[m
[31m-/* Call section initializer and set the section offset and size. */[m
[31m-static void gdbjit_initsect(GDBJITctx *ctx, int sect, GDBJITinitf initf)[m
[31m-{[m
[31m-  ctx->startp = ctx->p;[m
[31m-  ctx->obj.sect[sect].ofs = (uintptr_t)((char *)ctx->p - (char *)&ctx->obj);[m
[31m-  initf(ctx);[m
[31m-  ctx->obj.sect[sect].size = (uintptr_t)(ctx->p - ctx->startp);[m
[31m-}[m
[31m-[m
[31m-#define SECTALIGN(p, a) \[m
[31m-  ((p) = (uint8_t *)(((uintptr_t)(p) + ((a)-1)) & ~(uintptr_t)((a)-1)))[m
[31m-[m
[31m-/* Build in-memory ELF object. */[m
[31m-static void gdbjit_buildobj(GDBJITctx *ctx)[m
[31m-{[m
[31m-  GDBJITobj *obj = &ctx->obj;[m
[31m-  /* Fill in ELF header and clear structures. */[m
[31m-  memcpy(&obj->hdr, &elfhdr_template, sizeof(ELFheader));[m
[31m-  memset(&obj->sect, 0, sizeof(ELFsectheader)*GDBJIT_SECT__MAX);[m
[31m-  memset(&obj->sym, 0, sizeof(ELFsymbol)*GDBJIT_SYM__MAX);[m
[31m-  /* Initialize sections. */[m
[31m-  ctx->p = obj->space;[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_shstrtab, gdbjit_secthdr);[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_strtab, gdbjit_symtab);[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_debug_info, gdbjit_debuginfo);[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_debug_abbrev, gdbjit_debugabbrev);[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_debug_line, gdbjit_debugline);[m
[31m-  SECTALIGN(ctx->p, sizeof(uintptr_t));[m
[31m-  gdbjit_initsect(ctx, GDBJIT_SECT_eh_frame, gdbjit_ehframe);[m
[31m-  ctx->objsize = (size_t)((char *)ctx->p - (char *)obj);[m
[31m-  lua_assert(ctx->objsize < sizeof(GDBJITobj));[m
[31m-}[m
[31m-[m
[31m-#undef SECTALIGN[m
[31m-[m
[31m-/* -- Interface to GDB JIT API -------------------------------------------- */[m
[31m-[m
[31m-static int gdbjit_lock;[m
[31m-[m
[31m-static void gdbjit_lock_acquire()[m
[31m-{[m
[31m-  while (__sync_lock_test_and_set(&gdbjit_lock, 1)) {[m
[31m-    /* Just spin; futexes or pthreads aren't worth the portability cost. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void gdbjit_lock_release()[m
[31m-{[m
[31m-  __sync_lock_release(&gdbjit_lock);[m
[31m-}[m
[31m-[m
[31m-/* Add new entry to GDB JIT symbol chain. */[m
[31m-static void gdbjit_newentry(lua_State *L, GDBJITctx *ctx)[m
[31m-{[m
[31m-  /* Allocate memory for GDB JIT entry and ELF object. */[m
[31m-  MSize sz = (MSize)(sizeof(GDBJITentryobj) - sizeof(GDBJITobj) + ctx->objsize);[m
[31m-  GDBJITentryobj *eo = lj_mem_newt(L, sz, GDBJITentryobj);[m
[31m-  memcpy(&eo->obj, &ctx->obj, ctx->objsize);  /* Copy ELF object. */[m
[31m-  eo->sz = sz;[m
[31m-  ctx->T->gdbjit_entry = (void *)eo;[m
[31m-  /* Link new entry to chain and register it. */[m
[31m-  eo->entry.prev_entry = NULL;[m
[31m-  gdbjit_lock_acquire();[m
[31m-  eo->entry.next_entry = __jit_debug_descriptor.first_entry;[m
[31m-  if (eo->entry.next_entry)[m
[31m-    eo->entry.next_entry->prev_entry = &eo->entry;[m
[31m-  eo->entry.symfile_addr = (const char *)&eo->obj;[m
[31m-  eo->entry.symfile_size = ctx->objsize;[m
[31m-  __jit_debug_descriptor.first_entry = &eo->entry;[m
[31m-  __jit_debug_descriptor.relevant_entry = &eo->entry;[m
[31m-  __jit_debug_descriptor.action_flag = GDBJIT_REGISTER;[m
[31m-  __jit_debug_register_code();[m
[31m-  gdbjit_lock_release();[m
[31m-}[m
[31m-[m
[31m-/* Add debug info for newly compiled trace and notify GDB. */[m
[31m-void lj_gdbjit_addtrace(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  GDBJITctx ctx;[m
[31m-  GCproto *pt = &gcref(T->startpt)->pt;[m
[31m-  TraceNo parent = T->ir[REF_BASE].op1;[m
[31m-  const BCIns *startpc = mref(T->startpc, const BCIns);[m
[31m-  ctx.T = T;[m
[31m-  ctx.mcaddr = (uintptr_t)T->mcode;[m
[31m-  ctx.szmcode = T->szmcode;[m
[31m-  ctx.spadjp = CFRAME_SIZE_JIT +[m
[31m-	       (MSize)(parent ? traceref(J, parent)->spadjust : 0);[m
[31m-  ctx.spadj = CFRAME_SIZE_JIT + T->spadjust;[m
[31m-  lua_assert(startpc >= proto_bc(pt) && startpc < proto_bc(pt) + pt->sizebc);[m
[31m-  ctx.lineno = lj_debug_line(pt, proto_bcpos(pt, startpc));[m
[31m-  ctx.filename = proto_chunknamestr(pt);[m
[31m-  if (*ctx.filename == '@' || *ctx.filename == '=')[m
[31m-    ctx.filename++;[m
[31m-  else[m
[31m-    ctx.filename = "(string)";[m
[31m-  gdbjit_buildobj(&ctx);[m
[31m-  gdbjit_newentry(J->L, &ctx);[m
[31m-}[m
[31m-[m
[31m-/* Delete debug info for trace and notify GDB. */[m
[31m-void lj_gdbjit_deltrace(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  GDBJITentryobj *eo = (GDBJITentryobj *)T->gdbjit_entry;[m
[31m-  if (eo) {[m
[31m-    gdbjit_lock_acquire();[m
[31m-    if (eo->entry.prev_entry)[m
[31m-      eo->entry.prev_entry->next_entry = eo->entry.next_entry;[m
[31m-    else[m
[31m-      __jit_debug_descriptor.first_entry = eo->entry.next_entry;[m
[31m-    if (eo->entry.next_entry)[m
[31m-      eo->entry.next_entry->prev_entry = eo->entry.prev_entry;[m
[31m-    __jit_debug_descriptor.relevant_entry = &eo->entry;[m
[31m-    __jit_debug_descriptor.action_flag = GDBJIT_UNREGISTER;[m
[31m-    __jit_debug_register_code();[m
[31m-    gdbjit_lock_release();[m
[31m-    lj_mem_free(J2G(J), eo, eo->sz);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gdbjit.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gdbjit.h[m
[1mdeleted file mode 100644[m
[1mindex 1043bc6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_gdbjit.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-/*[m
[31m-** Client for the GDB JIT API.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_GDBJIT_H[m
[31m-#define _LJ_GDBJIT_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT && defined(LUAJIT_USE_GDBJIT)[m
[31m-[m
[31m-LJ_FUNC void lj_gdbjit_addtrace(jit_State *J, GCtrace *T);[m
[31m-LJ_FUNC void lj_gdbjit_deltrace(jit_State *J, GCtrace *T);[m
[31m-[m
[31m-#else[m
[31m-#define lj_gdbjit_addtrace(J, T)	UNUSED(T)[m
[31m-#define lj_gdbjit_deltrace(J, T)	UNUSED(T)[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ir.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ir.c[m
[1mdeleted file mode 100644[m
[1mindex b4087aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ir.c[m
[1m+++ /dev/null[m
[36m@@ -1,521 +0,0 @@[m
[31m-/*[m
[31m-** SSA IR (Intermediate Representation) emitter.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_ir_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-/* For pointers to libc/libm functions. */[m
[31m-#include <stdio.h>[m
[31m-#include <math.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lj_carith.h"[m
[31m-#endif[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-#define fins			(&J->fold.ins)[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)        (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* -- IR tables ----------------------------------------------------------- */[m
[31m-[m
[31m-/* IR instruction modes. */[m
[31m-LJ_DATADEF const uint8_t lj_ir_mode[IR__MAX+1] = {[m
[31m-IRDEF(IRMODE)[m
[31m-  0[m
[31m-};[m
[31m-[m
[31m-/* IR type sizes. */[m
[31m-LJ_DATADEF const uint8_t lj_ir_type_size[IRT__MAX+1] = {[m
[31m-#define IRTSIZE(name, size)	size,[m
[31m-IRTDEF(IRTSIZE)[m
[31m-#undef IRTSIZE[m
[31m-  0[m
[31m-};[m
[31m-[m
[31m-/* C call info for CALL* instructions. */[m
[31m-LJ_DATADEF const CCallInfo lj_ir_callinfo[] = {[m
[31m-#define IRCALLCI(cond, name, nargs, kind, type, flags) \[m
[31m-  { (ASMFunction)IRCALLCOND_##cond(name), \[m
[31m-    (nargs)|(CCI_CALL_##kind)|(IRT_##type<<CCI_OTSHIFT)|(flags) },[m
[31m-IRCALLDEF(IRCALLCI)[m
[31m-#undef IRCALLCI[m
[31m-  { NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-/* -- IR emitter ---------------------------------------------------------- */[m
[31m-[m
[31m-/* Grow IR buffer at the top. */[m
[31m-void LJ_FASTCALL lj_ir_growtop(jit_State *J)[m
[31m-{[m
[31m-  IRIns *baseir = J->irbuf + J->irbotlim;[m
[31m-  MSize szins = J->irtoplim - J->irbotlim;[m
[31m-  if (szins) {[m
[31m-    baseir = (IRIns *)lj_mem_realloc(J->L, baseir, szins*sizeof(IRIns),[m
[31m-				     2*szins*sizeof(IRIns));[m
[31m-    J->irtoplim = J->irbotlim + 2*szins;[m
[31m-  } else {[m
[31m-    baseir = (IRIns *)lj_mem_realloc(J->L, NULL, 0, LJ_MIN_IRSZ*sizeof(IRIns));[m
[31m-    J->irbotlim = REF_BASE - LJ_MIN_IRSZ/4;[m
[31m-    J->irtoplim = J->irbotlim + LJ_MIN_IRSZ;[m
[31m-  }[m
[31m-  J->cur.ir = J->irbuf = baseir - J->irbotlim;[m
[31m-}[m
[31m-[m
[31m-/* Grow IR buffer at the bottom or shift it up. */[m
[31m-static void lj_ir_growbot(jit_State *J)[m
[31m-{[m
[31m-  IRIns *baseir = J->irbuf + J->irbotlim;[m
[31m-  MSize szins = J->irtoplim - J->irbotlim;[m
[31m-  lua_assert(szins != 0);[m
[31m-  lua_assert(J->cur.nk == J->irbotlim);[m
[31m-  if (J->cur.nins + (szins >> 1) < J->irtoplim) {[m
[31m-    /* More than half of the buffer is free on top: shift up by a quarter. */[m
[31m-    MSize ofs = szins >> 2;[m
[31m-    memmove(baseir + ofs, baseir, (J->cur.nins - J->irbotlim)*sizeof(IRIns));[m
[31m-    J->irbotlim -= ofs;[m
[31m-    J->irtoplim -= ofs;[m
[31m-    J->cur.ir = J->irbuf = baseir - J->irbotlim;[m
[31m-  } else {[m
[31m-    /* Double the buffer size, but split the growth amongst top/bottom. */[m
[31m-    IRIns *newbase = lj_mem_newt(J->L, 2*szins*sizeof(IRIns), IRIns);[m
[31m-    MSize ofs = szins >= 256 ? 128 : (szins >> 1);  /* Limit bottom growth. */[m
[31m-    memcpy(newbase + ofs, baseir, (J->cur.nins - J->irbotlim)*sizeof(IRIns));[m
[31m-    lj_mem_free(G(J->L), baseir, szins*sizeof(IRIns));[m
[31m-    J->irbotlim -= ofs;[m
[31m-    J->irtoplim = J->irbotlim + 2*szins;[m
[31m-    J->cur.ir = J->irbuf = newbase - J->irbotlim;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit IR without any optimizations. */[m
[31m-TRef LJ_FASTCALL lj_ir_emit(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref = lj_ir_nextins(J);[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  IROp op = fins->o;[m
[31m-  ir->prev = J->chain[op];[m
[31m-  J->chain[op] = (IRRef1)ref;[m
[31m-  ir->o = op;[m
[31m-  ir->op1 = fins->op1;[m
[31m-  ir->op2 = fins->op2;[m
[31m-  J->guardemit.irt |= fins->t.irt;[m
[31m-  return TREF(ref, irt_t((ir->t = fins->t)));[m
[31m-}[m
[31m-[m
[31m-/* Emit call to a C function. */[m
[31m-TRef lj_ir_call(jit_State *J, IRCallID id, ...)[m
[31m-{[m
[31m-  const CCallInfo *ci = &lj_ir_callinfo[id];[m
[31m-  uint32_t n = CCI_NARGS(ci);[m
[31m-  TRef tr = TREF_NIL;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, id);[m
[31m-  if ((ci->flags & CCI_L)) n--;[m
[31m-  if (n > 0)[m
[31m-    tr = va_arg(argp, IRRef);[m
[31m-  while (n-- > 1)[m
[31m-    tr = emitir(IRT(IR_CARG, IRT_NIL), tr, va_arg(argp, IRRef));[m
[31m-  va_end(argp);[m
[31m-  if (CCI_OP(ci) == IR_CALLS)[m
[31m-    J->needsnap = 1;  /* Need snapshot after call with side effect. */[m
[31m-  return emitir(CCI_OPTYPE(ci), tr, id);[m
[31m-}[m
[31m-[m
[31m-/* -- Interning of constants ---------------------------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** IR instructions for constants are kept between J->cur.nk >= ref < REF_BIAS.[m
[31m-** They are chained like all other instructions, but grow downwards.[m
[31m-** The are interned (like strings in the VM) to facilitate reference[m
[31m-** comparisons. The same constant must get the same reference.[m
[31m-*/[m
[31m-[m
[31m-/* Get ref of next IR constant and optionally grow IR.[m
[31m-** Note: this may invalidate all IRIns *![m
[31m-*/[m
[31m-static LJ_AINLINE IRRef ir_nextk(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref = J->cur.nk;[m
[31m-  if (LJ_UNLIKELY(ref <= J->irbotlim)) lj_ir_growbot(J);[m
[31m-  J->cur.nk = --ref;[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-/* Intern int32_t constant. */[m
[31m-TRef LJ_FASTCALL lj_ir_kint(jit_State *J, int32_t k)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  for (ref = J->chain[IR_KINT]; ref; ref = cir[ref].prev)[m
[31m-    if (cir[ref].i == k)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  ir->i = k;[m
[31m-  ir->t.irt = IRT_INT;[m
[31m-  ir->o = IR_KINT;[m
[31m-  ir->prev = J->chain[IR_KINT];[m
[31m-  J->chain[IR_KINT] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, IRT_INT);[m
[31m-}[m
[31m-[m
[31m-/* The MRef inside the KNUM/KINT64 IR instructions holds the address of the[m
[31m-** 64 bit constant. The constants themselves are stored in a chained array[m
[31m-** and shared across traces.[m
[31m-**[m
[31m-** Rationale for choosing this data structure:[m
[31m-** - The address of the constants is embedded in the generated machine code[m
[31m-**   and must never move. A resizable array or hash table wouldn't work.[m
[31m-** - Most apps need very few non-32 bit integer constants (less than a dozen).[m
[31m-** - Linear search is hard to beat in terms of speed and low complexity.[m
[31m-*/[m
[31m-typedef struct K64Array {[m
[31m-  MRef next;			/* Pointer to next list. */[m
[31m-  MSize numk;			/* Number of used elements in this array. */[m
[31m-  TValue k[LJ_MIN_K64SZ];	/* Array of constants. */[m
[31m-} K64Array;[m
[31m-[m
[31m-/* Free all chained arrays. */[m
[31m-void lj_ir_k64_freeall(jit_State *J)[m
[31m-{[m
[31m-  K64Array *k;[m
[31m-  for (k = mref(J->k64, K64Array); k; ) {[m
[31m-    K64Array *next = mref(k->next, K64Array);[m
[31m-    lj_mem_free(J2G(J), k, sizeof(K64Array));[m
[31m-    k = next;[m
[31m-  }[m
[31m-  setmref(J->k64, NULL);[m
[31m-}[m
[31m-[m
[31m-/* Get new 64 bit constant slot. */[m
[31m-static TValue *ir_k64_add(jit_State *J, K64Array *kp, uint64_t u64)[m
[31m-{[m
[31m-  TValue *ntv;[m
[31m-  if (!(kp && kp->numk < LJ_MIN_K64SZ)) {  /* Allocate a new array. */[m
[31m-    K64Array *kn = lj_mem_newt(J->L, sizeof(K64Array), K64Array);[m
[31m-    setmref(kn->next, NULL);[m
[31m-    kn->numk = 0;[m
[31m-    if (kp)[m
[31m-      setmref(kp->next, kn);  /* Chain to the end of the list. */[m
[31m-    else[m
[31m-      setmref(J->k64, kn);  /* Link first array. */[m
[31m-    kp = kn;[m
[31m-  }[m
[31m-  ntv = &kp->k[kp->numk++];  /* Add to current array. */[m
[31m-  ntv->u64 = u64;[m
[31m-  return ntv;[m
[31m-}[m
[31m-[m
[31m-/* Find 64 bit constant in chained array or add it. */[m
[31m-cTValue *lj_ir_k64_find(jit_State *J, uint64_t u64)[m
[31m-{[m
[31m-  K64Array *k, *kp = NULL;[m
[31m-  MSize idx;[m
[31m-  /* Search for the constant in the whole chain of arrays. */[m
[31m-  for (k = mref(J->k64, K64Array); k; k = mref(k->next, K64Array)) {[m
[31m-    kp = k;  /* Remember previous element in list. */[m
[31m-    for (idx = 0; idx < k->numk; idx++) {  /* Search one array. */[m
[31m-      TValue *tv = &k->k[idx];[m
[31m-      if (tv->u64 == u64)  /* Needed for +-0/NaN/absmask. */[m
[31m-	return tv;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Otherwise add a new constant. */[m
[31m-  return ir_k64_add(J, kp, u64);[m
[31m-}[m
[31m-[m
[31m-TValue *lj_ir_k64_reserve(jit_State *J)[m
[31m-{[m
[31m-  K64Array *k, *kp = NULL;[m
[31m-  lj_ir_k64_find(J, 0);  /* Intern dummy 0 to protect the reserved slot. */[m
[31m-  /* Find last K64Array, if any. */[m
[31m-  for (k = mref(J->k64, K64Array); k; k = mref(k->next, K64Array)) kp = k;[m
[31m-  return ir_k64_add(J, kp, 0);  /* Set to 0. Final value is set later. */[m
[31m-}[m
[31m-[m
[31m-/* Intern 64 bit constant, given by its address. */[m
[31m-TRef lj_ir_k64(jit_State *J, IROp op, cTValue *tv)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  IRType t = op == IR_KNUM ? IRT_NUM : IRT_I64;[m
[31m-  for (ref = J->chain[op]; ref; ref = cir[ref].prev)[m
[31m-    if (ir_k64(&cir[ref]) == tv)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  lua_assert(checkptrGC(tv));[m
[31m-  setmref(ir->ptr, tv);[m
[31m-  ir->t.irt = t;[m
[31m-  ir->o = op;[m
[31m-  ir->prev = J->chain[op];[m
[31m-  J->chain[op] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, t);[m
[31m-}[m
[31m-[m
[31m-/* Intern FP constant, given by its 64 bit pattern. */[m
[31m-TRef lj_ir_knum_u64(jit_State *J, uint64_t u64)[m
[31m-{[m
[31m-  return lj_ir_k64(J, IR_KNUM, lj_ir_k64_find(J, u64));[m
[31m-}[m
[31m-[m
[31m-/* Intern 64 bit integer constant. */[m
[31m-TRef lj_ir_kint64(jit_State *J, uint64_t u64)[m
[31m-{[m
[31m-  return lj_ir_k64(J, IR_KINT64, lj_ir_k64_find(J, u64));[m
[31m-}[m
[31m-[m
[31m-/* Check whether a number is int and return it. -0 is NOT considered an int. */[m
[31m-static int numistrueint(lua_Number n, int32_t *kp)[m
[31m-{[m
[31m-  int32_t k = lj_num2int(n);[m
[31m-  if (n == (lua_Number)k) {[m
[31m-    if (kp) *kp = k;[m
[31m-    if (k == 0) {  /* Special check for -0. */[m
[31m-      TValue tv;[m
[31m-      setnumV(&tv, n);[m
[31m-      if (tv.u32.hi != 0)[m
[31m-	return 0;[m
[31m-    }[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Intern number as int32_t constant if possible, otherwise as FP constant. */[m
[31m-TRef lj_ir_knumint(jit_State *J, lua_Number n)[m
[31m-{[m
[31m-  int32_t k;[m
[31m-  if (numistrueint(n, &k))[m
[31m-    return lj_ir_kint(J, k);[m
[31m-  else[m
[31m-    return lj_ir_knum(J, n);[m
[31m-}[m
[31m-[m
[31m-/* Intern GC object "constant". */[m
[31m-TRef lj_ir_kgc(jit_State *J, GCobj *o, IRType t)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  lua_assert(!LJ_GC64);  /* TODO_GC64: major changes required. */[m
[31m-  lua_assert(!isdead(J2G(J), o));[m
[31m-  for (ref = J->chain[IR_KGC]; ref; ref = cir[ref].prev)[m
[31m-    if (ir_kgc(&cir[ref]) == o)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  /* NOBARRIER: Current trace is a GC root. */[m
[31m-  setgcref(ir->gcr, o);[m
[31m-  ir->t.irt = (uint8_t)t;[m
[31m-  ir->o = IR_KGC;[m
[31m-  ir->prev = J->chain[IR_KGC];[m
[31m-  J->chain[IR_KGC] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, t);[m
[31m-}[m
[31m-[m
[31m-/* Intern 32 bit pointer constant. */[m
[31m-TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  lua_assert((void *)(uintptr_t)u32ptr(ptr) == ptr);[m
[31m-  for (ref = J->chain[op]; ref; ref = cir[ref].prev)[m
[31m-    if (mref(cir[ref].ptr, void) == ptr)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  setmref(ir->ptr, ptr);[m
[31m-  ir->t.irt = IRT_P32;[m
[31m-  ir->o = op;[m
[31m-  ir->prev = J->chain[op];[m
[31m-  J->chain[op] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, IRT_P32);[m
[31m-}[m
[31m-[m
[31m-/* Intern typed NULL constant. */[m
[31m-TRef lj_ir_knull(jit_State *J, IRType t)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef ref;[m
[31m-  for (ref = J->chain[IR_KNULL]; ref; ref = cir[ref].prev)[m
[31m-    if (irt_t(cir[ref].t) == t)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  ir->i = 0;[m
[31m-  ir->t.irt = (uint8_t)t;[m
[31m-  ir->o = IR_KNULL;[m
[31m-  ir->prev = J->chain[IR_KNULL];[m
[31m-  J->chain[IR_KNULL] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, t);[m
[31m-}[m
[31m-[m
[31m-/* Intern key slot. */[m
[31m-TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot)[m
[31m-{[m
[31m-  IRIns *ir, *cir = J->cur.ir;[m
[31m-  IRRef2 op12 = IRREF2((IRRef1)key, (IRRef1)slot);[m
[31m-  IRRef ref;[m
[31m-  /* Const part is not touched by CSE/DCE, so 0-65535 is ok for IRMlit here. */[m
[31m-  lua_assert(tref_isk(key) && slot == (IRRef)(IRRef1)slot);[m
[31m-  for (ref = J->chain[IR_KSLOT]; ref; ref = cir[ref].prev)[m
[31m-    if (cir[ref].op12 == op12)[m
[31m-      goto found;[m
[31m-  ref = ir_nextk(J);[m
[31m-  ir = IR(ref);[m
[31m-  ir->op12 = op12;[m
[31m-  ir->t.irt = IRT_P32;[m
[31m-  ir->o = IR_KSLOT;[m
[31m-  ir->prev = J->chain[IR_KSLOT];[m
[31m-  J->chain[IR_KSLOT] = (IRRef1)ref;[m
[31m-found:[m
[31m-  return TREF(ref, IRT_P32);[m
[31m-}[m
[31m-[m
[31m-/* -- Access to IR constants ---------------------------------------------- */[m
[31m-[m
[31m-/* Copy value of IR constant. */[m
[31m-void lj_ir_kvalue(lua_State *L, TValue *tv, const IRIns *ir)[m
[31m-{[m
[31m-  UNUSED(L);[m
[31m-  lua_assert(ir->o != IR_KSLOT);  /* Common mistake. */[m
[31m-  switch (ir->o) {[m
[31m-  case IR_KPRI: setpriV(tv, irt_toitype(ir->t)); break;[m
[31m-  case IR_KINT: setintV(tv, ir->i); break;[m
[31m-  case IR_KGC: setgcV(L, tv, ir_kgc(ir), irt_toitype(ir->t)); break;[m
[31m-  case IR_KPTR: case IR_KKPTR: case IR_KNULL:[m
[31m-    setlightudV(tv, mref(ir->ptr, void));[m
[31m-    break;[m
[31m-  case IR_KNUM: setnumV(tv, ir_knum(ir)->n); break;[m
[31m-#if LJ_HASFFI[m
[31m-  case IR_KINT64: {[m
[31m-    GCcdata *cd = lj_cdata_new_(L, CTID_INT64, 8);[m
[31m-    *(uint64_t *)cdataptr(cd) = ir_kint64(ir)->u64;[m
[31m-    setcdataV(L, tv, cd);[m
[31m-    break;[m
[31m-    }[m
[31m-#endif[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Convert IR operand types -------------------------------------------- */[m
[31m-[m
[31m-/* Convert from string to number. */[m
[31m-TRef LJ_FASTCALL lj_ir_tonumber(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (!tref_isnumber(tr)) {[m
[31m-    if (tref_isstr(tr))[m
[31m-      tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-    else[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Convert from integer or string to number. */[m
[31m-TRef LJ_FASTCALL lj_ir_tonum(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (!tref_isnum(tr)) {[m
[31m-    if (tref_isinteger(tr))[m
[31m-      tr = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT);[m
[31m-    else if (tref_isstr(tr))[m
[31m-      tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-    else[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Convert from integer or number to string. */[m
[31m-TRef LJ_FASTCALL lj_ir_tostr(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (!tref_isstr(tr)) {[m
[31m-    if (!tref_isnumber(tr))[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-    tr = emitir(IRT(IR_TOSTR, IRT_STR), tr,[m
[31m-		tref_isnum(tr) ? IRTOSTR_NUM : IRTOSTR_INT);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous IR ops ------------------------------------------------ */[m
[31m-[m
[31m-/* Evaluate numeric comparison. */[m
[31m-int lj_ir_numcmp(lua_Number a, lua_Number b, IROp op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case IR_EQ: return (a == b);[m
[31m-  case IR_NE: return (a != b);[m
[31m-  case IR_LT: return (a < b);[m
[31m-  case IR_GE: return (a >= b);[m
[31m-  case IR_LE: return (a <= b);[m
[31m-  case IR_GT: return (a > b);[m
[31m-  case IR_ULT: return !(a >= b);[m
[31m-  case IR_UGE: return !(a < b);[m
[31m-  case IR_ULE: return !(a > b);[m
[31m-  case IR_UGT: return !(a <= b);[m
[31m-  default: lua_assert(0); return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Evaluate string comparison. */[m
[31m-int lj_ir_strcmp(GCstr *a, GCstr *b, IROp op)[m
[31m-{[m
[31m-  int res = lj_str_cmp(a, b);[m
[31m-  switch (op) {[m
[31m-  case IR_LT: return (res < 0);[m
[31m-  case IR_GE: return (res >= 0);[m
[31m-  case IR_LE: return (res <= 0);[m
[31m-  case IR_GT: return (res > 0);[m
[31m-  default: lua_assert(0); return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Rollback IR to previous state. */[m
[31m-void lj_ir_rollback(jit_State *J, IRRef ref)[m
[31m-{[m
[31m-  IRRef nins = J->cur.nins;[m
[31m-  while (nins > ref) {[m
[31m-    IRIns *ir;[m
[31m-    nins--;[m
[31m-    ir = IR(nins);[m
[31m-    J->chain[ir->o] = ir->prev;[m
[31m-  }[m
[31m-  J->cur.nins = nins;[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef fins[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ir.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ir.h[m
[1mdeleted file mode 100644[m
[1mindex cd8df59..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ir.h[m
[1m+++ /dev/null[m
[36m@@ -1,577 +0,0 @@[m
[31m-/*[m
[31m-** SSA IR (Intermediate Representation) format.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_IR_H[m
[31m-#define _LJ_IR_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* -- IR instructions ----------------------------------------------------- */[m
[31m-[m
[31m-/* IR instruction definition. Order matters, see below. ORDER IR */[m
[31m-#define IRDEF(_) \[m
[31m-  /* Guarded assertions. */ \[m
[31m-  /* Must be properly aligned to flip opposites (^1) and (un)ordered (^4). */ \[m
[31m-  _(LT,		N , ref, ref) \[m
[31m-  _(GE,		N , ref, ref) \[m
[31m-  _(LE,		N , ref, ref) \[m
[31m-  _(GT,		N , ref, ref) \[m
[31m-  \[m
[31m-  _(ULT,	N , ref, ref) \[m
[31m-  _(UGE,	N , ref, ref) \[m
[31m-  _(ULE,	N , ref, ref) \[m
[31m-  _(UGT,	N , ref, ref) \[m
[31m-  \[m
[31m-  _(EQ,		C , ref, ref) \[m
[31m-  _(NE,		C , ref, ref) \[m
[31m-  \[m
[31m-  _(ABC,	N , ref, ref) \[m
[31m-  _(RETF,	S , ref, ref) \[m
[31m-  \[m
[31m-  /* Miscellaneous ops. */ \[m
[31m-  _(NOP,	N , ___, ___) \[m
[31m-  _(BASE,	N , lit, lit) \[m
[31m-  _(PVAL,	N , lit, ___) \[m
[31m-  _(GCSTEP,	S , ___, ___) \[m
[31m-  _(HIOP,	S , ref, ref) \[m
[31m-  _(LOOP,	S , ___, ___) \[m
[31m-  _(USE,	S , ref, ___) \[m
[31m-  _(PHI,	S , ref, ref) \[m
[31m-  _(RENAME,	S , ref, lit) \[m
[31m-  _(PROF,	S , ___, ___) \[m
[31m-  \[m
[31m-  /* Constants. */ \[m
[31m-  _(KPRI,	N , ___, ___) \[m
[31m-  _(KINT,	N , cst, ___) \[m
[31m-  _(KGC,	N , cst, ___) \[m
[31m-  _(KPTR,	N , cst, ___) \[m
[31m-  _(KKPTR,	N , cst, ___) \[m
[31m-  _(KNULL,	N , cst, ___) \[m
[31m-  _(KNUM,	N , cst, ___) \[m
[31m-  _(KINT64,	N , cst, ___) \[m
[31m-  _(KSLOT,	N , ref, lit) \[m
[31m-  \[m
[31m-  /* Bit ops. */ \[m
[31m-  _(BNOT,	N , ref, ___) \[m
[31m-  _(BSWAP,	N , ref, ___) \[m
[31m-  _(BAND,	C , ref, ref) \[m
[31m-  _(BOR,	C , ref, ref) \[m
[31m-  _(BXOR,	C , ref, ref) \[m
[31m-  _(BSHL,	N , ref, ref) \[m
[31m-  _(BSHR,	N , ref, ref) \[m
[31m-  _(BSAR,	N , ref, ref) \[m
[31m-  _(BROL,	N , ref, ref) \[m
[31m-  _(BROR,	N , ref, ref) \[m
[31m-  \[m
[31m-  /* Arithmetic ops. ORDER ARITH */ \[m
[31m-  _(ADD,	C , ref, ref) \[m
[31m-  _(SUB,	N , ref, ref) \[m
[31m-  _(MUL,	C , ref, ref) \[m
[31m-  _(DIV,	N , ref, ref) \[m
[31m-  _(MOD,	N , ref, ref) \[m
[31m-  _(POW,	N , ref, ref) \[m
[31m-  _(NEG,	N , ref, ref) \[m
[31m-  \[m
[31m-  _(ABS,	N , ref, ref) \[m
[31m-  _(ATAN2,	N , ref, ref) \[m
[31m-  _(LDEXP,	N , ref, ref) \[m
[31m-  _(MIN,	C , ref, ref) \[m
[31m-  _(MAX,	C , ref, ref) \[m
[31m-  _(FPMATH,	N , ref, lit) \[m
[31m-  \[m
[31m-  /* Overflow-checking arithmetic ops. */ \[m
[31m-  _(ADDOV,	CW, ref, ref) \[m
[31m-  _(SUBOV,	NW, ref, ref) \[m
[31m-  _(MULOV,	CW, ref, ref) \[m
[31m-  \[m
[31m-  /* Memory ops. A = array, H = hash, U = upvalue, F = field, S = stack. */ \[m
[31m-  \[m
[31m-  /* Memory references. */ \[m
[31m-  _(AREF,	R , ref, ref) \[m
[31m-  _(HREFK,	R , ref, ref) \[m
[31m-  _(HREF,	L , ref, ref) \[m
[31m-  _(NEWREF,	S , ref, ref) \[m
[31m-  _(UREFO,	LW, ref, lit) \[m
[31m-  _(UREFC,	LW, ref, lit) \[m
[31m-  _(FREF,	R , ref, lit) \[m
[31m-  _(STRREF,	N , ref, ref) \[m
[31m-  _(LREF,	L , ___, ___) \[m
[31m-  \[m
[31m-  /* Loads and Stores. These must be in the same order. */ \[m
[31m-  _(ALOAD,	L , ref, ___) \[m
[31m-  _(HLOAD,	L , ref, ___) \[m
[31m-  _(ULOAD,	L , ref, ___) \[m
[31m-  _(FLOAD,	L , ref, lit) \[m
[31m-  _(XLOAD,	L , ref, lit) \[m
[31m-  _(SLOAD,	L , lit, lit) \[m
[31m-  _(VLOAD,	L , ref, ___) \[m
[31m-  \[m
[31m-  _(ASTORE,	S , ref, ref) \[m
[31m-  _(HSTORE,	S , ref, ref) \[m
[31m-  _(USTORE,	S , ref, ref) \[m
[31m-  _(FSTORE,	S , ref, ref) \[m
[31m-  _(XSTORE,	S , ref, ref) \[m
[31m-  \[m
[31m-  /* Allocations. */ \[m
[31m-  _(SNEW,	N , ref, ref)  /* CSE is ok, not marked as A. */ \[m
[31m-  _(XSNEW,	A , ref, ref) \[m
[31m-  _(TNEW,	AW, lit, lit) \[m
[31m-  _(TDUP,	AW, ref, ___) \[m
[31m-  _(CNEW,	AW, ref, ref) \[m
[31m-  _(CNEWI,	NW, ref, ref)  /* CSE is ok, not marked as A. */ \[m
[31m-  \[m
[31m-  /* Buffer operations. */ \[m
[31m-  _(BUFHDR,	L , ref, lit) \[m
[31m-  _(BUFPUT,	L , ref, ref) \[m
[31m-  _(BUFSTR,	A , ref, ref) \[m
[31m-  \[m
[31m-  /* Barriers. */ \[m
[31m-  _(TBAR,	S , ref, ___) \[m
[31m-  _(OBAR,	S , ref, ref) \[m
[31m-  _(XBAR,	S , ___, ___) \[m
[31m-  \[m
[31m-  /* Type conversions. */ \[m
[31m-  _(CONV,	NW, ref, lit) \[m
[31m-  _(TOBIT,	N , ref, ref) \[m
[31m-  _(TOSTR,	N , ref, lit) \[m
[31m-  _(STRTO,	N , ref, ___) \[m
[31m-  \[m
[31m-  /* Calls. */ \[m
[31m-  _(CALLN,	N , ref, lit) \[m
[31m-  _(CALLA,	A , ref, lit) \[m
[31m-  _(CALLL,	L , ref, lit) \[m
[31m-  _(CALLS,	S , ref, lit) \[m
[31m-  _(CALLXS,	S , ref, ref) \[m
[31m-  _(CARG,	N , ref, ref) \[m
[31m-  \[m
[31m-  /* End of list. */[m
[31m-[m
[31m-/* IR opcodes (max. 256). */[m
[31m-typedef enum {[m
[31m-#define IRENUM(name, m, m1, m2)	IR_##name,[m
[31m-IRDEF(IRENUM)[m
[31m-#undef IRENUM[m
[31m-  IR__MAX[m
[31m-} IROp;[m
[31m-[m
[31m-/* Stored opcode. */[m
[31m-typedef uint8_t IROp1;[m
[31m-[m
[31m-LJ_STATIC_ASSERT(((int)IR_EQ^1) == (int)IR_NE);[m
[31m-LJ_STATIC_ASSERT(((int)IR_LT^1) == (int)IR_GE);[m
[31m-LJ_STATIC_ASSERT(((int)IR_LE^1) == (int)IR_GT);[m
[31m-LJ_STATIC_ASSERT(((int)IR_LT^3) == (int)IR_GT);[m
[31m-LJ_STATIC_ASSERT(((int)IR_LT^4) == (int)IR_ULT);[m
[31m-[m
[31m-/* Delta between xLOAD and xSTORE. */[m
[31m-#define IRDELTA_L2S		((int)IR_ASTORE - (int)IR_ALOAD)[m
[31m-[m
[31m-LJ_STATIC_ASSERT((int)IR_HLOAD + IRDELTA_L2S == (int)IR_HSTORE);[m
[31m-LJ_STATIC_ASSERT((int)IR_ULOAD + IRDELTA_L2S == (int)IR_USTORE);[m
[31m-LJ_STATIC_ASSERT((int)IR_FLOAD + IRDELTA_L2S == (int)IR_FSTORE);[m
[31m-LJ_STATIC_ASSERT((int)IR_XLOAD + IRDELTA_L2S == (int)IR_XSTORE);[m
[31m-[m
[31m-/* -- Named IR literals --------------------------------------------------- */[m
[31m-[m
[31m-/* FPMATH sub-functions. ORDER FPM. */[m
[31m-#define IRFPMDEF(_) \[m
[31m-  _(FLOOR) _(CEIL) _(TRUNC)  /* Must be first and in this order. */ \[m
[31m-  _(SQRT) _(EXP) _(EXP2) _(LOG) _(LOG2) _(LOG10) \[m
[31m-  _(SIN) _(COS) _(TAN) \[m
[31m-  _(OTHER)[m
[31m-[m
[31m-typedef enum {[m
[31m-#define FPMENUM(name)		IRFPM_##name,[m
[31m-IRFPMDEF(FPMENUM)[m
[31m-#undef FPMENUM[m
[31m-  IRFPM__MAX[m
[31m-} IRFPMathOp;[m
[31m-[m
[31m-/* FLOAD fields. */[m
[31m-#define IRFLDEF(_) \[m
[31m-  _(STR_LEN,	offsetof(GCstr, len)) \[m
[31m-  _(FUNC_ENV,	offsetof(GCfunc, l.env)) \[m
[31m-  _(FUNC_PC,	offsetof(GCfunc, l.pc)) \[m
[31m-  _(FUNC_FFID,	offsetof(GCfunc, l.ffid)) \[m
[31m-  _(THREAD_ENV,	offsetof(lua_State, env)) \[m
[31m-  _(TAB_META,	offsetof(GCtab, metatable)) \[m
[31m-  _(TAB_ARRAY,	offsetof(GCtab, array)) \[m
[31m-  _(TAB_NODE,	offsetof(GCtab, node)) \[m
[31m-  _(TAB_ASIZE,	offsetof(GCtab, asize)) \[m
[31m-  _(TAB_HMASK,	offsetof(GCtab, hmask)) \[m
[31m-  _(TAB_NOMM,	offsetof(GCtab, nomm)) \[m
[31m-  _(UDATA_META,	offsetof(GCudata, metatable)) \[m
[31m-  _(UDATA_UDTYPE, offsetof(GCudata, udtype)) \[m
[31m-  _(UDATA_FILE,	sizeof(GCudata)) \[m
[31m-  _(CDATA_CTYPEID, offsetof(GCcdata, ctypeid)) \[m
[31m-  _(CDATA_PTR,	sizeof(GCcdata)) \[m
[31m-  _(CDATA_INT, sizeof(GCcdata)) \[m
[31m-  _(CDATA_INT64, sizeof(GCcdata)) \[m
[31m-  _(CDATA_INT64_4, sizeof(GCcdata) + 4)[m
[31m-[m
[31m-typedef enum {[m
[31m-#define FLENUM(name, ofs)	IRFL_##name,[m
[31m-IRFLDEF(FLENUM)[m
[31m-#undef FLENUM[m
[31m-  IRFL__MAX[m
[31m-} IRFieldID;[m
[31m-[m
[31m-/* SLOAD mode bits, stored in op2. */[m
[31m-#define IRSLOAD_PARENT		0x01	/* Coalesce with parent trace. */[m
[31m-#define IRSLOAD_FRAME		0x02	/* Load hiword of frame. */[m
[31m-#define IRSLOAD_TYPECHECK	0x04	/* Needs type check. */[m
[31m-#define IRSLOAD_CONVERT		0x08	/* Number to integer conversion. */[m
[31m-#define IRSLOAD_READONLY	0x10	/* Read-only, omit slot store. */[m
[31m-#define IRSLOAD_INHERIT		0x20	/* Inherited by exits/side traces. */[m
[31m-[m
[31m-/* XLOAD mode, stored in op2. */[m
[31m-#define IRXLOAD_READONLY	1	/* Load from read-only data. */[m
[31m-#define IRXLOAD_VOLATILE	2	/* Load from volatile data. */[m
[31m-#define IRXLOAD_UNALIGNED	4	/* Unaligned load. */[m
[31m-[m
[31m-/* BUFHDR mode, stored in op2. */[m
[31m-#define IRBUFHDR_RESET		0	/* Reset buffer. */[m
[31m-#define IRBUFHDR_APPEND		1	/* Append to buffer. */[m
[31m-[m
[31m-/* CONV mode, stored in op2. */[m
[31m-#define IRCONV_SRCMASK		0x001f	/* Source IRType. */[m
[31m-#define IRCONV_DSTMASK		0x03e0	/* Dest. IRType (also in ir->t). */[m
[31m-#define IRCONV_DSH		5[m
[31m-#define IRCONV_NUM_INT		((IRT_NUM<<IRCONV_DSH)|IRT_INT)[m
[31m-#define IRCONV_INT_NUM		((IRT_INT<<IRCONV_DSH)|IRT_NUM)[m
[31m-#define IRCONV_SEXT		0x0800	/* Sign-extend integer to integer. */[m
[31m-#define IRCONV_MODEMASK		0x0fff[m
[31m-#define IRCONV_CONVMASK		0xf000[m
[31m-#define IRCONV_CSH		12[m
[31m-/* Number to integer conversion mode. Ordered by strength of the checks. */[m
[31m-#define IRCONV_TOBIT  (0<<IRCONV_CSH)	/* None. Cache only: TOBIT conv. */[m
[31m-#define IRCONV_ANY    (1<<IRCONV_CSH)	/* Any FP number is ok. */[m
[31m-#define IRCONV_INDEX  (2<<IRCONV_CSH)	/* Check + special backprop rules. */[m
[31m-#define IRCONV_CHECK  (3<<IRCONV_CSH)	/* Number checked for integerness. */[m
[31m-[m
[31m-/* TOSTR mode, stored in op2. */[m
[31m-#define IRTOSTR_INT		0	/* Convert integer to string. */[m
[31m-#define IRTOSTR_NUM		1	/* Convert number to string. */[m
[31m-#define IRTOSTR_CHAR		2	/* Convert char value to string. */[m
[31m-[m
[31m-/* -- IR operands --------------------------------------------------------- */[m
[31m-[m
[31m-/* IR operand mode (2 bit). */[m
[31m-typedef enum {[m
[31m-  IRMref,		/* IR reference. */[m
[31m-  IRMlit,		/* 16 bit unsigned literal. */[m
[31m-  IRMcst,		/* Constant literal: i, gcr or ptr. */[m
[31m-  IRMnone		/* Unused operand. */[m
[31m-} IRMode;[m
[31m-#define IRM___		IRMnone[m
[31m-[m
[31m-/* Mode bits: Commutative, {Normal/Ref, Alloc, Load, Store}, Non-weak guard. */[m
[31m-#define IRM_C			0x10[m
[31m-[m
[31m-#define IRM_N			0x00[m
[31m-#define IRM_R			IRM_N[m
[31m-#define IRM_A			0x20[m
[31m-#define IRM_L			0x40[m
[31m-#define IRM_S			0x60[m
[31m-[m
[31m-#define IRM_W			0x80[m
[31m-[m
[31m-#define IRM_NW			(IRM_N|IRM_W)[m
[31m-#define IRM_CW			(IRM_C|IRM_W)[m
[31m-#define IRM_AW			(IRM_A|IRM_W)[m
[31m-#define IRM_LW			(IRM_L|IRM_W)[m
[31m-[m
[31m-#define irm_op1(m)		((IRMode)((m)&3))[m
[31m-#define irm_op2(m)		((IRMode)(((m)>>2)&3))[m
[31m-#define irm_iscomm(m)		((m) & IRM_C)[m
[31m-#define irm_kind(m)		((m) & IRM_S)[m
[31m-[m
[31m-#define IRMODE(name, m, m1, m2)	(((IRM##m1)|((IRM##m2)<<2)|(IRM_##m))^IRM_W),[m
[31m-[m
[31m-LJ_DATA const uint8_t lj_ir_mode[IR__MAX+1];[m
[31m-[m
[31m-/* -- IR instruction types ------------------------------------------------ */[m
[31m-[m
[31m-/* Map of itypes to non-negative numbers. ORDER LJ_T.[m
[31m-** LJ_TUPVAL/LJ_TTRACE never appear in a TValue. Use these itypes for[m
[31m-** IRT_P32 and IRT_P64, which never escape the IR.[m
[31m-** The various integers are only used in the IR and can only escape to[m
[31m-** a TValue after implicit or explicit conversion. Their types must be[m
[31m-** contiguous and next to IRT_NUM (see the typerange macros below).[m
[31m-*/[m
[31m-#define IRTDEF(_) \[m
[31m-  _(NIL, 4) _(FALSE, 4) _(TRUE, 4) _(LIGHTUD, LJ_64 ? 8 : 4) _(STR, 4) \[m
[31m-  _(P32, 4) _(THREAD, 4) _(PROTO, 4) _(FUNC, 4) _(P64, 8) _(CDATA, 4) \[m
[31m-  _(TAB, 4) _(UDATA, 4) \[m
[31m-  _(FLOAT, 4) _(NUM, 8) _(I8, 1) _(U8, 1) _(I16, 2) _(U16, 2) \[m
[31m-  _(INT, 4) _(U32, 4) _(I64, 8) _(U64, 8) \[m
[31m-  _(SOFTFP, 4)  /* There is room for 9 more types. */[m
[31m-[m
[31m-/* IR result type and flags (8 bit). */[m
[31m-typedef enum {[m
[31m-#define IRTENUM(name, size)	IRT_##name,[m
[31m-IRTDEF(IRTENUM)[m
[31m-#undef IRTENUM[m
[31m-  IRT__MAX,[m
[31m-[m
[31m-  /* Native pointer type and the corresponding integer type. */[m
[31m-  IRT_PTR = LJ_64 ? IRT_P64 : IRT_P32,[m
[31m-  IRT_INTP = LJ_64 ? IRT_I64 : IRT_INT,[m
[31m-  IRT_UINTP = LJ_64 ? IRT_U64 : IRT_U32,[m
[31m-  /* TODO_GC64: major changes required for all uses of IRT_P32. */[m
[31m-[m
[31m-  /* Additional flags. */[m
[31m-  IRT_MARK = 0x20,	/* Marker for misc. purposes. */[m
[31m-  IRT_ISPHI = 0x40,	/* Instruction is left or right PHI operand. */[m
[31m-  IRT_GUARD = 0x80,	/* Instruction is a guard. */[m
[31m-[m
[31m-  /* Masks. */[m
[31m-  IRT_TYPE = 0x1f,[m
[31m-  IRT_T = 0xff[m
[31m-} IRType;[m
[31m-[m
[31m-#define irtype_ispri(irt)	((uint32_t)(irt) <= IRT_TRUE)[m
[31m-[m
[31m-/* Stored IRType. */[m
[31m-typedef struct IRType1 { uint8_t irt; } IRType1;[m
[31m-[m
[31m-#define IRT(o, t)		((uint32_t)(((o)<<8) | (t)))[m
[31m-#define IRTI(o)			(IRT((o), IRT_INT))[m
[31m-#define IRTN(o)			(IRT((o), IRT_NUM))[m
[31m-#define IRTG(o, t)		(IRT((o), IRT_GUARD|(t)))[m
[31m-#define IRTGI(o)		(IRT((o), IRT_GUARD|IRT_INT))[m
[31m-[m
[31m-#define irt_t(t)		((IRType)(t).irt)[m
[31m-#define irt_type(t)		((IRType)((t).irt & IRT_TYPE))[m
[31m-#define irt_sametype(t1, t2)	((((t1).irt ^ (t2).irt) & IRT_TYPE) == 0)[m
[31m-#define irt_typerange(t, first, last) \[m
[31m-  ((uint32_t)((t).irt & IRT_TYPE) - (uint32_t)(first) <= (uint32_t)(last-first))[m
[31m-[m
[31m-#define irt_isnil(t)		(irt_type(t) == IRT_NIL)[m
[31m-#define irt_ispri(t)		((uint32_t)irt_type(t) <= IRT_TRUE)[m
[31m-#define irt_islightud(t)	(irt_type(t) == IRT_LIGHTUD)[m
[31m-#define irt_isstr(t)		(irt_type(t) == IRT_STR)[m
[31m-#define irt_istab(t)		(irt_type(t) == IRT_TAB)[m
[31m-#define irt_iscdata(t)		(irt_type(t) == IRT_CDATA)[m
[31m-#define irt_isfloat(t)		(irt_type(t) == IRT_FLOAT)[m
[31m-#define irt_isnum(t)		(irt_type(t) == IRT_NUM)[m
[31m-#define irt_isint(t)		(irt_type(t) == IRT_INT)[m
[31m-#define irt_isi8(t)		(irt_type(t) == IRT_I8)[m
[31m-#define irt_isu8(t)		(irt_type(t) == IRT_U8)[m
[31m-#define irt_isi16(t)		(irt_type(t) == IRT_I16)[m
[31m-#define irt_isu16(t)		(irt_type(t) == IRT_U16)[m
[31m-#define irt_isu32(t)		(irt_type(t) == IRT_U32)[m
[31m-#define irt_isi64(t)		(irt_type(t) == IRT_I64)[m
[31m-#define irt_isu64(t)		(irt_type(t) == IRT_U64)[m
[31m-[m
[31m-#define irt_isfp(t)		(irt_isnum(t) || irt_isfloat(t))[m
[31m-#define irt_isinteger(t)	(irt_typerange((t), IRT_I8, IRT_INT))[m
[31m-#define irt_isgcv(t)		(irt_typerange((t), IRT_STR, IRT_UDATA))[m
[31m-#define irt_isaddr(t)		(irt_typerange((t), IRT_LIGHTUD, IRT_UDATA))[m
[31m-#define irt_isint64(t)		(irt_typerange((t), IRT_I64, IRT_U64))[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define IRT_IS64 \[m
[31m-  ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64)|(1u<<IRT_P64)|\[m
[31m-   (1u<<IRT_LIGHTUD)|(1u<<IRT_STR)|(1u<<IRT_THREAD)|(1u<<IRT_PROTO)|\[m
[31m-   (1u<<IRT_FUNC)|(1u<<IRT_CDATA)|(1u<<IRT_TAB)|(1u<<IRT_UDATA))[m
[31m-#elif LJ_64[m
[31m-#define IRT_IS64 \[m
[31m-  ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64)|(1u<<IRT_P64)|(1u<<IRT_LIGHTUD))[m
[31m-#else[m
[31m-#define IRT_IS64 \[m
[31m-  ((1u<<IRT_NUM)|(1u<<IRT_I64)|(1u<<IRT_U64))[m
[31m-#endif[m
[31m-[m
[31m-#define irt_is64(t)		((IRT_IS64 >> irt_type(t)) & 1)[m
[31m-#define irt_is64orfp(t)		(((IRT_IS64|(1u<<IRT_FLOAT))>>irt_type(t)) & 1)[m
[31m-[m
[31m-#define irt_size(t)		(lj_ir_type_size[irt_t((t))])[m
[31m-[m
[31m-LJ_DATA const uint8_t lj_ir_type_size[];[m
[31m-[m
[31m-static LJ_AINLINE IRType itype2irt(const TValue *tv)[m
[31m-{[m
[31m-  if (tvisint(tv))[m
[31m-    return IRT_INT;[m
[31m-  else if (tvisnum(tv))[m
[31m-    return IRT_NUM;[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-  else if (tvislightud(tv))[m
[31m-    return IRT_LIGHTUD;[m
[31m-#endif[m
[31m-  else[m
[31m-    return (IRType)~itype(tv);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE uint32_t irt_toitype_(IRType t)[m
[31m-{[m
[31m-  lua_assert(!LJ_64 || t != IRT_LIGHTUD);[m
[31m-  if (LJ_DUALNUM && t > IRT_NUM) {[m
[31m-    return LJ_TISNUM;[m
[31m-  } else {[m
[31m-    lua_assert(t <= IRT_NUM);[m
[31m-    return ~(uint32_t)t;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#define irt_toitype(t)		irt_toitype_(irt_type((t)))[m
[31m-[m
[31m-#define irt_isguard(t)		((t).irt & IRT_GUARD)[m
[31m-#define irt_ismarked(t)		((t).irt & IRT_MARK)[m
[31m-#define irt_setmark(t)		((t).irt |= IRT_MARK)[m
[31m-#define irt_clearmark(t)	((t).irt &= ~IRT_MARK)[m
[31m-#define irt_isphi(t)		((t).irt & IRT_ISPHI)[m
[31m-#define irt_setphi(t)		((t).irt |= IRT_ISPHI)[m
[31m-#define irt_clearphi(t)		((t).irt &= ~IRT_ISPHI)[m
[31m-[m
[31m-/* Stored combined IR opcode and type. */[m
[31m-typedef uint16_t IROpT;[m
[31m-[m
[31m-/* -- IR references ------------------------------------------------------- */[m
[31m-[m
[31m-/* IR references. */[m
[31m-typedef uint16_t IRRef1;	/* One stored reference. */[m
[31m-typedef uint32_t IRRef2;	/* Two stored references. */[m
[31m-typedef uint32_t IRRef;		/* Used to pass around references. */[m
[31m-[m
[31m-/* Fixed references. */[m
[31m-enum {[m
[31m-  REF_BIAS =	0x8000,[m
[31m-  REF_TRUE =	REF_BIAS-3,[m
[31m-  REF_FALSE =	REF_BIAS-2,[m
[31m-  REF_NIL =	REF_BIAS-1,	/* \--- Constants grow downwards. */[m
[31m-  REF_BASE =	REF_BIAS,	/* /--- IR grows upwards. */[m
[31m-  REF_FIRST =	REF_BIAS+1,[m
[31m-  REF_DROP =	0xffff[m
[31m-};[m
[31m-[m
[31m-/* Note: IRMlit operands must be < REF_BIAS, too![m
[31m-** This allows for fast and uniform manipulation of all operands[m
[31m-** without looking up the operand mode in lj_ir_mode:[m
[31m-** - CSE calculates the maximum reference of two operands.[m
[31m-**   This must work with mixed reference/literal operands, too.[m
[31m-** - DCE marking only checks for operand >= REF_BIAS.[m
[31m-** - LOOP needs to substitute reference operands.[m
[31m-**   Constant references and literals must not be modified.[m
[31m-*/[m
[31m-[m
[31m-#define IRREF2(lo, hi)		((IRRef2)(lo) | ((IRRef2)(hi) << 16))[m
[31m-[m
[31m-#define irref_isk(ref)		((ref) < REF_BIAS)[m
[31m-[m
[31m-/* Tagged IR references (32 bit).[m
[31m-**[m
[31m-** +-------+-------+---------------+[m
[31m-** |  irt  | flags |      ref      |[m
[31m-** +-------+-------+---------------+[m
[31m-**[m
[31m-** The tag holds a copy of the IRType and speeds up IR type checks.[m
[31m-*/[m
[31m-typedef uint32_t TRef;[m
[31m-[m
[31m-#define TREF_REFMASK		0x0000ffff[m
[31m-#define TREF_FRAME		0x00010000[m
[31m-#define TREF_CONT		0x00020000[m
[31m-[m
[31m-#define TREF(ref, t)		((TRef)((ref) + ((t)<<24)))[m
[31m-[m
[31m-#define tref_ref(tr)		((IRRef1)(tr))[m
[31m-#define tref_t(tr)		((IRType)((tr)>>24))[m
[31m-#define tref_type(tr)		((IRType)(((tr)>>24) & IRT_TYPE))[m
[31m-#define tref_typerange(tr, first, last) \[m
[31m-  ((((tr)>>24) & IRT_TYPE) - (TRef)(first) <= (TRef)(last-first))[m
[31m-[m
[31m-#define tref_istype(tr, t)	(((tr) & (IRT_TYPE<<24)) == ((t)<<24))[m
[31m-#define tref_isnil(tr)		(tref_istype((tr), IRT_NIL))[m
[31m-#define tref_isfalse(tr)	(tref_istype((tr), IRT_FALSE))[m
[31m-#define tref_istrue(tr)		(tref_istype((tr), IRT_TRUE))[m
[31m-#define tref_islightud(tr)	(tref_istype((tr), IRT_LIGHTUD))[m
[31m-#define tref_isstr(tr)		(tref_istype((tr), IRT_STR))[m
[31m-#define tref_isfunc(tr)		(tref_istype((tr), IRT_FUNC))[m
[31m-#define tref_iscdata(tr)	(tref_istype((tr), IRT_CDATA))[m
[31m-#define tref_istab(tr)		(tref_istype((tr), IRT_TAB))[m
[31m-#define tref_isudata(tr)	(tref_istype((tr), IRT_UDATA))[m
[31m-#define tref_isnum(tr)		(tref_istype((tr), IRT_NUM))[m
[31m-#define tref_isint(tr)		(tref_istype((tr), IRT_INT))[m
[31m-[m
[31m-#define tref_isbool(tr)		(tref_typerange((tr), IRT_FALSE, IRT_TRUE))[m
[31m-#define tref_ispri(tr)		(tref_typerange((tr), IRT_NIL, IRT_TRUE))[m
[31m-#define tref_istruecond(tr)	(!tref_typerange((tr), IRT_NIL, IRT_FALSE))[m
[31m-#define tref_isinteger(tr)	(tref_typerange((tr), IRT_I8, IRT_INT))[m
[31m-#define tref_isnumber(tr)	(tref_typerange((tr), IRT_NUM, IRT_INT))[m
[31m-#define tref_isnumber_str(tr)	(tref_isnumber((tr)) || tref_isstr((tr)))[m
[31m-#define tref_isgcv(tr)		(tref_typerange((tr), IRT_STR, IRT_UDATA))[m
[31m-[m
[31m-#define tref_isk(tr)		(irref_isk(tref_ref((tr))))[m
[31m-#define tref_isk2(tr1, tr2)	(irref_isk(tref_ref((tr1) | (tr2))))[m
[31m-[m
[31m-#define TREF_PRI(t)		(TREF(REF_NIL-(t), (t)))[m
[31m-#define TREF_NIL		(TREF_PRI(IRT_NIL))[m
[31m-#define TREF_FALSE		(TREF_PRI(IRT_FALSE))[m
[31m-#define TREF_TRUE		(TREF_PRI(IRT_TRUE))[m
[31m-[m
[31m-/* -- IR format ----------------------------------------------------------- */[m
[31m-[m
[31m-/* IR instruction format (64 bit).[m
[31m-**[m
[31m-**    16      16     8   8   8   8[m
[31m-** +-------+-------+---+---+---+---+[m
[31m-** |  op1  |  op2  | t | o | r | s |[m
[31m-** +-------+-------+---+---+---+---+[m
[31m-** |  op12/i/gco   |   ot  | prev  | (alternative fields in union)[m
[31m-** +---------------+-------+-------+[m
[31m-**        32           16      16[m
[31m-**[m
[31m-** prev is only valid prior to register allocation and then reused for r + s.[m
[31m-*/[m
[31m-[m
[31m-typedef union IRIns {[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      IRRef1 op1;	/* IR operand 1. */[m
[31m-    , IRRef1 op2;	/* IR operand 2. */[m
[31m-    )[m
[31m-    IROpT ot;		/* IR opcode and type (overlaps t and o). */[m
[31m-    IRRef1 prev;	/* Previous ins in same chain (overlaps r and s). */[m
[31m-  };[m
[31m-  struct {[m
[31m-    IRRef2 op12;	/* IR operand 1 and 2 (overlaps op1 and op2). */[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      IRType1 t;	/* IR type. */[m
[31m-    , IROp1 o;		/* IR opcode. */[m
[31m-    )[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      uint8_t r;	/* Register allocation (overlaps prev). */[m
[31m-    , uint8_t s;	/* Spill slot allocation (overlaps prev). */[m
[31m-    )[m
[31m-  };[m
[31m-  int32_t i;		/* 32 bit signed integer literal (overlaps op12). */[m
[31m-  GCRef gcr;		/* GCobj constant (overlaps op12). */[m
[31m-  MRef ptr;		/* Pointer constant (overlaps op12). */[m
[31m-} IRIns;[m
[31m-[m
[31m-/* TODO_GC64: major changes required. */[m
[31m-#define ir_kgc(ir)	check_exp((ir)->o == IR_KGC, gcref((ir)->gcr))[m
[31m-#define ir_kstr(ir)	(gco2str(ir_kgc((ir))))[m
[31m-#define ir_ktab(ir)	(gco2tab(ir_kgc((ir))))[m
[31m-#define ir_kfunc(ir)	(gco2func(ir_kgc((ir))))[m
[31m-#define ir_kcdata(ir)	(gco2cd(ir_kgc((ir))))[m
[31m-#define ir_knum(ir)	check_exp((ir)->o == IR_KNUM, mref((ir)->ptr, cTValue))[m
[31m-#define ir_kint64(ir)	check_exp((ir)->o == IR_KINT64, mref((ir)->ptr,cTValue))[m
[31m-#define ir_k64(ir) \[m
[31m-  check_exp((ir)->o == IR_KNUM || (ir)->o == IR_KINT64, mref((ir)->ptr,cTValue))[m
[31m-#define ir_kptr(ir) \[m
[31m-  check_exp((ir)->o == IR_KPTR || (ir)->o == IR_KKPTR, mref((ir)->ptr, void))[m
[31m-[m
[31m-/* A store or any other op with a non-weak guard has a side-effect. */[m
[31m-static LJ_AINLINE int ir_sideeff(IRIns *ir)[m
[31m-{[m
[31m-  return (((ir->t.irt | ~IRT_GUARD) & lj_ir_mode[ir->o]) >= IRM_S);[m
[31m-}[m
[31m-[m
[31m-LJ_STATIC_ASSERT((int)IRT_GUARD == (int)IRM_W);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ircall.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ircall.h[m
[1mdeleted file mode 100644[m
[1mindex 144135a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_ircall.h[m
[1m+++ /dev/null[m
[36m@@ -1,349 +0,0 @@[m
[31m-/*[m
[31m-** IR CALL* instruction definitions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_IRCALL_H[m
[31m-#define _LJ_IRCALL_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-/* C call info for CALL* instructions. */[m
[31m-typedef struct CCallInfo {[m
[31m-  ASMFunction func;		/* Function pointer. */[m
[31m-  uint32_t flags;		/* Number of arguments and flags. */[m
[31m-} CCallInfo;[m
[31m-[m
[31m-#define CCI_NARGS(ci)		((ci)->flags & 0xff)	/* # of args. */[m
[31m-#define CCI_NARGS_MAX		32			/* Max. # of args. */[m
[31m-[m
[31m-#define CCI_OTSHIFT		16[m
[31m-#define CCI_OPTYPE(ci)		((ci)->flags >> CCI_OTSHIFT)  /* Get op/type. */[m
[31m-#define CCI_OPSHIFT		24[m
[31m-#define CCI_OP(ci)		((ci)->flags >> CCI_OPSHIFT)  /* Get op. */[m
[31m-[m
[31m-#define CCI_CALL_N		(IR_CALLN << CCI_OPSHIFT)[m
[31m-#define CCI_CALL_A		(IR_CALLA << CCI_OPSHIFT)[m
[31m-#define CCI_CALL_L		(IR_CALLL << CCI_OPSHIFT)[m
[31m-#define CCI_CALL_S		(IR_CALLS << CCI_OPSHIFT)[m
[31m-#define CCI_CALL_FN		(CCI_CALL_N|CCI_CC_FASTCALL)[m
[31m-#define CCI_CALL_FL		(CCI_CALL_L|CCI_CC_FASTCALL)[m
[31m-#define CCI_CALL_FS		(CCI_CALL_S|CCI_CC_FASTCALL)[m
[31m-[m
[31m-/* C call info flags. */[m
[31m-#define CCI_L			0x0100	/* Implicit L arg. */[m
[31m-#define CCI_CASTU64		0x0200	/* Cast u64 result to number. */[m
[31m-#define CCI_NOFPRCLOBBER	0x0400	/* Does not clobber any FPRs. */[m
[31m-#define CCI_VARARG		0x0800	/* Vararg function. */[m
[31m-[m
[31m-#define CCI_CC_MASK		0x3000	/* Calling convention mask. */[m
[31m-#define CCI_CC_SHIFT		12[m
[31m-/* ORDER CC */[m
[31m-#define CCI_CC_CDECL		0x0000	/* Default cdecl calling convention. */[m
[31m-#define CCI_CC_THISCALL		0x1000	/* Thiscall calling convention. */[m
[31m-#define CCI_CC_FASTCALL		0x2000	/* Fastcall calling convention. */[m
[31m-#define CCI_CC_STDCALL		0x3000	/* Stdcall calling convention. */[m
[31m-[m
[31m-/* Extra args for SOFTFP, SPLIT 64 bit. */[m
[31m-#define CCI_XARGS_SHIFT		14[m
[31m-#define CCI_XARGS(ci)		(((ci)->flags >> CCI_XARGS_SHIFT) & 3)[m
[31m-#define CCI_XA			(1u << CCI_XARGS_SHIFT)[m
[31m-[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-#define CCI_XNARGS(ci)		(CCI_NARGS((ci)) + CCI_XARGS((ci)))[m
[31m-#else[m
[31m-#define CCI_XNARGS(ci)		CCI_NARGS((ci))[m
[31m-#endif[m
[31m-[m
[31m-/* Helpers for conditional function definitions. */[m
[31m-#define IRCALLCOND_ANY(x)		x[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#define IRCALLCOND_FPMATH(x)		NULL[m
[31m-#else[m
[31m-#define IRCALLCOND_FPMATH(x)		x[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-#define IRCALLCOND_SOFTFP(x)		x[m
[31m-#if LJ_HASFFI[m
[31m-#define IRCALLCOND_SOFTFP_FFI(x)	x[m
[31m-#else[m
[31m-#define IRCALLCOND_SOFTFP_FFI(x)	NULL[m
[31m-#endif[m
[31m-#else[m
[31m-#define IRCALLCOND_SOFTFP(x)		NULL[m
[31m-#define IRCALLCOND_SOFTFP_FFI(x)	NULL[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_SOFTFP && LJ_TARGET_MIPS[m
[31m-#define IRCALLCOND_SOFTFP_MIPS(x)	x[m
[31m-#else[m
[31m-#define IRCALLCOND_SOFTFP_MIPS(x)	NULL[m
[31m-#endif[m
[31m-[m
[31m-#define LJ_NEED_FP64	(LJ_TARGET_ARM || LJ_TARGET_PPC || LJ_TARGET_MIPS)[m
[31m-[m
[31m-#if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)[m
[31m-#define IRCALLCOND_FP64_FFI(x)		x[m
[31m-#else[m
[31m-#define IRCALLCOND_FP64_FFI(x)		NULL[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-#define IRCALLCOND_FFI(x)		x[m
[31m-#if LJ_32[m
[31m-#define IRCALLCOND_FFI32(x)		x[m
[31m-#else[m
[31m-#define IRCALLCOND_FFI32(x)		NULL[m
[31m-#endif[m
[31m-#else[m
[31m-#define IRCALLCOND_FFI(x)		NULL[m
[31m-#define IRCALLCOND_FFI32(x)		NULL[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_X86[m
[31m-#define CCI_RANDFPR	0	/* Clang on OSX/x86 is overzealous. */[m
[31m-#else[m
[31m-#define CCI_RANDFPR	CCI_NOFPRCLOBBER[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-#define XA_FP		CCI_XA[m
[31m-#define XA2_FP		(CCI_XA+CCI_XA)[m
[31m-#else[m
[31m-#define XA_FP		0[m
[31m-#define XA2_FP		0[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_32[m
[31m-#define XA_64		CCI_XA[m
[31m-#define XA2_64		(CCI_XA+CCI_XA)[m
[31m-#else[m
[31m-#define XA_64		0[m
[31m-#define XA2_64		0[m
[31m-#endif[m
[31m-[m
[31m-/* Function definitions for CALL* instructions. */[m
[31m-#define IRCALLDEF(_) \[m
[31m-  _(ANY,	lj_str_cmp,		2,  FN, INT, CCI_NOFPRCLOBBER) \[m
[31m-  _(ANY,	lj_str_find,		4,   N, P32, 0) \[m
[31m-  _(ANY,	lj_str_new,		3,   S, STR, CCI_L) \[m
[31m-  _(ANY,	lj_strscan_num,		2,  FN, INT, 0) \[m
[31m-  _(ANY,	lj_strfmt_int,		2,  FN, STR, CCI_L) \[m
[31m-  _(ANY,	lj_strfmt_num,		2,  FN, STR, CCI_L) \[m
[31m-  _(ANY,	lj_strfmt_char,		2,  FN, STR, CCI_L) \[m
[31m-  _(ANY,	lj_strfmt_putint,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_strfmt_putnum,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_strfmt_putquoted,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_strfmt_putfxint,	3,   L, P32, XA_64) \[m
[31m-  _(ANY,	lj_strfmt_putfnum_int,	3,   L, P32, XA_FP) \[m
[31m-  _(ANY,	lj_strfmt_putfnum_uint,	3,   L, P32, XA_FP) \[m
[31m-  _(ANY,	lj_strfmt_putfnum,	3,   L, P32, XA_FP) \[m
[31m-  _(ANY,	lj_strfmt_putfstr,	3,   L, P32, 0) \[m
[31m-  _(ANY,	lj_strfmt_putfchar,	3,   L, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putmem,		3,   S, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr,		2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putchar,		2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr_reverse,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr_lower,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr_upper,	2,  FL, P32, 0) \[m
[31m-  _(ANY,	lj_buf_putstr_rep,	3,   L, P32, 0) \[m
[31m-  _(ANY,	lj_buf_puttab,		5,   L, P32, 0) \[m
[31m-  _(ANY,	lj_buf_tostr,		1,  FL, STR, 0) \[m
[31m-  _(ANY,	lj_tab_new_ah,		3,   A, TAB, CCI_L) \[m
[31m-  _(ANY,	lj_tab_new1,		2,  FS, TAB, CCI_L) \[m
[31m-  _(ANY,	lj_tab_dup,		2,  FS, TAB, CCI_L) \[m
[31m-  _(ANY,	lj_tab_clear,		1,  FS, NIL, 0) \[m
[31m-  _(ANY,	lj_tab_newkey,		3,   S, P32, CCI_L) \[m
[31m-  _(ANY,	lj_tab_len,		1,  FL, INT, 0) \[m
[31m-  _(ANY,	lj_gc_step_jit,		2,  FS, NIL, CCI_L) \[m
[31m-  _(ANY,	lj_gc_barrieruv,	2,  FS, NIL, 0) \[m
[31m-  _(ANY,	lj_mem_newgco,		2,  FS, P32, CCI_L) \[m
[31m-  _(ANY,	lj_math_random_step, 1, FS, NUM, CCI_CASTU64|CCI_RANDFPR)\[m
[31m-  _(ANY,	lj_vm_modi,		2,  FN, INT, 0) \[m
[31m-  _(ANY,	sinh,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	cosh,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	tanh,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	fputc,			2,   S, INT, 0) \[m
[31m-  _(ANY,	fwrite,			4,   S, INT, 0) \[m
[31m-  _(ANY,	fflush,			1,   S, INT, 0) \[m
[31m-  /* ORDER FPM */ \[m
[31m-  _(FPMATH,	lj_vm_floor,		1,   N, NUM, XA_FP) \[m
[31m-  _(FPMATH,	lj_vm_ceil,		1,   N, NUM, XA_FP) \[m
[31m-  _(FPMATH,	lj_vm_trunc,		1,   N, NUM, XA_FP) \[m
[31m-  _(FPMATH,	sqrt,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	exp,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	lj_vm_exp2,		1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	log,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	lj_vm_log2,		1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	log10,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	sin,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	cos,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	tan,			1,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	lj_vm_powi,		2,   N, NUM, XA_FP) \[m
[31m-  _(ANY,	pow,			2,   N, NUM, XA2_FP) \[m
[31m-  _(ANY,	atan2,			2,   N, NUM, XA2_FP) \[m
[31m-  _(ANY,	ldexp,			2,   N, NUM, XA_FP) \[m
[31m-  _(SOFTFP,	lj_vm_tobit,		2,   N, INT, 0) \[m
[31m-  _(SOFTFP,	softfp_add,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_sub,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_mul,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_div,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_cmp,		4,   N, NIL, 0) \[m
[31m-  _(SOFTFP,	softfp_i2d,		1,   N, NUM, 0) \[m
[31m-  _(SOFTFP,	softfp_d2i,		2,   N, INT, 0) \[m
[31m-  _(SOFTFP_MIPS, lj_vm_sfmin,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP_MIPS, lj_vm_sfmax,		4,   N, NUM, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_ui2d,		1,   N, NUM, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_f2d,		1,   N, NUM, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_d2ui,		2,   N, INT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_d2f,		2,   N, FLOAT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_i2f,		1,   N, FLOAT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_ui2f,		1,   N, FLOAT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_f2i,		1,   N, INT, 0) \[m
[31m-  _(SOFTFP_FFI,	softfp_f2ui,		1,   N, INT, 0) \[m
[31m-  _(FP64_FFI,	fp64_l2d,		1,   N, NUM, XA_64) \[m
[31m-  _(FP64_FFI,	fp64_ul2d,		1,   N, NUM, XA_64) \[m
[31m-  _(FP64_FFI,	fp64_l2f,		1,   N, FLOAT, XA_64) \[m
[31m-  _(FP64_FFI,	fp64_ul2f,		1,   N, FLOAT, XA_64) \[m
[31m-  _(FP64_FFI,	fp64_d2l,		1,   N, I64, XA_FP) \[m
[31m-  _(FP64_FFI,	fp64_d2ul,		1,   N, U64, XA_FP) \[m
[31m-  _(FP64_FFI,	fp64_f2l,		1,   N, I64, 0) \[m
[31m-  _(FP64_FFI,	fp64_f2ul,		1,   N, U64, 0) \[m
[31m-  _(FFI,	lj_carith_divi64,	2,   N, I64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_divu64,	2,   N, U64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_modi64,	2,   N, I64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_modu64,	2,   N, U64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_powi64,	2,   N, I64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_carith_powu64,	2,   N, U64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI,	lj_cdata_newv,		4,   S, CDATA, CCI_L) \[m
[31m-  _(FFI,	lj_cdata_setfin,	4,   S, NIL, CCI_L) \[m
[31m-  _(FFI,	strlen,			1,   L, INTP, 0) \[m
[31m-  _(FFI,	memcpy,			3,   S, PTR, 0) \[m
[31m-  _(FFI,	memset,			3,   S, PTR, 0) \[m
[31m-  _(FFI,	lj_vm_errno,		0,   S, INT, CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_mul64,	2,   N, I64, XA2_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_shl64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_shr64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_sar64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_rol64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  _(FFI32,	lj_carith_ror64,	2,   N, U64, XA_64|CCI_NOFPRCLOBBER) \[m
[31m-  \[m
[31m-  /* End of list. */[m
[31m-[m
[31m-typedef enum {[m
[31m-#define IRCALLENUM(cond, name, nargs, kind, type, flags)	IRCALL_##name,[m
[31m-IRCALLDEF(IRCALLENUM)[m
[31m-#undef IRCALLENUM[m
[31m-  IRCALL__MAX[m
[31m-} IRCallID;[m
[31m-[m
[31m-LJ_FUNC TRef lj_ir_call(jit_State *J, IRCallID id, ...);[m
[31m-[m
[31m-LJ_DATA const CCallInfo lj_ir_callinfo[IRCALL__MAX+1];[m
[31m-[m
[31m-/* Soft-float declarations. */[m
[31m-#if LJ_SOFTFP[m
[31m-#if LJ_TARGET_ARM[m
[31m-#define softfp_add __aeabi_dadd[m
[31m-#define softfp_sub __aeabi_dsub[m
[31m-#define softfp_mul __aeabi_dmul[m
[31m-#define softfp_div __aeabi_ddiv[m
[31m-#define softfp_cmp __aeabi_cdcmple[m
[31m-#define softfp_i2d __aeabi_i2d[m
[31m-#define softfp_d2i __aeabi_d2iz[m
[31m-#define softfp_ui2d __aeabi_ui2d[m
[31m-#define softfp_f2d __aeabi_f2d[m
[31m-#define softfp_d2ui __aeabi_d2uiz[m
[31m-#define softfp_d2f __aeabi_d2f[m
[31m-#define softfp_i2f __aeabi_i2f[m
[31m-#define softfp_ui2f __aeabi_ui2f[m
[31m-#define softfp_f2i __aeabi_f2iz[m
[31m-#define softfp_f2ui __aeabi_f2uiz[m
[31m-#define fp64_l2d __aeabi_l2d[m
[31m-#define fp64_ul2d __aeabi_ul2d[m
[31m-#define fp64_l2f __aeabi_l2f[m
[31m-#define fp64_ul2f __aeabi_ul2f[m
[31m-#if LJ_TARGET_IOS[m
[31m-#define fp64_d2l __fixdfdi[m
[31m-#define fp64_d2ul __fixunsdfdi[m
[31m-#define fp64_f2l __fixsfdi[m
[31m-#define fp64_f2ul __fixunssfdi[m
[31m-#else[m
[31m-#define fp64_d2l __aeabi_d2lz[m
[31m-#define fp64_d2ul __aeabi_d2ulz[m
[31m-#define fp64_f2l __aeabi_f2lz[m
[31m-#define fp64_f2ul __aeabi_f2ulz[m
[31m-#endif[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#define softfp_add __adddf3[m
[31m-#define softfp_sub __subdf3[m
[31m-#define softfp_mul __muldf3[m
[31m-#define softfp_div __divdf3[m
[31m-#define softfp_cmp __ledf2[m
[31m-#define softfp_i2d __floatsidf[m
[31m-#define softfp_d2i __fixdfsi[m
[31m-#define softfp_ui2d __floatunsidf[m
[31m-#define softfp_f2d __extendsfdf2[m
[31m-#define softfp_d2ui __fixunsdfsi[m
[31m-#define softfp_d2f __truncdfsf2[m
[31m-#define softfp_i2f __floatsisf[m
[31m-#define softfp_ui2f __floatunsisf[m
[31m-#define softfp_f2i __fixsfsi[m
[31m-#define softfp_f2ui __fixunssfsi[m
[31m-#else[m
[31m-#error "Missing soft-float definitions for target architecture"[m
[31m-#endif[m
[31m-extern double softfp_add(double a, double b);[m
[31m-extern double softfp_sub(double a, double b);[m
[31m-extern double softfp_mul(double a, double b);[m
[31m-extern double softfp_div(double a, double b);[m
[31m-extern void softfp_cmp(double a, double b);[m
[31m-extern double softfp_i2d(int32_t a);[m
[31m-extern int32_t softfp_d2i(double a);[m
[31m-#if LJ_HASFFI[m
[31m-extern double softfp_ui2d(uint32_t a);[m
[31m-extern double softfp_f2d(float a);[m
[31m-extern uint32_t softfp_d2ui(double a);[m
[31m-extern float softfp_d2f(double a);[m
[31m-extern float softfp_i2f(int32_t a);[m
[31m-extern float softfp_ui2f(uint32_t a);[m
[31m-extern int32_t softfp_f2i(float a);[m
[31m-extern uint32_t softfp_f2ui(float a);[m
[31m-#endif[m
[31m-#if LJ_TARGET_MIPS[m
[31m-extern double lj_vm_sfmin(double a, double b);[m
[31m-extern double lj_vm_sfmax(double a, double b);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASFFI && LJ_NEED_FP64 && !(LJ_TARGET_ARM && LJ_SOFTFP)[m
[31m-#ifdef __GNUC__[m
[31m-#define fp64_l2d __floatdidf[m
[31m-#define fp64_ul2d __floatundidf[m
[31m-#define fp64_l2f __floatdisf[m
[31m-#define fp64_ul2f __floatundisf[m
[31m-#define fp64_d2l __fixdfdi[m
[31m-#define fp64_d2ul __fixunsdfdi[m
[31m-#define fp64_f2l __fixsfdi[m
[31m-#define fp64_f2ul __fixunssfdi[m
[31m-#else[m
[31m-#error "Missing fp64 helper definitions for this compiler"[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64)[m
[31m-extern double fp64_l2d(int64_t a);[m
[31m-extern double fp64_ul2d(uint64_t a);[m
[31m-extern float fp64_l2f(int64_t a);[m
[31m-extern float fp64_ul2f(uint64_t a);[m
[31m-extern int64_t fp64_d2l(double a);[m
[31m-extern uint64_t fp64_d2ul(double a);[m
[31m-extern int64_t fp64_f2l(float a);[m
[31m-extern uint64_t fp64_f2ul(float a);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_iropt.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_iropt.h[m
[1mdeleted file mode 100644[m
[1mindex 67221c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_iropt.h[m
[1m+++ /dev/null[m
[36m@@ -1,162 +0,0 @@[m
[31m-/*[m
[31m-** Common header for IR emitter and optimizations.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_IROPT_H[m
[31m-#define _LJ_IROPT_H[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* IR emitter. */[m
[31m-LJ_FUNC void LJ_FASTCALL lj_ir_growtop(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_emit(jit_State *J);[m
[31m-[m
[31m-/* Save current IR in J->fold.ins, but do not emit it (yet). */[m
[31m-static LJ_AINLINE void lj_ir_set_(jit_State *J, uint16_t ot, IRRef1 a, IRRef1 b)[m
[31m-{[m
[31m-  J->fold.ins.ot = ot; J->fold.ins.op1 = a; J->fold.ins.op2 = b;[m
[31m-}[m
[31m-[m
[31m-#define lj_ir_set(J, ot, a, b) \[m
[31m-  lj_ir_set_(J, (uint16_t)(ot), (IRRef1)(a), (IRRef1)(b))[m
[31m-[m
[31m-/* Get ref of next IR instruction and optionally grow IR.[m
[31m-** Note: this may invalidate all IRIns*![m
[31m-*/[m
[31m-static LJ_AINLINE IRRef lj_ir_nextins(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref = J->cur.nins;[m
[31m-  if (LJ_UNLIKELY(ref >= J->irtoplim)) lj_ir_growtop(J);[m
[31m-  J->cur.nins = ref + 1;[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-/* Interning of constants. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_kint(jit_State *J, int32_t k);[m
[31m-LJ_FUNC void lj_ir_k64_freeall(jit_State *J);[m
[31m-LJ_FUNC TRef lj_ir_k64(jit_State *J, IROp op, cTValue *tv);[m
[31m-LJ_FUNC TValue *lj_ir_k64_reserve(jit_State *J);[m
[31m-LJ_FUNC cTValue *lj_ir_k64_find(jit_State *J, uint64_t u64);[m
[31m-LJ_FUNC TRef lj_ir_knum_u64(jit_State *J, uint64_t u64);[m
[31m-LJ_FUNC TRef lj_ir_knumint(jit_State *J, lua_Number n);[m
[31m-LJ_FUNC TRef lj_ir_kint64(jit_State *J, uint64_t u64);[m
[31m-LJ_FUNC TRef lj_ir_kgc(jit_State *J, GCobj *o, IRType t);[m
[31m-LJ_FUNC TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr);[m
[31m-LJ_FUNC TRef lj_ir_knull(jit_State *J, IRType t);[m
[31m-LJ_FUNC TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot);[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define lj_ir_kintp(J, k)	lj_ir_kint64(J, (uint64_t)(k))[m
[31m-#else[m
[31m-#define lj_ir_kintp(J, k)	lj_ir_kint(J, (int32_t)(k))[m
[31m-#endif[m
[31m-[m
[31m-static LJ_AINLINE TRef lj_ir_knum(jit_State *J, lua_Number n)[m
[31m-{[m
[31m-  TValue tv;[m
[31m-  tv.n = n;[m
[31m-  return lj_ir_knum_u64(J, tv.u64);[m
[31m-}[m
[31m-[m
[31m-#define lj_ir_kstr(J, str)	lj_ir_kgc(J, obj2gco((str)), IRT_STR)[m
[31m-#define lj_ir_ktab(J, tab)	lj_ir_kgc(J, obj2gco((tab)), IRT_TAB)[m
[31m-#define lj_ir_kfunc(J, func)	lj_ir_kgc(J, obj2gco((func)), IRT_FUNC)[m
[31m-#define lj_ir_kptr(J, ptr)	lj_ir_kptr_(J, IR_KPTR, (ptr))[m
[31m-#define lj_ir_kkptr(J, ptr)	lj_ir_kptr_(J, IR_KKPTR, (ptr))[m
[31m-[m
[31m-/* Special FP constants. */[m
[31m-#define lj_ir_knum_zero(J)	lj_ir_knum_u64(J, U64x(00000000,00000000))[m
[31m-#define lj_ir_knum_one(J)	lj_ir_knum_u64(J, U64x(3ff00000,00000000))[m
[31m-#define lj_ir_knum_tobit(J)	lj_ir_knum_u64(J, U64x(43380000,00000000))[m
[31m-[m
[31m-/* Special 128 bit SIMD constants. */[m
[31m-#define lj_ir_knum_abs(J)	lj_ir_k64(J, IR_KNUM, LJ_KSIMD(J, LJ_KSIMD_ABS))[m
[31m-#define lj_ir_knum_neg(J)	lj_ir_k64(J, IR_KNUM, LJ_KSIMD(J, LJ_KSIMD_NEG))[m
[31m-[m
[31m-/* Access to constants. */[m
[31m-LJ_FUNC void lj_ir_kvalue(lua_State *L, TValue *tv, const IRIns *ir);[m
[31m-[m
[31m-/* Convert IR operand types. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_tonumber(jit_State *J, TRef tr);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_tonum(jit_State *J, TRef tr);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_ir_tostr(jit_State *J, TRef tr);[m
[31m-[m
[31m-/* Miscellaneous IR ops. */[m
[31m-LJ_FUNC int lj_ir_numcmp(lua_Number a, lua_Number b, IROp op);[m
[31m-LJ_FUNC int lj_ir_strcmp(GCstr *a, GCstr *b, IROp op);[m
[31m-LJ_FUNC void lj_ir_rollback(jit_State *J, IRRef ref);[m
[31m-[m
[31m-/* Emit IR instructions with on-the-fly optimizations. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fold(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_cse(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_cselim(jit_State *J, IRRef lim);[m
[31m-[m
[31m-/* Special return values for the fold functions. */[m
[31m-enum {[m
[31m-  NEXTFOLD,		/* Couldn't fold, pass on. */[m
[31m-  RETRYFOLD,		/* Retry fold with modified fins. */[m
[31m-  KINTFOLD,		/* Return ref for int constant in fins->i. */[m
[31m-  FAILFOLD,		/* Guard would always fail. */[m
[31m-  DROPFOLD,		/* Guard eliminated. */[m
[31m-  MAX_FOLD[m
[31m-};[m
[31m-[m
[31m-#define INTFOLD(k)	((J->fold.ins.i = (k)), (TRef)KINTFOLD)[m
[31m-#define INT64FOLD(k)	(lj_ir_kint64(J, (k)))[m
[31m-#define CONDFOLD(cond)	((TRef)FAILFOLD + (TRef)(cond))[m
[31m-#define LEFTFOLD	(J->fold.ins.op1)[m
[31m-#define RIGHTFOLD	(J->fold.ins.op2)[m
[31m-#define CSEFOLD		(lj_opt_cse(J))[m
[31m-#define EMITFOLD	(lj_ir_emit(J))[m
[31m-[m
[31m-/* Load/store forwarding. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_aload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_hload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J);[m
[31m-LJ_FUNC int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J);[m
[31m-LJ_FUNC int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim);[m
[31m-LJ_FUNC int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref);[m
[31m-[m
[31m-/* Dead-store elimination. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_ahstore(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_ustore(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_fstore(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_xstore(jit_State *J);[m
[31m-[m
[31m-/* Narrowing. */[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_convert(jit_State *J);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_index(jit_State *J, TRef key);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_toint(jit_State *J, TRef tr);[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_tobit(jit_State *J, TRef tr);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef key);[m
[31m-#endif[m
[31m-LJ_FUNC TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc,[m
[31m-				 TValue *vb, TValue *vc, IROp op);[m
[31m-LJ_FUNC TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc);[m
[31m-LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc);[m
[31m-LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc);[m
[31m-LJ_FUNC IRType lj_opt_narrow_forl(jit_State *J, cTValue *forbase);[m
[31m-[m
[31m-/* Optimization passes. */[m
[31m-LJ_FUNC void lj_opt_dce(jit_State *J);[m
[31m-LJ_FUNC int lj_opt_loop(jit_State *J);[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-LJ_FUNC void lj_opt_split(jit_State *J);[m
[31m-#else[m
[31m-#define lj_opt_split(J)		UNUSED(J)[m
[31m-#endif[m
[31m-LJ_FUNC void lj_opt_sink(jit_State *J);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_jit.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_jit.h[m
[1mdeleted file mode 100644[m
[1mindex 2bebd55..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_jit.h[m
[1m+++ /dev/null[m
[36m@@ -1,442 +0,0 @@[m
[31m-/*[m
[31m-** Common definitions for the JIT compiler.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_JIT_H[m
[31m-#define _LJ_JIT_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ir.h"[m
[31m-[m
[31m-/* JIT engine flags. */[m
[31m-#define JIT_F_ON		0x00000001[m
[31m-[m
[31m-/* CPU-specific JIT engine flags. */[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#define JIT_F_SSE2		0x00000010[m
[31m-#define JIT_F_SSE3		0x00000020[m
[31m-#define JIT_F_SSE4_1		0x00000040[m
[31m-#define JIT_F_PREFER_IMUL	0x00000080[m
[31m-#define JIT_F_LEA_AGU		0x00000100[m
[31m-#define JIT_F_BMI2		0x00000200[m
[31m-[m
[31m-/* Names for the CPU-specific flags. Must match the order above. */[m
[31m-#define JIT_F_CPU_FIRST		JIT_F_SSE2[m
[31m-#define JIT_F_CPUSTRING		"\4SSE2\4SSE3\6SSE4.1\3AMD\4ATOM\4BMI2"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#define JIT_F_ARMV6_		0x00000010[m
[31m-#define JIT_F_ARMV6T2_		0x00000020[m
[31m-#define JIT_F_ARMV7		0x00000040[m
[31m-#define JIT_F_VFPV2		0x00000080[m
[31m-#define JIT_F_VFPV3		0x00000100[m
[31m-[m
[31m-#define JIT_F_ARMV6		(JIT_F_ARMV6_|JIT_F_ARMV6T2_|JIT_F_ARMV7)[m
[31m-#define JIT_F_ARMV6T2		(JIT_F_ARMV6T2_|JIT_F_ARMV7)[m
[31m-#define JIT_F_VFP		(JIT_F_VFPV2|JIT_F_VFPV3)[m
[31m-[m
[31m-/* Names for the CPU-specific flags. Must match the order above. */[m
[31m-#define JIT_F_CPU_FIRST		JIT_F_ARMV6_[m
[31m-#define JIT_F_CPUSTRING		"\5ARMv6\7ARMv6T2\5ARMv7\5VFPv2\5VFPv3"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#define JIT_F_SQRT		0x00000010[m
[31m-#define JIT_F_ROUND		0x00000020[m
[31m-[m
[31m-/* Names for the CPU-specific flags. Must match the order above. */[m
[31m-#define JIT_F_CPU_FIRST		JIT_F_SQRT[m
[31m-#define JIT_F_CPUSTRING		"\4SQRT\5ROUND"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#define JIT_F_MIPS32R2		0x00000010[m
[31m-[m
[31m-/* Names for the CPU-specific flags. Must match the order above. */[m
[31m-#define JIT_F_CPU_FIRST		JIT_F_MIPS32R2[m
[31m-#define JIT_F_CPUSTRING		"\010MIPS32R2"[m
[31m-#else[m
[31m-#define JIT_F_CPU_FIRST		0[m
[31m-#define JIT_F_CPUSTRING		""[m
[31m-#endif[m
[31m-[m
[31m-/* Optimization flags. */[m
[31m-#define JIT_F_OPT_MASK		0x0fff0000[m
[31m-[m
[31m-#define JIT_F_OPT_FOLD		0x00010000[m
[31m-#define JIT_F_OPT_CSE		0x00020000[m
[31m-#define JIT_F_OPT_DCE		0x00040000[m
[31m-#define JIT_F_OPT_FWD		0x00080000[m
[31m-#define JIT_F_OPT_DSE		0x00100000[m
[31m-#define JIT_F_OPT_NARROW	0x00200000[m
[31m-#define JIT_F_OPT_LOOP		0x00400000[m
[31m-#define JIT_F_OPT_ABC		0x00800000[m
[31m-#define JIT_F_OPT_SINK		0x01000000[m
[31m-#define JIT_F_OPT_FUSE		0x02000000[m
[31m-[m
[31m-/* Optimizations names for -O. Must match the order above. */[m
[31m-#define JIT_F_OPT_FIRST		JIT_F_OPT_FOLD[m
[31m-#define JIT_F_OPTSTRING	\[m
[31m-  "\4fold\3cse\3dce\3fwd\3dse\6narrow\4loop\3abc\4sink\4fuse"[m
[31m-[m
[31m-/* Optimization levels set a fixed combination of flags. */[m
[31m-#define JIT_F_OPT_0	0[m
[31m-#define JIT_F_OPT_1	(JIT_F_OPT_FOLD|JIT_F_OPT_CSE|JIT_F_OPT_DCE)[m
[31m-#define JIT_F_OPT_2	(JIT_F_OPT_1|JIT_F_OPT_NARROW|JIT_F_OPT_LOOP)[m
[31m-#define JIT_F_OPT_3	(JIT_F_OPT_2|\[m
[31m-  JIT_F_OPT_FWD|JIT_F_OPT_DSE|JIT_F_OPT_ABC|JIT_F_OPT_SINK|JIT_F_OPT_FUSE)[m
[31m-#define JIT_F_OPT_DEFAULT	JIT_F_OPT_3[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS || LJ_64[m
[31m-/* See: http://blogs.msdn.com/oldnewthing/archive/2003/10/08/55239.aspx */[m
[31m-#define JIT_P_sizemcode_DEFAULT		64[m
[31m-#else[m
[31m-/* Could go as low as 4K, but the mmap() overhead would be rather high. */[m
[31m-#define JIT_P_sizemcode_DEFAULT		32[m
[31m-#endif[m
[31m-[m
[31m-/* Optimization parameters and their defaults. Length is a char in octal! */[m
[31m-#define JIT_PARAMDEF(_) \[m
[31m-  _(\010, maxtrace,	1000)	/* Max. # of traces in cache. */ \[m
[31m-  _(\011, maxrecord,	4000)	/* Max. # of recorded IR instructions. */ \[m
[31m-  _(\012, maxirconst,	500)	/* Max. # of IR constants of a trace. */ \[m
[31m-  _(\007, maxside,	100)	/* Max. # of side traces of a root trace. */ \[m
[31m-  _(\007, maxsnap,	500)	/* Max. # of snapshots for a trace. */ \[m
[31m-  _(\011, minstitch,	1000000)	/* Min. # of IR ins for a stitched trace. */ \[m
[31m-  \[m
[31m-  _(\007, hotloop,	56)	/* # of iter. to detect a hot loop/call. */ \[m
[31m-  _(\007, hotexit,	10)	/* # of taken exits to start a side trace. */ \[m
[31m-  _(\007, tryside,	4)	/* # of attempts to compile a side trace. */ \[m
[31m-  \[m
[31m-  _(\012, instunroll,	4)	/* Max. unroll for instable loops. */ \[m
[31m-  _(\012, loopunroll,	15)	/* Max. unroll for loop ops in side traces. */ \[m
[31m-  _(\012, callunroll,	3)	/* Max. unroll for recursive calls. */ \[m
[31m-  _(\011, recunroll,	2)	/* Min. unroll for true recursion. */ \[m
[31m-  \[m
[31m-  /* Size of each machine code area (in KBytes). */ \[m
[31m-  _(\011, sizemcode,	JIT_P_sizemcode_DEFAULT) \[m
[31m-  /* Max. total size of all machine code areas (in KBytes). */ \[m
[31m-  _(\010, maxmcode,	512) \[m
[31m-  /* End of list. */[m
[31m-[m
[31m-enum {[m
[31m-#define JIT_PARAMENUM(len, name, value)	JIT_P_##name,[m
[31m-JIT_PARAMDEF(JIT_PARAMENUM)[m
[31m-#undef JIT_PARAMENUM[m
[31m-  JIT_P__MAX[m
[31m-};[m
[31m-[m
[31m-#define JIT_PARAMSTR(len, name, value)	#len #name[m
[31m-#define JIT_P_STRING	JIT_PARAMDEF(JIT_PARAMSTR)[m
[31m-[m
[31m-/* Trace compiler state. */[m
[31m-typedef enum {[m
[31m-  LJ_TRACE_IDLE,	/* Trace compiler idle. */[m
[31m-  LJ_TRACE_ACTIVE = 0x10,[m
[31m-  LJ_TRACE_RECORD,	/* Bytecode recording active. */[m
[31m-  LJ_TRACE_START,	/* New trace started. */[m
[31m-  LJ_TRACE_END,		/* End of trace. */[m
[31m-  LJ_TRACE_ASM,		/* Assemble trace. */[m
[31m-  LJ_TRACE_ERR		/* Trace aborted with error. */[m
[31m-} TraceState;[m
[31m-[m
[31m-/* Post-processing action. */[m
[31m-typedef enum {[m
[31m-  LJ_POST_NONE,		/* No action. */[m
[31m-  LJ_POST_FIXCOMP,	/* Fixup comparison and emit pending guard. */[m
[31m-  LJ_POST_FIXGUARD,	/* Fixup and emit pending guard. */[m
[31m-  LJ_POST_FIXGUARDSNAP,	/* Fixup and emit pending guard and snapshot. */[m
[31m-  LJ_POST_FIXBOOL,	/* Fixup boolean result. */[m
[31m-  LJ_POST_FIXCONST,	/* Fixup constant results. */[m
[31m-  LJ_POST_FFRETRY	/* Suppress recording of retried fast functions. */[m
[31m-} PostProc;[m
[31m-[m
[31m-/* Machine code type. */[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-typedef uint8_t MCode;[m
[31m-#else[m
[31m-typedef uint32_t MCode;[m
[31m-#endif[m
[31m-[m
[31m-/* Stack snapshot header. */[m
[31m-typedef struct SnapShot {[m
[31m-  uint16_t mapofs;	/* Offset into snapshot map. */[m
[31m-  IRRef1 ref;		/* First IR ref for this snapshot. */[m
[31m-  uint8_t nslots;	/* Number of valid slots. */[m
[31m-  uint8_t topslot;	/* Maximum frame extent. */[m
[31m-  uint8_t nent;		/* Number of compressed entries. */[m
[31m-  uint8_t count;	/* Count of taken exits for this snapshot. */[m
[31m-} SnapShot;[m
[31m-[m
[31m-#define SNAPCOUNT_DONE	255	/* Already compiled and linked a side trace. */[m
[31m-[m
[31m-/* Compressed snapshot entry. */[m
[31m-typedef uint32_t SnapEntry;[m
[31m-[m
[31m-#define SNAP_FRAME		0x010000	/* Frame slot. */[m
[31m-#define SNAP_CONT		0x020000	/* Continuation slot. */[m
[31m-#define SNAP_NORESTORE		0x040000	/* No need to restore slot. */[m
[31m-#define SNAP_SOFTFPNUM		0x080000	/* Soft-float number. */[m
[31m-LJ_STATIC_ASSERT(SNAP_FRAME == TREF_FRAME);[m
[31m-LJ_STATIC_ASSERT(SNAP_CONT == TREF_CONT);[m
[31m-[m
[31m-#define SNAP(slot, flags, ref)	(((SnapEntry)(slot) << 24) + (flags) + (ref))[m
[31m-#define SNAP_TR(slot, tr) \[m
[31m-  (((SnapEntry)(slot) << 24) + ((tr) & (TREF_CONT|TREF_FRAME|TREF_REFMASK)))[m
[31m-#define SNAP_MKPC(pc)		((SnapEntry)u32ptr(pc))[m
[31m-#define SNAP_MKFTSZ(ftsz)	((SnapEntry)(ftsz))[m
[31m-#define snap_ref(sn)		((sn) & 0xffff)[m
[31m-#define snap_slot(sn)		((BCReg)((sn) >> 24))[m
[31m-#define snap_isframe(sn)	((sn) & SNAP_FRAME)[m
[31m-#define snap_pc(sn)		((const BCIns *)(uintptr_t)(sn))[m
[31m-#define snap_setref(sn, ref)	(((sn) & (0xffff0000&~SNAP_NORESTORE)) | (ref))[m
[31m-[m
[31m-/* Snapshot and exit numbers. */[m
[31m-typedef uint32_t SnapNo;[m
[31m-typedef uint32_t ExitNo;[m
[31m-[m
[31m-/* Trace number. */[m
[31m-typedef uint32_t TraceNo;	/* Used to pass around trace numbers. */[m
[31m-typedef uint16_t TraceNo1;	/* Stored trace number. */[m
[31m-[m
[31m-/* Type of link. ORDER LJ_TRLINK */[m
[31m-typedef enum {[m
[31m-  LJ_TRLINK_NONE,		/* Incomplete trace. No link, yet. */[m
[31m-  LJ_TRLINK_ROOT,		/* Link to other root trace. */[m
[31m-  LJ_TRLINK_LOOP,		/* Loop to same trace. */[m
[31m-  LJ_TRLINK_TAILREC,		/* Tail-recursion. */[m
[31m-  LJ_TRLINK_UPREC,		/* Up-recursion. */[m
[31m-  LJ_TRLINK_DOWNREC,		/* Down-recursion. */[m
[31m-  LJ_TRLINK_INTERP,		/* Fallback to interpreter. */[m
[31m-  LJ_TRLINK_RETURN,		/* Return to interpreter. */[m
[31m-  LJ_TRLINK_STITCH		/* Trace stitching. */[m
[31m-} TraceLink;[m
[31m-[m
[31m-/* Trace object. */[m
[31m-typedef struct GCtrace {[m
[31m-  GCHeader;[m
[31m-  uint8_t topslot;	/* Top stack slot already checked to be allocated. */[m
[31m-  uint8_t linktype;	/* Type of link. */[m
[31m-  IRRef nins;		/* Next IR instruction. Biased with REF_BIAS. */[m
[31m-#if LJ_GC64[m
[31m-  uint32_t unused_gc64;[m
[31m-#endif[m
[31m-  GCRef gclist;[m
[31m-  IRIns *ir;		/* IR instructions/constants. Biased with REF_BIAS. */[m
[31m-  IRRef nk;		/* Lowest IR constant. Biased with REF_BIAS. */[m
[31m-  uint16_t nsnap;	/* Number of snapshots. */[m
[31m-  uint16_t nsnapmap;	/* Number of snapshot map elements. */[m
[31m-  SnapShot *snap;	/* Snapshot array. */[m
[31m-  SnapEntry *snapmap;	/* Snapshot map. */[m
[31m-  GCRef startpt;	/* Starting prototype. */[m
[31m-  MRef startpc;		/* Bytecode PC of starting instruction. */[m
[31m-  BCIns startins;	/* Original bytecode of starting instruction. */[m
[31m-  MSize szmcode;	/* Size of machine code. */[m
[31m-  MCode *mcode;		/* Start of machine code. */[m
[31m-  MSize mcloop;		/* Offset of loop start in machine code. */[m
[31m-  uint16_t nchild;	/* Number of child traces (root trace only). */[m
[31m-  uint16_t spadjust;	/* Stack pointer adjustment (offset in bytes). */[m
[31m-  TraceNo1 traceno;	/* Trace number. */[m
[31m-  TraceNo1 link;	/* Linked trace (or self for loops). */[m
[31m-  TraceNo1 root;	/* Root trace of side trace (or 0 for root traces). */[m
[31m-  TraceNo1 nextroot;	/* Next root trace for same prototype. */[m
[31m-  TraceNo1 nextside;	/* Next side trace of same root trace. */[m
[31m-  uint8_t sinktags;	/* Trace has SINK tags. */[m
[31m-  uint8_t unused1;[m
[31m-#ifdef LUAJIT_USE_GDBJIT[m
[31m-  void *gdbjit_entry;	/* GDB JIT entry. */[m
[31m-#endif[m
[31m-} GCtrace;[m
[31m-[m
[31m-#define gco2trace(o)	check_exp((o)->gch.gct == ~LJ_TTRACE, (GCtrace *)(o))[m
[31m-#define traceref(J, n) \[m
[31m-  check_exp((n)>0 && (MSize)(n)<J->sizetrace, (GCtrace *)gcref(J->trace[(n)]))[m
[31m-[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCtrace, gclist));[m
[31m-[m
[31m-static LJ_AINLINE MSize snap_nextofs(GCtrace *T, SnapShot *snap)[m
[31m-{[m
[31m-  if (snap+1 == &T->snap[T->nsnap])[m
[31m-    return T->nsnapmap;[m
[31m-  else[m
[31m-    return (snap+1)->mapofs;[m
[31m-}[m
[31m-[m
[31m-/* Round-robin penalty cache for bytecodes leading to aborted traces. */[m
[31m-typedef struct HotPenalty {[m
[31m-  MRef pc;		/* Starting bytecode PC. */[m
[31m-  uint16_t val;		/* Penalty value, i.e. hotcount start. */[m
[31m-  uint16_t reason;	/* Abort reason (really TraceErr). */[m
[31m-} HotPenalty;[m
[31m-[m
[31m-#define PENALTY_SLOTS	64	/* Penalty cache slot. Must be a power of 2. */[m
[31m-#define PENALTY_MIN	(36*2)	/* Minimum penalty value. */[m
[31m-#define PENALTY_MAX	60000	/* Maximum penalty value. */[m
[31m-#define PENALTY_RNDBITS	4	/* # of random bits to add to penalty value. */[m
[31m-[m
[31m-/* Round-robin backpropagation cache for narrowing conversions. */[m
[31m-typedef struct BPropEntry {[m
[31m-  IRRef1 key;		/* Key: original reference. */[m
[31m-  IRRef1 val;		/* Value: reference after conversion. */[m
[31m-  IRRef mode;		/* Mode for this entry (currently IRCONV_*). */[m
[31m-} BPropEntry;[m
[31m-[m
[31m-/* Number of slots for the backpropagation cache. Must be a power of 2. */[m
[31m-#define BPROP_SLOTS	16[m
[31m-[m
[31m-/* Scalar evolution analysis cache. */[m
[31m-typedef struct ScEvEntry {[m
[31m-  MRef pc;		/* Bytecode PC of FORI. */[m
[31m-  IRRef1 idx;		/* Index reference. */[m
[31m-  IRRef1 start;		/* Constant start reference. */[m
[31m-  IRRef1 stop;		/* Constant stop reference. */[m
[31m-  IRRef1 step;		/* Constant step reference. */[m
[31m-  IRType1 t;		/* Scalar type. */[m
[31m-  uint8_t dir;		/* Direction. 1: +, 0: -. */[m
[31m-} ScEvEntry;[m
[31m-[m
[31m-/* Reverse bytecode map (IRRef -> PC). Only for selected instructions. */[m
[31m-typedef struct RBCHashEntry {[m
[31m-  MRef pc;		/* Bytecode PC. */[m
[31m-  GCRef pt;		/* Prototype. */[m
[31m-  IRRef ref;		/* IR reference. */[m
[31m-} RBCHashEntry;[m
[31m-[m
[31m-/* Number of slots in the reverse bytecode hash table. Must be a power of 2. */[m
[31m-#define RBCHASH_SLOTS	8[m
[31m-[m
[31m-/* 128 bit SIMD constants. */[m
[31m-enum {[m
[31m-  LJ_KSIMD_ABS,[m
[31m-  LJ_KSIMD_NEG,[m
[31m-  LJ_KSIMD__MAX[m
[31m-};[m
[31m-[m
[31m-/* Get 16 byte aligned pointer to SIMD constant. */[m
[31m-#define LJ_KSIMD(J, n) \[m
[31m-  ((TValue *)(((intptr_t)&J->ksimd[2*(n)] + 15) & ~(intptr_t)15))[m
[31m-[m
[31m-/* Set/reset flag to activate the SPLIT pass for the current trace. */[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-#define lj_needsplit(J)		(J->needsplit = 1)[m
[31m-#define lj_resetsplit(J)	(J->needsplit = 0)[m
[31m-#else[m
[31m-#define lj_needsplit(J)		UNUSED(J)[m
[31m-#define lj_resetsplit(J)	UNUSED(J)[m
[31m-#endif[m
[31m-[m
[31m-/* Fold state is used to fold instructions on-the-fly. */[m
[31m-typedef struct FoldState {[m
[31m-  IRIns ins;		/* Currently emitted instruction. */[m
[31m-  IRIns left;		/* Instruction referenced by left operand. */[m
[31m-  IRIns right;		/* Instruction referenced by right operand. */[m
[31m-} FoldState;[m
[31m-[m
[31m-/* JIT compiler state. */[m
[31m-typedef struct jit_State {[m
[31m-  GCtrace cur;		/* Current trace. */[m
[31m-[m
[31m-  lua_State *L;		/* Current Lua state. */[m
[31m-  const BCIns *pc;	/* Current PC. */[m
[31m-  GCfunc *fn;		/* Current function. */[m
[31m-  GCproto *pt;		/* Current prototype. */[m
[31m-  TRef *base;		/* Current frame base, points into J->slots. */[m
[31m-[m
[31m-  uint32_t flags;	/* JIT engine flags. */[m
[31m-  BCReg maxslot;	/* Relative to baseslot. */[m
[31m-  BCReg baseslot;	/* Current frame base, offset into J->slots. */[m
[31m-[m
[31m-  uint8_t mergesnap;	/* Allowed to merge with next snapshot. */[m
[31m-  uint8_t needsnap;	/* Need snapshot before recording next bytecode. */[m
[31m-  IRType1 guardemit;	/* Accumulated IRT_GUARD for emitted instructions. */[m
[31m-  uint8_t bcskip;	/* Number of bytecode instructions to skip. */[m
[31m-[m
[31m-  FoldState fold;	/* Fold state. */[m
[31m-[m
[31m-  const BCIns *bc_min;	/* Start of allowed bytecode range for root trace. */[m
[31m-  MSize bc_extent;	/* Extent of the range. */[m
[31m-[m
[31m-  TraceState state;	/* Trace compiler state. */[m
[31m-[m
[31m-  int32_t instunroll;	/* Unroll counter for instable loops. */[m
[31m-  int32_t loopunroll;	/* Unroll counter for loop ops in side traces. */[m
[31m-  int32_t tailcalled;	/* Number of successive tailcalls. */[m
[31m-  int32_t framedepth;	/* Current frame depth. */[m
[31m-  int32_t retdepth;	/* Return frame depth (count of RETF). */[m
[31m-[m
[31m-  MRef k64;		/* Pointer to chained array of 64 bit constants. */[m
[31m-  TValue ksimd[LJ_KSIMD__MAX*2+1];  /* 16 byte aligned SIMD constants. */[m
[31m-[m
[31m-  IRIns *irbuf;		/* Temp. IR instruction buffer. Biased with REF_BIAS. */[m
[31m-  IRRef irtoplim;	/* Upper limit of instuction buffer (biased). */[m
[31m-  IRRef irbotlim;	/* Lower limit of instuction buffer (biased). */[m
[31m-  IRRef loopref;	/* Last loop reference or ref of final LOOP (or 0). */[m
[31m-[m
[31m-  MSize sizesnap;	/* Size of temp. snapshot buffer. */[m
[31m-  SnapShot *snapbuf;	/* Temp. snapshot buffer. */[m
[31m-  SnapEntry *snapmapbuf;  /* Temp. snapshot map buffer. */[m
[31m-  MSize sizesnapmap;	/* Size of temp. snapshot map buffer. */[m
[31m-[m
[31m-  PostProc postproc;	/* Required post-processing after execution. */[m
[31m-#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI)[m
[31m-  uint8_t needsplit;	/* Need SPLIT pass. */[m
[31m-#endif[m
[31m-  uint8_t retryrec;	/* Retry recording. */[m
[31m-[m
[31m-  GCRef *trace;		/* Array of traces. */[m
[31m-  TraceNo freetrace;	/* Start of scan for next free trace. */[m
[31m-  MSize sizetrace;	/* Size of trace array. */[m
[31m-  TValue *ktracep;	/* Pointer to K64Array slot with GCtrace pointer. */[m
[31m-[m
[31m-  IRRef1 chain[IR__MAX];  /* IR instruction skip-list chain anchors. */[m
[31m-  TRef slot[LJ_MAX_JSLOTS+LJ_STACK_EXTRA];  /* Stack slot map. */[m
[31m-[m
[31m-  int32_t param[JIT_P__MAX];  /* JIT engine parameters. */[m
[31m-[m
[31m-  MCode *exitstubgroup[LJ_MAX_EXITSTUBGR];  /* Exit stub group addresses. */[m
[31m-[m
[31m-  HotPenalty penalty[PENALTY_SLOTS];  /* Penalty slots. */[m
[31m-  uint32_t penaltyslot;	/* Round-robin index into penalty slots. */[m
[31m-  uint32_t prngstate;	/* PRNG state. */[m
[31m-[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  RBCHashEntry rbchash[RBCHASH_SLOTS];  /* Reverse bytecode map. */[m
[31m-#endif[m
[31m-[m
[31m-  BPropEntry bpropcache[BPROP_SLOTS];  /* Backpropagation cache slots. */[m
[31m-  uint32_t bpropslot;	/* Round-robin index into bpropcache slots. */[m
[31m-[m
[31m-  ScEvEntry scev;	/* Scalar evolution analysis cache slots. */[m
[31m-[m
[31m-  const BCIns *startpc;	/* Bytecode PC of starting instruction. */[m
[31m-  TraceNo parent;	/* Parent of current side trace (0 for root traces). */[m
[31m-  ExitNo exitno;	/* Exit number in parent of current side trace. */[m
[31m-[m
[31m-  BCIns *patchpc;	/* PC for pending re-patch. */[m
[31m-  BCIns patchins;	/* Instruction for pending re-patch. */[m
[31m-[m
[31m-  int mcprot;		/* Protection of current mcode area. */[m
[31m-  MCode *mcarea;	/* Base of current mcode area. */[m
[31m-  MCode *mctop;		/* Top of current mcode area. */[m
[31m-  MCode *mcbot;		/* Bottom of current mcode area. */[m
[31m-  size_t szmcarea;	/* Size of current mcode area. */[m
[31m-  size_t szallmcarea;	/* Total size of all allocated mcode areas. */[m
[31m-[m
[31m-  TValue errinfo;	/* Additional info element for trace errors. */[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-  GCproto *prev_pt;	/* Previous prototype. */[m
[31m-  BCLine prev_line;	/* Previous line. */[m
[31m-  int prof_mode;	/* Profiling mode: 0, 'f', 'l'. */[m
[31m-#endif[m
[31m-}[m
[31m-#if LJ_TARGET_ARM[m
[31m-LJ_ALIGN(16)		/* For DISPATCH-relative addresses in assembler part. */[m
[31m-#endif[m
[31m-jit_State;[m
[31m-[m
[31m-/* Trivial PRNG e.g. used for penalty randomization. */[m
[31m-static LJ_AINLINE uint32_t LJ_PRNG_BITS(jit_State *J, int bits)[m
[31m-{[m
[31m-  /* Yes, this LCG is very weak, but that doesn't matter for our use case. */[m
[31m-  J->prngstate = J->prngstate * 1103515245 + 12345;[m
[31m-  return J->prngstate >> (32-bits);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lex.c[m
[1mdeleted file mode 100644[m
[1mindex 0187c42..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lex.c[m
[1m+++ /dev/null[m
[36m@@ -1,509 +0,0 @@[m
[31m-/*[m
[31m-** Lexical analyzer.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_lex_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#include "lualib.h"[m
[31m-#endif[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_parse.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Lua lexer token names. */[m
[31m-static const char *const tokennames[] = {[m
[31m-#define TKSTR1(name)		#name,[m
[31m-#define TKSTR2(name, sym)	#sym,[m
[31m-TKDEF(TKSTR1, TKSTR2)[m
[31m-#undef TKSTR1[m
[31m-#undef TKSTR2[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-/* -- Buffer handling ----------------------------------------------------- */[m
[31m-[m
[31m-#define LEX_EOF			(-1)[m
[31m-#define lex_iseol(ls)		(ls->c == '\n' || ls->c == '\r')[m
[31m-[m
[31m-/* Get more input from reader. */[m
[31m-static LJ_NOINLINE LexChar lex_more(LexState *ls)[m
[31m-{[m
[31m-  size_t sz;[m
[31m-  const char *p = ls->rfunc(ls->L, ls->rdata, &sz);[m
[31m-  if (p == NULL || sz == 0) return LEX_EOF;[m
[31m-  ls->pe = p + sz;[m
[31m-  ls->p = p + 1;[m
[31m-  return (LexChar)(uint8_t)p[0];[m
[31m-}[m
[31m-[m
[31m-/* Get next character. */[m
[31m-static LJ_AINLINE LexChar lex_next(LexState *ls)[m
[31m-{[m
[31m-  return (ls->c = ls->p < ls->pe ? (LexChar)(uint8_t)*ls->p++ : lex_more(ls));[m
[31m-}[m
[31m-[m
[31m-/* Save character. */[m
[31m-static LJ_AINLINE void lex_save(LexState *ls, LexChar c)[m
[31m-{[m
[31m-  lj_buf_putb(&ls->sb, c);[m
[31m-}[m
[31m-[m
[31m-/* Save previous character and get next character. */[m
[31m-static LJ_AINLINE LexChar lex_savenext(LexState *ls)[m
[31m-{[m
[31m-  lex_save(ls, ls->c);[m
[31m-  return lex_next(ls);[m
[31m-}[m
[31m-[m
[31m-/* Skip line break. Handles "\n", "\r", "\r\n" or "\n\r". */[m
[31m-static void lex_newline(LexState *ls)[m
[31m-{[m
[31m-  LexChar old = ls->c;[m
[31m-  lua_assert(lex_iseol(ls));[m
[31m-  lex_next(ls);  /* Skip "\n" or "\r". */[m
[31m-  if (lex_iseol(ls) && ls->c != old) lex_next(ls);  /* Skip "\n\r" or "\r\n". */[m
[31m-  if (++ls->linenumber >= LJ_MAX_LINE)[m
[31m-    lj_lex_error(ls, ls->tok, LJ_ERR_XLINES);[m
[31m-}[m
[31m-[m
[31m-/* -- Scanner for terminals ----------------------------------------------- */[m
[31m-[m
[31m-/* Parse a number literal. */[m
[31m-static void lex_number(LexState *ls, TValue *tv)[m
[31m-{[m
[31m-  StrScanFmt fmt;[m
[31m-  LexChar c, xp = 'e';[m
[31m-  lua_assert(lj_char_isdigit(ls->c));[m
[31m-  if ((c = ls->c) == '0' && (lex_savenext(ls) | 0x20) == 'x')[m
[31m-    xp = 'p';[m
[31m-  while (lj_char_isident(ls->c) || ls->c == '.' ||[m
[31m-	 ((ls->c == '-' || ls->c == '+') && (c | 0x20) == xp)) {[m
[31m-    c = ls->c;[m
[31m-    lex_savenext(ls);[m
[31m-  }[m
[31m-  lex_save(ls, '\0');[m
[31m-  fmt = lj_strscan_scan((const uint8_t *)sbufB(&ls->sb), tv,[m
[31m-	  (LJ_DUALNUM ? STRSCAN_OPT_TOINT : STRSCAN_OPT_TONUM) |[m
[31m-	  (LJ_HASFFI ? (STRSCAN_OPT_LL|STRSCAN_OPT_IMAG) : 0));[m
[31m-  if (LJ_DUALNUM && fmt == STRSCAN_INT) {[m
[31m-    setitype(tv, LJ_TISNUM);[m
[31m-  } else if (fmt == STRSCAN_NUM) {[m
[31m-    /* Already in correct format. */[m
[31m-#if LJ_HASFFI[m
[31m-  } else if (fmt != STRSCAN_ERROR) {[m
[31m-    lua_State *L = ls->L;[m
[31m-    GCcdata *cd;[m
[31m-    lua_assert(fmt == STRSCAN_I64 || fmt == STRSCAN_U64 || fmt == STRSCAN_IMAG);[m
[31m-    if (!ctype_ctsG(G(L))) {[m
[31m-      ptrdiff_t oldtop = savestack(L, L->top);[m
[31m-      luaopen_ffi(L);  /* Load FFI library on-demand. */[m
[31m-      L->top = restorestack(L, oldtop);[m
[31m-    }[m
[31m-    if (fmt == STRSCAN_IMAG) {[m
[31m-      cd = lj_cdata_new_(L, CTID_COMPLEX_DOUBLE, 2*sizeof(double));[m
[31m-      ((double *)cdataptr(cd))[0] = 0;[m
[31m-      ((double *)cdataptr(cd))[1] = numV(tv);[m
[31m-    } else {[m
[31m-      cd = lj_cdata_new_(L, fmt==STRSCAN_I64 ? CTID_INT64 : CTID_UINT64, 8);[m
[31m-      *(uint64_t *)cdataptr(cd) = tv->u64;[m
[31m-    }[m
[31m-    lj_parse_keepcdata(ls, tv, cd);[m
[31m-#endif[m
[31m-  } else {[m
[31m-    lua_assert(fmt == STRSCAN_ERROR);[m
[31m-    lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Skip equal signs for "[=...=[" and "]=...=]" and return their count. */[m
[31m-static int lex_skipeq(LexState *ls)[m
[31m-{[m
[31m-  int count = 0;[m
[31m-  LexChar s = ls->c;[m
[31m-  lua_assert(s == '[' || s == ']');[m
[31m-  while (lex_savenext(ls) == '=')[m
[31m-    count++;[m
[31m-  return (ls->c == s) ? count : (-count) - 1;[m
[31m-}[m
[31m-[m
[31m-/* Parse a long string or long comment (tv set to NULL). */[m
[31m-static void lex_longstring(LexState *ls, TValue *tv, int sep)[m
[31m-{[m
[31m-  lex_savenext(ls);  /* Skip second '['. */[m
[31m-  if (lex_iseol(ls))  /* Skip initial newline. */[m
[31m-    lex_newline(ls);[m
[31m-  for (;;) {[m
[31m-    switch (ls->c) {[m
[31m-    case LEX_EOF:[m
[31m-      lj_lex_error(ls, TK_eof, tv ? LJ_ERR_XLSTR : LJ_ERR_XLCOM);[m
[31m-      break;[m
[31m-    case ']':[m
[31m-      if (lex_skipeq(ls) == sep) {[m
[31m-	lex_savenext(ls);  /* Skip second ']'. */[m
[31m-	goto endloop;[m
[31m-      }[m
[31m-      break;[m
[31m-    case '\n':[m
[31m-    case '\r':[m
[31m-      lex_save(ls, '\n');[m
[31m-      lex_newline(ls);[m
[31m-      if (!tv) lj_buf_reset(&ls->sb);  /* Don't waste space for comments. */[m
[31m-      break;[m
[31m-    default:[m
[31m-      lex_savenext(ls);[m
[31m-      break;[m
[31m-    }[m
[31m-  } endloop:[m
[31m-  if (tv) {[m
[31m-    GCstr *str = lj_parse_keepstr(ls, sbufB(&ls->sb) + (2 + (MSize)sep),[m
[31m-				      sbuflen(&ls->sb) - 2*(2 + (MSize)sep));[m
[31m-    setstrV(ls->L, tv, str);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse a string. */[m
[31m-static void lex_string(LexState *ls, TValue *tv)[m
[31m-{[m
[31m-  LexChar delim = ls->c;  /* Delimiter is '\'' or '"'. */[m
[31m-  lex_savenext(ls);[m
[31m-  while (ls->c != delim) {[m
[31m-    switch (ls->c) {[m
[31m-    case LEX_EOF:[m
[31m-      lj_lex_error(ls, TK_eof, LJ_ERR_XSTR);[m
[31m-      continue;[m
[31m-    case '\n':[m
[31m-    case '\r':[m
[31m-      lj_lex_error(ls, TK_string, LJ_ERR_XSTR);[m
[31m-      continue;[m
[31m-    case '\\': {[m
[31m-      LexChar c = lex_next(ls);  /* Skip the '\\'. */[m
[31m-      switch (c) {[m
[31m-      case 'a': c = '\a'; break;[m
[31m-      case 'b': c = '\b'; break;[m
[31m-      case 'f': c = '\f'; break;[m
[31m-      case 'n': c = '\n'; break;[m
[31m-      case 'r': c = '\r'; break;[m
[31m-      case 't': c = '\t'; break;[m
[31m-      case 'v': c = '\v'; break;[m
[31m-      case 'x':  /* Hexadecimal escape '\xXX'. */[m
[31m-	c = (lex_next(ls) & 15u) << 4;[m
[31m-	if (!lj_char_isdigit(ls->c)) {[m
[31m-	  if (!lj_char_isxdigit(ls->c)) goto err_xesc;[m
[31m-	  c += 9 << 4;[m
[31m-	}[m
[31m-	c += (lex_next(ls) & 15u);[m
[31m-	if (!lj_char_isdigit(ls->c)) {[m
[31m-	  if (!lj_char_isxdigit(ls->c)) goto err_xesc;[m
[31m-	  c += 9;[m
[31m-	}[m
[31m-	break;[m
[31m-      case 'u':  /* Unicode escape '\u{XX...}'. */[m
[31m-	if (lex_next(ls) != '{') goto err_xesc;[m
[31m-	lex_next(ls);[m
[31m-	c = 0;[m
[31m-	do {[m
[31m-	  c = (c << 4) | (ls->c & 15u);[m
[31m-	  if (!lj_char_isdigit(ls->c)) {[m
[31m-	    if (!lj_char_isxdigit(ls->c)) goto err_xesc;[m
[31m-	    c += 9;[m
[31m-	  }[m
[31m-	  if (c >= 0x110000) goto err_xesc;  /* Out of Unicode range. */[m
[31m-	} while (lex_next(ls) != '}');[m
[31m-	if (c < 0x800) {[m
[31m-	  if (c < 0x80) break;[m
[31m-	  lex_save(ls, 0xc0 | (c >> 6));[m
[31m-	} else {[m
[31m-	  if (c >= 0x10000) {[m
[31m-	    lex_save(ls, 0xf0 | (c >> 18));[m
[31m-	    lex_save(ls, 0x80 | ((c >> 12) & 0x3f));[m
[31m-	  } else {[m
[31m-	    if (c >= 0xd800 && c < 0xe000) goto err_xesc;  /* No surrogates. */[m
[31m-	    lex_save(ls, 0xe0 | (c >> 12));[m
[31m-	  }[m
[31m-	  lex_save(ls, 0x80 | ((c >> 6) & 0x3f));[m
[31m-	}[m
[31m-	c = 0x80 | (c & 0x3f);[m
[31m-	break;[m
[31m-      case 'z':  /* Skip whitespace. */[m
[31m-	lex_next(ls);[m
[31m-	while (lj_char_isspace(ls->c))[m
[31m-	  if (lex_iseol(ls)) lex_newline(ls); else lex_next(ls);[m
[31m-	continue;[m
[31m-      case '\n': case '\r': lex_save(ls, '\n'); lex_newline(ls); continue;[m
[31m-      case '\\': case '\"': case '\'': break;[m
[31m-      case LEX_EOF: continue;[m
[31m-      default:[m
[31m-	if (!lj_char_isdigit(c))[m
[31m-	  goto err_xesc;[m
[31m-	c -= '0';  /* Decimal escape '\ddd'. */[m
[31m-	if (lj_char_isdigit(lex_next(ls))) {[m
[31m-	  c = c*10 + (ls->c - '0');[m
[31m-	  if (lj_char_isdigit(lex_next(ls))) {[m
[31m-	    c = c*10 + (ls->c - '0');[m
[31m-	    if (c > 255) {[m
[31m-	    err_xesc:[m
[31m-	      lj_lex_error(ls, TK_string, LJ_ERR_XESC);[m
[31m-	    }[m
[31m-	    lex_next(ls);[m
[31m-	  }[m
[31m-	}[m
[31m-	lex_save(ls, c);[m
[31m-	continue;[m
[31m-      }[m
[31m-      lex_save(ls, c);[m
[31m-      lex_next(ls);[m
[31m-      continue;[m
[31m-      }[m
[31m-    default:[m
[31m-      lex_savenext(ls);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  lex_savenext(ls);  /* Skip trailing delimiter. */[m
[31m-  setstrV(ls->L, tv,[m
[31m-	  lj_parse_keepstr(ls, sbufB(&ls->sb)+1, sbuflen(&ls->sb)-2));[m
[31m-}[m
[31m-[m
[31m-/* -- Main lexical scanner ------------------------------------------------ */[m
[31m-[m
[31m-/* Get next lexical token. */[m
[31m-static LexToken lex_scan(LexState *ls, TValue *tv)[m
[31m-{[m
[31m-  lj_buf_reset(&ls->sb);[m
[31m-  for (;;) {[m
[31m-    if (lj_char_isident(ls->c)) {[m
[31m-      GCstr *s;[m
[31m-      if (lj_char_isdigit(ls->c)) {  /* Numeric literal. */[m
[31m-	lex_number(ls, tv);[m
[31m-	return TK_number;[m
[31m-      }[m
[31m-      /* Identifier or reserved word. */[m
[31m-      do {[m
[31m-	lex_savenext(ls);[m
[31m-      } while (lj_char_isident(ls->c));[m
[31m-      s = lj_parse_keepstr(ls, sbufB(&ls->sb), sbuflen(&ls->sb));[m
[31m-      setstrV(ls->L, tv, s);[m
[31m-      if (s->reserved > 0)  /* Reserved word? */[m
[31m-	return TK_OFS + s->reserved;[m
[31m-      return TK_name;[m
[31m-    }[m
[31m-    switch (ls->c) {[m
[31m-    case '\n':[m
[31m-    case '\r':[m
[31m-      lex_newline(ls);[m
[31m-      continue;[m
[31m-    case ' ':[m
[31m-    case '\t':[m
[31m-    case '\v':[m
[31m-    case '\f':[m
[31m-      lex_next(ls);[m
[31m-      continue;[m
[31m-    case '-':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '-') return '-';[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c == '[') {  /* Long comment "--[=*[...]=*]". */[m
[31m-	int sep = lex_skipeq(ls);[m
[31m-	lj_buf_reset(&ls->sb);  /* `lex_skipeq' may dirty the buffer */[m
[31m-	if (sep >= 0) {[m
[31m-	  lex_longstring(ls, NULL, sep);[m
[31m-	  lj_buf_reset(&ls->sb);[m
[31m-	  continue;[m
[31m-	}[m
[31m-      }[m
[31m-      /* Short comment "--.*\n". */[m
[31m-      while (!lex_iseol(ls) && ls->c != LEX_EOF)[m
[31m-	lex_next(ls);[m
[31m-      continue;[m
[31m-    case '[': {[m
[31m-      int sep = lex_skipeq(ls);[m
[31m-      if (sep >= 0) {[m
[31m-	lex_longstring(ls, tv, sep);[m
[31m-	return TK_string;[m
[31m-      } else if (sep == -1) {[m
[31m-	return '[';[m
[31m-      } else {[m
[31m-	lj_lex_error(ls, TK_string, LJ_ERR_XLDELIM);[m
[31m-	continue;[m
[31m-      }[m
[31m-      }[m
[31m-    case '=':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '=') return '='; else { lex_next(ls); return TK_eq; }[m
[31m-    case '<':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '=') return '<'; else { lex_next(ls); return TK_le; }[m
[31m-    case '>':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '=') return '>'; else { lex_next(ls); return TK_ge; }[m
[31m-    case '~':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != '=') return '~'; else { lex_next(ls); return TK_ne; }[m
[31m-    case ':':[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c != ':') return ':'; else { lex_next(ls); return TK_label; }[m
[31m-    case '"':[m
[31m-    case '\'':[m
[31m-      lex_string(ls, tv);[m
[31m-      return TK_string;[m
[31m-    case '.':[m
[31m-      if (lex_savenext(ls) == '.') {[m
[31m-	lex_next(ls);[m
[31m-	if (ls->c == '.') {[m
[31m-	  lex_next(ls);[m
[31m-	  return TK_dots;   /* ... */[m
[31m-	}[m
[31m-	return TK_concat;   /* .. */[m
[31m-      } else if (!lj_char_isdigit(ls->c)) {[m
[31m-	return '.';[m
[31m-      } else {[m
[31m-	lex_number(ls, tv);[m
[31m-	return TK_number;[m
[31m-      }[m
[31m-    case LEX_EOF:[m
[31m-      return TK_eof;[m
[31m-    default: {[m
[31m-      LexChar c = ls->c;[m
[31m-      lex_next(ls);[m
[31m-      return c;  /* Single-char tokens (+ - / ...). */[m
[31m-    }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Lexer API ----------------------------------------------------------- */[m
[31m-[m
[31m-/* Setup lexer state. */[m
[31m-int lj_lex_setup(lua_State *L, LexState *ls)[m
[31m-{[m
[31m-  int header = 0;[m
[31m-  ls->L = L;[m
[31m-  ls->fs = NULL;[m
[31m-  ls->pe = ls->p = NULL;[m
[31m-  ls->vstack = NULL;[m
[31m-  ls->sizevstack = 0;[m
[31m-  ls->vtop = 0;[m
[31m-  ls->bcstack = NULL;[m
[31m-  ls->sizebcstack = 0;[m
[31m-  ls->tok = 0;[m
[31m-  ls->lookahead = TK_eof;  /* No look-ahead token. */[m
[31m-  ls->linenumber = 1;[m
[31m-  ls->lastline = 1;[m
[31m-  lex_next(ls);  /* Read-ahead first char. */[m
[31m-  if (ls->c == 0xef && ls->p + 2 <= ls->pe && (uint8_t)ls->p[0] == 0xbb &&[m
[31m-      (uint8_t)ls->p[1] == 0xbf) {  /* Skip UTF-8 BOM (if buffered). */[m
[31m-    ls->p += 2;[m
[31m-    lex_next(ls);[m
[31m-    header = 1;[m
[31m-  }[m
[31m-  if (ls->c == '#') {  /* Skip POSIX #! header line. */[m
[31m-    do {[m
[31m-      lex_next(ls);[m
[31m-      if (ls->c == LEX_EOF) return 0;[m
[31m-    } while (!lex_iseol(ls));[m
[31m-    lex_newline(ls);[m
[31m-    header = 1;[m
[31m-  }[m
[31m-  if (ls->c == LUA_SIGNATURE[0]) {  /* Bytecode dump. */[m
[31m-    if (header) {[m
[31m-      /*[m
[31m-      ** Loading bytecode with an extra header is disabled for security[m
[31m-      ** reasons. This may circumvent the usual check for bytecode vs.[m
[31m-      ** Lua code by looking at the first char. Since this is a potential[m
[31m-      ** security violation no attempt is made to echo the chunkname either.[m
[31m-      */[m
[31m-      setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCBAD));[m
[31m-      lj_err_throw(L, LUA_ERRSYNTAX);[m
[31m-    }[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Cleanup lexer state. */[m
[31m-void lj_lex_cleanup(lua_State *L, LexState *ls)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lj_mem_freevec(g, ls->bcstack, ls->sizebcstack, BCInsLine);[m
[31m-  lj_mem_freevec(g, ls->vstack, ls->sizevstack, VarInfo);[m
[31m-  lj_buf_free(g, &ls->sb);[m
[31m-}[m
[31m-[m
[31m-/* Return next lexical token. */[m
[31m-void lj_lex_next(LexState *ls)[m
[31m-{[m
[31m-  ls->lastline = ls->linenumber;[m
[31m-  if (LJ_LIKELY(ls->lookahead == TK_eof)) {  /* No lookahead token? */[m
[31m-    ls->tok = lex_scan(ls, &ls->tokval);  /* Get next token. */[m
[31m-  } else {  /* Otherwise return lookahead token. */[m
[31m-    ls->tok = ls->lookahead;[m
[31m-    ls->lookahead = TK_eof;[m
[31m-    ls->tokval = ls->lookaheadval;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Look ahead for the next token. */[m
[31m-LexToken lj_lex_lookahead(LexState *ls)[m
[31m-{[m
[31m-  lua_assert(ls->lookahead == TK_eof);[m
[31m-  ls->lookahead = lex_scan(ls, &ls->lookaheadval);[m
[31m-  return ls->lookahead;[m
[31m-}[m
[31m-[m
[31m-/* Convert token to string. */[m
[31m-const char *lj_lex_token2str(LexState *ls, LexToken tok)[m
[31m-{[m
[31m-  if (tok > TK_OFS)[m
[31m-    return tokennames[tok-TK_OFS-1];[m
[31m-  else if (!lj_char_iscntrl(tok))[m
[31m-    return lj_strfmt_pushf(ls->L, "%c", tok);[m
[31m-  else[m
[31m-    return lj_strfmt_pushf(ls->L, "char(%d)", tok);[m
[31m-}[m
[31m-[m
[31m-/* Lexer error. */[m
[31m-void lj_lex_error(LexState *ls, LexToken tok, ErrMsg em, ...)[m
[31m-{[m
[31m-  const char *tokstr;[m
[31m-  va_list argp;[m
[31m-  if (tok == 0) {[m
[31m-    tokstr = NULL;[m
[31m-  } else if (tok == TK_name || tok == TK_string || tok == TK_number) {[m
[31m-    lex_save(ls, '\0');[m
[31m-    tokstr = sbufB(&ls->sb);[m
[31m-  } else {[m
[31m-    tokstr = lj_lex_token2str(ls, tok);[m
[31m-  }[m
[31m-  va_start(argp, em);[m
[31m-  lj_err_lex(ls->L, ls->chunkname, tokstr, ls->linenumber, em, argp);[m
[31m-  va_end(argp);[m
[31m-}[m
[31m-[m
[31m-/* Initialize strings for reserved words. */[m
[31m-void lj_lex_init(lua_State *L)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < TK_RESERVED; i++) {[m
[31m-    GCstr *s = lj_str_newz(L, tokennames[i]);[m
[31m-    fixstring(s);  /* Reserved words are never collected. */[m
[31m-    s->reserved = (uint8_t)(i+1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lex.h[m
[1mdeleted file mode 100644[m
[1mindex 7fed1fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lex.h[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-/*[m
[31m-** Lexical analyzer.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_LEX_H[m
[31m-#define _LJ_LEX_H[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_err.h"[m
[31m-[m
[31m-/* Lua lexer tokens. */[m
[31m-#define TKDEF(_, __) \[m
[31m-  _(and) _(break) _(do) _(else) _(elseif) _(end) _(false) \[m
[31m-  _(for) _(function) _(goto) _(if) _(in) _(local) _(nil) _(not) _(or) \[m
[31m-  _(repeat) _(return) _(then) _(true) _(until) _(while) \[m
[31m-  __(concat, ..) __(dots, ...) __(eq, ==) __(ge, >=) __(le, <=) __(ne, ~=) \[m
[31m-  __(label, ::) __(number, <number>) __(name, <name>) __(string, <string>) \[m
[31m-  __(eof, <eof>)[m
[31m-[m
[31m-enum {[m
[31m-  TK_OFS = 256,[m
[31m-#define TKENUM1(name)		TK_##name,[m
[31m-#define TKENUM2(name, sym)	TK_##name,[m
[31m-TKDEF(TKENUM1, TKENUM2)[m
[31m-#undef TKENUM1[m
[31m-#undef TKENUM2[m
[31m-  TK_RESERVED = TK_while - TK_OFS[m
[31m-};[m
[31m-[m
[31m-typedef int LexChar;	/* Lexical character. Unsigned ext. from char. */[m
[31m-typedef int LexToken;	/* Lexical token. */[m
[31m-[m
[31m-/* Combined bytecode ins/line. Only used during bytecode generation. */[m
[31m-typedef struct BCInsLine {[m
[31m-  BCIns ins;		/* Bytecode instruction. */[m
[31m-  BCLine line;		/* Line number for this bytecode. */[m
[31m-} BCInsLine;[m
[31m-[m
[31m-/* Info for local variables. Only used during bytecode generation. */[m
[31m-typedef struct VarInfo {[m
[31m-  GCRef name;		/* Local variable name or goto/label name. */[m
[31m-  BCPos startpc;	/* First point where the local variable is active. */[m
[31m-  BCPos endpc;		/* First point where the local variable is dead. */[m
[31m-  uint8_t slot;		/* Variable slot. */[m
[31m-  uint8_t info;		/* Variable/goto/label info. */[m
[31m-} VarInfo;[m
[31m-[m
[31m-/* Lua lexer state. */[m
[31m-typedef struct LexState {[m
[31m-  struct FuncState *fs;	/* Current FuncState. Defined in lj_parse.c. */[m
[31m-  struct lua_State *L;	/* Lua state. */[m
[31m-  TValue tokval;	/* Current token value. */[m
[31m-  TValue lookaheadval;	/* Lookahead token value. */[m
[31m-  const char *p;	/* Current position in input buffer. */[m
[31m-  const char *pe;	/* End of input buffer. */[m
[31m-  LexChar c;		/* Current character. */[m
[31m-  LexToken tok;		/* Current token. */[m
[31m-  LexToken lookahead;	/* Lookahead token. */[m
[31m-  SBuf sb;		/* String buffer for tokens. */[m
[31m-  lua_Reader rfunc;	/* Reader callback. */[m
[31m-  void *rdata;		/* Reader callback data. */[m
[31m-  BCLine linenumber;	/* Input line counter. */[m
[31m-  BCLine lastline;	/* Line of last token. */[m
[31m-  GCstr *chunkname;	/* Current chunk name (interned string). */[m
[31m-  const char *chunkarg;	/* Chunk name argument. */[m
[31m-  const char *mode;	/* Allow loading bytecode (b) and/or source text (t). */[m
[31m-  VarInfo *vstack;	/* Stack for names and extents of local variables. */[m
[31m-  MSize sizevstack;	/* Size of variable stack. */[m
[31m-  MSize vtop;		/* Top of variable stack. */[m
[31m-  BCInsLine *bcstack;	/* Stack for bytecode instructions/line numbers. */[m
[31m-  MSize sizebcstack;	/* Size of bytecode stack. */[m
[31m-  uint32_t level;	/* Syntactical nesting level. */[m
[31m-} LexState;[m
[31m-[m
[31m-LJ_FUNC int lj_lex_setup(lua_State *L, LexState *ls);[m
[31m-LJ_FUNC void lj_lex_cleanup(lua_State *L, LexState *ls);[m
[31m-LJ_FUNC void lj_lex_next(LexState *ls);[m
[31m-LJ_FUNC LexToken lj_lex_lookahead(LexState *ls);[m
[31m-LJ_FUNC const char *lj_lex_token2str(LexState *ls, LexToken tok);[m
[31m-LJ_FUNC_NORET void lj_lex_error(LexState *ls, LexToken tok, ErrMsg em, ...);[m
[31m-LJ_FUNC void lj_lex_init(lua_State *L);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lib.c[m
[1mdeleted file mode 100644[m
[1mindex 8bdf691..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lib.c[m
[1m+++ /dev/null[m
[36m@@ -1,303 +0,0 @@[m
[31m-/*[m
[31m-** Library function support.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_lib_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* -- Library initialization ---------------------------------------------- */[m
[31m-[m
[31m-static GCtab *lib_create_table(lua_State *L, const char *libname, int hsize)[m
[31m-{[m
[31m-  if (libname) {[m
[31m-    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);[m
[31m-    lua_getfield(L, -1, libname);[m
[31m-    if (!tvistab(L->top-1)) {[m
[31m-      L->top--;[m
[31m-      if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, hsize) != NULL)[m
[31m-	lj_err_callerv(L, LJ_ERR_BADMODN, libname);[m
[31m-      settabV(L, L->top, tabV(L->top-1));[m
[31m-      L->top++;[m
[31m-      lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */[m
[31m-    }[m
[31m-    L->top--;[m
[31m-    settabV(L, L->top-1, tabV(L->top));[m
[31m-  } else {[m
[31m-    lua_createtable(L, 0, hsize);[m
[31m-  }[m
[31m-  return tabV(L->top-1);[m
[31m-}[m
[31m-[m
[31m-static const uint8_t *lib_read_lfunc(lua_State *L, const uint8_t *p, GCtab *tab)[m
[31m-{[m
[31m-  int len = *p++;[m
[31m-  GCstr *name = lj_str_new(L, (const char *)p, len);[m
[31m-  LexState ls;[m
[31m-  GCproto *pt;[m
[31m-  GCfunc *fn;[m
[31m-  memset(&ls, 0, sizeof(ls));[m
[31m-  ls.L = L;[m
[31m-  ls.p = (const char *)(p+len);[m
[31m-  ls.pe = (const char *)~(uintptr_t)0;[m
[31m-  ls.c = -1;[m
[31m-  ls.level = (BCDUMP_F_STRIP|(LJ_BE*BCDUMP_F_BE));[m
[31m-  ls.chunkname = name;[m
[31m-  pt = lj_bcread_proto(&ls);[m
[31m-  pt->firstline = ~(BCLine)0;[m
[31m-  fn = lj_func_newL_empty(L, pt, tabref(L->env));[m
[31m-  /* NOBARRIER: See below for common barrier. */[m
[31m-  setfuncV(L, lj_tab_setstr(L, tab, name), fn);[m
[31m-  return (const uint8_t *)ls.p;[m
[31m-}[m
[31m-[m
[31m-void lj_lib_register(lua_State *L, const char *libname,[m
[31m-		     const uint8_t *p, const lua_CFunction *cf)[m
[31m-{[m
[31m-  GCtab *env = tabref(L->env);[m
[31m-  GCfunc *ofn = NULL;[m
[31m-  int ffid = *p++;[m
[31m-  BCIns *bcff = &L2GG(L)->bcff[*p++];[m
[31m-  GCtab *tab = lib_create_table(L, libname, *p++);[m
[31m-  ptrdiff_t tpos = L->top - L->base;[m
[31m-[m
[31m-  /* Avoid barriers further down. */[m
[31m-  lj_gc_anybarriert(L, tab);[m
[31m-  tab->nomm = 0;[m
[31m-[m
[31m-  for (;;) {[m
[31m-    uint32_t tag = *p++;[m
[31m-    MSize len = tag & LIBINIT_LENMASK;[m
[31m-    tag &= LIBINIT_TAGMASK;[m
[31m-    if (tag != LIBINIT_STRING) {[m
[31m-      const char *name;[m
[31m-      MSize nuv = (MSize)(L->top - L->base - tpos);[m
[31m-      GCfunc *fn = lj_func_newC(L, nuv, env);[m
[31m-      if (nuv) {[m
[31m-	L->top = L->base + tpos;[m
[31m-	memcpy(fn->c.upvalue, L->top, sizeof(TValue)*nuv);[m
[31m-      }[m
[31m-      fn->c.ffid = (uint8_t)(ffid++);[m
[31m-      name = (const char *)p;[m
[31m-      p += len;[m
[31m-      if (tag == LIBINIT_CF)[m
[31m-	setmref(fn->c.pc, &G(L)->bc_cfunc_int);[m
[31m-      else[m
[31m-	setmref(fn->c.pc, bcff++);[m
[31m-      if (tag == LIBINIT_ASM_)[m
[31m-	fn->c.f = ofn->c.f;  /* Copy handler from previous function. */[m
[31m-      else[m
[31m-	fn->c.f = *cf++;  /* Get cf or handler from C function table. */[m
[31m-      if (len) {[m
[31m-	/* NOBARRIER: See above for common barrier. */[m
[31m-	setfuncV(L, lj_tab_setstr(L, tab, lj_str_new(L, name, len)), fn);[m
[31m-      }[m
[31m-      ofn = fn;[m
[31m-    } else {[m
[31m-      switch (tag | len) {[m
[31m-      case LIBINIT_LUA:[m
[31m-	p = lib_read_lfunc(L, p, tab);[m
[31m-	break;[m
[31m-      case LIBINIT_SET:[m
[31m-	L->top -= 2;[m
[31m-	if (tvisstr(L->top+1) && strV(L->top+1)->len == 0)[m
[31m-	  env = tabV(L->top);[m
[31m-	else  /* NOBARRIER: See above for common barrier. */[m
[31m-	  copyTV(L, lj_tab_set(L, tab, L->top+1), L->top);[m
[31m-	break;[m
[31m-      case LIBINIT_NUMBER:[m
[31m-	memcpy(&L->top->n, p, sizeof(double));[m
[31m-	L->top++;[m
[31m-	p += sizeof(double);[m
[31m-	break;[m
[31m-      case LIBINIT_COPY:[m
[31m-	copyTV(L, L->top, L->top - *p++);[m
[31m-	L->top++;[m
[31m-	break;[m
[31m-      case LIBINIT_LASTCL:[m
[31m-	setfuncV(L, L->top++, ofn);[m
[31m-	break;[m
[31m-      case LIBINIT_FFID:[m
[31m-	ffid++;[m
[31m-	break;[m
[31m-      case LIBINIT_END:[m
[31m-	return;[m
[31m-      default:[m
[31m-	setstrV(L, L->top++, lj_str_new(L, (const char *)p, len));[m
[31m-	p += len;[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Push internal function on the stack. */[m
[31m-GCfunc *lj_lib_pushcc(lua_State *L, lua_CFunction f, int id, int n)[m
[31m-{[m
[31m-  GCfunc *fn;[m
[31m-  lua_pushcclosure(L, f, n);[m
[31m-  fn = funcV(L->top-1);[m
[31m-  fn->c.ffid = (uint8_t)id;[m
[31m-  setmref(fn->c.pc, &G(L)->bc_cfunc_int);[m
[31m-  return fn;[m
[31m-}[m
[31m-[m
[31m-void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f, GCtab *env)[m
[31m-{[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD", 4);[m
[31m-  lua_pushcfunction(L, f);[m
[31m-  /* NOBARRIER: The function is new (marked white). */[m
[31m-  setgcref(funcV(L->top-1)->c.env, obj2gco(env));[m
[31m-  lua_setfield(L, -2, name);[m
[31m-  L->top--;[m
[31m-}[m
[31m-[m
[31m-int lj_lib_postreg(lua_State *L, lua_CFunction cf, int id, const char *name)[m
[31m-{[m
[31m-  GCfunc *fn = lj_lib_pushcf(L, cf, id);[m
[31m-  GCtab *t = tabref(curr_func(L)->c.env);  /* Reference to parent table. */[m
[31m-  setfuncV(L, lj_tab_setstr(L, t, lj_str_newz(L, name)), fn);[m
[31m-  lj_gc_anybarriert(L, t);[m
[31m-  setfuncV(L, L->top++, fn);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* -- Type checks --------------------------------------------------------- */[m
[31m-[m
[31m-TValue *lj_lib_checkany(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (o >= L->top)[m
[31m-    lj_err_arg(L, narg, LJ_ERR_NOVAL);[m
[31m-  return o;[m
[31m-}[m
[31m-[m
[31m-GCstr *lj_lib_checkstr(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (o < L->top) {[m
[31m-    if (LJ_LIKELY(tvisstr(o))) {[m
[31m-      return strV(o);[m
[31m-    } else if (tvisnumber(o)) {[m
[31m-      GCstr *s = lj_strfmt_number(L, o);[m
[31m-      setstrV(L, o, s);[m
[31m-      return s;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_err_argt(L, narg, LUA_TSTRING);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-GCstr *lj_lib_optstr(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  return (o < L->top && !tvisnil(o)) ? lj_lib_checkstr(L, narg) : NULL;[m
[31m-}[m
[31m-[m
[31m-#if LJ_DUALNUM[m
[31m-void lj_lib_checknumber(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && lj_strscan_numberobj(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-lua_Number lj_lib_checknum(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top &&[m
[31m-	(tvisnumber(o) || (tvisstr(o) && lj_strscan_num(strV(o), o)))))[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-  if (LJ_UNLIKELY(tvisint(o))) {[m
[31m-    lua_Number n = (lua_Number)intV(o);[m
[31m-    setnumV(o, n);[m
[31m-    return n;[m
[31m-  } else {[m
[31m-    return numV(o);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-int32_t lj_lib_checkint(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && lj_strscan_numberobj(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TNUMBER);[m
[31m-  if (LJ_LIKELY(tvisint(o))) {[m
[31m-    return intV(o);[m
[31m-  } else {[m
[31m-    int32_t i = lj_num2int(numV(o));[m
[31m-    if (LJ_DUALNUM) setintV(o, i);[m
[31m-    return i;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-int32_t lj_lib_optint(lua_State *L, int narg, int32_t def)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  return (o < L->top && !tvisnil(o)) ? lj_lib_checkint(L, narg) : def;[m
[31m-}[m
[31m-[m
[31m-GCfunc *lj_lib_checkfunc(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && tvisfunc(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TFUNCTION);[m
[31m-  return funcV(o);[m
[31m-}[m
[31m-[m
[31m-GCtab *lj_lib_checktab(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (!(o < L->top && tvistab(o)))[m
[31m-    lj_err_argt(L, narg, LUA_TTABLE);[m
[31m-  return tabV(o);[m
[31m-}[m
[31m-[m
[31m-GCtab *lj_lib_checktabornil(lua_State *L, int narg)[m
[31m-{[m
[31m-  TValue *o = L->base + narg-1;[m
[31m-  if (o < L->top) {[m
[31m-    if (tvistab(o))[m
[31m-      return tabV(o);[m
[31m-    else if (tvisnil(o))[m
[31m-      return NULL;[m
[31m-  }[m
[31m-  lj_err_arg(L, narg, LJ_ERR_NOTABN);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst)[m
[31m-{[m
[31m-  GCstr *s = def >= 0 ? lj_lib_optstr(L, narg) : lj_lib_checkstr(L, narg);[m
[31m-  if (s) {[m
[31m-    const char *opt = strdata(s);[m
[31m-    MSize len = s->len;[m
[31m-    int i;[m
[31m-    for (i = 0; *(const uint8_t *)lst; i++) {[m
[31m-      if (*(const uint8_t *)lst == len && memcmp(opt, lst+1, len) == 0)[m
[31m-	return i;[m
[31m-      lst += 1+*(const uint8_t *)lst;[m
[31m-    }[m
[31m-    lj_err_argv(L, narg, LJ_ERR_INVOPTM, opt);[m
[31m-  }[m
[31m-  return def;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lib.h[m
[1mdeleted file mode 100644[m
[1mindex dbc0405..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_lib.h[m
[1m+++ /dev/null[m
[36m@@ -1,115 +0,0 @@[m
[31m-/*[m
[31m-** Library function support.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_LIB_H[m
[31m-#define _LJ_LIB_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/*[m
[31m-** A fallback handler is called by the assembler VM if the fast path fails:[m
[31m-**[m
[31m-** - too few arguments:   unrecoverable.[m
[31m-** - wrong argument type:   recoverable, if coercion succeeds.[m
[31m-** - bad argument value:  unrecoverable.[m
[31m-** - stack overflow:        recoverable, if stack reallocation succeeds.[m
[31m-** - extra handling:        recoverable.[m
[31m-**[m
[31m-** The unrecoverable cases throw an error with lj_err_arg(), lj_err_argtype(),[m
[31m-** lj_err_caller() or lj_err_callermsg().[m
[31m-** The recoverable cases return 0 or the number of results + 1.[m
[31m-** The assembler VM retries the fast path only if 0 is returned.[m
[31m-** This time the fallback must not be called again or it gets stuck in a loop.[m
[31m-*/[m
[31m-[m
[31m-/* Return values from fallback handler. */[m
[31m-#define FFH_RETRY	0[m
[31m-#define FFH_UNREACHABLE	FFH_RETRY[m
[31m-#define FFH_RES(n)	((n)+1)[m
[31m-#define FFH_TAILCALL	(-1)[m
[31m-[m
[31m-LJ_FUNC TValue *lj_lib_checkany(lua_State *L, int narg);[m
[31m-LJ_FUNC GCstr *lj_lib_checkstr(lua_State *L, int narg);[m
[31m-LJ_FUNC GCstr *lj_lib_optstr(lua_State *L, int narg);[m
[31m-#if LJ_DUALNUM[m
[31m-LJ_FUNC void lj_lib_checknumber(lua_State *L, int narg);[m
[31m-#else[m
[31m-#define lj_lib_checknumber(L, narg)	lj_lib_checknum((L), (narg))[m
[31m-#endif[m
[31m-LJ_FUNC lua_Number lj_lib_checknum(lua_State *L, int narg);[m
[31m-LJ_FUNC int32_t lj_lib_checkint(lua_State *L, int narg);[m
[31m-LJ_FUNC int32_t lj_lib_optint(lua_State *L, int narg, int32_t def);[m
[31m-LJ_FUNC GCfunc *lj_lib_checkfunc(lua_State *L, int narg);[m
[31m-LJ_FUNC GCtab *lj_lib_checktab(lua_State *L, int narg);[m
[31m-LJ_FUNC GCtab *lj_lib_checktabornil(lua_State *L, int narg);[m
[31m-LJ_FUNC int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst);[m
[31m-[m
[31m-/* Avoid including lj_frame.h. */[m
[31m-#if LJ_GC64[m
[31m-#define lj_lib_upvalue(L, n) \[m
[31m-  (&gcval(L->base-2)->fn.c.upvalue[(n)-1])[m
[31m-#elif LJ_FR2[m
[31m-#define lj_lib_upvalue(L, n) \[m
[31m-  (&gcref((L->base-2)->gcr)->fn.c.upvalue[(n)-1])[m
[31m-#else[m
[31m-#define lj_lib_upvalue(L, n) \[m
[31m-  (&gcref((L->base-1)->fr.func)->fn.c.upvalue[(n)-1])[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-#define lj_lib_checkfpu(L) \[m
[31m-  do { setnumV(L->top++, (lua_Number)1437217655); \[m
[31m-    if (lua_tointeger(L, -1) != 1437217655) lj_err_caller(L, LJ_ERR_BADFPU); \[m
[31m-    L->top--; } while (0)[m
[31m-#else[m
[31m-#define lj_lib_checkfpu(L)	UNUSED(L)[m
[31m-#endif[m
[31m-[m
[31m-LJ_FUNC GCfunc *lj_lib_pushcc(lua_State *L, lua_CFunction f, int id, int n);[m
[31m-#define lj_lib_pushcf(L, fn, id)	(lj_lib_pushcc(L, (fn), (id), 0))[m
[31m-[m
[31m-/* Library function declarations. Scanned by buildvm. */[m
[31m-#define LJLIB_CF(name)		static int lj_cf_##name(lua_State *L)[m
[31m-#define LJLIB_ASM(name)		static int lj_ffh_##name(lua_State *L)[m
[31m-#define LJLIB_ASM_(name)[m
[31m-#define LJLIB_LUA(name)[m
[31m-#define LJLIB_SET(name)[m
[31m-#define LJLIB_PUSH(arg)[m
[31m-#define LJLIB_REC(handler)[m
[31m-#define LJLIB_NOREGUV[m
[31m-#define LJLIB_NOREG[m
[31m-[m
[31m-#define LJ_LIB_REG(L, regname, name) \[m
[31m-  lj_lib_register(L, regname, lj_lib_init_##name, lj_lib_cf_##name)[m
[31m-[m
[31m-LJ_FUNC void lj_lib_register(lua_State *L, const char *libname,[m
[31m-			     const uint8_t *init, const lua_CFunction *cf);[m
[31m-LJ_FUNC void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f,[m
[31m-			   GCtab *env);[m
[31m-LJ_FUNC int lj_lib_postreg(lua_State *L, lua_CFunction cf, int id,[m
[31m-			   const char *name);[m
[31m-[m
[31m-/* Library init data tags. */[m
[31m-#define LIBINIT_LENMASK	0x3f[m
[31m-#define LIBINIT_TAGMASK	0xc0[m
[31m-#define LIBINIT_CF	0x00[m
[31m-#define LIBINIT_ASM	0x40[m
[31m-#define LIBINIT_ASM_	0x80[m
[31m-#define LIBINIT_STRING	0xc0[m
[31m-#define LIBINIT_MAXSTR	0x38[m
[31m-#define LIBINIT_LUA	0xf9[m
[31m-#define LIBINIT_SET	0xfa[m
[31m-#define LIBINIT_NUMBER	0xfb[m
[31m-#define LIBINIT_COPY	0xfc[m
[31m-#define LIBINIT_LASTCL	0xfd[m
[31m-#define LIBINIT_FFID	0xfe[m
[31m-#define LIBINIT_END	0xff[m
[31m-[m
[31m-/* Exported library functions. */[m
[31m-[m
[31m-typedef struct RandomState RandomState;[m
[31m-LJ_FUNC uint64_t LJ_FASTCALL lj_math_random_step(RandomState *rs);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_load.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_load.c[m
[1mdeleted file mode 100644[m
[1mindex d500d16..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_load.c[m
[1m+++ /dev/null[m
[36m@@ -1,168 +0,0 @@[m
[31m-/*[m
[31m-** Load and dump code.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lj_load_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_bcdump.h"[m
[31m-#include "lj_parse.h"[m
[31m-[m
[31m-/* -- Load Lua source code and bytecode ----------------------------------- */[m
[31m-[m
[31m-static TValue *cpparser(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  LexState *ls = (LexState *)ud;[m
[31m-  GCproto *pt;[m
[31m-  GCfunc *fn;[m
[31m-  int bc;[m
[31m-  UNUSED(dummy);[m
[31m-  cframe_errfunc(L->cframe) = -1;  /* Inherit error function. */[m
[31m-  bc = lj_lex_setup(L, ls);[m
[31m-  if (ls->mode && !strchr(ls->mode, bc ? 'b' : 't')) {[m
[31m-    setstrV(L, L->top++, lj_err_str(L, LJ_ERR_XMODE));[m
[31m-    lj_err_throw(L, LUA_ERRSYNTAX);[m
[31m-  }[m
[31m-  pt = bc ? lj_bcread(ls) : lj_parse(ls);[m
[31m-  fn = lj_func_newL_empty(L, pt, tabref(L->env));[m
[31m-  /* Don't combine above/below into one statement. */[m
[31m-  setfuncV(L, L->top++, fn);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_loadx(lua_State *L, lua_Reader reader, void *data,[m
[31m-		      const char *chunkname, const char *mode)[m
[31m-{[m
[31m-  LexState ls;[m
[31m-  int status;[m
[31m-  ls.rfunc = reader;[m
[31m-  ls.rdata = data;[m
[31m-  ls.chunkarg = chunkname ? chunkname : "?";[m
[31m-  ls.mode = mode;[m
[31m-  lj_buf_init(L, &ls.sb);[m
[31m-  status = lj_vm_cpcall(L, NULL, &ls, cpparser);[m
[31m-  lj_lex_cleanup(L, &ls);[m
[31m-  lj_gc_check(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-LUA_API int lua_load(lua_State *L, lua_Reader reader, void *data,[m
[31m-		     const char *chunkname)[m
[31m-{[m
[31m-  return lua_loadx(L, reader, data, chunkname, NULL);[m
[31m-}[m
[31m-[m
[31m-typedef struct FileReaderCtx {[m
[31m-  FILE *fp;[m
[31m-  char buf[LUAL_BUFFERSIZE];[m
[31m-} FileReaderCtx;[m
[31m-[m
[31m-static const char *reader_file(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-  FileReaderCtx *ctx = (FileReaderCtx *)ud;[m
[31m-  UNUSED(L);[m
[31m-  if (feof(ctx->fp)) return NULL;[m
[31m-  *size = fread(ctx->buf, 1, sizeof(ctx->buf), ctx->fp);[m
[31m-  return *size > 0 ? ctx->buf : NULL;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadfilex(lua_State *L, const char *filename,[m
[31m-			      const char *mode)[m
[31m-{[m
[31m-  FileReaderCtx ctx;[m
[31m-  int status;[m
[31m-  const char *chunkname;[m
[31m-  if (filename) {[m
[31m-    ctx.fp = fopen(filename, "rb");[m
[31m-    if (ctx.fp == NULL) {[m
[31m-      lua_pushfstring(L, "cannot open %s: %s", filename, strerror(errno));[m
[31m-      return LUA_ERRFILE;[m
[31m-    }[m
[31m-    chunkname = lua_pushfstring(L, "@%s", filename);[m
[31m-  } else {[m
[31m-    ctx.fp = stdin;[m
[31m-    chunkname = "=stdin";[m
[31m-  }[m
[31m-  status = lua_loadx(L, reader_file, &ctx, chunkname, mode);[m
[31m-  if (ferror(ctx.fp)) {[m
[31m-    L->top -= filename ? 2 : 1;[m
[31m-    lua_pushfstring(L, "cannot read %s: %s", chunkname+1, strerror(errno));[m
[31m-    if (filename)[m
[31m-      fclose(ctx.fp);[m
[31m-    return LUA_ERRFILE;[m
[31m-  }[m
[31m-  if (filename) {[m
[31m-    L->top--;[m
[31m-    copyTV(L, L->top-1, L->top);[m
[31m-    fclose(ctx.fp);[m
[31m-  }[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadfile(lua_State *L, const char *filename)[m
[31m-{[m
[31m-  return luaL_loadfilex(L, filename, NULL);[m
[31m-}[m
[31m-[m
[31m-typedef struct StringReaderCtx {[m
[31m-  const char *str;[m
[31m-  size_t size;[m
[31m-} StringReaderCtx;[m
[31m-[m
[31m-static const char *reader_string(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-  StringReaderCtx *ctx = (StringReaderCtx *)ud;[m
[31m-  UNUSED(L);[m
[31m-  if (ctx->size == 0) return NULL;[m
[31m-  *size = ctx->size;[m
[31m-  ctx->size = 0;[m
[31m-  return ctx->str;[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadbufferx(lua_State *L, const char *buf, size_t size,[m
[31m-				const char *name, const char *mode)[m
[31m-{[m
[31m-  StringReaderCtx ctx;[m
[31m-  ctx.str = buf;[m
[31m-  ctx.size = size;[m
[31m-  return lua_loadx(L, reader_string, &ctx, name, mode);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadbuffer(lua_State *L, const char *buf, size_t size,[m
[31m-			       const char *name)[m
[31m-{[m
[31m-  return luaL_loadbufferx(L, buf, size, name, NULL);[m
[31m-}[m
[31m-[m
[31m-LUALIB_API int luaL_loadstring(lua_State *L, const char *s)[m
[31m-{[m
[31m-  return luaL_loadbuffer(L, s, strlen(s), s);[m
[31m-}[m
[31m-[m
[31m-/* -- Dump bytecode ------------------------------------------------------- */[m
[31m-[m
[31m-LUA_API int lua_dump(lua_State *L, lua_Writer writer, void *data)[m
[31m-{[m
[31m-  cTValue *o = L->top-1;[m
[31m-  api_check(L, L->top > L->base);[m
[31m-  if (tvisfunc(o) && isluafunc(funcV(o)))[m
[31m-    return lj_bcwrite(L, funcproto(funcV(o)), writer, data, 0);[m
[31m-  else[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_mcode.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_mcode.c[m
[1mdeleted file mode 100644[m
[1mindex 3eaee05..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_mcode.c[m
[1m+++ /dev/null[m
[36m@@ -1,386 +0,0 @@[m
[31m-/*[m
[31m-** Machine code management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_mcode_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_mcode.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#endif[m
[31m-#if LJ_HASJIT || LJ_HASFFI[m
[31m-#include "lj_vm.h"[m
[31m-#endif[m
[31m-[m
[31m-/* -- OS-specific functions ----------------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASJIT || LJ_HASFFI[m
[31m-[m
[31m-/* Define this if you want to run LuaJIT with Valgrind. */[m
[31m-#ifdef LUAJIT_USE_VALGRIND[m
[31m-#include <valgrind/valgrind.h>[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_TARGET_IOS[m
[31m-void sys_icache_invalidate(void *start, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-/* Synchronize data/instruction cache. */[m
[31m-void lj_mcode_sync(void *start, void *end)[m
[31m-{[m
[31m-#ifdef LUAJIT_USE_VALGRIND[m
[31m-  VALGRIND_DISCARD_TRANSLATIONS(start, (char *)end-(char *)start);[m
[31m-#endif[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  UNUSED(start); UNUSED(end);[m
[31m-#elif LJ_TARGET_IOS[m
[31m-  sys_icache_invalidate(start, (char *)end-(char *)start);[m
[31m-#elif LJ_TARGET_PPC[m
[31m-  lj_vm_cachesync(start, end);[m
[31m-#elif defined(__GNUC__)[m
[31m-  __clear_cache(start, end);[m
[31m-#else[m
[31m-#error "Missing builtin to flush instruction cache"[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#define MCPROT_RW	PAGE_READWRITE[m
[31m-#define MCPROT_RX	PAGE_EXECUTE_READ[m
[31m-#define MCPROT_RWX	PAGE_EXECUTE_READWRITE[m
[31m-[m
[31m-static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, DWORD prot)[m
[31m-{[m
[31m-  void *p = VirtualAlloc((void *)hint, sz,[m
[31m-			 MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, prot);[m
[31m-  if (!p && !hint)[m
[31m-    lj_trace_err(J, LJ_TRERR_MCODEAL);[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-static void mcode_free(jit_State *J, void *p, size_t sz)[m
[31m-{[m
[31m-  UNUSED(J); UNUSED(sz);[m
[31m-  VirtualFree(p, 0, MEM_RELEASE);[m
[31m-}[m
[31m-[m
[31m-static int mcode_setprot(void *p, size_t sz, DWORD prot)[m
[31m-{[m
[31m-  DWORD oprot;[m
[31m-  return !VirtualProtect(p, sz, prot, &oprot);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_TARGET_POSIX[m
[31m-[m
[31m-#include <sys/mman.h>[m
[31m-[m
[31m-#ifndef MAP_ANONYMOUS[m
[31m-#define MAP_ANONYMOUS	MAP_ANON[m
[31m-#endif[m
[31m-[m
[31m-#define MCPROT_RW	(PROT_READ|PROT_WRITE)[m
[31m-#define MCPROT_RX	(PROT_READ|PROT_EXEC)[m
[31m-#define MCPROT_RWX	(PROT_READ|PROT_WRITE|PROT_EXEC)[m
[31m-[m
[31m-static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)[m
[31m-{[m
[31m-  void *p = mmap((void *)hint, sz, prot, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);[m
[31m-  if (p == MAP_FAILED) {[m
[31m-    if (!hint) lj_trace_err(J, LJ_TRERR_MCODEAL);[m
[31m-    p = NULL;[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-static void mcode_free(jit_State *J, void *p, size_t sz)[m
[31m-{[m
[31m-  UNUSED(J);[m
[31m-  munmap(p, sz);[m
[31m-}[m
[31m-[m
[31m-static int mcode_setprot(void *p, size_t sz, int prot)[m
[31m-{[m
[31m-  return mprotect(p, sz, prot);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_64[m
[31m-[m
[31m-#error "Missing OS support for explicit placement of executable memory"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* Fallback allocator. This will fail if memory is not executable by default. */[m
[31m-#define LUAJIT_UNPROTECT_MCODE[m
[31m-#define MCPROT_RW	0[m
[31m-#define MCPROT_RX	0[m
[31m-#define MCPROT_RWX	0[m
[31m-[m
[31m-static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)[m
[31m-{[m
[31m-  UNUSED(hint); UNUSED(prot);[m
[31m-  return lj_mem_new(J->L, sz);[m
[31m-}[m
[31m-[m
[31m-static void mcode_free(jit_State *J, void *p, size_t sz)[m
[31m-{[m
[31m-  lj_mem_free(J2G(J), p, sz);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- MCode area protection ----------------------------------------------- */[m
[31m-[m
[31m-/* Define this ONLY if page protection twiddling becomes a bottleneck. */[m
[31m-#ifdef LUAJIT_UNPROTECT_MCODE[m
[31m-[m
[31m-/* It's generally considered to be a potential security risk to have[m
[31m-** pages with simultaneous write *and* execute access in a process.[m
[31m-**[m
[31m-** Do not even think about using this mode for server processes or[m
[31m-** apps handling untrusted external data (such as a browser).[m
[31m-**[m
[31m-** The security risk is not in LuaJIT itself -- but if an adversary finds[m
[31m-** any *other* flaw in your C application logic, then any RWX memory page[m
[31m-** simplifies writing an exploit considerably.[m
[31m-*/[m
[31m-#define MCPROT_GEN	MCPROT_RWX[m
[31m-#define MCPROT_RUN	MCPROT_RWX[m
[31m-[m
[31m-static void mcode_protect(jit_State *J, int prot)[m
[31m-{[m
[31m-  UNUSED(J); UNUSED(prot);[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* This is the default behaviour and much safer:[m
[31m-**[m
[31m-** Most of the time the memory pages holding machine code are executable,[m
[31m-** but NONE of them is writable.[m
[31m-**[m
[31m-** The current memory area is marked read-write (but NOT executable) only[m
[31m-** during the short time window while the assembler generates machine code.[m
[31m-*/[m
[31m-#define MCPROT_GEN	MCPROT_RW[m
[31m-#define MCPROT_RUN	MCPROT_RX[m
[31m-[m
[31m-/* Protection twiddling failed. Probably due to kernel security. */[m
[31m-static LJ_NOINLINE void mcode_protfail(jit_State *J)[m
[31m-{[m
[31m-  lua_CFunction panic = J2G(J)->panic;[m
[31m-  if (panic) {[m
[31m-    lua_State *L = J->L;[m
[31m-    setstrV(L, L->top++, lj_err_str(L, LJ_ERR_JITPROT));[m
[31m-    panic(L);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Change protection of MCode area. */[m
[31m-static void mcode_protect(jit_State *J, int prot)[m
[31m-{[m
[31m-  if (J->mcprot != prot) {[m
[31m-    if (LJ_UNLIKELY(mcode_setprot(J->mcarea, J->szmcarea, prot)))[m
[31m-      mcode_protfail(J);[m
[31m-    J->mcprot = prot;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- MCode area allocation ----------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X64[m
[31m-#define mcode_validptr(p)	((p) && (uintptr_t)(p) < (uintptr_t)1<<47)[m
[31m-#else[m
[31m-#define mcode_validptr(p)	((p) && (uintptr_t)(p) < 0xffff0000)[m
[31m-#endif[m
[31m-[m
[31m-#ifdef LJ_TARGET_JUMPRANGE[m
[31m-[m
[31m-/* Get memory within relative jump distance of our code in 64 bit mode. */[m
[31m-static void *mcode_alloc(jit_State *J, size_t sz)[m
[31m-{[m
[31m-  /* Target an address in the static assembler code (64K aligned).[m
[31m-  ** Try addresses within a distance of target-range/2+1MB..target+range/2-1MB.[m
[31m-  ** Use half the jump range so every address in the range can reach any other.[m
[31m-  */[m
[31m-#if LJ_TARGET_MIPS[m
[31m-  /* Use the middle of the 256MB-aligned region. */[m
[31m-  uintptr_t target = ((uintptr_t)(void *)lj_vm_exit_handler & 0xf0000000u) +[m
[31m-		     0x08000000u;[m
[31m-#else[m
[31m-  uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff;[m
[31m-#endif[m
[31m-  const uintptr_t range = (1u << (LJ_TARGET_JUMPRANGE-1)) - (1u << 21);[m
[31m-  /* First try a contiguous area below the last one. */[m
[31m-  uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0;[m
[31m-  int i;[m
[31m-  for (i = 0; i < 32; i++) {  /* 32 attempts ought to be enough ... */[m
[31m-    if (mcode_validptr(hint)) {[m
[31m-      void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN);[m
[31m-[m
[31m-      if (mcode_validptr(p) &&[m
[31m-	  ((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range))[m
[31m-	return p;[m
[31m-      if (p) mcode_free(J, p, sz);  /* Free badly placed area. */[m
[31m-    }[m
[31m-    /* Next try probing pseudo-random addresses. */[m
[31m-    do {[m
[31m-      hint = (0x78fb ^ LJ_PRNG_BITS(J, 15)) << 16;  /* 64K aligned. */[m
[31m-    } while (!(hint + sz < range));[m
[31m-    hint = target + hint - (range>>1);[m
[31m-  }[m
[31m-  lj_trace_err(J, LJ_TRERR_MCODEAL);  /* Give up. OS probably ignores hints? */[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* All memory addresses are reachable by relative jumps. */[m
[31m-static void *mcode_alloc(jit_State *J, size_t sz)[m
[31m-{[m
[31m-#ifdef __OpenBSD__[m
[31m-  /* Allow better executable memory allocation for OpenBSD W^X mode. */[m
[31m-  void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN);[m
[31m-  if (p && mcode_setprot(p, sz, MCPROT_GEN)) {[m
[31m-    mcode_free(J, p, sz);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  return p;[m
[31m-#else[m
[31m-  return mcode_alloc_at(J, 0, sz, MCPROT_GEN);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- MCode area management ----------------------------------------------- */[m
[31m-[m
[31m-/* Linked list of MCode areas. */[m
[31m-typedef struct MCLink {[m
[31m-  MCode *next;		/* Next area. */[m
[31m-  size_t size;		/* Size of current area. */[m
[31m-} MCLink;[m
[31m-[m
[31m-/* Allocate a new MCode area. */[m
[31m-static void mcode_allocarea(jit_State *J)[m
[31m-{[m
[31m-  MCode *oldarea = J->mcarea;[m
[31m-  size_t sz = (size_t)J->param[JIT_P_sizemcode] << 10;[m
[31m-  sz = (sz + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);[m
[31m-  J->mcarea = (MCode *)mcode_alloc(J, sz);[m
[31m-  J->szmcarea = sz;[m
[31m-  J->mcprot = MCPROT_GEN;[m
[31m-  J->mctop = (MCode *)((char *)J->mcarea + J->szmcarea);[m
[31m-  J->mcbot = (MCode *)((char *)J->mcarea + sizeof(MCLink));[m
[31m-  ((MCLink *)J->mcarea)->next = oldarea;[m
[31m-  ((MCLink *)J->mcarea)->size = sz;[m
[31m-  J->szallmcarea += sz;[m
[31m-}[m
[31m-[m
[31m-/* Free all MCode areas. */[m
[31m-void lj_mcode_free(jit_State *J)[m
[31m-{[m
[31m-  MCode *mc = J->mcarea;[m
[31m-  J->mcarea = NULL;[m
[31m-  J->szallmcarea = 0;[m
[31m-  while (mc) {[m
[31m-    MCode *next = ((MCLink *)mc)->next;[m
[31m-    mcode_free(J, mc, ((MCLink *)mc)->size);[m
[31m-    mc = next;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- MCode transactions -------------------------------------------------- */[m
[31m-[m
[31m-/* Reserve the remainder of the current MCode area. */[m
[31m-MCode *lj_mcode_reserve(jit_State *J, MCode **lim)[m
[31m-{[m
[31m-  if (!J->mcarea)[m
[31m-    mcode_allocarea(J);[m
[31m-  else[m
[31m-    mcode_protect(J, MCPROT_GEN);[m
[31m-  *lim = J->mcbot;[m
[31m-  return J->mctop;[m
[31m-}[m
[31m-[m
[31m-/* Commit the top part of the current MCode area. */[m
[31m-void lj_mcode_commit(jit_State *J, MCode *top)[m
[31m-{[m
[31m-  J->mctop = top;[m
[31m-  mcode_protect(J, MCPROT_RUN);[m
[31m-}[m
[31m-[m
[31m-/* Abort the reservation. */[m
[31m-void lj_mcode_abort(jit_State *J)[m
[31m-{[m
[31m-  if (J->mcarea)[m
[31m-    mcode_protect(J, MCPROT_RUN);[m
[31m-}[m
[31m-[m
[31m-/* Set/reset protection to allow patching of MCode areas. */[m
[31m-MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish)[m
[31m-{[m
[31m-#ifdef LUAJIT_UNPROTECT_MCODE[m
[31m-  UNUSED(J); UNUSED(ptr); UNUSED(finish);[m
[31m-  return NULL;[m
[31m-#else[m
[31m-  if (finish) {[m
[31m-    if (J->mcarea == ptr)[m
[31m-      mcode_protect(J, MCPROT_RUN);[m
[31m-    else if (LJ_UNLIKELY(mcode_setprot(ptr, ((MCLink *)ptr)->size, MCPROT_RUN)))[m
[31m-      mcode_protfail(J);[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    MCode *mc = J->mcarea;[m
[31m-    /* Try current area first to use the protection cache. */[m
[31m-    if (ptr >= mc && ptr < (MCode *)((char *)mc + J->szmcarea)) {[m
[31m-      mcode_protect(J, MCPROT_GEN);[m
[31m-      return mc;[m
[31m-    }[m
[31m-    /* Otherwise search through the list of MCode areas. */[m
[31m-    for (;;) {[m
[31m-      mc = ((MCLink *)mc)->next;[m
[31m-      lua_assert(mc != NULL);[m
[31m-      if (ptr >= mc && ptr < (MCode *)((char *)mc + ((MCLink *)mc)->size)) {[m
[31m-	if (LJ_UNLIKELY(mcode_setprot(mc, ((MCLink *)mc)->size, MCPROT_GEN)))[m
[31m-	  mcode_protfail(J);[m
[31m-	return mc;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Limit of MCode reservation reached. */[m
[31m-void lj_mcode_limiterr(jit_State *J, size_t need)[m
[31m-{[m
[31m-  size_t sizemcode, maxmcode;[m
[31m-  lj_mcode_abort(J);[m
[31m-  sizemcode = (size_t)J->param[JIT_P_sizemcode] << 10;[m
[31m-  sizemcode = (sizemcode + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);[m
[31m-  maxmcode = (size_t)J->param[JIT_P_maxmcode] << 10;[m
[31m-  if ((size_t)need > sizemcode)[m
[31m-    lj_trace_err(J, LJ_TRERR_MCODEOV);  /* Too long for any area. */[m
[31m-  if (J->szallmcarea + sizemcode > maxmcode)[m
[31m-    lj_trace_err(J, LJ_TRERR_MCODEAL);[m
[31m-  mcode_allocarea(J);[m
[31m-  lj_trace_err(J, LJ_TRERR_MCODELM);  /* Retry with new area. */[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_mcode.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_mcode.h[m
[1mdeleted file mode 100644[m
[1mindex 503e001..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_mcode.h[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-/*[m
[31m-** Machine code management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_MCODE_H[m
[31m-#define _LJ_MCODE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT || LJ_HASFFI[m
[31m-LJ_FUNC void lj_mcode_sync(void *start, void *end);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-LJ_FUNC void lj_mcode_free(jit_State *J);[m
[31m-LJ_FUNC MCode *lj_mcode_reserve(jit_State *J, MCode **lim);[m
[31m-LJ_FUNC void lj_mcode_commit(jit_State *J, MCode *m);[m
[31m-LJ_FUNC void lj_mcode_abort(jit_State *J);[m
[31m-LJ_FUNC MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish);[m
[31m-LJ_FUNC_NORET void lj_mcode_limiterr(jit_State *J, size_t need);[m
[31m-[m
[31m-#define lj_mcode_commitbot(J, m)	(J->mcbot = (m))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_meta.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_meta.c[m
[1mdeleted file mode 100644[m
[1mindex c7993ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_meta.c[m
[1m+++ /dev/null[m
[36m@@ -1,477 +0,0 @@[m
[31m-/*[m
[31m-** Metamethod handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_meta_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lib.h"[m
[31m-[m
[31m-/* -- Metamethod handling ------------------------------------------------- */[m
[31m-[m
[31m-/* String interning of metamethod names for fast indexing. */[m
[31m-void lj_meta_init(lua_State *L)[m
[31m-{[m
[31m-#define MMNAME(name)	"__" #name[m
[31m-  const char *metanames = MMDEF(MMNAME);[m
[31m-#undef MMNAME[m
[31m-  global_State *g = G(L);[m
[31m-  const char *p, *q;[m
[31m-  uint32_t mm;[m
[31m-  for (mm = 0, p = metanames; *p; mm++, p = q) {[m
[31m-    GCstr *s;[m
[31m-    for (q = p+2; *q && *q != '_'; q++) ;[m
[31m-    s = lj_str_new(L, p, (size_t)(q-p));[m
[31m-    /* NOBARRIER: g->gcroot[] is a GC root. */[m
[31m-    setgcref(g->gcroot[GCROOT_MMNAME+mm], obj2gco(s));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Negative caching of a few fast metamethods. See the lj_meta_fast() macro. */[m
[31m-cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name)[m
[31m-{[m
[31m-  cTValue *mo = lj_tab_getstr(mt, name);[m
[31m-  lua_assert(mm <= MM_FAST);[m
[31m-  if (!mo || tvisnil(mo)) {  /* No metamethod? */[m
[31m-    mt->nomm |= (uint8_t)(1u<<mm);  /* Set negative cache flag. */[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  return mo;[m
[31m-}[m
[31m-[m
[31m-/* Lookup metamethod for object. */[m
[31m-cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm)[m
[31m-{[m
[31m-  GCtab *mt;[m
[31m-  if (tvistab(o))[m
[31m-    mt = tabref(tabV(o)->metatable);[m
[31m-  else if (tvisudata(o))[m
[31m-    mt = tabref(udataV(o)->metatable);[m
[31m-  else[m
[31m-    mt = tabref(basemt_obj(G(L), o));[m
[31m-  if (mt) {[m
[31m-    cTValue *mo = lj_tab_getstr(mt, mmname_str(G(L), mm));[m
[31m-    if (mo)[m
[31m-      return mo;[m
[31m-  }[m
[31m-  return niltv(L);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Tailcall from C function. */[m
[31m-int lj_meta_tailcall(lua_State *L, cTValue *tv)[m
[31m-{[m
[31m-  TValue *base = L->base;[m
[31m-  TValue *top = L->top;[m
[31m-  const BCIns *pc = frame_pc(base-1);  /* Preserve old PC from frame. */[m
[31m-  copyTV(L, base-1-LJ_FR2, tv);  /* Replace frame with new object. */[m
[31m-  if (LJ_FR2)[m
[31m-    (top++)->u64 = LJ_CONT_TAILCALL;[m
[31m-  else[m
[31m-    top->u32.lo = LJ_CONT_TAILCALL;[m
[31m-  setframe_pc(top++, pc);[m
[31m-  if (LJ_FR2) top++;[m
[31m-  setframe_gc(top, obj2gco(L), LJ_TTHREAD);  /* Dummy frame object. */[m
[31m-  setframe_ftsz(top, ((char *)(top+1) - (char *)base) + FRAME_CONT);[m
[31m-  L->base = L->top = top+1;[m
[31m-  /*[m
[31m-  ** before:   [old_mo|PC]    [... ...][m
[31m-  **                         ^base     ^top[m
[31m-  ** after:    [new_mo|itype] [... ...] [NULL|PC] [dummy|delta][m
[31m-  **                                                           ^base/top[m
[31m-  ** tailcall: [new_mo|PC]    [... ...][m
[31m-  **                         ^base     ^top[m
[31m-  */[m
[31m-  return 0;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Setup call to metamethod to be run by Assembler VM. */[m
[31m-static TValue *mmcall(lua_State *L, ASMFunction cont, cTValue *mo,[m
[31m-		    cTValue *a, cTValue *b)[m
[31m-{[m
[31m-  /*[m
[31m-  **           |-- framesize -> top       top+1       top+2 top+3[m
[31m-  ** before:   [func slots ...][m
[31m-  ** mm setup: [func slots ...] [cont|?]  [mo|tmtype] [a]   [b][m
[31m-  ** in asm:   [func slots ...] [cont|PC] [mo|delta]  [a]   [b][m
[31m-  **           ^-- func base                          ^-- mm base[m
[31m-  ** after mm: [func slots ...]           [result][m
[31m-  **                ^-- copy to base[PC_RA] --/     for lj_cont_ra[m
[31m-  **                          istruecond + branch   for lj_cont_cond*[m
[31m-  **                                       ignore   for lj_cont_nop[m
[31m-  ** next PC:  [func slots ...][m
[31m-  */[m
[31m-  TValue *top = L->top;[m
[31m-  if (curr_funcisL(L)) top = curr_topL(L);[m
[31m-  setcont(top++, cont);  /* Assembler VM stores PC in upper word or FR2. */[m
[31m-  if (LJ_FR2) setnilV(top++);[m
[31m-  copyTV(L, top++, mo);  /* Store metamethod and two arguments. */[m
[31m-  if (LJ_FR2) setnilV(top++);[m
[31m-  copyTV(L, top, a);[m
[31m-  copyTV(L, top+1, b);[m
[31m-  return top;  /* Return new base. */[m
[31m-}[m
[31m-[m
[31m-/* -- C helpers for some instructions, called from assembler VM ----------- */[m
[31m-[m
[31m-/* Helper for TGET*. __index chain and metamethod. */[m
[31m-cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k)[m
[31m-{[m
[31m-  int loop;[m
[31m-  for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {[m
[31m-    cTValue *mo;[m
[31m-    if (LJ_LIKELY(tvistab(o))) {[m
[31m-      GCtab *t = tabV(o);[m
[31m-      cTValue *tv = lj_tab_get(L, t, k);[m
[31m-      if (!tvisnil(tv) ||[m
[31m-	  !(mo = lj_meta_fast(L, tabref(t->metatable), MM_index)))[m
[31m-	return tv;[m
[31m-    } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_index))) {[m
[31m-      lj_err_optype(L, o, LJ_ERR_OPINDEX);[m
[31m-      return NULL;  /* unreachable */[m
[31m-    }[m
[31m-    if (tvisfunc(mo)) {[m
[31m-      L->top = mmcall(L, lj_cont_ra, mo, o, k);[m
[31m-      return NULL;  /* Trigger metamethod call. */[m
[31m-    }[m
[31m-    o = mo;[m
[31m-  }[m
[31m-  lj_err_msg(L, LJ_ERR_GETLOOP);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-/* Helper for TSET*. __newindex chain and metamethod. */[m
[31m-TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k)[m
[31m-{[m
[31m-  TValue tmp;[m
[31m-  int loop;[m
[31m-  for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {[m
[31m-    cTValue *mo;[m
[31m-    if (LJ_LIKELY(tvistab(o))) {[m
[31m-      GCtab *t = tabV(o);[m
[31m-      cTValue *tv = lj_tab_get(L, t, k);[m
[31m-      if (LJ_LIKELY(!tvisnil(tv))) {[m
[31m-	t->nomm = 0;  /* Invalidate negative metamethod cache. */[m
[31m-	lj_gc_anybarriert(L, t);[m
[31m-	return (TValue *)tv;[m
[31m-      } else if (!(mo = lj_meta_fast(L, tabref(t->metatable), MM_newindex))) {[m
[31m-	t->nomm = 0;  /* Invalidate negative metamethod cache. */[m
[31m-	lj_gc_anybarriert(L, t);[m
[31m-	if (tv != niltv(L))[m
[31m-	  return (TValue *)tv;[m
[31m-	if (tvisnil(k)) lj_err_msg(L, LJ_ERR_NILIDX);[m
[31m-	else if (tvisint(k)) { setnumV(&tmp, (lua_Number)intV(k)); k = &tmp; }[m
[31m-	else if (tvisnum(k) && tvisnan(k)) lj_err_msg(L, LJ_ERR_NANIDX);[m
[31m-	return lj_tab_newkey(L, t, k);[m
[31m-      }[m
[31m-    } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_newindex))) {[m
[31m-      lj_err_optype(L, o, LJ_ERR_OPINDEX);[m
[31m-      return NULL;  /* unreachable */[m
[31m-    }[m
[31m-    if (tvisfunc(mo)) {[m
[31m-      L->top = mmcall(L, lj_cont_nop, mo, o, k);[m
[31m-      /* L->top+2 = v filled in by caller. */[m
[31m-      return NULL;  /* Trigger metamethod call. */[m
[31m-    }[m
[31m-    copyTV(L, &tmp, mo);[m
[31m-    o = &tmp;[m
[31m-  }[m
[31m-  lj_err_msg(L, LJ_ERR_SETLOOP);[m
[31m-  return NULL;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-static cTValue *str2num(cTValue *o, TValue *n)[m
[31m-{[m
[31m-  if (tvisnum(o))[m
[31m-    return o;[m
[31m-  else if (tvisint(o))[m
[31m-    return (setnumV(n, (lua_Number)intV(o)), n);[m
[31m-  else if (tvisstr(o) && lj_strscan_num(strV(o), n))[m
[31m-    return n;[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Helper for arithmetic instructions. Coercion, metamethod. */[m
[31m-TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb, cTValue *rc,[m
[31m-		      BCReg op)[m
[31m-{[m
[31m-  MMS mm = bcmode_mm(op);[m
[31m-  TValue tempb, tempc;[m
[31m-  cTValue *b, *c;[m
[31m-  if ((b = str2num(rb, &tempb)) != NULL &&[m
[31m-      (c = str2num(rc, &tempc)) != NULL) {  /* Try coercion first. */[m
[31m-    setnumV(ra, lj_vm_foldarith(numV(b), numV(c), (int)mm-MM_add));[m
[31m-    return NULL;[m
[31m-  } else {[m
[31m-    cTValue *mo = lj_meta_lookup(L, rb, mm);[m
[31m-    if (tvisnil(mo)) {[m
[31m-      mo = lj_meta_lookup(L, rc, mm);[m
[31m-      if (tvisnil(mo)) {[m
[31m-	if (str2num(rb, &tempb) == NULL) rc = rb;[m
[31m-	lj_err_optype(L, rc, LJ_ERR_OPARITH);[m
[31m-	return NULL;  /* unreachable */[m
[31m-      }[m
[31m-    }[m
[31m-    return mmcall(L, lj_cont_ra, mo, rb, rc);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Helper for CAT. Coercion, iterative concat, __concat metamethod. */[m
[31m-TValue *lj_meta_cat(lua_State *L, TValue *top, int left)[m
[31m-{[m
[31m-  int fromc = 0;[m
[31m-  if (left < 0) { left = -left; fromc = 1; }[m
[31m-  do {[m
[31m-    if (!(tvisstr(top) || tvisnumber(top)) ||[m
[31m-	!(tvisstr(top-1) || tvisnumber(top-1))) {[m
[31m-      cTValue *mo = lj_meta_lookup(L, top-1, MM_concat);[m
[31m-      if (tvisnil(mo)) {[m
[31m-	mo = lj_meta_lookup(L, top, MM_concat);[m
[31m-	if (tvisnil(mo)) {[m
[31m-	  if (tvisstr(top-1) || tvisnumber(top-1)) top++;[m
[31m-	  lj_err_optype(L, top-1, LJ_ERR_OPCAT);[m
[31m-	  return NULL;  /* unreachable */[m
[31m-	}[m
[31m-      }[m
[31m-      /* One of the top two elements is not a string, call __cat metamethod:[m
[31m-      **[m
[31m-      ** before:    [...][CAT stack .........................][m
[31m-      **                                 top-1     top         top+1 top+2[m
[31m-      ** pick two:  [...][CAT stack ...] [o1]      [o2][m
[31m-      ** setup mm:  [...][CAT stack ...] [cont|?]  [mo|tmtype] [o1]  [o2][m
[31m-      ** in asm:    [...][CAT stack ...] [cont|PC] [mo|delta]  [o1]  [o2][m
[31m-      **            ^-- func base                              ^-- mm base[m
[31m-      ** after mm:  [...][CAT stack ...] <--push-- [result][m
[31m-      ** next step: [...][CAT stack .............][m
[31m-      */[m
[31m-      copyTV(L, top+2*LJ_FR2+2, top);  /* Carefully ordered stack copies! */[m
[31m-      copyTV(L, top+2*LJ_FR2+1, top-1);[m
[31m-      copyTV(L, top+LJ_FR2, mo);[m
[31m-      setcont(top-1, lj_cont_cat);[m
[31m-      if (LJ_FR2) { setnilV(top); setnilV(top+2); top += 2; }[m
[31m-      return top+1;  /* Trigger metamethod call. */[m
[31m-    } else {[m
[31m-      /* Pick as many strings as possible from the top and concatenate them:[m
[31m-      **[m
[31m-      ** before:    [...][CAT stack ...........................][m
[31m-      ** pick str:  [...][CAT stack ...] [...... strings ......][m
[31m-      ** concat:    [...][CAT stack ...] [result][m
[31m-      ** next step: [...][CAT stack ............][m
[31m-      */[m
[31m-      TValue *e, *o = top;[m
[31m-      uint64_t tlen = tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;[m
[31m-      SBuf *sb;[m
[31m-      do {[m
[31m-	o--; tlen += tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;[m
[31m-      } while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1)));[m
[31m-      if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV);[m
[31m-      sb = lj_buf_tmp_(L);[m
[31m-      lj_buf_more(sb, (MSize)tlen);[m
[31m-      for (e = top, top = o; o <= e; o++) {[m
[31m-	if (tvisstr(o)) {[m
[31m-	  GCstr *s = strV(o);[m
[31m-	  MSize len = s->len;[m
[31m-	  lj_buf_putmem(sb, strdata(s), len);[m
[31m-	} else if (tvisint(o)) {[m
[31m-	  lj_strfmt_putint(sb, intV(o));[m
[31m-	} else {[m
[31m-	  lj_strfmt_putfnum(sb, STRFMT_G14, numV(o));[m
[31m-	}[m
[31m-      }[m
[31m-      setstrV(L, top, lj_buf_str(L, sb));[m
[31m-    }[m
[31m-  } while (left >= 1);[m
[31m-  if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) {[m
[31m-    if (!fromc) L->top = curr_topL(L);[m
[31m-    lj_gc_step(L);[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Helper for LEN. __len metamethod. */[m
[31m-TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o)[m
[31m-{[m
[31m-  cTValue *mo = lj_meta_lookup(L, o, MM_len);[m
[31m-  if (tvisnil(mo)) {[m
[31m-    if (LJ_52 && tvistab(o))[m
[31m-      tabref(tabV(o)->metatable)->nomm |= (uint8_t)(1u<<MM_len);[m
[31m-    else[m
[31m-      lj_err_optype(L, o, LJ_ERR_OPLEN);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  return mmcall(L, lj_cont_ra, mo, o, LJ_52 ? o : niltv(L));[m
[31m-}[m
[31m-[m
[31m-/* Helper for equality comparisons. __eq metamethod. */[m
[31m-TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne)[m
[31m-{[m
[31m-  /* Field metatable must be at same offset for GCtab and GCudata! */[m
[31m-  cTValue *mo = lj_meta_fast(L, tabref(o1->gch.metatable), MM_eq);[m
[31m-  if (mo) {[m
[31m-    TValue *top;[m
[31m-    uint32_t it;[m
[31m-    if (tabref(o1->gch.metatable) != tabref(o2->gch.metatable)) {[m
[31m-      cTValue *mo2 = lj_meta_fast(L, tabref(o2->gch.metatable), MM_eq);[m
[31m-      if (mo2 == NULL || !lj_obj_equal(mo, mo2))[m
[31m-	return (TValue *)(intptr_t)ne;[m
[31m-    }[m
[31m-    top = curr_top(L);[m
[31m-    setcont(top++, ne ? lj_cont_condf : lj_cont_condt);[m
[31m-    if (LJ_FR2) setnilV(top++);[m
[31m-    copyTV(L, top++, mo);[m
[31m-    if (LJ_FR2) setnilV(top++);[m
[31m-    it = ~(uint32_t)o1->gch.gct;[m
[31m-    setgcV(L, top, o1, it);[m
[31m-    setgcV(L, top+1, o2, it);[m
[31m-    return top;  /* Trigger metamethod call. */[m
[31m-  }[m
[31m-  return (TValue *)(intptr_t)ne;[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins)[m
[31m-{[m
[31m-  ASMFunction cont = (bc_op(ins) & 1) ? lj_cont_condf : lj_cont_condt;[m
[31m-  int op = (int)bc_op(ins) & ~1;[m
[31m-  TValue tv;[m
[31m-  cTValue *mo, *o2, *o1 = &L->base[bc_a(ins)];[m
[31m-  cTValue *o1mm = o1;[m
[31m-  if (op == BC_ISEQV) {[m
[31m-    o2 = &L->base[bc_d(ins)];[m
[31m-    if (!tviscdata(o1mm)) o1mm = o2;[m
[31m-  } else if (op == BC_ISEQS) {[m
[31m-    setstrV(L, &tv, gco2str(proto_kgc(curr_proto(L), ~(ptrdiff_t)bc_d(ins))));[m
[31m-    o2 = &tv;[m
[31m-  } else if (op == BC_ISEQN) {[m
[31m-    o2 = &mref(curr_proto(L)->k, cTValue)[bc_d(ins)];[m
[31m-  } else {[m
[31m-    lua_assert(op == BC_ISEQP);[m
[31m-    setpriV(&tv, ~bc_d(ins));[m
[31m-    o2 = &tv;[m
[31m-  }[m
[31m-  mo = lj_meta_lookup(L, o1mm, MM_eq);[m
[31m-  if (LJ_LIKELY(!tvisnil(mo)))[m
[31m-    return mmcall(L, cont, mo, o1, o2);[m
[31m-  else[m
[31m-    return (TValue *)(intptr_t)(bc_op(ins) & 1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Helper for ordered comparisons. String compare, __lt/__le metamethods. */[m
[31m-TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op)[m
[31m-{[m
[31m-  if (LJ_HASFFI && (tviscdata(o1) || tviscdata(o2))) {[m
[31m-    ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;[m
[31m-    MMS mm = (op & 2) ? MM_le : MM_lt;[m
[31m-    cTValue *mo = lj_meta_lookup(L, tviscdata(o1) ? o1 : o2, mm);[m
[31m-    if (LJ_UNLIKELY(tvisnil(mo))) goto err;[m
[31m-    return mmcall(L, cont, mo, o1, o2);[m
[31m-  } else if (LJ_52 || itype(o1) == itype(o2)) {[m
[31m-    /* Never called with two numbers. */[m
[31m-    if (tvisstr(o1) && tvisstr(o2)) {[m
[31m-      int32_t res = lj_str_cmp(strV(o1), strV(o2));[m
[31m-      return (TValue *)(intptr_t)(((op&2) ? res <= 0 : res < 0) ^ (op&1));[m
[31m-    } else {[m
[31m-    trymt:[m
[31m-      while (1) {[m
[31m-	ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;[m
[31m-	MMS mm = (op & 2) ? MM_le : MM_lt;[m
[31m-	cTValue *mo = lj_meta_lookup(L, o1, mm);[m
[31m-#if LJ_52[m
[31m-	if (tvisnil(mo) && tvisnil((mo = lj_meta_lookup(L, o2, mm))))[m
[31m-#else[m
[31m-	cTValue *mo2 = lj_meta_lookup(L, o2, mm);[m
[31m-	if (tvisnil(mo) || !lj_obj_equal(mo, mo2))[m
[31m-#endif[m
[31m-	{[m
[31m-	  if (op & 2) {  /* MM_le not found: retry with MM_lt. */[m
[31m-	    cTValue *ot = o1; o1 = o2; o2 = ot;  /* Swap operands. */[m
[31m-	    op ^= 3;  /* Use LT and flip condition. */[m
[31m-	    continue;[m
[31m-	  }[m
[31m-	  goto err;[m
[31m-	}[m
[31m-	return mmcall(L, cont, mo, o1, o2);[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (tvisbool(o1) && tvisbool(o2)) {[m
[31m-    goto trymt;[m
[31m-  } else {[m
[31m-  err:[m
[31m-    lj_err_comp(L, o1, o2);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Helper for ISTYPE and ISNUM. Implicit coercion or error. */[m
[31m-void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp)[m
[31m-{[m
[31m-  L->top = curr_topL(L);[m
[31m-  ra++; tp--;[m
[31m-  lua_assert(LJ_DUALNUM || tp != ~LJ_TNUMX);  /* ISTYPE -> ISNUM broken. */[m
[31m-  if (LJ_DUALNUM && tp == ~LJ_TNUMX) lj_lib_checkint(L, ra);[m
[31m-  else if (tp == ~LJ_TNUMX+1) lj_lib_checknum(L, ra);[m
[31m-  else if (tp == ~LJ_TSTR) lj_lib_checkstr(L, ra);[m
[31m-  else lj_err_argtype(L, ra, lj_obj_itypename[tp]);[m
[31m-}[m
[31m-[m
[31m-/* Helper for calls. __call metamethod. */[m
[31m-void lj_meta_call(lua_State *L, TValue *func, TValue *top)[m
[31m-{[m
[31m-  cTValue *mo = lj_meta_lookup(L, func, MM_call);[m
[31m-  TValue *p;[m
[31m-  if (!tvisfunc(mo))[m
[31m-    lj_err_optype_call(L, func);[m
[31m-  for (p = top; p > func+2*LJ_FR2; p--) copyTV(L, p, p-1);[m
[31m-  if (LJ_FR2) copyTV(L, func+2, func);[m
[31m-  copyTV(L, func, mo);[m
[31m-}[m
[31m-[m
[31m-/* Helper for FORI. Coercion. */[m
[31m-void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o)[m
[31m-{[m
[31m-  if (!lj_strscan_numberobj(o)) lj_err_msg(L, LJ_ERR_FORINIT);[m
[31m-  if (!lj_strscan_numberobj(o+1)) lj_err_msg(L, LJ_ERR_FORLIM);[m
[31m-  if (!lj_strscan_numberobj(o+2)) lj_err_msg(L, LJ_ERR_FORSTEP);[m
[31m-  if (LJ_DUALNUM) {[m
[31m-    /* Ensure all slots are integers or all slots are numbers. */[m
[31m-    int32_t k[3];[m
[31m-    int nint = 0;[m
[31m-    ptrdiff_t i;[m
[31m-    for (i = 0; i <= 2; i++) {[m
[31m-      if (tvisint(o+i)) {[m
[31m-	k[i] = intV(o+i); nint++;[m
[31m-      } else {[m
[31m-	k[i] = lj_num2int(numV(o+i)); nint += ((lua_Number)k[i] == numV(o+i));[m
[31m-      }[m
[31m-    }[m
[31m-    if (nint == 3) {  /* Narrow to integers. */[m
[31m-      setintV(o, k[0]);[m
[31m-      setintV(o+1, k[1]);[m
[31m-      setintV(o+2, k[2]);[m
[31m-    } else if (nint != 0) {  /* Widen to numbers. */[m
[31m-      if (tvisint(o)) setnumV(o, (lua_Number)intV(o));[m
[31m-      if (tvisint(o+1)) setnumV(o+1, (lua_Number)intV(o+1));[m
[31m-      if (tvisint(o+2)) setnumV(o+2, (lua_Number)intV(o+2));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_meta.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_meta.h[m
[1mdeleted file mode 100644[m
[1mindex 52e85cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_meta.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-/*[m
[31m-** Metamethod handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_META_H[m
[31m-#define _LJ_META_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Metamethod handling */[m
[31m-LJ_FUNC void lj_meta_init(lua_State *L);[m
[31m-LJ_FUNC cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name);[m
[31m-LJ_FUNC cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC int lj_meta_tailcall(lua_State *L, cTValue *tv);[m
[31m-#endif[m
[31m-[m
[31m-#define lj_meta_fastg(g, mt, mm) \[m
[31m-  ((mt) == NULL ? NULL : ((mt)->nomm & (1u<<(mm))) ? NULL : \[m
[31m-   lj_meta_cache(mt, mm, mmname_str(g, mm)))[m
[31m-#define lj_meta_fast(L, mt, mm)	lj_meta_fastg(G(L), mt, mm)[m
[31m-[m
[31m-/* C helpers for some instructions, called from assembler VM. */[m
[31m-LJ_FUNCA cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k);[m
[31m-LJ_FUNCA TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k);[m
[31m-LJ_FUNCA TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb,[m
[31m-			       cTValue *rc, BCReg op);[m
[31m-LJ_FUNCA TValue *lj_meta_cat(lua_State *L, TValue *top, int left);[m
[31m-LJ_FUNCA TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o);[m
[31m-LJ_FUNCA TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne);[m
[31m-LJ_FUNCA TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins);[m
[31m-LJ_FUNCA TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op);[m
[31m-LJ_FUNCA void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp);[m
[31m-LJ_FUNCA void lj_meta_call(lua_State *L, TValue *func, TValue *top);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_obj.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_obj.c[m
[1mdeleted file mode 100644[m
[1mindex 1daea81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_obj.c[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-/*[m
[31m-** Miscellaneous object handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_obj_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Object type names. */[m
[31m-LJ_DATADEF const char *const lj_obj_typename[] = {  /* ORDER LUA_T */[m
[31m-  "no value", "nil", "boolean", "userdata", "number", "string",[m
[31m-  "table", "function", "userdata", "thread", "proto", "cdata"[m
[31m-};[m
[31m-[m
[31m-LJ_DATADEF const char *const lj_obj_itypename[] = {  /* ORDER LJ_T */[m
[31m-  "nil", "boolean", "boolean", "userdata", "string", "upval", "thread",[m
[31m-  "proto", "function", "trace", "cdata", "table", "userdata", "number"[m
[31m-};[m
[31m-[m
[31m-/* Compare two objects without calling metamethods. */[m
[31m-int LJ_FASTCALL lj_obj_equal(cTValue *o1, cTValue *o2)[m
[31m-{[m
[31m-  if (itype(o1) == itype(o2)) {[m
[31m-    if (tvispri(o1))[m
[31m-      return 1;[m
[31m-    if (!tvisnum(o1))[m
[31m-      return gcrefeq(o1->gcr, o2->gcr);[m
[31m-  } else if (!tvisnumber(o1) || !tvisnumber(o2)) {[m
[31m-    return 0;[m
[31m-  }[m
[31m-  return numberVnum(o1) == numberVnum(o2);[m
[31m-}[m
[31m-[m
[31m-/* Return pointer to object or its object data. */[m
[31m-const void * LJ_FASTCALL lj_obj_ptr(cTValue *o)[m
[31m-{[m
[31m-  if (tvisudata(o))[m
[31m-    return uddata(udataV(o));[m
[31m-  else if (tvislightud(o))[m
[31m-    return lightudV(o);[m
[31m-  else if (LJ_HASFFI && tviscdata(o))[m
[31m-    return cdataptr(cdataV(o));[m
[31m-  else if (tvisgcv(o))[m
[31m-    return gcV(o);[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_obj.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_obj.h[m
[1mdeleted file mode 100644[m
[1mindex fda2820..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_obj.h[m
[1m+++ /dev/null[m
[36m@@ -1,981 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT VM tags, values and objects.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_OBJ_H[m
[31m-#define _LJ_OBJ_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-/* -- Memory references (32 bit address space) ---------------------------- */[m
[31m-[m
[31m-/* Memory and GC object sizes. */[m
[31m-typedef uint32_t MSize;[m
[31m-#if LJ_GC64[m
[31m-typedef uint64_t GCSize;[m
[31m-#else[m
[31m-typedef uint32_t GCSize;[m
[31m-#endif[m
[31m-[m
[31m-/* Memory reference */[m
[31m-typedef struct MRef {[m
[31m-#if LJ_GC64[m
[31m-  uint64_t ptr64;	/* True 64 bit pointer. */[m
[31m-#else[m
[31m-  uint32_t ptr32;	/* Pseudo 32 bit pointer. */[m
[31m-#endif[m
[31m-} MRef;[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define mref(r, t)	((t *)(void *)(r).ptr64)[m
[31m-[m
[31m-#define setmref(r, p)	((r).ptr64 = (uint64_t)(void *)(p))[m
[31m-#define setmrefr(r, v)	((r).ptr64 = (v).ptr64)[m
[31m-#else[m
[31m-#define mref(r, t)	((t *)(void *)(uintptr_t)(r).ptr32)[m
[31m-[m
[31m-#define setmref(r, p)	((r).ptr32 = (uint32_t)(uintptr_t)(void *)(p))[m
[31m-#define setmrefr(r, v)	((r).ptr32 = (v).ptr32)[m
[31m-#endif[m
[31m-[m
[31m-/* -- GC object references (32 bit address space) ------------------------- */[m
[31m-[m
[31m-/* GCobj reference */[m
[31m-typedef struct GCRef {[m
[31m-#if LJ_GC64[m
[31m-  uint64_t gcptr64;	/* True 64 bit pointer. */[m
[31m-#else[m
[31m-  uint32_t gcptr32;	/* Pseudo 32 bit pointer. */[m
[31m-#endif[m
[31m-} GCRef;[m
[31m-[m
[31m-/* Common GC header for all collectable objects. */[m
[31m-#define GCHeader	GCRef nextgc; uint8_t marked; uint8_t gct[m
[31m-/* This occupies 6 bytes, so use the next 2 bytes for non-32 bit fields. */[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define gcref(r)	((GCobj *)(r).gcptr64)[m
[31m-#define gcrefp(r, t)	((t *)(void *)(r).gcptr64)[m
[31m-#define gcrefu(r)	((r).gcptr64)[m
[31m-#define gcrefeq(r1, r2)	((r1).gcptr64 == (r2).gcptr64)[m
[31m-[m
[31m-#define setgcref(r, gc)	((r).gcptr64 = (uint64_t)&(gc)->gch)[m
[31m-#define setgcreft(r, gc, it) \[m
[31m-  (r).gcptr64 = (uint64_t)&(gc)->gch | (((uint64_t)(it)) << 47)[m
[31m-#define setgcrefp(r, p)	((r).gcptr64 = (uint64_t)(p))[m
[31m-#define setgcrefnull(r)	((r).gcptr64 = 0)[m
[31m-#define setgcrefr(r, v)	((r).gcptr64 = (v).gcptr64)[m
[31m-#else[m
[31m-#define gcref(r)	((GCobj *)(uintptr_t)(r).gcptr32)[m
[31m-#define gcrefp(r, t)	((t *)(void *)(uintptr_t)(r).gcptr32)[m
[31m-#define gcrefu(r)	((r).gcptr32)[m
[31m-#define gcrefeq(r1, r2)	((r1).gcptr32 == (r2).gcptr32)[m
[31m-[m
[31m-#define setgcref(r, gc)	((r).gcptr32 = (uint32_t)(uintptr_t)&(gc)->gch)[m
[31m-#define setgcrefp(r, p)	((r).gcptr32 = (uint32_t)(uintptr_t)(p))[m
[31m-#define setgcrefnull(r)	((r).gcptr32 = 0)[m
[31m-#define setgcrefr(r, v)	((r).gcptr32 = (v).gcptr32)[m
[31m-#endif[m
[31m-[m
[31m-#define gcnext(gc)	(gcref((gc)->gch.nextgc))[m
[31m-[m
[31m-/* IMPORTANT NOTE:[m
[31m-**[m
[31m-** All uses of the setgcref* macros MUST be accompanied with a write barrier.[m
[31m-**[m
[31m-** This is to ensure the integrity of the incremental GC. The invariant[m
[31m-** to preserve is that a black object never points to a white object.[m
[31m-** I.e. never store a white object into a field of a black object.[m
[31m-**[m
[31m-** It's ok to LEAVE OUT the write barrier ONLY in the following cases:[m
[31m-** - The source is not a GC object (NULL).[m
[31m-** - The target is a GC root. I.e. everything in global_State.[m
[31m-** - The target is a lua_State field (threads are never black).[m
[31m-** - The target is a stack slot, see setgcV et al.[m
[31m-** - The target is an open upvalue, i.e. pointing to a stack slot.[m
[31m-** - The target is a newly created object (i.e. marked white). But make[m
[31m-**   sure nothing invokes the GC inbetween.[m
[31m-** - The target and the source are the same object (self-reference).[m
[31m-** - The target already contains the object (e.g. moving elements around).[m
[31m-**[m
[31m-** The most common case is a store to a stack slot. All other cases where[m
[31m-** a barrier has been omitted are annotated with a NOBARRIER comment.[m
[31m-**[m
[31m-** The same logic applies for stores to table slots (array part or hash[m
[31m-** part). ALL uses of lj_tab_set* require a barrier for the stored value[m
[31m-** *and* the stored key, based on the above rules. In practice this means[m
[31m-** a barrier is needed if *either* of the key or value are a GC object.[m
[31m-**[m
[31m-** It's ok to LEAVE OUT the write barrier in the following special cases:[m
[31m-** - The stored value is nil. The key doesn't matter because it's either[m
[31m-**   not resurrected or lj_tab_newkey() will take care of the key barrier.[m
[31m-** - The key doesn't matter if the *previously* stored value is guaranteed[m
[31m-**   to be non-nil (because the key is kept alive in the table).[m
[31m-** - The key doesn't matter if it's guaranteed not to be part of the table,[m
[31m-**   since lj_tab_newkey() takes care of the key barrier. This applies[m
[31m-**   trivially to new tables, but watch out for resurrected keys. Storing[m
[31m-**   a nil value leaves the key in the table![m
[31m-**[m
[31m-** In case of doubt use lj_gc_anybarriert() as it's rather cheap. It's used[m
[31m-** by the interpreter for all table stores.[m
[31m-**[m
[31m-** Note: In contrast to Lua's GC, LuaJIT's GC does *not* specially mark[m
[31m-** dead keys in tables. The reference is left in, but it's guaranteed to[m
[31m-** be never dereferenced as long as the value is nil. It's ok if the key is[m
[31m-** freed or if any object subsequently gets the same address.[m
[31m-**[m
[31m-** Not destroying dead keys helps to keep key hash slots stable. This avoids[m
[31m-** specialization back-off for HREFK when a value flips between nil and[m
[31m-** non-nil and the GC gets in the way. It also allows safely hoisting[m
[31m-** HREF/HREFK across GC steps. Dead keys are only removed if a table is[m
[31m-** resized (i.e. by NEWREF) and xREF must not be CSEd across a resize.[m
[31m-**[m
[31m-** The trade-off is that a write barrier for tables must take the key into[m
[31m-** account, too. Implicitly resurrecting the key by storing a non-nil value[m
[31m-** may invalidate the incremental GC invariant.[m
[31m-*/[m
[31m-[m
[31m-/* -- Common type definitions --------------------------------------------- */[m
[31m-[m
[31m-/* Types for handling bytecodes. Need this here, details in lj_bc.h. */[m
[31m-typedef uint32_t BCIns;  /* Bytecode instruction. */[m
[31m-typedef uint32_t BCPos;  /* Bytecode position. */[m
[31m-typedef uint32_t BCReg;  /* Bytecode register. */[m
[31m-typedef int32_t BCLine;  /* Bytecode line number. */[m
[31m-[m
[31m-/* Internal assembler functions. Never call these directly from C. */[m
[31m-typedef void (*ASMFunction)(void);[m
[31m-[m
[31m-/* Resizable string buffer. Need this here, details in lj_buf.h. */[m
[31m-typedef struct SBuf {[m
[31m-  MRef p;		/* String buffer pointer. */[m
[31m-  MRef e;		/* String buffer end pointer. */[m
[31m-  MRef b;		/* String buffer base. */[m
[31m-  MRef L;		/* lua_State, used for buffer resizing. */[m
[31m-} SBuf;[m
[31m-[m
[31m-/* -- Tags and values ----------------------------------------------------- */[m
[31m-[m
[31m-/* Frame link. */[m
[31m-typedef union {[m
[31m-  int32_t ftsz;		/* Frame type and size of previous frame. */[m
[31m-  MRef pcr;		/* Or PC for Lua frames. */[m
[31m-} FrameLink;[m
[31m-[m
[31m-/* Tagged value. */[m
[31m-typedef LJ_ALIGN(8) union TValue {[m
[31m-  uint64_t u64;		/* 64 bit pattern overlaps number. */[m
[31m-  lua_Number n;		/* Number object overlaps split tag/value object. */[m
[31m-#if LJ_GC64[m
[31m-  GCRef gcr;		/* GCobj reference with tag. */[m
[31m-  int64_t it64;[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      int32_t i;	/* Integer value. */[m
[31m-    , uint32_t it;	/* Internal object tag. Must overlap MSW of number. */[m
[31m-    )[m
[31m-  };[m
[31m-#else[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      union {[m
[31m-	GCRef gcr;	/* GCobj reference (if any). */[m
[31m-	int32_t i;	/* Integer value. */[m
[31m-      };[m
[31m-    , uint32_t it;	/* Internal object tag. Must overlap MSW of number. */[m
[31m-    )[m
[31m-  };[m
[31m-#endif[m
[31m-#if LJ_FR2[m
[31m-  int64_t ftsz;		/* Frame type and size of previous frame, or PC. */[m
[31m-#else[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      GCRef func;	/* Function for next frame (or dummy L). */[m
[31m-    , FrameLink tp;	/* Link to previous frame. */[m
[31m-    )[m
[31m-  } fr;[m
[31m-#endif[m
[31m-  struct {[m
[31m-    LJ_ENDIAN_LOHI([m
[31m-      uint32_t lo;	/* Lower 32 bits of number. */[m
[31m-    , uint32_t hi;	/* Upper 32 bits of number. */[m
[31m-    )[m
[31m-  } u32;[m
[31m-} TValue;[m
[31m-[m
[31m-typedef const TValue cTValue;[m
[31m-[m
[31m-#define tvref(r)	(mref(r, TValue))[m
[31m-[m
[31m-/* More external and GCobj tags for internal objects. */[m
[31m-#define LAST_TT		LUA_TTHREAD[m
[31m-#define LUA_TPROTO	(LAST_TT+1)[m
[31m-#define LUA_TCDATA	(LAST_TT+2)[m
[31m-[m
[31m-/* Internal object tags.[m
[31m-**[m
[31m-** Format for 32 bit GC references (!LJ_GC64):[m
[31m-**[m
[31m-** Internal tags overlap the MSW of a number object (must be a double).[m
[31m-** Interpreted as a double these are special NaNs. The FPU only generates[m
[31m-** one type of NaN (0xfff8_0000_0000_0000). So MSWs > 0xfff80000 are available[m
[31m-** for use as internal tags. Small negative numbers are used to shorten the[m
[31m-** encoding of type comparisons (reg/mem against sign-ext. 8 bit immediate).[m
[31m-**[m
[31m-**                  ---MSW---.---LSW---[m
[31m-** primitive types |  itype  |         |[m
[31m-** lightuserdata   |  itype  |  void * |  (32 bit platforms)[m
[31m-** lightuserdata   |ffff|    void *    |  (64 bit platforms, 47 bit pointers)[m
[31m-** GC objects      |  itype  |  GCRef  |[m
[31m-** int (LJ_DUALNUM)|  itype  |   int   |[m
[31m-** number           -------double------[m
[31m-**[m
[31m-** Format for 64 bit GC references (LJ_GC64):[m
[31m-**[m
[31m-** The upper 13 bits must be 1 (0xfff8...) for a special NaN. The next[m
[31m-** 4 bits hold the internal tag. The lowest 47 bits either hold a pointer,[m
[31m-** a zero-extended 32 bit integer or all bits set to 1 for primitive types.[m
[31m-**[m
[31m-**                     ------MSW------.------LSW------[m
[31m-** primitive types    |1..1|itype|1..................1|[m
[31m-** GC objects/lightud |1..1|itype|-------GCRef--------|[m
[31m-** int (LJ_DUALNUM)   |1..1|itype|0..0|-----int-------|[m
[31m-** number              ------------double-------------[m
[31m-**[m
[31m-** ORDER LJ_T[m
[31m-** Primitive types nil/false/true must be first, lightuserdata next.[m
[31m-** GC objects are at the end, table/userdata must be lowest.[m
[31m-** Also check lj_ir.h for similar ordering constraints.[m
[31m-*/[m
[31m-#define LJ_TNIL			(~0u)[m
[31m-#define LJ_TFALSE		(~1u)[m
[31m-#define LJ_TTRUE		(~2u)[m
[31m-#define LJ_TLIGHTUD		(~3u)[m
[31m-#define LJ_TSTR			(~4u)[m
[31m-#define LJ_TUPVAL		(~5u)[m
[31m-#define LJ_TTHREAD		(~6u)[m
[31m-#define LJ_TPROTO		(~7u)[m
[31m-#define LJ_TFUNC		(~8u)[m
[31m-#define LJ_TTRACE		(~9u)[m
[31m-#define LJ_TCDATA		(~10u)[m
[31m-#define LJ_TTAB			(~11u)[m
[31m-#define LJ_TUDATA		(~12u)[m
[31m-/* This is just the canonical number type used in some places. */[m
[31m-#define LJ_TNUMX		(~13u)[m
[31m-[m
[31m-/* Integers have itype == LJ_TISNUM doubles have itype < LJ_TISNUM */[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define LJ_TISNUM		0xfffeffffu[m
[31m-#else[m
[31m-#define LJ_TISNUM		LJ_TNUMX[m
[31m-#endif[m
[31m-#define LJ_TISTRUECOND		LJ_TFALSE[m
[31m-#define LJ_TISPRI		LJ_TTRUE[m
[31m-#define LJ_TISGCV		(LJ_TSTR+1)[m
[31m-#define LJ_TISTABUD		LJ_TTAB[m
[31m-[m
[31m-#if LJ_GC64[m
[31m-#define LJ_GCVMASK		(((uint64_t)1 << 47) - 1)[m
[31m-#endif[m
[31m-[m
[31m-/* -- String object ------------------------------------------------------- */[m
[31m-[m
[31m-/* String object header. String payload follows. */[m
[31m-typedef struct GCstr {[m
[31m-  GCHeader;[m
[31m-  uint8_t reserved;	/* Used by lexer for fast lookup of reserved words. */[m
[31m-  uint8_t unused;[m
[31m-  MSize hash;		/* Hash of string. */[m
[31m-  MSize len;		/* Size of string. */[m
[31m-} GCstr;[m
[31m-[m
[31m-#define strref(r)	(&gcref((r))->str)[m
[31m-#define strdata(s)	((const char *)((s)+1))[m
[31m-#define strdatawr(s)	((char *)((s)+1))[m
[31m-#define strVdata(o)	strdata(strV(o))[m
[31m-#define sizestring(s)	(sizeof(struct GCstr)+(s)->len+1)[m
[31m-[m
[31m-/* -- Userdata object ----------------------------------------------------- */[m
[31m-[m
[31m-/* Userdata object. Payload follows. */[m
[31m-typedef struct GCudata {[m
[31m-  GCHeader;[m
[31m-  uint8_t udtype;	/* Userdata type. */[m
[31m-  uint8_t unused2;[m
[31m-  GCRef env;		/* Should be at same offset in GCfunc. */[m
[31m-  MSize len;		/* Size of payload. */[m
[31m-  GCRef metatable;	/* Must be at same offset in GCtab. */[m
[31m-  uint32_t align1;	/* To force 8 byte alignment of the payload. */[m
[31m-} GCudata;[m
[31m-[m
[31m-/* Userdata types. */[m
[31m-enum {[m
[31m-  UDTYPE_USERDATA,	/* Regular userdata. */[m
[31m-  UDTYPE_IO_FILE,	/* I/O library FILE. */[m
[31m-  UDTYPE_FFI_CLIB,	/* FFI C library namespace. */[m
[31m-  UDTYPE__MAX[m
[31m-};[m
[31m-[m
[31m-#define uddata(u)	((void *)((u)+1))[m
[31m-#define sizeudata(u)	(sizeof(struct GCudata)+(u)->len)[m
[31m-[m
[31m-/* -- C data object ------------------------------------------------------- */[m
[31m-[m
[31m-/* C data object. Payload follows. */[m
[31m-typedef struct GCcdata {[m
[31m-  GCHeader;[m
[31m-  uint16_t ctypeid;	/* C type ID. */[m
[31m-} GCcdata;[m
[31m-[m
[31m-/* Prepended to variable-sized or realigned C data objects. */[m
[31m-typedef struct GCcdataVar {[m
[31m-  uint16_t offset;	/* Offset to allocated memory (relative to GCcdata). */[m
[31m-  uint16_t extra;	/* Extra space allocated (incl. GCcdata + GCcdatav). */[m
[31m-  MSize len;		/* Size of payload. */[m
[31m-} GCcdataVar;[m
[31m-[m
[31m-#define cdataptr(cd)	((void *)((cd)+1))[m
[31m-#define cdataisv(cd)	((cd)->marked & 0x80)[m
[31m-#define cdatav(cd)	((GCcdataVar *)((char *)(cd) - sizeof(GCcdataVar)))[m
[31m-#define cdatavlen(cd)	check_exp(cdataisv(cd), cdatav(cd)->len)[m
[31m-#define sizecdatav(cd)	(cdatavlen(cd) + cdatav(cd)->extra)[m
[31m-#define memcdatav(cd)	((void *)((char *)(cd) - cdatav(cd)->offset))[m
[31m-[m
[31m-/* -- Prototype object ---------------------------------------------------- */[m
[31m-[m
[31m-#define SCALE_NUM_GCO	((int32_t)sizeof(lua_Number)/sizeof(GCRef))[m
[31m-#define round_nkgc(n)	(((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1))[m
[31m-[m
[31m-typedef struct GCproto {[m
[31m-  GCHeader;[m
[31m-  uint8_t numparams;	/* Number of parameters. */[m
[31m-  uint8_t framesize;	/* Fixed frame size. */[m
[31m-  MSize sizebc;		/* Number of bytecode instructions. */[m
[31m-#if LJ_GC64[m
[31m-  uint32_t unused_gc64;[m
[31m-#endif[m
[31m-  GCRef gclist;[m
[31m-  MRef k;		/* Split constant array (points to the middle). */[m
[31m-  MRef uv;		/* Upvalue list. local slot|0x8000 or parent uv idx. */[m
[31m-  MSize sizekgc;	/* Number of collectable constants. */[m
[31m-  MSize sizekn;		/* Number of lua_Number constants. */[m
[31m-  MSize sizept;		/* Total size including colocated arrays. */[m
[31m-  uint8_t sizeuv;	/* Number of upvalues. */[m
[31m-  uint8_t flags;	/* Miscellaneous flags (see below). */[m
[31m-  uint16_t trace;	/* Anchor for chain of root traces. */[m
[31m-  /* ------ The following fields are for debugging/tracebacks only ------ */[m
[31m-  GCRef chunkname;	/* Name of the chunk this function was defined in. */[m
[31m-  BCLine firstline;	/* First line of the function definition. */[m
[31m-  BCLine numline;	/* Number of lines for the function definition. */[m
[31m-  MRef lineinfo;	/* Compressed map from bytecode ins. to source line. */[m
[31m-  MRef uvinfo;		/* Upvalue names. */[m
[31m-  MRef varinfo;		/* Names and compressed extents of local variables. */[m
[31m-} GCproto;[m
[31m-[m
[31m-/* Flags for prototype. */[m
[31m-#define PROTO_CHILD		0x01	/* Has child prototypes. */[m
[31m-#define PROTO_VARARG		0x02	/* Vararg function. */[m
[31m-#define PROTO_FFI		0x04	/* Uses BC_KCDATA for FFI datatypes. */[m
[31m-#define PROTO_NOJIT		0x08	/* JIT disabled for this function. */[m
[31m-#define PROTO_ILOOP		0x10	/* Patched bytecode with ILOOP etc. */[m
[31m-/* Only used during parsing. */[m
[31m-#define PROTO_HAS_RETURN	0x20	/* Already emitted a return. */[m
[31m-#define PROTO_FIXUP_RETURN	0x40	/* Need to fixup emitted returns. */[m
[31m-/* Top bits used for counting created closures. */[m
[31m-#define PROTO_CLCOUNT		0x20	/* Base of saturating 3 bit counter. */[m
[31m-#define PROTO_CLC_BITS		3[m
[31m-#define PROTO_CLC_POLY		(3*PROTO_CLCOUNT)  /* Polymorphic threshold. */[m
[31m-[m
[31m-#define PROTO_UV_LOCAL		0x8000	/* Upvalue for local slot. */[m
[31m-#define PROTO_UV_IMMUTABLE	0x4000	/* Immutable upvalue. */[m
[31m-[m
[31m-#define proto_kgc(pt, idx) \[m
[31m-  check_exp((uintptr_t)(intptr_t)(idx) >= (uintptr_t)-(intptr_t)(pt)->sizekgc, \[m
[31m-	    gcref(mref((pt)->k, GCRef)[(idx)]))[m
[31m-#define proto_knumtv(pt, idx) \[m
[31m-  check_exp((uintptr_t)(idx) < (pt)->sizekn, &mref((pt)->k, TValue)[(idx)])[m
[31m-#define proto_bc(pt)		((BCIns *)((char *)(pt) + sizeof(GCproto)))[m
[31m-#define proto_bcpos(pt, pc)	((BCPos)((pc) - proto_bc(pt)))[m
[31m-#define proto_uv(pt)		(mref((pt)->uv, uint16_t))[m
[31m-[m
[31m-#define proto_chunkname(pt)	(strref((pt)->chunkname))[m
[31m-#define proto_chunknamestr(pt)	(strdata(proto_chunkname((pt))))[m
[31m-#define proto_lineinfo(pt)	(mref((pt)->lineinfo, const void))[m
[31m-#define proto_uvinfo(pt)	(mref((pt)->uvinfo, const uint8_t))[m
[31m-#define proto_varinfo(pt)	(mref((pt)->varinfo, const uint8_t))[m
[31m-[m
[31m-/* -- Upvalue object ------------------------------------------------------ */[m
[31m-[m
[31m-typedef struct GCupval {[m
[31m-  GCHeader;[m
[31m-  uint8_t closed;	/* Set if closed (i.e. uv->v == &uv->u.value). */[m
[31m-  uint8_t immutable;	/* Immutable value. */[m
[31m-  union {[m
[31m-    TValue tv;		/* If closed: the value itself. */[m
[31m-    struct {		/* If open: double linked list, anchored at thread. */[m
[31m-      GCRef prev;[m
[31m-      GCRef next;[m
[31m-    };[m
[31m-  };[m
[31m-  MRef v;		/* Points to stack slot (open) or above (closed). */[m
[31m-  uint32_t dhash;	/* Disambiguation hash: dh1 != dh2 => cannot alias. */[m
[31m-} GCupval;[m
[31m-[m
[31m-#define uvprev(uv_)	(&gcref((uv_)->prev)->uv)[m
[31m-#define uvnext(uv_)	(&gcref((uv_)->next)->uv)[m
[31m-#define uvval(uv_)	(mref((uv_)->v, TValue))[m
[31m-[m
[31m-/* -- Function object (closures) ------------------------------------------ */[m
[31m-[m
[31m-/* Common header for functions. env should be at same offset in GCudata. */[m
[31m-#define GCfuncHeader \[m
[31m-  GCHeader; uint8_t ffid; uint8_t nupvalues; \[m
[31m-  GCRef env; GCRef gclist; MRef pc[m
[31m-[m
[31m-typedef struct GCfuncC {[m
[31m-  GCfuncHeader;[m
[31m-  lua_CFunction f;	/* C function to be called. */[m
[31m-  TValue upvalue[1];	/* Array of upvalues (TValue). */[m
[31m-} GCfuncC;[m
[31m-[m
[31m-typedef struct GCfuncL {[m
[31m-  GCfuncHeader;[m
[31m-  GCRef uvptr[1];	/* Array of _pointers_ to upvalue objects (GCupval). */[m
[31m-} GCfuncL;[m
[31m-[m
[31m-typedef union GCfunc {[m
[31m-  GCfuncC c;[m
[31m-  GCfuncL l;[m
[31m-} GCfunc;[m
[31m-[m
[31m-#define FF_LUA		0[m
[31m-#define FF_C		1[m
[31m-#define isluafunc(fn)	((fn)->c.ffid == FF_LUA)[m
[31m-#define iscfunc(fn)	((fn)->c.ffid == FF_C)[m
[31m-#define isffunc(fn)	((fn)->c.ffid > FF_C)[m
[31m-#define funcproto(fn) \[m
[31m-  check_exp(isluafunc(fn), (GCproto *)(mref((fn)->l.pc, char)-sizeof(GCproto)))[m
[31m-#define sizeCfunc(n)	(sizeof(GCfuncC)-sizeof(TValue)+sizeof(TValue)*(n))[m
[31m-#define sizeLfunc(n)	(sizeof(GCfuncL)-sizeof(GCRef)+sizeof(GCRef)*(n))[m
[31m-[m
[31m-/* -- Table object -------------------------------------------------------- */[m
[31m-[m
[31m-/* Hash node. */[m
[31m-typedef struct Node {[m
[31m-  TValue val;		/* Value object. Must be first field. */[m
[31m-  TValue key;		/* Key object. */[m
[31m-  MRef next;		/* Hash chain. */[m
[31m-#if !LJ_GC64[m
[31m-  MRef freetop;		/* Top of free elements (stored in t->node[0]). */[m
[31m-#endif[m
[31m-} Node;[m
[31m-[m
[31m-LJ_STATIC_ASSERT(offsetof(Node, val) == 0);[m
[31m-[m
[31m-typedef struct GCtab {[m
[31m-  GCHeader;[m
[31m-  uint8_t nomm;		/* Negative cache for fast metamethods. */[m
[31m-  int8_t colo;		/* Array colocation. */[m
[31m-  MRef array;		/* Array part. */[m
[31m-  GCRef gclist;[m
[31m-  GCRef metatable;	/* Must be at same offset in GCudata. */[m
[31m-  MRef node;		/* Hash part. */[m
[31m-  uint32_t asize;	/* Size of array part (keys [0, asize-1]). */[m
[31m-  uint32_t hmask;	/* Hash part mask (size of hash part - 1). */[m
[31m-#if LJ_GC64[m
[31m-  MRef freetop;		/* Top of free elements. */[m
[31m-#endif[m
[31m-} GCtab;[m
[31m-[m
[31m-#define sizetabcolo(n)	((n)*sizeof(TValue) + sizeof(GCtab))[m
[31m-#define tabref(r)	(&gcref((r))->tab)[m
[31m-#define noderef(r)	(mref((r), Node))[m
[31m-#define nextnode(n)	(mref((n)->next, Node))[m
[31m-#if LJ_GC64[m
[31m-#define getfreetop(t, n)	(noderef((t)->freetop))[m
[31m-#define setfreetop(t, n, v)	(setmref((t)->freetop, (v)))[m
[31m-#else[m
[31m-#define getfreetop(t, n)	(noderef((n)->freetop))[m
[31m-#define setfreetop(t, n, v)	(setmref((n)->freetop, (v)))[m
[31m-#endif[m
[31m-[m
[31m-/* -- State objects ------------------------------------------------------- */[m
[31m-[m
[31m-/* VM states. */[m
[31m-enum {[m
[31m-  LJ_VMST_INTERP,	/* Interpreter. */[m
[31m-  LJ_VMST_C,		/* C function. */[m
[31m-  LJ_VMST_GC,		/* Garbage collector. */[m
[31m-  LJ_VMST_EXIT,		/* Trace exit handler. */[m
[31m-  LJ_VMST_RECORD,	/* Trace recorder. */[m
[31m-  LJ_VMST_OPT,		/* Optimizer. */[m
[31m-  LJ_VMST_ASM,		/* Assembler. */[m
[31m-  LJ_VMST__MAX[m
[31m-};[m
[31m-[m
[31m-#define setvmstate(g, st)	((g)->vmstate = ~LJ_VMST_##st)[m
[31m-[m
[31m-/* Metamethods. ORDER MM */[m
[31m-#ifdef LJ_HASFFI[m
[31m-#define MMDEF_FFI(_) _(new)[m
[31m-#else[m
[31m-#define MMDEF_FFI(_)[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_52 || LJ_HASFFI[m
[31m-#define MMDEF_PAIRS(_) _(pairs) _(ipairs)[m
[31m-#else[m
[31m-#define MMDEF_PAIRS(_)[m
[31m-#define MM_pairs	255[m
[31m-#define MM_ipairs	255[m
[31m-#endif[m
[31m-[m
[31m-#define MMDEF(_) \[m
[31m-  _(index) _(newindex) _(gc) _(mode) _(eq) _(len) \[m
[31m-  /* Only the above (fast) metamethods are negative cached (max. 8). */ \[m
[31m-  _(lt) _(le) _(concat) _(call) \[m
[31m-  /* The following must be in ORDER ARITH. */ \[m
[31m-  _(add) _(sub) _(mul) _(div) _(mod) _(pow) _(unm) \[m
[31m-  /* The following are used in the standard libraries. */ \[m
[31m-  _(metatable) _(tostring) MMDEF_FFI(_) MMDEF_PAIRS(_)[m
[31m-[m
[31m-typedef enum {[m
[31m-#define MMENUM(name)	MM_##name,[m
[31m-MMDEF(MMENUM)[m
[31m-#undef MMENUM[m
[31m-  MM__MAX,[m
[31m-  MM____ = MM__MAX,[m
[31m-  MM_FAST = MM_len[m
[31m-} MMS;[m
[31m-[m
[31m-/* GC root IDs. */[m
[31m-typedef enum {[m
[31m-  GCROOT_MMNAME,	/* Metamethod names. */[m
[31m-  GCROOT_MMNAME_LAST = GCROOT_MMNAME + MM__MAX-1,[m
[31m-  GCROOT_BASEMT,	/* Metatables for base types. */[m
[31m-  GCROOT_BASEMT_NUM = GCROOT_BASEMT + ~LJ_TNUMX,[m
[31m-  GCROOT_IO_INPUT,	/* Userdata for default I/O input file. */[m
[31m-  GCROOT_IO_OUTPUT,	/* Userdata for default I/O output file. */[m
[31m-  GCROOT_MAX[m
[31m-} GCRootID;[m
[31m-[m
[31m-#define basemt_it(g, it)	((g)->gcroot[GCROOT_BASEMT+~(it)])[m
[31m-#define basemt_obj(g, o)	((g)->gcroot[GCROOT_BASEMT+itypemap(o)])[m
[31m-#define mmname_str(g, mm)	(strref((g)->gcroot[GCROOT_MMNAME+(mm)]))[m
[31m-[m
[31m-typedef struct GCState {[m
[31m-  GCSize total;		/* Memory currently allocated. */[m
[31m-  GCSize threshold;	/* Memory threshold. */[m
[31m-  uint8_t currentwhite;	/* Current white color. */[m
[31m-  uint8_t state;	/* GC state. */[m
[31m-  uint8_t nocdatafin;	/* No cdata finalizer called. */[m
[31m-  uint8_t unused2;[m
[31m-  MSize sweepstr;	/* Sweep position in string table. */[m
[31m-  GCRef root;		/* List of all collectable objects. */[m
[31m-  MRef sweep;		/* Sweep position in root list. */[m
[31m-  GCRef gray;		/* List of gray objects. */[m
[31m-  GCRef grayagain;	/* List of objects for atomic traversal. */[m
[31m-  GCRef weak;		/* List of weak tables (to be cleared). */[m
[31m-  GCRef mmudata;	/* List of userdata (to be finalized). */[m
[31m-  GCSize debt;		/* Debt (how much GC is behind schedule). */[m
[31m-  GCSize estimate;	/* Estimate of memory actually in use. */[m
[31m-  MSize stepmul;	/* Incremental GC step granularity. */[m
[31m-  MSize pause;		/* Pause between successive GC cycles. */[m
[31m-} GCState;[m
[31m-[m
[31m-/* Global state, shared by all threads of a Lua universe. */[m
[31m-typedef struct global_State {[m
[31m-  GCRef *strhash;	/* String hash table (hash chain anchors). */[m
[31m-  MSize strmask;	/* String hash mask (size of hash table - 1). */[m
[31m-  MSize strnum;		/* Number of strings in hash table. */[m
[31m-  lua_Alloc allocf;	/* Memory allocator. */[m
[31m-  void *allocd;		/* Memory allocator data. */[m
[31m-  GCState gc;		/* Garbage collector. */[m
[31m-  volatile int32_t vmstate;  /* VM state or current JIT code trace number. */[m
[31m-  SBuf tmpbuf;		/* Temporary string buffer. */[m
[31m-  GCstr strempty;	/* Empty string. */[m
[31m-  uint8_t stremptyz;	/* Zero terminator of empty string. */[m
[31m-  uint8_t hookmask;	/* Hook mask. */[m
[31m-  uint8_t dispatchmode;	/* Dispatch mode. */[m
[31m-  uint8_t vmevmask;	/* VM event mask. */[m
[31m-  GCRef mainthref;	/* Link to main thread. */[m
[31m-  TValue registrytv;	/* Anchor for registry. */[m
[31m-  TValue tmptv, tmptv2;	/* Temporary TValues. */[m
[31m-  Node nilnode;		/* Fallback 1-element hash part (nil key and value). */[m
[31m-  GCupval uvhead;	/* Head of double-linked list of all open upvalues. */[m
[31m-  int32_t hookcount;	/* Instruction hook countdown. */[m
[31m-  int32_t hookcstart;	/* Start count for instruction hook counter. */[m
[31m-  lua_Hook hookf;	/* Hook function. */[m
[31m-  lua_CFunction wrapf;	/* Wrapper for C function calls. */[m
[31m-  lua_CFunction panic;	/* Called as a last resort for errors. */[m
[31m-  BCIns bc_cfunc_int;	/* Bytecode for internal C function calls. */[m
[31m-  BCIns bc_cfunc_ext;	/* Bytecode for external C function calls. */[m
[31m-  GCRef cur_L;		/* Currently executing lua_State. */[m
[31m-  MRef jit_base;	/* Current JIT code L->base or NULL. */[m
[31m-  MRef saved_jit_base;  /* saved jit_base for lj_err_throw */[m
[31m-  MRef ctype_state;	/* Pointer to C type state. */[m
[31m-  GCRef gcroot[GCROOT_MAX];  /* GC roots. */[m
[31m-} global_State;[m
[31m-[m
[31m-#define mainthread(g)	(&gcref(g->mainthref)->th)[m
[31m-#define niltv(L) \[m
[31m-  check_exp(tvisnil(&G(L)->nilnode.val), &G(L)->nilnode.val)[m
[31m-#define niltvg(g) \[m
[31m-  check_exp(tvisnil(&(g)->nilnode.val), &(g)->nilnode.val)[m
[31m-[m
[31m-/* Hook management. Hook event masks are defined in lua.h. */[m
[31m-#define HOOK_EVENTMASK		0x0f[m
[31m-#define HOOK_ACTIVE		0x10[m
[31m-#define HOOK_ACTIVE_SHIFT	4[m
[31m-#define HOOK_VMEVENT		0x20[m
[31m-#define HOOK_GC			0x40[m
[31m-#define HOOK_PROFILE		0x80[m
[31m-#define hook_active(g)		((g)->hookmask & HOOK_ACTIVE)[m
[31m-#define hook_enter(g)		((g)->hookmask |= HOOK_ACTIVE)[m
[31m-#define hook_entergc(g)		((g)->hookmask |= (HOOK_ACTIVE|HOOK_GC))[m
[31m-#define hook_vmevent(g)		((g)->hookmask |= (HOOK_ACTIVE|HOOK_VMEVENT))[m
[31m-#define hook_leave(g)		((g)->hookmask &= ~HOOK_ACTIVE)[m
[31m-#define hook_save(g)		((g)->hookmask & ~HOOK_EVENTMASK)[m
[31m-#define hook_restore(g, h) \[m
[31m-  ((g)->hookmask = ((g)->hookmask & HOOK_EVENTMASK) | (h))[m
[31m-[m
[31m-/* Per-thread state object. */[m
[31m-struct lua_State {[m
[31m-  GCHeader;[m
[31m-  uint8_t dummy_ffid;	/* Fake FF_C for curr_funcisL() on dummy frames. */[m
[31m-  uint8_t status;	/* Thread status. */[m
[31m-  MRef glref;		/* Link to global state. */[m
[31m-  GCRef gclist;		/* GC chain. */[m
[31m-  TValue *base;		/* Base of currently executing function. */[m
[31m-  TValue *top;		/* First free slot in the stack. */[m
[31m-  MRef maxstack;	/* Last free slot in the stack. */[m
[31m-  MRef stack;		/* Stack base. */[m
[31m-  GCRef openupval;	/* List of open upvalues in the stack. */[m
[31m-  GCRef env;		/* Thread environment (table of globals). */[m
[31m-  void *cframe;		/* End of C stack frame chain. */[m
[31m-  MSize stacksize;	/* True stack size (incl. LJ_STACK_EXTRA). */[m
[31m-};[m
[31m-[m
[31m-#define G(L)			(mref(L->glref, global_State))[m
[31m-#define registry(L)		(&G(L)->registrytv)[m
[31m-[m
[31m-/* Macros to access the currently executing (Lua) function. */[m
[31m-#if LJ_GC64[m
[31m-#define curr_func(L)		(&gcval(L->base-2)->fn)[m
[31m-#elif LJ_FR2[m
[31m-#define curr_func(L)		(&gcref((L->base-2)->gcr)->fn)[m
[31m-#else[m
[31m-#define curr_func(L)		(&gcref((L->base-1)->fr.func)->fn)[m
[31m-#endif[m
[31m-#define curr_funcisL(L)		(isluafunc(curr_func(L)))[m
[31m-#define curr_proto(L)		(funcproto(curr_func(L)))[m
[31m-#define curr_topL(L)		(L->base + curr_proto(L)->framesize)[m
[31m-#define curr_top(L)		(curr_funcisL(L) ? curr_topL(L) : L->top)[m
[31m-[m
[31m-/* -- GC object definition and conversions -------------------------------- */[m
[31m-[m
[31m-/* GC header for generic access to common fields of GC objects. */[m
[31m-typedef struct GChead {[m
[31m-  GCHeader;[m
[31m-  uint8_t unused1;[m
[31m-  uint8_t unused2;[m
[31m-  GCRef env;[m
[31m-  GCRef gclist;[m
[31m-  GCRef metatable;[m
[31m-} GChead;[m
[31m-[m
[31m-/* The env field SHOULD be at the same offset for all GC objects. */[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, env) == offsetof(GCfuncL, env));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, env) == offsetof(GCudata, env));[m
[31m-[m
[31m-/* The metatable field MUST be at the same offset for all GC objects. */[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCtab, metatable));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCudata, metatable));[m
[31m-[m
[31m-/* The gclist field MUST be at the same offset for all GC objects. */[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(lua_State, gclist));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCproto, gclist));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCfuncL, gclist));[m
[31m-LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCtab, gclist));[m
[31m-[m
[31m-typedef union GCobj {[m
[31m-  GChead gch;[m
[31m-  GCstr str;[m
[31m-  GCupval uv;[m
[31m-  lua_State th;[m
[31m-  GCproto pt;[m
[31m-  GCfunc fn;[m
[31m-  GCcdata cd;[m
[31m-  GCtab tab;[m
[31m-  GCudata ud;[m
[31m-} GCobj;[m
[31m-[m
[31m-/* Macros to convert a GCobj pointer into a specific value. */[m
[31m-#define gco2str(o)	check_exp((o)->gch.gct == ~LJ_TSTR, &(o)->str)[m
[31m-#define gco2uv(o)	check_exp((o)->gch.gct == ~LJ_TUPVAL, &(o)->uv)[m
[31m-#define gco2th(o)	check_exp((o)->gch.gct == ~LJ_TTHREAD, &(o)->th)[m
[31m-#define gco2pt(o)	check_exp((o)->gch.gct == ~LJ_TPROTO, &(o)->pt)[m
[31m-#define gco2func(o)	check_exp((o)->gch.gct == ~LJ_TFUNC, &(o)->fn)[m
[31m-#define gco2cd(o)	check_exp((o)->gch.gct == ~LJ_TCDATA, &(o)->cd)[m
[31m-#define gco2tab(o)	check_exp((o)->gch.gct == ~LJ_TTAB, &(o)->tab)[m
[31m-#define gco2ud(o)	check_exp((o)->gch.gct == ~LJ_TUDATA, &(o)->ud)[m
[31m-[m
[31m-/* Macro to convert any collectable object into a GCobj pointer. */[m
[31m-#define obj2gco(v)	((GCobj *)(v))[m
[31m-[m
[31m-/* -- TValue getters/setters ---------------------------------------------- */[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-#include "lj_gc.h"[m
[31m-#endif[m
[31m-[m
[31m-/* Macros to test types. */[m
[31m-#if LJ_GC64[m
[31m-#define itype(o)	((uint32_t)((o)->it64 >> 47))[m
[31m-#define tvisnil(o)	((o)->it64 == -1)[m
[31m-#else[m
[31m-#define itype(o)	((o)->it)[m
[31m-#define tvisnil(o)	(itype(o) == LJ_TNIL)[m
[31m-#endif[m
[31m-#define tvisfalse(o)	(itype(o) == LJ_TFALSE)[m
[31m-#define tvistrue(o)	(itype(o) == LJ_TTRUE)[m
[31m-#define tvisbool(o)	(tvisfalse(o) || tvistrue(o))[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define tvislightud(o)	(((int32_t)itype(o) >> 15) == -2)[m
[31m-#else[m
[31m-#define tvislightud(o)	(itype(o) == LJ_TLIGHTUD)[m
[31m-#endif[m
[31m-#define tvisstr(o)	(itype(o) == LJ_TSTR)[m
[31m-#define tvisfunc(o)	(itype(o) == LJ_TFUNC)[m
[31m-#define tvisthread(o)	(itype(o) == LJ_TTHREAD)[m
[31m-#define tvisproto(o)	(itype(o) == LJ_TPROTO)[m
[31m-#define tviscdata(o)	(itype(o) == LJ_TCDATA)[m
[31m-#define tvistab(o)	(itype(o) == LJ_TTAB)[m
[31m-#define tvisudata(o)	(itype(o) == LJ_TUDATA)[m
[31m-#define tvisnumber(o)	(itype(o) <= LJ_TISNUM)[m
[31m-#define tvisint(o)	(LJ_DUALNUM && itype(o) == LJ_TISNUM)[m
[31m-#define tvisnum(o)	(itype(o) < LJ_TISNUM)[m
[31m-[m
[31m-#define tvistruecond(o)	(itype(o) < LJ_TISTRUECOND)[m
[31m-#define tvispri(o)	(itype(o) >= LJ_TISPRI)[m
[31m-#define tvistabud(o)	(itype(o) <= LJ_TISTABUD)  /* && !tvisnum() */[m
[31m-#define tvisgcv(o)	((itype(o) - LJ_TISGCV) > (LJ_TNUMX - LJ_TISGCV))[m
[31m-[m
[31m-/* Special macros to test numbers for NaN, +0, -0, +1 and raw equality. */[m
[31m-#define tvisnan(o)	((o)->n != (o)->n)[m
[31m-#if LJ_64[m
[31m-#define tviszero(o)	(((o)->u64 << 1) == 0)[m
[31m-#else[m
[31m-#define tviszero(o)	(((o)->u32.lo | ((o)->u32.hi << 1)) == 0)[m
[31m-#endif[m
[31m-#define tvispzero(o)	((o)->u64 == 0)[m
[31m-#define tvismzero(o)	((o)->u64 == U64x(80000000,00000000))[m
[31m-#define tvispone(o)	((o)->u64 == U64x(3ff00000,00000000))[m
[31m-#define rawnumequal(o1, o2)	((o1)->u64 == (o2)->u64)[m
[31m-[m
[31m-/* Macros to convert type ids. */[m
[31m-#if LJ_64 && !LJ_GC64[m
[31m-#define itypemap(o) \[m
[31m-  (tvisnumber(o) ? ~LJ_TNUMX : tvislightud(o) ? ~LJ_TLIGHTUD : ~itype(o))[m
[31m-#else[m
[31m-#define itypemap(o)	(tvisnumber(o) ? ~LJ_TNUMX : ~itype(o))[m
[31m-#endif[m
[31m-[m
[31m-/* Macros to get tagged values. */[m
[31m-#if LJ_GC64[m
[31m-#define gcval(o)	((GCobj *)(gcrefu((o)->gcr) & LJ_GCVMASK))[m
[31m-#else[m
[31m-#define gcval(o)	(gcref((o)->gcr))[m
[31m-#endif[m
[31m-#define boolV(o)	check_exp(tvisbool(o), (LJ_TFALSE - itype(o)))[m
[31m-#if LJ_64[m
[31m-#define lightudV(o) \[m
[31m-  check_exp(tvislightud(o), (void *)((o)->u64 & U64x(00007fff,ffffffff)))[m
[31m-#else[m
[31m-#define lightudV(o)	check_exp(tvislightud(o), gcrefp((o)->gcr, void))[m
[31m-#endif[m
[31m-#define gcV(o)		check_exp(tvisgcv(o), gcval(o))[m
[31m-#define strV(o)		check_exp(tvisstr(o), &gcval(o)->str)[m
[31m-#define funcV(o)	check_exp(tvisfunc(o), &gcval(o)->fn)[m
[31m-#define threadV(o)	check_exp(tvisthread(o), &gcval(o)->th)[m
[31m-#define protoV(o)	check_exp(tvisproto(o), &gcval(o)->pt)[m
[31m-#define cdataV(o)	check_exp(tviscdata(o), &gcval(o)->cd)[m
[31m-#define tabV(o)		check_exp(tvistab(o), &gcval(o)->tab)[m
[31m-#define udataV(o)	check_exp(tvisudata(o), &gcval(o)->ud)[m
[31m-#define numV(o)		check_exp(tvisnum(o), (o)->n)[m
[31m-#define intV(o)		check_exp(tvisint(o), (int32_t)(o)->i)[m
[31m-[m
[31m-/* Macros to set tagged values. */[m
[31m-#if LJ_GC64[m
[31m-#define setitype(o, i)		((o)->it = ((i) << 15))[m
[31m-#define setnilV(o)		((o)->it64 = -1)[m
[31m-#define setpriV(o, x)		((o)->it64 = (int64_t)~((uint64_t)~(x)<<47))[m
[31m-#define setboolV(o, x)		((o)->it64 = (int64_t)~((uint64_t)((x)+1)<<47))[m
[31m-#else[m
[31m-#define setitype(o, i)		((o)->it = (i))[m
[31m-#define setnilV(o)		((o)->it = LJ_TNIL)[m
[31m-#define setboolV(o, x)		((o)->it = LJ_TFALSE-(uint32_t)(x))[m
[31m-#define setpriV(o, i)		(setitype((o), (i)))[m
[31m-#endif[m
[31m-[m
[31m-static LJ_AINLINE void setlightudV(TValue *o, void *p)[m
[31m-{[m
[31m-#if LJ_GC64[m
[31m-  o->u64 = (uint64_t)p | (((uint64_t)LJ_TLIGHTUD) << 47);[m
[31m-#elif LJ_64[m
[31m-  o->u64 = (uint64_t)p | (((uint64_t)0xffff) << 48);[m
[31m-#else[m
[31m-  setgcrefp(o->gcr, p); setitype(o, LJ_TLIGHTUD);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define checklightudptr(L, p) \[m
[31m-  (((uint64_t)(p) >> 47) ? (lj_err_msg(L, LJ_ERR_BADLU), NULL) : (p))[m
[31m-#else[m
[31m-#define checklightudptr(L, p)	(p)[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_FR2[m
[31m-#define contptr(f)		((void *)(f))[m
[31m-#define setcont(o, f)		((o)->u64 = (uint64_t)(uintptr_t)contptr(f))[m
[31m-#elif LJ_64[m
[31m-#define contptr(f) \[m
[31m-  ((void *)(uintptr_t)(uint32_t)((intptr_t)(f) - (intptr_t)lj_vm_asm_begin))[m
[31m-#define setcont(o, f) \[m
[31m-  ((o)->u64 = (uint64_t)(void *)(f) - (uint64_t)lj_vm_asm_begin)[m
[31m-#else[m
[31m-#define contptr(f)		((void *)(f))[m
[31m-#define setcont(o, f)		setlightudV((o), contptr(f))[m
[31m-#endif[m
[31m-[m
[31m-#define tvchecklive(L, o) \[m
[31m-  UNUSED(L), lua_assert(!tvisgcv(o) || \[m
[31m-  ((~itype(o) == gcval(o)->gch.gct) && !isdead(G(L), gcval(o))))[m
[31m-[m
[31m-static LJ_AINLINE void setgcVraw(TValue *o, GCobj *v, uint32_t itype)[m
[31m-{[m
[31m-#if LJ_GC64[m
[31m-  setgcreft(o->gcr, v, itype);[m
[31m-#else[m
[31m-  setgcref(o->gcr, v); setitype(o, itype);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void setgcV(lua_State *L, TValue *o, GCobj *v, uint32_t it)[m
[31m-{[m
[31m-  setgcVraw(o, v, it); tvchecklive(L, o);[m
[31m-}[m
[31m-[m
[31m-#define define_setV(name, type, tag) \[m
[31m-static LJ_AINLINE void name(lua_State *L, TValue *o, type *v) \[m
[31m-{ \[m
[31m-  setgcV(L, o, obj2gco(v), tag); \[m
[31m-}[m
[31m-define_setV(setstrV, GCstr, LJ_TSTR)[m
[31m-define_setV(setthreadV, lua_State, LJ_TTHREAD)[m
[31m-define_setV(setprotoV, GCproto, LJ_TPROTO)[m
[31m-define_setV(setfuncV, GCfunc, LJ_TFUNC)[m
[31m-define_setV(setcdataV, GCcdata, LJ_TCDATA)[m
[31m-define_setV(settabV, GCtab, LJ_TTAB)[m
[31m-define_setV(setudataV, GCudata, LJ_TUDATA)[m
[31m-[m
[31m-#define setnumV(o, x)		((o)->n = (x))[m
[31m-#define setnanV(o)		((o)->u64 = U64x(fff80000,00000000))[m
[31m-#define setpinfV(o)		((o)->u64 = U64x(7ff00000,00000000))[m
[31m-#define setminfV(o)		((o)->u64 = U64x(fff00000,00000000))[m
[31m-[m
[31m-static LJ_AINLINE void setintV(TValue *o, int32_t i)[m
[31m-{[m
[31m-#if LJ_DUALNUM[m
[31m-  o->i = (uint32_t)i; setitype(o, LJ_TISNUM);[m
[31m-#else[m
[31m-  o->n = (lua_Number)i;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void setint64V(TValue *o, int64_t i)[m
[31m-{[m
[31m-  if (LJ_DUALNUM && LJ_LIKELY(i == (int64_t)(int32_t)i))[m
[31m-    setintV(o, (int32_t)i);[m
[31m-  else[m
[31m-    setnumV(o, (lua_Number)i);[m
[31m-}[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define setintptrV(o, i)	setint64V((o), (i))[m
[31m-#else[m
[31m-#define setintptrV(o, i)	setintV((o), (i))[m
[31m-#endif[m
[31m-[m
[31m-/* Copy tagged values. */[m
[31m-static LJ_AINLINE void copyTV(lua_State *L, TValue *o1, const TValue *o2)[m
[31m-{[m
[31m-  *o1 = *o2; tvchecklive(L, o1);[m
[31m-}[m
[31m-[m
[31m-/* -- Number to integer conversion ---------------------------------------- */[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-LJ_ASMF int32_t lj_vm_tobit(double x);[m
[31m-#endif[m
[31m-[m
[31m-static LJ_AINLINE int32_t lj_num2bit(lua_Number n)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  return lj_vm_tobit(n);[m
[31m-#else[m
[31m-  TValue o;[m
[31m-  o.n = n + 6755399441055744.0;  /* 2^52 + 2^51 */[m
[31m-  return (int32_t)o.u32.lo;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#define lj_num2int(n)   ((int32_t)(n))[m
[31m-[m
[31m-static LJ_AINLINE uint64_t lj_num2u64(lua_Number n)[m
[31m-{[m
[31m-#ifdef _MSC_VER[m
[31m-  if (n >= 9223372036854775808.0)  /* They think it's a feature. */[m
[31m-    return (uint64_t)(int64_t)(n - 18446744073709551616.0);[m
[31m-  else[m
[31m-#endif[m
[31m-    return (uint64_t)n;[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE int32_t numberVint(cTValue *o)[m
[31m-{[m
[31m-  if (LJ_LIKELY(tvisint(o)))[m
[31m-    return intV(o);[m
[31m-  else[m
[31m-    return lj_num2int(numV(o));[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE lua_Number numberVnum(cTValue *o)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(tvisint(o)))[m
[31m-    return (lua_Number)intV(o);[m
[31m-  else[m
[31m-    return numV(o);[m
[31m-}[m
[31m-[m
[31m-/* -- Miscellaneous object handling --------------------------------------- */[m
[31m-[m
[31m-/* Names and maps for internal and external object tags. */[m
[31m-LJ_DATA const char *const lj_obj_typename[1+LUA_TCDATA+1];[m
[31m-LJ_DATA const char *const lj_obj_itypename[~LJ_TNUMX+1];[m
[31m-[m
[31m-#define lj_typename(o)	(lj_obj_itypename[itypemap(o)])[m
[31m-[m
[31m-/* Compare two objects without calling metamethods. */[m
[31m-LJ_FUNC int LJ_FASTCALL lj_obj_equal(cTValue *o1, cTValue *o2);[m
[31m-LJ_FUNC const void * LJ_FASTCALL lj_obj_ptr(cTValue *o);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_dce.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_dce.c[m
[1mdeleted file mode 100644[m
[1mindex e5a096a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_dce.c[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-/*[m
[31m-** DCE: Dead Code Elimination. Pre-LOOP only -- ASM already performs DCE.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_dce_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Scan through all snapshots and mark all referenced instructions. */[m
[31m-static void dce_marksnap(jit_State *J)[m
[31m-{[m
[31m-  SnapNo i, nsnap = J->cur.nsnap;[m
[31m-  for (i = 0; i < nsnap; i++) {[m
[31m-    SnapShot *snap = &J->cur.snap[i];[m
[31m-    SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-    MSize n, nent = snap->nent;[m
[31m-    for (n = 0; n < nent; n++) {[m
[31m-      IRRef ref = snap_ref(map[n]);[m
[31m-      if (ref >= REF_FIRST)[m
[31m-	irt_setmark(IR(ref)->t);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Backwards propagate marks. Replace unused instructions with NOPs. */[m
[31m-static void dce_propagate(jit_State *J)[m
[31m-{[m
[31m-  IRRef1 *pchain[IR__MAX];[m
[31m-  IRRef ins;[m
[31m-  uint32_t i;[m
[31m-  for (i = 0; i < IR__MAX; i++) pchain[i] = &J->chain[i];[m
[31m-  for (ins = J->cur.nins-1; ins >= REF_FIRST; ins--) {[m
[31m-    IRIns *ir = IR(ins);[m
[31m-    if (irt_ismarked(ir->t)) {[m
[31m-      irt_clearmark(ir->t);[m
[31m-      pchain[ir->o] = &ir->prev;[m
[31m-    } else if (!ir_sideeff(ir)) {[m
[31m-      *pchain[ir->o] = ir->prev;  /* Reroute original instruction chain. */[m
[31m-      ir->t.irt = IRT_NIL;[m
[31m-      ir->o = IR_NOP;  /* Replace instruction with NOP. */[m
[31m-      ir->op1 = ir->op2 = 0;[m
[31m-      ir->prev = 0;[m
[31m-      continue;[m
[31m-    }[m
[31m-    if (ir->op1 >= REF_FIRST) irt_setmark(IR(ir->op1)->t);[m
[31m-    if (ir->op2 >= REF_FIRST) irt_setmark(IR(ir->op2)->t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Dead Code Elimination.[m
[31m-**[m
[31m-** First backpropagate marks for all used instructions. Then replace[m
[31m-** the unused ones with a NOP. Note that compressing the IR to eliminate[m
[31m-** the NOPs does not pay off.[m
[31m-*/[m
[31m-void lj_opt_dce(jit_State *J)[m
[31m-{[m
[31m-  if ((J->flags & JIT_F_OPT_DCE)) {[m
[31m-    dce_marksnap(J);[m
[31m-    dce_propagate(J);[m
[31m-    memset(J->bpropcache, 0, sizeof(J->bpropcache));  /* Invalidate cache. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_fold.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_fold.c[m
[1mdeleted file mode 100644[m
[1mindex e1d1369..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_fold.c[m
[1m+++ /dev/null[m
[36m@@ -1,2488 +0,0 @@[m
[31m-/*[m
[31m-** FOLD: Constant Folding, Algebraic Simplifications and Reassociation.[m
[31m-** ABCelim: Array Bounds Check Elimination.[m
[31m-** CSE: Common-Subexpression Elimination.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_fold_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include <math.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_carith.h"[m
[31m-#endif[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* Here's a short description how the FOLD engine processes instructions:[m
[31m-**[m
[31m-** The FOLD engine receives a single instruction stored in fins (J->fold.ins).[m
[31m-** The instruction and its operands are used to select matching fold rules.[m
[31m-** These are applied iteratively until a fixed point is reached.[m
[31m-**[m
[31m-** The 8 bit opcode of the instruction itself plus the opcodes of the[m
[31m-** two instructions referenced by its operands form a 24 bit key[m
[31m-** 'ins left right' (unused operands -> 0, literals -> lowest 8 bits).[m
[31m-**[m
[31m-** This key is used for partial matching against the fold rules. The[m
[31m-** left/right operand fields of the key are successively masked with[m
[31m-** the 'any' wildcard, from most specific to least specific:[m
[31m-**[m
[31m-**   ins left right[m
[31m-**   ins any  right[m
[31m-**   ins left any[m
[31m-**   ins any  any[m
[31m-**[m
[31m-** The masked key is used to lookup a matching fold rule in a semi-perfect[m
[31m-** hash table. If a matching rule is found, the related fold function is run.[m
[31m-** Multiple rules can share the same fold function. A fold rule may return[m
[31m-** one of several special values:[m
[31m-**[m
[31m-** - NEXTFOLD means no folding was applied, because an additional test[m
[31m-**   inside the fold function failed. Matching continues against less[m
[31m-**   specific fold rules. Finally the instruction is passed on to CSE.[m
[31m-**[m
[31m-** - RETRYFOLD means the instruction was modified in-place. Folding is[m
[31m-**   retried as if this instruction had just been received.[m
[31m-**[m
[31m-** All other return values are terminal actions -- no further folding is[m
[31m-** applied:[m
[31m-**[m
[31m-** - INTFOLD(i) returns a reference to the integer constant i.[m
[31m-**[m
[31m-** - LEFTFOLD and RIGHTFOLD return the left/right operand reference[m
[31m-**   without emitting an instruction.[m
[31m-**[m
[31m-** - CSEFOLD and EMITFOLD pass the instruction directly to CSE or emit[m
[31m-**   it without passing through any further optimizations.[m
[31m-**[m
[31m-** - FAILFOLD, DROPFOLD and CONDFOLD only apply to instructions which have[m
[31m-**   no result (e.g. guarded assertions): FAILFOLD means the guard would[m
[31m-**   always fail, i.e. the current trace is pointless. DROPFOLD means[m
[31m-**   the guard is always true and has been eliminated. CONDFOLD is a[m
[31m-**   shortcut for FAILFOLD + cond (i.e. drop if true, otherwise fail).[m
[31m-**[m
[31m-** - Any other return value is interpreted as an IRRef or TRef. This[m
[31m-**   can be a reference to an existing or a newly created instruction.[m
[31m-**   Only the least-significant 16 bits (IRRef1) are used to form a TRef[m
[31m-**   which is finally returned to the caller.[m
[31m-**[m
[31m-** The FOLD engine receives instructions both from the trace recorder and[m
[31m-** substituted instructions from LOOP unrolling. This means all types[m
[31m-** of instructions may end up here, even though the recorder bypasses[m
[31m-** FOLD in some cases. Thus all loads, stores and allocations must have[m
[31m-** an any/any rule to avoid being passed on to CSE.[m
[31m-**[m
[31m-** Carefully read the following requirements before adding or modifying[m
[31m-** any fold rules:[m
[31m-**[m
[31m-** Requirement #1: All fold rules must preserve their destination type.[m
[31m-**[m
[31m-** Consistently use INTFOLD() (KINT result) or lj_ir_knum() (KNUM result).[m
[31m-** Never use lj_ir_knumint() which can have either a KINT or KNUM result.[m
[31m-**[m
[31m-** Requirement #2: Fold rules should not create *new* instructions which[m
[31m-** reference operands *across* PHIs.[m
[31m-**[m
[31m-** E.g. a RETRYFOLD with 'fins->op1 = fleft->op1' is invalid if the[m
[31m-** left operand is a PHI. Then fleft->op1 would point across the PHI[m
[31m-** frontier to an invariant instruction. Adding a PHI for this instruction[m
[31m-** would be counterproductive. The solution is to add a barrier which[m
[31m-** prevents folding across PHIs, i.e. 'PHIBARRIER(fleft)' in this case.[m
[31m-** The only exception is for recurrences with high latencies like[m
[31m-** repeated int->num->int conversions.[m
[31m-**[m
[31m-** One could relax this condition a bit if the referenced instruction is[m
[31m-** a PHI, too. But this often leads to worse code due to excessive[m
[31m-** register shuffling.[m
[31m-**[m
[31m-** Note: returning *existing* instructions (e.g. LEFTFOLD) is ok, though.[m
[31m-** Even returning fleft->op1 would be ok, because a new PHI will added,[m
[31m-** if needed. But again, this leads to excessive register shuffling and[m
[31m-** should be avoided.[m
[31m-**[m
[31m-** Requirement #3: The set of all fold rules must be monotonic to guarantee[m
[31m-** termination.[m
[31m-**[m
[31m-** The goal is optimization, so one primarily wants to add strength-reducing[m
[31m-** rules. This means eliminating an instruction or replacing an instruction[m
[31m-** with one or more simpler instructions. Don't add fold rules which point[m
[31m-** into the other direction.[m
[31m-**[m
[31m-** Some rules (like commutativity) do not directly reduce the strength of[m
[31m-** an instruction, but enable other fold rules (e.g. by moving constants[m
[31m-** to the right operand). These rules must be made unidirectional to avoid[m
[31m-** cycles.[m
[31m-**[m
[31m-** Rule of thumb: the trace recorder expands the IR and FOLD shrinks it.[m
[31m-*/[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-#define fins		(&J->fold.ins)[m
[31m-#define fleft		(&J->fold.left)[m
[31m-#define fright		(&J->fold.right)[m
[31m-#define knumleft	(ir_knum(fleft)->n)[m
[31m-#define knumright	(ir_knum(fright)->n)[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* Fold function type. Fastcall on x86 significantly reduces their size. */[m
[31m-typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J);[m
[31m-[m
[31m-/* Macros for the fold specs, so buildvm can recognize them. */[m
[31m-#define LJFOLD(x)[m
[31m-#define LJFOLDX(x)[m
[31m-#define LJFOLDF(name)	static TRef LJ_FASTCALL fold_##name(jit_State *J)[m
[31m-/* Note: They must be at the start of a line or buildvm ignores them! */[m
[31m-[m
[31m-/* Barrier to prevent using operands across PHIs. */[m
[31m-#define PHIBARRIER(ir)	if (irt_isphi((ir)->t)) return NEXTFOLD[m
[31m-[m
[31m-/* Barrier to prevent folding across a GC step.[m
[31m-** GC steps can only happen at the head of a trace and at LOOP.[m
[31m-** And the GC is only driven forward if there's at least one allocation.[m
[31m-*/[m
[31m-#define gcstep_barrier(J, ref) \[m
[31m-  ((ref) < J->chain[IR_LOOP] && \[m
[31m-   (J->chain[IR_SNEW] || J->chain[IR_XSNEW] || \[m
[31m-    J->chain[IR_TNEW] || J->chain[IR_TDUP] || \[m
[31m-    J->chain[IR_CNEW] || J->chain[IR_CNEWI] || \[m
[31m-    J->chain[IR_BUFSTR] || J->chain[IR_TOSTR] || J->chain[IR_CALLA]))[m
[31m-[m
[31m-/* -- Constant folding for FP numbers ------------------------------------- */[m
[31m-[m
[31m-LJFOLD(ADD KNUM KNUM)[m
[31m-LJFOLD(SUB KNUM KNUM)[m
[31m-LJFOLD(MUL KNUM KNUM)[m
[31m-LJFOLD(DIV KNUM KNUM)[m
[31m-LJFOLD(NEG KNUM KNUM)[m
[31m-LJFOLD(ABS KNUM KNUM)[m
[31m-LJFOLD(ATAN2 KNUM KNUM)[m
[31m-LJFOLD(LDEXP KNUM KNUM)[m
[31m-LJFOLD(MIN KNUM KNUM)[m
[31m-LJFOLD(MAX KNUM KNUM)[m
[31m-LJFOLDF(kfold_numarith)[m
[31m-{[m
[31m-  lua_Number a = knumleft;[m
[31m-  lua_Number b = knumright;[m
[31m-  lua_Number y = lj_vm_foldarith(a, b, fins->o - IR_ADD);[m
[31m-  return lj_ir_knum(J, y);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(LDEXP KNUM KINT)[m
[31m-LJFOLDF(kfold_ldexp)[m
[31m-{[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  UNUSED(J);[m
[31m-  return NEXTFOLD;[m
[31m-#else[m
[31m-  return lj_ir_knum(J, ldexp(knumleft, fright->i));[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FPMATH KNUM any)[m
[31m-LJFOLDF(kfold_fpmath)[m
[31m-{[m
[31m-  lua_Number a = knumleft;[m
[31m-  lua_Number y = lj_vm_foldfpm(a, fins->op2);[m
[31m-  return lj_ir_knum(J, y);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(POW KNUM KINT)[m
[31m-LJFOLDF(kfold_numpow)[m
[31m-{[m
[31m-  lua_Number a = knumleft;[m
[31m-  lua_Number b = (lua_Number)fright->i;[m
[31m-  lua_Number y = lj_vm_foldarith(a, b, IR_POW - IR_ADD);[m
[31m-  return lj_ir_knum(J, y);[m
[31m-}[m
[31m-[m
[31m-/* Must not use kfold_kref for numbers (could be NaN). */[m
[31m-LJFOLD(EQ KNUM KNUM)[m
[31m-LJFOLD(NE KNUM KNUM)[m
[31m-LJFOLD(LT KNUM KNUM)[m
[31m-LJFOLD(GE KNUM KNUM)[m
[31m-LJFOLD(LE KNUM KNUM)[m
[31m-LJFOLD(GT KNUM KNUM)[m
[31m-LJFOLD(ULT KNUM KNUM)[m
[31m-LJFOLD(UGE KNUM KNUM)[m
[31m-LJFOLD(ULE KNUM KNUM)[m
[31m-LJFOLD(UGT KNUM KNUM)[m
[31m-LJFOLDF(kfold_numcomp)[m
[31m-{[m
[31m-  return CONDFOLD(lj_ir_numcmp(knumleft, knumright, (IROp)fins->o));[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding for 32 bit integers -------------------------------- */[m
[31m-[m
[31m-static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case IR_ADD: k1 += k2; break;[m
[31m-  case IR_SUB: k1 -= k2; break;[m
[31m-  case IR_MUL: k1 *= k2; break;[m
[31m-  case IR_MOD: k1 = lj_vm_modi(k1, k2); break;[m
[31m-  case IR_NEG: k1 = -k1; break;[m
[31m-  case IR_BAND: k1 &= k2; break;[m
[31m-  case IR_BOR: k1 |= k2; break;[m
[31m-  case IR_BXOR: k1 ^= k2; break;[m
[31m-  case IR_BSHL: k1 <<= (k2 & 31); break;[m
[31m-  case IR_BSHR: k1 = (int32_t)((uint32_t)k1 >> (k2 & 31)); break;[m
[31m-  case IR_BSAR: k1 >>= (k2 & 31); break;[m
[31m-  case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 31)); break;[m
[31m-  case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break;[m
[31m-  case IR_MIN: k1 = k1 < k2 ? k1 : k2; break;[m
[31m-  case IR_MAX: k1 = k1 > k2 ? k1 : k2; break;[m
[31m-  default: lua_assert(0); break;[m
[31m-  }[m
[31m-  return k1;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD KINT KINT)[m
[31m-LJFOLD(SUB KINT KINT)[m
[31m-LJFOLD(MUL KINT KINT)[m
[31m-LJFOLD(MOD KINT KINT)[m
[31m-LJFOLD(NEG KINT KINT)[m
[31m-LJFOLD(BAND KINT KINT)[m
[31m-LJFOLD(BOR KINT KINT)[m
[31m-LJFOLD(BXOR KINT KINT)[m
[31m-LJFOLD(BSHL KINT KINT)[m
[31m-LJFOLD(BSHR KINT KINT)[m
[31m-LJFOLD(BSAR KINT KINT)[m
[31m-LJFOLD(BROL KINT KINT)[m
[31m-LJFOLD(BROR KINT KINT)[m
[31m-LJFOLD(MIN KINT KINT)[m
[31m-LJFOLD(MAX KINT KINT)[m
[31m-LJFOLDF(kfold_intarith)[m
[31m-{[m
[31m-  return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADDOV KINT KINT)[m
[31m-LJFOLD(SUBOV KINT KINT)[m
[31m-LJFOLD(MULOV KINT KINT)[m
[31m-LJFOLDF(kfold_intovarith)[m
[31m-{[m
[31m-  lua_Number n = lj_vm_foldarith((lua_Number)fleft->i, (lua_Number)fright->i,[m
[31m-				 fins->o - IR_ADDOV);[m
[31m-  int32_t k = lj_num2int(n);[m
[31m-  if (n != (lua_Number)k)[m
[31m-    return FAILFOLD;[m
[31m-  return INTFOLD(k);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BNOT KINT)[m
[31m-LJFOLDF(kfold_bnot)[m
[31m-{[m
[31m-  return INTFOLD(~fleft->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSWAP KINT)[m
[31m-LJFOLDF(kfold_bswap)[m
[31m-{[m
[31m-  return INTFOLD((int32_t)lj_bswap((uint32_t)fleft->i));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(LT KINT KINT)[m
[31m-LJFOLD(GE KINT KINT)[m
[31m-LJFOLD(LE KINT KINT)[m
[31m-LJFOLD(GT KINT KINT)[m
[31m-LJFOLD(ULT KINT KINT)[m
[31m-LJFOLD(UGE KINT KINT)[m
[31m-LJFOLD(ULE KINT KINT)[m
[31m-LJFOLD(UGT KINT KINT)[m
[31m-LJFOLD(ABC KINT KINT)[m
[31m-LJFOLDF(kfold_intcomp)[m
[31m-{[m
[31m-  int32_t a = fleft->i, b = fright->i;[m
[31m-  switch ((IROp)fins->o) {[m
[31m-  case IR_LT: return CONDFOLD(a < b);[m
[31m-  case IR_GE: return CONDFOLD(a >= b);[m
[31m-  case IR_LE: return CONDFOLD(a <= b);[m
[31m-  case IR_GT: return CONDFOLD(a > b);[m
[31m-  case IR_ULT: return CONDFOLD((uint32_t)a < (uint32_t)b);[m
[31m-  case IR_UGE: return CONDFOLD((uint32_t)a >= (uint32_t)b);[m
[31m-  case IR_ULE: return CONDFOLD((uint32_t)a <= (uint32_t)b);[m
[31m-  case IR_ABC:[m
[31m-  case IR_UGT: return CONDFOLD((uint32_t)a > (uint32_t)b);[m
[31m-  default: lua_assert(0); return FAILFOLD;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-LJFOLD(UGE any KINT)[m
[31m-LJFOLDF(kfold_intcomp0)[m
[31m-{[m
[31m-  if (fright->i == 0)[m
[31m-    return DROPFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding for 64 bit integers -------------------------------- */[m
[31m-[m
[31m-static uint64_t kfold_int64arith(uint64_t k1, uint64_t k2, IROp op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-#if LJ_HASFFI[m
[31m-  case IR_ADD: k1 += k2; break;[m
[31m-  case IR_SUB: k1 -= k2; break;[m
[31m-  case IR_MUL: k1 *= k2; break;[m
[31m-  case IR_BAND: k1 &= k2; break;[m
[31m-  case IR_BOR: k1 |= k2; break;[m
[31m-  case IR_BXOR: k1 ^= k2; break;[m
[31m-#endif[m
[31m-  default: UNUSED(k2); lua_assert(0); break;[m
[31m-  }[m
[31m-  return k1;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD KINT64 KINT64)[m
[31m-LJFOLD(SUB KINT64 KINT64)[m
[31m-LJFOLD(MUL KINT64 KINT64)[m
[31m-LJFOLD(BAND KINT64 KINT64)[m
[31m-LJFOLD(BOR KINT64 KINT64)[m
[31m-LJFOLD(BXOR KINT64 KINT64)[m
[31m-LJFOLDF(kfold_int64arith)[m
[31m-{[m
[31m-  return INT64FOLD(kfold_int64arith(ir_k64(fleft)->u64,[m
[31m-				    ir_k64(fright)->u64, (IROp)fins->o));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(DIV KINT64 KINT64)[m
[31m-LJFOLD(MOD KINT64 KINT64)[m
[31m-LJFOLD(POW KINT64 KINT64)[m
[31m-LJFOLDF(kfold_int64arith2)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  uint64_t k1 = ir_k64(fleft)->u64, k2 = ir_k64(fright)->u64;[m
[31m-  if (irt_isi64(fins->t)) {[m
[31m-    k1 = fins->o == IR_DIV ? lj_carith_divi64((int64_t)k1, (int64_t)k2) :[m
[31m-	 fins->o == IR_MOD ? lj_carith_modi64((int64_t)k1, (int64_t)k2) :[m
[31m-			     lj_carith_powi64((int64_t)k1, (int64_t)k2);[m
[31m-  } else {[m
[31m-    k1 = fins->o == IR_DIV ? lj_carith_divu64(k1, k2) :[m
[31m-	 fins->o == IR_MOD ? lj_carith_modu64(k1, k2) :[m
[31m-			     lj_carith_powu64(k1, k2);[m
[31m-  }[m
[31m-  return INT64FOLD(k1);[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL KINT64 KINT)[m
[31m-LJFOLD(BSHR KINT64 KINT)[m
[31m-LJFOLD(BSAR KINT64 KINT)[m
[31m-LJFOLD(BROL KINT64 KINT)[m
[31m-LJFOLD(BROR KINT64 KINT)[m
[31m-LJFOLDF(kfold_int64shift)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  uint64_t k = ir_k64(fleft)->u64;[m
[31m-  int32_t sh = (fright->i & 63);[m
[31m-  return INT64FOLD(lj_carith_shift64(k, sh, fins->o - IR_BSHL));[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BNOT KINT64)[m
[31m-LJFOLDF(kfold_bnot64)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  return INT64FOLD(~ir_k64(fleft)->u64);[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSWAP KINT64)[m
[31m-LJFOLDF(kfold_bswap64)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  return INT64FOLD(lj_bswap64(ir_k64(fleft)->u64));[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(LT KINT64 KINT64)[m
[31m-LJFOLD(GE KINT64 KINT64)[m
[31m-LJFOLD(LE KINT64 KINT64)[m
[31m-LJFOLD(GT KINT64 KINT64)[m
[31m-LJFOLD(ULT KINT64 KINT64)[m
[31m-LJFOLD(UGE KINT64 KINT64)[m
[31m-LJFOLD(ULE KINT64 KINT64)[m
[31m-LJFOLD(UGT KINT64 KINT64)[m
[31m-LJFOLDF(kfold_int64comp)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  uint64_t a = ir_k64(fleft)->u64, b = ir_k64(fright)->u64;[m
[31m-  switch ((IROp)fins->o) {[m
[31m-  case IR_LT: return CONDFOLD(a < b);[m
[31m-  case IR_GE: return CONDFOLD(a >= b);[m
[31m-  case IR_LE: return CONDFOLD(a <= b);[m
[31m-  case IR_GT: return CONDFOLD(a > b);[m
[31m-  case IR_ULT: return CONDFOLD((uint64_t)a < (uint64_t)b);[m
[31m-  case IR_UGE: return CONDFOLD((uint64_t)a >= (uint64_t)b);[m
[31m-  case IR_ULE: return CONDFOLD((uint64_t)a <= (uint64_t)b);[m
[31m-  case IR_UGT: return CONDFOLD((uint64_t)a > (uint64_t)b);[m
[31m-  default: lua_assert(0); return FAILFOLD;[m
[31m-  }[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(UGE any KINT64)[m
[31m-LJFOLDF(kfold_int64comp0)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (ir_k64(fright)->u64 == 0)[m
[31m-    return DROPFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding for strings ---------------------------------------- */[m
[31m-[m
[31m-LJFOLD(SNEW KKPTR KINT)[m
[31m-LJFOLDF(kfold_snew_kptr)[m
[31m-{[m
[31m-  GCstr *s = lj_str_new(J->L, (const char *)ir_kptr(fleft), (size_t)fright->i);[m
[31m-  return lj_ir_kstr(J, s);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SNEW any KINT)[m
[31m-LJFOLDF(kfold_snew_empty)[m
[31m-{[m
[31m-  if (fright->i == 0)[m
[31m-    return lj_ir_kstr(J, &J2G(J)->strempty);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(STRREF KGC KINT)[m
[31m-LJFOLDF(kfold_strref)[m
[31m-{[m
[31m-  GCstr *str = ir_kstr(fleft);[m
[31m-  lua_assert((MSize)fright->i <= str->len);[m
[31m-  return lj_ir_kkptr(J, (char *)strdata(str) + fright->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(STRREF SNEW any)[m
[31m-LJFOLDF(kfold_strref_snew)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (irref_isk(fins->op2) && fright->i == 0) {[m
[31m-    return fleft->op1;  /* strref(snew(ptr, len), 0) ==> ptr */[m
[31m-  } else {[m
[31m-    /* Reassociate: strref(snew(strref(str, a), len), b) ==> strref(str, a+b) */[m
[31m-    IRIns *ir = IR(fleft->op1);[m
[31m-    if (ir->o == IR_STRREF) {[m
[31m-      IRRef1 str = ir->op1;  /* IRIns * is not valid across emitir. */[m
[31m-      PHIBARRIER(ir);[m
[31m-      fins->op2 = emitir(IRTI(IR_ADD), ir->op2, fins->op2); /* Clobbers fins! */[m
[31m-      fins->op1 = str;[m
[31m-      fins->ot = IRT(IR_STRREF, IRT_P32);[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CALLN CARG IRCALL_lj_str_cmp)[m
[31m-LJFOLDF(kfold_strcmp)[m
[31m-{[m
[31m-  if (irref_isk(fleft->op1) && irref_isk(fleft->op2)) {[m
[31m-    GCstr *a = ir_kstr(IR(fleft->op1));[m
[31m-    GCstr *b = ir_kstr(IR(fleft->op2));[m
[31m-    return INTFOLD(lj_str_cmp(a, b));[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding and forwarding for buffers ------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** Buffer ops perform stores, but their effect is limited to the buffer[m
[31m-** itself. Also, buffer ops are chained: a use of an op implies a use of[m
[31m-** all other ops up the chain. Conversely, if an op is unused, all ops[m
[31m-** up the chain can go unsed. This largely eliminates the need to treat[m
[31m-** them as stores.[m
[31m-**[m
[31m-** Alas, treating them as normal (IRM_N) ops doesn't work, because they[m
[31m-** cannot be CSEd in isolation. CSE for IRM_N is implicitly done in LOOP[m
[31m-** or if FOLD is disabled.[m
[31m-**[m
[31m-** The compromise is to declare them as loads, emit them like stores and[m
[31m-** CSE whole chains manually when the BUFSTR is to be emitted. Any chain[m
[31m-** fragments left over from CSE are eliminated by DCE.[m
[31m-*/[m
[31m-[m
[31m-/* BUFHDR is emitted like a store, see below. */[m
[31m-[m
[31m-LJFOLD(BUFPUT BUFHDR BUFSTR)[m
[31m-LJFOLDF(bufput_append)[m
[31m-{[m
[31m-  /* New buffer, no other buffer op inbetween and same buffer? */[m
[31m-  if ((J->flags & JIT_F_OPT_FWD) &&[m
[31m-      !(fleft->op2 & IRBUFHDR_APPEND) &&[m
[31m-      fleft->prev == fright->op2 &&[m
[31m-      fleft->op1 == IR(fright->op2)->op1) {[m
[31m-    IRRef ref = fins->op1;[m
[31m-    IR(ref)->op2 = (fleft->op2 | IRBUFHDR_APPEND);  /* Modify BUFHDR. */[m
[31m-    IR(ref)->op1 = fright->op1;[m
[31m-    return ref;[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BUFPUT any any)[m
[31m-LJFOLDF(bufput_kgc)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) {[m
[31m-    GCstr *s2 = ir_kstr(fright);[m
[31m-    if (s2->len == 0) {  /* Empty string? */[m
[31m-      return LEFTFOLD;[m
[31m-    } else {[m
[31m-      if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) &&[m
[31m-	  !irt_isphi(fleft->t)) {  /* Join two constant string puts in a row. */[m
[31m-	GCstr *s1 = ir_kstr(IR(fleft->op2));[m
[31m-	IRRef kref = lj_ir_kstr(J, lj_buf_cat2str(J->L, s1, s2));[m
[31m-	/* lj_ir_kstr() may realloc the IR and invalidates any IRIns *. */[m
[31m-	IR(fins->op1)->op2 = kref;  /* Modify previous BUFPUT. */[m
[31m-	return fins->op1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BUFSTR any any)[m
[31m-LJFOLDF(bufstr_kfold_cse)[m
[31m-{[m
[31m-  lua_assert(fleft->o == IR_BUFHDR || fleft->o == IR_BUFPUT ||[m
[31m-	     fleft->o == IR_CALLL);[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {[m
[31m-    if (fleft->o == IR_BUFHDR) {  /* No put operations? */[m
[31m-      if (!(fleft->op2 & IRBUFHDR_APPEND))  /* Empty buffer? */[m
[31m-	return lj_ir_kstr(J, &J2G(J)->strempty);[m
[31m-      fins->op1 = fleft->op1;[m
[31m-      fins->op2 = fleft->prev;  /* Relies on checks in bufput_append. */[m
[31m-      return CSEFOLD;[m
[31m-    } else if (fleft->o == IR_BUFPUT) {[m
[31m-      IRIns *irb = IR(fleft->op1);[m
[31m-      if (irb->o == IR_BUFHDR && !(irb->op2 & IRBUFHDR_APPEND))[m
[31m-	return fleft->op2;  /* Shortcut for a single put operation. */[m
[31m-    }[m
[31m-  }[m
[31m-  /* Try to CSE the whole chain. */[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {[m
[31m-    IRRef ref = J->chain[IR_BUFSTR];[m
[31m-    while (ref) {[m
[31m-      IRIns *irs = IR(ref), *ira = fleft, *irb = IR(irs->op1);[m
[31m-      while (ira->o == irb->o && ira->op2 == irb->op2) {[m
[31m-	lua_assert(ira->o == IR_BUFHDR || ira->o == IR_BUFPUT ||[m
[31m-		   ira->o == IR_CALLL || ira->o == IR_CARG);[m
[31m-	if (ira->o == IR_BUFHDR && !(ira->op2 & IRBUFHDR_APPEND))[m
[31m-	  return ref;  /* CSE succeeded. */[m
[31m-	if (ira->o == IR_CALLL && ira->op2 == IRCALL_lj_buf_puttab)[m
[31m-	  break;[m
[31m-	ira = IR(ira->op1);[m
[31m-	irb = IR(irb->op1);[m
[31m-      }[m
[31m-      ref = irs->prev;[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;  /* No CSE possible. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_reverse)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_upper)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_lower)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putquoted)[m
[31m-LJFOLDF(bufput_kfold_op)[m
[31m-{[m
[31m-  if (irref_isk(fleft->op2)) {[m
[31m-    const CCallInfo *ci = &lj_ir_callinfo[fins->op2];[m
[31m-    SBuf *sb = lj_buf_tmp_(J->L);[m
[31m-    sb = ((SBuf * (LJ_FASTCALL *)(SBuf *, GCstr *))ci->func)(sb,[m
[31m-						       ir_kstr(IR(fleft->op2)));[m
[31m-    fins->o = IR_BUFPUT;[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_rep)[m
[31m-LJFOLDF(bufput_kfold_rep)[m
[31m-{[m
[31m-  if (irref_isk(fleft->op2)) {[m
[31m-    IRIns *irc = IR(fleft->op1);[m
[31m-    if (irref_isk(irc->op2)) {[m
[31m-      SBuf *sb = lj_buf_tmp_(J->L);[m
[31m-      sb = lj_buf_putstr_rep(sb, ir_kstr(IR(irc->op2)), IR(fleft->op2)->i);[m
[31m-      fins->o = IR_BUFPUT;[m
[31m-      fins->op1 = irc->op1;[m
[31m-      fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfxint)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_int)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_uint)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfstr)[m
[31m-LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfchar)[m
[31m-LJFOLDF(bufput_kfold_fmt)[m
[31m-{[m
[31m-  IRIns *irc = IR(fleft->op1);[m
[31m-  lua_assert(irref_isk(irc->op2));  /* SFormat must be const. */[m
[31m-  if (irref_isk(fleft->op2)) {[m
[31m-    SFormat sf = (SFormat)IR(irc->op2)->i;[m
[31m-    IRIns *ira = IR(fleft->op2);[m
[31m-    SBuf *sb = lj_buf_tmp_(J->L);[m
[31m-    switch (fins->op2) {[m
[31m-    case IRCALL_lj_strfmt_putfxint:[m
[31m-      sb = lj_strfmt_putfxint(sb, sf, ir_k64(ira)->u64);[m
[31m-      break;[m
[31m-    case IRCALL_lj_strfmt_putfstr:[m
[31m-      sb = lj_strfmt_putfstr(sb, sf, ir_kstr(ira));[m
[31m-      break;[m
[31m-    case IRCALL_lj_strfmt_putfchar:[m
[31m-      sb = lj_strfmt_putfchar(sb, sf, ira->i);[m
[31m-      break;[m
[31m-    case IRCALL_lj_strfmt_putfnum_int:[m
[31m-    case IRCALL_lj_strfmt_putfnum_uint:[m
[31m-    case IRCALL_lj_strfmt_putfnum:[m
[31m-    default: {[m
[31m-      const CCallInfo *ci = &lj_ir_callinfo[fins->op2];[m
[31m-      sb = ((SBuf * (*)(SBuf *, SFormat, lua_Number))ci->func)(sb, sf,[m
[31m-							 ir_knum(ira)->n);[m
[31m-      break;[m
[31m-      }[m
[31m-    }[m
[31m-    fins->o = IR_BUFPUT;[m
[31m-    fins->op1 = irc->op1;[m
[31m-    fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return EMITFOLD;  /* Always emit, CSE later. */[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding of pointer arithmetic ------------------------------ */[m
[31m-[m
[31m-LJFOLD(ADD KGC KINT)[m
[31m-LJFOLD(ADD KGC KINT64)[m
[31m-LJFOLDF(kfold_add_kgc)[m
[31m-{[m
[31m-  GCobj *o = ir_kgc(fleft);[m
[31m-#if LJ_64[m
[31m-  ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64;[m
[31m-#else[m
[31m-  ptrdiff_t ofs = fright->i;[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-  if (irt_iscdata(fleft->t)) {[m
[31m-    CType *ct = ctype_raw(ctype_ctsG(J2G(J)), gco2cd(o)->ctypeid);[m
[31m-    if (ctype_isnum(ct->info) || ctype_isenum(ct->info) ||[m
[31m-	ctype_isptr(ct->info) || ctype_isfunc(ct->info) ||[m
[31m-	ctype_iscomplex(ct->info) || ctype_isvector(ct->info))[m
[31m-      return lj_ir_kkptr(J, (char *)o + ofs);[m
[31m-  }[m
[31m-#endif[m
[31m-  return lj_ir_kptr(J, (char *)o + ofs);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD KPTR KINT)[m
[31m-LJFOLD(ADD KPTR KINT64)[m
[31m-LJFOLD(ADD KKPTR KINT)[m
[31m-LJFOLD(ADD KKPTR KINT64)[m
[31m-LJFOLDF(kfold_add_kptr)[m
[31m-{[m
[31m-  void *p = ir_kptr(fleft);[m
[31m-#if LJ_64[m
[31m-  ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64;[m
[31m-#else[m
[31m-  ptrdiff_t ofs = fright->i;[m
[31m-#endif[m
[31m-  return lj_ir_kptr_(J, fleft->o, (char *)p + ofs);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD any KGC)[m
[31m-LJFOLD(ADD any KPTR)[m
[31m-LJFOLD(ADD any KKPTR)[m
[31m-LJFOLDF(kfold_add_kright)[m
[31m-{[m
[31m-  if (fleft->o == IR_KINT || fleft->o == IR_KINT64) {[m
[31m-    IRRef1 tmp = fins->op1; fins->op1 = fins->op2; fins->op2 = tmp;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding of conversions ------------------------------------- */[m
[31m-[m
[31m-LJFOLD(TOBIT KNUM KNUM)[m
[31m-LJFOLDF(kfold_tobit)[m
[31m-{[m
[31m-  return INTFOLD(lj_num2bit(knumleft));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT IRCONV_NUM_INT)[m
[31m-LJFOLDF(kfold_conv_kint_num)[m
[31m-{[m
[31m-  return lj_ir_knum(J, (lua_Number)fleft->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT IRCONV_NUM_U32)[m
[31m-LJFOLDF(kfold_conv_kintu32_num)[m
[31m-{[m
[31m-  return lj_ir_knum(J, (lua_Number)(uint32_t)fleft->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT IRCONV_INT_I8)[m
[31m-LJFOLD(CONV KINT IRCONV_INT_U8)[m
[31m-LJFOLD(CONV KINT IRCONV_INT_I16)[m
[31m-LJFOLD(CONV KINT IRCONV_INT_U16)[m
[31m-LJFOLDF(kfold_conv_kint_ext)[m
[31m-{[m
[31m-  int32_t k = fleft->i;[m
[31m-  if ((fins->op2 & IRCONV_SRCMASK) == IRT_I8) k = (int8_t)k;[m
[31m-  else if ((fins->op2 & IRCONV_SRCMASK) == IRT_U8) k = (uint8_t)k;[m
[31m-  else if ((fins->op2 & IRCONV_SRCMASK) == IRT_I16) k = (int16_t)k;[m
[31m-  else k = (uint16_t)k;[m
[31m-  return INTFOLD(k);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT IRCONV_I64_INT)[m
[31m-LJFOLD(CONV KINT IRCONV_U64_INT)[m
[31m-LJFOLD(CONV KINT IRCONV_I64_U32)[m
[31m-LJFOLD(CONV KINT IRCONV_U64_U32)[m
[31m-LJFOLDF(kfold_conv_kint_i64)[m
[31m-{[m
[31m-  if ((fins->op2 & IRCONV_SEXT))[m
[31m-    return INT64FOLD((uint64_t)(int64_t)fleft->i);[m
[31m-  else[m
[31m-    return INT64FOLD((uint64_t)(int64_t)(uint32_t)fleft->i);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT64 IRCONV_NUM_I64)[m
[31m-LJFOLDF(kfold_conv_kint64_num_i64)[m
[31m-{[m
[31m-  return lj_ir_knum(J, (lua_Number)(int64_t)ir_kint64(fleft)->u64);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT64 IRCONV_NUM_U64)[m
[31m-LJFOLDF(kfold_conv_kint64_num_u64)[m
[31m-{[m
[31m-  return lj_ir_knum(J, (lua_Number)ir_kint64(fleft)->u64);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KINT64 IRCONV_INT_I64)[m
[31m-LJFOLD(CONV KINT64 IRCONV_U32_I64)[m
[31m-LJFOLDF(kfold_conv_kint64_int_i64)[m
[31m-{[m
[31m-  return INTFOLD((int32_t)ir_kint64(fleft)->u64);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KNUM IRCONV_INT_NUM)[m
[31m-LJFOLDF(kfold_conv_knum_int_num)[m
[31m-{[m
[31m-  lua_Number n = knumleft;[m
[31m-  int32_t k = lj_num2int(n);[m
[31m-  if (irt_isguard(fins->t) && n != (lua_Number)k) {[m
[31m-    /* We're about to create a guard which always fails, like CONV +1.5.[m
[31m-    ** Some pathological loops cause this during LICM, e.g.:[m
[31m-    **   local x,k,t = 0,1.5,{1,[1.5]=2}[m
[31m-    **   for i=1,200 do x = x+ t[k]; k = k == 1 and 1.5 or 1 end[m
[31m-    **   assert(x == 300)[m
[31m-    */[m
[31m-    return FAILFOLD;[m
[31m-  }[m
[31m-  return INTFOLD(k);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KNUM IRCONV_U32_NUM)[m
[31m-LJFOLDF(kfold_conv_knum_u32_num)[m
[31m-{[m
[31m-#ifdef _MSC_VER[m
[31m-  {  /* Workaround for MSVC bug. */[m
[31m-    volatile uint32_t u = (uint32_t)knumleft;[m
[31m-    return INTFOLD((int32_t)u);[m
[31m-  }[m
[31m-#else[m
[31m-  return INTFOLD((int32_t)(uint32_t)knumleft);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KNUM IRCONV_I64_NUM)[m
[31m-LJFOLDF(kfold_conv_knum_i64_num)[m
[31m-{[m
[31m-  return INT64FOLD((uint64_t)(int64_t)knumleft);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV KNUM IRCONV_U64_NUM)[m
[31m-LJFOLDF(kfold_conv_knum_u64_num)[m
[31m-{[m
[31m-  return INT64FOLD(lj_num2u64(knumleft));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(TOSTR KNUM any)[m
[31m-LJFOLDF(kfold_tostr_knum)[m
[31m-{[m
[31m-  return lj_ir_kstr(J, lj_strfmt_num(J->L, ir_knum(fleft)));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(TOSTR KINT any)[m
[31m-LJFOLDF(kfold_tostr_kint)[m
[31m-{[m
[31m-  return lj_ir_kstr(J, fins->op2 == IRTOSTR_INT ?[m
[31m-		       lj_strfmt_int(J->L, fleft->i) :[m
[31m-		       lj_strfmt_char(J->L, fleft->i));[m
[31m-}[m
[31m-[m
[31m-LJFOLD(STRTO KGC)[m
[31m-LJFOLDF(kfold_strto)[m
[31m-{[m
[31m-  TValue n;[m
[31m-  if (lj_strscan_num(ir_kstr(fleft), &n))[m
[31m-    return lj_ir_knum(J, numV(&n));[m
[31m-  return FAILFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Constant folding of equality checks --------------------------------- */[m
[31m-[m
[31m-/* Don't constant-fold away FLOAD checks against KNULL. */[m
[31m-LJFOLD(EQ FLOAD KNULL)[m
[31m-LJFOLD(NE FLOAD KNULL)[m
[31m-LJFOLDX(lj_opt_cse)[m
[31m-[m
[31m-/* But fold all other KNULL compares, since only KNULL is equal to KNULL. */[m
[31m-LJFOLD(EQ any KNULL)[m
[31m-LJFOLD(NE any KNULL)[m
[31m-LJFOLD(EQ KNULL any)[m
[31m-LJFOLD(NE KNULL any)[m
[31m-LJFOLD(EQ KINT KINT)  /* Constants are unique, so same refs <==> same value. */[m
[31m-LJFOLD(NE KINT KINT)[m
[31m-LJFOLD(EQ KINT64 KINT64)[m
[31m-LJFOLD(NE KINT64 KINT64)[m
[31m-LJFOLD(EQ KGC KGC)[m
[31m-LJFOLD(NE KGC KGC)[m
[31m-LJFOLDF(kfold_kref)[m
[31m-{[m
[31m-  return CONDFOLD((fins->op1 == fins->op2) ^ (fins->o == IR_NE));[m
[31m-}[m
[31m-[m
[31m-/* -- Algebraic shortcuts ------------------------------------------------- */[m
[31m-[m
[31m-LJFOLD(FPMATH FPMATH IRFPM_FLOOR)[m
[31m-LJFOLD(FPMATH FPMATH IRFPM_CEIL)[m
[31m-LJFOLD(FPMATH FPMATH IRFPM_TRUNC)[m
[31m-LJFOLDF(shortcut_round)[m
[31m-{[m
[31m-  IRFPMathOp op = (IRFPMathOp)fleft->op2;[m
[31m-  if (op == IRFPM_FLOOR || op == IRFPM_CEIL || op == IRFPM_TRUNC)[m
[31m-    return LEFTFOLD;  /* round(round_left(x)) = round_left(x) */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ABS ABS KNUM)[m
[31m-LJFOLDF(shortcut_left)[m
[31m-{[m
[31m-  return LEFTFOLD;  /* f(g(x)) ==> g(x) */[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ABS NEG KNUM)[m
[31m-LJFOLDF(shortcut_dropleft)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  fins->op1 = fleft->op1;  /* abs(neg(x)) ==> abs(x) */[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Note: no safe shortcuts with STRTO and TOSTR ("1e2" ==> +100 ==> "100"). */[m
[31m-LJFOLD(NEG NEG any)[m
[31m-LJFOLD(BNOT BNOT)[m
[31m-LJFOLD(BSWAP BSWAP)[m
[31m-LJFOLDF(shortcut_leftleft)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);  /* See above. Fold would be ok, but not beneficial. */[m
[31m-  return fleft->op1;  /* f(g(x)) ==> x */[m
[31m-}[m
[31m-[m
[31m-/* -- FP algebraic simplifications ---------------------------------------- */[m
[31m-[m
[31m-/* FP arithmetic is tricky -- there's not much to simplify.[m
[31m-** Please note the following common pitfalls before sending "improvements":[m
[31m-**   x+0 ==> x  is INVALID for x=-0[m
[31m-**   0-x ==> -x is INVALID for x=+0[m
[31m-**   x*0 ==> 0  is INVALID for x=-0, x=+-Inf or x=NaN[m
[31m-*/[m
[31m-[m
[31m-LJFOLD(ADD NEG any)[m
[31m-LJFOLDF(simplify_numadd_negx)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  fins->o = IR_SUB;  /* (-a) + b ==> b - a */[m
[31m-  fins->op1 = fins->op2;[m
[31m-  fins->op2 = fleft->op1;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD any NEG)[m
[31m-LJFOLDF(simplify_numadd_xneg)[m
[31m-{[m
[31m-  PHIBARRIER(fright);[m
[31m-  fins->o = IR_SUB;  /* a + (-b) ==> a - b */[m
[31m-  fins->op2 = fright->op1;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any KNUM)[m
[31m-LJFOLDF(simplify_numsub_k)[m
[31m-{[m
[31m-  lua_Number n = knumright;[m
[31m-  if (n == 0.0)  /* x - (+-0) ==> x */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB NEG KNUM)[m
[31m-LJFOLDF(simplify_numsub_negk)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  fins->op2 = fleft->op1;  /* (-x) - k ==> (-k) - x */[m
[31m-  fins->op1 = (IRRef1)lj_ir_knum(J, -knumright);[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any NEG)[m
[31m-LJFOLDF(simplify_numsub_xneg)[m
[31m-{[m
[31m-  PHIBARRIER(fright);[m
[31m-  fins->o = IR_ADD;  /* a - (-b) ==> a + b */[m
[31m-  fins->op2 = fright->op1;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL any KNUM)[m
[31m-LJFOLD(DIV any KNUM)[m
[31m-LJFOLDF(simplify_nummuldiv_k)[m
[31m-{[m
[31m-  lua_Number n = knumright;[m
[31m-  if (n == 1.0) {  /* x o 1 ==> x */[m
[31m-    return LEFTFOLD;[m
[31m-  } else if (n == -1.0) {  /* x o -1 ==> -x */[m
[31m-    fins->o = IR_NEG;[m
[31m-    fins->op2 = (IRRef1)lj_ir_knum_neg(J);[m
[31m-    return RETRYFOLD;[m
[31m-  } else if (fins->o == IR_MUL && n == 2.0) {  /* x * 2 ==> x + x */[m
[31m-    fins->o = IR_ADD;[m
[31m-    fins->op2 = fins->op1;[m
[31m-    return RETRYFOLD;[m
[31m-  } else if (fins->o == IR_DIV) {  /* x / 2^k ==> x * 2^-k */[m
[31m-    uint64_t u = ir_knum(fright)->u64;[m
[31m-    uint32_t ex = ((uint32_t)(u >> 52) & 0x7ff);[m
[31m-    if ((u & U64x(000fffff,ffffffff)) == 0 && ex - 1 < 0x7fd) {[m
[31m-      u = (u & ((uint64_t)1 << 63)) | ((uint64_t)(0x7fe - ex) << 52);[m
[31m-      fins->o = IR_MUL;  /* Multiply by exact reciprocal. */[m
[31m-      fins->op2 = lj_ir_knum_u64(J, u);[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL NEG KNUM)[m
[31m-LJFOLD(DIV NEG KNUM)[m
[31m-LJFOLDF(simplify_nummuldiv_negk)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  fins->op1 = fleft->op1;  /* (-a) o k ==> a o (-k) */[m
[31m-  fins->op2 = (IRRef1)lj_ir_knum(J, -knumright);[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL NEG NEG)[m
[31m-LJFOLD(DIV NEG NEG)[m
[31m-LJFOLDF(simplify_nummuldiv_negneg)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  PHIBARRIER(fright);[m
[31m-  fins->op1 = fleft->op1;  /* (-a) o (-b) ==> a o b */[m
[31m-  fins->op2 = fright->op1;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(POW any KINT)[m
[31m-LJFOLDF(simplify_numpow_xk)[m
[31m-{[m
[31m-  int32_t k = fright->i;[m
[31m-  TRef ref = fins->op1;[m
[31m-  if (k == 0)  /* x ^ 0 ==> 1 */[m
[31m-    return lj_ir_knum_one(J);  /* Result must be a number, not an int. */[m
[31m-  if (k == 1)  /* x ^ 1 ==> x */[m
[31m-    return LEFTFOLD;[m
[31m-  if ((uint32_t)(k+65536) > 2*65536u)  /* Limit code explosion. */[m
[31m-    return NEXTFOLD;[m
[31m-  if (k < 0) {  /* x ^ (-k) ==> (1/x) ^ k. */[m
[31m-    ref = emitir(IRTN(IR_DIV), lj_ir_knum_one(J), ref);[m
[31m-    k = -k;[m
[31m-  }[m
[31m-  /* Unroll x^k for 1 <= k <= 65536. */[m
[31m-  for (; (k & 1) == 0; k >>= 1)  /* Handle leading zeros. */[m
[31m-    ref = emitir(IRTN(IR_MUL), ref, ref);[m
[31m-  if ((k >>= 1) != 0) {  /* Handle trailing bits. */[m
[31m-    TRef tmp = emitir(IRTN(IR_MUL), ref, ref);[m
[31m-    for (; k != 1; k >>= 1) {[m
[31m-      if (k & 1)[m
[31m-	ref = emitir(IRTN(IR_MUL), ref, tmp);[m
[31m-      tmp = emitir(IRTN(IR_MUL), tmp, tmp);[m
[31m-    }[m
[31m-    ref = emitir(IRTN(IR_MUL), ref, tmp);[m
[31m-  }[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(POW KNUM any)[m
[31m-LJFOLDF(simplify_numpow_kx)[m
[31m-{[m
[31m-  lua_Number n = knumleft;[m
[31m-  if (n == 2.0) {  /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */[m
[31m-    fins->o = IR_CONV;[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-    fins->op1 = fins->op2;[m
[31m-    fins->op2 = IRCONV_NUM_INT;[m
[31m-    fins->op2 = (IRRef1)lj_opt_fold(J);[m
[31m-#endif[m
[31m-    fins->op1 = (IRRef1)lj_ir_knum_one(J);[m
[31m-    fins->o = IR_LDEXP;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Simplify conversions ------------------------------------------------ */[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_NUM_INT)  /* _NUM */[m
[31m-LJFOLDF(shortcut_conv_num_int)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  /* Only safe with a guarded conversion to int. */[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_NUM && irt_isguard(fleft->t))[m
[31m-    return fleft->op1;  /* f(g(x)) ==> x */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_INT_NUM)  /* _INT */[m
[31m-LJFOLD(CONV CONV IRCONV_U32_NUM)  /* _U32*/[m
[31m-LJFOLDF(simplify_conv_int_num)[m
[31m-{[m
[31m-  /* Fold even across PHI to avoid expensive num->int conversions in loop. */[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) ==[m
[31m-      ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH))[m
[31m-    return fleft->op1;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_I64_NUM)  /* _INT or _U32 */[m
[31m-LJFOLD(CONV CONV IRCONV_U64_NUM)  /* _INT or _U32 */[m
[31m-LJFOLDF(simplify_conv_i64_num)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) {[m
[31m-    /* Reduce to a sign-extension. */[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT);[m
[31m-    return RETRYFOLD;[m
[31m-  } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {[m
[31m-#if LJ_TARGET_X64[m
[31m-    return fleft->op1;[m
[31m-#else[m
[31m-    /* Reduce to a zero-extension. */[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRT_I64<<5)|IRT_U32;[m
[31m-    return RETRYFOLD;[m
[31m-#endif[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_INT_I64)  /* _INT or _U32 */[m
[31m-LJFOLD(CONV CONV IRCONV_INT_U64)  /* _INT or _U32 */[m
[31m-LJFOLD(CONV CONV IRCONV_U32_I64)  /* _INT or _U32 */[m
[31m-LJFOLD(CONV CONV IRCONV_U32_U64)  /* _INT or _U32 */[m
[31m-LJFOLDF(simplify_conv_int_i64)[m
[31m-{[m
[31m-  int src;[m
[31m-  PHIBARRIER(fleft);[m
[31m-  src = (fleft->op2 & IRCONV_SRCMASK);[m
[31m-  if (src == IRT_INT || src == IRT_U32) {[m
[31m-    if (src == ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH)) {[m
[31m-      return fleft->op1;[m
[31m-    } else {[m
[31m-      fins->op2 = ((fins->op2 & IRCONV_DSTMASK) | src);[m
[31m-      fins->op1 = fleft->op1;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(CONV CONV IRCONV_FLOAT_NUM)  /* _FLOAT */[m
[31m-LJFOLDF(simplify_conv_flt_num)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_FLOAT)[m
[31m-    return fleft->op1;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */[m
[31m-LJFOLD(TOBIT CONV KNUM)[m
[31m-LJFOLDF(simplify_tobit_conv)[m
[31m-{[m
[31m-  /* Fold even across PHI to avoid expensive num->int conversions in loop. */[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) {[m
[31m-    lua_assert(irt_isnum(fleft->t));[m
[31m-    return fleft->op1;[m
[31m-  } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {[m
[31m-    lua_assert(irt_isnum(fleft->t));[m
[31m-    fins->o = IR_CONV;[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRT_INT<<5)|IRT_U32;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Shortcut floor/ceil/round + IRT_NUM <- IRT_INT/IRT_U32 conversion. */[m
[31m-LJFOLD(FPMATH CONV IRFPM_FLOOR)[m
[31m-LJFOLD(FPMATH CONV IRFPM_CEIL)[m
[31m-LJFOLD(FPMATH CONV IRFPM_TRUNC)[m
[31m-LJFOLDF(simplify_floor_conv)[m
[31m-{[m
[31m-  if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT ||[m
[31m-      (fleft->op2 & IRCONV_SRCMASK) == IRT_U32)[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Strength reduction of widening. */[m
[31m-LJFOLD(CONV any IRCONV_I64_INT)[m
[31m-LJFOLD(CONV any IRCONV_U64_INT)[m
[31m-LJFOLDF(simplify_conv_sext)[m
[31m-{[m
[31m-  IRRef ref = fins->op1;[m
[31m-  int64_t ofs = 0;[m
[31m-  if (!(fins->op2 & IRCONV_SEXT))[m
[31m-    return NEXTFOLD;[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (fleft->o == IR_XLOAD && (irt_isu8(fleft->t) || irt_isu16(fleft->t)))[m
[31m-    goto ok_reduce;[m
[31m-  if (fleft->o == IR_ADD && irref_isk(fleft->op2)) {[m
[31m-    ofs = (int64_t)IR(fleft->op2)->i;[m
[31m-    ref = fleft->op1;[m
[31m-  }[m
[31m-  /* Use scalar evolution analysis results to strength-reduce sign-extension. */[m
[31m-  if (ref == J->scev.idx) {[m
[31m-    IRRef lo = J->scev.dir ? J->scev.start : J->scev.stop;[m
[31m-    lua_assert(irt_isint(J->scev.t));[m
[31m-    if (lo && IR(lo)->i + ofs >= 0) {[m
[31m-    ok_reduce:[m
[31m-#if LJ_TARGET_X64[m
[31m-      /* Eliminate widening. All 32 bit ops do an implicit zero-extension. */[m
[31m-      return LEFTFOLD;[m
[31m-#else[m
[31m-      /* Reduce to a (cheaper) zero-extension. */[m
[31m-      fins->op2 &= ~IRCONV_SEXT;[m
[31m-      return RETRYFOLD;[m
[31m-#endif[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Strength reduction of narrowing. */[m
[31m-LJFOLD(CONV ADD IRCONV_INT_I64)[m
[31m-LJFOLD(CONV SUB IRCONV_INT_I64)[m
[31m-LJFOLD(CONV MUL IRCONV_INT_I64)[m
[31m-LJFOLD(CONV ADD IRCONV_INT_U64)[m
[31m-LJFOLD(CONV SUB IRCONV_INT_U64)[m
[31m-LJFOLD(CONV MUL IRCONV_INT_U64)[m
[31m-LJFOLD(CONV ADD IRCONV_U32_I64)[m
[31m-LJFOLD(CONV SUB IRCONV_U32_I64)[m
[31m-LJFOLD(CONV MUL IRCONV_U32_I64)[m
[31m-LJFOLD(CONV ADD IRCONV_U32_U64)[m
[31m-LJFOLD(CONV SUB IRCONV_U32_U64)[m
[31m-LJFOLD(CONV MUL IRCONV_U32_U64)[m
[31m-LJFOLDF(simplify_conv_narrow)[m
[31m-{[m
[31m-  IROp op = (IROp)fleft->o;[m
[31m-  IRType t = irt_type(fins->t);[m
[31m-  IRRef op1 = fleft->op1, op2 = fleft->op2, mode = fins->op2;[m
[31m-  PHIBARRIER(fleft);[m
[31m-  op1 = emitir(IRTI(IR_CONV), op1, mode);[m
[31m-  op2 = emitir(IRTI(IR_CONV), op2, mode);[m
[31m-  fins->ot = IRT(op, t);[m
[31m-  fins->op1 = op1;[m
[31m-  fins->op2 = op2;[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Special CSE rule for CONV. */[m
[31m-LJFOLD(CONV any any)[m
[31m-LJFOLDF(cse_conv)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {[m
[31m-    IRRef op1 = fins->op1, op2 = (fins->op2 & IRCONV_MODEMASK);[m
[31m-    uint8_t guard = irt_isguard(fins->t);[m
[31m-    IRRef ref = J->chain[IR_CONV];[m
[31m-    while (ref > op1) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      /* Commoning with stronger checks is ok. */[m
[31m-      if (ir->op1 == op1 && (ir->op2 & IRCONV_MODEMASK) == op2 &&[m
[31m-	  irt_isguard(ir->t) >= guard)[m
[31m-	return ref;[m
[31m-      ref = ir->prev;[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;  /* No fallthrough to regular CSE. */[m
[31m-}[m
[31m-[m
[31m-/* FP conversion narrowing. */[m
[31m-LJFOLD(TOBIT ADD KNUM)[m
[31m-LJFOLD(TOBIT SUB KNUM)[m
[31m-LJFOLD(CONV ADD IRCONV_INT_NUM)[m
[31m-LJFOLD(CONV SUB IRCONV_INT_NUM)[m
[31m-LJFOLD(CONV ADD IRCONV_I64_NUM)[m
[31m-LJFOLD(CONV SUB IRCONV_I64_NUM)[m
[31m-LJFOLDF(narrow_convert)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  /* Narrowing ignores PHIs and repeating it inside the loop is not useful. */[m
[31m-  if (J->chain[IR_LOOP])[m
[31m-    return NEXTFOLD;[m
[31m-  lua_assert(fins->o != IR_CONV || (fins->op2&IRCONV_CONVMASK) != IRCONV_TOBIT);[m
[31m-  return lj_opt_narrow_convert(J);[m
[31m-}[m
[31m-[m
[31m-/* -- Integer algebraic simplifications ----------------------------------- */[m
[31m-[m
[31m-LJFOLD(ADD any KINT)[m
[31m-LJFOLD(ADDOV any KINT)[m
[31m-LJFOLD(SUBOV any KINT)[m
[31m-LJFOLDF(simplify_intadd_k)[m
[31m-{[m
[31m-  if (fright->i == 0)  /* i o 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MULOV any KINT)[m
[31m-LJFOLDF(simplify_intmul_k)[m
[31m-{[m
[31m-  if (fright->i == 0)  /* i * 0 ==> 0 */[m
[31m-    return RIGHTFOLD;[m
[31m-  if (fright->i == 1)  /* i * 1 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  if (fright->i == 2) {  /* i * 2 ==> i + i */[m
[31m-    fins->o = IR_ADDOV;[m
[31m-    fins->op2 = fins->op1;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any KINT)[m
[31m-LJFOLDF(simplify_intsub_k)[m
[31m-{[m
[31m-  if (fright->i == 0)  /* i - 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  fins->o = IR_ADD;  /* i - k ==> i + (-k) */[m
[31m-  fins->op2 = (IRRef1)lj_ir_kint(J, -fright->i);  /* Overflow for -2^31 ok. */[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB KINT any)[m
[31m-LJFOLD(SUB KINT64 any)[m
[31m-LJFOLDF(simplify_intsub_kleft)[m
[31m-{[m
[31m-  if (fleft->o == IR_KINT ? (fleft->i == 0) : (ir_kint64(fleft)->u64 == 0)) {[m
[31m-    fins->o = IR_NEG;  /* 0 - i ==> -i */[m
[31m-    fins->op1 = fins->op2;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD any KINT64)[m
[31m-LJFOLDF(simplify_intadd_k64)[m
[31m-{[m
[31m-  if (ir_kint64(fright)->u64 == 0)  /* i + 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any KINT64)[m
[31m-LJFOLDF(simplify_intsub_k64)[m
[31m-{[m
[31m-  uint64_t k = ir_kint64(fright)->u64;[m
[31m-  if (k == 0)  /* i - 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  fins->o = IR_ADD;  /* i - k ==> i + (-k) */[m
[31m-  fins->op2 = (IRRef1)lj_ir_kint64(J, (uint64_t)-(int64_t)k);[m
[31m-  return RETRYFOLD;[m
[31m-}[m
[31m-[m
[31m-static TRef simplify_intmul_k(jit_State *J, int32_t k)[m
[31m-{[m
[31m-  /* Note: many more simplifications are possible, e.g. 2^k1 +- 2^k2.[m
[31m-  ** But this is mainly intended for simple address arithmetic.[m
[31m-  ** Also it's easier for the backend to optimize the original multiplies.[m
[31m-  */[m
[31m-  if (k == 0) {  /* i * 0 ==> 0 */[m
[31m-    return RIGHTFOLD;[m
[31m-  } else if (k == 1) {  /* i * 1 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  } else if ((k & (k-1)) == 0) {  /* i * 2^k ==> i << k */[m
[31m-    fins->o = IR_BSHL;[m
[31m-    fins->op2 = lj_ir_kint(J, lj_fls((uint32_t)k));[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL any KINT)[m
[31m-LJFOLDF(simplify_intmul_k32)[m
[31m-{[m
[31m-  if (fright->i >= 0)[m
[31m-    return simplify_intmul_k(J, fright->i);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MUL any KINT64)[m
[31m-LJFOLDF(simplify_intmul_k64)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  if (ir_kint64(fright)->u64 < 0x80000000u)[m
[31m-    return simplify_intmul_k(J, (int32_t)ir_kint64(fright)->u64);[m
[31m-  return NEXTFOLD;[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MOD any KINT)[m
[31m-LJFOLDF(simplify_intmod_k)[m
[31m-{[m
[31m-  int32_t k = fright->i;[m
[31m-  lua_assert(k != 0);[m
[31m-  if (k > 0 && (k & (k-1)) == 0) {  /* i % (2^k) ==> i & (2^k-1) */[m
[31m-    fins->o = IR_BAND;[m
[31m-    fins->op2 = lj_ir_kint(J, k-1);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MOD KINT any)[m
[31m-LJFOLDF(simplify_intmod_kleft)[m
[31m-{[m
[31m-  if (fleft->i == 0)[m
[31m-    return INTFOLD(0);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any any)[m
[31m-LJFOLD(SUBOV any any)[m
[31m-LJFOLDF(simplify_intsub)[m
[31m-{[m
[31m-  if (fins->op1 == fins->op2 && !irt_isnum(fins->t))  /* i - i ==> 0 */[m
[31m-    return irt_is64(fins->t) ? INT64FOLD(0) : INTFOLD(0);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB ADD any)[m
[31m-LJFOLDF(simplify_intsubadd_leftcancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fleft);[m
[31m-    if (fins->op2 == fleft->op1)  /* (i + j) - i ==> j */[m
[31m-      return fleft->op2;[m
[31m-    if (fins->op2 == fleft->op2)  /* (i + j) - j ==> i */[m
[31m-      return fleft->op1;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB SUB any)[m
[31m-LJFOLDF(simplify_intsubsub_leftcancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fleft);[m
[31m-    if (fins->op2 == fleft->op1) {  /* (i - j) - i ==> 0 - j */[m
[31m-      fins->op1 = (IRRef1)lj_ir_kint(J, 0);[m
[31m-      fins->op2 = fleft->op2;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any SUB)[m
[31m-LJFOLDF(simplify_intsubsub_rightcancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fright);[m
[31m-    if (fins->op1 == fright->op1)  /* i - (i - j) ==> j */[m
[31m-      return fright->op2;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB any ADD)[m
[31m-LJFOLDF(simplify_intsubadd_rightcancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fright);[m
[31m-    if (fins->op1 == fright->op1) {  /* i - (i + j) ==> 0 - j */[m
[31m-      fins->op2 = fright->op2;[m
[31m-      fins->op1 = (IRRef1)lj_ir_kint(J, 0);[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-    if (fins->op1 == fright->op2) {  /* i - (j + i) ==> 0 - j */[m
[31m-      fins->op2 = fright->op1;[m
[31m-      fins->op1 = (IRRef1)lj_ir_kint(J, 0);[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(SUB ADD ADD)[m
[31m-LJFOLDF(simplify_intsubaddadd_cancel)[m
[31m-{[m
[31m-  if (!irt_isnum(fins->t)) {[m
[31m-    PHIBARRIER(fleft);[m
[31m-    PHIBARRIER(fright);[m
[31m-    if (fleft->op1 == fright->op1) {  /* (i + j1) - (i + j2) ==> j1 - j2 */[m
[31m-      fins->op1 = fleft->op2;[m
[31m-      fins->op2 = fright->op2;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-    if (fleft->op1 == fright->op2) {  /* (i + j1) - (j2 + i) ==> j1 - j2 */[m
[31m-      fins->op1 = fleft->op2;[m
[31m-      fins->op2 = fright->op1;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-    if (fleft->op2 == fright->op1) {  /* (j1 + i) - (i + j2) ==> j1 - j2 */[m
[31m-      fins->op1 = fleft->op1;[m
[31m-      fins->op2 = fright->op2;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-    if (fleft->op2 == fright->op2) {  /* (j1 + i) - (j2 + i) ==> j1 - j2 */[m
[31m-      fins->op1 = fleft->op1;[m
[31m-      fins->op2 = fright->op1;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BAND any KINT)[m
[31m-LJFOLD(BAND any KINT64)[m
[31m-LJFOLDF(simplify_band_k)[m
[31m-{[m
[31m-  int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :[m
[31m-				     (int64_t)ir_k64(fright)->u64;[m
[31m-  if (k == 0)  /* i & 0 ==> 0 */[m
[31m-    return RIGHTFOLD;[m
[31m-  if (k == -1)  /* i & -1 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BOR any KINT)[m
[31m-LJFOLD(BOR any KINT64)[m
[31m-LJFOLDF(simplify_bor_k)[m
[31m-{[m
[31m-  int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :[m
[31m-				     (int64_t)ir_k64(fright)->u64;[m
[31m-  if (k == 0)  /* i | 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  if (k == -1)  /* i | -1 ==> -1 */[m
[31m-    return RIGHTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BXOR any KINT)[m
[31m-LJFOLD(BXOR any KINT64)[m
[31m-LJFOLDF(simplify_bxor_k)[m
[31m-{[m
[31m-  int64_t k = fright->o == IR_KINT ? (int64_t)fright->i :[m
[31m-				     (int64_t)ir_k64(fright)->u64;[m
[31m-  if (k == 0)  /* i xor 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  if (k == -1) {  /* i xor -1 ==> ~i */[m
[31m-    fins->o = IR_BNOT;[m
[31m-    fins->op2 = 0;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL any KINT)[m
[31m-LJFOLD(BSHR any KINT)[m
[31m-LJFOLD(BSAR any KINT)[m
[31m-LJFOLD(BROL any KINT)[m
[31m-LJFOLD(BROR any KINT)[m
[31m-LJFOLDF(simplify_shift_ik)[m
[31m-{[m
[31m-  int32_t mask = irt_is64(fins->t) ? 63 : 31;[m
[31m-  int32_t k = (fright->i & mask);[m
[31m-  if (k == 0)  /* i o 0 ==> i */[m
[31m-    return LEFTFOLD;[m
[31m-  if (k == 1 && fins->o == IR_BSHL) {  /* i << 1 ==> i + i */[m
[31m-    fins->o = IR_ADD;[m
[31m-    fins->op2 = fins->op1;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  if (k != fright->i) {  /* i o k ==> i o (k & mask) */[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, k);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-#ifndef LJ_TARGET_UNIFYROT[m
[31m-  if (fins->o == IR_BROR) {  /* bror(i, k) ==> brol(i, (-k)&mask) */[m
[31m-    fins->o = IR_BROL;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-#endif[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL any BAND)[m
[31m-LJFOLD(BSHR any BAND)[m
[31m-LJFOLD(BSAR any BAND)[m
[31m-LJFOLD(BROL any BAND)[m
[31m-LJFOLD(BROR any BAND)[m
[31m-LJFOLDF(simplify_shift_andk)[m
[31m-{[m
[31m-  IRIns *irk = IR(fright->op2);[m
[31m-  PHIBARRIER(fright);[m
[31m-  if ((fins->o < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) &&[m
[31m-      irk->o == IR_KINT) {  /* i o (j & mask) ==> i o j */[m
[31m-    int32_t mask = irt_is64(fins->t) ? 63 : 31;[m
[31m-    int32_t k = irk->i & mask;[m
[31m-    if (k == mask) {[m
[31m-      fins->op2 = fright->op1;[m
[31m-      return RETRYFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL KINT any)[m
[31m-LJFOLD(BSHR KINT any)[m
[31m-LJFOLD(BSHL KINT64 any)[m
[31m-LJFOLD(BSHR KINT64 any)[m
[31m-LJFOLDF(simplify_shift1_ki)[m
[31m-{[m
[31m-  int64_t k = fleft->o == IR_KINT ? (int64_t)fleft->i :[m
[31m-				    (int64_t)ir_k64(fleft)->u64;[m
[31m-  if (k == 0)  /* 0 o i ==> 0 */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSAR KINT any)[m
[31m-LJFOLD(BROL KINT any)[m
[31m-LJFOLD(BROR KINT any)[m
[31m-LJFOLD(BSAR KINT64 any)[m
[31m-LJFOLD(BROL KINT64 any)[m
[31m-LJFOLD(BROR KINT64 any)[m
[31m-LJFOLDF(simplify_shift2_ki)[m
[31m-{[m
[31m-  int64_t k = fleft->o == IR_KINT ? (int64_t)fleft->i :[m
[31m-				    (int64_t)ir_k64(fleft)->u64;[m
[31m-  if (k == 0 || k == -1)  /* 0 o i ==> 0; -1 o i ==> -1 */[m
[31m-    return LEFTFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL BAND KINT)[m
[31m-LJFOLD(BSHR BAND KINT)[m
[31m-LJFOLD(BROL BAND KINT)[m
[31m-LJFOLD(BROR BAND KINT)[m
[31m-LJFOLDF(simplify_shiftk_andk)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (irk->o == IR_KINT) {  /* (i & k1) o k2 ==> (i o k2) & (k1 o k2) */[m
[31m-    int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op1 = (IRRef1)lj_opt_fold(J);[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, k);[m
[31m-    fins->ot = IRTI(IR_BAND);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BAND BSHL KINT)[m
[31m-LJFOLD(BAND BSHR KINT)[m
[31m-LJFOLDF(simplify_andk_shiftk)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  if (irk->o == IR_KINT &&[m
[31m-      kfold_intop(-1, irk->i, (IROp)fleft->o) == fright->i)[m
[31m-    return LEFTFOLD;  /* (i o k1) & k2 ==> i, if (-1 o k1) == k2 */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Reassociation ------------------------------------------------------- */[m
[31m-[m
[31m-LJFOLD(ADD ADD KINT)[m
[31m-LJFOLD(MUL MUL KINT)[m
[31m-LJFOLD(BAND BAND KINT)[m
[31m-LJFOLD(BOR BOR KINT)[m
[31m-LJFOLD(BXOR BXOR KINT)[m
[31m-LJFOLDF(reassoc_intarith_k)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  if (irk->o == IR_KINT) {[m
[31m-    int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);[m
[31m-    if (k == irk->i)  /* (i o k1) o k2 ==> i o k1, if (k1 o k2) == k1. */[m
[31m-      return LEFTFOLD;[m
[31m-    PHIBARRIER(fleft);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, k);[m
[31m-    return RETRYFOLD;  /* (i o k1) o k2 ==> i o (k1 o k2) */[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(ADD ADD KINT64)[m
[31m-LJFOLD(MUL MUL KINT64)[m
[31m-LJFOLD(BAND BAND KINT64)[m
[31m-LJFOLD(BOR BOR KINT64)[m
[31m-LJFOLD(BXOR BXOR KINT64)[m
[31m-LJFOLDF(reassoc_intarith_k64)[m
[31m-{[m
[31m-#if LJ_HASFFI[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  if (irk->o == IR_KINT64) {[m
[31m-    uint64_t k = kfold_int64arith(ir_k64(irk)->u64,[m
[31m-				  ir_k64(fright)->u64, (IROp)fins->o);[m
[31m-    PHIBARRIER(fleft);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint64(J, k);[m
[31m-    return RETRYFOLD;  /* (i o k1) o k2 ==> i o (k1 o k2) */[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-#else[m
[31m-  UNUSED(J); lua_assert(0); return FAILFOLD;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MIN MIN any)[m
[31m-LJFOLD(MAX MAX any)[m
[31m-LJFOLD(BAND BAND any)[m
[31m-LJFOLD(BOR BOR any)[m
[31m-LJFOLDF(reassoc_dup)[m
[31m-{[m
[31m-  if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2)[m
[31m-    return LEFTFOLD;  /* (a o b) o a ==> a o b; (a o b) o b ==> a o b */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BXOR BXOR any)[m
[31m-LJFOLDF(reassoc_bxor)[m
[31m-{[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (fins->op2 == fleft->op1)  /* (a xor b) xor a ==> b */[m
[31m-    return fleft->op2;[m
[31m-  if (fins->op2 == fleft->op2)  /* (a xor b) xor b ==> a */[m
[31m-    return fleft->op1;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BSHL BSHL KINT)[m
[31m-LJFOLD(BSHR BSHR KINT)[m
[31m-LJFOLD(BSAR BSAR KINT)[m
[31m-LJFOLD(BROL BROL KINT)[m
[31m-LJFOLD(BROR BROR KINT)[m
[31m-LJFOLDF(reassoc_shift)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  PHIBARRIER(fleft);  /* The (shift any KINT) rule covers k2 == 0 and more. */[m
[31m-  if (irk->o == IR_KINT) {  /* (i o k1) o k2 ==> i o (k1 + k2) */[m
[31m-    int32_t mask = irt_is64(fins->t) ? 63 : 31;[m
[31m-    int32_t k = (irk->i & mask) + (fright->i & mask);[m
[31m-    if (k > mask) {  /* Combined shift too wide? */[m
[31m-      if (fins->o == IR_BSHL || fins->o == IR_BSHR)[m
[31m-	return mask == 31 ? INTFOLD(0) : INT64FOLD(0);[m
[31m-      else if (fins->o == IR_BSAR)[m
[31m-	k = mask;[m
[31m-      else[m
[31m-	k &= mask;[m
[31m-    }[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, k);[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MIN MIN KNUM)[m
[31m-LJFOLD(MAX MAX KNUM)[m
[31m-LJFOLD(MIN MIN KINT)[m
[31m-LJFOLD(MAX MAX KINT)[m
[31m-LJFOLDF(reassoc_minmax_k)[m
[31m-{[m
[31m-  IRIns *irk = IR(fleft->op2);[m
[31m-  if (irk->o == IR_KNUM) {[m
[31m-    lua_Number a = ir_knum(irk)->n;[m
[31m-    lua_Number y = lj_vm_foldarith(a, knumright, fins->o - IR_ADD);[m
[31m-    if (a == y)  /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */[m
[31m-      return LEFTFOLD;[m
[31m-    PHIBARRIER(fleft);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_knum(J, y);[m
[31m-    return RETRYFOLD;  /* (x o k1) o k2 ==> x o (k1 o k2) */[m
[31m-  } else if (irk->o == IR_KINT) {[m
[31m-    int32_t a = irk->i;[m
[31m-    int32_t y = kfold_intop(a, fright->i, fins->o);[m
[31m-    if (a == y)  /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */[m
[31m-      return LEFTFOLD;[m
[31m-    PHIBARRIER(fleft);[m
[31m-    fins->op1 = fleft->op1;[m
[31m-    fins->op2 = (IRRef1)lj_ir_kint(J, y);[m
[31m-    return RETRYFOLD;  /* (x o k1) o k2 ==> x o (k1 o k2) */[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MIN MAX any)[m
[31m-LJFOLD(MAX MIN any)[m
[31m-LJFOLDF(reassoc_minmax_left)[m
[31m-{[m
[31m-  if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2)[m
[31m-    return RIGHTFOLD;  /* (b o1 a) o2 b ==> b; (a o1 b) o2 b ==> b */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(MIN any MAX)[m
[31m-LJFOLD(MAX any MIN)[m
[31m-LJFOLDF(reassoc_minmax_right)[m
[31m-{[m
[31m-  if (fins->op1 == fright->op1 || fins->op1 == fright->op2)[m
[31m-    return LEFTFOLD;  /* a o2 (a o1 b) ==> a; a o2 (b o1 a) ==> a */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Array bounds check elimination -------------------------------------- */[m
[31m-[m
[31m-/* Eliminate ABC across PHIs to handle t[i-1] forwarding case.[m
[31m-** ABC(asize, (i+k)+(-k)) ==> ABC(asize, i), but only if it already exists.[m
[31m-** Could be generalized to (i+k1)+k2 ==> i+(k1+k2), but needs better disambig.[m
[31m-*/[m
[31m-LJFOLD(ABC any ADD)[m
[31m-LJFOLDF(abc_fwd)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_ABC)) {[m
[31m-    if (irref_isk(fright->op2)) {[m
[31m-      IRIns *add2 = IR(fright->op1);[m
[31m-      if (add2->o == IR_ADD && irref_isk(add2->op2) &&[m
[31m-	  IR(fright->op2)->i == -IR(add2->op2)->i) {[m
[31m-	IRRef ref = J->chain[IR_ABC];[m
[31m-	IRRef lim = add2->op1;[m
[31m-	if (fins->op1 > lim) lim = fins->op1;[m
[31m-	while (ref > lim) {[m
[31m-	  IRIns *ir = IR(ref);[m
[31m-	  if (ir->op1 == fins->op1 && ir->op2 == add2->op1)[m
[31m-	    return DROPFOLD;[m
[31m-	  ref = ir->prev;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Eliminate ABC for constants.[m
[31m-** ABC(asize, k1), ABC(asize k2) ==> ABC(asize, max(k1, k2))[m
[31m-** Drop second ABC if k2 is lower. Otherwise patch first ABC with k2.[m
[31m-*/[m
[31m-LJFOLD(ABC any KINT)[m
[31m-LJFOLDF(abc_k)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_ABC)) {[m
[31m-    IRRef ref = J->chain[IR_ABC];[m
[31m-    IRRef asize = fins->op1;[m
[31m-    while (ref > asize) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      if (ir->op1 == asize && irref_isk(ir->op2)) {[m
[31m-	int32_t k = IR(ir->op2)->i;[m
[31m-	if (fright->i > k)[m
[31m-	  ir->op2 = fins->op2;[m
[31m-	return DROPFOLD;[m
[31m-      }[m
[31m-      ref = ir->prev;[m
[31m-    }[m
[31m-    return EMITFOLD;  /* Already performed CSE. */[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Eliminate invariant ABC inside loop. */[m
[31m-LJFOLD(ABC any any)[m
[31m-LJFOLDF(abc_invar)[m
[31m-{[m
[31m-  /* Invariant ABC marked as PTR. Drop if op1 is invariant, too. */[m
[31m-  if (!irt_isint(fins->t) && fins->op1 < J->chain[IR_LOOP] &&[m
[31m-      !irt_isphi(IR(fins->op1)->t))[m
[31m-    return DROPFOLD;[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Commutativity ------------------------------------------------------- */[m
[31m-[m
[31m-/* The refs of commutative ops are canonicalized. Lower refs go to the right.[m
[31m-** Rationale behind this:[m
[31m-** - It (also) moves constants to the right.[m
[31m-** - It reduces the number of FOLD rules (e.g. (BOR any KINT) suffices).[m
[31m-** - It helps CSE to find more matches.[m
[31m-** - The assembler generates better code with constants at the right.[m
[31m-*/[m
[31m-[m
[31m-LJFOLD(ADD any any)[m
[31m-LJFOLD(MUL any any)[m
[31m-LJFOLD(ADDOV any any)[m
[31m-LJFOLD(MULOV any any)[m
[31m-LJFOLDF(comm_swap)[m
[31m-{[m
[31m-  if (fins->op1 < fins->op2) {  /* Move lower ref to the right. */[m
[31m-    IRRef1 tmp = fins->op1;[m
[31m-    fins->op1 = fins->op2;[m
[31m-    fins->op2 = tmp;[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(EQ any any)[m
[31m-LJFOLD(NE any any)[m
[31m-LJFOLDF(comm_equal)[m
[31m-{[m
[31m-  /* For non-numbers only: x == x ==> drop; x ~= x ==> fail */[m
[31m-  if (fins->op1 == fins->op2 && !irt_isnum(fins->t))[m
[31m-    return CONDFOLD(fins->o == IR_EQ);[m
[31m-  return fold_comm_swap(J);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(LT any any)[m
[31m-LJFOLD(GE any any)[m
[31m-LJFOLD(LE any any)[m
[31m-LJFOLD(GT any any)[m
[31m-LJFOLD(ULT any any)[m
[31m-LJFOLD(UGE any any)[m
[31m-LJFOLD(ULE any any)[m
[31m-LJFOLD(UGT any any)[m
[31m-LJFOLDF(comm_comp)[m
[31m-{[m
[31m-  /* For non-numbers only: x <=> x ==> drop; x <> x ==> fail */[m
[31m-  if (fins->op1 == fins->op2 && !irt_isnum(fins->t))[m
[31m-    return CONDFOLD((fins->o ^ (fins->o >> 1)) & 1);[m
[31m-  if (fins->op1 < fins->op2) {  /* Move lower ref to the right. */[m
[31m-    IRRef1 tmp = fins->op1;[m
[31m-    fins->op1 = fins->op2;[m
[31m-    fins->op2 = tmp;[m
[31m-    fins->o ^= 3; /* GT <-> LT, GE <-> LE, does not affect U */[m
[31m-    return RETRYFOLD;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BAND any any)[m
[31m-LJFOLD(BOR any any)[m
[31m-LJFOLD(MIN any any)[m
[31m-LJFOLD(MAX any any)[m
[31m-LJFOLDF(comm_dup)[m
[31m-{[m
[31m-  if (fins->op1 == fins->op2)  /* x o x ==> x */[m
[31m-    return LEFTFOLD;[m
[31m-  return fold_comm_swap(J);[m
[31m-}[m
[31m-[m
[31m-LJFOLD(BXOR any any)[m
[31m-LJFOLDF(comm_bxor)[m
[31m-{[m
[31m-  if (fins->op1 == fins->op2)  /* i xor i ==> 0 */[m
[31m-    return irt_is64(fins->t) ? INT64FOLD(0) : INTFOLD(0);[m
[31m-  return fold_comm_swap(J);[m
[31m-}[m
[31m-[m
[31m-/* -- Simplification of compound expressions ------------------------------ */[m
[31m-[m
[31m-static TRef kfold_xload(jit_State *J, IRIns *ir, const void *p)[m
[31m-{[m
[31m-  int32_t k;[m
[31m-  switch (irt_type(ir->t)) {[m
[31m-  case IRT_NUM: return lj_ir_knum_u64(J, *(uint64_t *)p);[m
[31m-  case IRT_I8: k = (int32_t)*(int8_t *)p; break;[m
[31m-  case IRT_U8: k = (int32_t)*(uint8_t *)p; break;[m
[31m-  case IRT_I16: k = (int32_t)(int16_t)lj_getu16(p); break;[m
[31m-  case IRT_U16: k = (int32_t)(uint16_t)lj_getu16(p); break;[m
[31m-  case IRT_INT: case IRT_U32: k = (int32_t)lj_getu32(p); break;[m
[31m-  case IRT_I64: case IRT_U64: return lj_ir_kint64(J, *(uint64_t *)p);[m
[31m-  default: return 0;[m
[31m-  }[m
[31m-  return lj_ir_kint(J, k);[m
[31m-}[m
[31m-[m
[31m-/* Turn: string.sub(str, a, b) == kstr[m
[31m-** into: string.byte(str, a) == string.byte(kstr, 1) etc.[m
[31m-** Note: this creates unaligned XLOADs on x86/x64.[m
[31m-*/[m
[31m-LJFOLD(EQ SNEW KGC)[m
[31m-LJFOLD(NE SNEW KGC)[m
[31m-LJFOLDF(merge_eqne_snew_kgc)[m
[31m-{[m
[31m-  GCstr *kstr = ir_kstr(fright);[m
[31m-  int32_t len = (int32_t)kstr->len;[m
[31m-  lua_assert(irt_isstr(fins->t));[m
[31m-[m
[31m-#if LJ_TARGET_UNALIGNED[m
[31m-#define FOLD_SNEW_MAX_LEN	4  /* Handle string lengths 0, 1, 2, 3, 4. */[m
[31m-#define FOLD_SNEW_TYPE8		IRT_I8	/* Creates shorter immediates. */[m
[31m-#else[m
[31m-#define FOLD_SNEW_MAX_LEN	1  /* Handle string lengths 0 or 1. */[m
[31m-#define FOLD_SNEW_TYPE8		IRT_U8  /* Prefer unsigned loads. */[m
[31m-#endif[m
[31m-[m
[31m-  PHIBARRIER(fleft);[m
[31m-  if (len <= FOLD_SNEW_MAX_LEN) {[m
[31m-    IROp op = (IROp)fins->o;[m
[31m-    IRRef strref = fleft->op1;[m
[31m-    if (IR(strref)->o != IR_STRREF)[m
[31m-      return NEXTFOLD;[m
[31m-    if (op == IR_EQ) {[m
[31m-      emitir(IRTGI(IR_EQ), fleft->op2, lj_ir_kint(J, len));[m
[31m-      /* Caveat: fins/fleft/fright is no longer valid after emitir. */[m
[31m-    } else {[m
[31m-      /* NE is not expanded since this would need an OR of two conds. */[m
[31m-      if (!irref_isk(fleft->op2))  /* Only handle the constant length case. */[m
[31m-	return NEXTFOLD;[m
[31m-      if (IR(fleft->op2)->i != len)[m
[31m-	return DROPFOLD;[m
[31m-    }[m
[31m-    if (len > 0) {[m
[31m-      /* A 4 byte load for length 3 is ok -- all strings have an extra NUL. */[m
[31m-      uint16_t ot = (uint16_t)(len == 1 ? IRT(IR_XLOAD, FOLD_SNEW_TYPE8) :[m
[31m-			       len == 2 ? IRT(IR_XLOAD, IRT_U16) :[m
[31m-			       IRTI(IR_XLOAD));[m
[31m-      TRef tmp = emitir(ot, strref,[m
[31m-			IRXLOAD_READONLY | (len > 1 ? IRXLOAD_UNALIGNED : 0));[m
[31m-      TRef val = kfold_xload(J, IR(tref_ref(tmp)), strdata(kstr));[m
[31m-      if (len == 3)[m
[31m-	tmp = emitir(IRTI(IR_BAND), tmp,[m
[31m-		     lj_ir_kint(J, LJ_ENDIAN_SELECT(0x00ffffff, 0xffffff00)));[m
[31m-      fins->op1 = (IRRef1)tmp;[m
[31m-      fins->op2 = (IRRef1)val;[m
[31m-      fins->ot = (IROpT)IRTGI(op);[m
[31m-      return RETRYFOLD;[m
[31m-    } else {[m
[31m-      return DROPFOLD;[m
[31m-    }[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Loads --------------------------------------------------------------- */[m
[31m-[m
[31m-/* Loads cannot be folded or passed on to CSE in general.[m
[31m-** Alias analysis is needed to check for forwarding opportunities.[m
[31m-**[m
[31m-** Caveat: *all* loads must be listed here or they end up at CSE![m
[31m-*/[m
[31m-[m
[31m-LJFOLD(ALOAD any)[m
[31m-LJFOLDX(lj_opt_fwd_aload)[m
[31m-[m
[31m-/* From HREF fwd (see below). Must eliminate, not supported by fwd/backend. */[m
[31m-LJFOLD(HLOAD KKPTR)[m
[31m-LJFOLDF(kfold_hload_kkptr)[m
[31m-{[m
[31m-  UNUSED(J);[m
[31m-  lua_assert(ir_kptr(fleft) == niltvg(J2G(J)));[m
[31m-  return TREF_NIL;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(HLOAD any)[m
[31m-LJFOLDX(lj_opt_fwd_hload)[m
[31m-[m
[31m-LJFOLD(ULOAD any)[m
[31m-LJFOLDX(lj_opt_fwd_uload)[m
[31m-[m
[31m-LJFOLD(CALLL any IRCALL_lj_tab_len)[m
[31m-LJFOLDX(lj_opt_fwd_tab_len)[m
[31m-[m
[31m-/* Upvalue refs are really loads, but there are no corresponding stores.[m
[31m-** So CSE is ok for them, except for UREFO across a GC step (see below).[m
[31m-** If the referenced function is const, its upvalue addresses are const, too.[m
[31m-** This can be used to improve CSE by looking for the same address,[m
[31m-** even if the upvalues originate from a different function.[m
[31m-*/[m
[31m-LJFOLD(UREFO KGC any)[m
[31m-LJFOLD(UREFC KGC any)[m
[31m-LJFOLDF(cse_uref)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {[m
[31m-    IRRef ref = J->chain[fins->o];[m
[31m-    GCfunc *fn = ir_kfunc(fleft);[m
[31m-    GCupval *uv = gco2uv(gcref(fn->l.uvptr[(fins->op2 >> 8)]));[m
[31m-    while (ref > 0) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      if (irref_isk(ir->op1)) {[m
[31m-	GCfunc *fn2 = ir_kfunc(IR(ir->op1));[m
[31m-	if (gco2uv(gcref(fn2->l.uvptr[(ir->op2 >> 8)])) == uv) {[m
[31m-	  if (fins->o == IR_UREFO && gcstep_barrier(J, ref))[m
[31m-	    break;[m
[31m-	  return ref;[m
[31m-	}[m
[31m-      }[m
[31m-      ref = ir->prev;[m
[31m-    }[m
[31m-  }[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(HREFK any any)[m
[31m-LJFOLDX(lj_opt_fwd_hrefk)[m
[31m-[m
[31m-LJFOLD(HREF TNEW any)[m
[31m-LJFOLDF(fwd_href_tnew)[m
[31m-{[m
[31m-  if (lj_opt_fwd_href_nokey(J))[m
[31m-    return lj_ir_kkptr(J, niltvg(J2G(J)));[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(HREF TDUP KPRI)[m
[31m-LJFOLD(HREF TDUP KGC)[m
[31m-LJFOLD(HREF TDUP KNUM)[m
[31m-LJFOLDF(fwd_href_tdup)[m
[31m-{[m
[31m-  TValue keyv;[m
[31m-  lj_ir_kvalue(J->L, &keyv, fright);[m
[31m-  if (lj_tab_get(J->L, ir_ktab(IR(fleft->op1)), &keyv) == niltvg(J2G(J)) &&[m
[31m-      lj_opt_fwd_href_nokey(J))[m
[31m-    return lj_ir_kkptr(J, niltvg(J2G(J)));[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* We can safely FOLD/CSE array/hash refs and field loads, since there[m
[31m-** are no corresponding stores. But we need to check for any NEWREF with[m
[31m-** an aliased table, as it may invalidate all of the pointers and fields.[m
[31m-** Only HREF needs the NEWREF check -- AREF and HREFK already depend on[m
[31m-** FLOADs. And NEWREF itself is treated like a store (see below).[m
[31m-** LREF is constant (per trace) since coroutine switches are not inlined.[m
[31m-*/[m
[31m-LJFOLD(FLOAD TNEW IRFL_TAB_ASIZE)[m
[31m-LJFOLDF(fload_tab_tnew_asize)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))[m
[31m-    return INTFOLD(fleft->op1);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD TNEW IRFL_TAB_HMASK)[m
[31m-LJFOLDF(fload_tab_tnew_hmask)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))[m
[31m-    return INTFOLD((1 << fleft->op2)-1);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD TDUP IRFL_TAB_ASIZE)[m
[31m-LJFOLDF(fload_tab_tdup_asize)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))[m
[31m-    return INTFOLD((int32_t)ir_ktab(IR(fleft->op1))->asize);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD TDUP IRFL_TAB_HMASK)[m
[31m-LJFOLDF(fload_tab_tdup_hmask)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1))[m
[31m-    return INTFOLD((int32_t)ir_ktab(IR(fleft->op1))->hmask);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(HREF any any)[m
[31m-LJFOLD(FLOAD any IRFL_TAB_ARRAY)[m
[31m-LJFOLD(FLOAD any IRFL_TAB_NODE)[m
[31m-LJFOLD(FLOAD any IRFL_TAB_ASIZE)[m
[31m-LJFOLD(FLOAD any IRFL_TAB_HMASK)[m
[31m-LJFOLDF(fload_tab_ah)[m
[31m-{[m
[31m-  TRef tr = lj_opt_cse(J);[m
[31m-  return lj_opt_fwd_tptr(J, tref_ref(tr)) ? tr : EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Strings are immutable, so we can safely FOLD/CSE the related FLOAD. */[m
[31m-LJFOLD(FLOAD KGC IRFL_STR_LEN)[m
[31m-LJFOLDF(fload_str_len_kgc)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))[m
[31m-    return INTFOLD((int32_t)ir_kstr(fleft)->len);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD SNEW IRFL_STR_LEN)[m
[31m-LJFOLDF(fload_str_len_snew)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {[m
[31m-    PHIBARRIER(fleft);[m
[31m-    return fleft->op2;[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD TOSTR IRFL_STR_LEN)[m
[31m-LJFOLDF(fload_str_len_tostr)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fleft->op2 == IRTOSTR_CHAR)[m
[31m-    return INTFOLD(1);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* The C type ID of cdata objects is immutable. */[m
[31m-LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID)[m
[31m-LJFOLDF(fload_cdata_typeid_kgc)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))[m
[31m-    return INTFOLD((int32_t)ir_kcdata(fleft)->ctypeid);[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Get the contents of immutable cdata objects. */[m
[31m-LJFOLD(FLOAD KGC IRFL_CDATA_PTR)[m
[31m-LJFOLD(FLOAD KGC IRFL_CDATA_INT)[m
[31m-LJFOLD(FLOAD KGC IRFL_CDATA_INT64)[m
[31m-LJFOLDF(fload_cdata_int64_kgc)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {[m
[31m-    void *p = cdataptr(ir_kcdata(fleft));[m
[31m-    if (irt_is64(fins->t))[m
[31m-      return INT64FOLD(*(uint64_t *)p);[m
[31m-    else[m
[31m-      return INTFOLD(*(int32_t *)p);[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD CNEW IRFL_CDATA_CTYPEID)[m
[31m-LJFOLD(FLOAD CNEWI IRFL_CDATA_CTYPEID)[m
[31m-LJFOLDF(fload_cdata_typeid_cnew)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))[m
[31m-    return fleft->op1;  /* No PHI barrier needed. CNEW/CNEWI op1 is const. */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Pointer, int and int64 cdata objects are immutable. */[m
[31m-LJFOLD(FLOAD CNEWI IRFL_CDATA_PTR)[m
[31m-LJFOLD(FLOAD CNEWI IRFL_CDATA_INT)[m
[31m-LJFOLD(FLOAD CNEWI IRFL_CDATA_INT64)[m
[31m-LJFOLDF(fload_cdata_ptr_int64_cnew)[m
[31m-{[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))[m
[31m-    return fleft->op2;  /* Fold even across PHI to avoid allocations. */[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(FLOAD any IRFL_STR_LEN)[m
[31m-LJFOLD(FLOAD any IRFL_FUNC_ENV)[m
[31m-LJFOLD(FLOAD any IRFL_THREAD_ENV)[m
[31m-LJFOLD(FLOAD any IRFL_CDATA_CTYPEID)[m
[31m-LJFOLD(FLOAD any IRFL_CDATA_PTR)[m
[31m-LJFOLD(FLOAD any IRFL_CDATA_INT)[m
[31m-LJFOLD(FLOAD any IRFL_CDATA_INT64)[m
[31m-LJFOLD(VLOAD any any)  /* Vararg loads have no corresponding stores. */[m
[31m-LJFOLDX(lj_opt_cse)[m
[31m-[m
[31m-/* All other field loads need alias analysis. */[m
[31m-LJFOLD(FLOAD any any)[m
[31m-LJFOLDX(lj_opt_fwd_fload)[m
[31m-[m
[31m-/* This is for LOOP only. Recording handles SLOADs internally. */[m
[31m-LJFOLD(SLOAD any any)[m
[31m-LJFOLDF(fwd_sload)[m
[31m-{[m
[31m-  if ((fins->op2 & IRSLOAD_FRAME)) {[m
[31m-    TRef tr = lj_opt_cse(J);[m
[31m-    return tref_ref(tr) < J->chain[IR_RETF] ? EMITFOLD : tr;[m
[31m-  } else {[m
[31m-    lua_assert(J->slot[fins->op1] != 0);[m
[31m-    return J->slot[fins->op1];[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Only fold for KKPTR. The pointer _and_ the contents must be const. */[m
[31m-LJFOLD(XLOAD KKPTR any)[m
[31m-LJFOLDF(xload_kptr)[m
[31m-{[m
[31m-  TRef tr = kfold_xload(J, fins, ir_kptr(fleft));[m
[31m-  return tr ? tr : NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(XLOAD any any)[m
[31m-LJFOLDX(lj_opt_fwd_xload)[m
[31m-[m
[31m-/* -- Write barriers ------------------------------------------------------ */[m
[31m-[m
[31m-/* Write barriers are amenable to CSE, but not across any incremental[m
[31m-** GC steps.[m
[31m-**[m
[31m-** The same logic applies to open upvalue references, because a stack[m
[31m-** may be resized during a GC step (not the current stack, but maybe that[m
[31m-** of a coroutine).[m
[31m-*/[m
[31m-LJFOLD(TBAR any)[m
[31m-LJFOLD(OBAR any any)[m
[31m-LJFOLD(UREFO any any)[m
[31m-LJFOLDF(barrier_tab)[m
[31m-{[m
[31m-  TRef tr = lj_opt_cse(J);[m
[31m-  if (gcstep_barrier(J, tref_ref(tr)))  /* CSE across GC step? */[m
[31m-    return EMITFOLD;  /* Raw emit. Assumes fins is left intact by CSE. */[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-LJFOLD(TBAR TNEW)[m
[31m-LJFOLD(TBAR TDUP)[m
[31m-LJFOLDF(barrier_tnew_tdup)[m
[31m-{[m
[31m-  /* New tables are always white and never need a barrier. */[m
[31m-  if (fins->op1 < J->chain[IR_LOOP])  /* Except across a GC step. */[m
[31m-    return NEXTFOLD;[m
[31m-  return DROPFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Profiling ----------------------------------------------------------- */[m
[31m-[m
[31m-LJFOLD(PROF any any)[m
[31m-LJFOLDF(prof)[m
[31m-{[m
[31m-  IRRef ref = J->chain[IR_PROF];[m
[31m-  if (ref+1 == J->cur.nins)  /* Drop neighbouring IR_PROF. */[m
[31m-    return ref;[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Stores and allocations ---------------------------------------------- */[m
[31m-[m
[31m-/* Stores and allocations cannot be folded or passed on to CSE in general.[m
[31m-** But some stores can be eliminated with dead-store elimination (DSE).[m
[31m-**[m
[31m-** Caveat: *all* stores and allocs must be listed here or they end up at CSE![m
[31m-*/[m
[31m-[m
[31m-LJFOLD(ASTORE any any)[m
[31m-LJFOLD(HSTORE any any)[m
[31m-LJFOLDX(lj_opt_dse_ahstore)[m
[31m-[m
[31m-LJFOLD(USTORE any any)[m
[31m-LJFOLDX(lj_opt_dse_ustore)[m
[31m-[m
[31m-LJFOLD(FSTORE any any)[m
[31m-LJFOLDX(lj_opt_dse_fstore)[m
[31m-[m
[31m-LJFOLD(XSTORE any any)[m
[31m-LJFOLDX(lj_opt_dse_xstore)[m
[31m-[m
[31m-LJFOLD(NEWREF any any)  /* Treated like a store. */[m
[31m-LJFOLD(CALLA any any)[m
[31m-LJFOLD(CALLL any any)  /* Safeguard fallback. */[m
[31m-LJFOLD(CALLS any any)[m
[31m-LJFOLD(CALLXS any any)[m
[31m-LJFOLD(XBAR)[m
[31m-LJFOLD(RETF any any)  /* Modifies BASE. */[m
[31m-LJFOLD(TNEW any any)[m
[31m-LJFOLD(TDUP any)[m
[31m-LJFOLD(CNEW any any)[m
[31m-LJFOLD(XSNEW any any)[m
[31m-LJFOLD(BUFHDR any any)[m
[31m-LJFOLDX(lj_ir_emit)[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Every entry in the generated hash table is a 32 bit pattern:[m
[31m-**[m
[31m-** xxxxxxxx iiiiiii lllllll rrrrrrrrrr[m
[31m-**[m
[31m-**   xxxxxxxx = 8 bit index into fold function table[m
[31m-**    iiiiiii = 7 bit folded instruction opcode[m
[31m-**    lllllll = 7 bit left instruction opcode[m
[31m-** rrrrrrrrrr = 8 bit right instruction opcode or 10 bits from literal field[m
[31m-*/[m
[31m-[m
[31m-#include "lj_folddef.h"[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-/* Fold IR instruction. */[m
[31m-TRef LJ_FASTCALL lj_opt_fold(jit_State *J)[m
[31m-{[m
[31m-  uint32_t key, any;[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  if (LJ_UNLIKELY((J->flags & JIT_F_OPT_MASK) != JIT_F_OPT_DEFAULT)) {[m
[31m-    lua_assert(((JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE|JIT_F_OPT_DSE) |[m
[31m-		JIT_F_OPT_DEFAULT) == JIT_F_OPT_DEFAULT);[m
[31m-    /* Folding disabled? Chain to CSE, but not for loads/stores/allocs. */[m
[31m-    if (!(J->flags & JIT_F_OPT_FOLD) && irm_kind(lj_ir_mode[fins->o]) == IRM_N)[m
[31m-      return lj_opt_cse(J);[m
[31m-[m
[31m-    /* No FOLD, forwarding or CSE? Emit raw IR for loads, except for SLOAD. */[m
[31m-    if ((J->flags & (JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE)) !=[m
[31m-		    (JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE) &&[m
[31m-	irm_kind(lj_ir_mode[fins->o]) == IRM_L && fins->o != IR_SLOAD)[m
[31m-      return lj_ir_emit(J);[m
[31m-[m
[31m-    /* No FOLD or DSE? Emit raw IR for stores. */[m
[31m-    if ((J->flags & (JIT_F_OPT_FOLD|JIT_F_OPT_DSE)) !=[m
[31m-		    (JIT_F_OPT_FOLD|JIT_F_OPT_DSE) &&[m
[31m-	irm_kind(lj_ir_mode[fins->o]) == IRM_S)[m
[31m-      return lj_ir_emit(J);[m
[31m-  }[m
[31m-[m
[31m-  /* Fold engine start/retry point. */[m
[31m-retry:[m
[31m-  /* Construct key from opcode and operand opcodes (unless literal/none). */[m
[31m-  key = ((uint32_t)fins->o << 17);[m
[31m-  if (fins->op1 >= J->cur.nk) {[m
[31m-    key += (uint32_t)IR(fins->op1)->o << 10;[m
[31m-    *fleft = *IR(fins->op1);[m
[31m-  }[m
[31m-  if (fins->op2 >= J->cur.nk) {[m
[31m-    key += (uint32_t)IR(fins->op2)->o;[m
[31m-    *fright = *IR(fins->op2);[m
[31m-  } else {[m
[31m-    key += (fins->op2 & 0x3ffu);  /* Literal mask. Must include IRCONV_*MASK. */[m
[31m-  }[m
[31m-[m
[31m-  /* Check for a match in order from most specific to least specific. */[m
[31m-  any = 0;[m
[31m-  for (;;) {[m
[31m-    uint32_t k = key | (any & 0x1ffff);[m
[31m-    uint32_t h = fold_hashkey(k);[m
[31m-    uint32_t fh = fold_hash[h];  /* Lookup key in semi-perfect hash table. */[m
[31m-    if ((fh & 0xffffff) == k || (fh = fold_hash[h+1], (fh & 0xffffff) == k)) {[m
[31m-      ref = (IRRef)tref_ref(fold_func[fh >> 24](J));[m
[31m-      if (ref != NEXTFOLD)[m
[31m-	break;[m
[31m-    }[m
[31m-    if (any == 0xfffff)  /* Exhausted folding. Pass on to CSE. */[m
[31m-      return lj_opt_cse(J);[m
[31m-    any = (any | (any >> 10)) ^ 0xffc00;[m
[31m-  }[m
[31m-[m
[31m-  /* Return value processing, ordered by frequency. */[m
[31m-  if (LJ_LIKELY(ref >= MAX_FOLD))[m
[31m-    return TREF(ref, irt_t(IR(ref)->t));[m
[31m-  if (ref == RETRYFOLD)[m
[31m-    goto retry;[m
[31m-  if (ref == KINTFOLD)[m
[31m-    return lj_ir_kint(J, fins->i);[m
[31m-  if (ref == FAILFOLD)[m
[31m-    lj_trace_err(J, LJ_TRERR_GFAIL);[m
[31m-  lua_assert(ref == DROPFOLD);[m
[31m-  return REF_DROP;[m
[31m-}[m
[31m-[m
[31m-/* -- Common-Subexpression Elimination ------------------------------------ */[m
[31m-[m
[31m-/* CSE an IR instruction. This is very fast due to the skip-list chains. */[m
[31m-TRef LJ_FASTCALL lj_opt_cse(jit_State *J)[m
[31m-{[m
[31m-  /* Avoid narrow to wide store-to-load forwarding stall */[m
[31m-  IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16);[m
[31m-  IROp op = fins->o;[m
[31m-  if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) {[m
[31m-    /* Limited search for same operands in per-opcode chain. */[m
[31m-    IRRef ref = J->chain[op];[m
[31m-    IRRef lim = fins->op1;[m
[31m-    if (fins->op2 > lim) lim = fins->op2;  /* Relies on lit < REF_BIAS. */[m
[31m-    while (ref > lim) {[m
[31m-      if (IR(ref)->op12 == op12)[m
[31m-	return TREF(ref, irt_t(IR(ref)->t));  /* Common subexpression found. */[m
[31m-      ref = IR(ref)->prev;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Otherwise emit IR (inlined for speed). */[m
[31m-  {[m
[31m-    IRRef ref = lj_ir_nextins(J);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    ir->prev = J->chain[op];[m
[31m-    ir->op12 = op12;[m
[31m-    J->chain[op] = (IRRef1)ref;[m
[31m-    ir->o = fins->o;[m
[31m-    J->guardemit.irt |= fins->t.irt;[m
[31m-    return TREF(ref, irt_t((ir->t = fins->t)));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* CSE with explicit search limit. */[m
[31m-TRef LJ_FASTCALL lj_opt_cselim(jit_State *J, IRRef lim)[m
[31m-{[m
[31m-  IRRef ref = J->chain[fins->o];[m
[31m-  IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16);[m
[31m-  while (ref > lim) {[m
[31m-    if (IR(ref)->op12 == op12)[m
[31m-      return ref;[m
[31m-    ref = IR(ref)->prev;[m
[31m-  }[m
[31m-  return lj_ir_emit(J);[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#undef IR[m
[31m-#undef fins[m
[31m-#undef fleft[m
[31m-#undef fright[m
[31m-#undef knumleft[m
[31m-#undef knumright[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_loop.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_loop.c[m
[1mdeleted file mode 100644[m
[1mindex 7978f3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_loop.c[m
[1m+++ /dev/null[m
[36m@@ -1,449 +0,0 @@[m
[31m-/*[m
[31m-** LOOP: Loop Optimizations.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_loop_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* Loop optimization:[m
[31m-**[m
[31m-** Traditional Loop-Invariant Code Motion (LICM) splits the instructions[m
[31m-** of a loop into invariant and variant instructions. The invariant[m
[31m-** instructions are hoisted out of the loop and only the variant[m
[31m-** instructions remain inside the loop body.[m
[31m-**[m
[31m-** Unfortunately LICM is mostly useless for compiling dynamic languages.[m
[31m-** The IR has many guards and most of the subsequent instructions are[m
[31m-** control-dependent on them. The first non-hoistable guard would[m
[31m-** effectively prevent hoisting of all subsequent instructions.[m
[31m-**[m
[31m-** That's why we use a special form of unrolling using copy-substitution,[m
[31m-** combined with redundancy elimination:[m
[31m-**[m
[31m-** The recorded instruction stream is re-emitted to the compiler pipeline[m
[31m-** with substituted operands. The substitution table is filled with the[m
[31m-** refs returned by re-emitting each instruction. This can be done[m
[31m-** on-the-fly, because the IR is in strict SSA form, where every ref is[m
[31m-** defined before its use.[m
[31m-**[m
[31m-** This aproach generates two code sections, separated by the LOOP[m
[31m-** instruction:[m
[31m-**[m
[31m-** 1. The recorded instructions form a kind of pre-roll for the loop. It[m
[31m-** contains a mix of invariant and variant instructions and performs[m
[31m-** exactly one loop iteration (but not necessarily the 1st iteration).[m
[31m-**[m
[31m-** 2. The loop body contains only the variant instructions and performs[m
[31m-** all remaining loop iterations.[m
[31m-**[m
[31m-** On first sight that looks like a waste of space, because the variant[m
[31m-** instructions are present twice. But the key insight is that the[m
[31m-** pre-roll honors the control-dependencies for *both* the pre-roll itself[m
[31m-** *and* the loop body![m
[31m-**[m
[31m-** It also means one doesn't have to explicitly model control-dependencies[m
[31m-** (which, BTW, wouldn't help LICM much). And it's much easier to[m
[31m-** integrate sparse snapshotting with this approach.[m
[31m-**[m
[31m-** One of the nicest aspects of this approach is that all of the[m
[31m-** optimizations of the compiler pipeline (FOLD, CSE, FWD, etc.) can be[m
[31m-** reused with only minor restrictions (e.g. one should not fold[m
[31m-** instructions across loop-carried dependencies).[m
[31m-**[m
[31m-** But in general all optimizations can be applied which only need to look[m
[31m-** backwards into the generated instruction stream. At any point in time[m
[31m-** during the copy-substitution process this contains both a static loop[m
[31m-** iteration (the pre-roll) and a dynamic one (from the to-be-copied[m
[31m-** instruction up to the end of the partial loop body).[m
[31m-**[m
[31m-** Since control-dependencies are implicitly kept, CSE also applies to all[m
[31m-** kinds of guards. The major advantage is that all invariant guards can[m
[31m-** be hoisted, too.[m
[31m-**[m
[31m-** Load/store forwarding works across loop iterations, too. This is[m
[31m-** important if loop-carried dependencies are kept in upvalues or tables.[m
[31m-** E.g. 'self.idx = self.idx + 1' deep down in some OO-style method may[m
[31m-** become a forwarded loop-recurrence after inlining.[m
[31m-**[m
[31m-** Since the IR is in SSA form, loop-carried dependencies have to be[m
[31m-** modeled with PHI instructions. The potential candidates for PHIs are[m
[31m-** collected on-the-fly during copy-substitution. After eliminating the[m
[31m-** redundant ones, PHI instructions are emitted *below* the loop body.[m
[31m-**[m
[31m-** Note that this departure from traditional SSA form doesn't change the[m
[31m-** semantics of the PHI instructions themselves. But it greatly simplifies[m
[31m-** on-the-fly generation of the IR and the machine code.[m
[31m-*/[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* Emit raw IR without passing through optimizations. */[m
[31m-#define emitir_raw(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))[m
[31m-[m
[31m-/* -- PHI elimination ----------------------------------------------------- */[m
[31m-[m
[31m-/* Emit or eliminate collected PHIs. */[m
[31m-static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi,[m
[31m-			  SnapNo onsnap)[m
[31m-{[m
[31m-  int passx = 0;[m
[31m-  IRRef i, j, nslots;[m
[31m-  IRRef invar = J->chain[IR_LOOP];[m
[31m-  /* Pass #1: mark redundant and potentially redundant PHIs. */[m
[31m-  for (i = 0, j = 0; i < nphi; i++) {[m
[31m-    IRRef lref = phi[i];[m
[31m-    IRRef rref = subst[lref];[m
[31m-    if (lref == rref || rref == REF_DROP) {  /* Invariants are redundant. */[m
[31m-      irt_clearphi(IR(lref)->t);[m
[31m-    } else {[m
[31m-      phi[j++] = (IRRef1)lref;[m
[31m-      if (!(IR(rref)->op1 == lref || IR(rref)->op2 == lref)) {[m
[31m-	/* Quick check for simple recurrences failed, need pass2. */[m
[31m-	irt_setmark(IR(lref)->t);[m
[31m-	passx = 1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  nphi = j;[m
[31m-  /* Pass #2: traverse variant part and clear marks of non-redundant PHIs. */[m
[31m-  if (passx) {[m
[31m-    SnapNo s;[m
[31m-    for (i = J->cur.nins-1; i > invar; i--) {[m
[31m-      IRIns *ir = IR(i);[m
[31m-      if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t);[m
[31m-      if (!irref_isk(ir->op1)) {[m
[31m-	irt_clearmark(IR(ir->op1)->t);[m
[31m-	if (ir->op1 < invar &&[m
[31m-	    ir->o >= IR_CALLN && ir->o <= IR_CARG) {  /* ORDER IR */[m
[31m-	  ir = IR(ir->op1);[m
[31m-	  while (ir->o == IR_CARG) {[m
[31m-	    if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t);[m
[31m-	    if (irref_isk(ir->op1)) break;[m
[31m-	    ir = IR(ir->op1);[m
[31m-	    irt_clearmark(ir->t);[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    for (s = J->cur.nsnap-1; s >= onsnap; s--) {[m
[31m-      SnapShot *snap = &J->cur.snap[s];[m
[31m-      SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-      MSize n, nent = snap->nent;[m
[31m-      for (n = 0; n < nent; n++) {[m
[31m-	IRRef ref = snap_ref(map[n]);[m
[31m-	if (!irref_isk(ref)) irt_clearmark(IR(ref)->t);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  /* Pass #3: add PHIs for variant slots without a corresponding SLOAD. */[m
[31m-  nslots = J->baseslot+J->maxslot;[m
[31m-  for (i = 1; i < nslots; i++) {[m
[31m-    IRRef ref = tref_ref(J->slot[i]);[m
[31m-    while (!irref_isk(ref) && ref != subst[ref]) {[m
[31m-      IRIns *ir = IR(ref);[m
[31m-      irt_clearmark(ir->t);  /* Unmark potential uses, too. */[m
[31m-      if (irt_isphi(ir->t) || irt_ispri(ir->t))[m
[31m-	break;[m
[31m-      irt_setphi(ir->t);[m
[31m-      if (nphi >= LJ_MAX_PHI)[m
[31m-	lj_trace_err(J, LJ_TRERR_PHIOV);[m
[31m-      phi[nphi++] = (IRRef1)ref;[m
[31m-      ref = subst[ref];[m
[31m-      if (ref > invar)[m
[31m-	break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Pass #4: propagate non-redundant PHIs. */[m
[31m-  while (passx) {[m
[31m-    passx = 0;[m
[31m-    for (i = 0; i < nphi; i++) {[m
[31m-      IRRef lref = phi[i];[m
[31m-      IRIns *ir = IR(lref);[m
[31m-      if (!irt_ismarked(ir->t)) {  /* Propagate only from unmarked PHIs. */[m
[31m-	IRIns *irr = IR(subst[lref]);[m
[31m-	if (irt_ismarked(irr->t)) {  /* Right ref points to other PHI? */[m
[31m-	  irt_clearmark(irr->t);  /* Mark that PHI as non-redundant. */[m
[31m-	  passx = 1;  /* Retry. */[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  /* Pass #5: emit PHI instructions or eliminate PHIs. */[m
[31m-  for (i = 0; i < nphi; i++) {[m
[31m-    IRRef lref = phi[i];[m
[31m-    IRIns *ir = IR(lref);[m
[31m-    if (!irt_ismarked(ir->t)) {  /* Emit PHI if not marked. */[m
[31m-      IRRef rref = subst[lref];[m
[31m-      if (rref > invar)[m
[31m-	irt_setphi(IR(rref)->t);[m
[31m-      emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref);[m
[31m-    } else {  /* Otherwise eliminate PHI. */[m
[31m-      irt_clearmark(ir->t);[m
[31m-      irt_clearphi(ir->t);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Loop unrolling using copy-substitution ------------------------------ */[m
[31m-[m
[31m-/* Copy-substitute snapshot. */[m
[31m-static void loop_subst_snap(jit_State *J, SnapShot *osnap,[m
[31m-			    SnapEntry *loopmap, IRRef1 *subst)[m
[31m-{[m
[31m-  SnapEntry *nmap, *omap = &J->cur.snapmap[osnap->mapofs];[m
[31m-  SnapEntry *nextmap = &J->cur.snapmap[snap_nextofs(&J->cur, osnap)];[m
[31m-  MSize nmapofs;[m
[31m-  MSize on, ln, nn, onent = osnap->nent;[m
[31m-  BCReg nslots = osnap->nslots;[m
[31m-  SnapShot *snap = &J->cur.snap[J->cur.nsnap];[m
[31m-  if (irt_isguard(J->guardemit)) {  /* Guard inbetween? */[m
[31m-    nmapofs = J->cur.nsnapmap;[m
[31m-    J->cur.nsnap++;  /* Add new snapshot. */[m
[31m-  } else {  /* Otherwise overwrite previous snapshot. */[m
[31m-    snap--;[m
[31m-    nmapofs = snap->mapofs;[m
[31m-  }[m
[31m-  J->guardemit.irt = 0;[m
[31m-  /* Setup new snapshot. */[m
[31m-  snap->mapofs = (uint16_t)nmapofs;[m
[31m-  snap->ref = (IRRef1)J->cur.nins;[m
[31m-  snap->nslots = nslots;[m
[31m-  snap->topslot = osnap->topslot;[m
[31m-  snap->count = 0;[m
[31m-  nmap = &J->cur.snapmap[nmapofs];[m
[31m-  /* Substitute snapshot slots. */[m
[31m-  on = ln = nn = 0;[m
[31m-  while (on < onent) {[m
[31m-    SnapEntry osn = omap[on], lsn = loopmap[ln];[m
[31m-    if (snap_slot(lsn) < snap_slot(osn)) {  /* Copy slot from loop map. */[m
[31m-      nmap[nn++] = lsn;[m
[31m-      ln++;[m
[31m-    } else {  /* Copy substituted slot from snapshot map. */[m
[31m-      if (snap_slot(lsn) == snap_slot(osn)) ln++;  /* Shadowed loop slot. */[m
[31m-      if (!irref_isk(snap_ref(osn)))[m
[31m-	osn = snap_setref(osn, subst[snap_ref(osn)]);[m
[31m-      nmap[nn++] = osn;[m
[31m-      on++;[m
[31m-    }[m
[31m-  }[m
[31m-  while (snap_slot(loopmap[ln]) < nslots)  /* Copy remaining loop slots. */[m
[31m-    nmap[nn++] = loopmap[ln++];[m
[31m-  snap->nent = (uint8_t)nn;[m
[31m-  omap += onent;[m
[31m-  nmap += nn;[m
[31m-  while (omap < nextmap)  /* Copy PC + frame links. */[m
[31m-    *nmap++ = *omap++;[m
[31m-  J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap);[m
[31m-}[m
[31m-[m
[31m-typedef struct LoopState {[m
[31m-  jit_State *J;[m
[31m-  IRRef1 *subst;[m
[31m-  MSize sizesubst;[m
[31m-} LoopState;[m
[31m-[m
[31m-/* Unroll loop. */[m
[31m-static void loop_unroll(LoopState *lps)[m
[31m-{[m
[31m-  jit_State *J = lps->J;[m
[31m-  IRRef1 phi[LJ_MAX_PHI];[m
[31m-  uint32_t nphi = 0;[m
[31m-  IRRef1 *subst;[m
[31m-  SnapNo onsnap;[m
[31m-  SnapShot *osnap, *loopsnap;[m
[31m-  SnapEntry *loopmap, *psentinel;[m
[31m-  IRRef ins, invar;[m
[31m-[m
[31m-  /* Allocate substitution table.[m
[31m-  ** Only non-constant refs in [REF_BIAS,invar) are valid indexes.[m
[31m-  */[m
[31m-  invar = J->cur.nins;[m
[31m-  lps->sizesubst = invar - REF_BIAS;[m
[31m-  lps->subst = lj_mem_newvec(J->L, lps->sizesubst, IRRef1);[m
[31m-  subst = lps->subst - REF_BIAS;[m
[31m-  subst[REF_BASE] = REF_BASE;[m
[31m-[m
[31m-  /* LOOP separates the pre-roll from the loop body. */[m
[31m-  emitir_raw(IRTG(IR_LOOP, IRT_NIL), 0, 0);[m
[31m-[m
[31m-  /* Grow snapshot buffer and map for copy-substituted snapshots.[m
[31m-  ** Need up to twice the number of snapshots minus #0 and loop snapshot.[m
[31m-  ** Need up to twice the number of entries plus fallback substitutions[m
[31m-  ** from the loop snapshot entries for each new snapshot.[m
[31m-  ** Caveat: both calls may reallocate J->cur.snap and J->cur.snapmap![m
[31m-  */[m
[31m-  onsnap = J->cur.nsnap;[m
[31m-  lj_snap_grow_buf(J, 2*onsnap-2);[m
[31m-  lj_snap_grow_map(J, J->cur.nsnapmap*2+(onsnap-2)*J->cur.snap[onsnap-1].nent);[m
[31m-[m
[31m-  /* The loop snapshot is used for fallback substitutions. */[m
[31m-  loopsnap = &J->cur.snap[onsnap-1];[m
[31m-  loopmap = &J->cur.snapmap[loopsnap->mapofs];[m
[31m-  /* The PC of snapshot #0 and the loop snapshot must match. */[m
[31m-  psentinel = &loopmap[loopsnap->nent];[m
[31m-  lua_assert(*psentinel == J->cur.snapmap[J->cur.snap[0].nent]);[m
[31m-  *psentinel = SNAP(255, 0, 0);  /* Replace PC with temporary sentinel. */[m
[31m-[m
[31m-  /* Start substitution with snapshot #1 (#0 is empty for root traces). */[m
[31m-  osnap = &J->cur.snap[1];[m
[31m-[m
[31m-  /* Copy and substitute all recorded instructions and snapshots. */[m
[31m-  for (ins = REF_FIRST; ins < invar; ins++) {[m
[31m-    IRIns *ir;[m
[31m-    IRRef op1, op2;[m
[31m-[m
[31m-    if (ins >= osnap->ref)  /* Instruction belongs to next snapshot? */[m
[31m-      loop_subst_snap(J, osnap++, loopmap, subst);  /* Copy-substitute it. */[m
[31m-[m
[31m-    /* Substitute instruction operands. */[m
[31m-    ir = IR(ins);[m
[31m-    op1 = ir->op1;[m
[31m-    if (!irref_isk(op1)) op1 = subst[op1];[m
[31m-    op2 = ir->op2;[m
[31m-    if (!irref_isk(op2)) op2 = subst[op2];[m
[31m-    if (irm_kind(lj_ir_mode[ir->o]) == IRM_N &&[m
[31m-	op1 == ir->op1 && op2 == ir->op2) {  /* Regular invariant ins? */[m
[31m-      subst[ins] = (IRRef1)ins;  /* Shortcut. */[m
[31m-    } else {[m
[31m-      /* Re-emit substituted instruction to the FOLD/CSE/etc. pipeline. */[m
[31m-      IRType1 t = ir->t;  /* Get this first, since emitir may invalidate ir. */[m
[31m-      IRRef ref = tref_ref(emitir(ir->ot & ~IRT_ISPHI, op1, op2));[m
[31m-      subst[ins] = (IRRef1)ref;[m
[31m-      if (ref != ins) {[m
[31m-	IRIns *irr = IR(ref);[m
[31m-	if (ref < invar) {  /* Loop-carried dependency? */[m
[31m-	  /* Potential PHI? */[m
[31m-	  if (!irref_isk(ref) && !irt_isphi(irr->t) && !irt_ispri(irr->t)) {[m
[31m-	    irt_setphi(irr->t);[m
[31m-	    if (nphi >= LJ_MAX_PHI)[m
[31m-	      lj_trace_err(J, LJ_TRERR_PHIOV);[m
[31m-	    phi[nphi++] = (IRRef1)ref;[m
[31m-	  }[m
[31m-	  /* Check all loop-carried dependencies for type instability. */[m
[31m-	  if (!irt_sametype(t, irr->t)) {[m
[31m-	    if (irt_isinteger(t) && irt_isinteger(irr->t))[m
[31m-	      continue;[m
[31m-	    else if (irt_isnum(t) && irt_isinteger(irr->t))  /* Fix int->num. */[m
[31m-	      ref = tref_ref(emitir(IRTN(IR_CONV), ref, IRCONV_NUM_INT));[m
[31m-	    else if (irt_isnum(irr->t) && irt_isinteger(t))  /* Fix num->int. */[m
[31m-	      ref = tref_ref(emitir(IRTGI(IR_CONV), ref,[m
[31m-				    IRCONV_INT_NUM|IRCONV_CHECK));[m
[31m-	    else[m
[31m-	      lj_trace_err(J, LJ_TRERR_TYPEINS);[m
[31m-	    subst[ins] = (IRRef1)ref;[m
[31m-	    irr = IR(ref);[m
[31m-	    goto phiconv;[m
[31m-	  }[m
[31m-	} else if (ref != REF_DROP && irr->o == IR_CONV &&[m
[31m-		   ref > invar && irr->op1 < invar) {[m
[31m-	  /* May need an extra PHI for a CONV. */[m
[31m-	  ref = irr->op1;[m
[31m-	  irr = IR(ref);[m
[31m-	phiconv:[m
[31m-	  if (ref < invar && !irref_isk(ref) && !irt_isphi(irr->t)) {[m
[31m-	    irt_setphi(irr->t);[m
[31m-	    if (nphi >= LJ_MAX_PHI)[m
[31m-	      lj_trace_err(J, LJ_TRERR_PHIOV);[m
[31m-	    phi[nphi++] = (IRRef1)ref;[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (!irt_isguard(J->guardemit))  /* Drop redundant snapshot. */[m
[31m-    J->cur.nsnapmap = (uint16_t)J->cur.snap[--J->cur.nsnap].mapofs;[m
[31m-  lua_assert(J->cur.nsnapmap <= J->sizesnapmap);[m
[31m-  *psentinel = J->cur.snapmap[J->cur.snap[0].nent];  /* Restore PC. */[m
[31m-[m
[31m-  loop_emit_phi(J, subst, phi, nphi, onsnap);[m
[31m-}[m
[31m-[m
[31m-/* Undo any partial changes made by the loop optimization. */[m
[31m-static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  SnapShot *snap = &J->cur.snap[nsnap-1];[m
[31m-  SnapEntry *map = J->cur.snapmap;[m
[31m-  map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent];  /* Restore PC. */[m
[31m-  J->cur.nsnapmap = (uint16_t)nsnapmap;[m
[31m-  J->cur.nsnap = nsnap;[m
[31m-  J->guardemit.irt = 0;[m
[31m-  lj_ir_rollback(J, ins);[m
[31m-  for (i = 0; i < BPROP_SLOTS; i++) {  /* Remove backprop. cache entries. */[m
[31m-    BPropEntry *bp = &J->bpropcache[i];[m
[31m-    if (bp->val >= ins)[m
[31m-      bp->key = 0;[m
[31m-  }[m
[31m-  for (ins--; ins >= REF_FIRST; ins--) {  /* Remove flags. */[m
[31m-    IRIns *ir = IR(ins);[m
[31m-    irt_clearphi(ir->t);[m
[31m-    irt_clearmark(ir->t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Protected callback for loop optimization. */[m
[31m-static TValue *cploop_opt(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  loop_unroll((LoopState *)ud);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Loop optimization. */[m
[31m-int lj_opt_loop(jit_State *J)[m
[31m-{[m
[31m-  IRRef nins = J->cur.nins;[m
[31m-  SnapNo nsnap = J->cur.nsnap;[m
[31m-  MSize nsnapmap = J->cur.nsnapmap;[m
[31m-  LoopState lps;[m
[31m-  int errcode;[m
[31m-  lps.J = J;[m
[31m-  lps.subst = NULL;[m
[31m-  lps.sizesubst = 0;[m
[31m-  errcode = lj_vm_cpcall(J->L, NULL, &lps, cploop_opt);[m
[31m-  lj_mem_freevec(J2G(J), lps.subst, lps.sizesubst, IRRef1);[m
[31m-  if (LJ_UNLIKELY(errcode)) {[m
[31m-    lua_State *L = J->L;[m
[31m-    if (errcode == LUA_ERRRUN && tvisnumber(L->top-1)) {  /* Trace error? */[m
[31m-      int32_t e = numberVint(L->top-1);[m
[31m-      switch ((TraceError)e) {[m
[31m-      case LJ_TRERR_TYPEINS:  /* Type instability. */[m
[31m-      case LJ_TRERR_GFAIL:  /* Guard would always fail. */[m
[31m-	/* Unrolling via recording fixes many cases, e.g. a flipped boolean. */[m
[31m-	if (--J->instunroll < 0)  /* But do not unroll forever. */[m
[31m-	  break;[m
[31m-	L->top--;  /* Remove error object. */[m
[31m-	loop_undo(J, nins, nsnap, nsnapmap);[m
[31m-	return 1;  /* Loop optimization failed, continue recording. */[m
[31m-      default:[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-    lj_err_throw(L, errcode);  /* Propagate all other errors. */[m
[31m-  }[m
[31m-  return 0;  /* Loop optimization is ok. */[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef emitir[m
[31m-#undef emitir_raw[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_mem.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_mem.c[m
[1mdeleted file mode 100644[m
[1mindex 5549b0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_mem.c[m
[1m+++ /dev/null[m
[36m@@ -1,935 +0,0 @@[m
[31m-/*[m
[31m-** Memory access optimizations.[m
[31m-** AA: Alias Analysis using high-level semantic disambiguation.[m
[31m-** FWD: Load Forwarding (L2L) + Store Forwarding (S2L).[m
[31m-** DSE: Dead-Store Elimination.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_mem_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_ircall.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-#define fins		(&J->fold.ins)[m
[31m-#define fleft		(&J->fold.left)[m
[31m-#define fright		(&J->fold.right)[m
[31m-[m
[31m-/*[m
[31m-** Caveat #1: return value is not always a TRef -- only use with tref_ref().[m
[31m-** Caveat #2: FWD relies on active CSE for xREF operands -- see lj_opt_fold().[m
[31m-*/[m
[31m-[m
[31m-/* Return values from alias analysis. */[m
[31m-typedef enum {[m
[31m-  ALIAS_NO,	/* The two refs CANNOT alias (exact). */[m
[31m-  ALIAS_MAY,	/* The two refs MAY alias (inexact). */[m
[31m-  ALIAS_MUST	/* The two refs MUST alias (exact). */[m
[31m-} AliasRet;[m
[31m-[m
[31m-/* -- ALOAD/HLOAD forwarding and ASTORE/HSTORE elimination ---------------- */[m
[31m-[m
[31m-/* Simplified escape analysis: check for intervening stores. */[m
[31m-static AliasRet aa_escape(jit_State *J, IRIns *ir, IRIns *stop)[m
[31m-{[m
[31m-  IRRef ref = (IRRef)(ir - J->cur.ir);  /* The ref that might be stored. */[m
[31m-  for (ir++; ir < stop; ir++)[m
[31m-    if (ir->op2 == ref &&[m
[31m-	(ir->o == IR_ASTORE || ir->o == IR_HSTORE ||[m
[31m-	 ir->o == IR_USTORE || ir->o == IR_FSTORE))[m
[31m-      return ALIAS_MAY;  /* Reference was stored and might alias. */[m
[31m-  return ALIAS_NO;  /* Reference was not stored. */[m
[31m-}[m
[31m-[m
[31m-/* Alias analysis for two different table references. */[m
[31m-static AliasRet aa_table(jit_State *J, IRRef ta, IRRef tb)[m
[31m-{[m
[31m-  IRIns *taba = IR(ta), *tabb = IR(tb);[m
[31m-  int newa, newb;[m
[31m-  lua_assert(ta != tb);[m
[31m-  lua_assert(irt_istab(taba->t) && irt_istab(tabb->t));[m
[31m-  /* Disambiguate new allocations. */[m
[31m-  newa = (taba->o == IR_TNEW || taba->o == IR_TDUP);[m
[31m-  newb = (tabb->o == IR_TNEW || tabb->o == IR_TDUP);[m
[31m-  if (newa && newb)[m
[31m-    return ALIAS_NO;  /* Two different allocations never alias. */[m
[31m-  if (newb) {  /* At least one allocation? */[m
[31m-    IRIns *tmp = taba; taba = tabb; tabb = tmp;[m
[31m-  } else if (!newa) {[m
[31m-    return ALIAS_MAY;  /* Anything else: we just don't know. */[m
[31m-  }[m
[31m-  return aa_escape(J, taba, tabb);[m
[31m-}[m
[31m-[m
[31m-/* Alias analysis for array and hash access using key-based disambiguation. */[m
[31m-static AliasRet aa_ahref(jit_State *J, IRIns *refa, IRIns *refb)[m
[31m-{[m
[31m-  IRRef ka = refa->op2;[m
[31m-  IRRef kb = refb->op2;[m
[31m-  IRIns *keya, *keyb;[m
[31m-  IRRef ta, tb;[m
[31m-  if (refa == refb)[m
[31m-    return ALIAS_MUST;  /* Shortcut for same refs. */[m
[31m-  keya = IR(ka);[m
[31m-  if (keya->o == IR_KSLOT) { ka = keya->op1; keya = IR(ka); }[m
[31m-  keyb = IR(kb);[m
[31m-  if (keyb->o == IR_KSLOT) { kb = keyb->op1; keyb = IR(kb); }[m
[31m-  ta = (refa->o==IR_HREFK || refa->o==IR_AREF) ? IR(refa->op1)->op1 : refa->op1;[m
[31m-  tb = (refb->o==IR_HREFK || refb->o==IR_AREF) ? IR(refb->op1)->op1 : refb->op1;[m
[31m-  if (ka == kb) {[m
[31m-    /* Same key. Check for same table with different ref (NEWREF vs. HREF). */[m
[31m-    if (ta == tb)[m
[31m-      return ALIAS_MUST;  /* Same key, same table. */[m
[31m-    else[m
[31m-      return aa_table(J, ta, tb);  /* Same key, possibly different table. */[m
[31m-  }[m
[31m-  if (irref_isk(ka) && irref_isk(kb))[m
[31m-    return ALIAS_NO;  /* Different constant keys. */[m
[31m-  if (refa->o == IR_AREF) {[m
[31m-    /* Disambiguate array references based on index arithmetic. */[m
[31m-    int32_t ofsa = 0, ofsb = 0;[m
[31m-    IRRef basea = ka, baseb = kb;[m
[31m-    lua_assert(refb->o == IR_AREF);[m
[31m-    /* Gather base and offset from t[base] or t[base+-ofs]. */[m
[31m-    if (keya->o == IR_ADD && irref_isk(keya->op2)) {[m
[31m-      basea = keya->op1;[m
[31m-      ofsa = IR(keya->op2)->i;[m
[31m-      if (basea == kb && ofsa != 0)[m
[31m-	return ALIAS_NO;  /* t[base+-ofs] vs. t[base]. */[m
[31m-    }[m
[31m-    if (keyb->o == IR_ADD && irref_isk(keyb->op2)) {[m
[31m-      baseb = keyb->op1;[m
[31m-      ofsb = IR(keyb->op2)->i;[m
[31m-      if (ka == baseb && ofsb != 0)[m
[31m-	return ALIAS_NO;  /* t[base] vs. t[base+-ofs]. */[m
[31m-    }[m
[31m-    if (basea == baseb && ofsa != ofsb)[m
[31m-      return ALIAS_NO;  /* t[base+-o1] vs. t[base+-o2] and o1 != o2. */[m
[31m-  } else {[m
[31m-    /* Disambiguate hash references based on the type of their keys. */[m
[31m-    lua_assert((refa->o==IR_HREF || refa->o==IR_HREFK || refa->o==IR_NEWREF) &&[m
[31m-	       (refb->o==IR_HREF || refb->o==IR_HREFK || refb->o==IR_NEWREF));[m
[31m-    if (!irt_sametype(keya->t, keyb->t))[m
[31m-      return ALIAS_NO;  /* Different key types. */[m
[31m-  }[m
[31m-  if (ta == tb)[m
[31m-    return ALIAS_MAY;  /* Same table, cannot disambiguate keys. */[m
[31m-  else[m
[31m-    return aa_table(J, ta, tb);  /* Try to disambiguate tables. */[m
[31m-}[m
[31m-[m
[31m-/* Array and hash load forwarding. */[m
[31m-static TRef fwd_ahload(jit_State *J, IRRef xref)[m
[31m-{[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef lim = xref;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[fins->o+IRDELTA_L2S];[m
[31m-  while (ref > xref) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_ahref(J, xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:  lim = ref; goto cselim;  /* Limit search for load. */[m
[31m-    case ALIAS_MUST: return store->op2;  /* Store forwarding. */[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* No conflicting store (yet): const-fold loads from allocations. */[m
[31m-  {[m
[31m-    IRIns *ir = (xr->o == IR_HREFK || xr->o == IR_AREF) ? IR(xr->op1) : xr;[m
[31m-    IRRef tab = ir->op1;[m
[31m-    ir = IR(tab);[m
[31m-    if (ir->o == IR_TNEW || (ir->o == IR_TDUP && irref_isk(xr->op2))) {[m
[31m-      /* A NEWREF with a number key may end up pointing to the array part.[m
[31m-      ** But it's referenced from HSTORE and not found in the ASTORE chain.[m
[31m-      ** For now simply consider this a conflict without forwarding anything.[m
[31m-      */[m
[31m-      if (xr->o == IR_AREF) {[m
[31m-	IRRef ref2 = J->chain[IR_NEWREF];[m
[31m-	while (ref2 > tab) {[m
[31m-	  IRIns *newref = IR(ref2);[m
[31m-	  if (irt_isnum(IR(newref->op2)->t))[m
[31m-	    goto cselim;[m
[31m-	  ref2 = newref->prev;[m
[31m-	}[m
[31m-      }[m
[31m-      /* NEWREF inhibits CSE for HREF, and dependent FLOADs from HREFK/AREF.[m
[31m-      ** But the above search for conflicting stores was limited by xref.[m
[31m-      ** So continue searching, limited by the TNEW/TDUP. Store forwarding[m
[31m-      ** is ok, too. A conflict does NOT limit the search for a matching load.[m
[31m-      */[m
[31m-      while (ref > tab) {[m
[31m-	IRIns *store = IR(ref);[m
[31m-	switch (aa_ahref(J, xr, IR(store->op1))) {[m
[31m-	case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-	case ALIAS_MAY:  goto cselim;  /* Conflicting store. */[m
[31m-	case ALIAS_MUST: return store->op2;  /* Store forwarding. */[m
[31m-	}[m
[31m-	ref = store->prev;[m
[31m-      }[m
[31m-      lua_assert(ir->o != IR_TNEW || irt_isnil(fins->t));[m
[31m-      if (irt_ispri(fins->t)) {[m
[31m-	return TREF_PRI(irt_type(fins->t));[m
[31m-      } else if (irt_isnum(fins->t) || (LJ_DUALNUM && irt_isint(fins->t)) ||[m
[31m-		 irt_isstr(fins->t)) {[m
[31m-	TValue keyv;[m
[31m-	cTValue *tv;[m
[31m-	IRIns *key = IR(xr->op2);[m
[31m-	if (key->o == IR_KSLOT) key = IR(key->op1);[m
[31m-	lj_ir_kvalue(J->L, &keyv, key);[m
[31m-	tv = lj_tab_get(J->L, ir_ktab(IR(ir->op1)), &keyv);[m
[31m-	lua_assert(itype2irt(tv) == irt_type(fins->t));[m
[31m-	if (irt_isnum(fins->t))[m
[31m-	  return lj_ir_knum_u64(J, tv->u64);[m
[31m-	else if (LJ_DUALNUM && irt_isint(fins->t))[m
[31m-	  return lj_ir_kint(J, intV(tv));[m
[31m-	else[m
[31m-	  return lj_ir_kstr(J, strV(tv));[m
[31m-      }[m
[31m-      /* Othwerwise: don't intern as a constant. */[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-cselim:[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-  ref = J->chain[fins->o];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *load = IR(ref);[m
[31m-    if (load->op1 == xref)[m
[31m-      return ref;  /* Load forwarding. */[m
[31m-    ref = load->prev;[m
[31m-  }[m
[31m-  return 0;  /* Conflict or no match. */[m
[31m-}[m
[31m-[m
[31m-/* Reassociate ALOAD across PHIs to handle t[i-1] forwarding case. */[m
[31m-static TRef fwd_aload_reassoc(jit_State *J)[m
[31m-{[m
[31m-  IRIns *irx = IR(fins->op1);[m
[31m-  IRIns *key = IR(irx->op2);[m
[31m-  if (key->o == IR_ADD && irref_isk(key->op2)) {[m
[31m-    IRIns *add2 = IR(key->op1);[m
[31m-    if (add2->o == IR_ADD && irref_isk(add2->op2) &&[m
[31m-	IR(key->op2)->i == -IR(add2->op2)->i) {[m
[31m-      IRRef ref = J->chain[IR_AREF];[m
[31m-      IRRef lim = add2->op1;[m
[31m-      if (irx->op1 > lim) lim = irx->op1;[m
[31m-      while (ref > lim) {[m
[31m-	IRIns *ir = IR(ref);[m
[31m-	if (ir->op1 == irx->op1 && ir->op2 == add2->op1)[m
[31m-	  return fwd_ahload(J, ref);[m
[31m-	ref = ir->prev;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ALOAD forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_aload(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref;[m
[31m-  if ((ref = fwd_ahload(J, fins->op1)) ||[m
[31m-      (ref = fwd_aload_reassoc(J)))[m
[31m-    return ref;[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* HLOAD forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_hload(jit_State *J)[m
[31m-{[m
[31m-  IRRef ref = fwd_ahload(J, fins->op1);[m
[31m-  if (ref)[m
[31m-    return ref;[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* HREFK forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J)[m
[31m-{[m
[31m-  IRRef tab = fleft->op1;[m
[31m-  IRRef ref = J->chain[IR_NEWREF];[m
[31m-  while (ref > tab) {[m
[31m-    IRIns *newref = IR(ref);[m
[31m-    if (tab == newref->op1) {[m
[31m-      if (fright->op1 == newref->op2)[m
[31m-	return ref;  /* Forward from NEWREF. */[m
[31m-      else[m
[31m-	goto docse;[m
[31m-    } else if (aa_table(J, tab, newref->op1) != ALIAS_NO) {[m
[31m-      goto docse;[m
[31m-    }[m
[31m-    ref = newref->prev;[m
[31m-  }[m
[31m-  /* No conflicting NEWREF: key location unchanged for HREFK of TDUP. */[m
[31m-  if (IR(tab)->o == IR_TDUP)[m
[31m-    fins->t.irt &= ~IRT_GUARD;  /* Drop HREFK guard. */[m
[31m-docse:[m
[31m-  return CSEFOLD;[m
[31m-}[m
[31m-[m
[31m-/* Check whether HREF of TNEW/TDUP can be folded to niltv. */[m
[31m-int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J)[m
[31m-{[m
[31m-  IRRef lim = fins->op1;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* The key for an ASTORE may end up in the hash part after a NEWREF. */[m
[31m-  if (irt_isnum(fright->t) && J->chain[IR_NEWREF] > lim) {[m
[31m-    ref = J->chain[IR_ASTORE];[m
[31m-    while (ref > lim) {[m
[31m-      if (ref < J->chain[IR_NEWREF])[m
[31m-	return 0;  /* Conflict. */[m
[31m-      ref = IR(ref)->prev;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[IR_HSTORE];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    if (aa_ahref(J, fins, IR(store->op1)) != ALIAS_NO)[m
[31m-      return 0;  /* Conflict. */[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  return 1;  /* No conflict. Can fold to niltv. */[m
[31m-}[m
[31m-[m
[31m-/* Check whether there's no aliasing table.clear. */[m
[31m-static int fwd_aa_tab_clear(jit_State *J, IRRef lim, IRRef ta)[m
[31m-{[m
[31m-  IRRef ref = J->chain[IR_CALLS];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *calls = IR(ref);[m
[31m-    if (calls->op2 == IRCALL_lj_tab_clear &&[m
[31m-	(ta == calls->op1 || aa_table(J, ta, calls->op1) != ALIAS_NO))[m
[31m-      return 0;  /* Conflict. */[m
[31m-    ref = calls->prev;[m
[31m-  }[m
[31m-  return 1;  /* No conflict. Can safely FOLD/CSE. */[m
[31m-}[m
[31m-[m
[31m-/* Check whether there's no aliasing NEWREF/table.clear for the left operand. */[m
[31m-int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim)[m
[31m-{[m
[31m-  IRRef ta = fins->op1;[m
[31m-  IRRef ref = J->chain[IR_NEWREF];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *newref = IR(ref);[m
[31m-    if (ta == newref->op1 || aa_table(J, ta, newref->op1) != ALIAS_NO)[m
[31m-      return 0;  /* Conflict. */[m
[31m-    ref = newref->prev;[m
[31m-  }[m
[31m-  return fwd_aa_tab_clear(J, lim, ta);[m
[31m-}[m
[31m-[m
[31m-/* ASTORE/HSTORE elimination. */[m
[31m-TRef LJ_FASTCALL lj_opt_dse_ahstore(jit_State *J)[m
[31m-{[m
[31m-  IRRef xref = fins->op1;  /* xREF reference. */[m
[31m-  IRRef val = fins->op2;  /* Stored value reference. */[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef1 *refp = &J->chain[fins->o];[m
[31m-  IRRef ref = *refp;[m
[31m-  while (ref > xref) {  /* Search for redundant or conflicting stores. */[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_ahref(J, xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:[m
[31m-      break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:	/* Store to MAYBE the same location. */[m
[31m-      if (store->op2 != val)  /* Conflict if the value is different. */[m
[31m-	goto doemit;[m
[31m-      break;  /* Otherwise continue searching. */[m
[31m-    case ALIAS_MUST:	/* Store to the same location. */[m
[31m-      if (store->op2 == val)  /* Same value: drop the new store. */[m
[31m-	return DROPFOLD;[m
[31m-      /* Different value: try to eliminate the redundant store. */[m
[31m-      if (ref > J->chain[IR_LOOP]) {  /* Quick check to avoid crossing LOOP. */[m
[31m-	IRIns *ir;[m
[31m-	/* Check for any intervening guards (includes conflicting loads). */[m
[31m-	for (ir = IR(J->cur.nins-1); ir > store; ir--)[m
[31m-	  if (irt_isguard(ir->t) || ir->o == IR_CALLL)[m
[31m-	    goto doemit;  /* No elimination possible. */[m
[31m-	/* Remove redundant store from chain and replace with NOP. */[m
[31m-	*refp = store->prev;[m
[31m-	store->o = IR_NOP;[m
[31m-	store->t.irt = IRT_NIL;[m
[31m-	store->op1 = store->op2 = 0;[m
[31m-	store->prev = 0;[m
[31m-	/* Now emit the new store instead. */[m
[31m-      }[m
[31m-      goto doemit;[m
[31m-    }[m
[31m-    ref = *(refp = &store->prev);[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;  /* Otherwise we have a conflict or simply no match. */[m
[31m-}[m
[31m-[m
[31m-/* -- ULOAD forwarding ---------------------------------------------------- */[m
[31m-[m
[31m-/* The current alias analysis for upvalues is very simplistic. It only[m
[31m-** disambiguates between the unique upvalues of the same function.[m
[31m-** This is good enough for now, since most upvalues are read-only.[m
[31m-**[m
[31m-** A more precise analysis would be feasible with the help of the parser:[m
[31m-** generate a unique key for every upvalue, even across all prototypes.[m
[31m-** Lacking a realistic use-case, it's unclear whether this is beneficial.[m
[31m-*/[m
[31m-static AliasRet aa_uref(IRIns *refa, IRIns *refb)[m
[31m-{[m
[31m-  if (refa->o != refb->o)[m
[31m-    return ALIAS_NO;  /* Different UREFx type. */[m
[31m-  if (refa->op1 == refb->op1) {  /* Same function. */[m
[31m-    if (refa->op2 == refb->op2)[m
[31m-      return ALIAS_MUST;  /* Same function, same upvalue idx. */[m
[31m-    else[m
[31m-      return ALIAS_NO;  /* Same function, different upvalue idx. */[m
[31m-  } else {  /* Different functions, check disambiguation hash values. */[m
[31m-    if (((refa->op2 ^ refb->op2) & 0xff))[m
[31m-      return ALIAS_NO;  /* Upvalues with different hash values cannot alias. */[m
[31m-    else[m
[31m-      return ALIAS_MAY;  /* No conclusion can be drawn for same hash value. */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* ULOAD forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J)[m
[31m-{[m
[31m-  IRRef uref = fins->op1;[m
[31m-  IRRef lim = REF_BASE;  /* Search limit. */[m
[31m-  IRIns *xr = IR(uref);[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[IR_USTORE];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_uref(xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:  lim = ref; goto cselim;  /* Limit search for load. */[m
[31m-    case ALIAS_MUST: return store->op2;  /* Store forwarding. */[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-cselim:[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-[m
[31m-  ref = J->chain[IR_ULOAD];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (ir->op1 == uref ||[m
[31m-	(IR(ir->op1)->op12 == IR(uref)->op12 && IR(ir->op1)->o == IR(uref)->o))[m
[31m-      return ref;  /* Match for identical or equal UREFx (non-CSEable UREFO). */[m
[31m-    ref = ir->prev;[m
[31m-  }[m
[31m-  return lj_ir_emit(J);[m
[31m-}[m
[31m-[m
[31m-/* USTORE elimination. */[m
[31m-TRef LJ_FASTCALL lj_opt_dse_ustore(jit_State *J)[m
[31m-{[m
[31m-  IRRef xref = fins->op1;  /* xREF reference. */[m
[31m-  IRRef val = fins->op2;  /* Stored value reference. */[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef1 *refp = &J->chain[IR_USTORE];[m
[31m-  IRRef ref = *refp;[m
[31m-  while (ref > xref) {  /* Search for redundant or conflicting stores. */[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_uref(xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:[m
[31m-      break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:	/* Store to MAYBE the same location. */[m
[31m-      if (store->op2 != val)  /* Conflict if the value is different. */[m
[31m-	goto doemit;[m
[31m-      break;  /* Otherwise continue searching. */[m
[31m-    case ALIAS_MUST:	/* Store to the same location. */[m
[31m-      if (store->op2 == val)  /* Same value: drop the new store. */[m
[31m-	return DROPFOLD;[m
[31m-      /* Different value: try to eliminate the redundant store. */[m
[31m-      if (ref > J->chain[IR_LOOP]) {  /* Quick check to avoid crossing LOOP. */[m
[31m-	IRIns *ir;[m
[31m-	/* Check for any intervening guards (includes conflicting loads). */[m
[31m-	for (ir = IR(J->cur.nins-1); ir > store; ir--)[m
[31m-	  if (irt_isguard(ir->t))[m
[31m-	    goto doemit;  /* No elimination possible. */[m
[31m-	/* Remove redundant store from chain and replace with NOP. */[m
[31m-	*refp = store->prev;[m
[31m-	store->o = IR_NOP;[m
[31m-	store->t.irt = IRT_NIL;[m
[31m-	store->op1 = store->op2 = 0;[m
[31m-	store->prev = 0;[m
[31m-	if (ref+1 < J->cur.nins &&[m
[31m-	    store[1].o == IR_OBAR && store[1].op1 == xref) {[m
[31m-	  IRRef1 *bp = &J->chain[IR_OBAR];[m
[31m-	  IRIns *obar;[m
[31m-	  for (obar = IR(*bp); *bp > ref+1; obar = IR(*bp))[m
[31m-	    bp = &obar->prev;[m
[31m-	  /* Remove OBAR, too. */[m
[31m-	  *bp = obar->prev;[m
[31m-	  obar->o = IR_NOP;[m
[31m-	  obar->t.irt = IRT_NIL;[m
[31m-	  obar->op1 = obar->op2 = 0;[m
[31m-	  obar->prev = 0;[m
[31m-	}[m
[31m-	/* Now emit the new store instead. */[m
[31m-      }[m
[31m-      goto doemit;[m
[31m-    }[m
[31m-    ref = *(refp = &store->prev);[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;  /* Otherwise we have a conflict or simply no match. */[m
[31m-}[m
[31m-[m
[31m-/* -- FLOAD forwarding and FSTORE elimination ----------------------------- */[m
[31m-[m
[31m-/* Alias analysis for field access.[m
[31m-** Field loads are cheap and field stores are rare.[m
[31m-** Simple disambiguation based on field types is good enough.[m
[31m-*/[m
[31m-static AliasRet aa_fref(jit_State *J, IRIns *refa, IRIns *refb)[m
[31m-{[m
[31m-  if (refa->op2 != refb->op2)[m
[31m-    return ALIAS_NO;  /* Different fields. */[m
[31m-  if (refa->op1 == refb->op1)[m
[31m-    return ALIAS_MUST;  /* Same field, same object. */[m
[31m-  else if (refa->op2 >= IRFL_TAB_META && refa->op2 <= IRFL_TAB_NOMM)[m
[31m-    return aa_table(J, refa->op1, refb->op1);  /* Disambiguate tables. */[m
[31m-  else[m
[31m-    return ALIAS_MAY;  /* Same field, possibly different object. */[m
[31m-}[m
[31m-[m
[31m-/* Only the loads for mutable fields end up here (see FOLD). */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J)[m
[31m-{[m
[31m-  IRRef oref = fins->op1;  /* Object reference. */[m
[31m-  IRRef fid = fins->op2;  /* Field ID. */[m
[31m-  IRRef lim = oref;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[IR_FSTORE];[m
[31m-  while (ref > oref) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_fref(J, fins, IR(store->op1))) {[m
[31m-    case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:  lim = ref; goto cselim;  /* Limit search for load. */[m
[31m-    case ALIAS_MUST: return store->op2;  /* Store forwarding. */[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* No conflicting store: const-fold field loads from allocations. */[m
[31m-  if (fid == IRFL_TAB_META) {[m
[31m-    IRIns *ir = IR(oref);[m
[31m-    if (ir->o == IR_TNEW || ir->o == IR_TDUP)[m
[31m-      return lj_ir_knull(J, IRT_TAB);[m
[31m-  }[m
[31m-[m
[31m-cselim:[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-  return lj_opt_cselim(J, lim);[m
[31m-}[m
[31m-[m
[31m-/* FSTORE elimination. */[m
[31m-TRef LJ_FASTCALL lj_opt_dse_fstore(jit_State *J)[m
[31m-{[m
[31m-  IRRef fref = fins->op1;  /* FREF reference. */[m
[31m-  IRRef val = fins->op2;  /* Stored value reference. */[m
[31m-  IRIns *xr = IR(fref);[m
[31m-  IRRef1 *refp = &J->chain[IR_FSTORE];[m
[31m-  IRRef ref = *refp;[m
[31m-  while (ref > fref) {  /* Search for redundant or conflicting stores. */[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_fref(J, xr, IR(store->op1))) {[m
[31m-    case ALIAS_NO:[m
[31m-      break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:[m
[31m-      if (store->op2 != val)  /* Conflict if the value is different. */[m
[31m-	goto doemit;[m
[31m-      break;  /* Otherwise continue searching. */[m
[31m-    case ALIAS_MUST:[m
[31m-      if (store->op2 == val)  /* Same value: drop the new store. */[m
[31m-	return DROPFOLD;[m
[31m-      /* Different value: try to eliminate the redundant store. */[m
[31m-      if (ref > J->chain[IR_LOOP]) {  /* Quick check to avoid crossing LOOP. */[m
[31m-	IRIns *ir;[m
[31m-	/* Check for any intervening guards or conflicting loads. */[m
[31m-	for (ir = IR(J->cur.nins-1); ir > store; ir--)[m
[31m-	  if (irt_isguard(ir->t) || (ir->o == IR_FLOAD && ir->op2 == xr->op2))[m
[31m-	    goto doemit;  /* No elimination possible. */[m
[31m-	/* Remove redundant store from chain and replace with NOP. */[m
[31m-	*refp = store->prev;[m
[31m-	store->o = IR_NOP;[m
[31m-	store->t.irt = IRT_NIL;[m
[31m-	store->op1 = store->op2 = 0;[m
[31m-	store->prev = 0;[m
[31m-	/* Now emit the new store instead. */[m
[31m-      }[m
[31m-      goto doemit;[m
[31m-    }[m
[31m-    ref = *(refp = &store->prev);[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;  /* Otherwise we have a conflict or simply no match. */[m
[31m-}[m
[31m-[m
[31m-/* -- XLOAD forwarding and XSTORE elimination ----------------------------- */[m
[31m-[m
[31m-/* Find cdata allocation for a reference (if any). */[m
[31m-static IRIns *aa_findcnew(jit_State *J, IRIns *ir)[m
[31m-{[m
[31m-  while (ir->o == IR_ADD) {[m
[31m-    if (!irref_isk(ir->op1)) {[m
[31m-      IRIns *ir1 = aa_findcnew(J, IR(ir->op1));  /* Left-recursion. */[m
[31m-      if (ir1) return ir1;[m
[31m-    }[m
[31m-    if (irref_isk(ir->op2)) return NULL;[m
[31m-    ir = IR(ir->op2);  /* Flatten right-recursion. */[m
[31m-  }[m
[31m-  return ir->o == IR_CNEW ? ir : NULL;[m
[31m-}[m
[31m-[m
[31m-/* Alias analysis for two cdata allocations. */[m
[31m-static AliasRet aa_cnew(jit_State *J, IRIns *refa, IRIns *refb)[m
[31m-{[m
[31m-  IRIns *cnewa = aa_findcnew(J, refa);[m
[31m-  IRIns *cnewb = aa_findcnew(J, refb);[m
[31m-  if (cnewa == cnewb)[m
[31m-    return ALIAS_MAY;  /* Same allocation or neither is an allocation. */[m
[31m-  if (cnewa && cnewb)[m
[31m-    return ALIAS_NO;  /* Two different allocations never alias. */[m
[31m-  if (cnewb) { cnewa = cnewb; refb = refa; }[m
[31m-  return aa_escape(J, cnewa, refb);[m
[31m-}[m
[31m-[m
[31m-/* Alias analysis for XLOAD/XSTORE. */[m
[31m-static AliasRet aa_xref(jit_State *J, IRIns *refa, IRIns *xa, IRIns *xb)[m
[31m-{[m
[31m-  ptrdiff_t ofsa = 0, ofsb = 0;[m
[31m-  IRIns *refb = IR(xb->op1);[m
[31m-  IRIns *basea = refa, *baseb = refb;[m
[31m-  if (refa == refb && irt_sametype(xa->t, xb->t))[m
[31m-    return ALIAS_MUST;  /* Shortcut for same refs with identical type. */[m
[31m-  /* Offset-based disambiguation. */[m
[31m-  if (refa->o == IR_ADD && irref_isk(refa->op2)) {[m
[31m-    IRIns *irk = IR(refa->op2);[m
[31m-    basea = IR(refa->op1);[m
[31m-    ofsa = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 :[m
[31m-					    (ptrdiff_t)irk->i;[m
[31m-  }[m
[31m-  if (refb->o == IR_ADD && irref_isk(refb->op2)) {[m
[31m-    IRIns *irk = IR(refb->op2);[m
[31m-    baseb = IR(refb->op1);[m
[31m-    ofsb = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 :[m
[31m-					    (ptrdiff_t)irk->i;[m
[31m-  }[m
[31m-  /* Treat constified pointers like base vs. base+offset. */[m
[31m-  if (basea->o == IR_KPTR && baseb->o == IR_KPTR) {[m
[31m-    ofsb += (char *)ir_kptr(baseb) - (char *)ir_kptr(basea);[m
[31m-    baseb = basea;[m
[31m-  }[m
[31m-  /* This implements (very) strict aliasing rules.[m
[31m-  ** Different types do NOT alias, except for differences in signedness.[m
[31m-  ** Type punning through unions is allowed (but forces a reload).[m
[31m-  */[m
[31m-  if (basea == baseb) {[m
[31m-    ptrdiff_t sza = irt_size(xa->t), szb = irt_size(xb->t);[m
[31m-    if (ofsa == ofsb) {[m
[31m-      if (sza == szb && irt_isfp(xa->t) == irt_isfp(xb->t))[m
[31m-	return ALIAS_MUST;  /* Same-sized, same-kind. May need to convert. */[m
[31m-    } else if (ofsa + sza <= ofsb || ofsb + szb <= ofsa) {[m
[31m-      return ALIAS_NO;  /* Non-overlapping base+-o1 vs. base+-o2. */[m
[31m-    }[m
[31m-    /* NYI: extract, extend or reinterpret bits (int <-> fp). */[m
[31m-    return ALIAS_MAY;  /* Overlapping or type punning: force reload. */[m
[31m-  }[m
[31m-  if (!irt_sametype(xa->t, xb->t) &&[m
[31m-      !(irt_typerange(xa->t, IRT_I8, IRT_U64) &&[m
[31m-	((xa->t.irt - IRT_I8) ^ (xb->t.irt - IRT_I8)) == 1))[m
[31m-    return ALIAS_NO;[m
[31m-  /* NYI: structural disambiguation. */[m
[31m-  return aa_cnew(J, basea, baseb);  /* Try to disambiguate allocations. */[m
[31m-}[m
[31m-[m
[31m-/* Return CSEd reference or 0. Caveat: swaps lower ref to the right! */[m
[31m-static IRRef reassoc_trycse(jit_State *J, IROp op, IRRef op1, IRRef op2)[m
[31m-{[m
[31m-  IRRef ref = J->chain[op];[m
[31m-  IRRef lim = op1;[m
[31m-  if (op2 > lim) { lim = op2; op2 = op1; op1 = lim; }[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (ir->op1 == op1 && ir->op2 == op2)[m
[31m-      return ref;[m
[31m-    ref = ir->prev;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Reassociate index references. */[m
[31m-static IRRef reassoc_xref(jit_State *J, IRIns *ir)[m
[31m-{[m
[31m-  ptrdiff_t ofs = 0;[m
[31m-  if (ir->o == IR_ADD && irref_isk(ir->op2)) {  /* Get constant offset. */[m
[31m-    IRIns *irk = IR(ir->op2);[m
[31m-    ofs = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 :[m
[31m-					   (ptrdiff_t)irk->i;[m
[31m-    ir = IR(ir->op1);[m
[31m-  }[m
[31m-  if (ir->o == IR_ADD) {  /* Add of base + index. */[m
[31m-    /* Index ref > base ref for loop-carried dependences. Only check op1. */[m
[31m-    IRIns *ir2, *ir1 = IR(ir->op1);[m
[31m-    int32_t shift = 0;[m
[31m-    IRRef idxref;[m
[31m-    /* Determine index shifts. Don't bother with IR_MUL here. */[m
[31m-    if (ir1->o == IR_BSHL && irref_isk(ir1->op2))[m
[31m-      shift = IR(ir1->op2)->i;[m
[31m-    else if (ir1->o == IR_ADD && ir1->op1 == ir1->op2)[m
[31m-      shift = 1;[m
[31m-    else[m
[31m-      ir1 = ir;[m
[31m-    ir2 = IR(ir1->op1);[m
[31m-    /* A non-reassociated add. Must be a loop-carried dependence. */[m
[31m-    if (ir2->o == IR_ADD && irt_isint(ir2->t) && irref_isk(ir2->op2))[m
[31m-      ofs += (ptrdiff_t)IR(ir2->op2)->i << shift;[m
[31m-    else[m
[31m-      return 0;[m
[31m-    idxref = ir2->op1;[m
[31m-    /* Try to CSE the reassociated chain. Give up if not found. */[m
[31m-    if (ir1 != ir &&[m
[31m-	!(idxref = reassoc_trycse(J, ir1->o, idxref,[m
[31m-				  ir1->o == IR_BSHL ? ir1->op2 : idxref)))[m
[31m-      return 0;[m
[31m-    if (!(idxref = reassoc_trycse(J, IR_ADD, idxref, ir->op2)))[m
[31m-      return 0;[m
[31m-    if (ofs != 0) {[m
[31m-      IRRef refk = tref_ref(lj_ir_kintp(J, ofs));[m
[31m-      if (!(idxref = reassoc_trycse(J, IR_ADD, idxref, refk)))[m
[31m-	return 0;[m
[31m-    }[m
[31m-    return idxref;  /* Success, found a reassociated index reference. Phew. */[m
[31m-  }[m
[31m-  return 0;  /* Failure. */[m
[31m-}[m
[31m-[m
[31m-/* XLOAD forwarding. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J)[m
[31m-{[m
[31m-  IRRef xref = fins->op1;[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef lim = xref;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  if ((fins->op2 & IRXLOAD_READONLY))[m
[31m-    goto cselim;[m
[31m-  if ((fins->op2 & IRXLOAD_VOLATILE))[m
[31m-    goto doemit;[m
[31m-[m
[31m-  /* Search for conflicting stores. */[m
[31m-  ref = J->chain[IR_XSTORE];[m
[31m-retry:[m
[31m-  if (J->chain[IR_CALLXS] > lim) lim = J->chain[IR_CALLXS];[m
[31m-  if (J->chain[IR_XBAR] > lim) lim = J->chain[IR_XBAR];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_xref(J, xr, fins, store)) {[m
[31m-    case ALIAS_NO:   break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:  lim = ref; goto cselim;  /* Limit search for load. */[m
[31m-    case ALIAS_MUST:[m
[31m-      /* Emit conversion if the loaded type doesn't match the forwarded type. */[m
[31m-      if (!irt_sametype(fins->t, IR(store->op2)->t)) {[m
[31m-	IRType dt = irt_type(fins->t), st = irt_type(IR(store->op2)->t);[m
[31m-	if (dt == IRT_I8 || dt == IRT_I16) {  /* Trunc + sign-extend. */[m
[31m-	  st = dt | IRCONV_SEXT;[m
[31m-	  dt = IRT_INT;[m
[31m-	} else if (dt == IRT_U8 || dt == IRT_U16) {  /* Trunc + zero-extend. */[m
[31m-	  st = dt;[m
[31m-	  dt = IRT_INT;[m
[31m-	}[m
[31m-	fins->ot = IRT(IR_CONV, dt);[m
[31m-	fins->op1 = store->op2;[m
[31m-	fins->op2 = (dt<<5)|st;[m
[31m-	return RETRYFOLD;[m
[31m-      }[m
[31m-      return store->op2;  /* Store forwarding. */[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-cselim:[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-  ref = J->chain[IR_XLOAD];[m
[31m-  while (ref > lim) {[m
[31m-    /* CSE for XLOAD depends on the type, but not on the IRXLOAD_* flags. */[m
[31m-    if (IR(ref)->op1 == xref && irt_sametype(IR(ref)->t, fins->t))[m
[31m-      return ref;[m
[31m-    ref = IR(ref)->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* Reassociate XLOAD across PHIs to handle a[i-1] forwarding case. */[m
[31m-  if (!(fins->op2 & IRXLOAD_READONLY) && J->chain[IR_LOOP] &&[m
[31m-      xref == fins->op1 && (xref = reassoc_xref(J, xr)) != 0) {[m
[31m-    ref = J->chain[IR_XSTORE];[m
[31m-    while (ref > lim)  /* Skip stores that have already been checked. */[m
[31m-      ref = IR(ref)->prev;[m
[31m-    lim = xref;[m
[31m-    xr = IR(xref);[m
[31m-    goto retry;  /* Retry with the reassociated reference. */[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;[m
[31m-}[m
[31m-[m
[31m-/* XSTORE elimination. */[m
[31m-TRef LJ_FASTCALL lj_opt_dse_xstore(jit_State *J)[m
[31m-{[m
[31m-  IRRef xref = fins->op1;[m
[31m-  IRIns *xr = IR(xref);[m
[31m-  IRRef lim = xref;  /* Search limit. */[m
[31m-  IRRef val = fins->op2;  /* Stored value reference. */[m
[31m-  IRRef1 *refp = &J->chain[IR_XSTORE];[m
[31m-  IRRef ref = *refp;[m
[31m-  if (J->chain[IR_CALLXS] > lim) lim = J->chain[IR_CALLXS];[m
[31m-  if (J->chain[IR_XBAR] > lim) lim = J->chain[IR_XBAR];[m
[31m-  if (J->chain[IR_XSNEW] > lim) lim = J->chain[IR_XSNEW];[m
[31m-  while (ref > lim) {  /* Search for redundant or conflicting stores. */[m
[31m-    IRIns *store = IR(ref);[m
[31m-    switch (aa_xref(J, xr, fins, store)) {[m
[31m-    case ALIAS_NO:[m
[31m-      break;  /* Continue searching. */[m
[31m-    case ALIAS_MAY:[m
[31m-      if (store->op2 != val)  /* Conflict if the value is different. */[m
[31m-	goto doemit;[m
[31m-      break;  /* Otherwise continue searching. */[m
[31m-    case ALIAS_MUST:[m
[31m-      if (store->op2 == val)  /* Same value: drop the new store. */[m
[31m-	return DROPFOLD;[m
[31m-      /* Different value: try to eliminate the redundant store. */[m
[31m-      if (ref > J->chain[IR_LOOP]) {  /* Quick check to avoid crossing LOOP. */[m
[31m-	IRIns *ir;[m
[31m-	/* Check for any intervening guards or any XLOADs (no AA performed). */[m
[31m-	for (ir = IR(J->cur.nins-1); ir > store; ir--)[m
[31m-	  if (irt_isguard(ir->t) || ir->o == IR_XLOAD)[m
[31m-	    goto doemit;  /* No elimination possible. */[m
[31m-	/* Remove redundant store from chain and replace with NOP. */[m
[31m-	*refp = store->prev;[m
[31m-	store->o = IR_NOP;[m
[31m-	store->t.irt = IRT_NIL;[m
[31m-	store->op1 = store->op2 = 0;[m
[31m-	store->prev = 0;[m
[31m-	/* Now emit the new store instead. */[m
[31m-      }[m
[31m-      goto doemit;[m
[31m-    }[m
[31m-    ref = *(refp = &store->prev);[m
[31m-  }[m
[31m-doemit:[m
[31m-  return EMITFOLD;  /* Otherwise we have a conflict or simply no match. */[m
[31m-}[m
[31m-[m
[31m-/* -- Forwarding of lj_tab_len -------------------------------------------- */[m
[31m-[m
[31m-/* This is rather simplistic right now, but better than nothing. */[m
[31m-TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J)[m
[31m-{[m
[31m-  IRRef tab = fins->op1;  /* Table reference. */[m
[31m-  IRRef lim = tab;  /* Search limit. */[m
[31m-  IRRef ref;[m
[31m-[m
[31m-  /* Any ASTORE is a conflict and limits the search. */[m
[31m-  if (J->chain[IR_ASTORE] > lim) lim = J->chain[IR_ASTORE];[m
[31m-[m
[31m-  /* Search for conflicting HSTORE with numeric key. */[m
[31m-  ref = J->chain[IR_HSTORE];[m
[31m-  while (ref > lim) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    IRIns *href = IR(store->op1);[m
[31m-    IRIns *key = IR(href->op2);[m
[31m-    if (irt_isnum(key->o == IR_KSLOT ? IR(key->op1)->t : key->t)) {[m
[31m-      lim = ref;  /* Conflicting store found, limits search for TLEN. */[m
[31m-      break;[m
[31m-    }[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* Search for aliasing table.clear. */[m
[31m-  if (!fwd_aa_tab_clear(J, lim, tab))[m
[31m-    return lj_ir_emit(J);[m
[31m-[m
[31m-  /* Try to find a matching load. Below the conflicting store, if any. */[m
[31m-  return lj_opt_cselim(J, lim);[m
[31m-}[m
[31m-[m
[31m-/* -- ASTORE/HSTORE previous type analysis -------------------------------- */[m
[31m-[m
[31m-/* Check whether the previous value for a table store is non-nil.[m
[31m-** This can be derived either from a previous store or from a previous[m
[31m-** load (because all loads from tables perform a type check).[m
[31m-**[m
[31m-** The result of the analysis can be used to avoid the metatable check[m
[31m-** and the guard against HREF returning niltv. Both of these are cheap,[m
[31m-** so let's not spend too much effort on the analysis.[m
[31m-**[m
[31m-** A result of 1 is exact: previous value CANNOT be nil.[m
[31m-** A result of 0 is inexact: previous value MAY be nil.[m
[31m-*/[m
[31m-int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref)[m
[31m-{[m
[31m-  /* First check stores. */[m
[31m-  IRRef ref = J->chain[loadop+IRDELTA_L2S];[m
[31m-  while (ref > xref) {[m
[31m-    IRIns *store = IR(ref);[m
[31m-    if (store->op1 == xref) {  /* Same xREF. */[m
[31m-      /* A nil store MAY alias, but a non-nil store MUST alias. */[m
[31m-      return !irt_isnil(store->t);[m
[31m-    } else if (irt_isnil(store->t)) {  /* Must check any nil store. */[m
[31m-      IRRef skref = IR(store->op1)->op2;[m
[31m-      IRRef xkref = IR(xref)->op2;[m
[31m-      /* Same key type MAY alias. Need ALOAD check due to multiple int types. */[m
[31m-      if (loadop == IR_ALOAD || irt_sametype(IR(skref)->t, IR(xkref)->t)) {[m
[31m-	if (skref == xkref || !irref_isk(skref) || !irref_isk(xkref))[m
[31m-	  return 0;  /* A nil store with same const key or var key MAY alias. */[m
[31m-	/* Different const keys CANNOT alias. */[m
[31m-      }  /* Different key types CANNOT alias. */[m
[31m-    }  /* Other non-nil stores MAY alias. */[m
[31m-    ref = store->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* Check loads since nothing could be derived from stores. */[m
[31m-  ref = J->chain[loadop];[m
[31m-  while (ref > xref) {[m
[31m-    IRIns *load = IR(ref);[m
[31m-    if (load->op1 == xref) {  /* Same xREF. */[m
[31m-      /* A nil load MAY alias, but a non-nil load MUST alias. */[m
[31m-      return !irt_isnil(load->t);[m
[31m-    }  /* Other non-nil loads MAY alias. */[m
[31m-    ref = load->prev;[m
[31m-  }[m
[31m-  return 0;  /* Nothing derived at all, previous value MAY be nil. */[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-[m
[31m-#undef IR[m
[31m-#undef fins[m
[31m-#undef fleft[m
[31m-#undef fright[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_narrow.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_narrow.c[m
[1mdeleted file mode 100644[m
[1mindex 36be66e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_narrow.c[m
[1m+++ /dev/null[m
[36m@@ -1,654 +0,0 @@[m
[31m-/*[m
[31m-** NARROW: Narrowing of numbers to integers (double to int32_t).[m
[31m-** STRIPOV: Stripping of overflow checks.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_narrow_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_strscan.h"[m
[31m-[m
[31m-/* Rationale for narrowing optimizations:[m
[31m-**[m
[31m-** Lua has only a single number type and this is a FP double by default.[m
[31m-** Narrowing doubles to integers does not pay off for the interpreter on a[m
[31m-** current-generation x86/x64 machine. Most FP operations need the same[m
[31m-** amount of execution resources as their integer counterparts, except[m
[31m-** with slightly longer latencies. Longer latencies are a non-issue for[m
[31m-** the interpreter, since they are usually hidden by other overhead.[m
[31m-**[m
[31m-** The total CPU execution bandwidth is the sum of the bandwidth of the FP[m
[31m-** and the integer units, because they execute in parallel. The FP units[m
[31m-** have an equal or higher bandwidth than the integer units. Not using[m
[31m-** them means losing execution bandwidth. Moving work away from them to[m
[31m-** the already quite busy integer units is a losing proposition.[m
[31m-**[m
[31m-** The situation for JIT-compiled code is a bit different: the higher code[m
[31m-** density makes the extra latencies much more visible. Tight loops expose[m
[31m-** the latencies for updating the induction variables. Array indexing[m
[31m-** requires narrowing conversions with high latencies and additional[m
[31m-** guards (to check that the index is really an integer). And many common[m
[31m-** optimizations only work on integers.[m
[31m-**[m
[31m-** One solution would be speculative, eager narrowing of all number loads.[m
[31m-** This causes many problems, like losing -0 or the need to resolve type[m
[31m-** mismatches between traces. It also effectively forces the integer type[m
[31m-** to have overflow-checking semantics. This impedes many basic[m
[31m-** optimizations and requires adding overflow checks to all integer[m
[31m-** arithmetic operations (whereas FP arithmetics can do without).[m
[31m-**[m
[31m-** Always replacing an FP op with an integer op plus an overflow check is[m
[31m-** counter-productive on a current-generation super-scalar CPU. Although[m
[31m-** the overflow check branches are highly predictable, they will clog the[m
[31m-** execution port for the branch unit and tie up reorder buffers. This is[m
[31m-** turning a pure data-flow dependency into a different data-flow[m
[31m-** dependency (with slightly lower latency) *plus* a control dependency.[m
[31m-** In general, you don't want to do this since latencies due to data-flow[m
[31m-** dependencies can be well hidden by out-of-order execution.[m
[31m-**[m
[31m-** A better solution is to keep all numbers as FP values and only narrow[m
[31m-** when it's beneficial to do so. LuaJIT uses predictive narrowing for[m
[31m-** induction variables and demand-driven narrowing for index expressions,[m
[31m-** integer arguments and bit operations. Additionally it can eliminate or[m
[31m-** hoist most of the resulting overflow checks. Regular arithmetic[m
[31m-** computations are never narrowed to integers.[m
[31m-**[m
[31m-** The integer type in the IR has convenient wrap-around semantics and[m
[31m-** ignores overflow. Extra operations have been added for[m
[31m-** overflow-checking arithmetic (ADDOV/SUBOV) instead of an extra type.[m
[31m-** Apart from reducing overall complexity of the compiler, this also[m
[31m-** nicely solves the problem where you want to apply algebraic[m
[31m-** simplifications to ADD, but not to ADDOV. And the x86/x64 assembler can[m
[31m-** use lea instead of an add for integer ADD, but not for ADDOV (lea does[m
[31m-** not affect the flags, but it helps to avoid register moves).[m
[31m-**[m
[31m-**[m
[31m-** All of the above has to be reconsidered for architectures with slow FP[m
[31m-** operations or without a hardware FPU. The dual-number mode of LuaJIT[m
[31m-** addresses this issue. Arithmetic operations are performed on integers[m
[31m-** as far as possible and overflow checks are added as needed.[m
[31m-**[m
[31m-** This implies that narrowing for integer arguments and bit operations[m
[31m-** should also strip overflow checks, e.g. replace ADDOV with ADD. The[m
[31m-** original overflow guards are weak and can be eliminated by DCE, if[m
[31m-** there's no other use.[m
[31m-**[m
[31m-** A slight twist is that it's usually beneficial to use overflow-checked[m
[31m-** integer arithmetics if all inputs are already integers. This is the only[m
[31m-** change that affects the single-number mode, too.[m
[31m-*/[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-#define fins			(&J->fold.ins)[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-#define emitir_raw(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))[m
[31m-[m
[31m-/* -- Elimination of narrowing type conversions --------------------------- */[m
[31m-[m
[31m-/* Narrowing of index expressions and bit operations is demand-driven. The[m
[31m-** trace recorder emits a narrowing type conversion (CONV.int.num or TOBIT)[m
[31m-** in all of these cases (e.g. array indexing or string indexing). FOLD[m
[31m-** already takes care of eliminating simple redundant conversions like[m
[31m-** CONV.int.num(CONV.num.int(x)) ==> x.[m
[31m-**[m
[31m-** But the surrounding code is FP-heavy and arithmetic operations are[m
[31m-** performed on FP numbers (for the single-number mode). Consider a common[m
[31m-** example such as 'x=t[i+1]', with 'i' already an integer (due to induction[m
[31m-** variable narrowing). The index expression would be recorded as[m
[31m-**   CONV.int.num(ADD(CONV.num.int(i), 1))[m
[31m-** which is clearly suboptimal.[m
[31m-**[m
[31m-** One can do better by recursively backpropagating the narrowing type[m
[31m-** conversion across FP arithmetic operations. This turns FP ops into[m
[31m-** their corresponding integer counterparts. Depending on the semantics of[m
[31m-** the conversion they also need to check for overflow. Currently only ADD[m
[31m-** and SUB are supported.[m
[31m-**[m
[31m-** The above example can be rewritten as[m
[31m-**   ADDOV(CONV.int.num(CONV.num.int(i)), 1)[m
[31m-** and then into ADDOV(i, 1) after folding of the conversions. The original[m
[31m-** FP ops remain in the IR and are eliminated by DCE since all references to[m
[31m-** them are gone.[m
[31m-**[m
[31m-** [In dual-number mode the trace recorder already emits ADDOV etc., but[m
[31m-** this can be further reduced. See below.][m
[31m-**[m
[31m-** Special care has to be taken to avoid narrowing across an operation[m
[31m-** which is potentially operating on non-integral operands. One obvious[m
[31m-** case is when an expression contains a non-integral constant, but ends[m
[31m-** up as an integer index at runtime (like t[x+1.5] with x=0.5).[m
[31m-**[m
[31m-** Operations with two non-constant operands illustrate a similar problem[m
[31m-** (like t[a+b] with a=1.5 and b=2.5). Backpropagation has to stop there,[m
[31m-** unless it can be proven that either operand is integral (e.g. by CSEing[m
[31m-** a previous conversion). As a not-so-obvious corollary this logic also[m
[31m-** applies for a whole expression tree (e.g. t[(a+1)+(b+1)]).[m
[31m-**[m
[31m-** Correctness of the transformation is guaranteed by avoiding to expand[m
[31m-** the tree by adding more conversions than the one we would need to emit[m
[31m-** if not backpropagating. TOBIT employs a more optimistic rule, because[m
[31m-** the conversion has special semantics, designed to make the life of the[m
[31m-** compiler writer easier. ;-)[m
[31m-**[m
[31m-** Using on-the-fly backpropagation of an expression tree doesn't work[m
[31m-** because it's unknown whether the transform is correct until the end.[m
[31m-** This either requires IR rollback and cache invalidation for every[m
[31m-** subtree or a two-pass algorithm. The former didn't work out too well,[m
[31m-** so the code now combines a recursive collector with a stack-based[m
[31m-** emitter.[m
[31m-**[m
[31m-** [A recursive backpropagation algorithm with backtracking, employing[m
[31m-** skip-list lookup and round-robin caching, emitting stack operations[m
[31m-** on-the-fly for a stack-based interpreter -- and all of that in a meager[m
[31m-** kilobyte? Yep, compilers are a great treasure chest. Throw away your[m
[31m-** textbooks and read the codebase of a compiler today!][m
[31m-**[m
[31m-** There's another optimization opportunity for array indexing: it's[m
[31m-** always accompanied by an array bounds-check. The outermost overflow[m
[31m-** check may be delegated to the ABC operation. This works because ABC is[m
[31m-** an unsigned comparison and wrap-around due to overflow creates negative[m
[31m-** numbers.[m
[31m-**[m
[31m-** But this optimization is only valid for constants that cannot overflow[m
[31m-** an int32_t into the range of valid array indexes [0..2^27+1). A check[m
[31m-** for +-2^30 is safe since -2^31 - 2^30 wraps to 2^30 and 2^31-1 + 2^30[m
[31m-** wraps to -2^30-1.[m
[31m-**[m
[31m-** It's also good enough in practice, since e.g. t[i+1] or t[i-10] are[m
[31m-** quite common. So the above example finally ends up as ADD(i, 1)![m
[31m-**[m
[31m-** Later on, the assembler is able to fuse the whole array reference and[m
[31m-** the ADD into the memory operands of loads and other instructions. This[m
[31m-** is why LuaJIT is able to generate very pretty (and fast) machine code[m
[31m-** for array indexing. And that, my dear, concludes another story about[m
[31m-** one of the hidden secrets of LuaJIT ...[m
[31m-*/[m
[31m-[m
[31m-/* Maximum backpropagation depth and maximum stack size. */[m
[31m-#define NARROW_MAX_BACKPROP	100[m
[31m-#define NARROW_MAX_STACK	256[m
[31m-[m
[31m-/* The stack machine has a 32 bit instruction format: [IROpT | IRRef1][m
[31m-** The lower 16 bits hold a reference (or 0). The upper 16 bits hold[m
[31m-** the IR opcode + type or one of the following special opcodes:[m
[31m-*/[m
[31m-enum {[m
[31m-  NARROW_REF,		/* Push ref. */[m
[31m-  NARROW_CONV,		/* Push conversion of ref. */[m
[31m-  NARROW_SEXT,		/* Push sign-extension of ref. */[m
[31m-  NARROW_INT		/* Push KINT ref. The next code holds an int32_t. */[m
[31m-};[m
[31m-[m
[31m-typedef uint32_t NarrowIns;[m
[31m-[m
[31m-#define NARROWINS(op, ref)	(((op) << 16) + (ref))[m
[31m-#define narrow_op(ins)		((IROpT)((ins) >> 16))[m
[31m-#define narrow_ref(ins)		((IRRef1)(ins))[m
[31m-[m
[31m-/* Context used for narrowing of type conversions. */[m
[31m-typedef struct NarrowConv {[m
[31m-  jit_State *J;		/* JIT compiler state. */[m
[31m-  NarrowIns *sp;	/* Current stack pointer. */[m
[31m-  NarrowIns *maxsp;	/* Maximum stack pointer minus redzone. */[m
[31m-  IRRef mode;		/* Conversion mode (IRCONV_*). */[m
[31m-  IRType t;		/* Destination type: IRT_INT or IRT_I64. */[m
[31m-  NarrowIns stack[NARROW_MAX_STACK];  /* Stack holding stack-machine code. */[m
[31m-} NarrowConv;[m
[31m-[m
[31m-/* Lookup a reference in the backpropagation cache. */[m
[31m-static BPropEntry *narrow_bpc_get(jit_State *J, IRRef1 key, IRRef mode)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = 0; i < BPROP_SLOTS; i++) {[m
[31m-    BPropEntry *bp = &J->bpropcache[i];[m
[31m-    /* Stronger checks are ok, too. */[m
[31m-    if (bp->key == key && bp->mode >= mode &&[m
[31m-	((bp->mode ^ mode) & IRCONV_MODEMASK) == 0)[m
[31m-      return bp;[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Add an entry to the backpropagation cache. */[m
[31m-static void narrow_bpc_set(jit_State *J, IRRef1 key, IRRef1 val, IRRef mode)[m
[31m-{[m
[31m-  uint32_t slot = J->bpropslot;[m
[31m-  BPropEntry *bp = &J->bpropcache[slot];[m
[31m-  J->bpropslot = (slot + 1) & (BPROP_SLOTS-1);[m
[31m-  bp->key = key;[m
[31m-  bp->val = val;[m
[31m-  bp->mode = mode;[m
[31m-}[m
[31m-[m
[31m-/* Backpropagate overflow stripping. */[m
[31m-static void narrow_stripov_backprop(NarrowConv *nc, IRRef ref, int depth)[m
[31m-{[m
[31m-  jit_State *J = nc->J;[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (ir->o == IR_ADDOV || ir->o == IR_SUBOV ||[m
[31m-      (ir->o == IR_MULOV && (nc->mode & IRCONV_CONVMASK) == IRCONV_ANY)) {[m
[31m-    BPropEntry *bp = narrow_bpc_get(nc->J, ref, IRCONV_TOBIT);[m
[31m-    if (bp) {[m
[31m-      ref = bp->val;[m
[31m-    } else if (++depth < NARROW_MAX_BACKPROP && nc->sp < nc->maxsp) {[m
[31m-      NarrowIns *savesp = nc->sp;[m
[31m-      narrow_stripov_backprop(nc, ir->op1, depth);[m
[31m-      if (nc->sp < nc->maxsp) {[m
[31m-	narrow_stripov_backprop(nc, ir->op2, depth);[m
[31m-	if (nc->sp < nc->maxsp) {[m
[31m-	  *nc->sp++ = NARROWINS(IRT(ir->o - IR_ADDOV + IR_ADD, IRT_INT), ref);[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-      nc->sp = savesp;  /* Path too deep, need to backtrack. */[m
[31m-    }[m
[31m-  }[m
[31m-  *nc->sp++ = NARROWINS(NARROW_REF, ref);[m
[31m-}[m
[31m-[m
[31m-/* Backpropagate narrowing conversion. Return number of needed conversions. */[m
[31m-static int narrow_conv_backprop(NarrowConv *nc, IRRef ref, int depth)[m
[31m-{[m
[31m-  jit_State *J = nc->J;[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  IRRef cref;[m
[31m-[m
[31m-  if (nc->sp >= nc->maxsp) return 10;  /* Path too deep. */[m
[31m-[m
[31m-  /* Check the easy cases first. */[m
[31m-  if (ir->o == IR_CONV && (ir->op2 & IRCONV_SRCMASK) == IRT_INT) {[m
[31m-    if ((nc->mode & IRCONV_CONVMASK) <= IRCONV_ANY)[m
[31m-      narrow_stripov_backprop(nc, ir->op1, depth+1);[m
[31m-    else[m
[31m-      *nc->sp++ = NARROWINS(NARROW_REF, ir->op1);  /* Undo conversion. */[m
[31m-    if (nc->t == IRT_I64)[m
[31m-      *nc->sp++ = NARROWINS(NARROW_SEXT, 0);  /* Sign-extend integer. */[m
[31m-    return 0;[m
[31m-  } else if (ir->o == IR_KNUM) {  /* Narrow FP constant. */[m
[31m-    lua_Number n = ir_knum(ir)->n;[m
[31m-    if ((nc->mode & IRCONV_CONVMASK) == IRCONV_TOBIT) {[m
[31m-      /* Allows a wider range of constants. */[m
[31m-      int64_t k64 = (int64_t)n;[m
[31m-      if (n == (lua_Number)k64) {  /* Only if const doesn't lose precision. */[m
[31m-	*nc->sp++ = NARROWINS(NARROW_INT, 0);[m
[31m-	*nc->sp++ = (NarrowIns)k64;  /* But always truncate to 32 bits. */[m
[31m-	return 0;[m
[31m-      }[m
[31m-    } else {[m
[31m-      int32_t k = lj_num2int(n);[m
[31m-      /* Only if constant is a small integer. */[m
[31m-      if (checki16(k) && n == (lua_Number)k) {[m
[31m-	*nc->sp++ = NARROWINS(NARROW_INT, 0);[m
[31m-	*nc->sp++ = (NarrowIns)k;[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    return 10;  /* Never narrow other FP constants (this is rare). */[m
[31m-  }[m
[31m-[m
[31m-  /* Try to CSE the conversion. Stronger checks are ok, too. */[m
[31m-  cref = J->chain[fins->o];[m
[31m-  while (cref > ref) {[m
[31m-    IRIns *cr = IR(cref);[m
[31m-    if (cr->op1 == ref &&[m
[31m-	(fins->o == IR_TOBIT ||[m
[31m-	 ((cr->op2 & IRCONV_MODEMASK) == (nc->mode & IRCONV_MODEMASK) &&[m
[31m-	  irt_isguard(cr->t) >= irt_isguard(fins->t)))) {[m
[31m-      *nc->sp++ = NARROWINS(NARROW_REF, cref);[m
[31m-      return 0;  /* Already there, no additional conversion needed. */[m
[31m-    }[m
[31m-    cref = cr->prev;[m
[31m-  }[m
[31m-[m
[31m-  /* Backpropagate across ADD/SUB. */[m
[31m-  if (ir->o == IR_ADD || ir->o == IR_SUB) {[m
[31m-    /* Try cache lookup first. */[m
[31m-    IRRef mode = nc->mode;[m
[31m-    BPropEntry *bp;[m
[31m-    /* Inner conversions need a stronger check. */[m
[31m-    if ((mode & IRCONV_CONVMASK) == IRCONV_INDEX && depth > 0)[m
[31m-      mode += IRCONV_CHECK-IRCONV_INDEX;[m
[31m-    bp = narrow_bpc_get(nc->J, (IRRef1)ref, mode);[m
[31m-    if (bp) {[m
[31m-      *nc->sp++ = NARROWINS(NARROW_REF, bp->val);[m
[31m-      return 0;[m
[31m-    } else if (nc->t == IRT_I64) {[m
[31m-      /* Try sign-extending from an existing (checked) conversion to int. */[m
[31m-      mode = (IRT_INT<<5)|IRT_NUM|IRCONV_INDEX;[m
[31m-      bp = narrow_bpc_get(nc->J, (IRRef1)ref, mode);[m
[31m-      if (bp) {[m
[31m-	*nc->sp++ = NARROWINS(NARROW_REF, bp->val);[m
[31m-	*nc->sp++ = NARROWINS(NARROW_SEXT, 0);[m
[31m-	return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    if (++depth < NARROW_MAX_BACKPROP && nc->sp < nc->maxsp) {[m
[31m-      NarrowIns *savesp = nc->sp;[m
[31m-      int count = narrow_conv_backprop(nc, ir->op1, depth);[m
[31m-      count += narrow_conv_backprop(nc, ir->op2, depth);[m
[31m-      if (count <= 1) {  /* Limit total number of conversions. */[m
[31m-	*nc->sp++ = NARROWINS(IRT(ir->o, nc->t), ref);[m
[31m-	return count;[m
[31m-      }[m
[31m-      nc->sp = savesp;  /* Too many conversions, need to backtrack. */[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Otherwise add a conversion. */[m
[31m-  *nc->sp++ = NARROWINS(NARROW_CONV, ref);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Emit the conversions collected during backpropagation. */[m
[31m-static IRRef narrow_conv_emit(jit_State *J, NarrowConv *nc)[m
[31m-{[m
[31m-  /* The fins fields must be saved now -- emitir() overwrites them. */[m
[31m-  IROpT guardot = irt_isguard(fins->t) ? IRTG(IR_ADDOV-IR_ADD, 0) : 0;[m
[31m-  IROpT convot = fins->ot;[m
[31m-  IRRef1 convop2 = fins->op2;[m
[31m-  NarrowIns *next = nc->stack;  /* List of instructions from backpropagation. */[m
[31m-  NarrowIns *last = nc->sp;[m
[31m-  NarrowIns *sp = nc->stack;  /* Recycle the stack to store operands. */[m
[31m-  while (next < last) {  /* Simple stack machine to process the ins. list. */[m
[31m-    NarrowIns ref = *next++;[m
[31m-    IROpT op = narrow_op(ref);[m
[31m-    if (op == NARROW_REF) {[m
[31m-      *sp++ = ref;[m
[31m-    } else if (op == NARROW_CONV) {[m
[31m-      *sp++ = emitir_raw(convot, ref, convop2);  /* Raw emit avoids a loop. */[m
[31m-    } else if (op == NARROW_SEXT) {[m
[31m-      lua_assert(sp >= nc->stack+1);[m
[31m-      sp[-1] = emitir(IRT(IR_CONV, IRT_I64), sp[-1],[m
[31m-		      (IRT_I64<<5)|IRT_INT|IRCONV_SEXT);[m
[31m-    } else if (op == NARROW_INT) {[m
[31m-      lua_assert(next < last);[m
[31m-      *sp++ = nc->t == IRT_I64 ?[m
[31m-	      lj_ir_kint64(J, (int64_t)(int32_t)*next++) :[m
[31m-	      lj_ir_kint(J, *next++);[m
[31m-    } else {  /* Regular IROpT. Pops two operands and pushes one result. */[m
[31m-      IRRef mode = nc->mode;[m
[31m-      lua_assert(sp >= nc->stack+2);[m
[31m-      sp--;[m
[31m-      /* Omit some overflow checks for array indexing. See comments above. */[m
[31m-      if ((mode & IRCONV_CONVMASK) == IRCONV_INDEX) {[m
[31m-	if (next == last && irref_isk(narrow_ref(sp[0])) &&[m
[31m-	  (uint32_t)IR(narrow_ref(sp[0]))->i + 0x40000000u < 0x80000000u)[m
[31m-	  guardot = 0;[m
[31m-	else  /* Otherwise cache a stronger check. */[m
[31m-	  mode += IRCONV_CHECK-IRCONV_INDEX;[m
[31m-      }[m
[31m-      sp[-1] = emitir(op+guardot, sp[-1], sp[0]);[m
[31m-      /* Add to cache. */[m
[31m-      if (narrow_ref(ref))[m
[31m-	narrow_bpc_set(J, narrow_ref(ref), narrow_ref(sp[-1]), mode);[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(sp == nc->stack+1);[m
[31m-  return nc->stack[0];[m
[31m-}[m
[31m-[m
[31m-/* Narrow a type conversion of an arithmetic operation. */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_convert(jit_State *J)[m
[31m-{[m
[31m-  if ((J->flags & JIT_F_OPT_NARROW)) {[m
[31m-    NarrowConv nc;[m
[31m-    nc.J = J;[m
[31m-    nc.sp = nc.stack;[m
[31m-    nc.maxsp = &nc.stack[NARROW_MAX_STACK-4];[m
[31m-    nc.t = irt_type(fins->t);[m
[31m-    if (fins->o == IR_TOBIT) {[m
[31m-      nc.mode = IRCONV_TOBIT;  /* Used only in the backpropagation cache. */[m
[31m-    } else {[m
[31m-      nc.mode = fins->op2;[m
[31m-    }[m
[31m-    if (narrow_conv_backprop(&nc, fins->op1, 0) <= 1)[m
[31m-      return narrow_conv_emit(J, &nc);[m
[31m-  }[m
[31m-  return NEXTFOLD;[m
[31m-}[m
[31m-[m
[31m-/* -- Narrowing of implicit conversions ----------------------------------- */[m
[31m-[m
[31m-/* Recursively strip overflow checks. */[m
[31m-static TRef narrow_stripov(jit_State *J, TRef tr, int lastop, IRRef mode)[m
[31m-{[m
[31m-  IRRef ref = tref_ref(tr);[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  int op = ir->o;[m
[31m-  if (op >= IR_ADDOV && op <= lastop) {[m
[31m-    BPropEntry *bp = narrow_bpc_get(J, ref, mode);[m
[31m-    if (bp) {[m
[31m-      return TREF(bp->val, irt_t(IR(bp->val)->t));[m
[31m-    } else {[m
[31m-      IRRef op1 = ir->op1, op2 = ir->op2;  /* The IR may be reallocated. */[m
[31m-      op1 = narrow_stripov(J, op1, lastop, mode);[m
[31m-      op2 = narrow_stripov(J, op2, lastop, mode);[m
[31m-      tr = emitir(IRT(op - IR_ADDOV + IR_ADD,[m
[31m-		      ((mode & IRCONV_DSTMASK) >> IRCONV_DSH)), op1, op2);[m
[31m-      narrow_bpc_set(J, ref, tref_ref(tr), mode);[m
[31m-    }[m
[31m-  } else if (LJ_64 && (mode & IRCONV_SEXT) && !irt_is64(ir->t)) {[m
[31m-    tr = emitir(IRT(IR_CONV, IRT_INTP), tr, mode);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Narrow array index. */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_index(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  lua_assert(tref_isnumber(tr));[m
[31m-  if (tref_isnum(tr))  /* Conversion may be narrowed, too. See above. */[m
[31m-    return emitir(IRTGI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_INDEX);[m
[31m-  /* Omit some overflow checks for array indexing. See comments above. */[m
[31m-  ir = IR(tref_ref(tr));[m
[31m-  if ((ir->o == IR_ADDOV || ir->o == IR_SUBOV) && irref_isk(ir->op2) &&[m
[31m-      (uint32_t)IR(ir->op2)->i + 0x40000000u < 0x80000000u)[m
[31m-    return emitir(IRTI(ir->o - IR_ADDOV + IR_ADD), ir->op1, ir->op2);[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Narrow conversion to integer operand (overflow undefined). */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_toint(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (tref_isstr(tr))[m
[31m-    tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-  if (tref_isnum(tr))  /* Conversion may be narrowed, too. See above. */[m
[31m-    return emitir(IRTI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_ANY);[m
[31m-  if (!tref_isinteger(tr))[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  /*[m
[31m-  ** Undefined overflow semantics allow stripping of ADDOV, SUBOV and MULOV.[m
[31m-  ** Use IRCONV_TOBIT for the cache entries, since the semantics are the same.[m
[31m-  */[m
[31m-  return narrow_stripov(J, tr, IR_MULOV, (IRT_INT<<5)|IRT_INT|IRCONV_TOBIT);[m
[31m-}[m
[31m-[m
[31m-/* Narrow conversion to bitop operand (overflow wrapped). */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_tobit(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  if (tref_isstr(tr))[m
[31m-    tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-  if (tref_isnum(tr))  /* Conversion may be narrowed, too. See above. */[m
[31m-    return emitir(IRTI(IR_TOBIT), tr, lj_ir_knum_tobit(J));[m
[31m-  if (!tref_isinteger(tr))[m
[31m-    lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-  /*[m
[31m-  ** Wrapped overflow semantics allow stripping of ADDOV and SUBOV.[m
[31m-  ** MULOV cannot be stripped due to precision widening.[m
[31m-  */[m
[31m-  return narrow_stripov(J, tr, IR_SUBOV, (IRT_INT<<5)|IRT_INT|IRCONV_TOBIT);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Narrow C array index (overflow undefined). */[m
[31m-TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef tr)[m
[31m-{[m
[31m-  lua_assert(tref_isnumber(tr));[m
[31m-  if (tref_isnum(tr))[m
[31m-    return emitir(IRT(IR_CONV, IRT_INTP), tr, (IRT_INTP<<5)|IRT_NUM|IRCONV_ANY);[m
[31m-  /* Undefined overflow semantics allow stripping of ADDOV, SUBOV and MULOV. */[m
[31m-  return narrow_stripov(J, tr, IR_MULOV,[m
[31m-			LJ_64 ? ((IRT_INTP<<5)|IRT_INT|IRCONV_SEXT) :[m
[31m-				((IRT_INTP<<5)|IRT_INT|IRCONV_TOBIT));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Narrowing of arithmetic operators ----------------------------------- */[m
[31m-[m
[31m-/* Check whether a number fits into an int32_t (-0 is ok, too). */[m
[31m-static int numisint(lua_Number n)[m
[31m-{[m
[31m-  return (n == (lua_Number)lj_num2int(n));[m
[31m-}[m
[31m-[m
[31m-/* Convert string to number. Error out for non-numeric string values. */[m
[31m-static TRef conv_str_tonum(jit_State *J, TRef tr, TValue *o)[m
[31m-{[m
[31m-  if (tref_isstr(tr)) {[m
[31m-    tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0);[m
[31m-    /* Would need an inverted STRTO for this rare and useless case. */[m
[31m-    if (!lj_strscan_num(strV(o), o))  /* Convert in-place. Value used below. */[m
[31m-      lj_trace_err(J, LJ_TRERR_BADTYPE);  /* Punt if non-numeric. */[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Narrowing of arithmetic operations. */[m
[31m-TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc,[m
[31m-			 TValue *vb, TValue *vc, IROp op)[m
[31m-{[m
[31m-  rb = conv_str_tonum(J, rb, vb);[m
[31m-  rc = conv_str_tonum(J, rc, vc);[m
[31m-  /* Must not narrow MUL in non-DUALNUM variant, because it loses -0. */[m
[31m-  if ((op >= IR_ADD && op <= (LJ_DUALNUM ? IR_MUL : IR_SUB)) &&[m
[31m-      tref_isinteger(rb) && tref_isinteger(rc) &&[m
[31m-      numisint(lj_vm_foldarith(numberVnum(vb), numberVnum(vc),[m
[31m-			       (int)op - (int)IR_ADD)))[m
[31m-    return emitir(IRTGI((int)op - (int)IR_ADD + (int)IR_ADDOV), rb, rc);[m
[31m-  if (!tref_isnum(rb)) rb = emitir(IRTN(IR_CONV), rb, IRCONV_NUM_INT);[m
[31m-  if (!tref_isnum(rc)) rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT);[m
[31m-  return emitir(IRTN(op), rb, rc);[m
[31m-}[m
[31m-[m
[31m-/* Narrowing of unary minus operator. */[m
[31m-TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc)[m
[31m-{[m
[31m-  rc = conv_str_tonum(J, rc, vc);[m
[31m-  if (tref_isinteger(rc)) {[m
[31m-    if ((uint32_t)numberVint(vc) != 0x80000000u)[m
[31m-      return emitir(IRTGI(IR_SUBOV), lj_ir_kint(J, 0), rc);[m
[31m-    rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT);[m
[31m-  }[m
[31m-  return emitir(IRTN(IR_NEG), rc, lj_ir_knum_neg(J));[m
[31m-}[m
[31m-[m
[31m-/* Narrowing of modulo operator. */[m
[31m-TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc)[m
[31m-{[m
[31m-  TRef tmp;[m
[31m-  rb = conv_str_tonum(J, rb, vb);[m
[31m-  rc = conv_str_tonum(J, rc, vc);[m
[31m-  if ((LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) &&[m
[31m-      tref_isinteger(rb) && tref_isinteger(rc) &&[m
[31m-      (tvisint(vc) ? intV(vc) != 0 : !tviszero(vc))) {[m
[31m-    emitir(IRTGI(IR_NE), rc, lj_ir_kint(J, 0));[m
[31m-    return emitir(IRTI(IR_MOD), rb, rc);[m
[31m-  }[m
[31m-  /* b % c ==> b - floor(b/c)*c */[m
[31m-  rb = lj_ir_tonum(J, rb);[m
[31m-  rc = lj_ir_tonum(J, rc);[m
[31m-  tmp = emitir(IRTN(IR_DIV), rb, rc);[m
[31m-  tmp = emitir(IRTN(IR_FPMATH), tmp, IRFPM_FLOOR);[m
[31m-  tmp = emitir(IRTN(IR_MUL), tmp, rc);[m
[31m-  return emitir(IRTN(IR_SUB), rb, tmp);[m
[31m-}[m
[31m-[m
[31m-/* Narrowing of power operator or math.pow. */[m
[31m-TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc)[m
[31m-{[m
[31m-  rb = conv_str_tonum(J, rb, vb);[m
[31m-  rb = lj_ir_tonum(J, rb);  /* Left arg is always treated as an FP number. */[m
[31m-  rc = conv_str_tonum(J, rc, vc);[m
[31m-  /* Narrowing must be unconditional to preserve (-x)^i semantics. */[m
[31m-  if (tvisint(vc) || numisint(numV(vc))) {[m
[31m-    int checkrange = 0;[m
[31m-    /* Split pow is faster for bigger exponents. But do this only for (+k)^i. */[m
[31m-    if (tref_isk(rb) && (int32_t)ir_knum(IR(tref_ref(rb)))->u32.hi >= 0) {[m
[31m-      int32_t k = numberVint(vc);[m
[31m-      if (!(k >= -65536 && k <= 65536)) goto split_pow;[m
[31m-      checkrange = 1;[m
[31m-    }[m
[31m-    if (!tref_isinteger(rc)) {[m
[31m-      /* Guarded conversion to integer! */[m
[31m-      rc = emitir(IRTGI(IR_CONV), rc, IRCONV_INT_NUM|IRCONV_CHECK);[m
[31m-    }[m
[31m-    if (checkrange && !tref_isk(rc)) {  /* Range guard: -65536 <= i <= 65536 */[m
[31m-      TRef tmp = emitir(IRTI(IR_ADD), rc, lj_ir_kint(J, 65536));[m
[31m-      emitir(IRTGI(IR_ULE), tmp, lj_ir_kint(J, 2*65536));[m
[31m-    }[m
[31m-    return emitir(IRTN(IR_POW), rb, rc);[m
[31m-  }[m
[31m-split_pow:[m
[31m-  /* FOLD covers most cases, but some are easier to do here. */[m
[31m-  if (tref_isk(rb) && tvispone(ir_knum(IR(tref_ref(rb)))))[m
[31m-    return rb;  /* 1 ^ x ==> 1 */[m
[31m-  rc = lj_ir_tonum(J, rc);[m
[31m-  if (tref_isk(rc) && ir_knum(IR(tref_ref(rc)))->n == 0.5)[m
[31m-    return emitir(IRTN(IR_FPMATH), rb, IRFPM_SQRT);  /* x ^ 0.5 ==> sqrt(x) */[m
[31m-  /* Split up b^c into exp2(c*log2(b)). Assembler may rejoin later. */[m
[31m-  rb = emitir(IRTN(IR_FPMATH), rb, IRFPM_LOG2);[m
[31m-  rc = emitir(IRTN(IR_MUL), rb, rc);[m
[31m-  return emitir(IRTN(IR_FPMATH), rc, IRFPM_EXP2);[m
[31m-}[m
[31m-[m
[31m-/* -- Predictive narrowing of induction variables ------------------------- */[m
[31m-[m
[31m-/* Narrow a single runtime value. */[m
[31m-static int narrow_forl(jit_State *J, cTValue *o)[m
[31m-{[m
[31m-  if (tvisint(o)) return 1;[m
[31m-  if (LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) return numisint(numV(o));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Narrow the FORL index type by looking at the runtime values. */[m
[31m-IRType lj_opt_narrow_forl(jit_State *J, cTValue *tv)[m
[31m-{[m
[31m-  lua_assert(tvisnumber(&tv[FORL_IDX]) &&[m
[31m-	     tvisnumber(&tv[FORL_STOP]) &&[m
[31m-	     tvisnumber(&tv[FORL_STEP]));[m
[31m-  /* Narrow only if the runtime values of start/stop/step are all integers. */[m
[31m-  if (narrow_forl(J, &tv[FORL_IDX]) &&[m
[31m-      narrow_forl(J, &tv[FORL_STOP]) &&[m
[31m-      narrow_forl(J, &tv[FORL_STEP])) {[m
[31m-    /* And if the loop index can't possibly overflow. */[m
[31m-    lua_Number step = numberVnum(&tv[FORL_STEP]);[m
[31m-    lua_Number sum = numberVnum(&tv[FORL_STOP]) + step;[m
[31m-    if (0 <= step ? (sum <= 2147483647.0) : (sum >= -2147483648.0))[m
[31m-      return IRT_INT;[m
[31m-  }[m
[31m-  return IRT_NUM;[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef fins[m
[31m-#undef emitir[m
[31m-#undef emitir_raw[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_sink.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_sink.c[m
[1mdeleted file mode 100644[m
[1mindex 975ee83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_sink.c[m
[1m+++ /dev/null[m
[36m@@ -1,245 +0,0 @@[m
[31m-/*[m
[31m-** SINK: Allocation Sinking and Store Sinking.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_sink_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_target.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Check whether the store ref points to an eligible allocation. */[m
[31m-static IRIns *sink_checkalloc(jit_State *J, IRIns *irs)[m
[31m-{[m
[31m-  IRIns *ir = IR(irs->op1);[m
[31m-  if (!irref_isk(ir->op2))[m
[31m-    return NULL;  /* Non-constant key. */[m
[31m-  if (ir->o == IR_HREFK || ir->o == IR_AREF)[m
[31m-    ir = IR(ir->op1);[m
[31m-  else if (!(ir->o == IR_HREF || ir->o == IR_NEWREF ||[m
[31m-	     ir->o == IR_FREF || ir->o == IR_ADD))[m
[31m-    return NULL;  /* Unhandled reference type (for XSTORE). */[m
[31m-  ir = IR(ir->op1);[m
[31m-  if (!(ir->o == IR_TNEW || ir->o == IR_TDUP || ir->o == IR_CNEW))[m
[31m-    return NULL;  /* Not an allocation. */[m
[31m-  return ir;  /* Return allocation. */[m
[31m-}[m
[31m-[m
[31m-/* Recursively check whether a value depends on a PHI. */[m
[31m-static int sink_phidep(jit_State *J, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = IR(ref);[m
[31m-  if (irt_isphi(ir->t)) return 1;[m
[31m-  if (ir->op1 >= REF_FIRST && sink_phidep(J, ir->op1)) return 1;[m
[31m-  if (ir->op2 >= REF_FIRST && sink_phidep(J, ir->op2)) return 1;[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a value is a sinkable PHI or loop-invariant. */[m
[31m-static int sink_checkphi(jit_State *J, IRIns *ira, IRRef ref)[m
[31m-{[m
[31m-  if (ref >= REF_FIRST) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (irt_isphi(ir->t) || (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT &&[m
[31m-			     irt_isphi(IR(ir->op1)->t))) {[m
[31m-      ira->prev++;[m
[31m-      return 1;  /* Sinkable PHI. */[m
[31m-    }[m
[31m-    /* Otherwise the value must be loop-invariant. */[m
[31m-    return ref < J->loopref && !sink_phidep(J, ref);[m
[31m-  }[m
[31m-  return 1;  /* Constant (non-PHI). */[m
[31m-}[m
[31m-[m
[31m-/* Mark non-sinkable allocations using single-pass backward propagation.[m
[31m-**[m
[31m-** Roots for the marking process are:[m
[31m-** - Some PHIs or snapshots (see below).[m
[31m-** - Non-PHI, non-constant values stored to PHI allocations.[m
[31m-** - All guards.[m
[31m-** - Any remaining loads not eliminated by store-to-load forwarding.[m
[31m-** - Stores with non-constant keys.[m
[31m-** - All stored values.[m
[31m-*/[m
[31m-static void sink_mark_ins(jit_State *J)[m
[31m-{[m
[31m-  IRIns *ir, *irlast = IR(J->cur.nins-1);[m
[31m-  for (ir = irlast ; ; ir--) {[m
[31m-    switch (ir->o) {[m
[31m-    case IR_BASE:[m
[31m-      return;  /* Finished. */[m
[31m-    case IR_CALLL:  /* IRCALL_lj_tab_len */[m
[31m-    case IR_ALOAD: case IR_HLOAD: case IR_XLOAD: case IR_TBAR:[m
[31m-      irt_setmark(IR(ir->op1)->t);  /* Mark ref for remaining loads. */[m
[31m-      break;[m
[31m-    case IR_FLOAD:[m
[31m-      if (irt_ismarked(ir->t) || ir->op2 == IRFL_TAB_META)[m
[31m-	irt_setmark(IR(ir->op1)->t);  /* Mark table for remaining loads. */[m
[31m-      break;[m
[31m-    case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: {[m
[31m-      IRIns *ira = sink_checkalloc(J, ir);[m
[31m-      if (!ira || (irt_isphi(ira->t) && !sink_checkphi(J, ira, ir->op2)))[m
[31m-	irt_setmark(IR(ir->op1)->t);  /* Mark ineligible ref. */[m
[31m-      irt_setmark(IR(ir->op2)->t);  /* Mark stored value. */[m
[31m-      break;[m
[31m-      }[m
[31m-#if LJ_HASFFI[m
[31m-    case IR_CNEWI:[m
[31m-      if (irt_isphi(ir->t) &&[m
[31m-	  (!sink_checkphi(J, ir, ir->op2) ||[m
[31m-	   (LJ_32 && ir+1 < irlast && (ir+1)->o == IR_HIOP &&[m
[31m-	    !sink_checkphi(J, ir, (ir+1)->op2))))[m
[31m-	irt_setmark(ir->t);  /* Mark ineligible allocation. */[m
[31m-      /* fallthrough */[m
[31m-#endif[m
[31m-    case IR_USTORE:[m
[31m-      irt_setmark(IR(ir->op2)->t);  /* Mark stored value. */[m
[31m-      break;[m
[31m-#if LJ_HASFFI[m
[31m-    case IR_CALLXS:[m
[31m-#endif[m
[31m-    case IR_CALLS:[m
[31m-      irt_setmark(IR(ir->op1)->t);  /* Mark (potentially) stored values. */[m
[31m-      break;[m
[31m-    case IR_PHI: {[m
[31m-      IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-      irl->prev = irr->prev = 0;  /* Clear PHI value counts. */[m
[31m-      if (irl->o == irr->o &&[m
[31m-	  (irl->o == IR_TNEW || irl->o == IR_TDUP ||[m
[31m-	   (LJ_HASFFI && (irl->o == IR_CNEW || irl->o == IR_CNEWI))))[m
[31m-	break;[m
[31m-      irt_setmark(irl->t);[m
[31m-      irt_setmark(irr->t);[m
[31m-      break;[m
[31m-      }[m
[31m-    default:[m
[31m-      if (irt_ismarked(ir->t) || irt_isguard(ir->t)) {  /* Propagate mark. */[m
[31m-	if (ir->op1 >= REF_FIRST) irt_setmark(IR(ir->op1)->t);[m
[31m-	if (ir->op2 >= REF_FIRST) irt_setmark(IR(ir->op2)->t);[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Mark all instructions referenced by a snapshot. */[m
[31m-static void sink_mark_snap(jit_State *J, SnapShot *snap)[m
[31m-{[m
[31m-  SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    IRRef ref = snap_ref(map[n]);[m
[31m-    if (!irref_isk(ref))[m
[31m-      irt_setmark(IR(ref)->t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Iteratively remark PHI refs with differing marks or PHI value counts. */[m
[31m-static void sink_remark_phi(jit_State *J)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  int remark;[m
[31m-  do {[m
[31m-    remark = 0;[m
[31m-    for (ir = IR(J->cur.nins-1); ir->o == IR_PHI; ir--) {[m
[31m-      IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);[m
[31m-      if (((irl->t.irt ^ irr->t.irt) & IRT_MARK))[m
[31m-	remark = 1;[m
[31m-      else if (irl->prev == irr->prev)[m
[31m-	continue;[m
[31m-      irt_setmark(IR(ir->op1)->t);[m
[31m-      irt_setmark(IR(ir->op2)->t);[m
[31m-    }[m
[31m-  } while (remark);[m
[31m-}[m
[31m-[m
[31m-/* Sweep instructions and tag sunken allocations and stores. */[m
[31m-static void sink_sweep_ins(jit_State *J)[m
[31m-{[m
[31m-  IRIns *ir, *irfirst = IR(J->cur.nk);[m
[31m-  for (ir = IR(J->cur.nins-1) ; ir >= irfirst; ir--) {[m
[31m-    switch (ir->o) {[m
[31m-    case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: {[m
[31m-      IRIns *ira = sink_checkalloc(J, ir);[m
[31m-      if (ira && !irt_ismarked(ira->t)) {[m
[31m-	int delta = (int)(ir - ira);[m
[31m-	ir->prev = REGSP(RID_SINK, delta > 255 ? 255 : delta);[m
[31m-      } else {[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-      }[m
[31m-      break;[m
[31m-      }[m
[31m-    case IR_NEWREF:[m
[31m-      if (!irt_ismarked(IR(ir->op1)->t)) {[m
[31m-	ir->prev = REGSP(RID_SINK, 0);[m
[31m-      } else {[m
[31m-	irt_clearmark(ir->t);[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-      }[m
[31m-      break;[m
[31m-#if LJ_HASFFI[m
[31m-    case IR_CNEW: case IR_CNEWI:[m
[31m-#endif[m
[31m-    case IR_TNEW: case IR_TDUP:[m
[31m-      if (!irt_ismarked(ir->t)) {[m
[31m-	ir->t.irt &= ~IRT_GUARD;[m
[31m-	ir->prev = REGSP(RID_SINK, 0);[m
[31m-	J->cur.sinktags = 1;  /* Signal present SINK tags to assembler. */[m
[31m-      } else {[m
[31m-	irt_clearmark(ir->t);[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-      }[m
[31m-      break;[m
[31m-    case IR_PHI: {[m
[31m-      IRIns *ira = IR(ir->op2);[m
[31m-      if (!irt_ismarked(ira->t) &&[m
[31m-	  (ira->o == IR_TNEW || ira->o == IR_TDUP ||[m
[31m-	   (LJ_HASFFI && (ira->o == IR_CNEW || ira->o == IR_CNEWI)))) {[m
[31m-	ir->prev = REGSP(RID_SINK, 0);[m
[31m-      } else {[m
[31m-	ir->prev = REGSP_INIT;[m
[31m-      }[m
[31m-      break;[m
[31m-      }[m
[31m-    default:[m
[31m-      irt_clearmark(ir->t);[m
[31m-      ir->prev = REGSP_INIT;[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Allocation sinking and store sinking.[m
[31m-**[m
[31m-** 1. Mark all non-sinkable allocations.[m
[31m-** 2. Then sink all remaining allocations and the related stores.[m
[31m-*/[m
[31m-void lj_opt_sink(jit_State *J)[m
[31m-{[m
[31m-  const uint32_t need = (JIT_F_OPT_SINK|JIT_F_OPT_FWD|[m
[31m-			 JIT_F_OPT_DCE|JIT_F_OPT_CSE|JIT_F_OPT_FOLD);[m
[31m-  if ((J->flags & need) == need &&[m
[31m-      (J->chain[IR_TNEW] || J->chain[IR_TDUP] ||[m
[31m-       (LJ_HASFFI && (J->chain[IR_CNEW] || J->chain[IR_CNEWI])))) {[m
[31m-    if (!J->loopref)[m
[31m-      sink_mark_snap(J, &J->cur.snap[J->cur.nsnap-1]);[m
[31m-    sink_mark_ins(J);[m
[31m-    if (J->loopref)[m
[31m-      sink_remark_phi(J);[m
[31m-    sink_sweep_ins(J);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_split.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_split.c[m
[1mdeleted file mode 100644[m
[1mindex 6def416..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_opt_split.c[m
[1m+++ /dev/null[m
[36m@@ -1,861 +0,0 @@[m
[31m-/*[m
[31m-** SPLIT: Split 64 bit IR instructions into 32 bit IR instructions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_opt_split_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT && (LJ_SOFTFP || (LJ_32 && LJ_HASFFI))[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* SPLIT pass:[m
[31m-**[m
[31m-** This pass splits up 64 bit IR instructions into multiple 32 bit IR[m
[31m-** instructions. It's only active for soft-float targets or for 32 bit CPUs[m
[31m-** which lack native 64 bit integer operations (the FFI is currently the[m
[31m-** only emitter for 64 bit integer instructions).[m
[31m-**[m
[31m-** Splitting the IR in a separate pass keeps each 32 bit IR assembler[m
[31m-** backend simple. Only a small amount of extra functionality needs to be[m
[31m-** implemented. This is much easier than adding support for allocating[m
[31m-** register pairs to each backend (believe me, I tried). A few simple, but[m
[31m-** important optimizations can be performed by the SPLIT pass, which would[m
[31m-** be tedious to do in the backend.[m
[31m-**[m
[31m-** The basic idea is to replace each 64 bit IR instruction with its 32 bit[m
[31m-** equivalent plus an extra HIOP instruction. The splitted IR is not passed[m
[31m-** through FOLD or any other optimizations, so each HIOP is guaranteed to[m
[31m-** immediately follow it's counterpart. The actual functionality of HIOP is[m
[31m-** inferred from the previous instruction.[m
[31m-**[m
[31m-** The operands of HIOP hold the hiword input references. The output of HIOP[m
[31m-** is the hiword output reference, which is also used to hold the hiword[m
[31m-** register or spill slot information. The register allocator treats this[m
[31m-** instruction independently of any other instruction, which improves code[m
[31m-** quality compared to using fixed register pairs.[m
[31m-**[m
[31m-** It's easier to split up some instructions into two regular 32 bit[m
[31m-** instructions. E.g. XLOAD is split up into two XLOADs with two different[m
[31m-** addresses. Obviously 64 bit constants need to be split up into two 32 bit[m
[31m-** constants, too. Some hiword instructions can be entirely omitted, e.g.[m
[31m-** when zero-extending a 32 bit value to 64 bits. 64 bit arguments for calls[m
[31m-** are split up into two 32 bit arguments each.[m
[31m-**[m
[31m-** On soft-float targets, floating-point instructions are directly converted[m
[31m-** to soft-float calls by the SPLIT pass (except for comparisons and MIN/MAX).[m
[31m-** HIOP for number results has the type IRT_SOFTFP ("sfp" in -jdump).[m
[31m-**[m
[31m-** Here's the IR and x64 machine code for 'x.b = x.a + 1' for a struct with[m
[31m-** two int64_t fields:[m
[31m-**[m
[31m-** 0100    p32 ADD    base  +8[m
[31m-** 0101    i64 XLOAD  0100[m
[31m-** 0102    i64 ADD    0101  +1[m
[31m-** 0103    p32 ADD    base  +16[m
[31m-** 0104    i64 XSTORE 0103  0102[m
[31m-**[m
[31m-**         mov rax, [esi+0x8][m
[31m-**         add rax, +0x01[m
[31m-**         mov [esi+0x10], rax[m
[31m-**[m
[31m-** Here's the transformed IR and the x86 machine code after the SPLIT pass:[m
[31m-**[m
[31m-** 0100    p32 ADD    base  +8[m
[31m-** 0101    int XLOAD  0100[m
[31m-** 0102    p32 ADD    base  +12[m
[31m-** 0103    int XLOAD  0102[m
[31m-** 0104    int ADD    0101  +1[m
[31m-** 0105    int HIOP   0103  +0[m
[31m-** 0106    p32 ADD    base  +16[m
[31m-** 0107    int XSTORE 0106  0104[m
[31m-** 0108    int HIOP   0106  0105[m
[31m-**[m
[31m-**         mov eax, [esi+0x8][m
[31m-**         mov ecx, [esi+0xc][m
[31m-**         add eax, +0x01[m
[31m-**         adc ecx, +0x00[m
[31m-**         mov [esi+0x10], eax[m
[31m-**         mov [esi+0x14], ecx[m
[31m-**[m
[31m-** You may notice the reassociated hiword address computation, which is[m
[31m-** later fused into the mov operands by the assembler.[m
[31m-*/[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)		(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Directly emit the transformed IR without updating chains etc. */[m
[31m-static IRRef split_emit(jit_State *J, uint16_t ot, IRRef1 op1, IRRef1 op2)[m
[31m-{[m
[31m-  IRRef nref = lj_ir_nextins(J);[m
[31m-  IRIns *ir = IR(nref);[m
[31m-  ir->ot = ot;[m
[31m-  ir->op1 = op1;[m
[31m-  ir->op2 = op2;[m
[31m-  return nref;[m
[31m-}[m
[31m-[m
[31m-#if LJ_SOFTFP[m
[31m-/* Emit a (checked) number to integer conversion. */[m
[31m-static IRRef split_num2int(jit_State *J, IRRef lo, IRRef hi, int check)[m
[31m-{[m
[31m-  IRRef tmp, res;[m
[31m-#if LJ_LE[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), lo, hi);[m
[31m-#else[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hi, lo);[m
[31m-#endif[m
[31m-  res = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_softfp_d2i);[m
[31m-  if (check) {[m
[31m-    tmp = split_emit(J, IRTI(IR_CALLN), res, IRCALL_softfp_i2d);[m
[31m-    split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp);[m
[31m-    split_emit(J, IRTGI(IR_EQ), tmp, lo);[m
[31m-    split_emit(J, IRTG(IR_HIOP, IRT_SOFTFP), tmp+1, hi);[m
[31m-  }[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-/* Emit a CALLN with one split 64 bit argument. */[m
[31m-static IRRef split_call_l(jit_State *J, IRRef1 *hisubst, IRIns *oir,[m
[31m-			  IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  IRRef tmp, op1 = ir->op1;[m
[31m-  J->cur.nins--;[m
[31m-#if LJ_LE[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]);[m
[31m-#else[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev);[m
[31m-#endif[m
[31m-  ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id);[m
[31m-  return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Emit a CALLN with one split 64 bit argument and a 32 bit argument. */[m
[31m-static IRRef split_call_li(jit_State *J, IRRef1 *hisubst, IRIns *oir,[m
[31m-			   IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  IRRef tmp, op1 = ir->op1, op2 = ir->op2;[m
[31m-  J->cur.nins--;[m
[31m-#if LJ_LE[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]);[m
[31m-#else[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev);[m
[31m-#endif[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev);[m
[31m-  ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id);[m
[31m-  return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp);[m
[31m-}[m
[31m-[m
[31m-/* Emit a CALLN with two split 64 bit arguments. */[m
[31m-static IRRef split_call_ll(jit_State *J, IRRef1 *hisubst, IRIns *oir,[m
[31m-			   IRIns *ir, IRCallID id)[m
[31m-{[m
[31m-  IRRef tmp, op1 = ir->op1, op2 = ir->op2;[m
[31m-  J->cur.nins--;[m
[31m-#if LJ_LE[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]);[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev);[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, hisubst[op2]);[m
[31m-#else[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev);[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, hisubst[op2]);[m
[31m-  tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev);[m
[31m-#endif[m
[31m-  ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id);[m
[31m-  return split_emit(J,[m
[31m-    IRT(IR_HIOP, (LJ_SOFTFP && irt_isnum(ir->t)) ? IRT_SOFTFP : IRT_INT),[m
[31m-    tmp, tmp);[m
[31m-}[m
[31m-[m
[31m-/* Get a pointer to the other 32 bit word (LE: hiword, BE: loword). */[m
[31m-static IRRef split_ptr(jit_State *J, IRIns *oir, IRRef ref)[m
[31m-{[m
[31m-  IRRef nref = oir[ref].prev;[m
[31m-  IRIns *ir = IR(nref);[m
[31m-  int32_t ofs = 4;[m
[31m-  if (ir->o == IR_KPTR)[m
[31m-    return lj_ir_kptr(J, (char *)ir_kptr(ir) + ofs);[m
[31m-  if (ir->o == IR_ADD && irref_isk(ir->op2) && !irt_isphi(oir[ref].t)) {[m
[31m-    /* Reassociate address. */[m
[31m-    ofs += IR(ir->op2)->i;[m
[31m-    nref = ir->op1;[m
[31m-    if (ofs == 0) return nref;[m
[31m-  }[m
[31m-  return split_emit(J, IRT(IR_ADD, IRT_PTR), nref, lj_ir_kint(J, ofs));[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-static IRRef split_bitshift(jit_State *J, IRRef1 *hisubst,[m
[31m-			    IRIns *oir, IRIns *nir, IRIns *ir)[m
[31m-{[m
[31m-  IROp op = ir->o;[m
[31m-  IRRef kref = nir->op2;[m
[31m-  if (irref_isk(kref)) {  /* Optimize constant shifts. */[m
[31m-    int32_t k = (IR(kref)->i & 63);[m
[31m-    IRRef lo = nir->op1, hi = hisubst[ir->op1];[m
[31m-    if (op == IR_BROL || op == IR_BROR) {[m
[31m-      if (op == IR_BROR) k = (-k & 63);[m
[31m-      if (k >= 32) { IRRef t = lo; lo = hi; hi = t; k -= 32; }[m
[31m-      if (k == 0) {[m
[31m-      passthrough:[m
[31m-	J->cur.nins--;[m
[31m-	ir->prev = lo;[m
[31m-	return hi;[m
[31m-      } else {[m
[31m-	TRef k1, k2;[m
[31m-	IRRef t1, t2, t3, t4;[m
[31m-	J->cur.nins--;[m
[31m-	k1 = lj_ir_kint(J, k);[m
[31m-	k2 = lj_ir_kint(J, (-k & 31));[m
[31m-	t1 = split_emit(J, IRTI(IR_BSHL), lo, k1);[m
[31m-	t2 = split_emit(J, IRTI(IR_BSHL), hi, k1);[m
[31m-	t3 = split_emit(J, IRTI(IR_BSHR), lo, k2);[m
[31m-	t4 = split_emit(J, IRTI(IR_BSHR), hi, k2);[m
[31m-	ir->prev = split_emit(J, IRTI(IR_BOR), t1, t4);[m
[31m-	return split_emit(J, IRTI(IR_BOR), t2, t3);[m
[31m-      }[m
[31m-    } else if (k == 0) {[m
[31m-      goto passthrough;[m
[31m-    } else if (k < 32) {[m
[31m-      if (op == IR_BSHL) {[m
[31m-	IRRef t1 = split_emit(J, IRTI(IR_BSHL), hi, kref);[m
[31m-	IRRef t2 = split_emit(J, IRTI(IR_BSHR), lo, lj_ir_kint(J, (-k&31)));[m
[31m-	return split_emit(J, IRTI(IR_BOR), t1, t2);[m
[31m-      } else {[m
[31m-	IRRef t1 = ir->prev, t2;[m
[31m-	lua_assert(op == IR_BSHR || op == IR_BSAR);[m
[31m-	nir->o = IR_BSHR;[m
[31m-	t2 = split_emit(J, IRTI(IR_BSHL), hi, lj_ir_kint(J, (-k&31)));[m
[31m-	ir->prev = split_emit(J, IRTI(IR_BOR), t1, t2);[m
[31m-	return split_emit(J, IRTI(op), hi, kref);[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (op == IR_BSHL) {[m
[31m-	if (k == 32)[m
[31m-	  J->cur.nins--;[m
[31m-	else[m
[31m-	  lo = ir->prev;[m
[31m-	ir->prev = lj_ir_kint(J, 0);[m
[31m-	return lo;[m
[31m-      } else {[m
[31m-	lua_assert(op == IR_BSHR || op == IR_BSAR);[m
[31m-	if (k == 32) {[m
[31m-	  J->cur.nins--;[m
[31m-	  ir->prev = hi;[m
[31m-	} else {[m
[31m-	  nir->op1 = hi;[m
[31m-	}[m
[31m-	if (op == IR_BSHR)[m
[31m-	  return lj_ir_kint(J, 0);[m
[31m-	else[m
[31m-	  return split_emit(J, IRTI(IR_BSAR), hi, lj_ir_kint(J, 31));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return split_call_li(J, hisubst, oir, ir,[m
[31m-		       op - IR_BSHL + IRCALL_lj_carith_shl64);[m
[31m-}[m
[31m-[m
[31m-static IRRef split_bitop(jit_State *J, IRRef1 *hisubst,[m
[31m-			 IRIns *nir, IRIns *ir)[m
[31m-{[m
[31m-  IROp op = ir->o;[m
[31m-  IRRef hi, kref = nir->op2;[m
[31m-  if (irref_isk(kref)) {  /* Optimize bit operations with lo constant. */[m
[31m-    int32_t k = IR(kref)->i;[m
[31m-    if (k == 0 || k == -1) {[m
[31m-      if (op == IR_BAND) k = ~k;[m
[31m-      if (k == 0) {[m
[31m-	J->cur.nins--;[m
[31m-	ir->prev = nir->op1;[m
[31m-      } else if (op == IR_BXOR) {[m
[31m-	nir->o = IR_BNOT;[m
[31m-	nir->op2 = 0;[m
[31m-      } else {[m
[31m-	J->cur.nins--;[m
[31m-	ir->prev = kref;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  hi = hisubst[ir->op1];[m
[31m-  kref = hisubst[ir->op2];[m
[31m-  if (irref_isk(kref)) {  /* Optimize bit operations with hi constant. */[m
[31m-    int32_t k = IR(kref)->i;[m
[31m-    if (k == 0 || k == -1) {[m
[31m-      if (op == IR_BAND) k = ~k;[m
[31m-      if (k == 0) {[m
[31m-	return hi;[m
[31m-      } else if (op == IR_BXOR) {[m
[31m-	return split_emit(J, IRTI(IR_BNOT), hi, 0);[m
[31m-      } else {[m
[31m-	return kref;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return split_emit(J, IRTI(op), hi, kref);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Substitute references of a snapshot. */[m
[31m-static void split_subst_snap(jit_State *J, SnapShot *snap, IRIns *oir)[m
[31m-{[m
[31m-  SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    IRIns *ir = &oir[snap_ref(sn)];[m
[31m-    if (!(LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && irref_isk(snap_ref(sn))))[m
[31m-      map[n] = ((sn & 0xffff0000) | ir->prev);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Transform the old IR to the new IR. */[m
[31m-static void split_ir(jit_State *J)[m
[31m-{[m
[31m-  IRRef nins = J->cur.nins, nk = J->cur.nk;[m
[31m-  MSize irlen = nins - nk;[m
[31m-  MSize need = (irlen+1)*(sizeof(IRIns) + sizeof(IRRef1));[m
[31m-  IRIns *oir = (IRIns *)lj_buf_tmp(J->L, need);[m
[31m-  IRRef1 *hisubst;[m
[31m-  IRRef ref, snref;[m
[31m-  SnapShot *snap;[m
[31m-[m
[31m-  /* Copy old IR to buffer. */[m
[31m-  memcpy(oir, IR(nk), irlen*sizeof(IRIns));[m
[31m-  /* Bias hiword substitution table and old IR. Loword kept in field prev. */[m
[31m-  hisubst = (IRRef1 *)&oir[irlen] - nk;[m
[31m-  oir -= nk;[m
[31m-[m
[31m-  /* Remove all IR instructions, but retain IR constants. */[m
[31m-  J->cur.nins = REF_FIRST;[m
[31m-  J->loopref = 0;[m
[31m-[m
[31m-  /* Process constants and fixed references. */[m
[31m-  for (ref = nk; ref <= REF_BASE; ref++) {[m
[31m-    IRIns *ir = &oir[ref];[m
[31m-    if ((LJ_SOFTFP && ir->o == IR_KNUM) || ir->o == IR_KINT64) {[m
[31m-      /* Split up 64 bit constant. */[m
[31m-      TValue tv = *ir_k64(ir);[m
[31m-      ir->prev = lj_ir_kint(J, (int32_t)tv.u32.lo);[m
[31m-      hisubst[ref] = lj_ir_kint(J, (int32_t)tv.u32.hi);[m
[31m-    } else {[m
[31m-      ir->prev = ref;  /* Identity substitution for loword. */[m
[31m-      hisubst[ref] = 0;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Process old IR instructions. */[m
[31m-  snap = J->cur.snap;[m
[31m-  snref = snap->ref;[m
[31m-  for (ref = REF_FIRST; ref < nins; ref++) {[m
[31m-    IRIns *ir = &oir[ref];[m
[31m-    IRRef nref = lj_ir_nextins(J);[m
[31m-    IRIns *nir = IR(nref);[m
[31m-    IRRef hi = 0;[m
[31m-[m
[31m-    if (ref >= snref) {[m
[31m-      snap->ref = nref;[m
[31m-      split_subst_snap(J, snap++, oir);[m
[31m-      snref = snap < &J->cur.snap[J->cur.nsnap] ? snap->ref : ~(IRRef)0;[m
[31m-    }[m
[31m-[m
[31m-    /* Copy-substitute old instruction to new instruction. */[m
[31m-    nir->op1 = ir->op1 < nk ? ir->op1 : oir[ir->op1].prev;[m
[31m-    nir->op2 = ir->op2 < nk ? ir->op2 : oir[ir->op2].prev;[m
[31m-    ir->prev = nref;  /* Loword substitution. */[m
[31m-    nir->o = ir->o;[m
[31m-    nir->t.irt = ir->t.irt & ~(IRT_MARK|IRT_ISPHI);[m
[31m-    hisubst[ref] = 0;[m
[31m-[m
[31m-    /* Split 64 bit instructions. */[m
[31m-#if LJ_SOFTFP[m
[31m-    if (irt_isnum(ir->t)) {[m
[31m-      nir->t.irt = IRT_INT | (nir->t.irt & IRT_GUARD);  /* Turn into INT op. */[m
[31m-      /* Note: hi ref = lo ref + 1! Required for SNAP_SOFTFPNUM logic. */[m
[31m-      switch (ir->o) {[m
[31m-      case IR_ADD:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_add);[m
[31m-	break;[m
[31m-      case IR_SUB:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_sub);[m
[31m-	break;[m
[31m-      case IR_MUL:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_mul);[m
[31m-	break;[m
[31m-      case IR_DIV:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_div);[m
[31m-	break;[m
[31m-      case IR_POW:[m
[31m-	hi = split_call_li(J, hisubst, oir, ir, IRCALL_lj_vm_powi);[m
[31m-	break;[m
[31m-      case IR_FPMATH:[m
[31m-	/* Try to rejoin pow from EXP2, MUL and LOG2. */[m
[31m-	if (nir->op2 == IRFPM_EXP2 && nir->op1 > J->loopref) {[m
[31m-	  IRIns *irp = IR(nir->op1);[m
[31m-	  if (irp->o == IR_CALLN && irp->op2 == IRCALL_softfp_mul) {[m
[31m-	    IRIns *irm4 = IR(irp->op1);[m
[31m-	    IRIns *irm3 = IR(irm4->op1);[m
[31m-	    IRIns *irm12 = IR(irm3->op1);[m
[31m-	    IRIns *irl1 = IR(irm12->op1);[m
[31m-	    if (irm12->op1 > J->loopref && irl1->o == IR_CALLN &&[m
[31m-		irl1->op2 == IRCALL_lj_vm_log2) {[m
[31m-	      IRRef tmp = irl1->op1;  /* Recycle first two args from LOG2. */[m
[31m-	      IRRef arg3 = irm3->op2, arg4 = irm4->op2;[m
[31m-	      J->cur.nins--;[m
[31m-	      tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, arg3);[m
[31m-	      tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, arg4);[m
[31m-	      ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_pow);[m
[31m-	      hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp);[m
[31m-	      break;[m
[31m-	    }[m
[31m-	  }[m
[31m-	}[m
[31m-	hi = split_call_l(J, hisubst, oir, ir, IRCALL_lj_vm_floor + ir->op2);[m
[31m-	break;[m
[31m-      case IR_ATAN2:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_atan2);[m
[31m-	break;[m
[31m-      case IR_LDEXP:[m
[31m-	hi = split_call_li(J, hisubst, oir, ir, IRCALL_ldexp);[m
[31m-	break;[m
[31m-      case IR_NEG: case IR_ABS:[m
[31m-	nir->o = IR_CONV;  /* Pass through loword. */[m
[31m-	nir->op2 = (IRT_INT << 5) | IRT_INT;[m
[31m-	hi = split_emit(J, IRT(ir->o == IR_NEG ? IR_BXOR : IR_BAND, IRT_SOFTFP),[m
[31m-			hisubst[ir->op1], hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_SLOAD:[m
[31m-	if ((nir->op2 & IRSLOAD_CONVERT)) {  /* Convert from int to number. */[m
[31m-	  nir->op2 &= ~IRSLOAD_CONVERT;[m
[31m-	  ir->prev = nref = split_emit(J, IRTI(IR_CALLN), nref,[m
[31m-				       IRCALL_softfp_i2d);[m
[31m-	  hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);[m
[31m-	  break;[m
[31m-	}[m
[31m-	/* fallthrough */[m
[31m-      case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:[m
[31m-      case IR_STRTO:[m
[31m-	hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);[m
[31m-	break;[m
[31m-      case IR_XLOAD: {[m
[31m-	IRIns inslo = *nir;  /* Save/undo the emit of the lo XLOAD. */[m
[31m-	J->cur.nins--;[m
[31m-	hi = split_ptr(J, oir, ir->op1);  /* Insert the hiref ADD. */[m
[31m-#if LJ_BE[m
[31m-	hi = split_emit(J, IRT(IR_XLOAD, IRT_INT), hi, ir->op2);[m
[31m-	inslo.t.irt = IRT_SOFTFP | (inslo.t.irt & IRT_GUARD);[m
[31m-#endif[m
[31m-	nref = lj_ir_nextins(J);[m
[31m-	nir = IR(nref);[m
[31m-	*nir = inslo;  /* Re-emit lo XLOAD. */[m
[31m-#if LJ_LE[m
[31m-	hi = split_emit(J, IRT(IR_XLOAD, IRT_SOFTFP), hi, ir->op2);[m
[31m-	ir->prev = nref;[m
[31m-#else[m
[31m-	ir->prev = hi; hi = nref;[m
[31m-#endif[m
[31m-	break;[m
[31m-	}[m
[31m-      case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_XSTORE:[m
[31m-	split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nir->op1, hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_CONV: {  /* Conversion to number. Others handled below. */[m
[31m-	IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-	UNUSED(st);[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-	if (st == IRT_I64 || st == IRT_U64) {[m
[31m-	  hi = split_call_l(J, hisubst, oir, ir,[m
[31m-		 st == IRT_I64 ? IRCALL_fp64_l2d : IRCALL_fp64_ul2d);[m
[31m-	  break;[m
[31m-	}[m
[31m-#endif[m
[31m-	lua_assert(st == IRT_INT ||[m
[31m-		   (LJ_32 && LJ_HASFFI && (st == IRT_U32 || st == IRT_FLOAT)));[m
[31m-	nir->o = IR_CALLN;[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-	nir->op2 = st == IRT_INT ? IRCALL_softfp_i2d :[m
[31m-		   st == IRT_FLOAT ? IRCALL_softfp_f2d :[m
[31m-		   IRCALL_softfp_ui2d;[m
[31m-#else[m
[31m-	nir->op2 = IRCALL_softfp_i2d;[m
[31m-#endif[m
[31m-	hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);[m
[31m-	break;[m
[31m-	}[m
[31m-      case IR_CALLN:[m
[31m-      case IR_CALLL:[m
[31m-      case IR_CALLS:[m
[31m-      case IR_CALLXS:[m
[31m-	goto split_call;[m
[31m-      case IR_PHI:[m
[31m-	if (nir->op1 == nir->op2)[m
[31m-	  J->cur.nins--;  /* Drop useless PHIs. */[m
[31m-	if (hisubst[ir->op1] != hisubst[ir->op2])[m
[31m-	  split_emit(J, IRT(IR_PHI, IRT_SOFTFP),[m
[31m-		     hisubst[ir->op1], hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_HIOP:[m
[31m-	J->cur.nins--;  /* Drop joining HIOP. */[m
[31m-	ir->prev = nir->op1;[m
[31m-	hi = nir->op2;[m
[31m-	break;[m
[31m-      default:[m
[31m-	lua_assert(ir->o <= IR_NE || ir->o == IR_MIN || ir->o == IR_MAX);[m
[31m-	hi = split_emit(J, IRTG(IR_HIOP, IRT_SOFTFP),[m
[31m-			hisubst[ir->op1], hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      }[m
[31m-    } else[m
[31m-#endif[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-    if (irt_isint64(ir->t)) {[m
[31m-      IRRef hiref = hisubst[ir->op1];[m
[31m-      nir->t.irt = IRT_INT | (nir->t.irt & IRT_GUARD);  /* Turn into INT op. */[m
[31m-      switch (ir->o) {[m
[31m-      case IR_ADD:[m
[31m-      case IR_SUB:[m
[31m-	/* Use plain op for hiword if loword cannot produce a carry/borrow. */[m
[31m-	if (irref_isk(nir->op2) && IR(nir->op2)->i == 0) {[m
[31m-	  ir->prev = nir->op1;  /* Pass through loword. */[m
[31m-	  nir->op1 = hiref; nir->op2 = hisubst[ir->op2];[m
[31m-	  hi = nref;[m
[31m-	  break;[m
[31m-	}[m
[31m-	/* fallthrough */[m
[31m-      case IR_NEG:[m
[31m-	hi = split_emit(J, IRTI(IR_HIOP), hiref, hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_MUL:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir, IRCALL_lj_carith_mul64);[m
[31m-	break;[m
[31m-      case IR_DIV:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir,[m
[31m-			   irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 :[m
[31m-					      IRCALL_lj_carith_divu64);[m
[31m-	break;[m
[31m-      case IR_MOD:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir,[m
[31m-			   irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 :[m
[31m-					      IRCALL_lj_carith_modu64);[m
[31m-	break;[m
[31m-      case IR_POW:[m
[31m-	hi = split_call_ll(J, hisubst, oir, ir,[m
[31m-			   irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 :[m
[31m-					      IRCALL_lj_carith_powu64);[m
[31m-	break;[m
[31m-      case IR_BNOT:[m
[31m-	hi = split_emit(J, IRTI(IR_BNOT), hiref, 0);[m
[31m-	break;[m
[31m-      case IR_BSWAP:[m
[31m-	ir->prev = split_emit(J, IRTI(IR_BSWAP), hiref, 0);[m
[31m-	hi = nref;[m
[31m-	break;[m
[31m-      case IR_BAND: case IR_BOR: case IR_BXOR:[m
[31m-	hi = split_bitop(J, hisubst, nir, ir);[m
[31m-	break;[m
[31m-      case IR_BSHL: case IR_BSHR: case IR_BSAR: case IR_BROL: case IR_BROR:[m
[31m-	hi = split_bitshift(J, hisubst, oir, nir, ir);[m
[31m-	break;[m
[31m-      case IR_FLOAD:[m
[31m-	lua_assert(ir->op2 == IRFL_CDATA_INT64);[m
[31m-	hi = split_emit(J, IRTI(IR_FLOAD), nir->op1, IRFL_CDATA_INT64_4);[m
[31m-#if LJ_BE[m
[31m-	ir->prev = hi; hi = nref;[m
[31m-#endif[m
[31m-	break;[m
[31m-      case IR_XLOAD:[m
[31m-	hi = split_emit(J, IRTI(IR_XLOAD), split_ptr(J, oir, ir->op1), ir->op2);[m
[31m-#if LJ_BE[m
[31m-	ir->prev = hi; hi = nref;[m
[31m-#endif[m
[31m-	break;[m
[31m-      case IR_XSTORE:[m
[31m-	split_emit(J, IRTI(IR_HIOP), nir->op1, hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      case IR_CONV: {  /* Conversion to 64 bit integer. Others handled below. */[m
[31m-	IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-#if LJ_SOFTFP[m
[31m-	if (st == IRT_NUM) {  /* NUM to 64 bit int conv. */[m
[31m-	  hi = split_call_l(J, hisubst, oir, ir,[m
[31m-		 irt_isi64(ir->t) ? IRCALL_fp64_d2l : IRCALL_fp64_d2ul);[m
[31m-	} else if (st == IRT_FLOAT) {  /* FLOAT to 64 bit int conv. */[m
[31m-	  nir->o = IR_CALLN;[m
[31m-	  nir->op2 = irt_isi64(ir->t) ? IRCALL_fp64_f2l : IRCALL_fp64_f2ul;[m
[31m-	  hi = split_emit(J, IRTI(IR_HIOP), nref, nref);[m
[31m-	}[m
[31m-#else[m
[31m-	if (st == IRT_NUM || st == IRT_FLOAT) {  /* FP to 64 bit int conv. */[m
[31m-	  hi = split_emit(J, IRTI(IR_HIOP), nir->op1, nref);[m
[31m-	}[m
[31m-#endif[m
[31m-	else if (st == IRT_I64 || st == IRT_U64) {  /* 64/64 bit cast. */[m
[31m-	  /* Drop cast, since assembler doesn't care. But fwd both parts. */[m
[31m-	  hi = hiref;[m
[31m-	  goto fwdlo;[m
[31m-	} else if ((ir->op2 & IRCONV_SEXT)) {  /* Sign-extend to 64 bit. */[m
[31m-	  IRRef k31 = lj_ir_kint(J, 31);[m
[31m-	  nir = IR(nref);  /* May have been reallocated. */[m
[31m-	  ir->prev = nir->op1;  /* Pass through loword. */[m
[31m-	  nir->o = IR_BSAR;  /* hi = bsar(lo, 31). */[m
[31m-	  nir->op2 = k31;[m
[31m-	  hi = nref;[m
[31m-	} else {  /* Zero-extend to 64 bit. */[m
[31m-	  hi = lj_ir_kint(J, 0);[m
[31m-	  goto fwdlo;[m
[31m-	}[m
[31m-	break;[m
[31m-	}[m
[31m-      case IR_CALLXS:[m
[31m-	goto split_call;[m
[31m-      case IR_PHI: {[m
[31m-	IRRef hiref2;[m
[31m-	if ((irref_isk(nir->op1) && irref_isk(nir->op2)) ||[m
[31m-	    nir->op1 == nir->op2)[m
[31m-	  J->cur.nins--;  /* Drop useless PHIs. */[m
[31m-	hiref2 = hisubst[ir->op2];[m
[31m-	if (!((irref_isk(hiref) && irref_isk(hiref2)) || hiref == hiref2))[m
[31m-	  split_emit(J, IRTI(IR_PHI), hiref, hiref2);[m
[31m-	break;[m
[31m-	}[m
[31m-      case IR_HIOP:[m
[31m-	J->cur.nins--;  /* Drop joining HIOP. */[m
[31m-	ir->prev = nir->op1;[m
[31m-	hi = nir->op2;[m
[31m-	break;[m
[31m-      default:[m
[31m-	lua_assert(ir->o <= IR_NE);  /* Comparisons. */[m
[31m-	split_emit(J, IRTGI(IR_HIOP), hiref, hisubst[ir->op2]);[m
[31m-	break;[m
[31m-      }[m
[31m-    } else[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-    if (ir->o == IR_SLOAD) {[m
[31m-      if ((nir->op2 & IRSLOAD_CONVERT)) {  /* Convert from number to int. */[m
[31m-	nir->op2 &= ~IRSLOAD_CONVERT;[m
[31m-	if (!(nir->op2 & IRSLOAD_TYPECHECK))[m
[31m-	  nir->t.irt = IRT_INT;  /* Drop guard. */[m
[31m-	split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref);[m
[31m-	ir->prev = split_num2int(J, nref, nref+1, irt_isguard(ir->t));[m
[31m-      }[m
[31m-    } else if (ir->o == IR_TOBIT) {[m
[31m-      IRRef tmp, op1 = ir->op1;[m
[31m-      J->cur.nins--;[m
[31m-#if LJ_LE[m
[31m-      tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]);[m
[31m-#else[m
[31m-      tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev);[m
[31m-#endif[m
[31m-      ir->prev = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_lj_vm_tobit);[m
[31m-    } else if (ir->o == IR_TOSTR) {[m
[31m-      if (hisubst[ir->op1]) {[m
[31m-	if (irref_isk(ir->op1))[m
[31m-	  nir->op1 = ir->op1;[m
[31m-	else[m
[31m-	  split_emit(J, IRT(IR_HIOP, IRT_NIL), hisubst[ir->op1], nref);[m
[31m-      }[m
[31m-    } else if (ir->o == IR_HREF || ir->o == IR_NEWREF) {[m
[31m-      if (irref_isk(ir->op2) && hisubst[ir->op2])[m
[31m-	nir->op2 = ir->op2;[m
[31m-    } else[m
[31m-#endif[m
[31m-    if (ir->o == IR_CONV) {  /* See above, too. */[m
[31m-      IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-      if (st == IRT_I64 || st == IRT_U64) {  /* Conversion from 64 bit int. */[m
[31m-#if LJ_SOFTFP[m
[31m-	if (irt_isfloat(ir->t)) {[m
[31m-	  split_call_l(J, hisubst, oir, ir,[m
[31m-		       st == IRT_I64 ? IRCALL_fp64_l2f : IRCALL_fp64_ul2f);[m
[31m-	  J->cur.nins--;  /* Drop unused HIOP. */[m
[31m-	}[m
[31m-#else[m
[31m-	if (irt_isfp(ir->t)) {  /* 64 bit integer to FP conversion. */[m
[31m-	  ir->prev = split_emit(J, IRT(IR_HIOP, irt_type(ir->t)),[m
[31m-				hisubst[ir->op1], nref);[m
[31m-	}[m
[31m-#endif[m
[31m-	else {  /* Truncate to lower 32 bits. */[m
[31m-	fwdlo:[m
[31m-	  ir->prev = nir->op1;  /* Forward loword. */[m
[31m-	  /* Replace with NOP to avoid messing up the snapshot logic. */[m
[31m-	  nir->ot = IRT(IR_NOP, IRT_NIL);[m
[31m-	  nir->op1 = nir->op2 = 0;[m
[31m-	}[m
[31m-      }[m
[31m-#endif[m
[31m-#if LJ_SOFTFP && LJ_32 && LJ_HASFFI[m
[31m-      else if (irt_isfloat(ir->t)) {[m
[31m-	if (st == IRT_NUM) {[m
[31m-	  split_call_l(J, hisubst, oir, ir, IRCALL_softfp_d2f);[m
[31m-	  J->cur.nins--;  /* Drop unused HIOP. */[m
[31m-	} else {[m
[31m-	  nir->o = IR_CALLN;[m
[31m-	  nir->op2 = st == IRT_INT ? IRCALL_softfp_i2f : IRCALL_softfp_ui2f;[m
[31m-	}[m
[31m-      } else if (st == IRT_FLOAT) {[m
[31m-	nir->o = IR_CALLN;[m
[31m-	nir->op2 = irt_isint(ir->t) ? IRCALL_softfp_f2i : IRCALL_softfp_f2ui;[m
[31m-      } else[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-      if (st == IRT_NUM || (LJ_32 && LJ_HASFFI && st == IRT_FLOAT)) {[m
[31m-	if (irt_isguard(ir->t)) {[m
[31m-	  lua_assert(st == IRT_NUM && irt_isint(ir->t));[m
[31m-	  J->cur.nins--;[m
[31m-	  ir->prev = split_num2int(J, nir->op1, hisubst[ir->op1], 1);[m
[31m-	} else {[m
[31m-	  split_call_l(J, hisubst, oir, ir,[m
[31m-#if LJ_32 && LJ_HASFFI[m
[31m-	    st == IRT_NUM ?[m
[31m-	      (irt_isint(ir->t) ? IRCALL_softfp_d2i : IRCALL_softfp_d2ui) :[m
[31m-	      (irt_isint(ir->t) ? IRCALL_softfp_f2i : IRCALL_softfp_f2ui)[m
[31m-#else[m
[31m-	    IRCALL_softfp_d2i[m
[31m-#endif[m
[31m-	  );[m
[31m-	  J->cur.nins--;  /* Drop unused HIOP. */[m
[31m-	}[m
[31m-      }[m
[31m-#endif[m
[31m-    } else if (ir->o == IR_CALLXS) {[m
[31m-      IRRef hiref;[m
[31m-    split_call:[m
[31m-      hiref = hisubst[ir->op1];[m
[31m-      if (hiref) {[m
[31m-	IROpT ot = nir->ot;[m
[31m-	IRRef op2 = nir->op2;[m
[31m-	nir->ot = IRT(IR_CARG, IRT_NIL);[m
[31m-#if LJ_LE[m
[31m-	nir->op2 = hiref;[m
[31m-#else[m
[31m-	nir->op2 = nir->op1; nir->op1 = hiref;[m
[31m-#endif[m
[31m-	ir->prev = nref = split_emit(J, ot, nref, op2);[m
[31m-      }[m
[31m-      if (LJ_SOFTFP ? irt_is64(ir->t) : irt_isint64(ir->t))[m
[31m-	hi = split_emit(J,[m
[31m-	  IRT(IR_HIOP, (LJ_SOFTFP && irt_isnum(ir->t)) ? IRT_SOFTFP : IRT_INT),[m
[31m-	  nref, nref);[m
[31m-    } else if (ir->o == IR_CARG) {[m
[31m-      IRRef hiref = hisubst[ir->op1];[m
[31m-      if (hiref) {[m
[31m-	IRRef op2 = nir->op2;[m
[31m-#if LJ_LE[m
[31m-	nir->op2 = hiref;[m
[31m-#else[m
[31m-	nir->op2 = nir->op1; nir->op1 = hiref;[m
[31m-#endif[m
[31m-	ir->prev = nref = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, op2);[m
[31m-	nir = IR(nref);[m
[31m-      }[m
[31m-      hiref = hisubst[ir->op2];[m
[31m-      if (hiref) {[m
[31m-#if !LJ_TARGET_X86[m
[31m-	int carg = 0;[m
[31m-	IRIns *cir;[m
[31m-	for (cir = IR(nir->op1); cir->o == IR_CARG; cir = IR(cir->op1))[m
[31m-	  carg++;[m
[31m-	if ((carg & 1) == 0) {  /* Align 64 bit arguments. */[m
[31m-	  IRRef op2 = nir->op2;[m
[31m-	  nir->op2 = REF_NIL;[m
[31m-	  nref = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, op2);[m
[31m-	  nir = IR(nref);[m
[31m-	}[m
[31m-#endif[m
[31m-#if LJ_BE[m
[31m-	{ IRRef tmp = nir->op2; nir->op2 = hiref; hiref = tmp; }[m
[31m-#endif[m
[31m-	ir->prev = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, hiref);[m
[31m-      }[m
[31m-    } else if (ir->o == IR_CNEWI) {[m
[31m-      if (hisubst[ir->op2])[m
[31m-	split_emit(J, IRT(IR_HIOP, IRT_NIL), nref, hisubst[ir->op2]);[m
[31m-    } else if (ir->o == IR_LOOP) {[m
[31m-      J->loopref = nref;  /* Needed by assembler. */[m
[31m-    }[m
[31m-    hisubst[ref] = hi;  /* Store hiword substitution. */[m
[31m-  }[m
[31m-  if (snref == nins) {  /* Substitution for last snapshot. */[m
[31m-    snap->ref = J->cur.nins;[m
[31m-    split_subst_snap(J, snap, oir);[m
[31m-  }[m
[31m-[m
[31m-  /* Add PHI marks. */[m
[31m-  for (ref = J->cur.nins-1; ref >= REF_FIRST; ref--) {[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    if (ir->o != IR_PHI) break;[m
[31m-    if (!irref_isk(ir->op1)) irt_setphi(IR(ir->op1)->t);[m
[31m-    if (ir->op2 > J->loopref) irt_setphi(IR(ir->op2)->t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Protected callback for split pass. */[m
[31m-static TValue *cpsplit(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  jit_State *J = (jit_State *)ud;[m
[31m-  split_ir(J);[m
[31m-  UNUSED(L); UNUSED(dummy);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#if defined(LUA_USE_ASSERT) || LJ_SOFTFP[m
[31m-/* Slow, but sure way to check whether a SPLIT pass is needed. */[m
[31m-static int split_needsplit(jit_State *J)[m
[31m-{[m
[31m-  IRIns *ir, *irend;[m
[31m-  IRRef ref;[m
[31m-  for (ir = IR(REF_FIRST), irend = IR(J->cur.nins); ir < irend; ir++)[m
[31m-    if (LJ_SOFTFP ? irt_is64orfp(ir->t) : irt_isint64(ir->t))[m
[31m-      return 1;[m
[31m-  if (LJ_SOFTFP) {[m
[31m-    for (ref = J->chain[IR_SLOAD]; ref; ref = IR(ref)->prev)[m
[31m-      if ((IR(ref)->op2 & IRSLOAD_CONVERT))[m
[31m-	return 1;[m
[31m-    if (J->chain[IR_TOBIT])[m
[31m-      return 1;[m
[31m-  }[m
[31m-  for (ref = J->chain[IR_CONV]; ref; ref = IR(ref)->prev) {[m
[31m-    IRType st = (IR(ref)->op2 & IRCONV_SRCMASK);[m
[31m-    if ((LJ_SOFTFP && (st == IRT_NUM || st == IRT_FLOAT)) ||[m
[31m-	st == IRT_I64 || st == IRT_U64)[m
[31m-      return 1;[m
[31m-  }[m
[31m-  return 0;  /* Nope. */[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* SPLIT pass. */[m
[31m-void lj_opt_split(jit_State *J)[m
[31m-{[m
[31m-#if LJ_SOFTFP[m
[31m-  if (!J->needsplit)[m
[31m-    J->needsplit = split_needsplit(J);[m
[31m-#else[m
[31m-  lua_assert(J->needsplit >= split_needsplit(J));  /* Verify flag. */[m
[31m-#endif[m
[31m-  if (J->needsplit) {[m
[31m-    int errcode = lj_vm_cpcall(J->L, NULL, J, cpsplit);[m
[31m-    if (errcode) {[m
[31m-      /* Completely reset the trace to avoid inconsistent dump on abort. */[m
[31m-      J->cur.nins = J->cur.nk = REF_BASE;[m
[31m-      J->cur.nsnap = 0;[m
[31m-      lj_err_throw(J->L, errcode);  /* Propagate errors. */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_parse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_parse.c[m
[1mdeleted file mode 100644[m
[1mindex 610c861..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_parse.c[m
[1m+++ /dev/null[m
[36m@@ -1,2725 +0,0 @@[m
[31m-/*[m
[31m-** Lua parser (source code -> bytecode).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_parse_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_bc.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#include "lj_strfmt.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_parse.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_vmevent.h"[m
[31m-[m
[31m-/* -- Parser structures and definitions ----------------------------------- */[m
[31m-[m
[31m-/* Expression kinds. */[m
[31m-typedef enum {[m
[31m-  /* Constant expressions must be first and in this order: */[m
[31m-  VKNIL,[m
[31m-  VKFALSE,[m
[31m-  VKTRUE,[m
[31m-  VKSTR,	/* sval = string value */[m
[31m-  VKNUM,	/* nval = number value */[m
[31m-  VKLAST = VKNUM,[m
[31m-  VKCDATA,	/* nval = cdata value, not treated as a constant expression */[m
[31m-  /* Non-constant expressions follow: */[m
[31m-  VLOCAL,	/* info = local register, aux = vstack index */[m
[31m-  VUPVAL,	/* info = upvalue index, aux = vstack index */[m
[31m-  VGLOBAL,	/* sval = string value */[m
[31m-  VINDEXED,	/* info = table register, aux = index reg/byte/string const */[m
[31m-  VJMP,		/* info = instruction PC */[m
[31m-  VRELOCABLE,	/* info = instruction PC */[m
[31m-  VNONRELOC,	/* info = result register */[m
[31m-  VCALL,	/* info = instruction PC, aux = base */[m
[31m-  VVOID[m
[31m-} ExpKind;[m
[31m-[m
[31m-/* Expression descriptor. */[m
[31m-typedef struct ExpDesc {[m
[31m-  union {[m
[31m-    struct {[m
[31m-      uint32_t info;	/* Primary info. */[m
[31m-      uint32_t aux;	/* Secondary info. */[m
[31m-    } s;[m
[31m-    TValue nval;	/* Number value. */[m
[31m-    GCstr *sval;	/* String value. */[m
[31m-  } u;[m
[31m-  ExpKind k;[m
[31m-  BCPos t;		/* True condition jump list. */[m
[31m-  BCPos f;		/* False condition jump list. */[m
[31m-} ExpDesc;[m
[31m-[m
[31m-/* Macros for expressions. */[m
[31m-#define expr_hasjump(e)		((e)->t != (e)->f)[m
[31m-[m
[31m-#define expr_isk(e)		((e)->k <= VKLAST)[m
[31m-#define expr_isk_nojump(e)	(expr_isk(e) && !expr_hasjump(e))[m
[31m-#define expr_isnumk(e)		((e)->k == VKNUM)[m
[31m-#define expr_isnumk_nojump(e)	(expr_isnumk(e) && !expr_hasjump(e))[m
[31m-#define expr_isstrk(e)		((e)->k == VKSTR)[m
[31m-[m
[31m-#define expr_numtv(e)		check_exp(expr_isnumk((e)), &(e)->u.nval)[m
[31m-#define expr_numberV(e)		numberVnum(expr_numtv((e)))[m
[31m-[m
[31m-/* Initialize expression. */[m
[31m-static LJ_AINLINE void expr_init(ExpDesc *e, ExpKind k, uint32_t info)[m
[31m-{[m
[31m-  e->k = k;[m
[31m-  e->u.s.info = info;[m
[31m-  e->f = e->t = NO_JMP;[m
[31m-}[m
[31m-[m
[31m-/* Check number constant for +-0. */[m
[31m-static int expr_numiszero(ExpDesc *e)[m
[31m-{[m
[31m-  TValue *o = expr_numtv(e);[m
[31m-  return tvisint(o) ? (intV(o) == 0) : tviszero(o);[m
[31m-}[m
[31m-[m
[31m-/* Per-function linked list of scope blocks. */[m
[31m-typedef struct FuncScope {[m
[31m-  struct FuncScope *prev;	/* Link to outer scope. */[m
[31m-  MSize vstart;			/* Start of block-local variables. */[m
[31m-  uint8_t nactvar;		/* Number of active vars outside the scope. */[m
[31m-  uint8_t flags;		/* Scope flags. */[m
[31m-} FuncScope;[m
[31m-[m
[31m-#define FSCOPE_LOOP		0x01	/* Scope is a (breakable) loop. */[m
[31m-#define FSCOPE_BREAK		0x02	/* Break used in scope. */[m
[31m-#define FSCOPE_GOLA		0x04	/* Goto or label used in scope. */[m
[31m-#define FSCOPE_UPVAL		0x08	/* Upvalue in scope. */[m
[31m-#define FSCOPE_NOCLOSE		0x10	/* Do not close upvalues. */[m
[31m-[m
[31m-#define NAME_BREAK		((GCstr *)(uintptr_t)1)[m
[31m-[m
[31m-/* Index into variable stack. */[m
[31m-typedef uint16_t VarIndex;[m
[31m-#define LJ_MAX_VSTACK		(65536 - LJ_MAX_UPVAL)[m
[31m-[m
[31m-/* Variable/goto/label info. */[m
[31m-#define VSTACK_VAR_RW		0x01	/* R/W variable. */[m
[31m-#define VSTACK_GOTO		0x02	/* Pending goto. */[m
[31m-#define VSTACK_LABEL		0x04	/* Label. */[m
[31m-[m
[31m-/* Per-function state. */[m
[31m-typedef struct FuncState {[m
[31m-  GCtab *kt;			/* Hash table for constants. */[m
[31m-  LexState *ls;			/* Lexer state. */[m
[31m-  lua_State *L;			/* Lua state. */[m
[31m-  FuncScope *bl;		/* Current scope. */[m
[31m-  struct FuncState *prev;	/* Enclosing function. */[m
[31m-  BCPos pc;			/* Next bytecode position. */[m
[31m-  BCPos lasttarget;		/* Bytecode position of last jump target. */[m
[31m-  BCPos jpc;			/* Pending jump list to next bytecode. */[m
[31m-  BCReg freereg;		/* First free register. */[m
[31m-  BCReg nactvar;		/* Number of active local variables. */[m
[31m-  BCReg nkn, nkgc;		/* Number of lua_Number/GCobj constants */[m
[31m-  BCLine linedefined;		/* First line of the function definition. */[m
[31m-  BCInsLine *bcbase;		/* Base of bytecode stack. */[m
[31m-  BCPos bclim;			/* Limit of bytecode stack. */[m
[31m-  MSize vbase;			/* Base of variable stack for this function. */[m
[31m-  uint8_t flags;		/* Prototype flags. */[m
[31m-  uint8_t numparams;		/* Number of parameters. */[m
[31m-  uint8_t framesize;		/* Fixed frame size. */[m
[31m-  uint8_t nuv;			/* Number of upvalues */[m
[31m-  VarIndex varmap[LJ_MAX_LOCVAR];  /* Map from register to variable idx. */[m
[31m-  VarIndex uvmap[LJ_MAX_UPVAL];	/* Map from upvalue to variable idx. */[m
[31m-  VarIndex uvtmp[LJ_MAX_UPVAL];	/* Temporary upvalue map. */[m
[31m-} FuncState;[m
[31m-[m
[31m-/* Binary and unary operators. ORDER OPR */[m
[31m-typedef enum BinOpr {[m
[31m-  OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,  /* ORDER ARITH */[m
[31m-  OPR_CONCAT,[m
[31m-  OPR_NE, OPR_EQ,[m
[31m-  OPR_LT, OPR_GE, OPR_LE, OPR_GT,[m
[31m-  OPR_AND, OPR_OR,[m
[31m-  OPR_NOBINOPR[m
[31m-} BinOpr;[m
[31m-[m
[31m-LJ_STATIC_ASSERT((int)BC_ISGE-(int)BC_ISLT == (int)OPR_GE-(int)OPR_LT);[m
[31m-LJ_STATIC_ASSERT((int)BC_ISLE-(int)BC_ISLT == (int)OPR_LE-(int)OPR_LT);[m
[31m-LJ_STATIC_ASSERT((int)BC_ISGT-(int)BC_ISLT == (int)OPR_GT-(int)OPR_LT);[m
[31m-LJ_STATIC_ASSERT((int)BC_SUBVV-(int)BC_ADDVV == (int)OPR_SUB-(int)OPR_ADD);[m
[31m-LJ_STATIC_ASSERT((int)BC_MULVV-(int)BC_ADDVV == (int)OPR_MUL-(int)OPR_ADD);[m
[31m-LJ_STATIC_ASSERT((int)BC_DIVVV-(int)BC_ADDVV == (int)OPR_DIV-(int)OPR_ADD);[m
[31m-LJ_STATIC_ASSERT((int)BC_MODVV-(int)BC_ADDVV == (int)OPR_MOD-(int)OPR_ADD);[m
[31m-[m
[31m-/* -- Error handling ------------------------------------------------------ */[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em)[m
[31m-{[m
[31m-  lj_lex_error(ls, ls->tok, em);[m
[31m-}[m
[31m-[m
[31m-LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken tok)[m
[31m-{[m
[31m-  lj_lex_error(ls, ls->tok, LJ_ERR_XTOKEN, lj_lex_token2str(ls, tok));[m
[31m-}[m
[31m-[m
[31m-LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what)[m
[31m-{[m
[31m-  if (fs->linedefined == 0)[m
[31m-    lj_lex_error(fs->ls, 0, LJ_ERR_XLIMM, limit, what);[m
[31m-  else[m
[31m-    lj_lex_error(fs->ls, 0, LJ_ERR_XLIMF, fs->linedefined, limit, what);[m
[31m-}[m
[31m-[m
[31m-#define checklimit(fs, v, l, m)		if ((v) >= (l)) err_limit(fs, l, m)[m
[31m-#define checklimitgt(fs, v, l, m)	if ((v) > (l)) err_limit(fs, l, m)[m
[31m-#define checkcond(ls, c, em)		{ if (!(c)) err_syntax(ls, em); }[m
[31m-[m
[31m-/* -- Management of constants --------------------------------------------- */[m
[31m-[m
[31m-/* Return bytecode encoding for primitive constant. */[m
[31m-#define const_pri(e)		check_exp((e)->k <= VKTRUE, (e)->k)[m
[31m-[m
[31m-#define tvhaskslot(o)	((o)->u32.hi == 0)[m
[31m-#define tvkslot(o)	((o)->u32.lo)[m
[31m-[m
[31m-/* Add a number constant. */[m
[31m-static BCReg const_num(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  lua_State *L = fs->L;[m
[31m-  TValue *o;[m
[31m-  lua_assert(expr_isnumk(e));[m
[31m-  o = lj_tab_set(L, fs->kt, &e->u.nval);[m
[31m-  if (tvhaskslot(o))[m
[31m-    return tvkslot(o);[m
[31m-  o->u64 = fs->nkn;[m
[31m-  return fs->nkn++;[m
[31m-}[m
[31m-[m
[31m-/* Add a GC object constant. */[m
[31m-static BCReg const_gc(FuncState *fs, GCobj *gc, uint32_t itype)[m
[31m-{[m
[31m-  lua_State *L = fs->L;[m
[31m-  TValue key, *o;[m
[31m-  setgcV(L, &key, gc, itype);[m
[31m-  /* NOBARRIER: the key is new or kept alive. */[m
[31m-  o = lj_tab_set(L, fs->kt, &key);[m
[31m-  if (tvhaskslot(o))[m
[31m-    return tvkslot(o);[m
[31m-  o->u64 = fs->nkgc;[m
[31m-  return fs->nkgc++;[m
[31m-}[m
[31m-[m
[31m-/* Add a string constant. */[m
[31m-static BCReg const_str(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  lua_assert(expr_isstrk(e) || e->k == VGLOBAL);[m
[31m-  return const_gc(fs, obj2gco(e->u.sval), LJ_TSTR);[m
[31m-}[m
[31m-[m
[31m-/* Anchor string constant to avoid GC. */[m
[31m-GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t len)[m
[31m-{[m
[31m-  /* NOBARRIER: the key is new or kept alive. */[m
[31m-  lua_State *L = ls->L;[m
[31m-  GCstr *s = lj_str_new(L, str, len);[m
[31m-  TValue *tv = lj_tab_setstr(L, ls->fs->kt, s);[m
[31m-  if (tvisnil(tv)) setboolV(tv, 1);[m
[31m-  lj_gc_check(L);[m
[31m-  return s;[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Anchor cdata to avoid GC. */[m
[31m-void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd)[m
[31m-{[m
[31m-  /* NOBARRIER: the key is new or kept alive. */[m
[31m-  lua_State *L = ls->L;[m
[31m-  setcdataV(L, tv, cd);[m
[31m-  setboolV(lj_tab_set(L, ls->fs->kt, tv), 1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Jump list handling -------------------------------------------------- */[m
[31m-[m
[31m-/* Get next element in jump list. */[m
[31m-static BCPos jmp_next(FuncState *fs, BCPos pc)[m
[31m-{[m
[31m-  ptrdiff_t delta = bc_j(fs->bcbase[pc].ins);[m
[31m-  if ((BCPos)delta == NO_JMP)[m
[31m-    return NO_JMP;[m
[31m-  else[m
[31m-    return (BCPos)(((ptrdiff_t)pc+1)+delta);[m
[31m-}[m
[31m-[m
[31m-/* Check if any of the instructions on the jump list produce no value. */[m
[31m-static int jmp_novalue(FuncState *fs, BCPos list)[m
[31m-{[m
[31m-  for (; list != NO_JMP; list = jmp_next(fs, list)) {[m
[31m-    BCIns p = fs->bcbase[list >= 1 ? list-1 : list].ins;[m
[31m-    if (!(bc_op(p) == BC_ISTC || bc_op(p) == BC_ISFC || bc_a(p) == NO_REG))[m
[31m-      return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Patch register of test instructions. */[m
[31m-static int jmp_patchtestreg(FuncState *fs, BCPos pc, BCReg reg)[m
[31m-{[m
[31m-  BCInsLine *ilp = &fs->bcbase[pc >= 1 ? pc-1 : pc];[m
[31m-  BCOp op = bc_op(ilp->ins);[m
[31m-  if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-    if (reg != NO_REG && reg != bc_d(ilp->ins)) {[m
[31m-      setbc_a(&ilp->ins, reg);[m
[31m-    } else {  /* Nothing to store or already in the right register. */[m
[31m-      setbc_op(&ilp->ins, op+(BC_IST-BC_ISTC));[m
[31m-      setbc_a(&ilp->ins, 0);[m
[31m-    }[m
[31m-  } else if (bc_a(ilp->ins) == NO_REG) {[m
[31m-    if (reg == NO_REG) {[m
[31m-      ilp->ins = BCINS_AJ(BC_JMP, bc_a(fs->bcbase[pc].ins), 0);[m
[31m-    } else {[m
[31m-      setbc_a(&ilp->ins, reg);[m
[31m-      if (reg >= bc_a(ilp[1].ins))[m
[31m-	setbc_a(&ilp[1].ins, reg+1);[m
[31m-    }[m
[31m-  } else {[m
[31m-    return 0;  /* Cannot patch other instructions. */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Drop values for all instructions on jump list. */[m
[31m-static void jmp_dropval(FuncState *fs, BCPos list)[m
[31m-{[m
[31m-  for (; list != NO_JMP; list = jmp_next(fs, list))[m
[31m-    jmp_patchtestreg(fs, list, NO_REG);[m
[31m-}[m
[31m-[m
[31m-/* Patch jump instruction to target. */[m
[31m-static void jmp_patchins(FuncState *fs, BCPos pc, BCPos dest)[m
[31m-{[m
[31m-  BCIns *jmp = &fs->bcbase[pc].ins;[m
[31m-  BCPos offset = dest-(pc+1)+BCBIAS_J;[m
[31m-  lua_assert(dest != NO_JMP);[m
[31m-  if (offset > BCMAX_D)[m
[31m-    err_syntax(fs->ls, LJ_ERR_XJUMP);[m
[31m-  setbc_d(jmp, offset);[m
[31m-}[m
[31m-[m
[31m-/* Append to jump list. */[m
[31m-static void jmp_append(FuncState *fs, BCPos *l1, BCPos l2)[m
[31m-{[m
[31m-  if (l2 == NO_JMP) {[m
[31m-    return;[m
[31m-  } else if (*l1 == NO_JMP) {[m
[31m-    *l1 = l2;[m
[31m-  } else {[m
[31m-    BCPos list = *l1;[m
[31m-    BCPos next;[m
[31m-    while ((next = jmp_next(fs, list)) != NO_JMP)  /* Find last element. */[m
[31m-      list = next;[m
[31m-    jmp_patchins(fs, list, l2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Patch jump list and preserve produced values. */[m
[31m-static void jmp_patchval(FuncState *fs, BCPos list, BCPos vtarget,[m
[31m-			 BCReg reg, BCPos dtarget)[m
[31m-{[m
[31m-  while (list != NO_JMP) {[m
[31m-    BCPos next = jmp_next(fs, list);[m
[31m-    if (jmp_patchtestreg(fs, list, reg))[m
[31m-      jmp_patchins(fs, list, vtarget);  /* Jump to target with value. */[m
[31m-    else[m
[31m-      jmp_patchins(fs, list, dtarget);  /* Jump to default target. */[m
[31m-    list = next;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Jump to following instruction. Append to list of pending jumps. */[m
[31m-static void jmp_tohere(FuncState *fs, BCPos list)[m
[31m-{[m
[31m-  fs->lasttarget = fs->pc;[m
[31m-  jmp_append(fs, &fs->jpc, list);[m
[31m-}[m
[31m-[m
[31m-/* Patch jump list to target. */[m
[31m-static void jmp_patch(FuncState *fs, BCPos list, BCPos target)[m
[31m-{[m
[31m-  if (target == fs->pc) {[m
[31m-    jmp_tohere(fs, list);[m
[31m-  } else {[m
[31m-    lua_assert(target < fs->pc);[m
[31m-    jmp_patchval(fs, list, target, NO_REG, target);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode register allocator ----------------------------------------- */[m
[31m-[m
[31m-/* Bump frame size. */[m
[31m-static void bcreg_bump(FuncState *fs, BCReg n)[m
[31m-{[m
[31m-  BCReg sz = fs->freereg + n;[m
[31m-  if (sz > fs->framesize) {[m
[31m-    if (sz >= LJ_MAX_SLOTS)[m
[31m-      err_syntax(fs->ls, LJ_ERR_XSLOTS);[m
[31m-    fs->framesize = (uint8_t)sz;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Reserve registers. */[m
[31m-static void bcreg_reserve(FuncState *fs, BCReg n)[m
[31m-{[m
[31m-  bcreg_bump(fs, n);[m
[31m-  fs->freereg += n;[m
[31m-}[m
[31m-[m
[31m-/* Free register. */[m
[31m-static void bcreg_free(FuncState *fs, BCReg reg)[m
[31m-{[m
[31m-  if (reg >= fs->nactvar) {[m
[31m-    fs->freereg--;[m
[31m-    lua_assert(reg == fs->freereg);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free register for expression. */[m
[31m-static void expr_free(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  if (e->k == VNONRELOC)[m
[31m-    bcreg_free(fs, e->u.s.info);[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode emitter ---------------------------------------------------- */[m
[31m-[m
[31m-/* Emit bytecode instruction. */[m
[31m-static BCPos bcemit_INS(FuncState *fs, BCIns ins)[m
[31m-{[m
[31m-  BCPos pc = fs->pc;[m
[31m-  LexState *ls = fs->ls;[m
[31m-  jmp_patchval(fs, fs->jpc, pc, NO_REG, pc);[m
[31m-  fs->jpc = NO_JMP;[m
[31m-  if (LJ_UNLIKELY(pc >= fs->bclim)) {[m
[31m-    ptrdiff_t base = fs->bcbase - ls->bcstack;[m
[31m-    checklimit(fs, ls->sizebcstack, LJ_MAX_BCINS, "bytecode instructions");[m
[31m-    lj_mem_growvec(fs->L, ls->bcstack, ls->sizebcstack, LJ_MAX_BCINS,BCInsLine);[m
[31m-    fs->bclim = (BCPos)(ls->sizebcstack - base);[m
[31m-    fs->bcbase = ls->bcstack + base;[m
[31m-  }[m
[31m-  fs->bcbase[pc].ins = ins;[m
[31m-  fs->bcbase[pc].line = ls->lastline;[m
[31m-  fs->pc = pc+1;[m
[31m-  return pc;[m
[31m-}[m
[31m-[m
[31m-#define bcemit_ABC(fs, o, a, b, c)	bcemit_INS(fs, BCINS_ABC(o, a, b, c))[m
[31m-#define bcemit_AD(fs, o, a, d)		bcemit_INS(fs, BCINS_AD(o, a, d))[m
[31m-#define bcemit_AJ(fs, o, a, j)		bcemit_INS(fs, BCINS_AJ(o, a, j))[m
[31m-[m
[31m-#define bcptr(fs, e)			(&(fs)->bcbase[(e)->u.s.info].ins)[m
[31m-[m
[31m-/* -- Bytecode emitter for expressions ------------------------------------ */[m
[31m-[m
[31m-/* Discharge non-constant expression to any register. */[m
[31m-static void expr_discharge(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  BCIns ins;[m
[31m-  if (e->k == VUPVAL) {[m
[31m-    ins = BCINS_AD(BC_UGET, 0, e->u.s.info);[m
[31m-  } else if (e->k == VGLOBAL) {[m
[31m-    ins = BCINS_AD(BC_GGET, 0, const_str(fs, e));[m
[31m-  } else if (e->k == VINDEXED) {[m
[31m-    BCReg rc = e->u.s.aux;[m
[31m-    if ((int32_t)rc < 0) {[m
[31m-      ins = BCINS_ABC(BC_TGETS, 0, e->u.s.info, ~rc);[m
[31m-    } else if (rc > BCMAX_C) {[m
[31m-      ins = BCINS_ABC(BC_TGETB, 0, e->u.s.info, rc-(BCMAX_C+1));[m
[31m-    } else {[m
[31m-      bcreg_free(fs, rc);[m
[31m-      ins = BCINS_ABC(BC_TGETV, 0, e->u.s.info, rc);[m
[31m-    }[m
[31m-    bcreg_free(fs, e->u.s.info);[m
[31m-  } else if (e->k == VCALL) {[m
[31m-    e->u.s.info = e->u.s.aux;[m
[31m-    e->k = VNONRELOC;[m
[31m-    return;[m
[31m-  } else if (e->k == VLOCAL) {[m
[31m-    e->k = VNONRELOC;[m
[31m-    return;[m
[31m-  } else {[m
[31m-    return;[m
[31m-  }[m
[31m-  e->u.s.info = bcemit_INS(fs, ins);[m
[31m-  e->k = VRELOCABLE;[m
[31m-}[m
[31m-[m
[31m-/* Emit bytecode to set a range of registers to nil. */[m
[31m-static void bcemit_nil(FuncState *fs, BCReg from, BCReg n)[m
[31m-{[m
[31m-  if (fs->pc > fs->lasttarget) {  /* No jumps to current position? */[m
[31m-    BCIns *ip = &fs->bcbase[fs->pc-1].ins;[m
[31m-    BCReg pto, pfrom = bc_a(*ip);[m
[31m-    switch (bc_op(*ip)) {  /* Try to merge with the previous instruction. */[m
[31m-    case BC_KPRI:[m
[31m-      if (bc_d(*ip) != ~LJ_TNIL) break;[m
[31m-      if (from == pfrom) {[m
[31m-	if (n == 1) return;[m
[31m-      } else if (from == pfrom+1) {[m
[31m-	from = pfrom;[m
[31m-	n++;[m
[31m-      } else {[m
[31m-	break;[m
[31m-      }[m
[31m-      *ip = BCINS_AD(BC_KNIL, from, from+n-1);  /* Replace KPRI. */[m
[31m-      return;[m
[31m-    case BC_KNIL:[m
[31m-      pto = bc_d(*ip);[m
[31m-      if (pfrom <= from && from <= pto+1) {  /* Can we connect both ranges? */[m
[31m-	if (from+n-1 > pto)[m
[31m-	  setbc_d(ip, from+n-1);  /* Patch previous instruction range. */[m
[31m-	return;[m
[31m-      }[m
[31m-      break;[m
[31m-    default:[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Emit new instruction or replace old instruction. */[m
[31m-  bcemit_INS(fs, n == 1 ? BCINS_AD(BC_KPRI, from, VKNIL) :[m
[31m-			  BCINS_AD(BC_KNIL, from, from+n-1));[m
[31m-}[m
[31m-[m
[31m-/* Discharge an expression to a specific register. Ignore branches. */[m
[31m-static void expr_toreg_nobranch(FuncState *fs, ExpDesc *e, BCReg reg)[m
[31m-{[m
[31m-  BCIns ins;[m
[31m-  expr_discharge(fs, e);[m
[31m-  if (e->k == VKSTR) {[m
[31m-    ins = BCINS_AD(BC_KSTR, reg, const_str(fs, e));[m
[31m-  } else if (e->k == VKNUM) {[m
[31m-#if LJ_DUALNUM[m
[31m-    cTValue *tv = expr_numtv(e);[m
[31m-    if (tvisint(tv) && checki16(intV(tv)))[m
[31m-      ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)intV(tv));[m
[31m-    else[m
[31m-#else[m
[31m-    lua_Number n = expr_numberV(e);[m
[31m-    int32_t k = lj_num2int(n);[m
[31m-    if (checki16(k) && n == (lua_Number)k)[m
[31m-      ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k);[m
[31m-    else[m
[31m-#endif[m
[31m-      ins = BCINS_AD(BC_KNUM, reg, const_num(fs, e));[m
[31m-#if LJ_HASFFI[m
[31m-  } else if (e->k == VKCDATA) {[m
[31m-    fs->flags |= PROTO_FFI;[m
[31m-    ins = BCINS_AD(BC_KCDATA, reg,[m
[31m-		   const_gc(fs, obj2gco(cdataV(&e->u.nval)), LJ_TCDATA));[m
[31m-#endif[m
[31m-  } else if (e->k == VRELOCABLE) {[m
[31m-    setbc_a(bcptr(fs, e), reg);[m
[31m-    goto noins;[m
[31m-  } else if (e->k == VNONRELOC) {[m
[31m-    if (reg == e->u.s.info)[m
[31m-      goto noins;[m
[31m-    ins = BCINS_AD(BC_MOV, reg, e->u.s.info);[m
[31m-  } else if (e->k == VKNIL) {[m
[31m-    bcemit_nil(fs, reg, 1);[m
[31m-    goto noins;[m
[31m-  } else if (e->k <= VKTRUE) {[m
[31m-    ins = BCINS_AD(BC_KPRI, reg, const_pri(e));[m
[31m-  } else {[m
[31m-    lua_assert(e->k == VVOID || e->k == VJMP);[m
[31m-    return;[m
[31m-  }[m
[31m-  bcemit_INS(fs, ins);[m
[31m-noins:[m
[31m-  e->u.s.info = reg;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static BCPos bcemit_jmp(FuncState *fs);[m
[31m-[m
[31m-/* Discharge an expression to a specific register. */[m
[31m-static void expr_toreg(FuncState *fs, ExpDesc *e, BCReg reg)[m
[31m-{[m
[31m-  expr_toreg_nobranch(fs, e, reg);[m
[31m-  if (e->k == VJMP)[m
[31m-    jmp_append(fs, &e->t, e->u.s.info);  /* Add it to the true jump list. */[m
[31m-  if (expr_hasjump(e)) {  /* Discharge expression with branches. */[m
[31m-    BCPos jend, jfalse = NO_JMP, jtrue = NO_JMP;[m
[31m-    if (jmp_novalue(fs, e->t) || jmp_novalue(fs, e->f)) {[m
[31m-      BCPos jval = (e->k == VJMP) ? NO_JMP : bcemit_jmp(fs);[m
[31m-      jfalse = bcemit_AD(fs, BC_KPRI, reg, VKFALSE);[m
[31m-      bcemit_AJ(fs, BC_JMP, fs->freereg, 1);[m
[31m-      jtrue = bcemit_AD(fs, BC_KPRI, reg, VKTRUE);[m
[31m-      jmp_tohere(fs, jval);[m
[31m-    }[m
[31m-    jend = fs->pc;[m
[31m-    fs->lasttarget = jend;[m
[31m-    jmp_patchval(fs, e->f, jend, reg, jfalse);[m
[31m-    jmp_patchval(fs, e->t, jend, reg, jtrue);[m
[31m-  }[m
[31m-  e->f = e->t = NO_JMP;[m
[31m-  e->u.s.info = reg;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-/* Discharge an expression to the next free register. */[m
[31m-static void expr_tonextreg(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  expr_discharge(fs, e);[m
[31m-  expr_free(fs, e);[m
[31m-  bcreg_reserve(fs, 1);[m
[31m-  expr_toreg(fs, e, fs->freereg - 1);[m
[31m-}[m
[31m-[m
[31m-/* Discharge an expression to any register. */[m
[31m-static BCReg expr_toanyreg(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  expr_discharge(fs, e);[m
[31m-  if (e->k == VNONRELOC) {[m
[31m-    if (!expr_hasjump(e)) return e->u.s.info;  /* Already in a register. */[m
[31m-    if (e->u.s.info >= fs->nactvar) {[m
[31m-      expr_toreg(fs, e, e->u.s.info);  /* Discharge to temp. register. */[m
[31m-      return e->u.s.info;[m
[31m-    }[m
[31m-  }[m
[31m-  expr_tonextreg(fs, e);  /* Discharge to next register. */[m
[31m-  return e->u.s.info;[m
[31m-}[m
[31m-[m
[31m-/* Partially discharge expression to a value. */[m
[31m-static void expr_toval(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  if (expr_hasjump(e))[m
[31m-    expr_toanyreg(fs, e);[m
[31m-  else[m
[31m-    expr_discharge(fs, e);[m
[31m-}[m
[31m-[m
[31m-/* Emit store for LHS expression. */[m
[31m-static void bcemit_store(FuncState *fs, ExpDesc *var, ExpDesc *e)[m
[31m-{[m
[31m-  BCIns ins;[m
[31m-  if (var->k == VLOCAL) {[m
[31m-    fs->ls->vstack[var->u.s.aux].info |= VSTACK_VAR_RW;[m
[31m-    expr_free(fs, e);[m
[31m-    expr_toreg(fs, e, var->u.s.info);[m
[31m-    return;[m
[31m-  } else if (var->k == VUPVAL) {[m
[31m-    fs->ls->vstack[var->u.s.aux].info |= VSTACK_VAR_RW;[m
[31m-    expr_toval(fs, e);[m
[31m-    if (e->k <= VKTRUE)[m
[31m-      ins = BCINS_AD(BC_USETP, var->u.s.info, const_pri(e));[m
[31m-    else if (e->k == VKSTR)[m
[31m-      ins = BCINS_AD(BC_USETS, var->u.s.info, const_str(fs, e));[m
[31m-    else if (e->k == VKNUM)[m
[31m-      ins = BCINS_AD(BC_USETN, var->u.s.info, const_num(fs, e));[m
[31m-    else[m
[31m-      ins = BCINS_AD(BC_USETV, var->u.s.info, expr_toanyreg(fs, e));[m
[31m-  } else if (var->k == VGLOBAL) {[m
[31m-    BCReg ra = expr_toanyreg(fs, e);[m
[31m-    ins = BCINS_AD(BC_GSET, ra, const_str(fs, var));[m
[31m-  } else {[m
[31m-    BCReg ra, rc;[m
[31m-    lua_assert(var->k == VINDEXED);[m
[31m-    ra = expr_toanyreg(fs, e);[m
[31m-    rc = var->u.s.aux;[m
[31m-    if ((int32_t)rc < 0) {[m
[31m-      ins = BCINS_ABC(BC_TSETS, ra, var->u.s.info, ~rc);[m
[31m-    } else if (rc > BCMAX_C) {[m
[31m-      ins = BCINS_ABC(BC_TSETB, ra, var->u.s.info, rc-(BCMAX_C+1));[m
[31m-    } else {[m
[31m-      /* Free late alloced key reg to avoid assert on free of value reg. */[m
[31m-      /* This can only happen when called from expr_table(). */[m
[31m-      lua_assert(e->k != VNONRELOC || ra < fs->nactvar ||[m
[31m-		 rc < ra || (bcreg_free(fs, rc),1));[m
[31m-      ins = BCINS_ABC(BC_TSETV, ra, var->u.s.info, rc);[m
[31m-    }[m
[31m-  }[m
[31m-  bcemit_INS(fs, ins);[m
[31m-  expr_free(fs, e);[m
[31m-}[m
[31m-[m
[31m-/* Emit method lookup expression. */[m
[31m-static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key)[m
[31m-{[m
[31m-  BCReg idx, func, obj = expr_toanyreg(fs, e);[m
[31m-  expr_free(fs, e);[m
[31m-  func = fs->freereg;[m
[31m-  bcemit_AD(fs, BC_MOV, func+1+LJ_FR2, obj);  /* Copy object to 1st argument. */[m
[31m-  lua_assert(expr_isstrk(key));[m
[31m-  idx = const_str(fs, key);[m
[31m-  if (idx <= BCMAX_C) {[m
[31m-    bcreg_reserve(fs, 2+LJ_FR2);[m
[31m-    bcemit_ABC(fs, BC_TGETS, func, obj, idx);[m
[31m-  } else {[m
[31m-    bcreg_reserve(fs, 3+LJ_FR2);[m
[31m-    bcemit_AD(fs, BC_KSTR, func+2+LJ_FR2, idx);[m
[31m-    bcemit_ABC(fs, BC_TGETV, func, obj, func+2+LJ_FR2);[m
[31m-    fs->freereg--;[m
[31m-  }[m
[31m-  e->u.s.info = func;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode emitter for branches --------------------------------------- */[m
[31m-[m
[31m-/* Emit unconditional branch. */[m
[31m-static BCPos bcemit_jmp(FuncState *fs)[m
[31m-{[m
[31m-  BCPos jpc = fs->jpc;[m
[31m-  BCPos j = fs->pc - 1;[m
[31m-  BCIns *ip = &fs->bcbase[j].ins;[m
[31m-  fs->jpc = NO_JMP;[m
[31m-  if ((int32_t)j >= (int32_t)fs->lasttarget && bc_op(*ip) == BC_UCLO) {[m
[31m-    setbc_j(ip, NO_JMP);[m
[31m-    fs->lasttarget = j+1;[m
[31m-  } else {[m
[31m-    j = bcemit_AJ(fs, BC_JMP, fs->freereg, NO_JMP);[m
[31m-  }[m
[31m-  jmp_append(fs, &j, jpc);[m
[31m-  return j;[m
[31m-}[m
[31m-[m
[31m-/* Invert branch condition of bytecode instruction. */[m
[31m-static void invertcond(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  BCIns *ip = &fs->bcbase[e->u.s.info - 1].ins;[m
[31m-  setbc_op(ip, bc_op(*ip)^1);[m
[31m-}[m
[31m-[m
[31m-/* Emit conditional branch. */[m
[31m-static BCPos bcemit_branch(FuncState *fs, ExpDesc *e, int cond)[m
[31m-{[m
[31m-  BCPos pc;[m
[31m-  if (e->k == VRELOCABLE) {[m
[31m-    BCIns *ip = bcptr(fs, e);[m
[31m-    if (bc_op(*ip) == BC_NOT) {[m
[31m-      *ip = BCINS_AD(cond ? BC_ISF : BC_IST, 0, bc_d(*ip));[m
[31m-      return bcemit_jmp(fs);[m
[31m-    }[m
[31m-  }[m
[31m-  if (e->k != VNONRELOC) {[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-    expr_toreg_nobranch(fs, e, fs->freereg-1);[m
[31m-  }[m
[31m-  bcemit_AD(fs, cond ? BC_ISTC : BC_ISFC, NO_REG, e->u.s.info);[m
[31m-  pc = bcemit_jmp(fs);[m
[31m-  expr_free(fs, e);[m
[31m-  return pc;[m
[31m-}[m
[31m-[m
[31m-/* Emit branch on true condition. */[m
[31m-static void bcemit_branch_t(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  BCPos pc;[m
[31m-  expr_discharge(fs, e);[m
[31m-  if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)[m
[31m-    pc = NO_JMP;  /* Never jump. */[m
[31m-  else if (e->k == VJMP)[m
[31m-    invertcond(fs, e), pc = e->u.s.info;[m
[31m-  else if (e->k == VKFALSE || e->k == VKNIL)[m
[31m-    expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);[m
[31m-  else[m
[31m-    pc = bcemit_branch(fs, e, 0);[m
[31m-  jmp_append(fs, &e->f, pc);[m
[31m-  jmp_tohere(fs, e->t);[m
[31m-  e->t = NO_JMP;[m
[31m-}[m
[31m-[m
[31m-/* Emit branch on false condition. */[m
[31m-static void bcemit_branch_f(FuncState *fs, ExpDesc *e)[m
[31m-{[m
[31m-  BCPos pc;[m
[31m-  expr_discharge(fs, e);[m
[31m-  if (e->k == VKNIL || e->k == VKFALSE)[m
[31m-    pc = NO_JMP;  /* Never jump. */[m
[31m-  else if (e->k == VJMP)[m
[31m-    pc = e->u.s.info;[m
[31m-  else if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)[m
[31m-    expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);[m
[31m-  else[m
[31m-    pc = bcemit_branch(fs, e, 1);[m
[31m-  jmp_append(fs, &e->t, pc);[m
[31m-  jmp_tohere(fs, e->f);[m
[31m-  e->f = NO_JMP;[m
[31m-}[m
[31m-[m
[31m-/* -- Bytecode emitter for operators -------------------------------------- */[m
[31m-[m
[31m-/* Try constant-folding of arithmetic operators. */[m
[31m-static int foldarith(BinOpr opr, ExpDesc *e1, ExpDesc *e2)[m
[31m-{[m
[31m-  TValue o;[m
[31m-  lua_Number n;[m
[31m-  if (!expr_isnumk_nojump(e1) || !expr_isnumk_nojump(e2)) return 0;[m
[31m-  n = lj_vm_foldarith(expr_numberV(e1), expr_numberV(e2), (int)opr-OPR_ADD);[m
[31m-  setnumV(&o, n);[m
[31m-  if (tvisnan(&o) || tvismzero(&o)) return 0;  /* Avoid NaN and -0 as consts. */[m
[31m-  if (LJ_DUALNUM) {[m
[31m-    int32_t k = lj_num2int(n);[m
[31m-    if ((lua_Number)k == n) {[m
[31m-      setintV(&e1->u.nval, k);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  setnumV(&e1->u.nval, n);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Emit arithmetic operator. */[m
[31m-static void bcemit_arith(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)[m
[31m-{[m
[31m-  BCReg rb, rc, t;[m
[31m-  uint32_t op;[m
[31m-  if (foldarith(opr, e1, e2))[m
[31m-    return;[m
[31m-  if (opr == OPR_POW) {[m
[31m-    op = BC_POW;[m
[31m-    rc = expr_toanyreg(fs, e2);[m
[31m-    rb = expr_toanyreg(fs, e1);[m
[31m-  } else {[m
[31m-    op = opr-OPR_ADD+BC_ADDVV;[m
[31m-    /* Must discharge 2nd operand first since VINDEXED might free regs. */[m
[31m-    expr_toval(fs, e2);[m
[31m-    if (expr_isnumk(e2) && (rc = const_num(fs, e2)) <= BCMAX_C)[m
[31m-      op -= BC_ADDVV-BC_ADDVN;[m
[31m-    else[m
[31m-      rc = expr_toanyreg(fs, e2);[m
[31m-    /* 1st operand discharged by bcemit_binop_left, but need KNUM/KSHORT. */[m
[31m-    lua_assert(expr_isnumk(e1) || e1->k == VNONRELOC);[m
[31m-    expr_toval(fs, e1);[m
[31m-    /* Avoid two consts to satisfy bytecode constraints. */[m
[31m-    if (expr_isnumk(e1) && !expr_isnumk(e2) &&[m
[31m-	(t = const_num(fs, e1)) <= BCMAX_B) {[m
[31m-      rb = rc; rc = t; op -= BC_ADDVV-BC_ADDNV;[m
[31m-    } else {[m
[31m-      rb = expr_toanyreg(fs, e1);[m
[31m-    }[m
[31m-  }[m
[31m-  /* Using expr_free might cause asserts if the order is wrong. */[m
[31m-  if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;[m
[31m-  if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;[m
[31m-  e1->u.s.info = bcemit_ABC(fs, op, 0, rb, rc);[m
[31m-  e1->k = VRELOCABLE;[m
[31m-}[m
[31m-[m
[31m-/* Emit comparison operator. */[m
[31m-static void bcemit_comp(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)[m
[31m-{[m
[31m-  ExpDesc *eret = e1;[m
[31m-  BCIns ins;[m
[31m-  expr_toval(fs, e1);[m
[31m-  if (opr == OPR_EQ || opr == OPR_NE) {[m
[31m-    BCOp op = opr == OPR_EQ ? BC_ISEQV : BC_ISNEV;[m
[31m-    BCReg ra;[m
[31m-    if (expr_isk(e1)) { e1 = e2; e2 = eret; }  /* Need constant in 2nd arg. */[m
[31m-    ra = expr_toanyreg(fs, e1);  /* First arg must be in a reg. */[m
[31m-    expr_toval(fs, e2);[m
[31m-    switch (e2->k) {[m
[31m-    case VKNIL: case VKFALSE: case VKTRUE:[m
[31m-      ins = BCINS_AD(op+(BC_ISEQP-BC_ISEQV), ra, const_pri(e2));[m
[31m-      break;[m
[31m-    case VKSTR:[m
[31m-      ins = BCINS_AD(op+(BC_ISEQS-BC_ISEQV), ra, const_str(fs, e2));[m
[31m-      break;[m
[31m-    case VKNUM:[m
[31m-      ins = BCINS_AD(op+(BC_ISEQN-BC_ISEQV), ra, const_num(fs, e2));[m
[31m-      break;[m
[31m-    default:[m
[31m-      ins = BCINS_AD(op, ra, expr_toanyreg(fs, e2));[m
[31m-      break;[m
[31m-    }[m
[31m-  } else {[m
[31m-    uint32_t op = opr-OPR_LT+BC_ISLT;[m
[31m-    BCReg ra, rd;[m
[31m-    if ((op-BC_ISLT) & 1) {  /* GT -> LT, GE -> LE */[m
[31m-      e1 = e2; e2 = eret;  /* Swap operands. */[m
[31m-      op = ((op-BC_ISLT)^3)+BC_ISLT;[m
[31m-      expr_toval(fs, e1);[m
[31m-    }[m
[31m-    rd = expr_toanyreg(fs, e2);[m
[31m-    ra = expr_toanyreg(fs, e1);[m
[31m-    ins = BCINS_AD(op, ra, rd);[m
[31m-  }[m
[31m-  /* Using expr_free might cause asserts if the order is wrong. */[m
[31m-  if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;[m
[31m-  if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;[m
[31m-  bcemit_INS(fs, ins);[m
[31m-  eret->u.s.info = bcemit_jmp(fs);[m
[31m-  eret->k = VJMP;[m
[31m-}[m
[31m-[m
[31m-/* Fixup left side of binary operator. */[m
[31m-static void bcemit_binop_left(FuncState *fs, BinOpr op, ExpDesc *e)[m
[31m-{[m
[31m-  if (op == OPR_AND) {[m
[31m-    bcemit_branch_t(fs, e);[m
[31m-  } else if (op == OPR_OR) {[m
[31m-    bcemit_branch_f(fs, e);[m
[31m-  } else if (op == OPR_CONCAT) {[m
[31m-    expr_tonextreg(fs, e);[m
[31m-  } else if (op == OPR_EQ || op == OPR_NE) {[m
[31m-    if (!expr_isk_nojump(e)) expr_toanyreg(fs, e);[m
[31m-  } else {[m
[31m-    if (!expr_isnumk_nojump(e)) expr_toanyreg(fs, e);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit binary operator. */[m
[31m-static void bcemit_binop(FuncState *fs, BinOpr op, ExpDesc *e1, ExpDesc *e2)[m
[31m-{[m
[31m-  if (op <= OPR_POW) {[m
[31m-    bcemit_arith(fs, op, e1, e2);[m
[31m-  } else if (op == OPR_AND) {[m
[31m-    lua_assert(e1->t == NO_JMP);  /* List must be closed. */[m
[31m-    expr_discharge(fs, e2);[m
[31m-    jmp_append(fs, &e2->f, e1->f);[m
[31m-    *e1 = *e2;[m
[31m-  } else if (op == OPR_OR) {[m
[31m-    lua_assert(e1->f == NO_JMP);  /* List must be closed. */[m
[31m-    expr_discharge(fs, e2);[m
[31m-    jmp_append(fs, &e2->t, e1->t);[m
[31m-    *e1 = *e2;[m
[31m-  } else if (op == OPR_CONCAT) {[m
[31m-    expr_toval(fs, e2);[m
[31m-    if (e2->k == VRELOCABLE && bc_op(*bcptr(fs, e2)) == BC_CAT) {[m
[31m-      lua_assert(e1->u.s.info == bc_b(*bcptr(fs, e2))-1);[m
[31m-      expr_free(fs, e1);[m
[31m-      setbc_b(bcptr(fs, e2), e1->u.s.info);[m
[31m-      e1->u.s.info = e2->u.s.info;[m
[31m-    } else {[m
[31m-      expr_tonextreg(fs, e2);[m
[31m-      expr_free(fs, e2);[m
[31m-      expr_free(fs, e1);[m
[31m-      e1->u.s.info = bcemit_ABC(fs, BC_CAT, 0, e1->u.s.info, e2->u.s.info);[m
[31m-    }[m
[31m-    e1->k = VRELOCABLE;[m
[31m-  } else {[m
[31m-    lua_assert(op == OPR_NE || op == OPR_EQ ||[m
[31m-	       op == OPR_LT || op == OPR_GE || op == OPR_LE || op == OPR_GT);[m
[31m-    bcemit_comp(fs, op, e1, e2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Emit unary operator. */[m
[31m-static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e)[m
[31m-{[m
[31m-  if (op == BC_NOT) {[m
[31m-    /* Swap true and false lists. */[m
[31m-    { BCPos temp = e->f; e->f = e->t; e->t = temp; }[m
[31m-    jmp_dropval(fs, e->f);[m
[31m-    jmp_dropval(fs, e->t);[m
[31m-    expr_discharge(fs, e);[m
[31m-    if (e->k == VKNIL || e->k == VKFALSE) {[m
[31m-      e->k = VKTRUE;[m
[31m-      return;[m
[31m-    } else if (expr_isk(e) || (LJ_HASFFI && e->k == VKCDATA)) {[m
[31m-      e->k = VKFALSE;[m
[31m-      return;[m
[31m-    } else if (e->k == VJMP) {[m
[31m-      invertcond(fs, e);[m
[31m-      return;[m
[31m-    } else if (e->k == VRELOCABLE) {[m
[31m-      bcreg_reserve(fs, 1);[m
[31m-      setbc_a(bcptr(fs, e), fs->freereg-1);[m
[31m-      e->u.s.info = fs->freereg-1;[m
[31m-      e->k = VNONRELOC;[m
[31m-    } else {[m
[31m-      lua_assert(e->k == VNONRELOC);[m
[31m-    }[m
[31m-  } else {[m
[31m-    lua_assert(op == BC_UNM || op == BC_LEN);[m
[31m-    if (op == BC_UNM && !expr_hasjump(e)) {  /* Constant-fold negations. */[m
[31m-#if LJ_HASFFI[m
[31m-      if (e->k == VKCDATA) {  /* Fold in-place since cdata is not interned. */[m
[31m-	GCcdata *cd = cdataV(&e->u.nval);[m
[31m-	int64_t *p = (int64_t *)cdataptr(cd);[m
[31m-	if (cd->ctypeid == CTID_COMPLEX_DOUBLE)[m
[31m-	  p[1] ^= (int64_t)U64x(80000000,00000000);[m
[31m-	else[m
[31m-	  *p = -*p;[m
[31m-	return;[m
[31m-      } else[m
[31m-#endif[m
[31m-      if (expr_isnumk(e) && !expr_numiszero(e)) {  /* Avoid folding to -0. */[m
[31m-	TValue *o = expr_numtv(e);[m
[31m-	if (tvisint(o)) {[m
[31m-	  int32_t k = intV(o);[m
[31m-	  if (k == -k)[m
[31m-	    setnumV(o, -(lua_Number)k);[m
[31m-	  else[m
[31m-	    setintV(o, -k);[m
[31m-	  return;[m
[31m-	} else {[m
[31m-	  o->u64 ^= U64x(80000000,00000000);[m
[31m-	  return;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    expr_toanyreg(fs, e);[m
[31m-  }[m
[31m-  expr_free(fs, e);[m
[31m-  e->u.s.info = bcemit_AD(fs, op, 0, e->u.s.info);[m
[31m-  e->k = VRELOCABLE;[m
[31m-}[m
[31m-[m
[31m-/* -- Lexer support ------------------------------------------------------- */[m
[31m-[m
[31m-/* Check and consume optional token. */[m
[31m-static int lex_opt(LexState *ls, LexToken tok)[m
[31m-{[m
[31m-  if (ls->tok == tok) {[m
[31m-    lj_lex_next(ls);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check and consume token. */[m
[31m-static void lex_check(LexState *ls, LexToken tok)[m
[31m-{[m
[31m-  if (ls->tok != tok)[m
[31m-    err_token(ls, tok);[m
[31m-  lj_lex_next(ls);[m
[31m-}[m
[31m-[m
[31m-/* Check for matching token. */[m
[31m-static void lex_match(LexState *ls, LexToken what, LexToken who, BCLine line)[m
[31m-{[m
[31m-  if (!lex_opt(ls, what)) {[m
[31m-    if (line == ls->linenumber) {[m
[31m-      err_token(ls, what);[m
[31m-    } else {[m
[31m-      const char *swhat = lj_lex_token2str(ls, what);[m
[31m-      const char *swho = lj_lex_token2str(ls, who);[m
[31m-      lj_lex_error(ls, ls->tok, LJ_ERR_XMATCH, swhat, swho, line);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Check for string token. */[m
[31m-static GCstr *lex_str(LexState *ls)[m
[31m-{[m
[31m-  GCstr *s;[m
[31m-  if (ls->tok != TK_name && (LJ_52 || ls->tok != TK_goto))[m
[31m-    err_token(ls, TK_name);[m
[31m-  s = strV(&ls->tokval);[m
[31m-  lj_lex_next(ls);[m
[31m-  return s;[m
[31m-}[m
[31m-[m
[31m-/* -- Variable handling --------------------------------------------------- */[m
[31m-[m
[31m-#define var_get(ls, fs, i)	((ls)->vstack[(fs)->varmap[(i)]])[m
[31m-[m
[31m-/* Define a new local variable. */[m
[31m-static void var_new(LexState *ls, BCReg n, GCstr *name)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  MSize vtop = ls->vtop;[m
[31m-  checklimit(fs, fs->nactvar+n, LJ_MAX_LOCVAR, "local variables");[m
[31m-  if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {[m
[31m-    if (ls->sizevstack >= LJ_MAX_VSTACK)[m
[31m-      lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);[m
[31m-    lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);[m
[31m-  }[m
[31m-  lua_assert((uintptr_t)name < VARNAME__MAX ||[m
[31m-	     lj_tab_getstr(fs->kt, name) != NULL);[m
[31m-  /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */[m
[31m-  setgcref(ls->vstack[vtop].name, obj2gco(name));[m
[31m-  fs->varmap[fs->nactvar+n] = (uint16_t)vtop;[m
[31m-  ls->vtop = vtop+1;[m
[31m-}[m
[31m-[m
[31m-#define var_new_lit(ls, n, v) \[m
[31m-  var_new(ls, (n), lj_parse_keepstr(ls, "" v, sizeof(v)-1))[m
[31m-[m
[31m-#define var_new_fixed(ls, n, vn) \[m
[31m-  var_new(ls, (n), (GCstr *)(uintptr_t)(vn))[m
[31m-[m
[31m-/* Add local variables. */[m
[31m-static void var_add(LexState *ls, BCReg nvars)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCReg nactvar = fs->nactvar;[m
[31m-  while (nvars--) {[m
[31m-    VarInfo *v = &var_get(ls, fs, nactvar);[m
[31m-    v->startpc = fs->pc;[m
[31m-    v->slot = nactvar++;[m
[31m-    v->info = 0;[m
[31m-  }[m
[31m-  fs->nactvar = nactvar;[m
[31m-}[m
[31m-[m
[31m-/* Remove local variables. */[m
[31m-static void var_remove(LexState *ls, BCReg tolevel)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  while (fs->nactvar > tolevel)[m
[31m-    var_get(ls, fs, --fs->nactvar).endpc = fs->pc;[m
[31m-}[m
[31m-[m
[31m-/* Lookup local variable name. */[m
[31m-static BCReg var_lookup_local(FuncState *fs, GCstr *n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = fs->nactvar-1; i >= 0; i--) {[m
[31m-    if (n == strref(var_get(fs->ls, fs, i).name))[m
[31m-      return (BCReg)i;[m
[31m-  }[m
[31m-  return (BCReg)-1;  /* Not found. */[m
[31m-}[m
[31m-[m
[31m-/* Lookup or add upvalue index. */[m
[31m-static MSize var_lookup_uv(FuncState *fs, MSize vidx, ExpDesc *e)[m
[31m-{[m
[31m-  MSize i, n = fs->nuv;[m
[31m-  for (i = 0; i < n; i++)[m
[31m-    if (fs->uvmap[i] == vidx)[m
[31m-      return i;  /* Already exists. */[m
[31m-  /* Otherwise create a new one. */[m
[31m-  checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues");[m
[31m-  lua_assert(e->k == VLOCAL || e->k == VUPVAL);[m
[31m-  fs->uvmap[n] = (uint16_t)vidx;[m
[31m-  fs->uvtmp[n] = (uint16_t)(e->k == VLOCAL ? vidx : LJ_MAX_VSTACK+e->u.s.info);[m
[31m-  fs->nuv = n+1;[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static void fscope_uvmark(FuncState *fs, BCReg level);[m
[31m-[m
[31m-/* Recursively lookup variables in enclosing functions. */[m
[31m-static MSize var_lookup_(FuncState *fs, GCstr *name, ExpDesc *e, int first)[m
[31m-{[m
[31m-  if (fs) {[m
[31m-    BCReg reg = var_lookup_local(fs, name);[m
[31m-    if ((int32_t)reg >= 0) {  /* Local in this function? */[m
[31m-      expr_init(e, VLOCAL, reg);[m
[31m-      if (!first)[m
[31m-	fscope_uvmark(fs, reg);  /* Scope now has an upvalue. */[m
[31m-      return (MSize)(e->u.s.aux = (uint32_t)fs->varmap[reg]);[m
[31m-    } else {[m
[31m-      MSize vidx = var_lookup_(fs->prev, name, e, 0);  /* Var in outer func? */[m
[31m-      if ((int32_t)vidx >= 0) {  /* Yes, make it an upvalue here. */[m
[31m-	e->u.s.info = (uint8_t)var_lookup_uv(fs, vidx, e);[m
[31m-	e->k = VUPVAL;[m
[31m-	return vidx;[m
[31m-      }[m
[31m-    }[m
[31m-  } else {  /* Not found in any function, must be a global. */[m
[31m-    expr_init(e, VGLOBAL, 0);[m
[31m-    e->u.sval = name;[m
[31m-  }[m
[31m-  return (MSize)-1;  /* Global. */[m
[31m-}[m
[31m-[m
[31m-/* Lookup variable name. */[m
[31m-#define var_lookup(ls, e) \[m
[31m-  var_lookup_((ls)->fs, lex_str(ls), (e), 1)[m
[31m-[m
[31m-/* -- Goto an label handling ---------------------------------------------- */[m
[31m-[m
[31m-/* Add a new goto or label. */[m
[31m-static MSize gola_new(LexState *ls, GCstr *name, uint8_t info, BCPos pc)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  MSize vtop = ls->vtop;[m
[31m-  if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {[m
[31m-    if (ls->sizevstack >= LJ_MAX_VSTACK)[m
[31m-      lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);[m
[31m-    lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);[m
[31m-  }[m
[31m-  lua_assert(name == NAME_BREAK || lj_tab_getstr(fs->kt, name) != NULL);[m
[31m-  /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */[m
[31m-  setgcref(ls->vstack[vtop].name, obj2gco(name));[m
[31m-  ls->vstack[vtop].startpc = pc;[m
[31m-  ls->vstack[vtop].slot = (uint8_t)fs->nactvar;[m
[31m-  ls->vstack[vtop].info = info;[m
[31m-  ls->vtop = vtop+1;[m
[31m-  return vtop;[m
[31m-}[m
[31m-[m
[31m-#define gola_isgoto(v)		((v)->info & VSTACK_GOTO)[m
[31m-#define gola_islabel(v)		((v)->info & VSTACK_LABEL)[m
[31m-#define gola_isgotolabel(v)	((v)->info & (VSTACK_GOTO|VSTACK_LABEL))[m
[31m-[m
[31m-/* Patch goto to jump to label. */[m
[31m-static void gola_patch(LexState *ls, VarInfo *vg, VarInfo *vl)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos pc = vg->startpc;[m
[31m-  setgcrefnull(vg->name);  /* Invalidate pending goto. */[m
[31m-  setbc_a(&fs->bcbase[pc].ins, vl->slot);[m
[31m-  jmp_patch(fs, pc, vl->startpc);[m
[31m-}[m
[31m-[m
[31m-/* Patch goto to close upvalues. */[m
[31m-static void gola_close(LexState *ls, VarInfo *vg)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos pc = vg->startpc;[m
[31m-  BCIns *ip = &fs->bcbase[pc].ins;[m
[31m-  lua_assert(gola_isgoto(vg));[m
[31m-  lua_assert(bc_op(*ip) == BC_JMP || bc_op(*ip) == BC_UCLO);[m
[31m-  setbc_a(ip, vg->slot);[m
[31m-  if (bc_op(*ip) == BC_JMP) {[m
[31m-    BCPos next = jmp_next(fs, pc);[m
[31m-    if (next != NO_JMP) jmp_patch(fs, next, pc);  /* Jump to UCLO. */[m
[31m-    setbc_op(ip, BC_UCLO);  /* Turn into UCLO. */[m
[31m-    setbc_j(ip, NO_JMP);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Resolve pending forward gotos for label. */[m
[31m-static void gola_resolve(LexState *ls, FuncScope *bl, MSize idx)[m
[31m-{[m
[31m-  VarInfo *vg = ls->vstack + bl->vstart;[m
[31m-  VarInfo *vl = ls->vstack + idx;[m
[31m-  for (; vg < vl; vg++)[m
[31m-    if (gcrefeq(vg->name, vl->name) && gola_isgoto(vg)) {[m
[31m-      if (vg->slot < vl->slot) {[m
[31m-	GCstr *name = strref(var_get(ls, ls->fs, vg->slot).name);[m
[31m-	lua_assert((uintptr_t)name >= VARNAME__MAX);[m
[31m-	ls->linenumber = ls->fs->bcbase[vg->startpc].line;[m
[31m-	lua_assert(strref(vg->name) != NAME_BREAK);[m
[31m-	lj_lex_error(ls, 0, LJ_ERR_XGSCOPE,[m
[31m-		     strdata(strref(vg->name)), strdata(name));[m
[31m-      }[m
[31m-      gola_patch(ls, vg, vl);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* Fixup remaining gotos and labels for scope. */[m
[31m-static void gola_fixup(LexState *ls, FuncScope *bl)[m
[31m-{[m
[31m-  VarInfo *v = ls->vstack + bl->vstart;[m
[31m-  VarInfo *ve = ls->vstack + ls->vtop;[m
[31m-  for (; v < ve; v++) {[m
[31m-    GCstr *name = strref(v->name);[m
[31m-    if (name != NULL) {  /* Only consider remaining valid gotos/labels. */[m
[31m-      if (gola_islabel(v)) {[m
[31m-	VarInfo *vg;[m
[31m-	setgcrefnull(v->name);  /* Invalidate label that goes out of scope. */[m
[31m-	for (vg = v+1; vg < ve; vg++)  /* Resolve pending backward gotos. */[m
[31m-	  if (strref(vg->name) == name && gola_isgoto(vg)) {[m
[31m-	    if ((bl->flags&FSCOPE_UPVAL) && vg->slot > v->slot)[m
[31m-	      gola_close(ls, vg);[m
[31m-	    gola_patch(ls, vg, v);[m
[31m-	  }[m
[31m-      } else if (gola_isgoto(v)) {[m
[31m-	if (bl->prev) {  /* Propagate goto or break to outer scope. */[m
[31m-	  bl->prev->flags |= name == NAME_BREAK ? FSCOPE_BREAK : FSCOPE_GOLA;[m
[31m-	  v->slot = bl->nactvar;[m
[31m-	  if ((bl->flags & FSCOPE_UPVAL))[m
[31m-	    gola_close(ls, v);[m
[31m-	} else {  /* No outer scope: undefined goto label or no loop. */[m
[31m-	  ls->linenumber = ls->fs->bcbase[v->startpc].line;[m
[31m-	  if (name == NAME_BREAK)[m
[31m-	    lj_lex_error(ls, 0, LJ_ERR_XBREAK);[m
[31m-	  else[m
[31m-	    lj_lex_error(ls, 0, LJ_ERR_XLUNDEF, strdata(name));[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Find existing label. */[m
[31m-static VarInfo *gola_findlabel(LexState *ls, GCstr *name)[m
[31m-{[m
[31m-  VarInfo *v = ls->vstack + ls->fs->bl->vstart;[m
[31m-  VarInfo *ve = ls->vstack + ls->vtop;[m
[31m-  for (; v < ve; v++)[m
[31m-    if (strref(v->name) == name && gola_islabel(v))[m
[31m-      return v;[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- Scope handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Begin a scope. */[m
[31m-static void fscope_begin(FuncState *fs, FuncScope *bl, int flags)[m
[31m-{[m
[31m-  bl->nactvar = (uint8_t)fs->nactvar;[m
[31m-  bl->flags = flags;[m
[31m-  bl->vstart = fs->ls->vtop;[m
[31m-  bl->prev = fs->bl;[m
[31m-  fs->bl = bl;[m
[31m-  lua_assert(fs->freereg == fs->nactvar);[m
[31m-}[m
[31m-[m
[31m-/* End a scope. */[m
[31m-static void fscope_end(FuncState *fs)[m
[31m-{[m
[31m-  FuncScope *bl = fs->bl;[m
[31m-  LexState *ls = fs->ls;[m
[31m-  fs->bl = bl->prev;[m
[31m-  var_remove(ls, bl->nactvar);[m
[31m-  fs->freereg = fs->nactvar;[m
[31m-  lua_assert(bl->nactvar == fs->nactvar);[m
[31m-  if ((bl->flags & (FSCOPE_UPVAL|FSCOPE_NOCLOSE)) == FSCOPE_UPVAL)[m
[31m-    bcemit_AJ(fs, BC_UCLO, bl->nactvar, 0);[m
[31m-  if ((bl->flags & FSCOPE_BREAK)) {[m
[31m-    if ((bl->flags & FSCOPE_LOOP)) {[m
[31m-      MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc);[m
[31m-      ls->vtop = idx;  /* Drop break label immediately. */[m
[31m-      gola_resolve(ls, bl, idx);[m
[31m-      return;[m
[31m-    }  /* else: need the fixup step to propagate the breaks. */[m
[31m-  } else if (!(bl->flags & FSCOPE_GOLA)) {[m
[31m-    return;[m
[31m-  }[m
[31m-  gola_fixup(ls, bl);[m
[31m-}[m
[31m-[m
[31m-/* Mark scope as having an upvalue. */[m
[31m-static void fscope_uvmark(FuncState *fs, BCReg level)[m
[31m-{[m
[31m-  FuncScope *bl;[m
[31m-  for (bl = fs->bl; bl && bl->nactvar > level; bl = bl->prev)[m
[31m-    ;[m
[31m-  if (bl)[m
[31m-    bl->flags |= FSCOPE_UPVAL;[m
[31m-}[m
[31m-[m
[31m-/* -- Function state management ------------------------------------------- */[m
[31m-[m
[31m-/* Fixup bytecode for prototype. */[m
[31m-static void fs_fixup_bc(FuncState *fs, GCproto *pt, BCIns *bc, MSize n)[m
[31m-{[m
[31m-  BCInsLine *base = fs->bcbase;[m
[31m-  MSize i;[m
[31m-  pt->sizebc = n;[m
[31m-  bc[0] = BCINS_AD((fs->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF,[m
[31m-		   fs->framesize, 0);[m
[31m-  for (i = 1; i < n; i++)[m
[31m-    bc[i] = base[i].ins;[m
[31m-}[m
[31m-[m
[31m-/* Fixup upvalues for child prototype, step #2. */[m
[31m-static void fs_fixup_uv2(FuncState *fs, GCproto *pt)[m
[31m-{[m
[31m-  VarInfo *vstack = fs->ls->vstack;[m
[31m-  uint16_t *uv = proto_uv(pt);[m
[31m-  MSize i, n = pt->sizeuv;[m
[31m-  for (i = 0; i < n; i++) {[m
[31m-    VarIndex vidx = uv[i];[m
[31m-    if (vidx >= LJ_MAX_VSTACK)[m
[31m-      uv[i] = vidx - LJ_MAX_VSTACK;[m
[31m-    else if ((vstack[vidx].info & VSTACK_VAR_RW))[m
[31m-      uv[i] = vstack[vidx].slot | PROTO_UV_LOCAL;[m
[31m-    else[m
[31m-      uv[i] = vstack[vidx].slot | PROTO_UV_LOCAL | PROTO_UV_IMMUTABLE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fixup constants for prototype. */[m
[31m-static void fs_fixup_k(FuncState *fs, GCproto *pt, void *kptr)[m
[31m-{[m
[31m-  GCtab *kt;[m
[31m-  TValue *array;[m
[31m-  Node *node;[m
[31m-  MSize i, hmask;[m
[31m-  checklimitgt(fs, fs->nkn, BCMAX_D+1, "constants");[m
[31m-  checklimitgt(fs, fs->nkgc, BCMAX_D+1, "constants");[m
[31m-  setmref(pt->k, kptr);[m
[31m-  pt->sizekn = fs->nkn;[m
[31m-  pt->sizekgc = fs->nkgc;[m
[31m-  kt = fs->kt;[m
[31m-  array = tvref(kt->array);[m
[31m-  for (i = 0; i < kt->asize; i++)[m
[31m-    if (tvhaskslot(&array[i])) {[m
[31m-      TValue *tv = &((TValue *)kptr)[tvkslot(&array[i])];[m
[31m-      if (LJ_DUALNUM)[m
[31m-	setintV(tv, (int32_t)i);[m
[31m-      else[m
[31m-	setnumV(tv, (lua_Number)i);[m
[31m-    }[m
[31m-  node = noderef(kt->node);[m
[31m-  hmask = kt->hmask;[m
[31m-  for (i = 0; i <= hmask; i++) {[m
[31m-    Node *n = &node[i];[m
[31m-    if (tvhaskslot(&n->val)) {[m
[31m-      ptrdiff_t kidx = (ptrdiff_t)tvkslot(&n->val);[m
[31m-      lua_assert(!tvisint(&n->key));[m
[31m-      if (tvisnum(&n->key)) {[m
[31m-	TValue *tv = &((TValue *)kptr)[kidx];[m
[31m-	if (LJ_DUALNUM) {[m
[31m-	  lua_Number nn = numV(&n->key);[m
[31m-	  int32_t k = lj_num2int(nn);[m
[31m-	  lua_assert(!tvismzero(&n->key));[m
[31m-	  if ((lua_Number)k == nn)[m
[31m-	    setintV(tv, k);[m
[31m-	  else[m
[31m-	    *tv = n->key;[m
[31m-	} else {[m
[31m-	  *tv = n->key;[m
[31m-	}[m
[31m-      } else {[m
[31m-	GCobj *o = gcV(&n->key);[m
[31m-	setgcref(((GCRef *)kptr)[~kidx], o);[m
[31m-	lj_gc_objbarrier(fs->L, pt, o);[m
[31m-	if (tvisproto(&n->key))[m
[31m-	  fs_fixup_uv2(fs, gco2pt(o));[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fixup upvalues for prototype, step #1. */[m
[31m-static void fs_fixup_uv1(FuncState *fs, GCproto *pt, uint16_t *uv)[m
[31m-{[m
[31m-  setmref(pt->uv, uv);[m
[31m-  pt->sizeuv = fs->nuv;[m
[31m-  memcpy(uv, fs->uvtmp, fs->nuv*sizeof(VarIndex));[m
[31m-}[m
[31m-[m
[31m-#ifndef LUAJIT_DISABLE_DEBUGINFO[m
[31m-/* Prepare lineinfo for prototype. */[m
[31m-static size_t fs_prep_line(FuncState *fs, BCLine numline)[m
[31m-{[m
[31m-  return (fs->pc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2);[m
[31m-}[m
[31m-[m
[31m-/* Fixup lineinfo for prototype. */[m
[31m-static void fs_fixup_line(FuncState *fs, GCproto *pt,[m
[31m-			  void *lineinfo, BCLine numline)[m
[31m-{[m
[31m-  BCInsLine *base = fs->bcbase + 1;[m
[31m-  BCLine first = fs->linedefined;[m
[31m-  MSize i = 0, n = fs->pc-1;[m
[31m-  pt->firstline = fs->linedefined;[m
[31m-  pt->numline = numline;[m
[31m-  setmref(pt->lineinfo, lineinfo);[m
[31m-  if (LJ_LIKELY(numline < 256)) {[m
[31m-    uint8_t *li = (uint8_t *)lineinfo;[m
[31m-    do {[m
[31m-      BCLine delta = base[i].line - first;[m
[31m-      lua_assert(delta >= 0 && delta < 256);[m
[31m-      li[i] = (uint8_t)delta;[m
[31m-    } while (++i < n);[m
[31m-  } else if (LJ_LIKELY(numline < 65536)) {[m
[31m-    uint16_t *li = (uint16_t *)lineinfo;[m
[31m-    do {[m
[31m-      BCLine delta = base[i].line - first;[m
[31m-      lua_assert(delta >= 0 && delta < 65536);[m
[31m-      li[i] = (uint16_t)delta;[m
[31m-    } while (++i < n);[m
[31m-  } else {[m
[31m-    uint32_t *li = (uint32_t *)lineinfo;[m
[31m-    do {[m
[31m-      BCLine delta = base[i].line - first;[m
[31m-      lua_assert(delta >= 0);[m
[31m-      li[i] = (uint32_t)delta;[m
[31m-    } while (++i < n);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Prepare variable info for prototype. */[m
[31m-static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar)[m
[31m-{[m
[31m-  VarInfo *vs =ls->vstack, *ve;[m
[31m-  MSize i, n;[m
[31m-  BCPos lastpc;[m
[31m-  lj_buf_reset(&ls->sb);  /* Copy to temp. string buffer. */[m
[31m-  /* Store upvalue names. */[m
[31m-  for (i = 0, n = fs->nuv; i < n; i++) {[m
[31m-    GCstr *s = strref(vs[fs->uvmap[i]].name);[m
[31m-    MSize len = s->len+1;[m
[31m-    char *p = lj_buf_more(&ls->sb, len);[m
[31m-    p = lj_buf_wmem(p, strdata(s), len);[m
[31m-    setsbufP(&ls->sb, p);[m
[31m-  }[m
[31m-  *ofsvar = sbuflen(&ls->sb);[m
[31m-  lastpc = 0;[m
[31m-  /* Store local variable names and compressed ranges. */[m
[31m-  for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) {[m
[31m-    if (!gola_isgotolabel(vs)) {[m
[31m-      GCstr *s = strref(vs->name);[m
[31m-      BCPos startpc;[m
[31m-      char *p;[m
[31m-      if ((uintptr_t)s < VARNAME__MAX) {[m
[31m-	p = lj_buf_more(&ls->sb, 1 + 2*5);[m
[31m-	*p++ = (char)(uintptr_t)s;[m
[31m-      } else {[m
[31m-	MSize len = s->len+1;[m
[31m-	p = lj_buf_more(&ls->sb, len + 2*5);[m
[31m-	p = lj_buf_wmem(p, strdata(s), len);[m
[31m-      }[m
[31m-      startpc = vs->startpc;[m
[31m-      p = lj_strfmt_wuleb128(p, startpc-lastpc);[m
[31m-      p = lj_strfmt_wuleb128(p, vs->endpc-startpc);[m
[31m-      setsbufP(&ls->sb, p);[m
[31m-      lastpc = startpc;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_buf_putb(&ls->sb, '\0');  /* Terminator for varinfo. */[m
[31m-  return sbuflen(&ls->sb);[m
[31m-}[m
[31m-[m
[31m-/* Fixup variable info for prototype. */[m
[31m-static void fs_fixup_var(LexState *ls, GCproto *pt, uint8_t *p, size_t ofsvar)[m
[31m-{[m
[31m-  setmref(pt->uvinfo, p);[m
[31m-  setmref(pt->varinfo, (char *)p + ofsvar);[m
[31m-  memcpy(p, sbufB(&ls->sb), sbuflen(&ls->sb));  /* Copy from temp. buffer. */[m
[31m-}[m
[31m-#else[m
[31m-[m
[31m-/* Initialize with empty debug info, if disabled. */[m
[31m-#define fs_prep_line(fs, numline)		(UNUSED(numline), 0)[m
[31m-#define fs_fixup_line(fs, pt, li, numline) \[m
[31m-  pt->firstline = pt->numline = 0, setmref((pt)->lineinfo, NULL)[m
[31m-#define fs_prep_var(ls, fs, ofsvar)		(UNUSED(ofsvar), 0)[m
[31m-#define fs_fixup_var(ls, pt, p, ofsvar) \[m
[31m-  setmref((pt)->uvinfo, NULL), setmref((pt)->varinfo, NULL)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Check if bytecode op returns. */[m
[31m-static int bcopisret(BCOp op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case BC_CALLMT: case BC_CALLT:[m
[31m-  case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-    return 1;[m
[31m-  default:[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Fixup return instruction for prototype. */[m
[31m-static void fs_fixup_ret(FuncState *fs)[m
[31m-{[m
[31m-  BCPos lastpc = fs->pc;[m
[31m-  if (lastpc <= fs->lasttarget || !bcopisret(bc_op(fs->bcbase[lastpc-1].ins))) {[m
[31m-    if ((fs->bl->flags & FSCOPE_UPVAL))[m
[31m-      bcemit_AJ(fs, BC_UCLO, 0, 0);[m
[31m-    bcemit_AD(fs, BC_RET0, 0, 1);  /* Need final return. */[m
[31m-  }[m
[31m-  fs->bl->flags |= FSCOPE_NOCLOSE;  /* Handled above. */[m
[31m-  fscope_end(fs);[m
[31m-  lua_assert(fs->bl == NULL);[m
[31m-  /* May need to fixup returns encoded before first function was created. */[m
[31m-  if (fs->flags & PROTO_FIXUP_RETURN) {[m
[31m-    BCPos pc;[m
[31m-    for (pc = 1; pc < lastpc; pc++) {[m
[31m-      BCIns ins = fs->bcbase[pc].ins;[m
[31m-      BCPos offset;[m
[31m-      switch (bc_op(ins)) {[m
[31m-      case BC_CALLMT: case BC_CALLT:[m
[31m-      case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-	offset = bcemit_INS(fs, ins);  /* Copy original instruction. */[m
[31m-	fs->bcbase[offset].line = fs->bcbase[pc].line;[m
[31m-	offset = offset-(pc+1)+BCBIAS_J;[m
[31m-	if (offset > BCMAX_D)[m
[31m-	  err_syntax(fs->ls, LJ_ERR_XFIXUP);[m
[31m-	/* Replace with UCLO plus branch. */[m
[31m-	fs->bcbase[pc].ins = BCINS_AD(BC_UCLO, 0, offset);[m
[31m-	break;[m
[31m-      case BC_UCLO:[m
[31m-	return;  /* We're done. */[m
[31m-      default:[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Finish a FuncState and return the new prototype. */[m
[31m-static GCproto *fs_finish(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  lua_State *L = ls->L;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCLine numline = line - fs->linedefined;[m
[31m-  size_t sizept, ofsk, ofsuv, ofsli, ofsdbg, ofsvar;[m
[31m-  GCproto *pt;[m
[31m-[m
[31m-  /* Apply final fixups. */[m
[31m-  fs_fixup_ret(fs);[m
[31m-[m
[31m-  /* Calculate total size of prototype including all colocated arrays. */[m
[31m-  sizept = sizeof(GCproto) + fs->pc*sizeof(BCIns) + fs->nkgc*sizeof(GCRef);[m
[31m-  sizept = (sizept + sizeof(TValue)-1) & ~(sizeof(TValue)-1);[m
[31m-  ofsk = sizept; sizept += fs->nkn*sizeof(TValue);[m
[31m-  ofsuv = sizept; sizept += ((fs->nuv+1)&~1)*2;[m
[31m-  ofsli = sizept; sizept += fs_prep_line(fs, numline);[m
[31m-  ofsdbg = sizept; sizept += fs_prep_var(ls, fs, &ofsvar);[m
[31m-[m
[31m-  /* Allocate prototype and initialize its fields. */[m
[31m-  pt = (GCproto *)lj_mem_newgco(L, (MSize)sizept);[m
[31m-  pt->gct = ~LJ_TPROTO;[m
[31m-  pt->sizept = (MSize)sizept;[m
[31m-  pt->trace = 0;[m
[31m-  pt->flags = (uint8_t)(fs->flags & ~(PROTO_HAS_RETURN|PROTO_FIXUP_RETURN));[m
[31m-  pt->numparams = fs->numparams;[m
[31m-  pt->framesize = fs->framesize;[m
[31m-  setgcref(pt->chunkname, obj2gco(ls->chunkname));[m
[31m-[m
[31m-  /* Close potentially uninitialized gap between bc and kgc. */[m
[31m-  *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(fs->nkgc+1)) = 0;[m
[31m-  fs_fixup_bc(fs, pt, (BCIns *)((char *)pt + sizeof(GCproto)), fs->pc);[m
[31m-  fs_fixup_k(fs, pt, (void *)((char *)pt + ofsk));[m
[31m-  fs_fixup_uv1(fs, pt, (uint16_t *)((char *)pt + ofsuv));[m
[31m-  fs_fixup_line(fs, pt, (void *)((char *)pt + ofsli), numline);[m
[31m-  fs_fixup_var(ls, pt, (uint8_t *)((char *)pt + ofsdbg), ofsvar);[m
[31m-[m
[31m-  lj_vmevent_send(L, BC,[m
[31m-    setprotoV(L, L->top++, pt);[m
[31m-  );[m
[31m-[m
[31m-  L->top--;  /* Pop table of constants. */[m
[31m-  ls->vtop = fs->vbase;  /* Reset variable stack. */[m
[31m-  ls->fs = fs->prev;[m
[31m-  lua_assert(ls->fs != NULL || ls->tok == TK_eof);[m
[31m-  return pt;[m
[31m-}[m
[31m-[m
[31m-/* Initialize a new FuncState. */[m
[31m-static void fs_init(LexState *ls, FuncState *fs)[m
[31m-{[m
[31m-  lua_State *L = ls->L;[m
[31m-  fs->prev = ls->fs; ls->fs = fs;  /* Append to list. */[m
[31m-  fs->ls = ls;[m
[31m-  fs->vbase = ls->vtop;[m
[31m-  fs->L = L;[m
[31m-  fs->pc = 0;[m
[31m-  fs->lasttarget = 0;[m
[31m-  fs->jpc = NO_JMP;[m
[31m-  fs->freereg = 0;[m
[31m-  fs->nkgc = 0;[m
[31m-  fs->nkn = 0;[m
[31m-  fs->nactvar = 0;[m
[31m-  fs->nuv = 0;[m
[31m-  fs->bl = NULL;[m
[31m-  fs->flags = 0;[m
[31m-  fs->framesize = 1;  /* Minimum frame size. */[m
[31m-  fs->kt = lj_tab_new(L, 0, 0);[m
[31m-  /* Anchor table of constants in stack to avoid being collected. */[m
[31m-  settabV(L, L->top, fs->kt);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-/* -- Expressions --------------------------------------------------------- */[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static void expr(LexState *ls, ExpDesc *v);[m
[31m-[m
[31m-/* Return string expression. */[m
[31m-static void expr_str(LexState *ls, ExpDesc *e)[m
[31m-{[m
[31m-  expr_init(e, VKSTR, 0);[m
[31m-  e->u.sval = lex_str(ls);[m
[31m-}[m
[31m-[m
[31m-/* Return index expression. */[m
[31m-static void expr_index(FuncState *fs, ExpDesc *t, ExpDesc *e)[m
[31m-{[m
[31m-  /* Already called: expr_toval(fs, e). */[m
[31m-  t->k = VINDEXED;[m
[31m-  if (expr_isnumk(e)) {[m
[31m-#if LJ_DUALNUM[m
[31m-    if (tvisint(expr_numtv(e))) {[m
[31m-      int32_t k = intV(expr_numtv(e));[m
[31m-      if (checku8(k)) {[m
[31m-	t->u.s.aux = BCMAX_C+1+(uint32_t)k;  /* 256..511: const byte key */[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-#else[m
[31m-    lua_Number n = expr_numberV(e);[m
[31m-    int32_t k = lj_num2int(n);[m
[31m-    if (checku8(k) && n == (lua_Number)k) {[m
[31m-      t->u.s.aux = BCMAX_C+1+(uint32_t)k;  /* 256..511: const byte key */[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-  } else if (expr_isstrk(e)) {[m
[31m-    BCReg idx = const_str(fs, e);[m
[31m-    if (idx <= BCMAX_C) {[m
[31m-      t->u.s.aux = ~idx;  /* -256..-1: const string key */[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  t->u.s.aux = expr_toanyreg(fs, e);  /* 0..255: register */[m
[31m-}[m
[31m-[m
[31m-/* Parse index expression with named field. */[m
[31m-static void expr_field(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  ExpDesc key;[m
[31m-  expr_toanyreg(fs, v);[m
[31m-  lj_lex_next(ls);  /* Skip dot or colon. */[m
[31m-  expr_str(ls, &key);[m
[31m-  expr_index(fs, v, &key);[m
[31m-}[m
[31m-[m
[31m-/* Parse index expression with brackets. */[m
[31m-static void expr_bracket(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  lj_lex_next(ls);  /* Skip '['. */[m
[31m-  expr(ls, v);[m
[31m-  expr_toval(ls->fs, v);[m
[31m-  lex_check(ls, ']');[m
[31m-}[m
[31m-[m
[31m-/* Get value of constant expression. */[m
[31m-static void expr_kvalue(TValue *v, ExpDesc *e)[m
[31m-{[m
[31m-  if (e->k <= VKTRUE) {[m
[31m-    setpriV(v, ~(uint32_t)e->k);[m
[31m-  } else if (e->k == VKSTR) {[m
[31m-    setgcVraw(v, obj2gco(e->u.sval), LJ_TSTR);[m
[31m-  } else {[m
[31m-    lua_assert(tvisnumber(expr_numtv(e)));[m
[31m-    *v = *expr_numtv(e);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse table constructor expression. */[m
[31m-static void expr_table(LexState *ls, ExpDesc *e)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCLine line = ls->linenumber;[m
[31m-  GCtab *t = NULL;[m
[31m-  int vcall = 0, needarr = 0, fixt = 0;[m
[31m-  uint32_t narr = 1;  /* First array index. */[m
[31m-  uint32_t nhash = 0;  /* Number of hash entries. */[m
[31m-  BCReg freg = fs->freereg;[m
[31m-  BCPos pc = bcemit_AD(fs, BC_TNEW, freg, 0);[m
[31m-  expr_init(e, VNONRELOC, freg);[m
[31m-  bcreg_reserve(fs, 1);[m
[31m-  freg++;[m
[31m-  lex_check(ls, '{');[m
[31m-  while (ls->tok != '}') {[m
[31m-    ExpDesc key, val;[m
[31m-    vcall = 0;[m
[31m-    if (ls->tok == '[') {[m
[31m-      expr_bracket(ls, &key);  /* Already calls expr_toval. */[m
[31m-      if (!expr_isk(&key)) expr_index(fs, e, &key);[m
[31m-      if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++;[m
[31m-      lex_check(ls, '=');[m
[31m-    } else if ((ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) &&[m
[31m-	       lj_lex_lookahead(ls) == '=') {[m
[31m-      expr_str(ls, &key);[m
[31m-      lex_check(ls, '=');[m
[31m-      nhash++;[m
[31m-    } else {[m
[31m-      expr_init(&key, VKNUM, 0);[m
[31m-      setintV(&key.u.nval, (int)narr);[m
[31m-      narr++;[m
[31m-      needarr = vcall = 1;[m
[31m-    }[m
[31m-    expr(ls, &val);[m
[31m-    if (expr_isk(&key) && key.k != VKNIL &&[m
[31m-	(key.k == VKSTR || expr_isk_nojump(&val))) {[m
[31m-      TValue k, *v;[m
[31m-      if (!t) {  /* Create template table on demand. */[m
[31m-	BCReg kidx;[m
[31m-	t = lj_tab_new(fs->L, needarr ? narr : 0, hsize2hbits(nhash));[m
[31m-	kidx = const_gc(fs, obj2gco(t), LJ_TTAB);[m
[31m-	fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx);[m
[31m-      }[m
[31m-      vcall = 0;[m
[31m-      expr_kvalue(&k, &key);[m
[31m-      v = lj_tab_set(fs->L, t, &k);[m
[31m-      lj_gc_anybarriert(fs->L, t);[m
[31m-      if (expr_isk_nojump(&val)) {  /* Add const key/value to template table. */[m
[31m-	expr_kvalue(v, &val);[m
[31m-      } else {  /* Otherwise create dummy string key (avoids lj_tab_newkey). */[m
[31m-	settabV(fs->L, v, t);  /* Preserve key with table itself as value. */[m
[31m-	fixt = 1;   /* Fix this later, after all resizes. */[m
[31m-	goto nonconst;[m
[31m-      }[m
[31m-    } else {[m
[31m-    nonconst:[m
[31m-      if (val.k != VCALL) { expr_toanyreg(fs, &val); vcall = 0; }[m
[31m-      if (expr_isk(&key)) expr_index(fs, e, &key);[m
[31m-      bcemit_store(fs, e, &val);[m
[31m-    }[m
[31m-    fs->freereg = freg;[m
[31m-    if (!lex_opt(ls, ',') && !lex_opt(ls, ';')) break;[m
[31m-  }[m
[31m-  lex_match(ls, '}', '{', line);[m
[31m-  if (vcall) {[m
[31m-    BCInsLine *ilp = &fs->bcbase[fs->pc-1];[m
[31m-    ExpDesc en;[m
[31m-    lua_assert(bc_a(ilp->ins) == freg &&[m
[31m-	       bc_op(ilp->ins) == (narr > 256 ? BC_TSETV : BC_TSETB));[m
[31m-    expr_init(&en, VKNUM, 0);[m
[31m-    en.u.nval.u32.lo = narr-1;[m
[31m-    en.u.nval.u32.hi = 0x43300000;  /* Biased integer to avoid denormals. */[m
[31m-    if (narr > 256) { fs->pc--; ilp--; }[m
[31m-    ilp->ins = BCINS_AD(BC_TSETM, freg, const_num(fs, &en));[m
[31m-    setbc_b(&ilp[-1].ins, 0);[m
[31m-  }[m
[31m-  if (pc == fs->pc-1) {  /* Make expr relocable if possible. */[m
[31m-    e->u.s.info = pc;[m
[31m-    fs->freereg--;[m
[31m-    e->k = VRELOCABLE;[m
[31m-  } else {[m
[31m-    e->k = VNONRELOC;  /* May have been changed by expr_index. */[m
[31m-  }[m
[31m-  if (!t) {  /* Construct TNEW RD: hhhhhaaaaaaaaaaa. */[m
[31m-    BCIns *ip = &fs->bcbase[pc].ins;[m
[31m-    if (!needarr) narr = 0;[m
[31m-    else if (narr < 3) narr = 3;[m
[31m-    else if (narr > 0x7ff) narr = 0x7ff;[m
[31m-    setbc_d(ip, narr|(hsize2hbits(nhash)<<11));[m
[31m-  } else {[m
[31m-    if (needarr && t->asize < narr)[m
[31m-      lj_tab_reasize(fs->L, t, narr-1);[m
[31m-    if (fixt) {  /* Fix value for dummy keys in template table. */[m
[31m-      Node *node = noderef(t->node);[m
[31m-      uint32_t i, hmask = t->hmask;[m
[31m-      for (i = 0; i <= hmask; i++) {[m
[31m-	Node *n = &node[i];[m
[31m-	if (tvistab(&n->val)) {[m
[31m-	  lua_assert(tabV(&n->val) == t);[m
[31m-	  setnilV(&n->val);  /* Turn value into nil. */[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    lj_gc_check(fs->L);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse function parameters. */[m
[31m-static BCReg parse_params(LexState *ls, int needself)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCReg nparams = 0;[m
[31m-  lex_check(ls, '(');[m
[31m-  if (needself)[m
[31m-    var_new_lit(ls, nparams++, "self");[m
[31m-  if (ls->tok != ')') {[m
[31m-    do {[m
[31m-      if (ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) {[m
[31m-	var_new(ls, nparams++, lex_str(ls));[m
[31m-      } else if (ls->tok == TK_dots) {[m
[31m-	lj_lex_next(ls);[m
[31m-	fs->flags |= PROTO_VARARG;[m
[31m-	break;[m
[31m-      } else {[m
[31m-	err_syntax(ls, LJ_ERR_XPARAM);[m
[31m-      }[m
[31m-    } while (lex_opt(ls, ','));[m
[31m-  }[m
[31m-  var_add(ls, nparams);[m
[31m-  lua_assert(fs->nactvar == nparams);[m
[31m-  bcreg_reserve(fs, nparams);[m
[31m-  lex_check(ls, ')');[m
[31m-  return nparams;[m
[31m-}[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static void parse_chunk(LexState *ls);[m
[31m-[m
[31m-/* Parse body of a function. */[m
[31m-static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line)[m
[31m-{[m
[31m-  FuncState fs, *pfs = ls->fs;[m
[31m-  FuncScope bl;[m
[31m-  GCproto *pt;[m
[31m-  ptrdiff_t oldbase = pfs->bcbase - ls->bcstack;[m
[31m-  fs_init(ls, &fs);[m
[31m-  fscope_begin(&fs, &bl, 0);[m
[31m-  fs.linedefined = line;[m
[31m-  fs.numparams = (uint8_t)parse_params(ls, needself);[m
[31m-  fs.bcbase = pfs->bcbase + pfs->pc;[m
[31m-  fs.bclim = pfs->bclim - pfs->pc;[m
[31m-  bcemit_AD(&fs, BC_FUNCF, 0, 0);  /* Placeholder. */[m
[31m-  parse_chunk(ls);[m
[31m-  if (ls->tok != TK_end) lex_match(ls, TK_end, TK_function, line);[m
[31m-  pt = fs_finish(ls, (ls->lastline = ls->linenumber));[m
[31m-  pfs->bcbase = ls->bcstack + oldbase;  /* May have been reallocated. */[m
[31m-  pfs->bclim = (BCPos)(ls->sizebcstack - oldbase);[m
[31m-  /* Store new prototype in the constant array of the parent. */[m
[31m-  expr_init(e, VRELOCABLE,[m
[31m-	    bcemit_AD(pfs, BC_FNEW, 0, const_gc(pfs, obj2gco(pt), LJ_TPROTO)));[m
[31m-#if LJ_HASFFI[m
[31m-  pfs->flags |= (fs.flags & PROTO_FFI);[m
[31m-#endif[m
[31m-  if (!(pfs->flags & PROTO_CHILD)) {[m
[31m-    if (pfs->flags & PROTO_HAS_RETURN)[m
[31m-      pfs->flags |= PROTO_FIXUP_RETURN;[m
[31m-    pfs->flags |= PROTO_CHILD;[m
[31m-  }[m
[31m-  lj_lex_next(ls);[m
[31m-}[m
[31m-[m
[31m-/* Parse expression list. Last expression is left open. */[m
[31m-static BCReg expr_list(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  BCReg n = 1;[m
[31m-  expr(ls, v);[m
[31m-  while (lex_opt(ls, ',')) {[m
[31m-    expr_tonextreg(ls->fs, v);[m
[31m-    expr(ls, v);[m
[31m-    n++;[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-/* Parse function argument list. */[m
[31m-static void parse_args(LexState *ls, ExpDesc *e)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  ExpDesc args;[m
[31m-  BCIns ins;[m
[31m-  BCReg base;[m
[31m-  BCLine line = ls->linenumber;[m
[31m-  if (ls->tok == '(') {[m
[31m-#if !LJ_52[m
[31m-    if (line != ls->lastline)[m
[31m-      err_syntax(ls, LJ_ERR_XAMBIG);[m
[31m-#endif[m
[31m-    lj_lex_next(ls);[m
[31m-    if (ls->tok == ')') {  /* f(). */[m
[31m-      args.k = VVOID;[m
[31m-    } else {[m
[31m-      expr_list(ls, &args);[m
[31m-      if (args.k == VCALL)  /* f(a, b, g()) or f(a, b, ...). */[m
[31m-	setbc_b(bcptr(fs, &args), 0);  /* Pass on multiple results. */[m
[31m-    }[m
[31m-    lex_match(ls, ')', '(', line);[m
[31m-  } else if (ls->tok == '{') {[m
[31m-    expr_table(ls, &args);[m
[31m-  } else if (ls->tok == TK_string) {[m
[31m-    expr_init(&args, VKSTR, 0);[m
[31m-    args.u.sval = strV(&ls->tokval);[m
[31m-    lj_lex_next(ls);[m
[31m-  } else {[m
[31m-    err_syntax(ls, LJ_ERR_XFUNARG);[m
[31m-    return;  /* Silence compiler. */[m
[31m-  }[m
[31m-  lua_assert(e->k == VNONRELOC);[m
[31m-  base = e->u.s.info;  /* Base register for call. */[m
[31m-  if (args.k == VCALL) {[m
[31m-    ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1 - LJ_FR2);[m
[31m-  } else {[m
[31m-    if (args.k != VVOID)[m
[31m-      expr_tonextreg(fs, &args);[m
[31m-    ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base - LJ_FR2);[m
[31m-  }[m
[31m-  expr_init(e, VCALL, bcemit_INS(fs, ins));[m
[31m-  e->u.s.aux = base;[m
[31m-  fs->bcbase[fs->pc - 1].line = line;[m
[31m-  fs->freereg = base+1;  /* Leave one result by default. */[m
[31m-}[m
[31m-[m
[31m-/* Parse primary expression. */[m
[31m-static void expr_primary(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  /* Parse prefix expression. */[m
[31m-  if (ls->tok == '(') {[m
[31m-    BCLine line = ls->linenumber;[m
[31m-    lj_lex_next(ls);[m
[31m-    expr(ls, v);[m
[31m-    lex_match(ls, ')', '(', line);[m
[31m-    expr_discharge(ls->fs, v);[m
[31m-  } else if (ls->tok == TK_name || (!LJ_52 && ls->tok == TK_goto)) {[m
[31m-    var_lookup(ls, v);[m
[31m-  } else {[m
[31m-    err_syntax(ls, LJ_ERR_XSYMBOL);[m
[31m-  }[m
[31m-  for (;;) {  /* Parse multiple expression suffixes. */[m
[31m-    if (ls->tok == '.') {[m
[31m-      expr_field(ls, v);[m
[31m-    } else if (ls->tok == '[') {[m
[31m-      ExpDesc key;[m
[31m-      expr_toanyreg(fs, v);[m
[31m-      expr_bracket(ls, &key);[m
[31m-      expr_index(fs, v, &key);[m
[31m-    } else if (ls->tok == ':') {[m
[31m-      ExpDesc key;[m
[31m-      lj_lex_next(ls);[m
[31m-      expr_str(ls, &key);[m
[31m-      bcemit_method(fs, v, &key);[m
[31m-      parse_args(ls, v);[m
[31m-    } else if (ls->tok == '(' || ls->tok == TK_string || ls->tok == '{') {[m
[31m-      expr_tonextreg(fs, v);[m
[31m-      if (LJ_FR2) bcreg_reserve(fs, 1);[m
[31m-      parse_args(ls, v);[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse simple expression. */[m
[31m-static void expr_simple(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  switch (ls->tok) {[m
[31m-  case TK_number:[m
[31m-    expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokval)) ? VKCDATA : VKNUM, 0);[m
[31m-    copyTV(ls->L, &v->u.nval, &ls->tokval);[m
[31m-    break;[m
[31m-  case TK_string:[m
[31m-    expr_init(v, VKSTR, 0);[m
[31m-    v->u.sval = strV(&ls->tokval);[m
[31m-    break;[m
[31m-  case TK_nil:[m
[31m-    expr_init(v, VKNIL, 0);[m
[31m-    break;[m
[31m-  case TK_true:[m
[31m-    expr_init(v, VKTRUE, 0);[m
[31m-    break;[m
[31m-  case TK_false:[m
[31m-    expr_init(v, VKFALSE, 0);[m
[31m-    break;[m
[31m-  case TK_dots: {  /* Vararg. */[m
[31m-    FuncState *fs = ls->fs;[m
[31m-    BCReg base;[m
[31m-    checkcond(ls, fs->flags & PROTO_VARARG, LJ_ERR_XDOTS);[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-    base = fs->freereg-1;[m
[31m-    expr_init(v, VCALL, bcemit_ABC(fs, BC_VARG, base, 2, fs->numparams));[m
[31m-    v->u.s.aux = base;[m
[31m-    break;[m
[31m-  }[m
[31m-  case '{':  /* Table constructor. */[m
[31m-    expr_table(ls, v);[m
[31m-    return;[m
[31m-  case TK_function:[m
[31m-    lj_lex_next(ls);[m
[31m-    parse_body(ls, v, 0, ls->linenumber);[m
[31m-    return;[m
[31m-  default:[m
[31m-    expr_primary(ls, v);[m
[31m-    return;[m
[31m-  }[m
[31m-  lj_lex_next(ls);[m
[31m-}[m
[31m-[m
[31m-/* Manage syntactic levels to avoid blowing up the stack. */[m
[31m-static void synlevel_begin(LexState *ls)[m
[31m-{[m
[31m-  if (++ls->level >= LJ_MAX_XLEVEL)[m
[31m-    lj_lex_error(ls, 0, LJ_ERR_XLEVELS);[m
[31m-}[m
[31m-[m
[31m-#define synlevel_end(ls)	((ls)->level--)[m
[31m-[m
[31m-/* Convert token to binary operator. */[m
[31m-static BinOpr token2binop(LexToken tok)[m
[31m-{[m
[31m-  switch (tok) {[m
[31m-  case '+':	return OPR_ADD;[m
[31m-  case '-':	return OPR_SUB;[m
[31m-  case '*':	return OPR_MUL;[m
[31m-  case '/':	return OPR_DIV;[m
[31m-  case '%':	return OPR_MOD;[m
[31m-  case '^':	return OPR_POW;[m
[31m-  case TK_concat: return OPR_CONCAT;[m
[31m-  case TK_ne:	return OPR_NE;[m
[31m-  case TK_eq:	return OPR_EQ;[m
[31m-  case '<':	return OPR_LT;[m
[31m-  case TK_le:	return OPR_LE;[m
[31m-  case '>':	return OPR_GT;[m
[31m-  case TK_ge:	return OPR_GE;[m
[31m-  case TK_and:	return OPR_AND;[m
[31m-  case TK_or:	return OPR_OR;[m
[31m-  default:	return OPR_NOBINOPR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Priorities for each binary operator. ORDER OPR. */[m
[31m-static const struct {[m
[31m-  uint8_t left;		/* Left priority. */[m
[31m-  uint8_t right;	/* Right priority. */[m
[31m-} priority[] = {[m
[31m-  {6,6}, {6,6}, {7,7}, {7,7}, {7,7},	/* ADD SUB MUL DIV MOD */[m
[31m-  {10,9}, {5,4},			/* POW CONCAT (right associative) */[m
[31m-  {3,3}, {3,3},				/* EQ NE */[m
[31m-  {3,3}, {3,3}, {3,3}, {3,3},		/* LT GE GT LE */[m
[31m-  {2,2}, {1,1}				/* AND OR */[m
[31m-};[m
[31m-[m
[31m-#define UNARY_PRIORITY		8  /* Priority for unary operators. */[m
[31m-[m
[31m-/* Forward declaration. */[m
[31m-static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit);[m
[31m-[m
[31m-/* Parse unary expression. */[m
[31m-static void expr_unop(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  BCOp op;[m
[31m-  if (ls->tok == TK_not) {[m
[31m-    op = BC_NOT;[m
[31m-  } else if (ls->tok == '-') {[m
[31m-    op = BC_UNM;[m
[31m-  } else if (ls->tok == '#') {[m
[31m-    op = BC_LEN;[m
[31m-  } else {[m
[31m-    expr_simple(ls, v);[m
[31m-    return;[m
[31m-  }[m
[31m-  lj_lex_next(ls);[m
[31m-  expr_binop(ls, v, UNARY_PRIORITY);[m
[31m-  bcemit_unop(ls->fs, op, v);[m
[31m-}[m
[31m-[m
[31m-/* Parse binary expressions with priority higher than the limit. */[m
[31m-static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit)[m
[31m-{[m
[31m-  BinOpr op;[m
[31m-  synlevel_begin(ls);[m
[31m-  expr_unop(ls, v);[m
[31m-  op = token2binop(ls->tok);[m
[31m-  while (op != OPR_NOBINOPR && priority[op].left > limit) {[m
[31m-    ExpDesc v2;[m
[31m-    BinOpr nextop;[m
[31m-    lj_lex_next(ls);[m
[31m-    bcemit_binop_left(ls->fs, op, v);[m
[31m-    /* Parse binary expression with higher priority. */[m
[31m-    nextop = expr_binop(ls, &v2, priority[op].right);[m
[31m-    bcemit_binop(ls->fs, op, v, &v2);[m
[31m-    op = nextop;[m
[31m-  }[m
[31m-  synlevel_end(ls);[m
[31m-  return op;  /* Return unconsumed binary operator (if any). */[m
[31m-}[m
[31m-[m
[31m-/* Parse expression. */[m
[31m-static void expr(LexState *ls, ExpDesc *v)[m
[31m-{[m
[31m-  expr_binop(ls, v, 0);  /* Priority 0: parse whole expression. */[m
[31m-}[m
[31m-[m
[31m-/* Assign expression to the next register. */[m
[31m-static void expr_next(LexState *ls)[m
[31m-{[m
[31m-  ExpDesc e;[m
[31m-  expr(ls, &e);[m
[31m-  expr_tonextreg(ls->fs, &e);[m
[31m-}[m
[31m-[m
[31m-/* Parse conditional expression. */[m
[31m-static BCPos expr_cond(LexState *ls)[m
[31m-{[m
[31m-  ExpDesc v;[m
[31m-  expr(ls, &v);[m
[31m-  if (v.k == VKNIL) v.k = VKFALSE;[m
[31m-  bcemit_branch_t(ls->fs, &v);[m
[31m-  return v.f;[m
[31m-}[m
[31m-[m
[31m-/* -- Assignments --------------------------------------------------------- */[m
[31m-[m
[31m-/* List of LHS variables. */[m
[31m-typedef struct LHSVarList {[m
[31m-  ExpDesc v;			/* LHS variable. */[m
[31m-  struct LHSVarList *prev;	/* Link to previous LHS variable. */[m
[31m-} LHSVarList;[m
[31m-[m
[31m-/* Eliminate write-after-read hazards for local variable assignment. */[m
[31m-static void assign_hazard(LexState *ls, LHSVarList *lh, const ExpDesc *v)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCReg reg = v->u.s.info;  /* Check against this variable. */[m
[31m-  BCReg tmp = fs->freereg;  /* Rename to this temp. register (if needed). */[m
[31m-  int hazard = 0;[m
[31m-  for (; lh; lh = lh->prev) {[m
[31m-    if (lh->v.k == VINDEXED) {[m
[31m-      if (lh->v.u.s.info == reg) {  /* t[i], t = 1, 2 */[m
[31m-	hazard = 1;[m
[31m-	lh->v.u.s.info = tmp;[m
[31m-      }[m
[31m-      if (lh->v.u.s.aux == reg) {  /* t[i], i = 1, 2 */[m
[31m-	hazard = 1;[m
[31m-	lh->v.u.s.aux = tmp;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (hazard) {[m
[31m-    bcemit_AD(fs, BC_MOV, tmp, reg);  /* Rename conflicting variable. */[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Adjust LHS/RHS of an assignment. */[m
[31m-static void assign_adjust(LexState *ls, BCReg nvars, BCReg nexps, ExpDesc *e)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int32_t extra = (int32_t)nvars - (int32_t)nexps;[m
[31m-  if (e->k == VCALL) {[m
[31m-    extra++;  /* Compensate for the VCALL itself. */[m
[31m-    if (extra < 0) extra = 0;[m
[31m-    setbc_b(bcptr(fs, e), extra+1);  /* Fixup call results. */[m
[31m-    if (extra > 1) bcreg_reserve(fs, (BCReg)extra-1);[m
[31m-  } else {[m
[31m-    if (e->k != VVOID)[m
[31m-      expr_tonextreg(fs, e);  /* Close last expression. */[m
[31m-    if (extra > 0) {  /* Leftover LHS are set to nil. */[m
[31m-      BCReg reg = fs->freereg;[m
[31m-      bcreg_reserve(fs, (BCReg)extra);[m
[31m-      bcemit_nil(fs, reg, (BCReg)extra);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Recursively parse assignment statement. */[m
[31m-static void parse_assignment(LexState *ls, LHSVarList *lh, BCReg nvars)[m
[31m-{[m
[31m-  ExpDesc e;[m
[31m-  checkcond(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, LJ_ERR_XSYNTAX);[m
[31m-  if (lex_opt(ls, ',')) {  /* Collect LHS list and recurse upwards. */[m
[31m-    LHSVarList vl;[m
[31m-    vl.prev = lh;[m
[31m-    expr_primary(ls, &vl.v);[m
[31m-    if (vl.v.k == VLOCAL)[m
[31m-      assign_hazard(ls, lh, &vl.v);[m
[31m-    checklimit(ls->fs, ls->level + nvars, LJ_MAX_XLEVEL, "variable names");[m
[31m-    parse_assignment(ls, &vl, nvars+1);[m
[31m-  } else {  /* Parse RHS. */[m
[31m-    BCReg nexps;[m
[31m-    lex_check(ls, '=');[m
[31m-    nexps = expr_list(ls, &e);[m
[31m-    if (nexps == nvars) {[m
[31m-      if (e.k == VCALL) {[m
[31m-	if (bc_op(*bcptr(ls->fs, &e)) == BC_VARG) {  /* Vararg assignment. */[m
[31m-	  ls->fs->freereg--;[m
[31m-	  e.k = VRELOCABLE;[m
[31m-	} else {  /* Multiple call results. */[m
[31m-	  e.u.s.info = e.u.s.aux;  /* Base of call is not relocatable. */[m
[31m-	  e.k = VNONRELOC;[m
[31m-	}[m
[31m-      }[m
[31m-      bcemit_store(ls->fs, &lh->v, &e);[m
[31m-      return;[m
[31m-    }[m
[31m-    assign_adjust(ls, nvars, nexps, &e);[m
[31m-    if (nexps > nvars)[m
[31m-      ls->fs->freereg -= nexps - nvars;  /* Drop leftover regs. */[m
[31m-  }[m
[31m-  /* Assign RHS to LHS and recurse downwards. */[m
[31m-  expr_init(&e, VNONRELOC, ls->fs->freereg-1);[m
[31m-  bcemit_store(ls->fs, &lh->v, &e);[m
[31m-}[m
[31m-[m
[31m-/* Parse call statement or assignment. */[m
[31m-static void parse_call_assign(LexState *ls)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  LHSVarList vl;[m
[31m-  expr_primary(ls, &vl.v);[m
[31m-  if (vl.v.k == VCALL) {  /* Function call statement. */[m
[31m-    setbc_b(bcptr(fs, &vl.v), 1);  /* No results. */[m
[31m-  } else {  /* Start of an assignment. */[m
[31m-    vl.prev = NULL;[m
[31m-    parse_assignment(ls, &vl, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse 'local' statement. */[m
[31m-static void parse_local(LexState *ls)[m
[31m-{[m
[31m-  if (lex_opt(ls, TK_function)) {  /* Local function declaration. */[m
[31m-    ExpDesc v, b;[m
[31m-    FuncState *fs = ls->fs;[m
[31m-    var_new(ls, 0, lex_str(ls));[m
[31m-    expr_init(&v, VLOCAL, fs->freereg);[m
[31m-    v.u.s.aux = fs->varmap[fs->freereg];[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-    var_add(ls, 1);[m
[31m-    parse_body(ls, &b, 0, ls->linenumber);[m
[31m-    /* bcemit_store(fs, &v, &b) without setting VSTACK_VAR_RW. */[m
[31m-    expr_free(fs, &b);[m
[31m-    expr_toreg(fs, &b, v.u.s.info);[m
[31m-    /* The upvalue is in scope, but the local is only valid after the store. */[m
[31m-    var_get(ls, fs, fs->nactvar - 1).startpc = fs->pc;[m
[31m-  } else {  /* Local variable declaration. */[m
[31m-    ExpDesc e;[m
[31m-    BCReg nexps, nvars = 0;[m
[31m-    do {  /* Collect LHS. */[m
[31m-      var_new(ls, nvars++, lex_str(ls));[m
[31m-    } while (lex_opt(ls, ','));[m
[31m-    if (lex_opt(ls, '=')) {  /* Optional RHS. */[m
[31m-      nexps = expr_list(ls, &e);[m
[31m-    } else {  /* Or implicitly set to nil. */[m
[31m-      e.k = VVOID;[m
[31m-      nexps = 0;[m
[31m-    }[m
[31m-    assign_adjust(ls, nvars, nexps, &e);[m
[31m-    var_add(ls, nvars);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse 'function' statement. */[m
[31m-static void parse_func(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs;[m
[31m-  ExpDesc v, b;[m
[31m-  int needself = 0;[m
[31m-  lj_lex_next(ls);  /* Skip 'function'. */[m
[31m-  /* Parse function name. */[m
[31m-  var_lookup(ls, &v);[m
[31m-  while (ls->tok == '.')  /* Multiple dot-separated fields. */[m
[31m-    expr_field(ls, &v);[m
[31m-  if (ls->tok == ':') {  /* Optional colon to signify method call. */[m
[31m-    needself = 1;[m
[31m-    expr_field(ls, &v);[m
[31m-  }[m
[31m-  parse_body(ls, &b, needself, line);[m
[31m-  fs = ls->fs;[m
[31m-  bcemit_store(fs, &v, &b);[m
[31m-  fs->bcbase[fs->pc - 1].line = line;  /* Set line for the store. */[m
[31m-}[m
[31m-[m
[31m-/* -- Control transfer statements ----------------------------------------- */[m
[31m-[m
[31m-/* Check for end of block. */[m
[31m-static int parse_isend(LexToken tok)[m
[31m-{[m
[31m-  switch (tok) {[m
[31m-  case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof:[m
[31m-    return 1;[m
[31m-  default:[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Parse 'return' statement. */[m
[31m-static void parse_return(LexState *ls)[m
[31m-{[m
[31m-  BCIns ins;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  lj_lex_next(ls);  /* Skip 'return'. */[m
[31m-  fs->flags |= PROTO_HAS_RETURN;[m
[31m-  if (parse_isend(ls->tok) || ls->tok == ';') {  /* Bare return. */[m
[31m-    ins = BCINS_AD(BC_RET0, 0, 1);[m
[31m-  } else {  /* Return with one or more values. */[m
[31m-    ExpDesc e;  /* Receives the _last_ expression in the list. */[m
[31m-    BCReg nret = expr_list(ls, &e);[m
[31m-    if (nret == 1) {  /* Return one result. */[m
[31m-      if (e.k == VCALL) {  /* Check for tail call. */[m
[31m-	BCIns *ip = bcptr(fs, &e);[m
[31m-	/* It doesn't pay off to add BC_VARGT just for 'return ...'. */[m
[31m-	if (bc_op(*ip) == BC_VARG) goto notailcall;[m
[31m-	fs->pc--;[m
[31m-	ins = BCINS_AD(bc_op(*ip)-BC_CALL+BC_CALLT, bc_a(*ip), bc_c(*ip));[m
[31m-      } else {  /* Can return the result from any register. */[m
[31m-	ins = BCINS_AD(BC_RET1, expr_toanyreg(fs, &e), 2);[m
[31m-      }[m
[31m-    } else {[m
[31m-      if (e.k == VCALL) {  /* Append all results from a call. */[m
[31m-      notailcall:[m
[31m-	setbc_b(bcptr(fs, &e), 0);[m
[31m-	ins = BCINS_AD(BC_RETM, fs->nactvar, e.u.s.aux - fs->nactvar);[m
[31m-      } else {[m
[31m-	expr_tonextreg(fs, &e);  /* Force contiguous registers. */[m
[31m-	ins = BCINS_AD(BC_RET, fs->nactvar, nret+1);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (fs->flags & PROTO_CHILD)[m
[31m-    bcemit_AJ(fs, BC_UCLO, 0, 0);  /* May need to close upvalues first. */[m
[31m-  bcemit_INS(fs, ins);[m
[31m-}[m
[31m-[m
[31m-/* Parse 'break' statement. */[m
[31m-static void parse_break(LexState *ls)[m
[31m-{[m
[31m-  ls->fs->bl->flags |= FSCOPE_BREAK;[m
[31m-  gola_new(ls, NAME_BREAK, VSTACK_GOTO, bcemit_jmp(ls->fs));[m
[31m-}[m
[31m-[m
[31m-/* Parse 'goto' statement. */[m
[31m-static void parse_goto(LexState *ls)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  GCstr *name = lex_str(ls);[m
[31m-  VarInfo *vl = gola_findlabel(ls, name);[m
[31m-  if (vl)  /* Treat backwards goto within same scope like a loop. */[m
[31m-    bcemit_AJ(fs, BC_LOOP, vl->slot, -1);  /* No BC range check. */[m
[31m-  fs->bl->flags |= FSCOPE_GOLA;[m
[31m-  gola_new(ls, name, VSTACK_GOTO, bcemit_jmp(fs));[m
[31m-}[m
[31m-[m
[31m-/* Parse label. */[m
[31m-static void parse_label(LexState *ls)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  GCstr *name;[m
[31m-  MSize idx;[m
[31m-  fs->lasttarget = fs->pc;[m
[31m-  fs->bl->flags |= FSCOPE_GOLA;[m
[31m-  lj_lex_next(ls);  /* Skip '::'. */[m
[31m-  name = lex_str(ls);[m
[31m-  if (gola_findlabel(ls, name))[m
[31m-    lj_lex_error(ls, 0, LJ_ERR_XLDUP, strdata(name));[m
[31m-  idx = gola_new(ls, name, VSTACK_LABEL, fs->pc);[m
[31m-  lex_check(ls, TK_label);[m
[31m-  /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */[m
[31m-  for (;;) {[m
[31m-    if (ls->tok == TK_label) {[m
[31m-      synlevel_begin(ls);[m
[31m-      parse_label(ls);[m
[31m-      synlevel_end(ls);[m
[31m-    } else if (LJ_52 && ls->tok == ';') {[m
[31m-      lj_lex_next(ls);[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Trailing label is considered to be outside of scope. */[m
[31m-  if (parse_isend(ls->tok) && ls->tok != TK_until)[m
[31m-    ls->vstack[idx].slot = fs->bl->nactvar;[m
[31m-  gola_resolve(ls, fs->bl, idx);[m
[31m-}[m
[31m-[m
[31m-/* -- Blocks, loops and conditional statements ---------------------------- */[m
[31m-[m
[31m-/* Parse a block. */[m
[31m-static void parse_block(LexState *ls)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  FuncScope bl;[m
[31m-  fscope_begin(fs, &bl, 0);[m
[31m-  parse_chunk(ls);[m
[31m-  fscope_end(fs);[m
[31m-}[m
[31m-[m
[31m-/* Parse 'while' statement. */[m
[31m-static void parse_while(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos start, loop, condexit;[m
[31m-  FuncScope bl;[m
[31m-  lj_lex_next(ls);  /* Skip 'while'. */[m
[31m-  start = fs->lasttarget = fs->pc;[m
[31m-  condexit = expr_cond(ls);[m
[31m-  fscope_begin(fs, &bl, FSCOPE_LOOP);[m
[31m-  lex_check(ls, TK_do);[m
[31m-  loop = bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);[m
[31m-  parse_block(ls);[m
[31m-  jmp_patch(fs, bcemit_jmp(fs), start);[m
[31m-  lex_match(ls, TK_end, TK_while, line);[m
[31m-  fscope_end(fs);[m
[31m-  jmp_tohere(fs, condexit);[m
[31m-  jmp_patchins(fs, loop, fs->pc);[m
[31m-}[m
[31m-[m
[31m-/* Parse 'repeat' statement. */[m
[31m-static void parse_repeat(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos loop = fs->lasttarget = fs->pc;[m
[31m-  BCPos condexit;[m
[31m-  FuncScope bl1, bl2;[m
[31m-  fscope_begin(fs, &bl1, FSCOPE_LOOP);  /* Breakable loop scope. */[m
[31m-  fscope_begin(fs, &bl2, 0);  /* Inner scope. */[m
[31m-  lj_lex_next(ls);  /* Skip 'repeat'. */[m
[31m-  bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);[m
[31m-  parse_chunk(ls);[m
[31m-  lex_match(ls, TK_until, TK_repeat, line);[m
[31m-  condexit = expr_cond(ls);  /* Parse condition (still inside inner scope). */[m
[31m-  if (!(bl2.flags & FSCOPE_UPVAL)) {  /* No upvalues? Just end inner scope. */[m
[31m-    fscope_end(fs);[m
[31m-  } else {  /* Otherwise generate: cond: UCLO+JMP out, !cond: UCLO+JMP loop. */[m
[31m-    parse_break(ls);  /* Break from loop and close upvalues. */[m
[31m-    jmp_tohere(fs, condexit);[m
[31m-    fscope_end(fs);  /* End inner scope and close upvalues. */[m
[31m-    condexit = bcemit_jmp(fs);[m
[31m-  }[m
[31m-  jmp_patch(fs, condexit, loop);  /* Jump backwards if !cond. */[m
[31m-  jmp_patchins(fs, loop, fs->pc);[m
[31m-  fscope_end(fs);  /* End loop scope. */[m
[31m-}[m
[31m-[m
[31m-/* Parse numeric 'for'. */[m
[31m-static void parse_for_num(LexState *ls, GCstr *varname, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCReg base = fs->freereg;[m
[31m-  FuncScope bl;[m
[31m-  BCPos loop, loopend;[m
[31m-  /* Hidden control variables. */[m
[31m-  var_new_fixed(ls, FORL_IDX, VARNAME_FOR_IDX);[m
[31m-  var_new_fixed(ls, FORL_STOP, VARNAME_FOR_STOP);[m
[31m-  var_new_fixed(ls, FORL_STEP, VARNAME_FOR_STEP);[m
[31m-  /* Visible copy of index variable. */[m
[31m-  var_new(ls, FORL_EXT, varname);[m
[31m-  lex_check(ls, '=');[m
[31m-  expr_next(ls);[m
[31m-  lex_check(ls, ',');[m
[31m-  expr_next(ls);[m
[31m-  if (lex_opt(ls, ',')) {[m
[31m-    expr_next(ls);[m
[31m-  } else {[m
[31m-    bcemit_AD(fs, BC_KSHORT, fs->freereg, 1);  /* Default step is 1. */[m
[31m-    bcreg_reserve(fs, 1);[m
[31m-  }[m
[31m-  var_add(ls, 3);  /* Hidden control variables. */[m
[31m-  lex_check(ls, TK_do);[m
[31m-  loop = bcemit_AJ(fs, BC_FORI, base, NO_JMP);[m
[31m-  fscope_begin(fs, &bl, 0);  /* Scope for visible variables. */[m
[31m-  var_add(ls, 1);[m
[31m-  bcreg_reserve(fs, 1);[m
[31m-  parse_block(ls);[m
[31m-  fscope_end(fs);[m
[31m-  /* Perform loop inversion. Loop control instructions are at the end. */[m
[31m-  loopend = bcemit_AJ(fs, BC_FORL, base, NO_JMP);[m
[31m-  fs->bcbase[loopend].line = line;  /* Fix line for control ins. */[m
[31m-  jmp_patchins(fs, loopend, loop+1);[m
[31m-  jmp_patchins(fs, loop, fs->pc);[m
[31m-}[m
[31m-[m
[31m-/* Try to predict whether the iterator is next() and specialize the bytecode.[m
[31m-** Detecting next() and pairs() by name is simplistic, but quite effective.[m
[31m-** The interpreter backs off if the check for the closure fails at runtime.[m
[31m-*/[m
[31m-static int predict_next(LexState *ls, FuncState *fs, BCPos pc)[m
[31m-{[m
[31m-  BCIns ins = fs->bcbase[pc].ins;[m
[31m-  GCstr *name;[m
[31m-  cTValue *o;[m
[31m-  switch (bc_op(ins)) {[m
[31m-  case BC_MOV:[m
[31m-    name = gco2str(gcref(var_get(ls, fs, bc_d(ins)).name));[m
[31m-    break;[m
[31m-  case BC_UGET:[m
[31m-    name = gco2str(gcref(ls->vstack[fs->uvmap[bc_d(ins)]].name));[m
[31m-    break;[m
[31m-  case BC_GGET:[m
[31m-    /* There's no inverse index (yet), so lookup the strings. */[m
[31m-    o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "pairs"));[m
[31m-    if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))[m
[31m-      return 1;[m
[31m-    o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "next"));[m
[31m-    if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))[m
[31m-      return 1;[m
[31m-    return 0;[m
[31m-  default:[m
[31m-    return 0;[m
[31m-  }[m
[31m-  return (name->len == 5 && !strcmp(strdata(name), "pairs")) ||[m
[31m-	 (name->len == 4 && !strcmp(strdata(name), "next"));[m
[31m-}[m
[31m-[m
[31m-/* Parse 'for' iterator. */[m
[31m-static void parse_for_iter(LexState *ls, GCstr *indexname)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  ExpDesc e;[m
[31m-  BCReg nvars = 0;[m
[31m-  BCLine line;[m
[31m-  BCReg base = fs->freereg + 3;[m
[31m-  BCPos loop, loopend, exprpc = fs->pc;[m
[31m-  FuncScope bl;[m
[31m-  int isnext;[m
[31m-  /* Hidden control variables. */[m
[31m-  var_new_fixed(ls, nvars++, VARNAME_FOR_GEN);[m
[31m-  var_new_fixed(ls, nvars++, VARNAME_FOR_STATE);[m
[31m-  var_new_fixed(ls, nvars++, VARNAME_FOR_CTL);[m
[31m-  /* Visible variables returned from iterator. */[m
[31m-  var_new(ls, nvars++, indexname);[m
[31m-  while (lex_opt(ls, ','))[m
[31m-    var_new(ls, nvars++, lex_str(ls));[m
[31m-  lex_check(ls, TK_in);[m
[31m-  line = ls->linenumber;[m
[31m-  assign_adjust(ls, 3, expr_list(ls, &e), &e);[m
[31m-  /* The iterator needs another 3 [4] slots (func [pc] | state ctl). */[m
[31m-  bcreg_bump(fs, 3+LJ_FR2);[m
[31m-  isnext = (nvars <= 5 && predict_next(ls, fs, exprpc));[m
[31m-  var_add(ls, 3);  /* Hidden control variables. */[m
[31m-  lex_check(ls, TK_do);[m
[31m-  loop = bcemit_AJ(fs, isnext ? BC_ISNEXT : BC_JMP, base, NO_JMP);[m
[31m-  fscope_begin(fs, &bl, 0);  /* Scope for visible variables. */[m
[31m-  var_add(ls, nvars-3);[m
[31m-  bcreg_reserve(fs, nvars-3);[m
[31m-  parse_block(ls);[m
[31m-  fscope_end(fs);[m
[31m-  /* Perform loop inversion. Loop control instructions are at the end. */[m
[31m-  jmp_patchins(fs, loop, fs->pc);[m
[31m-  bcemit_ABC(fs, isnext ? BC_ITERN : BC_ITERC, base, nvars-3+1, 2+1);[m
[31m-  loopend = bcemit_AJ(fs, BC_ITERL, base, NO_JMP);[m
[31m-  fs->bcbase[loopend-1].line = line;  /* Fix line for control ins. */[m
[31m-  fs->bcbase[loopend].line = line;[m
[31m-  jmp_patchins(fs, loopend, loop+1);[m
[31m-}[m
[31m-[m
[31m-/* Parse 'for' statement. */[m
[31m-static void parse_for(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  GCstr *varname;[m
[31m-  FuncScope bl;[m
[31m-  fscope_begin(fs, &bl, FSCOPE_LOOP);[m
[31m-  lj_lex_next(ls);  /* Skip 'for'. */[m
[31m-  varname = lex_str(ls);  /* Get first variable name. */[m
[31m-  if (ls->tok == '=')[m
[31m-    parse_for_num(ls, varname, line);[m
[31m-  else if (ls->tok == ',' || ls->tok == TK_in)[m
[31m-    parse_for_iter(ls, varname);[m
[31m-  else[m
[31m-    err_syntax(ls, LJ_ERR_XFOR);[m
[31m-  lex_match(ls, TK_end, TK_for, line);[m
[31m-  fscope_end(fs);  /* Resolve break list. */[m
[31m-}[m
[31m-[m
[31m-/* Parse condition and 'then' block. */[m
[31m-static BCPos parse_then(LexState *ls)[m
[31m-{[m
[31m-  BCPos condexit;[m
[31m-  lj_lex_next(ls);  /* Skip 'if' or 'elseif'. */[m
[31m-  condexit = expr_cond(ls);[m
[31m-  lex_check(ls, TK_then);[m
[31m-  parse_block(ls);[m
[31m-  return condexit;[m
[31m-}[m
[31m-[m
[31m-/* Parse 'if' statement. */[m
[31m-static void parse_if(LexState *ls, BCLine line)[m
[31m-{[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BCPos flist;[m
[31m-  BCPos escapelist = NO_JMP;[m
[31m-  flist = parse_then(ls);[m
[31m-  while (ls->tok == TK_elseif) {  /* Parse multiple 'elseif' blocks. */[m
[31m-    jmp_append(fs, &escapelist, bcemit_jmp(fs));[m
[31m-    jmp_tohere(fs, flist);[m
[31m-    flist = parse_then(ls);[m
[31m-  }[m
[31m-  if (ls->tok == TK_else) {  /* Parse optional 'else' block. */[m
[31m-    jmp_append(fs, &escapelist, bcemit_jmp(fs));[m
[31m-    jmp_tohere(fs, flist);[m
[31m-    lj_lex_next(ls);  /* Skip 'else'. */[m
[31m-    parse_block(ls);[m
[31m-  } else {[m
[31m-    jmp_append(fs, &escapelist, flist);[m
[31m-  }[m
[31m-  jmp_tohere(fs, escapelist);[m
[31m-  lex_match(ls, TK_end, TK_if, line);[m
[31m-}[m
[31m-[m
[31m-/* -- Parse statements ---------------------------------------------------- */[m
[31m-[m
[31m-/* Parse a statement. Returns 1 if it must be the last one in a chunk. */[m
[31m-static int parse_stmt(LexState *ls)[m
[31m-{[m
[31m-  BCLine line = ls->linenumber;[m
[31m-  switch (ls->tok) {[m
[31m-  case TK_if:[m
[31m-    parse_if(ls, line);[m
[31m-    break;[m
[31m-  case TK_while:[m
[31m-    parse_while(ls, line);[m
[31m-    break;[m
[31m-  case TK_do:[m
[31m-    lj_lex_next(ls);[m
[31m-    parse_block(ls);[m
[31m-    lex_match(ls, TK_end, TK_do, line);[m
[31m-    break;[m
[31m-  case TK_for:[m
[31m-    parse_for(ls, line);[m
[31m-    break;[m
[31m-  case TK_repeat:[m
[31m-    parse_repeat(ls, line);[m
[31m-    break;[m
[31m-  case TK_function:[m
[31m-    parse_func(ls, line);[m
[31m-    break;[m
[31m-  case TK_local:[m
[31m-    lj_lex_next(ls);[m
[31m-    parse_local(ls);[m
[31m-    break;[m
[31m-  case TK_return:[m
[31m-    parse_return(ls);[m
[31m-    return 1;  /* Must be last. */[m
[31m-  case TK_break:[m
[31m-    lj_lex_next(ls);[m
[31m-    parse_break(ls);[m
[31m-    return !LJ_52;  /* Must be last in Lua 5.1. */[m
[31m-#if LJ_52[m
[31m-  case ';':[m
[31m-    lj_lex_next(ls);[m
[31m-    break;[m
[31m-#endif[m
[31m-  case TK_label:[m
[31m-    parse_label(ls);[m
[31m-    break;[m
[31m-  case TK_goto:[m
[31m-    if (LJ_52 || lj_lex_lookahead(ls) == TK_name) {[m
[31m-      lj_lex_next(ls);[m
[31m-      parse_goto(ls);[m
[31m-      break;[m
[31m-    }  /* else: fallthrough */[m
[31m-  default:[m
[31m-    parse_call_assign(ls);[m
[31m-    break;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* A chunk is a list of statements optionally separated by semicolons. */[m
[31m-static void parse_chunk(LexState *ls)[m
[31m-{[m
[31m-  int islast = 0;[m
[31m-  synlevel_begin(ls);[m
[31m-  while (!islast && !parse_isend(ls->tok)) {[m
[31m-    islast = parse_stmt(ls);[m
[31m-    lex_opt(ls, ';');[m
[31m-    lua_assert(ls->fs->framesize >= ls->fs->freereg &&[m
[31m-	       ls->fs->freereg >= ls->fs->nactvar);[m
[31m-    ls->fs->freereg = ls->fs->nactvar;  /* Free registers after each stmt. */[m
[31m-  }[m
[31m-  synlevel_end(ls);[m
[31m-}[m
[31m-[m
[31m-/* Entry point of bytecode parser. */[m
[31m-GCproto *lj_parse(LexState *ls)[m
[31m-{[m
[31m-  FuncState fs;[m
[31m-  FuncScope bl;[m
[31m-  GCproto *pt;[m
[31m-  lua_State *L = ls->L;[m
[31m-#ifdef LUAJIT_DISABLE_DEBUGINFO[m
[31m-  ls->chunkname = lj_str_newlit(L, "=");[m
[31m-#else[m
[31m-  ls->chunkname = lj_str_newz(L, ls->chunkarg);[m
[31m-#endif[m
[31m-  setstrV(L, L->top, ls->chunkname);  /* Anchor chunkname string. */[m
[31m-  incr_top(L);[m
[31m-  ls->level = 0;[m
[31m-  fs_init(ls, &fs);[m
[31m-  fs.linedefined = 0;[m
[31m-  fs.numparams = 0;[m
[31m-  fs.bcbase = NULL;[m
[31m-  fs.bclim = 0;[m
[31m-  fs.flags |= PROTO_VARARG;  /* Main chunk is always a vararg func. */[m
[31m-  fscope_begin(&fs, &bl, 0);[m
[31m-  bcemit_AD(&fs, BC_FUNCV, 0, 0);  /* Placeholder. */[m
[31m-  lj_lex_next(ls);  /* Read-ahead first token. */[m
[31m-  parse_chunk(ls);[m
[31m-  if (ls->tok != TK_eof)[m
[31m-    err_token(ls, TK_eof);[m
[31m-  pt = fs_finish(ls, ls->linenumber);[m
[31m-  L->top--;  /* Drop chunkname. */[m
[31m-  lua_assert(fs.prev == NULL);[m
[31m-  lua_assert(ls->fs == NULL);[m
[31m-  lua_assert(pt->sizeuv == 0);[m
[31m-  return pt;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_parse.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_parse.h[m
[1mdeleted file mode 100644[m
[1mindex b383c89..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_parse.h[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-/*[m
[31m-** Lua parser (source code -> bytecode).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_PARSE_H[m
[31m-#define _LJ_PARSE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_lex.h"[m
[31m-[m
[31m-LJ_FUNC GCproto *lj_parse(LexState *ls);[m
[31m-LJ_FUNC GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t l);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_profile.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_profile.c[m
[1mdeleted file mode 100644[m
[1mindex 95b0a62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_profile.c[m
[1m+++ /dev/null[m
[36m@@ -1,368 +0,0 @@[m
[31m-/*[m
[31m-** Low-overhead profiling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_profile_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_trace.h"[m
[31m-#endif[m
[31m-#include "lj_profile.h"[m
[31m-[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-#if LJ_PROFILE_SIGPROF[m
[31m-[m
[31m-#include <sys/time.h>[m
[31m-#include <signal.h>[m
[31m-#define profile_lock(ps)	UNUSED(ps)[m
[31m-#define profile_unlock(ps)	UNUSED(ps)[m
[31m-[m
[31m-#elif LJ_PROFILE_PTHREAD[m
[31m-[m
[31m-#include <pthread.h>[m
[31m-#include <time.h>[m
[31m-#if LJ_TARGET_PS3[m
[31m-#include <sys/timer.h>[m
[31m-#endif[m
[31m-#define profile_lock(ps)	pthread_mutex_lock(&ps->lock)[m
[31m-#define profile_unlock(ps)	pthread_mutex_unlock(&ps->lock)[m
[31m-[m
[31m-#elif LJ_PROFILE_WTHREAD[m
[31m-[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-#if LJ_TARGET_XBOX360[m
[31m-#include <xtl.h>[m
[31m-#include <xbox.h>[m
[31m-#else[m
[31m-#include <windows.h>[m
[31m-#endif[m
[31m-typedef unsigned int (WINAPI *WMM_TPFUNC)(unsigned int);[m
[31m-#define profile_lock(ps)	EnterCriticalSection(&ps->lock)[m
[31m-#define profile_unlock(ps)	LeaveCriticalSection(&ps->lock)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* Profiler state. */[m
[31m-typedef struct ProfileState {[m
[31m-  global_State *g;		/* VM state that started the profiler. */[m
[31m-  luaJIT_profile_callback cb;	/* Profiler callback. */[m
[31m-  void *data;			/* Profiler callback data. */[m
[31m-  SBuf sb;			/* String buffer for stack dumps. */[m
[31m-  int interval;			/* Sample interval in milliseconds. */[m
[31m-  int samples;			/* Number of samples for next callback. */[m
[31m-  int vmstate;			/* VM state when profile timer triggered. */[m
[31m-#if LJ_PROFILE_SIGPROF[m
[31m-  struct sigaction oldsa;	/* Previous SIGPROF state. */[m
[31m-#elif LJ_PROFILE_PTHREAD[m
[31m-  pthread_mutex_t lock;		/* g->hookmask update lock. */[m
[31m-  pthread_t thread;		/* Timer thread. */[m
[31m-  int abort;			/* Abort timer thread. */[m
[31m-#elif LJ_PROFILE_WTHREAD[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  HINSTANCE wmm;		/* WinMM library handle. */[m
[31m-  WMM_TPFUNC wmm_tbp;		/* WinMM timeBeginPeriod function. */[m
[31m-  WMM_TPFUNC wmm_tep;		/* WinMM timeEndPeriod function. */[m
[31m-#endif[m
[31m-  CRITICAL_SECTION lock;	/* g->hookmask update lock. */[m
[31m-  HANDLE thread;		/* Timer thread. */[m
[31m-  int abort;			/* Abort timer thread. */[m
[31m-#endif[m
[31m-} ProfileState;[m
[31m-[m
[31m-/* Sadly, we have to use a static profiler state.[m
[31m-**[m
[31m-** The SIGPROF variant needs a static pointer to the global state, anyway.[m
[31m-** And it would be hard to extend for multiple threads. You can still use[m
[31m-** multiple VMs in multiple threads, but only profile one at a time.[m
[31m-*/[m
[31m-static ProfileState profile_state;[m
[31m-[m
[31m-/* Default sample interval in milliseconds. */[m
[31m-#define LJ_PROFILE_INTERVAL_DEFAULT	10[m
[31m-[m
[31m-/* -- Profiler/hook interaction ------------------------------------------- */[m
[31m-[m
[31m-#if !LJ_PROFILE_SIGPROF[m
[31m-void LJ_FASTCALL lj_profile_hook_enter(global_State *g)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  if (ps->g) {[m
[31m-    profile_lock(ps);[m
[31m-    hook_enter(g);[m
[31m-    profile_unlock(ps);[m
[31m-  } else {[m
[31m-    hook_enter(g);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_profile_hook_leave(global_State *g)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  if (ps->g) {[m
[31m-    profile_lock(ps);[m
[31m-    hook_leave(g);[m
[31m-    profile_unlock(ps);[m
[31m-  } else {[m
[31m-    hook_leave(g);[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Profile callbacks --------------------------------------------------- */[m
[31m-[m
[31m-/* Callback from profile hook (HOOK_PROFILE already cleared). */[m
[31m-void LJ_FASTCALL lj_profile_interpreter(lua_State *L)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  global_State *g = G(L);[m
[31m-  uint8_t mask;[m
[31m-  profile_lock(ps);[m
[31m-  mask = (g->hookmask & ~HOOK_PROFILE);[m
[31m-  if (!(mask & HOOK_VMEVENT)) {[m
[31m-    int samples = ps->samples;[m
[31m-    ps->samples = 0;[m
[31m-    g->hookmask = HOOK_VMEVENT;[m
[31m-    lj_dispatch_update(g);[m
[31m-    profile_unlock(ps);[m
[31m-    ps->cb(ps->data, L, samples, ps->vmstate);  /* Invoke user callback. */[m
[31m-    profile_lock(ps);[m
[31m-    mask |= (g->hookmask & HOOK_PROFILE);[m
[31m-  }[m
[31m-  g->hookmask = mask;[m
[31m-  lj_dispatch_update(g);[m
[31m-  profile_unlock(ps);[m
[31m-}[m
[31m-[m
[31m-/* Trigger profile hook. Asynchronous call from OS-specific profile timer. */[m
[31m-static void profile_trigger(ProfileState *ps)[m
[31m-{[m
[31m-  global_State *g = ps->g;[m
[31m-  uint8_t mask;[m
[31m-  profile_lock(ps);[m
[31m-  ps->samples++;  /* Always increment number of samples. */[m
[31m-  mask = g->hookmask;[m
[31m-  if (!(mask & (HOOK_PROFILE|HOOK_VMEVENT))) {  /* Set profile hook. */[m
[31m-    int st = g->vmstate;[m
[31m-    ps->vmstate = st >= 0 ? 'N' :[m
[31m-		  st == ~LJ_VMST_INTERP ? 'I' :[m
[31m-		  st == ~LJ_VMST_C ? 'C' :[m
[31m-		  st == ~LJ_VMST_GC ? 'G' : 'J';[m
[31m-    g->hookmask = (mask | HOOK_PROFILE);[m
[31m-    lj_dispatch_update(g);[m
[31m-  }[m
[31m-  profile_unlock(ps);[m
[31m-}[m
[31m-[m
[31m-/* -- OS-specific profile timer handling ---------------------------------- */[m
[31m-[m
[31m-#if LJ_PROFILE_SIGPROF[m
[31m-[m
[31m-/* SIGPROF handler. */[m
[31m-static void profile_signal(int sig)[m
[31m-{[m
[31m-  UNUSED(sig);[m
[31m-  profile_trigger(&profile_state);[m
[31m-}[m
[31m-[m
[31m-/* Start profiling timer. */[m
[31m-static void profile_timer_start(ProfileState *ps)[m
[31m-{[m
[31m-  int interval = ps->interval;[m
[31m-  struct itimerval tm;[m
[31m-  struct sigaction sa;[m
[31m-  tm.it_value.tv_sec = tm.it_interval.tv_sec = interval / 1000;[m
[31m-  tm.it_value.tv_usec = tm.it_interval.tv_usec = (interval % 1000) * 1000;[m
[31m-  setitimer(ITIMER_PROF, &tm, NULL);[m
[31m-  sa.sa_flags = SA_RESTART;[m
[31m-  sa.sa_handler = profile_signal;[m
[31m-  sigemptyset(&sa.sa_mask);[m
[31m-  sigaction(SIGPROF, &sa, &ps->oldsa);[m
[31m-}[m
[31m-[m
[31m-/* Stop profiling timer. */[m
[31m-static void profile_timer_stop(ProfileState *ps)[m
[31m-{[m
[31m-  struct itimerval tm;[m
[31m-  tm.it_value.tv_sec = tm.it_interval.tv_sec = 0;[m
[31m-  tm.it_value.tv_usec = tm.it_interval.tv_usec = 0;[m
[31m-  setitimer(ITIMER_PROF, &tm, NULL);[m
[31m-  sigaction(SIGPROF, &ps->oldsa, NULL);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_PROFILE_PTHREAD[m
[31m-[m
[31m-/* POSIX timer thread. */[m
[31m-static void *profile_thread(ProfileState *ps)[m
[31m-{[m
[31m-  int interval = ps->interval;[m
[31m-#if !LJ_TARGET_PS3[m
[31m-  struct timespec ts;[m
[31m-  ts.tv_sec = interval / 1000;[m
[31m-  ts.tv_nsec = (interval % 1000) * 1000000;[m
[31m-#endif[m
[31m-  while (1) {[m
[31m-#if LJ_TARGET_PS3[m
[31m-    sys_timer_usleep(interval * 1000);[m
[31m-#else[m
[31m-    nanosleep(&ts, NULL);[m
[31m-#endif[m
[31m-    if (ps->abort) break;[m
[31m-    profile_trigger(ps);[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Start profiling timer thread. */[m
[31m-static void profile_timer_start(ProfileState *ps)[m
[31m-{[m
[31m-  pthread_mutex_init(&ps->lock, 0);[m
[31m-  ps->abort = 0;[m
[31m-  pthread_create(&ps->thread, NULL, (void *(*)(void *))profile_thread, ps);[m
[31m-}[m
[31m-[m
[31m-/* Stop profiling timer thread. */[m
[31m-static void profile_timer_stop(ProfileState *ps)[m
[31m-{[m
[31m-  ps->abort = 1;[m
[31m-  pthread_join(ps->thread, NULL);[m
[31m-  pthread_mutex_destroy(&ps->lock);[m
[31m-}[m
[31m-[m
[31m-#elif LJ_PROFILE_WTHREAD[m
[31m-[m
[31m-/* Windows timer thread. */[m
[31m-static DWORD WINAPI profile_thread(void *psx)[m
[31m-{[m
[31m-  ProfileState *ps = (ProfileState *)psx;[m
[31m-  int interval = ps->interval;[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  ps->wmm_tbp(interval);[m
[31m-#endif[m
[31m-  while (1) {[m
[31m-    Sleep(interval);[m
[31m-    if (ps->abort) break;[m
[31m-    profile_trigger(ps);[m
[31m-  }[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  ps->wmm_tep(interval);[m
[31m-#endif[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Start profiling timer thread. */[m
[31m-static void profile_timer_start(ProfileState *ps)[m
[31m-{[m
[31m-#if LJ_TARGET_WINDOWS[m
[31m-  if (!ps->wmm) {  /* Load WinMM library on-demand. */[m
[31m-    ps->wmm = LoadLibraryExA("winmm.dll", NULL, 0);[m
[31m-    if (ps->wmm) {[m
[31m-      ps->wmm_tbp = (WMM_TPFUNC)GetProcAddress(ps->wmm, "timeBeginPeriod");[m
[31m-      ps->wmm_tep = (WMM_TPFUNC)GetProcAddress(ps->wmm, "timeEndPeriod");[m
[31m-      if (!ps->wmm_tbp || !ps->wmm_tep) {[m
[31m-	ps->wmm = NULL;[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  InitializeCriticalSection(&ps->lock);[m
[31m-  ps->abort = 0;[m
[31m-  ps->thread = CreateThread(NULL, 0, profile_thread, ps, 0, NULL);[m
[31m-}[m
[31m-[m
[31m-/* Stop profiling timer thread. */[m
[31m-static void profile_timer_stop(ProfileState *ps)[m
[31m-{[m
[31m-  ps->abort = 1;[m
[31m-  WaitForSingleObject(ps->thread, INFINITE);[m
[31m-  DeleteCriticalSection(&ps->lock);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- Public profiling API ------------------------------------------------ */[m
[31m-[m
[31m-/* Start profiling. */[m
[31m-LUA_API void luaJIT_profile_start(lua_State *L, const char *mode,[m
[31m-				  luaJIT_profile_callback cb, void *data)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  int interval = LJ_PROFILE_INTERVAL_DEFAULT;[m
[31m-  while (*mode) {[m
[31m-    int m = *mode++;[m
[31m-    switch (m) {[m
[31m-    case 'i':[m
[31m-      interval = 0;[m
[31m-      while (*mode >= '0' && *mode <= '9')[m
[31m-	interval = interval * 10 + (*mode++ - '0');[m
[31m-      if (interval <= 0) interval = 1;[m
[31m-      break;[m
[31m-#if LJ_HASJIT[m
[31m-    case 'l': case 'f':[m
[31m-      L2J(L)->prof_mode = m;[m
[31m-      lj_trace_flushall(L);[m
[31m-      break;[m
[31m-#endif[m
[31m-    default:  /* Ignore unknown mode chars. */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  if (ps->g) {[m
[31m-    luaJIT_profile_stop(L);[m
[31m-    if (ps->g) return;  /* Profiler in use by another VM. */[m
[31m-  }[m
[31m-  ps->g = G(L);[m
[31m-  ps->interval = interval;[m
[31m-  ps->cb = cb;[m
[31m-  ps->data = data;[m
[31m-  ps->samples = 0;[m
[31m-  lj_buf_init(L, &ps->sb);[m
[31m-  profile_timer_start(ps);[m
[31m-}[m
[31m-[m
[31m-/* Stop profiling. */[m
[31m-LUA_API void luaJIT_profile_stop(lua_State *L)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  global_State *g = ps->g;[m
[31m-  if (G(L) == g) {  /* Only stop profiler if started by this VM. */[m
[31m-    profile_timer_stop(ps);[m
[31m-    g->hookmask &= ~HOOK_PROFILE;[m
[31m-    lj_dispatch_update(g);[m
[31m-#if LJ_HASJIT[m
[31m-    G2J(g)->prof_mode = 0;[m
[31m-    lj_trace_flushall(L);[m
[31m-#endif[m
[31m-    lj_buf_free(g, &ps->sb);[m
[31m-    setmref(ps->sb.b, NULL);[m
[31m-    setmref(ps->sb.e, NULL);[m
[31m-    ps->g = NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Return a compact stack dump. */[m
[31m-LUA_API const char *luaJIT_profile_dumpstack(lua_State *L, const char *fmt,[m
[31m-					     int depth, size_t *len)[m
[31m-{[m
[31m-  ProfileState *ps = &profile_state;[m
[31m-  SBuf *sb = &ps->sb;[m
[31m-  setsbufL(sb, L);[m
[31m-  lj_buf_reset(sb);[m
[31m-  lj_debug_dumpstack(L, sb, fmt, depth);[m
[31m-  *len = (size_t)sbuflen(sb);[m
[31m-  return sbufB(sb);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_profile.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_profile.h[m
[1mdeleted file mode 100644[m
[1mindex 14c3fc0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_profile.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-/*[m
[31m-** Low-overhead profiling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_PROFILE_H[m
[31m-#define _LJ_PROFILE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-[m
[31m-LJ_FUNC void LJ_FASTCALL lj_profile_interpreter(lua_State *L);[m
[31m-#if !LJ_PROFILE_SIGPROF[m
[31m-LJ_FUNC void LJ_FASTCALL lj_profile_hook_enter(global_State *g);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_profile_hook_leave(global_State *g);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_record.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_record.c[m
[1mdeleted file mode 100644[m
[1mindex 541fe71..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_record.c[m
[1m+++ /dev/null[m
[36m@@ -1,2560 +0,0 @@[m
[31m-/*[m
[31m-** Trace recorder (bytecode -> SSA IR).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_record_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_frame.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ff.h"[m
[31m-#if LJ_HASPROFILE[m
[31m-#include "lj_debug.h"[m
[31m-#endif[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_ircall.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_record.h"[m
[31m-#include "lj_ffrecord.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* Some local macros to save typing. Undef'd at the end. */[m
[31m-#define IR(ref)			(&J->cur.ir[(ref)])[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* Emit raw IR without passing through optimizations. */[m
[31m-#define emitir_raw(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))[m
[31m-[m
[31m-/* -- Sanity checks ------------------------------------------------------- */[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-/* Sanity check the whole IR -- sloooow. */[m
[31m-static void rec_check_ir(jit_State *J)[m
[31m-{[m
[31m-  IRRef i, nins = J->cur.nins, nk = J->cur.nk;[m
[31m-  lua_assert(nk <= REF_BIAS && nins >= REF_BIAS && nins < 65536);[m
[31m-  for (i = nins-1; i >= nk; i--) {[m
[31m-    IRIns *ir = IR(i);[m
[31m-    uint32_t mode = lj_ir_mode[ir->o];[m
[31m-    IRRef op1 = ir->op1;[m
[31m-    IRRef op2 = ir->op2;[m
[31m-    switch (irm_op1(mode)) {[m
[31m-    case IRMnone: lua_assert(op1 == 0); break;[m
[31m-    case IRMref: lua_assert(op1 >= nk);[m
[31m-      lua_assert(i >= REF_BIAS ? op1 < i : op1 > i); break;[m
[31m-    case IRMlit: break;[m
[31m-    case IRMcst: lua_assert(i < REF_BIAS); continue;[m
[31m-    }[m
[31m-    switch (irm_op2(mode)) {[m
[31m-    case IRMnone: lua_assert(op2 == 0); break;[m
[31m-    case IRMref: lua_assert(op2 >= nk);[m
[31m-      lua_assert(i >= REF_BIAS ? op2 < i : op2 > i); break;[m
[31m-    case IRMlit: break;[m
[31m-    case IRMcst: lua_assert(0); break;[m
[31m-    }[m
[31m-    if (ir->prev) {[m
[31m-      lua_assert(ir->prev >= nk);[m
[31m-      lua_assert(i >= REF_BIAS ? ir->prev < i : ir->prev > i);[m
[31m-      lua_assert(ir->o == IR_NOP || IR(ir->prev)->o == ir->o);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Compare stack slots and frames of the recorder and the VM. */[m
[31m-static void rec_check_slots(jit_State *J)[m
[31m-{[m
[31m-  BCReg s, nslots = J->baseslot + J->maxslot;[m
[31m-  int32_t depth = 0;[m
[31m-  cTValue *base = J->L->base - J->baseslot;[m
[31m-  lua_assert(J->baseslot >= 1 && J->baseslot < LJ_MAX_JSLOTS);[m
[31m-  lua_assert(J->baseslot == 1 || (J->slot[J->baseslot-1] & TREF_FRAME));[m
[31m-  lua_assert(nslots < LJ_MAX_JSLOTS);[m
[31m-  for (s = 0; s < nslots; s++) {[m
[31m-    TRef tr = J->slot[s];[m
[31m-    if (tr) {[m
[31m-      cTValue *tv = &base[s];[m
[31m-      IRRef ref = tref_ref(tr);[m
[31m-      IRIns *ir;[m
[31m-      lua_assert(ref >= J->cur.nk && ref < J->cur.nins);[m
[31m-      ir = IR(ref);[m
[31m-      lua_assert(irt_t(ir->t) == tref_t(tr));[m
[31m-      if (s == 0) {[m
[31m-	lua_assert(tref_isfunc(tr));[m
[31m-      } else if ((tr & TREF_FRAME)) {[m
[31m-	GCfunc *fn = gco2func(frame_gc(tv));[m
[31m-	BCReg delta = (BCReg)(tv - frame_prev(tv));[m
[31m-	lua_assert(tref_isfunc(tr));[m
[31m-	if (tref_isk(tr)) lua_assert(fn == ir_kfunc(ir));[m
[31m-	lua_assert(s > delta ? (J->slot[s-delta] & TREF_FRAME) : (s == delta));[m
[31m-	depth++;[m
[31m-      } else if ((tr & TREF_CONT)) {[m
[31m-	lua_assert(ir_kptr(ir) == gcrefp(tv->gcr, void));[m
[31m-	lua_assert((J->slot[s+1] & TREF_FRAME));[m
[31m-	depth++;[m
[31m-      } else {[m
[31m-	if (tvisnumber(tv))[m
[31m-	  lua_assert(tref_isnumber(tr));  /* Could be IRT_INT etc., too. */[m
[31m-	else[m
[31m-	  lua_assert(itype2irt(tv) == tref_type(tr));[m
[31m-	if (tref_isk(tr)) {  /* Compare constants. */[m
[31m-	  TValue tvk;[m
[31m-	  lj_ir_kvalue(J->L, &tvk, ir);[m
[31m-	  if (!(tvisnum(&tvk) && tvisnan(&tvk)))[m
[31m-	    lua_assert(lj_obj_equal(tv, &tvk));[m
[31m-	  else[m
[31m-	    lua_assert(tvisnum(tv) && tvisnan(tv));[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(J->framedepth == depth);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Type handling and specialization ------------------------------------ */[m
[31m-[m
[31m-/* Note: these functions return tagged references (TRef). */[m
[31m-[m
[31m-/* Specialize a slot to a specific type. Note: slot can be negative! */[m
[31m-static TRef sloadt(jit_State *J, int32_t slot, IRType t, int mode)[m
[31m-{[m
[31m-  /* Caller may set IRT_GUARD in t. */[m
[31m-  TRef ref = emitir_raw(IRT(IR_SLOAD, t), (int32_t)J->baseslot+slot, mode);[m
[31m-  J->base[slot] = ref;[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-/* Specialize a slot to the runtime type. Note: slot can be negative! */[m
[31m-static TRef sload(jit_State *J, int32_t slot)[m
[31m-{[m
[31m-  IRType t = itype2irt(&J->L->base[slot]);[m
[31m-  TRef ref = emitir_raw(IRTG(IR_SLOAD, t), (int32_t)J->baseslot+slot,[m
[31m-			IRSLOAD_TYPECHECK);[m
[31m-  if (irtype_ispri(t)) ref = TREF_PRI(t);  /* Canonicalize primitive refs. */[m
[31m-  J->base[slot] = ref;[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-/* Get TRef from slot. Load slot and specialize if not done already. */[m
[31m-#define getslot(J, s)	(J->base[(s)] ? J->base[(s)] : sload(J, (int32_t)(s)))[m
[31m-[m
[31m-/* Get TRef for current function. */[m
[31m-static TRef getcurrf(jit_State *J)[m
[31m-{[m
[31m-  if (J->base[-1])[m
[31m-    return J->base[-1];[m
[31m-  lua_assert(J->baseslot == 1);[m
[31m-  return sloadt(J, -1, IRT_FUNC, IRSLOAD_READONLY);[m
[31m-}[m
[31m-[m
[31m-/* Compare for raw object equality.[m
[31m-** Returns 0 if the objects are the same.[m
[31m-** Returns 1 if they are different, but the same type.[m
[31m-** Returns 2 for two different types.[m
[31m-** Comparisons between primitives always return 1 -- no caller cares about it.[m
[31m-*/[m
[31m-int lj_record_objcmp(jit_State *J, TRef a, TRef b, cTValue *av, cTValue *bv)[m
[31m-{[m
[31m-  int diff = !lj_obj_equal(av, bv);[m
[31m-  if (!tref_isk2(a, b)) {  /* Shortcut, also handles primitives. */[m
[31m-    IRType ta = tref_isinteger(a) ? IRT_INT : tref_type(a);[m
[31m-    IRType tb = tref_isinteger(b) ? IRT_INT : tref_type(b);[m
[31m-    if (ta != tb) {[m
[31m-      /* Widen mixed number/int comparisons to number/number comparison. */[m
[31m-      if (ta == IRT_INT && tb == IRT_NUM) {[m
[31m-	a = emitir(IRTN(IR_CONV), a, IRCONV_NUM_INT);[m
[31m-	ta = IRT_NUM;[m
[31m-      } else if (ta == IRT_NUM && tb == IRT_INT) {[m
[31m-	b = emitir(IRTN(IR_CONV), b, IRCONV_NUM_INT);[m
[31m-      } else {[m
[31m-	return 2;  /* Two different types are never equal. */[m
[31m-      }[m
[31m-    }[m
[31m-    emitir(IRTG(diff ? IR_NE : IR_EQ, ta), a, b);[m
[31m-  }[m
[31m-  return diff;[m
[31m-}[m
[31m-[m
[31m-/* Constify a value. Returns 0 for non-representable object types. */[m
[31m-TRef lj_record_constify(jit_State *J, cTValue *o)[m
[31m-{[m
[31m-  if (tvisgcv(o))[m
[31m-    return lj_ir_kgc(J, gcV(o), itype2irt(o));[m
[31m-  else if (tvisint(o))[m
[31m-    return lj_ir_kint(J, intV(o));[m
[31m-  else if (tvisnum(o))[m
[31m-    return lj_ir_knumint(J, numV(o));[m
[31m-  else if (tvisbool(o))[m
[31m-    return TREF_PRI(itype2irt(o));[m
[31m-  else[m
[31m-    return 0;  /* Can't represent lightuserdata (pointless). */[m
[31m-}[m
[31m-[m
[31m-/* -- Record loop ops ----------------------------------------------------- */[m
[31m-[m
[31m-/* Loop event. */[m
[31m-typedef enum {[m
[31m-  LOOPEV_LEAVE,		/* Loop is left or not entered. */[m
[31m-  LOOPEV_ENTERLO,	/* Loop is entered with a low iteration count left. */[m
[31m-  LOOPEV_ENTER		/* Loop is entered. */[m
[31m-} LoopEvent;[m
[31m-[m
[31m-/* Canonicalize slots: convert integers to numbers. */[m
[31m-static void canonicalize_slots(jit_State *J)[m
[31m-{[m
[31m-  BCReg s;[m
[31m-  if (LJ_DUALNUM) return;[m
[31m-  for (s = J->baseslot+J->maxslot-1; s >= 1; s--) {[m
[31m-    TRef tr = J->slot[s];[m
[31m-    if (tref_isinteger(tr)) {[m
[31m-      IRIns *ir = IR(tref_ref(tr));[m
[31m-      if (!(ir->o == IR_SLOAD && (ir->op2 & IRSLOAD_READONLY)))[m
[31m-	J->slot[s] = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Stop recording. */[m
[31m-void lj_record_stop(jit_State *J, TraceLink linktype, TraceNo lnk)[m
[31m-{[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  if (J->retryrec)[m
[31m-    lj_trace_err(J, LJ_TRERR_RETRY);[m
[31m-#endif[m
[31m-  lj_trace_end(J);[m
[31m-  J->cur.linktype = (uint8_t)linktype;[m
[31m-  J->cur.link = (uint16_t)lnk;[m
[31m-  /* Looping back at the same stack level? */[m
[31m-  if (lnk == J->cur.traceno && J->framedepth + J->retdepth == 0) {[m
[31m-    if ((J->flags & JIT_F_OPT_LOOP))  /* Shall we try to create a loop? */[m
[31m-      goto nocanon;  /* Do not canonicalize or we lose the narrowing. */[m
[31m-    if (J->cur.root)  /* Otherwise ensure we always link to the root trace. */[m
[31m-      J->cur.link = J->cur.root;[m
[31m-  }[m
[31m-  canonicalize_slots(J);[m
[31m-nocanon:[m
[31m-  /* Note: all loop ops must set J->pc to the following instruction! */[m
[31m-  lj_snap_add(J);  /* Add loop snapshot. */[m
[31m-  J->needsnap = 0;[m
[31m-  J->mergesnap = 1;  /* In case recording continues. */[m
[31m-}[m
[31m-[m
[31m-/* Search bytecode backwards for a int/num constant slot initializer. */[m
[31m-static TRef find_kinit(jit_State *J, const BCIns *endpc, BCReg slot, IRType t)[m
[31m-{[m
[31m-  /* This algorithm is rather simplistic and assumes quite a bit about[m
[31m-  ** how the bytecode is generated. It works fine for FORI initializers,[m
[31m-  ** but it won't necessarily work in other cases (e.g. iterator arguments).[m
[31m-  ** It doesn't do anything fancy, either (like backpropagating MOVs).[m
[31m-  */[m
[31m-  const BCIns *pc, *startpc = proto_bc(J->pt);[m
[31m-  for (pc = endpc-1; pc > startpc; pc--) {[m
[31m-    BCIns ins = *pc;[m
[31m-    BCOp op = bc_op(ins);[m
[31m-    /* First try to find the last instruction that stores to this slot. */[m
[31m-    if (bcmode_a(op) == BCMbase && bc_a(ins) <= slot) {[m
[31m-      return 0;  /* Multiple results, e.g. from a CALL or KNIL. */[m
[31m-    } else if (bcmode_a(op) == BCMdst && bc_a(ins) == slot) {[m
[31m-      if (op == BC_KSHORT || op == BC_KNUM) {  /* Found const. initializer. */[m
[31m-	/* Now try to verify there's no forward jump across it. */[m
[31m-	const BCIns *kpc = pc;[m
[31m-	for (; pc > startpc; pc--)[m
[31m-	  if (bc_op(*pc) == BC_JMP) {[m
[31m-	    const BCIns *target = pc+bc_j(*pc)+1;[m
[31m-	    if (target > kpc && target <= endpc)[m
[31m-	      return 0;  /* Conditional assignment. */[m
[31m-	  }[m
[31m-	if (op == BC_KSHORT) {[m
[31m-	  int32_t k = (int32_t)(int16_t)bc_d(ins);[m
[31m-	  return t == IRT_INT ? lj_ir_kint(J, k) : lj_ir_knum(J, (lua_Number)k);[m
[31m-	} else {[m
[31m-	  cTValue *tv = proto_knumtv(J->pt, bc_d(ins));[m
[31m-	  if (t == IRT_INT) {[m
[31m-	    int32_t k = numberVint(tv);[m
[31m-	    if (tvisint(tv) || numV(tv) == (lua_Number)k)  /* -0 is ok here. */[m
[31m-	      return lj_ir_kint(J, k);[m
[31m-	    return 0;  /* Type mismatch. */[m
[31m-	  } else {[m
[31m-	    return lj_ir_knum(J, numberVnum(tv));[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-      return 0;  /* Non-constant initializer. */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* No assignment to this slot found? */[m
[31m-}[m
[31m-[m
[31m-/* Load and optionally convert a FORI argument from a slot. */[m
[31m-static TRef fori_load(jit_State *J, BCReg slot, IRType t, int mode)[m
[31m-{[m
[31m-  int conv = (tvisint(&J->L->base[slot]) != (t==IRT_INT)) ? IRSLOAD_CONVERT : 0;[m
[31m-  return sloadt(J, (int32_t)slot,[m
[31m-		t + (((mode & IRSLOAD_TYPECHECK) ||[m
[31m-		      (conv && t == IRT_INT && !(mode >> 16))) ?[m
[31m-		     IRT_GUARD : 0),[m
[31m-		mode + conv);[m
[31m-}[m
[31m-[m
[31m-/* Peek before FORI to find a const initializer. Otherwise load from slot. */[m
[31m-static TRef fori_arg(jit_State *J, const BCIns *fori, BCReg slot,[m
[31m-		     IRType t, int mode)[m
[31m-{[m
[31m-  TRef tr = J->base[slot];[m
[31m-  if (!tr) {[m
[31m-    tr = find_kinit(J, fori, slot, t);[m
[31m-    if (!tr)[m
[31m-      tr = fori_load(J, slot, t, mode);[m
[31m-  }[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Return the direction of the FOR loop iterator.[m
[31m-** It's important to exactly reproduce the semantics of the interpreter.[m
[31m-*/[m
[31m-static int rec_for_direction(cTValue *o)[m
[31m-{[m
[31m-  return (tvisint(o) ? intV(o) : (int32_t)o->u32.hi) >= 0;[m
[31m-}[m
[31m-[m
[31m-/* Simulate the runtime behavior of the FOR loop iterator. */[m
[31m-static LoopEvent rec_for_iter(IROp *op, cTValue *o, int isforl)[m
[31m-{[m
[31m-  lua_Number stopv = numberVnum(&o[FORL_STOP]);[m
[31m-  lua_Number idxv = numberVnum(&o[FORL_IDX]);[m
[31m-  lua_Number stepv = numberVnum(&o[FORL_STEP]);[m
[31m-  if (isforl)[m
[31m-    idxv += stepv;[m
[31m-  if (rec_for_direction(&o[FORL_STEP])) {[m
[31m-    if (idxv <= stopv) {[m
[31m-      *op = IR_LE;[m
[31m-      return idxv + 2*stepv > stopv ? LOOPEV_ENTERLO : LOOPEV_ENTER;[m
[31m-    }[m
[31m-    *op = IR_GT; return LOOPEV_LEAVE;[m
[31m-  } else {[m
[31m-    if (stopv <= idxv) {[m
[31m-      *op = IR_GE;[m
[31m-      return idxv + 2*stepv < stopv ? LOOPEV_ENTERLO : LOOPEV_ENTER;[m
[31m-    }[m
[31m-    *op = IR_LT; return LOOPEV_LEAVE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record checks for FOR loop overflow and step direction. */[m
[31m-static void rec_for_check(jit_State *J, IRType t, int dir,[m
[31m-			  TRef stop, TRef step, int init)[m
[31m-{[m
[31m-  if (!tref_isk(step)) {[m
[31m-    /* Non-constant step: need a guard for the direction. */[m
[31m-    TRef zero = (t == IRT_INT) ? lj_ir_kint(J, 0) : lj_ir_knum_zero(J);[m
[31m-    emitir(IRTG(dir ? IR_GE : IR_LT, t), step, zero);[m
[31m-    /* Add hoistable overflow checks for a narrowed FORL index. */[m
[31m-    if (init && t == IRT_INT) {[m
[31m-      if (tref_isk(stop)) {[m
[31m-	/* Constant stop: optimize check away or to a range check for step. */[m
[31m-	int32_t k = IR(tref_ref(stop))->i;[m
[31m-	if (dir) {[m
[31m-	  if (k > 0)[m
[31m-	    emitir(IRTGI(IR_LE), step, lj_ir_kint(J, (int32_t)0x7fffffff-k));[m
[31m-	} else {[m
[31m-	  if (k < 0)[m
[31m-	    emitir(IRTGI(IR_GE), step, lj_ir_kint(J, (int32_t)0x80000000-k));[m
[31m-	}[m
[31m-      } else {[m
[31m-	/* Stop+step variable: need full overflow check. */[m
[31m-	TRef tr = emitir(IRTGI(IR_ADDOV), step, stop);[m
[31m-	emitir(IRTI(IR_USE), tr, 0);  /* ADDOV is weak. Avoid dead result. */[m
[31m-      }[m
[31m-    }[m
[31m-  } else if (init && t == IRT_INT && !tref_isk(stop)) {[m
[31m-    /* Constant step: optimize overflow check to a range check for stop. */[m
[31m-    int32_t k = IR(tref_ref(step))->i;[m
[31m-    k = (int32_t)(dir ? 0x7fffffff : 0x80000000) - k;[m
[31m-    emitir(IRTGI(dir ? IR_LE : IR_GE), stop, lj_ir_kint(J, k));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record a FORL instruction. */[m
[31m-static void rec_for_loop(jit_State *J, const BCIns *fori, ScEvEntry *scev,[m
[31m-			 int init)[m
[31m-{[m
[31m-  BCReg ra = bc_a(*fori);[m
[31m-  cTValue *tv = &J->L->base[ra];[m
[31m-  TRef idx = J->base[ra+FORL_IDX];[m
[31m-  IRType t = idx ? tref_type(idx) :[m
[31m-	     (init || LJ_DUALNUM) ? lj_opt_narrow_forl(J, tv) : IRT_NUM;[m
[31m-  int mode = IRSLOAD_INHERIT +[m
[31m-    ((!LJ_DUALNUM || tvisint(tv) == (t == IRT_INT)) ? IRSLOAD_READONLY : 0);[m
[31m-  TRef stop = fori_arg(J, fori, ra+FORL_STOP, t, mode);[m
[31m-  TRef step = fori_arg(J, fori, ra+FORL_STEP, t, mode);[m
[31m-  int tc, dir = rec_for_direction(&tv[FORL_STEP]);[m
[31m-  lua_assert(bc_op(*fori) == BC_FORI || bc_op(*fori) == BC_JFORI);[m
[31m-  scev->t.irt = t;[m
[31m-  scev->dir = dir;[m
[31m-  scev->stop = tref_ref(stop);[m
[31m-  scev->step = tref_ref(step);[m
[31m-  rec_for_check(J, t, dir, stop, step, init);[m
[31m-  scev->start = tref_ref(find_kinit(J, fori, ra+FORL_IDX, IRT_INT));[m
[31m-  tc = (LJ_DUALNUM &&[m
[31m-	!(scev->start && irref_isk(scev->stop) && irref_isk(scev->step) &&[m
[31m-	  tvisint(&tv[FORL_IDX]) == (t == IRT_INT))) ?[m
[31m-	IRSLOAD_TYPECHECK : 0;[m
[31m-  if (tc) {[m
[31m-    J->base[ra+FORL_STOP] = stop;[m
[31m-    J->base[ra+FORL_STEP] = step;[m
[31m-  }[m
[31m-  if (!idx)[m
[31m-    idx = fori_load(J, ra+FORL_IDX, t,[m
[31m-		    IRSLOAD_INHERIT + tc + (J->scev.start << 16));[m
[31m-  if (!init)[m
[31m-    J->base[ra+FORL_IDX] = idx = emitir(IRT(IR_ADD, t), idx, step);[m
[31m-  J->base[ra+FORL_EXT] = idx;[m
[31m-  scev->idx = tref_ref(idx);[m
[31m-  setmref(scev->pc, fori);[m
[31m-  J->maxslot = ra+FORL_EXT+1;[m
[31m-}[m
[31m-[m
[31m-/* Record FORL/JFORL or FORI/JFORI. */[m
[31m-static LoopEvent rec_for(jit_State *J, const BCIns *fori, int isforl)[m
[31m-{[m
[31m-  BCReg ra = bc_a(*fori);[m
[31m-  TValue *tv = &J->L->base[ra];[m
[31m-  TRef *tr = &J->base[ra];[m
[31m-  IROp op;[m
[31m-  LoopEvent ev;[m
[31m-  TRef stop;[m
[31m-  IRType t;[m
[31m-  if (isforl) {  /* Handle FORL/JFORL opcodes. */[m
[31m-    TRef idx = tr[FORL_IDX];[m
[31m-    if (mref(J->scev.pc, const BCIns) == fori && tref_ref(idx) == J->scev.idx) {[m
[31m-      t = J->scev.t.irt;[m
[31m-      stop = J->scev.stop;[m
[31m-      idx = emitir(IRT(IR_ADD, t), idx, J->scev.step);[m
[31m-      tr[FORL_EXT] = tr[FORL_IDX] = idx;[m
[31m-    } else {[m
[31m-      ScEvEntry scev;[m
[31m-      rec_for_loop(J, fori, &scev, 0);[m
[31m-      t = scev.t.irt;[m
[31m-      stop = scev.stop;[m
[31m-    }[m
[31m-  } else {  /* Handle FORI/JFORI opcodes. */[m
[31m-    BCReg i;[m
[31m-    lj_meta_for(J->L, tv);[m
[31m-    t = (LJ_DUALNUM || tref_isint(tr[FORL_IDX])) ? lj_opt_narrow_forl(J, tv) :[m
[31m-						   IRT_NUM;[m
[31m-    for (i = FORL_IDX; i <= FORL_STEP; i++) {[m
[31m-      if (!tr[i]) sload(J, ra+i);[m
[31m-      lua_assert(tref_isnumber_str(tr[i]));[m
[31m-      if (tref_isstr(tr[i]))[m
[31m-	tr[i] = emitir(IRTG(IR_STRTO, IRT_NUM), tr[i], 0);[m
[31m-      if (t == IRT_INT) {[m
[31m-	if (!tref_isinteger(tr[i]))[m
[31m-	  tr[i] = emitir(IRTGI(IR_CONV), tr[i], IRCONV_INT_NUM|IRCONV_CHECK);[m
[31m-      } else {[m
[31m-	if (!tref_isnum(tr[i]))[m
[31m-	  tr[i] = emitir(IRTN(IR_CONV), tr[i], IRCONV_NUM_INT);[m
[31m-      }[m
[31m-    }[m
[31m-    tr[FORL_EXT] = tr[FORL_IDX];[m
[31m-    stop = tr[FORL_STOP];[m
[31m-    rec_for_check(J, t, rec_for_direction(&tv[FORL_STEP]),[m
[31m-		  stop, tr[FORL_STEP], 1);[m
[31m-  }[m
[31m-[m
[31m-  ev = rec_for_iter(&op, tv, isforl);[m
[31m-  if (ev == LOOPEV_LEAVE) {[m
[31m-    J->maxslot = ra+FORL_EXT+1;[m
[31m-    J->pc = fori+1;[m
[31m-  } else {[m
[31m-    J->maxslot = ra;[m
[31m-    J->pc = fori+bc_j(*fori)+1;[m
[31m-  }[m
[31m-  lj_snap_add(J);[m
[31m-[m
[31m-  emitir(IRTG(op, t), tr[FORL_IDX], stop);[m
[31m-[m
[31m-  if (ev == LOOPEV_LEAVE) {[m
[31m-    J->maxslot = ra;[m
[31m-    J->pc = fori+bc_j(*fori)+1;[m
[31m-  } else {[m
[31m-    J->maxslot = ra+FORL_EXT+1;[m
[31m-    J->pc = fori+1;[m
[31m-  }[m
[31m-  J->needsnap = 1;[m
[31m-  return ev;[m
[31m-}[m
[31m-[m
[31m-/* Record ITERL/JITERL. */[m
[31m-static LoopEvent rec_iterl(jit_State *J, const BCIns iterins)[m
[31m-{[m
[31m-  BCReg ra = bc_a(iterins);[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-  if (!tref_isnil(getslot(J, ra))) {  /* Looping back? */[m
[31m-    J->base[ra-1] = J->base[ra];  /* Copy result of ITERC to control var. */[m
[31m-    J->maxslot = ra-1+bc_b(J->pc[-1]);[m
[31m-    J->pc += bc_j(iterins)+1;[m
[31m-    return LOOPEV_ENTER;[m
[31m-  } else {[m
[31m-    J->maxslot = ra-3;[m
[31m-    J->pc++;[m
[31m-    return LOOPEV_LEAVE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record LOOP/JLOOP. Now, that was easy. */[m
[31m-static LoopEvent rec_loop(jit_State *J, BCReg ra)[m
[31m-{[m
[31m-  if (ra < J->maxslot) J->maxslot = ra;[m
[31m-  J->pc++;[m
[31m-  return LOOPEV_ENTER;[m
[31m-}[m
[31m-[m
[31m-/* Check if a loop repeatedly failed to trace because it didn't loop back. */[m
[31m-static int innerloopleft(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = 0; i < PENALTY_SLOTS; i++)[m
[31m-    if (mref(J->penalty[i].pc, const BCIns) == pc) {[m
[31m-      if ((J->penalty[i].reason == LJ_TRERR_LLEAVE ||[m
[31m-	   J->penalty[i].reason == LJ_TRERR_LINNER) &&[m
[31m-	  J->penalty[i].val >= 2*PENALTY_MIN)[m
[31m-	return 1;[m
[31m-      break;[m
[31m-    }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Handle the case when an interpreted loop op is hit. */[m
[31m-static void rec_loop_interp(jit_State *J, const BCIns *pc, LoopEvent ev)[m
[31m-{[m
[31m-  if (J->parent == 0 && J->exitno == 0) {[m
[31m-    if (pc == J->startpc && J->framedepth + J->retdepth == 0) {[m
[31m-      /* Same loop? */[m
[31m-      if (ev == LOOPEV_LEAVE)  /* Must loop back to form a root trace. */[m
[31m-	lj_trace_err(J, LJ_TRERR_LLEAVE);[m
[31m-      lj_record_stop(J, LJ_TRLINK_LOOP, J->cur.traceno);  /* Looping trace. */[m
[31m-    } else if (ev != LOOPEV_LEAVE) {  /* Entering inner loop? */[m
[31m-      /* It's usually better to abort here and wait until the inner loop[m
[31m-      ** is traced. But if the inner loop repeatedly didn't loop back,[m
[31m-      ** this indicates a low trip count. In this case try unrolling[m
[31m-      ** an inner loop even in a root trace. But it's better to be a bit[m
[31m-      ** more conservative here and only do it for very short loops.[m
[31m-      */[m
[31m-      if (bc_j(*pc) != -1 && !innerloopleft(J, pc))[m
[31m-	lj_trace_err(J, LJ_TRERR_LINNER);  /* Root trace hit an inner loop. */[m
[31m-      if ((ev != LOOPEV_ENTERLO &&[m
[31m-	   J->loopref && J->cur.nins - J->loopref > 100) || --J->loopunroll < 0)[m
[31m-	lj_trace_err(J, LJ_TRERR_LUNROLL);  /* Limit loop unrolling. */[m
[31m-      J->loopref = J->cur.nins;[m
[31m-    }[m
[31m-  } else if (ev != LOOPEV_LEAVE) {  /* Side trace enters an inner loop. */[m
[31m-    J->loopref = J->cur.nins;[m
[31m-    if (--J->loopunroll < 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_LUNROLL);  /* Limit loop unrolling. */[m
[31m-  }  /* Side trace continues across a loop that's left or not entered. */[m
[31m-}[m
[31m-[m
[31m-/* Handle the case when an already compiled loop op is hit. */[m
[31m-static void rec_loop_jit(jit_State *J, TraceNo lnk, LoopEvent ev)[m
[31m-{[m
[31m-  if (J->parent == 0 && J->exitno == 0) {  /* Root trace hit an inner loop. */[m
[31m-    /* Better let the inner loop spawn a side trace back here. */[m
[31m-    lj_trace_err(J, LJ_TRERR_LINNER);[m
[31m-  } else if (ev != LOOPEV_LEAVE) {  /* Side trace enters a compiled loop. */[m
[31m-    J->instunroll = 0;  /* Cannot continue across a compiled loop op. */[m
[31m-    if (J->pc == J->startpc && J->framedepth + J->retdepth == 0)[m
[31m-      lj_record_stop(J, LJ_TRLINK_LOOP, J->cur.traceno);  /* Form extra loop. */[m
[31m-    else[m
[31m-      lj_record_stop(J, LJ_TRLINK_ROOT, lnk);  /* Link to the loop. */[m
[31m-  }  /* Side trace continues across a loop that's left or not entered. */[m
[31m-}[m
[31m-[m
[31m-/* -- Record profiler hook checks ----------------------------------------- */[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-[m
[31m-/* Need to insert profiler hook check? */[m
[31m-static int rec_profile_need(jit_State *J, GCproto *pt, const BCIns *pc)[m
[31m-{[m
[31m-  GCproto *ppt;[m
[31m-  lua_assert(J->prof_mode == 'f' || J->prof_mode == 'l');[m
[31m-  if (!pt)[m
[31m-    return 0;[m
[31m-  ppt = J->prev_pt;[m
[31m-  J->prev_pt = pt;[m
[31m-  if (pt != ppt && ppt) {[m
[31m-    J->prev_line = -1;[m
[31m-    return 1;[m
[31m-  }[m
[31m-  if (J->prof_mode == 'l') {[m
[31m-    BCLine line = lj_debug_line(pt, proto_bcpos(pt, pc));[m
[31m-    BCLine pline = J->prev_line;[m
[31m-    J->prev_line = line;[m
[31m-    if (pline != line)[m
[31m-      return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static void rec_profile_ins(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  if (J->prof_mode && rec_profile_need(J, J->pt, pc)) {[m
[31m-    emitir(IRTG(IR_PROF, IRT_NIL), 0, 0);[m
[31m-    lj_snap_add(J);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void rec_profile_ret(jit_State *J)[m
[31m-{[m
[31m-  if (J->prof_mode == 'f') {[m
[31m-    emitir(IRTG(IR_PROF, IRT_NIL), 0, 0);[m
[31m-    J->prev_pt = NULL;[m
[31m-    lj_snap_add(J);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* -- Record calls and returns -------------------------------------------- */[m
[31m-[m
[31m-/* Specialize to the runtime value of the called function or its prototype. */[m
[31m-static TRef rec_call_specialize(jit_State *J, GCfunc *fn, TRef tr)[m
[31m-{[m
[31m-  TRef kfunc;[m
[31m-  if (isluafunc(fn)) {[m
[31m-    GCproto *pt = funcproto(fn);[m
[31m-    /* Too many closures created? Probably not a monomorphic function. */[m
[31m-    if (pt->flags >= PROTO_CLC_POLY) {  /* Specialize to prototype instead. */[m
[31m-      TRef trpt = emitir(IRT(IR_FLOAD, IRT_P32), tr, IRFL_FUNC_PC);[m
[31m-      emitir(IRTG(IR_EQ, IRT_P32), trpt, lj_ir_kptr(J, proto_bc(pt)));[m
[31m-      (void)lj_ir_kgc(J, obj2gco(pt), IRT_PROTO);  /* Prevent GC of proto. */[m
[31m-      return tr;[m
[31m-    }[m
[31m-  } else {[m
[31m-    /* Don't specialize to non-monomorphic builtins. */[m
[31m-    switch (fn->c.ffid) {[m
[31m-    case FF_coroutine_wrap_aux:[m
[31m-    case FF_string_gmatch_aux:[m
[31m-      /* NYI: io_file_iter doesn't have an ffid, yet. */[m
[31m-      {  /* Specialize to the ffid. */[m
[31m-	TRef trid = emitir(IRT(IR_FLOAD, IRT_U8), tr, IRFL_FUNC_FFID);[m
[31m-	emitir(IRTG(IR_EQ, IRT_INT), trid, lj_ir_kint(J, fn->c.ffid));[m
[31m-      }[m
[31m-      return tr;[m
[31m-    default:[m
[31m-      /* NYI: don't specialize to non-monomorphic C functions. */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Otherwise specialize to the function (closure) value itself. */[m
[31m-  kfunc = lj_ir_kfunc(J, fn);[m
[31m-  emitir(IRTG(IR_EQ, IRT_FUNC), tr, kfunc);[m
[31m-  return kfunc;[m
[31m-}[m
[31m-[m
[31m-/* Record call setup. */[m
[31m-static void rec_call_setup(jit_State *J, BCReg func, ptrdiff_t nargs)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  TValue *functv = &J->L->base[func];[m
[31m-  TRef *fbase = &J->base[func];[m
[31m-  ptrdiff_t i;[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-  for (i = 0; i <= nargs; i++)[m
[31m-    (void)getslot(J, func+i);  /* Ensure func and all args have a reference. */[m
[31m-  if (!tref_isfunc(fbase[0])) {  /* Resolve __call metamethod. */[m
[31m-    ix.tab = fbase[0];[m
[31m-    copyTV(J->L, &ix.tabv, functv);[m
[31m-    if (!lj_record_mm_lookup(J, &ix, MM_call) || !tref_isfunc(ix.mobj))[m
[31m-      lj_trace_err(J, LJ_TRERR_NOMM);[m
[31m-    for (i = ++nargs; i > 0; i--)  /* Shift arguments up. */[m
[31m-      fbase[i] = fbase[i-1];[m
[31m-    fbase[0] = ix.mobj;  /* Replace function. */[m
[31m-    functv = &ix.mobjv;[m
[31m-  }[m
[31m-  fbase[0] = TREF_FRAME | rec_call_specialize(J, funcV(functv), fbase[0]);[m
[31m-  J->maxslot = (BCReg)nargs;[m
[31m-}[m
[31m-[m
[31m-/* Record call. */[m
[31m-void lj_record_call(jit_State *J, BCReg func, ptrdiff_t nargs)[m
[31m-{[m
[31m-  rec_call_setup(J, func, nargs);[m
[31m-  /* Bump frame. */[m
[31m-  J->framedepth++;[m
[31m-  J->base += func+1;[m
[31m-  J->baseslot += func+1;[m
[31m-}[m
[31m-[m
[31m-/* Record tail call. */[m
[31m-void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs)[m
[31m-{[m
[31m-  rec_call_setup(J, func, nargs);[m
[31m-  if (frame_isvarg(J->L->base - 1)) {[m
[31m-    BCReg cbase = (BCReg)frame_delta(J->L->base - 1);[m
[31m-    if (--J->framedepth < 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);[m
[31m-    J->baseslot -= (BCReg)cbase;[m
[31m-    J->base -= cbase;[m
[31m-    func += cbase;[m
[31m-  }[m
[31m-  /* Move func + args down. */[m
[31m-  memmove(&J->base[-1], &J->base[func], sizeof(TRef)*(J->maxslot+1));[m
[31m-  /* Note: the new TREF_FRAME is now at J->base[-1] (even for slot #0). */[m
[31m-  /* Tailcalls can form a loop, so count towards the loop unroll limit. */[m
[31m-  if (++J->tailcalled > J->loopunroll)[m
[31m-    lj_trace_err(J, LJ_TRERR_LUNROLL);[m
[31m-}[m
[31m-[m
[31m-/* Check unroll limits for down-recursion. */[m
[31m-static int check_downrec_unroll(jit_State *J, GCproto *pt)[m
[31m-{[m
[31m-  IRRef ptref;[m
[31m-  for (ptref = J->chain[IR_KGC]; ptref; ptref = IR(ptref)->prev)[m
[31m-    if (ir_kgc(IR(ptref)) == obj2gco(pt)) {[m
[31m-      int count = 0;[m
[31m-      IRRef ref;[m
[31m-      for (ref = J->chain[IR_RETF]; ref; ref = IR(ref)->prev)[m
[31m-	if (IR(ref)->op1 == ptref)[m
[31m-	  count++;[m
[31m-      if (count) {[m
[31m-	if (J->pc == J->startpc) {[m
[31m-	  if (count + J->tailcalled > J->param[JIT_P_recunroll])[m
[31m-	    return 1;[m
[31m-	} else {[m
[31m-	  lj_trace_err(J, LJ_TRERR_DOWNREC);[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static TRef rec_cat(jit_State *J, BCReg baseslot, BCReg topslot);[m
[31m-[m
[31m-/* Record return. */[m
[31m-void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)[m
[31m-{[m
[31m-  TValue *frame = J->L->base - 1;[m
[31m-  ptrdiff_t i;[m
[31m-  for (i = 0; i < gotresults; i++)[m
[31m-    (void)getslot(J, rbase+i);  /* Ensure all results have a reference. */[m
[31m-  while (frame_ispcall(frame)) {  /* Immediately resolve pcall() returns. */[m
[31m-    BCReg cbase = (BCReg)frame_delta(frame);[m
[31m-    if (--J->framedepth < 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);[m
[31m-    lua_assert(J->baseslot > 1);[m
[31m-    gotresults++;[m
[31m-    rbase += cbase;[m
[31m-    J->baseslot -= (BCReg)cbase;[m
[31m-    J->base -= cbase;[m
[31m-    J->base[--rbase] = TREF_TRUE;  /* Prepend true to results. */[m
[31m-    frame = frame_prevd(frame);[m
[31m-  }[m
[31m-  /* Return to lower frame via interpreter for unhandled cases. */[m
[31m-  if (J->framedepth == 0 && J->pt && bc_isret(bc_op(*J->pc)) &&[m
[31m-       (!frame_islua(frame) ||[m
[31m-	(J->parent == 0 && J->exitno == 0 &&[m
[31m-	 !bc_isret(bc_op(J->cur.startins))))) {[m
[31m-    /* NYI: specialize to frame type and return directly, not via RET*. */[m
[31m-    for (i = 0; i < (ptrdiff_t)rbase; i++)[m
[31m-      J->base[i] = 0;  /* Purge dead slots. */[m
[31m-    J->maxslot = rbase + (BCReg)gotresults;[m
[31m-    lj_record_stop(J, LJ_TRLINK_RETURN, 0);  /* Return to interpreter. */[m
[31m-    return;[m
[31m-  }[m
[31m-  if (frame_isvarg(frame)) {[m
[31m-    BCReg cbase = (BCReg)frame_delta(frame);[m
[31m-    if (--J->framedepth < 0)  /* NYI: return of vararg func to lower frame. */[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);[m
[31m-    lua_assert(J->baseslot > 1);[m
[31m-    rbase += cbase;[m
[31m-    J->baseslot -= (BCReg)cbase;[m
[31m-    J->base -= cbase;[m
[31m-    frame = frame_prevd(frame);[m
[31m-  }[m
[31m-  if (frame_islua(frame)) {  /* Return to Lua frame. */[m
[31m-    BCIns callins = *(frame_pc(frame)-1);[m
[31m-    ptrdiff_t nresults = bc_b(callins) ? (ptrdiff_t)bc_b(callins)-1 :gotresults;[m
[31m-    BCReg cbase = bc_a(callins);[m
[31m-    GCproto *pt = funcproto(frame_func(frame - (cbase+1-LJ_FR2)));[m
[31m-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame teardown. */[m
[31m-    if ((pt->flags & PROTO_NOJIT))[m
[31m-      lj_trace_err(J, LJ_TRERR_CJITOFF);[m
[31m-    if (J->framedepth == 0 && J->pt && frame == J->L->base - 1) {[m
[31m-      if (check_downrec_unroll(J, pt)) {[m
[31m-	J->maxslot = (BCReg)(rbase + gotresults);[m
[31m-	lj_snap_purge(J);[m
[31m-	lj_record_stop(J, LJ_TRLINK_DOWNREC, J->cur.traceno);  /* Down-rec. */[m
[31m-	return;[m
[31m-      }[m
[31m-      lj_snap_add(J);[m
[31m-    }[m
[31m-    for (i = 0; i < nresults; i++)  /* Adjust results. */[m
[31m-      J->base[i-1] = i < gotresults ? J->base[rbase+i] : TREF_NIL;[m
[31m-    J->maxslot = cbase+(BCReg)nresults;[m
[31m-    if (J->framedepth > 0) {  /* Return to a frame that is part of the trace. */[m
[31m-      J->framedepth--;[m
[31m-      lua_assert(J->baseslot > cbase+1);[m
[31m-      J->baseslot -= cbase+1;[m
[31m-      J->base -= cbase+1;[m
[31m-    } else if (J->parent == 0 && J->exitno == 0 &&[m
[31m-	       !bc_isret(bc_op(J->cur.startins))) {[m
[31m-      /* Return to lower frame would leave the loop in a root trace. */[m
[31m-      lj_trace_err(J, LJ_TRERR_LLEAVE);[m
[31m-    } else if (J->needsnap) {  /* Tailcalled to ff with side-effects. */[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);  /* No way to insert snapshot here. */[m
[31m-    } else {  /* Return to lower frame. Guard for the target we return to. */[m
[31m-      TRef trpt = lj_ir_kgc(J, obj2gco(pt), IRT_PROTO);[m
[31m-      TRef trpc = lj_ir_kptr(J, (void *)frame_pc(frame));[m
[31m-      emitir(IRTG(IR_RETF, IRT_P32), trpt, trpc);[m
[31m-      J->retdepth++;[m
[31m-      J->needsnap = 1;[m
[31m-      lua_assert(J->baseslot == 1);[m
[31m-      /* Shift result slots up and clear the slots of the new frame below. */[m
[31m-      memmove(J->base + cbase, J->base-1, sizeof(TRef)*nresults);[m
[31m-      memset(J->base-1, 0, sizeof(TRef)*(cbase+1));[m
[31m-    }[m
[31m-  } else if (frame_iscont(frame)) {  /* Return to continuation frame. */[m
[31m-    ASMFunction cont = frame_contf(frame);[m
[31m-    BCReg cbase = (BCReg)frame_delta(frame);[m
[31m-    if ((J->framedepth -= 2) < 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_NYIRETL);[m
[31m-    J->baseslot -= (BCReg)cbase;[m
[31m-    J->base -= cbase;[m
[31m-    J->maxslot = cbase-2;[m
[31m-    if (cont == lj_cont_ra) {[m
[31m-      /* Copy result to destination slot. */[m
[31m-      BCReg dst = bc_a(*(frame_contpc(frame)-1));[m
[31m-      J->base[dst] = gotresults ? J->base[cbase+rbase] : TREF_NIL;[m
[31m-      if (dst >= J->maxslot) J->maxslot = dst+1;[m
[31m-    } else if (cont == lj_cont_nop) {[m
[31m-      /* Nothing to do here. */[m
[31m-    } else if (cont == lj_cont_cat) {[m
[31m-      BCReg bslot = bc_b(*(frame_contpc(frame)-1));[m
[31m-      TRef tr = gotresults ? J->base[cbase+rbase] : TREF_NIL;[m
[31m-      if (bslot != cbase-2) {  /* Concatenate the remainder. */[m
[31m-	TValue *b = J->L->base, save;  /* Simulate lower frame and result. */[m
[31m-	J->base[cbase-2] = tr;[m
[31m-	copyTV(J->L, &save, b-2);[m
[31m-	if (gotresults) copyTV(J->L, b-2, b+rbase); else setnilV(b-2);[m
[31m-	J->L->base = b - cbase;[m
[31m-	tr = rec_cat(J, bslot, cbase-2);[m
[31m-	b = J->L->base + cbase;  /* Undo. */[m
[31m-	J->L->base = b;[m
[31m-	copyTV(J->L, b-2, &save);[m
[31m-      }[m
[31m-      if (tr) {  /* Store final result. */[m
[31m-	BCReg dst = bc_a(*(frame_contpc(frame)-1));[m
[31m-	J->base[dst] = tr;[m
[31m-	if (dst >= J->maxslot) J->maxslot = dst+1;[m
[31m-      }  /* Otherwise continue with another __concat call. */[m
[31m-    } else {[m
[31m-      /* Result type already specialized. */[m
[31m-      lua_assert(cont == lj_cont_condf || cont == lj_cont_condt);[m
[31m-    }[m
[31m-  } else {[m
[31m-    lj_trace_err(J, LJ_TRERR_NYIRETL);  /* NYI: handle return to C frame. */[m
[31m-  }[m
[31m-  lua_assert(J->baseslot >= 1);[m
[31m-}[m
[31m-[m
[31m-/* -- Metamethod handling ------------------------------------------------- */[m
[31m-[m
[31m-/* Prepare to record call to metamethod. */[m
[31m-static BCReg rec_mm_prep(jit_State *J, ASMFunction cont)[m
[31m-{[m
[31m-  BCReg s, top = cont == lj_cont_cat ? J->maxslot : curr_proto(J->L)->framesize;[m
[31m-  J->base[top] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;[m
[31m-  J->framedepth++;[m
[31m-  for (s = J->maxslot; s < top; s++)[m
[31m-    J->base[s] = 0;  /* Clear frame gap to avoid resurrecting previous refs. */[m
[31m-  return top+1;[m
[31m-}[m
[31m-[m
[31m-/* Record metamethod lookup. */[m
[31m-int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm)[m
[31m-{[m
[31m-  RecordIndex mix;[m
[31m-  GCtab *mt;[m
[31m-  if (tref_istab(ix->tab)) {[m
[31m-    mt = tabref(tabV(&ix->tabv)->metatable);[m
[31m-    mix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_TAB_META);[m
[31m-  } else if (tref_isudata(ix->tab)) {[m
[31m-    int udtype = udataV(&ix->tabv)->udtype;[m
[31m-    mt = tabref(udataV(&ix->tabv)->metatable);[m
[31m-    /* The metatables of special userdata objects are treated as immutable. */[m
[31m-    if (udtype != UDTYPE_USERDATA) {[m
[31m-      cTValue *mo;[m
[31m-      if (LJ_HASFFI && udtype == UDTYPE_FFI_CLIB) {[m
[31m-	/* Specialize to the C library namespace object. */[m
[31m-	emitir(IRTG(IR_EQ, IRT_P32), ix->tab, lj_ir_kptr(J, udataV(&ix->tabv)));[m
[31m-      } else {[m
[31m-	/* Specialize to the type of userdata. */[m
[31m-	TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), ix->tab, IRFL_UDATA_UDTYPE);[m
[31m-	emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, udtype));[m
[31m-      }[m
[31m-  immutable_mt:[m
[31m-      mo = lj_tab_getstr(mt, mmname_str(J2G(J), mm));[m
[31m-      if (!mo || tvisnil(mo))[m
[31m-	return 0;  /* No metamethod. */[m
[31m-      /* Treat metamethod or index table as immutable, too. */[m
[31m-      if (!(tvisfunc(mo) || tvistab(mo)))[m
[31m-	lj_trace_err(J, LJ_TRERR_BADTYPE);[m
[31m-      copyTV(J->L, &ix->mobjv, mo);[m
[31m-      ix->mobj = lj_ir_kgc(J, gcV(mo), tvisfunc(mo) ? IRT_FUNC : IRT_TAB);[m
[31m-      ix->mtv = mt;[m
[31m-      ix->mt = TREF_NIL;  /* Dummy value for comparison semantics. */[m
[31m-      return 1;  /* Got metamethod or index table. */[m
[31m-    }[m
[31m-    mix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_UDATA_META);[m
[31m-  } else {[m
[31m-    /* Specialize to base metatable. Must flush mcode in lua_setmetatable(). */[m
[31m-    mt = tabref(basemt_obj(J2G(J), &ix->tabv));[m
[31m-    if (mt == NULL) {[m
[31m-      ix->mt = TREF_NIL;[m
[31m-      return 0;  /* No metamethod. */[m
[31m-    }[m
[31m-    /* The cdata metatable is treated as immutable. */[m
[31m-    if (LJ_HASFFI && tref_iscdata(ix->tab)) goto immutable_mt;[m
[31m-    ix->mt = mix.tab = lj_ir_ktab(J, mt);[m
[31m-    goto nocheck;[m
[31m-  }[m
[31m-  ix->mt = mt ? mix.tab : TREF_NIL;[m
[31m-  emitir(IRTG(mt ? IR_NE : IR_EQ, IRT_TAB), mix.tab, lj_ir_knull(J, IRT_TAB));[m
[31m-nocheck:[m
[31m-  if (mt) {[m
[31m-    GCstr *mmstr = mmname_str(J2G(J), mm);[m
[31m-    cTValue *mo = lj_tab_getstr(mt, mmstr);[m
[31m-    if (mo && !tvisnil(mo))[m
[31m-      copyTV(J->L, &ix->mobjv, mo);[m
[31m-    ix->mtv = mt;[m
[31m-    settabV(J->L, &mix.tabv, mt);[m
[31m-    setstrV(J->L, &mix.keyv, mmstr);[m
[31m-    mix.key = lj_ir_kstr(J, mmstr);[m
[31m-    mix.val = 0;[m
[31m-    mix.idxchain = 0;[m
[31m-    ix->mobj = lj_record_idx(J, &mix);[m
[31m-    return !tref_isnil(ix->mobj);  /* 1 if metamethod found, 0 if not. */[m
[31m-  }[m
[31m-  return 0;  /* No metamethod. */[m
[31m-}[m
[31m-[m
[31m-/* Record call to arithmetic metamethod. */[m
[31m-static TRef rec_mm_arith(jit_State *J, RecordIndex *ix, MMS mm)[m
[31m-{[m
[31m-  /* Set up metamethod call first to save ix->tab and ix->tabv. */[m
[31m-  BCReg func = rec_mm_prep(J, mm == MM_concat ? lj_cont_cat : lj_cont_ra);[m
[31m-  TRef *base = J->base + func;[m
[31m-  TValue *basev = J->L->base + func;[m
[31m-  base[1] = ix->tab; base[2] = ix->key;[m
[31m-  copyTV(J->L, basev+1, &ix->tabv);[m
[31m-  copyTV(J->L, basev+2, &ix->keyv);[m
[31m-  if (!lj_record_mm_lookup(J, ix, mm)) {  /* Lookup mm on 1st operand. */[m
[31m-    if (mm != MM_unm) {[m
[31m-      ix->tab = ix->key;[m
[31m-      copyTV(J->L, &ix->tabv, &ix->keyv);[m
[31m-      if (lj_record_mm_lookup(J, ix, mm))  /* Lookup mm on 2nd operand. */[m
[31m-	goto ok;[m
[31m-    }[m
[31m-    lj_trace_err(J, LJ_TRERR_NOMM);[m
[31m-  }[m
[31m-ok:[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-  base[0] = ix->mobj;[m
[31m-  copyTV(J->L, basev+0, &ix->mobjv);[m
[31m-  lj_record_call(J, func, 2);[m
[31m-  return 0;  /* No result yet. */[m
[31m-}[m
[31m-[m
[31m-/* Record call to __len metamethod. */[m
[31m-static TRef rec_mm_len(jit_State *J, TRef tr, TValue *tv)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  ix.tab = tr;[m
[31m-  copyTV(J->L, &ix.tabv, tv);[m
[31m-  if (lj_record_mm_lookup(J, &ix, MM_len)) {[m
[31m-    BCReg func = rec_mm_prep(J, lj_cont_ra);[m
[31m-    TRef *base = J->base + func;[m
[31m-    TValue *basev = J->L->base + func;[m
[31m-    lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-    base[0] = ix.mobj; copyTV(J->L, basev+0, &ix.mobjv);[m
[31m-    base[1] = tr; copyTV(J->L, basev+1, tv);[m
[31m-#if LJ_52[m
[31m-    base[2] = tr; copyTV(J->L, basev+2, tv);[m
[31m-#else[m
[31m-    base[2] = TREF_NIL; setnilV(basev+2);[m
[31m-#endif[m
[31m-    lj_record_call(J, func, 2);[m
[31m-  } else {[m
[31m-    if (LJ_52 && tref_istab(tr))[m
[31m-      return lj_ir_call(J, IRCALL_lj_tab_len, tr);[m
[31m-    lj_trace_err(J, LJ_TRERR_NOMM);[m
[31m-  }[m
[31m-  return 0;  /* No result yet. */[m
[31m-}[m
[31m-[m
[31m-/* Call a comparison metamethod. */[m
[31m-static void rec_mm_callcomp(jit_State *J, RecordIndex *ix, int op)[m
[31m-{[m
[31m-  BCReg func = rec_mm_prep(J, (op&1) ? lj_cont_condf : lj_cont_condt);[m
[31m-  TRef *base = J->base + func;[m
[31m-  TValue *tv = J->L->base + func;[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-  base[0] = ix->mobj; base[1] = ix->val; base[2] = ix->key;[m
[31m-  copyTV(J->L, tv+0, &ix->mobjv);[m
[31m-  copyTV(J->L, tv+1, &ix->valv);[m
[31m-  copyTV(J->L, tv+2, &ix->keyv);[m
[31m-  lj_record_call(J, func, 2);[m
[31m-}[m
[31m-[m
[31m-/* Record call to equality comparison metamethod (for tab and udata only). */[m
[31m-static void rec_mm_equal(jit_State *J, RecordIndex *ix, int op)[m
[31m-{[m
[31m-  ix->tab = ix->val;[m
[31m-  copyTV(J->L, &ix->tabv, &ix->valv);[m
[31m-  if (lj_record_mm_lookup(J, ix, MM_eq)) {  /* Lookup mm on 1st operand. */[m
[31m-    cTValue *bv;[m
[31m-    TRef mo1 = ix->mobj;[m
[31m-    TValue mo1v;[m
[31m-    copyTV(J->L, &mo1v, &ix->mobjv);[m
[31m-    /* Avoid the 2nd lookup and the objcmp if the metatables are equal. */[m
[31m-    bv = &ix->keyv;[m
[31m-    if (tvistab(bv) && tabref(tabV(bv)->metatable) == ix->mtv) {[m
[31m-      TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_TAB_META);[m
[31m-      emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt);[m
[31m-    } else if (tvisudata(bv) && tabref(udataV(bv)->metatable) == ix->mtv) {[m
[31m-      TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_UDATA_META);[m
[31m-      emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt);[m
[31m-    } else {  /* Lookup metamethod on 2nd operand and compare both. */[m
[31m-      ix->tab = ix->key;[m
[31m-      copyTV(J->L, &ix->tabv, bv);[m
[31m-      if (!lj_record_mm_lookup(J, ix, MM_eq) ||[m
[31m-	  lj_record_objcmp(J, mo1, ix->mobj, &mo1v, &ix->mobjv))[m
[31m-	return;[m
[31m-    }[m
[31m-    rec_mm_callcomp(J, ix, op);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record call to ordered comparison metamethods (for arbitrary objects). */[m
[31m-static void rec_mm_comp(jit_State *J, RecordIndex *ix, int op)[m
[31m-{[m
[31m-  ix->tab = ix->val;[m
[31m-  copyTV(J->L, &ix->tabv, &ix->valv);[m
[31m-  while (1) {[m
[31m-    MMS mm = (op & 2) ? MM_le : MM_lt;  /* Try __le + __lt or only __lt. */[m
[31m-#if LJ_52[m
[31m-    if (!lj_record_mm_lookup(J, ix, mm)) {  /* Lookup mm on 1st operand. */[m
[31m-      ix->tab = ix->key;[m
[31m-      copyTV(J->L, &ix->tabv, &ix->keyv);[m
[31m-      if (!lj_record_mm_lookup(J, ix, mm))  /* Lookup mm on 2nd operand. */[m
[31m-	goto nomatch;[m
[31m-    }[m
[31m-    rec_mm_callcomp(J, ix, op);[m
[31m-    return;[m
[31m-#else[m
[31m-    if (lj_record_mm_lookup(J, ix, mm)) {  /* Lookup mm on 1st operand. */[m
[31m-      cTValue *bv;[m
[31m-      TRef mo1 = ix->mobj;[m
[31m-      TValue mo1v;[m
[31m-      copyTV(J->L, &mo1v, &ix->mobjv);[m
[31m-      /* Avoid the 2nd lookup and the objcmp if the metatables are equal. */[m
[31m-      bv = &ix->keyv;[m
[31m-      if (tvistab(bv) && tabref(tabV(bv)->metatable) == ix->mtv) {[m
[31m-	TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_TAB_META);[m
[31m-	emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt);[m
[31m-      } else if (tvisudata(bv) && tabref(udataV(bv)->metatable) == ix->mtv) {[m
[31m-	TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_UDATA_META);[m
[31m-	emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt);[m
[31m-      } else {  /* Lookup metamethod on 2nd operand and compare both. */[m
[31m-	ix->tab = ix->key;[m
[31m-	copyTV(J->L, &ix->tabv, bv);[m
[31m-	if (!lj_record_mm_lookup(J, ix, mm) ||[m
[31m-	    lj_record_objcmp(J, mo1, ix->mobj, &mo1v, &ix->mobjv))[m
[31m-	  goto nomatch;[m
[31m-      }[m
[31m-      rec_mm_callcomp(J, ix, op);[m
[31m-      return;[m
[31m-    }[m
[31m-#endif[m
[31m-  nomatch:[m
[31m-    /* Lookup failed. Retry with  __lt and swapped operands. */[m
[31m-    if (!(op & 2)) break;  /* Already at __lt. Interpreter will throw. */[m
[31m-    ix->tab = ix->key; ix->key = ix->val; ix->val = ix->tab;[m
[31m-    copyTV(J->L, &ix->tabv, &ix->keyv);[m
[31m-    copyTV(J->L, &ix->keyv, &ix->valv);[m
[31m-    copyTV(J->L, &ix->valv, &ix->tabv);[m
[31m-    op ^= 3;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Setup call to cdata comparison metamethod. */[m
[31m-static void rec_mm_comp_cdata(jit_State *J, RecordIndex *ix, int op, MMS mm)[m
[31m-{[m
[31m-  lj_snap_add(J);[m
[31m-  if (tref_iscdata(ix->val)) {[m
[31m-    ix->tab = ix->val;[m
[31m-    copyTV(J->L, &ix->tabv, &ix->valv);[m
[31m-  } else {[m
[31m-    lua_assert(tref_iscdata(ix->key));[m
[31m-    ix->tab = ix->key;[m
[31m-    copyTV(J->L, &ix->tabv, &ix->keyv);[m
[31m-  }[m
[31m-  lj_record_mm_lookup(J, ix, mm);[m
[31m-  rec_mm_callcomp(J, ix, op);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* -- Indexed access ------------------------------------------------------ */[m
[31m-[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-/* Bump table allocations in bytecode when they grow during recording. */[m
[31m-static void rec_idx_bump(jit_State *J, RecordIndex *ix)[m
[31m-{[m
[31m-  RBCHashEntry *rbc = &J->rbchash[(ix->tab & (RBCHASH_SLOTS-1))];[m
[31m-  if (tref_ref(ix->tab) == rbc->ref) {[m
[31m-    const BCIns *pc = mref(rbc->pc, const BCIns);[m
[31m-    GCtab *tb = tabV(&ix->tabv);[m
[31m-    uint32_t nhbits;[m
[31m-    IRIns *ir;[m
[31m-    if (!tvisnil(&ix->keyv))[m
[31m-      (void)lj_tab_set(J->L, tb, &ix->keyv);  /* Grow table right now. */[m
[31m-    nhbits = tb->hmask > 0 ? lj_fls(tb->hmask)+1 : 0;[m
[31m-    ir = IR(tref_ref(ix->tab));[m
[31m-    if (ir->o == IR_TNEW) {[m
[31m-      uint32_t ah = bc_d(*pc);[m
[31m-      uint32_t asize = ah & 0x7ff, hbits = ah >> 11;[m
[31m-      if (nhbits > hbits) hbits = nhbits;[m
[31m-      if (tb->asize > asize) {[m
[31m-	asize = tb->asize <= 0x7ff ? tb->asize : 0x7ff;[m
[31m-      }[m
[31m-      if ((asize | (hbits<<11)) != ah) {  /* Has the size changed? */[m
[31m-	/* Patch bytecode, but continue recording (for more patching). */[m
[31m-	setbc_d(pc, (asize | (hbits<<11)));[m
[31m-	/* Patching TNEW operands is only safe if the trace is aborted. */[m
[31m-	ir->op1 = asize; ir->op2 = hbits;[m
[31m-	J->retryrec = 1;  /* Abort the trace at the end of recording. */[m
[31m-      }[m
[31m-    } else if (ir->o == IR_TDUP) {[m
[31m-      GCtab *tpl = gco2tab(proto_kgc(&gcref(rbc->pt)->pt, ~(ptrdiff_t)bc_d(*pc)));[m
[31m-      /* Grow template table, but preserve keys with nil values. */[m
[31m-      if ((tb->asize > tpl->asize && (1u << nhbits)-1 == tpl->hmask) ||[m
[31m-	  (tb->asize == tpl->asize && (1u << nhbits)-1 > tpl->hmask)) {[m
[31m-	Node *node = noderef(tpl->node);[m
[31m-	uint32_t i, hmask = tpl->hmask, asize;[m
[31m-	TValue *array;[m
[31m-	for (i = 0; i <= hmask; i++) {[m
[31m-	  if (!tvisnil(&node[i].key) && tvisnil(&node[i].val))[m
[31m-	    settabV(J->L, &node[i].val, tpl);[m
[31m-	}[m
[31m-	if (!tvisnil(&ix->keyv) && tref_isk(ix->key)) {[m
[31m-	  TValue *o = lj_tab_set(J->L, tpl, &ix->keyv);[m
[31m-	  if (tvisnil(o)) settabV(J->L, o, tpl);[m
[31m-	}[m
[31m-	lj_tab_resize(J->L, tpl, tb->asize, nhbits);[m
[31m-	node = noderef(tpl->node);[m
[31m-	hmask = tpl->hmask;[m
[31m-	for (i = 0; i <= hmask; i++) {[m
[31m-	  /* This is safe, since template tables only hold immutable values. */[m
[31m-	  if (tvistab(&node[i].val))[m
[31m-	    setnilV(&node[i].val);[m
[31m-	}[m
[31m-	/* The shape of the table may have changed. Clean up array part, too. */[m
[31m-	asize = tpl->asize;[m
[31m-	array = tvref(tpl->array);[m
[31m-	for (i = 0; i < asize; i++) {[m
[31m-	  if (tvistab(&array[i]))[m
[31m-	    setnilV(&array[i]);[m
[31m-	}[m
[31m-	J->retryrec = 1;  /* Abort the trace at the end of recording. */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Record bounds-check. */[m
[31m-static void rec_idx_abc(jit_State *J, TRef asizeref, TRef ikey, uint32_t asize)[m
[31m-{[m
[31m-  /* Try to emit invariant bounds checks. */[m
[31m-  if ((J->flags & (JIT_F_OPT_LOOP|JIT_F_OPT_ABC)) ==[m
[31m-      (JIT_F_OPT_LOOP|JIT_F_OPT_ABC)) {[m
[31m-    IRRef ref = tref_ref(ikey);[m
[31m-    IRIns *ir = IR(ref);[m
[31m-    int32_t ofs = 0;[m
[31m-    IRRef ofsref = 0;[m
[31m-    /* Handle constant offsets. */[m
[31m-    if (ir->o == IR_ADD && irref_isk(ir->op2)) {[m
[31m-      ofsref = ir->op2;[m
[31m-      ofs = IR(ofsref)->i;[m
[31m-      ref = ir->op1;[m
[31m-      ir = IR(ref);[m
[31m-    }[m
[31m-    /* Got scalar evolution analysis results for this reference? */[m
[31m-    if (ref == J->scev.idx) {[m
[31m-      int32_t stop;[m
[31m-      lua_assert(irt_isint(J->scev.t) && ir->o == IR_SLOAD);[m
[31m-      stop = numberVint(&(J->L->base - J->baseslot)[ir->op1 + FORL_STOP]);[m
[31m-      /* Runtime value for stop of loop is within bounds? */[m
[31m-      if ((uint64_t)stop + ofs < (uint64_t)asize) {[m
[31m-	/* Emit invariant bounds check for stop. */[m
[31m-	emitir(IRTG(IR_ABC, IRT_P32), asizeref, ofs == 0 ? J->scev.stop :[m
[31m-	       emitir(IRTI(IR_ADD), J->scev.stop, ofsref));[m
[31m-	/* Emit invariant bounds check for start, if not const or negative. */[m
[31m-	if (!(J->scev.dir && J->scev.start &&[m
[31m-	      (int64_t)IR(J->scev.start)->i + ofs >= 0))[m
[31m-	  emitir(IRTG(IR_ABC, IRT_P32), asizeref, ikey);[m
[31m-	return;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  emitir(IRTGI(IR_ABC), asizeref, ikey);  /* Emit regular bounds check. */[m
[31m-}[m
[31m-[m
[31m-/* Record indexed key lookup. */[m
[31m-static TRef rec_idx_key(jit_State *J, RecordIndex *ix, IRRef *rbref,[m
[31m-			IRType1 *rbguard)[m
[31m-{[m
[31m-  TRef key;[m
[31m-  GCtab *t = tabV(&ix->tabv);[m
[31m-  ix->oldv = lj_tab_get(J->L, t, &ix->keyv);  /* Lookup previous value. */[m
[31m-  *rbref = 0;[m
[31m-  rbguard->irt = 0;[m
[31m-[m
[31m-  /* Integer keys are looked up in the array part first. */[m
[31m-  key = ix->key;[m
[31m-  if (tref_isnumber(key)) {[m
[31m-    int32_t k = numberVint(&ix->keyv);[m
[31m-    if (!tvisint(&ix->keyv) && numV(&ix->keyv) != (lua_Number)k)[m
[31m-      k = LJ_MAX_ASIZE;[m
[31m-    if ((MSize)k < LJ_MAX_ASIZE) {  /* Potential array key? */[m
[31m-      TRef ikey = lj_opt_narrow_index(J, key);[m
[31m-      TRef asizeref = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_ASIZE);[m
[31m-      if ((MSize)k < t->asize) {  /* Currently an array key? */[m
[31m-	TRef arrayref;[m
[31m-	rec_idx_abc(J, asizeref, ikey, t->asize);[m
[31m-	arrayref = emitir(IRT(IR_FLOAD, IRT_P32), ix->tab, IRFL_TAB_ARRAY);[m
[31m-	return emitir(IRT(IR_AREF, IRT_P32), arrayref, ikey);[m
[31m-      } else {  /* Currently not in array (may be an array extension)? */[m
[31m-	emitir(IRTGI(IR_ULE), asizeref, ikey);  /* Inv. bounds check. */[m
[31m-	if (k == 0 && tref_isk(key))[m
[31m-	  key = lj_ir_knum_zero(J);  /* Canonicalize 0 or +-0.0 to +0.0. */[m
[31m-	/* And continue with the hash lookup. */[m
[31m-      }[m
[31m-    } else if (!tref_isk(key)) {[m
[31m-      /* We can rule out const numbers which failed the integerness test[m
[31m-      ** above. But all other numbers are potential array keys.[m
[31m-      */[m
[31m-      if (t->asize == 0) {  /* True sparse tables have an empty array part. */[m
[31m-	/* Guard that the array part stays empty. */[m
[31m-	TRef tmp = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_ASIZE);[m
[31m-	emitir(IRTGI(IR_EQ), tmp, lj_ir_kint(J, 0));[m
[31m-      } else {[m
[31m-	lj_trace_err(J, LJ_TRERR_NYITMIX);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Otherwise the key is located in the hash part. */[m
[31m-  if (t->hmask == 0) {  /* Shortcut for empty hash part. */[m
[31m-    /* Guard that the hash part stays empty. */[m
[31m-    TRef tmp = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK);[m
[31m-    emitir(IRTGI(IR_EQ), tmp, lj_ir_kint(J, 0));[m
[31m-    return lj_ir_kkptr(J, niltvg(J2G(J)));[m
[31m-  }[m
[31m-  if (tref_isinteger(key))  /* Hash keys are based on numbers, not ints. */[m
[31m-    key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT);[m
[31m-  if (tref_isk(key)) {[m
[31m-    /* Optimize lookup of constant hash keys. */[m
[31m-    MSize hslot = (MSize)((char *)ix->oldv - (char *)&noderef(t->node)[0].val);[m
[31m-    if (t->hmask > 0 && hslot <= t->hmask*(MSize)sizeof(Node) &&[m
[31m-	hslot <= 65535*(MSize)sizeof(Node)) {[m
[31m-      TRef node, kslot, hm;[m
[31m-      *rbref = J->cur.nins;  /* Mark possible rollback point. */[m
[31m-      *rbguard = J->guardemit;[m
[31m-      hm = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK);[m
[31m-      emitir(IRTGI(IR_EQ), hm, lj_ir_kint(J, (int32_t)t->hmask));[m
[31m-      node = emitir(IRT(IR_FLOAD, IRT_P32), ix->tab, IRFL_TAB_NODE);[m
[31m-      kslot = lj_ir_kslot(J, key, hslot / sizeof(Node));[m
[31m-      return emitir(IRTG(IR_HREFK, IRT_P32), node, kslot);[m
[31m-    }[m
[31m-  }[m
[31m-  /* Fall back to a regular hash lookup. */[m
[31m-  return emitir(IRT(IR_HREF, IRT_P32), ix->tab, key);[m
[31m-}[m
[31m-[m
[31m-/* Determine whether a key is NOT one of the fast metamethod names. */[m
[31m-static int nommstr(jit_State *J, TRef key)[m
[31m-{[m
[31m-  if (tref_isstr(key)) {[m
[31m-    if (tref_isk(key)) {[m
[31m-      GCstr *str = ir_kstr(IR(tref_ref(key)));[m
[31m-      uint32_t mm;[m
[31m-      for (mm = 0; mm <= MM_FAST; mm++)[m
[31m-	if (mmname_str(J2G(J), mm) == str)[m
[31m-	  return 0;  /* MUST be one the fast metamethod names. */[m
[31m-    } else {[m
[31m-      return 0;  /* Variable string key MAY be a metamethod name. */[m
[31m-    }[m
[31m-  }[m
[31m-  return 1;  /* CANNOT be a metamethod name. */[m
[31m-}[m
[31m-[m
[31m-/* Record indexed load/store. */[m
[31m-TRef lj_record_idx(jit_State *J, RecordIndex *ix)[m
[31m-{[m
[31m-  TRef xref;[m
[31m-  IROp xrefop, loadop;[m
[31m-  IRRef rbref;[m
[31m-  IRType1 rbguard;[m
[31m-  cTValue *oldv;[m
[31m-[m
[31m-  while (!tref_istab(ix->tab)) { /* Handle non-table lookup. */[m
[31m-    /* Never call raw lj_record_idx() on non-table. */[m
[31m-    lua_assert(ix->idxchain != 0);[m
[31m-    if (!lj_record_mm_lookup(J, ix, ix->val ? MM_newindex : MM_index))[m
[31m-      lj_trace_err(J, LJ_TRERR_NOMM);[m
[31m-  handlemm:[m
[31m-    if (tref_isfunc(ix->mobj)) {  /* Handle metamethod call. */[m
[31m-      BCReg func = rec_mm_prep(J, ix->val ? lj_cont_nop : lj_cont_ra);[m
[31m-      TRef *base = J->base + func;[m
[31m-      TValue *tv = J->L->base + func;[m
[31m-      lua_assert(!LJ_FR2);  /* TODO_FR2: handle different frame setup. */[m
[31m-      base[0] = ix->mobj; base[1] = ix->tab; base[2] = ix->key;[m
[31m-      setfuncV(J->L, tv+0, funcV(&ix->mobjv));[m
[31m-      copyTV(J->L, tv+1, &ix->tabv);[m
[31m-      copyTV(J->L, tv+2, &ix->keyv);[m
[31m-      if (ix->val) {[m
[31m-	base[3] = ix->val;[m
[31m-	copyTV(J->L, tv+3, &ix->valv);[m
[31m-	lj_record_call(J, func, 3);  /* mobj(tab, key, val) */[m
[31m-	return 0;[m
[31m-      } else {[m
[31m-	lj_record_call(J, func, 2);  /* res = mobj(tab, key) */[m
[31m-	return 0;  /* No result yet. */[m
[31m-      }[m
[31m-    }[m
[31m-    /* Otherwise retry lookup with metaobject. */[m
[31m-    ix->tab = ix->mobj;[m
[31m-    copyTV(J->L, &ix->tabv, &ix->mobjv);[m
[31m-    if (--ix->idxchain == 0)[m
[31m-      lj_trace_err(J, LJ_TRERR_IDXLOOP);[m
[31m-  }[m
[31m-[m
[31m-  /* First catch nil and NaN keys for tables. */[m
[31m-  if (tvisnil(&ix->keyv) || (tvisnum(&ix->keyv) && tvisnan(&ix->keyv))) {[m
[31m-    if (ix->val)  /* Better fail early. */[m
[31m-      lj_trace_err(J, LJ_TRERR_STORENN);[m
[31m-    if (tref_isk(ix->key)) {[m
[31m-      if (ix->idxchain && lj_record_mm_lookup(J, ix, MM_index))[m
[31m-	goto handlemm;[m
[31m-      return TREF_NIL;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Record the key lookup. */[m
[31m-  xref = rec_idx_key(J, ix, &rbref, &rbguard);[m
[31m-  xrefop = IR(tref_ref(xref))->o;[m
[31m-  loadop = xrefop == IR_AREF ? IR_ALOAD : IR_HLOAD;[m
[31m-  /* The lj_meta_tset() inconsistency is gone, but better play safe. */[m
[31m-  oldv = xrefop == IR_KKPTR ? (cTValue *)ir_kptr(IR(tref_ref(xref))) : ix->oldv;[m
[31m-[m
[31m-  if (ix->val == 0) {  /* Indexed load */[m
[31m-    IRType t = itype2irt(oldv);[m
[31m-    TRef res;[m
[31m-    if (oldv == niltvg(J2G(J))) {[m
[31m-      emitir(IRTG(IR_EQ, IRT_P32), xref, lj_ir_kkptr(J, niltvg(J2G(J))));[m
[31m-      res = TREF_NIL;[m
[31m-    } else {[m
[31m-      res = emitir(IRTG(loadop, t), xref, 0);[m
[31m-    }[m
[31m-    if (tref_ref(res) < rbref) {  /* HREFK + load forwarded? */[m
[31m-      lj_ir_rollback(J, rbref);  /* Rollback to eliminate hmask guard. */[m
[31m-      J->guardemit = rbguard;[m
[31m-    }[m
[31m-    if (t == IRT_NIL && ix->idxchain && lj_record_mm_lookup(J, ix, MM_index))[m
[31m-      goto handlemm;[m
[31m-    if (irtype_ispri(t)) res = TREF_PRI(t);  /* Canonicalize primitives. */[m
[31m-    return res;[m
[31m-  } else {  /* Indexed store. */[m
[31m-    GCtab *mt = tabref(tabV(&ix->tabv)->metatable);[m
[31m-    int keybarrier = tref_isgcv(ix->key) && !tref_isnil(ix->val);[m
[31m-    if (tref_ref(xref) < rbref) {  /* HREFK forwarded? */[m
[31m-      lj_ir_rollback(J, rbref);  /* Rollback to eliminate hmask guard. */[m
[31m-      J->guardemit = rbguard;[m
[31m-    }[m
[31m-    if (tvisnil(oldv)) {  /* Previous value was nil? */[m
[31m-      /* Need to duplicate the hasmm check for the early guards. */[m
[31m-      int hasmm = 0;[m
[31m-      if (ix->idxchain && mt) {[m
[31m-	cTValue *mo = lj_tab_getstr(mt, mmname_str(J2G(J), MM_newindex));[m
[31m-	hasmm = mo && !tvisnil(mo);[m
[31m-      }[m
[31m-      if (hasmm)[m
[31m-	emitir(IRTG(loadop, IRT_NIL), xref, 0);  /* Guard for nil value. */[m
[31m-      else if (xrefop == IR_HREF)[m
[31m-	emitir(IRTG(oldv == niltvg(J2G(J)) ? IR_EQ : IR_NE, IRT_P32),[m
[31m-	       xref, lj_ir_kkptr(J, niltvg(J2G(J))));[m
[31m-      if (ix->idxchain && lj_record_mm_lookup(J, ix, MM_newindex)) {[m
[31m-	lua_assert(hasmm);[m
[31m-	goto handlemm;[m
[31m-      }[m
[31m-      lua_assert(!hasmm);[m
[31m-      if (oldv == niltvg(J2G(J))) {  /* Need to insert a new key. */[m
[31m-	TRef key = ix->key;[m
[31m-	if (tref_isinteger(key))  /* NEWREF needs a TValue as a key. */[m
[31m-	  key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT);[m
[31m-	xref = emitir(IRT(IR_NEWREF, IRT_P32), ix->tab, key);[m
[31m-	keybarrier = 0;  /* NEWREF already takes care of the key barrier. */[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-	if ((J->flags & JIT_F_OPT_SINK))  /* Avoid a separate flag. */[m
[31m-	  rec_idx_bump(J, ix);[m
[31m-#endif[m
[31m-      }[m
[31m-    } else if (!lj_opt_fwd_wasnonnil(J, loadop, tref_ref(xref))) {[m
[31m-      /* Cannot derive that the previous value was non-nil, must do checks. */[m
[31m-      if (xrefop == IR_HREF)  /* Guard against store to niltv. */[m
[31m-	emitir(IRTG(IR_NE, IRT_P32), xref, lj_ir_kkptr(J, niltvg(J2G(J))));[m
[31m-      if (ix->idxchain) {  /* Metamethod lookup required? */[m
[31m-	/* A check for NULL metatable is cheaper (hoistable) than a load. */[m
[31m-	if (!mt) {[m
[31m-	  TRef mtref = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_TAB_META);[m
[31m-	  emitir(IRTG(IR_EQ, IRT_TAB), mtref, lj_ir_knull(J, IRT_TAB));[m
[31m-	} else {[m
[31m-	  IRType t = itype2irt(oldv);[m
[31m-	  emitir(IRTG(loadop, t), xref, 0);  /* Guard for non-nil value. */[m
[31m-	}[m
[31m-      }[m
[31m-    } else {[m
[31m-      keybarrier = 0;  /* Previous non-nil value kept the key alive. */[m
[31m-    }[m
[31m-    /* Convert int to number before storing. */[m
[31m-    if (!LJ_DUALNUM && tref_isinteger(ix->val))[m
[31m-      ix->val = emitir(IRTN(IR_CONV), ix->val, IRCONV_NUM_INT);[m
[31m-    emitir(IRT(loadop+IRDELTA_L2S, tref_type(ix->val)), xref, ix->val);[m
[31m-    if (keybarrier || tref_isgcv(ix->val))[m
[31m-      emitir(IRT(IR_TBAR, IRT_NIL), ix->tab, 0);[m
[31m-    /* Invalidate neg. metamethod cache for stores with certain string keys. */[m
[31m-    if (!nommstr(J, ix->key)) {[m
[31m-      TRef fref = emitir(IRT(IR_FREF, IRT_P32), ix->tab, IRFL_TAB_NOMM);[m
[31m-      emitir(IRT(IR_FSTORE, IRT_U8), fref, lj_ir_kint(J, 0));[m
[31m-    }[m
[31m-    J->needsnap = 1;[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static void rec_tsetm(jit_State *J, BCReg ra, BCReg rn, int32_t i)[m
[31m-{[m
[31m-  RecordIndex ix;[m
[31m-  cTValue *basev = J->L->base;[m
[31m-  GCtab *t = tabV(&basev[ra-1]);[m
[31m-  settabV(J->L, &ix.tabv, t);[m
[31m-  ix.tab = getslot(J, ra-1);[m
[31m-  ix.idxchain = 0;[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  if ((J->flags & JIT_F_OPT_SINK)) {[m
[31m-    if (t->asize < i+rn-ra)[m
[31m-      lj_tab_reasize(J->L, t, i+rn-ra);[m
[31m-    setnilV(&ix.keyv);[m
[31m-    rec_idx_bump(J, &ix);[m
[31m-  }[m
[31m-#endif[m
[31m-  for (; ra < rn; i++, ra++) {[m
[31m-    setintV(&ix.keyv, i);[m
[31m-    ix.key = lj_ir_kint(J, i);[m
[31m-    copyTV(J->L, &ix.valv, &basev[ra]);[m
[31m-    ix.val = getslot(J, ra);[m
[31m-    lj_record_idx(J, &ix);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Upvalue access ------------------------------------------------------ */[m
[31m-[m
[31m-/* Check whether upvalue is immutable and ok to constify. */[m
[31m-static int rec_upvalue_constify(jit_State *J, GCupval *uvp)[m
[31m-{[m
[31m-  if (uvp->immutable) {[m
[31m-    cTValue *o = uvval(uvp);[m
[31m-    /* Don't constify objects that may retain large amounts of memory. */[m
[31m-#if LJ_HASFFI[m
[31m-    if (tviscdata(o)) {[m
[31m-      GCcdata *cd = cdataV(o);[m
[31m-      if (!cdataisv(cd) && !(cd->marked & LJ_GC_CDATA_FIN)) {[m
[31m-	CType *ct = ctype_raw(ctype_ctsG(J2G(J)), cd->ctypeid);[m
[31m-	if (!ctype_hassize(ct->info) || ct->size <= 16)[m
[31m-	  return 1;[m
[31m-      }[m
[31m-      return 0;[m
[31m-    }[m
[31m-#else[m
[31m-    UNUSED(J);[m
[31m-#endif[m
[31m-    if (!(tvistab(o) || tvisudata(o) || tvisthread(o)))[m
[31m-      return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Record upvalue load/store. */[m
[31m-static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val)[m
[31m-{[m
[31m-  GCupval *uvp = &gcref(J->fn->l.uvptr[uv])->uv;[m
[31m-  TRef fn = getcurrf(J);[m
[31m-  IRRef uref;[m
[31m-  int needbarrier = 0;[m
[31m-  if (rec_upvalue_constify(J, uvp)) {  /* Try to constify immutable upvalue. */[m
[31m-    TRef tr, kfunc;[m
[31m-    lua_assert(val == 0);[m
[31m-    if (!tref_isk(fn)) {  /* Late specialization of current function. */[m
[31m-      if (J->pt->flags >= PROTO_CLC_POLY)[m
[31m-	goto noconstify;[m
[31m-      kfunc = lj_ir_kfunc(J, J->fn);[m
[31m-      emitir(IRTG(IR_EQ, IRT_FUNC), fn, kfunc);[m
[31m-      J->base[-1] = TREF_FRAME | kfunc;[m
[31m-      fn = kfunc;[m
[31m-    }[m
[31m-    tr = lj_record_constify(J, uvval(uvp));[m
[31m-    if (tr)[m
[31m-      return tr;[m
[31m-  }[m
[31m-noconstify:[m
[31m-  /* Note: this effectively limits LJ_MAX_UPVAL to 127. */[m
[31m-  uv = (uv << 8) | (hashrot(uvp->dhash, uvp->dhash + HASH_BIAS) & 0xff);[m
[31m-  if (!uvp->closed) {[m
[31m-    /* In current stack? */[m
[31m-    if (uvval(uvp) >= tvref(J->L->stack) &&[m
[31m-	uvval(uvp) < tvref(J->L->maxstack)) {[m
[31m-      int32_t slot = (int32_t)(uvval(uvp) - (J->L->base - J->baseslot));[m
[31m-      if (slot >= 0) {  /* Aliases an SSA slot? */[m
[31m-	slot -= (int32_t)J->baseslot;  /* Note: slot number may be negative! */[m
[31m-	/* NYI: add IR to guard that it's still aliasing the same slot. */[m
[31m-	if (val == 0) {[m
[31m-	  return getslot(J, slot);[m
[31m-	} else {[m
[31m-	  J->base[slot] = val;[m
[31m-	  if (slot >= (int32_t)J->maxslot) J->maxslot = (BCReg)(slot+1);[m
[31m-	  return 0;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-    uref = tref_ref(emitir(IRTG(IR_UREFO, IRT_P32), fn, uv));[m
[31m-  } else {[m
[31m-    needbarrier = 1;[m
[31m-    uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_P32), fn, uv));[m
[31m-  }[m
[31m-  if (val == 0) {  /* Upvalue load */[m
[31m-    IRType t = itype2irt(uvval(uvp));[m
[31m-    TRef res = emitir(IRTG(IR_ULOAD, t), uref, 0);[m
[31m-    if (irtype_ispri(t)) res = TREF_PRI(t);  /* Canonicalize primitive refs. */[m
[31m-    return res;[m
[31m-  } else {  /* Upvalue store. */[m
[31m-    /* Convert int to number before storing. */[m
[31m-    if (!LJ_DUALNUM && tref_isinteger(val))[m
[31m-      val = emitir(IRTN(IR_CONV), val, IRCONV_NUM_INT);[m
[31m-    emitir(IRT(IR_USTORE, tref_type(val)), uref, val);[m
[31m-    if (needbarrier && tref_isgcv(val))[m
[31m-      emitir(IRT(IR_OBAR, IRT_NIL), uref, val);[m
[31m-    J->needsnap = 1;[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Record calls to Lua functions --------------------------------------- */[m
[31m-[m
[31m-/* Check unroll limits for calls. */[m
[31m-static void check_call_unroll(jit_State *J, TraceNo lnk)[m
[31m-{[m
[31m-  cTValue *frame = J->L->base - 1;[m
[31m-  void *pc = mref(frame_func(frame)->l.pc, void);[m
[31m-  int32_t depth = J->framedepth;[m
[31m-  int32_t count = 0;[m
[31m-  if ((J->pt->flags & PROTO_VARARG)) depth--;  /* Vararg frame still missing. */[m
[31m-  for (; depth > 0; depth--) {  /* Count frames with same prototype. */[m
[31m-    if (frame_iscont(frame)) depth--;[m
[31m-    frame = frame_prev(frame);[m
[31m-    if (mref(frame_func(frame)->l.pc, void) == pc)[m
[31m-      count++;[m
[31m-  }[m
[31m-  if (J->pc == J->startpc) {[m
[31m-    if (count + J->tailcalled > J->param[JIT_P_recunroll]) {[m
[31m-      J->pc++;[m
[31m-      if (J->framedepth + J->retdepth == 0)[m
[31m-	lj_record_stop(J, LJ_TRLINK_TAILREC, J->cur.traceno);  /* Tail-rec. */[m
[31m-      else[m
[31m-	lj_record_stop(J, LJ_TRLINK_UPREC, J->cur.traceno);  /* Up-recursion. */[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (count > J->param[JIT_P_callunroll]) {[m
[31m-      if (lnk) {  /* Possible tail- or up-recursion. */[m
[31m-	lj_trace_flush(J, lnk);  /* Flush trace that only returns. */[m
[31m-	/* Set a small, pseudo-random hotcount for a quick retry of JFUNC*. */[m
[31m-	hotcount_set(J2GG(J), J->pc+1, LJ_PRNG_BITS(J, 4));[m
[31m-      }[m
[31m-      lj_trace_err(J, LJ_TRERR_CUNROLL);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Record Lua function setup. */[m
[31m-static void rec_func_setup(jit_State *J)[m
[31m-{[m
[31m-  GCproto *pt = J->pt;[m
[31m-  BCReg s, numparams = pt->numparams;[m
[31m-  if ((pt->flags & PROTO_NOJIT))[m
[31m-    lj_trace_err(J, LJ_TRERR_CJITOFF);[m
[31m-  if (J->baseslot + pt->framesize >= LJ_MAX_JSLOTS)[m
[31m-    lj_trace_err(J, LJ_TRERR_STACKOV);[m
[31m-  /* Fill up missing parameters with nil. */[m
[31m-  for (s = J->maxslot; s < numparams; s++)[m
[31m-    J->base[s] = TREF_NIL;[m
[31m-  /* The remaining slots should never be read before they are written. */[m
[31m-  J->maxslot = numparams;[m
[31m-}[m
[31m-[m
[31m-/* Record Lua vararg function setup. */[m
[31m-static void rec_func_vararg(jit_State *J)[m
[31m-{[m
[31m-  GCproto *pt = J->pt;[m
[31m-  BCReg s, fixargs, vframe = J->maxslot+1;[m
[31m-  lua_assert((pt->flags & PROTO_VARARG));[m
[31m-  if (J->baseslot + vframe + pt->framesize >= LJ_MAX_JSLOTS)[m
[31m-    lj_trace_err(J, LJ_TRERR_STACKOV);[m
[31m-  J->base[vframe-1] = J->base[-1];  /* Copy function up. */[m
[31m-  /* Copy fixarg slots up and set their original slots to nil. */[m
[31m-  fixargs = pt->numparams < J->maxslot ? pt->numparams : J->maxslot;[m
[31m-  for (s = 0; s < fixargs; s++) {[m
[31m-    J->base[vframe+s] = J->base[s];[m
[31m-    J->base[s] = TREF_NIL;[m
[31m-  }[m
[31m-  J->maxslot = fixargs;[m
[31m-  J->framedepth++;[m
[31m-  J->base += vframe;[m
[31m-  J->baseslot += vframe;[m
[31m-}[m
[31m-[m
[31m-/* Record entry to a Lua function. */[m
[31m-static void rec_func_lua(jit_State *J)[m
[31m-{[m
[31m-  rec_func_setup(J);[m
[31m-  check_call_unroll(J, 0);[m
[31m-}[m
[31m-[m
[31m-/* Record entry to an already compiled function. */[m
[31m-static void rec_func_jit(jit_State *J, TraceNo lnk)[m
[31m-{[m
[31m-  GCtrace *T;[m
[31m-  rec_func_setup(J);[m
[31m-  T = traceref(J, lnk);[m
[31m-  if (T->linktype == LJ_TRLINK_RETURN) {  /* Trace returns to interpreter? */[m
[31m-    check_call_unroll(J, lnk);[m
[31m-    /* Temporarily unpatch JFUNC* to continue recording across function. */[m
[31m-    J->patchins = *J->pc;[m
[31m-    J->patchpc = (BCIns *)J->pc;[m
[31m-    *J->patchpc = T->startins;[m
[31m-    return;[m
[31m-  }[m
[31m-  J->instunroll = 0;  /* Cannot continue across a compiled function. */[m
[31m-  if (J->pc == J->startpc && J->framedepth + J->retdepth == 0)[m
[31m-    lj_record_stop(J, LJ_TRLINK_TAILREC, J->cur.traceno);  /* Extra tail-rec. */[m
[31m-  else[m
[31m-    lj_record_stop(J, LJ_TRLINK_ROOT, lnk);  /* Link to the function. */[m
[31m-}[m
[31m-[m
[31m-/* -- Vararg handling ----------------------------------------------------- */[m
[31m-[m
[31m-/* Detect y = select(x, ...) idiom. */[m
[31m-static int select_detect(jit_State *J)[m
[31m-{[m
[31m-  BCIns ins = J->pc[1];[m
[31m-  if (bc_op(ins) == BC_CALLM && bc_b(ins) == 2 && bc_c(ins) == 1) {[m
[31m-    cTValue *func = &J->L->base[bc_a(ins)];[m
[31m-    if (tvisfunc(func) && funcV(func)->c.ffid == FF_select) {[m
[31m-      TRef kfunc = lj_ir_kfunc(J, funcV(func));[m
[31m-      emitir(IRTG(IR_EQ, IRT_FUNC), getslot(J, bc_a(ins)), kfunc);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Record vararg instruction. */[m
[31m-static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)[m
[31m-{[m
[31m-  int32_t numparams = J->pt->numparams;[m
[31m-  ptrdiff_t nvararg = frame_delta(J->L->base-1) - numparams - 1;[m
[31m-  lua_assert(frame_isvarg(J->L->base-1));[m
[31m-  if (J->framedepth > 0) {  /* Simple case: varargs defined on-trace. */[m
[31m-    ptrdiff_t i;[m
[31m-    if (nvararg < 0) nvararg = 0;[m
[31m-    if (nresults == -1) {[m
[31m-      nresults = nvararg;[m
[31m-      J->maxslot = dst + (BCReg)nvararg;[m
[31m-    } else if (dst + nresults > J->maxslot) {[m
[31m-      J->maxslot = dst + (BCReg)nresults;[m
[31m-    }[m
[31m-    for (i = 0; i < nresults; i++)[m
[31m-      J->base[dst+i] = i < nvararg ? getslot(J, i - nvararg - 1) : TREF_NIL;[m
[31m-  } else {  /* Unknown number of varargs passed to trace. */[m
[31m-    TRef fr = emitir(IRTI(IR_SLOAD), 0, IRSLOAD_READONLY|IRSLOAD_FRAME);[m
[31m-    int32_t frofs = 8*(1+numparams)+FRAME_VARG;[m
[31m-    if (nresults >= 0) {  /* Known fixed number of results. */[m
[31m-      ptrdiff_t i;[m
[31m-      if (nvararg > 0) {[m
[31m-	ptrdiff_t nload = nvararg >= nresults ? nresults : nvararg;[m
[31m-	TRef vbase;[m
[31m-	if (nvararg >= nresults)[m
[31m-	  emitir(IRTGI(IR_GE), fr, lj_ir_kint(J, frofs+8*(int32_t)nresults));[m
[31m-	else[m
[31m-	  emitir(IRTGI(IR_EQ), fr,[m
[31m-		 lj_ir_kint(J, (int32_t)frame_ftsz(J->L->base-1)));[m
[31m-	vbase = emitir(IRTI(IR_SUB), REF_BASE, fr);[m
[31m-	vbase = emitir(IRT(IR_ADD, IRT_P32), vbase, lj_ir_kint(J, frofs-8));[m
[31m-	for (i = 0; i < nload; i++) {[m
[31m-	  IRType t = itype2irt(&J->L->base[i-1-nvararg]);[m
[31m-	  TRef aref = emitir(IRT(IR_AREF, IRT_P32),[m
[31m-			     vbase, lj_ir_kint(J, (int32_t)i));[m
[31m-	  TRef tr = emitir(IRTG(IR_VLOAD, t), aref, 0);[m
[31m-	  if (irtype_ispri(t)) tr = TREF_PRI(t);  /* Canonicalize primitives. */[m
[31m-	  J->base[dst+i] = tr;[m
[31m-	}[m
[31m-      } else {[m
[31m-	emitir(IRTGI(IR_LE), fr, lj_ir_kint(J, frofs));[m
[31m-	nvararg = 0;[m
[31m-      }[m
[31m-      for (i = nvararg; i < nresults; i++)[m
[31m-	J->base[dst+i] = TREF_NIL;[m
[31m-      if (dst + (BCReg)nresults > J->maxslot)[m
[31m-	J->maxslot = dst + (BCReg)nresults;[m
[31m-    } else if (select_detect(J)) {  /* y = select(x, ...) */[m
[31m-      TRef tridx = J->base[dst-1];[m
[31m-      TRef tr = TREF_NIL;[m
[31m-      ptrdiff_t idx = lj_ffrecord_select_mode(J, tridx, &J->L->base[dst-1]);[m
[31m-      if (idx < 0) goto nyivarg;[m
[31m-      if (idx != 0 && !tref_isinteger(tridx))[m
[31m-	tridx = emitir(IRTGI(IR_CONV), tridx, IRCONV_INT_NUM|IRCONV_INDEX);[m
[31m-      if (idx != 0 && tref_isk(tridx)) {[m
[31m-	emitir(IRTGI(idx <= nvararg ? IR_GE : IR_LT),[m
[31m-	       fr, lj_ir_kint(J, frofs+8*(int32_t)idx));[m
[31m-	frofs -= 8;  /* Bias for 1-based index. */[m
[31m-      } else if (idx <= nvararg) {  /* Compute size. */[m
[31m-	TRef tmp = emitir(IRTI(IR_ADD), fr, lj_ir_kint(J, -frofs));[m
[31m-	if (numparams)[m
[31m-	  emitir(IRTGI(IR_GE), tmp, lj_ir_kint(J, 0));[m
[31m-	tr = emitir(IRTI(IR_BSHR), tmp, lj_ir_kint(J, 3));[m
[31m-	if (idx != 0) {[m
[31m-	  tridx = emitir(IRTI(IR_ADD), tridx, lj_ir_kint(J, -1));[m
[31m-	  rec_idx_abc(J, tr, tridx, (uint32_t)nvararg);[m
[31m-	}[m
[31m-      } else {[m
[31m-	TRef tmp = lj_ir_kint(J, frofs);[m
[31m-	if (idx != 0) {[m
[31m-	  TRef tmp2 = emitir(IRTI(IR_BSHL), tridx, lj_ir_kint(J, 3));[m
[31m-	  tmp = emitir(IRTI(IR_ADD), tmp2, tmp);[m
[31m-	} else {[m
[31m-	  tr = lj_ir_kint(J, 0);[m
[31m-	}[m
[31m-	emitir(IRTGI(IR_LT), fr, tmp);[m
[31m-      }[m
[31m-      if (idx != 0 && idx <= nvararg) {[m
[31m-	IRType t;[m
[31m-	TRef aref, vbase = emitir(IRTI(IR_SUB), REF_BASE, fr);[m
[31m-	vbase = emitir(IRT(IR_ADD, IRT_P32), vbase, lj_ir_kint(J, frofs-8));[m
[31m-	t = itype2irt(&J->L->base[idx-2-nvararg]);[m
[31m-	aref = emitir(IRT(IR_AREF, IRT_P32), vbase, tridx);[m
[31m-	tr = emitir(IRTG(IR_VLOAD, t), aref, 0);[m
[31m-	if (irtype_ispri(t)) tr = TREF_PRI(t);  /* Canonicalize primitives. */[m
[31m-      }[m
[31m-      J->base[dst-2] = tr;[m
[31m-      J->maxslot = dst-1;[m
[31m-      J->bcskip = 2;  /* Skip CALLM + select. */[m
[31m-    } else {[m
[31m-    nyivarg:[m
[31m-      setintV(&J->errinfo, BC_VARG);[m
[31m-      lj_trace_err_info(J, LJ_TRERR_NYIBC);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Record allocations -------------------------------------------------- */[m
[31m-[m
[31m-static TRef rec_tnew(jit_State *J, uint32_t ah)[m
[31m-{[m
[31m-  uint32_t asize = ah & 0x7ff;[m
[31m-  uint32_t hbits = ah >> 11;[m
[31m-  TRef tr;[m
[31m-  if (asize == 0x7ff) asize = 0x801;[m
[31m-  tr = emitir(IRTG(IR_TNEW, IRT_TAB), asize, hbits);[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  J->rbchash[(tr & (RBCHASH_SLOTS-1))].ref = tref_ref(tr);[m
[31m-  setmref(J->rbchash[(tr & (RBCHASH_SLOTS-1))].pc, J->pc);[m
[31m-  setgcref(J->rbchash[(tr & (RBCHASH_SLOTS-1))].pt, obj2gco(J->pt));[m
[31m-#endif[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* -- Concatenation ------------------------------------------------------- */[m
[31m-[m
[31m-static TRef rec_cat(jit_State *J, BCReg baseslot, BCReg topslot)[m
[31m-{[m
[31m-  TRef *top = &J->base[topslot];[m
[31m-  TValue savetv[5];[m
[31m-  BCReg s;[m
[31m-  RecordIndex ix;[m
[31m-  lua_assert(baseslot < topslot);[m
[31m-  for (s = baseslot; s <= topslot; s++)[m
[31m-    (void)getslot(J, s);  /* Ensure all arguments have a reference. */[m
[31m-  if (tref_isnumber_str(top[0]) && tref_isnumber_str(top[-1])) {[m
[31m-    TRef tr, hdr, *trp, *xbase, *base = &J->base[baseslot];[m
[31m-    /* First convert numbers to strings. */[m
[31m-    for (trp = top; trp >= base; trp--) {[m
[31m-      if (tref_isnumber(*trp))[m
[31m-	*trp = emitir(IRT(IR_TOSTR, IRT_STR), *trp,[m
[31m-		      tref_isnum(*trp) ? IRTOSTR_NUM : IRTOSTR_INT);[m
[31m-      else if (!tref_isstr(*trp))[m
[31m-	break;[m
[31m-    }[m
[31m-    xbase = ++trp;[m
[31m-    tr = hdr = emitir(IRT(IR_BUFHDR, IRT_P32),[m
[31m-		      lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);[m
[31m-    do {[m
[31m-      tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, *trp++);[m
[31m-    } while (trp <= top);[m
[31m-    tr = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);[m
[31m-    J->maxslot = (BCReg)(xbase - J->base);[m
[31m-    if (xbase == base) return tr;  /* Return simple concatenation result. */[m
[31m-    /* Pass partial result. */[m
[31m-    topslot = J->maxslot--;[m
[31m-    *xbase = tr;[m
[31m-    top = xbase;[m
[31m-    setstrV(J->L, &ix.keyv, &J2G(J)->strempty);  /* Simulate string result. */[m
[31m-  } else {[m
[31m-    J->maxslot = topslot-1;[m
[31m-    copyTV(J->L, &ix.keyv, &J->L->base[topslot]);[m
[31m-  }[m
[31m-  copyTV(J->L, &ix.tabv, &J->L->base[topslot-1]);[m
[31m-  ix.tab = top[-1];[m
[31m-  ix.key = top[0];[m
[31m-  memcpy(savetv, &J->L->base[topslot-1], sizeof(savetv));  /* Save slots. */[m
[31m-  rec_mm_arith(J, &ix, MM_concat);  /* Call __concat metamethod. */[m
[31m-  memcpy(&J->L->base[topslot-1], savetv, sizeof(savetv));  /* Restore slots. */[m
[31m-  return 0;  /* No result yet. */[m
[31m-}[m
[31m-[m
[31m-/* -- Record bytecode ops ------------------------------------------------- */[m
[31m-[m
[31m-/* Prepare for comparison. */[m
[31m-static void rec_comp_prep(jit_State *J)[m
[31m-{[m
[31m-  /* Prevent merging with snapshot #0 (GC exit) since we fixup the PC. */[m
[31m-  if (J->cur.nsnap == 1 && J->cur.snap[0].ref == J->cur.nins)[m
[31m-    emitir_raw(IRT(IR_NOP, IRT_NIL), 0, 0);[m
[31m-  lj_snap_add(J);[m
[31m-}[m
[31m-[m
[31m-/* Fixup comparison. */[m
[31m-static void rec_comp_fixup(jit_State *J, const BCIns *pc, int cond)[m
[31m-{[m
[31m-  BCIns jmpins = pc[1];[m
[31m-  const BCIns *npc = pc + 2 + (cond ? bc_j(jmpins) : 0);[m
[31m-  SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];[m
[31m-  /* Set PC to opposite target to avoid re-recording the comp. in side trace. */[m
[31m-  J->cur.snapmap[snap->mapofs + snap->nent] = SNAP_MKPC(npc);[m
[31m-  J->needsnap = 1;[m
[31m-  if (bc_a(jmpins) < J->maxslot) J->maxslot = bc_a(jmpins);[m
[31m-  lj_snap_shrink(J);  /* Shrink last snapshot if possible. */[m
[31m-}[m
[31m-[m
[31m-/* Record the next bytecode instruction (_before_ it's executed). */[m
[31m-void lj_record_ins(jit_State *J)[m
[31m-{[m
[31m-  cTValue *lbase;[m
[31m-  RecordIndex ix;[m
[31m-  const BCIns *pc;[m
[31m-  BCIns ins;[m
[31m-  BCOp op;[m
[31m-  TRef ra, rb, rc;[m
[31m-[m
[31m-  /* Perform post-processing action before recording the next instruction. */[m
[31m-  if (LJ_UNLIKELY(J->postproc != LJ_POST_NONE)) {[m
[31m-    switch (J->postproc) {[m
[31m-    case LJ_POST_FIXCOMP:  /* Fixup comparison. */[m
[31m-      pc = (const BCIns *)(uintptr_t)J2G(J)->tmptv.u64;[m
[31m-      rec_comp_fixup(J, pc, (!tvistruecond(&J2G(J)->tmptv2) ^ (bc_op(*pc)&1)));[m
[31m-      /* fallthrough */[m
[31m-    case LJ_POST_FIXGUARD:  /* Fixup and emit pending guard. */[m
[31m-    case LJ_POST_FIXGUARDSNAP:  /* Fixup and emit pending guard and snapshot. */[m
[31m-      if (!tvistruecond(&J2G(J)->tmptv2)) {[m
[31m-	J->fold.ins.o ^= 1;  /* Flip guard to opposite. */[m
[31m-	if (J->postproc == LJ_POST_FIXGUARDSNAP) {[m
[31m-	  SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];[m
[31m-	  J->cur.snapmap[snap->mapofs+snap->nent-1]--;  /* False -> true. */[m
[31m-	}[m
[31m-      }[m
[31m-      lj_opt_fold(J);  /* Emit pending guard. */[m
[31m-      /* fallthrough */[m
[31m-    case LJ_POST_FIXBOOL:[m
[31m-      if (!tvistruecond(&J2G(J)->tmptv2)) {[m
[31m-	BCReg s;[m
[31m-	TValue *tv = J->L->base;[m
[31m-	for (s = 0; s < J->maxslot; s++)  /* Fixup stack slot (if any). */[m
[31m-	  if (J->base[s] == TREF_TRUE && tvisfalse(&tv[s])) {[m
[31m-	    J->base[s] = TREF_FALSE;[m
[31m-	    break;[m
[31m-	  }[m
[31m-      }[m
[31m-      break;[m
[31m-    case LJ_POST_FIXCONST:[m
[31m-      {[m
[31m-	BCReg s;[m
[31m-	TValue *tv = J->L->base;[m
[31m-	for (s = 0; s < J->maxslot; s++)  /* Constify stack slots (if any). */[m
[31m-	  if (J->base[s] == TREF_NIL && !tvisnil(&tv[s]))[m
[31m-	    J->base[s] = lj_record_constify(J, &tv[s]);[m
[31m-      }[m
[31m-      break;[m
[31m-    case LJ_POST_FFRETRY:  /* Suppress recording of retried fast function. */[m
[31m-      if (bc_op(*J->pc) >= BC__MAX)[m
[31m-	return;[m
[31m-      break;[m
[31m-    default: lua_assert(0); break;[m
[31m-    }[m
[31m-    J->postproc = LJ_POST_NONE;[m
[31m-  }[m
[31m-[m
[31m-  /* Need snapshot before recording next bytecode (e.g. after a store). */[m
[31m-  if (J->needsnap) {[m
[31m-    J->needsnap = 0;[m
[31m-    lj_snap_purge(J);[m
[31m-    lj_snap_add(J);[m
[31m-    J->mergesnap = 1;[m
[31m-  }[m
[31m-[m
[31m-  /* Skip some bytecodes. */[m
[31m-  if (LJ_UNLIKELY(J->bcskip > 0)) {[m
[31m-    J->bcskip--;[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Record only closed loops for root traces. */[m
[31m-  pc = J->pc;[m
[31m-  if (J->framedepth == 0 &&[m
[31m-     (MSize)((char *)pc - (char *)J->bc_min) >= J->bc_extent)[m
[31m-    lj_trace_err(J, LJ_TRERR_LLEAVE);[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  rec_check_slots(J);[m
[31m-  rec_check_ir(J);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASPROFILE[m
[31m-  rec_profile_ins(J, pc);[m
[31m-#endif[m
[31m-[m
[31m-  /* Keep a copy of the runtime values of var/num/str operands. */[m
[31m-#define rav	(&ix.valv)[m
[31m-#define rbv	(&ix.tabv)[m
[31m-#define rcv	(&ix.keyv)[m
[31m-[m
[31m-  lbase = J->L->base;[m
[31m-  ins = *pc;[m
[31m-  op = bc_op(ins);[m
[31m-  ra = bc_a(ins);[m
[31m-  ix.val = 0;[m
[31m-  switch (bcmode_a(op)) {[m
[31m-  case BCMvar:[m
[31m-    copyTV(J->L, rav, &lbase[ra]); ix.val = ra = getslot(J, ra); break;[m
[31m-  default: break;  /* Handled later. */[m
[31m-  }[m
[31m-  rb = bc_b(ins);[m
[31m-  rc = bc_c(ins);[m
[31m-  switch (bcmode_b(op)) {[m
[31m-  case BCMnone: rb = 0; rc = bc_d(ins); break;  /* Upgrade rc to 'rd'. */[m
[31m-  case BCMvar:[m
[31m-    copyTV(J->L, rbv, &lbase[rb]); ix.tab = rb = getslot(J, rb); break;[m
[31m-  default: break;  /* Handled later. */[m
[31m-  }[m
[31m-  switch (bcmode_c(op)) {[m
[31m-  case BCMvar:[m
[31m-    copyTV(J->L, rcv, &lbase[rc]); ix.key = rc = getslot(J, rc); break;[m
[31m-  case BCMpri: setpriV(rcv, ~rc); ix.key = rc = TREF_PRI(IRT_NIL+rc); break;[m
[31m-  case BCMnum: { cTValue *tv = proto_knumtv(J->pt, rc);[m
[31m-    copyTV(J->L, rcv, tv); ix.key = rc = tvisint(tv) ? lj_ir_kint(J, intV(tv)) :[m
[31m-    lj_ir_knumint(J, numV(tv)); } break;[m
[31m-  case BCMstr: { GCstr *s = gco2str(proto_kgc(J->pt, ~(ptrdiff_t)rc));[m
[31m-    setstrV(J->L, rcv, s); ix.key = rc = lj_ir_kstr(J, s); } break;[m
[31m-  default: break;  /* Handled later. */[m
[31m-  }[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-#if LJ_HASFFI[m
[31m-    if (tref_iscdata(ra) || tref_iscdata(rc)) {[m
[31m-      rec_mm_comp_cdata(J, &ix, op, ((int)op & 2) ? MM_le : MM_lt);[m
[31m-      break;[m
[31m-    }[m
[31m-#endif[m
[31m-    /* Emit nothing for two numeric or string consts. */[m
[31m-    if (!(tref_isk2(ra,rc) && tref_isnumber_str(ra) && tref_isnumber_str(rc))) {[m
[31m-      IRType ta = tref_isinteger(ra) ? IRT_INT : tref_type(ra);[m
[31m-      IRType tc = tref_isinteger(rc) ? IRT_INT : tref_type(rc);[m
[31m-      int irop;[m
[31m-      if (ta != tc) {[m
[31m-	/* Widen mixed number/int comparisons to number/number comparison. */[m
[31m-	if (ta == IRT_INT && tc == IRT_NUM) {[m
[31m-	  ra = emitir(IRTN(IR_CONV), ra, IRCONV_NUM_INT);[m
[31m-	  ta = IRT_NUM;[m
[31m-	} else if (ta == IRT_NUM && tc == IRT_INT) {[m
[31m-	  rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT);[m
[31m-	} else if (LJ_52) {[m
[31m-	  ta = IRT_NIL;  /* Force metamethod for different types. */[m
[31m-	} else if (!((ta == IRT_FALSE || ta == IRT_TRUE) &&[m
[31m-		     (tc == IRT_FALSE || tc == IRT_TRUE))) {[m
[31m-	  break;  /* Interpreter will throw for two different types. */[m
[31m-	}[m
[31m-      }[m
[31m-      rec_comp_prep(J);[m
[31m-      irop = (int)op - (int)BC_ISLT + (int)IR_LT;[m
[31m-      if (ta == IRT_NUM) {[m
[31m-	if ((irop & 1)) irop ^= 4;  /* ISGE/ISGT are unordered. */[m
[31m-	if (!lj_ir_numcmp(numberVnum(rav), numberVnum(rcv), (IROp)irop))[m
[31m-	  irop ^= 5;[m
[31m-      } else if (ta == IRT_INT) {[m
[31m-	if (!lj_ir_numcmp(numberVnum(rav), numberVnum(rcv), (IROp)irop))[m
[31m-	  irop ^= 1;[m
[31m-      } else if (ta == IRT_STR) {[m
[31m-	if (!lj_ir_strcmp(strV(rav), strV(rcv), (IROp)irop)) irop ^= 1;[m
[31m-	ra = lj_ir_call(J, IRCALL_lj_str_cmp, ra, rc);[m
[31m-	rc = lj_ir_kint(J, 0);[m
[31m-	ta = IRT_INT;[m
[31m-      } else {[m
[31m-	rec_mm_comp(J, &ix, (int)op);[m
[31m-	break;[m
[31m-      }[m
[31m-      emitir(IRTG(irop, ta), ra, rc);[m
[31m-      rec_comp_fixup(J, J->pc, ((int)op ^ irop) & 1);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-#if LJ_HASFFI[m
[31m-    if (tref_iscdata(ra) || tref_iscdata(rc)) {[m
[31m-      rec_mm_comp_cdata(J, &ix, op, MM_eq);[m
[31m-      break;[m
[31m-    }[m
[31m-#endif[m
[31m-    /* Emit nothing for two non-table, non-udata consts. */[m
[31m-    if (!(tref_isk2(ra, rc) && !(tref_istab(ra) || tref_isudata(ra)))) {[m
[31m-      int diff;[m
[31m-      rec_comp_prep(J);[m
[31m-      diff = lj_record_objcmp(J, ra, rc, rav, rcv);[m
[31m-      if (diff == 2 || !(tref_istab(ra) || tref_isudata(ra)))[m
[31m-	rec_comp_fixup(J, J->pc, ((int)op & 1) == !diff);[m
[31m-      else if (diff == 1)  /* Only check __eq if different, but same type. */[m
[31m-	rec_mm_equal(J, &ix, (int)op);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC:[m
[31m-    if ((op & 1) == tref_istruecond(rc))[m
[31m-      rc = 0;  /* Don't store if condition is not true. */[m
[31m-    /* fallthrough */[m
[31m-  case BC_IST: case BC_ISF:  /* Type specialization suffices. */[m
[31m-    if (bc_a(pc[1]) < J->maxslot)[m
[31m-      J->maxslot = bc_a(pc[1]);  /* Shrink used slots. */[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE: case BC_ISNUM:[m
[31m-    /* These coercions need to correspond with lj_meta_istype(). */[m
[31m-    if (LJ_DUALNUM && rc == ~LJ_TNUMX+1)[m
[31m-      ra = lj_opt_narrow_toint(J, ra);[m
[31m-    else if (rc == ~LJ_TNUMX+2)[m
[31m-      ra = lj_ir_tonum(J, ra);[m
[31m-    else if (rc == ~LJ_TSTR+1)[m
[31m-      ra = lj_ir_tostr(J, ra);[m
[31m-    /* else: type specialization suffices. */[m
[31m-    J->base[bc_a(ins)] = ra;[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_NOT:[m
[31m-    /* Type specialization already forces const result. */[m
[31m-    rc = tref_istruecond(rc) ? TREF_FALSE : TREF_TRUE;[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LEN:[m
[31m-    if (tref_isstr(rc))[m
[31m-      rc = emitir(IRTI(IR_FLOAD), rc, IRFL_STR_LEN);[m
[31m-    else if (!LJ_52 && tref_istab(rc))[m
[31m-      rc = lj_ir_call(J, IRCALL_lj_tab_len, rc);[m
[31m-    else[m
[31m-      rc = rec_mm_len(J, rc, rcv);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Arithmetic ops ---------------------------------------------------- */[m
[31m-[m
[31m-  case BC_UNM:[m
[31m-    if (tref_isnumber_str(rc)) {[m
[31m-      rc = lj_opt_narrow_unm(J, rc, rcv);[m
[31m-    } else {[m
[31m-      ix.tab = rc;[m
[31m-      copyTV(J->L, &ix.tabv, rcv);[m
[31m-      rc = rec_mm_arith(J, &ix, MM_unm);[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ADDNV: case BC_SUBNV: case BC_MULNV: case BC_DIVNV: case BC_MODNV:[m
[31m-    /* Swap rb/rc and rbv/rcv. rav is temp. */[m
[31m-    ix.tab = rc; ix.key = rc = rb; rb = ix.tab;[m
[31m-    copyTV(J->L, rav, rbv);[m
[31m-    copyTV(J->L, rbv, rcv);[m
[31m-    copyTV(J->L, rcv, rav);[m
[31m-    if (op == BC_MODNV)[m
[31m-      goto recmod;[m
[31m-    /* fallthrough */[m
[31m-  case BC_ADDVN: case BC_SUBVN: case BC_MULVN: case BC_DIVVN:[m
[31m-  case BC_ADDVV: case BC_SUBVV: case BC_MULVV: case BC_DIVVV: {[m
[31m-    MMS mm = bcmode_mm(op);[m
[31m-    if (tref_isnumber_str(rb) && tref_isnumber_str(rc))[m
[31m-      rc = lj_opt_narrow_arith(J, rb, rc, rbv, rcv,[m
[31m-			       (int)mm - (int)MM_add + (int)IR_ADD);[m
[31m-    else[m
[31m-      rc = rec_mm_arith(J, &ix, mm);[m
[31m-    break;[m
[31m-    }[m
[31m-[m
[31m-  case BC_MODVN: case BC_MODVV:[m
[31m-  recmod:[m
[31m-    if (tref_isnumber_str(rb) && tref_isnumber_str(rc))[m
[31m-      rc = lj_opt_narrow_mod(J, rb, rc, rbv, rcv);[m
[31m-    else[m
[31m-      rc = rec_mm_arith(J, &ix, MM_mod);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_POW:[m
[31m-    if (tref_isnumber_str(rb) && tref_isnumber_str(rc))[m
[31m-      rc = lj_opt_narrow_pow(J, rb, rc, rbv, rcv);[m
[31m-    else[m
[31m-      rc = rec_mm_arith(J, &ix, MM_pow);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Miscellaneous ops ------------------------------------------------- */[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    rc = rec_cat(J, rb, rc);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant and move ops --------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    /* Clear gap of method call to avoid resurrecting previous refs. */[m
[31m-    if (ra > J->maxslot) J->base[ra-1] = 0;[m
[31m-    break;[m
[31m-  case BC_KSTR: case BC_KNUM: case BC_KPRI:[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    rc = lj_ir_kint(J, (int32_t)(int16_t)rc);[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    while (ra <= rc)[m
[31m-      J->base[ra++] = TREF_NIL;[m
[31m-    if (rc >= J->maxslot) J->maxslot = rc+1;[m
[31m-    break;[m
[31m-#if LJ_HASFFI[m
[31m-  case BC_KCDATA:[m
[31m-    rc = lj_ir_kgc(J, proto_kgc(J->pt, ~(ptrdiff_t)rc), IRT_CDATA);[m
[31m-    break;[m
[31m-#endif[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    rc = rec_upvalue(J, rc, 0);[m
[31m-    break;[m
[31m-  case BC_USETV: case BC_USETS: case BC_USETN: case BC_USETP:[m
[31m-    rec_upvalue(J, ra, rc);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_GGET: case BC_GSET:[m
[31m-    settabV(J->L, &ix.tabv, tabref(J->fn->l.env));[m
[31m-    ix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), getcurrf(J), IRFL_FUNC_ENV);[m
[31m-    ix.idxchain = LJ_MAX_IDXCHAIN;[m
[31m-    rc = lj_record_idx(J, &ix);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETB: case BC_TSETB:[m
[31m-    setintV(&ix.keyv, (int32_t)rc);[m
[31m-    ix.key = lj_ir_kint(J, (int32_t)rc);[m
[31m-    /* fallthrough */[m
[31m-  case BC_TGETV: case BC_TGETS: case BC_TSETV: case BC_TSETS:[m
[31m-    ix.idxchain = LJ_MAX_IDXCHAIN;[m
[31m-    rc = lj_record_idx(J, &ix);[m
[31m-    break;[m
[31m-  case BC_TGETR: case BC_TSETR:[m
[31m-    ix.idxchain = 0;[m
[31m-    rc = lj_record_idx(J, &ix);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    rec_tsetm(J, ra, (BCReg)(J->L->top - J->L->base), (int32_t)rcv->u32.lo);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-    rc = rec_tnew(J, rc);[m
[31m-    break;[m
[31m-  case BC_TDUP:[m
[31m-    rc = emitir(IRTG(IR_TDUP, IRT_TAB),[m
[31m-		lj_ir_ktab(J, gco2tab(proto_kgc(J->pt, ~(ptrdiff_t)rc))), 0);[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-    J->rbchash[(rc & (RBCHASH_SLOTS-1))].ref = tref_ref(rc);[m
[31m-    setmref(J->rbchash[(rc & (RBCHASH_SLOTS-1))].pc, pc);[m
[31m-    setgcref(J->rbchash[(rc & (RBCHASH_SLOTS-1))].pt, obj2gco(J->pt));[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    J->base[ra] = getslot(J, ra-3-LJ_FR2);[m
[31m-    J->base[ra+1] = getslot(J, ra-2-LJ_FR2);[m
[31m-    J->base[ra+2] = getslot(J, ra-1-LJ_FR2);[m
[31m-    { /* Do the actual copy now because lj_record_call needs the values. */[m
[31m-      TValue *b = &J->L->base[ra];[m
[31m-      copyTV(J->L, b, b-3-LJ_FR2);[m
[31m-      copyTV(J->L, b+1, b-2-LJ_FR2);[m
[31m-      copyTV(J->L, b+2, b-1-LJ_FR2);[m
[31m-    }[m
[31m-    lj_record_call(J, ra, (ptrdiff_t)rc-1);[m
[31m-    break;[m
[31m-[m
[31m-  /* L->top is set to L->base+ra+rc+NARGS-1+1. See lj_dispatch_ins(). */[m
[31m-  case BC_CALLM:[m
[31m-    rc = (BCReg)(J->L->top - J->L->base) - ra - LJ_FR2;[m
[31m-    /* fallthrough */[m
[31m-  case BC_CALL:[m
[31m-    lj_record_call(J, ra, (ptrdiff_t)rc-1);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    rc = (BCReg)(J->L->top - J->L->base) - ra - LJ_FR2;[m
[31m-    /* fallthrough */[m
[31m-  case BC_CALLT:[m
[31m-    lj_record_tailcall(J, ra, (ptrdiff_t)rc-1);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    rec_varg(J, ra, (ptrdiff_t)rb-1);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    /* L->top is set to L->base+ra+rc+NRESULTS-1, see lj_dispatch_ins(). */[m
[31m-    rc = (BCReg)(J->L->top - J->L->base) - ra + 1;[m
[31m-    /* fallthrough */[m
[31m-  case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-#if LJ_HASPROFILE[m
[31m-    rec_profile_ret(J);[m
[31m-#endif[m
[31m-    lj_record_ret(J, ra, (ptrdiff_t)rc-1);[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  case BC_FORI:[m
[31m-    if (rec_for(J, pc, 0) != LOOPEV_LEAVE)[m
[31m-      J->loopref = J->cur.nins;[m
[31m-    break;[m
[31m-  case BC_JFORI:[m
[31m-    lua_assert(bc_op(pc[(ptrdiff_t)rc-BCBIAS_J]) == BC_JFORL);[m
[31m-    if (rec_for(J, pc, 0) != LOOPEV_LEAVE)  /* Link to existing loop. */[m
[31m-      lj_record_stop(J, LJ_TRLINK_ROOT, bc_d(pc[(ptrdiff_t)rc-BCBIAS_J]));[m
[31m-    /* Continue tracing if the loop is not entered. */[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    rec_loop_interp(J, pc, rec_for(J, pc+((ptrdiff_t)rc-BCBIAS_J), 1));[m
[31m-    break;[m
[31m-  case BC_ITERL:[m
[31m-    rec_loop_interp(J, pc, rec_iterl(J, *pc));[m
[31m-    break;[m
[31m-  case BC_LOOP:[m
[31m-    rec_loop_interp(J, pc, rec_loop(J, ra));[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORL:[m
[31m-    rec_loop_jit(J, rc, rec_for(J, pc+bc_j(traceref(J, rc)->startins), 1));[m
[31m-    break;[m
[31m-  case BC_JITERL:[m
[31m-    rec_loop_jit(J, rc, rec_iterl(J, traceref(J, rc)->startins));[m
[31m-    break;[m
[31m-  case BC_JLOOP:[m
[31m-    rec_loop_jit(J, rc, rec_loop(J, ra));[m
[31m-    break;[m
[31m-[m
[31m-  case BC_IFORL:[m
[31m-  case BC_IITERL:[m
[31m-  case BC_ILOOP:[m
[31m-  case BC_IFUNCF:[m
[31m-  case BC_IFUNCV:[m
[31m-    lj_trace_err(J, LJ_TRERR_BLACKL);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    if (ra < J->maxslot)[m
[31m-      J->maxslot = ra;  /* Shrink used slots. */[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    rec_func_lua(J);[m
[31m-    break;[m
[31m-  case BC_JFUNCF:[m
[31m-    rec_func_jit(J, rc);[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCV:[m
[31m-    rec_func_vararg(J);[m
[31m-    rec_func_lua(J);[m
[31m-    break;[m
[31m-  case BC_JFUNCV:[m
[31m-    lua_assert(0);  /* Cannot happen. No hotcall counting for varag funcs. */[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    lj_ffrecord_func(J);[m
[31m-    break;[m
[31m-[m
[31m-  default:[m
[31m-    if (op >= BC__MAX) {[m
[31m-      lj_ffrecord_func(J);[m
[31m-      break;[m
[31m-    }[m
[31m-    /* fallthrough */[m
[31m-  case BC_ITERN:[m
[31m-  case BC_ISNEXT:[m
[31m-  case BC_UCLO:[m
[31m-  case BC_FNEW:[m
[31m-    setintV(&J->errinfo, (int32_t)op);[m
[31m-    lj_trace_err_info(J, LJ_TRERR_NYIBC);[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  /* rc == 0 if we have no result yet, e.g. pending __index metamethod call. */[m
[31m-  if (bcmode_a(op) == BCMdst && rc) {[m
[31m-    J->base[ra] = rc;[m
[31m-    if (ra >= J->maxslot) J->maxslot = ra+1;[m
[31m-  }[m
[31m-[m
[31m-#undef rav[m
[31m-#undef rbv[m
[31m-#undef rcv[m
[31m-[m
[31m-  /* Limit the number of recorded IR instructions. */[m
[31m-  if (J->cur.nins > REF_FIRST+(IRRef)J->param[JIT_P_maxrecord])[m
[31m-    lj_trace_err(J, LJ_TRERR_TRACEOV);[m
[31m-}[m
[31m-[m
[31m-/* -- Recording setup ----------------------------------------------------- */[m
[31m-[m
[31m-/* Setup recording for a root trace started by a hot loop. */[m
[31m-static const BCIns *rec_setup_root(jit_State *J)[m
[31m-{[m
[31m-  /* Determine the next PC and the bytecode range for the loop. */[m
[31m-  const BCIns *pcj, *pc = J->pc;[m
[31m-  BCIns ins = *pc;[m
[31m-  BCReg ra = bc_a(ins);[m
[31m-  switch (bc_op(ins)) {[m
[31m-  case BC_FORL:[m
[31m-    J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns);[m
[31m-    pc += 1+bc_j(ins);[m
[31m-    J->bc_min = pc;[m
[31m-    break;[m
[31m-  case BC_ITERL:[m
[31m-    lua_assert(bc_op(pc[-1]) == BC_ITERC);[m
[31m-    J->maxslot = ra + bc_b(pc[-1]) - 1;[m
[31m-    J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns);[m
[31m-    pc += 1+bc_j(ins);[m
[31m-    lua_assert(bc_op(pc[-1]) == BC_JMP);[m
[31m-    J->bc_min = pc;[m
[31m-    break;[m
[31m-  case BC_LOOP:[m
[31m-    /* Only check BC range for real loops, but not for "repeat until true". */[m
[31m-    pcj = pc + bc_j(ins);[m
[31m-    ins = *pcj;[m
[31m-    if (bc_op(ins) == BC_JMP && bc_j(ins) < 0) {[m
[31m-      J->bc_min = pcj+1 + bc_j(ins);[m
[31m-      J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns);[m
[31m-    }[m
[31m-    J->maxslot = ra;[m
[31m-    pc++;[m
[31m-    break;[m
[31m-  case BC_RET:[m
[31m-  case BC_RET0:[m
[31m-  case BC_RET1:[m
[31m-    /* No bytecode range check for down-recursive root traces. */[m
[31m-    J->maxslot = ra + bc_d(ins) - 1;[m
[31m-    break;[m
[31m-  case BC_FUNCF:[m
[31m-    /* No bytecode range check for root traces started by a hot call. */[m
[31m-    J->maxslot = J->pt->numparams;[m
[31m-    pc++;[m
[31m-    break;[m
[31m-  case BC_CALLM:[m
[31m-  case BC_CALL:[m
[31m-  case BC_ITERC:[m
[31m-    /* No bytecode range check for stitched traces. */[m
[31m-    pc++;[m
[31m-    break;[m
[31m-  default:[m
[31m-    lua_assert(0);[m
[31m-    break;[m
[31m-  }[m
[31m-  return pc;[m
[31m-}[m
[31m-[m
[31m-/* Setup for recording a new trace. */[m
[31m-void lj_record_setup(jit_State *J)[m
[31m-{[m
[31m-  uint32_t i;[m
[31m-[m
[31m-  /* Initialize state related to current trace. */[m
[31m-  memset(J->slot, 0, sizeof(J->slot));[m
[31m-  memset(J->chain, 0, sizeof(J->chain));[m
[31m-#ifdef LUAJIT_ENABLE_TABLE_BUMP[m
[31m-  memset(J->rbchash, 0, sizeof(J->rbchash));[m
[31m-#endif[m
[31m-  memset(J->bpropcache, 0, sizeof(J->bpropcache));[m
[31m-  J->scev.idx = REF_NIL;[m
[31m-  setmref(J->scev.pc, NULL);[m
[31m-[m
[31m-  J->baseslot = 1;  /* Invoking function is at base[-1]. */[m
[31m-  J->base = J->slot + J->baseslot;[m
[31m-  J->maxslot = 0;[m
[31m-  J->framedepth = 0;[m
[31m-  J->retdepth = 0;[m
[31m-[m
[31m-  J->instunroll = J->param[JIT_P_instunroll];[m
[31m-  J->loopunroll = J->param[JIT_P_loopunroll];[m
[31m-  J->tailcalled = 0;[m
[31m-  J->loopref = 0;[m
[31m-[m
[31m-  J->bc_min = NULL;  /* Means no limit. */[m
[31m-  J->bc_extent = ~(MSize)0;[m
[31m-[m
[31m-  /* Emit instructions for fixed references. Also triggers initial IR alloc. */[m
[31m-  emitir_raw(IRT(IR_BASE, IRT_P32), J->parent, J->exitno);[m
[31m-  for (i = 0; i <= 2; i++) {[m
[31m-    IRIns *ir = IR(REF_NIL-i);[m
[31m-    ir->i = 0;[m
[31m-    ir->t.irt = (uint8_t)(IRT_NIL+i);[m
[31m-    ir->o = IR_KPRI;[m
[31m-    ir->prev = 0;[m
[31m-  }[m
[31m-  J->cur.nk = REF_TRUE;[m
[31m-[m
[31m-  J->startpc = J->pc;[m
[31m-  setmref(J->cur.startpc, J->pc);[m
[31m-  if (J->parent) {  /* Side trace. */[m
[31m-    GCtrace *T = traceref(J, J->parent);[m
[31m-    TraceNo root = T->root ? T->root : J->parent;[m
[31m-    J->cur.root = (uint16_t)root;[m
[31m-    J->cur.startins = BCINS_AD(BC_JMP, 0, 0);[m
[31m-    /* Check whether we could at least potentially form an extra loop. */[m
[31m-    if (J->exitno == 0 && T->snap[0].nent == 0) {[m
[31m-      /* We can narrow a FORL for some side traces, too. */[m
[31m-      if (J->pc > proto_bc(J->pt) && bc_op(J->pc[-1]) == BC_JFORI &&[m
[31m-	  bc_d(J->pc[bc_j(J->pc[-1])-1]) == root) {[m
[31m-	lj_snap_add(J);[m
[31m-	rec_for_loop(J, J->pc-1, &J->scev, 1);[m
[31m-	goto sidecheck;[m
[31m-      }[m
[31m-    } else {[m
[31m-      J->startpc = NULL;  /* Prevent forming an extra loop. */[m
[31m-    }[m
[31m-    lj_snap_replay(J, T);[m
[31m-  sidecheck:[m
[31m-    if (traceref(J, J->cur.root)->nchild >= J->param[JIT_P_maxside] ||[m
[31m-	T->snap[J->exitno].count >= J->param[JIT_P_hotexit] +[m
[31m-				    J->param[JIT_P_tryside]) {[m
[31m-      lj_record_stop(J, LJ_TRLINK_INTERP, 0);[m
[31m-    }[m
[31m-  } else {  /* Root trace. */[m
[31m-    J->cur.root = 0;[m
[31m-    J->cur.startins = *J->pc;[m
[31m-    J->pc = rec_setup_root(J);[m
[31m-    /* Note: the loop instruction itself is recorded at the end and not[m
[31m-    ** at the start! So snapshot #0 needs to point to the *next* instruction.[m
[31m-    */[m
[31m-    lj_snap_add(J);[m
[31m-    if (bc_op(J->cur.startins) == BC_FORL)[m
[31m-      rec_for_loop(J, J->pc-1, &J->scev, 1);[m
[31m-    else if (bc_op(J->cur.startins) == BC_ITERC)[m
[31m-      J->startpc = NULL;[m
[31m-    if (1 + J->pt->framesize >= LJ_MAX_JSLOTS)[m
[31m-      lj_trace_err(J, LJ_TRERR_STACKOV);[m
[31m-  }[m
[31m-#if LJ_HASPROFILE[m
[31m-  J->prev_pt = NULL;[m
[31m-  J->prev_line = -1;[m
[31m-#endif[m
[31m-#ifdef LUAJIT_ENABLE_CHECKHOOK[m
[31m-  /* Regularly check for instruction/line hooks from compiled code and[m
[31m-  ** exit to the interpreter if the hooks are set.[m
[31m-  **[m
[31m-  ** This is a compile-time option and disabled by default, since the[m
[31m-  ** hook checks may be quite expensive in tight loops.[m
[31m-  **[m
[31m-  ** Note this is only useful if hooks are *not* set most of the time.[m
[31m-  ** Use this only if you want to *asynchronously* interrupt the execution.[m
[31m-  **[m
[31m-  ** You can set the instruction hook via lua_sethook() with a count of 1[m
[31m-  ** from a signal handler or another native thread. Please have a look[m
[31m-  ** at the first few functions in luajit.c for an example (Ctrl-C handler).[m
[31m-  */[m
[31m-  {[m
[31m-    TRef tr = emitir(IRT(IR_XLOAD, IRT_U8),[m
[31m-		     lj_ir_kptr(J, &J2G(J)->hookmask), IRXLOAD_VOLATILE);[m
[31m-    tr = emitir(IRTI(IR_BAND), tr, lj_ir_kint(J, (LUA_MASKLINE|LUA_MASKCOUNT)));[m
[31m-    emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, 0));[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#undef IR[m
[31m-#undef emitir_raw[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_record.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_record.h[m
[1mdeleted file mode 100644[m
[1mindex cb184e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_record.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-/*[m
[31m-** Trace recorder (bytecode -> SSA IR).[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_RECORD_H[m
[31m-#define _LJ_RECORD_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Context for recording an indexed load/store. */[m
[31m-typedef struct RecordIndex {[m
[31m-  TValue tabv;		/* Runtime value of table (or indexed object). */[m
[31m-  TValue keyv;		/* Runtime value of key. */[m
[31m-  TValue valv;		/* Runtime value of stored value. */[m
[31m-  TValue mobjv;		/* Runtime value of metamethod object. */[m
[31m-  GCtab *mtv;		/* Runtime value of metatable object. */[m
[31m-  cTValue *oldv;	/* Runtime value of previously stored value. */[m
[31m-  TRef tab;		/* Table (or indexed object) reference. */[m
[31m-  TRef key;		/* Key reference. */[m
[31m-  TRef val;		/* Value reference for a store or 0 for a load. */[m
[31m-  TRef mt;		/* Metatable reference. */[m
[31m-  TRef mobj;		/* Metamethod object reference. */[m
[31m-  int idxchain;		/* Index indirections left or 0 for raw lookup. */[m
[31m-} RecordIndex;[m
[31m-[m
[31m-LJ_FUNC int lj_record_objcmp(jit_State *J, TRef a, TRef b,[m
[31m-			     cTValue *av, cTValue *bv);[m
[31m-LJ_FUNC void lj_record_stop(jit_State *J, TraceLink linktype, TraceNo lnk);[m
[31m-LJ_FUNC TRef lj_record_constify(jit_State *J, cTValue *o);[m
[31m-[m
[31m-LJ_FUNC void lj_record_call(jit_State *J, BCReg func, ptrdiff_t nargs);[m
[31m-LJ_FUNC void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs);[m
[31m-LJ_FUNC void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults);[m
[31m-[m
[31m-LJ_FUNC int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm);[m
[31m-LJ_FUNC TRef lj_record_idx(jit_State *J, RecordIndex *ix);[m
[31m-[m
[31m-LJ_FUNC void lj_record_ins(jit_State *J);[m
[31m-LJ_FUNC void lj_record_setup(jit_State *J);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_snap.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_snap.c[m
[1mdeleted file mode 100644[m
[1mindex 8638d9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_snap.c[m
[1m+++ /dev/null[m
[36m@@ -1,867 +0,0 @@[m
[31m-/*[m
[31m-** Snapshot handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_snap_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_target.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#include "lj_cdata.h"[m
[31m-#endif[m
[31m-[m
[31m-/* Pass IR on to next optimization in chain (FOLD). */[m
[31m-#define emitir(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))[m
[31m-[m
[31m-/* Emit raw IR without passing through optimizations. */[m
[31m-#define emitir_raw(ot, a, b)	(lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))[m
[31m-[m
[31m-/* -- Snapshot buffer allocation ------------------------------------------ */[m
[31m-[m
[31m-/* Grow snapshot buffer. */[m
[31m-void lj_snap_grow_buf_(jit_State *J, MSize need)[m
[31m-{[m
[31m-  MSize maxsnap = (MSize)J->param[JIT_P_maxsnap];[m
[31m-  if (need > maxsnap)[m
[31m-    lj_trace_err(J, LJ_TRERR_SNAPOV);[m
[31m-  lj_mem_growvec(J->L, J->snapbuf, J->sizesnap, maxsnap, SnapShot);[m
[31m-  J->cur.snap = J->snapbuf;[m
[31m-}[m
[31m-[m
[31m-/* Grow snapshot map buffer. */[m
[31m-void lj_snap_grow_map_(jit_State *J, MSize need)[m
[31m-{[m
[31m-  if (need < 2*J->sizesnapmap)[m
[31m-    need = 2*J->sizesnapmap;[m
[31m-  else if (need < 64)[m
[31m-    need = 64;[m
[31m-  J->snapmapbuf = (SnapEntry *)lj_mem_realloc(J->L, J->snapmapbuf,[m
[31m-		    J->sizesnapmap*sizeof(SnapEntry), need*sizeof(SnapEntry));[m
[31m-  J->cur.snapmap = J->snapmapbuf;[m
[31m-  J->sizesnapmap = need;[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot generation ------------------------------------------------- */[m
[31m-[m
[31m-/* Add all modified slots to the snapshot. */[m
[31m-static MSize snapshot_slots(jit_State *J, SnapEntry *map, BCReg nslots)[m
[31m-{[m
[31m-  IRRef retf = J->chain[IR_RETF];  /* Limits SLOAD restore elimination. */[m
[31m-  BCReg s;[m
[31m-  MSize n = 0;[m
[31m-  for (s = 0; s < nslots; s++) {[m
[31m-    TRef tr = J->slot[s];[m
[31m-    IRRef ref = tref_ref(tr);[m
[31m-    if (ref) {[m
[31m-      SnapEntry sn = SNAP_TR(s, tr);[m
[31m-      IRIns *ir = &J->cur.ir[ref];[m
[31m-      if (!(sn & (SNAP_CONT|SNAP_FRAME)) &&[m
[31m-	  ir->o == IR_SLOAD && ir->op1 == s && ref > retf) {[m
[31m-	/* No need to snapshot unmodified non-inherited slots. */[m
[31m-	if (!(ir->op2 & IRSLOAD_INHERIT))[m
[31m-	  continue;[m
[31m-	/* No need to restore readonly slots and unmodified non-parent slots. */[m
[31m-	if (!(LJ_DUALNUM && (ir->op2 & IRSLOAD_CONVERT)) &&[m
[31m-	    (ir->op2 & (IRSLOAD_READONLY|IRSLOAD_PARENT)) != IRSLOAD_PARENT)[m
[31m-	  sn |= SNAP_NORESTORE;[m
[31m-      }[m
[31m-      if (LJ_SOFTFP && irt_isnum(ir->t))[m
[31m-	sn |= SNAP_SOFTFPNUM;[m
[31m-      map[n++] = sn;[m
[31m-    }[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-/* Add frame links at the end of the snapshot. */[m
[31m-static BCReg snapshot_framelinks(jit_State *J, SnapEntry *map)[m
[31m-{[m
[31m-  cTValue *frame = J->L->base - 1;[m
[31m-  cTValue *lim = J->L->base - J->baseslot;[m
[31m-  GCfunc *fn = frame_func(frame);[m
[31m-  cTValue *ftop = isluafunc(fn) ? (frame+funcproto(fn)->framesize) : J->L->top;[m
[31m-  MSize f = 0;[m
[31m-  lua_assert(!LJ_FR2);  /* TODO_FR2: store 64 bit PCs. */[m
[31m-  map[f++] = SNAP_MKPC(J->pc);  /* The current PC is always the first entry. */[m
[31m-  while (frame > lim) {  /* Backwards traversal of all frames above base. */[m
[31m-    if (frame_islua(frame)) {[m
[31m-      map[f++] = SNAP_MKPC(frame_pc(frame));[m
[31m-      frame = frame_prevl(frame);[m
[31m-    } else if (frame_iscont(frame)) {[m
[31m-      map[f++] = SNAP_MKFTSZ(frame_ftsz(frame));[m
[31m-      map[f++] = SNAP_MKPC(frame_contpc(frame));[m
[31m-      frame = frame_prevd(frame);[m
[31m-    } else {[m
[31m-      lua_assert(!frame_isc(frame));[m
[31m-      map[f++] = SNAP_MKFTSZ(frame_ftsz(frame));[m
[31m-      frame = frame_prevd(frame);[m
[31m-      continue;[m
[31m-    }[m
[31m-    if (frame + funcproto(frame_func(frame))->framesize > ftop)[m
[31m-      ftop = frame + funcproto(frame_func(frame))->framesize;[m
[31m-  }[m
[31m-  lua_assert(f == (MSize)(1 + J->framedepth));[m
[31m-  return (BCReg)(ftop - lim);[m
[31m-}[m
[31m-[m
[31m-/* Take a snapshot of the current stack. */[m
[31m-static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap)[m
[31m-{[m
[31m-  BCReg nslots = J->baseslot + J->maxslot;[m
[31m-  MSize nent;[m
[31m-  SnapEntry *p;[m
[31m-  /* Conservative estimate. */[m
[31m-  lj_snap_grow_map(J, nsnapmap + nslots + (MSize)J->framedepth+1);[m
[31m-  p = &J->cur.snapmap[nsnapmap];[m
[31m-  nent = snapshot_slots(J, p, nslots);[m
[31m-  snap->topslot = (uint8_t)snapshot_framelinks(J, p + nent);[m
[31m-  snap->mapofs = (uint16_t)nsnapmap;[m
[31m-  snap->ref = (IRRef1)J->cur.nins;[m
[31m-  snap->nent = (uint8_t)nent;[m
[31m-  snap->nslots = (uint8_t)nslots;[m
[31m-  snap->count = 0;[m
[31m-  J->cur.nsnapmap = (uint16_t)(nsnapmap + nent + 1 + J->framedepth);[m
[31m-}[m
[31m-[m
[31m-/* Add or merge a snapshot. */[m
[31m-void lj_snap_add(jit_State *J)[m
[31m-{[m
[31m-  MSize nsnap = J->cur.nsnap;[m
[31m-  MSize nsnapmap = J->cur.nsnapmap;[m
[31m-  /* Merge if no ins. inbetween or if requested and no guard inbetween. */[m
[31m-  if ((nsnap > 0 && J->cur.snap[nsnap-1].ref == J->cur.nins) ||[m
[31m-      (J->mergesnap && !irt_isguard(J->guardemit))) {[m
[31m-    if (nsnap == 1) {  /* But preserve snap #0 PC. */[m
[31m-      emitir_raw(IRT(IR_NOP, IRT_NIL), 0, 0);[m
[31m-      goto nomerge;[m
[31m-    }[m
[31m-    nsnapmap = J->cur.snap[--nsnap].mapofs;[m
[31m-  } else {[m
[31m-  nomerge:[m
[31m-    lj_snap_grow_buf(J, nsnap+1);[m
[31m-    J->cur.nsnap = (uint16_t)(nsnap+1);[m
[31m-  }[m
[31m-  J->mergesnap = 0;[m
[31m-  J->guardemit.irt = 0;[m
[31m-  snapshot_stack(J, &J->cur.snap[nsnap], nsnapmap);[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot modification ----------------------------------------------- */[m
[31m-[m
[31m-#define SNAP_USEDEF_SLOTS	(LJ_MAX_JSLOTS+LJ_STACK_EXTRA)[m
[31m-[m
[31m-/* Find unused slots with reaching-definitions bytecode data-flow analysis. */[m
[31m-static BCReg snap_usedef(jit_State *J, uint8_t *udf,[m
[31m-			 const BCIns *pc, BCReg maxslot)[m
[31m-{[m
[31m-  BCReg s;[m
[31m-  GCobj *o;[m
[31m-[m
[31m-  if (maxslot == 0) return 0;[m
[31m-#ifdef LUAJIT_USE_VALGRIND[m
[31m-  /* Avoid errors for harmless reads beyond maxslot. */[m
[31m-  memset(udf, 1, SNAP_USEDEF_SLOTS);[m
[31m-#else[m
[31m-  memset(udf, 1, maxslot);[m
[31m-#endif[m
[31m-[m
[31m-  /* Treat open upvalues as used. */[m
[31m-  o = gcref(J->L->openupval);[m
[31m-  while (o) {[m
[31m-    if (uvval(gco2uv(o)) < J->L->base) break;[m
[31m-    udf[uvval(gco2uv(o)) - J->L->base] = 0;[m
[31m-    o = gcref(o->gch.nextgc);[m
[31m-  }[m
[31m-[m
[31m-#define USE_SLOT(s)		udf[(s)] &= ~1[m
[31m-#define DEF_SLOT(s)		udf[(s)] *= 3[m
[31m-[m
[31m-  /* Scan through following bytecode and check for uses/defs. */[m
[31m-  lua_assert(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc);[m
[31m-  for (;;) {[m
[31m-    BCIns ins = *pc++;[m
[31m-    BCOp op = bc_op(ins);[m
[31m-    switch (bcmode_b(op)) {[m
[31m-    case BCMvar: USE_SLOT(bc_b(ins)); break;[m
[31m-    default: break;[m
[31m-    }[m
[31m-    switch (bcmode_c(op)) {[m
[31m-    case BCMvar: USE_SLOT(bc_c(ins)); break;[m
[31m-    case BCMrbase:[m
[31m-      lua_assert(op == BC_CAT);[m
[31m-      for (s = bc_b(ins); s <= bc_c(ins); s++) USE_SLOT(s);[m
[31m-      for (; s < maxslot; s++) DEF_SLOT(s);[m
[31m-      break;[m
[31m-    case BCMjump:[m
[31m-    handle_jump: {[m
[31m-      BCReg minslot = bc_a(ins);[m
[31m-      if (op >= BC_FORI && op <= BC_JFORL) minslot += FORL_EXT;[m
[31m-      else if (op >= BC_ITERL && op <= BC_JITERL) minslot += bc_b(pc[-2])-1;[m
[31m-      else if (op == BC_UCLO) { pc += bc_j(ins); break; }[m
[31m-      for (s = minslot; s < maxslot; s++) DEF_SLOT(s);[m
[31m-      return minslot < maxslot ? minslot : maxslot;[m
[31m-      }[m
[31m-    case BCMlit:[m
[31m-      if (op == BC_JFORL || op == BC_JITERL || op == BC_JLOOP) {[m
[31m-	goto handle_jump;[m
[31m-      } else if (bc_isret(op)) {[m
[31m-	BCReg top = op == BC_RETM ? maxslot : (bc_a(ins) + bc_d(ins)-1);[m
[31m-	for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s);[m
[31m-	for (; s < top; s++) USE_SLOT(s);[m
[31m-	for (; s < maxslot; s++) DEF_SLOT(s);[m
[31m-	return 0;[m
[31m-      }[m
[31m-      break;[m
[31m-    case BCMfunc: return maxslot;  /* NYI: will abort, anyway. */[m
[31m-    default: break;[m
[31m-    }[m
[31m-    switch (bcmode_a(op)) {[m
[31m-    case BCMvar: USE_SLOT(bc_a(ins)); break;[m
[31m-    case BCMdst:[m
[31m-       if (!(op == BC_ISTC || op == BC_ISFC)) DEF_SLOT(bc_a(ins));[m
[31m-       break;[m
[31m-    case BCMbase:[m
[31m-      if (op >= BC_CALLM && op <= BC_VARG) {[m
[31m-	BCReg top = (op == BC_CALLM || op == BC_CALLMT || bc_c(ins) == 0) ?[m
[31m-		    maxslot : (bc_a(ins) + bc_c(ins)+LJ_FR2);[m
[31m-	if (LJ_FR2) DEF_SLOT(bc_a(ins)+1);[m
[31m-	s = bc_a(ins) - ((op == BC_ITERC || op == BC_ITERN) ? 3 : 0);[m
[31m-	for (; s < top; s++) USE_SLOT(s);[m
[31m-	for (; s < maxslot; s++) DEF_SLOT(s);[m
[31m-	if (op == BC_CALLT || op == BC_CALLMT) {[m
[31m-	  for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s);[m
[31m-	  return 0;[m
[31m-	}[m
[31m-      } else if (op == BC_KNIL) {[m
[31m-	for (s = bc_a(ins); s <= bc_d(ins); s++) DEF_SLOT(s);[m
[31m-      } else if (op == BC_TSETM) {[m
[31m-	for (s = bc_a(ins)-1; s < maxslot; s++) USE_SLOT(s);[m
[31m-      }[m
[31m-      break;[m
[31m-    default: break;[m
[31m-    }[m
[31m-    lua_assert(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc);[m
[31m-  }[m
[31m-[m
[31m-#undef USE_SLOT[m
[31m-#undef DEF_SLOT[m
[31m-[m
[31m-  return 0;  /* unreachable */[m
[31m-}[m
[31m-[m
[31m-/* Purge dead slots before the next snapshot. */[m
[31m-void lj_snap_purge(jit_State *J)[m
[31m-{[m
[31m-  uint8_t udf[SNAP_USEDEF_SLOTS];[m
[31m-  BCReg maxslot = J->maxslot;[m
[31m-  BCReg s = snap_usedef(J, udf, J->pc, maxslot);[m
[31m-  for (; s < maxslot; s++)[m
[31m-    if (udf[s] != 0)[m
[31m-      J->base[s] = 0;  /* Purge dead slots. */[m
[31m-}[m
[31m-[m
[31m-/* Shrink last snapshot. */[m
[31m-void lj_snap_shrink(jit_State *J)[m
[31m-{[m
[31m-  SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];[m
[31m-  SnapEntry *map = &J->cur.snapmap[snap->mapofs];[m
[31m-  MSize n, m, nlim, nent = snap->nent;[m
[31m-  uint8_t udf[SNAP_USEDEF_SLOTS];[m
[31m-  BCReg maxslot = J->maxslot;[m
[31m-  BCReg minslot = snap_usedef(J, udf, snap_pc(map[nent]), maxslot);[m
[31m-  BCReg baseslot = J->baseslot;[m
[31m-  maxslot += baseslot;[m
[31m-  minslot += baseslot;[m
[31m-  snap->nslots = (uint8_t)maxslot;[m
[31m-  for (n = m = 0; n < nent; n++) {  /* Remove unused slots from snapshot. */[m
[31m-    BCReg s = snap_slot(map[n]);[m
[31m-    if (s < minslot || (s < maxslot && udf[s-baseslot] == 0))[m
[31m-      map[m++] = map[n];  /* Only copy used slots. */[m
[31m-  }[m
[31m-  snap->nent = (uint8_t)m;[m
[31m-  nlim = J->cur.nsnapmap - snap->mapofs - 1;[m
[31m-  while (n <= nlim) map[m++] = map[n++];  /* Move PC + frame links down. */[m
[31m-  J->cur.nsnapmap = (uint16_t)(snap->mapofs + m);  /* Free up space in map. */[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot access ----------------------------------------------------- */[m
[31m-[m
[31m-/* Initialize a Bloom Filter with all renamed refs.[m
[31m-** There are very few renames (often none), so the filter has[m
[31m-** very few bits set. This makes it suitable for negative filtering.[m
[31m-*/[m
[31m-static BloomFilter snap_renamefilter(GCtrace *T, SnapNo lim)[m
[31m-{[m
[31m-  BloomFilter rfilt = 0;[m
[31m-  IRIns *ir;[m
[31m-  for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--)[m
[31m-    if (ir->op2 <= lim)[m
[31m-      bloomset(rfilt, ir->op1);[m
[31m-  return rfilt;[m
[31m-}[m
[31m-[m
[31m-/* Process matching renames to find the original RegSP. */[m
[31m-static RegSP snap_renameref(GCtrace *T, SnapNo lim, IRRef ref, RegSP rs)[m
[31m-{[m
[31m-  IRIns *ir;[m
[31m-  for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--)[m
[31m-    if (ir->op1 == ref && ir->op2 <= lim)[m
[31m-      rs = ir->prev;[m
[31m-  return rs;[m
[31m-}[m
[31m-[m
[31m-/* Copy RegSP from parent snapshot to the parent links of the IR. */[m
[31m-IRIns *lj_snap_regspmap(GCtrace *T, SnapNo snapno, IRIns *ir)[m
[31m-{[m
[31m-  SnapShot *snap = &T->snap[snapno];[m
[31m-  SnapEntry *map = &T->snapmap[snap->mapofs];[m
[31m-  BloomFilter rfilt = snap_renamefilter(T, snapno);[m
[31m-  MSize n = 0;[m
[31m-  IRRef ref = 0;[m
[31m-  for ( ; ; ir++) {[m
[31m-    uint32_t rs;[m
[31m-    if (ir->o == IR_SLOAD) {[m
[31m-      if (!(ir->op2 & IRSLOAD_PARENT)) break;[m
[31m-      for ( ; ; n++) {[m
[31m-	lua_assert(n < snap->nent);[m
[31m-	if (snap_slot(map[n]) == ir->op1) {[m
[31m-	  ref = snap_ref(map[n++]);[m
[31m-	  break;[m
[31m-	}[m
[31m-      }[m
[31m-    } else if (LJ_SOFTFP && ir->o == IR_HIOP) {[m
[31m-      ref++;[m
[31m-    } else if (ir->o == IR_PVAL) {[m
[31m-      ref = ir->op1 + REF_BIAS;[m
[31m-    } else {[m
[31m-      break;[m
[31m-    }[m
[31m-    rs = T->ir[ref].prev;[m
[31m-    if (bloomtest(rfilt, ref))[m
[31m-      rs = snap_renameref(T, snapno, ref, rs);[m
[31m-    ir->prev = (uint16_t)rs;[m
[31m-    lua_assert(regsp_used(rs));[m
[31m-  }[m
[31m-  return ir;[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot replay ----------------------------------------------------- */[m
[31m-[m
[31m-/* Replay constant from parent trace. */[m
[31m-static TRef snap_replay_const(jit_State *J, IRIns *ir)[m
[31m-{[m
[31m-  /* Only have to deal with constants that can occur in stack slots. */[m
[31m-  switch ((IROp)ir->o) {[m
[31m-  case IR_KPRI: return TREF_PRI(irt_type(ir->t));[m
[31m-  case IR_KINT: return lj_ir_kint(J, ir->i);[m
[31m-  case IR_KGC: return lj_ir_kgc(J, ir_kgc(ir), irt_t(ir->t));[m
[31m-  case IR_KNUM: return lj_ir_k64(J, IR_KNUM, ir_knum(ir));[m
[31m-  case IR_KINT64: return lj_ir_k64(J, IR_KINT64, ir_kint64(ir));[m
[31m-  case IR_KPTR: return lj_ir_kptr(J, ir_kptr(ir));  /* Continuation. */[m
[31m-  default: lua_assert(0); return TREF_NIL; break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* De-duplicate parent reference. */[m
[31m-static TRef snap_dedup(jit_State *J, SnapEntry *map, MSize nmax, IRRef ref)[m
[31m-{[m
[31m-  MSize j;[m
[31m-  for (j = 0; j < nmax; j++)[m
[31m-    if (snap_ref(map[j]) == ref)[m
[31m-      return J->slot[snap_slot(map[j])] & ~(SNAP_CONT|SNAP_FRAME);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Emit parent reference with de-duplication. */[m
[31m-static TRef snap_pref(jit_State *J, GCtrace *T, SnapEntry *map, MSize nmax,[m
[31m-		      BloomFilter seen, IRRef ref)[m
[31m-{[m
[31m-  IRIns *ir = &T->ir[ref];[m
[31m-  TRef tr;[m
[31m-  if (irref_isk(ref))[m
[31m-    tr = snap_replay_const(J, ir);[m
[31m-  else if (!regsp_used(ir->prev))[m
[31m-    tr = 0;[m
[31m-  else if (!bloomtest(seen, ref) || (tr = snap_dedup(J, map, nmax, ref)) == 0)[m
[31m-    tr = emitir(IRT(IR_PVAL, irt_type(ir->t)), ref - REF_BIAS, 0);[m
[31m-  return tr;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a sunk store corresponds to an allocation. Slow path. */[m
[31m-static int snap_sunk_store2(GCtrace *T, IRIns *ira, IRIns *irs)[m
[31m-{[m
[31m-  if (irs->o == IR_ASTORE || irs->o == IR_HSTORE ||[m
[31m-      irs->o == IR_FSTORE || irs->o == IR_XSTORE) {[m
[31m-    IRIns *irk = &T->ir[irs->op1];[m
[31m-    if (irk->o == IR_AREF || irk->o == IR_HREFK)[m
[31m-      irk = &T->ir[irk->op1];[m
[31m-    return (&T->ir[irk->op1] == ira);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a sunk store corresponds to an allocation. Fast path. */[m
[31m-static LJ_AINLINE int snap_sunk_store(GCtrace *T, IRIns *ira, IRIns *irs)[m
[31m-{[m
[31m-  if (irs->s != 255)[m
[31m-    return (ira + irs->s == irs);  /* Fast check. */[m
[31m-  return snap_sunk_store2(T, ira, irs);[m
[31m-}[m
[31m-[m
[31m-/* Replay snapshot state to setup side trace. */[m
[31m-void lj_snap_replay(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  SnapShot *snap = &T->snap[J->exitno];[m
[31m-  SnapEntry *map = &T->snapmap[snap->mapofs];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  BloomFilter seen = 0;[m
[31m-  int pass23 = 0;[m
[31m-  J->framedepth = 0;[m
[31m-  /* Emit IR for slots inherited from parent snapshot. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    BCReg s = snap_slot(sn);[m
[31m-    IRRef ref = snap_ref(sn);[m
[31m-    IRIns *ir = &T->ir[ref];[m
[31m-    TRef tr;[m
[31m-    /* The bloom filter avoids O(nent^2) overhead for de-duping slots. */[m
[31m-    if (bloomtest(seen, ref) && (tr = snap_dedup(J, map, n, ref)) != 0)[m
[31m-      goto setslot;[m
[31m-    bloomset(seen, ref);[m
[31m-    if (irref_isk(ref)) {[m
[31m-      tr = snap_replay_const(J, ir);[m
[31m-    } else if (!regsp_used(ir->prev)) {[m
[31m-      pass23 = 1;[m
[31m-      lua_assert(s != 0);[m
[31m-      tr = s;[m
[31m-    } else {[m
[31m-      IRType t = irt_type(ir->t);[m
[31m-      uint32_t mode = IRSLOAD_INHERIT|IRSLOAD_PARENT;[m
[31m-      if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) t = IRT_NUM;[m
[31m-      if (ir->o == IR_SLOAD) mode |= (ir->op2 & IRSLOAD_READONLY);[m
[31m-      tr = emitir_raw(IRT(IR_SLOAD, t), s, mode);[m
[31m-    }[m
[31m-  setslot:[m
[31m-    J->slot[s] = tr | (sn&(SNAP_CONT|SNAP_FRAME));  /* Same as TREF_* flags. */[m
[31m-    J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && s);[m
[31m-    if ((sn & SNAP_FRAME))[m
[31m-      J->baseslot = s+1;[m
[31m-  }[m
[31m-  if (pass23) {[m
[31m-    IRIns *irlast = &T->ir[snap->ref];[m
[31m-    pass23 = 0;[m
[31m-    /* Emit dependent PVALs. */[m
[31m-    for (n = 0; n < nent; n++) {[m
[31m-      SnapEntry sn = map[n];[m
[31m-      IRRef refp = snap_ref(sn);[m
[31m-      IRIns *ir = &T->ir[refp];[m
[31m-      if (regsp_reg(ir->r) == RID_SUNK) {[m
[31m-	if (J->slot[snap_slot(sn)] != snap_slot(sn)) continue;[m
[31m-	pass23 = 1;[m
[31m-	lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP ||[m
[31m-		   ir->o == IR_CNEW || ir->o == IR_CNEWI);[m
[31m-	if (ir->op1 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op1);[m
[31m-	if (ir->op2 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op2);[m
[31m-	if (LJ_HASFFI && ir->o == IR_CNEWI) {[m
[31m-	  if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP)[m
[31m-	    snap_pref(J, T, map, nent, seen, (ir+1)->op2);[m
[31m-	} else {[m
[31m-	  IRIns *irs;[m
[31m-	  for (irs = ir+1; irs < irlast; irs++)[m
[31m-	    if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) {[m
[31m-	      if (snap_pref(J, T, map, nent, seen, irs->op2) == 0)[m
[31m-		snap_pref(J, T, map, nent, seen, T->ir[irs->op2].op1);[m
[31m-	      else if ((LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) &&[m
[31m-		       irs+1 < irlast && (irs+1)->o == IR_HIOP)[m
[31m-		snap_pref(J, T, map, nent, seen, (irs+1)->op2);[m
[31m-	    }[m
[31m-	}[m
[31m-      } else if (!irref_isk(refp) && !regsp_used(ir->prev)) {[m
[31m-	lua_assert(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);[m
[31m-	J->slot[snap_slot(sn)] = snap_pref(J, T, map, nent, seen, ir->op1);[m
[31m-      }[m
[31m-    }[m
[31m-    /* Replay sunk instructions. */[m
[31m-    for (n = 0; pass23 && n < nent; n++) {[m
[31m-      SnapEntry sn = map[n];[m
[31m-      IRRef refp = snap_ref(sn);[m
[31m-      IRIns *ir = &T->ir[refp];[m
[31m-      if (regsp_reg(ir->r) == RID_SUNK) {[m
[31m-	TRef op1, op2;[m
[31m-	if (J->slot[snap_slot(sn)] != snap_slot(sn)) {  /* De-dup allocs. */[m
[31m-	  J->slot[snap_slot(sn)] = J->slot[J->slot[snap_slot(sn)]];[m
[31m-	  continue;[m
[31m-	}[m
[31m-	op1 = ir->op1;[m
[31m-	if (op1 >= T->nk) op1 = snap_pref(J, T, map, nent, seen, op1);[m
[31m-	op2 = ir->op2;[m
[31m-	if (op2 >= T->nk) op2 = snap_pref(J, T, map, nent, seen, op2);[m
[31m-	if (LJ_HASFFI && ir->o == IR_CNEWI) {[m
[31m-	  if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP) {[m
[31m-	    lj_needsplit(J);  /* Emit joining HIOP. */[m
[31m-	    op2 = emitir_raw(IRT(IR_HIOP, IRT_I64), op2,[m
[31m-			     snap_pref(J, T, map, nent, seen, (ir+1)->op2));[m
[31m-	  }[m
[31m-	  J->slot[snap_slot(sn)] = emitir(ir->ot & ~(IRT_MARK|IRT_ISPHI), op1, op2);[m
[31m-	} else {[m
[31m-	  IRIns *irs;[m
[31m-	  TRef tr = emitir(ir->ot, op1, op2);[m
[31m-	  J->slot[snap_slot(sn)] = tr;[m
[31m-	  for (irs = ir+1; irs < irlast; irs++)[m
[31m-	    if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) {[m
[31m-	      IRIns *irr = &T->ir[irs->op1];[m
[31m-	      TRef val, key = irr->op2, tmp = tr;[m
[31m-	      if (irr->o != IR_FREF) {[m
[31m-		IRIns *irk = &T->ir[key];[m
[31m-		if (irr->o == IR_HREFK)[m
[31m-		  key = lj_ir_kslot(J, snap_replay_const(J, &T->ir[irk->op1]),[m
[31m-				    irk->op2);[m
[31m-		else[m
[31m-		  key = snap_replay_const(J, irk);[m
[31m-		if (irr->o == IR_HREFK || irr->o == IR_AREF) {[m
[31m-		  IRIns *irf = &T->ir[irr->op1];[m
[31m-		  tmp = emitir(irf->ot, tmp, irf->op2);[m
[31m-		}[m
[31m-	      }[m
[31m-	      tmp = emitir(irr->ot, tmp, key);[m
[31m-	      val = snap_pref(J, T, map, nent, seen, irs->op2);[m
[31m-	      if (val == 0) {[m
[31m-		IRIns *irc = &T->ir[irs->op2];[m
[31m-		lua_assert(irc->o == IR_CONV && irc->op2 == IRCONV_NUM_INT);[m
[31m-		val = snap_pref(J, T, map, nent, seen, irc->op1);[m
[31m-		val = emitir(IRTN(IR_CONV), val, IRCONV_NUM_INT);[m
[31m-	      } else if ((LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) &&[m
[31m-			 irs+1 < irlast && (irs+1)->o == IR_HIOP) {[m
[31m-		IRType t = IRT_I64;[m
[31m-		if (LJ_SOFTFP && irt_type((irs+1)->t) == IRT_SOFTFP)[m
[31m-		  t = IRT_NUM;[m
[31m-		lj_needsplit(J);[m
[31m-		if (irref_isk(irs->op2) && irref_isk((irs+1)->op2)) {[m
[31m-		  uint64_t k = (uint32_t)T->ir[irs->op2].i +[m
[31m-			       ((uint64_t)T->ir[(irs+1)->op2].i << 32);[m
[31m-		  val = lj_ir_k64(J, t == IRT_I64 ? IR_KINT64 : IR_KNUM,[m
[31m-				  lj_ir_k64_find(J, k));[m
[31m-		} else {[m
[31m-		  val = emitir_raw(IRT(IR_HIOP, t), val,[m
[31m-			  snap_pref(J, T, map, nent, seen, (irs+1)->op2));[m
[31m-		}[m
[31m-		tmp = emitir(IRT(irs->o, t), tmp, val);[m
[31m-		continue;[m
[31m-	      }[m
[31m-	      tmp = emitir(irs->ot, tmp, val);[m
[31m-	    } else if (LJ_HASFFI && irs->o == IR_XBAR && ir->o == IR_CNEW) {[m
[31m-	      emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);[m
[31m-	    }[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  J->base = J->slot + J->baseslot;[m
[31m-  J->maxslot = snap->nslots - J->baseslot;[m
[31m-  lj_snap_add(J);[m
[31m-  if (pass23)  /* Need explicit GC step _after_ initial snapshot. */[m
[31m-    emitir_raw(IRTG(IR_GCSTEP, IRT_NIL), 0, 0);[m
[31m-}[m
[31m-[m
[31m-/* -- Snapshot restore ---------------------------------------------------- */[m
[31m-[m
[31m-static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,[m
[31m-			SnapNo snapno, BloomFilter rfilt,[m
[31m-			IRIns *ir, TValue *o);[m
[31m-[m
[31m-/* Restore a value from the trace exit state. */[m
[31m-static void snap_restoreval(jit_State *J, GCtrace *T, ExitState *ex,[m
[31m-			    SnapNo snapno, BloomFilter rfilt,[m
[31m-			    IRRef ref, TValue *o)[m
[31m-{[m
[31m-  IRIns *ir = &T->ir[ref];[m
[31m-  IRType1 t = ir->t;[m
[31m-  RegSP rs = ir->prev;[m
[31m-  if (irref_isk(ref)) {  /* Restore constant slot. */[m
[31m-    lj_ir_kvalue(J->L, o, ir);[m
[31m-    return;[m
[31m-  }[m
[31m-  if (LJ_UNLIKELY(bloomtest(rfilt, ref)))[m
[31m-    rs = snap_renameref(T, snapno, ref, rs);[m
[31m-  lua_assert(!LJ_GC64);  /* TODO_GC64: handle 64 bit references. */[m
[31m-  if (ra_hasspill(regsp_spill(rs))) {  /* Restore from spill slot. */[m
[31m-    int32_t *sps = &ex->spill[regsp_spill(rs)];[m
[31m-    if (irt_isinteger(t)) {[m
[31m-      setintV(o, *sps);[m
[31m-#if !LJ_SOFTFP[m
[31m-    } else if (irt_isnum(t)) {[m
[31m-      o->u64 = *(uint64_t *)sps;[m
[31m-#endif[m
[31m-    } else if (LJ_64 && irt_islightud(t)) {[m
[31m-      /* 64 bit lightuserdata which may escape already has the tag bits. */[m
[31m-      o->u64 = *(uint64_t *)sps;[m
[31m-    } else {[m
[31m-      lua_assert(!irt_ispri(t));  /* PRI refs never have a spill slot. */[m
[31m-      setgcV(J->L, o, (GCobj *)(uintptr_t)*(GCSize *)sps, irt_toitype(t));[m
[31m-    }[m
[31m-  } else {  /* Restore from register. */[m
[31m-    Reg r = regsp_reg(rs);[m
[31m-    if (ra_noreg(r)) {[m
[31m-      lua_assert(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);[m
[31m-      snap_restoreval(J, T, ex, snapno, rfilt, ir->op1, o);[m
[31m-      if (LJ_DUALNUM) setnumV(o, (lua_Number)intV(o));[m
[31m-      return;[m
[31m-    } else if (irt_isinteger(t)) {[m
[31m-      setintV(o, (int32_t)ex->gpr[r-RID_MIN_GPR]);[m
[31m-#if !LJ_SOFTFP[m
[31m-    } else if (irt_isnum(t)) {[m
[31m-      setnumV(o, ex->fpr[r-RID_MIN_FPR]);[m
[31m-#endif[m
[31m-    } else if (LJ_64 && irt_is64(t)) {[m
[31m-      /* 64 bit values that already have the tag bits. */[m
[31m-      o->u64 = ex->gpr[r-RID_MIN_GPR];[m
[31m-    } else if (irt_ispri(t)) {[m
[31m-      setpriV(o, irt_toitype(t));[m
[31m-    } else {[m
[31m-      setgcV(J->L, o, (GCobj *)ex->gpr[r-RID_MIN_GPR], irt_toitype(t));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-/* Restore raw data from the trace exit state. */[m
[31m-static void snap_restoredata(GCtrace *T, ExitState *ex,[m
[31m-			     SnapNo snapno, BloomFilter rfilt,[m
[31m-			     IRRef ref, void *dst, CTSize sz)[m
[31m-{[m
[31m-  IRIns *ir = &T->ir[ref];[m
[31m-  RegSP rs = ir->prev;[m
[31m-  int32_t *src;[m
[31m-  uint64_t tmp;[m
[31m-  if (irref_isk(ref)) {[m
[31m-    if (ir->o == IR_KNUM || ir->o == IR_KINT64) {[m
[31m-      src = mref(ir->ptr, int32_t);[m
[31m-    } else if (sz == 8) {[m
[31m-      tmp = (uint64_t)(uint32_t)ir->i;[m
[31m-      src = (int32_t *)&tmp;[m
[31m-    } else {[m
[31m-      src = &ir->i;[m
[31m-    }[m
[31m-  } else {[m
[31m-    if (LJ_UNLIKELY(bloomtest(rfilt, ref)))[m
[31m-      rs = snap_renameref(T, snapno, ref, rs);[m
[31m-    if (ra_hasspill(regsp_spill(rs))) {[m
[31m-      src = &ex->spill[regsp_spill(rs)];[m
[31m-      if (sz == 8 && !irt_is64(ir->t)) {[m
[31m-	tmp = (uint64_t)(uint32_t)*src;[m
[31m-	src = (int32_t *)&tmp;[m
[31m-      }[m
[31m-    } else {[m
[31m-      Reg r = regsp_reg(rs);[m
[31m-      if (ra_noreg(r)) {[m
[31m-	/* Note: this assumes CNEWI is never used for SOFTFP split numbers. */[m
[31m-	lua_assert(sz == 8 && ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);[m
[31m-	snap_restoredata(T, ex, snapno, rfilt, ir->op1, dst, 4);[m
[31m-	*(lua_Number *)dst = (lua_Number)*(int32_t *)dst;[m
[31m-	return;[m
[31m-      }[m
[31m-      src = (int32_t *)&ex->gpr[r-RID_MIN_GPR];[m
[31m-#if !LJ_SOFTFP[m
[31m-      if (r >= RID_MAX_GPR) {[m
[31m-	src = (int32_t *)&ex->fpr[r-RID_MIN_FPR];[m
[31m-#if LJ_TARGET_PPC[m
[31m-	if (sz == 4) {  /* PPC FPRs are always doubles. */[m
[31m-	  *(float *)dst = (float)*(double *)src;[m
[31m-	  return;[m
[31m-	}[m
[31m-#else[m
[31m-	if (LJ_BE && sz == 4) src++;[m
[31m-#endif[m
[31m-      }[m
[31m-#endif[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(sz == 1 || sz == 2 || sz == 4 || sz == 8);[m
[31m-  if (sz == 4) *(int32_t *)dst = *src;[m
[31m-  else if (sz == 8) *(int64_t *)dst = *(int64_t *)src;[m
[31m-  else if (sz == 1) *(int8_t *)dst = (int8_t)*src;[m
[31m-  else *(int16_t *)dst = (int16_t)*src;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Unsink allocation from the trace exit state. Unsink sunk stores. */[m
[31m-static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,[m
[31m-			SnapNo snapno, BloomFilter rfilt,[m
[31m-			IRIns *ir, TValue *o)[m
[31m-{[m
[31m-  lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP ||[m
[31m-	     ir->o == IR_CNEW || ir->o == IR_CNEWI);[m
[31m-#if LJ_HASFFI[m
[31m-  if (ir->o == IR_CNEW || ir->o == IR_CNEWI) {[m
[31m-    CTState *cts = ctype_cts(J->L);[m
[31m-    CTypeID id = (CTypeID)T->ir[ir->op1].i;[m
[31m-    CTSize sz;[m
[31m-    CTInfo info = lj_ctype_info(cts, id, &sz);[m
[31m-    GCcdata *cd = lj_cdata_newx(cts, id, sz, info);[m
[31m-    setcdataV(J->L, o, cd);[m
[31m-    if (ir->o == IR_CNEWI) {[m
[31m-      uint8_t *p = (uint8_t *)cdataptr(cd);[m
[31m-      lua_assert(sz == 4 || sz == 8);[m
[31m-      if (LJ_32 && sz == 8 && ir+1 < T->ir + T->nins && (ir+1)->o == IR_HIOP) {[m
[31m-	snap_restoredata(T, ex, snapno, rfilt, (ir+1)->op2, LJ_LE?p+4:p, 4);[m
[31m-	if (LJ_BE) p += 4;[m
[31m-	sz = 4;[m
[31m-      }[m
[31m-      snap_restoredata(T, ex, snapno, rfilt, ir->op2, p, sz);[m
[31m-    } else {[m
[31m-      IRIns *irs, *irlast = &T->ir[T->snap[snapno].ref];[m
[31m-      for (irs = ir+1; irs < irlast; irs++)[m
[31m-	if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) {[m
[31m-	  IRIns *iro = &T->ir[T->ir[irs->op1].op2];[m
[31m-	  uint8_t *p = (uint8_t *)cd;[m
[31m-	  CTSize szs;[m
[31m-	  lua_assert(irs->o == IR_XSTORE && T->ir[irs->op1].o == IR_ADD);[m
[31m-	  lua_assert(iro->o == IR_KINT || iro->o == IR_KINT64);[m
[31m-	  if (irt_is64(irs->t)) szs = 8;[m
[31m-	  else if (irt_isi8(irs->t) || irt_isu8(irs->t)) szs = 1;[m
[31m-	  else if (irt_isi16(irs->t) || irt_isu16(irs->t)) szs = 2;[m
[31m-	  else szs = 4;[m
[31m-	  if (LJ_64 && iro->o == IR_KINT64)[m
[31m-	    p += (int64_t)ir_k64(iro)->u64;[m
[31m-	  else[m
[31m-	    p += iro->i;[m
[31m-	  lua_assert(p >= (uint8_t *)cdataptr(cd) &&[m
[31m-		     p + szs <= (uint8_t *)cdataptr(cd) + sz);[m
[31m-	  if (LJ_32 && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) {[m
[31m-	    lua_assert(szs == 4);[m
[31m-	    snap_restoredata(T, ex, snapno, rfilt, (irs+1)->op2, LJ_LE?p+4:p,4);[m
[31m-	    if (LJ_BE) p += 4;[m
[31m-	  }[m
[31m-	  snap_restoredata(T, ex, snapno, rfilt, irs->op2, p, szs);[m
[31m-	}[m
[31m-    }[m
[31m-  } else[m
[31m-#endif[m
[31m-  {[m
[31m-    IRIns *irs, *irlast;[m
[31m-    GCtab *t = ir->o == IR_TNEW ? lj_tab_new(J->L, ir->op1, ir->op2) :[m
[31m-				  lj_tab_dup(J->L, ir_ktab(&T->ir[ir->op1]));[m
[31m-    settabV(J->L, o, t);[m
[31m-    irlast = &T->ir[T->snap[snapno].ref];[m
[31m-    for (irs = ir+1; irs < irlast; irs++)[m
[31m-      if (irs->r == RID_SINK && snap_sunk_store(T, ir, irs)) {[m
[31m-	IRIns *irk = &T->ir[irs->op1];[m
[31m-	TValue tmp, *val;[m
[31m-	lua_assert(irs->o == IR_ASTORE || irs->o == IR_HSTORE ||[m
[31m-		   irs->o == IR_FSTORE);[m
[31m-	if (irk->o == IR_FREF) {[m
[31m-	  lua_assert(irk->op2 == IRFL_TAB_META);[m
[31m-	  snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp);[m
[31m-	  /* NOBARRIER: The table is new (marked white). */[m
[31m-	  setgcref(t->metatable, obj2gco(tabV(&tmp)));[m
[31m-	} else {[m
[31m-	  irk = &T->ir[irk->op2];[m
[31m-	  if (irk->o == IR_KSLOT) irk = &T->ir[irk->op1];[m
[31m-	  lj_ir_kvalue(J->L, &tmp, irk);[m
[31m-	  val = lj_tab_set(J->L, t, &tmp);[m
[31m-	  /* NOBARRIER: The table is new (marked white). */[m
[31m-	  snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, val);[m
[31m-	  if (LJ_SOFTFP && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) {[m
[31m-	    snap_restoreval(J, T, ex, snapno, rfilt, (irs+1)->op2, &tmp);[m
[31m-	    val->u32.hi = tmp.u32.lo;[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Restore interpreter state from exit state with the help of a snapshot. */[m
[31m-const BCIns *lj_snap_restore(jit_State *J, void *exptr)[m
[31m-{[m
[31m-  ExitState *ex = (ExitState *)exptr;[m
[31m-  SnapNo snapno = J->exitno;  /* For now, snapno == exitno. */[m
[31m-  GCtrace *T = traceref(J, J->parent);[m
[31m-  SnapShot *snap = &T->snap[snapno];[m
[31m-  MSize n, nent = snap->nent;[m
[31m-  SnapEntry *map = &T->snapmap[snap->mapofs];[m
[31m-  SnapEntry *flinks = &T->snapmap[snap_nextofs(T, snap)-1];[m
[31m-  ptrdiff_t ftsz0;[m
[31m-  TValue *frame;[m
[31m-  BloomFilter rfilt = snap_renamefilter(T, snapno);[m
[31m-  const BCIns *pc = snap_pc(map[nent]);[m
[31m-  lua_State *L = J->L;[m
[31m-[m
[31m-  /* Set interpreter PC to the next PC to get correct error messages. */[m
[31m-  setcframe_pc(cframe_raw(L->cframe), pc+1);[m
[31m-[m
[31m-  /* Make sure the stack is big enough for the slots from the snapshot. */[m
[31m-  if (LJ_UNLIKELY(L->base + snap->topslot >= tvref(L->maxstack))) {[m
[31m-    L->top = curr_topL(L);[m
[31m-    lj_state_growstack(L, snap->topslot - curr_proto(L)->framesize);[m
[31m-  }[m
[31m-[m
[31m-  /* Fill stack slots with data from the registers and spill slots. */[m
[31m-  frame = L->base-1;[m
[31m-  ftsz0 = frame_ftsz(frame);  /* Preserve link to previous frame in slot #0. */[m
[31m-  for (n = 0; n < nent; n++) {[m
[31m-    SnapEntry sn = map[n];[m
[31m-    if (!(sn & SNAP_NORESTORE)) {[m
[31m-      TValue *o = &frame[snap_slot(sn)];[m
[31m-      IRRef ref = snap_ref(sn);[m
[31m-      IRIns *ir = &T->ir[ref];[m
[31m-      if (ir->r == RID_SUNK) {[m
[31m-	MSize j;[m
[31m-	for (j = 0; j < n; j++)[m
[31m-	  if (snap_ref(map[j]) == ref) {  /* De-duplicate sunk allocations. */[m
[31m-	    copyTV(L, o, &frame[snap_slot(map[j])]);[m
[31m-	    goto dupslot;[m
[31m-	  }[m
[31m-	snap_unsink(J, T, ex, snapno, rfilt, ir, o);[m
[31m-      dupslot:[m
[31m-	continue;[m
[31m-      }[m
[31m-      snap_restoreval(J, T, ex, snapno, rfilt, ref, o);[m
[31m-      if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && tvisint(o)) {[m
[31m-	TValue tmp;[m
[31m-	snap_restoreval(J, T, ex, snapno, rfilt, ref+1, &tmp);[m
[31m-	o->u32.hi = tmp.u32.lo;[m
[31m-      } else if ((sn & (SNAP_CONT|SNAP_FRAME))) {[m
[31m-	lua_assert(!LJ_FR2);  /* TODO_FR2: store 64 bit PCs. */[m
[31m-	/* Overwrite tag with frame link. */[m
[31m-	setframe_ftsz(o, snap_slot(sn) != 0 ? (int32_t)*flinks-- : ftsz0);[m
[31m-	L->base = o+1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(map + nent == flinks);[m
[31m-[m
[31m-  /* Compute current stack top. */[m
[31m-  switch (bc_op(*pc)) {[m
[31m-  default:[m
[31m-    if (bc_op(*pc) < BC_FUNCF) {[m
[31m-      L->top = curr_topL(L);[m
[31m-      break;[m
[31m-    }[m
[31m-    /* fallthrough */[m
[31m-  case BC_CALLM: case BC_CALLMT: case BC_RETM: case BC_TSETM:[m
[31m-    L->top = frame + snap->nslots;[m
[31m-    break;[m
[31m-  }[m
[31m-  return pc;[m
[31m-}[m
[31m-[m
[31m-#undef emitir_raw[m
[31m-#undef emitir[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_snap.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_snap.h[m
[1mdeleted file mode 100644[m
[1mindex 1d3379b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_snap.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-/*[m
[31m-** Snapshot handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_SNAP_H[m
[31m-#define _LJ_SNAP_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_jit.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC void lj_snap_add(jit_State *J);[m
[31m-LJ_FUNC void lj_snap_purge(jit_State *J);[m
[31m-LJ_FUNC void lj_snap_shrink(jit_State *J);[m
[31m-LJ_FUNC IRIns *lj_snap_regspmap(GCtrace *T, SnapNo snapno, IRIns *ir);[m
[31m-LJ_FUNC void lj_snap_replay(jit_State *J, GCtrace *T);[m
[31m-LJ_FUNC const BCIns *lj_snap_restore(jit_State *J, void *exptr);[m
[31m-LJ_FUNC void lj_snap_grow_buf_(jit_State *J, MSize need);[m
[31m-LJ_FUNC void lj_snap_grow_map_(jit_State *J, MSize need);[m
[31m-[m
[31m-static LJ_AINLINE void lj_snap_grow_buf(jit_State *J, MSize need)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(need > J->sizesnap)) lj_snap_grow_buf_(J, need);[m
[31m-}[m
[31m-[m
[31m-static LJ_AINLINE void lj_snap_grow_map(jit_State *J, MSize need)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(need > J->sizesnapmap)) lj_snap_grow_map_(J, need);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_state.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_state.c[m
[1mdeleted file mode 100644[m
[1mindex 66bf439..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_state.c[m
[1m+++ /dev/null[m
[36m@@ -1,300 +0,0 @@[m
[31m-/*[m
[31m-** State and stack handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_state_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_func.h"[m
[31m-#include "lj_meta.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_frame.h"[m
[31m-#if LJ_HASFFI[m
[31m-#include "lj_ctype.h"[m
[31m-#endif[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_lex.h"[m
[31m-#include "lj_alloc.h"[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-/* -- Stack handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Stack sizes. */[m
[31m-#define LJ_STACK_MIN	LUA_MINSTACK	/* Min. stack size. */[m
[31m-#define LJ_STACK_MAX	LUAI_MAXSTACK	/* Max. stack size. */[m
[31m-#define LJ_STACK_START	(2*LJ_STACK_MIN)	/* Starting stack size. */[m
[31m-#define LJ_STACK_MAXEX	(LJ_STACK_MAX + 1 + LJ_STACK_EXTRA)[m
[31m-[m
[31m-/* Explanation of LJ_STACK_EXTRA:[m
[31m-**[m
[31m-** Calls to metamethods store their arguments beyond the current top[m
[31m-** without checking for the stack limit. This avoids stack resizes which[m
[31m-** would invalidate passed TValue pointers. The stack check is performed[m
[31m-** later by the function header. This can safely resize the stack or raise[m
[31m-** an error. Thus we need some extra slots beyond the current stack limit.[m
[31m-**[m
[31m-** Most metamethods need 4 slots above top (cont, mobj, arg1, arg2) plus[m
[31m-** one extra slot if mobj is not a function. Only lj_meta_tset needs 5[m
[31m-** slots above top, but then mobj is always a function. So we can get by[m
[31m-** with 5 extra slots.[m
[31m-** LJ_FR2: We need 2 more slots for the frame PC and the continuation PC.[m
[31m-*/[m
[31m-[m
[31m-/* Resize stack slots and adjust pointers in state. */[m
[31m-static void resizestack(lua_State *L, MSize n)[m
[31m-{[m
[31m-  TValue *st, *oldst = tvref(L->stack);[m
[31m-  ptrdiff_t delta;[m
[31m-  MSize oldsize = L->stacksize;[m
[31m-  MSize realsize = n + 1 + LJ_STACK_EXTRA;[m
[31m-  GCobj *up;[m
[31m-  lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);[m
[31m-  st = (TValue *)lj_mem_realloc(L, tvref(L->stack),[m
[31m-				(MSize)(oldsize*sizeof(TValue)),[m
[31m-				(MSize)(realsize*sizeof(TValue)));[m
[31m-  setmref(L->stack, st);[m
[31m-  delta = (char *)st - (char *)oldst;[m
[31m-  setmref(L->maxstack, st + n);[m
[31m-  while (oldsize < realsize)  /* Clear new slots. */[m
[31m-    setnilV(st + oldsize++);[m
[31m-  L->stacksize = realsize;[m
[31m-  if ((size_t)(mref(G(L)->jit_base, char) - (char *)oldst) < oldsize)[m
[31m-    setmref(G(L)->jit_base, mref(G(L)->jit_base, char) + delta);[m
[31m-  L->base = (TValue *)((char *)L->base + delta);[m
[31m-  L->top = (TValue *)((char *)L->top + delta);[m
[31m-  for (up = gcref(L->openupval); up != NULL; up = gcnext(up))[m
[31m-    setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));[m
[31m-}[m
[31m-[m
[31m-/* Relimit stack after error, in case the limit was overdrawn. */[m
[31m-void lj_state_relimitstack(lua_State *L)[m
[31m-{[m
[31m-  if (L->stacksize > LJ_STACK_MAXEX && L->top-tvref(L->stack) < LJ_STACK_MAX-1)[m
[31m-    resizestack(L, LJ_STACK_MAX);[m
[31m-}[m
[31m-[m
[31m-/* Try to shrink the stack (called from GC). */[m
[31m-void lj_state_shrinkstack(lua_State *L, MSize used)[m
[31m-{[m
[31m-  if (L->stacksize > LJ_STACK_MAXEX)[m
[31m-    return;  /* Avoid stack shrinking while handling stack overflow. */[m
[31m-  if (4*used < L->stacksize &&[m
[31m-      2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize &&[m
[31m-      /* Don't shrink stack of live trace. */[m
[31m-      (tvref(G(L)->jit_base) == NULL || obj2gco(L) != gcref(G(L)->cur_L)))[m
[31m-    resizestack(L, L->stacksize >> 1);[m
[31m-}[m
[31m-[m
[31m-/* Try to grow stack. */[m
[31m-void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need)[m
[31m-{[m
[31m-  MSize n;[m
[31m-  if (L->stacksize > LJ_STACK_MAXEX)  /* Overflow while handling overflow? */[m
[31m-    lj_err_throw(L, LUA_ERRERR);[m
[31m-  n = L->stacksize + need;[m
[31m-  if (n > LJ_STACK_MAX) {[m
[31m-    n += 2*LUA_MINSTACK;[m
[31m-  } else if (n < 2*L->stacksize) {[m
[31m-    n = 2*L->stacksize;[m
[31m-    if (n >= LJ_STACK_MAX)[m
[31m-      n = LJ_STACK_MAX;[m
[31m-  }[m
[31m-  resizestack(L, n);[m
[31m-  if (L->stacksize > LJ_STACK_MAXEX)[m
[31m-    lj_err_msg(L, LJ_ERR_STKOV);[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_state_growstack1(lua_State *L)[m
[31m-{[m
[31m-  lj_state_growstack(L, 1);[m
[31m-}[m
[31m-[m
[31m-/* Allocate basic stack for new state. */[m
[31m-static void stack_init(lua_State *L1, lua_State *L)[m
[31m-{[m
[31m-  TValue *stend, *st = lj_mem_newvec(L, LJ_STACK_START+LJ_STACK_EXTRA, TValue);[m
[31m-  setmref(L1->stack, st);[m
[31m-  L1->stacksize = LJ_STACK_START + LJ_STACK_EXTRA;[m
[31m-  stend = st + L1->stacksize;[m
[31m-  setmref(L1->maxstack, stend - LJ_STACK_EXTRA - 1);[m
[31m-  setthreadV(L1, st++, L1);  /* Needed for curr_funcisL() on empty stack. */[m
[31m-  if (LJ_FR2) setnilV(st++);[m
[31m-  L1->base = L1->top = st;[m
[31m-  while (st < stend)  /* Clear new slots. */[m
[31m-    setnilV(st++);[m
[31m-}[m
[31m-[m
[31m-/* -- State handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Open parts that may cause memory-allocation errors. */[m
[31m-static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  UNUSED(dummy);[m
[31m-  UNUSED(ud);[m
[31m-  stack_init(L, L);[m
[31m-  /* NOBARRIER: State initialization, all objects are white. */[m
[31m-  setgcref(L->env, obj2gco(lj_tab_new(L, 0, LJ_MIN_GLOBAL)));[m
[31m-  settabV(L, registry(L), lj_tab_new(L, 0, LJ_MIN_REGISTRY));[m
[31m-  lj_str_resize(L, LJ_MIN_STRTAB-1);[m
[31m-  lj_meta_init(L);[m
[31m-  lj_lex_init(L);[m
[31m-  fixstring(lj_err_str(L, LJ_ERR_ERRMEM));  /* Preallocate memory error msg. */[m
[31m-  g->gc.threshold = 4*g->gc.total;[m
[31m-  lj_trace_initstate(g);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-static void close_state(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  lj_func_closeuv(L, tvref(L->stack));[m
[31m-  lj_gc_freeall(g);[m
[31m-  lua_assert(gcref(g->gc.root) == obj2gco(L));[m
[31m-  lua_assert(g->strnum == 0);[m
[31m-  lj_trace_freestate(g);[m
[31m-#if LJ_HASFFI[m
[31m-  lj_ctype_freestate(g);[m
[31m-#endif[m
[31m-  lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);[m
[31m-  lj_buf_free(g, &g->tmpbuf);[m
[31m-  lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);[m
[31m-  lua_assert(g->gc.total == sizeof(GG_State));[m
[31m-#ifndef LUAJIT_USE_SYSMALLOC[m
[31m-  if (g->allocf == lj_alloc_f)[m
[31m-    lj_alloc_destroy(g->allocd);[m
[31m-  else[m
[31m-#endif[m
[31m-    g->allocf(g->allocd, G2GG(g), sizeof(GG_State), 0);[m
[31m-}[m
[31m-[m
[31m-#if LJ_64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC))[m
[31m-lua_State *lj_state_newstate(lua_Alloc f, void *ud)[m
[31m-#else[m
[31m-LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)[m
[31m-#endif[m
[31m-{[m
[31m-  GG_State *GG = (GG_State *)f(ud, NULL, 0, sizeof(GG_State));[m
[31m-  lua_State *L = &GG->L;[m
[31m-  global_State *g = &GG->g;[m
[31m-  if (GG == NULL || !checkptrGC(GG)) return NULL;[m
[31m-  memset(GG, 0, sizeof(GG_State));[m
[31m-  L->gct = ~LJ_TTHREAD;[m
[31m-  L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED;  /* Prevent free. */[m
[31m-  L->dummy_ffid = FF_C;[m
[31m-  setmref(L->glref, g);[m
[31m-  g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED;[m
[31m-  g->strempty.marked = LJ_GC_WHITE0;[m
[31m-  g->strempty.gct = ~LJ_TSTR;[m
[31m-  g->allocf = f;[m
[31m-  g->allocd = ud;[m
[31m-  setgcref(g->mainthref, obj2gco(L));[m
[31m-  setgcref(g->uvhead.prev, obj2gco(&g->uvhead));[m
[31m-  setgcref(g->uvhead.next, obj2gco(&g->uvhead));[m
[31m-  g->strmask = ~(MSize)0;[m
[31m-  setnilV(registry(L));[m
[31m-  setnilV(&g->nilnode.val);[m
[31m-  setnilV(&g->nilnode.key);[m
[31m-#if !LJ_GC64[m
[31m-  setmref(g->nilnode.freetop, &g->nilnode);[m
[31m-#endif[m
[31m-  lj_buf_init(NULL, &g->tmpbuf);[m
[31m-  g->gc.state = GCSpause;[m
[31m-  setgcref(g->gc.root, obj2gco(L));[m
[31m-  setmref(g->gc.sweep, &g->gc.root);[m
[31m-  g->gc.total = sizeof(GG_State);[m
[31m-  g->gc.pause = LUAI_GCPAUSE;[m
[31m-  g->gc.stepmul = LUAI_GCMUL;[m
[31m-  lj_dispatch_init((GG_State *)L);[m
[31m-  L->status = LUA_ERRERR+1;  /* Avoid touching the stack upon memory error. */[m
[31m-  if (lj_vm_cpcall(L, NULL, NULL, cpluaopen) != 0) {[m
[31m-    /* Memory allocation error: free partial state. */[m
[31m-    close_state(L);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  L->status = 0;[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[31m-static TValue *cpfinalize(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  UNUSED(dummy);[m
[31m-  UNUSED(ud);[m
[31m-  lj_gc_finalize_cdata(L);[m
[31m-  lj_gc_finalize_udata(L);[m
[31m-  /* Frame pop omitted. */[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-LUA_API void lua_close(lua_State *L)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  int i;[m
[31m-  L = mainthread(g);  /* Only the main thread can be closed. */[m
[31m-#if LJ_HASPROFILE[m
[31m-  luaJIT_profile_stop(L);[m
[31m-#endif[m
[31m-  setgcrefnull(g->cur_L);[m
[31m-  lj_func_closeuv(L, tvref(L->stack));[m
[31m-  lj_gc_separateudata(g, 1);  /* Separate udata which have GC metamethods. */[m
[31m-#if LJ_HASJIT[m
[31m-  G2J(g)->flags &= ~JIT_F_ON;[m
[31m-  G2J(g)->state = LJ_TRACE_IDLE;[m
[31m-  lj_dispatch_update(g);[m
[31m-#endif[m
[31m-  for (i = 0;;) {[m
[31m-    hook_enter(g);[m
[31m-    L->status = 0;[m
[31m-    L->base = L->top = tvref(L->stack) + 1 + LJ_FR2;[m
[31m-    L->cframe = NULL;[m
[31m-    if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) {[m
[31m-      if (++i >= 10) break;[m
[31m-      lj_gc_separateudata(g, 1);  /* Separate udata again. */[m
[31m-      if (gcref(g->gc.mmudata) == NULL)  /* Until nothing is left to do. */[m
[31m-	break;[m
[31m-    }[m
[31m-  }[m
[31m-  close_state(L);[m
[31m-}[m
[31m-[m
[31m-lua_State *lj_state_new(lua_State *L)[m
[31m-{[m
[31m-  lua_State *L1 = lj_mem_newobj(L, lua_State);[m
[31m-  L1->gct = ~LJ_TTHREAD;[m
[31m-  L1->dummy_ffid = FF_C;[m
[31m-  L1->status = 0;[m
[31m-  L1->stacksize = 0;[m
[31m-  setmref(L1->stack, NULL);[m
[31m-  L1->cframe = NULL;[m
[31m-  /* NOBARRIER: The lua_State is new (marked white). */[m
[31m-  setgcrefnull(L1->openupval);[m
[31m-  setmrefr(L1->glref, L->glref);[m
[31m-  setgcrefr(L1->env, L->env);[m
[31m-  stack_init(L1, L);  /* init stack */[m
[31m-  lua_assert(iswhite(obj2gco(L1)));[m
[31m-  return L1;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L)[m
[31m-{[m
[31m-  lua_assert(L != mainthread(g));[m
[31m-  if (obj2gco(L) == gcref(g->cur_L))[m
[31m-    setgcrefnull(g->cur_L);[m
[31m-  lj_func_closeuv(L, tvref(L->stack));[m
[31m-  lua_assert(gcref(L->openupval) == NULL);[m
[31m-  lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);[m
[31m-  lj_mem_freet(g, L);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_state.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_state.h[m
[1mdeleted file mode 100644[m
[1mindex e128d32..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_state.h[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-/*[m
[31m-** State and stack handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_STATE_H[m
[31m-#define _LJ_STATE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#define incr_top(L) \[m
[31m-  (++L->top >= tvref(L->maxstack) && (lj_state_growstack1(L), 0))[m
[31m-[m
[31m-#define savestack(L, p)		((char *)(p) - mref(L->stack, char))[m
[31m-#define restorestack(L, n)	((TValue *)(mref(L->stack, char) + (n)))[m
[31m-[m
[31m-LJ_FUNC void lj_state_relimitstack(lua_State *L);[m
[31m-LJ_FUNC void lj_state_shrinkstack(lua_State *L, MSize used);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_state_growstack1(lua_State *L);[m
[31m-[m
[31m-static LJ_AINLINE void lj_state_checkstack(lua_State *L, MSize need)[m
[31m-{[m
[31m-  if ((mref(L->maxstack, char) - (char *)L->top) <=[m
[31m-      (ptrdiff_t)need*(ptrdiff_t)sizeof(TValue))[m
[31m-    lj_state_growstack(L, need);[m
[31m-}[m
[31m-[m
[31m-LJ_FUNC lua_State *lj_state_new(lua_State *L);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L);[m
[31m-#if LJ_64[m
[31m-LJ_FUNC lua_State *lj_state_newstate(lua_Alloc f, void *ud);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_str.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_str.c[m
[1mdeleted file mode 100644[m
[1mindex 79a7a70..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_str.c[m
[1m+++ /dev/null[m
[36m@@ -1,211 +0,0 @@[m
[31m-/*[m
[31m-** String handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_str_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_char.h"[m
[31m-[m
[31m-/* -- String helpers ------------------------------------------------------ */[m
[31m-[m
[31m-/* Ordered compare of strings. Assumes string data is 4-byte aligned. */[m
[31m-int32_t LJ_FASTCALL lj_str_cmp(GCstr *a, GCstr *b)[m
[31m-{[m
[31m-  MSize i, n = a->len > b->len ? b->len : a->len;[m
[31m-#ifdef LUAJIT_USE_VALGRIND[m
[31m-  for (i = 0; i < n; i++) {[m
[31m-    uint8_t va = *(const uint8_t *)(strdata(a)+i);[m
[31m-    uint8_t vb = *(const uint8_t *)(strdata(b)+i);[m
[31m-    if (va != vb) {[m
[31m-        return va < vb ? -1 : 1;[m
[31m-    }[m
[31m-  }[m
[31m-#else[m
[31m-  for (i = 0; i < n; i += 4) {[m
[31m-    /* Note: innocuous access up to end of string + 3. */[m
[31m-    uint32_t va = *(const uint32_t *)(strdata(a)+i);[m
[31m-    uint32_t vb = *(const uint32_t *)(strdata(b)+i);[m
[31m-    if (va != vb) {[m
[31m-#if LJ_LE[m
[31m-      va = lj_bswap(va); vb = lj_bswap(vb);[m
[31m-#endif[m
[31m-      i -= n;[m
[31m-      if ((int32_t)i >= -3) {[m
[31m-	va >>= 32+(i<<3); vb >>= 32+(i<<3);[m
[31m-	if (va == vb) break;[m
[31m-      }[m
[31m-      return va < vb ? -1 : 1;[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-  return (int32_t)(a->len - b->len);[m
[31m-}[m
[31m-[m
[31m-/* Fast string data comparison. Caveat: unaligned access to 1st string! */[m
[31m-static LJ_AINLINE int str_fastcmp(const char *a, const char *b, MSize len)[m
[31m-{[m
[31m-  MSize i = 0;[m
[31m-  lua_assert(len > 0);[m
[31m-  lua_assert((((uintptr_t)a+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4);[m
[31m-  do {  /* Note: innocuous access up to end of string + 3. */[m
[31m-    uint32_t v = lj_getu32(a+i) ^ *(const uint32_t *)(b+i);[m
[31m-    if (v) {[m
[31m-      i -= len;[m
[31m-#if LJ_LE[m
[31m-      return (int32_t)i >= -3 ? (v << (32+(i<<3))) : 1;[m
[31m-#else[m
[31m-      return (int32_t)i >= -3 ? (v >> (32+(i<<3))) : 1;[m
[31m-#endif[m
[31m-    }[m
[31m-    i += 4;[m
[31m-  } while (i < len);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Find fixed string p inside string s. */[m
[31m-const char *lj_str_find(const char *s, const char *p, MSize slen, MSize plen)[m
[31m-{[m
[31m-  if (plen <= slen) {[m
[31m-    if (plen == 0) {[m
[31m-      return s;[m
[31m-    } else {[m
[31m-      int c = *(const uint8_t *)p++;[m
[31m-      plen--; slen -= plen;[m
[31m-      while (slen) {[m
[31m-	const char *q = (const char *)memchr(s, c, slen);[m
[31m-	if (!q) break;[m
[31m-	if (memcmp(q+1, p, plen) == 0) return q;[m
[31m-	q++; slen -= (MSize)(q-s); s = q;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* Check whether a string has a pattern matching character. */[m
[31m-int lj_str_haspattern(GCstr *s)[m
[31m-{[m
[31m-  const char *p = strdata(s), *q = p + s->len;[m
[31m-  while (p < q) {[m
[31m-    int c = *(const uint8_t *)p++;[m
[31m-    if (lj_char_ispunct(c) && strchr("^$*+?.([%-", c))[m
[31m-      return 1;  /* Found a pattern matching char. */[m
[31m-  }[m
[31m-  return 0;  /* No pattern matching chars found. */[m
[31m-}[m
[31m-[m
[31m-/* -- String interning ---------------------------------------------------- */[m
[31m-[m
[31m-/* Resize the string hash table (grow and shrink). */[m
[31m-void lj_str_resize(lua_State *L, MSize newmask)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCRef *newhash;[m
[31m-  MSize i;[m
[31m-  if (g->gc.state == GCSsweepstring || newmask >= LJ_MAX_STRTAB-1)[m
[31m-    return;  /* No resizing during GC traversal or if already too big. */[m
[31m-  newhash = lj_mem_newvec(L, newmask+1, GCRef);[m
[31m-  memset(newhash, 0, (newmask+1)*sizeof(GCRef));[m
[31m-  for (i = g->strmask; i != ~(MSize)0; i--) {  /* Rehash old table. */[m
[31m-    GCobj *p = gcref(g->strhash[i]);[m
[31m-    while (p) {  /* Follow each hash chain and reinsert all strings. */[m
[31m-      MSize h = gco2str(p)->hash & newmask;[m
[31m-      GCobj *next = gcnext(p);[m
[31m-      /* NOBARRIER: The string table is a GC root. */[m
[31m-      setgcrefr(p->gch.nextgc, newhash[h]);[m
[31m-      setgcref(newhash[h], p);[m
[31m-      p = next;[m
[31m-    }[m
[31m-  }[m
[31m-  lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);[m
[31m-  g->strmask = newmask;[m
[31m-  g->strhash = newhash;[m
[31m-}[m
[31m-[m
[31m-/* Intern a string and return string object. */[m
[31m-GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx)[m
[31m-{[m
[31m-  global_State *g;[m
[31m-  GCstr *s;[m
[31m-  GCobj *o;[m
[31m-  MSize len = (MSize)lenx;[m
[31m-  MSize a, b, h = len;[m
[31m-  if (lenx >= LJ_MAX_STR)[m
[31m-    lj_err_msg(L, LJ_ERR_STROV);[m
[31m-  g = G(L);[m
[31m-  /* Compute string hash. Constants taken from lookup3 hash by Bob Jenkins. */[m
[31m-  if (len >= 4) {  /* Caveat: unaligned access! */[m
[31m-    a = lj_getu32(str);[m
[31m-    h ^= lj_getu32(str+len-4);[m
[31m-    b = lj_getu32(str+(len>>1)-2);[m
[31m-    h ^= b; h -= lj_rol(b, 14);[m
[31m-    b += lj_getu32(str+(len>>2)-1);[m
[31m-  } else if (len > 0) {[m
[31m-    a = *(const uint8_t *)str;[m
[31m-    h ^= *(const uint8_t *)(str+len-1);[m
[31m-    b = *(const uint8_t *)(str+(len>>1));[m
[31m-    h ^= b; h -= lj_rol(b, 14);[m
[31m-  } else {[m
[31m-    return &g->strempty;[m
[31m-  }[m
[31m-  a ^= h; a -= lj_rol(h, 11);[m
[31m-  b ^= a; b -= lj_rol(a, 25);[m
[31m-  h ^= b; h -= lj_rol(b, 16);[m
[31m-  /* Check if the string has already been interned. */[m
[31m-  o = gcref(g->strhash[h & g->strmask]);[m
[31m-#ifndef LUAJIT_USE_VALGRIND[m
[31m-  if (LJ_LIKELY((((uintptr_t)str+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) {[m
[31m-    while (o != NULL) {[m
[31m-      GCstr *sx = gco2str(o);[m
[31m-      if (sx->len == len && str_fastcmp(str, strdata(sx), len) == 0) {[m
[31m-	/* Resurrect if dead. Can only happen with fixstring() (keywords). */[m
[31m-	if (isdead(g, o)) flipwhite(o);[m
[31m-	return sx;  /* Return existing string. */[m
[31m-      }[m
[31m-      o = gcnext(o);[m
[31m-    }[m
[31m-  } else {  /* Slow path: end of string is too close to a page boundary. */[m
[31m-#endif[m
[31m-    while (o != NULL) {[m
[31m-      GCstr *sx = gco2str(o);[m
[31m-      if (sx->len == len && memcmp(str, strdata(sx), len) == 0) {[m
[31m-	/* Resurrect if dead. Can only happen with fixstring() (keywords). */[m
[31m-	if (isdead(g, o)) flipwhite(o);[m
[31m-	return sx;  /* Return existing string. */[m
[31m-      }[m
[31m-      o = gcnext(o);[m
[31m-    }[m
[31m-#ifndef LUAJIT_USE_VALGRIND[m
[31m-  }[m
[31m-#endif[m
[31m-  /* Nope, create a new string. */[m
[31m-  s = lj_mem_newt(L, sizeof(GCstr)+len+1, GCstr);[m
[31m-  newwhite(g, s);[m
[31m-  s->gct = ~LJ_TSTR;[m
[31m-  s->len = len;[m
[31m-  s->hash = h;[m
[31m-  s->reserved = 0;[m
[31m-  memcpy(strdatawr(s), str, len);[m
[31m-  strdatawr(s)[len] = '\0';  /* Zero-terminate string. */[m
[31m-  /* Add it to string hash table. */[m
[31m-  h &= g->strmask;[m
[31m-  s->nextgc = g->strhash[h];[m
[31m-  /* NOBARRIER: The string table is a GC root. */[m
[31m-  setgcref(g->strhash[h], obj2gco(s));[m
[31m-  if (g->strnum++ > g->strmask)  /* Allow a 100% load factor. */[m
[31m-    lj_str_resize(L, (g->strmask<<1)+1);  /* Grow string table. */[m
[31m-  return s;  /* Return newly interned string. */[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_str_free(global_State *g, GCstr *s)[m
[31m-{[m
[31m-  g->strnum--;[m
[31m-  lj_mem_free(g, s, sizestring(s));[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_str.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_str.h[m
[1mdeleted file mode 100644[m
[1mindex bb306c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_str.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-/*[m
[31m-** String handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_STR_H[m
[31m-#define _LJ_STR_H[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* String helpers. */[m
[31m-LJ_FUNC int32_t LJ_FASTCALL lj_str_cmp(GCstr *a, GCstr *b);[m
[31m-LJ_FUNC const char *lj_str_find(const char *s, const char *f,[m
[31m-				MSize slen, MSize flen);[m
[31m-LJ_FUNC int lj_str_haspattern(GCstr *s);[m
[31m-[m
[31m-/* String interning. */[m
[31m-LJ_FUNC void lj_str_resize(lua_State *L, MSize newmask);[m
[31m-LJ_FUNCA GCstr *lj_str_new(lua_State *L, const char *str, size_t len);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_str_free(global_State *g, GCstr *s);[m
[31m-[m
[31m-#define lj_str_newz(L, s)	(lj_str_new(L, s, strlen(s)))[m
[31m-#define lj_str_newlit(L, s)	(lj_str_new(L, "" s, sizeof(s)-1))[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt.c[m
[1mdeleted file mode 100644[m
[1mindex 04c71e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt.c[m
[1m+++ /dev/null[m
[36m@@ -1,472 +0,0 @@[m
[31m-/*[m
[31m-** String formatting.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lj_strfmt_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- Format parser ------------------------------------------------------- */[m
[31m-[m
[31m-static const uint8_t strfmt_map[('x'-'A')+1] = {[m
[31m-  STRFMT_A,0,0,0,STRFMT_E,STRFMT_F,STRFMT_G,0,0,0,0,0,0,[m
[31m-  0,0,0,0,0,0,0,0,0,0,STRFMT_X,0,0,[m
[31m-  0,0,0,0,0,0,[m
[31m-  STRFMT_A,0,STRFMT_C,STRFMT_D,STRFMT_E,STRFMT_F,STRFMT_G,0,STRFMT_I,0,0,0,0,[m
[31m-  0,STRFMT_O,STRFMT_P,STRFMT_Q,0,STRFMT_S,0,STRFMT_U,0,0,STRFMT_X[m
[31m-};[m
[31m-[m
[31m-SFormat LJ_FASTCALL lj_strfmt_parse(FormatState *fs)[m
[31m-{[m
[31m-  const uint8_t *p = fs->p, *e = fs->e;[m
[31m-  fs->str = (const char *)p;[m
[31m-  for (; p < e; p++) {[m
[31m-    if (*p == '%') {  /* Escape char? */[m
[31m-      if (p[1] == '%') {  /* '%%'? */[m
[31m-	fs->p = ++p+1;[m
[31m-	goto retlit;[m
[31m-      } else {[m
[31m-	SFormat sf = 0;[m
[31m-	uint32_t c;[m
[31m-	if (p != (const uint8_t *)fs->str)[m
[31m-	  break;[m
[31m-	for (p++; (uint32_t)*p - ' ' <= (uint32_t)('0' - ' '); p++) {[m
[31m-	  /* Parse flags. */[m
[31m-	  if (*p == '-') sf |= STRFMT_F_LEFT;[m
[31m-	  else if (*p == '+') sf |= STRFMT_F_PLUS;[m
[31m-	  else if (*p == '0') sf |= STRFMT_F_ZERO;[m
[31m-	  else if (*p == ' ') sf |= STRFMT_F_SPACE;[m
[31m-	  else if (*p == '#') sf |= STRFMT_F_ALT;[m
[31m-	  else break;[m
[31m-	}[m
[31m-	if ((uint32_t)*p - '0' < 10) {  /* Parse width. */[m
[31m-	  uint32_t width = (uint32_t)*p++ - '0';[m
[31m-	  if ((uint32_t)*p - '0' < 10)[m
[31m-	    width = (uint32_t)*p++ - '0' + width*10;[m
[31m-	  sf |= (width << STRFMT_SH_WIDTH);[m
[31m-	}[m
[31m-	if (*p == '.') {  /* Parse precision. */[m
[31m-	  uint32_t prec = 0;[m
[31m-	  p++;[m
[31m-	  if ((uint32_t)*p - '0' < 10) {[m
[31m-	    prec = (uint32_t)*p++ - '0';[m
[31m-	    if ((uint32_t)*p - '0' < 10)[m
[31m-	      prec = (uint32_t)*p++ - '0' + prec*10;[m
[31m-	  }[m
[31m-	  sf |= ((prec+1) << STRFMT_SH_PREC);[m
[31m-	}[m
[31m-	/* Parse conversion. */[m
[31m-	c = (uint32_t)*p - 'A';[m
[31m-	if (LJ_LIKELY(c <= (uint32_t)('x' - 'A'))) {[m
[31m-	  uint32_t sx = strfmt_map[c];[m
[31m-	  if (sx) {[m
[31m-	    fs->p = p+1;[m
[31m-	    return (sf | sx | ((c & 0x20) ? 0 : STRFMT_F_UPPER));[m
[31m-	  }[m
[31m-	}[m
[31m-	/* Return error location. */[m
[31m-	if (*p >= 32) p++;[m
[31m-	fs->len = (MSize)(p - (const uint8_t *)fs->str);[m
[31m-	fs->p = fs->e;[m
[31m-	return STRFMT_ERR;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  fs->p = p;[m
[31m-retlit:[m
[31m-  fs->len = (MSize)(p - (const uint8_t *)fs->str);[m
[31m-  return fs->len ? STRFMT_LIT : STRFMT_EOF;[m
[31m-}[m
[31m-[m
[31m-/* -- Raw conversions ----------------------------------------------------- */[m
[31m-[m
[31m-#define WINT_R(x, sh, sc) \[m
[31m-  { uint32_t d = (x*(((1<<sh)+sc-1)/sc))>>sh; x -= d*sc; *p++ = (char)('0'+d); }[m
[31m-[m
[31m-/* Write integer to buffer. */[m
[31m-char * LJ_FASTCALL lj_strfmt_wint(char *p, int32_t k)[m
[31m-{[m
[31m-  uint32_t u = (uint32_t)k;[m
[31m-  if (k < 0) { u = (uint32_t)-k; *p++ = '-'; }[m
[31m-  if (u < 10000) {[m
[31m-    if (u < 10) goto dig1;[m
[31m-    if (u < 100) goto dig2;[m
[31m-    if (u < 1000) goto dig3;[m
[31m-  } else {[m
[31m-    uint32_t v = u / 10000; u -= v * 10000;[m
[31m-    if (v < 10000) {[m
[31m-      if (v < 10) goto dig5;[m
[31m-      if (v < 100) goto dig6;[m
[31m-      if (v < 1000) goto dig7;[m
[31m-    } else {[m
[31m-      uint32_t w = v / 10000; v -= w * 10000;[m
[31m-      if (w >= 10) WINT_R(w, 10, 10)[m
[31m-      *p++ = (char)('0'+w);[m
[31m-    }[m
[31m-    WINT_R(v, 23, 1000)[m
[31m-    dig7: WINT_R(v, 12, 100)[m
[31m-    dig6: WINT_R(v, 10, 10)[m
[31m-    dig5: *p++ = (char)('0'+v);[m
[31m-  }[m
[31m-  WINT_R(u, 23, 1000)[m
[31m-  dig3: WINT_R(u, 12, 100)[m
[31m-  dig2: WINT_R(u, 10, 10)[m
[31m-  dig1: *p++ = (char)('0'+u);[m
[31m-  return p;[m
[31m-}[m
[31m-#undef WINT_R[m
[31m-[m
[31m-/* Write pointer to buffer. */[m
[31m-char * LJ_FASTCALL lj_strfmt_wptr(char *p, const void *v)[m
[31m-{[m
[31m-  ptrdiff_t x = (ptrdiff_t)v;[m
[31m-  MSize i, n = STRFMT_MAXBUF_PTR;[m
[31m-  if (x == 0) {[m
[31m-    *p++ = 'N'; *p++ = 'U'; *p++ = 'L'; *p++ = 'L';[m
[31m-    return p;[m
[31m-  }[m
[31m-#if LJ_64[m
[31m-  /* Shorten output for 64 bit pointers. */[m
[31m-  n = 2+2*4+((x >> 32) ? 2+2*(lj_fls((uint32_t)(x >> 32))>>3) : 0);[m
[31m-#endif[m
[31m-  p[0] = '0';[m
[31m-  p[1] = 'x';[m
[31m-  for (i = n-1; i >= 2; i--, x >>= 4)[m
[31m-    p[i] = "0123456789abcdef"[(x & 15)];[m
[31m-  return p+n;[m
[31m-}[m
[31m-[m
[31m-/* Write ULEB128 to buffer. */[m
[31m-char * LJ_FASTCALL lj_strfmt_wuleb128(char *p, uint32_t v)[m
[31m-{[m
[31m-  for (; v >= 0x80; v >>= 7)[m
[31m-    *p++ = (char)((v & 0x7f) | 0x80);[m
[31m-  *p++ = (char)v;[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Return string or write number to tmp buffer and return pointer to start. */[m
[31m-const char *lj_strfmt_wstrnum(lua_State *L, cTValue *o, MSize *lenp)[m
[31m-{[m
[31m-  SBuf *sb;[m
[31m-  if (tvisstr(o)) {[m
[31m-    *lenp = strV(o)->len;[m
[31m-    return strVdata(o);[m
[31m-  } else if (tvisint(o)) {[m
[31m-    sb = lj_strfmt_putint(lj_buf_tmp_(L), intV(o));[m
[31m-  } else if (tvisnum(o)) {[m
[31m-    sb = lj_strfmt_putfnum(lj_buf_tmp_(L), STRFMT_G14, o->n);[m
[31m-  } else {[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  *lenp = sbuflen(sb);[m
[31m-  return sbufB(sb);[m
[31m-}[m
[31m-[m
[31m-/* -- Unformatted conversions to buffer ----------------------------------- */[m
[31m-[m
[31m-/* Add integer to buffer. */[m
[31m-SBuf * LJ_FASTCALL lj_strfmt_putint(SBuf *sb, int32_t k)[m
[31m-{[m
[31m-  setsbufP(sb, lj_strfmt_wint(lj_buf_more(sb, STRFMT_MAXBUF_INT), k));[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Add number to buffer. */[m
[31m-SBuf * LJ_FASTCALL lj_strfmt_putnum(SBuf *sb, cTValue *o)[m
[31m-{[m
[31m-  return lj_strfmt_putfnum(sb, STRFMT_G14, o->n);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-SBuf * LJ_FASTCALL lj_strfmt_putptr(SBuf *sb, const void *v)[m
[31m-{[m
[31m-  setsbufP(sb, lj_strfmt_wptr(lj_buf_more(sb, STRFMT_MAXBUF_PTR), v));[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* Add quoted string to buffer. */[m
[31m-SBuf * LJ_FASTCALL lj_strfmt_putquoted(SBuf *sb, GCstr *str)[m
[31m-{[m
[31m-  const char *s = strdata(str);[m
[31m-  MSize len = str->len;[m
[31m-  lj_buf_putb(sb, '"');[m
[31m-  while (len--) {[m
[31m-    uint32_t c = (uint32_t)(uint8_t)*s++;[m
[31m-    char *p = lj_buf_more(sb, 4);[m
[31m-    if (c == '"' || c == '\\' || c == '\n') {[m
[31m-      *p++ = '\\';[m
[31m-    } else if (lj_char_iscntrl(c)) {  /* This can only be 0-31 or 127. */[m
[31m-      uint32_t d;[m
[31m-      *p++ = '\\';[m
[31m-      if (c >= 100 || lj_char_isdigit((uint8_t)*s)) {[m
[31m-	*p++ = (char)('0'+(c >= 100)); if (c >= 100) c -= 100;[m
[31m-	goto tens;[m
[31m-      } else if (c >= 10) {[m
[31m-      tens:[m
[31m-	d = (c * 205) >> 11; c -= d * 10; *p++ = (char)('0'+d);[m
[31m-      }[m
[31m-      c += '0';[m
[31m-    }[m
[31m-    *p++ = (char)c;[m
[31m-    setsbufP(sb, p);[m
[31m-  }[m
[31m-  lj_buf_putb(sb, '"');[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* -- Formatted conversions to buffer ------------------------------------- */[m
[31m-[m
[31m-/* Add formatted char to buffer. */[m
[31m-SBuf *lj_strfmt_putfchar(SBuf *sb, SFormat sf, int32_t c)[m
[31m-{[m
[31m-  MSize width = STRFMT_WIDTH(sf);[m
[31m-  char *p = lj_buf_more(sb, width > 1 ? width : 1);[m
[31m-  if ((sf & STRFMT_F_LEFT)) *p++ = (char)c;[m
[31m-  while (width-- > 1) *p++ = ' ';[m
[31m-  if (!(sf & STRFMT_F_LEFT)) *p++ = (char)c;[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* Add formatted string to buffer. */[m
[31m-SBuf *lj_strfmt_putfstr(SBuf *sb, SFormat sf, GCstr *str)[m
[31m-{[m
[31m-  MSize len = str->len <= STRFMT_PREC(sf) ? str->len : STRFMT_PREC(sf);[m
[31m-  MSize width = STRFMT_WIDTH(sf);[m
[31m-  char *p = lj_buf_more(sb, width > len ? width : len);[m
[31m-  if ((sf & STRFMT_F_LEFT)) p = lj_buf_wmem(p, strdata(str), len);[m
[31m-  while (width-- > len) *p++ = ' ';[m
[31m-  if (!(sf & STRFMT_F_LEFT)) p = lj_buf_wmem(p, strdata(str), len);[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* Add formatted signed/unsigned integer to buffer. */[m
[31m-SBuf *lj_strfmt_putfxint(SBuf *sb, SFormat sf, uint64_t k)[m
[31m-{[m
[31m-  char buf[STRFMT_MAXBUF_XINT], *q = buf + sizeof(buf), *p;[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  char *ps;[m
[31m-#endif[m
[31m-  MSize prefix = 0, len, prec, pprec, width, need;[m
[31m-[m
[31m-  /* Figure out signed prefixes. */[m
[31m-  if (STRFMT_TYPE(sf) == STRFMT_INT) {[m
[31m-    if ((int64_t)k < 0) {[m
[31m-      k = (uint64_t)-(int64_t)k;[m
[31m-      prefix = 256 + '-';[m
[31m-    } else if ((sf & STRFMT_F_PLUS)) {[m
[31m-      prefix = 256 + '+';[m
[31m-    } else if ((sf & STRFMT_F_SPACE)) {[m
[31m-      prefix = 256 + ' ';[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Convert number and store to fixed-size buffer in reverse order. */[m
[31m-  prec = STRFMT_PREC(sf);[m
[31m-  if ((int32_t)prec >= 0) sf &= ~STRFMT_F_ZERO;[m
[31m-  if (k == 0) {  /* Special-case zero argument. */[m
[31m-    if (prec != 0 ||[m
[31m-	(sf & (STRFMT_T_OCT|STRFMT_F_ALT)) == (STRFMT_T_OCT|STRFMT_F_ALT))[m
[31m-      *--q = '0';[m
[31m-  } else if (!(sf & (STRFMT_T_HEX|STRFMT_T_OCT))) {  /* Decimal. */[m
[31m-    uint32_t k2;[m
[31m-    while ((k >> 32)) { *--q = (char)('0' + k % 10); k /= 10; }[m
[31m-    k2 = (uint32_t)k;[m
[31m-    do { *--q = (char)('0' + k2 % 10); k2 /= 10; } while (k2);[m
[31m-  } else if ((sf & STRFMT_T_HEX)) {  /* Hex. */[m
[31m-    const char *hexdig = (sf & STRFMT_F_UPPER) ? "0123456789ABCDEF" :[m
[31m-						 "0123456789abcdef";[m
[31m-    do { *--q = hexdig[(k & 15)]; k >>= 4; } while (k);[m
[31m-    if ((sf & STRFMT_F_ALT)) prefix = 512 + ((sf & STRFMT_F_UPPER) ? 'X' : 'x');[m
[31m-  } else {  /* Octal. */[m
[31m-    do { *--q = (char)('0' + (uint32_t)(k & 7)); k >>= 3; } while (k);[m
[31m-    if ((sf & STRFMT_F_ALT)) *--q = '0';[m
[31m-  }[m
[31m-[m
[31m-  /* Calculate sizes. */[m
[31m-  len = (MSize)(buf + sizeof(buf) - q);[m
[31m-  if ((int32_t)len >= (int32_t)prec) prec = len;[m
[31m-  width = STRFMT_WIDTH(sf);[m
[31m-  pprec = prec + (prefix >> 8);[m
[31m-  need = width > pprec ? width : pprec;[m
[31m-  p = lj_buf_more(sb, need);[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  ps = p;[m
[31m-#endif[m
[31m-[m
[31m-  /* Format number with leading/trailing whitespace and zeros. */[m
[31m-  if ((sf & (STRFMT_F_LEFT|STRFMT_F_ZERO)) == 0)[m
[31m-    while (width-- > pprec) *p++ = ' ';[m
[31m-  if (prefix) {[m
[31m-    if ((char)prefix >= 'X') *p++ = '0';[m
[31m-    *p++ = (char)prefix;[m
[31m-  }[m
[31m-  if ((sf & (STRFMT_F_LEFT|STRFMT_F_ZERO)) == STRFMT_F_ZERO)[m
[31m-    while (width-- > pprec) *p++ = '0';[m
[31m-  while (prec-- > len) *p++ = '0';[m
[31m-  while (q < buf + sizeof(buf)) *p++ = *q++;  /* Add number itself. */[m
[31m-  if ((sf & STRFMT_F_LEFT))[m
[31m-    while (width-- > pprec) *p++ = ' ';[m
[31m-[m
[31m-  lua_assert(need == (MSize)(p - ps));[m
[31m-  setsbufP(sb, p);[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* Add number formatted as signed integer to buffer. */[m
[31m-SBuf *lj_strfmt_putfnum_int(SBuf *sb, SFormat sf, lua_Number n)[m
[31m-{[m
[31m-  int64_t k = (int64_t)n;[m
[31m-  if (checki32(k) && sf == STRFMT_INT)[m
[31m-    return lj_strfmt_putint(sb, (int32_t)k);  /* Shortcut for plain %d. */[m
[31m-  else[m
[31m-    return lj_strfmt_putfxint(sb, sf, (uint64_t)k);[m
[31m-}[m
[31m-[m
[31m-/* Add number formatted as unsigned integer to buffer. */[m
[31m-SBuf *lj_strfmt_putfnum_uint(SBuf *sb, SFormat sf, lua_Number n)[m
[31m-{[m
[31m-  int64_t k;[m
[31m-  if (n >= 9223372036854775808.0)[m
[31m-    k = (int64_t)(n - 18446744073709551616.0);[m
[31m-  else[m
[31m-    k = (int64_t)n;[m
[31m-  return lj_strfmt_putfxint(sb, sf, (uint64_t)k);[m
[31m-}[m
[31m-[m
[31m-/* -- Conversions to strings ---------------------------------------------- */[m
[31m-[m
[31m-/* Convert integer to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_int(lua_State *L, int32_t k)[m
[31m-{[m
[31m-  char buf[STRFMT_MAXBUF_INT];[m
[31m-  MSize len = (MSize)(lj_strfmt_wint(buf, k) - buf);[m
[31m-  return lj_str_new(L, buf, len);[m
[31m-}[m
[31m-[m
[31m-/* Convert integer or number to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_number(lua_State *L, cTValue *o)[m
[31m-{[m
[31m-  return tvisint(o) ? lj_strfmt_int(L, intV(o)) : lj_strfmt_num(L, o);[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-/* Convert char value to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_char(lua_State *L, int c)[m
[31m-{[m
[31m-  char buf[1];[m
[31m-  buf[0] = c;[m
[31m-  return lj_str_new(L, buf, 1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Raw conversion of object to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_obj(lua_State *L, cTValue *o)[m
[31m-{[m
[31m-  if (tvisstr(o)) {[m
[31m-    return strV(o);[m
[31m-  } else if (tvisnumber(o)) {[m
[31m-    return lj_strfmt_number(L, o);[m
[31m-  } else if (tvisnil(o)) {[m
[31m-    return lj_str_newlit(L, "nil");[m
[31m-  } else if (tvisfalse(o)) {[m
[31m-    return lj_str_newlit(L, "false");[m
[31m-  } else if (tvistrue(o)) {[m
[31m-    return lj_str_newlit(L, "true");[m
[31m-  } else {[m
[31m-    char buf[8+2+2+16], *p = buf;[m
[31m-    p = lj_buf_wmem(p, lj_typename(o), (MSize)strlen(lj_typename(o)));[m
[31m-    *p++ = ':'; *p++ = ' ';[m
[31m-    if (tvisfunc(o) && isffunc(funcV(o))) {[m
[31m-      p = lj_buf_wmem(p, "builtin#", 8);[m
[31m-      p = lj_strfmt_wint(p, funcV(o)->c.ffid);[m
[31m-    } else {[m
[31m-      p = lj_strfmt_wptr(p, lj_obj_ptr(o));[m
[31m-    }[m
[31m-    return lj_str_new(L, buf, (size_t)(p - buf));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* -- Internal string formatting ------------------------------------------ */[m
[31m-[m
[31m-/*[m
[31m-** These functions are only used for lua_pushfstring(), lua_pushvfstring()[m
[31m-** and for internal string formatting (e.g. error messages). Caveat: unlike[m
[31m-** string.format(), only a limited subset of formats and flags are supported![m
[31m-**[m
[31m-** LuaJIT has support for a couple more formats than Lua 5.1/5.2:[m
[31m-** - %d %u %o %x with full formatting, 32 bit integers only.[m
[31m-** - %f and other FP formats are really %.14g.[m
[31m-** - %s %c %p without formatting.[m
[31m-*/[m
[31m-[m
[31m-/* Push formatted message as a string object to Lua stack. va_list variant. */[m
[31m-const char *lj_strfmt_pushvf(lua_State *L, const char *fmt, va_list argp)[m
[31m-{[m
[31m-  SBuf *sb = lj_buf_tmp_(L);[m
[31m-  FormatState fs;[m
[31m-  SFormat sf;[m
[31m-  GCstr *str;[m
[31m-  lj_strfmt_init(&fs, fmt, (MSize)strlen(fmt));[m
[31m-  while ((sf = lj_strfmt_parse(&fs)) != STRFMT_EOF) {[m
[31m-    switch (STRFMT_TYPE(sf)) {[m
[31m-    case STRFMT_LIT:[m
[31m-      lj_buf_putmem(sb, fs.str, fs.len);[m
[31m-      break;[m
[31m-    case STRFMT_INT:[m
[31m-      lj_strfmt_putfxint(sb, sf, va_arg(argp, int32_t));[m
[31m-      break;[m
[31m-    case STRFMT_UINT:[m
[31m-      lj_strfmt_putfxint(sb, sf, va_arg(argp, uint32_t));[m
[31m-      break;[m
[31m-    case STRFMT_NUM:[m
[31m-      lj_strfmt_putfnum(sb, STRFMT_G14, va_arg(argp, lua_Number));[m
[31m-      break;[m
[31m-    case STRFMT_STR: {[m
[31m-      const char *s = va_arg(argp, char *);[m
[31m-      if (s == NULL) s = "(null)";[m
[31m-      lj_buf_putmem(sb, s, (MSize)strlen(s));[m
[31m-      break;[m
[31m-      }[m
[31m-    case STRFMT_CHAR:[m
[31m-      lj_buf_putb(sb, va_arg(argp, int));[m
[31m-      break;[m
[31m-    case STRFMT_PTR:[m
[31m-      lj_strfmt_putptr(sb, va_arg(argp, void *));[m
[31m-      break;[m
[31m-    case STRFMT_ERR:[m
[31m-    default:[m
[31m-      lj_buf_putb(sb, '?');[m
[31m-      lua_assert(0);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  str = lj_buf_str(L, sb);[m
[31m-  setstrV(L, L->top, str);[m
[31m-  incr_top(L);[m
[31m-  return strdata(str);[m
[31m-}[m
[31m-[m
[31m-/* Push formatted message as a string object to Lua stack. Vararg variant. */[m
[31m-const char *lj_strfmt_pushf(lua_State *L, const char *fmt, ...)[m
[31m-{[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  msg = lj_strfmt_pushvf(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  return msg;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt.h[m
[1mdeleted file mode 100644[m
[1mindex a38bc7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt.h[m
[1m+++ /dev/null[m
[36m@@ -1,125 +0,0 @@[m
[31m-/*[m
[31m-** String formatting.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_STRFMT_H[m
[31m-#define _LJ_STRFMT_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-typedef uint32_t SFormat;  /* Format indicator. */[m
[31m-[m
[31m-/* Format parser state. */[m
[31m-typedef struct FormatState {[m
[31m-  const uint8_t *p;	/* Current format string pointer. */[m
[31m-  const uint8_t *e;	/* End of format string. */[m
[31m-  const char *str;	/* Returned literal string. */[m
[31m-  MSize len;		/* Size of literal string. */[m
[31m-} FormatState;[m
[31m-[m
[31m-/* Format types (max. 16). */[m
[31m-typedef enum FormatType {[m
[31m-  STRFMT_EOF, STRFMT_ERR, STRFMT_LIT,[m
[31m-  STRFMT_INT, STRFMT_UINT, STRFMT_NUM, STRFMT_STR, STRFMT_CHAR, STRFMT_PTR[m
[31m-} FormatType;[m
[31m-[m
[31m-/* Format subtypes (bits are reused). */[m
[31m-#define STRFMT_T_HEX	0x0010	/* STRFMT_UINT */[m
[31m-#define STRFMT_T_OCT	0x0020	/* STRFMT_UINT */[m
[31m-#define STRFMT_T_FP_A	0x0000	/* STRFMT_NUM */[m
[31m-#define STRFMT_T_FP_E	0x0010	/* STRFMT_NUM */[m
[31m-#define STRFMT_T_FP_F	0x0020	/* STRFMT_NUM */[m
[31m-#define STRFMT_T_FP_G	0x0030	/* STRFMT_NUM */[m
[31m-#define STRFMT_T_QUOTED	0x0010	/* STRFMT_STR */[m
[31m-[m
[31m-/* Format flags. */[m
[31m-#define STRFMT_F_LEFT	0x0100[m
[31m-#define STRFMT_F_PLUS	0x0200[m
[31m-#define STRFMT_F_ZERO	0x0400[m
[31m-#define STRFMT_F_SPACE	0x0800[m
[31m-#define STRFMT_F_ALT	0x1000[m
[31m-#define STRFMT_F_UPPER	0x2000[m
[31m-[m
[31m-/* Format indicator fields. */[m
[31m-#define STRFMT_SH_WIDTH	16[m
[31m-#define STRFMT_SH_PREC	24[m
[31m-[m
[31m-#define STRFMT_TYPE(sf)		((FormatType)((sf) & 15))[m
[31m-#define STRFMT_WIDTH(sf)	(((sf) >> STRFMT_SH_WIDTH) & 255u)[m
[31m-#define STRFMT_PREC(sf)		((((sf) >> STRFMT_SH_PREC) & 255u) - 1u)[m
[31m-#define STRFMT_FP(sf)		(((sf) >> 4) & 3)[m
[31m-[m
[31m-/* Formats for conversion characters. */[m
[31m-#define STRFMT_A	(STRFMT_NUM|STRFMT_T_FP_A)[m
[31m-#define STRFMT_C	(STRFMT_CHAR)[m
[31m-#define STRFMT_D	(STRFMT_INT)[m
[31m-#define STRFMT_E	(STRFMT_NUM|STRFMT_T_FP_E)[m
[31m-#define STRFMT_F	(STRFMT_NUM|STRFMT_T_FP_F)[m
[31m-#define STRFMT_G	(STRFMT_NUM|STRFMT_T_FP_G)[m
[31m-#define STRFMT_I	STRFMT_D[m
[31m-#define STRFMT_O	(STRFMT_UINT|STRFMT_T_OCT)[m
[31m-#define STRFMT_P	(STRFMT_PTR)[m
[31m-#define STRFMT_Q	(STRFMT_STR|STRFMT_T_QUOTED)[m
[31m-#define STRFMT_S	(STRFMT_STR)[m
[31m-#define STRFMT_U	(STRFMT_UINT)[m
[31m-#define STRFMT_X	(STRFMT_UINT|STRFMT_T_HEX)[m
[31m-#define STRFMT_G14	(STRFMT_G | ((14+1) << STRFMT_SH_PREC))[m
[31m-[m
[31m-/* Maximum buffer sizes for conversions. */[m
[31m-#define STRFMT_MAXBUF_XINT	(1+22)  /* '0' prefix + uint64_t in octal. */[m
[31m-#define STRFMT_MAXBUF_INT	(1+10)  /* Sign + int32_t in decimal. */[m
[31m-#define STRFMT_MAXBUF_NUM	32  /* Must correspond with STRFMT_G14. */[m
[31m-#define STRFMT_MAXBUF_PTR	(2+2*sizeof(ptrdiff_t))  /* "0x" + hex ptr. */[m
[31m-[m
[31m-/* Format parser. */[m
[31m-LJ_FUNC SFormat LJ_FASTCALL lj_strfmt_parse(FormatState *fs);[m
[31m-[m
[31m-static LJ_AINLINE void lj_strfmt_init(FormatState *fs, const char *p, MSize len)[m
[31m-{[m
[31m-  fs->p = (const uint8_t *)p;[m
[31m-  fs->e = (const uint8_t *)p + len;[m
[31m-  lua_assert(*fs->e == 0);  /* Must be NUL-terminated (may have NULs inside). */[m
[31m-}[m
[31m-[m
[31m-/* Raw conversions. */[m
[31m-LJ_FUNC char * LJ_FASTCALL lj_strfmt_wint(char *p, int32_t k);[m
[31m-LJ_FUNC char * LJ_FASTCALL lj_strfmt_wptr(char *p, const void *v);[m
[31m-LJ_FUNC char * LJ_FASTCALL lj_strfmt_wuleb128(char *p, uint32_t v);[m
[31m-LJ_FUNC const char *lj_strfmt_wstrnum(lua_State *L, cTValue *o, MSize *lenp);[m
[31m-[m
[31m-/* Unformatted conversions to buffer. */[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putint(SBuf *sb, int32_t k);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putnum(SBuf *sb, cTValue *o);[m
[31m-#endif[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putptr(SBuf *sb, const void *v);[m
[31m-LJ_FUNC SBuf * LJ_FASTCALL lj_strfmt_putquoted(SBuf *sb, GCstr *str);[m
[31m-[m
[31m-/* Formatted conversions to buffer. */[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfxint(SBuf *sb, SFormat sf, uint64_t k);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfnum_int(SBuf *sb, SFormat sf, lua_Number n);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfnum_uint(SBuf *sb, SFormat sf, lua_Number n);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfnum(SBuf *sb, SFormat, lua_Number n);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfchar(SBuf *sb, SFormat, int32_t c);[m
[31m-LJ_FUNC SBuf *lj_strfmt_putfstr(SBuf *sb, SFormat, GCstr *str);[m
[31m-[m
[31m-/* Conversions to strings. */[m
[31m-LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_int(lua_State *L, int32_t k);[m
[31m-LJ_FUNCA GCstr * LJ_FASTCALL lj_strfmt_num(lua_State *L, cTValue *o);[m
[31m-LJ_FUNCA GCstr * LJ_FASTCALL lj_strfmt_number(lua_State *L, cTValue *o);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_char(lua_State *L, int c);[m
[31m-#endif[m
[31m-LJ_FUNC GCstr * LJ_FASTCALL lj_strfmt_obj(lua_State *L, cTValue *o);[m
[31m-[m
[31m-/* Internal string formatting. */[m
[31m-LJ_FUNC const char *lj_strfmt_pushvf(lua_State *L, const char *fmt,[m
[31m-				     va_list argp);[m
[31m-LJ_FUNC const char *lj_strfmt_pushf(lua_State *L, const char *fmt, ...)[m
[31m-#ifdef __GNUC__[m
[31m-  __attribute__ ((format (printf, 2, 3)))[m
[31m-#endif[m
[31m-  ;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt_num.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt_num.c[m
[1mdeleted file mode 100644[m
[1mindex 0476925..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strfmt_num.c[m
[1m+++ /dev/null[m
[36m@@ -1,592 +0,0 @@[m
[31m-/*[m
[31m-** String formatting for floating-point numbers.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-** Contributed by Peter Cawley.[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lj_strfmt_num_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_buf.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_strfmt.h"[m
[31m-[m
[31m-/* -- Precomputed tables -------------------------------------------------- */[m
[31m-[m
[31m-/* Rescale factors to push the exponent of a number towards zero. */[m
[31m-#define RESCALE_EXPONENTS(P, N) \[m
[31m-  P(308), P(289), P(270), P(250), P(231), P(212), P(193), P(173), P(154), \[m
[31m-  P(135), P(115), P(96), P(77), P(58), P(38), P(0), P(0), P(0), N(39), N(58), \[m
[31m-  N(77), N(96), N(116), N(135), N(154), N(174), N(193), N(212), N(231), \[m
[31m-  N(251), N(270), N(289)[m
[31m-[m
[31m-#define ONE_E_P(X) 1e+0 ## X[m
[31m-#define ONE_E_N(X) 1e-0 ## X[m
[31m-static const int16_t rescale_e[] = { RESCALE_EXPONENTS(-, +) };[m
[31m-static const double rescale_n[] = { RESCALE_EXPONENTS(ONE_E_P, ONE_E_N) };[m
[31m-#undef ONE_E_N[m
[31m-#undef ONE_E_P[m
[31m-[m
[31m-/*[m
[31m-** For p in range -70 through 57, this table encodes pairs (m, e) such that[m
[31m-** 4*2^p <= (uint8_t)m*10^e, and is the smallest value for which this holds.[m
[31m-*/[m
[31m-static const int8_t four_ulp_m_e[] = {[m
[31m-  34, -21, 68, -21, 14, -20, 28, -20, 55, -20, 2, -19, 3, -19, 5, -19, 9, -19,[m
[31m-  -82, -18, 35, -18, 7, -17, -117, -17, 28, -17, 56, -17, 112, -16, -33, -16,[m
[31m-  45, -16, 89, -16, -78, -15, 36, -15, 72, -15, -113, -14, 29, -14, 57, -14,[m
[31m-  114, -13, -28, -13, 46, -13, 91, -12, -74, -12, 37, -12, 73, -12, 15, -11, 3,[m
[31m-  -11, 59, -11, 2, -10, 3, -10, 5, -10, 1, -9, -69, -9, 38, -9, 75, -9, 15, -7,[m
[31m-  3, -7, 6, -7, 12, -6, -17, -7, 48, -7, 96, -7, -65, -6, 39, -6, 77, -6, -103,[m
[31m-  -5, 31, -5, 62, -5, 123, -4, -11, -4, 49, -4, 98, -4, -60, -3, 4, -2, 79, -3,[m
[31m-  16, -2, 32, -2, 63, -2, 2, -1, 25, 0, 5, 1, 1, 2, 2, 2, 4, 2, 8, 2, 16, 2,[m
[31m-  32, 2, 64, 2, -128, 2, 26, 2, 52, 2, 103, 3, -51, 3, 41, 4, 82, 4, -92, 4,[m
[31m-  33, 4, 66, 4, -124, 5, 27, 5, 53, 5, 105, 6, 21, 6, 42, 6, 84, 6, 17, 7, 34,[m
[31m-  7, 68, 7, 2, 8, 3, 8, 6, 8, 108, 9, -41, 9, 43, 10, 86, 9, -84, 10, 35, 10,[m
[31m-  69, 10, -118, 11, 28, 11, 55, 12, 11, 13, 22, 13, 44, 13, 88, 13, -80, 13,[m
[31m-  36, 13, 71, 13, -115, 14, 29, 14, 57, 14, 113, 15, -30, 15, 46, 15, 91, 15,[m
[31m-  19, 16, 37, 16, 73, 16, 2, 17, 3, 17, 6, 17[m
[31m-};[m
[31m-[m
[31m-/* min(2^32-1, 10^e-1) for e in range 0 through 10 */[m
[31m-static uint32_t ndigits_dec_threshold[] = {[m
[31m-  0, 9U, 99U, 999U, 9999U, 99999U, 999999U,[m
[31m-  9999999U, 99999999U, 999999999U, 0xffffffffU[m
[31m-};[m
[31m-[m
[31m-/* -- Helper functions ---------------------------------------------------- */[m
[31m-[m
[31m-/* Compute the number of digits in the decimal representation of x. */[m
[31m-static MSize ndigits_dec(uint32_t x)[m
[31m-{[m
[31m-  MSize t = ((lj_fls(x | 1) * 77) >> 8) + 1; /* 2^8/77 is roughly log2(10) */[m
[31m-  return t + (x > ndigits_dec_threshold[t]);[m
[31m-}[m
[31m-[m
[31m-#define WINT_R(x, sh, sc) \[m
[31m-  { uint32_t d = (x*(((1<<sh)+sc-1)/sc))>>sh; x -= d*sc; *p++ = (char)('0'+d); }[m
[31m-[m
[31m-/* Write 9-digit unsigned integer to buffer. */[m
[31m-static char *lj_strfmt_wuint9(char *p, uint32_t u)[m
[31m-{[m
[31m-  uint32_t v = u / 10000, w;[m
[31m-  u -= v * 10000;[m
[31m-  w = v / 10000;[m
[31m-  v -= w * 10000;[m
[31m-  *p++ = (char)('0'+w);[m
[31m-  WINT_R(v, 23, 1000)[m
[31m-  WINT_R(v, 12, 100)[m
[31m-  WINT_R(v, 10, 10)[m
[31m-  *p++ = (char)('0'+v);[m
[31m-  WINT_R(u, 23, 1000)[m
[31m-  WINT_R(u, 12, 100)[m
[31m-  WINT_R(u, 10, 10)[m
[31m-  *p++ = (char)('0'+u);[m
[31m-  return p;[m
[31m-}[m
[31m-#undef WINT_R[m
[31m-[m
[31m-/* -- Extended precision arithmetic --------------------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** The "nd" format is a fixed-precision decimal representation for numbers. It[m
[31m-** consists of up to 64 uint32_t values, with each uint32_t storing a value[m
[31m-** in the range [0, 1e9). A number in "nd" format consists of three variables:[m
[31m-**[m
[31m-**  uint32_t nd[64];[m
[31m-**  uint32_t ndlo;[m
[31m-**  uint32_t ndhi;[m
[31m-**[m
[31m-** The integral part of the number is stored in nd[0 ... ndhi], the value of[m
[31m-** which is sum{i in [0, ndhi] | nd[i] * 10^(9*i)}. If the fractional part of[m
[31m-** the number is zero, ndlo is zero. Otherwise, the fractional part is stored[m
[31m-** in nd[ndlo ... 63], the value of which is taken to be[m
[31m-** sum{i in [ndlo, 63] | nd[i] * 10^(9*(i-64))}.[m
[31m-**[m
[31m-** If the array part had 128 elements rather than 64, then every double would[m
[31m-** have an exact representation in "nd" format. With 64 elements, all integral[m
[31m-** doubles have an exact representation, and all non-integral doubles have[m
[31m-** enough digits to make both %.99e and %.99f do the right thing.[m
[31m-*/[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define ND_MUL2K_MAX_SHIFT	29[m
[31m-#define ND_MUL2K_DIV1E9(val)	((uint32_t)((val) / 1000000000))[m
[31m-#else[m
[31m-#define ND_MUL2K_MAX_SHIFT	11[m
[31m-#define ND_MUL2K_DIV1E9(val)	((uint32_t)((val) >> 9) / 1953125)[m
[31m-#endif[m
[31m-[m
[31m-/* Multiply nd by 2^k and add carry_in (ndlo is assumed to be zero). */[m
[31m-static uint32_t nd_mul2k(uint32_t* nd, uint32_t ndhi, uint32_t k,[m
[31m-			 uint32_t carry_in, SFormat sf)[m
[31m-{[m
[31m-  uint32_t i, ndlo = 0, start = 1;[m
[31m-  /* Performance hacks. */[m
[31m-  if (k > ND_MUL2K_MAX_SHIFT*2 && STRFMT_FP(sf) != STRFMT_FP(STRFMT_T_FP_F)) {[m
[31m-    start = ndhi - (STRFMT_PREC(sf) + 17) / 8;[m
[31m-  }[m
[31m-  /* Real logic. */[m
[31m-  while (k >= ND_MUL2K_MAX_SHIFT) {[m
[31m-    for (i = ndlo; i <= ndhi; i++) {[m
[31m-      uint64_t val = ((uint64_t)nd[i] << ND_MUL2K_MAX_SHIFT) | carry_in;[m
[31m-      carry_in = ND_MUL2K_DIV1E9(val);[m
[31m-      nd[i] = (uint32_t)val - carry_in * 1000000000;[m
[31m-    }[m
[31m-    if (carry_in) {[m
[31m-      nd[++ndhi] = carry_in; carry_in = 0;[m
[31m-      if(start++ == ndlo) ++ndlo;[m
[31m-    }[m
[31m-    k -= ND_MUL2K_MAX_SHIFT;[m
[31m-  }[m
[31m-  if (k) {[m
[31m-    for (i = ndlo; i <= ndhi; i++) {[m
[31m-      uint64_t val = ((uint64_t)nd[i] << k) | carry_in;[m
[31m-      carry_in = ND_MUL2K_DIV1E9(val);[m
[31m-      nd[i] = (uint32_t)val - carry_in * 1000000000;[m
[31m-    }[m
[31m-    if (carry_in) nd[++ndhi] = carry_in;[m
[31m-  }[m
[31m-  return ndhi;[m
[31m-}[m
[31m-[m
[31m-/* Divide nd by 2^k (ndlo is assumed to be zero). */[m
[31m-static uint32_t nd_div2k(uint32_t* nd, uint32_t ndhi, uint32_t k, SFormat sf)[m
[31m-{[m
[31m-  uint32_t ndlo = 0, stop1 = ~0, stop2 = ~0;[m
[31m-  /* Performance hacks. */[m
[31m-  if (!ndhi) {[m
[31m-    if (!nd[0]) {[m
[31m-      return 0;[m
[31m-    } else {[m
[31m-      uint32_t s = lj_ffs(nd[0]);[m
[31m-      if (s >= k) { nd[0] >>= k; return 0; }[m
[31m-      nd[0] >>= s; k -= s;[m
[31m-    }[m
[31m-  }[m
[31m-  if (k > 18) {[m
[31m-    if (STRFMT_FP(sf) == STRFMT_FP(STRFMT_T_FP_F)) {[m
[31m-      stop1 = 63 - (int32_t)STRFMT_PREC(sf) / 9;[m
[31m-    } else {[m
[31m-      int32_t floorlog2 = ndhi * 29 + lj_fls(nd[ndhi]) - k;[m
[31m-      int32_t floorlog10 = (int32_t)(floorlog2 * 0.30102999566398114);[m
[31m-      stop1 = 62 + (floorlog10 - (int32_t)STRFMT_PREC(sf)) / 9;[m
[31m-      stop2 = 61 + ndhi - (int32_t)STRFMT_PREC(sf) / 8;[m
[31m-    }[m
[31m-  }[m
[31m-  /* Real logic. */[m
[31m-  while (k >= 9) {[m
[31m-    uint32_t i = ndhi, carry = 0;[m
[31m-    for (;;) {[m
[31m-      uint32_t val = nd[i];[m
[31m-      nd[i] = (val >> 9) + carry;[m
[31m-      carry = (val & 0x1ff) * 1953125;[m
[31m-      if (i == ndlo) break;[m
[31m-      i = (i - 1) & 0x3f;[m
[31m-    }[m
[31m-    if (ndlo != stop1 && ndlo != stop2) {[m
[31m-      if (carry) { ndlo = (ndlo - 1) & 0x3f; nd[ndlo] = carry; }[m
[31m-      if (!nd[ndhi]) { ndhi = (ndhi - 1) & 0x3f; stop2--; }[m
[31m-    } else if (!nd[ndhi]) {[m
[31m-      if (ndhi != ndlo) { ndhi = (ndhi - 1) & 0x3f; stop2--; }[m
[31m-      else return ndlo;[m
[31m-    }[m
[31m-    k -= 9;[m
[31m-  }[m
[31m-  if (k) {[m
[31m-    uint32_t mask = (1U << k) - 1, mul = 1000000000 >> k, i = ndhi, carry = 0;[m
[31m-    for (;;) {[m
[31m-      uint32_t val = nd[i];[m
[31m-      nd[i] = (val >> k) + carry;[m
[31m-      carry = (val & mask) * mul;[m
[31m-      if (i == ndlo) break;[m
[31m-      i = (i - 1) & 0x3f;[m
[31m-    }[m
[31m-    if (carry) { ndlo = (ndlo - 1) & 0x3f; nd[ndlo] = carry; }[m
[31m-  }[m
[31m-  return ndlo;[m
[31m-}[m
[31m-[m
[31m-/* Add m*10^e to nd (assumes ndlo <= e/9 <= ndhi and 0 <= m <= 9). */[m
[31m-static uint32_t nd_add_m10e(uint32_t* nd, uint32_t ndhi, uint8_t m, int32_t e)[m
[31m-{[m
[31m-  uint32_t i, carry;[m
[31m-  if (e >= 0) {[m
[31m-    i = (uint32_t)e/9;[m
[31m-    carry = m * (ndigits_dec_threshold[e - (int32_t)i*9] + 1);[m
[31m-  } else {[m
[31m-    int32_t f = (e-8)/9;[m
[31m-    i = (uint32_t)(64 + f);[m
[31m-    carry = m * (ndigits_dec_threshold[e - f*9] + 1);[m
[31m-  }[m
[31m-  for (;;) {[m
[31m-    uint32_t val = nd[i] + carry;[m
[31m-    if (LJ_UNLIKELY(val >= 1000000000)) {[m
[31m-      val -= 1000000000;[m
[31m-      nd[i] = val;[m
[31m-      if (LJ_UNLIKELY(i == ndhi)) {[m
[31m-	ndhi = (ndhi + 1) & 0x3f;[m
[31m-	nd[ndhi] = 1;[m
[31m-	break;[m
[31m-      }[m
[31m-      carry = 1;[m
[31m-      i = (i + 1) & 0x3f;[m
[31m-    } else {[m
[31m-      nd[i] = val;[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  return ndhi;[m
[31m-}[m
[31m-[m
[31m-/* Test whether two "nd" values are equal in their most significant digits. */[m
[31m-static int nd_similar(uint32_t* nd, uint32_t ndhi, uint32_t* ref, MSize hilen,[m
[31m-		      MSize prec)[m
[31m-{[m
[31m-  char nd9[9], ref9[9];[m
[31m-  if (hilen <= prec) {[m
[31m-    if (LJ_UNLIKELY(nd[ndhi] != *ref)) return 0;[m
[31m-    prec -= hilen; ref--; ndhi = (ndhi - 1) & 0x3f;[m
[31m-    if (prec >= 9) {[m
[31m-      if (LJ_UNLIKELY(nd[ndhi] != *ref)) return 0;[m
[31m-      prec -= 9; ref--; ndhi = (ndhi - 1) & 0x3f;[m
[31m-    }[m
[31m-  } else {[m
[31m-    prec -= hilen - 9;[m
[31m-  }[m
[31m-  lua_assert(prec < 9);[m
[31m-  lj_strfmt_wuint9(nd9, nd[ndhi]);[m
[31m-  lj_strfmt_wuint9(ref9, *ref);[m
[31m-  return !memcmp(nd9, ref9, prec) && (nd9[prec] < '5') == (ref9[prec] < '5');[m
[31m-}[m
[31m-[m
[31m-/* -- Formatted conversions to buffer ------------------------------------- */[m
[31m-[m
[31m-/* Write formatted floating-point number to either sb or p. */[m
[31m-static char *lj_strfmt_wfnum(SBuf *sb, SFormat sf, lua_Number n, char *p)[m
[31m-{[m
[31m-  MSize width = STRFMT_WIDTH(sf), prec = STRFMT_PREC(sf), len;[m
[31m-  TValue t;[m
[31m-  t.n = n;[m
[31m-  if (LJ_UNLIKELY((t.u32.hi << 1) >= 0xffe00000)) {[m
[31m-    /* Handle non-finite values uniformly for %a, %e, %f, %g. */[m
[31m-    int prefix = 0, ch = (sf & STRFMT_F_UPPER) ? 0x202020 : 0;[m
[31m-    if (((t.u32.hi & 0x000fffff) | t.u32.lo) != 0) {[m
[31m-      ch ^= ('n' << 16) | ('a' << 8) | 'n';[m
[31m-      if ((sf & STRFMT_F_SPACE)) prefix = ' ';[m
[31m-    } else {[m
[31m-      ch ^= ('i' << 16) | ('n' << 8) | 'f';[m
[31m-      if ((t.u32.hi & 0x80000000)) prefix = '-';[m
[31m-      else if ((sf & STRFMT_F_PLUS)) prefix = '+';[m
[31m-      else if ((sf & STRFMT_F_SPACE)) prefix = ' ';[m
[31m-    }[m
[31m-    len = 3 + (prefix != 0);[m
[31m-    if (!p) p = lj_buf_more(sb, width > len ? width : len);[m
[31m-    if (!(sf & STRFMT_F_LEFT)) while (width-- > len) *p++ = ' ';[m
[31m-    if (prefix) *p++ = prefix;[m
[31m-    *p++ = (char)(ch >> 16); *p++ = (char)(ch >> 8); *p++ = (char)ch;[m
[31m-  } else if (STRFMT_FP(sf) == STRFMT_FP(STRFMT_T_FP_A)) {[m
[31m-    /* %a */[m
[31m-    const char *hexdig = (sf & STRFMT_F_UPPER) ? "0123456789ABCDEFPX"[m
[31m-					       : "0123456789abcdefpx";[m
[31m-    int32_t e = (t.u32.hi >> 20) & 0x7ff;[m
[31m-    char prefix = 0, eprefix = '+';[m
[31m-    if (t.u32.hi & 0x80000000) prefix = '-';[m
[31m-    else if ((sf & STRFMT_F_PLUS)) prefix = '+';[m
[31m-    else if ((sf & STRFMT_F_SPACE)) prefix = ' ';[m
[31m-    t.u32.hi &= 0xfffff;[m
[31m-    if (e) {[m
[31m-      t.u32.hi |= 0x100000;[m
[31m-      e -= 1023;[m
[31m-    } else if (t.u32.lo | t.u32.hi) {[m
[31m-      /* Non-zero denormal - normalise it. */[m
[31m-      uint32_t shift = t.u32.hi ? 20-lj_fls(t.u32.hi) : 52-lj_fls(t.u32.lo);[m
[31m-      e = -1022 - shift;[m
[31m-      t.u64 <<= shift;[m
[31m-    }[m
[31m-    /* abs(n) == t.u64 * 2^(e - 52) */[m
[31m-    /* If n != 0, bit 52 of t.u64 is set, and is the highest set bit. */[m
[31m-    if ((int32_t)prec < 0) {[m
[31m-      /* Default precision: use smallest precision giving exact result. */[m
[31m-      prec = t.u32.lo ? 13-lj_ffs(t.u32.lo)/4 : 5-lj_ffs(t.u32.hi|0x100000)/4;[m
[31m-    } else if (prec < 13) {[m
[31m-      /* Precision is sufficiently low as to maybe require rounding. */[m
[31m-      t.u64 += (((uint64_t)1) << (51 - prec*4));[m
[31m-    }[m
[31m-    if (e < 0) {[m
[31m-      eprefix = '-';[m
[31m-      e = -e;[m
[31m-    }[m
[31m-    len = 5 + ndigits_dec((uint32_t)e) + prec + (prefix != 0)[m
[31m-	    + ((prec | (sf & STRFMT_F_ALT)) != 0);[m
[31m-    if (!p) p = lj_buf_more(sb, width > len ? width : len);[m
[31m-    if (!(sf & (STRFMT_F_LEFT | STRFMT_F_ZERO))) {[m
[31m-      while (width-- > len) *p++ = ' ';[m
[31m-    }[m
[31m-    if (prefix) *p++ = prefix;[m
[31m-    *p++ = '0';[m
[31m-    *p++ = hexdig[17]; /* x or X */[m
[31m-    if ((sf & (STRFMT_F_LEFT | STRFMT_F_ZERO)) == STRFMT_F_ZERO) {[m
[31m-      while (width-- > len) *p++ = '0';[m
[31m-    }[m
[31m-    *p++ = '0' + (t.u32.hi >> 20); /* Usually '1', sometimes '0' or '2'. */[m
[31m-    if ((prec | (sf & STRFMT_F_ALT))) {[m
[31m-      /* Emit fractional part. */[m
[31m-      char *q = p + 1 + prec;[m
[31m-      *p = '.';[m
[31m-      if (prec < 13) t.u64 >>= (52 - prec*4);[m
[31m-      else while (prec > 13) p[prec--] = '0';[m
[31m-      while (prec) { p[prec--] = hexdig[t.u64 & 15]; t.u64 >>= 4; }[m
[31m-      p = q;[m
[31m-    }[m
[31m-    *p++ = hexdig[16]; /* p or P */[m
[31m-    *p++ = eprefix; /* + or - */[m
[31m-    p = lj_strfmt_wint(p, e);[m
[31m-  } else {[m
[31m-    /* %e or %f or %g - begin by converting n to "nd" format. */[m
[31m-    uint32_t nd[64];[m
[31m-    uint32_t ndhi = 0, ndlo, i;[m
[31m-    int32_t e = (t.u32.hi >> 20) & 0x7ff, ndebias = 0;[m
[31m-    char prefix = 0, *q;[m
[31m-    if (t.u32.hi & 0x80000000) prefix = '-';[m
[31m-    else if ((sf & STRFMT_F_PLUS)) prefix = '+';[m
[31m-    else if ((sf & STRFMT_F_SPACE)) prefix = ' ';[m
[31m-    prec += ((int32_t)prec >> 31) & 7; /* Default precision is 6. */[m
[31m-    if (STRFMT_FP(sf) == STRFMT_FP(STRFMT_T_FP_G)) {[m
[31m-      /* %g - decrement precision if non-zero (to make it like %e). */[m
[31m-      prec--;[m
[31m-      prec ^= (uint32_t)((int32_t)prec >> 31);[m
[31m-    }[m
[31m-    if ((sf & STRFMT_T_FP_E) && prec < 14 && n != 0) {[m
[31m-      /* Precision is sufficiently low that rescaling will probably work. */[m
[31m-      if ((ndebias = rescale_e[e >> 6])) {[m
[31m-	t.n = n * rescale_n[e >> 6];[m
[31m-	if (LJ_UNLIKELY(!e)) t.n *= 1e10, ndebias -= 10;[m
[31m-	t.u64 -= 2; /* Convert 2ulp below (later we convert 2ulp above). */[m
[31m-	nd[0] = 0x100000 | (t.u32.hi & 0xfffff);[m
[31m-	e = ((t.u32.hi >> 20) & 0x7ff) - 1075 - (ND_MUL2K_MAX_SHIFT < 29);[m
[31m-	goto load_t_lo; rescale_failed:[m
[31m-	t.n = n;[m
[31m-	e = (t.u32.hi >> 20) & 0x7ff;[m
[31m-	ndebias = ndhi = 0;[m
[31m-      }[m
[31m-    }[m
[31m-    nd[0] = t.u32.hi & 0xfffff;[m
[31m-    if (e == 0) e++; else nd[0] |= 0x100000;[m
[31m-    e -= 1043;[m
[31m-    if (t.u32.lo) {[m
[31m-      e -= 32 + (ND_MUL2K_MAX_SHIFT < 29); load_t_lo:[m
[31m-#if ND_MUL2K_MAX_SHIFT >= 29[m
[31m-      nd[0] = (nd[0] << 3) | (t.u32.lo >> 29);[m
[31m-      ndhi = nd_mul2k(nd, ndhi, 29, t.u32.lo & 0x1fffffff, sf);[m
[31m-#elif ND_MUL2K_MAX_SHIFT >= 11[m
[31m-      ndhi = nd_mul2k(nd, ndhi, 11, t.u32.lo >> 21, sf);[m
[31m-      ndhi = nd_mul2k(nd, ndhi, 11, (t.u32.lo >> 10) & 0x7ff, sf);[m
[31m-      ndhi = nd_mul2k(nd, ndhi, 11, (t.u32.lo <<  1) & 0x7ff, sf);[m
[31m-#else[m
[31m-#error "ND_MUL2K_MAX_SHIFT too small"[m
[31m-#endif[m
[31m-    }[m
[31m-    if (e >= 0) {[m
[31m-      ndhi = nd_mul2k(nd, ndhi, (uint32_t)e, 0, sf);[m
[31m-      ndlo = 0;[m
[31m-    } else {[m
[31m-      ndlo = nd_div2k(nd, ndhi, (uint32_t)-e, sf);[m
[31m-      if (ndhi && !nd[ndhi]) ndhi--;[m
[31m-    }[m
[31m-    /* abs(n) == nd * 10^ndebias (for slightly loose interpretation of ==) */[m
[31m-    if ((sf & STRFMT_T_FP_E)) {[m
[31m-      /* %e or %g - assume %e and start by calculating nd's exponent (nde). */[m
[31m-      char eprefix = '+';[m
[31m-      int32_t nde = -1;[m
[31m-      MSize hilen;[m
[31m-      if (ndlo && !nd[ndhi]) {[m
[31m-	ndhi = 64; do {} while (!nd[--ndhi]);[m
[31m-	nde -= 64 * 9;[m
[31m-      }[m
[31m-      hilen = ndigits_dec(nd[ndhi]);[m
[31m-      nde += ndhi * 9 + hilen;[m
[31m-      if (ndebias) {[m
[31m-	/*[m
[31m-	** Rescaling was performed, but this introduced some error, and might[m
[31m-	** have pushed us across a rounding boundary. We check whether this[m
[31m-	** error affected the result by introducing even more error (2ulp in[m
[31m-	** either direction), and seeing whether a roundary boundary was[m
[31m-	** crossed. Having already converted the -2ulp case, we save off its[m
[31m-	** most significant digits, convert the +2ulp case, and compare them.[m
[31m-	*/[m
[31m-	int32_t eidx = e + 70 + (ND_MUL2K_MAX_SHIFT < 29)[m
[31m-			 + (t.u32.lo >= 0xfffffffe && !(~t.u32.hi << 12));[m
[31m-	const int8_t *m_e = four_ulp_m_e + eidx * 2;[m
[31m-	lua_assert(0 <= eidx && eidx < 128);[m
[31m-	nd[33] = nd[ndhi];[m
[31m-	nd[32] = nd[(ndhi - 1) & 0x3f];[m
[31m-	nd[31] = nd[(ndhi - 2) & 0x3f];[m
[31m-	nd_add_m10e(nd, ndhi, (uint8_t)*m_e, m_e[1]);[m
[31m-	if (LJ_UNLIKELY(!nd_similar(nd, ndhi, nd + 33, hilen, prec + 1))) {[m
[31m-	  goto rescale_failed;[m
[31m-	}[m
[31m-      }[m
[31m-      if ((int32_t)(prec - nde) < (0x3f & -(int32_t)ndlo) * 9) {[m
[31m-	/* Precision is sufficiently low as to maybe require rounding. */[m
[31m-	ndhi = nd_add_m10e(nd, ndhi, 5, nde - prec - 1);[m
[31m-	nde += (hilen != ndigits_dec(nd[ndhi]));[m
[31m-      }[m
[31m-      nde += ndebias;[m
[31m-      if ((sf & STRFMT_T_FP_F)) {[m
[31m-	/* %g */[m
[31m-	if ((int32_t)prec >= nde && nde >= -4) {[m
[31m-	  if (nde < 0) ndhi = 0;[m
[31m-	  prec -= nde;[m
[31m-	  goto g_format_like_f;[m
[31m-	} else if (!(sf & STRFMT_F_ALT) && prec && width > 5) {[m
[31m-	  /* Decrease precision in order to strip trailing zeroes. */[m
[31m-	  char tail[9];[m
[31m-	  uint32_t maxprec = hilen - 1 + ((ndhi - ndlo) & 0x3f) * 9;[m
[31m-	  if (prec >= maxprec) prec = maxprec;[m
[31m-	  else ndlo = (ndhi - (((int32_t)(prec - hilen) + 9) / 9)) & 0x3f;[m
[31m-	  i = prec - hilen - (((ndhi - ndlo) & 0x3f) * 9) + 10;[m
[31m-	  lj_strfmt_wuint9(tail, nd[ndlo]);[m
[31m-	  while (prec && tail[--i] == '0') {[m
[31m-	    prec--;[m
[31m-	    if (!i) {[m
[31m-	      if (ndlo == ndhi) { prec = 0; break; }[m
[31m-	      lj_strfmt_wuint9(tail, nd[++ndlo]);[m
[31m-	      i = 9;[m
[31m-	    }[m
[31m-	  }[m
[31m-	}[m
[31m-      }[m
[31m-      if (nde < 0) {[m
[31m-	/* Make nde non-negative. */[m
[31m-	eprefix = '-';[m
[31m-	nde = -nde;[m
[31m-      }[m
[31m-      len = 3 + prec + (prefix != 0) + ndigits_dec((uint32_t)nde) + (nde < 10)[m
[31m-	      + ((prec | (sf & STRFMT_F_ALT)) != 0);[m
[31m-      if (!p) p = lj_buf_more(sb, (width > len ? width : len) + 5);[m
[31m-      if (!(sf & (STRFMT_F_LEFT | STRFMT_F_ZERO))) {[m
[31m-	while (width-- > len) *p++ = ' ';[m
[31m-      }[m
[31m-      if (prefix) *p++ = prefix;[m
[31m-      if ((sf & (STRFMT_F_LEFT | STRFMT_F_ZERO)) == STRFMT_F_ZERO) {[m
[31m-	while (width-- > len) *p++ = '0';[m
[31m-      }[m
[31m-      q = lj_strfmt_wint(p + 1, nd[ndhi]);[m
[31m-      p[0] = p[1]; /* Put leading digit in the correct place. */[m
[31m-      if ((prec | (sf & STRFMT_F_ALT))) {[m
[31m-	/* Emit fractional part. */[m
[31m-	p[1] = '.'; p += 2;[m
[31m-	prec -= (MSize)(q - p); p = q; /* Account for digits already emitted. */[m
[31m-	/* Then emit chunks of 9 digits (this may emit 8 digits too many). */[m
[31m-	for (i = ndhi; (int32_t)prec > 0 && i != ndlo; prec -= 9) {[m
[31m-	  i = (i - 1) & 0x3f;[m
[31m-	  p = lj_strfmt_wuint9(p, nd[i]);[m
[31m-	}[m
[31m-	if ((sf & STRFMT_T_FP_F) && !(sf & STRFMT_F_ALT)) {[m
[31m-	  /* %g (and not %#g) - strip trailing zeroes. */[m
[31m-	  p += (int32_t)prec & ((int32_t)prec >> 31);[m
[31m-	  while (p[-1] == '0') p--;[m
[31m-	  if (p[-1] == '.') p--;[m
[31m-	} else {[m
[31m-	  /* %e (or %#g) - emit trailing zeroes. */[m
[31m-	  while ((int32_t)prec > 0) { *p++ = '0'; prec--; }[m
[31m-	  p += (int32_t)prec;[m
[31m-	}[m
[31m-      } else {[m
[31m-	p++;[m
[31m-      }[m
[31m-      *p++ = (sf & STRFMT_F_UPPER) ? 'E' : 'e';[m
[31m-      *p++ = eprefix; /* + or - */[m
[31m-      if (nde < 10) *p++ = '0'; /* Always at least two digits of exponent. */[m
[31m-      p = lj_strfmt_wint(p, nde);[m
[31m-    } else {[m
[31m-      /* %f (or, shortly, %g in %f style) */[m
[31m-      if (prec < (MSize)(0x3f & -(int32_t)ndlo) * 9) {[m
[31m-	/* Precision is sufficiently low as to maybe require rounding. */[m
[31m-	ndhi = nd_add_m10e(nd, ndhi, 5, 0 - prec - 1);[m
[31m-      }[m
[31m-      g_format_like_f:[m
[31m-      if ((sf & STRFMT_T_FP_E) && !(sf & STRFMT_F_ALT) && prec && width) {[m
[31m-	/* Decrease precision in order to strip trailing zeroes. */[m
[31m-	if (ndlo) {[m
[31m-	  /* nd has a fractional part; we need to look at its digits. */[m
[31m-	  char tail[9];[m
[31m-	  uint32_t maxprec = (64 - ndlo) * 9;[m
[31m-	  if (prec >= maxprec) prec = maxprec;[m
[31m-	  else ndlo = 64 - (prec + 8) / 9;[m
[31m-	  i = prec - ((63 - ndlo) * 9);[m
[31m-	  lj_strfmt_wuint9(tail, nd[ndlo]);[m
[31m-	  while (prec && tail[--i] == '0') {[m
[31m-	    prec--;[m
[31m-	    if (!i) {[m
[31m-	      if (ndlo == 63) { prec = 0; break; }[m
[31m-	      lj_strfmt_wuint9(tail, nd[++ndlo]);[m
[31m-	      i = 9;[m
[31m-	    }[m
[31m-	  }[m
[31m-	} else {[m
[31m-	  /* nd has no fractional part, so precision goes straight to zero. */[m
[31m-	  prec = 0;[m
[31m-	}[m
[31m-      }[m
[31m-      len = ndhi * 9 + ndigits_dec(nd[ndhi]) + prec + (prefix != 0)[m
[31m-		     + ((prec | (sf & STRFMT_F_ALT)) != 0);[m
[31m-      if (!p) p = lj_buf_more(sb, (width > len ? width : len) + 8);[m
[31m-      if (!(sf & (STRFMT_F_LEFT | STRFMT_F_ZERO))) {[m
[31m-	while (width-- > len) *p++ = ' ';[m
[31m-      }[m
[31m-      if (prefix) *p++ = prefix;[m
[31m-      if ((sf & (STRFMT_F_LEFT | STRFMT_F_ZERO)) == STRFMT_F_ZERO) {[m
[31m-	while (width-- > len) *p++ = '0';[m
[31m-      }[m
[31m-      /* Emit integer part. */[m
[31m-      p = lj_strfmt_wint(p, nd[ndhi]);[m
[31m-      i = ndhi;[m
[31m-      while (i) p = lj_strfmt_wuint9(p, nd[--i]);[m
[31m-      if ((prec | (sf & STRFMT_F_ALT))) {[m
[31m-	/* Emit fractional part. */[m
[31m-	*p++ = '.';[m
[31m-	/* Emit chunks of 9 digits (this may emit 8 digits too many). */[m
[31m-	while ((int32_t)prec > 0 && i != ndlo) {[m
[31m-	  i = (i - 1) & 0x3f;[m
[31m-	  p = lj_strfmt_wuint9(p, nd[i]);[m
[31m-	  prec -= 9;[m
[31m-	}[m
[31m-	if ((sf & STRFMT_T_FP_E) && !(sf & STRFMT_F_ALT)) {[m
[31m-	  /* %g (and not %#g) - strip trailing zeroes. */[m
[31m-	  p += (int32_t)prec & ((int32_t)prec >> 31);[m
[31m-	  while (p[-1] == '0') p--;[m
[31m-	  if (p[-1] == '.') p--;[m
[31m-	} else {[m
[31m-	  /* %f (or %#g) - emit trailing zeroes. */[m
[31m-	  while ((int32_t)prec > 0) { *p++ = '0'; prec--; }[m
[31m-	  p += (int32_t)prec;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if ((sf & STRFMT_F_LEFT)) while (width-- > len) *p++ = ' ';[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-/* Add formatted floating-point number to buffer. */[m
[31m-SBuf *lj_strfmt_putfnum(SBuf *sb, SFormat sf, lua_Number n)[m
[31m-{[m
[31m-  setsbufP(sb, lj_strfmt_wfnum(sb, sf, n, NULL));[m
[31m-  return sb;[m
[31m-}[m
[31m-[m
[31m-/* -- Conversions to strings ---------------------------------------------- */[m
[31m-[m
[31m-/* Convert number to string. */[m
[31m-GCstr * LJ_FASTCALL lj_strfmt_num(lua_State *L, cTValue *o)[m
[31m-{[m
[31m-  char buf[STRFMT_MAXBUF_NUM];[m
[31m-  MSize len = (MSize)(lj_strfmt_wfnum(NULL, STRFMT_G14, o->n, buf) - buf);[m
[31m-  return lj_str_new(L, buf, len);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strscan.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strscan.c[m
[1mdeleted file mode 100644[m
[1mindex 7c51713..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strscan.c[m
[1m+++ /dev/null[m
[36m@@ -1,547 +0,0 @@[m
[31m-/*[m
[31m-** String scanning.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <math.h>[m
[31m-[m
[31m-#define lj_strscan_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_char.h"[m
[31m-#include "lj_strscan.h"[m
[31m-[m
[31m-/* -- Scanning numbers ---------------------------------------------------- */[m
[31m-[m
[31m-/*[m
[31m-** Rationale for the builtin string to number conversion library:[m
[31m-**[m
[31m-** It removes a dependency on libc's strtod(), which is a true portability[m
[31m-** nightmare. Mainly due to the plethora of supported OS and toolchain[m
[31m-** combinations. Sadly, the various implementations[m
[31m-** a) are often buggy, incomplete (no hex floats) and/or imprecise,[m
[31m-** b) sometimes crash or hang on certain inputs,[m
[31m-** c) return non-standard NaNs that need to be filtered out, and[m
[31m-** d) fail if the locale-specific decimal separator is not a dot,[m
[31m-**    which can only be fixed with atrocious workarounds.[m
[31m-**[m
[31m-** Also, most of the strtod() implementations are hopelessly bloated,[m
[31m-** which is not just an I-cache hog, but a problem for static linkage[m
[31m-** on embedded systems, too.[m
[31m-**[m
[31m-** OTOH the builtin conversion function is very compact. Even though it[m
[31m-** does a lot more, like parsing long longs, octal or imaginary numbers[m
[31m-** and returning the result in different formats:[m
[31m-** a) It needs less than 3 KB (!) of machine code (on x64 with -Os),[m
[31m-** b) it doesn't perform any dynamic allocation and,[m
[31m-** c) it needs only around 600 bytes of stack space.[m
[31m-**[m
[31m-** The builtin function is faster than strtod() for typical inputs, e.g.[m
[31m-** "123", "1.5" or "1e6". Arguably, it's slower for very large exponents,[m
[31m-** which are not very common (this could be fixed, if needed).[m
[31m-**[m
[31m-** And most importantly, the builtin function is equally precise on all[m
[31m-** platforms. It correctly converts and rounds any input to a double.[m
[31m-** If this is not the case, please send a bug report -- but PLEASE verify[m
[31m-** that the implementation you're comparing to is not the culprit![m
[31m-**[m
[31m-** The implementation quickly pre-scans the entire string first and[m
[31m-** handles simple integers on-the-fly. Otherwise, it dispatches to the[m
[31m-** base-specific parser. Hex and octal is straightforward.[m
[31m-**[m
[31m-** Decimal to binary conversion uses a fixed-length circular buffer in[m
[31m-** base 100. Some simple cases are handled directly. For other cases, the[m
[31m-** number in the buffer is up-scaled or down-scaled until the integer part[m
[31m-** is in the proper range. Then the integer part is rounded and converted[m
[31m-** to a double which is finally rescaled to the result. Denormals need[m
[31m-** special treatment to prevent incorrect 'double rounding'.[m
[31m-*/[m
[31m-[m
[31m-/* Definitions for circular decimal digit buffer (base 100 = 2 digits/byte). */[m
[31m-#define STRSCAN_DIG	1024[m
[31m-#define STRSCAN_MAXDIG	800		/* 772 + extra are sufficient. */[m
[31m-#define STRSCAN_DDIG	(STRSCAN_DIG/2)[m
[31m-#define STRSCAN_DMASK	(STRSCAN_DDIG-1)[m
[31m-[m
[31m-/* Helpers for circular buffer. */[m
[31m-#define DNEXT(a)	(((a)+1) & STRSCAN_DMASK)[m
[31m-#define DPREV(a)	(((a)-1) & STRSCAN_DMASK)[m
[31m-#define DLEN(lo, hi)	((int32_t)(((lo)-(hi)) & STRSCAN_DMASK))[m
[31m-[m
[31m-#define casecmp(c, k)	(((c) | 0x20) == k)[m
[31m-[m
[31m-/* Final conversion to double. */[m
[31m-static void strscan_double(uint64_t x, TValue *o, int32_t ex2, int32_t neg)[m
[31m-{[m
[31m-  double n;[m
[31m-[m
[31m-  /* Avoid double rounding for denormals. */[m
[31m-  if (LJ_UNLIKELY(ex2 <= -1075 && x != 0)) {[m
[31m-    /* NYI: all of this generates way too much code on 32 bit CPUs. */[m
[31m-#if defined(__GNUC__) && LJ_64[m
[31m-    int32_t b = (int32_t)(__builtin_clzll(x)^63);[m
[31m-#else[m
[31m-    int32_t b = (x>>32) ? 32+(int32_t)lj_fls((uint32_t)(x>>32)) :[m
[31m-			  (int32_t)lj_fls((uint32_t)x);[m
[31m-#endif[m
[31m-    if ((int32_t)b + ex2 <= -1023 && (int32_t)b + ex2 >= -1075) {[m
[31m-      uint64_t rb = (uint64_t)1 << (-1075-ex2);[m
[31m-      if ((x & rb) && ((x & (rb+rb+rb-1)))) x += rb+rb;[m
[31m-      x = (x & ~(rb+rb-1));[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Convert to double using a signed int64_t conversion, then rescale. */[m
[31m-  lua_assert((int64_t)x >= 0);[m
[31m-  n = (double)(int64_t)x;[m
[31m-  if (neg) n = -n;[m
[31m-  if (ex2) n = ldexp(n, ex2);[m
[31m-  o->n = n;[m
[31m-}[m
[31m-[m
[31m-/* Parse hexadecimal number. */[m
[31m-static StrScanFmt strscan_hex(const uint8_t *p, TValue *o,[m
[31m-			      StrScanFmt fmt, uint32_t opt,[m
[31m-			      int32_t ex2, int32_t neg, uint32_t dig)[m
[31m-{[m
[31m-  uint64_t x = 0;[m
[31m-  uint32_t i;[m
[31m-[m
[31m-  /* Scan hex digits. */[m
[31m-  for (i = dig > 16 ? 16 : dig ; i; i--, p++) {[m
[31m-    uint32_t d = (*p != '.' ? *p : *++p); if (d > '9') d += 9;[m
[31m-    x = (x << 4) + (d & 15);[m
[31m-  }[m
[31m-[m
[31m-  /* Summarize rounding-effect of excess digits. */[m
[31m-  for (i = 16; i < dig; i++, p++)[m
[31m-    x |= ((*p != '.' ? *p : *++p) != '0'), ex2 += 4;[m
[31m-[m
[31m-  /* Format-specific handling. */[m
[31m-  switch (fmt) {[m
[31m-  case STRSCAN_INT:[m
[31m-    if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {[m
[31m-      o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-      return STRSCAN_INT;  /* Fast path for 32 bit integers. */[m
[31m-    }[m
[31m-    if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; break; }[m
[31m-    /* fallthrough */[m
[31m-  case STRSCAN_U32:[m
[31m-    if (dig > 8) return STRSCAN_ERROR;[m
[31m-    o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-    return STRSCAN_U32;[m
[31m-  case STRSCAN_I64:[m
[31m-  case STRSCAN_U64:[m
[31m-    if (dig > 16) return STRSCAN_ERROR;[m
[31m-    o->u64 = neg ? (uint64_t)-(int64_t)x : x;[m
[31m-    return fmt;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  /* Reduce range, then convert to double. */[m
[31m-  if ((x & U64x(c0000000,0000000))) { x = (x >> 2) | (x & 3); ex2 += 2; }[m
[31m-  strscan_double(x, o, ex2, neg);[m
[31m-  return fmt;[m
[31m-}[m
[31m-[m
[31m-/* Parse octal number. */[m
[31m-static StrScanFmt strscan_oct(const uint8_t *p, TValue *o,[m
[31m-			      StrScanFmt fmt, int32_t neg, uint32_t dig)[m
[31m-{[m
[31m-  uint64_t x = 0;[m
[31m-[m
[31m-  /* Scan octal digits. */[m
[31m-  if (dig > 22 || (dig == 22 && *p > '1')) return STRSCAN_ERROR;[m
[31m-  while (dig-- > 0) {[m
[31m-    if (!(*p >= '0' && *p <= '7')) return STRSCAN_ERROR;[m
[31m-    x = (x << 3) + (*p++ & 7);[m
[31m-  }[m
[31m-[m
[31m-  /* Format-specific handling. */[m
[31m-  switch (fmt) {[m
[31m-  case STRSCAN_INT:[m
[31m-    if (x >= 0x80000000u+neg) fmt = STRSCAN_U32;[m
[31m-    /* fallthrough */[m
[31m-  case STRSCAN_U32:[m
[31m-    if ((x >> 32)) return STRSCAN_ERROR;[m
[31m-    o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-    break;[m
[31m-  default:[m
[31m-  case STRSCAN_I64:[m
[31m-  case STRSCAN_U64:[m
[31m-    o->u64 = neg ? (uint64_t)-(int64_t)x : x;[m
[31m-    break;[m
[31m-  }[m
[31m-  return fmt;[m
[31m-}[m
[31m-[m
[31m-/* Parse decimal number. */[m
[31m-static StrScanFmt strscan_dec(const uint8_t *p, TValue *o,[m
[31m-			      StrScanFmt fmt, uint32_t opt,[m
[31m-			      int32_t ex10, int32_t neg, uint32_t dig)[m
[31m-{[m
[31m-  uint8_t xi[STRSCAN_DDIG], *xip = xi;[m
[31m-[m
[31m-  if (dig) {[m
[31m-    uint32_t i = dig;[m
[31m-    if (i > STRSCAN_MAXDIG) {[m
[31m-      ex10 += (int32_t)(i - STRSCAN_MAXDIG);[m
[31m-      i = STRSCAN_MAXDIG;[m
[31m-    }[m
[31m-    /* Scan unaligned leading digit. */[m
[31m-    if (((ex10^i) & 1))[m
[31m-      *xip++ = ((*p != '.' ? *p : *++p) & 15), i--, p++;[m
[31m-    /* Scan aligned double-digits. */[m
[31m-    for ( ; i > 1; i -= 2) {[m
[31m-      uint32_t d = 10 * ((*p != '.' ? *p : *++p) & 15); p++;[m
[31m-      *xip++ = d + ((*p != '.' ? *p : *++p) & 15); p++;[m
[31m-    }[m
[31m-    /* Scan and realign trailing digit. */[m
[31m-    if (i) *xip++ = 10 * ((*p != '.' ? *p : *++p) & 15), ex10--, dig++, p++;[m
[31m-[m
[31m-    /* Summarize rounding-effect of excess digits. */[m
[31m-    if (dig > STRSCAN_MAXDIG) {[m
[31m-      do {[m
[31m-	if ((*p != '.' ? *p : *++p) != '0') { xip[-1] |= 1; break; }[m
[31m-	p++;[m
[31m-      } while (--dig > STRSCAN_MAXDIG);[m
[31m-      dig = STRSCAN_MAXDIG;[m
[31m-    } else {  /* Simplify exponent. */[m
[31m-      while (ex10 > 0 && dig <= 18) *xip++ = 0, ex10 -= 2, dig += 2;[m
[31m-    }[m
[31m-  } else {  /* Only got zeros. */[m
[31m-    ex10 = 0;[m
[31m-    xi[0] = 0;[m
[31m-  }[m
[31m-[m
[31m-  /* Fast path for numbers in integer format (but handles e.g. 1e6, too). */[m
[31m-  if (dig <= 20 && ex10 == 0) {[m
[31m-    uint8_t *xis;[m
[31m-    uint64_t x = xi[0];[m
[31m-    double n;[m
[31m-    for (xis = xi+1; xis < xip; xis++) x = x * 100 + *xis;[m
[31m-    if (!(dig == 20 && (xi[0] > 18 || (int64_t)x >= 0))) {  /* No overflow? */[m
[31m-      /* Format-specific handling. */[m
[31m-      switch (fmt) {[m
[31m-      case STRSCAN_INT:[m
[31m-	if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {[m
[31m-	  o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-	  return STRSCAN_INT;  /* Fast path for 32 bit integers. */[m
[31m-	}[m
[31m-	if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; goto plainnumber; }[m
[31m-	/* fallthrough */[m
[31m-      case STRSCAN_U32:[m
[31m-	if ((x >> 32) != 0) return STRSCAN_ERROR;[m
[31m-	o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-	return STRSCAN_U32;[m
[31m-      case STRSCAN_I64:[m
[31m-      case STRSCAN_U64:[m
[31m-	o->u64 = neg ? (uint64_t)-(int64_t)x : x;[m
[31m-	return fmt;[m
[31m-      default:[m
[31m-      plainnumber:  /* Fast path for plain numbers < 2^63. */[m
[31m-	if ((int64_t)x < 0) break;[m
[31m-	n = (double)(int64_t)x;[m
[31m-	if (neg) n = -n;[m
[31m-	o->n = n;[m
[31m-	return fmt;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Slow non-integer path. */[m
[31m-  if (fmt == STRSCAN_INT) {[m
[31m-    if ((opt & STRSCAN_OPT_C)) return STRSCAN_ERROR;[m
[31m-    fmt = STRSCAN_NUM;[m
[31m-  } else if (fmt > STRSCAN_INT) {[m
[31m-    return STRSCAN_ERROR;[m
[31m-  }[m
[31m-  {[m
[31m-    uint32_t hi = 0, lo = (uint32_t)(xip-xi);[m
[31m-    int32_t ex2 = 0, idig = (int32_t)lo + (ex10 >> 1);[m
[31m-[m
[31m-    lua_assert(lo > 0 && (ex10 & 1) == 0);[m
[31m-[m
[31m-    /* Handle simple overflow/underflow. */[m
[31m-    if (idig > 310/2) { if (neg) setminfV(o); else setpinfV(o); return fmt; }[m
[31m-    else if (idig < -326/2) { o->n = neg ? -0.0 : 0.0; return fmt; }[m
[31m-[m
[31m-    /* Scale up until we have at least 17 or 18 integer part digits. */[m
[31m-    while (idig < 9 && idig < DLEN(lo, hi)) {[m
[31m-      uint32_t i, cy = 0;[m
[31m-      ex2 -= 6;[m
[31m-      for (i = DPREV(lo); ; i = DPREV(i)) {[m
[31m-	uint32_t d = (xi[i] << 6) + cy;[m
[31m-	cy = (((d >> 2) * 5243) >> 17); d = d - cy * 100;  /* Div/mod 100. */[m
[31m-	xi[i] = (uint8_t)d;[m
[31m-	if (i == hi) break;[m
[31m-	if (d == 0 && i == DPREV(lo)) lo = i;[m
[31m-      }[m
[31m-      if (cy) {[m
[31m-	hi = DPREV(hi);[m
[31m-	if (xi[DPREV(lo)] == 0) lo = DPREV(lo);[m
[31m-	else if (hi == lo) { lo = DPREV(lo); xi[DPREV(lo)] |= xi[lo]; }[m
[31m-	xi[hi] = (uint8_t)cy; idig++;[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Scale down until no more than 17 or 18 integer part digits remain. */[m
[31m-    while (idig > 9) {[m
[31m-      uint32_t i = hi, cy = 0;[m
[31m-      ex2 += 6;[m
[31m-      do {[m
[31m-	cy += xi[i];[m
[31m-	xi[i] = (cy >> 6);[m
[31m-	cy = 100 * (cy & 0x3f);[m
[31m-	if (xi[i] == 0 && i == hi) hi = DNEXT(hi), idig--;[m
[31m-	i = DNEXT(i);[m
[31m-      } while (i != lo);[m
[31m-      while (cy) {[m
[31m-	if (hi == lo) { xi[DPREV(lo)] |= 1; break; }[m
[31m-	xi[lo] = (cy >> 6); lo = DNEXT(lo);[m
[31m-	cy = 100 * (cy & 0x3f);[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Collect integer part digits and convert to rescaled double. */[m
[31m-    {[m
[31m-      uint64_t x = xi[hi];[m
[31m-      uint32_t i;[m
[31m-      for (i = DNEXT(hi); --idig > 0 && i != lo; i = DNEXT(i))[m
[31m-	x = x * 100 + xi[i];[m
[31m-      if (i == lo) {[m
[31m-	while (--idig >= 0) x = x * 100;[m
[31m-      } else {  /* Gather round bit from remaining digits. */[m
[31m-	x <<= 1; ex2--;[m
[31m-	do {[m
[31m-	  if (xi[i]) { x |= 1; break; }[m
[31m-	  i = DNEXT(i);[m
[31m-	} while (i != lo);[m
[31m-      }[m
[31m-      strscan_double(x, o, ex2, neg);[m
[31m-    }[m
[31m-  }[m
[31m-  return fmt;[m
[31m-}[m
[31m-[m
[31m-/* Parse binary number. */[m
[31m-static StrScanFmt strscan_bin(const uint8_t *p, TValue *o,[m
[31m-			      StrScanFmt fmt, uint32_t opt,[m
[31m-			      int32_t ex2, int32_t neg, uint32_t dig)[m
[31m-{[m
[31m-  uint64_t x = 0;[m
[31m-  uint32_t i;[m
[31m-[m
[31m-  if (ex2 || dig > 64) return STRSCAN_ERROR;[m
[31m-[m
[31m-  /* Scan binary digits. */[m
[31m-  for (i = dig; i; i--, p++) {[m
[31m-    if ((*p & ~1) != '0') return STRSCAN_ERROR;[m
[31m-    x = (x << 1) | (*p & 1);[m
[31m-  }[m
[31m-[m
[31m-  /* Format-specific handling. */[m
[31m-  switch (fmt) {[m
[31m-  case STRSCAN_INT:[m
[31m-    if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) {[m
[31m-      o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-      return STRSCAN_INT;  /* Fast path for 32 bit integers. */[m
[31m-    }[m
[31m-    if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; break; }[m
[31m-    /* fallthrough */[m
[31m-  case STRSCAN_U32:[m
[31m-    if (dig > 32) return STRSCAN_ERROR;[m
[31m-    o->i = neg ? -(int32_t)x : (int32_t)x;[m
[31m-    return STRSCAN_U32;[m
[31m-  case STRSCAN_I64:[m
[31m-  case STRSCAN_U64:[m
[31m-    o->u64 = neg ? (uint64_t)-(int64_t)x : x;[m
[31m-    return fmt;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  /* Reduce range, then convert to double. */[m
[31m-  if ((x & U64x(c0000000,0000000))) { x = (x >> 2) | (x & 3); ex2 += 2; }[m
[31m-  strscan_double(x, o, ex2, neg);[m
[31m-  return fmt;[m
[31m-}[m
[31m-[m
[31m-/* Scan string containing a number. Returns format. Returns value in o. */[m
[31m-StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt)[m
[31m-{[m
[31m-  int32_t neg = 0;[m
[31m-[m
[31m-  /* Remove leading space, parse sign and non-numbers. */[m
[31m-  if (LJ_UNLIKELY(!lj_char_isdigit(*p))) {[m
[31m-    while (lj_char_isspace(*p)) p++;[m
[31m-    if (*p == '+' || *p == '-') neg = (*p++ == '-');[m
[31m-    if (LJ_UNLIKELY(*p >= 'A')) {  /* Parse "inf", "infinity" or "nan". */[m
[31m-      TValue tmp;[m
[31m-      setnanV(&tmp);[m
[31m-      if (casecmp(p[0],'i') && casecmp(p[1],'n') && casecmp(p[2],'f')) {[m
[31m-	if (neg) setminfV(&tmp); else setpinfV(&tmp);[m
[31m-	p += 3;[m
[31m-	if (casecmp(p[0],'i') && casecmp(p[1],'n') && casecmp(p[2],'i') &&[m
[31m-	    casecmp(p[3],'t') && casecmp(p[4],'y')) p += 5;[m
[31m-      } else if (casecmp(p[0],'n') && casecmp(p[1],'a') && casecmp(p[2],'n')) {[m
[31m-	p += 3;[m
[31m-      }[m
[31m-      while (lj_char_isspace(*p)) p++;[m
[31m-      if (*p) return STRSCAN_ERROR;[m
[31m-      o->u64 = tmp.u64;[m
[31m-      return STRSCAN_NUM;[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Parse regular number. */[m
[31m-  {[m
[31m-    StrScanFmt fmt = STRSCAN_INT;[m
[31m-    int cmask = LJ_CHAR_DIGIT;[m
[31m-    int base = (opt & STRSCAN_OPT_C) && *p == '0' ? 0 : 10;[m
[31m-    const uint8_t *sp, *dp = NULL;[m
[31m-    uint32_t dig = 0, hasdig = 0, x = 0;[m
[31m-    int32_t ex = 0;[m
[31m-[m
[31m-    /* Determine base and skip leading zeros. */[m
[31m-    if (LJ_UNLIKELY(*p <= '0')) {[m
[31m-      if (*p == '0') {[m
[31m-	if (casecmp(p[1], 'x'))[m
[31m-	  base = 16, cmask = LJ_CHAR_XDIGIT, p += 2;[m
[31m-	else if (casecmp(p[1], 'b'))[m
[31m-	  base = 2, cmask = LJ_CHAR_DIGIT, p += 2;[m
[31m-      }[m
[31m-      for ( ; ; p++) {[m
[31m-	if (*p == '0') {[m
[31m-	  hasdig = 1;[m
[31m-	} else if (*p == '.') {[m
[31m-	  if (dp) return STRSCAN_ERROR;[m
[31m-	  dp = p;[m
[31m-	} else {[m
[31m-	  break;[m
[31m-	}[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Preliminary digit and decimal point scan. */[m
[31m-    for (sp = p; ; p++) {[m
[31m-      if (LJ_LIKELY(lj_char_isa(*p, cmask))) {[m
[31m-	x = x * 10 + (*p & 15);  /* For fast path below. */[m
[31m-	dig++;[m
[31m-      } else if (*p == '.') {[m
[31m-	if (dp) return STRSCAN_ERROR;[m
[31m-	dp = p;[m
[31m-      } else {[m
[31m-	break;[m
[31m-      }[m
[31m-    }[m
[31m-    if (!(hasdig | dig)) return STRSCAN_ERROR;[m
[31m-[m
[31m-    /* Handle decimal point. */[m
[31m-    if (dp) {[m
[31m-      fmt = STRSCAN_NUM;[m
[31m-      if (dig) {[m
[31m-	ex = (int32_t)(dp-(p-1)); dp = p-1;[m
[31m-	while (ex < 0 && *dp-- == '0') ex++, dig--;  /* Skip trailing zeros. */[m
[31m-	if (base == 16) ex *= 4;[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Parse exponent. */[m
[31m-    if (base >= 10 && casecmp(*p, (uint32_t)(base == 16 ? 'p' : 'e'))) {[m
[31m-      uint32_t xx;[m
[31m-      int negx = 0;[m
[31m-      fmt = STRSCAN_NUM; p++;[m
[31m-      if (*p == '+' || *p == '-') negx = (*p++ == '-');[m
[31m-      if (!lj_char_isdigit(*p)) return STRSCAN_ERROR;[m
[31m-      xx = (*p++ & 15);[m
[31m-      while (lj_char_isdigit(*p)) {[m
[31m-	if (xx < 65536) xx = xx * 10 + (*p & 15);[m
[31m-	p++;[m
[31m-      }[m
[31m-      ex += negx ? -(int32_t)xx : (int32_t)xx;[m
[31m-    }[m
[31m-[m
[31m-    /* Parse suffix. */[m
[31m-    if (*p) {[m
[31m-      /* I (IMAG), U (U32), LL (I64), ULL/LLU (U64), L (long), UL/LU (ulong). */[m
[31m-      /* NYI: f (float). Not needed until cp_number() handles non-integers. */[m
[31m-      if (casecmp(*p, 'i')) {[m
[31m-	if (!(opt & STRSCAN_OPT_IMAG)) return STRSCAN_ERROR;[m
[31m-	p++; fmt = STRSCAN_IMAG;[m
[31m-      } else if (fmt == STRSCAN_INT) {[m
[31m-	if (casecmp(*p, 'u')) p++, fmt = STRSCAN_U32;[m
[31m-	if (casecmp(*p, 'l')) {[m
[31m-	  p++;[m
[31m-	  if (casecmp(*p, 'l')) p++, fmt += STRSCAN_I64 - STRSCAN_INT;[m
[31m-	  else if (!(opt & STRSCAN_OPT_C)) return STRSCAN_ERROR;[m
[31m-	  else if (sizeof(long) == 8) fmt += STRSCAN_I64 - STRSCAN_INT;[m
[31m-	}[m
[31m-	if (casecmp(*p, 'u') && (fmt == STRSCAN_INT || fmt == STRSCAN_I64))[m
[31m-	  p++, fmt += STRSCAN_U32 - STRSCAN_INT;[m
[31m-	if ((fmt == STRSCAN_U32 && !(opt & STRSCAN_OPT_C)) ||[m
[31m-	    (fmt >= STRSCAN_I64 && !(opt & STRSCAN_OPT_LL)))[m
[31m-	  return STRSCAN_ERROR;[m
[31m-      }[m
[31m-      while (lj_char_isspace(*p)) p++;[m
[31m-      if (*p) return STRSCAN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* Fast path for decimal 32 bit integers. */[m
[31m-    if (fmt == STRSCAN_INT && base == 10 &&[m
[31m-	(dig < 10 || (dig == 10 && *sp <= '2' && x < 0x80000000u+neg))) {[m
[31m-      int32_t y = neg ? -(int32_t)x : (int32_t)x;[m
[31m-      if ((opt & STRSCAN_OPT_TONUM)) {[m
[31m-	o->n = (double)y;[m
[31m-	return STRSCAN_NUM;[m
[31m-      } else {[m
[31m-	o->i = y;[m
[31m-	return STRSCAN_INT;[m
[31m-      }[m
[31m-    }[m
[31m-[m
[31m-    /* Dispatch to base-specific parser. */[m
[31m-    if (base == 0 && !(fmt == STRSCAN_NUM || fmt == STRSCAN_IMAG))[m
[31m-      return strscan_oct(sp, o, fmt, neg, dig);[m
[31m-    if (base == 16)[m
[31m-      fmt = strscan_hex(sp, o, fmt, opt, ex, neg, dig);[m
[31m-    else if (base == 2)[m
[31m-      fmt = strscan_bin(sp, o, fmt, opt, ex, neg, dig);[m
[31m-    else[m
[31m-      fmt = strscan_dec(sp, o, fmt, opt, ex, neg, dig);[m
[31m-[m
[31m-    /* Try to convert number to integer, if requested. */[m
[31m-    if (fmt == STRSCAN_NUM && (opt & STRSCAN_OPT_TOINT)) {[m
[31m-      double n = o->n;[m
[31m-      int32_t i = lj_num2int(n);[m
[31m-      if (n == (lua_Number)i) { o->i = i; return STRSCAN_INT; }[m
[31m-    }[m
[31m-    return fmt;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o)[m
[31m-{[m
[31m-  StrScanFmt fmt = lj_strscan_scan((const uint8_t *)strdata(str), o,[m
[31m-				   STRSCAN_OPT_TONUM);[m
[31m-  lua_assert(fmt == STRSCAN_ERROR || fmt == STRSCAN_NUM);[m
[31m-  return (fmt != STRSCAN_ERROR);[m
[31m-}[m
[31m-[m
[31m-#if LJ_DUALNUM[m
[31m-int LJ_FASTCALL lj_strscan_number(GCstr *str, TValue *o)[m
[31m-{[m
[31m-  StrScanFmt fmt = lj_strscan_scan((const uint8_t *)strdata(str), o,[m
[31m-				   STRSCAN_OPT_TOINT);[m
[31m-  lua_assert(fmt == STRSCAN_ERROR || fmt == STRSCAN_NUM || fmt == STRSCAN_INT);[m
[31m-  if (fmt == STRSCAN_INT) setitype(o, LJ_TISNUM);[m
[31m-  return (fmt != STRSCAN_ERROR);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#undef DNEXT[m
[31m-#undef DPREV[m
[31m-#undef DLEN[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strscan.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strscan.h[m
[1mdeleted file mode 100644[m
[1mindex b3ee9e5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_strscan.h[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-/*[m
[31m-** String scanning.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_STRSCAN_H[m
[31m-#define _LJ_STRSCAN_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Options for accepted/returned formats. */[m
[31m-#define STRSCAN_OPT_TOINT	0x01  /* Convert to int32_t, if possible. */[m
[31m-#define STRSCAN_OPT_TONUM	0x02  /* Always convert to double. */[m
[31m-#define STRSCAN_OPT_IMAG	0x04[m
[31m-#define STRSCAN_OPT_LL		0x08[m
[31m-#define STRSCAN_OPT_C		0x10[m
[31m-[m
[31m-/* Returned format. */[m
[31m-typedef enum {[m
[31m-  STRSCAN_ERROR,[m
[31m-  STRSCAN_NUM, STRSCAN_IMAG,[m
[31m-  STRSCAN_INT, STRSCAN_U32, STRSCAN_I64, STRSCAN_U64,[m
[31m-} StrScanFmt;[m
[31m-[m
[31m-LJ_FUNC StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt);[m
[31m-LJ_FUNC int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o);[m
[31m-#if LJ_DUALNUM[m
[31m-LJ_FUNC int LJ_FASTCALL lj_strscan_number(GCstr *str, TValue *o);[m
[31m-#else[m
[31m-#define lj_strscan_number(s, o)		lj_strscan_num((s), (o))[m
[31m-#endif[m
[31m-[m
[31m-/* Check for number or convert string to number/int in-place (!). */[m
[31m-static LJ_AINLINE int lj_strscan_numberobj(TValue *o)[m
[31m-{[m
[31m-  return tvisnumber(o) || (tvisstr(o) && lj_strscan_number(strV(o), o));[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_tab.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_tab.c[m
[1mdeleted file mode 100644[m
[1mindex 8011212..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_tab.c[m
[1m+++ /dev/null[m
[36m@@ -1,666 +0,0 @@[m
[31m-/*[m
[31m-** Table handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_tab_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_tab.h"[m
[31m-[m
[31m-/* -- Object hashing ------------------------------------------------------ */[m
[31m-[m
[31m-/* Hash values are masked with the table hash mask and used as an index. */[m
[31m-static LJ_AINLINE Node *hashmask(const GCtab *t, uint32_t hash)[m
[31m-{[m
[31m-  Node *n = noderef(t->node);[m
[31m-  return &n[hash & t->hmask];[m
[31m-}[m
[31m-[m
[31m-/* String hashes are precomputed when they are interned. */[m
[31m-#define hashstr(t, s)		hashmask(t, (s)->hash)[m
[31m-[m
[31m-#define hashlohi(t, lo, hi)	hashmask((t), hashrot((lo), (hi)))[m
[31m-#define hashnum(t, o)		hashlohi((t), (o)->u32.lo, ((o)->u32.hi << 1))[m
[31m-#define hashptr(t, p)		hashlohi((t), u32ptr(p), u32ptr(p) + HASH_BIAS)[m
[31m-#if LJ_GC64[m
[31m-#define hashgcref(t, r) \[m
[31m-  hashlohi((t), (uint32_t)gcrefu(r), (uint32_t)(gcrefu(r) >> 32))[m
[31m-#else[m
[31m-#define hashgcref(t, r)		hashlohi((t), gcrefu(r), gcrefu(r) + HASH_BIAS)[m
[31m-#endif[m
[31m-[m
[31m-/* Hash an arbitrary key and return its anchor position in the hash table. */[m
[31m-static Node *hashkey(const GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  lua_assert(!tvisint(key));[m
[31m-  if (tvisstr(key))[m
[31m-    return hashstr(t, strV(key));[m
[31m-  else if (tvisnum(key))[m
[31m-    return hashnum(t, key);[m
[31m-  else if (tvisbool(key))[m
[31m-    return hashmask(t, boolV(key));[m
[31m-  else[m
[31m-    return hashgcref(t, key->gcr);[m
[31m-  /* Only hash 32 bits of lightuserdata on a 64 bit CPU. Good enough? */[m
[31m-}[m
[31m-[m
[31m-/* -- Table creation and destruction -------------------------------------- */[m
[31m-[m
[31m-/* Create new hash part for table. */[m
[31m-static LJ_AINLINE void newhpart(lua_State *L, GCtab *t, uint32_t hbits)[m
[31m-{[m
[31m-  uint32_t hsize;[m
[31m-  Node *node;[m
[31m-  lua_assert(hbits != 0);[m
[31m-  if (hbits > LJ_MAX_HBITS)[m
[31m-    lj_err_msg(L, LJ_ERR_TABOV);[m
[31m-  hsize = 1u << hbits;[m
[31m-  node = lj_mem_newvec(L, hsize, Node);[m
[31m-  setmref(t->node, node);[m
[31m-  setfreetop(t, node, &node[hsize]);[m
[31m-  t->hmask = hsize-1;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** Q: Why all of these copies of t->hmask, t->node etc. to local variables?[m
[31m-** A: Because alias analysis for C is _really_ tough.[m
[31m-**    Even state-of-the-art C compilers won't produce good code without this.[m
[31m-*/[m
[31m-[m
[31m-/* Clear hash part of table. */[m
[31m-static LJ_AINLINE void clearhpart(GCtab *t)[m
[31m-{[m
[31m-  uint32_t i, hmask = t->hmask;[m
[31m-  Node *node = noderef(t->node);[m
[31m-  lua_assert(t->hmask != 0);[m
[31m-  for (i = 0; i <= hmask; i++) {[m
[31m-    Node *n = &node[i];[m
[31m-    setmref(n->next, NULL);[m
[31m-    setnilV(&n->key);[m
[31m-    setnilV(&n->val);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Clear array part of table. */[m
[31m-static LJ_AINLINE void clearapart(GCtab *t)[m
[31m-{[m
[31m-  uint32_t i, asize = t->asize;[m
[31m-  TValue *array = tvref(t->array);[m
[31m-  for (i = 0; i < asize; i++)[m
[31m-    setnilV(&array[i]);[m
[31m-}[m
[31m-[m
[31m-/* Create a new table. Note: the slots are not initialized (yet). */[m
[31m-static GCtab *newtab(lua_State *L, uint32_t asize, uint32_t hbits)[m
[31m-{[m
[31m-  GCtab *t;[m
[31m-  /* First try to colocate the array part. */[m
[31m-  if (LJ_MAX_COLOSIZE != 0 && asize > 0 && asize <= LJ_MAX_COLOSIZE) {[m
[31m-    Node *nilnode;[m
[31m-    lua_assert((sizeof(GCtab) & 7) == 0);[m
[31m-    t = (GCtab *)lj_mem_newgco(L, sizetabcolo(asize));[m
[31m-    t->gct = ~LJ_TTAB;[m
[31m-    t->nomm = (uint8_t)~0;[m
[31m-    t->colo = (int8_t)asize;[m
[31m-    setmref(t->array, (TValue *)((char *)t + sizeof(GCtab)));[m
[31m-    setgcrefnull(t->metatable);[m
[31m-    t->asize = asize;[m
[31m-    t->hmask = 0;[m
[31m-    nilnode = &G(L)->nilnode;[m
[31m-    setmref(t->node, nilnode);[m
[31m-#if LJ_GC64[m
[31m-    setmref(t->freetop, nilnode);[m
[31m-#endif[m
[31m-  } else {  /* Otherwise separately allocate the array part. */[m
[31m-    Node *nilnode;[m
[31m-    t = lj_mem_newobj(L, GCtab);[m
[31m-    t->gct = ~LJ_TTAB;[m
[31m-    t->nomm = (uint8_t)~0;[m
[31m-    t->colo = 0;[m
[31m-    setmref(t->array, NULL);[m
[31m-    setgcrefnull(t->metatable);[m
[31m-    t->asize = 0;  /* In case the array allocation fails. */[m
[31m-    t->hmask = 0;[m
[31m-    nilnode = &G(L)->nilnode;[m
[31m-    setmref(t->node, nilnode);[m
[31m-#if LJ_GC64[m
[31m-    setmref(t->freetop, nilnode);[m
[31m-#endif[m
[31m-    if (asize > 0) {[m
[31m-      if (asize > LJ_MAX_ASIZE)[m
[31m-	lj_err_msg(L, LJ_ERR_TABOV);[m
[31m-      setmref(t->array, lj_mem_newvec(L, asize, TValue));[m
[31m-      t->asize = asize;[m
[31m-    }[m
[31m-  }[m
[31m-  if (hbits)[m
[31m-    newhpart(L, t, hbits);[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* Create a new table.[m
[31m-**[m
[31m-** IMPORTANT NOTE: The API differs from lua_createtable()![m
[31m-**[m
[31m-** The array size is non-inclusive. E.g. asize=128 creates array slots[m
[31m-** for 0..127, but not for 128. If you need slots 1..128, pass asize=129[m
[31m-** (slot 0 is wasted in this case).[m
[31m-**[m
[31m-** The hash size is given in hash bits. hbits=0 means no hash part.[m
[31m-** hbits=1 creates 2 hash slots, hbits=2 creates 4 hash slots and so on.[m
[31m-*/[m
[31m-GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits)[m
[31m-{[m
[31m-  GCtab *t = newtab(L, asize, hbits);[m
[31m-  clearapart(t);[m
[31m-  if (t->hmask > 0) clearhpart(t);[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* The API of this function conforms to lua_createtable(). */[m
[31m-GCtab *lj_tab_new_ah(lua_State *L, int32_t a, int32_t h)[m
[31m-{[m
[31m-  return lj_tab_new(L, (uint32_t)(a > 0 ? a+1 : 0), hsize2hbits(h));[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize)[m
[31m-{[m
[31m-  GCtab *t = newtab(L, ahsize & 0xffffff, ahsize >> 24);[m
[31m-  clearapart(t);[m
[31m-  if (t->hmask > 0) clearhpart(t);[m
[31m-  return t;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Duplicate a table. */[m
[31m-GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt)[m
[31m-{[m
[31m-  GCtab *t;[m
[31m-  uint32_t asize, hmask;[m
[31m-  t = newtab(L, kt->asize, kt->hmask > 0 ? lj_fls(kt->hmask)+1 : 0);[m
[31m-  lua_assert(kt->asize == t->asize && kt->hmask == t->hmask);[m
[31m-  t->nomm = 0;  /* Keys with metamethod names may be present. */[m
[31m-  asize = kt->asize;[m
[31m-  if (asize > 0) {[m
[31m-    TValue *array = tvref(t->array);[m
[31m-    TValue *karray = tvref(kt->array);[m
[31m-    if (asize < 64) {  /* An inlined loop beats memcpy for < 512 bytes. */[m
[31m-      uint32_t i;[m
[31m-      for (i = 0; i < asize; i++)[m
[31m-	copyTV(L, &array[i], &karray[i]);[m
[31m-    } else {[m
[31m-      memcpy(array, karray, asize*sizeof(TValue));[m
[31m-    }[m
[31m-  }[m
[31m-  hmask = kt->hmask;[m
[31m-  if (hmask > 0) {[m
[31m-    uint32_t i;[m
[31m-    Node *node = noderef(t->node);[m
[31m-    Node *knode = noderef(kt->node);[m
[31m-    ptrdiff_t d = (char *)node - (char *)knode;[m
[31m-    setfreetop(t, node, (Node *)((char *)getfreetop(kt, knode) + d));[m
[31m-    for (i = 0; i <= hmask; i++) {[m
[31m-      Node *kn = &knode[i];[m
[31m-      Node *n = &node[i];[m
[31m-      Node *next = nextnode(kn);[m
[31m-      /* Don't use copyTV here, since it asserts on a copy of a dead key. */[m
[31m-      n->val = kn->val; n->key = kn->key;[m
[31m-      setmref(n->next, next == NULL? next : (Node *)((char *)next + d));[m
[31m-    }[m
[31m-  }[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-/* Clear a table. */[m
[31m-void LJ_FASTCALL lj_tab_clear(GCtab *t)[m
[31m-{[m
[31m-  clearapart(t);[m
[31m-  if (t->hmask > 0) {[m
[31m-    Node *node = noderef(t->node);[m
[31m-    setfreetop(t, node, &node[t->hmask+1]);[m
[31m-    clearhpart(t);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Free a table. */[m
[31m-void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t)[m
[31m-{[m
[31m-  if (t->hmask > 0)[m
[31m-    lj_mem_freevec(g, noderef(t->node), t->hmask+1, Node);[m
[31m-  if (t->asize > 0 && LJ_MAX_COLOSIZE != 0 && t->colo <= 0)[m
[31m-    lj_mem_freevec(g, tvref(t->array), t->asize, TValue);[m
[31m-  if (LJ_MAX_COLOSIZE != 0 && t->colo)[m
[31m-    lj_mem_free(g, t, sizetabcolo((uint32_t)t->colo & 0x7f));[m
[31m-  else[m
[31m-    lj_mem_freet(g, t);[m
[31m-}[m
[31m-[m
[31m-/* -- Table resizing ------------------------------------------------------ */[m
[31m-[m
[31m-/* Resize a table to fit the new array/hash part sizes. */[m
[31m-void lj_tab_resize(lua_State *L, GCtab *t, uint32_t asize, uint32_t hbits)[m
[31m-{[m
[31m-  Node *oldnode = noderef(t->node);[m
[31m-  uint32_t oldasize = t->asize;[m
[31m-  uint32_t oldhmask = t->hmask;[m
[31m-  if (asize > oldasize) {  /* Array part grows? */[m
[31m-    TValue *array;[m
[31m-    uint32_t i;[m
[31m-    if (asize > LJ_MAX_ASIZE)[m
[31m-      lj_err_msg(L, LJ_ERR_TABOV);[m
[31m-    if (LJ_MAX_COLOSIZE != 0 && t->colo > 0) {[m
[31m-      /* A colocated array must be separated and copied. */[m
[31m-      TValue *oarray = tvref(t->array);[m
[31m-      array = lj_mem_newvec(L, asize, TValue);[m
[31m-      t->colo = (int8_t)(t->colo | 0x80);  /* Mark as separated (colo < 0). */[m
[31m-      for (i = 0; i < oldasize; i++)[m
[31m-	copyTV(L, &array[i], &oarray[i]);[m
[31m-    } else {[m
[31m-      array = (TValue *)lj_mem_realloc(L, tvref(t->array),[m
[31m-			  oldasize*sizeof(TValue), asize*sizeof(TValue));[m
[31m-    }[m
[31m-    setmref(t->array, array);[m
[31m-    t->asize = asize;[m
[31m-    for (i = oldasize; i < asize; i++)  /* Clear newly allocated slots. */[m
[31m-      setnilV(&array[i]);[m
[31m-  }[m
[31m-  /* Create new (empty) hash part. */[m
[31m-  if (hbits) {[m
[31m-    newhpart(L, t, hbits);[m
[31m-    clearhpart(t);[m
[31m-  } else {[m
[31m-    global_State *g = G(L);[m
[31m-    setmref(t->node, &g->nilnode);[m
[31m-#if LJ_GC64[m
[31m-    setmref(t->freetop, &g->nilnode);[m
[31m-#endif[m
[31m-    t->hmask = 0;[m
[31m-  }[m
[31m-  if (asize < oldasize) {  /* Array part shrinks? */[m
[31m-    TValue *array = tvref(t->array);[m
[31m-    uint32_t i;[m
[31m-    t->asize = asize;  /* Note: This 'shrinks' even colocated arrays. */[m
[31m-    for (i = asize; i < oldasize; i++)  /* Reinsert old array values. */[m
[31m-      if (!tvisnil(&array[i]))[m
[31m-	copyTV(L, lj_tab_setinth(L, t, (int32_t)i), &array[i]);[m
[31m-    /* Physically shrink only separated arrays. */[m
[31m-    if (LJ_MAX_COLOSIZE != 0 && t->colo <= 0)[m
[31m-      setmref(t->array, lj_mem_realloc(L, array,[m
[31m-	      oldasize*sizeof(TValue), asize*sizeof(TValue)));[m
[31m-  }[m
[31m-  if (oldhmask > 0) {  /* Reinsert pairs from old hash part. */[m
[31m-    global_State *g;[m
[31m-    uint32_t i;[m
[31m-    for (i = 0; i <= oldhmask; i++) {[m
[31m-      Node *n = &oldnode[i];[m
[31m-      if (!tvisnil(&n->val))[m
[31m-	copyTV(L, lj_tab_set(L, t, &n->key), &n->val);[m
[31m-    }[m
[31m-    g = G(L);[m
[31m-    lj_mem_freevec(g, oldnode, oldhmask+1, Node);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static uint32_t countint(cTValue *key, uint32_t *bins)[m
[31m-{[m
[31m-  lua_assert(!tvisint(key));[m
[31m-  if (tvisnum(key)) {[m
[31m-    lua_Number nk = numV(key);[m
[31m-    int32_t k = lj_num2int(nk);[m
[31m-    if ((uint32_t)k < LJ_MAX_ASIZE && nk == (lua_Number)k) {[m
[31m-      bins[(k > 2 ? lj_fls((uint32_t)(k-1)) : 0)]++;[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static uint32_t countarray(const GCtab *t, uint32_t *bins)[m
[31m-{[m
[31m-  uint32_t na, b, i;[m
[31m-  if (t->asize == 0) return 0;[m
[31m-  for (na = i = b = 0; b < LJ_MAX_ABITS; b++) {[m
[31m-    uint32_t n, top = 2u << b;[m
[31m-    TValue *array;[m
[31m-    if (top >= t->asize) {[m
[31m-      top = t->asize-1;[m
[31m-      if (i > top)[m
[31m-	break;[m
[31m-    }[m
[31m-    array = tvref(t->array);[m
[31m-    for (n = 0; i <= top; i++)[m
[31m-      if (!tvisnil(&array[i]))[m
[31m-	n++;[m
[31m-    bins[b] += n;[m
[31m-    na += n;[m
[31m-  }[m
[31m-  return na;[m
[31m-}[m
[31m-[m
[31m-static uint32_t counthash(const GCtab *t, uint32_t *bins, uint32_t *narray)[m
[31m-{[m
[31m-  uint32_t total, na, i, hmask = t->hmask;[m
[31m-  Node *node = noderef(t->node);[m
[31m-  for (total = na = 0, i = 0; i <= hmask; i++) {[m
[31m-    Node *n = &node[i];[m
[31m-    if (!tvisnil(&n->val)) {[m
[31m-      na += countint(&n->key, bins);[m
[31m-      total++;[m
[31m-    }[m
[31m-  }[m
[31m-  *narray += na;[m
[31m-  return total;[m
[31m-}[m
[31m-[m
[31m-static uint32_t bestasize(uint32_t bins[], uint32_t *narray)[m
[31m-{[m
[31m-  uint32_t b, sum, na = 0, sz = 0, nn = *narray;[m
[31m-  for (b = 0, sum = 0; 2*nn > (1u<<b) && sum != nn; b++)[m
[31m-    if (bins[b] > 0 && 2*(sum += bins[b]) > (1u<<b)) {[m
[31m-      sz = (2u<<b)+1;[m
[31m-      na = sum;[m
[31m-    }[m
[31m-  *narray = sz;[m
[31m-  return na;[m
[31m-}[m
[31m-[m
[31m-static void rehashtab(lua_State *L, GCtab *t, cTValue *ek)[m
[31m-{[m
[31m-  uint32_t bins[LJ_MAX_ABITS];[m
[31m-  uint32_t total, asize, na, i;[m
[31m-  for (i = 0; i < LJ_MAX_ABITS; i++) bins[i] = 0;[m
[31m-  asize = countarray(t, bins);[m
[31m-  total = 1 + asize;[m
[31m-  total += counthash(t, bins, &asize);[m
[31m-  asize += countint(ek, bins);[m
[31m-  na = bestasize(bins, &asize);[m
[31m-  total -= na;[m
[31m-  lj_tab_resize(L, t, asize, hsize2hbits(total));[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-void lj_tab_rehash(lua_State *L, GCtab *t)[m
[31m-{[m
[31m-  rehashtab(L, t, niltv(L));[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize)[m
[31m-{[m
[31m-  lj_tab_resize(L, t, nasize+1, t->hmask > 0 ? lj_fls(t->hmask)+1 : 0);[m
[31m-}[m
[31m-[m
[31m-/* -- Table getters ------------------------------------------------------- */[m
[31m-[m
[31m-cTValue * LJ_FASTCALL lj_tab_getinth(GCtab *t, int32_t key)[m
[31m-{[m
[31m-  TValue k;[m
[31m-  Node *n;[m
[31m-  k.n = (lua_Number)key;[m
[31m-  n = hashnum(t, &k);[m
[31m-  do {[m
[31m-    if (tvisnum(&n->key) && n->key.n == k.n)[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-cTValue *lj_tab_getstr(GCtab *t, GCstr *key)[m
[31m-{[m
[31m-  Node *n = hashstr(t, key);[m
[31m-  do {[m
[31m-    if (tvisstr(&n->key) && strV(&n->key) == key)[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-cTValue *lj_tab_get(lua_State *L, GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  if (tvisstr(key)) {[m
[31m-    cTValue *tv = lj_tab_getstr(t, strV(key));[m
[31m-    if (tv)[m
[31m-      return tv;[m
[31m-  } else if (tvisint(key)) {[m
[31m-    cTValue *tv = lj_tab_getint(t, intV(key));[m
[31m-    if (tv)[m
[31m-      return tv;[m
[31m-  } else if (tvisnum(key)) {[m
[31m-    lua_Number nk = numV(key);[m
[31m-    int32_t k = lj_num2int(nk);[m
[31m-    if (nk == (lua_Number)k) {[m
[31m-      cTValue *tv = lj_tab_getint(t, k);[m
[31m-      if (tv)[m
[31m-	return tv;[m
[31m-    } else {[m
[31m-      goto genlookup;  /* Else use the generic lookup. */[m
[31m-    }[m
[31m-  } else if (!tvisnil(key)) {[m
[31m-    Node *n;[m
[31m-  genlookup:[m
[31m-    n = hashkey(t, key);[m
[31m-    do {[m
[31m-      if (lj_obj_equal(&n->key, key))[m
[31m-	return &n->val;[m
[31m-    } while ((n = nextnode(n)));[m
[31m-  }[m
[31m-  return niltv(L);[m
[31m-}[m
[31m-[m
[31m-/* -- Table setters ------------------------------------------------------- */[m
[31m-[m
[31m-/* Insert new key. Use Brent's variation to optimize the chain length. */[m
[31m-TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  Node *n = hashkey(t, key);[m
[31m-  if (!tvisnil(&n->val) || t->hmask == 0) {[m
[31m-    Node *nodebase = noderef(t->node);[m
[31m-    Node *collide, *freenode = getfreetop(t, nodebase);[m
[31m-    lua_assert(freenode >= nodebase && freenode <= nodebase+t->hmask+1);[m
[31m-    do {[m
[31m-      if (freenode == nodebase) {  /* No free node found? */[m
[31m-	rehashtab(L, t, key);  /* Rehash table. */[m
[31m-	return lj_tab_set(L, t, key);  /* Retry key insertion. */[m
[31m-      }[m
[31m-    } while (!tvisnil(&(--freenode)->key));[m
[31m-    setfreetop(t, nodebase, freenode);[m
[31m-    lua_assert(freenode != &G(L)->nilnode);[m
[31m-    collide = hashkey(t, &n->key);[m
[31m-    if (collide != n) {  /* Colliding node not the main node? */[m
[31m-      while (noderef(collide->next) != n)  /* Find predecessor. */[m
[31m-	collide = nextnode(collide);[m
[31m-      setmref(collide->next, freenode);  /* Relink chain. */[m
[31m-      /* Copy colliding node into free node and free main node. */[m
[31m-      freenode->val = n->val;[m
[31m-      freenode->key = n->key;[m
[31m-      freenode->next = n->next;[m
[31m-      setmref(n->next, NULL);[m
[31m-      setnilV(&n->val);[m
[31m-      /* Rechain pseudo-resurrected string keys with colliding hashes. */[m
[31m-      while (nextnode(freenode)) {[m
[31m-	Node *nn = nextnode(freenode);[m
[31m-	if (tvisstr(&nn->key) && !tvisnil(&nn->val) &&[m
[31m-	    hashstr(t, strV(&nn->key)) == n) {[m
[31m-	  freenode->next = nn->next;[m
[31m-	  nn->next = n->next;[m
[31m-	  setmref(n->next, nn);[m
[31m-	} else {[m
[31m-	  freenode = nn;[m
[31m-	}[m
[31m-      }[m
[31m-    } else {  /* Otherwise use free node. */[m
[31m-      setmrefr(freenode->next, n->next);  /* Insert into chain. */[m
[31m-      setmref(n->next, freenode);[m
[31m-      n = freenode;[m
[31m-    }[m
[31m-  }[m
[31m-  n->key.u64 = key->u64;[m
[31m-  if (LJ_UNLIKELY(tvismzero(&n->key)))[m
[31m-    n->key.u64 = 0;[m
[31m-  lj_gc_anybarriert(L, t);[m
[31m-  lua_assert(tvisnil(&n->val));[m
[31m-  return &n->val;[m
[31m-}[m
[31m-[m
[31m-TValue *lj_tab_setinth(lua_State *L, GCtab *t, int32_t key)[m
[31m-{[m
[31m-  TValue k;[m
[31m-  Node *n;[m
[31m-  k.n = (lua_Number)key;[m
[31m-  n = hashnum(t, &k);[m
[31m-  do {[m
[31m-    if (tvisnum(&n->key) && n->key.n == k.n)[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  return lj_tab_newkey(L, t, &k);[m
[31m-}[m
[31m-[m
[31m-TValue *lj_tab_setstr(lua_State *L, GCtab *t, GCstr *key)[m
[31m-{[m
[31m-  TValue k;[m
[31m-  Node *n = hashstr(t, key);[m
[31m-  do {[m
[31m-    if (tvisstr(&n->key) && strV(&n->key) == key)[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  setstrV(L, &k, key);[m
[31m-  return lj_tab_newkey(L, t, &k);[m
[31m-}[m
[31m-[m
[31m-TValue *lj_tab_set(lua_State *L, GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  Node *n;[m
[31m-  t->nomm = 0;  /* Invalidate negative metamethod cache. */[m
[31m-  if (tvisstr(key)) {[m
[31m-    return lj_tab_setstr(L, t, strV(key));[m
[31m-  } else if (tvisint(key)) {[m
[31m-    return lj_tab_setint(L, t, intV(key));[m
[31m-  } else if (tvisnum(key)) {[m
[31m-    lua_Number nk = numV(key);[m
[31m-    int32_t k = lj_num2int(nk);[m
[31m-    if (nk == (lua_Number)k)[m
[31m-      return lj_tab_setint(L, t, k);[m
[31m-    if (tvisnan(key))[m
[31m-      lj_err_msg(L, LJ_ERR_NANIDX);[m
[31m-    /* Else use the generic lookup. */[m
[31m-  } else if (tvisnil(key)) {[m
[31m-    lj_err_msg(L, LJ_ERR_NILIDX);[m
[31m-  }[m
[31m-  n = hashkey(t, key);[m
[31m-  do {[m
[31m-    if (lj_obj_equal(&n->key, key))[m
[31m-      return &n->val;[m
[31m-  } while ((n = nextnode(n)));[m
[31m-  return lj_tab_newkey(L, t, key);[m
[31m-}[m
[31m-[m
[31m-/* -- Table traversal ----------------------------------------------------- */[m
[31m-[m
[31m-/* Get the traversal index of a key. */[m
[31m-static uint32_t keyindex(lua_State *L, GCtab *t, cTValue *key)[m
[31m-{[m
[31m-  TValue tmp;[m
[31m-  if (tvisint(key)) {[m
[31m-    int32_t k = intV(key);[m
[31m-    if ((uint32_t)k < t->asize)[m
[31m-      return (uint32_t)k;  /* Array key indexes: [0..t->asize-1] */[m
[31m-    setnumV(&tmp, (lua_Number)k);[m
[31m-    key = &tmp;[m
[31m-  } else if (tvisnum(key)) {[m
[31m-    lua_Number nk = numV(key);[m
[31m-    int32_t k = lj_num2int(nk);[m
[31m-    if ((uint32_t)k < t->asize && nk == (lua_Number)k)[m
[31m-      return (uint32_t)k;  /* Array key indexes: [0..t->asize-1] */[m
[31m-  }[m
[31m-  if (!tvisnil(key)) {[m
[31m-    Node *n = hashkey(t, key);[m
[31m-    do {[m
[31m-      if (lj_obj_equal(&n->key, key))[m
[31m-	return t->asize + (uint32_t)(n - noderef(t->node));[m
[31m-	/* Hash key indexes: [t->asize..t->asize+t->nmask] */[m
[31m-    } while ((n = nextnode(n)));[m
[31m-    if (key->u32.hi == 0xfffe7fff)  /* ITERN was despecialized while running. */[m
[31m-      return key->u32.lo - 1;[m
[31m-    lj_err_msg(L, LJ_ERR_NEXTIDX);[m
[31m-    return 0;  /* unreachable */[m
[31m-  }[m
[31m-  return ~0u;  /* A nil key starts the traversal. */[m
[31m-}[m
[31m-[m
[31m-/* Advance to the next step in a table traversal. */[m
[31m-int lj_tab_next(lua_State *L, GCtab *t, TValue *key)[m
[31m-{[m
[31m-  uint32_t i = keyindex(L, t, key);  /* Find predecessor key index. */[m
[31m-  for (i++; i < t->asize; i++)  /* First traverse the array keys. */[m
[31m-    if (!tvisnil(arrayslot(t, i))) {[m
[31m-      setintV(key, i);[m
[31m-      copyTV(L, key+1, arrayslot(t, i));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  for (i -= t->asize; i <= t->hmask; i++) {  /* Then traverse the hash keys. */[m
[31m-    Node *n = &noderef(t->node)[i];[m
[31m-    if (!tvisnil(&n->val)) {[m
[31m-      copyTV(L, key, &n->key);[m
[31m-      copyTV(L, key+1, &n->val);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* End of traversal. */[m
[31m-}[m
[31m-[m
[31m-/* -- Table length calculation -------------------------------------------- */[m
[31m-[m
[31m-static MSize unbound_search(GCtab *t, MSize j)[m
[31m-{[m
[31m-  cTValue *tv;[m
[31m-  MSize i = j;  /* i is zero or a present index */[m
[31m-  j++;[m
[31m-  /* find `i' and `j' such that i is present and j is not */[m
[31m-  while ((tv = lj_tab_getint(t, (int32_t)j)) && !tvisnil(tv)) {[m
[31m-    i = j;[m
[31m-    j *= 2;[m
[31m-    if (j > (MSize)(INT_MAX-2)) {  /* overflow? */[m
[31m-      /* table was built with bad purposes: resort to linear search */[m
[31m-      i = 1;[m
[31m-      while ((tv = lj_tab_getint(t, (int32_t)i)) && !tvisnil(tv)) i++;[m
[31m-      return i - 1;[m
[31m-    }[m
[31m-  }[m
[31m-  /* now do a binary search between them */[m
[31m-  while (j - i > 1) {[m
[31m-    MSize m = (i+j)/2;[m
[31m-    cTValue *tvb = lj_tab_getint(t, (int32_t)m);[m
[31m-    if (tvb && !tvisnil(tvb)) i = m; else j = m;[m
[31m-  }[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** Try to find a boundary in table `t'. A `boundary' is an integer index[m
[31m-** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).[m
[31m-*/[m
[31m-MSize LJ_FASTCALL lj_tab_len(GCtab *t)[m
[31m-{[m
[31m-  MSize j = (MSize)t->asize;[m
[31m-  if (j > 1 && tvisnil(arrayslot(t, j-1))) {[m
[31m-    MSize i = 1;[m
[31m-    while (j - i > 1) {[m
[31m-      MSize m = (i+j)/2;[m
[31m-      if (tvisnil(arrayslot(t, m-1))) j = m; else i = m;[m
[31m-    }[m
[31m-    return i-1;[m
[31m-  }[m
[31m-  if (j) j--;[m
[31m-  if (t->hmask <= 0)[m
[31m-    return j;[m
[31m-  return unbound_search(t, j);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_tab.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_tab.h[m
[1mdeleted file mode 100644[m
[1mindex f06fcf6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_tab.h[m
[1m+++ /dev/null[m
[36m@@ -1,73 +0,0 @@[m
[31m-/*[m
[31m-** Table handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TAB_H[m
[31m-#define _LJ_TAB_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Hash constants. Tuned using a brute force search. */[m
[31m-#define HASH_BIAS	(-0x04c11db7)[m
[31m-#define HASH_ROT1	14[m
[31m-#define HASH_ROT2	5[m
[31m-#define HASH_ROT3	13[m
[31m-[m
[31m-/* Scramble the bits of numbers and pointers. */[m
[31m-static LJ_AINLINE uint32_t hashrot(uint32_t lo, uint32_t hi)[m
[31m-{[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-  /* Prefer variant that compiles well for a 2-operand CPU. */[m
[31m-  lo ^= hi; hi = lj_rol(hi, HASH_ROT1);[m
[31m-  lo -= hi; hi = lj_rol(hi, HASH_ROT2);[m
[31m-  hi ^= lo; hi -= lj_rol(lo, HASH_ROT3);[m
[31m-#else[m
[31m-  lo ^= hi;[m
[31m-  lo = lo - lj_rol(hi, HASH_ROT1);[m
[31m-  hi = lo ^ lj_rol(hi, HASH_ROT1 + HASH_ROT2);[m
[31m-  hi = hi - lj_rol(lo, HASH_ROT3);[m
[31m-#endif[m
[31m-  return hi;[m
[31m-}[m
[31m-[m
[31m-#define hsize2hbits(s)	((s) ? ((s)==1 ? 1 : 1+lj_fls((uint32_t)((s)-1))) : 0)[m
[31m-[m
[31m-LJ_FUNCA GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits);[m
[31m-LJ_FUNC GCtab *lj_tab_new_ah(lua_State *L, int32_t a, int32_t h);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize);[m
[31m-#endif[m
[31m-LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_tab_clear(GCtab *t);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t);[m
[31m-#if LJ_HASFFI[m
[31m-LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t);[m
[31m-#endif[m
[31m-LJ_FUNC void lj_tab_resize(lua_State *L, GCtab *t, uint32_t asize, uint32_t hbits);[m
[31m-LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize);[m
[31m-[m
[31m-/* Caveat: all getters except lj_tab_get() can return NULL! */[m
[31m-[m
[31m-LJ_FUNCA cTValue * LJ_FASTCALL lj_tab_getinth(GCtab *t, int32_t key);[m
[31m-LJ_FUNC cTValue *lj_tab_getstr(GCtab *t, GCstr *key);[m
[31m-LJ_FUNCA cTValue *lj_tab_get(lua_State *L, GCtab *t, cTValue *key);[m
[31m-[m
[31m-/* Caveat: all setters require a write barrier for the stored value. */[m
[31m-[m
[31m-LJ_FUNCA TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key);[m
[31m-LJ_FUNCA TValue *lj_tab_setinth(lua_State *L, GCtab *t, int32_t key);[m
[31m-LJ_FUNC TValue *lj_tab_setstr(lua_State *L, GCtab *t, GCstr *key);[m
[31m-LJ_FUNC TValue *lj_tab_set(lua_State *L, GCtab *t, cTValue *key);[m
[31m-[m
[31m-#define inarray(t, key)		((MSize)(key) < (MSize)(t)->asize)[m
[31m-#define arrayslot(t, i)		(&tvref((t)->array)[(i)])[m
[31m-#define lj_tab_getint(t, key) \[m
[31m-  (inarray((t), (key)) ? arrayslot((t), (key)) : lj_tab_getinth((t), (key)))[m
[31m-#define lj_tab_setint(L, t, key) \[m
[31m-  (inarray((t), (key)) ? arrayslot((t), (key)) : lj_tab_setinth(L, (t), (key)))[m
[31m-[m
[31m-LJ_FUNCA int lj_tab_next(lua_State *L, GCtab *t, TValue *key);[m
[31m-LJ_FUNCA MSize LJ_FASTCALL lj_tab_len(GCtab *t);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target.h[m
[1mdeleted file mode 100644[m
[1mindex abea8d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target.h[m
[1m+++ /dev/null[m
[36m@@ -1,164 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for target CPU.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_H[m
[31m-#define _LJ_TARGET_H[m
[31m-[m
[31m-#include "lj_def.h"[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-/* -- Registers and spill slots ------------------------------------------- */[m
[31m-[m
[31m-/* Register type (uint8_t in ir->r). */[m
[31m-typedef uint32_t Reg;[m
[31m-[m
[31m-/* The hi-bit is NOT set for an allocated register. This means the value[m
[31m-** can be directly used without masking. The hi-bit is set for a register[m
[31m-** allocation hint or for RID_INIT, RID_SINK or RID_SUNK.[m
[31m-*/[m
[31m-#define RID_NONE		0x80[m
[31m-#define RID_MASK		0x7f[m
[31m-#define RID_INIT		(RID_NONE|RID_MASK)[m
[31m-#define RID_SINK		(RID_INIT-1)[m
[31m-#define RID_SUNK		(RID_INIT-2)[m
[31m-[m
[31m-#define ra_noreg(r)		((r) & RID_NONE)[m
[31m-#define ra_hasreg(r)		(!((r) & RID_NONE))[m
[31m-[m
[31m-/* The ra_hashint() macro assumes a previous test for ra_noreg(). */[m
[31m-#define ra_hashint(r)		((r) < RID_SUNK)[m
[31m-#define ra_gethint(r)		((Reg)((r) & RID_MASK))[m
[31m-#define ra_sethint(rr, r)	rr = (uint8_t)((r)|RID_NONE)[m
[31m-#define ra_samehint(r1, r2)	(ra_gethint((r1)^(r2)) == 0)[m
[31m-[m
[31m-/* Spill slot 0 means no spill slot has been allocated. */[m
[31m-#define SPS_NONE		0[m
[31m-[m
[31m-#define ra_hasspill(s)		((s) != SPS_NONE)[m
[31m-[m
[31m-/* Combined register and spill slot (uint16_t in ir->prev). */[m
[31m-typedef uint32_t RegSP;[m
[31m-[m
[31m-#define REGSP(r, s)		((r) + ((s) << 8))[m
[31m-#define REGSP_HINT(r)		((r)|RID_NONE)[m
[31m-#define REGSP_INIT		REGSP(RID_INIT, 0)[m
[31m-[m
[31m-#define regsp_reg(rs)		((rs) & 255)[m
[31m-#define regsp_spill(rs)		((rs) >> 8)[m
[31m-#define regsp_used(rs) \[m
[31m-  (((rs) & ~REGSP(RID_MASK, 0)) != REGSP(RID_NONE, 0))[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Bitset for registers. 32 registers suffice for most architectures.[m
[31m-** Note that one set holds bits for both GPRs and FPRs.[m
[31m-*/[m
[31m-#if LJ_TARGET_PPC || LJ_TARGET_MIPS[m
[31m-typedef uint64_t RegSet;[m
[31m-#else[m
[31m-typedef uint32_t RegSet;[m
[31m-#endif[m
[31m-[m
[31m-#define RID2RSET(r)		(((RegSet)1) << (r))[m
[31m-#define RSET_EMPTY		((RegSet)0)[m
[31m-#define RSET_RANGE(lo, hi)	((RID2RSET((hi)-(lo))-1) << (lo))[m
[31m-[m
[31m-#define rset_test(rs, r)	((int)((rs) >> (r)) & 1)[m
[31m-#define rset_set(rs, r)		(rs |= RID2RSET(r))[m
[31m-#define rset_clear(rs, r)	(rs &= ~RID2RSET(r))[m
[31m-#define rset_exclude(rs, r)	(rs & ~RID2RSET(r))[m
[31m-#if LJ_TARGET_PPC || LJ_TARGET_MIPS[m
[31m-#define rset_picktop(rs)	((Reg)(__builtin_clzll(rs)^63))[m
[31m-#define rset_pickbot(rs)	((Reg)__builtin_ctzll(rs))[m
[31m-#else[m
[31m-#define rset_picktop(rs)	((Reg)lj_fls(rs))[m
[31m-#define rset_pickbot(rs)	((Reg)lj_ffs(rs))[m
[31m-#endif[m
[31m-[m
[31m-/* -- Register allocation cost -------------------------------------------- */[m
[31m-[m
[31m-/* The register allocation heuristic keeps track of the cost for allocating[m
[31m-** a specific register:[m
[31m-**[m
[31m-** A free register (obviously) has a cost of 0 and a 1-bit in the free mask.[m
[31m-**[m
[31m-** An already allocated register has the (non-zero) IR reference in the lowest[m
[31m-** bits and the result of a blended cost-model in the higher bits.[m
[31m-**[m
[31m-** The allocator first checks the free mask for a hit. Otherwise an (unrolled)[m
[31m-** linear search for the minimum cost is used. The search doesn't need to[m
[31m-** keep track of the position of the minimum, which makes it very fast.[m
[31m-** The lowest bits of the minimum cost show the desired IR reference whose[m
[31m-** register is the one to evict.[m
[31m-**[m
[31m-** Without the cost-model this degenerates to the standard heuristics for[m
[31m-** (reverse) linear-scan register allocation. Since code generation is done[m
[31m-** in reverse, a live interval extends from the last use to the first def.[m
[31m-** For an SSA IR the IR reference is the first (and only) def and thus[m
[31m-** trivially marks the end of the interval. The LSRA heuristics says to pick[m
[31m-** the register whose live interval has the furthest extent, i.e. the lowest[m
[31m-** IR reference in our case.[m
[31m-**[m
[31m-** A cost-model should take into account other factors, like spill-cost and[m
[31m-** restore- or rematerialization-cost, which depend on the kind of instruction.[m
[31m-** E.g. constants have zero spill costs, variant instructions have higher[m
[31m-** costs than invariants and PHIs should preferably never be spilled.[m
[31m-**[m
[31m-** Here's a first cut at simple, but effective blended cost-model for R-LSRA:[m
[31m-** - Due to careful design of the IR, constants already have lower IR[m
[31m-**   references than invariants and invariants have lower IR references[m
[31m-**   than variants.[m
[31m-** - The cost in the upper 16 bits is the sum of the IR reference and a[m
[31m-**   weighted score. The score currently only takes into account whether[m
[31m-**   the IRT_ISPHI bit is set in the instruction type.[m
[31m-** - The PHI weight is the minimum distance (in IR instructions) a PHI[m
[31m-**   reference has to be further apart from a non-PHI reference to be spilled.[m
[31m-** - It should be a power of two (for speed) and must be between 2 and 32768.[m
[31m-**   Good values for the PHI weight seem to be between 40 and 150.[m
[31m-** - Further study is required.[m
[31m-*/[m
[31m-#define REGCOST_PHI_WEIGHT	64[m
[31m-[m
[31m-/* Cost for allocating a specific register. */[m
[31m-typedef uint32_t RegCost;[m
[31m-[m
[31m-/* Note: assumes 16 bit IRRef1. */[m
[31m-#define REGCOST(cost, ref)	((RegCost)(ref) + ((RegCost)(cost) << 16))[m
[31m-#define regcost_ref(rc)		((IRRef1)(rc))[m
[31m-[m
[31m-#define REGCOST_T(t) \[m
[31m-  ((RegCost)((t)&IRT_ISPHI) * (((RegCost)(REGCOST_PHI_WEIGHT)<<16)/IRT_ISPHI))[m
[31m-#define REGCOST_REF_T(ref, t)	(REGCOST((ref), (ref)) + REGCOST_T((t)))[m
[31m-[m
[31m-/* -- Target-specific definitions ----------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-#include "lj_target_x86.h"[m
[31m-#elif LJ_TARGET_ARM[m
[31m-#include "lj_target_arm.h"[m
[31m-#elif LJ_TARGET_ARM64[m
[31m-#include "lj_target_arm64.h"[m
[31m-#elif LJ_TARGET_PPC[m
[31m-#include "lj_target_ppc.h"[m
[31m-#elif LJ_TARGET_MIPS[m
[31m-#include "lj_target_mips.h"[m
[31m-#else[m
[31m-#error "Missing include for target CPU"[m
[31m-#endif[m
[31m-[m
[31m-#ifdef EXITSTUBS_PER_GROUP[m
[31m-/* Return the address of an exit stub. */[m
[31m-static LJ_AINLINE char *exitstub_addr_(char **group, uint32_t exitno)[m
[31m-{[m
[31m-  lua_assert(group[exitno / EXITSTUBS_PER_GROUP] != NULL);[m
[31m-  return (char *)group[exitno / EXITSTUBS_PER_GROUP] +[m
[31m-	 EXITSTUB_SPACING*(exitno % EXITSTUBS_PER_GROUP);[m
[31m-}[m
[31m-/* Avoid dependence on lj_jit.h if only including lj_target.h. */[m
[31m-#define exitstub_addr(J, exitno) \[m
[31m-  ((MCode *)exitstub_addr_((char **)((J)->exitstubgroup), (exitno)))[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_arm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_arm.h[m
[1mdeleted file mode 100644[m
[1mindex 36959db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_arm.h[m
[1m+++ /dev/null[m
[36m@@ -1,270 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for ARM CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_ARM_H[m
[31m-#define _LJ_TARGET_ARM_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#define GPRDEF(_) \[m
[31m-  _(R0) _(R1) _(R2) _(R3) _(R4) _(R5) _(R6) _(R7) \[m
[31m-  _(R8) _(R9) _(R10) _(R11) _(R12) _(SP) _(LR) _(PC)[m
[31m-#if LJ_SOFTFP[m
[31m-#define FPRDEF(_)[m
[31m-#else[m
[31m-#define FPRDEF(_) \[m
[31m-  _(D0) _(D1) _(D2) _(D3) _(D4) _(D5) _(D6) _(D7) \[m
[31m-  _(D8) _(D9) _(D10) _(D11) _(D12) _(D13) _(D14) _(D15)[m
[31m-#endif[m
[31m-#define VRIDDEF(_)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_TMP = RID_LR,[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_RET = RID_R0,[m
[31m-  RID_RETLO = RID_R0,[m
[31m-  RID_RETHI = RID_R1,[m
[31m-#if LJ_SOFTFP[m
[31m-  RID_FPRET = RID_R0,[m
[31m-#else[m
[31m-  RID_FPRET = RID_D0,[m
[31m-#endif[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_R9,		/* Interpreter BASE. */[m
[31m-  RID_LPC = RID_R6,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_R7,	/* Interpreter DISPATCH table. */[m
[31m-  RID_LREG = RID_R8,		/* Interpreter L. */[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_R0,[m
[31m-  RID_MAX_GPR = RID_PC+1,[m
[31m-  RID_MIN_FPR = RID_MAX_GPR,[m
[31m-#if LJ_SOFTFP[m
[31m-  RID_MAX_FPR = RID_MIN_FPR,[m
[31m-#else[m
[31m-  RID_MAX_FPR = RID_D15+1,[m
[31m-#endif[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR[m
[31m-};[m
[31m-[m
[31m-#define RID_NUM_KREF		RID_NUM_GPR[m
[31m-#define RID_MIN_KREF		RID_R0[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except sp, lr and pc. */[m
[31m-#define RSET_GPR		(RSET_RANGE(RID_MIN_GPR, RID_R12+1))[m
[31m-#define RSET_GPREVEN \[m
[31m-  (RID2RSET(RID_R0)|RID2RSET(RID_R2)|RID2RSET(RID_R4)|RID2RSET(RID_R6)| \[m
[31m-   RID2RSET(RID_R8)|RID2RSET(RID_R10))[m
[31m-#define RSET_GPRODD \[m
[31m-  (RID2RSET(RID_R1)|RID2RSET(RID_R3)|RID2RSET(RID_R5)|RID2RSET(RID_R7)| \[m
[31m-   RID2RSET(RID_R9)|RID2RSET(RID_R11))[m
[31m-#if LJ_SOFTFP[m
[31m-#define RSET_FPR		0[m
[31m-#else[m
[31m-#define RSET_FPR		(RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR))[m
[31m-#endif[m
[31m-#define RSET_ALL		(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT		RSET_ALL[m
[31m-[m
[31m-/* ABI-specific register sets. lr is an implicit scratch register. */[m
[31m-#define RSET_SCRATCH_GPR_	(RSET_RANGE(RID_R0, RID_R3+1)|RID2RSET(RID_R12))[m
[31m-#ifdef __APPLE__[m
[31m-#define RSET_SCRATCH_GPR	(RSET_SCRATCH_GPR_|RID2RSET(RID_R9))[m
[31m-#else[m
[31m-#define RSET_SCRATCH_GPR	RSET_SCRATCH_GPR_[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-#define RSET_SCRATCH_FPR	0[m
[31m-#else[m
[31m-#define RSET_SCRATCH_FPR	(RSET_RANGE(RID_D0, RID_D7+1))[m
[31m-#endif[m
[31m-#define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)[m
[31m-#define REGARG_FIRSTGPR		RID_R0[m
[31m-#define REGARG_LASTGPR		RID_R3[m
[31m-#define REGARG_NUMGPR		4[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-#define REGARG_FIRSTFPR		0[m
[31m-#define REGARG_LASTFPR		0[m
[31m-#define REGARG_NUMFPR		0[m
[31m-#else[m
[31m-#define REGARG_FIRSTFPR		RID_D0[m
[31m-#define REGARG_LASTFPR		RID_D7[m
[31m-#define REGARG_NUMFPR		8[m
[31m-#endif[m
[31m-[m
[31m-/* -- Spill slots --------------------------------------------------------- */[m
[31m-[m
[31m-/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.[m
[31m-**[m
[31m-** SPS_FIXED: Available fixed spill slots in interpreter frame.[m
[31m-** This definition must match with the *.dasc file(s).[m
[31m-**[m
[31m-** SPS_FIRST: First spill slot for general use. Reserve min. two 32 bit slots.[m
[31m-*/[m
[31m-#define SPS_FIXED	2[m
[31m-#define SPS_FIRST	2[m
[31m-[m
[31m-#define SPOFS_TMP	0[m
[31m-[m
[31m-#define sps_scale(slot)		(4 * (int32_t)(slot))[m
[31m-#define sps_align(slot)		(((slot) - SPS_FIXED + 1) & ~1)[m
[31m-[m
[31m-/* -- Exit state ---------------------------------------------------------- */[m
[31m-[m
[31m-/* This definition must match with the *.dasc file(s). */[m
[31m-typedef struct {[m
[31m-#if !LJ_SOFTFP[m
[31m-  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */[m
[31m-#endif[m
[31m-  int32_t gpr[RID_NUM_GPR];	/* General-purpose registers. */[m
[31m-  int32_t spill[256];		/* Spill slots. */[m
[31m-} ExitState;[m
[31m-[m
[31m-/* PC after instruction that caused an exit. Used to find the trace number. */[m
[31m-#define EXITSTATE_PCREG		RID_PC[m
[31m-/* Highest exit + 1 indicates stack check. */[m
[31m-#define EXITSTATE_CHECKEXIT	1[m
[31m-[m
[31m-#define EXITSTUB_SPACING        4[m
[31m-#define EXITSTUBS_PER_GROUP     32[m
[31m-[m
[31m-/* -- Instructions -------------------------------------------------------- */[m
[31m-[m
[31m-/* Instruction fields. */[m
[31m-#define ARMF_CC(ai, cc)	(((ai) ^ ARMI_CCAL) | ((cc) << 28))[m
[31m-#define ARMF_N(r)	((r) << 16)[m
[31m-#define ARMF_D(r)	((r) << 12)[m
[31m-#define ARMF_S(r)	((r) << 8)[m
[31m-#define ARMF_M(r)	(r)[m
[31m-#define ARMF_SH(sh, n)	(((sh) << 5) | ((n) << 7))[m
[31m-#define ARMF_RSH(sh, r)	(0x10 | ((sh) << 5) | ARMF_S(r))[m
[31m-[m
[31m-typedef enum ARMIns {[m
[31m-  ARMI_CCAL = 0xe0000000,[m
[31m-  ARMI_S = 0x000100000,[m
[31m-  ARMI_K12 = 0x02000000,[m
[31m-  ARMI_KNEG = 0x00200000,[m
[31m-  ARMI_LS_W = 0x00200000,[m
[31m-  ARMI_LS_U = 0x00800000,[m
[31m-  ARMI_LS_P = 0x01000000,[m
[31m-  ARMI_LS_R = 0x02000000,[m
[31m-  ARMI_LSX_I = 0x00400000,[m
[31m-[m
[31m-  ARMI_AND = 0xe0000000,[m
[31m-  ARMI_EOR = 0xe0200000,[m
[31m-  ARMI_SUB = 0xe0400000,[m
[31m-  ARMI_RSB = 0xe0600000,[m
[31m-  ARMI_ADD = 0xe0800000,[m
[31m-  ARMI_ADC = 0xe0a00000,[m
[31m-  ARMI_SBC = 0xe0c00000,[m
[31m-  ARMI_RSC = 0xe0e00000,[m
[31m-  ARMI_TST = 0xe1100000,[m
[31m-  ARMI_TEQ = 0xe1300000,[m
[31m-  ARMI_CMP = 0xe1500000,[m
[31m-  ARMI_CMN = 0xe1700000,[m
[31m-  ARMI_ORR = 0xe1800000,[m
[31m-  ARMI_MOV = 0xe1a00000,[m
[31m-  ARMI_BIC = 0xe1c00000,[m
[31m-  ARMI_MVN = 0xe1e00000,[m
[31m-[m
[31m-  ARMI_NOP = 0xe1a00000,[m
[31m-[m
[31m-  ARMI_MUL = 0xe0000090,[m
[31m-  ARMI_SMULL = 0xe0c00090,[m
[31m-[m
[31m-  ARMI_LDR = 0xe4100000,[m
[31m-  ARMI_LDRB = 0xe4500000,[m
[31m-  ARMI_LDRH = 0xe01000b0,[m
[31m-  ARMI_LDRSB = 0xe01000d0,[m
[31m-  ARMI_LDRSH = 0xe01000f0,[m
[31m-  ARMI_LDRD = 0xe00000d0,[m
[31m-  ARMI_STR = 0xe4000000,[m
[31m-  ARMI_STRB = 0xe4400000,[m
[31m-  ARMI_STRH = 0xe00000b0,[m
[31m-  ARMI_STRD = 0xe00000f0,[m
[31m-  ARMI_PUSH = 0xe92d0000,[m
[31m-[m
[31m-  ARMI_B = 0xea000000,[m
[31m-  ARMI_BL = 0xeb000000,[m
[31m-  ARMI_BLX = 0xfa000000,[m
[31m-  ARMI_BLXr = 0xe12fff30,[m
[31m-[m
[31m-  /* ARMv6 */[m
[31m-  ARMI_REV = 0xe6bf0f30,[m
[31m-  ARMI_SXTB = 0xe6af0070,[m
[31m-  ARMI_SXTH = 0xe6bf0070,[m
[31m-  ARMI_UXTB = 0xe6ef0070,[m
[31m-  ARMI_UXTH = 0xe6ff0070,[m
[31m-[m
[31m-  /* ARMv6T2 */[m
[31m-  ARMI_MOVW = 0xe3000000,[m
[31m-  ARMI_MOVT = 0xe3400000,[m
[31m-[m
[31m-  /* VFP */[m
[31m-  ARMI_VMOV_D = 0xeeb00b40,[m
[31m-  ARMI_VMOV_S = 0xeeb00a40,[m
[31m-  ARMI_VMOVI_D = 0xeeb00b00,[m
[31m-[m
[31m-  ARMI_VMOV_R_S = 0xee100a10,[m
[31m-  ARMI_VMOV_S_R = 0xee000a10,[m
[31m-  ARMI_VMOV_RR_D = 0xec500b10,[m
[31m-  ARMI_VMOV_D_RR = 0xec400b10,[m
[31m-[m
[31m-  ARMI_VADD_D = 0xee300b00,[m
[31m-  ARMI_VSUB_D = 0xee300b40,[m
[31m-  ARMI_VMUL_D = 0xee200b00,[m
[31m-  ARMI_VMLA_D = 0xee000b00,[m
[31m-  ARMI_VMLS_D = 0xee000b40,[m
[31m-  ARMI_VNMLS_D = 0xee100b00,[m
[31m-  ARMI_VDIV_D = 0xee800b00,[m
[31m-[m
[31m-  ARMI_VABS_D = 0xeeb00bc0,[m
[31m-  ARMI_VNEG_D = 0xeeb10b40,[m
[31m-  ARMI_VSQRT_D = 0xeeb10bc0,[m
[31m-[m
[31m-  ARMI_VCMP_D = 0xeeb40b40,[m
[31m-  ARMI_VCMPZ_D = 0xeeb50b40,[m
[31m-[m
[31m-  ARMI_VMRS = 0xeef1fa10,[m
[31m-[m
[31m-  ARMI_VCVT_S32_F32 = 0xeebd0ac0,[m
[31m-  ARMI_VCVT_S32_F64 = 0xeebd0bc0,[m
[31m-  ARMI_VCVT_U32_F32 = 0xeebc0ac0,[m
[31m-  ARMI_VCVT_U32_F64 = 0xeebc0bc0,[m
[31m-  ARMI_VCVT_F32_S32 = 0xeeb80ac0,[m
[31m-  ARMI_VCVT_F64_S32 = 0xeeb80bc0,[m
[31m-  ARMI_VCVT_F32_U32 = 0xeeb80a40,[m
[31m-  ARMI_VCVT_F64_U32 = 0xeeb80b40,[m
[31m-  ARMI_VCVT_F32_F64 = 0xeeb70bc0,[m
[31m-  ARMI_VCVT_F64_F32 = 0xeeb70ac0,[m
[31m-[m
[31m-  ARMI_VLDR_S = 0xed100a00,[m
[31m-  ARMI_VLDR_D = 0xed100b00,[m
[31m-  ARMI_VSTR_S = 0xed000a00,[m
[31m-  ARMI_VSTR_D = 0xed000b00,[m
[31m-} ARMIns;[m
[31m-[m
[31m-typedef enum ARMShift {[m
[31m-  ARMSH_LSL, ARMSH_LSR, ARMSH_ASR, ARMSH_ROR[m
[31m-} ARMShift;[m
[31m-[m
[31m-/* ARM condition codes. */[m
[31m-typedef enum ARMCC {[m
[31m-  CC_EQ, CC_NE, CC_CS, CC_CC, CC_MI, CC_PL, CC_VS, CC_VC,[m
[31m-  CC_HI, CC_LS, CC_GE, CC_LT, CC_GT, CC_LE, CC_AL,[m
[31m-  CC_HS = CC_CS, CC_LO = CC_CC[m
[31m-} ARMCC;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_arm64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_arm64.h[m
[1mdeleted file mode 100644[m
[1mindex 57ab134..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_arm64.h[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for ARM64 CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_ARM64_H[m
[31m-#define _LJ_TARGET_ARM64_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#define GPRDEF(_) \[m
[31m-  _(X0) _(X1) _(X2) _(X3) _(X4) _(X5) _(X6) _(X7) \[m
[31m-  _(X8) _(X9) _(X10) _(X11) _(X12) _(X13) _(X14) _(X15) \[m
[31m-  _(X16) _(X17) _(X18) _(X19) _(X20) _(X21) _(X22) _(X23) \[m
[31m-  _(X24) _(X25) _(X26) _(X27) _(X28) _(FP) _(LR) _(SP)[m
[31m-#define FPRDEF(_) \[m
[31m-  _(D0) _(D1) _(D2) _(D3) _(D4) _(D5) _(D6) _(D7) \[m
[31m-  _(D8) _(D9) _(D10) _(D11) _(D12) _(D13) _(D14) _(D15) \[m
[31m-  _(D16) _(D17) _(D18) _(D19) _(D20) _(D21) _(D22) _(D23) \[m
[31m-  _(D24) _(D25) _(D26) _(D27) _(D28) _(D29) _(D30) _(D31)[m
[31m-#define VRIDDEF(_)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_TMP = RID_LR,[m
[31m-  RID_ZERO = RID_SP,[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_RET = RID_X0,[m
[31m-  RID_FPRET = RID_D0,[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_X19,		/* Interpreter BASE. */[m
[31m-  RID_LPC = RID_X21,		/* Interpreter PC. */[m
[31m-  RID_GL = RID_X22,		/* Interpreter GL. */[m
[31m-  RID_LREG = RID_X23,		/* Interpreter L. */[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_X0,[m
[31m-  RID_MAX_GPR = RID_SP+1,[m
[31m-  RID_MIN_FPR = RID_MAX_GPR,[m
[31m-  RID_MAX_FPR = RID_D31+1,[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR[m
[31m-};[m
[31m-[m
[31m-#define RID_NUM_KREF		RID_NUM_GPR[m
[31m-#define RID_MIN_KREF		RID_X0[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except for x18, fp, lr and sp. */[m
[31m-#define RSET_FIXED \[m
[31m-  (RID2RSET(RID_X18)|RID2RSET(RID_FP)|RID2RSET(RID_LR)|RID2RSET(RID_SP))[m
[31m-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)[m
[31m-#define RSET_FPR	RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)[m
[31m-#define RSET_ALL	(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT	RSET_ALL[m
[31m-[m
[31m-/* lr is an implicit scratch register. */[m
[31m-#define RSET_SCRATCH_GPR	(RSET_RANGE(RID_X0, RID_X17+1))[m
[31m-#define RSET_SCRATCH_FPR \[m
[31m-  (RSET_RANGE(RID_D0, RID_D7+1)|RSET_RANGE(RID_D16, RID_D31+1))[m
[31m-#define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)[m
[31m-#define REGARG_FIRSTGPR		RID_X0[m
[31m-#define REGARG_LASTGPR		RID_X7[m
[31m-#define REGARG_NUMGPR		8[m
[31m-#define REGARG_FIRSTFPR		RID_D0[m
[31m-#define REGARG_LASTFPR		RID_D7[m
[31m-#define REGARG_NUMFPR		8[m
[31m-[m
[31m-/* -- Instructions -------------------------------------------------------- */[m
[31m-[m
[31m-/* Instruction fields. */[m
[31m-#define A64F_D(r)	(r)[m
[31m-#define A64F_N(r)       ((r) << 5)[m
[31m-#define A64F_A(r)       ((r) << 10)[m
[31m-#define A64F_M(r)       ((r) << 16)[m
[31m-#define A64F_U16(x)	((x) << 5)[m
[31m-#define A64F_S26(x)	(x)[m
[31m-#define A64F_S19(x)	((x) << 5)[m
[31m-[m
[31m-typedef enum A64Ins {[m
[31m-  A64I_MOVZw = 0x52800000,[m
[31m-  A64I_MOVZx = 0xd2800000,[m
[31m-  A64I_LDRLw = 0x18000000,[m
[31m-  A64I_LDRLx = 0x58000000,[m
[31m-  A64I_NOP = 0xd503201f,[m
[31m-  A64I_B = 0x14000000,[m
[31m-  A64I_BR = 0xd61f0000,[m
[31m-} A64Ins;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_mips.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_mips.h[m
[1mdeleted file mode 100644[m
[1mindex bafa817..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_mips.h[m
[1m+++ /dev/null[m
[36m@@ -1,288 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for MIPS CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_MIPS_H[m
[31m-#define _LJ_TARGET_MIPS_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#define GPRDEF(_) \[m
[31m-  _(R0) _(R1) _(R2) _(R3) _(R4) _(R5) _(R6) _(R7) \[m
[31m-  _(R8) _(R9) _(R10) _(R11) _(R12) _(R13) _(R14) _(R15) \[m
[31m-  _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \[m
[31m-  _(R24) _(R25) _(SYS1) _(SYS2) _(R28) _(SP) _(R30) _(RA)[m
[31m-#if LJ_SOFTFP[m
[31m-#define FPRDEF(_)[m
[31m-#else[m
[31m-#define FPRDEF(_) \[m
[31m-  _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \[m
[31m-  _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \[m
[31m-  _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \[m
[31m-  _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31)[m
[31m-#endif[m
[31m-#define VRIDDEF(_)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_ZERO = RID_R0,[m
[31m-  RID_TMP = RID_RA,[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_RET = RID_R2,[m
[31m-#if LJ_LE[m
[31m-  RID_RETHI = RID_R3,[m
[31m-  RID_RETLO = RID_R2,[m
[31m-#else[m
[31m-  RID_RETHI = RID_R2,[m
[31m-  RID_RETLO = RID_R3,[m
[31m-#endif[m
[31m-#if LJ_SOFTFP[m
[31m-  RID_FPRET = RID_R2,[m
[31m-#else[m
[31m-  RID_FPRET = RID_F0,[m
[31m-#endif[m
[31m-  RID_CFUNCADDR = RID_R25,[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_R16,		/* Interpreter BASE. */[m
[31m-  RID_LPC = RID_R18,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_R19,	/* Interpreter DISPATCH table. */[m
[31m-  RID_LREG = RID_R20,		/* Interpreter L. */[m
[31m-  RID_JGL = RID_R30,		/* On-trace: global_State + 32768. */[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_R0,[m
[31m-  RID_MAX_GPR = RID_RA+1,[m
[31m-  RID_MIN_FPR = RID_MAX_GPR,[m
[31m-#if LJ_SOFTFP[m
[31m-  RID_MAX_FPR = RID_MIN_FPR,[m
[31m-#else[m
[31m-  RID_MAX_FPR = RID_F31+1,[m
[31m-#endif[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR	/* Only even regs are used. */[m
[31m-};[m
[31m-[m
[31m-#define RID_NUM_KREF		RID_NUM_GPR[m
[31m-#define RID_MIN_KREF		RID_R0[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except ZERO, TMP, SP, SYS1, SYS2 and JGL. */[m
[31m-#define RSET_FIXED \[m
[31m-  (RID2RSET(RID_ZERO)|RID2RSET(RID_TMP)|RID2RSET(RID_SP)|\[m
[31m-   RID2RSET(RID_SYS1)|RID2RSET(RID_SYS2)|RID2RSET(RID_JGL))[m
[31m-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)[m
[31m-#if LJ_SOFTFP[m
[31m-#define RSET_FPR	0[m
[31m-#else[m
[31m-#define RSET_FPR \[m
[31m-  (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\[m
[31m-   RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\[m
[31m-   RID2RSET(RID_F16)|RID2RSET(RID_F18)|RID2RSET(RID_F20)|RID2RSET(RID_F22)|\[m
[31m-   RID2RSET(RID_F24)|RID2RSET(RID_F26)|RID2RSET(RID_F28)|RID2RSET(RID_F30))[m
[31m-#endif[m
[31m-#define RSET_ALL	(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT	RSET_ALL[m
[31m-[m
[31m-#define RSET_SCRATCH_GPR \[m
[31m-  (RSET_RANGE(RID_R1, RID_R15+1)|\[m
[31m-   RID2RSET(RID_R24)|RID2RSET(RID_R25)|RID2RSET(RID_R28))[m
[31m-#if LJ_SOFTFP[m
[31m-#define RSET_SCRATCH_FPR	0[m
[31m-#else[m
[31m-#define RSET_SCRATCH_FPR \[m
[31m-  (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\[m
[31m-   RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\[m
[31m-   RID2RSET(RID_F16)|RID2RSET(RID_F18))[m
[31m-#endif[m
[31m-#define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)[m
[31m-#define REGARG_FIRSTGPR		RID_R4[m
[31m-#define REGARG_LASTGPR		RID_R7[m
[31m-#define REGARG_NUMGPR		4[m
[31m-#if LJ_ABI_SOFTFP[m
[31m-#define REGARG_FIRSTFPR		0[m
[31m-#define REGARG_LASTFPR		0[m
[31m-#define REGARG_NUMFPR		0[m
[31m-#else[m
[31m-#define REGARG_FIRSTFPR		RID_F12[m
[31m-#define REGARG_LASTFPR		RID_F14[m
[31m-#define REGARG_NUMFPR		2[m
[31m-#endif[m
[31m-[m
[31m-/* -- Spill slots --------------------------------------------------------- */[m
[31m-[m
[31m-/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.[m
[31m-**[m
[31m-** SPS_FIXED: Available fixed spill slots in interpreter frame.[m
[31m-** This definition must match with the *.dasc file(s).[m
[31m-**[m
[31m-** SPS_FIRST: First spill slot for general use.[m
[31m-*/[m
[31m-#define SPS_FIXED	5[m
[31m-#define SPS_FIRST	4[m
[31m-[m
[31m-#define SPOFS_TMP	0[m
[31m-[m
[31m-#define sps_scale(slot)		(4 * (int32_t)(slot))[m
[31m-#define sps_align(slot)		(((slot) - SPS_FIXED + 1) & ~1)[m
[31m-[m
[31m-/* -- Exit state ---------------------------------------------------------- */[m
[31m-[m
[31m-/* This definition must match with the *.dasc file(s). */[m
[31m-typedef struct {[m
[31m-#if !LJ_SOFTFP[m
[31m-  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */[m
[31m-#endif[m
[31m-  int32_t gpr[RID_NUM_GPR];	/* General-purpose registers. */[m
[31m-  int32_t spill[256];		/* Spill slots. */[m
[31m-} ExitState;[m
[31m-[m
[31m-/* Highest exit + 1 indicates stack check. */[m
[31m-#define EXITSTATE_CHECKEXIT	1[m
[31m-[m
[31m-/* Return the address of a per-trace exit stub. */[m
[31m-static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p)[m
[31m-{[m
[31m-  while (*p == 0x00000000) p++;  /* Skip MIPSI_NOP. */[m
[31m-  return p;[m
[31m-}[m
[31m-/* Avoid dependence on lj_jit.h if only including lj_target.h. */[m
[31m-#define exitstub_trace_addr(T, exitno) \[m
[31m-  exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode))[m
[31m-[m
[31m-/* -- Instructions -------------------------------------------------------- */[m
[31m-[m
[31m-/* Instruction fields. */[m
[31m-#define MIPSF_S(r)	((r) << 21)[m
[31m-#define MIPSF_T(r)	((r) << 16)[m
[31m-#define MIPSF_D(r)	((r) << 11)[m
[31m-#define MIPSF_R(r)	((r) << 21)[m
[31m-#define MIPSF_H(r)	((r) << 16)[m
[31m-#define MIPSF_G(r)	((r) << 11)[m
[31m-#define MIPSF_F(r)	((r) << 6)[m
[31m-#define MIPSF_A(n)	((n) << 6)[m
[31m-#define MIPSF_M(n)	((n) << 11)[m
[31m-[m
[31m-typedef enum MIPSIns {[m
[31m-  /* Integer instructions. */[m
[31m-  MIPSI_MOVE = 0x00000021,[m
[31m-  MIPSI_NOP = 0x00000000,[m
[31m-[m
[31m-  MIPSI_LI = 0x24000000,[m
[31m-  MIPSI_LU = 0x34000000,[m
[31m-  MIPSI_LUI = 0x3c000000,[m
[31m-[m
[31m-  MIPSI_ADDIU = 0x24000000,[m
[31m-  MIPSI_ANDI = 0x30000000,[m
[31m-  MIPSI_ORI = 0x34000000,[m
[31m-  MIPSI_XORI = 0x38000000,[m
[31m-  MIPSI_SLTI = 0x28000000,[m
[31m-  MIPSI_SLTIU = 0x2c000000,[m
[31m-[m
[31m-  MIPSI_ADDU = 0x00000021,[m
[31m-  MIPSI_SUBU = 0x00000023,[m
[31m-  MIPSI_MUL = 0x70000002,[m
[31m-  MIPSI_AND = 0x00000024,[m
[31m-  MIPSI_OR = 0x00000025,[m
[31m-  MIPSI_XOR = 0x00000026,[m
[31m-  MIPSI_NOR = 0x00000027,[m
[31m-  MIPSI_SLT = 0x0000002a,[m
[31m-  MIPSI_SLTU = 0x0000002b,[m
[31m-  MIPSI_MOVZ = 0x0000000a,[m
[31m-  MIPSI_MOVN = 0x0000000b,[m
[31m-  MIPSI_MFHI = 0x00000010,[m
[31m-  MIPSI_MFLO = 0x00000012,[m
[31m-  MIPSI_MULT = 0x00000018,[m
[31m-[m
[31m-  MIPSI_SLL = 0x00000000,[m
[31m-  MIPSI_SRL = 0x00000002,[m
[31m-  MIPSI_SRA = 0x00000003,[m
[31m-  MIPSI_ROTR = 0x00200002,	/* MIPS32R2 */[m
[31m-  MIPSI_SLLV = 0x00000004,[m
[31m-  MIPSI_SRLV = 0x00000006,[m
[31m-  MIPSI_SRAV = 0x00000007,[m
[31m-  MIPSI_ROTRV = 0x00000046,	/* MIPS32R2 */[m
[31m-[m
[31m-  MIPSI_SEB = 0x7c000420,	/* MIPS32R2 */[m
[31m-  MIPSI_SEH = 0x7c000620,	/* MIPS32R2 */[m
[31m-  MIPSI_WSBH = 0x7c0000a0,	/* MIPS32R2 */[m
[31m-[m
[31m-  MIPSI_B = 0x10000000,[m
[31m-  MIPSI_J = 0x08000000,[m
[31m-  MIPSI_JAL = 0x0c000000,[m
[31m-  MIPSI_JR = 0x00000008,[m
[31m-  MIPSI_JALR = 0x0000f809,[m
[31m-[m
[31m-  MIPSI_BEQ = 0x10000000,[m
[31m-  MIPSI_BNE = 0x14000000,[m
[31m-  MIPSI_BLEZ = 0x18000000,[m
[31m-  MIPSI_BGTZ = 0x1c000000,[m
[31m-  MIPSI_BLTZ = 0x04000000,[m
[31m-  MIPSI_BGEZ = 0x04010000,[m
[31m-[m
[31m-  /* Load/store instructions. */[m
[31m-  MIPSI_LW = 0x8c000000,[m
[31m-  MIPSI_SW = 0xac000000,[m
[31m-  MIPSI_LB = 0x80000000,[m
[31m-  MIPSI_SB = 0xa0000000,[m
[31m-  MIPSI_LH = 0x84000000,[m
[31m-  MIPSI_SH = 0xa4000000,[m
[31m-  MIPSI_LBU = 0x90000000,[m
[31m-  MIPSI_LHU = 0x94000000,[m
[31m-  MIPSI_LWC1 = 0xc4000000,[m
[31m-  MIPSI_SWC1 = 0xe4000000,[m
[31m-  MIPSI_LDC1 = 0xd4000000,[m
[31m-  MIPSI_SDC1 = 0xf4000000,[m
[31m-[m
[31m-  /* FP instructions. */[m
[31m-  MIPSI_MOV_S = 0x46000006,[m
[31m-  MIPSI_MOV_D = 0x46200006,[m
[31m-  MIPSI_MOVT_D = 0x46210011,[m
[31m-  MIPSI_MOVF_D = 0x46200011,[m
[31m-[m
[31m-  MIPSI_ABS_D = 0x46200005,[m
[31m-  MIPSI_NEG_D = 0x46200007,[m
[31m-[m
[31m-  MIPSI_ADD_D = 0x46200000,[m
[31m-  MIPSI_SUB_D = 0x46200001,[m
[31m-  MIPSI_MUL_D = 0x46200002,[m
[31m-  MIPSI_DIV_D = 0x46200003,[m
[31m-  MIPSI_SQRT_D = 0x46200004,[m
[31m-[m
[31m-  MIPSI_ADD_S = 0x46000000,[m
[31m-  MIPSI_SUB_S = 0x46000001,[m
[31m-[m
[31m-  MIPSI_CVT_D_S = 0x46000021,[m
[31m-  MIPSI_CVT_W_S = 0x46000024,[m
[31m-  MIPSI_CVT_S_D = 0x46200020,[m
[31m-  MIPSI_CVT_W_D = 0x46200024,[m
[31m-  MIPSI_CVT_S_W = 0x46800020,[m
[31m-  MIPSI_CVT_D_W = 0x46800021,[m
[31m-[m
[31m-  MIPSI_TRUNC_W_S = 0x4600000d,[m
[31m-  MIPSI_TRUNC_W_D = 0x4620000d,[m
[31m-  MIPSI_FLOOR_W_S = 0x4600000f,[m
[31m-  MIPSI_FLOOR_W_D = 0x4620000f,[m
[31m-[m
[31m-  MIPSI_MFC1 = 0x44000000,[m
[31m-  MIPSI_MTC1 = 0x44800000,[m
[31m-[m
[31m-  MIPSI_BC1F = 0x45000000,[m
[31m-  MIPSI_BC1T = 0x45010000,[m
[31m-[m
[31m-  MIPSI_C_EQ_D = 0x46200032,[m
[31m-  MIPSI_C_OLT_D = 0x46200034,[m
[31m-  MIPSI_C_ULT_D = 0x46200035,[m
[31m-  MIPSI_C_OLE_D = 0x46200036,[m
[31m-  MIPSI_C_ULE_D = 0x46200037,[m
[31m-[m
[31m-} MIPSIns;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex bbf2239..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,280 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for PPC CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_PPC_H[m
[31m-#define _LJ_TARGET_PPC_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#define GPRDEF(_) \[m
[31m-  _(R0) _(SP) _(SYS1) _(R3) _(R4) _(R5) _(R6) _(R7) \[m
[31m-  _(R8) _(R9) _(R10) _(R11) _(R12) _(SYS2) _(R14) _(R15) \[m
[31m-  _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \[m
[31m-  _(R24) _(R25) _(R26) _(R27) _(R28) _(R29) _(R30) _(R31)[m
[31m-#define FPRDEF(_) \[m
[31m-  _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \[m
[31m-  _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \[m
[31m-  _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \[m
[31m-  _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31)[m
[31m-#define VRIDDEF(_)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_TMP = RID_R0,[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_RET = RID_R3,[m
[31m-  RID_RETHI = RID_R3,[m
[31m-  RID_RETLO = RID_R4,[m
[31m-  RID_FPRET = RID_F1,[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_R14,		/* Interpreter BASE. */[m
[31m-  RID_LPC = RID_R16,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_R17,	/* Interpreter DISPATCH table. */[m
[31m-  RID_LREG = RID_R18,		/* Interpreter L. */[m
[31m-  RID_JGL = RID_R31,		/* On-trace: global_State + 32768. */[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_R0,[m
[31m-  RID_MAX_GPR = RID_R31+1,[m
[31m-  RID_MIN_FPR = RID_F0,[m
[31m-  RID_MAX_FPR = RID_F31+1,[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR[m
[31m-};[m
[31m-[m
[31m-#define RID_NUM_KREF		RID_NUM_GPR[m
[31m-#define RID_MIN_KREF		RID_R0[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except TMP, SP, SYS1, SYS2 and JGL. */[m
[31m-#define RSET_FIXED \[m
[31m-  (RID2RSET(RID_TMP)|RID2RSET(RID_SP)|RID2RSET(RID_SYS1)|\[m
[31m-   RID2RSET(RID_SYS2)|RID2RSET(RID_JGL))[m
[31m-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED)[m
[31m-#define RSET_FPR	RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)[m
[31m-#define RSET_ALL	(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT	RSET_ALL[m
[31m-[m
[31m-#define RSET_SCRATCH_GPR	(RSET_RANGE(RID_R3, RID_R12+1))[m
[31m-#define RSET_SCRATCH_FPR	(RSET_RANGE(RID_F0, RID_F13+1))[m
[31m-#define RSET_SCRATCH		(RSET_SCRATCH_GPR|RSET_SCRATCH_FPR)[m
[31m-#define REGARG_FIRSTGPR		RID_R3[m
[31m-#define REGARG_LASTGPR		RID_R10[m
[31m-#define REGARG_NUMGPR		8[m
[31m-#define REGARG_FIRSTFPR		RID_F1[m
[31m-#define REGARG_LASTFPR		RID_F8[m
[31m-#define REGARG_NUMFPR		8[m
[31m-[m
[31m-/* -- Spill slots --------------------------------------------------------- */[m
[31m-[m
[31m-/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.[m
[31m-**[m
[31m-** SPS_FIXED: Available fixed spill slots in interpreter frame.[m
[31m-** This definition must match with the *.dasc file(s).[m
[31m-**[m
[31m-** SPS_FIRST: First spill slot for general use.[m
[31m-** [sp+12] tmplo word \[m
[31m-** [sp+ 8] tmphi word / tmp dword, parameter area for callee[m
[31m-** [sp+ 4] tmpw, LR of callee[m
[31m-** [sp+ 0] stack chain[m
[31m-*/[m
[31m-#define SPS_FIXED	7[m
[31m-#define SPS_FIRST	4[m
[31m-[m
[31m-/* Stack offsets for temporary slots. Used for FP<->int conversions etc. */[m
[31m-#define SPOFS_TMPW	4[m
[31m-#define SPOFS_TMP	8[m
[31m-#define SPOFS_TMPHI	8[m
[31m-#define SPOFS_TMPLO	12[m
[31m-[m
[31m-#define sps_scale(slot)		(4 * (int32_t)(slot))[m
[31m-#define sps_align(slot)		(((slot) - SPS_FIXED + 3) & ~3)[m
[31m-[m
[31m-/* -- Exit state ---------------------------------------------------------- */[m
[31m-[m
[31m-/* This definition must match with the *.dasc file(s). */[m
[31m-typedef struct {[m
[31m-  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */[m
[31m-  intptr_t gpr[RID_NUM_GPR];	/* General-purpose registers. */[m
[31m-  int32_t spill[256];		/* Spill slots. */[m
[31m-} ExitState;[m
[31m-[m
[31m-/* Highest exit + 1 indicates stack check. */[m
[31m-#define EXITSTATE_CHECKEXIT	1[m
[31m-[m
[31m-/* Return the address of a per-trace exit stub. */[m
[31m-static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno)[m
[31m-{[m
[31m-  while (*p == 0x60000000) p++;  /* Skip PPCI_NOP. */[m
[31m-  return p + 3 + exitno;[m
[31m-}[m
[31m-/* Avoid dependence on lj_jit.h if only including lj_target.h. */[m
[31m-#define exitstub_trace_addr(T, exitno) \[m
[31m-  exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode), (exitno))[m
[31m-[m
[31m-/* -- Instructions -------------------------------------------------------- */[m
[31m-[m
[31m-/* Instruction fields. */[m
[31m-#define PPCF_CC(cc)	((((cc) & 3) << 16) | (((cc) & 4) << 22))[m
[31m-#define PPCF_T(r)	((r) << 21)[m
[31m-#define PPCF_A(r)	((r) << 16)[m
[31m-#define PPCF_B(r)	((r) << 11)[m
[31m-#define PPCF_C(r)	((r) << 6)[m
[31m-#define PPCF_MB(n)	((n) << 6)[m
[31m-#define PPCF_ME(n)	((n) << 1)[m
[31m-#define PPCF_Y		0x00200000[m
[31m-#define PPCF_DOT	0x00000001[m
[31m-[m
[31m-typedef enum PPCIns {[m
[31m-  /* Integer instructions. */[m
[31m-  PPCI_MR = 0x7c000378,[m
[31m-  PPCI_NOP = 0x60000000,[m
[31m-[m
[31m-  PPCI_LI = 0x38000000,[m
[31m-  PPCI_LIS = 0x3c000000,[m
[31m-[m
[31m-  PPCI_ADD = 0x7c000214,[m
[31m-  PPCI_ADDC = 0x7c000014,[m
[31m-  PPCI_ADDO = 0x7c000614,[m
[31m-  PPCI_ADDE = 0x7c000114,[m
[31m-  PPCI_ADDZE = 0x7c000194,[m
[31m-  PPCI_ADDME = 0x7c0001d4,[m
[31m-  PPCI_ADDI = 0x38000000,[m
[31m-  PPCI_ADDIS = 0x3c000000,[m
[31m-  PPCI_ADDIC = 0x30000000,[m
[31m-  PPCI_ADDICDOT = 0x34000000,[m
[31m-[m
[31m-  PPCI_SUBF = 0x7c000050,[m
[31m-  PPCI_SUBFC = 0x7c000010,[m
[31m-  PPCI_SUBFO = 0x7c000450,[m
[31m-  PPCI_SUBFE = 0x7c000110,[m
[31m-  PPCI_SUBFZE = 0x7c000190,[m
[31m-  PPCI_SUBFME = 0x7c0001d0,[m
[31m-  PPCI_SUBFIC = 0x20000000,[m
[31m-[m
[31m-  PPCI_NEG = 0x7c0000d0,[m
[31m-[m
[31m-  PPCI_AND = 0x7c000038,[m
[31m-  PPCI_ANDC = 0x7c000078,[m
[31m-  PPCI_NAND = 0x7c0003b8,[m
[31m-  PPCI_ANDIDOT = 0x70000000,[m
[31m-  PPCI_ANDISDOT = 0x74000000,[m
[31m-[m
[31m-  PPCI_OR = 0x7c000378,[m
[31m-  PPCI_NOR = 0x7c0000f8,[m
[31m-  PPCI_ORI = 0x60000000,[m
[31m-  PPCI_ORIS = 0x64000000,[m
[31m-[m
[31m-  PPCI_XOR = 0x7c000278,[m
[31m-  PPCI_EQV = 0x7c000238,[m
[31m-  PPCI_XORI = 0x68000000,[m
[31m-  PPCI_XORIS = 0x6c000000,[m
[31m-[m
[31m-  PPCI_CMPW = 0x7c000000,[m
[31m-  PPCI_CMPLW = 0x7c000040,[m
[31m-  PPCI_CMPWI = 0x2c000000,[m
[31m-  PPCI_CMPLWI = 0x28000000,[m
[31m-[m
[31m-  PPCI_MULLW = 0x7c0001d6,[m
[31m-  PPCI_MULLI = 0x1c000000,[m
[31m-  PPCI_MULLWO = 0x7c0005d6,[m
[31m-[m
[31m-  PPCI_EXTSB = 0x7c000774,[m
[31m-  PPCI_EXTSH = 0x7c000734,[m
[31m-[m
[31m-  PPCI_SLW = 0x7c000030,[m
[31m-  PPCI_SRW = 0x7c000430,[m
[31m-  PPCI_SRAW = 0x7c000630,[m
[31m-  PPCI_SRAWI = 0x7c000670,[m
[31m-[m
[31m-  PPCI_RLWNM = 0x5c000000,[m
[31m-  PPCI_RLWINM = 0x54000000,[m
[31m-  PPCI_RLWIMI = 0x50000000,[m
[31m-[m
[31m-  PPCI_B = 0x48000000,[m
[31m-  PPCI_BL = 0x48000001,[m
[31m-  PPCI_BC = 0x40800000,[m
[31m-  PPCI_BCL = 0x40800001,[m
[31m-  PPCI_BCTR = 0x4e800420,[m
[31m-  PPCI_BCTRL = 0x4e800421,[m
[31m-[m
[31m-  PPCI_CRANDC = 0x4c000102,[m
[31m-  PPCI_CRXOR = 0x4c000182,[m
[31m-  PPCI_CRAND = 0x4c000202,[m
[31m-  PPCI_CREQV = 0x4c000242,[m
[31m-  PPCI_CRORC = 0x4c000342,[m
[31m-  PPCI_CROR = 0x4c000382,[m
[31m-[m
[31m-  PPCI_MFLR = 0x7c0802a6,[m
[31m-  PPCI_MTCTR = 0x7c0903a6,[m
[31m-[m
[31m-  PPCI_MCRXR = 0x7c000400,[m
[31m-[m
[31m-  /* Load/store instructions. */[m
[31m-  PPCI_LWZ = 0x80000000,[m
[31m-  PPCI_LBZ = 0x88000000,[m
[31m-  PPCI_STW = 0x90000000,[m
[31m-  PPCI_STB = 0x98000000,[m
[31m-  PPCI_LHZ = 0xa0000000,[m
[31m-  PPCI_LHA = 0xa8000000,[m
[31m-  PPCI_STH = 0xb0000000,[m
[31m-[m
[31m-  PPCI_STWU = 0x94000000,[m
[31m-[m
[31m-  PPCI_LFS = 0xc0000000,[m
[31m-  PPCI_LFD = 0xc8000000,[m
[31m-  PPCI_STFS = 0xd0000000,[m
[31m-  PPCI_STFD = 0xd8000000,[m
[31m-[m
[31m-  PPCI_LWZX = 0x7c00002e,[m
[31m-  PPCI_LBZX = 0x7c0000ae,[m
[31m-  PPCI_STWX = 0x7c00012e,[m
[31m-  PPCI_STBX = 0x7c0001ae,[m
[31m-  PPCI_LHZX = 0x7c00022e,[m
[31m-  PPCI_LHAX = 0x7c0002ae,[m
[31m-  PPCI_STHX = 0x7c00032e,[m
[31m-[m
[31m-  PPCI_LWBRX = 0x7c00042c,[m
[31m-  PPCI_STWBRX = 0x7c00052c,[m
[31m-[m
[31m-  PPCI_LFSX = 0x7c00042e,[m
[31m-  PPCI_LFDX = 0x7c0004ae,[m
[31m-  PPCI_STFSX = 0x7c00052e,[m
[31m-  PPCI_STFDX = 0x7c0005ae,[m
[31m-[m
[31m-  /* FP instructions. */[m
[31m-  PPCI_FMR = 0xfc000090,[m
[31m-  PPCI_FNEG = 0xfc000050,[m
[31m-  PPCI_FABS = 0xfc000210,[m
[31m-[m
[31m-  PPCI_FRSP = 0xfc000018,[m
[31m-  PPCI_FCTIWZ = 0xfc00001e,[m
[31m-[m
[31m-  PPCI_FADD = 0xfc00002a,[m
[31m-  PPCI_FSUB = 0xfc000028,[m
[31m-  PPCI_FMUL = 0xfc000032,[m
[31m-  PPCI_FDIV = 0xfc000024,[m
[31m-  PPCI_FSQRT = 0xfc00002c,[m
[31m-[m
[31m-  PPCI_FMADD = 0xfc00003a,[m
[31m-  PPCI_FMSUB = 0xfc000038,[m
[31m-  PPCI_FNMSUB = 0xfc00003c,[m
[31m-[m
[31m-  PPCI_FCMPU = 0xfc000000,[m
[31m-  PPCI_FSEL = 0xfc00002e,[m
[31m-} PPCIns;[m
[31m-[m
[31m-typedef enum PPCCC {[m
[31m-  CC_GE, CC_LE, CC_NE, CC_NS, CC_LT, CC_GT, CC_EQ, CC_SO[m
[31m-} PPCCC;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_x86.h[m
[1mdeleted file mode 100644[m
[1mindex e29f474..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_target_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,356 +0,0 @@[m
[31m-/*[m
[31m-** Definitions for x86 and x64 CPUs.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TARGET_X86_H[m
[31m-#define _LJ_TARGET_X86_H[m
[31m-[m
[31m-/* -- Registers IDs ------------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_64[m
[31m-#define GPRDEF(_) \[m
[31m-  _(EAX) _(ECX) _(EDX) _(EBX) _(ESP) _(EBP) _(ESI) _(EDI) \[m
[31m-  _(R8D) _(R9D) _(R10D) _(R11D) _(R12D) _(R13D) _(R14D) _(R15D)[m
[31m-#define FPRDEF(_) \[m
[31m-  _(XMM0) _(XMM1) _(XMM2) _(XMM3) _(XMM4) _(XMM5) _(XMM6) _(XMM7) \[m
[31m-  _(XMM8) _(XMM9) _(XMM10) _(XMM11) _(XMM12) _(XMM13) _(XMM14) _(XMM15)[m
[31m-#else[m
[31m-#define GPRDEF(_) \[m
[31m-  _(EAX) _(ECX) _(EDX) _(EBX) _(ESP) _(EBP) _(ESI) _(EDI)[m
[31m-#define FPRDEF(_) \[m
[31m-  _(XMM0) _(XMM1) _(XMM2) _(XMM3) _(XMM4) _(XMM5) _(XMM6) _(XMM7)[m
[31m-#endif[m
[31m-#define VRIDDEF(_) \[m
[31m-  _(MRM)[m
[31m-[m
[31m-#define RIDENUM(name)	RID_##name,[m
[31m-[m
[31m-enum {[m
[31m-  GPRDEF(RIDENUM)		/* General-purpose registers (GPRs). */[m
[31m-  FPRDEF(RIDENUM)		/* Floating-point registers (FPRs). */[m
[31m-  RID_MAX,[m
[31m-  RID_MRM = RID_MAX,		/* Pseudo-id for ModRM operand. */[m
[31m-[m
[31m-  /* Calling conventions. */[m
[31m-  RID_SP = RID_ESP,[m
[31m-  RID_RET = RID_EAX,[m
[31m-#if LJ_64[m
[31m-  RID_FPRET = RID_XMM0,[m
[31m-#else[m
[31m-  RID_RETLO = RID_EAX,[m
[31m-  RID_RETHI = RID_EDX,[m
[31m-#endif[m
[31m-[m
[31m-  /* These definitions must match with the *.dasc file(s): */[m
[31m-  RID_BASE = RID_EDX,		/* Interpreter BASE. */[m
[31m-#if LJ_64 && !LJ_ABI_WIN[m
[31m-  RID_LPC = RID_EBX,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_R14D,	/* Interpreter DISPATCH table. */[m
[31m-#else[m
[31m-  RID_LPC = RID_ESI,		/* Interpreter PC. */[m
[31m-  RID_DISPATCH = RID_EBX,	/* Interpreter DISPATCH table. */[m
[31m-#endif[m
[31m-[m
[31m-  /* Register ranges [min, max) and number of registers. */[m
[31m-  RID_MIN_GPR = RID_EAX,[m
[31m-  RID_MIN_FPR = RID_XMM0,[m
[31m-  RID_MAX_GPR = RID_MIN_FPR,[m
[31m-  RID_MAX_FPR = RID_MAX,[m
[31m-  RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR,[m
[31m-  RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR,[m
[31m-};[m
[31m-[m
[31m-/* -- Register sets ------------------------------------------------------- */[m
[31m-[m
[31m-/* Make use of all registers, except the stack pointer. */[m
[31m-#define RSET_GPR	(RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR)-RID2RSET(RID_ESP))[m
[31m-#define RSET_FPR	(RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR))[m
[31m-#define RSET_ALL	(RSET_GPR|RSET_FPR)[m
[31m-#define RSET_INIT	RSET_ALL[m
[31m-[m
[31m-#if LJ_64[m
[31m-/* Note: this requires the use of FORCE_REX! */[m
[31m-#define RSET_GPR8	RSET_GPR[m
[31m-#else[m
[31m-#define RSET_GPR8	(RSET_RANGE(RID_EAX, RID_EBX+1))[m
[31m-#endif[m
[31m-[m
[31m-/* ABI-specific register sets. */[m
[31m-#define RSET_ACD	(RID2RSET(RID_EAX)|RID2RSET(RID_ECX)|RID2RSET(RID_EDX))[m
[31m-#if LJ_64[m
[31m-#if LJ_ABI_WIN[m
[31m-/* Windows x64 ABI. */[m
[31m-#define RSET_SCRATCH \[m
[31m-  (RSET_ACD|RSET_RANGE(RID_R8D, RID_R11D+1)|RSET_RANGE(RID_XMM0, RID_XMM5+1))[m
[31m-#define REGARG_GPRS \[m
[31m-  (RID_ECX|((RID_EDX|((RID_R8D|(RID_R9D<<5))<<5))<<5))[m
[31m-#define REGARG_NUMGPR	4[m
[31m-#define REGARG_NUMFPR	4[m
[31m-#define REGARG_FIRSTFPR	RID_XMM0[m
[31m-#define REGARG_LASTFPR	RID_XMM3[m
[31m-#define STACKARG_OFS	(4*8)[m
[31m-#else[m
[31m-/* The rest of the civilized x64 world has a common ABI. */[m
[31m-#define RSET_SCRATCH \[m
[31m-  (RSET_ACD|RSET_RANGE(RID_ESI, RID_R11D+1)|RSET_FPR)[m
[31m-#define REGARG_GPRS \[m
[31m-  (RID_EDI|((RID_ESI|((RID_EDX|((RID_ECX|((RID_R8D|(RID_R9D \[m
[31m-   <<5))<<5))<<5))<<5))<<5))[m
[31m-#define REGARG_NUMGPR	6[m
[31m-#define REGARG_NUMFPR	8[m
[31m-#define REGARG_FIRSTFPR	RID_XMM0[m
[31m-#define REGARG_LASTFPR	RID_XMM7[m
[31m-#define STACKARG_OFS	0[m
[31m-#endif[m
[31m-#else[m
[31m-/* Common x86 ABI. */[m
[31m-#define RSET_SCRATCH	(RSET_ACD|RSET_FPR)[m
[31m-#define REGARG_GPRS	(RID_ECX|(RID_EDX<<5))  /* Fastcall only. */[m
[31m-#define REGARG_NUMGPR	2  /* Fastcall only. */[m
[31m-#define REGARG_NUMFPR	0[m
[31m-#define STACKARG_OFS	0[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_64[m
[31m-/* Prefer the low 8 regs of each type to reduce REX prefixes. */[m
[31m-#undef rset_picktop[m
[31m-#define rset_picktop(rs)	(lj_fls(lj_bswap(rs)) ^ 0x18)[m
[31m-#endif[m
[31m-[m
[31m-/* -- Spill slots --------------------------------------------------------- */[m
[31m-[m
[31m-/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs.[m
[31m-**[m
[31m-** SPS_FIXED: Available fixed spill slots in interpreter frame.[m
[31m-** This definition must match with the *.dasc file(s).[m
[31m-**[m
[31m-** SPS_FIRST: First spill slot for general use. Reserve min. two 32 bit slots.[m
[31m-*/[m
[31m-#if LJ_64[m
[31m-#if LJ_ABI_WIN[m
[31m-#define SPS_FIXED	(4*2)[m
[31m-#define SPS_FIRST	(4*2)	/* Don't use callee register save area. */[m
[31m-#else[m
[31m-#if LJ_GC64[m
[31m-#define SPS_FIXED	2[m
[31m-#else[m
[31m-#define SPS_FIXED	4[m
[31m-#endif[m
[31m-#define SPS_FIRST	2[m
[31m-#endif[m
[31m-#else[m
[31m-#define SPS_FIXED	6[m
[31m-#define SPS_FIRST	2[m
[31m-#endif[m
[31m-[m
[31m-#define SPOFS_TMP	0[m
[31m-[m
[31m-#define sps_scale(slot)		(4 * (int32_t)(slot))[m
[31m-#define sps_align(slot)		(((slot) - SPS_FIXED + 3) & ~3)[m
[31m-[m
[31m-/* -- Exit state ---------------------------------------------------------- */[m
[31m-[m
[31m-/* This definition must match with the *.dasc file(s). */[m
[31m-typedef struct {[m
[31m-  lua_Number fpr[RID_NUM_FPR];	/* Floating-point registers. */[m
[31m-  intptr_t gpr[RID_NUM_GPR];	/* General-purpose registers. */[m
[31m-  int32_t spill[256];		/* Spill slots. */[m
[31m-} ExitState;[m
[31m-[m
[31m-/* Limited by the range of a short fwd jump (127): (2+2)*(32-1)-2 = 122. */[m
[31m-#define EXITSTUB_SPACING	(2+2)[m
[31m-#define EXITSTUBS_PER_GROUP	32[m
[31m-[m
[31m-/* -- x86 ModRM operand encoding ------------------------------------------ */[m
[31m-[m
[31m-typedef enum {[m
[31m-  XM_OFS0 = 0x00, XM_OFS8 = 0x40, XM_OFS32 = 0x80, XM_REG = 0xc0,[m
[31m-  XM_SCALE1 = 0x00, XM_SCALE2 = 0x40, XM_SCALE4 = 0x80, XM_SCALE8 = 0xc0,[m
[31m-  XM_MASK = 0xc0[m
[31m-} x86Mode;[m
[31m-[m
[31m-/* Structure to hold variable ModRM operand. */[m
[31m-typedef struct {[m
[31m-  int32_t ofs;		/* Offset. */[m
[31m-  uint8_t base;		/* Base register or RID_NONE. */[m
[31m-  uint8_t idx;		/* Index register or RID_NONE. */[m
[31m-  uint8_t scale;	/* Index scale (XM_SCALE1 .. XM_SCALE8). */[m
[31m-} x86ModRM;[m
[31m-[m
[31m-/* -- Opcodes ------------------------------------------------------------- */[m
[31m-[m
[31m-/* Macros to construct variable-length x86 opcodes. -(len+1) is in LSB. */[m
[31m-#define XO_(o)		((uint32_t)(0x0000fe + (0x##o<<24)))[m
[31m-#define XO_FPU(a,b)	((uint32_t)(0x00fd + (0x##a<<16)+(0x##b<<24)))[m
[31m-#define XO_0f(o)	((uint32_t)(0x0f00fd + (0x##o<<24)))[m
[31m-#define XO_66(o)	((uint32_t)(0x6600fd + (0x##o<<24)))[m
[31m-#define XO_660f(o)	((uint32_t)(0x0f66fc + (0x##o<<24)))[m
[31m-#define XO_f20f(o)	((uint32_t)(0x0ff2fc + (0x##o<<24)))[m
[31m-#define XO_f30f(o)	((uint32_t)(0x0ff3fc + (0x##o<<24)))[m
[31m-[m
[31m-#define XV_660f38(o)	((uint32_t)(0x79e2c4 + (0x##o<<24)))[m
[31m-#define XV_f20f38(o)	((uint32_t)(0x7be2c4 + (0x##o<<24)))[m
[31m-#define XV_f20f3a(o)	((uint32_t)(0x7be3c4 + (0x##o<<24)))[m
[31m-#define XV_f30f38(o)	((uint32_t)(0x7ae2c4 + (0x##o<<24)))[m
[31m-[m
[31m-/* This list of x86 opcodes is not intended to be complete. Opcodes are only[m
[31m-** included when needed. Take a look at DynASM or jit.dis_x86 to see the[m
[31m-** whole mess.[m
[31m-*/[m
[31m-typedef enum {[m
[31m-  /* Fixed length opcodes. XI_* prefix. */[m
[31m-  XI_NOP =	0x90,[m
[31m-  XI_XCHGa =	0x90,[m
[31m-  XI_CALL =	0xe8,[m
[31m-  XI_JMP =	0xe9,[m
[31m-  XI_JMPs =	0xeb,[m
[31m-  XI_PUSH =	0x50, /* Really 50+r. */[m
[31m-  XI_JCCs =	0x70, /* Really 7x. */[m
[31m-  XI_JCCn =	0x80, /* Really 0f8x. */[m
[31m-  XI_LEA =	0x8d,[m
[31m-  XI_MOVrib =	0xb0, /* Really b0+r. */[m
[31m-  XI_MOVri =	0xb8, /* Really b8+r. */[m
[31m-  XI_ARITHib =	0x80,[m
[31m-  XI_ARITHi =	0x81,[m
[31m-  XI_ARITHi8 =	0x83,[m
[31m-  XI_PUSHi8 =	0x6a,[m
[31m-  XI_TESTb =	0x84,[m
[31m-  XI_TEST =	0x85,[m
[31m-  XI_MOVmi =	0xc7,[m
[31m-  XI_GROUP5 =	0xff,[m
[31m-[m
[31m-  /* Note: little-endian byte-order! */[m
[31m-  XI_FLDZ =	0xeed9,[m
[31m-  XI_FLD1 =	0xe8d9,[m
[31m-  XI_FLDLG2 =	0xecd9,[m
[31m-  XI_FLDLN2 =	0xedd9,[m
[31m-  XI_FDUP =	0xc0d9,  /* Really fld st0. */[m
[31m-  XI_FPOP =	0xd8dd,  /* Really fstp st0. */[m
[31m-  XI_FPOP1 =	0xd9dd,  /* Really fstp st1. */[m
[31m-  XI_FRNDINT =	0xfcd9,[m
[31m-  XI_FSIN =	0xfed9,[m
[31m-  XI_FCOS =	0xffd9,[m
[31m-  XI_FPTAN =	0xf2d9,[m
[31m-  XI_FPATAN =	0xf3d9,[m
[31m-  XI_FSCALE =	0xfdd9,[m
[31m-  XI_FYL2X =	0xf1d9,[m
[31m-[m
[31m-  /* VEX-encoded instructions. XV_* prefix. */[m
[31m-  XV_RORX =	XV_f20f3a(f0),[m
[31m-  XV_SARX =	XV_f30f38(f7),[m
[31m-  XV_SHLX =	XV_660f38(f7),[m
[31m-  XV_SHRX =	XV_f20f38(f7),[m
[31m-[m
[31m-  /* Variable-length opcodes. XO_* prefix. */[m
[31m-  XO_MOV =	XO_(8b),[m
[31m-  XO_MOVto =	XO_(89),[m
[31m-  XO_MOVtow =	XO_66(89),[m
[31m-  XO_MOVtob =	XO_(88),[m
[31m-  XO_MOVmi =	XO_(c7),[m
[31m-  XO_MOVmib =	XO_(c6),[m
[31m-  XO_LEA =	XO_(8d),[m
[31m-  XO_ARITHib =	XO_(80),[m
[31m-  XO_ARITHi =	XO_(81),[m
[31m-  XO_ARITHi8 =	XO_(83),[m
[31m-  XO_ARITHiw8 =	XO_66(83),[m
[31m-  XO_SHIFTi =	XO_(c1),[m
[31m-  XO_SHIFT1 =	XO_(d1),[m
[31m-  XO_SHIFTcl =	XO_(d3),[m
[31m-  XO_IMUL =	XO_0f(af),[m
[31m-  XO_IMULi =	XO_(69),[m
[31m-  XO_IMULi8 =	XO_(6b),[m
[31m-  XO_CMP =	XO_(3b),[m
[31m-  XO_TESTb =	XO_(84),[m
[31m-  XO_TEST =	XO_(85),[m
[31m-  XO_GROUP3b =	XO_(f6),[m
[31m-  XO_GROUP3 =	XO_(f7),[m
[31m-  XO_GROUP5b =	XO_(fe),[m
[31m-  XO_GROUP5 =	XO_(ff),[m
[31m-  XO_MOVZXb =	XO_0f(b6),[m
[31m-  XO_MOVZXw =	XO_0f(b7),[m
[31m-  XO_MOVSXb =	XO_0f(be),[m
[31m-  XO_MOVSXw =	XO_0f(bf),[m
[31m-  XO_MOVSXd =	XO_(63),[m
[31m-  XO_BSWAP =	XO_0f(c8),[m
[31m-  XO_CMOV =	XO_0f(40),[m
[31m-[m
[31m-  XO_MOVSD =	XO_f20f(10),[m
[31m-  XO_MOVSDto =	XO_f20f(11),[m
[31m-  XO_MOVSS =	XO_f30f(10),[m
[31m-  XO_MOVSSto =	XO_f30f(11),[m
[31m-  XO_MOVLPD =	XO_660f(12),[m
[31m-  XO_MOVAPS =	XO_0f(28),[m
[31m-  XO_XORPS =	XO_0f(57),[m
[31m-  XO_ANDPS =	XO_0f(54),[m
[31m-  XO_ADDSD =	XO_f20f(58),[m
[31m-  XO_SUBSD =	XO_f20f(5c),[m
[31m-  XO_MULSD =	XO_f20f(59),[m
[31m-  XO_DIVSD =	XO_f20f(5e),[m
[31m-  XO_SQRTSD =	XO_f20f(51),[m
[31m-  XO_MINSD =	XO_f20f(5d),[m
[31m-  XO_MAXSD =	XO_f20f(5f),[m
[31m-  XO_ROUNDSD =	0x0b3a0ffc,  /* Really 66 0f 3a 0b. See asm_fpmath. */[m
[31m-  XO_UCOMISD =	XO_660f(2e),[m
[31m-  XO_CVTSI2SD =	XO_f20f(2a),[m
[31m-  XO_CVTTSD2SI=	XO_f20f(2c),[m
[31m-  XO_CVTSI2SS =	XO_f30f(2a),[m
[31m-  XO_CVTTSS2SI=	XO_f30f(2c),[m
[31m-  XO_CVTSS2SD =	XO_f30f(5a),[m
[31m-  XO_CVTSD2SS =	XO_f20f(5a),[m
[31m-  XO_ADDSS =	XO_f30f(58),[m
[31m-  XO_MOVD =	XO_660f(6e),[m
[31m-  XO_MOVDto =	XO_660f(7e),[m
[31m-[m
[31m-  XO_FLDd =	XO_(d9), XOg_FLDd = 0,[m
[31m-  XO_FLDq =	XO_(dd), XOg_FLDq = 0,[m
[31m-  XO_FILDd =	XO_(db), XOg_FILDd = 0,[m
[31m-  XO_FILDq =	XO_(df), XOg_FILDq = 5,[m
[31m-  XO_FSTPd =	XO_(d9), XOg_FSTPd = 3,[m
[31m-  XO_FSTPq =	XO_(dd), XOg_FSTPq = 3,[m
[31m-  XO_FISTPq =	XO_(df), XOg_FISTPq = 7,[m
[31m-  XO_FISTTPq =	XO_(dd), XOg_FISTTPq = 1,[m
[31m-  XO_FADDq =	XO_(dc), XOg_FADDq = 0,[m
[31m-  XO_FLDCW =	XO_(d9), XOg_FLDCW = 5,[m
[31m-  XO_FNSTCW =	XO_(d9), XOg_FNSTCW = 7[m
[31m-} x86Op;[m
[31m-[m
[31m-/* x86 opcode groups. */[m
[31m-typedef uint32_t x86Group;[m
[31m-[m
[31m-#define XG_(i8, i, g)	((x86Group)(((i8) << 16) + ((i) << 8) + (g)))[m
[31m-#define XG_ARITHi(g)	XG_(XI_ARITHi8, XI_ARITHi, g)[m
[31m-#define XG_TOXOi(xg)	((x86Op)(0x000000fe + (((xg)<<16) & 0xff000000)))[m
[31m-#define XG_TOXOi8(xg)	((x86Op)(0x000000fe + (((xg)<<8) & 0xff000000)))[m
[31m-[m
[31m-#define XO_ARITH(a)	((x86Op)(0x030000fe + ((a)<<27)))[m
[31m-#define XO_ARITHw(a)	((x86Op)(0x036600fd + ((a)<<27)))[m
[31m-[m
[31m-typedef enum {[m
[31m-  XOg_ADD, XOg_OR, XOg_ADC, XOg_SBB, XOg_AND, XOg_SUB, XOg_XOR, XOg_CMP,[m
[31m-  XOg_X_IMUL[m
[31m-} x86Arith;[m
[31m-[m
[31m-typedef enum {[m
[31m-  XOg_ROL, XOg_ROR, XOg_RCL, XOg_RCR, XOg_SHL, XOg_SHR, XOg_SAL, XOg_SAR[m
[31m-} x86Shift;[m
[31m-[m
[31m-typedef enum {[m
[31m-  XOg_TEST, XOg_TEST_, XOg_NOT, XOg_NEG, XOg_MUL, XOg_IMUL, XOg_DIV, XOg_IDIV[m
[31m-} x86Group3;[m
[31m-[m
[31m-typedef enum {[m
[31m-  XOg_INC, XOg_DEC, XOg_CALL, XOg_CALLfar, XOg_JMP, XOg_JMPfar, XOg_PUSH[m
[31m-} x86Group5;[m
[31m-[m
[31m-/* x86 condition codes. */[m
[31m-typedef enum {[m
[31m-  CC_O, CC_NO, CC_B, CC_NB, CC_E, CC_NE, CC_BE, CC_NBE,[m
[31m-  CC_S, CC_NS, CC_P, CC_NP, CC_L, CC_NL, CC_LE, CC_NLE,[m
[31m-  CC_C = CC_B, CC_NAE = CC_C, CC_NC = CC_NB, CC_AE = CC_NB,[m
[31m-  CC_Z = CC_E, CC_NZ = CC_NE, CC_NA = CC_BE, CC_A = CC_NBE,[m
[31m-  CC_PE = CC_P, CC_PO = CC_NP, CC_NGE = CC_L, CC_GE = CC_NL,[m
[31m-  CC_NG = CC_LE, CC_G = CC_NLE[m
[31m-} x86CC;[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_trace.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_trace.c[m
[1mdeleted file mode 100644[m
[1mindex 66c5ae4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_trace.c[m
[1m+++ /dev/null[m
[36m@@ -1,887 +0,0 @@[m
[31m-/*[m
[31m-** Trace management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_trace_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_err.h"[m
[31m-#include "lj_debug.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_frame.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_bc.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_iropt.h"[m
[31m-#include "lj_mcode.h"[m
[31m-#include "lj_trace.h"[m
[31m-#include "lj_snap.h"[m
[31m-#include "lj_gdbjit.h"[m
[31m-#include "lj_record.h"[m
[31m-#include "lj_asm.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_vmevent.h"[m
[31m-#include "lj_target.h"[m
[31m-[m
[31m-/* -- Error handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* Synchronous abort with error message. */[m
[31m-void lj_trace_err(jit_State *J, TraceError e)[m
[31m-{[m
[31m-  setnilV(&J->errinfo);  /* No error info. */[m
[31m-  setintV(J->L->top++, (int32_t)e);[m
[31m-  lj_err_throw(J->L, LUA_ERRRUN);[m
[31m-}[m
[31m-[m
[31m-/* Synchronous abort with error message and error info. */[m
[31m-void lj_trace_err_info(jit_State *J, TraceError e)[m
[31m-{[m
[31m-  setintV(J->L->top++, (int32_t)e);[m
[31m-  lj_err_throw(J->L, LUA_ERRRUN);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace management ---------------------------------------------------- */[m
[31m-[m
[31m-/* The current trace is first assembled in J->cur. The variable length[m
[31m-** arrays point to shared, growable buffers (J->irbuf etc.). When trace[m
[31m-** recording ends successfully, the current trace and its data structures[m
[31m-** are copied to a new (compact) GCtrace object.[m
[31m-*/[m
[31m-[m
[31m-/* Find a free trace number. */[m
[31m-static TraceNo trace_findfree(jit_State *J)[m
[31m-{[m
[31m-  MSize osz, lim;[m
[31m-  if (J->freetrace == 0)[m
[31m-    J->freetrace = 1;[m
[31m-  for (; J->freetrace < J->sizetrace; J->freetrace++)[m
[31m-    if (traceref(J, J->freetrace) == NULL)[m
[31m-      return J->freetrace++;[m
[31m-  /* Need to grow trace array. */[m
[31m-  lim = (MSize)J->param[JIT_P_maxtrace] + 1;[m
[31m-  if (lim < 2) lim = 2; else if (lim > 65535) lim = 65535;[m
[31m-  osz = J->sizetrace;[m
[31m-  if (osz >= lim)[m
[31m-    return 0;  /* Too many traces. */[m
[31m-  lj_mem_growvec(J->L, J->trace, J->sizetrace, lim, GCRef);[m
[31m-  for (; osz < J->sizetrace; osz++)[m
[31m-    setgcrefnull(J->trace[osz]);[m
[31m-  return J->freetrace;[m
[31m-}[m
[31m-[m
[31m-#define TRACE_APPENDVEC(field, szfield, tp) \[m
[31m-  T->field = (tp *)p; \[m
[31m-  memcpy(p, J->cur.field, J->cur.szfield*sizeof(tp)); \[m
[31m-  p += J->cur.szfield*sizeof(tp);[m
[31m-[m
[31m-#ifdef LUAJIT_USE_PERFTOOLS[m
[31m-/*[m
[31m-** Create symbol table of JIT-compiled code. For use with Linux perf tools.[m
[31m-** Example usage:[m
[31m-**   perf record -f -e cycles luajit test.lua[m
[31m-**   perf report -s symbol[m
[31m-**   rm perf.data /tmp/perf-*.map[m
[31m-*/[m
[31m-#include <stdio.h>[m
[31m-#include <unistd.h>[m
[31m-[m
[31m-static void perftools_addtrace(GCtrace *T)[m
[31m-{[m
[31m-  static FILE *fp;[m
[31m-  GCproto *pt = &gcref(T->startpt)->pt;[m
[31m-  const BCIns *startpc = mref(T->startpc, const BCIns);[m
[31m-  const char *name = proto_chunknamestr(pt);[m
[31m-  BCLine lineno;[m
[31m-  if (name[0] == '@' || name[0] == '=')[m
[31m-    name++;[m
[31m-  else[m
[31m-    name = "(string)";[m
[31m-  lua_assert(startpc >= proto_bc(pt) && startpc < proto_bc(pt) + pt->sizebc);[m
[31m-  lineno = lj_debug_line(pt, proto_bcpos(pt, startpc));[m
[31m-  if (!fp) {[m
[31m-    char fname[40];[m
[31m-    sprintf(fname, "/tmp/perf-%d.map", getpid());[m
[31m-    if (!(fp = fopen(fname, "w"))) return;[m
[31m-    setlinebuf(fp);[m
[31m-  }[m
[31m-  fprintf(fp, "%lx %x TRACE_%d::%s:%u\n",[m
[31m-	  (long)T->mcode, T->szmcode, T->traceno, name, lineno);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Allocate space for copy of trace. */[m
[31m-static GCtrace *trace_save_alloc(jit_State *J)[m
[31m-{[m
[31m-  size_t sztr = ((sizeof(GCtrace)+7)&~7);[m
[31m-  size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns);[m
[31m-  size_t sz = sztr + szins +[m
[31m-	      J->cur.nsnap*sizeof(SnapShot) +[m
[31m-	      J->cur.nsnapmap*sizeof(SnapEntry);[m
[31m-  return lj_mem_newt(J->L, (MSize)sz, GCtrace);[m
[31m-}[m
[31m-[m
[31m-/* Save current trace by copying and compacting it. */[m
[31m-static void trace_save(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  size_t sztr = ((sizeof(GCtrace)+7)&~7);[m
[31m-  size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns);[m
[31m-  char *p = (char *)T + sztr;[m
[31m-  memcpy(T, &J->cur, sizeof(GCtrace));[m
[31m-  setgcrefr(T->nextgc, J2G(J)->gc.root);[m
[31m-  setgcrefp(J2G(J)->gc.root, T);[m
[31m-  newwhite(J2G(J), T);[m
[31m-  T->gct = ~LJ_TTRACE;[m
[31m-  T->ir = (IRIns *)p - J->cur.nk;[m
[31m-  memcpy(p, J->cur.ir+J->cur.nk, szins);[m
[31m-  p += szins;[m
[31m-  TRACE_APPENDVEC(snap, nsnap, SnapShot)[m
[31m-  TRACE_APPENDVEC(snapmap, nsnapmap, SnapEntry)[m
[31m-  J->cur.traceno = 0;[m
[31m-  setgcrefp(J->trace[T->traceno], T);[m
[31m-  lj_gc_barriertrace(J2G(J), T->traceno);[m
[31m-  lj_gdbjit_addtrace(J, T);[m
[31m-#ifdef LUAJIT_USE_PERFTOOLS[m
[31m-  perftools_addtrace(T);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_trace_free(global_State *g, GCtrace *T)[m
[31m-{[m
[31m-  jit_State *J = G2J(g);[m
[31m-  if (T->traceno) {[m
[31m-    lj_gdbjit_deltrace(J, T);[m
[31m-    if (T->traceno < J->freetrace)[m
[31m-      J->freetrace = T->traceno;[m
[31m-    setgcrefnull(J->trace[T->traceno]);[m
[31m-  }[m
[31m-  lj_mem_free(g, T,[m
[31m-    ((sizeof(GCtrace)+7)&~7) + (T->nins-T->nk)*sizeof(IRIns) +[m
[31m-    T->nsnap*sizeof(SnapShot) + T->nsnapmap*sizeof(SnapEntry));[m
[31m-}[m
[31m-[m
[31m-/* Re-enable compiling a prototype by unpatching any modified bytecode. */[m
[31m-void lj_trace_reenableproto(GCproto *pt)[m
[31m-{[m
[31m-  if ((pt->flags & PROTO_ILOOP)) {[m
[31m-    BCIns *bc = proto_bc(pt);[m
[31m-    BCPos i, sizebc = pt->sizebc;;[m
[31m-    pt->flags &= ~PROTO_ILOOP;[m
[31m-    if (bc_op(bc[0]) == BC_IFUNCF)[m
[31m-      setbc_op(&bc[0], BC_FUNCF);[m
[31m-    for (i = 1; i < sizebc; i++) {[m
[31m-      BCOp op = bc_op(bc[i]);[m
[31m-      if (op == BC_IFORL || op == BC_IITERL || op == BC_ILOOP)[m
[31m-	setbc_op(&bc[i], (int)op+(int)BC_LOOP-(int)BC_ILOOP);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Unpatch the bytecode modified by a root trace. */[m
[31m-static void trace_unpatch(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  BCOp op = bc_op(T->startins);[m
[31m-  BCIns *pc = mref(T->startpc, BCIns);[m
[31m-  UNUSED(J);[m
[31m-  if (op == BC_JMP)[m
[31m-    return;  /* No need to unpatch branches in parent traces (yet). */[m
[31m-  switch (bc_op(*pc)) {[m
[31m-  case BC_JFORL:[m
[31m-    lua_assert(traceref(J, bc_d(*pc)) == T);[m
[31m-    *pc = T->startins;[m
[31m-    pc += bc_j(T->startins);[m
[31m-    lua_assert(bc_op(*pc) == BC_JFORI);[m
[31m-    setbc_op(pc, BC_FORI);[m
[31m-    break;[m
[31m-  case BC_JITERL:[m
[31m-  case BC_JLOOP:[m
[31m-    lua_assert(op == BC_ITERL || op == BC_LOOP || bc_isret(op));[m
[31m-    *pc = T->startins;[m
[31m-    break;[m
[31m-  case BC_JMP:[m
[31m-    lua_assert(op == BC_ITERL);[m
[31m-    pc += bc_j(*pc)+2;[m
[31m-    if (bc_op(*pc) == BC_JITERL) {[m
[31m-      lua_assert(traceref(J, bc_d(*pc)) == T);[m
[31m-      *pc = T->startins;[m
[31m-    }[m
[31m-    break;[m
[31m-  case BC_JFUNCF:[m
[31m-    lua_assert(op == BC_FUNCF);[m
[31m-    *pc = T->startins;[m
[31m-    break;[m
[31m-  default:  /* Already unpatched. */[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Flush a root trace. */[m
[31m-static void trace_flushroot(jit_State *J, GCtrace *T)[m
[31m-{[m
[31m-  GCproto *pt = &gcref(T->startpt)->pt;[m
[31m-  lua_assert(T->root == 0 && pt != NULL);[m
[31m-  /* First unpatch any modified bytecode. */[m
[31m-  trace_unpatch(J, T);[m
[31m-  /* Unlink root trace from chain anchored in prototype. */[m
[31m-  if (pt->trace == T->traceno) {  /* Trace is first in chain. Easy. */[m
[31m-    pt->trace = T->nextroot;[m
[31m-  } else if (pt->trace) {  /* Otherwise search in chain of root traces. */[m
[31m-    GCtrace *T2 = traceref(J, pt->trace);[m
[31m-    if (T2) {[m
[31m-      for (; T2->nextroot; T2 = traceref(J, T2->nextroot))[m
[31m-	if (T2->nextroot == T->traceno) {[m
[31m-	  T2->nextroot = T->nextroot;  /* Unlink from chain. */[m
[31m-	  break;[m
[31m-	}[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Flush a trace. Only root traces are considered. */[m
[31m-void lj_trace_flush(jit_State *J, TraceNo traceno)[m
[31m-{[m
[31m-  if (traceno > 0 && traceno < J->sizetrace) {[m
[31m-    GCtrace *T = traceref(J, traceno);[m
[31m-    if (T && T->root == 0)[m
[31m-      trace_flushroot(J, T);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Flush all traces associated with a prototype. */[m
[31m-void lj_trace_flushproto(global_State *g, GCproto *pt)[m
[31m-{[m
[31m-  while (pt->trace != 0)[m
[31m-    trace_flushroot(G2J(g), traceref(G2J(g), pt->trace));[m
[31m-}[m
[31m-[m
[31m-/* Flush all traces. */[m
[31m-int lj_trace_flushall(lua_State *L)[m
[31m-{[m
[31m-  jit_State *J = L2J(L);[m
[31m-  ptrdiff_t i;[m
[31m-  if ((J2G(J)->hookmask & HOOK_GC))[m
[31m-    return 1;[m
[31m-  for (i = (ptrdiff_t)J->sizetrace-1; i > 0; i--) {[m
[31m-    GCtrace *T = traceref(J, i);[m
[31m-    if (T) {[m
[31m-      if (T->root == 0)[m
[31m-	trace_flushroot(J, T);[m
[31m-      lj_gdbjit_deltrace(J, T);[m
[31m-      T->traceno = T->link = 0;  /* Blacklist the link for cont_stitch. */[m
[31m-      setgcrefnull(J->trace[i]);[m
[31m-    }[m
[31m-  }[m
[31m-  J->cur.traceno = 0;[m
[31m-  J->freetrace = 0;[m
[31m-  /* Clear penalty cache. */[m
[31m-  memset(J->penalty, 0, sizeof(J->penalty));[m
[31m-  /* Free the whole machine code and invalidate all exit stub groups. */[m
[31m-  lj_mcode_free(J);[m
[31m-  lj_ir_k64_freeall(J);[m
[31m-  memset(J->exitstubgroup, 0, sizeof(J->exitstubgroup));[m
[31m-  lj_vmevent_send(L, TRACE,[m
[31m-    setstrV(L, L->top++, lj_str_newlit(L, "flush"));[m
[31m-  );[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Initialize JIT compiler state. */[m
[31m-void lj_trace_initstate(global_State *g)[m
[31m-{[m
[31m-  jit_State *J = G2J(g);[m
[31m-  TValue *tv;[m
[31m-  /* Initialize SIMD constants. */[m
[31m-  tv = LJ_KSIMD(J, LJ_KSIMD_ABS);[m
[31m-  tv[0].u64 = U64x(7fffffff,ffffffff);[m
[31m-  tv[1].u64 = U64x(7fffffff,ffffffff);[m
[31m-  tv = LJ_KSIMD(J, LJ_KSIMD_NEG);[m
[31m-  tv[0].u64 = U64x(80000000,00000000);[m
[31m-  tv[1].u64 = U64x(80000000,00000000);[m
[31m-}[m
[31m-[m
[31m-/* Free everything associated with the JIT compiler state. */[m
[31m-void lj_trace_freestate(global_State *g)[m
[31m-{[m
[31m-  jit_State *J = G2J(g);[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  {  /* This assumes all traces have already been freed. */[m
[31m-    ptrdiff_t i;[m
[31m-    for (i = 1; i < (ptrdiff_t)J->sizetrace; i++)[m
[31m-      lua_assert(i == (ptrdiff_t)J->cur.traceno || traceref(J, i) == NULL);[m
[31m-  }[m
[31m-#endif[m
[31m-  lj_mcode_free(J);[m
[31m-  lj_ir_k64_freeall(J);[m
[31m-  lj_mem_freevec(g, J->snapmapbuf, J->sizesnapmap, SnapEntry);[m
[31m-  lj_mem_freevec(g, J->snapbuf, J->sizesnap, SnapShot);[m
[31m-  lj_mem_freevec(g, J->irbuf + J->irbotlim, J->irtoplim - J->irbotlim, IRIns);[m
[31m-  lj_mem_freevec(g, J->trace, J->sizetrace, GCRef);[m
[31m-}[m
[31m-[m
[31m-/* -- Penalties and blacklisting ------------------------------------------ */[m
[31m-[m
[31m-/* Blacklist a bytecode instruction. */[m
[31m-static void blacklist_pc(GCproto *pt, BCIns *pc)[m
[31m-{[m
[31m-  setbc_op(pc, (int)bc_op(*pc)+(int)BC_ILOOP-(int)BC_LOOP);[m
[31m-  pt->flags |= PROTO_ILOOP;[m
[31m-}[m
[31m-[m
[31m-/* Penalize a bytecode instruction. */[m
[31m-static void penalty_pc(jit_State *J, GCproto *pt, BCIns *pc, TraceError e)[m
[31m-{[m
[31m-  uint32_t i, val = PENALTY_MIN;[m
[31m-  for (i = 0; i < PENALTY_SLOTS; i++)[m
[31m-    if (mref(J->penalty[i].pc, const BCIns) == pc) {  /* Cache slot found? */[m
[31m-      /* First try to bump its hotcount several times. */[m
[31m-      val = ((uint32_t)J->penalty[i].val << 1) +[m
[31m-	    LJ_PRNG_BITS(J, PENALTY_RNDBITS);[m
[31m-      if (val > PENALTY_MAX) {[m
[31m-	blacklist_pc(pt, pc);  /* Blacklist it, if that didn't help. */[m
[31m-	return;[m
[31m-      }[m
[31m-      goto setpenalty;[m
[31m-    }[m
[31m-  /* Assign a new penalty cache slot. */[m
[31m-  i = J->penaltyslot;[m
[31m-  J->penaltyslot = (J->penaltyslot + 1) & (PENALTY_SLOTS-1);[m
[31m-  setmref(J->penalty[i].pc, pc);[m
[31m-setpenalty:[m
[31m-  J->penalty[i].val = (uint16_t)val;[m
[31m-  J->penalty[i].reason = e;[m
[31m-  hotcount_set(J2GG(J), pc+1, val);[m
[31m-}[m
[31m-[m
[31m-/* -- Trace compiler state machine ---------------------------------------- */[m
[31m-[m
[31m-/* Start tracing. */[m
[31m-static void trace_start(jit_State *J)[m
[31m-{[m
[31m-  lua_State *L;[m
[31m-  TraceNo traceno;[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-  const BCIns *pc = J->pc;[m
[31m-#endif[m
[31m-[m
[31m-  if ((J->pt->flags & PROTO_NOJIT)) {  /* JIT disabled for this proto? */[m
[31m-    if (J->parent == 0 && J->exitno == 0) {[m
[31m-      /* Lazy bytecode patching to disable hotcount events. */[m
[31m-      lua_assert(bc_op(*J->pc) == BC_FORL || bc_op(*J->pc) == BC_ITERL ||[m
[31m-		 bc_op(*J->pc) == BC_LOOP || bc_op(*J->pc) == BC_FUNCF);[m
[31m-      setbc_op(J->pc, (int)bc_op(*J->pc)+(int)BC_ILOOP-(int)BC_LOOP);[m
[31m-      J->pt->flags |= PROTO_ILOOP;[m
[31m-    }[m
[31m-    J->state = LJ_TRACE_IDLE;  /* Silently ignored. */[m
[31m-    return;[m
[31m-  }[m
[31m-[m
[31m-  /* Get a new trace number. */[m
[31m-  traceno = trace_findfree(J);[m
[31m-  if (LJ_UNLIKELY(traceno == 0)) {  /* No free trace? */[m
[31m-    lua_assert((J2G(J)->hookmask & HOOK_GC) == 0);[m
[31m-    lj_trace_flushall(J->L);[m
[31m-    J->state = LJ_TRACE_IDLE;  /* Silently ignored. */[m
[31m-    return;[m
[31m-  }[m
[31m-  setgcrefp(J->trace[traceno], &J->cur);[m
[31m-[m
[31m-  /* Setup enough of the current trace to be able to send the vmevent. */[m
[31m-  memset(&J->cur, 0, sizeof(GCtrace));[m
[31m-  J->cur.traceno = traceno;[m
[31m-  J->cur.nins = J->cur.nk = REF_BASE;[m
[31m-  J->cur.ir = J->irbuf;[m
[31m-  J->cur.snap = J->snapbuf;[m
[31m-  J->cur.snapmap = J->snapmapbuf;[m
[31m-  J->mergesnap = 0;[m
[31m-  J->needsnap = 0;[m
[31m-  J->bcskip = 0;[m
[31m-  J->guardemit.irt = 0;[m
[31m-  J->postproc = LJ_POST_NONE;[m
[31m-  lj_resetsplit(J);[m
[31m-  J->retryrec = 0;[m
[31m-  J->ktracep = NULL;[m
[31m-  setgcref(J->cur.startpt, obj2gco(J->pt));[m
[31m-[m
[31m-  L = J->L;[m
[31m-  lj_vmevent_send(L, TRACE,[m
[31m-    setstrV(L, L->top++, lj_str_newlit(L, "start"));[m
[31m-    setintV(L->top++, traceno);[m
[31m-    setfuncV(L, L->top++, J->fn);[m
[31m-    setintV(L->top++, proto_bcpos(J->pt, J->pc));[m
[31m-    if (J->parent) {[m
[31m-      setintV(L->top++, J->parent);[m
[31m-      setintV(L->top++, J->exitno);[m
[31m-    }[m
[31m-  );[m
[31m-  lj_record_setup(J);[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-  lj_log_trace_start_record(L, (unsigned) J->cur.traceno, pc, J->fn);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* Stop tracing. */[m
[31m-static void trace_stop(jit_State *J)[m
[31m-{[m
[31m-  BCIns *pc = mref(J->cur.startpc, BCIns);[m
[31m-  BCOp op = bc_op(J->cur.startins);[m
[31m-  GCproto *pt = &gcref(J->cur.startpt)->pt;[m
[31m-  TraceNo traceno = J->cur.traceno;[m
[31m-  GCtrace *T = trace_save_alloc(J);  /* Do this first. May throw OOM. */[m
[31m-  lua_State *L;[m
[31m-[m
[31m-  switch (op) {[m
[31m-  case BC_FORL:[m
[31m-    setbc_op(pc+bc_j(J->cur.startins), BC_JFORI);  /* Patch FORI, too. */[m
[31m-    /* fallthrough */[m
[31m-  case BC_LOOP:[m
[31m-  case BC_ITERL:[m
[31m-  case BC_FUNCF:[m
[31m-    /* Patch bytecode of starting instruction in root trace. */[m
[31m-    setbc_op(pc, (int)op+(int)BC_JLOOP-(int)BC_LOOP);[m
[31m-    setbc_d(pc, traceno);[m
[31m-  addroot:[m
[31m-    /* Add to root trace chain in prototype. */[m
[31m-    J->cur.nextroot = pt->trace;[m
[31m-    pt->trace = (TraceNo1)traceno;[m
[31m-    break;[m
[31m-  case BC_RET:[m
[31m-  case BC_RET0:[m
[31m-  case BC_RET1:[m
[31m-    *pc = BCINS_AD(BC_JLOOP, J->cur.snap[0].nslots, traceno);[m
[31m-    goto addroot;[m
[31m-  case BC_JMP:[m
[31m-    /* Patch exit branch in parent to side trace entry. */[m
[31m-    lua_assert(J->parent != 0 && J->cur.root != 0);[m
[31m-    lj_asm_patchexit(J, traceref(J, J->parent), J->exitno, J->cur.mcode);[m
[31m-    /* Avoid compiling a side trace twice (stack resizing uses parent exit). */[m
[31m-    traceref(J, J->parent)->snap[J->exitno].count = SNAPCOUNT_DONE;[m
[31m-    /* Add to side trace chain in root trace. */[m
[31m-    {[m
[31m-      GCtrace *root = traceref(J, J->cur.root);[m
[31m-      root->nchild++;[m
[31m-      J->cur.nextside = root->nextside;[m
[31m-      root->nextside = (TraceNo1)traceno;[m
[31m-    }[m
[31m-    break;[m
[31m-  case BC_CALLM:[m
[31m-  case BC_CALL:[m
[31m-  case BC_ITERC:[m
[31m-    /* Trace stitching: patch link of previous trace. */[m
[31m-    traceref(J, J->exitno)->link = traceno;[m
[31m-    break;[m
[31m-  default:[m
[31m-    lua_assert(0);[m
[31m-    break;[m
[31m-  }[m
[31m-[m
[31m-  /* Commit new mcode only after all patching is done. */[m
[31m-  lj_mcode_commit(J, J->cur.mcode);[m
[31m-  J->postproc = LJ_POST_NONE;[m
[31m-  trace_save(J, T);[m
[31m-  if (J->ktracep) {  /* Patch K64Array slot with the final GCtrace pointer. */[m
[31m-    setgcV(J->L, J->ktracep, obj2gco(T), LJ_TTRACE);[m
[31m-  }[m
[31m-[m
[31m-  L = J->L;[m
[31m-  lj_vmevent_send(L, TRACE,[m
[31m-    setstrV(L, L->top++, lj_str_newlit(L, "stop"));[m
[31m-    setintV(L->top++, traceno);[m
[31m-    setfuncV(L, L->top++, J->fn);[m
[31m-  );[m
[31m-}[m
[31m-[m
[31m-/* Start a new root trace for down-recursion. */[m
[31m-static int trace_downrec(jit_State *J)[m
[31m-{[m
[31m-  /* Restart recording at the return instruction. */[m
[31m-  lua_assert(J->pt != NULL);[m
[31m-  lua_assert(bc_isret(bc_op(*J->pc)));[m
[31m-  if (bc_op(*J->pc) == BC_RETM)[m
[31m-    return 0;  /* NYI: down-recursion with RETM. */[m
[31m-  J->parent = 0;[m
[31m-  J->exitno = 0;[m
[31m-  J->state = LJ_TRACE_RECORD;[m
[31m-  trace_start(J);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* Abort tracing. */[m
[31m-static int trace_abort(jit_State *J)[m
[31m-{[m
[31m-  lua_State *L = J->L;[m
[31m-  TraceError e = LJ_TRERR_RECERR;[m
[31m-  TraceNo traceno;[m
[31m-[m
[31m-  J->postproc = LJ_POST_NONE;[m
[31m-  lj_mcode_abort(J);[m
[31m-  if (tvisnumber(L->top-1))[m
[31m-    e = (TraceError)numberVint(L->top-1);[m
[31m-  if (e == LJ_TRERR_MCODELM) {[m
[31m-    L->top--;  /* Remove error object */[m
[31m-    J->state = LJ_TRACE_ASM;[m
[31m-    return 1;  /* Retry ASM with new MCode area. */[m
[31m-  }[m
[31m-  /* Penalize or blacklist starting bytecode instruction. */[m
[31m-  if (J->parent == 0 && !bc_isret(bc_op(J->cur.startins))) {[m
[31m-    if (J->exitno == 0) {[m
[31m-      BCIns *startpc = mref(J->cur.startpc, BCIns);[m
[31m-      if (e == LJ_TRERR_RETRY)[m
[31m-	hotcount_set(J2GG(J), startpc+1, 1);  /* Immediate retry. */[m
[31m-      else[m
[31m-	penalty_pc(J, &gcref(J->cur.startpt)->pt, startpc, e);[m
[31m-    } else {[m
[31m-      traceref(J, J->exitno)->link = J->exitno;  /* Self-link is blacklisted. */[m
[31m-    }[m
[31m-  }[m
[31m-[m
[31m-  /* Is there anything to abort? */[m
[31m-  traceno = J->cur.traceno;[m
[31m-  if (traceno) {[m
[31m-    ptrdiff_t errobj = savestack(L, L->top-1);  /* Stack may be resized. */[m
[31m-    J->cur.link = 0;[m
[31m-    J->cur.linktype = LJ_TRLINK_NONE;[m
[31m-    lj_vmevent_send(L, TRACE,[m
[31m-      TValue *frame;[m
[31m-      const BCIns *pc;[m
[31m-      GCfunc *fn;[m
[31m-      setstrV(L, L->top++, lj_str_newlit(L, "abort"));[m
[31m-      setintV(L->top++, traceno);[m
[31m-      /* Find original Lua function call to generate a better error message. */[m
[31m-      frame = J->L->base-1;[m
[31m-      pc = J->pc;[m
[31m-      while (!isluafunc(frame_func(frame))) {[m
[31m-	pc = (frame_iscont(frame) ? frame_contpc(frame) : frame_pc(frame)) - 1;[m
[31m-	frame = frame_prev(frame);[m
[31m-      }[m
[31m-      fn = frame_func(frame);[m
[31m-      setfuncV(L, L->top++, fn);[m
[31m-      setintV(L->top++, proto_bcpos(funcproto(fn), pc));[m
[31m-      copyTV(L, L->top++, restorestack(L, errobj));[m
[31m-      copyTV(L, L->top++, &J->errinfo);[m
[31m-    );[m
[31m-    /* Drop aborted trace after the vmevent (which may still access it). */[m
[31m-    setgcrefnull(J->trace[traceno]);[m
[31m-    if (traceno < J->freetrace)[m
[31m-      J->freetrace = traceno;[m
[31m-    J->cur.traceno = 0;[m
[31m-  }[m
[31m-  L->top--;  /* Remove error object */[m
[31m-  if (e == LJ_TRERR_DOWNREC)[m
[31m-    return trace_downrec(J);[m
[31m-  else if (e == LJ_TRERR_MCODEAL)[m
[31m-    lj_trace_flushall(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Perform pending re-patch of a bytecode instruction. */[m
[31m-static LJ_AINLINE void trace_pendpatch(jit_State *J, int force)[m
[31m-{[m
[31m-  if (LJ_UNLIKELY(J->patchpc)) {[m
[31m-    if (force || J->bcskip == 0) {[m
[31m-      *J->patchpc = J->patchins;[m
[31m-      J->patchpc = NULL;[m
[31m-    } else {[m
[31m-      J->bcskip = 0;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* State machine for the trace compiler. Protected callback. */[m
[31m-static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  jit_State *J = (jit_State *)ud;[m
[31m-  UNUSED(dummy);[m
[31m-  do {[m
[31m-  retry:[m
[31m-    switch (J->state) {[m
[31m-    case LJ_TRACE_START:[m
[31m-      J->state = LJ_TRACE_RECORD;  /* trace_start() may change state. */[m
[31m-      trace_start(J);[m
[31m-      lj_dispatch_update(J2G(J));[m
[31m-      break;[m
[31m-[m
[31m-    case LJ_TRACE_RECORD:[m
[31m-      trace_pendpatch(J, 0);[m
[31m-      setvmstate(J2G(J), RECORD);[m
[31m-      lj_vmevent_send_(L, RECORD,[m
[31m-	/* Save/restore tmptv state for trace recorder. */[m
[31m-	TValue savetv = J2G(J)->tmptv;[m
[31m-	TValue savetv2 = J2G(J)->tmptv2;[m
[31m-	setintV(L->top++, J->cur.traceno);[m
[31m-	setfuncV(L, L->top++, J->fn);[m
[31m-	setintV(L->top++, J->pt ? (int32_t)proto_bcpos(J->pt, J->pc) : -1);[m
[31m-	setintV(L->top++, J->framedepth);[m
[31m-      ,[m
[31m-	J2G(J)->tmptv = savetv;[m
[31m-	J2G(J)->tmptv2 = savetv2;[m
[31m-      );[m
[31m-      lj_record_ins(J);[m
[31m-      break;[m
[31m-[m
[31m-    case LJ_TRACE_END:[m
[31m-      trace_pendpatch(J, 1);[m
[31m-      J->loopref = 0;[m
[31m-      if ((J->flags & JIT_F_OPT_LOOP) &&[m
[31m-	  J->cur.link == J->cur.traceno && J->framedepth + J->retdepth == 0) {[m
[31m-	setvmstate(J2G(J), OPT);[m
[31m-	lj_opt_dce(J);[m
[31m-	if (lj_opt_loop(J)) {  /* Loop optimization failed? */[m
[31m-	  J->cur.link = 0;[m
[31m-	  J->cur.linktype = LJ_TRLINK_NONE;[m
[31m-	  J->loopref = J->cur.nins;[m
[31m-	  J->state = LJ_TRACE_RECORD;  /* Try to continue recording. */[m
[31m-	  break;[m
[31m-	}[m
[31m-	J->loopref = J->chain[IR_LOOP];  /* Needed by assembler. */[m
[31m-      }[m
[31m-      lj_opt_split(J);[m
[31m-      lj_opt_sink(J);[m
[31m-      if (!J->loopref) J->cur.snap[J->cur.nsnap-1].count = SNAPCOUNT_DONE;[m
[31m-      J->state = LJ_TRACE_ASM;[m
[31m-      break;[m
[31m-[m
[31m-    case LJ_TRACE_ASM:[m
[31m-      setvmstate(J2G(J), ASM);[m
[31m-      lj_asm_trace(J, &J->cur);[m
[31m-      trace_stop(J);[m
[31m-      setvmstate(J2G(J), INTERP);[m
[31m-      J->state = LJ_TRACE_IDLE;[m
[31m-      lj_dispatch_update(J2G(J));[m
[31m-      return NULL;[m
[31m-[m
[31m-    default:  /* Trace aborted asynchronously. */[m
[31m-      setintV(L->top++, (int32_t)LJ_TRERR_RECERR);[m
[31m-      /* fallthrough */[m
[31m-    case LJ_TRACE_ERR:[m
[31m-      trace_pendpatch(J, 1);[m
[31m-      if (trace_abort(J))[m
[31m-	goto retry;[m
[31m-      setvmstate(J2G(J), INTERP);[m
[31m-      J->state = LJ_TRACE_IDLE;[m
[31m-      lj_dispatch_update(J2G(J));[m
[31m-      return NULL;[m
[31m-    }[m
[31m-  } while (J->state > LJ_TRACE_RECORD);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* -- Event handling ------------------------------------------------------ */[m
[31m-[m
[31m-/* A bytecode instruction is about to be executed. Record it. */[m
[31m-void lj_trace_ins(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  /* Note: J->L must already be set. pc is the true bytecode PC here. */[m
[31m-  J->pc = pc;[m
[31m-  J->fn = curr_func(J->L);[m
[31m-  J->pt = isluafunc(J->fn) ? funcproto(J->fn) : NULL;[m
[31m-  while (lj_vm_cpcall(J->L, NULL, (void *)J, trace_state) != 0)[m
[31m-    J->state = LJ_TRACE_ERR;[m
[31m-}[m
[31m-[m
[31m-/* A hotcount triggered. Start recording a root trace. */[m
[31m-void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  /* Note: pc is the interpreter bytecode PC here. It's offset by 1. */[m
[31m-  ERRNO_SAVE[m
[31m-  /* Reset hotcount. */[m
[31m-  hotcount_set(J2GG(J), pc, J->param[JIT_P_hotloop]*HOTCOUNT_LOOP);[m
[31m-  /* Only start a new trace if not recording or inside __gc call or vmevent. */[m
[31m-  if (J->state == LJ_TRACE_IDLE &&[m
[31m-      !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) {[m
[31m-    J->parent = 0;  /* Root trace. */[m
[31m-    J->exitno = 0;[m
[31m-    J->state = LJ_TRACE_START;[m
[31m-    lj_trace_ins(J, pc-1);[m
[31m-  }[m
[31m-  ERRNO_RESTORE[m
[31m-}[m
[31m-[m
[31m-/* Check for a hot side exit. If yes, start recording a side trace. */[m
[31m-static void trace_hotside(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  SnapShot *snap = &traceref(J, J->parent)->snap[J->exitno];[m
[31m-  if (!(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT)) &&[m
[31m-      isluafunc(curr_func(J->L)) &&[m
[31m-      snap->count != SNAPCOUNT_DONE &&[m
[31m-      ++snap->count >= J->param[JIT_P_hotexit]) {[m
[31m-    lua_assert(J->state == LJ_TRACE_IDLE);[m
[31m-    /* J->parent is non-zero for a side trace. */[m
[31m-    J->state = LJ_TRACE_START;[m
[31m-    lj_trace_ins(J, pc);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* Stitch a new trace to the previous trace. */[m
[31m-void LJ_FASTCALL lj_trace_stitch(jit_State *J, const BCIns *pc)[m
[31m-{[m
[31m-  /* Only start a new trace if not recording or inside __gc call or vmevent. */[m
[31m-  if (J->state == LJ_TRACE_IDLE &&[m
[31m-      !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) {[m
[31m-    J->parent = 0;  /* Have to treat it like a root trace. */[m
[31m-    /* J->exitno is set to the invoking trace. */[m
[31m-    J->state = LJ_TRACE_START;[m
[31m-    lj_trace_ins(J, pc);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Tiny struct to pass data to protected call. */[m
[31m-typedef struct ExitDataCP {[m
[31m-  jit_State *J;[m
[31m-  void *exptr;		/* Pointer to exit state. */[m
[31m-  const BCIns *pc;	/* Restart interpreter at this PC. */[m
[31m-} ExitDataCP;[m
[31m-[m
[31m-/* Need to protect lj_snap_restore because it may throw. */[m
[31m-static TValue *trace_exit_cp(lua_State *L, lua_CFunction dummy, void *ud)[m
[31m-{[m
[31m-  ExitDataCP *exd = (ExitDataCP *)ud;[m
[31m-  cframe_errfunc(L->cframe) = -1;  /* Inherit error function. */[m
[31m-  exd->pc = lj_snap_restore(exd->J, exd->exptr);[m
[31m-  UNUSED(dummy);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#ifndef LUAJIT_DISABLE_VMEVENT[m
[31m-/* Push all registers from exit state. */[m
[31m-static void trace_exit_regs(lua_State *L, ExitState *ex)[m
[31m-{[m
[31m-  int32_t i;[m
[31m-  setintV(L->top++, RID_NUM_GPR);[m
[31m-  setintV(L->top++, RID_NUM_FPR);[m
[31m-  for (i = 0; i < RID_NUM_GPR; i++) {[m
[31m-    if (sizeof(ex->gpr[i]) == sizeof(int32_t))[m
[31m-      setintV(L->top++, (int32_t)ex->gpr[i]);[m
[31m-    else[m
[31m-      setnumV(L->top++, (lua_Number)ex->gpr[i]);[m
[31m-  }[m
[31m-#if !LJ_SOFTFP[m
[31m-  for (i = 0; i < RID_NUM_FPR; i++) {[m
[31m-    setnumV(L->top, ex->fpr[i]);[m
[31m-    if (LJ_UNLIKELY(tvisnan(L->top)))[m
[31m-      setnanV(L->top);[m
[31m-    L->top++;[m
[31m-  }[m
[31m-#endif[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#ifdef EXITSTATE_PCREG[m
[31m-/* Determine trace number from pc of exit instruction. */[m
[31m-static TraceNo trace_exit_find(jit_State *J, MCode *pc)[m
[31m-{[m
[31m-  TraceNo traceno;[m
[31m-  for (traceno = 1; traceno < J->sizetrace; traceno++) {[m
[31m-    GCtrace *T = traceref(J, traceno);[m
[31m-    if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode))[m
[31m-      return traceno;[m
[31m-  }[m
[31m-  lua_assert(0);[m
[31m-  return 0;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* A trace exited. Restore interpreter state. */[m
[31m-int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)[m
[31m-{[m
[31m-  ERRNO_SAVE[m
[31m-  lua_State *L = J->L;[m
[31m-  ExitState *ex = (ExitState *)exptr;[m
[31m-  ExitDataCP exd;[m
[31m-  int errcode;[m
[31m-  const BCIns *pc;[m
[31m-  void *cf;[m
[31m-  GCtrace *T;[m
[31m-#ifdef EXITSTATE_PCREG[m
[31m-  J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]);[m
[31m-#endif[m
[31m-  T = traceref(J, J->parent); UNUSED(T);[m
[31m-#ifdef EXITSTATE_CHECKEXIT[m
[31m-  if (J->exitno == T->nsnap) {  /* Treat stack check like a parent exit. */[m
[31m-    lua_assert(T->root != 0);[m
[31m-    J->exitno = T->ir[REF_BASE].op2;[m
[31m-    J->parent = T->ir[REF_BASE].op1;[m
[31m-    T = traceref(J, J->parent);[m
[31m-  }[m
[31m-#endif[m
[31m-  lua_assert(T != NULL && J->exitno < T->nsnap);[m
[31m-  exd.J = J;[m
[31m-  exd.exptr = exptr;[m
[31m-  errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);[m
[31m-  if (errcode)[m
[31m-    return -errcode;  /* Return negated error code. */[m
[31m-[m
[31m-  if (!(LJ_HASPROFILE && (G(L)->hookmask & HOOK_PROFILE)))[m
[31m-    lj_vmevent_send(L, TEXIT,[m
[31m-      lj_state_checkstack(L, 4+RID_NUM_GPR+RID_NUM_FPR+LUA_MINSTACK);[m
[31m-      setintV(L->top++, J->parent);[m
[31m-      setintV(L->top++, J->exitno);[m
[31m-      trace_exit_regs(L, ex);[m
[31m-    );[m
[31m-[m
[31m-  pc = exd.pc;[m
[31m-  cf = cframe_raw(L->cframe);[m
[31m-  setcframe_pc(cf, pc);[m
[31m-[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  /*[m
[31m-  ** DEBUGGING: Check GC objects in current stack.[m
[31m-  ** NOTE: THIS IS EXPENSIVE -- DON'T LEAVE PERMANENTLY ENABLED![m
[31m-  */[m
[31m-  {[m
[31m-    TValue *o, *top = L->top;[m
[31m-    for (o = tvref(L->stack)+1; o < top; o++) {[m
[31m-      tvchecklive(L, o);[m
[31m-    }[m
[31m-  }[m
[31m-#endif[m
[31m-[m
[31m-  if (LJ_HASPROFILE && (G(L)->hookmask & HOOK_PROFILE)) {[m
[31m-    /* Just exit to interpreter. */[m
[31m-  } else if (G(L)->gc.state == GCSatomic || G(L)->gc.state == GCSfinalize) {[m
[31m-    if (!(G(L)->hookmask & HOOK_GC))[m
[31m-      lj_gc_step(L);  /* Exited because of GC: drive GC forward. */[m
[31m-  } else {[m
[31m-    trace_hotside(J, pc);[m
[31m-  }[m
[31m-  if (bc_op(*pc) == BC_JLOOP) {[m
[31m-    BCIns *retpc = &traceref(J, bc_d(*pc))->startins;[m
[31m-    if (bc_isret(bc_op(*retpc))) {[m
[31m-      if (J->state == LJ_TRACE_RECORD) {[m
[31m-	J->patchins = *pc;[m
[31m-	J->patchpc = (BCIns *)pc;[m
[31m-	*J->patchpc = *retpc;[m
[31m-	J->bcskip = 1;[m
[31m-      } else {[m
[31m-	pc = retpc;[m
[31m-	setcframe_pc(cf, pc);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-  lj_log_trace_normal_exit(L, (int) T->traceno, pc);[m
[31m-#endif[m
[31m-  /* Return MULTRES or 0. */[m
[31m-  ERRNO_RESTORE[m
[31m-  switch (bc_op(*pc)) {[m
[31m-  case BC_CALLM: case BC_CALLMT:[m
[31m-    return (int)((BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc) + LJ_FR2);[m
[31m-  case BC_RETM:[m
[31m-    return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc));[m
[31m-  case BC_TSETM:[m
[31m-    return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc));[m
[31m-  default:[m
[31m-    if (bc_op(*pc) >= BC_FUNCF)[m
[31m-      return (int)((BCReg)(L->top - L->base) + 1);[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_trace.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_trace.h[m
[1mdeleted file mode 100644[m
[1mindex 6faa1aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_trace.h[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-/*[m
[31m-** Trace management.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_TRACE_H[m
[31m-#define _LJ_TRACE_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-#include "lj_jit.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-[m
[31m-/* Trace errors. */[m
[31m-typedef enum {[m
[31m-#define TREDEF(name, msg)	LJ_TRERR_##name,[m
[31m-#include "lj_traceerr.h"[m
[31m-  LJ_TRERR__MAX[m
[31m-} TraceError;[m
[31m-[m
[31m-LJ_FUNC_NORET void lj_trace_err(jit_State *J, TraceError e);[m
[31m-LJ_FUNC_NORET void lj_trace_err_info(jit_State *J, TraceError e);[m
[31m-[m
[31m-/* Trace management. */[m
[31m-LJ_FUNC void LJ_FASTCALL lj_trace_free(global_State *g, GCtrace *T);[m
[31m-LJ_FUNC void lj_trace_reenableproto(GCproto *pt);[m
[31m-LJ_FUNC void lj_trace_flushproto(global_State *g, GCproto *pt);[m
[31m-LJ_FUNC void lj_trace_flush(jit_State *J, TraceNo traceno);[m
[31m-LJ_FUNC int lj_trace_flushall(lua_State *L);[m
[31m-LJ_FUNC void lj_trace_initstate(global_State *g);[m
[31m-LJ_FUNC void lj_trace_freestate(global_State *g);[m
[31m-[m
[31m-/* Event handling. */[m
[31m-LJ_FUNC void lj_trace_ins(jit_State *J, const BCIns *pc);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc);[m
[31m-LJ_FUNCA void LJ_FASTCALL lj_trace_stitch(jit_State *J, const BCIns *pc);[m
[31m-LJ_FUNCA int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr);[m
[31m-[m
[31m-/* Signal asynchronous abort of trace or end of trace. */[m
[31m-#define lj_trace_abort(g)	(G2J(g)->state &= ~LJ_TRACE_ACTIVE)[m
[31m-#define lj_trace_end(J)		(J->state = LJ_TRACE_END)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define lj_trace_flushall(L)	(UNUSED(L), 0)[m
[31m-#define lj_trace_initstate(g)	UNUSED(g)[m
[31m-#define lj_trace_freestate(g)	UNUSED(g)[m
[31m-#define lj_trace_abort(g)	UNUSED(g)[m
[31m-#define lj_trace_end(J)		UNUSED(J)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_traceerr.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_traceerr.h[m
[1mdeleted file mode 100644[m
[1mindex 9c01ffb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_traceerr.h[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-/*[m
[31m-** Trace compiler error messages.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/* This file may be included multiple times with different TREDEF macros. */[m
[31m-[m
[31m-/* Recording. */[m
[31m-TREDEF(RECERR,	"error thrown or hook called during recording")[m
[31m-TREDEF(TRACEUV,	"trace too short")[m
[31m-TREDEF(TRACEOV,	"trace too long")[m
[31m-TREDEF(STACKOV,	"trace too deep")[m
[31m-TREDEF(SNAPOV,	"too many snapshots")[m
[31m-TREDEF(BLACKL,	"blacklisted")[m
[31m-TREDEF(RETRY,	"retry recording")[m
[31m-TREDEF(NYIBC,	"NYI: bytecode %d")[m
[31m-[m
[31m-/* Recording loop ops. */[m
[31m-TREDEF(LLEAVE,	"leaving loop in root trace")[m
[31m-TREDEF(LINNER,	"inner loop in root trace")[m
[31m-TREDEF(LUNROLL,	"loop unroll limit reached")[m
[31m-[m
[31m-/* Recording calls/returns. */[m
[31m-TREDEF(BADTYPE,	"bad argument type")[m
[31m-TREDEF(CJITOFF,	"JIT compilation disabled for function")[m
[31m-TREDEF(CUNROLL,	"call unroll limit reached")[m
[31m-TREDEF(DOWNREC,	"down-recursion, restarting")[m
[31m-TREDEF(NYIFFU,	"NYI: unsupported variant of FastFunc %s")[m
[31m-TREDEF(NYIRETL,	"NYI: return to lower frame")[m
[31m-[m
[31m-/* Recording indexed load/store. */[m
[31m-TREDEF(STORENN,	"store with nil or NaN key")[m
[31m-TREDEF(NOMM,	"missing metamethod")[m
[31m-TREDEF(IDXLOOP,	"looping index lookup")[m
[31m-TREDEF(NYITMIX,	"NYI: mixed sparse/dense table")[m
[31m-[m
[31m-/* Recording C data operations. */[m
[31m-TREDEF(NOCACHE,	"symbol not in cache")[m
[31m-TREDEF(NYICONV,	"NYI: unsupported C type conversion")[m
[31m-TREDEF(NYICALL,	"NYI: unsupported C function type")[m
[31m-[m
[31m-/* Optimizations. */[m
[31m-TREDEF(GFAIL,	"guard would always fail")[m
[31m-TREDEF(PHIOV,	"too many PHIs")[m
[31m-TREDEF(TYPEINS,	"persistent type instability")[m
[31m-[m
[31m-/* Assembler. */[m
[31m-TREDEF(MCODEAL,	"failed to allocate mcode memory")[m
[31m-TREDEF(MCODEOV,	"machine code too long")[m
[31m-TREDEF(MCODELM,	"hit mcode limit (retrying)")[m
[31m-TREDEF(SPILLOV,	"too many spill slots")[m
[31m-TREDEF(BADRA,	"inconsistent register allocation")[m
[31m-TREDEF(NYIIR,	"NYI: cannot assemble IR instruction %d")[m
[31m-TREDEF(NYIPHI,	"NYI: PHI shuffling too complex")[m
[31m-TREDEF(NYICOAL,	"NYI: register coalescing too complex")[m
[31m-[m
[31m-#undef TREDEF[m
[31m-[m
[31m-/* Detecting unused error messages:[m
[31m-   awk -F, '/^TREDEF/ { gsub(/TREDEF./, ""); printf "grep -q LJ_TRERR_%s *.[ch] || echo %s\n", $1, $1}' lj_traceerr.h | sh[m
[31m-*/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_udata.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_udata.c[m
[1mdeleted file mode 100644[m
[1mindex 71697a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_udata.c[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-/*[m
[31m-** Userdata handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_udata_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_gc.h"[m
[31m-#include "lj_udata.h"[m
[31m-[m
[31m-GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env)[m
[31m-{[m
[31m-  GCudata *ud = lj_mem_newt(L, sizeof(GCudata) + sz, GCudata);[m
[31m-  global_State *g = G(L);[m
[31m-  newwhite(g, ud);  /* Not finalized. */[m
[31m-  ud->gct = ~LJ_TUDATA;[m
[31m-  ud->udtype = UDTYPE_USERDATA;[m
[31m-  ud->len = sz;[m
[31m-  /* NOBARRIER: The GCudata is new (marked white). */[m
[31m-  setgcrefnull(ud->metatable);[m
[31m-  setgcref(ud->env, obj2gco(env));[m
[31m-  /* Chain to userdata list (after main thread). */[m
[31m-  setgcrefr(ud->nextgc, mainthread(g)->nextgc);[m
[31m-  setgcref(mainthread(g)->nextgc, obj2gco(ud));[m
[31m-  return ud;[m
[31m-}[m
[31m-[m
[31m-void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud)[m
[31m-{[m
[31m-  lj_mem_free(g, ud, sizeudata(ud));[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_udata.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_udata.h[m
[1mdeleted file mode 100644[m
[1mindex 81c1581..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_udata.h[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-/*[m
[31m-** Userdata handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_UDATA_H[m
[31m-#define _LJ_UDATA_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-LJ_FUNC GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env);[m
[31m-LJ_FUNC void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vm.h[m
[1mdeleted file mode 100644[m
[1mindex be35295..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vm.h[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-/*[m
[31m-** Assembler VM interface definitions.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_VM_H[m
[31m-#define _LJ_VM_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Entry points for ASM parts of VM. */[m
[31m-LJ_ASMF void lj_vm_call(lua_State *L, TValue *base, int nres1);[m
[31m-LJ_ASMF int lj_vm_pcall(lua_State *L, TValue *base, int nres1, ptrdiff_t ef);[m
[31m-typedef TValue *(*lua_CPFunction)(lua_State *L, lua_CFunction func, void *ud);[m
[31m-LJ_ASMF int lj_vm_cpcall(lua_State *L, lua_CFunction func, void *ud,[m
[31m-			 lua_CPFunction cp);[m
[31m-LJ_ASMF int lj_vm_resume(lua_State *L, TValue *base, int nres1, ptrdiff_t ef);[m
[31m-LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_c(void *cframe, int errcode);[m
[31m-LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_ff(void *cframe);[m
[31m-LJ_ASMF void lj_vm_unwind_c_eh(void);[m
[31m-LJ_ASMF void lj_vm_unwind_ff_eh(void);[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-LJ_ASMF void lj_vm_unwind_rethrow(void);[m
[31m-#endif[m
[31m-[m
[31m-/* Miscellaneous functions. */[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-LJ_ASMF int lj_vm_cpuid(uint32_t f, uint32_t res[4]);[m
[31m-#endif[m
[31m-#if LJ_TARGET_PPC[m
[31m-void lj_vm_cachesync(void *start, void *end);[m
[31m-#endif[m
[31m-LJ_ASMF double lj_vm_foldarith(double x, double y, int op);[m
[31m-#if LJ_HASJIT[m
[31m-LJ_ASMF double lj_vm_foldfpm(double x, int op);[m
[31m-#endif[m
[31m-#if !LJ_ARCH_HASFPU[m
[31m-/* Declared in lj_obj.h: LJ_ASMF int32_t lj_vm_tobit(double x); */[m
[31m-#endif[m
[31m-[m
[31m-/* Dispatch targets for recording and hooks. */[m
[31m-LJ_ASMF void lj_vm_record(void);[m
[31m-LJ_ASMF void lj_vm_inshook(void);[m
[31m-LJ_ASMF void lj_vm_rethook(void);[m
[31m-LJ_ASMF void lj_vm_callhook(void);[m
[31m-LJ_ASMF void lj_vm_profhook(void);[m
[31m-[m
[31m-/* Trace exit handling. */[m
[31m-LJ_ASMF void lj_vm_exit_handler(void);[m
[31m-LJ_ASMF void lj_vm_exit_interp(void);[m
[31m-[m
[31m-/* Internal math helper functions. */[m
[31m-#if LJ_TARGET_PPC || LJ_TARGET_ARM64 || (LJ_TARGET_MIPS && LJ_ABI_SOFTFP)[m
[31m-#define lj_vm_floor	floor[m
[31m-#define lj_vm_ceil	ceil[m
[31m-#else[m
[31m-LJ_ASMF double lj_vm_floor(double);[m
[31m-LJ_ASMF double lj_vm_ceil(double);[m
[31m-#if LJ_TARGET_ARM[m
[31m-LJ_ASMF double lj_vm_floor_sf(double);[m
[31m-LJ_ASMF double lj_vm_ceil_sf(double);[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef LUAJIT_NO_LOG2[m
[31m-LJ_ASMF double lj_vm_log2(double);[m
[31m-#else[m
[31m-#define lj_vm_log2	log2[m
[31m-#endif[m
[31m-#if !(defined(_LJ_DISPATCH_H) && LJ_TARGET_MIPS)[m
[31m-LJ_ASMF int32_t LJ_FASTCALL lj_vm_modi(int32_t, int32_t);[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-#if LJ_TARGET_X86ORX64[m
[31m-LJ_ASMF void lj_vm_floor_sse(void);[m
[31m-LJ_ASMF void lj_vm_ceil_sse(void);[m
[31m-LJ_ASMF void lj_vm_trunc_sse(void);[m
[31m-LJ_ASMF void lj_vm_powi_sse(void);[m
[31m-#define lj_vm_powi	NULL[m
[31m-#else[m
[31m-LJ_ASMF double lj_vm_powi(double, int32_t);[m
[31m-#endif[m
[31m-#if LJ_TARGET_PPC || LJ_TARGET_ARM64[m
[31m-#define lj_vm_trunc	trunc[m
[31m-#else[m
[31m-LJ_ASMF double lj_vm_trunc(double);[m
[31m-#if LJ_TARGET_ARM[m
[31m-LJ_ASMF double lj_vm_trunc_sf(double);[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef LUAJIT_NO_EXP2[m
[31m-LJ_ASMF double lj_vm_exp2(double);[m
[31m-#else[m
[31m-#define lj_vm_exp2	exp2[m
[31m-#endif[m
[31m-#if LJ_HASFFI[m
[31m-LJ_ASMF int lj_vm_errno(void);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-/* Continuations for metamethods. */[m
[31m-LJ_ASMF void lj_cont_cat(void);  /* Continue with concatenation. */[m
[31m-LJ_ASMF void lj_cont_ra(void);  /* Store result in RA from instruction. */[m
[31m-LJ_ASMF void lj_cont_nop(void);  /* Do nothing, just continue execution. */[m
[31m-LJ_ASMF void lj_cont_condt(void);  /* Branch if result is true. */[m
[31m-LJ_ASMF void lj_cont_condf(void);  /* Branch if result is false. */[m
[31m-LJ_ASMF void lj_cont_hook(void);  /* Continue from hook yield. */[m
[31m-LJ_ASMF void lj_cont_stitch(void);  /* Trace stitching. */[m
[31m-[m
[31m-/* Start of the ASM code. */[m
[31m-LJ_ASMF char lj_vm_asm_begin[];[m
[31m-[m
[31m-/* Bytecode offsets are relative to lj_vm_asm_begin. */[m
[31m-#define makeasmfunc(ofs)	((ASMFunction)(lj_vm_asm_begin + (ofs)))[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmevent.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmevent.c[m
[1mdeleted file mode 100644[m
[1mindex 3acdd25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmevent.c[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-/*[m
[31m-** VM event handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define lj_vmevent_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_str.h"[m
[31m-#include "lj_tab.h"[m
[31m-#include "lj_state.h"[m
[31m-#include "lj_dispatch.h"[m
[31m-#include "lj_vm.h"[m
[31m-#include "lj_vmevent.h"[m
[31m-[m
[31m-ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  GCstr *s = lj_str_newlit(L, LJ_VMEVENTS_REGKEY);[m
[31m-  cTValue *tv = lj_tab_getstr(tabV(registry(L)), s);[m
[31m-  if (tvistab(tv)) {[m
[31m-    int hash = VMEVENT_HASH(ev);[m
[31m-    tv = lj_tab_getint(tabV(tv), hash);[m
[31m-    if (tv && tvisfunc(tv)) {[m
[31m-      lj_state_checkstack(L, LUA_MINSTACK);[m
[31m-      setfuncV(L, L->top++, funcV(tv));[m
[31m-      if (LJ_FR2) setnilV(L->top++);[m
[31m-      return savestack(L, L->top);[m
[31m-    }[m
[31m-  }[m
[31m-  g->vmevmask &= ~VMEVENT_MASK(ev);  /* No handler: cache this fact. */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-void lj_vmevent_call(lua_State *L, ptrdiff_t argbase)[m
[31m-{[m
[31m-  global_State *g = G(L);[m
[31m-  uint8_t oldmask = g->vmevmask;[m
[31m-  uint8_t oldh = hook_save(g);[m
[31m-  int status;[m
[31m-  g->vmevmask = 0;  /* Disable all events. */[m
[31m-  hook_vmevent(g);[m
[31m-  status = lj_vm_pcall(L, restorestack(L, argbase), 0+1, 0);[m
[31m-  if (LJ_UNLIKELY(status)) {[m
[31m-    /* Really shouldn't use stderr here, but where else to complain? */[m
[31m-    L->top--;[m
[31m-    fputs("VM handler failed: ", stderr);[m
[31m-    fputs(tvisstr(L->top) ? strVdata(L->top) : "?", stderr);[m
[31m-    fputc('\n', stderr);[m
[31m-  }[m
[31m-  hook_restore(g, oldh);[m
[31m-  if (g->vmevmask != VMEVENT_NOCACHE)[m
[31m-    g->vmevmask = oldmask;  /* Restore event mask, but not if not modified. */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmevent.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmevent.h[m
[1mdeleted file mode 100644[m
[1mindex b9495b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmevent.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-/*[m
[31m-** VM event handling.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LJ_VMEVENT_H[m
[31m-#define _LJ_VMEVENT_H[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-[m
[31m-/* Registry key for VM event handler table. */[m
[31m-#define LJ_VMEVENTS_REGKEY	"_VMEVENTS"[m
[31m-#define LJ_VMEVENTS_HSIZE	4[m
[31m-[m
[31m-#define VMEVENT_MASK(ev)	((uint8_t)1 << ((int)(ev) & 7))[m
[31m-#define VMEVENT_HASH(ev)	((int)(ev) & ~7)[m
[31m-#define VMEVENT_HASHIDX(h)	((int)(h) << 3)[m
[31m-#define VMEVENT_NOCACHE		255[m
[31m-[m
[31m-#define VMEVENT_DEF(name, hash) \[m
[31m-  LJ_VMEVENT_##name##_, \[m
[31m-  LJ_VMEVENT_##name = ((LJ_VMEVENT_##name##_) & 7)|((hash) << 3)[m
[31m-[m
[31m-/* VM event IDs. */[m
[31m-typedef enum {[m
[31m-  VMEVENT_DEF(BC,	0x00003883),[m
[31m-  VMEVENT_DEF(TRACE,	0xb2d91467),[m
[31m-  VMEVENT_DEF(RECORD,	0x9284bf4f),[m
[31m-  VMEVENT_DEF(TEXIT,	0xb29df2b0),[m
[31m-  LJ_VMEVENT__MAX[m
[31m-} VMEvent;[m
[31m-[m
[31m-#ifdef LUAJIT_DISABLE_VMEVENT[m
[31m-#define lj_vmevent_send(L, ev, args)		UNUSED(L)[m
[31m-#define lj_vmevent_send_(L, ev, args, post)	UNUSED(L)[m
[31m-#else[m
[31m-#define lj_vmevent_send(L, ev, args) \[m
[31m-  if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \[m
[31m-    ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \[m
[31m-    if (argbase) { \[m
[31m-      args \[m
[31m-      lj_vmevent_call(L, argbase); \[m
[31m-    } \[m
[31m-  }[m
[31m-#define lj_vmevent_send_(L, ev, args, post) \[m
[31m-  if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \[m
[31m-    ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \[m
[31m-    if (argbase) { \[m
[31m-      args \[m
[31m-      lj_vmevent_call(L, argbase); \[m
[31m-      post \[m
[31m-    } \[m
[31m-  }[m
[31m-[m
[31m-LJ_FUNC ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev);[m
[31m-LJ_FUNC void lj_vmevent_call(lua_State *L, ptrdiff_t argbase);[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmmath.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmmath.c[m
[1mdeleted file mode 100644[m
[1mindex e662265..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lj_vmmath.c[m
[1m+++ /dev/null[m
[36m@@ -1,152 +0,0 @@[m
[31m-/*[m
[31m-** Math helper functions for assembler VM.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#define lj_vmmath_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <math.h>[m
[31m-[m
[31m-#include "lj_obj.h"[m
[31m-#include "lj_ir.h"[m
[31m-#include "lj_vm.h"[m
[31m-[m
[31m-/* -- Wrapper functions --------------------------------------------------- */[m
[31m-[m
[31m-#if LJ_TARGET_X86 && __ELF__ && __PIC__[m
[31m-/* Wrapper functions to deal with the ELF/x86 PIC disaster. */[m
[31m-LJ_FUNCA double lj_wrap_log(double x) { return log(x); }[m
[31m-LJ_FUNCA double lj_wrap_log10(double x) { return log10(x); }[m
[31m-LJ_FUNCA double lj_wrap_exp(double x) { return exp(x); }[m
[31m-LJ_FUNCA double lj_wrap_sin(double x) { return sin(x); }[m
[31m-LJ_FUNCA double lj_wrap_cos(double x) { return cos(x); }[m
[31m-LJ_FUNCA double lj_wrap_tan(double x) { return tan(x); }[m
[31m-LJ_FUNCA double lj_wrap_asin(double x) { return asin(x); }[m
[31m-LJ_FUNCA double lj_wrap_acos(double x) { return acos(x); }[m
[31m-LJ_FUNCA double lj_wrap_atan(double x) { return atan(x); }[m
[31m-LJ_FUNCA double lj_wrap_sinh(double x) { return sinh(x); }[m
[31m-LJ_FUNCA double lj_wrap_cosh(double x) { return cosh(x); }[m
[31m-LJ_FUNCA double lj_wrap_tanh(double x) { return tanh(x); }[m
[31m-LJ_FUNCA double lj_wrap_atan2(double x, double y) { return atan2(x, y); }[m
[31m-LJ_FUNCA double lj_wrap_pow(double x, double y) { return pow(x, y); }[m
[31m-LJ_FUNCA double lj_wrap_fmod(double x, double y) { return fmod(x, y); }[m
[31m-#endif[m
[31m-[m
[31m-/* -- Helper functions for generated machine code ------------------------- */[m
[31m-[m
[31m-double lj_vm_foldarith(double x, double y, int op)[m
[31m-{[m
[31m-  switch (op) {[m
[31m-  case IR_ADD - IR_ADD: return x+y; break;[m
[31m-  case IR_SUB - IR_ADD: return x-y; break;[m
[31m-  case IR_MUL - IR_ADD: return x*y; break;[m
[31m-  case IR_DIV - IR_ADD: return x/y; break;[m
[31m-  case IR_MOD - IR_ADD: return x-lj_vm_floor(x/y)*y; break;[m
[31m-  case IR_POW - IR_ADD: return pow(x, y); break;[m
[31m-  case IR_NEG - IR_ADD: return -x; break;[m
[31m-  case IR_ABS - IR_ADD: return fabs(x); break;[m
[31m-#if LJ_HASJIT[m
[31m-  case IR_ATAN2 - IR_ADD: return atan2(x, y); break;[m
[31m-  case IR_LDEXP - IR_ADD: return ldexp(x, (int)y); break;[m
[31m-  case IR_MIN - IR_ADD: return x > y ? y : x; break;[m
[31m-  case IR_MAX - IR_ADD: return x < y ? y : x; break;[m
[31m-#endif[m
[31m-  default: return x;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-#if (LJ_HASJIT && !(LJ_TARGET_ARM || LJ_TARGET_ARM64 || LJ_TARGET_PPC)) || LJ_TARGET_MIPS[m
[31m-int32_t LJ_FASTCALL lj_vm_modi(int32_t a, int32_t b)[m
[31m-{[m
[31m-  uint32_t y, ua, ub;[m
[31m-  lua_assert(b != 0);  /* This must be checked before using this function. */[m
[31m-  ua = a < 0 ? (uint32_t)-a : (uint32_t)a;[m
[31m-  ub = b < 0 ? (uint32_t)-b : (uint32_t)b;[m
[31m-  y = ua % ub;[m
[31m-  if (y != 0 && (a^b) < 0) y = y - ub;[m
[31m-  if (((int32_t)y^b) < 0) y = (uint32_t)-(int32_t)y;[m
[31m-  return (int32_t)y;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if LJ_HASJIT[m
[31m-[m
[31m-#ifdef LUAJIT_NO_LOG2[m
[31m-double lj_vm_log2(double a)[m
[31m-{[m
[31m-  return log(a) * 1.4426950408889634074;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#ifdef LUAJIT_NO_EXP2[m
[31m-double lj_vm_exp2(double a)[m
[31m-{[m
[31m-  return exp(a * 0.6931471805599453);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_TARGET_X86ORX64[m
[31m-/* Unsigned x^k. */[m
[31m-static double lj_vm_powui(double x, uint32_t k)[m
[31m-{[m
[31m-  double y;[m
[31m-  lua_assert(k != 0);[m
[31m-  for (; (k & 1) == 0; k >>= 1) x *= x;[m
[31m-  y = x;[m
[31m-  if ((k >>= 1) != 0) {[m
[31m-    for (;;) {[m
[31m-      x *= x;[m
[31m-      if (k == 1) break;[m
[31m-      if (k & 1) y *= x;[m
[31m-      k >>= 1;[m
[31m-    }[m
[31m-    y *= x;[m
[31m-  }[m
[31m-  return y;[m
[31m-}[m
[31m-[m
[31m-/* Signed x^k. */[m
[31m-double lj_vm_powi(double x, int32_t k)[m
[31m-{[m
[31m-  if (k > 1)[m
[31m-    return lj_vm_powui(x, (uint32_t)k);[m
[31m-  else if (k == 1)[m
[31m-    return x;[m
[31m-  else if (k == 0)[m
[31m-    return 1.0;[m
[31m-  else[m
[31m-    return 1.0 / lj_vm_powui(x, (uint32_t)-k);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Computes fpm(x) for extended math functions. */[m
[31m-double lj_vm_foldfpm(double x, int fpm)[m
[31m-{[m
[31m-  switch (fpm) {[m
[31m-  case IRFPM_FLOOR: return lj_vm_floor(x);[m
[31m-  case IRFPM_CEIL: return lj_vm_ceil(x);[m
[31m-  case IRFPM_TRUNC: return lj_vm_trunc(x);[m
[31m-  case IRFPM_SQRT: return sqrt(x);[m
[31m-  case IRFPM_EXP: return exp(x);[m
[31m-  case IRFPM_EXP2: return lj_vm_exp2(x);[m
[31m-  case IRFPM_LOG: return log(x);[m
[31m-  case IRFPM_LOG2: return lj_vm_log2(x);[m
[31m-  case IRFPM_LOG10: return log10(x);[m
[31m-  case IRFPM_SIN: return sin(x);[m
[31m-  case IRFPM_COS: return cos(x);[m
[31m-  case IRFPM_TAN: return tan(x);[m
[31m-  default: lua_assert(0);[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-#if LJ_HASFFI[m
[31m-int lj_vm_errno(void)[m
[31m-{[m
[31m-  return errno;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/ljamalg.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/ljamalg.c[m
[1mdeleted file mode 100644[m
[1mindex 4c44de2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/ljamalg.c[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT core and libraries amalgamation.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-/*[m
[31m-+--------------------------------------------------------------------------+[m
[31m-| WARNING: Compiling the amalgamation needs a lot of virtual memory        |[m
[31m-| (around 300 MB with GCC 4.x)! If you don't have enough physical memory   |[m
[31m-| your machine will start swapping to disk and the compile will not finish |[m
[31m-| within a reasonable amount of time.                                      |[m
[31m-| So either compile on a bigger machine or use the non-amalgamated build.  |[m
[31m-+--------------------------------------------------------------------------+[m
[31m-*/[m
[31m-[m
[31m-#define ljamalg_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-/* To get the mremap prototype. Must be defined before any system includes. */[m
[31m-#if defined(__linux__) && !defined(_GNU_SOURCE)[m
[31m-#define _GNU_SOURCE[m
[31m-#endif[m
[31m-[m
[31m-#ifndef WINVER[m
[31m-#define WINVER 0x0501[m
[31m-#endif[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "lj_gc.c"[m
[31m-#include "lj_err.c"[m
[31m-#include "lj_char.c"[m
[31m-#include "lj_bc.c"[m
[31m-#include "lj_obj.c"[m
[31m-#include "lj_buf.c"[m
[31m-#include "lj_str.c"[m
[31m-#include "lj_tab.c"[m
[31m-#include "lj_func.c"[m
[31m-#include "lj_udata.c"[m
[31m-#include "lj_meta.c"[m
[31m-#include "lj_debug.c"[m
[31m-#include "lj_state.c"[m
[31m-#include "lj_dispatch.c"[m
[31m-#include "lj_vmevent.c"[m
[31m-#include "lj_vmmath.c"[m
[31m-#include "lj_strscan.c"[m
[31m-#include "lj_strfmt.c"[m
[31m-#include "lj_strfmt_num.c"[m
[31m-#include "lj_api.c"[m
[31m-#include "lj_profile.c"[m
[31m-#include "lj_lex.c"[m
[31m-#include "lj_parse.c"[m
[31m-#include "lj_bcread.c"[m
[31m-#include "lj_bcwrite.c"[m
[31m-#include "lj_load.c"[m
[31m-#include "lj_ctype.c"[m
[31m-#include "lj_cdata.c"[m
[31m-#include "lj_cconv.c"[m
[31m-#include "lj_ccall.c"[m
[31m-#include "lj_ccallback.c"[m
[31m-#include "lj_carith.c"[m
[31m-#include "lj_clib.c"[m
[31m-#include "lj_cparse.c"[m
[31m-#include "lj_lib.c"[m
[31m-#include "lj_ir.c"[m
[31m-#include "lj_opt_mem.c"[m
[31m-#include "lj_opt_fold.c"[m
[31m-#include "lj_opt_narrow.c"[m
[31m-#include "lj_opt_dce.c"[m
[31m-#include "lj_opt_loop.c"[m
[31m-#include "lj_opt_split.c"[m
[31m-#include "lj_opt_sink.c"[m
[31m-#include "lj_mcode.c"[m
[31m-#include "lj_snap.c"[m
[31m-#include "lj_record.c"[m
[31m-#include "lj_crecord.c"[m
[31m-#include "lj_ffrecord.c"[m
[31m-#include "lj_asm.c"[m
[31m-#include "lj_trace.c"[m
[31m-#include "lj_gdbjit.c"[m
[31m-#include "lj_alloc.c"[m
[31m-[m
[31m-#include "lib_aux.c"[m
[31m-#include "lib_base.c"[m
[31m-#include "lib_math.c"[m
[31m-#include "lib_string.c"[m
[31m-#include "lib_table.c"[m
[31m-#include "lib_io.c"[m
[31m-#include "lib_os.c"[m
[31m-#include "lib_package.c"[m
[31m-#include "lib_debug.c"[m
[31m-#include "lib_bit.c"[m
[31m-#include "lib_jit.c"[m
[31m-#include "lib_ffi.c"[m
[31m-#include "lib_init.c"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lua.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lua.h[m
[1mdeleted file mode 100644[m
[1mindex 352d29f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lua.h[m
[1m+++ /dev/null[m
[36m@@ -1,394 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $[m
[31m-** Lua - An Extensible Extension Language[m
[31m-** Lua.org, PUC-Rio, Brazil (http://www.lua.org)[m
[31m-** See Copyright Notice at the end of this file[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lua_h[m
[31m-#define lua_h[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-#include "luaconf.h"[m
[31m-[m
[31m-[m
[31m-#define LUA_VERSION	"Lua 5.1"[m
[31m-#define LUA_RELEASE	"Lua 5.1.4"[m
[31m-#define LUA_VERSION_NUM	501[m
[31m-#define LUA_COPYRIGHT	"Copyright (C) 1994-2008 Lua.org, PUC-Rio"[m
[31m-#define LUA_AUTHORS	"R. Ierusalimschy, L. H. de Figueiredo & W. Celes"[m
[31m-[m
[31m-[m
[31m-/* mark for precompiled code (`<esc>Lua') */[m
[31m-#define	LUA_SIGNATURE	"\033Lua"[m
[31m-[m
[31m-/* option for multiple returns in `lua_pcall' and `lua_call' */[m
[31m-#define LUA_MULTRET	(-1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** pseudo-indices[m
[31m-*/[m
[31m-#define LUA_REGISTRYINDEX	(-10000)[m
[31m-#define LUA_ENVIRONINDEX	(-10001)[m
[31m-#define LUA_GLOBALSINDEX	(-10002)[m
[31m-#define lua_upvalueindex(i)	(LUA_GLOBALSINDEX-(i))[m
[31m-[m
[31m-[m
[31m-/* thread status; 0 is OK */[m
[31m-#define LUA_YIELD	1[m
[31m-#define LUA_ERRRUN	2[m
[31m-#define LUA_ERRSYNTAX	3[m
[31m-#define LUA_ERRMEM	4[m
[31m-#define LUA_ERRERR	5[m
[31m-[m
[31m-[m
[31m-typedef struct lua_State lua_State;[m
[31m-[m
[31m-typedef int (*lua_CFunction) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** functions that read/write blocks when loading/dumping Lua chunks[m
[31m-*/[m
[31m-typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);[m
[31m-[m
[31m-typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** prototype for memory-allocation functions[m
[31m-*/[m
[31m-typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic types[m
[31m-*/[m
[31m-#define LUA_TNONE		(-1)[m
[31m-[m
[31m-#define LUA_TNIL		0[m
[31m-#define LUA_TBOOLEAN		1[m
[31m-#define LUA_TLIGHTUSERDATA	2[m
[31m-#define LUA_TNUMBER		3[m
[31m-#define LUA_TSTRING		4[m
[31m-#define LUA_TTABLE		5[m
[31m-#define LUA_TFUNCTION		6[m
[31m-#define LUA_TUSERDATA		7[m
[31m-#define LUA_TTHREAD		8[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* minimum Lua stack available to a C function */[m
[31m-#define LUA_MINSTACK	20[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** generic extra include file[m
[31m-*/[m
[31m-#if defined(LUA_USER_H)[m
[31m-#include LUA_USER_H[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* type of numbers in Lua */[m
[31m-typedef LUA_NUMBER lua_Number;[m
[31m-[m
[31m-[m
[31m-/* type for integer functions */[m
[31m-typedef LUA_INTEGER lua_Integer;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** state manipulation[m
[31m-*/[m
[31m-LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);[m
[31m-LUA_API void       (lua_close) (lua_State *L);[m
[31m-LUA_API lua_State *(lua_newthread) (lua_State *L);[m
[31m-[m
[31m-LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic stack manipulation[m
[31m-*/[m
[31m-LUA_API int   (lua_gettop) (lua_State *L);[m
[31m-LUA_API void  (lua_settop) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_pushvalue) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_remove) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_insert) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_replace) (lua_State *L, int idx);[m
[31m-LUA_API int   (lua_checkstack) (lua_State *L, int sz);[m
[31m-[m
[31m-LUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** access functions (stack -> C)[m
[31m-*/[m
[31m-[m
[31m-LUA_API int             (lua_isnumber) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isstring) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_iscfunction) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isuserdata) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_type) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_typename) (lua_State *L, int tp);[m
[31m-[m
[31m-LUA_API int            (lua_equal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_rawequal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_lessthan) (lua_State *L, int idx1, int idx2);[m
[31m-[m
[31m-LUA_API lua_Number      (lua_tonumber) (lua_State *L, int idx);[m
[31m-LUA_API lua_Integer     (lua_tointeger) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_toboolean) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);[m
[31m-LUA_API size_t          (lua_objlen) (lua_State *L, int idx);[m
[31m-LUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);[m
[31m-LUA_API void	       *(lua_touserdata) (lua_State *L, int idx);[m
[31m-LUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);[m
[31m-LUA_API const void     *(lua_topointer) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** push functions (C -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_pushnil) (lua_State *L);[m
[31m-LUA_API void  (lua_pushnumber) (lua_State *L, lua_Number n);[m
[31m-LUA_API void  (lua_pushinteger) (lua_State *L, lua_Integer n);[m
[31m-LUA_API void  (lua_pushlstring) (lua_State *L, const char *s, size_t l);[m
[31m-LUA_API void  (lua_pushstring) (lua_State *L, const char *s);[m
[31m-LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,[m
[31m-                                                      va_list argp);[m
[31m-LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);[m
[31m-LUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);[m
[31m-LUA_API void  (lua_pushboolean) (lua_State *L, int b);[m
[31m-LUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);[m
[31m-LUA_API int   (lua_pushthread) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** get functions (Lua -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_gettable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_getfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawget) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawgeti) (lua_State *L, int idx, int n);[m
[31m-LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);[m
[31m-LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);[m
[31m-LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API void  (lua_getfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** set functions (stack -> Lua)[m
[31m-*/[m
[31m-LUA_API void  (lua_settable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawset) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);[m
[31m-LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API int   (lua_setfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `load' and `call' functions (load and run Lua code)[m
[31m-*/[m
[31m-LUA_API void  (lua_call) (lua_State *L, int nargs, int nresults);[m
[31m-LUA_API int   (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);[m
[31m-LUA_API int   (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);[m
[31m-LUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt,[m
[31m-                                        const char *chunkname);[m
[31m-[m
[31m-LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** coroutine functions[m
[31m-*/[m
[31m-LUA_API int  (lua_yield) (lua_State *L, int nresults);[m
[31m-LUA_API int  (lua_resume) (lua_State *L, int narg);[m
[31m-LUA_API int  (lua_status) (lua_State *L);[m
[31m-[m
[31m-/*[m
[31m-** garbage-collection function and options[m
[31m-*/[m
[31m-[m
[31m-#define LUA_GCSTOP		0[m
[31m-#define LUA_GCRESTART		1[m
[31m-#define LUA_GCCOLLECT		2[m
[31m-#define LUA_GCCOUNT		3[m
[31m-#define LUA_GCCOUNTB		4[m
[31m-#define LUA_GCSTEP		5[m
[31m-#define LUA_GCSETPAUSE		6[m
[31m-#define LUA_GCSETSTEPMUL	7[m
[31m-#define LUA_GCISRUNNING		9[m
[31m-[m
[31m-LUA_API int (lua_gc) (lua_State *L, int what, int data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** miscellaneous functions[m
[31m-*/[m
[31m-[m
[31m-LUA_API int   (lua_error) (lua_State *L);[m
[31m-[m
[31m-LUA_API int   (lua_next) (lua_State *L, int idx);[m
[31m-[m
[31m-LUA_API void  (lua_concat) (lua_State *L, int n);[m
[31m-[m
[31m-LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);[m
[31m-LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define lua_pop(L,n)		lua_settop(L, -(n)-1)[m
[31m-[m
[31m-#define lua_newtable(L)		lua_createtable(L, 0, 0)[m
[31m-[m
[31m-#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))[m
[31m-[m
[31m-#define lua_pushcfunction(L,f)	lua_pushcclosure(L, (f), 0)[m
[31m-[m
[31m-#define lua_strlen(L,i)		lua_objlen(L, (i))[m
[31m-[m
[31m-#define lua_isfunction(L,n)	(lua_type(L, (n)) == LUA_TFUNCTION)[m
[31m-#define lua_istable(L,n)	(lua_type(L, (n)) == LUA_TTABLE)[m
[31m-#define lua_islightuserdata(L,n)	(lua_type(L, (n)) == LUA_TLIGHTUSERDATA)[m
[31m-#define lua_isnil(L,n)		(lua_type(L, (n)) == LUA_TNIL)[m
[31m-#define lua_isboolean(L,n)	(lua_type(L, (n)) == LUA_TBOOLEAN)[m
[31m-#define lua_isthread(L,n)	(lua_type(L, (n)) == LUA_TTHREAD)[m
[31m-#define lua_isnone(L,n)		(lua_type(L, (n)) == LUA_TNONE)[m
[31m-#define lua_isnoneornil(L, n)	(lua_type(L, (n)) <= 0)[m
[31m-[m
[31m-#define lua_pushliteral(L, s)	\[m
[31m-	lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)[m
[31m-[m
[31m-#define lua_setglobal(L,s)	lua_setfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-#define lua_getglobal(L,s)	lua_getfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-[m
[31m-#define lua_tostring(L,i)	lua_tolstring(L, (i), NULL)[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** compatibility macros and functions[m
[31m-*/[m
[31m-[m
[31m-#define lua_open()	luaL_newstate()[m
[31m-[m
[31m-#define lua_getregistry(L)	lua_pushvalue(L, LUA_REGISTRYINDEX)[m
[31m-[m
[31m-#define lua_getgccount(L)	lua_gc(L, LUA_GCCOUNT, 0)[m
[31m-[m
[31m-#define lua_Chunkreader		lua_Reader[m
[31m-#define lua_Chunkwriter		lua_Writer[m
[31m-[m
[31m-[m
[31m-/* hack */[m
[31m-LUA_API void lua_setlevel	(lua_State *from, lua_State *to);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Debug API[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event codes[m
[31m-*/[m
[31m-#define LUA_HOOKCALL	0[m
[31m-#define LUA_HOOKRET	1[m
[31m-#define LUA_HOOKLINE	2[m
[31m-#define LUA_HOOKCOUNT	3[m
[31m-#define LUA_HOOKTAILRET 4[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event masks[m
[31m-*/[m
[31m-#define LUA_MASKCALL	(1 << LUA_HOOKCALL)[m
[31m-#define LUA_MASKRET	(1 << LUA_HOOKRET)[m
[31m-#define LUA_MASKLINE	(1 << LUA_HOOKLINE)[m
[31m-#define LUA_MASKCOUNT	(1 << LUA_HOOKCOUNT)[m
[31m-[m
[31m-typedef struct lua_Debug lua_Debug;  /* activation record */[m
[31m-[m
[31m-[m
[31m-/* Functions to be called by the debuger in specific events */[m
[31m-typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar);[m
[31m-LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);[m
[31m-LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n);[m
[31m-LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n);[m
[31m-LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);[m
[31m-LUA_API lua_Hook lua_gethook (lua_State *L);[m
[31m-LUA_API int lua_gethookmask (lua_State *L);[m
[31m-LUA_API int lua_gethookcount (lua_State *L);[m
[31m-[m
[31m-/* From Lua 5.2. */[m
[31m-LUA_API void *lua_upvalueid (lua_State *L, int idx, int n);[m
[31m-LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2);[m
[31m-LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt,[m
[31m-		       const char *chunkname, const char *mode);[m
[31m-[m
[31m-[m
[31m-struct lua_Debug {[m
[31m-  int event;[m
[31m-  const char *name;	/* (n) */[m
[31m-  const char *namewhat;	/* (n) `global', `local', `field', `method' */[m
[31m-  const char *what;	/* (S) `Lua', `C', `main', `tail' */[m
[31m-  const char *source;	/* (S) */[m
[31m-  int currentline;	/* (l) */[m
[31m-  int nups;		/* (u) number of upvalues */[m
[31m-  int linedefined;	/* (S) */[m
[31m-  int lastlinedefined;	/* (S) */[m
[31m-  char short_src[LUA_IDSIZE]; /* (S) */[m
[31m-  /* private part */[m
[31m-  int i_ci;  /* active function */[m
[31m-};[m
[31m-[m
[31m-/* }====================================================================== */[m
[31m-[m
[31m-[m
[31m-/******************************************************************************[m
[31m-* Copyright (C) 1994-2008 Lua.org, PUC-Rio.  All rights reserved.[m
[31m-*[m
[31m-* Permission is hereby granted, free of charge, to any person obtaining[m
[31m-* a copy of this software and associated documentation files (the[m
[31m-* "Software"), to deal in the Software without restriction, including[m
[31m-* without limitation the rights to use, copy, modify, merge, publish,[m
[31m-* distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-* permit persons to whom the Software is furnished to do so, subject to[m
[31m-* the following conditions:[m
[31m-*[m
[31m-* The above copyright notice and this permission notice shall be[m
[31m-* included in all copies or substantial portions of the Software.[m
[31m-*[m
[31m-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-******************************************************************************/[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lua.hpp b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lua.hpp[m
[1mdeleted file mode 100644[m
[1mindex 07e9002..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lua.hpp[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-// C++ wrapper for LuaJIT header files.[m
[31m-[m
[31m-extern "C" {[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-#include "luajit.h"[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luaconf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luaconf.h[m
[1mdeleted file mode 100644[m
[1mindex 4f7d4d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luaconf.h[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-/*[m
[31m-** Configuration header.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef luaconf_h[m
[31m-#define luaconf_h[m
[31m-[m
[31m-#ifndef WINVER[m
[31m-#define WINVER 0x0501[m
[31m-#endif[m
[31m-#include <limits.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-/* Default path for loading Lua and C modules with require(). */[m
[31m-#if defined(_WIN32)[m
[31m-/*[m
[31m-** In Windows, any exclamation mark ('!') in the path is replaced by the[m
[31m-** path of the directory of the executable file of the current process.[m
[31m-*/[m
[31m-#define LUA_LDIR	"!\\lua\\"[m
[31m-#define LUA_CDIR	"!\\"[m
[31m-#define LUA_PATH_DEFAULT \[m
[31m-  ".\\?.lua;" "!\\lualib\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;"[m
[31m-#define LUA_CPATH_DEFAULT \[m
[31m-  ".\\?.dll;" "!\\lualib\\?.so;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"[m
[31m-#else[m
[31m-/*[m
[31m-** Note to distribution maintainers: do NOT patch the following lines![m
[31m-** Please read ../doc/install.html#distro and pass PREFIX=/usr instead.[m
[31m-*/[m
[31m-#ifndef LUA_MULTILIB[m
[31m-#define LUA_MULTILIB	"lib"[m
[31m-#endif[m
[31m-#ifndef LUA_LMULTILIB[m
[31m-#define LUA_LMULTILIB	"lib"[m
[31m-#endif[m
[31m-#define LUA_LROOT	"/usr/local"[m
[31m-#define LUA_LUADIR	"/lua/5.1/"[m
[31m-#define LUA_LJDIR	"/luajit-2.1.0-beta2/"[m
[31m-[m
[31m-#ifdef LUA_ROOT[m
[31m-#define LUA_JROOT	LUA_ROOT[m
[31m-#define LUA_RLDIR	LUA_ROOT "/share" LUA_LUADIR[m
[31m-#define LUA_RCDIR	LUA_ROOT "/" LUA_MULTILIB LUA_LUADIR[m
[31m-#define LUA_RLPATH	";" LUA_RLDIR "?.lua;" LUA_RLDIR "?/init.lua"[m
[31m-#define LUA_RCPATH	";" LUA_RCDIR "?.so"[m
[31m-#else[m
[31m-#define LUA_JROOT	LUA_LROOT[m
[31m-#define LUA_RLPATH[m
[31m-#define LUA_RCPATH[m
[31m-#endif[m
[31m-[m
[31m-#define LUA_JPATH	";" LUA_JROOT "/share" LUA_LJDIR "?.lua"[m
[31m-#define LUA_LLDIR	LUA_LROOT "/share" LUA_LUADIR[m
[31m-#define LUA_LCDIR	LUA_LROOT "/" LUA_LMULTILIB LUA_LUADIR[m
[31m-#define LUA_LLPATH	";" LUA_LLDIR "?.lua;" LUA_LLDIR "?/init.lua"[m
[31m-#define LUA_LCPATH1	";" LUA_LCDIR "?.so"[m
[31m-#define LUA_LCPATH2	";" LUA_LCDIR "loadall.so"[m
[31m-[m
[31m-#define LUA_PATH_DEFAULT	"./?.lua" LUA_JPATH LUA_LLPATH LUA_RLPATH[m
[31m-#define LUA_CPATH_DEFAULT	"./?.so" LUA_LCPATH1 LUA_RCPATH LUA_LCPATH2[m
[31m-#endif[m
[31m-[m
[31m-/* Environment variable names for path overrides and initialization code. */[m
[31m-#define LUA_PATH	"LUA_PATH"[m
[31m-#define LUA_CPATH	"LUA_CPATH"[m
[31m-#define LUA_INIT	"LUA_INIT"[m
[31m-[m
[31m-/* Special file system characters. */[m
[31m-#if defined(_WIN32)[m
[31m-#define LUA_DIRSEP	"\\"[m
[31m-#else[m
[31m-#define LUA_DIRSEP	"/"[m
[31m-#endif[m
[31m-#define LUA_PATHSEP	";"[m
[31m-#define LUA_PATH_MARK	"?"[m
[31m-#define LUA_EXECDIR	"!"[m
[31m-#define LUA_IGMARK	"-"[m
[31m-#define LUA_PATH_CONFIG \[m
[31m-  LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" \[m
[31m-  LUA_EXECDIR "\n" LUA_IGMARK[m
[31m-[m
[31m-/* Quoting in error messages. */[m
[31m-#define LUA_QL(x)	"'" x "'"[m
[31m-#define LUA_QS		LUA_QL("%s")[m
[31m-[m
[31m-/* Various tunables. */[m
[31m-#define LUAI_MAXSTACK	65500	/* Max. # of stack slots for a thread (<64K). */[m
[31m-#define LUAI_MAXCSTACK	8000	/* Max. # of stack slots for a C func (<10K). */[m
[31m-#define LUAI_GCPAUSE	200	/* Pause GC until memory is at 200%. */[m
[31m-#define LUAI_GCMUL	200	/* Run GC at 200% of allocation speed. */[m
[31m-#define LUA_MAXCAPTURES	32	/* Max. pattern captures. */[m
[31m-[m
[31m-/* Compatibility with older library function names. */[m
[31m-#define LUA_COMPAT_MOD		/* OLD: math.mod, NEW: math.fmod */[m
[31m-#define LUA_COMPAT_GFIND	/* OLD: string.gfind, NEW: string.gmatch */[m
[31m-[m
[31m-/* Configuration for the frontend (the luajit executable). */[m
[31m-#if defined(luajit_c)[m
[31m-#define LUA_PROGNAME	"luajit"  /* Fallback frontend name. */[m
[31m-#define LUA_PROMPT	"> "	/* Interactive prompt. */[m
[31m-#define LUA_PROMPT2	">> "	/* Continuation prompt. */[m
[31m-#define LUA_MAXINPUT	512	/* Max. input line length. */[m
[31m-#endif[m
[31m-[m
[31m-/* Note: changing the following defines breaks the Lua 5.1 ABI. */[m
[31m-#define LUA_INTEGER	ptrdiff_t[m
[31m-#define LUA_IDSIZE	60	/* Size of lua_Debug.short_src. */[m
[31m-/*[m
[31m-** Size of lauxlib and io.* on-stack buffers. Weird workaround to avoid using[m
[31m-** unreasonable amounts of stack space, but still retain ABI compatibility.[m
[31m-** Blame Lua for depending on BUFSIZ in the ABI, blame **** for wrecking it.[m
[31m-*/[m
[31m-#define LUAL_BUFFERSIZE	(BUFSIZ > 16384 ? 8192 : BUFSIZ)[m
[31m-[m
[31m-/* The following defines are here only for compatibility with luaconf.h[m
[31m-** from the standard Lua distribution. They must not be changed for LuaJIT.[m
[31m-*/[m
[31m-#define LUA_NUMBER_DOUBLE[m
[31m-#define LUA_NUMBER		double[m
[31m-#define LUAI_UACNUMBER		double[m
[31m-#define LUA_NUMBER_SCAN		"%lf"[m
[31m-#define LUA_NUMBER_FMT		"%.14g"[m
[31m-#define lua_number2str(s, n)	sprintf((s), LUA_NUMBER_FMT, (n))[m
[31m-#define LUAI_MAXNUMBER2STR	32[m
[31m-#define LUA_INTFRMLEN		"l"[m
[31m-#define LUA_INTFRM_T		long[m
[31m-[m
[31m-/* Linkage of public API functions. */[m
[31m-#if defined(LUA_BUILD_AS_DLL)[m
[31m-#if defined(LUA_CORE) || defined(LUA_LIB)[m
[31m-#define LUA_API		__declspec(dllexport)[m
[31m-#else[m
[31m-#define LUA_API		__declspec(dllimport)[m
[31m-#endif[m
[31m-#else[m
[31m-#define LUA_API		extern[m
[31m-#endif[m
[31m-[m
[31m-#define LUALIB_API	LUA_API[m
[31m-[m
[31m-/* Support for internal assertions. */[m
[31m-#if defined(LUA_USE_ASSERT) || defined(LUA_USE_APICHECK)[m
[31m-#include <assert.h>[m
[31m-#endif[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-#define lua_assert(x)		assert(x)[m
[31m-#endif[m
[31m-#ifdef LUA_USE_APICHECK[m
[31m-#define luai_apicheck(L, o)	{ (void)L; assert(o); }[m
[31m-#else[m
[31m-#define luai_apicheck(L, o)	{ (void)L; }[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luajit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luajit.c[m
[1mdeleted file mode 100644[m
[1mindex 00e12bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luajit.c[m
[1m+++ /dev/null[m
[36m@@ -1,570 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT frontend. Runs commands, scripts, read-eval-print (REPL) etc.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-**[m
[31m-** Major portions taken verbatim or adapted from the Lua interpreter.[m
[31m-** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define luajit_c[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-#include "luajit.h"[m
[31m-[m
[31m-#include "lj_arch.h"[m
[31m-[m
[31m-#if LJ_TARGET_POSIX[m
[31m-#include <unistd.h>[m
[31m-#define lua_stdin_is_tty()	isatty(0)[m
[31m-#elif LJ_TARGET_WINDOWS[m
[31m-#include <io.h>[m
[31m-#ifdef __BORLANDC__[m
[31m-#define lua_stdin_is_tty()	isatty(_fileno(stdin))[m
[31m-#else[m
[31m-#define lua_stdin_is_tty()	_isatty(_fileno(stdin))[m
[31m-#endif[m
[31m-#else[m
[31m-#define lua_stdin_is_tty()	1[m
[31m-#endif[m
[31m-[m
[31m-#if !LJ_TARGET_CONSOLE[m
[31m-#include <signal.h>[m
[31m-#endif[m
[31m-[m
[31m-static lua_State *globalL = NULL;[m
[31m-static const char *progname = LUA_PROGNAME;[m
[31m-[m
[31m-#if !LJ_TARGET_CONSOLE[m
[31m-static void lstop(lua_State *L, lua_Debug *ar)[m
[31m-{[m
[31m-  (void)ar;  /* unused arg. */[m
[31m-  lua_sethook(L, NULL, 0, 0);[m
[31m-  /* Avoid luaL_error -- a C hook doesn't add an extra frame. */[m
[31m-  luaL_where(L, 0);[m
[31m-  lua_pushfstring(L, "%sinterrupted!", lua_tostring(L, -1));[m
[31m-  lua_error(L);[m
[31m-}[m
[31m-[m
[31m-static void laction(int i)[m
[31m-{[m
[31m-  signal(i, SIG_DFL); /* if another SIGINT happens before lstop,[m
[31m-			 terminate process (default action) */[m
[31m-  lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-static void print_usage(void)[m
[31m-{[m
[31m-  fputs("usage: ", stderr);[m
[31m-  fputs(progname, stderr);[m
[31m-  fputs(" [options]... [script [args]...].\n"[m
[31m-  "Available options are:\n"[m
[31m-  "  -e chunk  Execute string " LUA_QL("chunk") ".\n"[m
[31m-  "  -l name   Require library " LUA_QL("name") ".\n"[m
[31m-  "  -b ...    Save or list bytecode.\n"[m
[31m-  "  -j cmd    Perform LuaJIT control command.\n"[m
[31m-  "  -O[opt]   Control LuaJIT optimizations.\n"[m
[31m-  "  -i        Enter interactive mode after executing " LUA_QL("script") ".\n"[m
[31m-  "  -v        Show version information.\n"[m
[31m-  "  -E        Ignore environment variables.\n"[m
[31m-  "  --        Stop handling options.\n"[m
[31m-  "  -         Execute stdin and stop handling options.\n", stderr);[m
[31m-  fflush(stderr);[m
[31m-}[m
[31m-[m
[31m-static void l_message(const char *pname, const char *msg)[m
[31m-{[m
[31m-  if (pname) { fputs(pname, stderr); fputc(':', stderr); fputc(' ', stderr); }[m
[31m-  fputs(msg, stderr); fputc('\n', stderr);[m
[31m-  fflush(stderr);[m
[31m-}[m
[31m-[m
[31m-static int report(lua_State *L, int status)[m
[31m-{[m
[31m-  if (status && !lua_isnil(L, -1)) {[m
[31m-    const char *msg = lua_tostring(L, -1);[m
[31m-    if (msg == NULL) msg = "(error object is not a string)";[m
[31m-    l_message(progname, msg);[m
[31m-    lua_pop(L, 1);[m
[31m-  }[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-static int traceback(lua_State *L)[m
[31m-{[m
[31m-  if (!lua_isstring(L, 1)) { /* Non-string error object? Try metamethod. */[m
[31m-    if (lua_isnoneornil(L, 1) ||[m
[31m-	!luaL_callmeta(L, 1, "__tostring") ||[m
[31m-	!lua_isstring(L, -1))[m
[31m-      return 1;  /* Return non-string error object. */[m
[31m-    lua_remove(L, 1);  /* Replace object by result of __tostring metamethod. */[m
[31m-  }[m
[31m-  luaL_traceback(L, L, lua_tostring(L, 1), 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int docall(lua_State *L, int narg, int clear)[m
[31m-{[m
[31m-  int status;[m
[31m-  int base = lua_gettop(L) - narg;  /* function index */[m
[31m-  lua_pushcfunction(L, traceback);  /* push traceback function */[m
[31m-  lua_insert(L, base);  /* put it under chunk and args */[m
[31m-#if !LJ_TARGET_CONSOLE[m
[31m-  signal(SIGINT, laction);[m
[31m-#endif[m
[31m-  status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base);[m
[31m-#if !LJ_TARGET_CONSOLE[m
[31m-  signal(SIGINT, SIG_DFL);[m
[31m-#endif[m
[31m-  lua_remove(L, base);  /* remove traceback function */[m
[31m-  /* force a complete garbage collection in case of errors */[m
[31m-  if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-static void print_version(void)[m
[31m-{[m
[31m-  fputs(LUAJIT_VERSION " -- " LUAJIT_COPYRIGHT ". " LUAJIT_URL "\n", stdout);[m
[31m-}[m
[31m-[m
[31m-static void print_jit_status(lua_State *L)[m
[31m-{[m
[31m-  int n;[m
[31m-  const char *s;[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, -1, "jit");  /* Get jit.* module table. */[m
[31m-  lua_remove(L, -2);[m
[31m-  lua_getfield(L, -1, "status");[m
[31m-  lua_remove(L, -2);[m
[31m-  n = lua_gettop(L);[m
[31m-  lua_call(L, 0, LUA_MULTRET);[m
[31m-  fputs(lua_toboolean(L, n) ? "JIT: ON" : "JIT: OFF", stdout);[m
[31m-  for (n++; (s = lua_tostring(L, n)); n++) {[m
[31m-    putc(' ', stdout);[m
[31m-    fputs(s, stdout);[m
[31m-  }[m
[31m-  putc('\n', stdout);[m
[31m-}[m
[31m-[m
[31m-static int getargs(lua_State *L, char **argv, int n)[m
[31m-{[m
[31m-  int narg;[m
[31m-  int i;[m
[31m-  int argc = 0;[m
[31m-  while (argv[argc]) argc++;  /* count total number of arguments */[m
[31m-  narg = argc - (n + 1);  /* number of arguments to the script */[m
[31m-  luaL_checkstack(L, narg + 3, "too many arguments to script");[m
[31m-  for (i = n+1; i < argc; i++)[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-  lua_createtable(L, narg, n + 1);[m
[31m-  for (i = 0; i < argc; i++) {[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-    lua_rawseti(L, -2, i - n);[m
[31m-  }[m
[31m-  return narg;[m
[31m-}[m
[31m-[m
[31m-static int dofile(lua_State *L, const char *name)[m
[31m-{[m
[31m-  int status = luaL_loadfile(L, name) || docall(L, 0, 1);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-static int dostring(lua_State *L, const char *s, const char *name)[m
[31m-{[m
[31m-  int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-static int dolibrary(lua_State *L, const char *name)[m
[31m-{[m
[31m-  lua_getglobal(L, "require");[m
[31m-  lua_pushstring(L, name);[m
[31m-  return report(L, docall(L, 1, 1));[m
[31m-}[m
[31m-[m
[31m-static void write_prompt(lua_State *L, int firstline)[m
[31m-{[m
[31m-  const char *p;[m
[31m-  lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2");[m
[31m-  p = lua_tostring(L, -1);[m
[31m-  if (p == NULL) p = firstline ? LUA_PROMPT : LUA_PROMPT2;[m
[31m-  fputs(p, stdout);[m
[31m-  fflush(stdout);[m
[31m-  lua_pop(L, 1);  /* remove global */[m
[31m-}[m
[31m-[m
[31m-static int incomplete(lua_State *L, int status)[m
[31m-{[m
[31m-  if (status == LUA_ERRSYNTAX) {[m
[31m-    size_t lmsg;[m
[31m-    const char *msg = lua_tolstring(L, -1, &lmsg);[m
[31m-    const char *tp = msg + lmsg - (sizeof(LUA_QL("<eof>")) - 1);[m
[31m-    if (strstr(msg, LUA_QL("<eof>")) == tp) {[m
[31m-      lua_pop(L, 1);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* else... */[m
[31m-}[m
[31m-[m
[31m-static int pushline(lua_State *L, int firstline)[m
[31m-{[m
[31m-  char buf[LUA_MAXINPUT];[m
[31m-  write_prompt(L, firstline);[m
[31m-  if (fgets(buf, LUA_MAXINPUT, stdin)) {[m
[31m-    size_t len = strlen(buf);[m
[31m-    if (len > 0 && buf[len-1] == '\n')[m
[31m-      buf[len-1] = '\0';[m
[31m-    if (firstline && buf[0] == '=')[m
[31m-      lua_pushfstring(L, "return %s", buf+1);[m
[31m-    else[m
[31m-      lua_pushstring(L, buf);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int loadline(lua_State *L)[m
[31m-{[m
[31m-  int status;[m
[31m-  lua_settop(L, 0);[m
[31m-  if (!pushline(L, 1))[m
[31m-    return -1;  /* no input */[m
[31m-  for (;;) {  /* repeat until gets a complete line */[m
[31m-    status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin");[m
[31m-    if (!incomplete(L, status)) break;  /* cannot try to add lines? */[m
[31m-    if (!pushline(L, 0))  /* no more input? */[m
[31m-      return -1;[m
[31m-    lua_pushliteral(L, "\n");  /* add a new line... */[m
[31m-    lua_insert(L, -2);  /* ...between the two lines */[m
[31m-    lua_concat(L, 3);  /* join them */[m
[31m-  }[m
[31m-  lua_remove(L, 1);  /* remove line */[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-static void dotty(lua_State *L)[m
[31m-{[m
[31m-  int status;[m
[31m-  const char *oldprogname = progname;[m
[31m-  progname = NULL;[m
[31m-  while ((status = loadline(L)) != -1) {[m
[31m-    if (status == 0) status = docall(L, 0, 0);[m
[31m-    report(L, status);[m
[31m-    if (status == 0 && lua_gettop(L) > 0) {  /* any result to print? */[m
[31m-      lua_getglobal(L, "print");[m
[31m-      lua_insert(L, 1);[m
[31m-      if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0)[m
[31m-	l_message(progname,[m
[31m-	  lua_pushfstring(L, "error calling " LUA_QL("print") " (%s)",[m
[31m-			      lua_tostring(L, -1)));[m
[31m-    }[m
[31m-  }[m
[31m-  lua_settop(L, 0);  /* clear stack */[m
[31m-  fputs("\n", stdout);[m
[31m-  fflush(stdout);[m
[31m-  progname = oldprogname;[m
[31m-}[m
[31m-[m
[31m-static int handle_script(lua_State *L, char **argv, int n)[m
[31m-{[m
[31m-  int status;[m
[31m-  const char *fname;[m
[31m-  int narg = getargs(L, argv, n);  /* collect arguments */[m
[31m-  lua_setglobal(L, "arg");[m
[31m-  fname = argv[n];[m
[31m-  if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0)[m
[31m-    fname = NULL;  /* stdin */[m
[31m-  status = luaL_loadfile(L, fname);[m
[31m-  lua_insert(L, -(narg+1));[m
[31m-  if (status == 0)[m
[31m-    status = docall(L, narg, 0);[m
[31m-  else[m
[31m-    lua_pop(L, narg);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-/* Load add-on module. */[m
[31m-static int loadjitmodule(lua_State *L)[m
[31m-{[m
[31m-  lua_getglobal(L, "require");[m
[31m-  lua_pushliteral(L, "jit.");[m
[31m-  lua_pushvalue(L, -3);[m
[31m-  lua_concat(L, 2);[m
[31m-  if (lua_pcall(L, 1, 1, 0)) {[m
[31m-    const char *msg = lua_tostring(L, -1);[m
[31m-    if (msg && !strncmp(msg, "module ", 7))[m
[31m-      goto nomodule;[m
[31m-    return report(L, 1);[m
[31m-  }[m
[31m-  lua_getfield(L, -1, "start");[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-  nomodule:[m
[31m-    l_message(progname,[m
[31m-	      "unknown luaJIT command or jit.* modules not installed");[m
[31m-    return 1;[m
[31m-  }[m
[31m-  lua_remove(L, -2);  /* Drop module table. */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* Run command with options. */[m
[31m-static int runcmdopt(lua_State *L, const char *opt)[m
[31m-{[m
[31m-  int narg = 0;[m
[31m-  if (opt && *opt) {[m
[31m-    for (;;) {  /* Split arguments. */[m
[31m-      const char *p = strchr(opt, ',');[m
[31m-      narg++;[m
[31m-      if (!p) break;[m
[31m-      if (p == opt)[m
[31m-	lua_pushnil(L);[m
[31m-      else[m
[31m-	lua_pushlstring(L, opt, (size_t)(p - opt));[m
[31m-      opt = p + 1;[m
[31m-    }[m
[31m-    if (*opt)[m
[31m-      lua_pushstring(L, opt);[m
[31m-    else[m
[31m-      lua_pushnil(L);[m
[31m-  }[m
[31m-  return report(L, lua_pcall(L, narg, 0, 0));[m
[31m-}[m
[31m-[m
[31m-/* JIT engine control command: try jit library first or load add-on module. */[m
[31m-static int dojitcmd(lua_State *L, const char *cmd)[m
[31m-{[m
[31m-  const char *opt = strchr(cmd, '=');[m
[31m-  lua_pushlstring(L, cmd, opt ? (size_t)(opt - cmd) : strlen(cmd));[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, -1, "jit");  /* Get jit.* module table. */[m
[31m-  lua_remove(L, -2);[m
[31m-  lua_pushvalue(L, -2);[m
[31m-  lua_gettable(L, -2);  /* Lookup library function. */[m
[31m-  if (!lua_isfunction(L, -1)) {[m
[31m-    lua_pop(L, 2);  /* Drop non-function and jit.* table, keep module name. */[m
[31m-    if (loadjitmodule(L))[m
[31m-      return 1;[m
[31m-  } else {[m
[31m-    lua_remove(L, -2);  /* Drop jit.* table. */[m
[31m-  }[m
[31m-  lua_remove(L, -2);  /* Drop module name. */[m
[31m-  return runcmdopt(L, opt ? opt+1 : opt);[m
[31m-}[m
[31m-[m
[31m-/* Optimization flags. */[m
[31m-static int dojitopt(lua_State *L, const char *opt)[m
[31m-{[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, -1, "jit.opt");  /* Get jit.opt.* module table. */[m
[31m-  lua_remove(L, -2);[m
[31m-  lua_getfield(L, -1, "start");[m
[31m-  lua_remove(L, -2);[m
[31m-  return runcmdopt(L, opt);[m
[31m-}[m
[31m-[m
[31m-/* Save or list bytecode. */[m
[31m-static int dobytecode(lua_State *L, char **argv)[m
[31m-{[m
[31m-  int narg = 0;[m
[31m-  lua_pushliteral(L, "bcsave");[m
[31m-  if (loadjitmodule(L))[m
[31m-    return 1;[m
[31m-  if (argv[0][2]) {[m
[31m-    narg++;[m
[31m-    argv[0][1] = '-';[m
[31m-    lua_pushstring(L, argv[0]+1);[m
[31m-  }[m
[31m-  for (argv++; *argv != NULL; narg++, argv++)[m
[31m-    lua_pushstring(L, *argv);[m
[31m-  return report(L, lua_pcall(L, narg, 0, 0));[m
[31m-}[m
[31m-[m
[31m-/* check that argument has no extra characters at the end */[m
[31m-#define notail(x)	{if ((x)[2] != '\0') return -1;}[m
[31m-[m
[31m-#define FLAGS_INTERACTIVE	1[m
[31m-#define FLAGS_VERSION		2[m
[31m-#define FLAGS_EXEC		4[m
[31m-#define FLAGS_OPTION		8[m
[31m-#define FLAGS_NOENV		16[m
[31m-[m
[31m-static int collectargs(char **argv, int *flags)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 1; argv[i] != NULL; i++) {[m
[31m-    if (argv[i][0] != '-')  /* Not an option? */[m
[31m-      return i;[m
[31m-    switch (argv[i][1]) {  /* Check option. */[m
[31m-    case '-':[m
[31m-      notail(argv[i]);[m
[31m-      return (argv[i+1] != NULL ? i+1 : 0);[m
[31m-    case '\0':[m
[31m-      return i;[m
[31m-    case 'i':[m
[31m-      notail(argv[i]);[m
[31m-      *flags |= FLAGS_INTERACTIVE;[m
[31m-      /* fallthrough */[m
[31m-    case 'v':[m
[31m-      notail(argv[i]);[m
[31m-      *flags |= FLAGS_VERSION;[m
[31m-      break;[m
[31m-    case 'e':[m
[31m-      *flags |= FLAGS_EXEC;[m
[31m-    case 'j':  /* LuaJIT extension */[m
[31m-    case 'l':[m
[31m-      *flags |= FLAGS_OPTION;[m
[31m-      if (argv[i][2] == '\0') {[m
[31m-	i++;[m
[31m-	if (argv[i] == NULL) return -1;[m
[31m-      }[m
[31m-      break;[m
[31m-    case 'O': break;  /* LuaJIT extension */[m
[31m-    case 'b':  /* LuaJIT extension */[m
[31m-      if (*flags) return -1;[m
[31m-      *flags |= FLAGS_EXEC;[m
[31m-      return 0;[m
[31m-    case 'E':[m
[31m-      *flags |= FLAGS_NOENV;[m
[31m-      break;[m
[31m-    default: return -1;  /* invalid option */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int runargs(lua_State *L, char **argv, int n)[m
[31m-{[m
[31m-  int i;[m
[31m-  for (i = 1; i < n; i++) {[m
[31m-    if (argv[i] == NULL) continue;[m
[31m-    lua_assert(argv[i][0] == '-');[m
[31m-    switch (argv[i][1]) {  /* option */[m
[31m-    case 'e': {[m
[31m-      const char *chunk = argv[i] + 2;[m
[31m-      if (*chunk == '\0') chunk = argv[++i];[m
[31m-      lua_assert(chunk != NULL);[m
[31m-      if (dostring(L, chunk, "=(command line)") != 0)[m
[31m-	return 1;[m
[31m-      break;[m
[31m-      }[m
[31m-    case 'l': {[m
[31m-      const char *filename = argv[i] + 2;[m
[31m-      if (*filename == '\0') filename = argv[++i];[m
[31m-      lua_assert(filename != NULL);[m
[31m-      if (dolibrary(L, filename))[m
[31m-	return 1;  /* stop if file fails */[m
[31m-      break;[m
[31m-      }[m
[31m-    case 'j': {  /* LuaJIT extension */[m
[31m-      const char *cmd = argv[i] + 2;[m
[31m-      if (*cmd == '\0') cmd = argv[++i];[m
[31m-      lua_assert(cmd != NULL);[m
[31m-      if (dojitcmd(L, cmd))[m
[31m-	return 1;[m
[31m-      break;[m
[31m-      }[m
[31m-    case 'O':  /* LuaJIT extension */[m
[31m-      if (dojitopt(L, argv[i] + 2))[m
[31m-	return 1;[m
[31m-      break;[m
[31m-    case 'b':  /* LuaJIT extension */[m
[31m-      return dobytecode(L, argv+i);[m
[31m-    default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-static int handle_luainit(lua_State *L)[m
[31m-{[m
[31m-#if LJ_TARGET_CONSOLE[m
[31m-  const char *init = NULL;[m
[31m-#else[m
[31m-  const char *init = getenv(LUA_INIT);[m
[31m-#endif[m
[31m-  if (init == NULL)[m
[31m-    return 0;  /* status OK */[m
[31m-  else if (init[0] == '@')[m
[31m-    return dofile(L, init+1);[m
[31m-  else[m
[31m-    return dostring(L, init, "=" LUA_INIT);[m
[31m-}[m
[31m-[m
[31m-static struct Smain {[m
[31m-  char **argv;[m
[31m-  int argc;[m
[31m-  int status;[m
[31m-} smain;[m
[31m-[m
[31m-static int pmain(lua_State *L)[m
[31m-{[m
[31m-  struct Smain *s = &smain;[m
[31m-  char **argv = s->argv;[m
[31m-  int script;[m
[31m-  int flags = 0;[m
[31m-  globalL = L;[m
[31m-  if (argv[0] && argv[0][0]) progname = argv[0];[m
[31m-  LUAJIT_VERSION_SYM();  /* linker-enforced version check */[m
[31m-  script = collectargs(argv, &flags);[m
[31m-  if (script < 0) {  /* invalid args? */[m
[31m-    print_usage();[m
[31m-    s->status = 1;[m
[31m-    return 0;[m
[31m-  }[m
[31m-  if ((flags & FLAGS_NOENV)) {[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");[m
[31m-  }[m
[31m-  lua_gc(L, LUA_GCSTOP, 0);  /* stop collector during initialization */[m
[31m-  luaL_openlibs(L);  /* open libraries */[m
[31m-  lua_gc(L, LUA_GCRESTART, -1);[m
[31m-  if (!(flags & FLAGS_NOENV)) {[m
[31m-    s->status = handle_luainit(L);[m
[31m-    if (s->status != 0) return 0;[m
[31m-  }[m
[31m-  if ((flags & FLAGS_VERSION)) print_version();[m
[31m-  s->status = runargs(L, argv, (script > 0) ? script : s->argc);[m
[31m-  if (s->status != 0) return 0;[m
[31m-  if (script) {[m
[31m-    s->status = handle_script(L, argv, script);[m
[31m-    if (s->status != 0) return 0;[m
[31m-  }[m
[31m-  if ((flags & FLAGS_INTERACTIVE)) {[m
[31m-    print_jit_status(L);[m
[31m-    dotty(L);[m
[31m-  } else if (script == 0 && !(flags & (FLAGS_EXEC|FLAGS_VERSION))) {[m
[31m-    if (lua_stdin_is_tty()) {[m
[31m-      print_version();[m
[31m-      print_jit_status(L);[m
[31m-      dotty(L);[m
[31m-    } else {[m
[31m-      dofile(L, NULL);  /* executes stdin as a file */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-int main(int argc, char **argv)[m
[31m-{[m
[31m-  int status;[m
[31m-  lua_State *L = lua_open();  /* create state */[m
[31m-  if (L == NULL) {[m
[31m-    l_message(argv[0], "cannot create state: not enough memory");[m
[31m-    return EXIT_FAILURE;[m
[31m-  }[m
[31m-  smain.argc = argc;[m
[31m-  smain.argv = argv;[m
[31m-  status = lua_cpcall(L, pmain, NULL);[m
[31m-  report(L, status);[m
[31m-  lua_close(L);[m
[31m-  return (status || smain.status) ? EXIT_FAILURE : EXIT_SUCCESS;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luajit.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luajit.h[m
[1mdeleted file mode 100644[m
[1mindex 1d0a558..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/luajit.h[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-/*[m
[31m-** LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/[m
[31m-**[m
[31m-** Copyright (C) 2005-2016 Mike Pall. All rights reserved.[m
[31m-**[m
[31m-** Permission is hereby granted, free of charge, to any person obtaining[m
[31m-** a copy of this software and associated documentation files (the[m
[31m-** "Software"), to deal in the Software without restriction, including[m
[31m-** without limitation the rights to use, copy, modify, merge, publish,[m
[31m-** distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-** permit persons to whom the Software is furnished to do so, subject to[m
[31m-** the following conditions:[m
[31m-**[m
[31m-** The above copyright notice and this permission notice shall be[m
[31m-** included in all copies or substantial portions of the Software.[m
[31m-**[m
[31m-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-**[m
[31m-** [ MIT license: http://www.opensource.org/licenses/mit-license.php ][m
[31m-*/[m
[31m-[m
[31m-#ifndef _LUAJIT_H[m
[31m-#define _LUAJIT_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#define LUAJIT_VERSION		"LuaJIT 2.1.0-beta2"[m
[31m-#define LUAJIT_VERSION_NUM	20100  /* Version 2.1.0 = 02.01.00. */[m
[31m-#define LUAJIT_VERSION_SYM	luaJIT_version_2_1_0_beta2[m
[31m-#define LUAJIT_COPYRIGHT	"Copyright (C) 2005-2016 Mike Pall"[m
[31m-#define LUAJIT_URL		"http://luajit.org/"[m
[31m-[m
[31m-/* Modes for luaJIT_setmode. */[m
[31m-#define LUAJIT_MODE_MASK	0x00ff[m
[31m-[m
[31m-enum {[m
[31m-  LUAJIT_MODE_ENGINE,		/* Set mode for whole JIT engine. */[m
[31m-  LUAJIT_MODE_DEBUG,		/* Set debug mode (idx = level). */[m
[31m-[m
[31m-  LUAJIT_MODE_FUNC,		/* Change mode for a function. */[m
[31m-  LUAJIT_MODE_ALLFUNC,		/* Recurse into subroutine protos. */[m
[31m-  LUAJIT_MODE_ALLSUBFUNC,	/* Change only the subroutines. */[m
[31m-[m
[31m-  LUAJIT_MODE_TRACE,		/* Flush a compiled trace. */[m
[31m-[m
[31m-  LUAJIT_MODE_WRAPCFUNC = 0x10,	/* Set wrapper mode for C function calls. */[m
[31m-[m
[31m-  LUAJIT_MODE_MAX[m
[31m-};[m
[31m-[m
[31m-/* Flags or'ed in to the mode. */[m
[31m-#define LUAJIT_MODE_OFF		0x0000	/* Turn feature off. */[m
[31m-#define LUAJIT_MODE_ON		0x0100	/* Turn feature on. */[m
[31m-#define LUAJIT_MODE_FLUSH	0x0200	/* Flush JIT-compiled code. */[m
[31m-[m
[31m-/* LuaJIT public C API. */[m
[31m-[m
[31m-/* Control the JIT engine. */[m
[31m-LUA_API int luaJIT_setmode(lua_State *L, int idx, int mode);[m
[31m-[m
[31m-/* Low-overhead profiling API. */[m
[31m-typedef void (*luaJIT_profile_callback)(void *data, lua_State *L,[m
[31m-					int samples, int vmstate);[m
[31m-LUA_API void luaJIT_profile_start(lua_State *L, const char *mode,[m
[31m-				  luaJIT_profile_callback cb, void *data);[m
[31m-LUA_API void luaJIT_profile_stop(lua_State *L);[m
[31m-LUA_API const char *luaJIT_profile_dumpstack(lua_State *L, const char *fmt,[m
[31m-					     int depth, size_t *len);[m
[31m-[m
[31m-/* Enforce (dynamic) linker error for version mismatches. Call from main. */[m
[31m-LUA_API void LUAJIT_VERSION_SYM(void);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lualib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lualib.h[m
[1mdeleted file mode 100644[m
[1mindex 3a54955..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/lualib.h[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/*[m
[31m-** Standard library header.[m
[31m-** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef _LUALIB_H[m
[31m-#define _LUALIB_H[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#define LUA_FILEHANDLE	"FILE*"[m
[31m-[m
[31m-#define LUA_COLIBNAME	"coroutine"[m
[31m-#define LUA_MATHLIBNAME	"math"[m
[31m-#define LUA_STRLIBNAME	"string"[m
[31m-#define LUA_TABLIBNAME	"table"[m
[31m-#define LUA_IOLIBNAME	"io"[m
[31m-#define LUA_OSLIBNAME	"os"[m
[31m-#define LUA_LOADLIBNAME	"package"[m
[31m-#define LUA_DBLIBNAME	"debug"[m
[31m-#define LUA_BITLIBNAME	"bit"[m
[31m-#define LUA_JITLIBNAME	"jit"[m
[31m-#define LUA_FFILIBNAME	"ffi"[m
[31m-[m
[31m-LUALIB_API int luaopen_base(lua_State *L);[m
[31m-LUALIB_API int luaopen_math(lua_State *L);[m
[31m-LUALIB_API int luaopen_string(lua_State *L);[m
[31m-LUALIB_API int luaopen_table(lua_State *L);[m
[31m-LUALIB_API int luaopen_io(lua_State *L);[m
[31m-LUALIB_API int luaopen_os(lua_State *L);[m
[31m-LUALIB_API int luaopen_package(lua_State *L);[m
[31m-LUALIB_API int luaopen_debug(lua_State *L);[m
[31m-LUALIB_API int luaopen_bit(lua_State *L);[m
[31m-LUALIB_API int luaopen_jit(lua_State *L);[m
[31m-LUALIB_API int luaopen_ffi(lua_State *L);[m
[31m-[m
[31m-LUALIB_API void luaL_openlibs(lua_State *L);[m
[31m-[m
[31m-#ifndef lua_assert[m
[31m-#define lua_assert(x)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/msvcbuild.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/msvcbuild.bat[m
[1mdeleted file mode 100644[m
[1mindex f977a24..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/msvcbuild.bat[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-@rem Script to build LuaJIT with MSVC.[m
[31m-@rem Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-@rem[m
[31m-@rem Either open a "Visual Studio .NET Command Prompt"[m
[31m-@rem (Note that the Express Edition does not contain an x64 compiler)[m
[31m-@rem -or-[m
[31m-@rem Open a "Windows SDK Command Shell" and set the compiler environment:[m
[31m-@rem     setenv /release /x86[m
[31m-@rem   -or-[m
[31m-@rem     setenv /release /x64[m
[31m-@rem[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@set LJCOMPILE=cl /nologo /c /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set LJLIB=lib /nologo /nodefaultlib[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set LJDLLNAME=lua51.dll[m
[31m-@set LJLIBNAME=lua51.lib[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@set DASMFLAGS=-D WIN -D JIT -D FFI -D P64[m
[31m-@set LJARCH=x64[m
[31m-@minilua[m
[31m-@if errorlevel 8 goto :X64[m
[31m-@set DASMFLAGS=-D WIN -D JIT -D FFI[m
[31m-@set LJARCH=x86[m
[31m-@set LJCOMPILE=%LJCOMPILE% /arch:SSE2[m
[31m-:X64[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m peobj -o lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@if "%1" neq "debug" goto :NODEBUG[m
[31m-@shift[m
[31m-@set LJCOMPILE=%LJCOMPILE% /Zi[m
[31m-@set LJLINK=%LJLINK% /debug[m
[31m-:NODEBUG[m
[31m-@if "%1"=="amalg" goto :AMALGDLL[m
[31m-@if "%1"=="static" goto :STATIC[m
[31m-%LJCOMPILE% /MD /DLUA_BUILD_AS_DLL lj_*.c lib_*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /DLL /out:%LJDLLNAME% lj_*.obj lib_*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :MTDLL[m
[31m-:STATIC[m
[31m-%LJCOMPILE% lj_*.c lib_*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:%LJLIBNAME% lj_*.obj lib_*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :MTDLL[m
[31m-:AMALGDLL[m
[31m-%LJCOMPILE% /MD /DLUA_BUILD_AS_DLL ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /DLL /out:%LJDLLNAME% ljamalg.obj lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-:MTDLL[m
[31m-if exist %LJDLLNAME%.manifest^[m
[31m-  %LJMT% -manifest %LJDLLNAME%.manifest -outputresource:%LJDLLNAME%;2[m
[31m-[m
[31m-%LJCOMPILE% luajit.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:luajit.exe luajit.obj %LJLIBNAME%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist luajit.exe.manifest^[m
[31m-  %LJMT% -manifest luajit.exe.manifest -outputresource:luajit.exe[m
[31m-[m
[31m-@del *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@del host\buildvm_arch.h[m
[31m-@del lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for Windows/%LJARCH% ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo You must open a "Visual Studio .NET Command Prompt" to run this script[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/ps4build.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/ps4build.bat[m
[1mdeleted file mode 100644[m
[1mindex e4a7def..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/ps4build.bat[m
[1m+++ /dev/null[m
[36m@@ -1,123 +0,0 @@[m
[31m-@rem Script to build LuaJIT with the PS4 SDK.[m
[31m-@rem Donated to the public domain.[m
[31m-@rem[m
[31m-@rem Open a "Visual Studio .NET Command Prompt" (64 bit host compiler)[m
[31m-@rem or "VS2015 x64 Native Tools Command Prompt".[m
[31m-@rem[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-@rem[m
[31m-@rem Recommended invocation:[m
[31m-@rem[m
[31m-@rem ps4build        release build, amalgamated, 64-bit GC[m
[31m-@rem ps4build debug    debug build, amalgamated, 64-bit GC[m
[31m-@rem[m
[31m-@rem Additional command-line options (not generally recommended):[m
[31m-@rem[m
[31m-@rem gc32 (before debug)    32-bit GC[m
[31m-@rem noamalg (after debug)  non-amalgamated build[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-@if not defined SCE_ORBIS_SDK_DIR goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@rem ---- Host compiler ----[m
[31m-@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-@set GC64=-DLUAJIT_ENABLE_GC64[m
[31m-@set DASC=vm_x64.dasc[m
[31m-[m
[31m-@if "%1" neq "gc32" goto :NOGC32[m
[31m-@shift[m
[31m-@set GC64=[m
[31m-@set DASC=vm_x86.dasc[m
[31m-:NOGC32[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@rem Check for 64 bit host compiler.[m
[31m-@minilua[m
[31m-@if not errorlevel 8 goto :FAIL[m
[31m-[m
[31m-@set DASMFLAGS=-D P64 -D NO_UNWIND[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h %DASC%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% %GC64% -DLUAJIT_TARGET=LUAJIT_ARCH_X64 -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLUAJIT_NO_UNWIND host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m elfasm -o lj_vm.s[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@rem ---- Cross compiler ----[m
[31m-@set LJCOMPILE="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-clang" -c -Wall -DLUAJIT_DISABLE_FFI %GC64%[m
[31m-@set LJLIB="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-ar" rcus[m
[31m-@set INCLUDE=""[m
[31m-[m
[31m-orbis-as -o lj_vm.o lj_vm.s[m
[31m-[m
[31m-@if "%1" neq "debug" goto :NODEBUG[m
[31m-@shift[m
[31m-@set LJCOMPILE=%LJCOMPILE% -g -O0[m
[31m-@set TARGETLIB=libluajitD_ps4.a[m
[31m-goto :BUILD[m
[31m-:NODEBUG[m
[31m-@set LJCOMPILE=%LJCOMPILE% -O2[m
[31m-@set TARGETLIB=libluajit_ps4.a[m
[31m-:BUILD[m
[31m-del %TARGETLIB%[m
[31m-@if "%1" neq "noamalg" goto :AMALG[m
[31m-for %%f in (lj_*.c lib_*.c) do ([m
[31m-  %LJCOMPILE% %%f[m
[31m-  @if errorlevel 1 goto :BAD[m
[31m-)[m
[31m-[m
[31m-%LJLIB% %TARGETLIB% lj_*.o lib_*.o[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :NOAMALG[m
[31m-:AMALG[m
[31m-%LJCOMPILE% ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% %TARGETLIB% ljamalg.o lj_vm.o[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-:NOAMALG[m
[31m-[m
[31m-@del *.o *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for PS4 ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo To run this script you must open a "Visual Studio .NET Command Prompt"[m
[31m-@echo (64 bit host compiler). The PS4 Orbis SDK must be installed, too.[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/psvitabuild.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/psvitabuild.bat[m
[1mdeleted file mode 100644[m
[1mindex 3991dc6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/psvitabuild.bat[m
[1m+++ /dev/null[m
[36m@@ -1,93 +0,0 @@[m
[31m-@rem Script to build LuaJIT with the PS Vita SDK.[m
[31m-@rem Donated to the public domain.[m
[31m-@rem[m
[31m-@rem Open a "Visual Studio .NET Command Prompt" (32 bit host compiler)[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-@if not defined SCE_PSP2_SDK_DIR goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@rem ---- Host compiler ----[m
[31m-@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@rem Check for 32 bit host compiler.[m
[31m-@minilua[m
[31m-@if errorlevel 8 goto :FAIL[m
[31m-[m
[31m-@set DASMFLAGS=-D FPU -D HFABI[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_arm.dasc[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_ARM -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLJ_TARGET_PSVITA=1 host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m elfasm -o lj_vm.s[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@rem ---- Cross compiler ----[m
[31m-@set LJCOMPILE="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2snc" -c -w -DLUAJIT_DISABLE_FFI -DLUAJIT_USE_SYSMALLOC[m
[31m-@set LJLIB="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2ld32" -r --output=[m
[31m-@set INCLUDE=""[m
[31m-[m
[31m-"%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2as" -o lj_vm.o lj_vm.s[m
[31m-[m
[31m-@if "%1" neq "debug" goto :NODEBUG[m
[31m-@shift[m
[31m-@set LJCOMPILE=%LJCOMPILE% -g -O0[m
[31m-@set TARGETLIB=libluajitD.a[m
[31m-goto :BUILD[m
[31m-:NODEBUG[m
[31m-@set LJCOMPILE=%LJCOMPILE% -O2[m
[31m-@set TARGETLIB=libluajit.a[m
[31m-:BUILD[m
[31m-del %TARGETLIB%[m
[31m-[m
[31m-%LJCOMPILE% ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB%%TARGETLIB% ljamalg.o lj_vm.o[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@del *.o *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for PS Vita ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo To run this script you must open a "Visual Studio .NET Command Prompt"[m
[31m-@echo (32 bit host compiler). The PS Vita SDK must be installed, too.[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_arm.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_arm.dasc[m
[1mdeleted file mode 100644[m
[1mindex 882884c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_arm.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,4593 +0,0 @@[m
[31m-|// Low-level VM code for ARM CPUs.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.arch arm[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|// Note: The ragged indentation of the instructions is intentional.[m
[31m-|//       The starting columns indicate data dependencies.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|[m
[31m-|// The following must be C callee-save.[m
[31m-|.define MASKR8,	r4	// 255*8 constant for fast bytecode decoding.[m
[31m-|.define KBASE,		r5	// Constants of current Lua function.[m
[31m-|.define PC,		r6	// Next PC.[m
[31m-|.define DISPATCH,	r7	// Opcode dispatch table.[m
[31m-|.define LREG,		r8	// Register holding lua_State (also in SAVE_L).[m
[31m-|[m
[31m-|// C callee-save in EABI, but often refetched. Temporary in iOS 3.0+.[m
[31m-|.define BASE,		r9	// Base of current Lua stack frame.[m
[31m-|[m
[31m-|// The following temporaries are not saved across C calls, except for RA/RC.[m
[31m-|.define RA,		r10	// Callee-save.[m
[31m-|.define RC,		r11	// Callee-save.[m
[31m-|.define RB,		r12[m
[31m-|.define OP,		r12	// Overlaps RB, must not be lr.[m
[31m-|.define INS,		lr[m
[31m-|[m
[31m-|// Calling conventions. Also used as temporaries.[m
[31m-|.define CARG1,		r0[m
[31m-|.define CARG2,		r1[m
[31m-|.define CARG3,		r2[m
[31m-|.define CARG4,		r3[m
[31m-|.define CARG12,	r0	// For 1st soft-fp double.[m
[31m-|.define CARG34,	r2	// For 2nd soft-fp double.[m
[31m-|[m
[31m-|.define CRET1,		r0[m
[31m-|.define CRET2,		r1[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|.define SAVE_R4,	[sp, #28][m
[31m-|.define CFRAME_SPACE,	#28[m
[31m-|.define SAVE_ERRF,	[sp, #24][m
[31m-|.define SAVE_NRES,	[sp, #20][m
[31m-|.define SAVE_CFRAME,	[sp, #16][m
[31m-|.define SAVE_L,	[sp, #12][m
[31m-|.define SAVE_PC,	[sp, #8][m
[31m-|.define SAVE_MULTRES,	[sp, #4][m
[31m-|.define ARG5,		[sp][m
[31m-|[m
[31m-|.define TMPDhi,	[sp, #4][m
[31m-|.define TMPDlo,	[sp][m
[31m-|.define TMPD,		[sp][m
[31m-|.define TMPDp,		sp[m
[31m-|[m
[31m-|.if FPU[m
[31m-|.macro saveregs[m
[31m-|  push {r5, r6, r7, r8, r9, r10, r11, lr}[m
[31m-|  vpush {d8-d15}[m
[31m-|  sub sp, sp, CFRAME_SPACE+4[m
[31m-|  str r4, SAVE_R4[m
[31m-|.endmacro[m
[31m-|.macro restoreregs_ret[m
[31m-|  ldr r4, SAVE_R4[m
[31m-|  add sp, sp, CFRAME_SPACE+4[m
[31m-|  vpop {d8-d15}[m
[31m-|  pop {r5, r6, r7, r8, r9, r10, r11, pc}[m
[31m-|.endmacro[m
[31m-|.else[m
[31m-|.macro saveregs[m
[31m-|  push {r4, r5, r6, r7, r8, r9, r10, r11, lr}[m
[31m-|  sub sp, sp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro restoreregs_ret[m
[31m-|  add sp, sp, CFRAME_SPACE[m
[31m-|  pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}[m
[31m-|.endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State,	LREG[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS8,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Trap for not-yet-implemented parts.[m
[31m-|.macro NYI; ud; .endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Access to frame relative to BASE.[m
[31m-|.define FRAME_FUNC,	#-8[m
[31m-|.define FRAME_PC,	#-4[m
[31m-|[m
[31m-|.macro decode_RA8, dst, ins; and dst, MASKR8, ins, lsr #5; .endmacro[m
[31m-|.macro decode_RB8, dst, ins; and dst, MASKR8, ins, lsr #21; .endmacro[m
[31m-|.macro decode_RC8, dst, ins; and dst, MASKR8, ins, lsr #13; .endmacro[m
[31m-|.macro decode_RD, dst, ins; lsr dst, ins, #16; .endmacro[m
[31m-|.macro decode_OP, dst, ins; and dst, ins, #255; .endmacro[m
[31m-|[m
[31m-|// Instruction fetch.[m
[31m-|.macro ins_NEXT1[m
[31m-|  ldrb OP, [PC][m
[31m-|.endmacro[m
[31m-|.macro ins_NEXT2[m
[31m-|   ldr INS, [PC], #4[m
[31m-|.endmacro[m
[31m-|// Instruction decode+dispatch.[m
[31m-|.macro ins_NEXT3[m
[31m-|  ldr OP, [DISPATCH, OP, lsl #2][m
[31m-|   decode_RA8 RA, INS[m
[31m-|   decode_RD RC, INS[m
[31m-|  bx OP[m
[31m-|.endmacro[m
[31m-|.macro ins_NEXT[m
[31m-|  ins_NEXT1[m
[31m-|  ins_NEXT2[m
[31m-|  ins_NEXT3[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|  .define ins_next1, ins_NEXT1[m
[31m-|  .define ins_next2, ins_NEXT2[m
[31m-|  .define ins_next3, ins_NEXT3[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  .macro ins_next[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next1[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next2[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next3[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Avoid register name substitution for field name.[m
[31m-#define field_pc	pc[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-|  ldr PC, LFUNC:CARG3->field_pc[m
[31m-|  ldrb OP, [PC]  // STALL: load PC. early PC.[m
[31m-|   ldr INS, [PC], #4[m
[31m-|  ldr OP, [DISPATCH, OP, lsl #2]  // STALL: load OP. early OP.[m
[31m-|   decode_RA8 RA, INS[m
[31m-|   add RA, RA, BASE[m
[31m-|  bx OP[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, PC = caller PC[m
[31m-|  str PC, [BASE, FRAME_PC][m
[31m-|  ins_callt  // STALL: locked PC.[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to test operand types.[m
[31m-|.macro checktp, reg, tp; cmn reg, #-tp; .endmacro[m
[31m-|.macro checktpeq, reg, tp; cmneq reg, #-tp; .endmacro[m
[31m-|.macro checktpne, reg, tp; cmnne reg, #-tp; .endmacro[m
[31m-|.macro checkstr, reg, target; checktp reg, LJ_TSTR; bne target; .endmacro[m
[31m-|.macro checktab, reg, target; checktp reg, LJ_TTAB; bne target; .endmacro[m
[31m-|.macro checkfunc, reg, target; checktp reg, LJ_TFUNC; bne target; .endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|.macro hotcheck, delta[m
[31m-|  lsr CARG1, PC, #1[m
[31m-|  and CARG1, CARG1, #126[m
[31m-|  sub CARG1, CARG1, #-GG_DISP2HOT[m
[31m-|  ldrh CARG2, [DISPATCH, CARG1][m
[31m-|  subs CARG2, CARG2, #delta[m
[31m-|  strh CARG2, [DISPATCH, CARG1][m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotloop[m
[31m-|  hotcheck HOTCOUNT_LOOP[m
[31m-|  blo ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall[m
[31m-|  hotcheck HOTCOUNT_CALL[m
[31m-|  blo ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state.[m
[31m-|.macro mv_vmstate, reg, st; mvn reg, #LJ_VMST_..st; .endmacro[m
[31m-|.macro st_vmstate, reg; str reg, [DISPATCH, #DISPATCH_GL(vmstate)]; .endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites mark and tmp.[m
[31m-|.macro barrierback, tab, mark, tmp[m
[31m-|  ldr tmp, [DISPATCH, #DISPATCH_GL(gc.grayagain)][m
[31m-|   bic mark, mark, #LJ_GC_BLACK		// black2gray(tab)[m
[31m-|  str tab, [DISPATCH, #DISPATCH_GL(gc.grayagain)][m
[31m-|   strb mark, tab->marked[m
[31m-|  str tmp, tab->gclist[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro .IOS, a, b[m
[31m-|.if IOS[m
[31m-|  a, b[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-#if !LJ_DUALNUM[m
[31m-#error "Only dual-number mode supported for ARM target"[m
[31m-#endif[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  // See vm_return. Also: RB = previous base.[m
[31m-  |  tst PC, #FRAME_P[m
[31m-  |  beq ->cont_dispatch[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  ldr PC, [RB, FRAME_PC]		// Fetch PC of previous frame.[m
[31m-  |   mvn CARG2, #~LJ_TTRUE[m
[31m-  |  mov BASE, RB[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |   str CARG2, [RA, FRAME_PC]		// Prepend true to results.[m
[31m-  |  sub RA, RA, #8[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  adds RC, RC, #8			// RC = (nresults+1)*8.[m
[31m-  |  mov CRET1, #LUA_YIELD[m
[31m-  |  beq ->vm_unwind_c_eh[m
[31m-  |  str RC, SAVE_MULTRES[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |  beq ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultptr, RC/MULTRES = (nresults+1)*8, PC = return[m
[31m-  |  // CARG1 = PC & FRAME_TYPE[m
[31m-  |  bic RB, PC, #FRAME_TYPEP[m
[31m-  |   cmp CARG1, #FRAME_C[m
[31m-  |  sub RB, BASE, RB			// RB = previous base.[m
[31m-  |   bne ->vm_returnp[m
[31m-  |[m
[31m-  |  str RB, L->base[m
[31m-  |   ldr KBASE, SAVE_NRES[m
[31m-  |    mv_vmstate CARG4, C[m
[31m-  |   sub BASE, BASE, #8[m
[31m-  |  subs CARG3, RC, #8[m
[31m-  |   lsl KBASE, KBASE, #3		// KBASE = (nresults_wanted+1)*8[m
[31m-  |    st_vmstate CARG4[m
[31m-  |  beq >2[m
[31m-  |1:[m
[31m-  |  subs CARG3, CARG3, #8[m
[31m-  |   ldrd CARG12, [RA], #8[m
[31m-  |   strd CARG12, [BASE], #8[m
[31m-  |  bne <1[m
[31m-  |2:[m
[31m-  |  cmp KBASE, RC			// More/less results wanted?[m
[31m-  |  bne >6[m
[31m-  |3:[m
[31m-  |  str BASE, L->top			// Store new top.[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  ldr RC, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |   mov CRET1, #0			// Ok return status for vm_pcall.[m
[31m-  |  str RC, L->cframe[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs_ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  blt >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  ldr CARG3, L->maxstack[m
[31m-  |   mvn CARG2, #~LJ_TNIL[m
[31m-  |  cmp BASE, CARG3[m
[31m-  |  bhs >8[m
[31m-  |   str CARG2, [BASE, #4][m
[31m-  |  add RC, RC, #8[m
[31m-  |  add BASE, BASE, #8[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  sub CARG1, RC, KBASE[m
[31m-  |  cmp KBASE, #0			// LUA_MULTRET+1 case?[m
[31m-  |  subne BASE, BASE, CARG1		// Either keep top or shrink it.[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  str BASE, L->top			// Save current top held in BASE (yes).[m
[31m-  |  lsr CARG2, KBASE, #3[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->top			// Need the (realloced) L->top in BASE.[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  mov sp, CARG1[m
[31m-  |  mov CRET1, CARG2[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |   mv_vmstate CARG4, C[m
[31m-  |  ldr GL:CARG3, L->glref[m
[31m-  |   str CARG4, GL:CARG3->vmstate[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |  bic CARG1, CARG1, #~CFRAME_RAWMASK	// Use two steps: bic sp is deprecated.[m
[31m-  |  mov sp, CARG1[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |   mov MASKR8, #255[m
[31m-  |    mov RC, #16			// 2 results: false + error message.[m
[31m-  |   lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   ldr DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |    mvn CARG1, #~LJ_TFALSE[m
[31m-  |  sub RA, BASE, #8			// Results start at BASE-8.[m
[31m-  |  ldr PC, [BASE, FRAME_PC]		// Fetch PC of previous frame.[m
[31m-  |   add DISPATCH, DISPATCH, #GG_G2DISP[m
[31m-  |   mv_vmstate CARG2, INTERP[m
[31m-  |    str CARG1, [BASE, #-4]		// Prepend false to error message.[m
[31m-  |   st_vmstate CARG2[m
[31m-  |  b ->vm_returnc[m
[31m-  |[m
[31m-  |->vm_unwind_ext:			// Complete external unwind.[m
[31m-#if !LJ_NO_UNWIND[m
[31m-  |  push {r0, r1, r2, lr}[m
[31m-  |  bl extern _Unwind_Complete[m
[31m-  |  ldr r0, [sp][m
[31m-  |  bl extern _Unwind_DeleteException[m
[31m-  |  pop {r0, r1, r2, lr}[m
[31m-  |  mov r0, r1[m
[31m-  |  bx r2[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  // CARG1 = L[m
[31m-  |  mov CARG2, #LUA_MINSTACK[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vm_growstack_l:			// Grow stack for Lua function.[m
[31m-  |  // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC[m
[31m-  |  add RC, BASE, RC[m
[31m-  |   sub RA, RA, BASE[m
[31m-  |    mov CARG1, L[m
[31m-  |  str BASE, L->base[m
[31m-  |   add PC, PC, #4			// Must point after first instruction.[m
[31m-  |  str RC, L->top[m
[31m-  |   lsr CARG2, RA, #3[m
[31m-  |2:[m
[31m-  |  // L->base = new base, L->top = top[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   ldr RC, L->top[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   sub NARGS8:RC, RC, BASE[m
[31m-  |  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  mov L, CARG1[m
[31m-  |    ldr DISPATCH, L:CARG1->glref	// Setup pointer to dispatch table.[m
[31m-  |  mov BASE, CARG2[m
[31m-  |    add DISPATCH, DISPATCH, #GG_G2DISP[m
[31m-  |   str L, SAVE_L[m
[31m-  |  mov PC, #FRAME_CP[m
[31m-  |   str CARG3, SAVE_NRES[m
[31m-  |    add CARG2, sp, #CFRAME_RESUME[m
[31m-  |  ldrb CARG1, L->status[m
[31m-  |   str CARG3, SAVE_ERRF[m
[31m-  |   str L, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   str CARG3, SAVE_CFRAME[m
[31m-  |  cmp CARG1, #0[m
[31m-  |    str CARG2, L->cframe[m
[31m-  |  beq >3[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |  mov RA, BASE[m
[31m-  |   ldr BASE, L->base[m
[31m-  |   ldr CARG1, L->top[m
[31m-  |    mov MASKR8, #255[m
[31m-  |     strb CARG3, L->status[m
[31m-  |   sub RC, CARG1, BASE[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |    lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |     mv_vmstate CARG2, INTERP[m
[31m-  |   add RC, RC, #8[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |     st_vmstate CARG2[m
[31m-  |   str RC, SAVE_MULTRES[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, #FRAME_CP[m
[31m-  |  str CARG4, SAVE_ERRF[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, #FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  ldr RC, L:CARG1->cframe[m
[31m-  |   str CARG3, SAVE_NRES[m
[31m-  |    mov L, CARG1[m
[31m-  |   str CARG1, SAVE_L[m
[31m-  |    ldr DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |     mov BASE, CARG2[m
[31m-  |   str CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  str RC, SAVE_CFRAME[m
[31m-  |    add DISPATCH, DISPATCH, #GG_G2DISP[m
[31m-  |  str sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |[m
[31m-  |3:  // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).[m
[31m-  |  str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |  ldr RB, L->base			// RB = old base (for vmeta_call).[m
[31m-  |   ldr CARG1, L->top[m
[31m-  |    mov MASKR8, #255[m
[31m-  |  add PC, PC, BASE[m
[31m-  |    lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |  sub PC, PC, RB			// PC = frame delta + frame type[m
[31m-  |    mv_vmstate CARG2, INTERP[m
[31m-  |   sub NARGS8:RC, CARG1, BASE[m
[31m-  |    st_vmstate CARG2[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  // RB = old base, BASE = new base, RC = nargs*8, PC = caller PC[m
[31m-  |  ldrd CARG34, [BASE, FRAME_FUNC][m
[31m-  |  checkfunc CARG4, ->vmeta_call[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, CARG3 = func, RC = nargs*8, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  mov L, CARG1[m
[31m-  |   ldr RA, L:CARG1->stack[m
[31m-  |  str CARG1, SAVE_L[m
[31m-  |    ldr DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |   ldr RB, L->top[m
[31m-  |  str CARG1, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |  ldr RC, L->cframe[m
[31m-  |    add DISPATCH, DISPATCH, #GG_G2DISP[m
[31m-  |   sub RA, RA, RB			// Compute -savestack(L, L->top).[m
[31m-  |  mov RB, #0[m
[31m-  |   str RA, SAVE_NRES			// Neg. delta means cframe w/o frame.[m
[31m-  |  str RB, SAVE_ERRF			// No error function.[m
[31m-  |  str RC, SAVE_CFRAME[m
[31m-  |  str sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |    str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |  blx CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |  movs BASE, CRET1[m
[31m-  |   mov PC, #FRAME_CP[m
[31m-  |  bne <3				// Else continue with the call.[m
[31m-  |  b ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultptr, RC = (nresults+1)*8[m
[31m-  |  ldr LFUNC:CARG3, [RB, FRAME_FUNC][m
[31m-  |    ldr CARG1, [BASE, #-16]		// Get continuation.[m
[31m-  |   mov CARG4, BASE[m
[31m-  |   mov BASE, RB			// Restore caller BASE.[m
[31m-  |.if FFI[m
[31m-  |    cmp CARG1, #1[m
[31m-  |.endif[m
[31m-  |   ldr PC, [CARG4, #-12]		// Restore PC from [cont|PC].[m
[31m-  |  ldr CARG3, LFUNC:CARG3->field_pc[m
[31m-  |    mvn INS, #~LJ_TNIL[m
[31m-  |    add CARG2, RA, RC[m
[31m-  |    str INS, [CARG2, #-4]		// Ensure one valid arg.[m
[31m-  |.if FFI[m
[31m-  |    bls >1[m
[31m-  |.endif[m
[31m-  |  ldr KBASE, [CARG3, #PC2PROTO(k)][m
[31m-  |  // BASE = base, RA = resultptr, CARG4 = meta base[m
[31m-  |    bx CARG1[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  beq ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: tailcall from C function.[m
[31m-  |  sub CARG4, CARG4, #16[m
[31m-  |  sub RC, CARG4, BASE[m
[31m-  |  b ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// RA = resultptr, CARG4 = meta base[m
[31m-  |  ldr INS, [PC, #-4][m
[31m-  |   sub CARG2, CARG4, #16[m
[31m-  |   ldrd CARG34, [RA][m
[31m-  |     str BASE, L->base[m
[31m-  |  decode_RB8 RC, INS[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |  add CARG1, BASE, RC[m
[31m-  |  subs CARG1, CARG2, CARG1[m
[31m-  |   strdne CARG34, [CARG2][m
[31m-  |   movne CARG3, CARG1[m
[31m-  |  bne ->BC_CAT_Z[m
[31m-  |   strd CARG34, [BASE, RA][m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets1:[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  sub CARG2, DISPATCH, #-DISPATCH_GL(tmptv)[m
[31m-  |   mvn CARG4, #~LJ_TTAB[m
[31m-  |  str TAB:RB, [CARG2][m
[31m-  |   str CARG4, [CARG2, #4][m
[31m-  |2:[m
[31m-  |   mvn CARG4, #~LJ_TSTR[m
[31m-  |  str STR:RC, TMPDlo[m
[31m-  |   str CARG4, TMPDhi[m
[31m-  |  mov CARG3, TMPDp[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetb:			// RC = index[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   str RC, TMPDlo[m
[31m-  |   mvn CARG4, #~LJ_TISNUM[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   str CARG4, TMPDhi[m
[31m-  |  mov CARG3, TMPDp[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   add CARG3, BASE, RC[m
[31m-  |1:[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  beq >3[m
[31m-  |  ldrd CARG34, [CRET1][m
[31m-  |   ins_next1[m
[31m-  |   ins_next2[m
[31m-  |  strd CARG34, [BASE, RA][m
[31m-  |   ins_next3[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |   rsb CARG1, BASE, #FRAME_CONT[m
[31m-  |  ldr BASE, L->top[m
[31m-  |    mov NARGS8:RC, #16		// 2 args for func(t, k).[m
[31m-  |    str PC, [BASE, #-12]		// [cont|PC][m
[31m-  |   add PC, CARG1, BASE[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  .IOS mov RC, BASE[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  .IOS mov BASE, RC[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  ldrdne CARG12, [CRET1][m
[31m-  |  mvneq CARG2, #~LJ_TNIL[m
[31m-  |  b ->BC_TGETR_Z[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets1:[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  sub CARG2, DISPATCH, #-DISPATCH_GL(tmptv)[m
[31m-  |   mvn CARG4, #~LJ_TTAB[m
[31m-  |  str TAB:RB, [CARG2][m
[31m-  |   str CARG4, [CARG2, #4][m
[31m-  |2:[m
[31m-  |   mvn CARG4, #~LJ_TSTR[m
[31m-  |  str STR:RC, TMPDlo[m
[31m-  |   str CARG4, TMPDhi[m
[31m-  |  mov CARG3, TMPDp[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetb:			// RC = index[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   str RC, TMPDlo[m
[31m-  |   mvn CARG4, #~LJ_TISNUM[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   str CARG4, TMPDhi[m
[31m-  |  mov CARG3, TMPDp[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   add CARG3, BASE, RC[m
[31m-  |1:[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |   ldrd CARG34, [BASE, RA][m
[31m-  |  beq >3[m
[31m-  |   ins_next1[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  strd CARG34, [CRET1][m
[31m-  |   ins_next2[m
[31m-  |   ins_next3[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |   rsb CARG1, BASE, #FRAME_CONT[m
[31m-  |  ldr BASE, L->top[m
[31m-  |    mov NARGS8:RC, #24		// 3 args for func(t, k, v).[m
[31m-  |   strd CARG34, [BASE, #16]		// Copy value to third argument.[m
[31m-  |    str PC, [BASE, #-12]		// [cont|PC][m
[31m-  |   add PC, CARG1, BASE[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |  str BASE, L->base[m
[31m-  |  .IOS mov RC, BASE[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // Returns TValue *.[m
[31m-  |  .IOS mov BASE, RC[m
[31m-  |  b ->BC_TSETR_Z[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  mov CARG1, L[m
[31m-  |   sub PC, PC, #4[m
[31m-  |  mov CARG2, RA[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG3, RC[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  decode_OP CARG4, INS[m
[31m-  |  bl extern lj_meta_comp  // (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |3:[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #1[m
[31m-  |  bhi ->vmeta_binop[m
[31m-  |4:[m
[31m-  |  ldrh RB, [PC, #2][m
[31m-  |   add PC, PC, #4[m
[31m-  |  add RB, PC, RB, lsl #2[m
[31m-  |  subhs PC, RB, #0x20000[m
[31m-  |->cont_nop:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_ra:				// RA = resultptr[m
[31m-  |  ldr INS, [PC, #-4][m
[31m-  |   ldrd CARG12, [RA][m
[31m-  |  decode_RA8 CARG3, INS[m
[31m-  |   strd CARG12, [BASE, CARG3][m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |->cont_condt:			// RA = resultptr[m
[31m-  |  ldr CARG2, [RA, #4][m
[31m-  |   mvn CARG1, #~LJ_TTRUE[m
[31m-  |  cmp CARG1, CARG2			// Branch if result is true.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->cont_condf:			// RA = resultptr[m
[31m-  |  ldr CARG2, [RA, #4][m
[31m-  |  checktp CARG2, LJ_TFALSE		// Branch if result is false.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV.[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal  // (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |   mov CARG2, INS[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal_cd		// (lua_State *L, BCIns op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |   lsr CARG2, RA, #3[m
[31m-  |   mov CARG3, RC[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG3, BASE, RB[m
[31m-  |   add CARG4, KBASE, RC[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG4, BASE, RB[m
[31m-  |   add CARG3, KBASE, RC[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  ldr INS, [PC, #-8][m
[31m-  |   sub PC, PC, #4[m
[31m-  |  add CARG3, BASE, RC[m
[31m-  |  add CARG4, BASE, RC[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG3, BASE, RB[m
[31m-  |   add CARG4, BASE, RC[m
[31m-  |1:[m
[31m-  |  decode_OP OP, INS[m
[31m-  |   add CARG2, BASE, RA[m
[31m-  |    str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |    str PC, SAVE_PC[m
[31m-  |  str OP, ARG5[m
[31m-  |  bl extern lj_meta_arith  // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  beq ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2[m
[31m-  |  sub CARG2, CRET1, BASE[m
[31m-  |   str PC, [CRET1, #-12]		// [cont|PC][m
[31m-  |  add PC, CARG2, #FRAME_CONT[m
[31m-  |   mov BASE, CRET1[m
[31m-  |    mov NARGS8:RC, #16		// 2 args for func(o1, o2).[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  add CARG2, BASE, RC[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |  // Returns NULL (retry) or TValue * (metamethod base).[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-#if LJ_52[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  bne ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |  ldr TAB:CARG1, [BASE, RC][m
[31m-  |  b ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  b ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // RB = old base, BASE = new base, RC = nargs*8[m
[31m-  |  mov CARG1, L[m
[31m-  |   str RB, L->base			// This is the callers base![m
[31m-  |  sub CARG2, BASE, #8[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  add CARG3, BASE, NARGS8:RC[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |   add NARGS8:RC, NARGS8:RC, #8	// Got one more argument now.[m
[31m-  |  ins_call[m
[31m-  |[m
[31m-  |->vmeta_callt:			// Resolve __call for BC_CALLT.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs*8[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  sub CARG2, RA, #8[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  add CARG3, RA, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  ldr LFUNC:CARG3, [RA, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |    add NARGS8:RC, NARGS8:RC, #8	// Got one more argument now.[m
[31m-  |  b ->BC_CALLT2_Z[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, RA[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |.if JIT[m
[31m-  |   ldrb OP, [PC, #-4][m
[31m-  |.endif[m
[31m-  |  ldr INS, [PC, #-4][m
[31m-  |.if JIT[m
[31m-  |   cmp OP, #BC_JFORI[m
[31m-  |.endif[m
[31m-  |  decode_RA8 RA, INS[m
[31m-  |  decode_RD RC, INS[m
[31m-  |.if JIT[m
[31m-  |   beq =>BC_JFORI[m
[31m-  |.endif[m
[31m-  |  b =>BC_FORI[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   ldrd CARG34, [BASE, #8][m
[31m-  |    cmp NARGS8:RC, #16[m
[31m-  |    blo ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name[m
[31m-  |  .ffunc_1 name[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name[m
[31m-  |  .ffunc_2 name[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  cmnlo CARG4, #-LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_d, name[m
[31m-  |  .ffunc name[m
[31m-  |  ldr CARG2, [BASE, #4][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  vldr d0, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_dd, name[m
[31m-  |  .ffunc name[m
[31m-  |  ldr CARG2, [BASE, #4][m
[31m-  |  ldr CARG4, [BASE, #12][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |  vldr d0, [BASE][m
[31m-  |  vldr d1, [BASE, #8][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  cmnlo CARG4, #-LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses CARG1 and CARG2.[m
[31m-  |.macro ffgccheck[m
[31m-  |  ldr CARG1, [DISPATCH, #DISPATCH_GL(gc.total)][m
[31m-  |  ldr CARG2, [DISPATCH, #DISPATCH_GL(gc.threshold)][m
[31m-  |  cmp CARG1, CARG2[m
[31m-  |  blge ->fff_gcstep[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  checktp CARG2, LJ_TTRUE[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  strd CARG12, [BASE, #-8][m
[31m-  |  mov RB, BASE[m
[31m-  |  subs RA, NARGS8:RC, #8[m
[31m-  |   add RC, NARGS8:RC, #8		// Compute (nresults+1)*8.[m
[31m-  |  beq ->fff_res			// Done if exactly 1 argument.[m
[31m-  |1:[m
[31m-  |   ldrd CARG12, [RB, #8][m
[31m-  |  subs RA, RA, #8[m
[31m-  |   strd CARG12, [RB], #8[m
[31m-  |  bne <1[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc type[m
[31m-  |  ldr CARG2, [BASE, #4][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  mvnlo CARG2, #~LJ_TISNUM[m
[31m-  |  rsb CARG4, CARG2, #(int)(offsetof(GCfuncC, upvalue)>>3)-1[m
[31m-  |  lsl CARG4, CARG4, #3[m
[31m-  |  ldrd CARG12, [CFUNC:CARG3, CARG4][m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  checktp CARG2, LJ_TTAB[m
[31m-  |  cmnne CARG2, #-LJ_TUDATA[m
[31m-  |  bne >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  ldr TAB:RB, TAB:CARG1->metatable[m
[31m-  |2:[m
[31m-  |   mvn CARG2, #~LJ_TNIL[m
[31m-  |   ldr STR:RC, [DISPATCH, #DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])][m
[31m-  |  cmp TAB:RB, #0[m
[31m-  |  beq ->fff_restv[m
[31m-  |  ldr CARG3, TAB:RB->hmask[m
[31m-  |   ldr CARG4, STR:RC->hash[m
[31m-  |    ldr NODE:INS, TAB:RB->node[m
[31m-  |  and CARG3, CARG3, CARG4		// idx = str->hash & tab->hmask[m
[31m-  |  add CARG3, CARG3, CARG3, lsl #1[m
[31m-  |    add NODE:INS, NODE:INS, CARG3, lsl #3	// node = tab->node + idx*3*8[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  ldrd CARG34, NODE:INS->key  // STALL: early NODE:INS.[m
[31m-  |   ldrd CARG12, NODE:INS->val[m
[31m-  |    ldr NODE:INS, NODE:INS->next[m
[31m-  |  checktp CARG4, LJ_TSTR[m
[31m-  |  cmpeq CARG3, STR:RC[m
[31m-  |  beq >5[m
[31m-  |  cmp NODE:INS, #0[m
[31m-  |  bne <3[m
[31m-  |4:[m
[31m-  |  mov CARG1, RB			// Use metatable as default result.[m
[31m-  |  mvn CARG2, #~LJ_TTAB[m
[31m-  |  b ->fff_restv[m
[31m-  |5:[m
[31m-  |  checktp CARG2, LJ_TNIL[m
[31m-  |  bne ->fff_restv[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  mvnhs CARG2, CARG2[m
[31m-  |  movlo CARG2, #~LJ_TISNUM[m
[31m-  |  add CARG4, DISPATCH, CARG2, lsl #2[m
[31m-  |  ldr TAB:RB, [CARG4, #DISPATCH_GL(gcroot[GCROOT_BASEMT])][m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  checktp CARG2, LJ_TTAB[m
[31m-  |   ldreq TAB:RB, TAB:CARG1->metatable[m
[31m-  |  checktpeq CARG4, LJ_TTAB[m
[31m-  |    ldrbeq CARG4, TAB:CARG1->marked[m
[31m-  |   cmpeq TAB:RB, #0[m
[31m-  |  bne ->fff_fallback[m
[31m-  |    tst CARG4, #LJ_GC_BLACK		// isblack(table)[m
[31m-  |     str TAB:CARG3, TAB:CARG1->metatable[m
[31m-  |    beq ->fff_restv[m
[31m-  |  barrierback TAB:CARG1, CARG4, CARG3[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc rawget[m
[31m-  |  ldrd CARG34, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |   mov CARG2, CARG3[m
[31m-  |  checktab CARG4, ->fff_fallback[m
[31m-  |   mov CARG1, L[m
[31m-  |   add CARG3, BASE, #8[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern lj_tab_get  // (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // Returns cTValue *.[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  ldrd CARG12, [CRET1][m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bls ->fff_restv[m
[31m-  |  b ->fff_fallback[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  checktp CARG2, LJ_TSTR[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  beq ->fff_restv[m
[31m-  |  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  ldr CARG4, [DISPATCH, #DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])][m
[31m-  |   str BASE, L->base[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  cmpls CARG4, #0[m
[31m-  |   str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  ffgccheck[m
[31m-  |  mov CARG1, L[m
[31m-  |  mov CARG2, BASE[m
[31m-  |  bl extern lj_strfmt_number		// (lua_State *L, cTValue *o)[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  mvn CARG2, #~LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 next[m
[31m-  |   mvn CARG4, #~LJ_TNIL[m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-  |   strd CARG34, [BASE, NARGS8:RC]	// Set missing 2nd arg to nil.[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  mov CARG2, CARG1[m
[31m-  |    str BASE, L->base		// Add frame since C call can throw.[m
[31m-  |  mov CARG1, L[m
[31m-  |    str BASE, L->top			// Dummy frame length is ok.[m
[31m-  |  add CARG3, BASE, #8[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Returns 0 at end of traversal.[m
[31m-  |  .IOS ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  mvneq CRET2, #~LJ_TNIL[m
[31m-  |  beq ->fff_restv			// End of traversal: return nil.[m
[31m-  |  ldrd CARG12, [BASE, #8]		// Copy key and value to results.[m
[31m-  |   ldrd CARG34, [BASE, #16][m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |  strd CARG12, [BASE, #-8][m
[31m-  |   strd CARG34, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  ldr TAB:RB, TAB:CARG1->metatable[m
[31m-#endif[m
[31m-  |   ldrd CFUNC:CARG34, CFUNC:CARG3->upvalue[0][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-#if LJ_52[m
[31m-  |  cmp TAB:RB, #0[m
[31m-  |  bne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mvn CARG2, #~LJ_TNIL[m
[31m-  |    mov RC, #(3+1)*8[m
[31m-  |   strd CFUNC:CARG34, [BASE, #-8][m
[31m-  |  str CARG2, [BASE, #12][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_2 ipairs_aux[m
[31m-  |  checktp CARG2, LJ_TTAB[m
[31m-  |  checktpeq CARG4, LJ_TISNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  ldr RB, TAB:CARG1->asize[m
[31m-  |   ldr RC, TAB:CARG1->array[m
[31m-  |  add CARG3, CARG3, #1[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |  cmp CARG3, RB[m
[31m-  |   add RC, RC, CARG3, lsl #3[m
[31m-  |  strd CARG34, [BASE, #-8][m
[31m-  |   ldrdlo CARG12, [RC][m
[31m-  |   mov RC, #(0+1)*8[m
[31m-  |  bhs >2				// Not in array part?[m
[31m-  |1:[m
[31m-  |   checktp CARG2, LJ_TNIL[m
[31m-  |   movne RC, #(2+1)*8[m
[31m-  |   strdne CARG12, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  ldr RB, TAB:CARG1->hmask[m
[31m-  |   mov CARG2, CARG3[m
[31m-  |  cmp RB, #0[m
[31m-  |  beq ->fff_res[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  cmp CRET1, #0[m
[31m-  |  beq ->fff_res[m
[31m-  |  ldrd CARG12, [CRET1][m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  ldr TAB:RB, TAB:CARG1->metatable[m
[31m-#endif[m
[31m-  |   ldrd CFUNC:CARG34, CFUNC:CARG3->upvalue[0][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-#if LJ_52[m
[31m-  |  cmp TAB:RB, #0[m
[31m-  |  bne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CARG1, #0[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |    mov RC, #(3+1)*8[m
[31m-  |   strd CFUNC:CARG34, [BASE, #-8][m
[31m-  |  strd CARG12, [BASE, #8][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc pcall[m
[31m-  |  ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  tst RA, #HOOK_ACTIVE		// Remember active hook before pcall.[m
[31m-  |   mov RB, BASE[m
[31m-  |   add BASE, BASE, #8[m
[31m-  |  moveq PC, #8+FRAME_PCALL[m
[31m-  |  movne PC, #8+FRAME_PCALLH[m
[31m-  |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc_2 xpcall[m
[31m-  |  ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |  checkfunc CARG4, ->fff_fallback	// Traceback must be a function.[m
[31m-  |   mov RB, BASE[m
[31m-  |  strd CARG12, [BASE, #8]		// Swap function and traceback.[m
[31m-  |   strd CARG34, [BASE][m
[31m-  |  tst RA, #HOOK_ACTIVE		// Remember active hook before pcall.[m
[31m-  |   add BASE, BASE, #16[m
[31m-  |  moveq PC, #16+FRAME_PCALL[m
[31m-  |  movne PC, #16+FRAME_PCALLH[m
[31m-  |   sub NARGS8:RC, NARGS8:RC, #16[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  checktp CARG2, LJ_TTHREAD[m
[31m-  |  bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  ldr L:CARG1, CFUNC:CARG3->upvalue[0].gcr[m
[31m-  |.endif[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |     str BASE, L->base[m
[31m-  |  ldr CARG2, L:CARG1->top[m
[31m-  |   ldrb RA, L:CARG1->status[m
[31m-  |    ldr RB, L:CARG1->base[m
[31m-  |  add CARG3, CARG2, NARGS8:RC[m
[31m-  |  add CARG4, CARG2, RA[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  cmp CARG4, RB[m
[31m-  |  beq ->fff_fallback[m
[31m-  |   ldr CARG4, L:CARG1->maxstack[m
[31m-  |    ldr RB, L:CARG1->cframe[m
[31m-  |   cmp RA, #LUA_YIELD[m
[31m-  |   cmpls CARG3, CARG4[m
[31m-  |    cmpls RB, #0[m
[31m-  |    bhi ->fff_fallback[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  sub CARG3, CARG3, #8		// Keep resumed thread in stack for GC.[m
[31m-  |  add BASE, BASE, #8[m
[31m-  |  sub NARGS8:RC, NARGS8:RC, #8[m
[31m-  |.endif[m
[31m-  |  str CARG3, L:CARG1->top[m
[31m-  |  str BASE, L->top[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |   ldrd CARG34, [BASE, RB][m
[31m-  |  cmp RB, NARGS8:RC[m
[31m-  |   strdne CARG34, [CARG2, RB][m
[31m-  |  add RB, RB, #8[m
[31m-  |  bne <2[m
[31m-  |[m
[31m-  |  mov CARG3, #0[m
[31m-  |   mov L:RA, L:CARG1[m
[31m-  |  mov CARG4, #0[m
[31m-  |  bl ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |  // Returns thread status.[m
[31m-  |4:[m
[31m-  |  ldr CARG3, L:RA->base[m
[31m-  |    mv_vmstate CARG2, INTERP[m
[31m-  |  ldr CARG4, L:RA->top[m
[31m-  |   cmp CRET1, #LUA_YIELD[m
[31m-  |  ldr BASE, L->base[m
[31m-  |    str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |    st_vmstate CARG2[m
[31m-  |   bhi >8[m
[31m-  |  subs RC, CARG4, CARG3[m
[31m-  |   ldr CARG1, L->maxstack[m
[31m-  |   add CARG2, BASE, RC[m
[31m-  |  beq >6				// No results?[m
[31m-  |  cmp CARG2, CARG1[m
[31m-  |   mov RB, #0[m
[31m-  |  bhi >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  sub CARG4, RC, #8[m
[31m-  |   str CARG3, L:RA->top		// Clear coroutine stack.[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |   ldrd CARG12, [CARG3, RB][m
[31m-  |  cmp RB, CARG4[m
[31m-  |   strd CARG12, [BASE, RB][m
[31m-  |  add RB, RB, #8[m
[31m-  |  bne <5[m
[31m-  |6:[m
[31m-  |.if resume[m
[31m-  |  mvn CARG3, #~LJ_TTRUE[m
[31m-  |   add RC, RC, #16[m
[31m-  |7:[m
[31m-  |  str CARG3, [BASE, #-4]		// Prepend true/false to results.[m
[31m-  |   sub RA, BASE, #8[m
[31m-  |.else[m
[31m-  |   mov RA, BASE[m
[31m-  |   add RC, RC, #8[m
[31m-  |.endif[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   str RC, SAVE_MULTRES[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  ldrd CARG12, [CARG4, #-8]![m
[31m-  |   mvn CARG3, #~LJ_TFALSE[m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |  str CARG4, L:RA->top		// Remove error from coroutine stack.[m
[31m-  |  strd CARG12, [BASE]		// Copy error message.[m
[31m-  |  b <7[m
[31m-  |.else[m
[31m-  |  mov CARG1, L[m
[31m-  |  mov CARG2, L:RA[m
[31m-  |  bl extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |  // Never returns.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  mov CARG1, L[m
[31m-  |  lsr CARG2, RC, #3[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov CRET1, #0[m
[31m-  |  b <4[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  ldr CARG1, L->cframe[m
[31m-  |   add CARG2, BASE, NARGS8:RC[m
[31m-  |   str BASE, L->base[m
[31m-  |  tst CARG1, #CFRAME_RESUME[m
[31m-  |   str CARG2, L->top[m
[31m-  |    mov CRET1, #LUA_YIELD[m
[31m-  |   mov CARG3, #0[m
[31m-  |  beq ->fff_fallback[m
[31m-  |   str CARG3, L->cframe[m
[31m-  |    strb CRET1, L->status[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro math_round, func[m
[31m-  |  .ffunc_1 math_ .. func[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  beq ->fff_restv[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  // Round FP value and normalize result.[m
[31m-  |  lsl CARG3, CARG2, #1[m
[31m-  |  adds RB, CARG3, #0x00200000[m
[31m-  |  bpl >2				// |x| < 1?[m
[31m-  |  mvn CARG4, #0x3e0[m
[31m-  |    subs RB, CARG4, RB, asr #21[m
[31m-  |  lsl CARG4, CARG2, #11[m
[31m-  |   lsl CARG3, CARG1, #11[m
[31m-  |  orr CARG4, CARG4, #0x80000000[m
[31m-  |   rsb INS, RB, #32[m
[31m-  |  orr CARG4, CARG4, CARG1, lsr #21[m
[31m-  |    bls >3				// |x| >= 2^31?[m
[31m-  |   orr CARG3, CARG3, CARG4, lsl INS[m
[31m-  |  lsr CARG1, CARG4, RB[m
[31m-  |.if "func" == "floor"[m
[31m-  |   tst CARG3, CARG2, asr #31[m
[31m-  |   addne CARG1, CARG1, #1[m
[31m-  |.else[m
[31m-  |   bics CARG3, CARG3, CARG2, asr #31[m
[31m-  |   addsne CARG1, CARG1, #1[m
[31m-  |   ldrdvs CARG12, >9[m
[31m-  |   bvs ->fff_restv[m
[31m-  |.endif[m
[31m-  |    cmp CARG2, #0[m
[31m-  |    rsblt CARG1, CARG1, #0[m
[31m-  |1:[m
[31m-  |   mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |2:  // |x| < 1[m
[31m-  |  bcs ->fff_restv			// |x| is not finite.[m
[31m-  |  orr CARG3, CARG3, CARG1		// ztest = abs(hi) | lo[m
[31m-  |.if "func" == "floor"[m
[31m-  |  tst CARG3, CARG2, asr #31		// return (ztest & sign) == 0 ? 0 : -1[m
[31m-  |  moveq CARG1, #0[m
[31m-  |  mvnne CARG1, #0[m
[31m-  |.else[m
[31m-  |  bics CARG3, CARG3, CARG2, asr #31	// return (ztest & ~sign) == 0 ? 0 : 1[m
[31m-  |  moveq CARG1, #0[m
[31m-  |  movne CARG1, #1[m
[31m-  |.endif[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |3:  // |x| >= 2^31. Check for x == -(2^31).[m
[31m-  |  cmpeq CARG4, #0x80000000[m
[31m-  |.if "func" == "floor"[m
[31m-  |  cmpeq CARG3, #0[m
[31m-  |.endif[m
[31m-  |  bne >4[m
[31m-  |  cmp CARG2, #0[m
[31m-  |  movmi CARG1, #0x80000000[m
[31m-  |  bmi <1[m
[31m-  |4:[m
[31m-  |  bl ->vm_..func.._sf[m
[31m-  |  b ->fff_restv[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |[m
[31m-  |.align 8[m
[31m-  |9:[m
[31m-  |  .long 0x00000000, 0x41e00000	// 2^31.[m
[31m-  |[m
[31m-  |.ffunc_1 math_abs[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  bicne CARG2, CARG2, #0x80000000[m
[31m-  |  bne ->fff_restv[m
[31m-  |  cmp CARG1, #0[m
[31m-  |  rsbslt CARG1, CARG1, #0[m
[31m-  |  ldrdvs CARG12, <9[m
[31m-  |  // Fallthrough.[m
[31m-  |[m
[31m-  |->fff_restv:[m
[31m-  |  // CARG12 = TValue result.[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |  strd CARG12, [BASE, #-8][m
[31m-  |->fff_res1:[m
[31m-  |  // PC = return.[m
[31m-  |  mov RC, #(1+1)*8[m
[31m-  |->fff_res:[m
[31m-  |  // RC = (nresults+1)*8, PC = return.[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |  ldreq INS, [PC, #-4][m
[31m-  |   str RC, SAVE_MULTRES[m
[31m-  |  sub RA, BASE, #8[m
[31m-  |  bne ->vm_return[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |5:[m
[31m-  |  cmp RB, RC				// More results expected?[m
[31m-  |  bhi >6[m
[31m-  |  decode_RA8 CARG1, INS[m
[31m-  |   ins_next1[m
[31m-  |   ins_next2[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |  sub BASE, RA, CARG1[m
[31m-  |   ins_next3[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  add CARG2, RA, RC[m
[31m-  |  mvn CARG1, #~LJ_TNIL[m
[31m-  |   add RC, RC, #8[m
[31m-  |  str CARG1, [CARG2, #-4][m
[31m-  |  b <5[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |.if HFABI[m
[31m-  |  .ffunc_d math_ .. func[m
[31m-  |.else[m
[31m-  |  .ffunc_n math_ .. func[m
[31m-  |.endif[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern func[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |.if HFABI[m
[31m-  |  b ->fff_resd[m
[31m-  |.else[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |.if HFABI[m
[31m-  |  .ffunc_dd math_ .. func[m
[31m-  |.else[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |.endif[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern func[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |.if HFABI[m
[31m-  |  b ->fff_resd[m
[31m-  |.else[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.if FPU[m
[31m-  |  .ffunc_d math_sqrt[m
[31m-  |  vsqrt.f64 d0, d0[m
[31m-  |->fff_resd:[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |  vstr d0, [BASE, #-8][m
[31m-  |  b ->fff_res1[m
[31m-  |.else[m
[31m-  |  math_extern sqrt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |.if HFABI[m
[31m-  |  ldr CARG2, [BASE, #4][m
[31m-  |   cmp NARGS8:RC, #8			// Need exactly 1 argument.[m
[31m-  |  vldr d0, [BASE][m
[31m-  |   bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   cmp NARGS8:RC, #8			// Need exactly 1 argument.[m
[31m-  |   bne ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern log[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |.if HFABI[m
[31m-  |  b ->fff_resd[m
[31m-  |.else[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.if HFABI[m
[31m-  |  .ffunc math_ldexp[m
[31m-  |  ldr CARG4, [BASE, #4][m
[31m-  |  ldrd CARG12, [BASE, #8][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  vldr d0, [BASE][m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern ldexp			// (double x, int exp)[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  b ->fff_resd[m
[31m-  |.else[m
[31m-  |.ffunc_2 math_ldexp[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern ldexp			// (double x, int exp)[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.if HFABI[m
[31m-  |.ffunc_d math_frexp[m
[31m-  |  mov CARG1, sp[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern frexp[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |   ldr CARG3, [sp][m
[31m-  |   mvn CARG4, #~LJ_TISNUM[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |  vstr d0, [BASE, #-8][m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |   strd CARG34, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |.else[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |  mov CARG3, sp[m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern frexp[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |   ldr CARG3, [sp][m
[31m-  |   mvn CARG4, #~LJ_TISNUM[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |  strd CARG12, [BASE, #-8][m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |   strd CARG34, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.if HFABI[m
[31m-  |.ffunc_d math_modf[m
[31m-  |  sub CARG1, BASE, #8[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern modf[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |   mov RC, #(2+1)*8[m
[31m-  |  vstr d0, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |.else[m
[31m-  |.ffunc_n math_modf[m
[31m-  |  sub CARG3, BASE, #8[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  .IOS mov RA, BASE[m
[31m-  |  bl extern modf[m
[31m-  |  .IOS mov BASE, RA[m
[31m-  |   mov RC, #(2+1)*8[m
[31m-  |  strd CARG12, [BASE][m
[31m-  |  b ->fff_res[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.macro math_minmax, name, cond, fcond[m
[31m-  |.if FPU[m
[31m-  |  .ffunc_1 name[m
[31m-  |   add RB, BASE, RC[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |   add RA, BASE, #8[m
[31m-  |  bne >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  ldrd CARG34, [RA][m
[31m-  |   cmp RA, RB[m
[31m-  |   bhs ->fff_restv[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bne >3[m
[31m-  |  cmp CARG1, CARG3[m
[31m-  |   add RA, RA, #8[m
[31m-  |  mov..cond CARG1, CARG3[m
[31m-  |  b <1[m
[31m-  |3:  // Convert intermediate result to number and continue below.[m
[31m-  |  vmov s4, CARG1[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  vldr d1, [RA][m
[31m-  |  vcvt.f64.s32 d0, s4[m
[31m-  |  b >6[m
[31m-  |[m
[31m-  |4:[m
[31m-  |  vldr d0, [BASE][m
[31m-  |  bhi ->fff_fallback[m
[31m-  |5:  // Handle numbers.[m
[31m-  |  ldrd CARG34, [RA][m
[31m-  |  vldr d1, [RA][m
[31m-  |   cmp RA, RB[m
[31m-  |   bhs ->fff_resd[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bhs >7[m
[31m-  |6:[m
[31m-  |  vcmp.f64 d0, d1[m
[31m-  |  vmrs[m
[31m-  |   add RA, RA, #8[m
[31m-  |  vmov..fcond.f64 d0, d1[m
[31m-  |  b <5[m
[31m-  |7:  // Convert integer to number and continue above.[m
[31m-  |  vmov s4, CARG3[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  vcvt.f64.s32 d1, s4[m
[31m-  |  b <6[m
[31m-  |[m
[31m-  |.else[m
[31m-  |[m
[31m-  |  .ffunc_1 name[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |   mov RA, #8[m
[31m-  |  bne >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  ldrd CARG34, [BASE, RA][m
[31m-  |   cmp RA, RC[m
[31m-  |   bhs ->fff_restv[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bne >3[m
[31m-  |  cmp CARG1, CARG3[m
[31m-  |   add RA, RA, #8[m
[31m-  |  mov..cond CARG1, CARG3[m
[31m-  |  b <1[m
[31m-  |3:  // Convert intermediate result to number and continue below.[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  bl extern __aeabi_i2d[m
[31m-  |  ldrd CARG34, [BASE, RA][m
[31m-  |  b >6[m
[31m-  |[m
[31m-  |4:[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |5:  // Handle numbers.[m
[31m-  |  ldrd CARG34, [BASE, RA][m
[31m-  |   cmp RA, RC[m
[31m-  |   bhs ->fff_restv[m
[31m-  |  checktp CARG4, LJ_TISNUM[m
[31m-  |  bhs >7[m
[31m-  |6:[m
[31m-  |  bl extern __aeabi_cdcmple[m
[31m-  |   add RA, RA, #8[m
[31m-  |  mov..fcond CARG1, CARG3[m
[31m-  |  mov..fcond CARG2, CARG4[m
[31m-  |  b <5[m
[31m-  |7:  // Convert integer to number and continue above.[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |  strd CARG12, TMPD[m
[31m-  |  mov CARG1, CARG3[m
[31m-  |  bl extern __aeabi_i2d[m
[31m-  |  ldrd CARG34, TMPD[m
[31m-  |  b <6[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, gt, hi[m
[31m-  |  math_minmax math_max, lt, lo[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   checktpeq CARG2, LJ_TSTR		// Need exactly 1 argument.[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  ldr CARG3, STR:CARG1->len[m
[31m-  |   ldrb CARG1, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |   mvn CARG2, #~LJ_TISNUM[m
[31m-  |  cmp CARG3, #0[m
[31m-  |  moveq RC, #(0+1)*8[m
[31m-  |  movne RC, #(1+1)*8[m
[31m-  |   strd CARG12, [BASE, #-8][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |   cmp NARGS8:RC, #8			// Need exactly 1 argument.[m
[31m-  |   checktpeq CARG2, LJ_TISNUM[m
[31m-  |   bicseq CARG4, CARG1, #255[m
[31m-  |  mov CARG3, #1[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  str CARG1, TMPD[m
[31m-  |  mov CARG2, TMPDp			// Points to stack. Little-endian.[m
[31m-  |->fff_newstr:[m
[31m-  |  // CARG2 = str, CARG3 = len.[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   mvn CARG2, #~LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |   ldrd CARG34, [BASE, #16][m
[31m-  |    cmp NARGS8:RC, #16[m
[31m-  |     mvn RB, #0[m
[31m-  |    beq >1[m
[31m-  |    blo ->fff_fallback[m
[31m-  |   checktp CARG4, LJ_TISNUM[m
[31m-  |    mov RB, CARG3[m
[31m-  |   bne ->fff_fallback[m
[31m-  |1:[m
[31m-  |  ldrd CARG34, [BASE, #8][m
[31m-  |  checktp CARG2, LJ_TSTR[m
[31m-  |   ldreq CARG2, STR:CARG1->len[m
[31m-  |  checktpeq CARG4, LJ_TISNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  // CARG1 = str, CARG2 = str->len, CARG3 = start, RB = end[m
[31m-  |  add CARG4, CARG2, #1[m
[31m-  |  cmp CARG3, #0			// if (start < 0) start += len+1[m
[31m-  |  addlt CARG3, CARG3, CARG4[m
[31m-  |  cmp CARG3, #1			// if (start < 1) start = 1[m
[31m-  |  movlt CARG3, #1[m
[31m-  |  cmp RB, #0				// if (end < 0) end += len+1[m
[31m-  |  addlt RB, RB, CARG4[m
[31m-  |  bic RB, RB, RB, asr #31		// if (end < 0) end = 0[m
[31m-  |  cmp RB, CARG2			// if (end > len) end = len[m
[31m-  |   add CARG1, STR:CARG1, #sizeof(GCstr)-1[m
[31m-  |  movgt RB, CARG2[m
[31m-  |   add CARG2, CARG1, CARG3[m
[31m-  |  subs CARG3, RB, CARG3		// len = end - start[m
[31m-  |   add CARG3, CARG3, #1		// len += 1[m
[31m-  |  bge ->fff_newstr[m
[31m-  |->fff_emptystr:[m
[31m-  |  sub STR:CARG1, DISPATCH, #-DISPATCH_GL(strempty)[m
[31m-  |  mvn CARG2, #~LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |  ldr CARG3, [BASE, #4][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  ldr STR:CARG2, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  sub SBUF:CARG1, DISPATCH, #-DISPATCH_GL(tmpbuf)[m
[31m-  |  checkstr CARG3, ->fff_fallback[m
[31m-  |  ldr CARG4, SBUF:CARG1->b[m
[31m-  |   str BASE, L->base[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   str L, SBUF:CARG1->L[m
[31m-  |  str CARG4, SBUF:CARG1->p[m
[31m-  |  bl extern lj_buf_putstr_ .. name[m
[31m-  |  bl extern lj_buf_tostr[m
[31m-  |  b ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP number to bit conversion for soft-float. Clobbers r0-r3.[m
[31m-  |->vm_tobit_fb:[m
[31m-  |  bhi ->fff_fallback[m
[31m-  |->vm_tobit:[m
[31m-  |  lsl RB, CARG2, #1[m
[31m-  |  adds RB, RB, #0x00200000[m
[31m-  |  movpl CARG1, #0			// |x| < 1?[m
[31m-  |  bxpl lr[m
[31m-  |  mvn CARG4, #0x3e0[m
[31m-  |  subs RB, CARG4, RB, asr #21[m
[31m-  |  bmi >1				// |x| >= 2^32?[m
[31m-  |  lsl CARG4, CARG2, #11[m
[31m-  |  orr CARG4, CARG4, #0x80000000[m
[31m-  |  orr CARG4, CARG4, CARG1, lsr #21[m
[31m-  |   cmp CARG2, #0[m
[31m-  |  lsr CARG1, CARG4, RB[m
[31m-  |   rsblt CARG1, CARG1, #0[m
[31m-  |  bx lr[m
[31m-  |1:[m
[31m-  |  add RB, RB, #21[m
[31m-  |  lsr CARG4, CARG1, RB[m
[31m-  |  rsb RB, RB, #20[m
[31m-  |  lsl CARG1, CARG2, #12[m
[31m-  |   cmp CARG2, #0[m
[31m-  |  orr CARG1, CARG4, CARG1, lsl RB[m
[31m-  |   rsblt CARG1, CARG1, #0[m
[31m-  |  bx lr[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name[m
[31m-  |  .ffunc_1 bit_..name[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  blne ->vm_tobit_fb[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit tobit[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name[m
[31m-  |  mov CARG3, CARG1[m
[31m-  |  mov RA, #8[m
[31m-  |1:[m
[31m-  |  ldrd CARG12, [BASE, RA][m
[31m-  |   cmp RA, NARGS8:RC[m
[31m-  |    add RA, RA, #8[m
[31m-  |   bge >2[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  blne ->vm_tobit_fb[m
[31m-  |  ins CARG3, CARG3, CARG1[m
[31m-  |  b <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op band, and[m
[31m-  |.ffunc_bit_op bor, orr[m
[31m-  |.ffunc_bit_op bxor, eor[m
[31m-  |[m
[31m-  |2:[m
[31m-  |  mvn CARG4, #~LJ_TISNUM[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  strd CARG34, [BASE, #-8][m
[31m-  |  b ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_bit bswap[m
[31m-  |  eor CARG3, CARG1, CARG1, ror #16[m
[31m-  |  bic CARG3, CARG3, #0x00ff0000[m
[31m-  |  ror CARG1, CARG1, #8[m
[31m-  |   mvn CARG2, #~LJ_TISNUM[m
[31m-  |  eor CARG1, CARG1, CARG3, lsr #8[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc_bit bnot[m
[31m-  |  mvn CARG1, CARG1[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins, shmod[m
[31m-  |  .ffunc bit_..name[m
[31m-  |  ldrd CARG12, [BASE, #8][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  blne ->vm_tobit_fb[m
[31m-  |.if shmod == 0[m
[31m-  |  and RA, CARG1, #31[m
[31m-  |.else[m
[31m-  |  rsb RA, CARG1, #0[m
[31m-  |.endif[m
[31m-  |  ldrd CARG12, [BASE][m
[31m-  |  checktp CARG2, LJ_TISNUM[m
[31m-  |  blne ->vm_tobit_fb[m
[31m-  |  ins CARG1, CARG1, RA[m
[31m-  |  mvn CARG2, #~LJ_TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh lshift, lsl, 0[m
[31m-  |.ffunc_bit_sh rshift, lsr, 0[m
[31m-  |.ffunc_bit_sh arshift, asr, 0[m
[31m-  |.ffunc_bit_sh rol, ror, 1[m
[31m-  |.ffunc_bit_sh ror, ror, 0[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |   ldr CARG3, [BASE, FRAME_FUNC][m
[31m-  |  ldr CARG2, L->maxstack[m
[31m-  |  add CARG1, BASE, NARGS8:RC[m
[31m-  |    ldr PC, [BASE, FRAME_PC]		// Fallback may overwrite PC.[m
[31m-  |  str CARG1, L->top[m
[31m-  |   ldr CARG3, CFUNC:CARG3->f[m
[31m-  |    str BASE, L->base[m
[31m-  |  add CARG1, CARG1, #8*LUA_MINSTACK[m
[31m-  |    str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  cmp CARG1, CARG2[m
[31m-  |   mov CARG1, L[m
[31m-  |  bhi >5				// Need to grow stack.[m
[31m-  |   blx CARG3				// (lua_State *L)[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |   ldr BASE, L->base[m
[31m-  |  cmp CRET1, #0[m
[31m-  |   lsl RC, CRET1, #3[m
[31m-  |   sub RA, BASE, #8[m
[31m-  |  bgt ->fff_res			// Returned nresults+1?[m
[31m-  |1:  // Returned 0 or -1: retry fast path.[m
[31m-  |   ldr CARG1, L->top[m
[31m-  |    ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   sub NARGS8:RC, CARG1, BASE[m
[31m-  |  bne ->vm_call_tail			// Returned -1?[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   bic CARG2, PC, #FRAME_TYPEP[m
[31m-  |  ldreq INS, [PC, #-4][m
[31m-  |  andeq CARG2, MASKR8, INS, lsr #5	// Conditional decode_RA8.[m
[31m-  |  addeq CARG2, CARG2, #8[m
[31m-  |  sub RB, BASE, CARG2[m
[31m-  |  b ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  mov CARG2, #LUA_MINSTACK[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  cmp CARG1, CARG1			// Set zero-flag to force retry.[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |  mov RA, lr[m
[31m-  |   str BASE, L->base[m
[31m-  |  add CARG2, BASE, NARGS8:RC[m
[31m-  |   str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  str CARG2, L->top[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_gc_step		// (lua_State *L)[m
[31m-  |   ldr BASE, L->base[m
[31m-  |  mov lr, RA				// Help return address predictor.[m
[31m-  |   ldr CFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |  bx lr[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |  tst CARG1, #HOOK_VMEVENT		// No recording while in vmevent.[m
[31m-  |  bne >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |   ldr CARG2, [DISPATCH, #DISPATCH_GL(hookcount)][m
[31m-  |  tst CARG1, #HOOK_ACTIVE[m
[31m-  |  bne >1[m
[31m-  |   sub CARG2, CARG2, #1[m
[31m-  |  tst CARG1, #LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |   strne CARG2, [DISPATCH, #DISPATCH_GL(hookcount)][m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |  tst CARG1, #HOOK_ACTIVE		// Hook already active?[m
[31m-  |  beq >1[m
[31m-  |5:  // Re-dispatch to static ins.[m
[31m-  |  decode_OP OP, INS[m
[31m-  |  add OP, DISPATCH, OP, lsl #2[m
[31m-  |  ldr pc, [OP, #GG_DISP2STATIC][m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)][m
[31m-  |   ldr CARG2, [DISPATCH, #DISPATCH_GL(hookcount)][m
[31m-  |  tst CARG1, #HOOK_ACTIVE		// Hook already active?[m
[31m-  |  bne <5[m
[31m-  |  tst CARG1, #LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beq <5[m
[31m-  |   subs CARG2, CARG2, #1[m
[31m-  |   str CARG2, [DISPATCH, #DISPATCH_GL(hookcount)][m
[31m-  |   beq >1[m
[31m-  |  tst CARG1, #LUA_MASKLINE[m
[31m-  |  beq <5[m
[31m-  |1:[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, PC[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  bl extern lj_dispatch_ins		// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  ldr BASE, L->base[m
[31m-  |4:  // Re-dispatch to static ins.[m
[31m-  |  ldrb OP, [PC, #-4][m
[31m-  |   ldr INS, [PC, #-4][m
[31m-  |  add OP, DISPATCH, OP, lsl #2[m
[31m-  |  ldr OP, [OP, #GG_DISP2STATIC][m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   decode_RD RC, INS[m
[31m-  |  bx OP[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  ldr CARG1, [CARG4, #-24][m
[31m-  |   add PC, PC, #4[m
[31m-  |  str CARG1, SAVE_MULTRES		// Restore MULTRES for *M ins.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Same as curr_topL(L).[m
[31m-  |   sub CARG1, DISPATCH, #-GG_DISP2J[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  ldr CARG3, LFUNC:CARG3->field_pc[m
[31m-  |   mov CARG2, PC[m
[31m-  |   str L, [DISPATCH, #DISPATCH_J(L)][m
[31m-  |  ldrb CARG3, [CARG3, #PC2PROTO(framesize)][m
[31m-  |   str BASE, L->base[m
[31m-  |  add CARG3, BASE, CARG3, lsl #3[m
[31m-  |  str CARG3, L->top[m
[31m-  |  bl extern lj_trace_hot		// (jit_State *J, const BCIns *pc)[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mov CARG2, PC[m
[31m-  |.if JIT[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  orr CARG2, PC, #1[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  add CARG4, BASE, RC[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |    mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |    sub RA, RA, BASE[m
[31m-  |  str CARG4, L->top[m
[31m-  |  bl extern lj_dispatch_call		// (lua_State *L, const BCIns *pc)[m
[31m-  |  // Returns ASMFunction.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   ldr CARG4, L->top[m
[31m-  |    mov CARG2, #0[m
[31m-  |  add RA, BASE, RA[m
[31m-  |   sub NARGS8:RC, CARG4, BASE[m
[31m-  |    str CARG2, SAVE_PC		// Invalidate for subsequent line hook.[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   ldr INS, [PC, #-4][m
[31m-  |  bx CRET1[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // RA = resultptr, CARG4 = meta base[m
[31m-  |   ldr RB, SAVE_MULTRES[m
[31m-  |  ldr INS, [PC, #-4][m
[31m-  |    ldr TRACE:CARG3, [CARG4, #-24]	// Save previous trace.[m
[31m-  |   subs RB, RB, #8[m
[31m-  |  decode_RA8 RC, INS			// Call base.[m
[31m-  |   beq >2[m
[31m-  |1:  // Move results down.[m
[31m-  |  ldrd CARG12, [RA][m
[31m-  |    add RA, RA, #8[m
[31m-  |   subs RB, RB, #8[m
[31m-  |  strd CARG12, [BASE, RC][m
[31m-  |    add RC, RC, #8[m
[31m-  |   bne <1[m
[31m-  |2:[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |   add RA, RA, RB[m
[31m-  |3:[m
[31m-  |   cmp RA, RC[m
[31m-  |  mvn CARG2, #~LJ_TNIL[m
[31m-  |   bhi >9				// More results wanted?[m
[31m-  |[m
[31m-  |  ldrh RA, TRACE:CARG3->traceno[m
[31m-  |  ldrh RC, TRACE:CARG3->link[m
[31m-  |  cmp RC, RA[m
[31m-  |  beq ->cont_nop			// Blacklisted.[m
[31m-  |  cmp RC, #0[m
[31m-  |  bne =>BC_JLOOP			// Jump to stitched trace.[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  str RA, [DISPATCH, #DISPATCH_J(exitno)][m
[31m-  |  str L, [DISPATCH, #DISPATCH_J(L)][m
[31m-  |  str BASE, L->base[m
[31m-  |  sub CARG1, DISPATCH, #-GG_DISP2J[m
[31m-  |  mov CARG2, PC[m
[31m-  |  bl extern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |9:  // Fill up results with nil.[m
[31m-  |  strd CARG12, [BASE, RC][m
[31m-  |  add RC, RC, #8[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, PC[m
[31m-  |  bl extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  sub PC, PC, #4[m
[31m-  |  b ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |  sub sp, sp, #12[m
[31m-  |  push {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12}[m
[31m-  |  ldr CARG1, [sp, #64]	// Load original value of lr.[m
[31m-  |   ldr DISPATCH, [lr]	// Load DISPATCH.[m
[31m-  |    add CARG3, sp, #64	// Recompute original value of sp.[m
[31m-  |   mv_vmstate CARG4, EXIT[m
[31m-  |    str CARG3, [sp, #52]	// Store sp in RID_SP[m
[31m-  |   st_vmstate CARG4[m
[31m-  |  ldr CARG2, [CARG1, #-4]!	// Get exit instruction.[m
[31m-  |   str CARG1, [sp, #56]	// Store exit pc in RID_LR and RID_PC.[m
[31m-  |   str CARG1, [sp, #60][m
[31m-  |.if FPU[m
[31m-  |  vpush {d0-d15}[m
[31m-  |.endif[m
[31m-  |  lsl CARG2, CARG2, #8[m
[31m-  |  add CARG1, CARG1, CARG2, asr #6[m
[31m-  |   ldr CARG2, [lr, #4]	// Load exit stub group offset.[m
[31m-  |   sub CARG1, CARG1, lr[m
[31m-  |  ldr L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-  |   add CARG1, CARG2, CARG1, lsr #2	// Compute exit number.[m
[31m-  |    ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)][m
[31m-  |   str CARG1, [DISPATCH, #DISPATCH_J(exitno)][m
[31m-  |   mov CARG4, #0[m
[31m-  |    str BASE, L->base[m
[31m-  |  str L, [DISPATCH, #DISPATCH_J(L)][m
[31m-  |   str CARG4, [DISPATCH, #DISPATCH_GL(jit_base)][m
[31m-  |  sub CARG1, DISPATCH, #-GG_DISP2J[m
[31m-  |  mov CARG2, sp[m
[31m-  |  bl extern lj_trace_exit		// (jit_State *J, ExitState *ex)[m
[31m-  |  // Returns MULTRES (unscaled) or negated error code.[m
[31m-  |  ldr CARG2, L->cframe[m
[31m-  |   ldr BASE, L->base[m
[31m-  |  bic CARG2, CARG2, #~CFRAME_RAWMASK	// Use two steps: bic sp is deprecated.[m
[31m-  |  mov sp, CARG2[m
[31m-  |   ldr PC, SAVE_PC			// Get SAVE_PC.[m
[31m-  |  str L, SAVE_L			// Set SAVE_L (on-trace resume/yield).[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |  // CARG1 = MULTRES or negated error code, BASE, PC and DISPATCH set.[m
[31m-  |.if JIT[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |1:[m
[31m-  |  cmp CARG1, #0[m
[31m-  |  blt >9				// Check for error from exit.[m
[31m-  |   lsl RC, CARG1, #3[m
[31m-  |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-  |   str RC, SAVE_MULTRES[m
[31m-  |   mov CARG3, #0[m
[31m-  |   str BASE, L->base[m
[31m-  |  ldr CARG2, LFUNC:CARG2->field_pc[m
[31m-  |   str CARG3, [DISPATCH, #DISPATCH_GL(jit_base)][m
[31m-  |    mv_vmstate CARG4, INTERP[m
[31m-  |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  ldrb OP, [PC][m
[31m-  |     mov MASKR8, #255[m
[31m-  |   ldr INS, [PC], #4[m
[31m-  |     lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |    st_vmstate CARG4[m
[31m-  |  cmp OP, #BC_FUNCC+2		// Fast function?[m
[31m-  |  bhs >4[m
[31m-  |2:[m
[31m-  |  cmp OP, #BC_FUNCF			// Function header?[m
[31m-  |  ldr OP, [DISPATCH, OP, lsl #2][m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   lsrlo RC, INS, #16	// No: Decode operands A*8 and D.[m
[31m-  |   subhs RC, RC, #8[m
[31m-  |   addhs RA, RA, BASE	// Yes: RA = BASE+framesize*8, RC = nargs*8[m
[31m-  |   ldrhs CARG3, [BASE, FRAME_FUNC][m
[31m-  |  bx OP[m
[31m-  |[m
[31m-  |4:  // Check frame below fast function.[m
[31m-  |  ldr CARG1, [BASE, FRAME_PC][m
[31m-  |  ands CARG2, CARG1, #FRAME_TYPE[m
[31m-  |  bne <2			// Trace stitching continuation?[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  ldr CARG3, [CARG1, #-4][m
[31m-  |  decode_RA8 CARG1, CARG3[m
[31m-  |  sub CARG2, BASE, CARG1[m
[31m-  |  ldr LFUNC:CARG3, [CARG2, #-16][m
[31m-  |  ldr CARG3, LFUNC:CARG3->field_pc[m
[31m-  |  ldr KBASE, [CARG3, #PC2PROTO(k)][m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  rsb CARG2, CARG1, #0[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP value rounding. Called from JIT code.[m
[31m-  |//[m
[31m-  |// double lj_vm_floor/ceil/trunc(double x);[m
[31m-  |.macro vm_round, func, hf[m
[31m-  |.if hf == 1[m
[31m-  |  vmov CARG1, CARG2, d0[m
[31m-  |.endif[m
[31m-  |  lsl CARG3, CARG2, #1[m
[31m-  |  adds RB, CARG3, #0x00200000[m
[31m-  |  bpl >2				// |x| < 1?[m
[31m-  |  mvn CARG4, #0x3cc[m
[31m-  |  subs RB, CARG4, RB, asr #21	// 2^0: RB = 51, 2^51: RB = 0.[m
[31m-  |  bxlo lr				// |x| >= 2^52: done.[m
[31m-  |  mvn CARG4, #1[m
[31m-  |   bic CARG3, CARG1, CARG4, lsl RB	// ztest = lo & ~lomask[m
[31m-  |  and CARG1, CARG1, CARG4, lsl RB	// lo &= lomask[m
[31m-  |  subs RB, RB, #32[m
[31m-  |   bicpl CARG4, CARG2, CARG4, lsl RB	// |x| <= 2^20: ztest |= hi & ~himask[m
[31m-  |   orrpl CARG3, CARG3, CARG4[m
[31m-  |   mvnpl CARG4, #1[m
[31m-  |  andpl CARG2, CARG2, CARG4, lsl RB	// |x| <= 2^20: hi &= himask[m
[31m-  |.if "func" == "floor"[m
[31m-  |   tst CARG3, CARG2, asr #31		// iszero = ((ztest & signmask) == 0)[m
[31m-  |.else[m
[31m-  |   bics CARG3, CARG3, CARG2, asr #31	// iszero = ((ztest & ~signmask) == 0)[m
[31m-  |.endif[m
[31m-  |.if hf == 1[m
[31m-  |  vmoveq d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bxeq lr				// iszero: done.[m
[31m-  |  mvn CARG4, #1[m
[31m-  |  cmp RB, #0[m
[31m-  |  lslpl CARG3, CARG4, RB[m
[31m-  |  mvnmi CARG3, #0[m
[31m-  |  add RB, RB, #32[m
[31m-  |  subs CARG1, CARG1, CARG4, lsl RB	// lo = lo-lomask[m
[31m-  |  sbc CARG2, CARG2, CARG3		// hi = hi-himask+carry[m
[31m-  |.if hf == 1[m
[31m-  |  vmov d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bx lr[m
[31m-  |[m
[31m-  |2:  // |x| < 1:[m
[31m-  |  bxcs lr				// |x| is not finite.[m
[31m-  |  orr CARG3, CARG3, CARG1		// ztest = (2*hi) | lo[m
[31m-  |.if "func" == "floor"[m
[31m-  |  tst CARG3, CARG2, asr #31		// iszero = ((ztest & signmask) == 0)[m
[31m-  |.else[m
[31m-  |  bics CARG3, CARG3, CARG2, asr #31	// iszero = ((ztest & ~signmask) == 0)[m
[31m-  |.endif[m
[31m-  |  mov CARG1, #0			// lo = 0[m
[31m-  |  and CARG2, CARG2, #0x80000000[m
[31m-  |  ldrne CARG4, <9			// hi = sign(x) | (iszero ? 0.0 : 1.0)[m
[31m-  |  orrne CARG2, CARG2, CARG4[m
[31m-  |.if hf == 1[m
[31m-  |  vmov d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bx lr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |9:[m
[31m-  |  .long 0x3ff00000			// hiword(+1.0)[m
[31m-  |[m
[31m-  |->vm_floor:[m
[31m-  |.if HFABI[m
[31m-  |  vm_round floor, 1[m
[31m-  |.endif[m
[31m-  |->vm_floor_sf:[m
[31m-  |  vm_round floor, 0[m
[31m-  |[m
[31m-  |->vm_ceil:[m
[31m-  |.if HFABI[m
[31m-  |  vm_round ceil, 1[m
[31m-  |.endif[m
[31m-  |->vm_ceil_sf:[m
[31m-  |  vm_round ceil, 0[m
[31m-  |[m
[31m-  |.macro vm_trunc, hf[m
[31m-  |.if JIT[m
[31m-  |.if hf == 1[m
[31m-  |  vmov CARG1, CARG2, d0[m
[31m-  |.endif[m
[31m-  |  lsl CARG3, CARG2, #1[m
[31m-  |  adds RB, CARG3, #0x00200000[m
[31m-  |  andpl CARG2, CARG2, #0x80000000	// |x| < 1? hi = sign(x), lo = 0.[m
[31m-  |  movpl CARG1, #0[m
[31m-  |.if hf == 1[m
[31m-  |  vmovpl d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bxpl lr[m
[31m-  |  mvn CARG4, #0x3cc[m
[31m-  |  subs RB, CARG4, RB, asr #21	// 2^0: RB = 51, 2^51: RB = 0.[m
[31m-  |  bxlo lr				// |x| >= 2^52: already done.[m
[31m-  |  mvn CARG4, #1[m
[31m-  |  and CARG1, CARG1, CARG4, lsl RB	// lo &= lomask[m
[31m-  |  subs RB, RB, #32[m
[31m-  |  andpl CARG2, CARG2, CARG4, lsl RB	// |x| <= 2^20: hi &= himask[m
[31m-  |.if hf == 1[m
[31m-  |  vmov d0, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  bx lr[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |->vm_trunc:[m
[31m-  |.if HFABI[m
[31m-  |  vm_trunc 1[m
[31m-  |.endif[m
[31m-  |->vm_trunc_sf:[m
[31m-  |  vm_trunc 0[m
[31m-  |[m
[31m-  |  // double lj_vm_mod(double dividend, double divisor);[m
[31m-  |->vm_mod:[m
[31m-  |.if FPU[m
[31m-  |  // Special calling convention. Also, RC (r11) is not preserved.[m
[31m-  |  vdiv.f64 d0, d6, d7[m
[31m-  |   mov RC, lr[m
[31m-  |  vmov CARG1, CARG2, d0[m
[31m-  |  bl ->vm_floor_sf[m
[31m-  |  vmov d0, CARG1, CARG2[m
[31m-  |  vmul.f64 d0, d0, d7[m
[31m-  |   mov lr, RC[m
[31m-  |  vsub.f64 d6, d6, d0[m
[31m-  |  bx lr[m
[31m-  |.else[m
[31m-  |  push {r0, r1, r2, r3, r4, lr}[m
[31m-  |  bl extern __aeabi_ddiv[m
[31m-  |  bl ->vm_floor_sf[m
[31m-  |  ldrd CARG34, [sp, #8][m
[31m-  |  bl extern __aeabi_dmul[m
[31m-  |  ldrd CARG34, [sp][m
[31m-  |  eor CARG2, CARG2, #0x80000000[m
[31m-  |  bl extern __aeabi_dadd[m
[31m-  |  add sp, sp, #20[m
[31m-  |  pop {pc}[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  // int lj_vm_modi(int dividend, int divisor);[m
[31m-  |->vm_modi:[m
[31m-  |  ands RB, CARG1, #0x80000000[m
[31m-  |  rsbmi CARG1, CARG1, #0		// a = |dividend|[m
[31m-  |  eor RB, RB, CARG2, asr #1		// Keep signdiff and sign(divisor).[m
[31m-  |  cmp CARG2, #0[m
[31m-  |  rsbmi CARG2, CARG2, #0		// b = |divisor|[m
[31m-  |  subs CARG4, CARG2, #1[m
[31m-  |  cmpne CARG1, CARG2[m
[31m-  |  moveq CARG1, #0			// if (b == 1 || a == b) a = 0[m
[31m-  |  tsthi CARG2, CARG4[m
[31m-  |  andeq CARG1, CARG1, CARG4		// else if ((b & (b-1)) == 0) a &= b-1[m
[31m-  |  bls >1[m
[31m-  |  // Use repeated subtraction to get the remainder.[m
[31m-  |  clz CARG3, CARG1[m
[31m-  |  clz CARG4, CARG2[m
[31m-  |  sub CARG4, CARG4, CARG3[m
[31m-  |  rsbs CARG3, CARG4, #31		// entry = (31-(clz(b)-clz(a)))*8[m
[31m-  |  addne pc, pc, CARG3, lsl #3	// Duff's device.[m
[31m-  |  nop[m
[31m-  {[m
[31m-    int i;[m
[31m-    for (i = 31; i >= 0; i--) {[m
[31m-      |  cmp CARG1, CARG2, lsl #i[m
[31m-      |  subhs CARG1, CARG1, CARG2, lsl #i[m
[31m-    }[m
[31m-  }[m
[31m-  |1:[m
[31m-  |  cmp CARG1, #0[m
[31m-  |  cmpne RB, #0[m
[31m-  |  submi CARG1, CARG1, CARG2		// if (y != 0 && signdiff) y = y - b[m
[31m-  |  eors CARG2, CARG1, RB, lsl #1[m
[31m-  |  rsbmi CARG1, CARG1, #0		// if (sign(divisor) != sign(y)) y = -y[m
[31m-  |  bx lr[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions.[m
[31m-  |// Saveregs already performed. Callback slot number in [sp], g in r12.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  ldr CTSTATE, GL:r12->ctype_state[m
[31m-  |   add DISPATCH, r12, #GG_G2DISP[m
[31m-  |.if FPU[m
[31m-  |  str r4, SAVE_R4[m
[31m-  |  add r4, sp, CFRAME_SPACE+4+8*8[m
[31m-  |  vstmdb r4!, {d8-d15}[m
[31m-  |.endif[m
[31m-  |.if HFABI[m
[31m-  |  add r12, CTSTATE, #offsetof(CTState, cb.fpr[8])[m
[31m-  |.endif[m
[31m-  |  strd CARG34, CTSTATE->cb.gpr[2][m
[31m-  |  strd CARG12, CTSTATE->cb.gpr[0][m
[31m-  |.if HFABI[m
[31m-  |  vstmdb r12!, {d0-d7}[m
[31m-  |.endif[m
[31m-  |  ldr CARG4, [sp][m
[31m-  |   add CARG3, sp, #CFRAME_SIZE[m
[31m-  |    mov CARG1, CTSTATE[m
[31m-  |  lsr CARG4, CARG4, #3[m
[31m-  |   str CARG3, CTSTATE->cb.stack[m
[31m-  |    mov CARG2, sp[m
[31m-  |  str CARG4, CTSTATE->cb.slot[m
[31m-  |  str CTSTATE, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  bl extern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |  // Returns lua_State *.[m
[31m-  |  ldr BASE, L:CRET1->base[m
[31m-  |    mv_vmstate CARG2, INTERP[m
[31m-  |  ldr RC, L:CRET1->top[m
[31m-  |    mov MASKR8, #255[m
[31m-  |   ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |    mov L, CRET1[m
[31m-  |  sub RC, RC, BASE[m
[31m-  |    lsl MASKR8, MASKR8, #3		// MASKR8 = 255*8.[m
[31m-  |    st_vmstate CARG2[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  ldr CTSTATE, [DISPATCH, #DISPATCH_GL(ctype_state)][m
[31m-  |   str BASE, L->base[m
[31m-  |   str CARG4, L->top[m
[31m-  |  str L, CTSTATE->L[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |  mov CARG2, RA[m
[31m-  |  bl extern lj_ccallback_leave	// (CTState *cts, TValue *o)[m
[31m-  |  ldrd CARG12, CTSTATE->cb.gpr[0][m
[31m-  |.if HFABI[m
[31m-  |  vldr d0, CTSTATE->cb.fpr[0][m
[31m-  |.endif[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, r4[m
[31m-  |  push {CCSTATE, r5, r11, lr}[m
[31m-  |  mov CCSTATE, CARG1[m
[31m-  |  ldr CARG1, CCSTATE:CARG1->spadj[m
[31m-  |   ldrb CARG2, CCSTATE->nsp[m
[31m-  |    add CARG3, CCSTATE, #offsetof(CCallState, stack)[m
[31m-  |.if HFABI[m
[31m-  |  add RB, CCSTATE, #offsetof(CCallState, fpr[0])[m
[31m-  |.endif[m
[31m-  |  mov r11, sp[m
[31m-  |  sub sp, sp, CARG1			// Readjust stack.[m
[31m-  |   subs CARG2, CARG2, #1[m
[31m-  |.if HFABI[m
[31m-  |  vldm RB, {d0-d7}[m
[31m-  |.endif[m
[31m-  |    ldr RB, CCSTATE->func[m
[31m-  |   bmi >2[m
[31m-  |1:  // Copy stack slots.[m
[31m-  |  ldr CARG4, [CARG3, CARG2, lsl #2][m
[31m-  |  str CARG4, [sp, CARG2, lsl #2][m
[31m-  |  subs CARG2, CARG2, #1[m
[31m-  |  bpl <1[m
[31m-  |2:[m
[31m-  |  ldrd CARG12, CCSTATE->gpr[0][m
[31m-  |  ldrd CARG34, CCSTATE->gpr[2][m
[31m-  |  blx RB[m
[31m-  |  mov sp, r11[m
[31m-  |.if HFABI[m
[31m-  |  add r12, CCSTATE, #offsetof(CCallState, fpr[4])[m
[31m-  |.endif[m
[31m-  |  strd CRET1, CCSTATE->gpr[0][m
[31m-  |.if HFABI[m
[31m-  |  vstmdb r12!, {d0-d3}[m
[31m-  |.endif[m
[31m-  |  pop {CCSTATE, r5, r11, pc}[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1*8, RC = src2, JMP with RC = target[m
[31m-    |   lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    |    ldrh RB, [PC, #2][m
[31m-    |   ldrd CARG34, [RC, BASE]![m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |  bne >3[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  bne >4[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  sublt PC, RB, #0x20000[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  subge PC, RB, #0x20000[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  suble PC, RB, #0x20000[m
[31m-    } else {[m
[31m-      |  subgt PC, RB, #0x20000[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3: // CARG12 is not an integer.[m
[31m-    |.if FPU[m
[31m-    |   vldr d0, [RA][m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // d0 is a number.[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |   vldr d1, [RC][m
[31m-    |  blo >5[m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // d0 is a number, CARG3 is an integer.[m
[31m-    |  vmov s4, CARG3[m
[31m-    |  vcvt.f64.s32 d1, s4[m
[31m-    |  b >5[m
[31m-    |4:  // CARG1 is an integer, CARG34 is not an integer.[m
[31m-    |   vldr d1, [RC][m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // CARG1 is an integer, d1 is a number.[m
[31m-    |  vmov s4, CARG1[m
[31m-    |  vcvt.f64.s32 d0, s4[m
[31m-    |5:  // d0 and d1 are numbers.[m
[31m-    |  vcmp.f64 d0, d1[m
[31m-    |  vmrs[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  sublo PC, RB, #0x20000[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  subhs PC, RB, #0x20000[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  subls PC, RB, #0x20000[m
[31m-    } else {[m
[31m-      |  subhi PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    |.else[m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // CARG12 is a number.[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  movlo RA, RB			// Save RB.[m
[31m-    |  blo >5[m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // CARG12 is a number, CARG3 is an integer.[m
[31m-    |  mov CARG1, CARG3[m
[31m-    |  mov RC, RA[m
[31m-    |  mov RA, RB			// Save RB.[m
[31m-    |  bl extern __aeabi_i2d[m
[31m-    |  mov CARG3, CARG1[m
[31m-    |  mov CARG4, CARG2[m
[31m-    |  ldrd CARG12, [RC]		// Restore first operand.[m
[31m-    |  b >5[m
[31m-    |4:  // CARG1 is an integer, CARG34 is not an integer.[m
[31m-    |  bhi ->vmeta_comp[m
[31m-    |  // CARG1 is an integer, CARG34 is a number.[m
[31m-    |  mov RA, RB			// Save RB.[m
[31m-    |  bl extern __aeabi_i2d[m
[31m-    |  ldrd CARG34, [RC]		// Restore second operand.[m
[31m-    |5:  // CARG12 and CARG34 are numbers.[m
[31m-    |  bl extern __aeabi_cdcmple[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  sublo PC, RA, #0x20000[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  subhs PC, RA, #0x20000[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  subls PC, RA, #0x20000[m
[31m-    } else {[m
[31m-      |  subhi PC, RA, #0x20000[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  // RA = src1*8, RC = src2, JMP with RC = target[m
[31m-    |   lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    |    ldrh RB, [PC, #2][m
[31m-    |   ldrd CARG34, [RC, BASE]![m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |  cmnls CARG4, #-LJ_TISNUM[m
[31m-    if (vk) {[m
[31m-      |  bls ->BC_ISEQN_Z[m
[31m-    } else {[m
[31m-      |  bls ->BC_ISNEN_Z[m
[31m-    }[m
[31m-    |  // Either or both types are not numbers.[m
[31m-    |.if FFI[m
[31m-    |  checktp CARG2, LJ_TCDATA[m
[31m-    |  checktpne CARG4, LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  cmp CARG2, CARG4			// Compare types.[m
[31m-    |  bne >2				// Not the same type?[m
[31m-    |  checktp CARG2, LJ_TISPRI[m
[31m-    |  bhs >1				// Same type and primitive type?[m
[31m-    |[m
[31m-    |  // Same types and not a primitive type. Compare GCobj or pvalue.[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    if (vk) {[m
[31m-      |  bne >3				// Different GCobjs or pvalues?[m
[31m-      |1:  // Branch if same.[m
[31m-      |  sub PC, RB, #0x20000[m
[31m-      |2:  // Different.[m
[31m-      |  ins_next[m
[31m-      |3:[m
[31m-      |  checktp CARG2, LJ_TISTABUD[m
[31m-      |  bhi <2				// Different objects and not table/ud?[m
[31m-    } else {[m
[31m-      |  beq >1				// Same GCobjs or pvalues?[m
[31m-      |  checktp CARG2, LJ_TISTABUD[m
[31m-      |  bhi >2				// Different objects and not table/ud?[m
[31m-    }[m
[31m-    |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-    |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-    |  ldr TAB:RA, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:RA, #0[m
[31m-    if (vk) {[m
[31m-      |  beq <2			// No metatable?[m
[31m-    } else {[m
[31m-      |  beq >2			// No metatable?[m
[31m-    }[m
[31m-    |  ldrb RA, TAB:RA->nomm[m
[31m-    |   mov CARG4, #1-vk		// ne = 0 or 1.[m
[31m-    |   mov CARG2, CARG1[m
[31m-    |  tst RA, #1<<MM_eq[m
[31m-    |  beq ->vmeta_equal		// 'no __eq' flag not set?[m
[31m-    if (vk) {[m
[31m-      |  b <2[m
[31m-    } else {[m
[31m-      |2:  // Branch if different.[m
[31m-      |  sub PC, RB, #0x20000[m
[31m-      |1:  // Same.[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  // RA = src*8, RC = str_const (~), JMP with RC = target[m
[31m-    |   mvn RC, RC[m
[31m-    |  ldrd CARG12, [BASE, RA][m
[31m-    |    ldrh RB, [PC, #2][m
[31m-    |   ldr STR:CARG3, [KBASE, RC, lsl #2][m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |  checktp CARG2, LJ_TSTR[m
[31m-    |.if FFI[m
[31m-    |  bne >7[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    |.else[m
[31m-    |  cmpeq CARG1, CARG3[m
[31m-    |.endif[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RB, #0x20000[m
[31m-      |1:[m
[31m-    } else {[m
[31m-      |1:[m
[31m-      |  subne PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |.if FFI[m
[31m-    |7:[m
[31m-    |  checktp CARG2, LJ_TCDATA[m
[31m-    |  bne <1[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  // RA = src*8, RC = num_const (~), JMP with RC = target[m
[31m-    |   lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    |    ldrh RB, [PC, #2][m
[31m-    |   ldrd CARG34, [RC, KBASE]![m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:[m
[31m-    }[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |  bne >3[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  bne >4[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RB, #0x20000[m
[31m-      |1:[m
[31m-    } else {[m
[31m-      |1:[m
[31m-      |  subne PC, RB, #0x20000[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // CARG12 is not an integer.[m
[31m-    |.if FFI[m
[31m-    |  bhi >7[m
[31m-    |.else[m
[31m-    if (!vk) {[m
[31m-      |  subhi PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  bhi <2[m
[31m-    |.endif[m
[31m-    |.if FPU[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  vmov s4, CARG3[m
[31m-    |   vldr d0, [RA][m
[31m-    |  vldrlo d1, [RC][m
[31m-    |  vcvths.f64.s32 d1, s4[m
[31m-    |  b >5[m
[31m-    |4:  // CARG1 is an integer, d1 is a number.[m
[31m-    |  vmov s4, CARG1[m
[31m-    |   vldr d1, [RC][m
[31m-    |  vcvt.f64.s32 d0, s4[m
[31m-    |5:  // d0 and d1 are numbers.[m
[31m-    |  vcmp.f64 d0, d1[m
[31m-    |  vmrs[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RB, #0x20000[m
[31m-    } else {[m
[31m-      |  subne PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  b <2[m
[31m-    |.else[m
[31m-    |  // CARG12 is a number.[m
[31m-    |  checktp CARG4, LJ_TISNUM[m
[31m-    |  movlo RA, RB			// Save RB.[m
[31m-    |  blo >5[m
[31m-    |  // CARG12 is a number, CARG3 is an integer.[m
[31m-    |  mov CARG1, CARG3[m
[31m-    |  mov RC, RA[m
[31m-    |4:  // CARG1 is an integer, CARG34 is a number.[m
[31m-    |  mov RA, RB			// Save RB.[m
[31m-    |  bl extern __aeabi_i2d[m
[31m-    |  ldrd CARG34, [RC]		// Restore other operand.[m
[31m-    |5:  // CARG12 and CARG34 are numbers.[m
[31m-    |  bl extern __aeabi_cdcmpeq[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RA, #0x20000[m
[31m-    } else {[m
[31m-      |  subne PC, RA, #0x20000[m
[31m-    }[m
[31m-    |  b <2[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |.if FFI[m
[31m-    |7:[m
[31m-    |  checktp CARG2, LJ_TCDATA[m
[31m-    |  bne <1[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  // RA = src*8, RC = primitive_type (~), JMP with RC = target[m
[31m-    |  ldrd CARG12, [BASE, RA][m
[31m-    |   ldrh RB, [PC, #2][m
[31m-    |   add PC, PC, #4[m
[31m-    |  mvn RC, RC[m
[31m-    |   add RB, PC, RB, lsl #2[m
[31m-    |.if FFI[m
[31m-    |  checktp CARG2, LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  cmp CARG2, RC[m
[31m-    if (vk) {[m
[31m-      |  subeq PC, RB, #0x20000[m
[31m-    } else {[m
[31m-      |  subne PC, RB, #0x20000[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  // RA = dst*8 or unused, RC = src, JMP with RC = target[m
[31m-    |  add RC, BASE, RC, lsl #3[m
[31m-    |   ldrh RB, [PC, #2][m
[31m-    |  ldrd CARG12, [RC][m
[31m-    |   add PC, PC, #4[m
[31m-    |   add RB, PC, RB, lsl #2[m
[31m-    |  checktp CARG2, LJ_TTRUE[m
[31m-    if (op == BC_ISTC || op == BC_IST) {[m
[31m-      |  subls PC, RB, #0x20000[m
[31m-      if (op == BC_ISTC) {[m
[31m-	|  strdls CARG12, [BASE, RA][m
[31m-      }[m
[31m-    } else {[m
[31m-      |  subhi PC, RB, #0x20000[m
[31m-      if (op == BC_ISFC) {[m
[31m-	|  strdhi CARG12, [BASE, RA][m
[31m-      }[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  // RA = src*8, RC = -type[m
[31m-    |  ldrd CARG12, [BASE, RA][m
[31m-    |   ins_next1[m
[31m-    |  cmn CARG2, RC[m
[31m-    |   ins_next2[m
[31m-    |  bne ->vmeta_istype[m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  // RA = src*8, RC = -(TISNUM-1)[m
[31m-    |  ldrd CARG12, [BASE, RA][m
[31m-    |   ins_next1[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |   ins_next2[m
[31m-    |  bhs ->vmeta_istype[m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  // RA = dst*8, RC = src[m
[31m-    |  lsl RC, RC, #3[m
[31m-    |   ins_next1[m
[31m-    |  ldrd CARG12, [BASE, RC][m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  // RA = dst*8, RC = src[m
[31m-    |  add RC, BASE, RC, lsl #3[m
[31m-    |   ins_next1[m
[31m-    |  ldr CARG1, [RC, #4][m
[31m-    |   add RA, BASE, RA[m
[31m-    |   ins_next2[m
[31m-    |  checktp CARG1, LJ_TTRUE[m
[31m-    |  mvnls CARG2, #~LJ_TFALSE[m
[31m-    |  mvnhi CARG2, #~LJ_TTRUE[m
[31m-    |  str CARG2, [RA, #4][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  // RA = dst*8, RC = src[m
[31m-    |  lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [BASE, RC][m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  checktp CARG2, LJ_TISNUM[m
[31m-    |  bhi ->vmeta_unm[m
[31m-    |  eorne CARG2, CARG2, #0x80000000[m
[31m-    |  bne >5[m
[31m-    |  rsbseq CARG1, CARG1, #0[m
[31m-    |  ldrdvs CARG12, >9[m
[31m-    |5:[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |.align 8[m
[31m-    |9:[m
[31m-    |  .long 0x00000000, 0x41e00000	// 2^31.[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  // RA = dst*8, RC = src[m
[31m-    |  lsl RC, RC, #3[m
[31m-    |  ldrd CARG12, [BASE, RC][m
[31m-    |  checkstr CARG2, >2[m
[31m-    |  ldr CARG1, STR:CARG1->len[m
[31m-    |1:[m
[31m-    |  mvn CARG2, #~LJ_TISNUM[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |2:[m
[31m-    |  checktab CARG2, ->vmeta_len[m
[31m-#if LJ_52[m
[31m-    |  ldr TAB:CARG3, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:CARG3, #0[m
[31m-    |  bne >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  .IOS mov RC, BASE[m
[31m-    |  bl extern lj_tab_len		// (GCtab *t)[m
[31m-    |  // Returns uint32_t (but less than 2^31).[m
[31m-    |  .IOS mov BASE, RC[m
[31m-    |  b <1[m
[31m-#if LJ_52[m
[31m-    |9:[m
[31m-    |  ldrb CARG4, TAB:CARG3->nomm[m
[31m-    |  tst CARG4, #1<<MM_len[m
[31m-    |  bne <3				// 'no __len' flag set: done.[m
[31m-    |  b ->vmeta_len[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithcheck, cond, ncond, target[m
[31m-    ||if (vk == 1) {[m
[31m-    |   cmn CARG4, #-LJ_TISNUM[m
[31m-    |    cmn..cond CARG2, #-LJ_TISNUM[m
[31m-    ||} else {[m
[31m-    |   cmn CARG2, #-LJ_TISNUM[m
[31m-    |    cmn..cond CARG4, #-LJ_TISNUM[m
[31m-    ||}[m
[31m-    |  b..ncond target[m
[31m-    |.endmacro[m
[31m-    |.macro ins_arithcheck_int, target[m
[31m-    |  ins_arithcheck eq, ne, target[m
[31m-    |.endmacro[m
[31m-    |.macro ins_arithcheck_num, target[m
[31m-    |  ins_arithcheck lo, hs, target[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpre[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   .if FPU[m
[31m-    |   ldrd CARG12, [RB, BASE]![m
[31m-    |    ldrd CARG34, [RC, KBASE]![m
[31m-    |   .else[m
[31m-    |   ldrd CARG12, [BASE, RB][m
[31m-    |    ldrd CARG34, [KBASE, RC][m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   .if FPU[m
[31m-    |   ldrd CARG34, [RB, BASE]![m
[31m-    |    ldrd CARG12, [RC, KBASE]![m
[31m-    |   .else[m
[31m-    |   ldrd CARG34, [BASE, RB][m
[31m-    |    ldrd CARG12, [KBASE, RC][m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   .if FPU[m
[31m-    |   ldrd CARG12, [RB, BASE]![m
[31m-    |    ldrd CARG34, [RC, BASE]![m
[31m-    |   .else[m
[31m-    |   ldrd CARG12, [BASE, RB][m
[31m-    |    ldrd CARG34, [BASE, RC][m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpre_fpu, reg1, reg2[m
[31m-    |.if FPU[m
[31m-    ||if (vk == 1) {[m
[31m-    |  vldr reg2, [RB][m
[31m-    |  vldr reg1, [RC][m
[31m-    ||} else {[m
[31m-    |  vldr reg1, [RB][m
[31m-    |  vldr reg2, [RC][m
[31m-    ||}[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpost_fpu, reg[m
[31m-    |   ins_next1[m
[31m-    |  add RA, BASE, RA[m
[31m-    |   ins_next2[m
[31m-    |  vstr reg, [RA][m
[31m-    |   ins_next3[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfallback, ins[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   ins ->vmeta_arith_vn[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   ins ->vmeta_arith_nv[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   ins ->vmeta_arith_vv[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins, fpins, fpcall[m
[31m-    |  ins_arithpre[m
[31m-    |.if "intins" ~= "vm_modi" and not FPU[m
[31m-    |   ins_next1[m
[31m-    |.endif[m
[31m-    |  ins_arithcheck_int >5[m
[31m-    |.if "intins" == "smull"[m
[31m-    |  smull CARG1, RC, CARG3, CARG1[m
[31m-    |  cmp RC, CARG1, asr #31[m
[31m-    |  ins_arithfallback bne[m
[31m-    |.elif "intins" == "vm_modi"[m
[31m-    |  movs CARG2, CARG3[m
[31m-    |  ins_arithfallback beq[m
[31m-    |  bl ->vm_modi[m
[31m-    |  mvn CARG2, #~LJ_TISNUM[m
[31m-    |.else[m
[31m-    |  intins CARG1, CARG1, CARG3[m
[31m-    |  ins_arithfallback bvs[m
[31m-    |.endif[m
[31m-    |4:[m
[31m-    |.if "intins" == "vm_modi" or FPU[m
[31m-    |   ins_next1[m
[31m-    |.endif[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |5:  // FP variant.[m
[31m-    |  ins_arithpre_fpu d6, d7[m
[31m-    |  ins_arithfallback ins_arithcheck_num[m
[31m-    |.if FPU[m
[31m-    |.if "intins" == "vm_modi"[m
[31m-    |  bl fpcall[m
[31m-    |.else[m
[31m-    |  fpins d6, d6, d7[m
[31m-    |.endif[m
[31m-    |  ins_arithpost_fpu d6[m
[31m-    |.else[m
[31m-    |  bl fpcall[m
[31m-    |.if "intins" ~= "vm_modi"[m
[31m-    |  ins_next1[m
[31m-    |.endif[m
[31m-    |  b <4[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfp, fpins, fpcall[m
[31m-    |  ins_arithpre[m
[31m-    |.if "fpins" ~= "extern" or HFABI[m
[31m-    |  ins_arithpre_fpu d0, d1[m
[31m-    |.endif[m
[31m-    |  ins_arithfallback ins_arithcheck_num[m
[31m-    |.if "fpins" == "extern"[m
[31m-    |  .IOS mov RC, BASE[m
[31m-    |  bl fpcall[m
[31m-    |  .IOS mov BASE, RC[m
[31m-    |.elif FPU[m
[31m-    |  fpins d0, d0, d1[m
[31m-    |.else[m
[31m-    |  bl fpcall[m
[31m-    |.endif[m
[31m-    |.if ("fpins" ~= "extern" or HFABI) and FPU[m
[31m-    |  ins_arithpost_fpu d0[m
[31m-    |.else[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arithdn adds, vadd.f64, extern __aeabi_dadd[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arithdn subs, vsub.f64, extern __aeabi_dsub[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arithdn smull, vmul.f64, extern __aeabi_dmul[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arithfp vdiv.f64, extern __aeabi_ddiv[m
[31m-    break;[m
[31m-  case BC_MODVN: case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithdn vm_modi, vm_mod, ->vm_mod[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  // NYI: (partial) integer arithmetic.[m
[31m-    |  ins_arithfp extern, extern pow[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  decode_RB8 RC, INS[m
[31m-    |   decode_RC8 RB, INS[m
[31m-    |  // RA = dst*8, RC = src_start*8, RB = src_end*8  (note: RB/RC swapped!)[m
[31m-    |  sub CARG3, RB, RC[m
[31m-    |   str BASE, L->base[m
[31m-    |  add CARG2, BASE, RB[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  // RA = dst*8, RC = src_start*8, CARG2 = top-1[m
[31m-    |  mov CARG1, L[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  lsr CARG3, CARG3, #3[m
[31m-    |  bl extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  cmp CRET1, #0[m
[31m-    |  bne ->vmeta_binop[m
[31m-    |  ldrd CARG34, [BASE, RC][m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA]		// Copy result to RA.[m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  // RA = dst*8, RC = str_const (~)[m
[31m-    |  mvn RC, RC[m
[31m-    |   ins_next1[m
[31m-    |  ldr CARG1, [KBASE, RC, lsl #2][m
[31m-    |  mvn CARG2, #~LJ_TSTR[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  // RA = dst*8, RC = cdata_const (~)[m
[31m-    |  mvn RC, RC[m
[31m-    |   ins_next1[m
[31m-    |  ldr CARG1, [KBASE, RC, lsl #2][m
[31m-    |  mvn CARG2, #~LJ_TCDATA[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  // RA = dst*8, (RC = int16_literal)[m
[31m-    |  mov CARG1, INS, asr #16			// Refetch sign-extended reg.[m
[31m-    |  mvn CARG2, #~LJ_TISNUM[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  // RA = dst*8, RC = num_const[m
[31m-    |  lsl RC, RC, #3[m
[31m-    |   ins_next1[m
[31m-    |  ldrd CARG12, [KBASE, RC][m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  // RA = dst*8, RC = primitive_type (~)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  mvn RC, RC[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  str RC, [RA, #4][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  // RA = base*8, RC = end[m
[31m-    |  add RA, BASE, RA[m
[31m-    |   add RC, BASE, RC, lsl #3[m
[31m-    |  mvn CARG1, #~LJ_TNIL[m
[31m-    |  str CARG1, [RA, #4][m
[31m-    |   add RA, RA, #8[m
[31m-    |1:[m
[31m-    |  str CARG1, [RA, #4][m
[31m-    |  cmp RA, RC[m
[31m-    |   add RA, RA, #8[m
[31m-    |  blt <1[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  // RA = dst*8, RC = uvnum[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsl RC, RC, #2[m
[31m-    |   add RC, RC, #offsetof(GCfuncL, uvptr)[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RC][m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |  ldrd CARG34, [CARG2][m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-    |  // RA = uvnum*8, RC = src[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsr RA, RA, #1[m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)[m
[31m-    |    lsl RC, RC, #3[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA][m
[31m-    |    ldrd CARG34, [BASE, RC][m
[31m-    |  ldrb RB, UPVAL:CARG2->marked[m
[31m-    |  ldrb RC, UPVAL:CARG2->closed[m
[31m-    |    ldr CARG2, UPVAL:CARG2->v[m
[31m-    |  tst RB, #LJ_GC_BLACK		// isblack(uv)[m
[31m-    |   add RB, CARG4, #-LJ_TISGCV[m
[31m-    |  cmpne RC, #0[m
[31m-    |   strd CARG34, [CARG2][m
[31m-    |  bne >2				// Upvalue is closed and black?[m
[31m-    |1:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |2:  // Check if new value is collectable.[m
[31m-    |  cmn RB, #-(LJ_TNUMX - LJ_TISGCV)[m
[31m-    |   ldrbhi RC, GCOBJ:CARG3->gch.marked[m
[31m-    |  bls <1				// tvisgcv(v)[m
[31m-    |    sub CARG1, DISPATCH, #-GG_DISP2G[m
[31m-    |   tst RC, #LJ_GC_WHITES[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |.if IOS[m
[31m-    |  beq <1[m
[31m-    |  mov RC, BASE[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RC[m
[31m-    |.else[m
[31m-    |  blne extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |.endif[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETS:[m
[31m-    |  // RA = uvnum*8, RC = str_const (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsr RA, RA, #1[m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)[m
[31m-    |    mvn RC, RC[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA][m
[31m-    |    ldr STR:CARG3, [KBASE, RC, lsl #2][m
[31m-    |  ldrb RB, UPVAL:CARG2->marked[m
[31m-    |     ldrb RC, UPVAL:CARG2->closed[m
[31m-    |   ldr CARG2, UPVAL:CARG2->v[m
[31m-    |    mvn CARG4, #~LJ_TSTR[m
[31m-    |  tst RB, #LJ_GC_BLACK		// isblack(uv)[m
[31m-    |    ldrb RB, STR:CARG3->marked[m
[31m-    |   strd CARG34, [CARG2][m
[31m-    |  bne >2[m
[31m-    |1:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  tst RB, #LJ_GC_WHITES		// iswhite(str)[m
[31m-    |  cmpne RC, #0[m
[31m-    |   sub CARG1, DISPATCH, #-GG_DISP2G[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |.if IOS[m
[31m-    |  beq <1[m
[31m-    |  mov RC, BASE[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RC[m
[31m-    |.else[m
[31m-    |  blne extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |.endif[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  // RA = uvnum*8, RC = num_const[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsr RA, RA, #1[m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)[m
[31m-    |    lsl RC, RC, #3[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA][m
[31m-    |    ldrd CARG34, [KBASE, RC][m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [CARG2][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  // RA = uvnum*8, RC = primitive_type (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   lsr RA, RA, #1[m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA][m
[31m-    |   mvn RC, RC[m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  str RC, [CARG2, #4][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_UCLO:[m
[31m-    |  // RA = level*8, RC = target[m
[31m-    |  ldr CARG3, L->openupval[m
[31m-    |   add RC, PC, RC, lsl #2[m
[31m-    |   str BASE, L->base[m
[31m-    |  cmp CARG3, #0[m
[31m-    |   sub PC, RC, #0x20000[m
[31m-    |  beq >1[m
[31m-    |   mov CARG1, L[m
[31m-    |   add CARG2, BASE, RA[m
[31m-    |  bl extern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |  ldr BASE, L->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  // RA = dst*8, RC = proto_const (~) (holding function prototype)[m
[31m-    |  mvn RC, RC[m
[31m-    |   str BASE, L->base[m
[31m-    |  ldr CARG2, [KBASE, RC, lsl #2][m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  ldr CARG3, [BASE, FRAME_FUNC][m
[31m-    |   mov CARG1, L[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  bl extern lj_func_newL_gc[m
[31m-    |  // Returns GCfuncL *.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  mvn CARG2, #~LJ_TFUNC[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-  case BC_TDUP:[m
[31m-    |  // RA = dst*8, RC = (hbits|asize) | tab_const (~)[m
[31m-    if (op == BC_TDUP) {[m
[31m-      |  mvn RC, RC[m
[31m-    }[m
[31m-    |  ldr CARG3, [DISPATCH, #DISPATCH_GL(gc.total)][m
[31m-    |   ldr CARG4, [DISPATCH, #DISPATCH_GL(gc.threshold)][m
[31m-    |    str BASE, L->base[m
[31m-    |    str PC, SAVE_PC[m
[31m-    |  cmp CARG3, CARG4[m
[31m-    |   mov CARG1, L[m
[31m-    |  bhs >5[m
[31m-    |1:[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |  lsl CARG2, RC, #21[m
[31m-      |   lsr CARG3, RC, #11[m
[31m-      |  asr RC, CARG2, #21[m
[31m-      |  lsr CARG2, CARG2, #21[m
[31m-      |  cmn RC, #1[m
[31m-      |  addeq CARG2, CARG2, #2[m
[31m-      |  bl extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-      |  // Returns GCtab *.[m
[31m-    } else {[m
[31m-      |  ldr CARG2, [KBASE, RC, lsl #2][m
[31m-      |  bl extern lj_tab_dup  // (lua_State *L, Table *kt)[m
[31m-      |  // Returns GCtab *.[m
[31m-    }[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  mvn CARG2, #~LJ_TTAB[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |5:[m
[31m-    |  bl extern lj_gc_step_fixtop  // (lua_State *L)[m
[31m-    |  mov CARG1, L[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  // RA = dst*8, RC = str_const (~)[m
[31m-  case BC_GSET:[m
[31m-    |  // RA = dst*8, RC = str_const (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   mvn RC, RC[m
[31m-    |  ldr TAB:CARG1, LFUNC:CARG2->env[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #2][m
[31m-    if (op == BC_GGET) {[m
[31m-      |  b ->BC_TGETS_Z[m
[31m-    } else {[m
[31m-      |  b ->BC_TSETS_Z[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  ldrd TAB:CARG12, [BASE, RB][m
[31m-    |   ldrd CARG34, [BASE, RC][m
[31m-    |  checktab CARG2, ->vmeta_tgetv  // STALL: load CARG12.[m
[31m-    |   checktp CARG4, LJ_TISNUM	// Integer key?[m
[31m-    |  ldreq CARG4, TAB:CARG1->array[m
[31m-    |    ldreq CARG2, TAB:CARG1->asize[m
[31m-    |   bne >9[m
[31m-    |[m
[31m-    |  add CARG4, CARG4, CARG3, lsl #3[m
[31m-    |    cmp CARG3, CARG2		// In array part?[m
[31m-    |  ldrdlo CARG34, [CARG4][m
[31m-    |    bhs ->vmeta_tgetv[m
[31m-    |   ins_next1  // Overwrites RB![m
[31m-    |  checktp CARG4, LJ_TNIL[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG2, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:CARG2, #0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  ldrb CARG2, TAB:CARG2->nomm[m
[31m-    |  tst CARG2, #1<<MM_index[m
[31m-    |  bne <1				// 'no __index' flag set: done.[m
[31m-    |  decode_RB8 RB, INS		// Restore RB.[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    |[m
[31m-    |9:[m
[31m-    |  checktp CARG4, LJ_TSTR		// String key?[m
[31m-    |   moveq STR:RC, CARG3[m
[31m-    |  beq ->BC_TGETS_Z[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst*8, RB = table*8, RC = str_const (~)[m
[31m-    |  ldrd CARG12, [BASE, RB][m
[31m-    |   mvn RC, RC[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #2]  // STALL: early RC.[m
[31m-    |  checktab CARG2, ->vmeta_tgets1[m
[31m-    |->BC_TGETS_Z:[m
[31m-    |  // (TAB:RB =) TAB:CARG1 = GCtab *, STR:RC = GCstr *, RA = dst*8[m
[31m-    |  ldr CARG3, TAB:CARG1->hmask[m
[31m-    |   ldr CARG4, STR:RC->hash[m
[31m-    |    ldr NODE:INS, TAB:CARG1->node[m
[31m-    |     mov TAB:RB, TAB:CARG1[m
[31m-    |  and CARG3, CARG3, CARG4			// idx = str->hash & tab->hmask[m
[31m-    |  add CARG3, CARG3, CARG3, lsl #1[m
[31m-    |    add NODE:INS, NODE:INS, CARG3, lsl #3	// node = tab->node + idx*3*8[m
[31m-    |1:[m
[31m-    |  ldrd CARG12, NODE:INS->key  // STALL: early NODE:INS.[m
[31m-    |   ldrd CARG34, NODE:INS->val[m
[31m-    |    ldr NODE:INS, NODE:INS->next[m
[31m-    |  checktp CARG2, LJ_TSTR[m
[31m-    |  cmpeq CARG1, STR:RC[m
[31m-    |  bne >4[m
[31m-    |   checktp CARG4, LJ_TNIL[m
[31m-    |   beq >5[m
[31m-    |3:[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  cmp NODE:INS, #0[m
[31m-    |  bne <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:RB->metatable[m
[31m-    |   mov CARG3, #0  // Optional clear of undef. value (during load stall).[m
[31m-    |   mvn CARG4, #~LJ_TNIL[m
[31m-    |  cmp TAB:CARG1, #0[m
[31m-    |  beq <3				// No metatable: done.[m
[31m-    |  ldrb CARG2, TAB:CARG1->nomm[m
[31m-    |  tst CARG2, #1<<MM_index[m
[31m-    |  bne <3				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgets[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst*8, RB = table*8, RC = index[m
[31m-    |  ldrd CARG12, [BASE, RB][m
[31m-    |  checktab CARG2, ->vmeta_tgetb  // STALL: load CARG12.[m
[31m-    |   ldr CARG3, TAB:CARG1->asize[m
[31m-    |  ldr CARG4, TAB:CARG1->array[m
[31m-    |  lsl CARG2, RC, #3[m
[31m-    |   cmp RC, CARG3[m
[31m-    |  ldrdlo CARG34, [CARG4, CARG2][m
[31m-    |   bhs ->vmeta_tgetb[m
[31m-    |   ins_next1  // Overwrites RB![m
[31m-    |  checktp CARG4, LJ_TNIL[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG2, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:CARG2, #0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  ldrb CARG2, TAB:CARG2->nomm[m
[31m-    |  tst CARG2, #1<<MM_index[m
[31m-    |  bne <1				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetb[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  ldr TAB:CARG1, [BASE, RB][m
[31m-    |   ldr CARG2, [BASE, RC][m
[31m-    |  ldr CARG4, TAB:CARG1->array[m
[31m-    |    ldr CARG3, TAB:CARG1->asize[m
[31m-    |  add CARG4, CARG4, CARG2, lsl #3[m
[31m-    |    cmp CARG2, CARG3		// In array part?[m
[31m-    |    bhs ->vmeta_tgetr[m
[31m-    |  ldrd CARG12, [CARG4][m
[31m-    |->BC_TGETR_Z:[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, [BASE, RA][m
[31m-    |   ins_next3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = src*8, RB = table*8, RC = key*8[m
[31m-    |  ldrd TAB:CARG12, [BASE, RB][m
[31m-    |   ldrd CARG34, [BASE, RC][m
[31m-    |  checktab CARG2, ->vmeta_tsetv  // STALL: load CARG12.[m
[31m-    |   checktp CARG4, LJ_TISNUM	// Integer key?[m
[31m-    |  ldreq CARG2, TAB:CARG1->array[m
[31m-    |    ldreq CARG4, TAB:CARG1->asize[m
[31m-    |   bne >9[m
[31m-    |[m
[31m-    |  add CARG2, CARG2, CARG3, lsl #3[m
[31m-    |    cmp CARG3, CARG4		// In array part?[m
[31m-    |  ldrlo INS, [CARG2, #4][m
[31m-    |    bhs ->vmeta_tsetv[m
[31m-    |   ins_next1  // Overwrites RB![m
[31m-    |  checktp INS, LJ_TNIL[m
[31m-    |  ldrb INS, TAB:CARG1->marked[m
[31m-    |   ldrd CARG34, [BASE, RA][m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |  tst INS, #LJ_GC_BLACK		// isblack(table)[m
[31m-    |   strd CARG34, [CARG2][m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |   ins_next2[m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:RA, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:RA, #0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  ldrb RA, TAB:RA->nomm[m
[31m-    |  tst RA, #1<<MM_newindex[m
[31m-    |  bne <1				// 'no __newindex' flag set: done.[m
[31m-    |  ldr INS, [PC, #-4]		// Restore RA and RB.[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG1, INS, CARG3[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |9:[m
[31m-    |  checktp CARG4, LJ_TSTR		// String key?[m
[31m-    |   moveq STR:RC, CARG3[m
[31m-    |  beq ->BC_TSETS_Z[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src*8, RB = table*8, RC = str_const (~)[m
[31m-    |  ldrd CARG12, [BASE, RB][m
[31m-    |   mvn RC, RC[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #2]  // STALL: early RC.[m
[31m-    |  checktab CARG2, ->vmeta_tsets1[m
[31m-    |->BC_TSETS_Z:[m
[31m-    |  // (TAB:RB =) TAB:CARG1 = GCtab *, STR:RC = GCstr *, RA = dst*8[m
[31m-    |  ldr CARG3, TAB:CARG1->hmask[m
[31m-    |   ldr CARG4, STR:RC->hash[m
[31m-    |    ldr NODE:INS, TAB:CARG1->node[m
[31m-    |     mov TAB:RB, TAB:CARG1[m
[31m-    |  and CARG3, CARG3, CARG4			// idx = str->hash & tab->hmask[m
[31m-    |  add CARG3, CARG3, CARG3, lsl #1[m
[31m-    |   mov CARG4, #0[m
[31m-    |    add NODE:INS, NODE:INS, CARG3, lsl #3	// node = tab->node + idx*3*8[m
[31m-    |   strb CARG4, TAB:RB->nomm		// Clear metamethod cache.[m
[31m-    |1:[m
[31m-    |  ldrd CARG12, NODE:INS->key[m
[31m-    |   ldr CARG4, NODE:INS->val.it[m
[31m-    |    ldr NODE:CARG3, NODE:INS->next[m
[31m-    |  checktp CARG2, LJ_TSTR[m
[31m-    |  cmpeq CARG1, STR:RC[m
[31m-    |  bne >5[m
[31m-    |  ldrb CARG2, TAB:RB->marked[m
[31m-    |   checktp CARG4, LJ_TNIL		// Key found, but nil value?[m
[31m-    |    ldrd CARG34, [BASE, RA][m
[31m-    |   beq >4[m
[31m-    |2:[m
[31m-    |  tst CARG2, #LJ_GC_BLACK		// isblack(table)[m
[31m-    |    strd CARG34, NODE:INS->val[m
[31m-    |  bne >7[m
[31m-    |3:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:RB->metatable[m
[31m-    |  cmp TAB:CARG1, #0[m
[31m-    |  beq <2				// No metatable: done.[m
[31m-    |  ldrb CARG1, TAB:CARG1->nomm[m
[31m-    |  tst CARG1, #1<<MM_newindex[m
[31m-    |  bne <2				// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsets[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  movs NODE:INS, NODE:CARG3[m
[31m-    |  bne <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  ldr TAB:CARG1, TAB:RB->metatable[m
[31m-    |   mov CARG3, TMPDp[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  cmp TAB:CARG1, #0		// No metatable: continue.[m
[31m-    |   str BASE, L->base[m
[31m-    |  ldrbne CARG2, TAB:CARG1->nomm[m
[31m-    |   mov CARG1, L[m
[31m-    |  beq >6[m
[31m-    |  tst CARG2, #1<<MM_newindex[m
[31m-    |  beq ->vmeta_tsets		// 'no __newindex' flag NOT set: check.[m
[31m-    |6:[m
[31m-    |  mvn CARG4, #~LJ_TSTR[m
[31m-    |   str STR:RC, TMPDlo[m
[31m-    |   mov CARG2, TAB:RB[m
[31m-    |  str CARG4, TMPDhi[m
[31m-    |  bl extern lj_tab_newkey		// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Returns TValue *.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  ldrd CARG34, [BASE, RA][m
[31m-    |  strd CARG34, [CRET1][m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, CARG2, CARG3[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src*8, RB = table*8, RC = index[m
[31m-    |  ldrd CARG12, [BASE, RB][m
[31m-    |  checktab CARG2, ->vmeta_tsetb  // STALL: load CARG12.[m
[31m-    |   ldr CARG3, TAB:CARG1->asize[m
[31m-    |  ldr RB, TAB:CARG1->array[m
[31m-    |  lsl CARG2, RC, #3[m
[31m-    |   cmp RC, CARG3[m
[31m-    |  ldrdlo CARG34, [CARG2, RB]![m
[31m-    |   bhs ->vmeta_tsetb[m
[31m-    |   ins_next1  // Overwrites RB![m
[31m-    |  checktp CARG4, LJ_TNIL[m
[31m-    |  ldrb INS, TAB:CARG1->marked[m
[31m-    |   ldrd CARG34, [BASE, RA][m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |  tst INS, #LJ_GC_BLACK		// isblack(table)[m
[31m-    |    strd CARG34, [CARG2][m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |   ins_next2[m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:RA, TAB:CARG1->metatable[m
[31m-    |  cmp TAB:RA, #0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  ldrb RA, TAB:RA->nomm[m
[31m-    |  tst RA, #1<<MM_newindex[m
[31m-    |  bne <1				// 'no __newindex' flag set: done.[m
[31m-    |  ldr INS, [PC, #-4]		// Restore INS.[m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  b ->vmeta_tsetb[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG1, INS, CARG3[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = src*8, RB = table*8, RC = key*8[m
[31m-    |  ldr TAB:CARG2, [BASE, RB][m
[31m-    |   ldr CARG3, [BASE, RC][m
[31m-    |     ldrb INS, TAB:CARG2->marked[m
[31m-    |  ldr CARG1, TAB:CARG2->array[m
[31m-    |    ldr CARG4, TAB:CARG2->asize[m
[31m-    |     tst INS, #LJ_GC_BLACK		// isblack(table)[m
[31m-    |  add CARG1, CARG1, CARG3, lsl #3[m
[31m-    |     bne >7[m
[31m-    |2:[m
[31m-    |    cmp CARG3, CARG4		// In array part?[m
[31m-    |    bhs ->vmeta_tsetr[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |  ldrd CARG34, [BASE, RA][m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG34, [CARG1][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, INS, RB[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  // RA = base*8 (table at base-1), RC = num_const (start index)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |1:[m
[31m-    |   ldr RB, SAVE_MULTRES[m
[31m-    |  ldr TAB:CARG2, [RA, #-8]		// Guaranteed to be a table.[m
[31m-    |  ldr CARG1, [KBASE, RC, lsl #3]	// Integer constant is in lo-word.[m
[31m-    |   subs RB, RB, #8[m
[31m-    |  ldr CARG4, TAB:CARG2->asize[m
[31m-    |   beq >4				// Nothing to copy?[m
[31m-    |  add CARG3, CARG1, RB, lsr #3[m
[31m-    |  cmp CARG3, CARG4[m
[31m-    |   ldr CARG4, TAB:CARG2->array[m
[31m-    |    add RB, RA, RB[m
[31m-    |  bhi >5[m
[31m-    |   add INS, CARG4, CARG1, lsl #3[m
[31m-    |    ldrb CARG1, TAB:CARG2->marked[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |   ldrd CARG34, [RA], #8[m
[31m-    |   strd CARG34, [INS], #8[m
[31m-    |  cmp RA, RB[m
[31m-    |  blo <3[m
[31m-    |    tst CARG1, #LJ_GC_BLACK	// isblack(table)[m
[31m-    |    bne >7[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |   str BASE, L->base[m
[31m-    |  mov CARG1, L[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  bl extern lj_tab_reasize		// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  // Must not reallocate the stack.[m
[31m-    |  .IOS ldr BASE, L->base[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, CARG1, CARG3[m
[31m-    |  b <4[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALLM:[m
[31m-    |  // RA = base*8, (RB = nresults+1,) RC = extra_nargs[m
[31m-    |  ldr CARG1, SAVE_MULTRES[m
[31m-    |  decode_RC8 NARGS8:RC, INS[m
[31m-    |  add NARGS8:RC, NARGS8:RC, CARG1[m
[31m-    |  b ->BC_CALL_Z[m
[31m-    break;[m
[31m-  case BC_CALL:[m
[31m-    |  decode_RC8 NARGS8:RC, INS[m
[31m-    |  // RA = base*8, (RB = nresults+1,) RC = (nargs+1)*8[m
[31m-    |->BC_CALL_Z:[m
[31m-    |  mov RB, BASE			// Save old BASE for vmeta_call.[m
[31m-    |  ldrd CARG34, [BASE, RA]![m
[31m-    |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-    |   add BASE, BASE, #8[m
[31m-    |  checkfunc CARG4, ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = extra_nargs[m
[31m-    |  ldr CARG1, SAVE_MULTRES[m
[31m-    |  add NARGS8:RC, CARG1, RC, lsl #3[m
[31m-    |  b ->BC_CALLT1_Z[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  lsl NARGS8:RC, RC, #3[m
[31m-    |  // RA = base*8, (RB = 0,) RC = (nargs+1)*8[m
[31m-    |->BC_CALLT1_Z:[m
[31m-    |  ldrd LFUNC:CARG34, [RA, BASE]![m
[31m-    |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-    |   add RA, RA, #8[m
[31m-    |  checkfunc CARG4, ->vmeta_callt[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |->BC_CALLT2_Z:[m
[31m-    |   mov RB, #0[m
[31m-    |   ldrb CARG4, LFUNC:CARG3->ffid[m
[31m-    |  tst PC, #FRAME_TYPE[m
[31m-    |  bne >7[m
[31m-    |1:[m
[31m-    |  str LFUNC:CARG3, [BASE, FRAME_FUNC]  // Copy function down, but keep PC.[m
[31m-    |  cmp NARGS8:RC, #0[m
[31m-    |  beq >3[m
[31m-    |2:[m
[31m-    |  ldrd CARG12, [RA, RB][m
[31m-    |   add INS, RB, #8[m
[31m-    |   cmp INS, NARGS8:RC[m
[31m-    |  strd CARG12, [BASE, RB][m
[31m-    |    mov RB, INS[m
[31m-    |   bne <2[m
[31m-    |3:[m
[31m-    |  cmp CARG4, #1			// (> FF_C) Calling a fast function?[m
[31m-    |  bhi >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function with a Lua frame below.[m
[31m-    |  ldr INS, [PC, #-4][m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  sub CARG1, BASE, RA[m
[31m-    |  ldr LFUNC:CARG1, [CARG1, #-16][m
[31m-    |  ldr CARG1, LFUNC:CARG1->field_pc[m
[31m-    |  ldr KBASE, [CARG1, #PC2PROTO(k)][m
[31m-    |  b <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  eor PC, PC, #FRAME_VARG[m
[31m-    |  tst PC, #FRAME_TYPEP		// Vararg frame below?[m
[31m-    |  movne CARG4, #0			// Clear ffid if no Lua function below.[m
[31m-    |  bne <1[m
[31m-    |  sub BASE, BASE, PC[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |  tst PC, #FRAME_TYPE[m
[31m-    |  movne CARG4, #0			// Clear ffid if no Lua function below.[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |  add RA, BASE, RA[m
[31m-    |   mov RB, BASE			// Save old BASE for vmeta_call.[m
[31m-    |  ldrd CARG34, [RA, #-16][m
[31m-    |   ldrd CARG12, [RA, #-8][m
[31m-    |    add BASE, RA, #8[m
[31m-    |  strd CARG34, [RA, #8]		// Copy state.[m
[31m-    |   strd CARG12, [RA, #16]		// Copy control var.[m
[31m-    |  // STALL: locked CARG34.[m
[31m-    |  ldrd LFUNC:CARG34, [RA, #-24][m
[31m-    |    mov NARGS8:RC, #16		// Iterators get 2 arguments.[m
[31m-    |  // STALL: load CARG34.[m
[31m-    |  strd LFUNC:CARG34, [RA]		// Copy callable.[m
[31m-    |  checkfunc CARG4, ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  ldr TAB:RB, [RA, #-16][m
[31m-    |  ldr CARG1, [RA, #-8]		// Get index from control var.[m
[31m-    |  ldr INS, TAB:RB->asize[m
[31m-    |   ldr CARG2, TAB:RB->array[m
[31m-    |    add PC, PC, #4[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  subs RC, CARG1, INS[m
[31m-    |   add CARG3, CARG2, CARG1, lsl #3[m
[31m-    |  bhs >5				// Index points after array part?[m
[31m-    |   ldrd CARG34, [CARG3][m
[31m-    |   checktp CARG4, LJ_TNIL[m
[31m-    |   addeq CARG1, CARG1, #1		// Skip holes in array part.[m
[31m-    |   beq <1[m
[31m-    |  ldrh RC, [PC, #-2][m
[31m-    |   mvn CARG2, #~LJ_TISNUM[m
[31m-    |    strd CARG34, [RA, #8][m
[31m-    |  add RC, PC, RC, lsl #2[m
[31m-    |    add RB, CARG1, #1[m
[31m-    |   strd CARG12, [RA][m
[31m-    |  sub PC, RC, #0x20000[m
[31m-    |    str RB, [RA, #-8]		// Update control var.[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  ldr CARG4, TAB:RB->hmask[m
[31m-    |   ldr NODE:RB, TAB:RB->node[m
[31m-    |6:[m
[31m-    |   add CARG1, RC, RC, lsl #1[m
[31m-    |  cmp RC, CARG4			// End of iteration? Branch to ITERL+1.[m
[31m-    |   add NODE:CARG3, NODE:RB, CARG1, lsl #3  // node = tab->node + idx*3*8[m
[31m-    |  bhi <3[m
[31m-    |   ldrd CARG12, NODE:CARG3->val[m
[31m-    |   checktp CARG2, LJ_TNIL[m
[31m-    |   add RC, RC, #1[m
[31m-    |   beq <6				// Skip holes in hash part.[m
[31m-    |  ldrh RB, [PC, #-2][m
[31m-    |   add RC, RC, INS[m
[31m-    |    ldrd CARG34, NODE:CARG3->key[m
[31m-    |   str RC, [RA, #-8]		// Update control var.[m
[31m-    |   strd CARG12, [RA, #8][m
[31m-    |  add RC, PC, RB, lsl #2[m
[31m-    |  sub PC, RC, #0x20000[m
[31m-    |    strd CARG34, [RA][m
[31m-    |  b <3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  // RA = base*8, RC = target (points to ITERN)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |     add RC, PC, RC, lsl #2[m
[31m-    |  ldrd CFUNC:CARG12, [RA, #-24][m
[31m-    |   ldr CARG3, [RA, #-12][m
[31m-    |    ldr CARG4, [RA, #-4][m
[31m-    |  checktp CARG2, LJ_TFUNC[m
[31m-    |  ldrbeq CARG1, CFUNC:CARG1->ffid[m
[31m-    |   checktpeq CARG3, LJ_TTAB[m
[31m-    |    checktpeq CARG4, LJ_TNIL[m
[31m-    |  cmpeq CARG1, #FF_next_N[m
[31m-    |     subeq PC, RC, #0x20000[m
[31m-    |  bne >5[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  mov CARG1, #0[m
[31m-    |  mvn CARG2, #0x00018000[m
[31m-    |  strd CARG1, [RA, #-8]		// Initialize control var.[m
[31m-    |1:[m
[31m-    |   ins_next3[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  mov CARG1, #BC_JMP[m
[31m-    |   mov OP, #BC_ITERC[m
[31m-    |  strb CARG1, [PC, #-4][m
[31m-    |   sub PC, RC, #0x20000[m
[31m-    |   strb OP, [PC]			// Subsumes ins_next1.[m
[31m-    |   ins_next2[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    |   decode_RC8 RC, INS[m
[31m-    |  // RA = base*8, RB = (nresults+1)*8, RC = numparams*8[m
[31m-    |  ldr CARG1, [BASE, FRAME_PC][m
[31m-    |  add RC, BASE, RC[m
[31m-    |   add RA, BASE, RA[m
[31m-    |  add RC, RC, #FRAME_VARG[m
[31m-    |   add CARG4, RA, RB[m
[31m-    |  sub CARG3, BASE, #8		// CARG3 = vtop[m
[31m-    |  sub RC, RC, CARG1		// RC = vbase[m
[31m-    |  // Note: RC may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  cmp RB, #0[m
[31m-    |   sub CARG1, CARG3, RC[m
[31m-    |  beq >5				// Copy all varargs?[m
[31m-    |   sub CARG4, CARG4, #16[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  cmp RC, CARG3[m
[31m-    |  ldrdlo CARG12, [RC], #8[m
[31m-    |  mvnhs CARG2, #~LJ_TNIL[m
[31m-    |   cmp RA, CARG4[m
[31m-    |  strd CARG12, [RA], #8[m
[31m-    |   blo <1[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  ldr CARG4, L->maxstack[m
[31m-    |   cmp CARG1, #0[m
[31m-    |   movle RB, #8			// MULTRES = (0+1)*8[m
[31m-    |   addgt RB, CARG1, #8[m
[31m-    |  add CARG2, RA, CARG1[m
[31m-    |   str RB, SAVE_MULTRES[m
[31m-    |   ble <2[m
[31m-    |  cmp CARG2, CARG4[m
[31m-    |  bhi >7[m
[31m-    |6:[m
[31m-    |   ldrd CARG12, [RC], #8[m
[31m-    |   strd CARG12, [RA], #8[m
[31m-    |  cmp RC, CARG3[m
[31m-    |  blo <6[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  lsr CARG2, CARG1, #3[m
[31m-    |   str RA, L->top[m
[31m-    |  mov CARG1, L[m
[31m-    |   str BASE, L->base[m
[31m-    |  sub RC, RC, BASE			// Need delta, because BASE may change.[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  sub RA, RA, BASE[m
[31m-    |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  add RC, BASE, RC[m
[31m-    |  sub CARG3, BASE, #8[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  // RA = results*8, RC = extra results[m
[31m-    |  ldr CARG1, SAVE_MULTRES[m
[31m-    |   ldr PC, [BASE, FRAME_PC][m
[31m-    |    add RA, BASE, RA[m
[31m-    |  add RC, CARG1, RC, lsl #3[m
[31m-    |  b ->BC_RETM_Z[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET:[m
[31m-    |  // RA = results*8, RC = nresults+1[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   lsl RC, RC, #3[m
[31m-    |    add RA, BASE, RA[m
[31m-    |->BC_RETM_Z:[m
[31m-    |   str RC, SAVE_MULTRES[m
[31m-    |1:[m
[31m-    |  ands CARG1, PC, #FRAME_TYPE[m
[31m-    |   eor CARG2, PC, #FRAME_VARG[m
[31m-    |  bne ->BC_RETV2_Z[m
[31m-    |[m
[31m-    |->BC_RET_Z:[m
[31m-    |  // BASE = base, RA = resultptr, RC = (nresults+1)*8, PC = return[m
[31m-    |  ldr INS, [PC, #-4][m
[31m-    |  subs CARG4, RC, #8[m
[31m-    |   sub CARG3, BASE, #8[m
[31m-    |  beq >3[m
[31m-    |2:[m
[31m-    |  ldrd CARG12, [RA], #8[m
[31m-    |   add BASE, BASE, #8[m
[31m-    |   subs CARG4, CARG4, #8[m
[31m-    |  strd CARG12, [BASE, #-16][m
[31m-    |   bne <2[m
[31m-    |3:[m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  sub CARG4, CARG3, RA[m
[31m-    |   decode_RB8 RB, INS[m
[31m-    |  ldr LFUNC:CARG1, [CARG4, FRAME_FUNC][m
[31m-    |5:[m
[31m-    |  cmp RB, RC			// More results expected?[m
[31m-    |  bhi >6[m
[31m-    |  mov BASE, CARG4[m
[31m-    |  ldr CARG2, LFUNC:CARG1->field_pc[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  mvn CARG2, #~LJ_TNIL[m
[31m-    |  add BASE, BASE, #8[m
[31m-    |   add RC, RC, #8[m
[31m-    |  str CARG2, [BASE, #-12][m
[31m-    |  b <5[m
[31m-    |[m
[31m-    |->BC_RETV1_Z:  // Non-standard return case.[m
[31m-    |  add RA, BASE, RA[m
[31m-    |->BC_RETV2_Z:[m
[31m-    |  tst CARG2, #FRAME_TYPEP[m
[31m-    |  bne ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down.[m
[31m-    |  sub BASE, BASE, CARG2[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET0: case BC_RET1:[m
[31m-    |  // RA = results*8, RC = nresults+1[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   lsl RC, RC, #3[m
[31m-    |   str RC, SAVE_MULTRES[m
[31m-    |  ands CARG1, PC, #FRAME_TYPE[m
[31m-    |   eor CARG2, PC, #FRAME_VARG[m
[31m-    |   ldreq INS, [PC, #-4][m
[31m-    |  bne ->BC_RETV1_Z[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  ldrd CARG12, [BASE, RA][m
[31m-    }[m
[31m-    |  sub CARG4, BASE, #8[m
[31m-    |   decode_RA8 RA, INS[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  strd CARG12, [CARG4][m
[31m-    }[m
[31m-    |  sub BASE, CARG4, RA[m
[31m-    |   decode_RB8 RB, INS[m
[31m-    |  ldr LFUNC:CARG1, [BASE, FRAME_FUNC][m
[31m-    |5:[m
[31m-    |  cmp RB, RC[m
[31m-    |  bhi >6[m
[31m-    |  ldr CARG2, LFUNC:CARG1->field_pc[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  sub CARG2, CARG4, #4[m
[31m-    |  mvn CARG3, #~LJ_TNIL[m
[31m-    |  str CARG3, [CARG2, RC][m
[31m-    |  add RC, RC, #8[m
[31m-    |  b <5[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  |.define FOR_IDX,  [RA];      .define FOR_TIDX,  [RA, #4][m
[31m-  |.define FOR_STOP, [RA, #8];  .define FOR_TSTOP, [RA, #12][m
[31m-  |.define FOR_STEP, [RA, #16]; .define FOR_TSTEP, [RA, #20][m
[31m-  |.define FOR_EXT,  [RA, #24]; .define FOR_TEXT,  [RA, #28][m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IFORL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    |  // RA = base*8, RC = target (after end of loop or start of loop)[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    if (op != BC_JFORL) {[m
[31m-      |   add RC, PC, RC, lsl #2[m
[31m-    }[m
[31m-    if (!vk) {[m
[31m-      |  ldrd CARG34, FOR_STOP[m
[31m-      |   checktp CARG2, LJ_TISNUM[m
[31m-      |  ldr RB, FOR_TSTEP[m
[31m-      |   bne >5[m
[31m-      |  checktp CARG4, LJ_TISNUM[m
[31m-      |   ldr CARG4, FOR_STEP[m
[31m-      |  checktpeq RB, LJ_TISNUM[m
[31m-      |  bne ->vmeta_for[m
[31m-      |  cmp CARG4, #0[m
[31m-      |  blt >4[m
[31m-      |  cmp CARG1, CARG3[m
[31m-    } else {[m
[31m-      |  ldrd CARG34, FOR_STEP[m
[31m-      |   checktp CARG2, LJ_TISNUM[m
[31m-      |   bne >5[m
[31m-      |  adds CARG1, CARG1, CARG3[m
[31m-      |   ldr CARG4, FOR_STOP[m
[31m-      if (op == BC_IFORL) {[m
[31m-	|  addvs RC, PC, #0x20000		// Overflow: prevent branch.[m
[31m-      } else {[m
[31m-	|  bvs >2				// Overflow: do not enter mcode.[m
[31m-      }[m
[31m-      |  cmp CARG3, #0[m
[31m-      |  blt >4[m
[31m-      |  cmp CARG1, CARG4[m
[31m-    }[m
[31m-    |1:[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  subgt PC, RC, #0x20000[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  sub PC, RC, #0x20000[m
[31m-      |  ldrhle RC, [PC, #-2][m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  suble PC, RC, #0x20000[m
[31m-    }[m
[31m-    if (vk) {[m
[31m-      |  strd CARG12, FOR_IDX[m
[31m-    }[m
[31m-    |2:[m
[31m-    |   ins_next1[m
[31m-    |   ins_next2[m
[31m-    |  strd CARG12, FOR_EXT[m
[31m-    if (op == BC_JFORI || op == BC_JFORL) {[m
[31m-      |  ble =>BC_JLOOP[m
[31m-    }[m
[31m-    |3:[m
[31m-    |   ins_next3[m
[31m-    |[m
[31m-    |4:  // Invert check for negative step.[m
[31m-    if (!vk) {[m
[31m-      |  cmp CARG3, CARG1[m
[31m-    } else {[m
[31m-      |  cmp CARG4, CARG1[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |5:  // FP loop.[m
[31m-    if (!vk) {[m
[31m-      |  cmnlo CARG4, #-LJ_TISNUM[m
[31m-      |  cmnlo RB, #-LJ_TISNUM[m
[31m-      |  bhs ->vmeta_for[m
[31m-      |.if FPU[m
[31m-      |  vldr d0, FOR_IDX[m
[31m-      |  vldr d1, FOR_STOP[m
[31m-      |  cmp RB, #0[m
[31m-      |  vstr d0, FOR_EXT[m
[31m-      |.else[m
[31m-      |  cmp RB, #0[m
[31m-      |   strd CARG12, FOR_EXT[m
[31m-      |  blt >8[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |.if FPU[m
[31m-      |  vldr d0, FOR_IDX[m
[31m-      |  vldr d2, FOR_STEP[m
[31m-      |  vldr d1, FOR_STOP[m
[31m-      |  cmp CARG4, #0[m
[31m-      |  vadd.f64 d0, d0, d2[m
[31m-      |.else[m
[31m-      |  cmp CARG4, #0[m
[31m-      |  blt >8[m
[31m-      |  bl extern __aeabi_dadd[m
[31m-      |   strd CARG12, FOR_IDX[m
[31m-      |  ldrd CARG34, FOR_STOP[m
[31m-      |   strd CARG12, FOR_EXT[m
[31m-      |.endif[m
[31m-    }[m
[31m-    |6:[m
[31m-    |.if FPU[m
[31m-    |  vcmpge.f64 d0, d1[m
[31m-    |  vcmplt.f64 d1, d0[m
[31m-    |  vmrs[m
[31m-    |.else[m
[31m-    |  bl extern __aeabi_cdcmple[m
[31m-    |.endif[m
[31m-    if (vk) {[m
[31m-      |.if FPU[m
[31m-      |  vstr d0, FOR_IDX[m
[31m-      |  vstr d0, FOR_EXT[m
[31m-      |.endif[m
[31m-    }[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  subhi PC, RC, #0x20000[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  sub PC, RC, #0x20000[m
[31m-      |  ldrhls RC, [PC, #-2][m
[31m-      |  bls =>BC_JLOOP[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  subls PC, RC, #0x20000[m
[31m-    } else {[m
[31m-      |  bls =>BC_JLOOP[m
[31m-    }[m
[31m-    |  ins_next1[m
[31m-    |  ins_next2[m
[31m-    |  b <3[m
[31m-    |[m
[31m-    |.if not FPU[m
[31m-    |8:  // Invert check for negative step.[m
[31m-    if (vk) {[m
[31m-      |  bl extern __aeabi_dadd[m
[31m-      |  strd CARG12, FOR_IDX[m
[31m-      |  strd CARG12, FOR_EXT[m
[31m-    }[m
[31m-    |  mov CARG3, CARG1[m
[31m-    |  mov CARG4, CARG2[m
[31m-    |  ldrd CARG12, FOR_STOP[m
[31m-    |  b <6[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IITERL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  // RA = base*8, RC = target[m
[31m-    |  ldrd CARG12, [RA, BASE]![m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  cmn CARG2, #-LJ_TNIL		// Stop if iterator returned nil.[m
[31m-      |  strdne CARG12, [RA, #-8][m
[31m-      |  bne =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |   add RC, PC, RC, lsl #2[m
[31m-      |  // STALL: load CARG12.[m
[31m-      |  cmn CARG2, #-LJ_TNIL		// Stop if iterator returned nil.[m
[31m-      |  subne PC, RC, #0x20000		// Otherwise save control var + branch.[m
[31m-      |  strdne CARG12, [RA, #-8][m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  // RA = base*8, RC = target (loop extent)[m
[31m-    |  // Note: RA/RC is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_ILOOP follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  // RA = base*8, RC = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  // RA = base (ignored), RC = traceno[m
[31m-    |  ldr CARG1, [DISPATCH, #DISPATCH_J(trace)][m
[31m-    |   mov CARG2, #0  // Traces on ARM don't store the trace number, so use 0.[m
[31m-    |  ldr TRACE:RC, [CARG1, RC, lsl #2][m
[31m-    |   st_vmstate CARG2[m
[31m-    |  ldr RA, TRACE:RC->mcode[m
[31m-    |   str BASE, [DISPATCH, #DISPATCH_GL(jit_base)][m
[31m-    |   str L, [DISPATCH, #DISPATCH_GL(tmpbuf.L)][m
[31m-    |  bx RA[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  // RA = base*8 (only used by trace recorder), RC = target[m
[31m-    |  add RC, PC, RC, lsl #2[m
[31m-    |  sub PC, RC, #0x20000[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    |  // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8[m
[31m-    |  ldr CARG1, L->maxstack[m
[31m-    |   ldrb CARG2, [PC, #-4+PC2PROTO(numparams)][m
[31m-    |    ldr KBASE, [PC, #-4+PC2PROTO(k)][m
[31m-    |  cmp RA, CARG1[m
[31m-    |  bhi ->vm_growstack_l[m
[31m-    if (op != BC_JFUNCF) {[m
[31m-      |  ins_next1[m
[31m-      |  ins_next2[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  cmp NARGS8:RC, CARG2, lsl #3	// Check for missing parameters.[m
[31m-    |   mvn CARG4, #~LJ_TNIL[m
[31m-    |  blo >3[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  decode_RD RC, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next3[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  strd CARG34, [BASE, NARGS8:RC][m
[31m-    |  add NARGS8:RC, NARGS8:RC, #8[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    |  NYI  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8[m
[31m-    |  ldr CARG1, L->maxstack[m
[31m-    |   add CARG4, BASE, RC[m
[31m-    |  add RA, RA, RC[m
[31m-    |   str LFUNC:CARG3, [CARG4]	// Store copy of LFUNC.[m
[31m-    |   add CARG2, RC, #8+FRAME_VARG[m
[31m-    |    ldr KBASE, [PC, #-4+PC2PROTO(k)][m
[31m-    |  cmp RA, CARG1[m
[31m-    |   str CARG2, [CARG4, #4]		// Store delta + FRAME_VARG.[m
[31m-    |  bhs ->vm_growstack_l[m
[31m-    |  ldrb RB, [PC, #-4+PC2PROTO(numparams)][m
[31m-    |   mov RA, BASE[m
[31m-    |   mov RC, CARG4[m
[31m-    |  cmp RB, #0[m
[31m-    |   add BASE, CARG4, #8[m
[31m-    |  beq >3[m
[31m-    |  mvn CARG3, #~LJ_TNIL[m
[31m-    |1:[m
[31m-    |  cmp RA, RC			// Less args than parameters?[m
[31m-    |   ldrdlo CARG12, [RA], #8[m
[31m-    |   movhs CARG2, CARG3[m
[31m-    |    strlo CARG3, [RA, #-4]		// Clear old fixarg slot (help the GC).[m
[31m-    |2:[m
[31m-    |  subs RB, RB, #1[m
[31m-    |   strd CARG12, [CARG4, #8]![m
[31m-    |  bne <1[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = CFUNC, RC = nargs*8[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  ldr CARG4, CFUNC:CARG3->f[m
[31m-    } else {[m
[31m-      |  ldr CARG4, [DISPATCH, #DISPATCH_GL(wrapf)][m
[31m-    }[m
[31m-    |   add CARG2, RA, NARGS8:RC[m
[31m-    |   ldr CARG1, L->maxstack[m
[31m-    |  add RC, BASE, NARGS8:RC[m
[31m-    |    str BASE, L->base[m
[31m-    |   cmp CARG2, CARG1[m
[31m-    |  str RC, L->top[m
[31m-    if (op == BC_FUNCCW) {[m
[31m-      |  ldr CARG2, CFUNC:CARG3->f[m
[31m-    }[m
[31m-    |    mv_vmstate CARG3, C[m
[31m-    |  mov CARG1, L[m
[31m-    |   bhi ->vm_growstack_c		// Need to grow stack.[m
[31m-    |    st_vmstate CARG3[m
[31m-    |  blx CARG4			// (lua_State *L [, lua_CFunction f])[m
[31m-    |  // Returns nresults.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |    mv_vmstate CARG3, INTERP[m
[31m-    |   ldr CRET2, L->top[m
[31m-    |    str L, [DISPATCH, #DISPATCH_GL(cur_L)][m
[31m-    |   lsl RC, CRET1, #3[m
[31m-    |    st_vmstate CARG3[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   sub RA, CRET2, RC		// RA = L->top - nresults*8[m
[31m-    |  b ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-[m
[31m-  build_subroutines(ctx);[m
[31m-[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  int i;[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",%%progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 0xe\n"				/* Return address is in lr. */[m
[31m-	"\t.byte 0xc\n\t.uleb128 0xd\n\t.uleb128 0\n"	/* def_cfa sp */[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.long .Lbegin\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 1\n",		/* offset lr */[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 11; i >= (LJ_ARCH_HASFPU ? 5 : 4); i--)  /* offset r4-r11 */[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 2+(11-i));[m
[31m-#if LJ_ARCH_HASFPU[m
[31m-    for (i = 15; i >= 8; i--)  /* offset d8-d15 */[m
[31m-      fprintf(ctx->fp, "\t.byte 5\n\t.uleb128 %d, %d\n",[m
[31m-	64+2*i, 10+2*(15-i));[m
[31m-    fprintf(ctx->fp, "\t.byte 0x84\n\t.uleb128 %d\n", 25);  /* offset r4 */[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE0:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.long lj_vm_ffi_call\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 1\n"		/* offset lr */[m
[31m-	"\t.byte 0x8b\n\t.uleb128 2\n"		/* offset r11 */[m
[31m-	"\t.byte 0x85\n\t.uleb128 3\n"		/* offset r5 */[m
[31m-	"\t.byte 0x84\n\t.uleb128 4\n"		/* offset r4 */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0xb\n"		/* def_cfa_register r11 */[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_arm64.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_arm64.dasc[m
[1mdeleted file mode 100644[m
[1mindex 7a881bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_arm64.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,3764 +0,0 @@[m
[31m-|// Low-level VM code for ARM64 CPUs.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.arch arm64[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|// Note: The ragged indentation of the instructions is intentional.[m
[31m-|//       The starting columns indicate data dependencies.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// ARM64 registers and the AAPCS64 ABI 1.0 at a glance:[m
[31m-|//[m
[31m-|// x0-x17 temp, x19-x28 callee-saved, x29 fp, x30 lr[m
[31m-|// x18 is reserved on most platforms. Don't use it, save it or restore it.[m
[31m-|// x31 doesn't exist. Register number 31 either means xzr/wzr (zero) or sp,[m
[31m-|// depending on the instruction.[m
[31m-|// v0-v7 temp, v8-v15 callee-saved (only d8-d15 preserved), v16-v31 temp[m
[31m-|//[m
[31m-|// x0-x7/v0-v7 hold parameters and results.[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|[m
[31m-|// The following must be C callee-save.[m
[31m-|.define BASE,		x19	// Base of current Lua stack frame.[m
[31m-|.define KBASE,		x20	// Constants of current Lua function.[m
[31m-|.define PC,		x21	// Next PC.[m
[31m-|.define GLREG,		x22	// Global state.[m
[31m-|.define LREG,		x23	// Register holding lua_State (also in SAVE_L).[m
[31m-|.define TISNUM,	x24	// Constant LJ_TISNUM << 47.[m
[31m-|.define TISNUMhi,	x25	// Constant LJ_TISNUM << 15.[m
[31m-|.define TISNIL,	x26	// Constant -1LL.[m
[31m-|.define fp,		x29	// Yes, we have to maintain a frame pointer.[m
[31m-|[m
[31m-|.define ST_INTERP,	w26	// Constant -1.[m
[31m-|[m
[31m-|// The following temporaries are not saved across C calls, except for RA/RC.[m
[31m-|.define RA,		x27[m
[31m-|.define RC,		x28[m
[31m-|.define RB,		x17[m
[31m-|.define RAw,		w27[m
[31m-|.define RCw,		w28[m
[31m-|.define RBw,		w17[m
[31m-|.define INS,		x16[m
[31m-|.define INSw,		w16[m
[31m-|.define ITYPE,		x15[m
[31m-|.define TMP0,		x8[m
[31m-|.define TMP1,		x9[m
[31m-|.define TMP2,		x10[m
[31m-|.define TMP3,		x11[m
[31m-|.define TMP0w,		w8[m
[31m-|.define TMP1w,		w9[m
[31m-|.define TMP2w,		w10[m
[31m-|.define TMP3w,		w11[m
[31m-|[m
[31m-|// Calling conventions. Also used as temporaries.[m
[31m-|.define CARG1,		x0[m
[31m-|.define CARG2,		x1[m
[31m-|.define CARG3,		x2[m
[31m-|.define CARG4,		x3[m
[31m-|.define CARG5,		x4[m
[31m-|.define CARG1w,	w0[m
[31m-|.define CARG2w,	w1[m
[31m-|.define CARG3w,	w2[m
[31m-|.define CARG4w,	w3[m
[31m-|.define CARG5w,	w4[m
[31m-|[m
[31m-|.define FARG1,		d0[m
[31m-|.define FARG2,		d1[m
[31m-|[m
[31m-|.define CRET1,		x0[m
[31m-|.define CRET1w,	w0[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	208[m
[31m-|//----- 16 byte aligned, <-- sp entering interpreter[m
[31m-|// Unused		[sp, #204]	// 32 bit values[m
[31m-|.define SAVE_NRES,	[sp, #200][m
[31m-|.define SAVE_ERRF,	[sp, #196][m
[31m-|.define SAVE_MULTRES,	[sp, #192][m
[31m-|.define TMPD,		[sp, #184]	// 64 bit values[m
[31m-|.define SAVE_L,	[sp, #176][m
[31m-|.define SAVE_PC,	[sp, #168][m
[31m-|.define SAVE_CFRAME,	[sp, #160][m
[31m-|.define SAVE_FPR_,	96		// 96+8*8: 64 bit FPR saves[m
[31m-|.define SAVE_GPR_,	16		// 16+10*8: 64 bit GPR saves[m
[31m-|.define SAVE_LR,	[sp, #8][m
[31m-|.define SAVE_FP,	[sp][m
[31m-|//----- 16 byte aligned, <-- sp while in interpreter.[m
[31m-|[m
[31m-|.define TMPDofs,	#184[m
[31m-|[m
[31m-|.macro save_, gpr1, gpr2, fpr1, fpr2[m
[31m-|  stp d..fpr1, d..fpr2, [sp, # SAVE_FPR_+(fpr1-8)*8][m
[31m-|  stp x..gpr1, x..gpr2, [sp, # SAVE_GPR_+(gpr1-19)*8][m
[31m-|.endmacro[m
[31m-|.macro rest_, gpr1, gpr2, fpr1, fpr2[m
[31m-|  ldp d..fpr1, d..fpr2, [sp, # SAVE_FPR_+(fpr1-8)*8][m
[31m-|  ldp x..gpr1, x..gpr2, [sp, # SAVE_GPR_+(gpr1-19)*8][m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro saveregs[m
[31m-|  stp fp, lr, [sp, #-CFRAME_SPACE]![m
[31m-|  add fp, sp, #0[m
[31m-|  stp x19, x20, [sp, # SAVE_GPR_][m
[31m-|  save_ 21, 22, 8, 9[m
[31m-|  save_ 23, 24, 10, 11[m
[31m-|  save_ 25, 26, 12, 13[m
[31m-|  save_ 27, 28, 14, 15[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  ldp x19, x20, [sp, # SAVE_GPR_][m
[31m-|  rest_ 21, 22, 8, 9[m
[31m-|  rest_ 23, 24, 10, 11[m
[31m-|  rest_ 25, 26, 12, 13[m
[31m-|  rest_ 27, 28, 14, 15[m
[31m-|  ldp fp, lr, [sp], # CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State,	LREG[m
[31m-|.type GL,		global_State,	GLREG[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS8,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Trap for not-yet-implemented parts.[m
[31m-|.macro NYI; brk; .endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Access to frame relative to BASE.[m
[31m-|.define FRAME_FUNC,	#-16[m
[31m-|.define FRAME_PC,	#-8[m
[31m-|[m
[31m-|.macro decode_RA, dst, ins; ubfx dst, ins, #8, #8; .endmacro[m
[31m-|.macro decode_RB, dst, ins; ubfx dst, ins, #24, #8; .endmacro[m
[31m-|.macro decode_RC, dst, ins; ubfx dst, ins, #16, #8; .endmacro[m
[31m-|.macro decode_RD, dst, ins; ubfx dst, ins, #16, #16; .endmacro[m
[31m-|.macro decode_RC8RD, dst, src; ubfiz dst, src, #3, #8; .endmacro[m
[31m-|[m
[31m-|// Instruction decode+dispatch.[m
[31m-|.macro ins_NEXT[m
[31m-|  ldr INSw, [PC], #4[m
[31m-|  add TMP1, GL, INS, uxtb #3[m
[31m-|   decode_RA RA, INS[m
[31m-|  ldr TMP0, [TMP1, #GG_G2DISP][m
[31m-|   decode_RD RC, INS[m
[31m-|  br TMP0[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  .macro ins_next[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-|  ldr PC, LFUNC:CARG3->pc[m
[31m-|  ldr INSw, [PC], #4[m
[31m-|  add TMP1, GL, INS, uxtb #3[m
[31m-|   decode_RA RA, INS[m
[31m-|  ldr TMP0, [TMP1, #GG_G2DISP][m
[31m-|   add RA, BASE, RA, lsl #3[m
[31m-|  br TMP0[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, PC = caller PC[m
[31m-|  str PC, [BASE, FRAME_PC][m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to check the TValue type and extract the GCobj. Branch on failure.[m
[31m-|.macro checktp, reg, tp, target[m
[31m-|  asr ITYPE, reg, #47[m
[31m-|  cmn ITYPE, #-tp[m
[31m-|   and reg, reg, #LJ_GCVMASK[m
[31m-|  bne target[m
[31m-|.endmacro[m
[31m-|.macro checktp, dst, reg, tp, target[m
[31m-|  asr ITYPE, reg, #47[m
[31m-|  cmn ITYPE, #-tp[m
[31m-|   and dst, reg, #LJ_GCVMASK[m
[31m-|  bne target[m
[31m-|.endmacro[m
[31m-|.macro checkstr, reg, target; checktp reg, LJ_TSTR, target; .endmacro[m
[31m-|.macro checktab, reg, target; checktp reg, LJ_TTAB, target; .endmacro[m
[31m-|.macro checkfunc, reg, target; checktp reg, LJ_TFUNC, target; .endmacro[m
[31m-|.macro checkint, reg, target[m
[31m-|  cmp TISNUMhi, reg, lsr #32[m
[31m-|  bne target[m
[31m-|.endmacro[m
[31m-|.macro checknum, reg, target[m
[31m-|  cmp TISNUMhi, reg, lsr #32[m
[31m-|  bls target[m
[31m-|.endmacro[m
[31m-|.macro checknumber, reg, target[m
[31m-|  cmp TISNUMhi, reg, lsr #32[m
[31m-|  blo target[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro mov_false, reg; movn reg, #0x8000, lsl #32; .endmacro[m
[31m-|.macro mov_true, reg; movn reg, #0x0001, lsl #48; .endmacro[m
[31m-|[m
[31m-#define GL_J(field)	(GG_OFS(J) + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|.macro hotcheck, delta[m
[31m-|  NYI[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotloop[m
[31m-|  hotcheck HOTCOUNT_LOOP[m
[31m-|  blo ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall[m
[31m-|  hotcheck HOTCOUNT_CALL[m
[31m-|  blo ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state.[m
[31m-|.macro mv_vmstate, reg, st; movn reg, #LJ_VMST_..st; .endmacro[m
[31m-|.macro st_vmstate, reg; str reg, GL->vmstate; .endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites mark and tmp.[m
[31m-|.macro barrierback, tab, mark, tmp[m
[31m-|  ldr tmp, GL->gc.grayagain[m
[31m-|   and mark, mark, #~LJ_GC_BLACK	// black2gray(tab)[m
[31m-|  str tab, GL->gc.grayagain[m
[31m-|   strb mark, tab->marked[m
[31m-|  str tmp, tab->gclist[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-#if !LJ_DUALNUM[m
[31m-#error "Only dual-number mode supported for ARM64 target"[m
[31m-#endif[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  // See vm_return. Also: RB = previous base.[m
[31m-  |  tbz PC, #2, ->cont_dispatch	// (PC & FRAME_P) == 0?[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  ldr PC, [RB, FRAME_PC]		// Fetch PC of previous frame.[m
[31m-  |   mov_true TMP0[m
[31m-  |  mov BASE, RB[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |   str TMP0, [RA, #-8]!		// Prepend true to results.[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  adds RC, RC, #8			// RC = (nresults+1)*8.[m
[31m-  |  mov CRET1, #LUA_YIELD[m
[31m-  |  beq ->vm_unwind_c_eh[m
[31m-  |  str RCw, SAVE_MULTRES[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |  beq ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultptr, RC/MULTRES = (nresults+1)*8, PC = return[m
[31m-  |  // CARG1 = PC & FRAME_TYPE[m
[31m-  |  and RB, PC, #~FRAME_TYPEP[m
[31m-  |   cmp CARG1, #FRAME_C[m
[31m-  |  sub RB, BASE, RB			// RB = previous base.[m
[31m-  |   bne ->vm_returnp[m
[31m-  |[m
[31m-  |  str RB, L->base[m
[31m-  |   ldrsw CARG2, SAVE_NRES		// CARG2 = nresults+1.[m
[31m-  |    mv_vmstate TMP0w, C[m
[31m-  |   sub BASE, BASE, #16[m
[31m-  |  subs TMP2, RC, #8[m
[31m-  |    st_vmstate TMP0w[m
[31m-  |  beq >2[m
[31m-  |1:[m
[31m-  |  subs TMP2, TMP2, #8[m
[31m-  |   ldr TMP0, [RA], #8[m
[31m-  |   str TMP0, [BASE], #8[m
[31m-  |  bne <1[m
[31m-  |2:[m
[31m-  |  cmp RC, CARG2, lsl #3		// More/less results wanted?[m
[31m-  |  bne >6[m
[31m-  |3:[m
[31m-  |  str BASE, L->top			// Store new top.[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  ldr RC, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |   mov CRET1, #0			// Ok return status for vm_pcall.[m
[31m-  |  str RC, L->cframe[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  bgt >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  ldr CARG3, L->maxstack[m
[31m-  |  cmp BASE, CARG3[m
[31m-  |  bhs >8[m
[31m-  |   str TISNIL, [BASE], #8[m
[31m-  |  add RC, RC, #8[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  cbz CARG2, <3			// LUA_MULTRET+1 case?[m
[31m-  |  sub CARG1, RC, CARG2, lsl #3[m
[31m-  |  sub BASE, BASE, CARG1		// Shrink top.[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  str BASE, L->top			// Save current top held in BASE (yes).[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->top			// Need the (realloced) L->top in BASE.[m
[31m-  |  ldrsw CARG2, SAVE_NRES[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  mov sp, CARG1[m
[31m-  |  mov CRET1, CARG2[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |   mv_vmstate TMP0w, C[m
[31m-  |  ldr GL, L->glref[m
[31m-  |   st_vmstate TMP0w[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |  and sp, CARG1, #CFRAME_RAWMASK[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  ldr L, SAVE_L[m
[31m-  |    movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48[m
[31m-  |    movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16[m
[31m-  |    movn TISNIL, #0[m
[31m-  |    mov RC, #16			// 2 results: false + error message.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   ldr GL, L->glref			// Setup pointer to global state.[m
[31m-  |    mov_false TMP0[m
[31m-  |  sub RA, BASE, #8			// Results start at BASE-8.[m
[31m-  |  ldr PC, [BASE, FRAME_PC]		// Fetch PC of previous frame.[m
[31m-  |    str TMP0, [BASE, #-8]		// Prepend false to error message.[m
[31m-  |   st_vmstate ST_INTERP[m
[31m-  |  b ->vm_returnc[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  // CARG1 = L[m
[31m-  |  mov CARG2, #LUA_MINSTACK[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vm_growstack_l:			// Grow stack for Lua function.[m
[31m-  |  // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC[m
[31m-  |  add RC, BASE, RC[m
[31m-  |   sub RA, RA, BASE[m
[31m-  |    mov CARG1, L[m
[31m-  |  stp BASE, RC, L->base[m
[31m-  |   add PC, PC, #4			// Must point after first instruction.[m
[31m-  |   lsr CARG2, RA, #3[m
[31m-  |2:[m
[31m-  |  // L->base = new base, L->top = top[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldp BASE, RC, L->base[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   sub NARGS8:RC, RC, BASE[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  mov L, CARG1[m
[31m-  |    ldr GL, L->glref			// Setup pointer to global state.[m
[31m-  |  mov BASE, CARG2[m
[31m-  |   str L, SAVE_L[m
[31m-  |  mov PC, #FRAME_CP[m
[31m-  |   str wzr, SAVE_NRES[m
[31m-  |    add TMP0, sp, #CFRAME_RESUME[m
[31m-  |  ldrb TMP1w, L->status[m
[31m-  |   str wzr, SAVE_ERRF[m
[31m-  |   str L, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   str xzr, SAVE_CFRAME[m
[31m-  |    str TMP0, L->cframe[m
[31m-  |  cbz TMP1w, >3[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  str L, GL->cur_L[m
[31m-  |  mov RA, BASE[m
[31m-  |   ldp BASE, CARG1, L->base[m
[31m-  |    movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48[m
[31m-  |    movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |     strb wzr, L->status[m
[31m-  |    movn TISNIL, #0[m
[31m-  |   sub RC, CARG1, BASE[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   add RC, RC, #8[m
[31m-  |     st_vmstate ST_INTERP[m
[31m-  |   str RCw, SAVE_MULTRES[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, #FRAME_CP[m
[31m-  |  str CARG4w, SAVE_ERRF[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, #FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  ldr RC, L:CARG1->cframe[m
[31m-  |   str CARG3w, SAVE_NRES[m
[31m-  |    mov L, CARG1[m
[31m-  |   str CARG1, SAVE_L[m
[31m-  |    ldr GL, L->glref			// Setup pointer to global state.[m
[31m-  |     mov BASE, CARG2[m
[31m-  |   str CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  str RC, SAVE_CFRAME[m
[31m-  |  str fp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |[m
[31m-  |3:  // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).[m
[31m-  |  str L, GL->cur_L[m
[31m-  |  ldp RB, CARG1, L->base		// RB = old base (for vmeta_call).[m
[31m-  |    movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48[m
[31m-  |    movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16[m
[31m-  |  add PC, PC, BASE[m
[31m-  |    movn TISNIL, #0[m
[31m-  |  sub PC, PC, RB			// PC = frame delta + frame type[m
[31m-  |   sub NARGS8:RC, CARG1, BASE[m
[31m-  |    st_vmstate ST_INTERP[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  // RB = old base, BASE = new base, RC = nargs*8, PC = caller PC[m
[31m-  |  ldr CARG3, [BASE, FRAME_FUNC][m
[31m-  |  checkfunc CARG3, ->vmeta_call[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, CARG3 = func, RC = nargs*8, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  mov L, CARG1[m
[31m-  |   ldr RA, L:CARG1->stack[m
[31m-  |  str CARG1, SAVE_L[m
[31m-  |    ldr GL, L->glref			// Setup pointer to global state.[m
[31m-  |   ldr RB, L->top[m
[31m-  |  str CARG1, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |  ldr RC, L->cframe[m
[31m-  |   sub RA, RA, RB			// Compute -savestack(L, L->top).[m
[31m-  |   str RAw, SAVE_NRES		// Neg. delta means cframe w/o frame.[m
[31m-  |  str wzr, SAVE_ERRF			// No error function.[m
[31m-  |  str RC, SAVE_CFRAME[m
[31m-  |  str fp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |    str L, GL->cur_L[m
[31m-  |  blr CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |  mov BASE, CRET1[m
[31m-  |   mov PC, #FRAME_CP[m
[31m-  |  cbnz BASE, <3			// Else continue with the call.[m
[31m-  |  b ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultptr, RC = (nresults+1)*8[m
[31m-  |  ldr LFUNC:CARG3, [RB, FRAME_FUNC][m
[31m-  |    ldr CARG1, [BASE, #-32]		// Get continuation.[m
[31m-  |   mov CARG4, BASE[m
[31m-  |   mov BASE, RB			// Restore caller BASE.[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |.if FFI[m
[31m-  |    cmp CARG1, #1[m
[31m-  |.endif[m
[31m-  |   ldr PC, [CARG4, #-24]		// Restore PC from [cont|PC].[m
[31m-  |  ldr CARG3, LFUNC:CARG3->pc[m
[31m-  |    add TMP0, RA, RC[m
[31m-  |    str TISNIL, [TMP0, #-8]		// Ensure one valid arg.[m
[31m-  |.if FFI[m
[31m-  |    bls >1[m
[31m-  |.endif[m
[31m-  |  ldr KBASE, [CARG3, #PC2PROTO(k)][m
[31m-  |  // BASE = base, RA = resultptr, CARG4 = meta base[m
[31m-  |    br CARG1[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  beq ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: tailcall from C function.[m
[31m-  |   sub CARG4, CARG4, #32[m
[31m-  |   sub RC, CARG4, BASE[m
[31m-  |  b ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// RA = resultptr, CARG4 = meta base[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |   sub CARG2, CARG4, #32[m
[31m-  |   ldr TMP0, [RA][m
[31m-  |     str BASE, L->base[m
[31m-  |  decode_RB RB, INS[m
[31m-  |   decode_RA RA, INS[m
[31m-  |  add TMP1, BASE, RB, lsl #3[m
[31m-  |  subs TMP1, CARG2, TMP1[m
[31m-  |  beq >1[m
[31m-  |   str TMP0, [CARG2][m
[31m-  |  lsr CARG3, TMP1, #3[m
[31m-  |  b ->BC_CAT_Z[m
[31m-  |[m
[31m-  |1:[m
[31m-  |   str TMP0, [BASE, RA, lsl #3][m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets1:[m
[31m-  |  movn CARG4, #~LJ_TSTR[m
[31m-  |   add CARG2, BASE, RB, lsl #3[m
[31m-  |  add CARG4, STR:RC, CARG4, lsl #47[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  movk CARG2, #(LJ_TTAB>>1)&0xffff, lsl #48[m
[31m-  |  str CARG2, GL->tmptv[m
[31m-  |  add CARG2, GL, #offsetof(global_State, tmptv)[m
[31m-  |2:[m
[31m-  |   add CARG3, sp, TMPDofs[m
[31m-  |  str CARG4, TMPD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetb:			// RB = table, RC = index[m
[31m-  |  add RC, RC, TISNUM[m
[31m-  |   add CARG2, BASE, RB, lsl #3[m
[31m-  |   add CARG3, sp, TMPDofs[m
[31m-  |  str RC, TMPD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:			// RB = table, RC = key[m
[31m-  |  add CARG2, BASE, RB, lsl #3[m
[31m-  |   add CARG3, BASE, RC, lsl #3[m
[31m-  |1:[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  cbz CRET1, >3[m
[31m-  |  ldr TMP0, [CRET1][m
[31m-  |  str TMP0, [BASE, RA, lsl #3][m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |   sub TMP1, BASE, #FRAME_CONT[m
[31m-  |  ldr BASE, L->top[m
[31m-  |    mov NARGS8:RC, #16		// 2 args for func(t, k).[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |    str PC, [BASE, #-24]		// [cont|PC][m
[31m-  |   sub PC, BASE, TMP1[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  sxtw CARG2, TMP1w[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  mov TMP0, TISNIL[m
[31m-  |  cbz CRET1, ->BC_TGETR_Z[m
[31m-  |  ldr TMP0, [CRET1][m
[31m-  |  b ->BC_TGETR_Z[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets1:[m
[31m-  |  movn CARG4, #~LJ_TSTR[m
[31m-  |   add CARG2, BASE, RB, lsl #3[m
[31m-  |  add CARG4, STR:RC, CARG4, lsl #47[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  movk CARG2, #(LJ_TTAB>>1)&0xffff, lsl #48[m
[31m-  |  str CARG2, GL->tmptv[m
[31m-  |  add CARG2, GL, #offsetof(global_State, tmptv)[m
[31m-  |2:[m
[31m-  |   add CARG3, sp, TMPDofs[m
[31m-  |  str CARG4, TMPD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetb:			// RB = table, RC = index[m
[31m-  |  add RC, RC, TISNUM[m
[31m-  |   add CARG2, BASE, RB, lsl #3[m
[31m-  |   add CARG3, sp, TMPDofs[m
[31m-  |  str RC, TMPD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  add CARG2, BASE, RB, lsl #3[m
[31m-  |   add CARG3, BASE, RC, lsl #3[m
[31m-  |1:[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-  |  cbz CRET1, >3[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |   str TMP0, [CRET1][m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |   sub TMP1, BASE, #FRAME_CONT[m
[31m-  |  ldr BASE, L->top[m
[31m-  |    mov NARGS8:RC, #24		// 3 args for func(t, k, v).[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |   str TMP0, [BASE, #16]		// Copy value to third argument.[m
[31m-  |    str PC, [BASE, #-24]		// [cont|PC][m
[31m-  |   sub PC, BASE, TMP1[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |  sxtw CARG3, TMP1w[m
[31m-  |  str BASE, L->base[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // Returns TValue *.[m
[31m-  |  b ->BC_TSETR_Z[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  add CARG2, BASE, RA, lsl #3[m
[31m-  |   sub PC, PC, #4[m
[31m-  |  add CARG3, BASE, RC, lsl #3[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  uxtb CARG4w, INSw[m
[31m-  |  bl extern lj_meta_comp  // (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |3:[m
[31m-  |  cmp CRET1, #1[m
[31m-  |  bhi ->vmeta_binop[m
[31m-  |4:[m
[31m-  |   ldrh RBw, [PC, #2][m
[31m-  |    add PC, PC, #4[m
[31m-  |   add RB, PC, RB, lsl #2[m
[31m-  |   sub RB, RB, #0x20000[m
[31m-  |  csel PC, PC, RB, lo[m
[31m-  |->cont_nop:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_ra:				// RA = resultptr[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |   ldr TMP0, [RA][m
[31m-  |  decode_RA TMP1, INS[m
[31m-  |   str TMP0, [BASE, TMP1, lsl #3][m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |->cont_condt:			// RA = resultptr[m
[31m-  |  ldr TMP0, [RA][m
[31m-  |   mov_true TMP1[m
[31m-  |  cmp TMP1, TMP0			// Branch if result is true.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->cont_condf:			// RA = resultptr[m
[31m-  |  ldr TMP0, [RA][m
[31m-  |   mov_false TMP1[m
[31m-  |  cmp TMP0, TMP1			// Branch if result is false.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV.[m
[31m-  |  and TAB:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal  // (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |   mov CARG2, INS[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal_cd		// (lua_State *L, BCIns op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  sub PC, PC, #4[m
[31m-  |   str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |   mov CARG2, RA[m
[31m-  |   mov CARG3, RC[m
[31m-  |  str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  add CARG3, BASE, RB, lsl #3[m
[31m-  |   add CARG4, KBASE, RC, lsl #3[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  add CARG4, BASE, RB, lsl #3[m
[31m-  |   add CARG3, KBASE, RC, lsl #3[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  add CARG3, BASE, RC, lsl #3[m
[31m-  |  mov CARG4, CARG3[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  add CARG3, BASE, RB, lsl #3[m
[31m-  |   add CARG4, BASE, RC, lsl #3[m
[31m-  |1:[m
[31m-  |  uxtb CARG5w, INSw[m
[31m-  |   add CARG2, BASE, RA, lsl #3[m
[31m-  |    str BASE, L->base[m
[31m-  |   mov CARG1, L[m
[31m-  |    str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_arith  // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-  |  cbz CRET1, ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2[m
[31m-  |  sub TMP1, CRET1, BASE[m
[31m-  |   str PC, [CRET1, #-24]		// [cont|PC][m
[31m-  |  add PC, TMP1, #FRAME_CONT[m
[31m-  |  mov BASE, CRET1[m
[31m-  |   mov NARGS8:RC, #16		// 2 args for func(o1, o2).[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  add CARG2, BASE, RC, lsl #3[m
[31m-#if LJ_52[m
[31m-  |  mov TAB:RC, TAB:CARG1		// Save table (ignored for other types).[m
[31m-#endif[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |  // Returns NULL (retry) or TValue * (metamethod base).[m
[31m-#if LJ_52[m
[31m-  |  cbnz CRET1, ->vmeta_binop		// Binop call for compatibility.[m
[31m-  |  mov TAB:CARG1, TAB:RC[m
[31m-  |  b ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  b ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // RB = old base, BASE = new base, RC = nargs*8[m
[31m-  |  mov CARG1, L[m
[31m-  |   str RB, L->base			// This is the callers base![m
[31m-  |  sub CARG2, BASE, #16[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  add CARG3, BASE, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC]  // Guaranteed to be a function here.[m
[31m-  |   add NARGS8:RC, NARGS8:RC, #8	// Got one more argument now.[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  ins_call[m
[31m-  |[m
[31m-  |->vmeta_callt:			// Resolve __call for BC_CALLT.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs*8[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  sub CARG2, RA, #16[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  add CARG3, RA, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  ldr TMP1, [RA, FRAME_FUNC]		// Guaranteed to be a function here.[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |   add NARGS8:RC, NARGS8:RC, #8	// Got one more argument now.[m
[31m-  |  and LFUNC:CARG3, TMP1, #LJ_GCVMASK[m
[31m-  |  b ->BC_CALLT2_Z[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, RA[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |.if JIT[m
[31m-  |   uxtb TMP0, INS[m
[31m-  |.endif[m
[31m-  |  decode_RA RA, INS[m
[31m-  |  decode_RD RC, INS[m
[31m-  |.if JIT[m
[31m-  |   cmp TMP0, #BC_JFORI[m
[31m-  |   beq =>BC_JFORI[m
[31m-  |.endif[m
[31m-  |  b =>BC_FORI[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  ldp CARG1, CARG2, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name[m
[31m-  |  .ffunc name[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  ldr FARG1, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checknum CARG1, ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name[m
[31m-  |  .ffunc name[m
[31m-  |  ldp CARG1, CARG2, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |  ldp FARG1, FARG2, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checknum CARG1, ->fff_fallback[m
[31m-  |  checknum CARG2, ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses CARG1 and CARG2.[m
[31m-  |.macro ffgccheck[m
[31m-  |  ldp CARG1, CARG2, GL->gc.total	// Assumes threshold follows total.[m
[31m-  |  cmp CARG1, CARG2[m
[31m-  |  blt >1[m
[31m-  |  bl ->fff_gcstep[m
[31m-  |1:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  mov_false TMP1[m
[31m-  |  cmp CARG1, TMP1[m
[31m-  |  bhs ->fff_fallback[m
[31m-  |  str CARG1, [BASE, #-16][m
[31m-  |  sub RB, BASE, #8[m
[31m-  |  subs RA, NARGS8:RC, #8[m
[31m-  |   add RC, NARGS8:RC, #8		// Compute (nresults+1)*8.[m
[31m-  |  cbz RA, ->fff_res			// Done if exactly 1 argument.[m
[31m-  |1:[m
[31m-  |   ldr CARG1, [RB, #16][m
[31m-  |  sub RA, RA, #8[m
[31m-  |   str CARG1, [RB], #8[m
[31m-  |  cbnz RA, <1[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 type[m
[31m-  |  mov TMP0, #~LJ_TISNUM[m
[31m-  |  asr ITYPE, CARG1, #47[m
[31m-  |  cmn ITYPE, #~LJ_TISNUM[m
[31m-  |  csinv TMP1, TMP0, ITYPE, lo[m
[31m-  |  add TMP1, TMP1, #offsetof(GCfuncC, upvalue)/8[m
[31m-  |  ldr CARG1, [CFUNC:CARG3, TMP1, lsl #3][m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  asr ITYPE, CARG1, #47[m
[31m-  |  cmn ITYPE, #-LJ_TTAB[m
[31m-  |  ccmn ITYPE, #-LJ_TUDATA, #4, ne[m
[31m-  |   and TAB:CARG1, CARG1, #LJ_GCVMASK[m
[31m-  |  bne >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  ldr TAB:RB, TAB:CARG1->metatable[m
[31m-  |2:[m
[31m-  |   mov CARG1, TISNIL[m
[31m-  |   ldr STR:RC, GL->gcroot[GCROOT_MMNAME+MM_metatable][m
[31m-  |  cbz TAB:RB, ->fff_restv[m
[31m-  |  ldr TMP1w, TAB:RB->hmask[m
[31m-  |   ldr TMP2w, STR:RC->hash[m
[31m-  |    ldr NODE:CARG3, TAB:RB->node[m
[31m-  |  and TMP1w, TMP1w, TMP2w		// idx = str->hash & tab->hmask[m
[31m-  |  add TMP1, TMP1, TMP1, lsl #1[m
[31m-  |  movn CARG4, #~LJ_TSTR[m
[31m-  |    add NODE:CARG3, NODE:CARG3, TMP1, lsl #3  // node = tab->node + idx*3*8[m
[31m-  |  add CARG4, STR:RC, CARG4, lsl #47	// Tagged key to look for.[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  ldp CARG1, TMP0, NODE:CARG3->val[m
[31m-  |   ldr NODE:CARG3, NODE:CARG3->next[m
[31m-  |  cmp TMP0, CARG4[m
[31m-  |  beq >5[m
[31m-  |  cbnz NODE:CARG3, <3[m
[31m-  |4:[m
[31m-  |  mov CARG1, RB			// Use metatable as default result.[m
[31m-  |  movk CARG1, #(LJ_TTAB>>1)&0xffff, lsl #48[m
[31m-  |  b ->fff_restv[m
[31m-  |5:[m
[31m-  |  cmp TMP0, TISNIL[m
[31m-  |  bne ->fff_restv[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  movn TMP0, #~LJ_TISNUM[m
[31m-  |  cmp ITYPE, TMP0[m
[31m-  |  csel ITYPE, ITYPE, TMP0, hs[m
[31m-  |  sub TMP1, GL, ITYPE, lsl #3[m
[31m-  |  ldr TAB:RB, [TMP1, #offsetof(global_State, gcroot[GCROOT_BASEMT])-8][m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  checktp TMP1, CARG1, LJ_TTAB, ->fff_fallback[m
[31m-  |   ldr TAB:TMP0, TAB:TMP1->metatable[m
[31m-  |  asr ITYPE, CARG2, #47[m
[31m-  |   ldrb TMP2w, TAB:TMP1->marked[m
[31m-  |  cmn ITYPE, #-LJ_TTAB[m
[31m-  |    and TAB:CARG2, CARG2, #LJ_GCVMASK[m
[31m-  |  ccmp TAB:TMP0, #0, #0, eq[m
[31m-  |  bne ->fff_fallback[m
[31m-  |    str TAB:CARG2, TAB:TMP1->metatable[m
[31m-  |   tbz TMP2w, #2, ->fff_restv	// isblack(table)[m
[31m-  |  barrierback TAB:TMP1, TMP2w, TMP0[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc rawget[m
[31m-  |  ldr CARG2, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-  |   mov CARG1, L[m
[31m-  |   add CARG3, BASE, #8[m
[31m-  |  bl extern lj_tab_get  // (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // Returns cTValue *.[m
[31m-  |  ldr CARG1, [CRET1][m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  checknumber CARG1, ->fff_fallback[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  asr ITYPE, CARG1, #47[m
[31m-  |  cmn ITYPE, #-LJ_TSTR[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  beq ->fff_restv[m
[31m-  |  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  ldr TMP1, GL->gcroot[GCROOT_BASEMT_NUM][m
[31m-  |   str BASE, L->base[m
[31m-  |  cmn ITYPE, #-LJ_TISNUM[m
[31m-  |  ccmp TMP1, #0, #0, ls[m
[31m-  |   str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  ffgccheck[m
[31m-  |  mov CARG1, L[m
[31m-  |  mov CARG2, BASE[m
[31m-  |  bl extern lj_strfmt_number		// (lua_State *L, cTValue *o)[m
[31m-  |  // Returns GCstr *.[m
[31m-  |   movn TMP1, #~LJ_TSTR[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   add CARG1, CARG1, TMP1, lsl #47[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 next[m
[31m-  |  checktp CARG2, CARG1, LJ_TTAB, ->fff_fallback[m
[31m-  |  str TISNIL, [BASE, NARGS8:RC]	// Set missing 2nd arg to nil.[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |   stp BASE, BASE, L->base		// Add frame since C call can throw.[m
[31m-  |  mov CARG1, L[m
[31m-  |  add CARG3, BASE, #8[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Returns 0 at end of traversal.[m
[31m-  |  str TISNIL, [BASE, #-16][m
[31m-  |  cbz CRET1, ->fff_res1		// End of traversal: return nil.[m
[31m-  |  ldp CARG1, CARG2, [BASE, #8]	// Copy key and value to results.[m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |  stp CARG1, CARG2, [BASE, #-16][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  checktp TMP1, CARG1, LJ_TTAB, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  ldr TAB:CARG2, TAB:TMP1->metatable[m
[31m-#endif[m
[31m-  |   ldr CFUNC:CARG4, CFUNC:CARG3->upvalue[0][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-#if LJ_52[m
[31m-  |  cbnz TAB:CARG2, ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov RC, #(3+1)*8[m
[31m-  |  stp CARG1, TISNIL, [BASE, #-8][m
[31m-  |   str CFUNC:CARG4, [BASE, #-16][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_2 ipairs_aux[m
[31m-  |  checktab CARG1, ->fff_fallback[m
[31m-  |   checkint CARG2, ->fff_fallback[m
[31m-  |  ldr TMP1w, TAB:CARG1->asize[m
[31m-  |   ldr CARG3, TAB:CARG1->array[m
[31m-  |    ldr TMP0w, TAB:CARG1->hmask[m
[31m-  |  add CARG2w, CARG2w, #1[m
[31m-  |  cmp CARG2w, TMP1w[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |     add TMP2, CARG2, TISNUM[m
[31m-  |   mov RC, #(0+1)*8[m
[31m-  |     str TMP2, [BASE, #-16][m
[31m-  |  bhs >2				// Not in array part?[m
[31m-  |  ldr TMP0, [CARG3, CARG2, lsl #3][m
[31m-  |1:[m
[31m-  |   mov TMP1, #(2+1)*8[m
[31m-  |   cmp TMP0, TISNIL[m
[31m-  |  str TMP0, [BASE, #-8][m
[31m-  |   csel RC, RC, TMP1, eq[m
[31m-  |  b ->fff_res[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  cbz TMP0w, ->fff_res[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  cbz CRET1, ->fff_res[m
[31m-  |  ldr TMP0, [CRET1][m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  checktp TMP1, CARG1, LJ_TTAB, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  ldr TAB:CARG2, TAB:TMP1->metatable[m
[31m-#endif[m
[31m-  |   ldr CFUNC:CARG4, CFUNC:CARG3->upvalue[0][m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-#if LJ_52[m
[31m-  |  cbnz TAB:CARG2, ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov RC, #(3+1)*8[m
[31m-  |  stp CARG1, TISNUM, [BASE, #-8][m
[31m-  |   str CFUNC:CARG4, [BASE, #-16][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc pcall[m
[31m-  |  ldrb TMP0w, GL->hookmask[m
[31m-  |   subs NARGS8:RC, NARGS8:RC, #8[m
[31m-  |   blo ->fff_fallback[m
[31m-  |    mov RB, BASE[m
[31m-  |    add BASE, BASE, #16[m
[31m-  |  ubfx TMP0w, TMP0w, #HOOK_ACTIVE_SHIFT, #1[m
[31m-  |  add PC, TMP0, #16+FRAME_PCALL[m
[31m-  |   beq ->vm_call_dispatch[m
[31m-  |1:[m
[31m-  |   add TMP2, BASE, NARGS8:RC[m
[31m-  |2:[m
[31m-  |   ldr TMP0, [TMP2, #-16][m
[31m-  |   str TMP0, [TMP2, #-8]![m
[31m-  |  cmp TMP2, BASE[m
[31m-  |  bne <2[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc xpcall[m
[31m-  |     ldp CARG1, CARG2, [BASE][m
[31m-  |  ldrb TMP0w, GL->hookmask[m
[31m-  |   subs NARGS8:RC, NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |    mov RB, BASE[m
[31m-  |    add BASE, BASE, #24[m
[31m-  |     asr ITYPE, CARG2, #47[m
[31m-  |  ubfx TMP0w, TMP0w, #HOOK_ACTIVE_SHIFT, #1[m
[31m-  |     cmn ITYPE, #-LJ_TFUNC[m
[31m-  |  add PC, TMP0, #24+FRAME_PCALL[m
[31m-  |     bne ->fff_fallback		// Traceback must be a function.[m
[31m-  |     stp CARG2, CARG1, [RB]		// Swap function and traceback.[m
[31m-  |   cbz NARGS8:RC, ->vm_call_dispatch[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  checktp CARG1, LJ_TTHREAD, ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  ldr L:CARG1, CFUNC:CARG3->upvalue[0].gcr[m
[31m-  |  and L:CARG1, CARG1, #LJ_GCVMASK[m
[31m-  |.endif[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |     str BASE, L->base[m
[31m-  |  ldp RB, CARG2, L:CARG1->base[m
[31m-  |   ldrb TMP1w, L:CARG1->status[m
[31m-  |  add TMP0, CARG2, TMP1[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  cmp TMP0, RB[m
[31m-  |  beq ->fff_fallback[m
[31m-  |   cmp TMP1, #LUA_YIELD[m
[31m-  |    add TMP0, CARG2, #8[m
[31m-  |   csel CARG2, CARG2, TMP0, hs[m
[31m-  |   ldr CARG4, L:CARG1->maxstack[m
[31m-  |   add CARG3, CARG2, NARGS8:RC[m
[31m-  |    ldr RB, L:CARG1->cframe[m
[31m-  |   ccmp CARG3, CARG4, #2, ls[m
[31m-  |    ccmp RB, #0, #2, ls[m
[31m-  |    bhi ->fff_fallback[m
[31m-  |.if resume[m
[31m-  |  sub CARG3, CARG3, #8		// Keep resumed thread in stack for GC.[m
[31m-  |  add BASE, BASE, #8[m
[31m-  |  sub NARGS8:RC, NARGS8:RC, #8[m
[31m-  |.endif[m
[31m-  |  str CARG3, L:CARG1->top[m
[31m-  |  str BASE, L->top[m
[31m-  |  cbz NARGS8:RC, >3[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |   ldr TMP0, [BASE, RB][m
[31m-  |  cmp RB, NARGS8:RC[m
[31m-  |   str TMP0, [CARG2, RB][m
[31m-  |   add RB, RB, #8[m
[31m-  |  bne <2[m
[31m-  |3:[m
[31m-  |  mov CARG3, #0[m
[31m-  |   mov L:RA, L:CARG1[m
[31m-  |  mov CARG4, #0[m
[31m-  |  bl ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |  // Returns thread status.[m
[31m-  |4:[m
[31m-  |  ldp CARG3, CARG4, L:RA->base[m
[31m-  |   cmp CRET1, #LUA_YIELD[m
[31m-  |  ldr BASE, L->base[m
[31m-  |    str L, GL->cur_L[m
[31m-  |    st_vmstate ST_INTERP[m
[31m-  |   bhi >8[m
[31m-  |  sub RC, CARG4, CARG3[m
[31m-  |   ldr CARG1, L->maxstack[m
[31m-  |   add CARG2, BASE, RC[m
[31m-  |  cbz RC, >6				// No results?[m
[31m-  |  cmp CARG2, CARG1[m
[31m-  |   mov RB, #0[m
[31m-  |  bhi >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  sub CARG4, RC, #8[m
[31m-  |   str CARG3, L:RA->top		// Clear coroutine stack.[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |   ldr TMP0, [CARG3, RB][m
[31m-  |  cmp RB, CARG4[m
[31m-  |   str TMP0, [BASE, RB][m
[31m-  |   add RB, RB, #8[m
[31m-  |  bne <5[m
[31m-  |6:[m
[31m-  |.if resume[m
[31m-  |  mov_true TMP1[m
[31m-  |   add RC, RC, #16[m
[31m-  |7:[m
[31m-  |  str TMP1, [BASE, #-8]		// Prepend true/false to results.[m
[31m-  |   sub RA, BASE, #8[m
[31m-  |.else[m
[31m-  |   mov RA, BASE[m
[31m-  |   add RC, RC, #8[m
[31m-  |.endif[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   str RCw, SAVE_MULTRES[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  ldr TMP0, [CARG4, #-8]![m
[31m-  |   mov_false TMP1[m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |  str CARG4, L:RA->top		// Remove error from coroutine stack.[m
[31m-  |  str TMP0, [BASE]			// Copy error message.[m
[31m-  |  b <7[m
[31m-  |.else[m
[31m-  |  mov CARG1, L[m
[31m-  |  mov CARG2, L:RA[m
[31m-  |  bl extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |  // Never returns.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  mov CARG1, L[m
[31m-  |  lsr CARG2, RC, #3[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov CRET1, #0[m
[31m-  |  b <4[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  ldr TMP0, L->cframe[m
[31m-  |   add TMP1, BASE, NARGS8:RC[m
[31m-  |    mov CRET1, #LUA_YIELD[m
[31m-  |   stp BASE, TMP1, L->base[m
[31m-  |  tbz TMP0, #0, ->fff_fallback[m
[31m-  |   str xzr, L->cframe[m
[31m-  |    strb CRET1w, L->status[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro math_round, func, round[m
[31m-  |  .ffunc math_ .. func[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  ldr d0, [BASE][m
[31m-  |   blo ->fff_fallback[m
[31m-  |  cmp TISNUMhi, CARG1, lsr #32[m
[31m-  |  beq ->fff_restv[m
[31m-  |  blo ->fff_fallback[m
[31m-  |  round d0, d0[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor, frintm[m
[31m-  |  math_round ceil, frintp[m
[31m-  |[m
[31m-  |.ffunc_1 math_abs[m
[31m-  |  checknumber CARG1, ->fff_fallback[m
[31m-  |  and CARG1, CARG1, #U64x(7fffffff,ffffffff)[m
[31m-  |  bne ->fff_restv[m
[31m-  |  eor CARG2w, CARG1w, CARG1w, asr #31[m
[31m-  |   movz CARG3, #0x41e0, lsl #48	// 2^31.[m
[31m-  |  subs CARG1w, CARG2w, CARG1w, asr #31[m
[31m-  |   add CARG1, CARG1, TISNUM[m
[31m-  |  csel CARG1, CARG1, CARG3, pl[m
[31m-  |  // Fallthrough.[m
[31m-  |[m
[31m-  |->fff_restv:[m
[31m-  |  // CARG1 = TValue result.[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |  str CARG1, [BASE, #-16][m
[31m-  |->fff_res1:[m
[31m-  |  // PC = return.[m
[31m-  |  mov RC, #(1+1)*8[m
[31m-  |->fff_res:[m
[31m-  |  // RC = (nresults+1)*8, PC = return.[m
[31m-  |  ands CARG1, PC, #FRAME_TYPE[m
[31m-  |   str RCw, SAVE_MULTRES[m
[31m-  |   sub RA, BASE, #16[m
[31m-  |  bne ->vm_return[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |  decode_RB RB, INS[m
[31m-  |5:[m
[31m-  |  cmp RC, RB, lsl #3			// More results expected?[m
[31m-  |  blo >6[m
[31m-  |  decode_RA TMP1, INS[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |  sub BASE, RA, TMP1, lsl #3[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  add TMP1, RA, RC[m
[31m-  |   add RC, RC, #8[m
[31m-  |  str TISNIL, [TMP1, #-8][m
[31m-  |  b <5[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc_n math_ .. func[m
[31m-  |  bl extern func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |  bl extern func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_n math_sqrt[m
[31m-  |  fsqrt d0, d0[m
[31m-  |->fff_resn:[m
[31m-  |  ldr PC, [BASE, FRAME_PC][m
[31m-  |  str d0, [BASE, #-16][m
[31m-  |  b ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  ldr FARG1, [BASE][m
[31m-  |   bne ->fff_fallback			// Need exactly 1 argument.[m
[31m-  |  checknum CARG1, ->fff_fallback[m
[31m-  |  bl extern log[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.ffunc_2 math_ldexp[m
[31m-  |  ldr FARG1, [BASE][m
[31m-  |  checknum CARG1, ->fff_fallback[m
[31m-  |  checkint CARG2, ->fff_fallback[m
[31m-  |  sxtw CARG1, CARG2w[m
[31m-  |  bl extern ldexp			// (double x, int exp)[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |  add CARG1, sp, TMPDofs[m
[31m-  |  bl extern frexp[m
[31m-  |   ldr CARG2w, TMPD[m
[31m-  |    ldr PC, [BASE, FRAME_PC][m
[31m-  |  str d0, [BASE, #-16][m
[31m-  |    mov RC, #(2+1)*8[m
[31m-  |   add CARG2, CARG2, TISNUM[m
[31m-  |   str CARG2, [BASE, #-8][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_n math_modf[m
[31m-  |  sub CARG1, BASE, #16[m
[31m-  |   ldr PC, [BASE, FRAME_PC][m
[31m-  |  bl extern modf[m
[31m-  |   mov RC, #(2+1)*8[m
[31m-  |  str d0, [BASE, #-8][m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.macro math_minmax, name, cond, fcond[m
[31m-  |  .ffunc_1 name[m
[31m-  |   add RB, BASE, RC[m
[31m-  |   add RA, BASE, #8[m
[31m-  |  checkint CARG1, >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  ldr CARG2, [RA][m
[31m-  |   cmp RA, RB[m
[31m-  |   bhs ->fff_restv[m
[31m-  |  checkint CARG2, >3[m
[31m-  |  cmp CARG1w, CARG2w[m
[31m-  |   add RA, RA, #8[m
[31m-  |  csel CARG1, CARG2, CARG1, cond[m
[31m-  |  b <1[m
[31m-  |3:  // Convert intermediate result to number and continue below.[m
[31m-  |  scvtf d0, CARG1w[m
[31m-  |  blo ->fff_fallback[m
[31m-  |  ldr d1, [RA][m
[31m-  |  b >6[m
[31m-  |[m
[31m-  |4:[m
[31m-  |  ldr d0, [BASE][m
[31m-  |  blo ->fff_fallback[m
[31m-  |5:  // Handle numbers.[m
[31m-  |  ldr CARG2, [RA][m
[31m-  |  ldr d1, [RA][m
[31m-  |   cmp RA, RB[m
[31m-  |   bhs ->fff_resn[m
[31m-  |  checknum CARG2, >7[m
[31m-  |6:[m
[31m-  |  fcmp d0, d1[m
[31m-  |   add RA, RA, #8[m
[31m-  |  fcsel d0, d1, d0, fcond[m
[31m-  |  b <5[m
[31m-  |7:  // Convert integer to number and continue above.[m
[31m-  |  scvtf d1, CARG2w[m
[31m-  |  blo ->fff_fallback[m
[31m-  |  b <6[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, gt, hi[m
[31m-  |  math_minmax math_max, lt, lo[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  ldp PC, CARG1, [BASE, FRAME_PC][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  asr ITYPE, CARG1, #47[m
[31m-  |  ccmn ITYPE, #-LJ_TSTR, #0, eq[m
[31m-  |   and STR:CARG1, CARG1, #LJ_GCVMASK[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  ldrb TMP0w, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |   ldr CARG3w, STR:CARG1->len[m
[31m-  |  add TMP0, TMP0, TISNUM[m
[31m-  |  str TMP0, [BASE, #-16][m
[31m-  |  mov RC, #(0+1)*8[m
[31m-  |   cbz CARG3, ->fff_res[m
[31m-  |  b ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  ldp PC, CARG1, [BASE, FRAME_PC][m
[31m-  |  cmp CARG1w, #255[m
[31m-  |   ccmp NARGS8:RC, #8, #0, ls		// Need exactly 1 argument.[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  checkint CARG1, ->fff_fallback[m
[31m-  |  mov CARG3, #1[m
[31m-  |  mov CARG2, BASE			// Points to stack. Little-endian.[m
[31m-  |->fff_newstr:[m
[31m-  |  // CARG2 = str, CARG3 = len.[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG1, L[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |  bl extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |   movn TMP1, #~LJ_TSTR[m
[31m-  |  add CARG1, CARG1, TMP1, lsl #47[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  ldr CARG1, [BASE][m
[31m-  |    ldr CARG3, [BASE, #16][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |    movn RB, #0[m
[31m-  |   beq >1[m
[31m-  |   blo ->fff_fallback[m
[31m-  |    checkint CARG3, ->fff_fallback[m
[31m-  |    sxtw RB, CARG3w[m
[31m-  |1:[m
[31m-  |  ldr CARG2, [BASE, #8][m
[31m-  |  checkstr CARG1, ->fff_fallback[m
[31m-  |   ldr TMP1w, STR:CARG1->len[m
[31m-  |  checkint CARG2, ->fff_fallback[m
[31m-  |  sxtw CARG2, CARG2w[m
[31m-  |  // CARG1 = str, TMP1 = str->len, CARG2 = start, RB = end[m
[31m-  |   add TMP2, RB, TMP1[m
[31m-  |   cmp RB, #0[m
[31m-  |  add TMP0, CARG2, TMP1[m
[31m-  |   csinc RB, RB, TMP2, ge		// if (end < 0) end += len+1[m
[31m-  |  cmp CARG2, #0[m
[31m-  |  csinc CARG2, CARG2, TMP0, ge	// if (start < 0) start += len+1[m
[31m-  |   cmp RB, #0[m
[31m-  |   csel RB, RB, xzr, ge		// if (end < 0) end = 0[m
[31m-  |  cmp CARG2, #1[m
[31m-  |  csinc CARG2, CARG2, xzr, ge	// if (start < 1) start = 1[m
[31m-  |   cmp RB, TMP1[m
[31m-  |   csel RB, RB, TMP1, le		// if (end > len) end = len[m
[31m-  |  add CARG1, STR:CARG1, #sizeof(GCstr)-1[m
[31m-  |   subs CARG3, RB, CARG2		// len = end - start[m
[31m-  |  add CARG2, CARG1, CARG2[m
[31m-  |   add CARG3, CARG3, #1		// len += 1[m
[31m-  |   bge ->fff_newstr[m
[31m-  |  add STR:CARG1, GL, #offsetof(global_State, strempty)[m
[31m-  |   movn TMP1, #~LJ_TSTR[m
[31m-  |  add CARG1, CARG1, TMP1, lsl #47[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |  ldr CARG2, [BASE][m
[31m-  |   cmp NARGS8:RC, #8[m
[31m-  |  asr ITYPE, CARG2, #47[m
[31m-  |  ccmn ITYPE, #-LJ_TSTR, #0, hs[m
[31m-  |   and STR:CARG2, CARG2, #LJ_GCVMASK[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  ldr TMP0, GL->tmpbuf.b[m
[31m-  |   add SBUF:CARG1, GL, #offsetof(global_State, tmpbuf)[m
[31m-  |   str BASE, L->base[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   str L, GL->tmpbuf.L[m
[31m-  |  str TMP0, GL->tmpbuf.p[m
[31m-  |  bl extern lj_buf_putstr_ .. name[m
[31m-  |  bl extern lj_buf_tostr[m
[31m-  |  b ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP number to bit conversion for soft-float. Clobbers CARG1-CARG3[m
[31m-  |->vm_tobit_fb:[m
[31m-  |  bls ->fff_fallback[m
[31m-  |  add CARG2, CARG1, CARG1[m
[31m-  |  mov CARG3, #1076[m
[31m-  |  sub CARG3, CARG3, CARG2, lsr #53[m
[31m-  |  cmp CARG3, #53[m
[31m-  |  bhi >1[m
[31m-  |  and CARG2, CARG2, #U64x(001fffff,ffffffff)[m
[31m-  |  orr CARG2, CARG2, #U64x(00200000,00000000)[m
[31m-  |   cmp CARG1, #0[m
[31m-  |  lsr CARG2, CARG2, CARG3[m
[31m-  |   cneg CARG1w, CARG2w, mi[m
[31m-  |  br lr[m
[31m-  |1:[m
[31m-  |  mov CARG1w, #0[m
[31m-  |  br lr[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name[m
[31m-  |  .ffunc_1 bit_..name[m
[31m-  |  adr lr, >1[m
[31m-  |  checkint CARG1, ->vm_tobit_fb[m
[31m-  |1:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name[m
[31m-  |  mov RA, #8[m
[31m-  |  mov TMP0w, CARG1w[m
[31m-  |  adr lr, >2[m
[31m-  |1:[m
[31m-  |  ldr CARG1, [BASE, RA][m
[31m-  |   cmp RA, NARGS8:RC[m
[31m-  |    add RA, RA, #8[m
[31m-  |   bge >9[m
[31m-  |  checkint CARG1, ->vm_tobit_fb[m
[31m-  |2:[m
[31m-  |  ins TMP0w, TMP0w, CARG1w[m
[31m-  |  b <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op band, and[m
[31m-  |.ffunc_bit_op bor, orr[m
[31m-  |.ffunc_bit_op bxor, eor[m
[31m-  |[m
[31m-  |.ffunc_bit tobit[m
[31m-  |  mov TMP0w, CARG1w[m
[31m-  |9:  // Label reused by .ffunc_bit_op users.[m
[31m-  |  add CARG1, TMP0, TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc_bit bswap[m
[31m-  |  rev TMP0w, CARG1w[m
[31m-  |  add CARG1, TMP0, TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc_bit bnot[m
[31m-  |  mvn TMP0w, CARG1w[m
[31m-  |  add CARG1, TMP0, TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins, shmod[m
[31m-  |  .ffunc bit_..name[m
[31m-  |  ldp TMP0, CARG1, [BASE][m
[31m-  |   cmp NARGS8:RC, #16[m
[31m-  |   blo ->fff_fallback[m
[31m-  |  adr lr, >1[m
[31m-  |  checkint CARG1, ->vm_tobit_fb[m
[31m-  |1:[m
[31m-  |.if shmod == 0[m
[31m-  |  mov TMP1, CARG1[m
[31m-  |.else[m
[31m-  |  neg TMP1, CARG1[m
[31m-  |.endif[m
[31m-  |  mov CARG1, TMP0[m
[31m-  |  adr lr, >2[m
[31m-  |  checkint CARG1, ->vm_tobit_fb[m
[31m-  |2:[m
[31m-  |  ins TMP0w, CARG1w, TMP1w[m
[31m-  |  add CARG1, TMP0, TISNUM[m
[31m-  |  b ->fff_restv[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh lshift, lsl, 0[m
[31m-  |.ffunc_bit_sh rshift, lsr, 0[m
[31m-  |.ffunc_bit_sh arshift, asr, 0[m
[31m-  |.ffunc_bit_sh rol, ror, 1[m
[31m-  |.ffunc_bit_sh ror, ror, 0[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |   ldp CFUNC:CARG3, PC, [BASE, FRAME_FUNC]	// Fallback may overwrite PC.[m
[31m-  |  ldr TMP2, L->maxstack[m
[31m-  |  add TMP1, BASE, NARGS8:RC[m
[31m-  |  stp BASE, TMP1, L->base[m
[31m-  |   and CFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  add TMP1, TMP1, #8*LUA_MINSTACK[m
[31m-  |   ldr CARG3, CFUNC:CARG3->f[m
[31m-  |    str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  cmp TMP1, TMP2[m
[31m-  |   mov CARG1, L[m
[31m-  |  bhi >5				// Need to grow stack.[m
[31m-  |   blr CARG3				// (lua_State *L)[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |   ldr BASE, L->base[m
[31m-  |  cmp CRET1w, #0[m
[31m-  |   lsl RC, CRET1, #3[m
[31m-  |   sub RA, BASE, #16[m
[31m-  |  bgt ->fff_res			// Returned nresults+1?[m
[31m-  |1:  // Returned 0 or -1: retry fast path.[m
[31m-  |   ldr CARG1, L->top[m
[31m-  |    ldr CFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |   sub NARGS8:RC, CARG1, BASE[m
[31m-  |  bne ->vm_call_tail			// Returned -1?[m
[31m-  |    and CFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  ands TMP0, PC, #FRAME_TYPE[m
[31m-  |   and TMP1, PC, #~FRAME_TYPEP[m
[31m-  |  bne >3[m
[31m-  |  ldrb RAw, [PC, #-3][m
[31m-  |  lsl RA, RA, #3[m
[31m-  |  add TMP1, RA, #16[m
[31m-  |3:[m
[31m-  |  sub RB, BASE, TMP1[m
[31m-  |  b ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  mov CARG2, #LUA_MINSTACK[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  cmp CARG1, CARG1			// Set zero-flag to force retry.[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |   add CARG2, BASE, NARGS8:RC	// Calculate L->top.[m
[31m-  |  mov RA, lr[m
[31m-  |   stp BASE, CARG2, L->base[m
[31m-  |   str PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  mov CARG1, L[m
[31m-  |  bl extern lj_gc_step		// (lua_State *L)[m
[31m-  |  ldp BASE, CARG2, L->base[m
[31m-  |   ldr CFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |  mov lr, RA				// Help return address predictor.[m
[31m-  |  sub NARGS8:RC, CARG2, BASE		// Calculate nargs*8.[m
[31m-  |   and CFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |  NYI[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  ldrb TMP2w, GL->hookmask[m
[31m-  |  tbz TMP2w, #HOOK_ACTIVE_SHIFT, >1	// Hook already active?[m
[31m-  |5:  // Re-dispatch to static ins.[m
[31m-  |  ldr TMP0, [TMP1, #GG_G2DISP+GG_DISP2STATIC][m
[31m-  |  br TMP0[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  ldrb TMP2w, GL->hookmask[m
[31m-  |   ldr TMP3w, GL->hookcount[m
[31m-  |  tbnz TMP2w, #HOOK_ACTIVE_SHIFT, <5	// Hook already active?[m
[31m-  |  tst TMP2w, #LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beq <5[m
[31m-  |   sub TMP3w, TMP3w, #1[m
[31m-  |   str TMP3w, GL->hookcount[m
[31m-  |   cbz TMP3w, >1[m
[31m-  |  tbz TMP2w, #LUA_HOOKLINE, <5[m
[31m-  |1:[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, PC[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  bl extern lj_dispatch_ins		// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  ldr BASE, L->base[m
[31m-  |4:  // Re-dispatch to static ins.[m
[31m-  |  ldr INSw, [PC, #-4][m
[31m-  |  add TMP1, GL, INS, uxtb #3[m
[31m-  |   decode_RA RA, INS[m
[31m-  |  ldr TMP0, [TMP1, #GG_G2DISP+GG_DISP2STATIC][m
[31m-  |   decode_RD RC, INS[m
[31m-  |  br TMP0[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  ldr CARG1, [CARG4, #-40][m
[31m-  |   add PC, PC, #4[m
[31m-  |  str CARG1w, SAVE_MULTRES		// Restore MULTRES for *M ins.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |  NYI[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mov CARG2, PC[m
[31m-  |.if JIT[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  orr CARG2, PC, #1[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  add TMP1, BASE, NARGS8:RC[m
[31m-  |   str PC, SAVE_PC[m
[31m-  |   mov CARG1, L[m
[31m-  |   sub RA, RA, BASE[m
[31m-  |  stp BASE, TMP1, L->base[m
[31m-  |  bl extern lj_dispatch_call		// (lua_State *L, const BCIns *pc)[m
[31m-  |  // Returns ASMFunction.[m
[31m-  |  ldp BASE, TMP1, L->base[m
[31m-  |   str xzr, SAVE_PC			// Invalidate for subsequent line hook.[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |  add RA, BASE, RA[m
[31m-  |  sub NARGS8:RC, TMP1, BASE[m
[31m-  |   ldr INSw, [PC, #-4][m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  br CRET1[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |  NYI[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mov CARG1, L[m
[31m-  |   str BASE, L->base[m
[31m-  |  mov CARG2, PC[m
[31m-  |  bl extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  ldr BASE, L->base[m
[31m-  |  sub PC, PC, #4[m
[31m-  |  b ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_exit_handler:[m
[31m-  |  NYI[m
[31m-  |->vm_exit_interp:[m
[31m-  |  NYI[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |  // int lj_vm_modi(int dividend, int divisor);[m
[31m-  |->vm_modi:[m
[31m-  |    eor CARG4w, CARG1w, CARG2w[m
[31m-  |    cmp CARG4w, #0[m
[31m-  |  eor CARG3w, CARG1w, CARG1w, asr #31[m
[31m-  |   eor CARG4w, CARG2w, CARG2w, asr #31[m
[31m-  |  sub CARG3w, CARG3w, CARG1w, asr #31[m
[31m-  |   sub CARG4w, CARG4w, CARG2w, asr #31[m
[31m-  |  udiv CARG1w, CARG3w, CARG4w[m
[31m-  |  msub CARG1w, CARG1w, CARG4w, CARG3w[m
[31m-  |    ccmp CARG1w, #0, #4, mi[m
[31m-  |    sub CARG3w, CARG1w, CARG4w[m
[31m-  |    csel CARG1w, CARG1w, CARG3w, eq[m
[31m-  |  eor CARG3w, CARG1w, CARG2w[m
[31m-  |  cmp CARG3w, #0[m
[31m-  |  cneg CARG1w, CARG1w, mi[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions.[m
[31m-  |// Saveregs already performed. Callback slot number in [sp], g in r12.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  saveregs[m
[31m-  |  ldr CTSTATE, GL:x10->ctype_state[m
[31m-  |  mov GL, x10[m
[31m-  |    add x10, sp, # CFRAME_SPACE[m
[31m-  |  str w9, CTSTATE->cb.slot[m
[31m-  |  stp x0, x1, CTSTATE->cb.gpr[0][m
[31m-  |   stp d0, d1, CTSTATE->cb.fpr[0][m
[31m-  |  stp x2, x3, CTSTATE->cb.gpr[2][m
[31m-  |   stp d2, d3, CTSTATE->cb.fpr[2][m
[31m-  |  stp x4, x5, CTSTATE->cb.gpr[4][m
[31m-  |   stp d4, d5, CTSTATE->cb.fpr[4][m
[31m-  |  stp x6, x7, CTSTATE->cb.gpr[6][m
[31m-  |   stp d6, d7, CTSTATE->cb.fpr[6][m
[31m-  |    str x10, CTSTATE->cb.stack[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |   str CTSTATE, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  mov CARG2, sp[m
[31m-  |  bl extern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |  // Returns lua_State *.[m
[31m-  |  ldp BASE, RC, L:CRET1->base[m
[31m-  |   movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48[m
[31m-  |   movz TISNUMhi, #(LJ_TISNUM>>1)&0xffff, lsl #16[m
[31m-  |   movn TISNIL, #0[m
[31m-  |   mov L, CRET1[m
[31m-  |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-  |  sub RC, RC, BASE[m
[31m-  |   st_vmstate ST_INTERP[m
[31m-  |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  ldr CTSTATE, GL->ctype_state[m
[31m-  |   stp BASE, CARG4, L->base[m
[31m-  |  str L, CTSTATE->L[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |  mov CARG2, RA[m
[31m-  |  bl extern lj_ccallback_leave       // (CTState *cts, TValue *o)[m
[31m-  |  ldp x0, x1, CTSTATE->cb.gpr[0][m
[31m-  |   ldp d0, d1, CTSTATE->cb.fpr[0][m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, x19[m
[31m-  |  stp fp, lr, [sp, #-32]![m
[31m-  |  add fp, sp, #0[m
[31m-  |  str CCSTATE, [sp, #16][m
[31m-  |  mov CCSTATE, x0[m
[31m-  |  ldr TMP0w, CCSTATE:x0->spadj[m
[31m-  |   ldrb TMP1w, CCSTATE->nsp[m
[31m-  |    add TMP2, CCSTATE, #offsetof(CCallState, stack)[m
[31m-  |   subs TMP1, TMP1, #1[m
[31m-  |    ldr TMP3, CCSTATE->func[m
[31m-  |  sub sp, fp, TMP0[m
[31m-  |   bmi >2[m
[31m-  |1:  // Copy stack slots[m
[31m-  |  ldr TMP0, [TMP2, TMP1, lsl #3][m
[31m-  |  str TMP0, [sp, TMP1, lsl #3][m
[31m-  |  subs TMP1, TMP1, #1[m
[31m-  |  bpl <1[m
[31m-  |2:[m
[31m-  |  ldp x0, x1, CCSTATE->gpr[0][m
[31m-  |   ldp d0, d1, CCSTATE->fpr[0][m
[31m-  |  ldp x2, x3, CCSTATE->gpr[2][m
[31m-  |   ldp d2, d3, CCSTATE->fpr[2][m
[31m-  |  ldp x4, x5, CCSTATE->gpr[4][m
[31m-  |   ldp d4, d5, CCSTATE->fpr[4][m
[31m-  |  ldp x6, x7, CCSTATE->gpr[6][m
[31m-  |   ldp d6, d7, CCSTATE->fpr[6][m
[31m-  |  ldr x8, CCSTATE->retp[m
[31m-  |  blr TMP3[m
[31m-  |  mov sp, fp[m
[31m-  |  stp x0, x1, CCSTATE->gpr[0][m
[31m-  |   stp d0, d1, CCSTATE->fpr[0][m
[31m-  |   stp d2, d3, CCSTATE->fpr[2][m
[31m-  |  ldr CCSTATE, [sp, #16][m
[31m-  |  ldp fp, lr, [sp], #32[m
[31m-  |  ret[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1, RC = src2, JMP with RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |    ldrh RBw, [PC, #2][m
[31m-    |   ldr CARG2, [BASE, RC, lsl #3][m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |    sub RB, RB, #0x20000[m
[31m-    |  checkint CARG1, >3[m
[31m-    |   checkint CARG2, >4[m
[31m-    |  cmp CARG1w, CARG2w[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  csel PC, RB, PC, lt[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  csel PC, RB, PC, ge[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  csel PC, RB, PC, le[m
[31m-    } else {[m
[31m-      |  csel PC, RB, PC, gt[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // RA not int.[m
[31m-    |    ldr FARG1, [BASE, RA, lsl #3][m
[31m-    |  blo ->vmeta_comp[m
[31m-    |    ldr FARG2, [BASE, RC, lsl #3][m
[31m-    |   cmp TISNUMhi, CARG2, lsr #32[m
[31m-    |   bhi >5[m
[31m-    |   bne ->vmeta_comp[m
[31m-    |  // RA number, RC int.[m
[31m-    |  scvtf FARG2, CARG2w[m
[31m-    |  b >5[m
[31m-    |[m
[31m-    |4:  // RA int, RC not int[m
[31m-    |    ldr FARG2, [BASE, RC, lsl #3][m
[31m-    |   blo ->vmeta_comp[m
[31m-    |  // RA int, RC number.[m
[31m-    |  scvtf FARG1, CARG1w[m
[31m-    |[m
[31m-    |5:  // RA number, RC number[m
[31m-    |  fcmp FARG1, FARG2[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  csel PC, RB, PC, lo[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  csel PC, RB, PC, hs[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  csel PC, RB, PC, ls[m
[31m-    } else {[m
[31m-      |  csel PC, RB, PC, hi[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  // RA = src1, RC = src2, JMP with RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |   add RC, BASE, RC, lsl #3[m
[31m-    |    ldrh RBw, [PC, #2][m
[31m-    |   ldr CARG3, [RC][m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |    sub RB, RB, #0x20000[m
[31m-    |  asr ITYPE, CARG3, #47[m
[31m-    |  cmn ITYPE, #-LJ_TISNUM[m
[31m-    if (vk) {[m
[31m-      |  bls ->BC_ISEQN_Z[m
[31m-    } else {[m
[31m-      |  bls ->BC_ISNEN_Z[m
[31m-    }[m
[31m-    |  // RC is not a number.[m
[31m-    |   asr TMP0, CARG1, #47[m
[31m-    |.if FFI[m
[31m-    |  // Check if RC or RA is a cdata.[m
[31m-    |  cmn ITYPE, #-LJ_TCDATA[m
[31m-    |   ccmn TMP0, #-LJ_TCDATA, #4, ne[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  cmp CARG1, CARG3[m
[31m-    |  bne >2[m
[31m-    |  // Tag and value are equal.[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQV_Z:[m
[31m-      |  mov PC, RB			// Perform branch.[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if the tags are the same and it's a table or userdata.[m
[31m-    |  cmp ITYPE, TMP0[m
[31m-    |  ccmn ITYPE, #-LJ_TISTABUD, #2, eq[m
[31m-    if (vk) {[m
[31m-      |  bhi <1[m
[31m-    } else {[m
[31m-      |  bhi ->BC_ISEQV_Z		// Reuse code from opposite instruction.[m
[31m-    }[m
[31m-    |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-    |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-    |  and TAB:CARG2, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr TAB:TMP2, TAB:CARG2->metatable[m
[31m-    if (vk) {[m
[31m-      |  cbz TAB:TMP2, <1		// No metatable?[m
[31m-      |  ldrb TMP1w, TAB:TMP2->nomm[m
[31m-      |   mov CARG4, #0			// ne = 0[m
[31m-      |  tbnz TMP1w, #MM_eq, <1		// 'no __eq' flag set: done.[m
[31m-    } else {[m
[31m-      |  cbz TAB:TMP2, ->BC_ISEQV_Z	// No metatable?[m
[31m-      |  ldrb TMP1w, TAB:TMP2->nomm[m
[31m-      |   mov CARG4, #1			// ne = 1.[m
[31m-      |  tbnz TMP1w, #MM_eq, ->BC_ISEQV_Z	// 'no __eq' flag set: done.[m
[31m-    }[m
[31m-    |  b ->vmeta_equal[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  // RA = src, RC = str_const (~), JMP with RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |   mvn RC, RC[m
[31m-    |    ldrh RBw, [PC, #2][m
[31m-    |   ldr CARG2, [KBASE, RC, lsl #3][m
[31m-    |    add PC, PC, #4[m
[31m-    |   movn TMP0, #~LJ_TSTR[m
[31m-    |.if FFI[m
[31m-    |  asr ITYPE, CARG1, #47[m
[31m-    |.endif[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |   add CARG2, CARG2, TMP0, lsl #47[m
[31m-    |    sub RB, RB, #0x20000[m
[31m-    |.if FFI[m
[31m-    |  cmn ITYPE, #-LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  cmp CARG1, CARG2[m
[31m-    if (vk) {[m
[31m-      |  csel PC, RB, PC, eq[m
[31m-    } else {[m
[31m-      |  csel PC, RB, PC, ne[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  // RA = src, RC = num_const (~), JMP with RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |   add RC, KBASE, RC, lsl #3[m
[31m-    |    ldrh RBw, [PC, #2][m
[31m-    |   ldr CARG3, [RC][m
[31m-    |    add PC, PC, #4[m
[31m-    |    add RB, PC, RB, lsl #2[m
[31m-    |    sub RB, RB, #0x20000[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:[m
[31m-    }[m
[31m-    |  checkint CARG1, >4[m
[31m-    |   checkint CARG3, >6[m
[31m-    |  cmp CARG1w, CARG3w[m
[31m-    |1:[m
[31m-    if (vk) {[m
[31m-      |  csel PC, RB, PC, eq[m
[31m-      |2:[m
[31m-    } else {[m
[31m-      |2:[m
[31m-      |  csel PC, RB, PC, ne[m
[31m-    }[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // RA not int.[m
[31m-    |.if FFI[m
[31m-    |  blo >7[m
[31m-    |.else[m
[31m-    |  blo <2[m
[31m-    |.endif[m
[31m-    |    ldr FARG1, [BASE, RA, lsl #3][m
[31m-    |    ldr FARG2, [RC][m
[31m-    |   cmp TISNUMhi, CARG3, lsr #32[m
[31m-    |   bne >5[m
[31m-    |  // RA number, RC int.[m
[31m-    |  scvtf FARG2, CARG3w[m
[31m-    |5:[m
[31m-    |  // RA number, RC number.[m
[31m-    |  fcmp FARG1, FARG2[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |6:  // RA int, RC number[m
[31m-    |  ldr FARG2, [RC][m
[31m-    |  scvtf FARG1, CARG1w[m
[31m-    |  fcmp FARG1, FARG2[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |.if FFI[m
[31m-    |7:[m
[31m-    |  asr ITYPE, CARG1, #47[m
[31m-    |  cmn ITYPE, #-LJ_TCDATA[m
[31m-    |  bne <2[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  // RA = src, RC = primitive_type (~), JMP with RC = target[m
[31m-    |  ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |   ldrh RBw, [PC, #2][m
[31m-    |   add PC, PC, #4[m
[31m-    |  add RC, RC, #1[m
[31m-    |   add RB, PC, RB, lsl #2[m
[31m-    |.if FFI[m
[31m-    |  asr ITYPE, TMP0, #47[m
[31m-    |  cmn ITYPE, #-LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |  cmn RC, ITYPE[m
[31m-    |.else[m
[31m-    |  cmn RC, TMP0, asr #47[m
[31m-    |.endif[m
[31m-    |   sub RB, RB, #0x20000[m
[31m-    if (vk) {[m
[31m-      |  csel PC, RB, PC, eq[m
[31m-    } else {[m
[31m-      |  csel PC, RB, PC, ne[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  // RA = dst or unused, RC = src, JMP with RC = target[m
[31m-    |   ldrh RBw, [PC, #2][m
[31m-    |  ldr TMP0, [BASE, RC, lsl #3][m
[31m-    |   add PC, PC, #4[m
[31m-    |  mov_false TMP1[m
[31m-    |   add RB, PC, RB, lsl #2[m
[31m-    |  cmp TMP0, TMP1[m
[31m-    |   sub RB, RB, #0x20000[m
[31m-    if (op == BC_ISTC || op == BC_IST) {[m
[31m-      if (op == BC_ISTC) {[m
[31m-	|  csel RA, RA, RC, lo[m
[31m-      }[m
[31m-      |  csel PC, RB, PC, lo[m
[31m-    } else {[m
[31m-      if (op == BC_ISFC) {[m
[31m-	|  csel RA, RA, RC, hs[m
[31m-      }[m
[31m-      |  csel PC, RB, PC, hs[m
[31m-    }[m
[31m-    if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-      |  str TMP0, [BASE, RA, lsl #3][m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  // RA = src, RC = -type[m
[31m-    |  ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |  cmn RC, TMP0, asr #47[m
[31m-    |  bne ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  // RA = src, RC = -(TISNUM-1)[m
[31m-    |  ldr TMP0, [BASE, RA][m
[31m-    |  checknum TMP0, ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  // RA = dst, RC = src[m
[31m-    |  ldr TMP0, [BASE, RC, lsl #3][m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  // RA = dst, RC = src[m
[31m-    |  ldr TMP0, [BASE, RC, lsl #3][m
[31m-    |   mov_false TMP1[m
[31m-    |   mov_true TMP2[m
[31m-    |  cmp TMP0, TMP1[m
[31m-    |  csel TMP0, TMP1, TMP2, lo[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  // RA = dst, RC = src[m
[31m-    |  ldr TMP0, [BASE, RC, lsl #3][m
[31m-    |  asr ITYPE, TMP0, #47[m
[31m-    |  cmn ITYPE, #-LJ_TISNUM[m
[31m-    |  bhi ->vmeta_unm[m
[31m-    |  eor TMP0, TMP0, #U64x(80000000,00000000)[m
[31m-    |  bne >5[m
[31m-    |  negs TMP0w, TMP0w[m
[31m-    |   movz CARG3, #0x41e0, lsl #48	// 2^31.[m
[31m-    |   add TMP0, TMP0, TISNUM[m
[31m-    |  csel TMP0, TMP0, CARG3, vc[m
[31m-    |5:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  // RA = dst, RC = src[m
[31m-    |  ldr CARG1, [BASE, RC, lsl #3][m
[31m-    |  asr ITYPE, CARG1, #47[m
[31m-    |  cmn ITYPE, #-LJ_TSTR[m
[31m-    |   and CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  bne >2[m
[31m-    |  ldr CARG1w, STR:CARG1->len[m
[31m-    |1:[m
[31m-    |  add CARG1, CARG1, TISNUM[m
[31m-    |  str CARG1, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:[m
[31m-    |  cmn ITYPE, #-LJ_TTAB[m
[31m-    |  bne ->vmeta_len[m
[31m-#if LJ_52[m
[31m-    |  ldr TAB:CARG2, TAB:CARG1->metatable[m
[31m-    |  cbnz TAB:CARG2, >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  bl extern lj_tab_len		// (GCtab *t)[m
[31m-    |  // Returns uint32_t (but less than 2^31).[m
[31m-    |  b <1[m
[31m-    |[m
[31m-#if LJ_52[m
[31m-    |9:[m
[31m-    |  ldrb TMP1w, TAB:CARG2->nomm[m
[31m-    |  tbnz TMP1w, #MM_len, <3		// 'no __len' flag set: done.[m
[31m-    |  b ->vmeta_len[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithcheck_int, target[m
[31m-    |  checkint CARG1, target[m
[31m-    |  checkint CARG2, target[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithcheck_num, target[m
[31m-    |  checknum CARG1, target[m
[31m-    |  checknum CARG2, target[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithcheck_nzdiv, target[m
[31m-    |  cbz CARG2w, target[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithhead[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||if (vk == 1) {[m
[31m-    |   and RC, RC, #255[m
[31m-    |    decode_RB RB, INS[m
[31m-    ||} else {[m
[31m-    |   decode_RB RB, INS[m
[31m-    |    and RC, RC, #255[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithload, reg1, reg2[m
[31m-    |  // RA = dst, RB = src1, RC = src2 | num_const[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   ldr reg1, [BASE, RB, lsl #3][m
[31m-    |    ldr reg2, [KBASE, RC, lsl #3][m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   ldr reg1, [KBASE, RC, lsl #3][m
[31m-    |    ldr reg2, [BASE, RB, lsl #3][m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   ldr reg1, [BASE, RB, lsl #3][m
[31m-    |    ldr reg2, [BASE, RC, lsl #3][m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfallback, ins[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   ins ->vmeta_arith_vn[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   ins ->vmeta_arith_nv[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   ins ->vmeta_arith_vv[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithmod, res, reg1, reg2[m
[31m-    |  fdiv d2, reg1, reg2[m
[31m-    |  frintm d2, d2[m
[31m-    |  fmsub res, d2, reg2, reg1[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins, fpins[m
[31m-    |  ins_arithhead[m
[31m-    |  ins_arithload CARG1, CARG2[m
[31m-    |  ins_arithcheck_int >5[m
[31m-    |.if "intins" == "smull"[m
[31m-    |  smull CARG1, CARG1w, CARG2w[m
[31m-    |  cmp CARG1, CARG1, sxtw[m
[31m-    |   mov CARG1w, CARG1w[m
[31m-    |  ins_arithfallback bne[m
[31m-    |.elif "intins" == "ins_arithmodi"[m
[31m-    |  ins_arithfallback ins_arithcheck_nzdiv[m
[31m-    |  bl ->vm_modi[m
[31m-    |.else[m
[31m-    |  intins CARG1w, CARG1w, CARG2w[m
[31m-    |  ins_arithfallback bvs[m
[31m-    |.endif[m
[31m-    |  add CARG1, CARG1, TISNUM[m
[31m-    |  str CARG1, [BASE, RA, lsl #3][m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // FP variant.[m
[31m-    |  ins_arithload FARG1, FARG2[m
[31m-    |  ins_arithfallback ins_arithcheck_num[m
[31m-    |  fpins FARG1, FARG1, FARG2[m
[31m-    |  str FARG1, [BASE, RA, lsl #3][m
[31m-    |  b <4[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfp, fpins[m
[31m-    |  ins_arithhead[m
[31m-    |  ins_arithload CARG1, CARG2[m
[31m-    |  ins_arithload FARG1, FARG2[m
[31m-    |  ins_arithfallback ins_arithcheck_num[m
[31m-    |.if "fpins" == "fpow"[m
[31m-    |  bl extern pow[m
[31m-    |.else[m
[31m-    |  fpins FARG1, FARG1, FARG2[m
[31m-    |.endif[m
[31m-    |  str FARG1, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arithdn adds, fadd[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arithdn subs, fsub[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arithdn smull, fmul[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arithfp fdiv[m
[31m-    break;[m
[31m-  case BC_MODVN: case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithdn ins_arithmodi, ins_arithmod[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  // NYI: (partial) integer arithmetic.[m
[31m-    |  ins_arithfp fpow[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = src_start, RC = src_end[m
[31m-    |   str BASE, L->base[m
[31m-    |  sub CARG3, RC, RB[m
[31m-    |  add CARG2, BASE, RC, lsl #3[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  // RA = dst, CARG2 = top-1, CARG3 = left[m
[31m-    |  mov CARG1, L[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  bl extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-    |  ldrb RBw, [PC, #-1][m
[31m-    |   ldr BASE, L->base[m
[31m-    |   cbnz CRET1, ->vmeta_binop[m
[31m-    |  ldr TMP0, [BASE, RB, lsl #3][m
[31m-    |  str TMP0, [BASE, RA, lsl #3]	// Copy result to RA.[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  // RA = dst, RC = str_const (~)[m
[31m-    |  mvn RC, RC[m
[31m-    |  ldr TMP0, [KBASE, RC, lsl #3][m
[31m-    |   movn TMP1, #~LJ_TSTR[m
[31m-    |  add TMP0, TMP0, TMP1, lsl #47[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  // RA = dst, RC = cdata_const (~)[m
[31m-    |  mvn RC, RC[m
[31m-    |  ldr TMP0, [KBASE, RC, lsl #3][m
[31m-    |   movn TMP1, #~LJ_TCDATA[m
[31m-    |  add TMP0, TMP0, TMP1, lsl #47[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  // RA = dst, RC = int16_literal[m
[31m-    |  sxth RCw, RCw[m
[31m-    |  add TMP0, RC, TISNUM[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  // RA = dst, RC = num_const[m
[31m-    |  ldr TMP0, [KBASE, RC, lsl #3][m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  // RA = dst, RC = primitive_type (~)[m
[31m-    |  mvn TMP0, RC, lsl #47[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  // RA = base, RC = end[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |   add RC, BASE, RC, lsl #3[m
[31m-    |  str TISNIL, [RA], #8[m
[31m-    |1:[m
[31m-    |   cmp RA, RC[m
[31m-    |  str TISNIL, [RA], #8[m
[31m-    |   blt <1[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  // RA = dst, RC = uvnum[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RC, RC, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RC, lsl #3][m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |  ldr TMP0, [CARG2][m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-    |  // RA = uvnum, RC = src[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG1, [LFUNC:CARG2, RA, lsl #3][m
[31m-    |   ldr CARG3, [BASE, RC, lsl #3][m
[31m-    |    ldr CARG2, UPVAL:CARG1->v[m
[31m-    |  ldrb TMP2w, UPVAL:CARG1->marked[m
[31m-    |  ldrb TMP0w, UPVAL:CARG1->closed[m
[31m-    |    asr ITYPE, CARG3, #47[m
[31m-    |   str CARG3, [CARG2][m
[31m-    |    add ITYPE, ITYPE, #-LJ_TISGCV[m
[31m-    |  tst TMP2w, #LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  ccmp TMP0w, #0, #4, ne		// && uv->closed[m
[31m-    |    ccmn ITYPE, #-(LJ_TNUMX - LJ_TISGCV), #0, ne	// && tvisgcv(v)[m
[31m-    |  bhi >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if new value is white.[m
[31m-    |  and GCOBJ:CARG3, CARG3, #LJ_GCVMASK[m
[31m-    |  ldrb TMP1w, GCOBJ:CARG3->gch.marked[m
[31m-    |  tst TMP1w, #LJ_GC_WHITES		// iswhite(str)[m
[31m-    |  beq <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  mov CARG1, GL[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETS:[m
[31m-    |  // RA = uvnum, RC = str_const (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |    mvn RC, RC[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG1, [LFUNC:CARG2, RA, lsl #3][m
[31m-    |   ldr STR:CARG3, [KBASE, RC, lsl #3][m
[31m-    |   movn TMP0, #~LJ_TSTR[m
[31m-    |    ldr CARG2, UPVAL:CARG1->v[m
[31m-    |  ldrb TMP2w, UPVAL:CARG1->marked[m
[31m-    |   add TMP0, STR:CARG3, TMP0, lsl #47[m
[31m-    |    ldrb TMP1w, STR:CARG3->marked[m
[31m-    |   str TMP0, [CARG2][m
[31m-    |  tbnz TMP2w, #2, >2		// isblack(uv)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  ldrb TMP0w, UPVAL:CARG1->closed[m
[31m-    |    tst TMP1w, #LJ_GC_WHITES	// iswhite(str)[m
[31m-    |  ccmp TMP0w, #0, #0, ne[m
[31m-    |  beq <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  mov CARG1, GL[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  // RA = uvnum, RC = num_const[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA, lsl #3][m
[31m-    |   ldr TMP0, [KBASE, RC, lsl #3][m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |   str TMP0, [CARG2][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  // RA = uvnum, RC = primitive_type (~)[m
[31m-    |  ldr LFUNC:CARG2, [BASE, FRAME_FUNC][m
[31m-    |   add RA, RA, #offsetof(GCfuncL, uvptr)/8[m
[31m-    |  and LFUNC:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr UPVAL:CARG2, [LFUNC:CARG2, RA, lsl #3][m
[31m-    |   mvn TMP0, RC, lsl #47[m
[31m-    |  ldr CARG2, UPVAL:CARG2->v[m
[31m-    |   str TMP0, [CARG2][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_UCLO:[m
[31m-    |  // RA = level, RC = target[m
[31m-    |  ldr CARG3, L->openupval[m
[31m-    |   add RC, PC, RC, lsl #2[m
[31m-    |    str BASE, L->base[m
[31m-    |   sub PC, RC, #0x20000[m
[31m-    |  cbz CARG3, >1[m
[31m-    |  mov CARG1, L[m
[31m-    |  add CARG2, BASE, RA, lsl #3[m
[31m-    |  bl extern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |  ldr BASE, L->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  // RA = dst, RC = proto_const (~) (holding function prototype)[m
[31m-    |  mvn RC, RC[m
[31m-    |   str BASE, L->base[m
[31m-    |  ldr LFUNC:CARG3, [BASE, FRAME_FUNC][m
[31m-    |    str PC, SAVE_PC[m
[31m-    |   ldr CARG2, [KBASE, RC, lsl #3][m
[31m-    |    mov CARG1, L[m
[31m-    |  and LFUNC:CARG3, CARG3, #LJ_GCVMASK[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  bl extern lj_func_newL_gc[m
[31m-    |  // Returns GCfuncL *.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |   movn TMP0, #~LJ_TFUNC[m
[31m-    |   add CRET1, CRET1, TMP0, lsl #47[m
[31m-    |  str CRET1, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-  case BC_TDUP:[m
[31m-    |  // RA = dst, RC = (hbits|asize) | tab_const (~)[m
[31m-    |  ldp CARG3, CARG4, GL->gc.total	// Assumes threshold follows total.[m
[31m-    |   str BASE, L->base[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |   mov CARG1, L[m
[31m-    |  cmp CARG3, CARG4[m
[31m-    |  bhs >5[m
[31m-    |1:[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |  and CARG2, RC, #0x7ff[m
[31m-      |   lsr CARG3, RC, #11[m
[31m-      |  cmp CARG2, #0x7ff[m
[31m-      |  mov TMP0, #0x801[m
[31m-      |  csel CARG2, CARG2, TMP0, ne[m
[31m-      |  bl extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-      |  // Returns GCtab *.[m
[31m-    } else {[m
[31m-      |  mvn RC, RC[m
[31m-      |  ldr CARG2, [KBASE, RC, lsl #3][m
[31m-      |  bl extern lj_tab_dup  // (lua_State *L, Table *kt)[m
[31m-      |  // Returns GCtab *.[m
[31m-    }[m
[31m-    |  ldr BASE, L->base[m
[31m-    |   movk CRET1, #(LJ_TTAB>>1)&0xffff, lsl #48[m
[31m-    |  str CRET1, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  bl extern lj_gc_step_fixtop  // (lua_State *L)[m
[31m-    |  mov CARG1, L[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  // RA = dst, RC = str_const (~)[m
[31m-  case BC_GSET:[m
[31m-    |  // RA = dst, RC = str_const (~)[m
[31m-    |  ldr LFUNC:CARG1, [BASE, FRAME_FUNC][m
[31m-    |   mvn RC, RC[m
[31m-    |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr TAB:CARG2, LFUNC:CARG1->env[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #3][m
[31m-    if (op == BC_GGET) {[m
[31m-      |  b ->BC_TGETS_Z[m
[31m-    } else {[m
[31m-      |  b ->BC_TSETS_Z[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = key[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   ldr TMP1, [BASE, RC, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tgetv[m
[31m-    |  checkint TMP1, >9		// Integer key?[m
[31m-    |  ldr CARG3, TAB:CARG2->array[m
[31m-    |   ldr CARG1w, TAB:CARG2->asize[m
[31m-    |  add CARG3, CARG3, TMP1, uxtw #3[m
[31m-    |   cmp TMP1w, CARG1w		// In array part?[m
[31m-    |   bhs ->vmeta_tgetv[m
[31m-    |  ldr TMP0, [CARG3][m
[31m-    |  cmp TMP0, TISNIL[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <1		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_index, <1	// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    |[m
[31m-    |9:[m
[31m-    |  asr ITYPE, TMP1, #47[m
[31m-    |  cmn ITYPE, #-LJ_TSTR		// String key?[m
[31m-    |  bne ->vmeta_tgetv[m
[31m-    |   and STR:RC, TMP1, #LJ_GCVMASK[m
[31m-    |  b ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = str_const (~)[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   mvn RC, RC[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tgets1[m
[31m-    |->BC_TGETS_Z:[m
[31m-    |  // TAB:CARG2 = GCtab *, STR:RC = GCstr *, RA = dst[m
[31m-    |  ldr TMP1w, TAB:CARG2->hmask[m
[31m-    |   ldr TMP2w, STR:RC->hash[m
[31m-    |    ldr NODE:CARG3, TAB:CARG2->node[m
[31m-    |  and TMP1w, TMP1w, TMP2w		// idx = str->hash & tab->hmask[m
[31m-    |  add TMP1, TMP1, TMP1, lsl #1[m
[31m-    |  movn CARG4, #~LJ_TSTR[m
[31m-    |    add NODE:CARG3, NODE:CARG3, TMP1, lsl #3  // node = tab->node + idx*3*8[m
[31m-    |  add CARG4, STR:RC, CARG4, lsl #47	// Tagged key to look for.[m
[31m-    |1:[m
[31m-    |  ldp TMP0, CARG1, NODE:CARG3->val[m
[31m-    |   ldr NODE:CARG3, NODE:CARG3->next[m
[31m-    |  cmp CARG1, CARG4[m
[31m-    |  bne >4[m
[31m-    |  cmp TMP0, TISNIL[m
[31m-    |  beq >5[m
[31m-    |3:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  cbnz NODE:CARG3, <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |   mov TMP0, TISNIL[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <3		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_index, <3	// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgets[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = index[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tgetb[m
[31m-    |  ldr CARG3, TAB:CARG2->array[m
[31m-    |   ldr CARG1w, TAB:CARG2->asize[m
[31m-    |  add CARG3, CARG3, RC, lsl #3[m
[31m-    |   cmp RCw, CARG1w			// In array part?[m
[31m-    |   bhs ->vmeta_tgetb[m
[31m-    |  ldr TMP0, [CARG3][m
[31m-    |  cmp TMP0, TISNIL[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <1		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_index, <1	// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetb[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = key[m
[31m-    |  ldr CARG1, [BASE, RB, lsl #3][m
[31m-    |   ldr TMP1, [BASE, RC, lsl #3][m
[31m-    |  and TAB:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr CARG3, TAB:CARG1->array[m
[31m-    |   ldr TMP2w, TAB:CARG1->asize[m
[31m-    |  add CARG3, CARG3, TMP1w, uxtw #3[m
[31m-    |   cmp TMP1w, TMP2w		// In array part?[m
[31m-    |   bhs ->vmeta_tgetr[m
[31m-    |  ldr TMP0, [CARG3][m
[31m-    |->BC_TGETR_Z:[m
[31m-    |  str TMP0, [BASE, RA, lsl #3][m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src, RB = table, RC = key[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   ldr TMP1, [BASE, RC, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tsetv[m
[31m-    |  checkint TMP1, >9		// Integer key?[m
[31m-    |  ldr CARG3, TAB:CARG2->array[m
[31m-    |   ldr CARG1w, TAB:CARG2->asize[m
[31m-    |  add CARG3, CARG3, TMP1, uxtw #3[m
[31m-    |   cmp TMP1w, CARG1w		// In array part?[m
[31m-    |   bhs ->vmeta_tsetv[m
[31m-    |  ldr TMP1, [CARG3][m
[31m-    |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |  cmp TMP1, TISNIL			// Previous value is nil?[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |   str TMP0, [CARG3][m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |2:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <1		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_newindex, <1	// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP1[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |9:[m
[31m-    |  asr ITYPE, TMP1, #47[m
[31m-    |  cmn ITYPE, #-LJ_TSTR		// String key?[m
[31m-    |  bne ->vmeta_tsetv[m
[31m-    |   and STR:RC, TMP1, #LJ_GCVMASK[m
[31m-    |  b ->BC_TSETS_Z[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = dst, RB = table, RC = str_const (~)[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   mvn RC, RC[m
[31m-    |   ldr STR:RC, [KBASE, RC, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tsets1[m
[31m-    |->BC_TSETS_Z:[m
[31m-    |  // TAB:CARG2 = GCtab *, STR:RC = GCstr *, RA = src[m
[31m-    |  ldr TMP1w, TAB:CARG2->hmask[m
[31m-    |   ldr TMP2w, STR:RC->hash[m
[31m-    |    ldr NODE:CARG3, TAB:CARG2->node[m
[31m-    |  and TMP1w, TMP1w, TMP2w		// idx = str->hash & tab->hmask[m
[31m-    |  add TMP1, TMP1, TMP1, lsl #1[m
[31m-    |  movn CARG4, #~LJ_TSTR[m
[31m-    |    add NODE:CARG3, NODE:CARG3, TMP1, lsl #3  // node = tab->node + idx*3*8[m
[31m-    |  add CARG4, STR:RC, CARG4, lsl #47	// Tagged key to look for.[m
[31m-    |   strb wzr, TAB:CARG2->nomm	// Clear metamethod cache.[m
[31m-    |1:[m
[31m-    |  ldp TMP1, CARG1, NODE:CARG3->val[m
[31m-    |   ldr NODE:TMP3, NODE:CARG3->next[m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |  cmp CARG1, CARG4[m
[31m-    |  bne >5[m
[31m-    |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |  cmp TMP1, TISNIL			// Previous value is nil?[m
[31m-    |  beq >4[m
[31m-    |2:[m
[31m-    |   str TMP0, NODE:CARG3->val[m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <2		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_newindex, <2	// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsets[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  mov NODE:CARG3, NODE:TMP3[m
[31m-    |  cbnz NODE:TMP3, <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, >6		// No metatable: continue.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  // 'no __newindex' flag NOT set: check.[m
[31m-    |  tbz TMP1w, #MM_newindex, ->vmeta_tsets[m
[31m-    |6:[m
[31m-    |  movn TMP1, #~LJ_TSTR[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  add TMP0, STR:RC, TMP1, lsl #47[m
[31m-    |   str BASE, L->base[m
[31m-    |   mov CARG1, L[m
[31m-    |  str TMP0, TMPD[m
[31m-    |   add CARG3, sp, TMPDofs[m
[31m-    |  bl extern lj_tab_newkey		// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Returns TValue *.[m
[31m-    |  ldr BASE, L->base[m
[31m-    |  ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |  str TMP0, [CRET1][m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP1[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src, RB = table, RC = index[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |  checktab CARG2, ->vmeta_tsetb[m
[31m-    |  ldr CARG3, TAB:CARG2->array[m
[31m-    |   ldr CARG1w, TAB:CARG2->asize[m
[31m-    |  add CARG3, CARG3, RC, lsl #3[m
[31m-    |   cmp RCw, CARG1w			// In array part?[m
[31m-    |   bhs ->vmeta_tsetb[m
[31m-    |  ldr TMP1, [CARG3][m
[31m-    |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |  cmp TMP1, TISNIL			// Previous value is nil?[m
[31m-    |  beq >5[m
[31m-    |1:[m
[31m-    |   str TMP0, [CARG3][m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |2:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  ldr TAB:CARG1, TAB:CARG2->metatable[m
[31m-    |  cbz TAB:CARG1, <1		// No metatable: done.[m
[31m-    |  ldrb TMP1w, TAB:CARG1->nomm[m
[31m-    |  tbnz TMP1w, #MM_newindex, <1	// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsetb[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP1[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = src, RB = table, RC = key[m
[31m-    |  ldr CARG2, [BASE, RB, lsl #3][m
[31m-    |   ldr TMP1, [BASE, RC, lsl #3][m
[31m-    |  and TAB:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr CARG1, TAB:CARG2->array[m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |   ldr CARG4w, TAB:CARG2->asize[m
[31m-    |  add CARG1, CARG1, TMP1, uxtw #3[m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |2:[m
[31m-    |   cmp TMP1w, CARG4w		// In array part?[m
[31m-    |   bhs ->vmeta_tsetr[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |   ldr TMP0, [BASE, RA, lsl #3][m
[31m-    |   str TMP0, [CARG1][m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP0[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  // RA = base (table at base-1), RC = num_const (start index)[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |1:[m
[31m-    |   ldr RBw, SAVE_MULTRES[m
[31m-    |  ldr TAB:CARG2, [RA, #-8]		// Guaranteed to be a table.[m
[31m-    |   ldr TMP1, [KBASE, RC, lsl #3]	// Integer constant is in lo-word.[m
[31m-    |    sub RB, RB, #8[m
[31m-    |    cbz RB, >4			// Nothing to copy?[m
[31m-    |  and TAB:CARG2, CARG2, #LJ_GCVMASK[m
[31m-    |  ldr CARG1w, TAB:CARG2->asize[m
[31m-    |   add CARG3w, TMP1w, RBw, lsr #3[m
[31m-    |   ldr CARG4, TAB:CARG2->array[m
[31m-    |  cmp CARG3, CARG1[m
[31m-    |    add RB, RA, RB[m
[31m-    |  bhi >5[m
[31m-    |   add TMP1, CARG4, TMP1w, uxtw #3[m
[31m-    |    ldrb TMP2w, TAB:CARG2->marked[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |   ldr TMP0, [RA], #8[m
[31m-    |   str TMP0, [TMP1], #8[m
[31m-    |  cmp RA, RB[m
[31m-    |  blo <3[m
[31m-    |    tbnz TMP2w, #2, >7		// isblack(table)[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |   str BASE, L->base[m
[31m-    |  mov CARG1, L[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  bl extern lj_tab_reasize		// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  // Must not reallocate the stack.[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP2w, TMP1[m
[31m-    |  b <4[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALLM:[m
[31m-    |  // RA = base, (RB = nresults+1,) RC = extra_nargs[m
[31m-    |  ldr TMP0w, SAVE_MULTRES[m
[31m-    |  decode_RC8RD NARGS8:RC, RC[m
[31m-    |  add NARGS8:RC, NARGS8:RC, TMP0[m
[31m-    |  b ->BC_CALL_Z[m
[31m-    break;[m
[31m-  case BC_CALL:[m
[31m-    |  decode_RC8RD NARGS8:RC, RC[m
[31m-    |  // RA = base, (RB = nresults+1,) RC = (nargs+1)*8[m
[31m-    |->BC_CALL_Z:[m
[31m-    |  mov RB, BASE			// Save old BASE for vmeta_call.[m
[31m-    |  add BASE, BASE, RA, lsl #3[m
[31m-    |  ldr CARG3, [BASE][m
[31m-    |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-    |   add BASE, BASE, #16[m
[31m-    |  checkfunc CARG3, ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  // RA = base, (RB = 0,) RC = extra_nargs[m
[31m-    |  ldr TMP0w, SAVE_MULTRES[m
[31m-    |  add NARGS8:RC, TMP0, RC, lsl #3[m
[31m-    |  b ->BC_CALLT1_Z[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  lsl NARGS8:RC, RC, #3[m
[31m-    |  // RA = base, (RB = 0,) RC = (nargs+1)*8[m
[31m-    |->BC_CALLT1_Z:[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldr TMP1, [RA][m
[31m-    |   sub NARGS8:RC, NARGS8:RC, #8[m
[31m-    |   add RA, RA, #16[m
[31m-    |  checktp CARG3, TMP1, LJ_TFUNC, ->vmeta_callt[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |->BC_CALLT2_Z:[m
[31m-    |   mov RB, #0[m
[31m-    |   ldrb TMP2w, LFUNC:CARG3->ffid[m
[31m-    |  tst PC, #FRAME_TYPE[m
[31m-    |  bne >7[m
[31m-    |1:[m
[31m-    |  str TMP1, [BASE, FRAME_FUNC]	// Copy function down, but keep PC.[m
[31m-    |  cbz NARGS8:RC, >3[m
[31m-    |2:[m
[31m-    |  ldr TMP0, [RA, RB][m
[31m-    |   add TMP1, RB, #8[m
[31m-    |   cmp TMP1, NARGS8:RC[m
[31m-    |  str TMP0, [BASE, RB][m
[31m-    |    mov RB, TMP1[m
[31m-    |   bne <2[m
[31m-    |3:[m
[31m-    |  cmp TMP2, #1			// (> FF_C) Calling a fast function?[m
[31m-    |  bhi >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function with a Lua frame below.[m
[31m-    |  ldrb RAw, [PC, #-3][m
[31m-    |  sub CARG1, BASE, RA, lsl #3[m
[31m-    |  ldr LFUNC:CARG1, [CARG1, #-32][m
[31m-    |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr CARG1, LFUNC:CARG1->pc[m
[31m-    |  ldr KBASE, [CARG1, #PC2PROTO(k)][m
[31m-    |  b <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  eor PC, PC, #FRAME_VARG[m
[31m-    |  tst PC, #FRAME_TYPEP		// Vararg frame below?[m
[31m-    |  csel TMP2, RB, TMP2, ne		// Clear ffid if no Lua function below.[m
[31m-    |  bne <1[m
[31m-    |  sub BASE, BASE, PC[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |  tst PC, #FRAME_TYPE[m
[31m-    |  csel TMP2, RB, TMP2, ne		// Clear ffid if no Lua function below.[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  // RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldr CARG3, [RA, #-24][m
[31m-    |    mov RB, BASE			// Save old BASE for vmeta_call.[m
[31m-    |   ldp CARG1, CARG2, [RA, #-16][m
[31m-    |    add BASE, RA, #16[m
[31m-    |    mov NARGS8:RC, #16		// Iterators get 2 arguments.[m
[31m-    |  str CARG3, [RA]			// Copy callable.[m
[31m-    |   stp CARG1, CARG2, [RA, #16]	// Copy state and control var.[m
[31m-    |  checkfunc CARG3, ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  // RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldr TAB:RB, [RA, #-16][m
[31m-    |    ldrh TMP3w, [PC, #2][m
[31m-    |  ldr CARG1w, [RA, #-8]		// Get index from control var.[m
[31m-    |    add PC, PC, #4[m
[31m-    |    add TMP3, PC, TMP3, lsl #2[m
[31m-    |  and TAB:RB, RB, #LJ_GCVMASK[m
[31m-    |    sub TMP3, TMP3, #0x20000[m
[31m-    |  ldr TMP1w, TAB:RB->asize[m
[31m-    |   ldr CARG2, TAB:RB->array[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  subs RC, CARG1, TMP1[m
[31m-    |   add CARG3, CARG2, CARG1, lsl #3[m
[31m-    |  bhs >5				// Index points after array part?[m
[31m-    |   ldr TMP0, [CARG3][m
[31m-    |   cmp TMP0, TISNIL[m
[31m-    |   cinc CARG1, CARG1, eq		// Skip holes in array part.[m
[31m-    |   beq <1[m
[31m-    |   add CARG1, CARG1, TISNUM[m
[31m-    |   stp CARG1, TMP0, [RA][m
[31m-    |    add CARG1, CARG1, #1[m
[31m-    |3:[m
[31m-    |    str CARG1w, [RA, #-8]		// Update control var.[m
[31m-    |  mov PC, TMP3[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  ldr TMP2w, TAB:RB->hmask[m
[31m-    |   ldr NODE:RB, TAB:RB->node[m
[31m-    |6:[m
[31m-    |   add CARG1, RC, RC, lsl #1[m
[31m-    |  cmp RC, TMP2			// End of iteration? Branch to ITERN+1.[m
[31m-    |   add NODE:CARG3, NODE:RB, CARG1, lsl #3  // node = tab->node + idx*3*8[m
[31m-    |  bhi <4[m
[31m-    |  ldp TMP0, CARG1, NODE:CARG3->val[m
[31m-    |  cmp TMP0, TISNIL[m
[31m-    |   add RC, RC, #1[m
[31m-    |  beq <6				// Skip holes in hash part.[m
[31m-    |  stp CARG1, TMP0, [RA][m
[31m-    |  add CARG1, RC, TMP1[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  // RA = base, RC = target (points to ITERN)[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldr CFUNC:CARG1, [RA, #-24][m
[31m-    |     add RC, PC, RC, lsl #2[m
[31m-    |   ldp TAB:CARG3, CARG4, [RA, #-16][m
[31m-    |     sub RC, RC, #0x20000[m
[31m-    |  checkfunc CFUNC:CARG1, >5[m
[31m-    |   asr TMP0, TAB:CARG3, #47[m
[31m-    |  ldrb TMP1w, CFUNC:CARG1->ffid[m
[31m-    |   cmn TMP0, #-LJ_TTAB[m
[31m-    |   ccmp CARG4, TISNIL, #0, eq[m
[31m-    |  ccmp TMP1w, #FF_next_N, #0, eq[m
[31m-    |  bne >5[m
[31m-    |  mov TMP0w, #0xfffe7fff[m
[31m-    |  lsl TMP0, TMP0, #32[m
[31m-    |  str TMP0, [RA, #-8]		// Initialize control var.[m
[31m-    |1:[m
[31m-    |     mov PC, RC[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  mov TMP0, #BC_JMP[m
[31m-    |   mov TMP1, #BC_ITERC[m
[31m-    |  strb TMP0w, [PC, #-4][m
[31m-    |   strb TMP1w, [RC][m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  decode_RB RB, INS[m
[31m-    |   and RC, RC, #255[m
[31m-    |  // RA = base, RB = (nresults+1), RC = numparams[m
[31m-    |  ldr TMP1, [BASE, FRAME_PC][m
[31m-    |  add RC, BASE, RC, lsl #3[m
[31m-    |   add RA, BASE, RA, lsl #3[m
[31m-    |  add RC, RC, #FRAME_VARG[m
[31m-    |   add TMP2, RA, RB, lsl #3[m
[31m-    |  sub RC, RC, TMP1			// RC = vbase[m
[31m-    |  // Note: RC may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |   sub TMP3, BASE, #16		// TMP3 = vtop[m
[31m-    |  cbz RB, >5[m
[31m-    |   sub TMP2, TMP2, #16[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  cmp RC, TMP3[m
[31m-    |  ldr TMP0, [RC], #8[m
[31m-    |  csel TMP0, TMP0, TISNIL, lo[m
[31m-    |   cmp RA, TMP2[m
[31m-    |  str TMP0, [RA], #8[m
[31m-    |   blo <1[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  ldr TMP0, L->maxstack[m
[31m-    |   subs TMP2, TMP3, RC[m
[31m-    |   csel RB, xzr, TMP2, le		// MULTRES = (max(vtop-vbase,0)+1)*8[m
[31m-    |   add RB, RB, #8[m
[31m-    |  add TMP1, RA, TMP2[m
[31m-    |   str RBw, SAVE_MULTRES[m
[31m-    |   ble <2				// Nothing to copy.[m
[31m-    |  cmp TMP1, TMP0[m
[31m-    |  bhi >7[m
[31m-    |6:[m
[31m-    |  ldr TMP0, [RC], #8[m
[31m-    |  str TMP0, [RA], #8[m
[31m-    |  cmp RC, TMP3[m
[31m-    |  blo <6[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  lsr CARG2, TMP2, #3[m
[31m-    |   stp BASE, RA, L->base[m
[31m-    |  mov CARG1, L[m
[31m-    |  sub RC, RC, BASE			// Need delta, because BASE may change.[m
[31m-    |   str PC, SAVE_PC[m
[31m-    |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |  ldp BASE, RA, L->base[m
[31m-    |  add RC, BASE, RC[m
[31m-    |  sub TMP3, BASE, #16[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  // RA = results, RC = extra results[m
[31m-    |  ldr TMP0w, SAVE_MULTRES[m
[31m-    |   ldr PC, [BASE, FRAME_PC][m
[31m-    |    add RA, BASE, RA, lsl #3[m
[31m-    |  add RC, TMP0, RC, lsl #3[m
[31m-    |  b ->BC_RETM_Z[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET:[m
[31m-    |  // RA = results, RC = nresults+1[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   lsl RC, RC, #3[m
[31m-    |    add RA, BASE, RA, lsl #3[m
[31m-    |->BC_RETM_Z:[m
[31m-    |   str RCw, SAVE_MULTRES[m
[31m-    |1:[m
[31m-    |  ands CARG1, PC, #FRAME_TYPE[m
[31m-    |   eor CARG2, PC, #FRAME_VARG[m
[31m-    |  bne ->BC_RETV2_Z[m
[31m-    |[m
[31m-    |->BC_RET_Z:[m
[31m-    |  // BASE = base, RA = resultptr, RC = (nresults+1)*8, PC = return[m
[31m-    |  ldr INSw, [PC, #-4][m
[31m-    |  subs TMP1, RC, #8[m
[31m-    |   sub CARG3, BASE, #16[m
[31m-    |  beq >3[m
[31m-    |2:[m
[31m-    |  ldr TMP0, [RA], #8[m
[31m-    |   add BASE, BASE, #8[m
[31m-    |   sub TMP1, TMP1, #8[m
[31m-    |  str TMP0, [BASE, #-24][m
[31m-    |   cbnz TMP1, <2[m
[31m-    |3:[m
[31m-    |  decode_RA RA, INS[m
[31m-    |  sub CARG4, CARG3, RA, lsl #3[m
[31m-    |   decode_RB RB, INS[m
[31m-    |  ldr LFUNC:CARG1, [CARG4, FRAME_FUNC][m
[31m-    |5:[m
[31m-    |  cmp RC, RB, lsl #3		// More results expected?[m
[31m-    |  blo >6[m
[31m-    |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  mov BASE, CARG4[m
[31m-    |  ldr CARG2, LFUNC:CARG1->pc[m
[31m-    |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  add BASE, BASE, #8[m
[31m-    |   add RC, RC, #8[m
[31m-    |  str TISNIL, [BASE, #-24][m
[31m-    |  b <5[m
[31m-    |[m
[31m-    |->BC_RETV1_Z:  // Non-standard return case.[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |->BC_RETV2_Z:[m
[31m-    |  tst CARG2, #FRAME_TYPEP[m
[31m-    |  bne ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down.[m
[31m-    |  sub BASE, BASE, CARG2[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET0: case BC_RET1:[m
[31m-    |  // RA = results, RC = nresults+1[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   lsl RC, RC, #3[m
[31m-    |   str RCw, SAVE_MULTRES[m
[31m-    |  ands CARG1, PC, #FRAME_TYPE[m
[31m-    |   eor CARG2, PC, #FRAME_VARG[m
[31m-    |  bne ->BC_RETV1_Z[m
[31m-    |   ldr INSw, [PC, #-4][m
[31m-    if (op == BC_RET1) {[m
[31m-      |  ldr TMP0, [BASE, RA, lsl #3][m
[31m-    }[m
[31m-    |  sub CARG4, BASE, #16[m
[31m-    |   decode_RA RA, INS[m
[31m-    |  sub BASE, CARG4, RA, lsl #3[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  str TMP0, [CARG4], #8[m
[31m-    }[m
[31m-    |   decode_RB RB, INS[m
[31m-    |  ldr LFUNC:CARG1, [BASE, FRAME_FUNC][m
[31m-    |5:[m
[31m-    |  cmp RC, RB, lsl #3[m
[31m-    |  blo >6[m
[31m-    |  and LFUNC:CARG1, CARG1, #LJ_GCVMASK[m
[31m-    |  ldr CARG2, LFUNC:CARG1->pc[m
[31m-    |  ldr KBASE, [CARG2, #PC2PROTO(k)][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  add RC, RC, #8[m
[31m-    |  str TISNIL, [CARG4], #8[m
[31m-    |  b <5[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  |.define FOR_IDX,  [RA];      .define FOR_TIDX,  [RA, #4][m
[31m-  |.define FOR_STOP, [RA, #8];  .define FOR_TSTOP, [RA, #12][m
[31m-  |.define FOR_STEP, [RA, #16]; .define FOR_TSTEP, [RA, #20][m
[31m-  |.define FOR_EXT,  [RA, #24]; .define FOR_TEXT,  [RA, #28][m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IFORL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    |  // RA = base, RC = target (after end of loop or start of loop)[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  add RA, BASE, RA, lsl #3[m
[31m-    |  ldp CARG1, CARG2, FOR_IDX		// CARG1 = IDX, CARG2 = STOP[m
[31m-    |   ldr CARG3, FOR_STEP			// CARG3 = STEP[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |   add RC, PC, RC, lsl #2[m
[31m-      |   sub RC, RC, #0x20000[m
[31m-    }[m
[31m-    |  checkint CARG1, >5[m
[31m-    if (!vk) {[m
[31m-      |  checkint CARG2, ->vmeta_for[m
[31m-      |   checkint CARG3, ->vmeta_for[m
[31m-      |  tbnz CARG3w, #31, >4[m
[31m-      |  cmp CARG1w, CARG2w[m
[31m-    } else {[m
[31m-      |  adds CARG1w, CARG1w, CARG3w[m
[31m-      |  bvs >2[m
[31m-      |   add TMP0, CARG1, TISNUM[m
[31m-      |  tbnz CARG3w, #31, >4[m
[31m-      |  cmp CARG1w, CARG2w[m
[31m-    }[m
[31m-    |1:[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  csel PC, RC, PC, gt[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  ldrh RCw, [RC, #-2][m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  csel PC, RC, PC, le[m
[31m-    }[m
[31m-    if (vk) {[m
[31m-      |   str TMP0, FOR_IDX[m
[31m-      |   str TMP0, FOR_EXT[m
[31m-    } else {[m
[31m-      |  str CARG1, FOR_EXT[m
[31m-    }[m
[31m-    if (op == BC_JFORI || op == BC_JFORL) {[m
[31m-      |  ble =>BC_JLOOP[m
[31m-    }[m
[31m-    |2:[m
[31m-    |   ins_next[m
[31m-    |[m
[31m-    |4:  // Invert check for negative step.[m
[31m-    |  cmp CARG2w, CARG1w[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |5:  // FP loop.[m
[31m-    |  ldp d0, d1, FOR_IDX[m
[31m-    |  blo ->vmeta_for[m
[31m-    if (!vk) {[m
[31m-      |  checknum CARG2, ->vmeta_for[m
[31m-      |   checknum CARG3, ->vmeta_for[m
[31m-      |  str d0, FOR_EXT[m
[31m-    } else {[m
[31m-      |  ldr d2, FOR_STEP[m
[31m-      |  fadd d0, d0, d2[m
[31m-    }[m
[31m-    |  tbnz CARG3, #63, >7[m
[31m-    |  fcmp d0, d1[m
[31m-    |6:[m
[31m-    if (vk) {[m
[31m-      |  str d0, FOR_IDX[m
[31m-      |  str d0, FOR_EXT[m
[31m-    }[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  csel PC, RC, PC, hi[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  ldrh RCw, [RC, #-2][m
[31m-      |  bls =>BC_JLOOP[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  csel PC, RC, PC, ls[m
[31m-    } else {[m
[31m-      |  bls =>BC_JLOOP[m
[31m-    }[m
[31m-    |  b <2[m
[31m-    |[m
[31m-    |7:  // Invert check for negative step.[m
[31m-    |  fcmp d1, d0[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IITERL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  // RA = base, RC = target[m
[31m-    |  ldr CARG1, [BASE, RA, lsl #3][m
[31m-    |   add TMP1, BASE, RA, lsl #3[m
[31m-    |  cmp CARG1, TISNIL[m
[31m-    |  beq >1				// Stop if iterator returned nil.[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  str CARG1, [TMP1, #-8][m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  add TMP0, PC, RC, lsl #2	// Otherwise save control var + branch.[m
[31m-      |  sub PC, TMP0, #0x20000[m
[31m-      |  str CARG1, [TMP1, #-8][m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  // RA = base, RC = target (loop extent)[m
[31m-    |  // Note: RA/RC is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_ILOOP follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  // RA = base, RC = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  NYI[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  // RA = base (only used by trace recorder), RC = target[m
[31m-    |  add RC, PC, RC, lsl #2[m
[31m-    |  sub PC, RC, #0x20000[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    |  // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8[m
[31m-    |  ldr CARG1, L->maxstack[m
[31m-    |   ldrb TMP1w, [PC, #-4+PC2PROTO(numparams)][m
[31m-    |    ldr KBASE, [PC, #-4+PC2PROTO(k)][m
[31m-    |  cmp RA, CARG1[m
[31m-    |  bhi ->vm_growstack_l[m
[31m-    |2:[m
[31m-    |  cmp NARGS8:RC, TMP1, lsl #3	// Check for missing parameters.[m
[31m-    |  blo >3[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  decode_RD RC, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  str TISNIL, [BASE, NARGS8:RC][m
[31m-    |  add NARGS8:RC, NARGS8:RC, #8[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    |  NYI  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8[m
[31m-    |  ldr CARG1, L->maxstack[m
[31m-    |   add TMP2, BASE, RC[m
[31m-    |  add RA, RA, RC[m
[31m-    |   add TMP0, RC, #16+FRAME_VARG[m
[31m-    |   str LFUNC:CARG3, [TMP2], #8	// Store (untagged) copy of LFUNC.[m
[31m-    |    ldr KBASE, [PC, #-4+PC2PROTO(k)][m
[31m-    |  cmp RA, CARG1[m
[31m-    |   str TMP0, [TMP2], #8		// Store delta + FRAME_VARG.[m
[31m-    |  bhs ->vm_growstack_l[m
[31m-    |   sub RC, TMP2, #16[m
[31m-    |  ldrb TMP1w, [PC, #-4+PC2PROTO(numparams)][m
[31m-    |   mov RA, BASE[m
[31m-    |   mov BASE, TMP2[m
[31m-    |  cbz TMP1, >2[m
[31m-    |1:[m
[31m-    |  cmp RA, RC			// Less args than parameters?[m
[31m-    |  bhs >3[m
[31m-    |   ldr TMP0, [RA][m
[31m-    |  sub TMP1, TMP1, #1[m
[31m-    |    str TISNIL, [RA], #8		// Clear old fixarg slot (help the GC).[m
[31m-    |   str TMP0, [TMP2], #8[m
[31m-    |  cbnz TMP1, <1[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:[m
[31m-    |  sub TMP1, TMP1, #1[m
[31m-    |   str TISNIL, [TMP2], #8[m
[31m-    |  cbz TMP1, <2[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, CARG3 = CFUNC, RC = nargs*8[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  ldr CARG4, CFUNC:CARG3->f[m
[31m-    } else {[m
[31m-      |  ldr CARG4, GL->wrapf[m
[31m-    }[m
[31m-    |   add CARG2, RA, NARGS8:RC[m
[31m-    |   ldr CARG1, L->maxstack[m
[31m-    |  add RC, BASE, NARGS8:RC[m
[31m-    |   cmp CARG2, CARG1[m
[31m-    |  stp BASE, RC, L->base[m
[31m-    if (op == BC_FUNCCW) {[m
[31m-      |  ldr CARG2, CFUNC:CARG3->f[m
[31m-    }[m
[31m-    |    mv_vmstate TMP0w, C[m
[31m-    |  mov CARG1, L[m
[31m-    |   bhi ->vm_growstack_c		// Need to grow stack.[m
[31m-    |    st_vmstate TMP0w[m
[31m-    |  blr CARG4			// (lua_State *L [, lua_CFunction f])[m
[31m-    |  // Returns nresults.[m
[31m-    |  ldp BASE, TMP1, L->base[m
[31m-    |    str L, GL->cur_L[m
[31m-    |   sbfiz RC, CRET1, #3, #32[m
[31m-    |    st_vmstate ST_INTERP[m
[31m-    |  ldr PC, [BASE, FRAME_PC][m
[31m-    |   sub RA, TMP1, RC		// RA = L->top - nresults*8[m
[31m-    |  b ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-[m
[31m-  build_subroutines(ctx);[m
[31m-[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  int i, cf = CFRAME_SIZE >> 3;[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",%%progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 30\n"				/* Return address is in lr. */[m
[31m-	"\t.byte 0xc\n\t.uleb128 31\n\t.uleb128 0\n"	/* def_cfa sp */[m
[31m-	"\t.align 3\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.quad .Lbegin\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x9d\n\t.uleb128 %d\n"		/* offset fp */[m
[31m-	"\t.byte 0x9e\n\t.uleb128 %d\n",	/* offset lr */[m
[31m-	fcofs, CFRAME_SIZE, cf, cf-1);[m
[31m-    for (i = 19; i <= 28; i++)  /* offset x19-x28 */[m
[31m-      fprintf(ctx->fp, "\t.byte 0x%x\n\t.uleb128 %d\n", 0x80+i, cf-i+17);[m
[31m-    for (i = 8; i <= 15; i++)  /* offset d8-d15 */[m
[31m-      fprintf(ctx->fp, "\t.byte 5\n\t.uleb128 0x%x\n\t.uleb128 %d\n",[m
[31m-	      64+i, cf-i-4);[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 3\n"[m
[31m-	".LEFDE0:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.quad lj_vm_ffi_call\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 32\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x9d\n\t.uleb128 4\n"		/* offset fp */[m
[31m-	"\t.byte 0x9e\n\t.uleb128 3\n"		/* offset lr */[m
[31m-	"\t.byte 0x93\n\t.uleb128 2\n"		/* offset x19 */[m
[31m-	"\t.align 3\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",%%progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.long .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 30\n"				/* Return address is in lr. */[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.long lj_err_unwind_dwarf-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 31\n\t.uleb128 0\n"	/* def_cfa sp */[m
[31m-	"\t.align 3\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.long .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.long .LASFDE2-.Lframe1\n"[m
[31m-	"\t.long .Lbegin-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x9d\n\t.uleb128 %d\n"		/* offset fp */[m
[31m-	"\t.byte 0x9e\n\t.uleb128 %d\n",	/* offset lr */[m
[31m-	fcofs, CFRAME_SIZE, cf, cf-1);[m
[31m-    for (i = 19; i <= 28; i++)  /* offset x19-x28 */[m
[31m-      fprintf(ctx->fp, "\t.byte 0x%x\n\t.uleb128 %d\n", 0x80+i, cf-i+17);[m
[31m-    for (i = 8; i <= 15; i++)  /* offset d8-d15 */[m
[31m-      fprintf(ctx->fp, "\t.byte 5\n\t.uleb128 0x%x\n\t.uleb128 %d\n",[m
[31m-	      64+i, cf-i-4);[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 3\n"[m
[31m-	".LEFDE2:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.long .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 30\n"				/* Return address is in lr. */[m
[31m-	"\t.uleb128 1\n"                        /* augmentation length */[m
[31m-	"\t.byte 0x1b\n"                        /* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 31\n\t.uleb128 0\n"	/* def_cfa sp */[m
[31m-	"\t.align 3\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.long .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.long .LASFDE3-.Lframe2\n"[m
[31m-	"\t.long lj_vm_ffi_call-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"                        /* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 32\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x9d\n\t.uleb128 4\n"		/* offset fp */[m
[31m-	"\t.byte 0x9e\n\t.uleb128 3\n"		/* offset lr */[m
[31m-	"\t.byte 0x93\n\t.uleb128 2\n"		/* offset x19 */[m
[31m-	"\t.align 3\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_mips.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_mips.dasc[m
[1mdeleted file mode 100644[m
[1mindex 0543c7e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_mips.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,5264 +0,0 @@[m
[31m-|// Low-level VM code for MIPS CPUs.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|//[m
[31m-|// MIPS soft-float support contributed by Djordje Kovacevic and[m
[31m-|// Stefan Pejic from RT-RK.com, sponsored by Cisco Systems, Inc.[m
[31m-|[m
[31m-|.arch mips[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|// Note: The ragged indentation of the instructions is intentional.[m
[31m-|//       The starting columns indicate data dependencies.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|// Don't use: r0 = 0, r26/r27 = reserved, r28 = gp, r29 = sp, r31 = ra[m
[31m-|[m
[31m-|.macro .FPU, a, b[m
[31m-|.if FPU[m
[31m-|  a, b[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// The following must be C callee-save (but BASE is often refetched).[m
[31m-|.define BASE,		r16	// Base of current Lua stack frame.[m
[31m-|.define KBASE,		r17	// Constants of current Lua function.[m
[31m-|.define PC,		r18	// Next PC.[m
[31m-|.define DISPATCH,	r19	// Opcode dispatch table.[m
[31m-|.define LREG,		r20	// Register holding lua_State (also in SAVE_L).[m
[31m-|.define MULTRES,	r21	// Size of multi-result: (nresults+1)*8.[m
[31m-|[m
[31m-|.define JGL,		r30	// On-trace: global_State + 32768.[m
[31m-|[m
[31m-|// Constants for type-comparisons, stores and conversions. C callee-save.[m
[31m-|.define TISNUM,	r22[m
[31m-|.define TISNIL,	r30[m
[31m-|.if FPU[m
[31m-|.define TOBIT,		f30	// 2^52 + 2^51.[m
[31m-|.endif[m
[31m-|[m
[31m-|// The following temporaries are not saved across C calls, except for RA.[m
[31m-|.define RA,		r23	// Callee-save.[m
[31m-|.define RB,		r8[m
[31m-|.define RC,		r9[m
[31m-|.define RD,		r10[m
[31m-|.define INS,		r11[m
[31m-|[m
[31m-|.define AT,		r1	// Assembler temporary.[m
[31m-|.define TMP0,		r12[m
[31m-|.define TMP1,		r13[m
[31m-|.define TMP2,		r14[m
[31m-|.define TMP3,		r15[m
[31m-|[m
[31m-|// Calling conventions.[m
[31m-|.define CFUNCADDR,	r25[m
[31m-|.define CARG1,		r4[m
[31m-|.define CARG2,		r5[m
[31m-|.define CARG3,		r6[m
[31m-|.define CARG4,		r7[m
[31m-|[m
[31m-|.define CRET1,		r2[m
[31m-|.define CRET2,		r3[m
[31m-|[m
[31m-|.if ENDIAN_LE[m
[31m-|.define SFRETLO,	CRET1[m
[31m-|.define SFRETHI,	CRET2[m
[31m-|.define SFARG1LO,	CARG1[m
[31m-|.define SFARG1HI,	CARG2[m
[31m-|.define SFARG2LO,	CARG3[m
[31m-|.define SFARG2HI,	CARG4[m
[31m-|.else[m
[31m-|.define SFRETLO,	CRET2[m
[31m-|.define SFRETHI,	CRET1[m
[31m-|.define SFARG1LO,	CARG2[m
[31m-|.define SFARG1HI,	CARG1[m
[31m-|.define SFARG2LO,	CARG4[m
[31m-|.define SFARG2HI,	CARG3[m
[31m-|.endif[m
[31m-|[m
[31m-|.if FPU[m
[31m-|.define FARG1,		f12[m
[31m-|.define FARG2,		f14[m
[31m-|[m
[31m-|.define FRET1,		f0[m
[31m-|.define FRET2,		f2[m
[31m-|.endif[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|.if FPU		// MIPS32 hard-float.[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	112	// Delta for sp.[m
[31m-|[m
[31m-|.define SAVE_ERRF,	124(sp)	// 32 bit C frame info.[m
[31m-|.define SAVE_NRES,	120(sp)[m
[31m-|.define SAVE_CFRAME,	116(sp)[m
[31m-|.define SAVE_L,	112(sp)[m
[31m-|//----- 8 byte aligned, ^^^^ 16 byte register save area, owned by interpreter.[m
[31m-|.define SAVE_GPR_,	72	// .. 72+10*4: 32 bit GPR saves.[m
[31m-|.define SAVE_FPR_,	24	// .. 24+6*8: 64 bit FPR saves.[m
[31m-|[m
[31m-|.else			// MIPS32 soft-float[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	64	// Delta for sp.[m
[31m-|[m
[31m-|.define SAVE_ERRF,	76(sp)	// 32 bit C frame info.[m
[31m-|.define SAVE_NRES,	72(sp)[m
[31m-|.define SAVE_CFRAME,	68(sp)[m
[31m-|.define SAVE_L,	64(sp)[m
[31m-|//----- 8 byte aligned, ^^^^ 16 byte register save area, owned by interpreter.[m
[31m-|.define SAVE_GPR_,	24	// .. 24+10*4: 32 bit GPR saves.[m
[31m-|[m
[31m-|.endif[m
[31m-|[m
[31m-|.define SAVE_PC,	20(sp)[m
[31m-|.define ARG5,		16(sp)[m
[31m-|.define CSAVE_4,	12(sp)[m
[31m-|.define CSAVE_3,	8(sp)[m
[31m-|.define CSAVE_2,	4(sp)[m
[31m-|.define CSAVE_1,	0(sp)[m
[31m-|//----- 8 byte aligned, ^^^^ 16 byte register save area, owned by callee.[m
[31m-|[m
[31m-|.define ARG5_OFS,	16[m
[31m-|.define SAVE_MULTRES,	ARG5[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|.macro saveregs[m
[31m-|  addiu sp, sp, -CFRAME_SPACE[m
[31m-|  sw ra, SAVE_GPR_+9*4(sp)[m
[31m-|  sw r30, SAVE_GPR_+8*4(sp)[m
[31m-|   .FPU sdc1 f30, SAVE_FPR_+5*8(sp)[m
[31m-|  sw r23, SAVE_GPR_+7*4(sp)[m
[31m-|  sw r22, SAVE_GPR_+6*4(sp)[m
[31m-|   .FPU sdc1 f28, SAVE_FPR_+4*8(sp)[m
[31m-|  sw r21, SAVE_GPR_+5*4(sp)[m
[31m-|  sw r20, SAVE_GPR_+4*4(sp)[m
[31m-|   .FPU sdc1 f26, SAVE_FPR_+3*8(sp)[m
[31m-|  sw r19, SAVE_GPR_+3*4(sp)[m
[31m-|  sw r18, SAVE_GPR_+2*4(sp)[m
[31m-|   .FPU sdc1 f24, SAVE_FPR_+2*8(sp)[m
[31m-|  sw r17, SAVE_GPR_+1*4(sp)[m
[31m-|  sw r16, SAVE_GPR_+0*4(sp)[m
[31m-|   .FPU sdc1 f22, SAVE_FPR_+1*8(sp)[m
[31m-|   .FPU sdc1 f20, SAVE_FPR_+0*8(sp)[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro restoreregs_ret[m
[31m-|  lw ra, SAVE_GPR_+9*4(sp)[m
[31m-|  lw r30, SAVE_GPR_+8*4(sp)[m
[31m-|   .FPU ldc1 f30, SAVE_FPR_+5*8(sp)[m
[31m-|  lw r23, SAVE_GPR_+7*4(sp)[m
[31m-|  lw r22, SAVE_GPR_+6*4(sp)[m
[31m-|   .FPU ldc1 f28, SAVE_FPR_+4*8(sp)[m
[31m-|  lw r21, SAVE_GPR_+5*4(sp)[m
[31m-|  lw r20, SAVE_GPR_+4*4(sp)[m
[31m-|   .FPU ldc1 f26, SAVE_FPR_+3*8(sp)[m
[31m-|  lw r19, SAVE_GPR_+3*4(sp)[m
[31m-|  lw r18, SAVE_GPR_+2*4(sp)[m
[31m-|   .FPU ldc1 f24, SAVE_FPR_+2*8(sp)[m
[31m-|  lw r17, SAVE_GPR_+1*4(sp)[m
[31m-|  lw r16, SAVE_GPR_+0*4(sp)[m
[31m-|   .FPU ldc1 f22, SAVE_FPR_+1*8(sp)[m
[31m-|   .FPU ldc1 f20, SAVE_FPR_+0*8(sp)[m
[31m-|  jr ra[m
[31m-|  addiu sp, sp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State,	LREG[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS8,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Trap for not-yet-implemented parts.[m
[31m-|.macro NYI; .long 0xf0f0f0f0; .endmacro[m
[31m-|[m
[31m-|// Macros to mark delay slots.[m
[31m-|.macro ., a; a; .endmacro[m
[31m-|.macro ., a,b; a,b; .endmacro[m
[31m-|.macro ., a,b,c; a,b,c; .endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Endian-specific defines.[m
[31m-|.if ENDIAN_LE[m
[31m-|.define FRAME_PC,	-4[m
[31m-|.define FRAME_FUNC,	-8[m
[31m-|.define HI,		4[m
[31m-|.define LO,		0[m
[31m-|.define OFS_RD,	2[m
[31m-|.define OFS_RA,	1[m
[31m-|.define OFS_OP,	0[m
[31m-|.else[m
[31m-|.define FRAME_PC,	-8[m
[31m-|.define FRAME_FUNC,	-4[m
[31m-|.define HI,		0[m
[31m-|.define LO,		4[m
[31m-|.define OFS_RD,	0[m
[31m-|.define OFS_RA,	2[m
[31m-|.define OFS_OP,	3[m
[31m-|.endif[m
[31m-|[m
[31m-|// Instruction decode.[m
[31m-|.macro decode_OP1, dst, ins; andi dst, ins, 0xff; .endmacro[m
[31m-|.macro decode_OP4a, dst, ins; andi dst, ins, 0xff; .endmacro[m
[31m-|.macro decode_OP4b, dst; sll dst, dst, 2; .endmacro[m
[31m-|.macro decode_RC4a, dst, ins; srl dst, ins, 14; .endmacro[m
[31m-|.macro decode_RC4b, dst; andi dst, dst, 0x3fc; .endmacro[m
[31m-|.macro decode_RD4b, dst; sll dst, dst, 2; .endmacro[m
[31m-|.macro decode_RA8a, dst, ins; srl dst, ins, 5; .endmacro[m
[31m-|.macro decode_RA8b, dst; andi dst, dst, 0x7f8; .endmacro[m
[31m-|.macro decode_RB8a, dst, ins; srl dst, ins, 21; .endmacro[m
[31m-|.macro decode_RB8b, dst; andi dst, dst, 0x7f8; .endmacro[m
[31m-|.macro decode_RD8a, dst, ins; srl dst, ins, 16; .endmacro[m
[31m-|.macro decode_RD8b, dst; sll dst, dst, 3; .endmacro[m
[31m-|.macro decode_RDtoRC8, dst, src; andi dst, src, 0x7f8; .endmacro[m
[31m-|[m
[31m-|// Instruction fetch.[m
[31m-|.macro ins_NEXT1[m
[31m-|  lw INS, 0(PC)[m
[31m-|   addiu PC, PC, 4[m
[31m-|.endmacro[m
[31m-|// Instruction decode+dispatch.[m
[31m-|.macro ins_NEXT2[m
[31m-|  decode_OP4a TMP1, INS[m
[31m-|  decode_OP4b TMP1[m
[31m-|  addu TMP0, DISPATCH, TMP1[m
[31m-|   decode_RD8a RD, INS[m
[31m-|  lw AT, 0(TMP0)[m
[31m-|   decode_RA8a RA, INS[m
[31m-|   decode_RD8b RD[m
[31m-|  jr AT[m
[31m-|   decode_RA8b RA[m
[31m-|.endmacro[m
[31m-|.macro ins_NEXT[m
[31m-|  ins_NEXT1[m
[31m-|  ins_NEXT2[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|  .define ins_next1, ins_NEXT1[m
[31m-|  .define ins_next2, ins_NEXT2[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  .macro ins_next[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next1[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next2[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-|  lw PC, LFUNC:RB->pc[m
[31m-|  lw INS, 0(PC)[m
[31m-|   addiu PC, PC, 4[m
[31m-|  decode_OP4a TMP1, INS[m
[31m-|   decode_RA8a RA, INS[m
[31m-|  decode_OP4b TMP1[m
[31m-|   decode_RA8b RA[m
[31m-|  addu TMP0, DISPATCH, TMP1[m
[31m-|  lw TMP0, 0(TMP0)[m
[31m-|  jr TMP0[m
[31m-|   addu RA, RA, BASE[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, PC = caller PC[m
[31m-|  sw PC, FRAME_PC(BASE)[m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|.macro branch_RD[m
[31m-|  srl TMP0, RD, 1[m
[31m-|  lui AT, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-|  addu TMP0, TMP0, AT[m
[31m-|  addu PC, PC, TMP0[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-#define GG_DISP2GOT		(GG_OFS(got) - GG_OFS(dispatch))[m
[31m-#define DISPATCH_GOT(name)	(GG_DISP2GOT + 4*LJ_GOT_##name)[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|.macro load_got, func[m
[31m-|  lw CFUNCADDR, DISPATCH_GOT(func)(DISPATCH)[m
[31m-|.endmacro[m
[31m-|// Much faster. Sadly, there's no easy way to force the required code layout.[m
[31m-|// .macro call_intern, func; bal extern func; .endmacro[m
[31m-|.macro call_intern, func; jalr CFUNCADDR; .endmacro[m
[31m-|.macro call_extern; jalr CFUNCADDR; .endmacro[m
[31m-|.macro jmp_extern; jr CFUNCADDR; .endmacro[m
[31m-|[m
[31m-|.macro hotcheck, delta, target[m
[31m-|  srl TMP1, PC, 1[m
[31m-|  andi TMP1, TMP1, 126[m
[31m-|  addu TMP1, TMP1, DISPATCH[m
[31m-|  lhu TMP2, GG_DISP2HOT(TMP1)[m
[31m-|  addiu TMP2, TMP2, -delta[m
[31m-|  bltz TMP2, target[m
[31m-|.  sh TMP2, GG_DISP2HOT(TMP1)[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotloop[m
[31m-|  hotcheck HOTCOUNT_LOOP, ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall[m
[31m-|  hotcheck HOTCOUNT_CALL, ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state. Uses TMP0.[m
[31m-|.macro li_vmstate, st; li TMP0, ~LJ_VMST_..st; .endmacro[m
[31m-|.macro st_vmstate; sw TMP0, DISPATCH_GL(vmstate)(DISPATCH); .endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites mark and tmp.[m
[31m-|.macro barrierback, tab, mark, tmp, target[m
[31m-|  lw tmp, DISPATCH_GL(gc.grayagain)(DISPATCH)[m
[31m-|   andi mark, mark, ~LJ_GC_BLACK & 255		// black2gray(tab)[m
[31m-|  sw tab, DISPATCH_GL(gc.grayagain)(DISPATCH)[m
[31m-|   sb mark, tab->marked[m
[31m-|  b target[m
[31m-|.  sw tmp, tab->gclist[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  // See vm_return. Also: TMP2 = previous base.[m
[31m-  |  andi AT, PC, FRAME_P[m
[31m-  |  beqz AT, ->cont_dispatch[m
[31m-  |.  li TMP1, LJ_TTRUE[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  lw PC, FRAME_PC(TMP2)		// Fetch PC of previous frame.[m
[31m-  |  move BASE, TMP2			// Restore caller base.[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |   sw TMP1, FRAME_PC(RA)		// Prepend true to results.[m
[31m-  |   addiu RA, RA, -8[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |   addiu RD, RD, 8			// RD = (nresults+1)*8.[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |   beqz RD, ->vm_unwind_c_eh[m
[31m-  |.   li CRET1, LUA_YIELD[m
[31m-  |  beqz TMP0, ->BC_RET_Z		// Handle regular return to Lua.[m
[31m-  |.  move MULTRES, RD[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return[m
[31m-  |  // TMP0 = PC & FRAME_TYPE[m
[31m-  |   li TMP2, -8[m
[31m-  |  xori AT, TMP0, FRAME_C[m
[31m-  |   and TMP2, PC, TMP2[m
[31m-  |  bnez AT, ->vm_returnp[m
[31m-  |   subu TMP2, BASE, TMP2		// TMP2 = previous base.[m
[31m-  |[m
[31m-  |  addiu TMP1, RD, -8[m
[31m-  |   sw TMP2, L->base[m
[31m-  |    li_vmstate C[m
[31m-  |   lw TMP2, SAVE_NRES[m
[31m-  |   addiu BASE, BASE, -8[m
[31m-  |    st_vmstate[m
[31m-  |  beqz TMP1, >2[m
[31m-  |.   sll TMP2, TMP2, 3[m
[31m-  |1:[m
[31m-  |  addiu TMP1, TMP1, -8[m
[31m-  |   lw SFRETHI, HI(RA)[m
[31m-  |    lw SFRETLO, LO(RA)[m
[31m-  |    addiu RA, RA, 8[m
[31m-  |   sw SFRETHI, HI(BASE)[m
[31m-  |    sw SFRETLO, LO(BASE)[m
[31m-  |  bnez TMP1, <1[m
[31m-  |.  addiu BASE, BASE, 8[m
[31m-  |[m
[31m-  |2:[m
[31m-  |  bne TMP2, RD, >6[m
[31m-  |3:[m
[31m-  |.  sw BASE, L->top			// Store new top.[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  lw TMP0, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |   move CRET1, r0			// Ok return status for vm_pcall.[m
[31m-  |  sw TMP0, L->cframe[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs_ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  lw TMP1, L->maxstack[m
[31m-  |  slt AT, TMP2, RD[m
[31m-  |  bnez AT, >7			// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |.  slt AT, BASE, TMP1[m
[31m-  |  beqz AT, >8[m
[31m-  |.  nop[m
[31m-  |  sw TISNIL, HI(BASE)[m
[31m-  |  addiu RD, RD, 8[m
[31m-  |  b <2[m
[31m-  |.  addiu BASE, BASE, 8[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  subu TMP0, RD, TMP2[m
[31m-  |  subu TMP0, BASE, TMP0		// Either keep top or shrink it.[m
[31m-  |  b <3[m
[31m-  |.  movn BASE, TMP0, TMP2		// LUA_MULTRET+1 case?[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  load_got lj_state_growstack[m
[31m-  |   move MULTRES, RD[m
[31m-  |  srl CARG2, TMP2, 3[m
[31m-  |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |.  move CARG1, L[m
[31m-  |    lw TMP2, SAVE_NRES[m
[31m-  |  lw BASE, L->top			// Need the (realloced) L->top in BASE.[m
[31m-  |   move RD, MULTRES[m
[31m-  |  b <2[m
[31m-  |.   sll TMP2, TMP2, 3[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  move sp, CARG1[m
[31m-  |  move CRET1, CARG2[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  lw L, SAVE_L[m
[31m-  |   li TMP0, ~LJ_VMST_C[m
[31m-  |  lw GL:TMP1, L->glref[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.  sw TMP0, GL:TMP1->vmstate[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |  li AT, -4[m
[31m-  |  and sp, CARG1, AT[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  lw L, SAVE_L[m
[31m-  |     .FPU lui TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |  lw BASE, L->base[m
[31m-  |   lw DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |     .FPU mtc1 TMP3, TOBIT[m
[31m-  |  li TMP1, LJ_TFALSE[m
[31m-  |    li_vmstate INTERP[m
[31m-  |  lw PC, FRAME_PC(BASE)		// Fetch PC of previous frame.[m
[31m-  |     .FPU cvt.d.s TOBIT, TOBIT[m
[31m-  |  addiu RA, BASE, -8			// Results start at BASE-8.[m
[31m-  |   addiu DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |  sw TMP1, HI(RA)			// Prepend false to error message.[m
[31m-  |    st_vmstate[m
[31m-  |  b ->vm_returnc[m
[31m-  |.  li RD, 16				// 2 results: false + error message.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  b >2[m
[31m-  |.  li CARG2, LUA_MINSTACK[m
[31m-  |[m
[31m-  |->vm_growstack_l:			// Grow stack for Lua function.[m
[31m-  |  // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC[m
[31m-  |  addu RC, BASE, RC[m
[31m-  |   subu RA, RA, BASE[m
[31m-  |  sw BASE, L->base[m
[31m-  |   addiu PC, PC, 4			// Must point after first instruction.[m
[31m-  |  sw RC, L->top[m
[31m-  |   srl CARG2, RA, 3[m
[31m-  |2:[m
[31m-  |  // L->base = new base, L->top = top[m
[31m-  |  load_got lj_state_growstack[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |.  move CARG1, L[m
[31m-  |  lw BASE, L->base[m
[31m-  |  lw RC, L->top[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  subu RC, RC, BASE[m
[31m-  |  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  move L, CARG1[m
[31m-  |    lw DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |  move BASE, CARG2[m
[31m-  |    lbu TMP1, L->status[m
[31m-  |   sw L, SAVE_L[m
[31m-  |  li PC, FRAME_CP[m
[31m-  |  addiu TMP0, sp, CFRAME_RESUME[m
[31m-  |    addiu DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   sw r0, SAVE_NRES[m
[31m-  |   sw r0, SAVE_ERRF[m
[31m-  |   sw CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |   sw r0, SAVE_CFRAME[m
[31m-  |    beqz TMP1, >3[m
[31m-  |. sw TMP0, L->cframe[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  move RA, BASE[m
[31m-  |   lw BASE, L->base[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |   lw TMP1, L->top[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |     .FPU  lui TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |   subu RD, TMP1, BASE[m
[31m-  |     .FPU  mtc1 TMP3, TOBIT[m
[31m-  |    sb r0, L->status[m
[31m-  |     .FPU  cvt.d.s TOBIT, TOBIT[m
[31m-  |    li_vmstate INTERP[m
[31m-  |   addiu RD, RD, 8[m
[31m-  |    st_vmstate[m
[31m-  |   move MULTRES, RD[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |  beqz TMP0, ->BC_RET_Z[m
[31m-  |.    li TISNIL, LJ_TNIL[m
[31m-  |  b ->vm_return[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  sw CARG4, SAVE_ERRF[m
[31m-  |  b >1[m
[31m-  |.  li PC, FRAME_CP[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  li PC, FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  lw TMP1, L:CARG1->cframe[m
[31m-  |    move L, CARG1[m
[31m-  |   sw CARG3, SAVE_NRES[m
[31m-  |    lw DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |   sw CARG1, SAVE_L[m
[31m-  |     move BASE, CARG2[m
[31m-  |    addiu DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   sw CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  sw TMP1, SAVE_CFRAME[m
[31m-  |  sw sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |[m
[31m-  |3:  // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).[m
[31m-  |  sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  lw TMP2, L->base			// TMP2 = old base (used in vmeta_call).[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |     .FPU lui TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |   lw TMP1, L->top[m
[31m-  |     .FPU mtc1 TMP3, TOBIT[m
[31m-  |  addu PC, PC, BASE[m
[31m-  |   subu NARGS8:RC, TMP1, BASE[m
[31m-  |  subu PC, PC, TMP2			// PC = frame delta + frame type[m
[31m-  |     .FPU cvt.d.s TOBIT, TOBIT[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |    st_vmstate[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC[m
[31m-  |  lw TMP0, FRAME_PC(BASE)[m
[31m-  |  li AT, LJ_TFUNC[m
[31m-  |  bne TMP0, AT, ->vmeta_call[m
[31m-  |.  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, RB = func, RC = nargs*8, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  move L, CARG1[m
[31m-  |   lw TMP0, L:CARG1->stack[m
[31m-  |  sw CARG1, SAVE_L[m
[31m-  |   lw TMP1, L->top[m
[31m-  |     lw DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |  sw CARG1, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   subu TMP0, TMP0, TMP1		// Compute -savestack(L, L->top).[m
[31m-  |    lw TMP1, L->cframe[m
[31m-  |     addiu DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   sw TMP0, SAVE_NRES		// Neg. delta means cframe w/o frame.[m
[31m-  |  sw r0, SAVE_ERRF			// No error function.[m
[31m-  |    sw TMP1, SAVE_CFRAME[m
[31m-  |    sw sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |     sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  jalr CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |.  move CFUNCADDR, CARG4[m
[31m-  |  move BASE, CRET1[m
[31m-  |  bnez CRET1, <3			// Else continue with the call.[m
[31m-  |.  li PC, FRAME_CP[m
[31m-  |  b ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// The lj_meta_* functions (except for lj_meta_cat) don't reallocate the[m
[31m-  |// stack, so BASE doesn't need to be reloaded across these calls.[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultptr, RD = (nresults+1)*8[m
[31m-  |  lw TMP0, -16+LO(BASE)		// Continuation.[m
[31m-  |   move RB, BASE[m
[31m-  |   move BASE, TMP2			// Restore caller BASE.[m
[31m-  |    lw LFUNC:TMP1, FRAME_FUNC(TMP2)[m
[31m-  |.if FFI[m
[31m-  |  sltiu AT, TMP0, 2[m
[31m-  |.endif[m
[31m-  |     lw PC, -16+HI(RB)		// Restore PC from [cont|PC].[m
[31m-  |   addu TMP2, RA, RD[m
[31m-  |    lw TMP1, LFUNC:TMP1->pc[m
[31m-  |.if FFI[m
[31m-  |  bnez AT, >1[m
[31m-  |.endif[m
[31m-  |.  sw TISNIL, -8+HI(TMP2)		// Ensure one valid arg.[m
[31m-  |  // BASE = base, RA = resultptr, RB = meta base[m
[31m-  |  jr TMP0				// Jump to continuation.[m
[31m-  |.  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  bnez TMP0, ->cont_ffi_callback	// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: tailcall from C function.[m
[31m-  |.  addiu TMP1, RB, -16[m
[31m-  |  b ->vm_call_tail[m
[31m-  |.  subu RC, TMP1, BASE[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// RA = resultptr, RB = meta base[m
[31m-  |  lw INS, -4(PC)[m
[31m-  |   addiu CARG2, RB, -16[m
[31m-  |  lw SFRETHI, HI(RA)[m
[31m-  |    lw SFRETLO, LO(RA)[m
[31m-  |  decode_RB8a MULTRES, INS[m
[31m-  |   decode_RA8a RA, INS[m
[31m-  |  decode_RB8b MULTRES[m
[31m-  |   decode_RA8b RA[m
[31m-  |  addu TMP1, BASE, MULTRES[m
[31m-  |   sw BASE, L->base[m
[31m-  |   subu CARG3, CARG2, TMP1[m
[31m-  |  sw SFRETHI, HI(CARG2)[m
[31m-  |  bne TMP1, CARG2, ->BC_CAT_Z[m
[31m-  |.  sw SFRETLO, LO(CARG2)[m
[31m-  |  addu RA, BASE, RA[m
[31m-  |  sw SFRETHI, HI(RA)[m
[31m-  |  b ->cont_nop[m
[31m-  |.  sw SFRETLO, LO(RA)[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets1:[m
[31m-  |  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  li TMP0, LJ_TSTR[m
[31m-  |  sw STR:RC, LO(CARG3)[m
[31m-  |  b >1[m
[31m-  |.  sw TMP0, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  addiu CARG2, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  li TMP0, LJ_TTAB[m
[31m-  |  sw TAB:RB, LO(CARG2)[m
[31m-  |   addiu CARG3, DISPATCH, DISPATCH_GL(tmptv2)[m
[31m-  |  sw TMP0, HI(CARG2)[m
[31m-  |   li TMP1, LJ_TSTR[m
[31m-  |   sw STR:RC, LO(CARG3)[m
[31m-  |  b >1[m
[31m-  |.  sw TMP1, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tgetb:			// TMP0 = index[m
[31m-  |  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  sw TMP0, LO(CARG3)[m
[31m-  |  sw TISNUM, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |1:[m
[31m-  |  load_got lj_meta_tget[m
[31m-  |  sw BASE, L->base[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  beqz CRET1, >3[m
[31m-  |.  addiu TMP1, BASE, -FRAME_CONT[m
[31m-  |  lw SFARG1HI, HI(CRET1)[m
[31m-  |   lw SFARG2HI, LO(CRET1)[m
[31m-  |  ins_next1[m
[31m-  |  sw SFARG1HI, HI(RA)[m
[31m-  |   sw SFARG2HI, LO(RA)[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |  lw BASE, L->top[m
[31m-  |  sw PC, -16+HI(BASE)		// [cont|PC][m
[31m-  |   subu PC, BASE, TMP1[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |.  li NARGS8:RC, 16			// 2 args for func(t, k).[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  load_got lj_tab_getinth[m
[31m-  |  call_intern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |.  nop[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  beqz CRET1, ->BC_TGETR_Z[m
[31m-  |.  move SFARG2HI, TISNIL[m
[31m-  |  lw SFARG2HI, HI(CRET1)[m
[31m-  |  b ->BC_TGETR_Z[m
[31m-  |.  lw SFARG2LO, LO(CRET1)[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets1:[m
[31m-  |  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  li TMP0, LJ_TSTR[m
[31m-  |  sw STR:RC, LO(CARG3)[m
[31m-  |  b >1[m
[31m-  |.  sw TMP0, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  addiu CARG2, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  li TMP0, LJ_TTAB[m
[31m-  |  sw TAB:RB, LO(CARG2)[m
[31m-  |   addiu CARG3, DISPATCH, DISPATCH_GL(tmptv2)[m
[31m-  |  sw TMP0, HI(CARG2)[m
[31m-  |   li TMP1, LJ_TSTR[m
[31m-  |   sw STR:RC, LO(CARG3)[m
[31m-  |  b >1[m
[31m-  |.  sw TMP1, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tsetb:			// TMP0 = index[m
[31m-  |  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |  sw TMP0, LO(CARG3)[m
[31m-  |  sw TISNUM, HI(CARG3)[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |1:[m
[31m-  |  load_got lj_meta_tset[m
[31m-  |  sw BASE, L->base[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  lw SFARG1HI, HI(RA)[m
[31m-  |  beqz CRET1, >3[m
[31m-  |.  lw SFARG1LO, LO(RA)[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  ins_next1[m
[31m-  |  sw SFARG1HI, HI(CRET1)[m
[31m-  |   sw SFARG1LO, LO(CRET1)[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |  addiu TMP1, BASE, -FRAME_CONT[m
[31m-  |  lw BASE, L->top[m
[31m-  |  sw PC, -16+HI(BASE)		// [cont|PC][m
[31m-  |   subu PC, BASE, TMP1[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |  sw SFARG1HI, 16+HI(BASE)		// Copy value to third argument.[m
[31m-  |   sw SFARG1LO, 16+LO(BASE)[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |.  li NARGS8:RC, 24			// 3 args for func(t, k, v)[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |  load_got lj_tab_setinth[m
[31m-  |  sw BASE, L->base[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  call_intern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns TValue *.[m
[31m-  |  b ->BC_TSETR_Z[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  // RA/RD point to o1/o2.[m
[31m-  |  move CARG2, RA[m
[31m-  |  move CARG3, RD[m
[31m-  |  load_got lj_meta_comp[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |  sw BASE, L->base[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  decode_OP1 CARG4, INS[m
[31m-  |  call_intern lj_meta_comp	// (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |3:[m
[31m-  |  sltiu AT, CRET1, 2[m
[31m-  |  beqz AT, ->vmeta_binop[m
[31m-  |   negu TMP2, CRET1[m
[31m-  |4:[m
[31m-  |  lhu RD, OFS_RD(PC)[m
[31m-  |   addiu PC, PC, 4[m
[31m-  |   lui TMP1, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-  |  sll RD, RD, 2[m
[31m-  |  addu RD, RD, TMP1[m
[31m-  |  and RD, RD, TMP2[m
[31m-  |  addu PC, PC, RD[m
[31m-  |->cont_nop:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_ra:				// RA = resultptr[m
[31m-  |  lbu TMP1, -4+OFS_RA(PC)[m
[31m-  |   lw SFRETHI, HI(RA)[m
[31m-  |    lw SFRETLO, LO(RA)[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  addu TMP1, BASE, TMP1[m
[31m-  |   sw SFRETHI, HI(TMP1)[m
[31m-  |  b ->cont_nop[m
[31m-  |.   sw SFRETLO, LO(TMP1)[m
[31m-  |[m
[31m-  |->cont_condt:			// RA = resultptr[m
[31m-  |  lw TMP0, HI(RA)[m
[31m-  |  sltiu AT, TMP0, LJ_TISTRUECOND[m
[31m-  |  b <4[m
[31m-  |.  negu TMP2, AT			// Branch if result is true.[m
[31m-  |[m
[31m-  |->cont_condf:			// RA = resultptr[m
[31m-  |  lw TMP0, HI(RA)[m
[31m-  |  sltiu AT, TMP0, LJ_TISTRUECOND[m
[31m-  |  b <4[m
[31m-  |.  addiu TMP2, AT, -1		// Branch if result is false.[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  // SFARG1LO/SFARG2LO point to o1/o2. TMP0 is set to 0/1.[m
[31m-  |  load_got lj_meta_equal[m
[31m-  |   move CARG2, SFARG1LO[m
[31m-  |   move CARG3, SFARG2LO[m
[31m-  |   move CARG4, TMP0[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_equal  // (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  load_got lj_meta_equal_cd[m
[31m-  |  move CARG2, INS[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_equal_cd	// (lua_State *L, BCIns op)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.  nop[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  load_got lj_meta_istype[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |   sw BASE, L->base[m
[31m-  |   srl CARG2, RA, 3[m
[31m-  |   srl CARG3, RD, 3[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |.  move CARG1, L[m
[31m-  |  b ->cont_nop[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  move RC, RB[m
[31m-  |[m
[31m-  |->vmeta_arith:[m
[31m-  |  load_got lj_meta_arith[m
[31m-  |  decode_OP1 TMP0, INS[m
[31m-  |   sw BASE, L->base[m
[31m-  |  move CARG2, RA[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  move CARG3, RB[m
[31m-  |  move CARG4, RC[m
[31m-  |  sw TMP0, ARG5[m
[31m-  |  call_intern lj_meta_arith  // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-  |  beqz CRET1, ->cont_nop[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2[m
[31m-  |  subu TMP1, CRET1, BASE[m
[31m-  |   sw PC, -16+HI(CRET1)		// [cont|PC][m
[31m-  |   move TMP2, BASE[m
[31m-  |  addiu PC, TMP1, FRAME_CONT[m
[31m-  |   move BASE, CRET1[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |.  li NARGS8:RC, 16			// 2 args for func(o1, o2).[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  // CARG2 already set by BC_LEN.[m
[31m-#if LJ_52[m
[31m-  |  move MULTRES, CARG1[m
[31m-#endif[m
[31m-  |  load_got lj_meta_len[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns NULL (retry) or TValue * (metamethod base).[m
[31m-#if LJ_52[m
[31m-  |  bnez CRET1, ->vmeta_binop		// Binop call for compatibility.[m
[31m-  |.  nop[m
[31m-  |  b ->BC_LEN_Z[m
[31m-  |.  move CARG1, MULTRES[m
[31m-#else[m
[31m-  |  b ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |.  nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // TMP2 = old base, BASE = new base, RC = nargs*8[m
[31m-  |  load_got lj_meta_call[m
[31m-  |   sw TMP2, L->base			// This is the callers base![m
[31m-  |  addiu CARG2, BASE, -8[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  addu CARG3, BASE, RC[m
[31m-  |   move MULTRES, NARGS8:RC[m
[31m-  |  call_intern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |.  move CARG1, L[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |   addiu NARGS8:RC, MULTRES, 8	// Got one more argument now.[m
[31m-  |  ins_call[m
[31m-  |[m
[31m-  |->vmeta_callt:			// Resolve __call for BC_CALLT.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs*8[m
[31m-  |  load_got lj_meta_call[m
[31m-  |   sw BASE, L->base[m
[31m-  |  addiu CARG2, RA, -8[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  addu CARG3, RA, RC[m
[31m-  |   move MULTRES, NARGS8:RC[m
[31m-  |  call_intern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |.  move CARG1, L[m
[31m-  |  lw TMP1, FRAME_PC(BASE)[m
[31m-  |   lw LFUNC:RB, FRAME_FUNC(RA)	// Guaranteed to be a function here.[m
[31m-  |  b ->BC_CALLT_Z[m
[31m-  |.  addiu NARGS8:RC, MULTRES, 8	// Got one more argument now.[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  load_got lj_meta_for[m
[31m-  |   sw BASE, L->base[m
[31m-  |  move CARG2, RA[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  move MULTRES, INS[m
[31m-  |  call_intern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |.  move CARG1, L[m
[31m-  |.if JIT[m
[31m-  |  decode_OP1 TMP0, MULTRES[m
[31m-  |  li AT, BC_JFORI[m
[31m-  |.endif[m
[31m-  |  decode_RA8a RA, MULTRES[m
[31m-  |   decode_RD8a RD, MULTRES[m
[31m-  |  decode_RA8b RA[m
[31m-  |.if JIT[m
[31m-  |  beq TMP0, AT, =>BC_JFORI[m
[31m-  |.  decode_RD8b RD[m
[31m-  |  b =>BC_FORI[m
[31m-  |.  nop[m
[31m-  |.else[m
[31m-  |  b =>BC_FORI[m
[31m-  |.  decode_RD8b RD[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  sltiu AT, NARGS8:RC, 16[m
[31m-  |   lw SFARG1HI, HI(BASE)[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.   lw SFARG2HI, 8+HI(BASE)[m
[31m-  |   lw SFARG1LO, LO(BASE)[m
[31m-  |    lw SFARG2LO, 8+LO(BASE)[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name	// Caveat: has delay slot![m
[31m-  |->ff_ .. name:[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |.if FPU[m
[31m-  |   ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |   lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name	// Caveat: has delay slot![m
[31m-  |->ff_ .. name:[m
[31m-  |  sltiu AT, NARGS8:RC, 16[m
[31m-  |   lw SFARG1HI, HI(BASE)[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  lw SFARG2HI, 8+HI(BASE)[m
[31m-  |  sltiu TMP0, SFARG1HI, LJ_TISNUM[m
[31m-  |.if FPU[m
[31m-  |   ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |   lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  sltiu TMP1, SFARG2HI, LJ_TISNUM[m
[31m-  |.if FPU[m
[31m-  |   ldc1 FARG2, 8(BASE)[m
[31m-  |.else[m
[31m-  |   lw SFARG2LO, 8+LO(BASE)[m
[31m-  |.endif[m
[31m-  |  and TMP0, TMP0, TMP1[m
[31m-  |  beqz TMP0, ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1 and has delay slot![m
[31m-  |.macro ffgccheck[m
[31m-  |  lw TMP0, DISPATCH_GL(gc.total)(DISPATCH)[m
[31m-  |  lw TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)[m
[31m-  |  subu AT, TMP0, TMP1[m
[31m-  |  bgezal AT, ->fff_gcstep[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  sltiu AT, SFARG1HI, LJ_TISTRUECOND[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |  addiu RD, NARGS8:RC, 8		// Compute (nresults+1)*8.[m
[31m-  |  addu TMP2, RA, NARGS8:RC[m
[31m-  |   sw SFARG1HI, HI(RA)[m
[31m-  |  addiu TMP1, BASE, 8[m
[31m-  |  beq BASE, TMP2, ->fff_res		// Done if exactly 1 argument.[m
[31m-  |.  sw SFARG1LO, LO(RA)[m
[31m-  |1:[m
[31m-  |  lw SFRETHI, HI(TMP1)[m
[31m-  |   lw SFRETLO, LO(TMP1)[m
[31m-  |  sw SFRETHI, -8+HI(TMP1)[m
[31m-  |   sw SFRETLO, -8+LO(TMP1)[m
[31m-  |  bne TMP1, TMP2, <1[m
[31m-  |.  addiu TMP1, TMP1, 8[m
[31m-  |  b ->fff_res[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |.ffunc type[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  sltiu TMP0, SFARG1HI, LJ_TISNUM[m
[31m-  |  movn SFARG1HI, TISNUM, TMP0[m
[31m-  |  not TMP1, SFARG1HI[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  addu TMP1, CFUNC:RB, TMP1[m
[31m-  |  lw SFARG1HI, CFUNC:TMP1->upvalue[0].u32.hi[m
[31m-  |  b ->fff_restv[m
[31m-  |.  lw SFARG1LO, CFUNC:TMP1->upvalue[0].u32.lo[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |  bne SFARG1HI, AT, >6[m
[31m-  |.  li AT, LJ_TUDATA[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  lw TAB:SFARG1LO, TAB:SFARG1LO->metatable[m
[31m-  |2:[m
[31m-  |  lw STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH)[m
[31m-  |  beqz TAB:SFARG1LO, ->fff_restv[m
[31m-  |.  li SFARG1HI, LJ_TNIL[m
[31m-  |  lw TMP0, TAB:SFARG1LO->hmask[m
[31m-  |   li SFARG1HI, LJ_TTAB		// Use metatable as default result.[m
[31m-  |  lw TMP1, STR:RC->hash[m
[31m-  |  lw NODE:TMP2, TAB:SFARG1LO->node[m
[31m-  |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-  |  sll TMP0, TMP1, 5[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  subu TMP1, TMP0, TMP1[m
[31m-  |  addu NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-  |  li AT, LJ_TSTR[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  lw CARG4, offsetof(Node, key)+HI(NODE:TMP2)[m
[31m-  |   lw TMP0, offsetof(Node, key)+LO(NODE:TMP2)[m
[31m-  |    lw NODE:TMP3, NODE:TMP2->next[m
[31m-  |  bne CARG4, AT, >4[m
[31m-  |.    lw CARG3, offsetof(Node, val)+HI(NODE:TMP2)[m
[31m-  |  beq TMP0, STR:RC, >5[m
[31m-  |.    lw TMP1, offsetof(Node, val)+LO(NODE:TMP2)[m
[31m-  |4:[m
[31m-  |  beqz NODE:TMP3, ->fff_restv	// Not found, keep default result.[m
[31m-  |.  move NODE:TMP2, NODE:TMP3[m
[31m-  |  b <3[m
[31m-  |.  nop[m
[31m-  |5:[m
[31m-  |  beq CARG3, TISNIL, ->fff_restv	// Ditto for nil value.[m
[31m-  |.  nop[m
[31m-  |  move SFARG1HI, CARG3		// Return value of mt.__metatable.[m
[31m-  |  b ->fff_restv[m
[31m-  |.  move SFARG1LO, TMP1[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  beq SFARG1HI, AT, <1[m
[31m-  |.  sltu AT, TISNUM, SFARG1HI[m
[31m-  |  movz SFARG1HI, TISNUM, AT[m
[31m-  |  not TMP1, SFARG1HI[m
[31m-  |  sll TMP1, TMP1, 2[m
[31m-  |  addu TMP1, DISPATCH, TMP1[m
[31m-  |  b <2[m
[31m-  |.  lw TAB:SFARG1LO, DISPATCH_GL(gcroot[GCROOT_BASEMT])(TMP1)[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |  bne SFARG1HI, AT, ->fff_fallback[m
[31m-  |.  addiu SFARG2HI, SFARG2HI, -LJ_TTAB[m
[31m-  |  lw TAB:TMP1, TAB:SFARG1LO->metatable[m
[31m-  |   lbu TMP3, TAB:SFARG1LO->marked[m
[31m-  |  or AT, SFARG2HI, TAB:TMP1[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  andi AT, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-  |  beqz AT, ->fff_restv[m
[31m-  |.  sw TAB:SFARG2LO, TAB:SFARG1LO->metatable[m
[31m-  |  barrierback TAB:SFARG1LO, TMP3, TMP0, ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc rawget[m
[31m-  |  lw CARG4, HI(BASE)[m
[31m-  |   sltiu AT, NARGS8:RC, 16[m
[31m-  |    lw TAB:CARG2, LO(BASE)[m
[31m-  |  load_got lj_tab_get[m
[31m-  |  addiu CARG4, CARG4, -LJ_TTAB[m
[31m-  |  or AT, AT, CARG4[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |   addiu CARG3, BASE, 8[m
[31m-  |  call_intern lj_tab_get	// (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns cTValue *.[m
[31m-  |  lw SFARG1HI, HI(CRET1)[m
[31m-  |  b ->fff_restv[m
[31m-  |.  lw SFARG1LO, LO(CRET1)[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  lw CARG1, HI(BASE)[m
[31m-  |  xori AT, NARGS8:RC, 8		// Exactly one number argument.[m
[31m-  |  sltu TMP0, TISNUM, CARG1[m
[31m-  |  or AT, AT, TMP0[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  lw SFARG1HI, HI(BASE)[m
[31m-  |  b ->fff_restv[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  li AT, LJ_TSTR[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  beq SFARG1HI, AT, ->fff_restv	// String key?[m
[31m-  |  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |.  lw TMP1, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH)[m
[31m-  |  sltu TMP0, TISNUM, SFARG1HI[m
[31m-  |  or TMP0, TMP0, TMP1[m
[31m-  |  bnez TMP0, ->fff_fallback[m
[31m-  |.  sw BASE, L->base			// Add frame since C call can throw.[m
[31m-  |  ffgccheck[m
[31m-  |.  sw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  load_got lj_strfmt_number[m
[31m-  |  move CARG1, L[m
[31m-  |  call_intern lj_strfmt_number	// (lua_State *L, cTValue *o)[m
[31m-  |.  move CARG2, BASE[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  li SFARG1HI, LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |.  move SFARG1LO, CRET1[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc next[m
[31m-  |  lw CARG1, HI(BASE)[m
[31m-  |   lw TAB:CARG2, LO(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  addu TMP2, BASE, NARGS8:RC[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |   sw TISNIL, HI(TMP2)		// Set missing 2nd arg to nil.[m
[31m-  |  bne CARG1, AT, ->fff_fallback[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-  |  load_got lj_tab_next[m
[31m-  |   sw BASE, L->base			// Add frame since C call can throw.[m
[31m-  |   sw BASE, L->top			// Dummy frame length is ok.[m
[31m-  |  addiu CARG3, BASE, 8[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_tab_next		// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns 0 at end of traversal.[m
[31m-  |  beqz CRET1, ->fff_restv		// End of traversal: return nil.[m
[31m-  |.  li SFARG1HI, LJ_TNIL[m
[31m-  |  lw TMP0, 8+HI(BASE)[m
[31m-  |   lw TMP1, 8+LO(BASE)[m
[31m-  |    addiu RA, BASE, -8[m
[31m-  |  lw TMP2, 16+HI(BASE)[m
[31m-  |   lw TMP3, 16+LO(BASE)[m
[31m-  |  sw TMP0, HI(RA)[m
[31m-  |   sw TMP1, LO(RA)[m
[31m-  |  sw TMP2, 8+HI(RA)[m
[31m-  |   sw TMP3, 8+LO(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (2+1)*8[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |  bne SFARG1HI, AT, ->fff_fallback[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-#if LJ_52[m
[31m-  |  lw TAB:TMP2, TAB:SFARG1LO->metatable[m
[31m-  |  lw TMP0, CFUNC:RB->upvalue[0].u32.hi[m
[31m-  |   lw TMP1, CFUNC:RB->upvalue[0].u32.lo[m
[31m-  |  bnez TAB:TMP2, ->fff_fallback[m
[31m-#else[m
[31m-  |  lw TMP0, CFUNC:RB->upvalue[0].u32.hi[m
[31m-  |   lw TMP1, CFUNC:RB->upvalue[0].u32.lo[m
[31m-#endif[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |   sw TISNIL, 8+HI(BASE)[m
[31m-  |  sw TMP0, HI(RA)[m
[31m-  |   sw TMP1, LO(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (3+1)*8[m
[31m-  |[m
[31m-  |.ffunc ipairs_aux[m
[31m-  |  sltiu AT, NARGS8:RC, 16[m
[31m-  |   lw CARG3, HI(BASE)[m
[31m-  |    lw TAB:CARG1, LO(BASE)[m
[31m-  |   lw CARG4, 8+HI(BASE)[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  addiu CARG3, CARG3, -LJ_TTAB[m
[31m-  |  xor CARG4, CARG4, TISNUM[m
[31m-  |  and AT, CARG3, CARG4[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-  |  lw TMP2, 8+LO(BASE)[m
[31m-  |   lw TMP0, TAB:CARG1->asize[m
[31m-  |   lw TMP1, TAB:CARG1->array[m
[31m-  |  addiu TMP2, TMP2, 1[m
[31m-  |  sw TISNUM, -8+HI(BASE)[m
[31m-  |  sltu AT, TMP2, TMP0[m
[31m-  |   sw TMP2, -8+LO(BASE)[m
[31m-  |  beqz AT, >2			// Not in array part?[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |   sll TMP3, TMP2, 3[m
[31m-  |   addu TMP3, TMP1, TMP3[m
[31m-  |  lw TMP1, HI(TMP3)[m
[31m-  |   lw TMP2, LO(TMP3)[m
[31m-  |1:[m
[31m-  |  beq TMP1, TISNIL, ->fff_res	// End of iteration, return 0 results.[m
[31m-  |.  li RD, (0+1)*8[m
[31m-  |  sw TMP1, 8+HI(RA)[m
[31m-  |   sw TMP2, 8+LO(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (2+1)*8[m
[31m-  |[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  lw TMP0, TAB:CARG1->hmask[m
[31m-  |  load_got lj_tab_getinth[m
[31m-  |  beqz TMP0, ->fff_res[m
[31m-  |.  li RD, (0+1)*8[m
[31m-  |  call_intern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |.  move CARG2, TMP2[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  beqz CRET1, ->fff_res[m
[31m-  |.  li RD, (0+1)*8[m
[31m-  |  lw TMP1, HI(CRET1)[m
[31m-  |  b <1[m
[31m-  |.  lw TMP2, LO(CRET1)[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  li AT, LJ_TTAB[m
[31m-  |  bne SFARG1HI, AT, ->fff_fallback[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-#if LJ_52[m
[31m-  |  lw TAB:TMP2, TAB:SFARG1LO->metatable[m
[31m-  |  lw TMP0, CFUNC:RB->upvalue[0].u32.hi[m
[31m-  |   lw TMP1, CFUNC:RB->upvalue[0].u32.lo[m
[31m-  |  bnez TAB:TMP2, ->fff_fallback[m
[31m-#else[m
[31m-  |  lw TMP0, CFUNC:RB->upvalue[0].u32.hi[m
[31m-  |   lw TMP1, CFUNC:RB->upvalue[0].u32.lo[m
[31m-#endif[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |   sw TISNUM, 8+HI(BASE)[m
[31m-  |   sw r0, 8+LO(BASE)[m
[31m-  |  sw TMP0, HI(RA)[m
[31m-  |   sw TMP1, LO(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (3+1)*8[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc pcall[m
[31m-  |  lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |   move TMP2, BASE[m
[31m-  |   addiu BASE, BASE, 8[m
[31m-  |  // Remember active hook before pcall.[m
[31m-  |  srl TMP3, TMP3, HOOK_ACTIVE_SHIFT[m
[31m-  |  andi TMP3, TMP3, 1[m
[31m-  |  addiu PC, TMP3, 8+FRAME_PCALL[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |.  addiu NARGS8:RC, NARGS8:RC, -8[m
[31m-  |[m
[31m-  |.ffunc xpcall[m
[31m-  |    sltiu AT, NARGS8:RC, 16[m
[31m-  |  lw CARG4, 8+HI(BASE)[m
[31m-  |    bnez AT, ->fff_fallback[m
[31m-  |.  lw CARG3, 8+LO(BASE)[m
[31m-  |   lw CARG1, LO(BASE)[m
[31m-  |    lw CARG2, HI(BASE)[m
[31m-  |    lbu TMP1, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  li AT, LJ_TFUNC[m
[31m-  |   move TMP2, BASE[m
[31m-  |  bne CARG4, AT, ->fff_fallback  // Traceback must be a function.[m
[31m-  |   addiu BASE, BASE, 16[m
[31m-  |  // Remember active hook before pcall.[m
[31m-  |  srl TMP3, TMP3, HOOK_ACTIVE_SHIFT[m
[31m-  |   sw CARG3, LO(TMP2)	// Swap function and traceback.[m
[31m-  |   sw CARG4, HI(TMP2)[m
[31m-  |  andi TMP3, TMP3, 1[m
[31m-  |   sw CARG1, 8+LO(TMP2)[m
[31m-  |    sw CARG2, 8+HI(TMP2)[m
[31m-  |  addiu PC, TMP3, 16+FRAME_PCALL[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |.  addiu NARGS8:RC, NARGS8:RC, -16[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc coroutine_resume[m
[31m-  |  lw CARG3, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  lw CARG1, LO(BASE)[m
[31m-  |  li AT, LJ_TTHREAD[m
[31m-  |  bne CARG3, AT, ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  lw L:CARG1, CFUNC:RB->upvalue[0].gcr[m
[31m-  |.endif[m
[31m-  |  lbu TMP0, L:CARG1->status[m
[31m-  |   lw TMP1, L:CARG1->cframe[m
[31m-  |    lw CARG2, L:CARG1->top[m
[31m-  |    lw TMP2, L:CARG1->base[m
[31m-  |  addiu TMP3, TMP0, -LUA_YIELD[m
[31m-  |  bgtz TMP3, ->fff_fallback		// st > LUA_YIELD?[m
[31m-  |.   xor TMP2, TMP2, CARG2[m
[31m-  |  bnez TMP1, ->fff_fallback		// cframe != 0?[m
[31m-  |.  or AT, TMP2, TMP0[m
[31m-  |  lw TMP0, L:CARG1->maxstack[m
[31m-  |  beqz AT, ->fff_fallback		// base == top && st == 0?[m
[31m-  |.  lw PC, FRAME_PC(BASE)[m
[31m-  |  addu TMP2, CARG2, NARGS8:RC[m
[31m-  |  sltu AT, TMP0, TMP2[m
[31m-  |  bnez AT, ->fff_fallback		// Stack overflow?[m
[31m-  |.  sw PC, SAVE_PC[m
[31m-  |   sw BASE, L->base[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  addiu BASE, BASE, 8		// Keep resumed thread in stack for GC.[m
[31m-  |  addiu NARGS8:RC, NARGS8:RC, -8[m
[31m-  |  addiu TMP2, TMP2, -8[m
[31m-  |.endif[m
[31m-  |  sw TMP2, L:CARG1->top[m
[31m-  |  addu TMP1, BASE, NARGS8:RC[m
[31m-  |  move CARG3, CARG2[m
[31m-  |  sw BASE, L->top[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |   lw SFRETHI, HI(BASE)[m
[31m-  |    lw SFRETLO, LO(BASE)[m
[31m-  |  sltu AT, BASE, TMP1[m
[31m-  |  beqz AT, >3[m
[31m-  |.  addiu BASE, BASE, 8[m
[31m-  |   sw SFRETHI, HI(CARG3)[m
[31m-  |    sw SFRETLO, LO(CARG3)[m
[31m-  |  b <2[m
[31m-  |.  addiu CARG3, CARG3, 8[m
[31m-  |3:[m
[31m-  |  bal ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |.  move L:RA, L:CARG1[m
[31m-  |  // Returns thread status.[m
[31m-  |4:[m
[31m-  |  lw TMP2, L:RA->base[m
[31m-  |   sltiu AT, CRET1, LUA_YIELD+1[m
[31m-  |  lw TMP3, L:RA->top[m
[31m-  |    li_vmstate INTERP[m
[31m-  |  lw BASE, L->base[m
[31m-  |    sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |    st_vmstate[m
[31m-  |   beqz AT, >8[m
[31m-  |. subu RD, TMP3, TMP2[m
[31m-  |   lw TMP0, L->maxstack[m
[31m-  |  beqz RD, >6			// No results?[m
[31m-  |.  addu TMP1, BASE, RD[m
[31m-  |  sltu AT, TMP0, TMP1[m
[31m-  |  bnez AT, >9			// Need to grow stack?[m
[31m-  |.  addu TMP3, TMP2, RD[m
[31m-  |  sw TMP2, L:RA->top			// Clear coroutine stack.[m
[31m-  |  move TMP1, BASE[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |   lw SFRETHI, HI(TMP2)[m
[31m-  |    lw SFRETLO, LO(TMP2)[m
[31m-  |  addiu TMP2, TMP2, 8[m
[31m-  |  sltu AT, TMP2, TMP3[m
[31m-  |   sw SFRETHI, HI(TMP1)[m
[31m-  |    sw SFRETLO, LO(TMP1)[m
[31m-  |  bnez AT, <5[m
[31m-  |.  addiu TMP1, TMP1, 8[m
[31m-  |6:[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |.if resume[m
[31m-  |  li TMP1, LJ_TTRUE[m
[31m-  |   addiu RA, BASE, -8[m
[31m-  |  sw TMP1, -8+HI(BASE)		// Prepend true to results.[m
[31m-  |  addiu RD, RD, 16[m
[31m-  |.else[m
[31m-  |  move RA, BASE[m
[31m-  |  addiu RD, RD, 8[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |  sw PC, SAVE_PC[m
[31m-  |  beqz TMP0, ->BC_RET_Z[m
[31m-  |.  move MULTRES, RD[m
[31m-  |  b ->vm_return[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  addiu TMP3, TMP3, -8[m
[31m-  |   li TMP1, LJ_TFALSE[m
[31m-  |  lw SFRETHI, HI(TMP3)[m
[31m-  |   lw SFRETLO, LO(TMP3)[m
[31m-  |   sw TMP3, L:RA->top		// Remove error from coroutine stack.[m
[31m-  |    li RD, (2+1)*8[m
[31m-  |   sw TMP1, -8+HI(BASE)		// Prepend false to results.[m
[31m-  |    addiu RA, BASE, -8[m
[31m-  |  sw SFRETHI, HI(BASE)		// Copy error message.[m
[31m-  |   sw SFRETLO, LO(BASE)[m
[31m-  |  b <7[m
[31m-  |.  andi TMP0, PC, FRAME_TYPE[m
[31m-  |.else[m
[31m-  |  load_got lj_ffh_coroutine_wrap_err[m
[31m-  |  move CARG2, L:RA[m
[31m-  |  call_intern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |.  move CARG1, L[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  load_got lj_state_growstack[m
[31m-  |  srl CARG2, RD, 3[m
[31m-  |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |.  move CARG1, L[m
[31m-  |  b <4[m
[31m-  |.  li CRET1, 0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  lw TMP0, L->cframe[m
[31m-  |   addu TMP1, BASE, NARGS8:RC[m
[31m-  |   sw BASE, L->base[m
[31m-  |  andi TMP0, TMP0, CFRAME_RESUME[m
[31m-  |   sw TMP1, L->top[m
[31m-  |  beqz TMP0, ->fff_fallback[m
[31m-  |.   li CRET1, LUA_YIELD[m
[31m-  |  sw r0, L->cframe[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.   sb CRET1, L->status[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 math_abs[m
[31m-  |  bne SFARG1HI, TISNUM, >1[m
[31m-  |.  sra TMP0, SFARG1LO, 31[m
[31m-  |  xor TMP1, SFARG1LO, TMP0[m
[31m-  |  subu SFARG1LO, TMP1, TMP0[m
[31m-  |  bgez SFARG1LO, ->fff_restv[m
[31m-  |.  nop[m
[31m-  |  lui SFARG1HI, 0x41e0		// 2^31 as a double.[m
[31m-  |  b ->fff_restv[m
[31m-  |.  li SFARG1LO, 0[m
[31m-  |1:[m
[31m-  |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.  sll SFARG1HI, SFARG1HI, 1[m
[31m-  |  srl SFARG1HI, SFARG1HI, 1[m
[31m-  |// fallthrough[m
[31m-  |[m
[31m-  |->fff_restv:[m
[31m-  |  // SFARG1LO/SFARG1HI = TValue result.[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |   sw SFARG1HI, -8+HI(BASE)[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |   sw SFARG1LO, -8+LO(BASE)[m
[31m-  |->fff_res1:[m
[31m-  |  // RA = results, PC = return.[m
[31m-  |  li RD, (1+1)*8[m
[31m-  |->fff_res:[m
[31m-  |  // RA = results, RD = (nresults+1)*8, PC = return.[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |  bnez TMP0, ->vm_return[m
[31m-  |.  move MULTRES, RD[m
[31m-  |  lw INS, -4(PC)[m
[31m-  |  decode_RB8a RB, INS[m
[31m-  |  decode_RB8b RB[m
[31m-  |5:[m
[31m-  |  sltu AT, RD, RB[m
[31m-  |  bnez AT, >6			// More results expected?[m
[31m-  |.  decode_RA8a TMP0, INS[m
[31m-  |  decode_RA8b TMP0[m
[31m-  |  ins_next1[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |   subu BASE, RA, TMP0[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  addu TMP1, RA, RD[m
[31m-  |   addiu RD, RD, 8[m
[31m-  |  b <5[m
[31m-  |.  sw TISNIL, -8+HI(TMP1)[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc math_ .. func[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  load_got func[m
[31m-  |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  call_extern[m
[31m-  |.  nop[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |.  load_got func[m
[31m-  |  call_extern[m
[31m-  |.  nop[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// TODO: Return integer type if result is integer (own sf implementation).[m
[31m-  |.macro math_round, func[m
[31m-  |->ff_math_ .. func:[m
[31m-  |  lw SFARG1HI, HI(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |  beq SFARG1HI, TISNUM, ->fff_restv[m
[31m-  |.  sltu AT, SFARG1HI, TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |  bal ->vm_ .. func[m
[31m-  |.else[m
[31m-  |.  load_got func[m
[31m-  |  call_extern[m
[31m-  |.endif[m
[31m-  |.  nop[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  li AT, 8[m
[31m-  |  bne NARGS8:RC, AT, ->fff_fallback	// Exactly 1 argument.[m
[31m-  |.  lw SFARG1HI, HI(BASE)[m
[31m-  |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.  load_got log[m
[31m-  |.if FPU[m
[31m-  |  call_extern[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |  call_extern[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.if FPU[m
[31m-  |.ffunc_n math_sqrt[m
[31m-  |.  sqrt.d FRET1, FARG1[m
[31m-  |// fallthrough to ->fff_resn[m
[31m-  |.else[m
[31m-  |  math_extern sqrt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->fff_resn:[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |.if FPU[m
[31m-  |  b ->fff_res1[m
[31m-  |.  sdc1 FRET1, -8(BASE)[m
[31m-  |.else[m
[31m-  |  sw SFRETHI, -8+HI(BASE)[m
[31m-  |  b ->fff_res1[m
[31m-  |.  sw SFRETLO, -8+LO(BASE)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |[m
[31m-  |.ffunc math_ldexp[m
[31m-  |  sltiu AT, NARGS8:RC, 16[m
[31m-  |   lw SFARG1HI, HI(BASE)[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.   lw CARG4, 8+HI(BASE)[m
[31m-  |  bne CARG4, TISNUM, ->fff_fallback[m
[31m-  |  load_got ldexp[m
[31m-  |.  sltu AT, SFARG1HI, TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |.else[m
[31m-  |.  lw SFARG1LO, LO(BASE)[m
[31m-  |.endif[m
[31m-  |  call_extern[m
[31m-  |.  lw CARG3, 8+LO(BASE)[m
[31m-  |  b ->fff_resn[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |  load_got frexp[m
[31m-  |   lw PC, FRAME_PC(BASE)[m
[31m-  |  call_extern[m
[31m-  |.  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-  |   lw TMP1, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |.if FPU[m
[31m-  |   mtc1 TMP1, FARG2[m
[31m-  |  sdc1 FRET1, 0(RA)[m
[31m-  |   cvt.d.w FARG2, FARG2[m
[31m-  |   sdc1 FARG2, 8(RA)[m
[31m-  |.else[m
[31m-  |  sw SFRETLO, LO(RA)[m
[31m-  |  sw SFRETHI, HI(RA)[m
[31m-  |  sw TMP1, 8+LO(RA)[m
[31m-  |  sw TISNUM, 8+HI(RA)[m
[31m-  |.endif[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (2+1)*8[m
[31m-  |[m
[31m-  |.ffunc_n math_modf[m
[31m-  |  load_got modf[m
[31m-  |   lw PC, FRAME_PC(BASE)[m
[31m-  |  call_extern[m
[31m-  |.  addiu CARG3, BASE, -8[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |.if FPU[m
[31m-  |  sdc1 FRET1, 0(BASE)[m
[31m-  |.else[m
[31m-  |  sw SFRETLO, LO(BASE)[m
[31m-  |  sw SFRETHI, HI(BASE)[m
[31m-  |.endif[m
[31m-  |  b ->fff_res[m
[31m-  |.  li RD, (2+1)*8[m
[31m-  |[m
[31m-  |.macro math_minmax, name, intins, fpins[m
[31m-  |  .ffunc_1 name[m
[31m-  |  addu TMP3, BASE, NARGS8:RC[m
[31m-  |  bne SFARG1HI, TISNUM, >5[m
[31m-  |.  addiu TMP2, BASE, 8[m
[31m-  |1:  // Handle integers.[m
[31m-  |.  lw SFARG2HI, HI(TMP2)[m
[31m-  |  beq TMP2, TMP3, ->fff_restv[m
[31m-  |.  lw SFARG2LO, LO(TMP2)[m
[31m-  |  bne SFARG2HI, TISNUM, >3[m
[31m-  |.  slt AT, SFARG1LO, SFARG2LO[m
[31m-  |  intins SFARG1LO, SFARG2LO, AT[m
[31m-  |  b <1[m
[31m-  |.  addiu TMP2, TMP2, 8[m
[31m-  |[m
[31m-  |3:  // Convert intermediate result to number and continue with number loop.[m
[31m-  |  sltiu AT, SFARG2HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  mtc1 SFARG1LO, FRET1[m
[31m-  |  cvt.d.w FRET1, FRET1[m
[31m-  |  b >7[m
[31m-  |.  ldc1 FARG1, 0(TMP2)[m
[31m-  |.else[m
[31m-  |.  nop[m
[31m-  |  bal ->vm_sfi2d_1[m
[31m-  |.  nop[m
[31m-  |  b >7[m
[31m-  |.  nop[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |5:[m
[31m-  |.  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-  |  beqz AT, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FRET1, 0(BASE)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |6:  // Handle numbers.[m
[31m-  |.  lw SFARG2HI, HI(TMP2)[m
[31m-  |.if FPU[m
[31m-  |  beq TMP2, TMP3, ->fff_resn[m
[31m-  |.else[m
[31m-  |  beq TMP2, TMP3, ->fff_restv[m
[31m-  |.endif[m
[31m-  |.  sltiu AT, SFARG2HI, LJ_TISNUM[m
[31m-  |  beqz AT, >8[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(TMP2)[m
[31m-  |.else[m
[31m-  |.  lw SFARG2LO, LO(TMP2)[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |.if FPU[m
[31m-  |  c.olt.d FRET1, FARG1[m
[31m-  |  fpins FRET1, FARG1[m
[31m-  |.else[m
[31m-  |  bal ->vm_sfcmpolt[m
[31m-  |.  nop[m
[31m-  |  intins SFARG1LO, SFARG2LO, CRET1[m
[31m-  |  intins SFARG1HI, SFARG2HI, CRET1[m
[31m-  |.endif[m
[31m-  |  b <6[m
[31m-  |.  addiu TMP2, TMP2, 8[m
[31m-  |[m
[31m-  |8:  // Convert integer to number and continue with number loop.[m
[31m-  |  bne SFARG2HI, TISNUM, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  lwc1 FARG1, LO(TMP2)[m
[31m-  |  b <7[m
[31m-  |.  cvt.d.w FARG1, FARG1[m
[31m-  |.else[m
[31m-  |.  nop[m
[31m-  |  bal ->vm_sfi2d_2[m
[31m-  |.  nop[m
[31m-  |  b <7[m
[31m-  |.  nop[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, movz, movf.d[m
[31m-  |  math_minmax math_max, movn, movt.d[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  lw CARG3, HI(BASE)[m
[31m-  |   lw STR:CARG1, LO(BASE)[m
[31m-  |  xori AT, NARGS8:RC, 8[m
[31m-  |  addiu CARG3, CARG3, -LJ_TSTR[m
[31m-  |  or AT, AT, CARG3[m
[31m-  |  bnez AT, ->fff_fallback		// Need exactly 1 string argument.[m
[31m-  |.  nop[m
[31m-  |  lw TMP0, STR:CARG1->len[m
[31m-  |    addiu RA, BASE, -8[m
[31m-  |    lw PC, FRAME_PC(BASE)[m
[31m-  |  sltu RD, r0, TMP0[m
[31m-  |   lbu TMP1, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |  addiu RD, RD, 1[m
[31m-  |  sll RD, RD, 3			// RD = ((str->len != 0)+1)*8[m
[31m-  |  sw TISNUM, HI(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.  sw TMP1, LO(RA)[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |.  nop[m
[31m-  |  lw CARG3, HI(BASE)[m
[31m-  |   lw CARG1, LO(BASE)[m
[31m-  |  li TMP1, 255[m
[31m-  |  xori AT, NARGS8:RC, 8		// Exactly 1 argument.[m
[31m-  |  xor TMP0, CARG3, TISNUM		// Integer.[m
[31m-  |   sltu TMP1, TMP1, CARG1		// !(255 < n).[m
[31m-  |  or AT, AT, TMP0[m
[31m-  |   or AT, AT, TMP1[m
[31m-  |  bnez AT, ->fff_fallback[m
[31m-  |.  li CARG3, 1[m
[31m-  |  addiu CARG2, sp, ARG5_OFS[m
[31m-  |  sb CARG1, ARG5[m
[31m-  |->fff_newstr:[m
[31m-  |  load_got lj_str_new[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  call_intern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  lw BASE, L->base[m
[31m-  |->fff_resstr:[m
[31m-  |  move SFARG1LO, CRET1[m
[31m-  |  b ->fff_restv[m
[31m-  |.  li SFARG1HI, LJ_TSTR[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |.  nop[m
[31m-  |  addiu AT, NARGS8:RC, -16[m
[31m-  |   lw CARG3, 16+HI(BASE)[m
[31m-  |   lw TMP0, HI(BASE)[m
[31m-  |    lw STR:CARG1, LO(BASE)[m
[31m-  |  bltz AT, ->fff_fallback[m
[31m-  |.  lw CARG2, 8+HI(BASE)[m
[31m-  |  beqz AT, >1[m
[31m-  |.  li CARG4, -1[m
[31m-  |  bne CARG3, TISNUM, ->fff_fallback[m
[31m-  |.  lw CARG4, 16+LO(BASE)[m
[31m-  |1:[m
[31m-  |  bne CARG2, TISNUM, ->fff_fallback[m
[31m-  |.  li AT, LJ_TSTR[m
[31m-  |  bne TMP0, AT, ->fff_fallback[m
[31m-  |.  lw CARG3, 8+LO(BASE)[m
[31m-  |  lw CARG2, STR:CARG1->len[m
[31m-  |  // STR:CARG1 = str, CARG2 = str->len, CARG3 = start, CARG4 = end[m
[31m-  |  slt AT, CARG4, r0[m
[31m-  |  addiu TMP0, CARG2, 1[m
[31m-  |  addu TMP1, CARG4, TMP0[m
[31m-  |   slt TMP3, CARG3, r0[m
[31m-  |  movn CARG4, TMP1, AT		// if (end < 0) end += len+1[m
[31m-  |   addu TMP1, CARG3, TMP0[m
[31m-  |   movn CARG3, TMP1, TMP3		// if (start < 0) start += len+1[m
[31m-  |   li TMP2, 1[m
[31m-  |  slt AT, CARG4, r0[m
[31m-  |   slt TMP3, r0, CARG3[m
[31m-  |  movn CARG4, r0, AT			// if (end < 0) end = 0[m
[31m-  |   movz CARG3, TMP2, TMP3		// if (start < 1) start = 1[m
[31m-  |  slt AT, CARG2, CARG4[m
[31m-  |  movn CARG4, CARG2, AT		// if (end > len) end = len[m
[31m-  |   addu CARG2, STR:CARG1, CARG3[m
[31m-  |  subu CARG3, CARG4, CARG3		// len = end - start[m
[31m-  |   addiu CARG2, CARG2, sizeof(GCstr)-1[m
[31m-  |  bgez CARG3, ->fff_newstr[m
[31m-  |.  addiu CARG3, CARG3, 1		// len++[m
[31m-  |->fff_emptystr:  // Return empty string.[m
[31m-  |  addiu STR:SFARG1LO, DISPATCH, DISPATCH_GL(strempty)[m
[31m-  |  b ->fff_restv[m
[31m-  |.  li SFARG1HI, LJ_TSTR[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |.  nop[m
[31m-  |  lw CARG3, HI(BASE)[m
[31m-  |   lw STR:CARG2, LO(BASE)[m
[31m-  |  beqz NARGS8:RC, ->fff_fallback[m
[31m-  |.  li AT, LJ_TSTR[m
[31m-  |  bne CARG3, AT, ->fff_fallback[m
[31m-  |.  addiu SBUF:CARG1, DISPATCH, DISPATCH_GL(tmpbuf)[m
[31m-  |  load_got lj_buf_putstr_ .. name[m
[31m-  |  lw TMP0, SBUF:CARG1->b[m
[31m-  |   sw L, SBUF:CARG1->L[m
[31m-  |   sw BASE, L->base[m
[31m-  |  sw TMP0, SBUF:CARG1->p[m
[31m-  |  call_intern extern lj_buf_putstr_ .. name[m
[31m-  |.  sw PC, SAVE_PC[m
[31m-  |  load_got lj_buf_tostr[m
[31m-  |  call_intern lj_buf_tostr[m
[31m-  |.  move SBUF:CARG1, SBUF:CRET1[m
[31m-  |  b ->fff_resstr[m
[31m-  |.  lw BASE, L->base[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_tobit_fb:[m
[31m-  |  beqz TMP1, ->fff_fallback[m
[31m-  |.if FPU[m
[31m-  |.  ldc1 FARG1, 0(BASE)[m
[31m-  |  add.d FARG1, FARG1, TOBIT[m
[31m-  |  jr ra[m
[31m-  |.  mfc1 CRET1, FARG1[m
[31m-  |.else[m
[31m-  |// FP number to bit conversion for soft-float.[m
[31m-  |->vm_tobit:[m
[31m-  |  sll TMP0, SFARG1HI, 1[m
[31m-  |  lui AT, 0x0020[m
[31m-  |  addu TMP0, TMP0, AT[m
[31m-  |  slt AT, TMP0, r0[m
[31m-  |  movz SFARG1LO, r0, AT[m
[31m-  |  beqz AT, >2[m
[31m-  |.  li TMP1, 0x3e0[m
[31m-  |  not TMP1, TMP1[m
[31m-  |  sra TMP0, TMP0, 21[m
[31m-  |  subu TMP0, TMP1, TMP0[m
[31m-  |  slt AT, TMP0, r0[m
[31m-  |  bnez AT, >1[m
[31m-  |.  sll TMP1, SFARG1HI, 11[m
[31m-  |  lui AT, 0x8000[m
[31m-  |  or TMP1, TMP1, AT[m
[31m-  |  srl AT, SFARG1LO, 21[m
[31m-  |  or TMP1, TMP1, AT[m
[31m-  |  slt AT, SFARG1HI, r0[m
[31m-  |  beqz AT, >2[m
[31m-  |.  srlv SFARG1LO, TMP1, TMP0[m
[31m-  |  subu SFARG1LO, r0, SFARG1LO[m
[31m-  |2:[m
[31m-  |  jr ra[m
[31m-  |.  move CRET1, SFARG1LO[m
[31m-  |1:[m
[31m-  |  addiu TMP0, TMP0, 21[m
[31m-  |  srlv TMP1, SFARG1LO, TMP0[m
[31m-  |  li AT, 20[m
[31m-  |  subu TMP0, AT, TMP0[m
[31m-  |  sll SFARG1LO, SFARG1HI, 12[m
[31m-  |  sllv AT, SFARG1LO, TMP0[m
[31m-  |  or SFARG1LO, TMP1, AT[m
[31m-  |  slt AT, SFARG1HI, r0[m
[31m-  |  beqz AT, <2[m
[31m-  |.  nop[m
[31m-  |  jr ra[m
[31m-  |.  subu CRET1, r0, SFARG1LO[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name[m
[31m-  |  .ffunc_1 bit_..name[m
[31m-  |  beq SFARG1HI, TISNUM, >6[m
[31m-  |.  move CRET1, SFARG1LO[m
[31m-  |  bal ->vm_tobit_fb[m
[31m-  |.  sltu TMP1, SFARG1HI, TISNUM[m
[31m-  |6:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name[m
[31m-  |  addiu TMP2, BASE, 8[m
[31m-  |  addu TMP3, BASE, NARGS8:RC[m
[31m-  |1:[m
[31m-  |  lw SFARG1HI, HI(TMP2)[m
[31m-  |  beq TMP2, TMP3, ->fff_resi[m
[31m-  |.  lw SFARG1LO, LO(TMP2)[m
[31m-  |.if FPU[m
[31m-  |  bne SFARG1HI, TISNUM, >2[m
[31m-  |.  addiu TMP2, TMP2, 8[m
[31m-  |  b <1[m
[31m-  |.  ins CRET1, CRET1, SFARG1LO[m
[31m-  |2:[m
[31m-  |   ldc1 FARG1, -8(TMP2)[m
[31m-  |  sltu TMP1, SFARG1HI, TISNUM[m
[31m-  |  beqz TMP1, ->fff_fallback[m
[31m-  |.  add.d FARG1, FARG1, TOBIT[m
[31m-  |  mfc1 SFARG1LO, FARG1[m
[31m-  |  b <1[m
[31m-  |.  ins CRET1, CRET1, SFARG1LO[m
[31m-  |.else[m
[31m-  |  beq SFARG1HI, TISNUM, >2[m
[31m-  |.  move CRET2, CRET1[m
[31m-  |  bal ->vm_tobit_fb[m
[31m-  |.  sltu TMP1, SFARG1HI, TISNUM[m
[31m-  |  move SFARG1LO, CRET2[m
[31m-  |2:[m
[31m-  |  ins CRET1, CRET1, SFARG1LO[m
[31m-  |  b <1[m
[31m-  |.  addiu TMP2, TMP2, 8[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op band, and[m
[31m-  |.ffunc_bit_op bor, or[m
[31m-  |.ffunc_bit_op bxor, xor[m
[31m-  |[m
[31m-  |.ffunc_bit bswap[m
[31m-  |  srl TMP0, CRET1, 24[m
[31m-  |   srl TMP2, CRET1, 8[m
[31m-  |  sll TMP1, CRET1, 24[m
[31m-  |   andi TMP2, TMP2, 0xff00[m
[31m-  |  or TMP0, TMP0, TMP1[m
[31m-  |   andi CRET1, CRET1, 0xff00[m
[31m-  |  or TMP0, TMP0, TMP2[m
[31m-  |   sll CRET1, CRET1, 8[m
[31m-  |  b ->fff_resi[m
[31m-  |.  or CRET1, TMP0, CRET1[m
[31m-  |[m
[31m-  |.ffunc_bit bnot[m
[31m-  |  b ->fff_resi[m
[31m-  |.  not CRET1, CRET1[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins, shmod[m
[31m-  |  .ffunc_2 bit_..name[m
[31m-  |  beq SFARG1HI, TISNUM, >1[m
[31m-  |.  nop[m
[31m-  |  bal ->vm_tobit_fb[m
[31m-  |.  sltu TMP1, SFARG1HI, TISNUM[m
[31m-  |  move SFARG1LO, CRET1[m
[31m-  |1:[m
[31m-  |  bne SFARG2HI, TISNUM, ->fff_fallback[m
[31m-  |.  nop[m
[31m-  |.if shmod == 1[m
[31m-  |  li AT, 32[m
[31m-  |  subu TMP0, AT, SFARG2LO[m
[31m-  |  sllv SFARG2LO, SFARG1LO, SFARG2LO[m
[31m-  |  srlv SFARG1LO, SFARG1LO, TMP0[m
[31m-  |.elif shmod == 2[m
[31m-  |  li AT, 32[m
[31m-  |  subu TMP0, AT, SFARG2LO[m
[31m-  |  srlv SFARG2LO, SFARG1LO, SFARG2LO[m
[31m-  |  sllv SFARG1LO, SFARG1LO, TMP0[m
[31m-  |.endif[m
[31m-  |  b ->fff_resi[m
[31m-  |.  ins CRET1, SFARG1LO, SFARG2LO[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh lshift, sllv, 0[m
[31m-  |.ffunc_bit_sh rshift, srlv, 0[m
[31m-  |.ffunc_bit_sh arshift, srav, 0[m
[31m-  |// Can't use rotrv, since it's only in MIPS32R2.[m
[31m-  |.ffunc_bit_sh rol, or, 1[m
[31m-  |.ffunc_bit_sh ror, or, 2[m
[31m-  |[m
[31m-  |.ffunc_bit tobit[m
[31m-  |->fff_resi:[m
[31m-  |  lw PC, FRAME_PC(BASE)[m
[31m-  |  addiu RA, BASE, -8[m
[31m-  |  sw TISNUM, -8+HI(BASE)[m
[31m-  |  b ->fff_res1[m
[31m-  |.  sw CRET1, -8+LO(BASE)[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RB = CFUNC, RC = nargs*8[m
[31m-  |  lw TMP3, CFUNC:RB->f[m
[31m-  |    addu TMP1, BASE, NARGS8:RC[m
[31m-  |   lw PC, FRAME_PC(BASE)		// Fallback may overwrite PC.[m
[31m-  |    addiu TMP0, TMP1, 8*LUA_MINSTACK[m
[31m-  |     lw TMP2, L->maxstack[m
[31m-  |   sw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  sltu AT, TMP2, TMP0[m
[31m-  |     sw BASE, L->base[m
[31m-  |    sw TMP1, L->top[m
[31m-  |  bnez AT, >5			// Need to grow stack.[m
[31m-  |.  move CFUNCADDR, TMP3[m
[31m-  |  jalr TMP3				// (lua_State *L)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |  lw BASE, L->base[m
[31m-  |   sll RD, CRET1, 3[m
[31m-  |  bgtz CRET1, ->fff_res		// Returned nresults+1?[m
[31m-  |.  addiu RA, BASE, -8[m
[31m-  |1:  // Returned 0 or -1: retry fast path.[m
[31m-  |  lw TMP0, L->top[m
[31m-  |   lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  bnez CRET1, ->vm_call_tail		// Returned -1?[m
[31m-  |.  subu NARGS8:RC, TMP0, BASE[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  andi TMP0, PC, FRAME_TYPE[m
[31m-  |   li AT, -4[m
[31m-  |  bnez TMP0, >3[m
[31m-  |.  and TMP1, PC, AT[m
[31m-  |  lbu TMP1, OFS_RA(PC)[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  addiu TMP1, TMP1, 8[m
[31m-  |3:[m
[31m-  |  b ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |.  subu TMP2, BASE, TMP1[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  load_got lj_state_growstack[m
[31m-  |  li CARG2, LUA_MINSTACK[m
[31m-  |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |.  move CARG1, L[m
[31m-  |  lw BASE, L->base[m
[31m-  |  b <1[m
[31m-  |.  li CRET1, 0			// Force retry.[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |  move MULTRES, ra[m
[31m-  |  load_got lj_gc_step[m
[31m-  |   sw BASE, L->base[m
[31m-  |  addu TMP0, BASE, NARGS8:RC[m
[31m-  |   sw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  sw TMP0, L->top[m
[31m-  |  call_intern lj_gc_step		// (lua_State *L)[m
[31m-  |.  move CARG1, L[m
[31m-  |   lw BASE, L->base[m
[31m-  |  move ra, MULTRES[m
[31m-  |    lw TMP0, L->top[m
[31m-  |  lw CFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  jr ra[m
[31m-  |.  subu NARGS8:RC, TMP0, BASE[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  andi AT, TMP3, HOOK_VMEVENT	// No recording while in vmevent.[m
[31m-  |  bnez AT, >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |.  lw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andi AT, TMP3, HOOK_ACTIVE[m
[31m-  |  bnez AT, >1[m
[31m-  |.  addiu TMP2, TMP2, -1[m
[31m-  |  andi AT, TMP3, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beqz AT, >1[m
[31m-  |.  nop[m
[31m-  |  b >1[m
[31m-  |.  sw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  andi AT, TMP3, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  beqz AT, >1[m
[31m-  |5:  // Re-dispatch to static ins.[m
[31m-  |.  lw AT, GG_DISP2STATIC(TMP0)	// Assumes TMP0 holds DISPATCH+OP*4.[m
[31m-  |  jr AT[m
[31m-  |.  nop[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  lw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andi AT, TMP3, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  bnez AT, <5[m
[31m-  |.  andi AT, TMP3, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beqz AT, <5[m
[31m-  |.  addiu TMP2, TMP2, -1[m
[31m-  |  beqz TMP2, >1[m
[31m-  |.  sw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andi AT, TMP3, LUA_MASKLINE[m
[31m-  |  beqz AT, <5[m
[31m-  |1:[m
[31m-  |.  load_got lj_dispatch_ins[m
[31m-  |   sw MULTRES, SAVE_MULTRES[m
[31m-  |  move CARG2, PC[m
[31m-  |   sw BASE, L->base[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  call_intern lj_dispatch_ins	// (lua_State *L, const BCIns *pc)[m
[31m-  |.  move CARG1, L[m
[31m-  |3:[m
[31m-  |  lw BASE, L->base[m
[31m-  |4:  // Re-dispatch to static ins.[m
[31m-  |  lw INS, -4(PC)[m
[31m-  |  decode_OP4a TMP1, INS[m
[31m-  |  decode_OP4b TMP1[m
[31m-  |  addu TMP0, DISPATCH, TMP1[m
[31m-  |   decode_RD8a RD, INS[m
[31m-  |  lw AT, GG_DISP2STATIC(TMP0)[m
[31m-  |   decode_RA8a RA, INS[m
[31m-  |   decode_RD8b RD[m
[31m-  |  jr AT[m
[31m-  |   decode_RA8b RA[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  addiu PC, PC, 4[m
[31m-  |  b <4[m
[31m-  |.  lw MULTRES, -24+LO(RB)		// Restore MULTRES for *M ins.[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  lw LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-  |   addiu CARG1, DISPATCH, GG_DISP2J[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |  lw TMP1, LFUNC:TMP1->pc[m
[31m-  |   move CARG2, PC[m
[31m-  |   sw L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  lbu TMP1, PC2PROTO(framesize)(TMP1)[m
[31m-  |  load_got lj_trace_hot[m
[31m-  |   sw BASE, L->base[m
[31m-  |  sll TMP1, TMP1, 3[m
[31m-  |  addu TMP1, BASE, TMP1[m
[31m-  |  call_intern lj_trace_hot		// (jit_State *J, const BCIns *pc)[m
[31m-  |.  sw TMP1, L->top[m
[31m-  |  b <3[m
[31m-  |.  nop[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |.if JIT[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |.  move CARG2, PC[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  ori CARG2, PC, 1[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  load_got lj_dispatch_call[m
[31m-  |  addu TMP0, BASE, RC[m
[31m-  |   sw PC, SAVE_PC[m
[31m-  |   sw BASE, L->base[m
[31m-  |  subu RA, RA, BASE[m
[31m-  |   sw TMP0, L->top[m
[31m-  |  call_intern lj_dispatch_call	// (lua_State *L, const BCIns *pc)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // Returns ASMFunction.[m
[31m-  |  lw BASE, L->base[m
[31m-  |   lw TMP0, L->top[m
[31m-  |   sw r0, SAVE_PC			// Invalidate for subsequent line hook.[m
[31m-  |  subu NARGS8:RC, TMP0, BASE[m
[31m-  |  addu RA, BASE, RA[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  jr CRET1[m
[31m-  |.  lw INS, -4(PC)[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // RA = resultptr, RB = meta base[m
[31m-  |  lw INS, -4(PC)[m
[31m-  |    lw TMP2, -24+LO(RB)		// Save previous trace.[m
[31m-  |  decode_RA8a RC, INS[m
[31m-  |   addiu AT, MULTRES, -8[m
[31m-  |  decode_RA8b RC[m
[31m-  |   beqz AT, >2[m
[31m-  |. addu RC, BASE, RC			// Call base.[m
[31m-  |1:  // Move results down.[m
[31m-  |  lw SFRETHI, HI(RA)[m
[31m-  |   lw SFRETLO, LO(RA)[m
[31m-  |   addiu AT, AT, -8[m
[31m-  |    addiu RA, RA, 8[m
[31m-  |  sw SFRETHI, HI(RC)[m
[31m-  |   sw SFRETLO, LO(RC)[m
[31m-  |   bnez AT, <1[m
[31m-  |.   addiu RC, RC, 8[m
[31m-  |2:[m
[31m-  |   decode_RA8a RA, INS[m
[31m-  |    decode_RB8a RB, INS[m
[31m-  |   decode_RA8b RA[m
[31m-  |    decode_RB8b RB[m
[31m-  |   addu RA, RA, RB[m
[31m-  |   addu RA, BASE, RA[m
[31m-  |3:[m
[31m-  |   sltu AT, RC, RA[m
[31m-  |   bnez AT, >9			// More results wanted?[m
[31m-  |.   nop[m
[31m-  |[m
[31m-  |  lhu TMP3, TRACE:TMP2->traceno[m
[31m-  |  lhu RD, TRACE:TMP2->link[m
[31m-  |  beq RD, TMP3, ->cont_nop		// Blacklisted.[m
[31m-  |.  load_got lj_dispatch_stitch[m
[31m-  |  bnez RD, =>BC_JLOOP		// Jump to stitched trace.[m
[31m-  |.  sll RD, RD, 3[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  sw TMP3, DISPATCH_J(exitno)(DISPATCH)[m
[31m-  |  sw L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  sw BASE, L->base[m
[31m-  |  addiu CARG1, DISPATCH, GG_DISP2J[m
[31m-  |  call_intern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)[m
[31m-  |.  move CARG2, PC[m
[31m-  |  b ->cont_nop[m
[31m-  |.  lw BASE, L->base[m
[31m-  |[m
[31m-  |9:[m
[31m-  |  sw TISNIL, HI(RC)[m
[31m-  |  b <3[m
[31m-  |.  addiu RC, RC, 8[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  load_got lj_dispatch_profile[m
[31m-  |   sw MULTRES, SAVE_MULTRES[m
[31m-  |  move CARG2, PC[m
[31m-  |   sw BASE, L->base[m
[31m-  |  call_intern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |.  move CARG1, L[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  addiu PC, PC, -4[m
[31m-  |  b ->cont_nop[m
[31m-  |.  lw BASE, L->base[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro savex_, a, b[m
[31m-  |.if FPU[m
[31m-  |  sdc1 f..a, 16+a*8(sp)[m
[31m-  |  sw r..a, 16+32*8+a*4(sp)[m
[31m-  |  sw r..b, 16+32*8+b*4(sp)[m
[31m-  |.else[m
[31m-  |  sw r..a, 16+a*4(sp)[m
[31m-  |  sw r..b, 16+b*4(sp)[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |.if FPU[m
[31m-  |  addiu sp, sp, -(16+32*8+32*4)[m
[31m-  |.else[m
[31m-  |  addiu sp, sp, -(16+32*4)[m
[31m-  |.endif[m
[31m-  |  savex_ 0, 1[m
[31m-  |  savex_ 2, 3[m
[31m-  |  savex_ 4, 5[m
[31m-  |  savex_ 6, 7[m
[31m-  |  savex_ 8, 9[m
[31m-  |  savex_ 10, 11[m
[31m-  |  savex_ 12, 13[m
[31m-  |  savex_ 14, 15[m
[31m-  |  savex_ 16, 17[m
[31m-  |  savex_ 18, 19[m
[31m-  |  savex_ 20, 21[m
[31m-  |  savex_ 22, 23[m
[31m-  |  savex_ 24, 25[m
[31m-  |  savex_ 26, 27[m
[31m-  |.if FPU[m
[31m-  |  sdc1 f28, 16+28*8(sp)[m
[31m-  |  sdc1 f30, 16+30*8(sp)[m
[31m-  |  sw r28, 16+32*8+28*4(sp)[m
[31m-  |  sw r30, 16+32*8+30*4(sp)[m
[31m-  |  sw r0, 16+32*8+31*4(sp)		// Clear RID_TMP.[m
[31m-  |  addiu TMP2, sp, 16+32*8+32*4	// Recompute original value of sp.[m
[31m-  |  sw TMP2, 16+32*8+29*4(sp)		// Store sp in RID_SP[m
[31m-  |.else[m
[31m-  |  sw r28, 16+28*4(sp)[m
[31m-  |  sw r30, 16+30*4(sp)[m
[31m-  |  sw r0, 16+31*4(sp)			// Clear RID_TMP.[m
[31m-  |  addiu TMP2, sp, 16+32*4		// Recompute original value of sp.[m
[31m-  |  sw TMP2, 16+29*4(sp)		// Store sp in RID_SP[m
[31m-  |.endif[m
[31m-  |  li_vmstate EXIT[m
[31m-  |  addiu DISPATCH, JGL, -GG_DISP2G-32768[m
[31m-  |  lw TMP1, 0(TMP2)			// Load exit number.[m
[31m-  |  st_vmstate[m
[31m-  |  lw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |   lw BASE, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  load_got lj_trace_exit[m
[31m-  |  sw L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  sw ra, DISPATCH_J(parent)(DISPATCH)  // Store trace number.[m
[31m-  |   sw BASE, L->base[m
[31m-  |  sw TMP1, DISPATCH_J(exitno)(DISPATCH)  // Store exit number.[m
[31m-  |  addiu CARG1, DISPATCH, GG_DISP2J[m
[31m-  |   sw r0, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  call_intern lj_trace_exit		// (jit_State *J, ExitState *ex)[m
[31m-  |.  addiu CARG2, sp, 16[m
[31m-  |  // Returns MULTRES (unscaled) or negated error code.[m
[31m-  |  lw TMP1, L->cframe[m
[31m-  |  li AT, -4[m
[31m-  |   lw BASE, L->base[m
[31m-  |  and sp, TMP1, AT[m
[31m-  |   lw PC, SAVE_PC			// Get SAVE_PC.[m
[31m-  |  b >1[m
[31m-  |.  sw L, SAVE_L			// Set SAVE_L (on-trace resume/yield).[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |.if JIT[m
[31m-  |  // CRET1 = MULTRES or negated error code, BASE, PC and JGL set.[m
[31m-  |  lw L, SAVE_L[m
[31m-  |   addiu DISPATCH, JGL, -GG_DISP2G-32768[m
[31m-  |  sw BASE, L->base[m
[31m-  |1:[m
[31m-  |  bltz CRET1, >9			// Check for error from exit.[m
[31m-  |.  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |    .FPU lui TMP3, 0x59c0			// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |  sll MULTRES, CRET1, 3[m
[31m-  |    li TISNIL, LJ_TNIL[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |  sw MULTRES, SAVE_MULTRES[m
[31m-  |    .FPU mtc1 TMP3, TOBIT[m
[31m-  |  lw TMP1, LFUNC:RB->pc[m
[31m-  |   sw r0, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |    .FPU cvt.d.s TOBIT, TOBIT[m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  lw INS, 0(PC)[m
[31m-  |   addiu PC, PC, 4[m
[31m-  |    // Assumes TISNIL == ~LJ_VMST_INTERP == -1[m
[31m-  |    sw TISNIL, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-  |  decode_OP4a TMP1, INS[m
[31m-  |  decode_OP4b TMP1[m
[31m-  |    sltiu TMP2, TMP1, BC_FUNCF*4[m
[31m-  |  addu TMP0, DISPATCH, TMP1[m
[31m-  |   decode_RD8a RD, INS[m
[31m-  |  lw AT, 0(TMP0)[m
[31m-  |   decode_RA8a RA, INS[m
[31m-  |    beqz TMP2, >2[m
[31m-  |.  decode_RA8b RA[m
[31m-  |  jr AT[m
[31m-  |.  decode_RD8b RD[m
[31m-  |2:[m
[31m-  |  sltiu TMP2, TMP1, (BC_FUNCC+2)*4	// Fast function?[m
[31m-  |  bnez TMP2, >3[m
[31m-  |.  lw TMP1, FRAME_PC(BASE)[m
[31m-  |  // Check frame below fast function.[m
[31m-  |  andi TMP0, TMP1, FRAME_TYPE[m
[31m-  |  bnez TMP0, >3			// Trace stitching continuation?[m
[31m-  |.  nop[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  lw TMP2, -4(TMP1)[m
[31m-  |  decode_RA8a TMP0, TMP2[m
[31m-  |  decode_RA8b TMP0[m
[31m-  |  subu TMP1, BASE, TMP0[m
[31m-  |  lw LFUNC:TMP2, -8+FRAME_FUNC(TMP1)[m
[31m-  |  lw TMP1, LFUNC:TMP2->pc[m
[31m-  |  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |3:[m
[31m-  |  addiu RC, MULTRES, -8[m
[31m-  |  jr AT[m
[31m-  |.  addu RA, RA, BASE[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  load_got lj_err_throw[m
[31m-  |  negu CARG2, CRET1[m
[31m-  |  call_intern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.  move CARG1, L[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Hard-float round to integer.[m
[31m-  |// Modifies AT, TMP0, FRET1, FRET2, f4. Keeps all others incl. FARG1.[m
[31m-  |.macro vm_round_hf, func[m
[31m-  |  lui TMP0, 0x4330			// Hiword of 2^52 (double).[m
[31m-  |  mtc1 r0, f4[m
[31m-  |  mtc1 TMP0, f5[m
[31m-  |  abs.d FRET2, FARG1			// |x|[m
[31m-  |    mfc1 AT, f13[m
[31m-  |  c.olt.d 0, FRET2, f4[m
[31m-  |   add.d FRET1, FRET2, f4		// (|x| + 2^52) - 2^52[m
[31m-  |  bc1f 0, >1				// Truncate only if |x| < 2^52.[m
[31m-  |.  sub.d FRET1, FRET1, f4[m
[31m-  |    slt AT, AT, r0[m
[31m-  |.if "func" == "ceil"[m
[31m-  |   lui TMP0, 0xbff0			// Hiword of -1 (double). Preserves -0.[m
[31m-  |.else[m
[31m-  |   lui TMP0, 0x3ff0			// Hiword of +1 (double).[m
[31m-  |.endif[m
[31m-  |.if "func" == "trunc"[m
[31m-  |   mtc1 TMP0, f5[m
[31m-  |  c.olt.d 0, FRET2, FRET1		// |x| < result?[m
[31m-  |   sub.d FRET2, FRET1, f4[m
[31m-  |  movt.d FRET1, FRET2, 0		// If yes, subtract +1.[m
[31m-  |  neg.d FRET2, FRET1[m
[31m-  |  jr ra[m
[31m-  |.  movn.d FRET1, FRET2, AT		// Merge sign bit back in.[m
[31m-  |.else[m
[31m-  |  neg.d FRET2, FRET1[m
[31m-  |   mtc1 TMP0, f5[m
[31m-  |  movn.d FRET1, FRET2, AT		// Merge sign bit back in.[m
[31m-  |.if "func" == "ceil"[m
[31m-  |  c.olt.d 0, FRET1, FARG1		// x > result?[m
[31m-  |.else[m
[31m-  |  c.olt.d 0, FARG1, FRET1		// x < result?[m
[31m-  |.endif[m
[31m-  |   sub.d FRET2, FRET1, f4		// If yes, subtract +-1.[m
[31m-  |  jr ra[m
[31m-  |.  movt.d FRET1, FRET2, 0[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  jr ra[m
[31m-  |.  mov.d FRET1, FARG1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro vm_round, func[m
[31m-  |.if FPU[m
[31m-  |  vm_round_hf, func[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |->vm_floor:[m
[31m-  |  vm_round floor[m
[31m-  |->vm_ceil:[m
[31m-  |  vm_round ceil[m
[31m-  |->vm_trunc:[m
[31m-  |.if JIT[m
[31m-  |  vm_round trunc[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |// Soft-float integer to number conversion.[m
[31m-  |.macro sfi2d, AHI, ALO[m
[31m-  |.if not FPU[m
[31m-  |  beqz ALO, >9			// Handle zero first.[m
[31m-  |.  sra TMP0, ALO, 31[m
[31m-  |  xor TMP1, ALO, TMP0[m
[31m-  |  subu TMP1, TMP1, TMP0		// Absolute value in TMP1.[m
[31m-  |  clz AHI, TMP1[m
[31m-  |    andi TMP0, TMP0, 0x800		// Mask sign bit.[m
[31m-  |  li AT, 0x3ff+31-1[m
[31m-  |   sllv TMP1, TMP1, AHI		// Align mantissa left with leading 1.[m
[31m-  |  subu AHI, AT, AHI			// Exponent - 1 in AHI.[m
[31m-  |   sll ALO, TMP1, 21[m
[31m-  |  or AHI, AHI, TMP0			// Sign | Exponent.[m
[31m-  |   srl TMP1, TMP1, 11[m
[31m-  |  sll AHI, AHI, 20			// Align left.[m
[31m-  |  jr ra[m
[31m-  |.  addu AHI, AHI, TMP1		// Add mantissa, increment exponent.[m
[31m-  |9:[m
[31m-  |  jr ra[m
[31m-  |.  li AHI, 0[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Input SFARG1LO. Output: SFARG1*. Temporaries: AT, TMP0, TMP1.[m
[31m-  |->vm_sfi2d_1:[m
[31m-  |  sfi2d SFARG1HI, SFARG1LO[m
[31m-  |[m
[31m-  |// Input SFARG2LO. Output: SFARG2*. Temporaries: AT, TMP0, TMP1.[m
[31m-  |->vm_sfi2d_2:[m
[31m-  |  sfi2d SFARG2HI, SFARG2LO[m
[31m-  |[m
[31m-  |// Soft-float comparison. Equivalent to c.eq.d.[m
[31m-  |// Input: SFARG*. Output: CRET1. Temporaries: AT, TMP0, TMP1.[m
[31m-  |->vm_sfcmpeq:[m
[31m-  |.if not FPU[m
[31m-  |  sll AT, SFARG1HI, 1[m
[31m-  |  sll TMP0, SFARG2HI, 1[m
[31m-  |  or CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  or TMP1, TMP1, CRET1[m
[31m-  |  beqz TMP1, >8			// Both args +-0: return 1.[m
[31m-  |.  sltu CRET1, r0, SFARG1LO[m
[31m-  |  lui TMP1, 0xffe0[m
[31m-  |  addu AT, AT, CRET1[m
[31m-  |   sltu CRET1, r0, SFARG2LO[m
[31m-  |  sltu AT, TMP1, AT[m
[31m-  |   addu TMP0, TMP0, CRET1[m
[31m-  |   sltu TMP0, TMP1, TMP0[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  bnez TMP1, >9			// Either arg is NaN: return 0;[m
[31m-  |.  xor TMP0, SFARG1HI, SFARG2HI[m
[31m-  |  xor TMP1, SFARG1LO, SFARG2LO[m
[31m-  |  or AT, TMP0, TMP1[m
[31m-  |  jr ra[m
[31m-  |.  sltiu CRET1, AT, 1		// Same values: return 1.[m
[31m-  |8:[m
[31m-  |  jr ra[m
[31m-  |.  li CRET1, 1[m
[31m-  |9:[m
[31m-  |  jr ra[m
[31m-  |.  li CRET1, 0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |// Soft-float comparison. Equivalent to c.ult.d and c.olt.d.[m
[31m-  |// Input: SFARG*. Output: CRET1. Temporaries: AT, TMP0, TMP1, CRET2.[m
[31m-  |->vm_sfcmpult:[m
[31m-  |.if not FPU[m
[31m-  |  b >1[m
[31m-  |.  li CRET2, 1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_sfcmpolt:[m
[31m-  |.if not FPU[m
[31m-  |  li CRET2, 0[m
[31m-  |1:[m
[31m-  |  sll AT, SFARG1HI, 1[m
[31m-  |  sll TMP0, SFARG2HI, 1[m
[31m-  |  or CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  or TMP1, TMP1, CRET1[m
[31m-  |  beqz TMP1, >8			// Both args +-0: return 0.[m
[31m-  |.  sltu CRET1, r0, SFARG1LO[m
[31m-  |  lui TMP1, 0xffe0[m
[31m-  |  addu AT, AT, CRET1[m
[31m-  |   sltu CRET1, r0, SFARG2LO[m
[31m-  |  sltu AT, TMP1, AT[m
[31m-  |   addu TMP0, TMP0, CRET1[m
[31m-  |   sltu TMP0, TMP1, TMP0[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  bnez TMP1, >9			// Either arg is NaN: return 0 or 1;[m
[31m-  |.  and AT, SFARG1HI, SFARG2HI[m
[31m-  |  bltz AT, >5			// Both args negative?[m
[31m-  |.  nop[m
[31m-  |  beq SFARG1HI, SFARG2HI, >8[m
[31m-  |.  sltu CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  jr ra[m
[31m-  |.  slt CRET1, SFARG1HI, SFARG2HI[m
[31m-  |5:  // Swap conditions if both operands are negative.[m
[31m-  |  beq SFARG1HI, SFARG2HI, >8[m
[31m-  |.  sltu CRET1, SFARG2LO, SFARG1LO[m
[31m-  |  jr ra[m
[31m-  |.  slt CRET1, SFARG2HI, SFARG1HI[m
[31m-  |8:[m
[31m-  |  jr ra[m
[31m-  |.  nop[m
[31m-  |9:[m
[31m-  |  jr ra[m
[31m-  |.  move CRET1, CRET2[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |// Soft-float comparison. Equivalent to c.ole.d a, b or c.ole.d b, a.[m
[31m-  |// Input: SFARG*, TMP3. Output: CRET1. Temporaries: AT, TMP0, TMP1.[m
[31m-  |->vm_sfcmpolex:[m
[31m-  |.if not FPU[m
[31m-  |  sll AT, SFARG1HI, 1[m
[31m-  |  sll TMP0, SFARG2HI, 1[m
[31m-  |  or CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  or TMP1, TMP1, CRET1[m
[31m-  |  beqz TMP1, >8			// Both args +-0: return 1.[m
[31m-  |.  sltu CRET1, r0, SFARG1LO[m
[31m-  |  lui TMP1, 0xffe0[m
[31m-  |  addu AT, AT, CRET1[m
[31m-  |   sltu CRET1, r0, SFARG2LO[m
[31m-  |  sltu AT, TMP1, AT[m
[31m-  |   addu TMP0, TMP0, CRET1[m
[31m-  |   sltu TMP0, TMP1, TMP0[m
[31m-  |  or TMP1, AT, TMP0[m
[31m-  |  bnez TMP1, >9			// Either arg is NaN: return 0;[m
[31m-  |.  and AT, SFARG1HI, SFARG2HI[m
[31m-  |  xor AT, AT, TMP3[m
[31m-  |  bltz AT, >5			// Both args negative?[m
[31m-  |.  nop[m
[31m-  |  beq SFARG1HI, SFARG2HI, >6[m
[31m-  |.  sltu CRET1, SFARG2LO, SFARG1LO[m
[31m-  |  jr ra[m
[31m-  |.  slt CRET1, SFARG2HI, SFARG1HI[m
[31m-  |5:  // Swap conditions if both operands are negative.[m
[31m-  |  beq SFARG1HI, SFARG2HI, >6[m
[31m-  |.  sltu CRET1, SFARG1LO, SFARG2LO[m
[31m-  |  slt CRET1, SFARG1HI, SFARG2HI[m
[31m-  |6:[m
[31m-  |  jr ra[m
[31m-  |.  nop[m
[31m-  |8:[m
[31m-  |  jr ra[m
[31m-  |.  li CRET1, 1[m
[31m-  |9:[m
[31m-  |  jr ra[m
[31m-  |.  li CRET1, 0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.macro sfmin_max, name, intins[m
[31m-  |->vm_sf .. name:[m
[31m-  |.if JIT and not FPU[m
[31m-  |  move TMP2, ra[m
[31m-  |  bal ->vm_sfcmpolt[m
[31m-  |.  nop[m
[31m-  |  move TMP0, CRET1[m
[31m-  |  move SFRETHI, SFARG1HI[m
[31m-  |   move SFRETLO, SFARG1LO[m
[31m-  |  move ra, TMP2[m
[31m-  |  intins SFRETHI, SFARG2HI, TMP0[m
[31m-  |  jr ra[m
[31m-  |.  intins SFRETLO, SFARG2LO, TMP0[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  sfmin_max min, movz[m
[31m-  |  sfmin_max max, movn[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions. Callback slot number in r1, g in r2.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  saveregs[m
[31m-  |  lw CTSTATE, GL:r2->ctype_state[m
[31m-  |   addiu DISPATCH, r2, GG_G2DISP[m
[31m-  |  load_got lj_ccallback_enter[m
[31m-  |  sw r1, CTSTATE->cb.slot[m
[31m-  |  sw CARG1, CTSTATE->cb.gpr[0][m
[31m-  |  sw CARG2, CTSTATE->cb.gpr[1][m
[31m-  |   .FPU sdc1 FARG1, CTSTATE->cb.fpr[0][m
[31m-  |  sw CARG3, CTSTATE->cb.gpr[2][m
[31m-  |  sw CARG4, CTSTATE->cb.gpr[3][m
[31m-  |   .FPU sdc1 FARG2, CTSTATE->cb.fpr[1][m
[31m-  |  addiu TMP0, sp, CFRAME_SPACE+16[m
[31m-  |  sw TMP0, CTSTATE->cb.stack[m
[31m-  |  sw r0, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   move CARG2, sp[m
[31m-  |  call_intern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |.  move CARG1, CTSTATE[m
[31m-  |  // Returns lua_State *.[m
[31m-  |  lw BASE, L:CRET1->base[m
[31m-  |  lw RC, L:CRET1->top[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |   move L, CRET1[m
[31m-  |     .FPU lui TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |     .FPU mtc1 TMP3, TOBIT[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |  subu RC, RC, BASE[m
[31m-  |    st_vmstate[m
[31m-  |     .FPU cvt.d.s TOBIT, TOBIT[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  load_got lj_ccallback_leave[m
[31m-  |  lw CTSTATE, DISPATCH_GL(ctype_state)(DISPATCH)[m
[31m-  |   sw BASE, L->base[m
[31m-  |   sw RB, L->top[m
[31m-  |  sw L, CTSTATE->L[m
[31m-  |  move CARG2, RA[m
[31m-  |  call_intern lj_ccallback_leave	// (CTState *cts, TValue *o)[m
[31m-  |.  move CARG1, CTSTATE[m
[31m-  |   .FPU ldc1 FRET1, CTSTATE->cb.fpr[0][m
[31m-  |  lw CRET1, CTSTATE->cb.gpr[0][m
[31m-  |   .FPU ldc1 FRET2, CTSTATE->cb.fpr[1][m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.  lw CRET2, CTSTATE->cb.gpr[1][m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, CARG1[m
[31m-  |  lw TMP1, CCSTATE->spadj[m
[31m-  |   lbu CARG2, CCSTATE->nsp[m
[31m-  |  move TMP2, sp[m
[31m-  |  subu sp, sp, TMP1[m
[31m-  |  sw ra, -4(TMP2)[m
[31m-  |   sll CARG2, CARG2, 2[m
[31m-  |  sw r16, -8(TMP2)[m
[31m-  |  sw CCSTATE, -12(TMP2)[m
[31m-  |  move r16, TMP2[m
[31m-  |  addiu TMP1, CCSTATE, offsetof(CCallState, stack)[m
[31m-  |  addiu TMP2, sp, 16[m
[31m-  |  beqz CARG2, >2[m
[31m-  |.  addu TMP3, TMP1, CARG2[m
[31m-  |1:[m
[31m-  |   lw TMP0, 0(TMP1)[m
[31m-  |  addiu TMP1, TMP1, 4[m
[31m-  |  sltu AT, TMP1, TMP3[m
[31m-  |   sw TMP0, 0(TMP2)[m
[31m-  |  bnez AT, <1[m
[31m-  |.  addiu TMP2, TMP2, 4[m
[31m-  |2:[m
[31m-  |  lw CFUNCADDR, CCSTATE->func[m
[31m-  |  lw CARG2, CCSTATE->gpr[1][m
[31m-  |  lw CARG3, CCSTATE->gpr[2][m
[31m-  |  lw CARG4, CCSTATE->gpr[3][m
[31m-  |  .FPU ldc1 FARG1, CCSTATE->fpr[0][m
[31m-  |  .FPU ldc1 FARG2, CCSTATE->fpr[1][m
[31m-  |  jalr CFUNCADDR[m
[31m-  |.  lw CARG1, CCSTATE->gpr[0]		// Do this last, since CCSTATE is CARG1.[m
[31m-  |  lw CCSTATE:TMP1, -12(r16)[m
[31m-  |  lw TMP2, -8(r16)[m
[31m-  |  lw ra, -4(r16)[m
[31m-  |  sw CRET1, CCSTATE:TMP1->gpr[0][m
[31m-  |  sw CRET2, CCSTATE:TMP1->gpr[1][m
[31m-  |.if FPU[m
[31m-  |  sdc1 FRET1, CCSTATE:TMP1->fpr[0][m
[31m-  |  sdc1 FRET2, CCSTATE:TMP1->fpr[1][m
[31m-  |.else[m
[31m-  |  sw CARG1, CCSTATE:TMP1->gpr[2]	// Soft-float: complex double .im part.[m
[31m-  |  sw CARG2, CCSTATE:TMP1->gpr[3][m
[31m-  |.endif[m
[31m-  |  move sp, r16[m
[31m-  |  jr ra[m
[31m-  |.  move r16, TMP2[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1*8, RD = src2*8, JMP with RD = target[m
[31m-    |.macro bc_comp, FRA, FRD, RAHI, RALO, RDHI, RDLO, movop, fmovop, fcomp, sfcomp[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   addu RD, BASE, RD[m
[31m-    |  lw RAHI, HI(RA)[m
[31m-    |   lw RDHI, HI(RD)[m
[31m-    |    lhu TMP2, OFS_RD(PC)[m
[31m-    |    addiu PC, PC, 4[m
[31m-    |  bne RAHI, TISNUM, >2[m
[31m-    |.  lw RALO, LO(RA)[m
[31m-    |    lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  lw RDLO, LO(RD)[m
[31m-    |  bne RDHI, TISNUM, >5[m
[31m-    |.   decode_RD4b TMP2[m
[31m-    |  slt AT, SFARG1LO, SFARG2LO[m
[31m-    |    addu TMP2, TMP2, TMP3[m
[31m-    |  movop TMP2, r0, AT[m
[31m-    |1:[m
[31m-    |  addu PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // RA is not an integer.[m
[31m-    |  sltiu AT, RAHI, LJ_TISNUM[m
[31m-    |  beqz AT, ->vmeta_comp[m
[31m-    |.   lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  sltiu AT, RDHI, LJ_TISNUM[m
[31m-    |.if FPU[m
[31m-    |  ldc1 FRA, 0(RA)[m
[31m-    |   ldc1 FRD, 0(RD)[m
[31m-    |.else[m
[31m-    |   lw RDLO, LO(RD)[m
[31m-    |.endif[m
[31m-    |  beqz AT, >4[m
[31m-    |.   decode_RD4b TMP2[m
[31m-    |3:  // RA and RD are both numbers.[m
[31m-    |.if FPU[m
[31m-    |  fcomp f20, f22[m
[31m-    |   addu TMP2, TMP2, TMP3[m
[31m-    |  b <1[m
[31m-    |.  fmovop TMP2, r0[m
[31m-    |.else[m
[31m-    |  bal sfcomp[m
[31m-    |.   addu TMP2, TMP2, TMP3[m
[31m-    |  b <1[m
[31m-    |.  movop TMP2, r0, CRET1[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |4:  // RA is a number, RD is not a number.[m
[31m-    |  bne RDHI, TISNUM, ->vmeta_comp[m
[31m-    |  // RA is a number, RD is an integer. Convert RD to a number.[m
[31m-    |.if FPU[m
[31m-    |.  lwc1 FRD, LO(RD)[m
[31m-    |  b <3[m
[31m-    |.  cvt.d.w FRD, FRD[m
[31m-    |.else[m
[31m-    |.  nop[m
[31m-    |.if "RDHI" == "SFARG1HI"[m
[31m-    |  bal ->vm_sfi2d_1[m
[31m-    |.else[m
[31m-    |  bal ->vm_sfi2d_2[m
[31m-    |.endif[m
[31m-    |.  nop[m
[31m-    |  b <3[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |5:  // RA is an integer, RD is not an integer[m
[31m-    |  sltiu AT, RDHI, LJ_TISNUM[m
[31m-    |  beqz AT, ->vmeta_comp[m
[31m-    |  // RA is an integer, RD is a number. Convert RA to a number.[m
[31m-    |.if FPU[m
[31m-    |.  mtc1 RALO, FRA[m
[31m-    |   ldc1 FRD, 0(RD)[m
[31m-    |  b <3[m
[31m-    |   cvt.d.w FRA, FRA[m
[31m-    |.else[m
[31m-    |.  nop[m
[31m-    |.if "RAHI" == "SFARG1HI"[m
[31m-    |  bal ->vm_sfi2d_1[m
[31m-    |.else[m
[31m-    |  bal ->vm_sfi2d_2[m
[31m-    |.endif[m
[31m-    |.  nop[m
[31m-    |  b <3[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  bc_comp f20, f22, SFARG1HI, SFARG1LO, SFARG2HI, SFARG2LO, movz, movf, c.olt.d, ->vm_sfcmpolt[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  bc_comp f20, f22, SFARG1HI, SFARG1LO, SFARG2HI, SFARG2LO, movn, movt, c.olt.d, ->vm_sfcmpolt[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  bc_comp f22, f20, SFARG2HI, SFARG2LO, SFARG1HI, SFARG1LO, movn, movt, c.ult.d, ->vm_sfcmpult[m
[31m-    } else {[m
[31m-      |  bc_comp f22, f20, SFARG2HI, SFARG2LO, SFARG1HI, SFARG1LO, movz, movf, c.ult.d, ->vm_sfcmpult[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  // RA = src1*8, RD = src2*8, JMP with RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |    addiu PC, PC, 4[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |  lw SFARG1HI, HI(RA)[m
[31m-    |    lhu TMP2, -4+OFS_RD(PC)[m
[31m-    |  lw SFARG2HI, HI(RD)[m
[31m-    |    lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  sltu AT, TISNUM, SFARG1HI[m
[31m-    |  sltu TMP0, TISNUM, SFARG2HI[m
[31m-    |  or AT, AT, TMP0[m
[31m-    if (vk) {[m
[31m-      |  beqz AT, ->BC_ISEQN_Z[m
[31m-    } else {[m
[31m-      |  beqz AT, ->BC_ISNEN_Z[m
[31m-    }[m
[31m-    |.   decode_RD4b TMP2[m
[31m-    |  // Either or both types are not numbers.[m
[31m-    |  lw SFARG1LO, LO(RA)[m
[31m-    |  lw SFARG2LO, LO(RD)[m
[31m-    |  addu TMP2, TMP2, TMP3[m
[31m-    |.if FFI[m
[31m-    |  li TMP3, LJ_TCDATA[m
[31m-    |  beq SFARG1HI, TMP3, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |.  sltiu AT, SFARG1HI, LJ_TISPRI		// Not a primitive?[m
[31m-    |.if FFI[m
[31m-    |  beq SFARG2HI, TMP3, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |.  xor TMP3, SFARG1LO, SFARG2LO		// Same tv?[m
[31m-    |  xor SFARG2HI, SFARG2HI, SFARG1HI		// Same type?[m
[31m-    |  sltiu TMP0, SFARG1HI, LJ_TISTABUD+1	// Table or userdata?[m
[31m-    |  movz TMP3, r0, AT			// Ignore tv if primitive.[m
[31m-    |  movn TMP0, r0, SFARG2HI			// Tab/ud and same type?[m
[31m-    |  or AT, SFARG2HI, TMP3			// Same type && (pri||same tv).[m
[31m-    |  movz TMP0, r0, AT[m
[31m-    |  beqz TMP0, >1	// Done if not tab/ud or not same type or same tv.[m
[31m-    if (vk) {[m
[31m-      |.  movn TMP2, r0, AT[m
[31m-    } else {[m
[31m-      |.  movz TMP2, r0, AT[m
[31m-    }[m
[31m-    |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-    |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-    |  lw TAB:TMP1, TAB:SFARG1LO->metatable[m
[31m-    |  beqz TAB:TMP1, >1		// No metatable?[m
[31m-    |.  nop[m
[31m-    |  lbu TMP1, TAB:TMP1->nomm[m
[31m-    |  andi TMP1, TMP1, 1<<MM_eq[m
[31m-    |  bnez TMP1, >1			// Or 'no __eq' flag set?[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_equal			// Handle __eq metamethod.[m
[31m-    |.  li TMP0, 1-vk			// ne = 0 or 1.[m
[31m-    |1:[m
[31m-    |  addu PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  // RA = src*8, RD = str_const*8 (~), JMP with RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   addiu PC, PC, 4[m
[31m-    |  lw TMP0, HI(RA)[m
[31m-    |   srl RD, RD, 1[m
[31m-    |  lw STR:TMP3, LO(RA)[m
[31m-    |   subu RD, KBASE, RD[m
[31m-    |    lhu TMP2, -4+OFS_RD(PC)[m
[31m-    |.if FFI[m
[31m-    |  li AT, LJ_TCDATA[m
[31m-    |  beq TMP0, AT, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |.  lw STR:TMP1, -4(RD)		// KBASE-4-str_const*4[m
[31m-    |  addiu TMP0, TMP0, -LJ_TSTR[m
[31m-    |   decode_RD4b TMP2[m
[31m-    |  xor TMP1, STR:TMP1, STR:TMP3[m
[31m-    |  or TMP0, TMP0, TMP1[m
[31m-    |   lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |   addu TMP2, TMP2, TMP3[m
[31m-    if (vk) {[m
[31m-      |  movn TMP2, r0, TMP0[m
[31m-    } else {[m
[31m-      |  movz TMP2, r0, TMP0[m
[31m-    }[m
[31m-    |  addu PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  // RA = src*8, RD = num_const*8, JMP with RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   addu RD, KBASE, RD[m
[31m-    |  lw SFARG1HI, HI(RA)[m
[31m-    |   lw SFARG2HI, HI(RD)[m
[31m-    |    lhu TMP2, OFS_RD(PC)[m
[31m-    |    addiu PC, PC, 4[m
[31m-    |    lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |    decode_RD4b TMP2[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:[m
[31m-    }[m
[31m-    |  bne SFARG1HI, TISNUM, >3[m
[31m-    |.  lw SFARG1LO, LO(RA)[m
[31m-    |  lw SFARG2LO, LO(RD)[m
[31m-    |    addu TMP2, TMP2, TMP3[m
[31m-    |  bne SFARG2HI, TISNUM, >6[m
[31m-    |.  xor AT, SFARG1LO, SFARG2LO[m
[31m-    if (vk) {[m
[31m-      |  movn TMP2, r0, AT[m
[31m-      |1:[m
[31m-      |  addu PC, PC, TMP2[m
[31m-      |2:[m
[31m-    } else {[m
[31m-      |  movz TMP2, r0, AT[m
[31m-      |1:[m
[31m-      |2:[m
[31m-      |  addu PC, PC, TMP2[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // RA is not an integer.[m
[31m-    |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-    |.if FFI[m
[31m-    |  beqz AT, >8[m
[31m-    |.else[m
[31m-    |  beqz AT, <2[m
[31m-    |.endif[m
[31m-    |.   addu TMP2, TMP2, TMP3[m
[31m-    |  sltiu AT, SFARG2HI, LJ_TISNUM[m
[31m-    |.if FPU[m
[31m-    |  ldc1 f20, 0(RA)[m
[31m-    |   ldc1 f22, 0(RD)[m
[31m-    |.endif[m
[31m-    |  beqz AT, >5[m
[31m-    |.  lw SFARG2LO, LO(RD)[m
[31m-    |4:  // RA and RD are both numbers.[m
[31m-    |.if FPU[m
[31m-    |  c.eq.d f20, f22[m
[31m-    |  b <1[m
[31m-    if (vk) {[m
[31m-      |.  movf TMP2, r0[m
[31m-    } else {[m
[31m-      |.  movt TMP2, r0[m
[31m-    }[m
[31m-    |.else[m
[31m-    |  bal ->vm_sfcmpeq[m
[31m-    |.  nop[m
[31m-    |  b <1[m
[31m-    if (vk) {[m
[31m-      |.  movz TMP2, r0, CRET1[m
[31m-    } else {[m
[31m-      |.  movn TMP2, r0, CRET1[m
[31m-    }[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |5:  // RA is a number, RD is not a number.[m
[31m-    |.if FFI[m
[31m-    |  bne SFARG2HI, TISNUM, >9[m
[31m-    |.else[m
[31m-    |  bne SFARG2HI, TISNUM, <2[m
[31m-    |.endif[m
[31m-    |  // RA is a number, RD is an integer. Convert RD to a number.[m
[31m-    |.if FPU[m
[31m-    |.  lwc1 f22, LO(RD)[m
[31m-    |  b <4[m
[31m-    |.  cvt.d.w f22, f22[m
[31m-    |.else[m
[31m-    |.  nop[m
[31m-    |  bal ->vm_sfi2d_2[m
[31m-    |.  nop[m
[31m-    |  b <4[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |6:  // RA is an integer, RD is not an integer[m
[31m-    |  sltiu AT, SFARG2HI, LJ_TISNUM[m
[31m-    |.if FFI[m
[31m-    |  beqz AT, >9[m
[31m-    |.else[m
[31m-    |  beqz AT, <2[m
[31m-    |.endif[m
[31m-    |  // RA is an integer, RD is a number. Convert RA to a number.[m
[31m-    |.if FPU[m
[31m-    |.  mtc1 SFARG1LO, f20[m
[31m-    |   ldc1 f22, 0(RD)[m
[31m-    |  b <4[m
[31m-    |   cvt.d.w f20, f20[m
[31m-    |.else[m
[31m-    |.  nop[m
[31m-    |  bal ->vm_sfi2d_1[m
[31m-    |.  nop[m
[31m-    |  b <4[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |.if FFI[m
[31m-    |8:[m
[31m-    |  li AT, LJ_TCDATA[m
[31m-    |  bne SFARG1HI, AT, <2[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.  nop[m
[31m-    |9:[m
[31m-    |  li AT, LJ_TCDATA[m
[31m-    |  bne SFARG2HI, AT, <2[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_equal_cd[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   srl TMP1, RD, 3[m
[31m-    |  lw TMP0, HI(RA)[m
[31m-    |    lhu TMP2, OFS_RD(PC)[m
[31m-    |   not TMP1, TMP1[m
[31m-    |    addiu PC, PC, 4[m
[31m-    |.if FFI[m
[31m-    |  li AT, LJ_TCDATA[m
[31m-    |  beq TMP0, AT, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |.  xor TMP0, TMP0, TMP1[m
[31m-    |  decode_RD4b TMP2[m
[31m-    |  lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  addu TMP2, TMP2, TMP3[m
[31m-    if (vk) {[m
[31m-      |  movn TMP2, r0, TMP0[m
[31m-    } else {[m
[31m-      |  movz TMP2, r0, TMP0[m
[31m-    }[m
[31m-    |  addu PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  // RA = dst*8 or unused, RD = src*8, JMP with RD = target[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |   lhu TMP2, OFS_RD(PC)[m
[31m-    |  lw TMP0, HI(RD)[m
[31m-    |   addiu PC, PC, 4[m
[31m-    if (op == BC_IST || op == BC_ISF) {[m
[31m-      |  sltiu TMP0, TMP0, LJ_TISTRUECOND[m
[31m-      |   decode_RD4b TMP2[m
[31m-      |   lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-      |   addu TMP2, TMP2, TMP3[m
[31m-      if (op == BC_IST) {[m
[31m-	|  movz TMP2, r0, TMP0[m
[31m-      } else {[m
[31m-	|  movn TMP2, r0, TMP0[m
[31m-      }[m
[31m-      |  addu PC, PC, TMP2[m
[31m-    } else {[m
[31m-      |  sltiu TMP0, TMP0, LJ_TISTRUECOND[m
[31m-      |  lw SFRETHI, HI(RD)[m
[31m-      |   lw SFRETLO, LO(RD)[m
[31m-      if (op == BC_ISTC) {[m
[31m-	|  beqz TMP0, >1[m
[31m-      } else {[m
[31m-	|  bnez TMP0, >1[m
[31m-      }[m
[31m-      |.  addu RA, BASE, RA[m
[31m-      |   decode_RD4b TMP2[m
[31m-      |   lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-      |   addu TMP2, TMP2, TMP3[m
[31m-      |  sw SFRETHI, HI(RA)[m
[31m-      |   sw SFRETLO, LO(RA)[m
[31m-      |   addu PC, PC, TMP2[m
[31m-      |1:[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  // RA = src*8, RD = -type*8[m
[31m-    |  addu TMP2, BASE, RA[m
[31m-    |  srl TMP1, RD, 3[m
[31m-    |  lw TMP0, HI(TMP2)[m
[31m-    |  ins_next1[m
[31m-    |  addu AT, TMP0, TMP1[m
[31m-    |  bnez AT, ->vmeta_istype[m
[31m-    |.  ins_next2[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  // RA = src*8, RD = -(TISNUM-1)*8[m
[31m-    |  addu TMP2, BASE, RA[m
[31m-    |  lw TMP0, HI(TMP2)[m
[31m-    |  ins_next1[m
[31m-    |  sltiu AT, TMP0, LJ_TISNUM[m
[31m-    |  beqz AT, ->vmeta_istype[m
[31m-    |.  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  lw SFRETHI, HI(RD)[m
[31m-    |   lw SFRETLO, LO(RD)[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  lw TMP0, HI(RD)[m
[31m-    |   li TMP1, LJ_TFALSE[m
[31m-    |  sltiu TMP0, TMP0, LJ_TISTRUECOND[m
[31m-    |  addiu TMP1, TMP0, LJ_TTRUE[m
[31m-    |  ins_next1[m
[31m-    |  sw TMP1, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  addu RB, BASE, RD[m
[31m-    |  lw SFARG1HI, HI(RB)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  bne SFARG1HI, TISNUM, >2[m
[31m-    |.  lw SFARG1LO, LO(RB)[m
[31m-    |  lui TMP1, 0x8000[m
[31m-    |  beq SFARG1LO, TMP1, ->vmeta_unm	// Meta handler deals with -2^31.[m
[31m-    |.  negu SFARG1LO, SFARG1LO[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  sw SFARG1HI, HI(RA)[m
[31m-    |   sw SFARG1LO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |2:[m
[31m-    |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-    |  beqz AT, ->vmeta_unm[m
[31m-    |.  lui TMP1, 0x8000[m
[31m-    |  b <1[m
[31m-    |.  xor SFARG1HI, SFARG1HI, TMP1[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  addu CARG2, BASE, RD[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  lw TMP0, HI(CARG2)[m
[31m-    |   lw CARG1, LO(CARG2)[m
[31m-    |  li AT, LJ_TSTR[m
[31m-    |  bne TMP0, AT, >2[m
[31m-    |.  li AT, LJ_TTAB[m
[31m-    |   lw CRET1, STR:CARG1->len[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  sw TISNUM, HI(RA)[m
[31m-    |   sw CRET1, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |2:[m
[31m-    |  bne TMP0, AT, ->vmeta_len[m
[31m-    |.  nop[m
[31m-#if LJ_52[m
[31m-    |  lw TAB:TMP2, TAB:CARG1->metatable[m
[31m-    |  bnez TAB:TMP2, >9[m
[31m-    |.  nop[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  load_got lj_tab_len[m
[31m-    |  call_intern lj_tab_len		// (GCtab *t)[m
[31m-    |.  nop[m
[31m-    |  // Returns uint32_t (but less than 2^31).[m
[31m-    |  b <1[m
[31m-    |.  nop[m
[31m-#if LJ_52[m
[31m-    |9:[m
[31m-    |  lbu TMP0, TAB:TMP2->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_len[m
[31m-    |  bnez TMP0, <3			// 'no __len' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_len[m
[31m-    |.  nop[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro fpmod, a, b, c[m
[31m-    |  bal ->vm_floor     // floor(b/c)[m
[31m-    |.  div.d FARG1, b, c[m
[31m-    |  mul.d a, FRET1, c[m
[31m-    |  sub.d a, b, a      // b - floor(b/c)*c[m
[31m-    |.endmacro[m
[31m-[m
[31m-    |.macro sfpmod[m
[31m-    |  addiu sp, sp, -16[m
[31m-    |[m
[31m-    |  load_got __divdf3[m
[31m-    |  sw SFARG1HI, HI(sp)[m
[31m-    |   sw SFARG1LO, LO(sp)[m
[31m-    |  sw SFARG2HI, 8+HI(sp)[m
[31m-    |  call_extern[m
[31m-    |.  sw SFARG2LO, 8+LO(sp)[m
[31m-    |[m
[31m-    |  load_got floor[m
[31m-    |  move SFARG1HI, SFRETHI[m
[31m-    |  call_extern[m
[31m-    |.  move SFARG1LO, SFRETLO[m
[31m-    |[m
[31m-    |  load_got __muldf3[m
[31m-    |  move SFARG1HI, SFRETHI[m
[31m-    |   move SFARG1LO, SFRETLO[m
[31m-    |  lw SFARG2HI, 8+HI(sp)[m
[31m-    |  call_extern[m
[31m-    |.  lw SFARG2LO, 8+LO(sp)[m
[31m-    |[m
[31m-    |  load_got __subdf3[m
[31m-    |  lw SFARG1HI, HI(sp)[m
[31m-    |   lw SFARG1LO, LO(sp)[m
[31m-    |  move SFARG2HI, SFRETHI[m
[31m-    |  call_extern[m
[31m-    |.  move SFARG2LO, SFRETLO[m
[31m-    |[m
[31m-    |  addiu sp, sp, 16[m
[31m-    |.endmacro[m
[31m-[m
[31m-    |.macro ins_arithpre, label[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    |  // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   decode_RB8a RB, INS[m
[31m-    |   decode_RB8b RB[m
[31m-    |    decode_RDtoRC8 RC, RD[m
[31m-    |   // RA = dst*8, RB = src1*8, RC = num_const*8[m
[31m-    |   addu RB, BASE, RB[m
[31m-    |.if "label" ~= "none"[m
[31m-    |   b label[m
[31m-    |.endif[m
[31m-    |.   addu RC, KBASE, RC[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   decode_RB8a RC, INS[m
[31m-    |   decode_RB8b RC[m
[31m-    |    decode_RDtoRC8 RB, RD[m
[31m-    |   // RA = dst*8, RB = num_const*8, RC = src1*8[m
[31m-    |   addu RC, BASE, RC[m
[31m-    |.if "label" ~= "none"[m
[31m-    |   b label[m
[31m-    |.endif[m
[31m-    |.   addu RB, KBASE, RB[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   decode_RB8a RB, INS[m
[31m-    |   decode_RB8b RB[m
[31m-    |    decode_RDtoRC8 RC, RD[m
[31m-    |   // RA = dst*8, RB = src1*8, RC = src2*8[m
[31m-    |   addu RB, BASE, RB[m
[31m-    |.if "label" ~= "none"[m
[31m-    |   b label[m
[31m-    |.endif[m
[31m-    |.   addu RC, BASE, RC[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, intins, fpins, fpcall, label[m
[31m-    |  ins_arithpre none[m
[31m-    |[m
[31m-    |.if "label" ~= "none"[m
[31m-    |label:[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |  lw SFARG1HI, HI(RB)[m
[31m-    |   lw SFARG2HI, HI(RC)[m
[31m-    |[m
[31m-    |.if "intins" ~= "div"[m
[31m-    |[m
[31m-    |  // Check for two integers.[m
[31m-    |  lw SFARG1LO, LO(RB)[m
[31m-    |  bne SFARG1HI, TISNUM, >5[m
[31m-    |.  lw SFARG2LO, LO(RC)[m
[31m-    |  bne SFARG2HI, TISNUM, >5[m
[31m-    |[m
[31m-    |.if "intins" == "addu"[m
[31m-    |.  intins CRET1, SFARG1LO, SFARG2LO[m
[31m-    |  xor TMP1, CRET1, SFARG1LO	// ((y^a) & (y^b)) < 0: overflow.[m
[31m-    |  xor TMP2, CRET1, SFARG2LO[m
[31m-    |  and TMP1, TMP1, TMP2[m
[31m-    |  bltz TMP1, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.elif "intins" == "subu"[m
[31m-    |.  intins CRET1, SFARG1LO, SFARG2LO[m
[31m-    |  xor TMP1, CRET1, SFARG1LO	// ((y^a) & (a^b)) < 0: overflow.[m
[31m-    |  xor TMP2, SFARG1LO, SFARG2LO[m
[31m-    |  and TMP1, TMP1, TMP2[m
[31m-    |  bltz TMP1, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.elif "intins" == "mult"[m
[31m-    |.  intins SFARG1LO, SFARG2LO[m
[31m-    |  mflo CRET1[m
[31m-    |  mfhi TMP2[m
[31m-    |  sra TMP1, CRET1, 31[m
[31m-    |  bne TMP1, TMP2, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.else[m
[31m-    |.  load_got lj_vm_modi[m
[31m-    |  beqz SFARG2LO, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.if ENDIAN_BE[m
[31m-    |  move CARG1, SFARG1LO[m
[31m-    |.endif[m
[31m-    |  call_extern[m
[31m-    |.  move CARG2, SFARG2LO[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |  ins_next1[m
[31m-    |  sw TISNUM, HI(RA)[m
[31m-    |   sw CRET1, LO(RA)[m
[31m-    |3:[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |.elif not FPU[m
[31m-    |[m
[31m-    |  lw SFARG1LO, LO(RB)[m
[31m-    |   lw SFARG2LO, LO(RC)[m
[31m-    |[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |5:  // Check for two numbers.[m
[31m-    |  .FPU ldc1 f20, 0(RB)[m
[31m-    |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-    |   sltiu TMP0, SFARG2HI, LJ_TISNUM[m
[31m-    |  .FPU ldc1 f22, 0(RC)[m
[31m-    |   and AT, AT, TMP0[m
[31m-    |   beqz AT, ->vmeta_arith[m
[31m-    |.   addu RA, BASE, RA[m
[31m-    |[m
[31m-    |.if FPU[m
[31m-    |  fpins FRET1, f20, f22[m
[31m-    |.elif "fpcall" == "sfpmod"[m
[31m-    |  sfpmod[m
[31m-    |.else[m
[31m-    |  load_got fpcall[m
[31m-    |  call_extern[m
[31m-    |.  nop[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |  ins_next1[m
[31m-    |.if not FPU[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |.endif[m
[31m-    |.if "intins" ~= "div"[m
[31m-    |  b <3[m
[31m-    |.endif[m
[31m-    |.if FPU[m
[31m-    |.  sdc1 FRET1, 0(RA)[m
[31m-    |.else[m
[31m-    |.  sw SFRETLO, LO(RA)[m
[31m-    |.endif[m
[31m-    |.if "intins" == "div"[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |.endmacro[m
[31m-[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arith addu, add.d, __adddf3, none[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arith subu, sub.d, __subdf3, none[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arith mult, mul.d, __muldf3, none[m
[31m-    break;[m
[31m-  case BC_DIVVN:[m
[31m-    |  ins_arith div, div.d, __divdf3, ->BC_DIVVN_Z[m
[31m-    break;[m
[31m-  case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arithpre ->BC_DIVVN_Z[m
[31m-    break;[m
[31m-  case BC_MODVN:[m
[31m-    |  ins_arith modi, fpmod, sfpmod, ->BC_MODVN_Z[m
[31m-    break;[m
[31m-  case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithpre ->BC_MODVN_Z[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  ins_arithpre none[m
[31m-    |  lw SFARG1HI, HI(RB)[m
[31m-    |   lw SFARG2HI, HI(RC)[m
[31m-    |  sltiu AT, SFARG1HI, LJ_TISNUM[m
[31m-    |  sltiu TMP0, SFARG2HI, LJ_TISNUM[m
[31m-    |  and AT, AT, TMP0[m
[31m-    |  load_got pow[m
[31m-    |  beqz AT, ->vmeta_arith[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |.if FPU[m
[31m-    |  ldc1 FARG1, 0(RB)[m
[31m-    |  ldc1 FARG2, 0(RC)[m
[31m-    |.else[m
[31m-    |  lw SFARG1LO, LO(RB)[m
[31m-    |   lw SFARG2LO, LO(RC)[m
[31m-    |.endif[m
[31m-    |  call_extern[m
[31m-    |.  nop[m
[31m-    |  ins_next1[m
[31m-    |.if FPU[m
[31m-    |  sdc1 FRET1, 0(RA)[m
[31m-    |.else[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |.endif[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  // RA = dst*8, RB = src_start*8, RC = src_end*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  subu CARG3, RC, RB[m
[31m-    |   sw BASE, L->base[m
[31m-    |  addu CARG2, BASE, RC[m
[31m-    |  move MULTRES, RB[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  load_got lj_meta_cat[m
[31m-    |  srl CARG3, CARG3, 3[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  call_intern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |.  move CARG1, L[m
[31m-    |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-    |  bnez CRET1, ->vmeta_binop[m
[31m-    |.  lw BASE, L->base[m
[31m-    |  addu RB, BASE, MULTRES[m
[31m-    |  lw SFRETHI, HI(RB)[m
[31m-    |   lw SFRETLO, LO(RB)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  // RA = dst*8, RD = str_const*8 (~)[m
[31m-    |  srl TMP1, RD, 1[m
[31m-    |  subu TMP1, KBASE, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP0, -4(TMP1)		// KBASE-4-str_const*4[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   li TMP2, LJ_TSTR[m
[31m-    |  sw TMP0, LO(RA)[m
[31m-    |   sw TMP2, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  // RA = dst*8, RD = cdata_const*8 (~)[m
[31m-    |  srl TMP1, RD, 1[m
[31m-    |  subu TMP1, KBASE, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP0, -4(TMP1)		// KBASE-4-cdata_const*4[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   li TMP2, LJ_TCDATA[m
[31m-    |  sw TMP0, LO(RA)[m
[31m-    |   sw TMP2, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  // RA = dst*8, RD = int16_literal*8[m
[31m-    |  sra RD, INS, 16[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  ins_next1[m
[31m-    |  sw TISNUM, HI(RA)[m
[31m-    |   sw RD, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  // RA = dst*8, RD = num_const*8[m
[31m-    |  addu RD, KBASE, RD[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  lw SFRETHI, HI(RD)[m
[31m-    |   lw SFRETLO, LO(RD)[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  // RA = dst*8, RD = primitive_type*8 (~)[m
[31m-    |  srl TMP1, RD, 3[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  not TMP0, TMP1[m
[31m-    |  ins_next1[m
[31m-    |   sw TMP0, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  // RA = base*8, RD = end*8[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  sw TISNIL, HI(RA)[m
[31m-    |   addiu RA, RA, 8[m
[31m-    |  addu RD, BASE, RD[m
[31m-    |1:[m
[31m-    |  sw TISNIL, HI(RA)[m
[31m-    |  slt AT, RA, RD[m
[31m-    |  bnez AT, <1[m
[31m-    |.  addiu RA, RA, 8[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  // RA = dst*8, RD = uvnum*8[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srl RD, RD, 1[m
[31m-    |   addu RD, RD, LFUNC:RB[m
[31m-    |  lw UPVAL:RB, LFUNC:RD->uvptr[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP1, UPVAL:RB->v[m
[31m-    |  lw SFRETHI, HI(TMP1)[m
[31m-    |   lw SFRETLO, LO(TMP1)[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-    |  // RA = uvnum*8, RD = src*8[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |    srl RA, RA, 1[m
[31m-    |   addu RD, BASE, RD[m
[31m-    |    addu RA, RA, LFUNC:RB[m
[31m-    |  lw UPVAL:RB, LFUNC:RA->uvptr[m
[31m-    |   lw SFRETHI, HI(RD)[m
[31m-    |    lw SFRETLO, LO(RD)[m
[31m-    |  lbu TMP3, UPVAL:RB->marked[m
[31m-    |   lw CARG2, UPVAL:RB->v[m
[31m-    |  andi TMP3, TMP3, LJ_GC_BLACK	// isblack(uv)[m
[31m-    |  lbu TMP0, UPVAL:RB->closed[m
[31m-    |   sw SFRETHI, HI(CARG2)[m
[31m-    |    sw SFRETLO, LO(CARG2)[m
[31m-    |  li AT, LJ_GC_BLACK|1[m
[31m-    |  or TMP3, TMP3, TMP0[m
[31m-    |  beq TMP3, AT, >2			// Upvalue is closed and black?[m
[31m-    |.  addiu TMP2, SFRETHI, -(LJ_TNUMX+1)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if new value is collectable.[m
[31m-    |  sltiu AT, TMP2, LJ_TISGCV - (LJ_TNUMX+1)[m
[31m-    |  beqz AT, <1			// tvisgcv(v)[m
[31m-    |.  nop[m
[31m-    |  lbu TMP3, GCOBJ:SFRETLO->gch.marked[m
[31m-    |  andi TMP3, TMP3, LJ_GC_WHITES	// iswhite(v)[m
[31m-    |  beqz TMP3, <1[m
[31m-    |.  load_got lj_gc_barrieruv[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  call_intern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |.  addiu CARG1, DISPATCH, GG_DISP2G[m
[31m-    |  b <1[m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_USETS:[m
[31m-    |  // RA = uvnum*8, RD = str_const*8 (~)[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |    srl RA, RA, 1[m
[31m-    |   srl TMP1, RD, 1[m
[31m-    |    addu RA, RA, LFUNC:RB[m
[31m-    |   subu TMP1, KBASE, TMP1[m
[31m-    |  lw UPVAL:RB, LFUNC:RA->uvptr[m
[31m-    |   lw STR:TMP1, -4(TMP1)		// KBASE-4-str_const*4[m
[31m-    |  lbu TMP2, UPVAL:RB->marked[m
[31m-    |   lw CARG2, UPVAL:RB->v[m
[31m-    |   lbu TMP3, STR:TMP1->marked[m
[31m-    |  andi AT, TMP2, LJ_GC_BLACK	// isblack(uv)[m
[31m-    |   lbu TMP2, UPVAL:RB->closed[m
[31m-    |   li TMP0, LJ_TSTR[m
[31m-    |   sw STR:TMP1, LO(CARG2)[m
[31m-    |  bnez AT, >2[m
[31m-    |.  sw TMP0, HI(CARG2)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  beqz TMP2, <1[m
[31m-    |.  andi AT, TMP3, LJ_GC_WHITES	// iswhite(str)[m
[31m-    |  beqz AT, <1[m
[31m-    |.  load_got lj_gc_barrieruv[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  call_intern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |.  addiu CARG1, DISPATCH, GG_DISP2G[m
[31m-    |  b <1[m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  // RA = uvnum*8, RD = num_const*8[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srl RA, RA, 1[m
[31m-    |    addu RD, KBASE, RD[m
[31m-    |   addu RA, RA, LFUNC:RB[m
[31m-    |   lw UPVAL:RB, LFUNC:RA->uvptr[m
[31m-    |    lw SFRETHI, HI(RD)[m
[31m-    |     lw SFRETLO, LO(RD)[m
[31m-    |   lw TMP1, UPVAL:RB->v[m
[31m-    |  ins_next1[m
[31m-    |    sw SFRETHI, HI(TMP1)[m
[31m-    |     sw SFRETLO, LO(TMP1)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  // RA = uvnum*8, RD = primitive_type*8 (~)[m
[31m-    |  lw LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srl RA, RA, 1[m
[31m-    |    srl TMP0, RD, 3[m
[31m-    |   addu RA, RA, LFUNC:RB[m
[31m-    |    not TMP0, TMP0[m
[31m-    |   lw UPVAL:RB, LFUNC:RA->uvptr[m
[31m-    |  ins_next1[m
[31m-    |   lw TMP1, UPVAL:RB->v[m
[31m-    |   sw TMP0, HI(TMP1)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_UCLO:[m
[31m-    |  // RA = level*8, RD = target[m
[31m-    |  lw TMP2, L->openupval[m
[31m-    |  branch_RD			// Do this first since RD is not saved.[m
[31m-    |  load_got lj_func_closeuv[m
[31m-    |   sw BASE, L->base[m
[31m-    |  beqz TMP2, >1[m
[31m-    |.  move CARG1, L[m
[31m-    |  call_intern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |.  addu CARG2, BASE, RA[m
[31m-    |  lw BASE, L->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  // RA = dst*8, RD = proto_const*8 (~) (holding function prototype)[m
[31m-    |  srl TMP1, RD, 1[m
[31m-    |  load_got lj_func_newL_gc[m
[31m-    |  subu TMP1, KBASE, TMP1[m
[31m-    |  lw CARG3, FRAME_FUNC(BASE)[m
[31m-    |  lw CARG2, -4(TMP1)		// KBASE-4-tab_const*4[m
[31m-    |   sw BASE, L->base[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  call_intern lj_func_newL_gc[m
[31m-    |.  move CARG1, L[m
[31m-    |  // Returns GCfuncL *.[m
[31m-    |  lw BASE, L->base[m
[31m-    |   li TMP0, LJ_TFUNC[m
[31m-    |  ins_next1[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  sw LFUNC:CRET1, LO(RA)[m
[31m-    |   sw TMP0, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-  case BC_TDUP:[m
[31m-    |  // RA = dst*8, RD = (hbits|asize)*8 | tab_const*8 (~)[m
[31m-    |  lw TMP0, DISPATCH_GL(gc.total)(DISPATCH)[m
[31m-    |  lw TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)[m
[31m-    |   sw BASE, L->base[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  sltu AT, TMP0, TMP1[m
[31m-    |  beqz AT, >5[m
[31m-    |1:[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |  load_got lj_tab_new[m
[31m-      |  srl CARG2, RD, 3[m
[31m-      |  andi CARG2, CARG2, 0x7ff[m
[31m-      |  li TMP0, 0x801[m
[31m-      |  addiu AT, CARG2, -0x7ff[m
[31m-      |   srl CARG3, RD, 14[m
[31m-      |  movz CARG2, TMP0, AT[m
[31m-      |  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-      |  call_intern lj_tab_new[m
[31m-      |.  move CARG1, L[m
[31m-      |  // Returns Table *.[m
[31m-    } else {[m
[31m-      |  load_got lj_tab_dup[m
[31m-      |  srl TMP1, RD, 1[m
[31m-      |  subu TMP1, KBASE, TMP1[m
[31m-      |  move CARG1, L[m
[31m-      |  call_intern lj_tab_dup		// (lua_State *L, Table *kt)[m
[31m-      |.  lw CARG2, -4(TMP1)		// KBASE-4-str_const*4[m
[31m-      |  // Returns Table *.[m
[31m-    }[m
[31m-    |  lw BASE, L->base[m
[31m-    |  ins_next1[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   li TMP0, LJ_TTAB[m
[31m-    |  sw TAB:CRET1, LO(RA)[m
[31m-    |   sw TMP0, HI(RA)[m
[31m-    |  ins_next2[m
[31m-    |5:[m
[31m-    |  load_got lj_gc_step_fixtop[m
[31m-    |  move MULTRES, RD[m
[31m-    |  call_intern lj_gc_step_fixtop	// (lua_State *L)[m
[31m-    |.  move CARG1, L[m
[31m-    |  b <1[m
[31m-    |.  move RD, MULTRES[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  // RA = dst*8, RD = str_const*8 (~)[m
[31m-  case BC_GSET:[m
[31m-    |  // RA = src*8, RD = str_const*8 (~)[m
[31m-    |  lw LFUNC:TMP2, FRAME_FUNC(BASE)[m
[31m-    |   srl TMP1, RD, 1[m
[31m-    |   subu TMP1, KBASE, TMP1[m
[31m-    |  lw TAB:RB, LFUNC:TMP2->env[m
[31m-    |  lw STR:RC, -4(TMP1)		// KBASE-4-str_const*4[m
[31m-    if (op == BC_GGET) {[m
[31m-      |  b ->BC_TGETS_Z[m
[31m-    } else {[m
[31m-      |  b ->BC_TSETS_Z[m
[31m-    }[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   addu CARG3, BASE, RC[m
[31m-    |  lw TMP1, HI(CARG2)[m
[31m-    |   lw TMP2, HI(CARG3)[m
[31m-    |    lw TAB:RB, LO(CARG2)[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |  bne TMP1, AT, ->vmeta_tgetv[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |  bne TMP2, TISNUM, >5[m
[31m-    |.  lw RC, LO(CARG3)[m
[31m-    |  lw TMP0, TAB:RB->asize[m
[31m-    |   lw TMP1, TAB:RB->array[m
[31m-    |  sltu AT, RC, TMP0[m
[31m-    |   sll TMP2, RC, 3[m
[31m-    |  beqz AT, ->vmeta_tgetv		// Integer key and in array part?[m
[31m-    |.  addu TMP2, TMP1, TMP2[m
[31m-    |  lw SFRETHI, HI(TMP2)[m
[31m-    |  beq SFRETHI, TISNIL, >2[m
[31m-    |.  lw SFRETLO, LO(TMP2)[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, <1		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP0, TAB:TMP2->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_index[m
[31m-    |  bnez TMP0, <1			// 'no __index' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  li AT, LJ_TSTR[m
[31m-    |  bne TMP2, AT, ->vmeta_tgetv[m
[31m-    |.  nop[m
[31m-    |  b ->BC_TGETS_Z			// String key?[m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = str_const*4 (~)[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   decode_RC4a RC, INS[m
[31m-    |  lw TMP0, HI(CARG2)[m
[31m-    |   decode_RC4b RC[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |   lw TAB:RB, LO(CARG2)[m
[31m-    |   subu CARG3, KBASE, RC[m
[31m-    |   lw STR:RC, -4(CARG3)		// KBASE-4-str_const*4[m
[31m-    |  bne TMP0, AT, ->vmeta_tgets1[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |->BC_TGETS_Z:[m
[31m-    |  // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8[m
[31m-    |  lw TMP0, TAB:RB->hmask[m
[31m-    |  lw TMP1, STR:RC->hash[m
[31m-    |  lw NODE:TMP2, TAB:RB->node[m
[31m-    |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-    |  sll TMP0, TMP1, 5[m
[31m-    |  sll TMP1, TMP1, 3[m
[31m-    |  subu TMP1, TMP0, TMP1[m
[31m-    |  addu NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-    |1:[m
[31m-    |  lw CARG1, offsetof(Node, key)+HI(NODE:TMP2)[m
[31m-    |   lw TMP0, offsetof(Node, key)+LO(NODE:TMP2)[m
[31m-    |    lw NODE:TMP1, NODE:TMP2->next[m
[31m-    |    lw SFRETHI, offsetof(Node, val)+HI(NODE:TMP2)[m
[31m-    |  addiu CARG1, CARG1, -LJ_TSTR[m
[31m-    |   xor TMP0, TMP0, STR:RC[m
[31m-    |  or AT, CARG1, TMP0[m
[31m-    |  bnez AT, >4[m
[31m-    |.  lw TAB:TMP3, TAB:RB->metatable[m
[31m-    |    beq SFRETHI, TISNIL, >5	// Key found, but nil value?[m
[31m-    |.    lw SFRETLO, offsetof(Node, val)+LO(NODE:TMP2)[m
[31m-    |3:[m
[31m-    |  ins_next1[m
[31m-    |    sw SFRETHI, HI(RA)[m
[31m-    |     sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  bnez NODE:TMP1, <1[m
[31m-    |.  move NODE:TMP2, NODE:TMP1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  beqz TAB:TMP3, <3		// No metatable: done.[m
[31m-    |.  li SFRETHI, LJ_TNIL[m
[31m-    |  lbu TMP0, TAB:TMP3->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_index[m
[31m-    |  bnez TMP0, <3			// 'no __index' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tgets[m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = index*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  lw CARG1, HI(CARG2)[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |   lw TAB:RB, LO(CARG2)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  bne CARG1, AT, ->vmeta_tgetb[m
[31m-    |.  srl TMP0, RC, 3[m
[31m-    |  lw TMP1, TAB:RB->asize[m
[31m-    |   lw TMP2, TAB:RB->array[m
[31m-    |  sltu AT, TMP0, TMP1[m
[31m-    |  beqz AT, ->vmeta_tgetb[m
[31m-    |.  addu RC, TMP2, RC[m
[31m-    |  lw SFRETHI, HI(RC)[m
[31m-    |  beq SFRETHI, TISNIL, >5[m
[31m-    |.  lw SFRETLO, LO(RC)[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, <1		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP1, TAB:TMP2->nomm[m
[31m-    |  andi TMP1, TMP1, 1<<MM_index[m
[31m-    |  bnez TMP1, <1			// 'no __index' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tgetb			// Caveat: preserve TMP0 and CARG2![m
[31m-    |.  nop[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  addu RB, BASE, RB[m
[31m-    |   addu RC, BASE, RC[m
[31m-    |  lw TAB:CARG1, LO(RB)[m
[31m-    |   lw CARG2, LO(RC)[m
[31m-    |    addu RA, BASE, RA[m
[31m-    |  lw TMP0, TAB:CARG1->asize[m
[31m-    |   lw TMP1, TAB:CARG1->array[m
[31m-    |  sltu AT, CARG2, TMP0[m
[31m-    |   sll TMP2, CARG2, 3[m
[31m-    |  beqz AT, ->vmeta_tgetr		// In array part?[m
[31m-    |.  addu CRET1, TMP1, TMP2[m
[31m-    |  lw SFARG2HI, HI(CRET1)[m
[31m-    |   lw SFARG2LO, LO(CRET1)[m
[31m-    |->BC_TGETR_Z:[m
[31m-    |  ins_next1[m
[31m-    |  sw SFARG2HI, HI(RA)[m
[31m-    |   sw SFARG2LO, LO(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  // RA = src*8, RB = table*8, RC = key*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   addu CARG3, BASE, RC[m
[31m-    |  lw TMP1, HI(CARG2)[m
[31m-    |   lw TMP2, HI(CARG3)[m
[31m-    |    lw TAB:RB, LO(CARG2)[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |  bne TMP1, AT, ->vmeta_tsetv[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |  bne TMP2, TISNUM, >5[m
[31m-    |.  lw RC, LO(CARG3)[m
[31m-    |  lw TMP0, TAB:RB->asize[m
[31m-    |   lw TMP1, TAB:RB->array[m
[31m-    |  sltu AT, RC, TMP0[m
[31m-    |   sll TMP2, RC, 3[m
[31m-    |  beqz AT, ->vmeta_tsetv		// Integer key and in array part?[m
[31m-    |.  addu TMP1, TMP1, TMP2[m
[31m-    |  lw TMP0, HI(TMP1)[m
[31m-    |   lbu TMP3, TAB:RB->marked[m
[31m-    |  lw SFRETHI, HI(RA)[m
[31m-    |  beq TMP0, TISNIL, >3[m
[31m-    |.  lw SFRETLO, LO(RA)[m
[31m-    |1:[m
[31m-    |   andi AT, TMP3, LJ_GC_BLACK  // isblack(table)[m
[31m-    |  sw SFRETHI, HI(TMP1)[m
[31m-    |  bnez AT, >7[m
[31m-    |.  sw SFRETLO, LO(TMP1)[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, <1		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP2, TAB:TMP2->nomm[m
[31m-    |  andi TMP2, TMP2, 1<<MM_newindex[m
[31m-    |  bnez TMP2, <1			// 'no __newindex' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  li AT, LJ_TSTR[m
[31m-    |  bne TMP2, AT, ->vmeta_tsetv[m
[31m-    |.  nop[m
[31m-    |  b ->BC_TSETS_Z			// String key?[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0, <2[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  // RA = src*8, RB = table*8, RC = str_const*8 (~)[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   decode_RC4a RC, INS[m
[31m-    |  lw TMP0, HI(CARG2)[m
[31m-    |   decode_RC4b RC[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |   subu CARG3, KBASE, RC[m
[31m-    |    lw TAB:RB, LO(CARG2)[m
[31m-    |   lw STR:RC, -4(CARG3)		// KBASE-4-str_const*4[m
[31m-    |  bne TMP0, AT, ->vmeta_tsets1[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |->BC_TSETS_Z:[m
[31m-    |  // TAB:RB = GCtab *, STR:RC = GCstr *, RA = BASE+src*8[m
[31m-    |  lw TMP0, TAB:RB->hmask[m
[31m-    |  lw TMP1, STR:RC->hash[m
[31m-    |  lw NODE:TMP2, TAB:RB->node[m
[31m-    |   sb r0, TAB:RB->nomm		// Clear metamethod cache.[m
[31m-    |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-    |  sll TMP0, TMP1, 5[m
[31m-    |  sll TMP1, TMP1, 3[m
[31m-    |  subu TMP1, TMP0, TMP1[m
[31m-    |  addu NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-    |.if FPU[m
[31m-    |   ldc1 f20, 0(RA)[m
[31m-    |.else[m
[31m-    |   lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  lw CARG1, offsetof(Node, key)+HI(NODE:TMP2)[m
[31m-    |   lw TMP0, offsetof(Node, key)+LO(NODE:TMP2)[m
[31m-    |  li AT, LJ_TSTR[m
[31m-    |    lw NODE:TMP1, NODE:TMP2->next[m
[31m-    |  bne CARG1, AT, >5[m
[31m-    |.   lw CARG2, offsetof(Node, val)+HI(NODE:TMP2)[m
[31m-    |   bne TMP0, STR:RC, >5[m
[31m-    |.    lbu TMP3, TAB:RB->marked[m
[31m-    |    beq CARG2, TISNIL, >4		// Key found, but nil value?[m
[31m-    |.    lw TAB:TMP0, TAB:RB->metatable[m
[31m-    |2:[m
[31m-    |  andi AT, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |.if FPU[m
[31m-    |  bnez AT, >7[m
[31m-    |.  sdc1 f20, NODE:TMP2->val[m
[31m-    |.else[m
[31m-    |   sw SFRETHI, NODE:TMP2->val.u32.hi[m
[31m-    |  bnez AT, >7[m
[31m-    |.   sw SFRETLO, NODE:TMP2->val.u32.lo[m
[31m-    |.endif[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  beqz TAB:TMP0, <2		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP0, TAB:TMP0->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_newindex[m
[31m-    |  bnez TMP0, <2			// 'no __newindex' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tsets[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  bnez NODE:TMP1, <1[m
[31m-    |.  move NODE:TMP2, NODE:TMP1[m
[31m-    |  // End of hash chain: key not found, add a new one[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, >6		// No metatable: continue.[m
[31m-    |.  addiu CARG3, DISPATCH, DISPATCH_GL(tmptv)[m
[31m-    |  lbu TMP0, TAB:TMP2->nomm[m
[31m-    |  andi TMP0, TMP0, 1<<MM_newindex[m
[31m-    |  beqz TMP0, ->vmeta_tsets		// 'no __newindex' flag NOT set: check.[m
[31m-    |.  li AT, LJ_TSTR[m
[31m-    |6:[m
[31m-    |  load_got lj_tab_newkey[m
[31m-    |  sw STR:RC, LO(CARG3)[m
[31m-    |  sw AT, HI(CARG3)[m
[31m-    |   sw BASE, L->base[m
[31m-    |  move CARG2, TAB:RB[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  call_intern lj_tab_newkey	// (lua_State *L, GCtab *t, TValue *k[m
[31m-    |.  move CARG1, L[m
[31m-    |  // Returns TValue *.[m
[31m-    |  lw BASE, L->base[m
[31m-    |.if FPU[m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |.  sdc1 f20, 0(CRET1)[m
[31m-    |.else[m
[31m-    |  lw SFARG1HI, HI(RA)[m
[31m-    |   lw SFARG1LO, LO(RA)[m
[31m-    |  sw SFARG1HI, HI(CRET1)[m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |.  sw SFARG1LO, LO(CRET1)[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0, <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  // RA = src*8, RB = table*8, RC = index*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |  addu CARG2, BASE, RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  lw CARG1, HI(CARG2)[m
[31m-    |  li AT, LJ_TTAB[m
[31m-    |   lw TAB:RB, LO(CARG2)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  bne CARG1, AT, ->vmeta_tsetb[m
[31m-    |.  srl TMP0, RC, 3[m
[31m-    |  lw TMP1, TAB:RB->asize[m
[31m-    |   lw TMP2, TAB:RB->array[m
[31m-    |  sltu AT, TMP0, TMP1[m
[31m-    |  beqz AT, ->vmeta_tsetb[m
[31m-    |.  addu RC, TMP2, RC[m
[31m-    |  lw TMP1, HI(RC)[m
[31m-    |   lbu TMP3, TAB:RB->marked[m
[31m-    |  beq TMP1, TISNIL, >5[m
[31m-    |1:[m
[31m-    |.  lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |  andi AT, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |   sw SFRETHI, HI(RC)[m
[31m-    |  bnez AT, >7[m
[31m-    |.   sw SFRETLO, LO(RC)[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  lw TAB:TMP2, TAB:RB->metatable[m
[31m-    |  beqz TAB:TMP2, <1		// No metatable: done.[m
[31m-    |.  nop[m
[31m-    |  lbu TMP1, TAB:TMP2->nomm[m
[31m-    |  andi TMP1, TMP1, 1<<MM_newindex[m
[31m-    |  bnez TMP1, <1			// 'no __newindex' flag set: done.[m
[31m-    |.  nop[m
[31m-    |  b ->vmeta_tsetb			// Caveat: preserve TMP0 and CARG2![m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0, <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RDtoRC8 RC, RD[m
[31m-    |  addu CARG1, BASE, RB[m
[31m-    |   addu CARG3, BASE, RC[m
[31m-    |  lw TAB:CARG2, LO(CARG1)[m
[31m-    |   lw CARG3, LO(CARG3)[m
[31m-    |  lbu TMP3, TAB:CARG2->marked[m
[31m-    |   lw TMP0, TAB:CARG2->asize[m
[31m-    |    lw TMP1, TAB:CARG2->array[m
[31m-    |  andi AT, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  bnez AT, >7[m
[31m-    |.  addu RA, BASE, RA[m
[31m-    |2:[m
[31m-    |  sltu AT, CARG3, TMP0[m
[31m-    |   sll TMP2, CARG3, 3[m
[31m-    |  beqz AT, ->vmeta_tsetr		// In array part?[m
[31m-    |.  addu CRET1, TMP1, TMP2[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |  lw SFARG1HI, HI(RA)[m
[31m-    |   lw SFARG1LO, LO(RA)[m
[31m-    |  ins_next1[m
[31m-    |  sw SFARG1HI, HI(CRET1)[m
[31m-    |   sw SFARG1LO, LO(CRET1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0, <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  // RA = base*8 (table at base-1), RD = num_const*8 (start index)[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |1:[m
[31m-    |   addu TMP3, KBASE, RD[m
[31m-    |  lw TAB:CARG2, -8+LO(RA)		// Guaranteed to be a table.[m
[31m-    |    addiu TMP0, MULTRES, -8[m
[31m-    |   lw TMP3, LO(TMP3)		// Integer constant is in lo-word.[m
[31m-    |    beqz TMP0, >4			// Nothing to copy?[m
[31m-    |.    srl CARG3, TMP0, 3[m
[31m-    |  addu CARG3, CARG3, TMP3[m
[31m-    |  lw TMP2, TAB:CARG2->asize[m
[31m-    |   sll TMP1, TMP3, 3[m
[31m-    |    lbu TMP3, TAB:CARG2->marked[m
[31m-    |   lw CARG1, TAB:CARG2->array[m
[31m-    |  sltu AT, TMP2, CARG3[m
[31m-    |  bnez AT, >5[m
[31m-    |.  addu TMP2, RA, TMP0[m
[31m-    |   addu TMP1, TMP1, CARG1[m
[31m-    |  andi TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |   lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |    addiu RA, RA, 8[m
[31m-    |  sltu AT, RA, TMP2[m
[31m-    |   sw SFRETHI, HI(TMP1)[m
[31m-    |    sw SFRETLO, LO(TMP1)[m
[31m-    |  bnez AT, <3[m
[31m-    |.   addiu TMP1, TMP1, 8[m
[31m-    |  bnez TMP0, >7[m
[31m-    |. nop[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |  load_got lj_tab_reasize[m
[31m-    |   sw BASE, L->base[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  move BASE, RD[m
[31m-    |  call_intern lj_tab_reasize	// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |.  move CARG1, L[m
[31m-    |  // Must not reallocate the stack.[m
[31m-    |  move RD, BASE[m
[31m-    |  b <1[m
[31m-    |.  lw BASE, L->base	// Reload BASE for lack of a saved register.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP3, TMP0, <4[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALLM:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8,) RC = extra_nargs*8[m
[31m-    |  decode_RDtoRC8 NARGS8:RC, RD[m
[31m-    |  b ->BC_CALL_Z[m
[31m-    |.  addu NARGS8:RC, NARGS8:RC, MULTRES[m
[31m-    break;[m
[31m-  case BC_CALL:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8[m
[31m-    |  decode_RDtoRC8 NARGS8:RC, RD[m
[31m-    |->BC_CALL_Z:[m
[31m-    |  move TMP2, BASE[m
[31m-    |  addu BASE, BASE, RA[m
[31m-    |   li AT, LJ_TFUNC[m
[31m-    |  lw TMP0, HI(BASE)[m
[31m-    |   lw LFUNC:RB, LO(BASE)[m
[31m-    |   addiu BASE, BASE, 8[m
[31m-    |  bne TMP0, AT, ->vmeta_call[m
[31m-    |.  addiu NARGS8:RC, NARGS8:RC, -8[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = extra_nargs*8[m
[31m-    |  addu NARGS8:RD, NARGS8:RD, MULTRES	// BC_CALLT gets RC from RD.[m
[31m-    |  // Fall through. Assumes BC_CALLT follows.[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = (nargs+1)*8[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |   li AT, LJ_TFUNC[m
[31m-    |  lw TMP0, HI(RA)[m
[31m-    |   lw LFUNC:RB, LO(RA)[m
[31m-    |   move NARGS8:RC, RD[m
[31m-    |    lw TMP1, FRAME_PC(BASE)[m
[31m-    |   addiu RA, RA, 8[m
[31m-    |  bne TMP0, AT, ->vmeta_callt[m
[31m-    |.  addiu NARGS8:RC, NARGS8:RC, -8[m
[31m-    |->BC_CALLT_Z:[m
[31m-    |  andi TMP0, TMP1, FRAME_TYPE	// Caveat: preserve TMP0 until the 'or'.[m
[31m-    |   lbu TMP3, LFUNC:RB->ffid[m
[31m-    |  bnez TMP0, >7[m
[31m-    |.  xori TMP2, TMP1, FRAME_VARG[m
[31m-    |1:[m
[31m-    |  sw LFUNC:RB, FRAME_FUNC(BASE)	// Copy function down, but keep PC.[m
[31m-    |  sltiu AT, TMP3, 2		// (> FF_C) Calling a fast function?[m
[31m-    |  move TMP2, BASE[m
[31m-    |  beqz NARGS8:RC, >3[m
[31m-    |.  move TMP3, NARGS8:RC[m
[31m-    |2:[m
[31m-    |   lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |    addiu RA, RA, 8[m
[31m-    |  addiu TMP3, TMP3, -8[m
[31m-    |   sw SFRETHI, HI(TMP2)[m
[31m-    |    sw SFRETLO, LO(TMP2)[m
[31m-    |  bnez TMP3, <2[m
[31m-    |.   addiu TMP2, TMP2, 8[m
[31m-    |3:[m
[31m-    |  or TMP0, TMP0, AT[m
[31m-    |  beqz TMP0, >5[m
[31m-    |.  nop[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function with a Lua frame below.[m
[31m-    |  lw INS, -4(TMP1)[m
[31m-    |  decode_RA8a RA, INS[m
[31m-    |  decode_RA8b RA[m
[31m-    |  subu TMP1, BASE, RA[m
[31m-    |  lw LFUNC:TMP1, -8+FRAME_FUNC(TMP1)[m
[31m-    |  lw TMP1, LFUNC:TMP1->pc[m
[31m-    |  b <4[m
[31m-    |.  lw KBASE, PC2PROTO(k)(TMP1)	// Need to prepare KBASE.[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  andi AT, TMP2, FRAME_TYPEP[m
[31m-    |  bnez AT, <1			// Vararg frame below?[m
[31m-    |.  subu TMP2, BASE, TMP2		// Relocate BASE down.[m
[31m-    |  move BASE, TMP2[m
[31m-    |  lw TMP1, FRAME_PC(TMP2)[m
[31m-    |  b <1[m
[31m-    |.  andi TMP0, TMP1, FRAME_TYPE[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8))[m
[31m-    |  move TMP2, BASE[m
[31m-    |  addu BASE, BASE, RA[m
[31m-    |   li AT, LJ_TFUNC[m
[31m-    |  lw TMP1, -24+HI(BASE)[m
[31m-    |   lw LFUNC:RB, -24+LO(BASE)[m
[31m-    |    lw SFARG1HI, -16+HI(BASE)[m
[31m-    |     lw SFARG1LO, -16+LO(BASE)[m
[31m-    |    lw SFARG2HI, -8+HI(BASE)[m
[31m-    |     lw SFARG2LO, -8+LO(BASE)[m
[31m-    |  sw TMP1, HI(BASE)		// Copy callable.[m
[31m-    |   sw LFUNC:RB, LO(BASE)[m
[31m-    |    sw SFARG1HI, 8+HI(BASE)	// Copy state.[m
[31m-    |     sw SFARG1LO, 8+LO(BASE)[m
[31m-    |    sw SFARG2HI, 16+HI(BASE)	// Copy control var.[m
[31m-    |     sw SFARG2LO, 16+LO(BASE)[m
[31m-    |   addiu BASE, BASE, 8[m
[31m-    |  bne TMP1, AT, ->vmeta_call[m
[31m-    |.  li NARGS8:RC, 16		// Iterators get 2 arguments.[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8)[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  lw TAB:RB, -16+LO(RA)[m
[31m-    |  lw RC, -8+LO(RA)			// Get index from control var.[m
[31m-    |  lw TMP0, TAB:RB->asize[m
[31m-    |  lw TMP1, TAB:RB->array[m
[31m-    |   addiu PC, PC, 4[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  sltu AT, RC, TMP0[m
[31m-    |  beqz AT, >5			// Index points after array part?[m
[31m-    |.  sll TMP3, RC, 3[m
[31m-    |  addu TMP3, TMP1, TMP3[m
[31m-    |  lw SFARG1HI, HI(TMP3)[m
[31m-    |   lw SFARG1LO, LO(TMP3)[m
[31m-    |     lhu RD, -4+OFS_RD(PC)[m
[31m-    |  sw TISNUM, HI(RA)[m
[31m-    |   sw RC, LO(RA)[m
[31m-    |  beq SFARG1HI, TISNIL, <1		// Skip holes in array part.[m
[31m-    |.  addiu RC, RC, 1[m
[31m-    |  sw SFARG1HI, 8+HI(RA)[m
[31m-    |   sw SFARG1LO, 8+LO(RA)[m
[31m-    |     lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |     decode_RD4b RD[m
[31m-    |     addu RD, RD, TMP3[m
[31m-    |   sw RC, -8+LO(RA)		// Update control var.[m
[31m-    |     addu PC, PC, RD[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  lw TMP1, TAB:RB->hmask[m
[31m-    |  subu RC, RC, TMP0[m
[31m-    |   lw TMP2, TAB:RB->node[m
[31m-    |6:[m
[31m-    |  sltu AT, TMP1, RC		// End of iteration? Branch to ITERL+1.[m
[31m-    |  bnez AT, <3[m
[31m-    |.  sll TMP3, RC, 5[m
[31m-    |   sll RB, RC, 3[m
[31m-    |   subu TMP3, TMP3, RB[m
[31m-    |  addu NODE:TMP3, TMP3, TMP2[m
[31m-    |  lw SFARG1HI, NODE:TMP3->val.u32.hi[m
[31m-    |   lw SFARG1LO, NODE:TMP3->val.u32.lo[m
[31m-    |     lhu RD, -4+OFS_RD(PC)[m
[31m-    |  beq SFARG1HI, TISNIL, <6		// Skip holes in hash part.[m
[31m-    |.  addiu RC, RC, 1[m
[31m-    |  lw SFARG2HI, NODE:TMP3->key.u32.hi[m
[31m-    |   lw SFARG2LO, NODE:TMP3->key.u32.lo[m
[31m-    |     lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  sw SFARG1HI, 8+HI(RA)[m
[31m-    |   sw SFARG1LO, 8+LO(RA)[m
[31m-    |    addu RC, RC, TMP0[m
[31m-    |     decode_RD4b RD[m
[31m-    |     addu RD, RD, TMP3[m
[31m-    |  sw SFARG2HI, HI(RA)[m
[31m-    |   sw SFARG2LO, LO(RA)[m
[31m-    |     addu PC, PC, RD[m
[31m-    |  b <3[m
[31m-    |.  sw RC, -8+LO(RA)		// Update control var.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  // RA = base*8, RD = target (points to ITERN)[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |    srl TMP0, RD, 1[m
[31m-    |  lw CARG1, -24+HI(RA)[m
[31m-    |  lw CFUNC:CARG2, -24+LO(RA)[m
[31m-    |    addu TMP0, PC, TMP0[m
[31m-    |   lw CARG3, -16+HI(RA)[m
[31m-    |   lw CARG4, -8+HI(RA)[m
[31m-    |  li AT, LJ_TFUNC[m
[31m-    |  bne CARG1, AT, >5[m
[31m-    |.   lui TMP2, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-    |  lbu CARG2, CFUNC:CARG2->ffid[m
[31m-    |   addiu CARG3, CARG3, -LJ_TTAB[m
[31m-    |   addiu CARG4, CARG4, -LJ_TNIL[m
[31m-    |   or CARG3, CARG3, CARG4[m
[31m-    |  addiu CARG2, CARG2, -FF_next_N[m
[31m-    |  or CARG2, CARG2, CARG3[m
[31m-    |  bnez CARG2, >5[m
[31m-    |.  lui TMP1, 0xfffe[m
[31m-    |  addu PC, TMP0, TMP2[m
[31m-    |  ori TMP1, TMP1, 0x7fff[m
[31m-    |  sw r0, -8+LO(RA)			// Initialize control var.[m
[31m-    |  sw TMP1, -8+HI(RA)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  li TMP3, BC_JMP[m
[31m-    |   li TMP1, BC_ITERC[m
[31m-    |  sb TMP3, -4+OFS_OP(PC)[m
[31m-    |    addu PC, TMP0, TMP2[m
[31m-    |  b <1[m
[31m-    |.  sb TMP1, OFS_OP(PC)[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  // RA = base*8, RB = (nresults+1)*8, RC = numparams*8[m
[31m-    |  lw TMP0, FRAME_PC(BASE)[m
[31m-    |  decode_RDtoRC8 RC, RD[m
[31m-    |   decode_RB8a RB, INS[m
[31m-    |  addu RC, BASE, RC[m
[31m-    |   decode_RB8b RB[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |  addiu RC, RC, FRAME_VARG[m
[31m-    |   addu TMP2, RA, RB[m
[31m-    |  addiu TMP3, BASE, -8		// TMP3 = vtop[m
[31m-    |  subu RC, RC, TMP0		// RC = vbase[m
[31m-    |  // Note: RC may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  beqz RB, >5			// Copy all varargs?[m
[31m-    |.  subu TMP1, TMP3, RC[m
[31m-    |  addiu TMP2, TMP2, -16[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  lw CARG1, HI(RC)[m
[31m-    |  sltu AT, RC, TMP3[m
[31m-    |   lw CARG2, LO(RC)[m
[31m-    |    addiu RC, RC, 8[m
[31m-    |  movz CARG1, TISNIL, AT[m
[31m-    |  sw CARG1, HI(RA)[m
[31m-    |   sw CARG2, LO(RA)[m
[31m-    |  sltu AT, RA, TMP2[m
[31m-    |  bnez AT, <1[m
[31m-    |.   addiu RA, RA, 8[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  lw TMP0, L->maxstack[m
[31m-    |  blez TMP1, <3			// No vararg slots?[m
[31m-    |.  li MULTRES, 8			// MULTRES = (0+1)*8[m
[31m-    |  addu TMP2, RA, TMP1[m
[31m-    |  sltu AT, TMP0, TMP2[m
[31m-    |  bnez AT, >7[m
[31m-    |.  addiu MULTRES, TMP1, 8[m
[31m-    |6:[m
[31m-    |  lw SFRETHI, HI(RC)[m
[31m-    |   lw SFRETLO, LO(RC)[m
[31m-    |   addiu RC, RC, 8[m
[31m-    |  sw SFRETHI, HI(RA)[m
[31m-    |   sw SFRETLO, LO(RA)[m
[31m-    |  sltu AT, RC, TMP3[m
[31m-    |  bnez AT, <6			// More vararg slots?[m
[31m-    |.  addiu RA, RA, 8[m
[31m-    |  b <3[m
[31m-    |.  nop[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  load_got lj_state_growstack[m
[31m-    |   sw RA, L->top[m
[31m-    |  subu RA, RA, BASE[m
[31m-    |   sw BASE, L->base[m
[31m-    |  subu BASE, RC, BASE		// Need delta, because BASE may change.[m
[31m-    |   sw PC, SAVE_PC[m
[31m-    |  srl CARG2, TMP1, 3[m
[31m-    |  call_intern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |.  move CARG1, L[m
[31m-    |  move RC, BASE[m
[31m-    |  lw BASE, L->base[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  addu RC, BASE, RC[m
[31m-    |  b <6[m
[31m-    |.  addiu TMP3, BASE, -8[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  // RA = results*8, RD = extra_nresults*8[m
[31m-    |  addu RD, RD, MULTRES		// MULTRES >= 8, so RD >= 8.[m
[31m-    |  // Fall through. Assumes BC_RET follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET:[m
[31m-    |  // RA = results*8, RD = (nresults+1)*8[m
[31m-    |  lw PC, FRAME_PC(BASE)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |    move MULTRES, RD[m
[31m-    |1:[m
[31m-    |  andi TMP0, PC, FRAME_TYPE[m
[31m-    |  bnez TMP0, ->BC_RETV_Z[m
[31m-    |.  xori TMP1, PC, FRAME_VARG[m
[31m-    |[m
[31m-    |->BC_RET_Z:[m
[31m-    |  // BASE = base, RA = resultptr, RD = (nresults+1)*8, PC = return[m
[31m-    |   lw INS, -4(PC)[m
[31m-    |    addiu TMP2, BASE, -8[m
[31m-    |    addiu RC, RD, -8[m
[31m-    |  decode_RA8a TMP0, INS[m
[31m-    |   decode_RB8a RB, INS[m
[31m-    |  decode_RA8b TMP0[m
[31m-    |   decode_RB8b RB[m
[31m-    |   addu TMP3, TMP2, RB[m
[31m-    |  beqz RC, >3[m
[31m-    |.  subu BASE, TMP2, TMP0[m
[31m-    |2:[m
[31m-    |   lw SFRETHI, HI(RA)[m
[31m-    |    lw SFRETLO, LO(RA)[m
[31m-    |    addiu RA, RA, 8[m
[31m-    |  addiu RC, RC, -8[m
[31m-    |   sw SFRETHI, HI(TMP2)[m
[31m-    |    sw SFRETLO, LO(TMP2)[m
[31m-    |  bnez RC, <2[m
[31m-    |.   addiu TMP2, TMP2, 8[m
[31m-    |3:[m
[31m-    |  addiu TMP3, TMP3, -8[m
[31m-    |5:[m
[31m-    |  sltu AT, TMP2, TMP3[m
[31m-    |  bnez AT, >6[m
[31m-    |.  lw LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP1, LFUNC:TMP1->pc[m
[31m-    |  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  sw TISNIL, HI(TMP2)[m
[31m-    |  b <5[m
[31m-    |.  addiu TMP2, TMP2, 8[m
[31m-    |[m
[31m-    |->BC_RETV_Z:  // Non-standard return case.[m
[31m-    |  andi TMP2, TMP1, FRAME_TYPEP[m
[31m-    |  bnez TMP2, ->vm_return[m
[31m-    |.  nop[m
[31m-    |  // Return from vararg function: relocate BASE down.[m
[31m-    |  subu BASE, BASE, TMP1[m
[31m-    |  b <1[m
[31m-    |.  lw PC, FRAME_PC(BASE)[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET0: case BC_RET1:[m
[31m-    |  // RA = results*8, RD = (nresults+1)*8[m
[31m-    |  lw PC, FRAME_PC(BASE)[m
[31m-    |   addu RA, BASE, RA[m
[31m-    |    move MULTRES, RD[m
[31m-    |  andi TMP0, PC, FRAME_TYPE[m
[31m-    |  bnez TMP0, ->BC_RETV_Z[m
[31m-    |.  xori TMP1, PC, FRAME_VARG[m
[31m-    |[m
[31m-    |  lw INS, -4(PC)[m
[31m-    |   addiu TMP2, BASE, -8[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  lw SFRETHI, HI(RA)[m
[31m-      |   lw SFRETLO, LO(RA)[m
[31m-    }[m
[31m-    |  decode_RB8a RB, INS[m
[31m-    |   decode_RA8a RA, INS[m
[31m-    |  decode_RB8b RB[m
[31m-    |   decode_RA8b RA[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  sw SFRETHI, HI(TMP2)[m
[31m-      |   sw SFRETLO, LO(TMP2)[m
[31m-    }[m
[31m-    |   subu BASE, TMP2, RA[m
[31m-    |5:[m
[31m-    |  sltu AT, RD, RB[m
[31m-    |  bnez AT, >6[m
[31m-    |.  lw LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-    |  ins_next1[m
[31m-    |  lw TMP1, LFUNC:TMP1->pc[m
[31m-    |  lw KBASE, PC2PROTO(k)(TMP1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  addiu TMP2, TMP2, 8[m
[31m-    |  addiu RD, RD, 8[m
[31m-    |  b <5[m
[31m-    if (op == BC_RET1) {[m
[31m-      |.  sw TISNIL, HI(TMP2)[m
[31m-    } else {[m
[31m-      |.  sw TISNIL, -8+HI(TMP2)[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IFORL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    |  // RA = base*8, RD = target (after end of loop or start of loop)[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  lw SFARG1HI, FORL_IDX*8+HI(RA)[m
[31m-    |   lw SFARG1LO, FORL_IDX*8+LO(RA)[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  srl RD, RD, 1[m
[31m-      |  lui TMP2, (-(BCBIAS_J*4 >> 16) & 65535)[m
[31m-      |  addu TMP2, RD, TMP2[m
[31m-    }[m
[31m-    if (!vk) {[m
[31m-      |  lw SFARG2HI, FORL_STOP*8+HI(RA)[m
[31m-      |   lw SFARG2LO, FORL_STOP*8+LO(RA)[m
[31m-      |  bne SFARG1HI, TISNUM, >5[m
[31m-      |.  lw SFRETHI, FORL_STEP*8+HI(RA)[m
[31m-      |  xor AT, SFARG2HI, TISNUM[m
[31m-      |   lw SFRETLO, FORL_STEP*8+LO(RA)[m
[31m-      |  xor TMP0, SFRETHI, TISNUM[m
[31m-      |  or AT, AT, TMP0[m
[31m-      |  bnez AT, ->vmeta_for[m
[31m-      |.  slt AT, SFRETLO, r0[m
[31m-      |  slt CRET1, SFARG2LO, SFARG1LO[m
[31m-      |  slt TMP1, SFARG1LO, SFARG2LO[m
[31m-      |  movn CRET1, TMP1, AT[m
[31m-    } else {[m
[31m-      |  bne SFARG1HI, TISNUM, >5[m
[31m-      |.  lw SFARG2LO, FORL_STEP*8+LO(RA)[m
[31m-      |  lw SFRETLO, FORL_STOP*8+LO(RA)[m
[31m-      |  move TMP3, SFARG1LO[m
[31m-      |  addu SFARG1LO, SFARG1LO, SFARG2LO[m
[31m-      |  xor TMP0, SFARG1LO, TMP3[m
[31m-      |  xor TMP1, SFARG1LO, SFARG2LO[m
[31m-      |  and TMP0, TMP0, TMP1[m
[31m-      |  slt TMP1, SFARG1LO, SFRETLO[m
[31m-      |  slt CRET1, SFRETLO, SFARG1LO[m
[31m-      |  slt AT, SFARG2LO, r0[m
[31m-      |   slt TMP0, TMP0, r0		// ((y^a) & (y^b)) < 0: overflow.[m
[31m-      |  movn CRET1, TMP1, AT[m
[31m-      |   or CRET1, CRET1, TMP0[m
[31m-    }[m
[31m-    |1:[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  movz TMP2, r0, CRET1[m
[31m-      |  addu PC, PC, TMP2[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  addu PC, PC, TMP2[m
[31m-      |  lhu RD, -4+OFS_RD(PC)[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  movn TMP2, r0, CRET1[m
[31m-      |  addu PC, PC, TMP2[m
[31m-    }[m
[31m-    if (vk) {[m
[31m-      |  sw SFARG1HI, FORL_IDX*8+HI(RA)[m
[31m-      |   sw SFARG1LO, FORL_IDX*8+LO(RA)[m
[31m-    }[m
[31m-    |  ins_next1[m
[31m-    |  sw SFARG1HI, FORL_EXT*8+HI(RA)[m
[31m-    |   sw SFARG1LO, FORL_EXT*8+LO(RA)[m
[31m-    |2:[m
[31m-    if (op == BC_JFORI) {[m
[31m-      |  beqz CRET1, =>BC_JLOOP[m
[31m-      |.  decode_RD8b RD[m
[31m-    } else if (op == BC_JFORL) {[m
[31m-      |  beqz CRET1, =>BC_JLOOP[m
[31m-    }[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |5:  // FP loop.[m
[31m-    |.if FPU[m
[31m-    if (!vk) {[m
[31m-      |  ldc1 f0, FORL_IDX*8(RA)[m
[31m-      |   ldc1 f2, FORL_STOP*8(RA)[m
[31m-      |  sltiu TMP0, SFARG1HI, LJ_TISNUM[m
[31m-      |  sltiu TMP1, SFARG2HI, LJ_TISNUM[m
[31m-      |  sltiu AT, SFRETHI, LJ_TISNUM[m
[31m-      |  and TMP0, TMP0, TMP1[m
[31m-      |  and AT, AT, TMP0[m
[31m-      |  beqz AT, ->vmeta_for[m
[31m-      |.  slt TMP3, SFRETHI, r0[m
[31m-      |  c.ole.d 0, f0, f2[m
[31m-      |  c.ole.d 1, f2, f0[m
[31m-      |  li CRET1, 1[m
[31m-      |  movt CRET1, r0, 0[m
[31m-      |  movt AT, r0, 1[m
[31m-      |  b <1[m
[31m-      |.  movn CRET1, AT, TMP3[m
[31m-    } else {[m
[31m-      |  ldc1 f0, FORL_IDX*8(RA)[m
[31m-      |   ldc1 f4, FORL_STEP*8(RA)[m
[31m-      |    ldc1 f2, FORL_STOP*8(RA)[m
[31m-      |   lw SFARG2HI, FORL_STEP*8+HI(RA)[m
[31m-      |  add.d f0, f0, f4[m
[31m-      |  c.ole.d 0, f0, f2[m
[31m-      |  c.ole.d 1, f2, f0[m
[31m-      |   slt TMP3, SFARG2HI, r0[m
[31m-      |  li CRET1, 1[m
[31m-      |  li AT, 1[m
[31m-      |  movt CRET1, r0, 0[m
[31m-      |  movt AT, r0, 1[m
[31m-      |  movn CRET1, AT, TMP3[m
[31m-      if (op == BC_IFORL) {[m
[31m-	|  movn TMP2, r0, CRET1[m
[31m-	|  addu PC, PC, TMP2[m
[31m-      }[m
[31m-      |  sdc1 f0, FORL_IDX*8(RA)[m
[31m-      |  ins_next1[m
[31m-      |  b <2[m
[31m-      |.  sdc1 f0, FORL_EXT*8(RA)[m
[31m-    }[m
[31m-    |.else[m
[31m-    if (!vk) {[m
[31m-      |  sltiu TMP0, SFARG1HI, LJ_TISNUM[m
[31m-      |  sltiu TMP1, SFARG2HI, LJ_TISNUM[m
[31m-      |  sltiu AT, SFRETHI, LJ_TISNUM[m
[31m-      |  and TMP0, TMP0, TMP1[m
[31m-      |  and AT, AT, TMP0[m
[31m-      |  beqz AT, ->vmeta_for[m
[31m-      |.  nop[m
[31m-      |  bal ->vm_sfcmpolex[m
[31m-      |.  move TMP3, SFRETHI[m
[31m-      |  b <1[m
[31m-      |.  nop[m
[31m-    } else {[m
[31m-      |   lw SFARG2HI, FORL_STEP*8+HI(RA)[m
[31m-      |  load_got __adddf3[m
[31m-      |  call_extern[m
[31m-      |.  sw TMP2, ARG5[m
[31m-      |  lw SFARG2HI, FORL_STOP*8+HI(RA)[m
[31m-      |   lw SFARG2LO, FORL_STOP*8+LO(RA)[m
[31m-      |  move SFARG1HI, SFRETHI[m
[31m-      |   move SFARG1LO, SFRETLO[m
[31m-      |  bal ->vm_sfcmpolex[m
[31m-      |.  lw TMP3, FORL_STEP*8+HI(RA)[m
[31m-      if ( op == BC_JFORL ) {[m
[31m-	|   lhu RD, -4+OFS_RD(PC)[m
[31m-	|  lw TMP2, ARG5[m
[31m-	|  b <1[m
[31m-	|.  decode_RD8b RD[m
[31m-      } else {[m
[31m-	|  b <1[m
[31m-	|.  lw TMP2, ARG5[m
[31m-      }[m
[31m-    }[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IITERL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  // RA = base*8, RD = target[m
[31m-    |  addu RA, BASE, RA[m
[31m-    |  lw TMP1, HI(RA)[m
[31m-    |  beq TMP1, TISNIL, >1		// Stop if iterator returned nil.[m
[31m-    |.  lw TMP2, LO(RA)[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  sw TMP1, -8+HI(RA)[m
[31m-      |  b =>BC_JLOOP[m
[31m-      |.  sw TMP2, -8+LO(RA)[m
[31m-    } else {[m
[31m-      |  branch_RD			// Otherwise save control var + branch.[m
[31m-      |  sw TMP1, -8+HI(RA)[m
[31m-      |   sw TMP2, -8+LO(RA)[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  // RA = base*8, RD = target (loop extent)[m
[31m-    |  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_ILOOP follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  // RA = base*8, RD = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  // RA = base*8 (ignored), RD = traceno*8[m
[31m-    |  lw TMP1, DISPATCH_J(trace)(DISPATCH)[m
[31m-    |  srl RD, RD, 1[m
[31m-    |   li AT, 0[m
[31m-    |  addu TMP1, TMP1, RD[m
[31m-    |  // Traces on MIPS don't store the trace number, so use 0.[m
[31m-    |   sw AT, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-    |  lw TRACE:TMP2, 0(TMP1)[m
[31m-    |   sw BASE, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-    |  lw TMP2, TRACE:TMP2->mcode[m
[31m-    |   sw L, DISPATCH_GL(tmpbuf.L)(DISPATCH)[m
[31m-    |  jr TMP2[m
[31m-    |.  addiu JGL, DISPATCH, GG_DISP2G+32768[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  // RA = base*8 (only used by trace recorder), RD = target[m
[31m-    |  branch_RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    |  // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8[m
[31m-    |  lw TMP2, L->maxstack[m
[31m-    |   lbu TMP1, -4+PC2PROTO(numparams)(PC)[m
[31m-    |    lw KBASE, -4+PC2PROTO(k)(PC)[m
[31m-    |  sltu AT, TMP2, RA[m
[31m-    |  bnez AT, ->vm_growstack_l[m
[31m-    |.  sll TMP1, TMP1, 3[m
[31m-    if (op != BC_JFUNCF) {[m
[31m-      |  ins_next1[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  sltu AT, NARGS8:RC, TMP1		// Check for missing parameters.[m
[31m-    |  bnez AT, >3[m
[31m-    |.  addu AT, BASE, NARGS8:RC[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  decode_RD8a RD, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-      |.  decode_RD8b RD[m
[31m-    } else {[m
[31m-      |  ins_next2[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  sw TISNIL, HI(AT)[m
[31m-    |  b <2[m
[31m-    |.  addiu NARGS8:RC, NARGS8:RC, 8[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    |  NYI  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8[m
[31m-    |   addu TMP1, BASE, RC[m
[31m-    |  lw TMP2, L->maxstack[m
[31m-    |  addu TMP0, RA, RC[m
[31m-    |   sw LFUNC:RB, LO(TMP1)		// Store copy of LFUNC.[m
[31m-    |   addiu TMP3, RC, 8+FRAME_VARG[m
[31m-    |  sltu AT, TMP0, TMP2[m
[31m-    |    lw KBASE, -4+PC2PROTO(k)(PC)[m
[31m-    |  beqz AT, ->vm_growstack_l[m
[31m-    |.  sw TMP3, HI(TMP1)		// Store delta + FRAME_VARG.[m
[31m-    |  lbu TMP2, -4+PC2PROTO(numparams)(PC)[m
[31m-    |   move RA, BASE[m
[31m-    |   move RC, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  beqz TMP2, >3[m
[31m-    |.  addiu BASE, TMP1, 8[m
[31m-    |1:[m
[31m-    |  lw TMP0, HI(RA)[m
[31m-    |   lw TMP3, LO(RA)[m
[31m-    |  sltu AT, RA, RC			// Less args than parameters?[m
[31m-    |  move CARG1, TMP0[m
[31m-    |  movz TMP0, TISNIL, AT		// Clear missing parameters.[m
[31m-    |  movn CARG1, TISNIL, AT		// Clear old fixarg slot (help the GC).[m
[31m-    |   sw TMP3, 8+LO(TMP1)[m
[31m-    |    addiu TMP2, TMP2, -1[m
[31m-    |  sw TMP0, 8+HI(TMP1)[m
[31m-    |    addiu TMP1, TMP1, 8[m
[31m-    |  sw CARG1, HI(RA)[m
[31m-    |  bnez TMP2, <1[m
[31m-    |.   addiu RA, RA, 8[m
[31m-    |3:[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  lw CFUNCADDR, CFUNC:RB->f[m
[31m-    } else {[m
[31m-      |  lw CFUNCADDR, DISPATCH_GL(wrapf)(DISPATCH)[m
[31m-    }[m
[31m-    |  addu TMP1, RA, NARGS8:RC[m
[31m-    |  lw TMP2, L->maxstack[m
[31m-    |   addu RC, BASE, NARGS8:RC[m
[31m-    |  sw BASE, L->base[m
[31m-    |  sltu AT, TMP2, TMP1[m
[31m-    |   sw RC, L->top[m
[31m-    |    li_vmstate C[m
[31m-    if (op == BC_FUNCCW) {[m
[31m-      |  lw CARG2, CFUNC:RB->f[m
[31m-    }[m
[31m-    |  bnez AT, ->vm_growstack_c	// Need to grow stack.[m
[31m-    |.  move CARG1, L[m
[31m-    |  jalr CFUNCADDR			// (lua_State *L [, lua_CFunction f])[m
[31m-    |.   st_vmstate[m
[31m-    |  // Returns nresults.[m
[31m-    |  lw BASE, L->base[m
[31m-    |   sll RD, CRET1, 3[m
[31m-    |  lw TMP1, L->top[m
[31m-    |    li_vmstate INTERP[m
[31m-    |  lw PC, FRAME_PC(BASE)		// Fetch PC of caller.[m
[31m-    |   subu RA, TMP1, RD		// RA = L->top - nresults*8[m
[31m-    |    sw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-    |  b ->vm_returnc[m
[31m-    |.   st_vmstate[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-[m
[31m-  build_subroutines(ctx);[m
[31m-[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  int i;[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.4byte .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.4byte 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 31\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.4byte .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.4byte .Lframe0\n"[m
[31m-	"\t.4byte .Lbegin\n"[m
[31m-	"\t.4byte %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"[m
[31m-	"\t.byte 0x9f\n\t.sleb128 1\n"[m
[31m-	"\t.byte 0x9e\n\t.sleb128 2\n",[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 23; i >= 16; i--)[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 26-i);[m
[31m-#if !LJ_SOFTFP[m
[31m-    for (i = 30; i >= 20; i -= 2)[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+32+i, 42-i);[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE0:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.4byte .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.4byte .Lframe0\n"[m
[31m-	"\t.4byte lj_vm_ffi_call\n"[m
[31m-	"\t.4byte %d\n"[m
[31m-	"\t.byte 0x9f\n\t.uleb128 1\n"[m
[31m-	"\t.byte 0x90\n\t.uleb128 2\n"[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x10\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#if !LJ_NO_UNWIND[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.globl lj_err_unwind_dwarf\n"[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.4byte .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.4byte 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 31\n"[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0\n"[m
[31m-	"\t.4byte lj_err_unwind_dwarf\n"[m
[31m-	"\t.byte 0\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.4byte .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.4byte .LASFDE2-.Lframe1\n"[m
[31m-	"\t.4byte .Lbegin\n"[m
[31m-	"\t.4byte %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"[m
[31m-	"\t.byte 0x9f\n\t.sleb128 1\n"[m
[31m-	"\t.byte 0x9e\n\t.sleb128 2\n",[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 23; i >= 16; i--)[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 26-i);[m
[31m-#if !LJ_SOFTFP[m
[31m-    for (i = 30; i >= 20; i -= 2)[m
[31m-      fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+32+i, 42-i);[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE2:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.4byte .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.4byte 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 31\n"[m
[31m-	"\t.uleb128 1\n"			/* augmentation length */[m
[31m-	"\t.byte 0\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.4byte .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.4byte .LASFDE3-.Lframe2\n"[m
[31m-	"\t.4byte lj_vm_ffi_call\n"[m
[31m-	"\t.4byte %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0x9f\n\t.uleb128 1\n"[m
[31m-	"\t.byte 0x90\n\t.uleb128 2\n"[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x10\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#endif[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_ppc.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_ppc.dasc[m
[1mdeleted file mode 100644[m
[1mindex be4356e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_ppc.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,5248 +0,0 @@[m
[31m-|// Low-level VM code for PowerPC 32 bit or 32on64 bit mode.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.arch ppc[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|// Note: The ragged indentation of the instructions is intentional.[m
[31m-|//       The starting columns indicate data dependencies.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// DynASM defines used by the PPC port:[m
[31m-|//[m
[31m-|// P64     64 bit pointers (only for GPR64 testing).[m
[31m-|//         Note: see vm_ppc64.dasc for a full PPC64 _LP64 port.[m
[31m-|// GPR64   64 bit registers (but possibly 32 bit pointers, e.g. PS3).[m
[31m-|//         Affects reg saves, stack layout, carry/overflow/dot flags etc.[m
[31m-|// FRAME32 Use 32 bit frame layout, even with GPR64 (Xbox 360).[m
[31m-|// TOC     Need table of contents (64 bit or 32 bit variant, e.g. PS3).[m
[31m-|//         Function pointers are really a struct: code, TOC, env (optional).[m
[31m-|// TOCENV  Function pointers have an environment pointer, too (not on PS3).[m
[31m-|// PPE     Power Processor Element of Cell (PS3) or Xenon (Xbox 360).[m
[31m-|//         Must avoid (slow) micro-coded instructions.[m
[31m-|[m
[31m-|.if P64[m
[31m-|.define TOC, 1[m
[31m-|.define TOCENV, 1[m
[31m-|.macro lpx, a, b, c; ldx a, b, c; .endmacro[m
[31m-|.macro lp, a, b; ld a, b; .endmacro[m
[31m-|.macro stp, a, b; std a, b; .endmacro[m
[31m-|.define decode_OPP, decode_OP8[m
[31m-|.if FFI[m
[31m-|// Missing: Calling conventions, 64 bit regs, TOC.[m
[31m-|.error lib_ffi not yet implemented for PPC64[m
[31m-|.endif[m
[31m-|.else[m
[31m-|.macro lpx, a, b, c; lwzx a, b, c; .endmacro[m
[31m-|.macro lp, a, b; lwz a, b; .endmacro[m
[31m-|.macro stp, a, b; stw a, b; .endmacro[m
[31m-|.define decode_OPP, decode_OP4[m
[31m-|.endif[m
[31m-|[m
[31m-|// Convenience macros for TOC handling.[m
[31m-|.if TOC[m
[31m-|// Linker needs a TOC patch area for every external call relocation.[m
[31m-|.macro blex, target; bl extern target@plt; nop; .endmacro[m
[31m-|.macro .toc, a, b; a, b; .endmacro[m
[31m-|.if P64[m
[31m-|.define TOC_OFS,	 8[m
[31m-|.define ENV_OFS,	16[m
[31m-|.else[m
[31m-|.define TOC_OFS,	4[m
[31m-|.define ENV_OFS,	8[m
[31m-|.endif[m
[31m-|.else  // No TOC.[m
[31m-|.macro blex, target; bl extern target@plt; .endmacro[m
[31m-|.macro .toc, a, b; .endmacro[m
[31m-|.endif[m
[31m-|.macro .tocenv, a, b; .if TOCENV; a, b; .endif; .endmacro[m
[31m-|[m
[31m-|.macro .gpr64, a, b; .if GPR64; a, b; .endif; .endmacro[m
[31m-|[m
[31m-|.macro andix., y, a, i[m
[31m-|.if PPE[m
[31m-|  rlwinm y, a, 0, 31-lj_fls(i), 31-lj_ffs(i)[m
[31m-|  cmpwi y, 0[m
[31m-|.else[m
[31m-|  andi. y, a, i[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro clrso, reg[m
[31m-|.if PPE[m
[31m-|  li reg, 0[m
[31m-|  mtxer reg[m
[31m-|.else[m
[31m-|  mcrxr cr0[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro checkov, reg, noov[m
[31m-|.if PPE[m
[31m-|  mfxer reg[m
[31m-|  add reg, reg, reg[m
[31m-|  cmpwi reg, 0[m
[31m-|   li reg, 0[m
[31m-|   mtxer reg[m
[31m-|  bgey noov[m
[31m-|.else[m
[31m-|  mcrxr cr0[m
[31m-|  bley noov[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|// Don't use: r1 = sp, r2 and r13 = reserved (TOC, TLS or SDATA)[m
[31m-|[m
[31m-|// The following must be C callee-save (but BASE is often refetched).[m
[31m-|.define BASE,		r14	// Base of current Lua stack frame.[m
[31m-|.define KBASE,		r15	// Constants of current Lua function.[m
[31m-|.define PC,		r16	// Next PC.[m
[31m-|.define DISPATCH,	r17	// Opcode dispatch table.[m
[31m-|.define LREG,		r18	// Register holding lua_State (also in SAVE_L).[m
[31m-|.define MULTRES,	r19	// Size of multi-result: (nresults+1)*8.[m
[31m-|.define JGL,		r31	// On-trace: global_State + 32768.[m
[31m-|[m
[31m-|// Constants for type-comparisons, stores and conversions. C callee-save.[m
[31m-|.define TISNUM,	r22[m
[31m-|.define TISNIL,	r23[m
[31m-|.define ZERO,		r24[m
[31m-|.define TOBIT,		f30	// 2^52 + 2^51.[m
[31m-|.define TONUM,		f31	// 2^52 + 2^51 + 2^31.[m
[31m-|[m
[31m-|// The following temporaries are not saved across C calls, except for RA.[m
[31m-|.define RA,		r20	// Callee-save.[m
[31m-|.define RB,		r10[m
[31m-|.define RC,		r11[m
[31m-|.define RD,		r12[m
[31m-|.define INS,		r7	// Overlaps CARG5.[m
[31m-|[m
[31m-|.define TMP0,		r0[m
[31m-|.define TMP1,		r8[m
[31m-|.define TMP2,		r9[m
[31m-|.define TMP3,		r6	// Overlaps CARG4.[m
[31m-|[m
[31m-|// Saved temporaries.[m
[31m-|.define SAVE0,		r21[m
[31m-|[m
[31m-|// Calling conventions.[m
[31m-|.define CARG1,		r3[m
[31m-|.define CARG2,		r4[m
[31m-|.define CARG3,		r5[m
[31m-|.define CARG4,		r6	// Overlaps TMP3.[m
[31m-|.define CARG5,		r7	// Overlaps INS.[m
[31m-|[m
[31m-|.define FARG1,		f1[m
[31m-|.define FARG2,		f2[m
[31m-|[m
[31m-|.define CRET1,		r3[m
[31m-|.define CRET2,		r4[m
[31m-|[m
[31m-|.define TOCREG,	r2	// TOC register (only used by C code).[m
[31m-|.define ENVREG,	r11	// Environment pointer (nested C functions).[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|.if GPR64[m
[31m-|.if FRAME32[m
[31m-|[m
[31m-|//			456(sp) // \ 32/64 bit C frame info[m
[31m-|.define TONUM_LO,	452(sp) // |[m
[31m-|.define TONUM_HI,	448(sp) // |[m
[31m-|.define TMPD_LO,	444(sp) // |[m
[31m-|.define TMPD_HI,	440(sp) // |[m
[31m-|.define SAVE_CR,	432(sp) // | 64 bit CR save.[m
[31m-|.define SAVE_ERRF,	424(sp) //  > Parameter save area.[m
[31m-|.define SAVE_NRES,	420(sp) // |[m
[31m-|.define SAVE_L,	416(sp) // |[m
[31m-|.define SAVE_PC,	412(sp) // |[m
[31m-|.define SAVE_MULTRES,	408(sp) // |[m
[31m-|.define SAVE_CFRAME,	400(sp) // / 64 bit C frame chain.[m
[31m-|//			392(sp) // Reserved.[m
[31m-|.define CFRAME_SPACE,	384     // Delta for sp.[m
[31m-|// Back chain for sp:	384(sp) <-- sp entering interpreter[m
[31m-|.define SAVE_LR,	376(sp) // 32 bit LR stored in hi-part.[m
[31m-|.define SAVE_GPR_,	232     // .. 232+18*8: 64 bit GPR saves.[m
[31m-|.define SAVE_FPR_,	88      // .. 88+18*8: 64 bit FPR saves.[m
[31m-|//			80(sp) // Needed for 16 byte stack frame alignment.[m
[31m-|//			16(sp)  // Callee parameter save area (ABI mandated).[m
[31m-|//			8(sp)   // Reserved[m
[31m-|// Back chain for sp:	0(sp)   <-- sp while in interpreter[m
[31m-|// 32 bit sp stored in hi-part of 0(sp).[m
[31m-|[m
[31m-|.define TMPD_BLO,	447(sp)[m
[31m-|.define TMPD,		TMPD_HI[m
[31m-|.define TONUM_D,	TONUM_HI[m
[31m-|[m
[31m-|.else[m
[31m-|[m
[31m-|//			508(sp) // \ 32 bit C frame info.[m
[31m-|.define SAVE_ERRF,	472(sp) // |[m
[31m-|.define SAVE_NRES,	468(sp) // |[m
[31m-|.define SAVE_L,	464(sp) //  > Parameter save area.[m
[31m-|.define SAVE_PC,	460(sp) // |[m
[31m-|.define SAVE_MULTRES,	456(sp) // |[m
[31m-|.define SAVE_CFRAME,	448(sp) // / 64 bit C frame chain.[m
[31m-|.define SAVE_LR,	416(sp)[m
[31m-|.define CFRAME_SPACE,	400     // Delta for sp.[m
[31m-|// Back chain for sp:	400(sp) <-- sp entering interpreter[m
[31m-|.define SAVE_FPR_,	256     // .. 256+18*8: 64 bit FPR saves.[m
[31m-|.define SAVE_GPR_,	112     // .. 112+18*8: 64 bit GPR saves.[m
[31m-|//			48(sp)  // Callee parameter save area (ABI mandated).[m
[31m-|.define SAVE_TOC,	40(sp)  // TOC save area.[m
[31m-|.define TMPD_LO,	36(sp)  // \ Link editor temp (ABI mandated).[m
[31m-|.define TMPD_HI,	32(sp)  // /[m
[31m-|.define TONUM_LO,	28(sp)  // \ Compiler temp (ABI mandated).[m
[31m-|.define TONUM_HI,	24(sp)  // /[m
[31m-|// Next frame lr:	16(sp)[m
[31m-|.define SAVE_CR,	8(sp)  // 64 bit CR save.[m
[31m-|// Back chain for sp:	0(sp)	<-- sp while in interpreter[m
[31m-|[m
[31m-|.define TMPD_BLO,	39(sp)[m
[31m-|.define TMPD,		TMPD_HI[m
[31m-|.define TONUM_D,	TONUM_HI[m
[31m-|[m
[31m-|.endif[m
[31m-|.else[m
[31m-|[m
[31m-|.define SAVE_LR,	276(sp)[m
[31m-|.define CFRAME_SPACE,	272     // Delta for sp.[m
[31m-|// Back chain for sp:	272(sp) <-- sp entering interpreter[m
[31m-|.define SAVE_FPR_,	128     // .. 128+18*8: 64 bit FPR saves.[m
[31m-|.define SAVE_GPR_,	56      // .. 56+18*4: 32 bit GPR saves.[m
[31m-|.define SAVE_CR,	52(sp)  // 32 bit CR save.[m
[31m-|.define SAVE_ERRF,	48(sp)  // 32 bit C frame info.[m
[31m-|.define SAVE_NRES,	44(sp)[m
[31m-|.define SAVE_CFRAME,	40(sp)[m
[31m-|.define SAVE_L,	36(sp)[m
[31m-|.define SAVE_PC,	32(sp)[m
[31m-|.define SAVE_MULTRES,	28(sp)[m
[31m-|.define UNUSED1,	24(sp)[m
[31m-|.define TMPD_LO,	20(sp)[m
[31m-|.define TMPD_HI,	16(sp)[m
[31m-|.define TONUM_LO,	12(sp)[m
[31m-|.define TONUM_HI,	8(sp)[m
[31m-|// Next frame lr:	4(sp)[m
[31m-|// Back chain for sp:	0(sp)	<-- sp while in interpreter[m
[31m-|[m
[31m-|.define TMPD_BLO,	23(sp)[m
[31m-|.define TMPD,		TMPD_HI[m
[31m-|.define TONUM_D,	TONUM_HI[m
[31m-|[m
[31m-|.endif[m
[31m-|[m
[31m-|.macro save_, reg[m
[31m-|.if GPR64[m
[31m-|  std r..reg, SAVE_GPR_+(reg-14)*8(sp)[m
[31m-|.else[m
[31m-|  stw r..reg, SAVE_GPR_+(reg-14)*4(sp)[m
[31m-|.endif[m
[31m-|  stfd f..reg, SAVE_FPR_+(reg-14)*8(sp)[m
[31m-|.endmacro[m
[31m-|.macro rest_, reg[m
[31m-|.if GPR64[m
[31m-|  ld r..reg, SAVE_GPR_+(reg-14)*8(sp)[m
[31m-|.else[m
[31m-|  lwz r..reg, SAVE_GPR_+(reg-14)*4(sp)[m
[31m-|.endif[m
[31m-|  lfd f..reg, SAVE_FPR_+(reg-14)*8(sp)[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro saveregs[m
[31m-|.if GPR64 and not FRAME32[m
[31m-|  stdu sp, -CFRAME_SPACE(sp)[m
[31m-|.else[m
[31m-|  stwu sp, -CFRAME_SPACE(sp)[m
[31m-|.endif[m
[31m-|  save_ 14; save_ 15; save_ 16[m
[31m-|  mflr r0[m
[31m-|  save_ 17; save_ 18; save_ 19; save_ 20; save_ 21; save_ 22[m
[31m-|.if GPR64 and not FRAME32[m
[31m-|  std r0, SAVE_LR[m
[31m-|.else[m
[31m-|  stw r0, SAVE_LR[m
[31m-|.endif[m
[31m-|  save_ 23; save_ 24; save_ 25[m
[31m-|  mfcr r0[m
[31m-|  save_ 26; save_ 27; save_ 28; save_ 29; save_ 30; save_ 31[m
[31m-|.if GPR64[m
[31m-|  std r0, SAVE_CR[m
[31m-|.else[m
[31m-|  stw r0, SAVE_CR[m
[31m-|.endif[m
[31m-|  .toc std TOCREG, SAVE_TOC[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro restoreregs[m
[31m-|.if GPR64 and not FRAME32[m
[31m-|  ld r0, SAVE_LR[m
[31m-|.else[m
[31m-|  lwz r0, SAVE_LR[m
[31m-|.endif[m
[31m-|.if GPR64[m
[31m-|  ld r12, SAVE_CR[m
[31m-|.else[m
[31m-|  lwz r12, SAVE_CR[m
[31m-|.endif[m
[31m-|  rest_ 14; rest_ 15; rest_ 16; rest_ 17; rest_ 18; rest_ 19[m
[31m-|  mtlr r0;[m
[31m-|.if PPE; mtocrf 0x20, r12; .else; mtcrf 0x38, r12; .endif[m
[31m-|  rest_ 20; rest_ 21; rest_ 22; rest_ 23; rest_ 24; rest_ 25[m
[31m-|.if PPE; mtocrf 0x10, r12; .endif[m
[31m-|  rest_ 26; rest_ 27; rest_ 28; rest_ 29; rest_ 30; rest_ 31[m
[31m-|.if PPE; mtocrf 0x08, r12; .endif[m
[31m-|  addi sp, sp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State,	LREG[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS8,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Trap for not-yet-implemented parts.[m
[31m-|.macro NYI; tw 4, sp, sp; .endmacro[m
[31m-|[m
[31m-|// int/FP conversions.[m
[31m-|.macro tonum_i, freg, reg[m
[31m-|  xoris reg, reg, 0x8000[m
[31m-|  stw reg, TONUM_LO[m
[31m-|  lfd freg, TONUM_D[m
[31m-|  fsub freg, freg, TONUM[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro tonum_u, freg, reg[m
[31m-|  stw reg, TONUM_LO[m
[31m-|  lfd freg, TONUM_D[m
[31m-|  fsub freg, freg, TOBIT[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro toint, reg, freg, tmpfreg[m
[31m-|  fctiwz tmpfreg, freg[m
[31m-|  stfd tmpfreg, TMPD[m
[31m-|  lwz reg, TMPD_LO[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro toint, reg, freg[m
[31m-|  toint reg, freg, freg[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Access to frame relative to BASE.[m
[31m-|.define FRAME_PC,	-8[m
[31m-|.define FRAME_FUNC,	-4[m
[31m-|[m
[31m-|// Instruction decode.[m
[31m-|.macro decode_OP4, dst, ins; rlwinm dst, ins, 2, 22, 29; .endmacro[m
[31m-|.macro decode_OP8, dst, ins; rlwinm dst, ins, 3, 21, 28; .endmacro[m
[31m-|.macro decode_RA8, dst, ins; rlwinm dst, ins, 27, 21, 28; .endmacro[m
[31m-|.macro decode_RB8, dst, ins; rlwinm dst, ins, 11, 21, 28; .endmacro[m
[31m-|.macro decode_RC8, dst, ins; rlwinm dst, ins, 19, 21, 28; .endmacro[m
[31m-|.macro decode_RD8, dst, ins; rlwinm dst, ins, 19, 13, 28; .endmacro[m
[31m-|[m
[31m-|.macro decode_OP1, dst, ins; rlwinm dst, ins, 0, 24, 31; .endmacro[m
[31m-|.macro decode_RD4, dst, ins; rlwinm dst, ins, 18, 14, 29; .endmacro[m
[31m-|[m
[31m-|// Instruction fetch.[m
[31m-|.macro ins_NEXT1[m
[31m-|  lwz INS, 0(PC)[m
[31m-|   addi PC, PC, 4[m
[31m-|.endmacro[m
[31m-|// Instruction decode+dispatch. Note: optimized for e300![m
[31m-|.macro ins_NEXT2[m
[31m-|  decode_OPP TMP1, INS[m
[31m-|  lpx TMP0, DISPATCH, TMP1[m
[31m-|  mtctr TMP0[m
[31m-|   decode_RB8 RB, INS[m
[31m-|   decode_RD8 RD, INS[m
[31m-|   decode_RA8 RA, INS[m
[31m-|   decode_RC8 RC, INS[m
[31m-|  bctr[m
[31m-|.endmacro[m
[31m-|.macro ins_NEXT[m
[31m-|  ins_NEXT1[m
[31m-|  ins_NEXT2[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|  .define ins_next1, ins_NEXT1[m
[31m-|  .define ins_next2, ins_NEXT2[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  .macro ins_next[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next1[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next2[m
[31m-|    b ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-|  lwz PC, LFUNC:RB->pc[m
[31m-|  lwz INS, 0(PC)[m
[31m-|   addi PC, PC, 4[m
[31m-|  decode_OPP TMP1, INS[m
[31m-|   decode_RA8 RA, INS[m
[31m-|  lpx TMP0, DISPATCH, TMP1[m
[31m-|   add RA, RA, BASE[m
[31m-|  mtctr TMP0[m
[31m-|  bctr[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, PC = caller PC[m
[31m-|  stw PC, FRAME_PC(BASE)[m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to test operand types.[m
[31m-|.macro checknum, reg; cmplw reg, TISNUM; .endmacro[m
[31m-|.macro checknum, cr, reg; cmplw cr, reg, TISNUM; .endmacro[m
[31m-|.macro checkstr, reg; cmpwi reg, LJ_TSTR; .endmacro[m
[31m-|.macro checktab, reg; cmpwi reg, LJ_TTAB; .endmacro[m
[31m-|.macro checkfunc, reg; cmpwi reg, LJ_TFUNC; .endmacro[m
[31m-|.macro checknil, reg; cmpwi reg, LJ_TNIL; .endmacro[m
[31m-|[m
[31m-|.macro branch_RD[m
[31m-|  srwi TMP0, RD, 1[m
[31m-|  addis PC, PC, -(BCBIAS_J*4 >> 16)[m
[31m-|  add PC, PC, TMP0[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|.macro hotcheck, delta, target[m
[31m-|  rlwinm TMP1, PC, 31, 25, 30[m
[31m-|  addi TMP1, TMP1, GG_DISP2HOT[m
[31m-|  lhzx TMP2, DISPATCH, TMP1[m
[31m-|  addic. TMP2, TMP2, -delta[m
[31m-|  sthx TMP2, DISPATCH, TMP1[m
[31m-|  blt target[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotloop[m
[31m-|  hotcheck HOTCOUNT_LOOP, ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall[m
[31m-|  hotcheck HOTCOUNT_CALL, ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state. Uses TMP0.[m
[31m-|.macro li_vmstate, st; li TMP0, ~LJ_VMST_..st; .endmacro[m
[31m-|.macro st_vmstate; stw TMP0, DISPATCH_GL(vmstate)(DISPATCH); .endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites mark and tmp.[m
[31m-|.macro barrierback, tab, mark, tmp[m
[31m-|  lwz tmp, DISPATCH_GL(gc.grayagain)(DISPATCH)[m
[31m-|  // Assumes LJ_GC_BLACK is 0x04.[m
[31m-|   rlwinm mark, mark, 0, 30, 28		// black2gray(tab)[m
[31m-|  stw tab, DISPATCH_GL(gc.grayagain)(DISPATCH)[m
[31m-|   stb mark, tab->marked[m
[31m-|  stw tmp, tab->gclist[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  // See vm_return. Also: TMP2 = previous base.[m
[31m-  |  andix. TMP0, PC, FRAME_P[m
[31m-  |   li TMP1, LJ_TTRUE[m
[31m-  |  beq ->cont_dispatch[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  lwz PC, FRAME_PC(TMP2)		// Fetch PC of previous frame.[m
[31m-  |  mr BASE, TMP2			// Restore caller base.[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |   stwu TMP1, FRAME_PC(RA)		// Prepend true to results.[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  addi RD, RD, 8			// RD = (nresults+1)*8.[m
[31m-  |   andix. TMP0, PC, FRAME_TYPE[m
[31m-  |  cmpwi cr1, RD, 0[m
[31m-  |  li CRET1, LUA_YIELD[m
[31m-  |  beq cr1, ->vm_unwind_c_eh[m
[31m-  |  mr MULTRES, RD[m
[31m-  |   beq ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return[m
[31m-  |  // TMP0 = PC & FRAME_TYPE[m
[31m-  |  cmpwi TMP0, FRAME_C[m
[31m-  |   rlwinm TMP2, PC, 0, 0, 28[m
[31m-  |    li_vmstate C[m
[31m-  |   sub TMP2, BASE, TMP2		// TMP2 = previous base.[m
[31m-  |  bney ->vm_returnp[m
[31m-  |[m
[31m-  |  addic. TMP1, RD, -8[m
[31m-  |   stp TMP2, L->base[m
[31m-  |   lwz TMP2, SAVE_NRES[m
[31m-  |    subi BASE, BASE, 8[m
[31m-  |    st_vmstate[m
[31m-  |   slwi TMP2, TMP2, 3[m
[31m-  |  beq >2[m
[31m-  |1:[m
[31m-  |  addic. TMP1, TMP1, -8[m
[31m-  |   lfd f0, 0(RA)[m
[31m-  |    addi RA, RA, 8[m
[31m-  |   stfd f0, 0(BASE)[m
[31m-  |    addi BASE, BASE, 8[m
[31m-  |  bney <1[m
[31m-  |[m
[31m-  |2:[m
[31m-  |  cmpw TMP2, RD			// More/less results wanted?[m
[31m-  |  bne >6[m
[31m-  |3:[m
[31m-  |  stp BASE, L->top			// Store new top.[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  lp TMP0, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |   li CRET1, 0			// Ok return status for vm_pcall.[m
[31m-  |  stp TMP0, L->cframe[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs[m
[31m-  |  blr[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  ble >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  lwz TMP1, L->maxstack[m
[31m-  |  cmplw BASE, TMP1[m
[31m-  |  bge >8[m
[31m-  |  stw TISNIL, 0(BASE)[m
[31m-  |  addi RD, RD, 8[m
[31m-  |  addi BASE, BASE, 8[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  subfic TMP3, TMP2, 0		// LUA_MULTRET+1 case?[m
[31m-  |   sub TMP0, RD, TMP2[m
[31m-  |  subfe TMP1, TMP1, TMP1		// TMP1 = TMP2 == 0 ? 0 : -1[m
[31m-  |   and TMP0, TMP0, TMP1[m
[31m-  |  sub BASE, BASE, TMP0		// Either keep top or shrink it.[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  stp BASE, L->top			// Save current top held in BASE (yes).[m
[31m-  |   mr SAVE0, RD[m
[31m-  |  srwi CARG2, TMP2, 3[m
[31m-  |  mr CARG1, L[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |    lwz TMP2, SAVE_NRES[m
[31m-  |   mr RD, SAVE0[m
[31m-  |    slwi TMP2, TMP2, 3[m
[31m-  |  lp BASE, L->top			// Need the (realloced) L->top in BASE.[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  mr sp, CARG1[m
[31m-  |  mr CRET1, CARG2[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  lwz L, SAVE_L[m
[31m-  |  .toc ld TOCREG, SAVE_TOC[m
[31m-  |   li TMP0, ~LJ_VMST_C[m
[31m-  |  lwz GL:TMP1, L->glref[m
[31m-  |   stw TMP0, GL:TMP1->vmstate[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |.if GPR64[m
[31m-  |  rldicr sp, CARG1, 0, 61[m
[31m-  |.else[m
[31m-  |  rlwinm sp, CARG1, 0, 0, 29[m
[31m-  |.endif[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  lwz L, SAVE_L[m
[31m-  |  .toc ld TOCREG, SAVE_TOC[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |  lp BASE, L->base[m
[31m-  |     lus TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |   lwz DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |     li ZERO, 0[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |  li TMP1, LJ_TFALSE[m
[31m-  |     ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     lfs TOBIT, TMPD[m
[31m-  |  lwz PC, FRAME_PC(BASE)		// Fetch PC of previous frame.[m
[31m-  |  la RA, -8(BASE)			// Results start at BASE-8.[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |   addi DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |  stw TMP1, 0(RA)			// Prepend false to error message.[m
[31m-  |  li RD, 16				// 2 results: false + error message.[m
[31m-  |    st_vmstate[m
[31m-  |     lfs TONUM, TMPD[m
[31m-  |  b ->vm_returnc[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  li CARG2, LUA_MINSTACK[m
[31m-  |  b >2[m
[31m-  |[m
[31m-  |->vm_growstack_l:			// Grow stack for Lua function.[m
[31m-  |  // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC[m
[31m-  |  add RC, BASE, RC[m
[31m-  |   sub RA, RA, BASE[m
[31m-  |  stp BASE, L->base[m
[31m-  |   addi PC, PC, 4			// Must point after first instruction.[m
[31m-  |  stp RC, L->top[m
[31m-  |   srwi CARG2, RA, 3[m
[31m-  |2:[m
[31m-  |  // L->base = new base, L->top = top[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  mr CARG1, L[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  lp BASE, L->base[m
[31m-  |  lp RC, L->top[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  sub RC, RC, BASE[m
[31m-  |  // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  mr L, CARG1[m
[31m-  |    lwz DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |  mr BASE, CARG2[m
[31m-  |    lbz TMP1, L->status[m
[31m-  |   stw L, SAVE_L[m
[31m-  |  li PC, FRAME_CP[m
[31m-  |  addi TMP0, sp, CFRAME_RESUME[m
[31m-  |    addi DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   stw CARG3, SAVE_NRES[m
[31m-  |    cmplwi TMP1, 0[m
[31m-  |   stw CARG3, SAVE_ERRF[m
[31m-  |   stp CARG3, SAVE_CFRAME[m
[31m-  |   stw CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  stp TMP0, L->cframe[m
[31m-  |    beq >3[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  mr RA, BASE[m
[31m-  |   lp BASE, L->base[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |   lp TMP1, L->top[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |     lus TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |    stb CARG3, L->status[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |     lfs TOBIT, TMPD[m
[31m-  |   sub RD, TMP1, BASE[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     lus TMP0, 0x4338		// Hiword of 2^52 + 2^51 (double)[m
[31m-  |   addi RD, RD, 8[m
[31m-  |     stw TMP0, TONUM_HI[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     li ZERO, 0[m
[31m-  |    st_vmstate[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |   mr MULTRES, RD[m
[31m-  |     lfs TONUM, TMPD[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  li PC, FRAME_CP[m
[31m-  |  stw CARG4, SAVE_ERRF[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  li PC, FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  lp TMP1, L:CARG1->cframe[m
[31m-  |    mr L, CARG1[m
[31m-  |   stw CARG3, SAVE_NRES[m
[31m-  |    lwz DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |   stw CARG1, SAVE_L[m
[31m-  |     mr BASE, CARG2[m
[31m-  |    addi DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |   stw CARG1, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |  stp TMP1, SAVE_CFRAME[m
[31m-  |  stp sp, L->cframe			// Add our C frame to cframe chain.[m
[31m-  |[m
[31m-  |3:  // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).[m
[31m-  |  stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  lp TMP2, L->base			// TMP2 = old base (used in vmeta_call).[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |   lp TMP1, L->top[m
[31m-  |     lus TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |  add PC, PC, BASE[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     li ZERO, 0[m
[31m-  |     ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |     lfs TOBIT, TMPD[m
[31m-  |  sub PC, PC, TMP2			// PC = frame delta + frame type[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     lus TMP0, 0x4338		// Hiword of 2^52 + 2^51 (double)[m
[31m-  |   sub NARGS8:RC, TMP1, BASE[m
[31m-  |     stw TMP0, TONUM_HI[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     lfs TONUM, TMPD[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |    st_vmstate[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC[m
[31m-  |  lwz TMP0, FRAME_PC(BASE)[m
[31m-  |   lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  checkfunc TMP0; bne ->vmeta_call[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, RB = func, RC = nargs*8, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  mr L, CARG1[m
[31m-  |   lwz TMP0, L:CARG1->stack[m
[31m-  |  stw CARG1, SAVE_L[m
[31m-  |   lp TMP1, L->top[m
[31m-  |     lwz DISPATCH, L->glref		// Setup pointer to dispatch table.[m
[31m-  |  stw CARG1, SAVE_PC			// Any value outside of bytecode is ok.[m
[31m-  |   sub TMP0, TMP0, TMP1		// Compute -savestack(L, L->top).[m
[31m-  |    lp TMP1, L->cframe[m
[31m-  |     addi DISPATCH, DISPATCH, GG_G2DISP[m
[31m-  |  .toc lp CARG4, 0(CARG4)[m
[31m-  |  li TMP2, 0[m
[31m-  |   stw TMP0, SAVE_NRES		// Neg. delta means cframe w/o frame.[m
[31m-  |  stw TMP2, SAVE_ERRF		// No error function.[m
[31m-  |    stp TMP1, SAVE_CFRAME[m
[31m-  |    stp sp, L->cframe		// Add our C frame to cframe chain.[m
[31m-  |     stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  mtctr CARG4[m
[31m-  |  bctrl			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |.if PPE[m
[31m-  |  mr BASE, CRET1[m
[31m-  |  cmpwi CRET1, 0[m
[31m-  |.else[m
[31m-  |  mr. BASE, CRET1[m
[31m-  |.endif[m
[31m-  |   li PC, FRAME_CP[m
[31m-  |  bne <3				// Else continue with the call.[m
[31m-  |  b ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// The lj_meta_* functions (except for lj_meta_cat) don't reallocate the[m
[31m-  |// stack, so BASE doesn't need to be reloaded across these calls.[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultptr, RD = (nresults+1)*8[m
[31m-  |  lwz TMP0, -12(BASE)		// Continuation.[m
[31m-  |   mr RB, BASE[m
[31m-  |   mr BASE, TMP2			// Restore caller BASE.[m
[31m-  |    lwz LFUNC:TMP1, FRAME_FUNC(TMP2)[m
[31m-  |.if FFI[m
[31m-  |  cmplwi TMP0, 1[m
[31m-  |.endif[m
[31m-  |     lwz PC, -16(RB)			// Restore PC from [cont|PC].[m
[31m-  |   subi TMP2, RD, 8[m
[31m-  |    lwz TMP1, LFUNC:TMP1->pc[m
[31m-  |   stwx TISNIL, RA, TMP2		// Ensure one valid arg.[m
[31m-  |.if FFI[m
[31m-  |  ble >1[m
[31m-  |.endif[m
[31m-  |    lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |  // BASE = base, RA = resultptr, RB = meta base[m
[31m-  |  mtctr TMP0[m
[31m-  |  bctr				// Jump to continuation.[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  beq ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: tailcall from C function.[m
[31m-  |  subi TMP1, RB, 16[m
[31m-  |  sub RC, TMP1, BASE[m
[31m-  |  b ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// RA = resultptr, RB = meta base[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |   subi CARG2, RB, 16[m
[31m-  |  decode_RB8 SAVE0, INS[m
[31m-  |   lfd f0, 0(RA)[m
[31m-  |  add TMP1, BASE, SAVE0[m
[31m-  |   stp BASE, L->base[m
[31m-  |  cmplw TMP1, CARG2[m
[31m-  |   sub CARG3, CARG2, TMP1[m
[31m-  |  decode_RA8 RA, INS[m
[31m-  |   stfd f0, 0(CARG2)[m
[31m-  |  bney ->BC_CAT_Z[m
[31m-  |   stfdx f0, BASE, RA[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets1:[m
[31m-  |  la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  li TMP0, LJ_TSTR[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  stw STR:RC, 4(CARG3)[m
[31m-  |   add CARG2, BASE, RB[m
[31m-  |  stw TMP0, 0(CARG3)[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  la CARG2, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  li TMP0, LJ_TTAB[m
[31m-  |  stw TAB:RB, 4(CARG2)[m
[31m-  |   la CARG3, DISPATCH_GL(tmptv2)(DISPATCH)[m
[31m-  |  stw TMP0, 0(CARG2)[m
[31m-  |   li TMP1, LJ_TSTR[m
[31m-  |   stw STR:RC, 4(CARG3)[m
[31m-  |   stw TMP1, 0(CARG3)[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetb:			// TMP0 = index[m
[31m-  |.if not DUALNUM[m
[31m-  |  tonum_u f0, TMP0[m
[31m-  |.endif[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |   add CARG2, BASE, RB[m
[31m-  |.if DUALNUM[m
[31m-  |  stw TISNUM, 0(CARG3)[m
[31m-  |  stw TMP0, 4(CARG3)[m
[31m-  |.else[m
[31m-  |  stfd f0, 0(CARG3)[m
[31m-  |.endif[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   add CARG3, BASE, RC[m
[31m-  |1:[m
[31m-  |  stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |  beq >3[m
[31m-  |   lfd f0, 0(CRET1)[m
[31m-  |  ins_next1[m
[31m-  |   stfdx f0, BASE, RA[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |  subfic TMP1, BASE, FRAME_CONT[m
[31m-  |  lp BASE, L->top[m
[31m-  |  stw PC, -16(BASE)			// [cont|PC][m
[31m-  |   add PC, TMP1, BASE[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |   li NARGS8:RC, 16			// 2 args for func(t, k).[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |  beq >1[m
[31m-  |  lfd f14, 0(CRET1)[m
[31m-  |  b ->BC_TGETR_Z[m
[31m-  |1:[m
[31m-  |  stwx TISNIL, BASE, RA[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets1:[m
[31m-  |  la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  li TMP0, LJ_TSTR[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  stw STR:RC, 4(CARG3)[m
[31m-  |   add CARG2, BASE, RB[m
[31m-  |  stw TMP0, 0(CARG3)[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  la CARG2, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |  li TMP0, LJ_TTAB[m
[31m-  |  stw TAB:RB, 4(CARG2)[m
[31m-  |   la CARG3, DISPATCH_GL(tmptv2)(DISPATCH)[m
[31m-  |  stw TMP0, 0(CARG2)[m
[31m-  |   li TMP1, LJ_TSTR[m
[31m-  |   stw STR:RC, 4(CARG3)[m
[31m-  |   stw TMP1, 0(CARG3)[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetb:			// TMP0 = index[m
[31m-  |.if not DUALNUM[m
[31m-  |  tonum_u f0, TMP0[m
[31m-  |.endif[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |   add CARG2, BASE, RB[m
[31m-  |.if DUALNUM[m
[31m-  |  stw TISNUM, 0(CARG3)[m
[31m-  |  stw TMP0, 4(CARG3)[m
[31m-  |.else[m
[31m-  |  stfd f0, 0(CARG3)[m
[31m-  |.endif[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  add CARG2, BASE, RB[m
[31m-  |   add CARG3, BASE, RC[m
[31m-  |1:[m
[31m-  |  stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // Returns TValue * (finished) or NULL (metamethod).[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |   lfdx f0, BASE, RA[m
[31m-  |  beq >3[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  ins_next1[m
[31m-  |   stfd f0, 0(CRET1)[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |  subfic TMP1, BASE, FRAME_CONT[m
[31m-  |  lp BASE, L->top[m
[31m-  |  stw PC, -16(BASE)			// [cont|PC][m
[31m-  |   add PC, TMP1, BASE[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |   li NARGS8:RC, 24			// 3 args for func(t, k, v)[m
[31m-  |  stfd f0, 16(BASE)			// Copy value to third argument.[m
[31m-  |  b ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |  stp BASE, L->base[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // Returns TValue *.[m
[31m-  |  stfd f14, 0(CRET1)[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  mr CARG1, L[m
[31m-  |   subi PC, PC, 4[m
[31m-  |.if DUALNUM[m
[31m-  |  mr CARG2, RA[m
[31m-  |.else[m
[31m-  |  add CARG2, BASE, RA[m
[31m-  |.endif[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |.if DUALNUM[m
[31m-  |  mr CARG3, RD[m
[31m-  |.else[m
[31m-  |  add CARG3, BASE, RD[m
[31m-  |.endif[m
[31m-  |   stp BASE, L->base[m
[31m-  |  decode_OP1 CARG4, INS[m
[31m-  |  bl extern lj_meta_comp  // (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |3:[m
[31m-  |  cmplwi CRET1, 1[m
[31m-  |  bgt ->vmeta_binop[m
[31m-  |  subfic CRET1, CRET1, 0[m
[31m-  |4:[m
[31m-  |  lwz INS, 0(PC)[m
[31m-  |   addi PC, PC, 4[m
[31m-  |  decode_RD4 TMP2, INS[m
[31m-  |  addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-  |  and TMP2, TMP2, CRET1[m
[31m-  |  add PC, PC, TMP2[m
[31m-  |->cont_nop:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_ra:				// RA = resultptr[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |   lfd f0, 0(RA)[m
[31m-  |  decode_RA8 TMP1, INS[m
[31m-  |   stfdx f0, BASE, TMP1[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |->cont_condt:			// RA = resultptr[m
[31m-  |  lwz TMP0, 0(RA)[m
[31m-  |  .gpr64 extsw TMP0, TMP0[m
[31m-  |  subfic TMP0, TMP0, LJ_TTRUE	// Branch if result is true.[m
[31m-  |  subfe CRET1, CRET1, CRET1[m
[31m-  |  not CRET1, CRET1[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->cont_condf:			// RA = resultptr[m
[31m-  |  lwz TMP0, 0(RA)[m
[31m-  |  .gpr64 extsw TMP0, TMP0[m
[31m-  |  subfic TMP0, TMP0, LJ_TTRUE	// Branch if result is false.[m
[31m-  |  subfe CRET1, CRET1, CRET1[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV.[m
[31m-  |  subi PC, PC, 4[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal  // (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  mr CARG2, INS[m
[31m-  |  subi PC, PC, 4[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_equal_cd		// (lua_State *L, BCIns op)[m
[31m-  |  // Returns 0/1 or TValue * (metamethod).[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  subi PC, PC, 4[m
[31m-  |   stp BASE, L->base[m
[31m-  |   srwi CARG2, RA, 3[m
[31m-  |   mr CARG1, L[m
[31m-  |   srwi CARG3, RD, 3[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  add CARG3, KBASE, RC[m
[31m-  |  add CARG4, BASE, RB[m
[31m-  |  b >1[m
[31m-  |->vmeta_arith_nv2:[m
[31m-  |.if DUALNUM[m
[31m-  |  mr CARG3, RC[m
[31m-  |  mr CARG4, RB[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  mr CARG3, RD[m
[31m-  |  mr CARG4, RD[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  add CARG3, BASE, RB[m
[31m-  |  add CARG4, KBASE, RC[m
[31m-  |  b >1[m
[31m-  |[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  add CARG3, BASE, RB[m
[31m-  |  add CARG4, BASE, RC[m
[31m-  |.if DUALNUM[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vn2:[m
[31m-  |->vmeta_arith_vv2:[m
[31m-  |.if DUALNUM[m
[31m-  |  mr CARG3, RB[m
[31m-  |  mr CARG4, RC[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  add CARG2, BASE, RA[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  decode_OP1 CARG5, INS		// Caveat: CARG5 overlaps INS.[m
[31m-  |  bl extern lj_meta_arith  // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |  beq ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2[m
[31m-  |  sub TMP1, CRET1, BASE[m
[31m-  |   stw PC, -16(CRET1)		// [cont|PC][m
[31m-  |   mr TMP2, BASE[m
[31m-  |  addi PC, TMP1, FRAME_CONT[m
[31m-  |   mr BASE, CRET1[m
[31m-  |  li NARGS8:RC, 16			// 2 args for func(o1, o2).[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-#if LJ_52[m
[31m-  |  mr SAVE0, CARG1[m
[31m-#endif[m
[31m-  |  mr CARG2, RD[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  bl extern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |  // Returns NULL (retry) or TValue * (metamethod base).[m
[31m-#if LJ_52[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |  bne ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |  mr CARG1, SAVE0[m
[31m-  |  b ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  b ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // TMP2 = old base, BASE = new base, RC = nargs*8[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp TMP2, L->base			// This is the callers base![m
[31m-  |  subi CARG2, BASE, 8[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  add CARG3, BASE, RC[m
[31m-  |   mr SAVE0, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)	// Guaranteed to be a function here.[m
[31m-  |   addi NARGS8:RC, SAVE0, 8		// Got one more argument now.[m
[31m-  |  ins_call[m
[31m-  |[m
[31m-  |->vmeta_callt:			// Resolve __call for BC_CALLT.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs*8[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp BASE, L->base[m
[31m-  |  subi CARG2, RA, 8[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  add CARG3, RA, RC[m
[31m-  |   mr SAVE0, NARGS8:RC[m
[31m-  |  bl extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  lwz TMP1, FRAME_PC(BASE)[m
[31m-  |   addi NARGS8:RC, SAVE0, 8		// Got one more argument now.[m
[31m-  |   lwz LFUNC:RB, FRAME_FUNC(RA)	// Guaranteed to be a function here.[m
[31m-  |  b ->BC_CALLT_Z[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp BASE, L->base[m
[31m-  |  mr CARG2, RA[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  mr SAVE0, INS[m
[31m-  |  bl extern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |.if JIT[m
[31m-  |   decode_OP1 TMP0, SAVE0[m
[31m-  |.endif[m
[31m-  |  decode_RA8 RA, SAVE0[m
[31m-  |.if JIT[m
[31m-  |   cmpwi TMP0, BC_JFORI[m
[31m-  |.endif[m
[31m-  |  decode_RD8 RD, SAVE0[m
[31m-  |.if JIT[m
[31m-  |   beqy =>BC_JFORI[m
[31m-  |.endif[m
[31m-  |  b =>BC_FORI[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz CARG1, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz CARG4, 8(BASE)[m
[31m-  |   lwz CARG1, 4(BASE)[m
[31m-  |    lwz CARG2, 12(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |   lwz CARG4, 8(BASE)[m
[31m-  |    lfd FARG2, 8(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  checknum CARG4; bge ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1.[m
[31m-  |.macro ffgccheck[m
[31m-  |  lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH)[m
[31m-  |  lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)[m
[31m-  |  cmplw TMP0, TMP1[m
[31m-  |  bgel ->fff_gcstep[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  li TMP1, LJ_TFALSE[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  cmplw cr1, CARG3, TMP1[m
[31m-  |    lwz PC, FRAME_PC(BASE)[m
[31m-  |  bge cr1, ->fff_fallback[m
[31m-  |   stw CARG3, 0(RA)[m
[31m-  |  addi RD, NARGS8:RC, 8		// Compute (nresults+1)*8.[m
[31m-  |   stw CARG1, 4(RA)[m
[31m-  |  beq ->fff_res			// Done if exactly 1 argument.[m
[31m-  |  li TMP1, 8[m
[31m-  |  subi RC, RC, 8[m
[31m-  |1:[m
[31m-  |  cmplw TMP1, RC[m
[31m-  |   lfdx f0, BASE, TMP1[m
[31m-  |   stfdx f0, RA, TMP1[m
[31m-  |    addi TMP1, TMP1, 8[m
[31m-  |  bney <1[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc type[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG1, 0(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  .gpr64 extsw CARG1, CARG1[m
[31m-  |  subfc TMP0, TISNUM, CARG1[m
[31m-  |  subfe TMP2, CARG1, CARG1[m
[31m-  |  orc TMP1, TMP2, TMP0[m
[31m-  |  addi TMP1, TMP1, ~LJ_TISNUM+1[m
[31m-  |  slwi TMP1, TMP1, 3[m
[31m-  |   la TMP2, CFUNC:RB->upvalue[m
[31m-  |  lfdx FARG1, TMP2, TMP1[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  checktab CARG3; bne >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  lwz TAB:CARG1, TAB:CARG1->metatable[m
[31m-  |2:[m
[31m-  |  li CARG3, LJ_TNIL[m
[31m-  |   cmplwi TAB:CARG1, 0[m
[31m-  |  lwz STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH)[m
[31m-  |   beq ->fff_restv[m
[31m-  |  lwz TMP0, TAB:CARG1->hmask[m
[31m-  |   li CARG3, LJ_TTAB			// Use metatable as default result.[m
[31m-  |  lwz TMP1, STR:RC->hash[m
[31m-  |  lwz NODE:TMP2, TAB:CARG1->node[m
[31m-  |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-  |  slwi TMP0, TMP1, 5[m
[31m-  |  slwi TMP1, TMP1, 3[m
[31m-  |  sub TMP1, TMP0, TMP1[m
[31m-  |  add NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  lwz CARG4, NODE:TMP2->key[m
[31m-  |   lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)[m
[31m-  |    lwz CARG2, NODE:TMP2->val[m
[31m-  |     lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2)[m
[31m-  |  checkstr CARG4; bne >4[m
[31m-  |   cmpw TMP0, STR:RC; beq >5[m
[31m-  |4:[m
[31m-  |  lwz NODE:TMP2, NODE:TMP2->next[m
[31m-  |  cmplwi NODE:TMP2, 0[m
[31m-  |  beq ->fff_restv			// Not found, keep default result.[m
[31m-  |  b <3[m
[31m-  |5:[m
[31m-  |  checknil CARG2[m
[31m-  |  beq ->fff_restv			// Ditto for nil value.[m
[31m-  |  mr CARG3, CARG2			// Return value of mt.__metatable.[m
[31m-  |  mr CARG1, TMP1[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  cmpwi CARG3, LJ_TUDATA; beq <1[m
[31m-  |  .gpr64 extsw CARG3, CARG3[m
[31m-  |  subfc TMP0, TISNUM, CARG3[m
[31m-  |  subfe TMP2, CARG3, CARG3[m
[31m-  |  orc TMP1, TMP2, TMP0[m
[31m-  |  addi TMP1, TMP1, ~LJ_TISNUM+1[m
[31m-  |  slwi TMP1, TMP1, 2[m
[31m-  |   la TMP2, DISPATCH_GL(gcroot[GCROOT_BASEMT])(DISPATCH)[m
[31m-  |  lwzx TAB:CARG1, TMP2, TMP1[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |   checktab CARG3; bne ->fff_fallback[m
[31m-  |  lwz TAB:TMP1, TAB:CARG1->metatable[m
[31m-  |   checktab CARG4; bne ->fff_fallback[m
[31m-  |  cmplwi TAB:TMP1, 0[m
[31m-  |   lbz TMP3, TAB:CARG1->marked[m
[31m-  |  bne ->fff_fallback[m
[31m-  |   andix. TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-  |    stw TAB:CARG2, TAB:CARG1->metatable[m
[31m-  |   beq ->fff_restv[m
[31m-  |  barrierback TAB:CARG1, TMP3, TMP0[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc rawget[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG4, 0(BASE)[m
[31m-  |    lwz TAB:CARG2, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checktab CARG4; bne ->fff_fallback[m
[31m-  |   la CARG3, 8(BASE)[m
[31m-  |   mr CARG1, L[m
[31m-  |  bl extern lj_tab_get  // (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // Returns cTValue *.[m
[31m-  |  lfd FARG1, 0(CRET1)[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG1, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  bne ->fff_fallback			// Exactly one argument.[m
[31m-  |   checknum CARG1; bgt ->fff_fallback[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  checkstr CARG3[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  beq ->fff_restv			// String key?[m
[31m-  |  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  lwz TMP0, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH)[m
[31m-  |  checknum CARG3[m
[31m-  |  cmplwi cr1, TMP0, 0[m
[31m-  |   stp BASE, L->base			// Add frame since C call can throw.[m
[31m-  |  crorc 4*cr0+eq, 4*cr0+gt, 4*cr1+eq[m
[31m-  |   stw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  beq ->fff_fallback[m
[31m-  |  ffgccheck[m
[31m-  |  mr CARG1, L[m
[31m-  |  mr CARG2, BASE[m
[31m-  |.if DUALNUM[m
[31m-  |  bl extern lj_strfmt_number		// (lua_State *L, cTValue *o)[m
[31m-  |.else[m
[31m-  |  bl extern lj_strfmt_num		// (lua_State *L, lua_Number *np)[m
[31m-  |.endif[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  li CARG3, LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc next[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG1, 0(BASE)[m
[31m-  |    lwz TAB:CARG2, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |   stwx TISNIL, BASE, NARGS8:RC	// Set missing 2nd arg to nil.[m
[31m-  |  checktab CARG1[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  bne ->fff_fallback[m
[31m-  |   stp BASE, L->base			// Add frame since C call can throw.[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp BASE, L->top			// Dummy frame length is ok.[m
[31m-  |  la CARG3, 8(BASE)[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  bl extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Returns 0 at end of traversal.[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |   li CARG3, LJ_TNIL[m
[31m-  |  beq ->fff_restv			// End of traversal: return nil.[m
[31m-  |  lfd f0, 8(BASE)			// Copy key and value to results.[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  lfd f1, 16(BASE)[m
[31m-  |  stfd f0, 0(RA)[m
[31m-  |   li RD, (2+1)*8[m
[31m-  |  stfd f1, 8(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  checktab CARG3[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  bne ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |   lwz TAB:TMP2, TAB:CARG1->metatable[m
[31m-  |  lfd f0, CFUNC:RB->upvalue[0][m
[31m-  |   cmplwi TAB:TMP2, 0[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |   bne ->fff_fallback[m
[31m-#else[m
[31m-  |  lfd f0, CFUNC:RB->upvalue[0][m
[31m-  |  la RA, -8(BASE)[m
[31m-#endif[m
[31m-  |   stw TISNIL, 8(BASE)[m
[31m-  |  li RD, (3+1)*8[m
[31m-  |  stfd f0, 0(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc ipairs_aux[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz TAB:CARG1, 4(BASE)[m
[31m-  |   lwz CARG4, 8(BASE)[m
[31m-  |.if DUALNUM[m
[31m-  |    lwz TMP2, 12(BASE)[m
[31m-  |.else[m
[31m-  |    lfd FARG2, 8(BASE)[m
[31m-  |.endif[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checktab CARG3[m
[31m-  |  checknum cr1, CARG4[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |.if DUALNUM[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  bne cr1, ->fff_fallback[m
[31m-  |.else[m
[31m-  |    lus TMP0, 0x3ff0[m
[31m-  |    stw ZERO, TMPD_LO[m
[31m-  |  bne ->fff_fallback[m
[31m-  |    stw TMP0, TMPD_HI[m
[31m-  |  bge cr1, ->fff_fallback[m
[31m-  |    lfd FARG1, TMPD[m
[31m-  |  toint TMP2, FARG2, f0[m
[31m-  |.endif[m
[31m-  |   lwz TMP0, TAB:CARG1->asize[m
[31m-  |   lwz TMP1, TAB:CARG1->array[m
[31m-  |.if not DUALNUM[m
[31m-  |  fadd FARG2, FARG2, FARG1[m
[31m-  |.endif[m
[31m-  |  addi TMP2, TMP2, 1[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  cmplw TMP0, TMP2[m
[31m-  |.if DUALNUM[m
[31m-  |  stw TISNUM, 0(RA)[m
[31m-  |   slwi TMP3, TMP2, 3[m
[31m-  |  stw TMP2, 4(RA)[m
[31m-  |.else[m
[31m-  |   slwi TMP3, TMP2, 3[m
[31m-  |  stfd FARG2, 0(RA)[m
[31m-  |.endif[m
[31m-  |  ble >2				// Not in array part?[m
[31m-  |  lwzx TMP2, TMP1, TMP3[m
[31m-  |  lfdx f0, TMP1, TMP3[m
[31m-  |1:[m
[31m-  |  checknil TMP2[m
[31m-  |   li RD, (0+1)*8[m
[31m-  |  beq ->fff_res			// End of iteration, return 0 results.[m
[31m-  |   li RD, (2+1)*8[m
[31m-  |  stfd f0, 8(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  lwz TMP0, TAB:CARG1->hmask[m
[31m-  |  cmplwi TMP0, 0[m
[31m-  |   li RD, (0+1)*8[m
[31m-  |  beq ->fff_res[m
[31m-  |   mr CARG2, TMP2[m
[31m-  |  bl extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // Returns cTValue * or NULL.[m
[31m-  |  cmplwi CRET1, 0[m
[31m-  |   li RD, (0+1)*8[m
[31m-  |  beq ->fff_res[m
[31m-  |  lwz TMP2, 0(CRET1)[m
[31m-  |  lfd f0, 0(CRET1)[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  checktab CARG3[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  bne ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |   lwz TAB:TMP2, TAB:CARG1->metatable[m
[31m-  |  lfd f0, CFUNC:RB->upvalue[0][m
[31m-  |   cmplwi TAB:TMP2, 0[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |   bne ->fff_fallback[m
[31m-#else[m
[31m-  |  lfd f0, CFUNC:RB->upvalue[0][m
[31m-  |  la RA, -8(BASE)[m
[31m-#endif[m
[31m-  |.if DUALNUM[m
[31m-  |  stw TISNUM, 8(BASE)[m
[31m-  |.else[m
[31m-  |  stw ZERO, 8(BASE)[m
[31m-  |.endif[m
[31m-  |   stw ZERO, 12(BASE)[m
[31m-  |  li RD, (3+1)*8[m
[31m-  |  stfd f0, 0(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc pcall[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |   mr TMP2, BASE[m
[31m-  |   la BASE, 8(BASE)[m
[31m-  |  // Remember active hook before pcall.[m
[31m-  |  rlwinm TMP3, TMP3, 32-HOOK_ACTIVE_SHIFT, 31, 31[m
[31m-  |   subi NARGS8:RC, NARGS8:RC, 8[m
[31m-  |  addi PC, TMP3, 8+FRAME_PCALL[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc xpcall[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG4, 8(BASE)[m
[31m-  |    lfd FARG2, 8(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  lbz TMP1, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |   mr TMP2, BASE[m
[31m-  |  checkfunc CARG4; bne ->fff_fallback  // Traceback must be a function.[m
[31m-  |   la BASE, 16(BASE)[m
[31m-  |  // Remember active hook before pcall.[m
[31m-  |  rlwinm TMP1, TMP1, 32-HOOK_ACTIVE_SHIFT, 31, 31[m
[31m-  |    stfd FARG2, 0(TMP2)		// Swap function and traceback.[m
[31m-  |  subi NARGS8:RC, NARGS8:RC, 16[m
[31m-  |    stfd FARG1, 8(TMP2)[m
[31m-  |  addi PC, TMP1, 16+FRAME_PCALL[m
[31m-  |  b ->vm_call_dispatch[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  cmpwi CARG3, LJ_TTHREAD; bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  lwz L:CARG1, CFUNC:RB->upvalue[0].gcr[m
[31m-  |.endif[m
[31m-  |  lbz TMP0, L:CARG1->status[m
[31m-  |   lp TMP1, L:CARG1->cframe[m
[31m-  |    lp CARG2, L:CARG1->top[m
[31m-  |  cmplwi cr0, TMP0, LUA_YIELD[m
[31m-  |    lp TMP2, L:CARG1->base[m
[31m-  |   cmplwi cr1, TMP1, 0[m
[31m-  |   lwz TMP0, L:CARG1->maxstack[m
[31m-  |    cmplw cr7, CARG2, TMP2[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  crorc 4*cr6+lt, 4*cr0+gt, 4*cr1+eq		// st>LUA_YIELD || cframe!=0[m
[31m-  |   add TMP2, CARG2, NARGS8:RC[m
[31m-  |  crandc 4*cr6+gt, 4*cr7+eq, 4*cr0+eq	// base==top && st!=LUA_YIELD[m
[31m-  |   cmplw cr1, TMP2, TMP0[m
[31m-  |  cror 4*cr6+lt, 4*cr6+lt, 4*cr6+gt[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  cror 4*cr6+lt, 4*cr6+lt, 4*cr1+gt		// cond1 || cond2 || stackov[m
[31m-  |   stp BASE, L->base[m
[31m-  |  blt cr6, ->fff_fallback[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  addi BASE, BASE, 8			// Keep resumed thread in stack for GC.[m
[31m-  |  subi NARGS8:RC, NARGS8:RC, 8[m
[31m-  |  subi TMP2, TMP2, 8[m
[31m-  |.endif[m
[31m-  |  stp TMP2, L:CARG1->top[m
[31m-  |  li TMP1, 0[m
[31m-  |  stp BASE, L->top[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |  cmpw TMP1, NARGS8:RC[m
[31m-  |   lfdx f0, BASE, TMP1[m
[31m-  |  beq >3[m
[31m-  |   stfdx f0, CARG2, TMP1[m
[31m-  |  addi TMP1, TMP1, 8[m
[31m-  |  b <2[m
[31m-  |3:[m
[31m-  |  li CARG3, 0[m
[31m-  |   mr L:SAVE0, L:CARG1[m
[31m-  |  li CARG4, 0[m
[31m-  |  bl ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |  // Returns thread status.[m
[31m-  |4:[m
[31m-  |  lp TMP2, L:SAVE0->base[m
[31m-  |   cmplwi CRET1, LUA_YIELD[m
[31m-  |  lp TMP3, L:SAVE0->top[m
[31m-  |    li_vmstate INTERP[m
[31m-  |  lp BASE, L->base[m
[31m-  |    stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |    st_vmstate[m
[31m-  |   bgt >8[m
[31m-  |  sub RD, TMP3, TMP2[m
[31m-  |   lwz TMP0, L->maxstack[m
[31m-  |  cmplwi RD, 0[m
[31m-  |   add TMP1, BASE, RD[m
[31m-  |  beq >6				// No results?[m
[31m-  |  cmplw TMP1, TMP0[m
[31m-  |   li TMP1, 0[m
[31m-  |  bgt >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  subi TMP3, RD, 8[m
[31m-  |   stp TMP2, L:SAVE0->top		// Clear coroutine stack.[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |  cmplw TMP1, TMP3[m
[31m-  |   lfdx f0, TMP2, TMP1[m
[31m-  |   stfdx f0, BASE, TMP1[m
[31m-  |    addi TMP1, TMP1, 8[m
[31m-  |  bne <5[m
[31m-  |6:[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |.if resume[m
[31m-  |  li TMP1, LJ_TTRUE[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  stw TMP1, -8(BASE)			// Prepend true to results.[m
[31m-  |  addi RD, RD, 16[m
[31m-  |.else[m
[31m-  |  mr RA, BASE[m
[31m-  |  addi RD, RD, 8[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |    stw PC, SAVE_PC[m
[31m-  |   mr MULTRES, RD[m
[31m-  |  beq ->BC_RET_Z[m
[31m-  |  b ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |  la TMP3, -8(TMP3)[m
[31m-  |   li TMP1, LJ_TFALSE[m
[31m-  |  lfd f0, 0(TMP3)[m
[31m-  |   stp TMP3, L:SAVE0->top		// Remove error from coroutine stack.[m
[31m-  |    li RD, (2+1)*8[m
[31m-  |   stw TMP1, -8(BASE)		// Prepend false to results.[m
[31m-  |    la RA, -8(BASE)[m
[31m-  |  stfd f0, 0(BASE)			// Copy error message.[m
[31m-  |  b <7[m
[31m-  |.else[m
[31m-  |  mr CARG1, L[m
[31m-  |  mr CARG2, L:SAVE0[m
[31m-  |  bl extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  mr CARG1, L[m
[31m-  |  srwi CARG2, RD, 3[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  li CRET1, 0[m
[31m-  |  b <4[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  lp TMP0, L->cframe[m
[31m-  |   add TMP1, BASE, NARGS8:RC[m
[31m-  |   stp BASE, L->base[m
[31m-  |  andix. TMP0, TMP0, CFRAME_RESUME[m
[31m-  |   stp TMP1, L->top[m
[31m-  |    li CRET1, LUA_YIELD[m
[31m-  |  beq ->fff_fallback[m
[31m-  |   stp ZERO, L->cframe[m
[31m-  |    stb CRET1, L->status[m
[31m-  |  b ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 math_abs[m
[31m-  |  checknum CARG3[m
[31m-  |.if DUALNUM[m
[31m-  |  bne >2[m
[31m-  |  srawi TMP1, CARG1, 31[m
[31m-  |  xor TMP2, TMP1, CARG1[m
[31m-  |.if GPR64[m
[31m-  |  lus TMP0, 0x8000[m
[31m-  |  sub CARG1, TMP2, TMP1[m
[31m-  |  cmplw CARG1, TMP0[m
[31m-  |  beq >1[m
[31m-  |.else[m
[31m-  |  sub. CARG1, TMP2, TMP1[m
[31m-  |  blt >1[m
[31m-  |.endif[m
[31m-  |->fff_resi:[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |  stw TISNUM, -8(BASE)[m
[31m-  |  stw CRET1, -4(BASE)[m
[31m-  |  b ->fff_res1[m
[31m-  |1:[m
[31m-  |  lus CARG3, 0x41e0	// 2^31.[m
[31m-  |  li CARG1, 0[m
[31m-  |  b ->fff_restv[m
[31m-  |2:[m
[31m-  |.endif[m
[31m-  |  bge ->fff_fallback[m
[31m-  |  rlwinm CARG3, CARG3, 0, 1, 31[m
[31m-  |  // Fallthrough.[m
[31m-  |[m
[31m-  |->fff_restv:[m
[31m-  |  // CARG3/CARG1 = TValue result.[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |   stw CARG3, -8(BASE)[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |   stw CARG1, -4(BASE)[m
[31m-  |->fff_res1:[m
[31m-  |  // RA = results, PC = return.[m
[31m-  |  li RD, (1+1)*8[m
[31m-  |->fff_res:[m
[31m-  |  // RA = results, RD = (nresults+1)*8, PC = return.[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |   mr MULTRES, RD[m
[31m-  |  bney ->vm_return[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |  decode_RB8 RB, INS[m
[31m-  |5:[m
[31m-  |  cmplw RB, RD			// More results expected?[m
[31m-  |   decode_RA8 TMP0, INS[m
[31m-  |  bgt >6[m
[31m-  |  ins_next1[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |   sub BASE, RA, TMP0[m
[31m-  |  ins_next2[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  subi TMP1, RD, 8[m
[31m-  |   addi RD, RD, 8[m
[31m-  |  stwx TISNIL, RA, TMP1[m
[31m-  |  b <5[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc_n math_ .. func[m
[31m-  |  blex func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |  blex func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_round, func[m
[31m-  |  .ffunc_1 math_ .. func[m
[31m-  |   checknum CARG3; beqy ->fff_restv[m
[31m-  |  rlwinm TMP2, CARG3, 12, 21, 31[m
[31m-  |   bge ->fff_fallback[m
[31m-  |  addic. TMP2, TMP2, -1023		// exp = exponent(x) - 1023[m
[31m-  |  cmplwi cr1, TMP2, 31		// 0 <= exp < 31?[m
[31m-  |   subfic TMP0, TMP2, 31[m
[31m-  |  blt >3[m
[31m-  |  slwi TMP1, CARG3, 11[m
[31m-  |   srwi TMP3, CARG1, 21[m
[31m-  |  oris TMP1, TMP1, 0x8000[m
[31m-  |   addi TMP2, TMP2, 1[m
[31m-  |  or TMP1, TMP1, TMP3[m
[31m-  |   slwi CARG2, CARG1, 11[m
[31m-  |  bge cr1, >4[m
[31m-  |   slw TMP3, TMP1, TMP2[m
[31m-  |  srw RD, TMP1, TMP0[m
[31m-  |   or TMP3, TMP3, CARG2[m
[31m-  |  srawi TMP2, CARG3, 31[m
[31m-  |.if "func" == "floor"[m
[31m-  |  and TMP1, TMP3, TMP2[m
[31m-  |  addic TMP0, TMP1, -1[m
[31m-  |  subfe TMP1, TMP0, TMP1[m
[31m-  |  add CARG1, RD, TMP1[m
[31m-  |  xor CARG1, CARG1, TMP2[m
[31m-  |  sub CARG1, CARG1, TMP2[m
[31m-  |  b ->fff_resi[m
[31m-  |.else[m
[31m-  |  andc TMP1, TMP3, TMP2[m
[31m-  |  addic TMP0, TMP1, -1[m
[31m-  |  subfe TMP1, TMP0, TMP1[m
[31m-  |  add CARG1, RD, TMP1[m
[31m-  |  cmpw CARG1, RD[m
[31m-  |  xor CARG1, CARG1, TMP2[m
[31m-  |  sub CARG1, CARG1, TMP2[m
[31m-  |  bge ->fff_resi[m
[31m-  |  // Overflow to 2^31.[m
[31m-  |  lus CARG3, 0x41e0			// 2^31.[m
[31m-  |  li CARG1, 0[m
[31m-  |  b ->fff_restv[m
[31m-  |.endif[m
[31m-  |3:  // |x| < 1[m
[31m-  |  slwi TMP2, CARG3, 1[m
[31m-  |   srawi TMP1, CARG3, 31[m
[31m-  |  or TMP2, CARG1, TMP2		// ztest = (hi+hi) | lo[m
[31m-  |.if "func" == "floor"[m
[31m-  |  and TMP1, TMP2, TMP1		// (ztest & sign) == 0 ? 0 : -1[m
[31m-  |  subfic TMP2, TMP1, 0[m
[31m-  |  subfe CARG1, CARG1, CARG1[m
[31m-  |.else[m
[31m-  |  andc TMP1, TMP2, TMP1		// (ztest & ~sign) == 0 ? 0 : 1[m
[31m-  |  addic TMP2, TMP1, -1[m
[31m-  |  subfe CARG1, TMP2, TMP1[m
[31m-  |.endif[m
[31m-  |  b ->fff_resi[m
[31m-  |4:  // exp >= 31. Check for -(2^31).[m
[31m-  |  xoris TMP1, TMP1, 0x8000[m
[31m-  |  srawi TMP2, CARG3, 31[m
[31m-  |.if "func" == "floor"[m
[31m-  |  or TMP1, TMP1, CARG2[m
[31m-  |.endif[m
[31m-  |.if PPE[m
[31m-  |  orc TMP1, TMP1, TMP2[m
[31m-  |  cmpwi TMP1, 0[m
[31m-  |.else[m
[31m-  |  orc. TMP1, TMP1, TMP2[m
[31m-  |.endif[m
[31m-  |  crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq[m
[31m-  |  lus CARG1, 0x8000			// -(2^31).[m
[31m-  |  beqy ->fff_resi[m
[31m-  |5:[m
[31m-  |  lfd FARG1, 0(BASE)[m
[31m-  |  blex func[m
[31m-  |  b ->fff_resn[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.if DUALNUM[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |.else[m
[31m-  |  // NYI: use internal implementation.[m
[31m-  |  math_extern floor[m
[31m-  |  math_extern ceil[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.if SQRT[m
[31m-  |.ffunc_n math_sqrt[m
[31m-  |  fsqrt FARG1, FARG1[m
[31m-  |  b ->fff_resn[m
[31m-  |.else[m
[31m-  |  math_extern sqrt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  bne ->fff_fallback			// Need exactly 1 argument.[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  blex log[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.if DUALNUM[m
[31m-  |.ffunc math_ldexp[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |   lwz CARG4, 8(BASE)[m
[31m-  |.if GPR64[m
[31m-  |    lwz CARG2, 12(BASE)[m
[31m-  |.else[m
[31m-  |    lwz CARG1, 12(BASE)[m
[31m-  |.endif[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  checknum CARG4; bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |.ffunc_nn math_ldexp[m
[31m-  |.if GPR64[m
[31m-  |  toint CARG2, FARG2[m
[31m-  |.else[m
[31m-  |  toint CARG1, FARG2[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |  blex ldexp[m
[31m-  |  b ->fff_resn[m
[31m-  |[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |.if GPR64[m
[31m-  |  la CARG2, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |.else[m
[31m-  |  la CARG1, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |.endif[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  blex frexp[m
[31m-  |   lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |.if not DUALNUM[m
[31m-  |   tonum_i FARG2, TMP1[m
[31m-  |.endif[m
[31m-  |  stfd FARG1, 0(RA)[m
[31m-  |  li RD, (2+1)*8[m
[31m-  |.if DUALNUM[m
[31m-  |   stw TISNUM, 8(RA)[m
[31m-  |   stw TMP1, 12(RA)[m
[31m-  |.else[m
[31m-  |   stfd FARG2, 8(RA)[m
[31m-  |.endif[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_n math_modf[m
[31m-  |.if GPR64[m
[31m-  |  la CARG2, -8(BASE)[m
[31m-  |.else[m
[31m-  |  la CARG1, -8(BASE)[m
[31m-  |.endif[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  blex modf[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  stfd FARG1, 0(BASE)[m
[31m-  |  li RD, (2+1)*8[m
[31m-  |  b ->fff_res[m
[31m-  |[m
[31m-  |.macro math_minmax, name, ismax[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_1 name[m
[31m-  |  checknum CARG3[m
[31m-  |   addi TMP1, BASE, 8[m
[31m-  |   add TMP2, BASE, NARGS8:RC[m
[31m-  |  bne >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  lwz CARG4, 0(TMP1)[m
[31m-  |   cmplw cr1, TMP1, TMP2[m
[31m-  |  lwz CARG2, 4(TMP1)[m
[31m-  |   bge cr1, ->fff_resi[m
[31m-  |  checknum CARG4[m
[31m-  |   xoris TMP0, CARG1, 0x8000[m
[31m-  |   xoris TMP3, CARG2, 0x8000[m
[31m-  |  bne >3[m
[31m-  |  subfc TMP3, TMP3, TMP0[m
[31m-  |  subfe TMP0, TMP0, TMP0[m
[31m-  |.if ismax[m
[31m-  |  andc TMP3, TMP3, TMP0[m
[31m-  |.else[m
[31m-  |  and TMP3, TMP3, TMP0[m
[31m-  |.endif[m
[31m-  |  add CARG1, TMP3, CARG2[m
[31m-  |.if GPR64[m
[31m-  |  rldicl CARG1, CARG1, 0, 32[m
[31m-  |.endif[m
[31m-  |   addi TMP1, TMP1, 8[m
[31m-  |  b <1[m
[31m-  |3:[m
[31m-  |  bge ->fff_fallback[m
[31m-  |  // Convert intermediate result to number and continue below.[m
[31m-  |  tonum_i FARG1, CARG1[m
[31m-  |  lfd FARG2, 0(TMP1)[m
[31m-  |  b >6[m
[31m-  |4:[m
[31m-  |   lfd FARG1, 0(BASE)[m
[31m-  |  bge ->fff_fallback[m
[31m-  |5:  // Handle numbers.[m
[31m-  |  lwz CARG4, 0(TMP1)[m
[31m-  |   cmplw cr1, TMP1, TMP2[m
[31m-  |  lfd FARG2, 0(TMP1)[m
[31m-  |   bge cr1, ->fff_resn[m
[31m-  |  checknum CARG4; bge >7[m
[31m-  |6:[m
[31m-  |  fsub f0, FARG1, FARG2[m
[31m-  |   addi TMP1, TMP1, 8[m
[31m-  |.if ismax[m
[31m-  |  fsel FARG1, f0, FARG1, FARG2[m
[31m-  |.else[m
[31m-  |  fsel FARG1, f0, FARG2, FARG1[m
[31m-  |.endif[m
[31m-  |  b <5[m
[31m-  |7:  // Convert integer to number and continue above.[m
[31m-  |   lwz CARG2, 4(TMP1)[m
[31m-  |  bne ->fff_fallback[m
[31m-  |  tonum_i FARG2, CARG2[m
[31m-  |  b <6[m
[31m-  |.else[m
[31m-  |  .ffunc_n name[m
[31m-  |  li TMP1, 8[m
[31m-  |1:[m
[31m-  |   lwzx CARG2, BASE, TMP1[m
[31m-  |   lfdx FARG2, BASE, TMP1[m
[31m-  |  cmplw cr1, TMP1, NARGS8:RC[m
[31m-  |   checknum CARG2[m
[31m-  |  bge cr1, ->fff_resn[m
[31m-  |   bge ->fff_fallback[m
[31m-  |  fsub f0, FARG1, FARG2[m
[31m-  |   addi TMP1, TMP1, 8[m
[31m-  |.if ismax[m
[31m-  |  fsel FARG1, f0, FARG1, FARG2[m
[31m-  |.else[m
[31m-  |  fsel FARG1, f0, FARG2, FARG1[m
[31m-  |.endif[m
[31m-  |  b <1[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, 0[m
[31m-  |  math_minmax math_max, 1[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz STR:CARG1, 4(BASE)[m
[31m-  |  bne ->fff_fallback			// Need exactly 1 argument.[m
[31m-  |   checkstr CARG3[m
[31m-  |   bne ->fff_fallback[m
[31m-  |  lwz TMP0, STR:CARG1->len[m
[31m-  |.if DUALNUM[m
[31m-  |   lbz CARG1, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |   li RD, (0+1)*8[m
[31m-  |   lwz PC, FRAME_PC(BASE)[m
[31m-  |  cmplwi TMP0, 0[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  beqy ->fff_res[m
[31m-  |  b ->fff_resi[m
[31m-  |.else[m
[31m-  |   lbz TMP1, STR:CARG1[1]		// Access is always ok (NUL at end).[m
[31m-  |  addic TMP3, TMP0, -1		// RD = ((str->len != 0)+1)*8[m
[31m-  |  subfe RD, TMP3, TMP0[m
[31m-  |   stw TMP1, TONUM_LO		// Inlined tonum_u f0, TMP1.[m
[31m-  |  addi RD, RD, 1[m
[31m-  |   lfd f0, TONUM_D[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |   fsub f0, f0, TOBIT[m
[31m-  |  slwi RD, RD, 3[m
[31m-  |   stfd f0, 0(RA)[m
[31m-  |  b ->fff_res[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |.if DUALNUM[m
[31m-  |    lwz TMP0, 4(BASE)[m
[31m-  |  bne ->fff_fallback			// Exactly 1 argument.[m
[31m-  |  checknum CARG3; bne ->fff_fallback[m
[31m-  |   la CARG2, 7(BASE)[m
[31m-  |.else[m
[31m-  |    lfd FARG1, 0(BASE)[m
[31m-  |  bne ->fff_fallback			// Exactly 1 argument.[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  toint TMP0, FARG1[m
[31m-  |   la CARG2, TMPD_BLO[m
[31m-  |.endif[m
[31m-  |   li CARG3, 1[m
[31m-  |  cmplwi TMP0, 255; bgt ->fff_fallback[m
[31m-  |->fff_newstr:[m
[31m-  |  mr CARG1, L[m
[31m-  |  stp BASE, L->base[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |  bl extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // Returns GCstr *.[m
[31m-  |  lp BASE, L->base[m
[31m-  |  li CARG3, LJ_TSTR[m
[31m-  |  b ->fff_restv[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  cmplwi NARGS8:RC, 16[m
[31m-  |   lwz CARG3, 16(BASE)[m
[31m-  |.if not DUALNUM[m
[31m-  |    lfd f0, 16(BASE)[m
[31m-  |.endif[m
[31m-  |   lwz TMP0, 0(BASE)[m
[31m-  |    lwz STR:CARG1, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |   lwz CARG2, 8(BASE)[m
[31m-  |.if DUALNUM[m
[31m-  |    lwz TMP1, 12(BASE)[m
[31m-  |.else[m
[31m-  |    lfd f1, 8(BASE)[m
[31m-  |.endif[m
[31m-  |   li TMP2, -1[m
[31m-  |  beq >1[m
[31m-  |.if DUALNUM[m
[31m-  |  checknum CARG3[m
[31m-  |   lwz TMP2, 20(BASE)[m
[31m-  |  bne ->fff_fallback[m
[31m-  |1:[m
[31m-  |  checknum CARG2; bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknum CARG3; bge ->fff_fallback[m
[31m-  |  toint TMP2, f0[m
[31m-  |1:[m
[31m-  |  checknum CARG2; bge ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  checkstr TMP0; bne ->fff_fallback[m
[31m-  |.if not DUALNUM[m
[31m-  |   toint TMP1, f1[m
[31m-  |.endif[m
[31m-  |   lwz TMP0, STR:CARG1->len[m
[31m-  |  cmplw TMP0, TMP2			// len < end? (unsigned compare)[m
[31m-  |   addi TMP3, TMP2, 1[m
[31m-  |  blt >5[m
[31m-  |2:[m
[31m-  |  cmpwi TMP1, 0			// start <= 0?[m
[31m-  |   add TMP3, TMP1, TMP0[m
[31m-  |  ble >7[m
[31m-  |3:[m
[31m-  |  sub CARG3, TMP2, TMP1[m
[31m-  |    addi CARG2, STR:CARG1, #STR-1[m
[31m-  |  srawi TMP0, CARG3, 31[m
[31m-  |   addi CARG3, CARG3, 1[m
[31m-  |    add CARG2, CARG2, TMP1[m
[31m-  |  andc CARG3, CARG3, TMP0[m
[31m-  |.if GPR64[m
[31m-  |  rldicl CARG2, CARG2, 0, 32[m
[31m-  |  rldicl CARG3, CARG3, 0, 32[m
[31m-  |.endif[m
[31m-  |  b ->fff_newstr[m
[31m-  |[m
[31m-  |5:  // Negative end or overflow.[m
[31m-  |  cmpw TMP0, TMP2			// len >= end? (signed compare)[m
[31m-  |   add TMP2, TMP0, TMP3		// Negative end: end = end+len+1.[m
[31m-  |  bge <2[m
[31m-  |   mr TMP2, TMP0			// Overflow: end = len.[m
[31m-  |  b <2[m
[31m-  |[m
[31m-  |7:  // Negative start or underflow.[m
[31m-  |  .gpr64 extsw TMP1, TMP1[m
[31m-  |  addic CARG3, TMP1, -1[m
[31m-  |  subfe CARG3, CARG3, CARG3[m
[31m-  |   srawi CARG2, TMP3, 31		// Note: modifies carry.[m
[31m-  |  andc TMP3, TMP3, CARG3[m
[31m-  |   andc TMP1, TMP3, CARG2[m
[31m-  |  addi TMP1, TMP1, 1			// start = 1 + (start ? start+len : 0)[m
[31m-  |  b <3[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |  cmplwi NARGS8:RC, 8[m
[31m-  |   lwz CARG3, 0(BASE)[m
[31m-  |    lwz STR:CARG2, 4(BASE)[m
[31m-  |  blt ->fff_fallback[m
[31m-  |  checkstr CARG3[m
[31m-  |   la SBUF:CARG1, DISPATCH_GL(tmpbuf)(DISPATCH)[m
[31m-  |  bne ->fff_fallback[m
[31m-  |   lwz TMP0, SBUF:CARG1->b[m
[31m-  |  stw L, SBUF:CARG1->L[m
[31m-  |  stp BASE, L->base[m
[31m-  |  stw PC, SAVE_PC[m
[31m-  |   stw TMP0, SBUF:CARG1->p[m
[31m-  |  bl extern lj_buf_putstr_ .. name[m
[31m-  |  bl extern lj_buf_tostr[m
[31m-  |  b ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_1 bit_..name[m
[31m-  |  checknum CARG3; bnel ->fff_tobit_fb[m
[31m-  |.else[m
[31m-  |  .ffunc_n bit_..name[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG1, TMPD_LO[m
[31m-  |.endif[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name[m
[31m-  |  addi TMP1, BASE, 8[m
[31m-  |  add TMP2, BASE, NARGS8:RC[m
[31m-  |1:[m
[31m-  |  lwz CARG4, 0(TMP1)[m
[31m-  |   cmplw cr1, TMP1, TMP2[m
[31m-  |.if DUALNUM[m
[31m-  |  lwz CARG2, 4(TMP1)[m
[31m-  |.else[m
[31m-  |  lfd FARG1, 0(TMP1)[m
[31m-  |.endif[m
[31m-  |   bgey cr1, ->fff_resi[m
[31m-  |  checknum CARG4[m
[31m-  |.if DUALNUM[m
[31m-  |  bnel ->fff_bitop_fb[m
[31m-  |.else[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  bge ->fff_fallback[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG2, TMPD_LO[m
[31m-  |.endif[m
[31m-  |  ins CARG1, CARG1, CARG2[m
[31m-  |   addi TMP1, TMP1, 8[m
[31m-  |  b <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op band, and[m
[31m-  |.ffunc_bit_op bor, or[m
[31m-  |.ffunc_bit_op bxor, xor[m
[31m-  |[m
[31m-  |.ffunc_bit bswap[m
[31m-  |  rotlwi TMP0, CARG1, 8[m
[31m-  |  rlwimi TMP0, CARG1, 24, 0, 7[m
[31m-  |  rlwimi TMP0, CARG1, 24, 16, 23[m
[31m-  |  mr CRET1, TMP0[m
[31m-  |  b ->fff_resi[m
[31m-  |[m
[31m-  |.ffunc_bit bnot[m
[31m-  |  not CRET1, CARG1[m
[31m-  |  b ->fff_resi[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins, shmod[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_2 bit_..name[m
[31m-  |  checknum CARG3; bnel ->fff_tobit_fb[m
[31m-  |  // Note: no inline conversion from number for 2nd argument![m
[31m-  |  checknum CARG4; bne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  .ffunc_nn bit_..name[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  fadd FARG2, FARG2, TOBIT[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG1, TMPD_LO[m
[31m-  |  stfd FARG2, TMPD[m
[31m-  |  lwz CARG2, TMPD_LO[m
[31m-  |.endif[m
[31m-  |.if shmod == 1[m
[31m-  |  rlwinm CARG2, CARG2, 0, 27, 31[m
[31m-  |.elif shmod == 2[m
[31m-  |  neg CARG2, CARG2[m
[31m-  |.endif[m
[31m-  |  ins CRET1, CARG1, CARG2[m
[31m-  |  b ->fff_resi[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh lshift, slw, 1[m
[31m-  |.ffunc_bit_sh rshift, srw, 1[m
[31m-  |.ffunc_bit_sh arshift, sraw, 1[m
[31m-  |.ffunc_bit_sh rol, rotlw, 0[m
[31m-  |.ffunc_bit_sh ror, rotlw, 2[m
[31m-  |[m
[31m-  |.ffunc_bit tobit[m
[31m-  |.if DUALNUM[m
[31m-  |  b ->fff_resi[m
[31m-  |.else[m
[31m-  |->fff_resi:[m
[31m-  |  tonum_i FARG1, CRET1[m
[31m-  |.endif[m
[31m-  |->fff_resn:[m
[31m-  |  lwz PC, FRAME_PC(BASE)[m
[31m-  |  la RA, -8(BASE)[m
[31m-  |  stfd FARG1, -8(BASE)[m
[31m-  |  b ->fff_res1[m
[31m-  |[m
[31m-  |// Fallback FP number to bit conversion.[m
[31m-  |->fff_tobit_fb:[m
[31m-  |.if DUALNUM[m
[31m-  |  lfd FARG1, 0(BASE)[m
[31m-  |  bgt ->fff_fallback[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG1, TMPD_LO[m
[31m-  |  blr[m
[31m-  |.endif[m
[31m-  |->fff_bitop_fb:[m
[31m-  |.if DUALNUM[m
[31m-  |  lfd FARG1, 0(TMP1)[m
[31m-  |  bgt ->fff_fallback[m
[31m-  |  fadd FARG1, FARG1, TOBIT[m
[31m-  |  stfd FARG1, TMPD[m
[31m-  |  lwz CARG2, TMPD_LO[m
[31m-  |  blr[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RB = CFUNC, RC = nargs*8[m
[31m-  |  lp TMP3, CFUNC:RB->f[m
[31m-  |    add TMP1, BASE, NARGS8:RC[m
[31m-  |   lwz PC, FRAME_PC(BASE)		// Fallback may overwrite PC.[m
[31m-  |    addi TMP0, TMP1, 8*LUA_MINSTACK[m
[31m-  |     lwz TMP2, L->maxstack[m
[31m-  |   stw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  .toc lp TMP3, 0(TMP3)[m
[31m-  |  cmplw TMP0, TMP2[m
[31m-  |     stp BASE, L->base[m
[31m-  |    stp TMP1, L->top[m
[31m-  |   mr CARG1, L[m
[31m-  |  bgt >5				// Need to grow stack.[m
[31m-  |  mtctr TMP3[m
[31m-  |  bctrl				// (lua_State *L)[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |  lp BASE, L->base[m
[31m-  |  cmpwi CRET1, 0[m
[31m-  |   slwi RD, CRET1, 3[m
[31m-  |   la RA, -8(BASE)[m
[31m-  |  bgt ->fff_res			// Returned nresults+1?[m
[31m-  |1:  // Returned 0 or -1: retry fast path.[m
[31m-  |  lp TMP0, L->top[m
[31m-  |   lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  sub NARGS8:RC, TMP0, BASE[m
[31m-  |  bne ->vm_call_tail			// Returned -1?[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  andix. TMP0, PC, FRAME_TYPE[m
[31m-  |   rlwinm TMP1, PC, 0, 0, 28[m
[31m-  |  bne >3[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |  decode_RA8 TMP1, INS[m
[31m-  |  addi TMP1, TMP1, 8[m
[31m-  |3:[m
[31m-  |  sub TMP2, BASE, TMP1[m
[31m-  |  b ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  li CARG2, LUA_MINSTACK[m
[31m-  |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  lp BASE, L->base[m
[31m-  |  cmpw TMP0, TMP0			// Set 4*cr0+eq to force retry.[m
[31m-  |  b <1[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RC = nargs*8[m
[31m-  |  mflr SAVE0[m
[31m-  |   stp BASE, L->base[m
[31m-  |  add TMP0, BASE, NARGS8:RC[m
[31m-  |   stw PC, SAVE_PC			// Redundant (but a defined value).[m
[31m-  |  stp TMP0, L->top[m
[31m-  |  mr CARG1, L[m
[31m-  |  bl extern lj_gc_step		// (lua_State *L)[m
[31m-  |   lp BASE, L->base[m
[31m-  |  mtlr SAVE0[m
[31m-  |    lp TMP0, L->top[m
[31m-  |   sub NARGS8:RC, TMP0, BASE[m
[31m-  |   lwz CFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  blr[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  andix. TMP0, TMP3, HOOK_VMEVENT	// No recording while in vmevent.[m
[31m-  |  bne >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |   lwz TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andix. TMP0, TMP3, HOOK_ACTIVE[m
[31m-  |  bne >1[m
[31m-  |   subi TMP2, TMP2, 1[m
[31m-  |  andi. TMP0, TMP3, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  beqy >1[m
[31m-  |   stw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  andix. TMP0, TMP3, HOOK_ACTIVE	// Hook already active?[m
[31m-  |  beq >1[m
[31m-  |5:  // Re-dispatch to static ins.[m
[31m-  |  addi TMP1, TMP1, GG_DISP2STATIC	// Assumes decode_OPP TMP1, INS.[m
[31m-  |  lpx TMP0, DISPATCH, TMP1[m
[31m-  |  mtctr TMP0[m
[31m-  |  bctr[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)[m
[31m-  |  lwz TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  andix. TMP0, TMP3, HOOK_ACTIVE	// Hook already active?[m
[31m-  |   rlwinm TMP0, TMP3, 31-LUA_HOOKLINE, 31, 0[m
[31m-  |  bne <5[m
[31m-  |[m
[31m-  |   cmpwi cr1, TMP0, 0[m
[31m-  |  addic. TMP2, TMP2, -1[m
[31m-  |   beq cr1, <5[m
[31m-  |  stw TMP2, DISPATCH_GL(hookcount)(DISPATCH)[m
[31m-  |  beq >1[m
[31m-  |   bge cr1, <5[m
[31m-  |1:[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw MULTRES, SAVE_MULTRES[m
[31m-  |  mr CARG2, PC[m
[31m-  |   stp BASE, L->base[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  bl extern lj_dispatch_ins		// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  lp BASE, L->base[m
[31m-  |4:  // Re-dispatch to static ins.[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |  decode_OPP TMP1, INS[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |  addi TMP1, TMP1, GG_DISP2STATIC[m
[31m-  |   decode_RD8 RD, INS[m
[31m-  |  lpx TMP0, DISPATCH, TMP1[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  mtctr TMP0[m
[31m-  |  bctr[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  addi PC, PC, 4[m
[31m-  |  lwz MULTRES, -20(RB)		// Restore MULTRES for *M ins.[m
[31m-  |  b <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  lwz LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-  |   addi CARG1, DISPATCH, GG_DISP2J[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  lwz TMP1, LFUNC:TMP1->pc[m
[31m-  |   mr CARG2, PC[m
[31m-  |   stw L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  lbz TMP1, PC2PROTO(framesize)(TMP1)[m
[31m-  |   stp BASE, L->base[m
[31m-  |  slwi TMP1, TMP1, 3[m
[31m-  |  add TMP1, BASE, TMP1[m
[31m-  |  stp TMP1, L->top[m
[31m-  |  bl extern lj_trace_hot		// (jit_State *J, const BCIns *pc)[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mr CARG2, PC[m
[31m-  |.if JIT[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  ori CARG2, PC, 1[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  add TMP0, BASE, RC[m
[31m-  |   stw PC, SAVE_PC[m
[31m-  |  mr CARG1, L[m
[31m-  |   stp BASE, L->base[m
[31m-  |  sub RA, RA, BASE[m
[31m-  |   stp TMP0, L->top[m
[31m-  |  bl extern lj_dispatch_call		// (lua_State *L, const BCIns *pc)[m
[31m-  |  // Returns ASMFunction.[m
[31m-  |  lp BASE, L->base[m
[31m-  |   lp TMP0, L->top[m
[31m-  |   stw ZERO, SAVE_PC			// Invalidate for subsequent line hook.[m
[31m-  |  sub NARGS8:RC, TMP0, BASE[m
[31m-  |  add RA, BASE, RA[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |  mtctr CRET1[m
[31m-  |  bctr[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // RA = resultptr, RB = meta base[m
[31m-  |  lwz INS, -4(PC)[m
[31m-  |    lwz TRACE:TMP2, -20(RB)		// Save previous trace.[m
[31m-  |   addic. TMP1, MULTRES, -8[m
[31m-  |  decode_RA8 RC, INS			// Call base.[m
[31m-  |   beq >2[m
[31m-  |1:  // Move results down.[m
[31m-  |  lfd f0, 0(RA)[m
[31m-  |   addic. TMP1, TMP1, -8[m
[31m-  |    addi RA, RA, 8[m
[31m-  |  stfdx f0, BASE, RC[m
[31m-  |    addi RC, RC, 8[m
[31m-  |   bne <1[m
[31m-  |2:[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |   add RA, RA, RB[m
[31m-  |3:[m
[31m-  |   cmplw RA, RC[m
[31m-  |   bgt >9				// More results wanted?[m
[31m-  |[m
[31m-  |  lhz TMP3, TRACE:TMP2->traceno[m
[31m-  |  lhz RD, TRACE:TMP2->link[m
[31m-  |  cmpw RD, TMP3[m
[31m-  |   cmpwi cr1, RD, 0[m
[31m-  |  beq ->cont_nop			// Blacklisted.[m
[31m-  |    slwi RD, RD, 3[m
[31m-  |   bne cr1, =>BC_JLOOP		// Jump to stitched trace.[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  stw TMP3, DISPATCH_J(exitno)(DISPATCH)[m
[31m-  |  stp L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |  stp BASE, L->base[m
[31m-  |  addi CARG1, DISPATCH, GG_DISP2J[m
[31m-  |  mr CARG2, PC[m
[31m-  |  bl extern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)[m
[31m-  |  lp BASE, L->base[m
[31m-  |  b ->cont_nop[m
[31m-  |[m
[31m-  |9:[m
[31m-  |  stwx TISNIL, BASE, RC[m
[31m-  |  addi RC, RC, 8[m
[31m-  |  b <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mr CARG1, L[m
[31m-  |   stw MULTRES, SAVE_MULTRES[m
[31m-  |  mr CARG2, PC[m
[31m-  |   stp BASE, L->base[m
[31m-  |  bl extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  lp BASE, L->base[m
[31m-  |  subi PC, PC, 4[m
[31m-  |  b ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro savex_, a, b, c, d[m
[31m-  |  stfd f..a, 16+a*8(sp)[m
[31m-  |  stfd f..b, 16+b*8(sp)[m
[31m-  |  stfd f..c, 16+c*8(sp)[m
[31m-  |  stfd f..d, 16+d*8(sp)[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |  addi sp, sp, -(16+32*8+32*4)[m
[31m-  |  stmw r2, 16+32*8+2*4(sp)[m
[31m-  |    addi DISPATCH, JGL, -GG_DISP2G-32768[m
[31m-  |    li CARG2, ~LJ_VMST_EXIT[m
[31m-  |   lwz CARG1, 16+32*8+32*4(sp)	// Get stack chain.[m
[31m-  |    stw CARG2, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-  |  savex_ 0,1,2,3[m
[31m-  |   stw CARG1, 0(sp)			// Store extended stack chain.[m
[31m-  |   clrso TMP1[m
[31m-  |  savex_ 4,5,6,7[m
[31m-  |   addi CARG2, sp, 16+32*8+32*4	// Recompute original value of sp.[m
[31m-  |  savex_ 8,9,10,11[m
[31m-  |   stw CARG2, 16+32*8+1*4(sp)	// Store sp in RID_SP.[m
[31m-  |  savex_ 12,13,14,15[m
[31m-  |   mflr CARG3[m
[31m-  |   li TMP1, 0[m
[31m-  |  savex_ 16,17,18,19[m
[31m-  |   stw TMP1, 16+32*8+0*4(sp)		// Clear RID_TMP.[m
[31m-  |  savex_ 20,21,22,23[m
[31m-  |   lhz CARG4, 2(CARG3)		// Load trace number.[m
[31m-  |  savex_ 24,25,26,27[m
[31m-  |  lwz L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-  |  savex_ 28,29,30,31[m
[31m-  |   sub CARG3, TMP0, CARG3		// Compute exit number.[m
[31m-  |  lp BASE, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |   srwi CARG3, CARG3, 2[m
[31m-  |  stp L, DISPATCH_J(L)(DISPATCH)[m
[31m-  |   subi CARG3, CARG3, 2[m
[31m-  |  stp BASE, L->base[m
[31m-  |   stw CARG4, DISPATCH_J(parent)(DISPATCH)[m
[31m-  |  stw TMP1, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  addi CARG1, DISPATCH, GG_DISP2J[m
[31m-  |   stw CARG3, DISPATCH_J(exitno)(DISPATCH)[m
[31m-  |  addi CARG2, sp, 16[m
[31m-  |  bl extern lj_trace_exit		// (jit_State *J, ExitState *ex)[m
[31m-  |  // Returns MULTRES (unscaled) or negated error code.[m
[31m-  |  lp TMP1, L->cframe[m
[31m-  |  lwz TMP2, 0(sp)[m
[31m-  |   lp BASE, L->base[m
[31m-  |.if GPR64[m
[31m-  |  rldicr sp, TMP1, 0, 61[m
[31m-  |.else[m
[31m-  |  rlwinm sp, TMP1, 0, 0, 29[m
[31m-  |.endif[m
[31m-  |   lwz PC, SAVE_PC			// Get SAVE_PC.[m
[31m-  |  stw TMP2, 0(sp)[m
[31m-  |  stw L, SAVE_L			// Set SAVE_L (on-trace resume/yield).[m
[31m-  |  b >1[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |.if JIT[m
[31m-  |  // CARG1 = MULTRES or negated error code, BASE, PC and JGL set.[m
[31m-  |  lwz L, SAVE_L[m
[31m-  |  addi DISPATCH, JGL, -GG_DISP2G-32768[m
[31m-  |  stp BASE, L->base[m
[31m-  |1:[m
[31m-  |  cmpwi CARG1, 0[m
[31m-  |  blt >9				// Check for error from exit.[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |   slwi MULTRES, CARG1, 3[m
[31m-  |    li TMP2, 0[m
[31m-  |   stw MULTRES, SAVE_MULTRES[m
[31m-  |  lwz TMP1, LFUNC:RB->pc[m
[31m-  |    stw TMP2, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-  |  lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |  // Setup type comparison constants.[m
[31m-  |  li TISNUM, LJ_TISNUM[m
[31m-  |  lus TMP3, 0x59c0			// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |  stw TMP3, TMPD[m
[31m-  |  li ZERO, 0[m
[31m-  |  ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |  lfs TOBIT, TMPD[m
[31m-  |  stw TMP3, TMPD[m
[31m-  |  lus TMP0, 0x4338			// Hiword of 2^52 + 2^51 (double)[m
[31m-  |    li TISNIL, LJ_TNIL[m
[31m-  |  stw TMP0, TONUM_HI[m
[31m-  |  lfs TONUM, TMPD[m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  lwz INS, 0(PC)[m
[31m-  |   addi PC, PC, 4[m
[31m-  |    // Assumes TISNIL == ~LJ_VMST_INTERP == -1.[m
[31m-  |    stw TISNIL, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-  |  decode_OPP TMP1, INS[m
[31m-  |   decode_RA8 RA, INS[m
[31m-  |  lpx TMP0, DISPATCH, TMP1[m
[31m-  |  mtctr TMP0[m
[31m-  |  cmplwi TMP1, BC_FUNCF*4		// Function header?[m
[31m-  |  bge >2[m
[31m-  |   decode_RB8 RB, INS[m
[31m-  |   decode_RD8 RD, INS[m
[31m-  |   decode_RC8 RC, INS[m
[31m-  |  bctr[m
[31m-  |2:[m
[31m-  |  cmplwi TMP1, (BC_FUNCC+2)*4	// Fast function?[m
[31m-  |  blt >3[m
[31m-  |  // Check frame below fast function.[m
[31m-  |  lwz TMP1, FRAME_PC(BASE)[m
[31m-  |  andix. TMP0, TMP1, FRAME_TYPE[m
[31m-  |  bney >3				// Trace stitching continuation?[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  lwz TMP2, -4(TMP1)[m
[31m-  |  decode_RA8 TMP0, TMP2[m
[31m-  |  sub TMP1, BASE, TMP0[m
[31m-  |  lwz LFUNC:TMP2, -12(TMP1)[m
[31m-  |  lwz TMP1, LFUNC:TMP2->pc[m
[31m-  |  lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-  |3:[m
[31m-  |   subi RC, MULTRES, 8[m
[31m-  |   add RA, RA, BASE[m
[31m-  |  bctr[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  neg CARG2, CARG1[m
[31m-  |  mr CARG1, L[m
[31m-  |  bl extern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// NYI: Use internal implementations of floor, ceil, trunc.[m
[31m-  |[m
[31m-  |->vm_modi:[m
[31m-  |  divwo. TMP0, CARG1, CARG2[m
[31m-  |  bso >1[m
[31m-  |.if GPR64[m
[31m-  |   xor CARG3, CARG1, CARG2[m
[31m-  |   cmpwi CARG3, 0[m
[31m-  |.else[m
[31m-  |   xor. CARG3, CARG1, CARG2[m
[31m-  |.endif[m
[31m-  |  mullw TMP0, TMP0, CARG2[m
[31m-  |  sub CARG1, CARG1, TMP0[m
[31m-  |   bgelr[m
[31m-  |  cmpwi CARG1, 0; beqlr[m
[31m-  |  add CARG1, CARG1, CARG2[m
[31m-  |  blr[m
[31m-  |1:[m
[31m-  |  cmpwi CARG2, 0[m
[31m-  |   li CARG1, 0[m
[31m-  |  beqlr[m
[31m-  |  clrso TMP0			// Clear SO for -2147483648 % -1 and return 0.[m
[31m-  |  blr[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// void lj_vm_cachesync(void *start, void *end)[m
[31m-  |// Flush D-Cache and invalidate I-Cache. Assumes 32 byte cache line size.[m
[31m-  |// This is a good lower bound, except for very ancient PPC models.[m
[31m-  |->vm_cachesync:[m
[31m-  |.if JIT or FFI[m
[31m-  |  // Compute start of first cache line and number of cache lines.[m
[31m-  |  rlwinm CARG1, CARG1, 0, 0, 26[m
[31m-  |  sub CARG2, CARG2, CARG1[m
[31m-  |  addi CARG2, CARG2, 31[m
[31m-  |  rlwinm. CARG2, CARG2, 27, 5, 31[m
[31m-  |  beqlr[m
[31m-  |  mtctr CARG2[m
[31m-  |  mr CARG3, CARG1[m
[31m-  |1:  // Flush D-Cache.[m
[31m-  |  dcbst r0, CARG1[m
[31m-  |  addi CARG1, CARG1, 32[m
[31m-  |  bdnz <1[m
[31m-  |  sync[m
[31m-  |  mtctr CARG2[m
[31m-  |1:  // Invalidate I-Cache.[m
[31m-  |  icbi r0, CARG3[m
[31m-  |  addi CARG3, CARG3, 32[m
[31m-  |  bdnz <1[m
[31m-  |  isync[m
[31m-  |  blr[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions. Callback slot number in r11, g in r12.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  saveregs[m
[31m-  |  lwz CTSTATE, GL:r12->ctype_state[m
[31m-  |   addi DISPATCH, r12, GG_G2DISP[m
[31m-  |  stw r11, CTSTATE->cb.slot[m
[31m-  |  stw r3, CTSTATE->cb.gpr[0][m
[31m-  |   stfd f1, CTSTATE->cb.fpr[0][m
[31m-  |  stw r4, CTSTATE->cb.gpr[1][m
[31m-  |   stfd f2, CTSTATE->cb.fpr[1][m
[31m-  |  stw r5, CTSTATE->cb.gpr[2][m
[31m-  |   stfd f3, CTSTATE->cb.fpr[2][m
[31m-  |  stw r6, CTSTATE->cb.gpr[3][m
[31m-  |   stfd f4, CTSTATE->cb.fpr[3][m
[31m-  |  stw r7, CTSTATE->cb.gpr[4][m
[31m-  |   stfd f5, CTSTATE->cb.fpr[4][m
[31m-  |  stw r8, CTSTATE->cb.gpr[5][m
[31m-  |   stfd f6, CTSTATE->cb.fpr[5][m
[31m-  |  stw r9, CTSTATE->cb.gpr[6][m
[31m-  |   stfd f7, CTSTATE->cb.fpr[6][m
[31m-  |  stw r10, CTSTATE->cb.gpr[7][m
[31m-  |   stfd f8, CTSTATE->cb.fpr[7][m
[31m-  |  addi TMP0, sp, CFRAME_SPACE+8[m
[31m-  |  stw TMP0, CTSTATE->cb.stack[m
[31m-  |   mr CARG1, CTSTATE[m
[31m-  |  stw CTSTATE, SAVE_PC		// Any value outside of bytecode is ok.[m
[31m-  |   mr CARG2, sp[m
[31m-  |  bl extern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |  // Returns lua_State *.[m
[31m-  |  lp BASE, L:CRET1->base[m
[31m-  |     li TISNUM, LJ_TISNUM		// Setup type comparison constants.[m
[31m-  |  lp RC, L:CRET1->top[m
[31m-  |     lus TMP3, 0x59c0		// TOBIT = 2^52 + 2^51 (float).[m
[31m-  |     li ZERO, 0[m
[31m-  |   mr L, CRET1[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |     lus TMP0, 0x4338		// Hiword of 2^52 + 2^51 (double)[m
[31m-  |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-  |     ori TMP3, TMP3, 0x0004		// TONUM = 2^52 + 2^51 + 2^31 (float).[m
[31m-  |     stw TMP0, TONUM_HI[m
[31m-  |     li TISNIL, LJ_TNIL[m
[31m-  |    li_vmstate INTERP[m
[31m-  |     lfs TOBIT, TMPD[m
[31m-  |     stw TMP3, TMPD[m
[31m-  |  sub RC, RC, BASE[m
[31m-  |    st_vmstate[m
[31m-  |     lfs TONUM, TMPD[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  lwz CTSTATE, DISPATCH_GL(ctype_state)(DISPATCH)[m
[31m-  |   stp BASE, L->base[m
[31m-  |   stp RB, L->top[m
[31m-  |  stp L, CTSTATE->L[m
[31m-  |  mr CARG1, CTSTATE[m
[31m-  |  mr CARG2, RA[m
[31m-  |  bl extern lj_ccallback_leave	// (CTState *cts, TValue *o)[m
[31m-  |  lwz CRET1, CTSTATE->cb.gpr[0][m
[31m-  |  lfd FARG1, CTSTATE->cb.fpr[0][m
[31m-  |  lwz CRET2, CTSTATE->cb.gpr[1][m
[31m-  |  b ->vm_leave_unw[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, CARG1[m
[31m-  |  lwz TMP1, CCSTATE->spadj[m
[31m-  |    mflr TMP0[m
[31m-  |   lbz CARG2, CCSTATE->nsp[m
[31m-  |   lbz CARG3, CCSTATE->nfpr[m
[31m-  |  neg TMP1, TMP1[m
[31m-  |    stw TMP0, 4(sp)[m
[31m-  |   cmpwi cr1, CARG3, 0[m
[31m-  |  mr TMP2, sp[m
[31m-  |   addic. CARG2, CARG2, -1[m
[31m-  |  stwux sp, sp, TMP1[m
[31m-  |   crnot 4*cr1+eq, 4*cr1+eq		// For vararg calls.[m
[31m-  |  stw r14, -4(TMP2)[m
[31m-  |  stw CCSTATE, -8(TMP2)[m
[31m-  |  mr r14, TMP2[m
[31m-  |  la TMP1, CCSTATE->stack[m
[31m-  |   slwi CARG2, CARG2, 2[m
[31m-  |   blty >2[m
[31m-  |  la TMP2, 8(sp)[m
[31m-  |1:[m
[31m-  |  lwzx TMP0, TMP1, CARG2[m
[31m-  |  stwx TMP0, TMP2, CARG2[m
[31m-  |   addic. CARG2, CARG2, -4[m
[31m-  |  bge <1[m
[31m-  |2:[m
[31m-  |  bney cr1, >3[m
[31m-  |  lfd f1, CCSTATE->fpr[0][m
[31m-  |  lfd f2, CCSTATE->fpr[1][m
[31m-  |  lfd f3, CCSTATE->fpr[2][m
[31m-  |  lfd f4, CCSTATE->fpr[3][m
[31m-  |  lfd f5, CCSTATE->fpr[4][m
[31m-  |  lfd f6, CCSTATE->fpr[5][m
[31m-  |  lfd f7, CCSTATE->fpr[6][m
[31m-  |  lfd f8, CCSTATE->fpr[7][m
[31m-  |3:[m
[31m-  |   lp TMP0, CCSTATE->func[m
[31m-  |  lwz CARG2, CCSTATE->gpr[1][m
[31m-  |  lwz CARG3, CCSTATE->gpr[2][m
[31m-  |  lwz CARG4, CCSTATE->gpr[3][m
[31m-  |  lwz CARG5, CCSTATE->gpr[4][m
[31m-  |   mtctr TMP0[m
[31m-  |  lwz r8, CCSTATE->gpr[5][m
[31m-  |  lwz r9, CCSTATE->gpr[6][m
[31m-  |  lwz r10, CCSTATE->gpr[7][m
[31m-  |  lwz CARG1, CCSTATE->gpr[0]		// Do this last, since CCSTATE is CARG1.[m
[31m-  |   bctrl[m
[31m-  |  lwz CCSTATE:TMP1, -8(r14)[m
[31m-  |  lwz TMP2, -4(r14)[m
[31m-  |   lwz TMP0, 4(r14)[m
[31m-  |  stw CARG1, CCSTATE:TMP1->gpr[0][m
[31m-  |  stfd FARG1, CCSTATE:TMP1->fpr[0][m
[31m-  |  stw CARG2, CCSTATE:TMP1->gpr[1][m
[31m-  |   mtlr TMP0[m
[31m-  |  stw CARG3, CCSTATE:TMP1->gpr[2][m
[31m-  |   mr sp, r14[m
[31m-  |  stw CARG4, CCSTATE:TMP1->gpr[3][m
[31m-  |   mr r14, TMP2[m
[31m-  |  blr[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1*8, RD = src2*8, JMP with RD = target[m
[31m-    |.if DUALNUM[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lwz CARG2, 4(RA)[m
[31m-    |  lwzux TMP1, RD, BASE[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |   lwz CARG3, 4(RD)[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  bne cr0, >7[m
[31m-    |  bne cr1, >8[m
[31m-    |   cmpw CARG2, CARG3[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  bge >2[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  blt >2[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  bgt >2[m
[31m-    } else {[m
[31m-      |  ble >2[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  add PC, PC, TMP2[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  bgt cr0, ->vmeta_comp[m
[31m-    |  // RA is a number.[m
[31m-    |   lfd f0, 0(RA)[m
[31m-    |  bgt cr1, ->vmeta_comp[m
[31m-    |  blt cr1, >4[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  tonum_i f1, CARG3[m
[31m-    |  b >5[m
[31m-    |[m
[31m-    |8: // RA is an integer, RD is not an integer.[m
[31m-    |  bgt cr1, ->vmeta_comp[m
[31m-    |  // RA is an integer, RD is a number.[m
[31m-    |  tonum_i f0, CARG2[m
[31m-    |4:[m
[31m-    |  lfd f1, 0(RD)[m
[31m-    |5:[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  bge <2[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  blt <2[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq[m
[31m-      |  bge <2[m
[31m-    } else {[m
[31m-      |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq[m
[31m-      |  blt <2[m
[31m-    }[m
[31m-    |  b <1[m
[31m-    |.else[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lfdx f0, BASE, RA[m
[31m-    |  lwzx TMP1, BASE, RD[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |   lfdx f1, BASE, RD[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  bge cr0, ->vmeta_comp[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  bge cr1, ->vmeta_comp[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    if (op == BC_ISLT) {[m
[31m-      |  bge >1[m
[31m-    } else if (op == BC_ISGE) {[m
[31m-      |  blt >1[m
[31m-    } else if (op == BC_ISLE) {[m
[31m-      |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq[m
[31m-      |  bge >1[m
[31m-    } else {[m
[31m-      |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq[m
[31m-      |  blt >1[m
[31m-    }[m
[31m-    |  add PC, PC, TMP2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  // RA = src1*8, RD = src2*8, JMP with RD = target[m
[31m-    |.if DUALNUM[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lwz CARG2, 4(RA)[m
[31m-    |  lwzux TMP1, RD, BASE[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |   lwz CARG3, 4(RD)[m
[31m-    |  cror 4*cr7+gt, 4*cr0+gt, 4*cr1+gt[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    if (vk) {[m
[31m-      |  ble cr7, ->BC_ISEQN_Z[m
[31m-    } else {[m
[31m-      |  ble cr7, ->BC_ISNEN_Z[m
[31m-    }[m
[31m-    |.else[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |   lwz TMP2, 0(PC)[m
[31m-    |    lfd f0, 0(RA)[m
[31m-    |   addi PC, PC, 4[m
[31m-    |  lwzux TMP1, RD, BASE[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |   decode_RD4 TMP2, TMP2[m
[31m-    |    lfd f1, 0(RD)[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |   addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  bge cr0, >5[m
[31m-    |  bge cr1, >5[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    if (vk) {[m
[31m-      |  bne >1[m
[31m-      |  add PC, PC, TMP2[m
[31m-    } else {[m
[31m-      |  beq >1[m
[31m-      |  add PC, PC, TMP2[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    |5:  // Either or both types are not numbers.[m
[31m-    |.if not DUALNUM[m
[31m-    |    lwz CARG2, 4(RA)[m
[31m-    |    lwz CARG3, 4(RD)[m
[31m-    |.endif[m
[31m-    |.if FFI[m
[31m-    |  cmpwi cr7, TMP0, LJ_TCDATA[m
[31m-    |  cmpwi cr5, TMP1, LJ_TCDATA[m
[31m-    |.endif[m
[31m-    |   not TMP3, TMP0[m
[31m-    |  cmplw TMP0, TMP1[m
[31m-    |   cmplwi cr1, TMP3, ~LJ_TISPRI		// Primitive?[m
[31m-    |.if FFI[m
[31m-    |  cror 4*cr7+eq, 4*cr7+eq, 4*cr5+eq[m
[31m-    |.endif[m
[31m-    |   cmplwi cr6, TMP3, ~LJ_TISTABUD		// Table or userdata?[m
[31m-    |.if FFI[m
[31m-    |  beq cr7, ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |    cmplw cr5, CARG2, CARG3[m
[31m-    |  crandc 4*cr0+gt, 4*cr0+eq, 4*cr1+gt	// 2: Same type and primitive.[m
[31m-    |  crorc 4*cr0+lt, 4*cr5+eq, 4*cr0+eq	// 1: Same tv or different type.[m
[31m-    |  crand 4*cr0+eq, 4*cr0+eq, 4*cr5+eq	// 0: Same type and same tv.[m
[31m-    |   mr SAVE0, PC[m
[31m-    |  cror 4*cr0+eq, 4*cr0+eq, 4*cr0+gt	// 0 or 2.[m
[31m-    |  cror 4*cr0+lt, 4*cr0+lt, 4*cr0+gt	// 1 or 2.[m
[31m-    if (vk) {[m
[31m-      |  bne cr0, >6[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |6:[m
[31m-    } else {[m
[31m-      |  beq cr0, >6[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |6:[m
[31m-    }[m
[31m-    |.if DUALNUM[m
[31m-    |  bge cr0, >2			// Done if 1 or 2.[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |2:[m
[31m-    |.else[m
[31m-    |  blt cr0, <1			// Done if 1 or 2.[m
[31m-    |.endif[m
[31m-    |  blt cr6, <1			// Done if not tab/ud.[m
[31m-    |[m
[31m-    |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-    |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-    |  lwz TAB:TMP2, TAB:CARG2->metatable[m
[31m-    |   li CARG4, 1-vk			// ne = 0 or 1.[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <1				// No metatable?[m
[31m-    |  lbz TMP2, TAB:TMP2->nomm[m
[31m-    |  andix. TMP2, TMP2, 1<<MM_eq[m
[31m-    |  bne <1				// Or 'no __eq' flag set?[m
[31m-    |  mr PC, SAVE0			// Restore old PC.[m
[31m-    |  b ->vmeta_equal			// Handle __eq metamethod.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  // RA = src*8, RD = str_const*8 (~), JMP with RD = target[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |   srwi RD, RD, 1[m
[31m-    |  lwz STR:TMP3, 4(RA)[m
[31m-    |    lwz TMP2, 0(PC)[m
[31m-    |   subfic RD, RD, -4[m
[31m-    |    addi PC, PC, 4[m
[31m-    |.if FFI[m
[31m-    |  cmpwi TMP0, LJ_TCDATA[m
[31m-    |.endif[m
[31m-    |   lwzx STR:TMP1, KBASE, RD	// KBASE-4-str_const*4[m
[31m-    |  .gpr64 extsw TMP0, TMP0[m
[31m-    |  subfic TMP0, TMP0, LJ_TSTR[m
[31m-    |.if FFI[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |  sub TMP1, STR:TMP1, STR:TMP3[m
[31m-    |  or TMP0, TMP0, TMP1[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  subfic TMP0, TMP0, 0[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  subfe TMP1, TMP1, TMP1[m
[31m-    if (vk) {[m
[31m-      |  andc TMP2, TMP2, TMP1[m
[31m-    } else {[m
[31m-      |  and TMP2, TMP2, TMP1[m
[31m-    }[m
[31m-    |  add PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  // RA = src*8, RD = num_const*8, JMP with RD = target[m
[31m-    |.if DUALNUM[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lwz CARG2, 4(RA)[m
[31m-    |  lwzux TMP1, RD, KBASE[m
[31m-    |  checknum cr0, TMP0[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |  checknum cr1, TMP1[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |   lwz CARG3, 4(RD)[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:[m
[31m-    }[m
[31m-    |  bne cr0, >7[m
[31m-    |  bne cr1, >8[m
[31m-    |   cmpw CARG2, CARG3[m
[31m-    |4:[m
[31m-    |.else[m
[31m-    if (vk) {[m
[31m-      |->BC_ISEQN_Z:  // Dummy label.[m
[31m-    } else {[m
[31m-      |->BC_ISNEN_Z:  // Dummy label.[m
[31m-    }[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |    addi PC, PC, 4[m
[31m-    |   lfdx f0, BASE, RA[m
[31m-    |    lwz TMP2, -4(PC)[m
[31m-    |  lfdx f1, KBASE, RD[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  checknum TMP0[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  bge >3[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    |.endif[m
[31m-    if (vk) {[m
[31m-      |  bne >1[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |1:[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |  beq >2[m
[31m-      |1:[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |2:[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    |.if FFI[m
[31m-    |3:[m
[31m-    |  cmpwi TMP0, LJ_TCDATA[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |  b <1[m
[31m-    |.endif[m
[31m-    |.if DUALNUM[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  bge cr0, <3[m
[31m-    |  // RA is a number.[m
[31m-    |   lfd f0, 0(RA)[m
[31m-    |  blt cr1, >1[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  tonum_i f1, CARG3[m
[31m-    |  b >2[m
[31m-    |[m
[31m-    |8: // RA is an integer, RD is a number.[m
[31m-    |  tonum_i f0, CARG2[m
[31m-    |1:[m
[31m-    |  lfd f1, 0(RD)[m
[31m-    |2:[m
[31m-    |  fcmpu cr0, f0, f1[m
[31m-    |  b <4[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |   srwi TMP1, RD, 3[m
[31m-    |    lwz TMP2, 0(PC)[m
[31m-    |   not TMP1, TMP1[m
[31m-    |    addi PC, PC, 4[m
[31m-    |.if FFI[m
[31m-    |  cmpwi TMP0, LJ_TCDATA[m
[31m-    |.endif[m
[31m-    |  sub TMP0, TMP0, TMP1[m
[31m-    |.if FFI[m
[31m-    |  beq ->vmeta_equal_cd[m
[31m-    |.endif[m
[31m-    |    decode_RD4 TMP2, TMP2[m
[31m-    |  .gpr64 extsw TMP0, TMP0[m
[31m-    |  addic TMP0, TMP0, -1[m
[31m-    |    addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-    |  subfe TMP1, TMP1, TMP1[m
[31m-    if (vk) {[m
[31m-      |  and TMP2, TMP2, TMP1[m
[31m-    } else {[m
[31m-      |  andc TMP2, TMP2, TMP1[m
[31m-    }[m
[31m-    |  add PC, PC, TMP2[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  // RA = dst*8 or unused, RD = src*8, JMP with RD = target[m
[31m-    |  lwzx TMP0, BASE, RD[m
[31m-    |   lwz INS, 0(PC)[m
[31m-    |   addi PC, PC, 4[m
[31m-    if (op == BC_IST || op == BC_ISF) {[m
[31m-      |  .gpr64 extsw TMP0, TMP0[m
[31m-      |  subfic TMP0, TMP0, LJ_TTRUE[m
[31m-      |   decode_RD4 TMP2, INS[m
[31m-      |  subfe TMP1, TMP1, TMP1[m
[31m-      |   addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)[m
[31m-      if (op == BC_IST) {[m
[31m-	|  andc TMP2, TMP2, TMP1[m
[31m-      } else {[m
[31m-	|  and TMP2, TMP2, TMP1[m
[31m-      }[m
[31m-      |  add PC, PC, TMP2[m
[31m-    } else {[m
[31m-      |  li TMP1, LJ_TFALSE[m
[31m-      |   lfdx f0, BASE, RD[m
[31m-      |  cmplw TMP0, TMP1[m
[31m-      if (op == BC_ISTC) {[m
[31m-	|  bge >1[m
[31m-      } else {[m
[31m-	|  blt >1[m
[31m-      }[m
[31m-      |  addis PC, PC, -(BCBIAS_J*4 >> 16)[m
[31m-      |  decode_RD4 TMP2, INS[m
[31m-      |   stfdx f0, BASE, RA[m
[31m-      |  add PC, PC, TMP2[m
[31m-      |1:[m
[31m-    }[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  // RA = src*8, RD = -type*8[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |  srwi TMP1, RD, 3[m
[31m-    |  ins_next1[m
[31m-    |.if not PPE and not GPR64[m
[31m-    |  add. TMP0, TMP0, TMP1[m
[31m-    |.else[m
[31m-    |  neg TMP1, TMP1[m
[31m-    |  cmpw TMP0, TMP1[m
[31m-    |.endif[m
[31m-    |  bne ->vmeta_istype[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  // RA = src*8, RD = -(TISNUM-1)*8[m
[31m-    |  lwzx TMP0, BASE, RA[m
[31m-    |  ins_next1[m
[31m-    |  checknum TMP0[m
[31m-    |  bge ->vmeta_istype[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  ins_next1[m
[31m-    |  lfdx f0, BASE, RD[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  ins_next1[m
[31m-    |  lwzx TMP0, BASE, RD[m
[31m-    |  .gpr64 extsw TMP0, TMP0[m
[31m-    |  subfic TMP1, TMP0, LJ_TTRUE[m
[31m-    |  adde TMP0, TMP0, TMP1[m
[31m-    |  stwx TMP0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  lwzux TMP1, RD, BASE[m
[31m-    |   lwz TMP0, 4(RD)[m
[31m-    |  checknum TMP1[m
[31m-    |.if DUALNUM[m
[31m-    |  bne >5[m
[31m-    |.if GPR64[m
[31m-    |  lus TMP2, 0x8000[m
[31m-    |  neg TMP0, TMP0[m
[31m-    |  cmplw TMP0, TMP2[m
[31m-    |  beq >4[m
[31m-    |.else[m
[31m-    |  nego. TMP0, TMP0[m
[31m-    |  bso >4[m
[31m-    |1:[m
[31m-    |.endif[m
[31m-    |  ins_next1[m
[31m-    |  stwux TISNUM, RA, BASE[m
[31m-    |   stw TMP0, 4(RA)[m
[31m-    |3:[m
[31m-    |  ins_next2[m
[31m-    |4:[m
[31m-    |.if not GPR64[m
[31m-    |  // Potential overflow.[m
[31m-    |  checkov TMP1, <1			// Ignore unrelated overflow.[m
[31m-    |.endif[m
[31m-    |  lus TMP1, 0x41e0			// 2^31.[m
[31m-    |  li TMP0, 0[m
[31m-    |  b >7[m
[31m-    |.endif[m
[31m-    |5:[m
[31m-    |  bge ->vmeta_unm[m
[31m-    |  xoris TMP1, TMP1, 0x8000[m
[31m-    |7:[m
[31m-    |  ins_next1[m
[31m-    |  stwux TMP1, RA, BASE[m
[31m-    |   stw TMP0, 4(RA)[m
[31m-    |.if DUALNUM[m
[31m-    |  b <3[m
[31m-    |.else[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  // RA = dst*8, RD = src*8[m
[31m-    |  lwzux TMP0, RD, BASE[m
[31m-    |   lwz CARG1, 4(RD)[m
[31m-    |  checkstr TMP0; bne >2[m
[31m-    |  lwz CRET1, STR:CARG1->len[m
[31m-    |1:[m
[31m-    |.if DUALNUM[m
[31m-    |  ins_next1[m
[31m-    |  stwux TISNUM, RA, BASE[m
[31m-    |   stw CRET1, 4(RA)[m
[31m-    |.else[m
[31m-    |  tonum_u f0, CRET1		// Result is a non-negative integer.[m
[31m-    |  ins_next1[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |.endif[m
[31m-    |  ins_next2[m
[31m-    |2:[m
[31m-    |  checktab TMP0; bne ->vmeta_len[m
[31m-#if LJ_52[m
[31m-    |  lwz TAB:TMP2, TAB:CARG1->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  bne >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  bl extern lj_tab_len		// (GCtab *t)[m
[31m-    |  // Returns uint32_t (but less than 2^31).[m
[31m-    |  b <1[m
[31m-#if LJ_52[m
[31m-    |9:[m
[31m-    |  lbz TMP0, TAB:TMP2->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_len[m
[31m-    |  bne <3				// 'no __len' flag set: done.[m
[31m-    |  b ->vmeta_len[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithpre[m
[31m-    |  // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   lwzx TMP1, BASE, RB[m
[31m-    |   .if DUALNUM[m
[31m-    |     lwzx TMP2, KBASE, RC[m
[31m-    |   .endif[m
[31m-    |    lfdx f14, BASE, RB[m
[31m-    |    lfdx f15, KBASE, RC[m
[31m-    |   .if DUALNUM[m
[31m-    |     checknum cr0, TMP1[m
[31m-    |     checknum cr1, TMP2[m
[31m-    |     crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |     bge ->vmeta_arith_vn[m
[31m-    |   .else[m
[31m-    |     checknum TMP1; bge ->vmeta_arith_vn[m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   lwzx TMP1, BASE, RB[m
[31m-    |   .if DUALNUM[m
[31m-    |     lwzx TMP2, KBASE, RC[m
[31m-    |   .endif[m
[31m-    |    lfdx f15, BASE, RB[m
[31m-    |    lfdx f14, KBASE, RC[m
[31m-    |   .if DUALNUM[m
[31m-    |     checknum cr0, TMP1[m
[31m-    |     checknum cr1, TMP2[m
[31m-    |     crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |     bge ->vmeta_arith_nv[m
[31m-    |   .else[m
[31m-    |     checknum TMP1; bge ->vmeta_arith_nv[m
[31m-    |   .endif[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   lwzx TMP1, BASE, RB[m
[31m-    |   lwzx TMP2, BASE, RC[m
[31m-    |    lfdx f14, BASE, RB[m
[31m-    |    lfdx f15, BASE, RC[m
[31m-    |   checknum cr0, TMP1[m
[31m-    |   checknum cr1, TMP2[m
[31m-    |   crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |   bge ->vmeta_arith_vv[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfallback, ins[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   ins ->vmeta_arith_vn2[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   ins ->vmeta_arith_nv2[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   ins ->vmeta_arith_vv2[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro intmod, a, b, c[m
[31m-    |  bl ->vm_modi[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro fpmod, a, b, c[m
[31m-    |->BC_MODVN_Z:[m
[31m-    |  fdiv FARG1, b, c[m
[31m-    |  // NYI: Use internal implementation of floor.[m
[31m-    |  blex floor			// floor(b/c)[m
[31m-    |  fmul a, FARG1, c[m
[31m-    |  fsub a, b, a			// b - floor(b/c)*c[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithfp, fpins[m
[31m-    |  ins_arithpre[m
[31m-    |.if "fpins" == "fpmod_"[m
[31m-    |  b ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[31m-    |.else[m
[31m-    |  fpins f0, f14, f15[m
[31m-    |  ins_next1[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins, fpins[m
[31m-    |  // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   lwzux TMP1, RB, BASE[m
[31m-    |   lwzux TMP2, RC, KBASE[m
[31m-    |    lwz CARG1, 4(RB)[m
[31m-    |   checknum cr0, TMP1[m
[31m-    |    lwz CARG2, 4(RC)[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   lwzux TMP1, RB, BASE[m
[31m-    |   lwzux TMP2, RC, KBASE[m
[31m-    |    lwz CARG2, 4(RB)[m
[31m-    |   checknum cr0, TMP1[m
[31m-    |    lwz CARG1, 4(RC)[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   lwzux TMP1, RB, BASE[m
[31m-    |   lwzux TMP2, RC, BASE[m
[31m-    |    lwz CARG1, 4(RB)[m
[31m-    |   checknum cr0, TMP1[m
[31m-    |    lwz CARG2, 4(RC)[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |  checknum cr1, TMP2[m
[31m-    |  bne >5[m
[31m-    |  bne cr1, >5[m
[31m-    |  intins CARG1, CARG1, CARG2[m
[31m-    |  bso >4[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |  stwux TISNUM, RA, BASE[m
[31m-    |  stw CARG1, 4(RA)[m
[31m-    |2:[m
[31m-    |  ins_next2[m
[31m-    |4:  // Overflow.[m
[31m-    |  checkov TMP0, <1			// Ignore unrelated overflow.[m
[31m-    |  ins_arithfallback b[m
[31m-    |5:  // FP variant.[m
[31m-    ||if (vk == 1) {[m
[31m-    |  lfd f15, 0(RB)[m
[31m-    |   crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |  lfd f14, 0(RC)[m
[31m-    ||} else {[m
[31m-    |  lfd f14, 0(RB)[m
[31m-    |   crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |  lfd f15, 0(RC)[m
[31m-    ||}[m
[31m-    |   ins_arithfallback bge[m
[31m-    |.if "fpins" == "fpmod_"[m
[31m-    |  b ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[31m-    |.else[m
[31m-    |  fpins f0, f14, f15[m
[31m-    |  ins_next1[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  b <2[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, intins, fpins[m
[31m-    |.if DUALNUM[m
[31m-    |  ins_arithdn intins, fpins[m
[31m-    |.else[m
[31m-    |  ins_arithfp fpins[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |.if GPR64[m
[31m-    |.macro addo32., y, a, b[m
[31m-    |  // Need to check overflow for (a<<32) + (b<<32).[m
[31m-    |  rldicr TMP0, a, 32, 31[m
[31m-    |  rldicr TMP3, b, 32, 31[m
[31m-    |  addo. TMP0, TMP0, TMP3[m
[31m-    |  add y, a, b[m
[31m-    |.endmacro[m
[31m-    |  ins_arith addo32., fadd[m
[31m-    |.else[m
[31m-    |  ins_arith addo., fadd[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |.if GPR64[m
[31m-    |.macro subo32., y, a, b[m
[31m-    |  // Need to check overflow for (a<<32) - (b<<32).[m
[31m-    |  rldicr TMP0, a, 32, 31[m
[31m-    |  rldicr TMP3, b, 32, 31[m
[31m-    |  subo. TMP0, TMP0, TMP3[m
[31m-    |  sub y, a, b[m
[31m-    |.endmacro[m
[31m-    |  ins_arith subo32., fsub[m
[31m-    |.else[m
[31m-    |  ins_arith subo., fsub[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arith mullwo., fmul[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arithfp fdiv[m
[31m-    break;[m
[31m-  case BC_MODVN:[m
[31m-    |  ins_arith intmod, fpmod[m
[31m-    break;[m
[31m-  case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arith intmod, fpmod_[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  // NYI: (partial) integer arithmetic.[m
[31m-    |  lwzx TMP1, BASE, RB[m
[31m-    |   lfdx FARG1, BASE, RB[m
[31m-    |  lwzx TMP2, BASE, RC[m
[31m-    |   lfdx FARG2, BASE, RC[m
[31m-    |  checknum cr0, TMP1[m
[31m-    |  checknum cr1, TMP2[m
[31m-    |  crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-    |  bge ->vmeta_arith_vv[m
[31m-    |  blex pow[m
[31m-    |  ins_next1[m
[31m-    |  stfdx FARG1, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  // RA = dst*8, RB = src_start*8, RC = src_end*8[m
[31m-    |  sub CARG3, RC, RB[m
[31m-    |   stp BASE, L->base[m
[31m-    |  add CARG2, BASE, RC[m
[31m-    |  mr SAVE0, RB[m
[31m-    |->BC_CAT_Z:[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  mr CARG1, L[m
[31m-    |  srwi CARG3, CARG3, 3[m
[31m-    |  bl extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // Returns NULL (finished) or TValue * (metamethod).[m
[31m-    |  cmplwi CRET1, 0[m
[31m-    |   lp BASE, L->base[m
[31m-    |  bne ->vmeta_binop[m
[31m-    |  ins_next1[m
[31m-    |  lfdx f0, BASE, SAVE0		// Copy result from RB to RA.[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  // RA = dst*8, RD = str_const*8 (~)[m
[31m-    |  srwi TMP1, RD, 1[m
[31m-    |  subfic TMP1, TMP1, -4[m
[31m-    |  ins_next1[m
[31m-    |  lwzx TMP0, KBASE, TMP1		// KBASE-4-str_const*4[m
[31m-    |  li TMP2, LJ_TSTR[m
[31m-    |  stwux TMP2, RA, BASE[m
[31m-    |  stw TMP0, 4(RA)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  // RA = dst*8, RD = cdata_const*8 (~)[m
[31m-    |  srwi TMP1, RD, 1[m
[31m-    |  subfic TMP1, TMP1, -4[m
[31m-    |  ins_next1[m
[31m-    |  lwzx TMP0, KBASE, TMP1		// KBASE-4-cdata_const*4[m
[31m-    |  li TMP2, LJ_TCDATA[m
[31m-    |  stwux TMP2, RA, BASE[m
[31m-    |  stw TMP0, 4(RA)[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  // RA = dst*8, RD = int16_literal*8[m
[31m-    |.if DUALNUM[m
[31m-    |  slwi RD, RD, 13[m
[31m-    |  srawi RD, RD, 16[m
[31m-    |  ins_next1[m
[31m-    |   stwux TISNUM, RA, BASE[m
[31m-    |   stw RD, 4(RA)[m
[31m-    |  ins_next2[m
[31m-    |.else[m
[31m-    |  // The soft-float approach is faster.[m
[31m-    |  slwi RD, RD, 13[m
[31m-    |  srawi TMP1, RD, 31[m
[31m-    |  xor TMP2, TMP1, RD[m
[31m-    |  sub TMP2, TMP2, TMP1		// TMP2 = abs(x)[m
[31m-    |  cntlzw TMP3, TMP2[m
[31m-    |  subfic TMP1, TMP3, 0x40d		// TMP1 = exponent-1[m
[31m-    |   slw TMP2, TMP2, TMP3		// TMP2 = left aligned mantissa[m
[31m-    |    subfic TMP3, RD, 0[m
[31m-    |  slwi TMP1, TMP1, 20[m
[31m-    |   rlwimi RD, TMP2, 21, 1, 31	// hi = sign(x) | (mantissa>>11)[m
[31m-    |    subfe TMP0, TMP0, TMP0[m
[31m-    |   add RD, RD, TMP1		// hi = hi + exponent-1[m
[31m-    |    and RD, RD, TMP0		// hi = x == 0 ? 0 : hi[m
[31m-    |  ins_next1[m
[31m-    |    stwux RD, RA, BASE[m
[31m-    |    stw ZERO, 4(RA)[m
[31m-    |  ins_next2[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  // RA = dst*8, RD = num_const*8[m
[31m-    |  ins_next1[m
[31m-    |  lfdx f0, KBASE, RD[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  // RA = dst*8, RD = primitive_type*8 (~)[m
[31m-    |  srwi TMP1, RD, 3[m
[31m-    |  not TMP0, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  stwx TMP0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  // RA = base*8, RD = end*8[m
[31m-    |  stwx TISNIL, BASE, RA[m
[31m-    |   addi RA, RA, 8[m
[31m-    |1:[m
[31m-    |  stwx TISNIL, BASE, RA[m
[31m-    |  cmpw RA, RD[m
[31m-    |   addi RA, RA, 8[m
[31m-    |  blt <1[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  // RA = dst*8, RD = uvnum*8[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srwi RD, RD, 1[m
[31m-    |   addi RD, RD, offsetof(GCfuncL, uvptr)[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RD[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, UPVAL:RB->v[m
[31m-    |  lfd f0, 0(TMP1)[m
[31m-    |  stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-    |  // RA = uvnum*8, RD = src*8[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |    srwi RA, RA, 1[m
[31m-    |    addi RA, RA, offsetof(GCfuncL, uvptr)[m
[31m-    |   lfdux f0, RD, BASE[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RA[m
[31m-    |  lbz TMP3, UPVAL:RB->marked[m
[31m-    |   lwz CARG2, UPVAL:RB->v[m
[31m-    |  andix. TMP3, TMP3, LJ_GC_BLACK	// isblack(uv)[m
[31m-    |    lbz TMP0, UPVAL:RB->closed[m
[31m-    |   lwz TMP2, 0(RD)[m
[31m-    |   stfd f0, 0(CARG2)[m
[31m-    |    cmplwi cr1, TMP0, 0[m
[31m-    |   lwz TMP1, 4(RD)[m
[31m-    |  cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq[m
[31m-    |   subi TMP2, TMP2, (LJ_TNUMX+1)[m
[31m-    |  bne >2				// Upvalue is closed and black?[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if new value is collectable.[m
[31m-    |  cmplwi TMP2, LJ_TISGCV - (LJ_TNUMX+1)[m
[31m-    |  bge <1				// tvisgcv(v)[m
[31m-    |  lbz TMP3, GCOBJ:TMP1->gch.marked[m
[31m-    |  andix. TMP3, TMP3, LJ_GC_WHITES	// iswhite(v)[m
[31m-    |   la CARG1, GG_DISP2G(DISPATCH)[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  beq <1[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETS:[m
[31m-    |  // RA = uvnum*8, RD = str_const*8 (~)[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srwi TMP1, RD, 1[m
[31m-    |    srwi RA, RA, 1[m
[31m-    |   subfic TMP1, TMP1, -4[m
[31m-    |    addi RA, RA, offsetof(GCfuncL, uvptr)[m
[31m-    |   lwzx STR:TMP1, KBASE, TMP1	// KBASE-4-str_const*4[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RA[m
[31m-    |  lbz TMP3, UPVAL:RB->marked[m
[31m-    |   lwz CARG2, UPVAL:RB->v[m
[31m-    |  andix. TMP3, TMP3, LJ_GC_BLACK	// isblack(uv)[m
[31m-    |   lbz TMP3, STR:TMP1->marked[m
[31m-    |   lbz TMP2, UPVAL:RB->closed[m
[31m-    |   li TMP0, LJ_TSTR[m
[31m-    |   stw STR:TMP1, 4(CARG2)[m
[31m-    |   stw TMP0, 0(CARG2)[m
[31m-    |  bne >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  andix. TMP3, TMP3, LJ_GC_WHITES	// iswhite(str)[m
[31m-    |   cmplwi cr1, TMP2, 0[m
[31m-    |  cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq[m
[31m-    |   la CARG1, GG_DISP2G(DISPATCH)[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  beq <1[m
[31m-    |  bl extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  // RA = uvnum*8, RD = num_const*8[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srwi RA, RA, 1[m
[31m-    |   addi RA, RA, offsetof(GCfuncL, uvptr)[m
[31m-    |    lfdx f0, KBASE, RD[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RA[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, UPVAL:RB->v[m
[31m-    |  stfd f0, 0(TMP1)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  // RA = uvnum*8, RD = primitive_type*8 (~)[m
[31m-    |  lwz LFUNC:RB, FRAME_FUNC(BASE)[m
[31m-    |   srwi RA, RA, 1[m
[31m-    |    srwi TMP0, RD, 3[m
[31m-    |   addi RA, RA, offsetof(GCfuncL, uvptr)[m
[31m-    |    not TMP0, TMP0[m
[31m-    |  lwzx UPVAL:RB, LFUNC:RB, RA[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, UPVAL:RB->v[m
[31m-    |  stw TMP0, 0(TMP1)[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_UCLO:[m
[31m-    |  // RA = level*8, RD = target[m
[31m-    |  lwz TMP1, L->openupval[m
[31m-    |  branch_RD			// Do this first since RD is not saved.[m
[31m-    |   stp BASE, L->base[m
[31m-    |  cmplwi TMP1, 0[m
[31m-    |   mr CARG1, L[m
[31m-    |  beq >1[m
[31m-    |   add CARG2, BASE, RA[m
[31m-    |  bl extern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |  lp BASE, L->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  // RA = dst*8, RD = proto_const*8 (~) (holding function prototype)[m
[31m-    |  srwi TMP1, RD, 1[m
[31m-    |   stp BASE, L->base[m
[31m-    |  subfic TMP1, TMP1, -4[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  lwzx CARG2, KBASE, TMP1		// KBASE-4-tab_const*4[m
[31m-    |   mr CARG1, L[m
[31m-    |  lwz CARG3, FRAME_FUNC(BASE)[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  bl extern lj_func_newL_gc[m
[31m-    |  // Returns GCfuncL *.[m
[31m-    |  lp BASE, L->base[m
[31m-    |   li TMP0, LJ_TFUNC[m
[31m-    |  stwux TMP0, RA, BASE[m
[31m-    |  stw LFUNC:CRET1, 4(RA)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-  case BC_TDUP:[m
[31m-    |  // RA = dst*8, RD = (hbits|asize)*8 | tab_const*8 (~)[m
[31m-    |  lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH)[m
[31m-    |   mr CARG1, L[m
[31m-    |  lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)[m
[31m-    |   stp BASE, L->base[m
[31m-    |  cmplw TMP0, TMP1[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  bge >5[m
[31m-    |1:[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |  rlwinm CARG2, RD, 29, 21, 31[m
[31m-      |  rlwinm CARG3, RD, 18, 27, 31[m
[31m-      |  cmpwi CARG2, 0x7ff; beq >3[m
[31m-      |2:[m
[31m-      |  bl extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-      |  // Returns Table *.[m
[31m-    } else {[m
[31m-      |  srwi TMP1, RD, 1[m
[31m-      |  subfic TMP1, TMP1, -4[m
[31m-      |  lwzx CARG2, KBASE, TMP1		// KBASE-4-tab_const*4[m
[31m-      |  bl extern lj_tab_dup  // (lua_State *L, Table *kt)[m
[31m-      |  // Returns Table *.[m
[31m-    }[m
[31m-    |  lp BASE, L->base[m
[31m-    |   li TMP0, LJ_TTAB[m
[31m-    |  stwux TMP0, RA, BASE[m
[31m-    |  stw TAB:CRET1, 4(RA)[m
[31m-    |  ins_next[m
[31m-    if (op == BC_TNEW) {[m
[31m-      |3:[m
[31m-      |  li CARG2, 0x801[m
[31m-      |  b <2[m
[31m-    }[m
[31m-    |5:[m
[31m-    |  mr SAVE0, RD[m
[31m-    |  bl extern lj_gc_step_fixtop  // (lua_State *L)[m
[31m-    |  mr RD, SAVE0[m
[31m-    |  mr CARG1, L[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  // RA = dst*8, RD = str_const*8 (~)[m
[31m-  case BC_GSET:[m
[31m-    |  // RA = src*8, RD = str_const*8 (~)[m
[31m-    |  lwz LFUNC:TMP2, FRAME_FUNC(BASE)[m
[31m-    |   srwi TMP1, RD, 1[m
[31m-    |  lwz TAB:RB, LFUNC:TMP2->env[m
[31m-    |   subfic TMP1, TMP1, -4[m
[31m-    |   lwzx STR:RC, KBASE, TMP1	// KBASE-4-str_const*4[m
[31m-    if (op == BC_GGET) {[m
[31m-      |  b ->BC_TGETS_Z[m
[31m-    } else {[m
[31m-      |  b ->BC_TSETS_Z[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |  lwzux CARG2, RC, BASE[m
[31m-    |   lwz TAB:RB, 4(RB)[m
[31m-    |.if DUALNUM[m
[31m-    |   lwz RC, 4(RC)[m
[31m-    |.else[m
[31m-    |   lfd f0, 0(RC)[m
[31m-    |.endif[m
[31m-    |  checktab CARG1[m
[31m-    |   checknum cr1, CARG2[m
[31m-    |  bne ->vmeta_tgetv[m
[31m-    |.if DUALNUM[m
[31m-    |  lwz TMP0, TAB:RB->asize[m
[31m-    |   bne cr1, >5[m
[31m-    |   lwz TMP1, TAB:RB->array[m
[31m-    |  cmplw TMP0, RC[m
[31m-    |   slwi TMP2, RC, 3[m
[31m-    |.else[m
[31m-    |   bge cr1, >5[m
[31m-    |  // Convert number key to integer, check for integerness and range.[m
[31m-    |  fctiwz f1, f0[m
[31m-    |    fadd f2, f0, TOBIT[m
[31m-    |  stfd f1, TMPD[m
[31m-    |   lwz TMP0, TAB:RB->asize[m
[31m-    |    fsub f2, f2, TOBIT[m
[31m-    |  lwz TMP2, TMPD_LO[m
[31m-    |   lwz TMP1, TAB:RB->array[m
[31m-    |    fcmpu cr1, f0, f2[m
[31m-    |  cmplw cr0, TMP0, TMP2[m
[31m-    |  crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq[m
[31m-    |   slwi TMP2, TMP2, 3[m
[31m-    |.endif[m
[31m-    |  ble ->vmeta_tgetv		// Integer key and in array part?[m
[31m-    |  lwzx TMP0, TMP1, TMP2[m
[31m-    |   lfdx f14, TMP1, TMP2[m
[31m-    |  checknil TMP0; beq >2[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |   stfdx f14, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  lwz TAB:TMP2, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  lbz TMP0, TAB:TMP2->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_index[m
[31m-    |  bne <1				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetv[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  checkstr CARG2; bne ->vmeta_tgetv[m
[31m-    |.if not DUALNUM[m
[31m-    |  lwz STR:RC, 4(RC)[m
[31m-    |.endif[m
[31m-    |  b ->BC_TGETS_Z			// String key?[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = str_const*8 (~)[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |   srwi TMP1, RC, 1[m
[31m-    |    lwz TAB:RB, 4(RB)[m
[31m-    |   subfic TMP1, TMP1, -4[m
[31m-    |  checktab CARG1[m
[31m-    |   lwzx STR:RC, KBASE, TMP1	// KBASE-4-str_const*4[m
[31m-    |  bne ->vmeta_tgets1[m
[31m-    |->BC_TGETS_Z:[m
[31m-    |  // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8[m
[31m-    |  lwz TMP0, TAB:RB->hmask[m
[31m-    |  lwz TMP1, STR:RC->hash[m
[31m-    |  lwz NODE:TMP2, TAB:RB->node[m
[31m-    |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-    |  slwi TMP0, TMP1, 5[m
[31m-    |  slwi TMP1, TMP1, 3[m
[31m-    |  sub TMP1, TMP0, TMP1[m
[31m-    |  add NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-    |1:[m
[31m-    |  lwz CARG1, NODE:TMP2->key[m
[31m-    |   lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)[m
[31m-    |    lwz CARG2, NODE:TMP2->val[m
[31m-    |     lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2)[m
[31m-    |  checkstr CARG1; bne >4[m
[31m-    |   cmpw TMP0, STR:RC; bne >4[m
[31m-    |    checknil CARG2; beq >5		// Key found, but nil value?[m
[31m-    |3:[m
[31m-    |    stwux CARG2, RA, BASE[m
[31m-    |     stw TMP1, 4(RA)[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  lwz NODE:TMP2, NODE:TMP2->next[m
[31m-    |  cmplwi NODE:TMP2, 0[m
[31m-    |  bne <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |   li CARG2, LJ_TNIL[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  lwz TAB:TMP2, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <3				// No metatable: done.[m
[31m-    |  lbz TMP0, TAB:TMP2->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_index[m
[31m-    |  bne <3				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgets[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = index*8[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |   srwi TMP0, RC, 3[m
[31m-    |   lwz TAB:RB, 4(RB)[m
[31m-    |  checktab CARG1; bne ->vmeta_tgetb[m
[31m-    |  lwz TMP1, TAB:RB->asize[m
[31m-    |   lwz TMP2, TAB:RB->array[m
[31m-    |  cmplw TMP0, TMP1; bge ->vmeta_tgetb[m
[31m-    |  lwzx TMP1, TMP2, RC[m
[31m-    |   lfdx f0, TMP2, RC[m
[31m-    |  checknil TMP1; beq >5[m
[31m-    |1:[m
[31m-    |  ins_next1[m
[31m-    |   stfdx f0, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  lwz TAB:TMP2, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  lbz TMP2, TAB:TMP2->nomm[m
[31m-    |  andix. TMP2, TMP2, 1<<MM_index[m
[31m-    |  bne <1				// 'no __index' flag set: done.[m
[31m-    |  b ->vmeta_tgetb			// Caveat: preserve TMP0![m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  add RB, BASE, RB[m
[31m-    |  lwz TAB:CARG1, 4(RB)[m
[31m-    |.if DUALNUM[m
[31m-    |  add RC, BASE, RC[m
[31m-    |  lwz TMP0, TAB:CARG1->asize[m
[31m-    |  lwz CARG2, 4(RC)[m
[31m-    |   lwz TMP1, TAB:CARG1->array[m
[31m-    |.else[m
[31m-    |  lfdx f0, BASE, RC[m
[31m-    |  lwz TMP0, TAB:CARG1->asize[m
[31m-    |  toint CARG2, f0[m
[31m-    |   lwz TMP1, TAB:CARG1->array[m
[31m-    |.endif[m
[31m-    |  cmplw TMP0, CARG2[m
[31m-    |   slwi TMP2, CARG2, 3[m
[31m-    |  ble ->vmeta_tgetr		// In array part?[m
[31m-    |   lfdx f14, TMP1, TMP2[m
[31m-    |->BC_TGETR_Z:[m
[31m-    |  ins_next1[m
[31m-    |   stfdx f14, BASE, RA[m
[31m-    |  ins_next2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  // RA = src*8, RB = table*8, RC = key*8[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |  lwzux CARG2, RC, BASE[m
[31m-    |   lwz TAB:RB, 4(RB)[m
[31m-    |.if DUALNUM[m
[31m-    |   lwz RC, 4(RC)[m
[31m-    |.else[m
[31m-    |   lfd f0, 0(RC)[m
[31m-    |.endif[m
[31m-    |  checktab CARG1[m
[31m-    |   checknum cr1, CARG2[m
[31m-    |  bne ->vmeta_tsetv[m
[31m-    |.if DUALNUM[m
[31m-    |  lwz TMP0, TAB:RB->asize[m
[31m-    |   bne cr1, >5[m
[31m-    |   lwz TMP1, TAB:RB->array[m
[31m-    |  cmplw TMP0, RC[m
[31m-    |   slwi TMP0, RC, 3[m
[31m-    |.else[m
[31m-    |   bge cr1, >5[m
[31m-    |  // Convert number key to integer, check for integerness and range.[m
[31m-    |  fctiwz f1, f0[m
[31m-    |    fadd f2, f0, TOBIT[m
[31m-    |  stfd f1, TMPD[m
[31m-    |   lwz TMP0, TAB:RB->asize[m
[31m-    |    fsub f2, f2, TOBIT[m
[31m-    |  lwz TMP2, TMPD_LO[m
[31m-    |   lwz TMP1, TAB:RB->array[m
[31m-    |    fcmpu cr1, f0, f2[m
[31m-    |  cmplw cr0, TMP0, TMP2[m
[31m-    |  crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq[m
[31m-    |   slwi TMP0, TMP2, 3[m
[31m-    |.endif[m
[31m-    |  ble ->vmeta_tsetv		// Integer key and in array part?[m
[31m-    |   lwzx TMP2, TMP1, TMP0[m
[31m-    |  lbz TMP3, TAB:RB->marked[m
[31m-    |    lfdx f14, BASE, RA[m
[31m-    |   checknil TMP2; beq >3[m
[31m-    |1:[m
[31m-    |  andix. TMP2, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |    stfdx f14, TMP1, TMP0[m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  lwz TAB:TMP2, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP2, 0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  lbz TMP2, TAB:TMP2->nomm[m
[31m-    |  andix. TMP2, TMP2, 1<<MM_newindex[m
[31m-    |  bne <1				// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsetv[m
[31m-    |[m
[31m-    |5:[m
[31m-    |  checkstr CARG2; bne ->vmeta_tsetv[m
[31m-    |.if not DUALNUM[m
[31m-    |  lwz STR:RC, 4(RC)[m
[31m-    |.endif[m
[31m-    |  b ->BC_TSETS_Z			// String key?[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  // RA = src*8, RB = table*8, RC = str_const*8 (~)[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |   srwi TMP1, RC, 1[m
[31m-    |    lwz TAB:RB, 4(RB)[m
[31m-    |   subfic TMP1, TMP1, -4[m
[31m-    |  checktab CARG1[m
[31m-    |   lwzx STR:RC, KBASE, TMP1	// KBASE-4-str_const*4[m
[31m-    |  bne ->vmeta_tsets1[m
[31m-    |->BC_TSETS_Z:[m
[31m-    |  // TAB:RB = GCtab *, STR:RC = GCstr *, RA = src*8[m
[31m-    |  lwz TMP0, TAB:RB->hmask[m
[31m-    |  lwz TMP1, STR:RC->hash[m
[31m-    |  lwz NODE:TMP2, TAB:RB->node[m
[31m-    |    stb ZERO, TAB:RB->nomm		// Clear metamethod cache.[m
[31m-    |  and TMP1, TMP1, TMP0		// idx = str->hash & tab->hmask[m
[31m-    |    lfdx f14, BASE, RA[m
[31m-    |  slwi TMP0, TMP1, 5[m
[31m-    |  slwi TMP1, TMP1, 3[m
[31m-    |  sub TMP1, TMP0, TMP1[m
[31m-    |    lbz TMP3, TAB:RB->marked[m
[31m-    |  add NODE:TMP2, NODE:TMP2, TMP1	// node = tab->node + (idx*32-idx*8)[m
[31m-    |1:[m
[31m-    |  lwz CARG1, NODE:TMP2->key[m
[31m-    |   lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2)[m
[31m-    |    lwz CARG2, NODE:TMP2->val[m
[31m-    |     lwz NODE:TMP1, NODE:TMP2->next[m
[31m-    |  checkstr CARG1; bne >5[m
[31m-    |   cmpw TMP0, STR:RC; bne >5[m
[31m-    |    checknil CARG2; beq >4		// Key found, but nil value?[m
[31m-    |2:[m
[31m-    |  andix. TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |    stfd f14, NODE:TMP2->val[m
[31m-    |  bne >7[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  lwz TAB:TMP1, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP1, 0[m
[31m-    |  beq <2				// No metatable: done.[m
[31m-    |  lbz TMP0, TAB:TMP1->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_newindex[m
[31m-    |  bne <2				// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsets[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  cmplwi NODE:TMP1, 0[m
[31m-    |   mr NODE:TMP2, NODE:TMP1[m
[31m-    |  bne <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  lwz TAB:TMP1, TAB:RB->metatable[m
[31m-    |   la CARG3, DISPATCH_GL(tmptv)(DISPATCH)[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |   mr CARG1, L[m
[31m-    |  cmplwi TAB:TMP1, 0[m
[31m-    |   stp BASE, L->base[m
[31m-    |  beq >6				// No metatable: continue.[m
[31m-    |  lbz TMP0, TAB:TMP1->nomm[m
[31m-    |  andix. TMP0, TMP0, 1<<MM_newindex[m
[31m-    |  beq ->vmeta_tsets		// 'no __newindex' flag NOT set: check.[m
[31m-    |6:[m
[31m-    |  li TMP0, LJ_TSTR[m
[31m-    |   stw STR:RC, 4(CARG3)[m
[31m-    |   mr CARG2, TAB:RB[m
[31m-    |  stw TMP0, 0(CARG3)[m
[31m-    |  bl extern lj_tab_newkey		// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Returns TValue *.[m
[31m-    |  lp BASE, L->base[m
[31m-    |  stfd f14, 0(CRET1)[m
[31m-    |  b <3				// No 2nd write barrier needed.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0[m
[31m-    |  b <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  // RA = src*8, RB = table*8, RC = index*8[m
[31m-    |  lwzux CARG1, RB, BASE[m
[31m-    |   srwi TMP0, RC, 3[m
[31m-    |   lwz TAB:RB, 4(RB)[m
[31m-    |  checktab CARG1; bne ->vmeta_tsetb[m
[31m-    |  lwz TMP1, TAB:RB->asize[m
[31m-    |   lwz TMP2, TAB:RB->array[m
[31m-    |    lbz TMP3, TAB:RB->marked[m
[31m-    |  cmplw TMP0, TMP1[m
[31m-    |   lfdx f14, BASE, RA[m
[31m-    |  bge ->vmeta_tsetb[m
[31m-    |  lwzx TMP1, TMP2, RC[m
[31m-    |  checknil TMP1; beq >5[m
[31m-    |1:[m
[31m-    |  andix. TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |   stfdx f14, TMP2, RC[m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Check for __newindex if previous value is nil.[m
[31m-    |  lwz TAB:TMP1, TAB:RB->metatable[m
[31m-    |  cmplwi TAB:TMP1, 0[m
[31m-    |  beq <1				// No metatable: done.[m
[31m-    |  lbz TMP1, TAB:TMP1->nomm[m
[31m-    |  andix. TMP1, TMP1, 1<<MM_newindex[m
[31m-    |  bne <1				// 'no __newindex' flag set: done.[m
[31m-    |  b ->vmeta_tsetb			// Caveat: preserve TMP0![m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMP3, TMP0[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  // RA = dst*8, RB = table*8, RC = key*8[m
[31m-    |  add RB, BASE, RB[m
[31m-    |  lwz TAB:CARG2, 4(RB)[m
[31m-    |.if DUALNUM[m
[31m-    |  add RC, BASE, RC[m
[31m-    |    lbz TMP3, TAB:CARG2->marked[m
[31m-    |  lwz TMP0, TAB:CARG2->asize[m
[31m-    |  lwz CARG3, 4(RC)[m
[31m-    |   lwz TMP1, TAB:CARG2->array[m
[31m-    |.else[m
[31m-    |  lfdx f0, BASE, RC[m
[31m-    |    lbz TMP3, TAB:CARG2->marked[m
[31m-    |  lwz TMP0, TAB:CARG2->asize[m
[31m-    |  toint CARG3, f0[m
[31m-    |   lwz TMP1, TAB:CARG2->array[m
[31m-    |.endif[m
[31m-    |  andix. TMP2, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  bne >7[m
[31m-    |2:[m
[31m-    |  cmplw TMP0, CARG3[m
[31m-    |   slwi TMP2, CARG3, 3[m
[31m-    |   lfdx f14, BASE, RA[m
[31m-    |  ble ->vmeta_tsetr		// In array part?[m
[31m-    |  ins_next1[m
[31m-    |   stfdx f14, TMP1, TMP2[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP3, TMP2[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  // RA = base*8 (table at base-1), RD = num_const*8 (start index)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |1:[m
[31m-    |   add TMP3, KBASE, RD[m
[31m-    |  lwz TAB:CARG2, -4(RA)		// Guaranteed to be a table.[m
[31m-    |    addic. TMP0, MULTRES, -8[m
[31m-    |   lwz TMP3, 4(TMP3)		// Integer constant is in lo-word.[m
[31m-    |    srwi CARG3, TMP0, 3[m
[31m-    |    beq >4				// Nothing to copy?[m
[31m-    |  add CARG3, CARG3, TMP3[m
[31m-    |  lwz TMP2, TAB:CARG2->asize[m
[31m-    |   slwi TMP1, TMP3, 3[m
[31m-    |    lbz TMP3, TAB:CARG2->marked[m
[31m-    |  cmplw CARG3, TMP2[m
[31m-    |   add TMP2, RA, TMP0[m
[31m-    |   lwz TMP0, TAB:CARG2->array[m
[31m-    |  bgt >5[m
[31m-    |   add TMP1, TMP1, TMP0[m
[31m-    |    andix. TMP0, TMP3, LJ_GC_BLACK	// isblack(table)[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |   lfd f0, 0(RA)[m
[31m-    |  addi RA, RA, 8[m
[31m-    |  cmpw cr1, RA, TMP2[m
[31m-    |   stfd f0, 0(TMP1)[m
[31m-    |    addi TMP1, TMP1, 8[m
[31m-    |  blt cr1, <3[m
[31m-    |  bne >7[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |   stp BASE, L->base[m
[31m-    |  mr CARG1, L[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  mr SAVE0, RD[m
[31m-    |  bl extern lj_tab_reasize		// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  // Must not reallocate the stack.[m
[31m-    |  mr RD, SAVE0[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:CARG2, TMP3, TMP0[m
[31m-    |  b <4[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALLM:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8,) RC = extra_nargs*8[m
[31m-    |  add NARGS8:RC, NARGS8:RC, MULTRES[m
[31m-    |  // Fall through. Assumes BC_CALL follows.[m
[31m-    break;[m
[31m-  case BC_CALL:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8[m
[31m-    |  mr TMP2, BASE[m
[31m-    |  lwzux TMP0, BASE, RA[m
[31m-    |   lwz LFUNC:RB, 4(BASE)[m
[31m-    |    subi NARGS8:RC, NARGS8:RC, 8[m
[31m-    |   addi BASE, BASE, 8[m
[31m-    |  checkfunc TMP0; bne ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = extra_nargs*8[m
[31m-    |  add NARGS8:RC, NARGS8:RC, MULTRES[m
[31m-    |  // Fall through. Assumes BC_CALLT follows.[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  // RA = base*8, (RB = 0,) RC = (nargs+1)*8[m
[31m-    |  lwzux TMP0, RA, BASE[m
[31m-    |   lwz LFUNC:RB, 4(RA)[m
[31m-    |    subi NARGS8:RC, NARGS8:RC, 8[m
[31m-    |    lwz TMP1, FRAME_PC(BASE)[m
[31m-    |  checkfunc TMP0[m
[31m-    |   addi RA, RA, 8[m
[31m-    |  bne ->vmeta_callt[m
[31m-    |->BC_CALLT_Z:[m
[31m-    |  andix. TMP0, TMP1, FRAME_TYPE	// Caveat: preserve cr0 until the crand.[m
[31m-    |   lbz TMP3, LFUNC:RB->ffid[m
[31m-    |    xori TMP2, TMP1, FRAME_VARG[m
[31m-    |    cmplwi cr1, NARGS8:RC, 0[m
[31m-    |  bne >7[m
[31m-    |1:[m
[31m-    |  stw LFUNC:RB, FRAME_FUNC(BASE)	// Copy function down, but keep PC.[m
[31m-    |  li TMP2, 0[m
[31m-    |   cmplwi cr7, TMP3, 1		// (> FF_C) Calling a fast function?[m
[31m-    |    beq cr1, >3[m
[31m-    |2:[m
[31m-    |  addi TMP3, TMP2, 8[m
[31m-    |   lfdx f0, RA, TMP2[m
[31m-    |  cmplw cr1, TMP3, NARGS8:RC[m
[31m-    |   stfdx f0, BASE, TMP2[m
[31m-    |  mr TMP2, TMP3[m
[31m-    |  bne cr1, <2[m
[31m-    |3:[m
[31m-    |  crand 4*cr0+eq, 4*cr0+eq, 4*cr7+gt[m
[31m-    |  beq >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function with a Lua frame below.[m
[31m-    |  lwz INS, -4(TMP1)[m
[31m-    |  decode_RA8 RA, INS[m
[31m-    |  sub TMP1, BASE, RA[m
[31m-    |  lwz LFUNC:TMP1, FRAME_FUNC-8(TMP1)[m
[31m-    |  lwz TMP1, LFUNC:TMP1->pc[m
[31m-    |  lwz KBASE, PC2PROTO(k)(TMP1)	// Need to prepare KBASE.[m
[31m-    |  b <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  andix. TMP0, TMP2, FRAME_TYPEP[m
[31m-    |  bne <1				// Vararg frame below?[m
[31m-    |  sub BASE, BASE, TMP2		// Relocate BASE down.[m
[31m-    |  lwz TMP1, FRAME_PC(BASE)[m
[31m-    |  andix. TMP0, TMP1, FRAME_TYPE[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8))[m
[31m-    |  mr TMP2, BASE[m
[31m-    |  add BASE, BASE, RA[m
[31m-    |  lwz TMP1, -24(BASE)[m
[31m-    |   lwz LFUNC:RB, -20(BASE)[m
[31m-    |    lfd f1, -8(BASE)[m
[31m-    |    lfd f0, -16(BASE)[m
[31m-    |  stw TMP1, 0(BASE)		// Copy callable.[m
[31m-    |   stw LFUNC:RB, 4(BASE)[m
[31m-    |  checkfunc TMP1[m
[31m-    |    stfd f1, 16(BASE)		// Copy control var.[m
[31m-    |     li NARGS8:RC, 16		// Iterators get 2 arguments.[m
[31m-    |    stfdu f0, 8(BASE)		// Copy state.[m
[31m-    |  bne ->vmeta_call[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8)[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  lwz TAB:RB, -12(RA)[m
[31m-    |  lwz RC, -4(RA)			// Get index from control var.[m
[31m-    |  lwz TMP0, TAB:RB->asize[m
[31m-    |  lwz TMP1, TAB:RB->array[m
[31m-    |   addi PC, PC, 4[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  cmplw RC, TMP0[m
[31m-    |   slwi TMP3, RC, 3[m
[31m-    |  bge >5				// Index points after array part?[m
[31m-    |  lwzx TMP2, TMP1, TMP3[m
[31m-    |   lfdx f0, TMP1, TMP3[m
[31m-    |  checknil TMP2[m
[31m-    |     lwz INS, -4(PC)[m
[31m-    |  beq >4[m
[31m-    |.if DUALNUM[m
[31m-    |   stw RC, 4(RA)[m
[31m-    |   stw TISNUM, 0(RA)[m
[31m-    |.else[m
[31m-    |   tonum_u f1, RC[m
[31m-    |.endif[m
[31m-    |    addi RC, RC, 1[m
[31m-    |     addis TMP3, PC, -(BCBIAS_J*4 >> 16)[m
[31m-    |  stfd f0, 8(RA)[m
[31m-    |     decode_RD4 TMP1, INS[m
[31m-    |    stw RC, -4(RA)			// Update control var.[m
[31m-    |     add PC, TMP1, TMP3[m
[31m-    |.if not DUALNUM[m
[31m-    |   stfd f1, 0(RA)[m
[31m-    |.endif[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Skip holes in array part.[m
[31m-    |  addi RC, RC, 1[m
[31m-    |  b <1[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  lwz TMP1, TAB:RB->hmask[m
[31m-    |  sub RC, RC, TMP0[m
[31m-    |   lwz TMP2, TAB:RB->node[m
[31m-    |6:[m
[31m-    |  cmplw RC, TMP1			// End of iteration? Branch to ITERL+1.[m
[31m-    |   slwi TMP3, RC, 5[m
[31m-    |  bgty <3[m
[31m-    |   slwi RB, RC, 3[m
[31m-    |   sub TMP3, TMP3, RB[m
[31m-    |  lwzx RB, TMP2, TMP3[m
[31m-    |  lfdx f0, TMP2, TMP3[m
[31m-    |   add NODE:TMP3, TMP2, TMP3[m
[31m-    |  checknil RB[m
[31m-    |     lwz INS, -4(PC)[m
[31m-    |  beq >7[m
[31m-    |   lfd f1, NODE:TMP3->key[m
[31m-    |     addis TMP2, PC, -(BCBIAS_J*4 >> 16)[m
[31m-    |  stfd f0, 8(RA)[m
[31m-    |    add RC, RC, TMP0[m
[31m-    |     decode_RD4 TMP1, INS[m
[31m-    |   stfd f1, 0(RA)[m
[31m-    |    addi RC, RC, 1[m
[31m-    |     add PC, TMP1, TMP2[m
[31m-    |    stw RC, -4(RA)			// Update control var.[m
[31m-    |  b <3[m
[31m-    |[m
[31m-    |7:  // Skip holes in hash part.[m
[31m-    |  addi RC, RC, 1[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  // RA = base*8, RD = target (points to ITERN)[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  lwz TMP0, -24(RA)[m
[31m-    |  lwz CFUNC:TMP1, -20(RA)[m
[31m-    |   lwz TMP2, -16(RA)[m
[31m-    |    lwz TMP3, -8(RA)[m
[31m-    |   cmpwi cr0, TMP2, LJ_TTAB[m
[31m-    |  cmpwi cr1, TMP0, LJ_TFUNC[m
[31m-    |    cmpwi cr6, TMP3, LJ_TNIL[m
[31m-    |  bne cr1, >5[m
[31m-    |  lbz TMP1, CFUNC:TMP1->ffid[m
[31m-    |   crand 4*cr0+eq, 4*cr0+eq, 4*cr6+eq[m
[31m-    |  cmpwi cr7, TMP1, FF_next_N[m
[31m-    |    srwi TMP0, RD, 1[m
[31m-    |  crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq[m
[31m-    |    add TMP3, PC, TMP0[m
[31m-    |  bne cr0, >5[m
[31m-    |  lus TMP1, 0xfffe[m
[31m-    |  ori TMP1, TMP1, 0x7fff[m
[31m-    |  stw ZERO, -4(RA)			// Initialize control var.[m
[31m-    |  stw TMP1, -8(RA)[m
[31m-    |    addis PC, TMP3, -(BCBIAS_J*4 >> 16)[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  li TMP0, BC_JMP[m
[31m-    |   li TMP1, BC_ITERC[m
[31m-    |  stb TMP0, -1(PC)[m
[31m-    |    addis PC, TMP3, -(BCBIAS_J*4 >> 16)[m
[31m-    |   stb TMP1, 3(PC)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  // RA = base*8, RB = (nresults+1)*8, RC = numparams*8[m
[31m-    |  lwz TMP0, FRAME_PC(BASE)[m
[31m-    |  add RC, BASE, RC[m
[31m-    |   add RA, BASE, RA[m
[31m-    |  addi RC, RC, FRAME_VARG[m
[31m-    |   add TMP2, RA, RB[m
[31m-    |  subi TMP3, BASE, 8		// TMP3 = vtop[m
[31m-    |  sub RC, RC, TMP0			// RC = vbase[m
[31m-    |  // Note: RC may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  cmplwi cr1, RB, 0[m
[31m-    |.if PPE[m
[31m-    |   sub TMP1, TMP3, RC[m
[31m-    |   cmpwi TMP1, 0[m
[31m-    |.else[m
[31m-    |   sub. TMP1, TMP3, RC[m
[31m-    |.endif[m
[31m-    |  beq cr1, >5			// Copy all varargs?[m
[31m-    |   subi TMP2, TMP2, 16[m
[31m-    |   ble >2				// No vararg slots?[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  lfd f0, 0(RC)[m
[31m-    |   addi RC, RC, 8[m
[31m-    |  stfd f0, 0(RA)[m
[31m-    |  cmplw RA, TMP2[m
[31m-    |   cmplw cr1, RC, TMP3[m
[31m-    |  bge >3				// All destination slots filled?[m
[31m-    |    addi RA, RA, 8[m
[31m-    |   blt cr1, <1			// More vararg slots?[m
[31m-    |2:  // Fill up remainder with nil.[m
[31m-    |  stw TISNIL, 0(RA)[m
[31m-    |  cmplw RA, TMP2[m
[31m-    |   addi RA, RA, 8[m
[31m-    |  blt <2[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  lwz TMP0, L->maxstack[m
[31m-    |   li MULTRES, 8			// MULTRES = (0+1)*8[m
[31m-    |  bley <3				// No vararg slots?[m
[31m-    |  add TMP2, RA, TMP1[m
[31m-    |  cmplw TMP2, TMP0[m
[31m-    |   addi MULTRES, TMP1, 8[m
[31m-    |  bgt >7[m
[31m-    |6:[m
[31m-    |  lfd f0, 0(RC)[m
[31m-    |   addi RC, RC, 8[m
[31m-    |  stfd f0, 0(RA)[m
[31m-    |  cmplw RC, TMP3[m
[31m-    |   addi RA, RA, 8[m
[31m-    |  blt <6				// More vararg slots?[m
[31m-    |  b <3[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  mr CARG1, L[m
[31m-    |   stp RA, L->top[m
[31m-    |  sub SAVE0, RC, BASE		// Need delta, because BASE may change.[m
[31m-    |   stp BASE, L->base[m
[31m-    |  sub RA, RA, BASE[m
[31m-    |   stw PC, SAVE_PC[m
[31m-    |  srwi CARG2, TMP1, 3[m
[31m-    |  bl extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |  lp BASE, L->base[m
[31m-    |  add RA, BASE, RA[m
[31m-    |  add RC, BASE, SAVE0[m
[31m-    |  subi TMP3, BASE, 8[m
[31m-    |  b <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  // RA = results*8, RD = extra_nresults*8[m
[31m-    |  add RD, RD, MULTRES		// MULTRES >= 8, so RD >= 8.[m
[31m-    |  // Fall through. Assumes BC_RET follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET:[m
[31m-    |  // RA = results*8, RD = (nresults+1)*8[m
[31m-    |  lwz PC, FRAME_PC(BASE)[m
[31m-    |   add RA, BASE, RA[m
[31m-    |    mr MULTRES, RD[m
[31m-    |1:[m
[31m-    |  andix. TMP0, PC, FRAME_TYPE[m
[31m-    |   xori TMP1, PC, FRAME_VARG[m
[31m-    |  bne ->BC_RETV_Z[m
[31m-    |[m
[31m-    |->BC_RET_Z:[m
[31m-    |  // BASE = base, RA = resultptr, RD = (nresults+1)*8, PC = return[m
[31m-    |   lwz INS, -4(PC)[m
[31m-    |  cmpwi RD, 8[m
[31m-    |   subi TMP2, BASE, 8[m
[31m-    |   subi RC, RD, 8[m
[31m-    |   decode_RB8 RB, INS[m
[31m-    |  beq >3[m
[31m-    |   li TMP1, 0[m
[31m-    |2:[m
[31m-    |  addi TMP3, TMP1, 8[m
[31m-    |   lfdx f0, RA, TMP1[m
[31m-    |  cmpw TMP3, RC[m
[31m-    |   stfdx f0, TMP2, TMP1[m
[31m-    |  beq >3[m
[31m-    |  addi TMP1, TMP3, 8[m
[31m-    |   lfdx f1, RA, TMP3[m
[31m-    |  cmpw TMP1, RC[m
[31m-    |   stfdx f1, TMP2, TMP3[m
[31m-    |  bne <2[m
[31m-    |3:[m
[31m-    |5:[m
[31m-    |  cmplw RB, RD[m
[31m-    |   decode_RA8 RA, INS[m
[31m-    |  bgt >6[m
[31m-    |   sub BASE, TMP2, RA[m
[31m-    |  lwz LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, LFUNC:TMP1->pc[m
[31m-    |  lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  subi TMP1, RD, 8[m
[31m-    |   addi RD, RD, 8[m
[31m-    |  stwx TISNIL, TMP2, TMP1[m
[31m-    |  b <5[m
[31m-    |[m
[31m-    |->BC_RETV_Z:  // Non-standard return case.[m
[31m-    |  andix. TMP2, TMP1, FRAME_TYPEP[m
[31m-    |  bne ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down.[m
[31m-    |  sub BASE, BASE, TMP1[m
[31m-    |  lwz PC, FRAME_PC(BASE)[m
[31m-    |  b <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET0: case BC_RET1:[m
[31m-    |  // RA = results*8, RD = (nresults+1)*8[m
[31m-    |  lwz PC, FRAME_PC(BASE)[m
[31m-    |   add RA, BASE, RA[m
[31m-    |    mr MULTRES, RD[m
[31m-    |  andix. TMP0, PC, FRAME_TYPE[m
[31m-    |   xori TMP1, PC, FRAME_VARG[m
[31m-    |  bney ->BC_RETV_Z[m
[31m-    |[m
[31m-    |  lwz INS, -4(PC)[m
[31m-    |   subi TMP2, BASE, 8[m
[31m-    |  decode_RB8 RB, INS[m
[31m-    if (op == BC_RET1) {[m
[31m-      |  lfd f0, 0(RA)[m
[31m-      |  stfd f0, 0(TMP2)[m
[31m-    }[m
[31m-    |5:[m
[31m-    |  cmplw RB, RD[m
[31m-    |   decode_RA8 RA, INS[m
[31m-    |  bgt >6[m
[31m-    |   sub BASE, TMP2, RA[m
[31m-    |  lwz LFUNC:TMP1, FRAME_FUNC(BASE)[m
[31m-    |  ins_next1[m
[31m-    |  lwz TMP1, LFUNC:TMP1->pc[m
[31m-    |  lwz KBASE, PC2PROTO(k)(TMP1)[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    |  subi TMP1, RD, 8[m
[31m-    |   addi RD, RD, 8[m
[31m-    |  stwx TISNIL, TMP2, TMP1[m
[31m-    |  b <5[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IFORL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    |  // RA = base*8, RD = target (after end of loop or start of loop)[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |.if DUALNUM[m
[31m-    |  // Integer loop.[m
[31m-    |  lwzux TMP1, RA, BASE[m
[31m-    |   lwz CARG1, FORL_IDX*8+4(RA)[m
[31m-    |  cmplw cr0, TMP1, TISNUM[m
[31m-    if (vk) {[m
[31m-      |   lwz CARG3, FORL_STEP*8+4(RA)[m
[31m-      |  bne >9[m
[31m-      |.if GPR64[m
[31m-      |  // Need to check overflow for (a<<32) + (b<<32).[m
[31m-      |  rldicr TMP0, CARG1, 32, 31[m
[31m-      |  rldicr TMP2, CARG3, 32, 31[m
[31m-      |  add CARG1, CARG1, CARG3[m
[31m-      |  addo. TMP0, TMP0, TMP2[m
[31m-      |.else[m
[31m-      |  addo. CARG1, CARG1, CARG3[m
[31m-      |.endif[m
[31m-      |    cmpwi cr6, CARG3, 0[m
[31m-      |   lwz CARG2, FORL_STOP*8+4(RA)[m
[31m-      |  bso >6[m
[31m-      |4:[m
[31m-      |  stw CARG1, FORL_IDX*8+4(RA)[m
[31m-    } else {[m
[31m-      |  lwz TMP3, FORL_STEP*8(RA)[m
[31m-      |   lwz CARG3, FORL_STEP*8+4(RA)[m
[31m-      |  lwz TMP2, FORL_STOP*8(RA)[m
[31m-      |   lwz CARG2, FORL_STOP*8+4(RA)[m
[31m-      |  cmplw cr7, TMP3, TISNUM[m
[31m-      |  cmplw cr1, TMP2, TISNUM[m
[31m-      |  crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq[m
[31m-      |  crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq[m
[31m-      |    cmpwi cr6, CARG3, 0[m
[31m-      |  bne >9[m
[31m-    }[m
[31m-    |    blt cr6, >5[m
[31m-    |  cmpw CARG1, CARG2[m
[31m-    |1:[m
[31m-    |   stw TISNUM, FORL_EXT*8(RA)[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  srwi RD, RD, 1[m
[31m-    }[m
[31m-    |   stw CARG1, FORL_EXT*8+4(RA)[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  add RD, PC, RD[m
[31m-    }[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  bgt >3  // See FP loop below.[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-      |  bley >7[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  bgt >2[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-    } else {[m
[31m-      |  bley =>BC_JLOOP[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |5:  // Invert check for negative step.[m
[31m-    |  cmpw CARG2, CARG1[m
[31m-    |  b <1[m
[31m-    if (vk) {[m
[31m-      |6:  // Potential overflow.[m
[31m-      |  checkov TMP0, <4		// Ignore unrelated overflow.[m
[31m-      |  b <2[m
[31m-    }[m
[31m-    |.endif[m
[31m-    if (vk) {[m
[31m-      |.if DUALNUM[m
[31m-      |9:  // FP loop.[m
[31m-      |  lfd f1, FORL_IDX*8(RA)[m
[31m-      |.else[m
[31m-      |  lfdux f1, RA, BASE[m
[31m-      |.endif[m
[31m-      |  lfd f3, FORL_STEP*8(RA)[m
[31m-      |  lfd f2, FORL_STOP*8(RA)[m
[31m-      |   lwz TMP3, FORL_STEP*8(RA)[m
[31m-      |  fadd f1, f1, f3[m
[31m-      |  stfd f1, FORL_IDX*8(RA)[m
[31m-    } else {[m
[31m-      |.if DUALNUM[m
[31m-      |9:  // FP loop.[m
[31m-      |.else[m
[31m-      |  lwzux TMP1, RA, BASE[m
[31m-      |  lwz TMP3, FORL_STEP*8(RA)[m
[31m-      |  lwz TMP2, FORL_STOP*8(RA)[m
[31m-      |  cmplw cr0, TMP1, TISNUM[m
[31m-      |  cmplw cr7, TMP3, TISNUM[m
[31m-      |  cmplw cr1, TMP2, TISNUM[m
[31m-      |.endif[m
[31m-      |   lfd f1, FORL_IDX*8(RA)[m
[31m-      |  crand 4*cr0+lt, 4*cr0+lt, 4*cr7+lt[m
[31m-      |  crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt[m
[31m-      |   lfd f2, FORL_STOP*8(RA)[m
[31m-      |  bge ->vmeta_for[m
[31m-    }[m
[31m-    |  cmpwi cr6, TMP3, 0[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  srwi RD, RD, 1[m
[31m-    }[m
[31m-    |   stfd f1, FORL_EXT*8(RA)[m
[31m-    if (op != BC_JFORL) {[m
[31m-      |  add RD, PC, RD[m
[31m-    }[m
[31m-    |  fcmpu cr0, f1, f2[m
[31m-    if (op == BC_JFORI) {[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-    }[m
[31m-    |  blt cr6, >5[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  bgt >3[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |.if DUALNUM[m
[31m-      |  bgty <2[m
[31m-      |.else[m
[31m-      |  bgt >2[m
[31m-      |.endif[m
[31m-      |1:[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  bley >7[m
[31m-    } else {[m
[31m-      |  bley =>BC_JLOOP[m
[31m-    }[m
[31m-    |.if DUALNUM[m
[31m-    |  b <2[m
[31m-    |.else[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    |5:  // Negative step.[m
[31m-    if (op == BC_FORI) {[m
[31m-      |  bge <2[m
[31m-      |3:  // Used by integer loop, too.[m
[31m-      |  addis PC, RD, -(BCBIAS_J*4 >> 16)[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |  bgey <1[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  bgey >7[m
[31m-    } else {[m
[31m-      |  bgey =>BC_JLOOP[m
[31m-    }[m
[31m-    |  b <2[m
[31m-    if (op == BC_JFORI) {[m
[31m-      |7:[m
[31m-      |  lwz INS, -4(PC)[m
[31m-      |  decode_RD8 RD, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_IITERL follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  // RA = base*8, RD = target[m
[31m-    |  lwzux TMP1, RA, BASE[m
[31m-    |   lwz TMP2, 4(RA)[m
[31m-    |  checknil TMP1; beq >1		// Stop if iterator returned nil.[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  stw TMP1, -8(RA)[m
[31m-      |   stw TMP2, -4(RA)[m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  branch_RD			// Otherwise save control var + branch.[m
[31m-      |  stw TMP1, -8(RA)[m
[31m-      |   stw TMP2, -4(RA)[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  // RA = base*8, RD = target (loop extent)[m
[31m-    |  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop[m
[31m-    |.endif[m
[31m-    |  // Fall through. Assumes BC_ILOOP follows.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  // RA = base*8, RD = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  // RA = base*8 (ignored), RD = traceno*8[m
[31m-    |  lwz TMP1, DISPATCH_J(trace)(DISPATCH)[m
[31m-    |  srwi RD, RD, 1[m
[31m-    |  // Traces on PPC don't store the trace number, so use 0.[m
[31m-    |   stw ZERO, DISPATCH_GL(vmstate)(DISPATCH)[m
[31m-    |  lwzx TRACE:TMP2, TMP1, RD[m
[31m-    |  clrso TMP1[m
[31m-    |  lp TMP2, TRACE:TMP2->mcode[m
[31m-    |   stw BASE, DISPATCH_GL(jit_base)(DISPATCH)[m
[31m-    |  mtctr TMP2[m
[31m-    |   addi JGL, DISPATCH, GG_DISP2G+32768[m
[31m-    |   stw L, DISPATCH_GL(tmpbuf.L)(DISPATCH)[m
[31m-    |  bctr[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  // RA = base*8 (only used by trace recorder), RD = target[m
[31m-    |  branch_RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    |  // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8[m
[31m-    |  lwz TMP2, L->maxstack[m
[31m-    |   lbz TMP1, -4+PC2PROTO(numparams)(PC)[m
[31m-    |    lwz KBASE, -4+PC2PROTO(k)(PC)[m
[31m-    |  cmplw RA, TMP2[m
[31m-    |   slwi TMP1, TMP1, 3[m
[31m-    |  bgt ->vm_growstack_l[m
[31m-    if (op != BC_JFUNCF) {[m
[31m-      |  ins_next1[m
[31m-    }[m
[31m-    |2:[m
[31m-    |  cmplw NARGS8:RC, TMP1		// Check for missing parameters.[m
[31m-    |  blt >3[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  decode_RD8 RD, INS[m
[31m-      |  b =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next2[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  stwx TISNIL, BASE, NARGS8:RC[m
[31m-    |  addi NARGS8:RC, NARGS8:RC, 8[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    |  NYI  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8[m
[31m-    |  lwz TMP2, L->maxstack[m
[31m-    |   add TMP1, BASE, RC[m
[31m-    |  add TMP0, RA, RC[m
[31m-    |   stw LFUNC:RB, 4(TMP1)		// Store copy of LFUNC.[m
[31m-    |   addi TMP3, RC, 8+FRAME_VARG[m
[31m-    |    lwz KBASE, -4+PC2PROTO(k)(PC)[m
[31m-    |  cmplw TMP0, TMP2[m
[31m-    |   stw TMP3, 0(TMP1)		// Store delta + FRAME_VARG.[m
[31m-    |  bge ->vm_growstack_l[m
[31m-    |  lbz TMP2, -4+PC2PROTO(numparams)(PC)[m
[31m-    |   mr RA, BASE[m
[31m-    |   mr RC, TMP1[m
[31m-    |  ins_next1[m
[31m-    |  cmpwi TMP2, 0[m
[31m-    |   addi BASE, TMP1, 8[m
[31m-    |  beq >3[m
[31m-    |1:[m
[31m-    |  cmplw RA, RC			// Less args than parameters?[m
[31m-    |   lwz TMP0, 0(RA)[m
[31m-    |   lwz TMP3, 4(RA)[m
[31m-    |  bge >4[m
[31m-    |    stw TISNIL, 0(RA)		// Clear old fixarg slot (help the GC).[m
[31m-    |    addi RA, RA, 8[m
[31m-    |2:[m
[31m-    |  addic. TMP2, TMP2, -1[m
[31m-    |   stw TMP0, 8(TMP1)[m
[31m-    |   stw TMP3, 12(TMP1)[m
[31m-    |    addi TMP1, TMP1, 8[m
[31m-    |  bne <1[m
[31m-    |3:[m
[31m-    |  ins_next2[m
[31m-    |[m
[31m-    |4:  // Clear missing parameters.[m
[31m-    |  li TMP0, LJ_TNIL[m
[31m-    |  b <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  lp RD, CFUNC:RB->f[m
[31m-    } else {[m
[31m-      |  lp RD, DISPATCH_GL(wrapf)(DISPATCH)[m
[31m-    }[m
[31m-    |   add TMP1, RA, NARGS8:RC[m
[31m-    |   lwz TMP2, L->maxstack[m
[31m-    |  .toc lp TMP3, 0(RD)[m
[31m-    |    add RC, BASE, NARGS8:RC[m
[31m-    |   stp BASE, L->base[m
[31m-    |   cmplw TMP1, TMP2[m
[31m-    |    stp RC, L->top[m
[31m-    |     li_vmstate C[m
[31m-    |.if TOC[m
[31m-    |  mtctr TMP3[m
[31m-    |.else[m
[31m-    |  mtctr RD[m
[31m-    |.endif[m
[31m-    if (op == BC_FUNCCW) {[m
[31m-      |  lp CARG2, CFUNC:RB->f[m
[31m-    }[m
[31m-    |  mr CARG1, L[m
[31m-    |   bgt ->vm_growstack_c		// Need to grow stack.[m
[31m-    |  .toc lp TOCREG, TOC_OFS(RD)[m
[31m-    |  .tocenv lp ENVREG, ENV_OFS(RD)[m
[31m-    |     st_vmstate[m
[31m-    |  bctrl				// (lua_State *L [, lua_CFunction f])[m
[31m-    |  // Returns nresults.[m
[31m-    |  lp BASE, L->base[m
[31m-    |  .toc ld TOCREG, SAVE_TOC[m
[31m-    |   slwi RD, CRET1, 3[m
[31m-    |  lp TMP1, L->top[m
[31m-    |    li_vmstate INTERP[m
[31m-    |  lwz PC, FRAME_PC(BASE)		// Fetch PC of caller.[m
[31m-    |    stw L, DISPATCH_GL(cur_L)(DISPATCH)[m
[31m-    |   sub RA, TMP1, RD		// RA = L->top - nresults*8[m
[31m-    |    st_vmstate[m
[31m-    |  b ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-[m
[31m-  build_subroutines(ctx);[m
[31m-[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  int i;[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 65\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.long .Lbegin\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"[m
[31m-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"[m
[31m-	"\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 14; i <= 31; i++)[m
[31m-      fprintf(ctx->fp,[m
[31m-	"\t.byte %d\n\t.uleb128 %d\n"[m
[31m-	"\t.byte %d\n\t.uleb128 %d\n",[m
[31m-	0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE0:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-#if LJ_TARGET_PS3[m
[31m-	"\t.long .lj_vm_ffi_call\n"[m
[31m-#else[m
[31m-	"\t.long lj_vm_ffi_call\n"[m
[31m-#endif[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"[m
[31m-	"\t.byte 0x8e\n\t.uleb128 2\n"[m
[31m-	"\t.byte 0xd\n\t.uleb128 0xe\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#if !LJ_NO_UNWIND[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.long .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 65\n"[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.long lj_err_unwind_dwarf-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.long .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.long .LASFDE2-.Lframe1\n"[m
[31m-	"\t.long .Lbegin-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"[m
[31m-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"[m
[31m-	"\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",[m
[31m-	fcofs, CFRAME_SIZE);[m
[31m-    for (i = 14; i <= 31; i++)[m
[31m-      fprintf(ctx->fp,[m
[31m-	"\t.byte %d\n\t.uleb128 %d\n"[m
[31m-	"\t.byte %d\n\t.uleb128 %d\n",[m
[31m-	0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));[m
[31m-    fprintf(ctx->fp,[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE2:\n\n");[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.long .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -4\n"[m
[31m-	"\t.byte 65\n"[m
[31m-	"\t.uleb128 1\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.long .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.long .LASFDE3-.Lframe2\n"[m
[31m-	"\t.long lj_vm_ffi_call-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"[m
[31m-	"\t.byte 0x8e\n\t.uleb128 2\n"[m
[31m-	"\t.byte 0xd\n\t.uleb128 0xe\n"[m
[31m-	"\t.align 2\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#endif[m
[31m-    break;[m
[31m-  default:[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_x64.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_x64.dasc[m
[1mdeleted file mode 100644[m
[1mindex 759e30e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_x64.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,4910 +0,0 @@[m
[31m-|// Low-level VM code for x64 CPUs in LJ_GC64 mode.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.arch x64[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|.if WIN[m
[31m-|.define X64WIN, 1			// Windows/x64 calling conventions.[m
[31m-|.endif[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|// This is very fragile and has many dependencies. Caveat emptor.[m
[31m-|.define BASE,		rdx		// Not C callee-save, refetched anyway.[m
[31m-|.if X64WIN[m
[31m-|.define KBASE,		rdi		// Must be C callee-save.[m
[31m-|.define PC,		rsi		// Must be C callee-save.[m
[31m-|.define DISPATCH,	rbx		// Must be C callee-save.[m
[31m-|.define KBASEd,	edi[m
[31m-|.define PCd,		esi[m
[31m-|.define DISPATCHd,	ebx[m
[31m-|.else[m
[31m-|.define KBASE,		r15		// Must be C callee-save.[m
[31m-|.define PC,		rbx		// Must be C callee-save.[m
[31m-|.define DISPATCH,	r14		// Must be C callee-save.[m
[31m-|.define KBASEd,	r15d[m
[31m-|.define PCd,		ebx[m
[31m-|.define DISPATCHd,	r14d[m
[31m-|.endif[m
[31m-|[m
[31m-|.define RA,		rcx[m
[31m-|.define RAd,		ecx[m
[31m-|.define RAH,		ch[m
[31m-|.define RAL,		cl[m
[31m-|.define RB,		rbp		// Must be rbp (C callee-save).[m
[31m-|.define RBd,		ebp[m
[31m-|.define RC,		rax		// Must be rax.[m
[31m-|.define RCd,		eax[m
[31m-|.define RCW,		ax[m
[31m-|.define RCH,		ah[m
[31m-|.define RCL,		al[m
[31m-|.define OP,		RBd[m
[31m-|.define RD,		RC[m
[31m-|.define RDd,		RCd[m
[31m-|.define RDW,		RCW[m
[31m-|.define RDL,		RCL[m
[31m-|.define TMPR,		r10[m
[31m-|.define TMPRd,		r10d[m
[31m-|.define ITYPE,		r11[m
[31m-|.define ITYPEd,	r11d[m
[31m-|[m
[31m-|.if X64WIN[m
[31m-|.define CARG1,		rcx		// x64/WIN64 C call arguments.[m
[31m-|.define CARG2,		rdx[m
[31m-|.define CARG3,		r8[m
[31m-|.define CARG4,		r9[m
[31m-|.define CARG1d,	ecx[m
[31m-|.define CARG2d,	edx[m
[31m-|.define CARG3d,	r8d[m
[31m-|.define CARG4d,	r9d[m
[31m-|.else[m
[31m-|.define CARG1,		rdi		// x64/POSIX C call arguments.[m
[31m-|.define CARG2,		rsi[m
[31m-|.define CARG3,		rdx[m
[31m-|.define CARG4,		rcx[m
[31m-|.define CARG5,		r8[m
[31m-|.define CARG6,		r9[m
[31m-|.define CARG1d,	edi[m
[31m-|.define CARG2d,	esi[m
[31m-|.define CARG3d,	edx[m
[31m-|.define CARG4d,	ecx[m
[31m-|.define CARG5d,	r8d[m
[31m-|.define CARG6d,	r9d[m
[31m-|.endif[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.if X64WIN		// x64/Windows stack layout[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push rdi; push rsi; push rbx[m
[31m-|  sub rsp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push rbp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add rsp, CFRAME_SPACE[m
[31m-|  pop rbx; pop rsi; pop rdi; pop rbp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.define SAVE_CFRAME,	aword [rsp+aword*13][m
[31m-|.define SAVE_PC,	aword [rsp+aword*12][m
[31m-|.define SAVE_L,	aword [rsp+aword*11][m
[31m-|.define SAVE_ERRF,	dword [rsp+dword*21][m
[31m-|.define SAVE_NRES,	dword [rsp+dword*20][m
[31m-|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter[m
[31m-|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*8][m
[31m-|.define SAVE_R3,	aword [rsp+aword*7][m
[31m-|.define SAVE_R2,	aword [rsp+aword*6][m
[31m-|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.define ARG5,		aword [rsp+aword*4][m
[31m-|.define CSAVE_4,	aword [rsp+aword*3][m
[31m-|.define CSAVE_3,	aword [rsp+aword*2][m
[31m-|.define CSAVE_2,	aword [rsp+aword*1][m
[31m-|.define CSAVE_1,	aword [rsp]		//<-- rsp while in interpreter.[m
[31m-|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee[m
[31m-|[m
[31m-|.define ARG5d,		dword [rsp+dword*8][m
[31m-|.define TMP1,		ARG5			// TMP1 overlaps ARG5[m
[31m-|.define TMP1d,		ARG5d[m
[31m-|.define TMP1hi,	dword [rsp+dword*9][m
[31m-|.define MULTRES,	TMP1d			// MULTRES overlaps TMP1d.[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.else			// x64/POSIX stack layout[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push rbx; push r15; push r14[m
[31m-|.if NO_UNWIND[m
[31m-|  push r13; push r12[m
[31m-|.endif[m
[31m-|  sub rsp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push rbp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add rsp, CFRAME_SPACE[m
[31m-|.if NO_UNWIND[m
[31m-|  pop r12; pop r13[m
[31m-|.endif[m
[31m-|  pop r14; pop r15; pop rbx; pop rbp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//----- 16 byte aligned,[m
[31m-|.if NO_UNWIND[m
[31m-|.define SAVE_RET,	aword [rsp+aword*11]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*10][m
[31m-|.define SAVE_R3,	aword [rsp+aword*9][m
[31m-|.define SAVE_R2,	aword [rsp+aword*8][m
[31m-|.define SAVE_R1,	aword [rsp+aword*7][m
[31m-|.define SAVE_RU2,	aword [rsp+aword*6][m
[31m-|.define SAVE_RU1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.else[m
[31m-|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*8][m
[31m-|.define SAVE_R3,	aword [rsp+aword*7][m
[31m-|.define SAVE_R2,	aword [rsp+aword*6][m
[31m-|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.endif[m
[31m-|.define SAVE_CFRAME,	aword [rsp+aword*4][m
[31m-|.define SAVE_PC,	aword [rsp+aword*3][m
[31m-|.define SAVE_L,	aword [rsp+aword*2][m
[31m-|.define SAVE_ERRF,	dword [rsp+dword*3][m
[31m-|.define SAVE_NRES,	dword [rsp+dword*2][m
[31m-|.define TMP1,		aword [rsp]		//<-- rsp while in interpreter.[m
[31m-|//----- 16 byte aligned[m
[31m-|[m
[31m-|.define TMP1d,		dword [rsp][m
[31m-|.define TMP1hi,	dword [rsp+dword*1][m
[31m-|.define MULTRES,	TMP1d			// MULTRES overlaps TMP1d.[m
[31m-|[m
[31m-|.endif[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Instruction headers.[m
[31m-|.macro ins_A; .endmacro[m
[31m-|.macro ins_AD; .endmacro[m
[31m-|.macro ins_AJ; .endmacro[m
[31m-|.macro ins_ABC; movzx RBd, RCH; movzx RCd, RCL; .endmacro[m
[31m-|.macro ins_AB_; movzx RBd, RCH; .endmacro[m
[31m-|.macro ins_A_C; movzx RCd, RCL; .endmacro[m
[31m-|.macro ins_AND; not RD; .endmacro[m
[31m-|[m
[31m-|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster).[m
[31m-|.macro ins_NEXT[m
[31m-|  mov RCd, [PC][m
[31m-|  movzx RAd, RCH[m
[31m-|  movzx OP, RCL[m
[31m-|  add PC, 4[m
[31m-|  shr RCd, 16[m
[31m-|  jmp aword [DISPATCH+OP*8][m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  // Around 10%-30% slower on Core2, a lot more slower on P4.[m
[31m-|  .macro ins_next[m
[31m-|    jmp ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, RB = LFUNC, RD = nargs+1, [BASE-8] = PC[m
[31m-|  mov PC, LFUNC:RB->pc[m
[31m-|  mov RAd, [PC][m
[31m-|  movzx OP, RAL[m
[31m-|  movzx RAd, RAH[m
[31m-|  add PC, 4[m
[31m-|  jmp aword [DISPATCH+OP*8][m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[31m-|  mov [BASE-8], PC[m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to clear or set tags.[m
[31m-|.macro cleartp, reg; shl reg, 17; shr reg, 17; .endmacro[m
[31m-|.macro settp, reg, tp[m
[31m-|  mov64 ITYPE, ((uint64_t)tp<<47)[m
[31m-|  or reg, ITYPE[m
[31m-|.endmacro[m
[31m-|.macro settp, dst, reg, tp[m
[31m-|  mov64 dst, ((uint64_t)tp<<47)[m
[31m-|  or dst, reg[m
[31m-|.endmacro[m
[31m-|.macro setint, reg[m
[31m-|  settp reg, LJ_TISNUM[m
[31m-|.endmacro[m
[31m-|.macro setint, dst, reg[m
[31m-|  settp dst, reg, LJ_TISNUM[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Macros to test operand types.[m
[31m-|.macro checktp_nc, reg, tp, target[m
[31m-|  mov ITYPE, reg[m
[31m-|  sar ITYPE, 47[m
[31m-|  cmp ITYPEd, tp[m
[31m-|  jne target[m
[31m-|.endmacro[m
[31m-|.macro checktp, reg, tp, target[m
[31m-|  mov ITYPE, reg[m
[31m-|  cleartp reg[m
[31m-|  sar ITYPE, 47[m
[31m-|  cmp ITYPEd, tp[m
[31m-|  jne target[m
[31m-|.endmacro[m
[31m-|.macro checktptp, src, tp, target[m
[31m-|  mov ITYPE, src[m
[31m-|  sar ITYPE, 47[m
[31m-|  cmp ITYPEd, tp[m
[31m-|  jne target[m
[31m-|.endmacro[m
[31m-|.macro checkstr, reg, target; checktp reg, LJ_TSTR, target; .endmacro[m
[31m-|.macro checktab, reg, target; checktp reg, LJ_TTAB, target; .endmacro[m
[31m-|.macro checkfunc, reg, target; checktp reg, LJ_TFUNC, target; .endmacro[m
[31m-|[m
[31m-|.macro checknumx, reg, target, jump[m
[31m-|  mov ITYPE, reg[m
[31m-|  sar ITYPE, 47[m
[31m-|  cmp ITYPEd, LJ_TISNUM[m
[31m-|  jump target[m
[31m-|.endmacro[m
[31m-|.macro checkint, reg, target; checknumx reg, target, jne; .endmacro[m
[31m-|.macro checkinttp, src, target; checknumx src, target, jne; .endmacro[m
[31m-|.macro checknum, reg, target; checknumx reg, target, jae; .endmacro[m
[31m-|.macro checknumtp, src, target; checknumx src, target, jae; .endmacro[m
[31m-|.macro checknumber, src, target; checknumx src, target, ja; .endmacro[m
[31m-|[m
[31m-|.macro mov_false, reg; mov64 reg, (int64_t)~((uint64_t)1<<47); .endmacro[m
[31m-|.macro mov_true, reg; mov64 reg, (int64_t)~((uint64_t)2<<47); .endmacro[m
[31m-|[m
[31m-|// These operands must be used with movzx.[m
[31m-|.define PC_OP, byte [PC-4][m
[31m-|.define PC_RA, byte [PC-3][m
[31m-|.define PC_RB, byte [PC-1][m
[31m-|.define PC_RC, byte [PC-2][m
[31m-|.define PC_RD, word [PC-2][m
[31m-|[m
[31m-|.macro branchPC, reg[m
[31m-|  lea PC, [PC+reg*4-BCBIAS_J*4][m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|// Decrement hashed hotcount and trigger trace recorder if zero.[m
[31m-|.macro hotloop, reg[m
[31m-|  mov reg, PCd[m
[31m-|  shr reg, 1[m
[31m-|  and reg, HOTCOUNT_PCMASK[m
[31m-|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP[m
[31m-|  jb ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall, reg[m
[31m-|  mov reg, PCd[m
[31m-|  shr reg, 1[m
[31m-|  and reg, HOTCOUNT_PCMASK[m
[31m-|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL[m
[31m-|  jb ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state.[m
[31m-|.macro set_vmstate, st[m
[31m-|  mov dword [DISPATCH+DISPATCH_GL(vmstate)], ~LJ_VMST_..st[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro fpop1; fstp st1; .endmacro[m
[31m-|[m
[31m-|// Synthesize SSE FP constants.[m
[31m-|.macro sseconst_abs, reg, tmp		// Synthesize abs mask.[m
[31m-|  mov64 tmp, U64x(7fffffff,ffffffff); movd reg, tmp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro sseconst_hi, reg, tmp, val	// Synthesize hi-32 bit const.[m
[31m-|  mov64 tmp, U64x(val,00000000); movd reg, tmp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro sseconst_sign, reg, tmp		// Synthesize sign mask.[m
[31m-|  sseconst_hi reg, tmp, 80000000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_1, reg, tmp		// Synthesize 1.0.[m
[31m-|  sseconst_hi reg, tmp, 3ff00000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_m1, reg, tmp		// Synthesize -1.0.[m
[31m-|  sseconst_hi reg, tmp, bff00000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_2p52, reg, tmp		// Synthesize 2^52.[m
[31m-|  sseconst_hi reg, tmp, 43300000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_tobit, reg, tmp	// Synthesize 2^52 + 2^51.[m
[31m-|  sseconst_hi reg, tmp, 43380000[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites reg.[m
[31m-|.macro barrierback, tab, reg[m
[31m-|  and byte tab->marked, (uint8_t)~LJ_GC_BLACK	// black2gray(tab)[m
[31m-|  mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)][m
[31m-|  mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab[m
[31m-|  mov tab->gclist, reg[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  test PCd, FRAME_P[m
[31m-  |  jz ->cont_dispatch[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  and PC, -8[m
[31m-  |  sub BASE, PC			// Restore caller base.[m
[31m-  |  lea RA, [RA+PC-8]			// Rebase RA and prepend one result.[m
[31m-  |  mov PC, [BASE-8]			// Fetch PC of previous frame.[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |  mov_true ITYPE[m
[31m-  |  mov aword [BASE+RA], ITYPE		// Prepend true to results.[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  add RDd, 1				// RD = nresults+1[m
[31m-  |  jz ->vm_unwind_yield[m
[31m-  |  mov MULTRES, RDd[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return[m
[31m-  |  xor PC, FRAME_C[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jnz ->vm_returnp[m
[31m-  |[m
[31m-  |  // Return to C.[m
[31m-  |  set_vmstate C[m
[31m-  |  and PC, -8[m
[31m-  |  sub PC, BASE[m
[31m-  |  neg PC				// Previous base = BASE - delta.[m
[31m-  |[m
[31m-  |  sub RDd, 1[m
[31m-  |  jz >2[m
[31m-  |1:  // Move results down.[m
[31m-  |  mov RB, [BASE+RA][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  add BASE, 8[m
[31m-  |  sub RDd, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, PC[m
[31m-  |3:[m
[31m-  |  mov RDd, MULTRES[m
[31m-  |  mov RAd, SAVE_NRES			// RA = wanted nresults+1[m
[31m-  |4:[m
[31m-  |  cmp RAd, RDd[m
[31m-  |  jne >6				// More/less results wanted?[m
[31m-  |5:[m
[31m-  |  sub BASE, 16[m
[31m-  |  mov L:RB->top, BASE[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  mov RA, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |  mov L:RB->cframe, RA[m
[31m-  |  xor eax, eax			// Ok return status for vm_pcall.[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  jb >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  cmp BASE, L:RB->maxstack[m
[31m-  |  ja >8[m
[31m-  |  mov aword [BASE-16], LJ_TNIL[m
[31m-  |  add BASE, 8[m
[31m-  |  add RDd, 1[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  test RAd, RAd[m
[31m-  |  jz <5				// But check for LUA_MULTRET+1.[m
[31m-  |  sub RA, RD				// Negative result![m
[31m-  |  lea BASE, [BASE+RA*8]		// Correct top.[m
[31m-  |  jmp <5[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  mov L:RB->top, BASE		// Save current top held in BASE (yes).[m
[31m-  |  mov MULTRES, RDd			// Need to fill only remainder with nil.[m
[31m-  |  mov CARG2d, RAd[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->top		// Need the (realloced) L->top in BASE.[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->vm_unwind_yield:[m
[31m-  |  mov al, LUA_YIELD[m
[31m-  |  jmp ->vm_unwind_c_eh[m
[31m-  |[m
[31m-  |->vm_unwind_c:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |  mov eax, CARG2d			// Error return status for vm_pcall.[m
[31m-  |  mov rsp, CARG1[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov GL:RB, L:RB->glref[m
[31m-  |  mov dword GL:RB->vmstate, ~LJ_VMST_C[m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_rethrow:[m
[31m-  |.if not X64WIN[m
[31m-  |  mov CARG1, SAVE_L[m
[31m-  |  mov CARG2d, eax[m
[31m-  |  restoreregs[m
[31m-  |  jmp extern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_unwind_ff:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |  and CARG1, CFRAME_RAWMASK[m
[31m-  |  mov rsp, CARG1[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov RDd, 1+1			// Really 1+2 results, incr. later.[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov PC, [BASE-8]			// Fetch PC of previous frame.[m
[31m-  |  mov_false RA[m
[31m-  |  mov RB, [BASE][m
[31m-  |  mov [BASE-16], RA			// Prepend false to error message.[m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  mov RA, -16			// Results start at BASE+RA = BASE-16.[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  jmp ->vm_returnc			// Increments RD/MULTRES and returns.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  mov CARG2d, LUA_MINSTACK[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vm_growstack_v:			// Grow stack for vararg Lua function.[m
[31m-  |  sub RD, 16				// LJ_FR2[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_growstack_f:			// Grow stack for fixarg Lua function.[m
[31m-  |  // BASE = new base, RD = nargs+1, RB = L, PC = first PC[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |1:[m
[31m-  |  movzx RAd, byte [PC-4+PC2PROTO(framesize)][m
[31m-  |  add PC, 4				// Must point after first instruction.[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  mov CARG2, RA[m
[31m-  |2:[m
[31m-  |  // RB = L, L->base = new base, L->top = top[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  mov LFUNC:RB, [BASE-16][m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  sub RD, BASE[m
[31m-  |  shr RDd, 3[m
[31m-  |  add NARGS:RDd, 1[m
[31m-  |  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.[m
[31m-  |  mov SAVE_L, CARG1[m
[31m-  |  mov RA, CARG2[m
[31m-  |  mov PCd, FRAME_CP[m
[31m-  |  xor RDd, RDd[m
[31m-  |  lea KBASE, [esp+CFRAME_RESUME][m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov SAVE_PC, RD			// Any value outside of bytecode is ok.[m
[31m-  |  mov SAVE_CFRAME, RD[m
[31m-  |  mov SAVE_NRES, RDd[m
[31m-  |  mov SAVE_ERRF, RDd[m
[31m-  |  mov L:RB->cframe, KBASE[m
[31m-  |  cmp byte L:RB->status, RDL[m
[31m-  |  je >2				// Initial resume (like a call).[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov byte L:RB->status, RDL[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, RA[m
[31m-  |  shr RDd, 3[m
[31m-  |  add RDd, 1				// RD = nresults+1[m
[31m-  |  sub RA, BASE			// RA = resultofs[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov MULTRES, RDd[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  mov PCd, FRAME_CP[m
[31m-  |  mov SAVE_ERRF, CARG4d[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  mov PCd, FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |  mov SAVE_NRES, CARG3d[m
[31m-  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.[m
[31m-  |  mov SAVE_L, CARG1[m
[31m-  |  mov RA, CARG2[m
[31m-  |[m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASE[m
[31m-  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov L:RB->cframe, rsp[m
[31m-  |[m
[31m-  |2:  // Entry point for vm_resume/vm_cpcall (RA = base, RB = L, PC = ftype).[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov BASE, L:RB->base		// BASE = old base (used in vmeta_call).[m
[31m-  |  add PC, RA[m
[31m-  |  sub PC, BASE			// PC = frame delta + frame type[m
[31m-  |[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, RA[m
[31m-  |  shr NARGS:RDd, 3[m
[31m-  |  add NARGS:RDd, 1			// RD = nargs+1[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  mov LFUNC:RB, [RA-16][m
[31m-  |  checkfunc LFUNC:RB, ->vmeta_call	// Ensure KBASE defined and != BASE.[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  mov BASE, RA[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, RB = func, RD = nargs+1, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |  mov L:RB, CARG1			// Caveat: CARG1 may be RA.[m
[31m-  |  mov SAVE_L, CARG1[m
[31m-  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[31m-  |[m
[31m-  |  mov KBASE, L:RB->stack		// Compute -savestack(L, L->top).[m
[31m-  |  sub KBASE, L:RB->top[m
[31m-  |   mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  mov SAVE_ERRF, 0			// No error function.[m
[31m-  |  mov SAVE_NRES, KBASEd		// Neg. delta means cframe w/o frame.[m
[31m-  |   add DISPATCH, GG_G2DISP[m
[31m-  |  // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe).[m
[31m-  |[m
[31m-  |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASE[m
[31m-  |  mov L:RB->cframe, rsp[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |[m
[31m-  |  call CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |  // TValue * (new base) or NULL returned in eax (RC).[m
[31m-  |  test RC, RC[m
[31m-  |  jz ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |  mov RA, RC[m
[31m-  |  mov PCd, FRAME_CP[m
[31m-  |  jmp <2				// Else continue with the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultofs, RD = nresults+1 (also in MULTRES)[m
[31m-  |  add RA, BASE[m
[31m-  |  and PC, -8[m
[31m-  |  mov RB, BASE[m
[31m-  |  sub BASE, PC			// Restore caller BASE.[m
[31m-  |  mov aword [RA+RD*8-8], LJ_TNIL	// Ensure one valid arg.[m
[31m-  |  mov RC, RA				// ... in [RC][m
[31m-  |  mov PC, [RB-24]			// Restore PC from [cont|PC].[m
[31m-  |  mov RA, qword [RB-32]		// May be negative on WIN64 with debug.[m
[31m-  |.if FFI[m
[31m-  |  cmp RA, 1[m
[31m-  |  jbe >1[m
[31m-  |.endif[m
[31m-  |  mov LFUNC:KBASE, [BASE-16][m
[31m-  |  cleartp LFUNC:KBASE[m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  // BASE = base, RC = result, RB = meta base[m
[31m-  |  jmp RA				// Jump to continuation.[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  je ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: Tail call from C function.[m
[31m-  |  sub RB, BASE[m
[31m-  |  shr RBd, 3[m
[31m-  |  lea RDd, [RBd-3][m
[31m-  |  jmp ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// BASE = base, RC = result, RB = mbase[m
[31m-  |  movzx RAd, PC_RB[m
[31m-  |  sub RB, 32[m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |  sub RA, RB[m
[31m-  |  je ->cont_ra[m
[31m-  |  neg RA[m
[31m-  |  shr RAd, 3[m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3d, RAd[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE[m
[31m-  |  mov RC, [RC][m
[31m-  |  mov [RB], RC[m
[31m-  |  mov CARG2, RB[m
[31m-  |.else[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE[m
[31m-  |  mov CARG3d, RAd[m
[31m-  |  mov RA, [RC][m
[31m-  |  mov [RB], RA[m
[31m-  |  mov CARG2, RB[m
[31m-  |.endif[m
[31m-  |  jmp ->BC_CAT_Z[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  settp STR:RC, LJ_TSTR		// STR:RC = GCstr *[m
[31m-  |  mov TMP1, STR:RC[m
[31m-  |  lea RC, TMP1[m
[31m-  |  cmp PC_OP, BC_GGET[m
[31m-  |  jne >1[m
[31m-  |  settp TAB:RA, TAB:RB, LJ_TTAB	// TAB:RB = GCtab *[m
[31m-  |  lea RB, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[31m-  |  mov [RB], TAB:RA[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_tgetb:[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.if DUALNUM[m
[31m-  |  setint RC[m
[31m-  |  mov TMP1, RC[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RCd[m
[31m-  |  movsd TMP1, xmm0[m
[31m-  |.endif[m
[31m-  |  lea RC, TMP1[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |  movzx RCd, PC_RC			// Reload TValue *k from RC.[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  movzx RBd, PC_RB			// Reload TValue *t from RB.[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-  |  mov CARG2, RB[m
[31m-  |  mov CARG3, RC[m
[31m-  |  mov L:RB, L:CARG1[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz >3[m
[31m-  |->cont_ra:				// BASE = base, RC = result[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov RB, [RC][m
[31m-  |  mov [BASE+RA*8], RB[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  mov [RA-24], PC			// [cont|PC][m
[31m-  |  lea PC, [RA+FRAME_CONT][m
[31m-  |  sub PC, BASE[m
[31m-  |  mov LFUNC:RB, [RA-16]		// Guaranteed to be a function here.[m
[31m-  |  mov NARGS:RDd, 2+1			// 2 args for func(t, k).[m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  jmp ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  mov CARG1, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG2d, RCd			// Caveat: CARG2 == BASE[m
[31m-  |  call extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // cTValue * or NULL returned in eax (RC).[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  test RC, RC[m
[31m-  |  jnz ->BC_TGETR_Z[m
[31m-  |  mov ITYPE, LJ_TNIL[m
[31m-  |  jmp ->BC_TGETR2_Z[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  settp STR:RC, LJ_TSTR		// STR:RC = GCstr *[m
[31m-  |  mov TMP1, STR:RC[m
[31m-  |  lea RC, TMP1[m
[31m-  |  cmp PC_OP, BC_GSET[m
[31m-  |  jne >1[m
[31m-  |  settp TAB:RA, TAB:RB, LJ_TTAB	// TAB:RB = GCtab *[m
[31m-  |  lea RB, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[31m-  |  mov [RB], TAB:RA[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_tsetb:[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.if DUALNUM[m
[31m-  |  setint RC[m
[31m-  |  mov TMP1, RC[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RCd[m
[31m-  |  movsd TMP1, xmm0[m
[31m-  |.endif[m
[31m-  |  lea RC, TMP1[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  movzx RCd, PC_RC			// Reload TValue *k from RC.[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  movzx RBd, PC_RB			// Reload TValue *t from RB.[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-  |  mov CARG2, RB[m
[31m-  |  mov CARG3, RC[m
[31m-  |  mov L:RB, L:CARG1[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz >3[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov RB, [BASE+RA*8][m
[31m-  |  mov [RC], RB[m
[31m-  |->cont_nop:				// BASE = base, (RC = result)[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  mov [RA-24], PC			// [cont|PC][m
[31m-  |  movzx RCd, PC_RA[m
[31m-  |  // Copy value to third argument.[m
[31m-  |  mov RB, [BASE+RC*8][m
[31m-  |  mov [RA+16], RB[m
[31m-  |  lea PC, [RA+FRAME_CONT][m
[31m-  |  sub PC, BASE[m
[31m-  |  mov LFUNC:RB, [RA-16]		// Guaranteed to be a function here.[m
[31m-  |  mov NARGS:RDd, 3+1			// 3 args for func(t, k, v).[m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  jmp ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |.if X64WIN[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov CARG3d, RCd[m
[31m-  |  mov L:CARG1->base, BASE[m
[31m-  |  xchg CARG2, TAB:RB			// Caveat: CARG2 == BASE.[m
[31m-  |.else[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov CARG2, TAB:RB[m
[31m-  |  mov L:CARG1->base, BASE[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG3d, RCd			// Caveat: CARG3 == BASE.[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // TValue * returned in eax (RC).[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  jmp ->BC_TSETR_Z[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 == BASE.[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG3, [BASE+RD*8][m
[31m-  |  lea CARG2, [BASE+RA*8][m
[31m-  |.else[m
[31m-  |  lea CARG2, [BASE+RA*8][m
[31m-  |  lea CARG3, [BASE+RD*8][m
[31m-  |.endif[m
[31m-  |  mov CARG1, L:RB			// Caveat: CARG1/CARG4 == RA.[m
[31m-  |  movzx CARG4d, PC_OP[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_comp	// (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |3:[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  cmp RC, 1[m
[31m-  |  ja ->vmeta_binop[m
[31m-  |4:[m
[31m-  |  lea PC, [PC+4][m
[31m-  |  jb >6[m
[31m-  |5:[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  branchPC RD[m
[31m-  |6:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_condt:			// BASE = base, RC = result[m
[31m-  |  add PC, 4[m
[31m-  |  mov ITYPE, [RC][m
[31m-  |  sar ITYPE, 47[m
[31m-  |  cmp ITYPEd, LJ_TISTRUECOND		// Branch if result is true.[m
[31m-  |  jb <5[m
[31m-  |  jmp <6[m
[31m-  |[m
[31m-  |->cont_condf:			// BASE = base, RC = result[m
[31m-  |  mov ITYPE, [RC][m
[31m-  |  sar ITYPE, 47[m
[31m-  |  cmp ITYPEd, LJ_TISTRUECOND		// Branch if result is false.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  cleartp TAB:RD[m
[31m-  |  sub PC, 4[m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3, RD[m
[31m-  |  mov CARG4d, RBd[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2 == BASE.[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG1, L:RB			// Caveat: CARG1 == RA.[m
[31m-  |.else[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG4d, RBd			// Caveat: CARG4 == RA.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG3 == BASE.[m
[31m-  |  mov CARG3, RD[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_equal	// (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  sub PC, 4[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  mov CARG2d, dword [PC-4][m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_equal_cd	// (lua_State *L, BCIns ins)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-  |  mov CARG2d, RAd[m
[31m-  |  mov CARG3d, RDd[m
[31m-  |  mov L:CARG1, L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <6[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_vno:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RBd, PC_RB[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  lea RC, [KBASE+RC*8][m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_arith_nvo:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RBd, PC_RB[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  lea TMPR, [KBASE+RC*8][m
[31m-  |  lea RC, [BASE+RB*8][m
[31m-  |  mov RB, TMPR[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  lea RC, [BASE+RD*8][m
[31m-  |  mov RB, RC[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_arith_vvo:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RBd, PC_RB[m
[31m-  |  movzx RCd, PC_RC[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3, RB[m
[31m-  |  mov CARG4, RC[m
[31m-  |  movzx RCd, PC_OP[m
[31m-  |  mov ARG5d, RCd[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2 == BASE.[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG1, L:RB			// Caveat: CARG1 == RA.[m
[31m-  |.else[m
[31m-  |  movzx CARG5d, PC_OP[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG4, RC			// Caveat: CARG4 == RA.[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE		// Caveat: CARG3 == BASE.[m
[31m-  |  mov CARG3, RB[m
[31m-  |  mov L:RB, L:CARG1[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_arith	// (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = base, RC = new base, stack = cont/func/o1/o2[m
[31m-  |  mov RA, RC[m
[31m-  |  sub RC, BASE[m
[31m-  |  mov [RA-24], PC			// [cont|PC][m
[31m-  |  lea PC, [RC+FRAME_CONT][m
[31m-  |  mov NARGS:RDd, 2+1			// 2 args for func(o1, o2).[m
[31m-  |  jmp ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea CARG2, [BASE+RD*8]		// Caveat: CARG2 == BASE[m
[31m-  |  mov L:CARG1, L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_len		// (lua_State *L, TValue *o)[m
[31m-  |  // NULL (retry) or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-#if LJ_52[m
[31m-  |  test RC, RC[m
[31m-  |  jne ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  mov TAB:CARG1, [BASE+RD*8][m
[31m-  |  cleartp TAB:CARG1[m
[31m-  |  jmp ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  jmp ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call_ra:[m
[31m-  |  lea RA, [BASE+RA*8+16][m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs+1, PC = return[m
[31m-  |  mov TMP1d, NARGS:RDd		// Save RA, RC for us.[m
[31m-  |  mov RB, RA[m
[31m-  |.if X64WIN[m
[31m-  |  mov L:TMPR, SAVE_L[m
[31m-  |  mov L:TMPR->base, BASE		// Caveat: CARG2 is BASE.[m
[31m-  |  lea CARG2, [RA-16][m
[31m-  |  lea CARG3, [RA+NARGS:RD*8-8][m
[31m-  |  mov CARG1, L:TMPR			// Caveat: CARG1 is RA.[m
[31m-  |.else[m
[31m-  |  mov L:CARG1, SAVE_L[m
[31m-  |  mov L:CARG1->base, BASE		// Caveat: CARG3 is BASE.[m
[31m-  |  lea CARG2, [RA-16][m
[31m-  |  lea CARG3, [RA+NARGS:RD*8-8][m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  mov RA, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov NARGS:RDd, TMP1d[m
[31m-  |  mov LFUNC:RB, [RA-16][m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  add NARGS:RDd, 1[m
[31m-  |  // This is fragile. L->base must not move, KBASE must always be defined.[m
[31m-  |  cmp KBASE, BASE			// Continue with CALLT if flag set.[m
[31m-  |  je ->BC_CALLT_Z[m
[31m-  |  mov BASE, RA[m
[31m-  |  ins_call				// Otherwise call resolved metamethod.[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG2, RA			// Caveat: CARG2 == BASE[m
[31m-  |  mov L:CARG1, L:RB			// Caveat: CARG1 == RA[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_for	// (lua_State *L, TValue *base)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RCd, [PC-4][m
[31m-  |  movzx RAd, RCH[m
[31m-  |  movzx OP, RCL[m
[31m-  |  shr RCd, 16[m
[31m-  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Retry FORI or JFORI.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmp NARGS:RDd, 1+1;  jb ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmp NARGS:RDd, 2+1;  jb ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name, op[m
[31m-  |  .ffunc_1 name[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  op xmm0, qword [BASE][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_n, name[m
[31m-  |  .ffunc_n name, movsd[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nn, name[m
[31m-  |  .ffunc_2 name[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  checknumtp [BASE+8], ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  movsd xmm1, qword [BASE+8][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses label 1.[m
[31m-  |.macro ffgccheck[m
[31m-  |  mov RB, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-  |  cmp RB, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-  |  jb >1[m
[31m-  |  call ->fff_gcstep[m
[31m-  |1:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  mov ITYPE, [BASE][m
[31m-  |  mov RB, ITYPE[m
[31m-  |  sar ITYPE, 47[m
[31m-  |  cmp ITYPEd, LJ_TISTRUECOND; jae ->fff_fallback[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov MULTRES, RDd[m
[31m-  |  mov RB, [BASE][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  sub RDd, 2[m
[31m-  |  jz >2[m
[31m-  |  mov RA, BASE[m
[31m-  |1:[m
[31m-  |  add RA, 8[m
[31m-  |  mov RB, [RA][m
[31m-  |  mov [RA-16], RB[m
[31m-  |  sub RDd, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  mov RDd, MULTRES[m
[31m-  |  jmp ->fff_res_[m
[31m-  |[m
[31m-  |.ffunc_1 type[m
[31m-  |  mov RC, [BASE][m
[31m-  |  sar RC, 47[m
[31m-  |  mov RBd, LJ_TISNUM[m
[31m-  |  cmp RCd, RBd[m
[31m-  |  cmovb RCd, RBd[m
[31m-  |  not RCd[m
[31m-  |2:[m
[31m-  |  mov CFUNC:RB, [BASE-16][m
[31m-  |  cleartp CFUNC:RB[m
[31m-  |  mov STR:RC, [CFUNC:RB+RC*8+((char *)(&((GCfuncC *)0)->upvalue))][m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  settp STR:RC, LJ_TSTR[m
[31m-  |  mov [BASE-16], STR:RC[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  checktab TAB:RB, >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  mov TAB:RB, TAB:RB->metatable[m
[31m-  |2:[m
[31m-  |  test TAB:RB, TAB:RB[m
[31m-  |  mov aword [BASE-16], LJ_TNIL[m
[31m-  |  jz ->fff_res1[m
[31m-  |  settp TAB:RC, TAB:RB, LJ_TTAB[m
[31m-  |  mov [BASE-16], TAB:RC		// Store metatable as default result.[m
[31m-  |  mov STR:RC, [DISPATCH+DISPATCH_GL(gcroot)+8*(GCROOT_MMNAME+MM_metatable)][m
[31m-  |  mov RAd, TAB:RB->hmask[m
[31m-  |  and RAd, STR:RC->hash[m
[31m-  |  settp STR:RC, LJ_TSTR[m
[31m-  |  imul RAd, #NODE[m
[31m-  |  add NODE:RA, TAB:RB->node[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  cmp NODE:RA->key, STR:RC[m
[31m-  |  je >5[m
[31m-  |4:[m
[31m-  |  mov NODE:RA, NODE:RA->next[m
[31m-  |  test NODE:RA, NODE:RA[m
[31m-  |  jnz <3[m
[31m-  |  jmp ->fff_res1			// Not found, keep default result.[m
[31m-  |5:[m
[31m-  |  mov RB, NODE:RA->val[m
[31m-  |  cmp RB, LJ_TNIL; je ->fff_res1	// Ditto for nil value.[m
[31m-  |  mov [BASE-16], RB			// Return value of mt.__metatable.[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  cmp ITYPEd, LJ_TUDATA; je <1[m
[31m-  |  cmp ITYPEd, LJ_TISNUM; ja >7[m
[31m-  |  mov ITYPEd, LJ_TISNUM[m
[31m-  |7:[m
[31m-  |  not ITYPEd[m
[31m-  |  mov TAB:RB, [DISPATCH+ITYPE*8+DISPATCH_GL(gcroot[GCROOT_BASEMT])][m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov TAB:TMPR, TAB:RB[m
[31m-  |  checktab TAB:RB, ->fff_fallback[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-  |  mov TAB:RA, [BASE+8][m
[31m-  |  checktab TAB:RA, ->fff_fallback[m
[31m-  |  mov TAB:RB->metatable, TAB:RA[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], TAB:TMPR			// Return original table.[m
[31m-  |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-  |  jz >1[m
[31m-  |  // Possible write barrier. Table is black, but skip iswhite(mt) check.[m
[31m-  |  barrierback TAB:RB, RC[m
[31m-  |1:[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_2 rawget[m
[31m-  |.if X64WIN[m
[31m-  |  mov TAB:RA, [BASE][m
[31m-  |  checktab TAB:RA, ->fff_fallback[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  lea CARG3, [BASE+8][m
[31m-  |  mov CARG2, TAB:RA			// Caveat: CARG2 == BASE.[m
[31m-  |  mov CARG1, SAVE_L[m
[31m-  |.else[m
[31m-  |  mov TAB:CARG2, [BASE][m
[31m-  |  checktab TAB:CARG2, ->fff_fallback[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  lea CARG3, [BASE+8]		// Caveat: CARG3 == BASE.[m
[31m-  |  mov CARG1, SAVE_L[m
[31m-  |.endif[m
[31m-  |  call extern lj_tab_get	// (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // cTValue * returned in eax (RD).[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  // Copy table slot.[m
[31m-  |  mov RB, [RD][m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback	// Exactly one argument.[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checknumber RB, ->fff_fallback[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  checktp_nc STR:RB, LJ_TSTR, >3[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |2:[m
[31m-  |  mov [BASE-16], STR:RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |3:  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  cmp ITYPEd, LJ_TISNUM;  ja ->fff_fallback_1[m
[31m-  |  cmp aword [DISPATCH+DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])], 0[m
[31m-  |  jne ->fff_fallback[m
[31m-  |  ffgccheck				// Caveat: uses label 1.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |.if not X64WIN[m
[31m-  |  mov CARG2, BASE			// Otherwise: CARG2 == BASE[m
[31m-  |.endif[m
[31m-  |  mov L:CARG1, L:RB[m
[31m-  |.if DUALNUM[m
[31m-  |  call extern lj_strfmt_number	// (lua_State *L, cTValue *o)[m
[31m-  |.else[m
[31m-  |  call extern lj_strfmt_num		// (lua_State *L, lua_Number *np)[m
[31m-  |.endif[m
[31m-  |  // GCstr returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  settp STR:RB, RD, LJ_TSTR[m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 next[m
[31m-  |  je >2				// Missing 2nd arg?[m
[31m-  |1:[m
[31m-  |.if X64WIN[m
[31m-  |  mov RA, [BASE][m
[31m-  |  checktab RA, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  mov CARG2, [BASE][m
[31m-  |  checktab CARG2, ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[31m-  |  mov L:RB->top, BASE		// Dummy frame length is ok.[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG3, [BASE+8][m
[31m-  |  mov CARG2, RA			// Caveat: CARG2 == BASE.[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |.else[m
[31m-  |  lea CARG3, [BASE+8]		// Caveat: CARG3 == BASE.[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC			// Needed for ITERN fallback.[m
[31m-  |  call extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Flag returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RDd, RDd;  jz >3		// End of traversal?[m
[31m-  |  // Copy key and value to results.[m
[31m-  |  mov RB, [BASE+8][m
[31m-  |  mov RD, [BASE+16][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  mov [BASE-8], RD[m
[31m-  |->fff_res2:[m
[31m-  |  mov RDd, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |2:  // Set missing 2nd arg to nil.[m
[31m-  |  mov aword [BASE+8], LJ_TNIL[m
[31m-  |  jmp <1[m
[31m-  |3:  // End of traversal: return nil.[m
[31m-  |  mov aword [BASE-16], LJ_TNIL[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov TMPR, TAB:RB[m
[31m-  |  checktab TAB:RB, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CFUNC:RD, [BASE-16][m
[31m-  |  cleartp CFUNC:RD[m
[31m-  |  mov CFUNC:RD, CFUNC:RD->upvalue[0][m
[31m-  |  settp CFUNC:RD, LJ_TFUNC[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], CFUNC:RD[m
[31m-  |  mov [BASE-8], TMPR[m
[31m-  |  mov aword [BASE], LJ_TNIL[m
[31m-  |  mov RDd, 1+3[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_2 ipairs_aux[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  checktab TAB:RB, ->fff_fallback[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RA, [BASE+8][m
[31m-  |  checkint RA, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE+8], ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE+8][m
[31m-  |.endif[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |.if DUALNUM[m
[31m-  |  add RAd, 1[m
[31m-  |  setint ITYPE, RA[m
[31m-  |  mov [BASE-16], ITYPE[m
[31m-  |.else[m
[31m-  |  sseconst_1 xmm1, TMPR[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  cvttsd2si RAd, xmm0[m
[31m-  |  movsd qword [BASE-16], xmm0[m
[31m-  |.endif[m
[31m-  |  cmp RAd, TAB:RB->asize;  jae >2	// Not in array part?[m
[31m-  |  mov RD, TAB:RB->array[m
[31m-  |  lea RD, [RD+RA*8][m
[31m-  |1:[m
[31m-  |  cmp aword [RD], LJ_TNIL;  je ->fff_res0[m
[31m-  |  // Copy array slot.[m
[31m-  |  mov RB, [RD][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  jmp ->fff_res2[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  cmp dword TAB:RB->hmask, 0; je ->fff_res0[m
[31m-  |.if X64WIN[m
[31m-  |  mov TMPR, BASE[m
[31m-  |  mov CARG2d, RAd[m
[31m-  |  mov CARG1, TAB:RB[m
[31m-  |  mov RB, TMPR[m
[31m-  |.else[m
[31m-  |  mov CARG1, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG2d, RAd			// Caveat: CARG2 == BASE[m
[31m-  |.endif[m
[31m-  |  call extern lj_tab_getinth		// (GCtab *t, int32_t key)[m
[31m-  |  // cTValue * or NULL returned in eax (RD).[m
[31m-  |  mov BASE, RB[m
[31m-  |  test RD, RD[m
[31m-  |  jnz <1[m
[31m-  |->fff_res0:[m
[31m-  |  mov RDd, 1+0[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov TMPR, TAB:RB[m
[31m-  |  checktab TAB:RB, ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  cmp aword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CFUNC:RD, [BASE-16][m
[31m-  |  cleartp CFUNC:RD[m
[31m-  |  mov CFUNC:RD, CFUNC:RD->upvalue[0][m
[31m-  |  settp CFUNC:RD, LJ_TFUNC[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], CFUNC:RD[m
[31m-  |  mov [BASE-8], TMPR[m
[31m-  |.if DUALNUM[m
[31m-  |  mov64 RD, ((int64_t)LJ_TISNUM<<47)[m
[31m-  |  mov [BASE], RD[m
[31m-  |.else[m
[31m-  |  mov qword [BASE], 0[m
[31m-  |.endif[m
[31m-  |  mov RDd, 1+3[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 pcall[m
[31m-  |  lea RA, [BASE+16][m
[31m-  |  sub NARGS:RDd, 1[m
[31m-  |  mov PCd, 16+FRAME_PCALL[m
[31m-  |1:[m
[31m-  |  movzx RBd, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  shr RB, HOOK_ACTIVE_SHIFT[m
[31m-  |  and RB, 1[m
[31m-  |  add PC, RB				// Remember active hook before pcall.[m
[31m-  |  // Note: this does a (harmless) copy of the function to the PC slot, too.[m
[31m-  |  mov KBASE, RD[m
[31m-  |2:[m
[31m-  |  mov RB, [RA+KBASE*8-24][m
[31m-  |  mov [RA+KBASE*8-16], RB[m
[31m-  |  sub KBASE, 1[m
[31m-  |  ja <2[m
[31m-  |  jmp ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc_2 xpcall[m
[31m-  |  mov LFUNC:RA, [BASE+8][m
[31m-  |  checktp_nc LFUNC:RA, LJ_TFUNC, ->fff_fallback[m
[31m-  |  mov LFUNC:RB, [BASE]		// Swap function and traceback.[m
[31m-  |  mov [BASE], LFUNC:RA[m
[31m-  |  mov [BASE+8], LFUNC:RB[m
[31m-  |  lea RA, [BASE+24][m
[31m-  |  sub NARGS:RDd, 2[m
[31m-  |  mov PCd, 24+FRAME_PCALL[m
[31m-  |  jmp <1[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  mov L:RB, [BASE][m
[31m-  |  cleartp L:RB[m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  mov CFUNC:RB, [BASE-16][m
[31m-  |  cleartp CFUNC:RB[m
[31m-  |  mov L:RB, CFUNC:RB->upvalue[0].gcr[m
[31m-  |  cleartp L:RB[m
[31m-  |.endif[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  mov TMP1, L:RB[m
[31m-  |.if resume[m
[31m-  |  checktptp [BASE], LJ_TTHREAD, ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  cmp aword L:RB->cframe, 0; jne ->fff_fallback[m
[31m-  |  cmp byte L:RB->status, LUA_YIELD;  ja ->fff_fallback[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  je >1				// Status != LUA_YIELD (i.e. 0)?[m
[31m-  |  cmp RA, L:RB->base			// Check for presence of initial func.[m
[31m-  |  je ->fff_fallback[m
[31m-  |  mov PC, [RA-8]			// Move initial function up.[m
[31m-  |  mov [RA], PC[m
[31m-  |  add RA, 8[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  lea PC, [RA+NARGS:RD*8-16]		// Check stack space (-1-thread).[m
[31m-  |.else[m
[31m-  |  lea PC, [RA+NARGS:RD*8-8]		// Check stack space (-1).[m
[31m-  |.endif[m
[31m-  |  cmp PC, L:RB->maxstack; ja ->fff_fallback[m
[31m-  |  mov L:RB->top, PC[m
[31m-  |[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if resume[m
[31m-  |  add BASE, 8			// Keep resumed thread in stack for GC.[m
[31m-  |.endif[m
[31m-  |  mov L:RB->top, BASE[m
[31m-  |.if resume[m
[31m-  |  lea RB, [BASE+NARGS:RD*8-24]	// RB = end of source for stack move.[m
[31m-  |.else[m
[31m-  |  lea RB, [BASE+NARGS:RD*8-16]	// RB = end of source for stack move.[m
[31m-  |.endif[m
[31m-  |  sub RB, PC			// Relative to PC.[m
[31m-  |[m
[31m-  |  cmp PC, RA[m
[31m-  |  je >3[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |  mov RC, [PC+RB][m
[31m-  |  mov [PC-8], RC[m
[31m-  |  sub PC, 8[m
[31m-  |  cmp PC, RA[m
[31m-  |  jne <2[m
[31m-  |3:[m
[31m-  |  mov CARG2, RA[m
[31m-  |  mov CARG1, TMP1[m
[31m-  |  call ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:PC, TMP1[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |[m
[31m-  |  cmp eax, LUA_YIELD[m
[31m-  |  ja >8[m
[31m-  |4:[m
[31m-  |  mov RA, L:PC->base[m
[31m-  |  mov KBASE, L:PC->top[m
[31m-  |  mov L:PC->top, RA			// Clear coroutine stack.[m
[31m-  |  mov PC, KBASE[m
[31m-  |  sub PC, RA[m
[31m-  |  je >6				// No results?[m
[31m-  |  lea RD, [BASE+PC][m
[31m-  |  shr PCd, 3[m
[31m-  |  cmp RD, L:RB->maxstack[m
[31m-  |  ja >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  mov RB, BASE[m
[31m-  |  sub RB, RA[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |  mov RD, [RA][m
[31m-  |  mov [RA+RB], RD[m
[31m-  |  add RA, 8[m
[31m-  |  cmp RA, KBASE[m
[31m-  |  jne <5[m
[31m-  |6:[m
[31m-  |.if resume[m
[31m-  |  lea RDd, [PCd+2]			// nresults+1 = 1 + true + results.[m
[31m-  |  mov_true ITYPE			// Prepend true to results.[m
[31m-  |  mov [BASE-8], ITYPE[m
[31m-  |.else[m
[31m-  |  lea RDd, [PCd+1]			// nresults+1 = 1 + results.[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |  mov PC, SAVE_PC[m
[31m-  |  mov MULTRES, RDd[m
[31m-  |.if resume[m
[31m-  |  mov RA, -8[m
[31m-  |.else[m
[31m-  |  xor RAd, RAd[m
[31m-  |.endif[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  mov_false ITYPE			// Prepend false to results.[m
[31m-  |  mov [BASE-8], ITYPE[m
[31m-  |  mov RA, L:PC->top[m
[31m-  |  sub RA, 8[m
[31m-  |  mov L:PC->top, RA			// Clear error from coroutine stack.[m
[31m-  |  // Copy error message.[m
[31m-  |  mov RD, [RA][m
[31m-  |  mov [BASE], RD[m
[31m-  |  mov RDd, 1+2			// nresults+1 = 1 + false + error.[m
[31m-  |  jmp <7[m
[31m-  |.else[m
[31m-  |  mov CARG2, L:PC[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)[m
[31m-  |  // Error function does not return.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |  mov L:RA, TMP1[m
[31m-  |  mov L:RA->top, KBASE		// Undo coroutine stack clearing.[m
[31m-  |  mov CARG2, PC[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov L:PC, TMP1[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <4				// Retry the stack move.[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  test aword L:RB->cframe, CFRAME_RESUME[m
[31m-  |  jz ->fff_fallback[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  xor RDd, RDd[m
[31m-  |  mov aword L:RB->cframe, RD[m
[31m-  |  mov al, LUA_YIELD[m
[31m-  |  mov byte L:RB->status, al[m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |  .ffunc_1 math_abs[m
[31m-  |  mov RB, [BASE][m
[31m-  |.if DUALNUM[m
[31m-  |  checkint RB, >3[m
[31m-  |  cmp RBd, 0; jns ->fff_resi[m
[31m-  |  neg RBd; js >2[m
[31m-  |->fff_resbit:[m
[31m-  |->fff_resi:[m
[31m-  |  setint RB[m
[31m-  |->fff_resRB:[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |2:[m
[31m-  |  mov64 RB, U64x(41e00000,00000000)  // 2^31.[m
[31m-  |  jmp ->fff_resRB[m
[31m-  |3:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknum RB, ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  shl RB, 1[m
[31m-  |  shr RB, 1[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  mov [BASE-16], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_n math_sqrt, sqrtsd[m
[31m-  |->fff_resxmm0:[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  movsd qword [BASE-16], xmm0[m
[31m-  |  // fallthrough[m
[31m-  |[m
[31m-  |->fff_res1:[m
[31m-  |  mov RDd, 1+1[m
[31m-  |->fff_res:[m
[31m-  |  mov MULTRES, RDd[m
[31m-  |->fff_res_:[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jnz >7[m
[31m-  |5:[m
[31m-  |  cmp PC_RB, RDL			// More results expected?[m
[31m-  |  ja >6[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  neg RA[m
[31m-  |  lea BASE, [BASE+RA*8-16]		// base = base - (RA+2)*8[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  mov aword [BASE+RD*8-24], LJ_TNIL[m
[31m-  |  add RD, 1[m
[31m-  |  jmp <5[m
[31m-  |[m
[31m-  |7:  // Non-standard return case.[m
[31m-  |  mov RA, -16			// Results start at BASE+RA = BASE-16.[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |.macro math_round, func[m
[31m-  |  .ffunc math_ .. func[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checknumx RB, ->fff_resRB, je[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  call ->vm_ .. func .. _sse[m
[31m-  |.if DUALNUM[m
[31m-  |  cvttsd2si RBd, xmm0[m
[31m-  |  cmp RBd, 0x80000000[m
[31m-  |  jne ->fff_resi[m
[31m-  |  cvtsi2sd xmm1, RBd[m
[31m-  |  ucomisd xmm0, xmm1[m
[31m-  |  jp ->fff_resxmm0[m
[31m-  |  je ->fff_resi[m
[31m-  |.endif[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  cmp NARGS:RDd, 1+1; jne ->fff_fallback	// Exactly one argument.[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern log[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc_n math_ .. func[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern func[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nn math_ .. func[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern func[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.ffunc_2 math_ldexp[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  checknumtp [BASE+8], ->fff_fallback[m
[31m-  |  fld qword [BASE+8][m
[31m-  |  fld qword [BASE][m
[31m-  |  fscale[m
[31m-  |  fpop1[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  fstp qword [BASE-16][m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_n math_frexp[m
[31m-  |  mov RB, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG2, TMP1		// Caveat: CARG2 == BASE[m
[31m-  |.else[m
[31m-  |  lea CARG1, TMP1[m
[31m-  |.endif[m
[31m-  |  call extern frexp[m
[31m-  |  mov BASE, RB[m
[31m-  |  mov RBd, TMP1d[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  movsd qword [BASE-16], xmm0[m
[31m-  |.if DUALNUM[m
[31m-  |  setint RB[m
[31m-  |  mov [BASE-8], RB[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm1, RBd[m
[31m-  |  movsd qword [BASE-8], xmm1[m
[31m-  |.endif[m
[31m-  |  mov RDd, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_n math_modf[m
[31m-  |  mov RB, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG2, [BASE-16]	// Caveat: CARG2 == BASE[m
[31m-  |.else[m
[31m-  |  lea CARG1, [BASE-16][m
[31m-  |.endif[m
[31m-  |  call extern modf[m
[31m-  |  mov BASE, RB[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |  mov RDd, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.macro math_minmax, name, cmovop, sseop[m
[31m-  |  .ffunc name[m
[31m-  |  mov RAd, 2[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checkint RB, >4[m
[31m-  |1:  // Handle integers.[m
[31m-  |  cmp RAd, RDd; jae ->fff_resRB[m
[31m-  |  mov TMPR, [BASE+RA*8-8][m
[31m-  |  checkint TMPR, >3[m
[31m-  |  cmp RBd, TMPRd[m
[31m-  |  cmovop RB, TMPR[m
[31m-  |  add RAd, 1[m
[31m-  |  jmp <1[m
[31m-  |3:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  // Convert intermediate result to number and continue below.[m
[31m-  |  cvtsi2sd xmm0, RBd[m
[31m-  |  jmp >6[m
[31m-  |4:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |5:  // Handle numbers or integers.[m
[31m-  |  cmp RAd, RDd; jae ->fff_resxmm0[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE+RA*8-8][m
[31m-  |  checknumx RB, >6, jb[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  cvtsi2sd xmm1, RBd[m
[31m-  |  jmp >7[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE+RA*8-8], ->fff_fallback[m
[31m-  |.endif[m
[31m-  |6:[m
[31m-  |  movsd xmm1, qword [BASE+RA*8-8][m
[31m-  |7:[m
[31m-  |  sseop xmm0, xmm1[m
[31m-  |  add RAd, 1[m
[31m-  |  jmp <5[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, cmovg, minsd[m
[31m-  |  math_minmax math_max, cmovl, maxsd[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback[m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  checkstr STR:RB, ->fff_fallback[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  cmp dword STR:RB->len, 1[m
[31m-  |  jb ->fff_res0			// Return no results for empty string.[m
[31m-  |  movzx RBd, byte STR:RB[1][m
[31m-  |.if DUALNUM[m
[31m-  |  jmp ->fff_resi[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RBd; jmp ->fff_resxmm0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  cmp NARGS:RDd, 1+1;  jne ->fff_fallback	// *Exactly* 1 arg.[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checkint RB, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  cvttsd2si RBd, qword [BASE][m
[31m-  |.endif[m
[31m-  |  cmp RBd, 255;  ja ->fff_fallback[m
[31m-  |  mov TMP1d, RBd[m
[31m-  |  mov TMPRd, 1[m
[31m-  |  lea RD, TMP1			// Points to stack. Little-endian.[m
[31m-  |->fff_newstr:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG3d, TMPRd			// Zero-extended to size_t.[m
[31m-  |  mov CARG2, RD[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // GCstr * returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov PC, [BASE-8][m
[31m-  |  settp STR:RD, LJ_TSTR[m
[31m-  |  mov [BASE-16], STR:RD[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  mov TMPRd, -1[m
[31m-  |  cmp NARGS:RDd, 1+2;  jb ->fff_fallback[m
[31m-  |  jna >1[m
[31m-  |.if DUALNUM[m
[31m-  |  mov TMPR, [BASE+16][m
[31m-  |  checkint TMPR, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE+16], ->fff_fallback[m
[31m-  |  cvttsd2si TMPRd, qword [BASE+16][m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  checkstr STR:RB, ->fff_fallback[m
[31m-  |.if DUALNUM[m
[31m-  |  mov ITYPE, [BASE+8][m
[31m-  |  mov RAd, ITYPEd			// Must clear hiword for lea below.[m
[31m-  |  sar ITYPE, 47[m
[31m-  |  cmp ITYPEd, LJ_TISNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE+8], ->fff_fallback[m
[31m-  |  cvttsd2si RAd, qword [BASE+8][m
[31m-  |.endif[m
[31m-  |  mov RCd, STR:RB->len[m
[31m-  |  cmp RCd, TMPRd			// len < end? (unsigned compare)[m
[31m-  |  jb >5[m
[31m-  |2:[m
[31m-  |  test RAd, RAd			// start <= 0?[m
[31m-  |  jle >7[m
[31m-  |3:[m
[31m-  |  sub TMPRd, RAd			// start > end?[m
[31m-  |  jl ->fff_emptystr[m
[31m-  |  lea RD, [STR:RB+RAd+#STR-1][m
[31m-  |  add TMPRd, 1[m
[31m-  |4:[m
[31m-  |  jmp ->fff_newstr[m
[31m-  |[m
[31m-  |5:  // Negative end or overflow.[m
[31m-  |  jl >6[m
[31m-  |  lea TMPRd, [TMPRd+RCd+1]		// end = end+(len+1)[m
[31m-  |  jmp <2[m
[31m-  |6:  // Overflow.[m
[31m-  |  mov TMPRd, RCd			// end = len[m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |7:  // Negative start or underflow.[m
[31m-  |  je >8[m
[31m-  |  add RAd, RCd			// start = start+(len+1)[m
[31m-  |  add RAd, 1[m
[31m-  |  jg <3				// start > 0?[m
[31m-  |8:  // Underflow.[m
[31m-  |  mov RAd, 1				// start = 1[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->fff_emptystr:  // Range underflow.[m
[31m-  |  xor TMPRd, TMPRd			// Zero length. Any ptr in RD is ok.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc_1 string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |.if X64WIN[m
[31m-  |  mov STR:TMPR, [BASE][m
[31m-  |  checkstr STR:TMPR, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  mov STR:CARG2, [BASE][m
[31m-  |  checkstr STR:CARG2, ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |   lea SBUF:CARG1, [DISPATCH+DISPATCH_GL(tmpbuf)][m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  mov STR:CARG2, STR:TMPR		// Caveat: CARG2 == BASE[m
[31m-  |.endif[m
[31m-  |   mov RC, SBUF:CARG1->b[m
[31m-  |   mov SBUF:CARG1->L, L:RB[m
[31m-  |   mov SBUF:CARG1->p, RC[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_buf_putstr_ .. name[m
[31m-  |  mov CARG1, rax[m
[31m-  |  call extern lj_buf_tostr[m
[31m-  |  jmp ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name, kind, fdef[m
[31m-  |  fdef name[m
[31m-  |.if kind == 2[m
[31m-  |  sseconst_tobit xmm1, RB[m
[31m-  |.endif[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RB, [BASE][m
[31m-  |  checkint RB, >1[m
[31m-  |.if kind > 0[m
[31m-  |  jmp >2[m
[31m-  |.else[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  movd xmm0, RB[m
[31m-  |.else[m
[31m-  |  checknumtp [BASE], ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |.endif[m
[31m-  |.if kind < 2[m
[31m-  |  sseconst_tobit xmm1, RB[m
[31m-  |.endif[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  movd RBd, xmm0[m
[31m-  |2:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name, kind[m
[31m-  |  .ffunc_bit name, kind, .ffunc_1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit bit_tobit, 0[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name, 2[m
[31m-  |  mov TMPRd, NARGS:RDd		// Save for fallback.[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-16][m
[31m-  |1:[m
[31m-  |  cmp RD, BASE[m
[31m-  |  jbe ->fff_resbit[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RA, [RD][m
[31m-  |  checkint RA, >2[m
[31m-  |  ins RBd, RAd[m
[31m-  |  sub RD, 8[m
[31m-  |  jmp <1[m
[31m-  |2:[m
[31m-  |  ja ->fff_fallback_bit_op[m
[31m-  |  movd xmm0, RA[m
[31m-  |.else[m
[31m-  |  checknumtp [RD], ->fff_fallback_bit_op[m
[31m-  |  movsd xmm0, qword [RD][m
[31m-  |.endif[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  movd RAd, xmm0[m
[31m-  |  ins RBd, RAd[m
[31m-  |  sub RD, 8[m
[31m-  |  jmp <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op bit_band, and[m
[31m-  |.ffunc_bit_op bit_bor, or[m
[31m-  |.ffunc_bit_op bit_bxor, xor[m
[31m-  |[m
[31m-  |.ffunc_bit bit_bswap, 1[m
[31m-  |  bswap RBd[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |[m
[31m-  |.ffunc_bit bit_bnot, 1[m
[31m-  |  not RBd[m
[31m-  |.if DUALNUM[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.else[m
[31m-  |->fff_resbit:[m
[31m-  |  cvtsi2sd xmm0, RBd[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->fff_fallback_bit_op:[m
[31m-  |  mov NARGS:RDd, TMPRd		// Restore for fallback[m
[31m-  |  jmp ->fff_fallback[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_bit name, 1, .ffunc_2[m
[31m-  |  // Note: no inline conversion from number for 2nd argument![m
[31m-  |  mov RA, [BASE+8][m
[31m-  |  checkint RA, ->fff_fallback[m
[31m-  |.else[m
[31m-  |  .ffunc_nn name[m
[31m-  |  sseconst_tobit xmm2, RB[m
[31m-  |  addsd xmm0, xmm2[m
[31m-  |  addsd xmm1, xmm2[m
[31m-  |  movd RBd, xmm0[m
[31m-  |  movd RAd, xmm1[m
[31m-  |.endif[m
[31m-  |  ins RBd, cl			// Assumes RA is ecx.[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh bit_lshift, shl[m
[31m-  |.ffunc_bit_sh bit_rshift, shr[m
[31m-  |.ffunc_bit_sh bit_arshift, sar[m
[31m-  |.ffunc_bit_sh bit_rol, rol[m
[31m-  |.ffunc_bit_sh bit_ror, ror[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback_2:[m
[31m-  |  mov NARGS:RDd, 1+2			// Other args are ignored, anyway.[m
[31m-  |  jmp ->fff_fallback[m
[31m-  |->fff_fallback_1:[m
[31m-  |  mov NARGS:RDd, 1+1			// Other args are ignored, anyway.[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RD = nargs+1[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov PC, [BASE-8]			// Fallback may overwrite PC.[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  lea RA, [RD+8*LUA_MINSTACK]	// Ensure enough space for handler.[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov CFUNC:RD, [BASE-16][m
[31m-  |  cleartp CFUNC:RD[m
[31m-  |  cmp RA, L:RB->maxstack[m
[31m-  |  ja >5				// Need to grow stack.[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call aword CFUNC:RD->f		// (lua_State *L)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |  test RDd, RDd; jg ->fff_res	// Returned nresults+1?[m
[31m-  |1:[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  sub RA, BASE[m
[31m-  |  shr RAd, 3[m
[31m-  |  test RDd, RDd[m
[31m-  |  lea NARGS:RDd, [RAd+1][m
[31m-  |  mov LFUNC:RB, [BASE-16][m
[31m-  |  jne ->vm_call_tail			// Returned -1?[m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  mov RA, BASE[m
[31m-  |  test PCd, FRAME_TYPE[m
[31m-  |  jnz >3[m
[31m-  |  movzx RBd, PC_RA[m
[31m-  |  neg RB[m
[31m-  |  lea BASE, [BASE+RB*8-16]		// base = base - (RB+2)*8[m
[31m-  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |3:[m
[31m-  |  mov RB, PC[m
[31m-  |  and RB, -8[m
[31m-  |  sub BASE, RB[m
[31m-  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  mov CARG2d, LUA_MINSTACK[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  xor RDd, RDd			// Simulate a return 0.[m
[31m-  |  jmp <1				// Dumb retry (goes through ff first).[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RD = nargs+1[m
[31m-  |  pop RB				// Must keep stack at same level.[m
[31m-  |  mov TMP1, RB			// Save return address[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  call extern lj_gc_step		// (lua_State *L)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  shr RDd, 3[m
[31m-  |  add NARGS:RDd, 1[m
[31m-  |  mov RB, TMP1[m
[31m-  |  push RB				// Restore return address.[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_VMEVENT		// No recording while in vmevent.[m
[31m-  |  jnz >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |  test RDL, HOOK_ACTIVE[m
[31m-  |  jnz >1[m
[31m-  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  jz >1[m
[31m-  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  jnz >5[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  movzx RDd, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  jnz >5[m
[31m-  |[m
[31m-  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  jz >5[m
[31m-  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[31m-  |  jz >1[m
[31m-  |  test RDL, LUA_MASKLINE[m
[31m-  |  jz >5[m
[31m-  |1:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG2, PC			// Caveat: CARG2 == BASE[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  call extern lj_dispatch_ins	// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |4:[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |5:[m
[31m-  |  movzx OP, PC_OP[m
[31m-  |  movzx RDd, PC_RD[m
[31m-  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Re-dispatch to static ins.[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  add PC, 4[m
[31m-  |  mov RA, [RB-40][m
[31m-  |  mov MULTRES, RAd			// Restore MULTRES for *M ins.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  mov LFUNC:RB, [BASE-16]		// Same as curr_topL(L).[m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  mov RB, LFUNC:RB->pc[m
[31m-  |  movzx RDd, byte [RB+PC2PROTO(framesize)][m
[31m-  |  lea RD, [BASE+RD*8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov CARG2, PC[m
[31m-  |  lea CARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_trace_hot		// (jit_State *J, const BCIns *pc)[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |.if JIT[m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  or PC, 1				// Marker for hot call.[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov CARG2, PC[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_dispatch_call	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // ASMFunction returned in eax/rax (RD).[m
[31m-  |  mov SAVE_PC, 0			// Invalidate for subsequent line hook.[m
[31m-  |.if JIT[m
[31m-  |  and PC, -2[m
[31m-  |.endif[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RA, RD[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  mov RB, RA[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  shr RDd, 3[m
[31m-  |  add NARGS:RDd, 1[m
[31m-  |  jmp RB[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // BASE = base, RC = result, RB = mbase[m
[31m-  |  mov TRACE:ITYPE, [RB-40]		// Save previous trace.[m
[31m-  |  cleartp TRACE:ITYPE[m
[31m-  |  mov TMPRd, MULTRES[m
[31m-  |  movzx RAd, PC_RA[m
[31m-  |  lea RA, [BASE+RA*8]		// Call base.[m
[31m-  |  sub TMPRd, 1[m
[31m-  |  jz >2[m
[31m-  |1:  // Move results down.[m
[31m-  |  mov RB, [RC][m
[31m-  |  mov [RA], RB[m
[31m-  |  add RC, 8[m
[31m-  |  add RA, 8[m
[31m-  |  sub TMPRd, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  movzx RCd, PC_RA[m
[31m-  |  movzx RBd, PC_RB[m
[31m-  |  add RC, RB[m
[31m-  |  lea RC, [BASE+RC*8-8][m
[31m-  |3:[m
[31m-  |  cmp RC, RA[m
[31m-  |  ja >9				// More results wanted?[m
[31m-  |[m
[31m-  |  test TRACE:ITYPE, TRACE:ITYPE[m
[31m-  |  jz ->cont_nop[m
[31m-  |  movzx RBd, word TRACE:ITYPE->traceno[m
[31m-  |  movzx RDd, word TRACE:ITYPE->link[m
[31m-  |  cmp RDd, RBd[m
[31m-  |  je ->cont_nop			// Blacklisted.[m
[31m-  |  test RDd, RDd[m
[31m-  |  jne =>BC_JLOOP			// Jump to stitched trace.[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  mov [DISPATCH+DISPATCH_J(exitno)], RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG2, PC[m
[31m-  |  lea CARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB[m
[31m-  |  call extern lj_dispatch_stitch	// (jit_State *J, const BCIns *pc)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp ->cont_nop[m
[31m-  |[m
[31m-  |9:  // Fill up results with nil.[m
[31m-  |  mov aword [RA], LJ_TNIL[m
[31m-  |  add RA, 8[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov CARG2, PC			// Caveat: CARG2 == BASE[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  call extern lj_dispatch_profile	// (lua_State *L, const BCIns *pc)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  sub PC, 4[m
[31m-  |  jmp ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Called from an exit stub with the exit number on the stack.[m
[31m-  |// The 16 bit exit number is stored with two (sign-extended) push imm8.[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |  push r13; push r12[m
[31m-  |  push r11; push r10; push r9; push r8[m
[31m-  |  push rdi; push rsi; push rbp; lea rbp, [rsp+88]; push rbp[m
[31m-  |  push rbx; push rdx; push rcx; push rax[m
[31m-  |  movzx RCd, byte [rbp-8]		// Reconstruct exit number.[m
[31m-  |  mov RCH, byte [rbp-16][m
[31m-  |  mov [rbp-8], r15; mov [rbp-16], r14[m
[31m-  |  // Caveat: DISPATCH is rbx.[m
[31m-  |  mov DISPATCH, [ebp][m
[31m-  |  mov RAd, [DISPATCH+DISPATCH_GL(vmstate)]	// Get trace number.[m
[31m-  |  set_vmstate EXIT[m
[31m-  |  mov [DISPATCH+DISPATCH_J(exitno)], RCd[m
[31m-  |  mov [DISPATCH+DISPATCH_J(parent)], RAd[m
[31m-  |.if X64WIN[m
[31m-  |  sub rsp, 16*8+4*8			// Room for SSE regs + save area.[m
[31m-  |.else[m
[31m-  |  sub rsp, 16*8			// Room for SSE regs.[m
[31m-  |.endif[m
[31m-  |  add rbp, -128[m
[31m-  |  movsd qword [rbp-8],   xmm15; movsd qword [rbp-16],  xmm14[m
[31m-  |  movsd qword [rbp-24],  xmm13; movsd qword [rbp-32],  xmm12[m
[31m-  |  movsd qword [rbp-40],  xmm11; movsd qword [rbp-48],  xmm10[m
[31m-  |  movsd qword [rbp-56],  xmm9;  movsd qword [rbp-64],  xmm8[m
[31m-  |  movsd qword [rbp-72],  xmm7;  movsd qword [rbp-80],  xmm6[m
[31m-  |  movsd qword [rbp-88],  xmm5;  movsd qword [rbp-96],  xmm4[m
[31m-  |  movsd qword [rbp-104], xmm3;  movsd qword [rbp-112], xmm2[m
[31m-  |  movsd qword [rbp-120], xmm1;  movsd qword [rbp-128], xmm0[m
[31m-  |  // Caveat: RB is rbp.[m
[31m-  |  mov L:RB, [DISPATCH+DISPATCH_GL(cur_L)][m
[31m-  |  mov BASE, [DISPATCH+DISPATCH_GL(jit_base)][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG2, [rsp+4*8][m
[31m-  |.else[m
[31m-  |  mov CARG2, rsp[m
[31m-  |.endif[m
[31m-  |  lea CARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[31m-  |  call extern lj_trace_exit		// (jit_State *J, ExitState *ex)[m
[31m-  |  // MULTRES or negated error code returned in eax (RD).[m
[31m-  |  mov RA, L:RB->cframe[m
[31m-  |  and RA, CFRAME_RAWMASK[m
[31m-  |  mov [RA+CFRAME_OFS_L], L:RB	// Set SAVE_L (on-trace resume/yield).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov PC, [RA+CFRAME_OFS_PC]	// Get SAVE_PC.[m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |  // RD = MULTRES or negated error code, BASE, PC and DISPATCH set.[m
[31m-  |.if JIT[m
[31m-  |  // Restore additional callee-save registers only used in compiled code.[m
[31m-  |.if X64WIN[m
[31m-  |  lea RA, [rsp+10*16+4*8][m
[31m-  |1:[m
[31m-  |  movdqa xmm15, [RA-10*16][m
[31m-  |  movdqa xmm14, [RA-9*16][m
[31m-  |  movdqa xmm13, [RA-8*16][m
[31m-  |  movdqa xmm12, [RA-7*16][m
[31m-  |  movdqa xmm11, [RA-6*16][m
[31m-  |  movdqa xmm10, [RA-5*16][m
[31m-  |  movdqa xmm9, [RA-4*16][m
[31m-  |  movdqa xmm8, [RA-3*16][m
[31m-  |  movdqa xmm7, [RA-2*16][m
[31m-  |  mov rsp, RA			// Reposition stack to C frame.[m
[31m-  |  movdqa xmm6, [RA-1*16][m
[31m-  |  mov r15, CSAVE_1[m
[31m-  |  mov r14, CSAVE_2[m
[31m-  |  mov r13, CSAVE_3[m
[31m-  |  mov r12, CSAVE_4[m
[31m-  |.else[m
[31m-  |  lea RA, [rsp+16][m
[31m-  |1:[m
[31m-  |  mov r13, [RA-8][m
[31m-  |  mov r12, [RA][m
[31m-  |  mov rsp, RA			// Reposition stack to C frame.[m
[31m-  |.endif[m
[31m-  |  test RDd, RDd; js >9		// Check for error from exit.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov MULTRES, RDd[m
[31m-  |  mov LFUNC:KBASE, [BASE-16][m
[31m-  |  cleartp LFUNC:KBASE[m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  mov RCd, [PC][m
[31m-  |  movzx RAd, RCH[m
[31m-  |  movzx OP, RCL[m
[31m-  |  add PC, 4[m
[31m-  |  shr RCd, 16[m
[31m-  |  cmp OP, BC_FUNCF			// Function header?[m
[31m-  |  jb >3[m
[31m-  |  cmp OP, BC_FUNCC+2			// Fast function?[m
[31m-  |  jae >4[m
[31m-  |2:[m
[31m-  |  mov RCd, MULTRES			// RC/RD holds nres+1.[m
[31m-  |3:[m
[31m-  |  jmp aword [DISPATCH+OP*8][m
[31m-  |[m
[31m-  |4:  // Check frame below fast function.[m
[31m-  |  mov RC, [BASE-8][m
[31m-  |  test RCd, FRAME_TYPE[m
[31m-  |  jnz <2				// Trace stitching continuation?[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  movzx RCd, byte [RC-3][m
[31m-  |  neg RC[m
[31m-  |  mov LFUNC:KBASE, [BASE+RC*8-32][m
[31m-  |  cleartp LFUNC:KBASE[m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  neg RD[m
[31m-  |  mov CARG1, L:RB[m
[31m-  |  mov CARG2, RD[m
[31m-  |  call extern lj_err_throw		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP value rounding. Called by math.floor/math.ceil fast functions[m
[31m-  |// and from JIT code. arg/ret is xmm0. xmm0-xmm3 and RD (eax) modified.[m
[31m-  |.macro vm_round, name, mode, cond[m
[31m-  |->name:[m
[31m-  |->name .. _sse:[m
[31m-  |  sseconst_abs xmm2, RD[m
[31m-  |  sseconst_2p52 xmm3, RD[m
[31m-  |  movaps xmm1, xmm0[m
[31m-  |  andpd xmm1, xmm2			// |x|[m
[31m-  |  ucomisd xmm3, xmm1			// No truncation if 2^52 <= |x|.[m
[31m-  |  jbe >1[m
[31m-  |  andnpd xmm2, xmm0			// Isolate sign bit.[m
[31m-  |.if mode == 2		// trunc(x)?[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[31m-  |  subsd xmm1, xmm3[m
[31m-  |  sseconst_1 xmm3, RD[m
[31m-  |  cmpsd xmm0, xmm1, 1		// |x| < result?[m
[31m-  |  andpd xmm0, xmm3[m
[31m-  |  subsd xmm1, xmm0			// If yes, subtract -1.[m
[31m-  |  orpd xmm1, xmm2			// Merge sign bit back in.[m
[31m-  |.else[m
[31m-  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[31m-  |  subsd xmm1, xmm3[m
[31m-  |  orpd xmm1, xmm2			// Merge sign bit back in.[m
[31m-  |  .if mode == 1		// ceil(x)?[m
[31m-  |    sseconst_m1 xmm2, RD		// Must subtract -1 to preserve -0.[m
[31m-  |    cmpsd xmm0, xmm1, 6		// x > result?[m
[31m-  |  .else			// floor(x)?[m
[31m-  |    sseconst_1 xmm2, RD[m
[31m-  |    cmpsd xmm0, xmm1, 1		// x < result?[m
[31m-  |  .endif[m
[31m-  |  andpd xmm0, xmm2[m
[31m-  |  subsd xmm1, xmm0			// If yes, subtract +-1.[m
[31m-  |.endif[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |1:[m
[31m-  |  ret[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  vm_round vm_floor, 0, 1[m
[31m-  |  vm_round vm_ceil,  1, JIT[m
[31m-  |  vm_round vm_trunc, 2, JIT[m
[31m-  |[m
[31m-  |// FP modulo x%y. Called by BC_MOD* and vm_arith.[m
[31m-  |->vm_mod:[m
[31m-  |// Args in xmm0/xmm1, return value in xmm0.[m
[31m-  |// Caveat: xmm0-xmm5 and RC (eax) modified![m
[31m-  |  movaps xmm5, xmm0[m
[31m-  |  divsd xmm0, xmm1[m
[31m-  |  sseconst_abs xmm2, RD[m
[31m-  |  sseconst_2p52 xmm3, RD[m
[31m-  |  movaps xmm4, xmm0[m
[31m-  |  andpd xmm4, xmm2			// |x/y|[m
[31m-  |  ucomisd xmm3, xmm4			// No truncation if 2^52 <= |x/y|.[m
[31m-  |  jbe >1[m
[31m-  |  andnpd xmm2, xmm0			// Isolate sign bit.[m
[31m-  |  addsd xmm4, xmm3			// (|x/y| + 2^52) - 2^52[m
[31m-  |  subsd xmm4, xmm3[m
[31m-  |  orpd xmm4, xmm2			// Merge sign bit back in.[m
[31m-  |  sseconst_1 xmm2, RD[m
[31m-  |  cmpsd xmm0, xmm4, 1		// x/y < result?[m
[31m-  |  andpd xmm0, xmm2[m
[31m-  |  subsd xmm4, xmm0			// If yes, subtract 1.0.[m
[31m-  |  movaps xmm0, xmm5[m
[31m-  |  mulsd xmm1, xmm4[m
[31m-  |  subsd xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |1:[m
[31m-  |  mulsd xmm1, xmm0[m
[31m-  |  movaps xmm0, xmm5[m
[31m-  |  subsd xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |// Args in xmm0/eax. Ret in xmm0. xmm0-xmm1 and eax modified.[m
[31m-  |->vm_powi_sse:[m
[31m-  |  cmp eax, 1; jle >6			// i<=1?[m
[31m-  |  // Now 1 < (unsigned)i <= 0x80000000.[m
[31m-  |1:  // Handle leading zeros.[m
[31m-  |  test eax, 1; jnz >2[m
[31m-  |  mulsd xmm0, xmm0[m
[31m-  |  shr eax, 1[m
[31m-  |  jmp <1[m
[31m-  |2:[m
[31m-  |  shr eax, 1; jz >5[m
[31m-  |  movaps xmm1, xmm0[m
[31m-  |3:  // Handle trailing bits.[m
[31m-  |  mulsd xmm0, xmm0[m
[31m-  |  shr eax, 1; jz >4[m
[31m-  |  jnc <3[m
[31m-  |  mulsd xmm1, xmm0[m
[31m-  |  jmp <3[m
[31m-  |4:[m
[31m-  |  mulsd xmm0, xmm1[m
[31m-  |5:[m
[31m-  |  ret[m
[31m-  |6:[m
[31m-  |  je <5				// x^1 ==> x[m
[31m-  |  jb >7				// x^0 ==> 1[m
[31m-  |  neg eax[m
[31m-  |  call <1[m
[31m-  |  sseconst_1 xmm1, RD[m
[31m-  |  divsd xmm1, xmm0[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |7:[m
[31m-  |  sseconst_1 xmm0, RD[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// int lj_vm_cpuid(uint32_t f, uint32_t res[4])[m
[31m-  |->vm_cpuid:[m
[31m-  |  mov eax, CARG1d[m
[31m-  |  .if X64WIN; push rsi; mov rsi, CARG2; .endif[m
[31m-  |  push rbx[m
[31m-  |  xor ecx, ecx[m
[31m-  |  cpuid[m
[31m-  |  mov [rsi], eax[m
[31m-  |  mov [rsi+4], ebx[m
[31m-  |  mov [rsi+8], ecx[m
[31m-  |  mov [rsi+12], edx[m
[31m-  |  pop rbx[m
[31m-  |  .if X64WIN; pop rsi; .endif[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Assertions ---------------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->assert_bad_for_arg_type:[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  |  int3[m
[31m-#endif[m
[31m-  |  int3[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions. Callback slot number in ah/al.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |  saveregs_	// ebp/rbp already saved. ebp now holds global_State *.[m
[31m-  |  lea DISPATCH, [ebp+GG_G2DISP][m
[31m-  |  mov CTSTATE, GL:ebp->ctype_state[m
[31m-  |  movzx eax, ax[m
[31m-  |  mov CTSTATE->cb.slot, eax[m
[31m-  |  mov CTSTATE->cb.gpr[0], CARG1[m
[31m-  |  mov CTSTATE->cb.gpr[1], CARG2[m
[31m-  |  mov CTSTATE->cb.gpr[2], CARG3[m
[31m-  |  mov CTSTATE->cb.gpr[3], CARG4[m
[31m-  |  movsd qword CTSTATE->cb.fpr[0], xmm0[m
[31m-  |  movsd qword CTSTATE->cb.fpr[1], xmm1[m
[31m-  |  movsd qword CTSTATE->cb.fpr[2], xmm2[m
[31m-  |  movsd qword CTSTATE->cb.fpr[3], xmm3[m
[31m-  |.if X64WIN[m
[31m-  |  lea rax, [rsp+CFRAME_SIZE+4*8][m
[31m-  |.else[m
[31m-  |  lea rax, [rsp+CFRAME_SIZE][m
[31m-  |  mov CTSTATE->cb.gpr[4], CARG5[m
[31m-  |  mov CTSTATE->cb.gpr[5], CARG6[m
[31m-  |  movsd qword CTSTATE->cb.fpr[4], xmm4[m
[31m-  |  movsd qword CTSTATE->cb.fpr[5], xmm5[m
[31m-  |  movsd qword CTSTATE->cb.fpr[6], xmm6[m
[31m-  |  movsd qword CTSTATE->cb.fpr[7], xmm7[m
[31m-  |.endif[m
[31m-  |  mov CTSTATE->cb.stack, rax[m
[31m-  |  mov CARG2, rsp[m
[31m-  |  mov SAVE_PC, CTSTATE		// Any value outside of bytecode is ok.[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |  call extern lj_ccallback_enter	// (CTState *cts, void *cf)[m
[31m-  |  // lua_State * returned in eax (RD).[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov BASE, L:RD->base[m
[31m-  |  mov RD, L:RD->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  mov LFUNC:RB, [BASE-16][m
[31m-  |  cleartp LFUNC:RB[m
[31m-  |  shr RD, 3[m
[31m-  |  add RD, 1[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  mov L:RA, SAVE_L[m
[31m-  |  mov CTSTATE, [DISPATCH+DISPATCH_GL(ctype_state)][m
[31m-  |  mov aword CTSTATE->L, L:RA[m
[31m-  |  mov L:RA->base, BASE[m
[31m-  |  mov L:RA->top, RB[m
[31m-  |  mov CARG1, CTSTATE[m
[31m-  |  mov CARG2, RC[m
[31m-  |  call extern lj_ccallback_leave	// (CTState *cts, TValue *o)[m
[31m-  |  mov rax, CTSTATE->cb.gpr[0][m
[31m-  |  movsd xmm0, qword CTSTATE->cb.fpr[0][m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |  .type CCSTATE, CCallState, rbx[m
[31m-  |  push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1[m
[31m-  |[m
[31m-  |  // Readjust stack.[m
[31m-  |  mov eax, CCSTATE->spadj[m
[31m-  |  sub rsp, rax[m
[31m-  |[m
[31m-  |  // Copy stack slots.[m
[31m-  |  movzx ecx, byte CCSTATE->nsp[m
[31m-  |  sub ecx, 1[m
[31m-  |  js >2[m
[31m-  |1:[m
[31m-  |  mov rax, [CCSTATE+rcx*8+offsetof(CCallState, stack)][m
[31m-  |  mov [rsp+rcx*8+CCALL_SPS_EXTRA*8], rax[m
[31m-  |  sub ecx, 1[m
[31m-  |  jns <1[m
[31m-  |2:[m
[31m-  |[m
[31m-  |  movzx eax, byte CCSTATE->nfpr[m
[31m-  |  mov CARG1, CCSTATE->gpr[0][m
[31m-  |  mov CARG2, CCSTATE->gpr[1][m
[31m-  |  mov CARG3, CCSTATE->gpr[2][m
[31m-  |  mov CARG4, CCSTATE->gpr[3][m
[31m-  |.if not X64WIN[m
[31m-  |  mov CARG5, CCSTATE->gpr[4][m
[31m-  |  mov CARG6, CCSTATE->gpr[5][m
[31m-  |.endif[m
[31m-  |  test eax, eax; jz >5[m
[31m-  |  movaps xmm0, CCSTATE->fpr[0][m
[31m-  |  movaps xmm1, CCSTATE->fpr[1][m
[31m-  |  movaps xmm2, CCSTATE->fpr[2][m
[31m-  |  movaps xmm3, CCSTATE->fpr[3][m
[31m-  |.if not X64WIN[m
[31m-  |  cmp eax, 4; jbe >5[m
[31m-  |  movaps xmm4, CCSTATE->fpr[4][m
[31m-  |  movaps xmm5, CCSTATE->fpr[5][m
[31m-  |  movaps xmm6, CCSTATE->fpr[6][m
[31m-  |  movaps xmm7, CCSTATE->fpr[7][m
[31m-  |.endif[m
[31m-  |5:[m
[31m-  |[m
[31m-  |  call aword CCSTATE->func[m
[31m-  |[m
[31m-  |  mov CCSTATE->gpr[0], rax[m
[31m-  |  movaps CCSTATE->fpr[0], xmm0[m
[31m-  |.if not X64WIN[m
[31m-  |  mov CCSTATE->gpr[1], rdx[m
[31m-  |  movaps CCSTATE->fpr[1], xmm1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  mov rbx, [rbp-8]; leave; ret[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |// Note: aligning all instructions does not pay off.[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  |.macro jmp_comp, lt, ge, le, gt, target[m
[31m-  ||switch (op) {[m
[31m-  ||case BC_ISLT:[m
[31m-  |   lt target[m
[31m-  ||break;[m
[31m-  ||case BC_ISGE:[m
[31m-  |   ge target[m
[31m-  ||break;[m
[31m-  ||case BC_ISLE:[m
[31m-  |   le target[m
[31m-  ||break;[m
[31m-  ||case BC_ISGT:[m
[31m-  |   gt target[m
[31m-  ||break;[m
[31m-  ||default: break;  /* Shut up GCC. */[m
[31m-  ||}[m
[31m-  |.endmacro[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1, RD = src2, JMP with RD = target[m
[31m-    |  ins_AD[m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  mov RA, ITYPE[m
[31m-    |  mov RD, RB[m
[31m-    |  sar ITYPE, 47[m
[31m-    |  sar RB, 47[m
[31m-    |.if DUALNUM[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jne >7[m
[31m-    |  cmp RBd, LJ_TISNUM; jne >8[m
[31m-    |  add PC, 4[m
[31m-    |  cmp RAd, RDd[m
[31m-    |  jmp_comp jge, jl, jg, jle, >9[m
[31m-    |6:[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  ja ->vmeta_comp[m
[31m-    |  // RA is a number.[m
[31m-    |  cmp RBd, LJ_TISNUM; jb >1; jne ->vmeta_comp[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  cvtsi2sd xmm0, RDd[m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RA is an integer, RD is not an integer.[m
[31m-    |  ja ->vmeta_comp[m
[31m-    |  // RA is an integer, RD is a number.[m
[31m-    |  cvtsi2sd xmm1, RAd[m
[31m-    |  movd xmm0, RD[m
[31m-    |  jmp >3[m
[31m-    |.else[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jae ->vmeta_comp[m
[31m-    |  cmp RBd, LJ_TISNUM; jae ->vmeta_comp[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movd xmm0, RD[m
[31m-    |2:[m
[31m-    |  movd xmm1, RA[m
[31m-    |3:[m
[31m-    |  add PC, 4[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  // Unordered: all of ZF CF PF set, ordered: PF clear.[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp_comp jbe, ja, jb, jae, <9[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |  jmp_comp jbe, ja, jb, jae, >1[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  ins_AD	// RA = src1, RD = src2, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  add PC, 4[m
[31m-    |  mov RD, RB[m
[31m-    |  mov RA, ITYPE[m
[31m-    |  sar RB, 47[m
[31m-    |  sar ITYPE, 47[m
[31m-    |.if DUALNUM[m
[31m-    |  cmp RBd, LJ_TISNUM; jne >7[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jne >8[m
[31m-    |  cmp RDd, RAd[m
[31m-    if (vk) {[m
[31m-      |  jne >9[m
[31m-    } else {[m
[31m-      |  je >9[m
[31m-    }[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RD is not an integer.[m
[31m-    |  ja >5[m
[31m-    |  // RD is a number.[m
[31m-    |  movd xmm1, RD[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jb >1; jne >5[m
[31m-    |  // RD is a number, RA is an integer.[m
[31m-    |  cvtsi2sd xmm0, RAd[m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RD is an integer, RA is not an integer.[m
[31m-    |  ja >5[m
[31m-    |  // RD is an integer, RA is a number.[m
[31m-    |  cvtsi2sd xmm1, RDd[m
[31m-    |  jmp >1[m
[31m-    |[m
[31m-    |.else[m
[31m-    |  cmp RBd, LJ_TISNUM; jae >5[m
[31m-    |  cmp ITYPEd, LJ_TISNUM; jae >5[m
[31m-    |  movd xmm1, RD[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movd xmm0, RA[m
[31m-    |2:[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |4:[m
[31m-  iseqne_fp:[m
[31m-    if (vk) {[m
[31m-      |  jp >2				// Unordered means not equal.[m
[31m-      |  jne >2[m
[31m-    } else {[m
[31m-      |  jp >2				// Unordered means not equal.[m
[31m-      |  je >1[m
[31m-    }[m
[31m-  iseqne_end:[m
[31m-    if (vk) {[m
[31m-      |1:				// EQ: Branch to the target.[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:				// NE: Fallthrough to next instruction.[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-      |2:				// NE: Branch to the target.[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |1:				// EQ: Fallthrough to next instruction.[m
[31m-    }[m
[31m-    if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||[m
[31m-		       op == BC_ISEQN || op == BC_ISNEN)) {[m
[31m-      |  jmp <9[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    if (op == BC_ISEQV || op == BC_ISNEV) {[m
[31m-      |5:  // Either or both types are not numbers.[m
[31m-      |.if FFI[m
[31m-      |  cmp RBd, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |  cmp ITYPEd, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |.endif[m
[31m-      |  cmp RA, RD[m
[31m-      |  je <1				// Same GCobjs or pvalues?[m
[31m-      |  cmp RBd, ITYPEd[m
[31m-      |  jne <2				// Not the same type?[m
[31m-      |  cmp RBd, LJ_TISTABUD[m
[31m-      |  ja <2				// Different objects and not table/ud?[m
[31m-      |[m
[31m-      |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-      |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-      |  cleartp TAB:RA[m
[31m-      |  mov TAB:RB, TAB:RA->metatable[m
[31m-      |  test TAB:RB, TAB:RB[m
[31m-      |  jz <2				// No metatable?[m
[31m-      |  test byte TAB:RB->nomm, 1<<MM_eq[m
[31m-      |  jnz <2				// Or 'no __eq' flag set?[m
[31m-      if (vk) {[m
[31m-	|  xor RBd, RBd			// ne = 0[m
[31m-      } else {[m
[31m-	|  mov RBd, 1			// ne = 1[m
[31m-      }[m
[31m-      |  jmp ->vmeta_equal		// Handle __eq metamethod.[m
[31m-    } else {[m
[31m-      |.if FFI[m
[31m-      |3:[m
[31m-      |  cmp ITYPEd, LJ_TCDATA[m
[31m-      if (LJ_DUALNUM && vk) {[m
[31m-	|  jne <9[m
[31m-      } else {[m
[31m-	|  jne <2[m
[31m-      }[m
[31m-      |  jmp ->vmeta_equal_cd[m
[31m-      |.endif[m
[31m-    }[m
[31m-    break;[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  ins_AND	// RA = src, RD = str const, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  add PC, 4[m
[31m-    |  checkstr RB, >3[m
[31m-    |  cmp RB, [KBASE+RD*8][m
[31m-  iseqne_test:[m
[31m-    if (vk) {[m
[31m-      |  jne >2[m
[31m-    } else {[m
[31m-      |  je >1[m
[31m-    }[m
[31m-    goto iseqne_end;[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  ins_AD	// RA = src, RD = num const, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  add PC, 4[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RB, >7[m
[31m-    |  mov RD, [KBASE+RD*8][m
[31m-    |  checkint RD, >8[m
[31m-    |  cmp RBd, RDd[m
[31m-    if (vk) {[m
[31m-      |  jne >9[m
[31m-    } else {[m
[31m-      |  je >9[m
[31m-    }[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  ja >3[m
[31m-    |  // RA is a number.[m
[31m-    |  mov RD, [KBASE+RD*8][m
[31m-    |  checkint RD, >1[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  cvtsi2sd xmm0, RDd[m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RA is an integer, RD is a number.[m
[31m-    |  cvtsi2sd xmm0, RBd[m
[31m-    |  movd xmm1, RD[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jmp >4[m
[31m-    |1:[m
[31m-    |  movd xmm0, RD[m
[31m-    |.else[m
[31m-    |  checknum RB, >3[m
[31m-    |1:[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |.endif[m
[31m-    |2:[m
[31m-    |  ucomisd xmm0, qword [BASE+RA*8][m
[31m-    |4:[m
[31m-    goto iseqne_fp;[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  ins_AND	// RA = src, RD = primitive type (~), JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  sar RB, 47[m
[31m-    |  add PC, 4[m
[31m-    |  cmp RBd, RDd[m
[31m-    if (!LJ_HASFFI) goto iseqne_test;[m
[31m-    if (vk) {[m
[31m-      |  jne >3[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:[m
[31m-      |  ins_next[m
[31m-      |3:[m
[31m-      |  cmp RBd, LJ_TCDATA; jne <2[m
[31m-      |  jmp ->vmeta_equal_cd[m
[31m-    } else {[m
[31m-      |  je >2[m
[31m-      |  cmp RBd, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  ins_AD	// RA = dst or unused, RD = src, JMP with RD = target[m
[31m-    |  mov ITYPE, [BASE+RD*8][m
[31m-    |  add PC, 4[m
[31m-    if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-      |  mov RB, ITYPE[m
[31m-    }[m
[31m-    |  sar ITYPE, 47[m
[31m-    |  cmp ITYPEd, LJ_TISTRUECOND[m
[31m-    if (op == BC_IST || op == BC_ISTC) {[m
[31m-      |  jae >1[m
[31m-    } else {[m
[31m-      |  jb >1[m
[31m-    }[m
[31m-    if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-      |  mov [BASE+RA*8], RB[m
[31m-    }[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |1:					// Fallthrough to the next instruction.[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  ins_AD	// RA = src, RD = -type[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  sar RB, 47[m
[31m-    |  add RBd, RDd[m
[31m-    |  jne ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  ins_AD	// RA = src, RD = -(TISNUM-1)[m
[31m-    |  checknumtp [BASE+RA*8], ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  sar RB, 47[m
[31m-    |  mov RCd, 2[m
[31m-    |  cmp RB, LJ_TISTRUECOND[m
[31m-    |  sbb RCd, 0[m
[31m-    |  shl RC, 47[m
[31m-    |  not RC[m
[31m-    |  mov [BASE+RA*8], RC[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RB, >5[m
[31m-    |  neg RBd[m
[31m-    |  jo >4[m
[31m-    |  setint RB[m
[31m-    |9:[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  ins_next[m
[31m-    |4:[m
[31m-    |  mov64 RB, U64x(41e00000,00000000)  // 2^31.[m
[31m-    |  jmp <9[m
[31m-    |5:[m
[31m-    |  ja ->vmeta_unm[m
[31m-    |.else[m
[31m-    |  checknum RB, ->vmeta_unm[m
[31m-    |.endif[m
[31m-    |  mov64 RD, U64x(80000000,00000000)[m
[31m-    |  xor RB, RD[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp <9[m
[31m-    |.else[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  mov RD, [BASE+RD*8][m
[31m-    |  checkstr RD, >2[m
[31m-    |.if DUALNUM[m
[31m-    |  mov RDd, dword STR:RD->len[m
[31m-    |1:[m
[31m-    |  setint RD[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |.else[m
[31m-    |  xorps xmm0, xmm0[m
[31m-    |  cvtsi2sd xmm0, dword STR:RD->len[m
[31m-    |1:[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |2:[m
[31m-    |  cmp ITYPEd, LJ_TTAB; jne ->vmeta_len[m
[31m-    |  mov TAB:CARG1, TAB:RD[m
[31m-#if LJ_52[m
[31m-    |  mov TAB:RB, TAB:RD->metatable[m
[31m-    |  cmp TAB:RB, 0[m
[31m-    |  jnz >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  mov RB, BASE			// Save BASE.[m
[31m-    |  call extern lj_tab_len		// (GCtab *t)[m
[31m-    |  // Length of table returned in eax (RD).[m
[31m-    |.if DUALNUM[m
[31m-    |  // Nothing to do.[m
[31m-    |.else[m
[31m-    |  cvtsi2sd xmm0, RDd[m
[31m-    |.endif[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  jmp <1[m
[31m-#if LJ_52[m
[31m-    |9:  // Check for __len.[m
[31m-    |  test byte TAB:RB->nomm, 1<<MM_len[m
[31m-    |  jnz <3[m
[31m-    |  jmp ->vmeta_len			// 'no __len' flag NOT set: check.[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithpre, sseins, ssereg[m
[31m-    |  ins_ABC[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   checknumtp [BASE+RB*8], ->vmeta_arith_vn[m
[31m-    |   .if DUALNUM[m
[31m-    |     checknumtp [KBASE+RC*8], ->vmeta_arith_vn[m
[31m-    |   .endif[m
[31m-    |   movsd xmm0, qword [BASE+RB*8][m
[31m-    |   sseins ssereg, qword [KBASE+RC*8][m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   checknumtp [BASE+RB*8], ->vmeta_arith_nv[m
[31m-    |   .if DUALNUM[m
[31m-    |     checknumtp [KBASE+RC*8], ->vmeta_arith_nv[m
[31m-    |   .endif[m
[31m-    |   movsd xmm0, qword [KBASE+RC*8][m
[31m-    |   sseins ssereg, qword [BASE+RB*8][m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   checknumtp [BASE+RB*8], ->vmeta_arith_vv[m
[31m-    |   checknumtp [BASE+RC*8], ->vmeta_arith_vv[m
[31m-    |   movsd xmm0, qword [BASE+RB*8][m
[31m-    |   sseins ssereg, qword [BASE+RC*8][m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins[m
[31m-    |  ins_ABC[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   mov RC, [KBASE+RC*8][m
[31m-    |   checkint RB, ->vmeta_arith_vno[m
[31m-    |   checkint RC, ->vmeta_arith_vno[m
[31m-    |   intins RBd, RCd; jo ->vmeta_arith_vno[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   mov RC, [KBASE+RC*8][m
[31m-    |   checkint RB, ->vmeta_arith_nvo[m
[31m-    |   checkint RC, ->vmeta_arith_nvo[m
[31m-    |   intins RCd, RBd; jo ->vmeta_arith_nvo[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   mov RC, [BASE+RC*8][m
[31m-    |   checkint RB, ->vmeta_arith_vvo[m
[31m-    |   checkint RC, ->vmeta_arith_vvo[m
[31m-    |   intins RBd, RCd; jo ->vmeta_arith_vvo[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    ||if (vk == 1) {[m
[31m-    |   setint RC[m
[31m-    |   mov [BASE+RA*8], RC[m
[31m-    ||} else {[m
[31m-    |   setint RB[m
[31m-    |   mov [BASE+RA*8], RB[m
[31m-    ||}[m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpost[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, sseins[m
[31m-    |  ins_arithpre sseins, xmm0[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, intins, sseins[m
[31m-    |.if DUALNUM[m
[31m-    |  ins_arithdn intins[m
[31m-    |.else[m
[31m-    |  ins_arith, sseins[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-[m
[31m-    |  // RA = dst, RB = src1 or num const, RC = src2 or num const[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arith add, addsd[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arith sub, subsd[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arith imul, mulsd[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arith divsd[m
[31m-    break;[m
[31m-  case BC_MODVN:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |->BC_MODVN_Z:[m
[31m-    |  call ->vm_mod[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |  jmp ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |  mov RB, BASE[m
[31m-    |  call extern pow[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  mov BASE, RB[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  ins_ABC	// RA = dst, RB = src_start, RC = src_end[m
[31m-    |  mov L:CARG1, SAVE_L[m
[31m-    |  mov L:CARG1->base, BASE[m
[31m-    |  lea CARG2, [BASE+RC*8][m
[31m-    |  mov CARG3d, RCd[m
[31m-    |  sub CARG3d, RBd[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  mov L:RB, L:CARG1[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  test RC, RC[m
[31m-    |  jnz ->vmeta_binop[m
[31m-    |  movzx RBd, PC_RB			// Copy result to Stk[RA] from Stk[RB].[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  mov RC, [BASE+RB*8][m
[31m-    |  mov [BASE+RA*8], RC[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  ins_AND	// RA = dst, RD = str const (~)[m
[31m-    |  mov RD, [KBASE+RD*8][m
[31m-    |  settp RD, LJ_TSTR[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  ins_AND	// RA = dst, RD = cdata const (~)[m
[31m-    |  mov RD, [KBASE+RD*8][m
[31m-    |  settp RD, LJ_TCDATA[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  ins_AD	// RA = dst, RD = signed int16 literal[m
[31m-    |.if DUALNUM[m
[31m-    |  movsx RDd, RDW[m
[31m-    |  setint RD[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |.else[m
[31m-    |  movsx RDd, RDW			// Sign-extend literal.[m
[31m-    |  cvtsi2sd xmm0, RDd[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  ins_AD	// RA = dst, RD = num const[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  ins_AD	// RA = dst, RD = primitive type (~)[m
[31m-    |  shl RD, 47[m
[31m-    |  not RD[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  ins_AD	// RA = dst_start, RD = dst_end[m
[31m-    |  lea RA, [BASE+RA*8+8][m
[31m-    |  lea RD, [BASE+RD*8][m
[31m-    |  mov RB, LJ_TNIL[m
[31m-    |  mov [RA-8], RB			// Sets minimum 2 slots.[m
[31m-    |1:[m
[31m-    |  mov [RA], RB[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RD[m
[31m-    |  jbe <1[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  ins_AD	// RA = dst, RD = upvalue #[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RD*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RB, UPVAL:RB->v[m
[31m-    |  mov RD, [RB][m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-#define TV2MARKOFS \[m
[31m- ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))[m
[31m-    |  ins_AD	// RA = upvalue #, RD = src[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  cmp byte UPVAL:RB->closed, 0[m
[31m-    |  mov RB, UPVAL:RB->v[m
[31m-    |  mov RA, [BASE+RD*8][m
[31m-    |  mov [RB], RA[m
[31m-    |  jz >1[m
[31m-    |  // Check barrier for closed upvalue.[m
[31m-    |  test byte [RB+TV2MARKOFS], LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  jnz >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Upvalue is black. Check if new value is collectable and white.[m
[31m-    |  mov RD, RA[m
[31m-    |  sar RD, 47[m
[31m-    |  sub RDd, LJ_TISGCV[m
[31m-    |  cmp RDd, LJ_TNUMX - LJ_TISGCV			// tvisgcv(v)[m
[31m-    |  jbe <1[m
[31m-    |  cleartp GCOBJ:RA[m
[31m-    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(v)[m
[31m-    |  jz <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |.if not X64WIN[m
[31m-    |  mov CARG2, RB[m
[31m-    |  mov RB, BASE			// Save BASE.[m
[31m-    |.else[m
[31m-    |  xchg CARG2, RB			// Save BASE (CARG2 == BASE).[m
[31m-    |.endif[m
[31m-    |  lea GL:CARG1, [DISPATCH+GG_DISP2G][m
[31m-    |  call extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-#undef TV2MARKOFS[m
[31m-  case BC_USETS:[m
[31m-    |  ins_AND	// RA = upvalue #, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov STR:RA, [KBASE+RD*8][m
[31m-    |  mov RD, UPVAL:RB->v[m
[31m-    |  settp STR:ITYPE, STR:RA, LJ_TSTR[m
[31m-    |  mov [RD], STR:ITYPE[m
[31m-    |  test byte UPVAL:RB->marked, LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  jnz >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(str)[m
[31m-    |  jz <1[m
[31m-    |  cmp byte UPVAL:RB->closed, 0[m
[31m-    |  jz <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  mov RB, BASE			// Save BASE (CARG2 == BASE).[m
[31m-    |  mov CARG2, RD[m
[31m-    |  lea GL:CARG1, [DISPATCH+GG_DISP2G][m
[31m-    |  call extern lj_gc_barrieruv	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  ins_AD	// RA = upvalue #, RD = num const[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RA, UPVAL:RB->v[m
[31m-    |  movsd qword [RA], xmm0[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  ins_AD	// RA = upvalue #, RD = primitive type (~)[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)][m
[31m-    |  shl RD, 47[m
[31m-    |  not RD[m
[31m-    |  mov RA, UPVAL:RB->v[m
[31m-    |  mov [RA], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UCLO:[m
[31m-    |  ins_AD	// RA = level, RD = target[m
[31m-    |  branchPC RD			// Do this first to free RD.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  cmp aword L:RB->openupval, 0[m
[31m-    |  je >1[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  lea CARG2, [BASE+RA*8]		// Caveat: CARG2 == BASE[m
[31m-    |  mov L:CARG1, L:RB		// Caveat: CARG1 == RA[m
[31m-    |  call extern lj_func_closeuv	// (lua_State *L, TValue *level)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  ins_AND	// RA = dst, RD = proto const (~) (holding function prototype)[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-    |  mov CARG3, [BASE-16][m
[31m-    |  cleartp CARG3[m
[31m-    |  mov CARG2, [KBASE+RD*8]		// Fetch GCproto *.[m
[31m-    |  mov CARG1, L:RB[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  call extern lj_func_newL_gc[m
[31m-    |  // GCfuncL * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  settp LFUNC:RC, LJ_TFUNC[m
[31m-    |  mov [BASE+RA*8], LFUNC:RC[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-    |  ins_AD	// RA = dst, RD = hbits|asize[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  jae >5[m
[31m-    |1:[m
[31m-    |  mov CARG3d, RDd[m
[31m-    |  and RDd, 0x7ff[m
[31m-    |  shr CARG3d, 11[m
[31m-    |  cmp RDd, 0x7ff[m
[31m-    |  je >3[m
[31m-    |2:[m
[31m-    |  mov L:CARG1, L:RB[m
[31m-    |  mov CARG2d, RDd[m
[31m-    |  call extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-    |  // Table * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  settp TAB:RC, LJ_TTAB[m
[31m-    |  mov [BASE+RA*8], TAB:RC[m
[31m-    |  ins_next[m
[31m-    |3:  // Turn 0x7ff into 0x801.[m
[31m-    |  mov RDd, 0x801[m
[31m-    |  jmp <2[m
[31m-    |5:[m
[31m-    |  mov L:CARG1, L:RB[m
[31m-    |  call extern lj_gc_step_fixtop	// (lua_State *L)[m
[31m-    |  movzx RDd, PC_RD[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_TDUP:[m
[31m-    |  ins_AND	// RA = dst, RD = table const (~) (holding template table)[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  jae >3[m
[31m-    |2:[m
[31m-    |  mov TAB:CARG2, [KBASE+RD*8]	// Caveat: CARG2 == BASE[m
[31m-    |  mov L:CARG1, L:RB		// Caveat: CARG1 == RA[m
[31m-    |  call extern lj_tab_dup		// (lua_State *L, Table *kt)[m
[31m-    |  // Table * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  settp TAB:RC, LJ_TTAB[m
[31m-    |  mov [BASE+RA*8], TAB:RC[m
[31m-    |  ins_next[m
[31m-    |3:[m
[31m-    |  mov L:CARG1, L:RB[m
[31m-    |  call extern lj_gc_step_fixtop	// (lua_State *L)[m
[31m-    |  movzx RDd, PC_RD			// Need to reload RD.[m
[31m-    |  not RD[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  ins_AND	// RA = dst, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov TAB:RB, LFUNC:RB->env[m
[31m-    |  mov STR:RC, [KBASE+RD*8][m
[31m-    |  jmp ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_GSET:[m
[31m-    |  ins_AND	// RA = src, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov TAB:RB, LFUNC:RB->env[m
[31m-    |  mov STR:RC, [KBASE+RD*8][m
[31m-    |  jmp ->BC_TSETS_Z[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  mov RC, [BASE+RC*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tgetv[m
[31m-    |[m
[31m-    |  // Integer key?[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RC, >5[m
[31m-    |.else[m
[31m-    |  // Convert number to int and back and compare.[m
[31m-    |  checknum RC, >5[m
[31m-    |  movd xmm0, RC[m
[31m-    |  cvttsd2si RCd, xmm0[m
[31m-    |  cvtsi2sd xmm1, RCd[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jne ->vmeta_tgetv		// Generic numeric key? Use fallback.[m
[31m-    |.endif[m
[31m-    |  cmp RCd, TAB:RB->asize		// Takes care of unordered, too.[m
[31m-    |  jae ->vmeta_tgetv		// Not in array part? Use fallback.[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Get array slot.[m
[31m-    |  mov ITYPE, [RC][m
[31m-    |  cmp ITYPE, LJ_TNIL		// Avoid overwriting RB in fastpath.[m
[31m-    |  je >2[m
[31m-    |1:[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <1[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_index[m
[31m-    |  jz ->vmeta_tgetv			// 'no __index' flag NOT set: check.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // String key?[m
[31m-    |  cmp ITYPEd, LJ_TSTR; jne ->vmeta_tgetv[m
[31m-    |  cleartp STR:RC[m
[31m-    |  jmp ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = str const (~)[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  not RC[m
[31m-    |  mov STR:RC, [KBASE+RC*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tgets[m
[31m-    |->BC_TGETS_Z:	// RB = GCtab *, RC = GCstr *[m
[31m-    |  mov TMPRd, TAB:RB->hmask[m
[31m-    |  and TMPRd, STR:RC->hash[m
[31m-    |  imul TMPRd, #NODE[m
[31m-    |  add NODE:TMPR, TAB:RB->node[m
[31m-    |  settp ITYPE, STR:RC, LJ_TSTR[m
[31m-    |1:[m
[31m-    |  cmp NODE:TMPR->key, ITYPE[m
[31m-    |  jne >4[m
[31m-    |  // Get node value.[m
[31m-    |  mov ITYPE, NODE:TMPR->val[m
[31m-    |  cmp ITYPE, LJ_TNIL[m
[31m-    |  je >5				// Key found, but nil value?[m
[31m-    |2:[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  mov NODE:TMPR, NODE:TMPR->next[m
[31m-    |  test NODE:TMPR, NODE:TMPR[m
[31m-    |  jnz <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |  mov ITYPE, LJ_TNIL[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <2				// No metatable: done.[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_index[m
[31m-    |  jnz <2				// 'no __index' flag set: done.[m
[31m-    |  jmp ->vmeta_tgets		// Caveat: preserve STR:RC.[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = byte literal[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tgetb[m
[31m-    |  cmp RCd, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tgetb[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Get array slot.[m
[31m-    |  mov ITYPE, [RC][m
[31m-    |  cmp ITYPE, LJ_TNIL[m
[31m-    |  je >2[m
[31m-    |1:[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <1[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_index[m
[31m-    |  jz ->vmeta_tgetb			// 'no __index' flag NOT set: check.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  cleartp TAB:RB[m
[31m-    |.if DUALNUM[m
[31m-    |  mov RCd, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  cvttsd2si RCd, qword [BASE+RC*8][m
[31m-    |.endif[m
[31m-    |  cmp RCd, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tgetr		// Not in array part? Use fallback.[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Get array slot.[m
[31m-    |->BC_TGETR_Z:[m
[31m-    |  mov ITYPE, [RC][m
[31m-    |->BC_TGETR2_Z:[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  mov RC, [BASE+RC*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tsetv[m
[31m-    |[m
[31m-    |  // Integer key?[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RC, >5[m
[31m-    |.else[m
[31m-    |  // Convert number to int and back and compare.[m
[31m-    |  checknum RC, >5[m
[31m-    |  movd xmm0, RC[m
[31m-    |  cvttsd2si RCd, xmm0[m
[31m-    |  cvtsi2sd xmm1, RCd[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jne ->vmeta_tsetv		// Generic numeric key? Use fallback.[m
[31m-    |.endif[m
[31m-    |  cmp RCd, TAB:RB->asize		// Takes care of unordered, too.[m
[31m-    |  jae ->vmeta_tsetv[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp aword [RC], LJ_TNIL[m
[31m-    |  je >3				// Previous value is nil?[m
[31m-    |1:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:  // Set array slot.[m
[31m-    |  mov RB, [BASE+RA*8][m
[31m-    |  mov [RC], RB[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <1[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsetv			// 'no __newindex' flag NOT set: check.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // String key?[m
[31m-    |  cmp ITYPEd, LJ_TSTR; jne ->vmeta_tsetv[m
[31m-    |  cleartp STR:RC[m
[31m-    |  jmp ->BC_TSETS_Z[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMPR[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = str const (~)[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  not RC[m
[31m-    |  mov STR:RC, [KBASE+RC*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tsets[m
[31m-    |->BC_TSETS_Z:	// RB = GCtab *, RC = GCstr *[m
[31m-    |  mov TMPRd, TAB:RB->hmask[m
[31m-    |  and TMPRd, STR:RC->hash[m
[31m-    |  imul TMPRd, #NODE[m
[31m-    |  mov byte TAB:RB->nomm, 0		// Clear metamethod cache.[m
[31m-    |  add NODE:TMPR, TAB:RB->node[m
[31m-    |  settp ITYPE, STR:RC, LJ_TSTR[m
[31m-    |1:[m
[31m-    |  cmp NODE:TMPR->key, ITYPE[m
[31m-    |  jne >5[m
[31m-    |  // Ok, key found. Assumes: offsetof(Node, val) == 0[m
[31m-    |  cmp aword [TMPR], LJ_TNIL[m
[31m-    |  je >4				// Previous value is nil?[m
[31m-    |2:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |3:  // Set node value.[m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  mov [TMPR], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  mov TAB:ITYPE, TAB:RB->metatable[m
[31m-    |  test TAB:ITYPE, TAB:ITYPE[m
[31m-    |  jz <2[m
[31m-    |  test byte TAB:ITYPE->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  mov NODE:TMPR, NODE:TMPR->next[m
[31m-    |  test NODE:TMPR, NODE:TMPR[m
[31m-    |  jnz <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz >6				// No metatable: continue.[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[31m-    |6:[m
[31m-    |  mov TMP1, ITYPE[m
[31m-    |  mov L:CARG1, SAVE_L[m
[31m-    |  mov L:CARG1->base, BASE[m
[31m-    |  lea CARG3, TMP1[m
[31m-    |  mov CARG2, TAB:RB[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_tab_newkey	// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Handles write barrier for the new key. TValue * returned in eax (RC).[m
[31m-    |  mov L:CARG1, SAVE_L[m
[31m-    |  mov BASE, L:CARG1->base[m
[31m-    |  mov TMPR, rax[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  jmp <2				// Must check write barrier for value.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, ITYPE[m
[31m-    |  jmp <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = byte literal[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  checktab TAB:RB, ->vmeta_tsetb[m
[31m-    |  cmp RCd, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tsetb[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp aword [RC], LJ_TNIL[m
[31m-    |  je >3				// Previous value is nil?[m
[31m-    |1:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:	 // Set array slot.[m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  mov [RC], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  mov TAB:TMPR, TAB:RB->metatable[m
[31m-    |  test TAB:TMPR, TAB:TMPR[m
[31m-    |  jz <1[m
[31m-    |  test byte TAB:TMPR->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsetb			// 'no __newindex' flag NOT set: check.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMPR[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  cleartp TAB:RB[m
[31m-    |.if DUALNUM[m
[31m-    |  mov RC, [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  cvttsd2si RCd, qword [BASE+RC*8][m
[31m-    |.endif[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:[m
[31m-    |  cmp RCd, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tsetr[m
[31m-    |  shl RCd, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Set array slot.[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |  mov ITYPE, [BASE+RA*8][m
[31m-    |  mov [RC], ITYPE[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, TMPR[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  ins_AD	// RA = base (table at base-1), RD = num const (start index)[m
[31m-    |1:[m
[31m-    |  mov TMPRd, dword [KBASE+RD*8]	// Integer constant is in lo-word.[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  mov TAB:RB, [RA-8]		// Guaranteed to be a table.[m
[31m-    |  cleartp TAB:RB[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:[m
[31m-    |  mov RDd, MULTRES[m
[31m-    |  sub RDd, 1[m
[31m-    |  jz >4				// Nothing to copy?[m
[31m-    |  add RDd, TMPRd			// Compute needed size.[m
[31m-    |  cmp RDd, TAB:RB->asize[m
[31m-    |  ja >5				// Doesn't fit into array part?[m
[31m-    |  sub RDd, TMPRd[m
[31m-    |  shl TMPRd, 3[m
[31m-    |  add TMPR, TAB:RB->array[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |  mov RB, [RA][m
[31m-    |  add RA, 8[m
[31m-    |  mov [TMPR], RB[m
[31m-    |  add TMPR, 8[m
[31m-    |  sub RDd, 1[m
[31m-    |  jnz <3[m
[31m-    |4:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |  mov L:CARG1, SAVE_L[m
[31m-    |  mov L:CARG1->base, BASE		// Caveat: CARG2/CARG3 may be BASE.[m
[31m-    |  mov CARG2, TAB:RB[m
[31m-    |  mov CARG3d, RDd[m
[31m-    |  mov L:RB, L:CARG1[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_tab_reasize	// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RAd, PC_RA			// Restore RA.[m
[31m-    |  movzx RDd, PC_RD			// Restore RD.[m
[31m-    |  jmp <1				// Retry.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RD[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALL: case BC_CALLM:[m
[31m-    |  ins_A_C	// RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs[m
[31m-    if (op == BC_CALLM) {[m
[31m-      |  add NARGS:RDd, MULTRES[m
[31m-    }[m
[31m-    |  mov LFUNC:RB, [BASE+RA*8][m
[31m-    |  checkfunc LFUNC:RB, ->vmeta_call_ra[m
[31m-    |  lea BASE, [BASE+RA*8+16][m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  ins_AD	// RA = base, RD = extra_nargs[m
[31m-    |  add NARGS:RDd, MULTRES[m
[31m-    |  // Fall through. Assumes BC_CALLT follows and ins_AD is a no-op.[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  ins_AD	// RA = base, RD = nargs+1[m
[31m-    |  lea RA, [BASE+RA*8+16][m
[31m-    |  mov KBASE, BASE			// Use KBASE for move + vmeta_call hint.[m
[31m-    |  mov LFUNC:RB, [RA-16][m
[31m-    |  checktp_nc LFUNC:RB, LJ_TFUNC, ->vmeta_call[m
[31m-    |->BC_CALLT_Z:[m
[31m-    |  mov PC, [BASE-8][m
[31m-    |  test PCd, FRAME_TYPE[m
[31m-    |  jnz >7[m
[31m-    |1:[m
[31m-    |  mov [BASE-16], LFUNC:RB		// Copy func+tag down, reloaded below.[m
[31m-    |  mov MULTRES, NARGS:RDd[m
[31m-    |  sub NARGS:RDd, 1[m
[31m-    |  jz >3[m
[31m-    |2:  // Move args down.[m
[31m-    |  mov RB, [RA][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE], RB[m
[31m-    |  add KBASE, 8[m
[31m-    |  sub NARGS:RDd, 1[m
[31m-    |  jnz <2[m
[31m-    |[m
[31m-    |  mov LFUNC:RB, [BASE-16][m
[31m-    |3:[m
[31m-    |  cleartp LFUNC:RB[m
[31m-    |  mov NARGS:RDd, MULTRES[m
[31m-    |  cmp byte LFUNC:RB->ffid, 1	// (> FF_C) Calling a fast function?[m
[31m-    |  ja >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function.[m
[31m-    |  test PCd, FRAME_TYPE		// Lua frame below?[m
[31m-    |  jnz <4[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  neg RA[m
[31m-    |  mov LFUNC:KBASE, [BASE+RA*8-32]	// Need to prepare KBASE.[m
[31m-    |  cleartp LFUNC:KBASE[m
[31m-    |  mov KBASE, LFUNC:KBASE->pc[m
[31m-    |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-    |  jmp <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  sub PC, FRAME_VARG[m
[31m-    |  test PCd, FRAME_TYPEP[m
[31m-    |  jnz >8				// Vararg frame below?[m
[31m-    |  sub BASE, PC			// Need to relocate BASE/KBASE down.[m
[31m-    |  mov KBASE, BASE[m
[31m-    |  mov PC, [BASE-8][m
[31m-    |  jmp <1[m
[31m-    |8:[m
[31m-    |  add PCd, FRAME_VARG[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  ins_A	// RA = base, (RB = nresults+1,) RC = nargs+1 (2+1)[m
[31m-    |  lea RA, [BASE+RA*8+16]		// fb = base+2[m
[31m-    |  mov RB, [RA-32]			// Copy state. fb[0] = fb[-4].[m
[31m-    |  mov RC, [RA-24]			// Copy control var. fb[1] = fb[-3].[m
[31m-    |  mov [RA], RB[m
[31m-    |  mov [RA+8], RC[m
[31m-    |  mov LFUNC:RB, [RA-40]		// Copy callable. fb[-2] = fb[-5][m
[31m-    |  mov [RA-16], LFUNC:RB[m
[31m-    |  mov NARGS:RDd, 2+1		// Handle like a regular 2-arg call.[m
[31m-    |  checkfunc LFUNC:RB, ->vmeta_call[m
[31m-    |  mov BASE, RA[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  ins_A	// RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  mov TAB:RB, [BASE+RA*8-16][m
[31m-    |  cleartp TAB:RB[m
[31m-    |  mov RCd, [BASE+RA*8-8]		// Get index from control var.[m
[31m-    |  mov TMPRd, TAB:RB->asize[m
[31m-    |  add PC, 4[m
[31m-    |  mov ITYPE, TAB:RB->array[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  cmp RCd, TMPRd; jae >5		// Index points after array part?[m
[31m-    |  cmp aword [ITYPE+RC*8], LJ_TNIL; je >4[m
[31m-    |.if not DUALNUM[m
[31m-    |  cvtsi2sd xmm0, RCd[m
[31m-    |.endif[m
[31m-    |  // Copy array slot to returned value.[m
[31m-    |  mov RB, [ITYPE+RC*8][m
[31m-    |  mov [BASE+RA*8+8], RB[m
[31m-    |  // Return array index as a numeric key.[m
[31m-    |.if DUALNUM[m
[31m-    |  setint ITYPE, RC[m
[31m-    |  mov [BASE+RA*8], ITYPE[m
[31m-    |.else[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  add RCd, 1[m
[31m-    |  mov [BASE+RA*8-8], RCd		// Update control var.[m
[31m-    |2:[m
[31m-    |  movzx RDd, PC_RD			// Get target from ITERL.[m
[31m-    |  branchPC RD[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Skip holes in array part.[m
[31m-    |  add RCd, 1[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  sub RCd, TMPRd[m
[31m-    |6:[m
[31m-    |  cmp RCd, TAB:RB->hmask; ja <3	// End of iteration? Branch to ITERL+1.[m
[31m-    |  imul ITYPEd, RCd, #NODE[m
[31m-    |  add NODE:ITYPE, TAB:RB->node[m
[31m-    |  cmp aword NODE:ITYPE->val, LJ_TNIL; je >7[m
[31m-    |  lea TMPRd, [RCd+TMPRd+1][m
[31m-    |  // Copy key and value from hash slot.[m
[31m-    |  mov RB, NODE:ITYPE->key[m
[31m-    |  mov RC, NODE:ITYPE->val[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+8], RC[m
[31m-    |  mov [BASE+RA*8-8], TMPRd[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |7:  // Skip holes in hash part.[m
[31m-    |  add RCd, 1[m
[31m-    |  jmp <6[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  ins_AD	// RA = base, RD = target (points to ITERN)[m
[31m-    |  mov CFUNC:RB, [BASE+RA*8-24][m
[31m-    |  checkfunc CFUNC:RB, >5[m
[31m-    |  checktptp [BASE+RA*8-16], LJ_TTAB, >5[m
[31m-    |  cmp aword [BASE+RA*8-8], LJ_TNIL; jne >5[m
[31m-    |  cmp byte CFUNC:RB->ffid, FF_next_N; jne >5[m
[31m-    |  branchPC RD[m
[31m-    |  mov64 TMPR, U64x(fffe7fff, 00000000)[m
[31m-    |  mov [BASE+RA*8-8], TMPR		// Initialize control var.[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  mov PC_OP, BC_JMP[m
[31m-    |  branchPC RD[m
[31m-    |  mov byte [PC], BC_ITERC[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  ins_ABC	// RA = base, RB = nresults+1, RC = numparams[m
[31m-    |  lea TMPR, [BASE+RC*8+(16+FRAME_VARG)][m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  sub TMPR, [BASE-8][m
[31m-    |  // Note: TMPR may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  test RB, RB[m
[31m-    |  jz >5				// Copy all varargs?[m
[31m-    |  lea RB, [RA+RB*8-8][m
[31m-    |  cmp TMPR, BASE			// No vararg slots?[m
[31m-    |  jnb >2[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |  mov RC, [TMPR-16][m
[31m-    |  add TMPR, 8[m
[31m-    |  mov [RA], RC[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RB			// All destination slots filled?[m
[31m-    |  jnb >3[m
[31m-    |  cmp TMPR, BASE			// No more vararg slots?[m
[31m-    |  jb <1[m
[31m-    |2:  // Fill up remainder with nil.[m
[31m-    |  mov aword [RA], LJ_TNIL[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RB[m
[31m-    |  jb <2[m
[31m-    |3:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  mov MULTRES, 1			// MULTRES = 0+1[m
[31m-    |  mov RC, BASE[m
[31m-    |  sub RC, TMPR[m
[31m-    |  jbe <3				// No vararg slots?[m
[31m-    |  mov RBd, RCd[m
[31m-    |  shr RBd, 3[m
[31m-    |  add RBd, 1[m
[31m-    |  mov MULTRES, RBd			// MULTRES = #varargs+1[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  add RC, RA[m
[31m-    |  cmp RC, L:RB->maxstack[m
[31m-    |  ja >7				// Need to grow stack?[m
[31m-    |6:  // Copy all vararg slots.[m
[31m-    |  mov RC, [TMPR-16][m
[31m-    |  add TMPR, 8[m
[31m-    |  mov [RA], RC[m
[31m-    |  add RA, 8[m
[31m-    |  cmp TMPR, BASE			// No more vararg slots?[m
[31m-    |  jb <6[m
[31m-    |  jmp <3[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov L:RB->top, RA[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  sub TMPR, BASE			// Need delta, because BASE may change.[m
[31m-    |  mov TMP1hi, TMPRd[m
[31m-    |  mov CARG2d, MULTRES[m
[31m-    |  sub CARG2d, 1[m
[31m-    |  mov CARG1, L:RB[m
[31m-    |  call extern lj_state_growstack	// (lua_State *L, int n)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movsxd TMPR, TMP1hi[m
[31m-    |  mov RA, L:RB->top[m
[31m-    |  add TMPR, BASE[m
[31m-    |  jmp <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  ins_AD	// RA = results, RD = extra_nresults[m
[31m-    |  add RDd, MULTRES			// MULTRES >=1, so RD >=1.[m
[31m-    |  // Fall through. Assumes BC_RET follows and ins_AD is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-    |  ins_AD	// RA = results, RD = nresults+1[m
[31m-    if (op != BC_RET0) {[m
[31m-      |  shl RAd, 3[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  mov PC, [BASE-8][m
[31m-    |  mov MULTRES, RDd			// Save nresults+1.[m
[31m-    |  test PCd, FRAME_TYPE		// Check frame type marker.[m
[31m-    |  jnz >7				// Not returning to a fixarg Lua func?[m
[31m-    switch (op) {[m
[31m-    case BC_RET:[m
[31m-      |->BC_RET_Z:[m
[31m-      |  mov KBASE, BASE		// Use KBASE for result move.[m
[31m-      |  sub RDd, 1[m
[31m-      |  jz >3[m
[31m-      |2:  // Move results down.[m
[31m-      |  mov RB, [KBASE+RA][m
[31m-      |  mov [KBASE-16], RB[m
[31m-      |  add KBASE, 8[m
[31m-      |  sub RDd, 1[m
[31m-      |  jnz <2[m
[31m-      |3:[m
[31m-      |  mov RDd, MULTRES		// Note: MULTRES may be >255.[m
[31m-      |  movzx RBd, PC_RB		// So cannot compare with RDL![m
[31m-      |5:[m
[31m-      |  cmp RBd, RDd			// More results expected?[m
[31m-      |  ja >6[m
[31m-      break;[m
[31m-    case BC_RET1:[m
[31m-      |  mov RB, [BASE+RA][m
[31m-      |  mov [BASE-16], RB[m
[31m-      /* fallthrough */[m
[31m-    case BC_RET0:[m
[31m-      |5:[m
[31m-      |  cmp PC_RB, RDL			// More results expected?[m
[31m-      |  ja >6[m
[31m-    default:[m
[31m-      break;[m
[31m-    }[m
[31m-    |  movzx RAd, PC_RA[m
[31m-    |  neg RA[m
[31m-    |  lea BASE, [BASE+RA*8-16]		// base = base - (RA+2)*8[m
[31m-    |  mov LFUNC:KBASE, [BASE-16][m
[31m-    |  cleartp LFUNC:KBASE[m
[31m-    |  mov KBASE, LFUNC:KBASE->pc[m
[31m-    |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    if (op == BC_RET) {[m
[31m-      |  mov aword [KBASE-16], LJ_TNIL	// Note: relies on shifted base.[m
[31m-      |  add KBASE, 8[m
[31m-    } else {[m
[31m-      |  mov aword [BASE+RD*8-24], LJ_TNIL[m
[31m-    }[m
[31m-    |  add RD, 1[m
[31m-    |  jmp <5[m
[31m-    |[m
[31m-    |7:  // Non-standard return case.[m
[31m-    |  lea RB, [PC-FRAME_VARG][m
[31m-    |  test RBd, FRAME_TYPEP[m
[31m-    |  jnz ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down and RA up.[m
[31m-    |  sub BASE, RB[m
[31m-    if (op != BC_RET0) {[m
[31m-      |  add RA, RB[m
[31m-    }[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  |.define FOR_IDX,  [RA][m
[31m-  |.define FOR_STOP, [RA+8][m
[31m-  |.define FOR_STEP, [RA+16][m
[31m-  |.define FOR_EXT,  [RA+24][m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop RBd[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_IFORL follows and ins_AJ is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  ins_AJ	// RA = base, RD = target (after end of loop or start of loop)[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    if (LJ_DUALNUM) {[m
[31m-      |  mov RB, FOR_IDX[m
[31m-      |  checkint RB, >9[m
[31m-      |  mov TMPR, FOR_STOP[m
[31m-      if (!vk) {[m
[31m-	|  checkint TMPR, ->vmeta_for[m
[31m-	|  mov ITYPE, FOR_STEP[m
[31m-	|  test ITYPEd, ITYPEd; js >5[m
[31m-	|  sar ITYPE, 47;[m
[31m-	|  cmp ITYPEd, LJ_TISNUM; jne ->vmeta_for[m
[31m-      } else {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-	|  checkinttp FOR_STOP, ->assert_bad_for_arg_type[m
[31m-	|  checkinttp FOR_STEP, ->assert_bad_for_arg_type[m
[31m-#endif[m
[31m-	|  mov ITYPE, FOR_STEP[m
[31m-	|  test ITYPEd, ITYPEd; js >5[m
[31m-	|  add RBd, ITYPEd; jo >1[m
[31m-	|  setint RB[m
[31m-	|  mov FOR_IDX, RB[m
[31m-      }[m
[31m-      |  cmp RBd, TMPRd[m
[31m-      |  mov FOR_EXT, RB[m
[31m-      if (op == BC_FORI) {[m
[31m-	|  jle >7[m
[31m-	|1:[m
[31m-	|6:[m
[31m-	|  branchPC RD[m
[31m-      } else if (op == BC_JFORI) {[m
[31m-	|  branchPC RD[m
[31m-	|  movzx RDd, PC_RD[m
[31m-	|  jle =>BC_JLOOP[m
[31m-	|1:[m
[31m-	|6:[m
[31m-      } else if (op == BC_IFORL) {[m
[31m-	|  jg >7[m
[31m-	|6:[m
[31m-	|  branchPC RD[m
[31m-	|1:[m
[31m-      } else {[m
[31m-	|  jle =>BC_JLOOP[m
[31m-	|1:[m
[31m-	|6:[m
[31m-      }[m
[31m-      |7:[m
[31m-      |  ins_next[m
[31m-      |[m
[31m-      |5:  // Invert check for negative step.[m
[31m-      if (!vk) {[m
[31m-	|  sar ITYPE, 47;[m
[31m-	|  cmp ITYPEd, LJ_TISNUM; jne ->vmeta_for[m
[31m-      } else {[m
[31m-	|  add RBd, ITYPEd; jo <1[m
[31m-	|  setint RB[m
[31m-	|  mov FOR_IDX, RB[m
[31m-      }[m
[31m-      |  cmp RBd, TMPRd[m
[31m-      |  mov FOR_EXT, RB[m
[31m-      if (op == BC_FORI) {[m
[31m-	|  jge <7[m
[31m-      } else if (op == BC_JFORI) {[m
[31m-	|  branchPC RD[m
[31m-	|  movzx RDd, PC_RD[m
[31m-	|  jge =>BC_JLOOP[m
[31m-      } else if (op == BC_IFORL) {[m
[31m-	|  jl <7[m
[31m-      } else {[m
[31m-	|  jge =>BC_JLOOP[m
[31m-      }[m
[31m-      |  jmp <6[m
[31m-      |9:  // Fallback to FP variant.[m
[31m-      if (!vk) {[m
[31m-	|  jae ->vmeta_for[m
[31m-      }[m
[31m-    } else if (!vk) {[m
[31m-      |  checknumtp FOR_IDX, ->vmeta_for[m
[31m-    }[m
[31m-    if (!vk) {[m
[31m-      |  checknumtp FOR_STOP, ->vmeta_for[m
[31m-    } else {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-      |  checknumtp FOR_STOP, ->assert_bad_for_arg_type[m
[31m-      |  checknumtp FOR_STEP, ->assert_bad_for_arg_type[m
[31m-#endif[m
[31m-    }[m
[31m-    |  mov RB, FOR_STEP[m
[31m-    if (!vk) {[m
[31m-      |  checknum RB, ->vmeta_for[m
[31m-    }[m
[31m-    |  movsd xmm0, qword FOR_IDX[m
[31m-    |  movsd xmm1, qword FOR_STOP[m
[31m-    if (vk) {[m
[31m-      |  addsd xmm0, qword FOR_STEP[m
[31m-      |  movsd qword FOR_IDX, xmm0[m
[31m-      |  test RB, RB; js >3[m
[31m-    } else {[m
[31m-      |  jl >3[m
[31m-    }[m
[31m-    |  ucomisd xmm1, xmm0[m
[31m-    |1:[m
[31m-    |  movsd qword FOR_EXT, xmm0[m
[31m-    if (op == BC_FORI) {[m
[31m-      |.if DUALNUM[m
[31m-      |  jnb <7[m
[31m-      |.else[m
[31m-      |  jnb >2[m
[31m-      |  branchPC RD[m
[31m-      |.endif[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  branchPC RD[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  jnb =>BC_JLOOP[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |.if DUALNUM[m
[31m-      |  jb <7[m
[31m-      |.else[m
[31m-      |  jb >2[m
[31m-      |  branchPC RD[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |  jnb =>BC_JLOOP[m
[31m-    }[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |3:  // Invert comparison if step is negative.[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop RBd[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_IITERL follows and ins_AJ is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  ins_AJ	// RA = base, RD = target[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  mov RB, [RA][m
[31m-    |  cmp RB, LJ_TNIL; je >1		// Stop if iterator returned nil.[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  mov [RA-8], RB[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  branchPC RD			// Otherwise save control var + branch.[m
[31m-      |  mov [RA-8], RB[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  ins_A	// RA = base, RD = target (loop extent)[m
[31m-    |  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop RBd[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  ins_A	// RA = base, RD = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  ins_AD	// RA = base (ignored), RD = traceno[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_J(trace)][m
[31m-    |  mov TRACE:RD, [RA+RD*8][m
[31m-    |  mov RD, TRACE:RD->mcode[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(jit_base)], BASE[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(tmpbuf.L)], L:RB[m
[31m-    |  // Save additional callee-save registers only used in compiled code.[m
[31m-    |.if X64WIN[m
[31m-    |  mov CSAVE_4, r12[m
[31m-    |  mov CSAVE_3, r13[m
[31m-    |  mov CSAVE_2, r14[m
[31m-    |  mov CSAVE_1, r15[m
[31m-    |  mov RA, rsp[m
[31m-    |  sub rsp, 10*16+4*8[m
[31m-    |  movdqa [RA-1*16], xmm6[m
[31m-    |  movdqa [RA-2*16], xmm7[m
[31m-    |  movdqa [RA-3*16], xmm8[m
[31m-    |  movdqa [RA-4*16], xmm9[m
[31m-    |  movdqa [RA-5*16], xmm10[m
[31m-    |  movdqa [RA-6*16], xmm11[m
[31m-    |  movdqa [RA-7*16], xmm12[m
[31m-    |  movdqa [RA-8*16], xmm13[m
[31m-    |  movdqa [RA-9*16], xmm14[m
[31m-    |  movdqa [RA-10*16], xmm15[m
[31m-    |.else[m
[31m-    |  sub rsp, 16[m
[31m-    |  mov [rsp+16], r12[m
[31m-    |  mov [rsp+8], r13[m
[31m-    |.endif[m
[31m-    |  jmp RD[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  ins_AJ	// RA = unused, RD = target[m
[31m-    |  branchPC RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-   /*[m
[31m-   ** Reminder: A function may be called with func/args above L->maxstack,[m
[31m-   ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot,[m
[31m-   ** too. This means all FUNC* ops (including fast functions) must check[m
[31m-   ** for stack overflow _before_ adding more slots![m
[31m-   */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall RBd[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[31m-    |  mov KBASE, [PC-4+PC2PROTO(k)][m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RA, [BASE+RA*8]		// Top of frame.[m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  ja ->vm_growstack_f[m
[31m-    |  movzx RAd, byte [PC-4+PC2PROTO(numparams)][m
[31m-    |  cmp NARGS:RDd, RAd		// Check for missing parameters.[m
[31m-    |  jbe >3[m
[31m-    |2:[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  mov aword [BASE+NARGS:RD*8-8], LJ_TNIL[m
[31m-    |  add NARGS:RDd, 1[m
[31m-    |  cmp NARGS:RDd, RAd[m
[31m-    |  jbe <3[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    | int3  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[31m-    |  lea RBd, [NARGS:RD*8+FRAME_VARG+8][m
[31m-    |  lea RD, [BASE+NARGS:RD*8+8][m
[31m-    |  mov LFUNC:KBASE, [BASE-16][m
[31m-    |  mov [RD-8], RB			// Store delta + FRAME_VARG.[m
[31m-    |  mov [RD-16], LFUNC:KBASE		// Store copy of LFUNC.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RA, [RD+RA*8][m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  ja ->vm_growstack_v		// Need to grow stack.[m
[31m-    |  mov RA, BASE[m
[31m-    |  mov BASE, RD[m
[31m-    |  movzx RBd, byte [PC-4+PC2PROTO(numparams)][m
[31m-    |  test RBd, RBd[m
[31m-    |  jz >2[m
[31m-    |  add RA, 8[m
[31m-    |1:  // Copy fixarg slots up to new frame.[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, BASE[m
[31m-    |  jnb >3				// Less args than parameters?[m
[31m-    |  mov KBASE, [RA-16][m
[31m-    |  mov [RD], KBASE[m
[31m-    |  add RD, 8[m
[31m-    |  mov aword [RA-16], LJ_TNIL	// Clear old fixarg slot (help the GC).[m
[31m-    |  sub RBd, 1[m
[31m-    |  jnz <1[m
[31m-    |2:[m
[31m-    if (op == BC_JFUNCV) {[m
[31m-      |  movzx RDd, PC_RD[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  mov KBASE, [PC-4+PC2PROTO(k)][m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  mov aword [RD], LJ_TNIL[m
[31m-    |  add RD, 8[m
[31m-    |  sub RBd, 1[m
[31m-    |  jnz <3[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  ins_AD  // BASE = new base, RA = ins RA|RD (unused), RD = nargs+1[m
[31m-    |  mov CFUNC:RB, [BASE-16][m
[31m-    |  cleartp CFUNC:RB[m
[31m-    |  mov KBASE, CFUNC:RB->f[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  lea RA, [RD+8*LUA_MINSTACK][m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  mov L:RB->top, RD[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  mov CARG1, L:RB		// Caveat: CARG1 may be RA.[m
[31m-    } else {[m
[31m-      |  mov CARG2, KBASE[m
[31m-      |  mov CARG1, L:RB		// Caveat: CARG1 may be RA.[m
[31m-    }[m
[31m-    |  ja ->vm_growstack_c		// Need to grow stack.[m
[31m-    |  set_vmstate C[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  call KBASE			// (lua_State *L)[m
[31m-    } else {[m
[31m-      |  // (lua_State *L, lua_CFunction f)[m
[31m-      |  call aword [DISPATCH+DISPATCH_GL(wrapf)][m
[31m-    }[m
[31m-    |  // nresults returned in eax (RD).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-    |  set_vmstate INTERP[m
[31m-    |  lea RA, [BASE+RD*8][m
[31m-    |  neg RA[m
[31m-    |  add RA, L:RB->top		// RA = (L->top-(L->base+nresults))*8[m
[31m-    |  mov PC, [BASE-8]			// Fetch PC of caller.[m
[31m-    |  jmp ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-  build_subroutines(ctx);[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 0x10\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"[m
[31m-	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"[m
[31m-	"\t.align 8\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.quad .Lbegin\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[31m-#if LJ_NO_UNWIND[m
[31m-	"\t.byte 0x8d\n\t.uleb128 0x6\n"	/* offset r13 */[m
[31m-	"\t.byte 0x8c\n\t.uleb128 0x7\n"	/* offset r12 */[m
[31m-#endif[m
[31m-	"\t.align 8\n"[m
[31m-	".LEFDE0:\n\n", fcofs, CFRAME_SIZE);[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-	"\t.quad lj_vm_ffi_call\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.align 8\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#if !LJ_NO_UNWIND[m
[31m-#if (defined(__sun__) && defined(__svr4__))[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n");[m
[31m-#else[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.long .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 0x10\n"[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.long lj_err_unwind_dwarf-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"[m
[31m-	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"[m
[31m-	"\t.align 8\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.long .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.long .LASFDE2-.Lframe1\n"[m
[31m-	"\t.long .Lbegin-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[31m-	"\t.align 8\n"[m
[31m-	".LEFDE2:\n\n", fcofs, CFRAME_SIZE);[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.long .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -8\n"[m
[31m-	"\t.byte 0x10\n"[m
[31m-	"\t.uleb128 1\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 0x7\n\t.uleb128 8\n"[m
[31m-	"\t.byte 0x80+0x10\n\t.uleb128 0x1\n"[m
[31m-	"\t.align 8\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.long .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.long .LASFDE3-.Lframe2\n"[m
[31m-	"\t.long lj_vm_ffi_call-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.align 8\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#endif[m
[31m-    break;[m
[31m-#if !LJ_NO_UNWIND[m
[31m-  /* Mental note: never let Apple design an assembler.[m
[31m-  ** Or a linker. Or a plastic case. But I digress.[m
[31m-  */[m
[31m-  case BUILD_machasm: {[m
[31m-#if LJ_HASFFI[m
[31m-    int fcsize = 0;[m
[31m-#endif[m
[31m-    int i;[m
[31m-    fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	"EH_frame1:\n"[m
[31m-	"\t.set L$set$x,LECIEX-LSCIEX\n"[m
[31m-	"\t.long L$set$x\n"[m
[31m-	"LSCIEX:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.ascii \"zPR\\0\"\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.byte 128-8\n"[m
[31m-	"\t.byte 0x10\n"[m
[31m-	"\t.byte 6\n"				/* augmentation length */[m
[31m-	"\t.byte 0x9b\n"			/* indirect|pcrel|sdata4 */[m
[31m-	"\t.long _lj_err_unwind_dwarf+4@GOTPCREL\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.byte 0x7\n\t.byte 8\n"[m
[31m-	"\t.byte 0x80+0x10\n\t.byte 0x1\n"[m
[31m-	"\t.align 3\n"[m
[31m-	"LECIEX:\n\n");[m
[31m-    for (i = 0; i < ctx->nsym; i++) {[m
[31m-      const char *name = ctx->sym[i].name;[m
[31m-      int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;[m
[31m-      if (size == 0) continue;[m
[31m-#if LJ_HASFFI[m
[31m-      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }[m
[31m-#endif[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "%s.eh:\n"[m
[31m-	  "LSFDE%d:\n"[m
[31m-	  "\t.set L$set$%d,LEFDE%d-LASFDE%d\n"[m
[31m-	  "\t.long L$set$%d\n"[m
[31m-	  "LASFDE%d:\n"[m
[31m-	  "\t.long LASFDE%d-EH_frame1\n"[m
[31m-	  "\t.long %s-.\n"[m
[31m-	  "\t.long %d\n"[m
[31m-	  "\t.byte 0\n"				/* augmentation length */[m
[31m-	  "\t.byte 0xe\n\t.byte %d\n"		/* def_cfa_offset */[m
[31m-	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[31m-	  "\t.byte 0x8f\n\t.byte 0x4\n"		/* offset r15 */[m
[31m-	  "\t.byte 0x8e\n\t.byte 0x5\n"		/* offset r14 */[m
[31m-	  "\t.align 3\n"[m
[31m-	  "LEFDE%d:\n\n",[m
[31m-	  name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (fcsize) {[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "EH_frame2:\n"[m
[31m-	  "\t.set L$set$y,LECIEY-LSCIEY\n"[m
[31m-	  "\t.long L$set$y\n"[m
[31m-	  "LSCIEY:\n"[m
[31m-	  "\t.long 0\n"[m
[31m-	  "\t.byte 0x1\n"[m
[31m-	  "\t.ascii \"zR\\0\"\n"[m
[31m-	  "\t.byte 0x1\n"[m
[31m-	  "\t.byte 128-8\n"[m
[31m-	  "\t.byte 0x10\n"[m
[31m-	  "\t.byte 1\n"				/* augmentation length */[m
[31m-	  "\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	  "\t.byte 0xc\n\t.byte 0x7\n\t.byte 8\n"[m
[31m-	  "\t.byte 0x80+0x10\n\t.byte 0x1\n"[m
[31m-	  "\t.align 3\n"[m
[31m-	  "LECIEY:\n\n");[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "_lj_vm_ffi_call.eh:\n"[m
[31m-	  "LSFDEY:\n"[m
[31m-	  "\t.set L$set$yy,LEFDEY-LASFDEY\n"[m
[31m-	  "\t.long L$set$yy\n"[m
[31m-	  "LASFDEY:\n"[m
[31m-	  "\t.long LASFDEY-EH_frame2\n"[m
[31m-	  "\t.long _lj_vm_ffi_call-.\n"[m
[31m-	  "\t.long %d\n"[m
[31m-	  "\t.byte 0\n"				/* augmentation length */[m
[31m-	  "\t.byte 0xe\n\t.byte 16\n"		/* def_cfa_offset */[m
[31m-	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[31m-	  "\t.byte 0xd\n\t.byte 0x6\n"		/* def_cfa_register rbp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[31m-	  "\t.align 3\n"[m
[31m-	  "LEFDEY:\n\n", fcsize);[m
[31m-    }[m
[31m-#endif[m
[31m-    fprintf(ctx->fp, ".subsections_via_symbols\n");[m
[31m-    }[m
[31m-    break;[m
[31m-#endif[m
[31m-  default:  /* Difficult for other modes. */[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_x86.dasc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_x86.dasc[m
[1mdeleted file mode 100644[m
[1mindex f200539..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/vm_x86.dasc[m
[1m+++ /dev/null[m
[36m@@ -1,5737 +0,0 @@[m
[31m-|// Low-level VM code for x86 CPUs.[m
[31m-|// Bytecode interpreter, fast functions and helper functions.[m
[31m-|// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h[m
[31m-|[m
[31m-|.if P64[m
[31m-|.arch x64[m
[31m-|.else[m
[31m-|.arch x86[m
[31m-|.endif[m
[31m-|.section code_op, code_sub[m
[31m-|[m
[31m-|.actionlist build_actionlist[m
[31m-|.globals GLOB_[m
[31m-|.globalnames globnames[m
[31m-|.externnames extnames[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|.if P64[m
[31m-|.define X64, 1[m
[31m-|.if WIN[m
[31m-|.define X64WIN, 1[m
[31m-|.endif[m
[31m-|.endif[m
[31m-|[m
[31m-|// Fixed register assignments for the interpreter.[m
[31m-|// This is very fragile and has many dependencies. Caveat emptor.[m
[31m-|.define BASE,		edx		// Not C callee-save, refetched anyway.[m
[31m-|.if not X64[m
[31m-|.define KBASE,		edi		// Must be C callee-save.[m
[31m-|.define KBASEa,	KBASE[m
[31m-|.define PC,		esi		// Must be C callee-save.[m
[31m-|.define PCa,		PC[m
[31m-|.define DISPATCH,	ebx		// Must be C callee-save.[m
[31m-|.elif X64WIN[m
[31m-|.define KBASE,		edi		// Must be C callee-save.[m
[31m-|.define KBASEa,	rdi[m
[31m-|.define PC,		esi		// Must be C callee-save.[m
[31m-|.define PCa,		rsi[m
[31m-|.define DISPATCH,	ebx		// Must be C callee-save.[m
[31m-|.else[m
[31m-|.define KBASE,		r15d		// Must be C callee-save.[m
[31m-|.define KBASEa,	r15[m
[31m-|.define PC,		ebx		// Must be C callee-save.[m
[31m-|.define PCa,		rbx[m
[31m-|.define DISPATCH,	r14d		// Must be C callee-save.[m
[31m-|.endif[m
[31m-|[m
[31m-|.define RA,		ecx[m
[31m-|.define RAH,		ch[m
[31m-|.define RAL,		cl[m
[31m-|.define RB,		ebp		// Must be ebp (C callee-save).[m
[31m-|.define RC,		eax		// Must be eax.[m
[31m-|.define RCW,		ax[m
[31m-|.define RCH,		ah[m
[31m-|.define RCL,		al[m
[31m-|.define OP,		RB[m
[31m-|.define RD,		RC[m
[31m-|.define RDW,		RCW[m
[31m-|.define RDL,		RCL[m
[31m-|.if X64[m
[31m-|.define RAa, rcx[m
[31m-|.define RBa, rbp[m
[31m-|.define RCa, rax[m
[31m-|.define RDa, rax[m
[31m-|.else[m
[31m-|.define RAa, RA[m
[31m-|.define RBa, RB[m
[31m-|.define RCa, RC[m
[31m-|.define RDa, RD[m
[31m-|.endif[m
[31m-|[m
[31m-|.if not X64[m
[31m-|.define FCARG1,	ecx		// x86 fastcall arguments.[m
[31m-|.define FCARG2,	edx[m
[31m-|.elif X64WIN[m
[31m-|.define CARG1,		rcx		// x64/WIN64 C call arguments.[m
[31m-|.define CARG2,		rdx[m
[31m-|.define CARG3,		r8[m
[31m-|.define CARG4,		r9[m
[31m-|.define CARG1d,	ecx[m
[31m-|.define CARG2d,	edx[m
[31m-|.define CARG3d,	r8d[m
[31m-|.define CARG4d,	r9d[m
[31m-|.define FCARG1,	CARG1d		// Upwards compatible to x86 fastcall.[m
[31m-|.define FCARG2,	CARG2d[m
[31m-|.else[m
[31m-|.define CARG1,		rdi		// x64/POSIX C call arguments.[m
[31m-|.define CARG2,		rsi[m
[31m-|.define CARG3,		rdx[m
[31m-|.define CARG4,		rcx[m
[31m-|.define CARG5,		r8[m
[31m-|.define CARG6,		r9[m
[31m-|.define CARG1d,	edi[m
[31m-|.define CARG2d,	esi[m
[31m-|.define CARG3d,	edx[m
[31m-|.define CARG4d,	ecx[m
[31m-|.define CARG5d,	r8d[m
[31m-|.define CARG6d,	r9d[m
[31m-|.define FCARG1,	CARG1d		// Simulate x86 fastcall.[m
[31m-|.define FCARG2,	CARG2d[m
[31m-|.endif[m
[31m-|[m
[31m-|// Type definitions. Some of these are only used for documentation.[m
[31m-|.type L,		lua_State[m
[31m-|.type GL,		global_State[m
[31m-|.type TVALUE,		TValue[m
[31m-|.type GCOBJ,		GCobj[m
[31m-|.type STR,		GCstr[m
[31m-|.type TAB,		GCtab[m
[31m-|.type LFUNC,		GCfuncL[m
[31m-|.type CFUNC,		GCfuncC[m
[31m-|.type PROTO,		GCproto[m
[31m-|.type UPVAL,		GCupval[m
[31m-|.type NODE,		Node[m
[31m-|.type NARGS,		int[m
[31m-|.type TRACE,		GCtrace[m
[31m-|.type SBUF,		SBuf[m
[31m-|[m
[31m-|// Stack layout while in interpreter. Must match with lj_frame.h.[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.if not X64		// x86 stack layout.[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*7			// Delta for esp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push edi; push esi; push ebx[m
[31m-|  sub esp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push ebp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add esp, CFRAME_SPACE[m
[31m-|  pop ebx; pop esi; pop edi; pop ebp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.define SAVE_ERRF,	aword [esp+aword*15]	// vm_pcall/vm_cpcall only.[m
[31m-|.define SAVE_NRES,	aword [esp+aword*14][m
[31m-|.define SAVE_CFRAME,	aword [esp+aword*13][m
[31m-|.define SAVE_L,	aword [esp+aword*12][m
[31m-|//----- 16 byte aligned, ^^^ arguments from C caller[m
[31m-|.define SAVE_RET,	aword [esp+aword*11]	//<-- esp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [esp+aword*10][m
[31m-|.define SAVE_R3,	aword [esp+aword*9][m
[31m-|.define SAVE_R2,	aword [esp+aword*8][m
[31m-|//----- 16 byte aligned[m
[31m-|.define SAVE_R1,	aword [esp+aword*7]	//<-- esp after register saves.[m
[31m-|.define SAVE_PC,	aword [esp+aword*6][m
[31m-|.define TMP2,		aword [esp+aword*5][m
[31m-|.define TMP1,		aword [esp+aword*4][m
[31m-|//----- 16 byte aligned[m
[31m-|.define ARG4,		aword [esp+aword*3][m
[31m-|.define ARG3,		aword [esp+aword*2][m
[31m-|.define ARG2,		aword [esp+aword*1][m
[31m-|.define ARG1,		aword [esp]		//<-- esp while in interpreter.[m
[31m-|//----- 16 byte aligned, ^^^ arguments for C callee[m
[31m-|[m
[31m-|// FPARGx overlaps ARGx and ARG(x+1) on x86.[m
[31m-|.define FPARG3,	qword [esp+qword*1][m
[31m-|.define FPARG1,	qword [esp][m
[31m-|// TMPQ overlaps TMP1/TMP2. ARG5/MULTRES overlap TMP1/TMP2 (and TMPQ).[m
[31m-|.define TMPQ,		qword [esp+aword*4][m
[31m-|.define TMP3,		ARG4[m
[31m-|.define ARG5,		TMP1[m
[31m-|.define TMPa,		TMP1[m
[31m-|.define MULTRES,	TMP2[m
[31m-|[m
[31m-|// Arguments for vm_call and vm_pcall.[m
[31m-|.define INARG_BASE,	SAVE_CFRAME		// Overwritten by SAVE_CFRAME![m
[31m-|[m
[31m-|// Arguments for vm_cpcall.[m
[31m-|.define INARG_CP_CALL,	SAVE_ERRF[m
[31m-|.define INARG_CP_UD,	SAVE_NRES[m
[31m-|.define INARG_CP_FUNC,	SAVE_CFRAME[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.elif X64WIN		// x64/Windows stack layout[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push rdi; push rsi; push rbx[m
[31m-|  sub rsp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push rbp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add rsp, CFRAME_SPACE[m
[31m-|  pop rbx; pop rsi; pop rdi; pop rbp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.define SAVE_CFRAME,	aword [rsp+aword*13][m
[31m-|.define SAVE_PC,	dword [rsp+dword*25][m
[31m-|.define SAVE_L,	dword [rsp+dword*24][m
[31m-|.define SAVE_ERRF,	dword [rsp+dword*23][m
[31m-|.define SAVE_NRES,	dword [rsp+dword*22][m
[31m-|.define TMP2,		dword [rsp+dword*21][m
[31m-|.define TMP1,		dword [rsp+dword*20][m
[31m-|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter[m
[31m-|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*8][m
[31m-|.define SAVE_R3,	aword [rsp+aword*7][m
[31m-|.define SAVE_R2,	aword [rsp+aword*6][m
[31m-|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.define ARG5,		aword [rsp+aword*4][m
[31m-|.define CSAVE_4,	aword [rsp+aword*3][m
[31m-|.define CSAVE_3,	aword [rsp+aword*2][m
[31m-|.define CSAVE_2,	aword [rsp+aword*1][m
[31m-|.define CSAVE_1,	aword [rsp]		//<-- rsp while in interpreter.[m
[31m-|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee[m
[31m-|[m
[31m-|// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ).[m
[31m-|.define TMPQ,		qword [rsp+aword*10][m
[31m-|.define MULTRES,	TMP2[m
[31m-|.define TMPa,		ARG5[m
[31m-|.define ARG5d,		dword [rsp+aword*4][m
[31m-|.define TMP3,		ARG5d[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|.else			// x64/POSIX stack layout[m
[31m-|[m
[31m-|.define CFRAME_SPACE,	aword*5			// Delta for rsp (see <--).[m
[31m-|.macro saveregs_[m
[31m-|  push rbx; push r15; push r14[m
[31m-|.if NO_UNWIND[m
[31m-|  push r13; push r12[m
[31m-|.endif[m
[31m-|  sub rsp, CFRAME_SPACE[m
[31m-|.endmacro[m
[31m-|.macro saveregs[m
[31m-|  push rbp; saveregs_[m
[31m-|.endmacro[m
[31m-|.macro restoreregs[m
[31m-|  add rsp, CFRAME_SPACE[m
[31m-|.if NO_UNWIND[m
[31m-|  pop r12; pop r13[m
[31m-|.endif[m
[31m-|  pop r14; pop r15; pop rbx; pop rbp[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//----- 16 byte aligned,[m
[31m-|.if NO_UNWIND[m
[31m-|.define SAVE_RET,	aword [rsp+aword*11]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*10][m
[31m-|.define SAVE_R3,	aword [rsp+aword*9][m
[31m-|.define SAVE_R2,	aword [rsp+aword*8][m
[31m-|.define SAVE_R1,	aword [rsp+aword*7][m
[31m-|.define SAVE_RU2,	aword [rsp+aword*6][m
[31m-|.define SAVE_RU1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.else[m
[31m-|.define SAVE_RET,	aword [rsp+aword*9]	//<-- rsp entering interpreter.[m
[31m-|.define SAVE_R4,	aword [rsp+aword*8][m
[31m-|.define SAVE_R3,	aword [rsp+aword*7][m
[31m-|.define SAVE_R2,	aword [rsp+aword*6][m
[31m-|.define SAVE_R1,	aword [rsp+aword*5]	//<-- rsp after register saves.[m
[31m-|.endif[m
[31m-|.define SAVE_CFRAME,	aword [rsp+aword*4][m
[31m-|.define SAVE_PC,	dword [rsp+dword*7][m
[31m-|.define SAVE_L,	dword [rsp+dword*6][m
[31m-|.define SAVE_ERRF,	dword [rsp+dword*5][m
[31m-|.define SAVE_NRES,	dword [rsp+dword*4][m
[31m-|.define TMPa,		aword [rsp+aword*1][m
[31m-|.define TMP2,		dword [rsp+dword*1][m
[31m-|.define TMP1,		dword [rsp]		//<-- rsp while in interpreter.[m
[31m-|//----- 16 byte aligned[m
[31m-|[m
[31m-|// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ).[m
[31m-|.define TMPQ,		qword [rsp][m
[31m-|.define TMP3,		dword [rsp+aword*1][m
[31m-|.define MULTRES,	TMP2[m
[31m-|[m
[31m-|.endif[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Instruction headers.[m
[31m-|.macro ins_A; .endmacro[m
[31m-|.macro ins_AD; .endmacro[m
[31m-|.macro ins_AJ; .endmacro[m
[31m-|.macro ins_ABC; movzx RB, RCH; movzx RC, RCL; .endmacro[m
[31m-|.macro ins_AB_; movzx RB, RCH; .endmacro[m
[31m-|.macro ins_A_C; movzx RC, RCL; .endmacro[m
[31m-|.macro ins_AND; not RDa; .endmacro[m
[31m-|[m
[31m-|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster).[m
[31m-|.macro ins_NEXT[m
[31m-|  mov RC, [PC][m
[31m-|  movzx RA, RCH[m
[31m-|  movzx OP, RCL[m
[31m-|  add PC, 4[m
[31m-|  shr RC, 16[m
[31m-|.if X64[m
[31m-|  jmp aword [DISPATCH+OP*8][m
[31m-|.else[m
[31m-|  jmp aword [DISPATCH+OP*4][m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Instruction footer.[m
[31m-|.if 1[m
[31m-|  // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.[m
[31m-|  .define ins_next, ins_NEXT[m
[31m-|  .define ins_next_, ins_NEXT[m
[31m-|.else[m
[31m-|  // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.[m
[31m-|  // Affects only certain kinds of benchmarks (and only with -j off).[m
[31m-|  // Around 10%-30% slower on Core2, a lot more slower on P4.[m
[31m-|  .macro ins_next[m
[31m-|    jmp ->ins_next[m
[31m-|  .endmacro[m
[31m-|  .macro ins_next_[m
[31m-|  ->ins_next:[m
[31m-|    ins_NEXT[m
[31m-|  .endmacro[m
[31m-|.endif[m
[31m-|[m
[31m-|// Call decode and dispatch.[m
[31m-|.macro ins_callt[m
[31m-|  // BASE = new base, RB = LFUNC, RD = nargs+1, [BASE-4] = PC[m
[31m-|  mov PC, LFUNC:RB->pc[m
[31m-|  mov RA, [PC][m
[31m-|  movzx OP, RAL[m
[31m-|  movzx RA, RAH[m
[31m-|  add PC, 4[m
[31m-|.if X64[m
[31m-|  jmp aword [DISPATCH+OP*8][m
[31m-|.else[m
[31m-|  jmp aword [DISPATCH+OP*4][m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro ins_call[m
[31m-|  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[31m-|  mov [BASE-4], PC[m
[31m-|  ins_callt[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-|[m
[31m-|// Macros to test operand types.[m
[31m-|.macro checktp, reg, tp;  cmp dword [BASE+reg*8+4], tp; .endmacro[m
[31m-|.macro checknum, reg, target; checktp reg, LJ_TISNUM; jae target; .endmacro[m
[31m-|.macro checkint, reg, target; checktp reg, LJ_TISNUM; jne target; .endmacro[m
[31m-|.macro checkstr, reg, target; checktp reg, LJ_TSTR; jne target; .endmacro[m
[31m-|.macro checktab, reg, target; checktp reg, LJ_TTAB; jne target; .endmacro[m
[31m-|[m
[31m-|// These operands must be used with movzx.[m
[31m-|.define PC_OP, byte [PC-4][m
[31m-|.define PC_RA, byte [PC-3][m
[31m-|.define PC_RB, byte [PC-1][m
[31m-|.define PC_RC, byte [PC-2][m
[31m-|.define PC_RD, word [PC-2][m
[31m-|[m
[31m-|.macro branchPC, reg[m
[31m-|  lea PC, [PC+reg*4-BCBIAS_J*4][m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Assumes DISPATCH is relative to GL.[m
[31m-#define DISPATCH_GL(field)	(GG_DISP2G + (int)offsetof(global_State, field))[m
[31m-#define DISPATCH_J(field)	(GG_DISP2J + (int)offsetof(jit_State, field))[m
[31m-|[m
[31m-#define PC2PROTO(field)  ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))[m
[31m-|[m
[31m-|// Decrement hashed hotcount and trigger trace recorder if zero.[m
[31m-|.macro hotloop, reg[m
[31m-|  mov reg, PC[m
[31m-|  shr reg, 1[m
[31m-|  and reg, HOTCOUNT_PCMASK[m
[31m-|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP[m
[31m-|  jb ->vm_hotloop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro hotcall, reg[m
[31m-|  mov reg, PC[m
[31m-|  shr reg, 1[m
[31m-|  and reg, HOTCOUNT_PCMASK[m
[31m-|  sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL[m
[31m-|  jb ->vm_hotcall[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Set current VM state.[m
[31m-|.macro set_vmstate, st[m
[31m-|  mov dword [DISPATCH+DISPATCH_GL(vmstate)], ~LJ_VMST_..st[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// x87 compares.[m
[31m-|.macro fcomparepp			// Compare and pop st0 >< st1.[m
[31m-|  fucomip st1[m
[31m-|  fpop[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro fpop1; fstp st1; .endmacro[m
[31m-|[m
[31m-|// Synthesize SSE FP constants.[m
[31m-|.macro sseconst_abs, reg, tmp		// Synthesize abs mask.[m
[31m-|.if X64[m
[31m-|  mov64 tmp, U64x(7fffffff,ffffffff); movd reg, tmp[m
[31m-|.else[m
[31m-|  pxor reg, reg; pcmpeqd reg, reg; psrlq reg, 1[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro sseconst_hi, reg, tmp, val	// Synthesize hi-32 bit const.[m
[31m-|.if X64[m
[31m-|  mov64 tmp, U64x(val,00000000); movd reg, tmp[m
[31m-|.else[m
[31m-|  mov tmp, 0x .. val; movd reg, tmp; pshufd reg, reg, 0x51[m
[31m-|.endif[m
[31m-|.endmacro[m
[31m-|[m
[31m-|.macro sseconst_sign, reg, tmp		// Synthesize sign mask.[m
[31m-|  sseconst_hi reg, tmp, 80000000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_1, reg, tmp		// Synthesize 1.0.[m
[31m-|  sseconst_hi reg, tmp, 3ff00000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_m1, reg, tmp		// Synthesize -1.0.[m
[31m-|  sseconst_hi reg, tmp, bff00000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_2p52, reg, tmp		// Synthesize 2^52.[m
[31m-|  sseconst_hi reg, tmp, 43300000[m
[31m-|.endmacro[m
[31m-|.macro sseconst_tobit, reg, tmp	// Synthesize 2^52 + 2^51.[m
[31m-|  sseconst_hi reg, tmp, 43380000[m
[31m-|.endmacro[m
[31m-|[m
[31m-|// Move table write barrier back. Overwrites reg.[m
[31m-|.macro barrierback, tab, reg[m
[31m-|  and byte tab->marked, (uint8_t)~LJ_GC_BLACK	// black2gray(tab)[m
[31m-|  mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)][m
[31m-|  mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab[m
[31m-|  mov tab->gclist, reg[m
[31m-|.endmacro[m
[31m-|[m
[31m-|//-----------------------------------------------------------------------[m
[31m-[m
[31m-/* Generate subroutines used by opcodes and other parts of the VM. */[m
[31m-/* The .code_sub section should be last to help static branch prediction. */[m
[31m-static void build_subroutines(BuildCtx *ctx)[m
[31m-{[m
[31m-  |.code_sub[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Return handling ----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_returnp:[m
[31m-  |  test PC, FRAME_P[m
[31m-  |  jz ->cont_dispatch[m
[31m-  |[m
[31m-  |  // Return from pcall or xpcall fast func.[m
[31m-  |  and PC, -8[m
[31m-  |  sub BASE, PC			// Restore caller base.[m
[31m-  |  lea RAa, [RA+PC-8]			// Rebase RA and prepend one result.[m
[31m-  |  mov PC, [BASE-4]			// Fetch PC of previous frame.[m
[31m-  |  // Prepending may overwrite the pcall frame, so do it at the end.[m
[31m-  |  mov dword [BASE+RA+4], LJ_TTRUE	// Prepend true to results.[m
[31m-  |[m
[31m-  |->vm_returnc:[m
[31m-  |  add RD, 1				// RD = nresults+1[m
[31m-  |  jz ->vm_unwind_yield[m
[31m-  |  mov MULTRES, RD[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z			// Handle regular return to Lua.[m
[31m-  |[m
[31m-  |->vm_return:[m
[31m-  |  // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return[m
[31m-  |  xor PC, FRAME_C[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jnz ->vm_returnp[m
[31m-  |[m
[31m-  |  // Return to C.[m
[31m-  |  set_vmstate C[m
[31m-  |  and PC, -8[m
[31m-  |  sub PC, BASE[m
[31m-  |  neg PC				// Previous base = BASE - delta.[m
[31m-  |[m
[31m-  |  sub RD, 1[m
[31m-  |  jz >2[m
[31m-  |1:  // Move results down.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [BASE+RA][m
[31m-  |  mov [BASE-8], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [BASE+RA][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  mov RB, [BASE+RA+4][m
[31m-  |  mov [BASE-4], RB[m
[31m-  |.endif[m
[31m-  |  add BASE, 8[m
[31m-  |  sub RD, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, PC[m
[31m-  |3:[m
[31m-  |  mov RD, MULTRES[m
[31m-  |  mov RA, SAVE_NRES			// RA = wanted nresults+1[m
[31m-  |4:[m
[31m-  |  cmp RA, RD[m
[31m-  |  jne >6				// More/less results wanted?[m
[31m-  |5:[m
[31m-  |  sub BASE, 8[m
[31m-  |  mov L:RB->top, BASE[m
[31m-  |[m
[31m-  |->vm_leave_cp:[m
[31m-  |  mov RAa, SAVE_CFRAME		// Restore previous C frame.[m
[31m-  |  mov L:RB->cframe, RAa[m
[31m-  |  xor eax, eax			// Ok return status for vm_pcall.[m
[31m-  |[m
[31m-  |->vm_leave_unw:[m
[31m-  |  restoreregs[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  jb >7				// Less results wanted?[m
[31m-  |  // More results wanted. Check stack size and fill up results with nil.[m
[31m-  |  cmp BASE, L:RB->maxstack[m
[31m-  |  ja >8[m
[31m-  |  mov dword [BASE-4], LJ_TNIL[m
[31m-  |  add BASE, 8[m
[31m-  |  add RD, 1[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |7:  // Less results wanted.[m
[31m-  |  test RA, RA[m
[31m-  |  jz <5				// But check for LUA_MULTRET+1.[m
[31m-  |  sub RA, RD				// Negative result![m
[31m-  |  lea BASE, [BASE+RA*8]		// Correct top.[m
[31m-  |  jmp <5[m
[31m-  |[m
[31m-  |8:  // Corner case: need to grow stack for filling up results.[m
[31m-  |  // This can happen if:[m
[31m-  |  // - A C function grows the stack (a lot).[m
[31m-  |  // - The GC shrinks the stack in between.[m
[31m-  |  // - A return back from a lua_call() with (high) nresults adjustment.[m
[31m-  |  mov L:RB->top, BASE		// Save current top held in BASE (yes).[m
[31m-  |  mov MULTRES, RD			// Need to fill only remainder with nil.[m
[31m-  |  mov FCARG2, RA[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->top		// Need the (realloced) L->top in BASE.[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->vm_unwind_yield:[m
[31m-  |  mov al, LUA_YIELD[m
[31m-  |  jmp ->vm_unwind_c_eh[m
[31m-  |[m
[31m-  |->vm_unwind_c@8:			// Unwind C stack, return from vm_pcall.[m
[31m-  |  // (void *cframe, int errcode)[m
[31m-  |.if X64[m
[31m-  |  mov eax, CARG2d			// Error return status for vm_pcall.[m
[31m-  |  mov rsp, CARG1[m
[31m-  |.else[m
[31m-  |  mov eax, FCARG2			// Error return status for vm_pcall.[m
[31m-  |  mov esp, FCARG1[m
[31m-  |.endif[m
[31m-  |->vm_unwind_c_eh:			// Landing pad for external unwinder.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov GL:RB, L:RB->glref[m
[31m-  |  mov dword GL:RB->vmstate, ~LJ_VMST_C[m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |[m
[31m-  |->vm_unwind_rethrow:[m
[31m-  |.if X64 and not X64WIN[m
[31m-  |  mov FCARG1, SAVE_L[m
[31m-  |  mov FCARG2, eax[m
[31m-  |  restoreregs[m
[31m-  |  jmp extern lj_err_throw@8		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_unwind_ff@4:			// Unwind C stack, return from ff pcall.[m
[31m-  |  // (void *cframe)[m
[31m-  |.if X64[m
[31m-  |  and CARG1, CFRAME_RAWMASK[m
[31m-  |  mov rsp, CARG1[m
[31m-  |.else[m
[31m-  |  and FCARG1, CFRAME_RAWMASK[m
[31m-  |  mov esp, FCARG1[m
[31m-  |.endif[m
[31m-  |->vm_unwind_ff_eh:			// Landing pad for external unwinder.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov RAa, -8			// Results start at BASE+RA = BASE-8.[m
[31m-  |  mov RD, 1+1			// Really 1+2 results, incr. later.[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov PC, [BASE-4]			// Fetch PC of previous frame.[m
[31m-  |  mov dword [BASE-4], LJ_TFALSE	// Prepend false to error message.[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  jmp ->vm_returnc			// Increments RD/MULTRES and returns.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Grow stack for calls -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_growstack_c:			// Grow stack for C function.[m
[31m-  |  mov FCARG2, LUA_MINSTACK[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vm_growstack_v:			// Grow stack for vararg Lua function.[m
[31m-  |  sub RD, 8[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_growstack_f:			// Grow stack for fixarg Lua function.[m
[31m-  |  // BASE = new base, RD = nargs+1, RB = L, PC = first PC[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |1:[m
[31m-  |  movzx RA, byte [PC-4+PC2PROTO(framesize)][m
[31m-  |  add PC, 4				// Must point after first instruction.[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  mov FCARG2, RA[m
[31m-  |2:[m
[31m-  |  // RB = L, L->base = new base, L->top = top[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  mov LFUNC:RB, [BASE-8][m
[31m-  |  sub RD, BASE[m
[31m-  |  shr RD, 3[m
[31m-  |  add NARGS:RD, 1[m
[31m-  |  // BASE = new base, RB = LFUNC, RD = nargs+1[m
[31m-  |  ins_callt				// Just retry the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Entry points into the assembler VM ---------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_resume:				// Setup C frame and resume thread.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0)[m
[31m-  |  saveregs[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[31m-  |  mov SAVE_L, CARG1d[m
[31m-  |  mov RA, CARG2d[m
[31m-  |.else[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov RA, INARG_BASE			// Caveat: overlaps SAVE_CFRAME![m
[31m-  |.endif[m
[31m-  |  mov PC, FRAME_CP[m
[31m-  |  xor RD, RD[m
[31m-  |  lea KBASEa, [esp+CFRAME_RESUME][m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |  mov SAVE_PC, RD			// Any value outside of bytecode is ok.[m
[31m-  |  mov SAVE_CFRAME, RDa[m
[31m-  |.if X64[m
[31m-  |  mov SAVE_NRES, RD[m
[31m-  |  mov SAVE_ERRF, RD[m
[31m-  |.endif[m
[31m-  |  mov L:RB->cframe, KBASEa[m
[31m-  |  cmp byte L:RB->status, RDL[m
[31m-  |  je >2				// Initial resume (like a call).[m
[31m-  |[m
[31m-  |  // Resume after yield (like a return).[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov byte L:RB->status, RDL[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, RA[m
[31m-  |  shr RD, 3[m
[31m-  |  add RD, 1				// RD = nresults+1[m
[31m-  |  sub RA, BASE			// RA = resultofs[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov MULTRES, RD[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |->vm_pcall:				// Setup protected C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, FRAME_CP[m
[31m-  |.if X64[m
[31m-  |  mov SAVE_ERRF, CARG4d[m
[31m-  |.endif[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_call:				// Setup C frame and enter VM.[m
[31m-  |  // (lua_State *L, TValue *base, int nres1)[m
[31m-  |  saveregs[m
[31m-  |  mov PC, FRAME_C[m
[31m-  |[m
[31m-  |1:  // Entry point for vm_pcall above (PC = ftype).[m
[31m-  |.if X64[m
[31m-  |  mov SAVE_NRES, CARG3d[m
[31m-  |  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[31m-  |  mov SAVE_L, CARG1d[m
[31m-  |  mov RA, CARG2d[m
[31m-  |.else[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov RA, INARG_BASE			// Caveat: overlaps SAVE_CFRAME![m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  mov KBASEa, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASEa[m
[31m-  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[31m-  |  add DISPATCH, GG_G2DISP[m
[31m-  |.if X64[m
[31m-  |  mov L:RB->cframe, rsp[m
[31m-  |.else[m
[31m-  |  mov L:RB->cframe, esp[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |2:  // Entry point for vm_resume/vm_cpcall (RA = base, RB = L, PC = ftype).[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov BASE, L:RB->base		// BASE = old base (used in vmeta_call).[m
[31m-  |  add PC, RA[m
[31m-  |  sub PC, BASE			// PC = frame delta + frame type[m
[31m-  |[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, RA[m
[31m-  |  shr NARGS:RD, 3[m
[31m-  |  add NARGS:RD, 1			// RD = nargs+1[m
[31m-  |[m
[31m-  |->vm_call_dispatch:[m
[31m-  |  mov LFUNC:RB, [RA-8][m
[31m-  |  cmp dword [RA-4], LJ_TFUNC[m
[31m-  |  jne ->vmeta_call			// Ensure KBASE defined and != BASE.[m
[31m-  |[m
[31m-  |->vm_call_dispatch_f:[m
[31m-  |  mov BASE, RA[m
[31m-  |  ins_call[m
[31m-  |  // BASE = new base, RB = func, RD = nargs+1, PC = caller PC[m
[31m-  |[m
[31m-  |->vm_cpcall:				// Setup protected C frame, call C.[m
[31m-  |  // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)[m
[31m-  |  saveregs[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, CARG1d			// Caveat: CARG1d may be RA.[m
[31m-  |  mov SAVE_L, CARG1d[m
[31m-  |.else[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  // Caveat: INARG_CP_* and SAVE_CFRAME/SAVE_NRES/SAVE_ERRF overlap![m
[31m-  |  mov RC, INARG_CP_UD		// Get args before they are overwritten.[m
[31m-  |  mov RA, INARG_CP_FUNC[m
[31m-  |  mov BASE, INARG_CP_CALL[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, L:RB			// Any value outside of bytecode is ok.[m
[31m-  |[m
[31m-  |  mov KBASE, L:RB->stack		// Compute -savestack(L, L->top).[m
[31m-  |  sub KBASE, L:RB->top[m
[31m-  |   mov DISPATCH, L:RB->glref		// Setup pointer to dispatch table.[m
[31m-  |  mov SAVE_ERRF, 0			// No error function.[m
[31m-  |  mov SAVE_NRES, KBASE		// Neg. delta means cframe w/o frame.[m
[31m-  |   add DISPATCH, GG_G2DISP[m
[31m-  |  // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe).[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |  mov KBASEa, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASEa[m
[31m-  |  mov L:RB->cframe, rsp[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |[m
[31m-  |  call CARG4			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |.else[m
[31m-  |  mov ARG3, RC			// Have to copy args downwards.[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |[m
[31m-  |  mov KBASE, L:RB->cframe		// Add our C frame to cframe chain.[m
[31m-  |  mov SAVE_CFRAME, KBASE[m
[31m-  |  mov L:RB->cframe, esp[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |[m
[31m-  |  call BASE			// (lua_State *L, lua_CFunction func, void *ud)[m
[31m-  |.endif[m
[31m-  |  // TValue * (new base) or NULL returned in eax (RC).[m
[31m-  |  test RC, RC[m
[31m-  |  jz ->vm_leave_cp			// No base? Just remove C frame.[m
[31m-  |  mov RA, RC[m
[31m-  |  mov PC, FRAME_CP[m
[31m-  |  jmp <2				// Else continue with the call.[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Metamethod handling ------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |//-- Continuation dispatch ----------------------------------------------[m
[31m-  |[m
[31m-  |->cont_dispatch:[m
[31m-  |  // BASE = meta base, RA = resultofs, RD = nresults+1 (also in MULTRES)[m
[31m-  |  add RA, BASE[m
[31m-  |  and PC, -8[m
[31m-  |  mov RB, BASE[m
[31m-  |  sub BASE, PC			// Restore caller BASE.[m
[31m-  |  mov dword [RA+RD*8-4], LJ_TNIL	// Ensure one valid arg.[m
[31m-  |  mov RC, RA				// ... in [RC][m
[31m-  |  mov PC, [RB-12]			// Restore PC from [cont|PC].[m
[31m-  |.if X64[m
[31m-  |  movsxd RAa, dword [RB-16]		// May be negative on WIN64 with debug.[m
[31m-  |.if FFI[m
[31m-  |  cmp RA, 1[m
[31m-  |  jbe >1[m
[31m-  |.endif[m
[31m-  |  lea KBASEa, qword [=>0][m
[31m-  |  add RAa, KBASEa[m
[31m-  |.else[m
[31m-  |  mov RA, dword [RB-16][m
[31m-  |.if FFI[m
[31m-  |  cmp RA, 1[m
[31m-  |  jbe >1[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |  mov LFUNC:KBASE, [BASE-8][m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  // BASE = base, RC = result, RB = meta base[m
[31m-  |  jmp RAa				// Jump to continuation.[m
[31m-  |[m
[31m-  |.if FFI[m
[31m-  |1:[m
[31m-  |  je ->cont_ffi_callback		// cont = 1: return from FFI callback.[m
[31m-  |  // cont = 0: Tail call from C function.[m
[31m-  |  sub RB, BASE[m
[31m-  |  shr RB, 3[m
[31m-  |  lea RD, [RB-1][m
[31m-  |  jmp ->vm_call_tail[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_cat:				// BASE = base, RC = result, RB = mbase[m
[31m-  |  movzx RA, PC_RB[m
[31m-  |  sub RB, 16[m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |  sub RA, RB[m
[31m-  |  je ->cont_ra[m
[31m-  |  neg RA[m
[31m-  |  shr RA, 3[m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3d, RA[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE[m
[31m-  |  mov RCa, [RC][m
[31m-  |  mov [RB], RCa[m
[31m-  |  mov CARG2d, RB[m
[31m-  |.elif X64[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE[m
[31m-  |  mov CARG3d, RA[m
[31m-  |  mov RAa, [RC][m
[31m-  |  mov [RB], RAa[m
[31m-  |  mov CARG2d, RB[m
[31m-  |.else[m
[31m-  |  mov ARG3, RA[m
[31m-  |  mov RA, [RC+4][m
[31m-  |  mov RC, [RC][m
[31m-  |  mov [RB+4], RA[m
[31m-  |  mov [RB], RC[m
[31m-  |  mov ARG2, RB[m
[31m-  |.endif[m
[31m-  |  jmp ->BC_CAT_Z[m
[31m-  |[m
[31m-  |//-- Table indexing metamethods -----------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tgets:[m
[31m-  |  mov TMP1, RC			// RC = GCstr *[m
[31m-  |  mov TMP2, LJ_TSTR[m
[31m-  |  lea RCa, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[31m-  |  cmp PC_OP, BC_GGET[m
[31m-  |  jne >1[m
[31m-  |  lea RA, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[31m-  |  mov [RA], TAB:RB			// RB = GCtab *[m
[31m-  |  mov dword [RA+4], LJ_TTAB[m
[31m-  |  mov RB, RA[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_tgetb:[m
[31m-  |  movzx RC, PC_RC[m
[31m-  |.if DUALNUM[m
[31m-  |  mov TMP2, LJ_TISNUM[m
[31m-  |  mov TMP1, RC[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RC[m
[31m-  |  movsd TMPQ, xmm0[m
[31m-  |.endif[m
[31m-  |  lea RCa, TMPQ			// Store temp. TValue in TMPQ.[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_tgetv:[m
[31m-  |  movzx RC, PC_RC			// Reload TValue *k from RC.[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  movzx RB, PC_RB			// Reload TValue *t from RB.[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |.if X64[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-  |  mov CARG2d, RB[m
[31m-  |  mov CARG3, RCa			// May be 64 bit ptr to stack.[m
[31m-  |  mov L:RB, L:CARG1d[m
[31m-  |.else[m
[31m-  |  mov ARG2, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RC[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_tget		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz >3[m
[31m-  |->cont_ra:				// BASE = base, RC = result[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RC][m
[31m-  |  mov [BASE+RA*8], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RC+4][m
[31m-  |  mov RC, [RC][m
[31m-  |  mov [BASE+RA*8+4], RB[m
[31m-  |  mov [BASE+RA*8], RC[m
[31m-  |.endif[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __index metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  mov [RA-12], PC			// [cont|PC][m
[31m-  |  lea PC, [RA+FRAME_CONT][m
[31m-  |  sub PC, BASE[m
[31m-  |  mov LFUNC:RB, [RA-8]		// Guaranteed to be a function here.[m
[31m-  |  mov NARGS:RD, 2+1			// 2 args for func(t, k).[m
[31m-  |  jmp ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tgetr:[m
[31m-  |  mov FCARG1, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov FCARG2, RC			// Caveat: FCARG2 == BASE[m
[31m-  |  call extern lj_tab_getinth@8	// (GCtab *t, int32_t key)[m
[31m-  |  // cTValue * or NULL returned in eax (RC).[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  test RC, RC[m
[31m-  |  jnz ->BC_TGETR_Z[m
[31m-  |  mov dword [BASE+RA*8+4], LJ_TNIL[m
[31m-  |  jmp ->BC_TGETR2_Z[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_tsets:[m
[31m-  |  mov TMP1, RC			// RC = GCstr *[m
[31m-  |  mov TMP2, LJ_TSTR[m
[31m-  |  lea RCa, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[31m-  |  cmp PC_OP, BC_GSET[m
[31m-  |  jne >1[m
[31m-  |  lea RA, [DISPATCH+DISPATCH_GL(tmptv)]  // Store fn->l.env in g->tmptv.[m
[31m-  |  mov [RA], TAB:RB			// RB = GCtab *[m
[31m-  |  mov dword [RA+4], LJ_TTAB[m
[31m-  |  mov RB, RA[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_tsetb:[m
[31m-  |  movzx RC, PC_RC[m
[31m-  |.if DUALNUM[m
[31m-  |  mov TMP2, LJ_TISNUM[m
[31m-  |  mov TMP1, RC[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RC[m
[31m-  |  movsd TMPQ, xmm0[m
[31m-  |.endif[m
[31m-  |  lea RCa, TMPQ			// Store temp. TValue in TMPQ.[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_tsetv:[m
[31m-  |  movzx RC, PC_RC			// Reload TValue *k from RC.[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  movzx RB, PC_RB			// Reload TValue *t from RB.[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |.if X64[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-  |  mov CARG2d, RB[m
[31m-  |  mov CARG3, RCa			// May be 64 bit ptr to stack.[m
[31m-  |  mov L:RB, L:CARG1d[m
[31m-  |.else[m
[31m-  |  mov ARG2, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RC[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_tset		// (lua_State *L, TValue *o, TValue *k)[m
[31m-  |  // TValue * (finished) or NULL (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz >3[m
[31m-  |  // NOBARRIER: lj_meta_tset ensures the table is not black.[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [BASE+RA*8][m
[31m-  |  mov [RC], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [BASE+RA*8+4][m
[31m-  |  mov RA, [BASE+RA*8][m
[31m-  |  mov [RC+4], RB[m
[31m-  |  mov [RC], RA[m
[31m-  |.endif[m
[31m-  |->cont_nop:				// BASE = base, (RC = result)[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |3:  // Call __newindex metamethod.[m
[31m-  |  // BASE = base, L->top = new base, stack = cont/func/t/k/(v)[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  mov [RA-12], PC			// [cont|PC][m
[31m-  |  movzx RC, PC_RA[m
[31m-  |  // Copy value to third argument.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [BASE+RC*8][m
[31m-  |  mov [RA+16], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [BASE+RC*8+4][m
[31m-  |  mov RC, [BASE+RC*8][m
[31m-  |  mov [RA+20], RB[m
[31m-  |  mov [RA+16], RC[m
[31m-  |.endif[m
[31m-  |  lea PC, [RA+FRAME_CONT][m
[31m-  |  sub PC, BASE[m
[31m-  |  mov LFUNC:RB, [RA-8]		// Guaranteed to be a function here.[m
[31m-  |  mov NARGS:RD, 3+1			// 3 args for func(t, k, v).[m
[31m-  |  jmp ->vm_call_dispatch_f[m
[31m-  |[m
[31m-  |->vmeta_tsetr:[m
[31m-  |.if X64WIN[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov CARG3d, RC[m
[31m-  |  mov L:CARG1d->base, BASE[m
[31m-  |  xchg CARG2d, TAB:RB		// Caveat: CARG2d == BASE.[m
[31m-  |.elif X64[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov CARG2d, TAB:RB[m
[31m-  |  mov L:CARG1d->base, BASE[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG3d, RC			// Caveat: CARG3d == BASE.[m
[31m-  |.else[m
[31m-  |  mov L:RA, SAVE_L[m
[31m-  |  mov ARG2, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov ARG3, RC[m
[31m-  |  mov ARG1, L:RA[m
[31m-  |  mov L:RA->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_tab_setinth  // (lua_State *L, GCtab *t, int32_t key)[m
[31m-  |  // TValue * returned in eax (RC).[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  jmp ->BC_TSETR_Z[m
[31m-  |[m
[31m-  |//-- Comparison metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_comp:[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d == BASE.[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG3d, [BASE+RD*8][m
[31m-  |  lea CARG2d, [BASE+RA*8][m
[31m-  |.else[m
[31m-  |  lea CARG2d, [BASE+RA*8][m
[31m-  |  lea CARG3d, [BASE+RD*8][m
[31m-  |.endif[m
[31m-  |  mov CARG1d, L:RB			// Caveat: CARG1d/CARG4d == RA.[m
[31m-  |  movzx CARG4d, PC_OP[m
[31m-  |.else[m
[31m-  |  movzx RB, PC_OP[m
[31m-  |  lea RD, [BASE+RD*8][m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |  mov ARG4, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RD[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_comp	// (lua_State *L, TValue *o1, *o2, int op)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |3:[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  cmp RC, 1[m
[31m-  |  ja ->vmeta_binop[m
[31m-  |4:[m
[31m-  |  lea PC, [PC+4][m
[31m-  |  jb >6[m
[31m-  |5:[m
[31m-  |  movzx RD, PC_RD[m
[31m-  |  branchPC RD[m
[31m-  |6:[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |->cont_condt:			// BASE = base, RC = result[m
[31m-  |  add PC, 4[m
[31m-  |  cmp dword [RC+4], LJ_TISTRUECOND	// Branch if result is true.[m
[31m-  |  jb <5[m
[31m-  |  jmp <6[m
[31m-  |[m
[31m-  |->cont_condf:			// BASE = base, RC = result[m
[31m-  |  cmp dword [RC+4], LJ_TISTRUECOND	// Branch if result is false.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |->vmeta_equal:[m
[31m-  |  sub PC, 4[m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3d, RD[m
[31m-  |  mov CARG4d, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d == BASE.[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG1d, L:RB			// Caveat: CARG1d == RA.[m
[31m-  |.elif X64[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG4d, RB			// Caveat: CARG4d == RA.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG3d == BASE.[m
[31m-  |  mov CARG3d, RD[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  mov ARG4, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RD[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_equal	// (lua_State *L, GCobj *o1, *o2, int ne)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->vmeta_equal_cd:[m
[31m-  |.if FFI[m
[31m-  |  sub PC, 4[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  mov FCARG2, dword [PC-4][m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_equal_cd@8	// (lua_State *L, BCIns ins)[m
[31m-  |  // 0/1 or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vmeta_istype:[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  movzx CARG3d, PC_RD[m
[31m-  |  mov L:CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  movzx RD, PC_RD[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG3, RD[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_istype  // (lua_State *L, BCReg ra, BCReg tp)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <6[m
[31m-  |[m
[31m-  |//-- Arithmetic metamethods ---------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_arith_vno:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RB, PC_RB[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vn:[m
[31m-  |  lea RC, [KBASE+RC*8][m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vmeta_arith_nvo:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RC, PC_RC[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_nv:[m
[31m-  |  lea RC, [KBASE+RC*8][m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |  xchg RB, RC[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_unm:[m
[31m-  |  lea RC, [BASE+RD*8][m
[31m-  |  mov RB, RC[m
[31m-  |  jmp >2[m
[31m-  |[m
[31m-  |->vmeta_arith_vvo:[m
[31m-  |.if DUALNUM[m
[31m-  |  movzx RB, PC_RB[m
[31m-  |.endif[m
[31m-  |->vmeta_arith_vv:[m
[31m-  |  lea RC, [BASE+RC*8][m
[31m-  |1:[m
[31m-  |  lea RB, [BASE+RB*8][m
[31m-  |2:[m
[31m-  |  lea RA, [BASE+RA*8][m
[31m-  |.if X64WIN[m
[31m-  |  mov CARG3d, RB[m
[31m-  |  mov CARG4d, RC[m
[31m-  |  movzx RC, PC_OP[m
[31m-  |  mov ARG5d, RC[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d == BASE.[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG1d, L:RB			// Caveat: CARG1d == RA.[m
[31m-  |.elif X64[m
[31m-  |  movzx CARG5d, PC_OP[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG4d, RC			// Caveat: CARG4d == RA.[m
[31m-  |  mov L:CARG1d, SAVE_L[m
[31m-  |  mov L:CARG1d->base, BASE		// Caveat: CARG3d == BASE.[m
[31m-  |  mov CARG3d, RB[m
[31m-  |  mov L:RB, L:CARG1d[m
[31m-  |.else[m
[31m-  |  mov ARG3, RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG4, RC[m
[31m-  |  movzx RC, PC_OP[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG5, RC[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_arith	// (lua_State *L, TValue *ra,*rb,*rc, BCReg op)[m
[31m-  |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RC, RC[m
[31m-  |  jz ->cont_nop[m
[31m-  |[m
[31m-  |  // Call metamethod for binary op.[m
[31m-  |->vmeta_binop:[m
[31m-  |  // BASE = base, RC = new base, stack = cont/func/o1/o2[m
[31m-  |  mov RA, RC[m
[31m-  |  sub RC, BASE[m
[31m-  |  mov [RA-12], PC			// [cont|PC][m
[31m-  |  lea PC, [RC+FRAME_CONT][m
[31m-  |  mov NARGS:RD, 2+1			// 2 args for func(o1, o2).[m
[31m-  |  jmp ->vm_call_dispatch[m
[31m-  |[m
[31m-  |->vmeta_len:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea FCARG2, [BASE+RD*8]		// Caveat: FCARG2 == BASE[m
[31m-  |  mov L:FCARG1, L:RB[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_len@8		// (lua_State *L, TValue *o)[m
[31m-  |  // NULL (retry) or TValue * (metamethod) returned in eax (RC).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-#if LJ_52[m
[31m-  |  test RC, RC[m
[31m-  |  jne ->vmeta_binop			// Binop call for compatibility.[m
[31m-  |  movzx RD, PC_RD[m
[31m-  |  mov TAB:FCARG1, [BASE+RD*8][m
[31m-  |  jmp ->BC_LEN_Z[m
[31m-#else[m
[31m-  |  jmp ->vmeta_binop			// Binop call for compatibility.[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-- Call metamethod ----------------------------------------------------[m
[31m-  |[m
[31m-  |->vmeta_call_ra:[m
[31m-  |  lea RA, [BASE+RA*8+8][m
[31m-  |->vmeta_call:			// Resolve and call __call metamethod.[m
[31m-  |  // BASE = old base, RA = new base, RC = nargs+1, PC = return[m
[31m-  |  mov TMP2, RA			// Save RA, RC for us.[m
[31m-  |  mov TMP1, NARGS:RD[m
[31m-  |  sub RA, 8[m
[31m-  |.if X64[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  lea CARG3d, [RA+NARGS:RD*8][m
[31m-  |  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[31m-  |.else[m
[31m-  |  lea RC, [RA+NARGS:RD*8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG2, RA[m
[31m-  |  mov ARG3, RC[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov L:RB->base, BASE		// This is the callers base![m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_call	// (lua_State *L, TValue *func, TValue *top)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RA, TMP2[m
[31m-  |  mov NARGS:RD, TMP1[m
[31m-  |  mov LFUNC:RB, [RA-8][m
[31m-  |  add NARGS:RD, 1[m
[31m-  |  // This is fragile. L->base must not move, KBASE must always be defined.[m
[31m-  |  cmp KBASE, BASE			// Continue with CALLT if flag set.[m
[31m-  |  je ->BC_CALLT_Z[m
[31m-  |  mov BASE, RA[m
[31m-  |  ins_call				// Otherwise call resolved metamethod.[m
[31m-  |[m
[31m-  |//-- Argument coercion for 'for' statement ------------------------------[m
[31m-  |[m
[31m-  |->vmeta_for:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG2, RA			// Caveat: FCARG2 == BASE[m
[31m-  |  mov L:FCARG1, L:RB			// Caveat: FCARG1 == RA[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_meta_for@8	// (lua_State *L, TValue *base)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RC, [PC-4][m
[31m-  |  movzx RA, RCH[m
[31m-  |  movzx OP, RCL[m
[31m-  |  shr RC, 16[m
[31m-  |.if X64[m
[31m-  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Retry FORI or JFORI.[m
[31m-  |.else[m
[31m-  |  jmp aword [DISPATCH+OP*4+GG_DISP2STATIC]	// Retry FORI or JFORI.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Fast functions -----------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc, name[m
[31m-  |->ff_ .. name:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_1, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmp NARGS:RD, 1+1;  jb ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_2, name[m
[31m-  |->ff_ .. name:[m
[31m-  |  cmp NARGS:RD, 2+1;  jb ->fff_fallback[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nsse, name, op[m
[31m-  |  .ffunc_1 name[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  op xmm0, qword [BASE][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nsse, name[m
[31m-  |  .ffunc_nsse name, movsd[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nnsse, name[m
[31m-  |  .ffunc_2 name[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  movsd xmm1, qword [BASE+8][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_nnr, name[m
[31m-  |  .ffunc_2 name[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  fld qword [BASE+8][m
[31m-  |  fld qword [BASE][m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |// Inlined GC threshold check. Caveat: uses label 1.[m
[31m-  |.macro ffgccheck[m
[31m-  |  mov RB, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-  |  cmp RB, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-  |  jb >1[m
[31m-  |  call ->fff_gcstep[m
[31m-  |1:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |//-- Base library: checks -----------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 assert[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |  cmp RB, LJ_TISTRUECOND;  jae ->fff_fallback[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov MULTRES, RD[m
[31m-  |  mov [BASE-4], RB[m
[31m-  |  mov RB, [BASE][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  sub RD, 2[m
[31m-  |  jz >2[m
[31m-  |  mov RA, BASE[m
[31m-  |1:[m
[31m-  |  add RA, 8[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RA][m
[31m-  |  mov [RA-8], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RA+4][m
[31m-  |  mov [RA-4], RB[m
[31m-  |  mov RB, [RA][m
[31m-  |  mov [RA-8], RB[m
[31m-  |.endif[m
[31m-  |  sub RD, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  mov RD, MULTRES[m
[31m-  |  jmp ->fff_res_[m
[31m-  |[m
[31m-  |.ffunc_1 type[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |.if X64[m
[31m-  |  mov RA, RB[m
[31m-  |  sar RA, 15[m
[31m-  |  cmp RA, -2[m
[31m-  |  je >3[m
[31m-  |.endif[m
[31m-  |  mov RC, ~LJ_TNUMX[m
[31m-  |  not RB[m
[31m-  |  cmp RC, RB[m
[31m-  |  cmova RC, RB[m
[31m-  |2:[m
[31m-  |  mov CFUNC:RB, [BASE-8][m
[31m-  |  mov STR:RC, [CFUNC:RB+RC*8+((char *)(&((GCfuncC *)0)->upvalue))][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TSTR[m
[31m-  |  mov [BASE-8], STR:RC[m
[31m-  |  jmp ->fff_res1[m
[31m-  |.if X64[m
[31m-  |3:[m
[31m-  |  mov RC, ~LJ_TLIGHTUD[m
[31m-  |  jmp <2[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-- Base library: getters and setters ---------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 getmetatable[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  cmp RB, LJ_TTAB;  jne >6[m
[31m-  |1:  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  mov TAB:RB, TAB:RB->metatable[m
[31m-  |2:[m
[31m-  |  test TAB:RB, TAB:RB[m
[31m-  |  mov dword [BASE-4], LJ_TNIL[m
[31m-  |  jz ->fff_res1[m
[31m-  |  mov STR:RC, [DISPATCH+DISPATCH_GL(gcroot)+4*(GCROOT_MMNAME+MM_metatable)][m
[31m-  |  mov dword [BASE-4], LJ_TTAB	// Store metatable as default result.[m
[31m-  |  mov [BASE-8], TAB:RB[m
[31m-  |  mov RA, TAB:RB->hmask[m
[31m-  |  and RA, STR:RC->hash[m
[31m-  |  imul RA, #NODE[m
[31m-  |  add NODE:RA, TAB:RB->node[m
[31m-  |3:  // Rearranged logic, because we expect _not_ to find the key.[m
[31m-  |  cmp dword NODE:RA->key.it, LJ_TSTR[m
[31m-  |  jne >4[m
[31m-  |  cmp dword NODE:RA->key.gcr, STR:RC[m
[31m-  |  je >5[m
[31m-  |4:[m
[31m-  |  mov NODE:RA, NODE:RA->next[m
[31m-  |  test NODE:RA, NODE:RA[m
[31m-  |  jnz <3[m
[31m-  |  jmp ->fff_res1			// Not found, keep default result.[m
[31m-  |5:[m
[31m-  |  mov RB, [RA+4][m
[31m-  |  cmp RB, LJ_TNIL;  je ->fff_res1	// Ditto for nil value.[m
[31m-  |  mov RC, [RA][m
[31m-  |  mov [BASE-4], RB			// Return value of mt.__metatable.[m
[31m-  |  mov [BASE-8], RC[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |6:[m
[31m-  |  cmp RB, LJ_TUDATA;  je <1[m
[31m-  |.if X64[m
[31m-  |  cmp RB, LJ_TNUMX;  ja >8[m
[31m-  |  cmp RB, LJ_TISNUM;  jbe >7[m
[31m-  |  mov RB, LJ_TLIGHTUD[m
[31m-  |  jmp >8[m
[31m-  |7:[m
[31m-  |.else[m
[31m-  |  cmp RB, LJ_TISNUM;  ja >8[m
[31m-  |.endif[m
[31m-  |  mov RB, LJ_TNUMX[m
[31m-  |8:[m
[31m-  |  not RB[m
[31m-  |  mov TAB:RB, [DISPATCH+RB*4+DISPATCH_GL(gcroot[GCROOT_BASEMT])][m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |.ffunc_2 setmetatable[m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |  // Fast path: no mt for table yet and not clearing the mt.[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  cmp dword TAB:RB->metatable, 0;  jne ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |  mov TAB:RC, [BASE+8][m
[31m-  |  mov TAB:RB->metatable, TAB:RC[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TTAB		// Return original table.[m
[31m-  |  mov [BASE-8], TAB:RB[m
[31m-  |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-  |  jz >1[m
[31m-  |  // Possible write barrier. Table is black, but skip iswhite(mt) check.[m
[31m-  |  barrierback TAB:RB, RC[m
[31m-  |1:[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_2 rawget[m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |.if X64WIN[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  lea CARG3d, [BASE+8][m
[31m-  |  mov CARG2d, [BASE]			// Caveat: CARG2d == BASE.[m
[31m-  |  mov CARG1d, SAVE_L[m
[31m-  |.elif X64[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov CARG2d, [BASE][m
[31m-  |  lea CARG3d, [BASE+8]		// Caveat: CARG3d == BASE.[m
[31m-  |  mov CARG1d, SAVE_L[m
[31m-  |.else[m
[31m-  |  mov TAB:RD, [BASE][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov ARG2, TAB:RD[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  add BASE, 8[m
[31m-  |  mov ARG3, BASE[m
[31m-  |.endif[m
[31m-  |  call extern lj_tab_get	// (lua_State *L, GCtab *t, cTValue *key)[m
[31m-  |  // cTValue * returned in eax (RD).[m
[31m-  |  mov BASE, RB			// Restore BASE.[m
[31m-  |  // Copy table slot.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RD][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov [BASE-8], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RD][m
[31m-  |  mov RD, [RD+4][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  mov [BASE-4], RD[m
[31m-  |.endif[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |//-- Base library: conversions ------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc tonumber[m
[31m-  |  // Only handles the number case inline (without a base argument).[m
[31m-  |  cmp NARGS:RD, 1+1;  jne ->fff_fallback	// Exactly one argument.[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne >1[m
[31m-  |  mov RB, dword [BASE]; jmp ->fff_resi[m
[31m-  |1:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE]; jmp ->fff_resxmm0[m
[31m-  |[m
[31m-  |.ffunc_1 tostring[m
[31m-  |  // Only handles the string or number case inline.[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  cmp dword [BASE+4], LJ_TSTR;  jne >3[m
[31m-  |  // A __tostring method in the string base metatable is ignored.[m
[31m-  |  mov STR:RD, [BASE][m
[31m-  |2:[m
[31m-  |  mov dword [BASE-4], LJ_TSTR[m
[31m-  |  mov [BASE-8], STR:RD[m
[31m-  |  jmp ->fff_res1[m
[31m-  |3:  // Handle numbers inline, unless a number base metatable is present.[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM;  ja ->fff_fallback[m
[31m-  |  cmp dword [DISPATCH+DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])], 0[m
[31m-  |  jne ->fff_fallback[m
[31m-  |  ffgccheck				// Caveat: uses label 1.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |.if X64 and not X64WIN[m
[31m-  |  mov FCARG2, BASE			// Otherwise: FCARG2 == BASE[m
[31m-  |.endif[m
[31m-  |  mov L:FCARG1, L:RB[m
[31m-  |.if DUALNUM[m
[31m-  |  call extern lj_strfmt_number@8	// (lua_State *L, cTValue *o)[m
[31m-  |.else[m
[31m-  |  call extern lj_strfmt_num@8	// (lua_State *L, lua_Number *np)[m
[31m-  |.endif[m
[31m-  |  // GCstr returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |//-- Base library: iterators -------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 next[m
[31m-  |  je >2				// Missing 2nd arg?[m
[31m-  |1:[m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE		// Add frame since C call can throw.[m
[31m-  |  mov L:RB->top, BASE		// Dummy frame length is ok.[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG3d, [BASE+8][m
[31m-  |  mov CARG2d, [BASE]			// Caveat: CARG2d == BASE.[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.elif X64[m
[31m-  |  mov CARG2d, [BASE][m
[31m-  |  lea CARG3d, [BASE+8]		// Caveat: CARG3d == BASE.[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  mov TAB:RD, [BASE][m
[31m-  |  mov ARG2, TAB:RD[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |  add BASE, 8[m
[31m-  |  mov ARG3, BASE[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC			// Needed for ITERN fallback.[m
[31m-  |  call extern lj_tab_next	// (lua_State *L, GCtab *t, TValue *key)[m
[31m-  |  // Flag returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  test RD, RD;  jz >3		// End of traversal?[m
[31m-  |  // Copy key and value to results.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [BASE+8][m
[31m-  |  mov RDa, [BASE+16][m
[31m-  |  mov [BASE-8], RBa[m
[31m-  |  mov [BASE], RDa[m
[31m-  |.else[m
[31m-  |  mov RB, [BASE+8][m
[31m-  |  mov RD, [BASE+12][m
[31m-  |  mov [BASE-8], RB[m
[31m-  |  mov [BASE-4], RD[m
[31m-  |  mov RB, [BASE+16][m
[31m-  |  mov RD, [BASE+20][m
[31m-  |  mov [BASE], RB[m
[31m-  |  mov [BASE+4], RD[m
[31m-  |.endif[m
[31m-  |->fff_res2:[m
[31m-  |  mov RD, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |2:  // Set missing 2nd arg to nil.[m
[31m-  |  mov dword [BASE+12], LJ_TNIL[m
[31m-  |  jmp <1[m
[31m-  |3:  // End of traversal: return nil.[m
[31m-  |  mov dword [BASE-4], LJ_TNIL[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc_1 pairs[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  cmp dword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CFUNC:RB, [BASE-8][m
[31m-  |  mov CFUNC:RD, CFUNC:RB->upvalue[0][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TFUNC[m
[31m-  |  mov [BASE-8], CFUNC:RD[m
[31m-  |  mov dword [BASE+12], LJ_TNIL[m
[31m-  |  mov RD, 1+3[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_2 ipairs_aux[m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |.if DUALNUM[m
[31m-  |  mov RD, dword [BASE+8][m
[31m-  |  add RD, 1[m
[31m-  |  mov dword [BASE-4], LJ_TISNUM[m
[31m-  |  mov dword [BASE-8], RD[m
[31m-  |.else[m
[31m-  |  movsd xmm0, qword [BASE+8][m
[31m-  |  sseconst_1 xmm1, RBa[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  cvttsd2si RD, xmm0[m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |.endif[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  cmp RD, TAB:RB->asize;  jae >2	// Not in array part?[m
[31m-  |  shl RD, 3[m
[31m-  |  add RD, TAB:RB->array[m
[31m-  |1:[m
[31m-  |  cmp dword [RD+4], LJ_TNIL;  je ->fff_res0[m
[31m-  |  // Copy array slot.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RD][m
[31m-  |  mov [BASE], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RD][m
[31m-  |  mov RD, [RD+4][m
[31m-  |  mov [BASE], RB[m
[31m-  |  mov [BASE+4], RD[m
[31m-  |.endif[m
[31m-  |  jmp ->fff_res2[m
[31m-  |2:  // Check for empty hash part first. Otherwise call C function.[m
[31m-  |  cmp dword TAB:RB->hmask, 0; je ->fff_res0[m
[31m-  |  mov FCARG1, TAB:RB[m
[31m-  |  mov RB, BASE			// Save BASE.[m
[31m-  |  mov FCARG2, RD			// Caveat: FCARG2 == BASE[m
[31m-  |  call extern lj_tab_getinth@8	// (GCtab *t, int32_t key)[m
[31m-  |  // cTValue * or NULL returned in eax (RD).[m
[31m-  |  mov BASE, RB[m
[31m-  |  test RD, RD[m
[31m-  |  jnz <1[m
[31m-  |->fff_res0:[m
[31m-  |  mov RD, 1+0[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |.ffunc_1 ipairs[m
[31m-  |  mov TAB:RB, [BASE][m
[31m-  |  cmp dword [BASE+4], LJ_TTAB;  jne ->fff_fallback[m
[31m-#if LJ_52[m
[31m-  |  cmp dword TAB:RB->metatable, 0; jne ->fff_fallback[m
[31m-#endif[m
[31m-  |  mov CFUNC:RB, [BASE-8][m
[31m-  |  mov CFUNC:RD, CFUNC:RB->upvalue[0][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TFUNC[m
[31m-  |  mov [BASE-8], CFUNC:RD[m
[31m-  |.if DUALNUM[m
[31m-  |  mov dword [BASE+12], LJ_TISNUM[m
[31m-  |  mov dword [BASE+8], 0[m
[31m-  |.else[m
[31m-  |  xorps xmm0, xmm0[m
[31m-  |  movsd qword [BASE+8], xmm0[m
[31m-  |.endif[m
[31m-  |  mov RD, 1+3[m
[31m-  |  jmp ->fff_res[m
[31m-  |[m
[31m-  |//-- Base library: catch errors ----------------------------------------[m
[31m-  |[m
[31m-  |.ffunc_1 pcall[m
[31m-  |  lea RA, [BASE+8][m
[31m-  |  sub NARGS:RD, 1[m
[31m-  |  mov PC, 8+FRAME_PCALL[m
[31m-  |1:[m
[31m-  |  movzx RB, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  shr RB, HOOK_ACTIVE_SHIFT[m
[31m-  |  and RB, 1[m
[31m-  |  add PC, RB				// Remember active hook before pcall.[m
[31m-  |  jmp ->vm_call_dispatch[m
[31m-  |[m
[31m-  |.ffunc_2 xpcall[m
[31m-  |  cmp dword [BASE+12], LJ_TFUNC;  jne ->fff_fallback[m
[31m-  |  mov RB, [BASE+4]			// Swap function and traceback.[m
[31m-  |  mov [BASE+12], RB[m
[31m-  |  mov dword [BASE+4], LJ_TFUNC[m
[31m-  |  mov LFUNC:RB, [BASE][m
[31m-  |  mov PC, [BASE+8][m
[31m-  |  mov [BASE+8], LFUNC:RB[m
[31m-  |  mov [BASE], PC[m
[31m-  |  lea RA, [BASE+16][m
[31m-  |  sub NARGS:RD, 2[m
[31m-  |  mov PC, 16+FRAME_PCALL[m
[31m-  |  jmp <1[m
[31m-  |[m
[31m-  |//-- Coroutine library --------------------------------------------------[m
[31m-  |[m
[31m-  |.macro coroutine_resume_wrap, resume[m
[31m-  |.if resume[m
[31m-  |.ffunc_1 coroutine_resume[m
[31m-  |  mov L:RB, [BASE][m
[31m-  |.else[m
[31m-  |.ffunc coroutine_wrap_aux[m
[31m-  |  mov CFUNC:RB, [BASE-8][m
[31m-  |  mov L:RB, CFUNC:RB->upvalue[0].gcr[m
[31m-  |.endif[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |.if X64[m
[31m-  |  mov TMP1, L:RB[m
[31m-  |.else[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |.endif[m
[31m-  |.if resume[m
[31m-  |  cmp dword [BASE+4], LJ_TTHREAD;  jne ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  cmp aword L:RB->cframe, 0; jne ->fff_fallback[m
[31m-  |  cmp byte L:RB->status, LUA_YIELD;  ja ->fff_fallback[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  je >1				// Status != LUA_YIELD (i.e. 0)?[m
[31m-  |  cmp RA, L:RB->base			// Check for presence of initial func.[m
[31m-  |  je ->fff_fallback[m
[31m-  |1:[m
[31m-  |.if resume[m
[31m-  |  lea PC, [RA+NARGS:RD*8-16]		// Check stack space (-1-thread).[m
[31m-  |.else[m
[31m-  |  lea PC, [RA+NARGS:RD*8-8]		// Check stack space (-1).[m
[31m-  |.endif[m
[31m-  |  cmp PC, L:RB->maxstack; ja ->fff_fallback[m
[31m-  |  mov L:RB->top, PC[m
[31m-  |[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if resume[m
[31m-  |  add BASE, 8			// Keep resumed thread in stack for GC.[m
[31m-  |.endif[m
[31m-  |  mov L:RB->top, BASE[m
[31m-  |.if resume[m
[31m-  |  lea RB, [BASE+NARGS:RD*8-24]	// RB = end of source for stack move.[m
[31m-  |.else[m
[31m-  |  lea RB, [BASE+NARGS:RD*8-16]	// RB = end of source for stack move.[m
[31m-  |.endif[m
[31m-  |  sub RBa, PCa			// Relative to PC.[m
[31m-  |[m
[31m-  |  cmp PC, RA[m
[31m-  |  je >3[m
[31m-  |2:  // Move args to coroutine.[m
[31m-  |.if X64[m
[31m-  |  mov RCa, [PC+RB][m
[31m-  |  mov [PC-8], RCa[m
[31m-  |.else[m
[31m-  |  mov RC, [PC+RB+4][m
[31m-  |  mov [PC-4], RC[m
[31m-  |  mov RC, [PC+RB][m
[31m-  |  mov [PC-8], RC[m
[31m-  |.endif[m
[31m-  |  sub PC, 8[m
[31m-  |  cmp PC, RA[m
[31m-  |  jne <2[m
[31m-  |3:[m
[31m-  |.if X64[m
[31m-  |  mov CARG2d, RA[m
[31m-  |  mov CARG1d, TMP1[m
[31m-  |.else[m
[31m-  |  mov ARG2, RA[m
[31m-  |  xor RA, RA[m
[31m-  |  mov ARG4, RA[m
[31m-  |  mov ARG3, RA[m
[31m-  |.endif[m
[31m-  |  call ->vm_resume			// (lua_State *L, TValue *base, 0, 0)[m
[31m-  |[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |.if X64[m
[31m-  |  mov L:PC, TMP1[m
[31m-  |.else[m
[31m-  |  mov L:PC, ARG1			// The callee doesn't modify SAVE_L.[m
[31m-  |.endif[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-  |  set_vmstate INTERP[m
[31m-  |[m
[31m-  |  cmp eax, LUA_YIELD[m
[31m-  |  ja >8[m
[31m-  |4:[m
[31m-  |  mov RA, L:PC->base[m
[31m-  |  mov KBASE, L:PC->top[m
[31m-  |  mov L:PC->top, RA			// Clear coroutine stack.[m
[31m-  |  mov PC, KBASE[m
[31m-  |  sub PC, RA[m
[31m-  |  je >6				// No results?[m
[31m-  |  lea RD, [BASE+PC][m
[31m-  |  shr PC, 3[m
[31m-  |  cmp RD, L:RB->maxstack[m
[31m-  |  ja >9				// Need to grow stack?[m
[31m-  |[m
[31m-  |  mov RB, BASE[m
[31m-  |  sub RBa, RAa[m
[31m-  |5:  // Move results from coroutine.[m
[31m-  |.if X64[m
[31m-  |  mov RDa, [RA][m
[31m-  |  mov [RA+RB], RDa[m
[31m-  |.else[m
[31m-  |  mov RD, [RA][m
[31m-  |  mov [RA+RB], RD[m
[31m-  |  mov RD, [RA+4][m
[31m-  |  mov [RA+RB+4], RD[m
[31m-  |.endif[m
[31m-  |  add RA, 8[m
[31m-  |  cmp RA, KBASE[m
[31m-  |  jne <5[m
[31m-  |6:[m
[31m-  |.if resume[m
[31m-  |  lea RD, [PC+2]			// nresults+1 = 1 + true + results.[m
[31m-  |  mov dword [BASE-4], LJ_TTRUE	// Prepend true to results.[m
[31m-  |.else[m
[31m-  |  lea RD, [PC+1]			// nresults+1 = 1 + results.[m
[31m-  |.endif[m
[31m-  |7:[m
[31m-  |  mov PC, SAVE_PC[m
[31m-  |  mov MULTRES, RD[m
[31m-  |.if resume[m
[31m-  |  mov RAa, -8[m
[31m-  |.else[m
[31m-  |  xor RA, RA[m
[31m-  |.endif[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jz ->BC_RET_Z[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |8:  // Coroutine returned with error (at co->top-1).[m
[31m-  |.if resume[m
[31m-  |  mov dword [BASE-4], LJ_TFALSE	// Prepend false to results.[m
[31m-  |  mov RA, L:PC->top[m
[31m-  |  sub RA, 8[m
[31m-  |  mov L:PC->top, RA			// Clear error from coroutine stack.[m
[31m-  |  // Copy error message.[m
[31m-  |.if X64[m
[31m-  |  mov RDa, [RA][m
[31m-  |  mov [BASE], RDa[m
[31m-  |.else[m
[31m-  |  mov RD, [RA][m
[31m-  |  mov [BASE], RD[m
[31m-  |  mov RD, [RA+4][m
[31m-  |  mov [BASE+4], RD[m
[31m-  |.endif[m
[31m-  |  mov RD, 1+2			// nresults+1 = 1 + false + error.[m
[31m-  |  jmp <7[m
[31m-  |.else[m
[31m-  |  mov FCARG2, L:PC[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_ffh_coroutine_wrap_err@8  // (lua_State *L, lua_State *co)[m
[31m-  |  // Error function does not return.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |9:  // Handle stack expansion on return from yield.[m
[31m-  |.if X64[m
[31m-  |  mov L:RA, TMP1[m
[31m-  |.else[m
[31m-  |  mov L:RA, ARG1			// The callee doesn't modify SAVE_L.[m
[31m-  |.endif[m
[31m-  |  mov L:RA->top, KBASE		// Undo coroutine stack clearing.[m
[31m-  |  mov FCARG2, PC[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-  |.if X64[m
[31m-  |  mov L:PC, TMP1[m
[31m-  |.else[m
[31m-  |  mov L:PC, ARG1[m
[31m-  |.endif[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp <4				// Retry the stack move.[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  coroutine_resume_wrap 1		// coroutine.resume[m
[31m-  |  coroutine_resume_wrap 0		// coroutine.wrap[m
[31m-  |[m
[31m-  |.ffunc coroutine_yield[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  test aword L:RB->cframe, CFRAME_RESUME[m
[31m-  |  jz ->fff_fallback[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  xor RD, RD[m
[31m-  |  mov aword L:RB->cframe, RDa[m
[31m-  |  mov al, LUA_YIELD[m
[31m-  |  mov byte L:RB->status, al[m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |[m
[31m-  |//-- Math library -------------------------------------------------------[m
[31m-  |[m
[31m-  |.if not DUALNUM[m
[31m-  |->fff_resi:  // Dummy.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->fff_resn:[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  fstp qword [BASE-8][m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |  .ffunc_1 math_abs[m
[31m-  |.if DUALNUM[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jne >2[m
[31m-  |  mov RB, dword [BASE][m
[31m-  |  cmp RB, 0; jns ->fff_resi[m
[31m-  |  neg RB; js >1[m
[31m-  |->fff_resbit:[m
[31m-  |->fff_resi:[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TISNUM[m
[31m-  |  mov dword [BASE-8], RB[m
[31m-  |  jmp ->fff_res1[m
[31m-  |1:[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], 0x41e00000  // 2^31.[m
[31m-  |  mov dword [BASE-8], 0[m
[31m-  |  jmp ->fff_res1[m
[31m-  |2:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  sseconst_abs xmm1, RDa[m
[31m-  |  andps xmm0, xmm1[m
[31m-  |->fff_resxmm0:[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |  // fallthrough[m
[31m-  |[m
[31m-  |->fff_res1:[m
[31m-  |  mov RD, 1+1[m
[31m-  |->fff_res:[m
[31m-  |  mov MULTRES, RD[m
[31m-  |->fff_res_:[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jnz >7[m
[31m-  |5:[m
[31m-  |  cmp PC_RB, RDL			// More results expected?[m
[31m-  |  ja >6[m
[31m-  |  // Adjust BASE. KBASE is assumed to be set for the calling frame.[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  not RAa				// Note: ~RA = -(RA+1)[m
[31m-  |  lea BASE, [BASE+RA*8]		// base = base - (RA+1)*8[m
[31m-  |  ins_next[m
[31m-  |[m
[31m-  |6:  // Fill up results with nil.[m
[31m-  |  mov dword [BASE+RD*8-12], LJ_TNIL[m
[31m-  |  add RD, 1[m
[31m-  |  jmp <5[m
[31m-  |[m
[31m-  |7:  // Non-standard return case.[m
[31m-  |  mov RAa, -8			// Results start at BASE+RA = BASE-8.[m
[31m-  |  jmp ->vm_return[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |.define fff_resfp, fff_resxmm0[m
[31m-  |.else[m
[31m-  |.define fff_resfp, fff_resn[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.macro math_round, func[m
[31m-  |  .ffunc math_ .. func[m
[31m-  |.if DUALNUM[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jne >1[m
[31m-  |  mov RB, dword [BASE]; jmp ->fff_resi[m
[31m-  |1:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  call ->vm_ .. func .. _sse[m
[31m-  |.if DUALNUM[m
[31m-  |  cvttsd2si RB, xmm0[m
[31m-  |  cmp RB, 0x80000000[m
[31m-  |  jne ->fff_resi[m
[31m-  |  cvtsi2sd xmm1, RB[m
[31m-  |  ucomisd xmm0, xmm1[m
[31m-  |  jp ->fff_resxmm0[m
[31m-  |  je ->fff_resi[m
[31m-  |.endif[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_round floor[m
[31m-  |  math_round ceil[m
[31m-  |[m
[31m-  |.ffunc_nsse math_sqrt, sqrtsd; jmp ->fff_resxmm0[m
[31m-  |[m
[31m-  |.ffunc math_log[m
[31m-  |  cmp NARGS:RD, 1+1; jne ->fff_fallback	// Exactly one argument.[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |.if not X64[m
[31m-  |  movsd FPARG1, xmm0[m
[31m-  |.endif[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern log[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resfp[m
[31m-  |[m
[31m-  |.macro math_extern, func[m
[31m-  |  .ffunc_nsse math_ .. func[m
[31m-  |.if not X64[m
[31m-  |  movsd FPARG1, xmm0[m
[31m-  |.endif[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern func[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resfp[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro math_extern2, func[m
[31m-  |  .ffunc_nnsse math_ .. func[m
[31m-  |.if not X64[m
[31m-  |  movsd FPARG1, xmm0[m
[31m-  |  movsd FPARG3, xmm1[m
[31m-  |.endif[m
[31m-  |  mov RB, BASE[m
[31m-  |  call extern func[m
[31m-  |  mov BASE, RB[m
[31m-  |  jmp ->fff_resfp[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_extern log10[m
[31m-  |  math_extern exp[m
[31m-  |  math_extern sin[m
[31m-  |  math_extern cos[m
[31m-  |  math_extern tan[m
[31m-  |  math_extern asin[m
[31m-  |  math_extern acos[m
[31m-  |  math_extern atan[m
[31m-  |  math_extern sinh[m
[31m-  |  math_extern cosh[m
[31m-  |  math_extern tanh[m
[31m-  |  math_extern2 pow[m
[31m-  |  math_extern2 atan2[m
[31m-  |  math_extern2 fmod[m
[31m-  |[m
[31m-  |.ffunc_nnr math_ldexp;	fscale; fpop1;	jmp ->fff_resn[m
[31m-  |[m
[31m-  |.ffunc_1 math_frexp[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |  cmp RB, LJ_TISNUM;  jae ->fff_fallback[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov RC, [BASE][m
[31m-  |  mov [BASE-4], RB; mov [BASE-8], RC[m
[31m-  |  shl RB, 1; cmp RB, 0xffe00000; jae >3[m
[31m-  |  or RC, RB; jz >3[m
[31m-  |  mov RC, 1022[m
[31m-  |  cmp RB, 0x00200000; jb >4[m
[31m-  |1:[m
[31m-  |  shr RB, 21; sub RB, RC		// Extract and unbias exponent.[m
[31m-  |  cvtsi2sd xmm0, RB[m
[31m-  |  mov RB, [BASE-4][m
[31m-  |  and RB, 0x800fffff			// Mask off exponent.[m
[31m-  |  or RB, 0x3fe00000			// Put mantissa in range [0.5,1) or 0.[m
[31m-  |  mov [BASE-4], RB[m
[31m-  |2:[m
[31m-  |  movsd qword [BASE], xmm0[m
[31m-  |  mov RD, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |3:  // Return +-0, +-Inf, NaN unmodified and an exponent of 0.[m
[31m-  |  xorps xmm0, xmm0; jmp <2[m
[31m-  |4:  // Handle denormals by multiplying with 2^54 and adjusting the bias.[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |  sseconst_hi xmm1, RBa, 43500000  // 2^54.[m
[31m-  |  mulsd xmm0, xmm1[m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |  mov RB, [BASE-4]; mov RC, 1076; shl RB, 1; jmp <1[m
[31m-  |[m
[31m-  |.ffunc_nsse math_modf[m
[31m-  |  mov RB, [BASE+4][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  shl RB, 1; cmp RB, 0xffe00000; je >4	// +-Inf?[m
[31m-  |  movaps xmm4, xmm0[m
[31m-  |  call ->vm_trunc_sse[m
[31m-  |  subsd xmm4, xmm0[m
[31m-  |1:[m
[31m-  |  movsd qword [BASE-8], xmm0[m
[31m-  |  movsd qword [BASE], xmm4[m
[31m-  |  mov RC, [BASE-4]; mov RB, [BASE+4][m
[31m-  |  xor RC, RB; js >3				// Need to adjust sign?[m
[31m-  |2:[m
[31m-  |  mov RD, 1+2[m
[31m-  |  jmp ->fff_res[m
[31m-  |3:[m
[31m-  |  xor RB, 0x80000000; mov [BASE+4], RB	// Flip sign of fraction.[m
[31m-  |  jmp <2[m
[31m-  |4:[m
[31m-  |  xorps xmm4, xmm4; jmp <1			// Return +-Inf and +-0.[m
[31m-  |[m
[31m-  |.macro math_minmax, name, cmovop, sseop[m
[31m-  |  .ffunc name[m
[31m-  |  mov RA, 2[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne >4[m
[31m-  |  mov RB, dword [BASE][m
[31m-  |1:  // Handle integers.[m
[31m-  |  cmp RA, RD; jae ->fff_resi[m
[31m-  |  cmp dword [BASE+RA*8-4], LJ_TISNUM; jne >3[m
[31m-  |  cmp RB, dword [BASE+RA*8-8][m
[31m-  |  cmovop RB, dword [BASE+RA*8-8][m
[31m-  |  add RA, 1[m
[31m-  |  jmp <1[m
[31m-  |3:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  // Convert intermediate result to number and continue below.[m
[31m-  |  cvtsi2sd xmm0, RB[m
[31m-  |  jmp >6[m
[31m-  |4:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |5:  // Handle numbers or integers.[m
[31m-  |  cmp RA, RD; jae ->fff_resxmm0[m
[31m-  |  cmp dword [BASE+RA*8-4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jb >6[m
[31m-  |  ja ->fff_fallback[m
[31m-  |  cvtsi2sd xmm1, dword [BASE+RA*8-8][m
[31m-  |  jmp >7[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |6:[m
[31m-  |  movsd xmm1, qword [BASE+RA*8-8][m
[31m-  |7:[m
[31m-  |  sseop xmm0, xmm1[m
[31m-  |  add RA, 1[m
[31m-  |  jmp <5[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  math_minmax math_min, cmovg, minsd[m
[31m-  |  math_minmax math_max, cmovl, maxsd[m
[31m-  |[m
[31m-  |//-- String library -----------------------------------------------------[m
[31m-  |[m
[31m-  |.ffunc string_byte			// Only handle the 1-arg case here.[m
[31m-  |  cmp NARGS:RD, 1+1;  jne ->fff_fallback[m
[31m-  |  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  cmp dword STR:RB->len, 1[m
[31m-  |  jb ->fff_res0			// Return no results for empty string.[m
[31m-  |  movzx RB, byte STR:RB[1][m
[31m-  |.if DUALNUM[m
[31m-  |  jmp ->fff_resi[m
[31m-  |.else[m
[31m-  |  cvtsi2sd xmm0, RB; jmp ->fff_resxmm0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.ffunc string_char			// Only handle the 1-arg case here.[m
[31m-  |  ffgccheck[m
[31m-  |  cmp NARGS:RD, 1+1;  jne ->fff_fallback	// *Exactly* 1 arg.[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |  mov RB, dword [BASE][m
[31m-  |  cmp RB, 255;  ja ->fff_fallback[m
[31m-  |  mov TMP2, RB[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |  cvttsd2si RB, qword [BASE][m
[31m-  |  cmp RB, 255;  ja ->fff_fallback[m
[31m-  |  mov TMP2, RB[m
[31m-  |.endif[m
[31m-  |.if X64[m
[31m-  |  mov TMP3, 1[m
[31m-  |.else[m
[31m-  |  mov ARG3, 1[m
[31m-  |.endif[m
[31m-  |  lea RDa, TMP2			// Points to stack. Little-endian.[m
[31m-  |->fff_newstr:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if X64[m
[31m-  |  mov CARG3d, TMP3			// Zero-extended to size_t.[m
[31m-  |  mov CARG2, RDa			// May be 64 bit ptr to stack.[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  mov ARG2, RD[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_str_new		// (lua_State *L, char *str, size_t l)[m
[31m-  |->fff_resstr:[m
[31m-  |  // GCstr * returned in eax (RD).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov PC, [BASE-4][m
[31m-  |  mov dword [BASE-4], LJ_TSTR[m
[31m-  |  mov [BASE-8], STR:RD[m
[31m-  |  jmp ->fff_res1[m
[31m-  |[m
[31m-  |.ffunc string_sub[m
[31m-  |  ffgccheck[m
[31m-  |  mov TMP2, -1[m
[31m-  |  cmp NARGS:RD, 1+2;  jb ->fff_fallback[m
[31m-  |  jna >1[m
[31m-  |  cmp dword [BASE+20], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |  mov RB, dword [BASE+16][m
[31m-  |  mov TMP2, RB[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |  cvttsd2si RB, qword [BASE+16][m
[31m-  |  mov TMP2, RB[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  mov STR:RB, [BASE][m
[31m-  |  mov TMP3, STR:RB[m
[31m-  |  mov RB, STR:RB->len[m
[31m-  |.if DUALNUM[m
[31m-  |  mov RA, dword [BASE+8][m
[31m-  |.else[m
[31m-  |  cvttsd2si RA, qword [BASE+8][m
[31m-  |.endif[m
[31m-  |  mov RC, TMP2[m
[31m-  |  cmp RB, RC				// len < end? (unsigned compare)[m
[31m-  |  jb >5[m
[31m-  |2:[m
[31m-  |  test RA, RA			// start <= 0?[m
[31m-  |  jle >7[m
[31m-  |3:[m
[31m-  |  mov STR:RB, TMP3[m
[31m-  |  sub RC, RA				// start > end?[m
[31m-  |  jl ->fff_emptystr[m
[31m-  |  lea RB, [STR:RB+RA+#STR-1][m
[31m-  |  add RC, 1[m
[31m-  |4:[m
[31m-  |.if X64[m
[31m-  |  mov TMP3, RC[m
[31m-  |.else[m
[31m-  |  mov ARG3, RC[m
[31m-  |.endif[m
[31m-  |  mov RD, RB[m
[31m-  |  jmp ->fff_newstr[m
[31m-  |[m
[31m-  |5:  // Negative end or overflow.[m
[31m-  |  jl >6[m
[31m-  |  lea RC, [RC+RB+1]			// end = end+(len+1)[m
[31m-  |  jmp <2[m
[31m-  |6:  // Overflow.[m
[31m-  |  mov RC, RB				// end = len[m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |7:  // Negative start or underflow.[m
[31m-  |  je >8[m
[31m-  |  add RA, RB				// start = start+(len+1)[m
[31m-  |  add RA, 1[m
[31m-  |  jg <3				// start > 0?[m
[31m-  |8:  // Underflow.[m
[31m-  |  mov RA, 1				// start = 1[m
[31m-  |  jmp <3[m
[31m-  |[m
[31m-  |->fff_emptystr:  // Range underflow.[m
[31m-  |  xor RC, RC				// Zero length. Any ptr in RB is ok.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |.macro ffstring_op, name[m
[31m-  |  .ffunc_1 string_ .. name[m
[31m-  |  ffgccheck[m
[31m-  |  cmp dword [BASE+4], LJ_TSTR;  jne ->fff_fallback[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |   lea SBUF:FCARG1, [DISPATCH+DISPATCH_GL(tmpbuf)][m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov STR:FCARG2, [BASE]		// Caveat: FCARG2 == BASE[m
[31m-  |   mov RC, SBUF:FCARG1->b[m
[31m-  |   mov SBUF:FCARG1->L, L:RB[m
[31m-  |   mov SBUF:FCARG1->p, RC[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_buf_putstr_ .. name .. @8[m
[31m-  |  mov FCARG1, eax[m
[31m-  |  call extern lj_buf_tostr@4[m
[31m-  |  jmp ->fff_resstr[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |ffstring_op reverse[m
[31m-  |ffstring_op lower[m
[31m-  |ffstring_op upper[m
[31m-  |[m
[31m-  |//-- Bit library --------------------------------------------------------[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name, kind, fdef[m
[31m-  |  fdef name[m
[31m-  |.if kind == 2[m
[31m-  |  sseconst_tobit xmm1, RBa[m
[31m-  |.endif[m
[31m-  |  cmp dword [BASE+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne >1[m
[31m-  |  mov RB, dword [BASE][m
[31m-  |.if kind > 0[m
[31m-  |  jmp >2[m
[31m-  |.else[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.endif[m
[31m-  |1:[m
[31m-  |  ja ->fff_fallback[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [BASE][m
[31m-  |.if kind < 2[m
[31m-  |  sseconst_tobit xmm1, RBa[m
[31m-  |.endif[m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  movd RB, xmm0[m
[31m-  |2:[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.macro .ffunc_bit, name, kind[m
[31m-  |  .ffunc_bit name, kind, .ffunc_1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit bit_tobit, 0[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_op, name, ins[m
[31m-  |  .ffunc_bit name, 2[m
[31m-  |  mov TMP2, NARGS:RD			// Save for fallback.[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-16][m
[31m-  |1:[m
[31m-  |  cmp RD, BASE[m
[31m-  |  jbe ->fff_resbit[m
[31m-  |  cmp dword [RD+4], LJ_TISNUM[m
[31m-  |.if DUALNUM[m
[31m-  |  jne >2[m
[31m-  |  ins RB, dword [RD][m
[31m-  |  sub RD, 8[m
[31m-  |  jmp <1[m
[31m-  |2:[m
[31m-  |  ja ->fff_fallback_bit_op[m
[31m-  |.else[m
[31m-  |  jae ->fff_fallback_bit_op[m
[31m-  |.endif[m
[31m-  |  movsd xmm0, qword [RD][m
[31m-  |  addsd xmm0, xmm1[m
[31m-  |  movd RA, xmm0[m
[31m-  |  ins RB, RA[m
[31m-  |  sub RD, 8[m
[31m-  |  jmp <1[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_op bit_band, and[m
[31m-  |.ffunc_bit_op bit_bor, or[m
[31m-  |.ffunc_bit_op bit_bxor, xor[m
[31m-  |[m
[31m-  |.ffunc_bit bit_bswap, 1[m
[31m-  |  bswap RB[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |[m
[31m-  |.ffunc_bit bit_bnot, 1[m
[31m-  |  not RB[m
[31m-  |.if DUALNUM[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.else[m
[31m-  |->fff_resbit:[m
[31m-  |  cvtsi2sd xmm0, RB[m
[31m-  |  jmp ->fff_resxmm0[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->fff_fallback_bit_op:[m
[31m-  |  mov NARGS:RD, TMP2			// Restore for fallback[m
[31m-  |  jmp ->fff_fallback[m
[31m-  |[m
[31m-  |.macro .ffunc_bit_sh, name, ins[m
[31m-  |.if DUALNUM[m
[31m-  |  .ffunc_bit name, 1, .ffunc_2[m
[31m-  |  // Note: no inline conversion from number for 2nd argument![m
[31m-  |  cmp dword [BASE+12], LJ_TISNUM; jne ->fff_fallback[m
[31m-  |  mov RA, dword [BASE+8][m
[31m-  |.else[m
[31m-  |  .ffunc_nnsse name[m
[31m-  |  sseconst_tobit xmm2, RBa[m
[31m-  |  addsd xmm0, xmm2[m
[31m-  |  addsd xmm1, xmm2[m
[31m-  |  movd RB, xmm0[m
[31m-  |  movd RA, xmm1[m
[31m-  |.endif[m
[31m-  |  ins RB, cl				// Assumes RA is ecx.[m
[31m-  |  jmp ->fff_resbit[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |.ffunc_bit_sh bit_lshift, shl[m
[31m-  |.ffunc_bit_sh bit_rshift, shr[m
[31m-  |.ffunc_bit_sh bit_arshift, sar[m
[31m-  |.ffunc_bit_sh bit_rol, rol[m
[31m-  |.ffunc_bit_sh bit_ror, ror[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->fff_fallback_2:[m
[31m-  |  mov NARGS:RD, 1+2			// Other args are ignored, anyway.[m
[31m-  |  jmp ->fff_fallback[m
[31m-  |->fff_fallback_1:[m
[31m-  |  mov NARGS:RD, 1+1			// Other args are ignored, anyway.[m
[31m-  |->fff_fallback:			// Call fast function fallback handler.[m
[31m-  |  // BASE = new base, RD = nargs+1[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov PC, [BASE-4]			// Fallback may overwrite PC.[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  lea RA, [RD+8*LUA_MINSTACK]	// Ensure enough space for handler.[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov CFUNC:RD, [BASE-8][m
[31m-  |  cmp RA, L:RB->maxstack[m
[31m-  |  ja >5				// Need to grow stack.[m
[31m-  |.if X64[m
[31m-  |  mov CARG1d, L:RB[m
[31m-  |.else[m
[31m-  |  mov ARG1, L:RB[m
[31m-  |.endif[m
[31m-  |  call aword CFUNC:RD->f		// (lua_State *L)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  // Either throws an error, or recovers and returns -1, 0 or nresults+1.[m
[31m-  |  test RD, RD;  jg ->fff_res		// Returned nresults+1?[m
[31m-  |1:[m
[31m-  |  mov RA, L:RB->top[m
[31m-  |  sub RA, BASE[m
[31m-  |  shr RA, 3[m
[31m-  |  test RD, RD[m
[31m-  |  lea NARGS:RD, [RA+1][m
[31m-  |  mov LFUNC:RB, [BASE-8][m
[31m-  |  jne ->vm_call_tail			// Returned -1?[m
[31m-  |  ins_callt				// Returned 0: retry fast path.[m
[31m-  |[m
[31m-  |// Reconstruct previous base for vmeta_call during tailcall.[m
[31m-  |->vm_call_tail:[m
[31m-  |  mov RA, BASE[m
[31m-  |  test PC, FRAME_TYPE[m
[31m-  |  jnz >3[m
[31m-  |  movzx RB, PC_RA[m
[31m-  |  not RBa				// Note: ~RB = -(RB+1)[m
[31m-  |  lea BASE, [BASE+RB*8]		// base = base - (RB+1)*8[m
[31m-  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |3:[m
[31m-  |  mov RB, PC[m
[31m-  |  and RB, -8[m
[31m-  |  sub BASE, RB[m
[31m-  |  jmp ->vm_call_dispatch		// Resolve again for tailcall.[m
[31m-  |[m
[31m-  |5:  // Grow stack for fallback handler.[m
[31m-  |  mov FCARG2, LUA_MINSTACK[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  xor RD, RD				// Simulate a return 0.[m
[31m-  |  jmp <1				// Dumb retry (goes through ff first).[m
[31m-  |[m
[31m-  |->fff_gcstep:			// Call GC step function.[m
[31m-  |  // BASE = new base, RD = nargs+1[m
[31m-  |  pop RBa				// Must keep stack at same level.[m
[31m-  |  mov TMPa, RBa			// Save return address[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov SAVE_PC, PC			// Redundant (but a defined value).[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  call extern lj_gc_step@4		// (lua_State *L)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  shr RD, 3[m
[31m-  |  add NARGS:RD, 1[m
[31m-  |  mov RBa, TMPa[m
[31m-  |  push RBa				// Restore return address.[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Special dispatch targets -------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->vm_record:				// Dispatch target for recording phase.[m
[31m-  |.if JIT[m
[31m-  |  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_VMEVENT		// No recording while in vmevent.[m
[31m-  |  jnz >5[m
[31m-  |  // Decrement the hookcount for consistency, but always do the call.[m
[31m-  |  test RDL, HOOK_ACTIVE[m
[31m-  |  jnz >1[m
[31m-  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  jz >1[m
[31m-  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_rethook:			// Dispatch target for return hooks.[m
[31m-  |  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  jnz >5[m
[31m-  |  jmp >1[m
[31m-  |[m
[31m-  |->vm_inshook:			// Dispatch target for instr/line hooks.[m
[31m-  |  movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)][m
[31m-  |  test RDL, HOOK_ACTIVE		// Hook already active?[m
[31m-  |  jnz >5[m
[31m-  |[m
[31m-  |  test RDL, LUA_MASKLINE|LUA_MASKCOUNT[m
[31m-  |  jz >5[m
[31m-  |  dec dword [DISPATCH+DISPATCH_GL(hookcount)][m
[31m-  |  jz >1[m
[31m-  |  test RDL, LUA_MASKLINE[m
[31m-  |  jz >5[m
[31m-  |1:[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG2, PC			// Caveat: FCARG2 == BASE[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  // SAVE_PC must hold the _previous_ PC. The callee updates it with PC.[m
[31m-  |  call extern lj_dispatch_ins@8	// (lua_State *L, const BCIns *pc)[m
[31m-  |3:[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |4:[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |5:[m
[31m-  |  movzx OP, PC_OP[m
[31m-  |  movzx RD, PC_RD[m
[31m-  |.if X64[m
[31m-  |  jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]	// Re-dispatch to static ins.[m
[31m-  |.else[m
[31m-  |  jmp aword [DISPATCH+OP*4+GG_DISP2STATIC]	// Re-dispatch to static ins.[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_hook:				// Continue from hook yield.[m
[31m-  |  add PC, 4[m
[31m-  |  mov RA, [RB-24][m
[31m-  |  mov MULTRES, RA			// Restore MULTRES for *M ins.[m
[31m-  |  jmp <4[m
[31m-  |[m
[31m-  |->vm_hotloop:			// Hot loop counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  mov LFUNC:RB, [BASE-8]		// Same as curr_topL(L).[m
[31m-  |  mov RB, LFUNC:RB->pc[m
[31m-  |  movzx RD, byte [RB+PC2PROTO(framesize)][m
[31m-  |  lea RD, [BASE+RD*8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov FCARG2, PC[m
[31m-  |  lea FCARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  call extern lj_trace_hot@8		// (jit_State *J, const BCIns *pc)[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_callhook:			// Dispatch target for call hooks.[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |.if JIT[m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_hotcall:			// Hot call counter underflow.[m
[31m-  |.if JIT[m
[31m-  |  mov SAVE_PC, PC[m
[31m-  |  or PC, 1				// Marker for hot call.[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov L:RB->top, RD[m
[31m-  |  mov FCARG2, PC[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_dispatch_call@8	// (lua_State *L, const BCIns *pc)[m
[31m-  |  // ASMFunction returned in eax/rax (RDa).[m
[31m-  |  mov SAVE_PC, 0			// Invalidate for subsequent line hook.[m
[31m-  |.if JIT[m
[31m-  |  and PC, -2[m
[31m-  |.endif[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov RAa, RDa[m
[31m-  |  mov RD, L:RB->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  mov RBa, RAa[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  shr RD, 3[m
[31m-  |  add NARGS:RD, 1[m
[31m-  |  jmp RBa[m
[31m-  |[m
[31m-  |->cont_stitch:			// Trace stitching.[m
[31m-  |.if JIT[m
[31m-  |  // BASE = base, RC = result, RB = mbase[m
[31m-  |  mov TRACE:RA, [RB-24]		// Save previous trace.[m
[31m-  |  mov TMP1, TRACE:RA[m
[31m-  |  mov TMP3, DISPATCH			// Need one more register.[m
[31m-  |  mov DISPATCH, MULTRES[m
[31m-  |  movzx RA, PC_RA[m
[31m-  |  lea RA, [BASE+RA*8]		// Call base.[m
[31m-  |  sub DISPATCH, 1[m
[31m-  |  jz >2[m
[31m-  |1:  // Move results down.[m
[31m-  |.if X64[m
[31m-  |  mov RBa, [RC][m
[31m-  |  mov [RA], RBa[m
[31m-  |.else[m
[31m-  |  mov RB, [RC][m
[31m-  |  mov [RA], RB[m
[31m-  |  mov RB, [RC+4][m
[31m-  |  mov [RA+4], RB[m
[31m-  |.endif[m
[31m-  |  add RC, 8[m
[31m-  |  add RA, 8[m
[31m-  |  sub DISPATCH, 1[m
[31m-  |  jnz <1[m
[31m-  |2:[m
[31m-  |  movzx RC, PC_RA[m
[31m-  |  movzx RB, PC_RB[m
[31m-  |  add RC, RB[m
[31m-  |  lea RC, [BASE+RC*8-8][m
[31m-  |3:[m
[31m-  |  cmp RC, RA[m
[31m-  |  ja >9				// More results wanted?[m
[31m-  |[m
[31m-  |  mov DISPATCH, TMP3[m
[31m-  |  mov TRACE:RD, TMP1			// Get previous trace.[m
[31m-  |  movzx RB, word TRACE:RD->traceno[m
[31m-  |  movzx RD, word TRACE:RD->link[m
[31m-  |  cmp RD, RB[m
[31m-  |  je ->cont_nop			// Blacklisted.[m
[31m-  |  test RD, RD[m
[31m-  |  jne =>BC_JLOOP			// Jump to stitched trace.[m
[31m-  |[m
[31m-  |  // Stitch a new trace to the previous trace.[m
[31m-  |  mov [DISPATCH+DISPATCH_J(exitno)], RB[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG2, PC[m
[31m-  |  lea FCARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[31m-  |  call extern lj_dispatch_stitch@8	// (jit_State *J, const BCIns *pc)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  jmp ->cont_nop[m
[31m-  |[m
[31m-  |9:  // Fill up results with nil.[m
[31m-  |  mov dword [RA+4], LJ_TNIL[m
[31m-  |  add RA, 8[m
[31m-  |  jmp <3[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_profhook:			// Dispatch target for profiler hook.[m
[31m-#if LJ_HASPROFILE[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov FCARG2, PC			// Caveat: FCARG2 == BASE[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  call extern lj_dispatch_profile@8	// (lua_State *L, const BCIns *pc)[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.[m
[31m-  |  sub PC, 4[m
[31m-  |  jmp ->cont_nop[m
[31m-#endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Trace exit handler -------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Called from an exit stub with the exit number on the stack.[m
[31m-  |// The 16 bit exit number is stored with two (sign-extended) push imm8.[m
[31m-  |->vm_exit_handler:[m
[31m-  |.if JIT[m
[31m-  |.if X64[m
[31m-  |  push r13; push r12[m
[31m-  |  push r11; push r10; push r9; push r8[m
[31m-  |  push rdi; push rsi; push rbp; lea rbp, [rsp+88]; push rbp[m
[31m-  |  push rbx; push rdx; push rcx; push rax[m
[31m-  |  movzx RC, byte [rbp-8]		// Reconstruct exit number.[m
[31m-  |  mov RCH, byte [rbp-16][m
[31m-  |  mov [rbp-8], r15; mov [rbp-16], r14[m
[31m-  |.else[m
[31m-  |  push ebp; lea ebp, [esp+12]; push ebp[m
[31m-  |  push ebx; push edx; push ecx; push eax[m
[31m-  |  movzx RC, byte [ebp-4]		// Reconstruct exit number.[m
[31m-  |  mov RCH, byte [ebp-8][m
[31m-  |  mov [ebp-4], edi; mov [ebp-8], esi[m
[31m-  |.endif[m
[31m-  |  // Caveat: DISPATCH is ebx.[m
[31m-  |  mov DISPATCH, [ebp][m
[31m-  |  mov RA, [DISPATCH+DISPATCH_GL(vmstate)]	// Get trace number.[m
[31m-  |  set_vmstate EXIT[m
[31m-  |  mov [DISPATCH+DISPATCH_J(exitno)], RC[m
[31m-  |  mov [DISPATCH+DISPATCH_J(parent)], RA[m
[31m-  |.if X64[m
[31m-  |.if X64WIN[m
[31m-  |  sub rsp, 16*8+4*8			// Room for SSE regs + save area.[m
[31m-  |.else[m
[31m-  |  sub rsp, 16*8			// Room for SSE regs.[m
[31m-  |.endif[m
[31m-  |  add rbp, -128[m
[31m-  |  movsd qword [rbp-8],   xmm15; movsd qword [rbp-16],  xmm14[m
[31m-  |  movsd qword [rbp-24],  xmm13; movsd qword [rbp-32],  xmm12[m
[31m-  |  movsd qword [rbp-40],  xmm11; movsd qword [rbp-48],  xmm10[m
[31m-  |  movsd qword [rbp-56],  xmm9;  movsd qword [rbp-64],  xmm8[m
[31m-  |  movsd qword [rbp-72],  xmm7;  movsd qword [rbp-80],  xmm6[m
[31m-  |  movsd qword [rbp-88],  xmm5;  movsd qword [rbp-96],  xmm4[m
[31m-  |  movsd qword [rbp-104], xmm3;  movsd qword [rbp-112], xmm2[m
[31m-  |  movsd qword [rbp-120], xmm1;  movsd qword [rbp-128], xmm0[m
[31m-  |.else[m
[31m-  |  sub esp, 8*8+16			// Room for SSE regs + args.[m
[31m-  |  movsd qword [ebp-40], xmm7; movsd qword [ebp-48], xmm6[m
[31m-  |  movsd qword [ebp-56], xmm5; movsd qword [ebp-64], xmm4[m
[31m-  |  movsd qword [ebp-72], xmm3; movsd qword [ebp-80], xmm2[m
[31m-  |  movsd qword [ebp-88], xmm1; movsd qword [ebp-96], xmm0[m
[31m-  |.endif[m
[31m-  |  // Caveat: RB is ebp.[m
[31m-  |  mov L:RB, [DISPATCH+DISPATCH_GL(cur_L)][m
[31m-  |  mov BASE, [DISPATCH+DISPATCH_GL(jit_base)][m
[31m-  |  mov aword [DISPATCH+DISPATCH_J(L)], L:RBa[m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |.if X64WIN[m
[31m-  |  lea CARG2, [rsp+4*8][m
[31m-  |.elif X64[m
[31m-  |  mov CARG2, rsp[m
[31m-  |.else[m
[31m-  |  lea FCARG2, [esp+16][m
[31m-  |.endif[m
[31m-  |  lea FCARG1, [DISPATCH+GG_DISP2J][m
[31m-  |  mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[31m-  |  call extern lj_trace_exit@8	// (jit_State *J, ExitState *ex)[m
[31m-  |  // MULTRES or negated error code returned in eax (RD).[m
[31m-  |  mov RAa, L:RB->cframe[m
[31m-  |  and RAa, CFRAME_RAWMASK[m
[31m-  |.if X64WIN[m
[31m-  |  // Reposition stack later.[m
[31m-  |.elif X64[m
[31m-  |  mov rsp, RAa			// Reposition stack to C frame.[m
[31m-  |.else[m
[31m-  |  mov esp, RAa			// Reposition stack to C frame.[m
[31m-  |.endif[m
[31m-  |  mov [RAa+CFRAME_OFS_L], L:RB	// Set SAVE_L (on-trace resume/yield).[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |  mov PC, [RAa+CFRAME_OFS_PC]	// Get SAVE_PC.[m
[31m-  |.if X64[m
[31m-  |  jmp >1[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |->vm_exit_interp:[m
[31m-  |  // RD = MULTRES or negated error code, BASE, PC and DISPATCH set.[m
[31m-  |.if JIT[m
[31m-  |.if X64[m
[31m-  |  // Restore additional callee-save registers only used in compiled code.[m
[31m-  |.if X64WIN[m
[31m-  |  lea RAa, [rsp+9*16+4*8][m
[31m-  |1:[m
[31m-  |  movdqa xmm15, [RAa-9*16][m
[31m-  |  movdqa xmm14, [RAa-8*16][m
[31m-  |  movdqa xmm13, [RAa-7*16][m
[31m-  |  movdqa xmm12, [RAa-6*16][m
[31m-  |  movdqa xmm11, [RAa-5*16][m
[31m-  |  movdqa xmm10, [RAa-4*16][m
[31m-  |  movdqa xmm9, [RAa-3*16][m
[31m-  |  movdqa xmm8, [RAa-2*16][m
[31m-  |  movdqa xmm7, [RAa-1*16][m
[31m-  |  mov rsp, RAa			// Reposition stack to C frame.[m
[31m-  |  movdqa xmm6, [RAa][m
[31m-  |  mov r15, CSAVE_3[m
[31m-  |  mov r14, CSAVE_4[m
[31m-  |.else[m
[31m-  |  add rsp, 16			// Reposition stack to C frame.[m
[31m-  |1:[m
[31m-  |.endif[m
[31m-  |  mov r13, TMPa[m
[31m-  |  mov r12, TMPQ[m
[31m-  |.endif[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-  |.if X64[m
[31m-  |  mov FCARG1, SAVE_L[m
[31m-  |  mov L:FCARG1->base, BASE[m
[31m-  |  mov RB, RD     // Save RD[m
[31m-  |  mov TMP1, PC  // Save PC[m
[31m-  |  mov CARG3d, PC   // CARG3d == BASE[m
[31m-  |  mov FCARG2, dword [DISPATCH+DISPATCH_GL(vmstate)][m
[31m-  |  call extern lj_log_trace_direct_exit@8[m
[31m-  |  mov PC, TMP1[m
[31m-  |  mov RD, RB[m
[31m-  |  mov RB, SAVE_L[m
[31m-  |  mov BASE, L:RB->base[m
[31m-  |.endif[m
[31m-#endif[m
[31m-  |  test RD, RD; js >9			// Check for error from exit.[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov MULTRES, RD[m
[31m-  |  mov LFUNC:KBASE, [BASE-8][m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  mov L:RB->base, BASE[m
[31m-  |  mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  // Modified copy of ins_next which handles function header dispatch, too.[m
[31m-  |  mov RC, [PC][m
[31m-  |  movzx RA, RCH[m
[31m-  |  movzx OP, RCL[m
[31m-  |  add PC, 4[m
[31m-  |  shr RC, 16[m
[31m-  |  cmp OP, BC_FUNCF			// Function header?[m
[31m-  |  jb >3[m
[31m-  |  cmp OP, BC_FUNCC+2			// Fast function?[m
[31m-  |  jae >4[m
[31m-  |2:[m
[31m-  |  mov RC, MULTRES			// RC/RD holds nres+1.[m
[31m-  |3:[m
[31m-  |.if X64[m
[31m-  |  jmp aword [DISPATCH+OP*8][m
[31m-  |.else[m
[31m-  |  jmp aword [DISPATCH+OP*4][m
[31m-  |.endif[m
[31m-  |[m
[31m-  |4:  // Check frame below fast function.[m
[31m-  |  mov RC, [BASE-4][m
[31m-  |  test RC, FRAME_TYPE[m
[31m-  |  jnz <2				// Trace stitching continuation?[m
[31m-  |  // Otherwise set KBASE for Lua function below fast function.[m
[31m-  |  movzx RC, byte [RC-3][m
[31m-  |  not RCa[m
[31m-  |  mov LFUNC:KBASE, [BASE+RC*8-8][m
[31m-  |  mov KBASE, LFUNC:KBASE->pc[m
[31m-  |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-  |  jmp <2[m
[31m-  |[m
[31m-  |9:  // Rethrow error from the right C frame.[m
[31m-  |  neg RD[m
[31m-  |  mov FCARG1, L:RB[m
[31m-  |  mov FCARG2, RD[m
[31m-  |  call extern lj_err_throw@8		// (lua_State *L, int errcode)[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Math helper functions ----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// FP value rounding. Called by math.floor/math.ceil fast functions[m
[31m-  |// and from JIT code. arg/ret is xmm0. xmm0-xmm3 and RD (eax) modified.[m
[31m-  |.macro vm_round, name, mode, cond[m
[31m-  |->name:[m
[31m-  |.if not X64 and cond[m
[31m-  |  movsd xmm0, qword [esp+4][m
[31m-  |  call ->name .. _sse[m
[31m-  |  movsd qword [esp+4], xmm0  // Overwrite callee-owned arg.[m
[31m-  |  fld qword [esp+4][m
[31m-  |  ret[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->name .. _sse:[m
[31m-  |  sseconst_abs xmm2, RDa[m
[31m-  |  sseconst_2p52 xmm3, RDa[m
[31m-  |  movaps xmm1, xmm0[m
[31m-  |  andpd xmm1, xmm2			// |x|[m
[31m-  |  ucomisd xmm3, xmm1			// No truncation if 2^52 <= |x|.[m
[31m-  |  jbe >1[m
[31m-  |  andnpd xmm2, xmm0			// Isolate sign bit.[m
[31m-  |.if mode == 2		// trunc(x)?[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[31m-  |  subsd xmm1, xmm3[m
[31m-  |  sseconst_1 xmm3, RDa[m
[31m-  |  cmpsd xmm0, xmm1, 1		// |x| < result?[m
[31m-  |  andpd xmm0, xmm3[m
[31m-  |  subsd xmm1, xmm0			// If yes, subtract -1.[m
[31m-  |  orpd xmm1, xmm2			// Merge sign bit back in.[m
[31m-  |.else[m
[31m-  |  addsd xmm1, xmm3			// (|x| + 2^52) - 2^52[m
[31m-  |  subsd xmm1, xmm3[m
[31m-  |  orpd xmm1, xmm2			// Merge sign bit back in.[m
[31m-  |  .if mode == 1		// ceil(x)?[m
[31m-  |    sseconst_m1 xmm2, RDa		// Must subtract -1 to preserve -0.[m
[31m-  |    cmpsd xmm0, xmm1, 6		// x > result?[m
[31m-  |  .else			// floor(x)?[m
[31m-  |    sseconst_1 xmm2, RDa[m
[31m-  |    cmpsd xmm0, xmm1, 1		// x < result?[m
[31m-  |  .endif[m
[31m-  |  andpd xmm0, xmm2[m
[31m-  |  subsd xmm1, xmm0			// If yes, subtract +-1.[m
[31m-  |.endif[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |1:[m
[31m-  |  ret[m
[31m-  |.endmacro[m
[31m-  |[m
[31m-  |  vm_round vm_floor, 0, 1[m
[31m-  |  vm_round vm_ceil,  1, JIT[m
[31m-  |  vm_round vm_trunc, 2, JIT[m
[31m-  |[m
[31m-  |// FP modulo x%y. Called by BC_MOD* and vm_arith.[m
[31m-  |->vm_mod:[m
[31m-  |// Args in xmm0/xmm1, return value in xmm0.[m
[31m-  |// Caveat: xmm0-xmm5 and RC (eax) modified![m
[31m-  |  movaps xmm5, xmm0[m
[31m-  |  divsd xmm0, xmm1[m
[31m-  |  sseconst_abs xmm2, RDa[m
[31m-  |  sseconst_2p52 xmm3, RDa[m
[31m-  |  movaps xmm4, xmm0[m
[31m-  |  andpd xmm4, xmm2			// |x/y|[m
[31m-  |  ucomisd xmm3, xmm4			// No truncation if 2^52 <= |x/y|.[m
[31m-  |  jbe >1[m
[31m-  |  andnpd xmm2, xmm0			// Isolate sign bit.[m
[31m-  |  addsd xmm4, xmm3			// (|x/y| + 2^52) - 2^52[m
[31m-  |  subsd xmm4, xmm3[m
[31m-  |  orpd xmm4, xmm2			// Merge sign bit back in.[m
[31m-  |  sseconst_1 xmm2, RDa[m
[31m-  |  cmpsd xmm0, xmm4, 1		// x/y < result?[m
[31m-  |  andpd xmm0, xmm2[m
[31m-  |  subsd xmm4, xmm0			// If yes, subtract 1.0.[m
[31m-  |  movaps xmm0, xmm5[m
[31m-  |  mulsd xmm1, xmm4[m
[31m-  |  subsd xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |1:[m
[31m-  |  mulsd xmm1, xmm0[m
[31m-  |  movaps xmm0, xmm5[m
[31m-  |  subsd xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |// Args in xmm0/eax. Ret in xmm0. xmm0-xmm1 and eax modified.[m
[31m-  |->vm_powi_sse:[m
[31m-  |  cmp eax, 1; jle >6			// i<=1?[m
[31m-  |  // Now 1 < (unsigned)i <= 0x80000000.[m
[31m-  |1:  // Handle leading zeros.[m
[31m-  |  test eax, 1; jnz >2[m
[31m-  |  mulsd xmm0, xmm0[m
[31m-  |  shr eax, 1[m
[31m-  |  jmp <1[m
[31m-  |2:[m
[31m-  |  shr eax, 1; jz >5[m
[31m-  |  movaps xmm1, xmm0[m
[31m-  |3:  // Handle trailing bits.[m
[31m-  |  mulsd xmm0, xmm0[m
[31m-  |  shr eax, 1; jz >4[m
[31m-  |  jnc <3[m
[31m-  |  mulsd xmm1, xmm0[m
[31m-  |  jmp <3[m
[31m-  |4:[m
[31m-  |  mulsd xmm0, xmm1[m
[31m-  |5:[m
[31m-  |  ret[m
[31m-  |6:[m
[31m-  |  je <5				// x^1 ==> x[m
[31m-  |  jb >7				// x^0 ==> 1[m
[31m-  |  neg eax[m
[31m-  |  call <1[m
[31m-  |  sseconst_1 xmm1, RDa[m
[31m-  |  divsd xmm1, xmm0[m
[31m-  |  movaps xmm0, xmm1[m
[31m-  |  ret[m
[31m-  |7:[m
[31m-  |  sseconst_1 xmm0, RDa[m
[31m-  |  ret[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Miscellaneous functions --------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// int lj_vm_cpuid(uint32_t f, uint32_t res[4])[m
[31m-  |->vm_cpuid:[m
[31m-  |.if X64[m
[31m-  |  mov eax, CARG1d[m
[31m-  |  .if X64WIN; push rsi; mov rsi, CARG2; .endif[m
[31m-  |  push rbx[m
[31m-  |  xor ecx, ecx[m
[31m-  |  cpuid[m
[31m-  |  mov [rsi], eax[m
[31m-  |  mov [rsi+4], ebx[m
[31m-  |  mov [rsi+8], ecx[m
[31m-  |  mov [rsi+12], edx[m
[31m-  |  pop rbx[m
[31m-  |  .if X64WIN; pop rsi; .endif[m
[31m-  |  ret[m
[31m-  |.else[m
[31m-  |  pushfd[m
[31m-  |  pop edx[m
[31m-  |  mov ecx, edx[m
[31m-  |  xor edx, 0x00200000		// Toggle ID bit in flags.[m
[31m-  |  push edx[m
[31m-  |  popfd[m
[31m-  |  pushfd[m
[31m-  |  pop edx[m
[31m-  |  xor eax, eax			// Zero means no features supported.[m
[31m-  |  cmp ecx, edx[m
[31m-  |  jz >1				// No ID toggle means no CPUID support.[m
[31m-  |  mov eax, [esp+4]			// Argument 1 is function number.[m
[31m-  |  push edi[m
[31m-  |  push ebx[m
[31m-  |  xor ecx, ecx[m
[31m-  |  cpuid[m
[31m-  |  mov edi, [esp+16]			// Argument 2 is result area.[m
[31m-  |  mov [edi], eax[m
[31m-  |  mov [edi+4], ebx[m
[31m-  |  mov [edi+8], ecx[m
[31m-  |  mov [edi+12], edx[m
[31m-  |  pop ebx[m
[31m-  |  pop edi[m
[31m-  |1:[m
[31m-  |  ret[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- Assertions ---------------------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |->assert_bad_for_arg_type:[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-  |  int3[m
[31m-#endif[m
[31m-  |  int3[m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |//-- FFI helper functions -----------------------------------------------[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-  |[m
[31m-  |// Handler for callback functions. Callback slot number in ah/al.[m
[31m-  |->vm_ffi_callback:[m
[31m-  |.if FFI[m
[31m-  |.type CTSTATE, CTState, PC[m
[31m-  |.if not X64[m
[31m-  |  sub esp, 16			// Leave room for SAVE_ERRF etc.[m
[31m-  |.endif[m
[31m-  |  saveregs_	// ebp/rbp already saved. ebp now holds global_State *.[m
[31m-  |  lea DISPATCH, [ebp+GG_G2DISP][m
[31m-  |  mov CTSTATE, GL:ebp->ctype_state[m
[31m-  |  movzx eax, ax[m
[31m-  |  mov CTSTATE->cb.slot, eax[m
[31m-  |.if X64[m
[31m-  |  mov CTSTATE->cb.gpr[0], CARG1[m
[31m-  |  mov CTSTATE->cb.gpr[1], CARG2[m
[31m-  |  mov CTSTATE->cb.gpr[2], CARG3[m
[31m-  |  mov CTSTATE->cb.gpr[3], CARG4[m
[31m-  |  movsd qword CTSTATE->cb.fpr[0], xmm0[m
[31m-  |  movsd qword CTSTATE->cb.fpr[1], xmm1[m
[31m-  |  movsd qword CTSTATE->cb.fpr[2], xmm2[m
[31m-  |  movsd qword CTSTATE->cb.fpr[3], xmm3[m
[31m-  |.if X64WIN[m
[31m-  |  lea rax, [rsp+CFRAME_SIZE+4*8][m
[31m-  |.else[m
[31m-  |  lea rax, [rsp+CFRAME_SIZE][m
[31m-  |  mov CTSTATE->cb.gpr[4], CARG5[m
[31m-  |  mov CTSTATE->cb.gpr[5], CARG6[m
[31m-  |  movsd qword CTSTATE->cb.fpr[4], xmm4[m
[31m-  |  movsd qword CTSTATE->cb.fpr[5], xmm5[m
[31m-  |  movsd qword CTSTATE->cb.fpr[6], xmm6[m
[31m-  |  movsd qword CTSTATE->cb.fpr[7], xmm7[m
[31m-  |.endif[m
[31m-  |  mov CTSTATE->cb.stack, rax[m
[31m-  |  mov CARG2, rsp[m
[31m-  |.else[m
[31m-  |  lea eax, [esp+CFRAME_SIZE+16][m
[31m-  |  mov CTSTATE->cb.gpr[0], FCARG1[m
[31m-  |  mov CTSTATE->cb.gpr[1], FCARG2[m
[31m-  |  mov CTSTATE->cb.stack, eax[m
[31m-  |  mov FCARG1, [esp+CFRAME_SIZE+12]	// Move around misplaced retaddr/ebp.[m
[31m-  |  mov FCARG2, [esp+CFRAME_SIZE+8][m
[31m-  |  mov SAVE_RET, FCARG1[m
[31m-  |  mov SAVE_R4, FCARG2[m
[31m-  |  mov FCARG2, esp[m
[31m-  |.endif[m
[31m-  |  mov SAVE_PC, CTSTATE		// Any value outside of bytecode is ok.[m
[31m-  |  mov FCARG1, CTSTATE[m
[31m-  |  call extern lj_ccallback_enter@8	// (CTState *cts, void *cf)[m
[31m-  |  // lua_State * returned in eax (RD).[m
[31m-  |  set_vmstate INTERP[m
[31m-  |  mov BASE, L:RD->base[m
[31m-  |  mov RD, L:RD->top[m
[31m-  |  sub RD, BASE[m
[31m-  |  mov LFUNC:RB, [BASE-8][m
[31m-  |  shr RD, 3[m
[31m-  |  add RD, 1[m
[31m-  |  ins_callt[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->cont_ffi_callback:			// Return from FFI callback.[m
[31m-  |.if FFI[m
[31m-  |  mov L:RA, SAVE_L[m
[31m-  |  mov CTSTATE, [DISPATCH+DISPATCH_GL(ctype_state)][m
[31m-  |  mov aword CTSTATE->L, L:RAa[m
[31m-  |  mov L:RA->base, BASE[m
[31m-  |  mov L:RA->top, RB[m
[31m-  |  mov FCARG1, CTSTATE[m
[31m-  |  mov FCARG2, RC[m
[31m-  |  call extern lj_ccallback_leave@8	// (CTState *cts, TValue *o)[m
[31m-  |.if X64[m
[31m-  |  mov rax, CTSTATE->cb.gpr[0][m
[31m-  |  movsd xmm0, qword CTSTATE->cb.fpr[0][m
[31m-  |  jmp ->vm_leave_unw[m
[31m-  |.else[m
[31m-  |  mov L:RB, SAVE_L[m
[31m-  |  mov eax, CTSTATE->cb.gpr[0][m
[31m-  |  mov edx, CTSTATE->cb.gpr[1][m
[31m-  |  cmp dword CTSTATE->cb.gpr[2], 1[m
[31m-  |  jb >7[m
[31m-  |  je >6[m
[31m-  |  fld qword CTSTATE->cb.fpr[0].d[m
[31m-  |  jmp >7[m
[31m-  |6:[m
[31m-  |  fld dword CTSTATE->cb.fpr[0].f[m
[31m-  |7:[m
[31m-  |  mov ecx, L:RB->top[m
[31m-  |  movzx ecx, word [ecx+6]		// Get stack adjustment and copy up.[m
[31m-  |  mov SAVE_L, ecx			// Must be one slot above SAVE_RET[m
[31m-  |  restoreregs[m
[31m-  |  pop ecx				// Move return addr from SAVE_RET.[m
[31m-  |  add esp, [esp]			// Adjust stack.[m
[31m-  |  add esp, 16[m
[31m-  |  push ecx[m
[31m-  |  ret[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |->vm_ffi_call@4:			// Call C function via FFI.[m
[31m-  |  // Caveat: needs special frame unwinding, see below.[m
[31m-  |.if FFI[m
[31m-  |.if X64[m
[31m-  |  .type CCSTATE, CCallState, rbx[m
[31m-  |  push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1[m
[31m-  |.else[m
[31m-  |  .type CCSTATE, CCallState, ebx[m
[31m-  |  push ebp; mov ebp, esp; push ebx; mov CCSTATE, FCARG1[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  // Readjust stack.[m
[31m-  |.if X64[m
[31m-  |  mov eax, CCSTATE->spadj[m
[31m-  |  sub rsp, rax[m
[31m-  |.else[m
[31m-  |  sub esp, CCSTATE->spadj[m
[31m-  |.if WIN[m
[31m-  |  mov CCSTATE->spadj, esp[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  // Copy stack slots.[m
[31m-  |  movzx ecx, byte CCSTATE->nsp[m
[31m-  |  sub ecx, 1[m
[31m-  |  js >2[m
[31m-  |1:[m
[31m-  |.if X64[m
[31m-  |  mov rax, [CCSTATE+rcx*8+offsetof(CCallState, stack)][m
[31m-  |  mov [rsp+rcx*8+CCALL_SPS_EXTRA*8], rax[m
[31m-  |.else[m
[31m-  |  mov eax, [CCSTATE+ecx*4+offsetof(CCallState, stack)][m
[31m-  |  mov [esp+ecx*4], eax[m
[31m-  |.endif[m
[31m-  |  sub ecx, 1[m
[31m-  |  jns <1[m
[31m-  |2:[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |  movzx eax, byte CCSTATE->nfpr[m
[31m-  |  mov CARG1, CCSTATE->gpr[0][m
[31m-  |  mov CARG2, CCSTATE->gpr[1][m
[31m-  |  mov CARG3, CCSTATE->gpr[2][m
[31m-  |  mov CARG4, CCSTATE->gpr[3][m
[31m-  |.if not X64WIN[m
[31m-  |  mov CARG5, CCSTATE->gpr[4][m
[31m-  |  mov CARG6, CCSTATE->gpr[5][m
[31m-  |.endif[m
[31m-  |  test eax, eax; jz >5[m
[31m-  |  movaps xmm0, CCSTATE->fpr[0][m
[31m-  |  movaps xmm1, CCSTATE->fpr[1][m
[31m-  |  movaps xmm2, CCSTATE->fpr[2][m
[31m-  |  movaps xmm3, CCSTATE->fpr[3][m
[31m-  |.if not X64WIN[m
[31m-  |  cmp eax, 4; jbe >5[m
[31m-  |  movaps xmm4, CCSTATE->fpr[4][m
[31m-  |  movaps xmm5, CCSTATE->fpr[5][m
[31m-  |  movaps xmm6, CCSTATE->fpr[6][m
[31m-  |  movaps xmm7, CCSTATE->fpr[7][m
[31m-  |.endif[m
[31m-  |5:[m
[31m-  |.else[m
[31m-  |  mov FCARG1, CCSTATE->gpr[0][m
[31m-  |  mov FCARG2, CCSTATE->gpr[1][m
[31m-  |.endif[m
[31m-  |[m
[31m-  |  call aword CCSTATE->func[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |  mov CCSTATE->gpr[0], rax[m
[31m-  |  movaps CCSTATE->fpr[0], xmm0[m
[31m-  |.if not X64WIN[m
[31m-  |  mov CCSTATE->gpr[1], rdx[m
[31m-  |  movaps CCSTATE->fpr[1], xmm1[m
[31m-  |.endif[m
[31m-  |.else[m
[31m-  |  mov CCSTATE->gpr[0], eax[m
[31m-  |  mov CCSTATE->gpr[1], edx[m
[31m-  |  cmp byte CCSTATE->resx87, 1[m
[31m-  |  jb >7[m
[31m-  |  je >6[m
[31m-  |  fstp qword CCSTATE->fpr[0].d[0][m
[31m-  |  jmp >7[m
[31m-  |6:[m
[31m-  |  fstp dword CCSTATE->fpr[0].f[0][m
[31m-  |7:[m
[31m-  |.if WIN[m
[31m-  |  sub CCSTATE->spadj, esp[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |[m
[31m-  |.if X64[m
[31m-  |  mov rbx, [rbp-8]; leave; ret[m
[31m-  |.else[m
[31m-  |  mov ebx, [ebp-4]; leave; ret[m
[31m-  |.endif[m
[31m-  |.endif[m
[31m-  |// Note: vm_ffi_call must be the last function in this object file![m
[31m-  |[m
[31m-  |//-----------------------------------------------------------------------[m
[31m-}[m
[31m-[m
[31m-/* Generate the code for a single instruction. */[m
[31m-static void build_ins(BuildCtx *ctx, BCOp op, int defop)[m
[31m-{[m
[31m-  int vk = 0;[m
[31m-  |// Note: aligning all instructions does not pay off.[m
[31m-  |=>defop:[m
[31m-[m
[31m-  switch (op) {[m
[31m-[m
[31m-  /* -- Comparison ops ---------------------------------------------------- */[m
[31m-[m
[31m-  /* Remember: all ops branch for a true comparison, fall through otherwise. */[m
[31m-[m
[31m-  |.macro jmp_comp, lt, ge, le, gt, target[m
[31m-  ||switch (op) {[m
[31m-  ||case BC_ISLT:[m
[31m-  |   lt target[m
[31m-  ||break;[m
[31m-  ||case BC_ISGE:[m
[31m-  |   ge target[m
[31m-  ||break;[m
[31m-  ||case BC_ISLE:[m
[31m-  |   le target[m
[31m-  ||break;[m
[31m-  ||case BC_ISGT:[m
[31m-  |   gt target[m
[31m-  ||break;[m
[31m-  ||default: break;  /* Shut up GCC. */[m
[31m-  ||}[m
[31m-  |.endmacro[m
[31m-[m
[31m-  case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:[m
[31m-    |  // RA = src1, RD = src2, JMP with RD = target[m
[31m-    |  ins_AD[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RA, >7[m
[31m-    |  checkint RD, >8[m
[31m-    |  mov RB, dword [BASE+RA*8][m
[31m-    |  add PC, 4[m
[31m-    |  cmp RB, dword [BASE+RD*8][m
[31m-    |  jmp_comp jge, jl, jg, jle, >9[m
[31m-    |6:[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  ja ->vmeta_comp[m
[31m-    |  // RA is a number.[m
[31m-    |  cmp dword [BASE+RD*8+4], LJ_TISNUM; jb >1; jne ->vmeta_comp[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  cvtsi2sd xmm0, dword [BASE+RD*8][m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RA is an integer, RD is not an integer.[m
[31m-    |  ja ->vmeta_comp[m
[31m-    |  // RA is an integer, RD is a number.[m
[31m-    |  cvtsi2sd xmm1, dword [BASE+RA*8][m
[31m-    |  movsd xmm0, qword [BASE+RD*8][m
[31m-    |  add PC, 4[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jmp_comp jbe, ja, jb, jae, <9[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |  checknum RA, ->vmeta_comp[m
[31m-    |  checknum RD, ->vmeta_comp[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movsd xmm0, qword [BASE+RD*8][m
[31m-    |2:[m
[31m-    |  add PC, 4[m
[31m-    |  ucomisd xmm0, qword [BASE+RA*8][m
[31m-    |3:[m
[31m-    |  // Unordered: all of ZF CF PF set, ordered: PF clear.[m
[31m-    |  // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't.[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp_comp jbe, ja, jb, jae, <9[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |  jmp_comp jbe, ja, jb, jae, >1[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISEQV: case BC_ISNEV:[m
[31m-    vk = op == BC_ISEQV;[m
[31m-    |  ins_AD	// RA = src1, RD = src2, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RD*8+4][m
[31m-    |  add PC, 4[m
[31m-    |.if DUALNUM[m
[31m-    |  cmp RB, LJ_TISNUM; jne >7[m
[31m-    |  checkint RA, >8[m
[31m-    |  mov RB, dword [BASE+RD*8][m
[31m-    |  cmp RB, dword [BASE+RA*8][m
[31m-    if (vk) {[m
[31m-      |  jne >9[m
[31m-    } else {[m
[31m-      |  je >9[m
[31m-    }[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RD is not an integer.[m
[31m-    |  ja >5[m
[31m-    |  // RD is a number.[m
[31m-    |  cmp dword [BASE+RA*8+4], LJ_TISNUM; jb >1; jne >5[m
[31m-    |  // RD is a number, RA is an integer.[m
[31m-    |  cvtsi2sd xmm0, dword [BASE+RA*8][m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RD is an integer, RA is not an integer.[m
[31m-    |  ja >5[m
[31m-    |  // RD is an integer, RA is a number.[m
[31m-    |  cvtsi2sd xmm0, dword [BASE+RD*8][m
[31m-    |  ucomisd xmm0, qword [BASE+RA*8][m
[31m-    |  jmp >4[m
[31m-    |[m
[31m-    |.else[m
[31m-    |  cmp RB, LJ_TISNUM; jae >5[m
[31m-    |  checknum RA, >5[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movsd xmm0, qword [BASE+RA*8][m
[31m-    |2:[m
[31m-    |  ucomisd xmm0, qword [BASE+RD*8][m
[31m-    |4:[m
[31m-  iseqne_fp:[m
[31m-    if (vk) {[m
[31m-      |  jp >2				// Unordered means not equal.[m
[31m-      |  jne >2[m
[31m-    } else {[m
[31m-      |  jp >2				// Unordered means not equal.[m
[31m-      |  je >1[m
[31m-    }[m
[31m-  iseqne_end:[m
[31m-    if (vk) {[m
[31m-      |1:				// EQ: Branch to the target.[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:				// NE: Fallthrough to next instruction.[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |.if not FFI[m
[31m-      |3:[m
[31m-      |.endif[m
[31m-      |2:				// NE: Branch to the target.[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |1:				// EQ: Fallthrough to next instruction.[m
[31m-    }[m
[31m-    if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||[m
[31m-		       op == BC_ISEQN || op == BC_ISNEN)) {[m
[31m-      |  jmp <9[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    if (op == BC_ISEQV || op == BC_ISNEV) {[m
[31m-      |5:  // Either or both types are not numbers.[m
[31m-      |.if FFI[m
[31m-      |  cmp RB, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |  checktp RA, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |.endif[m
[31m-      |  checktp RA, RB			// Compare types.[m
[31m-      |  jne <2				// Not the same type?[m
[31m-      |  cmp RB, LJ_TISPRI[m
[31m-      |  jae <1				// Same type and primitive type?[m
[31m-      |[m
[31m-      |  // Same types and not a primitive type. Compare GCobj or pvalue.[m
[31m-      |  mov RA, [BASE+RA*8][m
[31m-      |  mov RD, [BASE+RD*8][m
[31m-      |  cmp RA, RD[m
[31m-      |  je <1				// Same GCobjs or pvalues?[m
[31m-      |  cmp RB, LJ_TISTABUD[m
[31m-      |  ja <2				// Different objects and not table/ud?[m
[31m-      |.if X64[m
[31m-      |  cmp RB, LJ_TUDATA		// And not 64 bit lightuserdata.[m
[31m-      |  jb <2[m
[31m-      |.endif[m
[31m-      |[m
[31m-      |  // Different tables or userdatas. Need to check __eq metamethod.[m
[31m-      |  // Field metatable must be at same offset for GCtab and GCudata![m
[31m-      |  mov TAB:RB, TAB:RA->metatable[m
[31m-      |  test TAB:RB, TAB:RB[m
[31m-      |  jz <2				// No metatable?[m
[31m-      |  test byte TAB:RB->nomm, 1<<MM_eq[m
[31m-      |  jnz <2				// Or 'no __eq' flag set?[m
[31m-      if (vk) {[m
[31m-	|  xor RB, RB			// ne = 0[m
[31m-      } else {[m
[31m-	|  mov RB, 1			// ne = 1[m
[31m-      }[m
[31m-      |  jmp ->vmeta_equal		// Handle __eq metamethod.[m
[31m-    } else {[m
[31m-      |.if FFI[m
[31m-      |3:[m
[31m-      |  cmp RB, LJ_TCDATA[m
[31m-      if (LJ_DUALNUM && vk) {[m
[31m-	|  jne <9[m
[31m-      } else {[m
[31m-	|  jne <2[m
[31m-      }[m
[31m-      |  jmp ->vmeta_equal_cd[m
[31m-      |.endif[m
[31m-    }[m
[31m-    break;[m
[31m-  case BC_ISEQS: case BC_ISNES:[m
[31m-    vk = op == BC_ISEQS;[m
[31m-    |  ins_AND	// RA = src, RD = str const, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  add PC, 4[m
[31m-    |  cmp RB, LJ_TSTR; jne >3[m
[31m-    |  mov RA, [BASE+RA*8][m
[31m-    |  cmp RA, [KBASE+RD*4][m
[31m-  iseqne_test:[m
[31m-    if (vk) {[m
[31m-      |  jne >2[m
[31m-    } else {[m
[31m-      |  je >1[m
[31m-    }[m
[31m-    goto iseqne_end;[m
[31m-  case BC_ISEQN: case BC_ISNEN:[m
[31m-    vk = op == BC_ISEQN;[m
[31m-    |  ins_AD	// RA = src, RD = num const, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  add PC, 4[m
[31m-    |.if DUALNUM[m
[31m-    |  cmp RB, LJ_TISNUM; jne >7[m
[31m-    |  cmp dword [KBASE+RD*8+4], LJ_TISNUM; jne >8[m
[31m-    |  mov RB, dword [KBASE+RD*8][m
[31m-    |  cmp RB, dword [BASE+RA*8][m
[31m-    if (vk) {[m
[31m-      |  jne >9[m
[31m-    } else {[m
[31m-      |  je >9[m
[31m-    }[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // RA is not an integer.[m
[31m-    |  ja >3[m
[31m-    |  // RA is a number.[m
[31m-    |  cmp dword [KBASE+RD*8+4], LJ_TISNUM; jb >1[m
[31m-    |  // RA is a number, RD is an integer.[m
[31m-    |  cvtsi2sd xmm0, dword [KBASE+RD*8][m
[31m-    |  jmp >2[m
[31m-    |[m
[31m-    |8:  // RA is an integer, RD is a number.[m
[31m-    |  cvtsi2sd xmm0, dword [BASE+RA*8][m
[31m-    |  ucomisd xmm0, qword [KBASE+RD*8][m
[31m-    |  jmp >4[m
[31m-    |.else[m
[31m-    |  cmp RB, LJ_TISNUM; jae >3[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |2:[m
[31m-    |  ucomisd xmm0, qword [BASE+RA*8][m
[31m-    |4:[m
[31m-    goto iseqne_fp;[m
[31m-  case BC_ISEQP: case BC_ISNEP:[m
[31m-    vk = op == BC_ISEQP;[m
[31m-    |  ins_AND	// RA = src, RD = primitive type (~), JMP with RD = target[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  add PC, 4[m
[31m-    |  cmp RB, RD[m
[31m-    if (!LJ_HASFFI) goto iseqne_test;[m
[31m-    if (vk) {[m
[31m-      |  jne >3[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:[m
[31m-      |  ins_next[m
[31m-      |3:[m
[31m-      |  cmp RB, LJ_TCDATA; jne <2[m
[31m-      |  jmp ->vmeta_equal_cd[m
[31m-    } else {[m
[31m-      |  je >2[m
[31m-      |  cmp RB, LJ_TCDATA; je ->vmeta_equal_cd[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  branchPC RD[m
[31m-      |2:[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary test and copy ops ------------------------------------------- */[m
[31m-[m
[31m-  case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:[m
[31m-    |  ins_AD	// RA = dst or unused, RD = src, JMP with RD = target[m
[31m-    |  mov RB, [BASE+RD*8+4][m
[31m-    |  add PC, 4[m
[31m-    |  cmp RB, LJ_TISTRUECOND[m
[31m-    if (op == BC_IST || op == BC_ISTC) {[m
[31m-      |  jae >1[m
[31m-    } else {[m
[31m-      |  jb >1[m
[31m-    }[m
[31m-    if (op == BC_ISTC || op == BC_ISFC) {[m
[31m-      |  mov [BASE+RA*8+4], RB[m
[31m-      |  mov RB, [BASE+RD*8][m
[31m-      |  mov [BASE+RA*8], RB[m
[31m-    }[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  branchPC RD[m
[31m-    |1:					// Fallthrough to the next instruction.[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISTYPE:[m
[31m-    |  ins_AD	// RA = src, RD = -type[m
[31m-    |  add RD, [BASE+RA*8+4][m
[31m-    |  jne ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_ISNUM:[m
[31m-    |  ins_AD	// RA = src, RD = -(TISNUM-1)[m
[31m-    |  checknum RA, ->vmeta_istype[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Unary ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_MOV:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [BASE+RD*8][m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RD*8+4][m
[31m-    |  mov RD, [BASE+RD*8][m
[31m-    |  mov [BASE+RA*8+4], RB[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |.endif[m
[31m-    |  ins_next_[m
[31m-    break;[m
[31m-  case BC_NOT:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  xor RB, RB[m
[31m-    |  checktp RD, LJ_TISTRUECOND[m
[31m-    |  adc RB, LJ_TTRUE[m
[31m-    |  mov [BASE+RA*8+4], RB[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UNM:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RD, >5[m
[31m-    |  mov RB, [BASE+RD*8][m
[31m-    |  neg RB[m
[31m-    |  jo >4[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    |  mov dword [BASE+RA*8], RB[m
[31m-    |9:[m
[31m-    |  ins_next[m
[31m-    |4:[m
[31m-    |  mov dword [BASE+RA*8+4], 0x41e00000  // 2^31.[m
[31m-    |  mov dword [BASE+RA*8], 0[m
[31m-    |  jmp <9[m
[31m-    |5:[m
[31m-    |  ja ->vmeta_unm[m
[31m-    |.else[m
[31m-    |  checknum RD, ->vmeta_unm[m
[31m-    |.endif[m
[31m-    |  movsd xmm0, qword [BASE+RD*8][m
[31m-    |  sseconst_sign xmm1, RDa[m
[31m-    |  xorps xmm0, xmm1[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp <9[m
[31m-    |.else[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_LEN:[m
[31m-    |  ins_AD	// RA = dst, RD = src[m
[31m-    |  checkstr RD, >2[m
[31m-    |  mov STR:RD, [BASE+RD*8][m
[31m-    |.if DUALNUM[m
[31m-    |  mov RD, dword STR:RD->len[m
[31m-    |1:[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    |  mov dword [BASE+RA*8], RD[m
[31m-    |.else[m
[31m-    |  xorps xmm0, xmm0[m
[31m-    |  cvtsi2sd xmm0, dword STR:RD->len[m
[31m-    |1:[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |2:[m
[31m-    |  checktab RD, ->vmeta_len[m
[31m-    |  mov TAB:FCARG1, [BASE+RD*8][m
[31m-#if LJ_52[m
[31m-    |  mov TAB:RB, TAB:FCARG1->metatable[m
[31m-    |  cmp TAB:RB, 0[m
[31m-    |  jnz >9[m
[31m-    |3:[m
[31m-#endif[m
[31m-    |->BC_LEN_Z:[m
[31m-    |  mov RB, BASE			// Save BASE.[m
[31m-    |  call extern lj_tab_len@4		// (GCtab *t)[m
[31m-    |  // Length of table returned in eax (RD).[m
[31m-    |.if DUALNUM[m
[31m-    |  // Nothing to do.[m
[31m-    |.else[m
[31m-    |  cvtsi2sd xmm0, RD[m
[31m-    |.endif[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  jmp <1[m
[31m-#if LJ_52[m
[31m-    |9:  // Check for __len.[m
[31m-    |  test byte TAB:RB->nomm, 1<<MM_len[m
[31m-    |  jnz <3[m
[31m-    |  jmp ->vmeta_len			// 'no __len' flag NOT set: check.[m
[31m-#endif[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Binary ops -------------------------------------------------------- */[m
[31m-[m
[31m-    |.macro ins_arithpre, sseins, ssereg[m
[31m-    |  ins_ABC[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   checknum RB, ->vmeta_arith_vn[m
[31m-    |   .if DUALNUM[m
[31m-    |     cmp dword [KBASE+RC*8+4], LJ_TISNUM; jae ->vmeta_arith_vn[m
[31m-    |   .endif[m
[31m-    |   movsd xmm0, qword [BASE+RB*8][m
[31m-    |   sseins ssereg, qword [KBASE+RC*8][m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   checknum RB, ->vmeta_arith_nv[m
[31m-    |   .if DUALNUM[m
[31m-    |     cmp dword [KBASE+RC*8+4], LJ_TISNUM; jae ->vmeta_arith_nv[m
[31m-    |   .endif[m
[31m-    |   movsd xmm0, qword [KBASE+RC*8][m
[31m-    |   sseins ssereg, qword [BASE+RB*8][m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   checknum RB, ->vmeta_arith_vv[m
[31m-    |   checknum RC, ->vmeta_arith_vv[m
[31m-    |   movsd xmm0, qword [BASE+RB*8][m
[31m-    |   sseins ssereg, qword [BASE+RC*8][m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithdn, intins[m
[31m-    |  ins_ABC[m
[31m-    ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);[m
[31m-    ||switch (vk) {[m
[31m-    ||case 0:[m
[31m-    |   checkint RB, ->vmeta_arith_vn[m
[31m-    |   cmp dword [KBASE+RC*8+4], LJ_TISNUM; jne ->vmeta_arith_vn[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   intins RB, [KBASE+RC*8]; jo ->vmeta_arith_vno[m
[31m-    ||  break;[m
[31m-    ||case 1:[m
[31m-    |   checkint RB, ->vmeta_arith_nv[m
[31m-    |   cmp dword [KBASE+RC*8+4], LJ_TISNUM; jne ->vmeta_arith_nv[m
[31m-    |   mov RC, [KBASE+RC*8][m
[31m-    |   intins RC, [BASE+RB*8]; jo ->vmeta_arith_nvo[m
[31m-    ||  break;[m
[31m-    ||default:[m
[31m-    |   checkint RB, ->vmeta_arith_vv[m
[31m-    |   checkint RC, ->vmeta_arith_vv[m
[31m-    |   mov RB, [BASE+RB*8][m
[31m-    |   intins RB, [BASE+RC*8]; jo ->vmeta_arith_vvo[m
[31m-    ||  break;[m
[31m-    ||}[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    ||if (vk == 1) {[m
[31m-    |   mov dword [BASE+RA*8], RC[m
[31m-    ||} else {[m
[31m-    |   mov dword [BASE+RA*8], RB[m
[31m-    ||}[m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arithpost[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, sseins[m
[31m-    |  ins_arithpre sseins, xmm0[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    |.endmacro[m
[31m-    |[m
[31m-    |.macro ins_arith, intins, sseins[m
[31m-    |.if DUALNUM[m
[31m-    |  ins_arithdn intins[m
[31m-    |.else[m
[31m-    |  ins_arith, sseins[m
[31m-    |.endif[m
[31m-    |.endmacro[m
[31m-[m
[31m-    |  // RA = dst, RB = src1 or num const, RC = src2 or num const[m
[31m-  case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:[m
[31m-    |  ins_arith add, addsd[m
[31m-    break;[m
[31m-  case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:[m
[31m-    |  ins_arith sub, subsd[m
[31m-    break;[m
[31m-  case BC_MULVN: case BC_MULNV: case BC_MULVV:[m
[31m-    |  ins_arith imul, mulsd[m
[31m-    break;[m
[31m-  case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:[m
[31m-    |  ins_arith divsd[m
[31m-    break;[m
[31m-  case BC_MODVN:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |->BC_MODVN_Z:[m
[31m-    |  call ->vm_mod[m
[31m-    |  ins_arithpost[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_MODNV: case BC_MODVV:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |  jmp ->BC_MODVN_Z			// Avoid 3 copies. It's slow anyway.[m
[31m-    break;[m
[31m-  case BC_POW:[m
[31m-    |  ins_arithpre movsd, xmm1[m
[31m-    |  mov RB, BASE[m
[31m-    |.if not X64[m
[31m-    |  movsd FPARG1, xmm0[m
[31m-    |  movsd FPARG3, xmm1[m
[31m-    |.endif[m
[31m-    |  call extern pow[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  mov BASE, RB[m
[31m-    |.if X64[m
[31m-    |  ins_arithpost[m
[31m-    |.else[m
[31m-    |  fstp qword [BASE+RA*8][m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CAT:[m
[31m-    |  ins_ABC	// RA = dst, RB = src_start, RC = src_end[m
[31m-    |.if X64[m
[31m-    |  mov L:CARG1d, SAVE_L[m
[31m-    |  mov L:CARG1d->base, BASE[m
[31m-    |  lea CARG2d, [BASE+RC*8][m
[31m-    |  mov CARG3d, RC[m
[31m-    |  sub CARG3d, RB[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  mov L:RB, L:CARG1d[m
[31m-    |.else[m
[31m-    |  lea RA, [BASE+RC*8][m
[31m-    |  sub RC, RB[m
[31m-    |  mov ARG2, RA[m
[31m-    |  mov ARG3, RC[m
[31m-    |->BC_CAT_Z:[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |.endif[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_meta_cat		// (lua_State *L, TValue *top, int left)[m
[31m-    |  // NULL (finished) or TValue * (metamethod) returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  test RC, RC[m
[31m-    |  jnz ->vmeta_binop[m
[31m-    |  movzx RB, PC_RB			// Copy result to Stk[RA] from Stk[RB].[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |.if X64[m
[31m-    |  mov RCa, [BASE+RB*8][m
[31m-    |  mov [BASE+RA*8], RCa[m
[31m-    |.else[m
[31m-    |  mov RC, [BASE+RB*8+4][m
[31m-    |  mov RB, [BASE+RB*8][m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Constant ops ------------------------------------------------------ */[m
[31m-[m
[31m-  case BC_KSTR:[m
[31m-    |  ins_AND	// RA = dst, RD = str const (~)[m
[31m-    |  mov RD, [KBASE+RD*4][m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TSTR[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KCDATA:[m
[31m-    |.if FFI[m
[31m-    |  ins_AND	// RA = dst, RD = cdata const (~)[m
[31m-    |  mov RD, [KBASE+RD*4][m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TCDATA[m
[31m-    |  mov [BASE+RA*8], RD[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    break;[m
[31m-  case BC_KSHORT:[m
[31m-    |  ins_AD	// RA = dst, RD = signed int16 literal[m
[31m-    |.if DUALNUM[m
[31m-    |  movsx RD, RDW[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    |  mov dword [BASE+RA*8], RD[m
[31m-    |.else[m
[31m-    |  movsx RD, RDW			// Sign-extend literal.[m
[31m-    |  cvtsi2sd xmm0, RD[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNUM:[m
[31m-    |  ins_AD	// RA = dst, RD = num const[m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KPRI:[m
[31m-    |  ins_AND	// RA = dst, RD = primitive type (~)[m
[31m-    |  mov [BASE+RA*8+4], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_KNIL:[m
[31m-    |  ins_AD	// RA = dst_start, RD = dst_end[m
[31m-    |  lea RA, [BASE+RA*8+12][m
[31m-    |  lea RD, [BASE+RD*8+4][m
[31m-    |  mov RB, LJ_TNIL[m
[31m-    |  mov [RA-8], RB			// Sets minimum 2 slots.[m
[31m-    |1:[m
[31m-    |  mov [RA], RB[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RD[m
[31m-    |  jbe <1[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Upvalue and function ops ------------------------------------------ */[m
[31m-[m
[31m-  case BC_UGET:[m
[31m-    |  ins_AD	// RA = dst, RD = upvalue #[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RD*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RB, UPVAL:RB->v[m
[31m-    |.if X64[m
[31m-    |  mov RDa, [RB][m
[31m-    |  mov [BASE+RA*8], RDa[m
[31m-    |.else[m
[31m-    |  mov RD, [RB+4][m
[31m-    |  mov RB, [RB][m
[31m-    |  mov [BASE+RA*8+4], RD[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETV:[m
[31m-#define TV2MARKOFS \[m
[31m- ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))[m
[31m-    |  ins_AD	// RA = upvalue #, RD = src[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  cmp byte UPVAL:RB->closed, 0[m
[31m-    |  mov RB, UPVAL:RB->v[m
[31m-    |  mov RA, [BASE+RD*8][m
[31m-    |  mov RD, [BASE+RD*8+4][m
[31m-    |  mov [RB], RA[m
[31m-    |  mov [RB+4], RD[m
[31m-    |  jz >1[m
[31m-    |  // Check barrier for closed upvalue.[m
[31m-    |  test byte [RB+TV2MARKOFS], LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  jnz >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Upvalue is black. Check if new value is collectable and white.[m
[31m-    |  sub RD, LJ_TISGCV[m
[31m-    |  cmp RD, LJ_TNUMX - LJ_TISGCV			// tvisgcv(v)[m
[31m-    |  jbe <1[m
[31m-    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(v)[m
[31m-    |  jz <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |.if X64 and not X64WIN[m
[31m-    |  mov FCARG2, RB[m
[31m-    |  mov RB, BASE			// Save BASE.[m
[31m-    |.else[m
[31m-    |  xchg FCARG2, RB			// Save BASE (FCARG2 == BASE).[m
[31m-    |.endif[m
[31m-    |  lea GL:FCARG1, [DISPATCH+GG_DISP2G][m
[31m-    |  call extern lj_gc_barrieruv@8	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-#undef TV2MARKOFS[m
[31m-  case BC_USETS:[m
[31m-    |  ins_AND	// RA = upvalue #, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov GCOBJ:RA, [KBASE+RD*4][m
[31m-    |  mov RD, UPVAL:RB->v[m
[31m-    |  mov [RD], GCOBJ:RA[m
[31m-    |  mov dword [RD+4], LJ_TSTR[m
[31m-    |  test byte UPVAL:RB->marked, LJ_GC_BLACK		// isblack(uv)[m
[31m-    |  jnz >2[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check if string is white and ensure upvalue is closed.[m
[31m-    |  test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES	// iswhite(str)[m
[31m-    |  jz <1[m
[31m-    |  cmp byte UPVAL:RB->closed, 0[m
[31m-    |  jz <1[m
[31m-    |  // Crossed a write barrier. Move the barrier forward.[m
[31m-    |  mov RB, BASE			// Save BASE (FCARG2 == BASE).[m
[31m-    |  mov FCARG2, RD[m
[31m-    |  lea GL:FCARG1, [DISPATCH+GG_DISP2G][m
[31m-    |  call extern lj_gc_barrieruv@8	// (global_State *g, TValue *tv)[m
[31m-    |  mov BASE, RB			// Restore BASE.[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_USETN:[m
[31m-    |  ins_AD	// RA = upvalue #, RD = num const[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  movsd xmm0, qword [KBASE+RD*8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RA, UPVAL:RB->v[m
[31m-    |  movsd qword [RA], xmm0[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_USETP:[m
[31m-    |  ins_AND	// RA = upvalue #, RD = primitive type (~)[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)][m
[31m-    |  mov RA, UPVAL:RB->v[m
[31m-    |  mov [RA+4], RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-  case BC_UCLO:[m
[31m-    |  ins_AD	// RA = level, RD = target[m
[31m-    |  branchPC RD			// Do this first to free RD.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  cmp dword L:RB->openupval, 0[m
[31m-    |  je >1[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  lea FCARG2, [BASE+RA*8]		// Caveat: FCARG2 == BASE[m
[31m-    |  mov L:FCARG1, L:RB		// Caveat: FCARG1 == RA[m
[31m-    |  call extern lj_func_closeuv@8	// (lua_State *L, TValue *level)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FNEW:[m
[31m-    |  ins_AND	// RA = dst, RD = proto const (~) (holding function prototype)[m
[31m-    |.if X64[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-    |  mov CARG3d, [BASE-8][m
[31m-    |  mov CARG2d, [KBASE+RD*4]		// Fetch GCproto *.[m
[31m-    |  mov CARG1d, L:RB[m
[31m-    |.else[m
[31m-    |  mov LFUNC:RA, [BASE-8][m
[31m-    |  mov PROTO:RD, [KBASE+RD*4]	// Fetch GCproto *.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov ARG3, LFUNC:RA[m
[31m-    |  mov ARG2, PROTO:RD[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |.endif[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  // (lua_State *L, GCproto *pt, GCfuncL *parent)[m
[31m-    |  call extern lj_func_newL_gc[m
[31m-    |  // GCfuncL * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  mov [BASE+RA*8], LFUNC:RC[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TFUNC[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Table ops --------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_TNEW:[m
[31m-    |  ins_AD	// RA = dst, RD = hbits|asize[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  jae >5[m
[31m-    |1:[m
[31m-    |.if X64[m
[31m-    |  mov CARG3d, RD[m
[31m-    |  and RD, 0x7ff[m
[31m-    |  shr CARG3d, 11[m
[31m-    |.else[m
[31m-    |  mov RA, RD[m
[31m-    |  and RD, 0x7ff[m
[31m-    |  shr RA, 11[m
[31m-    |  mov ARG3, RA[m
[31m-    |.endif[m
[31m-    |  cmp RD, 0x7ff[m
[31m-    |  je >3[m
[31m-    |2:[m
[31m-    |.if X64[m
[31m-    |  mov L:CARG1d, L:RB[m
[31m-    |  mov CARG2d, RD[m
[31m-    |.else[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |  mov ARG2, RD[m
[31m-    |.endif[m
[31m-    |  call extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)[m
[31m-    |  // Table * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  mov [BASE+RA*8], TAB:RC[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TTAB[m
[31m-    |  ins_next[m
[31m-    |3:  // Turn 0x7ff into 0x801.[m
[31m-    |  mov RD, 0x801[m
[31m-    |  jmp <2[m
[31m-    |5:[m
[31m-    |  mov L:FCARG1, L:RB[m
[31m-    |  call extern lj_gc_step_fixtop@4	// (lua_State *L)[m
[31m-    |  movzx RD, PC_RD[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_TDUP:[m
[31m-    |  ins_AND	// RA = dst, RD = table const (~) (holding template table)[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_GL(gc.total)][m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)][m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  jae >3[m
[31m-    |2:[m
[31m-    |  mov TAB:FCARG2, [KBASE+RD*4]	// Caveat: FCARG2 == BASE[m
[31m-    |  mov L:FCARG1, L:RB		// Caveat: FCARG1 == RA[m
[31m-    |  call extern lj_tab_dup@8		// (lua_State *L, Table *kt)[m
[31m-    |  // Table * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  mov [BASE+RA*8], TAB:RC[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TTAB[m
[31m-    |  ins_next[m
[31m-    |3:[m
[31m-    |  mov L:FCARG1, L:RB[m
[31m-    |  call extern lj_gc_step_fixtop@4	// (lua_State *L)[m
[31m-    |  movzx RD, PC_RD			// Need to reload RD.[m
[31m-    |  not RDa[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_GGET:[m
[31m-    |  ins_AND	// RA = dst, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov TAB:RB, LFUNC:RB->env[m
[31m-    |  mov STR:RC, [KBASE+RD*4][m
[31m-    |  jmp ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_GSET:[m
[31m-    |  ins_AND	// RA = src, RD = str const (~)[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |  mov TAB:RB, LFUNC:RB->env[m
[31m-    |  mov STR:RC, [KBASE+RD*4][m
[31m-    |  jmp ->BC_TSETS_Z[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TGETV:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = key[m
[31m-    |  checktab RB, ->vmeta_tgetv[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |[m
[31m-    |  // Integer key?[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RC, >5[m
[31m-    |  mov RC, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  // Convert number to int and back and compare.[m
[31m-    |  checknum RC, >5[m
[31m-    |  movsd xmm0, qword [BASE+RC*8][m
[31m-    |  cvttsd2si RC, xmm0[m
[31m-    |  cvtsi2sd xmm1, RC[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jne ->vmeta_tgetv		// Generic numeric key? Use fallback.[m
[31m-    |.endif[m
[31m-    |  cmp RC, TAB:RB->asize	// Takes care of unordered, too.[m
[31m-    |  jae ->vmeta_tgetv		// Not in array part? Use fallback.[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp dword [RC+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[31m-    |  je >2[m
[31m-    |  // Get array slot.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RC][m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RC][m
[31m-    |  mov RC, [RC+4][m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz >3[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_index[m
[31m-    |  jz ->vmeta_tgetv			// 'no __index' flag NOT set: check.[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |3:[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TNIL[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // String key?[m
[31m-    |  checkstr RC, ->vmeta_tgetv[m
[31m-    |  mov STR:RC, [BASE+RC*8][m
[31m-    |  jmp ->BC_TGETS_Z[m
[31m-    break;[m
[31m-  case BC_TGETS:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = str const (~)[m
[31m-    |  not RCa[m
[31m-    |  mov STR:RC, [KBASE+RC*4][m
[31m-    |  checktab RB, ->vmeta_tgets[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |->BC_TGETS_Z:	// RB = GCtab *, RC = GCstr *, refetches PC_RA.[m
[31m-    |  mov RA, TAB:RB->hmask[m
[31m-    |  and RA, STR:RC->hash[m
[31m-    |  imul RA, #NODE[m
[31m-    |  add NODE:RA, TAB:RB->node[m
[31m-    |1:[m
[31m-    |  cmp dword NODE:RA->key.it, LJ_TSTR[m
[31m-    |  jne >4[m
[31m-    |  cmp dword NODE:RA->key.gcr, STR:RC[m
[31m-    |  jne >4[m
[31m-    |  // Ok, key found. Assumes: offsetof(Node, val) == 0[m
[31m-    |  cmp dword [RA+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[31m-    |  je >5				// Key found, but nil value?[m
[31m-    |  movzx RC, PC_RA[m
[31m-    |  // Get node value.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RA][m
[31m-    |  mov [BASE+RC*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RA][m
[31m-    |  mov RA, [RA+4][m
[31m-    |  mov [BASE+RC*8], RB[m
[31m-    |  mov [BASE+RC*8+4], RA[m
[31m-    |.endif[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:[m
[31m-    |  movzx RC, PC_RA[m
[31m-    |  mov dword [BASE+RC*8+4], LJ_TNIL[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |4:  // Follow hash chain.[m
[31m-    |  mov NODE:RA, NODE:RA->next[m
[31m-    |  test NODE:RA, NODE:RA[m
[31m-    |  jnz <1[m
[31m-    |  // End of hash chain: key not found, nil result.[m
[31m-    |[m
[31m-    |5:  // Check for __index if table value is nil.[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test TAB:RA, TAB:RA[m
[31m-    |  jz <3				// No metatable: done.[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_index[m
[31m-    |  jnz <3				// 'no __index' flag set: done.[m
[31m-    |  jmp ->vmeta_tgets		// Caveat: preserve STR:RC.[m
[31m-    break;[m
[31m-  case BC_TGETB:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = byte literal[m
[31m-    |  checktab RB, ->vmeta_tgetb[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  cmp RC, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tgetb[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp dword [RC+4], LJ_TNIL	// Avoid overwriting RB in fastpath.[m
[31m-    |  je >2[m
[31m-    |  // Get array slot.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RC][m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RC][m
[31m-    |  mov RC, [RC+4][m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |.endif[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |2:  // Check for __index if table value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz >3[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_index[m
[31m-    |  jz ->vmeta_tgetb			// 'no __index' flag NOT set: check.[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |3:[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TNIL[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-  case BC_TGETR:[m
[31m-    |  ins_ABC	// RA = dst, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |.if DUALNUM[m
[31m-    |  mov RC, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  cvttsd2si RC, qword [BASE+RC*8][m
[31m-    |.endif[m
[31m-    |  cmp RC, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tgetr		// Not in array part? Use fallback.[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Get array slot.[m
[31m-    |->BC_TGETR_Z:[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RC][m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RC][m
[31m-    |  mov RC, [RC+4][m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |.endif[m
[31m-    |->BC_TGETR2_Z:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETV:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = key[m
[31m-    |  checktab RB, ->vmeta_tsetv[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |[m
[31m-    |  // Integer key?[m
[31m-    |.if DUALNUM[m
[31m-    |  checkint RC, >5[m
[31m-    |  mov RC, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  // Convert number to int and back and compare.[m
[31m-    |  checknum RC, >5[m
[31m-    |  movsd xmm0, qword [BASE+RC*8][m
[31m-    |  cvttsd2si RC, xmm0[m
[31m-    |  cvtsi2sd xmm1, RC[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jne ->vmeta_tsetv		// Generic numeric key? Use fallback.[m
[31m-    |.endif[m
[31m-    |  cmp RC, TAB:RB->asize		// Takes care of unordered, too.[m
[31m-    |  jae ->vmeta_tsetv[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp dword [RC+4], LJ_TNIL[m
[31m-    |  je >3				// Previous value is nil?[m
[31m-    |1:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:  // Set array slot.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [BASE+RA*8][m
[31m-    |  mov [RC], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  mov RA, [BASE+RA*8][m
[31m-    |  mov [RC+4], RB[m
[31m-    |  mov [RC], RA[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz <1[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsetv			// 'no __newindex' flag NOT set: check.[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // String key?[m
[31m-    |  checkstr RC, ->vmeta_tsetv[m
[31m-    |  mov STR:RC, [BASE+RC*8][m
[31m-    |  jmp ->BC_TSETS_Z[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RA[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-  case BC_TSETS:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = str const (~)[m
[31m-    |  not RCa[m
[31m-    |  mov STR:RC, [KBASE+RC*4][m
[31m-    |  checktab RB, ->vmeta_tsets[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |->BC_TSETS_Z:	// RB = GCtab *, RC = GCstr *, refetches PC_RA.[m
[31m-    |  mov RA, TAB:RB->hmask[m
[31m-    |  and RA, STR:RC->hash[m
[31m-    |  imul RA, #NODE[m
[31m-    |  mov byte TAB:RB->nomm, 0		// Clear metamethod cache.[m
[31m-    |  add NODE:RA, TAB:RB->node[m
[31m-    |1:[m
[31m-    |  cmp dword NODE:RA->key.it, LJ_TSTR[m
[31m-    |  jne >5[m
[31m-    |  cmp dword NODE:RA->key.gcr, STR:RC[m
[31m-    |  jne >5[m
[31m-    |  // Ok, key found. Assumes: offsetof(Node, val) == 0[m
[31m-    |  cmp dword [RA+4], LJ_TNIL[m
[31m-    |  je >4				// Previous value is nil?[m
[31m-    |2:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |3:  // Set node value.[m
[31m-    |  movzx RC, PC_RA[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [BASE+RC*8][m
[31m-    |  mov [RA], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RC*8+4][m
[31m-    |  mov RC, [BASE+RC*8][m
[31m-    |  mov [RA+4], RB[m
[31m-    |  mov [RA], RC[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Check for __newindex if previous value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz <2[m
[31m-    |  mov TMP1, RA			// Save RA.[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[31m-    |  mov RA, TMP1			// Restore RA.[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |5:  // Follow hash chain.[m
[31m-    |  mov NODE:RA, NODE:RA->next[m
[31m-    |  test NODE:RA, NODE:RA[m
[31m-    |  jnz <1[m
[31m-    |  // End of hash chain: key not found, add a new one.[m
[31m-    |[m
[31m-    |  // But check for __newindex first.[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test TAB:RA, TAB:RA[m
[31m-    |  jz >6				// No metatable: continue.[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsets			// 'no __newindex' flag NOT set: check.[m
[31m-    |6:[m
[31m-    |  mov TMP1, STR:RC[m
[31m-    |  mov TMP2, LJ_TSTR[m
[31m-    |  mov TMP3, TAB:RB			// Save TAB:RB for us.[m
[31m-    |.if X64[m
[31m-    |  mov L:CARG1d, SAVE_L[m
[31m-    |  mov L:CARG1d->base, BASE[m
[31m-    |  lea CARG3, TMP1[m
[31m-    |  mov CARG2d, TAB:RB[m
[31m-    |  mov L:RB, L:CARG1d[m
[31m-    |.else[m
[31m-    |  lea RC, TMP1			// Store temp. TValue in TMP1/TMP2.[m
[31m-    |  mov ARG2, TAB:RB[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov ARG3, RC[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |.endif[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_tab_newkey	// (lua_State *L, GCtab *t, TValue *k)[m
[31m-    |  // Handles write barrier for the new key. TValue * returned in eax (RC).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  mov TAB:RB, TMP3			// Need TAB:RB for barrier.[m
[31m-    |  mov RA, eax[m
[31m-    |  jmp <2				// Must check write barrier for value.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RC		// Destroys STR:RC.[m
[31m-    |  jmp <3[m
[31m-    break;[m
[31m-  case BC_TSETB:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = byte literal[m
[31m-    |  checktab RB, ->vmeta_tsetb[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |  cmp RC, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tsetb[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  cmp dword [RC+4], LJ_TNIL[m
[31m-    |  je >3				// Previous value is nil?[m
[31m-    |1:[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:	 // Set array slot.[m
[31m-    |.if X64[m
[31m-    |  mov RAa, [BASE+RA*8][m
[31m-    |  mov [RC], RAa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  mov RA, [BASE+RA*8][m
[31m-    |  mov [RC+4], RB[m
[31m-    |  mov [RC], RA[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |3:  // Check for __newindex if previous value is nil.[m
[31m-    |  cmp dword TAB:RB->metatable, 0	// Shouldn't overwrite RA for fastpath.[m
[31m-    |  jz <1[m
[31m-    |  mov TAB:RA, TAB:RB->metatable[m
[31m-    |  test byte TAB:RA->nomm, 1<<MM_newindex[m
[31m-    |  jz ->vmeta_tsetb			// 'no __newindex' flag NOT set: check.[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RA[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-  case BC_TSETR:[m
[31m-    |  ins_ABC	// RA = src, RB = table, RC = key[m
[31m-    |  mov TAB:RB, [BASE+RB*8][m
[31m-    |.if DUALNUM[m
[31m-    |  mov RC, dword [BASE+RC*8][m
[31m-    |.else[m
[31m-    |  cvttsd2si RC, qword [BASE+RC*8][m
[31m-    |.endif[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:[m
[31m-    |  cmp RC, TAB:RB->asize[m
[31m-    |  jae ->vmeta_tsetr[m
[31m-    |  shl RC, 3[m
[31m-    |  add RC, TAB:RB->array[m
[31m-    |  // Set array slot.[m
[31m-    |->BC_TSETR_Z:[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [BASE+RA*8][m
[31m-    |  mov [RC], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [BASE+RA*8+4][m
[31m-    |  mov RA, [BASE+RA*8][m
[31m-    |  mov [RC+4], RB[m
[31m-    |  mov [RC], RA[m
[31m-    |.endif[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for the value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RA[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_TSETM:[m
[31m-    |  ins_AD	// RA = base (table at base-1), RD = num const (start index)[m
[31m-    |  mov TMP1, KBASE			// Need one more free register.[m
[31m-    |  mov KBASE, dword [KBASE+RD*8]	// Integer constant is in lo-word.[m
[31m-    |1:[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  mov TAB:RB, [RA-8]		// Guaranteed to be a table.[m
[31m-    |  test byte TAB:RB->marked, LJ_GC_BLACK	// isblack(table)[m
[31m-    |  jnz >7[m
[31m-    |2:[m
[31m-    |  mov RD, MULTRES[m
[31m-    |  sub RD, 1[m
[31m-    |  jz >4				// Nothing to copy?[m
[31m-    |  add RD, KBASE			// Compute needed size.[m
[31m-    |  cmp RD, TAB:RB->asize[m
[31m-    |  ja >5				// Doesn't fit into array part?[m
[31m-    |  sub RD, KBASE[m
[31m-    |  shl KBASE, 3[m
[31m-    |  add KBASE, TAB:RB->array[m
[31m-    |3:  // Copy result slots to table.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RA][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RA][m
[31m-    |  mov [KBASE], RB[m
[31m-    |  mov RB, [RA+4][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE+4], RB[m
[31m-    |.endif[m
[31m-    |  add KBASE, 8[m
[31m-    |  sub RD, 1[m
[31m-    |  jnz <3[m
[31m-    |4:[m
[31m-    |  mov KBASE, TMP1[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Need to resize array part.[m
[31m-    |.if X64[m
[31m-    |  mov L:CARG1d, SAVE_L[m
[31m-    |  mov L:CARG1d->base, BASE		// Caveat: CARG2d/CARG3d may be BASE.[m
[31m-    |  mov CARG2d, TAB:RB[m
[31m-    |  mov CARG3d, RD[m
[31m-    |  mov L:RB, L:CARG1d[m
[31m-    |.else[m
[31m-    |  mov ARG2, TAB:RB[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov ARG3, RD[m
[31m-    |  mov ARG1, L:RB[m
[31m-    |.endif[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  call extern lj_tab_reasize	// (lua_State *L, GCtab *t, int nasize)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  movzx RA, PC_RA			// Restore RA.[m
[31m-    |  jmp <1				// Retry.[m
[31m-    |[m
[31m-    |7:  // Possible table write barrier for any value. Skip valiswhite check.[m
[31m-    |  barrierback TAB:RB, RD[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Calls and vararg handling ----------------------------------------- */[m
[31m-[m
[31m-  case BC_CALL: case BC_CALLM:[m
[31m-    |  ins_A_C	// RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs[m
[31m-    if (op == BC_CALLM) {[m
[31m-      |  add NARGS:RD, MULTRES[m
[31m-    }[m
[31m-    |  cmp dword [BASE+RA*8+4], LJ_TFUNC[m
[31m-    |  mov LFUNC:RB, [BASE+RA*8][m
[31m-    |  jne ->vmeta_call_ra[m
[31m-    |  lea BASE, [BASE+RA*8+8][m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_CALLMT:[m
[31m-    |  ins_AD	// RA = base, RD = extra_nargs[m
[31m-    |  add NARGS:RD, MULTRES[m
[31m-    |  // Fall through. Assumes BC_CALLT follows and ins_AD is a no-op.[m
[31m-    break;[m
[31m-  case BC_CALLT:[m
[31m-    |  ins_AD	// RA = base, RD = nargs+1[m
[31m-    |  lea RA, [BASE+RA*8+8][m
[31m-    |  mov KBASE, BASE			// Use KBASE for move + vmeta_call hint.[m
[31m-    |  mov LFUNC:RB, [RA-8][m
[31m-    |  cmp dword [RA-4], LJ_TFUNC[m
[31m-    |  jne ->vmeta_call[m
[31m-    |->BC_CALLT_Z:[m
[31m-    |  mov PC, [BASE-4][m
[31m-    |  test PC, FRAME_TYPE[m
[31m-    |  jnz >7[m
[31m-    |1:[m
[31m-    |  mov [BASE-8], LFUNC:RB		// Copy function down, reloaded below.[m
[31m-    |  mov MULTRES, NARGS:RD[m
[31m-    |  sub NARGS:RD, 1[m
[31m-    |  jz >3[m
[31m-    |2:  // Move args down.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RA][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [RA][m
[31m-    |  mov [KBASE], RB[m
[31m-    |  mov RB, [RA+4][m
[31m-    |  add RA, 8[m
[31m-    |  mov [KBASE+4], RB[m
[31m-    |.endif[m
[31m-    |  add KBASE, 8[m
[31m-    |  sub NARGS:RD, 1[m
[31m-    |  jnz <2[m
[31m-    |[m
[31m-    |  mov LFUNC:RB, [BASE-8][m
[31m-    |3:[m
[31m-    |  mov NARGS:RD, MULTRES[m
[31m-    |  cmp byte LFUNC:RB->ffid, 1	// (> FF_C) Calling a fast function?[m
[31m-    |  ja >5[m
[31m-    |4:[m
[31m-    |  ins_callt[m
[31m-    |[m
[31m-    |5:  // Tailcall to a fast function.[m
[31m-    |  test PC, FRAME_TYPE		// Lua frame below?[m
[31m-    |  jnz <4[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  not RAa[m
[31m-    |  mov LFUNC:KBASE, [BASE+RA*8-8]	// Need to prepare KBASE.[m
[31m-    |  mov KBASE, LFUNC:KBASE->pc[m
[31m-    |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-    |  jmp <4[m
[31m-    |[m
[31m-    |7:  // Tailcall from a vararg function.[m
[31m-    |  sub PC, FRAME_VARG[m
[31m-    |  test PC, FRAME_TYPEP[m
[31m-    |  jnz >8				// Vararg frame below?[m
[31m-    |  sub BASE, PC			// Need to relocate BASE/KBASE down.[m
[31m-    |  mov KBASE, BASE[m
[31m-    |  mov PC, [BASE-4][m
[31m-    |  jmp <1[m
[31m-    |8:[m
[31m-    |  add PC, FRAME_VARG[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERC:[m
[31m-    |  ins_A	// RA = base, (RB = nresults+1,) RC = nargs+1 (2+1)[m
[31m-    |  lea RA, [BASE+RA*8+8]		// fb = base+1[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [RA-24]			// Copy state. fb[0] = fb[-3].[m
[31m-    |  mov RCa, [RA-16]			// Copy control var. fb[1] = fb[-2].[m
[31m-    |  mov [RA], RBa[m
[31m-    |  mov [RA+8], RCa[m
[31m-    |.else[m
[31m-    |  mov RB, [RA-24]			// Copy state. fb[0] = fb[-3].[m
[31m-    |  mov RC, [RA-20][m
[31m-    |  mov [RA], RB[m
[31m-    |  mov [RA+4], RC[m
[31m-    |  mov RB, [RA-16]			// Copy control var. fb[1] = fb[-2].[m
[31m-    |  mov RC, [RA-12][m
[31m-    |  mov [RA+8], RB[m
[31m-    |  mov [RA+12], RC[m
[31m-    |.endif[m
[31m-    |  mov LFUNC:RB, [RA-32]		// Copy callable. fb[-1] = fb[-4][m
[31m-    |  mov RC, [RA-28][m
[31m-    |  mov [RA-8], LFUNC:RB[m
[31m-    |  mov [RA-4], RC[m
[31m-    |  cmp RC, LJ_TFUNC			// Handle like a regular 2-arg call.[m
[31m-    |  mov NARGS:RD, 2+1[m
[31m-    |  jne ->vmeta_call[m
[31m-    |  mov BASE, RA[m
[31m-    |  ins_call[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERN:[m
[31m-    |  ins_A	// RA = base, (RB = nresults+1, RC = nargs+1 (2+1))[m
[31m-    |.if JIT[m
[31m-    |  // NYI: add hotloop, record BC_ITERN.[m
[31m-    |.endif[m
[31m-    |  mov TMP1, KBASE			// Need two more free registers.[m
[31m-    |  mov TMP2, DISPATCH[m
[31m-    |  mov TAB:RB, [BASE+RA*8-16][m
[31m-    |  mov RC, [BASE+RA*8-8]		// Get index from control var.[m
[31m-    |  mov DISPATCH, TAB:RB->asize[m
[31m-    |  add PC, 4[m
[31m-    |  mov KBASE, TAB:RB->array[m
[31m-    |1:  // Traverse array part.[m
[31m-    |  cmp RC, DISPATCH; jae >5		// Index points after array part?[m
[31m-    |  cmp dword [KBASE+RC*8+4], LJ_TNIL; je >4[m
[31m-    |.if DUALNUM[m
[31m-    |  mov dword [BASE+RA*8+4], LJ_TISNUM[m
[31m-    |  mov dword [BASE+RA*8], RC[m
[31m-    |.else[m
[31m-    |  cvtsi2sd xmm0, RC[m
[31m-    |.endif[m
[31m-    |  // Copy array slot to returned value.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, [KBASE+RC*8][m
[31m-    |  mov [BASE+RA*8+8], RBa[m
[31m-    |.else[m
[31m-    |  mov RB, [KBASE+RC*8+4][m
[31m-    |  mov [BASE+RA*8+12], RB[m
[31m-    |  mov RB, [KBASE+RC*8][m
[31m-    |  mov [BASE+RA*8+8], RB[m
[31m-    |.endif[m
[31m-    |  add RC, 1[m
[31m-    |  // Return array index as a numeric key.[m
[31m-    |.if DUALNUM[m
[31m-    |  // See above.[m
[31m-    |.else[m
[31m-    |  movsd qword [BASE+RA*8], xmm0[m
[31m-    |.endif[m
[31m-    |  mov [BASE+RA*8-8], RC		// Update control var.[m
[31m-    |2:[m
[31m-    |  movzx RD, PC_RD			// Get target from ITERL.[m
[31m-    |  branchPC RD[m
[31m-    |3:[m
[31m-    |  mov DISPATCH, TMP2[m
[31m-    |  mov KBASE, TMP1[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |4:  // Skip holes in array part.[m
[31m-    |  add RC, 1[m
[31m-    |  jmp <1[m
[31m-    |[m
[31m-    |5:  // Traverse hash part.[m
[31m-    |  sub RC, DISPATCH[m
[31m-    |6:[m
[31m-    |  cmp RC, TAB:RB->hmask; ja <3	// End of iteration? Branch to ITERL+1.[m
[31m-    |  imul KBASE, RC, #NODE[m
[31m-    |  add NODE:KBASE, TAB:RB->node[m
[31m-    |  cmp dword NODE:KBASE->val.it, LJ_TNIL; je >7[m
[31m-    |  lea DISPATCH, [RC+DISPATCH+1][m
[31m-    |  // Copy key and value from hash slot.[m
[31m-    |.if X64[m
[31m-    |  mov RBa, NODE:KBASE->key[m
[31m-    |  mov RCa, NODE:KBASE->val[m
[31m-    |  mov [BASE+RA*8], RBa[m
[31m-    |  mov [BASE+RA*8+8], RCa[m
[31m-    |.else[m
[31m-    |  mov RB, NODE:KBASE->key.gcr[m
[31m-    |  mov RC, NODE:KBASE->key.it[m
[31m-    |  mov [BASE+RA*8], RB[m
[31m-    |  mov [BASE+RA*8+4], RC[m
[31m-    |  mov RB, NODE:KBASE->val.gcr[m
[31m-    |  mov RC, NODE:KBASE->val.it[m
[31m-    |  mov [BASE+RA*8+8], RB[m
[31m-    |  mov [BASE+RA*8+12], RC[m
[31m-    |.endif[m
[31m-    |  mov [BASE+RA*8-8], DISPATCH[m
[31m-    |  jmp <2[m
[31m-    |[m
[31m-    |7:  // Skip holes in hash part.[m
[31m-    |  add RC, 1[m
[31m-    |  jmp <6[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ISNEXT:[m
[31m-    |  ins_AD	// RA = base, RD = target (points to ITERN)[m
[31m-    |  cmp dword [BASE+RA*8-20], LJ_TFUNC; jne >5[m
[31m-    |  mov CFUNC:RB, [BASE+RA*8-24][m
[31m-    |  cmp dword [BASE+RA*8-12], LJ_TTAB; jne >5[m
[31m-    |  cmp dword [BASE+RA*8-4], LJ_TNIL; jne >5[m
[31m-    |  cmp byte CFUNC:RB->ffid, FF_next_N; jne >5[m
[31m-    |  branchPC RD[m
[31m-    |  mov dword [BASE+RA*8-8], 0	// Initialize control var.[m
[31m-    |  mov dword [BASE+RA*8-4], 0xfffe7fff[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    |5:  // Despecialize bytecode if any of the checks fail.[m
[31m-    |  mov PC_OP, BC_JMP[m
[31m-    |  branchPC RD[m
[31m-    |  mov byte [PC], BC_ITERC[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_VARG:[m
[31m-    |  ins_ABC	// RA = base, RB = nresults+1, RC = numparams[m
[31m-    |  mov TMP1, KBASE			// Need one more free register.[m
[31m-    |  lea KBASE, [BASE+RC*8+(8+FRAME_VARG)][m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  sub KBASE, [BASE-4][m
[31m-    |  // Note: KBASE may now be even _above_ BASE if nargs was < numparams.[m
[31m-    |  test RB, RB[m
[31m-    |  jz >5				// Copy all varargs?[m
[31m-    |  lea RB, [RA+RB*8-8][m
[31m-    |  cmp KBASE, BASE			// No vararg slots?[m
[31m-    |  jnb >2[m
[31m-    |1:  // Copy vararg slots to destination slots.[m
[31m-    |.if X64[m
[31m-    |  mov RCa, [KBASE-8][m
[31m-    |  add KBASE, 8[m
[31m-    |  mov [RA], RCa[m
[31m-    |.else[m
[31m-    |  mov RC, [KBASE-8][m
[31m-    |  mov [RA], RC[m
[31m-    |  mov RC, [KBASE-4][m
[31m-    |  add KBASE, 8[m
[31m-    |  mov [RA+4], RC[m
[31m-    |.endif[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RB			// All destination slots filled?[m
[31m-    |  jnb >3[m
[31m-    |  cmp KBASE, BASE			// No more vararg slots?[m
[31m-    |  jb <1[m
[31m-    |2:  // Fill up remainder with nil.[m
[31m-    |  mov dword [RA+4], LJ_TNIL[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, RB[m
[31m-    |  jb <2[m
[31m-    |3:[m
[31m-    |  mov KBASE, TMP1[m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |5:  // Copy all varargs.[m
[31m-    |  mov MULTRES, 1			// MULTRES = 0+1[m
[31m-    |  mov RC, BASE[m
[31m-    |  sub RC, KBASE[m
[31m-    |  jbe <3				// No vararg slots?[m
[31m-    |  mov RB, RC[m
[31m-    |  shr RB, 3[m
[31m-    |  add RB, 1[m
[31m-    |  mov MULTRES, RB			// MULTRES = #varargs+1[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  add RC, RA[m
[31m-    |  cmp RC, L:RB->maxstack[m
[31m-    |  ja >7				// Need to grow stack?[m
[31m-    |6:  // Copy all vararg slots.[m
[31m-    |.if X64[m
[31m-    |  mov RCa, [KBASE-8][m
[31m-    |  add KBASE, 8[m
[31m-    |  mov [RA], RCa[m
[31m-    |.else[m
[31m-    |  mov RC, [KBASE-8][m
[31m-    |  mov [RA], RC[m
[31m-    |  mov RC, [KBASE-4][m
[31m-    |  add KBASE, 8[m
[31m-    |  mov [RA+4], RC[m
[31m-    |.endif[m
[31m-    |  add RA, 8[m
[31m-    |  cmp KBASE, BASE			// No more vararg slots?[m
[31m-    |  jb <6[m
[31m-    |  jmp <3[m
[31m-    |[m
[31m-    |7:  // Grow stack for varargs.[m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  mov L:RB->top, RA[m
[31m-    |  mov SAVE_PC, PC[m
[31m-    |  sub KBASE, BASE			// Need delta, because BASE may change.[m
[31m-    |  mov FCARG2, MULTRES[m
[31m-    |  sub FCARG2, 1[m
[31m-    |  mov FCARG1, L:RB[m
[31m-    |  call extern lj_state_growstack@8	// (lua_State *L, int n)[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  mov RA, L:RB->top[m
[31m-    |  add KBASE, BASE[m
[31m-    |  jmp <6[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Returns ----------------------------------------------------------- */[m
[31m-[m
[31m-  case BC_RETM:[m
[31m-    |  ins_AD	// RA = results, RD = extra_nresults[m
[31m-    |  add RD, MULTRES			// MULTRES >=1, so RD >=1.[m
[31m-    |  // Fall through. Assumes BC_RET follows and ins_AD is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_RET: case BC_RET0: case BC_RET1:[m
[31m-    |  ins_AD	// RA = results, RD = nresults+1[m
[31m-    if (op != BC_RET0) {[m
[31m-      |  shl RA, 3[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  mov PC, [BASE-4][m
[31m-    |  mov MULTRES, RD			// Save nresults+1.[m
[31m-    |  test PC, FRAME_TYPE		// Check frame type marker.[m
[31m-    |  jnz >7				// Not returning to a fixarg Lua func?[m
[31m-    switch (op) {[m
[31m-    case BC_RET:[m
[31m-      |->BC_RET_Z:[m
[31m-      |  mov KBASE, BASE		// Use KBASE for result move.[m
[31m-      |  sub RD, 1[m
[31m-      |  jz >3[m
[31m-      |2:  // Move results down.[m
[31m-      |.if X64[m
[31m-      |  mov RBa, [KBASE+RA][m
[31m-      |  mov [KBASE-8], RBa[m
[31m-      |.else[m
[31m-      |  mov RB, [KBASE+RA][m
[31m-      |  mov [KBASE-8], RB[m
[31m-      |  mov RB, [KBASE+RA+4][m
[31m-      |  mov [KBASE-4], RB[m
[31m-      |.endif[m
[31m-      |  add KBASE, 8[m
[31m-      |  sub RD, 1[m
[31m-      |  jnz <2[m
[31m-      |3:[m
[31m-      |  mov RD, MULTRES		// Note: MULTRES may be >255.[m
[31m-      |  movzx RB, PC_RB		// So cannot compare with RDL![m
[31m-      |5:[m
[31m-      |  cmp RB, RD			// More results expected?[m
[31m-      |  ja >6[m
[31m-      break;[m
[31m-    case BC_RET1:[m
[31m-      |.if X64[m
[31m-      |  mov RBa, [BASE+RA][m
[31m-      |  mov [BASE-8], RBa[m
[31m-      |.else[m
[31m-      |  mov RB, [BASE+RA+4][m
[31m-      |  mov [BASE-4], RB[m
[31m-      |  mov RB, [BASE+RA][m
[31m-      |  mov [BASE-8], RB[m
[31m-      |.endif[m
[31m-      /* fallthrough */[m
[31m-    case BC_RET0:[m
[31m-      |5:[m
[31m-      |  cmp PC_RB, RDL			// More results expected?[m
[31m-      |  ja >6[m
[31m-    default:[m
[31m-      break;[m
[31m-    }[m
[31m-    |  movzx RA, PC_RA[m
[31m-    |  not RAa				// Note: ~RA = -(RA+1)[m
[31m-    |  lea BASE, [BASE+RA*8]		// base = base - (RA+1)*8[m
[31m-    |  mov LFUNC:KBASE, [BASE-8][m
[31m-    |  mov KBASE, LFUNC:KBASE->pc[m
[31m-    |  mov KBASE, [KBASE+PC2PROTO(k)][m
[31m-    |  ins_next[m
[31m-    |[m
[31m-    |6:  // Fill up results with nil.[m
[31m-    if (op == BC_RET) {[m
[31m-      |  mov dword [KBASE-4], LJ_TNIL	// Note: relies on shifted base.[m
[31m-      |  add KBASE, 8[m
[31m-    } else {[m
[31m-      |  mov dword [BASE+RD*8-12], LJ_TNIL[m
[31m-    }[m
[31m-    |  add RD, 1[m
[31m-    |  jmp <5[m
[31m-    |[m
[31m-    |7:  // Non-standard return case.[m
[31m-    |  lea RB, [PC-FRAME_VARG][m
[31m-    |  test RB, FRAME_TYPEP[m
[31m-    |  jnz ->vm_return[m
[31m-    |  // Return from vararg function: relocate BASE down and RA up.[m
[31m-    |  sub BASE, RB[m
[31m-    if (op != BC_RET0) {[m
[31m-      |  add RA, RB[m
[31m-    }[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Loops and branches ------------------------------------------------ */[m
[31m-[m
[31m-  |.define FOR_IDX,  [RA];    .define FOR_TIDX,  dword [RA+4][m
[31m-  |.define FOR_STOP, [RA+8];  .define FOR_TSTOP, dword [RA+12][m
[31m-  |.define FOR_STEP, [RA+16]; .define FOR_TSTEP, dword [RA+20][m
[31m-  |.define FOR_EXT,  [RA+24]; .define FOR_TEXT,  dword [RA+28][m
[31m-[m
[31m-  case BC_FORL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop RB[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_IFORL follows and ins_AJ is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFORI:[m
[31m-  case BC_JFORL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_FORI:[m
[31m-  case BC_IFORL:[m
[31m-    vk = (op == BC_IFORL || op == BC_JFORL);[m
[31m-    |  ins_AJ	// RA = base, RD = target (after end of loop or start of loop)[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    if (LJ_DUALNUM) {[m
[31m-      |  cmp FOR_TIDX, LJ_TISNUM; jne >9[m
[31m-      if (!vk) {[m
[31m-	|  cmp FOR_TSTOP, LJ_TISNUM; jne ->vmeta_for[m
[31m-	|  cmp FOR_TSTEP, LJ_TISNUM; jne ->vmeta_for[m
[31m-	|  mov RB, dword FOR_IDX[m
[31m-	|  cmp dword FOR_STEP, 0; jl >5[m
[31m-      } else {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-	|  cmp FOR_TSTOP, LJ_TISNUM; jne ->assert_bad_for_arg_type[m
[31m-	|  cmp FOR_TSTEP, LJ_TISNUM; jne ->assert_bad_for_arg_type[m
[31m-#endif[m
[31m-	|  mov RB, dword FOR_STEP[m
[31m-	|  test RB, RB; js >5[m
[31m-	|  add RB, dword FOR_IDX; jo >1[m
[31m-	|  mov dword FOR_IDX, RB[m
[31m-      }[m
[31m-      |  cmp RB, dword FOR_STOP[m
[31m-      |  mov FOR_TEXT, LJ_TISNUM[m
[31m-      |  mov dword FOR_EXT, RB[m
[31m-      if (op == BC_FORI) {[m
[31m-	|  jle >7[m
[31m-	|1:[m
[31m-	|6:[m
[31m-	|  branchPC RD[m
[31m-      } else if (op == BC_JFORI) {[m
[31m-	|  branchPC RD[m
[31m-	|  movzx RD, PC_RD[m
[31m-	|  jle =>BC_JLOOP[m
[31m-	|1:[m
[31m-	|6:[m
[31m-      } else if (op == BC_IFORL) {[m
[31m-	|  jg >7[m
[31m-	|6:[m
[31m-	|  branchPC RD[m
[31m-	|1:[m
[31m-      } else {[m
[31m-	|  jle =>BC_JLOOP[m
[31m-	|1:[m
[31m-	|6:[m
[31m-      }[m
[31m-      |7:[m
[31m-      |  ins_next[m
[31m-      |[m
[31m-      |5:  // Invert check for negative step.[m
[31m-      if (vk) {[m
[31m-	|  add RB, dword FOR_IDX; jo <1[m
[31m-	|  mov dword FOR_IDX, RB[m
[31m-      }[m
[31m-      |  cmp RB, dword FOR_STOP[m
[31m-      |  mov FOR_TEXT, LJ_TISNUM[m
[31m-      |  mov dword FOR_EXT, RB[m
[31m-      if (op == BC_FORI) {[m
[31m-	|  jge <7[m
[31m-      } else if (op == BC_JFORI) {[m
[31m-	|  branchPC RD[m
[31m-	|  movzx RD, PC_RD[m
[31m-	|  jge =>BC_JLOOP[m
[31m-      } else if (op == BC_IFORL) {[m
[31m-	|  jl <7[m
[31m-      } else {[m
[31m-	|  jge =>BC_JLOOP[m
[31m-      }[m
[31m-      |  jmp <6[m
[31m-      |9:  // Fallback to FP variant.[m
[31m-    } else if (!vk) {[m
[31m-      |  cmp FOR_TIDX, LJ_TISNUM[m
[31m-    }[m
[31m-    if (!vk) {[m
[31m-      |  jae ->vmeta_for[m
[31m-      |  cmp FOR_TSTOP, LJ_TISNUM; jae ->vmeta_for[m
[31m-    } else {[m
[31m-#ifdef LUA_USE_ASSERT[m
[31m-      |  cmp FOR_TSTOP, LJ_TISNUM; jae ->assert_bad_for_arg_type[m
[31m-      |  cmp FOR_TSTEP, LJ_TISNUM; jae ->assert_bad_for_arg_type[m
[31m-#endif[m
[31m-    }[m
[31m-    |  mov RB, FOR_TSTEP		// Load type/hiword of for step.[m
[31m-    if (!vk) {[m
[31m-      |  cmp RB, LJ_TISNUM; jae ->vmeta_for[m
[31m-    }[m
[31m-    |  movsd xmm0, qword FOR_IDX[m
[31m-    |  movsd xmm1, qword FOR_STOP[m
[31m-    if (vk) {[m
[31m-      |  addsd xmm0, qword FOR_STEP[m
[31m-      |  movsd qword FOR_IDX, xmm0[m
[31m-      |  test RB, RB; js >3[m
[31m-    } else {[m
[31m-      |  jl >3[m
[31m-    }[m
[31m-    |  ucomisd xmm1, xmm0[m
[31m-    |1:[m
[31m-    |  movsd qword FOR_EXT, xmm0[m
[31m-    if (op == BC_FORI) {[m
[31m-      |.if DUALNUM[m
[31m-      |  jnb <7[m
[31m-      |.else[m
[31m-      |  jnb >2[m
[31m-      |  branchPC RD[m
[31m-      |.endif[m
[31m-    } else if (op == BC_JFORI) {[m
[31m-      |  branchPC RD[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  jnb =>BC_JLOOP[m
[31m-    } else if (op == BC_IFORL) {[m
[31m-      |.if DUALNUM[m
[31m-      |  jb <7[m
[31m-      |.else[m
[31m-      |  jb >2[m
[31m-      |  branchPC RD[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |  jnb =>BC_JLOOP[m
[31m-    }[m
[31m-    |.if DUALNUM[m
[31m-    |  jmp <6[m
[31m-    |.else[m
[31m-    |2:[m
[31m-    |  ins_next[m
[31m-    |.endif[m
[31m-    |[m
[31m-    |3:  // Invert comparison if step is negative.[m
[31m-    |  ucomisd xmm0, xmm1[m
[31m-    |  jmp <1[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ITERL:[m
[31m-    |.if JIT[m
[31m-    |  hotloop RB[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_IITERL follows and ins_AJ is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JITERL:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IITERL:[m
[31m-    |  ins_AJ	// RA = base, RD = target[m
[31m-    |  lea RA, [BASE+RA*8][m
[31m-    |  mov RB, [RA+4][m
[31m-    |  cmp RB, LJ_TNIL; je >1		// Stop if iterator returned nil.[m
[31m-    if (op == BC_JITERL) {[m
[31m-      |  mov [RA-4], RB[m
[31m-      |  mov RB, [RA][m
[31m-      |  mov [RA-8], RB[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  branchPC RD			// Otherwise save control var + branch.[m
[31m-      |  mov RD, [RA][m
[31m-      |  mov [RA-4], RB[m
[31m-      |  mov [RA-8], RD[m
[31m-    }[m
[31m-    |1:[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_LOOP:[m
[31m-    |  ins_A	// RA = base, RD = target (loop extent)[m
[31m-    |  // Note: RA/RD is only used by trace recorder to determine scope/extent[m
[31m-    |  // This opcode does NOT jump, it's only purpose is to detect a hot loop.[m
[31m-    |.if JIT[m
[31m-    |  hotloop RB[m
[31m-    |.endif[m
[31m-    | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_ILOOP:[m
[31m-    |  ins_A	// RA = base, RD = target (loop extent)[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JLOOP:[m
[31m-    |.if JIT[m
[31m-    |  ins_AD	// RA = base (ignored), RD = traceno[m
[31m-#ifdef LUA_USE_TRACE_LOGS[m
[31m-    |.if X64[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov L:RB->base, BASE  // Save BASE[m
[31m-    |  mov TMP1, RD     // Save RD[m
[31m-    |  mov CARG3d, PC  // CARG3d == BASE[m
[31m-    |  mov FCARG2, RD[m
[31m-    |  mov FCARG1, RB[m
[31m-    |  call extern lj_log_trace_entry@8[m
[31m-    |  mov RD, TMP1[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |.endif[m
[31m-#endif[m
[31m-    |  mov RA, [DISPATCH+DISPATCH_J(trace)][m
[31m-    |  mov TRACE:RD, [RA+RD*4][m
[31m-    |  mov RDa, TRACE:RD->mcode[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(jit_base)], BASE[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(tmpbuf.L)], L:RB[m
[31m-    |  // Save additional callee-save registers only used in compiled code.[m
[31m-    |.if X64WIN[m
[31m-    |  mov TMPQ, r12[m
[31m-    |  mov TMPa, r13[m
[31m-    |  mov CSAVE_4, r14[m
[31m-    |  mov CSAVE_3, r15[m
[31m-    |  mov RAa, rsp[m
[31m-    |  sub rsp, 9*16+4*8[m
[31m-    |  movdqa [RAa], xmm6[m
[31m-    |  movdqa [RAa-1*16], xmm7[m
[31m-    |  movdqa [RAa-2*16], xmm8[m
[31m-    |  movdqa [RAa-3*16], xmm9[m
[31m-    |  movdqa [RAa-4*16], xmm10[m
[31m-    |  movdqa [RAa-5*16], xmm11[m
[31m-    |  movdqa [RAa-6*16], xmm12[m
[31m-    |  movdqa [RAa-7*16], xmm13[m
[31m-    |  movdqa [RAa-8*16], xmm14[m
[31m-    |  movdqa [RAa-9*16], xmm15[m
[31m-    |.elif X64[m
[31m-    |  mov TMPQ, r12[m
[31m-    |  mov TMPa, r13[m
[31m-    |  sub rsp, 16[m
[31m-    |.endif[m
[31m-    |  jmp RDa[m
[31m-    |.endif[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JMP:[m
[31m-    |  ins_AJ	// RA = unused, RD = target[m
[31m-    |  branchPC RD[m
[31m-    |  ins_next[m
[31m-    break;[m
[31m-[m
[31m-  /* -- Function headers -------------------------------------------------- */[m
[31m-[m
[31m-   /*[m
[31m-   ** Reminder: A function may be called with func/args above L->maxstack,[m
[31m-   ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot,[m
[31m-   ** too. This means all FUNC* ops (including fast functions) must check[m
[31m-   ** for stack overflow _before_ adding more slots![m
[31m-   */[m
[31m-[m
[31m-  case BC_FUNCF:[m
[31m-    |.if JIT[m
[31m-    |  hotcall RB[m
[31m-    |.endif[m
[31m-  case BC_FUNCV:  /* NYI: compiled vararg functions. */[m
[31m-    | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op.[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCF:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-  case BC_IFUNCF:[m
[31m-    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[31m-    |  mov KBASE, [PC-4+PC2PROTO(k)][m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RA, [BASE+RA*8]		// Top of frame.[m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  ja ->vm_growstack_f[m
[31m-    |  movzx RA, byte [PC-4+PC2PROTO(numparams)][m
[31m-    |  cmp NARGS:RD, RA			// Check for missing parameters.[m
[31m-    |  jbe >3[m
[31m-    |2:[m
[31m-    if (op == BC_JFUNCF) {[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  mov dword [BASE+NARGS:RD*8-4], LJ_TNIL[m
[31m-    |  add NARGS:RD, 1[m
[31m-    |  cmp NARGS:RD, RA[m
[31m-    |  jbe <3[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_JFUNCV:[m
[31m-#if !LJ_HASJIT[m
[31m-    break;[m
[31m-#endif[m
[31m-    | int3  // NYI: compiled vararg functions[m
[31m-    break;  /* NYI: compiled vararg functions. */[m
[31m-[m
[31m-  case BC_IFUNCV:[m
[31m-    |  ins_AD  // BASE = new base, RA = framesize, RD = nargs+1[m
[31m-    |  lea RB, [NARGS:RD*8+FRAME_VARG][m
[31m-    |  lea RD, [BASE+NARGS:RD*8][m
[31m-    |  mov LFUNC:KBASE, [BASE-8][m
[31m-    |  mov [RD-4], RB			// Store delta + FRAME_VARG.[m
[31m-    |  mov [RD-8], LFUNC:KBASE		// Store copy of LFUNC.[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RA, [RD+RA*8][m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  ja ->vm_growstack_v		// Need to grow stack.[m
[31m-    |  mov RA, BASE[m
[31m-    |  mov BASE, RD[m
[31m-    |  movzx RB, byte [PC-4+PC2PROTO(numparams)][m
[31m-    |  test RB, RB[m
[31m-    |  jz >2[m
[31m-    |1:  // Copy fixarg slots up to new frame.[m
[31m-    |  add RA, 8[m
[31m-    |  cmp RA, BASE[m
[31m-    |  jnb >3				// Less args than parameters?[m
[31m-    |  mov KBASE, [RA-8][m
[31m-    |  mov [RD], KBASE[m
[31m-    |  mov KBASE, [RA-4][m
[31m-    |  mov [RD+4], KBASE[m
[31m-    |  add RD, 8[m
[31m-    |  mov dword [RA-4], LJ_TNIL	// Clear old fixarg slot (help the GC).[m
[31m-    |  sub RB, 1[m
[31m-    |  jnz <1[m
[31m-    |2:[m
[31m-    if (op == BC_JFUNCV) {[m
[31m-      |  movzx RD, PC_RD[m
[31m-      |  jmp =>BC_JLOOP[m
[31m-    } else {[m
[31m-      |  mov KBASE, [PC-4+PC2PROTO(k)][m
[31m-      |  ins_next[m
[31m-    }[m
[31m-    |[m
[31m-    |3:  // Clear missing parameters.[m
[31m-    |  mov dword [RD+4], LJ_TNIL[m
[31m-    |  add RD, 8[m
[31m-    |  sub RB, 1[m
[31m-    |  jnz <3[m
[31m-    |  jmp <2[m
[31m-    break;[m
[31m-[m
[31m-  case BC_FUNCC:[m
[31m-  case BC_FUNCCW:[m
[31m-    |  ins_AD  // BASE = new base, RA = ins RA|RD (unused), RD = nargs+1[m
[31m-    |  mov CFUNC:RB, [BASE-8][m
[31m-    |  mov KBASEa, CFUNC:RB->f[m
[31m-    |  mov L:RB, SAVE_L[m
[31m-    |  lea RD, [BASE+NARGS:RD*8-8][m
[31m-    |  mov L:RB->base, BASE[m
[31m-    |  lea RA, [RD+8*LUA_MINSTACK][m
[31m-    |  cmp RA, L:RB->maxstack[m
[31m-    |  mov L:RB->top, RD[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |.if X64[m
[31m-      |  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[31m-      |.else[m
[31m-      |  mov ARG1, L:RB[m
[31m-      |.endif[m
[31m-    } else {[m
[31m-      |.if X64[m
[31m-      |  mov CARG2, KBASEa[m
[31m-      |  mov CARG1d, L:RB			// Caveat: CARG1d may be RA.[m
[31m-      |.else[m
[31m-      |  mov ARG2, KBASEa[m
[31m-      |  mov ARG1, L:RB[m
[31m-      |.endif[m
[31m-    }[m
[31m-    |  ja ->vm_growstack_c		// Need to grow stack.[m
[31m-    |  set_vmstate C[m
[31m-    if (op == BC_FUNCC) {[m
[31m-      |  call KBASEa			// (lua_State *L)[m
[31m-    } else {[m
[31m-      |  // (lua_State *L, lua_CFunction f)[m
[31m-      |  call aword [DISPATCH+DISPATCH_GL(wrapf)][m
[31m-    }[m
[31m-    |  // nresults returned in eax (RD).[m
[31m-    |  mov BASE, L:RB->base[m
[31m-    |  mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB[m
[31m-    |  set_vmstate INTERP[m
[31m-    |  lea RA, [BASE+RD*8][m
[31m-    |  neg RA[m
[31m-    |  add RA, L:RB->top		// RA = (L->top-(L->base+nresults))*8[m
[31m-    |  mov PC, [BASE-4]			// Fetch PC of caller.[m
[31m-    |  jmp ->vm_returnc[m
[31m-    break;[m
[31m-[m
[31m-  /* ---------------------------------------------------------------------- */[m
[31m-[m
[31m-  default:[m
[31m-    fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]);[m
[31m-    exit(2);[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-static int build_backend(BuildCtx *ctx)[m
[31m-{[m
[31m-  int op;[m
[31m-  dasm_growpc(Dst, BC__MAX);[m
[31m-  build_subroutines(ctx);[m
[31m-  |.code_op[m
[31m-  for (op = 0; op < BC__MAX; op++)[m
[31m-    build_ins(ctx, (BCOp)op, op);[m
[31m-  return BC__MAX;[m
[31m-}[m
[31m-[m
[31m-/* Emit pseudo frame-info for all assembler functions. */[m
[31m-static void emit_asm_debug(BuildCtx *ctx)[m
[31m-{[m
[31m-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);[m
[31m-#if LJ_64[m
[31m-#define SZPTR	"8"[m
[31m-#define BSZPTR	"3"[m
[31m-#define REG_SP	"0x7"[m
[31m-#define REG_RA	"0x10"[m
[31m-#else[m
[31m-#define SZPTR	"4"[m
[31m-#define BSZPTR	"2"[m
[31m-#define REG_SP	"0x4"[m
[31m-#define REG_RA	"0x8"[m
[31m-#endif[m
[31m-  switch (ctx->mode) {[m
[31m-  case BUILD_elfasm:[m
[31m-    fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe0:\n"[m
[31m-	"\t.long .LECIE0-.LSCIE0\n"[m
[31m-	".LSCIE0:\n"[m
[31m-	"\t.long 0xffffffff\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -" SZPTR "\n"[m
[31m-	"\t.byte " REG_RA "\n"[m
[31m-	"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[31m-	"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LECIE0:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE0:\n"[m
[31m-	"\t.long .LEFDE0-.LASFDE0\n"[m
[31m-	".LASFDE0:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-#if LJ_64[m
[31m-	"\t.quad .Lbegin\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[31m-#if LJ_NO_UNWIND[m
[31m-	"\t.byte 0x8d\n\t.uleb128 0x6\n"	/* offset r13 */[m
[31m-	"\t.byte 0x8c\n\t.uleb128 0x7\n"	/* offset r12 */[m
[31m-#endif[m
[31m-#else[m
[31m-	"\t.long .Lbegin\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[31m-	"\t.byte 0x87\n\t.uleb128 0x3\n"	/* offset edi */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x4\n"	/* offset esi */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x5\n"	/* offset ebx */[m
[31m-#endif[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LEFDE0:\n\n", fcofs, CFRAME_SIZE);[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE1:\n"[m
[31m-	"\t.long .LEFDE1-.LASFDE1\n"[m
[31m-	".LASFDE1:\n"[m
[31m-	"\t.long .Lframe0\n"[m
[31m-#if LJ_64[m
[31m-	"\t.quad lj_vm_ffi_call\n"[m
[31m-	"\t.quad %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-#else[m
[31m-	"\t.long lj_vm_ffi_call\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.byte 0xe\n\t.uleb128 8\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x5\n"		/* def_cfa_register ebp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset ebx */[m
[31m-#endif[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#if !LJ_NO_UNWIND[m
[31m-#if (defined(__sun__) && defined(__svr4__))[m
[31m-#if LJ_64[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n");[m
[31m-#else[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");[m
[31m-#endif[m
[31m-#else[m
[31m-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");[m
[31m-#endif[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe1:\n"[m
[31m-	"\t.long .LECIE1-.LSCIE1\n"[m
[31m-	".LSCIE1:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zPR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -" SZPTR "\n"[m
[31m-	"\t.byte " REG_RA "\n"[m
[31m-	"\t.uleb128 6\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.long lj_err_unwind_dwarf-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[31m-	"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LECIE1:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE2:\n"[m
[31m-	"\t.long .LEFDE2-.LASFDE2\n"[m
[31m-	".LASFDE2:\n"[m
[31m-	"\t.long .LASFDE2-.Lframe1\n"[m
[31m-	"\t.long .Lbegin-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* def_cfa_offset */[m
[31m-#if LJ_64[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-	"\t.byte 0x8f\n\t.uleb128 0x4\n"	/* offset r15 */[m
[31m-	"\t.byte 0x8e\n\t.uleb128 0x5\n"	/* offset r14 */[m
[31m-#else[m
[31m-	"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[31m-	"\t.byte 0x87\n\t.uleb128 0x3\n"	/* offset edi */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x4\n"	/* offset esi */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x5\n"	/* offset ebx */[m
[31m-#endif[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LEFDE2:\n\n", fcofs, CFRAME_SIZE);[m
[31m-#if LJ_HASFFI[m
[31m-    fprintf(ctx->fp,[m
[31m-	".Lframe2:\n"[m
[31m-	"\t.long .LECIE2-.LSCIE2\n"[m
[31m-	".LSCIE2:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.string \"zR\"\n"[m
[31m-	"\t.uleb128 0x1\n"[m
[31m-	"\t.sleb128 -" SZPTR "\n"[m
[31m-	"\t.byte " REG_RA "\n"[m
[31m-	"\t.uleb128 1\n"			/* augmentation length */[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"[m
[31m-	"\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LECIE2:\n\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	".LSFDE3:\n"[m
[31m-	"\t.long .LEFDE3-.LASFDE3\n"[m
[31m-	".LASFDE3:\n"[m
[31m-	"\t.long .LASFDE3-.Lframe2\n"[m
[31m-	"\t.long lj_vm_ffi_call-.\n"[m
[31m-	"\t.long %d\n"[m
[31m-	"\t.uleb128 0\n"			/* augmentation length */[m
[31m-#if LJ_64[m
[31m-	"\t.byte 0xe\n\t.uleb128 16\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x86\n\t.uleb128 0x2\n"	/* offset rbp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x6\n"		/* def_cfa_register rbp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset rbx */[m
[31m-#else[m
[31m-	"\t.byte 0xe\n\t.uleb128 8\n"		/* def_cfa_offset */[m
[31m-	"\t.byte 0x85\n\t.uleb128 0x2\n"	/* offset ebp */[m
[31m-	"\t.byte 0xd\n\t.uleb128 0x5\n"		/* def_cfa_register ebp */[m
[31m-	"\t.byte 0x83\n\t.uleb128 0x3\n"	/* offset ebx */[m
[31m-#endif[m
[31m-	"\t.align " SZPTR "\n"[m
[31m-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs);[m
[31m-#endif[m
[31m-#endif[m
[31m-    break;[m
[31m-#if !LJ_NO_UNWIND[m
[31m-  /* Mental note: never let Apple design an assembler.[m
[31m-  ** Or a linker. Or a plastic case. But I digress.[m
[31m-  */[m
[31m-  case BUILD_machasm: {[m
[31m-#if LJ_HASFFI[m
[31m-    int fcsize = 0;[m
[31m-#endif[m
[31m-    int i;[m
[31m-    fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");[m
[31m-    fprintf(ctx->fp,[m
[31m-	"EH_frame1:\n"[m
[31m-	"\t.set L$set$x,LECIEX-LSCIEX\n"[m
[31m-	"\t.long L$set$x\n"[m
[31m-	"LSCIEX:\n"[m
[31m-	"\t.long 0\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.ascii \"zPR\\0\"\n"[m
[31m-	"\t.byte 0x1\n"[m
[31m-	"\t.byte 128-" SZPTR "\n"[m
[31m-	"\t.byte " REG_RA "\n"[m
[31m-	"\t.byte 6\n"				/* augmentation length */[m
[31m-	"\t.byte 0x9b\n"			/* indirect|pcrel|sdata4 */[m
[31m-#if LJ_64[m
[31m-	"\t.long _lj_err_unwind_dwarf+4@GOTPCREL\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"[m
[31m-#else[m
[31m-	"\t.long L_lj_err_unwind_dwarf$non_lazy_ptr-.\n"[m
[31m-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	"\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH-O. */[m
[31m-#endif[m
[31m-	"\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"[m
[31m-	"\t.align " BSZPTR "\n"[m
[31m-	"LECIEX:\n\n");[m
[31m-    for (i = 0; i < ctx->nsym; i++) {[m
[31m-      const char *name = ctx->sym[i].name;[m
[31m-      int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;[m
[31m-      if (size == 0) continue;[m
[31m-#if LJ_HASFFI[m
[31m-      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }[m
[31m-#endif[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "%s.eh:\n"[m
[31m-	  "LSFDE%d:\n"[m
[31m-	  "\t.set L$set$%d,LEFDE%d-LASFDE%d\n"[m
[31m-	  "\t.long L$set$%d\n"[m
[31m-	  "LASFDE%d:\n"[m
[31m-	  "\t.long LASFDE%d-EH_frame1\n"[m
[31m-	  "\t.long %s-.\n"[m
[31m-	  "\t.long %d\n"[m
[31m-	  "\t.byte 0\n"				/* augmentation length */[m
[31m-	  "\t.byte 0xe\n\t.byte %d\n"		/* def_cfa_offset */[m
[31m-#if LJ_64[m
[31m-	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[31m-	  "\t.byte 0x8f\n\t.byte 0x4\n"		/* offset r15 */[m
[31m-	  "\t.byte 0x8e\n\t.byte 0x5\n"		/* offset r14 */[m
[31m-#else[m
[31m-	  "\t.byte 0x84\n\t.byte 0x2\n"		/* offset ebp (4 for MACH-O)*/[m
[31m-	  "\t.byte 0x87\n\t.byte 0x3\n"		/* offset edi */[m
[31m-	  "\t.byte 0x86\n\t.byte 0x4\n"		/* offset esi */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x5\n"		/* offset ebx */[m
[31m-#endif[m
[31m-	  "\t.align " BSZPTR "\n"[m
[31m-	  "LEFDE%d:\n\n",[m
[31m-	  name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);[m
[31m-    }[m
[31m-#if LJ_HASFFI[m
[31m-    if (fcsize) {[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "EH_frame2:\n"[m
[31m-	  "\t.set L$set$y,LECIEY-LSCIEY\n"[m
[31m-	  "\t.long L$set$y\n"[m
[31m-	  "LSCIEY:\n"[m
[31m-	  "\t.long 0\n"[m
[31m-	  "\t.byte 0x1\n"[m
[31m-	  "\t.ascii \"zR\\0\"\n"[m
[31m-	  "\t.byte 0x1\n"[m
[31m-	  "\t.byte 128-" SZPTR "\n"[m
[31m-	  "\t.byte " REG_RA "\n"[m
[31m-	  "\t.byte 1\n"				/* augmentation length */[m
[31m-#if LJ_64[m
[31m-	  "\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	  "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"[m
[31m-#else[m
[31m-	  "\t.byte 0x1b\n"			/* pcrel|sdata4 */[m
[31m-	  "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH. */[m
[31m-#endif[m
[31m-	  "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"[m
[31m-	  "\t.align " BSZPTR "\n"[m
[31m-	  "LECIEY:\n\n");[m
[31m-      fprintf(ctx->fp,[m
[31m-	  "_lj_vm_ffi_call.eh:\n"[m
[31m-	  "LSFDEY:\n"[m
[31m-	  "\t.set L$set$yy,LEFDEY-LASFDEY\n"[m
[31m-	  "\t.long L$set$yy\n"[m
[31m-	  "LASFDEY:\n"[m
[31m-	  "\t.long LASFDEY-EH_frame2\n"[m
[31m-	  "\t.long _lj_vm_ffi_call-.\n"[m
[31m-	  "\t.long %d\n"[m
[31m-	  "\t.byte 0\n"				/* augmentation length */[m
[31m-#if LJ_64[m
[31m-	  "\t.byte 0xe\n\t.byte 16\n"		/* def_cfa_offset */[m
[31m-	  "\t.byte 0x86\n\t.byte 0x2\n"		/* offset rbp */[m
[31m-	  "\t.byte 0xd\n\t.byte 0x6\n"		/* def_cfa_register rbp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset rbx */[m
[31m-#else[m
[31m-	  "\t.byte 0xe\n\t.byte 8\n"		/* def_cfa_offset */[m
[31m-	  "\t.byte 0x84\n\t.byte 0x2\n"		/* offset ebp (4 for MACH-O)*/[m
[31m-	  "\t.byte 0xd\n\t.byte 0x4\n"		/* def_cfa_register ebp */[m
[31m-	  "\t.byte 0x83\n\t.byte 0x3\n"		/* offset ebx */[m
[31m-#endif[m
[31m-	  "\t.align " BSZPTR "\n"[m
[31m-	  "LEFDEY:\n\n", fcsize);[m
[31m-    }[m
[31m-#endif[m
[31m-#if !LJ_64[m
[31m-    fprintf(ctx->fp,[m
[31m-      "\t.non_lazy_symbol_pointer\n"[m
[31m-      "L_lj_err_unwind_dwarf$non_lazy_ptr:\n"[m
[31m-      ".indirect_symbol _lj_err_unwind_dwarf\n"[m
[31m-      ".long 0\n\n");[m
[31m-    fprintf(ctx->fp, "\t.section __IMPORT,__jump_table,symbol_stubs,pure_instructions+self_modifying_code,5\n");[m
[31m-    {[m
[31m-      const char *const *xn;[m
[31m-      for (xn = ctx->extnames; *xn; xn++)[m
[31m-	if (strncmp(*xn, LABEL_PREFIX, sizeof(LABEL_PREFIX)-1))[m
[31m-	  fprintf(ctx->fp, "L_%s$stub:\n\t.indirect_symbol _%s\n\t.ascii \"\\364\\364\\364\\364\\364\"\n", *xn, *xn);[m
[31m-    }[m
[31m-#endif[m
[31m-    fprintf(ctx->fp, ".subsections_via_symbols\n");[m
[31m-    }[m
[31m-    break;[m
[31m-#endif[m
[31m-  default:  /* Difficult for other modes. */[m
[31m-    break;[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/xb1build.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/xb1build.bat[m
[1mdeleted file mode 100644[m
[1mindex 847e84a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/xb1build.bat[m
[1m+++ /dev/null[m
[36m@@ -1,101 +0,0 @@[m
[31m-@rem Script to build LuaJIT with the Xbox One SDK.[m
[31m-@rem Donated to the public domain.[m
[31m-@rem[m
[31m-@rem Open a "Visual Studio .NET Command Prompt" (64 bit host compiler)[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-@if not defined DurangoXDK goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@echo ---- Host compiler ----[m
[31m-@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE /DLUAJIT_ENABLE_GC64[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@rem Error out for 64 bit host compiler[m
[31m-@minilua[m
[31m-@if not errorlevel 8 goto :FAIL[m
[31m-[m
[31m-@set DASMFLAGS=-D WIN -D FFI -D P64[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x64.dasc[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% /D_DURANGO host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m peobj -o lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@echo ---- Cross compiler ----[m
[31m-[m
[31m-@set CWD=%cd%[m
[31m-@call "%DurangoXDK%\xdk\DurangoVars.cmd" XDK[m
[31m-@cd /D "%CWD%"[m
[31m-@shift[m
[31m-[m
[31m-@set LJCOMPILE="cl" /nologo /c /W3 /GF /Gm- /GR- /GS- /Gy /openmp- /D_CRT_SECURE_NO_DEPRECATE /D_LIB /D_UNICODE /D_DURANGO[m
[31m-@set LJLIB="lib" /nologo[m
[31m-[m
[31m-@if "%1"=="debug" ([m
[31m-  @shift[m
[31m-  @set LJCOMPILE=%LJCOMPILE% /Zi /MDd /Od[m
[31m-  @set LJLINK=%LJLINK% /debug [m
[31m-) else ([m
[31m-  @set LJCOMPILE=%LJCOMPILE% /MD /O2 /DNDEBUG[m
[31m-)[m
[31m-[m
[31m-@if "%1"=="amalg" goto :AMALG[m
[31m-%LJCOMPILE% /DLUA_BUILD_AS_DLL lj_*.c lib_*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:luajit.lib lj_*.obj lib_*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :NOAMALG[m
[31m-:AMALG[m
[31m-%LJCOMPILE% /DLUA_BUILD_AS_DLL ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:luajit.lib ljamalg.obj lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-:NOAMALG[m
[31m-[m
[31m-@del *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for Xbox One ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo To run this script you must open a "Visual Studio .NET Command Prompt"[m
[31m-@echo (64 bit host compiler). The Xbox One SDK must be installed, too.[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/xedkbuild.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/xedkbuild.bat[m
[1mdeleted file mode 100644[m
[1mindex 240ec87..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/LuaJIT-2.1-20160517/src/xedkbuild.bat[m
[1m+++ /dev/null[m
[36m@@ -1,92 +0,0 @@[m
[31m-@rem Script to build LuaJIT with the Xbox 360 SDK.[m
[31m-@rem Donated to the public domain.[m
[31m-@rem[m
[31m-@rem Open a "Visual Studio .NET Command Prompt" (32 bit host compiler)[m
[31m-@rem Then cd to this directory and run this script.[m
[31m-[m
[31m-@if not defined INCLUDE goto :FAIL[m
[31m-@if not defined XEDK goto :FAIL[m
[31m-[m
[31m-@setlocal[m
[31m-@rem ---- Host compiler ----[m
[31m-@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set LJLINK=link /nologo[m
[31m-@set LJMT=mt /nologo[m
[31m-@set DASMDIR=..\dynasm[m
[31m-@set DASM=%DASMDIR%\dynasm.lua[m
[31m-@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c[m
[31m-[m
[31m-%LJCOMPILE% host\minilua.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:minilua.exe minilua.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist minilua.exe.manifest^[m
[31m-  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe[m
[31m-[m
[31m-@rem Error out for 64 bit host compiler[m
[31m-@minilua[m
[31m-@if errorlevel 8 goto :FAIL[m
[31m-[m
[31m-@set DASMFLAGS=-D GPR64 -D FRAME32 -D PPE -D SQRT -D DUALNUM[m
[31m-minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_ppc.dasc[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-%LJCOMPILE% /I "." /I %DASMDIR% /D_XBOX_VER=200 /DLUAJIT_TARGET=LUAJIT_ARCH_PPC  host\buildvm*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLINK% /out:buildvm.exe buildvm*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-if exist buildvm.exe.manifest^[m
[31m-  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe[m
[31m-[m
[31m-buildvm -m peobj -o lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m libdef -o lj_libdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m recdef -o lj_recdef.h %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-buildvm -m folddef -o lj_folddef.h lj_opt_fold.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-[m
[31m-@rem ---- Cross compiler ----[m
[31m-@set LJCOMPILE="%XEDK%\bin\win32\cl" /nologo /c /MT /O2 /W3 /GF /Gm- /GR- /GS- /Gy /openmp- /D_CRT_SECURE_NO_DEPRECATE /DNDEBUG /D_XBOX /D_LIB /DLUAJIT_USE_SYSMALLOC[m
[31m-@set LJLIB="%XEDK%\bin\win32\lib" /nologo[m
[31m-@set "INCLUDE=%XEDK%\include\xbox"[m
[31m-[m
[31m-@if "%1" neq "debug" goto :NODEBUG[m
[31m-@shift[m
[31m-@set "LJCOMPILE=%LJCOMPILE% /Zi"[m
[31m-:NODEBUG[m
[31m-@if "%1"=="amalg" goto :AMALG[m
[31m-%LJCOMPILE% /DLUA_BUILD_AS_DLL lj_*.c lib_*.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:luajit20.lib lj_*.obj lib_*.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-@goto :NOAMALG[m
[31m-:AMALG[m
[31m-%LJCOMPILE% /DLUA_BUILD_AS_DLL ljamalg.c[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-%LJLIB% /OUT:luajit20.lib ljamalg.obj lj_vm.obj[m
[31m-@if errorlevel 1 goto :BAD[m
[31m-:NOAMALG[m
[31m-[m
[31m-@del *.obj *.manifest minilua.exe buildvm.exe[m
[31m-@echo.[m
[31m-@echo === Successfully built LuaJIT for Xbox 360 ===[m
[31m-[m
[31m-@goto :END[m
[31m-:BAD[m
[31m-@echo.[m
[31m-@echo *******************************************************[m
[31m-@echo *** Build FAILED -- Please check the error messages ***[m
[31m-@echo *******************************************************[m
[31m-@goto :END[m
[31m-:FAIL[m
[31m-@echo To run this script you must open a "Visual Studio .NET Command Prompt"[m
[31m-@echo (32 bit host compiler). The Xbox 360 SDK must be installed, too.[m
[31m-:END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex a88c6c8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-reindex[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-genmobi.sh[m
[31m-*.mobi[m
[31m-misc/chunked[m
[31m-ctags[m
[31m-src/module.c[m
[31m-src/util.c[m
[31m-src/util.h[m
[31m-all[m
[31m-go[m
[31m-build1[0-9][m
[31m-buildroot/[m
[31m-work/[m
[31m-Makefile[m
[31m-nginx[m
[31m-*.plist[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/config[m
[1mdeleted file mode 100644[m
[1mindex 7f5ec72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/config[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_array_var; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_array_var; please put it before ngx_array_var." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_array_var; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_array_var; please put it before ngx_array_var." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_array_var_module[m
[31m-[m
[31m-HTTP_ARRAY_VAR_SRCS="                                                       \[m
[31m-                    $ngx_addon_dir/src/ngx_http_array_var_module.c          \[m
[31m-                    $ngx_addon_dir/src/ngx_http_array_var_util.c            \[m
[31m-                    "[m
[31m-[m
[31m-HTTP_ARRAY_VAR_DEPS="                                                       \[m
[31m-                    $ngx_addon_dir/src/ddebug.h                             \[m
[31m-                    $ngx_addon_dir/src/ngx_http_array_var_util.h            \[m
[31m-                    "[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HTTP_ARRAY_VAR_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_ARRAY_VAR_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_ARRAY_VAR_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_ARRAY_VAR_DEPS"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 6f1f8be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,73 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "array_var *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_module.c[m
[1mdeleted file mode 100644[m
[1mindex 0b715b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,753 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_array_var_util.h"[m
[31m-#include <ndk.h>[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_array_it_key = ngx_string("array_it");[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t          nargs;[m
[31m-} ngx_http_array_split_data_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned                         in_place;[m
[31m-    ngx_http_complex_value_t        *template;[m
[31m-    ngx_int_t                        array_it_index;[m
[31m-} ngx_http_array_map_data_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned                         in_place;[m
[31m-} ngx_http_array_map_op_data_t;[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_array_split(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_array_map(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_array_map_op(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_array_join(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_array_var_split(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data);[m
[31m-static ngx_int_t ngx_http_array_var_map(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data);[m
[31m-static ngx_int_t ngx_http_array_var_map_op(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data);[m
[31m-static ngx_int_t ngx_http_array_var_join(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_array_var_commands[] = {[m
[31m-    {[m
[31m-        ngx_string ("array_split"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-        ngx_http_array_split,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("array_map"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                          |NGX_CONF_TAKE23,[m
[31m-        ngx_http_array_map,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("array_map_op"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                          |NGX_CONF_TAKE23,[m
[31m-        ngx_http_array_map_op,[m
[31m-        0,[m
[31m-        0,[m
[31m-        (void *) ngx_http_array_var_map_op[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("array_join"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-                          |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                          |NGX_CONF_TAKE23,[m
[31m-        ngx_http_array_join,[m
[31m-        0,[m
[31m-        0,[m
[31m-        (void *) ngx_http_array_var_join[m
[31m-    },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_array_var_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_array_var_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_array_var_module_ctx,          /* module context */[m
[31m-    ngx_http_array_var_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                         /* module type */[m
[31m-    NULL,                                    /* init master */[m
[31m-    NULL,                                    /* init module */[m
[31m-    NULL,                                    /* init process */[m
[31m-    NULL,                                    /* init thread */[m
[31m-    NULL,                                    /* exit thread */[m
[31m-    NULL,                                    /* exit process */[m
[31m-    NULL,                                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_array_split(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                    filter;[m
[31m-    ngx_str_t                        target;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_str_t                       *bad_arg;[m
[31m-    ngx_http_array_split_data_t     *data = NULL;[m
[31m-[m
[31m-    data = ngx_palloc(cf->pool, sizeof(ngx_http_array_split_data_t));[m
[31m-    if (data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-    filter.func = (void *) ngx_http_array_var_split;[m
[31m-    filter.data = data;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        dd("array_split $sep $var");[m
[31m-        data->nargs = filter.size = 2;[m
[31m-        target = value[2];[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* cf->args->nelts >= 3 + 1 */[m
[31m-[m
[31m-    if (value[3].len >= sizeof("to=") - 1[m
[31m-        && ngx_str3cmp(value[3].data, 't', 'o', '='))[m
[31m-    {[m
[31m-        dd("array_split $sep $str to=$array");[m
[31m-        data->nargs = filter.size = 2;[m
[31m-[m
[31m-        target.data = value[3].data + sizeof("to=") - 1;[m
[31m-        target.len = value[3].len - (sizeof("to=") - 1);[m
[31m-        dd("split target: %.*s", (int) target.len, target.data);[m
[31m-[m
[31m-        if (cf->args->nelts > 3 + 1) {[m
[31m-            bad_arg = &value[4];[m
[31m-            goto unexpected_arg;[m
[31m-        }[m
[31m-[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* the 3rd argument is max_items */[m
[31m-[m
[31m-    if (cf->args->nelts > 4 + 1) {[m
[31m-        bad_arg = &value[5];[m
[31m-        goto unexpected_arg;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 4 + 1) {[m
[31m-        /* array_split $sep $str $max to=$array */[m
[31m-[m
[31m-        if (value[4].len < sizeof("to=") - 1[m
[31m-            || ! (ngx_str3cmp(value[4].data, 't', 'o', '=')))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                               "%V: expecting the \"to\" option at the "[m
[31m-                    "4th argument: \"%V\"",[m
[31m-                    &cmd->name, &value[4]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        data->nargs = filter.size = 3;[m
[31m-[m
[31m-        target.data = value[4].data + sizeof("to=") - 1;[m
[31m-        target.len = value[4].len - (sizeof("to=") - 1);[m
[31m-[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* cf->args->nelts == 3 + 1 */[m
[31m-[m
[31m-    /* array_split $sep $var $max */[m
[31m-[m
[31m-    target = value[2];[m
[31m-    data->nargs = filter.size = 3;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-[m
[31m-unexpected_arg:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V: unexpected argument \"%V\"",[m
[31m-                       &cmd->name, bad_arg);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_array_map(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                        filter;[m
[31m-    ngx_str_t                            target;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_http_array_map_data_t           *data;[m
[31m-    ngx_http_compile_complex_value_t     ccv;[m
[31m-[m
[31m-    data = ngx_palloc(cf->pool, sizeof(ngx_http_array_map_data_t));[m
[31m-    if (data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    data->template = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-    if (data->template == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_memzero(data->template, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = data->template;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_VALUE_DATA;[m
[31m-    filter.func = (void *) ngx_http_array_var_map;[m
[31m-    filter.data = data;[m
[31m-    filter.size = 1;[m
[31m-[m
[31m-    data->array_it_index = ngx_http_array_var_add_variable(cf,[m
[31m-            &ngx_http_array_it_key);[m
[31m-[m
[31m-    if (data->array_it_index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        /* array_map $template $array */[m
[31m-        data->in_place = 1;[m
[31m-        target = value[2];[m
[31m-[m
[31m-    } else {[m
[31m-        /* cf->args->nelts == 3 + 1 */[m
[31m-[m
[31m-        if (value[3].len < sizeof("to=") - 1[m
[31m-            || ! (ngx_str3cmp(value[3].data, 't', 'o', '=')))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%V: expecting the \"to\" option at "[m
[31m-                               "the 3rd argument: \"%V\"",[m
[31m-                               &cmd->name, &value[3]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        target.data = value[3].data + sizeof("to=") - 1;[m
[31m-        target.len = value[3].len - (sizeof("to=") - 1);[m
[31m-        data->in_place = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_value_core(cf, &target, &value[2], &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_array_map_op(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_array_map_op_data_t    *data;[m
[31m-    ndk_set_var_t                    filter;[m
[31m-    ngx_str_t                        target;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_str_t                       *bad_arg;[m
[31m-[m
[31m-    data = ngx_palloc(cf->pool, sizeof(ngx_http_array_map_op_data_t));[m
[31m-    if (data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-    filter.func = cmd->post;[m
[31m-    filter.data = data;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        dd("array_join $sep $var");[m
[31m-[m
[31m-        filter.size = 2;[m
[31m-        data->in_place = 1;[m
[31m-[m
[31m-        target = value[2];[m
[31m-[m
[31m-        dd("array join target: %.*s", (int) target.len, target.data);[m
[31m-[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* cf->args->nelts == 3 + 1 */[m
[31m-[m
[31m-    if (value[3].len >= sizeof("to=") - 1[m
[31m-        && ngx_str3cmp(value[3].data, 't', 'o', '='))[m
[31m-    {[m
[31m-        /* array_join $sep $str to=$array */[m
[31m-        filter.size = 2;[m
[31m-        data->in_place = 0;[m
[31m-[m
[31m-        target.data = value[3].data + sizeof("to=") - 1;[m
[31m-        target.len = value[3].len - (sizeof("to=") - 1);[m
[31m-[m
[31m-        if (cf->args->nelts > 3 + 1) {[m
[31m-            bad_arg = &value[4];[m
[31m-[m
[31m-        } else {[m
[31m-            return ndk_set_var_multi_value_core(cf, &target, &value[1],[m
[31m-                                                &filter);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        bad_arg = &value[3];[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "%V: unexpected argument \"%V\"",[m
[31m-                       &cmd->name, bad_arg);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_array_join(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                    filter;[m
[31m-    ngx_str_t                        target;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_str_t                       *bad_arg;[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.func = cmd->post;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2 + 1) {[m
[31m-        dd("array_join $sep $var");[m
[31m-[m
[31m-        filter.size = 2;[m
[31m-        target = value[2];[m
[31m-[m
[31m-        dd("array join target: %.*s", (int) target.len, target.data);[m
[31m-[m
[31m-        return ndk_set_var_multi_value_core(cf, &target, &value[1], &filter);[m
[31m-    }[m
[31m-[m
[31m-    /* cf->args->nelts == 3 + 1 */[m
[31m-[m
[31m-    if (value[3].len >= sizeof("to=") - 1[m
[31m-        && ngx_str3cmp(value[3].data, 't', 'o', '='))[m
[31m-    {[m
[31m-        /* array_join $sep $str to=$array */[m
[31m-        filter.size = 2;[m
[31m-[m
[31m-        target.data = value[3].data + sizeof("to=") - 1;[m
[31m-        target.len = value[3].len - (sizeof("to=") - 1);[m
[31m-[m
[31m-        if (cf->args->nelts > 3 + 1) {[m
[31m-            bad_arg = &value[4];[m
[31m-        } else {[m
[31m-            return ndk_set_var_multi_value_core(cf, &target, &value[1],[m
[31m-                                                &filter);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        bad_arg = &value[3];[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "%V: unexpected argument \"%V\"",[m
[31m-                       &cmd->name, bad_arg);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_split(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    ngx_http_array_split_data_t             *conf = data;[m
[31m-    ngx_http_variable_value_t               *sep, *str;[m
[31m-    ngx_str_t                               *s;[m
[31m-    u_char                                  *pos, *end, *last = NULL;[m
[31m-    ssize_t                                  max, i, len = 4;[m
[31m-    ngx_array_t                             *array;[m
[31m-[m
[31m-    if (conf->nargs == 3) {[m
[31m-        max = ngx_atosz(v[2].data, v[2].len);[m
[31m-        if (max == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "array_split: invalid max items: \"%V\"",[m
[31m-                          &v[2]);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    } else {[m
[31m-        max = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (max) {[m
[31m-        len = max;[m
[31m-    }[m
[31m-[m
[31m-    array = ngx_array_create(r->pool, len, sizeof(ngx_str_t));[m
[31m-    if (array == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sep = &v[0];[m
[31m-    str = &v[1];[m
[31m-[m
[31m-    pos = str->data;[m
[31m-    end = str->data + str->len;[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    if (sep->len == 0) {[m
[31m-        /* split each char into an array elem */[m
[31m-[m
[31m-        while (i != max - 1 && pos < end - 1) {[m
[31m-            s = ngx_array_push(array);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            s->data = pos;[m
[31m-            s->len = 1;[m
[31m-[m
[31m-            pos++;[m
[31m-            i++;[m
[31m-        }[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    while (i != max - 1) {[m
[31m-        last = ngx_http_array_var_strlstrn(pos, end, sep->data,[m
[31m-                                           sep->len - 1);[m
[31m-        if (last == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        s = ngx_array_push(array);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        s->data = pos;[m
[31m-        s->len = last - pos;[m
[31m-[m
[31m-        dd("split item %.*s", (int) s->len, s->data);[m
[31m-[m
[31m-        pos = last + sep->len;[m
[31m-        i++;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    dd("pos %p, last %p, end %p", pos, last, end);[m
[31m-[m
[31m-    s = ngx_array_push(array);[m
[31m-    if (s == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->data = pos;[m
[31m-    s->len = end - pos;[m
[31m-[m
[31m-    dd("split item %.*s", (int) s->len, s->data);[m
[31m-[m
[31m-    dd("split: array size: %d", (int) array->nelts);[m
[31m-    dd("split array ptr: %p", array);[m
[31m-[m
[31m-    res->data = (u_char *) array;[m
[31m-    res->len = sizeof(ngx_array_t);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_map(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    ngx_http_array_map_data_t       *conf = data;[m
[31m-    ngx_http_variable_value_t       *array_it;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_str_t                       *value, *new_value;[m
[31m-    ngx_array_t                     *array, *new_array;[m
[31m-[m
[31m-    dd("entered array var map");[m
[31m-[m
[31m-    if (conf->template == NULL) {[m
[31m-        dd("template empty");[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (v[0].len != sizeof(ngx_array_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_join: invalid array variable value in the 2nd "[m
[31m-                      "argument: \"%.*s\"", &v[0]);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    array = (ngx_array_t *) v[0].data;[m
[31m-[m
[31m-    value = array->elts;[m
[31m-[m
[31m-    array_it = ngx_http_get_indexed_variable(r, conf->array_it_index);[m
[31m-[m
[31m-    if (conf->in_place) {[m
[31m-        new_array = array;[m
[31m-[m
[31m-    } else {[m
[31m-        new_array = ngx_array_create(r->pool, array->nelts,[m
[31m-                                     sizeof(ngx_str_t));[m
[31m-        if (new_array == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("array var map: array size: %d", (int) array->nelts);[m
[31m-[m
[31m-    array_it->not_found = 0;[m
[31m-    array_it->valid = 1;[m
[31m-[m
[31m-    for (i = 0; i < array->nelts; i++) {[m
[31m-        array_it->data = value[i].data;[m
[31m-        array_it->len = value[i].len;[m
[31m-[m
[31m-        dd("array it: %.*s", array_it->len, array_it->data);[m
[31m-[m
[31m-        if (conf->in_place) {[m
[31m-            new_value = &value[i];[m
[31m-[m
[31m-        } else {[m
[31m-            new_value = ngx_array_push(new_array);[m
[31m-            if (new_value == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, conf->template, new_value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("array var map: new item: %.*s", (int) new_value->len,[m
[31m-           new_value->data);[m
[31m-    }[m
[31m-[m
[31m-    array_it->not_found = 1;[m
[31m-    array_it->valid = 0;[m
[31m-[m
[31m-    res->data = (u_char *) new_array;[m
[31m-    res->len = sizeof(ngx_array_t);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_map_op(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    ngx_http_variable_value_t            arg;[m
[31m-    ngx_http_array_map_op_data_t        *conf = data;[m
[31m-    ndk_set_var_value_pt                 func;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_str_t                           *new_value;[m
[31m-    ngx_array_t                         *array;[m
[31m-    ngx_array_t                         *new_array;[m
[31m-[m
[31m-    func = ngx_http_array_var_get_func_from_cmd(v[0].data, v[0].len);[m
[31m-[m
[31m-    if (func == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_map_op: directive \"%v\" not found "[m
[31m-                      "or does not use ndk_set_var_value",[m
[31m-                      &v[0]);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v[1].len != sizeof(ngx_array_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_map_op: invalid array variable value in the 2nd "[m
[31m-                      "argument: \"%.*s\"", &v[0]);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    array = (ngx_array_t *) v[1].data;[m
[31m-[m
[31m-    value = array->elts;[m
[31m-[m
[31m-    if (conf->in_place) {[m
[31m-        new_array = array;[m
[31m-[m
[31m-    } else {[m
[31m-        new_array = ngx_array_create(r->pool, array->nelts,[m
[31m-                                     sizeof(ngx_str_t));[m
[31m-        if (new_array == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < array->nelts; i++) {[m
[31m-        arg.data = value[i].data;[m
[31m-        arg.len = value[i].len;[m
[31m-        arg.valid = 1;[m
[31m-        arg.not_found = 0;[m
[31m-[m
[31m-        if (conf->in_place) {[m
[31m-            new_value = &value[i];[m
[31m-[m
[31m-        } else {[m
[31m-            new_value = ngx_array_push(new_array);[m
[31m-            if (new_value == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = func(r, new_value, &arg);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    res->data = (u_char *) new_array;[m
[31m-    res->len = sizeof(ngx_array_t);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_join(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_variable_value_t           *sep;[m
[31m-    ngx_array_t                         *array;[m
[31m-    size_t                               len;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_uint_t                           i;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    sep = &v[0];[m
[31m-[m
[31m-    dd("sep %.*s", sep->len, sep->data);[m
[31m-[m
[31m-    if (v[1].len != sizeof(ngx_array_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_join: invalid array variable value in the "[m
[31m-                      "2nd argument: \"%V\"", &v[1]);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    array = (ngx_array_t *) v[1].data;[m
[31m-[m
[31m-    dd("join array ptr %p", array);[m
[31m-    dd("array->nelts: %d", (int) array->nelts);[m
[31m-[m
[31m-    if (array->nelts == 0) {[m
[31m-        res->data = NULL;[m
[31m-        res->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = array->elts;[m
[31m-[m
[31m-    len = sep->len * (array->nelts - 1);[m
[31m-[m
[31m-    for (i = 0; i < array->nelts; i++) {[m
[31m-        len += value[i].len;[m
[31m-    }[m
[31m-[m
[31m-    dd("buf len %d", (int) len);[m
[31m-[m
[31m-    res->data = ngx_palloc(r->pool, len);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->len = len;[m
[31m-[m
[31m-    p = res->data;[m
[31m-[m
[31m-    for (i = 0; i < array->nelts; i++) {[m
[31m-        dd("copying elem of size %d", (int) value[i].len);[m
[31m-        p = ngx_copy(p, value[i].data, value[i].len);[m
[31m-        if (i < array->nelts - 1) {[m
[31m-            p = ngx_copy(p, sep->data, sep->len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p != res->data + res->len) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "array_join: buffer error");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_util.c[m
[1mdeleted file mode 100644[m
[1mindex 28195e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_array_var_util.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_array_var_variable_not_found(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-/* Modified from the ngx_strlcasestrn function in ngx_string.h[m
[31m- * Copyright (C) by Igor Sysoev */[m
[31m-u_char *[m
[31m-ngx_http_array_var_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    last -= n;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (s1 >= last) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ndk_set_var_value_pt[m
[31m-ngx_http_array_var_get_func_from_cmd(u_char *name, size_t name_len)[m
[31m-{[m
[31m-    ndk_set_var_t           *filter;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_module_t           **modules;[m
[31m-    ngx_module_t            *module;[m
[31m-    ngx_command_t           *cmd;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009011[m
[31m-    modules = ngx_cycle->modules;[m
[31m-#else[m
[31m-    modules = ngx_modules;[m
[31m-#endif[m
[31m-[m
[31m-    for (i = 0; modules[i]; i++) {[m
[31m-        module = modules[i];[m
[31m-        if (module->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cmd = modules[i]->commands;[m
[31m-        if (cmd == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; cmd->name.len; cmd++) {[m
[31m-            if (cmd->set != ndk_set_var_value) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            filter = cmd->post;[m
[31m-            if (filter == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (cmd->name.len != name_len[m
[31m-                || ngx_strncmp(cmd->name.data, name, name_len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return (ndk_set_var_value_pt) filter->func;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_array_var_add_variable(ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_variable_t         *v;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->get_handler = ngx_http_array_var_variable_not_found;[m
[31m-[m
[31m-    return ngx_http_get_variable_index(cf, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_array_var_variable_not_found(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->not_found = 1;[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_util.h[m
[1mdeleted file mode 100644[m
[1mindex b69a4e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/src/ngx_http_array_var_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-#ifndef NGX_HTTP_ARRAY_VAR_UTIL_H[m
[31m-#define NGX_HTTP_ARRAY_VAR_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_array_var_add_variable(ngx_conf_t *cf, ngx_str_t *name);[m
[31m-[m
[31m-u_char *ngx_http_array_var_strlstrn(u_char *s1, u_char *last, u_char *s2,[m
[31m-    size_t n);[m
[31m-[m
[31m-ndk_set_var_value_pt ngx_http_array_var_get_func_from_cmd(u_char *name,[m
[31m-    size_t name_len);[m
[31m-[m
[31m-[m
[31m-#ifndef ngx_str3cmp[m
[31m-[m
[31m-#  define ngx_str3cmp(m, c0, c1, c2)                                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2[m
[31m-[m
[31m-#endif /* ngx_str3cmp */[m
[31m-[m
[31m-#endif /* NGX_HTTP_ARRAY_VAR_UTIL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 0db489a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,371 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: array split/join[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob,Marry,John[m
[31m---- response_body[m
[31m-Bob+Marry+John[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: array split/join (non-empty sep with a limit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names 2 to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob,Marry,John[m
[31m---- response_body[m
[31m-Bob+Marry,John[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: array split/join (non-empty sep with a ZERO limit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names 0 to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob,Marry,John[m
[31m---- response_body[m
[31m-Bob+Marry+John[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: array split/join (emtpy sep with a limit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names 2 to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob[m
[31m---- response_body[m
[31m-B+ob[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: array split/join (emtpy sep with a ZERO limit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names 0 to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob[m
[31m---- response_body[m
[31m-B+o+b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: array split (empty split sep)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob[m
[31m---- response_body[m
[31m-B+o+b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: array split (empty split/join sep)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names to=$names;[m
[31m-        array_join '' $names;[m
[31m-        echo [$names];[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=Bob[m
[31m---- response_body[m
[31m-[Bob][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: array split (empty split + empty input)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo [$names];[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: array split/join (single item)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=nomas[m
[31m---- response_body[m
[31m-nomas[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: array split/join (empty array)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "[$names]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: array split/join (multi-char sep)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split '->' $arg_names to=$names;[m
[31m-        array_join '(+)' $names;[m
[31m-        echo "$names";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=a->b->c[m
[31m---- response_body[m
[31m-a(+)b(+)c[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: array split/join (list of empty values)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "[$names]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=,,,[m
[31m---- response_body[m
[31m-[+++][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: array map[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map 'hi' $names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "[$names]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=,,,[m
[31m---- response_body[m
[31m-[hi+hi+hi+hi][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: array map (in-place)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "$names";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-[bob]+[marry]+[nomas][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: array map (copy)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names to=$names2;[m
[31m-        array_join '+' $names;[m
[31m-        array_join '+' $names2;[m
[31m-        echo "$names";[m
[31m-        echo "$names2";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-bob+marry+nomas[m
[31m-[bob]+[marry]+[nomas][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: array map (empty values)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "$names";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=,marry,nomas[m
[31m---- response_body[m
[31m-[]+[marry]+[nomas][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: non-in-place join[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        array_join '-' $names to=$res2;[m
[31m-        echo $res;[m
[31m-        echo $res2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-bob+marry+nomas[m
[31m-bob-marry-nomas[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: non-in-place join[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        array_join '-' $names to=$res2;[m
[31m-        echo $res;[m
[31m-        echo $res2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-bob+marry+nomas[m
[31m-bob-marry-nomas[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: map op (in-place)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_sql_str $names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-'bob'+'marry'+'nomas'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: map op (copy)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_sql_str $names to=$list;[m
[31m-        array_join '+' $list to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-'bob'+'marry'+'nomas'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: map op (quote special chars)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_sql_str $names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=',\[m
[31m---- response_body[m
[31m-'\''+'\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: $array_it gets cleared after array map[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names;[m
[31m-        echo "[$array_it]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: map op (copy) on set_quote_pgsql_str[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_pgsql_str $names to=$list;[m
[31m-        array_join '+' $list to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-E'bob'+E'marry'+E'nomas'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: map op (copy) on set_quote_json_str[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_json_str $names to=$list;[m
[31m-        array_join '+' $list to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?names=bob,marry,nomas[m
[31m---- response_body[m
[31m-"bob"+"marry"+"nomas"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex c9b2873..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-version=$1[m
[31m-force=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --with-debug || exit 1[m
[31m-          #--add-module=$home/work/ndk \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ab1e4bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/array-var-nginx-module-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,159 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:sendmsg[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_pass_open_channel[m
[31m-fun:ngx_start_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-epoll_ctl(event)[m
[31m-fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex a65d396..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/upstream.[ch][m
[31m-all[m
[31m-go[m
[31m-buildroot/[m
[31m-pack[m
[31m-t/servroot/[m
[31m-build1[0-9][m
[31m-*.plist[m
[31m-Makefile[m
[31m-*.patch[m
[31m-analyze[m
[31m-*.html[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/Changes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/Changes[m
[1mdeleted file mode 100644[m
[1mindex 5d73650..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/Changes[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-v0.1.0 - 5 July 2011[m
[31m-* now we require at least libdrizzle 1.0, which supports official mysql 5.5+ and is much more stable under load. thanks Taylor Weibley for pushing this. We no longer require patching libdrizzle any more.[m
[31m-[m
[31m-* fixed a compilation issue on Mac OS X: we should include drizzle.h prior to nginx headers, or we will not get the "bool" type properly installed on Mac OS X.[m
[31m-[m
[31m-* fixed the spots that trigger -Wunused-but-set-variable by gcc 4.6.[m
[31m-[m
[31m-* fixed the duplicate last chunk issue: we should not set the last_buf flag ourselves in drizzle_output.c because ngx_http_upstream already sends a last buf for us.[m
[31m-[m
[31m-* ported over Maxim Dounin's patch for ngx_http_upstream_keepalive connection pool fixes: we should have discarded stale read events for cached tcp connections in the pool.[m
[31m-[m
[31m-* implemented the new drizzle_status directive to provide connection pool status monitoring capability.[m
[31m-[m
[31m-* fixed a minor bug in the connection pool: we should resume the "name", "sockaddr", and "socklen" fields for the connection from the pool such that we can get more detailed error log messages with the "upstream: drizzle://ip.add.re.ss:port" bit.[m
[31m-[m
[31m-* implemented the $drizzle_thread_id variable which is automatically set when mysql/drizzle times out.[m
[31m-[m
[31m-* now we use the 2-clause bsd license.[m
[31m-[m
[31m-* report an error message when upstream name not found for drizzle_pass.[m
[31m-[m
[31m-* now we implemented the charset option for the "drizzle_server" diredctive which causes ngx_drizzle send "set names xxx" automatcially for every connection to that drizzle server.[m
[31m-[m
[31m-* added a lot of more documentation.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/config[m
[1mdeleted file mode 100644[m
[1mindex ae901c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/config[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <libdrizzle/drizzle_client.h>"[m
[31m-ngx_feature_test="drizzle_version();"[m
[31m-[m
[31m-if [ -n "$LIBDRIZZLE_INC" -o -n "$LIBDRIZZLE_LIB" ]; then[m
[31m-    # explicit set libdrizzle lib path[m
[31m-    ngx_feature="libdrizzle library in directories specified by LIBDRIZZLE_INC ($LIBDRIZZLE_INC) and LIBDRIZZLE_LIB ($LIBDRIZZLE_LIB)"[m
[31m-    ngx_feature_path="$LIBDRIZZLE_INC"[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R$LIBDRIZZLE_LIB -L$LIBDRIZZLE_LIB -ldrizzle"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L$LIBDRIZZLE_LIB -ldrizzle"[m
[31m-    fi[m
[31m-    . auto/feature[m
[31m-else[m
[31m-    # auto-discovery[m
[31m-    ngx_feature="libdrizzle library"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-ldrizzle"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # Ubuntu 12.04[m
[31m-        ngx_feature="libdrizzle library in /usr/local/"[m
[31m-        ngx_feature_path="/usr/include/libdrizzle-1.0"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/lib -L/usr/lib -ldrizzle"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/lib -ldrizzle"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # FreeBSD, OpenBSD[m
[31m-        ngx_feature="libdrizzle library in /usr/local/"[m
[31m-        ngx_feature_path="/usr/local/include/libdrizzle-1.0"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -ldrizzle"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/local/lib -ldrizzle"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # NetBSD[m
[31m-        ngx_feature="libdrizzle library in /usr/pkg/"[m
[31m-        ngx_feature_path="/usr/pkg/include/libdrizzle-1.0"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -ldrizzle"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/pkg/lib -ldrizzle"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # MacPorts[m
[31m-        ngx_feature="libdrizzle library in /opt/local/"[m
[31m-        ngx_feature_path="/opt/local/include/libdrizzle-1.0"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -ldrizzle"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/opt/local/lib -ldrizzle"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-else[m
[31m- cat << END[m
[31m- $0: error: the ngx_drizzle addon requires the libdrizzle library.[m
[31m-END[m
[31m- exit 1[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_drizzle_module[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_http_drizzle_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_http_drizzle_module.c $ngx_addon_dir/src/ngx_http_drizzle_handler.c $ngx_addon_dir/src/ngx_http_drizzle_processor.c $ngx_addon_dir/src/ngx_http_drizzle_upstream.c $ngx_addon_dir/src/ngx_http_drizzle_util.c $ngx_addon_dir/src/ngx_http_drizzle_output.c $ngx_addon_dir/src/ngx_http_drizzle_keepalive.c $ngx_addon_dir/src/ngx_http_drizzle_quoting.c $ngx_addon_dir/src/ngx_http_drizzle_checker.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ddebug.h $ngx_addon_dir/src/ngx_http_drizzle_module.h $ngx_addon_dir/src/ngx_http_drizzle_handler.h $ngx_addon_dir/src/ngx_http_drizzle_processor.h $ngx_addon_dir/src/ngx_http_drizzle_upstream.h $ngx_addon_dir/src/ngx_http_drizzle_util.h $ngx_addon_dir/src/ngx_http_drizzle_output.h $ngx_addon_dir/src/resty_dbd_stream.h $ngx_addon_dir/src/ngx_http_drizzle_keepalive.h $ngx_addon_dir/src/ngx_http_drizzle_quoting.h $ngx_addon_dir/src/ngx_http_drizzle_checker.h"[m
[31m-[m
[31m-have=NGX_DRIZZLE_MODULE . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/doc/design b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/doc/design[m
[1mdeleted file mode 100644[m
[1mindex 3d66c16..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/doc/design[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-main request to location "/drizzle" (handled by mod_drizzle)[m
[31m-	-> mod_drizzle content handler (is main request)[m
[31m-		-> emit subrequest to location "/drizzle"[m
[31m-		-> return NGX_DONE[m
[31m-	-> mod_drizzle content handler (is subrequest)[m
[31m-		-> connect db (through libdrizzle), get db connection fd[m
[31m-		-> wrap db connection fd into a ngx_event, reg rd/wr event handler[m
[31m-		-> return NGX_DONE[m
[31m-	-> i/o event occured on db connection[m
[31m-		-> rd/wr event handler called, call mod_drizzle content handler using subrequest struct[m
[31m-			-> mod_drizzle content handler called (is subrequest)[m
[31m-				-> continue libdrizzle state machine[m
[31m-				-> generate response header and body if done,[m
[31m-					then unreg db connection events,[m
[31m-					and call ngx_http_finalize_request to release self[m
[31m-				-> return NGX_OK[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex aa2339d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,113 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   define dd_dump_chain_size() { \[m
[31m-        int              n; \[m
[31m-        ngx_chain_t     *cl; \[m
[31m-            \[m
[31m-        for (n = 0, cl = u->out_bufs; cl; cl = cl->next, n++) { \[m
[31m-        } \[m
[31m-            \[m
[31m-        dd("chain size: %d", n); \[m
[31m-    }[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "drizzle *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   define dd_dump_chain_size()[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define dd_drizzle_result(result) \[m
[31m-    dd("drizzle result:     row_count=%" PRId64 "\n" \[m
[31m-         "            insert_id=%" PRId64 "\n" \[m
[31m-         "        warning_count=%u\n" \[m
[31m-         "         column_count=%u\n\n", \[m
[31m-         drizzle_result_row_count(result), \[m
[31m-         drizzle_result_insert_id(result), \[m
[31m-         drizzle_result_warning_count(result), \[m
[31m-         drizzle_result_column_count(result))[m
[31m-[m
[31m-#define dd_drizzle_column(column) \[m
[31m-    dd("drizzle column:   catalog=%s\n" \[m
[31m-         "              db=%s\n" \[m
[31m-         "           table=%s\n" \[m
[31m-         "       org_table=%s\n" \[m
[31m-         "            name=%s\n" \[m
[31m-         "        org_name=%s\n" \[m
[31m-         "         charset=%u\n" \[m
[31m-         "            size=%u\n" \[m
[31m-         "        max_size=%zu\n" \[m
[31m-         "            type=%u\n" \[m
[31m-         "           flags=%u\n\n", \[m
[31m-         drizzle_column_catalog(column), drizzle_column_db(column), \[m
[31m-         drizzle_column_table(column), drizzle_column_orig_table(column), \[m
[31m-         drizzle_column_name(column), drizzle_column_orig_name(column), \[m
[31m-         drizzle_column_charset(column), drizzle_column_size(column), \[m
[31m-         drizzle_column_max_size(column), drizzle_column_type(column), \[m
[31m-         drizzle_column_flags(column));[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.c[m
[1mdeleted file mode 100644[m
[1mindex fca9b99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.c[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include "ngx_http_drizzle_quoting.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_int(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_float(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_bool(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_col(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_table(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_check_keyword(ngx_str_t *value, void *data)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.h[m
[1mdeleted file mode 100644[m
[1mindex b996df3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_checker.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_CHECKER_H[m
[31m-#define NGX_HTTP_DRIZZLE_CHECKER_H[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_int(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_float(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_bool(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_col(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_table(ngx_str_t *value, void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_check_keyword(ngx_str_t *value, void *data);[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_CHECKER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 5c989e5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,671 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_handler.h"[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include "ngx_http_drizzle_keepalive.h"[m
[31m-[m
[31m-[m
[31m-#ifdef _WIN32[m
[31m-/* import the POLLIN and POLLOUT flags */[m
[31m-#   ifndef WIN32_LEAN_AND_MEAN[m
[31m-#       define WIN32_LEAN_AND_MEAN[m
[31m-#   endif[m
[31m-#   include <winsock2.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* for read/write event handlers */[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_drizzle_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_drizzle_reinit_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_drizzle_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_drizzle_finalize_request(ngx_http_request_t *r,[m
[31m-        ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_drizzle_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_drizzle_input_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_drizzle_input_filter(void *data, ssize_t bytes);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_drizzle_loc_conf_t    *dlcf;[m
[31m-#if defined(nginx_version) && nginx_version < 8017[m
[31m-    ngx_http_drizzle_ctx_t         *dctx;[m
[31m-#endif[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_str_t                       target;[m
[31m-    ngx_url_t                       url;[m
[31m-    ngx_connection_t               *c;[m
[31m-[m
[31m-    dd("request: %p", r);[m
[31m-    dd("subrequest in memory: %d", (int) r->subrequest_in_memory);[m
[31m-    dd("connection: %p", r->connection);[m
[31m-    dd("connection log: %p", r->connection->log);[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-        /* TODO: add support for subrequest in memory by[m
[31m-         * emitting output into u->buffer instead */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "ngx_http_drizzle_module does not support "[m
[31m-                      "subrequest in memory");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_drizzle_module);[m
[31m-[m
[31m-    if ((dlcf->default_query == NULL) && !(dlcf->methods_set & r->method)) {[m
[31m-        if (dlcf->methods_set != 0) {[m
[31m-            return NGX_HTTP_NOT_ALLOWED;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "drizzle: missing \"drizzle_query\" in location \"%V\"",[m
[31m-                      &clcf->name);[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX upstream already exists? %p", r->upstream);[m
[31m-[m
[31m-#if defined(nginx_version) && \[m
[31m-    ((nginx_version >= 7063 && nginx_version < 8000) \[m
[31m-     || nginx_version >= 8007)[m
[31m-[m
[31m-    dd("creating upstream.......");[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#else /* 0.7.x < 0.7.63, 0.8.x < 0.8.7 */[m
[31m-[m
[31m-    dd("XXX create upstream");[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-#  if (NGX_THREADS)[m
[31m-    u->peer.lock = &r->connection->lock;[m
[31m-#  endif[m
[31m-[m
[31m-    r->upstream = u;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (dlcf->complex_target) {[m
[31m-        /* variables used in the drizzle_pass directive */[m
[31m-        if (ngx_http_complex_value(r, dlcf->complex_target, &target)[m
[31m-                != NGX_OK)[m
[31m-        {[m
[31m-            dd("failed to compile");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (target.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                    "drizzle: handler: empty \"drizzle_pass\" target");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        url.host = target;[m
[31m-        url.port = 0;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        dlcf->upstream.upstream = ngx_http_upstream_drizzle_add(r, &url);[m
[31m-[m
[31m-        if (dlcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                   "drizzle: upstream \"%V\" not found", &target);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version < 8017[m
[31m-    dctx = ngx_pcalloc(r->pool, sizeof(ngx_http_drizzle_ctx_t));[m
[31m-    if (dctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, dctx, ngx_http_drizzle_module);[m
[31m-#endif[m
[31m-[m
[31m-    u->schema.len = sizeof("drizzle://") - 1;[m
[31m-    u->schema.data = (u_char *) "drizzle://";[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_drizzle_module;[m
[31m-[m
[31m-    dd("drizzle tag: %p", (void *) u->output.tag);[m
[31m-[m
[31m-    u->conf = &dlcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_http_drizzle_create_request;[m
[31m-    u->reinit_request = ngx_http_drizzle_reinit_request;[m
[31m-    u->process_header = ngx_http_drizzle_process_header;[m
[31m-    u->abort_request = ngx_http_drizzle_abort_request;[m
[31m-    u->finalize_request = ngx_http_drizzle_finalize_request;[m
[31m-[m
[31m-    /* we bypass the upstream input filter mechanism in[m
[31m-     * ngx_http_upstream_process_headers */[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_drizzle_input_filter_init;[m
[31m-    u->input_filter = ngx_http_drizzle_input_filter;[m
[31m-    u->input_filter_ctx = NULL;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    r->main->count++;[m
[31m-#endif[m
[31m-[m
[31m-    dd("XXX connect timeout: %d", (int) dlcf->upstream.connect_timeout);[m
[31m-[m
[31m-    ngx_http_upstream_dbd_init(r);[m
[31m-[m
[31m-    /* override the read/write event handler to our own */[m
[31m-    u->write_event_handler = ngx_http_drizzle_wev_handler;[m
[31m-    u->read_event_handler  = ngx_http_drizzle_rev_handler;[m
[31m-[m
[31m-    /* a bit hack-ish way to return error response (clean-up part) */[m
[31m-    if ((u->peer.connection) && (u->peer.connection->fd == 0)) {[m
[31m-        c = u->peer.connection;[m
[31m-        u->peer.connection = NULL;[m
[31m-[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-            NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-#else[m
[31m-            dctx->status ? dctx->status : NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_drizzle_wev_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-[m
[31m-    dd("drizzle wev handler");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    u->request_sent = 1;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-        dd("drizzle connection write timeout");[m
[31m-[m
[31m-        ngx_http_drizzle_set_thread_id_variable(r, u);[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_next(r, u,[m
[31m-                NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_drizzle_test_connect(c) != NGX_OK) {[m
[31m-        dd("drizzle connection is broken");[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_drizzle_set_libdrizzle_ready(r);[m
[31m-[m
[31m-    (void) ngx_http_drizzle_process_events(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_drizzle_rev_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-[m
[31m-    dd("drizzle rev handler");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    u->request_sent = 1;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        dd("drizzle connection read timeout");[m
[31m-        ngx_http_drizzle_set_thread_id_variable(r, u);[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_next(r, u,[m
[31m-                NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_drizzle_test_connect(c) != NGX_OK) {[m
[31m-        dd("drizzle connection is broken");[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_drizzle_set_libdrizzle_ready(r);[m
[31m-[m
[31m-    (void) ngx_http_drizzle_process_events(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    r->upstream->request_bufs = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    /* override the read/write event handler to our own */[m
[31m-    u->write_event_handler = ngx_http_drizzle_wev_handler;[m
[31m-    u->read_event_handler  = ngx_http_drizzle_rev_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_drizzle_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_drizzle_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-           "ngx_http_drizzle_process_header should not be called"[m
[31m-           " by the upstream");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t          *r = data;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-           "ngx_http_drizzle_input_filter_init should not be called"[m
[31m-           " by the upstream");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_input_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t          *r = data;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-           "ngx_http_drizzle_input_filter should not be called"[m
[31m-           " by the upstream");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_drizzle_set_libdrizzle_ready(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_peer_data_t       *dp;[m
[31m-    drizzle_con_st                              *dc;[m
[31m-#if 1[m
[31m-    short                                        revents = 0;[m
[31m-#endif[m
[31m-[m
[31m-    dp = r->upstream->peer.data;[m
[31m-[m
[31m-    dc = dp->drizzle_con;[m
[31m-[m
[31m-#if 0[m
[31m-    /* libdrizzle uses standard poll() event constants[m
[31m-     * and depends on drizzle_con_wait() to set them.[m
[31m-     * we can directly call drizzle_con_wait() here to[m
[31m-     * set those drizzle internal event states, because[m
[31m-     * epoll() and other underlying event mechamism used[m
[31m-     * by the nginx core can play well enough with poll().[m
[31m-     * */[m
[31m-[m
[31m-    (void) drizzle_con_wait(dc->drizzle);[m
[31m-#endif[m
[31m-[m
[31m-#if 1[m
[31m-    revents |= POLLOUT;[m
[31m-    revents |= POLLIN;[m
[31m-[m
[31m-    /* drizzle_con_set_revents() isn't declared external in libdrizzle-0.4.0, */[m
[31m-    /* so we have to do its job all by ourselves... */[m
[31m-[m
[31m-    dc->options |= DRIZZLE_CON_IO_READY;[m
[31m-    dc->revents = revents;[m
[31m-    dc->events &= (short) ~revents;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_status_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf;[m
[31m-    ngx_uint_t                      i, n;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    size_t                          len;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_queue_t                    *q;[m
[31m-[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    /* calculate the output buffer length */[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_WORKER) {[m
[31m-        len += sizeof("worker process: \n\n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(ngx_pid);[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->srv_conf == NULL) {[m
[31m-            /* skip implicit upstream specified directly by the fastcgi_pass,[m
[31m-             * proxy_pass, and similar directives */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_http_drizzle_module);[m
[31m-[m
[31m-        if (dscf == NULL || dscf->servers == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n != 0) {[m
[31m-            len += sizeof("\n") - 1;[m
[31m-        }[m
[31m-[m
[31m-        n++;[m
[31m-[m
[31m-        len += sizeof("upstream \n") - 1[m
[31m-             + uscf->host.len[m
[31m-             + sizeof("  active connections: \n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(dscf->active_conns)[m
[31m-             + sizeof("  connection pool capacity: \n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(dscf->max_cached);[m
[31m-[m
[31m-        if (dscf->max_cached) {[m
[31m-            /* dump overflow flag for the connection pool */[m
[31m-[m
[31m-            switch (dscf->overflow) {[m
[31m-                case drizzle_keepalive_overflow_ignore:[m
[31m-                    len += sizeof("  overflow: ignore\n") - 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case drizzle_keepalive_overflow_reject:[m
[31m-                    len += sizeof("  overflow: reject\n") - 1;[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    len += sizeof("  overflow: N/A\n") - 1;[m
[31m-                    break;[m
[31m-            }[m
[31m-[m
[31m-            /* dump the lengths of the "cache" and "free" queues in the pool */[m
[31m-[m
[31m-            len += sizeof("  cached connection queue: \n") - 1[m
[31m-                 + ngx_http_drizzle_get_num_size([m
[31m-                         ngx_http_drizzle_queue_size(&dscf->cache)[m
[31m-                   )[m
[31m-                 + sizeof("  free'd connection queue: \n") - 1[m
[31m-                 + ngx_http_drizzle_get_num_size([m
[31m-                         ngx_http_drizzle_queue_size(&dscf->free)[m
[31m-                   )[m
[31m-[m
[31m-            /* dump how many times that each individual connection in the[m
[31m-             * pool has been successfully used in the "cache" queue */[m
[31m-[m
[31m-                 + sizeof("  cached connection successfully used count:\n") - 1;[m
[31m-[m
[31m-            for (q = ngx_queue_head(&dscf->cache);[m
[31m-                 q != ngx_queue_sentinel(&dscf->cache);[m
[31m-                 q = ngx_queue_next(q))[m
[31m-            {[m
[31m-                item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                        queue);[m
[31m-[m
[31m-                len += sizeof(" ") - 1[m
[31m-                     + ngx_http_drizzle_get_num_size(item->used);[m
[31m-            }[m
[31m-[m
[31m-            /* dump how many times that each individual connection in the[m
[31m-             * pool has been successfully used in the "free" queue */[m
[31m-[m
[31m-            len += sizeof("  free'd connection successfully used count:\n") - 1;[m
[31m-[m
[31m-            for (q = ngx_queue_head(&dscf->free);[m
[31m-                 q != ngx_queue_sentinel(&dscf->free);[m
[31m-                 q = ngx_queue_next(q))[m
[31m-            {[m
[31m-                item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                        queue);[m
[31m-[m
[31m-                len += sizeof(" ") - 1[m
[31m-                     + ngx_http_drizzle_get_num_size(item->used);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        len += sizeof("  servers: \n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(dscf->servers->nelts)[m
[31m-             + sizeof("  peers: \n") - 1[m
[31m-             + ngx_http_drizzle_get_num_size(dscf->peers->number);[m
[31m-    }[m
[31m-[m
[31m-    /* allocate the output buffer */[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* fill in the output buffer with the actual data */[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_WORKER) {[m
[31m-        b->last = ngx_sprintf(b->last, "worker process: %P\n\n", ngx_pid);[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->srv_conf == NULL) {[m
[31m-            /* skip implicit upstream specified directly by the fastcgi_pass,[m
[31m-             * proxy_pass, and similar directives */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_http_drizzle_module);[m
[31m-[m
[31m-        if (dscf == NULL || dscf->servers == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n != 0) {[m
[31m-            *b->last++ = '\n';[m
[31m-        }[m
[31m-[m
[31m-        n++;[m
[31m-[m
[31m-        b->last = ngx_copy_const_str(b->last, "upstream ");[m
[31m-        b->last = ngx_copy(b->last, uscf->host.data, uscf->host.len);[m
[31m-[m
[31m-        *b->last++ = '\n';[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "  active connections: %uD\n",[m
[31m-                dscf->active_conns);[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "  connection pool capacity: %uD\n",[m
[31m-                dscf->max_cached);[m
[31m-[m
[31m-        if (dscf->max_cached) {[m
[31m-            /* dump overflow flag for the connection pool */[m
[31m-[m
[31m-            switch (dscf->overflow) {[m
[31m-                case drizzle_keepalive_overflow_ignore:[m
[31m-                    b->last = ngx_copy_const_str(b->last,[m
[31m-                            "  overflow: ignore\n");[m
[31m-                    break;[m
[31m-[m
[31m-                case drizzle_keepalive_overflow_reject:[m
[31m-                    b->last = ngx_copy_const_str(b->last,[m
[31m-                            "  overflow: reject\n");[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    b->last = ngx_copy_const_str(b->last, "  overflow: N/A\n");[m
[31m-                    break;[m
[31m-            }[m
[31m-[m
[31m-            /* dump the lengths of the "cache" and "free" queues in the pool */[m
[31m-[m
[31m-            b->last = ngx_sprintf(b->last, "  cached connection queue: %uD\n",[m
[31m-                    ngx_http_drizzle_queue_size(&dscf->cache));[m
[31m-[m
[31m-            b->last = ngx_sprintf(b->last, "  free'd connection queue: %uD\n",[m
[31m-                    ngx_http_drizzle_queue_size(&dscf->free));[m
[31m-[m
[31m-            /* dump how many times that each individual connection in the[m
[31m-             * pool has been successfully used in the "cache" queue */[m
[31m-[m
[31m-            b->last = ngx_copy_const_str(b->last,[m
[31m-                    "  cached connection successfully used count:");[m
[31m-[m
[31m-            for (q = ngx_queue_head(&dscf->cache);[m
[31m-                 q != ngx_queue_sentinel(&dscf->cache);[m
[31m-                 q = ngx_queue_next(q))[m
[31m-            {[m
[31m-                item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                        queue);[m
[31m-                b->last = ngx_sprintf(b->last, " %uD", item->used);[m
[31m-            }[m
[31m-[m
[31m-            *b->last++ = '\n';[m
[31m-[m
[31m-            /* dump how many times that each individual connection in the[m
[31m-             * pool has been successfully used in the "free" queue */[m
[31m-[m
[31m-            b->last = ngx_copy_const_str(b->last,[m
[31m-                    "  free'd connection successfully used count:");[m
[31m-[m
[31m-            for (q = ngx_queue_head(&dscf->free);[m
[31m-                 q != ngx_queue_sentinel(&dscf->free);[m
[31m-                 q = ngx_queue_next(q))[m
[31m-            {[m
[31m-                item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                        queue);[m
[31m-                b->last = ngx_sprintf(b->last, " %uD", item->used);[m
[31m-            }[m
[31m-[m
[31m-            *b->last++ = '\n';[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "  servers: %uD\n",[m
[31m-                dscf->servers->nelts);[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "  peers: %uD\n", dscf->peers->number);[m
[31m-    }[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "drizzle_status output buffer error: %O != %O",[m
[31m-                      (off_t) (b->last - b->pos),[m
[31m-                      (off_t) (b->end - b->pos));[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, cl);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.h[m
[1mdeleted file mode 100644[m
[1mindex 72b47ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_HANDLER_H[m
[31m-#define NGX_HTTP_DRIZZLE_HANDLER_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-void ngx_http_drizzle_set_libdrizzle_ready(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_drizzle_rev_handler(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u);[m
[31m-[m
[31m-void ngx_http_drizzle_wev_handler(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_status_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_HANDLER_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.c[m
[1mdeleted file mode 100644[m
[1mindex 6b4466a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.c[m
[1m+++ /dev/null[m
[36m@@ -1,409 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_keepalive.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_drizzle_keepalive_dummy_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_drizzle_keepalive_close_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_drizzle_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t        *dscf = conf;[m
[31m-    ngx_str_t                                   *value;[m
[31m-    ngx_uint_t                                   i;[m
[31m-    ngx_int_t                                    n;[m
[31m-    u_char                                      *data;[m
[31m-    ngx_uint_t                                   len;[m
[31m-[m
[31m-    if (dscf->max_cached) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_drizzle_strcmp_const(value[i].data, "max=")[m
[31m-            == 0)[m
[31m-        {[m
[31m-            len = value[i].len - (sizeof("max=") - 1);[m
[31m-            data = &value[i].data[sizeof("max=") - 1];[m
[31m-[m
[31m-            n = ngx_atoi(data, len);[m
[31m-[m
[31m-            if (n == NGX_ERROR || n < 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid \"max\" value \"%V\" "[m
[31m-                                   "in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            dscf->max_cached = n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_drizzle_strcmp_const(value[i].data, "mode=") == 0) {[m
[31m-            len = value[i].len - (sizeof("mode=") - 1);[m
[31m-            data = &value[i].data[sizeof("mode=") - 1];[m
[31m-[m
[31m-            switch (len) {[m
[31m-            case 6:[m
[31m-                if (ngx_http_drizzle_strcmp_const(data, "single") == 0) {[m
[31m-                    dscf->single = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 5:[m
[31m-                if (ngx_http_drizzle_strcmp_const(data, "multi") == 0) {[m
[31m-                    dscf->single = 0;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "drizzle: invalid \"mode\" value \"%V\" "[m
[31m-                                   "in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_drizzle_strcmp_const(value[i].data, "overflow=") == 0) {[m
[31m-            len = value[i].len - (sizeof("overflow=") - 1);[m
[31m-            data = &value[i].data[sizeof("overflow=") - 1];[m
[31m-[m
[31m-            switch (len) {[m
[31m-            case 6:[m
[31m-                if (ngx_http_drizzle_strcmp_const(data, "reject") == 0) {[m
[31m-                    dscf->overflow = drizzle_keepalive_overflow_reject;[m
[31m-                } else if (ngx_http_drizzle_strcmp_const(data, "ignore") == 0) {[m
[31m-                    dscf->overflow = drizzle_keepalive_overflow_ignore;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "drizzle: invalid \"overflow\" value \"%V\" "[m
[31m-                                   "in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "drizzle: invalid parameter \"%V\" in"[m
[31m-                           " \"%V\" directive",[m
[31m-                           &value[i], &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_keepalive_init(ngx_pool_t *pool,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf)[m
[31m-{[m
[31m-    ngx_uint_t                              i;[m
[31m-    ngx_http_drizzle_keepalive_cache_t     *cached;[m
[31m-[m
[31m-    /* allocate cache items and add to free queue */[m
[31m-[m
[31m-    cached = ngx_pcalloc(pool,[m
[31m-                         sizeof(ngx_http_drizzle_keepalive_cache_t)[m
[31m-                         * dscf->max_cached);[m
[31m-    if (cached == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_init(&dscf->cache);[m
[31m-    ngx_queue_init(&dscf->free);[m
[31m-[m
[31m-    for (i = 0; i < dscf->max_cached; i++) {[m
[31m-        ngx_queue_insert_head(&dscf->free, &cached[i].queue);[m
[31m-        cached[i].srv_conf = dscf;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_keepalive_get_peer_single(ngx_peer_connection_t *pc,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf)[m
[31m-{[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-    ngx_queue_t                             *q;[m
[31m-    ngx_connection_t                        *c;[m
[31m-[m
[31m-    if (!ngx_queue_empty(&dscf->cache)) {[m
[31m-        dd("getting cached mysql connection...");[m
[31m-[m
[31m-        q = ngx_queue_head(&dscf->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        ngx_queue_insert_head(&dscf->free, q);[m
[31m-[m
[31m-        c->idle = 0;[m
[31m-        c->log = pc->log;[m
[31m-        c->read->log = pc->log;[m
[31m-        c->write->log = pc->log;[m
[31m-[m
[31m-        dp->name.data = item->name.data;[m
[31m-        dp->name.len = item->name.len;[m
[31m-[m
[31m-        dp->sockaddr = item->sockaddr;[m
[31m-        dp->drizzle_con = item->drizzle_con;[m
[31m-        dp->has_set_names = item->has_set_names;[m
[31m-        dp->used = item->used;[m
[31m-[m
[31m-        pc->connection = c;[m
[31m-        pc->cached = 1;[m
[31m-        pc->name = &dp->name;[m
[31m-        pc->sockaddr = &dp->sockaddr;[m
[31m-        pc->socklen = item->socklen;[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_keepalive_get_peer_multi(ngx_peer_connection_t *pc,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf)[m
[31m-{[m
[31m-    ngx_queue_t                             *q, *cache;[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-    ngx_connection_t                        *c;[m
[31m-[m
[31m-    /* search cache for suitable connection */[m
[31m-[m
[31m-    cache = &dscf->cache;[m
[31m-[m
[31m-    for (q = ngx_queue_head(cache);[m
[31m-         q != ngx_queue_sentinel(cache);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        /* XXX maybe we should take dbname and user into account[m
[31m-         * as well? */[m
[31m-        if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,[m
[31m-                         item->socklen, pc->socklen)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_queue_remove(q);[m
[31m-            ngx_queue_insert_head(&dscf->free, q);[m
[31m-[m
[31m-            c->idle = 0;[m
[31m-            c->log = pc->log;[m
[31m-            c->read->log = pc->log;[m
[31m-            c->write->log = pc->log;[m
[31m-[m
[31m-            pc->connection = c;[m
[31m-            pc->cached = 1;[m
[31m-[m
[31m-            /* we do not need to resume dp->name here because[m
[31m-             * it already takes the right value in the[m
[31m-             * ngx_http_upstream_drizzle_get_peer function */[m
[31m-[m
[31m-            dp->drizzle_con = item->drizzle_con;[m
[31m-            dp->has_set_names = item->has_set_names;[m
[31m-            dp->used = item->used;[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_drizzle_keepalive_free_peer(ngx_peer_connection_t *pc,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf, ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_uint_t                               status;[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-    ngx_queue_t                             *q;[m
[31m-    ngx_connection_t                        *c;[m
[31m-    ngx_http_upstream_t                     *u;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "drizzle: free keepalive peer");[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED) {[m
[31m-        dp->failed = 1;[m
[31m-    }[m
[31m-[m
[31m-    u = dp->upstream;[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    dd("dp failed: %d", (int) dp->failed);[m
[31m-    dd("pc->connection: %p", pc->connection);[m
[31m-    dd("status = %d", (int) status);[m
[31m-[m
[31m-    if (!dp->failed[m
[31m-        && pc->connection != NULL[m
[31m-        && (status == NGX_HTTP_NOT_FOUND[m
[31m-            || status == NGX_HTTP_GONE[m
[31m-            || (status == NGX_HTTP_OK && u->header_sent && u->length == 0)))[m
[31m-    {[m
[31m-        c = pc->connection;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "drizzle: free keepalive peer: saving connection %p",[m
[31m-                       c);[m
[31m-[m
[31m-        if (ngx_queue_empty(&dscf->free)) {[m
[31m-            /* connection pool is already full */[m
[31m-[m
[31m-            dd("caching connection forcibly and the pool is already full");[m
[31m-[m
[31m-            q = ngx_queue_last(&dscf->cache);[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                                  queue);[m
[31m-[m
[31m-            ngx_http_upstream_drizzle_free_connection(pc->log, item->connection,[m
[31m-                    item->drizzle_con, dscf);[m
[31m-[m
[31m-        } else {[m
[31m-            dd("caching idle connection to the pool");[m
[31m-[m
[31m-            q = ngx_queue_head(&dscf->free);[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            item = ngx_queue_data(q, ngx_http_drizzle_keepalive_cache_t,[m
[31m-                                  queue);[m
[31m-        }[m
[31m-[m
[31m-        item->connection = c;[m
[31m-        ngx_queue_insert_head(&dscf->cache, q);[m
[31m-[m
[31m-        pc->connection = NULL;[m
[31m-[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        c->write->handler = ngx_http_drizzle_keepalive_dummy_handler;[m
[31m-        c->read->handler = ngx_http_drizzle_keepalive_close_handler;[m
[31m-[m
[31m-        c->data = item;[m
[31m-        c->idle = 1;[m
[31m-        c->log = ngx_cycle->log;[m
[31m-        c->read->log = ngx_cycle->log;[m
[31m-        c->write->log = ngx_cycle->log;[m
[31m-[m
[31m-        item->socklen = pc->socklen;[m
[31m-        ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);[m
[31m-[m
[31m-        item->drizzle_con = dp->drizzle_con;[m
[31m-        item->has_set_names = dp->has_set_names;[m
[31m-[m
[31m-        item->name.data = dp->name.data;[m
[31m-        item->name.len = dp->name.len;[m
[31m-[m
[31m-        item->used = ++dp->used;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_drizzle_keepalive_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "drizzle: keepalive dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_drizzle_keepalive_close_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-    ngx_http_drizzle_keepalive_cache_t      *item;[m
[31m-[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "drizzle: keepalive close handler");[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {[m
[31m-        /* stale event */[m
[31m-[m
[31m-#if 0[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            goto close;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-close:[m
[31m-[m
[31m-    item = c->data;[m
[31m-    dscf = item->srv_conf;[m
[31m-[m
[31m-    dd("closing fd %d", c->fd);[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_free_connection(ev->log, c, item->drizzle_con,[m
[31m-                                              dscf);[m
[31m-[m
[31m-    ngx_queue_remove(&item->queue);[m
[31m-    ngx_queue_insert_head(&dscf->free, &item->queue);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.h[m
[1mdeleted file mode 100644[m
[1mindex 4891c7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_keepalive.h[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_KEEPALIVE_H[m
[31m-#define NGX_HTTP_DRIZZLE_KEEPALIVE_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t  *srv_conf;[m
[31m-[m
[31m-    ngx_queue_t                          queue;[m
[31m-[m
[31m-    ngx_connection_t                    *connection;[m
[31m-[m
[31m-    socklen_t                            socklen;[m
[31m-    struct sockaddr                      sockaddr;[m
[31m-    drizzle_con_st                      *drizzle_con;[m
[31m-    ngx_str_t                            name;[m
[31m-[m
[31m-    /* how many times this connection has been successfully used */[m
[31m-    ngx_uint_t                           used;[m
[31m-[m
[31m-    unsigned                             has_set_names:1;[m
[31m-[m
[31m-} ngx_http_drizzle_keepalive_cache_t;[m
[31m-[m
[31m-[m
[31m-char *ngx_http_upstream_drizzle_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-        void *conf);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_keepalive_init(ngx_pool_t *pool,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_keepalive_get_peer_single(ngx_peer_connection_t *pc,[m
[31m-        ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_keepalive_get_peer_multi(ngx_peer_connection_t *pc,[m
[31m-        ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf);[m
[31m-[m
[31m-void ngx_http_drizzle_keepalive_free_peer(ngx_peer_connection_t *pc,[m
[31m-        ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf,[m
[31m-        ngx_uint_t  state);[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_KEEPALIVE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.c[m
[1mdeleted file mode 100644[m
[1mindex 382303a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,569 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_handler.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include "ngx_http_drizzle_keepalive.h"[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_drizzle_tid_var_name =[m
[31m-        ngx_string("drizzle_thread_id");[m
[31m-[m
[31m-[m
[31m-/* Forward declaration */[m
[31m-[m
[31m-static char *ngx_http_drizzle_set_complex_value_slot(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_drizzle_query(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_drizzle_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_http_drizzle_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_drizzle_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_drizzle_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_drizzle_tid_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static char *ngx_http_drizzle_enable_status(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t ngx_http_drizzle_variables[] = {[m
[31m-[m
[31m-    { ngx_string("drizzle_thread_id"), NULL,[m
[31m-      ngx_http_drizzle_tid_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* config directives for module drizzle */[m
[31m-static ngx_command_t ngx_http_drizzle_cmds[] = {[m
[31m-    { ngx_string("drizzle_server"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_upstream_drizzle_server,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_keepalive"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_upstream_drizzle_keepalive,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_query"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_drizzle_query,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_dbname"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_drizzle_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, dbname),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_drizzle_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_send_query_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_recv_cols_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, recv_cols_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_recv_rows_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, recv_rows_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_module_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, enable_module_header),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-          |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_drizzle_loc_conf_t, buf_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("drizzle_status"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_drizzle_enable_status,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* Nginx HTTP subsystem module hooks */[m
[31m-static ngx_http_module_t ngx_http_drizzle_module_ctx = {[m
[31m-    NULL,    /* preconfiguration */[m
[31m-    NULL,    /* postconfiguration */[m
[31m-[m
[31m-    NULL,    /* create_main_conf */[m
[31m-    NULL,    /* merge_main_conf */[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_create_srv_conf,[m
[31m-             /* create_srv_conf */[m
[31m-    NULL,    /* merge_srv_conf */[m
[31m-[m
[31m-    ngx_http_drizzle_create_loc_conf,    /* create_loc_conf */[m
[31m-    ngx_http_drizzle_merge_loc_conf      /* merge_loc_conf */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_drizzle_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_drizzle_module_ctx,       /* module context */[m
[31m-    ngx_http_drizzle_cmds,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                    /* module type */[m
[31m-    NULL,    /* init master */[m
[31m-    NULL,    /* init module */[m
[31m-    NULL,    /* init process */[m
[31m-    NULL,    /* init thread */[m
[31m-    NULL,    /* exit thread */[m
[31m-    NULL,    /* exit process */[m
[31m-    NULL,    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_drizzle_http_method_t ngx_drizzle_http_methods[] = {[m
[31m-   { (u_char *) "GET",       (uint32_t) NGX_HTTP_GET },[m
[31m-   { (u_char *) "HEAD",      (uint32_t) NGX_HTTP_HEAD },[m
[31m-   { (u_char *) "POST",      (uint32_t) NGX_HTTP_POST },[m
[31m-   { (u_char *) "PUT",       (uint32_t) NGX_HTTP_PUT },[m
[31m-   { (u_char *) "DELETE",    (uint32_t) NGX_HTTP_DELETE },[m
[31m-   { (u_char *) "MKCOL",     (uint32_t) NGX_HTTP_MKCOL },[m
[31m-   { (u_char *) "COPY",      (uint32_t) NGX_HTTP_COPY },[m
[31m-   { (u_char *) "MOVE",      (uint32_t) NGX_HTTP_MOVE },[m
[31m-   { (u_char *) "OPTIONS",   (uint32_t) NGX_HTTP_OPTIONS },[m
[31m-   { (u_char *) "PROPFIND" , (uint32_t) NGX_HTTP_PROPFIND },[m
[31m-   { (u_char *) "PROPPATCH", (uint32_t) NGX_HTTP_PROPPATCH },[m
[31m-   { (u_char *) "LOCK",      (uint32_t) NGX_HTTP_LOCK },[m
[31m-   { (u_char *) "UNLOCK",    (uint32_t) NGX_HTTP_UNLOCK },[m
[31m-#if defined(nginx_version) && (nginx_version >= 8041)[m
[31m-   { (u_char *) "PATCH",     (uint32_t) NGX_HTTP_PATCH },[m
[31m-#endif[m
[31m-   { NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_drizzle_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t             *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_drizzle_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->recv_cols_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->recv_rows_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->enable_module_header = NGX_CONF_UNSET;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.ignore_client_abort = 0;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      conf->dbname = NULL[m
[31m-     *      conf->query  = NULL[m
[31m-     */[m
[31m-[m
[31m-    conf->complex_target = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->buf_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->tid_var_index = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_drizzle_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t *prev = parent;[m
[31m-    ngx_http_drizzle_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable_module_header,[m
[31m-                         prev->enable_module_header, 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->recv_cols_timeout,[m
[31m-                              prev->recv_cols_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->recv_rows_timeout,[m
[31m-                              prev->recv_rows_timeout, 60000);[m
[31m-[m
[31m-    if (conf->dbname == NULL) {[m
[31m-        conf->dbname = prev->dbname;[m
[31m-    }[m
[31m-[m
[31m-    if ((conf->default_query == NULL) && (conf->queries == NULL)) {[m
[31m-        conf->default_query = prev->default_query;[m
[31m-        conf->methods_set = prev->methods_set;[m
[31m-        conf->queries = prev->queries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buf_size, prev->buf_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    if (conf->tid_var_index == NGX_CONF_UNSET) {[m
[31m-        conf->tid_var_index = prev->tid_var_index;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_drizzle_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char                             *p = conf;[m
[31m-    ngx_http_complex_value_t        **field;[m
[31m-    ngx_str_t                        *value;[m
[31m-    ngx_http_compile_complex_value_t  ccv;[m
[31m-[m
[31m-    field = (ngx_http_complex_value_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*field) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *field = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-    if (*field == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_memzero(*field, sizeof(ngx_http_complex_value_t));[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = *field;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_drizzle_query(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_str_t                          sql = value[cf->args->nelts - 1];[m
[31m-    ngx_http_drizzle_loc_conf_t       *dlcf = conf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_drizzle_mixed_t               *query;[m
[31m-    ngx_drizzle_http_method_t         *method;[m
[31m-    ngx_uint_t                         methods, i;[m
[31m-[m
[31m-    if (sql.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "drizzle: empty value in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        /* default query */[m
[31m-        dd("default query");[m
[31m-[m
[31m-        if (dlcf->default_query != NULL) {[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-[m
[31m-        dlcf->default_query = ngx_pcalloc(cf->pool,[m
[31m-                                          sizeof(ngx_drizzle_mixed_t));[m
[31m-        if (dlcf->default_query == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        methods = 0xFFFF;[m
[31m-        query = dlcf->default_query;[m
[31m-[m
[31m-    } else {[m
[31m-        /* method-specific query */[m
[31m-        dd("method-specific query");[m
[31m-[m
[31m-        methods = 0;[m
[31m-[m
[31m-        for (i = 1; i < cf->args->nelts - 1; i++) {[m
[31m-            for (method = ngx_drizzle_http_methods; method->name; method++) {[m
[31m-                if (ngx_strcasecmp(value[i].data, method->name) == 0) {[m
[31m-                    /* correct method name */[m
[31m-                    if (dlcf->methods_set & method->key) {[m
[31m-                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                           "drizzle: \"%V\" directive"[m
[31m-                                           " for method \"%V\" is duplicate",[m
[31m-                                           &cmd->name, &value[i]);[m
[31m-[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    methods |= method->key;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "drizzle: invalid method \"%V\"", &value[i]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-[m
[31m-next:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (dlcf->queries == NULL) {[m
[31m-            dlcf->queries = ngx_array_create(cf->pool, 4,[m
[31m-                                             sizeof(ngx_drizzle_mixed_t));[m
[31m-            if (dlcf->queries == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        query = ngx_array_push(dlcf->queries);[m
[31m-        if (query == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(query, sizeof(ngx_drizzle_mixed_t));[m
[31m-[m
[31m-        dlcf->methods_set |= methods;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_variables_count(&sql)) {[m
[31m-        /* complex value */[m
[31m-        dd("complex value");[m
[31m-[m
[31m-        query->key = methods;[m
[31m-[m
[31m-        query->cv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (query->cv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &sql;[m
[31m-        ccv.complex_value = query->cv;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* simple value */[m
[31m-        dd("simple value");[m
[31m-[m
[31m-        query->key = methods;[m
[31m-        query->sv = sql;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_drizzle_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t             *dlcf = conf;[m
[31m-[m
[31m-    ngx_http_core_loc_conf_t                *clcf;[m
[31m-    ngx_str_t                               *value;[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-    ngx_url_t                                url;[m
[31m-    ngx_uint_t                               n;[m
[31m-[m
[31m-    if (dlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_drizzle_add_variables(cf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dlcf->tid_var_index = ngx_http_get_variable_index(cf,[m
[31m-                                              &ngx_http_drizzle_tid_var_name);[m
[31m-[m
[31m-    if (dlcf->tid_var_index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_drizzle_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-    if (n) {[m
[31m-        dlcf->complex_target = ngx_palloc(cf->pool,[m
[31m-                                          sizeof(ngx_http_complex_value_t));[m
[31m-        if (dlcf->complex_target == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = dlcf->complex_target;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    dlcf->complex_target = NULL;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url = value[1];[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    dlcf->upstream.upstream = ngx_http_upstream_add(cf, &url, 0);[m
[31m-[m
[31m-    if (dlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_drizzle_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_tid_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->data = (u_char *) "";[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_drizzle_enable_status(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t                *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_drizzle_status_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.h[m
[1mdeleted file mode 100644[m
[1mindex 4c15427..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_DRIZZLE_MODULE_H[m
[31m-#define NGX_HTTP_DRIZZLE_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-/* XXX nginx undefines "bool", which breaks the libdrizzle 1.0 API[m
[31m- * which makes use of "bool" */[m
[31m-#if defined(__GNUC__)[m
[31m-#   ifndef bool[m
[31m-#       define bool _Bool[m
[31m-#   endif[m
[31m-#endif[m
[31m-[m
[31m-#include <libdrizzle/drizzle_client.h>[m
[31m-[m
[31m-[m
[31m-#ifdef _WIN32[m
[31m-/* remove the bad macros defined in libdrizzle/drizzle.h */[m
[31m-#   undef close[m
[31m-#   undef snprintf[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_GONE[m
[31m-#define NGX_HTTP_GONE 410[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_http_drizzle_module_version 1009[m
[31m-#define ngx_http_drizzle_module_version_string \[m
[31m-    "0.1.7"[m
[31m-[m
[31m-extern ngx_module_t ngx_http_drizzle_module;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_str_t                           sv;[m
[31m-    ngx_http_complex_value_t           *cv;[m
[31m-} ngx_drizzle_mixed_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                             *name;[m
[31m-    uint32_t                            key;[m
[31m-} ngx_drizzle_http_method_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t             upstream;[m
[31m-[m
[31m-    /* drizzle database name */[m
[31m-    ngx_http_complex_value_t            *dbname;[m
[31m-[m
[31m-    /* SQL query to be executed */[m
[31m-    ngx_drizzle_mixed_t                 *default_query;[m
[31m-    ngx_uint_t                           methods_set;[m
[31m-    ngx_array_t                         *queries;[m
[31m-[m
[31m-    ngx_msec_t                           recv_cols_timeout;[m
[31m-    ngx_msec_t                           recv_rows_timeout;[m
[31m-[m
[31m-    ngx_flag_t                           enable_module_header;[m
[31m-[m
[31m-    /* for quoting */[m
[31m-    ngx_array_t                         *vars_to_quote;[m
[31m-                /* of ngx_http_drizzle_var_to_quote_t */[m
[31m-[m
[31m-    ngx_array_t                         *user_types;[m
[31m-                /* of ngx_http_drizzle_var_type_t */[m
[31m-[m
[31m-    ngx_http_complex_value_t            *complex_target;[m
[31m-[m
[31m-    size_t                               buf_size;[m
[31m-[m
[31m-    ngx_int_t                            tid_var_index; /* thread id variable[m
[31m-                                                           index */[m
[31m-} ngx_http_drizzle_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-typedef struct {[m
[31m-    ngx_int_t                           status;[m
[31m-} ngx_http_drizzle_ctx_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* states for the drizzle client state machine */[m
[31m-typedef enum {[m
[31m-    state_db_connect,[m
[31m-    state_db_send_query,[m
[31m-    state_db_recv_cols,[m
[31m-    state_db_recv_rows,[m
[31m-    state_db_idle[m
[31m-[m
[31m-} ngx_http_drizzle_state_t;[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.c[m
[1mdeleted file mode 100644[m
[1mindex 34e43ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.c[m
[1m+++ /dev/null[m
[36m@@ -1,787 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_output.h"[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_key "X-Resty-DBD-Module"[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_key_len  \[m
[31m-    (sizeof(ngx_http_drizzle_module_header_key) - 1)[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_val \[m
[31m-    "ngx_drizzle " \[m
[31m-      ngx_http_drizzle_module_version_string[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_val_len \[m
[31m-    (sizeof(ngx_http_drizzle_module_header_val) - 1)[m
[31m-[m
[31m-#define ngx_http_drizzle_module_header_key_len  \[m
[31m-    (sizeof(ngx_http_drizzle_module_header_key) - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_drizzle_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp);[m
[31m-static u_char *ngx_http_drizzle_get_postponed(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len);[m
[31m-static rds_col_type_t ngx_http_drizzle_std_col_type([m
[31m-    drizzle_column_type_t col_type);[m
[31m-static u_char *ngx_http_drizzle_request_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len);[m
[31m-static ngx_int_t ngx_http_drizzle_submit_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_result_header(ngx_http_request_t *r,[m
[31m-    drizzle_result_st *res)[m
[31m-{[m
[31m-    u_char                          *pos, *last;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_upstream_t             *u = r->upstream;[m
[31m-    const char                      *errstr;[m
[31m-    size_t                           size;[m
[31m-    uint16_t                         errstr_len;[m
[31m-    uint16_t                         col_count;[m
[31m-    uint16_t                         errcode;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = u->peer.data;[m
[31m-[m
[31m-    errcode = drizzle_result_error_code(res);[m
[31m-[m
[31m-    if (dp->enable_charset && ! dp->has_set_names) {[m
[31m-        if (errcode != 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "drizzle: FATAL: failed to set names 'utf8' "[m
[31m-                          "(error %d)", (int) errcode);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (dp->drizzle_con && dp->drizzle_res.con) {[m
[31m-            dd("before drizzle result free");[m
[31m-            dd("%p vs. %p", dp->drizzle_res.con, dp->drizzle_con);[m
[31m-[m
[31m-            drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-            dd("after drizzle result free");[m
[31m-        }[m
[31m-[m
[31m-        /* ngx_http_upstream_drizzle_done(r, u, dp, NGX_OK); */[m
[31m-        dd("returning DONE when set names");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    errstr = drizzle_result_error(res);[m
[31m-[m
[31m-    errstr_len = (uint16_t) ngx_strlen(errstr);[m
[31m-[m
[31m-    col_count = drizzle_result_column_count(res);[m
[31m-[m
[31m-    size = sizeof(uint8_t)        /* endian type */[m
[31m-           + sizeof(uint32_t)     /* format version */[m
[31m-           + sizeof(uint8_t)      /* result type */[m
[31m-[m
[31m-           + sizeof(uint16_t)     /* standard error code */[m
[31m-           + sizeof(uint16_t)     /* driver-specific error code */[m
[31m-[m
[31m-           + sizeof(uint16_t)     /* driver-specific errstr len */[m
[31m-           + errstr_len           /* driver-specific errstr data */[m
[31m-           + sizeof(uint64_t)     /* rows affected */[m
[31m-           + sizeof(uint64_t)     /* insert id */[m
[31m-           + sizeof(uint16_t);    /* column count */[m
[31m-[m
[31m-    pos = ngx_http_drizzle_request_mem(r, dp, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-#if NGX_HAVE_LITTLE_ENDIAN[m
[31m-    *last++ = 0;[m
[31m-#else /* big endian */[m
[31m-    *last++ = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /* RDS format version */[m
[31m-[m
[31m-    *(uint32_t *) last = (uint32_t) resty_dbd_stream_version;[m
[31m-    last += sizeof(uint32_t);[m
[31m-[m
[31m-    /* result type fixed to 0 */[m
[31m-    *last++ = 0;[m
[31m-[m
[31m-    /* standard error code[m
[31m-     * FIXME: define the standard error code set and map[m
[31m-     * libdrizzle's to it. */[m
[31m-    *(uint16_t *) last = errcode;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-     /* driver-specific error code */[m
[31m-    *(uint16_t *) last = drizzle_result_error_code(res);[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* driver-specific errstr len */[m
[31m-    *(uint16_t *) last = errstr_len;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* driver-specific errstr data */[m
[31m-    if (errstr_len) {[m
[31m-        last = ngx_copy(last, (u_char *) errstr, errstr_len);[m
[31m-    }[m
[31m-[m
[31m-    /* affected rows */[m
[31m-    *(uint64_t *) last = drizzle_result_affected_rows(res);[m
[31m-    last += sizeof(uint64_t);[m
[31m-[m
[31m-    /* insert id */[m
[31m-    *(uint64_t *) last = drizzle_result_insert_id(res);[m
[31m-    last += sizeof(uint64_t);[m
[31m-[m
[31m-    /* column count */[m
[31m-    *(uint16_t *) last = col_count;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "drizzle: FATAL: output result header buffer error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (col_count == 0) {[m
[31m-        dd("Col count is ZERO");[m
[31m-[m
[31m-        /* we suppress row terminator here when there's no columns */[m
[31m-        dp->seen_stream_end = 1;[m
[31m-[m
[31m-        rc = ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("about to be done...");[m
[31m-        ngx_http_upstream_drizzle_done(r, u, dp, NGX_DONE);[m
[31m-        dd("i am returning DONE");[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_bufs(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp)[m
[31m-{[m
[31m-    ngx_http_upstream_t                    *u = r->upstream;[m
[31m-    ngx_int_t                               rc;[m
[31m-    ngx_str_t                               key, value;[m
[31m-    ngx_http_drizzle_loc_conf_t            *dlcf;[m
[31m-    ngx_chain_t                            *cl;[m
[31m-[m
[31m-    dd("enter");[m
[31m-    dd_dump_chain_size();[m
[31m-[m
[31m-    if (dp->seen_stream_end) {[m
[31m-        dp->seen_stream_end = 0;[m
[31m-[m
[31m-        if (dp->avail_out) {[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = dp->out_buf;[m
[31m-            cl->next = NULL;[m
[31m-            *dp->last_out = cl;[m
[31m-            dp->last_out = &cl->next;[m
[31m-[m
[31m-            dp->avail_out = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!u->header_sent && u->out_bufs) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-[m
[31m-        r->headers_out.status = NGX_HTTP_OK;[m
[31m-[m
[31m-        /* set the Content-Type header */[m
[31m-        r->headers_out.content_type.data = (u_char *) rds_content_type;[m
[31m-        r->headers_out.content_type.len = rds_content_type_len;[m
[31m-        r->headers_out.content_type_len = rds_content_type_len;[m
[31m-        r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-        dlcf = ngx_http_get_module_loc_conf(r, ngx_http_drizzle_module);[m
[31m-[m
[31m-        if (dlcf->enable_module_header) {[m
[31m-            /* set the X-Resty-DBD-Module header */[m
[31m-[m
[31m-            key.data = (u_char *) ngx_http_drizzle_module_header_key;[m
[31m-            key.len  = ngx_http_drizzle_module_header_key_len;[m
[31m-[m
[31m-            value.data = (u_char *) ngx_http_drizzle_module_header_val;[m
[31m-            value.len = ngx_http_drizzle_module_header_val_len;[m
[31m-[m
[31m-            rc = ngx_http_drizzle_set_header(r, &key, &value);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_send_header(r);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        u->header_sent = 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (u->out_bufs == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        {[m
[31m-            int              n;[m
[31m-            ngx_chain_t     *cl;[m
[31m-[m
[31m-            for (n = 0, cl = u->out_bufs; cl; cl = cl->next, n++) {[m
[31m-            }[m
[31m-[m
[31m-            fprintf(stderr, "XXX chain size: %d\n", n);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        rc = ngx_http_output_filter(r, u->out_bufs);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs,[m
[31m-                                &u->out_bufs, u->output.tag);[m
[31m-#else[m
[31m-        ngx_chain_update_chains(&u->free_bufs, &u->busy_bufs, &u->out_bufs,[m
[31m-                                u->output.tag);[m
[31m-#endif[m
[31m-[m
[31m-        dp->last_out = &u->out_bufs;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_col(ngx_http_request_t *r, drizzle_column_st *col)[m
[31m-{[m
[31m-    u_char                              *pos, *last;[m
[31m-    ngx_http_upstream_t                 *u = r->upstream;[m
[31m-    drizzle_column_type_t                col_type = 0;[m
[31m-    uint16_t                             std_col_type = 0;[m
[31m-    const char                          *col_name = NULL;[m
[31m-    uint16_t                             col_name_len = 0;[m
[31m-    size_t                               size;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = u->peer.data;[m
[31m-[m
[31m-    if (col == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    col_type = drizzle_column_type(col);[m
[31m-    col_name = drizzle_column_name(col);[m
[31m-    col_name_len = (uint16_t) strlen(col_name);[m
[31m-[m
[31m-    size = sizeof(uint16_t)     /* std col type */[m
[31m-           + sizeof(uint16_t)     /* driver-specific col type */[m
[31m-           + sizeof(uint16_t)     /* col name str len */[m
[31m-           + col_name_len;        /* col name str len */[m
[31m-[m
[31m-    pos = ngx_http_drizzle_request_mem(r, dp, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* std column type */[m
[31m-[m
[31m-    std_col_type = (uint16_t) ngx_http_drizzle_std_col_type(col_type);[m
[31m-[m
[31m-#if 0[m
[31m-    dd("std col type for %s: %d, %d (%d, %d, %d)",[m
[31m-            col_name, std_col_type, rds_col_type_blob,[m
[31m-            rds_rough_col_type_str,[m
[31m-            rds_rough_col_type_str << 14,[m
[31m-            (uint16_t) (19 | (rds_rough_col_type_str << 14))[m
[31m-            );[m
[31m-#endif[m
[31m-[m
[31m-    *(uint16_t *) last = std_col_type;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* drizzle column type */[m
[31m-    *(uint16_t *) last = col_type;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* column name string length */[m
[31m-    *(uint16_t *) last = col_name_len;[m
[31m-    last += sizeof(uint16_t);[m
[31m-[m
[31m-    /* column name string data */[m
[31m-    last = ngx_copy(last, col_name, col_name_len);[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "drizzle: FATAL: output column buffer error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_row(ngx_http_request_t *r, uint64_t row)[m
[31m-{[m
[31m-    u_char                              *pos, *last;[m
[31m-    ngx_http_upstream_t                 *u = r->upstream;[m
[31m-    size_t                               size;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = u->peer.data;[m
[31m-[m
[31m-    size = sizeof(uint8_t);[m
[31m-[m
[31m-    pos = ngx_http_drizzle_request_mem(r, dp, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-    *last++ = (row != 0);[m
[31m-[m
[31m-    if (row == 0) {[m
[31m-        dp->seen_stream_end = 1;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_output_field(ngx_http_request_t *r, size_t offset,[m
[31m-    size_t len, size_t total, drizzle_field_t field)[m
[31m-{[m
[31m-    u_char                              *pos, *last;[m
[31m-    ngx_http_upstream_t                 *u = r->upstream;[m
[31m-    size_t                               size = 0;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = u->peer.data;[m
[31m-[m
[31m-    if (offset == 0) {[m
[31m-[m
[31m-        if (len == 0 && total != 0) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        size = sizeof(uint32_t);     /* field total length */[m
[31m-    }[m
[31m-[m
[31m-    /* (more) field data */[m
[31m-    size += (uint32_t) len;[m
[31m-[m
[31m-    /* request memory */[m
[31m-[m
[31m-    pos = ngx_http_drizzle_request_mem(r, dp, size);[m
[31m-    if (pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = pos;[m
[31m-[m
[31m-    /* fill in the buffer */[m
[31m-[m
[31m-    if (offset == 0) {[m
[31m-        /* field total length */[m
[31m-        if (field == NULL) {[m
[31m-            *(uint32_t *) last = (uint32_t) -1;[m
[31m-[m
[31m-        } else {[m
[31m-            *(uint32_t *) last = (uint32_t) total;[m
[31m-        }[m
[31m-[m
[31m-        last += sizeof(uint32_t);[m
[31m-    }[m
[31m-[m
[31m-    /* field data */[m
[31m-    if (len && field) {[m
[31m-        last = ngx_copy(last, field, (uint32_t) len);[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (last - pos) != size) {[m
[31m-        dd("offset %d, len %d, size %d", (int) offset,[m
[31m-           (int) len, (int) size);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "drizzle: FATAL: output field buffer error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_drizzle_submit_mem(r, dp, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static rds_col_type_t[m
[31m-ngx_http_drizzle_std_col_type(drizzle_column_type_t col_type)[m
[31m-{[m
[31m-    dd("drizzle col type: %d", col_type);[m
[31m-[m
[31m-    switch (col_type) {[m
[31m-    case DRIZZLE_COLUMN_TYPE_DECIMAL:[m
[31m-        return rds_col_type_decimal;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_TINY:[m
[31m-        return rds_col_type_smallint;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_SHORT:[m
[31m-        return rds_col_type_smallint;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_LONG:[m
[31m-        return rds_col_type_integer;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_FLOAT:[m
[31m-        return rds_col_type_real;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_DOUBLE:[m
[31m-        return rds_col_type_double;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_NULL:[m
[31m-        return rds_col_type_unknown;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_TIMESTAMP:[m
[31m-        return rds_col_type_timestamp;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_LONGLONG:[m
[31m-        return rds_col_type_bigint;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_INT24:[m
[31m-        return rds_col_type_integer;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_DATE:[m
[31m-        return rds_col_type_timestamp;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_TIME:[m
[31m-        return rds_col_type_time;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_DATETIME:[m
[31m-        return rds_col_type_timestamp;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_YEAR:[m
[31m-        return rds_col_type_smallint;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_NEWDATE:[m
[31m-        return rds_col_type_timestamp;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_VARCHAR:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_BIT:[m
[31m-        return rds_col_type_bit;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_NEWDECIMAL:[m
[31m-        return rds_col_type_decimal;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_ENUM:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_SET:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_TINY_BLOB:[m
[31m-        return rds_col_type_blob;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_MEDIUM_BLOB:[m
[31m-        return rds_col_type_blob;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_LONG_BLOB:[m
[31m-        return rds_col_type_blob;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_BLOB:[m
[31m-        return rds_col_type_blob;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_VAR_STRING:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_STRING:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    case DRIZZLE_COLUMN_TYPE_GEOMETRY:[m
[31m-        return rds_col_type_varchar;[m
[31m-[m
[31m-    default:[m
[31m-        return rds_col_type_unknown;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_drizzle_request_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    u_char                  *p;[m
[31m-[m
[31m-    rc = ngx_http_drizzle_get_buf(r, dp);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (dp->avail_out < len) {[m
[31m-        p = ngx_http_drizzle_get_postponed(r, dp, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        dp->postponed.pos = p;[m
[31m-        dp->postponed.last = p + len;[m
[31m-[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return dp->out_buf->last;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t         *conf = dp->loc_conf;[m
[31m-    ngx_http_upstream_t                 *u = dp->upstream;[m
[31m-[m
[31m-    dd("MEM enter");[m
[31m-[m
[31m-    if (dp->avail_out) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->free_bufs) {[m
[31m-        dd("MEM reusing temp buf from free_bufs");[m
[31m-[m
[31m-        dp->out_buf = u->free_bufs->buf;[m
[31m-        u->free_bufs = u->free_bufs->next;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("MEM creating temp buf with size: %d", (int) conf->buf_size);[m
[31m-        dp->out_buf = ngx_create_temp_buf(r->pool,[m
[31m-                conf->buf_size);[m
[31m-[m
[31m-        if (dp->out_buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dp->out_buf->tag = (ngx_buf_tag_t) &ngx_http_drizzle_module;[m
[31m-        dp->out_buf->recycled = 1;[m
[31m-    }[m
[31m-[m
[31m-    dp->avail_out = conf->buf_size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_drizzle_get_postponed(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len)[m
[31m-{[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    dd("MEM enter");[m
[31m-[m
[31m-    if (dp->cached.start == NULL) {[m
[31m-        goto alloc;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (dp->cached.end - dp->cached.start) < len) {[m
[31m-        ngx_pfree(r->pool, dp->cached.start);[m
[31m-        goto alloc;[m
[31m-    }[m
[31m-[m
[31m-    return dp->cached.start;[m
[31m-[m
[31m-alloc:[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dp->cached.start = p;[m
[31m-    dp->cached.end = p + len;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_submit_mem(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_drizzle_peer_data_t *dp, size_t len)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_int_t                rc;[m
[31m-    size_t                   postponed_len;[m
[31m-[m
[31m-    ngx_http_drizzle_loc_conf_t         *conf = dp->loc_conf;[m
[31m-[m
[31m-    if (dp->postponed.pos != NULL) {[m
[31m-        dd("MEM copy postponed data over to u->out_bufs for len %d", (int) len);[m
[31m-[m
[31m-        postponed_len = dp->postponed.last - dp->postponed.pos;[m
[31m-[m
[31m-        if (postponed_len > dp->avail_out) {[m
[31m-            /* we should ensure that rds atoms do not get[m
[31m-             * splitted into multiple bufs. */[m
[31m-[m
[31m-            if (dp->out_buf && dp->out_buf->pos != dp->out_buf->last) {[m
[31m-                /* save the current dp->out_buf */[m
[31m-                cl = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf = dp->out_buf;[m
[31m-                cl->next = NULL;[m
[31m-                *dp->last_out = cl;[m
[31m-                dp->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            /* create a buf for the postponed buf */[m
[31m-[m
[31m-            len = postponed_len > conf->buf_size ?[m
[31m-                postponed_len : conf->buf_size;[m
[31m-[m
[31m-            dp->out_buf = ngx_create_temp_buf(r->pool, len);[m
[31m-[m
[31m-            if (dp->out_buf == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            dp->out_buf->tag = (ngx_buf_tag_t) &ngx_http_drizzle_module;[m
[31m-            dp->out_buf->recycled = 1;[m
[31m-[m
[31m-            dp->out_buf->last = ngx_copy(dp->out_buf->last, dp->postponed.pos,[m
[31m-                                         postponed_len);[m
[31m-[m
[31m-            dp->avail_out = len - postponed_len;[m
[31m-[m
[31m-            dp->postponed.pos = NULL;[m
[31m-[m
[31m-            if (dp->avail_out == 0) {[m
[31m-                /* save the new big buf */[m
[31m-[m
[31m-                cl = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf = dp->out_buf;[m
[31m-                cl->next = NULL;[m
[31m-                *dp->last_out = cl;[m
[31m-                dp->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            len = dp->postponed.last - dp->postponed.pos;[m
[31m-            if (len > dp->avail_out) {[m
[31m-                len = dp->avail_out;[m
[31m-            }[m
[31m-[m
[31m-            dp->out_buf->last = ngx_copy(dp->out_buf->last,[m
[31m-                    dp->postponed.pos, len);[m
[31m-[m
[31m-            dp->avail_out -= len;[m
[31m-[m
[31m-            dp->postponed.pos += len;[m
[31m-[m
[31m-            if (dp->postponed.pos == dp->postponed.last) {[m
[31m-                dp->postponed.pos = NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (dp->avail_out > 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            dd("MEM save dp->out_buf");[m
[31m-[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = dp->out_buf;[m
[31m-            cl->next = NULL;[m
[31m-            *dp->last_out = cl;[m
[31m-            dp->last_out = &cl->next;[m
[31m-[m
[31m-            if (dp->postponed.pos == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_drizzle_get_buf(r, dp);[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("MEM consuming out_buf for %d", (int) len);[m
[31m-[m
[31m-    dp->out_buf->last += len;[m
[31m-    dp->avail_out -= len;[m
[31m-[m
[31m-    if (dp->avail_out == 0) {[m
[31m-        dd("MEM save dp->out_buf");[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = dp->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *dp->last_out = cl;[m
[31m-        dp->last_out = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.h[m
[1mdeleted file mode 100644[m
[1mindex 5952bdc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_output.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_OUTPUT_H[m
[31m-#define NGX_HTTP_DRIZZLE_OUTPUT_H[m
[31m-[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_result_header(ngx_http_request_t *r,[m
[31m-        drizzle_result_st *res);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_col(ngx_http_request_t *r,[m
[31m-        drizzle_column_st *res);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_row(ngx_http_request_t *r, uint64_t row);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_field(ngx_http_request_t *r, size_t offset,[m
[31m-        size_t len, size_t total, drizzle_field_t field);[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_output_bufs(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_drizzle_peer_data_t *dp);[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_OUTPUT_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.c[m
[1mdeleted file mode 100644[m
[1mindex 6adc74b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.c[m
[1m+++ /dev/null[m
[36m@@ -1,552 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include "ngx_http_drizzle_output.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-[m
[31m-[m
[31m-#define MYSQL_ER_NO_SUCH_TABLE 1146[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_connect(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc);[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_send_query(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc);[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_recv_cols(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc);[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_recv_rows(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_process_events(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t                         *u;[m
[31m-    ngx_connection_t                            *c;[m
[31m-    ngx_http_upstream_drizzle_peer_data_t       *dp;[m
[31m-    drizzle_con_st                              *dc;[m
[31m-    ngx_int_t                                    rc;[m
[31m-#if 0[m
[31m-    drizzle_return_t                             ret;[m
[31m-#endif[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    dp = u->peer.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "drizzle process events, state: %d", dp->state);[m
[31m-[m
[31m-    if (!ngx_http_upstream_drizzle_is_my_peer(&u->peer)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "process events: it seems you "[m
[31m-                      "are using a non-drizzle upstream backend"[m
[31m-        );[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dc = dp->drizzle_con;[m
[31m-[m
[31m-    switch (dp->state) {[m
[31m-    case state_db_connect:[m
[31m-        rc = ngx_http_upstream_drizzle_connect(r, c, dp, dc);[m
[31m-        break;[m
[31m-[m
[31m-    case state_db_idle: /* from connection pool */[m
[31m-        c->log->action = "sending query to drizzle upstream";[m
[31m-[m
[31m-    case state_db_send_query:[m
[31m-        rc = ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-        break;[m
[31m-[m
[31m-    case state_db_recv_cols:[m
[31m-        rc = ngx_http_upstream_drizzle_recv_cols(r, c, dp, dc);[m
[31m-        break;[m
[31m-[m
[31m-    case state_db_recv_rows:[m
[31m-        rc = ngx_http_upstream_drizzle_recv_rows(r, c, dp, dc);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "unknown state: %d", (int) dp->state);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("rc == %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u, rc);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-#if 0[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        rc = ngx_http_drizzle_output_bufs(r, dp);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_connect(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc)[m
[31m-{[m
[31m-    drizzle_return_t             ret;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "drizzle connect: user %s, password %s", dc->user,[m
[31m-                   dc->password);[m
[31m-[m
[31m-    ret = drizzle_con_connect(dc);[m
[31m-[m
[31m-    if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "drizzle libdrizzle returned IO_WAIT while "[m
[31m-                       "connecting");[m
[31m-[m
[31m-#if 0[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ret != DRIZZLE_RETURN_OK) {[m
[31m-       ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to connect: %d: %s",[m
[31m-                     (int) ret, drizzle_error(dc->drizzle));[m
[31m-[m
[31m-       return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-    c->log->action = "sending query to drizzle upstream";[m
[31m-[m
[31m-    return ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_send_query(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc)[m
[31m-{[m
[31m-    ngx_http_upstream_t         *u = r->upstream;[m
[31m-    drizzle_return_t             ret;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    query;[m
[31m-    ngx_flag_t                   has_set_names = 0;[m
[31m-    ngx_flag_t                   enable_charset = 0;[m
[31m-[m
[31m-    dd("enable charset: %d", (int) dp->enable_charset);[m
[31m-[m
[31m-    if (dp->enable_charset && ! dp->has_set_names) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "drizzle enables connection charset setting");[m
[31m-[m
[31m-        query.len = dp->set_names_query->len;[m
[31m-        query.data = dp->set_names_query->data;[m
[31m-[m
[31m-    } else {[m
[31m-        query.data = dp->query.data;[m
[31m-        query.len = dp->query.len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "drizzle sending query \"%V\"", &query);[m
[31m-[m
[31m-    (void) drizzle_query(dc, &dp->drizzle_res, (const char *) query.data,[m
[31m-                         query.len, &ret);[m
[31m-[m
[31m-    if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "drizzle libdrizzle returned IO_WAIT while sending "[m
[31m-                       "query");[m
[31m-[m
[31m-        if (dp->state != state_db_send_query) {[m
[31m-            dp->state = state_db_send_query;[m
[31m-[m
[31m-            if (c->write->timer_set) {[m
[31m-                ngx_del_timer(c->write);[m
[31m-            }[m
[31m-[m
[31m-            ngx_add_timer(c->write, u->conf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ret != DRIZZLE_RETURN_OK) {[m
[31m-#if 1[m
[31m-        if (ret == DRIZZLE_RETURN_ERROR_CODE) {[m
[31m-            if (drizzle_error_code(dc->drizzle) == MYSQL_ER_NO_SUCH_TABLE) {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, c->log, 0,[m
[31m-                              "failed to send query: %i (%d): %s",[m
[31m-                              ret, drizzle_error_code(dc->drizzle),[m
[31m-                              drizzle_error(dc->drizzle));[m
[31m-[m
[31m-                if (dp->enable_charset && ! dp->has_set_names) {[m
[31m-                    c->log->action = "sending query to drizzle upstream";[m
[31m-                    dp->has_set_names = 1;[m
[31m-[m
[31m-                    return ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_upstream_drizzle_done(r, u, dp, NGX_HTTP_GONE);[m
[31m-[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "failed to send query: %d (%d): %s",[m
[31m-                      (int) ret, drizzle_error_code(dc->drizzle),[m
[31m-                      drizzle_error(dc->drizzle));[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-    dd_drizzle_result(&dp->drizzle_res);[m
[31m-[m
[31m-    dd("after drizzle restult");[m
[31m-[m
[31m-    if (dp->enable_charset) {[m
[31m-        enable_charset = 1;[m
[31m-    }[m
[31m-[m
[31m-    has_set_names = dp->has_set_names;[m
[31m-[m
[31m-    rc = ngx_http_drizzle_output_result_header(r, &dp->drizzle_res);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        if (enable_charset && ! has_set_names) {[m
[31m-            c->log->action = "sending query to drizzle upstream";[m
[31m-            dp->has_set_names = 1;[m
[31m-[m
[31m-            dp->state = state_db_idle;[m
[31m-[m
[31m-            return ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-        }[m
[31m-[m
[31m-        /* no data set following the header */[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "receiving result set columns from drizzle upstream";[m
[31m-[m
[31m-    return ngx_http_upstream_drizzle_recv_cols(r, c, dp, dc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_recv_cols(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc)[m
[31m-{[m
[31m-    drizzle_column_st               *col;[m
[31m-    ngx_int_t                        rc;[m
[31m-    drizzle_return_t                 ret;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "drizzle receive resultset columns");[m
[31m-[m
[31m-    for (;;) {[m
[31m-        col = drizzle_column_read(&dp->drizzle_res, &dp->drizzle_col, &ret);[m
[31m-[m
[31m-        if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-[m
[31m-            if (dp->state != state_db_recv_cols) {[m
[31m-                dp->state = state_db_recv_cols;[m
[31m-[m
[31m-                if (c->read->timer_set) {[m
[31m-                    ngx_del_timer(c->read);[m
[31m-                }[m
[31m-[m
[31m-                ngx_add_timer(c->read, dp->loc_conf->recv_cols_timeout);[m
[31m-[m
[31m-            }[m
[31m-[m
[31m-#if 0[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (ret != DRIZZLE_RETURN_OK) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "failed to recv cols: %d: %s",[m
[31m-                          (int) ret,[m
[31m-                          drizzle_error(dc->drizzle));[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-        if (col) {[m
[31m-            rc = ngx_http_drizzle_output_col(r, col);[m
[31m-[m
[31m-            drizzle_column_free(col);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-        } else { /* after the last column */[m
[31m-            if (c->read->timer_set) {[m
[31m-                ngx_del_timer(c->read);[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "receiving result set rows from drizzle "[m
[31m-                             "upstream";[m
[31m-[m
[31m-            return ngx_http_upstream_drizzle_recv_rows(r, c, dp, dc);[m
[31m-        }[m
[31m-[m
[31m-        dd_drizzle_column(col);[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_recv_rows(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    drizzle_con_st *dc)[m
[31m-{[m
[31m-    ngx_http_upstream_t             *u = r->upstream;[m
[31m-    ngx_int_t                        rc;[m
[31m-    drizzle_return_t                 ret;[m
[31m-    size_t                           offset;[m
[31m-    size_t                           len;[m
[31m-    size_t                           total;[m
[31m-    drizzle_field_t                  field;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "drizzle receive resultset rows");[m
[31m-[m
[31m-    for (;;) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "drizzle receive resultset row %uL", dp->drizzle_row);[m
[31m-[m
[31m-        if (dp->drizzle_row == 0) {[m
[31m-            dp->drizzle_row = drizzle_row_read(&dp->drizzle_res, &ret);[m
[31m-[m
[31m-            if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-                dp->drizzle_row = 0;[m
[31m-[m
[31m-                goto io_wait;[m
[31m-            }[m
[31m-[m
[31m-            if (ret != DRIZZLE_RETURN_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "failed to read row: %d: %s",[m
[31m-                              (int) ret,[m
[31m-                              drizzle_error(dc->drizzle));[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-            rc = ngx_http_drizzle_output_row(r, dp->drizzle_row);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (dp->drizzle_row == 0) {[m
[31m-                /* after last row */[m
[31m-[m
[31m-                drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-                if (c->read->timer_set) {[m
[31m-                    ngx_del_timer(c->read);[m
[31m-                }[m
[31m-[m
[31m-                if (dp->enable_charset && ! dp->has_set_names) {[m
[31m-                    c->log->action = "sending query to drizzle upstream";[m
[31m-                    dp->has_set_names = 1;[m
[31m-[m
[31m-                    return ngx_http_upstream_drizzle_send_query(r, c, dp, dc);[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_upstream_drizzle_done(r, u, dp, NGX_DONE);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* dp->drizzle_row != 0 */[m
[31m-[m
[31m-        for (;;) {[m
[31m-            field = drizzle_field_read(&dp->drizzle_res, &offset, &len,[m
[31m-                                       &total, &ret);[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "drizzle field read: %p (offset %z, len %z)",[m
[31m-                           field, offset, len);[m
[31m-[m
[31m-            if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-                goto io_wait;[m
[31m-            }[m
[31m-[m
[31m-            if (ret == DRIZZLE_RETURN_ROW_END) {[m
[31m-                /* reached the end of the current row */[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ret != DRIZZLE_RETURN_OK) {[m
[31m-                drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "failed to read row field: %d: %s",[m
[31m-                              (int) ret,[m
[31m-                              drizzle_error(dc->drizzle));[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-            rc = ngx_http_drizzle_output_field(r, offset, len, total, field);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (field) {[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                               "drizzle field value read: %*s", len, field);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dp->drizzle_row = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-[m
[31m-io_wait:[m
[31m-[m
[31m-    if (dp->state != state_db_recv_rows) {[m
[31m-        dp->state = state_db_recv_rows;[m
[31m-[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(c->read, dp->loc_conf->recv_rows_timeout);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_drizzle_done(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-    ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "drizzle upstream done");[m
[31m-[m
[31m-    (void) ngx_http_drizzle_output_bufs(r, dp);[m
[31m-[m
[31m-    /* to persuade Maxim Dounin's ngx_http_upstream_keepalive[m
[31m-     * module to cache the current connection */[m
[31m-[m
[31m-    u->length = 0;[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        u->header_sent = 1;[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-        rc = NGX_OK;[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_out.status = rc;[m
[31m-        u->headers_in.status_n = rc;[m
[31m-    }[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    c->log->action = "being idle";[m
[31m-[m
[31m-    /* reset the state machine */[m
[31m-    dp->state = state_db_idle;[m
[31m-[m
[31m-    dd("about to finalize request...");[m
[31m-    ngx_http_upstream_drizzle_finalize_request(r, u, rc);[m
[31m-    dd("after finalize request...");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.h[m
[1mdeleted file mode 100644[m
[1mindex cb9ff09..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_processor.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_PROCESSOR_H[m
[31m-#define NGX_HTTP_DRIZZLE_PROCESSOR_H[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_drizzle_process_events(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_upstream_drizzle_done(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u, ngx_http_upstream_drizzle_peer_data_t *dp,[m
[31m-        ngx_int_t rc);[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_PROCESSOR_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.c[m
[1mdeleted file mode 100644[m
[1mindex 33eb625..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.c[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_quoting.h"[m
[31m-#include "ngx_http_drizzle_checker.h"[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-/* static */ ngx_http_drizzle_var_type_t  ngx_http_drizzle_builtin_types[] = {[m
[31m-    { ngx_string("string"),[m
[31m-      NULL,[m
[31m-      NULL,[m
[31m-      quotes_type_single[m
[31m-    },[m
[31m-    { ngx_string("int"),[m
[31m-      ngx_http_drizzle_check_int,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("bool"),[m
[31m-      ngx_http_drizzle_check_bool,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("float"),[m
[31m-      ngx_http_drizzle_check_float,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("column"),[m
[31m-      ngx_http_drizzle_check_col,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("table"),[m
[31m-      ngx_http_drizzle_check_table,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    },[m
[31m-    { ngx_string("keyword"),[m
[31m-      ngx_http_drizzle_check_keyword,[m
[31m-      NULL,[m
[31m-      quotes_type_none[m
[31m-    }[m
[31m-};[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.h[m
[1mdeleted file mode 100644[m
[1mindex 6ffe821..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_quoting.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_QUOTING_H[m
[31m-#define NGX_HTTP_DRIZZLE_QUOTING_H[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-[m
[31m-typedef ngx_int_t (* ngx_http_drizzle_type_checker_pt) (ngx_str_t *value,[m
[31m-        void *data);[m
[31m-[m
[31m-typedef enum {[m
[31m-    quotes_type_none,[m
[31m-    quotes_type_single,[m
[31m-    quotes_type_double,[m
[31m-    quotes_type_back[m
[31m-[m
[31m-} ngx_http_drizzle_quotes_type_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                               name;[m
[31m-    ngx_http_drizzle_type_checker_pt        checker;[m
[31m-    void                                   *checker_data;[m
[31m-    ngx_http_drizzle_quotes_type_t          quotes;[m
[31m-[m
[31m-} ngx_http_drizzle_var_type_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                            src_var;[m
[31m-    ngx_int_t                            dest_var;[m
[31m-    ngx_http_drizzle_var_type_t         *type;[m
[31m-    ngx_str_t                            errstr;[m
[31m-[m
[31m-} ngx_http_drizzle_var_to_quote_t;[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_QUOTING_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex 66b7e8f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,1053 +0,0 @@[m
[31m-/* Copyright (C) agentzh */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_upstream.h"[m
[31m-#include "ngx_http_drizzle_keepalive.h"[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-[m
[31m-enum {[m
[31m-    ngx_http_drizzle_default_port = 3306[m
[31m-};[m
[31m-[m
[31m-static void ngx_http_upstream_drizzle_cleanup(void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_init(ngx_conf_t *cf,[m
[31m-        ngx_http_upstream_srv_conf_t *uscf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_drizzle_get_peer(ngx_peer_connection_t *pc,[m
[31m-        void *data);[m
[31m-[m
[31m-static void ngx_http_upstream_drizzle_free_peer(ngx_peer_connection_t *pc,[m
[31m-        void *data, ngx_uint_t state);[m
[31m-[m
[31m-/* just a work-around to override the default u->output_filter */[m
[31m-static ngx_int_t ngx_http_drizzle_output_filter(void *data, ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_upstream_drizzle_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t  *conf;[m
[31m-[m
[31m-    dd("drizzle create srv conf");[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool,[m
[31m-                       sizeof(ngx_http_upstream_drizzle_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      conf->peers   = NULL[m
[31m-     *      conf->current = 0[m
[31m-     *      conf->servers = NULL[m
[31m-     *      conf->single = 0[m
[31m-     *      conf->max_cached = 0[m
[31m-     *      conf->overflow = 0 (drizzle_keepalive_overflow_ignore)[m
[31m-     */[m
[31m-[m
[31m-    conf->pool = cf->pool;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-[m
[31m-    (void) drizzle_create(&conf->drizzle);[m
[31m-[m
[31m-    cln->handler = ngx_http_upstream_drizzle_cleanup;[m
[31m-    cln->data = &conf->drizzle;[m
[31m-[m
[31m-    drizzle_add_options(&conf->drizzle, DRIZZLE_NON_BLOCKING);[m
[31m-[m
[31m-    /* we use 0 timeout for the underlying poll event model[m
[31m-     * used by libdrizzle itself. */[m
[31m-    drizzle_set_timeout(&conf->drizzle, 0);[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* mostly based on ngx_http_upstream_server in[m
[31m- * ngx_http_upstream.c of nginx 0.8.30.[m
[31m- * Copyright (C) Igor Sysoev */[m
[31m-char *[m
[31m-ngx_http_upstream_drizzle_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t        *dscf = conf;[m
[31m-    ngx_http_upstream_drizzle_server_t          *ds;[m
[31m-    ngx_str_t                                   *value;[m
[31m-    ngx_url_t                                    u;[m
[31m-    ngx_uint_t                                   i, j;[m
[31m-    ngx_http_upstream_srv_conf_t                *uscf;[m
[31m-    ngx_str_t                                    protocol;[m
[31m-    ngx_str_t                                    charset;[m
[31m-    u_char                                      *p;[m
[31m-    size_t                                       len;[m
[31m-[m
[31m-    dd("entered drizzle_server directive handler...");[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (dscf->servers == NULL) {[m
[31m-        dscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                                 sizeof(ngx_http_upstream_drizzle_server_t));[m
[31m-[m
[31m-        if (dscf->servers == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        uscf->servers = dscf->servers;[m
[31m-    }[m
[31m-[m
[31m-    ds = ngx_array_push(dscf->servers);[m
[31m-    if (ds == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(ds, sizeof(ngx_http_upstream_drizzle_server_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    /* parse the first name:port argument */[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = ngx_http_drizzle_default_port;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "drizzle: %s in upstream \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ds->addrs  = u.addrs;[m
[31m-    ds->naddrs = u.naddrs;[m
[31m-    ds->port   = u.port;[m
[31m-    ds->protocol = ngx_http_drizzle_protocol;[m
[31m-[m
[31m-    /* parse various options */[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "dbname=", sizeof("dbname=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            ds->dbname.len = value[i].len - (sizeof("dbname=") - 1);[m
[31m-[m
[31m-            if (ds->dbname.len >= DRIZZLE_MAX_DB_SIZE) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                       "drizzle: \"dbname\" value too large in upstream \"%V\""[m
[31m-                       " (at most %d bytes)",[m
[31m-                       dscf->peers->name,[m
[31m-                       (int) DRIZZLE_MAX_DB_SIZE);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ds->dbname.data = &value[i].data[sizeof("dbname=") - 1];[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "user=", sizeof("user=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            ds->user.len = value[i].len - (sizeof("user=") - 1);[m
[31m-[m
[31m-            if (ds->user.len >= DRIZZLE_MAX_USER_SIZE) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                       "drizzle: \"user\" value too large in upstream \"%V\""[m
[31m-                       " (at most %d bytes)",[m
[31m-                       dscf->peers->name,[m
[31m-                       (int) DRIZZLE_MAX_USER_SIZE);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ds->user.data = &value[i].data[sizeof("user=") - 1];[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "password=", sizeof("password=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            ds->password.len = value[i].len - (sizeof("password=") - 1);[m
[31m-[m
[31m-            if (ds->password.len >= DRIZZLE_MAX_PASSWORD_SIZE) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                       "drizzle: \"password\" value too large in upstream "[m
[31m-                       "\"%V\" (at most %d bytes)",[m
[31m-                       dscf->peers->name,[m
[31m-                       (int) DRIZZLE_MAX_PASSWORD_SIZE);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ds->password.data = &value[i].data[sizeof("password=") - 1];[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "protocol=", sizeof("protocol=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            protocol.len = value[i].len - (sizeof("protocol=") - 1);[m
[31m-            protocol.data = &value[i].data[sizeof("protocol=") - 1];[m
[31m-[m
[31m-            switch (protocol.len) {[m
[31m-            case 5:[m
[31m-                if (ngx_http_drizzle_strcmp_const(protocol.data, "mysql") == 0)[m
[31m-                {[m
[31m-                    ds->protocol = ngx_http_mysql_protocol;[m
[31m-                } else {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case 7:[m
[31m-                if (ngx_http_drizzle_strcmp_const(protocol.data,[m
[31m-                            "drizzle") != 0)[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            default:[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "drizzle: invalid protocol \"%V\""[m
[31m-                               " in drizzle_server", &protocol);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "charset=", sizeof("charset=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            charset.len = value[i].len - (sizeof("charset=") - 1);[m
[31m-            charset.data = &value[i].data[sizeof("charset=") - 1];[m
[31m-[m
[31m-            dd("charset: %.*s", (int) charset.len, charset.data);[m
[31m-[m
[31m-            if (charset.len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < charset.len; j++) {[m
[31m-                if (charset.data[j] == '\'') {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "bad charste value \"%V\" in"[m
[31m-                                       " drizzle_server", &charset);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            len = sizeof("set names ''") - 1 + charset.len;[m
[31m-[m
[31m-            p = ngx_palloc(cf->pool, len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ds->set_names_query.data = p;[m
[31m-            ds->set_names_query.len = len;[m
[31m-[m
[31m-            dd("charset query len: %d", (int) len);[m
[31m-[m
[31m-            p = ngx_copy(p, "set names '", sizeof("set names '") - 1);[m
[31m-            p = ngx_copy(p, charset.data, charset.len);[m
[31m-            *p = '\'';[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\" in"[m
[31m-                           " drizzle_server", &value[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("reset init_upstream...");[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_upstream_drizzle_init;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_init(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_uint_t                               i, j, n;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-    ngx_http_upstream_drizzle_server_t      *server;[m
[31m-    ngx_http_upstream_drizzle_peers_t       *peers;[m
[31m-    size_t                                   len;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,[m
[31m-            "drizzle upstream init");[m
[31m-[m
[31m-    uscf->peer.init = ngx_http_upstream_drizzle_init_peer;[m
[31m-[m
[31m-    dscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_http_drizzle_module);[m
[31m-[m
[31m-    if (dscf->servers == NULL || dscf->servers->nelts == 0) {[m
[31m-        /* XXX an upstream implicitly defined by drizzle_pass, etc.,[m
[31m-         * is not allowed for now */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "drizzle: no drizzle_server defined in upstream \"%V\""[m
[31m-                      " in %s:%ui",[m
[31m-                      &uscf->host, uscf->file_name, uscf->line);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* dscf->servers != NULL */[m
[31m-[m
[31m-    server = uscf->servers->elts;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < uscf->servers->nelts; i++) {[m
[31m-        n += server[i].naddrs;[m
[31m-    }[m
[31m-[m
[31m-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_drizzle_peers_t)[m
[31m-            + sizeof(ngx_http_upstream_drizzle_peer_t) * (n - 1));[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (n == 1);[m
[31m-    peers->number = n;[m
[31m-    peers->name = &uscf->host;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < uscf->servers->nelts; i++) {[m
[31m-        for (j = 0; j < server[i].naddrs; j++) {[m
[31m-            peers->peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-            peers->peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-            peers->peer[n].name = server[i].addrs[j].name;[m
[31m-            peers->peer[n].port = server[i].port;[m
[31m-            peers->peer[n].user = server[i].user;[m
[31m-            peers->peer[n].password = server[i].password;[m
[31m-            peers->peer[n].dbname = server[i].dbname;[m
[31m-            peers->peer[n].protocol = server[i].protocol;[m
[31m-            peers->peer[n].set_names_query = &server[i].set_names_query;[m
[31m-[m
[31m-            len = NGX_SOCKADDR_STRLEN + 1 /* for '\0' */;[m
[31m-[m
[31m-            peers->peer[n].host = ngx_palloc(cf->pool, len);[m
[31m-[m
[31m-            if (peers->peer[n].host == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = ngx_sock_ntop(peers->peer[n].sockaddr,[m
[31m-#if defined(nginx_version) && (nginx_version >= 1005003)[m
[31m-                                peers->peer[n].socklen,[m
[31m-#endif[m
[31m-                                peers->peer[n].host, len - 1, 0 /* no port */);[m
[31m-[m
[31m-            peers->peer[n].host[len] = '\0';[m
[31m-[m
[31m-            n++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dscf->peers = peers;[m
[31m-[m
[31m-    dscf->active_conns = 0;[m
[31m-[m
[31m-    if (dscf->max_cached) {[m
[31m-        return ngx_http_drizzle_keepalive_init(cf->pool, dscf);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-    ngx_http_upstream_t                     *u;[m
[31m-    ngx_http_core_loc_conf_t                *clcf;[m
[31m-    ngx_http_drizzle_loc_conf_t             *dlcf;[m
[31m-    ngx_drizzle_mixed_t                     *query;[m
[31m-    ngx_str_t                                dbname, sql;[m
[31m-    ngx_uint_t                               i;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-            "drizzle init peer");[m
[31m-[m
[31m-    dp = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_drizzle_peer_data_t));[m
[31m-    if (dp == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    dp->upstream = u;[m
[31m-    dp->request  = r;[m
[31m-[m
[31m-    dp->last_out = &u->out_bufs;[m
[31m-[m
[31m-    dscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_http_drizzle_module);[m
[31m-[m
[31m-    dp->srv_conf = dscf;[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_drizzle_module);[m
[31m-[m
[31m-    dp->loc_conf = dlcf;[m
[31m-[m
[31m-    dp->query.len  = 0;[m
[31m-    dp->dbname.len = 0;[m
[31m-[m
[31m-    /* to force ngx_output_chain not to use ngx_chain_writer */[m
[31m-[m
[31m-    u->output.output_filter = ngx_http_drizzle_output_filter;[m
[31m-    u->output.filter_ctx = r;[m
[31m-    u->output.in   = NULL;[m
[31m-    u->output.busy = NULL;[m
[31m-[m
[31m-    u->peer.data = dp;[m
[31m-    u->peer.get = ngx_http_upstream_drizzle_get_peer;[m
[31m-    u->peer.free = ngx_http_upstream_drizzle_free_peer;[m
[31m-[m
[31m-    /* prepare dbname */[m
[31m-[m
[31m-    dp->dbname.len = 0;[m
[31m-[m
[31m-    if (dlcf->dbname) {[m
[31m-        /* check if dbname requires overriding at request time */[m
[31m-        if (ngx_http_complex_value(r, dlcf->dbname, &dbname) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (dbname.len) {[m
[31m-            if (dbname.len >= DRIZZLE_MAX_DB_SIZE) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, r->connection->log, 0,[m
[31m-                       "drizzle: \"dbname\" value too large in upstream \"%V\"",[m
[31m-                       dscf->peers->name);[m
[31m-[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            dp->dbname = dbname;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* prepare SQL query */[m
[31m-[m
[31m-    if (dlcf->methods_set & r->method) {[m
[31m-        /* method-specific query */[m
[31m-        dd("using method-specific query");[m
[31m-[m
[31m-        query = dlcf->queries->elts;[m
[31m-        for (i = 0; i < dlcf->queries->nelts; i++) {[m
[31m-            if (query[i].key & r->method) {[m
[31m-                query = &query[i];[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (i == dlcf->queries->nelts) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* default query */[m
[31m-        dd("using default query");[m
[31m-[m
[31m-        query = dlcf->default_query;[m
[31m-    }[m
[31m-[m
[31m-    if (query->cv) {[m
[31m-        /* complex value */[m
[31m-        dd("using complex value");[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, query->cv, &sql) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (sql.len == 0) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "drizzle: empty \"drizzle_query\" (was: \"%V\")"[m
[31m-                          " in location \"%V\"", &query->cv->value,[m
[31m-                          &clcf->name);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        dp->query = sql;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* simple value */[m
[31m-    dd("using simple value");[m
[31m-[m
[31m-    dp->query = query->sv;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-    return NGX_ERROR;[m
[31m-#else[m
[31m-    r->upstream->peer.data = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_drizzle_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = data;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-    ngx_http_upstream_drizzle_peers_t       *peers;[m
[31m-    ngx_http_upstream_drizzle_peer_t        *peer;[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    ngx_http_drizzle_ctx_t                  *dctx;[m
[31m-#endif[m
[31m-    ngx_connection_t                        *c = NULL;[m
[31m-    drizzle_con_st                          *dc = NULL;[m
[31m-    ngx_str_t                                dbname;[m
[31m-    drizzle_return_t                         ret;[m
[31m-    ngx_socket_t                             fd;[m
[31m-    ngx_event_t                             *rev, *wev;[m
[31m-    ngx_int_t                                rc;[m
[31m-    ngx_int_t                                event;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, dp->request->connection->log, 0,[m
[31m-            "drizzle get peer");[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    if (data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    dctx = ngx_http_get_module_ctx(dp->request, ngx_http_drizzle_module);[m
[31m-#endif[m
[31m-[m
[31m-    dscf = dp->srv_conf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, dp->request->connection->log, 0,[m
[31m-            "active drizzle connections %ui", dscf->active_conns);[m
[31m-[m
[31m-    dp->failed = 0;[m
[31m-[m
[31m-    /* try to get an idle connection from our single-mode[m
[31m-     * keep-alive pool */[m
[31m-[m
[31m-    if (dscf->max_cached && dscf->single) {[m
[31m-        rc = ngx_http_drizzle_keepalive_get_peer_single(pc, dp, dscf);[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, dp->request->connection->log, 0,[m
[31m-        "drizzle get peer using simple round robin");[m
[31m-[m
[31m-    peers = dscf->peers;[m
[31m-[m
[31m-    if (dscf->current > peers->number - 1) {[m
[31m-        dscf->current = 0;[m
[31m-    }[m
[31m-[m
[31m-    peer = &peers->peer[dscf->current++];[m
[31m-[m
[31m-    dp->name.data = peer->name.data;[m
[31m-    dp->name.len = peer->name.len;[m
[31m-[m
[31m-    dp->sockaddr = *peer->sockaddr;[m
[31m-[m
[31m-    dp->enable_charset = (peer->set_names_query->len > 0);[m
[31m-    dp->set_names_query = peer->set_names_query;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-            "drizzle set connection charset query \"%V\"", dp->set_names_query);[m
[31m-[m
[31m-    pc->name = &dp->name;[m
[31m-    pc->sockaddr = &dp->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->cached = 0;[m
[31m-[m
[31m-    if (dscf->max_cached && ! dscf->single) {[m
[31m-        rc = ngx_http_drizzle_keepalive_get_peer_multi(pc, dp, dscf);[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dscf->overflow == drizzle_keepalive_overflow_reject &&[m
[31m-            dscf->active_conns >= dscf->max_cached)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_INFO, pc->log, 0,[m
[31m-                       "drizzle: connection pool full, rejecting request "[m
[31m-                       "to upstream \"%V\"",[m
[31m-                       &peer->name);[m
[31m-[m
[31m-        /* a bit hack-ish way to return error response (setup part) */[m
[31m-        pc->connection = ngx_get_connection(0, pc->log);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-        dctx->status = NGX_HTTP_SERVICE_UNAVAILABLE;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* set up the peer's drizzle connection */[m
[31m-[m
[31m-    dc = ngx_pcalloc(dscf->pool, sizeof(drizzle_con_st));[m
[31m-[m
[31m-    if (dc == NULL) {[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-        return NGX_ERROR;[m
[31m-#else[m
[31m-        goto failed;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dp->drizzle_con = dc;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-        "drizzle creating connection");[m
[31m-[m
[31m-    (void) drizzle_con_create(&dscf->drizzle, dc);[m
[31m-[m
[31m-    /* set protocol for the drizzle connection */[m
[31m-[m
[31m-    if (peer->protocol == ngx_http_mysql_protocol) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-            "drizzle using mysql protocol");[m
[31m-[m
[31m-        drizzle_con_add_options(dc, DRIZZLE_CON_MYSQL);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    /* set dbname for the drizzle connection */[m
[31m-[m
[31m-    if (dp->dbname.len) {[m
[31m-        dbname = dp->dbname;[m
[31m-[m
[31m-    } else {[m
[31m-        dbname = peer->dbname;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(dc->db, dbname.data, dbname.len);[m
[31m-    dc->db[dbname.len] = '\0';[m
[31m-[m
[31m-    /* set user for the drizzle connection */[m
[31m-[m
[31m-    ngx_memcpy(dc->user, peer->user.data, peer->user.len);[m
[31m-    dc->user[peer->user.len] = '\0';[m
[31m-[m
[31m-    /* set password for the drizzle connection */[m
[31m-[m
[31m-    ngx_memcpy(dc->password, peer->password.data, peer->password.len);[m
[31m-    dc->password[peer->password.len] = '\0';[m
[31m-[m
[31m-    dd("user %s, password %s", dc->user, dc->password);[m
[31m-[m
[31m-    /* TODO add support for uds (unix domain socket) */[m
[31m-[m
[31m-    /* set host and port for the drizzle connection */[m
[31m-[m
[31m-    drizzle_con_set_tcp(dc, (char *) peer->host, peer->port);[m
[31m-[m
[31m-    /* ask drizzle to connect to the remote */[m
[31m-[m
[31m-    ngx_log_debug7(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-            "drizzle connecting: host %s, port %d, dbname \"%V\", "[m
[31m-            "user \"%V\", pass \"%V\", dc pass \"%s\", "[m
[31m-            "protocol %d", peer->host, (int) peer->port, &dbname,[m
[31m-            &peer->user, &peer->password, dc->password, (int) peer->protocol);[m
[31m-[m
[31m-    ret = drizzle_con_connect(dc);[m
[31m-[m
[31m-    if (ret != DRIZZLE_RETURN_OK && ret != DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, pc->log, 0,[m
[31m-                       "drizzle: failed to connect: %d: %s in upstream \"%V\"",[m
[31m-                       (int) ret,[m
[31m-                       drizzle_error(&dscf->drizzle),[m
[31m-                       &peer->name);[m
[31m-[m
[31m-        drizzle_con_free(dc);[m
[31m-        ngx_pfree(dscf->pool, dc);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-        return NGX_DECLINED;[m
[31m-#else[m
[31m-        dctx->status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        goto failed;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dscf->active_conns++;[m
[31m-[m
[31m-    /* add the file descriptor (fd) into an nginx connection structure */[m
[31m-[m
[31m-    fd = drizzle_con_fd(dc);[m
[31m-[m
[31m-    if (fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                "drizzle: failed to get the drizzle connection fd");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(fd, pc->log);[m
[31m-    if (c == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                "drizzle: failed to get a free nginx connection");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    c->log = pc->log;[m
[31m-    c->log_error = pc->log_error;[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = pc->log;[m
[31m-    wev->log = pc->log;[m
[31m-[m
[31m-    pc->connection = c;[m
[31m-[m
[31m-    /* register the connection with the drizzle fd into the[m
[31m-     * nginx event model */[m
[31m-[m
[31m-#if 0[m
[31m-    if (ngx_nonblocking(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                "drizzle get peer: still connecting to remote");[m
[31m-[m
[31m-        dp->state = state_db_connect;[m
[31m-[m
[31m-        c->log->action = "connecting to drizzle upstream";[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                "drizzle get peer: already connected to remote");[m
[31m-[m
[31m-        /* to ensure send_query sets corresponding timers */[m
[31m-        dp->state = state_db_idle;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        dd("Found ngx_add_conn");[m
[31m-[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-            dd("returned NGX_AGAIN!!!");[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue */[m
[31m-[m
[31m-        event = NGX_CLEAR_EVENT;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        event = NGX_LEVEL_EVENT;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                "drizzle: failed to add connection into nginx event model");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (ret == DRIZZLE_RETURN_IO_WAIT) {[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "drizzle connected");[m
[31m-[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    /* ret == DRIZZLE_RETURN_OK */[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_free_connection(pc->log, pc->connection,[m
[31m-            dc, dscf);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-    return NGX_ERROR;[m
[31m-#else[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    /* a bit hack-ish way to return error response (setup part) */[m
[31m-    pc->connection = ngx_get_connection(0, pc->log);[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_drizzle_free_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_http_upstream_drizzle_peer_data_t   *dp = data;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t    *dscf;[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    if (data == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (pc && pc->log) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-            "drizzle free peer");[m
[31m-    }[m
[31m-[m
[31m-    dscf = dp->srv_conf;[m
[31m-[m
[31m-    if (dp->drizzle_con && dp->drizzle_res.con) {[m
[31m-        dd("before drizzle result free");[m
[31m-[m
[31m-        dd("%p vs. %p", dp->drizzle_res.con, dp->drizzle_con);[m
[31m-[m
[31m-        drizzle_result_free(&dp->drizzle_res);[m
[31m-[m
[31m-        dd("after drizzle result free");[m
[31m-    }[m
[31m-[m
[31m-    if (dscf->max_cached) {[m
[31m-        ngx_http_drizzle_keepalive_free_peer(pc, dp, dscf, state);[m
[31m-    }[m
[31m-[m
[31m-    if (pc && pc->connection) {[m
[31m-        dd("actually free the drizzle connection");[m
[31m-[m
[31m-        ngx_http_upstream_drizzle_free_connection(pc->log, pc->connection,[m
[31m-                dp->drizzle_con, dscf);[m
[31m-[m
[31m-        dp->drizzle_con = NULL;[m
[31m-        pc->connection = NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_drizzle_output_filter(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_request_t              *r = data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-        "drizzle output filter");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    r->upstream->request_sent = 1;[m
[31m-[m
[31m-    (void) ngx_http_drizzle_process_events(r);[m
[31m-[m
[31m-    /* discard the ret val from process events because[m
[31m-     * we can only return NGX_AGAIN here to prevent[m
[31m-     * ngx_http_upstream_process_header from being called[m
[31m-     * and avoid u->write_event_handler to be set to[m
[31m-     * ngx_http_upstream_dummy. */[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_flag_t[m
[31m-ngx_http_upstream_drizzle_is_my_peer(const ngx_peer_connection_t    *peer)[m
[31m-{[m
[31m-    return (peer->get == ngx_http_upstream_drizzle_get_peer);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_drizzle_free_connection(ngx_log_t *log,[m
[31m-    ngx_connection_t *c, drizzle_con_st *dc,[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t *dscf)[m
[31m-{[m
[31m-    ngx_event_t  *rev, *wev;[m
[31m-[m
[31m-    dd("drizzle free peer connection");[m
[31m-[m
[31m-    dscf->active_conns--;[m
[31m-[m
[31m-    if (dc) {[m
[31m-        dd("before con free");[m
[31m-        drizzle_con_free(dc);[m
[31m-        dd("after con free");[m
[31m-        ngx_pfree(dscf->pool, dc);[m
[31m-    }[m
[31m-[m
[31m-    if (c) {[m
[31m-        /* dd("c pool: %p", c->pool); */[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        if (wev->timer_set) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_del_conn) {[m
[31m-           ngx_del_conn(c, NGX_CLOSE_EVENT);[m
[31m-[m
[31m-        } else {[m
[31m-            if (rev->active || rev->disabled) {[m
[31m-                ngx_del_event(rev, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-[m
[31m-            if (wev->active || wev->disabled) {[m
[31m-                ngx_del_event(wev, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (rev->posted) {[m
[31m-#else[m
[31m-        if (rev->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(rev);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (wev->posted) {[m
[31m-#else[m
[31m-        if (wev->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(wev);[m
[31m-        }[m
[31m-[m
[31m-        rev->closed = 1;[m
[31m-        wev->closed = 1;[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        c->fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_upstream_drizzle_add(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_uint_t                      i;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != url->host.len[m
[31m-                || ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-                    url->host.len) != 0)[m
[31m-        {[m
[31m-            dd("upstream_add: host not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            dd("upstream_add: port not match: %d != %d",[m
[31m-                    (int) uscfp[i]->port, (int) url->port);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && url->default_port[m
[31m-            && uscfp[i]->default_port != url->default_port)[m
[31m-        {[m
[31m-            dd("upstream_add: default_port not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    dd("No upstream found: %.*s", (int) url->host.len, url->host.data);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_drizzle_cleanup(void *data)[m
[31m-{[m
[31m-    drizzle_st  *drizzle = data;[m
[31m-[m
[31m-    drizzle_free(drizzle);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex b71b961..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,148 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_UPSTREAM_H[m
[31m-#define NGX_HTTP_DRIZZLE_UPSTREAM_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    drizzle_keepalive_overflow_ignore = 0,[m
[31m-    drizzle_keepalive_overflow_reject[m
[31m-[m
[31m-} ngx_http_drizzle_keepalive_overflow_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_drizzle_protocol = 0,[m
[31m-    ngx_http_mysql_protocol[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_protocol_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8022[m
[31m-    ngx_addr_t                      *addrs;[m
[31m-#else[m
[31m-    ngx_peer_addr_t                 *addrs;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t                       naddrs;[m
[31m-    in_port_t                        port;[m
[31m-    ngx_str_t                        user;[m
[31m-    ngx_str_t                        password;[m
[31m-    ngx_str_t                        dbname;[m
[31m-    ngx_str_t                        set_names_query;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_protocol_t      protocol;[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_server_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct sockaddr                *sockaddr;[m
[31m-    socklen_t                       socklen;[m
[31m-    ngx_str_t                       name;[m
[31m-    in_port_t                       port;[m
[31m-    ngx_str_t                       user;[m
[31m-    ngx_str_t                       password;[m
[31m-    ngx_str_t                       dbname;[m
[31m-    ngx_str_t                      *set_names_query;[m
[31m-    u_char                         *host;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_protocol_t      protocol;[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_peer_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned                            single;[m
[31m-    ngx_uint_t                          number;[m
[31m-    ngx_str_t                          *name;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_t    peer[1];[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_peers_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_drizzle_peers_t   *peers;[m
[31m-[m
[31m-    /* TODO: we might need "tried" from round robin peer data */[m
[31m-    ngx_uint_t                           current;[m
[31m-[m
[31m-    /* of ngx_http_upstream_drizzle_server_t */[m
[31m-    ngx_array_t                         *servers;[m
[31m-[m
[31m-    drizzle_st                           drizzle;[m
[31m-    ngx_pool_t                          *pool;[m
[31m-[m
[31m-    /* keepalive related fields */[m
[31m-    unsigned                             single;[m
[31m-    ngx_queue_t                          free;[m
[31m-    ngx_queue_t                          cache;[m
[31m-[m
[31m-    ngx_uint_t                           active_conns;[m
[31m-[m
[31m-    ngx_uint_t                           max_cached;[m
[31m-    ngx_http_drizzle_keepalive_overflow_t    overflow;[m
[31m-[m
[31m-} ngx_http_upstream_drizzle_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_drizzle_loc_conf_t            *loc_conf;[m
[31m-    ngx_http_upstream_drizzle_srv_conf_t   *srv_conf;[m
[31m-[m
[31m-    ngx_http_upstream_t                    *upstream;[m
[31m-    ngx_http_request_t                     *request;[m
[31m-[m
[31m-    ngx_str_t                               dbname;[m
[31m-    ngx_str_t                               query;[m
[31m-[m
[31m-    ngx_http_drizzle_state_t                state;[m
[31m-[m
[31m-    drizzle_con_st                         *drizzle_con;[m
[31m-    drizzle_result_st                       drizzle_res;[m
[31m-    drizzle_column_st                       drizzle_col;[m
[31m-    uint64_t                                drizzle_row;[m
[31m-[m
[31m-    ngx_str_t                               name;[m
[31m-[m
[31m-    ngx_chain_t                           **last_out;[m
[31m-[m
[31m-    ngx_buf_t                              *out_buf;[m
[31m-    ngx_buf_t                               cached;[m
[31m-    ngx_buf_t                               postponed;[m
[31m-    size_t                                  avail_out;[m
[31m-    ngx_str_t                               charset;[m
[31m-    ngx_str_t                              *set_names_query;[m
[31m-[m
[31m-    struct sockaddr                         sockaddr;[m
[31m-[m
[31m-    /* how many times this connection has been successfully used */[m
[31m-    ngx_uint_t                              used;[m
[31m-[m
[31m-    unsigned                                failed:1;[m
[31m-    unsigned                                seen_stream_end:1;[m
[31m-    unsigned                                has_set_names:1;[m
[31m-    unsigned                                enable_charset:1;[m
[31m-} ngx_http_upstream_drizzle_peer_data_t;[m
[31m-[m
[31m-[m
[31m-char *ngx_http_upstream_drizzle_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-        void *conf);[m
[31m-void *ngx_http_upstream_drizzle_create_srv_conf(ngx_conf_t *cf);[m
[31m-ngx_flag_t ngx_http_upstream_drizzle_is_my_peer([m
[31m-        const ngx_peer_connection_t *peer);[m
[31m-void ngx_http_upstream_drizzle_free_connection(ngx_log_t *log,[m
[31m-        ngx_connection_t *c, drizzle_con_st *dc,[m
[31m-        ngx_http_upstream_drizzle_srv_conf_t *dscf);[m
[31m-ngx_http_upstream_srv_conf_t *ngx_http_upstream_drizzle_add([m
[31m-        ngx_http_request_t *r, ngx_url_t *url);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_UPSTREAM_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.c[m
[1mdeleted file mode 100644[m
[1mindex e2df951..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,1112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_drizzle_module.h"[m
[31m-#include "ngx_http_drizzle_util.h"[m
[31m-#include "ngx_http_drizzle_handler.h"[m
[31m-#include "ngx_http_drizzle_processor.h"[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_dbd_reinit(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_dbd_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_dbd_connect(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_dbd_cleanup(void *data);[m
[31m-static void ngx_http_upstream_dbd_wr_check_broken_connection([m
[31m-    ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_dbd_rd_check_broken_connection([m
[31m-    ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_dbd_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_set_header(ngx_http_request_t *r, ngx_str_t *key,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                  i;[m
[31m-[m
[31m-    dd("entered set_header");[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].key.len == key->len[m
[31m-            && ngx_strncasecmp(h[i].key.data, key->data, h[i].key.len) == 0)[m
[31m-        {[m
[31m-            if (value->len == 0) {[m
[31m-                h[i].hash = 0;[m
[31m-            }[m
[31m-[m
[31m-            h[i].value = *value;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = 1;[m
[31m-    h->key = *key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* the following functions are copied directly from[m
[31m-   ngx_http_upstream.c in nginx 0.8.30, just because[m
[31m-   they're static. sigh. */[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_drizzle_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc)[m
[31m-{[m
[31m-#if !defined(nginx_version) || nginx_version < 1009001[m
[31m-    ngx_time_t  *tp;[m
[31m-#endif[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http upstream request: %i", rc);[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009001[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (u->state && u->state->response_sec) {[m
[31m-        tp = ngx_timeofday();[m
[31m-        u->state->response_sec = tp->sec - u->state->response_sec;[m
[31m-        u->state->response_msec = tp->msec - u->state->response_msec;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (u->pipe) {[m
[31m-            u->state->response_length = u->pipe->read_length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->finalize_request) {[m
[31m-        u->finalize_request(r, rc);[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.free) {[m
[31m-        dd("before free peer");[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-        dd("after free peer");[m
[31m-    }[m
[31m-[m
[31m-    dd("about to free peer 2, c: %p, r pool: %p", u->peer.connection, r->pool);[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-#if 0 /* libdrizzle doesn't support SSL, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-        /* TODO: do not shutdown persistent connection */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-[m
[31m-            /*[m
[31m-             * We send the "close notify" shutdown alert to the upstream only[m
[31m-             * and do not wait its "close notify" shutdown alert.[m
[31m-             * It is acceptable according to the TLS standard.[m
[31m-             */[m
[31m-[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "drizzle close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-        dd("r pool: %p, c pool: %p", r->pool, u->peer.connection->pool);[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    u->peer.connection = NULL;[m
[31m-[m
[31m-    if (u->pipe && u->pipe->temp_file) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream temp fd: %d",[m
[31m-                       u->pipe->temp_file->file.fd);[m
[31m-    }[m
[31m-[m
[31m-    if (u->header_sent[m
[31m-        && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))[m
[31m-    {[m
[31m-        rc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "sending to client";[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_drizzle_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t ft_type)[m
[31m-{[m
[31m-    ngx_uint_t  status, state;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http next upstream, %xi", ft_type);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);[m
[31m-#endif[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {[m
[31m-        state = NGX_PEER_NEXT;[m
[31m-    } else {[m
[31m-        state = NGX_PEER_FAILED;[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type != NGX_HTTP_UPSTREAM_FT_NOLIVE) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, state);[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        status = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        switch (ft_type) {[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_TIMEOUT:[m
[31m-            status = NGX_HTTP_GATEWAY_TIME_OUT;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_HTTP_500:[m
[31m-            status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_HTTP_404:[m
[31m-            status = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        /*[m
[31m-         * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING[m
[31m-         * never reach here[m
[31m-         */[m
[31m-[m
[31m-        default:[m
[31m-            status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->error) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (status) {[m
[31m-        u->state->status = status;[m
[31m-[m
[31m-        if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type)) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u, status);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-#if 0 /* libdrizzle doesn't support SSL, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-            u->peer.connection->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        dd("r pool: %p, c pool: %p", r->pool, u->peer.connection->pool);[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (u->conf->busy_lock && !u->busy_locked) {[m
[31m-        ngx_http_upstream_busy_lock(p);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: ngx_http_upstream_connect(r, u); */[m
[31m-    if (status == 0) {[m
[31m-        status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_finalize_request(r, u, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_drizzle_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        if (c->write->pending_eof) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, c->write->kq_errno,[m
[31m-                                        "kevent() reported that connect() "[m
[31m-                                        "failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_dbd_init(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http init upstream, client timer: %d", c->read->timer_set);[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        if (!c->write->active) {[m
[31m-            if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_dbd_init_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_dbd_init_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *host;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_resolver_ctx_t             *ctx, temp;[m
[31m-    ngx_http_cleanup_t             *cln;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    if (r->aio) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#if 0 && (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->cache) {[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache(r, u);[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            r->write_event_handler = ngx_http_upstream_init_request;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            ngx_http_finalize_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->store = (u->conf->store || u->conf->store_lengths);[m
[31m-[m
[31m-    if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-        r->read_event_handler =[m
[31m-                             ngx_http_upstream_dbd_rd_check_broken_connection;[m
[31m-        r->write_event_handler =[m
[31m-                             ngx_http_upstream_dbd_wr_check_broken_connection;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body) {[m
[31m-        u->request_bufs = r->request_body->bufs;[m
[31m-    }[m
[31m-[m
[31m-    if (u->create_request(r) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-#if defined(nginx_version) && nginx_version >= 8022[m
[31m-    u->peer.local = u->conf->local;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    u->output.alignment = clcf->directio_alignment;[m
[31m-#endif[m
[31m-[m
[31m-    u->output.pool = r->pool;[m
[31m-    u->output.bufs.num = 1;[m
[31m-    u->output.bufs.size = clcf->client_body_buffer_size;[m
[31m-    u->output.output_filter = ngx_chain_writer;[m
[31m-    u->output.filter_ctx = &u->writer;[m
[31m-[m
[31m-    u->writer.pool = r->pool;[m
[31m-[m
[31m-    if (r->upstream_states == NULL) {[m
[31m-[m
[31m-        r->upstream_states = ngx_array_create(r->pool, 1,[m
[31m-                                           sizeof(ngx_http_upstream_state_t));[m
[31m-        if (r->upstream_states == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        u->state = ngx_array_push(r->upstream_states);[m
[31m-        if (u->state == NULL) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_upstream_dbd_cleanup;[m
[31m-    cln->data = r;[m
[31m-    u->cleanup = &cln->handler;[m
[31m-[m
[31m-    if (u->resolved == NULL) {[m
[31m-[m
[31m-        uscf = u->conf->upstream;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (u->resolved->sockaddr) {[m
[31m-[m
[31m-            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_dbd_connect(r, u);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        host = &u->resolved->host;[m
[31m-[m
[31m-        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-        uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->host.len == host->len[m
[31m-                && ((uscf->port == 0 && u->resolved->no_port)[m
[31m-                     || uscf->port == u->resolved->port)[m
[31m-                && ngx_memcmp(uscf->host.data, host->data, host->len) == 0)[m
[31m-            {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        temp.name = *host;[m
[31m-[m
[31m-        ctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-        if (ctx == NULL) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx == NGX_NO_RESOLVER) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no resolver defined to resolve %V", host);[m
[31m-[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                    NGX_HTTP_BAD_GATEWAY);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        ctx->name = *host;[m
[31m-        ctx->type = NGX_RESOLVE_A;[m
[31m-        ctx->handler = ngx_http_upstream_resolve_handler;[m
[31m-        ctx->data = r;[m
[31m-        ctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-        u->resolved->ctx = ctx;[m
[31m-[m
[31m-        if (ngx_resolve_name(ctx) != NGX_OK) {[m
[31m-            u->resolved->ctx = NULL;[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-#endif[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (uscf->peer.init(r, uscf) != NGX_OK) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_dbd_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-#if !defined(nginx_version) || nginx_version < 1009001[m
[31m-    ngx_time_t        *tp;[m
[31m-#endif[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r->connection->log->action = "connecting to upstream";[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009001[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (u->state && u->state->response_sec) {[m
[31m-        tp = ngx_timeofday();[m
[31m-[m
[31m-        u->state->response_sec = tp->sec - u->state->response_sec;[m
[31m-        u->state->response_msec = tp->msec - u->state->response_msec;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->state = ngx_array_push(r->upstream_states);[m
[31m-    if (u->state == NULL) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009001[m
[31m-[m
[31m-    u->state->response_time = ngx_current_msec;[m
[31m-    u->state->connect_time = (ngx_msec_t) -1;[m
[31m-    u->state->header_time = (ngx_msec_t) -1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    u->state->response_sec = tp->sec;[m
[31m-    u->state->response_msec = tp->msec;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&u->peer);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->peer = u->peer.name;[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_http_upstream_drizzle_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN */[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    c->data = r;[m
[31m-[m
[31m-    c->write->handler = ngx_http_upstream_dbd_handler;[m
[31m-    c->read->handler = ngx_http_upstream_dbd_handler;[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_drizzle_wev_handler;[m
[31m-    u->read_event_handler = ngx_http_drizzle_rev_handler;[m
[31m-[m
[31m-    c->sendfile &= r->connection->sendfile;[m
[31m-    u->output.sendfile = c->sendfile;[m
[31m-[m
[31m-    c->pool = r->pool;[m
[31m-    c->log = r->connection->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */[m
[31m-[m
[31m-    u->writer.out = NULL;[m
[31m-    u->writer.last = &u->writer.out;[m
[31m-    u->writer.connection = c;[m
[31m-    u->writer.limit = 0;[m
[31m-[m
[31m-    if (u->request_sent) {[m
[31m-        if (ngx_http_upstream_dbd_reinit(r, u) != NGX_OK) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body[m
[31m-        && r->request_body->buf[m
[31m-        && r->request_body->temp_file[m
[31m-        && r == r->main)[m
[31m-    {[m
[31m-        /*[m
[31m-         * the r->request_body->buf can be reused for one request only,[m
[31m-         * the subrequests should allocate their own temporay bufs[m
[31m-         */[m
[31m-[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = r->request_body->buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-        u->output.allocated = 1;[m
[31m-[m
[31m-        r->request_body->buf->pos = r->request_body->buf->start;[m
[31m-        r->request_body->buf->last = r->request_body->buf->start;[m
[31m-        r->request_body->buf->tag = u->output.tag;[m
[31m-    }[m
[31m-[m
[31m-    u->request_sent = 0;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if 0 /* libdrizzle doesn't support SSL, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_upstream_send_request(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    dd("connection error: %d", c->error);[m
[31m-[m
[31m-    ngx_http_drizzle_set_libdrizzle_ready(r);[m
[31m-[m
[31m-    (void) ngx_http_drizzle_process_events(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_rd_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_dbd_check_broken_connection(r, r->connection->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_wr_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_dbd_check_broken_connection(r, r->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    char                 buf[1];[m
[31m-    ngx_err_t            err;[m
[31m-    ngx_int_t            event;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "http upstream check client, write event:%d, \"%V\"",[m
[31m-                   ev->write, &r->uri);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-            event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-            if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                              NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!ev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        if (ev->kq_errno) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                          "kevent() reported that client closed prematurely "[m
[31m-                          "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                      "kevent() reported that client closed "[m
[31m-                      "prematurely connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,[m
[31m-                   "http upstream recv(): %d", n);[m
[31m-[m
[31m-    if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-        event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-        if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->error = 1;[m
[31m-[m
[31m-    } else { /* n == 0 */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev->eof = 1;[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (!u->cacheable && u->peer.connection) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "client closed prematurely connection, "[m
[31m-                      "so upstream connection is closed too");[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                  "client closed prematurely connection");[m
[31m-[m
[31m-    if (u->peer.connection == NULL) {[m
[31m-        ngx_http_upstream_drizzle_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t *r = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup http upstream request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_finalize_request(r, u, NGX_DONE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dbd_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_log_ctx_t   *ctx;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ctx = c->log->data;[m
[31m-    ctx->current_request = r;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    dd("upstream ev write:%d, ready:%d", (int) ev->write, (int) ev->ready);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        u->write_event_handler(r, u);[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_dbd_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (u->reinit_request(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the request chain */[m
[31m-[m
[31m-    for (cl = u->request_bufs; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->start;[m
[31m-        cl->buf->file_pos = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the subrequest's ngx_output_chain() context */[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file[m
[31m-        && r != r->main && u->output.buf)[m
[31m-    {[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = u->output.buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-[m
[31m-        u->output.buf->pos = u->output.buf->start;[m
[31m-        u->output.buf->last = u->output.buf->start;[m
[31m-    }[m
[31m-[m
[31m-    u->output.buf = NULL;[m
[31m-    u->output.in = NULL;[m
[31m-    u->output.busy = NULL;[m
[31m-[m
[31m-    /* reinit u->buffer */[m
[31m-[m
[31m-    u->buffer.pos = u->buffer.start;[m
[31m-[m
[31m-#if 0 && (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-        u->buffer.pos += r->cache->header_start;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_drizzle_set_thread_id_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_drizzle_loc_conf_t    *dlcf;[m
[31m-    size_t                          size;[m
[31m-    ngx_http_variable_value_t      *vv;[m
[31m-    uint32_t                        tid;[m
[31m-    drizzle_con_st                 *dc;[m
[31m-[m
[31m-    ngx_http_upstream_drizzle_peer_data_t       *dp;[m
[31m-[m
[31m-    dp = r->upstream->peer.data;[m
[31m-    if (dp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dc = dp->drizzle_con;[m
[31m-    if (dc == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tid = drizzle_con_thread_id(dc);[m
[31m-[m
[31m-    dd("tid = %d", (int) tid);[m
[31m-[m
[31m-    if (tid == 0) {[m
[31m-        /* invalid thread id */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    size = ngx_http_drizzle_get_num_size(tid);[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_drizzle_module);[m
[31m-[m
[31m-    vv = ngx_http_get_indexed_variable(r, dlcf->tid_var_index);[m
[31m-[m
[31m-    if (vv == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vv->not_found = 0;[m
[31m-    vv->valid = 1;[m
[31m-    vv->no_cacheable = 0;[m
[31m-[m
[31m-    vv->data = ngx_palloc(r->pool, size);[m
[31m-    if (vv->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vv->len = size;[m
[31m-[m
[31m-    ngx_sprintf(vv->data, "%uD", tid);[m
[31m-[m
[31m-    dd("$drizzle_thread_id set");[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_drizzle_get_num_size(uint64_t i)[m
[31m-{[m
[31m-    size_t          n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        i = i / 10;[m
[31m-        n++;[m
[31m-    } while (i > 0);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_http_drizzle_queue_size(ngx_queue_t *queue)[m
[31m-{[m
[31m-    ngx_queue_t     *q;[m
[31m-    ngx_uint_t       n = 0;[m
[31m-[m
[31m-   for (q = ngx_queue_head(queue);[m
[31m-         q != ngx_queue_sentinel(queue);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        n++;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.h[m
[1mdeleted file mode 100644[m
[1mindex db1f413..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/ngx_http_drizzle_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-#ifndef NGX_HTTP_DRIZZLE_UTIL_H[m
[31m-#define NGX_HTTP_DRIZZLE_UTIL_H[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#define ngx_http_drizzle_strcmp_const(a, b) \[m
[31m-        ngx_strncmp(a, b, sizeof(b) - 1)[m
[31m-[m
[31m-#ifndef ngx_copy_const_str[m
[31m-#define ngx_copy_const_str(p, s)  ngx_copy(p, s, sizeof(s) - 1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_http_upstream_dbd_init(ngx_http_request_t *r);[m
[31m-void ngx_http_upstream_dbd_init_request(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_drizzle_set_header(ngx_http_request_t *r, ngx_str_t *key,[m
[31m-        ngx_str_t *value);[m
[31m-void ngx_http_upstream_drizzle_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc);[m
[31m-void ngx_http_upstream_drizzle_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc);[m
[31m-ngx_int_t ngx_http_upstream_drizzle_test_connect(ngx_connection_t *c);[m
[31m-ngx_int_t ngx_http_drizzle_set_thread_id_variable(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u);[m
[31m-ngx_uint_t ngx_http_drizzle_queue_size(ngx_queue_t *queue);[m
[31m-size_t ngx_http_drizzle_get_num_size(uint64_t i);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_drizzle_nelems(x) (sizeof(x) / sizeof(x[0]))[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_DRIZZLE_UTIL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/resty_dbd_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/resty_dbd_stream.h[m
[1mdeleted file mode 100644[m
[1mindex 84d7157..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/src/resty_dbd_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-#ifndef RESTY_DBD_STREAME_H[m
[31m-#define RESTY_DBD_STREAME_H[m
[31m-[m
[31m-#define resty_dbd_stream_version 3[m
[31m-#define resty_dbd_stream_version_string \[m
[31m-    "0.0.3"[m
[31m-[m
[31m-#define rds_content_type \[m
[31m-    "application/x-resty-dbd-stream"[m
[31m-[m
[31m-#define rds_content_type_len \[m
[31m-    (sizeof(rds_content_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_rough_col_type_int = 0 << 14,[m
[31m-    rds_rough_col_type_float = 1 << 14,[m
[31m-    rds_rough_col_type_str = 2 << 14,[m
[31m-    rds_rough_col_type_bool = 3 << 14[m
[31m-[m
[31m-} rds_rough_col_type_t;[m
[31m-[m
[31m-[m
[31m-/* The following types (or spellings thereof) are specified[m
[31m- * by SQL:[m
[31m- * bigint, bit, bit varying, boolean, char, character varying,[m
[31m- * character, varchar, date, double precision, integer,[m
[31m- * interval, numeric, decimal, real, smallint,[m
[31m- * time (with or without time zone),[m
[31m- * timestamp (with or without time zone), xml */[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_col_type_unknown = 0 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bigint = 1 | rds_rough_col_type_int,[m
[31m-    rds_col_type_bit = 2 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bit_varying = 3 | rds_rough_col_type_str,[m
[31m-[m
[31m-    rds_col_type_bool = 4 | rds_rough_col_type_bool,[m
[31m-    rds_col_type_char = 5 | rds_rough_col_type_str,[m
[31m-    rds_col_type_varchar = 6 | rds_rough_col_type_str,[m
[31m-    rds_col_type_date = 7 | rds_rough_col_type_str,[m
[31m-    rds_col_type_double = 8 | rds_rough_col_type_float,[m
[31m-    rds_col_type_integer = 9 | rds_rough_col_type_int,[m
[31m-    rds_col_type_interval = 10 | rds_rough_col_type_float,[m
[31m-    rds_col_type_decimal = 11 | rds_rough_col_type_float,[m
[31m-    rds_col_type_real = 12 | rds_rough_col_type_float,[m
[31m-    rds_col_type_smallint = 13 | rds_rough_col_type_int,[m
[31m-    rds_col_type_time_with_time_zone = 14 | rds_rough_col_type_str,[m
[31m-    rds_col_type_time = 15 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp_with_time_zone = 16 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp = 17 | rds_rough_col_type_str,[m
[31m-    rds_col_type_xml = 18 | rds_rough_col_type_str,[m
[31m-[m
[31m-    /* our additions */[m
[31m-    rds_col_type_blob = 19 | rds_rough_col_type_str[m
[31m-[m
[31m-} rds_col_type_t;[m
[31m-[m
[31m-#endif /* RESTY_DBD_STREAME_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex c4a2328..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-no_shuffle();[m
[31m-#log_level 'warn';[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex bb6ebb9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: two locations[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m-    location /mysql2 {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 410[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 5[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex c4ddff7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,81 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/errors.t[m
[1mdeleted file mode 100644[m
[1mindex 478c0d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 410[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: wrong credentials[m
[31m-little-endian systems only[m
[31m-[m
[31m---- timeout: 5[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT dbname=test[m
[31m-             password=wrong_pass user=monty protocol=mysql[m
[31m-             charset=utf8;[m
[31m-        drizzle_keepalive mode=single max=2 overflow=reject;[m
[31m-    }[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 502[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no database[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server 127.0.0.1:1 dbname=test[m
[31m-             password=some_pass user=monty protocol=mysql[m
[31m-             charset=utf8;[m
[31m-        drizzle_keepalive mode=single max=2 overflow=reject;[m
[31m-    }[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 502[m
[31m---- timeout: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple queries[m
[31m-little-endian systems only[m
[31m-[m
[31m---- timeout: 5[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select * from cats; select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: missing query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: empty query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        set $query "";[m
[31m-        drizzle_query $query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend "";[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=blah-blah;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex c1d3fe9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,417 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 6;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-        drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: variables in drizzle_pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $foo backend;[m
[31m-        drizzle_pass $foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (using little bufs, size 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sanity (using little bufs, size 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sanity (using little bufs, size 3)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 3;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/methods.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/methods.t[m
[1mdeleted file mode 100644[m
[1mindex bfee44b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/methods.t[m
[1m+++ /dev/null[m
[36m@@ -1,359 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 2 * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: method-specific query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select 'GET' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: method-specific complex query (check 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: method-specific complex query (check 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-LOCK /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{04}\x{00}\x{00}\x{00}".  # field len[m
[31m-"LOCK".          # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: method-specific complex query (using not allowed method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /mysql[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: method-specific query and default query (using defined method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: method-specific query and default query (using other method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: inheritance[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_query      "select 'default' as echo";[m
[31m-    drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inheritance (mixed, not inherited)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_query      "select 'default' as echo";[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /mysql[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: default query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-PATCH /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{05}\x{00}\x{00}\x{00}".  # field len[m
[31m-"PATCH".         # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.41[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 64040b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,418 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 6;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-        #drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: variables in drizzle_pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $foo backend;[m
[31m-        drizzle_pass $foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (using little bufs, size 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sanity (using little bufs, size 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sanity (using little bufs, size 3)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 3;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/timeout.t[m
[1mdeleted file mode 100644[m
[1mindex d458de5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/charset/timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks() * 2;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server www.taobao.com:1234;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-#log_level('error');[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: loc_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_connect_timeout 3;[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: serv_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_connect_timeout 10ms;[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: serv_config connect timeout[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test[m
[31m-                       charset=utf8;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    #drizzle_connect_timeout 1;[m
[31m-    drizzle_send_query_timeout 10ms;[m
[31m-    #drizzle_recv_cols_timeout 10ms;[m
[31m-    #drizzle_recv_rows_timeout 10ms;[m
[31m-[m
[31m-    location /upstream {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select sql_no_cache * from cats as a, cats as b, cats as c, cats as d, cats as e, cats as f, cats as g, cats as h, cats as i, cats as j order by a.id, b.id, c.id, d.id';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 1[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/errors.t[m
[1mdeleted file mode 100644[m
[1mindex e102d50..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,176 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 410[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: wrong credentials[m
[31m-little-endian systems only[m
[31m-[m
[31m---- timeout: 5[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT dbname=test[m
[31m-             password=wrong_pass user=monty protocol=mysql;[m
[31m-        drizzle_keepalive mode=single max=2 overflow=reject;[m
[31m-    }[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 502[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no database[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        drizzle_server 127.0.0.1:1 dbname=test[m
[31m-             password=some_pass user=monty protocol=mysql;[m
[31m-        drizzle_keepalive mode=single max=2 overflow=reject;[m
[31m-    }[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 502[m
[31m---- timeout: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple queries[m
[31m-little-endian systems only[m
[31m-[m
[31m---- timeout: 5[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "select * from cats; select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: missing query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: empty query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        set $query "";[m
[31m-        drizzle_query $query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend "";[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $backend "not-exist";[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 500[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex b377536..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,452 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks() + 12);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-#master_on();[m
[31m-#log_level('warn');[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: variables in drizzle_pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $foo backend;[m
[31m-        drizzle_pass $foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (using little bufs, size 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sanity (using little bufs, size 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sanity (using little bufs, size 3)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 3;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/methods.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/methods.t[m
[1mdeleted file mode 100644[m
[1mindex 76cd593..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/methods.t[m
[1m+++ /dev/null[m
[36m@@ -1,358 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 26;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: method-specific query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select 'GET' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: method-specific complex query (check 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: method-specific complex query (check 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-LOCK /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{04}\x{00}\x{00}\x{00}".  # field len[m
[31m-"LOCK".          # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: method-specific complex query (using not allowed method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /mysql[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: method-specific query and default query (using defined method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: method-specific query and default query (using other method)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select 'default' as echo";[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-POST /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: inheritance[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_query      "select 'default' as echo";[m
[31m-    drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inheritance (mixed, not inherited)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_query      "select 'default' as echo";[m
[31m-[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /mysql[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: default query[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass       database;[m
[31m-        drizzle_query      "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-PATCH /mysql[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{fd}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{05}\x{00}\x{00}\x{00}".  # field len[m
[31m-"PATCH".         # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.41[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex a1d6ba8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,419 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 6;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        #drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-#master_on();[m
[31m-#log_level('warn');[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_query "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: update & no module header[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: variables in drizzle_pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        set $foo backend;[m
[31m-        drizzle_pass $foo;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers[m
[31m-X-Resty-DBD-Module: [m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (using little bufs, size 1)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sanity (using little bufs, size 2)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sanity (using little bufs, size 3)[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query 'select * from cats';[m
[31m-        drizzle_buffer_size 3;[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_headers_like[m
[31m-X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- timeout: 60[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: update[m
[31m-little-endian systems only[m
[31m-[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /mysql {[m
[31m-        drizzle_pass backend;[m
[31m-        #drizzle_dbname $dbname;[m
[31m-        drizzle_query "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /mysql[m
[31m---- response_body eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/status.t[m
[1mdeleted file mode 100644[m
[1mindex 9572f56..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/status.t[m
[1m+++ /dev/null[m
[36m@@ -1,297 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-#master_on();[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=10 overflow=reject mode=single;[m
[31m-    }[m
[31m-    upstream backend2 {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        #drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-    }[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:80;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $http_config2 = <<'_EOC_';[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=10 overflow=reject mode=single;[m
[31m-    }[m
[31m-    upstream backend2 {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=5 overflow=ignore mode=multi;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /status[m
[31m---- response_body[m
[31m-upstream backend[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 0[m
[31m-  free'd connection queue: 10[m
[31m-  cached connection successfully used count:[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: single mode and no pools[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location @my_err {[m
[31m-        echo "500 Internal Server Error";[m
[31m-    }[m
[31m-    location ~ ^/mysql(2?)$ {[m
[31m-        drizzle_query "select sum(1) from $args";[m
[31m-        drizzle_pass backend$1;[m
[31m-        error_page 500 = @my_err;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-[m
[31m-        echo_location /mysql2 cats;[m
[31m-        echo_location /mysql2 cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 3[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 3[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: single & multi mode pools[m
[31m---- http_config eval: $::http_config2[m
[31m---- config[m
[31m-    location @my_err {[m
[31m-        echo "500 Internal Server Error";[m
[31m-    }[m
[31m-    location ~ ^/mysql(2?)$ {[m
[31m-        drizzle_query "select sum(1) from $args";[m
[31m-        drizzle_pass backend$1;[m
[31m-        error_page 500 = @my_err;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-[m
[31m-        echo_location /mysql2 cats;[m
[31m-        echo_location /mysql2 cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 3[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 5[m
[31m-  overflow: ignore[m
[31m-  cached connection queue: 0[m
[31m-  free'd connection queue: 5[m
[31m-  cached connection successfully used count:[m
[31m-  free'd connection successfully used count: 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 3[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 5[m
[31m-  overflow: ignore[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 4[m
[31m-  cached connection successfully used count: 2[m
[31m-  free'd connection successfully used count: 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: single mode and bad request[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location @my_err {[m
[31m-        echo "500 Internal Server Error";[m
[31m-    }[m
[31m-    location ~ ^/mysql(2?)$ {[m
[31m-        drizzle_query "select sum(1) from $args";[m
[31m-        drizzle_pass backend$1;[m
[31m-        error_page 500 = @my_err;[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-    location /status {[m
[31m-        drizzle_status;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql select;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-[m
[31m-        echo_location /mysql cats;[m
[31m-        echo_location /mysql cats;[m
[31m-        echo;[m
[31m-[m
[31m-        echo_location /status;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][{"sum(1)":2}]500 Internal Server Error[m
[31m-[m
[31m-upstream backend[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 0[m
[31m-  free'd connection queue: 10[m
[31m-  cached connection successfully used count:[m
[31m-  free'd connection successfully used count: 3 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[{"sum(1)":2}][{"sum(1)":2}][m
[31m-upstream backend[m
[31m-  active connections: 1[m
[31m-  connection pool capacity: 10[m
[31m-  overflow: reject[m
[31m-  cached connection queue: 1[m
[31m-  free'd connection queue: 9[m
[31m-  cached connection successfully used count: 2[m
[31m-  free'd connection successfully used count: 0 0 0 0 0 0 0 0 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[31m-upstream backend2[m
[31m-  active connections: 0[m
[31m-  connection pool capacity: 0[m
[31m-  servers: 1[m
[31m-  peers: 1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/timeout.t[m
[1mdeleted file mode 100644[m
[1mindex e6aae6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/t/timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,158 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        drizzle_server www.taobao.com:1234;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-worker_connections(128);[m
[31m-#log_level('error');[m
[31m-[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: loc_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_connect_timeout 3;[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: serv_config connect timeout[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    drizzle_connect_timeout 10ms;[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: serv_config send query timeout (busy select)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    #drizzle_connect_timeout 1;[m
[31m-    drizzle_send_query_timeout 10ms;[m
[31m-    #drizzle_recv_cols_timeout 10ms;[m
[31m-    #drizzle_recv_rows_timeout 10ms;[m
[31m-[m
[31m-    location /upstream {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select sql_no_cache * from cats as a, cats as b, cats as c, cats as d, cats as e, cats as f, cats as g, cats as h, cats as i, cats as j order by a.id, b.id, c.id, d.id';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 1[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: loc_config connect timeout (empty $drizzle_thread_id)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /upstream {[m
[31m-        set $backend foo;[m
[31m-        drizzle_pass $backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select * from xx';[m
[31m-        drizzle_connect_timeout 10ms;[m
[31m-        more_set_headers -s 504 'X-Mysql-Tid: $drizzle_thread_id';[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- response_headers[m
[31m-X-Mysql-Tid:[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 0.5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: serv_config send query timeout (sleep select)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    #drizzle_connect_timeout 1;[m
[31m-    drizzle_send_query_timeout 80ms;[m
[31m-    #drizzle_recv_cols_timeout 10ms;[m
[31m-    #drizzle_recv_rows_timeout 10ms;[m
[31m-[m
[31m-    location /upstream {[m
[31m-        drizzle_pass backend;[m
[31m-        drizzle_module_header off;[m
[31m-        drizzle_query 'select sql_no_cache sleep(1);';[m
[31m-        more_set_headers -s 504 "X-Mysql-Tid: $drizzle_thread_id";[m
[31m-    }[m
[31m---- request[m
[31m-GET /upstream[m
[31m---- error_code: 504[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 1[m
[31m---- response_headers_like[m
[31m-X-Mysql-Tid: \d+[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex aa79e7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --with-ld-opt="-Wl,-rpath,$LIBDRIZZLE_LIB:$LUAJIT_LIB" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root/../rds-json-nginx-module \[m
[31m-          --add-module=$root/../headers-more-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-          --with-debug[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$home/work/nginx_eval_module-1.0.1 \[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/ngx-links b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/ngx-links[m
[1mdeleted file mode 100755[m
[1mindex bf54f46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/ngx-links[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use Cwd qw( cwd );[m
[31m-use Getopt::Std;[m
[31m-[m
[31m-my %opts;[m
[31m-getopts('f', \%opts) or[m
[31m-    die "Usage: $0 [-f][m
[31m-Options:[m
[31m-    -f          Override exising symbolic links with force[m
[31m-";[m
[31m-[m
[31m-my $root = shift || 'src';[m
[31m-[m
[31m-my $force = $opts{f};[m
[31m-[m
[31m-opendir my $dir, $root[m
[31m-    or die "Can't open directory src/ for reading: $!\n";[m
[31m-[m
[31m-my @links;[m
[31m-[m
[31m-while (my $entry = readdir $dir) {[m
[31m-    my ($base, $ext);[m
[31m-[m
[31m-    my $source = "$root/$entry";[m
[31m-[m
[31m-    if (-l $source || -d $source) {[m
[31m-        warn "skipping $source\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if ($entry =~ m{ ^ ngx_ (?: \w+ _ )+ (\w+) \. ([ch]|rl) $}x) {[m
[31m-        ($base, $ext) = ($1, $2);[m
[31m-    } else {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    my $target = "$root/$base.$ext";[m
[31m-    if (-e $target && ! -l $target) {[m
[31m-        die "target $target already exists, and not a symlink, not overriding...Abort.\n";[m
[31m-    } elsif (-l $target) {[m
[31m-        #warn "it's a link";[m
[31m-        if ( ! $force ) {[m
[31m-            die "target $target already exists, not overriding...Abort.\n";[m
[31m-        }[m
[31m-        warn "overriding existing symlink $target\n";[m
[31m-    }[m
[31m-    #warn "creating $target --> $root/$entry\n";[m
[31m-    system("ln -svf `pwd`/$source $target") == 0 or[m
[31m-        die "Failed to create the symlink\n";;[m
[31m-[m
[31m-    push @links, $target;[m
[31m-}[m
[31m-[m
[31m-print join("\n", @links), "\n";[m
[31m-[m
[31m-close $dir;[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 2785d57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/drizzle-nginx-module-0.1.9/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,264 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   create_pool_posix_memalign[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_ssi_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex a9948e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-reindex[m
[31m-src/location.h[m
[31m-src/filter.c[m
[31m-src/subrequest.h[m
[31m-src/sleep.h[m
[31m-src/util.c[m
[31m-src/echo.c[m
[31m-src/info.c[m
[31m-src/util.h[m
[31m-src/var.h[m
[31m-src/filter.h[m
[31m-src/sleep.c[m
[31m-src/var.c[m
[31m-src/timer.c[m
[31m-src/module.h[m
[31m-src/echo.h[m
[31m-src/info.h[m
[31m-src/foreach.c[m
[31m-src/location.c[m
[31m-src/timer.h[m
[31m-src/module.c[m
[31m-src/subrequest.c[m
[31m-src/handler.h[m
[31m-src/foreach.h[m
[31m-src/handler.c[m
[31m-nginx[m
[31m-*.html[m
[31m-ctags[m
[31m-t/servroot[m
[31m-all[m
[31m-buildroot/[m
[31m-go[m
[31m-Changes[m
[31m-build1[0-9][m
[31m-analyze[m
[31m-Makefile[m
[31m-*.plist[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex ec95f91..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - LUAJIT_LIB=/usr/lib64/libluajit-5.1.so[m
[31m-    - LUAJIT_INC=/usr/include/luajit-2.0[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-    - NGINX_VERSION=1.10.0[m
[31m-[m
[31m-before_install:[m
[31m-  - sudo apt-get install -qq -y cpanminus libluajit-5.1-dev libgd-dev[m
[31m-  - sudo cpanm -v --notest Test::Nginx > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-[m
[31m-install:[m
[31m-  - wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && tar -xzf nginx-${NGINX_VERSION}.tar.gz[m
[31m-  - git clone https://github.com/simpl/ngx_devel_kit.git[m
[31m-  - git clone https://github.com/openresty/set-misc-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/xss-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/rds-json-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/headers-more-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/lua-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/nginx-eval-module.git[m
[31m-[m
[31m-script:[m
[31m-  - cd nginx-${NGINX_VERSION}/[m
[31m-  -  ./configure --without-http_ssi_module --with-debug --with-select_module --with-poll_module --with-http_stub_status_module --with-http_image_filter_module --add-module=../ngx_devel_kit --add-module=../set-misc-nginx-module --add-module=../nginx-eval-module --add-module=../xss-nginx-module --add-module=../rds-json-nginx-module --add-module=../headers-more-nginx-module --add-module=../lua-nginx-module  --add-module=.. > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j2 > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - export PATH=$PATH:`pwd`/objs[m
[31m-  - cd ..[m
[31m-  - prove -r t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 6feffbf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-Copyright (C) 2009-2014, Yichun "agentzh" Zhang <agentzh@gmail.com>.[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-    * Redistributions of source code must retain the above copyright[m
[31m-    notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-    * Redistributions in binary form must reproduce the above copyright[m
[31m-    notice, this list of conditions and the following disclaimer in the[m
[31m-    documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/config[m
[1mdeleted file mode 100644[m
[1mindex 32b54bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/config[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_echo_module[m
[31m-[m
[31m-ECHO_SRCS="                                                                 \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_module.c                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_util.c                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_timer.c                            \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_var.c                              \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_handler.c                          \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_filter.c                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_sleep.c                            \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_location.c                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_echo.c                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_request_info.c                     \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_subrequest.c                       \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_foreach.c                          \[m
[31m-        "[m
[31m-[m
[31m-ECHO_DEPS="                                                                 \[m
[31m-        $ngx_addon_dir/src/ddebug.h                                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_module.h                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_handler.h                          \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_util.h                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_sleep.h                            \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_filter.h                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_var.h                              \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_location.h                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_echo.h                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_request_info.h                     \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_subrequest.h                       \[m
[31m-        $ngx_addon_dir/src/ngx_http_echo_foreach.h                          \[m
[31m-        "[m
[31m-[m
[31m-# nginx won't have HTTP_POSTPONE_FILTER_MODULE & HTTP_POSTPONE_FILTER_SRCS[m
[31m-# defined since 1.9.11[m
[31m-if test -z "$HTTP_POSTPONE_FILTER_MODULE"; then[m
[31m-    HTTP_POSTPONE_FILTER_MODULE=ngx_http_postpone_filter_module[m
[31m-    HTTP_POSTPONE_FILTER_SRCS=src/http/ngx_http_postpone_filter_module.c[m
[31m-fi[m
[31m-[m
[31m-# This module depends upon the postpone filter being activated[m
[31m-if [ $HTTP_POSTPONE != YES ]; then[m
[31m-    HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_POSTPONE_FILTER_MODULE"[m
[31m-    HTTP_SRCS="$HTTP_SRCS $HTTP_POSTPONE_FILTER_SRCS"[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$ECHO_DEPS"[m
[31m-    ngx_module_srcs="$ECHO_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ECHO_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ECHO_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 73400dd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "echo *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-static void ngx_inline[m
[31m-dd_enter_helper(ngx_http_request_t *r, const char *func) {[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, ">enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            0/*(int) r->main->count*/, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_echo.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_echo.c[m
[1mdeleted file mode 100644[m
[1mindex f5789f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_echo.c[m
[1m+++ /dev/null[m
[36m@@ -1,342 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_echo.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_filter.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-static ngx_buf_t ngx_http_echo_space_buf;[m
[31m-[m
[31m-static ngx_buf_t ngx_http_echo_newline_buf;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_echo_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    static u_char space_str[]   = " ";[m
[31m-    static u_char newline_str[] = "\n";[m
[31m-[m
[31m-    dd("global init...");[m
[31m-[m
[31m-    ngx_memzero(&ngx_http_echo_space_buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    ngx_http_echo_space_buf.memory = 1;[m
[31m-[m
[31m-    ngx_http_echo_space_buf.start =[m
[31m-        ngx_http_echo_space_buf.pos =[m
[31m-            space_str;[m
[31m-[m
[31m-    ngx_http_echo_space_buf.end =[m
[31m-        ngx_http_echo_space_buf.last =[m
[31m-            space_str + sizeof(space_str) - 1;[m
[31m-[m
[31m-    ngx_memzero(&ngx_http_echo_newline_buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    ngx_http_echo_newline_buf.memory = 1;[m
[31m-[m
[31m-    ngx_http_echo_newline_buf.start =[m
[31m-        ngx_http_echo_newline_buf.pos =[m
[31m-            newline_str;[m
[31m-[m
[31m-    ngx_http_echo_newline_buf.end =[m
[31m-        ngx_http_echo_newline_buf.last =[m
[31m-            newline_str + sizeof(newline_str) - 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_sync(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t                   *buf;[m
[31m-    ngx_chain_t                 *cl = NULL; /* the head of the chain link */[m
[31m-[m
[31m-    buf = ngx_calloc_buf(r->pool);[m
[31m-    if (buf == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf->sync = 1;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf  = buf;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, cl);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args,[m
[31m-    ngx_flag_t in_filter, ngx_array_t *opts)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-[m
[31m-    ngx_buf_t                   *space_buf;[m
[31m-    ngx_buf_t                   *newline_buf;[m
[31m-    ngx_buf_t                   *buf;[m
[31m-[m
[31m-    ngx_str_t                   *computed_arg;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_str_t                   *opt;[m
[31m-[m
[31m-    ngx_chain_t *cl  = NULL; /* the head of the chain link */[m
[31m-    ngx_chain_t **ll = &cl;  /* always point to the address of the last link */[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (computed_args == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-    for (i = 0; i < computed_args->nelts; i++) {[m
[31m-        computed_arg = &computed_arg_elts[i];[m
[31m-[m
[31m-        if (computed_arg->len == 0) {[m
[31m-            buf = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            buf = ngx_calloc_buf(r->pool);[m
[31m-            if (buf == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            buf->start = buf->pos = computed_arg->data;[m
[31m-            buf->last = buf->end = computed_arg->data +[m
[31m-                computed_arg->len;[m
[31m-[m
[31m-            buf->memory = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl == NULL) {[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-            cl->buf  = buf;[m
[31m-            cl->next = NULL;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-        } else {[m
[31m-            /* append a space first */[m
[31m-            *ll = ngx_alloc_chain_link(r->pool);[m
[31m-[m
[31m-            if (*ll == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            space_buf = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-            if (space_buf == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* nginx clears buf flags at the end of each request handling,[m
[31m-             * so we have to make a clone here. */[m
[31m-            *space_buf = ngx_http_echo_space_buf;[m
[31m-[m
[31m-            (*ll)->buf = space_buf;[m
[31m-            (*ll)->next = NULL;[m
[31m-[m
[31m-            ll = &(*ll)->next;[m
[31m-[m
[31m-            /* then append the buf only if it's non-empty */[m
[31m-            if (buf) {[m
[31m-                *ll = ngx_alloc_chain_link(r->pool);[m
[31m-                if (*ll == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-                (*ll)->buf  = buf;[m
[31m-                (*ll)->next = NULL;[m
[31m-[m
[31m-                ll = &(*ll)->next;[m
[31m-            }[m
[31m-        }[m
[31m-    } /* end for */[m
[31m-[m
[31m-    if (cl && cl->buf == NULL) {[m
[31m-        cl = cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (opts && opts->nelts > 0) {[m
[31m-        opt = opts->elts;[m
[31m-        /* FIXME handle other unrecognized options here */[m
[31m-        if (opt[0].len == 1 && opt[0].data[0] == 'n') {[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* append the newline character */[m
[31m-[m
[31m-    newline_buf = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-    if (newline_buf == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *newline_buf = ngx_http_echo_newline_buf;[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = newline_buf;[m
[31m-        cl->next = NULL;[m
[31m-        /* ll = &cl->next; */[m
[31m-[m
[31m-    } else {[m
[31m-        *ll = ngx_alloc_chain_link(r->pool);[m
[31m-[m
[31m-        if (*ll == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (*ll)->buf  = newline_buf;[m
[31m-        (*ll)->next = NULL;[m
[31m-        /* ll = &(*ll)->next; */[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (cl == NULL || cl->buf == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (in_filter) {[m
[31m-        return ngx_http_echo_next_body_filter(r, cl);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, cl);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_flush(ngx_http_request_t *r, ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    return ngx_http_send_special(r, NGX_HTTP_FLUSH);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t       *b;[m
[31m-    ngx_chain_t     *out, *cl, **ll;[m
[31m-[m
[31m-    if (r->request_body == NULL || r->request_body->bufs == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-        if (ngx_buf_special(cl->buf)) {[m
[31m-            /* we do not want to create zero-size bufs */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *ll = ngx_alloc_chain_link(r->pool);[m
[31m-        if (*ll == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_alloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (*ll)->buf = b;[m
[31m-        (*ll)->next = NULL;[m
[31m-[m
[31m-        ngx_memcpy(b, cl->buf, sizeof(ngx_buf_t));[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_echo_exec_echo_request_body;[m
[31m-        b->last_buf = 0;[m
[31m-        b->last_in_chain = 0;[m
[31m-[m
[31m-        ll = &(*ll)->next;[m
[31m-    }[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_duplicate(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_str_t                   *computed_arg;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ssize_t                      i, count;[m
[31m-    ngx_str_t                   *str;[m
[31m-    u_char                      *p;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_buf_t                   *buf;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-[m
[31m-    computed_arg = &computed_arg_elts[0];[m
[31m-[m
[31m-    count = ngx_http_echo_atosz(computed_arg->data, computed_arg->len);[m
[31m-[m
[31m-    if (count == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid size specified: \"%V\"", computed_arg);[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    str = &computed_arg_elts[1];[m
[31m-[m
[31m-    if (count == 0 || str->len == 0) {[m
[31m-        rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_create_temp_buf(r->pool, count * str->len);[m
[31m-    if (buf == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = buf->pos;[m
[31m-    for (i = 0; i < count; i++) {[m
[31m-        p = ngx_copy(p, str->data, str->len);[m
[31m-    }[m
[31m-    buf->last = p;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-    cl->next = NULL;[m
[31m-    cl->buf = buf;[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, cl);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_echo.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_echo.h[m
[1mdeleted file mode 100644[m
[1mindex 896f1ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_echo.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-#ifndef ECHO_ECHO_H[m
[31m-#define ECHO_ECHO_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_echo_init(ngx_conf_t *cf);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_sync(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args,[m
[31m-        ngx_flag_t in_filter, ngx_array_t *opts);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_request_body(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_flush(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_duplicate(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-#endif /* ECHO_ECHO_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_filter.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_filter.c[m
[1mdeleted file mode 100644[m
[1mindex 689b52e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_filter.c[m
[1m+++ /dev/null[m
[36m@@ -1,282 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_filter.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_echo.h"[m
[31m-[m
[31m-#include <ngx_log.h>[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt ngx_http_echo_next_header_filter;[m
[31m-[m
[31m-ngx_http_output_body_filter_pt ngx_http_echo_next_body_filter;[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_header_filter(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_body_filter(ngx_http_request_t *r,[m
[31m-        ngx_chain_t *in);[m
[31m-[m
[31m-/* filter handlers */[m
[31m-static ngx_int_t ngx_http_echo_exec_filter_cmds(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *cmds, ngx_uint_t *iterator);[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_echo_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                              multi_http_blocks;[m
[31m-    ngx_http_echo_main_conf_t       *emcf;[m
[31m-[m
[31m-    emcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ngx_http_echo_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_echo_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || emcf->requires_filter) {[m
[31m-        dd("top header filter: %ld",[m
[31m-           (unsigned long) ngx_http_top_header_filter);[m
[31m-[m
[31m-        ngx_http_echo_next_header_filter = ngx_http_top_header_filter;[m
[31m-        ngx_http_top_header_filter = ngx_http_echo_header_filter;[m
[31m-[m
[31m-        dd("top body filter: %ld", (unsigned long) ngx_http_top_body_filter);[m
[31m-[m
[31m-        ngx_http_echo_next_body_filter = ngx_http_top_body_filter;[m
[31m-        ngx_http_top_body_filter  = ngx_http_echo_body_filter;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t    *conf;[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "echo header filter, uri \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    /* XXX we should add option to insert contents for responses[m
[31m-     * of non-200 status code here... */[m
[31m-    /*[m
[31m-    if (r->headers_out.status != NGX_HTTP_OK) {[m
[31m-        if (ctx != NULL) {[m
[31m-            ctx->skip_filter = 1;[m
[31m-        }[m
[31m-        return ngx_http_echo_next_header_filter(r);[m
[31m-    }[m
[31m-    */[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-    if (conf->before_body_cmds == NULL && conf->after_body_cmds == NULL) {[m
[31m-        if (ctx != NULL) {[m
[31m-            ctx->skip_filter = 1;[m
[31m-        }[m
[31m-        return ngx_http_echo_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_echo_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_echo_module);[m
[31m-    }[m
[31m-[m
[31m-    /* enable streaming here (use chunked encoding) */[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-    return ngx_http_echo_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_echo_loc_conf_t    *conf;[m
[31m-    unsigned                     last;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_buf_t                   *b;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "echo body filter, uri \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (in == NULL || r->header_only) {[m
[31m-        return ngx_http_echo_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->skip_filter) {[m
[31m-        return ngx_http_echo_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (!ctx->before_body_sent) {[m
[31m-        ctx->before_body_sent = 1;[m
[31m-[m
[31m-        if (conf->before_body_cmds != NULL) {[m
[31m-            rc = ngx_http_echo_exec_filter_cmds(r, ctx, conf->before_body_cmds,[m
[31m-                                                &ctx->next_before_body_cmd);[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->after_body_cmds == NULL) {[m
[31m-        ctx->skip_filter = 1;[m
[31m-        return ngx_http_echo_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        dd("cl %p, special %d", cl, ngx_buf_special(cl->buf));[m
[31m-[m
[31m-        if (cl->buf->last_buf || cl->buf->last_in_chain) {[m
[31m-            cl->buf->last_buf = 0;[m
[31m-            cl->buf->last_in_chain = 0;[m
[31m-            cl->buf->sync = 1;[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("in %p, last %d", in, (int) last);[m
[31m-[m
[31m-    if (in) {[m
[31m-        rc = ngx_http_echo_next_body_filter(r, in);[m
[31m-[m
[31m-#if 0[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        dd("next filter returns %d, last %d", (int) rc, (int) last);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK || !last) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("exec filter cmds for after body cmds");[m
[31m-[m
[31m-    rc = ngx_http_echo_exec_filter_cmds(r, ctx, conf->after_body_cmds,[m
[31m-                                        &ctx->next_after_body_cmd);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        dd("FAILED: exec filter cmds for after body cmds");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->skip_filter = 1;[m
[31m-[m
[31m-    dd("after body cmds executed...terminating...");[m
[31m-[m
[31m-    /* XXX we can NOT use[m
[31m-     * ngx_http_send_special(r, NGX_HTTP_LAST) here[m
[31m-     * because we should bypass the upstream filters. */[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main && !r->post_action) {[m
[31m-        b->last_buf = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        b->sync = 1;[m
[31m-        b->last_in_chain = 1;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    return ngx_http_echo_next_body_filter(r, cl);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_exec_filter_cmds(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *cmds, ngx_uint_t *iterator)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_array_t                 *opts = NULL;[m
[31m-    ngx_array_t                 *computed_args = NULL;[m
[31m-    ngx_http_echo_cmd_t         *cmd;[m
[31m-    ngx_http_echo_cmd_t         *cmd_elts;[m
[31m-[m
[31m-    for (cmd_elts = cmds->elts; *iterator < cmds->nelts; (*iterator)++) {[m
[31m-        cmd = &cmd_elts[*iterator];[m
[31m-[m
[31m-        /* evaluate arguments for the current cmd (if any) */[m
[31m-        if (cmd->args) {[m
[31m-            computed_args = ngx_array_create(r->pool, cmd->args->nelts,[m
[31m-                                             sizeof(ngx_str_t));[m
[31m-            if (computed_args == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            opts = ngx_array_create(r->pool, 1, sizeof(ngx_str_t));[m
[31m-            if (opts == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_echo_eval_cmd_args(r, cmd, computed_args, opts);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "Failed to evaluate arguments for "[m
[31m-                              "the directive.");[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* do command dispatch based on the opcode */[m
[31m-        switch (cmd->opcode) {[m
[31m-        case echo_opcode_echo_before_body:[m
[31m-        case echo_opcode_echo_after_body:[m
[31m-            dd("exec echo_before_body or echo_after_body...");[m
[31m-[m
[31m-            rc = ngx_http_echo_exec_echo(r, ctx, computed_args,[m
[31m-                                         1 /* in filter */, opts);[m
[31m-[m
[31m-            if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        default:[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_filter.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_filter.h[m
[1mdeleted file mode 100644[m
[1mindex ea5115d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_filter.h[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-#ifndef ECHO_FILTER_H[m
[31m-#define ECHO_FILTER_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt ngx_http_echo_next_header_filter;[m
[31m-[m
[31m-extern ngx_http_output_body_filter_pt ngx_http_echo_next_body_filter;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_filter_init (ngx_conf_t *cf);[m
[31m-[m
[31m-#endif /* ECHO_FILTER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_foreach.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_foreach.c[m
[1mdeleted file mode 100644[m
[1mindex a4a2b54..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_foreach.c[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_foreach.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_it_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_array_t                 *choices;[m
[31m-    ngx_str_t                   *choice_elts, *choice;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx && ctx->foreach != NULL) {[m
[31m-[m
[31m-        choices = ctx->foreach->choices;[m
[31m-        i = ctx->foreach->next_choice;[m
[31m-[m
[31m-        if (i < choices->nelts) {[m
[31m-            choice_elts = choices->elts;[m
[31m-            choice = &choice_elts[i];[m
[31m-[m
[31m-            v->len = choice->len;[m
[31m-            v->data = choice->data;[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 1;[m
[31m-            v->not_found = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_foreach_split(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t    *elcf;[m
[31m-    ngx_str_t                   *delimiter, *compound;[m
[31m-    u_char                      *pos, *last, *end;[m
[31m-    ngx_str_t                   *choice;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_array_t                 *cmds;[m
[31m-    ngx_http_echo_cmd_t         *cmd;[m
[31m-    ngx_http_echo_cmd_t         *cmd_elts;[m
[31m-[m
[31m-    if (ctx->foreach != NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "Nested echo_foreach not supported yet.");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (computed_args->nelts < 2) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "echo_foreach should take at least two arguments. "[m
[31m-                      "(if your delimiter starts with \"-\", preceding it "[m
[31m-                      "with a \"--\".)");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-[m
[31m-    compound  = &computed_arg_elts[1];[m
[31m-[m
[31m-    dd("HEY coumpound len: %u", (int) compound->len);[m
[31m-[m
[31m-    ctx->foreach = ngx_palloc(r->pool, sizeof(ngx_http_echo_foreach_ctx_t));[m
[31m-[m
[31m-    if (ctx->foreach == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->foreach->cmd_index = ctx->next_handler_cmd;[m
[31m-[m
[31m-    ctx->foreach->next_choice = 0;[m
[31m-[m
[31m-    ctx->foreach->choices = ngx_array_create(r->pool, 10, sizeof(ngx_str_t));[m
[31m-    if (ctx->foreach->choices == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    delimiter = &computed_arg_elts[0];[m
[31m-[m
[31m-    pos = compound->data;[m
[31m-    end = compound->data + compound->len;[m
[31m-[m
[31m-    while ((last = ngx_http_echo_strlstrn(pos, end, delimiter->data,[m
[31m-                                          delimiter->len - 1)) != NULL)[m
[31m-    {[m
[31m-        dd("entered the loop");[m
[31m-[m
[31m-        if (last == pos) {[m
[31m-            dd("!!! len == 0");[m
[31m-            pos = last + delimiter->len;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        choice = ngx_array_push(ctx->foreach->choices);[m
[31m-        if (choice == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        choice->data = pos;[m
[31m-        choice->len  = last - pos;[m
[31m-        pos = last + delimiter->len;[m
[31m-    }[m
[31m-[m
[31m-    if (pos < end) {[m
[31m-        choice = ngx_array_push(ctx->foreach->choices);[m
[31m-        if (choice == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        choice->data = pos;[m
[31m-        choice->len  = end - pos;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->foreach->choices->nelts == 0) {[m
[31m-        /* skip the foreach body entirely */[m
[31m-        elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-        cmds = elcf->handler_cmds;[m
[31m-        cmd_elts = cmds->elts;[m
[31m-        for (/* void */; ctx->next_handler_cmd < cmds->nelts;[m
[31m-             ctx->next_handler_cmd++)[m
[31m-        {[m
[31m-            cmd = &cmd_elts[ctx->next_handler_cmd + 1];[m
[31m-            if (cmd->opcode == echo_opcode_echo_end) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_end(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    if (ctx->foreach == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "Found a echo_end that has no corresponding echo_foreach "[m
[31m-                      "before it.");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->foreach->next_choice++;[m
[31m-[m
[31m-    if (ctx->foreach->next_choice >= ctx->foreach->choices->nelts) {[m
[31m-        /* TODO We need to explicitly free the foreach ctx from[m
[31m-         * the pool */[m
[31m-        ctx->foreach = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("echo_end: ++ next_choice (total: %u): %u",[m
[31m-       (unsigned) ctx->foreach->choices->nelts,[m
[31m-       (unsigned) ctx->foreach->next_choice);[m
[31m-[m
[31m-    /* the main handler dispatcher loop will increment[m
[31m-     *   ctx->next_handler_cmd for us anyway. */[m
[31m-    ctx->next_handler_cmd = ctx->foreach->cmd_index;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_foreach.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_foreach.h[m
[1mdeleted file mode 100644[m
[1mindex 49592f4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_foreach.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-#ifndef ECHO_FOREACH_H[m
[31m-#define ECHO_FOREACH_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_foreach_split(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_end(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_it_variable(ngx_http_request_t *r,[m
[31m-        ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-#endif /* ECHO_FOREACH_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 00933a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,429 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_filter.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-#include "ngx_http_echo_echo.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_sleep.h"[m
[31m-#include "ngx_http_echo_var.h"[m
[31m-#include "ngx_http_echo_timer.h"[m
[31m-#include "ngx_http_echo_location.h"[m
[31m-#include "ngx_http_echo_subrequest.h"[m
[31m-#include "ngx_http_echo_request_info.h"[m
[31m-#include "ngx_http_echo_foreach.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_log.h>[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_echo_wev_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    dd("wev handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    dd("waiting: %d, done: %d", (int) ctx->waiting, (int) ctx->done);[m
[31m-[m
[31m-    if (ctx->waiting && ! ctx->done) {[m
[31m-[m
[31m-        if (r == r->connection->data && r->postponed) {[m
[31m-[m
[31m-            if (r->postponed->request) {[m
[31m-                r->connection->data = r->postponed->request;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8012[m
[31m-                ngx_http_post_request(r->postponed->request, NULL);[m
[31m-#else[m
[31m-                ngx_http_post_request(r->postponed->request);[m
[31m-#endif[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_http_echo_flush_postponed_outputs(r);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->done = 0;[m
[31m-[m
[31m-    ctx->next_handler_cmd++;[m
[31m-[m
[31m-    rc = ngx_http_echo_run_cmds(r);[m
[31m-[m
[31m-    dd("rc: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc == NGX_DONE) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        dd("mark busy %d for %.*s", (int) ctx->next_handler_cmd,[m
[31m-           (int) r->uri.len,[m
[31m-           r->uri.data);[m
[31m-[m
[31m-        ctx->waiting = 1;[m
[31m-        ctx->done = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("mark ready %d", (int) ctx->next_handler_cmd);[m
[31m-        ctx->waiting = 0;[m
[31m-        ctx->done = 1;[m
[31m-[m
[31m-        dd("finalizing with rc %d", (int) rc);[m
[31m-[m
[31m-        dd("finalize request %.*s with %d", (int) r->uri.len, r->uri.data,[m
[31m-           (int) rc);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    dd("subrequest in memory: %d", (int) r->subrequest_in_memory);[m
[31m-[m
[31m-    rc = ngx_http_echo_run_cmds(r);[m
[31m-[m
[31m-    dd("run cmds returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc == NGX_OK[m
[31m-        || rc == NGX_DONE[m
[31m-        || rc == NGX_DECLINED)[m
[31m-    {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        if (ctx && r->header_sent) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    r->main->count++;[m
[31m-#endif[m
[31m-[m
[31m-    dd("%d", r->connection->destroyed);[m
[31m-    dd("%d", r->done);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        dd("mark busy %d for %.*s", (int) ctx->next_handler_cmd,[m
[31m-           (int) r->uri.len,[m
[31m-           r->uri.data);[m
[31m-[m
[31m-        ctx->waiting = 1;[m
[31m-        ctx->done = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_run_cmds(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t    *elcf;[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_array_t                 *cmds;[m
[31m-    ngx_array_t                 *computed_args = NULL;[m
[31m-    ngx_http_echo_cmd_t         *cmd;[m
[31m-    ngx_http_echo_cmd_t         *cmd_elts;[m
[31m-    ngx_array_t                 *opts = NULL;[m
[31m-[m
[31m-    elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-    cmds = elcf->handler_cmds;[m
[31m-    if (cmds == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_echo_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_echo_module);[m
[31m-    }[m
[31m-[m
[31m-    dd("exec handler: %.*s: %i", (int) r->uri.len, r->uri.data,[m
[31m-       (int) ctx->next_handler_cmd);[m
[31m-[m
[31m-    cmd_elts = cmds->elts;[m
[31m-[m
[31m-    for (; ctx->next_handler_cmd < cmds->nelts; ctx->next_handler_cmd++) {[m
[31m-[m
[31m-        cmd = &cmd_elts[ctx->next_handler_cmd];[m
[31m-[m
[31m-        /* evaluate arguments for the current cmd (if any) */[m
[31m-        if (cmd->args) {[m
[31m-            computed_args = ngx_array_create(r->pool, cmd->args->nelts,[m
[31m-                                             sizeof(ngx_str_t));[m
[31m-[m
[31m-            if (computed_args == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            opts = ngx_array_create(r->pool, 1, sizeof(ngx_str_t));[m
[31m-[m
[31m-            if (opts == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_echo_eval_cmd_args(r, cmd, computed_args, opts);[m
[31m-            if (rc != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "Failed to evaluate arguments for "[m
[31m-                              "the directive.");[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* do command dispatch based on the opcode */[m
[31m-[m
[31m-        switch (cmd->opcode) {[m
[31m-[m
[31m-        case echo_opcode_echo_sync:[m
[31m-            rc = ngx_http_echo_exec_echo_sync(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo:[m
[31m-            /* XXX moved the following code to a separate[m
[31m-             * function */[m
[31m-            dd("found echo opcode");[m
[31m-            rc = ngx_http_echo_exec_echo(r, ctx, computed_args,[m
[31m-                                         0 /* in filter */, opts);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_request_body:[m
[31m-            rc = ngx_http_echo_exec_echo_request_body(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_location_async:[m
[31m-            if (!r->request_body) {[m
[31m-                /* we require reading the request body before doing[m
[31m-                 * subrequests */[m
[31m-[m
[31m-                ctx->next_handler_cmd--; /* re-run the current cmd */[m
[31m-                goto read_request_body;[m
[31m-            }[m
[31m-[m
[31m-            dd("found opcode echo location async...");[m
[31m-            rc = ngx_http_echo_exec_echo_location_async(r, ctx,[m
[31m-                                                        computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_location:[m
[31m-            if (!r->request_body) {[m
[31m-                /* we require reading the request body before doing[m
[31m-                 * subrequests */[m
[31m-[m
[31m-                ctx->next_handler_cmd--; /* re-run the current cmd */[m
[31m-                goto read_request_body;[m
[31m-            }[m
[31m-[m
[31m-            return ngx_http_echo_exec_echo_location(r, ctx, computed_args);[m
[31m-[m
[31m-        case echo_opcode_echo_subrequest_async:[m
[31m-            if (!r->request_body) {[m
[31m-                /* we require reading the request body before doing[m
[31m-                 * subrequests */[m
[31m-[m
[31m-                ctx->next_handler_cmd--; /* re-run the current cmd */[m
[31m-                goto read_request_body;[m
[31m-            }[m
[31m-[m
[31m-            dd("found opcode echo subrequest async...");[m
[31m-            rc = ngx_http_echo_exec_echo_subrequest_async(r, ctx,[m
[31m-                                                          computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_subrequest:[m
[31m-            if (!r->request_body) {[m
[31m-                /* we require reading the request body before doing[m
[31m-                 * subrequests */[m
[31m-[m
[31m-                ctx->next_handler_cmd--; /* re-run the current cmd */[m
[31m-                goto read_request_body;[m
[31m-            }[m
[31m-[m
[31m-            return ngx_http_echo_exec_echo_subrequest(r, ctx, computed_args);[m
[31m-[m
[31m-        case echo_opcode_echo_sleep:[m
[31m-            return ngx_http_echo_exec_echo_sleep(r, ctx, computed_args);[m
[31m-[m
[31m-        case echo_opcode_echo_flush:[m
[31m-            rc = ngx_http_echo_exec_echo_flush(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_blocking_sleep:[m
[31m-            rc = ngx_http_echo_exec_echo_blocking_sleep(r, ctx,[m
[31m-                                                        computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_reset_timer:[m
[31m-            rc = ngx_http_echo_exec_echo_reset_timer(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_duplicate:[m
[31m-            rc = ngx_http_echo_exec_echo_duplicate(r, ctx, computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_read_request_body:[m
[31m-[m
[31m-read_request_body:[m
[31m-[m
[31m-            ctx->wait_read_request_body = 0;[m
[31m-[m
[31m-            rc = ngx_http_echo_exec_echo_read_request_body(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version >= 8011 && nginx_version < 1002006)                       \[m
[31m-    || (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-                r->main->count--;[m
[31m-#endif[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-#if nginx_version >= 8011[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-            dd("read request body: %d", (int) rc);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-            ctx->wait_read_request_body = 1;[m
[31m-            return NGX_AGAIN;[m
[31m-[m
[31m-        case echo_opcode_echo_foreach_split:[m
[31m-            rc = ngx_http_echo_exec_echo_foreach_split(r, ctx, computed_args);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_end:[m
[31m-            rc = ngx_http_echo_exec_echo_end(r, ctx);[m
[31m-            break;[m
[31m-[m
[31m-        case echo_opcode_echo_exec:[m
[31m-            dd("echo_exec");[m
[31m-            return ngx_http_echo_exec_exec(r, ctx, computed_args);[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "unknown opcode: %d", cmd->opcode);[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_chain_link(r, ctx, NULL /* indicate LAST */);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body) {[m
[31m-        if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_post_subrequest(ngx_http_request_t *r,[m
[31m-    void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx = data;[m
[31m-    ngx_http_request_t          *pr;[m
[31m-    ngx_http_echo_ctx_t         *pr_ctx;[m
[31m-[m
[31m-    dd("echo post_subrequest: %.*s", (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    if (ctx->run_post_subrequest) {[m
[31m-        dd("already run post_subrequest: %p: %.*s", ctx,[m
[31m-           (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("setting run_post_subrequest to 1 for %p for %.*s", ctx,[m
[31m-       (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    ctx->run_post_subrequest = 1;[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    pr_ctx = ngx_http_get_module_ctx(pr, ngx_http_echo_module);[m
[31m-    if (pr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("mark ready %d", (int) pr_ctx->next_handler_cmd);[m
[31m-[m
[31m-    pr_ctx->waiting = 0;[m
[31m-    pr_ctx->done = 1;[m
[31m-[m
[31m-    pr->write_event_handler = ngx_http_echo_wev_handler;[m
[31m-[m
[31m-    /* work-around issues in nginx's event module */[m
[31m-[m
[31m-    if (r != r->connection->data[m
[31m-        && r->postponed[m
[31m-        && (r->main->posted_requests == NULL[m
[31m-            || r->main->posted_requests->request != pr))[m
[31m-    {[m
[31m-#if defined(nginx_version) && nginx_version >= 8012[m
[31m-        ngx_http_post_request(pr, NULL);[m
[31m-#else[m
[31m-        ngx_http_post_request(pr);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_handler.h[m
[1mdeleted file mode 100644[m
[1mindex afc0666..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-#ifndef ECHO_HANDLER_H[m
[31m-#define ECHO_HANDLER_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_echo_wev_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_run_cmds(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_post_subrequest(ngx_http_request_t *r,[m
[31m-        void *data, ngx_int_t rc);[m
[31m-[m
[31m-[m
[31m-#endif /* ECHO_HANDLER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_location.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_location.c[m
[1mdeleted file mode 100644[m
[1mindex bfabb5e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_location.c[m
[1m+++ /dev/null[m
[36m@@ -1,178 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_location.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_adjust_subrequest(ngx_http_request_t *sr);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_location_async(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_request_t          *sr; /* subrequest object */[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_str_t                    location;[m
[31m-    ngx_str_t                   *url_args;[m
[31m-    ngx_str_t                    args;[m
[31m-    ngx_uint_t                   flags = 0;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-[m
[31m-    location = computed_arg_elts[0];[m
[31m-[m
[31m-    if (location.len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (computed_args->nelts > 1) {[m
[31m-        url_args = &computed_arg_elts[1];[m
[31m-    } else {[m
[31m-        url_args = NULL;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &location, &args, &flags) != NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_location_async sees unsafe uri: \"%V\"",[m
[31m-                       &location);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && url_args == NULL) {[m
[31m-        url_args = &args;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, &location, url_args, &sr, NULL, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_adjust_subrequest(sr);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_location(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_request_t                  *sr; /* subrequest object */[m
[31m-    ngx_str_t                           *computed_arg_elts;[m
[31m-    ngx_str_t                            location;[m
[31m-    ngx_str_t                           *url_args;[m
[31m-    ngx_http_post_subrequest_t          *psr;[m
[31m-    ngx_str_t                            args;[m
[31m-    ngx_uint_t                           flags = 0;[m
[31m-    ngx_http_echo_ctx_t                 *sr_ctx;[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-[m
[31m-    location = computed_arg_elts[0];[m
[31m-[m
[31m-    if (location.len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (computed_args->nelts > 1) {[m
[31m-        url_args = &computed_arg_elts[1];[m
[31m-[m
[31m-    } else {[m
[31m-        url_args = NULL;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &location, &args, &flags) != NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_location sees unsafe uri: \"%V\"",[m
[31m-                       &location);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && url_args == NULL) {[m
[31m-        url_args = &args;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx = ngx_http_echo_create_ctx(r);[m
[31m-[m
[31m-    psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-    if (psr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    psr->handler = ngx_http_echo_post_subrequest;[m
[31m-    psr->data = sr_ctx;[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, &location, url_args, &sr, psr, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_adjust_subrequest(sr);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_adjust_subrequest(ngx_http_request_t *sr)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    /* we do not inherit the parent request's variables */[m
[31m-    cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-[m
[31m-    r = sr->parent;[m
[31m-[m
[31m-    sr->header_in = r->header_in;[m
[31m-[m
[31m-    /* XXX work-around a bug in ngx_http_subrequest */[m
[31m-    if (r->headers_in.headers.last == &r->headers_in.headers.part) {[m
[31m-        sr->headers_in.headers.last = &sr->headers_in.headers.part;[m
[31m-    }[m
[31m-[m
[31m-    sr->variables = ngx_pcalloc(sr->pool, cmcf->variables.nelts[m
[31m-                                * sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-    if (sr->variables == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_location.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_location.h[m
[1mdeleted file mode 100644[m
[1mindex 6bc0e03..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_location.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef ECHO_LOCATION_H[m
[31m-#define ECHO_LOCATION_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_location_async(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_location(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-#endif /* ECHO_LOCATION_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_module.c[m
[1mdeleted file mode 100644[m
[1mindex ae70479..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,669 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-#include "ngx_http_echo_filter.h"[m
[31m-#include "ngx_http_echo_echo.h"[m
[31m-#include "ngx_http_echo_request_info.h"[m
[31m-#include "ngx_http_echo_var.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_log.h>[m
[31m-[m
[31m-[m
[31m-/* config init handler */[m
[31m-static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static void *ngx_http_echo_create_main_conf(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_echo_post_config(ngx_conf_t *cf);[m
[31m-[m
[31m-/* config directive handlers */[m
[31m-static char *ngx_http_echo_echo(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_echo_echo_request_body(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_sleep(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_echo_echo_flush(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_echo_echo_blocking_sleep(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_reset_timer(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_before_body(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_after_body(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_location_async(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_location(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_subrequest_async(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_subrequest(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_duplicate(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_read_request_body(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_foreach_split(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_end(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_abort_parent(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_echo_exec(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_echo_helper(ngx_http_echo_opcode_t opcode,[m
[31m-    ngx_http_echo_cmd_category_t cat,[m
[31m-    ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_echo_module_ctx = {[m
[31m-    NULL,                           /* preconfiguration */[m
[31m-    ngx_http_echo_post_config,      /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_echo_create_main_conf, /* create main configuration */[m
[31m-    NULL,                           /* init main configuration */[m
[31m-[m
[31m-    NULL,                           /* create server configuration */[m
[31m-    NULL,                           /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_echo_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_http_echo_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_echo_commands[] = {[m
[31m-[m
[31m-    { ngx_string("echo"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_ANY,[m
[31m-      ngx_http_echo_echo,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_request_body"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_request_body,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_sleep"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_echo_echo_sleep,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_flush"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_flush,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_blocking_sleep"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_echo_echo_blocking_sleep,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_reset_timer"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_reset_timer,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_before_body"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_ANY,[m
[31m-      ngx_http_echo_echo_before_body,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, before_body_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_after_body"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_ANY,[m
[31m-      ngx_http_echo_echo_after_body,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, after_body_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_location_async"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_echo_echo_location_async,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_location"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_echo_echo_location,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_subrequest_async"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_echo_echo_subrequest_async,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_subrequest"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_echo_echo_subrequest,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_duplicate"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_echo_echo_duplicate,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_read_request_body"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_read_request_body,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_foreach_split"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_echo_echo_foreach_split,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_end"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_end,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_abort_parent"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_echo_echo_abort_parent,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_exec"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_echo_echo_exec,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, handler_cmds),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("echo_status"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_echo_loc_conf_t, status),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_echo_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_echo_module_ctx,     /* module context */[m
[31m-    ngx_http_echo_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_echo_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc[m
[31m-     *  conf->handler_cmds = NULL[m
[31m-     *  conf->before_body_cmds = NULL[m
[31m-     *  conf->after_body_cmds = NULL[m
[31m-     *  conf->seen_leading_output = 0[m
[31m-     *  conf->seen_trailing_output = 0[m
[31m-     */[m
[31m-[m
[31m-    conf->status = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t    *prev = parent;[m
[31m-    ngx_http_echo_loc_conf_t    *conf = child;[m
[31m-[m
[31m-    if (conf->handler_cmds == NULL) {[m
[31m-        conf->handler_cmds = prev->handler_cmds;[m
[31m-        conf->seen_leading_output = prev->seen_leading_output;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->before_body_cmds == NULL) {[m
[31m-        conf->before_body_cmds = prev->before_body_cmds;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->after_body_cmds == NULL) {[m
[31m-        conf->after_body_cmds = prev->after_body_cmds;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->status, prev->status, 200);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_helper(ngx_http_echo_opcode_t opcode,[m
[31m-    ngx_http_echo_cmd_category_t cat,[m
[31m-    ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                       *raw_args;[m
[31m-    ngx_uint_t                       i, n;[m
[31m-    ngx_array_t                    **args_ptr;[m
[31m-    ngx_array_t                    **cmds_ptr;[m
[31m-    ngx_http_echo_cmd_t             *echo_cmd;[m
[31m-    ngx_http_core_loc_conf_t        *clcf;[m
[31m-    ngx_http_script_compile_t        sc;[m
[31m-    ngx_http_echo_main_conf_t       *emcf;[m
[31m-    ngx_http_echo_arg_template_t    *arg;[m
[31m-[m
[31m-    emcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_echo_module);[m
[31m-[m
[31m-    /* cmds_ptr points to ngx_http_echo_loc_conf_t's[m
[31m-     * handler_cmds, before_body_cmds, or after_body_cmds[m
[31m-     * array, depending on the actual offset */[m
[31m-    cmds_ptr = (ngx_array_t **) (((u_char *) conf) + cmd->offset);[m
[31m-[m
[31m-    if (*cmds_ptr == NULL) {[m
[31m-        *cmds_ptr = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_echo_cmd_t));[m
[31m-[m
[31m-        if (*cmds_ptr == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cat == echo_handler_cmd) {[m
[31m-            dd("registering the content handler");[m
[31m-            /* register the content handler */[m
[31m-            clcf = ngx_http_conf_get_module_loc_conf(cf,[m
[31m-                                                     ngx_http_core_module);[m
[31m-[m
[31m-            dd("registering the content handler (2)");[m
[31m-            clcf->handler = ngx_http_echo_handler;[m
[31m-[m
[31m-        } else {[m
[31m-            dd("filter used = 1");[m
[31m-            emcf->requires_filter = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    echo_cmd = ngx_array_push(*cmds_ptr);[m
[31m-[m
[31m-    if (echo_cmd == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    echo_cmd->opcode = opcode;[m
[31m-[m
[31m-    args_ptr = &echo_cmd->args;[m
[31m-    *args_ptr = ngx_array_create(cf->pool, 1,[m
[31m-                                 sizeof(ngx_http_echo_arg_template_t));[m
[31m-[m
[31m-    if (*args_ptr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    raw_args = cf->args->elts;[m
[31m-[m
[31m-    /* we skip the first arg and start from the second */[m
[31m-[m
[31m-    for (i = 1 ; i < cf->args->nelts; i++) {[m
[31m-        arg = ngx_array_push(*args_ptr);[m
[31m-[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        arg->raw_value = raw_args[i];[m
[31m-[m
[31m-        dd("found raw arg %s", raw_args[i].data);[m
[31m-[m
[31m-        arg->lengths = NULL;[m
[31m-        arg->values  = NULL;[m
[31m-[m
[31m-        n = ngx_http_script_variables_count(&arg->raw_value);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &arg->raw_value;[m
[31m-            sc.lengths = &arg->lengths;[m
[31m-            sc.values = &arg->values;[m
[31m-            sc.variables = n;[m
[31m-            sc.complete_lengths = 1;[m
[31m-            sc.complete_values = 1;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    } /* end for */[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("in echo_echo...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_request_body(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("in echo_echo_request_body...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_request_body, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_sleep(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    dd("in echo_sleep...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_sleep, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_flush(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("in echo_flush...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_flush, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_blocking_sleep(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    dd("in echo_blocking_sleep...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_blocking_sleep,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_reset_timer(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_reset_timer, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_before_body(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    dd("processing echo_before_body directive...");[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_before_body, echo_filter_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_after_body(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_after_body, echo_filter_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_location_async(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-    char                            *ret;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-[m
[31m-        ret = ngx_http_echo_helper(echo_opcode_echo_sync, echo_handler_cmd,[m
[31m-                                   cf, cmd, conf);[m
[31m-[m
[31m-        if (ret != NGX_CONF_OK) {[m
[31m-            return ret;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_location_async,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_location(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-    char                            *ret;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-[m
[31m-        ret = ngx_http_echo_helper(echo_opcode_echo_sync, echo_handler_cmd,[m
[31m-                                   cf, cmd, conf);[m
[31m-[m
[31m-        if (ret != NGX_CONF_OK) {[m
[31m-            return ret;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_location, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_subrequest_async(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char                            *ret;[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-[m
[31m-        ret = ngx_http_echo_helper(echo_opcode_echo_sync, echo_handler_cmd,[m
[31m-                                   cf, cmd, conf);[m
[31m-[m
[31m-        if (ret != NGX_CONF_OK) {[m
[31m-            return ret;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_subrequest_async,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_subrequest(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-    char                            *ret;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-[m
[31m-        ret = ngx_http_echo_helper(echo_opcode_echo_sync, echo_handler_cmd,[m
[31m-                                   cf, cmd, conf);[m
[31m-[m
[31m-        if (ret != NGX_CONF_OK) {[m
[31m-            return ret;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_subrequest, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_duplicate(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_echo_loc_conf_t        *elcf = conf;[m
[31m-[m
[31m-    if (!elcf->seen_leading_output) {[m
[31m-        elcf->seen_leading_output = 1;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_duplicate, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_read_request_body(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_read_request_body,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_foreach_split(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_foreach_split,[m
[31m-                                echo_handler_cmd, cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_end(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_end, echo_handler_cmd, cf,[m
[31m-                                cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_abort_parent(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_abort_parent, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_echo_echo_exec(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_echo_helper(echo_opcode_echo_exec, echo_handler_cmd,[m
[31m-                                cf, cmd, conf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_echo_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_echo_main_conf_t    *emcf;[m
[31m-[m
[31m-    emcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_main_conf_t));[m
[31m-    if (emcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      hmcf->requires_filter = 0;[m
[31m-     */[m
[31m-[m
[31m-    return emcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_post_config(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-[m
[31m-    rc = ngx_http_echo_filter_init(cf);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_echo_init(cf);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_echo_content_length_hash =[m
[31m-                                  ngx_http_echo_hash_literal("content-length");[m
[31m-[m
[31m-    return ngx_http_echo_add_variables(cf);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_module.h[m
[1mdeleted file mode 100644[m
[1mindex 2d212c3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,147 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_ECHO_MODULE_H[m
[31m-#define NGX_HTTP_ECHO_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_echo_module;[m
[31m-[m
[31m-[m
[31m-/* config directive's opcode */[m
[31m-typedef enum {[m
[31m-    echo_opcode_echo_sync,[m
[31m-    echo_opcode_echo,[m
[31m-    echo_opcode_echo_request_body,[m
[31m-    echo_opcode_echo_sleep,[m
[31m-    echo_opcode_echo_flush,[m
[31m-    echo_opcode_echo_blocking_sleep,[m
[31m-    echo_opcode_echo_reset_timer,[m
[31m-    echo_opcode_echo_before_body,[m
[31m-    echo_opcode_echo_after_body,[m
[31m-    echo_opcode_echo_location_async,[m
[31m-    echo_opcode_echo_location,[m
[31m-    echo_opcode_echo_subrequest_async,[m
[31m-    echo_opcode_echo_subrequest,[m
[31m-    echo_opcode_echo_duplicate,[m
[31m-    echo_opcode_echo_read_request_body,[m
[31m-    echo_opcode_echo_foreach_split,[m
[31m-    echo_opcode_echo_end,[m
[31m-    echo_opcode_echo_abort_parent,[m
[31m-    echo_opcode_echo_exec[m
[31m-} ngx_http_echo_opcode_t;[m
[31m-[m
[31m-[m
[31m-/* all the various config directives (or commands) are[m
[31m- * divided into two categories: "handler commands",[m
[31m- * and "filter commands". For instance, the "echo"[m
[31m- * directive is a handler command while[m
[31m- * "echo_before_body" is a filter one. */[m
[31m-typedef enum {[m
[31m-    echo_handler_cmd,[m
[31m-    echo_filter_cmd[m
[31m-[m
[31m-} ngx_http_echo_cmd_category_t;[m
[31m-[m
[31m-[m
[31m-/* compiled form of a config directive argument's value */[m
[31m-typedef struct {[m
[31m-    /* holds the raw string of the argument value */[m
[31m-    ngx_str_t       raw_value;[m
[31m-[m
[31m-    /* fields "lengths" and "values" are set by[m
[31m-     * the function ngx_http_script_compile,[m
[31m-     * iff the argument value indeed contains[m
[31m-     * nginx variables like "$foo" */[m
[31m-    ngx_array_t     *lengths;[m
[31m-    ngx_array_t     *values;[m
[31m-[m
[31m-} ngx_http_echo_arg_template_t;[m
[31m-[m
[31m-[m
[31m-/* represent a config directive (or command) like "echo". */[m
[31m-typedef struct {[m
[31m-    ngx_http_echo_opcode_t      opcode;[m
[31m-[m
[31m-    /* each argument is of type echo_arg_template_t: */[m
[31m-    ngx_array_t                 *args;[m
[31m-} ngx_http_echo_cmd_t;[m
[31m-[m
[31m-[m
[31m-/* location config struct */[m
[31m-typedef struct {[m
[31m-    /* elements of the following arrays are of type[m
[31m-     * ngx_http_echo_cmd_t */[m
[31m-    ngx_array_t     *handler_cmds;[m
[31m-    ngx_array_t     *before_body_cmds;[m
[31m-    ngx_array_t     *after_body_cmds;[m
[31m-[m
[31m-    unsigned         seen_leading_output;[m
[31m-[m
[31m-    ngx_int_t        status;[m
[31m-} ngx_http_echo_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t       requires_filter;[m
[31m-} ngx_http_echo_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t     *choices; /* items after splitting */[m
[31m-    ngx_uint_t      next_choice;  /* current item index */[m
[31m-    ngx_uint_t      cmd_index; /* cmd index for the echo_foreach direcitve */[m
[31m-} ngx_http_echo_foreach_ctx_t;[m
[31m-[m
[31m-[m
[31m-/* context struct in the request handling cycle, holding[m
[31m- * the current states of the command evaluator */[m
[31m-typedef struct {[m
[31m-    /* index of the next handler command in[m
[31m-     * ngx_http_echo_loc_conf_t's "handler_cmds" array. */[m
[31m-    ngx_uint_t       next_handler_cmd;[m
[31m-[m
[31m-    /* index of the next before-body filter command in[m
[31m-     * ngx_http_echo_loc_conf_t's "before_body_cmds" array. */[m
[31m-    ngx_uint_t       next_before_body_cmd;[m
[31m-[m
[31m-    /* index of the next after-body filter command in[m
[31m-     * ngx_http_echo_loc_conf_t's "after_body_cmds" array. */[m
[31m-    ngx_uint_t       next_after_body_cmd;[m
[31m-[m
[31m-    ngx_http_echo_foreach_ctx_t   *foreach;[m
[31m-[m
[31m-    ngx_time_t       timer_begin;[m
[31m-[m
[31m-    ngx_event_t      sleep;[m
[31m-[m
[31m-    ngx_uint_t       counter;[m
[31m-[m
[31m-    unsigned         before_body_sent:1;[m
[31m-    unsigned         skip_filter:1;[m
[31m-[m
[31m-    unsigned         wait_read_request_body:1;[m
[31m-[m
[31m-    unsigned         waiting:1;[m
[31m-    unsigned         done:1;[m
[31m-[m
[31m-    unsigned         run_post_subrequest:1;[m
[31m-    unsigned         header_sent:1; /* r->header_sent is not sufficient[m
[31m-                                     * because special header filters like[m
[31m-                                     * ngx_http_image_filter_module's may[m
[31m-                                     * intercept the whole header filter chain[m
[31m-                                     * leaving r->header_sent unset. So we[m
[31m-                                     * should always test both flags. */[m
[31m-[m
[31m-} ngx_http_echo_ctx_t;[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_ECHO_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_request_info.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_request_info.c[m
[1mdeleted file mode 100644[m
[1mindex db6eba7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_request_info.c[m
[1m+++ /dev/null[m
[36m@@ -1,452 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_request_info.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_echo_post_read_request_body(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_read_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    return ngx_http_read_client_request_body(r,[m
[31m-                                        ngx_http_echo_post_read_request_body);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_echo_post_read_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    dd("wait read request body %d", (int) ctx->wait_read_request_body);[m
[31m-[m
[31m-    if (ctx->wait_read_request_body) {[m
[31m-        ctx->waiting = 0;[m
[31m-        ctx->done = 1;[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_echo_wev_handler;[m
[31m-[m
[31m-        ngx_http_echo_wev_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this function's implementation is borrowed from nginx 0.8.20[m
[31m- * and modified a bit to work with subrequests.[m
[31m- * Copyrighted (C) by Igor Sysoev */[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_request_method_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->method_name.data) {[m
[31m-        v->len = r->method_name.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->method_name.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this function's implementation is borrowed from nginx 0.8.20[m
[31m- * and modified a bit to work with subrequests.[m
[31m- * Copyrighted (C) by Igor Sysoev */[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_client_request_method_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->main->method_name.data) {[m
[31m-        v->len = r->main->method_name.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->main->method_name.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this function's implementation is borrowed from nginx 0.8.20[m
[31m- * and modified a bit to work with subrequests.[m
[31m- * Copyrighted (C) by Igor Sysoev */[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_request_body_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char       *p;[m
[31m-    size_t        len;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_chain_t  *in;[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->bufs == NULL[m
[31m-        || r->request_body->temp_file)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    in = r->request_body->bufs;[m
[31m-[m
[31m-    len = 0;[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(b)) {[m
[31m-            if (b->in_file) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "variable echo_request_body sees in-file only "[m
[31m-                               "buffers and discard the whole body data");[m
[31m-[m
[31m-                v->not_found = 1;[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            len += b->last - b->pos;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (ngx_buf_in_memory(b)) {[m
[31m-            p = ngx_copy(p, b->pos, b->last - b->pos);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p - v->data != (ssize_t) len) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "variable echo_request_body: buffer error");[m
[31m-[m
[31m-        v->not_found = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_client_request_headers_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    int                          line_break_len;[m
[31m-    size_t                       size;[m
[31m-    u_char                      *p, *last, *pos;[m
[31m-    ngx_int_t                    i, j;[m
[31m-    ngx_buf_t                   *b, *first = NULL;[m
[31m-    unsigned                     found;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_request_t          *mr;[m
[31m-    ngx_http_connection_t       *hc;[m
[31m-[m
[31m-    mr = r->main;[m
[31m-    hc = r->main->http_connection;[m
[31m-    c = mr->connection;[m
[31m-[m
[31m-    size = 0;[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (mr->request_line.data[mr->request_line.len] == CR) {[m
[31m-        line_break_len = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        line_break_len = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (mr->request_line.data >= b->start[m
[31m-        && mr->request_line.data + mr->request_line.len + line_break_len[m
[31m-           <= b->pos)[m
[31m-    {[m
[31m-        first = b;[m
[31m-        size += b->pos - mr->request_line.data;[m
[31m-    }[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        b = NULL;[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            b = hc->busy[i];[m
[31m-[m
[31m-            if (first == NULL) {[m
[31m-                if (mr->request_line.data >= b->pos[m
[31m-                    || mr->request_line.data + mr->request_line.len[m
[31m-                       + line_break_len <= b->start)[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                dd("found first at %d", (int) i);[m
[31m-                first = b;[m
[31m-            }[m
[31m-[m
[31m-            size += b->pos - b->start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size++;  /* plus the null terminator, as required by the later[m
[31m-                ngx_strstr() call */[m
[31m-[m
[31m-    v->data = ngx_palloc(r->pool, size);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = v->data;[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-    found = 0;[m
[31m-[m
[31m-    if (first == b) {[m
[31m-        found = 1;[m
[31m-        pos = b->pos;[m
[31m-[m
[31m-        last = ngx_copy(v->data, mr->request_line.data,[m
[31m-                        pos - mr->request_line.data);[m
[31m-[m
[31m-        if (b != mr->header_in) {[m
[31m-            /* skip truncated header entries (if any) */[m
[31m-            while (last > v->data && last[-1] != LF) {[m
[31m-                last--;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-        for (p = v->data; p != last; p++) {[m
[31m-            if (*p == '\0') {[m
[31m-                i++;[m
[31m-                if (p + 1 != last && *(p + 1) == LF) {[m
[31m-                    *p = CR;[m
[31m-[m
[31m-                } else if (i % 2 == 1) {[m
[31m-                    *p = ':';[m
[31m-[m
[31m-                } else {[m
[31m-                    *p = LF;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            b = hc->busy[i];[m
[31m-[m
[31m-            if (!found) {[m
[31m-                if (b != first) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                dd("found first");[m
[31m-                found = 1;[m
[31m-            }[m
[31m-[m
[31m-            p = last;[m
[31m-[m
[31m-            pos = b->pos;[m
[31m-[m
[31m-            if (b == first) {[m
[31m-                dd("request line: %.*s", (int) mr->request_line.len,[m
[31m-                   mr->request_line.data);[m
[31m-[m
[31m-                last = ngx_copy(last,[m
[31m-                                mr->request_line.data,[m
[31m-                                pos - mr->request_line.data);[m
[31m-[m
[31m-            } else {[m
[31m-                last = ngx_copy(last, b->start, pos - b->start);[m
[31m-            }[m
[31m-[m
[31m-#if 1[m
[31m-            /* skip truncated header entries (if any) */[m
[31m-            while (last > p && last[-1] != LF) {[m
[31m-                last--;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            j = 0;[m
[31m-            for (; p != last; p++) {[m
[31m-                if (*p == '\0') {[m
[31m-                    j++;[m
[31m-                    if (p + 1 == last) {[m
[31m-                        /* XXX this should not happen */[m
[31m-                        dd("found string end!!");[m
[31m-[m
[31m-                    } else if (*(p + 1) == LF) {[m
[31m-                        *p = CR;[m
[31m-[m
[31m-                    } else if (j % 2 == 1) {[m
[31m-                        *p = ':';[m
[31m-[m
[31m-                    } else {[m
[31m-                        *p = LF;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b == mr->header_in) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *last++ = '\0';[m
[31m-[m
[31m-    if (last - v->data > (ssize_t) size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "buffer error when evaluating "[m
[31m-                      "$echo_client__request_headers: \"%V\"",[m
[31m-                      (ngx_int_t) (last - v->data - size));[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* strip the leading part (if any) of the request body in our header.[m
[31m-     * the first part of the request body could slip in because nginx core's[m
[31m-     * ngx_http_request_body_length_filter and etc can move r->header_in->pos[m
[31m-     * in case that some of the body data has been preread into r->header_in.[m
[31m-     */[m
[31m-[m
[31m-    if ((p = (u_char *) ngx_strstr(v->data, CRLF CRLF)) != NULL) {[m
[31m-        last = p + sizeof(CRLF CRLF) - 1;[m
[31m-[m
[31m-    } else if ((p = (u_char *) ngx_strstr(v->data, CRLF "\n")) != NULL) {[m
[31m-        last = p + sizeof(CRLF "\n") - 1;[m
[31m-[m
[31m-    } else if ((p = (u_char *) ngx_strstr(v->data, "\n" CRLF)) != NULL) {[m
[31m-        last = p + sizeof("\n" CRLF) - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        for (p = last - 1; p - v->data >= 2; p--) {[m
[31m-            if (p[0] == LF && p[-1] == CR) {[m
[31m-                p[-1] = LF;[m
[31m-                last = p + 1;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (p[0] == LF && p[-1] == LF) {[m
[31m-                last = p + 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = last - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_cacheable_request_uri_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->uri.len) {[m
[31m-        v->len = r->uri.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->uri.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_request_uri_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->uri.len) {[m
[31m-        v->len = r->uri.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 1;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->uri.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_response_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    if (r->headers_out.status) {[m
[31m-        dd("headers out status: %d", (int) r->headers_out.status);[m
[31m-[m
[31m-        p = ngx_palloc(r->pool, NGX_INT_T_LEN);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_sprintf(p, "%ui", r->headers_out.status) - p;[m
[31m-        v->data = p;[m
[31m-[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 1;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_request_info.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_request_info.h[m
[1mdeleted file mode 100644[m
[1mindex 3b3713b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_request_info.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-#ifndef ECHO_REQUEST_INFO_H[m
[31m-#define ECHO_REQUEST_INFO_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_read_request_body([m
[31m-    ngx_http_request_t *r, ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_request_method_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_client_request_method_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_request_body_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_client_request_headers_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_cacheable_request_uri_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_request_uri_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_response_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-#endif /* ECHO_REQUEST_INFO_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_sleep.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_sleep.c[m
[1mdeleted file mode 100644[m
[1mindex c96fa5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_sleep.c[m
[1m+++ /dev/null[m
[36m@@ -1,208 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_sleep.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_log.h>[m
[31m-[m
[31m-[m
[31m-/* event handler for echo_sleep */[m
[31m-[m
[31m-static void ngx_http_echo_post_sleep(ngx_http_request_t *r);[m
[31m-static void ngx_http_echo_sleep_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_sleep(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_str_t                   *computed_arg;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_int_t                    delay; /* in msec */[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-    computed_arg = &computed_arg_elts[0];[m
[31m-[m
[31m-    delay = ngx_atofp(computed_arg->data, computed_arg->len, 3);[m
[31m-[m
[31m-    if (delay == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid sleep duration \"%V\"", &computed_arg_elts[0]);[m
[31m-[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    dd("adding timer with delay %lu ms, r:%.*s", (unsigned long) delay,[m
[31m-       (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    ngx_add_timer(&ctx->sleep, (ngx_msec_t) delay);[m
[31m-[m
[31m-    /* we don't check broken downstream connections[m
[31m-     * ourselves so even if the client shuts down[m
[31m-     * the connection prematurely, nginx will still[m
[31m-     * go on waiting for our timers to get properly[m
[31m-     * expired. However, we'd still register a[m
[31m-     * cleanup handler for completeness. */[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_echo_sleep_cleanup;[m
[31m-    cln->data = r;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_echo_post_sleep(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    /* ngx_int_t                    rc; */[m
[31m-[m
[31m-    dd("post sleep, r:%.*s", (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->waiting = 0;[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    dd("sleep: after get module ctx");[m
[31m-[m
[31m-    dd("timed out? %d", ctx->sleep.timedout);[m
[31m-    dd("timer set? %d", ctx->sleep.timer_set);[m
[31m-[m
[31m-    if (!ctx->sleep.timedout) {[m
[31m-        dd("HERE reached!");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->sleep.timedout = 0;[m
[31m-[m
[31m-    if (ctx->sleep.timer_set) {[m
[31m-        dd("deleting timer for echo_sleep");[m
[31m-[m
[31m-        ngx_del_timer(&ctx->sleep);[m
[31m-    }[m
[31m-[m
[31m-    /* r->write_event_handler = ngx_http_request_empty_handler; */[m
[31m-[m
[31m-    ngx_http_echo_wev_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_echo_sleep_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_log_ctx_t      *ctx;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->destroyed) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx = c->log->data;[m
[31m-    ctx->current_request = r;[m
[31m-[m
[31m-    /* XXX when r->done == 1 we should do cleaning immediately[m
[31m-     * and delete our timer and then quit. */[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "echo sleep event handler: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    /*[m
[31m-    if (r->done) {[m
[31m-        return;[m
[31m-    }[m
[31m-    */[m
[31m-[m
[31m-    ngx_http_echo_post_sleep(r);[m
[31m-[m
[31m-#if defined(nginx_version)[m
[31m-[m
[31m-    dd("before run posted requests");[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    dd("after run posted requests");[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_blocking_sleep(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_str_t                   *computed_arg;[m
[31m-    ngx_str_t                   *computed_arg_elts;[m
[31m-    ngx_int_t                    delay; /* in msec */[m
[31m-[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-    computed_arg = &computed_arg_elts[0];[m
[31m-[m
[31m-    delay = ngx_atofp(computed_arg->data, computed_arg->len, 3);[m
[31m-[m
[31m-    if (delay == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid sleep duration \"%V\"", &computed_arg_elts[0]);[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    dd("blocking delay: %lu ms", (unsigned long) delay);[m
[31m-[m
[31m-    ngx_msleep((ngx_msec_t) delay);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_echo_sleep_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t      *r = data;[m
[31m-    ngx_http_echo_ctx_t     *ctx;[m
[31m-[m
[31m-    dd("echo sleep cleanup");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->sleep.timer_set) {[m
[31m-        dd("cleanup: deleting timer for echo_sleep");[m
[31m-[m
[31m-        ngx_del_timer(&ctx->sleep);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    dd("cleanup: timer not set");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_sleep.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_sleep.h[m
[1mdeleted file mode 100644[m
[1mindex 8bb70c3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_sleep.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-#ifndef ECHO_SLEEP_H[m
[31m-#define ECHO_SLEEP_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_sleep([m
[31m-        ngx_http_request_t *r, ngx_http_echo_ctx_t *ctx,[m
[31m-        ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_blocking_sleep(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-void ngx_http_echo_sleep_event_handler(ngx_event_t *ev);[m
[31m-[m
[31m-#endif /* ECHO_SLEEP_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.c[m
[1mdeleted file mode 100644[m
[1mindex 8644d7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.c[m
[1m+++ /dev/null[m
[36m@@ -1,791 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_subrequest.h"[m
[31m-#include "ngx_http_echo_handler.h"[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_echo_method_name(m) { sizeof(m) - 1, (u_char *) m " " }[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_echo_content_length_header_key =[m
[31m-        ngx_string("Content-Length");[m
[31m-[m
[31m-ngx_str_t  ngx_http_echo_get_method = ngx_http_echo_method_name("GET");[m
[31m-ngx_str_t  ngx_http_echo_put_method = ngx_http_echo_method_name("PUT");[m
[31m-ngx_str_t  ngx_http_echo_post_method = ngx_http_echo_method_name("POST");[m
[31m-ngx_str_t  ngx_http_echo_head_method = ngx_http_echo_method_name("HEAD");[m
[31m-ngx_str_t  ngx_http_echo_copy_method = ngx_http_echo_method_name("COPY");[m
[31m-ngx_str_t  ngx_http_echo_move_method = ngx_http_echo_method_name("MOVE");[m
[31m-ngx_str_t  ngx_http_echo_lock_method = ngx_http_echo_method_name("LOCK");[m
[31m-ngx_str_t  ngx_http_echo_mkcol_method = ngx_http_echo_method_name("MKCOL");[m
[31m-ngx_str_t  ngx_http_echo_trace_method = ngx_http_echo_method_name("TRACE");[m
[31m-ngx_str_t  ngx_http_echo_delete_method = ngx_http_echo_method_name("DELETE");[m
[31m-ngx_str_t  ngx_http_echo_unlock_method = ngx_http_echo_method_name("UNLOCK");[m
[31m-ngx_str_t  ngx_http_echo_options_method = ngx_http_echo_method_name("OPTIONS");[m
[31m-ngx_str_t  ngx_http_echo_propfind_method =[m
[31m-        ngx_http_echo_method_name("PROPFIND");[m
[31m-ngx_str_t  ngx_http_echo_proppatch_method =[m
[31m-        ngx_http_echo_method_name("PROPPATCH");[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_echo_subrequest_s {[m
[31m-    ngx_uint_t                   method;[m
[31m-    ngx_str_t                   *method_name;[m
[31m-    ngx_str_t                   *location;[m
[31m-    ngx_str_t                   *query_string;[m
[31m-    ssize_t                      content_length_n;[m
[31m-    ngx_http_request_body_t     *request_body;[m
[31m-} ngx_http_echo_subrequest_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_parse_method_name(ngx_str_t **method_name_ptr);[m
[31m-static ngx_int_t ngx_http_echo_adjust_subrequest(ngx_http_request_t *sr,[m
[31m-    ngx_http_echo_subrequest_t *parsed_sr);[m
[31m-static ngx_int_t ngx_http_echo_parse_subrequest_spec(ngx_http_request_t *r,[m
[31m-    ngx_array_t *computed_args, ngx_http_echo_subrequest_t **parsed_sr_ptr);[m
[31m-static ngx_int_t ngx_http_echo_set_content_length_header(ngx_http_request_t *r,[m
[31m-    off_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_subrequest_async(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_echo_subrequest_t      *parsed_sr;[m
[31m-    ngx_http_request_t              *sr; /* subrequest object */[m
[31m-    ngx_str_t                        args;[m
[31m-    ngx_uint_t                       flags = 0;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    rc = ngx_http_echo_parse_subrequest_spec(r, computed_args, &parsed_sr);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("location: %.*s",[m
[31m-        (int) parsed_sr->location->len,[m
[31m-        parsed_sr->location->data);[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, parsed_sr->location, &args, &flags)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_subrequest_async sees unsafe uri: \"%V\"",[m
[31m-                       parsed_sr->location);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && parsed_sr->query_string == NULL) {[m
[31m-        parsed_sr->query_string = &args;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, parsed_sr->location, parsed_sr->query_string,[m
[31m-                             &sr, NULL, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_adjust_subrequest(sr, parsed_sr);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_request_t                  *sr; /* subrequest object */[m
[31m-    ngx_http_post_subrequest_t          *psr;[m
[31m-    ngx_http_echo_subrequest_t          *parsed_sr;[m
[31m-    ngx_str_t                            args;[m
[31m-    ngx_uint_t                           flags = 0;[m
[31m-    ngx_http_echo_ctx_t                 *sr_ctx;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    rc = ngx_http_echo_parse_subrequest_spec(r, computed_args, &parsed_sr);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, parsed_sr->location, &args, &flags)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_subrequest sees unsafe uri: \"%V\"",[m
[31m-                       parsed_sr->location);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && parsed_sr->query_string == NULL) {[m
[31m-        parsed_sr->query_string = &args;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx = ngx_http_echo_create_ctx(r);[m
[31m-[m
[31m-    /* set by ngx_http_echo_create_ctx[m
[31m-     *  sr_ctx->run_post_subrequest = 0[m
[31m-     */[m
[31m-[m
[31m-    dd("creating sr ctx for %.*s: %p", (int) parsed_sr->location->len,[m
[31m-       parsed_sr->location->data, sr_ctx);[m
[31m-[m
[31m-    psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-[m
[31m-    if (psr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    psr->handler = ngx_http_echo_post_subrequest;[m
[31m-    psr->data = sr_ctx;[m
[31m-[m
[31m-    rc = ngx_http_subrequest(r, parsed_sr->location, parsed_sr->query_string,[m
[31m-                             &sr, psr, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr_ctx->sleep.data = sr;[m
[31m-[m
[31m-    ngx_http_set_ctx(sr, sr_ctx, ngx_http_echo_module);[m
[31m-[m
[31m-    rc = ngx_http_echo_adjust_subrequest(sr, parsed_sr);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_parse_subrequest_spec(ngx_http_request_t *r,[m
[31m-    ngx_array_t *computed_args, ngx_http_echo_subrequest_t **parsed_sr_ptr)[m
[31m-{[m
[31m-    ngx_str_t                   *computed_arg_elts, *arg;[m
[31m-    ngx_str_t                  **to_write = NULL;[m
[31m-    ngx_str_t                   *method_name;[m
[31m-    ngx_str_t                   *body_str = NULL;[m
[31m-    ngx_str_t                   *body_file = NULL;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_flag_t                   expecting_opt;[m
[31m-    ngx_http_request_body_t     *rb = NULL;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_http_echo_subrequest_t  *parsed_sr;[m
[31m-    ngx_open_file_info_t         of;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    size_t                       len;[m
[31m-[m
[31m-    *parsed_sr_ptr = ngx_pcalloc(r->pool, sizeof(ngx_http_echo_subrequest_t));[m
[31m-    if (*parsed_sr_ptr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    parsed_sr = *parsed_sr_ptr;[m
[31m-    computed_arg_elts = computed_args->elts;[m
[31m-    method_name = &computed_arg_elts[0];[m
[31m-    parsed_sr->location = &computed_arg_elts[1];[m
[31m-[m
[31m-    if (parsed_sr->location->len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    expecting_opt = 1;[m
[31m-[m
[31m-    for (i = 2; i < computed_args->nelts; i++) {[m
[31m-        arg = &computed_arg_elts[i];[m
[31m-[m
[31m-        if (!expecting_opt) {[m
[31m-            if (to_write == NULL) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                        "echo_subrequest_async: to_write should NOT be NULL");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *to_write = arg;[m
[31m-            to_write = NULL;[m
[31m-[m
[31m-            expecting_opt = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg->len == 2) {[m
[31m-            if (ngx_strncmp("-q", arg->data, arg->len) == 0) {[m
[31m-                to_write = &parsed_sr->query_string;[m
[31m-                expecting_opt = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp("-b", arg->data, arg->len) == 0) {[m
[31m-                to_write = &body_str;[m
[31m-                expecting_opt = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp("-f", arg->data, arg->len) == 0) {[m
[31m-                dd("found option -f");[m
[31m-                to_write = &body_file;[m
[31m-                expecting_opt = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unknown option for echo_subrequest*: %V", arg);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (body_str != NULL && body_str->len) {[m
[31m-        rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-[m
[31m-        if (rb == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        parsed_sr->content_length_n = body_str->len;[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        /* b->memory = 1; */[m
[31m-        b->start = b->pos = body_str->data;[m
[31m-        b->end = b->last = body_str->data + body_str->len;[m
[31m-[m
[31m-        rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs->buf = b;[m
[31m-        rb->bufs->next = NULL;[m
[31m-[m
[31m-        rb->buf = b;[m
[31m-[m
[31m-    } else if (body_file != NULL && body_file->len) {[m
[31m-[m
[31m-        dd("body_file defined %.*s", (int) body_file->len, body_file->data);[m
[31m-[m
[31m-        body_file->data = ngx_http_echo_rebase_path(r->pool, body_file->data,[m
[31m-                                                    body_file->len, &len);[m
[31m-[m
[31m-        if (body_file->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        body_file->len = len;[m
[31m-[m
[31m-        dd("after rebase, the path becomes %.*s", (int) body_file->len,[m
[31m-           body_file->data);[m
[31m-[m
[31m-        rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-        if (rb == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8018[m
[31m-        of.read_ahead = clcf->read_ahead;[m
[31m-#endif[m
[31m-[m
[31m-        of.directio = clcf->directio;[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, body_file, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, of.err,[m
[31m-                          "%s \"%V\" failed",[m
[31m-                          of.failed, body_file);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("file content size: %d", (int) of.size);[m
[31m-[m
[31m-        parsed_sr->content_length_n = (ssize_t) of.size;[m
[31m-[m
[31m-        b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-        if (b->file == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->file_pos = 0;[m
[31m-        b->file_last = of.size;[m
[31m-[m
[31m-        b->in_file = b->file_last ? 1: 0;[m
[31m-[m
[31m-#if 0[m
[31m-        b->last_buf = (r == r->main) ? 1: 0;[m
[31m-        b->last_in_chain = 1;[m
[31m-#endif[m
[31m-[m
[31m-        b->file->fd = of.fd;[m
[31m-        b->file->name = *body_file;[m
[31m-        b->file->log = r->connection->log;[m
[31m-        b->file->directio = of.is_directio;[m
[31m-[m
[31m-        rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs->buf = b;[m
[31m-        rb->bufs->next = NULL;[m
[31m-        rb->buf = b;[m
[31m-    }[m
[31m-[m
[31m-    parsed_sr->request_body = rb;[m
[31m-[m
[31m-    parsed_sr->method = ngx_http_echo_parse_method_name(&method_name);[m
[31m-    parsed_sr->method_name  = method_name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_adjust_subrequest(ngx_http_request_t *sr,[m
[31m-    ngx_http_echo_subrequest_t *parsed_sr)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_request_body_t    *body;[m
[31m-    ngx_int_t                   rc;[m
[31m-[m
[31m-    sr->method = parsed_sr->method;[m
[31m-    sr->method_name = *(parsed_sr->method_name);[m
[31m-[m
[31m-    if (sr->method == NGX_HTTP_HEAD) {[m
[31m-        sr->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    r = sr->parent;[m
[31m-[m
[31m-    sr->header_in = r->header_in;[m
[31m-[m
[31m-    /* XXX work-around a bug in ngx_http_subrequest */[m
[31m-    if (r->headers_in.headers.last == &r->headers_in.headers.part) {[m
[31m-        sr->headers_in.headers.last = &sr->headers_in.headers.part;[m
[31m-    }[m
[31m-[m
[31m-    /* we do not inherit the parent request's variables */[m
[31m-    cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-    sr->variables = ngx_pcalloc(sr->pool, cmcf->variables.nelts[m
[31m-                                * sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-    if (sr->variables == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    body = parsed_sr->request_body;[m
[31m-    if (body) {[m
[31m-        sr->request_body = body;[m
[31m-[m
[31m-        rc = ngx_http_echo_set_content_length_header(sr, body->buf ?[m
[31m-                                                     ngx_buf_size(body->buf)[m
[31m-                                                     : 0);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("subrequest body: %p", sr->request_body);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_parse_method_name(ngx_str_t **method_name_ptr)[m
[31m-{[m
[31m-    const ngx_str_t     *method_name = *method_name_ptr;[m
[31m-[m
[31m-    switch (method_name->len) {[m
[31m-    case 3:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "GET") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_get_method;[m
[31m-            return NGX_HTTP_GET;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "PUT") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_put_method;[m
[31m-            return NGX_HTTP_PUT;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 4:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "POST") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_post_method;[m
[31m-            return NGX_HTTP_POST;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "HEAD") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_head_method;[m
[31m-            return NGX_HTTP_HEAD;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "COPY") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_copy_method;[m
[31m-            return NGX_HTTP_COPY;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "MOVE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_move_method;[m
[31m-            return NGX_HTTP_MOVE;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "LOCK") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_lock_method;[m
[31m-            return NGX_HTTP_LOCK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 5:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "MKCOL") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_mkcol_method;[m
[31m-            return NGX_HTTP_MKCOL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "TRACE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_trace_method;[m
[31m-            return NGX_HTTP_TRACE;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 6:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "DELETE") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_delete_method;[m
[31m-            return NGX_HTTP_DELETE;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "UNLOCK") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_unlock_method;[m
[31m-            return NGX_HTTP_UNLOCK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 7:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "OPTIONS") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_options_method;[m
[31m-            return NGX_HTTP_OPTIONS;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 8:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "PROPFIND") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_propfind_method;[m
[31m-            return NGX_HTTP_PROPFIND;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    case 9:[m
[31m-        if (ngx_http_echo_strcmp_const(method_name->data, "PROPPATCH") == 0) {[m
[31m-            *method_name_ptr = &ngx_http_echo_proppatch_method;[m
[31m-            return NGX_HTTP_PROPPATCH;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_HTTP_UNKNOWN;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* XXX extermely evil and not working yet */[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_abort_parent(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_http_postponed_request_t    *pr, *ppr;[m
[31m-    ngx_http_request_t              *saved_data = NULL;[m
[31m-    ngx_chain_t                     *out = NULL;[m
[31m-    /* ngx_int_t                       rc; */[m
[31m-[m
[31m-    dd("aborting parent...");[m
[31m-[m
[31m-    if (r == r->main || r->parent == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->parent->postponed) {[m
[31m-        dd("Found parent->postponed...");[m
[31m-[m
[31m-        saved_data = r->connection->data;[m
[31m-        ppr = NULL;[m
[31m-        for (pr = r->parent->postponed; pr->next; pr = pr->next) {[m
[31m-            if (pr->request == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (pr->request == r) {[m
[31m-                /* r->parent->postponed->next = pr; */[m
[31m-                dd("found the current subrequest");[m
[31m-                out = pr->out;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* r->connection->data = pr->request; */[m
[31m-            dd("finalizing the subrequest...");[m
[31m-            ngx_http_upstream_create(pr->request);[m
[31m-            pr->request->upstream = NULL;[m
[31m-[m
[31m-            if (ppr == NULL) {[m
[31m-                r->parent->postponed = pr->next;[m
[31m-                ppr = pr->next;[m
[31m-            } else {[m
[31m-                ppr->next = pr->next;[m
[31m-                ppr = pr->next;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->parent->postponed->next = NULL;[m
[31m-[m
[31m-    /*[m
[31m-    r->connection->data = r->parent;[m
[31m-    r->connection->buffered = 0;[m
[31m-[m
[31m-    if (out != NULL) {[m
[31m-        dd("trying to send more stuffs for the parent");[m
[31m-        ngx_http_output_filter(r->parent, out);[m
[31m-    }[m
[31m-    */[m
[31m-[m
[31m-    /* ngx_http_send_special(r->parent, NGX_HTTP_LAST); */[m
[31m-[m
[31m-    if (saved_data) {[m
[31m-        r->connection->data = saved_data;[m
[31m-    }[m
[31m-[m
[31m-    dd("terminating the parent request");[m
[31m-[m
[31m-    return ngx_http_echo_send_chain_link(r, ctx, NULL /* indicate LAST */);[m
[31m-[m
[31m-    /* ngx_http_upstream_create(r); */[m
[31m-[m
[31m-    /* ngx_http_finalize_request(r->parent, NGX_ERROR); */[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_exec(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args)[m
[31m-{[m
[31m-    ngx_str_t                       *uri;[m
[31m-    ngx_str_t                       *user_args;[m
[31m-    ngx_str_t                        args;[m
[31m-    ngx_uint_t                       flags;[m
[31m-    ngx_str_t                       *computed_arg;[m
[31m-[m
[31m-    computed_arg = computed_args->elts;[m
[31m-[m
[31m-    uri = &computed_arg[0];[m
[31m-[m
[31m-    if (uri->len == 0) {[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    if (computed_args->nelts > 1) {[m
[31m-        user_args = &computed_arg[1];[m
[31m-[m
[31m-    } else {[m
[31m-        user_args = NULL;[m
[31m-    }[m
[31m-[m
[31m-    args.data = NULL;[m
[31m-    args.len = 0;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "echo_exec sees unsafe uri: \"%V\"",[m
[31m-                       uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (args.len > 0 && user_args == NULL) {[m
[31m-        user_args = &args;[m
[31m-    }[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    if (uri->data[0] == '@') {[m
[31m-[m
[31m-        if (user_args && user_args->len > 0) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                          "querystring %V ignored when exec'ing named "[m
[31m-                          "location %V", user_args, uri);[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        /* clear the modules contexts */[m
[31m-        ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-#endif[m
[31m-[m
[31m-        dd("named location: %.*s, c:%d", (int) uri->len, uri->data,[m
[31m-           (int) r->main->count);[m
[31m-[m
[31m-        return ngx_http_named_location(r, uri);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_internal_redirect(r, uri, user_args);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_set_content_length_header(ngx_http_request_t *r, off_t len)[m
[31m-{[m
[31m-    ngx_table_elt_t                 *h, *header;[m
[31m-    u_char                          *p;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_http_request_t              *pr;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->key = ngx_http_echo_content_length_header_key;[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    r->headers_in.content_length = h;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->value.data = p;[m
[31m-[m
[31m-    h->value.len = ngx_sprintf(h->value.data, "%O", len) - h->value.data;[m
[31m-[m
[31m-    h->hash = ngx_http_echo_content_length_hash;[m
[31m-[m
[31m-    dd("r content length: %.*s",[m
[31m-       (int) r->headers_in.content_length->value.len,[m
[31m-            r->headers_in.content_length->value.data);[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* forward the parent request's all other request headers */[m
[31m-[m
[31m-    part = &pr->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len == sizeof("Content-Length") - 1[m
[31m-            && ngx_strncasecmp(header[i].key.data, (u_char *) "Content-Length",[m
[31m-                               sizeof("Content-Length") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        h = ngx_list_push(&r->headers_in.headers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *h = header[i];[m
[31m-    }[m
[31m-[m
[31m-    /* XXX maybe we should set those built-in header slot in[m
[31m-     * ngx_http_headers_in_t too? */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.h[m
[1mdeleted file mode 100644[m
[1mindex 61c0a04..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_subrequest.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-#ifndef ECHO_SUBREQUEST_H[m
[31m-#define ECHO_SUBREQUEST_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_subrequest(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_subrequest_async(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_abort_parent(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_exec(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx, ngx_array_t *computed_args);[m
[31m-[m
[31m-#endif /* ECHO_SUBREQUEST_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_timer.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_timer.c[m
[1mdeleted file mode 100644[m
[1mindex e2777ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_timer.c[m
[1m+++ /dev/null[m
[36m@@ -1,95 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_timer.h"[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-#include <ngx_log.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_timer_elapsed_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t     *ctx;[m
[31m-    ngx_msec_int_t           ms;[m
[31m-    u_char                  *p;[m
[31m-    ngx_time_t              *tp;[m
[31m-    size_t                   size;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_echo_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_echo_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_echo_module);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->timer_begin.sec == 0) {[m
[31m-        ctx->timer_begin.sec  = r->start_sec;[m
[31m-        ctx->timer_begin.msec = (ngx_msec_t) r->start_msec;[m
[31m-    }[m
[31m-[m
[31m-    /* force the ngx timer to update */[m
[31m-[m
[31m-#if (nginx_version >= 8035) || (nginx_version < 8000 && nginx_version >= 7066)[m
[31m-    ngx_time_update();[m
[31m-#else[m
[31m-    ngx_time_update(0, 0);[m
[31m-#endif[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    dd("old sec msec: %ld %d\n", (long) ctx->timer_begin.sec,[m
[31m-       (int) ctx->timer_begin.msec);[m
[31m-[m
[31m-    dd("new sec msec: %ld %d\n", (long) tp->sec, (int) tp->msec);[m
[31m-[m
[31m-    ms = (ngx_msec_int_t)[m
[31m-             ((tp->sec - ctx->timer_begin.sec) * 1000 +[m
[31m-              (tp->msec - ctx->timer_begin.msec));[m
[31m-    ms = (ms >= 0) ? ms : 0;[m
[31m-[m
[31m-    size = sizeof("-9223372036854775808.000") - 1;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_snprintf(p, size, "%T.%03M", ms / 1000, ms % 1000) - p;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 1;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_exec_echo_reset_timer(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    dd("Exec timer...");[m
[31m-[m
[31m-    /* force the ngx timer to update */[m
[31m-[m
[31m-#if (nginx_version >= 8035) || (nginx_version < 8000 && nginx_version >= 7066)[m
[31m-    ngx_time_update();[m
[31m-#else[m
[31m-    ngx_time_update(0, 0);[m
[31m-#endif[m
[31m-[m
[31m-    ctx->timer_begin = *ngx_timeofday();[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_timer.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_timer.h[m
[1mdeleted file mode 100644[m
[1mindex b6e7ff3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_timer.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef ECHO_TIMER_H[m
[31m-#define ECHO_TIMER_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_timer_elapsed_variable(ngx_http_request_t *r,[m
[31m-        ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_exec_echo_reset_timer(ngx_http_request_t *r,[m
[31m-        ngx_http_echo_ctx_t *ctx);[m
[31m-[m
[31m-#endif /* ECHO_TIMER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_util.c[m
[1mdeleted file mode 100644[m
[1mindex fed0587..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,302 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_util.h"[m
[31m-#include "ngx_http_echo_sleep.h"[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_http_echo_content_length_hash = 0;[m
[31m-[m
[31m-[m
[31m-ngx_http_echo_ctx_t *[m
[31m-ngx_http_echo_create_ctx(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_echo_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->sleep.handler   = ngx_http_echo_sleep_event_handler;[m
[31m-    ctx->sleep.data      = r;[m
[31m-    ctx->sleep.log       = r->connection->log;[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_eval_cmd_args(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_cmd_t *cmd, ngx_array_t *computed_args,[m
[31m-    ngx_array_t *opts)[m
[31m-{[m
[31m-    unsigned                         expecting_opts = 1;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_array_t                     *args = cmd->args;[m
[31m-    ngx_str_t                       *arg, *raw, *opt;[m
[31m-    ngx_http_echo_arg_template_t    *value;[m
[31m-[m
[31m-    value = args->elts;[m
[31m-[m
[31m-    for (i = 0; i < args->nelts; i++) {[m
[31m-        raw = &value[i].raw_value;[m
[31m-[m
[31m-        if (value[i].lengths == NULL && raw->len > 0) {[m
[31m-            if (expecting_opts) {[m
[31m-                if (raw->len == 1 || raw->data[0] != '-') {[m
[31m-                    expecting_opts = 0;[m
[31m-[m
[31m-                } else if (raw->data[1] == '-') {[m
[31m-                    expecting_opts = 0;[m
[31m-                    continue;[m
[31m-[m
[31m-                } else {[m
[31m-                    opt = ngx_array_push(opts);[m
[31m-                    if (opt == NULL) {[m
[31m-                        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    opt->len = raw->len - 1;[m
[31m-                    opt->data = raw->data + 1;[m
[31m-[m
[31m-                    dd("pushing opt: %.*s", (int) opt->len, opt->data);[m
[31m-[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            expecting_opts = 0;[m
[31m-        }[m
[31m-[m
[31m-        arg = ngx_array_push(computed_args);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].lengths == NULL) { /* does not contain vars */[m
[31m-            dd("Using raw value \"%.*s\"", (int) raw->len, raw->data);[m
[31m-            *arg = *raw;[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_script_run(r, arg, value[i].lengths->elts,[m
[31m-                                    0, value[i].values->elts)[m
[31m-                == NULL)[m
[31m-            {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("pushed arg: %.*s", (int) arg->len, arg->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_send_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t        rc;[m
[31m-[m
[31m-    rc = ngx_http_echo_send_header_if_needed(r, ctx);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version <= 8004[m
[31m-[m
[31m-        /* earlier versions of nginx does not allow subrequests[m
[31m-            to send last_buf themselves */[m
[31m-        if (r != r->main) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-        if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* FIXME we should udpate chains to recycle chain links and bufs */[m
[31m-    return ngx_http_output_filter(r, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_send_header_if_needed(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_echo_loc_conf_t    *elcf;[m
[31m-[m
[31m-    if (!r->header_sent && !ctx->header_sent) {[m
[31m-        elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);[m
[31m-[m
[31m-        r->headers_out.status = (ngx_uint_t) elcf->status;[m
[31m-[m
[31m-        if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-        ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-        rc = ngx_http_send_header(r);[m
[31m-        ctx->header_sent = 1;[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_http_echo_atosz(u_char *line, size_t n)[m
[31m-{[m
[31m-    ssize_t  value;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line == '_') { /* we ignore undercores */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    if (value < 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Modified from the ngx_strlcasestrn function in ngx_string.h[m
[31m- * Copyright (C) by Igor Sysoev */[m
[31m-u_char *[m
[31m-ngx_http_echo_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    last -= n;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (s1 >= last) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_post_request_at_head(ngx_http_request_t *r,[m
[31m-    ngx_http_posted_request_t *pr)[m
[31m-{[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-        if (pr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = r->main->posted_requests;[m
[31m-    r->main->posted_requests = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_echo_rebase_path(ngx_pool_t *pool, u_char *src, size_t osize,[m
[31m-    size_t *nsize)[m
[31m-{[m
[31m-    u_char            *p, *dst;[m
[31m-[m
[31m-    if (osize == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (src[0] == '/') {[m
[31m-        /* being an absolute path already, just add a trailing '\0' */[m
[31m-        *nsize = osize;[m
[31m-[m
[31m-        dst = ngx_palloc(pool, *nsize + 1);[m
[31m-        if (dst == NULL) {[m
[31m-            *nsize = 0;[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(dst, src, osize);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    *nsize = ngx_cycle->prefix.len + osize;[m
[31m-[m
[31m-    dst = ngx_palloc(pool, *nsize + 1);[m
[31m-    if (dst == NULL) {[m
[31m-        *nsize = 0;[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(dst, ngx_cycle->prefix.data, ngx_cycle->prefix.len);[m
[31m-    p = ngx_copy(p, src, osize);[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_flush_postponed_outputs(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r == r->connection->data && r->postponed) {[m
[31m-        /* notify the downstream postpone filter to flush the postponed[m
[31m-         * outputs of the current request */[m
[31m-        return ngx_http_output_filter(r, NULL);[m
[31m-    }[m
[31m-[m
[31m-    /* do nothing */[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_util.h[m
[1mdeleted file mode 100644[m
[1mindex 24b3e15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_ECHO_UTIL_H[m
[31m-#define NGX_HTTP_ECHO_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_echo_strcmp_const(a, b) \[m
[31m-    ngx_strncmp(a, b, sizeof(b) - 1)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_echo_hash_literal(s)                                        \[m
[31m-    ngx_http_echo_hash_str((u_char *) s, sizeof(s) - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_uint_t[m
[31m-ngx_http_echo_hash_str(u_char *src, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    while (n--) {[m
[31m-        key = ngx_hash(key, *src);[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t  ngx_http_echo_content_length_hash;[m
[31m-[m
[31m-[m
[31m-ngx_http_echo_ctx_t *ngx_http_echo_create_ctx(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_echo_eval_cmd_args(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_cmd_t *cmd, ngx_array_t *computed_args,[m
[31m-    ngx_array_t *opts);[m
[31m-ngx_int_t ngx_http_echo_send_header_if_needed(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx);[m
[31m-ngx_int_t ngx_http_echo_send_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_echo_ctx_t *ctx, ngx_chain_t *cl);[m
[31m-ssize_t ngx_http_echo_atosz(u_char *line, size_t n);[m
[31m-u_char *ngx_http_echo_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n);[m
[31m-ngx_int_t ngx_http_echo_post_request_at_head(ngx_http_request_t *r,[m
[31m-    ngx_http_posted_request_t *pr);[m
[31m-u_char *ngx_http_echo_rebase_path(ngx_pool_t *pool, u_char *src, size_t osize,[m
[31m-    size_t *nsize);[m
[31m-ngx_int_t ngx_http_echo_flush_postponed_outputs(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_ECHO_UTIL_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_var.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_var.c[m
[1mdeleted file mode 100644[m
[1mindex 138a510..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_var.c[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_echo_var.h"[m
[31m-#include "ngx_http_echo_timer.h"[m
[31m-#include "ngx_http_echo_request_info.h"[m
[31m-#include "ngx_http_echo_foreach.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_echo_incr_variable(ngx_http_request_t *r,[m
[31m-        ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t ngx_http_echo_variables[] = {[m
[31m-[m
[31m-    { ngx_string("echo_timer_elapsed"), NULL,[m
[31m-      ngx_http_echo_timer_elapsed_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_request_method"), NULL,[m
[31m-      ngx_http_echo_request_method_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_cacheable_request_uri"), NULL,[m
[31m-      ngx_http_echo_cacheable_request_uri_variable, 0,[m
[31m-      0, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_request_uri"), NULL,[m
[31m-      ngx_http_echo_request_uri_variable, 0,[m
[31m-      0, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_client_request_method"), NULL,[m
[31m-      ngx_http_echo_client_request_method_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_request_body"), NULL,[m
[31m-      ngx_http_echo_request_body_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_client_request_headers"), NULL,[m
[31m-      ngx_http_echo_client_request_headers_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_it"), NULL,[m
[31m-      ngx_http_echo_it_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_incr"), NULL,[m
[31m-      ngx_http_echo_incr_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("echo_response_status"), NULL,[m
[31m-      ngx_http_echo_response_status_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_echo_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_echo_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_echo_incr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_echo_ctx_t         *ctx;[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r->main, ngx_http_echo_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->counter++;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_INT_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%ui", ctx->counter) - p;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->not_found = 0;[m
[31m-    v->no_cacheable = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_var.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_var.h[m
[1mdeleted file mode 100644[m
[1mindex 8b24e02b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/src/ngx_http_echo_var.h[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-#ifndef ECHO_VAR_H[m
[31m-#define ECHO_VAR_H[m
[31m-[m
[31m-#include "ngx_http_echo_module.h"[m
[31m-[m
[31m-ngx_int_t ngx_http_echo_add_variables(ngx_conf_t *cf);[m
[31m-[m
[31m-#endif /* ECHO_VAR_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/abort-parent.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/abort-parent.t[m
[1mdeleted file mode 100644[m
[1mindex 6137607..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/abort-parent.t[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::LWP skip_all =>[m
[31m-    'not working at all';[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /abort {[m
[31m-        echo hello;[m
[31m-        echo_flush;[m
[31m-        echo_location_async '/foo';[m
[31m-        echo_location_async '/bar';[m
[31m-        echo_location_async '/baz';[m
[31m-        echo world;[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass "http://127.0.0.1:$server_port/sleep?$query_string";[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep $arg_sleep;[m
[31m-        echo $arg_echo;[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_location '/proxy?sleep=1&echo=foo';[m
[31m-        #echo_flush;[m
[31m-        echo_abort_parent;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        proxy_pass 'http://127.0.0.1:$server_port/sleep_bar';[m
[31m-    }[m
[31m-[m
[31m-    location /baz {[m
[31m-        proxy_pass 'http://127.0.0.1:$server_port/sleep_baz';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep_bar {[m
[31m-        echo_sleep 2;[m
[31m-        echo bar;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep_baz {[m
[31m-        echo_sleep 3;[m
[31m-        echo baz;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /abort[m
[31m---- response_body[m
[31m-hello[m
[31m-bar[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/blocking-sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/blocking-sleep.t[m
[1mdeleted file mode 100644[m
[1mindex 0bdc6cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/blocking-sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_blocking_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: fractional delay[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: leading echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-before...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: trailing echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-after...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: two echos around sleep[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-before...[m
[31m-after...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: interleaving sleep and echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 1;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo 2;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: interleaving sleep and echo with echo at the end...[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 1;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo 2;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo 3;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: flush before sleep[m
[31m-we didn't really test the actual effect of "echo_flush" here...[m
[31m-merely checks if it croaks if appears.[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        echo hi;[m
[31m-        echo_flush;[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo trees;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body[m
[31m-hi[m
[31m-trees[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: flush does not increment opcode pointer itself[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        echo hi;[m
[31m-        echo_flush;[m
[31m-        echo trees;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body[m
[31m-hi[m
[31m-trees[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: blocking sleep by variable[m
[31m---- config[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo before...;[m
[31m-        echo_blocking_sleep $1;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /sleep/0.01[m
[31m---- response_body[m
[31m-before...[m
[31m-after...[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-after-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-after-body.t[m
[1mdeleted file mode 100644[m
[1mindex 44c4c72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-after-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-no_long_string();[m
[31m-log_level('warn');[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: echo after proxy[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        proxy_pass http://127.0.0.1:$server_port$request_uri/more;[m
[31m-    }[m
[31m-    location /echo/more {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: with variables[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body $request_method;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-world[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: w/o args[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"world\n\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: order is not important[m
[31m---- config[m
[31m-    location /reversed {[m
[31m-        echo world;[m
[31m-        echo_after_body hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /reversed[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple echo_after_body instances[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        echo_after_body world;[m
[31m-        echo !;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-![m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple echo_after_body instances with multiple echo cmds[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        echo_after_body world;[m
[31m-        echo i;[m
[31m-        echo say;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-i[m
[31m-say[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: echo-after-body & echo-before-body[m
[31m---- config[m
[31m-    location /mixed {[m
[31m-        echo_before_body hello;[m
[31m-        echo_after_body world;[m
[31m-        echo_before_body hiya;[m
[31m-        echo_after_body igor;[m
[31m-        echo ////////;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /mixed[m
[31m---- response_body[m
[31m-hello[m
[31m-hiya[m
[31m-////////[m
[31m-world[m
[31m-igor[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: echo around proxy[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        echo_before_body world;[m
[31m-        #echo $scheme://$host:$server_port$request_uri/more;[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;[m
[31m-        echo_after_body hiya;[m
[31m-        echo_after_body igor;[m
[31m-    }[m
[31m-    location /echo/more {[m
[31m-        echo blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-blah[m
[31m-hiya[m
[31m-igor[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: with $echo_response_status[m
[31m---- config[m
[31m-    location /status {[m
[31m-        echo_after_body "status: $echo_response_status";[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /status[m
[31m---- response_body_like[m
[31m-.*404 Not Found.*[m
[31m-status: 404$[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: in subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /hello;[m
[31m-    }[m
[31m-    location /hello {[m
[31m-        echo_after_body 'world!';[m
[31m-        echo 'hello';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: echo_after_body + gzip[m
[31m---- config[m
[31m-    gzip             on;[m
[31m-    gzip_min_length  1;[m
[31m-    location /main {[m
[31m-        echo_after_body 'world!';[m
[31m-        echo_duplicate 1024 'hello';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-hello[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: echo_after_body + proxy output[m
[31m---- config[m
[31m-    #gzip             on;[m
[31m-    #gzip_min_length  1;[m
[31m-    location /main {[m
[31m-        echo_after_body 'world';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo_duplicate 10 hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^(?:hello){10}world$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: in subrequests (we get last_in_chain set properly)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /hello;[m
[31m-    }[m
[31m-    location /hello {[m
[31m-        echo 'hello';[m
[31m-        echo_after_body 'world!';[m
[31m-        body_filter_by_lua '[m
[31m-            local eof = ngx.arg[2][m
[31m-            if eof then[m
[31m-                print("lua: eof found in body")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world![m
[31m---- log_level: notice[m
[31m---- error_log[m
[31m-lua: eof found in body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-before-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-before-body.t[m
[1mdeleted file mode 100644[m
[1mindex 1513184..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-before-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,278 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: echo before proxy[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;[m
[31m-    }[m
[31m-    location /echo/more {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: with variables[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body $request_method;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-GET[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: w/o args[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"\nworld\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: order is not important[m
[31m---- config[m
[31m-    location /reversed {[m
[31m-        echo world;[m
[31m-        echo_before_body hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /reversed[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple echo_before_body instances[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        echo_before_body world;[m
[31m-        echo !;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple echo_before_body instances with multiple echo cmds[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body hello;[m
[31m-        echo_before_body world;[m
[31m-        echo i;[m
[31m-        echo say;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-i[m
[31m-say[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: with $echo_response_status[m
[31m---- config[m
[31m-    location /status {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /status[m
[31m---- response_body_like[m
[31m-status: 404[m
[31m-<html>.*404 Not Found.*$[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: $echo_response_status in echo_before_body in subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location '/status?val=403';[m
[31m-        echo_location '/status?val=500';[m
[31m-    }[m
[31m-    location /status {[m
[31m-        if ($arg_val = 500) {[m
[31m-            echo_before_body "status: $echo_response_status";[m
[31m-            return 500;[m
[31m-            break;[m
[31m-        }[m
[31m-        if ($arg_val = 403) {[m
[31m-            echo_before_body "status: $echo_response_status";[m
[31m-            return 403;[m
[31m-            break;[m
[31m-        }[m
[31m-        return 200;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^status: 403.*?status: 500.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: echo -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n hello;[m
[31m-        echo_before_body -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-helloworld==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: echo a -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body a -n hello;[m
[31m-        echo_before_body b -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-a -n hello[m
[31m-b -n world[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: -n in a var[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $opt -n;[m
[31m-        echo_before_body $opt hello;[m
[31m-        echo_before_body $opt world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello[m
[31m--n world[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: -n only[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n;[m
[31m-        echo_before_body -n;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: -n with an empty string[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n "";[m
[31m-        set $empty "";[m
[31m-        echo_before_body -n $empty;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: -- -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -- -n hello;[m
[31m-        echo_before_body -- -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello[m
[31m--n world[m
[31m-==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: -n -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n -n hello;[m
[31m-        echo_before_body -n -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-helloworld==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: -n -- -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body -n -- -n hello;[m
[31m-        echo_before_body -n -- -n world;[m
[31m-        echo ==;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello-n world==[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-duplicate.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-duplicate.t[m
[1mdeleted file mode 100644[m
[1mindex 82b6725..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-duplicate.t[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 3 a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body: aaa[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: abc abc[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 2 abc;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body: abcabc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: big size with underscores[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 10_000 A;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body eval[m
[31m-'A' x 10_000[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: 0 duplicate 0 empty strings[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 0 "";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: 0 duplicate non-empty strings[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 0 "abc";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: duplication of empty strings[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 2 "";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /dup[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sanity (HEAD)[m
[31m---- config[m
[31m-    location /dup {[m
[31m-        echo_duplicate 3 a;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /dup[m
[31m---- response_body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-timer.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-timer.t[m
[1mdeleted file mode 100644[m
[1mindex 712524d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo-timer.t[m
[1m+++ /dev/null[m
[36m@@ -1,107 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: timer without explicit reset[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_sleep 0.03;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.0(2[6-9]|3[0-6]) sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: timer without explicit reset and sleep[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.00[0-5] sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: timing accumulated sleeps[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_sleep 0.03;[m
[31m-        echo_sleep 0.02;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.0(4[6-9]|5[0-6]) sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: timer with explicit reset but without sleep[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_reset_timer;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.00[0-5] sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: reset timer between sleeps[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-        echo_reset_timer;[m
[31m-        echo_sleep 0.03;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.0(1[6-9]|2[0-6]) sec\.[m
[31m-elapsed 0\.0(2[6-9]|3[0-6]) sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: reset timer between blocking sleeps[m
[31m---- config[m
[31m-    location /timer {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-        echo_reset_timer;[m
[31m-        echo_blocking_sleep 0.03;[m
[31m-        echo "elapsed $echo_timer_elapsed sec.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like[m
[31m-^elapsed 0\.0(1[6-9]|2[0-9]) sec\.[m
[31m-elapsed 0\.0(2[6-9]|3[0-6]) sec\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timer without explicit reset[m
[31m---- config[m
[31m-    location = /timer {[m
[31m-        return 200 "$echo_timer_elapsed";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /timer[m
[31m---- response_body_like chop[m
[31m-^0(\.0\d*)$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo.t[m
[1mdeleted file mode 100644[m
[1mindex b181259..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/echo.t[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 6);[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multiple args[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo say hello world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-say hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multiple directive instances[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo say that;[m
[31m-        echo hello;[m
[31m-        echo world !;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-say that[m
[31m-hello[m
[31m-world ![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: echo without arguments[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo;[m
[31m-        echo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"\n\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: escaped newline[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo "hello\nworld";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: escaped tabs and \r and " wihtin "..."[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo "i say \"hello\tworld\"\r";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval: "i say \"hello\tworld\"\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: escaped tabs and \r and " in single quotes[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 'i say \"hello\tworld\"\r';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval: "i say \"hello\tworld\"\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: escaped tabs and \r and " w/o any quotes[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo i say \"hello\tworld\"\r;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval: "i say \"hello\tworld\"\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: escaping $[m
[31m-As of Nginx 0.8.20, there's still no way to escape the '$' character.[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo \$;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-$[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: XSS[m
[31m---- config[m
[31m-    location /blah {[m
[31m-        echo_duplicate 1 "$arg_callback(";[m
[31m-        echo_location_async "/data?$uri";[m
[31m-        echo_duplicate 1 ")";[m
[31m-    }[m
[31m-    location /data {[m
[31m-        echo_duplicate 1 '{"dog":"$query_string"}';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /blah/9999999.json?callback=ding1111111[m
[31m---- response_body chomp[m
[31m-ding1111111({"dog":"/blah/9999999.json"})[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: XSS - filter version[m
[31m---- config[m
[31m-    location /blah {[m
[31m-        echo_before_body "$arg_callback(";[m
[31m-[m
[31m-        echo_duplicate 1 '{"dog":"$uri"}';[m
[31m-[m
[31m-        echo_after_body ")";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /blah/9999999.json?callback=ding1111111[m
[31m---- response_body[m
[31m-ding1111111([m
[31m-{"dog":"/blah/9999999.json"})[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: if[m
[31m---- config[m
[31m-location /first {[m
[31m- echo "before";[m
[31m- echo_location_async /second $request_uri;[m
[31m- echo "after";[m
[31m-}[m
[31m-[m
[31m-location = /second {[m
[31m- if ($query_string ~ '([^?]+)') {[m
[31m-     set $memcached_key $1;  # needing this to be keyed on the request_path, not the entire uri[m
[31m-     echo $memcached_key;[m
[31m- }[m
[31m-}[m
[31m---- request[m
[31m-    GET /first/9999999.json?callback=ding1111111[m
[31m---- response_body[m
[31m-before[m
[31m-/first/9999999.json[m
[31m-after[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: echo -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n hello;[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m-helloworld[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: echo a -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo a -n hello;[m
[31m-        echo b -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-a -n hello[m
[31m-b -n world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: -n in a var[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $opt -n;[m
[31m-        echo $opt hello;[m
[31m-        echo $opt world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello[m
[31m--n world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: -n only[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n;[m
[31m-        echo -n;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: -n with an empty string[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n "";[m
[31m-        set $empty "";[m
[31m-        echo -n $empty;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: -- -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -- -n hello;[m
[31m-        echo -- -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m--n hello[m
[31m--n world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: -n -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n -n hello;[m
[31m-        echo -n -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m-helloworld[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: -n -- -n[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n -- -n hello;[m
[31m-        echo -n -- -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body chop[m
[31m--n hello-n world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: proxy[m
[31m---- config[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: if is evil[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set $a 3;[m
[31m-        set_by_lua $a '[m
[31m-            if ngx.var.a == "3" then[m
[31m-                return 4[m
[31m-            end[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-4[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: HEAD[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: POST[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /echo[m
[31m-blah blah", "POST /echo[m
[31m-foo bar baz"][m
[31m---- response_body eval[m
[31m-["hello\nworld\n","hello\nworld\n"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: POST[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /echo[m
[31m-blah blah", "POST /echo[m
[31m-foo bar baz"][m
[31m---- response_body eval[m
[31m-["hello\nworld\n","hello\nworld\n"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: empty arg after -n (github issue #33)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $empty "";[m
[31m-        echo -n $empty hello world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body chop[m
[31m- hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: image filter[m
[31m---- config[m
[31m-    location = /gif {[m
[31m-        empty_gif;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        default_type image/gif;[m
[31m-        image_filter resize 10 10;[m
[31m-        set $gif1 '';[m
[31m-        set $gif2 '';[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/gif")[m
[31m-            local data = res.body[m
[31m-            ngx.var.gif1 = string.sub(data, 1, #data - 1)[m
[31m-            ngx.var.gif2 = string.sub(data, #data)[m
[31m-        ';[m
[31m-        echo -n $gif1;[m
[31m-        echo -n $gif2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap[m
[31m-F(ngx_http_image_header_filter) {[m
[31m-    println("image header filter")[m
[31m-}[m
[31m---- stap_out[m
[31m-image header filter[m
[31m---- response_body_like: .[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/exec.t[m
[1mdeleted file mode 100644[m
[1mindex b7c1308..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,228 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exec normal location[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec /bar;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        echo "$echo_request_uri:";[m
[31m-        echo bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/bar:[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: location with args (inlined in uri)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec /bar?a=32;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo "a: [$arg_a]";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a: [32][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: location with args (in separate arg)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec /bar a=56;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo "a: [$arg_a]";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a: [56][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exec named location[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec @bar;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location @bar {[m
[31m-        echo bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: query string ignored for named locations[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_exec @bar?a=32;[m
[31m-        echo end;[m
[31m-    }[m
[31m-    location @bar {[m
[31m-        echo "a: [$arg_a]";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a: [][m
[31m---- error_log[m
[31m-querystring a=32 ignored when exec'ing named location @bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: query string ignored for named locations[m
[31m---- config[m
[31m-  location /foo {[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m-  location @bar {[m
[31m-      echo "uri: [$echo_request_uri]";[m
[31m-  }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-uri: [/foo][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: exec(named location) in subrequests[m
[31m---- config[m
[31m-    location /entry {[m
[31m-        echo_location /foo;[m
[31m-        echo_sleep 0.001;[m
[31m-        echo_location /foo2;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m-  location /foo2 {[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m-[m
[31m-  location @bar {[m
[31m-    proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-  }[m
[31m-  location /bar {[m
[31m-    echo_sleep 0.01;[m
[31m-    echo hello;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /entry[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: exec(normal loctions) in subrequests[m
[31m---- config[m
[31m-    location /entry {[m
[31m-        echo_location /foo;[m
[31m-        echo_sleep 0.001;[m
[31m-        echo_location /foo2;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      echo_exec /baz;[m
[31m-  }[m
[31m-  location /foo2 {[m
[31m-      echo_exec /baz;[m
[31m-  }[m
[31m-[m
[31m-  location /baz {[m
[31m-    proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-  }[m
[31m-  location /bar {[m
[31m-    echo_sleep 0.01;[m
[31m-    echo hello;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /entry[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: exec should clear ctx[m
[31m---- config[m
[31m-    location @bar {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-        echo heh;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      #echo_sleep 0.001;[m
[31m-      echo_reset_timer;[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-heh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: reset ctx[m
[31m---- config[m
[31m-    location @proxy {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo_exec @proxy;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: yield before exec[m
[31m---- config[m
[31m-    location @bar {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-        echo heh;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      echo_sleep 0.001;[m
[31m-      echo_exec @bar;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-heh[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/filter-used.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/filter-used.t[m
[1mdeleted file mode 100644[m
[1mindex 2835270..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/filter-used.t[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-no_long_string();[m
[31m-log_level('warn');[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: filter indeed used[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_after_body hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- stap[m
[31m-F(ngx_http_echo_header_filter) {[m
[31m-    println("echo header filter called")[m
[31m-}[m
[31m---- stap_out[m
[31m-echo header filter called[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: filter not used[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        #echo_after_body hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- stap[m
[31m-F(ngx_http_echo_header_filter) {[m
[31m-    println("echo header filter called")[m
[31m-}[m
[31m---- stap_out[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/foreach-split.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/foreach-split.t[m
[1mdeleted file mode 100644[m
[1mindex 266a701..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/foreach-split.t[m
[1m+++ /dev/null[m
[36m@@ -1,283 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_foreach_split '&' $query_string;[m
[31m-            echo_location_async $echo_it;[m
[31m-            echo '/* end */';[m
[31m-        echo_end;[m
[31m-    }[m
[31m-    location /sub/1.css {[m
[31m-        echo "body { font-size: 12pt; }";[m
[31m-    }[m
[31m-    location /sub/2.css {[m
[31m-        echo "table { color: 'red'; }";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?/sub/1.css&/sub/2.css[m
[31m---- response_body[m
[31m-body { font-size: 12pt; }[m
[31m-/* end */[m
[31m-table { color: 'red'; }[m
[31m-/* end */[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: split in a url argument (echo_location_async)[m
[31m---- config[m
[31m-    location /main_async {[m
[31m-        echo_foreach_split ',' $arg_cssfiles;[m
[31m-            echo_location_async $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m-    location /foo.css {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-    location /bar.css {[m
[31m-        echo bar;[m
[31m-    }[m
[31m-    location /baz.css {[m
[31m-        echo baz;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_async?cssfiles=/foo.css,/bar.css,/baz.css[m
[31m---- response_body[m
[31m-foo[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: split in a url argument (echo_location)[m
[31m---- config[m
[31m-    location /main_sync {[m
[31m-        echo_foreach_split ',' $arg_cssfiles;[m
[31m-            echo_location $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m-    location /foo.css {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-    location /bar.css {[m
[31m-        echo bar;[m
[31m-    }[m
[31m-    location /baz.css {[m
[31m-        echo baz;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_sync?cssfiles=/foo.css,/bar.css,/baz.css[m
[31m---- response_body[m
[31m-foo[m
[31m-bar[m
[31m-baz[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: empty loop[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo "start";[m
[31m-        echo_foreach_split ',' $arg_cssfiles;[m
[31m-        echo_end;[m
[31m-        echo "end";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?cssfiles=/foo.css,/bar.css,/baz.css[m
[31m---- response_body[m
[31m-start[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: trailing delimiter[m
[31m---- config[m
[31m-    location /main_t {[m
[31m-        echo_foreach_split ',' $arg_cssfiles;[m
[31m-            echo_location_async $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m-    location /foo.css {[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_t?cssfiles=/foo.css,[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multi-char delimiter[m
[31m---- config[m
[31m-    location /main_sleep {[m
[31m-        echo_foreach_split '-a-' $arg_list;[m
[31m-            echo $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_sleep?list=foo-a-bar-a-baz[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multi-char delimiter (the right way)[m
[31m---- config[m
[31m-    location /main_sleep {[m
[31m-        echo_foreach_split -- '-a-' $arg_list;[m
[31m-            echo $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_sleep?list=foo-a-bar-a-baz[m
[31m---- response_body[m
[31m-foo[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: loop with sleep[m
[31m---- config[m
[31m-    location /main_sleep {[m
[31m-        echo_foreach_split '-' $arg_list;[m
[31m-            echo_sleep 0.001;[m
[31m-            echo $echo_it;[m
[31m-        echo_end;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_sleep?list=foo-a-bar-A-baz[m
[31m---- response_body[m
[31m-foo[m
[31m-a[m
[31m-bar[m
[31m-A[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: empty[m
[31m---- config[m
[31m-  location /merge {[m
[31m-      default_type 'text/javascript';[m
[31m-      echo_foreach_split '&' $query_string;[m
[31m-          echo "/* JS File $echo_it */";[m
[31m-          echo_location_async $echo_it;[m
[31m-          echo;[m
[31m-      echo_end;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /merge[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: single &[m
[31m---- config[m
[31m-  location /merge {[m
[31m-      default_type 'text/javascript';[m
[31m-      echo_foreach_split '&' $query_string;[m
[31m-          echo "/* JS File $echo_it */";[m
[31m-          echo_location_async $echo_it;[m
[31m-          echo;[m
[31m-      echo_end;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /merge?&[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: pure &'s[m
[31m---- config[m
[31m-  location /merge {[m
[31m-      default_type 'text/javascript';[m
[31m-      echo_foreach_split '&' $query_string;[m
[31m-          echo "/* JS File $echo_it */";[m
[31m-          echo_location_async $echo_it;[m
[31m-          echo;[m
[31m-      echo_end;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /merge?&&&[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: pure & and spaces[m
[31m-TODO: needs to uri_decode $echo_it...[m
[31m---- config[m
[31m-  location /merge {[m
[31m-      default_type 'text/javascript';[m
[31m-      echo_foreach_split '&' $query_string;[m
[31m-          echo "/* JS File $echo_it */";[m
[31m-          echo_location_async $echo_it;[m
[31m-          echo;[m
[31m-      echo_end;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /merge?&%20&%20&[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: multiple foreach_split[m
[31m---- config[m
[31m-    location /multi {[m
[31m-        echo_foreach_split '&' $query_string;[m
[31m-            echo [$echo_it];[m
[31m-        echo_end;[m
[31m-[m
[31m-        echo '...';[m
[31m-[m
[31m-        echo_foreach_split '-' $query_string;[m
[31m-            echo [$echo_it];[m
[31m-        echo_end;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /multi?a-b&c-d[m
[31m---- response_body[m
[31m-[a-b][m
[31m-[c-d][m
[31m-...[m
[31m-[a][m
[31m-[b&c][m
[31m-[d][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: github issue #2: setting a variable from $echo_it results to crashing[m
[31m---- config[m
[31m-location = /getFile {[m
[31m-    set $filelist "a,b,c";[m
[31m-    echo_foreach_split ',' $filelist;[m
[31m-    set $file $echo_it;[m
[31m-    echo_subrequest GET '/getFile2' -q 'sha256=$file';[m
[31m-    echo_end;[m
[31m-}[m
[31m-[m
[31m-location = /getFile2 {[m
[31m-    echo "sha256: $arg_sha256";[m
[31m-}[m
[31m---- request[m
[31m-    GET /getFile[m
[31m---- response_body[m
[31m-sha256: [m
[31m-sha256: [m
[31m-sha256: [m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/gzip.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/gzip.t[m
[1mdeleted file mode 100644[m
[1mindex 61eb4f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/gzip.t[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /gzip {[m
[31m-      gzip             on;[m
[31m-      gzip_min_length  10;[m
[31m-      gzip_types       text/plain;[m
[31m-[m
[31m-      echo_duplicate   1000 hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /gzip[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- timeout: 20[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/if.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/if.t[m
[1mdeleted file mode 100644[m
[1mindex 054ec43..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/if.t[m
[1m+++ /dev/null[m
[36m@@ -1,150 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity (hit)[m
[31m---- config[m
[31m-    location ^~ /if {[m
[31m-        set $res miss;[m
[31m-        if ($arg_val ~* '^a') {[m
[31m-            set $res hit;[m
[31m-            echo $res;[m
[31m-        }[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /if?val=abc[m
[31m---- response_body[m
[31m-hit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (miss)[m
[31m---- config[m
[31m-    location ^~ /if {[m
[31m-        set $res miss;[m
[31m-        if ($arg_val ~* '^a') {[m
[31m-            set $res hit;[m
[31m-            echo $res;[m
[31m-        }[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /if?val=bcd[m
[31m---- response_body[m
[31m-miss[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: proxy in if (hit)[m
[31m---- config[m
[31m-    location ^~ /if {[m
[31m-        set $res miss;[m
[31m-        if ($arg_val ~* '^a') {[m
[31m-            set $res hit;[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/foo?res=$res;[m
[31m-        }[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/foo?res=$res;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo "res = $arg_res";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /if?val=abc[m
[31m---- response_body[m
[31m-res = hit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: proxy in if (miss)[m
[31m---- config[m
[31m-    location ^~ /if {[m
[31m-        set $res miss;[m
[31m-        if ($arg_val ~* '^a') {[m
[31m-            set $res hit;[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/foo?res=$res;[m
[31m-        }[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/foo?res=$res;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo "res = $arg_res";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /if?val=bcd[m
[31m---- response_body[m
[31m-res = miss[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: if too long url (hit)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($request_uri ~ '.{20,}') {[m
[31m-            echo too long;[m
[31m-        }[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?a=12345678901234567890[m
[31m---- response_body[m
[31m-too long[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: if too long url (miss)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($request_uri ~ '.{20,}') {[m
[31m-            echo too long;[m
[31m-        }[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?a=1234567890[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: echo should be inherited by if blocks[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($uri ~ 'foo') {[m
[31m-        }[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: echo_after_body and echo_before_body should be inherited by if blocks[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($uri ~ 'foo') {[m
[31m-        }[m
[31m-        echo_before_body -n 'hello';[m
[31m-        echo_location /comma;[m
[31m-        echo_after_body 'world';[m
[31m-    }[m
[31m-[m
[31m-    location = /comma {[m
[31m-        internal;[m
[31m-        echo -n ', ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/incr.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/incr.t[m
[1mdeleted file mode 100644[m
[1mindex 8ad6d98..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/incr.t[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo "main pre: $echo_incr";[m
[31m-        echo_location_async /sub;[m
[31m-        echo_location_async /sub;[m
[31m-        echo "main post: $echo_incr";[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub: $echo_incr";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-main pre: 1[m
[31m-sub: 3[m
[31m-sub: 4[m
[31m-main post: 2[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/location-async.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/location-async.t[m
[1mdeleted file mode 100644[m
[1mindex 3494516..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/location-async.t[m
[1m+++ /dev/null[m
[36m@@ -1,439 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: leading echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_location_async /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: leading & trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_location_async /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: multiple subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before sr 1;[m
[31m-        echo_location_async /sub;[m
[31m-        echo after sr 1;[m
[31m-        echo before sr 2;[m
[31m-        echo_location_async /sub;[m
[31m-        echo after sr 2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before sr 1[m
[31m-hello[m
[31m-after sr 1[m
[31m-before sr 2[m
[31m-hello[m
[31m-after sr 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: timed multiple subrequests (blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_location_async /sub1;[m
[31m-        echo_location_async /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.00[0-5] sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timed multiple subrequests (non-blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_location_async /sub1;[m
[31m-        echo_location_async /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.00[0-5] sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: location with args[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: encoded chars in query strings[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub 'foo=a%20b&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a%20b Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: UTF-8 chars in query strings[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub 'foo=你好';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: encoded chars in location url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub%31 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub%31 {[m
[31m-        echo 'sub%31';[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo 'sub1';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: querystring in url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub?foo=Foo&bar=Bar;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: querystring in url *AND* an explicit querystring[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub?foo=Foo&bar=Bar blah=Blah;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar $arg_blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-  Blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: explicit flush in main request[m
[31m-flush won't really flush the buffer...[m
[31m---- config[m
[31m-    location /main_flush {[m
[31m-        echo 'pre main';[m
[31m-        echo_location_async /sub;[m
[31m-        echo 'post main';[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo 'sub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_flush[m
[31m---- response_body[m
[31m-pre main[m
[31m-sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: no varaiable inheritance[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-        echo_location_async /sub;[m
[31m-        echo_location_async /sub2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/main[m
[31m-/sub[m
[31m-/sub2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: unsafe uri[m
[31m---- config[m
[31m-    location /unsafe {[m
[31m-        echo_location_async '/../foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /unsafe[m
[31m---- stap2[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("send header on req %p (header sent: %d)\n", $r, $r->header_sent)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-echo_location_async sees unsafe uri: "/../foo"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: access/deny (access phase handlers skipped in subrequests)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /denied;[m
[31m-    }[m
[31m-    location /denied {[m
[31m-        deny all;[m
[31m-        echo No no no;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-No no no[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: rewrite is honored.[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /rewrite;[m
[31m-    }[m
[31m-    location /rewrite {[m
[31m-        rewrite ^ /foo break;[m
[31m-        echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: let subrequest to read the main request's request body[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, body![m
[31m---- response_body chomp[m
[31m-hello, body![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: leading subrequest & echo_before_body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_before_body hello;[m
[31m-        echo_location_async /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_location_async /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: multiple leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_location_async /foo;[m
[31m-        echo_location_async /bar;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n ' people';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world people);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: sanity (HEAD)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location_async /sub;[m
[31m-        echo_location_async /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /main[m
[31m---- response_body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/location.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/location.t[m
[1mdeleted file mode 100644[m
[1mindex 48c851e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/location.t[m
[1m+++ /dev/null[m
[36m@@ -1,567 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 2);[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity with proxy in the middle[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: leading echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: leading & trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_location /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before sr 1;[m
[31m-        echo_location /sub;[m
[31m-        echo after sr 1;[m
[31m-        echo before sr 2;[m
[31m-        echo_location /sub;[m
[31m-        echo after sr 2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before sr 1[m
[31m-hello[m
[31m-after sr 1[m
[31m-before sr 2[m
[31m-hello[m
[31m-after sr 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timed multiple subrequests (blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_location /sub1;[m
[31m-        echo_location /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: timed multiple subrequests (non-blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_location /sub1;[m
[31m-        echo_location /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: location with args[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: chained subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_location /sub;[m
[31m-        echo 'post main';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo 'pre sub';[m
[31m-        echo_location /subsub;[m
[31m-        echo 'post sub';[m
[31m-    }[m
[31m-[m
[31m-    location /subsub {[m
[31m-        echo 'subsub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-pre sub[m
[31m-subsub[m
[31m-post sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: chained subrequests using named locations[m
[31m-as of 0.8.20, ngx_http_subrequest still does not support[m
[31m-named location. sigh. this case is a TODO.[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_location @sub;[m
[31m-        echo 'post main';[m
[31m-    }[m
[31m-[m
[31m-    location @sub {[m
[31m-        echo 'pre sub';[m
[31m-        echo_location @subsub;[m
[31m-        echo 'post sub';[m
[31m-    }[m
[31m-[m
[31m-    location @subsub {[m
[31m-        echo 'subsub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-pre sub[m
[31m-subsub[m
[31m-post sub[m
[31m-post main[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: explicit flush in main request[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_location /sub;[m
[31m-        echo 'post main';[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo 'sub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no varaiable inheritance[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-        echo_location /sub;[m
[31m-        echo_location /sub2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/main[m
[31m-/sub[m
[31m-/sub2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: unsafe uri[m
[31m---- config[m
[31m-    location /unsafe {[m
[31m-        echo_location '/../foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /unsafe[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-echo_location sees unsafe uri: "/../foo"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: querystring in url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub?foo=Foo&bar=Bar;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: querystring in url *AND* an explicit querystring[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub?foo=Foo&bar=Bar blah=Blah;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar $arg_blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-  Blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: let subrequest to read the main request's request body[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, body![m
[31m---- response_body chomp[m
[31m-hello, body![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: sleep after location[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-        echo_sleep 0.001;[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub[m
[31m-sub[m
[31m---- skip_nginx: 2: < 0.8.11[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: deep nested echo_location/echo_location_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location /group;[m
[31m-        echo_location_async /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        #echo_sleep 0.001;[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-5[m
[31m-6[m
[31m-7[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: deep nested echo_location/echo_location_async (with sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location_async /bar;[m
[31m-        echo_location /group;[m
[31m-        echo_location_async /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /baz;[m
[31m-        echo_location_async /bah;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/ba[rzh]' {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-5[m
[31m-6[m
[31m-7[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: deep nested echo_location (with sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-        echo_location /group;[m
[31m-        echo_location /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_location /bar;[m
[31m-        echo_location /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /incr {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/incr;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m-1[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: leading subrequest & echo_before_body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_before_body hello;[m
[31m-        echo_location /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_location /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: multiple leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_location /foo;[m
[31m-        echo_location /bar;[m
[31m-    }[m
[31m-    location /main2 {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            local res2 = ngx.location.capture("/bar")[m
[31m-            ngx.say(res.body)[m
[31m-            ngx.say(res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n ' people';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world people);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: sanity (HEAD)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /sub;[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /main[m
[31m---- response_body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/mixed.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/mixed.t[m
[1mdeleted file mode 100644[m
[1mindex abf2599..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/mixed.t[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: echo before echo_client_request_headers[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo "headers:";[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"headers:[m
[31m-GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: echo_client_request_headers before echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-        echo "...these are the headers";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-...these are the headers[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: echo & headers & echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo "headers are";[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-        echo "...these are the headers";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"headers are[m
[31m-GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-...these are the headers[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: mixed with echo_duplicate[m
[31m---- config[m
[31m-    location /mixed {[m
[31m-        echo hello;[m
[31m-        echo_duplicate 2 ---;[m
[31m-        echo_duplicate 1 ' END ';[m
[31m-        echo_duplicate 2 ---;[m
[31m-        echo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /mixed[m
[31m---- response_body[m
[31m-hello[m
[31m------- END ------[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/request-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/request-body.t[m
[1mdeleted file mode 100644[m
[1mindex d467b2e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/request-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: big client body buffered into temp files[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo[m
[31m-" . 'a' x 4096 . 'end';[m
[31m---- response_body eval[m
[31m-'a' x 4096 . 'end'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: in memory request body (trailing echo)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-        echo done;[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo[m
[31m-hello world[m
[31m---- response_body[m
[31m-hello worlddone[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: big client body buffered into temp files (trailing echo)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-        echo done;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo[m
[31m-" . 'a' x 4096 . "end\n";[m
[31m---- response_body eval[m
[31m-'a' x 4096 . "enddone\n"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/request-info.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/request-info.t[m
[1mdeleted file mode 100644[m
[1mindex 8fd015e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/request-info.t[m
[1m+++ /dev/null[m
[36m@@ -1,841 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 15);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: standalone directive[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multiple instances[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body eval[m
[31m-"GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-GET /echo HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: does not explicitly request_body[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo [$echo_request_body];[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo[m
[31m-body here[m
[31m-heh[m
[31m---- response_body[m
[31m-[][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: let proxy read request_body[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_before_body [$echo_request_body];[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/blah;[m
[31m-    }[m
[31m-    location /blah { echo_duplicate 0 ''; }[m
[31m---- request[m
[31m-POST /echo[m
[31m-body here[m
[31m-heh[m
[31m---- response_body[m
[31m-[body here[m
[31m-heh][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: use echo_read_request_body to read it![m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo [$echo_request_body];[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo[m
[31m-body here[m
[31m-heh[m
[31m---- response_body[m
[31m-[body here[m
[31m-heh][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: how about sleep after that?[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_sleep 0.002;[m
[31m-        echo [$echo_request_body];[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo[m
[31m-body here[m
[31m-heh[m
[31m---- response_body[m
[31m-[body here[m
[31m-heh][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: echo back the whole client request[m
[31m---- config[m
[31m-  # echo back the client request[m
[31m-  location /echoback {[m
[31m-    echo -n $echo_client_request_headers;[m
[31m-    echo_read_request_body;[m
[31m-    echo $echo_request_body;[m
[31m-  }[m
[31m---- request[m
[31m-POST /echoback[m
[31m-body here[m
[31m-haha[m
[31m---- response_body eval[m
[31m-"POST /echoback HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 14\r[m
[31m-\r[m
[31m-body here[m
[31m-haha[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: echo_request_body[m
[31m---- config[m
[31m-    location /body {[m
[31m-      client_body_buffer_size    5;[m
[31m-      echo_read_request_body;[m
[31m-      echo "[$echo_request_body]";[m
[31m-      echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /body[m
[31m-" . ('a' x 2048) . "b"[m
[31m---- response_body eval[m
[31m-"[]\n" .[m
[31m-('a' x 2048) . "b"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: $echo_response_status in content handler[m
[31m---- config[m
[31m-    location /status {[m
[31m-        echo "status: $echo_response_status";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /status[m
[31m---- response_body[m
[31m-status: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: echo_request_body (empty body)[m
[31m---- config[m
[31m-    location /body {[m
[31m-      echo_read_request_body;[m
[31m-      echo_request_body;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /main"[m
[31m---- response_body eval[m
[31m-""[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: small header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: large header[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: small header, with leading CRLF[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: large header, with leading CRLF[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-".[m
[31m-(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: small header, pipelined[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /th"][m
[31m-[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-}, qq{GET /th HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: large header, pipelined[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m-[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-my $headers = (CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n";[m
[31m-[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-$headers},[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-$headers}][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: small header, multi-line header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar baz\r[m
[31m-  blah\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar baz\r[m
[31m-  blah\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: large header, multi-line header[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 50 567;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-my $headers = (CORE::join "\r\n", map { "Header$_: value-$_\r\n hello $_ world blah blah" } 1..512) . "\r\n\r\n";[m
[31m-[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-$headers}[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_\r\n hello $_ world blah blah" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: small header (POST body)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_read_request_body;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: small header (POST body) - in subrequests (location)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: large header (POST body)[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo_read_request_body;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- more_headers eval[m
[31m-CORE::join"\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: large header (POST body) - in subrequests[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        echo_read_request_body;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join"\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: raw headers - the default header buffer can hold the request line, but not the header entries[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_read_request_body;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-$s .= "Accept: */*\n";[m
[31m-$s .= "Cookie: " . "C" x 1200 . "\n";[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-Accept: */*\r[m
[31m-Cookie: " . ("C" x 1200) . "\r\n\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: small header (POST body) - in subrequests (location_async)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location_async /t;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: small header (POST body) - in subrequests (subrequest)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /t;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: small header (POST body) - in subrequests (subrequest_async)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /t;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (exclusive LF in the request data)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (mixed LF and CRLF in the request data)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (another way of mixing LF and CRLF in the request data)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5[m
[31m-\r[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: two pipelined requests with large headers[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 3 5610;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..585[m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..585) . "\r\n\r\n",[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..585) . "\r\n\r\n",[m
[31m-,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: a request with large header and a smaller pipelined request following[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 2 1921;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m---- more_headers eval[m
[31m-[CORE::join("\n", map { "Header$_: value-$_" } 1..170), "Foo: bar\n"][m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..170) . "\r\n\r\n",[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-},[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: a request with large header and a smaller pipelined request following[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 2 1921;[m
[31m-    location /t {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t" . ("a" x 512)][m
[31m---- more_headers eval[m
[31m-[CORE::join("\n", map { "Header$_: value-$_" } 1..170), "Foo: bar\n"][m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..170) . "\r\n\r\n",[m
[31m-qq{GET /t} . ("a" x 512) . qq{ HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-},[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/sleep.t[m
[1mdeleted file mode 100644[m
[1mindex f8e741e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,200 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: fractional delay[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: leading echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-before...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: trailing echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-after...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: two echos around sleep[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-before...[m
[31m-after...[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: interleaving sleep and echo[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 1;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo 2;[m
[31m-        echo_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: interleaving sleep and echo with echo at the end...[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo 1;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo 2;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo 3;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: flush before sleep[m
[31m-we didn't really test the actual effect of "echo_flush" here...[m
[31m-merely checks if it croaks if appears.[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        echo hi;[m
[31m-        echo_flush;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo trees;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body[m
[31m-hi[m
[31m-trees[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: flush does not increment opcode pointer itself[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        echo hi;[m
[31m-        echo_flush;[m
[31m-        echo trees;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body[m
[31m-hi[m
[31m-trees[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sleep through a proxy[m
[31m-this reveals a bug in v0.19 and the bug is fixed in v0.20.[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/entry';[m
[31m-    }[m
[31m-    location /entry {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo done;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /proxy[m
[31m---- response_body_like[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abnormally quit[m
[31m---- config[m
[31m-    location /quit {[m
[31m-        echo before;[m
[31m-        echo_flush;[m
[31m-        echo_sleep 1;[m
[31m-        echo after;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /quit[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: two echos around sleep (HEAD)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo before...;[m
[31m-        echo_sleep 0.01;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /echo[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: sleep by variable[m
[31m---- config[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo before...;[m
[31m-        echo_sleep $1;[m
[31m-        echo after...;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /sleep/0.01[m
[31m---- response_body[m
[31m-before...[m
[31m-after...[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/status.t[m
[1mdeleted file mode 100644[m
[1mindex d97b084..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/status.t[m
[1m+++ /dev/null[m
[36m@@ -1,142 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks());[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: 200[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_status 200;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: if location (200)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-        }[m
[31m-        echo_status 200;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: 404[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_status 404;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: if location (404)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-        }[m
[31m-        echo_status 404;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: 500[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_status 500;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: if location (500)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-        }[m
[31m-        echo_status 500;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: if location (500) no inherit[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            echo_status 503;[m
[31m-        }[m
[31m-        echo_status 500;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 503[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: subrequest[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo_location /sub;[m
[31m-        echo_status 503;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo blah blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo[m
[31m---- response_body[m
[31m-blah blah[m
[31m---- error_code: 503[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/subrequest-async.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/subrequest-async.t[m
[1mdeleted file mode 100644[m
[1mindex 882b368..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/subrequest-async.t[m
[1m+++ /dev/null[m
[36m@@ -1,604 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-#$Test::Nginx::LWP::LogLevel = 'debug';[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = html_dir;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity - GET[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        echo "main method: $echo_client_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: GET[m
[31m-main method: GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity - DELETE[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async DELETE /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        echo "main method: $echo_client_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: DELETE[m
[31m-main method: GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: leading echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: leading & trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before sr 1;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo after sr 1;[m
[31m-        echo before sr 2;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo after sr 2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before sr 1[m
[31m-hello[m
[31m-after sr 1[m
[31m-before sr 2[m
[31m-hello[m
[31m-after sr 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timed multiple subrequests (blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_subrequest_async GET /sub1;[m
[31m-        echo_subrequest_async GET /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.00[0-5] sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: timed multiple subrequests (non-blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_subrequest_async GET /sub1;[m
[31m-        echo_subrequest_async GET /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.00[0-5] sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: location with args[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub -q 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: encoded chars in query strings[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub -q 'foo=a%20b&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-a%20b Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: UTF-8 chars in query strings[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub -q 'foo=你好';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: encoded chars in location url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub%31 -q 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub%31 {[m
[31m-        echo 'sub%31';[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo 'sub1';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: querystring in url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub?foo=Foo&bar=Bar;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: querystring in url *AND* an explicit querystring[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub?foo=Foo&bar=Bar -q blah=Blah;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar $arg_blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-  Blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: explicit flush in main request[m
[31m-flush won't really flush the buffer...[m
[31m---- config[m
[31m-    location /main_flush {[m
[31m-        echo 'pre main';[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo 'post main';[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo 'sub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main_flush[m
[31m---- response_body[m
[31m-pre main[m
[31m-sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: POST subrequest with body (with proxy in the middle) and without read body explicitly[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /proxy -b 'hello, world';[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method.";[m
[31m-        # we need to read body explicitly here...or $echo_request_body[m
[31m-        #   will evaluate to empty ("")[m
[31m-        echo "sub body: $echo_request_body.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST.[m
[31m-sub body: .[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: POST subrequest with body (with proxy in the middle) and read body explicitly[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /proxy -b 'hello, world';[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method.";[m
[31m-        # we need to read body explicitly here...or $echo_request_body[m
[31m-        #   will evaluate to empty ("")[m
[31m-        echo_read_request_body;[m
[31m-        echo "sub body: $echo_request_body.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST.[m
[31m-sub body: hello, world.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: multiple subrequests[m
[31m---- config[m
[31m-    location /multi {[m
[31m-        echo_subrequest_async POST '/sub' -q 'foo=Foo' -b 'hi';[m
[31m-        echo_subrequest_async PUT '/sub' -q 'bar=Bar' -b 'hello';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "querystring: $query_string";[m
[31m-        echo "method: $echo_request_method";[m
[31m-        echo "body: $echo_request_body";[m
[31m-        echo "content length: $http_content_length";[m
[31m-        echo '///';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /multi[m
[31m---- response_body[m
[31m-querystring: foo=Foo[m
[31m-method: POST[m
[31m-body: hi[m
[31m-content length: 2[m
[31m-///[m
[31m-querystring: bar=Bar[m
[31m-method: PUT[m
[31m-body: hello[m
[31m-content length: 5[m
[31m-///[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: no varaiable inheritance[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo_subrequest_async GET /sub2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo $echo_cacheable_request_uri;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-/main[m
[31m-/sub[m
[31m-/sub2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: unsafe uri[m
[31m---- config[m
[31m-    location /unsafe {[m
[31m-        echo_subrequest_async GET '/../foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /unsafe[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-echo_subrequest_async sees unsafe uri: "/../foo"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: let subrequest to read the main request's request body[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, body![m
[31m---- response_body chomp[m
[31m-hello, body![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: POST subrequest with file body (relative paths)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /sub -f html/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: POST subrequest with file body (absolute paths)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /sub -f $TEST_NGINX_HTML_DIR/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world![m
[31m-Haha[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world![m
[31m-Haha[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: POST subrequest with file body (file not found)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async POST /sub -f html/blah/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world[m
[31m---- request[m
[31m-    GET /main[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/open\(\) ".*?" failed/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: POST subrequest with file body (absolute paths in vars)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $path $TEST_NGINX_HTML_DIR/blah.txt;[m
[31m-        echo_subrequest_async POST /sub -f $path;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world![m
[31m-Haha[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world![m
[31m-Haha[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: leading subrequest & echo_before_body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_before_body hello;[m
[31m-        echo_subrequest_async GET /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_subrequest_async GET /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multiple leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_subrequest_async GET /foo;[m
[31m-        echo_subrequest_async GET /bar;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n ' people';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world people);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: sanity (HEAD)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-        echo_subrequest_async GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /main[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: HEAD subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest_async HEAD /sub;[m
[31m-        echo_subrequest_async HEAD /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 6d965d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,725 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = html_dir;[m
[31m-$ENV{TEST_NGINX_CLIENT_PORT} ||= server_port();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: leading echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_subrequest GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: leading & trailing echo[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before subrequest;[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo after subrequest;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before subrequest[m
[31m-hello[m
[31m-after subrequest[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: multiple subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo before sr 1;[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo after sr 1;[m
[31m-        echo before sr 2;[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo after sr 2;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-before sr 1[m
[31m-hello[m
[31m-after sr 1[m
[31m-before sr 2[m
[31m-hello[m
[31m-after sr 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: timed multiple subrequests (blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_subrequest GET /sub1;[m
[31m-        echo_subrequest GET /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_blocking_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_blocking_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: timed multiple subrequests (non-blocking sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_reset_timer;[m
[31m-        echo_subrequest GET /sub1;[m
[31m-        echo_subrequest GET /sub2;[m
[31m-        echo "took $echo_timer_elapsed sec for total.";[m
[31m-    }[m
[31m-    location /sub1 {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub2 {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^hello[m
[31m-world[m
[31m-took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: location with args[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub -q 'foo=Foo&bar=Bar';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: chained subrequests[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo 'post main';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo 'pre sub';[m
[31m-        echo_subrequest GET /subsub;[m
[31m-        echo 'post sub';[m
[31m-    }[m
[31m-[m
[31m-    location /subsub {[m
[31m-        echo 'subsub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-pre sub[m
[31m-subsub[m
[31m-post sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: chained subrequests using named locations[m
[31m-as of 0.8.20, ngx_http_subrequest still does not support[m
[31m-named location. sigh. this case is a TODO.[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_subrequest GET @sub;[m
[31m-        echo 'post main';[m
[31m-    }[m
[31m-[m
[31m-    location @sub {[m
[31m-        echo 'pre sub';[m
[31m-        echo_subrequest GET @subsub;[m
[31m-        echo 'post sub';[m
[31m-    }[m
[31m-[m
[31m-    location @subsub {[m
[31m-        echo 'subsub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-pre sub[m
[31m-subsub[m
[31m-post sub[m
[31m-post main[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: explicit flush in main request[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'pre main';[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo 'post main';[m
[31m-        echo_flush;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 0.02;[m
[31m-        echo 'sub';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-pre main[m
[31m-sub[m
[31m-post main[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: DELETE subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest DELETE /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        echo "main method: $echo_client_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: DELETE[m
[31m-main method: GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: DELETE subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo "main method: $echo_client_request_method";[m
[31m-        echo_subrequest GET /proxy;[m
[31m-        echo_subrequest DELETE /proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-main method: GET[m
[31m-sub method: GET[m
[31m-sub method: DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: POST subrequest with body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -b 'hello, world';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo "sub body: $echo_request_body";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-sub body: hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: POST subrequest with body (explicitly read the body)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -b 'hello, world';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we call echo_read_client_body explicitly here even[m
[31m-        #   though it's not necessary.[m
[31m-        echo_read_request_body;[m
[31m-        echo "sub body: $echo_request_body";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-sub body: hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: POST subrequest with body (with proxy in the middle) and without read body explicitly[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /proxy -b 'hello, world';[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method.";[m
[31m-        # we need to read body explicitly here...or $echo_request_body[m
[31m-        #   will evaluate to empty ("")[m
[31m-        echo "sub body: $echo_request_body.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST.[m
[31m-sub body: .[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: POST subrequest with body (with proxy in the middle) and read body explicitly[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /proxy -b 'hello, world';[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method.";[m
[31m-        # we need to read body explicitly here...or $echo_request_body[m
[31m-        #   will evaluate to empty ("")[m
[31m-        echo_read_request_body;[m
[31m-        echo "sub body: $echo_request_body.";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST.[m
[31m-sub body: hello, world.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: multiple subrequests[m
[31m---- config[m
[31m-    location /multi {[m
[31m-        echo_subrequest POST '/sub' -q 'foo=Foo' -b 'hi';[m
[31m-        echo_subrequest PUT '/sub' -q 'bar=Bar' -b 'hello';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "querystring: $query_string";[m
[31m-        echo "method: $echo_request_method";[m
[31m-        echo "body: $echo_request_body";[m
[31m-        echo "content length: $http_content_length";[m
[31m-        echo '///';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /multi[m
[31m---- response_body[m
[31m-querystring: foo=Foo[m
[31m-method: POST[m
[31m-body: hi[m
[31m-content length: 2[m
[31m-///[m
[31m-querystring: bar=Bar[m
[31m-method: PUT[m
[31m-body: hello[m
[31m-content length: 5[m
[31m-///[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: unsafe uri[m
[31m---- config[m
[31m-    location /unsafe {[m
[31m-        echo_subrequest GET '/../foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /unsafe[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-echo_subrequest sees unsafe uri: "/../foo"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: querystring in url[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub?foo=Foo&bar=Bar;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Foo Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: querystring in url *AND* an explicit querystring[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub?foo=Foo&bar=Bar -q blah=Blah;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo $arg_foo $arg_bar $arg_blah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-  Blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: let subrequest to read the main request's request body[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, body![m
[31m---- response_body chomp[m
[31m-hello, body![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: deep nested echo_subrequest/echo_subrequest_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /bar;[m
[31m-        echo_subrequest_async GET /bar;[m
[31m-        echo_subrequest_async GET /bar;[m
[31m-        echo_subrequest GET /group;[m
[31m-        echo_subrequest_async GET /group;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_subrequest GET /bar;[m
[31m-        echo_subrequest_async GET /bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo $echo_incr;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-5[m
[31m-6[m
[31m-7[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: deep nested echo_subrequest/echo_subrequest_async[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /bar?a;[m
[31m-        echo_subrequest_async GET /bar?b;[m
[31m-        echo_subrequest_async GET /bar?c;[m
[31m-        echo_subrequest GET /group?a=d&b=e;[m
[31m-        echo_subrequest_async GET /group?a=f&b=g;[m
[31m-    }[m
[31m-[m
[31m-    location /group {[m
[31m-        echo_subrequest GET /bar?$arg_a;[m
[31m-        echo_subrequest_async GET /bar?$arg_b;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo -n $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body: abcdefg[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: POST subrequest with file body (relative paths)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -f html/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: POST subrequest with file body (absolute paths)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -f $TEST_NGINX_HTML_DIR/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world![m
[31m-Haha[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-Hello, world![m
[31m-Haha[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: POST subrequest with file body (file not found)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest POST /sub -f html/blah/blah.txt;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.txt[m
[31m-Hello, world[m
[31m---- request[m
[31m-    GET /main[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/open\(\) ".*?" failed/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: leading subrequest & echo_before_body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_before_body hello;[m
[31m-        echo_subrequest GET /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_subrequest GET /foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: multiple leading subrequest & xss[m
[31m---- config[m
[31m-    location /main {[m
[31m-        default_type 'application/json';[m
[31m-        xss_get on;[m
[31m-        xss_callback_arg c;[m
[31m-        echo_subrequest GET /foo;[m
[31m-        echo_subrequest GET /bar;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo -n world;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n ' people';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main?c=hi[m
[31m---- response_body chop[m
[31m-hi(world people);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: sanity (HEAD)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest GET /sub;[m
[31m-        echo_subrequest GET /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /main[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: POST subrequest to ngx_proxy[m
[31m---- config[m
[31m-    location /hello {[m
[31m-       default_type text/plain;[m
[31m-       echo_subrequest POST '/proxy' -q 'foo=Foo&bar=baz' -b 'request_body=test&test=3';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_CLIENT_PORT/sub;[m
[31m-        #proxy_pass http://127.0.0.1:1113/sub;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_read_request_body;[m
[31m-        echo "sub method: $echo_request_method";[m
[31m-        # we don't need to call echo_read_client_body explicitly here[m
[31m-        echo "sub body: $echo_request_body";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /hello[m
[31m---- response_body[m
[31m-sub method: POST[m
[31m-sub body: request_body=test&test=3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: HEAD subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_subrequest HEAD /sub;[m
[31m-        echo_subrequest HEAD /sub;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: method name as an nginx variable (github issue #34)[m
[31m---- config[m
[31m-  location ~ ^/delay/(?<delay>[0-9.]+)/(?<originalURL>.*)$ {[m
[31m-      # echo_blocking_sleep $delay;[m
[31m-      echo_subrequest '$echo_request_method' '/$originalURL' -q '$args';[m
[31m-  }[m
[31m-[m
[31m-  location /api {[m
[31m-      echo "args: $args";[m
[31m-  }[m
[31m---- request[m
[31m-    GET /delay/0.343/api/?a=b[m
[31m---- response_body[m
[31m-args: a=b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/unused.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/unused.t[m
[1mdeleted file mode 100644[m
[1mindex f3c6e9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/t/unused.t[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (5 * blocks());[m
[31m-[m
[31m-no_long_string();[m
[31m-log_level('warn');[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: filters used[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo world;[m
[31m-        echo_after_body hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo?blah[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m---- error_log[m
[31m-echo header filter, uri "/echo?blah"[m
[31m-echo body filter, uri "/echo?blah"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: filters not used[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo world;[m
[31m-        #echo_after_body hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /echo?blah[m
[31m---- response_body[m
[31m-world[m
[31m---- no_error_log[m
[31m-echo header filter, uri "/echo?blah"[m
[31m-echo body filter, uri "/echo?blah"[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: (after) filters used (multiple http {} blocks)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo world;[m
[31m-        echo_after_body hello;[m
[31m-    }[m
[31m-[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /echo?blah[m
[31m---- response_body[m
[31m-world[m
[31m-hello[m
[31m---- error_log[m
[31m-echo header filter, uri "/echo?blah"[m
[31m-echo body filter, uri "/echo?blah"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: (before) filters used (multiple http {} blocks)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- http_config[m
[31m-    postpone_output 1;[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo world;[m
[31m-        echo_before_body hello;[m
[31m-    }[m
[31m-[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /echo?blah[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- error_log[m
[31m-echo header filter, uri "/echo?blah"[m
[31m-echo body filter, uri "/echo?blah"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex d8a2c64..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-#!/usr/bin/env bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-force=$2[m
[31m-home=~[m
[31m-[m
[31m-            #--with-cc=gcc46 \[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:/usr/local/lib" \[m
[31m-            --with-cc-opt="-DDEBUG_MALLOC" \[m
[31m-            --with-http_stub_status_module \[m
[31m-            --with-http_image_filter_module \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root/../eval-nginx-module \[m
[31m-          --add-module=$root/../xss-nginx-module \[m
[31m-          --add-module=$root/../rds-json-nginx-module \[m
[31m-          --add-module=$root/../headers-more-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-          --without-http_ssi_module \[m
[31m-          --with-debug || exit 1[m
[31m-          #--add-module=$root/../lz-session-nginx-module \[m
[31m-          #--add-module=$home/work/ndk \[m
[31m-          #--add-module=$home/work/ndk/examples/http/set_var \[m
[31m-          #--add-module=$root/../eval-nginx-module \[m
[31m-          #--add-module=/home/agentz/work/nginx_eval_module-1.0.1 \[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 0f8e871..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/echo-nginx-module-0.59/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 0975ebd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-util/bench[m
[31m-src/cipher.c[m
[31m-src/cipher.h[m
[31m-pack.sh[m
[31m-t/servroot/[m
[31m-all[m
[31m-build1[0-9][m
[31m-buildroot/[m
[31m-util/wiki2pod.pl[m
[31m-go[m
[31m-build12[m
[31m-Makefile[m
[31m-*.plist[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/config[m
[1mdeleted file mode 100644[m
[1mindex f997d3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/config[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_encrypted_session; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_encrypted_session; please put it before ngx_encrypted_session." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_encrypted_session; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_encrypted_session; please put it before ngx_encrypted_session." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_encrypted_session_module[m
[31m-[m
[31m-HTTP_ENCRYPTED_SESSION_SRCS="                                               \[m
[31m-                    $ngx_addon_dir/src/ngx_http_encrypted_session_module.c  \[m
[31m-                    $ngx_addon_dir/src/ngx_http_encrypted_session_cipher.c  \[m
[31m-                    "[m
[31m-[m
[31m-HTTP_ENCRYPTED_SESSION_DEPS="                                               \[m
[31m-                    $ngx_addon_dir/src/ddebug.h                             \[m
[31m-                    $ngx_addon_dir/src/ngx_http_encrypted_session_cipher.h  \[m
[31m-                    "[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HTTP_ENCRYPTED_SESSION_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_ENCRYPTED_SESSION_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_ENCRYPTED_SESSION_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_ENCRYPTED_SESSION_DEPS"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[31m-#CORE_LIBS="$CORE_LIBS -lssl"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex f156616..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "encrypted-session *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.c[m
[1mdeleted file mode 100644[m
[1mindex e4b09d2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.c[m
[1m+++ /dev/null[m
[36m@@ -1,279 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_encrypted_session_cipher.h"[m
[31m-#include <openssl/evp.h>[m
[31m-#include <openssl/md5.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-static uint64_t ngx_http_encrypted_session_ntohll(uint64_t n);[m
[31m-static uint64_t ngx_http_encrypted_session_htonll(uint64_t n);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_encrypted_session_aes_mac_encrypt(ngx_pool_t *pool, ngx_log_t *log,[m
[31m-    const u_char *iv, size_t iv_len, const u_char *key, size_t key_len,[m
[31m-    const u_char *in, size_t in_len, ngx_uint_t expires, u_char **dst,[m
[31m-    size_t *dst_len)[m
[31m-{[m
[31m-    EVP_CIPHER_CTX           ctx;[m
[31m-    const EVP_CIPHER        *cipher;[m
[31m-    u_char                  *p, *data;[m
[31m-    int                      ret;[m
[31m-    size_t                   block_size, buf_size, data_size;[m
[31m-    int                      len;[m
[31m-    uint64_t                 expires_time;[m
[31m-    time_t                   now;[m
[31m-[m
[31m-    if (key_len != ngx_http_encrypted_session_key_length) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    EVP_CIPHER_CTX_init(&ctx);[m
[31m-[m
[31m-    cipher = EVP_aes_256_cbc();[m
[31m-[m
[31m-    block_size = EVP_CIPHER_block_size(cipher);[m
[31m-[m
[31m-    data_size = in_len + sizeof(expires_time);[m
[31m-[m
[31m-    buf_size = MD5_DIGEST_LENGTH /* for the digest */[m
[31m-               + (data_size + block_size - 1) /* for EVP_EncryptUpdate */[m
[31m-               + block_size; /* for EVP_EncryptFinal */[m
[31m-[m
[31m-    p = ngx_palloc(pool, buf_size + data_size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *dst = p;[m
[31m-[m
[31m-    data = p + buf_size;[m
[31m-[m
[31m-    ngx_memcpy(data, in, in_len);[m
[31m-[m
[31m-    if (expires == 0) {[m
[31m-        expires_time = 0;[m
[31m-    } else {[m
[31m-        now = time(NULL);[m
[31m-        if (now == -1) {[m
[31m-            goto evp_error;[m
[31m-        }[m
[31m-[m
[31m-        expires_time = (uint64_t) now + (uint64_t) expires;[m
[31m-    }[m
[31m-[m
[31m-    dd("expires before encryption: %lld", (long long) expires_time);[m
[31m-[m
[31m-    expires_time = ngx_http_encrypted_session_htonll(expires_time);[m
[31m-[m
[31m-    ngx_memcpy(data + in_len, (u_char *) &expires_time, sizeof(expires_time));[m
[31m-[m
[31m-    MD5(data, data_size, p);[m
[31m-[m
[31m-    p += MD5_DIGEST_LENGTH;[m
[31m-[m
[31m-    ret = EVP_EncryptInit(&ctx, cipher, key, iv);[m
[31m-    if (!ret) {[m
[31m-        goto evp_error;[m
[31m-    }[m
[31m-[m
[31m-    /* encrypt the raw input data */[m
[31m-[m
[31m-    ret = EVP_EncryptUpdate(&ctx, p, &len, data, data_size);[m
[31m-    if (!ret) {[m
[31m-        goto evp_error;[m
[31m-    }[m
[31m-[m
[31m-    p += len;[m
[31m-[m
[31m-    ret = EVP_EncryptFinal(&ctx, p, &len);[m
[31m-    if (!ret) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* XXX we should still explicitly release the ctx[m
[31m-     * or we'll leak memory here */[m
[31m-    EVP_CIPHER_CTX_cleanup(&ctx);[m
[31m-[m
[31m-    p += len;[m
[31m-[m
[31m-    *dst_len = p - *dst;[m
[31m-[m
[31m-    if (*dst_len > buf_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "encrypted_session: aes_mac_encrypt: buffer error");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-evp_error:[m
[31m-[m
[31m-    EVP_CIPHER_CTX_cleanup(&ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_encrypted_session_aes_mac_decrypt(ngx_pool_t *pool, ngx_log_t *log,[m
[31m-    const u_char *iv, size_t iv_len, const u_char *key, size_t key_len,[m
[31m-    const u_char *in, size_t in_len, u_char **dst, size_t *dst_len)[m
[31m-{[m
[31m-    EVP_CIPHER_CTX           ctx;[m
[31m-    const EVP_CIPHER        *cipher;[m
[31m-    int                      ret;[m
[31m-    size_t                   block_size, buf_size;[m
[31m-    int                      len;[m
[31m-    u_char                  *p;[m
[31m-    const u_char            *digest;[m
[31m-    uint64_t                 expires_time;[m
[31m-    time_t                   now;[m
[31m-[m
[31m-    u_char new_digest[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    if (key_len != ngx_http_encrypted_session_key_length[m
[31m-        || in_len < MD5_DIGEST_LENGTH)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    digest = in;[m
[31m-[m
[31m-    EVP_CIPHER_CTX_init(&ctx);[m
[31m-[m
[31m-    cipher = EVP_aes_256_cbc();[m
[31m-[m
[31m-    ret = EVP_DecryptInit(&ctx, cipher, key, iv);[m
[31m-    if (!ret) {[m
[31m-        goto evp_error;[m
[31m-    }[m
[31m-[m
[31m-    block_size = EVP_CIPHER_block_size(cipher);[m
[31m-[m
[31m-    buf_size = in_len + block_size /* for EVP_DecryptUpdate */[m
[31m-               + block_size; /* for EVP_DecryptFinal */[m
[31m-[m
[31m-    p = ngx_palloc(pool, buf_size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *dst = p;[m
[31m-[m
[31m-    ret = EVP_DecryptUpdate(&ctx, p, &len, in + MD5_DIGEST_LENGTH,[m
[31m-                            in_len - MD5_DIGEST_LENGTH);[m
[31m-[m
[31m-    if (!ret) {[m
[31m-        dd("decrypt update failed");[m
[31m-        goto evp_error;[m
[31m-    }[m
[31m-[m
[31m-    p += len;[m
[31m-[m
[31m-    ret = EVP_DecryptFinal(&ctx, p, &len);[m
[31m-[m
[31m-    /* XXX we should still explicitly release the ctx[m
[31m-     * or we'll leak memory here */[m
[31m-    EVP_CIPHER_CTX_cleanup(&ctx);[m
[31m-[m
[31m-    if (!ret) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "failed to decrypt session: bad AES-256 digest");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p += len;[m
[31m-[m
[31m-    *dst_len = p - *dst;[m
[31m-[m
[31m-    if (*dst_len > buf_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "encrypted_session: aes_mac_decrypt: buffer error");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*dst_len < sizeof(expires_time)) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    MD5(*dst, *dst_len, new_digest);[m
[31m-[m
[31m-    if (ngx_strncmp(digest, new_digest, MD5_DIGEST_LENGTH) != 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "failed to decrypt session: MD5 checksum mismatch");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *dst_len -= sizeof(expires_time);[m
[31m-[m
[31m-    dd("dst len: %d", (int) *dst_len);[m
[31m-    dd("dst: %.*s", (int) *dst_len, *dst);[m
[31m-[m
[31m-    p -= sizeof(expires_time);[m
[31m-[m
[31m-    expires_time = ngx_http_encrypted_session_ntohll(*((uint64_t *) p));[m
[31m-[m
[31m-    now = time(NULL);[m
[31m-    if (now == -1) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("expires after decryption: %lld", (long long) expires_time);[m
[31m-[m
[31m-    if (expires_time && expires_time <= (uint64_t) now) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "encrypted_session: session expired: %uL <= %T",[m
[31m-                       expires_time, now);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("decrypted successfully");[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-evp_error:[m
[31m-[m
[31m-    EVP_CIPHER_CTX_cleanup(&ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uint64_t[m
[31m-ngx_http_encrypted_session_ntohll(uint64_t n)[m
[31m-{[m
[31m-#ifdef ntohll[m
[31m-    return ntohll(n);[m
[31m-#else[m
[31m-    return ((uint64_t) ntohl((unsigned long) n) << 32)[m
[31m-           + ntohl((unsigned long) (n >> 32));[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uint64_t[m
[31m-ngx_http_encrypted_session_htonll(uint64_t n)[m
[31m-{[m
[31m-#ifdef htonll[m
[31m-    return htonll(n);[m
[31m-#else[m
[31m-    return ((uint64_t) htonl((unsigned long) n) << 32)[m
[31m-           + htonl((unsigned long) (n >> 32));[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.h[m
[1mdeleted file mode 100644[m
[1mindex 93cc884..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_cipher.h[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-#ifndef NGX_HTTP_ENCRYPTED_SESSION_CIPHER_H[m
[31m-#define NGX_HTTP_ENCRYPTED_SESSION_CIPHER_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <openssl/evp.h>[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    ngx_http_encrypted_session_key_length = 256 / 8,[m
[31m-    ngx_http_encrypted_session_iv_length = EVP_MAX_IV_LENGTH[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_encrypted_session_aes_mac_encrypt(ngx_pool_t *pool,[m
[31m-        ngx_log_t *log, const u_char *iv, size_t iv_len, const u_char *key,[m
[31m-        size_t key_len, const u_char *in, size_t in_len,[m
[31m-        ngx_uint_t expires, u_char **dst, size_t *dst_len);[m
[31m-[m
[31m-ngx_int_t ngx_http_encrypted_session_aes_mac_decrypt(ngx_pool_t *pool,[m
[31m-        ngx_log_t *log, const u_char *iv, size_t iv_len, const u_char *key,[m
[31m-        size_t key_len, const u_char *in, size_t in_len, u_char **dst,[m
[31m-        size_t *dst_len);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_ENCRYPTED_SESSION_CIPHER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_module.c[m
[1mdeleted file mode 100644[m
[1mindex 18603d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/src/ngx_http_encrypted_session_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,352 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include "ngx_http_encrypted_session_cipher.h"[m
[31m-[m
[31m-#define ngx_http_encrypted_session_default_iv (u_char *) "deadbeefdeadbeef"[m
[31m-[m
[31m-#define ngx_http_encrypted_session_default_expires 86400[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char              *key;[m
[31m-    u_char              *iv;[m
[31m-    time_t               expires;[m
[31m-[m
[31m-} ngx_http_encrypted_session_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_encode_encrypted_session(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_decode_encrypted_session(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_encrypted_session_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_encrypted_session_iv(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_encrypted_session_expires(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_encrypted_session_create_conf(ngx_conf_t *cf);[m
[31m-[m
[31m-static char *ngx_http_encrypted_session_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static  ndk_set_var_t  ngx_http_set_encode_encrypted_session_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_encode_encrypted_session,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-static  ndk_set_var_t  ngx_http_set_decode_encrypted_session_filter = {[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    (void *) ngx_http_set_decode_encrypted_session,[m
[31m-    1,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_encrypted_session_commands[] = {[m
[31m-    {[m
[31m-        ngx_string("encrypted_session_key"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_encrypted_session_key,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("encrypted_session_iv"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_encrypted_session_iv,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("encrypted_session_expires"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_encrypted_session_expires,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_encrypt_session"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        &ngx_http_set_encode_encrypted_session_filter[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string("set_decrypt_session"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF[m
[31m-            |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE12,[m
[31m-        ndk_set_var_value,[m
[31m-        NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-        0,[m
[31m-        &ngx_http_set_decode_encrypted_session_filter[m
[31m-    },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_encrypted_session_module_ctx = {[m
[31m-    NULL,                                    /* preconfiguration */[m
[31m-    NULL,                                    /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                    /* create main configuration */[m
[31m-    NULL,                                    /* init main configuration */[m
[31m-[m
[31m-    NULL,                                    /* create server configuration */[m
[31m-    NULL,                                    /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_encrypted_session_create_conf,  /* create location configuration */[m
[31m-    ngx_http_encrypted_session_merge_conf,   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_encrypted_session_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_encrypted_session_module_ctx,  /* module context */[m
[31m-    ngx_http_encrypted_session_commands,     /* module directives */[m
[31m-    NGX_HTTP_MODULE,                         /* module type */[m
[31m-    NULL,                                    /* init master */[m
[31m-    NULL,                                    /* init module */[m
[31m-    NULL,                                    /* init process */[m
[31m-    NULL,                                    /* init thread */[m
[31m-    NULL,                                    /* exit thread */[m
[31m-    NULL,                                    /* exit process */[m
[31m-    NULL,                                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_encode_encrypted_session(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *dst;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    ngx_http_encrypted_session_conf_t      *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_encrypted_session_module);[m
[31m-[m
[31m-    if (conf->key == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                "encrypted_session: a key is required to be "[m
[31m-                "defined by the encrypted_session_key directive");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "encrypted_session: expires=%T", conf->expires);[m
[31m-[m
[31m-    rc = ngx_http_encrypted_session_aes_mac_encrypt(r->pool,[m
[31m-            r->connection->log, conf->iv, ngx_http_encrypted_session_iv_length,[m
[31m-            conf->key, ngx_http_encrypted_session_key_length,[m
[31m-            v->data, v->len, (ngx_uint_t) conf->expires, &dst, &len);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dst = NULL;[m
[31m-        len = 0;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "encrypted_session: failed to encrypt");[m
[31m-    }[m
[31m-[m
[31m-    res->data = dst;[m
[31m-    res->len = len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_decode_encrypted_session(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                   len;[m
[31m-    u_char                  *dst;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    ngx_http_encrypted_session_conf_t      *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_encrypted_session_module);[m
[31m-[m
[31m-    if (conf->key == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "encrypted_session: a key is required to be "[m
[31m-                      "defined by the encrypted_session_key directive");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_encrypted_session_aes_mac_decrypt(r->pool,[m
[31m-            r->connection->log, conf->iv, ngx_http_encrypted_session_iv_length,[m
[31m-            conf->key, ngx_http_encrypted_session_key_length,[m
[31m-            v->data, v->len, &dst, &len);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dst = NULL;[m
[31m-        len = 0;[m
[31m-    }[m
[31m-[m
[31m-    res->data = dst;[m
[31m-    res->len = len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_encrypted_session_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_http_encrypted_session_conf_t      *llcf = conf;[m
[31m-[m
[31m-    if (llcf->key != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len != ngx_http_encrypted_session_key_length) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "encrypted_session_key: the key must be of %d "[m
[31m-                           "bytes long",[m
[31m-                           ngx_http_encrypted_session_key_length);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->key = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_encrypted_session_iv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_encrypted_session_conf_t  *llcf = conf;[m
[31m-[m
[31m-    if (llcf->iv != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len > ngx_http_encrypted_session_iv_length) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "encrypted_session_iv: the init vector must NOT "[m
[31m-                           "be longer than %d bytes",[m
[31m-                ngx_http_encrypted_session_iv_length);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->iv = ngx_pcalloc(cf->pool,[m
[31m-            ngx_http_encrypted_session_iv_length);[m
[31m-[m
[31m-    if (llcf->iv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX iv max len: %d", (int) ngx_http_encrypted_session_iv_length);[m
[31m-    dd("XXX iv actual len: %d", (int) value[1].len);[m
[31m-[m
[31m-    if (value[1].len) {[m
[31m-        ngx_memcpy(llcf->iv, value[1].data, value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_encrypted_session_expires(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_http_encrypted_session_conf_t  *llcf = conf;[m
[31m-[m
[31m-    if (llcf->expires != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    llcf->expires = ngx_parse_time(&value[1], 1);[m
[31m-[m
[31m-    if (llcf->expires == NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    dd("expires: %d", (int)llcf->expires);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_encrypted_session_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_encrypted_session_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_encrypted_session_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->key     = NGX_CONF_UNSET_PTR;[m
[31m-    conf->iv      = NGX_CONF_UNSET_PTR;[m
[31m-    conf->expires = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_encrypted_session_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_encrypted_session_conf_t *prev = parent;[m
[31m-    ngx_http_encrypted_session_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->key, prev->key, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->iv, prev->iv,[m
[31m-                             ngx_http_encrypted_session_default_iv);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->expires, prev->expires,[m
[31m-                         ngx_http_encrypted_session_default_expires);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 18a7f48..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,318 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 7);[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: key with default iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set $a 'abc';[m
[31m-[m
[31m-        set_encrypt_session $res $a;[m
[31m-[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-[m
[31m-        echo "res = $ppres";[m
[31m-[m
[31m-        set_decrypt_session $b $res;[m
[31m-        echo "b = $b";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /encode[m
[31m---- response_body[m
[31m-res = ktrp3n437q42laejppc9d4bg0jpv0ejie106ooo65od9lf5huhs0====[m
[31m-b = abc[m
[31m---- error_log[m
[31m-encrypted_session: expires=0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: key with custom iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set $a 'abc';[m
[31m-[m
[31m-        set_encrypt_session $res $a;[m
[31m-[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-[m
[31m-        echo "res = $ppres";[m
[31m-[m
[31m-        set_decrypt_session $b $res;[m
[31m-        echo "b = $b";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /encode[m
[31m---- response_body[m
[31m-res = ktrp3n437q42laejppc9d4bg0hul4pmqhc8tn2laae40aakqfoh0====[m
[31m-b = abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: key with custom iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    #encrypted_session_key "abcdefghijklmnopqrstuvwx";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 3;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set $a 'abc';[m
[31m-[m
[31m-        set_encrypt_session $res $a;[m
[31m-[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-[m
[31m-        echo "res = $ppres";[m
[31m-[m
[31m-        set_decrypt_session $b $res;[m
[31m-        echo "b = $b";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /encode[m
[31m---- response_body_like[m
[31m-^res = [0-9a-v=]{30,}[m
[31m-b = abc$[m
[31m---- error_log[m
[31m-encrypted_session: expires=3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: key with custom iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 1d;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set_encrypt_session $res '1234';[m
[31m-        set_encode_base32 $res;[m
[31m-[m
[31m-        echo "res = $res";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /encode[m
[31m---- response_body_like[m
[31m-^res = [0-9a-v=]{30,}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: key with custom iv[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 1d;[m
[31m-[m
[31m-    location /foo {[m
[31m-        set $uid 1315;[m
[31m-        set_encrypt_session $session $uid;[m
[31m-        set_encode_base32 $session;[m
[31m-[m
[31m-        #echo $session;[m
[31m-        echo_exec /bar _s=$session;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        encrypted_session_expires 30d;[m
[31m-        set_unescape_uri $session $arg__s;[m
[31m-        set_decode_base32 $session;[m
[31m-        set_decrypt_session $uid $session;[m
[31m-        echo $uid;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-1315[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: decoder (bad md5 checksum)[m
[31m-valid: ktrp3n437q42laejppc9d4bg0j0i6np4tdpovhgdum09l7a0rg10====[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 1d;[m
[31m-[m
[31m-    location /decode {[m
[31m-        set_unescape_uri $session $arg__s;[m
[31m-        set_decode_base32 $session;[m
[31m-        set_decrypt_session $uid $session;[m
[31m-        echo '[$uid]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode?_s=3trp3n437q42laejppc9d4bg0j0i6np4tdpovhgdum09l7a0rg10====[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: decoder (bad md5 checksum)[m
[31m-valid: ktrp3n437q42laejppc9d4bg0j0i6np4tdpovhgdum09l7a0rg10====[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_iv "12345678";[m
[31m-    encrypted_session_expires 1d;[m
[31m-[m
[31m-    location /decode {[m
[31m-        set_unescape_uri $session $arg__s;[m
[31m-        set_decode_base32 $session;[m
[31m-        set_decrypt_session $uid $session;[m
[31m-        echo '[$uid]';[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode?_s=ktrp3n437q42laejppc9d4bg0j0i6np4tdpovhgdum09laa0rg10====[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: expired[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 1;[m
[31m-[m
[31m-    location /encode {[m
[31m-        set $a 'abc';[m
[31m-        set_encrypt_session $res $a;[m
[31m-        echo -n $res;[m
[31m-    }[m
[31m-[m
[31m-    location /decode {[m
[31m-        set_decrypt_session $b $args;[m
[31m-        echo "decrypted: $b";[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/encode")[m
[31m-            ngx.sleep(1.1)[m
[31m-            res = ngx.location.capture("/decode?" .. res.body)[m
[31m-            ngx.say(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like[m
[31m-decrypted: [m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/encrypted_session: session expired: \d+ <= \d+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: variable expires with if's (8d)[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location ~* '^/t/(\S+)' {[m
[31m-        set $duration $1;[m
[31m-        set $a 'abc';[m
[31m-        if ($duration = '16d') {[m
[31m-            encrypted_session_expires 16d;[m
[31m-        }[m
[31m-        if ($duration = '8d') {[m
[31m-            encrypted_session_expires 8d;[m
[31m-        }[m
[31m-        if ($duration = '1d') {[m
[31m-            encrypted_session_expires 1d;[m
[31m-        }[m
[31m-        set_encrypt_session $res $a;[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-        add_header "X-Foo" $ppres;[m
[31m-        return 204;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t/8d[m
[31m---- error_code: 204[m
[31m---- response_headers_like chop[m
[31m-X-Foo: [a-z0-9=]+$[m
[31m---- error_log[m
[31m-encrypted_session: expires=691200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: variable expires with if's (1d)[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location ~* '^/t/(\S+)' {[m
[31m-        set $duration $1;[m
[31m-        set $a 'abc';[m
[31m-        if ($duration = '16d') {[m
[31m-            encrypted_session_expires 16d;[m
[31m-        }[m
[31m-        if ($duration = '8d') {[m
[31m-            encrypted_session_expires 8d;[m
[31m-        }[m
[31m-        if ($duration = '1d') {[m
[31m-            encrypted_session_expires 1d;[m
[31m-        }[m
[31m-        set_encrypt_session $res $a;[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-        add_header "X-Foo" $ppres;[m
[31m-        return 204;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t/1d[m
[31m---- error_code: 204[m
[31m---- response_headers_like chop[m
[31m-X-Foo: [a-z0-9=]+$[m
[31m---- error_log[m
[31m-encrypted_session: expires=86400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: variable expires with if's (16d)[m
[31m---- config[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    encrypted_session_expires 0;[m
[31m-[m
[31m-    location ~* '^/t/(\S+)' {[m
[31m-        set $duration $1;[m
[31m-        set $a 'abc';[m
[31m-        if ($duration = '16d') {[m
[31m-            encrypted_session_expires 16d;[m
[31m-        }[m
[31m-        if ($duration = '8d') {[m
[31m-            encrypted_session_expires 8d;[m
[31m-        }[m
[31m-        if ($duration = '1d') {[m
[31m-            encrypted_session_expires 1d;[m
[31m-        }[m
[31m-        set_encrypt_session $res $a;[m
[31m-        set_encode_base32 $ppres $res;[m
[31m-        add_header "X-Foo" $ppres;[m
[31m-        return 204;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t/16d[m
[31m---- error_code: 204[m
[31m---- response_headers_like chop[m
[31m-X-Foo: [a-z0-9=]+$[m
[31m---- error_log[m
[31m-encrypted_session: expires=1382400[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 634b6a6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-version=$1[m
[31m-force=$2[m
[31m-[m
[31m-            #--with-cc=gcc46 \[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-            --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:/usr/local/lib" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root \[m
[31m-          --with-debug[m
[31m-          #--add-module=$home/work/ndk \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ed9132a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/encrypted-session-nginx-module-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_http_init_request[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:sendmsg[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_pass_open_channel[m
[31m-fun:ngx_start_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-epoll_ctl(event)[m
[31m-fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 59bdf6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-buildroot/[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-go[m
[31m-t/t.sh[m
[31m-t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/util.h[m
[31m-src/util.c[m
[31m-src/processor.h[m
[31m-src/processor.c[m
[31m-src/rds.h[m
[31m-src/utils.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-util/bench[m
[31m-pack[m
[31m-all[m
[31m-build1[0123][m
[31m-Makefile[m
[31m-*.plist[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/config[m
[1mdeleted file mode 100644[m
[1mindex 2c72815..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/config[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_form_input; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_form_input; please put it before ngx_form_input." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_form_input; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_form_input; please put it before ngx_form_input." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-HTTP_FORM_INPUT_SRCS="$ngx_addon_dir/src/ngx_http_form_input_module.c"[m
[31m-HTTP_FORM_INPUT_DEPS="$ngx_addon_dir/src/ddebug.h"[m
[31m-[m
[31m-ngx_addon_name=ngx_http_form_input_module[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HTTP_FORM_INPUT_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_FORM_INPUT_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_FORM_INPUT_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_FORM_INPUT_DEPS"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/src/ddebug.h[m
[1mdeleted file mode 100755[m
[1mindex 3b14190..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "form-input *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-[m
[31m-#       if defined(nginx_version) && nginx_version >= 8011[m
[31m-#           define dd_main_req_count r->main->count[m
[31m-#       else[m
[31m-#           define dd_main_req_count 0[m
[31m-#       endif[m
[31m-[m
[31m-static void dd_enter_helper(ngx_http_request_t *r, const char *func) {[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, ">enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            (int) dd_main_req_count, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static void dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/src/ngx_http_form_input_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/src/ngx_http_form_input_module.c[m
[1mdeleted file mode 100644[m
[1mindex 9aff693..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/src/ngx_http_form_input_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,523 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define form_urlencoded_type "application/x-www-form-urlencoded"[m
[31m-#define form_urlencoded_type_len (sizeof(form_urlencoded_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned        used;  /* :1 */[m
[31m-} ngx_http_form_input_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned          done:1;[m
[31m-    unsigned          waiting_more_body:1;[m
[31m-} ngx_http_form_input_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_form_input(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v);[m
[31m-static char *ngx_http_set_form_input_conf_handler(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_form_input_create_main_conf(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_form_input_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_form_input_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_form_input_post_read(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_form_input_arg(ngx_http_request_t *r, u_char *name,[m
[31m-    size_t len, ngx_str_t *value, ngx_flag_t multi);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_form_input_commands[] = {[m
[31m-[m
[31m-    { ngx_string("set_form_input"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_set_form_input_conf_handler,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("set_form_input_multi"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_set_form_input_conf_handler,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_form_input_module_ctx = {[m
[31m-    NULL,                                   /* preconfiguration */[m
[31m-    ngx_http_form_input_init,               /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_form_input_create_main_conf,   /* create main configuration */[m
[31m-    NULL,                                   /* init main configuration */[m
[31m-[m
[31m-    NULL,                                   /* create server configuration */[m
[31m-    NULL,                                   /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                   /* create location configuration */[m
[31m-    NULL                                    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_form_input_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_form_input_module_ctx,        /* module context */[m
[31m-    ngx_http_form_input_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                        /* module type */[m
[31m-    NULL,                                   /* init master */[m
[31m-    NULL,                                   /* init module */[m
[31m-    NULL,                                   /* init process */[m
[31m-    NULL,                                   /* init thread */[m
[31m-    NULL,                                   /* exit thread */[m
[31m-    NULL,                                   /* exit precess */[m
[31m-    NULL,                                   /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_form_input(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_form_input_ctx_t           *ctx;[m
[31m-    ngx_int_t                            rc;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    dd("set default return value");[m
[31m-    ngx_str_set(res, "");[m
[31m-[m
[31m-    if (r->done) {[m
[31m-        dd("request done");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_form_input_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        dd("ndk handler:null ctx");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->done) {[m
[31m-        dd("ctx not done");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_form_input_arg(r, v->data, v->len, res, 0);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_form_input_multi(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_http_form_input_ctx_t           *ctx;[m
[31m-    ngx_int_t                            rc;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    dd("set default return value");[m
[31m-    ngx_str_set(res, "");[m
[31m-[m
[31m-    /* dd("set default return value"); */[m
[31m-[m
[31m-    if (r->done) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_form_input_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        dd("ndk handler:null ctx");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->done) {[m
[31m-        dd("ctx not done");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_form_input_arg(r, v->data, v->len, res, 1);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* fork from ngx_http_arg.[m
[31m- * read argument(s) with name arg_name and length arg_len into value variable,[m
[31m- * if multi flag is set, multi arguments with name arg_name will be read and[m
[31m- * stored in an ngx_array_t struct, this can be operated by directives in[m
[31m- * array-var-nginx-module */[m
[31m-static ngx_int_t[m
[31m-ngx_http_form_input_arg(ngx_http_request_t *r, u_char *arg_name, size_t arg_len,[m
[31m-    ngx_str_t *value, ngx_flag_t multi)[m
[31m-{[m
[31m-    u_char              *p, *v, *last, *buf;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    size_t               len = 0;[m
[31m-    ngx_array_t         *array = NULL;[m
[31m-    ngx_str_t           *s;[m
[31m-    ngx_buf_t           *b;[m
[31m-[m
[31m-    if (multi) {[m
[31m-        array = ngx_array_create(r->pool, 1, sizeof(ngx_str_t));[m
[31m-        if (array == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        value->data = (u_char *)array;[m
[31m-        value->len = sizeof(ngx_array_t);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(value, "");[m
[31m-    }[m
[31m-[m
[31m-    /* we read data from r->request_body->bufs */[m
[31m-    if (r->request_body == NULL || r->request_body->bufs == NULL) {[m
[31m-        dd("empty rb or empty rb bufs");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body->bufs->next != NULL) {[m
[31m-        /* more than one buffer...we should copy the data out... */[m
[31m-        len = 0;[m
[31m-        for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (b->in_file) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "form-input: in-file buffer found. aborted. "[m
[31m-                              "consider increasing your "[m
[31m-                              "client_body_buffer_size setting");[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            len += b->last - b->pos;[m
[31m-        }[m
[31m-[m
[31m-        dd("len=%d", (int) len);[m
[31m-[m
[31m-        if (len == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        buf = ngx_palloc(r->pool, len);[m
[31m-        if (buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-        last = p + len;[m
[31m-[m
[31m-        for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-            p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);[m
[31m-        }[m
[31m-[m
[31m-        dd("p - buf = %d, last - buf = %d", (int) (p - buf),[m
[31m-           (int) (last - buf));[m
[31m-[m
[31m-        dd("copied buf (len %d): %.*s", (int) len, (int) len,[m
[31m-           buf);[m
[31m-[m
[31m-    } else {[m
[31m-        dd("XXX one buffer only");[m
[31m-[m
[31m-        b = r->request_body->bufs->buf;[m
[31m-        if (ngx_buf_size(b) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        buf = b->pos;[m
[31m-        last = b->last;[m
[31m-    }[m
[31m-[m
[31m-    for (p = buf; p < last; p++) {[m
[31m-        /* we need '=' after name, so drop one char from last */[m
[31m-[m
[31m-        p = ngx_strlcasestrn(p, last - 1, arg_name, arg_len - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        dd("found argument name, offset: %d", (int) (p - buf));[m
[31m-[m
[31m-        if ((p == buf || *(p - 1) == '&') && *(p + arg_len) == '=') {[m
[31m-            v = p + arg_len + 1;[m
[31m-            dd("v = %d...", (int) (v - buf));[m
[31m-[m
[31m-            dd("buf now (len %d): %.*s",[m
[31m-               (int) (last - v), (int) (last - v), v);[m
[31m-[m
[31m-            p = ngx_strlchr(v, last, '&');[m
[31m-            if (p == NULL) {[m
[31m-                dd("& not found, pointing it to last...");[m
[31m-                p = last;[m
[31m-[m
[31m-            } else {[m
[31m-                dd("found &, pointing it to %d...", (int) (p - buf));[m
[31m-            }[m
[31m-[m
[31m-            if (multi) {[m
[31m-                s = ngx_array_push(array);[m
[31m-                if (s == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                s->data = v;[m
[31m-                s->len = p - v;[m
[31m-                dd("array var:%.*s", (int) s->len, s->data);[m
[31m-[m
[31m-            } else {[m
[31m-                value->data = v;[m
[31m-                value->len = p - v;[m
[31m-                dd("value: [%.*s]", (int) value->len, value->data);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (multi) {[m
[31m-        value->data = (u_char *) array;[m
[31m-        value->len = sizeof(ngx_array_t);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_form_input_conf_handler(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                            filter;[m
[31m-    ngx_str_t                               *value, s;[m
[31m-    u_char                                  *p;[m
[31m-    ngx_http_form_input_main_conf_t         *fmcf;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8042 && nginx_version <= 8053[m
[31m-    return "does not work with " NGINX_VER;[m
[31m-#endif[m
[31m-[m
[31m-    fmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_form_input_module);[m
[31m-[m
[31m-    fmcf->used = 1;[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.size = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if ((value->len == sizeof("set_form_input_multi") - 1) &&[m
[31m-        ngx_strncmp(value->data, "set_form_input_multi", value->len) == 0)[m
[31m-    {[m
[31m-        dd("use ngx_http_form_input_multi");[m
[31m-        filter.func = (void *) ngx_http_set_form_input_multi;[m
[31m-[m
[31m-    } else {[m
[31m-        filter.func = (void *) ngx_http_set_form_input;[m
[31m-    }[m
[31m-[m
[31m-    value++;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        p = value->data;[m
[31m-        p++;[m
[31m-        s.len = value->len - 1;[m
[31m-        s.data = p;[m
[31m-[m
[31m-    } else if (cf->args->nelts == 3) {[m
[31m-        s.len = (value + 1)->len;[m
[31m-        s.data = (value + 1)->data;[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core (cf, value,  &s, &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* register a new rewrite phase handler */[m
[31m-static ngx_int_t[m
[31m-ngx_http_form_input_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-[m
[31m-    ngx_http_handler_pt             *h;[m
[31m-    ngx_http_core_main_conf_t       *cmcf;[m
[31m-    ngx_http_form_input_main_conf_t *fmcf;[m
[31m-[m
[31m-    fmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_form_input_module);[m
[31m-[m
[31m-    if (!fmcf->used) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_form_input_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* an rewrite phase handler */[m
[31m-static ngx_int_t[m
[31m-ngx_http_form_input_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_form_input_ctx_t       *ctx;[m
[31m-    ngx_str_t                        value;[m
[31m-    ngx_int_t                        rc;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http form_input rewrite phase handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_form_input_module);[m
[31m-[m
[31m-    if (ctx != NULL) {[m
[31m-        if (ctx->done) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http form_input rewrite phase handler done");[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (r->method != NGX_HTTP_POST && r->method != NGX_HTTP_PUT) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_type == NULL[m
[31m-        || r->headers_in.content_type->value.data == NULL)[m
[31m-    {[m
[31m-        dd("content_type is %p", r->headers_in.content_type);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    value = r->headers_in.content_type->value;[m
[31m-[m
[31m-    dd("r->headers_in.content_length_n:%d",[m
[31m-       (int) r->headers_in.content_length_n);[m
[31m-[m
[31m-    /* just focus on x-www-form-urlencoded */[m
[31m-[m
[31m-    if (value.len < form_urlencoded_type_len[m
[31m-        || ngx_strncasecmp(value.data, (u_char *) form_urlencoded_type,[m
[31m-                           form_urlencoded_type_len) != 0)[m
[31m-    {[m
[31m-        dd("not application/x-www-form-urlencoded");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    dd("content type is application/x-www-form-urlencoded");[m
[31m-[m
[31m-    dd("create new ctx");[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_form_input_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      ctx->done = 0;[m
[31m-     *      ctx->waiting_more_body = 0;[m
[31m-     */[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_form_input_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http form_input start to read client request body");[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_form_input_post_read);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-        r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ctx->waiting_more_body = 1;[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http form_input has read the request body in one run");[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_form_input_post_read(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_form_input_ctx_t     *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http form_input post read request body");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_form_input_module);[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    dd("count--");[m
[31m-    r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-    dd("waiting more body: %d", (int) ctx->waiting_more_body);[m
[31m-[m
[31m-    /* waiting_more_body my rewrite phase handler */[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        ctx->waiting_more_body = 0;[m
[31m-[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_form_input_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_form_input_main_conf_t    *fmcf;[m
[31m-[m
[31m-    fmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_form_input_main_conf_t));[m
[31m-    if (fmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      fmcf->used = 0;[m
[31m-     */[m
[31m-[m
[31m-    return fmcf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/base.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/base.t[m
[1mdeleted file mode 100755[m
[1mindex 38c0713..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/base.t[m
[1m+++ /dev/null[m
[36m@@ -1,260 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: blank body[m
[31m---- config[m
[31m-    location /bar1 {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar1[m
[31m-[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: key not found[m
[31m---- config[m
[31m-    location /bar2 {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar2[m
[31m-foo[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: key not found[m
[31m---- config[m
[31m-    location /bar3 {[m
[31m-        set_form_input $foo bar3;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar3[m
[31m-foo=[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: basic key=value[m
[31m---- config[m
[31m-    location /bar4 {[m
[31m-        set_form_input $foo foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar4[m
[31m-foo=bar[m
[31m---- response_body[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar5 {[m
[31m-        set_form_input $foo foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar5[m
[31m-&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar6 {[m
[31m-        set_form_input $foo foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar6[m
[31m-foo&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $foo foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-foo=&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&bar[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&bar&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: test for spliter '&' and '='[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&bar=[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: test for spliter '&' and '='[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&bar=foo[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: test for spliter '&'[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-&&[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: two keys[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar1 foo1;[m
[31m-        set_form_input $bar2 foo2;[m
[31m-        echo $bar1;[m
[31m-        echo $bar2;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar[m
[31m-foo1=bar1&foo2=bar2[m
[31m---- response_body[m
[31m-bar1[m
[31m-bar2[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: GET request[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-GET /bar[m
[31m-bar=foo[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: no content type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set_form_input $bar bar;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m-bar=I have no content type[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 0c3bfce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,177 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 3);[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: charset postfix[m
[31m---- config[m
[31m-    location /bar2 {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded; charset=UTF-8[m
[31m---- request[m
[31m-POST /bar2[m
[31m-bar=32[m
[31m---- response_body[m
[31m-32[m
[31m---- timeout: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test case sensitivity[m
[31m---- config[m
[31m-    location /bar2 {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-Form-UrlencodeD[m
[31m---- request[m
[31m-POST /bar2[m
[31m-bar=32[m
[31m---- response_body[m
[31m-32[m
[31m---- timeout: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: Internal server error when using array_map_op [calio/form-input-nginx-module GH-1][m
[31m-http://github.com/calio/form-input-nginx-module/issues#issue/1[m
[31m---- config[m
[31m-   location ~ ^/(\w+)/(\d+)/?$ {[m
[31m-       set_form_input    $columns;[m
[31m-       set_form_input    $values;[m
[31m-       array_split       ',' $values to=$array;[m
[31m-       array_map_op      set_quote_sql_str $array;[m
[31m-       array_join        ',' $array to=$sql_args;[m
[31m-[m
[31m-       echo $sql_args;[m
[31m-   }[m
[31m---- request[m
[31m-POST /users/1[m
[31m-columns=username,password&values=joe,secret[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- response_body[m
[31m-'joe','secret'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: 100-Continue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set_form_input $foo bar;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded; charset=UTF-8[m
[31m-Expect: 100-Continue[m
[31m---- request[m
[31m-POST /t[m
[31m-bar=32[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set_form_input_multi + missing Content-Type[m
[31m---- config[m
[31m-location /modtest {[m
[31m-        set_form_input_multi $val;[m
[31m-        echo $val;[m
[31m-}[m
[31m---- request[m
[31m-POST /modtest[m
[31m-val=foo&val=bar&val=baz[m
[31m---- response_body eval: "\n"[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad set_form_input + missing Content-Type[m
[31m---- config[m
[31m-location /modtest {[m
[31m-        set_form_input $val foo;[m
[31m-        echo $val;[m
[31m-}[m
[31m---- request[m
[31m-POST /modtest[m
[31m-val=foo&val=bar&val=baz[m
[31m---- response_body eval: "\n"[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: working with if and regex[m
[31m---- config[m
[31m-location /modtest {[m
[31m-        set_form_input $foo foo;[m
[31m-        if ($foo ~* ^ab+c$) {[m
[31m-            echo $foo;[m
[31m-        }[m
[31m-        echo $foo;[m
[31m-        echo done;[m
[31m-}[m
[31m---- request[m
[31m-POST /modtest[m
[31m-val=foo&val=bar&val=baz[m
[31m---- stap2[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("subj: %p\n", $subject);[m
[31m-    printf("len: %d\n", $length);[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- response_body eval: "\ndone\n"[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: content type is not application/x-www-form-urlencoded[m
[31m---- config[m
[31m-location /modtest {[m
[31m-        set_form_input $foo foo;[m
[31m-        if ($foo ~* ^ab+c$) {[m
[31m-            echo $foo;[m
[31m-        }[m
[31m-        echo $foo;[m
[31m-        echo done;[m
[31m-}[m
[31m---- request[m
[31m-POST /modtest[m
[31m-val=foo&val=bar&val=baz[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data[m
[31m---- response_body eval: "\ndone\n"[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex 52d68b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket skip_all => 'not working at all';[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: blank body[m
[31m---- config[m
[31m-    location /bar1 {[m
[31m-        eval_subrequest_in_memory off;[m
[31m-        eval_override_content_type text/plain;[m
[31m-        eval $res {[m
[31m-            default_type text/plain;[m
[31m-            set_form_input $foo bar;[m
[31m-            echo $foo;[m
[31m-        }[m
[31m-        echo [$res];[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar1[m
[31m-bar=3[m
[31m---- response_body[m
[31m-[3][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/multi.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/multi.t[m
[1mdeleted file mode 100644[m
[1mindex 8e0b22a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/multi.t[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-name=calio&somethins&name=agentzh[m
[31m---- response_body[m
[31m-calio agentzh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: combined[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input $foo name;[m
[31m-        set_form_input_multi $bar name;[m
[31m-        array_join ' ' $bar;[m
[31m-        echo $foo;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-name=calio&something&name=agentzh&name=guoying&name=nobody&name=somebody[m
[31m---- response_body[m
[31m-calio[m
[31m-calio agentzh guoying nobody somebody[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: blank body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not fit[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-a=b&c=d&e=f&g=h&i=j&k=l[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: not fit 2[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-somename&name1=calio&sirname=calio[m
[31m---- response_body eval[m
[31m-"\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: single value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $foo name;[m
[31m-        array_join ' ' $foo;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-some=some&name=calio&any=any[m
[31m---- response_body[m
[31m-calio[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: inplace[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input_multi $name;[m
[31m-        array_join ' ' $name;[m
[31m-        echo $name;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-name=calio&name=agentzh[m
[31m---- response_body[m
[31m-calio agentzh[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/put.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/put.t[m
[1mdeleted file mode 100644[m
[1mindex e294aa4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/put.t[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;# skip_all => 'not working now';[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input $foo name;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /foo[m
[31m-name=calio[m
[31m---- response_body[m
[31m-calio[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set_form_input $foo name;[m
[31m-        set_form_input_multi $bar name;[m
[31m-        array_join ' ' $bar;[m
[31m-        echo $foo;[m
[31m-        echo $bar;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-PUT /foo[m
[31m-name=calio&name=agentzh[m
[31m---- response_body[m
[31m-calio[m
[31m-calio agentzh[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/upload.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/upload.t[m
[1mdeleted file mode 100644[m
[1mindex e14ccf7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/t/upload.t[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-# vi:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: big upload[m
[31m---- config[m
[31m-    location /bar1 {[m
[31m-        client_max_body_size 1m;[m
[31m-        client_body_buffer_size  1m;[m
[31m-        set_form_input $data;[m
[31m-        set_unescape_uri $data;[m
[31m-        echo $data;[m
[31m-        #echo_read_request_body;[m
[31m-        #echo_request_body;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /bar1[m
[31m-file=abc.csv&data=asdfaaa你sfsd在你脞办夺要你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好[m
[31m---- response_body[m
[31m-asdfaaa你sfsd在你脞办夺要你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 0dd9623..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-home=~[m
[31m-[m
[31m-version=$1[m
[31m-force=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-  --with-cc-opt="-O0" \[m
[31m-    --without-mail_pop3_module \[m
[31m-    --without-mail_imap_module \[m
[31m-    --without-mail_smtp_module \[m
[31m-    --without-http_upstream_ip_hash_module \[m
[31m-    --without-http_empty_gif_module \[m
[31m-    --without-http_memcached_module \[m
[31m-    --without-http_referer_module \[m
[31m-    --without-http_autoindex_module \[m
[31m-    --without-http_auth_basic_module \[m
[31m-    --without-http_userid_module \[m
[31m-  --add-module=$root/../echo-nginx-module \[m
[31m-  --add-module=$root/../ndk-nginx-module \[m
[31m-  --add-module=$root $opts \[m
[31m-  --add-module=$root/../set-misc-nginx-module \[m
[31m-  --add-module=$root/../array-var-nginx-module \[m
[31m-  --with-debug[m
[31m-  #--add-module=$home/work/ndk \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 724034e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/form-input-nginx-module-0.12/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-{[m
[31m-   epoll_ctl[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 39c82fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-reindex[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[78][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-genmobi.sh[m
[31m-*.mobi[m
[31m-misc/chunked[m
[31m-src/headers.c[m
[31m-src/headers.h[m
[31m-src/module.c[m
[31m-src/module.h[m
[31m-src/util.c[m
[31m-src/util.h[m
[31m-go[m
[31m-ctags[m
[31m-src/in.c[m
[31m-src/in.h[m
[31m-src/out.c[m
[31m-src/out.h[m
[31m-build[89][m
[31m-build1[0-9][m
[31m-buildroot/[m
[31m-work/[m
[31m-all[m
[31m-t/servroot[m
[31m-analyze[m
[31m-cov[m
[31m-nginx[m
[31m-*.plist[m
[31m-a.patch[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 700a50f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - LUAJIT_LIB=/usr/lib64/libluajit-5.1.so[m
[31m-    - LUAJIT_INC=/usr/include/luajit-2.0[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-    - NGINX_VERSION=1.8.1[m
[31m-[m
[31m-before_install:[m
[31m-  - sudo apt-get install -qq -y cpanminus libluajit-5.1-dev[m
[31m-  - sudo cpanm -v --notest Test::Nginx > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-[m
[31m-install:[m
[31m-  - wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && tar -xzf nginx-${NGINX_VERSION}.tar.gz[m
[31m-  - git clone https://github.com/openresty/echo-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/lua-nginx-module.git[m
[31m-  - git clone https://github.com/openresty/nginx-eval-module.git[m
[31m-[m
[31m-script:[m
[31m-  - cd nginx-${NGINX_VERSION}/[m
[31m-  -  ./configure --with-debug --with-pcre --with-pcre-jit --with-http_dav_module --add-module=../nginx-eval-module --add-module=../lua-nginx-module --add-module=../echo-nginx-module --add-module=.. > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j2 > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - export PATH=$PATH:`pwd`/objs[m
[31m-  - cd ..[m
[31m-  - prove -lv t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/config[m
[1mdeleted file mode 100644[m
[1mindex 5707cc4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/config[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_headers_more_filter_module[m
[31m-[m
[31m-HEADERS_MORE_SRCS="                                                         \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_filter_module.c    \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_out.c      \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_in.c       \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_util.c             \[m
[31m-                "[m
[31m-[m
[31m-HEADERS_MORE_DEPS="                                                         \[m
[31m-                $ngx_addon_dir/src/ddebug.h                                 \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_filter_module.h    \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_in.h       \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_out.h      \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_headers_in.h       \[m
[31m-                $ngx_addon_dir/src/ngx_http_headers_more_util.h             \[m
[31m-                "[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HEADERS_MORE_DEPS"[m
[31m-    ngx_module_srcs="$HEADERS_MORE_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HEADERS_MORE_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HEADERS_MORE_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 13879af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,124 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "headers-more *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-#       if defined(nginx_version) && nginx_version >= 8011[m
[31m-#           define dd_main_req_count r->main->count[m
[31m-#       else[m
[31m-#           define dd_main_req_count 0[m
[31m-#       endif[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd_enter_helper(ngx_http_request_t *r, const char *func)[m
[31m-{[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, "headers-more *** enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            (int) dd_main_req_count, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 0bb6fec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,348 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_filter_module.h"[m
[31m-#include "ngx_http_headers_more_headers_out.h"[m
[31m-#include "ngx_http_headers_more_headers_in.h"[m
[31m-#include "ngx_http_headers_more_util.h"[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-/* config handlers */[m
[31m-[m
[31m-static void *ngx_http_headers_more_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_headers_more_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static void *ngx_http_headers_more_create_main_conf(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_headers_more_post_config(ngx_conf_t *cf);[m
[31m-[m
[31m-/* post-read-phase handler */[m
[31m-[m
[31m-static ngx_int_t ngx_http_headers_more_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-/* filter handlers */[m
[31m-[m
[31m-static ngx_int_t ngx_http_headers_more_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-ngx_uint_t  ngx_http_headers_more_location_hash = 0;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_headers_more_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("more_set_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_1MORE,[m
[31m-      ngx_http_headers_more_set_headers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-    { ngx_string("more_clear_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_1MORE,[m
[31m-      ngx_http_headers_more_clear_headers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-    { ngx_string("more_set_input_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_1MORE,[m
[31m-      ngx_http_headers_more_set_input_headers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-    { ngx_string("more_clear_input_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_1MORE,[m
[31m-      ngx_http_headers_more_clear_input_headers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_headers_more_filter_module_ctx = {[m
[31m-    NULL,                                   /* preconfiguration */[m
[31m-    ngx_http_headers_more_post_config,      /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_headers_more_create_main_conf, /* create main configuration */[m
[31m-    NULL,                                   /* init main configuration */[m
[31m-[m
[31m-    NULL,                                   /* create server configuration */[m
[31m-    NULL,                                   /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_headers_more_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_http_headers_more_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_headers_more_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_headers_more_filter_module_ctx,   /* module context */[m
[31m-    ngx_http_headers_more_filter_commands,      /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_headers_more_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_http_headers_more_loc_conf_t    *conf;[m
[31m-    ngx_http_headers_more_cmd_t         *cmd;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "headers more header filter, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    if (conf->cmds) {[m
[31m-        cmd = conf->cmds->elts;[m
[31m-        for (i = 0; i < conf->cmds->nelts; i++) {[m
[31m-            if (cmd[i].is_input) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_headers_more_exec_cmd(r, &cmd[i]);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_headers_more_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_headers_more_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_headers_more_loc_conf_t    *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_headers_more_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->cmds = NULL;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_more_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_uint_t                           orig_len;[m
[31m-    ngx_http_headers_more_cmd_t         *prev_cmd, *cmd;[m
[31m-    ngx_http_headers_more_loc_conf_t    *prev = parent;[m
[31m-    ngx_http_headers_more_loc_conf_t    *conf = child;[m
[31m-[m
[31m-    if (conf->cmds == NULL || conf->cmds->nelts == 0) {[m
[31m-        conf->cmds = prev->cmds;[m
[31m-[m
[31m-    } else if (prev->cmds && prev->cmds->nelts) {[m
[31m-        orig_len = conf->cmds->nelts;[m
[31m-[m
[31m-        (void) ngx_array_push_n(conf->cmds, prev->cmds->nelts);[m
[31m-[m
[31m-        cmd = conf->cmds->elts;[m
[31m-[m
[31m-        for (i = 0; i < orig_len; i++) {[m
[31m-            cmd[conf->cmds->nelts - 1 - i] = cmd[orig_len - 1 - i];[m
[31m-        }[m
[31m-[m
[31m-        prev_cmd = prev->cmds->elts;[m
[31m-[m
[31m-        for (i = 0; i < prev->cmds->nelts; i++) {[m
[31m-            cmd[i] = prev_cmd[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_post_config(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                              multi_http_blocks;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_handler_pt             *h;[m
[31m-    ngx_http_core_main_conf_t       *cmcf;[m
[31m-[m
[31m-    ngx_http_headers_more_main_conf_t       *hmcf;[m
[31m-[m
[31m-    ngx_http_headers_more_location_hash =[m
[31m-                               ngx_http_headers_more_hash_literal("location");[m
[31m-[m
[31m-    hmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                         ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    if (ngx_http_headers_more_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_headers_more_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || hmcf->requires_filter) {[m
[31m-        rc = ngx_http_headers_more_filter_init(cf);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!hmcf->requires_handler) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_headers_more_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_http_headers_more_loc_conf_t    *conf;[m
[31m-    ngx_http_headers_more_main_conf_t   *hmcf;[m
[31m-    ngx_http_headers_more_cmd_t         *cmd;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "headers more rewrite handler, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    hmcf = ngx_http_get_module_main_conf(r,[m
[31m-                                         ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    if (!hmcf->postponed_to_phase_end) {[m
[31m-        ngx_http_core_main_conf_t       *cmcf;[m
[31m-        ngx_http_phase_handler_t         tmp;[m
[31m-        ngx_http_phase_handler_t        *ph;[m
[31m-        ngx_http_phase_handler_t        *cur_ph;[m
[31m-        ngx_http_phase_handler_t        *last_ph;[m
[31m-[m
[31m-        hmcf->postponed_to_phase_end = 1;[m
[31m-[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ph = cmcf->phase_engine.handlers;[m
[31m-        cur_ph = &ph[r->phase_handler];[m
[31m-        last_ph = &ph[cur_ph->next - 1];[m
[31m-[m
[31m-        if (cur_ph < last_ph) {[m
[31m-            dd("swaping the contents of cur_ph and last_ph...");[m
[31m-[m
[31m-            tmp = *cur_ph;[m
[31m-[m
[31m-            memmove(cur_ph, cur_ph + 1,[m
[31m-                    (last_ph - cur_ph) * sizeof (ngx_http_phase_handler_t));[m
[31m-[m
[31m-            *last_ph = tmp;[m
[31m-[m
[31m-            r->phase_handler--; /* redo the current ph */[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("running phase handler...");[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    if (conf->cmds) {[m
[31m-        if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        cmd = conf->cmds->elts;[m
[31m-        for (i = 0; i < conf->cmds->nelts; i++) {[m
[31m-            if (!cmd[i].is_input) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_headers_more_exec_input_cmd(r, &cmd[i]);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_headers_more_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_headers_more_main_conf_t    *hmcf;[m
[31m-[m
[31m-    hmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_headers_more_main_conf_t));[m
[31m-    if (hmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      hmcf->postponed_to_phase_end = 0;[m
[31m-     *      hmcf->requires_filter        = 0;[m
[31m-     *      hmcf->requires_handler       = 0;[m
[31m-     */[m
[31m-[m
[31m-    return hmcf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.h[m
[1mdeleted file mode 100644[m
[1mindex 72a5317..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_filter_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,80 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_HEADERS_MORE_FILTER_MODULE_H[m
[31m-#define NGX_HTTP_HEADERS_MORE_FILTER_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <assert.h>[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_headers_more_opcode_set,[m
[31m-    ngx_http_headers_more_opcode_clear[m
[31m-} ngx_http_headers_more_opcode_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                       *types; /* of ngx_str_t */[m
[31m-    ngx_array_t                       *statuses; /* of ngx_uint_t */[m
[31m-    ngx_array_t                       *headers; /* of ngx_http_header_val_t */[m
[31m-    ngx_flag_t                         is_input;[m
[31m-} ngx_http_headers_more_cmd_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t             *cmds; /* of ngx_http_headers_more_cmd_t */[m
[31m-} ngx_http_headers_more_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t              postponed_to_phase_end;[m
[31m-    ngx_int_t              requires_filter;[m
[31m-    ngx_int_t              requires_handler;[m
[31m-} ngx_http_headers_more_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_headers_more_header_val_s[m
[31m-    ngx_http_headers_more_header_val_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_headers_more_set_header_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                               name;[m
[31m-    ngx_uint_t                              offset;[m
[31m-    ngx_http_headers_more_set_header_pt     handler;[m
[31m-} ngx_http_headers_more_set_header_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_headers_more_header_val_s {[m
[31m-    ngx_http_complex_value_t                value;[m
[31m-    ngx_uint_t                              hash;[m
[31m-    ngx_str_t                               key;[m
[31m-    ngx_http_headers_more_set_header_pt     handler;[m
[31m-    ngx_uint_t                              offset;[m
[31m-    ngx_flag_t                              replace;[m
[31m-    ngx_flag_t                              wildcard;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_headers_more_filter_module;[m
[31m-[m
[31m-[m
[31m-#ifndef ngx_str_set[m
[31m-#define ngx_str_set(str, text)                                               \[m
[31m-        (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_http_headers_more_assert(a)  assert(a)[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_HEADERS_MORE_FILTER_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.c[m
[1mdeleted file mode 100644[m
[1mindex 2d5c873..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.c[m
[1m+++ /dev/null[m
[36m@@ -1,872 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_headers_in.h"[m
[31m-#include "ngx_http_headers_more_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_headers_more_parse_directive(ngx_conf_t *cf,[m
[31m-    ngx_command_t *ngx_cmd, void *conf,[m
[31m-    ngx_http_headers_more_opcode_t opcode);[m
[31m-static int ngx_http_headers_more_check_type(ngx_http_request_t *r,[m
[31m-    ngx_array_t *types);[m
[31m-static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header);[m
[31m-static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_user_agent_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_host_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_connection_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_headers_more_validate_host(ngx_str_t *host,[m
[31m-    ngx_pool_t *pool, ngx_uint_t alloc);[m
[31m-[m
[31m-[m
[31m-static ngx_http_headers_more_set_header_t ngx_http_headers_more_set_handlers[][m
[31m-        = {[m
[31m-[m
[31m-    { ngx_string("Host"),[m
[31m-                 offsetof(ngx_http_headers_in_t, host),[m
[31m-                 ngx_http_set_host_header },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 offsetof(ngx_http_headers_in_t, connection),[m
[31m-                 ngx_http_set_connection_header },[m
[31m-[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_modified_since),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 9002[m
[31m-    { ngx_string("If-Unmodified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_unmodified_since),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003003[m
[31m-    { ngx_string("If-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_match),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("If-None-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_none_match),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("User-Agent"),[m
[31m-                 offsetof(ngx_http_headers_in_t, user_agent),[m
[31m-                 ngx_http_set_user_agent_header },[m
[31m-[m
[31m-    { ngx_string("Referer"),[m
[31m-                 offsetof(ngx_http_headers_in_t, referer),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_length),[m
[31m-                 ngx_http_set_content_length_header },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_type),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("If-Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, transfer_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Expect"),[m
[31m-                 offsetof(ngx_http_headers_in_t, expect),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003013[m
[31m-    { ngx_string("Upgrade"),[m
[31m-                 offsetof(ngx_http_headers_in_t, upgrade),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Accept-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Via"), offsetof(ngx_http_headers_in_t, via),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Authorization"),[m
[31m-                 offsetof(ngx_http_headers_in_t, authorization),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 offsetof(ngx_http_headers_in_t, keep_alive),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("X-Forwarded-For"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_forwarded_for),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    { ngx_string("X-Real-IP"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_real_ip),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    { ngx_string("Depth"), offsetof(ngx_http_headers_in_t, depth),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Overwrite"), offsetof(ngx_http_headers_in_t, overwrite),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Cookie"),[m
[31m-                 offsetof(ngx_http_headers_in_t, cookies),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, ngx_http_set_header }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_exec_input_cmd(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_cmd_t *cmd)[m
[31m-{[m
[31m-    ngx_str_t                                    value;[m
[31m-    ngx_http_headers_more_header_val_t          *h;[m
[31m-    ngx_uint_t                                   i;[m
[31m-[m
[31m-    if (!cmd->headers) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->types && !ngx_http_headers_more_check_type(r, cmd->types)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h = cmd->headers->elts;[m
[31m-    for (i = 0; i < cmd->headers->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value.len) {[m
[31m-            value.len--;  /* remove the trailing '\0' added by[m
[31m-                             ngx_http_headers_more_parse_header */[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].handler(r, &h[i], &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h, *matched;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_uint_t                   rc;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    matched = NULL;[m
[31m-[m
[31m-retry:[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-        dd("i: %d, part: %p", (int) i, part);[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].key.len == hv->key.len[m
[31m-            && ngx_strncasecmp(h[i].key.data, hv->key.data,[m
[31m-                               h[i].key.len) == 0)[m
[31m-        {[m
[31m-            if (value->len == 0 || (matched && matched != &h[i])) {[m
[31m-                h[i].hash = 0;[m
[31m-[m
[31m-                rc = ngx_http_headers_more_rm_header_helper([m
[31m-                                            &r->headers_in.headers, part, i);[m
[31m-[m
[31m-                ngx_http_headers_more_assert([m
[31m-                    !(r->headers_in.headers.part.next == NULL[m
[31m-                      && r->headers_in.headers.last[m
[31m-                         != &r->headers_in.headers.part));[m
[31m-[m
[31m-                if (rc == NGX_OK) {[m
[31m-                    if (output_header) {[m
[31m-                        *output_header = NULL;[m
[31m-                    }[m
[31m-[m
[31m-                    goto retry;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h[i].value = *value;[m
[31m-[m
[31m-            if (output_header) {[m
[31m-                *output_header = &h[i];[m
[31m-                dd("setting existing builtin input header");[m
[31m-            }[m
[31m-[m
[31m-            if (matched == NULL) {[m
[31m-                matched = &h[i];[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (matched) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0 || hv->replace) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("created new header for %.*s", (int) hv->key.len, hv->key.data);[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        h->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    if (output_header) {[m
[31m-        *output_header = h;[m
[31m-[m
[31m-        while (r != r->main) {[m
[31m-            r->parent->headers_in = r->headers_in;[m
[31m-            r = r->parent;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h, **old;[m
[31m-[m
[31m-    dd("entered set_builtin_header (input)");[m
[31m-[m
[31m-    if (hv->offset) {[m
[31m-        old = (ngx_table_elt_t **) ((char *) &r->headers_in + hv->offset);[m
[31m-[m
[31m-    } else {[m
[31m-        old = NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("old builtin ptr ptr: %p", old);[m
[31m-    if (old) {[m
[31m-        dd("old builtin ptr: %p", *old);[m
[31m-    }[m
[31m-[m
[31m-    if (old == NULL || *old == NULL) {[m
[31m-        dd("set normal header");[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old);[m
[31m-    }[m
[31m-[m
[31m-    h = *old;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-        h->value = *value;[m
[31m-[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old);[m
[31m-    }[m
[31m-[m
[31m-    h->hash = hv->hash;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_host_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_str_t host;[m
[31m-[m
[31m-    if (value->len) {[m
[31m-        host= *value;[m
[31m-[m
[31m-        if (ngx_http_headers_more_validate_host(&host, r->pool, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.server = host;[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_in.server = *value;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    off_t           len;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_content_length_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_atosz(value->data, value->len);[m
[31m-    if (len == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("reset headers_in.content_length_n to %d", (int) len);[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_in.content_length_n = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    value->len = 0;[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_headers_more_set_input_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_headers_more_parse_directive(cf, cmd, conf,[m
[31m-                                         ngx_http_headers_more_opcode_set);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_headers_more_clear_input_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_headers_more_parse_directive(cf, cmd, conf,[m
[31m-                                        ngx_http_headers_more_opcode_clear);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_headers_more_check_type(ngx_http_request_t *r, ngx_array_t *types)[m
[31m-{[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_str_t           *t;[m
[31m-    ngx_str_t            actual_type;[m
[31m-[m
[31m-    if (r->headers_in.content_type == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    actual_type = r->headers_in.content_type->value;[m
[31m-    if (actual_type.len == 0) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("headers_in->content_type: %.*s",[m
[31m-       (int) actual_type.len,[m
[31m-       actual_type.data);[m
[31m-[m
[31m-    t = types->elts;[m
[31m-    for (i = 0; i < types->nelts; i++) {[m
[31m-        dd("...comparing with type [%.*s]", (int) t[i].len, t[i].data);[m
[31m-[m
[31m-        if (actual_type.len == t[i].len[m
[31m-            && ngx_strncmp(actual_type.data, t[i].data, t[i].len) == 0)[m
[31m-        {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_more_parse_directive(ngx_conf_t *cf, ngx_command_t *ngx_cmd,[m
[31m-    void *conf, ngx_http_headers_more_opcode_t opcode)[m
[31m-{[m
[31m-    ngx_http_headers_more_loc_conf_t   *hlcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                          i;[m
[31m-    ngx_http_headers_more_cmd_t        *cmd;[m
[31m-    ngx_str_t                          *arg;[m
[31m-    ngx_flag_t                          ignore_next_arg;[m
[31m-    ngx_str_t                          *cmd_name;[m
[31m-    ngx_int_t                           rc;[m
[31m-    ngx_flag_t                          replace = 0;[m
[31m-    ngx_http_headers_more_header_val_t *h;[m
[31m-[m
[31m-    ngx_http_headers_more_main_conf_t  *hmcf;[m
[31m-[m
[31m-    if (hlcf->cmds == NULL) {[m
[31m-        hlcf->cmds = ngx_array_create(cf->pool, 1,[m
[31m-                                      sizeof(ngx_http_headers_more_cmd_t));[m
[31m-[m
[31m-        if (hlcf->cmds == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cmd = ngx_array_push(hlcf->cmds);[m
[31m-[m
[31m-    if (cmd == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->headers = ngx_array_create(cf->pool, 1,[m
[31m-                                    sizeof(ngx_http_headers_more_header_val_t));[m
[31m-[m
[31m-    if (cmd->headers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->types = ngx_array_create(cf->pool, 1, sizeof(ngx_str_t));[m
[31m-    if (cmd->types == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->statuses = NULL;[m
[31m-[m
[31m-    arg = cf->args->elts;[m
[31m-[m
[31m-    cmd_name = &arg[0];[m
[31m-[m
[31m-    ignore_next_arg = 0;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (ignore_next_arg) {[m
[31m-            ignore_next_arg = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].data[0] != '-') {[m
[31m-            rc = ngx_http_headers_more_parse_header(cf, cmd_name,[m
[31m-                                                    &arg[i], cmd->headers,[m
[31m-                                                    opcode,[m
[31m-                                        ngx_http_headers_more_set_handlers);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].len == 2) {[m
[31m-            if (arg[i].data[1] == 't') {[m
[31m-                if (i == cf->args->nelts - 1) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                                  "%V: option -t takes an argument.",[m
[31m-                                  cmd_name);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rc = ngx_http_headers_more_parse_types(cf->log, cmd_name,[m
[31m-                                                       &arg[i + 1],[m
[31m-                                                       cmd->types);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ignore_next_arg = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (arg[i].data[1] == 'r') {[m
[31m-                dd("Found replace flag");[m
[31m-                replace = 1;[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "%V: invalid option name: \"%V\"", cmd_name, &arg[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("Found %d types, and %d headers",[m
[31m-       (int) cmd->types->nelts,[m
[31m-       (int) cmd->headers->nelts);[m
[31m-[m
[31m-    if (cmd->headers->nelts == 0) {[m
[31m-        ngx_pfree(cf->pool, cmd->headers);[m
[31m-        cmd->headers = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        h = cmd->headers->elts;[m
[31m-        for (i = 0; i < cmd->headers->nelts; i++) {[m
[31m-            h[i].replace = replace;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->types->nelts == 0) {[m
[31m-        ngx_pfree(cf->pool, cmd->types);[m
[31m-        cmd->types = NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmd->is_input = 1;[m
[31m-[m
[31m-    hmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                         ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    hmcf->requires_handler = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* borrowed the code from ngx_http_request.c:ngx_http_process_user_agent */[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_user_agent_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    u_char  *user_agent, *msie;[m
[31m-[m
[31m-    /* clear existing settings */[m
[31m-[m
[31m-    r->headers_in.msie = 0;[m
[31m-    r->headers_in.msie6 = 0;[m
[31m-    r->headers_in.opera = 0;[m
[31m-    r->headers_in.gecko = 0;[m
[31m-    r->headers_in.chrome = 0;[m
[31m-    r->headers_in.safari = 0;[m
[31m-    r->headers_in.konqueror = 0;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_set_builtin_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    /* check some widespread browsers */[m
[31m-[m
[31m-    user_agent = value->data;[m
[31m-[m
[31m-    msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1);[m
[31m-[m
[31m-    if (msie && msie + 7 < user_agent + value->len) {[m
[31m-[m
[31m-        r->headers_in.msie = 1;[m
[31m-[m
[31m-        if (msie[6] == '.') {[m
[31m-[m
[31m-            switch (msie[5]) {[m
[31m-            case '4':[m
[31m-            case '5':[m
[31m-                r->headers_in.msie6 = 1;[m
[31m-                break;[m
[31m-            case '6':[m
[31m-                if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) {[m
[31m-                    r->headers_in.msie6 = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstrn(user_agent, "Opera", 5 - 1)) {[m
[31m-        r->headers_in.opera = 1;[m
[31m-        r->headers_in.msie = 0;[m
[31m-        r->headers_in.msie6 = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->headers_in.msie && !r->headers_in.opera) {[m
[31m-[m
[31m-        if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {[m
[31m-            r->headers_in.gecko = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {[m
[31m-            r->headers_in.chrome = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)[m
[31m-                   && ngx_strstrn(user_agent, "Mac OS X", 8 - 1))[m
[31m-        {[m
[31m-            r->headers_in.safari = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {[m
[31m-            r->headers_in.konqueror = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_connection_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_in.connection_type = 0;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_set_builtin_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcasestrn(value->data, "close", 5 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-        r->headers_in.keep_alive_n = -1;[m
[31m-[m
[31m-    } else if (ngx_strcasestrn(value->data, "keep-alive", 10 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_array_t       *headers;[m
[31m-    ngx_table_elt_t  **v, *h;[m
[31m-[m
[31m-    headers = (ngx_array_t *) ((char *) &r->headers_in + hv->offset);[m
[31m-[m
[31m-    if (headers->nelts > 0) {[m
[31m-        ngx_array_destroy(headers);[m
[31m-[m
[31m-        if (ngx_array_init(headers, r->pool, 2,[m
[31m-                           sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("clear multi-value headers: %d", (int) headers->nelts);[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (headers->nalloc == 0) {[m
[31m-        if (ngx_array_init(headers, r->pool, 2,[m
[31m-                           sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    h = NULL;[m
[31m-    if (ngx_http_set_header_helper(r, hv, value, &h) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("new cookie header: %p", h);[m
[31m-[m
[31m-    v = ngx_array_push(headers);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *v = h;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_more_validate_host(ngx_str_t *host, ngx_pool_t *pool,[m
[31m-    ngx_uint_t alloc)[m
[31m-{[m
[31m-    u_char  *h, ch;[m
[31m-    size_t   i, dot_pos, host_len;[m
[31m-[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_literal,[m
[31m-        sw_rest[m
[31m-    } state;[m
[31m-[m
[31m-    dot_pos = host->len;[m
[31m-    host_len = host->len;[m
[31m-[m
[31m-    h = host->data;[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-[m
[31m-    for (i = 0; i < host->len; i++) {[m
[31m-        ch = h[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '.':[m
[31m-            if (dot_pos == i - 1) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-            dot_pos = i;[m
[31m-            break;[m
[31m-[m
[31m-        case ':':[m
[31m-            if (state == sw_usual) {[m
[31m-                host_len = i;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '[':[m
[31m-            if (i == 0) {[m
[31m-                state = sw_literal;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ']':[m
[31m-            if (state == sw_literal) {[m
[31m-                host_len = i + 1;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '\0':[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            if (ngx_path_separator(ch)) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                alloc = 1;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dot_pos == host_len - 1) {[m
[31m-        host_len--;[m
[31m-    }[m
[31m-[m
[31m-    if (host_len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc) {[m
[31m-        host->data = ngx_pnalloc(pool, host_len);[m
[31m-        if (host->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_strlow(host->data, h, host_len);[m
[31m-    }[m
[31m-[m
[31m-    host->len = host_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.h[m
[1mdeleted file mode 100644[m
[1mindex d2251da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_in.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_HEADERS_MORE_INPUT_HEADERS_H[m
[31m-#define NGX_HTTP_HEADERS_MORE_INPUT_HEADERS_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_filter_module.h"[m
[31m-[m
[31m-[m
[31m-/* output header setters and clearers */[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_exec_input_cmd(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_cmd_t *cmd);[m
[31m-[m
[31m-char *ngx_http_headers_more_set_input_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-char *ngx_http_headers_more_clear_input_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_HEADERS_MORE_INPUT_HEADERS_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.c[m
[1mdeleted file mode 100644[m
[1mindex 0f9bc87..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.c[m
[1m+++ /dev/null[m
[36m@@ -1,716 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_headers_out.h"[m
[31m-#include "ngx_http_headers_more_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_more_parse_directive(ngx_conf_t *cf, ngx_command_t *ngx_cmd,[m
[31m-        void *conf, ngx_http_headers_more_opcode_t opcode);[m
[31m-static ngx_flag_t ngx_http_headers_more_check_type(ngx_http_request_t *r,[m
[31m-        ngx_array_t *types);[m
[31m-static ngx_flag_t ngx_http_headers_more_check_status(ngx_http_request_t *r,[m
[31m-        ngx_array_t *statuses);[m
[31m-static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header, ngx_flag_t no_create);[m
[31m-static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_accept_ranges_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_type_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-static ngx_http_headers_more_set_header_t ngx_http_headers_more_set_handlers[][m
[31m-    = {[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 offsetof(ngx_http_headers_out_t, server),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 offsetof(ngx_http_headers_out_t, date),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 offsetof(ngx_http_headers_out_t, location),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 offsetof(ngx_http_headers_out_t, refresh),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Range"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges),[m
[31m-                 ngx_http_set_accept_ranges_header },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 offsetof(ngx_http_headers_out_t, www_authenticate),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 offsetof(ngx_http_headers_out_t, expires),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("E-Tag"),[m
[31m-                 offsetof(ngx_http_headers_out_t, etag),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_length),[m
[31m-                 ngx_http_set_content_length_header },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 0,[m
[31m-                 ngx_http_set_content_type_header },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, ngx_http_set_header }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_exec_cmd(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_cmd_t *cmd)[m
[31m-{[m
[31m-    ngx_str_t                                   value;[m
[31m-    ngx_http_headers_more_header_val_t         *h;[m
[31m-    ngx_uint_t                                  i;[m
[31m-[m
[31m-    if (!cmd->headers) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->types && !ngx_http_headers_more_check_type(r, cmd->types)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->statuses[m
[31m-        && !ngx_http_headers_more_check_status(r, cmd->statuses))[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h = cmd->headers->elts;[m
[31m-    for (i = 0; i < cmd->headers->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value.len) {[m
[31m-            value.len--;  /* remove the trailing '\0' added by[m
[31m-                             ngx_http_headers_more_parse_header */[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].handler(r, &h[i], &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header, ngx_flag_t no_create)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_flag_t                   matched = 0;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        /* XXX ngx_http_core_find_config_phase, for example,[m
[31m-         * may not initialize the "key" and "hash" fields[m
[31m-         * for a nasty optimization purpose, and[m
[31m-         * we have to work-around it here */[m
[31m-[m
[31m-        r->headers_out.location->hash = ngx_http_headers_more_location_hash;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (!hv->wildcard[m
[31m-            && h[i].key.len == hv->key.len[m
[31m-            && ngx_strncasecmp(h[i].key.data, hv->key.data,[m
[31m-                               h[i].key.len) == 0)[m
[31m-        {[m
[31m-            goto matched;[m
[31m-        }[m
[31m-[m
[31m-        if (hv->wildcard[m
[31m-            && h[i].key.len >= hv->key.len - 1[m
[31m-            && ngx_strncasecmp(h[i].key.data, hv->key.data,[m
[31m-                               hv->key.len - 1) == 0)[m
[31m-        {[m
[31m-            goto matched;[m
[31m-        }[m
[31m-[m
[31m-        /* not matched */[m
[31m-        continue;[m
[31m-[m
[31m-matched:[m
[31m-[m
[31m-        if (value->len == 0 || matched) {[m
[31m-            dd("clearing normal header for %.*s", (int) hv->key.len,[m
[31m-               hv->key.data);[m
[31m-[m
[31m-            h[i].value.len = 0;[m
[31m-            h[i].hash = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            h[i].value = *value;[m
[31m-            h[i].hash = hv->hash;[m
[31m-        }[m
[31m-[m
[31m-        if (output_header) {[m
[31m-            *output_header = &h[i];[m
[31m-        }[m
[31m-[m
[31m-        matched = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (matched){[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if ((hv->wildcard || no_create) && value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* XXX we still need to create header slot even if the value[m
[31m-     * is empty because some builtin headers like Last-Modified[m
[31m-     * relies on this to get cleared */[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        h->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    if (output_header) {[m
[31m-        *output_header = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h, **old;[m
[31m-[m
[31m-    dd_enter();[m
[31m-[m
[31m-    if (hv->offset) {[m
[31m-        old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    } else {[m
[31m-        old = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (old == NULL || *old == NULL) {[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old, 0);[m
[31m-    }[m
[31m-[m
[31m-    h = *old;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        dd("clearing the builtin header");[m
[31m-[m
[31m-        h->hash = 0;[m
[31m-        h->value = *value;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = hv->hash;[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-    ngx_uint_t        i;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* override old values (if any) */[m
[31m-[m
[31m-    if (pa->nelts > 0) {[m
[31m-        ph = pa->elts;[m
[31m-        for (i = 1; i < pa->nelts; i++) {[m
[31m-            ph[i]->hash = 0;[m
[31m-            ph[i]->value.len = 0;[m
[31m-        }[m
[31m-[m
[31m-        ph[0]->value = *value;[m
[31m-[m
[31m-        if (value->len == 0) {[m
[31m-            ph[0]->hash = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            ph[0]->hash = hv->hash;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho->value = *value;[m
[31m-    ho->hash = hv->hash;[m
[31m-    ngx_str_set(&ho->key, "Cache-Control");[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_type_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    u_char          *p, *last, *end;[m
[31m-[m
[31m-    r->headers_out.content_type_len = value->len;[m
[31m-    r->headers_out.content_type = *value;[m
[31m-    r->headers_out.content_type_hash = hv->hash;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    p = value->data;[m
[31m-    end = p + value->len;[m
[31m-[m
[31m-    for (; p != end; p++) {[m
[31m-[m
[31m-        if (*p != ';') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        last = p;[m
[31m-[m
[31m-        while (*++p == ' ') { /* void */ }[m
[31m-[m
[31m-        if (p == end) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p += 8;[m
[31m-[m
[31m-        r->headers_out.content_type_len = last - value->data;[m
[31m-[m
[31m-        if (*p == '"') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        last = end;[m
[31m-[m
[31m-        if (*(last - 1) == '"') {[m
[31m-            last--;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.charset.len = last - p;[m
[31m-        r->headers_out.charset.data = p;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    value->len = 0;[m
[31m-[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    off_t           len;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_content_length_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_atosz(value->data, value->len);[m
[31m-    if (len == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = len;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_accept_ranges_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    if (value->len == 0) {[m
[31m-        r->allow_ranges = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    dd_enter();[m
[31m-[m
[31m-    value->len = 0;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_headers_more_set_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_headers_more_parse_directive(cf, cmd, conf,[m
[31m-                                         ngx_http_headers_more_opcode_set);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_headers_more_clear_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return ngx_http_headers_more_parse_directive(cf, cmd, conf,[m
[31m-                                        ngx_http_headers_more_opcode_clear);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_headers_more_check_type(ngx_http_request_t *r, ngx_array_t *types)[m
[31m-{[m
[31m-    ngx_uint_t          i;[m
[31m-    ngx_str_t          *t;[m
[31m-[m
[31m-    dd("headers_out->content_type: %.*s (len %d)",[m
[31m-       (int) r->headers_out.content_type.len,[m
[31m-       r->headers_out.content_type.data,[m
[31m-       (int) r->headers_out.content_type.len);[m
[31m-[m
[31m-    t = types->elts;[m
[31m-[m
[31m-    for (i = 0; i < types->nelts; i++) {[m
[31m-        dd("...comparing with type [%.*s]", (int) t[i].len, t[i].data);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == t[i].len[m
[31m-            && ngx_strncmp(r->headers_out.content_type.data,[m
[31m-                           t[i].data, t[i].len) == 0)[m
[31m-        {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_headers_more_check_status(ngx_http_request_t *r, ngx_array_t *statuses)[m
[31m-{[m
[31m-    ngx_uint_t          i;[m
[31m-    ngx_uint_t         *status;[m
[31m-[m
[31m-    dd("headers_out.status = %d", (int) r->headers_out.status);[m
[31m-[m
[31m-    status = statuses->elts;[m
[31m-    for (i = 0; i < statuses->nelts; i++) {[m
[31m-        dd("...comparing with specified status %d", (int) status[i]);[m
[31m-[m
[31m-        if (r->headers_out.status == status[i]) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_more_parse_directive(ngx_conf_t *cf, ngx_command_t *ngx_cmd,[m
[31m-    void *conf, ngx_http_headers_more_opcode_t opcode)[m
[31m-{[m
[31m-    ngx_http_headers_more_loc_conf_t  *hlcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_headers_more_cmd_t       *cmd;[m
[31m-    ngx_str_t                         *arg;[m
[31m-    ngx_flag_t                         ignore_next_arg;[m
[31m-    ngx_str_t                         *cmd_name;[m
[31m-    ngx_int_t                          rc;[m
[31m-[m
[31m-    ngx_http_headers_more_main_conf_t  *hmcf;[m
[31m-[m
[31m-    if (hlcf->cmds == NULL) {[m
[31m-        hlcf->cmds = ngx_array_create(cf->pool, 1,[m
[31m-                                      sizeof(ngx_http_headers_more_cmd_t));[m
[31m-[m
[31m-        if (hlcf->cmds == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cmd = ngx_array_push(hlcf->cmds);[m
[31m-    if (cmd == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->headers =[m
[31m-        ngx_array_create(cf->pool, 1,[m
[31m-                         sizeof(ngx_http_headers_more_header_val_t));[m
[31m-    if (cmd->headers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->types = ngx_array_create(cf->pool, 1, sizeof(ngx_str_t));[m
[31m-    if (cmd->types == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd->statuses = ngx_array_create(cf->pool, 1, sizeof(ngx_uint_t));[m
[31m-    if (cmd->statuses == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    arg = cf->args->elts;[m
[31m-[m
[31m-    cmd_name = &arg[0];[m
[31m-[m
[31m-    ignore_next_arg = 0;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ignore_next_arg) {[m
[31m-            ignore_next_arg = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].data[0] != '-') {[m
[31m-            rc = ngx_http_headers_more_parse_header(cf, cmd_name,[m
[31m-                                                    &arg[i], cmd->headers,[m
[31m-                                                    opcode,[m
[31m-                                        ngx_http_headers_more_set_handlers);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (arg[i].len == 2) {[m
[31m-            if (arg[i].data[1] == 't') {[m
[31m-                if (i == cf->args->nelts - 1) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                                  "%V: option -t takes an argument.",[m
[31m-                                  cmd_name);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rc = ngx_http_headers_more_parse_types(cf->log, cmd_name,[m
[31m-                                                       &arg[i + 1],[m
[31m-                                                       cmd->types);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ignore_next_arg = 1;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            } else if (arg[i].data[1] == 's') {[m
[31m-[m
[31m-                if (i == cf->args->nelts - 1) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                                  "%V: option -s takes an argument.",[m
[31m-                                  cmd_name);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rc = ngx_http_headers_more_parse_statuses(cf->log, cmd_name,[m
[31m-                                                          &arg[i + 1],[m
[31m-                                                          cmd->statuses);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ignore_next_arg = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "%V: invalid option name: \"%V\"", cmd_name, &arg[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("Found %d statuses, %d types, and %d headers",[m
[31m-       (int) cmd->statuses->nelts, (int) cmd->types->nelts,[m
[31m-       (int) cmd->headers->nelts);[m
[31m-[m
[31m-    if (cmd->headers->nelts == 0) {[m
[31m-        cmd->headers = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->types->nelts == 0) {[m
[31m-        cmd->types = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->statuses->nelts == 0) {[m
[31m-        cmd->statuses = NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmd->is_input = 0;[m
[31m-[m
[31m-    hmcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                         ngx_http_headers_more_filter_module);[m
[31m-[m
[31m-    hmcf->requires_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.h[m
[1mdeleted file mode 100644[m
[1mindex c939507..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_headers_out.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_HEADERS_MORE_OUTPUT_HEADERS_H[m
[31m-#define NGX_HTTP_HEADERS_MORE_OUTPUT_HEADERS_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_filter_module.h"[m
[31m-[m
[31m-[m
[31m-/* output header setters and clearers */[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_exec_cmd(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_more_cmd_t *cmd);[m
[31m-[m
[31m-char *ngx_http_headers_more_set_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-char *ngx_http_headers_more_clear_headers(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_HEADERS_MORE_OUTPUT_HEADERS_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.c[m
[1mdeleted file mode 100644[m
[1mindex 042dc3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,380 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_parse_header(ngx_conf_t *cf, ngx_str_t *cmd_name,[m
[31m-    ngx_str_t *raw_header, ngx_array_t *headers,[m
[31m-    ngx_http_headers_more_opcode_t opcode,[m
[31m-    ngx_http_headers_more_set_header_t *handlers)[m
[31m-{[m
[31m-    ngx_http_headers_more_header_val_t             *hv;[m
[31m-[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_str_t                            key = ngx_null_string;[m
[31m-    ngx_str_t                            value = ngx_null_string;[m
[31m-    ngx_flag_t                           seen_end_of_key;[m
[31m-    ngx_http_compile_complex_value_t     ccv;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    hv = ngx_array_push(headers);[m
[31m-    if (hv == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    seen_end_of_key = 0;[m
[31m-    for (i = 0; i < raw_header->len; i++) {[m
[31m-        if (key.len == 0) {[m
[31m-            if (isspace(raw_header->data[i])) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            key.data = raw_header->data;[m
[31m-            key.len  = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (!seen_end_of_key) {[m
[31m-            if (raw_header->data[i] == ':'[m
[31m-                || isspace(raw_header->data[i]))[m
[31m-            {[m
[31m-                seen_end_of_key = 1;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            key.len++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value.len == 0) {[m
[31m-            if (raw_header->data[i] == ':'[m
[31m-                || isspace(raw_header->data[i]))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            value.data = &raw_header->data[i];[m
[31m-            value.len  = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        value.len++;[m
[31m-    }[m
[31m-[m
[31m-    if (key.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "%V: no key found in the header argument: %V",[m
[31m-                      cmd_name, raw_header);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hv->wildcard = (key.data[key.len - 1] == '*');[m
[31m-    if (hv->wildcard && key.len<2){[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "%V: wildcard key to short: %V",[m
[31m-                      cmd_name, raw_header);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hv->hash = ngx_hash_key_lc(key.data, key.len);[m
[31m-    hv->key = key;[m
[31m-[m
[31m-    hv->offset = 0;[m
[31m-[m
[31m-    for (i = 0; handlers[i].name.len; i++) {[m
[31m-        if (hv->key.len != handlers[i].name.len[m
[31m-            || ngx_strncasecmp(hv->key.data, handlers[i].name.data,[m
[31m-                               handlers[i].name.len) != 0)[m
[31m-        {[m
[31m-            dd("hv key comparison: %s <> %s", handlers[i].name.data,[m
[31m-               hv->key.data);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hv->offset = handlers[i].offset;[m
[31m-        hv->handler = handlers[i].handler;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (handlers[i].name.len == 0 && handlers[i].handler) {[m
[31m-        hv->offset = handlers[i].offset;[m
[31m-        hv->handler = handlers[i].handler;[m
[31m-    }[m
[31m-[m
[31m-    if (opcode == ngx_http_headers_more_opcode_clear) {[m
[31m-        value.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (value.len == 0) {[m
[31m-        ngx_memzero(&hv->value, sizeof(ngx_http_complex_value_t));[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    /* Nginx request header value requires to be a null-terminated[m
[31m-     * C string */[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, value.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, value.data, value.len);[m
[31m-    p[value.len] = '\0';[m
[31m-    value.data = p;[m
[31m-    value.len++; /* we should also compile the trailing '\0' */[m
[31m-[m
[31m-    /* compile the header value as a complex value */[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value;[m
[31m-    ccv.complex_value = &hv->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_parse_statuses(ngx_log_t *log, ngx_str_t *cmd_name,[m
[31m-    ngx_str_t *value, ngx_array_t *statuses)[m
[31m-{[m
[31m-    u_char          *p, *last;[m
[31m-    ngx_uint_t      *s = NULL;[m
[31m-[m
[31m-    p = value->data;[m
[31m-    last = p + value->len;[m
[31m-[m
[31m-    for (; p != last; p++) {[m
[31m-        if (s == NULL) {[m
[31m-            if (isspace(*p)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(statuses);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (*p >= '0' && *p <= '9') {[m
[31m-                *s = *p - '0';[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                              "%V: invalid digit \"%c\" found in "[m
[31m-                              "the status code list \"%V\"",[m
[31m-                              cmd_name, *p, value);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (isspace(*p)) {[m
[31m-            dd("Parsed status %d", (int) *s);[m
[31m-[m
[31m-            s = NULL;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*p >= '0' && *p <= '9') {[m
[31m-            *s *= 10;[m
[31m-            *s += *p - '0';[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                          "%V: invalid digit \"%c\" found in "[m
[31m-                          "the status code list \"%V\"",[m
[31m-                          cmd_name, *p, value);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (s) {[m
[31m-        dd("Parsed status %d", (int) *s);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_parse_types(ngx_log_t *log, ngx_str_t *cmd_name,[m
[31m-    ngx_str_t *value, ngx_array_t *types)[m
[31m-{[m
[31m-    u_char          *p, *last;[m
[31m-    ngx_str_t       *t = NULL;[m
[31m-[m
[31m-    p = value->data;[m
[31m-    last = p + value->len;[m
[31m-[m
[31m-    for (; p != last; p++) {[m
[31m-        if (t == NULL) {[m
[31m-            if (isspace(*p) || *p == ';') {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            t = ngx_array_push(types);[m
[31m-            if (t == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            t->len = 1;[m
[31m-            t->data = p;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (isspace(*p) || *p == ';') {[m
[31m-            t = NULL;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        t->len++;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_headers_more_rm_header_helper(ngx_list_t *l, ngx_list_part_t *cur,[m
[31m-    ngx_uint_t i)[m
[31m-{[m
[31m-    ngx_table_elt_t             *data;[m
[31m-    ngx_list_part_t             *new, *part;[m
[31m-[m
[31m-    dd("list rm item: part %p, i %d, nalloc %d", cur, (int) i,[m
[31m-       (int) l->nalloc);[m
[31m-[m
[31m-    data = cur->elts;[m
[31m-[m
[31m-    dd("cur: nelts %d, nalloc %d", (int) cur->nelts,[m
[31m-       (int) l->nalloc);[m
[31m-[m
[31m-    if (i == 0) {[m
[31m-        cur->elts = (char *) cur->elts + l->size;[m
[31m-        cur->nelts--;[m
[31m-[m
[31m-        if (cur == l->last) {[m
[31m-            if (cur->nelts == 0) {[m
[31m-#if 1[m
[31m-                part = &l->part;[m
[31m-[m
[31m-                if (part == cur) {[m
[31m-                    cur->elts = (char *) cur->elts - l->size;[m
[31m-                    /* do nothing */[m
[31m-[m
[31m-                } else {[m
[31m-                    while (part->next != cur) {[m
[31m-                        if (part->next == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-                        part = part->next;[m
[31m-                    }[m
[31m-[m
[31m-                    l->last = part;[m
[31m-                    part->next = NULL;[m
[31m-                    dd("part nelts: %d", (int) part->nelts);[m
[31m-                    l->nalloc = part->nelts;[m
[31m-                }[m
[31m-#endif[m
[31m-[m
[31m-            } else {[m
[31m-                l->nalloc--;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (cur->nelts == 0) {[m
[31m-            part = &l->part;[m
[31m-[m
[31m-            if (part == cur) {[m
[31m-                ngx_http_headers_more_assert(cur->next != NULL);[m
[31m-[m
[31m-                dd("remove 'cur' from the list by rewriting 'cur': "[m
[31m-                   "l->last: %p, cur: %p, cur->next: %p, part: %p",[m
[31m-                   l->last, cur, cur->next, part);[m
[31m-[m
[31m-                if (l->last == cur->next) {[m
[31m-                    dd("last is cur->next");[m
[31m-                    l->part = *(cur->next);[m
[31m-                    l->last = part;[m
[31m-                    l->nalloc = part->nelts;[m
[31m-[m
[31m-                } else {[m
[31m-                    l->part = *(cur->next);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                dd("remove 'cur' from the list");[m
[31m-                while (part->next != cur) {[m
[31m-                    if (part->next == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                    part = part->next;[m
[31m-                }[m
[31m-[m
[31m-                part->next = cur->next;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (i == cur->nelts - 1) {[m
[31m-        cur->nelts--;[m
[31m-[m
[31m-        if (cur == l->last) {[m
[31m-            l->nalloc = cur->nelts;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    new = ngx_palloc(l->pool, sizeof(ngx_list_part_t));[m
[31m-    if (new == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    new->elts = &data[i + 1];[m
[31m-    new->nelts = cur->nelts - i - 1;[m
[31m-    new->next = cur->next;[m
[31m-[m
[31m-    cur->nelts = i;[m
[31m-    cur->next = new;[m
[31m-    if (cur == l->last) {[m
[31m-        l->last = new;[m
[31m-        l->nalloc = new->nelts;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.h[m
[1mdeleted file mode 100644[m
[1mindex 6c4614b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/src/ngx_http_headers_more_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_HEADERS_MORE_UTIL_H[m
[31m-#define NGX_HTTP_HEADERS_MORE_UTIL_H[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_headers_more_filter_module.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_headers_more_hash_literal(s)                                \[m
[31m-    ngx_http_headers_more_hash_str((u_char *) s, sizeof(s) - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_uint_t[m
[31m-ngx_http_headers_more_hash_str(u_char *src, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    while (n--) {[m
[31m-        key = ngx_hash(key, *src);[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t  ngx_http_headers_more_location_hash;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_parse_header(ngx_conf_t *cf,[m
[31m-    ngx_str_t *cmd_name, ngx_str_t *raw_header, ngx_array_t *headers,[m
[31m-    ngx_http_headers_more_opcode_t opcode,[m
[31m-    ngx_http_headers_more_set_header_t *handlers);[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_parse_statuses(ngx_log_t *log,[m
[31m-    ngx_str_t *cmd_name, ngx_str_t *value, ngx_array_t *statuses);[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_parse_types(ngx_log_t *log,[m
[31m-    ngx_str_t *cmd_name, ngx_str_t *value, ngx_array_t *types);[m
[31m-[m
[31m-ngx_int_t ngx_http_headers_more_rm_header_helper(ngx_list_t *l,[m
[31m-    ngx_list_part_t *cur, ngx_uint_t i);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_HEADERS_MORE_UTIL_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/bug.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/bug.t[m
[1mdeleted file mode 100644[m
[1mindex d843479..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/bug.t[m
[1m+++ /dev/null[m
[36m@@ -1,362 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => 49 * repeat_each();[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set Server[m
[31m---- config[m
[31m-    #more_set_headers 'Last-Modified: x';[m
[31m-    more_clear_headers 'Last-Modified';[m
[31m---- request[m
[31m-    GET /index.html[m
[31m---- response_headers[m
[31m-! Last-Modified[m
[31m---- response_body_like: It works![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: variables in the Ranges header[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        set $rfrom 1;[m
[31m-        set $rto 3;[m
[31m-        more_set_input_headers 'Range: bytes=$rfrom - $rto';[m
[31m-        #more_set_input_headers 'Range: bytes=1 - 3';[m
[31m-        #echo $http_range;[m
[31m-    }[m
[31m---- request[m
[31m-GET /index.html[m
[31m---- error_code: 206[m
[31m---- response_body chomp[m
[31m-htm[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: mime type overriding (inlined types)[m
[31m---- config[m
[31m-    more_clear_headers 'X-Powered-By' 'X-Runtime' 'ETag';[m
[31m-[m
[31m-    types {[m
[31m-        text/html                             html htm shtml;[m
[31m-        text/css                              css;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.css[m
[31m-hello[m
[31m---- request[m
[31m-GET /a.css[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: mime type overriding (included types file)[m
[31m---- config[m
[31m-    more_clear_headers 'X-Powered-By' 'X-Runtime' 'ETag';[m
[31m-    include mime.types;[m
[31m---- user_files[m
[31m->>> a.css[m
[31m-hello[m
[31m->>> ../conf/mime.types[m
[31m-types {[m
[31m-    text/html                             html htm shtml;[m
[31m-    text/css                              css;[m
[31m-}[m
[31m---- request[m
[31m-GET /a.css[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: empty variable as the header value[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_headers 'X-Foo: $arg_foo';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: range bug[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        more_clear_input_headers "Range*" ;[m
[31m-        more_clear_input_headers "Content-Range*" ;[m
[31m-[m
[31m-        more_set_input_headers 'Range: bytes=1-5';[m
[31m-        more_set_headers  'Content-Range: bytes 1-5/1000';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /index.html[m
[31m---- more_headers[m
[31m-Range: bytes=1-3[m
[31m---- raw_response_headers_like: Content-Range: bytes 1-5/1000$[m
[31m---- response_body chop[m
[31m-html>[m
[31m---- error_code: 206[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: Allow-Ranges[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        more_clear_headers 'Accept-Ranges';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /index.html[m
[31m---- response_headers[m
[31m-! Accept-Ranges[m
[31m---- response_body_like: It works[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear hand-written Allow-Ranges headers[m
[31m---- config[m
[31m-    location /index.html {[m
[31m-        more_set_headers 'Accept-Ranges: bytes';[m
[31m-        more_clear_headers 'Accept-Ranges';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /index.html[m
[31m---- response_headers[m
[31m-! Accept-Ranges[m
[31m---- response_body_like: It works[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: clear first, then add[m
[31m---- config[m
[31m-    location /bug {[m
[31m-        more_clear_headers 'Foo';[m
[31m-        more_set_headers 'Foo: a';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bug[m
[31m---- raw_response_headers_like eval[m
[31m-".*Foo: a.*"[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: first add, then clear, then add again[m
[31m---- config[m
[31m-    location /bug {[m
[31m-        more_set_headers 'Foo: a';[m
[31m-        more_clear_headers 'Foo';[m
[31m-        more_set_headers 'Foo: b';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bug[m
[31m---- raw_response_headers_like eval[m
[31m-".*Foo: b.*"[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: override charset[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        charset iso-8859-1;[m
[31m-        default_type "text/html";[m
[31m-        echo hiya;[m
[31m-    }[m
[31m-[m
[31m-    location /bug {[m
[31m-        more_set_headers "Content-Type: text/html; charset=UTF-8";[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bug[m
[31m---- response_body[m
[31m-hiya[m
[31m---- response_headers[m
[31m-Content-Type: text/html; charset=UTF-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set multi-value header to a single value[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-        more_set_headers 'Foo: b';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = ngx.header.Foo[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        add_header Foo a;[m
[31m-        add_header Foo c;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-Foo: b[m
[31m---- response_body[m
[31m-foo[m
[31m-b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: set multi values to cache-control and override it with multiple values (to reproduce a bug)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store", "foo", "bar", "baz" }[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-        more_clear_headers Cache-Control;[m
[31m-        add_header Cache-Control "blah";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: blah[m
[31m---- response_body[m
[31m-Cache-Control: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set 20+ headers[m
[31m---- config[m
[31m-    location /test {[m
[31m-        more_clear_input_headers "Authorization";[m
[31m-        echo $http_a1;[m
[31m-        echo $http_authorization;[m
[31m-        echo $http_a2;[m
[31m-        echo $http_a3;[m
[31m-        echo $http_a23;[m
[31m-        echo $http_a24;[m
[31m-        echo $http_a25;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers eval[m
[31m-my $i = 1;[m
[31m-my $s;[m
[31m-while ($i <= 25) {[m
[31m-    $s .= "A$i: $i\n";[m
[31m-    if ($i == 22) {[m
[31m-        $s .= "Authorization: blah\n";[m
[31m-    }[m
[31m-    $i++;[m
[31m-}[m
[31m-#warn $s;[m
[31m-$s[m
[31m---- response_body[m
[31m-1[m
[31m-[m
[31m-2[m
[31m-3[m
[31m-23[m
[31m-24[m
[31m-25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: github #20: segfault caused by the nasty optimization in the nginx core (set)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        more_set_headers "Foo: 1";[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: github #20: segfault caused by the nasty optimization in the nginx core (clear)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        more_clear_headers Foo;[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: Content-Type response headers with a charset param (correct -t values)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_set_headers -t 'text/html' 'X-Foo: Bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/fake;[m
[31m-    }[m
[31m-[m
[31m-    location = /fake {[m
[31m-        default_type text/html;[m
[31m-        charset utf-8;[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-X-Foo: Bar[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: Content-Type response headers with a charset param (WRONG -t values)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_set_headers -t 'text/html; charset=utf-8' 'X-Foo: Bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/fake;[m
[31m-    }[m
[31m-[m
[31m-    location = /fake {[m
[31m-        default_type text/html;[m
[31m-        charset utf-8;[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-X-Foo: Bar[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/builtin.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/builtin.t[m
[1mdeleted file mode 100644[m
[1mindex f2b5c34..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/builtin.t[m
[1m+++ /dev/null[m
[36m@@ -1,339 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-plan tests => 60;[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set Server[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'Server: Foo';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Server: Foo[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear Server[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_clear_headers 'Server: ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Server[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set Content-Type[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plan';[m
[31m-        more_set_headers 'Content-Type: text/css';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set Content-Type[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plan';[m
[31m-        more_set_headers 'Content-Type: text/css';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: clear Content-Type[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_clear_headers 'Content-Type: ';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: clear Content-Type (colon not required)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_clear_headers 'Content-Type';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: clear Content-Type (value ignored)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_clear_headers 'Content-Type: blah';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear Content-Type (case insensitive)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_clear_headers 'content-type: blah';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: clear Content-Type using set empty[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_set_headers 'content-type:';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: clear Content-Type using setting key only[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type: Hello';[m
[31m-        more_set_headers 'content-type';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set content-length[m
[31m---- config[m
[31m-    location /len {[m
[31m-        more_set_headers 'Content-Length: 2';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-Content-Length: 2[m
[31m---- response_body chop[m
[31m-he[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set content-length multiple times[m
[31m---- config[m
[31m-    location /len {[m
[31m-        more_set_headers 'Content-Length: 2';[m
[31m-        more_set_headers 'Content-Length: 4';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-Content-Length: 4[m
[31m---- response_body chop[m
[31m-hell[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: clear content-length[m
[31m---- config[m
[31m-    location /len {[m
[31m-        more_set_headers 'Content-Length: 4';[m
[31m-        more_set_headers 'Content-Length:';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: clear content-length (another way)[m
[31m---- config[m
[31m-    location /len {[m
[31m-        more_set_headers 'Content-Length: 4';[m
[31m-        more_clear_headers 'Content-Length';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Content-Length[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: clear content-type[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Content-Type:';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: clear content-type (the other way)[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_clear_headers 'Content-Type:';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set Charset[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Charset: gbk';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-Charset: gbk[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: clear Charset[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Charset: gbk';[m
[31m-        more_clear_headers 'Charset';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Charset[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: clear Charset (the other way: using set)[m
[31m---- config[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Charset: gbk';[m
[31m-        more_set_headers 'Charset: ';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-! Charset[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: set Vary[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_headers 'Vary: gbk';[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /len {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers 'Vary: hello';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /len[m
[31m---- response_headers[m
[31m-Vary: hello[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex febd306..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set request header at client side[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        eval_subrequest_in_memory off;[m
[31m-        eval_override_content_type text/plain;[m
[31m-        eval $res {[m
[31m-            echo -n 1;[m
[31m-        }[m
[31m-        #echo "[$res]";[m
[31m-        if ($res = '1') {[m
[31m-            more_set_input_headers 'Foo: Bar';[m
[31m-            echo "OK";[m
[31m-            break;[m
[31m-        }[m
[31m-        echo "NOT OK";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-OK[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-conn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-conn.t[m
[1mdeleted file mode 100644[m
[1mindex a32d4e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-conn.t[m
[1m+++ /dev/null[m
[36m@@ -1,138 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear the Connection req header[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        more_clear_input_headers Connection;[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 0[m
[31m-[m
[31m---- response_body[m
[31m-connection: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set custom Connection req header (close)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        more_set_input_headers "Connection: CLOSE";[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 1[m
[31m-[m
[31m---- response_body[m
[31m-connection: CLOSE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set custom Connection req header (keep-alive)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        more_set_input_headers "Connection: keep-alive";[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 2[m
[31m-[m
[31m---- response_body[m
[31m-connection: keep-alive[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set custom Connection req header (bad)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        more_set_input_headers "Connection: bad";[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 0[m
[31m-[m
[31m---- response_body[m
[31m-connection: bad[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-cookie.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-cookie.t[m
[1mdeleted file mode 100644[m
[1mindex 8929be7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-cookie.t[m
[1m+++ /dev/null[m
[36m@@ -1,164 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear cookie (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers Cookie;[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 0[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear cookie (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers Cookie;[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 0[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set one custom cookie (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "Cookie: boo=123";[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 1[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set one custom cookie (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "Cookie: boo=123";[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 1[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-ua.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-ua.t[m
[1mdeleted file mode 100644[m
[1mindex 56d2222..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input-ua.t[m
[1m+++ /dev/null[m
[36m@@ -1,629 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear Opera user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.62[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: opera: %d\n", $r->headers_in->opera)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: opera: %d\n", $r->headers_in->opera)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: opera: 1[m
[31m-content: opera: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear MSIE 4 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set custom MSIE 4 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: clear MSIE 5 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set custom MSIE 5 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: clear MSIE 6 (without SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set custom MSIE 6 (without SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear MSIE 6 (with SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=0[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set custom MSIE 6 (with SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set custom MSIE 7 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; winfx; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Zune 2.0)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; winfx; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Zune 2.0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: clear Gecko user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: gecko: 1[m
[31m-content: gecko: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set custom Gecko user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: gecko: 0[m
[31m-content: gecko: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: clear Chrome user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: chrome: 1[m
[31m-content: chrome: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set custom Chrome user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: chrome: 0[m
[31m-content: chrome: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: clear Safari (Mac OS X) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: safari: 1[m
[31m-content: safari: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set custom Safari user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: safari: 0[m
[31m-content: safari: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: clear Konqueror user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers User-Agent;[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: konqueror: 1[m
[31m-content: konqueror: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set custom Konqueror user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    printf("rewrite: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: konqueror: 0[m
[31m-content: konqueror: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input.t[m
[1mdeleted file mode 100644[m
[1mindex 0b8989f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/input.t[m
[1m+++ /dev/null[m
[36m@@ -1,1291 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 124;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set request header at client side[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #more_set_input_headers 'X-Foo: howdy';[m
[31m-        echo $http_x_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers[m
[31m-X-Foo: blah[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set request header at client side and rewrite it[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers 'X-Foo: howdy';[m
[31m-        echo $http_x_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers[m
[31m-X-Foo: blah[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-howdy[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rewrite content length[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Content-Length: 2048';[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /bar\n" .[m
[31m-"a" x 4096[m
[31m---- response_body eval[m
[31m-"a" x 2048[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: try to rewrite content length using the rewrite module[m
[31m-Thisshould not take effect ;)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        set $http_content_length 2048;[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /bar\n" .[m
[31m-"a" x 4096[m
[31m---- response_body eval[m
[31m-"a" x 4096[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: rewrite host and user-agent[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Host: foo' 'User-Agent: blah';[m
[31m-        echo "Host: $host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Host: foo[m
[31m-User-Agent: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: clear host and user-agent[m
[31m-$host always has a default value and cannot be really cleared.[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_clear_input_headers 'Host: foo' 'User-Agent: blah';[m
[31m-        echo "Host: $host";[m
[31m-        echo "Host (2): $http_host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Host: localhost[m
[31m-Host (2): [m
[31m-User-Agent: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: clear host and user-agent (the other way)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Host:' 'User-Agent:' 'X-Foo:';[m
[31m-        echo "Host: $host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-        echo "X-Foo: $http_x_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- more_headers[m
[31m-X-Foo: bar[m
[31m---- response_body[m
[31m-Host: localhost[m
[31m-User-Agent: [m
[31m-X-Foo: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear content-length[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Content-Length: ';[m
[31m-        echo "Content-Length: $http_content_length";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-Content-Length: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: clear content-length (the other way)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_clear_input_headers 'Content-Length: ';[m
[31m-        echo "Content-Length: $http_content_length";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-Content-Length: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: rewrite type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Content-Type: text/css';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: text/css[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: clear type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Content-Type:';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: clear type (the other way)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_clear_input_headers 'Content-Type:foo';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: add type constraints[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-yay[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: add type constraints (not matched)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: add type constraints (OR'd)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-yay[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: add type constraints (OR'd)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-yay[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: add type constraints (OR'd) (not matched)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: mix input and output cmds[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'X-Blah:yay';[m
[31m-        more_set_headers 'X-Blah:hiya';[m
[31m-        echo $http_x_blah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_headers[m
[31m-X-Blah: hiya[m
[31m---- response[m
[31m-yay[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: set request header at client side and replace[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers -r 'X-Foo: howdy';[m
[31m-        echo $http_x_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers[m
[31m-X-Foo: blah[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-howdy[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: do no set request header at client, so no replace with -r option[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers -r 'X-Foo: howdy';[m
[31m-        echo "empty_header:" $http_x_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-empty_header: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: clear input headers[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $val 'dog';[m
[31m-[m
[31m-        more_clear_input_headers 'User-Agent';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers[m
[31m-User-Agent: my-sock[m
[31m---- response_body eval[m
[31m-"GET /proxy HTTP/1.0\r[m
[31m-Host: 127.0.0.1:\$ServerPort\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: clear input headers[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_clear_input_headers 'User-Agent';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"GET /proxy HTTP/1.0\r[m
[31m-Host: 127.0.0.1:\$ServerPort\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: clear input headers[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_clear_input_headers 'X-Foo19';[m
[31m-        more_clear_input_headers 'X-Foo20';[m
[31m-        more_clear_input_headers 'X-Foo21';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- more_headers eval[m
[31m-my $s;[m
[31m-for my $i (3..21) {[m
[31m-    $s .= "X-Foo$i: $i\n";[m
[31m-}[m
[31m-$s;[m
[31m---- response_body eval[m
[31m-"GET /proxy HTTP/1.0\r[m
[31m-Host: 127.0.0.1:\$ServerPort\r[m
[31m-Connection: close\r[m
[31m-X-Foo3: 3\r[m
[31m-X-Foo4: 4\r[m
[31m-X-Foo5: 5\r[m
[31m-X-Foo6: 6\r[m
[31m-X-Foo7: 7\r[m
[31m-X-Foo8: 8\r[m
[31m-X-Foo9: 9\r[m
[31m-X-Foo10: 10\r[m
[31m-X-Foo11: 11\r[m
[31m-X-Foo12: 12\r[m
[31m-X-Foo13: 13\r[m
[31m-X-Foo14: 14\r[m
[31m-X-Foo15: 15\r[m
[31m-X-Foo16: 16\r[m
[31m-X-Foo17: 17\r[m
[31m-X-Foo18: 18\r[m
[31m-\r[m
[31m-"[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: Accept-Encoding[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_input_headers 'Accept-Encoding: gzip';[m
[31m-        gzip on;[m
[31m-        gzip_min_length  1;[m
[31m-        gzip_buffers     4 8k;[m
[31m-        gzip_types       text/plain;[m
[31m-    }[m
[31m---- user_files[m
[31m-">>> bar[m
[31m-" . ("hello" x 512)[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- response_body_like: .[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: rewrite + set request header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite ^ /foo last;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        more_set_input_headers 'X-Foo: howdy';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo "X-Foo: $http_x_foo";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-X-Foo: howdy[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: clear_header should clear all the instances of the user custom header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers Foo;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo "Foo: [$http_foo]";[m
[31m-        echo "Test-Header: [$http_test_header]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Foo: bah[m
[31m-Test-Header: 1[m
[31m---- response_body[m
[31m-Foo: [][m
[31m-Test-Header: [1][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: clear_header should clear all the instances of the builtin header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers Content-Type;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo "Content-Type: [$http_content_type]";[m
[31m-        echo "Test-Header: [$http_test_header]";[m
[31m-        #echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Content-Type: foo[m
[31m-Content-Type: bah[m
[31m-Test-Header: 1[m
[31m---- response_body[m
[31m-Content-Type: [][m
[31m-Test-Header: [1][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: Converting POST to GET - clearing headers (bug found by Matthieu Tourne, 411 error page)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers Content-Type;[m
[31m-        more_clear_input_headers Content-Length;[m
[31m-[m
[31m-        #proxy_pass http://127.0.0.1:8888;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Content-Type: application/ocsp-request[m
[31m-Test-Header: 1[m
[31m---- response_body_like eval[m
[31m-qr/Connection: close\r[m
[31m-Test-Header: 1\r[m
[31m-\r[m
[31m-$/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: clear_header() does not duplicate subsequent headers (old bug)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers Foo;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Bah: bah[m
[31m-Foo: foo[m
[31m-Test-Header: 1[m
[31m-Foo1: foo1[m
[31m-Foo2: foo2[m
[31m-Foo3: foo3[m
[31m-Foo4: foo4[m
[31m-Foo5: foo5[m
[31m-Foo6: foo6[m
[31m-Foo7: foo7[m
[31m-Foo8: foo8[m
[31m-Foo9: foo9[m
[31m-Foo10: foo10[m
[31m-Foo11: foo11[m
[31m-Foo12: foo12[m
[31m-Foo13: foo13[m
[31m-Foo14: foo14[m
[31m-Foo15: foo15[m
[31m-Foo16: foo16[m
[31m-Foo17: foo17[m
[31m-Foo18: foo18[m
[31m-Foo19: foo19[m
[31m-Foo20: foo20[m
[31m-Foo21: foo21[m
[31m-Foo22: foo22[m
[31m---- response_body_like eval[m
[31m-qr/Bah: bah\r[m
[31m-Test-Header: 1\r[m
[31m-Foo1: foo1\r[m
[31m-Foo2: foo2\r[m
[31m-Foo3: foo3\r[m
[31m-Foo4: foo4\r[m
[31m-Foo5: foo5\r[m
[31m-Foo6: foo6\r[m
[31m-Foo7: foo7\r[m
[31m-Foo8: foo8\r[m
[31m-Foo9: foo9\r[m
[31m-Foo10: foo10\r[m
[31m-Foo11: foo11\r[m
[31m-Foo12: foo12\r[m
[31m-Foo13: foo13\r[m
[31m-Foo14: foo14\r[m
[31m-Foo15: foo15\r[m
[31m-Foo16: foo16\r[m
[31m-Foo17: foo17\r[m
[31m-Foo18: foo18\r[m
[31m-Foo19: foo19\r[m
[31m-Foo20: foo20\r[m
[31m-Foo21: foo21\r[m
[31m-Foo22: foo22\r[m
[31m-/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: clear input header (just more than 20 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers "R";[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-Q: q\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: clear input header (just more than 20 headers, and add more)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers R;[m
[31m-        more_set_input_headers "foo-1: 1" "foo-2: 2" "foo-3: 3" "foo-4: 4"[m
[31m-            "foo-5: 5" "foo-6: 6" "foo-7: 7" "foo-8: 8" "foo-9: 9"[m
[31m-            "foo-10: 10" "foo-11: 11" "foo-12: 12" "foo-13: 13"[m
[31m-            "foo-14: 14" "foo-15: 15" "foo-16: 16" "foo-17: 17" "foo-18: 18"[m
[31m-            "foo-19: 19" "foo-20: 20" "foo-21: 21";[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-Q: q\r[m
[31m-foo-1: 1\r[m
[31m-foo-2: 2\r[m
[31m-foo-3: 3\r[m
[31m-foo-4: 4\r[m
[31m-foo-5: 5\r[m
[31m-foo-6: 6\r[m
[31m-foo-7: 7\r[m
[31m-foo-8: 8\r[m
[31m-foo-9: 9\r[m
[31m-foo-10: 10\r[m
[31m-foo-11: 11\r[m
[31m-foo-12: 12\r[m
[31m-foo-13: 13\r[m
[31m-foo-14: 14\r[m
[31m-foo-15: 15\r[m
[31m-foo-16: 16\r[m
[31m-foo-17: 17\r[m
[31m-foo-18: 18\r[m
[31m-foo-19: 19\r[m
[31m-foo-20: 20\r[m
[31m-foo-21: 21\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: clear input header (just more than 21 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers R Q;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: clear input header (just more than 21 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers R Q;[m
[31m-        more_set_input_headers "foo-1: 1" "foo-2: 2" "foo-3: 3" "foo-4: 4"[m
[31m-            "foo-5: 5" "foo-6: 6" "foo-7: 7" "foo-8: 8" "foo-9: 9"[m
[31m-            "foo-10: 10" "foo-11: 11" "foo-12: 12" "foo-13: 13"[m
[31m-            "foo-14: 14" "foo-15: 15" "foo-16: 16" "foo-17: 17" "foo-18: 18"[m
[31m-            "foo-19: 19" "foo-20: 20" "foo-21: 21";[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-foo-1: 1\r[m
[31m-foo-2: 2\r[m
[31m-foo-3: 3\r[m
[31m-foo-4: 4\r[m
[31m-foo-5: 5\r[m
[31m-foo-6: 6\r[m
[31m-foo-7: 7\r[m
[31m-foo-8: 8\r[m
[31m-foo-9: 9\r[m
[31m-foo-10: 10\r[m
[31m-foo-11: 11\r[m
[31m-foo-12: 12\r[m
[31m-foo-13: 13\r[m
[31m-foo-14: 14\r[m
[31m-foo-15: 15\r[m
[31m-foo-16: 16\r[m
[31m-foo-17: 17\r[m
[31m-foo-18: 18\r[m
[31m-foo-19: 19\r[m
[31m-foo-20: 20\r[m
[31m-foo-21: 21\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: clear X-Real-IP[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers X-Real-IP;[m
[31m-        echo "X-Real-IP: $http_x_real_ip";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-X-Real-IP: 8.8.8.8[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("rewrite: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("content: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("content: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: x-real-ip: 8.8.8.8[m
[31m-content: no x-real-ip[m
[31m-[m
[31m---- response_body[m
[31m-X-Real-IP: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: set custom X-Real-IP[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "X-Real-IP: 8.8.4.4";[m
[31m-        echo "X-Real-IP: $http_x_real_ip";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("rewrite: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no x-real-ip")[m
[31m-    }[m
[31m-[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("content: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("content: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: no x-real-ip[m
[31m-content: x-real-ip: 8.8.4.4[m
[31m-[m
[31m---- response_body[m
[31m-X-Real-IP: 8.8.4.4[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: clear Via[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_clear_input_headers Via;[m
[31m-        echo "Via: $http_via";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("rewrite: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("content: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("content: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-content: no via[m
[31m-[m
[31m---- response_body[m
[31m-Via: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: set custom Via[m
[31m---- config[m
[31m-    location /t {[m
[31m-        more_set_input_headers "Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)";[m
[31m-        echo "Via: $http_via";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_headers_more_exec_input_cmd) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("rewrite: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no via")[m
[31m-    }[m
[31m-[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("content: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("content: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: no via[m
[31m-content: via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- response_body[m
[31m-Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: HTTP 0.9 (set)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers 'X-Foo: howdy';[m
[31m-        echo "x-foo: $http_x_foo";[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-x-foo: [m
[31m---- http09[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: HTTP 0.9 (clear)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_clear_input_headers 'X-Foo';[m
[31m-        echo "x-foo: $http_x_foo";[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-x-foo: [m
[31m---- http09[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: Host header with port and $host[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Host: agentzh.org:1984';[m
[31m-        echo "host var: $host";[m
[31m-        echo "http_host var: $http_host";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-host var: agentzh.org[m
[31m-http_host var: agentzh.org:1984[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: Host header with upper case letters and $host[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        more_set_input_headers 'Host: agentZH.org:1984';[m
[31m-        echo "host var: $host";[m
[31m-        echo "http_host var: $http_host";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-host var: agentzh.org[m
[31m-http_host var: agentZH.org:1984[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: clear all and re-insert[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers Host Connection Cache-Control Accept[m
[31m-                                 User-Agent Accept-Encoding Accept-Language[m
[31m-                                 Cookie;[m
[31m-[m
[31m-        more_set_input_headers "Host: a" "Connection: b" "Cache-Control: c"[m
[31m-                               "Accept: d" "User-Agent: e" "Accept-Encoding: f"[m
[31m-                               "Accept-Language: g" "Cookie: h";[m
[31m-[m
[31m-        more_clear_input_headers Host Connection Cache-Control Accept[m
[31m-                                 User-Agent Accept-Encoding Accept-Language[m
[31m-                                 Cookie;[m
[31m-[m
[31m-        more_set_input_headers "Host: a" "Connection: b" "Cache-Control: c"[m
[31m-                               "Accept: d" "User-Agent: e" "Accept-Encoding: f"[m
[31m-                               "Accept-Language: g" "Cookie: h";[m
[31m-[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Cache-Control: max-age=0\r[m
[31m-Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36\r[m
[31m-Accept-Encoding: gzip,deflate,sdch\r[m
[31m-Accept-Language: en-US,en;q=0.8\r[m
[31m-Cookie: test=cookie;\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: more_set_input_header does not override request headers with multiple values[m
[31m---- config[m
[31m-    #lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        more_set_input_headers "AAA: 111";[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers()[m
[31m-            ngx.say(headers["AAA"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-AAA: 123[m
[31m-AAA: 456[m
[31m-AAA: 678[m
[31m-[m
[31m---- response_body[m
[31m-111[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: clear If-Unmodified-Since req header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers 'If-Unmodified-Since';[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Last-Modified"] = "Tue, 30 Jun 2011 12:16:36 GMT"[m
[31m-            ngx.say("If-Unmodified-Since: ", ngx.var.http_if_unmodified_since)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Tue, 28 Jun 2011 12:16:36 GMT[m
[31m---- response_body[m
[31m-If-Unmodified-Since: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: clear If-Match req header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers 'If-Match';[m
[31m-        echo "If-Match: $http_if_match";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-Match: abc[m
[31m---- response_body[m
[31m-If-Match: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: clear If-None-Match req header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers 'If-None-Match';[m
[31m-        echo "If-None-Match: $http_if_none_match";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: *[m
[31m---- response_body[m
[31m-If-None-Match: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: set the Destination request header for WebDav[m
[31m---- config[m
[31m-    location = /a.txt {[m
[31m-        more_set_input_headers "Destination: /b.txt";[m
[31m-        dav_methods MOVE;[m
[31m-        dav_access            all:rw;[m
[31m-        root                  html;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-hello, world![m
[31m-[m
[31m---- request[m
[31m-MOVE /a.txt[m
[31m-[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-client sent no "Destination" header[m
[31m-[error][m
[31m---- error_code: 204[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: more_set_input_headers + X-Forwarded-For[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_set_input_headers "X-Forwarded-For: 8.8.8.8";[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Foo $proxy_add_x_forwarded_for;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Foo: 8.8.8.8, 127.0.0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: more_clear_input_headers + X-Forwarded-For[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        more_clear_input_headers "X-Forwarded-For";[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Foo $proxy_add_x_forwarded_for;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-X-Forwarded-For: 8.8.8.8[m
[31m---- response_body[m
[31m-Foo: 127.0.0.1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/phase.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/phase.t[m
[1mdeleted file mode 100644[m
[1mindex 343d2e5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/phase.t[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => 3;[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple set (1 arg)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        deny all;[m
[31m-        more_set_headers 'X-Foo: Blah';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex e316cac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,568 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 113;[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level("warn");[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple set (1 arg)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'X-Foo: Blah';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple set (2 args)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'X-Foo: Blah' 'X-Bar: hi';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m-X-Bar: hi[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: two sets in a single location[m
[31m---- config[m
[31m-    location /two {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'X-Foo: Blah'[m
[31m-        more_set_headers 'X-Bar: hi';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /two[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m-X-Bar: hi[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: two sets in a single location (for 404 too)[m
[31m---- config[m
[31m-    location /two {[m
[31m-        more_set_headers 'X-Foo: Blah'[m
[31m-        more_set_headers 'X-Bar: hi';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /two[m
[31m---- response_headers[m
[31m-X-Foo: Blah[m
[31m-X-Bar: hi[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set a header then clears it (500)[m
[31m---- config[m
[31m-    location /two {[m
[31m-        more_set_headers 'X-Foo: Blah';[m
[31m-        more_set_headers 'X-Foo:';[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /two[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m-! X-Bar[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set a header only when 500 (matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 500 'X-Mine: Hiya';[m
[31m-        more_set_headers -s 404 'X-Yours: Blah';[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-Mine: Hiya[m
[31m-! X-Yours[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set a header only when 500 (not matched with 200)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 500 'X-Mine: Hiya';[m
[31m-        more_set_headers -s 404 'X-Yours: Blah';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-Mine[m
[31m-! X-Yours[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set a header only when 500 (not matched with 404)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 500 'X-Mine: Hiya';[m
[31m-        more_set_headers -s 404 'X-Yours: Blah';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-Mine[m
[31m-X-Yours: Blah[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: more conditions[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s '503 404' 'X-Mine: Hiya';[m
[31m-        more_set_headers -s ' 404  413 ' 'X-Yours: Blah';[m
[31m-        return 503;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-Mine: Hiya[m
[31m-! X-Yours[m
[31m---- response_body_like: 503 Service[m
[31m---- error_code: 503[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: more conditions[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s '503 404' 'X-Mine: Hiya';[m
[31m-        more_set_headers -s ' 404   413 ' 'X-Yours: Blah';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-Mine: Hiya[m
[31m-X-Yours: Blah[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: more conditions[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s '503 404' 'X-Mine: Hiya';[m
[31m-        more_set_headers -s ' 404   413  ' 'X-Yours: Blah';[m
[31m-        return 413;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-Mine[m
[31m-X-Yours: Blah[m
[31m---- response_body_like: 413 Request Entity Too Large[m
[31m---- error_code: 413[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: simple -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/css';[m
[31m-        more_set_headers -t 'text/css' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: simple -t (not matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers -t 'text/css' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-CSS[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: multiple -t (not matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers -t 'text/javascript' -t 'text/css' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-CSS[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: multiple -t (matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers -t 'text/javascript' -t 'text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: multiple -t (matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/javascript';[m
[31m-        more_set_headers -t 'text/javascript' -t 'text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: multiple -t (matched) with extra spaces[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/javascript';[m
[31m-        more_set_headers -t ' text/javascript  ' -t 'text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: multiple -t merged[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/javascript';[m
[31m-        more_set_headers -t ' text/javascript  text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: multiple -t merged (2)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/plain';[m
[31m-        more_set_headers -t ' text/javascript  text/plain' 'X-CSS: yes';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-CSS: yes[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: multiple -s option in a directive (not matched)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 404 -s 500 'X-status: howdy';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-status[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: multiple -s option in a directive (matched 404)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 404 -s 500 'X-status: howdy';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: howdy[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: multiple -s option in a directive (matched 500)[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        more_set_headers -s 404 -s 500 'X-status: howdy';[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: howdy[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: -s mixed with -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: howdy2[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: -s mixed with -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -s 200 -t 'text/plain' 'X-status: howdy2';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-status[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: -s mixed with -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: howdy2[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: -s mixed with -t[m
[31m---- config[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 500 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-status[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: merge from the upper level[m
[31m---- config[m
[31m-    more_set_headers -s 404 -t 'text/html' 'X-status2: howdy3';[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 500 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status2: howdy3[m
[31m-! X-status[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: merge from the upper level[m
[31m---- config[m
[31m-    more_set_headers -s 404 -t 'text/html' 'X-status2: howdy3';[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 500 -s 200 -t 'text/html' 'X-status: howdy2';[m
[31m-        echo yeah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-! X-status2[m
[31m-X-status: howdy2[m
[31m---- response_body[m
[31m-yeah[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: override settings by inheritance[m
[31m---- config[m
[31m-    more_set_headers -s 404 -t 'text/html' 'X-status: yeah';[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -t 'text/html' 'X-status: nope';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: nope[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: append settings by inheritance[m
[31m---- config[m
[31m-    more_set_headers -s 404 -t 'text/html' 'X-status: yeah';[m
[31m-    location /bad {[m
[31m-        default_type 'text/html';[m
[31m-        more_set_headers -s 404 -t 'text/html' 'X-status2: nope';[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /bad[m
[31m---- response_headers[m
[31m-X-status: yeah[m
[31m-X-status2: nope[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: clear headers with wildcard[m
[31m---- config[m
[31m-    location = /backend {[m
[31m-        add_header X-Hidden-One "i am hidden";[m
[31m-        add_header X-Hidden-Two "me 2";[m
[31m-        echo hi;[m
[31m-    }[m
[31m-    location /hello {[m
[31m-        more_clear_headers 'X-Hidden-*';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /hello[m
[31m---- response_headers[m
[31m-! X-Hidden-One[m
[31m-! X-Hidden-Two[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: clear duplicate headers[m
[31m---- config[m
[31m-    location = /backend {[m
[31m-        add_header pragma no-cache;[m
[31m-        add_header pragma no-cache;[m
[31m-        echo hi;[m
[31m-    }[m
[31m-    location /hello {[m
[31m-        more_clear_headers 'pragma';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /hello[m
[31m---- response_headers[m
[31m-!pragma[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: HTTP 0.9 (set)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_headers 'X-Foo: howdy';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-ok[m
[31m---- http09[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 34e84c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-plan tests => blocks() * 3;[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: vars in input header directives[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /foo;[m
[31m-        echo "main: $http_user_agent";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        set $val 'dog';[m
[31m-[m
[31m-        more_set_input_headers 'User-Agent: $val';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo "sub: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- more_headers[m
[31m-User-Agent: my-sock[m
[31m---- response_body[m
[31m-sub: dog[m
[31m-main: dog[m
[31m---- response_headers[m
[31m-! Host[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: vars in input header directives[m
[31m---- config[m
[31m-    location /main {[m
[31m-        #more_set_input_headers 'User-Agent: cat';[m
[31m-        echo_location /foo;[m
[31m-        echo "main: $http_user_agent";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        set $val 'dog';[m
[31m-[m
[31m-        more_set_input_headers 'User-Agent: $val';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/proxy;[m
[31m-        #echo $http_user_agent;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        echo "sub: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub: dog[m
[31m-main: dog[m
[31m---- response_headers[m
[31m-! Host[m
[31m---- skip_nginx: 3: < 0.7.46[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/unused.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/unused.t[m
[1mdeleted file mode 100644[m
[1mindex 1f35adc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/unused.t[m
[1m+++ /dev/null[m
[36m@@ -1,175 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 2);[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level("warn");[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: used output filter[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers "Foo: bar";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_log[m
[31m-headers more header filter[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unused output filter (none)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-headers more header filter[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unused output filter (with more_set_input_headers only)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers "Foo: bar";[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-headers more header filter[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: used rewrite handler[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers "Foo: bar";[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_log[m
[31m-headers more rewrite handler[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: unused rewrite handler (none)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #more_set_input_headers "Foo: bar";[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-headers more rewrite handler[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: unused rewrite handler (with output header filters)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #more_set_input_headers "Foo: bar";[m
[31m-        echo hi;[m
[31m-        more_set_headers "Foo: bar";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-headers more rewrite handler[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple http {} blocks (filter)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        more_set_headers 'Foo: bar';[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-hi[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-headers more header filter[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: multiple http {} blocks (handler)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        more_set_input_headers 'Foo: bar';[m
[31m-        echo $http_foo;[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-bar[m
[31m---- no_error_log[m
[31m-headers more header handler[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/vars.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/vars.t[m
[1mdeleted file mode 100644[m
[1mindex 426c68c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/t/vars.t[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # 'no_plan';[m
[31m-[m
[31m-plan tests => 9;[m
[31m-[m
[31m-no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: vars[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        set $val 'hello, world';[m
[31m-        more_set_headers 'X-Foo: $val';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-X-Foo: hello, world[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: vars in both key and val[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hi;[m
[31m-        set $val 'hello, world';[m
[31m-        more_set_headers '$val: $val';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_headers[m
[31m-$val: hello, world[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: vars in input header directives[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $val 'dog';[m
[31m-        more_set_input_headers 'Host: $val';[m
[31m-        echo $host;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-dog[m
[31m---- response_headers[m
[31m-Host:[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 007194d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-        #--with-cc=gcc46 \[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-        --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB" \[m
[31m-        --without-mail_pop3_module \[m
[31m-        --without-mail_imap_module \[m
[31m-        --without-mail_smtp_module \[m
[31m-        --without-http_upstream_ip_hash_module \[m
[31m-        --without-http_empty_gif_module \[m
[31m-        --without-http_memcached_module \[m
[31m-        --without-http_referer_module \[m
[31m-        --without-http_autoindex_module \[m
[31m-        --without-http_auth_basic_module \[m
[31m-        --without-http_userid_module \[m
[31m-        --with-http_realip_module \[m
[31m-        --with-http_dav_module \[m
[31m-      --add-module=$root/../eval-nginx-module \[m
[31m-      --add-module=$root/../lua-nginx-module \[m
[31m-      --add-module=$root/../echo-nginx-module \[m
[31m-      --add-module=$root $opts \[m
[31m-      --with-debug[m
[31m-      #--add-module=$root/../ndk-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex bba7217..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/headers-more-nginx-module-0.30/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,215 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Cond[m
[31m-fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-obj:*[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_palloc_large[m
[31m-fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:lj_str_new[m
[31m-fun:lua_pushlstring[m
[31m-fun:ngx_http_lua_get_output_header[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr8[m
[31m-   fun:getenv[m
[31m-   fun:gcov_exit[m
[31m-   fun:exit[m
[31m-   fun:ngx_master_process_exit[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 8f16a99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-*.html[m
[31m-src/module.c[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-reindex[m
[31m-src/location.h[m
[31m-src/filter.c[m
[31m-src/subrequest.h[m
[31m-src/sleep.h[m
[31m-src/util.c[m
[31m-src/echo.c[m
[31m-src/info.c[m
[31m-src/util.h[m
[31m-src/var.h[m
[31m-src/filter.h[m
[31m-src/sleep.c[m
[31m-src/var.c[m
[31m-src/timer.c[m
[31m-src/module.h[m
[31m-src/echo.h[m
[31m-src/info.h[m
[31m-src/foreach.c[m
[31m-src/location.c[m
[31m-src/timer.h[m
[31m-src/module.c[m
[31m-src/subrequest.c[m
[31m-src/handler.h[m
[31m-src/foreach.h[m
[31m-src/handler.c[m
[31m-nginx[m
[31m-pack[m
[31m-all[m
[31m-t/servroot/[m
[31m-buildroot/[m
[31m-go[m
[31m-build1[01][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/config[m
[1mdeleted file mode 100644[m
[1mindex 2eed0ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/config[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    if test -n "$NDK_SRCS"; then[m
[31m-        echo "found ngx_devel_kit for ngx_iconv; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_iconv; please put it before ngx_iconv." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-else[m
[31m-    if echo $HTTP_MODULES | grep " ndk_http_module" > /dev/null; then[m
[31m-        echo "found ngx_devel_kit for ngx_iconv; looks good."[m
[31m-    else[m
[31m-        echo "error: ngx_devel_kit is required to build ngx_iconv; please put it before ngx_iconv." 1>&2[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <iconv.h>"[m
[31m-ngx_feature_test='iconv_t cd =  iconv_open("utf-8","gbk");[m
[31m-iconv_close(cd);'[m
[31m-[m
[31m-if [ -n "$LIBICONV_INC" -o -n "$LIBICONV_LIB" ]; then[m
[31m-    ngx_feature="libiconv in directories specified by LIBICONV_INC ($LIBICONV_INC) and LIBICONV_LIB ($LIBICONV_LIB)"[m
[31m-    ngx_feature_path="$LIBICONV_INC"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # test also with -liconv[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R$LIBICONV_LIB -L$LIBICONV_LIB -liconv"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L$LIBICONV_LIB -liconv"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-else[m
[31m-    # auto-discovery[m
[31m-    ngx_feature="libiconv"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # test also with -liconv[m
[31m-        ngx_feature_libs="-liconv"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        ngx_feature="libiconv in /usr/local/"[m
[31m-        ngx_feature_path="/usr/local/include"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -liconv"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/local/lib -liconv"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # NetBSD[m
[31m-        ngx_feature="libiconv in /usr/pkg/"[m
[31m-        ngx_feature_path="/usr/pkg/include/"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -liconv"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/pkg/lib -liconv"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # MacPorts[m
[31m-        ngx_feature="libiconv in /opt/local/"[m
[31m-        ngx_feature_path="/opt/local/include/"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -liconv"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/opt/local/lib -liconv"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-else[m
[31m- cat << END[m
[31m- $0: error: the ngx_iconv addon requires the iconv library.[m
[31m-END[m
[31m- exit 1[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_iconv_module[m
[31m-[m
[31m-HTTP_ICONV_DEPS="$ngx_addon_dir/src/ddebug.h"[m
[31m-HTTP_ICONV_SRCS="$ngx_addon_dir/src/ngx_http_iconv_module.c"[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps="$HTTP_ICONV_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_ICONV_SRCS"[m
[31m-    ngx_module_libs=[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_ICONV_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_ICONV_DEPS"[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex d4233e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "iconv *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#   if DDEBUG > 1[m
[31m-[m
[31m-#       define dd_enter() dd_enter_helper(r, __func__)[m
[31m-[m
[31m-[m
[31m-#       if defined(nginx_version) && nginx_version >= 8011[m
[31m-#           define dd_main_req_count r->main->count[m
[31m-#       else[m
[31m-#           define dd_main_req_count 0[m
[31m-#       endif[m
[31m-[m
[31m-static void dd_enter_helper(ngx_http_request_t *r, const char *func) {[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    fprintf(stderr, ">enter %s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            (int) dd_main_req_count, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf(stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#       define dd_enter()[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char * fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-static void dd_enter() {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/src/ngx_http_iconv_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/src/ngx_http_iconv_module.c[m
[1mdeleted file mode 100644[m
[1mindex 689475c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/src/ngx_http_iconv_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,743 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ndk.h>[m
[31m-#include <iconv.h>[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t        iconv_buf_size;[m
[31m-static ngx_int_t        max_iconv_bufs;[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t       ngx_http_iconv_filter_used = 0;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t               buf_size;[m
[31m-    ngx_flag_t           enabled;[m
[31m-    u_char              *from;[m
[31m-    u_char              *to;[m
[31m-} ngx_http_iconv_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                uc; /* unfinished character */[m
[31m-} ngx_http_iconv_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_iconv_filter_pre(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_iconv_filter_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_iconv_header_filter(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_iconv_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_iconv_filter_convert(ngx_http_request_t *r,[m
[31m-    ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out);[m
[31m-static ngx_int_t ngx_http_do_iconv(ngx_http_request_t *r, ngx_chain_t **c,[m
[31m-    void *data, size_t len, u_char *from, u_char *to, size_t *conv_bytes,[m
[31m-    size_t *rest_bytes);[m
[31m-static ngx_int_t ngx_http_iconv_merge_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out);[m
[31m-static char *ngx_http_iconv_conf_handler(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_set_iconv_conf_handler(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_http_set_iconv_handler(ngx_http_request_t *r,[m
[31m-    ngx_str_t *res, ngx_http_variable_value_t *v);[m
[31m-static void *ngx_http_iconv_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_iconv_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static void ngx_http_iconv_discard_body(ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_iconv_commands[] = {[m
[31m-[m
[31m-    { ngx_string("set_iconv"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE4,[m
[31m-      ngx_http_set_iconv_conf_handler,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL[m
[31m-    },[m
[31m-[m
[31m-    { ngx_string("iconv_buffer_size"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_iconv_loc_conf_t, buf_size),[m
[31m-      NULL[m
[31m-    },[m
[31m-[m
[31m-    { ngx_string("iconv_filter"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_iconv_conf_handler,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_iconv_module_ctx = {[m
[31m-    ngx_http_iconv_filter_pre,          /* preconfiguration */[m
[31m-    ngx_http_iconv_filter_init,         /* postconfiguration */[m
[31m-    NULL,                               /* create main configuration */[m
[31m-    NULL,                               /* init main configuration */[m
[31m-    NULL,                               /* create server configuration */[m
[31m-    NULL,                               /* merge server configuration */[m
[31m-    ngx_http_iconv_create_loc_conf,     /* create location configuration */[m
[31m-    ngx_http_iconv_merge_loc_conf       /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_iconv_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_iconv_module_ctx,     /* module context */[m
[31m-    ngx_http_iconv_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                /* module type */[m
[31m-    NULL,                           /* init maseter */[m
[31m-    NULL,                           /* init module */[m
[31m-    NULL,                           /* init process */[m
[31m-    NULL,                           /* init thread */[m
[31m-    NULL,                           /* exit thread */[m
[31m-    NULL,                           /* exit process */[m
[31m-    NULL,                           /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt   ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_filter_pre(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_iconv_filter_used  = 0;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    if (ngx_http_iconv_filter_used) {[m
[31m-        ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-        ngx_http_top_header_filter = ngx_http_iconv_header_filter;[m
[31m-        ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-        ngx_http_top_body_filter = ngx_http_iconv_body_filter;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t       *ilcf;[m
[31m-    ngx_http_iconv_ctx_t            *ctx;[m
[31m-[m
[31m-    ilcf = ngx_http_get_module_loc_conf(r, ngx_http_iconv_module);[m
[31m-    if (!ilcf->enabled) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                      "iconv does not support HTTP < 1.0 yet");[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version == NGX_HTTP_VERSION_10) {[m
[31m-        r->keepalive = 0;[m
[31m-    }[m
[31m-[m
[31m-    iconv_buf_size = ilcf->buf_size;[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_iconv_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        dd("create new context");[m
[31m-        /*[m
[31m-         * set by ngx_pcalloc()[m
[31m-         *   ctx->uc->len = 0[m
[31m-         *   ctx->uc->data = NULL[m
[31m-         */[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_iconv_module));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_iconv_module);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t                         *ncl, *nncl;[m
[31m-    ngx_http_iconv_ctx_t                *ctx;[m
[31m-    ngx_int_t                            rc;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_iconv_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        dd("XXX in is NULL");[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (in->buf->last == in->buf->pos) {[m
[31m-        dd("pass 0 size buf to next body filter");[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    dd("create new chain link");[m
[31m-[m
[31m-    if (ngx_http_iconv_merge_chain_link(r, ctx, in, &ncl) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("discard previous chain link");[m
[31m-[m
[31m-    ngx_http_iconv_discard_body(in);[m
[31m-[m
[31m-    dd("start to convert");[m
[31m-[m
[31m-    rc = ngx_http_iconv_filter_convert(r, ctx, ncl, &nncl);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("iconv convertion error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (nncl == NULL) {[m
[31m-        dd ("nncl is NULL");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("pass to next body filter->\n%.*s",[m
[31m-       (int) (ncl->buf->last - ncl->buf->pos), ncl->buf->pos);[m
[31m-[m
[31m-    dd("nncl: len: %d, sync: %d, last_buf: %d, flush: %d, next: %p",[m
[31m-       (int) (nncl->buf->last - nncl->buf->pos),[m
[31m-       nncl->buf->sync, nncl->buf->last_buf,[m
[31m-       nncl->buf->flush, nncl->next);[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, nncl);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_merge_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out)[m
[31m-{[m
[31m-    ngx_chain_t             *cl, *ncl;[m
[31m-    ngx_buf_t               *buf;[m
[31m-    size_t                   len = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        len += buf->last - buf->pos;[m
[31m-[m
[31m-        dd("len: %d", (int) len);[m
[31m-        dd("sync: %d, last_buf: %d, flush: %d, memory: %d, in-file: %d, "[m
[31m-           "temp: %d", (int) buf->sync, (int) buf->last_buf,[m
[31m-           (int) buf->flush, (int) buf->memory, (int) buf->in_file,[m
[31m-           (int) buf->temporary);[m
[31m-    }[m
[31m-[m
[31m-    len += ctx->uc.len;[m
[31m-    /* requires C99 */[m
[31m-[m
[31m-    dd("XXX count buffer length: %zu", len);[m
[31m-[m
[31m-    ncl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (ncl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ncl->buf = buf;[m
[31m-    if (ctx->uc.len) {[m
[31m-        dd("copy unfinished character");[m
[31m-        buf->last = ngx_copy(buf->start, ctx->uc.data, ctx->uc.len);[m
[31m-    }[m
[31m-[m
[31m-    dd("copy old chain link");[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        if (cl->buf->last > cl->buf->pos) {[m
[31m-            buf->last = ngx_copy(buf->last, cl->buf->pos,[m
[31m-                                 cl->buf->last - cl->buf->pos);[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->sync) {[m
[31m-            buf->sync = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->flush) {[m
[31m-            buf->flush = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(cl->buf) && !ngx_buf_special(cl->buf)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "ngx_iconv only supports in-memory bufs");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            dd("find last buf");[m
[31m-            buf->last_buf = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ncl->next = NULL;[m
[31m-    *out = ncl;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_iconv_filter_convert(ngx_http_request_t *r,[m
[31m-    ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t   *ilcf;[m
[31m-    size_t                       rest;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    rest = 0;[m
[31m-    ilcf = ngx_http_get_module_loc_conf(r, ngx_http_iconv_module);[m
[31m-[m
[31m-    dd("XXX in->buf: %.*s",[m
[31m-       (int) (in->buf->last - in->buf->pos),[m
[31m-       in->buf->pos);[m
[31m-[m
[31m-    dd("XXX last buf: %d",[m
[31m-       (int) in->buf->last_buf);[m
[31m-[m
[31m-    if (in->buf->last - in->buf->pos) {[m
[31m-        rc = ngx_http_do_iconv(r, out, in->buf->pos,[m
[31m-                               in->buf->last - in->buf->pos, ilcf->from,[m
[31m-                               ilcf->to, NULL, &rest);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "convert error from ngx_http_do_iconv");[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->last_buf) {[m
[31m-            for (cl = *out; cl->next; cl = cl->next) {[m
[31m-                /* do nothing */[m
[31m-            }[m
[31m-            cl->buf->last_buf = 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        *out = in;[m
[31m-    }[m
[31m-[m
[31m-    dd("ilcf->to:%s", ilcf->to);[m
[31m-[m
[31m-    if (rest) {[m
[31m-        ctx->uc.data = ngx_palloc(r->pool, rest);[m
[31m-        if (ctx->uc.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("%p, %p, %zu", ctx->uc.data, in->buf->last, rest);[m
[31m-[m
[31m-        ngx_memcpy(ctx->uc.data, in->buf->last - rest, rest);[m
[31m-[m
[31m-        ctx->uc.len = rest;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->uc.data = NULL;[m
[31m-        ctx->uc.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_do_iconv(ngx_http_request_t *r, ngx_chain_t **c, void *data,[m
[31m-    size_t len, u_char *from, u_char *to, size_t *conved_bytes,[m
[31m-    size_t *rest_bytes)[m
[31m-{[m
[31m-    iconv_t           cd;[m
[31m-    ngx_chain_t      *cl, *chain, **ll;[m
[31m-    ngx_buf_t        *b;[m
[31m-    size_t            cv, rest, rv;[m
[31m-[m
[31m-    cv = 0;[m
[31m-    dd("iconv from=%s, to=%s", from, to);[m
[31m-    cd = iconv_open((const char *) to, (const char *) from);[m
[31m-[m
[31m-    if (cd == (iconv_t) -1) {[m
[31m-        dd("iconv open error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("len=%zu, iconv_buf_size=%zu", len, iconv_buf_size);[m
[31m-    ll = &chain;[m
[31m-[m
[31m-conv_begin:[m
[31m-[m
[31m-    while (len) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            iconv_close(cd);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        /* --- b->temporary--- */[m
[31m-        b = ngx_create_temp_buf(r->pool, iconv_buf_size);[m
[31m-        if (b == NULL) {[m
[31m-            iconv_close(cd);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        rest = iconv_buf_size;[m
[31m-[m
[31m-        do {[m
[31m-            rv = iconv(cd, (void *) &data, &len, (void *) &b->last, &rest);[m
[31m-[m
[31m-            if (rv == (size_t) -1) {[m
[31m-                if (errno == EINVAL) {[m
[31m-                    cv += iconv_buf_size - rest;[m
[31m-                    dd("iconv error:EINVAL,len=%d cv=%d rest=%d", (int) len,[m
[31m-                       (int) cv, (int) rest);[m
[31m-                    goto conv_done;[m
[31m-                }[m
[31m-[m
[31m-                if (errno == E2BIG) {[m
[31m-                    dd("E2BIG");[m
[31m-                    /* E2BIG error is not considered*/[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (errno == EILSEQ) {[m
[31m-                    ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                                  "iconv sees invalid character sequence "[m
[31m-                                  "(EILSEQ)");[m
[31m-[m
[31m-                    if (len >= 1) {[m
[31m-                        if (rest == 0) {[m
[31m-                            dd("EILSEQ:rest=0");[m
[31m-                            cv += iconv_buf_size - rest;[m
[31m-                            *ll = cl;[m
[31m-                            ll = &cl->next;[m
[31m-                            goto conv_begin;[m
[31m-[m
[31m-                        } else {[m
[31m-                            dd("EILSEQ:rest=%d", (int) rest);[m
[31m-                            len--;[m
[31m-                            data = (u_char *)data + 1;[m
[31m-                            /* replace illegal character to '?' */[m
[31m-                            *b->last = '?';[m
[31m-                            b->last = (u_char *)b->last + 1;[m
[31m-                            rest--;[m
[31m-                        }[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto conv_done;[m
[31m-                    }[m
[31m-[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } while (rv == (size_t) -1 && errno == EILSEQ);[m
[31m-[m
[31m-        /* E2BIG error is not considered*/[m
[31m-        /* this code can work but stops when meet illegal encoding */[m
[31m-        /*[m
[31m-        if (rv == (size_t) -1) {[m
[31m-            if (errno == EILSEQ) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                        "iconv error:EILSEQ");[m
[31m-                iconv_close(cd);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (errno == EINVAL) {[m
[31m-                cv += iconv_buf_size - rest;[m
[31m-                dd("iconv error:EINVAL,len=%d cv=%d rest=%d", (int) len,[m
[31m-                        (int) cv, (int) rest);[m
[31m-                break;[m
[31m-            } else if (errno == E2BIG) {[m
[31m-                dd("iconv error:E2BIG");[m
[31m-            }[m
[31m-        }[m
[31m-        */[m
[31m-        cv += iconv_buf_size - rest;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-conv_done:[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-    if (conved_bytes) {[m
[31m-        *conved_bytes = cv;[m
[31m-    }[m
[31m-[m
[31m-    if (rest_bytes) {[m
[31m-        dd("rest bytes:%zu", len);[m
[31m-        *rest_bytes = len;[m
[31m-    }[m
[31m-[m
[31m-    if (c) {[m
[31m-        dd("chain: %p", chain);[m
[31m-[m
[31m-        /* chain may be null */[m
[31m-        /*[m
[31m-        dd("conv done: chain buf: %.*s",[m
[31m-                (int) (chain->buf->last - chain->buf->pos),[m
[31m-                chain->buf->last);[m
[31m-        */[m
[31m-        *c = chain;[m
[31m-    }[m
[31m-[m
[31m-    dd("out");[m
[31m-    iconv_close(cd);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_iconv_discard_body(ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_iconv_conf_handler(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t   *ilcf;[m
[31m-    ngx_str_t                   *value;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       tl;[m
[31m-    ilcf = conf;[m
[31m-[m
[31m-    ngx_http_iconv_filter_used = 1;[m
[31m-[m
[31m-    ilcf->enabled = 1;[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    tl = sizeof("from=") - 1;[m
[31m-    if (ngx_strncasecmp((u_char *) "from=", value[1].data, tl)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        dd("invalid 'from='");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ilcf->from = ngx_palloc(cf->pool, value[1].len - tl + 1);[m
[31m-    if (ilcf->from == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(ilcf->from, value[1].data + tl, value[1].len - tl);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    tl = sizeof("to=") - 1;[m
[31m-    if (ngx_strncasecmp((u_char *) "to=", value[2].data, tl)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        dd("invalid 'to='");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ilcf->to = ngx_palloc(cf->pool, value[2].len - tl + 1);[m
[31m-    if (ilcf->to == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(ilcf->to, value[2].data + tl, value[2].len - tl);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    dd("iconv_filter:from=%s to=%s", ilcf->from, ilcf->to);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_iconv_conf_handler(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ndk_set_var_t                filter;[m
[31m-    ngx_str_t                   *value, s[3];[m
[31m-[m
[31m-    max_iconv_bufs = 256;[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.func = ngx_http_set_iconv_handler;[m
[31m-    filter.size = 3;[m
[31m-[m
[31m-    /* set_iconv $dst $src from= to= */[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-    s[0] = value[1];[m
[31m-[m
[31m-    s[1] = value[2];[m
[31m-    if (ngx_strncasecmp((u_char *) "from=", s[1].data, sizeof("from=") - 1)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s[1].data += sizeof("from=") - 1;[m
[31m-    s[1].len -= (sizeof("from=") - 1);[m
[31m-[m
[31m-    s[2] = value[3];[m
[31m-    if (ngx_strncasecmp((u_char *) "to=", s[2].data, sizeof("to=") - 1) != 0) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s[2].data += sizeof("to=") - 1;[m
[31m-    s[2].len -= (sizeof("to=") - 1);[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, value, s, &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_iconv_handler(ngx_http_request_t *r, ngx_str_t *res,[m
[31m-    ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    ngx_chain_t                 *cl, *chain;[m
[31m-    ngx_buf_t                   *buf;[m
[31m-    u_char                      *src, *dst, *p;[m
[31m-    size_t                       converted;[m
[31m-    u_char *                     end;[m
[31m-    ngx_http_iconv_loc_conf_t   *ilcf;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    if (v->len == 0) {[m
[31m-        res->data = NULL;[m
[31m-        res->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ilcf = ngx_http_get_module_loc_conf(r, ngx_http_iconv_module);[m
[31m-    iconv_buf_size = ilcf->buf_size;[m
[31m-    dd("iconv_buf_size=%d", (int) iconv_buf_size);[m
[31m-[m
[31m-    src = ngx_palloc(r->pool, v[1].len + 1);[m
[31m-    if (src == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dst = ngx_palloc(r->pool, v[2].len + 1);[m
[31m-    if (dst == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    end = ngx_copy(src, v[1].data, v[1].len);[m
[31m-    *end = '\0';[m
[31m-    end = ngx_copy(dst, v[2].data, v[2].len);[m
[31m-    *end = '\0';[m
[31m-[m
[31m-    dd("dst:%s\n, src:%s\n", dst, src);[m
[31m-    rc = ngx_http_do_iconv(r, &chain, v[0].data, v[0].len, src, dst,[m
[31m-                           &converted, NULL);[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("convert error");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    res->data = ngx_palloc(r->pool, converted);[m
[31m-    if (res->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = res->data;[m
[31m-    res->len = converted;[m
[31m-[m
[31m-    for (cl = chain; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        dd("after convert, buf:%.*s", (int) (buf->last - buf->pos), buf->pos);[m
[31m-        p = ngx_copy(p, buf->pos, buf->last - buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    dd("%.*s\n%.*s\n%.*s\n", v[0].len, v[0].data, v[1].len, v[1].data, v[2].len,[m
[31m-       v[2].data);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_iconv_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t       *ilcf;[m
[31m-[m
[31m-    ilcf = ngx_palloc(cf->pool, sizeof(ngx_http_iconv_loc_conf_t));[m
[31m-    if (ilcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ilcf->buf_size = NGX_CONF_UNSET_SIZE;[m
[31m-    ilcf->enabled = NGX_CONF_UNSET;[m
[31m-    ilcf->from = NGX_CONF_UNSET_PTR;[m
[31m-    ilcf->to = NGX_CONF_UNSET_PTR;[m
[31m-    return ilcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_iconv_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_iconv_loc_conf_t       *conf, *prev;[m
[31m-[m
[31m-    conf = child;[m
[31m-    prev = parent;[m
[31m-[m
[31m-    dd("before merge:conf->size=%d,prev->size=%d", (int) conf->buf_size,[m
[31m-       (int) prev->buf_size);[m
[31m-[m
[31m-    if (conf->buf_size <= 1 || prev->buf_size <= 1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "iconv_buffer_size must not less than 2 bytes");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buf_size, prev->buf_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    dd("after merge:conf->size=%d,prev->size=%d", (int) conf->buf_size,[m
[31m-       (int) prev->buf_size);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enabled, prev->enabled, 0);[m
[31m-    ngx_conf_merge_ptr_value(conf->from, (void *)prev->from, (char *) "utf-8");[m
[31m-    ngx_conf_merge_ptr_value(conf->to, (void *)prev->to, (char *) "gbk");[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 8d05e43..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 3);[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: used with rds_json[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rds_json_ret 100 '你好';[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body eval[m
[31m-"{\"errcode\":100,\"errstr\":\"你好\"}"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: content in buf than set flush flag[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n '你';[m
[31m-        echo_flush;[m
[31m-        echo '好';[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: iconv used with local file[m
[31m---- config[m
[31m-    location /data.txt {[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> data.txt[m
[31m-你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好[m
[31m---- request[m
[31m-GET /data.txt[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: content in buf than set flush flag[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-        default_type text/plain;[m
[31m-        more_clear_headers Date;[m
[31m-        echo $arg_v;[m
[31m-    }[m
[31m-[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location = /main {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            assert(sock:connect("127.0.0.1", $TEST_NGINX_SERVER_PORT))[m
[31m-            assert(sock:send("GET /t?v=你好\\r\\n"))[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.say("error: ", err)[m
[31m-            else[m
[31m-                ngx.print(res)[m
[31m-            end[m
[31m-            assert(sock:connect("127.0.0.1", $TEST_NGINX_SERVER_PORT))[m
[31m-            assert(sock:send("GET /t?v=你好 HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"))[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.say("error: ", err)[m
[31m-            else[m
[31m-                ngx.print(res)[m
[31m-            end[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"你好[m
[31m-HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-\x{c4}\x{e3}\x{ba}\x{c3}[m
[31m-"[m
[31m---- grep_error_log eval: qr/iconv does not support HTTP < 1.0 yet/[m
[31m---- grep_error_log_out[m
[31m-iconv does not support HTTP < 1.0 yet[m
[31m---- error_log[m
[31m-[warn][m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 9b66795..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-#no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic convertion[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $src '你好';[m
[31m-        set_iconv $dst $src from=utf-8 to=gbk;[m
[31m-        echo $dst;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: more complex convertion[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $src '淘宝网 - 亚洲最大、最安全的网上交易平台，提供各类服饰、美容、家居、数码、话费/点卡充值… 2亿优质特价商品，同时提供担保交易(先收货后付款)、先行赔付、假一赔三、七天无理由退换货、数码免费维修等安全交易保障服务，让你全面安心享受网上购物乐趣！';[m
[31m-        set_iconv $dst $src from=UTF-8 to=gbk;[m
[31m-        echo $dst;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-淘宝网 - 亚洲最大、最安全的网上交易平台，提供各类服饰、美容、家居、数码、话费/点卡充值… 2亿优质特价商品，同时提供担保交易(先收货后付款)、先行赔付、假一赔三、七天无理由退换货、数码免费维修等安全交易保障服务，让你全面安心享受网上购物乐趣！[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: large iconv_buffer_size[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $src '你好';[m
[31m-        iconv_buffer_size 1M;[m
[31m-        set_iconv $dst $src from=utf-8 to=GBK;[m
[31m-        echo $dst;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: iconv content filter[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        echo '你好';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: content in multi buf[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        #set_unescape_uri $a $arg_a;[m
[31m-        #set_unescape_uri $b $arg_b;[m
[31m-        #set_unescape_uri $c $arg_c;[m
[31m-        #set_unescape_uri $d $arg_d;[m
[31m-        echo -n $arg_a;[m
[31m-        echo -n $arg_b;[m
[31m-        echo -n $arg_c;[m
[31m-        echo  $arg_d;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=你&b=好&c=世&d=界[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好世界[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: content in multi buf[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        set_unescape_uri $a $arg_a;[m
[31m-        set_unescape_uri $b $arg_b;[m
[31m-        set_unescape_uri $c $arg_c;[m
[31m-        set_unescape_uri $d $arg_d;[m
[31m-        set_unescape_uri $e $arg_e;[m
[31m-        set_unescape_uri $f $arg_f;[m
[31m-        echo -n $a;[m
[31m-        echo -n $b;[m
[31m-        echo -n $c;[m
[31m-        echo -n $d;[m
[31m-        echo -n $e;[m
[31m-        echo  $f;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=%e4&b=%bd&c=%a0&d=%e5&e=%a5&f=%bd[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: content in multi buf[m
[31m---- config[m
[31m-location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        iconv_buffer_size 1k;[m
[31m-        set_unescape_uri $a $arg_a;[m
[31m-        set_unescape_uri $b $arg_b;[m
[31m-        set_unescape_uri $c $arg_c;[m
[31m-        set_unescape_uri $d $arg_d;[m
[31m-        set_unescape_uri $e $arg_e;[m
[31m-        set_unescape_uri $f $arg_f;[m
[31m-        echo -n $a;[m
[31m-        echo -n $b;[m
[31m-        echo -n $c;[m
[31m-        echo -n $d;[m
[31m-        echo -n $e;[m
[31m-        echo  $f;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo?a=%e4&b=%bd&c=%a0&d=%e5&e=%a5&f=%bd[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: some complex text[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 2;[m
[31m-        echo '106,纪梵希 蜜粉,8,4.5,62.5%[m
[31m-107,时空胶囊,8,3.2857142857143,42.86%[m
[31m-108,雅顿 vc 美白 胶囊,8,7,14.29%[m
[31m-109,水磁场,8,5,14.29%[m
[31m-110,GEL,8,1,100%[m
[31m-111,雅顿 润唇膏 正品,8,8,20%[m
[31m-112,玫瑰面膜,8,1.5,87.5%[m
[31m-113,露得清 祛痘,8,5.1428571428571,42.86%[m
[31m-114,美白水,8,4.75,50%[m
[31m-115,ë,8,1.875,87.5%[m
[31m-116,大米粉,8,1.25,75%[m
[31m-350,薇姿油脂调护洁面啫喱,2,1,100%[m
[31m-475,啫喱 屈臣氏,1,1,100%[m
[31m-569,洗面奶啫喱,1,1,100%';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-106,纪梵希 蜜粉,8,4.5,62.5%[m
[31m-107,时空胶囊,8,3.2857142857143,42.86%[m
[31m-108,雅顿 vc 美白 胶囊,8,7,14.29%[m
[31m-109,水磁场,8,5,14.29%[m
[31m-110,GEL,8,1,100%[m
[31m-111,雅顿 润唇膏 正品,8,8,20%[m
[31m-112,玫瑰面膜,8,1.5,87.5%[m
[31m-113,露得清 祛痘,8,5.1428571428571,42.86%[m
[31m-114,美白水,8,4.75,50%[m
[31m-115,??,8,1.875,87.5%[m
[31m-116,大米粉,8,1.25,75%[m
[31m-350,薇姿油脂调护洁面啫喱,2,1,100%[m
[31m-475,啫喱 屈臣氏,1,1,100%[m
[31m-569,洗面奶啫喱,1,1,100%[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9:[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 10;[m
[31m-        echo '106,纪梵希 蜜粉,8,4.5,62.5%[m
[31m-107,时空胶囊,8,3.2857142857143,42.86%[m
[31m-108,雅顿 vc 美白 胶囊,8,7,14.29%[m
[31m-109,水磁场,8,5,14.29%[m
[31m-110,GEL,8,1,100%[m
[31m-111,雅顿 润唇膏 正品,8,8,20%[m
[31m-112,玫瑰面膜,8,1.5,87.5%[m
[31m-113,露得清 祛痘,8,5.1428571428571,42.86%[m
[31m-114,美白水,8,4.75,50%[m
[31m-115,ë,8,1.875,87.5%[m
[31m-116,大米粉,8,1.25,75%[m
[31m-350,薇姿油脂调护洁面啫喱,2,1,100%[m
[31m-475,啫喱 屈臣氏,1,1,100%[m
[31m-569,洗面奶啫喱,1,1,100%';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-106,纪梵希 蜜粉,8,4.5,62.5%[m
[31m-107,时空胶囊,8,3.2857142857143,42.86%[m
[31m-108,雅顿 vc 美白 胶囊,8,7,14.29%[m
[31m-109,水磁场,8,5,14.29%[m
[31m-110,GEL,8,1,100%[m
[31m-111,雅顿 润唇膏 正品,8,8,20%[m
[31m-112,玫瑰面膜,8,1.5,87.5%[m
[31m-113,露得清 祛痘,8,5.1428571428571,42.86%[m
[31m-114,美白水,8,4.75,50%[m
[31m-115,??,8,1.875,87.5%[m
[31m-116,大米粉,8,1.25,75%[m
[31m-350,薇姿油脂调护洁面啫喱,2,1,100%[m
[31m-475,啫喱 屈臣氏,1,1,100%[m
[31m-569,洗面奶啫喱,1,1,100%[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: text that can't be converted, buffer size smaller than content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 2;[m
[31m-        echo 'ë?';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: text that can't be converted, buffer size smaller than content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 2;[m
[31m-        echo '?ë';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: text that can't be converted, buffer size smaller than content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 3;[m
[31m-        echo '?ë';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: text that can't be converted, buffer size equals content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 4;[m
[31m-        echo '?ë';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: text that can't be converted, buffer size larger than content[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        iconv_buffer_size 5;[m
[31m-        echo '?ë';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-???[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: iconv_filter used with proxy_pass[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/bar;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        content_by_lua 'ngx.print("这是一段文本")';[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body chop[m
[31m-这是一段文本[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: iconv content filter / HTTP 1.0[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=GBK;[m
[31m-        echo '你好';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo HTTP/1.0[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: iconv used together with proxy[m
[31m---- config[m
[31m-    location /data.txt {[m
[31m-        iconv_filter from=utf8 to=gbk;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/data.txt;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> data.txt[m
[31m-你好[m
[31m---- request[m
[31m-GET /proxy[m
[31m---- charset: gbk[m
[31m---- response_body[m
[31m-你好[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: iconv_filter used with proxy_pass[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/bar;[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        content_by_lua 'ngx.print("这是一段文本")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body chop[m
[31m-这是一段文本[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: iconv_filter used with proxy_pass[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        content_by_lua 'ngx.print("这是一段文本")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- charset: gbk[m
[31m---- response_body chop[m
[31m-这是一段文本[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: iconv_filter used with proxy_pass[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #set_form_input $data;[m
[31m-        proxy_pass $scheme://127.0.0.1:$server_port/bar;[m
[31m-        proxy_http_version 1.0;[m
[31m-        #echo $data;[m
[31m-    }[m
[31m-    location /bar {[m
[31m-        echo -n "你好";[m
[31m-        iconv_filter from=utf-8 to=gbk;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-GET /foo[m
[31m---- charset: gbk[m
[31m---- response_body chop[m
[31m-你好[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 9f61937..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-         #--with-cc="gcc46" \[m
[31m-ngx-build $force $version \[m
[31m-          --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:/usr/local/lib" \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root/../ndk-nginx-module \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-          --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$root/../form-input-nginx-module \[m
[31m-          --add-module=$root/../rds-json-nginx-module \[m
[31m-          --add-module=$root/../headers-more-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-            --with-debug \[m
[31m-          || exit 1[m
[31m-          #--with-debug || exit 1[m
[31m-          #--add-module=$home/work/ngx_http_auth_request-0.1 #\[m
[31m-          #--with-rtsig_module[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 3ac1380..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/iconv-nginx-module-0.14/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,166 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-obj:*[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:lj_str_new[m
[31m-fun:lua_getfield[m
[31m-fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   a1 [m
[31m-   Memcheck:Leak[m
[31m-   fun:_vgrZU_libcZdsoZa_malloc[m
[31m-   fun:ngx_strerror_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <a2>[m
[31m-   Memcheck:Leak[m
[31m-   fun:_vgrZU_libcZdsoZa_malloc[m
[31m-   fun:ngx_strerror_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <a3>[m
[31m-   Memcheck:Leak[m
[31m-   fun:_vgrZU_libcZdsoZa_malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <a4>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   /lib/libc-2.12.so[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/install b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/install[m
[1mdeleted file mode 100755[m
[1mindex 34ae937..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/install[m
[1m+++ /dev/null[m
[36m@@ -1,98 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use Getopt::Std qw(getopts);[m
[31m-[m
[31m-my %opts;[m
[31m-getopts("dm:", \%opts) or usage();[m
[31m-[m
[31m-my $mode = $opts{m};[m
[31m-[m
[31m-if ($opts{d}) {[m
[31m-    shell("mkdir -p @ARGV");[m
[31m-    exit;[m
[31m-}[m
[31m-[m
[31m-if (@ARGV < 2) {[m
[31m-    usage();[m
[31m-}[m
[31m-[m
[31m-my $dst = pop;[m
[31m-[m
[31m-my @src = @ARGV;[m
[31m-[m
[31m-my $target_dir;[m
[31m-[m
[31m-if (@src > 1 || $dst =~ m{/$}) {[m
[31m-    $target_dir = $dst;[m
[31m-[m
[31m-} elsif (-d $dst) {[m
[31m-    $target_dir = $dst;[m
[31m-[m
[31m-} elsif ($dst =~ m{(.+)/}) {[m
[31m-    $target_dir = $1;[m
[31m-[m
[31m-} else {[m
[31m-    $target_dir = '.';[m
[31m-}[m
[31m-[m
[31m-if (!-d $target_dir) {[m
[31m-    shell("mkdir -p $target_dir");[m
[31m-}[m
[31m-[m
[31m-if (-f $dst) {[m
[31m-    shell("rm $dst");[m
[31m-[m
[31m-} else {[m
[31m-    for my $f (@src) {[m
[31m-        if (-f $f) {[m
[31m-            (my $name = $f) =~ s{.*/}{}g;[m
[31m-            my $target = "$target_dir/$name";[m
[31m-            if (-f $target) {[m
[31m-                shell("rm $target");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-shell("cp @src $dst");[m
[31m-[m
[31m-if (-f $dst) {[m
[31m-    if (defined $mode) {[m
[31m-        chmod oct($mode), $dst or[m
[31m-            die "failed to change mode of $dst to $mode.\n";[m
[31m-    }[m
[31m-[m
[31m-    exit;[m
[31m-}[m
[31m-[m
[31m-for my $src (@src) {[m
[31m-    my $name;[m
[31m-[m
[31m-    if ($src =~ m{/([^/]+)$}) {[m
[31m-        $name = $1;[m
[31m-[m
[31m-    } else {[m
[31m-        $name = $src;[m
[31m-    }[m
[31m-[m
[31m-    if (defined $mode) {[m
[31m-        my $target = "$target_dir/$name";[m
[31m-        chmod oct($mode), $target or[m
[31m-            die "failed to change mode of $target to $mode.\n";[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-sub usage {[m
[31m-    die "Usage: install [-d] [-m <attrs>] <src>... <dst>\n";[m
[31m-}[m
[31m-[m
[31m-sub shell {[m
[31m-    my $cmd = shift;[m
[31m-    #warn $cmd;[m
[31m-    system($cmd) == 0 or[m
[31m-        die "failed to run command $cmd\n";[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/COPYRIGHT b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/COPYRIGHT[m
[1mdeleted file mode 100644[m
[1mindex a860268..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/COPYRIGHT[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-Lua License[m
[31m------------[m
[31m-[m
[31m-Lua is licensed under the terms of the MIT license reproduced below.[m
[31m-This means that Lua is free software and can be used for both academic[m
[31m-and commercial purposes at absolutely no cost.[m
[31m-[m
[31m-For details and rationale, see http://www.lua.org/license.html .[m
[31m-[m
[31m-===============================================================================[m
[31m-[m
[31m-Copyright (C) 1994-2012 Lua.org, PUC-Rio.[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining a copy[m
[31m-of this software and associated documentation files (the "Software"), to deal[m
[31m-in the Software without restriction, including without limitation the rights[m
[31m-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell[m
[31m-copies of the Software, and to permit persons to whom the Software is[m
[31m-furnished to do so, subject to the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be included in[m
[31m-all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR[m
[31m-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,[m
[31m-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE[m
[31m-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER[m
[31m-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,[m
[31m-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN[m
[31m-THE SOFTWARE.[m
[31m-[m
[31m-===============================================================================[m
[31m-[m
[31m-(end of COPYRIGHT)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/HISTORY b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/HISTORY[m
[1mdeleted file mode 100644[m
[1mindex ce0c95b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/HISTORY[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-HISTORY for Lua 5.1[m
[31m-[m
[31m-* Changes from version 5.0 to 5.1[m
[31m-  -------------------------------[m
[31m-  Language:[m
[31m-  + new module system.[m
[31m-  + new semantics for control variables of fors.[m
[31m-  + new semantics for setn/getn.[m
[31m-  + new syntax/semantics for varargs.[m
[31m-  + new long strings and comments.[m
[31m-  + new `mod' operator (`%')[m
[31m-  + new length operator #t[m
[31m-  + metatables for all types[m
[31m-  API:[m
[31m-  + new functions: lua_createtable, lua_get(set)field, lua_push(to)integer.[m
[31m-  + user supplies memory allocator (lua_open becomes lua_newstate).[m
[31m-  + luaopen_* functions must be called through Lua.[m
[31m-  Implementation:[m
[31m-  + new configuration scheme via luaconf.h.[m
[31m-  + incremental garbage collection.[m
[31m-  + better handling of end-of-line in the lexer.[m
[31m-  + fully reentrant parser (new Lua function `load')[m
[31m-  + better support for 64-bit machines.[m
[31m-  + native loadlib support for Mac OS X.[m
[31m-  + standard distribution in only one library (lualib.a merged into lua.a)[m
[31m-[m
[31m-* Changes from version 4.0 to 5.0[m
[31m-  -------------------------------[m
[31m-  Language:[m
[31m-  + lexical scoping.[m
[31m-  + Lua coroutines.[m
[31m-  + standard libraries now packaged in tables.[m
[31m-  + tags replaced by metatables and tag methods replaced by metamethods,[m
[31m-    stored in metatables.[m
[31m-  + proper tail calls.[m
[31m-  + each function can have its own global table, which can be shared.[m
[31m-  + new __newindex metamethod, called when we insert a new key into a table.[m
[31m-  + new block comments: --[[ ... ]].[m
[31m-  + new generic for.[m
[31m-  + new weak tables.[m
[31m-  + new boolean type.[m
[31m-  + new syntax "local function".[m
[31m-  + (f()) returns the first value returned by f.[m
[31m-  + {f()} fills a table with all values returned by f.[m
[31m-  + \n ignored in [[\n .[m
[31m-  + fixed and-or priorities.[m
[31m-  + more general syntax for function definition (e.g. function a.x.y:f()...end).[m
[31m-  + more general syntax for function calls (e.g. (print or write)(9)).[m
[31m-  + new functions (time/date, tmpfile, unpack, require, load*, etc.).[m
[31m-  API:[m
[31m-  + chunks are loaded by using lua_load; new luaL_loadfile and luaL_loadbuffer.[m
[31m-  + introduced lightweight userdata, a simple "void*" without a metatable.[m
[31m-  + new error handling protocol: the core no longer prints error messages;[m
[31m-    all errors are reported to the caller on the stack.[m
[31m-  + new lua_atpanic for host cleanup.[m
[31m-  + new, signal-safe, hook scheme.[m
[31m-  Implementation:[m
[31m-  + new license: MIT.[m
[31m-  + new, faster, register-based virtual machine.[m
[31m-  + support for external multithreading and coroutines.[m
[31m-  + new and consistent error message format.[m
[31m-  + the core no longer needs "stdio.h" for anything (except for a single[m
[31m-    use of sprintf to convert numbers to strings).[m
[31m-  + lua.c now runs the environment variable LUA_INIT, if present. It can[m
[31m-    be "@filename", to run a file, or the chunk itself.[m
[31m-  + support for user extensions in lua.c.[m
[31m-    sample implementation given for command line editing.[m
[31m-  + new dynamic loading library, active by default on several platforms.[m
[31m-  + safe garbage-collector metamethods.[m
[31m-  + precompiled bytecodes checked for integrity (secure binary dostring).[m
[31m-  + strings are fully aligned.[m
[31m-  + position capture in string.find.[m
[31m-  + read('*l') can read lines with embedded zeros.[m
[31m-[m
[31m-* Changes from version 3.2 to 4.0[m
[31m-  -------------------------------[m
[31m-  Language:[m
[31m-  + new "break" and "for" statements (both numerical and for tables).[m
[31m-  + uniform treatment of globals: globals are now stored in a Lua table.[m
[31m-  + improved error messages.[m
[31m-  + no more '$debug': full speed *and* full debug information.[m
[31m-  + new read form: read(N) for next N bytes.[m
[31m-  + general read patterns now deprecated.[m
[31m-    (still available with -DCOMPAT_READPATTERNS.)[m
[31m-  + all return values are passed as arguments for the last function[m
[31m-    (old semantics still available with -DLUA_COMPAT_ARGRET)[m
[31m-  + garbage collection tag methods for tables now deprecated.[m
[31m-  + there is now only one tag method for order.[m
[31m-  API:[m
[31m-  + New API: fully re-entrant, simpler, and more efficient.[m
[31m-  + New debug API.[m
[31m-  Implementation:[m
[31m-  + faster than ever: cleaner virtual machine and new hashing algorithm.[m
[31m-  + non-recursive garbage-collector algorithm.[m
[31m-  + reduced memory usage for programs with many strings.[m
[31m-  + improved treatment for memory allocation errors.[m
[31m-  + improved support for 16-bit machines (we hope).[m
[31m-  + code now compiles unmodified as both ANSI C and C++.[m
[31m-  + numbers in bases other than 10 are converted using strtoul.[m
[31m-  + new -f option in Lua to support #! scripts.[m
[31m-  + luac can now combine text and binaries.[m
[31m-[m
[31m-* Changes from version 3.1 to 3.2[m
[31m-  -------------------------------[m
[31m-  + redirected all output in Lua's core to _ERRORMESSAGE and _ALERT.[m
[31m-  + increased limit on the number of constants and globals per function[m
[31m-    (from 2^16 to 2^24).[m
[31m-  + debugging info (lua_debug and hooks) moved into lua_state and new API[m
[31m-    functions provided to get and set this info.[m
[31m-  + new debug lib gives full debugging access within Lua.[m
[31m-  + new table functions "foreachi", "sort", "tinsert", "tremove", "getn".[m
[31m-  + new io functions "flush", "seek".[m
[31m-[m
[31m-* Changes from version 3.0 to 3.1[m
[31m-  -------------------------------[m
[31m-  + NEW FEATURE: anonymous functions with closures (via "upvalues").[m
[31m-  + new syntax:[m
[31m-    - local variables in chunks.[m
[31m-    - better scope control with DO block END.[m
[31m-    - constructors can now be also written: { record-part; list-part }.[m
[31m-    - more general syntax for function calls and lvalues, e.g.:[m
[31m-      f(x).y=1[m
[31m-      o:f(x,y):g(z)[m
[31m-      f"string" is sugar for f("string")[m
[31m-  + strings may now contain arbitrary binary data (e.g., embedded zeros).[m
[31m-  + major code re-organization and clean-up; reduced module interdependecies.[m
[31m-  + no arbitrary limits on the total number of constants and globals.[m
[31m-  + support for multiple global contexts.[m
[31m-  + better syntax error messages.[m
[31m-  + new traversal functions "foreach" and "foreachvar".[m
[31m-  + the default for numbers is now double.[m
[31m-    changing it to use floats or longs is easy.[m
[31m-  + complete debug information stored in pre-compiled chunks.[m
[31m-  + sample interpreter now prompts user when run interactively, and also[m
[31m-    handles control-C interruptions gracefully.[m
[31m-[m
[31m-* Changes from version 2.5 to 3.0[m
[31m-  -------------------------------[m
[31m-  + NEW CONCEPT: "tag methods".[m
[31m-    Tag methods replace fallbacks as the meta-mechanism for extending the[m
[31m-    semantics of Lua. Whereas fallbacks had a global nature, tag methods[m
[31m-    work on objects having the same tag (e.g., groups of tables).[m
[31m-    Existing code that uses fallbacks should work without change.[m
[31m-  + new, general syntax for constructors {[exp] = exp, ... }.[m
[31m-  + support for handling variable number of arguments in functions (varargs).[m
[31m-  + support for conditional compilation ($if ... $else ... $end).[m
[31m-  + cleaner semantics in API simplifies host code.[m
[31m-  + better support for writing libraries (auxlib.h).[m
[31m-  + better type checking and error messages in the standard library.[m
[31m-  + luac can now also undump.[m
[31m-[m
[31m-* Changes from version 2.4 to 2.5[m
[31m-  -------------------------------[m
[31m-  + io and string libraries are now based on pattern matching;[m
[31m-    the old libraries are still available for compatibility[m
[31m-  + dofile and dostring can now return values (via return statement)[m
[31m-  + better support for 16- and 64-bit machines[m
[31m-  + expanded documentation, with more examples[m
[31m-[m
[31m-* Changes from version 2.2 to 2.4[m
[31m-  -------------------------------[m
[31m-  + external compiler creates portable binary files that can be loaded faster[m
[31m-  + interface for debugging and profiling[m
[31m-  + new "getglobal" fallback[m
[31m-  + new functions for handling references to Lua objects[m
[31m-  + new functions in standard lib[m
[31m-  + only one copy of each string is stored[m
[31m-  + expanded documentation, with more examples[m
[31m-[m
[31m-* Changes from version 2.1 to 2.2[m
[31m-  -------------------------------[m
[31m-  + functions now may be declared with any "lvalue" as a name[m
[31m-  + garbage collection of functions[m
[31m-  + support for pipes[m
[31m-[m
[31m-* Changes from version 1.1 to 2.1[m
[31m-  -------------------------------[m
[31m-  + object-oriented support[m
[31m-  + fallbacks[m
[31m-  + simplified syntax for tables[m
[31m-  + many internal improvements[m
[31m-[m
[31m-(end of HISTORY)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/INSTALL b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/INSTALL[m
[1mdeleted file mode 100644[m
[1mindex 17eb8ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/INSTALL[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-INSTALL for Lua 5.1[m
[31m-[m
[31m-* Building Lua[m
[31m-  ------------[m
[31m-  Lua is built in the src directory, but the build process can be[m
[31m-  controlled from the top-level Makefile.[m
[31m-[m
[31m-  Building Lua on Unix systems should be very easy. First do "make" and[m
[31m-  see if your platform is listed. If so, just do "make xxx", where xxx[m
[31m-  is your platform name. The platforms currently supported are:[m
[31m-    aix ansi bsd freebsd generic linux macosx mingw posix solaris[m
[31m-[m
[31m-  If your platform is not listed, try the closest one or posix, generic,[m
[31m-  ansi, in this order.[m
[31m-[m
[31m-  See below for customization instructions and for instructions on how[m
[31m-  to build with other Windows compilers.[m
[31m-[m
[31m-  If you want to check that Lua has been built correctly, do "make test"[m
[31m-  after building Lua. Also, have a look at the example programs in test.[m
[31m-[m
[31m-* Installing Lua[m
[31m-  --------------[m
[31m-  Once you have built Lua, you may want to install it in an official[m
[31m-  place in your system. In this case, do "make install". The official[m
[31m-  place and the way to install files are defined in Makefile. You must[m
[31m-  have the right permissions to install files.[m
[31m-[m
[31m-  If you want to build and install Lua in one step, do "make xxx install",[m
[31m-  where xxx is your platform name.[m
[31m-[m
[31m-  If you want to install Lua locally, then do "make local". This will[m
[31m-  create directories bin, include, lib, man, and install Lua there as[m
[31m-  follows:[m
[31m-[m
[31m-    bin:	lua luac[m
[31m-    include:	lua.h luaconf.h lualib.h lauxlib.h lua.hpp[m
[31m-    lib:	liblua.a[m
[31m-    man/man1:	lua.1 luac.1[m
[31m-[m
[31m-  These are the only directories you need for development.[m
[31m-[m
[31m-  There are man pages for lua and luac, in both nroff and html, and a[m
[31m-  reference manual in html in doc, some sample code in test, and some[m
[31m-  useful stuff in etc. You don't need these directories for development.[m
[31m-[m
[31m-  If you want to install Lua locally, but in some other directory, do[m
[31m-  "make install INSTALL_TOP=xxx", where xxx is your chosen directory.[m
[31m-[m
[31m-  See below for instructions for Windows and other systems.[m
[31m-[m
[31m-* Customization[m
[31m-  -------------[m
[31m-  Three things can be customized by editing a file:[m
[31m-    - Where and how to install Lua -- edit Makefile.[m
[31m-    - How to build Lua -- edit src/Makefile.[m
[31m-    - Lua features -- edit src/luaconf.h.[m
[31m-[m
[31m-  You don't actually need to edit the Makefiles because you may set the[m
[31m-  relevant variables when invoking make.[m
[31m-[m
[31m-  On the other hand, if you need to select some Lua features, you'll need[m
[31m-  to edit src/luaconf.h. The edited file will be the one installed, and[m
[31m-  it will be used by any Lua clients that you build, to ensure consistency.[m
[31m-[m
[31m-  We strongly recommend that you enable dynamic loading. This is done[m
[31m-  automatically for all platforms listed above that have this feature[m
[31m-  (and also Windows). See src/luaconf.h and also src/Makefile.[m
[31m-[m
[31m-* Building Lua on Windows and other systems[m
[31m-  -----------------------------------------[m
[31m-  If you're not using the usual Unix tools, then the instructions for[m
[31m-  building Lua depend on the compiler you use. You'll need to create[m
[31m-  projects (or whatever your compiler uses) for building the library,[m
[31m-  the interpreter, and the compiler, as follows:[m
[31m-[m
[31m-  library:	lapi.c lcode.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c[m
[31m-		lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c[m
[31m-		ltable.c ltm.c lundump.c lvm.c lzio.c[m
[31m-		lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c loslib.c[m
[31m-		ltablib.c lstrlib.c loadlib.c linit.c[m
[31m-[m
[31m-  interpreter:	library, lua.c[m
[31m-[m
[31m-  compiler:	library, luac.c print.c[m
[31m-[m
[31m-  If you use Visual Studio .NET, you can use etc/luavs.bat in its[m
[31m-  "Command Prompt".[m
[31m-[m
[31m-  If all you want is to build the Lua interpreter, you may put all .c files[m
[31m-  in a single project, except for luac.c and print.c. Or just use etc/all.c.[m
[31m-[m
[31m-  To use Lua as a library in your own programs, you'll need to know how to[m
[31m-  create and use libraries with your compiler.[m
[31m-[m
[31m-  As mentioned above, you may edit luaconf.h to select some features before[m
[31m-  building Lua.[m
[31m-[m
[31m-(end of INSTALL)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 7be61c8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,128 +0,0 @@[m
[31m-# makefile for installing Lua[m
[31m-# see INSTALL for installation instructions[m
[31m-# see src/Makefile and src/luaconf.h for further customization[m
[31m-[m
[31m-# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================[m
[31m-[m
[31m-# Your platform. See PLATS for possible values.[m
[31m-PLAT= none[m
[31m-[m
[31m-# Where to install. The installation starts in the src and doc directories,[m
[31m-# so take care if INSTALL_TOP is not an absolute path.[m
[31m-INSTALL_TOP= /usr/local[m
[31m-INSTALL_BIN= $(INSTALL_TOP)/bin[m
[31m-INSTALL_INC= $(INSTALL_TOP)/include[m
[31m-INSTALL_LIB= $(INSTALL_TOP)/lib[m
[31m-INSTALL_MAN= $(INSTALL_TOP)/man/man1[m
[31m-#[m
[31m-# You probably want to make INSTALL_LMOD and INSTALL_CMOD consistent with[m
[31m-# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h (and also with etc/lua.pc).[m
[31m-INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V[m
[31m-INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V[m
[31m-[m
[31m-# How to install. If your install program does not support "-p", then you[m
[31m-# may have to run ranlib on the installed liblua.a (do "make ranlib").[m
[31m-#INSTALL= install -p[m
[31m-#INSTALL_EXEC= $(INSTALL) -m 0755[m
[31m-#INSTALL_DATA= $(INSTALL) -m 0644[m
[31m-#[m
[31m-# If you don't have install you can use cp instead.[m
[31m-INSTALL= cp -p[m
[31m-INSTALL_EXEC= $(INSTALL)[m
[31m-INSTALL_DATA= $(INSTALL)[m
[31m-[m
[31m-# Utilities.[m
[31m-MKDIR= mkdir -p[m
[31m-RANLIB= ranlib[m
[31m-[m
[31m-# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE =========[m
[31m-[m
[31m-# Convenience platforms targets.[m
[31m-PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris[m
[31m-[m
[31m-# What to install.[m
[31m-TO_BIN= lua luac[m
[31m-TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp[m
[31m-TO_LIB= liblua.a[m
[31m-TO_MAN= lua.1 luac.1[m
[31m-[m
[31m-# Lua version and release.[m
[31m-V= 5.1[m
[31m-R= 5.1.5[m
[31m-[m
[31m-all:	$(PLAT)[m
[31m-[m
[31m-$(PLATS) clean:[m
[31m-	cd src && $(MAKE) $@[m
[31m-[m
[31m-test:	dummy[m
[31m-	src/lua test/hello.lua[m
[31m-[m
[31m-install: dummy[m
[31m-	cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD)[m
[31m-	cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN)[m
[31m-	cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC)[m
[31m-	cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB)[m
[31m-	cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN)[m
[31m-[m
[31m-ranlib:[m
[31m-	cd src && cd $(INSTALL_LIB) && $(RANLIB) $(TO_LIB)[m
[31m-[m
[31m-local:[m
[31m-	$(MAKE) install INSTALL_TOP=..[m
[31m-[m
[31m-none:[m
[31m-	@echo "Please do"[m
[31m-	@echo "   make PLATFORM"[m
[31m-	@echo "where PLATFORM is one of these:"[m
[31m-	@echo "   $(PLATS)"[m
[31m-	@echo "See INSTALL for complete instructions."[m
[31m-[m
[31m-# make may get confused with test/ and INSTALL in a case-insensitive OS[m
[31m-dummy:[m
[31m-[m
[31m-# echo config parameters[m
[31m-echo:[m
[31m-	@echo ""[m
[31m-	@echo "These are the parameters currently set in src/Makefile to build Lua $R:"[m
[31m-	@echo ""[m
[31m-	@cd src && $(MAKE) -s echo[m
[31m-	@echo ""[m
[31m-	@echo "These are the parameters currently set in Makefile to install Lua $R:"[m
[31m-	@echo ""[m
[31m-	@echo "PLAT = $(PLAT)"[m
[31m-	@echo "INSTALL_TOP = $(INSTALL_TOP)"[m
[31m-	@echo "INSTALL_BIN = $(INSTALL_BIN)"[m
[31m-	@echo "INSTALL_INC = $(INSTALL_INC)"[m
[31m-	@echo "INSTALL_LIB = $(INSTALL_LIB)"[m
[31m-	@echo "INSTALL_MAN = $(INSTALL_MAN)"[m
[31m-	@echo "INSTALL_LMOD = $(INSTALL_LMOD)"[m
[31m-	@echo "INSTALL_CMOD = $(INSTALL_CMOD)"[m
[31m-	@echo "INSTALL_EXEC = $(INSTALL_EXEC)"[m
[31m-	@echo "INSTALL_DATA = $(INSTALL_DATA)"[m
[31m-	@echo ""[m
[31m-	@echo "See also src/luaconf.h ."[m
[31m-	@echo ""[m
[31m-[m
[31m-# echo private config parameters[m
[31m-pecho:[m
[31m-	@echo "V = $(V)"[m
[31m-	@echo "R = $(R)"[m
[31m-	@echo "TO_BIN = $(TO_BIN)"[m
[31m-	@echo "TO_INC = $(TO_INC)"[m
[31m-	@echo "TO_LIB = $(TO_LIB)"[m
[31m-	@echo "TO_MAN = $(TO_MAN)"[m
[31m-[m
[31m-# echo config parameters as Lua code[m
[31m-# uncomment the last sed expression if you want nil instead of empty strings[m
[31m-lecho:[m
[31m-	@echo "-- installation parameters for Lua $R"[m
[31m-	@echo "VERSION = '$V'"[m
[31m-	@echo "RELEASE = '$R'"[m
[31m-	@$(MAKE) echo | grep = | sed -e 's/= /= "/' -e 's/$$/"/' #-e 's/""/nil/'[m
[31m-	@echo "-- EOF"[m
[31m-[m
[31m-# list targets that do not create files (but not all makes understand .PHONY)[m
[31m-.PHONY: all $(PLATS) clean test install local none dummy echo pecho lecho[m
[31m-[m
[31m-# (end of Makefile)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/README[m
[1mdeleted file mode 100644[m
[1mindex 11b4dff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/README[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-README for Lua 5.1[m
[31m-[m
[31m-See INSTALL for installation instructions.[m
[31m-See HISTORY for a summary of changes since the last released version.[m
[31m-[m
[31m-* What is Lua?[m
[31m-  ------------[m
[31m-  Lua is a powerful, light-weight programming language designed for extending[m
[31m-  applications. Lua is also frequently used as a general-purpose, stand-alone[m
[31m-  language. Lua is free software.[m
[31m-[m
[31m-  For complete information, visit Lua's web site at http://www.lua.org/ .[m
[31m-  For an executive summary, see http://www.lua.org/about.html .[m
[31m-[m
[31m-  Lua has been used in many different projects around the world.[m
[31m-  For a short list, see http://www.lua.org/uses.html .[m
[31m-[m
[31m-* Availability[m
[31m-  ------------[m
[31m-  Lua is freely available for both academic and commercial purposes.[m
[31m-  See COPYRIGHT and http://www.lua.org/license.html for details.[m
[31m-  Lua can be downloaded at http://www.lua.org/download.html .[m
[31m-[m
[31m-* Installation[m
[31m-  ------------[m
[31m-  Lua is implemented in pure ANSI C, and compiles unmodified in all known[m
[31m-  platforms that have an ANSI C compiler. In most Unix-like platforms, simply[m
[31m-  do "make" with a suitable target. See INSTALL for detailed instructions.[m
[31m-[m
[31m-* Origin[m
[31m-  ------[m
[31m-  Lua is developed at Lua.org, a laboratory of the Department of Computer[m
[31m-  Science of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro[m
[31m-  in Brazil).[m
[31m-  For more information about the authors, see http://www.lua.org/authors.html .[m
[31m-[m
[31m-(end of README)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/contents.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/contents.html[m
[1mdeleted file mode 100644[m
[1mindex 3d83da9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/contents.html[m
[1m+++ /dev/null[m
[36m@@ -1,497 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">[m
[31m-<HTML>[m
[31m-<HEAD>[m
[31m-<TITLE>Lua 5.1 Reference Manual - contents</TITLE>[m
[31m-<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">[m
[31m-<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8">[m
[31m-<STYLE TYPE="text/css">[m
[31m-ul {[m
[31m-	list-style-type: none ;[m
[31m-}[m
[31m-</STYLE>[m
[31m-</HEAD>[m
[31m-[m
[31m-<BODY>[m
[31m-[m
[31m-<HR>[m
[31m-<H1>[m
[31m-<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="" BORDER=0></A>[m
[31m-Lua 5.1 Reference Manual[m
[31m-</H1>[m
[31m-[m
[31m-<P>[m
[31m-The reference manual is the official definition of the Lua language.[m
[31m-For a complete introduction to Lua programming, see the book[m
[31m-<A HREF="http://www.lua.org/docs.html#pil">Programming in Lua</A>.[m
[31m-[m
[31m-<P>[m
[31m-This manual is also available as a book:[m
[31m-<BLOCKQUOTE>[m
[31m-<A HREF="http://www.amazon.com/exec/obidos/ASIN/8590379833/lua-indexmanual-20">[m
[31m-<IMG SRC="cover.png" ALT="" TITLE="buy from Amazon" BORDER=1 ALIGN="left" HSPACE=12>[m
[31m-</A>[m
[31m-<B>Lua 5.1 Reference Manual</B>[m
[31m-<BR>by R. Ierusalimschy, L. H. de Figueiredo, W. Celes[m
[31m-<BR>Lua.org, August 2006[m
[31m-<BR>ISBN 85-903798-3-3[m
[31m-<BR CLEAR="all">[m
[31m-</BLOCKQUOTE>[m
[31m-[m
[31m-<P>[m
[31m-<A HREF="http://www.amazon.com/exec/obidos/ASIN/8590379833/lua-indexmanual-20">Buy a copy</A>[m
[31m-of this book and[m
[31m-<A HREF="http://www.lua.org/donations.html">help to support</A>[m
[31m-the Lua project.[m
[31m-[m
[31m-<P>[m
[31m-<A HREF="manual.html">start</A>[m
[31m-&middot;[m
[31m-<A HREF="#contents">contents</A>[m
[31m-&middot;[m
[31m-<A HREF="#index">index</A>[m
[31m-&middot;[m
[31m-<A HREF="http://www.lua.org/manual/">other versions</A>[m
[31m-<HR>[m
[31m-<SMALL>[m
[31m-Copyright &copy; 2006&ndash;2012 Lua.org, PUC-Rio.[m
[31m-Freely available under the terms of the[m
[31m-<A HREF="http://www.lua.org/license.html">Lua license</A>.[m
[31m-</SMALL>[m
[31m-[m
[31m-<H2><A NAME="contents">Contents</A></H2>[m
[31m-<UL style="padding: 0">[m
[31m-<LI><A HREF="manual.html">1 &ndash; Introduction</A>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#2">2 &ndash; The Language</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.1">2.1 &ndash; Lexical Conventions</A>[m
[31m-<LI><A HREF="manual.html#2.2">2.2 &ndash; Values and Types</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.2.1">2.2.1 &ndash; Coercion</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#2.3">2.3 &ndash; Variables</A>[m
[31m-<LI><A HREF="manual.html#2.4">2.4 &ndash; Statements</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.4.1">2.4.1 &ndash; Chunks</A>[m
[31m-<LI><A HREF="manual.html#2.4.2">2.4.2 &ndash; Blocks</A>[m
[31m-<LI><A HREF="manual.html#2.4.3">2.4.3 &ndash; Assignment</A>[m
[31m-<LI><A HREF="manual.html#2.4.4">2.4.4 &ndash; Control Structures</A>[m
[31m-<LI><A HREF="manual.html#2.4.5">2.4.5 &ndash; For Statement</A>[m
[31m-<LI><A HREF="manual.html#2.4.6">2.4.6 &ndash; Function Calls as Statements</A>[m
[31m-<LI><A HREF="manual.html#2.4.7">2.4.7 &ndash; Local Declarations</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#2.5">2.5 &ndash; Expressions</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.5.1">2.5.1 &ndash; Arithmetic Operators</A>[m
[31m-<LI><A HREF="manual.html#2.5.2">2.5.2 &ndash; Relational Operators</A>[m
[31m-<LI><A HREF="manual.html#2.5.3">2.5.3 &ndash; Logical Operators</A>[m
[31m-<LI><A HREF="manual.html#2.5.4">2.5.4 &ndash; Concatenation</A>[m
[31m-<LI><A HREF="manual.html#2.5.5">2.5.5 &ndash; The Length Operator</A>[m
[31m-<LI><A HREF="manual.html#2.5.6">2.5.6 &ndash; Precedence</A>[m
[31m-<LI><A HREF="manual.html#2.5.7">2.5.7 &ndash; Table Constructors</A>[m
[31m-<LI><A HREF="manual.html#2.5.8">2.5.8 &ndash; Function Calls</A>[m
[31m-<LI><A HREF="manual.html#2.5.9">2.5.9 &ndash; Function Definitions</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#2.6">2.6 &ndash; Visibility Rules</A>[m
[31m-<LI><A HREF="manual.html#2.7">2.7 &ndash; Error Handling</A>[m
[31m-<LI><A HREF="manual.html#2.8">2.8 &ndash; Metatables</A>[m
[31m-<LI><A HREF="manual.html#2.9">2.9 &ndash; Environments</A>[m
[31m-<LI><A HREF="manual.html#2.10">2.10 &ndash; Garbage Collection</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#2.10.1">2.10.1 &ndash; Garbage-Collection Metamethods</A>[m
[31m-<LI><A HREF="manual.html#2.10.2">2.10.2 &ndash; Weak Tables</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#2.11">2.11 &ndash; Coroutines</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#3">3 &ndash; The Application Program Interface</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#3.1">3.1 &ndash; The Stack</A>[m
[31m-<LI><A HREF="manual.html#3.2">3.2 &ndash; Stack Size</A>[m
[31m-<LI><A HREF="manual.html#3.3">3.3 &ndash; Pseudo-Indices</A>[m
[31m-<LI><A HREF="manual.html#3.4">3.4 &ndash; C Closures</A>[m
[31m-<LI><A HREF="manual.html#3.5">3.5 &ndash; Registry</A>[m
[31m-<LI><A HREF="manual.html#3.6">3.6 &ndash; Error Handling in C</A>[m
[31m-<LI><A HREF="manual.html#3.7">3.7 &ndash; Functions and Types</A>[m
[31m-<LI><A HREF="manual.html#3.8">3.8 &ndash; The Debug Interface</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#4">4 &ndash; The Auxiliary Library</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#4.1">4.1 &ndash; Functions and Types</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#5">5 &ndash; Standard Libraries</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#5.1">5.1 &ndash; Basic Functions</A>[m
[31m-<LI><A HREF="manual.html#5.2">5.2 &ndash; Coroutine Manipulation</A>[m
[31m-<LI><A HREF="manual.html#5.3">5.3 &ndash; Modules</A>[m
[31m-<LI><A HREF="manual.html#5.4">5.4 &ndash; String Manipulation</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#5.4.1">5.4.1 &ndash; Patterns</A>[m
[31m-</UL>[m
[31m-<LI><A HREF="manual.html#5.5">5.5 &ndash; Table Manipulation</A>[m
[31m-<LI><A HREF="manual.html#5.6">5.6 &ndash; Mathematical Functions</A>[m
[31m-<LI><A HREF="manual.html#5.7">5.7 &ndash; Input and Output Facilities</A>[m
[31m-<LI><A HREF="manual.html#5.8">5.8 &ndash; Operating System Facilities</A>[m
[31m-<LI><A HREF="manual.html#5.9">5.9 &ndash; The Debug Library</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#6">6 &ndash; Lua Stand-alone</A>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#7">7 &ndash; Incompatibilities with the Previous Version</A>[m
[31m-<UL>[m
[31m-<LI><A HREF="manual.html#7.1">7.1 &ndash; Changes in the Language</A>[m
[31m-<LI><A HREF="manual.html#7.2">7.2 &ndash; Changes in the Libraries</A>[m
[31m-<LI><A HREF="manual.html#7.3">7.3 &ndash; Changes in the API</A>[m
[31m-</UL>[m
[31m-<P>[m
[31m-<LI><A HREF="manual.html#8">8 &ndash; The Complete Syntax of Lua</A>[m
[31m-</UL>[m
[31m-[m
[31m-<H2><A NAME="index">Index</A></H2>[m
[31m-<TABLE WIDTH="100%">[m
[31m-<TR VALIGN="top">[m
[31m-<TD>[m
[31m-<H3><A NAME="functions">Lua functions</A></H3>[m
[31m-<A HREF="manual.html#pdf-_G">_G</A><BR>[m
[31m-<A HREF="manual.html#pdf-_VERSION">_VERSION</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-assert">assert</A><BR>[m
[31m-<A HREF="manual.html#pdf-collectgarbage">collectgarbage</A><BR>[m
[31m-<A HREF="manual.html#pdf-dofile">dofile</A><BR>[m
[31m-<A HREF="manual.html#pdf-error">error</A><BR>[m
[31m-<A HREF="manual.html#pdf-getfenv">getfenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-getmetatable">getmetatable</A><BR>[m
[31m-<A HREF="manual.html#pdf-ipairs">ipairs</A><BR>[m
[31m-<A HREF="manual.html#pdf-load">load</A><BR>[m
[31m-<A HREF="manual.html#pdf-loadfile">loadfile</A><BR>[m
[31m-<A HREF="manual.html#pdf-loadstring">loadstring</A><BR>[m
[31m-<A HREF="manual.html#pdf-module">module</A><BR>[m
[31m-<A HREF="manual.html#pdf-next">next</A><BR>[m
[31m-<A HREF="manual.html#pdf-pairs">pairs</A><BR>[m
[31m-<A HREF="manual.html#pdf-pcall">pcall</A><BR>[m
[31m-<A HREF="manual.html#pdf-print">print</A><BR>[m
[31m-<A HREF="manual.html#pdf-rawequal">rawequal</A><BR>[m
[31m-<A HREF="manual.html#pdf-rawget">rawget</A><BR>[m
[31m-<A HREF="manual.html#pdf-rawset">rawset</A><BR>[m
[31m-<A HREF="manual.html#pdf-require">require</A><BR>[m
[31m-<A HREF="manual.html#pdf-select">select</A><BR>[m
[31m-<A HREF="manual.html#pdf-setfenv">setfenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-setmetatable">setmetatable</A><BR>[m
[31m-<A HREF="manual.html#pdf-tonumber">tonumber</A><BR>[m
[31m-<A HREF="manual.html#pdf-tostring">tostring</A><BR>[m
[31m-<A HREF="manual.html#pdf-type">type</A><BR>[m
[31m-<A HREF="manual.html#pdf-unpack">unpack</A><BR>[m
[31m-<A HREF="manual.html#pdf-xpcall">xpcall</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-coroutine.create">coroutine.create</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.resume">coroutine.resume</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.running">coroutine.running</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.status">coroutine.status</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.wrap">coroutine.wrap</A><BR>[m
[31m-<A HREF="manual.html#pdf-coroutine.yield">coroutine.yield</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-debug.debug">debug.debug</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getfenv">debug.getfenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.gethook">debug.gethook</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getinfo">debug.getinfo</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getlocal">debug.getlocal</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getmetatable">debug.getmetatable</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getregistry">debug.getregistry</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.getupvalue">debug.getupvalue</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.setfenv">debug.setfenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.sethook">debug.sethook</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.setlocal">debug.setlocal</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.setmetatable">debug.setmetatable</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.setupvalue">debug.setupvalue</A><BR>[m
[31m-<A HREF="manual.html#pdf-debug.traceback">debug.traceback</A><BR>[m
[31m-[m
[31m-</TD>[m
[31m-<TD>[m
[31m-<H3>&nbsp;</H3>[m
[31m-<A HREF="manual.html#pdf-file:close">file:close</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:flush">file:flush</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:lines">file:lines</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:read">file:read</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:seek">file:seek</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:setvbuf">file:setvbuf</A><BR>[m
[31m-<A HREF="manual.html#pdf-file:write">file:write</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-io.close">io.close</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.flush">io.flush</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.input">io.input</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.lines">io.lines</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.open">io.open</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.output">io.output</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.popen">io.popen</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.read">io.read</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.stderr">io.stderr</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.stdin">io.stdin</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.stdout">io.stdout</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.tmpfile">io.tmpfile</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.type">io.type</A><BR>[m
[31m-<A HREF="manual.html#pdf-io.write">io.write</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-math.abs">math.abs</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.acos">math.acos</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.asin">math.asin</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.atan">math.atan</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.atan2">math.atan2</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.ceil">math.ceil</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.cos">math.cos</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.cosh">math.cosh</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.deg">math.deg</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.exp">math.exp</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.floor">math.floor</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.fmod">math.fmod</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.frexp">math.frexp</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.huge">math.huge</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.ldexp">math.ldexp</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.log">math.log</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.log10">math.log10</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.max">math.max</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.min">math.min</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.modf">math.modf</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.pi">math.pi</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.pow">math.pow</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.rad">math.rad</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.random">math.random</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.randomseed">math.randomseed</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.sin">math.sin</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.sinh">math.sinh</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.sqrt">math.sqrt</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.tan">math.tan</A><BR>[m
[31m-<A HREF="manual.html#pdf-math.tanh">math.tanh</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-os.clock">os.clock</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.date">os.date</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.difftime">os.difftime</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.execute">os.execute</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.exit">os.exit</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.getenv">os.getenv</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.remove">os.remove</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.rename">os.rename</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.setlocale">os.setlocale</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.time">os.time</A><BR>[m
[31m-<A HREF="manual.html#pdf-os.tmpname">os.tmpname</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-package.cpath">package.cpath</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.loaded">package.loaded</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.loaders">package.loaders</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.loadlib">package.loadlib</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.path">package.path</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.preload">package.preload</A><BR>[m
[31m-<A HREF="manual.html#pdf-package.seeall">package.seeall</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-string.byte">string.byte</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.char">string.char</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.dump">string.dump</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.find">string.find</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.format">string.format</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.gmatch">string.gmatch</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.gsub">string.gsub</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.len">string.len</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.lower">string.lower</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.match">string.match</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.rep">string.rep</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.reverse">string.reverse</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.sub">string.sub</A><BR>[m
[31m-<A HREF="manual.html#pdf-string.upper">string.upper</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#pdf-table.concat">table.concat</A><BR>[m
[31m-<A HREF="manual.html#pdf-table.insert">table.insert</A><BR>[m
[31m-<A HREF="manual.html#pdf-table.maxn">table.maxn</A><BR>[m
[31m-<A HREF="manual.html#pdf-table.remove">table.remove</A><BR>[m
[31m-<A HREF="manual.html#pdf-table.sort">table.sort</A><BR>[m
[31m-[m
[31m-</TD>[m
[31m-<TD>[m
[31m-<H3>C API</H3>[m
[31m-<A HREF="manual.html#lua_Alloc">lua_Alloc</A><BR>[m
[31m-<A HREF="manual.html#lua_CFunction">lua_CFunction</A><BR>[m
[31m-<A HREF="manual.html#lua_Debug">lua_Debug</A><BR>[m
[31m-<A HREF="manual.html#lua_Hook">lua_Hook</A><BR>[m
[31m-<A HREF="manual.html#lua_Integer">lua_Integer</A><BR>[m
[31m-<A HREF="manual.html#lua_Number">lua_Number</A><BR>[m
[31m-<A HREF="manual.html#lua_Reader">lua_Reader</A><BR>[m
[31m-<A HREF="manual.html#lua_State">lua_State</A><BR>[m
[31m-<A HREF="manual.html#lua_Writer">lua_Writer</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#lua_atpanic">lua_atpanic</A><BR>[m
[31m-<A HREF="manual.html#lua_call">lua_call</A><BR>[m
[31m-<A HREF="manual.html#lua_checkstack">lua_checkstack</A><BR>[m
[31m-<A HREF="manual.html#lua_close">lua_close</A><BR>[m
[31m-<A HREF="manual.html#lua_concat">lua_concat</A><BR>[m
[31m-<A HREF="manual.html#lua_cpcall">lua_cpcall</A><BR>[m
[31m-<A HREF="manual.html#lua_createtable">lua_createtable</A><BR>[m
[31m-<A HREF="manual.html#lua_dump">lua_dump</A><BR>[m
[31m-<A HREF="manual.html#lua_equal">lua_equal</A><BR>[m
[31m-<A HREF="manual.html#lua_error">lua_error</A><BR>[m
[31m-<A HREF="manual.html#lua_gc">lua_gc</A><BR>[m
[31m-<A HREF="manual.html#lua_getallocf">lua_getallocf</A><BR>[m
[31m-<A HREF="manual.html#lua_getfenv">lua_getfenv</A><BR>[m
[31m-<A HREF="manual.html#lua_getfield">lua_getfield</A><BR>[m
[31m-<A HREF="manual.html#lua_getglobal">lua_getglobal</A><BR>[m
[31m-<A HREF="manual.html#lua_gethook">lua_gethook</A><BR>[m
[31m-<A HREF="manual.html#lua_gethookcount">lua_gethookcount</A><BR>[m
[31m-<A HREF="manual.html#lua_gethookmask">lua_gethookmask</A><BR>[m
[31m-<A HREF="manual.html#lua_getinfo">lua_getinfo</A><BR>[m
[31m-<A HREF="manual.html#lua_getlocal">lua_getlocal</A><BR>[m
[31m-<A HREF="manual.html#lua_getmetatable">lua_getmetatable</A><BR>[m
[31m-<A HREF="manual.html#lua_getstack">lua_getstack</A><BR>[m
[31m-<A HREF="manual.html#lua_gettable">lua_gettable</A><BR>[m
[31m-<A HREF="manual.html#lua_gettop">lua_gettop</A><BR>[m
[31m-<A HREF="manual.html#lua_getupvalue">lua_getupvalue</A><BR>[m
[31m-<A HREF="manual.html#lua_insert">lua_insert</A><BR>[m
[31m-<A HREF="manual.html#lua_isboolean">lua_isboolean</A><BR>[m
[31m-<A HREF="manual.html#lua_iscfunction">lua_iscfunction</A><BR>[m
[31m-<A HREF="manual.html#lua_isfunction">lua_isfunction</A><BR>[m
[31m-<A HREF="manual.html#lua_islightuserdata">lua_islightuserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_isnil">lua_isnil</A><BR>[m
[31m-<A HREF="manual.html#lua_isnone">lua_isnone</A><BR>[m
[31m-<A HREF="manual.html#lua_isnoneornil">lua_isnoneornil</A><BR>[m
[31m-<A HREF="manual.html#lua_isnumber">lua_isnumber</A><BR>[m
[31m-<A HREF="manual.html#lua_isstring">lua_isstring</A><BR>[m
[31m-<A HREF="manual.html#lua_istable">lua_istable</A><BR>[m
[31m-<A HREF="manual.html#lua_isthread">lua_isthread</A><BR>[m
[31m-<A HREF="manual.html#lua_isuserdata">lua_isuserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_lessthan">lua_lessthan</A><BR>[m
[31m-<A HREF="manual.html#lua_load">lua_load</A><BR>[m
[31m-<A HREF="manual.html#lua_newstate">lua_newstate</A><BR>[m
[31m-<A HREF="manual.html#lua_newtable">lua_newtable</A><BR>[m
[31m-<A HREF="manual.html#lua_newthread">lua_newthread</A><BR>[m
[31m-<A HREF="manual.html#lua_newuserdata">lua_newuserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_next">lua_next</A><BR>[m
[31m-<A HREF="manual.html#lua_objlen">lua_objlen</A><BR>[m
[31m-<A HREF="manual.html#lua_pcall">lua_pcall</A><BR>[m
[31m-<A HREF="manual.html#lua_pop">lua_pop</A><BR>[m
[31m-<A HREF="manual.html#lua_pushboolean">lua_pushboolean</A><BR>[m
[31m-<A HREF="manual.html#lua_pushcclosure">lua_pushcclosure</A><BR>[m
[31m-<A HREF="manual.html#lua_pushcfunction">lua_pushcfunction</A><BR>[m
[31m-<A HREF="manual.html#lua_pushfstring">lua_pushfstring</A><BR>[m
[31m-<A HREF="manual.html#lua_pushinteger">lua_pushinteger</A><BR>[m
[31m-<A HREF="manual.html#lua_pushlightuserdata">lua_pushlightuserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_pushliteral">lua_pushliteral</A><BR>[m
[31m-<A HREF="manual.html#lua_pushlstring">lua_pushlstring</A><BR>[m
[31m-<A HREF="manual.html#lua_pushnil">lua_pushnil</A><BR>[m
[31m-<A HREF="manual.html#lua_pushnumber">lua_pushnumber</A><BR>[m
[31m-<A HREF="manual.html#lua_pushstring">lua_pushstring</A><BR>[m
[31m-<A HREF="manual.html#lua_pushthread">lua_pushthread</A><BR>[m
[31m-<A HREF="manual.html#lua_pushvalue">lua_pushvalue</A><BR>[m
[31m-<A HREF="manual.html#lua_pushvfstring">lua_pushvfstring</A><BR>[m
[31m-<A HREF="manual.html#lua_rawequal">lua_rawequal</A><BR>[m
[31m-<A HREF="manual.html#lua_rawget">lua_rawget</A><BR>[m
[31m-<A HREF="manual.html#lua_rawgeti">lua_rawgeti</A><BR>[m
[31m-<A HREF="manual.html#lua_rawset">lua_rawset</A><BR>[m
[31m-<A HREF="manual.html#lua_rawseti">lua_rawseti</A><BR>[m
[31m-<A HREF="manual.html#lua_register">lua_register</A><BR>[m
[31m-<A HREF="manual.html#lua_remove">lua_remove</A><BR>[m
[31m-<A HREF="manual.html#lua_replace">lua_replace</A><BR>[m
[31m-<A HREF="manual.html#lua_resume">lua_resume</A><BR>[m
[31m-<A HREF="manual.html#lua_setallocf">lua_setallocf</A><BR>[m
[31m-<A HREF="manual.html#lua_setfenv">lua_setfenv</A><BR>[m
[31m-<A HREF="manual.html#lua_setfield">lua_setfield</A><BR>[m
[31m-<A HREF="manual.html#lua_setglobal">lua_setglobal</A><BR>[m
[31m-<A HREF="manual.html#lua_sethook">lua_sethook</A><BR>[m
[31m-<A HREF="manual.html#lua_setlocal">lua_setlocal</A><BR>[m
[31m-<A HREF="manual.html#lua_setmetatable">lua_setmetatable</A><BR>[m
[31m-<A HREF="manual.html#lua_settable">lua_settable</A><BR>[m
[31m-<A HREF="manual.html#lua_settop">lua_settop</A><BR>[m
[31m-<A HREF="manual.html#lua_setupvalue">lua_setupvalue</A><BR>[m
[31m-<A HREF="manual.html#lua_status">lua_status</A><BR>[m
[31m-<A HREF="manual.html#lua_toboolean">lua_toboolean</A><BR>[m
[31m-<A HREF="manual.html#lua_tocfunction">lua_tocfunction</A><BR>[m
[31m-<A HREF="manual.html#lua_tointeger">lua_tointeger</A><BR>[m
[31m-<A HREF="manual.html#lua_tolstring">lua_tolstring</A><BR>[m
[31m-<A HREF="manual.html#lua_tonumber">lua_tonumber</A><BR>[m
[31m-<A HREF="manual.html#lua_topointer">lua_topointer</A><BR>[m
[31m-<A HREF="manual.html#lua_tostring">lua_tostring</A><BR>[m
[31m-<A HREF="manual.html#lua_tothread">lua_tothread</A><BR>[m
[31m-<A HREF="manual.html#lua_touserdata">lua_touserdata</A><BR>[m
[31m-<A HREF="manual.html#lua_type">lua_type</A><BR>[m
[31m-<A HREF="manual.html#lua_typename">lua_typename</A><BR>[m
[31m-<A HREF="manual.html#lua_upvalueindex">lua_upvalueindex</A><BR>[m
[31m-<A HREF="manual.html#lua_xmove">lua_xmove</A><BR>[m
[31m-<A HREF="manual.html#lua_yield">lua_yield</A><BR>[m
[31m-[m
[31m-</TD>[m
[31m-<TD>[m
[31m-<H3>auxiliary library</H3>[m
[31m-<A HREF="manual.html#luaL_Buffer">luaL_Buffer</A><BR>[m
[31m-<A HREF="manual.html#luaL_Reg">luaL_Reg</A><BR>[m
[31m-<P>[m
[31m-[m
[31m-<A HREF="manual.html#luaL_addchar">luaL_addchar</A><BR>[m
[31m-<A HREF="manual.html#luaL_addlstring">luaL_addlstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_addsize">luaL_addsize</A><BR>[m
[31m-<A HREF="manual.html#luaL_addstring">luaL_addstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_addvalue">luaL_addvalue</A><BR>[m
[31m-<A HREF="manual.html#luaL_argcheck">luaL_argcheck</A><BR>[m
[31m-<A HREF="manual.html#luaL_argerror">luaL_argerror</A><BR>[m
[31m-<A HREF="manual.html#luaL_buffinit">luaL_buffinit</A><BR>[m
[31m-<A HREF="manual.html#luaL_callmeta">luaL_callmeta</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkany">luaL_checkany</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkint">luaL_checkint</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkinteger">luaL_checkinteger</A><BR>[m
[31m-<A HREF="manual.html#luaL_checklong">luaL_checklong</A><BR>[m
[31m-<A HREF="manual.html#luaL_checklstring">luaL_checklstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_checknumber">luaL_checknumber</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkoption">luaL_checkoption</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkstack">luaL_checkstack</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkstring">luaL_checkstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_checktype">luaL_checktype</A><BR>[m
[31m-<A HREF="manual.html#luaL_checkudata">luaL_checkudata</A><BR>[m
[31m-<A HREF="manual.html#luaL_dofile">luaL_dofile</A><BR>[m
[31m-<A HREF="manual.html#luaL_dostring">luaL_dostring</A><BR>[m
[31m-<A HREF="manual.html#luaL_error">luaL_error</A><BR>[m
[31m-<A HREF="manual.html#luaL_getmetafield">luaL_getmetafield</A><BR>[m
[31m-<A HREF="manual.html#luaL_getmetatable">luaL_getmetatable</A><BR>[m
[31m-<A HREF="manual.html#luaL_gsub">luaL_gsub</A><BR>[m
[31m-<A HREF="manual.html#luaL_loadbuffer">luaL_loadbuffer</A><BR>[m
[31m-<A HREF="manual.html#luaL_loadfile">luaL_loadfile</A><BR>[m
[31m-<A HREF="manual.html#luaL_loadstring">luaL_loadstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_newmetatable">luaL_newmetatable</A><BR>[m
[31m-<A HREF="manual.html#luaL_newstate">luaL_newstate</A><BR>[m
[31m-<A HREF="manual.html#luaL_openlibs">luaL_openlibs</A><BR>[m
[31m-<A HREF="manual.html#luaL_optint">luaL_optint</A><BR>[m
[31m-<A HREF="manual.html#luaL_optinteger">luaL_optinteger</A><BR>[m
[31m-<A HREF="manual.html#luaL_optlong">luaL_optlong</A><BR>[m
[31m-<A HREF="manual.html#luaL_optlstring">luaL_optlstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_optnumber">luaL_optnumber</A><BR>[m
[31m-<A HREF="manual.html#luaL_optstring">luaL_optstring</A><BR>[m
[31m-<A HREF="manual.html#luaL_prepbuffer">luaL_prepbuffer</A><BR>[m
[31m-<A HREF="manual.html#luaL_pushresult">luaL_pushresult</A><BR>[m
[31m-<A HREF="manual.html#luaL_ref">luaL_ref</A><BR>[m
[31m-<A HREF="manual.html#luaL_register">luaL_register</A><BR>[m
[31m-<A HREF="manual.html#luaL_typename">luaL_typename</A><BR>[m
[31m-<A HREF="manual.html#luaL_typerror">luaL_typerror</A><BR>[m
[31m-<A HREF="manual.html#luaL_unref">luaL_unref</A><BR>[m
[31m-<A HREF="manual.html#luaL_where">luaL_where</A><BR>[m
[31m-[m
[31m-</TD>[m
[31m-</TR>[m
[31m-</TABLE>[m
[31m-<P>[m
[31m-[m
[31m-<HR>[m
[31m-<SMALL CLASS="footer">[m
[31m-Last update:[m
[31m-Mon Feb 13 18:53:32 BRST 2012[m
[31m-</SMALL>[m
[31m-<!--[m
[31m-Last change: revised for Lua 5.1.5[m
[31m--->[m
[31m-[m
[31m-</BODY>[m
[31m-</HTML>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/cover.png b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/cover.png[m
[1mdeleted file mode 100644[m
[1mindex 2dbb198..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/cover.png and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/logo.gif b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/logo.gif[m
[1mdeleted file mode 100644[m
[1mindex 2f5e4ac..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/logo.gif and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.1 b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.1[m
[1mdeleted file mode 100644[m
[1mindex 24809cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.1[m
[1m+++ /dev/null[m
[36m@@ -1,163 +0,0 @@[m
[31m-.\" $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $[m
[31m-.TH LUA 1 "$Date: 2006/01/06 16:03:34 $"[m
[31m-.SH NAME[m
[31m-lua \- Lua interpreter[m
[31m-.SH SYNOPSIS[m
[31m-.B lua[m
[31m-[[m
[31m-.I options[m
[31m-][m
[31m-[[m
[31m-.I script[m
[31m-[[m
[31m-.I args[m
[31m-][m
[31m-][m
[31m-.SH DESCRIPTION[m
[31m-.B lua[m
[31m-is the stand-alone Lua interpreter.[m
[31m-It loads and executes Lua programs,[m
[31m-either in textual source form or[m
[31m-in precompiled binary form.[m
[31m-(Precompiled binaries are output by[m
[31m-.BR luac ,[m
[31m-the Lua compiler.)[m
[31m-.B lua[m
[31m-can be used as a batch interpreter and also interactively.[m
[31m-.LP[m
[31m-The given[m
[31m-.I options[m
[31m-(see below)[m
[31m-are executed and then[m
[31m-the Lua program in file[m
[31m-.I script[m
[31m-is loaded and executed.[m
[31m-The given[m
[31m-.I args[m
[31m-are available to[m
[31m-.I script[m
[31m-as strings in a global table named[m
[31m-.BR arg .[m
[31m-If these arguments contain spaces or other characters special to the shell,[m
[31m-then they should be quoted[m
[31m-(but note that the quotes will be removed by the shell).[m
[31m-The arguments in[m
[31m-.B arg[m
[31m-start at 0,[m
[31m-which contains the string[m
[31m-.RI ' script '.[m
[31m-The index of the last argument is stored in[m
[31m-.BR arg.n .[m
[31m-The arguments given in the command line before[m
[31m-.IR script ,[m
[31m-including the name of the interpreter,[m
[31m-are available in negative indices in[m
[31m-.BR arg .[m
[31m-.LP[m
[31m-At the very start,[m
[31m-before even handling the command line,[m
[31m-.B lua[m
[31m-executes the contents of the environment variable[m
[31m-.BR LUA_INIT ,[m
[31m-if it is defined.[m
[31m-If the value of[m
[31m-.B LUA_INIT[m
[31m-is of the form[m
[31m-.RI '@ filename ',[m
[31m-then[m
[31m-.I filename[m
[31m-is executed.[m
[31m-Otherwise, the string is assumed to be a Lua statement and is executed.[m
[31m-.LP[m
[31m-Options start with[m
[31m-.B '\-'[m
[31m-and are described below.[m
[31m-You can use[m
[31m-.B "'\--'"[m
[31m-to signal the end of options.[m
[31m-.LP[m
[31m-If no arguments are given,[m
[31m-then[m
[31m-.B "\-v \-i"[m
[31m-is assumed when the standard input is a terminal;[m
[31m-otherwise,[m
[31m-.B "\-"[m
[31m-is assumed.[m
[31m-.LP[m
[31m-In interactive mode,[m
[31m-.B lua[m
[31m-prompts the user,[m
[31m-reads lines from the standard input,[m
[31m-and executes them as they are read.[m
[31m-If a line does not contain a complete statement,[m
[31m-then a secondary prompt is displayed and[m
[31m-lines are read until a complete statement is formed or[m
[31m-a syntax error is found.[m
[31m-So, one way to interrupt the reading of an incomplete statement is[m
[31m-to force a syntax error:[m
[31m-adding a[m
[31m-.B ';' [m
[31m-in the middle of a statement is a sure way of forcing a syntax error[m
[31m-(except inside multiline strings and comments; these must be closed explicitly).[m
[31m-If a line starts with[m
[31m-.BR '=' ,[m
[31m-then[m
[31m-.B lua[m
[31m-displays the values of all the expressions in the remainder of the[m
[31m-line. The expressions must be separated by commas.[m
[31m-The primary prompt is the value of the global variable[m
[31m-.BR _PROMPT ,[m
[31m-if this value is a string;[m
[31m-otherwise, the default prompt is used.[m
[31m-Similarly, the secondary prompt is the value of the global variable[m
[31m-.BR _PROMPT2 .[m
[31m-So,[m
[31m-to change the prompts,[m
[31m-set the corresponding variable to a string of your choice.[m
[31m-You can do that after calling the interpreter[m
[31m-or on the command line[m
[31m-(but in this case you have to be careful with quotes[m
[31m-if the prompt string contains a space; otherwise you may confuse the shell.)[m
[31m-The default prompts are "> " and ">> ".[m
[31m-.SH OPTIONS[m
[31m-.TP[m
[31m-.B \-[m
[31m-load and execute the standard input as a file,[m
[31m-that is,[m
[31m-not interactively,[m
[31m-even when the standard input is a terminal.[m
[31m-.TP[m
[31m-.BI \-e " stat"[m
[31m-execute statement[m
[31m-.IR stat .[m
[31m-You need to quote[m
[31m-.I stat [m
[31m-if it contains spaces, quotes,[m
[31m-or other characters special to the shell.[m
[31m-.TP[m
[31m-.B \-i[m
[31m-enter interactive mode after[m
[31m-.I script[m
[31m-is executed.[m
[31m-.TP[m
[31m-.BI \-l " name"[m
[31m-call[m
[31m-.BI require(' name ')[m
[31m-before executing[m
[31m-.IR script .[m
[31m-Typically used to load libraries.[m
[31m-.TP[m
[31m-.B \-v[m
[31m-show version information.[m
[31m-.SH "SEE ALSO"[m
[31m-.BR luac (1)[m
[31m-.br[m
[31m-http://www.lua.org/[m
[31m-.SH DIAGNOSTICS[m
[31m-Error messages should be self explanatory.[m
[31m-.SH AUTHORS[m
[31m-R. Ierusalimschy,[m
[31m-L. H. de Figueiredo,[m
[31m-and[m
[31m-W. Celes[m
[31m-.\" EOF[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.css b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.css[m
[1mdeleted file mode 100644[m
[1mindex 7fafbb1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.css[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-body {[m
[31m-	color: #000000 ;[m
[31m-	background-color: #FFFFFF ;[m
[31m-	font-family: Helvetica, Arial, sans-serif ;[m
[31m-	text-align: justify ;[m
[31m-	margin-right: 30px ;[m
[31m-	margin-left: 30px ;[m
[31m-}[m
[31m-[m
[31m-h1, h2, h3, h4 {[m
[31m-	font-family: Verdana, Geneva, sans-serif ;[m
[31m-	font-weight: normal ;[m
[31m-	font-style: italic ;[m
[31m-}[m
[31m-[m
[31m-h2 {[m
[31m-	padding-top: 0.4em ;[m
[31m-	padding-bottom: 0.4em ;[m
[31m-	padding-left: 30px ;[m
[31m-	padding-right: 30px ;[m
[31m-	margin-left: -30px ;[m
[31m-	background-color: #E0E0FF ;[m
[31m-}[m
[31m-[m
[31m-h3 {[m
[31m-	padding-left: 0.5em ;[m
[31m-	border-left: solid #E0E0FF 1em ;[m
[31m-}[m
[31m-[m
[31m-table h3 {[m
[31m-	padding-left: 0px ;[m
[31m-	border-left: none ;[m
[31m-}[m
[31m-[m
[31m-a:link {[m
[31m-	color: #000080 ;[m
[31m-	background-color: inherit ;[m
[31m-	text-decoration: none ;[m
[31m-}[m
[31m-[m
[31m-a:visited {[m
[31m-	background-color: inherit ;[m
[31m-	text-decoration: none ;[m
[31m-}[m
[31m-[m
[31m-a:link:hover, a:visited:hover {[m
[31m-	color: #000080 ;[m
[31m-	background-color: #E0E0FF ;[m
[31m-}[m
[31m-[m
[31m-a:link:active, a:visited:active {[m
[31m-	color: #FF0000 ;[m
[31m-}[m
[31m-[m
[31m-hr {[m
[31m-	border: 0 ;[m
[31m-	height: 1px ;[m
[31m-	color: #a0a0a0 ;[m
[31m-	background-color: #a0a0a0 ;[m
[31m-}[m
[31m-[m
[31m-:target {[m
[31m-	background-color: #F8F8F8 ;[m
[31m-	padding: 8px ;[m
[31m-	border: solid #a0a0a0 2px ;[m
[31m-}[m
[31m-[m
[31m-.footer {[m
[31m-	color: gray ;[m
[31m-	font-size: small ;[m
[31m-}[m
[31m-[m
[31m-input[type=text] {[m
[31m-	border: solid #a0a0a0 2px ;[m
[31m-	border-radius: 2em ;[m
[31m-	-moz-border-radius: 2em ;[m
[31m-	background-image: url('images/search.png') ;[m
[31m-	background-repeat: no-repeat;[m
[31m-	background-position: 4px center ;[m
[31m-	padding-left: 20px ;[m
[31m-	height: 2em ;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.html[m
[1mdeleted file mode 100644[m
[1mindex 1d435ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/lua.html[m
[1m+++ /dev/null[m
[36m@@ -1,172 +0,0 @@[m
[31m-<!-- $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $ -->[m
[31m-<HTML>[m
[31m-<HEAD>[m
[31m-<TITLE>LUA man page</TITLE>[m
[31m-<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">[m
[31m-</HEAD>[m
[31m-[m
[31m-<BODY BGCOLOR="#FFFFFF">[m
[31m-[m
[31m-<H2>NAME</H2>[m
[31m-lua - Lua interpreter[m
[31m-<H2>SYNOPSIS</H2>[m
[31m-<B>lua</B>[m
[31m-[[m
[31m-<I>options</I>[m
[31m-][m
[31m-[[m
[31m-<I>script</I>[m
[31m-[[m
[31m-<I>args</I>[m
[31m-][m
[31m-][m
[31m-<H2>DESCRIPTION</H2>[m
[31m-<B>lua</B>[m
[31m-is the stand-alone Lua interpreter.[m
[31m-It loads and executes Lua programs,[m
[31m-either in textual source form or[m
[31m-in precompiled binary form.[m
[31m-(Precompiled binaries are output by[m
[31m-<B>luac</B>,[m
[31m-the Lua compiler.)[m
[31m-<B>lua</B>[m
[31m-can be used as a batch interpreter and also interactively.[m
[31m-<P>[m
[31m-The given[m
[31m-<I>options</I>[m
[31m-(see below)[m
[31m-are executed and then[m
[31m-the Lua program in file[m
[31m-<I>script</I>[m
[31m-is loaded and executed.[m
[31m-The given[m
[31m-<I>args</I>[m
[31m-are available to[m
[31m-<I>script</I>[m
[31m-as strings in a global table named[m
[31m-<B>arg</B>.[m
[31m-If these arguments contain spaces or other characters special to the shell,[m
[31m-then they should be quoted[m
[31m-(but note that the quotes will be removed by the shell).[m
[31m-The arguments in[m
[31m-<B>arg</B>[m
[31m-start at 0,[m
[31m-which contains the string[m
[31m-'<I>script</I>'.[m
[31m-The index of the last argument is stored in[m
[31m-<B>arg.n</B>.[m
[31m-The arguments given in the command line before[m
[31m-<I>script</I>,[m
[31m-including the name of the interpreter,[m
[31m-are available in negative indices in[m
[31m-<B>arg</B>.[m
[31m-<P>[m
[31m-At the very start,[m
[31m-before even handling the command line,[m
[31m-<B>lua</B>[m
[31m-executes the contents of the environment variable[m
[31m-<B>LUA_INIT</B>,[m
[31m-if it is defined.[m
[31m-If the value of[m
[31m-<B>LUA_INIT</B>[m
[31m-is of the form[m
[31m-'@<I>filename</I>',[m
[31m-then[m
[31m-<I>filename</I>[m
[31m-is executed.[m
[31m-Otherwise, the string is assumed to be a Lua statement and is executed.[m
[31m-<P>[m
[31m-Options start with[m
[31m-<B>'-'</B>[m
[31m-and are described below.[m
[31m-You can use[m
[31m-<B>'--'</B>[m
[31m-to signal the end of options.[m
[31m-<P>[m
[31m-If no arguments are given,[m
[31m-then[m
[31m-<B>"-v -i"</B>[m
[31m-is assumed when the standard input is a terminal;[m
[31m-otherwise,[m
[31m-<B>"-"</B>[m
[31m-is assumed.[m
[31m-<P>[m
[31m-In interactive mode,[m
[31m-<B>lua</B>[m
[31m-prompts the user,[m
[31m-reads lines from the standard input,[m
[31m-and executes them as they are read.[m
[31m-If a line does not contain a complete statement,[m
[31m-then a secondary prompt is displayed and[m
[31m-lines are read until a complete statement is formed or[m
[31m-a syntax error is found.[m
[31m-So, one way to interrupt the reading of an incomplete statement is[m
[31m-to force a syntax error:[m
[31m-adding a[m
[31m-<B>';'</B>[m
[31m-in the middle of a statement is a sure way of forcing a syntax error[m
[31m-(except inside multiline strings and comments; these must be closed explicitly).[m
[31m-If a line starts with[m
[31m-<B>'='</B>,[m
[31m-then[m
[31m-<B>lua</B>[m
[31m-displays the values of all the expressions in the remainder of the[m
[31m-line. The expressions must be separated by commas.[m
[31m-The primary prompt is the value of the global variable[m
[31m-<B>_PROMPT</B>,[m
[31m-if this value is a string;[m
[31m-otherwise, the default prompt is used.[m
[31m-Similarly, the secondary prompt is the value of the global variable[m
[31m-<B>_PROMPT2</B>.[m
[31m-So,[m
[31m-to change the prompts,[m
[31m-set the corresponding variable to a string of your choice.[m
[31m-You can do that after calling the interpreter[m
[31m-or on the command line[m
[31m-(but in this case you have to be careful with quotes[m
[31m-if the prompt string contains a space; otherwise you may confuse the shell.)[m
[31m-The default prompts are "&gt; " and "&gt;&gt; ".[m
[31m-<H2>OPTIONS</H2>[m
[31m-<P>[m
[31m-<B>-</B>[m
[31m-load and execute the standard input as a file,[m
[31m-that is,[m
[31m-not interactively,[m
[31m-even when the standard input is a terminal.[m
[31m-<P>[m
[31m-<B>-e </B><I>stat</I>[m
[31m-execute statement[m
[31m-<I>stat</I>.[m
[31m-You need to quote[m
[31m-<I>stat </I>[m
[31m-if it contains spaces, quotes,[m
[31m-or other characters special to the shell.[m
[31m-<P>[m
[31m-<B>-i</B>[m
[31m-enter interactive mode after[m
[31m-<I>script</I>[m
[31m-is executed.[m
[31m-<P>[m
[31m-<B>-l </B><I>name</I>[m
[31m-call[m
[31m-<B>require</B>('<I>name</I>')[m
[31m-before executing[m
[31m-<I>script</I>.[m
[31m-Typically used to load libraries.[m
[31m-<P>[m
[31m-<B>-v</B>[m
[31m-show version information.[m
[31m-<H2>SEE ALSO</H2>[m
[31m-<B>luac</B>(1)[m
[31m-<BR>[m
[31m-<A HREF="http://www.lua.org/">http://www.lua.org/</A>[m
[31m-<H2>DIAGNOSTICS</H2>[m
[31m-Error messages should be self explanatory.[m
[31m-<H2>AUTHORS</H2>[m
[31m-R. Ierusalimschy,[m
[31m-L. H. de Figueiredo,[m
[31m-and[m
[31m-W. Celes[m
[31m-<!-- EOF -->[m
[31m-</BODY>[m
[31m-</HTML>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/luac.1 b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/luac.1[m
[1mdeleted file mode 100644[m
[1mindex d814678..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/luac.1[m
[1m+++ /dev/null[m
[36m@@ -1,136 +0,0 @@[m
[31m-.\" $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $[m
[31m-.TH LUAC 1 "$Date: 2006/01/06 16:03:34 $"[m
[31m-.SH NAME[m
[31m-luac \- Lua compiler[m
[31m-.SH SYNOPSIS[m
[31m-.B luac[m
[31m-[[m
[31m-.I options[m
[31m-] [[m
[31m-.I filenames[m
[31m-][m
[31m-.SH DESCRIPTION[m
[31m-.B luac[m
[31m-is the Lua compiler.[m
[31m-It translates programs written in the Lua programming language[m
[31m-into binary files that can be later loaded and executed.[m
[31m-.LP[m
[31m-The main advantages of precompiling chunks are:[m
[31m-faster loading,[m
[31m-protecting source code from accidental user changes,[m
[31m-and[m
[31m-off-line syntax checking.[m
[31m-.LP[m
[31m-Pre-compiling does not imply faster execution[m
[31m-because in Lua chunks are always compiled into bytecodes before being executed.[m
[31m-.B luac[m
[31m-simply allows those bytecodes to be saved in a file for later execution.[m
[31m-.LP[m
[31m-Pre-compiled chunks are not necessarily smaller than the corresponding source.[m
[31m-The main goal in pre-compiling is faster loading.[m
[31m-.LP[m
[31m-The binary files created by[m
[31m-.B luac[m
[31m-are portable only among architectures with the same word size and byte order.[m
[31m-.LP[m
[31m-.B luac[m
[31m-produces a single output file containing the bytecodes[m
[31m-for all source files given.[m
[31m-By default,[m
[31m-the output file is named[m
[31m-.BR luac.out ,[m
[31m-but you can change this with the[m
[31m-.B \-o[m
[31m-option.[m
[31m-.LP[m
[31m-In the command line,[m
[31m-you can mix[m
[31m-text files containing Lua source and[m
[31m-binary files containing precompiled chunks.[m
[31m-This is useful to combine several precompiled chunks,[m
[31m-even from different (but compatible) platforms,[m
[31m-into a single precompiled chunk.[m
[31m-.LP[m
[31m-You can use[m
[31m-.B "'\-'"[m
[31m-to indicate the standard input as a source file[m
[31m-and[m
[31m-.B "'\--'"[m
[31m-to signal the end of options[m
[31m-(that is,[m
[31m-all remaining arguments will be treated as files even if they start with[m
[31m-.BR "'\-'" ).[m
[31m-.LP[m
[31m-The internal format of the binary files produced by[m
[31m-.B luac[m
[31m-is likely to change when a new version of Lua is released.[m
[31m-So,[m
[31m-save the source files of all Lua programs that you precompile.[m
[31m-.LP[m
[31m-.SH OPTIONS[m
[31m-Options must be separate.[m
[31m-.TP[m
[31m-.B \-l[m
[31m-produce a listing of the compiled bytecode for Lua's virtual machine.[m
[31m-Listing bytecodes is useful to learn about Lua's virtual machine.[m
[31m-If no files are given, then[m
[31m-.B luac[m
[31m-loads[m
[31m-.B luac.out[m
[31m-and lists its contents.[m
[31m-.TP[m
[31m-.BI \-o " file"[m
[31m-output to[m
[31m-.IR file ,[m
[31m-instead of the default[m
[31m-.BR luac.out .[m
[31m-(You can use[m
[31m-.B "'\-'"[m
[31m-for standard output,[m
[31m-but not on platforms that open standard output in text mode.)[m
[31m-The output file may be a source file because[m
[31m-all files are loaded before the output file is written.[m
[31m-Be careful not to overwrite precious files.[m
[31m-.TP[m
[31m-.B \-p[m
[31m-load files but do not generate any output file.[m
[31m-Used mainly for syntax checking and for testing precompiled chunks:[m
[31m-corrupted files will probably generate errors when loaded.[m
[31m-Lua always performs a thorough integrity test on precompiled chunks.[m
[31m-Bytecode that passes this test is completely safe,[m
[31m-in the sense that it will not break the interpreter.[m
[31m-However,[m
[31m-there is no guarantee that such code does anything sensible.[m
[31m-(None can be given, because the halting problem is unsolvable.)[m
[31m-If no files are given, then[m
[31m-.B luac[m
[31m-loads[m
[31m-.B luac.out[m
[31m-and tests its contents.[m
[31m-No messages are displayed if the file passes the integrity test.[m
[31m-.TP[m
[31m-.B \-s[m
[31m-strip debug information before writing the output file.[m
[31m-This saves some space in very large chunks,[m
[31m-but if errors occur when running a stripped chunk,[m
[31m-then the error messages may not contain the full information they usually do.[m
[31m-For instance,[m
[31m-line numbers and names of local variables are lost.[m
[31m-.TP[m
[31m-.B \-v[m
[31m-show version information.[m
[31m-.SH FILES[m
[31m-.TP 15[m
[31m-.B luac.out[m
[31m-default output file[m
[31m-.SH "SEE ALSO"[m
[31m-.BR lua (1)[m
[31m-.br[m
[31m-http://www.lua.org/[m
[31m-.SH DIAGNOSTICS[m
[31m-Error messages should be self explanatory.[m
[31m-.SH AUTHORS[m
[31m-L. H. de Figueiredo,[m
[31m-R. Ierusalimschy and[m
[31m-W. Celes[m
[31m-.\" EOF[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/luac.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/luac.html[m
[1mdeleted file mode 100644[m
[1mindex 179ffe8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/luac.html[m
[1m+++ /dev/null[m
[36m@@ -1,145 +0,0 @@[m
[31m-<!-- $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $ -->[m
[31m-<HTML>[m
[31m-<HEAD>[m
[31m-<TITLE>LUAC man page</TITLE>[m
[31m-<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">[m
[31m-</HEAD>[m
[31m-[m
[31m-<BODY BGCOLOR="#FFFFFF">[m
[31m-[m
[31m-<H2>NAME</H2>[m
[31m-luac - Lua compiler[m
[31m-<H2>SYNOPSIS</H2>[m
[31m-<B>luac</B>[m
[31m-[[m
[31m-<I>options</I>[m
[31m-] [[m
[31m-<I>filenames</I>[m
[31m-][m
[31m-<H2>DESCRIPTION</H2>[m
[31m-<B>luac</B>[m
[31m-is the Lua compiler.[m
[31m-It translates programs written in the Lua programming language[m
[31m-into binary files that can be later loaded and executed.[m
[31m-<P>[m
[31m-The main advantages of precompiling chunks are:[m
[31m-faster loading,[m
[31m-protecting source code from accidental user changes,[m
[31m-and[m
[31m-off-line syntax checking.[m
[31m-<P>[m
[31m-Precompiling does not imply faster execution[m
[31m-because in Lua chunks are always compiled into bytecodes before being executed.[m
[31m-<B>luac</B>[m
[31m-simply allows those bytecodes to be saved in a file for later execution.[m
[31m-<P>[m
[31m-Precompiled chunks are not necessarily smaller than the corresponding source.[m
[31m-The main goal in precompiling is faster loading.[m
[31m-<P>[m
[31m-The binary files created by[m
[31m-<B>luac</B>[m
[31m-are portable only among architectures with the same word size and byte order.[m
[31m-<P>[m
[31m-<B>luac</B>[m
[31m-produces a single output file containing the bytecodes[m
[31m-for all source files given.[m
[31m-By default,[m
[31m-the output file is named[m
[31m-<B>luac.out</B>,[m
[31m-but you can change this with the[m
[31m-<B>-o</B>[m
[31m-option.[m
[31m-<P>[m
[31m-In the command line,[m
[31m-you can mix[m
[31m-text files containing Lua source and[m
[31m-binary files containing precompiled chunks.[m
[31m-This is useful because several precompiled chunks,[m
[31m-even from different (but compatible) platforms,[m
[31m-can be combined into a single precompiled chunk.[m
[31m-<P>[m
[31m-You can use[m
[31m-<B>'-'</B>[m
[31m-to indicate the standard input as a source file[m
[31m-and[m
[31m-<B>'--'</B>[m
[31m-to signal the end of options[m
[31m-(that is,[m
[31m-all remaining arguments will be treated as files even if they start with[m
[31m-<B>'-'</B>).[m
[31m-<P>[m
[31m-The internal format of the binary files produced by[m
[31m-<B>luac</B>[m
[31m-is likely to change when a new version of Lua is released.[m
[31m-So,[m
[31m-save the source files of all Lua programs that you precompile.[m
[31m-<P>[m
[31m-<H2>OPTIONS</H2>[m
[31m-Options must be separate.[m
[31m-<P>[m
[31m-<B>-l</B>[m
[31m-produce a listing of the compiled bytecode for Lua's virtual machine.[m
[31m-Listing bytecodes is useful to learn about Lua's virtual machine.[m
[31m-If no files are given, then[m
[31m-<B>luac</B>[m
[31m-loads[m
[31m-<B>luac.out</B>[m
[31m-and lists its contents.[m
[31m-<P>[m
[31m-<B>-o </B><I>file</I>[m
[31m-output to[m
[31m-<I>file</I>,[m
[31m-instead of the default[m
[31m-<B>luac.out</B>.[m
[31m-(You can use[m
[31m-<B>'-'</B>[m
[31m-for standard output,[m
[31m-but not on platforms that open standard output in text mode.)[m
[31m-The output file may be a source file because[m
[31m-all files are loaded before the output file is written.[m
[31m-Be careful not to overwrite precious files.[m
[31m-<P>[m
[31m-<B>-p</B>[m
[31m-load files but do not generate any output file.[m
[31m-Used mainly for syntax checking and for testing precompiled chunks:[m
[31m-corrupted files will probably generate errors when loaded.[m
[31m-Lua always performs a thorough integrity test on precompiled chunks.[m
[31m-Bytecode that passes this test is completely safe,[m
[31m-in the sense that it will not break the interpreter.[m
[31m-However,[m
[31m-there is no guarantee that such code does anything sensible.[m
[31m-(None can be given, because the halting problem is unsolvable.)[m
[31m-If no files are given, then[m
[31m-<B>luac</B>[m
[31m-loads[m
[31m-<B>luac.out</B>[m
[31m-and tests its contents.[m
[31m-No messages are displayed if the file passes the integrity test.[m
[31m-<P>[m
[31m-<B>-s</B>[m
[31m-strip debug information before writing the output file.[m
[31m-This saves some space in very large chunks,[m
[31m-but if errors occur when running a stripped chunk,[m
[31m-then the error messages may not contain the full information they usually do.[m
[31m-For instance,[m
[31m-line numbers and names of local variables are lost.[m
[31m-<P>[m
[31m-<B>-v</B>[m
[31m-show version information.[m
[31m-<H2>FILES</H2>[m
[31m-<P>[m
[31m-<B>luac.out</B>[m
[31m-default output file[m
[31m-<H2>SEE ALSO</H2>[m
[31m-<B>lua</B>(1)[m
[31m-<BR>[m
[31m-<A HREF="http://www.lua.org/">http://www.lua.org/</A>[m
[31m-<H2>DIAGNOSTICS</H2>[m
[31m-Error messages should be self explanatory.[m
[31m-<H2>AUTHORS</H2>[m
[31m-L. H. de Figueiredo,[m
[31m-R. Ierusalimschy and[m
[31m-W. Celes[m
[31m-<!-- EOF -->[m
[31m-</BODY>[m
[31m-</HTML>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/manual.css b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/manual.css[m
[1mdeleted file mode 100644[m
[1mindex b49b362..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/manual.css[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-h3 code {[m
[31m-	font-family: inherit ;[m
[31m-	font-size: inherit ;[m
[31m-}[m
[31m-[m
[31m-pre, code {[m
[31m-	font-size: 12pt ;[m
[31m-}[m
[31m-[m
[31m-span.apii {[m
[31m-	float: right ;[m
[31m-	font-family: inherit ;[m
[31m-	font-style: normal ;[m
[31m-	font-size: small ;[m
[31m-	color: gray ;[m
[31m-}[m
[31m-[m
[31m-p+h1, ul+h1 {[m
[31m-	padding-top: 0.4em ;[m
[31m-	padding-bottom: 0.4em ;[m
[31m-	padding-left: 30px ;[m
[31m-	margin-left: -30px ;[m
[31m-	background-color: #E0E0FF ;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/manual.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/manual.html[m
[1mdeleted file mode 100644[m
[1mindex 4e41683..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/manual.html[m
[1m+++ /dev/null[m
[36m@@ -1,8804 +0,0 @@[m
[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">[m
[31m-<html>[m
[31m-[m
[31m-<head>[m
[31m-<title>Lua 5.1 Reference Manual</title>[m
[31m-<link rel="stylesheet" type="text/css" href="lua.css">[m
[31m-<link rel="stylesheet" type="text/css" href="manual.css">[m
[31m-<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-1">[m
[31m-</head>[m
[31m-[m
[31m-<body>[m
[31m-[m
[31m-<hr>[m
[31m-<h1>[m
[31m-<a href="http://www.lua.org/"><img src="logo.gif" alt="" border="0"></a>[m
[31m-Lua 5.1 Reference Manual[m
[31m-</h1>[m
[31m-[m
[31m-by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes[m
[31m-<p>[m
[31m-<small>[m
[31m-Copyright &copy; 2006&ndash;2012 Lua.org, PUC-Rio.[m
[31m-Freely available under the terms of the[m
[31m-<a href="http://www.lua.org/license.html">Lua license</a>.[m
[31m-</small>[m
[31m-<hr>[m
[31m-<p>[m
[31m-[m
[31m-<a href="contents.html#contents">contents</A>[m
[31m-&middot;[m
[31m-<a href="contents.html#index">index</A>[m
[31m-&middot;[m
[31m-<A HREF="http://www.lua.org/manual/">other versions</A>[m
[31m-[m
[31m-<!-- ====================================================================== -->[m
[31m-<p>[m
[31m-[m
[31m-<!-- $Id: manual.of,v 1.49.1.2 2012/01/13 20:23:26 roberto Exp $ -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>1 - <a name="1">Introduction</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-Lua is an extension programming language designed to support[m
[31m-general procedural programming with data description[m
[31m-facilities.[m
[31m-It also offers good support for object-oriented programming,[m
[31m-functional programming, and data-driven programming.[m
[31m-Lua is intended to be used as a powerful, light-weight[m
[31m-scripting language for any program that needs one.[m
[31m-Lua is implemented as a library, written in <em>clean</em> C[m
[31m-(that is, in the common subset of ANSI&nbsp;C and C++).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Being an extension language, Lua has no notion of a "main" program:[m
[31m-it only works <em>embedded</em> in a host client,[m
[31m-called the <em>embedding program</em> or simply the <em>host</em>.[m
[31m-This host program can invoke functions to execute a piece of Lua code,[m
[31m-can write and read Lua variables,[m
[31m-and can register C&nbsp;functions to be called by Lua code.[m
[31m-Through the use of C&nbsp;functions, Lua can be augmented to cope with[m
[31m-a wide range of different domains,[m
[31m-thus creating customized programming languages sharing a syntactical framework.[m
[31m-The Lua distribution includes a sample host program called <code>lua</code>,[m
[31m-which uses the Lua library to offer a complete, stand-alone Lua interpreter.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua is free software,[m
[31m-and is provided as usual with no guarantees,[m
[31m-as stated in its license.[m
[31m-The implementation described in this manual is available[m
[31m-at Lua's official web site, <code>www.lua.org</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Like any other reference manual,[m
[31m-this document is dry in places.[m
[31m-For a discussion of the decisions behind the design of Lua,[m
[31m-see the technical papers available at Lua's web site.[m
[31m-For a detailed introduction to programming in Lua,[m
[31m-see Roberto's book, <em>Programming in Lua (Second Edition)</em>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>2 - <a name="2">The Language</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-This section describes the lexis, the syntax, and the semantics of Lua.[m
[31m-In other words,[m
[31m-this section describes[m
[31m-which tokens are valid,[m
[31m-how they can be combined,[m
[31m-and what their combinations mean.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The language constructs will be explained using the usual extended BNF notation,[m
[31m-in which[m
[31m-{<em>a</em>}&nbsp;means&nbsp;0 or more <em>a</em>'s, and[m
[31m-[<em>a</em>]&nbsp;means an optional <em>a</em>.[m
[31m-Non-terminals are shown like non-terminal,[m
[31m-keywords are shown like <b>kword</b>,[m
[31m-and other terminal symbols are shown like `<b>=</b>&acute;.[m
[31m-The complete syntax of Lua can be found in <a href="#8">&sect;8</a>[m
[31m-at the end of this manual.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.1 - <a name="2.1">Lexical Conventions</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-<em>Names</em>[m
[31m-(also called <em>identifiers</em>)[m
[31m-in Lua can be any string of letters,[m
[31m-digits, and underscores,[m
[31m-not beginning with a digit.[m
[31m-This coincides with the definition of names in most languages.[m
[31m-(The definition of letter depends on the current locale:[m
[31m-any character considered alphabetic by the current locale[m
[31m-can be used in an identifier.)[m
[31m-Identifiers are used to name variables and table fields.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The following <em>keywords</em> are reserved[m
[31m-and cannot be used as names:[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     and       break     do        else      elseif[m
[31m-     end       false     for       function  if[m
[31m-     in        local     nil       not       or[m
[31m-     repeat    return    then      true      until     while[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Lua is a case-sensitive language:[m
[31m-<code>and</code> is a reserved word, but <code>And</code> and <code>AND</code>[m
[31m-are two different, valid names.[m
[31m-As a convention, names starting with an underscore followed by[m
[31m-uppercase letters (such as <a href="#pdf-_VERSION"><code>_VERSION</code></a>)[m
[31m-are reserved for internal global variables used by Lua.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The following strings denote other tokens:[m
[31m-[m
[31m-<pre>[m
[31m-     +     -     *     /     %     ^     #[m
[31m-     ==    ~=    &lt;=    &gt;=    &lt;     &gt;     =[m
[31m-     (     )     {     }     [     ][m
[31m-     ;     :     ,     .     ..    ...[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-<em>Literal strings</em>[m
[31m-can be delimited by matching single or double quotes,[m
[31m-and can contain the following C-like escape sequences:[m
[31m-'<code>\a</code>' (bell),[m
[31m-'<code>\b</code>' (backspace),[m
[31m-'<code>\f</code>' (form feed),[m
[31m-'<code>\n</code>' (newline),[m
[31m-'<code>\r</code>' (carriage return),[m
[31m-'<code>\t</code>' (horizontal tab),[m
[31m-'<code>\v</code>' (vertical tab),[m
[31m-'<code>\\</code>' (backslash),[m
[31m-'<code>\"</code>' (quotation mark [double quote]),[m
[31m-and '<code>\'</code>' (apostrophe [single quote]).[m
[31m-Moreover, a backslash followed by a real newline[m
[31m-results in a newline in the string.[m
[31m-A character in a string can also be specified by its numerical value[m
[31m-using the escape sequence <code>\<em>ddd</em></code>,[m
[31m-where <em>ddd</em> is a sequence of up to three decimal digits.[m
[31m-(Note that if a numerical escape is to be followed by a digit,[m
[31m-it must be expressed using exactly three digits.)[m
[31m-Strings in Lua can contain any 8-bit value, including embedded zeros,[m
[31m-which can be specified as '<code>\0</code>'.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Literal strings can also be defined using a long format[m
[31m-enclosed by <em>long brackets</em>.[m
[31m-We define an <em>opening long bracket of level <em>n</em></em> as an opening[m
[31m-square bracket followed by <em>n</em> equal signs followed by another[m
[31m-opening square bracket.[m
[31m-So, an opening long bracket of level&nbsp;0 is written as <code>[[</code>,[m
[31m-an opening long bracket of level&nbsp;1 is written as <code>[=[</code>,[m
[31m-and so on.[m
[31m-A <em>closing long bracket</em> is defined similarly;[m
[31m-for instance, a closing long bracket of level&nbsp;4 is written as <code>]====]</code>.[m
[31m-A long string starts with an opening long bracket of any level and[m
[31m-ends at the first closing long bracket of the same level.[m
[31m-Literals in this bracketed form can run for several lines,[m
[31m-do not interpret any escape sequences,[m
[31m-and ignore long brackets of any other level.[m
[31m-They can contain anything except a closing bracket of the proper level.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-For convenience,[m
[31m-when the opening long bracket is immediately followed by a newline,[m
[31m-the newline is not included in the string.[m
[31m-As an example, in a system using ASCII[m
[31m-(in which '<code>a</code>' is coded as&nbsp;97,[m
[31m-newline is coded as&nbsp;10, and '<code>1</code>' is coded as&nbsp;49),[m
[31m-the five literal strings below denote the same string:[m
[31m-[m
[31m-<pre>[m
[31m-     a = 'alo\n123"'[m
[31m-     a = "alo\n123\""[m
[31m-     a = '\97lo\10\04923"'[m
[31m-     a = [[alo[m
[31m-     123"]][m
[31m-     a = [==[[m
[31m-     alo[m
[31m-     123"]==][m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-A <em>numerical constant</em> can be written with an optional decimal part[m
[31m-and an optional decimal exponent.[m
[31m-Lua also accepts integer hexadecimal constants,[m
[31m-by prefixing them with <code>0x</code>.[m
[31m-Examples of valid numerical constants are[m
[31m-[m
[31m-<pre>[m
[31m-     3   3.0   3.1416   314.16e-2   0.31416E1   0xff   0x56[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-A <em>comment</em> starts with a double hyphen (<code>--</code>)[m
[31m-anywhere outside a string.[m
[31m-If the text immediately after <code>--</code> is not an opening long bracket,[m
[31m-the comment is a <em>short comment</em>,[m
[31m-which runs until the end of the line.[m
[31m-Otherwise, it is a <em>long comment</em>,[m
[31m-which runs until the corresponding closing long bracket.[m
[31m-Long comments are frequently used to disable code temporarily.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.2 - <a name="2.2">Values and Types</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua is a <em>dynamically typed language</em>.[m
[31m-This means that[m
[31m-variables do not have types; only values do.[m
[31m-There are no type definitions in the language.[m
[31m-All values carry their own type.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All values in Lua are <em>first-class values</em>.[m
[31m-This means that all values can be stored in variables,[m
[31m-passed as arguments to other functions, and returned as results.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-There are eight basic types in Lua:[m
[31m-<em>nil</em>, <em>boolean</em>, <em>number</em>,[m
[31m-<em>string</em>, <em>function</em>, <em>userdata</em>,[m
[31m-<em>thread</em>, and <em>table</em>.[m
[31m-<em>Nil</em> is the type of the value <b>nil</b>,[m
[31m-whose main property is to be different from any other value;[m
[31m-it usually represents the absence of a useful value.[m
[31m-<em>Boolean</em> is the type of the values <b>false</b> and <b>true</b>.[m
[31m-Both <b>nil</b> and <b>false</b> make a condition false;[m
[31m-any other value makes it true.[m
[31m-<em>Number</em> represents real (double-precision floating-point) numbers.[m
[31m-(It is easy to build Lua interpreters that use other[m
[31m-internal representations for numbers,[m
[31m-such as single-precision float or long integers;[m
[31m-see file <code>luaconf.h</code>.)[m
[31m-<em>String</em> represents arrays of characters.[m
[31m-[m
[31m-Lua is 8-bit clean:[m
[31m-strings can contain any 8-bit character,[m
[31m-including embedded zeros ('<code>\0</code>') (see <a href="#2.1">&sect;2.1</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua can call (and manipulate) functions written in Lua and[m
[31m-functions written in C[m
[31m-(see <a href="#2.5.8">&sect;2.5.8</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The type <em>userdata</em> is provided to allow arbitrary C&nbsp;data to[m
[31m-be stored in Lua variables.[m
[31m-This type corresponds to a block of raw memory[m
[31m-and has no pre-defined operations in Lua,[m
[31m-except assignment and identity test.[m
[31m-However, by using <em>metatables</em>,[m
[31m-the programmer can define operations for userdata values[m
[31m-(see <a href="#2.8">&sect;2.8</a>).[m
[31m-Userdata values cannot be created or modified in Lua,[m
[31m-only through the C&nbsp;API.[m
[31m-This guarantees the integrity of data owned by the host program.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The type <em>thread</em> represents independent threads of execution[m
[31m-and it is used to implement coroutines (see <a href="#2.11">&sect;2.11</a>).[m
[31m-Do not confuse Lua threads with operating-system threads.[m
[31m-Lua supports coroutines on all systems,[m
[31m-even those that do not support threads.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The type <em>table</em> implements associative arrays,[m
[31m-that is, arrays that can be indexed not only with numbers,[m
[31m-but with any value (except <b>nil</b>).[m
[31m-Tables can be <em>heterogeneous</em>;[m
[31m-that is, they can contain values of all types (except <b>nil</b>).[m
[31m-Tables are the sole data structuring mechanism in Lua;[m
[31m-they can be used to represent ordinary arrays,[m
[31m-symbol tables, sets, records, graphs, trees, etc.[m
[31m-To represent records, Lua uses the field name as an index.[m
[31m-The language supports this representation by[m
[31m-providing <code>a.name</code> as syntactic sugar for <code>a["name"]</code>.[m
[31m-There are several convenient ways to create tables in Lua[m
[31m-(see <a href="#2.5.7">&sect;2.5.7</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Like indices,[m
[31m-the value of a table field can be of any type (except <b>nil</b>).[m
[31m-In particular,[m
[31m-because functions are first-class values,[m
[31m-table fields can contain functions.[m
[31m-Thus tables can also carry <em>methods</em> (see <a href="#2.5.9">&sect;2.5.9</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Tables, functions, threads, and (full) userdata values are <em>objects</em>:[m
[31m-variables do not actually <em>contain</em> these values,[m
[31m-only <em>references</em> to them.[m
[31m-Assignment, parameter passing, and function returns[m
[31m-always manipulate references to such values;[m
[31m-these operations do not imply any kind of copy.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The library function <a href="#pdf-type"><code>type</code></a> returns a string describing the type[m
[31m-of a given value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.2.1 - <a name="2.2.1">Coercion</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-Lua provides automatic conversion between[m
[31m-string and number values at run time.[m
[31m-Any arithmetic operation applied to a string tries to convert[m
[31m-this string to a number, following the usual conversion rules.[m
[31m-Conversely, whenever a number is used where a string is expected,[m
[31m-the number is converted to a string, in a reasonable format.[m
[31m-For complete control over how numbers are converted to strings,[m
[31m-use the <code>format</code> function from the string library[m
[31m-(see <a href="#pdf-string.format"><code>string.format</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.3 - <a name="2.3">Variables</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Variables are places that store values.[m
[31m-[m
[31m-There are three kinds of variables in Lua:[m
[31m-global variables, local variables, and table fields.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A single name can denote a global variable or a local variable[m
[31m-(or a function's formal parameter,[m
[31m-which is a particular kind of local variable):[m
[31m-[m
[31m-<pre>[m
[31m-	var ::= Name[m
[31m-</pre><p>[m
[31m-Name denotes identifiers, as defined in <a href="#2.1">&sect;2.1</a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Any variable is assumed to be global unless explicitly declared[m
[31m-as a local (see <a href="#2.4.7">&sect;2.4.7</a>).[m
[31m-Local variables are <em>lexically scoped</em>:[m
[31m-local variables can be freely accessed by functions[m
[31m-defined inside their scope (see <a href="#2.6">&sect;2.6</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Before the first assignment to a variable, its value is <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Square brackets are used to index a table:[m
[31m-[m
[31m-<pre>[m
[31m-	var ::= prefixexp `<b>[</b>&acute; exp `<b>]</b>&acute;[m
[31m-</pre><p>[m
[31m-The meaning of accesses to global variables [m
[31m-and table fields can be changed via metatables.[m
[31m-An access to an indexed variable <code>t[i]</code> is equivalent to[m
[31m-a call <code>gettable_event(t,i)</code>.[m
[31m-(See <a href="#2.8">&sect;2.8</a> for a complete description of the[m
[31m-<code>gettable_event</code> function.[m
[31m-This function is not defined or callable in Lua.[m
[31m-We use it here only for explanatory purposes.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The syntax <code>var.Name</code> is just syntactic sugar for[m
[31m-<code>var["Name"]</code>:[m
[31m-[m
[31m-<pre>[m
[31m-	var ::= prefixexp `<b>.</b>&acute; Name[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-All global variables live as fields in ordinary Lua tables,[m
[31m-called <em>environment tables</em> or simply[m
[31m-<em>environments</em> (see <a href="#2.9">&sect;2.9</a>).[m
[31m-Each function has its own reference to an environment,[m
[31m-so that all global variables in this function[m
[31m-will refer to this environment table.[m
[31m-When a function is created,[m
[31m-it inherits the environment from the function that created it.[m
[31m-To get the environment table of a Lua function,[m
[31m-you call <a href="#pdf-getfenv"><code>getfenv</code></a>.[m
[31m-To replace it,[m
[31m-you call <a href="#pdf-setfenv"><code>setfenv</code></a>.[m
[31m-(You can only manipulate the environment of C&nbsp;functions[m
[31m-through the debug library; (see <a href="#5.9">&sect;5.9</a>).)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-An access to a global variable <code>x</code>[m
[31m-is equivalent to <code>_env.x</code>,[m
[31m-which in turn is equivalent to[m
[31m-[m
[31m-<pre>[m
[31m-     gettable_event(_env, "x")[m
[31m-</pre><p>[m
[31m-where <code>_env</code> is the environment of the running function.[m
[31m-(See <a href="#2.8">&sect;2.8</a> for a complete description of the[m
[31m-<code>gettable_event</code> function.[m
[31m-This function is not defined or callable in Lua.[m
[31m-Similarly, the <code>_env</code> variable is not defined in Lua.[m
[31m-We use them here only for explanatory purposes.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.4 - <a name="2.4">Statements</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua supports an almost conventional set of statements,[m
[31m-similar to those in Pascal or C.[m
[31m-This set includes[m
[31m-assignments, control structures, function calls,[m
[31m-and variable declarations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.1 - <a name="2.4.1">Chunks</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-The unit of execution of Lua is called a <em>chunk</em>.[m
[31m-A chunk is simply a sequence of statements,[m
[31m-which are executed sequentially.[m
[31m-Each statement can be optionally followed by a semicolon:[m
[31m-[m
[31m-<pre>[m
[31m-	chunk ::= {stat [`<b>;</b>&acute;]}[m
[31m-</pre><p>[m
[31m-There are no empty statements and thus '<code>;;</code>' is not legal.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua handles a chunk as the body of an anonymous function [m
[31m-with a variable number of arguments[m
[31m-(see <a href="#2.5.9">&sect;2.5.9</a>).[m
[31m-As such, chunks can define local variables,[m
[31m-receive arguments, and return values.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A chunk can be stored in a file or in a string inside the host program.[m
[31m-To execute a chunk,[m
[31m-Lua first pre-compiles the chunk into instructions for a virtual machine,[m
[31m-and then it executes the compiled code[m
[31m-with an interpreter for the virtual machine.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Chunks can also be pre-compiled into binary form;[m
[31m-see program <code>luac</code> for details.[m
[31m-Programs in source and compiled forms are interchangeable;[m
[31m-Lua automatically detects the file type and acts accordingly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.2 - <a name="2.4.2">Blocks</a></h3><p>[m
[31m-A block is a list of statements;[m
[31m-syntactically, a block is the same as a chunk:[m
[31m-[m
[31m-<pre>[m
[31m-	block ::= chunk[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-A block can be explicitly delimited to produce a single statement:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>do</b> block <b>end</b>[m
[31m-</pre><p>[m
[31m-Explicit blocks are useful[m
[31m-to control the scope of variable declarations.[m
[31m-Explicit blocks are also sometimes used to[m
[31m-add a <b>return</b> or <b>break</b> statement in the middle[m
[31m-of another block (see <a href="#2.4.4">&sect;2.4.4</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.3 - <a name="2.4.3">Assignment</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-Lua allows multiple assignments.[m
[31m-Therefore, the syntax for assignment[m
[31m-defines a list of variables on the left side[m
[31m-and a list of expressions on the right side.[m
[31m-The elements in both lists are separated by commas:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= varlist `<b>=</b>&acute; explist[m
[31m-	varlist ::= var {`<b>,</b>&acute; var}[m
[31m-	explist ::= exp {`<b>,</b>&acute; exp}[m
[31m-</pre><p>[m
[31m-Expressions are discussed in <a href="#2.5">&sect;2.5</a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Before the assignment,[m
[31m-the list of values is <em>adjusted</em> to the length of[m
[31m-the list of variables.[m
[31m-If there are more values than needed,[m
[31m-the excess values are thrown away.[m
[31m-If there are fewer values than needed,[m
[31m-the list is extended with as many  <b>nil</b>'s as needed.[m
[31m-If the list of expressions ends with a function call,[m
[31m-then all values returned by that call enter the list of values,[m
[31m-before the adjustment[m
[31m-(except when the call is enclosed in parentheses; see <a href="#2.5">&sect;2.5</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The assignment statement first evaluates all its expressions[m
[31m-and only then are the assignments performed.[m
[31m-Thus the code[m
[31m-[m
[31m-<pre>[m
[31m-     i = 3[m
[31m-     i, a[i] = i+1, 20[m
[31m-</pre><p>[m
[31m-sets <code>a[3]</code> to 20, without affecting <code>a[4]</code>[m
[31m-because the <code>i</code> in <code>a[i]</code> is evaluated (to 3)[m
[31m-before it is assigned&nbsp;4.[m
[31m-Similarly, the line[m
[31m-[m
[31m-<pre>[m
[31m-     x, y = y, x[m
[31m-</pre><p>[m
[31m-exchanges the values of <code>x</code> and <code>y</code>,[m
[31m-and[m
[31m-[m
[31m-<pre>[m
[31m-     x, y, z = y, z, x[m
[31m-</pre><p>[m
[31m-cyclically permutes the values of <code>x</code>, <code>y</code>, and <code>z</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The meaning of assignments to global variables[m
[31m-and table fields can be changed via metatables.[m
[31m-An assignment to an indexed variable <code>t[i] = val</code> is equivalent to[m
[31m-<code>settable_event(t,i,val)</code>.[m
[31m-(See <a href="#2.8">&sect;2.8</a> for a complete description of the[m
[31m-<code>settable_event</code> function.[m
[31m-This function is not defined or callable in Lua.[m
[31m-We use it here only for explanatory purposes.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-An assignment to a global variable <code>x = val</code>[m
[31m-is equivalent to the assignment[m
[31m-<code>_env.x = val</code>,[m
[31m-which in turn is equivalent to[m
[31m-[m
[31m-<pre>[m
[31m-     settable_event(_env, "x", val)[m
[31m-</pre><p>[m
[31m-where <code>_env</code> is the environment of the running function.[m
[31m-(The <code>_env</code> variable is not defined in Lua.[m
[31m-We use it here only for explanatory purposes.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.4 - <a name="2.4.4">Control Structures</a></h3><p>[m
[31m-The control structures[m
[31m-<b>if</b>, <b>while</b>, and <b>repeat</b> have the usual meaning and[m
[31m-familiar syntax:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>while</b> exp <b>do</b> block <b>end</b>[m
[31m-	stat ::= <b>repeat</b> block <b>until</b> exp[m
[31m-	stat ::= <b>if</b> exp <b>then</b> block {<b>elseif</b> exp <b>then</b> block} [<b>else</b> block] <b>end</b>[m
[31m-</pre><p>[m
[31m-Lua also has a <b>for</b> statement, in two flavors (see <a href="#2.4.5">&sect;2.4.5</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The condition expression of a[m
[31m-control structure can return any value.[m
[31m-Both <b>false</b> and <b>nil</b> are considered false.[m
[31m-All values different from <b>nil</b> and <b>false</b> are considered true[m
[31m-(in particular, the number 0 and the empty string are also true).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In the <b>repeat</b>&ndash;<b>until</b> loop,[m
[31m-the inner block does not end at the <b>until</b> keyword,[m
[31m-but only after the condition.[m
[31m-So, the condition can refer to local variables[m
[31m-declared inside the loop block.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <b>return</b> statement is used to return values[m
[31m-from a function or a chunk (which is just a function).[m
[31m-[m
[31m-Functions and chunks can return more than one value,[m
[31m-and so the syntax for the <b>return</b> statement is[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>return</b> [explist][m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-The <b>break</b> statement is used to terminate the execution of a[m
[31m-<b>while</b>, <b>repeat</b>, or <b>for</b> loop,[m
[31m-skipping to the next statement after the loop:[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>break</b>[m
[31m-</pre><p>[m
[31m-A <b>break</b> ends the innermost enclosing loop.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <b>return</b> and <b>break</b>[m
[31m-statements can only be written as the <em>last</em> statement of a block.[m
[31m-If it is really necessary to <b>return</b> or <b>break</b> in the[m
[31m-middle of a block,[m
[31m-then an explicit inner block can be used,[m
[31m-as in the idioms[m
[31m-<code>do return end</code> and <code>do break end</code>,[m
[31m-because now <b>return</b> and <b>break</b> are the last statements in[m
[31m-their (inner) blocks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.5 - <a name="2.4.5">For Statement</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-The <b>for</b> statement has two forms:[m
[31m-one numeric and one generic.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The numeric <b>for</b> loop repeats a block of code while a[m
[31m-control variable runs through an arithmetic progression.[m
[31m-It has the following syntax:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>for</b> Name `<b>=</b>&acute; exp `<b>,</b>&acute; exp [`<b>,</b>&acute; exp] <b>do</b> block <b>end</b>[m
[31m-</pre><p>[m
[31m-The <em>block</em> is repeated for <em>name</em> starting at the value of[m
[31m-the first <em>exp</em>, until it passes the second <em>exp</em> by steps of the[m
[31m-third <em>exp</em>.[m
[31m-More precisely, a <b>for</b> statement like[m
[31m-[m
[31m-<pre>[m
[31m-     for v = <em>e1</em>, <em>e2</em>, <em>e3</em> do <em>block</em> end[m
[31m-</pre><p>[m
[31m-is equivalent to the code:[m
[31m-[m
[31m-<pre>[m
[31m-     do[m
[31m-       local <em>var</em>, <em>limit</em>, <em>step</em> = tonumber(<em>e1</em>), tonumber(<em>e2</em>), tonumber(<em>e3</em>)[m
[31m-       if not (<em>var</em> and <em>limit</em> and <em>step</em>) then error() end[m
[31m-       while (<em>step</em> &gt; 0 and <em>var</em> &lt;= <em>limit</em>) or (<em>step</em> &lt;= 0 and <em>var</em> &gt;= <em>limit</em>) do[m
[31m-         local v = <em>var</em>[m
[31m-         <em>block</em>[m
[31m-         <em>var</em> = <em>var</em> + <em>step</em>[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-Note the following:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-All three control expressions are evaluated only once,[m
[31m-before the loop starts.[m
[31m-They must all result in numbers.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-<code><em>var</em></code>, <code><em>limit</em></code>, and <code><em>step</em></code> are invisible variables.[m
[31m-The names shown here are for explanatory purposes only.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-If the third expression (the step) is absent,[m
[31m-then a step of&nbsp;1 is used.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-You can use <b>break</b> to exit a <b>for</b> loop.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-The loop variable <code>v</code> is local to the loop;[m
[31m-you cannot use its value after the <b>for</b> ends or is broken.[m
[31m-If you need this value,[m
[31m-assign it to another variable before breaking or exiting the loop.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-The generic <b>for</b> statement works over functions,[m
[31m-called <em>iterators</em>.[m
[31m-On each iteration, the iterator function is called to produce a new value,[m
[31m-stopping when this new value is <b>nil</b>.[m
[31m-The generic <b>for</b> loop has the following syntax:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>for</b> namelist <b>in</b> explist <b>do</b> block <b>end</b>[m
[31m-	namelist ::= Name {`<b>,</b>&acute; Name}[m
[31m-</pre><p>[m
[31m-A <b>for</b> statement like[m
[31m-[m
[31m-<pre>[m
[31m-     for <em>var_1</em>, &middot;&middot;&middot;, <em>var_n</em> in <em>explist</em> do <em>block</em> end[m
[31m-</pre><p>[m
[31m-is equivalent to the code:[m
[31m-[m
[31m-<pre>[m
[31m-     do[m
[31m-       local <em>f</em>, <em>s</em>, <em>var</em> = <em>explist</em>[m
[31m-       while true do[m
[31m-         local <em>var_1</em>, &middot;&middot;&middot;, <em>var_n</em> = <em>f</em>(<em>s</em>, <em>var</em>)[m
[31m-         <em>var</em> = <em>var_1</em>[m
[31m-         if <em>var</em> == nil then break end[m
[31m-         <em>block</em>[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-Note the following:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-<code><em>explist</em></code> is evaluated only once.[m
[31m-Its results are an <em>iterator</em> function,[m
[31m-a <em>state</em>,[m
[31m-and an initial value for the first <em>iterator variable</em>.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-<code><em>f</em></code>, <code><em>s</em></code>, and <code><em>var</em></code> are invisible variables.[m
[31m-The names are here for explanatory purposes only.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-You can use <b>break</b> to exit a <b>for</b> loop.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-The loop variables <code><em>var_i</em></code> are local to the loop;[m
[31m-you cannot use their values after the <b>for</b> ends.[m
[31m-If you need these values,[m
[31m-then assign them to other variables before breaking or exiting the loop.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.6 - <a name="2.4.6">Function Calls as Statements</a></h3><p>[m
[31m-To allow possible side-effects,[m
[31m-function calls can be executed as statements:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= functioncall[m
[31m-</pre><p>[m
[31m-In this case, all returned values are thrown away.[m
[31m-Function calls are explained in <a href="#2.5.8">&sect;2.5.8</a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.4.7 - <a name="2.4.7">Local Declarations</a></h3><p>[m
[31m-Local variables can be declared anywhere inside a block.[m
[31m-The declaration can include an initial assignment:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>local</b> namelist [`<b>=</b>&acute; explist][m
[31m-</pre><p>[m
[31m-If present, an initial assignment has the same semantics[m
[31m-of a multiple assignment (see <a href="#2.4.3">&sect;2.4.3</a>).[m
[31m-Otherwise, all variables are initialized with <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A chunk is also a block (see <a href="#2.4.1">&sect;2.4.1</a>),[m
[31m-and so local variables can be declared in a chunk outside any explicit block.[m
[31m-The scope of such local variables extends until the end of the chunk.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The visibility rules for local variables are explained in <a href="#2.6">&sect;2.6</a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.5 - <a name="2.5">Expressions</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The basic expressions in Lua are the following:[m
[31m-[m
[31m-<pre>[m
[31m-	exp ::= prefixexp[m
[31m-	exp ::= <b>nil</b> | <b>false</b> | <b>true</b>[m
[31m-	exp ::= Number[m
[31m-	exp ::= String[m
[31m-	exp ::= function[m
[31m-	exp ::= tableconstructor[m
[31m-	exp ::= `<b>...</b>&acute;[m
[31m-	exp ::= exp binop exp[m
[31m-	exp ::= unop exp[m
[31m-	prefixexp ::= var | functioncall | `<b>(</b>&acute; exp `<b>)</b>&acute;[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Numbers and literal strings are explained in <a href="#2.1">&sect;2.1</a>;[m
[31m-variables are explained in <a href="#2.3">&sect;2.3</a>;[m
[31m-function definitions are explained in <a href="#2.5.9">&sect;2.5.9</a>;[m
[31m-function calls are explained in <a href="#2.5.8">&sect;2.5.8</a>;[m
[31m-table constructors are explained in <a href="#2.5.7">&sect;2.5.7</a>.[m
[31m-Vararg expressions,[m
[31m-denoted by three dots ('<code>...</code>'), can only be used when[m
[31m-directly inside a vararg function;[m
[31m-they are explained in <a href="#2.5.9">&sect;2.5.9</a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Binary operators comprise arithmetic operators (see <a href="#2.5.1">&sect;2.5.1</a>),[m
[31m-relational operators (see <a href="#2.5.2">&sect;2.5.2</a>), logical operators (see <a href="#2.5.3">&sect;2.5.3</a>),[m
[31m-and the concatenation operator (see <a href="#2.5.4">&sect;2.5.4</a>).[m
[31m-Unary operators comprise the unary minus (see <a href="#2.5.1">&sect;2.5.1</a>),[m
[31m-the unary <b>not</b> (see <a href="#2.5.3">&sect;2.5.3</a>),[m
[31m-and the unary <em>length operator</em> (see <a href="#2.5.5">&sect;2.5.5</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Both function calls and vararg expressions can result in multiple values.[m
[31m-If an expression is used as a statement[m
[31m-(only possible for function calls (see <a href="#2.4.6">&sect;2.4.6</a>)),[m
[31m-then its return list is adjusted to zero elements,[m
[31m-thus discarding all returned values.[m
[31m-If an expression is used as the last (or the only) element[m
[31m-of a list of expressions,[m
[31m-then no adjustment is made[m
[31m-(unless the call is enclosed in parentheses).[m
[31m-In all other contexts,[m
[31m-Lua adjusts the result list to one element,[m
[31m-discarding all values except the first one.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Here are some examples:[m
[31m-[m
[31m-<pre>[m
[31m-     f()                -- adjusted to 0 results[m
[31m-     g(f(), x)          -- f() is adjusted to 1 result[m
[31m-     g(x, f())          -- g gets x plus all results from f()[m
[31m-     a,b,c = f(), x     -- f() is adjusted to 1 result (c gets nil)[m
[31m-     a,b = ...          -- a gets the first vararg parameter, b gets[m
[31m-                        -- the second (both a and b can get nil if there[m
[31m-                        -- is no corresponding vararg parameter)[m
[31m-     [m
[31m-     a,b,c = x, f()     -- f() is adjusted to 2 results[m
[31m-     a,b,c = f()        -- f() is adjusted to 3 results[m
[31m-     return f()         -- returns all results from f()[m
[31m-     return ...         -- returns all received vararg parameters[m
[31m-     return x,y,f()     -- returns x, y, and all results from f()[m
[31m-     {f()}              -- creates a list with all results from f()[m
[31m-     {...}              -- creates a list with all vararg parameters[m
[31m-     {f(), nil}         -- f() is adjusted to 1 result[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Any expression enclosed in parentheses always results in only one value.[m
[31m-Thus,[m
[31m-<code>(f(x,y,z))</code> is always a single value,[m
[31m-even if <code>f</code> returns several values.[m
[31m-(The value of <code>(f(x,y,z))</code> is the first value returned by <code>f</code>[m
[31m-or <b>nil</b> if <code>f</code> does not return any values.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.1 - <a name="2.5.1">Arithmetic Operators</a></h3><p>[m
[31m-Lua supports the usual arithmetic operators:[m
[31m-the binary <code>+</code> (addition),[m
[31m-<code>-</code> (subtraction), <code>*</code> (multiplication),[m
[31m-<code>/</code> (division), <code>%</code> (modulo), and <code>^</code> (exponentiation);[m
[31m-and unary <code>-</code> (negation).[m
[31m-If the operands are numbers, or strings that can be converted to[m
[31m-numbers (see <a href="#2.2.1">&sect;2.2.1</a>),[m
[31m-then all operations have the usual meaning.[m
[31m-Exponentiation works for any exponent.[m
[31m-For instance, <code>x^(-0.5)</code> computes the inverse of the square root of <code>x</code>.[m
[31m-Modulo is defined as[m
[31m-[m
[31m-<pre>[m
[31m-     a % b == a - math.floor(a/b)*b[m
[31m-</pre><p>[m
[31m-That is, it is the remainder of a division that rounds[m
[31m-the quotient towards minus infinity.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.2 - <a name="2.5.2">Relational Operators</a></h3><p>[m
[31m-The relational operators in Lua are[m
[31m-[m
[31m-<pre>[m
[31m-     ==    ~=    &lt;     &gt;     &lt;=    &gt;=[m
[31m-</pre><p>[m
[31m-These operators always result in <b>false</b> or <b>true</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equality (<code>==</code>) first compares the type of its operands.[m
[31m-If the types are different, then the result is <b>false</b>.[m
[31m-Otherwise, the values of the operands are compared.[m
[31m-Numbers and strings are compared in the usual way.[m
[31m-Objects (tables, userdata, threads, and functions)[m
[31m-are compared by <em>reference</em>:[m
[31m-two objects are considered equal only if they are the <em>same</em> object.[m
[31m-Every time you create a new object[m
[31m-(a table, userdata, thread, or function),[m
[31m-this new object is different from any previously existing object.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can change the way that Lua compares tables and userdata [m
[31m-by using the "eq" metamethod (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The conversion rules of <a href="#2.2.1">&sect;2.2.1</a>[m
[31m-<em>do not</em> apply to equality comparisons.[m
[31m-Thus, <code>"0"==0</code> evaluates to <b>false</b>,[m
[31m-and <code>t[0]</code> and <code>t["0"]</code> denote different[m
[31m-entries in a table.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The operator <code>~=</code> is exactly the negation of equality (<code>==</code>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The order operators work as follows.[m
[31m-If both arguments are numbers, then they are compared as such.[m
[31m-Otherwise, if both arguments are strings,[m
[31m-then their values are compared according to the current locale.[m
[31m-Otherwise, Lua tries to call the "lt" or the "le"[m
[31m-metamethod (see <a href="#2.8">&sect;2.8</a>).[m
[31m-A comparison <code>a &gt; b</code> is translated to <code>b &lt; a</code>[m
[31m-and <code>a &gt;= b</code> is translated to <code>b &lt;= a</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.3 - <a name="2.5.3">Logical Operators</a></h3><p>[m
[31m-The logical operators in Lua are[m
[31m-<b>and</b>, <b>or</b>, and <b>not</b>.[m
[31m-Like the control structures (see <a href="#2.4.4">&sect;2.4.4</a>),[m
[31m-all logical operators consider both <b>false</b> and <b>nil</b> as false[m
[31m-and anything else as true.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The negation operator <b>not</b> always returns <b>false</b> or <b>true</b>.[m
[31m-The conjunction operator <b>and</b> returns its first argument[m
[31m-if this value is <b>false</b> or <b>nil</b>;[m
[31m-otherwise, <b>and</b> returns its second argument.[m
[31m-The disjunction operator <b>or</b> returns its first argument[m
[31m-if this value is different from <b>nil</b> and <b>false</b>;[m
[31m-otherwise, <b>or</b> returns its second argument.[m
[31m-Both <b>and</b> and <b>or</b> use short-cut evaluation;[m
[31m-that is,[m
[31m-the second operand is evaluated only if necessary.[m
[31m-Here are some examples:[m
[31m-[m
[31m-<pre>[m
[31m-     10 or 20            --&gt; 10[m
[31m-     10 or error()       --&gt; 10[m
[31m-     nil or "a"          --&gt; "a"[m
[31m-     nil and 10          --&gt; nil[m
[31m-     false and error()   --&gt; false[m
[31m-     false and nil       --&gt; false[m
[31m-     false or nil        --&gt; nil[m
[31m-     10 and 20           --&gt; 20[m
[31m-</pre><p>[m
[31m-(In this manual,[m
[31m-<code>--&gt;</code> indicates the result of the preceding expression.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.4 - <a name="2.5.4">Concatenation</a></h3><p>[m
[31m-The string concatenation operator in Lua is[m
[31m-denoted by two dots ('<code>..</code>').[m
[31m-If both operands are strings or numbers, then they are converted to[m
[31m-strings according to the rules mentioned in <a href="#2.2.1">&sect;2.2.1</a>.[m
[31m-Otherwise, the "concat" metamethod is called (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.5 - <a name="2.5.5">The Length Operator</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-The length operator is denoted by the unary operator <code>#</code>.[m
[31m-The length of a string is its number of bytes[m
[31m-(that is, the usual meaning of string length when each[m
[31m-character is one byte).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The length of a table <code>t</code> is defined to be any[m
[31m-integer index <code>n</code>[m
[31m-such that <code>t[n]</code> is not <b>nil</b> and <code>t[n+1]</code> is <b>nil</b>;[m
[31m-moreover, if <code>t[1]</code> is <b>nil</b>, <code>n</code> can be zero.[m
[31m-For a regular array, with non-nil values from 1 to a given <code>n</code>,[m
[31m-its length is exactly that <code>n</code>,[m
[31m-the index of its last value.[m
[31m-If the array has "holes"[m
[31m-(that is, <b>nil</b> values between other non-nil values),[m
[31m-then <code>#t</code> can be any of the indices that[m
[31m-directly precedes a <b>nil</b> value[m
[31m-(that is, it may consider any such <b>nil</b> value as the end of[m
[31m-the array). [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.6 - <a name="2.5.6">Precedence</a></h3><p>[m
[31m-Operator precedence in Lua follows the table below,[m
[31m-from lower to higher priority:[m
[31m-[m
[31m-<pre>[m
[31m-     or[m
[31m-     and[m
[31m-     &lt;     &gt;     &lt;=    &gt;=    ~=    ==[m
[31m-     ..[m
[31m-     +     -[m
[31m-     *     /     %[m
[31m-     not   #     - (unary)[m
[31m-     ^[m
[31m-</pre><p>[m
[31m-As usual,[m
[31m-you can use parentheses to change the precedences of an expression.[m
[31m-The concatenation ('<code>..</code>') and exponentiation ('<code>^</code>')[m
[31m-operators are right associative.[m
[31m-All other binary operators are left associative.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.7 - <a name="2.5.7">Table Constructors</a></h3><p>[m
[31m-Table constructors are expressions that create tables.[m
[31m-Every time a constructor is evaluated, a new table is created.[m
[31m-A constructor can be used to create an empty table[m
[31m-or to create a table and initialize some of its fields.[m
[31m-The general syntax for constructors is[m
[31m-[m
[31m-<pre>[m
[31m-	tableconstructor ::= `<b>{</b>&acute; [fieldlist] `<b>}</b>&acute;[m
[31m-	fieldlist ::= field {fieldsep field} [fieldsep][m
[31m-	field ::= `<b>[</b>&acute; exp `<b>]</b>&acute; `<b>=</b>&acute; exp | Name `<b>=</b>&acute; exp | exp[m
[31m-	fieldsep ::= `<b>,</b>&acute; | `<b>;</b>&acute;[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Each field of the form <code>[exp1] = exp2</code> adds to the new table an entry[m
[31m-with key <code>exp1</code> and value <code>exp2</code>.[m
[31m-A field of the form <code>name = exp</code> is equivalent to[m
[31m-<code>["name"] = exp</code>.[m
[31m-Finally, fields of the form <code>exp</code> are equivalent to[m
[31m-<code>[i] = exp</code>, where <code>i</code> are consecutive numerical integers,[m
[31m-starting with 1.[m
[31m-Fields in the other formats do not affect this counting.[m
[31m-For example,[m
[31m-[m
[31m-<pre>[m
[31m-     a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }[m
[31m-</pre><p>[m
[31m-is equivalent to[m
[31m-[m
[31m-<pre>[m
[31m-     do[m
[31m-       local t = {}[m
[31m-       t[f(1)] = g[m
[31m-       t[1] = "x"         -- 1st exp[m
[31m-       t[2] = "y"         -- 2nd exp[m
[31m-       t.x = 1            -- t["x"] = 1[m
[31m-       t[3] = f(x)        -- 3rd exp[m
[31m-       t[30] = 23[m
[31m-       t[4] = 45          -- 4th exp[m
[31m-       a = t[m
[31m-     end[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the last field in the list has the form <code>exp</code>[m
[31m-and the expression is a function call or a vararg expression,[m
[31m-then all values returned by this expression enter the list consecutively[m
[31m-(see <a href="#2.5.8">&sect;2.5.8</a>).[m
[31m-To avoid this,[m
[31m-enclose the function call or the vararg expression[m
[31m-in parentheses (see <a href="#2.5">&sect;2.5</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The field list can have an optional trailing separator,[m
[31m-as a convenience for machine-generated code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.8 - <a name="2.5.8">Function Calls</a></h3><p>[m
[31m-A function call in Lua has the following syntax:[m
[31m-[m
[31m-<pre>[m
[31m-	functioncall ::= prefixexp args[m
[31m-</pre><p>[m
[31m-In a function call,[m
[31m-first prefixexp and args are evaluated.[m
[31m-If the value of prefixexp has type <em>function</em>,[m
[31m-then this function is called[m
[31m-with the given arguments.[m
[31m-Otherwise, the prefixexp "call" metamethod is called,[m
[31m-having as first parameter the value of prefixexp,[m
[31m-followed by the original call arguments[m
[31m-(see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The form[m
[31m-[m
[31m-<pre>[m
[31m-	functioncall ::= prefixexp `<b>:</b>&acute; Name args[m
[31m-</pre><p>[m
[31m-can be used to call "methods".[m
[31m-A call <code>v:name(<em>args</em>)</code>[m
[31m-is syntactic sugar for <code>v.name(v,<em>args</em>)</code>,[m
[31m-except that <code>v</code> is evaluated only once.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Arguments have the following syntax:[m
[31m-[m
[31m-<pre>[m
[31m-	args ::= `<b>(</b>&acute; [explist] `<b>)</b>&acute;[m
[31m-	args ::= tableconstructor[m
[31m-	args ::= String[m
[31m-</pre><p>[m
[31m-All argument expressions are evaluated before the call.[m
[31m-A call of the form <code>f{<em>fields</em>}</code> is[m
[31m-syntactic sugar for <code>f({<em>fields</em>})</code>;[m
[31m-that is, the argument list is a single new table.[m
[31m-A call of the form <code>f'<em>string</em>'</code>[m
[31m-(or <code>f"<em>string</em>"</code> or <code>f[[<em>string</em>]]</code>)[m
[31m-is syntactic sugar for <code>f('<em>string</em>')</code>;[m
[31m-that is, the argument list is a single literal string.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an exception to the free-format syntax of Lua,[m
[31m-you cannot put a line break before the '<code>(</code>' in a function call.[m
[31m-This restriction avoids some ambiguities in the language.[m
[31m-If you write[m
[31m-[m
[31m-<pre>[m
[31m-     a = f[m
[31m-     (g).x(a)[m
[31m-</pre><p>[m
[31m-Lua would see that as a single statement, <code>a = f(g).x(a)</code>.[m
[31m-So, if you want two statements, you must add a semi-colon between them.[m
[31m-If you actually want to call <code>f</code>,[m
[31m-you must remove the line break before <code>(g)</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A call of the form <code>return</code> <em>functioncall</em> is called[m
[31m-a <em>tail call</em>.[m
[31m-Lua implements <em>proper tail calls</em>[m
[31m-(or <em>proper tail recursion</em>):[m
[31m-in a tail call,[m
[31m-the called function reuses the stack entry of the calling function.[m
[31m-Therefore, there is no limit on the number of nested tail calls that[m
[31m-a program can execute.[m
[31m-However, a tail call erases any debug information about the[m
[31m-calling function.[m
[31m-Note that a tail call only happens with a particular syntax,[m
[31m-where the <b>return</b> has one single function call as argument;[m
[31m-this syntax makes the calling function return exactly[m
[31m-the returns of the called function.[m
[31m-So, none of the following examples are tail calls:[m
[31m-[m
[31m-<pre>[m
[31m-     return (f(x))        -- results adjusted to 1[m
[31m-     return 2 * f(x)[m
[31m-     return x, f(x)       -- additional results[m
[31m-     f(x); return         -- results discarded[m
[31m-     return x or f(x)     -- results adjusted to 1[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.5.9 - <a name="2.5.9">Function Definitions</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-The syntax for function definition is[m
[31m-[m
[31m-<pre>[m
[31m-	function ::= <b>function</b> funcbody[m
[31m-	funcbody ::= `<b>(</b>&acute; [parlist] `<b>)</b>&acute; block <b>end</b>[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-The following syntactic sugar simplifies function definitions:[m
[31m-[m
[31m-<pre>[m
[31m-	stat ::= <b>function</b> funcname funcbody[m
[31m-	stat ::= <b>local</b> <b>function</b> Name funcbody[m
[31m-	funcname ::= Name {`<b>.</b>&acute; Name} [`<b>:</b>&acute; Name][m
[31m-</pre><p>[m
[31m-The statement[m
[31m-[m
[31m-<pre>[m
[31m-     function f () <em>body</em> end[m
[31m-</pre><p>[m
[31m-translates to[m
[31m-[m
[31m-<pre>[m
[31m-     f = function () <em>body</em> end[m
[31m-</pre><p>[m
[31m-The statement[m
[31m-[m
[31m-<pre>[m
[31m-     function t.a.b.c.f () <em>body</em> end[m
[31m-</pre><p>[m
[31m-translates to[m
[31m-[m
[31m-<pre>[m
[31m-     t.a.b.c.f = function () <em>body</em> end[m
[31m-</pre><p>[m
[31m-The statement[m
[31m-[m
[31m-<pre>[m
[31m-     local function f () <em>body</em> end[m
[31m-</pre><p>[m
[31m-translates to[m
[31m-[m
[31m-<pre>[m
[31m-     local f; f = function () <em>body</em> end[m
[31m-</pre><p>[m
[31m-<em>not</em> to[m
[31m-[m
[31m-<pre>[m
[31m-     local f = function () <em>body</em> end[m
[31m-</pre><p>[m
[31m-(This only makes a difference when the body of the function[m
[31m-contains references to <code>f</code>.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A function definition is an executable expression,[m
[31m-whose value has type <em>function</em>.[m
[31m-When Lua pre-compiles a chunk,[m
[31m-all its function bodies are pre-compiled too.[m
[31m-Then, whenever Lua executes the function definition,[m
[31m-the function is <em>instantiated</em> (or <em>closed</em>).[m
[31m-This function instance (or <em>closure</em>)[m
[31m-is the final value of the expression.[m
[31m-Different instances of the same function[m
[31m-can refer to different  external local variables[m
[31m-and can have different environment tables.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Parameters act as local variables that are[m
[31m-initialized with the argument values:[m
[31m-[m
[31m-<pre>[m
[31m-	parlist ::= namelist [`<b>,</b>&acute; `<b>...</b>&acute;] | `<b>...</b>&acute;[m
[31m-</pre><p>[m
[31m-When a function is called,[m
[31m-the list of arguments is adjusted to[m
[31m-the length of the list of parameters,[m
[31m-unless the function is a variadic or <em>vararg function</em>,[m
[31m-which is[m
[31m-indicated by three dots ('<code>...</code>') at the end of its parameter list.[m
[31m-A vararg function does not adjust its argument list;[m
[31m-instead, it collects all extra arguments and supplies them[m
[31m-to the function through a <em>vararg expression</em>,[m
[31m-which is also written as three dots.[m
[31m-The value of this expression is a list of all actual extra arguments,[m
[31m-similar to a function with multiple results.[m
[31m-If a vararg expression is used inside another expression[m
[31m-or in the middle of a list of expressions,[m
[31m-then its return list is adjusted to one element.[m
[31m-If the expression is used as the last element of a list of expressions,[m
[31m-then no adjustment is made[m
[31m-(unless that last expression is enclosed in parentheses).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an example, consider the following definitions:[m
[31m-[m
[31m-<pre>[m
[31m-     function f(a, b) end[m
[31m-     function g(a, b, ...) end[m
[31m-     function r() return 1,2,3 end[m
[31m-</pre><p>[m
[31m-Then, we have the following mapping from arguments to parameters and[m
[31m-to the vararg expression:[m
[31m-[m
[31m-<pre>[m
[31m-     CALL            PARAMETERS[m
[31m-     [m
[31m-     f(3)             a=3, b=nil[m
[31m-     f(3, 4)          a=3, b=4[m
[31m-     f(3, 4, 5)       a=3, b=4[m
[31m-     f(r(), 10)       a=1, b=10[m
[31m-     f(r())           a=1, b=2[m
[31m-     [m
[31m-     g(3)             a=3, b=nil, ... --&gt;  (nothing)[m
[31m-     g(3, 4)          a=3, b=4,   ... --&gt;  (nothing)[m
[31m-     g(3, 4, 5, 8)    a=3, b=4,   ... --&gt;  5  8[m
[31m-     g(5, r())        a=5, b=1,   ... --&gt;  2  3[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Results are returned using the <b>return</b> statement (see <a href="#2.4.4">&sect;2.4.4</a>).[m
[31m-If control reaches the end of a function[m
[31m-without encountering a <b>return</b> statement,[m
[31m-then the function returns with no results.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <em>colon</em> syntax[m
[31m-is used for defining <em>methods</em>,[m
[31m-that is, functions that have an implicit extra parameter <code>self</code>.[m
[31m-Thus, the statement[m
[31m-[m
[31m-<pre>[m
[31m-     function t.a.b.c:f (<em>params</em>) <em>body</em> end[m
[31m-</pre><p>[m
[31m-is syntactic sugar for[m
[31m-[m
[31m-<pre>[m
[31m-     t.a.b.c.f = function (self, <em>params</em>) <em>body</em> end[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.6 - <a name="2.6">Visibility Rules</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-Lua is a lexically scoped language.[m
[31m-The scope of variables begins at the first statement <em>after</em>[m
[31m-their declaration and lasts until the end of the innermost block that[m
[31m-includes the declaration.[m
[31m-Consider the following example:[m
[31m-[m
[31m-<pre>[m
[31m-     x = 10                -- global variable[m
[31m-     do                    -- new block[m
[31m-       local x = x         -- new 'x', with value 10[m
[31m-       print(x)            --&gt; 10[m
[31m-       x = x+1[m
[31m-       do                  -- another block[m
[31m-         local x = x+1     -- another 'x'[m
[31m-         print(x)          --&gt; 12[m
[31m-       end[m
[31m-       print(x)            --&gt; 11[m
[31m-     end[m
[31m-     print(x)              --&gt; 10  (the global one)[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Notice that, in a declaration like <code>local x = x</code>,[m
[31m-the new <code>x</code> being declared is not in scope yet,[m
[31m-and so the second <code>x</code> refers to the outside variable.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Because of the lexical scoping rules,[m
[31m-local variables can be freely accessed by functions[m
[31m-defined inside their scope.[m
[31m-A local variable used by an inner function is called[m
[31m-an <em>upvalue</em>, or <em>external local variable</em>,[m
[31m-inside the inner function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Notice that each execution of a <b>local</b> statement[m
[31m-defines new local variables.[m
[31m-Consider the following example:[m
[31m-[m
[31m-<pre>[m
[31m-     a = {}[m
[31m-     local x = 20[m
[31m-     for i=1,10 do[m
[31m-       local y = 0[m
[31m-       a[i] = function () y=y+1; return x+y end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-The loop creates ten closures[m
[31m-(that is, ten instances of the anonymous function).[m
[31m-Each of these closures uses a different <code>y</code> variable,[m
[31m-while all of them share the same <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.7 - <a name="2.7">Error Handling</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Because Lua is an embedded extension language,[m
[31m-all Lua actions start from C&nbsp;code in the host program[m
[31m-calling a function from the Lua library (see <a href="#lua_pcall"><code>lua_pcall</code></a>).[m
[31m-Whenever an error occurs during Lua compilation or execution,[m
[31m-control returns to C,[m
[31m-which can take appropriate measures[m
[31m-(such as printing an error message).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua code can explicitly generate an error by calling the[m
[31m-<a href="#pdf-error"><code>error</code></a> function.[m
[31m-If you need to catch errors in Lua,[m
[31m-you can use the <a href="#pdf-pcall"><code>pcall</code></a> function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.8 - <a name="2.8">Metatables</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Every value in Lua can have a <em>metatable</em>.[m
[31m-This <em>metatable</em> is an ordinary Lua table[m
[31m-that defines the behavior of the original value[m
[31m-under certain special operations.[m
[31m-You can change several aspects of the behavior[m
[31m-of operations over a value by setting specific fields in its metatable.[m
[31m-For instance, when a non-numeric value is the operand of an addition,[m
[31m-Lua checks for a function in the field <code>"__add"</code> in its metatable.[m
[31m-If it finds one,[m
[31m-Lua calls this function to perform the addition.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-We call the keys in a metatable <em>events</em>[m
[31m-and the values <em>metamethods</em>.[m
[31m-In the previous example, the event is <code>"add"</code> [m
[31m-and the metamethod is the function that performs the addition.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can query the metatable of any value[m
[31m-through the <a href="#pdf-getmetatable"><code>getmetatable</code></a> function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can replace the metatable of tables[m
[31m-through the <a href="#pdf-setmetatable"><code>setmetatable</code></a>[m
[31m-function.[m
[31m-You cannot change the metatable of other types from Lua[m
[31m-(except by using the debug library);[m
[31m-you must use the C&nbsp;API for that.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Tables and full userdata have individual metatables[m
[31m-(although multiple tables and userdata can share their metatables).[m
[31m-Values of all other types share one single metatable per type;[m
[31m-that is, there is one single metatable for all numbers,[m
[31m-one for all strings, etc.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A metatable controls how an object behaves in arithmetic operations,[m
[31m-order comparisons, concatenation, length operation, and indexing.[m
[31m-A metatable also can define a function to be called when a userdata[m
[31m-is garbage collected.[m
[31m-For each of these operations Lua associates a specific key[m
[31m-called an <em>event</em>.[m
[31m-When Lua performs one of these operations over a value,[m
[31m-it checks whether this value has a metatable with the corresponding event.[m
[31m-If so, the value associated with that key (the metamethod)[m
[31m-controls how Lua will perform the operation.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Metatables control the operations listed next.[m
[31m-Each operation is identified by its corresponding name.[m
[31m-The key for each operation is a string with its name prefixed by[m
[31m-two underscores, '<code>__</code>';[m
[31m-for instance, the key for operation "add" is the[m
[31m-string <code>"__add"</code>.[m
[31m-The semantics of these operations is better explained by a Lua function[m
[31m-describing how the interpreter executes the operation.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The code shown here in Lua is only illustrative;[m
[31m-the real behavior is hard coded in the interpreter[m
[31m-and it is much more efficient than this simulation.[m
[31m-All functions used in these descriptions[m
[31m-(<a href="#pdf-rawget"><code>rawget</code></a>, <a href="#pdf-tonumber"><code>tonumber</code></a>, etc.)[m
[31m-are described in <a href="#5.1">&sect;5.1</a>.[m
[31m-In particular, to retrieve the metamethod of a given object,[m
[31m-we use the expression[m
[31m-[m
[31m-<pre>[m
[31m-     metatable(obj)[event][m
[31m-</pre><p>[m
[31m-This should be read as[m
[31m-[m
[31m-<pre>[m
[31m-     rawget(getmetatable(obj) or {}, event)[m
[31m-</pre><p>[m
[31m-[m
[31m-That is, the access to a metamethod does not invoke other metamethods,[m
[31m-and the access to objects with no metatables does not fail[m
[31m-(it simply results in <b>nil</b>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>"add":</b>[m
[31m-the <code>+</code> operation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The function <code>getbinhandler</code> below defines how Lua chooses a handler[m
[31m-for a binary operation.[m
[31m-First, Lua tries the first operand.[m
[31m-If its type does not define a handler for the operation,[m
[31m-then Lua tries the second operand.[m
[31m-[m
[31m-<pre>[m
[31m-     function getbinhandler (op1, op2, event)[m
[31m-       return metatable(op1)[event] or metatable(op2)[event][m
[31m-     end[m
[31m-</pre><p>[m
[31m-By using this function,[m
[31m-the behavior of the <code>op1 + op2</code> is[m
[31m-[m
[31m-<pre>[m
[31m-     function add_event (op1, op2)[m
[31m-       local o1, o2 = tonumber(op1), tonumber(op2)[m
[31m-       if o1 and o2 then  -- both operands are numeric?[m
[31m-         return o1 + o2   -- '+' here is the primitive 'add'[m
[31m-       else  -- at least one of the operands is not numeric[m
[31m-         local h = getbinhandler(op1, op2, "__add")[m
[31m-         if h then[m
[31m-           -- call the handler with both operands[m
[31m-           return (h(op1, op2))[m
[31m-         else  -- no handler available: default behavior[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"sub":</b>[m
[31m-the <code>-</code> operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"mul":</b>[m
[31m-the <code>*</code> operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"div":</b>[m
[31m-the <code>/</code> operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"mod":</b>[m
[31m-the <code>%</code> operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation,[m
[31m-with the operation[m
[31m-<code>o1 - floor(o1/o2)*o2</code> as the primitive operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"pow":</b>[m
[31m-the <code>^</code> (exponentiation) operation.[m
[31m-[m
[31m-Behavior similar to the "add" operation,[m
[31m-with the function <code>pow</code> (from the C&nbsp;math library)[m
[31m-as the primitive operation.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"unm":</b>[m
[31m-the unary <code>-</code> operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function unm_event (op)[m
[31m-       local o = tonumber(op)[m
[31m-       if o then  -- operand is numeric?[m
[31m-         return -o  -- '-' here is the primitive 'unm'[m
[31m-       else  -- the operand is not numeric.[m
[31m-         -- Try to get a handler from the operand[m
[31m-         local h = metatable(op).__unm[m
[31m-         if h then[m
[31m-           -- call the handler with the operand[m
[31m-           return (h(op))[m
[31m-         else  -- no handler available: default behavior[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"concat":</b>[m
[31m-the <code>..</code> (concatenation) operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function concat_event (op1, op2)[m
[31m-       if (type(op1) == "string" or type(op1) == "number") and[m
[31m-          (type(op2) == "string" or type(op2) == "number") then[m
[31m-         return op1 .. op2  -- primitive string concatenation[m
[31m-       else[m
[31m-         local h = getbinhandler(op1, op2, "__concat")[m
[31m-         if h then[m
[31m-           return (h(op1, op2))[m
[31m-         else[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"len":</b>[m
[31m-the <code>#</code> operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function len_event (op)[m
[31m-       if type(op) == "string" then[m
[31m-         return strlen(op)         -- primitive string length[m
[31m-       elseif type(op) == "table" then[m
[31m-         return #op                -- primitive table length[m
[31m-       else[m
[31m-         local h = metatable(op).__len[m
[31m-         if h then[m
[31m-           -- call the handler with the operand[m
[31m-           return (h(op))[m
[31m-         else  -- no handler available: default behavior[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-See <a href="#2.5.5">&sect;2.5.5</a> for a description of the length of a table.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"eq":</b>[m
[31m-the <code>==</code> operation.[m
[31m-[m
[31m-The function <code>getcomphandler</code> defines how Lua chooses a metamethod[m
[31m-for comparison operators.[m
[31m-A metamethod only is selected when both objects[m
[31m-being compared have the same type[m
[31m-and the same metamethod for the selected operation.[m
[31m-[m
[31m-<pre>[m
[31m-     function getcomphandler (op1, op2, event)[m
[31m-       if type(op1) ~= type(op2) then return nil end[m
[31m-       local mm1 = metatable(op1)[event][m
[31m-       local mm2 = metatable(op2)[event][m
[31m-       if mm1 == mm2 then return mm1 else return nil end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-The "eq" event is defined as follows:[m
[31m-[m
[31m-<pre>[m
[31m-     function eq_event (op1, op2)[m
[31m-       if type(op1) ~= type(op2) then  -- different types?[m
[31m-         return false   -- different objects[m
[31m-       end[m
[31m-       if op1 == op2 then   -- primitive equal?[m
[31m-         return true   -- objects are equal[m
[31m-       end[m
[31m-       -- try metamethod[m
[31m-       local h = getcomphandler(op1, op2, "__eq")[m
[31m-       if h then[m
[31m-         return (h(op1, op2))[m
[31m-       else[m
[31m-         return false[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-<code>a ~= b</code> is equivalent to <code>not (a == b)</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"lt":</b>[m
[31m-the <code>&lt;</code> operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function lt_event (op1, op2)[m
[31m-       if type(op1) == "number" and type(op2) == "number" then[m
[31m-         return op1 &lt; op2   -- numeric comparison[m
[31m-       elseif type(op1) == "string" and type(op2) == "string" then[m
[31m-         return op1 &lt; op2   -- lexicographic comparison[m
[31m-       else[m
[31m-         local h = getcomphandler(op1, op2, "__lt")[m
[31m-         if h then[m
[31m-           return (h(op1, op2))[m
[31m-         else[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-<code>a &gt; b</code> is equivalent to <code>b &lt; a</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"le":</b>[m
[31m-the <code>&lt;=</code> operation.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function le_event (op1, op2)[m
[31m-       if type(op1) == "number" and type(op2) == "number" then[m
[31m-         return op1 &lt;= op2   -- numeric comparison[m
[31m-       elseif type(op1) == "string" and type(op2) == "string" then[m
[31m-         return op1 &lt;= op2   -- lexicographic comparison[m
[31m-       else[m
[31m-         local h = getcomphandler(op1, op2, "__le")[m
[31m-         if h then[m
[31m-           return (h(op1, op2))[m
[31m-         else[m
[31m-           h = getcomphandler(op1, op2, "__lt")[m
[31m-           if h then[m
[31m-             return not h(op2, op1)[m
[31m-           else[m
[31m-             error(&middot;&middot;&middot;)[m
[31m-           end[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-<code>a &gt;= b</code> is equivalent to <code>b &lt;= a</code>.[m
[31m-Note that, in the absence of a "le" metamethod,[m
[31m-Lua tries the "lt", assuming that <code>a &lt;= b</code> is[m
[31m-equivalent to <code>not (b &lt; a)</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"index":</b>[m
[31m-The indexing access <code>table[key]</code>.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function gettable_event (table, key)[m
[31m-       local h[m
[31m-       if type(table) == "table" then[m
[31m-         local v = rawget(table, key)[m
[31m-         if v ~= nil then return v end[m
[31m-         h = metatable(table).__index[m
[31m-         if h == nil then return nil end[m
[31m-       else[m
[31m-         h = metatable(table).__index[m
[31m-         if h == nil then[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-       if type(h) == "function" then[m
[31m-         return (h(table, key))     -- call the handler[m
[31m-       else return h[key]           -- or repeat operation on it[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"newindex":</b>[m
[31m-The indexing assignment <code>table[key] = value</code>.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function settable_event (table, key, value)[m
[31m-       local h[m
[31m-       if type(table) == "table" then[m
[31m-         local v = rawget(table, key)[m
[31m-         if v ~= nil then rawset(table, key, value); return end[m
[31m-         h = metatable(table).__newindex[m
[31m-         if h == nil then rawset(table, key, value); return end[m
[31m-       else[m
[31m-         h = metatable(table).__newindex[m
[31m-         if h == nil then[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-       if type(h) == "function" then[m
[31m-         h(table, key,value)           -- call the handler[m
[31m-       else h[key] = value             -- or repeat operation on it[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"call":</b>[m
[31m-called when Lua calls a value.[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-     function function_event (func, ...)[m
[31m-       if type(func) == "function" then[m
[31m-         return func(...)   -- primitive call[m
[31m-       else[m
[31m-         local h = metatable(func).__call[m
[31m-         if h then[m
[31m-           return h(func, ...)[m
[31m-         else[m
[31m-           error(&middot;&middot;&middot;)[m
[31m-         end[m
[31m-       end[m
[31m-     end[m
[31m-</pre><p>[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.9 - <a name="2.9">Environments</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Besides metatables,[m
[31m-objects of types thread, function, and userdata[m
[31m-have another table associated with them,[m
[31m-called their <em>environment</em>.[m
[31m-Like metatables, environments are regular tables and[m
[31m-multiple objects can share the same environment.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Threads are created sharing the environment of the creating thread.[m
[31m-Userdata and C&nbsp;functions are created sharing the environment[m
[31m-of the creating C&nbsp;function.[m
[31m-Non-nested Lua functions[m
[31m-(created by <a href="#pdf-loadfile"><code>loadfile</code></a>, <a href="#pdf-loadstring"><code>loadstring</code></a> or <a href="#pdf-load"><code>load</code></a>)[m
[31m-are created sharing the environment of the creating thread.[m
[31m-Nested Lua functions are created sharing the environment of[m
[31m-the creating Lua function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Environments associated with userdata have no meaning for Lua.[m
[31m-It is only a convenience feature for programmers to associate a table to[m
[31m-a userdata.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Environments associated with threads are called[m
[31m-<em>global environments</em>.[m
[31m-They are used as the default environment for threads and[m
[31m-non-nested Lua functions created by the thread[m
[31m-and can be directly accessed by C&nbsp;code (see <a href="#3.3">&sect;3.3</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The environment associated with a C&nbsp;function can be directly[m
[31m-accessed by C&nbsp;code (see <a href="#3.3">&sect;3.3</a>).[m
[31m-It is used as the default environment for other C&nbsp;functions[m
[31m-and userdata created by the function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Environments associated with Lua functions are used to resolve[m
[31m-all accesses to global variables within the function (see <a href="#2.3">&sect;2.3</a>).[m
[31m-They are used as the default environment for nested Lua functions[m
[31m-created by the function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can change the environment of a Lua function or the[m
[31m-running thread by calling <a href="#pdf-setfenv"><code>setfenv</code></a>.[m
[31m-You can get the environment of a Lua function or the running thread[m
[31m-by calling <a href="#pdf-getfenv"><code>getfenv</code></a>.[m
[31m-To manipulate the environment of other objects[m
[31m-(userdata, C&nbsp;functions, other threads) you must[m
[31m-use the C&nbsp;API.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.10 - <a name="2.10">Garbage Collection</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua performs automatic memory management.[m
[31m-This means that[m
[31m-you have to worry neither about allocating memory for new objects[m
[31m-nor about freeing it when the objects are no longer needed.[m
[31m-Lua manages memory automatically by running[m
[31m-a <em>garbage collector</em> from time to time[m
[31m-to collect all <em>dead objects</em>[m
[31m-(that is, objects that are no longer accessible from Lua).[m
[31m-All memory used by Lua is subject to automatic management:[m
[31m-tables, userdata, functions, threads, strings, etc.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua implements an incremental mark-and-sweep collector.[m
[31m-It uses two numbers to control its garbage-collection cycles:[m
[31m-the <em>garbage-collector pause</em> and[m
[31m-the <em>garbage-collector step multiplier</em>.[m
[31m-Both use percentage points as units[m
[31m-(so that a value of 100 means an internal value of 1).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The garbage-collector pause[m
[31m-controls how long the collector waits before starting a new cycle.[m
[31m-Larger values make the collector less aggressive.[m
[31m-Values smaller than 100 mean the collector will not wait to[m
[31m-start a new cycle.[m
[31m-A value of 200 means that the collector waits for the total memory in use[m
[31m-to double before starting a new cycle.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The step multiplier[m
[31m-controls the relative speed of the collector relative to[m
[31m-memory allocation.[m
[31m-Larger values make the collector more aggressive but also increase[m
[31m-the size of each incremental step.[m
[31m-Values smaller than 100 make the collector too slow and[m
[31m-can result in the collector never finishing a cycle.[m
[31m-The default, 200, means that the collector runs at "twice"[m
[31m-the speed of memory allocation.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You can change these numbers by calling <a href="#lua_gc"><code>lua_gc</code></a> in C[m
[31m-or <a href="#pdf-collectgarbage"><code>collectgarbage</code></a> in Lua.[m
[31m-With these functions you can also control [m
[31m-the collector directly (e.g., stop and restart it).[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.10.1 - <a name="2.10.1">Garbage-Collection Metamethods</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-Using the C&nbsp;API,[m
[31m-you can set garbage-collector metamethods for userdata (see <a href="#2.8">&sect;2.8</a>).[m
[31m-These metamethods are also called <em>finalizers</em>.[m
[31m-Finalizers allow you to coordinate Lua's garbage collection[m
[31m-with external resource management[m
[31m-(such as closing files, network or database connections,[m
[31m-or freeing your own memory).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Garbage userdata with a field <code>__gc</code> in their metatables are not[m
[31m-collected immediately by the garbage collector.[m
[31m-Instead, Lua puts them in a list.[m
[31m-After the collection,[m
[31m-Lua does the equivalent of the following function[m
[31m-for each userdata in that list:[m
[31m-[m
[31m-<pre>[m
[31m-     function gc_event (udata)[m
[31m-       local h = metatable(udata).__gc[m
[31m-       if h then[m
[31m-         h(udata)[m
[31m-       end[m
[31m-     end[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-At the end of each garbage-collection cycle,[m
[31m-the finalizers for userdata are called in <em>reverse</em>[m
[31m-order of their creation,[m
[31m-among those collected in that cycle.[m
[31m-That is, the first finalizer to be called is the one associated[m
[31m-with the userdata created last in the program.[m
[31m-The userdata itself is freed only in the next garbage-collection cycle.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>2.10.2 - <a name="2.10.2">Weak Tables</a></h3>[m
[31m-[m
[31m-<p>[m
[31m-A <em>weak table</em> is a table whose elements are[m
[31m-<em>weak references</em>.[m
[31m-A weak reference is ignored by the garbage collector.[m
[31m-In other words,[m
[31m-if the only references to an object are weak references,[m
[31m-then the garbage collector will collect this object.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A weak table can have weak keys, weak values, or both.[m
[31m-A table with weak keys allows the collection of its keys,[m
[31m-but prevents the collection of its values.[m
[31m-A table with both weak keys and weak values allows the collection of[m
[31m-both keys and values.[m
[31m-In any case, if either the key or the value is collected,[m
[31m-the whole pair is removed from the table.[m
[31m-The weakness of a table is controlled by the[m
[31m-<code>__mode</code> field of its metatable.[m
[31m-If the <code>__mode</code> field is a string containing the character&nbsp;'<code>k</code>',[m
[31m-the keys in the table are weak.[m
[31m-If <code>__mode</code> contains '<code>v</code>',[m
[31m-the values in the table are weak.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-After you use a table as a metatable,[m
[31m-you should not change the value of its <code>__mode</code> field.[m
[31m-Otherwise, the weak behavior of the tables controlled by this[m
[31m-metatable is undefined.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>2.11 - <a name="2.11">Coroutines</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua supports coroutines,[m
[31m-also called <em>collaborative multithreading</em>.[m
[31m-A coroutine in Lua represents an independent thread of execution.[m
[31m-Unlike threads in multithread systems, however,[m
[31m-a coroutine only suspends its execution by explicitly calling[m
[31m-a yield function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-You create a coroutine with a call to <a href="#pdf-coroutine.create"><code>coroutine.create</code></a>.[m
[31m-Its sole argument is a function[m
[31m-that is the main function of the coroutine.[m
[31m-The <code>create</code> function only creates a new coroutine and[m
[31m-returns a handle to it (an object of type <em>thread</em>);[m
[31m-it does not start the coroutine execution.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When you first call <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>,[m
[31m-passing as its first argument[m
[31m-a thread returned by <a href="#pdf-coroutine.create"><code>coroutine.create</code></a>,[m
[31m-the coroutine starts its execution,[m
[31m-at the first line of its main function.[m
[31m-Extra arguments passed to <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> are passed on[m
[31m-to the coroutine main function.[m
[31m-After the coroutine starts running,[m
[31m-it runs until it terminates or <em>yields</em>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A coroutine can terminate its execution in two ways:[m
[31m-normally, when its main function returns[m
[31m-(explicitly or implicitly, after the last instruction);[m
[31m-and abnormally, if there is an unprotected error.[m
[31m-In the first case, <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> returns <b>true</b>,[m
[31m-plus any values returned by the coroutine main function.[m
[31m-In case of errors, <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> returns <b>false</b>[m
[31m-plus an error message.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A coroutine yields by calling <a href="#pdf-coroutine.yield"><code>coroutine.yield</code></a>.[m
[31m-When a coroutine yields,[m
[31m-the corresponding <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> returns immediately,[m
[31m-even if the yield happens inside nested function calls[m
[31m-(that is, not in the main function,[m
[31m-but in a function directly or indirectly called by the main function).[m
[31m-In the case of a yield, <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a> also returns <b>true</b>,[m
[31m-plus any values passed to <a href="#pdf-coroutine.yield"><code>coroutine.yield</code></a>.[m
[31m-The next time you resume the same coroutine,[m
[31m-it continues its execution from the point where it yielded,[m
[31m-with the call to <a href="#pdf-coroutine.yield"><code>coroutine.yield</code></a> returning any extra[m
[31m-arguments passed to <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Like <a href="#pdf-coroutine.create"><code>coroutine.create</code></a>,[m
[31m-the <a href="#pdf-coroutine.wrap"><code>coroutine.wrap</code></a> function also creates a coroutine,[m
[31m-but instead of returning the coroutine itself,[m
[31m-it returns a function that, when called, resumes the coroutine.[m
[31m-Any arguments passed to this function[m
[31m-go as extra arguments to <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>.[m
[31m-<a href="#pdf-coroutine.wrap"><code>coroutine.wrap</code></a> returns all the values returned by <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>,[m
[31m-except the first one (the boolean error code).[m
[31m-Unlike <a href="#pdf-coroutine.resume"><code>coroutine.resume</code></a>,[m
[31m-<a href="#pdf-coroutine.wrap"><code>coroutine.wrap</code></a> does not catch errors;[m
[31m-any error is propagated to the caller.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an example,[m
[31m-consider the following code:[m
[31m-[m
[31m-<pre>[m
[31m-     function foo (a)[m
[31m-       print("foo", a)[m
[31m-       return coroutine.yield(2*a)[m
[31m-     end[m
[31m-     [m
[31m-     co = coroutine.create(function (a,b)[m
[31m-           print("co-body", a, b)[m
[31m-           local r = foo(a+1)[m
[31m-           print("co-body", r)[m
[31m-           local r, s = coroutine.yield(a+b, a-b)[m
[31m-           print("co-body", r, s)[m
[31m-           return b, "end"[m
[31m-     end)[m
[31m-            [m
[31m-     print("main", coroutine.resume(co, 1, 10))[m
[31m-     print("main", coroutine.resume(co, "r"))[m
[31m-     print("main", coroutine.resume(co, "x", "y"))[m
[31m-     print("main", coroutine.resume(co, "x", "y"))[m
[31m-</pre><p>[m
[31m-When you run it, it produces the following output:[m
[31m-[m
[31m-<pre>[m
[31m-     co-body 1       10[m
[31m-     foo     2[m
[31m-     [m
[31m-     main    true    4[m
[31m-     co-body r[m
[31m-     main    true    11      -9[m
[31m-     co-body x       y[m
[31m-     main    true    10      end[m
[31m-     main    false   cannot resume dead coroutine[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>3 - <a name="3">The Application Program Interface</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-This section describes the C&nbsp;API for Lua, that is,[m
[31m-the set of C&nbsp;functions available to the host program to communicate[m
[31m-with Lua.[m
[31m-All API functions and related types and constants[m
[31m-are declared in the header file <a name="pdf-lua.h"><code>lua.h</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Even when we use the term "function",[m
[31m-any facility in the API may be provided as a macro instead.[m
[31m-All such macros use each of their arguments exactly once[m
[31m-(except for the first argument, which is always a Lua state),[m
[31m-and so do not generate any hidden side-effects.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As in most C&nbsp;libraries,[m
[31m-the Lua API functions do not check their arguments for validity or consistency.[m
[31m-However, you can change this behavior by compiling Lua[m
[31m-with a proper definition for the macro <a name="pdf-luai_apicheck"><code>luai_apicheck</code></a>,[m
[31m-in file <code>luaconf.h</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.1 - <a name="3.1">The Stack</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua uses a <em>virtual stack</em> to pass values to and from C.[m
[31m-Each element in this stack represents a Lua value[m
[31m-(<b>nil</b>, number, string, etc.).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Whenever Lua calls C, the called function gets a new stack,[m
[31m-which is independent of previous stacks and of stacks of[m
[31m-C&nbsp;functions that are still active.[m
[31m-This stack initially contains any arguments to the C&nbsp;function[m
[31m-and it is where the C&nbsp;function pushes its results[m
[31m-to be returned to the caller (see <a href="#lua_CFunction"><code>lua_CFunction</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-For convenience,[m
[31m-most query operations in the API do not follow a strict stack discipline.[m
[31m-Instead, they can refer to any element in the stack[m
[31m-by using an <em>index</em>:[m
[31m-A positive index represents an <em>absolute</em> stack position[m
[31m-(starting at&nbsp;1);[m
[31m-a negative index represents an <em>offset</em> relative to the top of the stack.[m
[31m-More specifically, if the stack has <em>n</em> elements,[m
[31m-then index&nbsp;1 represents the first element[m
[31m-(that is, the element that was pushed onto the stack first)[m
[31m-and[m
[31m-index&nbsp;<em>n</em> represents the last element;[m
[31m-index&nbsp;-1 also represents the last element[m
[31m-(that is, the element at the&nbsp;top)[m
[31m-and index <em>-n</em> represents the first element.[m
[31m-We say that an index is <em>valid</em>[m
[31m-if it lies between&nbsp;1 and the stack top[m
[31m-(that is, if <code>1 &le; abs(index) &le; top</code>).[m
[31m- [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.2 - <a name="3.2">Stack Size</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-When you interact with Lua API,[m
[31m-you are responsible for ensuring consistency.[m
[31m-In particular,[m
[31m-<em>you are responsible for controlling stack overflow</em>.[m
[31m-You can use the function <a href="#lua_checkstack"><code>lua_checkstack</code></a>[m
[31m-to grow the stack size.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Whenever Lua calls C,[m
[31m-it ensures that at least <a name="pdf-LUA_MINSTACK"><code>LUA_MINSTACK</code></a> stack positions are available.[m
[31m-<code>LUA_MINSTACK</code> is defined as 20,[m
[31m-so that usually you do not have to worry about stack space[m
[31m-unless your code has loops pushing elements onto the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Most query functions accept as indices any value inside the[m
[31m-available stack space, that is, indices up to the maximum stack size[m
[31m-you have set through <a href="#lua_checkstack"><code>lua_checkstack</code></a>.[m
[31m-Such indices are called <em>acceptable indices</em>.[m
[31m-More formally, we define an <em>acceptable index</em>[m
[31m-as follows:[m
[31m-[m
[31m-<pre>[m
[31m-     (index &lt; 0 &amp;&amp; abs(index) &lt;= top) ||[m
[31m-     (index &gt; 0 &amp;&amp; index &lt;= stackspace)[m
[31m-</pre><p>[m
[31m-Note that 0 is never an acceptable index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.3 - <a name="3.3">Pseudo-Indices</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Unless otherwise noted,[m
[31m-any function that accepts valid indices can also be called with[m
[31m-<em>pseudo-indices</em>,[m
[31m-which represent some Lua values that are accessible to C&nbsp;code[m
[31m-but which are not in the stack.[m
[31m-Pseudo-indices are used to access the thread environment,[m
[31m-the function environment,[m
[31m-the registry,[m
[31m-and the upvalues of a C&nbsp;function (see <a href="#3.4">&sect;3.4</a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The thread environment (where global variables live) is[m
[31m-always at pseudo-index <a name="pdf-LUA_GLOBALSINDEX"><code>LUA_GLOBALSINDEX</code></a>.[m
[31m-The environment of the running C&nbsp;function is always[m
[31m-at pseudo-index <a name="pdf-LUA_ENVIRONINDEX"><code>LUA_ENVIRONINDEX</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To access and change the value of global variables,[m
[31m-you can use regular table operations over an environment table.[m
[31m-For instance, to access the value of a global variable, do[m
[31m-[m
[31m-<pre>[m
[31m-     lua_getfield(L, LUA_GLOBALSINDEX, varname);[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.4 - <a name="3.4">C Closures</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-When a C&nbsp;function is created,[m
[31m-it is possible to associate some values with it,[m
[31m-thus creating a <em>C&nbsp;closure</em>;[m
[31m-these values are called <em>upvalues</em> and are[m
[31m-accessible to the function whenever it is called[m
[31m-(see <a href="#lua_pushcclosure"><code>lua_pushcclosure</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Whenever a C&nbsp;function is called,[m
[31m-its upvalues are located at specific pseudo-indices.[m
[31m-These pseudo-indices are produced by the macro[m
[31m-<a name="lua_upvalueindex"><code>lua_upvalueindex</code></a>.[m
[31m-The first value associated with a function is at position[m
[31m-<code>lua_upvalueindex(1)</code>, and so on.[m
[31m-Any access to <code>lua_upvalueindex(<em>n</em>)</code>,[m
[31m-where <em>n</em> is greater than the number of upvalues of the[m
[31m-current function (but not greater than 256),[m
[31m-produces an acceptable (but invalid) index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.5 - <a name="3.5">Registry</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua provides a <em>registry</em>,[m
[31m-a pre-defined table that can be used by any C&nbsp;code to[m
[31m-store whatever Lua value it needs to store.[m
[31m-This table is always located at pseudo-index[m
[31m-<a name="pdf-LUA_REGISTRYINDEX"><code>LUA_REGISTRYINDEX</code></a>.[m
[31m-Any C&nbsp;library can store data into this table,[m
[31m-but it should take care to choose keys different from those used[m
[31m-by other libraries, to avoid collisions.[m
[31m-Typically, you should use as key a string containing your library name[m
[31m-or a light userdata with the address of a C&nbsp;object in your code.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The integer keys in the registry are used by the reference mechanism,[m
[31m-implemented by the auxiliary library,[m
[31m-and therefore should not be used for other purposes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.6 - <a name="3.6">Error Handling in C</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Internally, Lua uses the C <code>longjmp</code> facility to handle errors.[m
[31m-(You can also choose to use exceptions if you use C++;[m
[31m-see file <code>luaconf.h</code>.)[m
[31m-When Lua faces any error[m
[31m-(such as memory allocation errors, type errors, syntax errors,[m
[31m-and runtime errors)[m
[31m-it <em>raises</em> an error;[m
[31m-that is, it does a long jump.[m
[31m-A <em>protected environment</em> uses <code>setjmp</code>[m
[31m-to set a recover point;[m
[31m-any error jumps to the most recent active recover point.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Most functions in the API can throw an error,[m
[31m-for instance due to a memory allocation error.[m
[31m-The documentation for each function indicates whether[m
[31m-it can throw errors.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Inside a C&nbsp;function you can throw an error by calling <a href="#lua_error"><code>lua_error</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.7 - <a name="3.7">Functions and Types</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Here we list all functions and types from the C&nbsp;API in[m
[31m-alphabetical order.[m
[31m-Each function has an indicator like this:[m
[31m-<span class="apii">[-o, +p, <em>x</em>]</span>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The first field, <code>o</code>,[m
[31m-is how many elements the function pops from the stack.[m
[31m-The second field, <code>p</code>,[m
[31m-is how many elements the function pushes onto the stack.[m
[31m-(Any function always pushes its results after popping its arguments.)[m
[31m-A field in the form <code>x|y</code> means the function can push (or pop)[m
[31m-<code>x</code> or <code>y</code> elements,[m
[31m-depending on the situation;[m
[31m-an interrogation mark '<code>?</code>' means that[m
[31m-we cannot know how many elements the function pops/pushes[m
[31m-by looking only at its arguments[m
[31m-(e.g., they may depend on what is on the stack).[m
[31m-The third field, <code>x</code>,[m
[31m-tells whether the function may throw errors:[m
[31m-'<code>-</code>' means the function never throws any error;[m
[31m-'<code>m</code>' means the function may throw an error[m
[31m-only due to not enough memory;[m
[31m-'<code>e</code>' means the function may throw other kinds of errors;[m
[31m-'<code>v</code>' means the function may throw an error on purpose.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Alloc"><code>lua_Alloc</code></a></h3>[m
[31m-<pre>typedef void * (*lua_Alloc) (void *ud,[m
[31m-                             void *ptr,[m
[31m-                             size_t osize,[m
[31m-                             size_t nsize);</pre>[m
[31m-[m
[31m-<p>[m
[31m-The type of the memory-allocation function used by Lua states.[m
[31m-The allocator function must provide a[m
[31m-functionality similar to <code>realloc</code>,[m
[31m-but not exactly the same.[m
[31m-Its arguments are[m
[31m-<code>ud</code>, an opaque pointer passed to <a href="#lua_newstate"><code>lua_newstate</code></a>;[m
[31m-<code>ptr</code>, a pointer to the block being allocated/reallocated/freed;[m
[31m-<code>osize</code>, the original size of the block;[m
[31m-<code>nsize</code>, the new size of the block.[m
[31m-<code>ptr</code> is <code>NULL</code> if and only if <code>osize</code> is zero.[m
[31m-When <code>nsize</code> is zero, the allocator must return <code>NULL</code>;[m
[31m-if <code>osize</code> is not zero,[m
[31m-it should free the block pointed to by <code>ptr</code>.[m
[31m-When <code>nsize</code> is not zero, the allocator returns <code>NULL</code>[m
[31m-if and only if it cannot fill the request.[m
[31m-When <code>nsize</code> is not zero and <code>osize</code> is zero,[m
[31m-the allocator should behave like <code>malloc</code>.[m
[31m-When <code>nsize</code> and <code>osize</code> are not zero,[m
[31m-the allocator behaves like <code>realloc</code>.[m
[31m-Lua assumes that the allocator never fails when[m
[31m-<code>osize &gt;= nsize</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Here is a simple implementation for the allocator function.[m
[31m-It is used in the auxiliary library by <a href="#luaL_newstate"><code>luaL_newstate</code></a>.[m
[31m-[m
[31m-<pre>[m
[31m-     static void *l_alloc (void *ud, void *ptr, size_t osize,[m
[31m-                                                size_t nsize) {[m
[31m-       (void)ud;  (void)osize;  /* not used */[m
[31m-       if (nsize == 0) {[m
[31m-         free(ptr);[m
[31m-         return NULL;[m
[31m-       }[m
[31m-       else[m
[31m-         return realloc(ptr, nsize);[m
[31m-     }[m
[31m-</pre><p>[m
[31m-This code assumes[m
[31m-that <code>free(NULL)</code> has no effect and that[m
[31m-<code>realloc(NULL, size)</code> is equivalent to <code>malloc(size)</code>.[m
[31m-ANSI&nbsp;C ensures both behaviors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_atpanic"><code>lua_atpanic</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets a new panic function and returns the old one.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If an error happens outside any protected environment,[m
[31m-Lua calls a <em>panic function</em>[m
[31m-and then calls <code>exit(EXIT_FAILURE)</code>,[m
[31m-thus exiting the host application.[m
[31m-Your panic function can avoid this exit by[m
[31m-never returning (e.g., doing a long jump).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The panic function can access the error message at the top of the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_call"><code>lua_call</code></a></h3><p>[m
[31m-<span class="apii">[-(nargs + 1), +nresults, <em>e</em>]</span>[m
[31m-<pre>void lua_call (lua_State *L, int nargs, int nresults);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Calls a function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To call a function you must use the following protocol:[m
[31m-first, the function to be called is pushed onto the stack;[m
[31m-then, the arguments to the function are pushed[m
[31m-in direct order;[m
[31m-that is, the first argument is pushed first.[m
[31m-Finally you call <a href="#lua_call"><code>lua_call</code></a>;[m
[31m-<code>nargs</code> is the number of arguments that you pushed onto the stack.[m
[31m-All arguments and the function value are popped from the stack[m
[31m-when the function is called.[m
[31m-The function results are pushed onto the stack when the function returns.[m
[31m-The number of results is adjusted to <code>nresults</code>,[m
[31m-unless <code>nresults</code> is <a name="pdf-LUA_MULTRET"><code>LUA_MULTRET</code></a>.[m
[31m-In this case, <em>all</em> results from the function are pushed.[m
[31m-Lua takes care that the returned values fit into the stack space.[m
[31m-The function results are pushed onto the stack in direct order[m
[31m-(the first result is pushed first),[m
[31m-so that after the call the last result is on the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Any error inside the called function is propagated upwards[m
[31m-(with a <code>longjmp</code>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The following example shows how the host program can do the[m
[31m-equivalent to this Lua code:[m
[31m-[m
[31m-<pre>[m
[31m-     a = f("how", t.x, 14)[m
[31m-</pre><p>[m
[31m-Here it is in&nbsp;C:[m
[31m-[m
[31m-<pre>[m
[31m-     lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */[m
[31m-     lua_pushstring(L, "how");                        /* 1st argument */[m
[31m-     lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* table to be indexed */[m
[31m-     lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */[m
[31m-     lua_remove(L, -2);                  /* remove 't' from the stack */[m
[31m-     lua_pushinteger(L, 14);                          /* 3rd argument */[m
[31m-     lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */[m
[31m-     lua_setfield(L, LUA_GLOBALSINDEX, "a");        /* set global 'a' */[m
[31m-</pre><p>[m
[31m-Note that the code above is "balanced":[m
[31m-at its end, the stack is back to its original configuration.[m
[31m-This is considered good programming practice.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_CFunction"><code>lua_CFunction</code></a></h3>[m
[31m-<pre>typedef int (*lua_CFunction) (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Type for C&nbsp;functions.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In order to communicate properly with Lua,[m
[31m-a C&nbsp;function must use the following protocol,[m
[31m-which defines the way parameters and results are passed:[m
[31m-a C&nbsp;function receives its arguments from Lua in its stack[m
[31m-in direct order (the first argument is pushed first).[m
[31m-So, when the function starts,[m
[31m-<code>lua_gettop(L)</code> returns the number of arguments received by the function.[m
[31m-The first argument (if any) is at index 1[m
[31m-and its last argument is at index <code>lua_gettop(L)</code>.[m
[31m-To return values to Lua, a C&nbsp;function just pushes them onto the stack,[m
[31m-in direct order (the first result is pushed first),[m
[31m-and returns the number of results.[m
[31m-Any other value in the stack below the results will be properly[m
[31m-discarded by Lua.[m
[31m-Like a Lua function, a C&nbsp;function called by Lua can also return[m
[31m-many results.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an example, the following function receives a variable number[m
[31m-of numerical arguments and returns their average and sum:[m
[31m-[m
[31m-<pre>[m
[31m-     static int foo (lua_State *L) {[m
[31m-       int n = lua_gettop(L);    /* number of arguments */[m
[31m-       lua_Number sum = 0;[m
[31m-       int i;[m
[31m-       for (i = 1; i &lt;= n; i++) {[m
[31m-         if (!lua_isnumber(L, i)) {[m
[31m-           lua_pushstring(L, "incorrect argument");[m
[31m-           lua_error(L);[m
[31m-         }[m
[31m-         sum += lua_tonumber(L, i);[m
[31m-       }[m
[31m-       lua_pushnumber(L, sum/n);        /* first result */[m
[31m-       lua_pushnumber(L, sum);         /* second result */[m
[31m-       return 2;                   /* number of results */[m
[31m-     }[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_checkstack"><code>lua_checkstack</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>int lua_checkstack (lua_State *L, int extra);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Ensures that there are at least <code>extra</code> free stack slots in the stack.[m
[31m-It returns false if it cannot grow the stack to that size.[m
[31m-This function never shrinks the stack;[m
[31m-if the stack is already larger than the new size,[m
[31m-it is left unchanged.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_close"><code>lua_close</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_close (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Destroys all objects in the given Lua state[m
[31m-(calling the corresponding garbage-collection metamethods, if any)[m
[31m-and frees all dynamic memory used by this state.[m
[31m-On several platforms, you may not need to call this function,[m
[31m-because all resources are naturally released when the host program ends.[m
[31m-On the other hand, long-running programs,[m
[31m-such as a daemon or a web server,[m
[31m-might need to release states as soon as they are not needed,[m
[31m-to avoid growing too large.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_concat"><code>lua_concat</code></a></h3><p>[m
[31m-<span class="apii">[-n, +1, <em>e</em>]</span>[m
[31m-<pre>void lua_concat (lua_State *L, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Concatenates the <code>n</code> values at the top of the stack,[m
[31m-pops them, and leaves the result at the top.[m
[31m-If <code>n</code>&nbsp;is&nbsp;1, the result is the single value on the stack[m
[31m-(that is, the function does nothing);[m
[31m-if <code>n</code> is 0, the result is the empty string.[m
[31m-Concatenation is performed following the usual semantics of Lua[m
[31m-(see <a href="#2.5.4">&sect;2.5.4</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_cpcall"><code>lua_cpcall</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>-</em>]</span>[m
[31m-<pre>int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Calls the C&nbsp;function <code>func</code> in protected mode.[m
[31m-<code>func</code> starts with only one element in its stack,[m
[31m-a light userdata containing <code>ud</code>.[m
[31m-In case of errors,[m
[31m-<a href="#lua_cpcall"><code>lua_cpcall</code></a> returns the same error codes as <a href="#lua_pcall"><code>lua_pcall</code></a>,[m
[31m-plus the error object on the top of the stack;[m
[31m-otherwise, it returns zero, and does not change the stack.[m
[31m-All values returned by <code>func</code> are discarded.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_createtable"><code>lua_createtable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_createtable (lua_State *L, int narr, int nrec);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new empty table and pushes it onto the stack.[m
[31m-The new table has space pre-allocated[m
[31m-for <code>narr</code> array elements and <code>nrec</code> non-array elements.[m
[31m-This pre-allocation is useful when you know exactly how many elements[m
[31m-the table will have.[m
[31m-Otherwise you can use the function <a href="#lua_newtable"><code>lua_newtable</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_dump"><code>lua_dump</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>int lua_dump (lua_State *L, lua_Writer writer, void *data);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Dumps a function as a binary chunk.[m
[31m-Receives a Lua function on the top of the stack[m
[31m-and produces a binary chunk that,[m
[31m-if loaded again,[m
[31m-results in a function equivalent to the one dumped.[m
[31m-As it produces parts of the chunk,[m
[31m-<a href="#lua_dump"><code>lua_dump</code></a> calls function <code>writer</code> (see <a href="#lua_Writer"><code>lua_Writer</code></a>)[m
[31m-with the given <code>data</code>[m
[31m-to write them.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The value returned is the error code returned by the last[m
[31m-call to the writer;[m
[31m-0&nbsp;means no errors.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function does not pop the Lua function from the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_equal"><code>lua_equal</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>e</em>]</span>[m
[31m-<pre>int lua_equal (lua_State *L, int index1, int index2);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the two values in acceptable indices <code>index1</code> and[m
[31m-<code>index2</code> are equal,[m
[31m-following the semantics of the Lua <code>==</code> operator[m
[31m-(that is, may call metamethods).[m
[31m-Otherwise returns&nbsp;0.[m
[31m-Also returns&nbsp;0 if any of the indices is non valid.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_error"><code>lua_error</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>v</em>]</span>[m
[31m-<pre>int lua_error (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Generates a Lua error.[m
[31m-The error message (which can actually be a Lua value of any type)[m
[31m-must be on the stack top.[m
[31m-This function does a long jump,[m
[31m-and therefore never returns.[m
[31m-(see <a href="#luaL_error"><code>luaL_error</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gc"><code>lua_gc</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>e</em>]</span>[m
[31m-<pre>int lua_gc (lua_State *L, int what, int data);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Controls the garbage collector.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function performs several tasks,[m
[31m-according to the value of the parameter <code>what</code>:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b><code>LUA_GCSTOP</code>:</b>[m
[31m-stops the garbage collector.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCRESTART</code>:</b>[m
[31m-restarts the garbage collector.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCCOLLECT</code>:</b>[m
[31m-performs a full garbage-collection cycle.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCCOUNT</code>:</b>[m
[31m-returns the current amount of memory (in Kbytes) in use by Lua.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCCOUNTB</code>:</b>[m
[31m-returns the remainder of dividing the current amount of bytes of[m
[31m-memory in use by Lua by 1024.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCSTEP</code>:</b>[m
[31m-performs an incremental step of garbage collection.[m
[31m-The step "size" is controlled by <code>data</code>[m
[31m-(larger values mean more steps) in a non-specified way.[m
[31m-If you want to control the step size[m
[31m-you must experimentally tune the value of <code>data</code>.[m
[31m-The function returns 1 if the step finished a[m
[31m-garbage-collection cycle.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCSETPAUSE</code>:</b>[m
[31m-sets <code>data</code> as the new value[m
[31m-for the <em>pause</em> of the collector (see <a href="#2.10">&sect;2.10</a>).[m
[31m-The function returns the previous value of the pause.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>LUA_GCSETSTEPMUL</code>:</b>[m
[31m-sets <code>data</code> as the new value for the <em>step multiplier</em> of[m
[31m-the collector (see <a href="#2.10">&sect;2.10</a>).[m
[31m-The function returns the previous value of the step multiplier.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getallocf"><code>lua_getallocf</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_Alloc lua_getallocf (lua_State *L, void **ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the memory-allocation function of a given state.[m
[31m-If <code>ud</code> is not <code>NULL</code>, Lua stores in <code>*ud</code> the[m
[31m-opaque pointer passed to <a href="#lua_newstate"><code>lua_newstate</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getfenv"><code>lua_getfenv</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_getfenv (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the environment table of[m
[31m-the value at the given index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getfield"><code>lua_getfield</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>e</em>]</span>[m
[31m-<pre>void lua_getfield (lua_State *L, int index, const char *k);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the value <code>t[k]</code>,[m
[31m-where <code>t</code> is the value at the given valid index.[m
[31m-As in Lua, this function may trigger a metamethod[m
[31m-for the "index" event (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getglobal"><code>lua_getglobal</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>e</em>]</span>[m
[31m-<pre>void lua_getglobal (lua_State *L, const char *name);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the value of the global <code>name</code>.[m
[31m-It is defined as a macro:[m
[31m-[m
[31m-<pre>[m
[31m-     #define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, s)[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getmetatable"><code>lua_getmetatable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>-</em>]</span>[m
[31m-<pre>int lua_getmetatable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the metatable of the value at the given[m
[31m-acceptable index.[m
[31m-If the index is not valid,[m
[31m-or if the value does not have a metatable,[m
[31m-the function returns&nbsp;0 and pushes nothing on the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gettable"><code>lua_gettable</code></a></h3><p>[m
[31m-<span class="apii">[-1, +1, <em>e</em>]</span>[m
[31m-<pre>void lua_gettable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the value <code>t[k]</code>,[m
[31m-where <code>t</code> is the value at the given valid index[m
[31m-and <code>k</code> is the value at the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops the key from the stack[m
[31m-(putting the resulting value in its place).[m
[31m-As in Lua, this function may trigger a metamethod[m
[31m-for the "index" event (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gettop"><code>lua_gettop</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_gettop (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the index of the top element in the stack.[m
[31m-Because indices start at&nbsp;1,[m
[31m-this result is equal to the number of elements in the stack[m
[31m-(and so 0&nbsp;means an empty stack).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_insert"><code>lua_insert</code></a></h3><p>[m
[31m-<span class="apii">[-1, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_insert (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Moves the top element into the given valid index,[m
[31m-shifting up the elements above this index to open space.[m
[31m-Cannot be called with a pseudo-index,[m
[31m-because a pseudo-index is not an actual stack position.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Integer"><code>lua_Integer</code></a></h3>[m
[31m-<pre>typedef ptrdiff_t lua_Integer;</pre>[m
[31m-[m
[31m-<p>[m
[31m-The type used by the Lua API to represent integral values.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-By default it is a <code>ptrdiff_t</code>,[m
[31m-which is usually the largest signed integral type the machine handles[m
[31m-"comfortably".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isboolean"><code>lua_isboolean</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isboolean (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index has type boolean,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_iscfunction"><code>lua_iscfunction</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_iscfunction (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a C&nbsp;function,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isfunction"><code>lua_isfunction</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isfunction (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a function[m
[31m-(either C or Lua), and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_islightuserdata"><code>lua_islightuserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_islightuserdata (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a light userdata,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isnil"><code>lua_isnil</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isnil (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is <b>nil</b>,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isnone"><code>lua_isnone</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isnone (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the given acceptable index is not valid[m
[31m-(that is, it refers to an element outside the current stack),[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isnoneornil"><code>lua_isnoneornil</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isnoneornil (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the given acceptable index is not valid[m
[31m-(that is, it refers to an element outside the current stack)[m
[31m-or if the value at this index is <b>nil</b>,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isnumber"><code>lua_isnumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isnumber (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a number[m
[31m-or a string convertible to a number,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isstring"><code>lua_isstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isstring (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a string[m
[31m-or a number (which is always convertible to a string),[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_istable"><code>lua_istable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_istable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a table,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isthread"><code>lua_isthread</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isthread (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a thread,[m
[31m-and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_isuserdata"><code>lua_isuserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_isuserdata (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at the given acceptable index is a userdata[m
[31m-(either full or light), and 0&nbsp;otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_lessthan"><code>lua_lessthan</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>e</em>]</span>[m
[31m-<pre>int lua_lessthan (lua_State *L, int index1, int index2);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the value at acceptable index <code>index1</code> is smaller[m
[31m-than the value at acceptable index <code>index2</code>,[m
[31m-following the semantics of the Lua <code>&lt;</code> operator[m
[31m-(that is, may call metamethods).[m
[31m-Otherwise returns&nbsp;0.[m
[31m-Also returns&nbsp;0 if any of the indices is non valid.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_load"><code>lua_load</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>int lua_load (lua_State *L,[m
[31m-              lua_Reader reader,[m
[31m-              void *data,[m
[31m-              const char *chunkname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads a Lua chunk.[m
[31m-If there are no errors,[m
[31m-<a href="#lua_load"><code>lua_load</code></a> pushes the compiled chunk as a Lua[m
[31m-function on top of the stack.[m
[31m-Otherwise, it pushes an error message.[m
[31m-The return values of <a href="#lua_load"><code>lua_load</code></a> are:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>0:</b> no errors;</li>[m
[31m-[m
[31m-<li><b><a name="pdf-LUA_ERRSYNTAX"><code>LUA_ERRSYNTAX</code></a>:</b>[m
[31m-syntax error during pre-compilation;</li>[m
[31m-[m
[31m-<li><b><a href="#pdf-LUA_ERRMEM"><code>LUA_ERRMEM</code></a>:</b>[m
[31m-memory allocation error.</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-This function only loads a chunk;[m
[31m-it does not run it.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<a href="#lua_load"><code>lua_load</code></a> automatically detects whether the chunk is text or binary,[m
[31m-and loads it accordingly (see program <code>luac</code>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <a href="#lua_load"><code>lua_load</code></a> function uses a user-supplied <code>reader</code> function[m
[31m-to read the chunk (see <a href="#lua_Reader"><code>lua_Reader</code></a>).[m
[31m-The <code>data</code> argument is an opaque value passed to the reader function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <code>chunkname</code> argument gives a name to the chunk,[m
[31m-which is used for error messages and in debug information (see <a href="#3.8">&sect;3.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_newstate"><code>lua_newstate</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_State *lua_newstate (lua_Alloc f, void *ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new, independent state.[m
[31m-Returns <code>NULL</code> if cannot create the state[m
[31m-(due to lack of memory).[m
[31m-The argument <code>f</code> is the allocator function;[m
[31m-Lua does all memory allocation for this state through this function.[m
[31m-The second argument, <code>ud</code>, is an opaque pointer that Lua[m
[31m-simply passes to the allocator in every call.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_newtable"><code>lua_newtable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_newtable (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new empty table and pushes it onto the stack.[m
[31m-It is equivalent to <code>lua_createtable(L, 0, 0)</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_newthread"><code>lua_newthread</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>lua_State *lua_newthread (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new thread, pushes it on the stack,[m
[31m-and returns a pointer to a <a href="#lua_State"><code>lua_State</code></a> that represents this new thread.[m
[31m-The new state returned by this function shares with the original state[m
[31m-all global objects (such as tables),[m
[31m-but has an independent execution stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-There is no explicit function to close or to destroy a thread.[m
[31m-Threads are subject to garbage collection,[m
[31m-like any Lua object.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_newuserdata"><code>lua_newuserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void *lua_newuserdata (lua_State *L, size_t size);</pre>[m
[31m-[m
[31m-<p>[m
[31m-This function allocates a new block of memory with the given size,[m
[31m-pushes onto the stack a new full userdata with the block address,[m
[31m-and returns this address.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Userdata represent C&nbsp;values in Lua.[m
[31m-A <em>full userdata</em> represents a block of memory.[m
[31m-It is an object (like a table):[m
[31m-you must create it, it can have its own metatable,[m
[31m-and you can detect when it is being collected.[m
[31m-A full userdata is only equal to itself (under raw equality).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When Lua collects a full userdata with a <code>gc</code> metamethod,[m
[31m-Lua calls the metamethod and marks the userdata as finalized.[m
[31m-When this userdata is collected again then[m
[31m-Lua frees its corresponding memory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_next"><code>lua_next</code></a></h3><p>[m
[31m-<span class="apii">[-1, +(2|0), <em>e</em>]</span>[m
[31m-<pre>int lua_next (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops a key from the stack,[m
[31m-and pushes a key-value pair from the table at the given index[m
[31m-(the "next" pair after the given key).[m
[31m-If there are no more elements in the table,[m
[31m-then <a href="#lua_next"><code>lua_next</code></a> returns 0 (and pushes nothing).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A typical traversal looks like this:[m
[31m-[m
[31m-<pre>[m
[31m-     /* table is in the stack at index 't' */[m
[31m-     lua_pushnil(L);  /* first key */[m
[31m-     while (lua_next(L, t) != 0) {[m
[31m-       /* uses 'key' (at index -2) and 'value' (at index -1) */[m
[31m-       printf("%s - %s\n",[m
[31m-              lua_typename(L, lua_type(L, -2)),[m
[31m-              lua_typename(L, lua_type(L, -1)));[m
[31m-       /* removes 'value'; keeps 'key' for next iteration */[m
[31m-       lua_pop(L, 1);[m
[31m-     }[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-While traversing a table,[m
[31m-do not call <a href="#lua_tolstring"><code>lua_tolstring</code></a> directly on a key,[m
[31m-unless you know that the key is actually a string.[m
[31m-Recall that <a href="#lua_tolstring"><code>lua_tolstring</code></a> <em>changes</em>[m
[31m-the value at the given index;[m
[31m-this confuses the next call to <a href="#lua_next"><code>lua_next</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Number"><code>lua_Number</code></a></h3>[m
[31m-<pre>typedef double lua_Number;</pre>[m
[31m-[m
[31m-<p>[m
[31m-The type of numbers in Lua.[m
[31m-By default, it is double, but that can be changed in <code>luaconf.h</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Through the configuration file you can change[m
[31m-Lua to operate with another type for numbers (e.g., float or long).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_objlen"><code>lua_objlen</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>size_t lua_objlen (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the "length" of the value at the given acceptable index:[m
[31m-for strings, this is the string length;[m
[31m-for tables, this is the result of the length operator ('<code>#</code>');[m
[31m-for userdata, this is the size of the block of memory allocated[m
[31m-for the userdata;[m
[31m-for other values, it is&nbsp;0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pcall"><code>lua_pcall</code></a></h3><p>[m
[31m-<span class="apii">[-(nargs + 1), +(nresults|1), <em>-</em>]</span>[m
[31m-<pre>int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Calls a function in protected mode.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Both <code>nargs</code> and <code>nresults</code> have the same meaning as[m
[31m-in <a href="#lua_call"><code>lua_call</code></a>.[m
[31m-If there are no errors during the call,[m
[31m-<a href="#lua_pcall"><code>lua_pcall</code></a> behaves exactly like <a href="#lua_call"><code>lua_call</code></a>.[m
[31m-However, if there is any error,[m
[31m-<a href="#lua_pcall"><code>lua_pcall</code></a> catches it,[m
[31m-pushes a single value on the stack (the error message),[m
[31m-and returns an error code.[m
[31m-Like <a href="#lua_call"><code>lua_call</code></a>,[m
[31m-<a href="#lua_pcall"><code>lua_pcall</code></a> always removes the function[m
[31m-and its arguments from the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>errfunc</code> is 0,[m
[31m-then the error message returned on the stack[m
[31m-is exactly the original error message.[m
[31m-Otherwise, <code>errfunc</code> is the stack index of an[m
[31m-<em>error handler function</em>.[m
[31m-(In the current implementation, this index cannot be a pseudo-index.)[m
[31m-In case of runtime errors,[m
[31m-this function will be called with the error message[m
[31m-and its return value will be the message returned on the stack by <a href="#lua_pcall"><code>lua_pcall</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Typically, the error handler function is used to add more debug[m
[31m-information to the error message, such as a stack traceback.[m
[31m-Such information cannot be gathered after the return of <a href="#lua_pcall"><code>lua_pcall</code></a>,[m
[31m-since by then the stack has unwound.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <a href="#lua_pcall"><code>lua_pcall</code></a> function returns 0 in case of success[m
[31m-or one of the following error codes[m
[31m-(defined in <code>lua.h</code>):[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b><a name="pdf-LUA_ERRRUN"><code>LUA_ERRRUN</code></a>:</b>[m
[31m-a runtime error.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><a name="pdf-LUA_ERRMEM"><code>LUA_ERRMEM</code></a>:</b>[m
[31m-memory allocation error.[m
[31m-For such errors, Lua does not call the error handler function.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><a name="pdf-LUA_ERRERR"><code>LUA_ERRERR</code></a>:</b>[m
[31m-error while running the error handler function.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pop"><code>lua_pop</code></a></h3><p>[m
[31m-<span class="apii">[-n, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_pop (lua_State *L, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops <code>n</code> elements from the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushboolean"><code>lua_pushboolean</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushboolean (lua_State *L, int b);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a boolean value with value <code>b</code> onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushcclosure"><code>lua_pushcclosure</code></a></h3><p>[m
[31m-<span class="apii">[-n, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a new C&nbsp;closure onto the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When a C&nbsp;function is created,[m
[31m-it is possible to associate some values with it,[m
[31m-thus creating a C&nbsp;closure (see <a href="#3.4">&sect;3.4</a>);[m
[31m-these values are then accessible to the function whenever it is called.[m
[31m-To associate values with a C&nbsp;function,[m
[31m-first these values should be pushed onto the stack[m
[31m-(when there are multiple values, the first value is pushed first).[m
[31m-Then <a href="#lua_pushcclosure"><code>lua_pushcclosure</code></a>[m
[31m-is called to create and push the C&nbsp;function onto the stack,[m
[31m-with the argument <code>n</code> telling how many values should be[m
[31m-associated with the function.[m
[31m-<a href="#lua_pushcclosure"><code>lua_pushcclosure</code></a> also pops these values from the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The maximum value for <code>n</code> is 255.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushcfunction"><code>lua_pushcfunction</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushcfunction (lua_State *L, lua_CFunction f);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a C&nbsp;function onto the stack.[m
[31m-This function receives a pointer to a C function[m
[31m-and pushes onto the stack a Lua value of type <code>function</code> that,[m
[31m-when called, invokes the corresponding C&nbsp;function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Any function to be registered in Lua must[m
[31m-follow the correct protocol to receive its parameters[m
[31m-and return its results (see <a href="#lua_CFunction"><code>lua_CFunction</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<code>lua_pushcfunction</code> is defined as a macro:[m
[31m-[m
[31m-<pre>[m
[31m-     #define lua_pushcfunction(L,f)  lua_pushcclosure(L,f,0)[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushfstring"><code>lua_pushfstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>const char *lua_pushfstring (lua_State *L, const char *fmt, ...);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack a formatted string[m
[31m-and returns a pointer to this string.[m
[31m-It is similar to the C&nbsp;function <code>sprintf</code>,[m
[31m-but has some important differences:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-You do not have to allocate space for the result:[m
[31m-the result is a Lua string and Lua takes care of memory allocation[m
[31m-(and deallocation, through garbage collection).[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-The conversion specifiers are quite restricted.[m
[31m-There are no flags, widths, or precisions.[m
[31m-The conversion specifiers can only be[m
[31m-'<code>%%</code>' (inserts a '<code>%</code>' in the string),[m
[31m-'<code>%s</code>' (inserts a zero-terminated string, with no size restrictions),[m
[31m-'<code>%f</code>' (inserts a <a href="#lua_Number"><code>lua_Number</code></a>),[m
[31m-'<code>%p</code>' (inserts a pointer as a hexadecimal numeral),[m
[31m-'<code>%d</code>' (inserts an <code>int</code>), and[m
[31m-'<code>%c</code>' (inserts an <code>int</code> as a character).[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushinteger"><code>lua_pushinteger</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushinteger (lua_State *L, lua_Integer n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a number with value <code>n</code> onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushlightuserdata"><code>lua_pushlightuserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushlightuserdata (lua_State *L, void *p);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a light userdata onto the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Userdata represent C&nbsp;values in Lua.[m
[31m-A <em>light userdata</em> represents a pointer.[m
[31m-It is a value (like a number):[m
[31m-you do not create it, it has no individual metatable,[m
[31m-and it is not collected (as it was never created).[m
[31m-A light userdata is equal to "any"[m
[31m-light userdata with the same C&nbsp;address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushliteral"><code>lua_pushliteral</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushliteral (lua_State *L, const char *s);</pre>[m
[31m-[m
[31m-<p>[m
[31m-This macro is equivalent to <a href="#lua_pushlstring"><code>lua_pushlstring</code></a>,[m
[31m-but can be used only when <code>s</code> is a literal string.[m
[31m-In these cases, it automatically provides the string length.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushlstring"><code>lua_pushlstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushlstring (lua_State *L, const char *s, size_t len);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes the string pointed to by <code>s</code> with size <code>len</code>[m
[31m-onto the stack.[m
[31m-Lua makes (or reuses) an internal copy of the given string,[m
[31m-so the memory at <code>s</code> can be freed or reused immediately after[m
[31m-the function returns.[m
[31m-The string can contain embedded zeros.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushnil"><code>lua_pushnil</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushnil (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a nil value onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushnumber"><code>lua_pushnumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushnumber (lua_State *L, lua_Number n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a number with value <code>n</code> onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushstring"><code>lua_pushstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void lua_pushstring (lua_State *L, const char *s);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes the zero-terminated string pointed to by <code>s</code>[m
[31m-onto the stack.[m
[31m-Lua makes (or reuses) an internal copy of the given string,[m
[31m-so the memory at <code>s</code> can be freed or reused immediately after[m
[31m-the function returns.[m
[31m-The string cannot contain embedded zeros;[m
[31m-it is assumed to end at the first zero.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushthread"><code>lua_pushthread</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>int lua_pushthread (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes the thread represented by <code>L</code> onto the stack.[m
[31m-Returns 1 if this thread is the main thread of its state.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushvalue"><code>lua_pushvalue</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_pushvalue (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes a copy of the element at the given valid index[m
[31m-onto the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_pushvfstring"><code>lua_pushvfstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>const char *lua_pushvfstring (lua_State *L,[m
[31m-                              const char *fmt,[m
[31m-                              va_list argp);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <a href="#lua_pushfstring"><code>lua_pushfstring</code></a>, except that it receives a <code>va_list</code>[m
[31m-instead of a variable number of arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawequal"><code>lua_rawequal</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_rawequal (lua_State *L, int index1, int index2);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns 1 if the two values in acceptable indices <code>index1</code> and[m
[31m-<code>index2</code> are primitively equal[m
[31m-(that is, without calling metamethods).[m
[31m-Otherwise returns&nbsp;0.[m
[31m-Also returns&nbsp;0 if any of the indices are non valid.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawget"><code>lua_rawget</code></a></h3><p>[m
[31m-<span class="apii">[-1, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_rawget (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#lua_gettable"><code>lua_gettable</code></a>, but does a raw access[m
[31m-(i.e., without metamethods).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawgeti"><code>lua_rawgeti</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void lua_rawgeti (lua_State *L, int index, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the value <code>t[n]</code>,[m
[31m-where <code>t</code> is the value at the given valid index.[m
[31m-The access is raw;[m
[31m-that is, it does not invoke metamethods.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawset"><code>lua_rawset</code></a></h3><p>[m
[31m-<span class="apii">[-2, +0, <em>m</em>]</span>[m
[31m-<pre>void lua_rawset (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#lua_settable"><code>lua_settable</code></a>, but does a raw assignment[m
[31m-(i.e., without metamethods).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_rawseti"><code>lua_rawseti</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>m</em>]</span>[m
[31m-<pre>void lua_rawseti (lua_State *L, int index, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Does the equivalent of <code>t[n] = v</code>,[m
[31m-where <code>t</code> is the value at the given valid index[m
[31m-and <code>v</code> is the value at the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops the value from the stack.[m
[31m-The assignment is raw;[m
[31m-that is, it does not invoke metamethods.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Reader"><code>lua_Reader</code></a></h3>[m
[31m-<pre>typedef const char * (*lua_Reader) (lua_State *L,[m
[31m-                                    void *data,[m
[31m-                                    size_t *size);</pre>[m
[31m-[m
[31m-<p>[m
[31m-The reader function used by <a href="#lua_load"><code>lua_load</code></a>.[m
[31m-Every time it needs another piece of the chunk,[m
[31m-<a href="#lua_load"><code>lua_load</code></a> calls the reader,[m
[31m-passing along its <code>data</code> parameter.[m
[31m-The reader must return a pointer to a block of memory[m
[31m-with a new piece of the chunk[m
[31m-and set <code>size</code> to the block size.[m
[31m-The block must exist until the reader function is called again.[m
[31m-To signal the end of the chunk,[m
[31m-the reader must return <code>NULL</code> or set <code>size</code> to zero.[m
[31m-The reader function may return pieces of any size greater than zero.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_register"><code>lua_register</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>e</em>]</span>[m
[31m-<pre>void lua_register (lua_State *L,[m
[31m-                   const char *name,[m
[31m-                   lua_CFunction f);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets the C function <code>f</code> as the new value of global <code>name</code>.[m
[31m-It is defined as a macro:[m
[31m-[m
[31m-<pre>[m
[31m-     #define lua_register(L,n,f) \[m
[31m-            (lua_pushcfunction(L, f), lua_setglobal(L, n))[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_remove"><code>lua_remove</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_remove (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Removes the element at the given valid index,[m
[31m-shifting down the elements above this index to fill the gap.[m
[31m-Cannot be called with a pseudo-index,[m
[31m-because a pseudo-index is not an actual stack position.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_replace"><code>lua_replace</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_replace (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Moves the top element into the given position (and pops it),[m
[31m-without shifting any element[m
[31m-(therefore replacing the value at the given position).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_resume"><code>lua_resume</code></a></h3><p>[m
[31m-<span class="apii">[-?, +?, <em>-</em>]</span>[m
[31m-<pre>int lua_resume (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Starts and resumes a coroutine in a given thread.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To start a coroutine, you first create a new thread[m
[31m-(see <a href="#lua_newthread"><code>lua_newthread</code></a>);[m
[31m-then you push onto its stack the main function plus any arguments;[m
[31m-then you call <a href="#lua_resume"><code>lua_resume</code></a>,[m
[31m-with <code>narg</code> being the number of arguments.[m
[31m-This call returns when the coroutine suspends or finishes its execution.[m
[31m-When it returns, the stack contains all values passed to <a href="#lua_yield"><code>lua_yield</code></a>,[m
[31m-or all values returned by the body function.[m
[31m-<a href="#lua_resume"><code>lua_resume</code></a> returns[m
[31m-<a href="#pdf-LUA_YIELD"><code>LUA_YIELD</code></a> if the coroutine yields,[m
[31m-0 if the coroutine finishes its execution[m
[31m-without errors,[m
[31m-or an error code in case of errors (see <a href="#lua_pcall"><code>lua_pcall</code></a>).[m
[31m-In case of errors,[m
[31m-the stack is not unwound,[m
[31m-so you can use the debug API over it.[m
[31m-The error message is on the top of the stack.[m
[31m-To restart a coroutine, you put on its stack only the values to[m
[31m-be passed as results from <code>yield</code>,[m
[31m-and then call <a href="#lua_resume"><code>lua_resume</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setallocf"><code>lua_setallocf</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Changes the allocator function of a given state to <code>f</code>[m
[31m-with user data <code>ud</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setfenv"><code>lua_setfenv</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_setfenv (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops a table from the stack and sets it as[m
[31m-the new environment for the value at the given index.[m
[31m-If the value at the given index is[m
[31m-neither a function nor a thread nor a userdata,[m
[31m-<a href="#lua_setfenv"><code>lua_setfenv</code></a> returns 0.[m
[31m-Otherwise it returns 1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setfield"><code>lua_setfield</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>e</em>]</span>[m
[31m-<pre>void lua_setfield (lua_State *L, int index, const char *k);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Does the equivalent to <code>t[k] = v</code>,[m
[31m-where <code>t</code> is the value at the given valid index[m
[31m-and <code>v</code> is the value at the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops the value from the stack.[m
[31m-As in Lua, this function may trigger a metamethod[m
[31m-for the "newindex" event (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setglobal"><code>lua_setglobal</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>e</em>]</span>[m
[31m-<pre>void lua_setglobal (lua_State *L, const char *name);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops a value from the stack and[m
[31m-sets it as the new value of global <code>name</code>.[m
[31m-It is defined as a macro:[m
[31m-[m
[31m-<pre>[m
[31m-     #define lua_setglobal(L,s)   lua_setfield(L, LUA_GLOBALSINDEX, s)[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setmetatable"><code>lua_setmetatable</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_setmetatable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pops a table from the stack and[m
[31m-sets it as the new metatable for the value at the given[m
[31m-acceptable index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_settable"><code>lua_settable</code></a></h3><p>[m
[31m-<span class="apii">[-2, +0, <em>e</em>]</span>[m
[31m-<pre>void lua_settable (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Does the equivalent to <code>t[k] = v</code>,[m
[31m-where <code>t</code> is the value at the given valid index,[m
[31m-<code>v</code> is the value at the top of the stack,[m
[31m-and <code>k</code> is the value just below the top.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops both the key and the value from the stack.[m
[31m-As in Lua, this function may trigger a metamethod[m
[31m-for the "newindex" event (see <a href="#2.8">&sect;2.8</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_settop"><code>lua_settop</code></a></h3><p>[m
[31m-<span class="apii">[-?, +?, <em>-</em>]</span>[m
[31m-<pre>void lua_settop (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Accepts any acceptable index, or&nbsp;0,[m
[31m-and sets the stack top to this index.[m
[31m-If the new top is larger than the old one,[m
[31m-then the new elements are filled with <b>nil</b>.[m
[31m-If <code>index</code> is&nbsp;0, then all stack elements are removed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_State"><code>lua_State</code></a></h3>[m
[31m-<pre>typedef struct lua_State lua_State;</pre>[m
[31m-[m
[31m-<p>[m
[31m-Opaque structure that keeps the whole state of a Lua interpreter.[m
[31m-The Lua library is fully reentrant:[m
[31m-it has no global variables.[m
[31m-All information about a state is kept in this structure.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A pointer to this state must be passed as the first argument to[m
[31m-every function in the library, except to <a href="#lua_newstate"><code>lua_newstate</code></a>,[m
[31m-which creates a Lua state from scratch.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_status"><code>lua_status</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_status (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the status of the thread <code>L</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The status can be 0 for a normal thread,[m
[31m-an error code if the thread finished its execution with an error,[m
[31m-or <a name="pdf-LUA_YIELD"><code>LUA_YIELD</code></a> if the thread is suspended.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_toboolean"><code>lua_toboolean</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_toboolean (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the Lua value at the given acceptable index to a C&nbsp;boolean[m
[31m-value (0&nbsp;or&nbsp;1).[m
[31m-Like all tests in Lua,[m
[31m-<a href="#lua_toboolean"><code>lua_toboolean</code></a> returns 1 for any Lua value[m
[31m-different from <b>false</b> and <b>nil</b>;[m
[31m-otherwise it returns 0.[m
[31m-It also returns 0 when called with a non-valid index.[m
[31m-(If you want to accept only actual boolean values,[m
[31m-use <a href="#lua_isboolean"><code>lua_isboolean</code></a> to test the value's type.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tocfunction"><code>lua_tocfunction</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_CFunction lua_tocfunction (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts a value at the given acceptable index to a C&nbsp;function.[m
[31m-That value must be a C&nbsp;function;[m
[31m-otherwise, returns <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tointeger"><code>lua_tointeger</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_Integer lua_tointeger (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the Lua value at the given acceptable index[m
[31m-to the signed integral type <a href="#lua_Integer"><code>lua_Integer</code></a>.[m
[31m-The Lua value must be a number or a string convertible to a number[m
[31m-(see <a href="#2.2.1">&sect;2.2.1</a>);[m
[31m-otherwise, <a href="#lua_tointeger"><code>lua_tointeger</code></a> returns&nbsp;0.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the number is not an integer,[m
[31m-it is truncated in some non-specified way.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tolstring"><code>lua_tolstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>const char *lua_tolstring (lua_State *L, int index, size_t *len);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the Lua value at the given acceptable index to a C&nbsp;string.[m
[31m-If <code>len</code> is not <code>NULL</code>,[m
[31m-it also sets <code>*len</code> with the string length.[m
[31m-The Lua value must be a string or a number;[m
[31m-otherwise, the function returns <code>NULL</code>.[m
[31m-If the value is a number,[m
[31m-then <a href="#lua_tolstring"><code>lua_tolstring</code></a> also[m
[31m-<em>changes the actual value in the stack to a string</em>.[m
[31m-(This change confuses <a href="#lua_next"><code>lua_next</code></a>[m
[31m-when <a href="#lua_tolstring"><code>lua_tolstring</code></a> is applied to keys during a table traversal.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<a href="#lua_tolstring"><code>lua_tolstring</code></a> returns a fully aligned pointer[m
[31m-to a string inside the Lua state.[m
[31m-This string always has a zero ('<code>\0</code>')[m
[31m-after its last character (as in&nbsp;C),[m
[31m-but can contain other zeros in its body.[m
[31m-Because Lua has garbage collection,[m
[31m-there is no guarantee that the pointer returned by <a href="#lua_tolstring"><code>lua_tolstring</code></a>[m
[31m-will be valid after the corresponding value is removed from the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tonumber"><code>lua_tonumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_Number lua_tonumber (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the Lua value at the given acceptable index[m
[31m-to the C&nbsp;type <a href="#lua_Number"><code>lua_Number</code></a> (see <a href="#lua_Number"><code>lua_Number</code></a>).[m
[31m-The Lua value must be a number or a string convertible to a number[m
[31m-(see <a href="#2.2.1">&sect;2.2.1</a>);[m
[31m-otherwise, <a href="#lua_tonumber"><code>lua_tonumber</code></a> returns&nbsp;0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_topointer"><code>lua_topointer</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>const void *lua_topointer (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the value at the given acceptable index to a generic[m
[31m-C&nbsp;pointer (<code>void*</code>).[m
[31m-The value can be a userdata, a table, a thread, or a function;[m
[31m-otherwise, <a href="#lua_topointer"><code>lua_topointer</code></a> returns <code>NULL</code>.[m
[31m-Different objects will give different pointers.[m
[31m-There is no way to convert the pointer back to its original value.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Typically this function is used only for debug information.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tostring"><code>lua_tostring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>const char *lua_tostring (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <a href="#lua_tolstring"><code>lua_tolstring</code></a> with <code>len</code> equal to <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_tothread"><code>lua_tothread</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_State *lua_tothread (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Converts the value at the given acceptable index to a Lua thread[m
[31m-(represented as <code>lua_State*</code>).[m
[31m-This value must be a thread;[m
[31m-otherwise, the function returns <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_touserdata"><code>lua_touserdata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void *lua_touserdata (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the value at the given acceptable index is a full userdata,[m
[31m-returns its block address.[m
[31m-If the value is a light userdata,[m
[31m-returns its pointer.[m
[31m-Otherwise, returns <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_type"><code>lua_type</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_type (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the type of the value in the given acceptable index,[m
[31m-or <code>LUA_TNONE</code> for a non-valid index[m
[31m-(that is, an index to an "empty" stack position).[m
[31m-The types returned by <a href="#lua_type"><code>lua_type</code></a> are coded by the following constants[m
[31m-defined in <code>lua.h</code>:[m
[31m-<code>LUA_TNIL</code>,[m
[31m-<code>LUA_TNUMBER</code>,[m
[31m-<code>LUA_TBOOLEAN</code>,[m
[31m-<code>LUA_TSTRING</code>,[m
[31m-<code>LUA_TTABLE</code>,[m
[31m-<code>LUA_TFUNCTION</code>,[m
[31m-<code>LUA_TUSERDATA</code>,[m
[31m-<code>LUA_TTHREAD</code>,[m
[31m-and[m
[31m-<code>LUA_TLIGHTUSERDATA</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_typename"><code>lua_typename</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>const char *lua_typename  (lua_State *L, int tp);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the name of the type encoded by the value <code>tp</code>,[m
[31m-which must be one the values returned by <a href="#lua_type"><code>lua_type</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Writer"><code>lua_Writer</code></a></h3>[m
[31m-<pre>typedef int (*lua_Writer) (lua_State *L,[m
[31m-                           const void* p,[m
[31m-                           size_t sz,[m
[31m-                           void* ud);</pre>[m
[31m-[m
[31m-<p>[m
[31m-The type of the writer function used by <a href="#lua_dump"><code>lua_dump</code></a>.[m
[31m-Every time it produces another piece of chunk,[m
[31m-<a href="#lua_dump"><code>lua_dump</code></a> calls the writer,[m
[31m-passing along the buffer to be written (<code>p</code>),[m
[31m-its size (<code>sz</code>),[m
[31m-and the <code>data</code> parameter supplied to <a href="#lua_dump"><code>lua_dump</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The writer returns an error code:[m
[31m-0&nbsp;means no errors;[m
[31m-any other value means an error and stops <a href="#lua_dump"><code>lua_dump</code></a> from[m
[31m-calling the writer again.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_xmove"><code>lua_xmove</code></a></h3><p>[m
[31m-<span class="apii">[-?, +?, <em>-</em>]</span>[m
[31m-<pre>void lua_xmove (lua_State *from, lua_State *to, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Exchange values between different threads of the <em>same</em> global state.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function pops <code>n</code> values from the stack <code>from</code>,[m
[31m-and pushes them onto the stack <code>to</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_yield"><code>lua_yield</code></a></h3><p>[m
[31m-<span class="apii">[-?, +?, <em>-</em>]</span>[m
[31m-<pre>int lua_yield  (lua_State *L, int nresults);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Yields a coroutine.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function should only be called as the[m
[31m-return expression of a C&nbsp;function, as follows:[m
[31m-[m
[31m-<pre>[m
[31m-     return lua_yield (L, nresults);[m
[31m-</pre><p>[m
[31m-When a C&nbsp;function calls <a href="#lua_yield"><code>lua_yield</code></a> in that way,[m
[31m-the running coroutine suspends its execution,[m
[31m-and the call to <a href="#lua_resume"><code>lua_resume</code></a> that started this coroutine returns.[m
[31m-The parameter <code>nresults</code> is the number of values from the stack[m
[31m-that are passed as results to <a href="#lua_resume"><code>lua_resume</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>3.8 - <a name="3.8">The Debug Interface</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Lua has no built-in debugging facilities.[m
[31m-Instead, it offers a special interface[m
[31m-by means of functions and <em>hooks</em>.[m
[31m-This interface allows the construction of different[m
[31m-kinds of debuggers, profilers, and other tools[m
[31m-that need "inside information" from the interpreter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Debug"><code>lua_Debug</code></a></h3>[m
[31m-<pre>typedef struct lua_Debug {[m
[31m-  int event;[m
[31m-  const char *name;           /* (n) */[m
[31m-  const char *namewhat;       /* (n) */[m
[31m-  const char *what;           /* (S) */[m
[31m-  const char *source;         /* (S) */[m
[31m-  int currentline;            /* (l) */[m
[31m-  int nups;                   /* (u) number of upvalues */[m
[31m-  int linedefined;            /* (S) */[m
[31m-  int lastlinedefined;        /* (S) */[m
[31m-  char short_src[LUA_IDSIZE]; /* (S) */[m
[31m-  /* private part */[m
[31m-  <em>other fields</em>[m
[31m-} lua_Debug;</pre>[m
[31m-[m
[31m-<p>[m
[31m-A structure used to carry different pieces of[m
[31m-information about an active function.[m
[31m-<a href="#lua_getstack"><code>lua_getstack</code></a> fills only the private part[m
[31m-of this structure, for later use.[m
[31m-To fill the other fields of <a href="#lua_Debug"><code>lua_Debug</code></a> with useful information,[m
[31m-call <a href="#lua_getinfo"><code>lua_getinfo</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The fields of <a href="#lua_Debug"><code>lua_Debug</code></a> have the following meaning:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b><code>source</code>:</b>[m
[31m-If the function was defined in a string,[m
[31m-then <code>source</code> is that string.[m
[31m-If the function was defined in a file,[m
[31m-then <code>source</code> starts with a '<code>@</code>' followed by the file name.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>short_src</code>:</b>[m
[31m-a "printable" version of <code>source</code>, to be used in error messages.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>linedefined</code>:</b>[m
[31m-the line number where the definition of the function starts.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>lastlinedefined</code>:</b>[m
[31m-the line number where the definition of the function ends.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>what</code>:</b>[m
[31m-the string <code>"Lua"</code> if the function is a Lua function,[m
[31m-<code>"C"</code> if it is a C&nbsp;function,[m
[31m-<code>"main"</code> if it is the main part of a chunk,[m
[31m-and <code>"tail"</code> if it was a function that did a tail call.[m
[31m-In the latter case,[m
[31m-Lua has no other information about the function.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>currentline</code>:</b>[m
[31m-the current line where the given function is executing.[m
[31m-When no line information is available,[m
[31m-<code>currentline</code> is set to -1.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>name</code>:</b>[m
[31m-a reasonable name for the given function.[m
[31m-Because functions in Lua are first-class values,[m
[31m-they do not have a fixed name:[m
[31m-some functions can be the value of multiple global variables,[m
[31m-while others can be stored only in a table field.[m
[31m-The <code>lua_getinfo</code> function checks how the function was[m
[31m-called to find a suitable name.[m
[31m-If it cannot find a name,[m
[31m-then <code>name</code> is set to <code>NULL</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>namewhat</code>:</b>[m
[31m-explains the <code>name</code> field.[m
[31m-The value of <code>namewhat</code> can be[m
[31m-<code>"global"</code>, <code>"local"</code>, <code>"method"</code>,[m
[31m-<code>"field"</code>, <code>"upvalue"</code>, or <code>""</code> (the empty string),[m
[31m-according to how the function was called.[m
[31m-(Lua uses the empty string when no other option seems to apply.)[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>nups</code>:</b>[m
[31m-the number of upvalues of the function.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gethook"><code>lua_gethook</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_Hook lua_gethook (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the current hook function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gethookcount"><code>lua_gethookcount</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_gethookcount (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the current hook count.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_gethookmask"><code>lua_gethookmask</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_gethookmask (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the current hook mask.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getinfo"><code>lua_getinfo</code></a></h3><p>[m
[31m-<span class="apii">[-(0|1), +(0|1|2), <em>m</em>]</span>[m
[31m-<pre>int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns information about a specific function or function invocation.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To get information about a function invocation,[m
[31m-the parameter <code>ar</code> must be a valid activation record that was[m
[31m-filled by a previous call to <a href="#lua_getstack"><code>lua_getstack</code></a> or[m
[31m-given as argument to a hook (see <a href="#lua_Hook"><code>lua_Hook</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To get information about a function you push it onto the stack[m
[31m-and start the <code>what</code> string with the character '<code>&gt;</code>'.[m
[31m-(In that case,[m
[31m-<code>lua_getinfo</code> pops the function in the top of the stack.)[m
[31m-For instance, to know in which line a function <code>f</code> was defined,[m
[31m-you can write the following code:[m
[31m-[m
[31m-<pre>[m
[31m-     lua_Debug ar;[m
[31m-     lua_getfield(L, LUA_GLOBALSINDEX, "f");  /* get global 'f' */[m
[31m-     lua_getinfo(L, "&gt;S", &amp;ar);[m
[31m-     printf("%d\n", ar.linedefined);[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-Each character in the string <code>what</code>[m
[31m-selects some fields of the structure <code>ar</code> to be filled or[m
[31m-a value to be pushed on the stack:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>'<code>n</code>':</b> fills in the field <code>name</code> and <code>namewhat</code>;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>S</code>':</b>[m
[31m-fills in the fields <code>source</code>, <code>short_src</code>,[m
[31m-<code>linedefined</code>, <code>lastlinedefined</code>, and <code>what</code>;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>l</code>':</b> fills in the field <code>currentline</code>;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>u</code>':</b> fills in the field <code>nups</code>;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>f</code>':</b>[m
[31m-pushes onto the stack the function that is[m
[31m-running at the given level;[m
[31m-</li>[m
[31m-[m
[31m-<li><b>'<code>L</code>':</b>[m
[31m-pushes onto the stack a table whose indices are the[m
[31m-numbers of the lines that are valid on the function.[m
[31m-(A <em>valid line</em> is a line with some associated code,[m
[31m-that is, a line where you can put a break point.[m
[31m-Non-valid lines include empty lines and comments.)[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-This function returns 0 on error[m
[31m-(for instance, an invalid option in <code>what</code>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getlocal"><code>lua_getlocal</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>-</em>]</span>[m
[31m-<pre>const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Gets information about a local variable of a given activation record.[m
[31m-The parameter <code>ar</code> must be a valid activation record that was[m
[31m-filled by a previous call to <a href="#lua_getstack"><code>lua_getstack</code></a> or[m
[31m-given as argument to a hook (see <a href="#lua_Hook"><code>lua_Hook</code></a>).[m
[31m-The index <code>n</code> selects which local variable to inspect[m
[31m-(1 is the first parameter or active local variable, and so on,[m
[31m-until the last active local variable).[m
[31m-<a href="#lua_getlocal"><code>lua_getlocal</code></a> pushes the variable's value onto the stack[m
[31m-and returns its name.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Variable names starting with '<code>(</code>' (open parentheses)[m
[31m-represent internal variables[m
[31m-(loop control variables, temporaries, and C&nbsp;function locals).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>NULL</code> (and pushes nothing)[m
[31m-when the index is greater than[m
[31m-the number of active local variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getstack"><code>lua_getstack</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_getstack (lua_State *L, int level, lua_Debug *ar);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Get information about the interpreter runtime stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function fills parts of a <a href="#lua_Debug"><code>lua_Debug</code></a> structure with[m
[31m-an identification of the <em>activation record</em>[m
[31m-of the function executing at a given level.[m
[31m-Level&nbsp;0 is the current running function,[m
[31m-whereas level <em>n+1</em> is the function that has called level <em>n</em>.[m
[31m-When there are no errors, <a href="#lua_getstack"><code>lua_getstack</code></a> returns 1;[m
[31m-when called with a level greater than the stack depth,[m
[31m-it returns 0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_getupvalue"><code>lua_getupvalue</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>-</em>]</span>[m
[31m-<pre>const char *lua_getupvalue (lua_State *L, int funcindex, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Gets information about a closure's upvalue.[m
[31m-(For Lua functions,[m
[31m-upvalues are the external local variables that the function uses,[m
[31m-and that are consequently included in its closure.)[m
[31m-<a href="#lua_getupvalue"><code>lua_getupvalue</code></a> gets the index <code>n</code> of an upvalue,[m
[31m-pushes the upvalue's value onto the stack,[m
[31m-and returns its name.[m
[31m-<code>funcindex</code> points to the closure in the stack.[m
[31m-(Upvalues have no particular order,[m
[31m-as they are active through the whole function.[m
[31m-So, they are numbered in an arbitrary order.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>NULL</code> (and pushes nothing)[m
[31m-when the index is greater than the number of upvalues.[m
[31m-For C&nbsp;functions, this function uses the empty string <code>""</code>[m
[31m-as a name for all upvalues.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_Hook"><code>lua_Hook</code></a></h3>[m
[31m-<pre>typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Type for debugging hook functions.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Whenever a hook is called, its <code>ar</code> argument has its field[m
[31m-<code>event</code> set to the specific event that triggered the hook.[m
[31m-Lua identifies these events with the following constants:[m
[31m-<a name="pdf-LUA_HOOKCALL"><code>LUA_HOOKCALL</code></a>, <a name="pdf-LUA_HOOKRET"><code>LUA_HOOKRET</code></a>,[m
[31m-<a name="pdf-LUA_HOOKTAILRET"><code>LUA_HOOKTAILRET</code></a>, <a name="pdf-LUA_HOOKLINE"><code>LUA_HOOKLINE</code></a>,[m
[31m-and <a name="pdf-LUA_HOOKCOUNT"><code>LUA_HOOKCOUNT</code></a>.[m
[31m-Moreover, for line events, the field <code>currentline</code> is also set.[m
[31m-To get the value of any other field in <code>ar</code>,[m
[31m-the hook must call <a href="#lua_getinfo"><code>lua_getinfo</code></a>.[m
[31m-For return events, <code>event</code> can be <code>LUA_HOOKRET</code>,[m
[31m-the normal value, or <code>LUA_HOOKTAILRET</code>.[m
[31m-In the latter case, Lua is simulating a return from[m
[31m-a function that did a tail call;[m
[31m-in this case, it is useless to call <a href="#lua_getinfo"><code>lua_getinfo</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-While Lua is running a hook, it disables other calls to hooks.[m
[31m-Therefore, if a hook calls back Lua to execute a function or a chunk,[m
[31m-this execution occurs without any calls to hooks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_sethook"><code>lua_sethook</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets the debugging hook function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Argument <code>f</code> is the hook function.[m
[31m-<code>mask</code> specifies on which events the hook will be called:[m
[31m-it is formed by a bitwise or of the constants[m
[31m-<a name="pdf-LUA_MASKCALL"><code>LUA_MASKCALL</code></a>,[m
[31m-<a name="pdf-LUA_MASKRET"><code>LUA_MASKRET</code></a>,[m
[31m-<a name="pdf-LUA_MASKLINE"><code>LUA_MASKLINE</code></a>,[m
[31m-and <a name="pdf-LUA_MASKCOUNT"><code>LUA_MASKCOUNT</code></a>.[m
[31m-The <code>count</code> argument is only meaningful when the mask[m
[31m-includes <code>LUA_MASKCOUNT</code>.[m
[31m-For each event, the hook is called as explained below:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>The call hook:</b> is called when the interpreter calls a function.[m
[31m-The hook is called just after Lua enters the new function,[m
[31m-before the function gets its arguments.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>The return hook:</b> is called when the interpreter returns from a function.[m
[31m-The hook is called just before Lua leaves the function.[m
[31m-You have no access to the values to be returned by the function.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>The line hook:</b> is called when the interpreter is about to[m
[31m-start the execution of a new line of code,[m
[31m-or when it jumps back in the code (even to the same line).[m
[31m-(This event only happens while Lua is executing a Lua function.)[m
[31m-</li>[m
[31m-[m
[31m-<li><b>The count hook:</b> is called after the interpreter executes every[m
[31m-<code>count</code> instructions.[m
[31m-(This event only happens while Lua is executing a Lua function.)[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-A hook is disabled by setting <code>mask</code> to zero.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setlocal"><code>lua_setlocal</code></a></h3><p>[m
[31m-<span class="apii">[-(0|1), +0, <em>-</em>]</span>[m
[31m-<pre>const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets the value of a local variable of a given activation record.[m
[31m-Parameters <code>ar</code> and <code>n</code> are as in <a href="#lua_getlocal"><code>lua_getlocal</code></a>[m
[31m-(see <a href="#lua_getlocal"><code>lua_getlocal</code></a>).[m
[31m-<a href="#lua_setlocal"><code>lua_setlocal</code></a> assigns the value at the top of the stack[m
[31m-to the variable and returns its name.[m
[31m-It also pops the value from the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>NULL</code> (and pops nothing)[m
[31m-when the index is greater than[m
[31m-the number of active local variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="lua_setupvalue"><code>lua_setupvalue</code></a></h3><p>[m
[31m-<span class="apii">[-(0|1), +0, <em>-</em>]</span>[m
[31m-<pre>const char *lua_setupvalue (lua_State *L, int funcindex, int n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Sets the value of a closure's upvalue.[m
[31m-It assigns the value at the top of the stack[m
[31m-to the upvalue and returns its name.[m
[31m-It also pops the value from the stack.[m
[31m-Parameters <code>funcindex</code> and <code>n</code> are as in the <a href="#lua_getupvalue"><code>lua_getupvalue</code></a>[m
[31m-(see <a href="#lua_getupvalue"><code>lua_getupvalue</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>NULL</code> (and pops nothing)[m
[31m-when the index is greater than the number of upvalues.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>4 - <a name="4">The Auxiliary Library</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-The <em>auxiliary library</em> provides several convenient functions[m
[31m-to interface C with Lua.[m
[31m-While the basic API provides the primitive functions for all [m
[31m-interactions between C and Lua,[m
[31m-the auxiliary library provides higher-level functions for some[m
[31m-common tasks.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All functions from the auxiliary library[m
[31m-are defined in header file <code>lauxlib.h</code> and[m
[31m-have a prefix <code>luaL_</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All functions in the auxiliary library are built on[m
[31m-top of the basic API,[m
[31m-and so they provide nothing that cannot be done with this API.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Several functions in the auxiliary library are used to[m
[31m-check C&nbsp;function arguments.[m
[31m-Their names are always <code>luaL_check*</code> or <code>luaL_opt*</code>.[m
[31m-All of these functions throw an error if the check is not satisfied.[m
[31m-Because the error message is formatted for arguments[m
[31m-(e.g., "<code>bad argument #1</code>"),[m
[31m-you should not use these functions for other stack values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>4.1 - <a name="4.1">Functions and Types</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-Here we list all functions and types from the auxiliary library[m
[31m-in alphabetical order.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addchar"><code>luaL_addchar</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addchar (luaL_Buffer *B, char c);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds the character <code>c</code> to the buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addlstring"><code>luaL_addlstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds the string pointed to by <code>s</code> with length <code>l</code> to[m
[31m-the buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-The string may contain embedded zeros.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addsize"><code>luaL_addsize</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addsize (luaL_Buffer *B, size_t n);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds to the buffer <code>B</code> (see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>)[m
[31m-a string of length <code>n</code> previously copied to the[m
[31m-buffer area (see <a href="#luaL_prepbuffer"><code>luaL_prepbuffer</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addstring"><code>luaL_addstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addstring (luaL_Buffer *B, const char *s);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds the zero-terminated string pointed to by <code>s</code>[m
[31m-to the buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-The string may not contain embedded zeros.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_addvalue"><code>luaL_addvalue</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_addvalue (luaL_Buffer *B);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Adds the value at the top of the stack[m
[31m-to the buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-Pops the value.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This is the only function on string buffers that can (and must)[m
[31m-be called with an extra element on the stack,[m
[31m-which is the value to be added to the buffer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_argcheck"><code>luaL_argcheck</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void luaL_argcheck (lua_State *L,[m
[31m-                    int cond,[m
[31m-                    int narg,[m
[31m-                    const char *extramsg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether <code>cond</code> is true.[m
[31m-If not, raises an error with the following message,[m
[31m-where <code>func</code> is retrieved from the call stack:[m
[31m-[m
[31m-<pre>[m
[31m-     bad argument #&lt;narg&gt; to &lt;func&gt; (&lt;extramsg&gt;)[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_argerror"><code>luaL_argerror</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_argerror (lua_State *L, int narg, const char *extramsg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Raises an error with the following message,[m
[31m-where <code>func</code> is retrieved from the call stack:[m
[31m-[m
[31m-<pre>[m
[31m-     bad argument #&lt;narg&gt; to &lt;func&gt; (&lt;extramsg&gt;)[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-This function never returns,[m
[31m-but it is an idiom to use it in C&nbsp;functions[m
[31m-as <code>return luaL_argerror(<em>args</em>)</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_Buffer"><code>luaL_Buffer</code></a></h3>[m
[31m-<pre>typedef struct luaL_Buffer luaL_Buffer;</pre>[m
[31m-[m
[31m-<p>[m
[31m-Type for a <em>string buffer</em>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A string buffer allows C&nbsp;code to build Lua strings piecemeal.[m
[31m-Its pattern of use is as follows:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>First you declare a variable <code>b</code> of type <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>.</li>[m
[31m-[m
[31m-<li>Then you initialize it with a call <code>luaL_buffinit(L, &amp;b)</code>.</li>[m
[31m-[m
[31m-<li>[m
[31m-Then you add string pieces to the buffer calling any of[m
[31m-the <code>luaL_add*</code> functions.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-You finish by calling <code>luaL_pushresult(&amp;b)</code>.[m
[31m-This call leaves the final string on the top of the stack.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-<p>[m
[31m-During its normal operation,[m
[31m-a string buffer uses a variable number of stack slots.[m
[31m-So, while using a buffer, you cannot assume that you know where[m
[31m-the top of the stack is.[m
[31m-You can use the stack between successive calls to buffer operations[m
[31m-as long as that use is balanced;[m
[31m-that is,[m
[31m-when you call a buffer operation,[m
[31m-the stack is at the same level[m
[31m-it was immediately after the previous buffer operation.[m
[31m-(The only exception to this rule is <a href="#luaL_addvalue"><code>luaL_addvalue</code></a>.)[m
[31m-After calling <a href="#luaL_pushresult"><code>luaL_pushresult</code></a> the stack is back to its[m
[31m-level when the buffer was initialized,[m
[31m-plus the final string on its top.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_buffinit"><code>luaL_buffinit</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void luaL_buffinit (lua_State *L, luaL_Buffer *B);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Initializes a buffer <code>B</code>.[m
[31m-This function does not allocate any space;[m
[31m-the buffer must be declared as a variable[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_callmeta"><code>luaL_callmeta</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>e</em>]</span>[m
[31m-<pre>int luaL_callmeta (lua_State *L, int obj, const char *e);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Calls a metamethod.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the object at index <code>obj</code> has a metatable and this[m
[31m-metatable has a field <code>e</code>,[m
[31m-this function calls this field and passes the object as its only argument.[m
[31m-In this case this function returns 1 and pushes onto the[m
[31m-stack the value returned by the call.[m
[31m-If there is no metatable or no metamethod,[m
[31m-this function returns 0 (without pushing any value on the stack).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkany"><code>luaL_checkany</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void luaL_checkany (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function has an argument[m
[31m-of any type (including <b>nil</b>) at position <code>narg</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkint"><code>luaL_checkint</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_checkint (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a number[m
[31m-and returns this number cast to an <code>int</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkinteger"><code>luaL_checkinteger</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>lua_Integer luaL_checkinteger (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a number[m
[31m-and returns this number cast to a <a href="#lua_Integer"><code>lua_Integer</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checklong"><code>luaL_checklong</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>long luaL_checklong (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a number[m
[31m-and returns this number cast to a <code>long</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checklstring"><code>luaL_checklstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>const char *luaL_checklstring (lua_State *L, int narg, size_t *l);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a string[m
[31m-and returns this string;[m
[31m-if <code>l</code> is not <code>NULL</code> fills <code>*l</code>[m
[31m-with the string's length.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function uses <a href="#lua_tolstring"><code>lua_tolstring</code></a> to get its result,[m
[31m-so all conversions and caveats of that function apply here.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checknumber"><code>luaL_checknumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>lua_Number luaL_checknumber (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a number[m
[31m-and returns this number.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkoption"><code>luaL_checkoption</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_checkoption (lua_State *L,[m
[31m-                      int narg,[m
[31m-                      const char *def,[m
[31m-                      const char *const lst[]);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a string and[m
[31m-searches for this string in the array <code>lst</code>[m
[31m-(which must be NULL-terminated).[m
[31m-Returns the index in the array where the string was found.[m
[31m-Raises an error if the argument is not a string or[m
[31m-if the string cannot be found.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>def</code> is not <code>NULL</code>,[m
[31m-the function uses <code>def</code> as a default value when[m
[31m-there is no argument <code>narg</code> or if this argument is <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This is a useful function for mapping strings to C&nbsp;enums.[m
[31m-(The usual convention in Lua libraries is[m
[31m-to use strings instead of numbers to select options.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkstack"><code>luaL_checkstack</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void luaL_checkstack (lua_State *L, int sz, const char *msg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Grows the stack size to <code>top + sz</code> elements,[m
[31m-raising an error if the stack cannot grow to that size.[m
[31m-<code>msg</code> is an additional text to go into the error message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkstring"><code>luaL_checkstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>const char *luaL_checkstring (lua_State *L, int narg);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a string[m
[31m-and returns this string.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function uses <a href="#lua_tolstring"><code>lua_tolstring</code></a> to get its result,[m
[31m-so all conversions and caveats of that function apply here.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checktype"><code>luaL_checktype</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void luaL_checktype (lua_State *L, int narg, int t);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> has type <code>t</code>.[m
[31m-See <a href="#lua_type"><code>lua_type</code></a> for the encoding of types for <code>t</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_checkudata"><code>luaL_checkudata</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>void *luaL_checkudata (lua_State *L, int narg, const char *tname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Checks whether the function argument <code>narg</code> is a userdata[m
[31m-of the type <code>tname</code> (see <a href="#luaL_newmetatable"><code>luaL_newmetatable</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_dofile"><code>luaL_dofile</code></a></h3><p>[m
[31m-<span class="apii">[-0, +?, <em>m</em>]</span>[m
[31m-<pre>int luaL_dofile (lua_State *L, const char *filename);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads and runs the given file.[m
[31m-It is defined as the following macro:[m
[31m-[m
[31m-<pre>[m
[31m-     (luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-</pre><p>[m
[31m-It returns 0 if there are no errors[m
[31m-or 1 in case of errors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_dostring"><code>luaL_dostring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +?, <em>m</em>]</span>[m
[31m-<pre>int luaL_dostring (lua_State *L, const char *str);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads and runs the given string.[m
[31m-It is defined as the following macro:[m
[31m-[m
[31m-<pre>[m
[31m-     (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-</pre><p>[m
[31m-It returns 0 if there are no errors[m
[31m-or 1 in case of errors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_error"><code>luaL_error</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_error (lua_State *L, const char *fmt, ...);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Raises an error.[m
[31m-The error message format is given by <code>fmt</code>[m
[31m-plus any extra arguments,[m
[31m-following the same rules of <a href="#lua_pushfstring"><code>lua_pushfstring</code></a>.[m
[31m-It also adds at the beginning of the message the file name and[m
[31m-the line number where the error occurred,[m
[31m-if this information is available.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function never returns,[m
[31m-but it is an idiom to use it in C&nbsp;functions[m
[31m-as <code>return luaL_error(<em>args</em>)</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_getmetafield"><code>luaL_getmetafield</code></a></h3><p>[m
[31m-<span class="apii">[-0, +(0|1), <em>m</em>]</span>[m
[31m-<pre>int luaL_getmetafield (lua_State *L, int obj, const char *e);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the field <code>e</code> from the metatable[m
[31m-of the object at index <code>obj</code>.[m
[31m-If the object does not have a metatable,[m
[31m-or if the metatable does not have this field,[m
[31m-returns 0 and pushes nothing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_getmetatable"><code>luaL_getmetatable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>-</em>]</span>[m
[31m-<pre>void luaL_getmetatable (lua_State *L, const char *tname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack the metatable associated with name <code>tname</code>[m
[31m-in the registry (see <a href="#luaL_newmetatable"><code>luaL_newmetatable</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_gsub"><code>luaL_gsub</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>const char *luaL_gsub (lua_State *L,[m
[31m-                       const char *s,[m
[31m-                       const char *p,[m
[31m-                       const char *r);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a copy of string <code>s</code> by replacing[m
[31m-any occurrence of the string <code>p</code>[m
[31m-with the string <code>r</code>.[m
[31m-Pushes the resulting string on the stack and returns it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_loadbuffer"><code>luaL_loadbuffer</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>int luaL_loadbuffer (lua_State *L,[m
[31m-                     const char *buff,[m
[31m-                     size_t sz,[m
[31m-                     const char *name);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads a buffer as a Lua chunk.[m
[31m-This function uses <a href="#lua_load"><code>lua_load</code></a> to load the chunk in the[m
[31m-buffer pointed to by <code>buff</code> with size <code>sz</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the same results as <a href="#lua_load"><code>lua_load</code></a>.[m
[31m-<code>name</code> is the chunk name,[m
[31m-used for debug information and error messages.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_loadfile"><code>luaL_loadfile</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>int luaL_loadfile (lua_State *L, const char *filename);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads a file as a Lua chunk.[m
[31m-This function uses <a href="#lua_load"><code>lua_load</code></a> to load the chunk in the file[m
[31m-named <code>filename</code>.[m
[31m-If <code>filename</code> is <code>NULL</code>,[m
[31m-then it loads from the standard input.[m
[31m-The first line in the file is ignored if it starts with a <code>#</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the same results as <a href="#lua_load"><code>lua_load</code></a>,[m
[31m-but it has an extra error code <a name="pdf-LUA_ERRFILE"><code>LUA_ERRFILE</code></a>[m
[31m-if it cannot open/read the file.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As <a href="#lua_load"><code>lua_load</code></a>, this function only loads the chunk;[m
[31m-it does not run it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_loadstring"><code>luaL_loadstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>int luaL_loadstring (lua_State *L, const char *s);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Loads a string as a Lua chunk.[m
[31m-This function uses <a href="#lua_load"><code>lua_load</code></a> to load the chunk in[m
[31m-the zero-terminated string <code>s</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the same results as <a href="#lua_load"><code>lua_load</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Also as <a href="#lua_load"><code>lua_load</code></a>, this function only loads the chunk;[m
[31m-it does not run it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_newmetatable"><code>luaL_newmetatable</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>int luaL_newmetatable (lua_State *L, const char *tname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the registry already has the key <code>tname</code>,[m
[31m-returns 0.[m
[31m-Otherwise,[m
[31m-creates a new table to be used as a metatable for userdata,[m
[31m-adds it to the registry with key <code>tname</code>,[m
[31m-and returns 1.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In both cases pushes onto the stack the final value associated[m
[31m-with <code>tname</code> in the registry.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_newstate"><code>luaL_newstate</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>lua_State *luaL_newstate (void);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates a new Lua state.[m
[31m-It calls <a href="#lua_newstate"><code>lua_newstate</code></a> with an[m
[31m-allocator based on the standard&nbsp;C <code>realloc</code> function[m
[31m-and then sets a panic function (see <a href="#lua_atpanic"><code>lua_atpanic</code></a>) that prints[m
[31m-an error message to the standard error output in case of fatal[m
[31m-errors.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the new state,[m
[31m-or <code>NULL</code> if there is a memory allocation error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_openlibs"><code>luaL_openlibs</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>m</em>]</span>[m
[31m-<pre>void luaL_openlibs (lua_State *L);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Opens all standard Lua libraries into the given state.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optint"><code>luaL_optint</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_optint (lua_State *L, int narg, int d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a number,[m
[31m-returns this number cast to an <code>int</code>.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optinteger"><code>luaL_optinteger</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>lua_Integer luaL_optinteger (lua_State *L,[m
[31m-                             int narg,[m
[31m-                             lua_Integer d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a number,[m
[31m-returns this number cast to a <a href="#lua_Integer"><code>lua_Integer</code></a>.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optlong"><code>luaL_optlong</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>long luaL_optlong (lua_State *L, int narg, long d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a number,[m
[31m-returns this number cast to a <code>long</code>.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optlstring"><code>luaL_optlstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>const char *luaL_optlstring (lua_State *L,[m
[31m-                             int narg,[m
[31m-                             const char *d,[m
[31m-                             size_t *l);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a string,[m
[31m-returns this string.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>l</code> is not <code>NULL</code>,[m
[31m-fills the position <code>*l</code> with the results's length.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optnumber"><code>luaL_optnumber</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a number,[m
[31m-returns this number.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_optstring"><code>luaL_optstring</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>const char *luaL_optstring (lua_State *L,[m
[31m-                            int narg,[m
[31m-                            const char *d);</pre>[m
[31m-[m
[31m-<p>[m
[31m-If the function argument <code>narg</code> is a string,[m
[31m-returns this string.[m
[31m-If this argument is absent or is <b>nil</b>,[m
[31m-returns <code>d</code>.[m
[31m-Otherwise, raises an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_prepbuffer"><code>luaL_prepbuffer</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>char *luaL_prepbuffer (luaL_Buffer *B);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns an address to a space of size <a name="pdf-LUAL_BUFFERSIZE"><code>LUAL_BUFFERSIZE</code></a>[m
[31m-where you can copy a string to be added to buffer <code>B</code>[m
[31m-(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).[m
[31m-After copying the string into this space you must call[m
[31m-<a href="#luaL_addsize"><code>luaL_addsize</code></a> with the size of the string to actually add [m
[31m-it to the buffer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_pushresult"><code>luaL_pushresult</code></a></h3><p>[m
[31m-<span class="apii">[-?, +1, <em>m</em>]</span>[m
[31m-<pre>void luaL_pushresult (luaL_Buffer *B);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Finishes the use of buffer <code>B</code> leaving the final string on[m
[31m-the top of the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_ref"><code>luaL_ref</code></a></h3><p>[m
[31m-<span class="apii">[-1, +0, <em>m</em>]</span>[m
[31m-<pre>int luaL_ref (lua_State *L, int t);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Creates and returns a <em>reference</em>,[m
[31m-in the table at index <code>t</code>,[m
[31m-for the object at the top of the stack (and pops the object).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A reference is a unique integer key.[m
[31m-As long as you do not manually add integer keys into table <code>t</code>,[m
[31m-<a href="#luaL_ref"><code>luaL_ref</code></a> ensures the uniqueness of the key it returns.[m
[31m-You can retrieve an object referred by reference <code>r</code>[m
[31m-by calling <code>lua_rawgeti(L, t, r)</code>.[m
[31m-Function <a href="#luaL_unref"><code>luaL_unref</code></a> frees a reference and its associated object.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the object at the top of the stack is <b>nil</b>,[m
[31m-<a href="#luaL_ref"><code>luaL_ref</code></a> returns the constant <a name="pdf-LUA_REFNIL"><code>LUA_REFNIL</code></a>.[m
[31m-The constant <a name="pdf-LUA_NOREF"><code>LUA_NOREF</code></a> is guaranteed to be different[m
[31m-from any reference returned by <a href="#luaL_ref"><code>luaL_ref</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_Reg"><code>luaL_Reg</code></a></h3>[m
[31m-<pre>typedef struct luaL_Reg {[m
[31m-  const char *name;[m
[31m-  lua_CFunction func;[m
[31m-} luaL_Reg;</pre>[m
[31m-[m
[31m-<p>[m
[31m-Type for arrays of functions to be registered by[m
[31m-<a href="#luaL_register"><code>luaL_register</code></a>.[m
[31m-<code>name</code> is the function name and <code>func</code> is a pointer to[m
[31m-the function.[m
[31m-Any array of <a href="#luaL_Reg"><code>luaL_Reg</code></a> must end with an sentinel entry[m
[31m-in which both <code>name</code> and <code>func</code> are <code>NULL</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_register"><code>luaL_register</code></a></h3><p>[m
[31m-<span class="apii">[-(0|1), +1, <em>m</em>]</span>[m
[31m-<pre>void luaL_register (lua_State *L,[m
[31m-                    const char *libname,[m
[31m-                    const luaL_Reg *l);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Opens a library.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called with <code>libname</code> equal to <code>NULL</code>,[m
[31m-it simply registers all functions in the list <code>l</code>[m
[31m-(see <a href="#luaL_Reg"><code>luaL_Reg</code></a>) into the table on the top of the stack.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called with a non-null <code>libname</code>,[m
[31m-<code>luaL_register</code> creates a new table <code>t</code>,[m
[31m-sets it as the value of the global variable <code>libname</code>,[m
[31m-sets it as the value of <code>package.loaded[libname]</code>,[m
[31m-and registers on it all functions in the list <code>l</code>.[m
[31m-If there is a table in <code>package.loaded[libname]</code> or in[m
[31m-variable <code>libname</code>,[m
[31m-reuses this table instead of creating a new one.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In any case the function leaves the table[m
[31m-on the top of the stack.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_typename"><code>luaL_typename</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>const char *luaL_typename (lua_State *L, int index);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Returns the name of the type of the value at the given index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_typerror"><code>luaL_typerror</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>v</em>]</span>[m
[31m-<pre>int luaL_typerror (lua_State *L, int narg, const char *tname);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Generates an error with a message like the following:[m
[31m-[m
[31m-<pre>[m
[31m-     <em>location</em>: bad argument <em>narg</em> to '<em>func</em>' (<em>tname</em> expected, got <em>rt</em>)[m
[31m-</pre><p>[m
[31m-where <code><em>location</em></code> is produced by <a href="#luaL_where"><code>luaL_where</code></a>,[m
[31m-<code><em>func</em></code> is the name of the current function,[m
[31m-and <code><em>rt</em></code> is the type name of the actual argument.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_unref"><code>luaL_unref</code></a></h3><p>[m
[31m-<span class="apii">[-0, +0, <em>-</em>]</span>[m
[31m-<pre>void luaL_unref (lua_State *L, int t, int ref);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Releases reference <code>ref</code> from the table at index <code>t</code>[m
[31m-(see <a href="#luaL_ref"><code>luaL_ref</code></a>).[m
[31m-The entry is removed from the table,[m
[31m-so that the referred object can be collected.[m
[31m-The reference <code>ref</code> is also freed to be used again.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>ref</code> is <a href="#pdf-LUA_NOREF"><code>LUA_NOREF</code></a> or <a href="#pdf-LUA_REFNIL"><code>LUA_REFNIL</code></a>,[m
[31m-<a href="#luaL_unref"><code>luaL_unref</code></a> does nothing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<hr><h3><a name="luaL_where"><code>luaL_where</code></a></h3><p>[m
[31m-<span class="apii">[-0, +1, <em>m</em>]</span>[m
[31m-<pre>void luaL_where (lua_State *L, int lvl);</pre>[m
[31m-[m
[31m-<p>[m
[31m-Pushes onto the stack a string identifying the current position[m
[31m-of the control at level <code>lvl</code> in the call stack.[m
[31m-Typically this string has the following format:[m
[31m-[m
[31m-<pre>[m
[31m-     <em>chunkname</em>:<em>currentline</em>:[m
[31m-</pre><p>[m
[31m-Level&nbsp;0 is the running function,[m
[31m-level&nbsp;1 is the function that called the running function,[m
[31m-etc.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is used to build a prefix for error messages.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>5 - <a name="5">Standard Libraries</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-The standard Lua libraries provide useful functions[m
[31m-that are implemented directly through the C&nbsp;API.[m
[31m-Some of these functions provide essential services to the language[m
[31m-(e.g., <a href="#pdf-type"><code>type</code></a> and <a href="#pdf-getmetatable"><code>getmetatable</code></a>);[m
[31m-others provide access to "outside" services (e.g., I/O);[m
[31m-and others could be implemented in Lua itself,[m
[31m-but are quite useful or have critical performance requirements that[m
[31m-deserve an implementation in C (e.g., <a href="#pdf-table.sort"><code>table.sort</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All libraries are implemented through the official C&nbsp;API[m
[31m-and are provided as separate C&nbsp;modules.[m
[31m-Currently, Lua has the following standard libraries:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>basic library, which includes the coroutine sub-library;</li>[m
[31m-[m
[31m-<li>package library;</li>[m
[31m-[m
[31m-<li>string manipulation;</li>[m
[31m-[m
[31m-<li>table manipulation;</li>[m
[31m-[m
[31m-<li>mathematical functions (sin, log, etc.);</li>[m
[31m-[m
[31m-<li>input and output;</li>[m
[31m-[m
[31m-<li>operating system facilities;</li>[m
[31m-[m
[31m-<li>debug facilities.</li>[m
[31m-[m
[31m-</ul><p>[m
[31m-Except for the basic and package libraries,[m
[31m-each library provides all its functions as fields of a global table[m
[31m-or as methods of its objects.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To have access to these libraries,[m
[31m-the C&nbsp;host program should call the <a href="#luaL_openlibs"><code>luaL_openlibs</code></a> function,[m
[31m-which opens all standard libraries.[m
[31m-Alternatively,[m
[31m-it can open them individually by calling[m
[31m-<a name="pdf-luaopen_base"><code>luaopen_base</code></a> (for the basic library),[m
[31m-<a name="pdf-luaopen_package"><code>luaopen_package</code></a> (for the package library),[m
[31m-<a name="pdf-luaopen_string"><code>luaopen_string</code></a> (for the string library),[m
[31m-<a name="pdf-luaopen_table"><code>luaopen_table</code></a> (for the table library),[m
[31m-<a name="pdf-luaopen_math"><code>luaopen_math</code></a> (for the mathematical library),[m
[31m-<a name="pdf-luaopen_io"><code>luaopen_io</code></a> (for the I/O library),[m
[31m-<a name="pdf-luaopen_os"><code>luaopen_os</code></a> (for the Operating System library),[m
[31m-and <a name="pdf-luaopen_debug"><code>luaopen_debug</code></a> (for the debug library).[m
[31m-These functions are declared in <a name="pdf-lualib.h"><code>lualib.h</code></a>[m
[31m-and should not be called directly:[m
[31m-you must call them like any other Lua C&nbsp;function,[m
[31m-e.g., by using <a href="#lua_call"><code>lua_call</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.1 - <a name="5.1">Basic Functions</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The basic library provides some core functions to Lua.[m
[31m-If you do not include this library in your application,[m
[31m-you should check carefully whether you need to provide [m
[31m-implementations for some of its facilities.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-assert"><code>assert (v [, message])</code></a></h3>[m
[31m-Issues an  error when[m
[31m-the value of its argument <code>v</code> is false (i.e., <b>nil</b> or <b>false</b>);[m
[31m-otherwise, returns all its arguments.[m
[31m-<code>message</code> is an error message;[m
[31m-when absent, it defaults to "assertion failed!"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-collectgarbage"><code>collectgarbage ([opt [, arg]])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is a generic interface to the garbage collector.[m
[31m-It performs different functions according to its first argument, <code>opt</code>:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>"collect":</b>[m
[31m-performs a full garbage-collection cycle.[m
[31m-This is the default option.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"stop":</b>[m
[31m-stops the garbage collector.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"restart":</b>[m
[31m-restarts the garbage collector.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"count":</b>[m
[31m-returns the total memory in use by Lua (in Kbytes).[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"step":</b>[m
[31m-performs a garbage-collection step.[m
[31m-The step "size" is controlled by <code>arg</code>[m
[31m-(larger values mean more steps) in a non-specified way.[m
[31m-If you want to control the step size[m
[31m-you must experimentally tune the value of <code>arg</code>.[m
[31m-Returns <b>true</b> if the step finished a collection cycle.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"setpause":</b>[m
[31m-sets <code>arg</code> as the new value for the <em>pause</em> of[m
[31m-the collector (see <a href="#2.10">&sect;2.10</a>).[m
[31m-Returns the previous value for <em>pause</em>.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"setstepmul":</b>[m
[31m-sets <code>arg</code> as the new value for the <em>step multiplier</em> of[m
[31m-the collector (see <a href="#2.10">&sect;2.10</a>).[m
[31m-Returns the previous value for <em>step</em>.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-dofile"><code>dofile ([filename])</code></a></h3>[m
[31m-Opens the named file and executes its contents as a Lua chunk.[m
[31m-When called without arguments,[m
[31m-<code>dofile</code> executes the contents of the standard input (<code>stdin</code>).[m
[31m-Returns all values returned by the chunk.[m
[31m-In case of errors, <code>dofile</code> propagates the error[m
[31m-to its caller (that is, <code>dofile</code> does not run in protected mode).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-error"><code>error (message [, level])</code></a></h3>[m
[31m-Terminates the last protected function called[m
[31m-and returns <code>message</code> as the error message.[m
[31m-Function <code>error</code> never returns.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Usually, <code>error</code> adds some information about the error position[m
[31m-at the beginning of the message.[m
[31m-The <code>level</code> argument specifies how to get the error position.[m
[31m-With level&nbsp;1 (the default), the error position is where the[m
[31m-<code>error</code> function was called.[m
[31m-Level&nbsp;2 points the error to where the function[m
[31m-that called <code>error</code> was called; and so on.[m
[31m-Passing a level&nbsp;0 avoids the addition of error position information[m
[31m-to the message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-_G"><code>_G</code></a></h3>[m
[31m-A global variable (not a function) that[m
[31m-holds the global environment (that is, <code>_G._G = _G</code>).[m
[31m-Lua itself does not use this variable;[m
[31m-changing its value does not affect any environment,[m
[31m-nor vice-versa.[m
[31m-(Use <a href="#pdf-setfenv"><code>setfenv</code></a> to change environments.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-getfenv"><code>getfenv ([f])</code></a></h3>[m
[31m-Returns the current environment in use by the function.[m
[31m-<code>f</code> can be a Lua function or a number[m
[31m-that specifies the function at that stack level:[m
[31m-Level&nbsp;1 is the function calling <code>getfenv</code>.[m
[31m-If the given function is not a Lua function,[m
[31m-or if <code>f</code> is 0,[m
[31m-<code>getfenv</code> returns the global environment.[m
[31m-The default for <code>f</code> is 1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-getmetatable"><code>getmetatable (object)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>object</code> does not have a metatable, returns <b>nil</b>.[m
[31m-Otherwise,[m
[31m-if the object's metatable has a <code>"__metatable"</code> field,[m
[31m-returns the associated value.[m
[31m-Otherwise, returns the metatable of the given object.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-ipairs"><code>ipairs (t)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns three values: an iterator function, the table <code>t</code>, and 0,[m
[31m-so that the construction[m
[31m-[m
[31m-<pre>[m
[31m-     for i,v in ipairs(t) do <em>body</em> end[m
[31m-</pre><p>[m
[31m-will iterate over the pairs (<code>1,t[1]</code>), (<code>2,t[2]</code>), &middot;&middot;&middot;,[m
[31m-up to the first integer key absent from the table.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-load"><code>load (func [, chunkname])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Loads a chunk using function <code>func</code> to get its pieces.[m
[31m-Each call to <code>func</code> must return a string that concatenates[m
[31m-with previous results.[m
[31m-A return of an empty string, <b>nil</b>, or no value signals the end of the chunk.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If there are no errors, [m
[31m-returns the compiled chunk as a function;[m
[31m-otherwise, returns <b>nil</b> plus the error message.[m
[31m-The environment of the returned function is the global environment.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<code>chunkname</code> is used as the chunk name for error messages[m
[31m-and debug information.[m
[31m-When absent,[m
[31m-it defaults to "<code>=(load)</code>".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-loadfile"><code>loadfile ([filename])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#pdf-load"><code>load</code></a>,[m
[31m-but gets the chunk from file <code>filename</code>[m
[31m-or from the standard input,[m
[31m-if no file name is given.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-loadstring"><code>loadstring (string [, chunkname])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#pdf-load"><code>load</code></a>,[m
[31m-but gets the chunk from the given string.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To load and run a given string, use the idiom[m
[31m-[m
[31m-<pre>[m
[31m-     assert(loadstring(s))()[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-When absent,[m
[31m-<code>chunkname</code> defaults to the given string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-next"><code>next (table [, index])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Allows a program to traverse all fields of a table.[m
[31m-Its first argument is a table and its second argument[m
[31m-is an index in this table.[m
[31m-<code>next</code> returns the next index of the table[m
[31m-and its associated value.[m
[31m-When called with <b>nil</b> as its second argument,[m
[31m-<code>next</code> returns an initial index[m
[31m-and its associated value.[m
[31m-When called with the last index,[m
[31m-or with <b>nil</b> in an empty table,[m
[31m-<code>next</code> returns <b>nil</b>.[m
[31m-If the second argument is absent, then it is interpreted as <b>nil</b>.[m
[31m-In particular,[m
[31m-you can use <code>next(t)</code> to check whether a table is empty.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The order in which the indices are enumerated is not specified,[m
[31m-<em>even for numeric indices</em>.[m
[31m-(To traverse a table in numeric order,[m
[31m-use a numerical <b>for</b> or the <a href="#pdf-ipairs"><code>ipairs</code></a> function.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The behavior of <code>next</code> is <em>undefined</em> if,[m
[31m-during the traversal,[m
[31m-you assign any value to a non-existent field in the table.[m
[31m-You may however modify existing fields.[m
[31m-In particular, you may clear existing fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-pairs"><code>pairs (t)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns three values: the <a href="#pdf-next"><code>next</code></a> function, the table <code>t</code>, and <b>nil</b>,[m
[31m-so that the construction[m
[31m-[m
[31m-<pre>[m
[31m-     for k,v in pairs(t) do <em>body</em> end[m
[31m-</pre><p>[m
[31m-will iterate over all key&ndash;value pairs of table <code>t</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-See function <a href="#pdf-next"><code>next</code></a> for the caveats of modifying[m
[31m-the table during its traversal.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-pcall"><code>pcall (f, arg1, &middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Calls function <code>f</code> with[m
[31m-the given arguments in <em>protected mode</em>.[m
[31m-This means that any error inside&nbsp;<code>f</code> is not propagated;[m
[31m-instead, <code>pcall</code> catches the error[m
[31m-and returns a status code.[m
[31m-Its first result is the status code (a boolean),[m
[31m-which is true if the call succeeds without errors.[m
[31m-In such case, <code>pcall</code> also returns all results from the call,[m
[31m-after this first result.[m
[31m-In case of any error, <code>pcall</code> returns <b>false</b> plus the error message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-print"><code>print (&middot;&middot;&middot;)</code></a></h3>[m
[31m-Receives any number of arguments,[m
[31m-and prints their values to <code>stdout</code>,[m
[31m-using the <a href="#pdf-tostring"><code>tostring</code></a> function to convert them to strings.[m
[31m-<code>print</code> is not intended for formatted output,[m
[31m-but only as a quick way to show a value,[m
[31m-typically for debugging.[m
[31m-For formatted output, use <a href="#pdf-string.format"><code>string.format</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-rawequal"><code>rawequal (v1, v2)</code></a></h3>[m
[31m-Checks whether <code>v1</code> is equal to <code>v2</code>,[m
[31m-without invoking any metamethod.[m
[31m-Returns a boolean.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-rawget"><code>rawget (table, index)</code></a></h3>[m
[31m-Gets the real value of <code>table[index]</code>,[m
[31m-without invoking any metamethod.[m
[31m-<code>table</code> must be a table;[m
[31m-<code>index</code> may be any value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-rawset"><code>rawset (table, index, value)</code></a></h3>[m
[31m-Sets the real value of <code>table[index]</code> to <code>value</code>,[m
[31m-without invoking any metamethod.[m
[31m-<code>table</code> must be a table,[m
[31m-<code>index</code> any value different from <b>nil</b>,[m
[31m-and <code>value</code> any Lua value.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns <code>table</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-select"><code>select (index, &middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>index</code> is a number,[m
[31m-returns all arguments after argument number <code>index</code>.[m
[31m-Otherwise, <code>index</code> must be the string <code>"#"</code>,[m
[31m-and <code>select</code> returns the total number of extra arguments it received.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-setfenv"><code>setfenv (f, table)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the environment to be used by the given function.[m
[31m-<code>f</code> can be a Lua function or a number[m
[31m-that specifies the function at that stack level:[m
[31m-Level&nbsp;1 is the function calling <code>setfenv</code>.[m
[31m-<code>setfenv</code> returns the given function.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As a special case, when <code>f</code> is 0 <code>setfenv</code> changes[m
[31m-the environment of the running thread.[m
[31m-In this case, <code>setfenv</code> returns no values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-setmetatable"><code>setmetatable (table, metatable)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the metatable for the given table.[m
[31m-(You cannot change the metatable of other types from Lua, only from&nbsp;C.)[m
[31m-If <code>metatable</code> is <b>nil</b>,[m
[31m-removes the metatable of the given table.[m
[31m-If the original metatable has a <code>"__metatable"</code> field,[m
[31m-raises an error.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns <code>table</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-tonumber"><code>tonumber (e [, base])</code></a></h3>[m
[31m-Tries to convert its argument to a number.[m
[31m-If the argument is already a number or a string convertible[m
[31m-to a number, then <code>tonumber</code> returns this number;[m
[31m-otherwise, it returns <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-An optional argument specifies the base to interpret the numeral.[m
[31m-The base may be any integer between 2 and 36, inclusive.[m
[31m-In bases above&nbsp;10, the letter '<code>A</code>' (in either upper or lower case)[m
[31m-represents&nbsp;10, '<code>B</code>' represents&nbsp;11, and so forth,[m
[31m-with '<code>Z</code>' representing 35.[m
[31m-In base 10 (the default), the number can have a decimal part,[m
[31m-as well as an optional exponent part (see <a href="#2.1">&sect;2.1</a>).[m
[31m-In other bases, only unsigned integers are accepted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-tostring"><code>tostring (e)</code></a></h3>[m
[31m-Receives an argument of any type and[m
[31m-converts it to a string in a reasonable format.[m
[31m-For complete control of how numbers are converted,[m
[31m-use <a href="#pdf-string.format"><code>string.format</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the metatable of <code>e</code> has a <code>"__tostring"</code> field,[m
[31m-then <code>tostring</code> calls the corresponding value[m
[31m-with <code>e</code> as argument,[m
[31m-and uses the result of the call as its result.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-type"><code>type (v)</code></a></h3>[m
[31m-Returns the type of its only argument, coded as a string.[m
[31m-The possible results of this function are[m
[31m-"<code>nil</code>" (a string, not the value <b>nil</b>),[m
[31m-"<code>number</code>",[m
[31m-"<code>string</code>",[m
[31m-"<code>boolean</code>",[m
[31m-"<code>table</code>",[m
[31m-"<code>function</code>",[m
[31m-"<code>thread</code>",[m
[31m-and "<code>userdata</code>".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-unpack"><code>unpack (list [, i [, j]])</code></a></h3>[m
[31m-Returns the elements from the given table.[m
[31m-This function is equivalent to[m
[31m-[m
[31m-<pre>[m
[31m-     return list[i], list[i+1], &middot;&middot;&middot;, list[j][m
[31m-</pre><p>[m
[31m-except that the above code can be written only for a fixed number[m
[31m-of elements.[m
[31m-By default, <code>i</code> is&nbsp;1 and <code>j</code> is the length of the list,[m
[31m-as defined by the length operator (see <a href="#2.5.5">&sect;2.5.5</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-_VERSION"><code>_VERSION</code></a></h3>[m
[31m-A global variable (not a function) that[m
[31m-holds a string containing the current interpreter version.[m
[31m-The current contents of this variable is "<code>Lua 5.1</code>".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-xpcall"><code>xpcall (f, err)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is similar to <a href="#pdf-pcall"><code>pcall</code></a>,[m
[31m-except that you can set a new error handler.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<code>xpcall</code> calls function <code>f</code> in protected mode,[m
[31m-using <code>err</code> as the error handler.[m
[31m-Any error inside <code>f</code> is not propagated;[m
[31m-instead, <code>xpcall</code> catches the error,[m
[31m-calls the <code>err</code> function with the original error object,[m
[31m-and returns a status code.[m
[31m-Its first result is the status code (a boolean),[m
[31m-which is true if the call succeeds without errors.[m
[31m-In this case, <code>xpcall</code> also returns all results from the call,[m
[31m-after this first result.[m
[31m-In case of any error,[m
[31m-<code>xpcall</code> returns <b>false</b> plus the result from <code>err</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.2 - <a name="5.2">Coroutine Manipulation</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The operations related to coroutines comprise a sub-library of[m
[31m-the basic library and come inside the table <a name="pdf-coroutine"><code>coroutine</code></a>.[m
[31m-See <a href="#2.11">&sect;2.11</a> for a general description of coroutines.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.create"><code>coroutine.create (f)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Creates a new coroutine, with body <code>f</code>.[m
[31m-<code>f</code> must be a Lua function.[m
[31m-Returns this new coroutine,[m
[31m-an object with type <code>"thread"</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.resume"><code>coroutine.resume (co [, val1, &middot;&middot;&middot;])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Starts or continues the execution of coroutine <code>co</code>.[m
[31m-The first time you resume a coroutine,[m
[31m-it starts running its body.[m
[31m-The values <code>val1</code>, &middot;&middot;&middot; are passed[m
[31m-as the arguments to the body function.[m
[31m-If the coroutine has yielded,[m
[31m-<code>resume</code> restarts it;[m
[31m-the values <code>val1</code>, &middot;&middot;&middot; are passed[m
[31m-as the results from the yield.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the coroutine runs without any errors,[m
[31m-<code>resume</code> returns <b>true</b> plus any values passed to <code>yield</code>[m
[31m-(if the coroutine yields) or any values returned by the body function[m
[31m-(if the coroutine terminates).[m
[31m-If there is any error,[m
[31m-<code>resume</code> returns <b>false</b> plus the error message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.running"><code>coroutine.running ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the running coroutine,[m
[31m-or <b>nil</b> when called by the main thread.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.status"><code>coroutine.status (co)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the status of coroutine <code>co</code>, as a string:[m
[31m-<code>"running"</code>,[m
[31m-if the coroutine is running (that is, it called <code>status</code>);[m
[31m-<code>"suspended"</code>, if the coroutine is suspended in a call to <code>yield</code>,[m
[31m-or if it has not started running yet;[m
[31m-<code>"normal"</code> if the coroutine is active but not running[m
[31m-(that is, it has resumed another coroutine);[m
[31m-and <code>"dead"</code> if the coroutine has finished its body function,[m
[31m-or if it has stopped with an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.wrap"><code>coroutine.wrap (f)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Creates a new coroutine, with body <code>f</code>.[m
[31m-<code>f</code> must be a Lua function.[m
[31m-Returns a function that resumes the coroutine each time it is called.[m
[31m-Any arguments passed to the function behave as the[m
[31m-extra arguments to <code>resume</code>.[m
[31m-Returns the same values returned by <code>resume</code>,[m
[31m-except the first boolean.[m
[31m-In case of error, propagates the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-coroutine.yield"><code>coroutine.yield (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Suspends the execution of the calling coroutine.[m
[31m-The coroutine cannot be running a C&nbsp;function,[m
[31m-a metamethod, or an iterator.[m
[31m-Any arguments to <code>yield</code> are passed as extra results to <code>resume</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.3 - <a name="5.3">Modules</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The package library provides basic[m
[31m-facilities for loading and building modules in Lua.[m
[31m-It exports two of its functions directly in the global environment:[m
[31m-<a href="#pdf-require"><code>require</code></a> and <a href="#pdf-module"><code>module</code></a>.[m
[31m-Everything else is exported in a table <a name="pdf-package"><code>package</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-module"><code>module (name [, &middot;&middot;&middot;])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Creates a module.[m
[31m-If there is a table in <code>package.loaded[name]</code>,[m
[31m-this table is the module.[m
[31m-Otherwise, if there is a global table <code>t</code> with the given name,[m
[31m-this table is the module.[m
[31m-Otherwise creates a new table <code>t</code> and[m
[31m-sets it as the value of the global <code>name</code> and[m
[31m-the value of <code>package.loaded[name]</code>.[m
[31m-This function also initializes <code>t._NAME</code> with the given name,[m
[31m-<code>t._M</code> with the module (<code>t</code> itself),[m
[31m-and <code>t._PACKAGE</code> with the package name[m
[31m-(the full module name minus last component; see below).[m
[31m-Finally, <code>module</code> sets <code>t</code> as the new environment[m
[31m-of the current function and the new value of <code>package.loaded[name]</code>,[m
[31m-so that <a href="#pdf-require"><code>require</code></a> returns <code>t</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>name</code> is a compound name[m
[31m-(that is, one with components separated by dots),[m
[31m-<code>module</code> creates (or reuses, if they already exist)[m
[31m-tables for each component.[m
[31m-For instance, if <code>name</code> is <code>a.b.c</code>,[m
[31m-then <code>module</code> stores the module table in field <code>c</code> of[m
[31m-field <code>b</code> of global <code>a</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function can receive optional <em>options</em> after[m
[31m-the module name,[m
[31m-where each option is a function to be applied over the module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-require"><code>require (modname)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Loads the given module.[m
[31m-The function starts by looking into the <a href="#pdf-package.loaded"><code>package.loaded</code></a> table[m
[31m-to determine whether <code>modname</code> is already loaded.[m
[31m-If it is, then <code>require</code> returns the value stored[m
[31m-at <code>package.loaded[modname]</code>.[m
[31m-Otherwise, it tries to find a <em>loader</em> for the module.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To find a loader,[m
[31m-<code>require</code> is guided by the <a href="#pdf-package.loaders"><code>package.loaders</code></a> array.[m
[31m-By changing this array,[m
[31m-we can change how <code>require</code> looks for a module.[m
[31m-The following explanation is based on the default configuration[m
[31m-for <a href="#pdf-package.loaders"><code>package.loaders</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-First <code>require</code> queries <code>package.preload[modname]</code>.[m
[31m-If it has a value,[m
[31m-this value (which should be a function) is the loader.[m
[31m-Otherwise <code>require</code> searches for a Lua loader using the[m
[31m-path stored in <a href="#pdf-package.path"><code>package.path</code></a>.[m
[31m-If that also fails, it searches for a C&nbsp;loader using the[m
[31m-path stored in <a href="#pdf-package.cpath"><code>package.cpath</code></a>.[m
[31m-If that also fails,[m
[31m-it tries an <em>all-in-one</em> loader (see <a href="#pdf-package.loaders"><code>package.loaders</code></a>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Once a loader is found,[m
[31m-<code>require</code> calls the loader with a single argument, <code>modname</code>.[m
[31m-If the loader returns any value,[m
[31m-<code>require</code> assigns the returned value to <code>package.loaded[modname]</code>.[m
[31m-If the loader returns no value and[m
[31m-has not assigned any value to <code>package.loaded[modname]</code>,[m
[31m-then <code>require</code> assigns <b>true</b> to this entry.[m
[31m-In any case, <code>require</code> returns the[m
[31m-final value of <code>package.loaded[modname]</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If there is any error loading or running the module,[m
[31m-or if it cannot find any loader for the module,[m
[31m-then <code>require</code> signals an error. [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.cpath"><code>package.cpath</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The path used by <a href="#pdf-require"><code>require</code></a> to search for a C&nbsp;loader.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Lua initializes the C&nbsp;path <a href="#pdf-package.cpath"><code>package.cpath</code></a> in the same way[m
[31m-it initializes the Lua path <a href="#pdf-package.path"><code>package.path</code></a>,[m
[31m-using the environment variable <a name="pdf-LUA_CPATH"><code>LUA_CPATH</code></a>[m
[31m-or a default path defined in <code>luaconf.h</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-<hr><h3><a name="pdf-package.loaded"><code>package.loaded</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A table used by <a href="#pdf-require"><code>require</code></a> to control which[m
[31m-modules are already loaded.[m
[31m-When you require a module <code>modname</code> and[m
[31m-<code>package.loaded[modname]</code> is not false,[m
[31m-<a href="#pdf-require"><code>require</code></a> simply returns the value stored there.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.loaders"><code>package.loaders</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A table used by <a href="#pdf-require"><code>require</code></a> to control how to load modules.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Each entry in this table is a <em>searcher function</em>.[m
[31m-When looking for a module,[m
[31m-<a href="#pdf-require"><code>require</code></a> calls each of these searchers in ascending order,[m
[31m-with the module name (the argument given to <a href="#pdf-require"><code>require</code></a>) as its[m
[31m-sole parameter.[m
[31m-The function can return another function (the module <em>loader</em>)[m
[31m-or a string explaining why it did not find that module[m
[31m-(or <b>nil</b> if it has nothing to say).[m
[31m-Lua initializes this table with four functions.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The first searcher simply looks for a loader in the[m
[31m-<a href="#pdf-package.preload"><code>package.preload</code></a> table.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The second searcher looks for a loader as a Lua library,[m
[31m-using the path stored at <a href="#pdf-package.path"><code>package.path</code></a>.[m
[31m-A path is a sequence of <em>templates</em> separated by semicolons.[m
[31m-For each template,[m
[31m-the searcher will change each interrogation[m
[31m-mark in the template by <code>filename</code>,[m
[31m-which is the module name with each dot replaced by a[m
[31m-"directory separator" (such as "<code>/</code>" in Unix);[m
[31m-then it will try to open the resulting file name.[m
[31m-So, for instance, if the Lua path is the string[m
[31m-[m
[31m-<pre>[m
[31m-     "./?.lua;./?.lc;/usr/local/?/init.lua"[m
[31m-</pre><p>[m
[31m-the search for a Lua file for module <code>foo</code>[m
[31m-will try to open the files[m
[31m-<code>./foo.lua</code>, <code>./foo.lc</code>, and[m
[31m-<code>/usr/local/foo/init.lua</code>, in that order.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The third searcher looks for a loader as a C&nbsp;library,[m
[31m-using the path given by the variable <a href="#pdf-package.cpath"><code>package.cpath</code></a>.[m
[31m-For instance,[m
[31m-if the C&nbsp;path is the string[m
[31m-[m
[31m-<pre>[m
[31m-     "./?.so;./?.dll;/usr/local/?/init.so"[m
[31m-</pre><p>[m
[31m-the searcher for module <code>foo</code>[m
[31m-will try to open the files <code>./foo.so</code>, <code>./foo.dll</code>,[m
[31m-and <code>/usr/local/foo/init.so</code>, in that order.[m
[31m-Once it finds a C&nbsp;library,[m
[31m-this searcher first uses a dynamic link facility to link the[m
[31m-application with the library.[m
[31m-Then it tries to find a C&nbsp;function inside the library to[m
[31m-be used as the loader.[m
[31m-The name of this C&nbsp;function is the string "<code>luaopen_</code>"[m
[31m-concatenated with a copy of the module name where each dot[m
[31m-is replaced by an underscore.[m
[31m-Moreover, if the module name has a hyphen,[m
[31m-its prefix up to (and including) the first hyphen is removed.[m
[31m-For instance, if the module name is <code>a.v1-b.c</code>,[m
[31m-the function name will be <code>luaopen_b_c</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The fourth searcher tries an <em>all-in-one loader</em>.[m
[31m-It searches the C&nbsp;path for a library for[m
[31m-the root name of the given module.[m
[31m-For instance, when requiring <code>a.b.c</code>,[m
[31m-it will search for a C&nbsp;library for <code>a</code>.[m
[31m-If found, it looks into it for an open function for[m
[31m-the submodule;[m
[31m-in our example, that would be <code>luaopen_a_b_c</code>.[m
[31m-With this facility, a package can pack several C&nbsp;submodules[m
[31m-into one single library,[m
[31m-with each submodule keeping its original open function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.loadlib"><code>package.loadlib (libname, funcname)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Dynamically links the host program with the C&nbsp;library <code>libname</code>.[m
[31m-Inside this library, looks for a function <code>funcname</code>[m
[31m-and returns this function as a C&nbsp;function.[m
[31m-(So, <code>funcname</code> must follow the protocol (see <a href="#lua_CFunction"><code>lua_CFunction</code></a>)).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This is a low-level function.[m
[31m-It completely bypasses the package and module system.[m
[31m-Unlike <a href="#pdf-require"><code>require</code></a>,[m
[31m-it does not perform any path searching and[m
[31m-does not automatically adds extensions.[m
[31m-<code>libname</code> must be the complete file name of the C&nbsp;library,[m
[31m-including if necessary a path and extension.[m
[31m-<code>funcname</code> must be the exact name exported by the C&nbsp;library[m
[31m-(which may depend on the C&nbsp;compiler and linker used).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is not supported by ANSI C.[m
[31m-As such, it is only available on some platforms[m
[31m-(Windows, Linux, Mac OS X, Solaris, BSD,[m
[31m-plus other Unix systems that support the <code>dlfcn</code> standard).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.path"><code>package.path</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The path used by <a href="#pdf-require"><code>require</code></a> to search for a Lua loader.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-At start-up, Lua initializes this variable with[m
[31m-the value of the environment variable <a name="pdf-LUA_PATH"><code>LUA_PATH</code></a> or[m
[31m-with a default path defined in <code>luaconf.h</code>,[m
[31m-if the environment variable is not defined.[m
[31m-Any "<code>;;</code>" in the value of the environment variable[m
[31m-is replaced by the default path.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.preload"><code>package.preload</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A table to store loaders for specific modules[m
[31m-(see <a href="#pdf-require"><code>require</code></a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-package.seeall"><code>package.seeall (module)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets a metatable for <code>module</code> with[m
[31m-its <code>__index</code> field referring to the global environment,[m
[31m-so that this module inherits values[m
[31m-from the global environment.[m
[31m-To be used as an option to function <a href="#pdf-module"><code>module</code></a>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.4 - <a name="5.4">String Manipulation</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-This library provides generic functions for string manipulation,[m
[31m-such as finding and extracting substrings, and pattern matching.[m
[31m-When indexing a string in Lua, the first character is at position&nbsp;1[m
[31m-(not at&nbsp;0, as in C).[m
[31m-Indices are allowed to be negative and are interpreted as indexing backwards,[m
[31m-from the end of the string.[m
[31m-Thus, the last character is at position -1, and so on.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The string library provides all its functions inside the table[m
[31m-<a name="pdf-string"><code>string</code></a>.[m
[31m-It also sets a metatable for strings[m
[31m-where the <code>__index</code> field points to the <code>string</code> table.[m
[31m-Therefore, you can use the string functions in object-oriented style.[m
[31m-For instance, <code>string.byte(s, i)</code>[m
[31m-can be written as <code>s:byte(i)</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The string library assumes one-byte character encodings.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.byte"><code>string.byte (s [, i [, j]])</code></a></h3>[m
[31m-Returns the internal numerical codes of the characters <code>s[i]</code>,[m
[31m-<code>s[i+1]</code>, &middot;&middot;&middot;, <code>s[j]</code>.[m
[31m-The default value for <code>i</code> is&nbsp;1;[m
[31m-the default value for <code>j</code> is&nbsp;<code>i</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Note that numerical codes are not necessarily portable across platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.char"><code>string.char (&middot;&middot;&middot;)</code></a></h3>[m
[31m-Receives zero or more integers.[m
[31m-Returns a string with length equal to the number of arguments,[m
[31m-in which each character has the internal numerical code equal[m
[31m-to its corresponding argument.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Note that numerical codes are not necessarily portable across platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.dump"><code>string.dump (function)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a string containing a binary representation of the given function,[m
[31m-so that a later <a href="#pdf-loadstring"><code>loadstring</code></a> on this string returns[m
[31m-a copy of the function.[m
[31m-<code>function</code> must be a Lua function without upvalues.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.find"><code>string.find (s, pattern [, init [, plain]])</code></a></h3>[m
[31m-Looks for the first match of[m
[31m-<code>pattern</code> in the string <code>s</code>.[m
[31m-If it finds a match, then <code>find</code> returns the indices of&nbsp;<code>s</code>[m
[31m-where this occurrence starts and ends;[m
[31m-otherwise, it returns <b>nil</b>.[m
[31m-A third, optional numerical argument <code>init</code> specifies[m
[31m-where to start the search;[m
[31m-its default value is&nbsp;1 and can be negative.[m
[31m-A value of <b>true</b> as a fourth, optional argument <code>plain</code>[m
[31m-turns off the pattern matching facilities,[m
[31m-so the function does a plain "find substring" operation,[m
[31m-with no characters in <code>pattern</code> being considered "magic".[m
[31m-Note that if <code>plain</code> is given, then <code>init</code> must be given as well.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the pattern has captures,[m
[31m-then in a successful match[m
[31m-the captured values are also returned,[m
[31m-after the two indices.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.format"><code>string.format (formatstring, &middot;&middot;&middot;)</code></a></h3>[m
[31m-Returns a formatted version of its variable number of arguments[m
[31m-following the description given in its first argument (which must be a string).[m
[31m-The format string follows the same rules as the <code>printf</code> family of[m
[31m-standard C&nbsp;functions.[m
[31m-The only differences are that the options/modifiers[m
[31m-<code>*</code>, <code>l</code>, <code>L</code>, <code>n</code>, <code>p</code>,[m
[31m-and <code>h</code> are not supported[m
[31m-and that there is an extra option, <code>q</code>.[m
[31m-The <code>q</code> option formats a string in a form suitable to be safely read[m
[31m-back by the Lua interpreter:[m
[31m-the string is written between double quotes,[m
[31m-and all double quotes, newlines, embedded zeros,[m
[31m-and backslashes in the string[m
[31m-are correctly escaped when written.[m
[31m-For instance, the call[m
[31m-[m
[31m-<pre>[m
[31m-     string.format('%q', 'a string with "quotes" and \n new line')[m
[31m-</pre><p>[m
[31m-will produce the string:[m
[31m-[m
[31m-<pre>[m
[31m-     "a string with \"quotes\" and \[m
[31m-      new line"[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-The options <code>c</code>, <code>d</code>, <code>E</code>, <code>e</code>, <code>f</code>,[m
[31m-<code>g</code>, <code>G</code>, <code>i</code>, <code>o</code>, <code>u</code>, <code>X</code>, and <code>x</code> all[m
[31m-expect a number as argument,[m
[31m-whereas <code>q</code> and <code>s</code> expect a string.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function does not accept string values[m
[31m-containing embedded zeros,[m
[31m-except as arguments to the <code>q</code> option.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.gmatch"><code>string.gmatch (s, pattern)</code></a></h3>[m
[31m-Returns an iterator function that,[m
[31m-each time it is called,[m
[31m-returns the next captures from <code>pattern</code> over string <code>s</code>.[m
[31m-If <code>pattern</code> specifies no captures,[m
[31m-then the whole match is produced in each call.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As an example, the following loop[m
[31m-[m
[31m-<pre>[m
[31m-     s = "hello world from Lua"[m
[31m-     for w in string.gmatch(s, "%a+") do[m
[31m-       print(w)[m
[31m-     end[m
[31m-</pre><p>[m
[31m-will iterate over all the words from string <code>s</code>,[m
[31m-printing one per line.[m
[31m-The next example collects all pairs <code>key=value</code> from the[m
[31m-given string into a table:[m
[31m-[m
[31m-<pre>[m
[31m-     t = {}[m
[31m-     s = "from=world, to=Lua"[m
[31m-     for k, v in string.gmatch(s, "(%w+)=(%w+)") do[m
[31m-       t[k] = v[m
[31m-     end[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-For this function, a '<code>^</code>' at the start of a pattern does not[m
[31m-work as an anchor, as this would prevent the iteration.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.gsub"><code>string.gsub (s, pattern, repl [, n])</code></a></h3>[m
[31m-Returns a copy of <code>s</code>[m
[31m-in which all (or the first <code>n</code>, if given)[m
[31m-occurrences of the <code>pattern</code> have been[m
[31m-replaced by a replacement string specified by <code>repl</code>,[m
[31m-which can be a string, a table, or a function.[m
[31m-<code>gsub</code> also returns, as its second value,[m
[31m-the total number of matches that occurred.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>repl</code> is a string, then its value is used for replacement.[m
[31m-The character&nbsp;<code>%</code> works as an escape character:[m
[31m-any sequence in <code>repl</code> of the form <code>%<em>n</em></code>,[m
[31m-with <em>n</em> between 1 and 9,[m
[31m-stands for the value of the <em>n</em>-th captured substring (see below).[m
[31m-The sequence <code>%0</code> stands for the whole match.[m
[31m-The sequence <code>%%</code> stands for a single&nbsp;<code>%</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>repl</code> is a table, then the table is queried for every match,[m
[31m-using the first capture as the key;[m
[31m-if the pattern specifies no captures,[m
[31m-then the whole match is used as the key.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>repl</code> is a function, then this function is called every time a[m
[31m-match occurs, with all captured substrings passed as arguments,[m
[31m-in order;[m
[31m-if the pattern specifies no captures,[m
[31m-then the whole match is passed as a sole argument.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the value returned by the table query or by the function call[m
[31m-is a string or a number,[m
[31m-then it is used as the replacement string;[m
[31m-otherwise, if it is <b>false</b> or <b>nil</b>,[m
[31m-then there is no replacement[m
[31m-(that is, the original match is kept in the string).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Here are some examples:[m
[31m-[m
[31m-<pre>[m
[31m-     x = string.gsub("hello world", "(%w+)", "%1 %1")[m
[31m-     --&gt; x="hello hello world world"[m
[31m-     [m
[31m-     x = string.gsub("hello world", "%w+", "%0 %0", 1)[m
[31m-     --&gt; x="hello hello world"[m
[31m-     [m
[31m-     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")[m
[31m-     --&gt; x="world hello Lua from"[m
[31m-     [m
[31m-     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)[m
[31m-     --&gt; x="home = /home/roberto, user = roberto"[m
[31m-     [m
[31m-     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)[m
[31m-           return loadstring(s)()[m
[31m-         end)[m
[31m-     --&gt; x="4+5 = 9"[m
[31m-     [m
[31m-     local t = {name="lua", version="5.1"}[m
[31m-     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)[m
[31m-     --&gt; x="lua-5.1.tar.gz"[m
[31m-</pre>[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.len"><code>string.len (s)</code></a></h3>[m
[31m-Receives a string and returns its length.[m
[31m-The empty string <code>""</code> has length 0.[m
[31m-Embedded zeros are counted,[m
[31m-so <code>"a\000bc\000"</code> has length 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.lower"><code>string.lower (s)</code></a></h3>[m
[31m-Receives a string and returns a copy of this string with all[m
[31m-uppercase letters changed to lowercase.[m
[31m-All other characters are left unchanged.[m
[31m-The definition of what an uppercase letter is depends on the current locale.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.match"><code>string.match (s, pattern [, init])</code></a></h3>[m
[31m-Looks for the first <em>match</em> of[m
[31m-<code>pattern</code> in the string <code>s</code>.[m
[31m-If it finds one, then <code>match</code> returns[m
[31m-the captures from the pattern;[m
[31m-otherwise it returns <b>nil</b>.[m
[31m-If <code>pattern</code> specifies no captures,[m
[31m-then the whole match is returned.[m
[31m-A third, optional numerical argument <code>init</code> specifies[m
[31m-where to start the search;[m
[31m-its default value is&nbsp;1 and can be negative.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.rep"><code>string.rep (s, n)</code></a></h3>[m
[31m-Returns a string that is the concatenation of <code>n</code> copies of[m
[31m-the string <code>s</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.reverse"><code>string.reverse (s)</code></a></h3>[m
[31m-Returns a string that is the string <code>s</code> reversed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.sub"><code>string.sub (s, i [, j])</code></a></h3>[m
[31m-Returns the substring of <code>s</code> that[m
[31m-starts at <code>i</code>  and continues until <code>j</code>;[m
[31m-<code>i</code> and <code>j</code> can be negative.[m
[31m-If <code>j</code> is absent, then it is assumed to be equal to -1[m
[31m-(which is the same as the string length).[m
[31m-In particular,[m
[31m-the call <code>string.sub(s,1,j)</code> returns a prefix of <code>s</code>[m
[31m-with length <code>j</code>,[m
[31m-and <code>string.sub(s, -i)</code> returns a suffix of <code>s</code>[m
[31m-with length <code>i</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-string.upper"><code>string.upper (s)</code></a></h3>[m
[31m-Receives a string and returns a copy of this string with all[m
[31m-lowercase letters changed to uppercase.[m
[31m-All other characters are left unchanged.[m
[31m-The definition of what a lowercase letter is depends on the current locale.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h3>5.4.1 - <a name="5.4.1">Patterns</a></h3>[m
[31m-[m
[31m-[m
[31m-<h4>Character Class:</h4><p>[m
[31m-A <em>character class</em> is used to represent a set of characters.[m
[31m-The following combinations are allowed in describing a character class:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b><em>x</em>:</b>[m
[31m-(where <em>x</em> is not one of the <em>magic characters</em>[m
[31m-<code>^$()%.[]*+-?</code>)[m
[31m-represents the character <em>x</em> itself.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>.</code>:</b> (a dot) represents all characters.</li>[m
[31m-[m
[31m-<li><b><code>%a</code>:</b> represents all letters.</li>[m
[31m-[m
[31m-<li><b><code>%c</code>:</b> represents all control characters.</li>[m
[31m-[m
[31m-<li><b><code>%d</code>:</b> represents all digits.</li>[m
[31m-[m
[31m-<li><b><code>%l</code>:</b> represents all lowercase letters.</li>[m
[31m-[m
[31m-<li><b><code>%p</code>:</b> represents all punctuation characters.</li>[m
[31m-[m
[31m-<li><b><code>%s</code>:</b> represents all space characters.</li>[m
[31m-[m
[31m-<li><b><code>%u</code>:</b> represents all uppercase letters.</li>[m
[31m-[m
[31m-<li><b><code>%w</code>:</b> represents all alphanumeric characters.</li>[m
[31m-[m
[31m-<li><b><code>%x</code>:</b> represents all hexadecimal digits.</li>[m
[31m-[m
[31m-<li><b><code>%z</code>:</b> represents the character with representation 0.</li>[m
[31m-[m
[31m-<li><b><code>%<em>x</em></code>:</b> (where <em>x</em> is any non-alphanumeric character)[m
[31m-represents the character <em>x</em>.[m
[31m-This is the standard way to escape the magic characters.[m
[31m-Any punctuation character (even the non magic)[m
[31m-can be preceded by a '<code>%</code>'[m
[31m-when used to represent itself in a pattern.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>[<em>set</em>]</code>:</b>[m
[31m-represents the class which is the union of all[m
[31m-characters in <em>set</em>.[m
[31m-A range of characters can be specified by[m
[31m-separating the end characters of the range with a '<code>-</code>'.[m
[31m-All classes <code>%</code><em>x</em> described above can also be used as[m
[31m-components in <em>set</em>.[m
[31m-All other characters in <em>set</em> represent themselves.[m
[31m-For example, <code>[%w_]</code> (or <code>[_%w]</code>)[m
[31m-represents all alphanumeric characters plus the underscore,[m
[31m-<code>[0-7]</code> represents the octal digits,[m
[31m-and <code>[0-7%l%-]</code> represents the octal digits plus[m
[31m-the lowercase letters plus the '<code>-</code>' character.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The interaction between ranges and classes is not defined.[m
[31m-Therefore, patterns like <code>[%a-z]</code> or <code>[a-%%]</code>[m
[31m-have no meaning.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><code>[^<em>set</em>]</code>:</b>[m
[31m-represents the complement of <em>set</em>,[m
[31m-where <em>set</em> is interpreted as above.[m
[31m-</li>[m
[31m-[m
[31m-</ul><p>[m
[31m-For all classes represented by single letters (<code>%a</code>, <code>%c</code>, etc.),[m
[31m-the corresponding uppercase letter represents the complement of the class.[m
[31m-For instance, <code>%S</code> represents all non-space characters.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The definitions of letter, space, and other character groups[m
[31m-depend on the current locale.[m
[31m-In particular, the class <code>[a-z]</code> may not be equivalent to <code>%l</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h4>Pattern Item:</h4><p>[m
[31m-A <em>pattern item</em> can be[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-a single character class,[m
[31m-which matches any single character in the class;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-a single character class followed by '<code>*</code>',[m
[31m-which matches 0 or more repetitions of characters in the class.[m
[31m-These repetition items will always match the longest possible sequence;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-a single character class followed by '<code>+</code>',[m
[31m-which matches 1 or more repetitions of characters in the class.[m
[31m-These repetition items will always match the longest possible sequence;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-a single character class followed by '<code>-</code>',[m
[31m-which also matches 0 or more repetitions of characters in the class.[m
[31m-Unlike '<code>*</code>',[m
[31m-these repetition items will always match the <em>shortest</em> possible sequence;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-a single character class followed by '<code>?</code>',[m
[31m-which matches 0 or 1 occurrence of a character in the class;[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-<code>%<em>n</em></code>, for <em>n</em> between 1 and 9;[m
[31m-such item matches a substring equal to the <em>n</em>-th captured string[m
[31m-(see below);[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-<code>%b<em>xy</em></code>, where <em>x</em> and <em>y</em> are two distinct characters;[m
[31m-such item matches strings that start with&nbsp;<em>x</em>, end with&nbsp;<em>y</em>,[m
[31m-and where the <em>x</em> and <em>y</em> are <em>balanced</em>.[m
[31m-This means that, if one reads the string from left to right,[m
[31m-counting <em>+1</em> for an <em>x</em> and <em>-1</em> for a <em>y</em>,[m
[31m-the ending <em>y</em> is the first <em>y</em> where the count reaches 0.[m
[31m-For instance, the item <code>%b()</code> matches expressions with[m
[31m-balanced parentheses.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h4>Pattern:</h4><p>[m
[31m-A <em>pattern</em> is a sequence of pattern items.[m
[31m-A '<code>^</code>' at the beginning of a pattern anchors the match at the[m
[31m-beginning of the subject string.[m
[31m-A '<code>$</code>' at the end of a pattern anchors the match at the[m
[31m-end of the subject string.[m
[31m-At other positions,[m
[31m-'<code>^</code>' and '<code>$</code>' have no special meaning and represent themselves.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h4>Captures:</h4><p>[m
[31m-A pattern can contain sub-patterns enclosed in parentheses;[m
[31m-they describe <em>captures</em>.[m
[31m-When a match succeeds, the substrings of the subject string[m
[31m-that match captures are stored (<em>captured</em>) for future use.[m
[31m-Captures are numbered according to their left parentheses.[m
[31m-For instance, in the pattern <code>"(a*(.)%w(%s*))"</code>,[m
[31m-the part of the string matching <code>"a*(.)%w(%s*)"</code> is[m
[31m-stored as the first capture (and therefore has number&nbsp;1);[m
[31m-the character matching "<code>.</code>" is captured with number&nbsp;2,[m
[31m-and the part matching "<code>%s*</code>" has number&nbsp;3.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-As a special case, the empty capture <code>()</code> captures[m
[31m-the current string position (a number).[m
[31m-For instance, if we apply the pattern <code>"()aa()"</code> on the[m
[31m-string <code>"flaaap"</code>, there will be two captures: 3&nbsp;and&nbsp;5.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-A pattern cannot contain embedded zeros.  Use <code>%z</code> instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.5 - <a name="5.5">Table Manipulation</a></h2><p>[m
[31m-This library provides generic functions for table manipulation.[m
[31m-It provides all its functions inside the table <a name="pdf-table"><code>table</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Most functions in the table library assume that the table[m
[31m-represents an array or a list.[m
[31m-For these functions, when we talk about the "length" of a table[m
[31m-we mean the result of the length operator.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.concat"><code>table.concat (table [, sep [, i [, j]]])</code></a></h3>[m
[31m-Given an array where all elements are strings or numbers,[m
[31m-returns <code>table[i]..sep..table[i+1] &middot;&middot;&middot; sep..table[j]</code>.[m
[31m-The default value for <code>sep</code> is the empty string,[m
[31m-the default for <code>i</code> is 1,[m
[31m-and the default for <code>j</code> is the length of the table.[m
[31m-If <code>i</code> is greater than <code>j</code>, returns the empty string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.insert"><code>table.insert (table, [pos,] value)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Inserts element <code>value</code> at position <code>pos</code> in <code>table</code>,[m
[31m-shifting up other elements to open space, if necessary.[m
[31m-The default value for <code>pos</code> is <code>n+1</code>,[m
[31m-where <code>n</code> is the length of the table (see <a href="#2.5.5">&sect;2.5.5</a>),[m
[31m-so that a call <code>table.insert(t,x)</code> inserts <code>x</code> at the end[m
[31m-of table <code>t</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.maxn"><code>table.maxn (table)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the largest positive numerical index of the given table,[m
[31m-or zero if the table has no positive numerical indices.[m
[31m-(To do its job this function does a linear traversal of[m
[31m-the whole table.) [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.remove"><code>table.remove (table [, pos])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Removes from <code>table</code> the element at position <code>pos</code>,[m
[31m-shifting down other elements to close the space, if necessary.[m
[31m-Returns the value of the removed element.[m
[31m-The default value for <code>pos</code> is <code>n</code>,[m
[31m-where <code>n</code> is the length of the table,[m
[31m-so that a call <code>table.remove(t)</code> removes the last element[m
[31m-of table <code>t</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-table.sort"><code>table.sort (table [, comp])</code></a></h3>[m
[31m-Sorts table elements in a given order, <em>in-place</em>,[m
[31m-from <code>table[1]</code> to <code>table[n]</code>,[m
[31m-where <code>n</code> is the length of the table.[m
[31m-If <code>comp</code> is given,[m
[31m-then it must be a function that receives two table elements,[m
[31m-and returns true[m
[31m-when the first is less than the second[m
[31m-(so that <code>not comp(a[i+1],a[i])</code> will be true after the sort).[m
[31m-If <code>comp</code> is not given,[m
[31m-then the standard Lua operator <code>&lt;</code> is used instead.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The sort algorithm is not stable;[m
[31m-that is, elements considered equal by the given order[m
[31m-may have their relative positions changed by the sort.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.6 - <a name="5.6">Mathematical Functions</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-This library is an interface to the standard C&nbsp;math library.[m
[31m-It provides all its functions inside the table <a name="pdf-math"><code>math</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.abs"><code>math.abs (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the absolute value of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.acos"><code>math.acos (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the arc cosine of <code>x</code> (in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.asin"><code>math.asin (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the arc sine of <code>x</code> (in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.atan"><code>math.atan (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the arc tangent of <code>x</code> (in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.atan2"><code>math.atan2 (y, x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the arc tangent of <code>y/x</code> (in radians),[m
[31m-but uses the signs of both parameters to find the[m
[31m-quadrant of the result.[m
[31m-(It also handles correctly the case of <code>x</code> being zero.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.ceil"><code>math.ceil (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the smallest integer larger than or equal to <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.cos"><code>math.cos (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the cosine of <code>x</code> (assumed to be in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.cosh"><code>math.cosh (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the hyperbolic cosine of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.deg"><code>math.deg (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the angle <code>x</code> (given in radians) in degrees.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.exp"><code>math.exp (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the value <em>e<sup>x</sup></em>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.floor"><code>math.floor (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the largest integer smaller than or equal to <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.fmod"><code>math.fmod (x, y)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the remainder of the division of <code>x</code> by <code>y</code>[m
[31m-that rounds the quotient towards zero.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.frexp"><code>math.frexp (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <code>m</code> and <code>e</code> such that <em>x = m2<sup>e</sup></em>,[m
[31m-<code>e</code> is an integer and the absolute value of <code>m</code> is[m
[31m-in the range <em>[0.5, 1)</em>[m
[31m-(or zero when <code>x</code> is zero).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.huge"><code>math.huge</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The value <code>HUGE_VAL</code>,[m
[31m-a value larger than or equal to any other numerical value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.ldexp"><code>math.ldexp (m, e)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <em>m2<sup>e</sup></em> (<code>e</code> should be an integer).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.log"><code>math.log (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the natural logarithm of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.log10"><code>math.log10 (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the base-10 logarithm of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.max"><code>math.max (x, &middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the maximum value among its arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.min"><code>math.min (x, &middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the minimum value among its arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.modf"><code>math.modf (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns two numbers,[m
[31m-the integral part of <code>x</code> and the fractional part of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.pi"><code>math.pi</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The value of <em>pi</em>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.pow"><code>math.pow (x, y)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns <em>x<sup>y</sup></em>.[m
[31m-(You can also use the expression <code>x^y</code> to compute this value.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.rad"><code>math.rad (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the angle <code>x</code> (given in degrees) in radians.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.random"><code>math.random ([m [, n]])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is an interface to the simple[m
[31m-pseudo-random generator function <code>rand</code> provided by ANSI&nbsp;C.[m
[31m-(No guarantees can be given for its statistical properties.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called without arguments,[m
[31m-returns a uniform pseudo-random real number[m
[31m-in the range <em>[0,1)</em>.  [m
[31m-When called with an integer number <code>m</code>,[m
[31m-<code>math.random</code> returns[m
[31m-a uniform pseudo-random integer in the range <em>[1, m]</em>.[m
[31m-When called with two integer numbers <code>m</code> and <code>n</code>,[m
[31m-<code>math.random</code> returns a uniform pseudo-random[m
[31m-integer in the range <em>[m, n]</em>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.randomseed"><code>math.randomseed (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets <code>x</code> as the "seed"[m
[31m-for the pseudo-random generator:[m
[31m-equal seeds produce equal sequences of numbers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.sin"><code>math.sin (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the sine of <code>x</code> (assumed to be in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.sinh"><code>math.sinh (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the hyperbolic sine of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.sqrt"><code>math.sqrt (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the square root of <code>x</code>.[m
[31m-(You can also use the expression <code>x^0.5</code> to compute this value.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.tan"><code>math.tan (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the tangent of <code>x</code> (assumed to be in radians).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-math.tanh"><code>math.tanh (x)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the hyperbolic tangent of <code>x</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.7 - <a name="5.7">Input and Output Facilities</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-The I/O library provides two different styles for file manipulation.[m
[31m-The first one uses implicit file descriptors;[m
[31m-that is, there are operations to set a default input file and a[m
[31m-default output file,[m
[31m-and all input/output operations are over these default files.[m
[31m-The second style uses explicit file descriptors.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When using implicit file descriptors,[m
[31m-all operations are supplied by table <a name="pdf-io"><code>io</code></a>.[m
[31m-When using explicit file descriptors,[m
[31m-the operation <a href="#pdf-io.open"><code>io.open</code></a> returns a file descriptor[m
[31m-and then all operations are supplied as methods of the file descriptor.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The table <code>io</code> also provides[m
[31m-three predefined file descriptors with their usual meanings from C:[m
[31m-<a name="pdf-io.stdin"><code>io.stdin</code></a>, <a name="pdf-io.stdout"><code>io.stdout</code></a>, and <a name="pdf-io.stderr"><code>io.stderr</code></a>.[m
[31m-The I/O library never closes these files.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Unless otherwise stated,[m
[31m-all I/O functions return <b>nil</b> on failure[m
[31m-(plus an error message as a second result and[m
[31m-a system-dependent error code as a third result)[m
[31m-and some value different from <b>nil</b> on success.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.close"><code>io.close ([file])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <code>file:close()</code>.[m
[31m-Without a <code>file</code>, closes the default output file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.flush"><code>io.flush ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <code>file:flush</code> over the default output file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.input"><code>io.input ([file])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called with a file name, it opens the named file (in text mode),[m
[31m-and sets its handle as the default input file.[m
[31m-When called with a file handle,[m
[31m-it simply sets this file handle as the default input file.[m
[31m-When called without parameters,[m
[31m-it returns the current default input file.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In case of errors this function raises the error,[m
[31m-instead of returning an error code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.lines"><code>io.lines ([filename])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Opens the given file name in read mode[m
[31m-and returns an iterator function that,[m
[31m-each time it is called,[m
[31m-returns a new line from the file.[m
[31m-Therefore, the construction[m
[31m-[m
[31m-<pre>[m
[31m-     for line in io.lines(filename) do <em>body</em> end[m
[31m-</pre><p>[m
[31m-will iterate over all lines of the file.[m
[31m-When the iterator function detects the end of file,[m
[31m-it returns <b>nil</b> (to finish the loop) and automatically closes the file.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The call <code>io.lines()</code> (with no file name) is equivalent[m
[31m-to <code>io.input():lines()</code>;[m
[31m-that is, it iterates over the lines of the default input file.[m
[31m-In this case it does not close the file when the loop ends.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.open"><code>io.open (filename [, mode])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function opens a file,[m
[31m-in the mode specified in the string <code>mode</code>.[m
[31m-It returns a new file handle,[m
[31m-or, in case of errors, <b>nil</b> plus an error message.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The <code>mode</code> string can be any of the following:[m
[31m-[m
[31m-<ul>[m
[31m-<li><b>"r":</b> read mode (the default);</li>[m
[31m-<li><b>"w":</b> write mode;</li>[m
[31m-<li><b>"a":</b> append mode;</li>[m
[31m-<li><b>"r+":</b> update mode, all previous data is preserved;</li>[m
[31m-<li><b>"w+":</b> update mode, all previous data is erased;</li>[m
[31m-<li><b>"a+":</b> append update mode, previous data is preserved,[m
[31m-  writing is only allowed at the end of file.</li>[m
[31m-</ul><p>[m
[31m-The <code>mode</code> string can also have a '<code>b</code>' at the end,[m
[31m-which is needed in some systems to open the file in binary mode.[m
[31m-This string is exactly what is used in the[m
[31m-standard&nbsp;C function <code>fopen</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.output"><code>io.output ([file])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Similar to <a href="#pdf-io.input"><code>io.input</code></a>, but operates over the default output file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.popen"><code>io.popen (prog [, mode])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Starts program <code>prog</code> in a separated process and returns[m
[31m-a file handle that you can use to read data from this program[m
[31m-(if <code>mode</code> is <code>"r"</code>, the default)[m
[31m-or to write data to this program[m
[31m-(if <code>mode</code> is <code>"w"</code>).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is system dependent and is not available[m
[31m-on all platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.read"><code>io.read (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <code>io.input():read</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.tmpfile"><code>io.tmpfile ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a handle for a temporary file.[m
[31m-This file is opened in update mode[m
[31m-and it is automatically removed when the program ends.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.type"><code>io.type (obj)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Checks whether <code>obj</code> is a valid file handle.[m
[31m-Returns the string <code>"file"</code> if <code>obj</code> is an open file handle,[m
[31m-<code>"closed file"</code> if <code>obj</code> is a closed file handle,[m
[31m-or <b>nil</b> if <code>obj</code> is not a file handle.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-io.write"><code>io.write (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Equivalent to <code>io.output():write</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:close"><code>file:close ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Closes <code>file</code>.[m
[31m-Note that files are automatically closed when[m
[31m-their handles are garbage collected,[m
[31m-but that takes an unpredictable amount of time to happen.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:flush"><code>file:flush ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Saves any written data to <code>file</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:lines"><code>file:lines ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns an iterator function that,[m
[31m-each time it is called,[m
[31m-returns a new line from the file.[m
[31m-Therefore, the construction[m
[31m-[m
[31m-<pre>[m
[31m-     for line in file:lines() do <em>body</em> end[m
[31m-</pre><p>[m
[31m-will iterate over all lines of the file.[m
[31m-(Unlike <a href="#pdf-io.lines"><code>io.lines</code></a>, this function does not close the file[m
[31m-when the loop ends.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:read"><code>file:read (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Reads the file <code>file</code>,[m
[31m-according to the given formats, which specify what to read.[m
[31m-For each format,[m
[31m-the function returns a string (or a number) with the characters read,[m
[31m-or <b>nil</b> if it cannot read data with the specified format.[m
[31m-When called without formats,[m
[31m-it uses a default format that reads the entire next line[m
[31m-(see below).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The available formats are[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>"*n":</b>[m
[31m-reads a number;[m
[31m-this is the only format that returns a number instead of a string.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"*a":</b>[m
[31m-reads the whole file, starting at the current position.[m
[31m-On end of file, it returns the empty string.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"*l":</b>[m
[31m-reads the next line (skipping the end of line),[m
[31m-returning <b>nil</b> on end of file.[m
[31m-This is the default format.[m
[31m-</li>[m
[31m-[m
[31m-<li><b><em>number</em>:</b>[m
[31m-reads a string with up to this number of characters,[m
[31m-returning <b>nil</b> on end of file.[m
[31m-If number is zero,[m
[31m-it reads nothing and returns an empty string,[m
[31m-or <b>nil</b> on end of file.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:seek"><code>file:seek ([whence] [, offset])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets and gets the file position,[m
[31m-measured from the beginning of the file,[m
[31m-to the position given by <code>offset</code> plus a base[m
[31m-specified by the string <code>whence</code>, as follows:[m
[31m-[m
[31m-<ul>[m
[31m-<li><b>"set":</b> base is position 0 (beginning of the file);</li>[m
[31m-<li><b>"cur":</b> base is current position;</li>[m
[31m-<li><b>"end":</b> base is end of file;</li>[m
[31m-</ul><p>[m
[31m-In case of success, function <code>seek</code> returns the final file position,[m
[31m-measured in bytes from the beginning of the file.[m
[31m-If this function fails, it returns <b>nil</b>,[m
[31m-plus a string describing the error.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The default value for <code>whence</code> is <code>"cur"</code>,[m
[31m-and for <code>offset</code> is 0.[m
[31m-Therefore, the call <code>file:seek()</code> returns the current[m
[31m-file position, without changing it;[m
[31m-the call <code>file:seek("set")</code> sets the position to the[m
[31m-beginning of the file (and returns 0);[m
[31m-and the call <code>file:seek("end")</code> sets the position to the[m
[31m-end of the file, and returns its size.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:setvbuf"><code>file:setvbuf (mode [, size])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the buffering mode for an output file.[m
[31m-There are three available modes:[m
[31m-[m
[31m-<ul>[m
[31m-[m
[31m-<li><b>"no":</b>[m
[31m-no buffering; the result of any output operation appears immediately.[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"full":</b>[m
[31m-full buffering; output operation is performed only[m
[31m-when the buffer is full (or when you explicitly <code>flush</code> the file[m
[31m-(see <a href="#pdf-io.flush"><code>io.flush</code></a>)).[m
[31m-</li>[m
[31m-[m
[31m-<li><b>"line":</b>[m
[31m-line buffering; output is buffered until a newline is output[m
[31m-or there is any input from some special files[m
[31m-(such as a terminal device).[m
[31m-</li>[m
[31m-[m
[31m-</ul><p>[m
[31m-For the last two cases, <code>size</code>[m
[31m-specifies the size of the buffer, in bytes.[m
[31m-The default is an appropriate size.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-file:write"><code>file:write (&middot;&middot;&middot;)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Writes the value of each of its arguments to[m
[31m-the <code>file</code>.[m
[31m-The arguments must be strings or numbers.[m
[31m-To write other values,[m
[31m-use <a href="#pdf-tostring"><code>tostring</code></a> or <a href="#pdf-string.format"><code>string.format</code></a> before <code>write</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.8 - <a name="5.8">Operating System Facilities</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-This library is implemented through table <a name="pdf-os"><code>os</code></a>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.clock"><code>os.clock ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns an approximation of the amount in seconds of CPU time[m
[31m-used by the program.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.date"><code>os.date ([format [, time]])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a string or a table containing date and time,[m
[31m-formatted according to the given string <code>format</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the <code>time</code> argument is present,[m
[31m-this is the time to be formatted[m
[31m-(see the <a href="#pdf-os.time"><code>os.time</code></a> function for a description of this value).[m
[31m-Otherwise, <code>date</code> formats the current time.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>format</code> starts with '<code>!</code>',[m
[31m-then the date is formatted in Coordinated Universal Time.[m
[31m-After this optional character,[m
[31m-if <code>format</code> is the string "<code>*t</code>",[m
[31m-then <code>date</code> returns a table with the following fields:[m
[31m-<code>year</code> (four digits), <code>month</code> (1--12), <code>day</code> (1--31),[m
[31m-<code>hour</code> (0--23), <code>min</code> (0--59), <code>sec</code> (0--61),[m
[31m-<code>wday</code> (weekday, Sunday is&nbsp;1),[m
[31m-<code>yday</code> (day of the year),[m
[31m-and <code>isdst</code> (daylight saving flag, a boolean).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>format</code> is not "<code>*t</code>",[m
[31m-then <code>date</code> returns the date as a string,[m
[31m-formatted according to the same rules as the C&nbsp;function <code>strftime</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called without arguments,[m
[31m-<code>date</code> returns a reasonable date and time representation that depends on[m
[31m-the host system and on the current locale[m
[31m-(that is, <code>os.date()</code> is equivalent to <code>os.date("%c")</code>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.difftime"><code>os.difftime (t2, t1)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the number of seconds from time <code>t1</code> to time <code>t2</code>.[m
[31m-In POSIX, Windows, and some other systems,[m
[31m-this value is exactly <code>t2</code><em>-</em><code>t1</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.execute"><code>os.execute ([command])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function is equivalent to the C&nbsp;function <code>system</code>.[m
[31m-It passes <code>command</code> to be executed by an operating system shell.[m
[31m-It returns a status code, which is system-dependent.[m
[31m-If <code>command</code> is absent, then it returns nonzero if a shell is available[m
[31m-and zero otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.exit"><code>os.exit ([code])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Calls the C&nbsp;function <code>exit</code>,[m
[31m-with an optional <code>code</code>,[m
[31m-to terminate the host program.[m
[31m-The default value for <code>code</code> is the success code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.getenv"><code>os.getenv (varname)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the value of the process environment variable <code>varname</code>,[m
[31m-or <b>nil</b> if the variable is not defined.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.remove"><code>os.remove (filename)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Deletes the file or directory with the given name.[m
[31m-Directories must be empty to be removed.[m
[31m-If this function fails, it returns <b>nil</b>,[m
[31m-plus a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.rename"><code>os.rename (oldname, newname)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Renames file or directory named <code>oldname</code> to <code>newname</code>.[m
[31m-If this function fails, it returns <b>nil</b>,[m
[31m-plus a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.setlocale"><code>os.setlocale (locale [, category])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the current locale of the program.[m
[31m-<code>locale</code> is a string specifying a locale;[m
[31m-<code>category</code> is an optional string describing which category to change:[m
[31m-<code>"all"</code>, <code>"collate"</code>, <code>"ctype"</code>,[m
[31m-<code>"monetary"</code>, <code>"numeric"</code>, or <code>"time"</code>;[m
[31m-the default category is <code>"all"</code>.[m
[31m-The function returns the name of the new locale,[m
[31m-or <b>nil</b> if the request cannot be honored.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If <code>locale</code> is the empty string,[m
[31m-the current locale is set to an implementation-defined native locale.[m
[31m-If <code>locale</code> is the string "<code>C</code>",[m
[31m-the current locale is set to the standard C locale.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called with <b>nil</b> as the first argument,[m
[31m-this function only returns the name of the current locale[m
[31m-for the given category.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.time"><code>os.time ([table])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the current time when called without arguments,[m
[31m-or a time representing the date and time specified by the given table.[m
[31m-This table must have fields <code>year</code>, <code>month</code>, and <code>day</code>,[m
[31m-and may have fields <code>hour</code>, <code>min</code>, <code>sec</code>, and <code>isdst</code>[m
[31m-(for a description of these fields, see the <a href="#pdf-os.date"><code>os.date</code></a> function).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The returned value is a number, whose meaning depends on your system.[m
[31m-In POSIX, Windows, and some other systems, this number counts the number[m
[31m-of seconds since some given start time (the "epoch").[m
[31m-In other systems, the meaning is not specified,[m
[31m-and the number returned by <code>time</code> can be used only as an argument to[m
[31m-<code>date</code> and <code>difftime</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-os.tmpname"><code>os.tmpname ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a string with a file name that can[m
[31m-be used for a temporary file.[m
[31m-The file must be explicitly opened before its use[m
[31m-and explicitly removed when no longer needed.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-On some systems (POSIX),[m
[31m-this function also creates a file with that name,[m
[31m-to avoid security risks.[m
[31m-(Someone else might create the file with wrong permissions[m
[31m-in the time between getting the name and creating the file.)[m
[31m-You still have to open the file to use it[m
[31m-and to remove it (even if you do not use it).[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When possible,[m
[31m-you may prefer to use <a href="#pdf-io.tmpfile"><code>io.tmpfile</code></a>,[m
[31m-which automatically removes the file when the program ends.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>5.9 - <a name="5.9">The Debug Library</a></h2>[m
[31m-[m
[31m-<p>[m
[31m-This library provides[m
[31m-the functionality of the debug interface to Lua programs.[m
[31m-You should exert care when using this library.[m
[31m-The functions provided here should be used exclusively for debugging[m
[31m-and similar tasks, such as profiling.[m
[31m-Please resist the temptation to use them as a[m
[31m-usual programming tool:[m
[31m-they can be very slow.[m
[31m-Moreover, several of these functions[m
[31m-violate some assumptions about Lua code[m
[31m-(e.g., that variables local to a function[m
[31m-cannot be accessed from outside or[m
[31m-that userdata metatables cannot be changed by Lua code)[m
[31m-and therefore can compromise otherwise secure code.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All functions in this library are provided[m
[31m-inside the <a name="pdf-debug"><code>debug</code></a> table.[m
[31m-All functions that operate over a thread[m
[31m-have an optional first argument which is the[m
[31m-thread to operate over.[m
[31m-The default is always the current thread.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.debug"><code>debug.debug ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Enters an interactive mode with the user,[m
[31m-running each string that the user enters.[m
[31m-Using simple commands and other debug facilities,[m
[31m-the user can inspect global and local variables,[m
[31m-change their values, evaluate expressions, and so on.[m
[31m-A line containing only the word <code>cont</code> finishes this function,[m
[31m-so that the caller continues its execution.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Note that commands for <code>debug.debug</code> are not lexically nested[m
[31m-within any function, and so have no direct access to local variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getfenv"><code>debug.getfenv (o)</code></a></h3>[m
[31m-Returns the environment of object <code>o</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.gethook"><code>debug.gethook ([thread])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the current hook settings of the thread, as three values:[m
[31m-the current hook function, the current hook mask,[m
[31m-and the current hook count[m
[31m-(as set by the <a href="#pdf-debug.sethook"><code>debug.sethook</code></a> function).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getinfo"><code>debug.getinfo ([thread,] function [, what])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a table with information about a function.[m
[31m-You can give the function directly,[m
[31m-or you can give a number as the value of <code>function</code>,[m
[31m-which means the function running at level <code>function</code> of the call stack[m
[31m-of the given thread:[m
[31m-level&nbsp;0 is the current function (<code>getinfo</code> itself);[m
[31m-level&nbsp;1 is the function that called <code>getinfo</code>;[m
[31m-and so on.[m
[31m-If <code>function</code> is a number larger than the number of active functions,[m
[31m-then <code>getinfo</code> returns <b>nil</b>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-The returned table can contain all the fields returned by <a href="#lua_getinfo"><code>lua_getinfo</code></a>,[m
[31m-with the string <code>what</code> describing which fields to fill in.[m
[31m-The default for <code>what</code> is to get all information available,[m
[31m-except the table of valid lines.[m
[31m-If present,[m
[31m-the option '<code>f</code>'[m
[31m-adds a field named <code>func</code> with the function itself.[m
[31m-If present,[m
[31m-the option '<code>L</code>'[m
[31m-adds a field named <code>activelines</code> with the table of[m
[31m-valid lines.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-For instance, the expression <code>debug.getinfo(1,"n").name</code> returns[m
[31m-a table with a name for the current function,[m
[31m-if a reasonable name can be found,[m
[31m-and the expression <code>debug.getinfo(print)</code>[m
[31m-returns a table with all available information[m
[31m-about the <a href="#pdf-print"><code>print</code></a> function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getlocal"><code>debug.getlocal ([thread,] level, local)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the name and the value of the local variable[m
[31m-with index <code>local</code> of the function at level <code>level</code> of the stack.[m
[31m-(The first parameter or local variable has index&nbsp;1, and so on,[m
[31m-until the last active local variable.)[m
[31m-The function returns <b>nil</b> if there is no local[m
[31m-variable with the given index,[m
[31m-and raises an error when called with a <code>level</code> out of range.[m
[31m-(You can call <a href="#pdf-debug.getinfo"><code>debug.getinfo</code></a> to check whether the level is valid.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Variable names starting with '<code>(</code>' (open parentheses)[m
[31m-represent internal variables[m
[31m-(loop control variables, temporaries, and C&nbsp;function locals).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getmetatable"><code>debug.getmetatable (object)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the metatable of the given <code>object</code>[m
[31m-or <b>nil</b> if it does not have a metatable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getregistry"><code>debug.getregistry ()</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns the registry table (see <a href="#3.5">&sect;3.5</a>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.getupvalue"><code>debug.getupvalue (func, up)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function returns the name and the value of the upvalue[m
[31m-with index <code>up</code> of the function <code>func</code>.[m
[31m-The function returns <b>nil</b> if there is no upvalue with the given index.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.setfenv"><code>debug.setfenv (object, table)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the environment of the given <code>object</code> to the given <code>table</code>.[m
[31m-Returns <code>object</code>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.sethook"><code>debug.sethook ([thread,] hook, mask [, count])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the given function as a hook.[m
[31m-The string <code>mask</code> and the number <code>count</code> describe[m
[31m-when the hook will be called.[m
[31m-The string mask may have the following characters,[m
[31m-with the given meaning:[m
[31m-[m
[31m-<ul>[m
[31m-<li><b><code>"c"</code>:</b> the hook is called every time Lua calls a function;</li>[m
[31m-<li><b><code>"r"</code>:</b> the hook is called every time Lua returns from a function;</li>[m
[31m-<li><b><code>"l"</code>:</b> the hook is called every time Lua enters a new line of code.</li>[m
[31m-</ul><p>[m
[31m-With a <code>count</code> different from zero,[m
[31m-the hook is called after every <code>count</code> instructions.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When called without arguments,[m
[31m-<a href="#pdf-debug.sethook"><code>debug.sethook</code></a> turns off the hook.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-When the hook is called, its first parameter is a string[m
[31m-describing the event that has triggered its call:[m
[31m-<code>"call"</code>, <code>"return"</code> (or <code>"tail return"</code>,[m
[31m-when simulating a return from a tail call),[m
[31m-<code>"line"</code>, and <code>"count"</code>.[m
[31m-For line events,[m
[31m-the hook also gets the new line number as its second parameter.[m
[31m-Inside a hook,[m
[31m-you can call <code>getinfo</code> with level&nbsp;2 to get more information about[m
[31m-the running function[m
[31m-(level&nbsp;0 is the <code>getinfo</code> function,[m
[31m-and level&nbsp;1 is the hook function),[m
[31m-unless the event is <code>"tail return"</code>.[m
[31m-In this case, Lua is only simulating the return,[m
[31m-and a call to <code>getinfo</code> will return invalid data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.setlocal"><code>debug.setlocal ([thread,] level, local, value)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function assigns the value <code>value</code> to the local variable[m
[31m-with index <code>local</code> of the function at level <code>level</code> of the stack.[m
[31m-The function returns <b>nil</b> if there is no local[m
[31m-variable with the given index,[m
[31m-and raises an error when called with a <code>level</code> out of range.[m
[31m-(You can call <code>getinfo</code> to check whether the level is valid.)[m
[31m-Otherwise, it returns the name of the local variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.setmetatable"><code>debug.setmetatable (object, table)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Sets the metatable for the given <code>object</code> to the given <code>table</code>[m
[31m-(which can be <b>nil</b>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.setupvalue"><code>debug.setupvalue (func, up, value)</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-This function assigns the value <code>value</code> to the upvalue[m
[31m-with index <code>up</code> of the function <code>func</code>.[m
[31m-The function returns <b>nil</b> if there is no upvalue[m
[31m-with the given index.[m
[31m-Otherwise, it returns the name of the upvalue.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-<hr><h3><a name="pdf-debug.traceback"><code>debug.traceback ([thread,] [message [, level]])</code></a></h3>[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Returns a string with a traceback of the call stack.[m
[31m-An optional <code>message</code> string is appended[m
[31m-at the beginning of the traceback.[m
[31m-An optional <code>level</code> number tells at which level[m
[31m-to start the traceback[m
[31m-(default is 1, the function calling <code>traceback</code>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>6 - <a name="6">Lua Stand-alone</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-Although Lua has been designed as an extension language,[m
[31m-to be embedded in a host C&nbsp;program,[m
[31m-it is also frequently used as a stand-alone language.[m
[31m-An interpreter for Lua as a stand-alone language,[m
[31m-called simply <code>lua</code>,[m
[31m-is provided with the standard distribution.[m
[31m-The stand-alone interpreter includes[m
[31m-all standard libraries, including the debug library.[m
[31m-Its usage is:[m
[31m-[m
[31m-<pre>[m
[31m-     lua [options] [script [args]][m
[31m-</pre><p>[m
[31m-The options are:[m
[31m-[m
[31m-<ul>[m
[31m-<li><b><code>-e <em>stat</em></code>:</b> executes string <em>stat</em>;</li>[m
[31m-<li><b><code>-l <em>mod</em></code>:</b> "requires" <em>mod</em>;</li>[m
[31m-<li><b><code>-i</code>:</b> enters interactive mode after running <em>script</em>;</li>[m
[31m-<li><b><code>-v</code>:</b> prints version information;</li>[m
[31m-<li><b><code>--</code>:</b> stops handling options;</li>[m
[31m-<li><b><code>-</code>:</b> executes <code>stdin</code> as a file and stops handling options.</li>[m
[31m-</ul><p>[m
[31m-After handling its options, <code>lua</code> runs the given <em>script</em>,[m
[31m-passing to it the given <em>args</em> as string arguments.[m
[31m-When called without arguments,[m
[31m-<code>lua</code> behaves as <code>lua -v -i</code>[m
[31m-when the standard input (<code>stdin</code>) is a terminal,[m
[31m-and as <code>lua -</code> otherwise.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Before running any argument,[m
[31m-the interpreter checks for an environment variable <a name="pdf-LUA_INIT"><code>LUA_INIT</code></a>.[m
[31m-If its format is <code>@<em>filename</em></code>,[m
[31m-then <code>lua</code> executes the file.[m
[31m-Otherwise, <code>lua</code> executes the string itself.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-All options are handled in order, except <code>-i</code>.[m
[31m-For instance, an invocation like[m
[31m-[m
[31m-<pre>[m
[31m-     $ lua -e'a=1' -e 'print(a)' script.lua[m
[31m-</pre><p>[m
[31m-will first set <code>a</code> to 1, then print the value of <code>a</code> (which is '<code>1</code>'),[m
[31m-and finally run the file <code>script.lua</code> with no arguments.[m
[31m-(Here <code>$</code> is the shell prompt. Your prompt may be different.)[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-Before starting to run the script,[m
[31m-<code>lua</code> collects all arguments in the command line[m
[31m-in a global table called <code>arg</code>.[m
[31m-The script name is stored at index 0,[m
[31m-the first argument after the script name goes to index 1,[m
[31m-and so on.[m
[31m-Any arguments before the script name[m
[31m-(that is, the interpreter name plus the options)[m
[31m-go to negative indices.[m
[31m-For instance, in the call[m
[31m-[m
[31m-<pre>[m
[31m-     $ lua -la b.lua t1 t2[m
[31m-</pre><p>[m
[31m-the interpreter first runs the file <code>a.lua</code>,[m
[31m-then creates a table[m
[31m-[m
[31m-<pre>[m
[31m-     arg = { [-2] = "lua", [-1] = "-la",[m
[31m-             [0] = "b.lua",[m
[31m-             [1] = "t1", [2] = "t2" }[m
[31m-</pre><p>[m
[31m-and finally runs the file <code>b.lua</code>.[m
[31m-The script is called with <code>arg[1]</code>, <code>arg[2]</code>, &middot;&middot;&middot;[m
[31m-as arguments;[m
[31m-it can also access these arguments with the vararg expression '<code>...</code>'.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-In interactive mode,[m
[31m-if you write an incomplete statement,[m
[31m-the interpreter waits for its completion[m
[31m-by issuing a different prompt.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-If the global variable <a name="pdf-_PROMPT"><code>_PROMPT</code></a> contains a string,[m
[31m-then its value is used as the prompt.[m
[31m-Similarly, if the global variable <a name="pdf-_PROMPT2"><code>_PROMPT2</code></a> contains a string,[m
[31m-its value is used as the secondary prompt[m
[31m-(issued during incomplete statements).[m
[31m-Therefore, both prompts can be changed directly on the command line[m
[31m-or in any Lua programs by assigning to <code>_PROMPT</code>.[m
[31m-See the next example:[m
[31m-[m
[31m-<pre>[m
[31m-     $ lua -e"_PROMPT='myprompt&gt; '" -i[m
[31m-</pre><p>[m
[31m-(The outer pair of quotes is for the shell,[m
[31m-the inner pair is for Lua.)[m
[31m-Note the use of <code>-i</code> to enter interactive mode;[m
[31m-otherwise,[m
[31m-the program would just end silently[m
[31m-right after the assignment to <code>_PROMPT</code>.[m
[31m-[m
[31m-[m
[31m-<p>[m
[31m-To allow the use of Lua as a[m
[31m-script interpreter in Unix systems,[m
[31m-the stand-alone interpreter skips[m
[31m-the first line of a chunk if it starts with <code>#</code>.[m
[31m-Therefore, Lua scripts can be made into executable programs[m
[31m-by using <code>chmod +x</code> and the&nbsp;<code>#!</code> form,[m
[31m-as in[m
[31m-[m
[31m-<pre>[m
[31m-     #!/usr/local/bin/lua[m
[31m-</pre><p>[m
[31m-(Of course,[m
[31m-the location of the Lua interpreter may be different in your machine.[m
[31m-If <code>lua</code> is in your <code>PATH</code>,[m
[31m-then [m
[31m-[m
[31m-<pre>[m
[31m-     #!/usr/bin/env lua[m
[31m-</pre><p>[m
[31m-is a more portable solution.) [m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>7 - <a name="7">Incompatibilities with the Previous Version</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-Here we list the incompatibilities that you may find when moving a program[m
[31m-from Lua&nbsp;5.0 to Lua&nbsp;5.1.[m
[31m-You can avoid most of the incompatibilities compiling Lua with[m
[31m-appropriate options (see file <code>luaconf.h</code>).[m
[31m-However,[m
[31m-all these compatibility options will be removed in the next version of Lua.[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>7.1 - <a name="7.1">Changes in the Language</a></h2>[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-The vararg system changed from the pseudo-argument <code>arg</code> with a[m
[31m-table with the extra arguments to the vararg expression.[m
[31m-(See compile-time option <code>LUA_COMPAT_VARARG</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-There was a subtle change in the scope of the implicit[m
[31m-variables of the <b>for</b> statement and for the <b>repeat</b> statement.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-The long string/long comment syntax (<code>[[<em>string</em>]]</code>)[m
[31m-does not allow nesting.[m
[31m-You can use the new syntax (<code>[=[<em>string</em>]=]</code>) in these cases.[m
[31m-(See compile-time option <code>LUA_COMPAT_LSTR</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>7.2 - <a name="7.2">Changes in the Libraries</a></h2>[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>string.gfind</code> was renamed <a href="#pdf-string.gmatch"><code>string.gmatch</code></a>.[m
[31m-(See compile-time option <code>LUA_COMPAT_GFIND</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-When <a href="#pdf-string.gsub"><code>string.gsub</code></a> is called with a function as its[m
[31m-third argument,[m
[31m-whenever this function returns <b>nil</b> or <b>false</b> the[m
[31m-replacement string is the whole match,[m
[31m-instead of the empty string.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>table.setn</code> was deprecated.[m
[31m-Function <code>table.getn</code> corresponds[m
[31m-to the new length operator (<code>#</code>);[m
[31m-use the operator instead of the function.[m
[31m-(See compile-time option <code>LUA_COMPAT_GETN</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>loadlib</code> was renamed <a href="#pdf-package.loadlib"><code>package.loadlib</code></a>.[m
[31m-(See compile-time option <code>LUA_COMPAT_LOADLIB</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>math.mod</code> was renamed <a href="#pdf-math.fmod"><code>math.fmod</code></a>.[m
[31m-(See compile-time option <code>LUA_COMPAT_MOD</code> in <code>luaconf.h</code>.)[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Functions <code>table.foreach</code> and <code>table.foreachi</code> are deprecated.[m
[31m-You can use a for loop with <code>pairs</code> or <code>ipairs</code> instead.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-There were substantial changes in function <a href="#pdf-require"><code>require</code></a> due to[m
[31m-the new module system.[m
[31m-However, the new behavior is mostly compatible with the old,[m
[31m-but <code>require</code> gets the path from <a href="#pdf-package.path"><code>package.path</code></a> instead[m
[31m-of from <code>LUA_PATH</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <a href="#pdf-collectgarbage"><code>collectgarbage</code></a> has different arguments.[m
[31m-Function <code>gcinfo</code> is deprecated;[m
[31m-use <code>collectgarbage("count")</code> instead.[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h2>7.3 - <a name="7.3">Changes in the API</a></h2>[m
[31m-<ul>[m
[31m-[m
[31m-<li>[m
[31m-The <code>luaopen_*</code> functions (to open libraries)[m
[31m-cannot be called directly,[m
[31m-like a regular C function.[m
[31m-They must be called through Lua,[m
[31m-like a Lua function.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>lua_open</code> was replaced by <a href="#lua_newstate"><code>lua_newstate</code></a> to[m
[31m-allow the user to set a memory-allocation function.[m
[31m-You can use <a href="#luaL_newstate"><code>luaL_newstate</code></a> from the standard library to[m
[31m-create a state with a standard allocation function[m
[31m-(based on <code>realloc</code>).[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Functions <code>luaL_getn</code> and <code>luaL_setn</code>[m
[31m-(from the auxiliary library) are deprecated.[m
[31m-Use <a href="#lua_objlen"><code>lua_objlen</code></a> instead of <code>luaL_getn</code>[m
[31m-and nothing instead of <code>luaL_setn</code>.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>luaL_openlib</code> was replaced by <a href="#luaL_register"><code>luaL_register</code></a>.[m
[31m-</li>[m
[31m-[m
[31m-<li>[m
[31m-Function <code>luaL_checkudata</code> now throws an error when the given value[m
[31m-is not a userdata of the expected type.[m
[31m-(In Lua&nbsp;5.0 it returned <code>NULL</code>.)[m
[31m-</li>[m
[31m-[m
[31m-</ul>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<h1>8 - <a name="8">The Complete Syntax of Lua</a></h1>[m
[31m-[m
[31m-<p>[m
[31m-Here is the complete syntax of Lua in extended BNF.[m
[31m-(It does not describe operator precedences.)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<pre>[m
[31m-[m
[31m-	chunk ::= {stat [`<b>;</b>&acute;]} [laststat [`<b>;</b>&acute;]][m
[31m-[m
[31m-	block ::= chunk[m
[31m-[m
[31m-	stat ::=  varlist `<b>=</b>&acute; explist | [m
[31m-		 functioncall | [m
[31m-		 <b>do</b> block <b>end</b> | [m
[31m-		 <b>while</b> exp <b>do</b> block <b>end</b> | [m
[31m-		 <b>repeat</b> block <b>until</b> exp | [m
[31m-		 <b>if</b> exp <b>then</b> block {<b>elseif</b> exp <b>then</b> block} [<b>else</b> block] <b>end</b> | [m
[31m-		 <b>for</b> Name `<b>=</b>&acute; exp `<b>,</b>&acute; exp [`<b>,</b>&acute; exp] <b>do</b> block <b>end</b> | [m
[31m-		 <b>for</b> namelist <b>in</b> explist <b>do</b> block <b>end</b> | [m
[31m-		 <b>function</b> funcname funcbody | [m
[31m-		 <b>local</b> <b>function</b> Name funcbody | [m
[31m-		 <b>local</b> namelist [`<b>=</b>&acute; explist] [m
[31m-[m
[31m-	laststat ::= <b>return</b> [explist] | <b>break</b>[m
[31m-[m
[31m-	funcname ::= Name {`<b>.</b>&acute; Name} [`<b>:</b>&acute; Name][m
[31m-[m
[31m-	varlist ::= var {`<b>,</b>&acute; var}[m
[31m-[m
[31m-	var ::=  Name | prefixexp `<b>[</b>&acute; exp `<b>]</b>&acute; | prefixexp `<b>.</b>&acute; Name [m
[31m-[m
[31m-	namelist ::= Name {`<b>,</b>&acute; Name}[m
[31m-[m
[31m-	explist ::= {exp `<b>,</b>&acute;} exp[m
[31m-[m
[31m-	exp ::=  <b>nil</b> | <b>false</b> | <b>true</b> | Number | String | `<b>...</b>&acute; | function | [m
[31m-		 prefixexp | tableconstructor | exp binop exp | unop exp [m
[31m-[m
[31m-	prefixexp ::= var | functioncall | `<b>(</b>&acute; exp `<b>)</b>&acute;[m
[31m-[m
[31m-	functioncall ::=  prefixexp args | prefixexp `<b>:</b>&acute; Name args [m
[31m-[m
[31m-	args ::=  `<b>(</b>&acute; [explist] `<b>)</b>&acute; | tableconstructor | String [m
[31m-[m
[31m-	function ::= <b>function</b> funcbody[m
[31m-[m
[31m-	funcbody ::= `<b>(</b>&acute; [parlist] `<b>)</b>&acute; block <b>end</b>[m
[31m-[m
[31m-	parlist ::= namelist [`<b>,</b>&acute; `<b>...</b>&acute;] | `<b>...</b>&acute;[m
[31m-[m
[31m-	tableconstructor ::= `<b>{</b>&acute; [fieldlist] `<b>}</b>&acute;[m
[31m-[m
[31m-	fieldlist ::= field {fieldsep field} [fieldsep][m
[31m-[m
[31m-	field ::= `<b>[</b>&acute; exp `<b>]</b>&acute; `<b>=</b>&acute; exp | Name `<b>=</b>&acute; exp | exp[m
[31m-[m
[31m-	fieldsep ::= `<b>,</b>&acute; | `<b>;</b>&acute;[m
[31m-[m
[31m-	binop ::= `<b>+</b>&acute; | `<b>-</b>&acute; | `<b>*</b>&acute; | `<b>/</b>&acute; | `<b>^</b>&acute; | `<b>%</b>&acute; | `<b>..</b>&acute; | [m
[31m-		 `<b>&lt;</b>&acute; | `<b>&lt;=</b>&acute; | `<b>&gt;</b>&acute; | `<b>&gt;=</b>&acute; | `<b>==</b>&acute; | `<b>~=</b>&acute; | [m
[31m-		 <b>and</b> | <b>or</b>[m
[31m-[m
[31m-	unop ::= `<b>-</b>&acute; | <b>not</b> | `<b>#</b>&acute;[m
[31m-[m
[31m-</pre>[m
[31m-[m
[31m-<p>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-<HR>[m
[31m-<SMALL CLASS="footer">[m
[31m-Last update:[m
[31m-Mon Feb 13 18:54:19 BRST 2012[m
[31m-</SMALL>[m
[31m-<!--[m
[31m-Last change: revised for Lua 5.1.5[m
[31m--->[m
[31m-[m
[31m-</body></html>[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/readme.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/readme.html[m
[1mdeleted file mode 100644[m
[1mindex 3ed6a81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/doc/readme.html[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-<HTML>[m
[31m-<HEAD>[m
[31m-<TITLE>Lua documentation</TITLE>[m
[31m-<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">[m
[31m-</HEAD>[m
[31m-[m
[31m-<BODY>[m
[31m-[m
[31m-<HR>[m
[31m-<H1>[m
[31m-<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua" BORDER=0></A>[m
[31m-Documentation[m
[31m-</H1>[m
[31m-[m
[31m-This is the documentation included in the source distribution of Lua 5.1.5.[m
[31m-[m
[31m-<UL>[m
[31m-<LI><A HREF="contents.html">Reference manual</A>[m
[31m-<LI><A HREF="lua.html">lua man page</A>[m
[31m-<LI><A HREF="luac.html">luac man page</A>[m
[31m-<LI><A HREF="../README">lua/README</A>[m
[31m-<LI><A HREF="../etc/README">lua/etc/README</A>[m
[31m-<LI><A HREF="../test/README">lua/test/README</A>[m
[31m-</UL>[m
[31m-[m
[31m-Lua's[m
[31m-<A HREF="http://www.lua.org/">official web site</A>[m
[31m-contains updated documentation,[m
[31m-especially the[m
[31m-<A HREF="http://www.lua.org/manual/5.1/">reference manual</A>.[m
[31m-<P>[m
[31m-[m
[31m-<HR>[m
[31m-<SMALL>[m
[31m-Last update:[m
[31m-Fri Feb  3 09:44:42 BRST 2012[m
[31m-</SMALL>[m
[31m-[m
[31m-</BODY>[m
[31m-</HTML>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 6d00008..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-# makefile for Lua etc[m
[31m-[m
[31m-TOP= ..[m
[31m-LIB= $(TOP)/src[m
[31m-INC= $(TOP)/src[m
[31m-BIN= $(TOP)/src[m
[31m-SRC= $(TOP)/src[m
[31m-TST= $(TOP)/test[m
[31m-[m
[31m-CC= gcc[m
[31m-CFLAGS= -O2 -Wall -I$(INC) $(MYCFLAGS)[m
[31m-MYCFLAGS= [m
[31m-MYLDFLAGS= -Wl,-E[m
[31m-MYLIBS= -lm[m
[31m-#MYLIBS= -lm -Wl,-E -ldl -lreadline -lhistory -lncurses[m
[31m-RM= rm -f[m
[31m-[m
[31m-default:[m
[31m-	@echo 'Please choose a target: min noparser one strict clean'[m
[31m-[m
[31m-min:	min.c[m
[31m-	$(CC) $(CFLAGS) $@.c -L$(LIB) -llua $(MYLIBS)[m
[31m-	echo 'print"Hello there!"' | ./a.out[m
[31m-[m
[31m-noparser: noparser.o[m
[31m-	$(CC) noparser.o $(SRC)/lua.o -L$(LIB) -llua $(MYLIBS)[m
[31m-	$(BIN)/luac $(TST)/hello.lua[m
[31m-	-./a.out luac.out[m
[31m-	-./a.out -e'a=1'[m
[31m-[m
[31m-one:[m
[31m-	$(CC) $(CFLAGS) all.c $(MYLIBS)[m
[31m-	./a.out $(TST)/hello.lua[m
[31m-[m
[31m-strict:[m
[31m-	-$(BIN)/lua -e 'print(a);b=2'[m
[31m-	-$(BIN)/lua -lstrict -e 'print(a)'[m
[31m-	-$(BIN)/lua -e 'function f() b=2 end f()'[m
[31m-	-$(BIN)/lua -lstrict -e 'function f() b=2 end f()'[m
[31m-[m
[31m-clean:[m
[31m-	$(RM) a.out core core.* *.o luac.out[m
[31m-[m
[31m-.PHONY:	default min noparser one strict clean[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/README[m
[1mdeleted file mode 100644[m
[1mindex 5149fc9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/README[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-This directory contains some useful files and code.[m
[31m-Unlike the code in ../src, everything here is in the public domain.[m
[31m-[m
[31m-If any of the makes fail, you're probably not using the same libraries[m
[31m-used to build Lua. Set MYLIBS in Makefile accordingly.[m
[31m-[m
[31m-all.c[m
[31m-	Full Lua interpreter in a single file.[m
[31m-	Do "make one" for a demo.[m
[31m-[m
[31m-lua.hpp[m
[31m-	Lua header files for C++ using 'extern "C"'.[m
[31m-[m
[31m-lua.ico[m
[31m-	A Lua icon for Windows (and web sites: save as favicon.ico).[m
[31m-	Drawn by hand by Markus Gritsch <gritsch@iue.tuwien.ac.at>.[m
[31m-[m
[31m-lua.pc[m
[31m-	pkg-config data for Lua[m
[31m-[m
[31m-luavs.bat[m
[31m-	Script to build Lua under "Visual Studio .NET Command Prompt".[m
[31m-	Run it from the toplevel as etc\luavs.bat.[m
[31m-[m
[31m-min.c[m
[31m-	A minimal Lua interpreter.[m
[31m-	Good for learning and for starting your own.[m
[31m-	Do "make min" for a demo.[m
[31m-[m
[31m-noparser.c[m
[31m-	Linking with noparser.o avoids loading the parsing modules in lualib.a.[m
[31m-	Do "make noparser" for a demo.[m
[31m-[m
[31m-strict.lua[m
[31m-	Traps uses of undeclared global variables.[m
[31m-	Do "make strict" for a demo.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/all.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/all.c[m
[1mdeleted file mode 100644[m
[1mindex dab68fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/all.c[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-/*[m
[31m-* all.c -- Lua core, libraries and interpreter in a single file[m
[31m-*/[m
[31m-[m
[31m-#define luaall_c[m
[31m-[m
[31m-#include "lapi.c"[m
[31m-#include "lcode.c"[m
[31m-#include "ldebug.c"[m
[31m-#include "ldo.c"[m
[31m-#include "ldump.c"[m
[31m-#include "lfunc.c"[m
[31m-#include "lgc.c"[m
[31m-#include "llex.c"[m
[31m-#include "lmem.c"[m
[31m-#include "lobject.c"[m
[31m-#include "lopcodes.c"[m
[31m-#include "lparser.c"[m
[31m-#include "lstate.c"[m
[31m-#include "lstring.c"[m
[31m-#include "ltable.c"[m
[31m-#include "ltm.c"[m
[31m-#include "lundump.c"[m
[31m-#include "lvm.c"[m
[31m-#include "lzio.c"[m
[31m-[m
[31m-#include "lauxlib.c"[m
[31m-#include "lbaselib.c"[m
[31m-#include "ldblib.c"[m
[31m-#include "liolib.c"[m
[31m-#include "linit.c"[m
[31m-#include "lmathlib.c"[m
[31m-#include "loadlib.c"[m
[31m-#include "loslib.c"[m
[31m-#include "lstrlib.c"[m
[31m-#include "ltablib.c"[m
[31m-[m
[31m-#include "lua.c"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.hpp b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.hpp[m
[1mdeleted file mode 100644[m
[1mindex ec417f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.hpp[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-// lua.hpp[m
[31m-// Lua header files for C++[m
[31m-// <<extern "C">> not supplied automatically because Lua also compiles as C++[m
[31m-[m
[31m-extern "C" {[m
[31m-#include "lua.h"[m
[31m-#include "lualib.h"[m
[31m-#include "lauxlib.h"[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.ico b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.ico[m
[1mdeleted file mode 100644[m
[1mindex ccbabc4..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.ico and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.pc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.pc[m
[1mdeleted file mode 100644[m
[1mindex 07e2852..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/lua.pc[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-# lua.pc -- pkg-config data for Lua[m
[31m-[m
[31m-# vars from install Makefile[m
[31m-[m
[31m-# grep '^V=' ../Makefile[m
[31m-V= 5.1[m
[31m-# grep '^R=' ../Makefile[m
[31m-R= 5.1.5[m
[31m-[m
[31m-# grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/'[m
[31m-prefix= /usr/local[m
[31m-INSTALL_BIN= ${prefix}/bin[m
[31m-INSTALL_INC= ${prefix}/include[m
[31m-INSTALL_LIB= ${prefix}/lib[m
[31m-INSTALL_MAN= ${prefix}/man/man1[m
[31m-INSTALL_LMOD= ${prefix}/share/lua/${V}[m
[31m-INSTALL_CMOD= ${prefix}/lib/lua/${V}[m
[31m-[m
[31m-# canonical vars[m
[31m-exec_prefix=${prefix}[m
[31m-libdir=${exec_prefix}/lib[m
[31m-includedir=${prefix}/include[m
[31m-[m
[31m-Name: Lua[m
[31m-Description: An Extensible Extension Language[m
[31m-Version: ${R}[m
[31m-Requires: [m
[31m-Libs: -L${libdir} -llua -lm[m
[31m-Cflags: -I${includedir}[m
[31m-[m
[31m-# (end of lua.pc)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/luavs.bat b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/luavs.bat[m
[1mdeleted file mode 100644[m
[1mindex 08c2bed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/luavs.bat[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-@rem Script to build Lua under "Visual Studio .NET Command Prompt".[m
[31m-@rem Do not run from this directory; run it from the toplevel: etc\luavs.bat .[m
[31m-@rem It creates lua51.dll, lua51.lib, lua.exe, and luac.exe in src.[m
[31m-@rem (contributed by David Manura and Mike Pall)[m
[31m-[m
[31m-@setlocal[m
[31m-@set MYCOMPILE=cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE[m
[31m-@set MYLINK=link /nologo[m
[31m-@set MYMT=mt /nologo[m
[31m-[m
[31m-cd src[m
[31m-%MYCOMPILE% /DLUA_BUILD_AS_DLL l*.c[m
[31m-del lua.obj luac.obj[m
[31m-%MYLINK% /DLL /out:lua51.dll l*.obj[m
[31m-if exist lua51.dll.manifest^[m
[31m-  %MYMT% -manifest lua51.dll.manifest -outputresource:lua51.dll;2[m
[31m-%MYCOMPILE% /DLUA_BUILD_AS_DLL lua.c[m
[31m-%MYLINK% /out:lua.exe lua.obj lua51.lib[m
[31m-if exist lua.exe.manifest^[m
[31m-  %MYMT% -manifest lua.exe.manifest -outputresource:lua.exe[m
[31m-%MYCOMPILE% l*.c print.c[m
[31m-del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathlib.obj^[m
[31m-    loslib.obj ltablib.obj lstrlib.obj loadlib.obj[m
[31m-%MYLINK% /out:luac.exe *.obj[m
[31m-if exist luac.exe.manifest^[m
[31m-  %MYMT% -manifest luac.exe.manifest -outputresource:luac.exe[m
[31m-del *.obj *.manifest[m
[31m-cd ..[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/min.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/min.c[m
[1mdeleted file mode 100644[m
[1mindex 6a85a4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/min.c[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-/*[m
[31m-* min.c -- a minimal Lua interpreter[m
[31m-* loads stdin only with minimal error handling.[m
[31m-* no interaction, and no standard library, only a "print" function.[m
[31m-*/[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-static int print(lua_State *L)[m
[31m-{[m
[31m- int n=lua_gettop(L);[m
[31m- int i;[m
[31m- for (i=1; i<=n; i++)[m
[31m- {[m
[31m-  if (i>1) printf("\t");[m
[31m-  if (lua_isstring(L,i))[m
[31m-   printf("%s",lua_tostring(L,i));[m
[31m-  else if (lua_isnil(L,i))[m
[31m-   printf("%s","nil");[m
[31m-  else if (lua_isboolean(L,i))[m
[31m-   printf("%s",lua_toboolean(L,i) ? "true" : "false");[m
[31m-  else[m
[31m-   printf("%s:%p",luaL_typename(L,i),lua_topointer(L,i));[m
[31m- }[m
[31m- printf("\n");[m
[31m- return 0;[m
[31m-}[m
[31m-[m
[31m-int main(void)[m
[31m-{[m
[31m- lua_State *L=lua_open();[m
[31m- lua_register(L,"print",print);[m
[31m- if (luaL_dofile(L,NULL)!=0) fprintf(stderr,"%s\n",lua_tostring(L,-1));[m
[31m- lua_close(L);[m
[31m- return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/noparser.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/noparser.c[m
[1mdeleted file mode 100644[m
[1mindex 13ba546..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/noparser.c[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-/*[m
[31m-* The code below can be used to make a Lua core that does not contain the[m
[31m-* parsing modules (lcode, llex, lparser), which represent 35% of the total core.[m
[31m-* You'll only be able to load binary files and strings, precompiled with luac.[m
[31m-* (Of course, you'll have to build luac with the original parsing modules!)[m
[31m-*[m
[31m-* To use this module, simply compile it ("make noparser" does that) and list[m
[31m-* its object file before the Lua libraries. The linker should then not load[m
[31m-* the parsing modules. To try it, do "make luab".[m
[31m-*[m
[31m-* If you also want to avoid the dump module (ldump.o), define NODUMP.[m
[31m-* #define NODUMP[m
[31m-*/[m
[31m-[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "llex.h"[m
[31m-#include "lparser.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-LUAI_FUNC void luaX_init (lua_State *L) {[m
[31m-  UNUSED(L);[m
[31m-}[m
[31m-[m
[31m-LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {[m
[31m-  UNUSED(z);[m
[31m-  UNUSED(buff);[m
[31m-  UNUSED(name);[m
[31m-  lua_pushliteral(L,"parser not loaded");[m
[31m-  lua_error(L);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-#ifdef NODUMP[m
[31m-#include "lundump.h"[m
[31m-[m
[31m-LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) {[m
[31m-  UNUSED(f);[m
[31m-  UNUSED(w);[m
[31m-  UNUSED(data);[m
[31m-  UNUSED(strip);[m
[31m-#if 1[m
[31m-  UNUSED(L);[m
[31m-  return 0;[m
[31m-#else[m
[31m-  lua_pushliteral(L,"dumper not loaded");[m
[31m-  lua_error(L);[m
[31m-#endif[m
[31m-}[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/strict.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/strict.lua[m
[1mdeleted file mode 100644[m
[1mindex 604619d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/etc/strict.lua[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m---[m
[31m--- strict.lua[m
[31m--- checks uses of undeclared global variables[m
[31m--- All global variables must be 'declared' through a regular assignment[m
[31m--- (even assigning nil will do) in a main chunk before being used[m
[31m--- anywhere or assigned to inside a function.[m
[31m---[m
[31m-[m
[31m-local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget[m
[31m-[m
[31m-local mt = getmetatable(_G)[m
[31m-if mt == nil then[m
[31m-  mt = {}[m
[31m-  setmetatable(_G, mt)[m
[31m-end[m
[31m-[m
[31m-mt.__declared = {}[m
[31m-[m
[31m-local function what ()[m
[31m-  local d = getinfo(3, "S")[m
[31m-  return d and d.what or "C"[m
[31m-end[m
[31m-[m
[31m-mt.__newindex = function (t, n, v)[m
[31m-  if not mt.__declared[n] then[m
[31m-    local w = what()[m
[31m-    if w ~= "main" and w ~= "C" then[m
[31m-      error("assign to undeclared variable '"..n.."'", 2)[m
[31m-    end[m
[31m-    mt.__declared[n] = true[m
[31m-  end[m
[31m-  rawset(t, n, v)[m
[31m-end[m
[31m-  [m
[31m-mt.__index = function (t, n)[m
[31m-  if not mt.__declared[n] and what() ~= "C" then[m
[31m-    error("variable '"..n.."' is not declared", 2)[m
[31m-  end[m
[31m-  return rawget(t, n)[m
[31m-end[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 60fec1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,182 +0,0 @@[m
[31m-# makefile for building Lua[m
[31m-# see ../INSTALL for installation instructions[m
[31m-# see ../Makefile and luaconf.h for further customization[m
[31m-[m
[31m-# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================[m
[31m-[m
[31m-# Your platform. See PLATS for possible values.[m
[31m-PLAT= none[m
[31m-[m
[31m-CC= gcc[m
[31m-CFLAGS= -g -O2 -Wall $(MYCFLAGS)[m
[31m-AR= ar rcu[m
[31m-RANLIB= ranlib[m
[31m-RM= rm -f[m
[31m-LIBS= -lm $(MYLIBS)[m
[31m-[m
[31m-MYCFLAGS=[m
[31m-MYLDFLAGS=[m
[31m-MYLIBS=[m
[31m-[m
[31m-# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE =========[m
[31m-[m
[31m-PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris[m
[31m-[m
[31m-LUA_A=	liblua.a[m
[31m-CORE_O=	lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \[m
[31m-	lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o  \[m
[31m-	lundump.o lvm.o lzio.o[m
[31m-LIB_O=	lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \[m
[31m-	lstrlib.o loadlib.o linit.o[m
[31m-[m
[31m-LUA_T=	lua[m
[31m-LUA_O=	lua.o[m
[31m-[m
[31m-LUAC_T=	luac[m
[31m-LUAC_O=	luac.o print.o[m
[31m-[m
[31m-ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)[m
[31m-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)[m
[31m-ALL_A= $(LUA_A)[m
[31m-[m
[31m-default: $(PLAT)[m
[31m-[m
[31m-all:	$(ALL_T)[m
[31m-[m
[31m-o:	$(ALL_O)[m
[31m-[m
[31m-a:	$(ALL_A)[m
[31m-[m
[31m-$(LUA_A): $(CORE_O) $(LIB_O)[m
[31m-	$(AR) $@ $(CORE_O) $(LIB_O)	# DLL needs all object files[m
[31m-	$(RANLIB) $@[m
[31m-[m
[31m-$(LUA_T): $(LUA_O) $(LUA_A)[m
[31m-	$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)[m
[31m-[m
[31m-$(LUAC_T): $(LUAC_O) $(LUA_A)[m
[31m-	$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)[m
[31m-[m
[31m-clean:[m
[31m-	$(RM) $(ALL_T) $(ALL_O)[m
[31m-[m
[31m-depend:[m
[31m-	@$(CC) $(CFLAGS) -MM l*.c print.c[m
[31m-[m
[31m-echo:[m
[31m-	@echo "PLAT = $(PLAT)"[m
[31m-	@echo "CC = $(CC)"[m
[31m-	@echo "CFLAGS = $(CFLAGS)"[m
[31m-	@echo "AR = $(AR)"[m
[31m-	@echo "RANLIB = $(RANLIB)"[m
[31m-	@echo "RM = $(RM)"[m
[31m-	@echo "MYCFLAGS = $(MYCFLAGS)"[m
[31m-	@echo "MYLDFLAGS = $(MYLDFLAGS)"[m
[31m-	@echo "MYLIBS = $(MYLIBS)"[m
[31m-[m
[31m-# convenience targets for popular platforms[m
[31m-[m
[31m-none:[m
[31m-	@echo "Please choose a platform:"[m
[31m-	@echo "   $(PLATS)"[m
[31m-[m
[31m-aix:[m
[31m-	$(MAKE) all CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall"[m
[31m-[m
[31m-ansi:[m
[31m-	$(MAKE) all MYCFLAGS=-DLUA_ANSI[m
[31m-[m
[31m-bsd:[m
[31m-	$(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-Wl,-E"[m
[31m-[m
[31m-freebsd:[m
[31m-	$(MAKE) all MYCFLAGS="-DLUA_USE_LINUX" MYLIBS="-Wl,-E -lreadline"[m
[31m-[m
[31m-generic:[m
[31m-	$(MAKE) all MYCFLAGS=[m
[31m-[m
[31m-linux:[m
[31m-	$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"[m
[31m-[m
[31m-macosx:[m
[31m-	$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline"[m
[31m-# use this on Mac OS X 10.3-[m
[31m-#	$(MAKE) all MYCFLAGS=-DLUA_USE_MACOSX[m
[31m-[m
[31m-mingw:[m
[31m-	$(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \[m
[31m-	"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \[m
[31m-	"MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe[m
[31m-	$(MAKE) "LUAC_T=luac.exe" luac.exe[m
[31m-[m
[31m-posix:[m
[31m-	$(MAKE) all MYCFLAGS=-DLUA_USE_POSIX[m
[31m-[m
[31m-solaris:[m
[31m-	$(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl"[m
[31m-[m
[31m-# list targets that do not create files (but not all makes understand .PHONY)[m
[31m-.PHONY: all $(PLATS) default o a clean depend echo none[m
[31m-[m
[31m-# DO NOT DELETE[m
[31m-[m
[31m-lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \[m
[31m-  lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \[m
[31m-  lundump.h lvm.h[m
[31m-lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h[m
[31m-lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \[m
[31m-  lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h \[m
[31m-  ltable.h[m
[31m-ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \[m
[31m-  llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \[m
[31m-  lfunc.h lstring.h lgc.h ltable.h lvm.h[m
[31m-ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \[m
[31m-  lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h \[m
[31m-  ltable.h lundump.h lvm.h[m
[31m-ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \[m
[31m-  lzio.h lmem.h lundump.h[m
[31m-lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \[m
[31m-  lstate.h ltm.h lzio.h[m
[31m-lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \[m
[31m-  lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h[m
[31m-linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h[m
[31m-liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \[m
[31m-  lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h[m
[31m-lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \[m
[31m-  ltm.h lzio.h lmem.h ldo.h[m
[31m-loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \[m
[31m-  ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h[m
[31m-lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h[m
[31m-loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \[m
[31m-  lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \[m
[31m-  lfunc.h lstring.h lgc.h ltable.h[m
[31m-lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \[m
[31m-  ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h[m
[31m-lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \[m
[31m-  ltm.h lzio.h lstring.h lgc.h[m
[31m-lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \[m
[31m-  ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h[m
[31m-ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \[m
[31m-  lmem.h lstring.h lgc.h ltable.h[m
[31m-lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h[m
[31m-luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \[m
[31m-  lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h \[m
[31m-  lundump.h[m
[31m-lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \[m
[31m-  llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h[m
[31m-lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \[m
[31m-  lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h[m
[31m-lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \[m
[31m-  lzio.h[m
[31m-print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \[m
[31m-  ltm.h lzio.h lmem.h lopcodes.h lundump.h[m
[31m-[m
[31m-# (end of Makefile)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lapi.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lapi.c[m
[1mdeleted file mode 100644[m
[1mindex 5d5145d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lapi.c[m
[1m+++ /dev/null[m
[36m@@ -1,1087 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $[m
[31m-** Lua API[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <assert.h>[m
[31m-#include <math.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lapi_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lapi.h"[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lundump.h"[m
[31m-#include "lvm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-const char lua_ident[] =[m
[31m-  "$Lua: " LUA_RELEASE " " LUA_COPYRIGHT " $\n"[m
[31m-  "$Authors: " LUA_AUTHORS " $\n"[m
[31m-  "$URL: www.lua.org $\n";[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define api_checknelems(L, n)	api_check(L, (n) <= (L->top - L->base))[m
[31m-[m
[31m-#define api_checkvalidindex(L, i)	api_check(L, (i) != luaO_nilobject)[m
[31m-[m
[31m-#define api_incr_top(L)   {api_check(L, L->top < L->ci->top); L->top++;}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static TValue *index2adr (lua_State *L, int idx) {[m
[31m-  if (idx > 0) {[m
[31m-    TValue *o = L->base + (idx - 1);[m
[31m-    api_check(L, idx <= L->ci->top - L->base);[m
[31m-    if (o >= L->top) return cast(TValue *, luaO_nilobject);[m
[31m-    else return o;[m
[31m-  }[m
[31m-  else if (idx > LUA_REGISTRYINDEX) {[m
[31m-    api_check(L, idx != 0 && -idx <= L->top - L->base);[m
[31m-    return L->top + idx;[m
[31m-  }[m
[31m-  else switch (idx) {  /* pseudo-indices */[m
[31m-    case LUA_REGISTRYINDEX: return registry(L);[m
[31m-    case LUA_ENVIRONINDEX: {[m
[31m-      Closure *func = curr_func(L);[m
[31m-      sethvalue(L, &L->env, func->c.env);[m
[31m-      return &L->env;[m
[31m-    }[m
[31m-    case LUA_GLOBALSINDEX: return gt(L);[m
[31m-    default: {[m
[31m-      Closure *func = curr_func(L);[m
[31m-      idx = LUA_GLOBALSINDEX - idx;[m
[31m-      return (idx <= func->c.nupvalues)[m
[31m-                ? &func->c.upvalue[idx-1][m
[31m-                : cast(TValue *, luaO_nilobject);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Table *getcurrenv (lua_State *L) {[m
[31m-  if (L->ci == L->base_ci)  /* no enclosing function? */[m
[31m-    return hvalue(gt(L));  /* use global table as environment */[m
[31m-  else {[m
[31m-    Closure *func = curr_func(L);[m
[31m-    return func->c.env;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaA_pushobject (lua_State *L, const TValue *o) {[m
[31m-  setobj2s(L, L->top, o);[m
[31m-  api_incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_checkstack (lua_State *L, int size) {[m
[31m-  int res = 1;[m
[31m-  lua_lock(L);[m
[31m-  if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK)[m
[31m-    res = 0;  /* stack overflow */[m
[31m-  else if (size > 0) {[m
[31m-    luaD_checkstack(L, size);[m
[31m-    if (L->ci->top < L->top + size)[m
[31m-      L->ci->top = L->top + size;[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {[m
[31m-  int i;[m
[31m-  if (from == to) return;[m
[31m-  lua_lock(to);[m
[31m-  api_checknelems(from, n);[m
[31m-  api_check(from, G(from) == G(to));[m
[31m-  api_check(from, to->ci->top - to->top >= n);[m
[31m-  from->top -= n;[m
[31m-  for (i = 0; i < n; i++) {[m
[31m-    setobj2s(to, to->top++, from->top + i);[m
[31m-  }[m
[31m-  lua_unlock(to);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_setlevel (lua_State *from, lua_State *to) {[m
[31m-  to->nCcalls = from->nCcalls;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {[m
[31m-  lua_CFunction old;[m
[31m-  lua_lock(L);[m
[31m-  old = G(L)->panic;[m
[31m-  G(L)->panic = panicf;[m
[31m-  lua_unlock(L);[m
[31m-  return old;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_State *lua_newthread (lua_State *L) {[m
[31m-  lua_State *L1;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  L1 = luaE_newthread(L);[m
[31m-  setthvalue(L, L->top, L1);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-  luai_userstatethread(L, L1);[m
[31m-  return L1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic stack manipulation[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_gettop (lua_State *L) {[m
[31m-  return cast_int(L->top - L->base);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_settop (lua_State *L, int idx) {[m
[31m-  lua_lock(L);[m
[31m-  if (idx >= 0) {[m
[31m-    api_check(L, idx <= L->stack_last - L->base);[m
[31m-    while (L->top < L->base + idx)[m
[31m-      setnilvalue(L->top++);[m
[31m-    L->top = L->base + idx;[m
[31m-  }[m
[31m-  else {[m
[31m-    api_check(L, -(idx+1) <= (L->top - L->base));[m
[31m-    L->top += idx+1;  /* `subtract' index (index is negative) */[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_remove (lua_State *L, int idx) {[m
[31m-  StkId p;[m
[31m-  lua_lock(L);[m
[31m-  p = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, p);[m
[31m-  while (++p < L->top) setobjs2s(L, p-1, p);[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_insert (lua_State *L, int idx) {[m
[31m-  StkId p;[m
[31m-  StkId q;[m
[31m-  lua_lock(L);[m
[31m-  p = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, p);[m
[31m-  for (q = L->top; q>p; q--) setobjs2s(L, q, q-1);[m
[31m-  setobjs2s(L, p, L->top);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_replace (lua_State *L, int idx) {[m
[31m-  StkId o;[m
[31m-  lua_lock(L);[m
[31m-  /* explicit test for incompatible code */[m
[31m-  if (idx == LUA_ENVIRONINDEX && L->ci == L->base_ci)[m
[31m-    luaG_runerror(L, "no calling environment");[m
[31m-  api_checknelems(L, 1);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  if (idx == LUA_ENVIRONINDEX) {[m
[31m-    Closure *func = curr_func(L);[m
[31m-    api_check(L, ttistable(L->top - 1)); [m
[31m-    func->c.env = hvalue(L->top - 1);[m
[31m-    luaC_barrier(L, func, L->top - 1);[m
[31m-  }[m
[31m-  else {[m
[31m-    setobj(L, o, L->top - 1);[m
[31m-    if (idx < LUA_GLOBALSINDEX)  /* function upvalue? */[m
[31m-      luaC_barrier(L, curr_func(L), L->top - 1);[m
[31m-  }[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushvalue (lua_State *L, int idx) {[m
[31m-  lua_lock(L);[m
[31m-  setobj2s(L, L->top, index2adr(L, idx));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** access functions (stack -> C)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_type (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  return (o == luaO_nilobject) ? LUA_TNONE : ttype(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_typename (lua_State *L, int t) {[m
[31m-  UNUSED(L);[m
[31m-  return (t == LUA_TNONE) ? "no value" : luaT_typenames[t];[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_iscfunction (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  return iscfunction(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_isnumber (lua_State *L, int idx) {[m
[31m-  TValue n;[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  return tonumber(o, &n);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_isstring (lua_State *L, int idx) {[m
[31m-  int t = lua_type(L, idx);[m
[31m-  return (t == LUA_TSTRING || t == LUA_TNUMBER);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_isuserdata (lua_State *L, int idx) {[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  return (ttisuserdata(o) || ttislightuserdata(o));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {[m
[31m-  StkId o1 = index2adr(L, index1);[m
[31m-  StkId o2 = index2adr(L, index2);[m
[31m-  return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0[m
[31m-         : luaO_rawequalObj(o1, o2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_equal (lua_State *L, int index1, int index2) {[m
[31m-  StkId o1, o2;[m
[31m-  int i;[m
[31m-  lua_lock(L);  /* may call tag method */[m
[31m-  o1 = index2adr(L, index1);[m
[31m-  o2 = index2adr(L, index2);[m
[31m-  i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : equalobj(L, o1, o2);[m
[31m-  lua_unlock(L);[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_lessthan (lua_State *L, int index1, int index2) {[m
[31m-  StkId o1, o2;[m
[31m-  int i;[m
[31m-  lua_lock(L);  /* may call tag method */[m
[31m-  o1 = index2adr(L, index1);[m
[31m-  o2 = index2adr(L, index2);[m
[31m-  i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0[m
[31m-       : luaV_lessthan(L, o1, o2);[m
[31m-  lua_unlock(L);[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUA_API lua_Number lua_tonumber (lua_State *L, int idx) {[m
[31m-  TValue n;[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  if (tonumber(o, &n))[m
[31m-    return nvalue(o);[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) {[m
[31m-  TValue n;[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  if (tonumber(o, &n)) {[m
[31m-    lua_Integer res;[m
[31m-    lua_Number num = nvalue(o);[m
[31m-    lua_number2integer(res, num);[m
[31m-    return res;[m
[31m-  }[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_toboolean (lua_State *L, int idx) {[m
[31m-  const TValue *o = index2adr(L, idx);[m
[31m-  return !l_isfalse(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  if (!ttisstring(o)) {[m
[31m-    lua_lock(L);  /* `luaV_tostring' may create a new string */[m
[31m-    if (!luaV_tostring(L, o)) {  /* conversion failed? */[m
[31m-      if (len != NULL) *len = 0;[m
[31m-      lua_unlock(L);[m
[31m-      return NULL;[m
[31m-    }[m
[31m-    luaC_checkGC(L);[m
[31m-    o = index2adr(L, idx);  /* previous call may reallocate the stack */[m
[31m-    lua_unlock(L);[m
[31m-  }[m
[31m-  if (len != NULL) *len = tsvalue(o)->len;[m
[31m-  return svalue(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API size_t lua_objlen (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TSTRING: return tsvalue(o)->len;[m
[31m-    case LUA_TUSERDATA: return uvalue(o)->len;[m
[31m-    case LUA_TTABLE: return luaH_getn(hvalue(o));[m
[31m-    case LUA_TNUMBER: {[m
[31m-      size_t l;[m
[31m-      lua_lock(L);  /* `luaV_tostring' may create a new string */[m
[31m-      l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0);[m
[31m-      lua_unlock(L);[m
[31m-      return l;[m
[31m-    }[m
[31m-    default: return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  return (!iscfunction(o)) ? NULL : clvalue(o)->c.f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void *lua_touserdata (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TUSERDATA: return (rawuvalue(o) + 1);[m
[31m-    case LUA_TLIGHTUSERDATA: return pvalue(o);[m
[31m-    default: return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_State *lua_tothread (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  return (!ttisthread(o)) ? NULL : thvalue(o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const void *lua_topointer (lua_State *L, int idx) {[m
[31m-  StkId o = index2adr(L, idx);[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TTABLE: return hvalue(o);[m
[31m-    case LUA_TFUNCTION: return clvalue(o);[m
[31m-    case LUA_TTHREAD: return thvalue(o);[m
[31m-    case LUA_TUSERDATA:[m
[31m-    case LUA_TLIGHTUSERDATA:[m
[31m-      return lua_touserdata(L, idx);[m
[31m-    default: return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** push functions (C -> stack)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushnil (lua_State *L) {[m
[31m-  lua_lock(L);[m
[31m-  setnilvalue(L->top);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {[m
[31m-  lua_lock(L);[m
[31m-  setnvalue(L->top, n);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {[m
[31m-  lua_lock(L);[m
[31m-  setnvalue(L->top, cast_num(n));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  setsvalue2s(L, L->top, luaS_newlstr(L, s, len));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushstring (lua_State *L, const char *s) {[m
[31m-  if (s == NULL)[m
[31m-    lua_pushnil(L);[m
[31m-  else[m
[31m-    lua_pushlstring(L, s, strlen(s));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,[m
[31m-                                      va_list argp) {[m
[31m-  const char *ret;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  ret = luaO_pushvfstring(L, fmt, argp);[m
[31m-  lua_unlock(L);[m
[31m-  return ret;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {[m
[31m-  const char *ret;[m
[31m-  va_list argp;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  va_start(argp, fmt);[m
[31m-  ret = luaO_pushvfstring(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  lua_unlock(L);[m
[31m-  return ret;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {[m
[31m-  Closure *cl;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  api_checknelems(L, n);[m
[31m-  cl = luaF_newCclosure(L, n, getcurrenv(L));[m
[31m-  cl->c.f = fn;[m
[31m-  L->top -= n;[m
[31m-  while (n--)[m
[31m-    setobj2n(L, &cl->c.upvalue[n], L->top+n);[m
[31m-  setclvalue(L, L->top, cl);[m
[31m-  lua_assert(iswhite(obj2gco(cl)));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushboolean (lua_State *L, int b) {[m
[31m-  lua_lock(L);[m
[31m-  setbvalue(L->top, (b != 0));  /* ensure that true is 1 */[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {[m
[31m-  lua_lock(L);[m
[31m-  setpvalue(L->top, p);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_pushthread (lua_State *L) {[m
[31m-  lua_lock(L);[m
[31m-  setthvalue(L, L->top, L);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-  return (G(L)->mainthread == L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** get functions (Lua -> stack)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_gettable (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  lua_lock(L);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  luaV_gettable(L, t, L->top - 1, L->top - 1);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {[m
[31m-  StkId t;[m
[31m-  TValue key;[m
[31m-  lua_lock(L);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  setsvalue(L, &key, luaS_new(L, k));[m
[31m-  luaV_gettable(L, t, &key, L->top);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_rawget (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  lua_lock(L);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(t));[m
[31m-  setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {[m
[31m-  StkId o;[m
[31m-  lua_lock(L);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(o));[m
[31m-  setobj2s(L, L->top, luaH_getnum(hvalue(o), n));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  sethvalue(L, L->top, luaH_new(L, narray, nrec));[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getmetatable (lua_State *L, int objindex) {[m
[31m-  const TValue *obj;[m
[31m-  Table *mt = NULL;[m
[31m-  int res;[m
[31m-  lua_lock(L);[m
[31m-  obj = index2adr(L, objindex);[m
[31m-  switch (ttype(obj)) {[m
[31m-    case LUA_TTABLE:[m
[31m-      mt = hvalue(obj)->metatable;[m
[31m-      break;[m
[31m-    case LUA_TUSERDATA:[m
[31m-      mt = uvalue(obj)->metatable;[m
[31m-      break;[m
[31m-    default:[m
[31m-      mt = G(L)->mt[ttype(obj)];[m
[31m-      break;[m
[31m-  }[m
[31m-  if (mt == NULL)[m
[31m-    res = 0;[m
[31m-  else {[m
[31m-    sethvalue(L, L->top, mt);[m
[31m-    api_incr_top(L);[m
[31m-    res = 1;[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_getfenv (lua_State *L, int idx) {[m
[31m-  StkId o;[m
[31m-  lua_lock(L);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TFUNCTION:[m
[31m-      sethvalue(L, L->top, clvalue(o)->c.env);[m
[31m-      break;[m
[31m-    case LUA_TUSERDATA:[m
[31m-      sethvalue(L, L->top, uvalue(o)->env);[m
[31m-      break;[m
[31m-    case LUA_TTHREAD:[m
[31m-      setobj2s(L, L->top,  gt(thvalue(o)));[m
[31m-      break;[m
[31m-    default:[m
[31m-      setnilvalue(L->top);[m
[31m-      break;[m
[31m-  }[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** set functions (stack -> Lua)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_settable (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 2);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  luaV_settable(L, t, L->top - 2, L->top - 1);[m
[31m-  L->top -= 2;  /* pop index and value */[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {[m
[31m-  StkId t;[m
[31m-  TValue key;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, t);[m
[31m-  setsvalue(L, &key, luaS_new(L, k));[m
[31m-  luaV_settable(L, t, &key, L->top - 1);[m
[31m-  L->top--;  /* pop value */[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_rawset (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 2);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(t));[m
[31m-  setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);[m
[31m-  luaC_barriert(L, hvalue(t), L->top-1);[m
[31m-  L->top -= 2;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_rawseti (lua_State *L, int idx, int n) {[m
[31m-  StkId o;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(o));[m
[31m-  setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1);[m
[31m-  luaC_barriert(L, hvalue(o), L->top-1);[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_setmetatable (lua_State *L, int objindex) {[m
[31m-  TValue *obj;[m
[31m-  Table *mt;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  obj = index2adr(L, objindex);[m
[31m-  api_checkvalidindex(L, obj);[m
[31m-  if (ttisnil(L->top - 1))[m
[31m-    mt = NULL;[m
[31m-  else {[m
[31m-    api_check(L, ttistable(L->top - 1));[m
[31m-    mt = hvalue(L->top - 1);[m
[31m-  }[m
[31m-  switch (ttype(obj)) {[m
[31m-    case LUA_TTABLE: {[m
[31m-      hvalue(obj)->metatable = mt;[m
[31m-      if (mt)[m
[31m-        luaC_objbarriert(L, hvalue(obj), mt);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TUSERDATA: {[m
[31m-      uvalue(obj)->metatable = mt;[m
[31m-      if (mt)[m
[31m-        luaC_objbarrier(L, rawuvalue(obj), mt);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      G(L)->mt[ttype(obj)] = mt;[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_setfenv (lua_State *L, int idx) {[m
[31m-  StkId o;[m
[31m-  int res = 1;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  o = index2adr(L, idx);[m
[31m-  api_checkvalidindex(L, o);[m
[31m-  api_check(L, ttistable(L->top - 1));[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TFUNCTION:[m
[31m-      clvalue(o)->c.env = hvalue(L->top - 1);[m
[31m-      break;[m
[31m-    case LUA_TUSERDATA:[m
[31m-      uvalue(o)->env = hvalue(L->top - 1);[m
[31m-      break;[m
[31m-    case LUA_TTHREAD:[m
[31m-      sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1));[m
[31m-      break;[m
[31m-    default:[m
[31m-      res = 0;[m
[31m-      break;[m
[31m-  }[m
[31m-  if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));[m
[31m-  L->top--;[m
[31m-  lua_unlock(L);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `load' and `call' functions (run Lua code)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define adjustresults(L,nres) \[m
[31m-    { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; }[m
[31m-[m
[31m-[m
[31m-#define checkresults(L,na,nr) \[m
[31m-     api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)))[m
[31m-	[m
[31m-[m
[31m-LUA_API void lua_call (lua_State *L, int nargs, int nresults) {[m
[31m-  StkId func;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, nargs+1);[m
[31m-  checkresults(L, nargs, nresults);[m
[31m-  func = L->top - (nargs+1);[m
[31m-  luaD_call(L, func, nresults);[m
[31m-  adjustresults(L, nresults);[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Execute a protected call.[m
[31m-*/[m
[31m-struct CallS {  /* data to `f_call' */[m
[31m-  StkId func;[m
[31m-  int nresults;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void f_call (lua_State *L, void *ud) {[m
[31m-  struct CallS *c = cast(struct CallS *, ud);[m
[31m-  luaD_call(L, c->func, c->nresults);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) {[m
[31m-  struct CallS c;[m
[31m-  int status;[m
[31m-  ptrdiff_t func;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, nargs+1);[m
[31m-  checkresults(L, nargs, nresults);[m
[31m-  if (errfunc == 0)[m
[31m-    func = 0;[m
[31m-  else {[m
[31m-    StkId o = index2adr(L, errfunc);[m
[31m-    api_checkvalidindex(L, o);[m
[31m-    func = savestack(L, o);[m
[31m-  }[m
[31m-  c.func = L->top - (nargs+1);  /* function to be called */[m
[31m-  c.nresults = nresults;[m
[31m-  status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);[m
[31m-  adjustresults(L, nresults);[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Execute a protected C call.[m
[31m-*/[m
[31m-struct CCallS {  /* data to `f_Ccall' */[m
[31m-  lua_CFunction func;[m
[31m-  void *ud;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void f_Ccall (lua_State *L, void *ud) {[m
[31m-  struct CCallS *c = cast(struct CCallS *, ud);[m
[31m-  Closure *cl;[m
[31m-  cl = luaF_newCclosure(L, 0, getcurrenv(L));[m
[31m-  cl->c.f = c->func;[m
[31m-  setclvalue(L, L->top, cl);  /* push function */[m
[31m-  api_incr_top(L);[m
[31m-  setpvalue(L->top, c->ud);  /* push only argument */[m
[31m-  api_incr_top(L);[m
[31m-  luaD_call(L, L->top - 2, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) {[m
[31m-  struct CCallS c;[m
[31m-  int status;[m
[31m-  lua_lock(L);[m
[31m-  c.func = func;[m
[31m-  c.ud = ud;[m
[31m-  status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0);[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,[m
[31m-                      const char *chunkname) {[m
[31m-  ZIO z;[m
[31m-  int status;[m
[31m-  lua_lock(L);[m
[31m-  if (!chunkname) chunkname = "?";[m
[31m-  luaZ_init(L, &z, reader, data);[m
[31m-  status = luaD_protectedparser(L, &z, chunkname);[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {[m
[31m-  int status;[m
[31m-  TValue *o;[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  o = L->top - 1;[m
[31m-  if (isLfunction(o))[m
[31m-    status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0);[m
[31m-  else[m
[31m-    status = 1;[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int  lua_status (lua_State *L) {[m
[31m-  return L->status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Garbage-collection function[m
[31m-*/[m
[31m-[m
[31m-LUA_API int lua_gc (lua_State *L, int what, int data) {[m
[31m-  int res = 0;[m
[31m-  global_State *g;[m
[31m-  lua_lock(L);[m
[31m-  g = G(L);[m
[31m-  switch (what) {[m
[31m-    case LUA_GCSTOP: {[m
[31m-      g->GCthreshold = MAX_LUMEM;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCRESTART: {[m
[31m-      g->GCthreshold = g->totalbytes;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCCOLLECT: {[m
[31m-      luaC_fullgc(L);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCCOUNT: {[m
[31m-      /* GC values are expressed in Kbytes: #bytes/2^10 */[m
[31m-      res = cast_int(g->totalbytes >> 10);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCCOUNTB: {[m
[31m-      res = cast_int(g->totalbytes & 0x3ff);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCSTEP: {[m
[31m-      lu_mem a = (cast(lu_mem, data) << 10);[m
[31m-      if (a <= g->totalbytes)[m
[31m-        g->GCthreshold = g->totalbytes - a;[m
[31m-      else[m
[31m-        g->GCthreshold = 0;[m
[31m-      while (g->GCthreshold <= g->totalbytes) {[m
[31m-        luaC_step(L);[m
[31m-        if (g->gcstate == GCSpause) {  /* end of cycle? */[m
[31m-          res = 1;  /* signal it */[m
[31m-          break;[m
[31m-        }[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCSETPAUSE: {[m
[31m-      res = g->gcpause;[m
[31m-      g->gcpause = data;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_GCSETSTEPMUL: {[m
[31m-      res = g->gcstepmul;[m
[31m-      g->gcstepmul = data;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: res = -1;  /* invalid option */[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** miscellaneous functions[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_error (lua_State *L) {[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, 1);[m
[31m-  luaG_errormsg(L);[m
[31m-  lua_unlock(L);[m
[31m-  return 0;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_next (lua_State *L, int idx) {[m
[31m-  StkId t;[m
[31m-  int more;[m
[31m-  lua_lock(L);[m
[31m-  t = index2adr(L, idx);[m
[31m-  api_check(L, ttistable(t));[m
[31m-  more = luaH_next(L, hvalue(t), L->top - 1);[m
[31m-  if (more) {[m
[31m-    api_incr_top(L);[m
[31m-  }[m
[31m-  else  /* no more elements */[m
[31m-    L->top -= 1;  /* remove key */[m
[31m-  lua_unlock(L);[m
[31m-  return more;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_concat (lua_State *L, int n) {[m
[31m-  lua_lock(L);[m
[31m-  api_checknelems(L, n);[m
[31m-  if (n >= 2) {[m
[31m-    luaC_checkGC(L);[m
[31m-    luaV_concat(L, n, cast_int(L->top - L->base) - 1);[m
[31m-    L->top -= (n-1);[m
[31m-  }[m
[31m-  else if (n == 0) {  /* push empty string */[m
[31m-    setsvalue2s(L, L->top, luaS_newlstr(L, "", 0));[m
[31m-    api_incr_top(L);[m
[31m-  }[m
[31m-  /* else n == 1; nothing to do */[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {[m
[31m-  lua_Alloc f;[m
[31m-  lua_lock(L);[m
[31m-  if (ud) *ud = G(L)->ud;[m
[31m-  f = G(L)->frealloc;[m
[31m-  lua_unlock(L);[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {[m
[31m-  lua_lock(L);[m
[31m-  G(L)->ud = ud;[m
[31m-  G(L)->frealloc = f;[m
[31m-  lua_unlock(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void *lua_newuserdata (lua_State *L, size_t size) {[m
[31m-  Udata *u;[m
[31m-  lua_lock(L);[m
[31m-  luaC_checkGC(L);[m
[31m-  u = luaS_newudata(L, size, getcurrenv(L));[m
[31m-  setuvalue(L, L->top, u);[m
[31m-  api_incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-  return u + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-static const char *aux_upvalue (StkId fi, int n, TValue **val) {[m
[31m-  Closure *f;[m
[31m-  if (!ttisfunction(fi)) return NULL;[m
[31m-  f = clvalue(fi);[m
[31m-  if (f->c.isC) {[m
[31m-    if (!(1 <= n && n <= f->c.nupvalues)) return NULL;[m
[31m-    *val = &f->c.upvalue[n-1];[m
[31m-    return "";[m
[31m-  }[m
[31m-  else {[m
[31m-    Proto *p = f->l.p;[m
[31m-    if (!(1 <= n && n <= p->sizeupvalues)) return NULL;[m
[31m-    *val = f->l.upvals[n-1]->v;[m
[31m-    return getstr(p->upvalues[n-1]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {[m
[31m-  const char *name;[m
[31m-  TValue *val;[m
[31m-  lua_lock(L);[m
[31m-  name = aux_upvalue(index2adr(L, funcindex), n, &val);[m
[31m-  if (name) {[m
[31m-    setobj2s(L, L->top, val);[m
[31m-    api_incr_top(L);[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {[m
[31m-  const char *name;[m
[31m-  TValue *val;[m
[31m-  StkId fi;[m
[31m-  lua_lock(L);[m
[31m-  fi = index2adr(L, funcindex);[m
[31m-  api_checknelems(L, 1);[m
[31m-  name = aux_upvalue(fi, n, &val);[m
[31m-  if (name) {[m
[31m-    L->top--;[m
[31m-    setobj(L, val, L->top);[m
[31m-    luaC_barrier(L, clvalue(fi), L->top);[m
[31m-  }[m
[31m-  lua_unlock(L);[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lapi.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lapi.h[m
[1mdeleted file mode 100644[m
[1mindex 2c3fab2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lapi.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions from Lua API[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lapi_h[m
[31m-#define lapi_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lauxlib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lauxlib.c[m
[1mdeleted file mode 100644[m
[1mindex 10f14e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lauxlib.c[m
[1m+++ /dev/null[m
[36m@@ -1,652 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $[m
[31m-** Auxiliary functions for building Lua libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-/* This file uses only the official API of Lua.[m
[31m-** Any function declared here could be written as an application function.[m
[31m-*/[m
[31m-[m
[31m-#define lauxlib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-[m
[31m-#define FREELIST_REF	0	/* free list of references */[m
[31m-[m
[31m-[m
[31m-/* convert a stack index to positive */[m
[31m-#define abs_index(L, i)		((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \[m
[31m-					lua_gettop(L) + (i) + 1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Error-report functions[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) {[m
[31m-  lua_Debug ar;[m
[31m-  if (!lua_getstack(L, 0, &ar))  /* no stack frame? */[m
[31m-    return luaL_error(L, "bad argument #%d (%s)", narg, extramsg);[m
[31m-  lua_getinfo(L, "n", &ar);[m
[31m-  if (strcmp(ar.namewhat, "method") == 0) {[m
[31m-    narg--;  /* do not count `self' */[m
[31m-    if (narg == 0)  /* error is in the self argument itself? */[m
[31m-      return luaL_error(L, "calling " LUA_QS " on bad self (%s)",[m
[31m-                           ar.name, extramsg);[m
[31m-  }[m
[31m-  if (ar.name == NULL)[m
[31m-    ar.name = "?";[m
[31m-  return luaL_error(L, "bad argument #%d to " LUA_QS " (%s)",[m
[31m-                        narg, ar.name, extramsg);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) {[m
[31m-  const char *msg = lua_pushfstring(L, "%s expected, got %s",[m
[31m-                                    tname, luaL_typename(L, narg));[m
[31m-  return luaL_argerror(L, narg, msg);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void tag_error (lua_State *L, int narg, int tag) {[m
[31m-  luaL_typerror(L, narg, lua_typename(L, tag));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_where (lua_State *L, int level) {[m
[31m-  lua_Debug ar;[m
[31m-  if (lua_getstack(L, level, &ar)) {  /* check function at level */[m
[31m-    lua_getinfo(L, "Sl", &ar);  /* get info about it */[m
[31m-    if (ar.currentline > 0) {  /* is there info? */[m
[31m-      lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  lua_pushliteral(L, "");  /* else, no information available... */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  luaL_where(L, 1);[m
[31m-  lua_pushvfstring(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  lua_concat(L, 2);[m
[31m-  return lua_error(L);[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,[m
[31m-                                 const char *const lst[]) {[m
[31m-  const char *name = (def) ? luaL_optstring(L, narg, def) :[m
[31m-                             luaL_checkstring(L, narg);[m
[31m-  int i;[m
[31m-  for (i=0; lst[i]; i++)[m
[31m-    if (strcmp(lst[i], name) == 0)[m
[31m-      return i;[m
[31m-  return luaL_argerror(L, narg,[m
[31m-                       lua_pushfstring(L, "invalid option " LUA_QS, name));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, tname);  /* get registry.name */[m
[31m-  if (!lua_isnil(L, -1))  /* name already in use? */[m
[31m-    return 0;  /* leave previous value on top, but return 0 */[m
[31m-  lua_pop(L, 1);[m
[31m-  lua_newtable(L);  /* create metatable */[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_setfield(L, LUA_REGISTRYINDEX, tname);  /* registry.name = metatable */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) {[m
[31m-  void *p = lua_touserdata(L, ud);[m
[31m-  if (p != NULL) {  /* value is a userdata? */[m
[31m-    if (lua_getmetatable(L, ud)) {  /* does it have a metatable? */[m
[31m-      lua_getfield(L, LUA_REGISTRYINDEX, tname);  /* get correct metatable */[m
[31m-      if (lua_rawequal(L, -1, -2)) {  /* does it have the correct mt? */[m
[31m-        lua_pop(L, 2);  /* remove both metatables */[m
[31m-        return p;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  luaL_typerror(L, ud, tname);  /* else error */[m
[31m-  return NULL;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) {[m
[31m-  if (!lua_checkstack(L, space))[m
[31m-    luaL_error(L, "stack overflow (%s)", mes);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {[m
[31m-  if (lua_type(L, narg) != t)[m
[31m-    tag_error(L, narg, t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_checkany (lua_State *L, int narg) {[m
[31m-  if (lua_type(L, narg) == LUA_TNONE)[m
[31m-    luaL_argerror(L, narg, "value expected");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) {[m
[31m-  const char *s = lua_tolstring(L, narg, len);[m
[31m-  if (!s) tag_error(L, narg, LUA_TSTRING);[m
[31m-  return s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *luaL_optlstring (lua_State *L, int narg,[m
[31m-                                        const char *def, size_t *len) {[m
[31m-  if (lua_isnoneornil(L, narg)) {[m
[31m-    if (len)[m
[31m-      *len = (def ? strlen(def) : 0);[m
[31m-    return def;[m
[31m-  }[m
[31m-  else return luaL_checklstring(L, narg, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) {[m
[31m-  lua_Number d = lua_tonumber(L, narg);[m
[31m-  if (d == 0 && !lua_isnumber(L, narg))  /* avoid extra test when d is not 0 */[m
[31m-    tag_error(L, narg, LUA_TNUMBER);[m
[31m-  return d;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) {[m
[31m-  return luaL_opt(L, luaL_checknumber, narg, def);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {[m
[31m-  lua_Integer d = lua_tointeger(L, narg);[m
[31m-  if (d == 0 && !lua_isnumber(L, narg))  /* avoid extra test when d is not 0 */[m
[31m-    tag_error(L, narg, LUA_TNUMBER);[m
[31m-  return d;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,[m
[31m-                                                      lua_Integer def) {[m
[31m-  return luaL_opt(L, luaL_checkinteger, narg, def);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) {[m
[31m-  if (!lua_getmetatable(L, obj))  /* no metatable? */[m
[31m-    return 0;[m
[31m-  lua_pushstring(L, event);[m
[31m-  lua_rawget(L, -2);[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-    lua_pop(L, 2);  /* remove metatable and metafield */[m
[31m-    return 0;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_remove(L, -2);  /* remove only metatable */[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {[m
[31m-  obj = abs_index(L, obj);[m
[31m-  if (!luaL_getmetafield(L, obj, event))  /* no metafield? */[m
[31m-    return 0;[m
[31m-  lua_pushvalue(L, obj);[m
[31m-  lua_call(L, 1, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void (luaL_register) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l) {[m
[31m-  luaI_openlib(L, libname, l, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int libsize (const luaL_Reg *l) {[m
[31m-  int size = 0;[m
[31m-  for (; l->name; l++) size++;[m
[31m-  return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaI_openlib (lua_State *L, const char *libname,[m
[31m-                              const luaL_Reg *l, int nup) {[m
[31m-  if (libname) {[m
[31m-    int size = libsize(l);[m
[31m-    /* check whether lib already exists */[m
[31m-    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);[m
[31m-    lua_getfield(L, -1, libname);  /* get _LOADED[libname] */[m
[31m-    if (!lua_istable(L, -1)) {  /* not found? */[m
[31m-      lua_pop(L, 1);  /* remove previous result */[m
[31m-      /* try global variable (and create one if it does not exist) */[m
[31m-      if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL)[m
[31m-        luaL_error(L, "name conflict for module " LUA_QS, libname);[m
[31m-      lua_pushvalue(L, -1);[m
[31m-      lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */[m
[31m-    }[m
[31m-    lua_remove(L, -2);  /* remove _LOADED table */[m
[31m-    lua_insert(L, -(nup+1));  /* move library table to below upvalues */[m
[31m-  }[m
[31m-  for (; l->name; l++) {[m
[31m-    int i;[m
[31m-    for (i=0; i<nup; i++)  /* copy upvalues to the top */[m
[31m-      lua_pushvalue(L, -nup);[m
[31m-    lua_pushcclosure(L, l->func, nup);[m
[31m-    lua_setfield(L, -(nup+2), l->name);[m
[31m-  }[m
[31m-  lua_pop(L, nup);  /* remove upvalues */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** getn-setn: size for arrays[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-#if defined(LUA_COMPAT_GETN)[m
[31m-[m
[31m-static int checkint (lua_State *L, int topop) {[m
[31m-  int n = (lua_type(L, -1) == LUA_TNUMBER) ? lua_tointeger(L, -1) : -1;[m
[31m-  lua_pop(L, topop);[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void getsizes (lua_State *L) {[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "LUA_SIZES");[m
[31m-  if (lua_isnil(L, -1)) {  /* no `size' table? */[m
[31m-    lua_pop(L, 1);  /* remove nil */[m
[31m-    lua_newtable(L);  /* create it */[m
[31m-    lua_pushvalue(L, -1);  /* `size' will be its own metatable */[m
[31m-    lua_setmetatable(L, -2);[m
[31m-    lua_pushliteral(L, "kv");[m
[31m-    lua_setfield(L, -2, "__mode");  /* metatable(N).__mode = "kv" */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, LUA_REGISTRYINDEX, "LUA_SIZES");  /* store in register */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_setn (lua_State *L, int t, int n) {[m
[31m-  t = abs_index(L, t);[m
[31m-  lua_pushliteral(L, "n");[m
[31m-  lua_rawget(L, t);[m
[31m-  if (checkint(L, 1) >= 0) {  /* is there a numeric field `n'? */[m
[31m-    lua_pushliteral(L, "n");  /* use it */[m
[31m-    lua_pushinteger(L, n);[m
[31m-    lua_rawset(L, t);[m
[31m-  }[m
[31m-  else {  /* use `sizes' */[m
[31m-    getsizes(L);[m
[31m-    lua_pushvalue(L, t);[m
[31m-    lua_pushinteger(L, n);[m
[31m-    lua_rawset(L, -3);  /* sizes[t] = n */[m
[31m-    lua_pop(L, 1);  /* remove `sizes' */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_getn (lua_State *L, int t) {[m
[31m-  int n;[m
[31m-  t = abs_index(L, t);[m
[31m-  lua_pushliteral(L, "n");  /* try t.n */[m
[31m-  lua_rawget(L, t);[m
[31m-  if ((n = checkint(L, 1)) >= 0) return n;[m
[31m-  getsizes(L);  /* else try sizes[t] */[m
[31m-  lua_pushvalue(L, t);[m
[31m-  lua_rawget(L, -2);[m
[31m-  if ((n = checkint(L, 2)) >= 0) return n;[m
[31m-  return (int)lua_objlen(L, t);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,[m
[31m-                                                               const char *r) {[m
[31m-  const char *wild;[m
[31m-  size_t l = strlen(p);[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while ((wild = strstr(s, p)) != NULL) {[m
[31m-    luaL_addlstring(&b, s, wild - s);  /* push prefix */[m
[31m-    luaL_addstring(&b, r);  /* push replacement in place of pattern */[m
[31m-    s = wild + l;  /* continue after `p' */[m
[31m-  }[m
[31m-  luaL_addstring(&b, s);  /* push last suffix */[m
[31m-  luaL_pushresult(&b);[m
[31m-  return lua_tostring(L, -1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *luaL_findtable (lua_State *L, int idx,[m
[31m-                                       const char *fname, int szhint) {[m
[31m-  const char *e;[m
[31m-  lua_pushvalue(L, idx);[m
[31m-  do {[m
[31m-    e = strchr(fname, '.');[m
[31m-    if (e == NULL) e = fname + strlen(fname);[m
[31m-    lua_pushlstring(L, fname, e - fname);[m
[31m-    lua_rawget(L, -2);[m
[31m-    if (lua_isnil(L, -1)) {  /* no such field? */[m
[31m-      lua_pop(L, 1);  /* remove this nil */[m
[31m-      lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */[m
[31m-      lua_pushlstring(L, fname, e - fname);[m
[31m-      lua_pushvalue(L, -2);[m
[31m-      lua_settable(L, -4);  /* set new table into field */[m
[31m-    }[m
[31m-    else if (!lua_istable(L, -1)) {  /* field has a non-table value? */[m
[31m-      lua_pop(L, 2);  /* remove table and value */[m
[31m-      return fname;  /* return problematic part of the name */[m
[31m-    }[m
[31m-    lua_remove(L, -2);  /* remove previous table */[m
[31m-    fname = e + 1;[m
[31m-  } while (*e == '.');[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Generic Buffer manipulation[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define bufflen(B)	((B)->p - (B)->buffer)[m
[31m-#define bufffree(B)	((size_t)(LUAL_BUFFERSIZE - bufflen(B)))[m
[31m-[m
[31m-#define LIMIT	(LUA_MINSTACK/2)[m
[31m-[m
[31m-[m
[31m-static int emptybuffer (luaL_Buffer *B) {[m
[31m-  size_t l = bufflen(B);[m
[31m-  if (l == 0) return 0;  /* put nothing on stack */[m
[31m-  else {[m
[31m-    lua_pushlstring(B->L, B->buffer, l);[m
[31m-    B->p = B->buffer;[m
[31m-    B->lvl++;[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void adjuststack (luaL_Buffer *B) {[m
[31m-  if (B->lvl > 1) {[m
[31m-    lua_State *L = B->L;[m
[31m-    int toget = 1;  /* number of levels to concat */[m
[31m-    size_t toplen = lua_strlen(L, -1);[m
[31m-    do {[m
[31m-      size_t l = lua_strlen(L, -(toget+1));[m
[31m-      if (B->lvl - toget + 1 >= LIMIT || toplen > l) {[m
[31m-        toplen += l;[m
[31m-        toget++;[m
[31m-      }[m
[31m-      else break;[m
[31m-    } while (toget < B->lvl);[m
[31m-    lua_concat(L, toget);[m
[31m-    B->lvl = B->lvl - toget + 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {[m
[31m-  if (emptybuffer(B))[m
[31m-    adjuststack(B);[m
[31m-  return B->buffer;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {[m
[31m-  while (l--)[m
[31m-    luaL_addchar(B, *s++);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {[m
[31m-  luaL_addlstring(B, s, strlen(s));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_pushresult (luaL_Buffer *B) {[m
[31m-  emptybuffer(B);[m
[31m-  lua_concat(B->L, B->lvl);[m
[31m-  B->lvl = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_addvalue (luaL_Buffer *B) {[m
[31m-  lua_State *L = B->L;[m
[31m-  size_t vl;[m
[31m-  const char *s = lua_tolstring(L, -1, &vl);[m
[31m-  if (vl <= bufffree(B)) {  /* fit into buffer? */[m
[31m-    memcpy(B->p, s, vl);  /* put it there */[m
[31m-    B->p += vl;[m
[31m-    lua_pop(L, 1);  /* remove from stack */[m
[31m-  }[m
[31m-  else {[m
[31m-    if (emptybuffer(B))[m
[31m-      lua_insert(L, -2);  /* put buffer before new value */[m
[31m-    B->lvl++;  /* add new value into B stack */[m
[31m-    adjuststack(B);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {[m
[31m-  B->L = L;[m
[31m-  B->p = B->buffer;[m
[31m-  B->lvl = 0;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_ref (lua_State *L, int t) {[m
[31m-  int ref;[m
[31m-  t = abs_index(L, t);[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-    lua_pop(L, 1);  /* remove from stack */[m
[31m-    return LUA_REFNIL;  /* `nil' has a unique fixed reference */[m
[31m-  }[m
[31m-  lua_rawgeti(L, t, FREELIST_REF);  /* get first free element */[m
[31m-  ref = (int)lua_tointeger(L, -1);  /* ref = t[FREELIST_REF] */[m
[31m-  lua_pop(L, 1);  /* remove it from stack */[m
[31m-  if (ref != 0) {  /* any free element? */[m
[31m-    lua_rawgeti(L, t, ref);  /* remove it from list */[m
[31m-    lua_rawseti(L, t, FREELIST_REF);  /* (t[FREELIST_REF] = t[ref]) */[m
[31m-  }[m
[31m-  else {  /* no free elements */[m
[31m-    ref = (int)lua_objlen(L, t);[m
[31m-    ref++;  /* create new reference */[m
[31m-  }[m
[31m-  lua_rawseti(L, t, ref);[m
[31m-  return ref;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {[m
[31m-  if (ref >= 0) {[m
[31m-    t = abs_index(L, t);[m
[31m-    lua_rawgeti(L, t, FREELIST_REF);[m
[31m-    lua_rawseti(L, t, ref);  /* t[ref] = t[FREELIST_REF] */[m
[31m-    lua_pushinteger(L, ref);[m
[31m-    lua_rawseti(L, t, FREELIST_REF);  /* t[FREELIST_REF] = ref */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Load functions[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-typedef struct LoadF {[m
[31m-  int extraline;[m
[31m-  FILE *f;[m
[31m-  char buff[LUAL_BUFFERSIZE];[m
[31m-} LoadF;[m
[31m-[m
[31m-[m
[31m-static const char *getF (lua_State *L, void *ud, size_t *size) {[m
[31m-  LoadF *lf = (LoadF *)ud;[m
[31m-  (void)L;[m
[31m-  if (lf->extraline) {[m
[31m-    lf->extraline = 0;[m
[31m-    *size = 1;[m
[31m-    return "\n";[m
[31m-  }[m
[31m-  if (feof(lf->f)) return NULL;[m
[31m-  *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);[m
[31m-  return (*size > 0) ? lf->buff : NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int errfile (lua_State *L, const char *what, int fnameindex) {[m
[31m-  const char *serr = strerror(errno);[m
[31m-  const char *filename = lua_tostring(L, fnameindex) + 1;[m
[31m-  lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);[m
[31m-  lua_remove(L, fnameindex);[m
[31m-  return LUA_ERRFILE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {[m
[31m-  LoadF lf;[m
[31m-  int status, readstatus;[m
[31m-  int c;[m
[31m-  int fnameindex = lua_gettop(L) + 1;  /* index of filename on the stack */[m
[31m-  lf.extraline = 0;[m
[31m-  if (filename == NULL) {[m
[31m-    lua_pushliteral(L, "=stdin");[m
[31m-    lf.f = stdin;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushfstring(L, "@%s", filename);[m
[31m-    lf.f = fopen(filename, "r");[m
[31m-    if (lf.f == NULL) return errfile(L, "open", fnameindex);[m
[31m-  }[m
[31m-  c = getc(lf.f);[m
[31m-  if (c == '#') {  /* Unix exec. file? */[m
[31m-    lf.extraline = 1;[m
[31m-    while ((c = getc(lf.f)) != EOF && c != '\n') ;  /* skip first line */[m
[31m-    if (c == '\n') c = getc(lf.f);[m
[31m-  }[m
[31m-  if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */[m
[31m-    lf.f = freopen(filename, "rb", lf.f);  /* reopen in binary mode */[m
[31m-    if (lf.f == NULL) return errfile(L, "reopen", fnameindex);[m
[31m-    /* skip eventual `#!...' */[m
[31m-   while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;[m
[31m-    lf.extraline = 0;[m
[31m-  }[m
[31m-  ungetc(c, lf.f);[m
[31m-  status = lua_load(L, getF, &lf, lua_tostring(L, -1));[m
[31m-  readstatus = ferror(lf.f);[m
[31m-  if (filename) fclose(lf.f);  /* close file (even in case of errors) */[m
[31m-  if (readstatus) {[m
[31m-    lua_settop(L, fnameindex);  /* ignore results from `lua_load' */[m
[31m-    return errfile(L, "read", fnameindex);[m
[31m-  }[m
[31m-  lua_remove(L, fnameindex);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct LoadS {[m
[31m-  const char *s;[m
[31m-  size_t size;[m
[31m-} LoadS;[m
[31m-[m
[31m-[m
[31m-static const char *getS (lua_State *L, void *ud, size_t *size) {[m
[31m-  LoadS *ls = (LoadS *)ud;[m
[31m-  (void)L;[m
[31m-  if (ls->size == 0) return NULL;[m
[31m-  *size = ls->size;[m
[31m-  ls->size = 0;[m
[31m-  return ls->s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,[m
[31m-                                const char *name) {[m
[31m-  LoadS ls;[m
[31m-  ls.s = buff;[m
[31m-  ls.size = size;[m
[31m-  return lua_load(L, getS, &ls, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) {[m
[31m-  return luaL_loadbuffer(L, s, strlen(s), s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {[m
[31m-  (void)ud;[m
[31m-  (void)osize;[m
[31m-  if (nsize == 0) {[m
[31m-    free(ptr);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  else[m
[31m-    return realloc(ptr, nsize);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int panic (lua_State *L) {[m
[31m-  (void)L;  /* to avoid warnings */[m
[31m-  fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n",[m
[31m-                   lua_tostring(L, -1));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API lua_State *luaL_newstate (void) {[m
[31m-  lua_State *L = lua_newstate(l_alloc, NULL);[m
[31m-  if (L) lua_atpanic(L, &panic);[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lauxlib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lauxlib.h[m
[1mdeleted file mode 100644[m
[1mindex 3425823..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lauxlib.h[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions for building Lua libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lauxlib_h[m
[31m-#define lauxlib_h[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-#if defined(LUA_COMPAT_GETN)[m
[31m-LUALIB_API int (luaL_getn) (lua_State *L, int t);[m
[31m-LUALIB_API void (luaL_setn) (lua_State *L, int t, int n);[m
[31m-#else[m
[31m-#define luaL_getn(L,i)          ((int)lua_objlen(L, i))[m
[31m-#define luaL_setn(L,i,j)        ((void)0)  /* no op! */[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUA_COMPAT_OPENLIB)[m
[31m-#define luaI_openlib	luaL_openlib[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* extra error code for `luaL_load' */[m
[31m-#define LUA_ERRFILE     (LUA_ERRERR+1)[m
[31m-[m
[31m-[m
[31m-typedef struct luaL_Reg {[m
[31m-  const char *name;[m
[31m-  lua_CFunction func;[m
[31m-} luaL_Reg;[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l, int nup);[m
[31m-LUALIB_API void (luaL_register) (lua_State *L, const char *libname,[m
[31m-                                const luaL_Reg *l);[m
[31m-LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);[m
[31m-LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);[m
[31m-LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);[m
[31m-LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,[m
[31m-                                                          size_t *l);[m
[31m-LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,[m
[31m-                                          const char *def, size_t *l);[m
[31m-LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);[m
[31m-[m
[31m-LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);[m
[31m-LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,[m
[31m-                                          lua_Integer def);[m
[31m-[m
[31m-LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);[m
[31m-LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);[m
[31m-LUALIB_API void (luaL_checkany) (lua_State *L, int narg);[m
[31m-[m
[31m-LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);[m
[31m-LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);[m
[31m-[m
[31m-LUALIB_API void (luaL_where) (lua_State *L, int lvl);[m
[31m-LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);[m
[31m-[m
[31m-LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,[m
[31m-                                   const char *const lst[]);[m
[31m-[m
[31m-LUALIB_API int (luaL_ref) (lua_State *L, int t);[m
[31m-LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);[m
[31m-[m
[31m-LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);[m
[31m-LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,[m
[31m-                                  const char *name);[m
[31m-LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);[m
[31m-[m
[31m-LUALIB_API lua_State *(luaL_newstate) (void);[m
[31m-[m
[31m-[m
[31m-LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,[m
[31m-                                                  const char *r);[m
[31m-[m
[31m-LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,[m
[31m-                                         const char *fname, int szhint);[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define luaL_argcheck(L, cond,numarg,extramsg)	\[m
[31m-		((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))[m
[31m-#define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))[m
[31m-#define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))[m
[31m-#define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))[m
[31m-#define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))[m
[31m-#define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))[m
[31m-[m
[31m-#define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))[m
[31m-[m
[31m-#define luaL_dofile(L, fn) \[m
[31m-	(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_dostring(L, s) \[m
[31m-	(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))[m
[31m-[m
[31m-#define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))[m
[31m-[m
[31m-#define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Generic Buffer manipulation[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct luaL_Buffer {[m
[31m-  char *p;			/* current position in buffer */[m
[31m-  int lvl;  /* number of strings in the stack (level) */[m
[31m-  lua_State *L;[m
[31m-  char buffer[LUAL_BUFFERSIZE];[m
[31m-} luaL_Buffer;[m
[31m-[m
[31m-#define luaL_addchar(B,c) \[m
[31m-  ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \[m
[31m-   (*(B)->p++ = (char)(c)))[m
[31m-[m
[31m-/* compatibility only */[m
[31m-#define luaL_putchar(B,c)	luaL_addchar(B,c)[m
[31m-[m
[31m-#define luaL_addsize(B,n)	((B)->p += (n))[m
[31m-[m
[31m-LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);[m
[31m-LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);[m
[31m-LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);[m
[31m-LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);[m
[31m-LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-/* compatibility with ref system */[m
[31m-[m
[31m-/* pre-defined references */[m
[31m-#define LUA_NOREF       (-2)[m
[31m-#define LUA_REFNIL      (-1)[m
[31m-[m
[31m-#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \[m
[31m-      (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))[m
[31m-[m
[31m-#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))[m
[31m-[m
[31m-[m
[31m-#define luaL_reg	luaL_Reg[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lbaselib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lbaselib.c[m
[1mdeleted file mode 100644[m
[1mindex 2ab550b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lbaselib.c[m
[1m+++ /dev/null[m
[36m@@ -1,653 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $[m
[31m-** Basic library[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lbaselib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** If your system does not support `stdout', you can just remove this function.[m
[31m-** If you need, you can define your own `print' function, following this[m
[31m-** model but changing `fputs' to put the strings at a proper place[m
[31m-** (a console window or a log file, for instance).[m
[31m-*/[m
[31m-static int luaB_print (lua_State *L) {[m
[31m-  int n = lua_gettop(L);  /* number of arguments */[m
[31m-  int i;[m
[31m-  lua_getglobal(L, "tostring");[m
[31m-  for (i=1; i<=n; i++) {[m
[31m-    const char *s;[m
[31m-    lua_pushvalue(L, -1);  /* function to be called */[m
[31m-    lua_pushvalue(L, i);   /* value to print */[m
[31m-    lua_call(L, 1, 1);[m
[31m-    s = lua_tostring(L, -1);  /* get result */[m
[31m-    if (s == NULL)[m
[31m-      return luaL_error(L, LUA_QL("tostring") " must return a string to "[m
[31m-                           LUA_QL("print"));[m
[31m-    if (i>1) fputs("\t", stdout);[m
[31m-    fputs(s, stdout);[m
[31m-    lua_pop(L, 1);  /* pop result */[m
[31m-  }[m
[31m-  fputs("\n", stdout);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_tonumber (lua_State *L) {[m
[31m-  int base = luaL_optint(L, 2, 10);[m
[31m-  if (base == 10) {  /* standard conversion */[m
[31m-    luaL_checkany(L, 1);[m
[31m-    if (lua_isnumber(L, 1)) {[m
[31m-      lua_pushnumber(L, lua_tonumber(L, 1));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  else {[m
[31m-    const char *s1 = luaL_checkstring(L, 1);[m
[31m-    char *s2;[m
[31m-    unsigned long n;[m
[31m-    luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");[m
[31m-    n = strtoul(s1, &s2, base);[m
[31m-    if (s1 != s2) {  /* at least one valid digit? */[m
[31m-      while (isspace((unsigned char)(*s2))) s2++;  /* skip trailing spaces */[m
[31m-      if (*s2 == '\0') {  /* no invalid trailing characters? */[m
[31m-        lua_pushnumber(L, (lua_Number)n);[m
[31m-        return 1;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  lua_pushnil(L);  /* else not a number */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_error (lua_State *L) {[m
[31m-  int level = luaL_optint(L, 2, 1);[m
[31m-  lua_settop(L, 1);[m
[31m-  if (lua_isstring(L, 1) && level > 0) {  /* add extra information? */[m
[31m-    luaL_where(L, level);[m
[31m-    lua_pushvalue(L, 1);[m
[31m-    lua_concat(L, 2);[m
[31m-  }[m
[31m-  return lua_error(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_getmetatable (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;  /* no metatable */[m
[31m-  }[m
[31m-  luaL_getmetafield(L, 1, "__metatable");[m
[31m-  return 1;  /* returns either __metatable field (if present) or metatable */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_setmetatable (lua_State *L) {[m
[31m-  int t = lua_type(L, 2);[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,[m
[31m-                    "nil or table expected");[m
[31m-  if (luaL_getmetafield(L, 1, "__metatable"))[m
[31m-    luaL_error(L, "cannot change a protected metatable");[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_setmetatable(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void getfunc (lua_State *L, int opt) {[m
[31m-  if (lua_isfunction(L, 1)) lua_pushvalue(L, 1);[m
[31m-  else {[m
[31m-    lua_Debug ar;[m
[31m-    int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1);[m
[31m-    luaL_argcheck(L, level >= 0, 1, "level must be non-negative");[m
[31m-    if (lua_getstack(L, level, &ar) == 0)[m
[31m-      luaL_argerror(L, 1, "invalid level");[m
[31m-    lua_getinfo(L, "f", &ar);[m
[31m-    if (lua_isnil(L, -1))[m
[31m-      luaL_error(L, "no function environment for tail call at level %d",[m
[31m-                    level);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_getfenv (lua_State *L) {[m
[31m-  getfunc(L, 1);[m
[31m-  if (lua_iscfunction(L, -1))  /* is a C function? */[m
[31m-    lua_pushvalue(L, LUA_GLOBALSINDEX);  /* return the thread's global env. */[m
[31m-  else[m
[31m-    lua_getfenv(L, -1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_setfenv (lua_State *L) {[m
[31m-  luaL_checktype(L, 2, LUA_TTABLE);[m
[31m-  getfunc(L, 0);[m
[31m-  lua_pushvalue(L, 2);[m
[31m-  if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) {[m
[31m-    /* change environment of current thread */[m
[31m-    lua_pushthread(L);[m
[31m-    lua_insert(L, -2);[m
[31m-    lua_setfenv(L, -2);[m
[31m-    return 0;[m
[31m-  }[m
[31m-  else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0)[m
[31m-    luaL_error(L,[m
[31m-          LUA_QL("setfenv") " cannot change environment of given object");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_rawequal (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  luaL_checkany(L, 2);[m
[31m-  lua_pushboolean(L, lua_rawequal(L, 1, 2));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_rawget (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  luaL_checkany(L, 2);[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_rawget(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int luaB_rawset (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  luaL_checkany(L, 2);[m
[31m-  luaL_checkany(L, 3);[m
[31m-  lua_settop(L, 3);[m
[31m-  lua_rawset(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_gcinfo (lua_State *L) {[m
[31m-  lua_pushinteger(L, lua_getgccount(L));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_collectgarbage (lua_State *L) {[m
[31m-  static const char *const opts[] = {"stop", "restart", "collect",[m
[31m-    "count", "step", "setpause", "setstepmul", NULL};[m
[31m-  static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,[m
[31m-    LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL};[m
[31m-  int o = luaL_checkoption(L, 1, "collect", opts);[m
[31m-  int ex = luaL_optint(L, 2, 0);[m
[31m-  int res = lua_gc(L, optsnum[o], ex);[m
[31m-  switch (optsnum[o]) {[m
[31m-    case LUA_GCCOUNT: {[m
[31m-      int b = lua_gc(L, LUA_GCCOUNTB, 0);[m
[31m-      lua_pushnumber(L, res + ((lua_Number)b/1024));[m
[31m-      return 1;[m
[31m-    }[m
[31m-    case LUA_GCSTEP: {[m
[31m-      lua_pushboolean(L, res);[m
[31m-      return 1;[m
[31m-    }[m
[31m-    default: {[m
[31m-      lua_pushnumber(L, res);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_type (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  lua_pushstring(L, luaL_typename(L, 1));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_next (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  lua_settop(L, 2);  /* create a 2nd argument if there isn't one */[m
[31m-  if (lua_next(L, 1))[m
[31m-    return 2;[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_pairs (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  lua_pushvalue(L, lua_upvalueindex(1));  /* return generator, */[m
[31m-  lua_pushvalue(L, 1);  /* state, */[m
[31m-  lua_pushnil(L);  /* and initial value */[m
[31m-  return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ipairsaux (lua_State *L) {[m
[31m-  int i = luaL_checkint(L, 2);[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  i++;  /* next value */[m
[31m-  lua_pushinteger(L, i);[m
[31m-  lua_rawgeti(L, 1, i);[m
[31m-  return (lua_isnil(L, -1)) ? 0 : 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_ipairs (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  lua_pushvalue(L, lua_upvalueindex(1));  /* return generator, */[m
[31m-  lua_pushvalue(L, 1);  /* state, */[m
[31m-  lua_pushinteger(L, 0);  /* and initial value */[m
[31m-  return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int load_aux (lua_State *L, int status) {[m
[31m-  if (status == 0)  /* OK? */[m
[31m-    return 1;[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    lua_insert(L, -2);  /* put before error message */[m
[31m-    return 2;  /* return nil plus error message */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_loadstring (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  const char *chunkname = luaL_optstring(L, 2, s);[m
[31m-  return load_aux(L, luaL_loadbuffer(L, s, l, chunkname));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_loadfile (lua_State *L) {[m
[31m-  const char *fname = luaL_optstring(L, 1, NULL);[m
[31m-  return load_aux(L, luaL_loadfile(L, fname));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Reader for generic `load' function: `lua_load' uses the[m
[31m-** stack for internal stuff, so the reader cannot change the[m
[31m-** stack top. Instead, it keeps its resulting string in a[m
[31m-** reserved slot inside the stack.[m
[31m-*/[m
[31m-static const char *generic_reader (lua_State *L, void *ud, size_t *size) {[m
[31m-  (void)ud;  /* to avoid warnings */[m
[31m-  luaL_checkstack(L, 2, "too many nested functions");[m
[31m-  lua_pushvalue(L, 1);  /* get function */[m
[31m-  lua_call(L, 0, 1);  /* call it */[m
[31m-  if (lua_isnil(L, -1)) {[m
[31m-    *size = 0;[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  else if (lua_isstring(L, -1)) {[m
[31m-    lua_replace(L, 3);  /* save string in a reserved stack slot */[m
[31m-    return lua_tolstring(L, 3, size);[m
[31m-  }[m
[31m-  else luaL_error(L, "reader function must return a string");[m
[31m-  return NULL;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_load (lua_State *L) {[m
[31m-  int status;[m
[31m-  const char *cname = luaL_optstring(L, 2, "=(load)");[m
[31m-  luaL_checktype(L, 1, LUA_TFUNCTION);[m
[31m-  lua_settop(L, 3);  /* function, eventual name, plus one reserved slot */[m
[31m-  status = lua_load(L, generic_reader, NULL, cname);[m
[31m-  return load_aux(L, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_dofile (lua_State *L) {[m
[31m-  const char *fname = luaL_optstring(L, 1, NULL);[m
[31m-  int n = lua_gettop(L);[m
[31m-  if (luaL_loadfile(L, fname) != 0) lua_error(L);[m
[31m-  lua_call(L, 0, LUA_MULTRET);[m
[31m-  return lua_gettop(L) - n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_assert (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  if (!lua_toboolean(L, 1))[m
[31m-    return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!"));[m
[31m-  return lua_gettop(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_unpack (lua_State *L) {[m
[31m-  int i, e, n;[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  i = luaL_optint(L, 2, 1);[m
[31m-  e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));[m
[31m-  if (i > e) return 0;  /* empty range */[m
[31m-  n = e - i + 1;  /* number of elements */[m
[31m-  if (n <= 0 || !lua_checkstack(L, n))  /* n <= 0 means arith. overflow */[m
[31m-    return luaL_error(L, "too many results to unpack");[m
[31m-  lua_rawgeti(L, 1, i);  /* push arg[i] (avoiding overflow problems) */[m
[31m-  while (i++ < e)  /* push arg[i + 1...e] */[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_select (lua_State *L) {[m
[31m-  int n = lua_gettop(L);[m
[31m-  if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') {[m
[31m-    lua_pushinteger(L, n-1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else {[m
[31m-    int i = luaL_checkint(L, 1);[m
[31m-    if (i < 0) i = n + i;[m
[31m-    else if (i > n) i = n;[m
[31m-    luaL_argcheck(L, 1 <= i, 1, "index out of range");[m
[31m-    return n - i;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_pcall (lua_State *L) {[m
[31m-  int status;[m
[31m-  luaL_checkany(L, 1);[m
[31m-  status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0);[m
[31m-  lua_pushboolean(L, (status == 0));[m
[31m-  lua_insert(L, 1);[m
[31m-  return lua_gettop(L);  /* return status + all results */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_xpcall (lua_State *L) {[m
[31m-  int status;[m
[31m-  luaL_checkany(L, 2);[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_insert(L, 1);  /* put error function under function to be called */[m
[31m-  status = lua_pcall(L, 0, LUA_MULTRET, 1);[m
[31m-  lua_pushboolean(L, (status == 0));[m
[31m-  lua_replace(L, 1);[m
[31m-  return lua_gettop(L);  /* return status + all results */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_tostring (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  if (luaL_callmeta(L, 1, "__tostring"))  /* is there a metafield? */[m
[31m-    return 1;  /* use its value */[m
[31m-  switch (lua_type(L, 1)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-      lua_pushstring(L, lua_tostring(L, 1));[m
[31m-      break;[m
[31m-    case LUA_TSTRING:[m
[31m-      lua_pushvalue(L, 1);[m
[31m-      break;[m
[31m-    case LUA_TBOOLEAN:[m
[31m-      lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false"));[m
[31m-      break;[m
[31m-    case LUA_TNIL:[m
[31m-      lua_pushliteral(L, "nil");[m
[31m-      break;[m
[31m-    default:[m
[31m-      lua_pushfstring(L, "%s: %p", luaL_typename(L, 1), lua_topointer(L, 1));[m
[31m-      break;[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_newproxy (lua_State *L) {[m
[31m-  lua_settop(L, 1);[m
[31m-  lua_newuserdata(L, 0);  /* create proxy */[m
[31m-  if (lua_toboolean(L, 1) == 0)[m
[31m-    return 1;  /* no metatable */[m
[31m-  else if (lua_isboolean(L, 1)) {[m
[31m-    lua_newtable(L);  /* create a new metatable `m' ... */[m
[31m-    lua_pushvalue(L, -1);  /* ... and mark `m' as a valid metatable */[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_rawset(L, lua_upvalueindex(1));  /* weaktable[m] = true */[m
[31m-  }[m
[31m-  else {[m
[31m-    int validproxy = 0;  /* to check if weaktable[metatable(u)] == true */[m
[31m-    if (lua_getmetatable(L, 1)) {[m
[31m-      lua_rawget(L, lua_upvalueindex(1));[m
[31m-      validproxy = lua_toboolean(L, -1);[m
[31m-      lua_pop(L, 1);  /* remove value */[m
[31m-    }[m
[31m-    luaL_argcheck(L, validproxy, 1, "boolean or proxy expected");[m
[31m-    lua_getmetatable(L, 1);  /* metatable is valid; get it */[m
[31m-  }[m
[31m-  lua_setmetatable(L, 2);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg base_funcs[] = {[m
[31m-  {"assert", luaB_assert},[m
[31m-  {"collectgarbage", luaB_collectgarbage},[m
[31m-  {"dofile", luaB_dofile},[m
[31m-  {"error", luaB_error},[m
[31m-  {"gcinfo", luaB_gcinfo},[m
[31m-  {"getfenv", luaB_getfenv},[m
[31m-  {"getmetatable", luaB_getmetatable},[m
[31m-  {"loadfile", luaB_loadfile},[m
[31m-  {"load", luaB_load},[m
[31m-  {"loadstring", luaB_loadstring},[m
[31m-  {"next", luaB_next},[m
[31m-  {"pcall", luaB_pcall},[m
[31m-  {"print", luaB_print},[m
[31m-  {"rawequal", luaB_rawequal},[m
[31m-  {"rawget", luaB_rawget},[m
[31m-  {"rawset", luaB_rawset},[m
[31m-  {"select", luaB_select},[m
[31m-  {"setfenv", luaB_setfenv},[m
[31m-  {"setmetatable", luaB_setmetatable},[m
[31m-  {"tonumber", luaB_tonumber},[m
[31m-  {"tostring", luaB_tostring},[m
[31m-  {"type", luaB_type},[m
[31m-  {"unpack", luaB_unpack},[m
[31m-  {"xpcall", luaB_xpcall},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Coroutine library[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-#define CO_RUN	0	/* running */[m
[31m-#define CO_SUS	1	/* suspended */[m
[31m-#define CO_NOR	2	/* 'normal' (it resumed another coroutine) */[m
[31m-#define CO_DEAD	3[m
[31m-[m
[31m-static const char *const statnames[] =[m
[31m-    {"running", "suspended", "normal", "dead"};[m
[31m-[m
[31m-static int costatus (lua_State *L, lua_State *co) {[m
[31m-  if (L == co) return CO_RUN;[m
[31m-  switch (lua_status(co)) {[m
[31m-    case LUA_YIELD:[m
[31m-      return CO_SUS;[m
[31m-    case 0: {[m
[31m-      lua_Debug ar;[m
[31m-      if (lua_getstack(co, 0, &ar) > 0)  /* does it have frames? */[m
[31m-        return CO_NOR;  /* it is running */[m
[31m-      else if (lua_gettop(co) == 0)[m
[31m-          return CO_DEAD;[m
[31m-      else[m
[31m-        return CO_SUS;  /* initial state */[m
[31m-    }[m
[31m-    default:  /* some error occured */[m
[31m-      return CO_DEAD;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_costatus (lua_State *L) {[m
[31m-  lua_State *co = lua_tothread(L, 1);[m
[31m-  luaL_argcheck(L, co, 1, "coroutine expected");[m
[31m-  lua_pushstring(L, statnames[costatus(L, co)]);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int auxresume (lua_State *L, lua_State *co, int narg) {[m
[31m-  int status = costatus(L, co);[m
[31m-  if (!lua_checkstack(co, narg))[m
[31m-    luaL_error(L, "too many arguments to resume");[m
[31m-  if (status != CO_SUS) {[m
[31m-    lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]);[m
[31m-    return -1;  /* error flag */[m
[31m-  }[m
[31m-  lua_xmove(L, co, narg);[m
[31m-  lua_setlevel(L, co);[m
[31m-  status = lua_resume(co, narg);[m
[31m-  if (status == 0 || status == LUA_YIELD) {[m
[31m-    int nres = lua_gettop(co);[m
[31m-    if (!lua_checkstack(L, nres + 1))[m
[31m-      luaL_error(L, "too many results to resume");[m
[31m-    lua_xmove(co, L, nres);  /* move yielded values */[m
[31m-    return nres;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_xmove(co, L, 1);  /* move error message */[m
[31m-    return -1;  /* error flag */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_coresume (lua_State *L) {[m
[31m-  lua_State *co = lua_tothread(L, 1);[m
[31m-  int r;[m
[31m-  luaL_argcheck(L, co, 1, "coroutine expected");[m
[31m-  r = auxresume(L, co, lua_gettop(L) - 1);[m
[31m-  if (r < 0) {[m
[31m-    lua_pushboolean(L, 0);[m
[31m-    lua_insert(L, -2);[m
[31m-    return 2;  /* return false + error message */[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_insert(L, -(r + 1));[m
[31m-    return r + 1;  /* return true + `resume' returns */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_auxwrap (lua_State *L) {[m
[31m-  lua_State *co = lua_tothread(L, lua_upvalueindex(1));[m
[31m-  int r = auxresume(L, co, lua_gettop(L));[m
[31m-  if (r < 0) {[m
[31m-    if (lua_isstring(L, -1)) {  /* error object is a string? */[m
[31m-      luaL_where(L, 1);  /* add extra info */[m
[31m-      lua_insert(L, -2);[m
[31m-      lua_concat(L, 2);[m
[31m-    }[m
[31m-    lua_error(L);  /* propagate error */[m
[31m-  }[m
[31m-  return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_cocreate (lua_State *L) {[m
[31m-  lua_State *NL = lua_newthread(L);[m
[31m-  luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,[m
[31m-    "Lua function expected");[m
[31m-  lua_pushvalue(L, 1);  /* move function to top */[m
[31m-  lua_xmove(L, NL, 1);  /* move function from L to NL */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_cowrap (lua_State *L) {[m
[31m-  luaB_cocreate(L);[m
[31m-  lua_pushcclosure(L, luaB_auxwrap, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_yield (lua_State *L) {[m
[31m-  return lua_yield(L, lua_gettop(L));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaB_corunning (lua_State *L) {[m
[31m-  if (lua_pushthread(L))[m
[31m-    lua_pushnil(L);  /* main thread is not a coroutine */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg co_funcs[] = {[m
[31m-  {"create", luaB_cocreate},[m
[31m-  {"resume", luaB_coresume},[m
[31m-  {"running", luaB_corunning},[m
[31m-  {"status", luaB_costatus},[m
[31m-  {"wrap", luaB_cowrap},[m
[31m-  {"yield", luaB_yield},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static void auxopen (lua_State *L, const char *name,[m
[31m-                     lua_CFunction f, lua_CFunction u) {[m
[31m-  lua_pushcfunction(L, u);[m
[31m-  lua_pushcclosure(L, f, 1);[m
[31m-  lua_setfield(L, -2, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void base_open (lua_State *L) {[m
[31m-  /* set global _G */[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  lua_setglobal(L, "_G");[m
[31m-  /* open lib into global table */[m
[31m-  luaL_register(L, "_G", base_funcs);[m
[31m-  lua_pushliteral(L, LUA_VERSION);[m
[31m-  lua_setglobal(L, "_VERSION");  /* set global _VERSION */[m
[31m-  /* `ipairs' and `pairs' need auxiliary functions as upvalues */[m
[31m-  auxopen(L, "ipairs", luaB_ipairs, ipairsaux);[m
[31m-  auxopen(L, "pairs", luaB_pairs, luaB_next);[m
[31m-  /* `newproxy' needs a weaktable as upvalue */[m
[31m-  lua_createtable(L, 0, 1);  /* new table `w' */[m
[31m-  lua_pushvalue(L, -1);  /* `w' will be its own metatable */[m
[31m-  lua_setmetatable(L, -2);[m
[31m-  lua_pushliteral(L, "kv");[m
[31m-  lua_setfield(L, -2, "__mode");  /* metatable(w).__mode = "kv" */[m
[31m-  lua_pushcclosure(L, luaB_newproxy, 1);[m
[31m-  lua_setglobal(L, "newproxy");  /* set global `newproxy' */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_base (lua_State *L) {[m
[31m-  base_open(L);[m
[31m-  luaL_register(L, LUA_COLIBNAME, co_funcs);[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lcode.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lcode.c[m
[1mdeleted file mode 100644[m
[1mindex 679cb9c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lcode.c[m
[1m+++ /dev/null[m
[36m@@ -1,831 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lcode.c,v 2.25.1.5 2011/01/31 14:53:16 roberto Exp $[m
[31m-** Code generator for Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-[m
[31m-#define lcode_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lcode.h"[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lgc.h"[m
[31m-#include "llex.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lparser.h"[m
[31m-#include "ltable.h"[m
[31m-[m
[31m-[m
[31m-#define hasjumps(e)	((e)->t != (e)->f)[m
[31m-[m
[31m-[m
[31m-static int isnumeral(expdesc *e) {[m
[31m-  return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_nil (FuncState *fs, int from, int n) {[m
[31m-  Instruction *previous;[m
[31m-  if (fs->pc > fs->lasttarget) {  /* no jumps to current position? */[m
[31m-    if (fs->pc == 0) {  /* function start? */[m
[31m-      if (from >= fs->nactvar)[m
[31m-        return;  /* positions are already clean */[m
[31m-    }[m
[31m-    else {[m
[31m-      previous = &fs->f->code[fs->pc-1];[m
[31m-      if (GET_OPCODE(*previous) == OP_LOADNIL) {[m
[31m-        int pfrom = GETARG_A(*previous);[m
[31m-        int pto = GETARG_B(*previous);[m
[31m-        if (pfrom <= from && from <= pto+1) {  /* can connect both? */[m
[31m-          if (from+n-1 > pto)[m
[31m-            SETARG_B(*previous, from+n-1);[m
[31m-          return;[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0);  /* else no optimization */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_jump (FuncState *fs) {[m
[31m-  int jpc = fs->jpc;  /* save list of jumps to here */[m
[31m-  int j;[m
[31m-  fs->jpc = NO_JUMP;[m
[31m-  j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP);[m
[31m-  luaK_concat(fs, &j, jpc);  /* keep them on hold */[m
[31m-  return j;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_ret (FuncState *fs, int first, int nret) {[m
[31m-  luaK_codeABC(fs, OP_RETURN, first, nret+1, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {[m
[31m-  luaK_codeABC(fs, op, A, B, C);[m
[31m-  return luaK_jump(fs);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void fixjump (FuncState *fs, int pc, int dest) {[m
[31m-  Instruction *jmp = &fs->f->code[pc];[m
[31m-  int offset = dest-(pc+1);[m
[31m-  lua_assert(dest != NO_JUMP);[m
[31m-  if (abs(offset) > MAXARG_sBx)[m
[31m-    luaX_syntaxerror(fs->ls, "control structure too long");[m
[31m-  SETARG_sBx(*jmp, offset);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** returns current `pc' and marks it as a jump target (to avoid wrong[m
[31m-** optimizations with consecutive instructions not in the same basic block).[m
[31m-*/[m
[31m-int luaK_getlabel (FuncState *fs) {[m
[31m-  fs->lasttarget = fs->pc;[m
[31m-  return fs->pc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int getjump (FuncState *fs, int pc) {[m
[31m-  int offset = GETARG_sBx(fs->f->code[pc]);[m
[31m-  if (offset == NO_JUMP)  /* point to itself represents end of list */[m
[31m-    return NO_JUMP;  /* end of list */[m
[31m-  else[m
[31m-    return (pc+1)+offset;  /* turn offset into absolute position */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Instruction *getjumpcontrol (FuncState *fs, int pc) {[m
[31m-  Instruction *pi = &fs->f->code[pc];[m
[31m-  if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1))))[m
[31m-    return pi-1;[m
[31m-  else[m
[31m-    return pi;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** check whether list has any jump that do not produce a value[m
[31m-** (or produce an inverted value)[m
[31m-*/[m
[31m-static int need_value (FuncState *fs, int list) {[m
[31m-  for (; list != NO_JUMP; list = getjump(fs, list)) {[m
[31m-    Instruction i = *getjumpcontrol(fs, list);[m
[31m-    if (GET_OPCODE(i) != OP_TESTSET) return 1;[m
[31m-  }[m
[31m-  return 0;  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int patchtestreg (FuncState *fs, int node, int reg) {[m
[31m-  Instruction *i = getjumpcontrol(fs, node);[m
[31m-  if (GET_OPCODE(*i) != OP_TESTSET)[m
[31m-    return 0;  /* cannot patch other instructions */[m
[31m-  if (reg != NO_REG && reg != GETARG_B(*i))[m
[31m-    SETARG_A(*i, reg);[m
[31m-  else  /* no register to put value or register already has the value */[m
[31m-    *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i));[m
[31m-[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void removevalues (FuncState *fs, int list) {[m
[31m-  for (; list != NO_JUMP; list = getjump(fs, list))[m
[31m-      patchtestreg(fs, list, NO_REG);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,[m
[31m-                          int dtarget) {[m
[31m-  while (list != NO_JUMP) {[m
[31m-    int next = getjump(fs, list);[m
[31m-    if (patchtestreg(fs, list, reg))[m
[31m-      fixjump(fs, list, vtarget);[m
[31m-    else[m
[31m-      fixjump(fs, list, dtarget);  /* jump to default target */[m
[31m-    list = next;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void dischargejpc (FuncState *fs) {[m
[31m-  patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc);[m
[31m-  fs->jpc = NO_JUMP;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_patchlist (FuncState *fs, int list, int target) {[m
[31m-  if (target == fs->pc)[m
[31m-    luaK_patchtohere(fs, list);[m
[31m-  else {[m
[31m-    lua_assert(target < fs->pc);[m
[31m-    patchlistaux(fs, list, target, NO_REG, target);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_patchtohere (FuncState *fs, int list) {[m
[31m-  luaK_getlabel(fs);[m
[31m-  luaK_concat(fs, &fs->jpc, list);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_concat (FuncState *fs, int *l1, int l2) {[m
[31m-  if (l2 == NO_JUMP) return;[m
[31m-  else if (*l1 == NO_JUMP)[m
[31m-    *l1 = l2;[m
[31m-  else {[m
[31m-    int list = *l1;[m
[31m-    int next;[m
[31m-    while ((next = getjump(fs, list)) != NO_JUMP)  /* find last element */[m
[31m-      list = next;[m
[31m-    fixjump(fs, list, l2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_checkstack (FuncState *fs, int n) {[m
[31m-  int newstack = fs->freereg + n;[m
[31m-  if (newstack > fs->f->maxstacksize) {[m
[31m-    if (newstack >= MAXSTACK)[m
[31m-      luaX_syntaxerror(fs->ls, "function or expression too complex");[m
[31m-    fs->f->maxstacksize = cast_byte(newstack);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_reserveregs (FuncState *fs, int n) {[m
[31m-  luaK_checkstack(fs, n);[m
[31m-  fs->freereg += n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void freereg (FuncState *fs, int reg) {[m
[31m-  if (!ISK(reg) && reg >= fs->nactvar) {[m
[31m-    fs->freereg--;[m
[31m-    lua_assert(reg == fs->freereg);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void freeexp (FuncState *fs, expdesc *e) {[m
[31m-  if (e->k == VNONRELOC)[m
[31m-    freereg(fs, e->u.s.info);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int addk (FuncState *fs, TValue *k, TValue *v) {[m
[31m-  lua_State *L = fs->L;[m
[31m-  TValue *idx = luaH_set(L, fs->h, k);[m
[31m-  Proto *f = fs->f;[m
[31m-  int oldsize = f->sizek;[m
[31m-  if (ttisnumber(idx)) {[m
[31m-    lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v));[m
[31m-    return cast_int(nvalue(idx));[m
[31m-  }[m
[31m-  else {  /* constant not found; create a new entry */[m
[31m-    setnvalue(idx, cast_num(fs->nk));[m
[31m-    luaM_growvector(L, f->k, fs->nk, f->sizek, TValue,[m
[31m-                    MAXARG_Bx, "constant table overflow");[m
[31m-    while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);[m
[31m-    setobj(L, &f->k[fs->nk], v);[m
[31m-    luaC_barrier(L, f, v);[m
[31m-    return fs->nk++;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_stringK (FuncState *fs, TString *s) {[m
[31m-  TValue o;[m
[31m-  setsvalue(fs->L, &o, s);[m
[31m-  return addk(fs, &o, &o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_numberK (FuncState *fs, lua_Number r) {[m
[31m-  TValue o;[m
[31m-  setnvalue(&o, r);[m
[31m-  return addk(fs, &o, &o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int boolK (FuncState *fs, int b) {[m
[31m-  TValue o;[m
[31m-  setbvalue(&o, b);[m
[31m-  return addk(fs, &o, &o);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int nilK (FuncState *fs) {[m
[31m-  TValue k, v;[m
[31m-  setnilvalue(&v);[m
[31m-  /* cannot use nil as key; instead use table itself to represent nil */[m
[31m-  sethvalue(fs->L, &k, fs->h);[m
[31m-  return addk(fs, &k, &v);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {[m
[31m-  if (e->k == VCALL) {  /* expression is an open function call? */[m
[31m-    SETARG_C(getcode(fs, e), nresults+1);[m
[31m-  }[m
[31m-  else if (e->k == VVARARG) {[m
[31m-    SETARG_B(getcode(fs, e), nresults+1);[m
[31m-    SETARG_A(getcode(fs, e), fs->freereg);[m
[31m-    luaK_reserveregs(fs, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_setoneret (FuncState *fs, expdesc *e) {[m
[31m-  if (e->k == VCALL) {  /* expression is an open function call? */[m
[31m-    e->k = VNONRELOC;[m
[31m-    e->u.s.info = GETARG_A(getcode(fs, e));[m
[31m-  }[m
[31m-  else if (e->k == VVARARG) {[m
[31m-    SETARG_B(getcode(fs, e), 2);[m
[31m-    e->k = VRELOCABLE;  /* can relocate its simple result */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_dischargevars (FuncState *fs, expdesc *e) {[m
[31m-  switch (e->k) {[m
[31m-    case VLOCAL: {[m
[31m-      e->k = VNONRELOC;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VUPVAL: {[m
[31m-      e->u.s.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.s.info, 0);[m
[31m-      e->k = VRELOCABLE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VGLOBAL: {[m
[31m-      e->u.s.info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->u.s.info);[m
[31m-      e->k = VRELOCABLE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VINDEXED: {[m
[31m-      freereg(fs, e->u.s.aux);[m
[31m-      freereg(fs, e->u.s.info);[m
[31m-      e->u.s.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.s.info, e->u.s.aux);[m
[31m-      e->k = VRELOCABLE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VVARARG:[m
[31m-    case VCALL: {[m
[31m-      luaK_setoneret(fs, e);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: break;  /* there is one value available (somewhere) */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int code_label (FuncState *fs, int A, int b, int jump) {[m
[31m-  luaK_getlabel(fs);  /* those instructions may be jump targets */[m
[31m-  return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void discharge2reg (FuncState *fs, expdesc *e, int reg) {[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VNIL: {[m
[31m-      luaK_nil(fs, reg, 1);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VFALSE:  case VTRUE: {[m
[31m-      luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VK: {[m
[31m-      luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VKNUM: {[m
[31m-      luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval));[m
[31m-      break;[m
[31m-    }[m
[31m-    case VRELOCABLE: {[m
[31m-      Instruction *pc = &getcode(fs, e);[m
[31m-      SETARG_A(*pc, reg);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VNONRELOC: {[m
[31m-      if (reg != e->u.s.info)[m
[31m-        luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      lua_assert(e->k == VVOID || e->k == VJMP);[m
[31m-      return;  /* nothing to do... */[m
[31m-    }[m
[31m-  }[m
[31m-  e->u.s.info = reg;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void discharge2anyreg (FuncState *fs, expdesc *e) {[m
[31m-  if (e->k != VNONRELOC) {[m
[31m-    luaK_reserveregs(fs, 1);[m
[31m-    discharge2reg(fs, e, fs->freereg-1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void exp2reg (FuncState *fs, expdesc *e, int reg) {[m
[31m-  discharge2reg(fs, e, reg);[m
[31m-  if (e->k == VJMP)[m
[31m-    luaK_concat(fs, &e->t, e->u.s.info);  /* put this jump in `t' list */[m
[31m-  if (hasjumps(e)) {[m
[31m-    int final;  /* position after whole expression */[m
[31m-    int p_f = NO_JUMP;  /* position of an eventual LOAD false */[m
[31m-    int p_t = NO_JUMP;  /* position of an eventual LOAD true */[m
[31m-    if (need_value(fs, e->t) || need_value(fs, e->f)) {[m
[31m-      int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);[m
[31m-      p_f = code_label(fs, reg, 0, 1);[m
[31m-      p_t = code_label(fs, reg, 1, 0);[m
[31m-      luaK_patchtohere(fs, fj);[m
[31m-    }[m
[31m-    final = luaK_getlabel(fs);[m
[31m-    patchlistaux(fs, e->f, final, reg, p_f);[m
[31m-    patchlistaux(fs, e->t, final, reg, p_t);[m
[31m-  }[m
[31m-  e->f = e->t = NO_JUMP;[m
[31m-  e->u.s.info = reg;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_exp2nextreg (FuncState *fs, expdesc *e) {[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  freeexp(fs, e);[m
[31m-  luaK_reserveregs(fs, 1);[m
[31m-  exp2reg(fs, e, fs->freereg - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_exp2anyreg (FuncState *fs, expdesc *e) {[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  if (e->k == VNONRELOC) {[m
[31m-    if (!hasjumps(e)) return e->u.s.info;  /* exp is already in a register */[m
[31m-    if (e->u.s.info >= fs->nactvar) {  /* reg. is not a local? */[m
[31m-      exp2reg(fs, e, e->u.s.info);  /* put value on it */[m
[31m-      return e->u.s.info;[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_exp2nextreg(fs, e);  /* default */[m
[31m-  return e->u.s.info;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_exp2val (FuncState *fs, expdesc *e) {[m
[31m-  if (hasjumps(e))[m
[31m-    luaK_exp2anyreg(fs, e);[m
[31m-  else[m
[31m-    luaK_dischargevars(fs, e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_exp2RK (FuncState *fs, expdesc *e) {[m
[31m-  luaK_exp2val(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VKNUM:[m
[31m-    case VTRUE:[m
[31m-    case VFALSE:[m
[31m-    case VNIL: {[m
[31m-      if (fs->nk <= MAXINDEXRK) {  /* constant fit in RK operand? */[m
[31m-        e->u.s.info = (e->k == VNIL)  ? nilK(fs) :[m
[31m-                      (e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) :[m
[31m-                                        boolK(fs, (e->k == VTRUE));[m
[31m-        e->k = VK;[m
[31m-        return RKASK(e->u.s.info);[m
[31m-      }[m
[31m-      else break;[m
[31m-    }[m
[31m-    case VK: {[m
[31m-      if (e->u.s.info <= MAXINDEXRK)  /* constant fit in argC? */[m
[31m-        return RKASK(e->u.s.info);[m
[31m-      else break;[m
[31m-    }[m
[31m-    default: break;[m
[31m-  }[m
[31m-  /* not a constant in the right range: put it in a register */[m
[31m-  return luaK_exp2anyreg(fs, e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {[m
[31m-  switch (var->k) {[m
[31m-    case VLOCAL: {[m
[31m-      freeexp(fs, ex);[m
[31m-      exp2reg(fs, ex, var->u.s.info);[m
[31m-      return;[m
[31m-    }[m
[31m-    case VUPVAL: {[m
[31m-      int e = luaK_exp2anyreg(fs, ex);[m
[31m-      luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VGLOBAL: {[m
[31m-      int e = luaK_exp2anyreg(fs, ex);[m
[31m-      luaK_codeABx(fs, OP_SETGLOBAL, e, var->u.s.info);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VINDEXED: {[m
[31m-      int e = luaK_exp2RK(fs, ex);[m
[31m-      luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      lua_assert(0);  /* invalid var kind to store */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  freeexp(fs, ex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {[m
[31m-  int func;[m
[31m-  luaK_exp2anyreg(fs, e);[m
[31m-  freeexp(fs, e);[m
[31m-  func = fs->freereg;[m
[31m-  luaK_reserveregs(fs, 2);[m
[31m-  luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key));[m
[31m-  freeexp(fs, key);[m
[31m-  e->u.s.info = func;[m
[31m-  e->k = VNONRELOC;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void invertjump (FuncState *fs, expdesc *e) {[m
[31m-  Instruction *pc = getjumpcontrol(fs, e->u.s.info);[m
[31m-  lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET &&[m
[31m-                                           GET_OPCODE(*pc) != OP_TEST);[m
[31m-  SETARG_A(*pc, !(GETARG_A(*pc)));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int jumponcond (FuncState *fs, expdesc *e, int cond) {[m
[31m-  if (e->k == VRELOCABLE) {[m
[31m-    Instruction ie = getcode(fs, e);[m
[31m-    if (GET_OPCODE(ie) == OP_NOT) {[m
[31m-      fs->pc--;  /* remove previous OP_NOT */[m
[31m-      return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond);[m
[31m-    }[m
[31m-    /* else go through */[m
[31m-  }[m
[31m-  discharge2anyreg(fs, e);[m
[31m-  freeexp(fs, e);[m
[31m-  return condjump(fs, OP_TESTSET, NO_REG, e->u.s.info, cond);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_goiftrue (FuncState *fs, expdesc *e) {[m
[31m-  int pc;  /* pc of last jump */[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VK: case VKNUM: case VTRUE: {[m
[31m-      pc = NO_JUMP;  /* always true; do nothing */[m
[31m-      break;[m
[31m-    }[m
[31m-    case VJMP: {[m
[31m-      invertjump(fs, e);[m
[31m-      pc = e->u.s.info;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      pc = jumponcond(fs, e, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_concat(fs, &e->f, pc);  /* insert last jump in `f' list */[m
[31m-  luaK_patchtohere(fs, e->t);[m
[31m-  e->t = NO_JUMP;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void luaK_goiffalse (FuncState *fs, expdesc *e) {[m
[31m-  int pc;  /* pc of last jump */[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VNIL: case VFALSE: {[m
[31m-      pc = NO_JUMP;  /* always false; do nothing */[m
[31m-      break;[m
[31m-    }[m
[31m-    case VJMP: {[m
[31m-      pc = e->u.s.info;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      pc = jumponcond(fs, e, 1);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_concat(fs, &e->t, pc);  /* insert last jump in `t' list */[m
[31m-  luaK_patchtohere(fs, e->f);[m
[31m-  e->f = NO_JUMP;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void codenot (FuncState *fs, expdesc *e) {[m
[31m-  luaK_dischargevars(fs, e);[m
[31m-  switch (e->k) {[m
[31m-    case VNIL: case VFALSE: {[m
[31m-      e->k = VTRUE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VK: case VKNUM: case VTRUE: {[m
[31m-      e->k = VFALSE;[m
[31m-      break;[m
[31m-    }[m
[31m-    case VJMP: {[m
[31m-      invertjump(fs, e);[m
[31m-      break;[m
[31m-    }[m
[31m-    case VRELOCABLE:[m
[31m-    case VNONRELOC: {[m
[31m-      discharge2anyreg(fs, e);[m
[31m-      freeexp(fs, e);[m
[31m-      e->u.s.info = luaK_codeABC(fs, OP_NOT, 0, e->u.s.info, 0);[m
[31m-      e->k = VRELOCABLE;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      lua_assert(0);  /* cannot happen */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  /* interchange true and false lists */[m
[31m-  { int temp = e->f; e->f = e->t; e->t = temp; }[m
[31m-  removevalues(fs, e->f);[m
[31m-  removevalues(fs, e->t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {[m
[31m-  t->u.s.aux = luaK_exp2RK(fs, k);[m
[31m-  t->k = VINDEXED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {[m
[31m-  lua_Number v1, v2, r;[m
[31m-  if (!isnumeral(e1) || !isnumeral(e2)) return 0;[m
[31m-  v1 = e1->u.nval;[m
[31m-  v2 = e2->u.nval;[m
[31m-  switch (op) {[m
[31m-    case OP_ADD: r = luai_numadd(v1, v2); break;[m
[31m-    case OP_SUB: r = luai_numsub(v1, v2); break;[m
[31m-    case OP_MUL: r = luai_nummul(v1, v2); break;[m
[31m-    case OP_DIV:[m
[31m-      if (v2 == 0) return 0;  /* do not attempt to divide by 0 */[m
[31m-      r = luai_numdiv(v1, v2); break;[m
[31m-    case OP_MOD:[m
[31m-      if (v2 == 0) return 0;  /* do not attempt to divide by 0 */[m
[31m-      r = luai_nummod(v1, v2); break;[m
[31m-    case OP_POW: r = luai_numpow(v1, v2); break;[m
[31m-    case OP_UNM: r = luai_numunm(v1); break;[m
[31m-    case OP_LEN: return 0;  /* no constant folding for 'len' */[m
[31m-    default: lua_assert(0); r = 0; break;[m
[31m-  }[m
[31m-  if (luai_numisnan(r)) return 0;  /* do not attempt to produce NaN */[m
[31m-  e1->u.nval = r;[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {[m
[31m-  if (constfolding(op, e1, e2))[m
[31m-    return;[m
[31m-  else {[m
[31m-    int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0;[m
[31m-    int o1 = luaK_exp2RK(fs, e1);[m
[31m-    if (o1 > o2) {[m
[31m-      freeexp(fs, e1);[m
[31m-      freeexp(fs, e2);[m
[31m-    }[m
[31m-    else {[m
[31m-      freeexp(fs, e2);[m
[31m-      freeexp(fs, e1);[m
[31m-    }[m
[31m-    e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2);[m
[31m-    e1->k = VRELOCABLE;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,[m
[31m-                                                          expdesc *e2) {[m
[31m-  int o1 = luaK_exp2RK(fs, e1);[m
[31m-  int o2 = luaK_exp2RK(fs, e2);[m
[31m-  freeexp(fs, e2);[m
[31m-  freeexp(fs, e1);[m
[31m-  if (cond == 0 && op != OP_EQ) {[m
[31m-    int temp;  /* exchange args to replace by `<' or `<=' */[m
[31m-    temp = o1; o1 = o2; o2 = temp;  /* o1 <==> o2 */[m
[31m-    cond = 1;[m
[31m-  }[m
[31m-  e1->u.s.info = condjump(fs, op, cond, o1, o2);[m
[31m-  e1->k = VJMP;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {[m
[31m-  expdesc e2;[m
[31m-  e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;[m
[31m-  switch (op) {[m
[31m-    case OPR_MINUS: {[m
[31m-      if (!isnumeral(e))[m
[31m-        luaK_exp2anyreg(fs, e);  /* cannot operate on non-numeric constants */[m
[31m-      codearith(fs, OP_UNM, e, &e2);[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_NOT: codenot(fs, e); break;[m
[31m-    case OPR_LEN: {[m
[31m-      luaK_exp2anyreg(fs, e);  /* cannot operate on constants */[m
[31m-      codearith(fs, OP_LEN, e, &e2);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: lua_assert(0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {[m
[31m-  switch (op) {[m
[31m-    case OPR_AND: {[m
[31m-      luaK_goiftrue(fs, v);[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_OR: {[m
[31m-      luaK_goiffalse(fs, v);[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_CONCAT: {[m
[31m-      luaK_exp2nextreg(fs, v);  /* operand must be on the `stack' */[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:[m
[31m-    case OPR_MOD: case OPR_POW: {[m
[31m-      if (!isnumeral(v)) luaK_exp2RK(fs, v);[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      luaK_exp2RK(fs, v);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {[m
[31m-  switch (op) {[m
[31m-    case OPR_AND: {[m
[31m-      lua_assert(e1->t == NO_JUMP);  /* list must be closed */[m
[31m-      luaK_dischargevars(fs, e2);[m
[31m-      luaK_concat(fs, &e2->f, e1->f);[m
[31m-      *e1 = *e2;[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_OR: {[m
[31m-      lua_assert(e1->f == NO_JUMP);  /* list must be closed */[m
[31m-      luaK_dischargevars(fs, e2);[m
[31m-      luaK_concat(fs, &e2->t, e1->t);[m
[31m-      *e1 = *e2;[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_CONCAT: {[m
[31m-      luaK_exp2val(fs, e2);[m
[31m-      if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) {[m
[31m-        lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1);[m
[31m-        freeexp(fs, e1);[m
[31m-        SETARG_B(getcode(fs, e2), e1->u.s.info);[m
[31m-        e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info;[m
[31m-      }[m
[31m-      else {[m
[31m-        luaK_exp2nextreg(fs, e2);  /* operand must be on the 'stack' */[m
[31m-        codearith(fs, OP_CONCAT, e1, e2);[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-    case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break;[m
[31m-    case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break;[m
[31m-    case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break;[m
[31m-    case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break;[m
[31m-    case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break;[m
[31m-    case OPR_POW: codearith(fs, OP_POW, e1, e2); break;[m
[31m-    case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break;[m
[31m-    case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break;[m
[31m-    case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break;[m
[31m-    case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break;[m
[31m-    case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break;[m
[31m-    case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break;[m
[31m-    default: lua_assert(0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_fixline (FuncState *fs, int line) {[m
[31m-  fs->f->lineinfo[fs->pc - 1] = line;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int luaK_code (FuncState *fs, Instruction i, int line) {[m
[31m-  Proto *f = fs->f;[m
[31m-  dischargejpc(fs);  /* `pc' will change */[m
[31m-  /* put new instruction in code array */[m
[31m-  luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,[m
[31m-                  MAX_INT, "code size overflow");[m
[31m-  f->code[fs->pc] = i;[m
[31m-  /* save corresponding line information */[m
[31m-  luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int,[m
[31m-                  MAX_INT, "code size overflow");[m
[31m-  f->lineinfo[fs->pc] = line;[m
[31m-  return fs->pc++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {[m
[31m-  lua_assert(getOpMode(o) == iABC);[m
[31m-  lua_assert(getBMode(o) != OpArgN || b == 0);[m
[31m-  lua_assert(getCMode(o) != OpArgN || c == 0);[m
[31m-  return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {[m
[31m-  lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx);[m
[31m-  lua_assert(getCMode(o) == OpArgN);[m
[31m-  return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {[m
[31m-  int c =  (nelems - 1)/LFIELDS_PER_FLUSH + 1;[m
[31m-  int b = (tostore == LUA_MULTRET) ? 0 : tostore;[m
[31m-  lua_assert(tostore != 0);[m
[31m-  if (c <= MAXARG_C)[m
[31m-    luaK_codeABC(fs, OP_SETLIST, base, b, c);[m
[31m-  else {[m
[31m-    luaK_codeABC(fs, OP_SETLIST, base, b, 0);[m
[31m-    luaK_code(fs, cast(Instruction, c), fs->ls->lastline);[m
[31m-  }[m
[31m-  fs->freereg = base + 1;  /* free registers with list values */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lcode.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lcode.h[m
[1mdeleted file mode 100644[m
[1mindex b941c60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lcode.h[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Code generator for Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lcode_h[m
[31m-#define lcode_h[m
[31m-[m
[31m-#include "llex.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lparser.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Marks the end of a patch list. It is an invalid value both as an absolute[m
[31m-** address, and as a list link (would link an element to itself).[m
[31m-*/[m
[31m-#define NO_JUMP (-1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** grep "ORDER OPR" if you change these enums[m
[31m-*/[m
[31m-typedef enum BinOpr {[m
[31m-  OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,[m
[31m-  OPR_CONCAT,[m
[31m-  OPR_NE, OPR_EQ,[m
[31m-  OPR_LT, OPR_LE, OPR_GT, OPR_GE,[m
[31m-  OPR_AND, OPR_OR,[m
[31m-  OPR_NOBINOPR[m
[31m-} BinOpr;[m
[31m-[m
[31m-[m
[31m-typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;[m
[31m-[m
[31m-[m
[31m-#define getcode(fs,e)	((fs)->f->code[(e)->u.s.info])[m
[31m-[m
[31m-#define luaK_codeAsBx(fs,o,A,sBx)	luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)[m
[31m-[m
[31m-#define luaK_setmultret(fs,e)	luaK_setreturns(fs, e, LUA_MULTRET)[m
[31m-[m
[31m-LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);[m
[31m-LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);[m
[31m-LUAI_FUNC void luaK_fixline (FuncState *fs, int line);[m
[31m-LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);[m
[31m-LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);[m
[31m-LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);[m
[31m-LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s);[m
[31m-LUAI_FUNC int luaK_numberK (FuncState *fs, lua_Number r);[m
[31m-LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);[m
[31m-LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);[m
[31m-LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);[m
[31m-LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);[m
[31m-LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);[m
[31m-LUAI_FUNC int luaK_jump (FuncState *fs);[m
[31m-LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);[m
[31m-LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);[m
[31m-LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);[m
[31m-LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);[m
[31m-LUAI_FUNC int luaK_getlabel (FuncState *fs);[m
[31m-LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v);[m
[31m-LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);[m
[31m-LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2);[m
[31m-LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldblib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldblib.c[m
[1mdeleted file mode 100644[m
[1mindex 2027eda..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldblib.c[m
[1m+++ /dev/null[m
[36m@@ -1,398 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldblib.c,v 1.104.1.4 2009/08/04 18:50:18 roberto Exp $[m
[31m-** Interface from Lua to its debug API[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define ldblib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int db_getregistry (lua_State *L) {[m
[31m-  lua_pushvalue(L, LUA_REGISTRYINDEX);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_getmetatable (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    lua_pushnil(L);  /* no metatable */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_setmetatable (lua_State *L) {[m
[31m-  int t = lua_type(L, 2);[m
[31m-  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,[m
[31m-                    "nil or table expected");[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_pushboolean(L, lua_setmetatable(L, 1));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_getfenv (lua_State *L) {[m
[31m-  luaL_checkany(L, 1);[m
[31m-  lua_getfenv(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_setfenv (lua_State *L) {[m
[31m-  luaL_checktype(L, 2, LUA_TTABLE);[m
[31m-  lua_settop(L, 2);[m
[31m-  if (lua_setfenv(L, 1) == 0)[m
[31m-    luaL_error(L, LUA_QL("setfenv")[m
[31m-                  " cannot change environment of given object");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void settabss (lua_State *L, const char *i, const char *v) {[m
[31m-  lua_pushstring(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void settabsi (lua_State *L, const char *i, int v) {[m
[31m-  lua_pushinteger(L, v);[m
[31m-  lua_setfield(L, -2, i);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_State *getthread (lua_State *L, int *arg) {[m
[31m-  if (lua_isthread(L, 1)) {[m
[31m-    *arg = 1;[m
[31m-    return lua_tothread(L, 1);[m
[31m-  }[m
[31m-  else {[m
[31m-    *arg = 0;[m
[31m-    return L;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) {[m
[31m-  if (L == L1) {[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_remove(L, -3);[m
[31m-  }[m
[31m-  else[m
[31m-    lua_xmove(L1, L, 1);[m
[31m-  lua_setfield(L, -2, fname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_getinfo (lua_State *L) {[m
[31m-  lua_Debug ar;[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  const char *options = luaL_optstring(L, arg+2, "flnSu");[m
[31m-  if (lua_isnumber(L, arg+1)) {[m
[31m-    if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), &ar)) {[m
[31m-      lua_pushnil(L);  /* level out of range */[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  else if (lua_isfunction(L, arg+1)) {[m
[31m-    lua_pushfstring(L, ">%s", options);[m
[31m-    options = lua_tostring(L, -1);[m
[31m-    lua_pushvalue(L, arg+1);[m
[31m-    lua_xmove(L, L1, 1);[m
[31m-  }[m
[31m-  else[m
[31m-    return luaL_argerror(L, arg+1, "function or level expected");[m
[31m-  if (!lua_getinfo(L1, options, &ar))[m
[31m-    return luaL_argerror(L, arg+2, "invalid option");[m
[31m-  lua_createtable(L, 0, 2);[m
[31m-  if (strchr(options, 'S')) {[m
[31m-    settabss(L, "source", ar.source);[m
[31m-    settabss(L, "short_src", ar.short_src);[m
[31m-    settabsi(L, "linedefined", ar.linedefined);[m
[31m-    settabsi(L, "lastlinedefined", ar.lastlinedefined);[m
[31m-    settabss(L, "what", ar.what);[m
[31m-  }[m
[31m-  if (strchr(options, 'l'))[m
[31m-    settabsi(L, "currentline", ar.currentline);[m
[31m-  if (strchr(options, 'u'))[m
[31m-    settabsi(L, "nups", ar.nups);[m
[31m-  if (strchr(options, 'n')) {[m
[31m-    settabss(L, "name", ar.name);[m
[31m-    settabss(L, "namewhat", ar.namewhat);[m
[31m-  }[m
[31m-  if (strchr(options, 'L'))[m
[31m-    treatstackoption(L, L1, "activelines");[m
[31m-  if (strchr(options, 'f'))[m
[31m-    treatstackoption(L, L1, "func");[m
[31m-  return 1;  /* return table */[m
[31m-}[m
[31m-    [m
[31m-[m
[31m-static int db_getlocal (lua_State *L) {[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  const char *name;[m
[31m-  if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar))  /* out of range? */[m
[31m-    return luaL_argerror(L, arg+1, "level out of range");[m
[31m-  name = lua_getlocal(L1, &ar, luaL_checkint(L, arg+2));[m
[31m-  if (name) {[m
[31m-    lua_xmove(L1, L, 1);[m
[31m-    lua_pushstring(L, name);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    return 2;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_setlocal (lua_State *L) {[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar))  /* out of range? */[m
[31m-    return luaL_argerror(L, arg+1, "level out of range");[m
[31m-  luaL_checkany(L, arg+3);[m
[31m-  lua_settop(L, arg+3);[m
[31m-  lua_xmove(L, L1, 1);[m
[31m-  lua_pushstring(L, lua_setlocal(L1, &ar, luaL_checkint(L, arg+2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int auxupvalue (lua_State *L, int get) {[m
[31m-  const char *name;[m
[31m-  int n = luaL_checkint(L, 2);[m
[31m-  luaL_checktype(L, 1, LUA_TFUNCTION);[m
[31m-  if (lua_iscfunction(L, 1)) return 0;  /* cannot touch C upvalues from Lua */[m
[31m-  name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n);[m
[31m-  if (name == NULL) return 0;[m
[31m-  lua_pushstring(L, name);[m
[31m-  lua_insert(L, -(get+1));[m
[31m-  return get + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_getupvalue (lua_State *L) {[m
[31m-  return auxupvalue(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_setupvalue (lua_State *L) {[m
[31m-  luaL_checkany(L, 3);[m
[31m-  return auxupvalue(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static const char KEY_HOOK = 'h';[m
[31m-[m
[31m-[m
[31m-static void hookf (lua_State *L, lua_Debug *ar) {[m
[31m-  static const char *const hooknames[] =[m
[31m-    {"call", "return", "line", "count", "tail return"};[m
[31m-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-  lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-  lua_pushlightuserdata(L, L);[m
[31m-  lua_rawget(L, -2);[m
[31m-  if (lua_isfunction(L, -1)) {[m
[31m-    lua_pushstring(L, hooknames[(int)ar->event]);[m
[31m-    if (ar->currentline >= 0)[m
[31m-      lua_pushinteger(L, ar->currentline);[m
[31m-    else lua_pushnil(L);[m
[31m-    lua_assert(lua_getinfo(L, "lS", ar));[m
[31m-    lua_call(L, 2, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int makemask (const char *smask, int count) {[m
[31m-  int mask = 0;[m
[31m-  if (strchr(smask, 'c')) mask |= LUA_MASKCALL;[m
[31m-  if (strchr(smask, 'r')) mask |= LUA_MASKRET;[m
[31m-  if (strchr(smask, 'l')) mask |= LUA_MASKLINE;[m
[31m-  if (count > 0) mask |= LUA_MASKCOUNT;[m
[31m-  return mask;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *unmakemask (int mask, char *smask) {[m
[31m-  int i = 0;[m
[31m-  if (mask & LUA_MASKCALL) smask[i++] = 'c';[m
[31m-  if (mask & LUA_MASKRET) smask[i++] = 'r';[m
[31m-  if (mask & LUA_MASKLINE) smask[i++] = 'l';[m
[31m-  smask[i] = '\0';[m
[31m-  return smask;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void gethooktable (lua_State *L) {[m
[31m-  lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-  lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-  if (!lua_istable(L, -1)) {[m
[31m-    lua_pop(L, 1);[m
[31m-    lua_createtable(L, 0, 1);[m
[31m-    lua_pushlightuserdata(L, (void *)&KEY_HOOK);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_sethook (lua_State *L) {[m
[31m-  int arg, mask, count;[m
[31m-  lua_Hook func;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  if (lua_isnoneornil(L, arg+1)) {[m
[31m-    lua_settop(L, arg+1);[m
[31m-    func = NULL; mask = 0; count = 0;  /* turn off hooks */[m
[31m-  }[m
[31m-  else {[m
[31m-    const char *smask = luaL_checkstring(L, arg+2);[m
[31m-    luaL_checktype(L, arg+1, LUA_TFUNCTION);[m
[31m-    count = luaL_optint(L, arg+3, 0);[m
[31m-    func = hookf; mask = makemask(smask, count);[m
[31m-  }[m
[31m-  gethooktable(L);[m
[31m-  lua_pushlightuserdata(L, L1);[m
[31m-  lua_pushvalue(L, arg+1);[m
[31m-  lua_rawset(L, -3);  /* set new hook */[m
[31m-  lua_pop(L, 1);  /* remove hook table */[m
[31m-  lua_sethook(L1, func, mask, count);  /* set hooks */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_gethook (lua_State *L) {[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  char buff[5];[m
[31m-  int mask = lua_gethookmask(L1);[m
[31m-  lua_Hook hook = lua_gethook(L1);[m
[31m-  if (hook != NULL && hook != hookf)  /* external hook? */[m
[31m-    lua_pushliteral(L, "external hook");[m
[31m-  else {[m
[31m-    gethooktable(L);[m
[31m-    lua_pushlightuserdata(L, L1);[m
[31m-    lua_rawget(L, -2);   /* get hook */[m
[31m-    lua_remove(L, -2);  /* remove hook table */[m
[31m-  }[m
[31m-  lua_pushstring(L, unmakemask(mask, buff));[m
[31m-  lua_pushinteger(L, lua_gethookcount(L1));[m
[31m-  return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int db_debug (lua_State *L) {[m
[31m-  for (;;) {[m
[31m-    char buffer[250];[m
[31m-    fputs("lua_debug> ", stderr);[m
[31m-    if (fgets(buffer, sizeof(buffer), stdin) == 0 ||[m
[31m-        strcmp(buffer, "cont\n") == 0)[m
[31m-      return 0;[m
[31m-    if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||[m
[31m-        lua_pcall(L, 0, 0, 0)) {[m
[31m-      fputs(lua_tostring(L, -1), stderr);[m
[31m-      fputs("\n", stderr);[m
[31m-    }[m
[31m-    lua_settop(L, 0);  /* remove eventual returns */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define LEVELS1	12	/* size of the first part of the stack */[m
[31m-#define LEVELS2	10	/* size of the second part of the stack */[m
[31m-[m
[31m-static int db_errorfb (lua_State *L) {[m
[31m-  int level;[m
[31m-  int firstpart = 1;  /* still before eventual `...' */[m
[31m-  int arg;[m
[31m-  lua_State *L1 = getthread(L, &arg);[m
[31m-  lua_Debug ar;[m
[31m-  if (lua_isnumber(L, arg+2)) {[m
[31m-    level = (int)lua_tointeger(L, arg+2);[m
[31m-    lua_pop(L, 1);[m
[31m-  }[m
[31m-  else[m
[31m-    level = (L == L1) ? 1 : 0;  /* level 0 may be this own function */[m
[31m-  if (lua_gettop(L) == arg)[m
[31m-    lua_pushliteral(L, "");[m
[31m-  else if (!lua_isstring(L, arg+1)) return 1;  /* message is not a string */[m
[31m-  else lua_pushliteral(L, "\n");[m
[31m-  lua_pushliteral(L, "stack traceback:");[m
[31m-  while (lua_getstack(L1, level++, &ar)) {[m
[31m-    if (level > LEVELS1 && firstpart) {[m
[31m-      /* no more than `LEVELS2' more levels? */[m
[31m-      if (!lua_getstack(L1, level+LEVELS2, &ar))[m
[31m-        level--;  /* keep going */[m
[31m-      else {[m
[31m-        lua_pushliteral(L, "\n\t...");  /* too many levels */[m
[31m-        while (lua_getstack(L1, level+LEVELS2, &ar))  /* find last levels */[m
[31m-          level++;[m
[31m-      }[m
[31m-      firstpart = 0;[m
[31m-      continue;[m
[31m-    }[m
[31m-    lua_pushliteral(L, "\n\t");[m
[31m-    lua_getinfo(L1, "Snl", &ar);[m
[31m-    lua_pushfstring(L, "%s:", ar.short_src);[m
[31m-    if (ar.currentline > 0)[m
[31m-      lua_pushfstring(L, "%d:", ar.currentline);[m
[31m-    if (*ar.namewhat != '\0')  /* is there a name? */[m
[31m-        lua_pushfstring(L, " in function " LUA_QS, ar.name);[m
[31m-    else {[m
[31m-      if (*ar.what == 'm')  /* main? */[m
[31m-        lua_pushfstring(L, " in main chunk");[m
[31m-      else if (*ar.what == 'C' || *ar.what == 't')[m
[31m-        lua_pushliteral(L, " ?");  /* C function or tail call */[m
[31m-      else[m
[31m-        lua_pushfstring(L, " in function <%s:%d>",[m
[31m-                           ar.short_src, ar.linedefined);[m
[31m-    }[m
[31m-    lua_concat(L, lua_gettop(L) - arg);[m
[31m-  }[m
[31m-  lua_concat(L, lua_gettop(L) - arg);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg dblib[] = {[m
[31m-  {"debug", db_debug},[m
[31m-  {"getfenv", db_getfenv},[m
[31m-  {"gethook", db_gethook},[m
[31m-  {"getinfo", db_getinfo},[m
[31m-  {"getlocal", db_getlocal},[m
[31m-  {"getregistry", db_getregistry},[m
[31m-  {"getmetatable", db_getmetatable},[m
[31m-  {"getupvalue", db_getupvalue},[m
[31m-  {"setfenv", db_setfenv},[m
[31m-  {"sethook", db_sethook},[m
[31m-  {"setlocal", db_setlocal},[m
[31m-  {"setmetatable", db_setmetatable},[m
[31m-  {"setupvalue", db_setupvalue},[m
[31m-  {"traceback", db_errorfb},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_debug (lua_State *L) {[m
[31m-  luaL_register(L, LUA_DBLIBNAME, dblib);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldebug.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldebug.c[m
[1mdeleted file mode 100644[m
[1mindex 50ad3d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldebug.c[m
[1m+++ /dev/null[m
[36m@@ -1,638 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $[m
[31m-** Debug Interface[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#define ldebug_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lapi.h"[m
[31m-#include "lcode.h"[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lvm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name);[m
[31m-[m
[31m-[m
[31m-static int currentpc (lua_State *L, CallInfo *ci) {[m
[31m-  if (!isLua(ci)) return -1;  /* function is not a Lua function? */[m
[31m-  if (ci == L->ci)[m
[31m-    ci->savedpc = L->savedpc;[m
[31m-  return pcRel(ci->savedpc, ci_func(ci)->l.p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int currentline (lua_State *L, CallInfo *ci) {[m
[31m-  int pc = currentpc(L, ci);[m
[31m-  if (pc < 0)[m
[31m-    return -1;  /* only active lua functions have current-line information */[m
[31m-  else[m
[31m-    return getline(ci_func(ci)->l.p, pc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** this function can be called asynchronous (e.g. during a signal)[m
[31m-*/[m
[31m-LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) {[m
[31m-  if (func == NULL || mask == 0) {  /* turn off hooks? */[m
[31m-    mask = 0;[m
[31m-    func = NULL;[m
[31m-  }[m
[31m-  L->hook = func;[m
[31m-  L->basehookcount = count;[m
[31m-  resethookcount(L);[m
[31m-  L->hookmask = cast_byte(mask);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_Hook lua_gethook (lua_State *L) {[m
[31m-  return L->hook;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_gethookmask (lua_State *L) {[m
[31m-  return L->hookmask;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_gethookcount (lua_State *L) {[m
[31m-  return L->basehookcount;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {[m
[31m-  int status;[m
[31m-  CallInfo *ci;[m
[31m-  lua_lock(L);[m
[31m-  for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) {[m
[31m-    level--;[m
[31m-    if (f_isLua(ci))  /* Lua function? */[m
[31m-      level -= ci->tailcalls;  /* skip lost tail calls */[m
[31m-  }[m
[31m-  if (level == 0 && ci > L->base_ci) {  /* level found? */[m
[31m-    status = 1;[m
[31m-    ar->i_ci = cast_int(ci - L->base_ci);[m
[31m-  }[m
[31m-  else if (level < 0) {  /* level is of a lost tail call? */[m
[31m-    status = 1;[m
[31m-    ar->i_ci = 0;[m
[31m-  }[m
[31m-  else status = 0;  /* no such level */[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Proto *getluaproto (CallInfo *ci) {[m
[31m-  return (isLua(ci) ? ci_func(ci)->l.p : NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *findlocal (lua_State *L, CallInfo *ci, int n) {[m
[31m-  const char *name;[m
[31m-  Proto *fp = getluaproto(ci);[m
[31m-  if (fp && (name = luaF_getlocalname(fp, n, currentpc(L, ci))) != NULL)[m
[31m-    return name;  /* is a local variable in a Lua function */[m
[31m-  else {[m
[31m-    StkId limit = (ci == L->ci) ? L->top : (ci+1)->func;[m
[31m-    if (limit - ci->base >= n && n > 0)  /* is 'n' inside 'ci' stack? */[m
[31m-      return "(*temporary)";[m
[31m-    else[m
[31m-      return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {[m
[31m-  CallInfo *ci = L->base_ci + ar->i_ci;[m
[31m-  const char *name = findlocal(L, ci, n);[m
[31m-  lua_lock(L);[m
[31m-  if (name)[m
[31m-      luaA_pushobject(L, ci->base + (n - 1));[m
[31m-  lua_unlock(L);[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {[m
[31m-  CallInfo *ci = L->base_ci + ar->i_ci;[m
[31m-  const char *name = findlocal(L, ci, n);[m
[31m-  lua_lock(L);[m
[31m-  if (name)[m
[31m-      setobjs2s(L, ci->base + (n - 1), L->top - 1);[m
[31m-  L->top--;  /* pop value */[m
[31m-  lua_unlock(L);[m
[31m-  return name;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void funcinfo (lua_Debug *ar, Closure *cl) {[m
[31m-  if (cl->c.isC) {[m
[31m-    ar->source = "=[C]";[m
[31m-    ar->linedefined = -1;[m
[31m-    ar->lastlinedefined = -1;[m
[31m-    ar->what = "C";[m
[31m-  }[m
[31m-  else {[m
[31m-    ar->source = getstr(cl->l.p->source);[m
[31m-    ar->linedefined = cl->l.p->linedefined;[m
[31m-    ar->lastlinedefined = cl->l.p->lastlinedefined;[m
[31m-    ar->what = (ar->linedefined == 0) ? "main" : "Lua";[m
[31m-  }[m
[31m-  luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void info_tailcall (lua_Debug *ar) {[m
[31m-  ar->name = ar->namewhat = "";[m
[31m-  ar->what = "tail";[m
[31m-  ar->lastlinedefined = ar->linedefined = ar->currentline = -1;[m
[31m-  ar->source = "=(tail call)";[m
[31m-  luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);[m
[31m-  ar->nups = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void collectvalidlines (lua_State *L, Closure *f) {[m
[31m-  if (f == NULL || f->c.isC) {[m
[31m-    setnilvalue(L->top);[m
[31m-  }[m
[31m-  else {[m
[31m-    Table *t = luaH_new(L, 0, 0);[m
[31m-    int *lineinfo = f->l.p->lineinfo;[m
[31m-    int i;[m
[31m-    for (i=0; i<f->l.p->sizelineinfo; i++)[m
[31m-      setbvalue(luaH_setnum(L, t, lineinfo[i]), 1);[m
[31m-    sethvalue(L, L->top, t); [m
[31m-  }[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,[m
[31m-                    Closure *f, CallInfo *ci) {[m
[31m-  int status = 1;[m
[31m-  if (f == NULL) {[m
[31m-    info_tailcall(ar);[m
[31m-    return status;[m
[31m-  }[m
[31m-  for (; *what; what++) {[m
[31m-    switch (*what) {[m
[31m-      case 'S': {[m
[31m-        funcinfo(ar, f);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'l': {[m
[31m-        ar->currentline = (ci) ? currentline(L, ci) : -1;[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'u': {[m
[31m-        ar->nups = f->c.nupvalues;[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'n': {[m
[31m-        ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL;[m
[31m-        if (ar->namewhat == NULL) {[m
[31m-          ar->namewhat = "";  /* not found */[m
[31m-          ar->name = NULL;[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'L':[m
[31m-      case 'f':  /* handled by lua_getinfo */[m
[31m-        break;[m
[31m-      default: status = 0;  /* invalid option */[m
[31m-    }[m
[31m-  }[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {[m
[31m-  int status;[m
[31m-  Closure *f = NULL;[m
[31m-  CallInfo *ci = NULL;[m
[31m-  lua_lock(L);[m
[31m-  if (*what == '>') {[m
[31m-    StkId func = L->top - 1;[m
[31m-    luai_apicheck(L, ttisfunction(func));[m
[31m-    what++;  /* skip the '>' */[m
[31m-    f = clvalue(func);[m
[31m-    L->top--;  /* pop function */[m
[31m-  }[m
[31m-  else if (ar->i_ci != 0) {  /* no tail call? */[m
[31m-    ci = L->base_ci + ar->i_ci;[m
[31m-    lua_assert(ttisfunction(ci->func));[m
[31m-    f = clvalue(ci->func);[m
[31m-  }[m
[31m-  status = auxgetinfo(L, what, ar, f, ci);[m
[31m-  if (strchr(what, 'f')) {[m
[31m-    if (f == NULL) setnilvalue(L->top);[m
[31m-    else setclvalue(L, L->top, f);[m
[31m-    incr_top(L);[m
[31m-  }[m
[31m-  if (strchr(what, 'L'))[m
[31m-    collectvalidlines(L, f);[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Symbolic Execution and code checker[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-#define check(x)		if (!(x)) return 0;[m
[31m-[m
[31m-#define checkjump(pt,pc)	check(0 <= pc && pc < pt->sizecode)[m
[31m-[m
[31m-#define checkreg(pt,reg)	check((reg) < (pt)->maxstacksize)[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int precheck (const Proto *pt) {[m
[31m-  check(pt->maxstacksize <= MAXSTACK);[m
[31m-  check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);[m
[31m-  check(!(pt->is_vararg & VARARG_NEEDSARG) ||[m
[31m-              (pt->is_vararg & VARARG_HASARG));[m
[31m-  check(pt->sizeupvalues <= pt->nups);[m
[31m-  check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0);[m
[31m-  check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define checkopenop(pt,pc)	luaG_checkopenop((pt)->code[(pc)+1])[m
[31m-[m
[31m-int luaG_checkopenop (Instruction i) {[m
[31m-  switch (GET_OPCODE(i)) {[m
[31m-    case OP_CALL:[m
[31m-    case OP_TAILCALL:[m
[31m-    case OP_RETURN:[m
[31m-    case OP_SETLIST: {[m
[31m-      check(GETARG_B(i) == 0);[m
[31m-      return 1;[m
[31m-    }[m
[31m-    default: return 0;  /* invalid instruction after an open call */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) {[m
[31m-  switch (mode) {[m
[31m-    case OpArgN: check(r == 0); break;[m
[31m-    case OpArgU: break;[m
[31m-    case OpArgR: checkreg(pt, r); break;[m
[31m-    case OpArgK:[m
[31m-      check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize);[m
[31m-      break;[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Instruction symbexec (const Proto *pt, int lastpc, int reg) {[m
[31m-  int pc;[m
[31m-  int last;  /* stores position of last instruction that changed `reg' */[m
[31m-  last = pt->sizecode-1;  /* points to final return (a `neutral' instruction) */[m
[31m-  check(precheck(pt));[m
[31m-  for (pc = 0; pc < lastpc; pc++) {[m
[31m-    Instruction i = pt->code[pc];[m
[31m-    OpCode op = GET_OPCODE(i);[m
[31m-    int a = GETARG_A(i);[m
[31m-    int b = 0;[m
[31m-    int c = 0;[m
[31m-    check(op < NUM_OPCODES);[m
[31m-    checkreg(pt, a);[m
[31m-    switch (getOpMode(op)) {[m
[31m-      case iABC: {[m
[31m-        b = GETARG_B(i);[m
[31m-        c = GETARG_C(i);[m
[31m-        check(checkArgMode(pt, b, getBMode(op)));[m
[31m-        check(checkArgMode(pt, c, getCMode(op)));[m
[31m-        break;[m
[31m-      }[m
[31m-      case iABx: {[m
[31m-        b = GETARG_Bx(i);[m
[31m-        if (getBMode(op) == OpArgK) check(b < pt->sizek);[m
[31m-        break;[m
[31m-      }[m
[31m-      case iAsBx: {[m
[31m-        b = GETARG_sBx(i);[m
[31m-        if (getBMode(op) == OpArgR) {[m
[31m-          int dest = pc+1+b;[m
[31m-          check(0 <= dest && dest < pt->sizecode);[m
[31m-          if (dest > 0) {[m
[31m-            int j;[m
[31m-            /* check that it does not jump to a setlist count; this[m
[31m-               is tricky, because the count from a previous setlist may[m
[31m-               have the same value of an invalid setlist; so, we must[m
[31m-               go all the way back to the first of them (if any) */[m
[31m-            for (j = 0; j < dest; j++) {[m
[31m-              Instruction d = pt->code[dest-1-j];[m
[31m-              if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break;[m
[31m-            }[m
[31m-            /* if 'j' is even, previous value is not a setlist (even if[m
[31m-               it looks like one) */[m
[31m-            check((j&1) == 0);[m
[31m-          }[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-    }[m
[31m-    if (testAMode(op)) {[m
[31m-      if (a == reg) last = pc;  /* change register `a' */[m
[31m-    }[m
[31m-    if (testTMode(op)) {[m
[31m-      check(pc+2 < pt->sizecode);  /* check skip */[m
[31m-      check(GET_OPCODE(pt->code[pc+1]) == OP_JMP);[m
[31m-    }[m
[31m-    switch (op) {[m
[31m-      case OP_LOADBOOL: {[m
[31m-        if (c == 1) {  /* does it jump? */[m
[31m-          check(pc+2 < pt->sizecode);  /* check its jump */[m
[31m-          check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST ||[m
[31m-                GETARG_C(pt->code[pc+1]) != 0);[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_LOADNIL: {[m
[31m-        if (a <= reg && reg <= b)[m
[31m-          last = pc;  /* set registers from `a' to `b' */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_GETUPVAL:[m
[31m-      case OP_SETUPVAL: {[m
[31m-        check(b < pt->nups);[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_GETGLOBAL:[m
[31m-      case OP_SETGLOBAL: {[m
[31m-        check(ttisstring(&pt->k[b]));[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_SELF: {[m
[31m-        checkreg(pt, a+1);[m
[31m-        if (reg == a+1) last = pc;[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_CONCAT: {[m
[31m-        check(b < c);  /* at least two operands */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_TFORLOOP: {[m
[31m-        check(c >= 1);  /* at least one result (control variable) */[m
[31m-        checkreg(pt, a+2+c);  /* space for results */[m
[31m-        if (reg >= a+2) last = pc;  /* affect all regs above its base */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_FORLOOP:[m
[31m-      case OP_FORPREP:[m
[31m-        checkreg(pt, a+3);[m
[31m-        /* go through */[m
[31m-      case OP_JMP: {[m
[31m-        int dest = pc+1+b;[m
[31m-        /* not full check and jump is forward and do not skip `lastpc'? */[m
[31m-        if (reg != NO_REG && pc < dest && dest <= lastpc)[m
[31m-          pc += b;  /* do the jump */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_CALL:[m
[31m-      case OP_TAILCALL: {[m
[31m-        if (b != 0) {[m
[31m-          checkreg(pt, a+b-1);[m
[31m-        }[m
[31m-        c--;  /* c = num. returns */[m
[31m-        if (c == LUA_MULTRET) {[m
[31m-          check(checkopenop(pt, pc));[m
[31m-        }[m
[31m-        else if (c != 0)[m
[31m-          checkreg(pt, a+c-1);[m
[31m-        if (reg >= a) last = pc;  /* affect all registers above base */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_RETURN: {[m
[31m-        b--;  /* b = num. returns */[m
[31m-        if (b > 0) checkreg(pt, a+b-1);[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_SETLIST: {[m
[31m-        if (b > 0) checkreg(pt, a + b);[m
[31m-        if (c == 0) {[m
[31m-          pc++;[m
[31m-          check(pc < pt->sizecode - 1);[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_CLOSURE: {[m
[31m-        int nup, j;[m
[31m-        check(b < pt->sizep);[m
[31m-        nup = pt->p[b]->nups;[m
[31m-        check(pc + nup < pt->sizecode);[m
[31m-        for (j = 1; j <= nup; j++) {[m
[31m-          OpCode op1 = GET_OPCODE(pt->code[pc + j]);[m
[31m-          check(op1 == OP_GETUPVAL || op1 == OP_MOVE);[m
[31m-        }[m
[31m-        if (reg != NO_REG)  /* tracing? */[m
[31m-          pc += nup;  /* do not 'execute' these pseudo-instructions */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_VARARG: {[m
[31m-        check((pt->is_vararg & VARARG_ISVARARG) &&[m
[31m-             !(pt->is_vararg & VARARG_NEEDSARG));[m
[31m-        b--;[m
[31m-        if (b == LUA_MULTRET) check(checkopenop(pt, pc));[m
[31m-        checkreg(pt, a+b-1);[m
[31m-        break;[m
[31m-      }[m
[31m-      default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  return pt->code[last];[m
[31m-}[m
[31m-[m
[31m-#undef check[m
[31m-#undef checkjump[m
[31m-#undef checkreg[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-int luaG_checkcode (const Proto *pt) {[m
[31m-  return (symbexec(pt, pt->sizecode, NO_REG) != 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *kname (Proto *p, int c) {[m
[31m-  if (ISK(c) && ttisstring(&p->k[INDEXK(c)]))[m
[31m-    return svalue(&p->k[INDEXK(c)]);[m
[31m-  else[m
[31m-    return "?";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos,[m
[31m-                               const char **name) {[m
[31m-  if (isLua(ci)) {  /* a Lua function? */[m
[31m-    Proto *p = ci_func(ci)->l.p;[m
[31m-    int pc = currentpc(L, ci);[m
[31m-    Instruction i;[m
[31m-    *name = luaF_getlocalname(p, stackpos+1, pc);[m
[31m-    if (*name)  /* is a local? */[m
[31m-      return "local";[m
[31m-    i = symbexec(p, pc, stackpos);  /* try symbolic execution */[m
[31m-    lua_assert(pc != -1);[m
[31m-    switch (GET_OPCODE(i)) {[m
[31m-      case OP_GETGLOBAL: {[m
[31m-        int g = GETARG_Bx(i);  /* global index */[m
[31m-        lua_assert(ttisstring(&p->k[g]));[m
[31m-        *name = svalue(&p->k[g]);[m
[31m-        return "global";[m
[31m-      }[m
[31m-      case OP_MOVE: {[m
[31m-        int a = GETARG_A(i);[m
[31m-        int b = GETARG_B(i);  /* move from `b' to `a' */[m
[31m-        if (b < a)[m
[31m-          return getobjname(L, ci, b, name);  /* get name for `b' */[m
[31m-        break;[m
[31m-      }[m
[31m-      case OP_GETTABLE: {[m
[31m-        int k = GETARG_C(i);  /* key index */[m
[31m-        *name = kname(p, k);[m
[31m-        return "field";[m
[31m-      }[m
[31m-      case OP_GETUPVAL: {[m
[31m-        int u = GETARG_B(i);  /* upvalue index */[m
[31m-        *name = p->upvalues ? getstr(p->upvalues[u]) : "?";[m
[31m-        return "upvalue";[m
[31m-      }[m
[31m-      case OP_SELF: {[m
[31m-        int k = GETARG_C(i);  /* key index */[m
[31m-        *name = kname(p, k);[m
[31m-        return "method";[m
[31m-      }[m
[31m-      default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* no useful name found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {[m
[31m-  Instruction i;[m
[31m-  if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1))[m
[31m-    return NULL;  /* calling function is not Lua (or is unknown) */[m
[31m-  ci--;  /* calling function */[m
[31m-  i = ci_func(ci)->l.p->code[currentpc(L, ci)];[m
[31m-  if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||[m
[31m-      GET_OPCODE(i) == OP_TFORLOOP)[m
[31m-    return getobjname(L, ci, GETARG_A(i), name);[m
[31m-  else[m
[31m-    return NULL;  /* no useful name can be found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* only ANSI way to check whether a pointer points to an array */[m
[31m-static int isinstack (CallInfo *ci, const TValue *o) {[m
[31m-  StkId p;[m
[31m-  for (p = ci->base; p < ci->top; p++)[m
[31m-    if (o == p) return 1;[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {[m
[31m-  const char *name = NULL;[m
[31m-  const char *t = luaT_typenames[ttype(o)];[m
[31m-  const char *kind = (isinstack(L->ci, o)) ?[m
[31m-                         getobjname(L, L->ci, cast_int(o - L->base), &name) :[m
[31m-                         NULL;[m
[31m-  if (kind)[m
[31m-    luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)",[m
[31m-                op, kind, name, t);[m
[31m-  else[m
[31m-    luaG_runerror(L, "attempt to %s a %s value", op, t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {[m
[31m-  if (ttisstring(p1) || ttisnumber(p1)) p1 = p2;[m
[31m-  lua_assert(!ttisstring(p1) && !ttisnumber(p1));[m
[31m-  luaG_typeerror(L, p1, "concatenate");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {[m
[31m-  TValue temp;[m
[31m-  if (luaV_tonumber(p1, &temp) == NULL)[m
[31m-    p2 = p1;  /* first operand is wrong */[m
[31m-  luaG_typeerror(L, p2, "perform arithmetic on");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {[m
[31m-  const char *t1 = luaT_typenames[ttype(p1)];[m
[31m-  const char *t2 = luaT_typenames[ttype(p2)];[m
[31m-  if (t1[2] == t2[2])[m
[31m-    luaG_runerror(L, "attempt to compare two %s values", t1);[m
[31m-  else[m
[31m-    luaG_runerror(L, "attempt to compare %s with %s", t1, t2);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void addinfo (lua_State *L, const char *msg) {[m
[31m-  CallInfo *ci = L->ci;[m
[31m-  if (isLua(ci)) {  /* is Lua code? */[m
[31m-    char buff[LUA_IDSIZE];  /* add file:line information */[m
[31m-    int line = currentline(L, ci);[m
[31m-    luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE);[m
[31m-    luaO_pushfstring(L, "%s:%d: %s", buff, line, msg);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_errormsg (lua_State *L) {[m
[31m-  if (L->errfunc != 0) {  /* is there an error handling function? */[m
[31m-    StkId errfunc = restorestack(L, L->errfunc);[m
[31m-    if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR);[m
[31m-    setobjs2s(L, L->top, L->top - 1);  /* move argument */[m
[31m-    setobjs2s(L, L->top - 1, errfunc);  /* push function */[m
[31m-    incr_top(L);[m
[31m-    luaD_call(L, L->top - 2, 1);  /* call it */[m
[31m-  }[m
[31m-  luaD_throw(L, LUA_ERRRUN);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaG_runerror (lua_State *L, const char *fmt, ...) {[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  addinfo(L, luaO_pushvfstring(L, fmt, argp));[m
[31m-  va_end(argp);[m
[31m-  luaG_errormsg(L);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldebug.h[m
[1mdeleted file mode 100644[m
[1mindex ba28a97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions from Debug Interface module[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef ldebug_h[m
[31m-#define ldebug_h[m
[31m-[m
[31m-[m
[31m-#include "lstate.h"[m
[31m-[m
[31m-[m
[31m-#define pcRel(pc, p)	(cast(int, (pc) - (p)->code) - 1)[m
[31m-[m
[31m-#define getline(f,pc)	(((f)->lineinfo) ? (f)->lineinfo[pc] : 0)[m
[31m-[m
[31m-#define resethookcount(L)	(L->hookcount = L->basehookcount)[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o,[m
[31m-                                             const char *opname);[m
[31m-LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2);[m
[31m-LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1,[m
[31m-                                              const TValue *p2);[m
[31m-LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1,[m
[31m-                                             const TValue *p2);[m
[31m-LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...);[m
[31m-LUAI_FUNC void luaG_errormsg (lua_State *L);[m
[31m-LUAI_FUNC int luaG_checkcode (const Proto *pt);[m
[31m-LUAI_FUNC int luaG_checkopenop (Instruction i);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldo.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldo.c[m
[1mdeleted file mode 100644[m
[1mindex d1bf786..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldo.c[m
[1m+++ /dev/null[m
[36m@@ -1,519 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldo.c,v 2.38.1.4 2012/01/18 02:27:10 roberto Exp $[m
[31m-** Stack and Call structure of Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <setjmp.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define ldo_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lparser.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lundump.h"[m
[31m-#include "lvm.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Error-recovery functions[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* chain list of long jump buffers */[m
[31m-struct lua_longjmp {[m
[31m-  struct lua_longjmp *previous;[m
[31m-  luai_jmpbuf b;[m
[31m-  volatile int status;  /* error code */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {[m
[31m-  switch (errcode) {[m
[31m-    case LUA_ERRMEM: {[m
[31m-      setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_ERRERR: {[m
[31m-      setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_ERRSYNTAX:[m
[31m-    case LUA_ERRRUN: {[m
[31m-      setobjs2s(L, oldtop, L->top - 1);  /* error message on current top */[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  L->top = oldtop + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void restore_stack_limit (lua_State *L) {[m
[31m-  lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);[m
[31m-  if (L->size_ci > LUAI_MAXCALLS) {  /* there was an overflow? */[m
[31m-    int inuse = cast_int(L->ci - L->base_ci);[m
[31m-    if (inuse + 1 < LUAI_MAXCALLS)  /* can `undo' overflow? */[m
[31m-      luaD_reallocCI(L, LUAI_MAXCALLS);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void resetstack (lua_State *L, int status) {[m
[31m-  L->ci = L->base_ci;[m
[31m-  L->base = L->ci->base;[m
[31m-  luaF_close(L, L->base);  /* close eventual pending closures */[m
[31m-  luaD_seterrorobj(L, status, L->base);[m
[31m-  L->nCcalls = L->baseCcalls;[m
[31m-  L->allowhook = 1;[m
[31m-  restore_stack_limit(L);[m
[31m-  L->errfunc = 0;[m
[31m-  L->errorJmp = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_throw (lua_State *L, int errcode) {[m
[31m-  if (L->errorJmp) {[m
[31m-    L->errorJmp->status = errcode;[m
[31m-    LUAI_THROW(L, L->errorJmp);[m
[31m-  }[m
[31m-  else {[m
[31m-    L->status = cast_byte(errcode);[m
[31m-    if (G(L)->panic) {[m
[31m-      resetstack(L, errcode);[m
[31m-      lua_unlock(L);[m
[31m-      G(L)->panic(L);[m
[31m-    }[m
[31m-    exit(EXIT_FAILURE);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {[m
[31m-  struct lua_longjmp lj;[m
[31m-  lj.status = 0;[m
[31m-  lj.previous = L->errorJmp;  /* chain new error handler */[m
[31m-  L->errorJmp = &lj;[m
[31m-  LUAI_TRY(L, &lj,[m
[31m-    (*f)(L, ud);[m
[31m-  );[m
[31m-  L->errorJmp = lj.previous;  /* restore old error handler */[m
[31m-  return lj.status;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static void correctstack (lua_State *L, TValue *oldstack) {[m
[31m-  CallInfo *ci;[m
[31m-  GCObject *up;[m
[31m-  L->top = (L->top - oldstack) + L->stack;[m
[31m-  for (up = L->openupval; up != NULL; up = up->gch.next)[m
[31m-    gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack;[m
[31m-  for (ci = L->base_ci; ci <= L->ci; ci++) {[m
[31m-    ci->top = (ci->top - oldstack) + L->stack;[m
[31m-    ci->base = (ci->base - oldstack) + L->stack;[m
[31m-    ci->func = (ci->func - oldstack) + L->stack;[m
[31m-  }[m
[31m-  L->base = (L->base - oldstack) + L->stack;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_reallocstack (lua_State *L, int newsize) {[m
[31m-  TValue *oldstack = L->stack;[m
[31m-  int realsize = newsize + 1 + EXTRA_STACK;[m
[31m-  lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);[m
[31m-  luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue);[m
[31m-  L->stacksize = realsize;[m
[31m-  L->stack_last = L->stack+newsize;[m
[31m-  correctstack(L, oldstack);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_reallocCI (lua_State *L, int newsize) {[m
[31m-  CallInfo *oldci = L->base_ci;[m
[31m-  luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo);[m
[31m-  L->size_ci = newsize;[m
[31m-  L->ci = (L->ci - oldci) + L->base_ci;[m
[31m-  L->end_ci = L->base_ci + L->size_ci - 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_growstack (lua_State *L, int n) {[m
[31m-  if (n <= L->stacksize)  /* double size is enough? */[m
[31m-    luaD_reallocstack(L, 2*L->stacksize);[m
[31m-  else[m
[31m-    luaD_reallocstack(L, L->stacksize + n);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static CallInfo *growCI (lua_State *L) {[m
[31m-  if (L->size_ci > LUAI_MAXCALLS)  /* overflow while handling overflow? */[m
[31m-    luaD_throw(L, LUA_ERRERR);[m
[31m-  else {[m
[31m-    luaD_reallocCI(L, 2*L->size_ci);[m
[31m-    if (L->size_ci > LUAI_MAXCALLS)[m
[31m-      luaG_runerror(L, "stack overflow");[m
[31m-  }[m
[31m-  return ++L->ci;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaD_callhook (lua_State *L, int event, int line) {[m
[31m-  lua_Hook hook = L->hook;[m
[31m-  if (hook && L->allowhook) {[m
[31m-    ptrdiff_t top = savestack(L, L->top);[m
[31m-    ptrdiff_t ci_top = savestack(L, L->ci->top);[m
[31m-    lua_Debug ar;[m
[31m-    ar.event = event;[m
[31m-    ar.currentline = line;[m
[31m-    if (event == LUA_HOOKTAILRET)[m
[31m-      ar.i_ci = 0;  /* tail call; no debug information about it */[m
[31m-    else[m
[31m-      ar.i_ci = cast_int(L->ci - L->base_ci);[m
[31m-    luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */[m
[31m-    L->ci->top = L->top + LUA_MINSTACK;[m
[31m-    lua_assert(L->ci->top <= L->stack_last);[m
[31m-    L->allowhook = 0;  /* cannot call hooks inside a hook */[m
[31m-    lua_unlock(L);[m
[31m-    (*hook)(L, &ar);[m
[31m-    lua_lock(L);[m
[31m-    lua_assert(!L->allowhook);[m
[31m-    L->allowhook = 1;[m
[31m-    L->ci->top = restorestack(L, ci_top);[m
[31m-    L->top = restorestack(L, top);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {[m
[31m-  int i;[m
[31m-  int nfixargs = p->numparams;[m
[31m-  Table *htab = NULL;[m
[31m-  StkId base, fixed;[m
[31m-  for (; actual < nfixargs; ++actual)[m
[31m-    setnilvalue(L->top++);[m
[31m-#if defined(LUA_COMPAT_VARARG)[m
[31m-  if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */[m
[31m-    int nvar = actual - nfixargs;  /* number of extra arguments */[m
[31m-    lua_assert(p->is_vararg & VARARG_HASARG);[m
[31m-    luaC_checkGC(L);[m
[31m-    luaD_checkstack(L, p->maxstacksize);[m
[31m-    htab = luaH_new(L, nvar, 1);  /* create `arg' table */[m
[31m-    for (i=0; i<nvar; i++)  /* put extra arguments into `arg' table */[m
[31m-      setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i);[m
[31m-    /* store counter in field `n' */[m
[31m-    setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar));[m
[31m-  }[m
[31m-#endif[m
[31m-  /* move fixed parameters to final position */[m
[31m-  fixed = L->top - actual;  /* first fixed argument */[m
[31m-  base = L->top;  /* final position of first argument */[m
[31m-  for (i=0; i<nfixargs; i++) {[m
[31m-    setobjs2s(L, L->top++, fixed+i);[m
[31m-    setnilvalue(fixed+i);[m
[31m-  }[m
[31m-  /* add `arg' parameter */[m
[31m-  if (htab) {[m
[31m-    sethvalue(L, L->top++, htab);[m
[31m-    lua_assert(iswhite(obj2gco(htab)));[m
[31m-  }[m
[31m-  return base;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static StkId tryfuncTM (lua_State *L, StkId func) {[m
[31m-  const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);[m
[31m-  StkId p;[m
[31m-  ptrdiff_t funcr = savestack(L, func);[m
[31m-  if (!ttisfunction(tm))[m
[31m-    luaG_typeerror(L, func, "call");[m
[31m-  /* Open a hole inside the stack at `func' */[m
[31m-  for (p = L->top; p > func; p--) setobjs2s(L, p, p-1);[m
[31m-  incr_top(L);[m
[31m-  func = restorestack(L, funcr);  /* previous call may change stack */[m
[31m-  setobj2s(L, func, tm);  /* tag method is the new function to be called */[m
[31m-  return func;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define inc_ci(L) \[m
[31m-  ((L->ci == L->end_ci) ? growCI(L) : \[m
[31m-   (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci))[m
[31m-[m
[31m-[m
[31m-int luaD_precall (lua_State *L, StkId func, int nresults) {[m
[31m-  LClosure *cl;[m
[31m-  ptrdiff_t funcr;[m
[31m-  if (!ttisfunction(func)) /* `func' is not a function? */[m
[31m-    func = tryfuncTM(L, func);  /* check the `function' tag method */[m
[31m-  funcr = savestack(L, func);[m
[31m-  cl = &clvalue(func)->l;[m
[31m-  L->ci->savedpc = L->savedpc;[m
[31m-  if (!cl->isC) {  /* Lua function? prepare its call */[m
[31m-    CallInfo *ci;[m
[31m-    StkId st, base;[m
[31m-    Proto *p = cl->p;[m
[31m-    luaD_checkstack(L, p->maxstacksize);[m
[31m-    func = restorestack(L, funcr);[m
[31m-    if (!p->is_vararg) {  /* no varargs? */[m
[31m-      base = func + 1;[m
[31m-      if (L->top > base + p->numparams)[m
[31m-        L->top = base + p->numparams;[m
[31m-    }[m
[31m-    else {  /* vararg function */[m
[31m-      int nargs = cast_int(L->top - func) - 1;[m
[31m-      base = adjust_varargs(L, p, nargs);[m
[31m-      func = restorestack(L, funcr);  /* previous call may change the stack */[m
[31m-    }[m
[31m-    ci = inc_ci(L);  /* now `enter' new function */[m
[31m-    ci->func = func;[m
[31m-    L->base = ci->base = base;[m
[31m-    ci->top = L->base + p->maxstacksize;[m
[31m-    lua_assert(ci->top <= L->stack_last);[m
[31m-    L->savedpc = p->code;  /* starting point */[m
[31m-    ci->tailcalls = 0;[m
[31m-    ci->nresults = nresults;[m
[31m-    for (st = L->top; st < ci->top; st++)[m
[31m-      setnilvalue(st);[m
[31m-    L->top = ci->top;[m
[31m-    if (L->hookmask & LUA_MASKCALL) {[m
[31m-      L->savedpc++;  /* hooks assume 'pc' is already incremented */[m
[31m-      luaD_callhook(L, LUA_HOOKCALL, -1);[m
[31m-      L->savedpc--;  /* correct 'pc' */[m
[31m-    }[m
[31m-    return PCRLUA;[m
[31m-  }[m
[31m-  else {  /* if is a C function, call it */[m
[31m-    CallInfo *ci;[m
[31m-    int n;[m
[31m-    luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */[m
[31m-    ci = inc_ci(L);  /* now `enter' new function */[m
[31m-    ci->func = restorestack(L, funcr);[m
[31m-    L->base = ci->base = ci->func + 1;[m
[31m-    ci->top = L->top + LUA_MINSTACK;[m
[31m-    lua_assert(ci->top <= L->stack_last);[m
[31m-    ci->nresults = nresults;[m
[31m-    if (L->hookmask & LUA_MASKCALL)[m
[31m-      luaD_callhook(L, LUA_HOOKCALL, -1);[m
[31m-    lua_unlock(L);[m
[31m-    n = (*curr_func(L)->c.f)(L);  /* do the actual call */[m
[31m-    lua_lock(L);[m
[31m-    if (n < 0)  /* yielding? */[m
[31m-      return PCRYIELD;[m
[31m-    else {[m
[31m-      luaD_poscall(L, L->top - n);[m
[31m-      return PCRC;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static StkId callrethooks (lua_State *L, StkId firstResult) {[m
[31m-  ptrdiff_t fr = savestack(L, firstResult);  /* next call may change stack */[m
[31m-  luaD_callhook(L, LUA_HOOKRET, -1);[m
[31m-  if (f_isLua(L->ci)) {  /* Lua function? */[m
[31m-    while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */[m
[31m-      luaD_callhook(L, LUA_HOOKTAILRET, -1);[m
[31m-  }[m
[31m-  return restorestack(L, fr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaD_poscall (lua_State *L, StkId firstResult) {[m
[31m-  StkId res;[m
[31m-  int wanted, i;[m
[31m-  CallInfo *ci;[m
[31m-  if (L->hookmask & LUA_MASKRET)[m
[31m-    firstResult = callrethooks(L, firstResult);[m
[31m-  ci = L->ci--;[m
[31m-  res = ci->func;  /* res == final position of 1st result */[m
[31m-  wanted = ci->nresults;[m
[31m-  L->base = (ci - 1)->base;  /* restore base */[m
[31m-  L->savedpc = (ci - 1)->savedpc;  /* restore savedpc */[m
[31m-  /* move results to correct place */[m
[31m-  for (i = wanted; i != 0 && firstResult < L->top; i--)[m
[31m-    setobjs2s(L, res++, firstResult++);[m
[31m-  while (i-- > 0)[m
[31m-    setnilvalue(res++);[m
[31m-  L->top = res;[m
[31m-  return (wanted - LUA_MULTRET);  /* 0 iff wanted == LUA_MULTRET */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Call a function (C or Lua). The function to be called is at *func.[m
[31m-** The arguments are on the stack, right after the function.[m
[31m-** When returns, all the results are on the stack, starting at the original[m
[31m-** function position.[m
[31m-*/ [m
[31m-void luaD_call (lua_State *L, StkId func, int nResults) {[m
[31m-  if (++L->nCcalls >= LUAI_MAXCCALLS) {[m
[31m-    if (L->nCcalls == LUAI_MAXCCALLS)[m
[31m-      luaG_runerror(L, "C stack overflow");[m
[31m-    else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))[m
[31m-      luaD_throw(L, LUA_ERRERR);  /* error while handing stack error */[m
[31m-  }[m
[31m-  if (luaD_precall(L, func, nResults) == PCRLUA)  /* is a Lua function? */[m
[31m-    luaV_execute(L, 1);  /* call it */[m
[31m-  L->nCcalls--;[m
[31m-  luaC_checkGC(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void resume (lua_State *L, void *ud) {[m
[31m-  StkId firstArg = cast(StkId, ud);[m
[31m-  CallInfo *ci = L->ci;[m
[31m-  if (L->status == 0) {  /* start coroutine? */[m
[31m-    lua_assert(ci == L->base_ci && firstArg > L->base);[m
[31m-    if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA)[m
[31m-      return;[m
[31m-  }[m
[31m-  else {  /* resuming from previous yield */[m
[31m-    lua_assert(L->status == LUA_YIELD);[m
[31m-    L->status = 0;[m
[31m-    if (!f_isLua(ci)) {  /* `common' yield? */[m
[31m-      /* finish interrupted execution of `OP_CALL' */[m
[31m-      lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL ||[m
[31m-                 GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL);[m
[31m-      if (luaD_poscall(L, firstArg))  /* complete it... */[m
[31m-        L->top = L->ci->top;  /* and correct top if not multiple results */[m
[31m-    }[m
[31m-    else  /* yielded inside a hook: just continue its execution */[m
[31m-      L->base = L->ci->base;[m
[31m-  }[m
[31m-  luaV_execute(L, cast_int(L->ci - L->base_ci));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int resume_error (lua_State *L, const char *msg) {[m
[31m-  L->top = L->ci->base;[m
[31m-  setsvalue2s(L, L->top, luaS_new(L, msg));[m
[31m-  incr_top(L);[m
[31m-  lua_unlock(L);[m
[31m-  return LUA_ERRRUN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_resume (lua_State *L, int nargs) {[m
[31m-  int status;[m
[31m-  lua_lock(L);[m
[31m-  if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci))[m
[31m-      return resume_error(L, "cannot resume non-suspended coroutine");[m
[31m-  if (L->nCcalls >= LUAI_MAXCCALLS)[m
[31m-    return resume_error(L, "C stack overflow");[m
[31m-  luai_userstateresume(L, nargs);[m
[31m-  lua_assert(L->errfunc == 0);[m
[31m-  L->baseCcalls = ++L->nCcalls;[m
[31m-  status = luaD_rawrunprotected(L, resume, L->top - nargs);[m
[31m-  if (status != 0) {  /* error? */[m
[31m-    L->status = cast_byte(status);  /* mark thread as `dead' */[m
[31m-    luaD_seterrorobj(L, status, L->top);[m
[31m-    L->ci->top = L->top;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_assert(L->nCcalls == L->baseCcalls);[m
[31m-    status = L->status;[m
[31m-  }[m
[31m-  --L->nCcalls;[m
[31m-  lua_unlock(L);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_yield (lua_State *L, int nresults) {[m
[31m-  luai_userstateyield(L, nresults);[m
[31m-  lua_lock(L);[m
[31m-  if (L->nCcalls > L->baseCcalls)[m
[31m-    luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");[m
[31m-  L->base = L->top - nresults;  /* protect stack slots below */[m
[31m-  L->status = LUA_YIELD;[m
[31m-  lua_unlock(L);[m
[31m-  return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaD_pcall (lua_State *L, Pfunc func, void *u,[m
[31m-                ptrdiff_t old_top, ptrdiff_t ef) {[m
[31m-  int status;[m
[31m-  unsigned short oldnCcalls = L->nCcalls;[m
[31m-  ptrdiff_t old_ci = saveci(L, L->ci);[m
[31m-  lu_byte old_allowhooks = L->allowhook;[m
[31m-  ptrdiff_t old_errfunc = L->errfunc;[m
[31m-  L->errfunc = ef;[m
[31m-  status = luaD_rawrunprotected(L, func, u);[m
[31m-  if (status != 0) {  /* an error occurred? */[m
[31m-    StkId oldtop = restorestack(L, old_top);[m
[31m-    luaF_close(L, oldtop);  /* close eventual pending closures */[m
[31m-    luaD_seterrorobj(L, status, oldtop);[m
[31m-    L->nCcalls = oldnCcalls;[m
[31m-    L->ci = restoreci(L, old_ci);[m
[31m-    L->base = L->ci->base;[m
[31m-    L->savedpc = L->ci->savedpc;[m
[31m-    L->allowhook = old_allowhooks;[m
[31m-    restore_stack_limit(L);[m
[31m-  }[m
[31m-  L->errfunc = old_errfunc;[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Execute a protected parser.[m
[31m-*/[m
[31m-struct SParser {  /* data to `f_parser' */[m
[31m-  ZIO *z;[m
[31m-  Mbuffer buff;  /* buffer to be used by the scanner */[m
[31m-  const char *name;[m
[31m-};[m
[31m-[m
[31m-static void f_parser (lua_State *L, void *ud) {[m
[31m-  int i;[m
[31m-  Proto *tf;[m
[31m-  Closure *cl;[m
[31m-  struct SParser *p = cast(struct SParser *, ud);[m
[31m-  int c = luaZ_lookahead(p->z);[m
[31m-  luaC_checkGC(L);[m
[31m-  tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z,[m
[31m-                                                             &p->buff, p->name);[m
[31m-  cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L)));[m
[31m-  cl->l.p = tf;[m
[31m-  for (i = 0; i < tf->nups; i++)  /* initialize eventual upvalues */[m
[31m-    cl->l.upvals[i] = luaF_newupval(L);[m
[31m-  setclvalue(L, L->top, cl);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {[m
[31m-  struct SParser p;[m
[31m-  int status;[m
[31m-  p.z = z; p.name = name;[m
[31m-  luaZ_initbuffer(L, &p.buff);[m
[31m-  status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);[m
[31m-  luaZ_freebuffer(L, &p.buff);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldo.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldo.h[m
[1mdeleted file mode 100644[m
[1mindex 98fddac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldo.h[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Stack and Call structure of Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef ldo_h[m
[31m-#define ldo_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-#define luaD_checkstack(L,n)	\[m
[31m-  if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \[m
[31m-    luaD_growstack(L, n); \[m
[31m-  else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1));[m
[31m-[m
[31m-[m
[31m-#define incr_top(L) {luaD_checkstack(L,1); L->top++;}[m
[31m-[m
[31m-#define savestack(L,p)		((char *)(p) - (char *)L->stack)[m
[31m-#define restorestack(L,n)	((TValue *)((char *)L->stack + (n)))[m
[31m-[m
[31m-#define saveci(L,p)		((char *)(p) - (char *)L->base_ci)[m
[31m-#define restoreci(L,n)		((CallInfo *)((char *)L->base_ci + (n)))[m
[31m-[m
[31m-[m
[31m-/* results from luaD_precall */[m
[31m-#define PCRLUA		0	/* initiated a call to a Lua function */[m
[31m-#define PCRC		1	/* did a call to a C function */[m
[31m-#define PCRYIELD	2	/* C funtion yielded */[m
[31m-[m
[31m-[m
[31m-/* type of protected functions, to be ran by `runprotected' */[m
[31m-typedef void (*Pfunc) (lua_State *L, void *ud);[m
[31m-[m
[31m-LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name);[m
[31m-LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line);[m
[31m-LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults);[m
[31m-LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);[m
[31m-LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,[m
[31m-                                        ptrdiff_t oldtop, ptrdiff_t ef);[m
[31m-LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult);[m
[31m-LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize);[m
[31m-LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);[m
[31m-LUAI_FUNC void luaD_growstack (lua_State *L, int n);[m
[31m-[m
[31m-LUAI_FUNC void luaD_throw (lua_State *L, int errcode);[m
[31m-LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);[m
[31m-[m
[31m-LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop);[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldump.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldump.c[m
[1mdeleted file mode 100644[m
[1mindex c9d3d48..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ldump.c[m
[1m+++ /dev/null[m
[36m@@ -1,164 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** save precompiled Lua chunks[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define ldump_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lundump.h"[m
[31m-[m
[31m-typedef struct {[m
[31m- lua_State* L;[m
[31m- lua_Writer writer;[m
[31m- void* data;[m
[31m- int strip;[m
[31m- int status;[m
[31m-} DumpState;[m
[31m-[m
[31m-#define DumpMem(b,n,size,D)	DumpBlock(b,(n)*(size),D)[m
[31m-#define DumpVar(x,D)	 	DumpMem(&x,1,sizeof(x),D)[m
[31m-[m
[31m-static void DumpBlock(const void* b, size_t size, DumpState* D)[m
[31m-{[m
[31m- if (D->status==0)[m
[31m- {[m
[31m-  lua_unlock(D->L);[m
[31m-  D->status=(*D->writer)(D->L,b,size,D->data);[m
[31m-  lua_lock(D->L);[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void DumpChar(int y, DumpState* D)[m
[31m-{[m
[31m- char x=(char)y;[m
[31m- DumpVar(x,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpInt(int x, DumpState* D)[m
[31m-{[m
[31m- DumpVar(x,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpNumber(lua_Number x, DumpState* D)[m
[31m-{[m
[31m- DumpVar(x,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpVector(const void* b, int n, size_t size, DumpState* D)[m
[31m-{[m
[31m- DumpInt(n,D);[m
[31m- DumpMem(b,n,size,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpString(const TString* s, DumpState* D)[m
[31m-{[m
[31m- if (s==NULL || getstr(s)==NULL)[m
[31m- {[m
[31m-  size_t size=0;[m
[31m-  DumpVar(size,D);[m
[31m- }[m
[31m- else[m
[31m- {[m
[31m-  size_t size=s->tsv.len+1;		/* include trailing '\0' */[m
[31m-  DumpVar(size,D);[m
[31m-  DumpBlock(getstr(s),size,D);[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-#define DumpCode(f,D)	 DumpVector(f->code,f->sizecode,sizeof(Instruction),D)[m
[31m-[m
[31m-static void DumpFunction(const Proto* f, const TString* p, DumpState* D);[m
[31m-[m
[31m-static void DumpConstants(const Proto* f, DumpState* D)[m
[31m-{[m
[31m- int i,n=f->sizek;[m
[31m- DumpInt(n,D);[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  const TValue* o=&f->k[i];[m
[31m-  DumpChar(ttype(o),D);[m
[31m-  switch (ttype(o))[m
[31m-  {[m
[31m-   case LUA_TNIL:[m
[31m-	break;[m
[31m-   case LUA_TBOOLEAN:[m
[31m-	DumpChar(bvalue(o),D);[m
[31m-	break;[m
[31m-   case LUA_TNUMBER:[m
[31m-	DumpNumber(nvalue(o),D);[m
[31m-	break;[m
[31m-   case LUA_TSTRING:[m
[31m-	DumpString(rawtsvalue(o),D);[m
[31m-	break;[m
[31m-   default:[m
[31m-	lua_assert(0);			/* cannot happen */[m
[31m-	break;[m
[31m-  }[m
[31m- }[m
[31m- n=f->sizep;[m
[31m- DumpInt(n,D);[m
[31m- for (i=0; i<n; i++) DumpFunction(f->p[i],f->source,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpDebug(const Proto* f, DumpState* D)[m
[31m-{[m
[31m- int i,n;[m
[31m- n= (D->strip) ? 0 : f->sizelineinfo;[m
[31m- DumpVector(f->lineinfo,n,sizeof(int),D);[m
[31m- n= (D->strip) ? 0 : f->sizelocvars;[m
[31m- DumpInt(n,D);[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  DumpString(f->locvars[i].varname,D);[m
[31m-  DumpInt(f->locvars[i].startpc,D);[m
[31m-  DumpInt(f->locvars[i].endpc,D);[m
[31m- }[m
[31m- n= (D->strip) ? 0 : f->sizeupvalues;[m
[31m- DumpInt(n,D);[m
[31m- for (i=0; i<n; i++) DumpString(f->upvalues[i],D);[m
[31m-}[m
[31m-[m
[31m-static void DumpFunction(const Proto* f, const TString* p, DumpState* D)[m
[31m-{[m
[31m- DumpString((f->source==p || D->strip) ? NULL : f->source,D);[m
[31m- DumpInt(f->linedefined,D);[m
[31m- DumpInt(f->lastlinedefined,D);[m
[31m- DumpChar(f->nups,D);[m
[31m- DumpChar(f->numparams,D);[m
[31m- DumpChar(f->is_vararg,D);[m
[31m- DumpChar(f->maxstacksize,D);[m
[31m- DumpCode(f,D);[m
[31m- DumpConstants(f,D);[m
[31m- DumpDebug(f,D);[m
[31m-}[m
[31m-[m
[31m-static void DumpHeader(DumpState* D)[m
[31m-{[m
[31m- char h[LUAC_HEADERSIZE];[m
[31m- luaU_header(h);[m
[31m- DumpBlock(h,LUAC_HEADERSIZE,D);[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** dump Lua function as precompiled chunk[m
[31m-*/[m
[31m-int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip)[m
[31m-{[m
[31m- DumpState D;[m
[31m- D.L=L;[m
[31m- D.writer=w;[m
[31m- D.data=data;[m
[31m- D.strip=strip;[m
[31m- D.status=0;[m
[31m- DumpHeader(&D);[m
[31m- DumpFunction(f,NULL,&D);[m
[31m- return D.status;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lfunc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lfunc.c[m
[1mdeleted file mode 100644[m
[1mindex 813e88f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lfunc.c[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $[m
[31m-** Auxiliary functions to manipulate prototypes and closures[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define lfunc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) {[m
[31m-  Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems)));[m
[31m-  luaC_link(L, obj2gco(c), LUA_TFUNCTION);[m
[31m-  c->c.isC = 1;[m
[31m-  c->c.env = e;[m
[31m-  c->c.nupvalues = cast_byte(nelems);[m
[31m-  return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) {[m
[31m-  Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems)));[m
[31m-  luaC_link(L, obj2gco(c), LUA_TFUNCTION);[m
[31m-  c->l.isC = 0;[m
[31m-  c->l.env = e;[m
[31m-  c->l.nupvalues = cast_byte(nelems);[m
[31m-  while (nelems--) c->l.upvals[nelems] = NULL;[m
[31m-  return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-UpVal *luaF_newupval (lua_State *L) {[m
[31m-  UpVal *uv = luaM_new(L, UpVal);[m
[31m-  luaC_link(L, obj2gco(uv), LUA_TUPVAL);[m
[31m-  uv->v = &uv->u.value;[m
[31m-  setnilvalue(uv->v);[m
[31m-  return uv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-UpVal *luaF_findupval (lua_State *L, StkId level) {[m
[31m-  global_State *g = G(L);[m
[31m-  GCObject **pp = &L->openupval;[m
[31m-  UpVal *p;[m
[31m-  UpVal *uv;[m
[31m-  while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) {[m
[31m-    lua_assert(p->v != &p->u.value);[m
[31m-    if (p->v == level) {  /* found a corresponding upvalue? */[m
[31m-      if (isdead(g, obj2gco(p)))  /* is it dead? */[m
[31m-        changewhite(obj2gco(p));  /* ressurect it */[m
[31m-      return p;[m
[31m-    }[m
[31m-    pp = &p->next;[m
[31m-  }[m
[31m-  uv = luaM_new(L, UpVal);  /* not found: create a new one */[m
[31m-  uv->tt = LUA_TUPVAL;[m
[31m-  uv->marked = luaC_white(g);[m
[31m-  uv->v = level;  /* current value lives in the stack */[m
[31m-  uv->next = *pp;  /* chain it in the proper position */[m
[31m-  *pp = obj2gco(uv);[m
[31m-  uv->u.l.prev = &g->uvhead;  /* double link it in `uvhead' list */[m
[31m-  uv->u.l.next = g->uvhead.u.l.next;[m
[31m-  uv->u.l.next->u.l.prev = uv;[m
[31m-  g->uvhead.u.l.next = uv;[m
[31m-  lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);[m
[31m-  return uv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void unlinkupval (UpVal *uv) {[m
[31m-  lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);[m
[31m-  uv->u.l.next->u.l.prev = uv->u.l.prev;  /* remove from `uvhead' list */[m
[31m-  uv->u.l.prev->u.l.next = uv->u.l.next;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaF_freeupval (lua_State *L, UpVal *uv) {[m
[31m-  if (uv->v != &uv->u.value)  /* is it open? */[m
[31m-    unlinkupval(uv);  /* remove from open list */[m
[31m-  luaM_free(L, uv);  /* free upvalue */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaF_close (lua_State *L, StkId level) {[m
[31m-  UpVal *uv;[m
[31m-  global_State *g = G(L);[m
[31m-  while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) {[m
[31m-    GCObject *o = obj2gco(uv);[m
[31m-    lua_assert(!isblack(o) && uv->v != &uv->u.value);[m
[31m-    L->openupval = uv->next;  /* remove from `open' list */[m
[31m-    if (isdead(g, o))[m
[31m-      luaF_freeupval(L, uv);  /* free upvalue */[m
[31m-    else {[m
[31m-      unlinkupval(uv);[m
[31m-      setobj(L, &uv->u.value, uv->v);[m
[31m-      uv->v = &uv->u.value;  /* now current value lives here */[m
[31m-      luaC_linkupval(L, uv);  /* link upvalue into `gcroot' list */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Proto *luaF_newproto (lua_State *L) {[m
[31m-  Proto *f = luaM_new(L, Proto);[m
[31m-  luaC_link(L, obj2gco(f), LUA_TPROTO);[m
[31m-  f->k = NULL;[m
[31m-  f->sizek = 0;[m
[31m-  f->p = NULL;[m
[31m-  f->sizep = 0;[m
[31m-  f->code = NULL;[m
[31m-  f->sizecode = 0;[m
[31m-  f->sizelineinfo = 0;[m
[31m-  f->sizeupvalues = 0;[m
[31m-  f->nups = 0;[m
[31m-  f->upvalues = NULL;[m
[31m-  f->numparams = 0;[m
[31m-  f->is_vararg = 0;[m
[31m-  f->maxstacksize = 0;[m
[31m-  f->lineinfo = NULL;[m
[31m-  f->sizelocvars = 0;[m
[31m-  f->locvars = NULL;[m
[31m-  f->linedefined = 0;[m
[31m-  f->lastlinedefined = 0;[m
[31m-  f->source = NULL;[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaF_freeproto (lua_State *L, Proto *f) {[m
[31m-  luaM_freearray(L, f->code, f->sizecode, Instruction);[m
[31m-  luaM_freearray(L, f->p, f->sizep, Proto *);[m
[31m-  luaM_freearray(L, f->k, f->sizek, TValue);[m
[31m-  luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);[m
[31m-  luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);[m
[31m-  luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *);[m
[31m-  luaM_free(L, f);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaF_freeclosure (lua_State *L, Closure *c) {[m
[31m-  int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) :[m
[31m-                          sizeLclosure(c->l.nupvalues);[m
[31m-  luaM_freemem(L, c, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Look for n-th local variable at line `line' in function `func'.[m
[31m-** Returns NULL if not found.[m
[31m-*/[m
[31m-const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {[m
[31m-  int i;[m
[31m-  for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {[m
[31m-    if (pc < f->locvars[i].endpc) {  /* is variable active? */[m
[31m-      local_number--;[m
[31m-      if (local_number == 0)[m
[31m-        return getstr(f->locvars[i].varname);[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* not found */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lfunc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lfunc.h[m
[1mdeleted file mode 100644[m
[1mindex a68cf51..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lfunc.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Auxiliary functions to manipulate prototypes and closures[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lfunc_h[m
[31m-#define lfunc_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-#define sizeCclosure(n)	(cast(int, sizeof(CClosure)) + \[m
[31m-                         cast(int, sizeof(TValue)*((n)-1)))[m
[31m-[m
[31m-#define sizeLclosure(n)	(cast(int, sizeof(LClosure)) + \[m
[31m-                         cast(int, sizeof(TValue *)*((n)-1)))[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC Proto *luaF_newproto (lua_State *L);[m
[31m-LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e);[m
[31m-LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e);[m
[31m-LUAI_FUNC UpVal *luaF_newupval (lua_State *L);[m
[31m-LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);[m
[31m-LUAI_FUNC void luaF_close (lua_State *L, StkId level);[m
[31m-LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);[m
[31m-LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c);[m
[31m-LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv);[m
[31m-LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,[m
[31m-                                         int pc);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lgc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lgc.c[m
[1mdeleted file mode 100644[m
[1mindex e909c79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lgc.c[m
[1m+++ /dev/null[m
[36m@@ -1,710 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lgc.c,v 2.38.1.2 2011/03/18 18:05:38 roberto Exp $[m
[31m-** Garbage Collector[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lgc_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-[m
[31m-[m
[31m-#define GCSTEPSIZE	1024u[m
[31m-#define GCSWEEPMAX	40[m
[31m-#define GCSWEEPCOST	10[m
[31m-#define GCFINALIZECOST	100[m
[31m-[m
[31m-[m
[31m-#define maskmarks	cast_byte(~(bitmask(BLACKBIT)|WHITEBITS))[m
[31m-[m
[31m-#define makewhite(g,x)	\[m
[31m-   ((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g)))[m
[31m-[m
[31m-#define white2gray(x)	reset2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)[m
[31m-#define black2gray(x)	resetbit((x)->gch.marked, BLACKBIT)[m
[31m-[m
[31m-#define stringmark(s)	reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT)[m
[31m-[m
[31m-[m
[31m-#define isfinalized(u)		testbit((u)->marked, FINALIZEDBIT)[m
[31m-#define markfinalized(u)	l_setbit((u)->marked, FINALIZEDBIT)[m
[31m-[m
[31m-[m
[31m-#define KEYWEAK         bitmask(KEYWEAKBIT)[m
[31m-#define VALUEWEAK       bitmask(VALUEWEAKBIT)[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define markvalue(g,o) { checkconsistency(o); \[m
[31m-  if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); }[m
[31m-[m
[31m-#define markobject(g,t) { if (iswhite(obj2gco(t))) \[m
[31m-		reallymarkobject(g, obj2gco(t)); }[m
[31m-[m
[31m-[m
[31m-#define setthreshold(g)  (g->GCthreshold = (g->estimate/100) * g->gcpause)[m
[31m-[m
[31m-[m
[31m-static void removeentry (Node *n) {[m
[31m-  lua_assert(ttisnil(gval(n)));[m
[31m-  if (iscollectable(gkey(n)))[m
[31m-    setttype(gkey(n), LUA_TDEADKEY);  /* dead key; remove it */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void reallymarkobject (global_State *g, GCObject *o) {[m
[31m-  lua_assert(iswhite(o) && !isdead(g, o));[m
[31m-  white2gray(o);[m
[31m-  switch (o->gch.tt) {[m
[31m-    case LUA_TSTRING: {[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TUSERDATA: {[m
[31m-      Table *mt = gco2u(o)->metatable;[m
[31m-      gray2black(o);  /* udata are never gray */[m
[31m-      if (mt) markobject(g, mt);[m
[31m-      markobject(g, gco2u(o)->env);[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TUPVAL: {[m
[31m-      UpVal *uv = gco2uv(o);[m
[31m-      markvalue(g, uv->v);[m
[31m-      if (uv->v == &uv->u.value)  /* closed? */[m
[31m-        gray2black(o);  /* open upvalues are never black */[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TFUNCTION: {[m
[31m-      gco2cl(o)->c.gclist = g->gray;[m
[31m-      g->gray = o;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TTABLE: {[m
[31m-      gco2h(o)->gclist = g->gray;[m
[31m-      g->gray = o;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TTHREAD: {[m
[31m-      gco2th(o)->gclist = g->gray;[m
[31m-      g->gray = o;[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TPROTO: {[m
[31m-      gco2p(o)->gclist = g->gray;[m
[31m-      g->gray = o;[m
[31m-      break;[m
[31m-    }[m
[31m-    default: lua_assert(0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void marktmu (global_State *g) {[m
[31m-  GCObject *u = g->tmudata;[m
[31m-  if (u) {[m
[31m-    do {[m
[31m-      u = u->gch.next;[m
[31m-      makewhite(g, u);  /* may be marked, if left from previous GC */[m
[31m-      reallymarkobject(g, u);[m
[31m-    } while (u != g->tmudata);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* move `dead' udata that need finalization to list `tmudata' */[m
[31m-size_t luaC_separateudata (lua_State *L, int all) {[m
[31m-  global_State *g = G(L);[m
[31m-  size_t deadmem = 0;[m
[31m-  GCObject **p = &g->mainthread->next;[m
[31m-  GCObject *curr;[m
[31m-  while ((curr = *p) != NULL) {[m
[31m-    if (!(iswhite(curr) || all) || isfinalized(gco2u(curr)))[m
[31m-      p = &curr->gch.next;  /* don't bother with them */[m
[31m-    else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) {[m
[31m-      markfinalized(gco2u(curr));  /* don't need finalization */[m
[31m-      p = &curr->gch.next;[m
[31m-    }[m
[31m-    else {  /* must call its gc method */[m
[31m-      deadmem += sizeudata(gco2u(curr));[m
[31m-      markfinalized(gco2u(curr));[m
[31m-      *p = curr->gch.next;[m
[31m-      /* link `curr' at the end of `tmudata' list */[m
[31m-      if (g->tmudata == NULL)  /* list is empty? */[m
[31m-        g->tmudata = curr->gch.next = curr;  /* creates a circular list */[m
[31m-      else {[m
[31m-        curr->gch.next = g->tmudata->gch.next;[m
[31m-        g->tmudata->gch.next = curr;[m
[31m-        g->tmudata = curr;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  return deadmem;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int traversetable (global_State *g, Table *h) {[m
[31m-  int i;[m
[31m-  int weakkey = 0;[m
[31m-  int weakvalue = 0;[m
[31m-  const TValue *mode;[m
[31m-  if (h->metatable)[m
[31m-    markobject(g, h->metatable);[m
[31m-  mode = gfasttm(g, h->metatable, TM_MODE);[m
[31m-  if (mode && ttisstring(mode)) {  /* is there a weak mode? */[m
[31m-    weakkey = (strchr(svalue(mode), 'k') != NULL);[m
[31m-    weakvalue = (strchr(svalue(mode), 'v') != NULL);[m
[31m-    if (weakkey || weakvalue) {  /* is really weak? */[m
[31m-      h->marked &= ~(KEYWEAK | VALUEWEAK);  /* clear bits */[m
[31m-      h->marked |= cast_byte((weakkey << KEYWEAKBIT) |[m
[31m-                             (weakvalue << VALUEWEAKBIT));[m
[31m-      h->gclist = g->weak;  /* must be cleared after GC, ... */[m
[31m-      g->weak = obj2gco(h);  /* ... so put in the appropriate list */[m
[31m-    }[m
[31m-  }[m
[31m-  if (weakkey && weakvalue) return 1;[m
[31m-  if (!weakvalue) {[m
[31m-    i = h->sizearray;[m
[31m-    while (i--)[m
[31m-      markvalue(g, &h->array[i]);[m
[31m-  }[m
[31m-  i = sizenode(h);[m
[31m-  while (i--) {[m
[31m-    Node *n = gnode(h, i);[m
[31m-    lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n)));[m
[31m-    if (ttisnil(gval(n)))[m
[31m-      removeentry(n);  /* remove empty entries */[m
[31m-    else {[m
[31m-      lua_assert(!ttisnil(gkey(n)));[m
[31m-      if (!weakkey) markvalue(g, gkey(n));[m
[31m-      if (!weakvalue) markvalue(g, gval(n));[m
[31m-    }[m
[31m-  }[m
[31m-  return weakkey || weakvalue;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** All marks are conditional because a GC may happen while the[m
[31m-** prototype is still being created[m
[31m-*/[m
[31m-static void traverseproto (global_State *g, Proto *f) {[m
[31m-  int i;[m
[31m-  if (f->source) stringmark(f->source);[m
[31m-  for (i=0; i<f->sizek; i++)  /* mark literals */[m
[31m-    markvalue(g, &f->k[i]);[m
[31m-  for (i=0; i<f->sizeupvalues; i++) {  /* mark upvalue names */[m
[31m-    if (f->upvalues[i])[m
[31m-      stringmark(f->upvalues[i]);[m
[31m-  }[m
[31m-  for (i=0; i<f->sizep; i++) {  /* mark nested protos */[m
[31m-    if (f->p[i])[m
[31m-      markobject(g, f->p[i]);[m
[31m-  }[m
[31m-  for (i=0; i<f->sizelocvars; i++) {  /* mark local-variable names */[m
[31m-    if (f->locvars[i].varname)[m
[31m-      stringmark(f->locvars[i].varname);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void traverseclosure (global_State *g, Closure *cl) {[m
[31m-  markobject(g, cl->c.env);[m
[31m-  if (cl->c.isC) {[m
[31m-    int i;[m
[31m-    for (i=0; i<cl->c.nupvalues; i++)  /* mark its upvalues */[m
[31m-      markvalue(g, &cl->c.upvalue[i]);[m
[31m-  }[m
[31m-  else {[m
[31m-    int i;[m
[31m-    lua_assert(cl->l.nupvalues == cl->l.p->nups);[m
[31m-    markobject(g, cl->l.p);[m
[31m-    for (i=0; i<cl->l.nupvalues; i++)  /* mark its upvalues */[m
[31m-      markobject(g, cl->l.upvals[i]);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void checkstacksizes (lua_State *L, StkId max) {[m
[31m-  int ci_used = cast_int(L->ci - L->base_ci);  /* number of `ci' in use */[m
[31m-  int s_used = cast_int(max - L->stack);  /* part of stack in use */[m
[31m-  if (L->size_ci > LUAI_MAXCALLS)  /* handling overflow? */[m
[31m-    return;  /* do not touch the stacks */[m
[31m-  if (4*ci_used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci)[m
[31m-    luaD_reallocCI(L, L->size_ci/2);  /* still big enough... */[m
[31m-  condhardstacktests(luaD_reallocCI(L, ci_used + 1));[m
[31m-  if (4*s_used < L->stacksize &&[m
[31m-      2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize)[m
[31m-    luaD_reallocstack(L, L->stacksize/2);  /* still big enough... */[m
[31m-  condhardstacktests(luaD_reallocstack(L, s_used));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void traversestack (global_State *g, lua_State *l) {[m
[31m-  StkId o, lim;[m
[31m-  CallInfo *ci;[m
[31m-  markvalue(g, gt(l));[m
[31m-  lim = l->top;[m
[31m-  for (ci = l->base_ci; ci <= l->ci; ci++) {[m
[31m-    lua_assert(ci->top <= l->stack_last);[m
[31m-    if (lim < ci->top) lim = ci->top;[m
[31m-  }[m
[31m-  for (o = l->stack; o < l->top; o++)[m
[31m-    markvalue(g, o);[m
[31m-  for (; o <= lim; o++)[m
[31m-    setnilvalue(o);[m
[31m-  checkstacksizes(l, lim);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** traverse one gray object, turning it to black.[m
[31m-** Returns `quantity' traversed.[m
[31m-*/[m
[31m-static l_mem propagatemark (global_State *g) {[m
[31m-  GCObject *o = g->gray;[m
[31m-  lua_assert(isgray(o));[m
[31m-  gray2black(o);[m
[31m-  switch (o->gch.tt) {[m
[31m-    case LUA_TTABLE: {[m
[31m-      Table *h = gco2h(o);[m
[31m-      g->gray = h->gclist;[m
[31m-      if (traversetable(g, h))  /* table is weak? */[m
[31m-        black2gray(o);  /* keep it gray */[m
[31m-      return sizeof(Table) + sizeof(TValue) * h->sizearray +[m
[31m-                             sizeof(Node) * sizenode(h);[m
[31m-    }[m
[31m-    case LUA_TFUNCTION: {[m
[31m-      Closure *cl = gco2cl(o);[m
[31m-      g->gray = cl->c.gclist;[m
[31m-      traverseclosure(g, cl);[m
[31m-      return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) :[m
[31m-                           sizeLclosure(cl->l.nupvalues);[m
[31m-    }[m
[31m-    case LUA_TTHREAD: {[m
[31m-      lua_State *th = gco2th(o);[m
[31m-      g->gray = th->gclist;[m
[31m-      th->gclist = g->grayagain;[m
[31m-      g->grayagain = o;[m
[31m-      black2gray(o);[m
[31m-      traversestack(g, th);[m
[31m-      return sizeof(lua_State) + sizeof(TValue) * th->stacksize +[m
[31m-                                 sizeof(CallInfo) * th->size_ci;[m
[31m-    }[m
[31m-    case LUA_TPROTO: {[m
[31m-      Proto *p = gco2p(o);[m
[31m-      g->gray = p->gclist;[m
[31m-      traverseproto(g, p);[m
[31m-      return sizeof(Proto) + sizeof(Instruction) * p->sizecode +[m
[31m-                             sizeof(Proto *) * p->sizep +[m
[31m-                             sizeof(TValue) * p->sizek + [m
[31m-                             sizeof(int) * p->sizelineinfo +[m
[31m-                             sizeof(LocVar) * p->sizelocvars +[m
[31m-                             sizeof(TString *) * p->sizeupvalues;[m
[31m-    }[m
[31m-    default: lua_assert(0); return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t propagateall (global_State *g) {[m
[31m-  size_t m = 0;[m
[31m-  while (g->gray) m += propagatemark(g);[m
[31m-  return m;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** The next function tells whether a key or value can be cleared from[m
[31m-** a weak table. Non-collectable objects are never removed from weak[m
[31m-** tables. Strings behave as `values', so are never removed too. for[m
[31m-** other objects: if really collected, cannot keep them; for userdata[m
[31m-** being finalized, keep them in keys, but not in values[m
[31m-*/[m
[31m-static int iscleared (const TValue *o, int iskey) {[m
[31m-  if (!iscollectable(o)) return 0;[m
[31m-  if (ttisstring(o)) {[m
[31m-    stringmark(rawtsvalue(o));  /* strings are `values', so are never weak */[m
[31m-    return 0;[m
[31m-  }[m
[31m-  return iswhite(gcvalue(o)) ||[m
[31m-    (ttisuserdata(o) && (!iskey && isfinalized(uvalue(o))));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** clear collected entries from weaktables[m
[31m-*/[m
[31m-static void cleartable (GCObject *l) {[m
[31m-  while (l) {[m
[31m-    Table *h = gco2h(l);[m
[31m-    int i = h->sizearray;[m
[31m-    lua_assert(testbit(h->marked, VALUEWEAKBIT) ||[m
[31m-               testbit(h->marked, KEYWEAKBIT));[m
[31m-    if (testbit(h->marked, VALUEWEAKBIT)) {[m
[31m-      while (i--) {[m
[31m-        TValue *o = &h->array[i];[m
[31m-        if (iscleared(o, 0))  /* value was collected? */[m
[31m-          setnilvalue(o);  /* remove value */[m
[31m-      }[m
[31m-    }[m
[31m-    i = sizenode(h);[m
[31m-    while (i--) {[m
[31m-      Node *n = gnode(h, i);[m
[31m-      if (!ttisnil(gval(n)) &&  /* non-empty entry? */[m
[31m-          (iscleared(key2tval(n), 1) || iscleared(gval(n), 0))) {[m
[31m-        setnilvalue(gval(n));  /* remove value ... */[m
[31m-        removeentry(n);  /* remove entry from table */[m
[31m-      }[m
[31m-    }[m
[31m-    l = h->gclist;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void freeobj (lua_State *L, GCObject *o) {[m
[31m-  switch (o->gch.tt) {[m
[31m-    case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;[m
[31m-    case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break;[m
[31m-    case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break;[m
[31m-    case LUA_TTABLE: luaH_free(L, gco2h(o)); break;[m
[31m-    case LUA_TTHREAD: {[m
[31m-      lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread);[m
[31m-      luaE_freethread(L, gco2th(o));[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TSTRING: {[m
[31m-      G(L)->strt.nuse--;[m
[31m-      luaM_freemem(L, o, sizestring(gco2ts(o)));[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TUSERDATA: {[m
[31m-      luaM_freemem(L, o, sizeudata(gco2u(o)));[m
[31m-      break;[m
[31m-    }[m
[31m-    default: lua_assert(0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define sweepwholelist(L,p)	sweeplist(L,p,MAX_LUMEM)[m
[31m-[m
[31m-[m
[31m-static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {[m
[31m-  GCObject *curr;[m
[31m-  global_State *g = G(L);[m
[31m-  int deadmask = otherwhite(g);[m
[31m-  while ((curr = *p) != NULL && count-- > 0) {[m
[31m-    if (curr->gch.tt == LUA_TTHREAD)  /* sweep open upvalues of each thread */[m
[31m-      sweepwholelist(L, &gco2th(curr)->openupval);[m
[31m-    if ((curr->gch.marked ^ WHITEBITS) & deadmask) {  /* not dead? */[m
[31m-      lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT));[m
[31m-      makewhite(g, curr);  /* make it white (for next cycle) */[m
[31m-      p = &curr->gch.next;[m
[31m-    }[m
[31m-    else {  /* must erase `curr' */[m
[31m-      lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT));[m
[31m-      *p = curr->gch.next;[m
[31m-      if (curr == g->rootgc)  /* is the first element of the list? */[m
[31m-        g->rootgc = curr->gch.next;  /* adjust first */[m
[31m-      freeobj(L, curr);[m
[31m-    }[m
[31m-  }[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void checkSizes (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  /* check size of string hash */[m
[31m-  if (g->strt.nuse < cast(lu_int32, g->strt.size/4) &&[m
[31m-      g->strt.size > MINSTRTABSIZE*2)[m
[31m-    luaS_resize(L, g->strt.size/2);  /* table is too big */[m
[31m-  /* check size of buffer */[m
[31m-  if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) {  /* buffer too big? */[m
[31m-    size_t newsize = luaZ_sizebuffer(&g->buff) / 2;[m
[31m-    luaZ_resizebuffer(L, &g->buff, newsize);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void GCTM (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  GCObject *o = g->tmudata->gch.next;  /* get first element */[m
[31m-  Udata *udata = rawgco2u(o);[m
[31m-  const TValue *tm;[m
[31m-  /* remove udata from `tmudata' */[m
[31m-  if (o == g->tmudata)  /* last element? */[m
[31m-    g->tmudata = NULL;[m
[31m-  else[m
[31m-    g->tmudata->gch.next = udata->uv.next;[m
[31m-  udata->uv.next = g->mainthread->next;  /* return it to `root' list */[m
[31m-  g->mainthread->next = o;[m
[31m-  makewhite(g, o);[m
[31m-  tm = fasttm(L, udata->uv.metatable, TM_GC);[m
[31m-  if (tm != NULL) {[m
[31m-    lu_byte oldah = L->allowhook;[m
[31m-    lu_mem oldt = g->GCthreshold;[m
[31m-    L->allowhook = 0;  /* stop debug hooks during GC tag method */[m
[31m-    g->GCthreshold = 2*g->totalbytes;  /* avoid GC steps */[m
[31m-    setobj2s(L, L->top, tm);[m
[31m-    setuvalue(L, L->top+1, udata);[m
[31m-    L->top += 2;[m
[31m-    luaD_call(L, L->top - 2, 0);[m
[31m-    L->allowhook = oldah;  /* restore hooks */[m
[31m-    g->GCthreshold = oldt;  /* restore threshold */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Call all GC tag methods[m
[31m-*/[m
[31m-void luaC_callGCTM (lua_State *L) {[m
[31m-  while (G(L)->tmudata)[m
[31m-    GCTM(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_freeall (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  int i;[m
[31m-  g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT);  /* mask to collect all elements */[m
[31m-  sweepwholelist(L, &g->rootgc);[m
[31m-  for (i = 0; i < g->strt.size; i++)  /* free all string lists */[m
[31m-    sweepwholelist(L, &g->strt.hash[i]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void markmt (global_State *g) {[m
[31m-  int i;[m
[31m-  for (i=0; i<NUM_TAGS; i++)[m
[31m-    if (g->mt[i]) markobject(g, g->mt[i]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* mark root set */[m
[31m-static void markroot (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  g->gray = NULL;[m
[31m-  g->grayagain = NULL;[m
[31m-  g->weak = NULL;[m
[31m-  markobject(g, g->mainthread);[m
[31m-  /* make global table be traversed before main stack */[m
[31m-  markvalue(g, gt(g->mainthread));[m
[31m-  markvalue(g, registry(L));[m
[31m-  markmt(g);[m
[31m-  g->gcstate = GCSpropagate;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void remarkupvals (global_State *g) {[m
[31m-  UpVal *uv;[m
[31m-  for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) {[m
[31m-    lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);[m
[31m-    if (isgray(obj2gco(uv)))[m
[31m-      markvalue(g, uv->v);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void atomic (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  size_t udsize;  /* total size of userdata to be finalized */[m
[31m-  /* remark occasional upvalues of (maybe) dead threads */[m
[31m-  remarkupvals(g);[m
[31m-  /* traverse objects cautch by write barrier and by 'remarkupvals' */[m
[31m-  propagateall(g);[m
[31m-  /* remark weak tables */[m
[31m-  g->gray = g->weak;[m
[31m-  g->weak = NULL;[m
[31m-  lua_assert(!iswhite(obj2gco(g->mainthread)));[m
[31m-  markobject(g, L);  /* mark running thread */[m
[31m-  markmt(g);  /* mark basic metatables (again) */[m
[31m-  propagateall(g);[m
[31m-  /* remark gray again */[m
[31m-  g->gray = g->grayagain;[m
[31m-  g->grayagain = NULL;[m
[31m-  propagateall(g);[m
[31m-  udsize = luaC_separateudata(L, 0);  /* separate userdata to be finalized */[m
[31m-  marktmu(g);  /* mark `preserved' userdata */[m
[31m-  udsize += propagateall(g);  /* remark, to propagate `preserveness' */[m
[31m-  cleartable(g->weak);  /* remove collected objects from weak tables */[m
[31m-  /* flip current white */[m
[31m-  g->currentwhite = cast_byte(otherwhite(g));[m
[31m-  g->sweepstrgc = 0;[m
[31m-  g->sweepgc = &g->rootgc;[m
[31m-  g->gcstate = GCSsweepstring;[m
[31m-  g->estimate = g->totalbytes - udsize;  /* first estimate */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static l_mem singlestep (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  /*lua_checkmemory(L);*/[m
[31m-  switch (g->gcstate) {[m
[31m-    case GCSpause: {[m
[31m-      markroot(L);  /* start a new collection */[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case GCSpropagate: {[m
[31m-      if (g->gray)[m
[31m-        return propagatemark(g);[m
[31m-      else {  /* no more `gray' objects */[m
[31m-        atomic(L);  /* finish mark phase */[m
[31m-        return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    case GCSsweepstring: {[m
[31m-      lu_mem old = g->totalbytes;[m
[31m-      sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]);[m
[31m-      if (g->sweepstrgc >= g->strt.size)  /* nothing more to sweep? */[m
[31m-        g->gcstate = GCSsweep;  /* end sweep-string phase */[m
[31m-      lua_assert(old >= g->totalbytes);[m
[31m-      g->estimate -= old - g->totalbytes;[m
[31m-      return GCSWEEPCOST;[m
[31m-    }[m
[31m-    case GCSsweep: {[m
[31m-      lu_mem old = g->totalbytes;[m
[31m-      g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);[m
[31m-      if (*g->sweepgc == NULL) {  /* nothing more to sweep? */[m
[31m-        checkSizes(L);[m
[31m-        g->gcstate = GCSfinalize;  /* end sweep phase */[m
[31m-      }[m
[31m-      lua_assert(old >= g->totalbytes);[m
[31m-      g->estimate -= old - g->totalbytes;[m
[31m-      return GCSWEEPMAX*GCSWEEPCOST;[m
[31m-    }[m
[31m-    case GCSfinalize: {[m
[31m-      if (g->tmudata) {[m
[31m-        GCTM(L);[m
[31m-        if (g->estimate > GCFINALIZECOST)[m
[31m-          g->estimate -= GCFINALIZECOST;[m
[31m-        return GCFINALIZECOST;[m
[31m-      }[m
[31m-      else {[m
[31m-        g->gcstate = GCSpause;  /* end collection */[m
[31m-        g->gcdept = 0;[m
[31m-        return 0;[m
[31m-      }[m
[31m-    }[m
[31m-    default: lua_assert(0); return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_step (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul;[m
[31m-  if (lim == 0)[m
[31m-    lim = (MAX_LUMEM-1)/2;  /* no limit */[m
[31m-  g->gcdept += g->totalbytes - g->GCthreshold;[m
[31m-  do {[m
[31m-    lim -= singlestep(L);[m
[31m-    if (g->gcstate == GCSpause)[m
[31m-      break;[m
[31m-  } while (lim > 0);[m
[31m-  if (g->gcstate != GCSpause) {[m
[31m-    if (g->gcdept < GCSTEPSIZE)[m
[31m-      g->GCthreshold = g->totalbytes + GCSTEPSIZE;  /* - lim/g->gcstepmul;*/[m
[31m-    else {[m
[31m-      g->gcdept -= GCSTEPSIZE;[m
[31m-      g->GCthreshold = g->totalbytes;[m
[31m-    }[m
[31m-  }[m
[31m-  else {[m
[31m-    setthreshold(g);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_fullgc (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  if (g->gcstate <= GCSpropagate) {[m
[31m-    /* reset sweep marks to sweep all elements (returning them to white) */[m
[31m-    g->sweepstrgc = 0;[m
[31m-    g->sweepgc = &g->rootgc;[m
[31m-    /* reset other collector lists */[m
[31m-    g->gray = NULL;[m
[31m-    g->grayagain = NULL;[m
[31m-    g->weak = NULL;[m
[31m-    g->gcstate = GCSsweepstring;[m
[31m-  }[m
[31m-  lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate);[m
[31m-  /* finish any pending sweep phase */[m
[31m-  while (g->gcstate != GCSfinalize) {[m
[31m-    lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep);[m
[31m-    singlestep(L);[m
[31m-  }[m
[31m-  markroot(L);[m
[31m-  while (g->gcstate != GCSpause) {[m
[31m-    singlestep(L);[m
[31m-  }[m
[31m-  setthreshold(g);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {[m
[31m-  global_State *g = G(L);[m
[31m-  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));[m
[31m-  lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);[m
[31m-  lua_assert(ttype(&o->gch) != LUA_TTABLE);[m
[31m-  /* must keep invariant? */[m
[31m-  if (g->gcstate == GCSpropagate)[m
[31m-    reallymarkobject(g, v);  /* restore invariant */[m
[31m-  else  /* don't mind */[m
[31m-    makewhite(g, o);  /* mark as white just to avoid other barriers */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_barrierback (lua_State *L, Table *t) {[m
[31m-  global_State *g = G(L);[m
[31m-  GCObject *o = obj2gco(t);[m
[31m-  lua_assert(isblack(o) && !isdead(g, o));[m
[31m-  lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);[m
[31m-  black2gray(o);  /* make table gray (again) */[m
[31m-  t->gclist = g->grayagain;[m
[31m-  g->grayagain = o;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_link (lua_State *L, GCObject *o, lu_byte tt) {[m
[31m-  global_State *g = G(L);[m
[31m-  o->gch.next = g->rootgc;[m
[31m-  g->rootgc = o;[m
[31m-  o->gch.marked = luaC_white(g);[m
[31m-  o->gch.tt = tt;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaC_linkupval (lua_State *L, UpVal *uv) {[m
[31m-  global_State *g = G(L);[m
[31m-  GCObject *o = obj2gco(uv);[m
[31m-  o->gch.next = g->rootgc;  /* link upvalue into `rootgc' list */[m
[31m-  g->rootgc = o;[m
[31m-  if (isgray(o)) { [m
[31m-    if (g->gcstate == GCSpropagate) {[m
[31m-      gray2black(o);  /* closed upvalues need barrier */[m
[31m-      luaC_barrier(L, uv, uv->v);[m
[31m-    }[m
[31m-    else {  /* sweep phase: sweep it (turning it into white) */[m
[31m-      makewhite(g, o);[m
[31m-      lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lgc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lgc.h[m
[1mdeleted file mode 100644[m
[1mindex 5a8dc60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lgc.h[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Garbage Collector[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lgc_h[m
[31m-#define lgc_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Possible states of the Garbage Collector[m
[31m-*/[m
[31m-#define GCSpause	0[m
[31m-#define GCSpropagate	1[m
[31m-#define GCSsweepstring	2[m
[31m-#define GCSsweep	3[m
[31m-#define GCSfinalize	4[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** some userful bit tricks[m
[31m-*/[m
[31m-#define resetbits(x,m)	((x) &= cast(lu_byte, ~(m)))[m
[31m-#define setbits(x,m)	((x) |= (m))[m
[31m-#define testbits(x,m)	((x) & (m))[m
[31m-#define bitmask(b)	(1<<(b))[m
[31m-#define bit2mask(b1,b2)	(bitmask(b1) | bitmask(b2))[m
[31m-#define l_setbit(x,b)	setbits(x, bitmask(b))[m
[31m-#define resetbit(x,b)	resetbits(x, bitmask(b))[m
[31m-#define testbit(x,b)	testbits(x, bitmask(b))[m
[31m-#define set2bits(x,b1,b2)	setbits(x, (bit2mask(b1, b2)))[m
[31m-#define reset2bits(x,b1,b2)	resetbits(x, (bit2mask(b1, b2)))[m
[31m-#define test2bits(x,b1,b2)	testbits(x, (bit2mask(b1, b2)))[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Layout for bit use in `marked' field:[m
[31m-** bit 0 - object is white (type 0)[m
[31m-** bit 1 - object is white (type 1)[m
[31m-** bit 2 - object is black[m
[31m-** bit 3 - for userdata: has been finalized[m
[31m-** bit 3 - for tables: has weak keys[m
[31m-** bit 4 - for tables: has weak values[m
[31m-** bit 5 - object is fixed (should not be collected)[m
[31m-** bit 6 - object is "super" fixed (only the main thread)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define WHITE0BIT	0[m
[31m-#define WHITE1BIT	1[m
[31m-#define BLACKBIT	2[m
[31m-#define FINALIZEDBIT	3[m
[31m-#define KEYWEAKBIT	3[m
[31m-#define VALUEWEAKBIT	4[m
[31m-#define FIXEDBIT	5[m
[31m-#define SFIXEDBIT	6[m
[31m-#define WHITEBITS	bit2mask(WHITE0BIT, WHITE1BIT)[m
[31m-[m
[31m-[m
[31m-#define iswhite(x)      test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)[m
[31m-#define isblack(x)      testbit((x)->gch.marked, BLACKBIT)[m
[31m-#define isgray(x)	(!isblack(x) && !iswhite(x))[m
[31m-[m
[31m-#define otherwhite(g)	(g->currentwhite ^ WHITEBITS)[m
[31m-#define isdead(g,v)	((v)->gch.marked & otherwhite(g) & WHITEBITS)[m
[31m-[m
[31m-#define changewhite(x)	((x)->gch.marked ^= WHITEBITS)[m
[31m-#define gray2black(x)	l_setbit((x)->gch.marked, BLACKBIT)[m
[31m-[m
[31m-#define valiswhite(x)	(iscollectable(x) && iswhite(gcvalue(x)))[m
[31m-[m
[31m-#define luaC_white(g)	cast(lu_byte, (g)->currentwhite & WHITEBITS)[m
[31m-[m
[31m-[m
[31m-#define luaC_checkGC(L) { \[m
[31m-  condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \[m
[31m-  if (G(L)->totalbytes >= G(L)->GCthreshold) \[m
[31m-	luaC_step(L); }[m
[31m-[m
[31m-[m
[31m-#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p)))  \[m
[31m-	luaC_barrierf(L,obj2gco(p),gcvalue(v)); }[m
[31m-[m
[31m-#define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t)))  \[m
[31m-	luaC_barrierback(L,t); }[m
[31m-[m
[31m-#define luaC_objbarrier(L,p,o)  \[m
[31m-	{ if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \[m
[31m-		luaC_barrierf(L,obj2gco(p),obj2gco(o)); }[m
[31m-[m
[31m-#define luaC_objbarriert(L,t,o)  \[m
[31m-   { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); }[m
[31m-[m
[31m-LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all);[m
[31m-LUAI_FUNC void luaC_callGCTM (lua_State *L);[m
[31m-LUAI_FUNC void luaC_freeall (lua_State *L);[m
[31m-LUAI_FUNC void luaC_step (lua_State *L);[m
[31m-LUAI_FUNC void luaC_fullgc (lua_State *L);[m
[31m-LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt);[m
[31m-LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv);[m
[31m-LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v);[m
[31m-LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/linit.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/linit.c[m
[1mdeleted file mode 100644[m
[1mindex c1f90df..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/linit.c[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-/*[m
[31m-** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Initialization of libraries for lua.c[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define linit_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lualib.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg lualibs[] = {[m
[31m-  {"", luaopen_base},[m
[31m-  {LUA_LOADLIBNAME, luaopen_package},[m
[31m-  {LUA_TABLIBNAME, luaopen_table},[m
[31m-  {LUA_IOLIBNAME, luaopen_io},[m
[31m-  {LUA_OSLIBNAME, luaopen_os},[m
[31m-  {LUA_STRLIBNAME, luaopen_string},[m
[31m-  {LUA_MATHLIBNAME, luaopen_math},[m
[31m-  {LUA_DBLIBNAME, luaopen_debug},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-LUALIB_API void luaL_openlibs (lua_State *L) {[m
[31m-  const luaL_Reg *lib = lualibs;[m
[31m-  for (; lib->func; lib++) {[m
[31m-    lua_pushcfunction(L, lib->func);[m
[31m-    lua_pushstring(L, lib->name);[m
[31m-    lua_call(L, 1, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/liolib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/liolib.c[m
[1mdeleted file mode 100644[m
[1mindex 649f9a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/liolib.c[m
[1m+++ /dev/null[m
[36m@@ -1,556 +0,0 @@[m
[31m-/*[m
[31m-** $Id: liolib.c,v 2.73.1.4 2010/05/14 15:33:51 roberto Exp $[m
[31m-** Standard I/O (and system) library[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define liolib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define IO_INPUT	1[m
[31m-#define IO_OUTPUT	2[m
[31m-[m
[31m-[m
[31m-static const char *const fnames[] = {"input", "output"};[m
[31m-[m
[31m-[m
[31m-static int pushresult (lua_State *L, int i, const char *filename) {[m
[31m-  int en = errno;  /* calls to Lua API may change this value */[m
[31m-  if (i) {[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    if (filename)[m
[31m-      lua_pushfstring(L, "%s: %s", filename, strerror(en));[m
[31m-    else[m
[31m-      lua_pushfstring(L, "%s", strerror(en));[m
[31m-    lua_pushinteger(L, en);[m
[31m-    return 3;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void fileerror (lua_State *L, int arg, const char *filename) {[m
[31m-  lua_pushfstring(L, "%s: %s", filename, strerror(errno));[m
[31m-  luaL_argerror(L, arg, lua_tostring(L, -1));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define tofilep(L)	((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))[m
[31m-[m
[31m-[m
[31m-static int io_type (lua_State *L) {[m
[31m-  void *ud;[m
[31m-  luaL_checkany(L, 1);[m
[31m-  ud = lua_touserdata(L, 1);[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE);[m
[31m-  if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1))[m
[31m-    lua_pushnil(L);  /* not a file */[m
[31m-  else if (*((FILE **)ud) == NULL)[m
[31m-    lua_pushliteral(L, "closed file");[m
[31m-  else[m
[31m-    lua_pushliteral(L, "file");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static FILE *tofile (lua_State *L) {[m
[31m-  FILE **f = tofilep(L);[m
[31m-  if (*f == NULL)[m
[31m-    luaL_error(L, "attempt to use a closed file");[m
[31m-  return *f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** When creating file handles, always creates a `closed' file handle[m
[31m-** before opening the actual file; so, if there is a memory error, the[m
[31m-** file is not left opened.[m
[31m-*/[m
[31m-static FILE **newfile (lua_State *L) {[m
[31m-  FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *));[m
[31m-  *pf = NULL;  /* file handle is currently `closed' */[m
[31m-  luaL_getmetatable(L, LUA_FILEHANDLE);[m
[31m-  lua_setmetatable(L, -2);[m
[31m-  return pf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** function to (not) close the standard files stdin, stdout, and stderr[m
[31m-*/[m
[31m-static int io_noclose (lua_State *L) {[m
[31m-  lua_pushnil(L);[m
[31m-  lua_pushliteral(L, "cannot close standard file");[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** function to close 'popen' files[m
[31m-*/[m
[31m-static int io_pclose (lua_State *L) {[m
[31m-  FILE **p = tofilep(L);[m
[31m-  int ok = lua_pclose(L, *p);[m
[31m-  *p = NULL;[m
[31m-  return pushresult(L, ok, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** function to close regular files[m
[31m-*/[m
[31m-static int io_fclose (lua_State *L) {[m
[31m-  FILE **p = tofilep(L);[m
[31m-  int ok = (fclose(*p) == 0);[m
[31m-  *p = NULL;[m
[31m-  return pushresult(L, ok, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int aux_close (lua_State *L) {[m
[31m-  lua_getfenv(L, 1);[m
[31m-  lua_getfield(L, -1, "__close");[m
[31m-  return (lua_tocfunction(L, -1))(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_close (lua_State *L) {[m
[31m-  if (lua_isnone(L, 1))[m
[31m-    lua_rawgeti(L, LUA_ENVIRONINDEX, IO_OUTPUT);[m
[31m-  tofile(L);  /* make sure argument is a file */[m
[31m-  return aux_close(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_gc (lua_State *L) {[m
[31m-  FILE *f = *tofilep(L);[m
[31m-  /* ignore closed files */[m
[31m-  if (f != NULL)[m
[31m-    aux_close(L);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_tostring (lua_State *L) {[m
[31m-  FILE *f = *tofilep(L);[m
[31m-  if (f == NULL)[m
[31m-    lua_pushliteral(L, "file (closed)");[m
[31m-  else[m
[31m-    lua_pushfstring(L, "file (%p)", f);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_open (lua_State *L) {[m
[31m-  const char *filename = luaL_checkstring(L, 1);[m
[31m-  const char *mode = luaL_optstring(L, 2, "r");[m
[31m-  FILE **pf = newfile(L);[m
[31m-  *pf = fopen(filename, mode);[m
[31m-  return (*pf == NULL) ? pushresult(L, 0, filename) : 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** this function has a separated environment, which defines the[m
[31m-** correct __close for 'popen' files[m
[31m-*/[m
[31m-static int io_popen (lua_State *L) {[m
[31m-  const char *filename = luaL_checkstring(L, 1);[m
[31m-  const char *mode = luaL_optstring(L, 2, "r");[m
[31m-  FILE **pf = newfile(L);[m
[31m-  *pf = lua_popen(L, filename, mode);[m
[31m-  return (*pf == NULL) ? pushresult(L, 0, filename) : 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_tmpfile (lua_State *L) {[m
[31m-  FILE **pf = newfile(L);[m
[31m-  *pf = tmpfile();[m
[31m-  return (*pf == NULL) ? pushresult(L, 0, NULL) : 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static FILE *getiofile (lua_State *L, int findex) {[m
[31m-  FILE *f;[m
[31m-  lua_rawgeti(L, LUA_ENVIRONINDEX, findex);[m
[31m-  f = *(FILE **)lua_touserdata(L, -1);[m
[31m-  if (f == NULL)[m
[31m-    luaL_error(L, "standard %s file is closed", fnames[findex - 1]);[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int g_iofile (lua_State *L, int f, const char *mode) {[m
[31m-  if (!lua_isnoneornil(L, 1)) {[m
[31m-    const char *filename = lua_tostring(L, 1);[m
[31m-    if (filename) {[m
[31m-      FILE **pf = newfile(L);[m
[31m-      *pf = fopen(filename, mode);[m
[31m-      if (*pf == NULL)[m
[31m-        fileerror(L, 1, filename);[m
[31m-    }[m
[31m-    else {[m
[31m-      tofile(L);  /* check that it's a valid file handle */[m
[31m-      lua_pushvalue(L, 1);[m
[31m-    }[m
[31m-    lua_rawseti(L, LUA_ENVIRONINDEX, f);[m
[31m-  }[m
[31m-  /* return current value */[m
[31m-  lua_rawgeti(L, LUA_ENVIRONINDEX, f);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_input (lua_State *L) {[m
[31m-  return g_iofile(L, IO_INPUT, "r");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_output (lua_State *L) {[m
[31m-  return g_iofile(L, IO_OUTPUT, "w");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_readline (lua_State *L);[m
[31m-[m
[31m-[m
[31m-static void aux_lines (lua_State *L, int idx, int toclose) {[m
[31m-  lua_pushvalue(L, idx);[m
[31m-  lua_pushboolean(L, toclose);  /* close/not close file when finished */[m
[31m-  lua_pushcclosure(L, io_readline, 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_lines (lua_State *L) {[m
[31m-  tofile(L);  /* check that it's a valid file handle */[m
[31m-  aux_lines(L, 1, 0);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_lines (lua_State *L) {[m
[31m-  if (lua_isnoneornil(L, 1)) {  /* no arguments? */[m
[31m-    /* will iterate over default input */[m
[31m-    lua_rawgeti(L, LUA_ENVIRONINDEX, IO_INPUT);[m
[31m-    return f_lines(L);[m
[31m-  }[m
[31m-  else {[m
[31m-    const char *filename = luaL_checkstring(L, 1);[m
[31m-    FILE **pf = newfile(L);[m
[31m-    *pf = fopen(filename, "r");[m
[31m-    if (*pf == NULL)[m
[31m-      fileerror(L, 1, filename);[m
[31m-    aux_lines(L, lua_gettop(L), 1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** READ[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static int read_number (lua_State *L, FILE *f) {[m
[31m-  lua_Number d;[m
[31m-  if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) {[m
[31m-    lua_pushnumber(L, d);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushnil(L);  /* "result" to be removed */[m
[31m-    return 0;  /* read fails */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int test_eof (lua_State *L, FILE *f) {[m
[31m-  int c = getc(f);[m
[31m-  ungetc(c, f);[m
[31m-  lua_pushlstring(L, NULL, 0);[m
[31m-  return (c != EOF);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int read_line (lua_State *L, FILE *f) {[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (;;) {[m
[31m-    size_t l;[m
[31m-    char *p = luaL_prepbuffer(&b);[m
[31m-    if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) {  /* eof? */[m
[31m-      luaL_pushresult(&b);  /* close buffer */[m
[31m-      return (lua_objlen(L, -1) > 0);  /* check whether read something */[m
[31m-    }[m
[31m-    l = strlen(p);[m
[31m-    if (l == 0 || p[l-1] != '\n')[m
[31m-      luaL_addsize(&b, l);[m
[31m-    else {[m
[31m-      luaL_addsize(&b, l - 1);  /* do not include `eol' */[m
[31m-      luaL_pushresult(&b);  /* close buffer */[m
[31m-      return 1;  /* read at least an `eol' */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int read_chars (lua_State *L, FILE *f, size_t n) {[m
[31m-  size_t rlen;  /* how much to read */[m
[31m-  size_t nr;  /* number of chars actually read */[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  rlen = LUAL_BUFFERSIZE;  /* try to read that much each time */[m
[31m-  do {[m
[31m-    char *p = luaL_prepbuffer(&b);[m
[31m-    if (rlen > n) rlen = n;  /* cannot read more than asked */[m
[31m-    nr = fread(p, sizeof(char), rlen, f);[m
[31m-    luaL_addsize(&b, nr);[m
[31m-    n -= nr;  /* still have to read `n' chars */[m
[31m-  } while (n > 0 && nr == rlen);  /* until end of count or eof */[m
[31m-  luaL_pushresult(&b);  /* close buffer */[m
[31m-  return (n == 0 || lua_objlen(L, -1) > 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int g_read (lua_State *L, FILE *f, int first) {[m
[31m-  int nargs = lua_gettop(L) - 1;[m
[31m-  int success;[m
[31m-  int n;[m
[31m-  clearerr(f);[m
[31m-  if (nargs == 0) {  /* no arguments? */[m
[31m-    success = read_line(L, f);[m
[31m-    n = first+1;  /* to return 1 result */[m
[31m-  }[m
[31m-  else {  /* ensure stack space for all results and for auxlib's buffer */[m
[31m-    luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments");[m
[31m-    success = 1;[m
[31m-    for (n = first; nargs-- && success; n++) {[m
[31m-      if (lua_type(L, n) == LUA_TNUMBER) {[m
[31m-        size_t l = (size_t)lua_tointeger(L, n);[m
[31m-        success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l);[m
[31m-      }[m
[31m-      else {[m
[31m-        const char *p = lua_tostring(L, n);[m
[31m-        luaL_argcheck(L, p && p[0] == '*', n, "invalid option");[m
[31m-        switch (p[1]) {[m
[31m-          case 'n':  /* number */[m
[31m-            success = read_number(L, f);[m
[31m-            break;[m
[31m-          case 'l':  /* line */[m
[31m-            success = read_line(L, f);[m
[31m-            break;[m
[31m-          case 'a':  /* file */[m
[31m-            read_chars(L, f, ~((size_t)0));  /* read MAX_SIZE_T chars */[m
[31m-            success = 1; /* always success */[m
[31m-            break;[m
[31m-          default:[m
[31m-            return luaL_argerror(L, n, "invalid format");[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (ferror(f))[m
[31m-    return pushresult(L, 0, NULL);[m
[31m-  if (!success) {[m
[31m-    lua_pop(L, 1);  /* remove last result */[m
[31m-    lua_pushnil(L);  /* push nil instead */[m
[31m-  }[m
[31m-  return n - first;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_read (lua_State *L) {[m
[31m-  return g_read(L, getiofile(L, IO_INPUT), 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_read (lua_State *L) {[m
[31m-  return g_read(L, tofile(L), 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_readline (lua_State *L) {[m
[31m-  FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1));[m
[31m-  int sucess;[m
[31m-  if (f == NULL)  /* file is already closed? */[m
[31m-    luaL_error(L, "file is already closed");[m
[31m-  sucess = read_line(L, f);[m
[31m-  if (ferror(f))[m
[31m-    return luaL_error(L, "%s", strerror(errno));[m
[31m-  if (sucess) return 1;[m
[31m-  else {  /* EOF */[m
[31m-    if (lua_toboolean(L, lua_upvalueindex(2))) {  /* generator created file? */[m
[31m-      lua_settop(L, 0);[m
[31m-      lua_pushvalue(L, lua_upvalueindex(1));[m
[31m-      aux_close(L);  /* close it */[m
[31m-    }[m
[31m-    return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static int g_write (lua_State *L, FILE *f, int arg) {[m
[31m-  int nargs = lua_gettop(L) - 1;[m
[31m-  int status = 1;[m
[31m-  for (; nargs--; arg++) {[m
[31m-    if (lua_type(L, arg) == LUA_TNUMBER) {[m
[31m-      /* optimization: could be done exactly as for strings */[m
[31m-      status = status &&[m
[31m-          fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0;[m
[31m-    }[m
[31m-    else {[m
[31m-      size_t l;[m
[31m-      const char *s = luaL_checklstring(L, arg, &l);[m
[31m-      status = status && (fwrite(s, sizeof(char), l, f) == l);[m
[31m-    }[m
[31m-  }[m
[31m-  return pushresult(L, status, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int io_write (lua_State *L) {[m
[31m-  return g_write(L, getiofile(L, IO_OUTPUT), 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_write (lua_State *L) {[m
[31m-  return g_write(L, tofile(L), 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_seek (lua_State *L) {[m
[31m-  static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END};[m
[31m-  static const char *const modenames[] = {"set", "cur", "end", NULL};[m
[31m-  FILE *f = tofile(L);[m
[31m-  int op = luaL_checkoption(L, 2, "cur", modenames);[m
[31m-  long offset = luaL_optlong(L, 3, 0);[m
[31m-  op = fseek(f, offset, mode[op]);[m
[31m-  if (op)[m
[31m-    return pushresult(L, 0, NULL);  /* error */[m
[31m-  else {[m
[31m-    lua_pushinteger(L, ftell(f));[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_setvbuf (lua_State *L) {[m
[31m-  static const int mode[] = {_IONBF, _IOFBF, _IOLBF};[m
[31m-  static const char *const modenames[] = {"no", "full", "line", NULL};[m
[31m-  FILE *f = tofile(L);[m
[31m-  int op = luaL_checkoption(L, 2, NULL, modenames);[m
[31m-  lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE);[m
[31m-  int res = setvbuf(f, NULL, mode[op], sz);[m
[31m-  return pushresult(L, res == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int io_flush (lua_State *L) {[m
[31m-  return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int f_flush (lua_State *L) {[m
[31m-  return pushresult(L, fflush(tofile(L)) == 0, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg iolib[] = {[m
[31m-  {"close", io_close},[m
[31m-  {"flush", io_flush},[m
[31m-  {"input", io_input},[m
[31m-  {"lines", io_lines},[m
[31m-  {"open", io_open},[m
[31m-  {"output", io_output},[m
[31m-  {"popen", io_popen},[m
[31m-  {"read", io_read},[m
[31m-  {"tmpfile", io_tmpfile},[m
[31m-  {"type", io_type},[m
[31m-  {"write", io_write},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg flib[] = {[m
[31m-  {"close", io_close},[m
[31m-  {"flush", f_flush},[m
[31m-  {"lines", f_lines},[m
[31m-  {"read", f_read},[m
[31m-  {"seek", f_seek},[m
[31m-  {"setvbuf", f_setvbuf},[m
[31m-  {"write", f_write},[m
[31m-  {"__gc", io_gc},[m
[31m-  {"__tostring", io_tostring},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void createmeta (lua_State *L) {[m
[31m-  luaL_newmetatable(L, LUA_FILEHANDLE);  /* create metatable for file handles */[m
[31m-  lua_pushvalue(L, -1);  /* push metatable */[m
[31m-  lua_setfield(L, -2, "__index");  /* metatable.__index = metatable */[m
[31m-  luaL_register(L, NULL, flib);  /* file methods */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) {[m
[31m-  *newfile(L) = f;[m
[31m-  if (k > 0) {[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_rawseti(L, LUA_ENVIRONINDEX, k);[m
[31m-  }[m
[31m-  lua_pushvalue(L, -2);  /* copy environment */[m
[31m-  lua_setfenv(L, -2);  /* set it */[m
[31m-  lua_setfield(L, -3, fname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void newfenv (lua_State *L, lua_CFunction cls) {[m
[31m-  lua_createtable(L, 0, 1);[m
[31m-  lua_pushcfunction(L, cls);[m
[31m-  lua_setfield(L, -2, "__close");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_io (lua_State *L) {[m
[31m-  createmeta(L);[m
[31m-  /* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */[m
[31m-  newfenv(L, io_fclose);[m
[31m-  lua_replace(L, LUA_ENVIRONINDEX);[m
[31m-  /* open library */[m
[31m-  luaL_register(L, LUA_IOLIBNAME, iolib);[m
[31m-  /* create (and set) default files */[m
[31m-  newfenv(L, io_noclose);  /* close function for default files */[m
[31m-  createstdfile(L, stdin, IO_INPUT, "stdin");[m
[31m-  createstdfile(L, stdout, IO_OUTPUT, "stdout");[m
[31m-  createstdfile(L, stderr, 0, "stderr");[m
[31m-  lua_pop(L, 1);  /* pop environment for default files */[m
[31m-  lua_getfield(L, -1, "popen");[m
[31m-  newfenv(L, io_pclose);  /* create environment for 'popen' */[m
[31m-  lua_setfenv(L, -2);  /* set fenv for 'popen' */[m
[31m-  lua_pop(L, 1);  /* pop 'popen' */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llex.c[m
[1mdeleted file mode 100644[m
[1mindex 88c6790..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llex.c[m
[1m+++ /dev/null[m
[36m@@ -1,463 +0,0 @@[m
[31m-/*[m
[31m-** $Id: llex.c,v 2.20.1.2 2009/11/23 14:58:22 roberto Exp $[m
[31m-** Lexical Analyzer[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <locale.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define llex_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldo.h"[m
[31m-#include "llex.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lparser.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define next(ls) (ls->current = zgetc(ls->z))[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define currIsNewline(ls)	(ls->current == '\n' || ls->current == '\r')[m
[31m-[m
[31m-[m
[31m-/* ORDER RESERVED */[m
[31m-const char *const luaX_tokens [] = {[m
[31m-    "and", "break", "do", "else", "elseif",[m
[31m-    "end", "false", "for", "function", "if",[m
[31m-    "in", "local", "nil", "not", "or", "repeat",[m
[31m-    "return", "then", "true", "until", "while",[m
[31m-    "..", "...", "==", ">=", "<=", "~=",[m
[31m-    "<number>", "<name>", "<string>", "<eof>",[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define save_and_next(ls) (save(ls, ls->current), next(ls))[m
[31m-[m
[31m-[m
[31m-static void save (LexState *ls, int c) {[m
[31m-  Mbuffer *b = ls->buff;[m
[31m-  if (b->n + 1 > b->buffsize) {[m
[31m-    size_t newsize;[m
[31m-    if (b->buffsize >= MAX_SIZET/2)[m
[31m-      luaX_lexerror(ls, "lexical element too long", 0);[m
[31m-    newsize = b->buffsize * 2;[m
[31m-    luaZ_resizebuffer(ls->L, b, newsize);[m
[31m-  }[m
[31m-  b->buffer[b->n++] = cast(char, c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_init (lua_State *L) {[m
[31m-  int i;[m
[31m-  for (i=0; i<NUM_RESERVED; i++) {[m
[31m-    TString *ts = luaS_new(L, luaX_tokens[i]);[m
[31m-    luaS_fix(ts);  /* reserved words are never collected */[m
[31m-    lua_assert(strlen(luaX_tokens[i])+1 <= TOKEN_LEN);[m
[31m-    ts->tsv.reserved = cast_byte(i+1);  /* reserved word */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define MAXSRC          80[m
[31m-[m
[31m-[m
[31m-const char *luaX_token2str (LexState *ls, int token) {[m
[31m-  if (token < FIRST_RESERVED) {[m
[31m-    lua_assert(token == cast(unsigned char, token));[m
[31m-    return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) :[m
[31m-                              luaO_pushfstring(ls->L, "%c", token);[m
[31m-  }[m
[31m-  else[m
[31m-    return luaX_tokens[token-FIRST_RESERVED];[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *txtToken (LexState *ls, int token) {[m
[31m-  switch (token) {[m
[31m-    case TK_NAME:[m
[31m-    case TK_STRING:[m
[31m-    case TK_NUMBER:[m
[31m-      save(ls, '\0');[m
[31m-      return luaZ_buffer(ls->buff);[m
[31m-    default:[m
[31m-      return luaX_token2str(ls, token);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_lexerror (LexState *ls, const char *msg, int token) {[m
[31m-  char buff[MAXSRC];[m
[31m-  luaO_chunkid(buff, getstr(ls->source), MAXSRC);[m
[31m-  msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg);[m
[31m-  if (token)[m
[31m-    luaO_pushfstring(ls->L, "%s near " LUA_QS, msg, txtToken(ls, token));[m
[31m-  luaD_throw(ls->L, LUA_ERRSYNTAX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_syntaxerror (LexState *ls, const char *msg) {[m
[31m-  luaX_lexerror(ls, msg, ls->t.token);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TString *luaX_newstring (LexState *ls, const char *str, size_t l) {[m
[31m-  lua_State *L = ls->L;[m
[31m-  TString *ts = luaS_newlstr(L, str, l);[m
[31m-  TValue *o = luaH_setstr(L, ls->fs->h, ts);  /* entry for `str' */[m
[31m-  if (ttisnil(o)) {[m
[31m-    setbvalue(o, 1);  /* make sure `str' will not be collected */[m
[31m-    luaC_checkGC(L);[m
[31m-  }[m
[31m-  return ts;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void inclinenumber (LexState *ls) {[m
[31m-  int old = ls->current;[m
[31m-  lua_assert(currIsNewline(ls));[m
[31m-  next(ls);  /* skip `\n' or `\r' */[m
[31m-  if (currIsNewline(ls) && ls->current != old)[m
[31m-    next(ls);  /* skip `\n\r' or `\r\n' */[m
[31m-  if (++ls->linenumber >= MAX_INT)[m
[31m-    luaX_syntaxerror(ls, "chunk has too many lines");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) {[m
[31m-  ls->decpoint = '.';[m
[31m-  ls->L = L;[m
[31m-  ls->lookahead.token = TK_EOS;  /* no look-ahead token */[m
[31m-  ls->z = z;[m
[31m-  ls->fs = NULL;[m
[31m-  ls->linenumber = 1;[m
[31m-  ls->lastline = 1;[m
[31m-  ls->source = source;[m
[31m-  luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER);  /* initialize buffer */[m
[31m-  next(ls);  /* read first char */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** =======================================================[m
[31m-** LEXICAL ANALYZER[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int check_next (LexState *ls, const char *set) {[m
[31m-  if (!strchr(set, ls->current))[m
[31m-    return 0;[m
[31m-  save_and_next(ls);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void buffreplace (LexState *ls, char from, char to) {[m
[31m-  size_t n = luaZ_bufflen(ls->buff);[m
[31m-  char *p = luaZ_buffer(ls->buff);[m
[31m-  while (n--)[m
[31m-    if (p[n] == from) p[n] = to;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void trydecpoint (LexState *ls, SemInfo *seminfo) {[m
[31m-  /* format error: try to update decimal point separator */[m
[31m-  struct lconv *cv = localeconv();[m
[31m-  char old = ls->decpoint;[m
[31m-  ls->decpoint = (cv ? cv->decimal_point[0] : '.');[m
[31m-  buffreplace(ls, old, ls->decpoint);  /* try updated decimal separator */[m
[31m-  if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) {[m
[31m-    /* format error with correct decimal point: no more options */[m
[31m-    buffreplace(ls, ls->decpoint, '.');  /* undo change (for error message) */[m
[31m-    luaX_lexerror(ls, "malformed number", TK_NUMBER);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* LUA_NUMBER */[m
[31m-static void read_numeral (LexState *ls, SemInfo *seminfo) {[m
[31m-  lua_assert(isdigit(ls->current));[m
[31m-  do {[m
[31m-    save_and_next(ls);[m
[31m-  } while (isdigit(ls->current) || ls->current == '.');[m
[31m-  if (check_next(ls, "Ee"))  /* `E'? */[m
[31m-    check_next(ls, "+-");  /* optional exponent sign */[m
[31m-  while (isalnum(ls->current) || ls->current == '_')[m
[31m-    save_and_next(ls);[m
[31m-  save(ls, '\0');[m
[31m-  buffreplace(ls, '.', ls->decpoint);  /* follow locale for decimal point */[m
[31m-  if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r))  /* format error? */[m
[31m-    trydecpoint(ls, seminfo); /* try to update decimal point separator */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int skip_sep (LexState *ls) {[m
[31m-  int count = 0;[m
[31m-  int s = ls->current;[m
[31m-  lua_assert(s == '[' || s == ']');[m
[31m-  save_and_next(ls);[m
[31m-  while (ls->current == '=') {[m
[31m-    save_and_next(ls);[m
[31m-    count++;[m
[31m-  }[m
[31m-  return (ls->current == s) ? count : (-count) - 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {[m
[31m-  int cont = 0;[m
[31m-  (void)(cont);  /* avoid warnings when `cont' is not used */[m
[31m-  save_and_next(ls);  /* skip 2nd `[' */[m
[31m-  if (currIsNewline(ls))  /* string starts with a newline? */[m
[31m-    inclinenumber(ls);  /* skip it */[m
[31m-  for (;;) {[m
[31m-    switch (ls->current) {[m
[31m-      case EOZ:[m
[31m-        luaX_lexerror(ls, (seminfo) ? "unfinished long string" :[m
[31m-                                   "unfinished long comment", TK_EOS);[m
[31m-        break;  /* to avoid warnings */[m
[31m-#if defined(LUA_COMPAT_LSTR)[m
[31m-      case '[': {[m
[31m-        if (skip_sep(ls) == sep) {[m
[31m-          save_and_next(ls);  /* skip 2nd `[' */[m
[31m-          cont++;[m
[31m-#if LUA_COMPAT_LSTR == 1[m
[31m-          if (sep == 0)[m
[31m-            luaX_lexerror(ls, "nesting of [[...]] is deprecated", '[');[m
[31m-#endif[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-#endif[m
[31m-      case ']': {[m
[31m-        if (skip_sep(ls) == sep) {[m
[31m-          save_and_next(ls);  /* skip 2nd `]' */[m
[31m-#if defined(LUA_COMPAT_LSTR) && LUA_COMPAT_LSTR == 2[m
[31m-          cont--;[m
[31m-          if (sep == 0 && cont >= 0) break;[m
[31m-#endif[m
[31m-          goto endloop;[m
[31m-        }[m
[31m-        break;[m
[31m-      }[m
[31m-      case '\n':[m
[31m-      case '\r': {[m
[31m-        save(ls, '\n');[m
[31m-        inclinenumber(ls);[m
[31m-        if (!seminfo) luaZ_resetbuffer(ls->buff);  /* avoid wasting space */[m
[31m-        break;[m
[31m-      }[m
[31m-      default: {[m
[31m-        if (seminfo) save_and_next(ls);[m
[31m-        else next(ls);[m
[31m-      }[m
[31m-    }[m
[31m-  } endloop:[m
[31m-  if (seminfo)[m
[31m-    seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),[m
[31m-                                     luaZ_bufflen(ls->buff) - 2*(2 + sep));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void read_string (LexState *ls, int del, SemInfo *seminfo) {[m
[31m-  save_and_next(ls);[m
[31m-  while (ls->current != del) {[m
[31m-    switch (ls->current) {[m
[31m-      case EOZ:[m
[31m-        luaX_lexerror(ls, "unfinished string", TK_EOS);[m
[31m-        continue;  /* to avoid warnings */[m
[31m-      case '\n':[m
[31m-      case '\r':[m
[31m-        luaX_lexerror(ls, "unfinished string", TK_STRING);[m
[31m-        continue;  /* to avoid warnings */[m
[31m-      case '\\': {[m
[31m-        int c;[m
[31m-        next(ls);  /* do not save the `\' */[m
[31m-        switch (ls->current) {[m
[31m-          case 'a': c = '\a'; break;[m
[31m-          case 'b': c = '\b'; break;[m
[31m-          case 'f': c = '\f'; break;[m
[31m-          case 'n': c = '\n'; break;[m
[31m-          case 'r': c = '\r'; break;[m
[31m-          case 't': c = '\t'; break;[m
[31m-          case 'v': c = '\v'; break;[m
[31m-          case '\n':  /* go through */[m
[31m-          case '\r': save(ls, '\n'); inclinenumber(ls); continue;[m
[31m-          case EOZ: continue;  /* will raise an error next loop */[m
[31m-          default: {[m
[31m-            if (!isdigit(ls->current))[m
[31m-              save_and_next(ls);  /* handles \\, \", \', and \? */[m
[31m-            else {  /* \xxx */[m
[31m-              int i = 0;[m
[31m-              c = 0;[m
[31m-              do {[m
[31m-                c = 10*c + (ls->current-'0');[m
[31m-                next(ls);[m
[31m-              } while (++i<3 && isdigit(ls->current));[m
[31m-              if (c > UCHAR_MAX)[m
[31m-                luaX_lexerror(ls, "escape sequence too large", TK_STRING);[m
[31m-              save(ls, c);[m
[31m-            }[m
[31m-            continue;[m
[31m-          }[m
[31m-        }[m
[31m-        save(ls, c);[m
[31m-        next(ls);[m
[31m-        continue;[m
[31m-      }[m
[31m-      default:[m
[31m-        save_and_next(ls);[m
[31m-    }[m
[31m-  }[m
[31m-  save_and_next(ls);  /* skip delimiter */[m
[31m-  seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,[m
[31m-                                   luaZ_bufflen(ls->buff) - 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int llex (LexState *ls, SemInfo *seminfo) {[m
[31m-  luaZ_resetbuffer(ls->buff);[m
[31m-  for (;;) {[m
[31m-    switch (ls->current) {[m
[31m-      case '\n':[m
[31m-      case '\r': {[m
[31m-        inclinenumber(ls);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case '-': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '-') return '-';[m
[31m-        /* else is a comment */[m
[31m-        next(ls);[m
[31m-        if (ls->current == '[') {[m
[31m-          int sep = skip_sep(ls);[m
[31m-          luaZ_resetbuffer(ls->buff);  /* `skip_sep' may dirty the buffer */[m
[31m-          if (sep >= 0) {[m
[31m-            read_long_string(ls, NULL, sep);  /* long comment */[m
[31m-            luaZ_resetbuffer(ls->buff);[m
[31m-            continue;[m
[31m-          }[m
[31m-        }[m
[31m-        /* else short comment */[m
[31m-        while (!currIsNewline(ls) && ls->current != EOZ)[m
[31m-          next(ls);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case '[': {[m
[31m-        int sep = skip_sep(ls);[m
[31m-        if (sep >= 0) {[m
[31m-          read_long_string(ls, seminfo, sep);[m
[31m-          return TK_STRING;[m
[31m-        }[m
[31m-        else if (sep == -1) return '[';[m
[31m-        else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING);[m
[31m-      }[m
[31m-      case '=': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '=') return '=';[m
[31m-        else { next(ls); return TK_EQ; }[m
[31m-      }[m
[31m-      case '<': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '=') return '<';[m
[31m-        else { next(ls); return TK_LE; }[m
[31m-      }[m
[31m-      case '>': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '=') return '>';[m
[31m-        else { next(ls); return TK_GE; }[m
[31m-      }[m
[31m-      case '~': {[m
[31m-        next(ls);[m
[31m-        if (ls->current != '=') return '~';[m
[31m-        else { next(ls); return TK_NE; }[m
[31m-      }[m
[31m-      case '"':[m
[31m-      case '\'': {[m
[31m-        read_string(ls, ls->current, seminfo);[m
[31m-        return TK_STRING;[m
[31m-      }[m
[31m-      case '.': {[m
[31m-        save_and_next(ls);[m
[31m-        if (check_next(ls, ".")) {[m
[31m-          if (check_next(ls, "."))[m
[31m-            return TK_DOTS;   /* ... */[m
[31m-          else return TK_CONCAT;   /* .. */[m
[31m-        }[m
[31m-        else if (!isdigit(ls->current)) return '.';[m
[31m-        else {[m
[31m-          read_numeral(ls, seminfo);[m
[31m-          return TK_NUMBER;[m
[31m-        }[m
[31m-      }[m
[31m-      case EOZ: {[m
[31m-        return TK_EOS;[m
[31m-      }[m
[31m-      default: {[m
[31m-        if (isspace(ls->current)) {[m
[31m-          lua_assert(!currIsNewline(ls));[m
[31m-          next(ls);[m
[31m-          continue;[m
[31m-        }[m
[31m-        else if (isdigit(ls->current)) {[m
[31m-          read_numeral(ls, seminfo);[m
[31m-          return TK_NUMBER;[m
[31m-        }[m
[31m-        else if (isalpha(ls->current) || ls->current == '_') {[m
[31m-          /* identifier or reserved word */[m
[31m-          TString *ts;[m
[31m-          do {[m
[31m-            save_and_next(ls);[m
[31m-          } while (isalnum(ls->current) || ls->current == '_');[m
[31m-          ts = luaX_newstring(ls, luaZ_buffer(ls->buff),[m
[31m-                                  luaZ_bufflen(ls->buff));[m
[31m-          if (ts->tsv.reserved > 0)  /* reserved word? */[m
[31m-            return ts->tsv.reserved - 1 + FIRST_RESERVED;[m
[31m-          else {[m
[31m-            seminfo->ts = ts;[m
[31m-            return TK_NAME;[m
[31m-          }[m
[31m-        }[m
[31m-        else {[m
[31m-          int c = ls->current;[m
[31m-          next(ls);[m
[31m-          return c;  /* single-char tokens (+ - / ...) */[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_next (LexState *ls) {[m
[31m-  ls->lastline = ls->linenumber;[m
[31m-  if (ls->lookahead.token != TK_EOS) {  /* is there a look-ahead token? */[m
[31m-    ls->t = ls->lookahead;  /* use this one */[m
[31m-    ls->lookahead.token = TK_EOS;  /* and discharge it */[m
[31m-  }[m
[31m-  else[m
[31m-    ls->t.token = llex(ls, &ls->t.seminfo);  /* read next token */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaX_lookahead (LexState *ls) {[m
[31m-  lua_assert(ls->lookahead.token == TK_EOS);[m
[31m-  ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llex.h[m
[1mdeleted file mode 100644[m
[1mindex a9201ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llex.h[m
[1m+++ /dev/null[m
[36m@@ -1,81 +0,0 @@[m
[31m-/*[m
[31m-** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lexical Analyzer[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef llex_h[m
[31m-#define llex_h[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-#define FIRST_RESERVED	257[m
[31m-[m
[31m-/* maximum length of a reserved word */[m
[31m-#define TOKEN_LEN	(sizeof("function")/sizeof(char))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-* WARNING: if you change the order of this enumeration,[m
[31m-* grep "ORDER RESERVED"[m
[31m-*/[m
[31m-enum RESERVED {[m
[31m-  /* terminal symbols denoted by reserved words */[m
[31m-  TK_AND = FIRST_RESERVED, TK_BREAK,[m
[31m-  TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,[m
[31m-  TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,[m
[31m-  TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,[m
[31m-  /* other terminal symbols */[m
[31m-  TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER,[m
[31m-  TK_NAME, TK_STRING, TK_EOS[m
[31m-};[m
[31m-[m
[31m-/* number of reserved words */[m
[31m-#define NUM_RESERVED	(cast(int, TK_WHILE-FIRST_RESERVED+1))[m
[31m-[m
[31m-[m
[31m-/* array with token `names' */[m
[31m-LUAI_DATA const char *const luaX_tokens [];[m
[31m-[m
[31m-[m
[31m-typedef union {[m
[31m-  lua_Number r;[m
[31m-  TString *ts;[m
[31m-} SemInfo;  /* semantics information */[m
[31m-[m
[31m-[m
[31m-typedef struct Token {[m
[31m-  int token;[m
[31m-  SemInfo seminfo;[m
[31m-} Token;[m
[31m-[m
[31m-[m
[31m-typedef struct LexState {[m
[31m-  int current;  /* current character (charint) */[m
[31m-  int linenumber;  /* input line counter */[m
[31m-  int lastline;  /* line of last token `consumed' */[m
[31m-  Token t;  /* current token */[m
[31m-  Token lookahead;  /* look ahead token */[m
[31m-  struct FuncState *fs;  /* `FuncState' is private to the parser */[m
[31m-  struct lua_State *L;[m
[31m-  ZIO *z;  /* input stream */[m
[31m-  Mbuffer *buff;  /* buffer for tokens */[m
[31m-  TString *source;  /* current source name */[m
[31m-  char decpoint;  /* locale decimal point */[m
[31m-} LexState;[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC void luaX_init (lua_State *L);[m
[31m-LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z,[m
[31m-                              TString *source);[m
[31m-LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);[m
[31m-LUAI_FUNC void luaX_next (LexState *ls);[m
[31m-LUAI_FUNC void luaX_lookahead (LexState *ls);[m
[31m-LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token);[m
[31m-LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s);[m
[31m-LUAI_FUNC const char *luaX_token2str (LexState *ls, int token);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llimits.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llimits.h[m
[1mdeleted file mode 100644[m
[1mindex ca8dcb7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/llimits.h[m
[1m+++ /dev/null[m
[36m@@ -1,128 +0,0 @@[m
[31m-/*[m
[31m-** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Limits, basic types, and some other `installation-dependent' definitions[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef llimits_h[m
[31m-#define llimits_h[m
[31m-[m
[31m-[m
[31m-#include <limits.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-typedef LUAI_UINT32 lu_int32;[m
[31m-[m
[31m-typedef LUAI_UMEM lu_mem;[m
[31m-[m
[31m-typedef LUAI_MEM l_mem;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* chars used as small naturals (so that `char' is reserved for characters) */[m
[31m-typedef unsigned char lu_byte;[m
[31m-[m
[31m-[m
[31m-#define MAX_SIZET	((size_t)(~(size_t)0)-2)[m
[31m-[m
[31m-#define MAX_LUMEM	((lu_mem)(~(lu_mem)0)-2)[m
[31m-[m
[31m-[m
[31m-#define MAX_INT (INT_MAX-2)  /* maximum value of an int (-2 for safety) */[m
[31m-[m
[31m-/*[m
[31m-** conversion of pointer to integer[m
[31m-** this is for hashing only; there is no problem if the integer[m
[31m-** cannot hold the whole pointer value[m
[31m-*/[m
[31m-#define IntPoint(p)  ((unsigned int)(lu_mem)(p))[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* type to ensure maximum alignment */[m
[31m-typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;[m
[31m-[m
[31m-[m
[31m-/* result of a `usual argument conversion' over lua_Number */[m
[31m-typedef LUAI_UACNUMBER l_uacNumber;[m
[31m-[m
[31m-[m
[31m-/* internal assertions for in-house debugging */[m
[31m-#ifdef lua_assert[m
[31m-[m
[31m-#define check_exp(c,e)		(lua_assert(c), (e))[m
[31m-#define api_check(l,e)		lua_assert(e)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define lua_assert(c)		((void)0)[m
[31m-#define check_exp(c,e)		(e)[m
[31m-#define api_check		luai_apicheck[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef UNUSED[m
[31m-#define UNUSED(x)	((void)(x))	/* to avoid warnings */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef cast[m
[31m-#define cast(t, exp)	((t)(exp))[m
[31m-#endif[m
[31m-[m
[31m-#define cast_byte(i)	cast(lu_byte, (i))[m
[31m-#define cast_num(i)	cast(lua_Number, (i))[m
[31m-#define cast_int(i)	cast(int, (i))[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** type for virtual-machine instructions[m
[31m-** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)[m
[31m-*/[m
[31m-typedef lu_int32 Instruction;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* maximum stack for a Lua function */[m
[31m-#define MAXSTACK	250[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* minimum size for the string table (must be power of 2) */[m
[31m-#ifndef MINSTRTABSIZE[m
[31m-#define MINSTRTABSIZE	32[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* minimum size for string buffer */[m
[31m-#ifndef LUA_MINBUFFER[m
[31m-#define LUA_MINBUFFER	32[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef lua_lock[m
[31m-#define lua_lock(L)     ((void) 0) [m
[31m-#define lua_unlock(L)   ((void) 0)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef luai_threadyield[m
[31m-#define luai_threadyield(L)     {lua_unlock(L); lua_lock(L);}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** macro to control inclusion of some hard tests on stack reallocation[m
[31m-*/ [m
[31m-#ifndef HARDSTACKTESTS[m
[31m-#define condhardstacktests(x)	((void)0)[m
[31m-#else[m
[31m-#define condhardstacktests(x)	x[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmathlib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmathlib.c[m
[1mdeleted file mode 100644[m
[1mindex 441fbf7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmathlib.c[m
[1m+++ /dev/null[m
[36m@@ -1,263 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Standard mathematical library[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-#include <math.h>[m
[31m-[m
[31m-#define lmathlib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-#undef PI[m
[31m-#define PI (3.14159265358979323846)[m
[31m-#define RADIANS_PER_DEGREE (PI/180.0)[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int math_abs (lua_State *L) {[m
[31m-  lua_pushnumber(L, fabs(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_sin (lua_State *L) {[m
[31m-  lua_pushnumber(L, sin(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_sinh (lua_State *L) {[m
[31m-  lua_pushnumber(L, sinh(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_cos (lua_State *L) {[m
[31m-  lua_pushnumber(L, cos(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_cosh (lua_State *L) {[m
[31m-  lua_pushnumber(L, cosh(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_tan (lua_State *L) {[m
[31m-  lua_pushnumber(L, tan(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_tanh (lua_State *L) {[m
[31m-  lua_pushnumber(L, tanh(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_asin (lua_State *L) {[m
[31m-  lua_pushnumber(L, asin(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_acos (lua_State *L) {[m
[31m-  lua_pushnumber(L, acos(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_atan (lua_State *L) {[m
[31m-  lua_pushnumber(L, atan(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_atan2 (lua_State *L) {[m
[31m-  lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_ceil (lua_State *L) {[m
[31m-  lua_pushnumber(L, ceil(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_floor (lua_State *L) {[m
[31m-  lua_pushnumber(L, floor(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_fmod (lua_State *L) {[m
[31m-  lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_modf (lua_State *L) {[m
[31m-  double ip;[m
[31m-  double fp = modf(luaL_checknumber(L, 1), &ip);[m
[31m-  lua_pushnumber(L, ip);[m
[31m-  lua_pushnumber(L, fp);[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-static int math_sqrt (lua_State *L) {[m
[31m-  lua_pushnumber(L, sqrt(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_pow (lua_State *L) {[m
[31m-  lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_log (lua_State *L) {[m
[31m-  lua_pushnumber(L, log(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_log10 (lua_State *L) {[m
[31m-  lua_pushnumber(L, log10(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_exp (lua_State *L) {[m
[31m-  lua_pushnumber(L, exp(luaL_checknumber(L, 1)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_deg (lua_State *L) {[m
[31m-  lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_rad (lua_State *L) {[m
[31m-  lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int math_frexp (lua_State *L) {[m
[31m-  int e;[m
[31m-  lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e));[m
[31m-  lua_pushinteger(L, e);[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-static int math_ldexp (lua_State *L) {[m
[31m-  lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int math_min (lua_State *L) {[m
[31m-  int n = lua_gettop(L);  /* number of arguments */[m
[31m-  lua_Number dmin = luaL_checknumber(L, 1);[m
[31m-  int i;[m
[31m-  for (i=2; i<=n; i++) {[m
[31m-    lua_Number d = luaL_checknumber(L, i);[m
[31m-    if (d < dmin)[m
[31m-      dmin = d;[m
[31m-  }[m
[31m-  lua_pushnumber(L, dmin);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int math_max (lua_State *L) {[m
[31m-  int n = lua_gettop(L);  /* number of arguments */[m
[31m-  lua_Number dmax = luaL_checknumber(L, 1);[m
[31m-  int i;[m
[31m-  for (i=2; i<=n; i++) {[m
[31m-    lua_Number d = luaL_checknumber(L, i);[m
[31m-    if (d > dmax)[m
[31m-      dmax = d;[m
[31m-  }[m
[31m-  lua_pushnumber(L, dmax);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int math_random (lua_State *L) {[m
[31m-  /* the `%' avoids the (rare) case of r==1, and is needed also because on[m
[31m-     some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */[m
[31m-  lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX;[m
[31m-  switch (lua_gettop(L)) {  /* check number of arguments */[m
[31m-    case 0: {  /* no arguments */[m
[31m-      lua_pushnumber(L, r);  /* Number between 0 and 1 */[m
[31m-      break;[m
[31m-    }[m
[31m-    case 1: {  /* only upper limit */[m
[31m-      int u = luaL_checkint(L, 1);[m
[31m-      luaL_argcheck(L, 1<=u, 1, "interval is empty");[m
[31m-      lua_pushnumber(L, floor(r*u)+1);  /* int between 1 and `u' */[m
[31m-      break;[m
[31m-    }[m
[31m-    case 2: {  /* lower and upper limits */[m
[31m-      int l = luaL_checkint(L, 1);[m
[31m-      int u = luaL_checkint(L, 2);[m
[31m-      luaL_argcheck(L, l<=u, 2, "interval is empty");[m
[31m-      lua_pushnumber(L, floor(r*(u-l+1))+l);  /* int between `l' and `u' */[m
[31m-      break;[m
[31m-    }[m
[31m-    default: return luaL_error(L, "wrong number of arguments");[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int math_randomseed (lua_State *L) {[m
[31m-  srand(luaL_checkint(L, 1));[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg mathlib[] = {[m
[31m-  {"abs",   math_abs},[m
[31m-  {"acos",  math_acos},[m
[31m-  {"asin",  math_asin},[m
[31m-  {"atan2", math_atan2},[m
[31m-  {"atan",  math_atan},[m
[31m-  {"ceil",  math_ceil},[m
[31m-  {"cosh",   math_cosh},[m
[31m-  {"cos",   math_cos},[m
[31m-  {"deg",   math_deg},[m
[31m-  {"exp",   math_exp},[m
[31m-  {"floor", math_floor},[m
[31m-  {"fmod",   math_fmod},[m
[31m-  {"frexp", math_frexp},[m
[31m-  {"ldexp", math_ldexp},[m
[31m-  {"log10", math_log10},[m
[31m-  {"log",   math_log},[m
[31m-  {"max",   math_max},[m
[31m-  {"min",   math_min},[m
[31m-  {"modf",   math_modf},[m
[31m-  {"pow",   math_pow},[m
[31m-  {"rad",   math_rad},[m
[31m-  {"random",     math_random},[m
[31m-  {"randomseed", math_randomseed},[m
[31m-  {"sinh",   math_sinh},[m
[31m-  {"sin",   math_sin},[m
[31m-  {"sqrt",  math_sqrt},[m
[31m-  {"tanh",   math_tanh},[m
[31m-  {"tan",   math_tan},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Open math library[m
[31m-*/[m
[31m-LUALIB_API int luaopen_math (lua_State *L) {[m
[31m-  luaL_register(L, LUA_MATHLIBNAME, mathlib);[m
[31m-  lua_pushnumber(L, PI);[m
[31m-  lua_setfield(L, -2, "pi");[m
[31m-  lua_pushnumber(L, HUGE_VAL);[m
[31m-  lua_setfield(L, -2, "huge");[m
[31m-#if defined(LUA_COMPAT_MOD)[m
[31m-  lua_getfield(L, -1, "fmod");[m
[31m-  lua_setfield(L, -2, "mod");[m
[31m-#endif[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmem.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmem.c[m
[1mdeleted file mode 100644[m
[1mindex ae7d8c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmem.c[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Interface to Memory Manager[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define lmem_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** About the realloc function:[m
[31m-** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);[m
[31m-** (`osize' is the old size, `nsize' is the new size)[m
[31m-**[m
[31m-** Lua ensures that (ptr == NULL) iff (osize == 0).[m
[31m-**[m
[31m-** * frealloc(ud, NULL, 0, x) creates a new block of size `x'[m
[31m-**[m
[31m-** * frealloc(ud, p, x, 0) frees the block `p'[m
[31m-** (in this specific case, frealloc must return NULL).[m
[31m-** particularly, frealloc(ud, NULL, 0, 0) does nothing[m
[31m-** (which is equivalent to free(NULL) in ANSI C)[m
[31m-**[m
[31m-** frealloc returns NULL if it cannot create or reallocate the area[m
[31m-** (any reallocation to an equal or smaller size cannot fail!)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define MINSIZEARRAY	4[m
[31m-[m
[31m-[m
[31m-void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,[m
[31m-                     int limit, const char *errormsg) {[m
[31m-  void *newblock;[m
[31m-  int newsize;[m
[31m-  if (*size >= limit/2) {  /* cannot double it? */[m
[31m-    if (*size >= limit)  /* cannot grow even a little? */[m
[31m-      luaG_runerror(L, errormsg);[m
[31m-    newsize = limit;  /* still have at least one free place */[m
[31m-  }[m
[31m-  else {[m
[31m-    newsize = (*size)*2;[m
[31m-    if (newsize < MINSIZEARRAY)[m
[31m-      newsize = MINSIZEARRAY;  /* minimum size */[m
[31m-  }[m
[31m-  newblock = luaM_reallocv(L, block, *size, newsize, size_elems);[m
[31m-  *size = newsize;  /* update only when everything else is OK */[m
[31m-  return newblock;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *luaM_toobig (lua_State *L) {[m
[31m-  luaG_runerror(L, "memory allocation error: block too big");[m
[31m-  return NULL;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** generic allocation routine.[m
[31m-*/[m
[31m-void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {[m
[31m-  global_State *g = G(L);[m
[31m-  lua_assert((osize == 0) == (block == NULL));[m
[31m-  block = (*g->frealloc)(g->ud, block, osize, nsize);[m
[31m-  if (block == NULL && nsize > 0)[m
[31m-    luaD_throw(L, LUA_ERRMEM);[m
[31m-  lua_assert((nsize == 0) == (block == NULL));[m
[31m-  g->totalbytes = (g->totalbytes - osize) + nsize;[m
[31m-  return block;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmem.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmem.h[m
[1mdeleted file mode 100644[m
[1mindex 7c2dcb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lmem.h[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Interface to Memory Manager[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lmem_h[m
[31m-#define lmem_h[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#define MEMERRMSG	"not enough memory"[m
[31m-[m
[31m-[m
[31m-#define luaM_reallocv(L,b,on,n,e) \[m
[31m-	((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ?  /* +1 to avoid warnings */ \[m
[31m-		luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \[m
[31m-		luaM_toobig(L))[m
[31m-[m
[31m-#define luaM_freemem(L, b, s)	luaM_realloc_(L, (b), (s), 0)[m
[31m-#define luaM_free(L, b)		luaM_realloc_(L, (b), sizeof(*(b)), 0)[m
[31m-#define luaM_freearray(L, b, n, t)   luaM_reallocv(L, (b), n, 0, sizeof(t))[m
[31m-[m
[31m-#define luaM_malloc(L,t)	luaM_realloc_(L, NULL, 0, (t))[m
[31m-#define luaM_new(L,t)		cast(t *, luaM_malloc(L, sizeof(t)))[m
[31m-#define luaM_newvector(L,n,t) \[m
[31m-		cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))[m
[31m-[m
[31m-#define luaM_growvector(L,v,nelems,size,t,limit,e) \[m
[31m-          if ((nelems)+1 > (size)) \[m
[31m-            ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))[m
[31m-[m
[31m-#define luaM_reallocvector(L, v,oldn,n,t) \[m
[31m-   ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,[m
[31m-                                                          size_t size);[m
[31m-LUAI_FUNC void *luaM_toobig (lua_State *L);[m
[31m-LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,[m
[31m-                               size_t size_elem, int limit,[m
[31m-                               const char *errormsg);[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/loadlib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/loadlib.c[m
[1mdeleted file mode 100644[m
[1mindex 6158c53..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/loadlib.c[m
[1m+++ /dev/null[m
[36m@@ -1,666 +0,0 @@[m
[31m-/*[m
[31m-** $Id: loadlib.c,v 1.52.1.4 2009/09/09 13:17:16 roberto Exp $[m
[31m-** Dynamic library loader for Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-**[m
[31m-** This module contains an implementation of loadlib for Unix systems[m
[31m-** that have dlfcn, an implementation for Darwin (Mac OS X), an[m
[31m-** implementation for Windows, and a stub for other systems.[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#define loadlib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-/* prefix for open functions in C libraries */[m
[31m-#define LUA_POF		"luaopen_"[m
[31m-[m
[31m-/* separator for open functions in C libraries */[m
[31m-#define LUA_OFSEP	"_"[m
[31m-[m
[31m-[m
[31m-#define LIBPREFIX	"LOADLIB: "[m
[31m-[m
[31m-#define POF		LUA_POF[m
[31m-#define LIB_FAIL	"open"[m
[31m-[m
[31m-[m
[31m-/* error codes for ll_loadfunc */[m
[31m-#define ERRLIB		1[m
[31m-#define ERRFUNC		2[m
[31m-[m
[31m-#define setprogdir(L)		((void)0)[m
[31m-[m
[31m-[m
[31m-static void ll_unloadlib (void *lib);[m
[31m-static void *ll_load (lua_State *L, const char *path);[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym);[m
[31m-[m
[31m-[m
[31m-[m
[31m-#if defined(LUA_DL_DLOPEN)[m
[31m-/*[m
[31m-** {========================================================================[m
[31m-** This is an implementation of loadlib based on the dlfcn interface.[m
[31m-** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,[m
[31m-** NetBSD, AIX 4.2, HPUX 11, and  probably most other Unix flavors, at least[m
[31m-** as an emulation layer on top of native functions.[m
[31m-** =========================================================================[m
[31m-*/[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-static void ll_unloadlib (void *lib) {[m
[31m-  dlclose(lib);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *ll_load (lua_State *L, const char *path) {[m
[31m-  void *lib = dlopen(path, RTLD_NOW);[m
[31m-  if (lib == NULL) lua_pushstring(L, dlerror());[m
[31m-  return lib;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {[m
[31m-  lua_CFunction f = (lua_CFunction)dlsym(lib, sym);[m
[31m-  if (f == NULL) lua_pushstring(L, dlerror());[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-#elif defined(LUA_DL_DLL)[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** This is an implementation of loadlib for Windows using native functions.[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-#include <windows.h>[m
[31m-[m
[31m-[m
[31m-#undef setprogdir[m
[31m-[m
[31m-static void setprogdir (lua_State *L) {[m
[31m-  char buff[MAX_PATH + 1];[m
[31m-  char *lb;[m
[31m-  DWORD nsize = sizeof(buff)/sizeof(char);[m
[31m-  DWORD n = GetModuleFileNameA(NULL, buff, nsize);[m
[31m-  if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)[m
[31m-    luaL_error(L, "unable to get ModuleFileName");[m
[31m-  else {[m
[31m-    *lb = '\0';[m
[31m-    luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff);[m
[31m-    lua_remove(L, -2);  /* remove original string */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void pusherror (lua_State *L) {[m
[31m-  int error = GetLastError();[m
[31m-  char buffer[128];[m
[31m-  if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-      NULL, error, 0, buffer, sizeof(buffer), NULL))[m
[31m-    lua_pushstring(L, buffer);[m
[31m-  else[m
[31m-    lua_pushfstring(L, "system error %d\n", error);[m
[31m-}[m
[31m-[m
[31m-static void ll_unloadlib (void *lib) {[m
[31m-  FreeLibrary((HINSTANCE)lib);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *ll_load (lua_State *L, const char *path) {[m
[31m-  HINSTANCE lib = LoadLibraryA(path);[m
[31m-  if (lib == NULL) pusherror(L);[m
[31m-  return lib;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {[m
[31m-  lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym);[m
[31m-  if (f == NULL) pusherror(L);[m
[31m-  return f;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-#elif defined(LUA_DL_DYLD)[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Native Mac OS X / Darwin Implementation[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-#include <mach-o/dyld.h>[m
[31m-[m
[31m-[m
[31m-/* Mac appends a `_' before C function names */[m
[31m-#undef POF[m
[31m-#define POF	"_" LUA_POF[m
[31m-[m
[31m-[m
[31m-static void pusherror (lua_State *L) {[m
[31m-  const char *err_str;[m
[31m-  const char *err_file;[m
[31m-  NSLinkEditErrors err;[m
[31m-  int err_num;[m
[31m-  NSLinkEditError(&err, &err_num, &err_file, &err_str);[m
[31m-  lua_pushstring(L, err_str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *errorfromcode (NSObjectFileImageReturnCode ret) {[m
[31m-  switch (ret) {[m
[31m-    case NSObjectFileImageInappropriateFile:[m
[31m-      return "file is not a bundle";[m
[31m-    case NSObjectFileImageArch:[m
[31m-      return "library is for wrong CPU type";[m
[31m-    case NSObjectFileImageFormat:[m
[31m-      return "bad format";[m
[31m-    case NSObjectFileImageAccess:[m
[31m-      return "cannot access file";[m
[31m-    case NSObjectFileImageFailure:[m
[31m-    default:[m
[31m-      return "unable to load library";[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void ll_unloadlib (void *lib) {[m
[31m-  NSUnLinkModule((NSModule)lib, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *ll_load (lua_State *L, const char *path) {[m
[31m-  NSObjectFileImage img;[m
[31m-  NSObjectFileImageReturnCode ret;[m
[31m-  /* this would be a rare case, but prevents crashing if it happens */[m
[31m-  if(!_dyld_present()) {[m
[31m-    lua_pushliteral(L, "dyld not present");[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  ret = NSCreateObjectFileImageFromFile(path, &img);[m
[31m-  if (ret == NSObjectFileImageSuccess) {[m
[31m-    NSModule mod = NSLinkModule(img, path, NSLINKMODULE_OPTION_PRIVATE |[m
[31m-                       NSLINKMODULE_OPTION_RETURN_ON_ERROR);[m
[31m-    NSDestroyObjectFileImage(img);[m
[31m-    if (mod == NULL) pusherror(L);[m
[31m-    return mod;[m
[31m-  }[m
[31m-  lua_pushstring(L, errorfromcode(ret));[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {[m
[31m-  NSSymbol nss = NSLookupSymbolInModule((NSModule)lib, sym);[m
[31m-  if (nss == NULL) {[m
[31m-    lua_pushfstring(L, "symbol " LUA_QS " not found", sym);[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  return (lua_CFunction)NSAddressOfSymbol(nss);[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Fallback for other systems[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-#undef LIB_FAIL[m
[31m-#define LIB_FAIL	"absent"[m
[31m-[m
[31m-[m
[31m-#define DLMSG	"dynamic libraries not enabled; check your Lua installation"[m
[31m-[m
[31m-[m
[31m-static void ll_unloadlib (void *lib) {[m
[31m-  (void)lib;  /* to avoid warnings */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *ll_load (lua_State *L, const char *path) {[m
[31m-  (void)path;  /* to avoid warnings */[m
[31m-  lua_pushliteral(L, DLMSG);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {[m
[31m-  (void)lib; (void)sym;  /* to avoid warnings */[m
[31m-  lua_pushliteral(L, DLMSG);[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void **ll_register (lua_State *L, const char *path) {[m
[31m-  void **plib;[m
[31m-  lua_pushfstring(L, "%s%s", LIBPREFIX, path);[m
[31m-  lua_gettable(L, LUA_REGISTRYINDEX);  /* check library in registry? */[m
[31m-  if (!lua_isnil(L, -1))  /* is there an entry? */[m
[31m-    plib = (void **)lua_touserdata(L, -1);[m
[31m-  else {  /* no entry yet; create one */[m
[31m-    lua_pop(L, 1);[m
[31m-    plib = (void **)lua_newuserdata(L, sizeof(const void *));[m
[31m-    *plib = NULL;[m
[31m-    luaL_getmetatable(L, "_LOADLIB");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-    lua_pushfstring(L, "%s%s", LIBPREFIX, path);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    lua_settable(L, LUA_REGISTRYINDEX);[m
[31m-  }[m
[31m-  return plib;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** __gc tag method: calls library's `ll_unloadlib' function with the lib[m
[31m-** handle[m
[31m-*/[m
[31m-static int gctm (lua_State *L) {[m
[31m-  void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB");[m
[31m-  if (*lib) ll_unloadlib(*lib);[m
[31m-  *lib = NULL;  /* mark library as closed */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ll_loadfunc (lua_State *L, const char *path, const char *sym) {[m
[31m-  void **reg = ll_register(L, path);[m
[31m-  if (*reg == NULL) *reg = ll_load(L, path);[m
[31m-  if (*reg == NULL)[m
[31m-    return ERRLIB;  /* unable to load library */[m
[31m-  else {[m
[31m-    lua_CFunction f = ll_sym(L, *reg, sym);[m
[31m-    if (f == NULL)[m
[31m-      return ERRFUNC;  /* unable to find function */[m
[31m-    lua_pushcfunction(L, f);[m
[31m-    return 0;  /* return function */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ll_loadlib (lua_State *L) {[m
[31m-  const char *path = luaL_checkstring(L, 1);[m
[31m-  const char *init = luaL_checkstring(L, 2);[m
[31m-  int stat = ll_loadfunc(L, path, init);[m
[31m-  if (stat == 0)  /* no errors? */[m
[31m-    return 1;  /* return the loaded function */[m
[31m-  else {  /* error; error message is on stack top */[m
[31m-    lua_pushnil(L);[m
[31m-    lua_insert(L, -2);[m
[31m-    lua_pushstring(L, (stat == ERRLIB) ?  LIB_FAIL : "init");[m
[31m-    return 3;  /* return nil, error message, and where */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** 'require' function[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static int readable (const char *filename) {[m
[31m-  FILE *f = fopen(filename, "r");  /* try to open file */[m
[31m-  if (f == NULL) return 0;  /* open failed */[m
[31m-  fclose(f);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *pushnexttemplate (lua_State *L, const char *path) {[m
[31m-  const char *l;[m
[31m-  while (*path == *LUA_PATHSEP) path++;  /* skip separators */[m
[31m-  if (*path == '\0') return NULL;  /* no more templates */[m
[31m-  l = strchr(path, *LUA_PATHSEP);  /* find next separator */[m
[31m-  if (l == NULL) l = path + strlen(path);[m
[31m-  lua_pushlstring(L, path, l - path);  /* template */[m
[31m-  return l;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *findfile (lua_State *L, const char *name,[m
[31m-                                           const char *pname) {[m
[31m-  const char *path;[m
[31m-  name = luaL_gsub(L, name, ".", LUA_DIRSEP);[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, pname);[m
[31m-  path = lua_tostring(L, -1);[m
[31m-  if (path == NULL)[m
[31m-    luaL_error(L, LUA_QL("package.%s") " must be a string", pname);[m
[31m-  lua_pushliteral(L, "");  /* error accumulator */[m
[31m-  while ((path = pushnexttemplate(L, path)) != NULL) {[m
[31m-    const char *filename;[m
[31m-    filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name);[m
[31m-    lua_remove(L, -2);  /* remove path template */[m
[31m-    if (readable(filename))  /* does file exist and is readable? */[m
[31m-      return filename;  /* return that file name */[m
[31m-    lua_pushfstring(L, "\n\tno file " LUA_QS, filename);[m
[31m-    lua_remove(L, -2);  /* remove file name */[m
[31m-    lua_concat(L, 2);  /* add entry to possible error message */[m
[31m-  }[m
[31m-  return NULL;  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void loaderror (lua_State *L, const char *filename) {[m
[31m-  luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s",[m
[31m-                lua_tostring(L, 1), filename, lua_tostring(L, -1));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loader_Lua (lua_State *L) {[m
[31m-  const char *filename;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  filename = findfile(L, name, "path");[m
[31m-  if (filename == NULL) return 1;  /* library not found in this path */[m
[31m-  if (luaL_loadfile(L, filename) != 0)[m
[31m-    loaderror(L, filename);[m
[31m-  return 1;  /* library loaded successfully */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *mkfuncname (lua_State *L, const char *modname) {[m
[31m-  const char *funcname;[m
[31m-  const char *mark = strchr(modname, *LUA_IGMARK);[m
[31m-  if (mark) modname = mark + 1;[m
[31m-  funcname = luaL_gsub(L, modname, ".", LUA_OFSEP);[m
[31m-  funcname = lua_pushfstring(L, POF"%s", funcname);[m
[31m-  lua_remove(L, -2);  /* remove 'gsub' result */[m
[31m-  return funcname;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loader_C (lua_State *L) {[m
[31m-  const char *funcname;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  const char *filename = findfile(L, name, "cpath");[m
[31m-  if (filename == NULL) return 1;  /* library not found in this path */[m
[31m-  funcname = mkfuncname(L, name);[m
[31m-  if (ll_loadfunc(L, filename, funcname) != 0)[m
[31m-    loaderror(L, filename);[m
[31m-  return 1;  /* library loaded successfully */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loader_Croot (lua_State *L) {[m
[31m-  const char *funcname;[m
[31m-  const char *filename;[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  const char *p = strchr(name, '.');[m
[31m-  int stat;[m
[31m-  if (p == NULL) return 0;  /* is root */[m
[31m-  lua_pushlstring(L, name, p - name);[m
[31m-  filename = findfile(L, lua_tostring(L, -1), "cpath");[m
[31m-  if (filename == NULL) return 1;  /* root not found */[m
[31m-  funcname = mkfuncname(L, name);[m
[31m-  if ((stat = ll_loadfunc(L, filename, funcname)) != 0) {[m
[31m-    if (stat != ERRFUNC) loaderror(L, filename);  /* real error */[m
[31m-    lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS,[m
[31m-                       name, filename);[m
[31m-    return 1;  /* function not found */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loader_preload (lua_State *L) {[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, "preload");[m
[31m-  if (!lua_istable(L, -1))[m
[31m-    luaL_error(L, LUA_QL("package.preload") " must be a table");[m
[31m-  lua_getfield(L, -1, name);[m
[31m-  if (lua_isnil(L, -1))  /* not found? */[m
[31m-    lua_pushfstring(L, "\n\tno field package.preload['%s']", name);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const int sentinel_ = 0;[m
[31m-#define sentinel	((void *)&sentinel_)[m
[31m-[m
[31m-[m
[31m-static int ll_require (lua_State *L) {[m
[31m-  const char *name = luaL_checkstring(L, 1);[m
[31m-  int i;[m
[31m-  lua_settop(L, 1);  /* _LOADED table will be at index 2 */[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, 2, name);[m
[31m-  if (lua_toboolean(L, -1)) {  /* is it there? */[m
[31m-    if (lua_touserdata(L, -1) == sentinel)  /* check loops */[m
[31m-      luaL_error(L, "loop or previous error loading module " LUA_QS, name);[m
[31m-    return 1;  /* package is already loaded */[m
[31m-  }[m
[31m-  /* else must load it; iterate over available loaders */[m
[31m-  lua_getfield(L, LUA_ENVIRONINDEX, "loaders");[m
[31m-  if (!lua_istable(L, -1))[m
[31m-    luaL_error(L, LUA_QL("package.loaders") " must be a table");[m
[31m-  lua_pushliteral(L, "");  /* error message accumulator */[m
[31m-  for (i=1; ; i++) {[m
[31m-    lua_rawgeti(L, -2, i);  /* get a loader */[m
[31m-    if (lua_isnil(L, -1))[m
[31m-      luaL_error(L, "module " LUA_QS " not found:%s",[m
[31m-                    name, lua_tostring(L, -2));[m
[31m-    lua_pushstring(L, name);[m
[31m-    lua_call(L, 1, 1);  /* call it */[m
[31m-    if (lua_isfunction(L, -1))  /* did it find module? */[m
[31m-      break;  /* module loaded successfully */[m
[31m-    else if (lua_isstring(L, -1))  /* loader returned error message? */[m
[31m-      lua_concat(L, 2);  /* accumulate it */[m
[31m-    else[m
[31m-      lua_pop(L, 1);[m
[31m-  }[m
[31m-  lua_pushlightuserdata(L, sentinel);[m
[31m-  lua_setfield(L, 2, name);  /* _LOADED[name] = sentinel */[m
[31m-  lua_pushstring(L, name);  /* pass name as argument to module */[m
[31m-  lua_call(L, 1, 1);  /* run loaded module */[m
[31m-  if (!lua_isnil(L, -1))  /* non-nil return? */[m
[31m-    lua_setfield(L, 2, name);  /* _LOADED[name] = returned value */[m
[31m-  lua_getfield(L, 2, name);[m
[31m-  if (lua_touserdata(L, -1) == sentinel) {   /* module did not set a value? */[m
[31m-    lua_pushboolean(L, 1);  /* use true as result */[m
[31m-    lua_pushvalue(L, -1);  /* extra copy to be returned */[m
[31m-    lua_setfield(L, 2, name);  /* _LOADED[name] = true */[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** 'module' function[m
[31m-** =======================================================[m
[31m-*/[m
[31m-  [m
[31m-[m
[31m-static void setfenv (lua_State *L) {[m
[31m-  lua_Debug ar;[m
[31m-  if (lua_getstack(L, 1, &ar) == 0 ||[m
[31m-      lua_getinfo(L, "f", &ar) == 0 ||  /* get calling function */[m
[31m-      lua_iscfunction(L, -1))[m
[31m-    luaL_error(L, LUA_QL("module") " not called from a Lua function");[m
[31m-  lua_pushvalue(L, -2);[m
[31m-  lua_setfenv(L, -2);[m
[31m-  lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void dooptions (lua_State *L, int n) {[m
[31m-  int i;[m
[31m-  for (i = 2; i <= n; i++) {[m
[31m-    lua_pushvalue(L, i);  /* get option (a function) */[m
[31m-    lua_pushvalue(L, -2);  /* module */[m
[31m-    lua_call(L, 1, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void modinit (lua_State *L, const char *modname) {[m
[31m-  const char *dot;[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_setfield(L, -2, "_M");  /* module._M = module */[m
[31m-  lua_pushstring(L, modname);[m
[31m-  lua_setfield(L, -2, "_NAME");[m
[31m-  dot = strrchr(modname, '.');  /* look for last dot in module name */[m
[31m-  if (dot == NULL) dot = modname;[m
[31m-  else dot++;[m
[31m-  /* set _PACKAGE as package name (full module name minus last part) */[m
[31m-  lua_pushlstring(L, modname, dot - modname);[m
[31m-  lua_setfield(L, -2, "_PACKAGE");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ll_module (lua_State *L) {[m
[31m-  const char *modname = luaL_checkstring(L, 1);[m
[31m-  int loaded = lua_gettop(L) + 1;  /* index of _LOADED table */[m
[31m-  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");[m
[31m-  lua_getfield(L, loaded, modname);  /* get _LOADED[modname] */[m
[31m-  if (!lua_istable(L, -1)) {  /* not found? */[m
[31m-    lua_pop(L, 1);  /* remove previous result */[m
[31m-    /* try global variable (and create one if it does not exist) */[m
[31m-    if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL)[m
[31m-      return luaL_error(L, "name conflict for module " LUA_QS, modname);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, loaded, modname);  /* _LOADED[modname] = new table */[m
[31m-  }[m
[31m-  /* check whether table already has a _NAME field */[m
[31m-  lua_getfield(L, -1, "_NAME");[m
[31m-  if (!lua_isnil(L, -1))  /* is table an initialized module? */[m
[31m-    lua_pop(L, 1);[m
[31m-  else {  /* no; initialize it */[m
[31m-    lua_pop(L, 1);[m
[31m-    modinit(L, modname);[m
[31m-  }[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  setfenv(L);[m
[31m-  dooptions(L, loaded - 1);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ll_seeall (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  if (!lua_getmetatable(L, 1)) {[m
[31m-    lua_createtable(L, 0, 1); /* create new metatable */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setmetatable(L, 1);[m
[31m-  }[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  lua_setfield(L, -2, "__index");  /* mt.__index = _G */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* auxiliary mark (for internal use) */[m
[31m-#define AUXMARK		"\1"[m
[31m-[m
[31m-static void setpath (lua_State *L, const char *fieldname, const char *envname,[m
[31m-                                   const char *def) {[m
[31m-  const char *path = getenv(envname);[m
[31m-  if (path == NULL)  /* no environment variable? */[m
[31m-    lua_pushstring(L, def);  /* use default */[m
[31m-  else {[m
[31m-    /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */[m
[31m-    path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP,[m
[31m-                              LUA_PATHSEP AUXMARK LUA_PATHSEP);[m
[31m-    luaL_gsub(L, path, AUXMARK, def);[m
[31m-    lua_remove(L, -2);[m
[31m-  }[m
[31m-  setprogdir(L);[m
[31m-  lua_setfield(L, -2, fieldname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg pk_funcs[] = {[m
[31m-  {"loadlib", ll_loadlib},[m
[31m-  {"seeall", ll_seeall},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg ll_funcs[] = {[m
[31m-  {"module", ll_module},[m
[31m-  {"require", ll_require},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static const lua_CFunction loaders[] =[m
[31m-  {loader_preload, loader_Lua, loader_C, loader_Croot, NULL};[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_package (lua_State *L) {[m
[31m-  int i;[m
[31m-  /* create new type _LOADLIB */[m
[31m-  luaL_newmetatable(L, "_LOADLIB");[m
[31m-  lua_pushcfunction(L, gctm);[m
[31m-  lua_setfield(L, -2, "__gc");[m
[31m-  /* create `package' table */[m
[31m-  luaL_register(L, LUA_LOADLIBNAME, pk_funcs);[m
[31m-#if defined(LUA_COMPAT_LOADLIB) [m
[31m-  lua_getfield(L, -1, "loadlib");[m
[31m-  lua_setfield(L, LUA_GLOBALSINDEX, "loadlib");[m
[31m-#endif[m
[31m-  lua_pushvalue(L, -1);[m
[31m-  lua_replace(L, LUA_ENVIRONINDEX);[m
[31m-  /* create `loaders' table */[m
[31m-  lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0);[m
[31m-  /* fill it with pre-defined loaders */[m
[31m-  for (i=0; loaders[i] != NULL; i++) {[m
[31m-    lua_pushcfunction(L, loaders[i]);[m
[31m-    lua_rawseti(L, -2, i+1);[m
[31m-  }[m
[31m-  lua_setfield(L, -2, "loaders");  /* put it in field `loaders' */[m
[31m-  setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT);  /* set field `path' */[m
[31m-  setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */[m
[31m-  /* store config information */[m
[31m-  lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n"[m
[31m-                     LUA_EXECDIR "\n" LUA_IGMARK);[m
[31m-  lua_setfield(L, -2, "config");[m
[31m-  /* set field `loaded' */[m
[31m-  luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2);[m
[31m-  lua_setfield(L, -2, "loaded");[m
[31m-  /* set field `preload' */[m
[31m-  lua_newtable(L);[m
[31m-  lua_setfield(L, -2, "preload");[m
[31m-  lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-  luaL_register(L, NULL, ll_funcs);  /* open lib into global table */[m
[31m-  lua_pop(L, 1);[m
[31m-  return 1;  /* return 'package' table */[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lobject.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lobject.c[m
[1mdeleted file mode 100644[m
[1mindex 4ff5073..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lobject.c[m
[1m+++ /dev/null[m
[36m@@ -1,214 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Some generic functions over Lua objects[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lobject_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldo.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "lvm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** converts an integer to a "floating point byte", represented as[m
[31m-** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if[m
[31m-** eeeee != 0 and (xxx) otherwise.[m
[31m-*/[m
[31m-int luaO_int2fb (unsigned int x) {[m
[31m-  int e = 0;  /* expoent */[m
[31m-  while (x >= 16) {[m
[31m-    x = (x+1) >> 1;[m
[31m-    e++;[m
[31m-  }[m
[31m-  if (x < 8) return x;[m
[31m-  else return ((e+1) << 3) | (cast_int(x) - 8);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* converts back */[m
[31m-int luaO_fb2int (int x) {[m
[31m-  int e = (x >> 3) & 31;[m
[31m-  if (e == 0) return x;[m
[31m-  else return ((x & 7)+8) << (e - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaO_log2 (unsigned int x) {[m
[31m-  static const lu_byte log_2[256] = {[m
[31m-    0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,[m
[31m-    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,[m
[31m-    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,[m
[31m-    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,[m
[31m-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,[m
[31m-    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8[m
[31m-  };[m
[31m-  int l = -1;[m
[31m-  while (x >= 256) { l += 8; x >>= 8; }[m
[31m-  return l + log_2[x];[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaO_rawequalObj (const TValue *t1, const TValue *t2) {[m
[31m-  if (ttype(t1) != ttype(t2)) return 0;[m
[31m-  else switch (ttype(t1)) {[m
[31m-    case LUA_TNIL:[m
[31m-      return 1;[m
[31m-    case LUA_TNUMBER:[m
[31m-      return luai_numeq(nvalue(t1), nvalue(t2));[m
[31m-    case LUA_TBOOLEAN:[m
[31m-      return bvalue(t1) == bvalue(t2);  /* boolean true must be 1 !! */[m
[31m-    case LUA_TLIGHTUSERDATA:[m
[31m-      return pvalue(t1) == pvalue(t2);[m
[31m-    default:[m
[31m-      lua_assert(iscollectable(t1));[m
[31m-      return gcvalue(t1) == gcvalue(t2);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaO_str2d (const char *s, lua_Number *result) {[m
[31m-  char *endptr;[m
[31m-  *result = lua_str2number(s, &endptr);[m
[31m-  if (endptr == s) return 0;  /* conversion failed */[m
[31m-  if (*endptr == 'x' || *endptr == 'X')  /* maybe an hexadecimal constant? */[m
[31m-    *result = cast_num(strtoul(s, &endptr, 16));[m
[31m-  if (*endptr == '\0') return 1;  /* most common case */[m
[31m-  while (isspace(cast(unsigned char, *endptr))) endptr++;[m
[31m-  if (*endptr != '\0') return 0;  /* invalid trailing characters? */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void pushstr (lua_State *L, const char *str) {[m
[31m-  setsvalue2s(L, L->top, luaS_new(L, str));[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this function handles only `%d', `%c', %f, %p, and `%s' formats */[m
[31m-const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {[m
[31m-  int n = 1;[m
[31m-  pushstr(L, "");[m
[31m-  for (;;) {[m
[31m-    const char *e = strchr(fmt, '%');[m
[31m-    if (e == NULL) break;[m
[31m-    setsvalue2s(L, L->top, luaS_newlstr(L, fmt, e-fmt));[m
[31m-    incr_top(L);[m
[31m-    switch (*(e+1)) {[m
[31m-      case 's': {[m
[31m-        const char *s = va_arg(argp, char *);[m
[31m-        if (s == NULL) s = "(null)";[m
[31m-        pushstr(L, s);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'c': {[m
[31m-        char buff[2];[m
[31m-        buff[0] = cast(char, va_arg(argp, int));[m
[31m-        buff[1] = '\0';[m
[31m-        pushstr(L, buff);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'd': {[m
[31m-        setnvalue(L->top, cast_num(va_arg(argp, int)));[m
[31m-        incr_top(L);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'f': {[m
[31m-        setnvalue(L->top, cast_num(va_arg(argp, l_uacNumber)));[m
[31m-        incr_top(L);[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'p': {[m
[31m-        char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */[m
[31m-        sprintf(buff, "%p", va_arg(argp, void *));[m
[31m-        pushstr(L, buff);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '%': {[m
[31m-        pushstr(L, "%");[m
[31m-        break;[m
[31m-      }[m
[31m-      default: {[m
[31m-        char buff[3];[m
[31m-        buff[0] = '%';[m
[31m-        buff[1] = *(e+1);[m
[31m-        buff[2] = '\0';[m
[31m-        pushstr(L, buff);[m
[31m-        break;[m
[31m-      }[m
[31m-    }[m
[31m-    n += 2;[m
[31m-    fmt = e+2;[m
[31m-  }[m
[31m-  pushstr(L, fmt);[m
[31m-  luaV_concat(L, n+1, cast_int(L->top - L->base) - 1);[m
[31m-  L->top -= n;[m
[31m-  return svalue(L->top - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {[m
[31m-  const char *msg;[m
[31m-  va_list argp;[m
[31m-  va_start(argp, fmt);[m
[31m-  msg = luaO_pushvfstring(L, fmt, argp);[m
[31m-  va_end(argp);[m
[31m-  return msg;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaO_chunkid (char *out, const char *source, size_t bufflen) {[m
[31m-  if (*source == '=') {[m
[31m-    strncpy(out, source+1, bufflen);  /* remove first char */[m
[31m-    out[bufflen-1] = '\0';  /* ensures null termination */[m
[31m-  }[m
[31m-  else {  /* out = "source", or "...source" */[m
[31m-    if (*source == '@') {[m
[31m-      size_t l;[m
[31m-      source++;  /* skip the `@' */[m
[31m-      bufflen -= sizeof(" '...' ");[m
[31m-      l = strlen(source);[m
[31m-      strcpy(out, "");[m
[31m-      if (l > bufflen) {[m
[31m-        source += (l-bufflen);  /* get last part of file name */[m
[31m-        strcat(out, "...");[m
[31m-      }[m
[31m-      strcat(out, source);[m
[31m-    }[m
[31m-    else {  /* out = [string "string"] */[m
[31m-      size_t len = strcspn(source, "\n\r");  /* stop at first newline */[m
[31m-      bufflen -= sizeof(" [string \"...\"] ");[m
[31m-      if (len > bufflen) len = bufflen;[m
[31m-      strcpy(out, "[string \"");[m
[31m-      if (source[len] != '\0') {  /* must truncate? */[m
[31m-        strncat(out, source, len);[m
[31m-        strcat(out, "...");[m
[31m-      }[m
[31m-      else[m
[31m-        strcat(out, source);[m
[31m-      strcat(out, "\"]");[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lobject.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lobject.h[m
[1mdeleted file mode 100644[m
[1mindex f1e447e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lobject.h[m
[1m+++ /dev/null[m
[36m@@ -1,381 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $[m
[31m-** Type definitions for Lua objects[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lobject_h[m
[31m-#define lobject_h[m
[31m-[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-/* tags for values visible from Lua */[m
[31m-#define LAST_TAG	LUA_TTHREAD[m
[31m-[m
[31m-#define NUM_TAGS	(LAST_TAG+1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Extra tags for non-values[m
[31m-*/[m
[31m-#define LUA_TPROTO	(LAST_TAG+1)[m
[31m-#define LUA_TUPVAL	(LAST_TAG+2)[m
[31m-#define LUA_TDEADKEY	(LAST_TAG+3)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Union of all collectable objects[m
[31m-*/[m
[31m-typedef union GCObject GCObject;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Common Header for all collectable objects (in macro form, to be[m
[31m-** included in other objects)[m
[31m-*/[m
[31m-#define CommonHeader	GCObject *next; lu_byte tt; lu_byte marked[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Common header in struct form[m
[31m-*/[m
[31m-typedef struct GCheader {[m
[31m-  CommonHeader;[m
[31m-} GCheader;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Union of all Lua values[m
[31m-*/[m
[31m-typedef union {[m
[31m-  GCObject *gc;[m
[31m-  void *p;[m
[31m-  lua_Number n;[m
[31m-  int b;[m
[31m-} Value;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Tagged Values[m
[31m-*/[m
[31m-[m
[31m-#define TValuefields	Value value; int tt[m
[31m-[m
[31m-typedef struct lua_TValue {[m
[31m-  TValuefields;[m
[31m-} TValue;[m
[31m-[m
[31m-[m
[31m-/* Macros to test type */[m
[31m-#define ttisnil(o)	(ttype(o) == LUA_TNIL)[m
[31m-#define ttisnumber(o)	(ttype(o) == LUA_TNUMBER)[m
[31m-#define ttisstring(o)	(ttype(o) == LUA_TSTRING)[m
[31m-#define ttistable(o)	(ttype(o) == LUA_TTABLE)[m
[31m-#define ttisfunction(o)	(ttype(o) == LUA_TFUNCTION)[m
[31m-#define ttisboolean(o)	(ttype(o) == LUA_TBOOLEAN)[m
[31m-#define ttisuserdata(o)	(ttype(o) == LUA_TUSERDATA)[m
[31m-#define ttisthread(o)	(ttype(o) == LUA_TTHREAD)[m
[31m-#define ttislightuserdata(o)	(ttype(o) == LUA_TLIGHTUSERDATA)[m
[31m-[m
[31m-/* Macros to access values */[m
[31m-#define ttype(o)	((o)->tt)[m
[31m-#define gcvalue(o)	check_exp(iscollectable(o), (o)->value.gc)[m
[31m-#define pvalue(o)	check_exp(ttislightuserdata(o), (o)->value.p)[m
[31m-#define nvalue(o)	check_exp(ttisnumber(o), (o)->value.n)[m
[31m-#define rawtsvalue(o)	check_exp(ttisstring(o), &(o)->value.gc->ts)[m
[31m-#define tsvalue(o)	(&rawtsvalue(o)->tsv)[m
[31m-#define rawuvalue(o)	check_exp(ttisuserdata(o), &(o)->value.gc->u)[m
[31m-#define uvalue(o)	(&rawuvalue(o)->uv)[m
[31m-#define clvalue(o)	check_exp(ttisfunction(o), &(o)->value.gc->cl)[m
[31m-#define hvalue(o)	check_exp(ttistable(o), &(o)->value.gc->h)[m
[31m-#define bvalue(o)	check_exp(ttisboolean(o), (o)->value.b)[m
[31m-#define thvalue(o)	check_exp(ttisthread(o), &(o)->value.gc->th)[m
[31m-[m
[31m-#define l_isfalse(o)	(ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))[m
[31m-[m
[31m-/*[m
[31m-** for internal debug only[m
[31m-*/[m
[31m-#define checkconsistency(obj) \[m
[31m-  lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt))[m
[31m-[m
[31m-#define checkliveness(g,obj) \[m
[31m-  lua_assert(!iscollectable(obj) || \[m
[31m-  ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc)))[m
[31m-[m
[31m-[m
[31m-/* Macros to set values */[m
[31m-#define setnilvalue(obj) ((obj)->tt=LUA_TNIL)[m
[31m-[m
[31m-#define setnvalue(obj,x) \[m
[31m-  { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; }[m
[31m-[m
[31m-#define setpvalue(obj,x) \[m
[31m-  { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; }[m
[31m-[m
[31m-#define setbvalue(obj,x) \[m
[31m-  { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; }[m
[31m-[m
[31m-#define setsvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define setuvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define setthvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define setclvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define sethvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-#define setptvalue(L,obj,x) \[m
[31m-  { TValue *i_o=(obj); \[m
[31m-    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \[m
[31m-    checkliveness(G(L),i_o); }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define setobj(L,obj1,obj2) \[m
[31m-  { const TValue *o2=(obj2); TValue *o1=(obj1); \[m
[31m-    o1->value = o2->value; o1->tt=o2->tt; \[m
[31m-    checkliveness(G(L),o1); }[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** different types of sets, according to destination[m
[31m-*/[m
[31m-[m
[31m-/* from stack to (same) stack */[m
[31m-#define setobjs2s	setobj[m
[31m-/* to stack (not from same stack) */[m
[31m-#define setobj2s	setobj[m
[31m-#define setsvalue2s	setsvalue[m
[31m-#define sethvalue2s	sethvalue[m
[31m-#define setptvalue2s	setptvalue[m
[31m-/* from table to same table */[m
[31m-#define setobjt2t	setobj[m
[31m-/* to table */[m
[31m-#define setobj2t	setobj[m
[31m-/* to new object */[m
[31m-#define setobj2n	setobj[m
[31m-#define setsvalue2n	setsvalue[m
[31m-[m
[31m-#define setttype(obj, tt) (ttype(obj) = (tt))[m
[31m-[m
[31m-[m
[31m-#define iscollectable(o)	(ttype(o) >= LUA_TSTRING)[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef TValue *StkId;  /* index to stack elements */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** String headers for string table[m
[31m-*/[m
[31m-typedef union TString {[m
[31m-  L_Umaxalign dummy;  /* ensures maximum alignment for strings */[m
[31m-  struct {[m
[31m-    CommonHeader;[m
[31m-    lu_byte reserved;[m
[31m-    unsigned int hash;[m
[31m-    size_t len;[m
[31m-  } tsv;[m
[31m-} TString;[m
[31m-[m
[31m-[m
[31m-#define getstr(ts)	cast(const char *, (ts) + 1)[m
[31m-#define svalue(o)       getstr(rawtsvalue(o))[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef union Udata {[m
[31m-  L_Umaxalign dummy;  /* ensures maximum alignment for `local' udata */[m
[31m-  struct {[m
[31m-    CommonHeader;[m
[31m-    struct Table *metatable;[m
[31m-    struct Table *env;[m
[31m-    size_t len;[m
[31m-  } uv;[m
[31m-} Udata;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Function Prototypes[m
[31m-*/[m
[31m-typedef struct Proto {[m
[31m-  CommonHeader;[m
[31m-  TValue *k;  /* constants used by the function */[m
[31m-  Instruction *code;[m
[31m-  struct Proto **p;  /* functions defined inside the function */[m
[31m-  int *lineinfo;  /* map from opcodes to source lines */[m
[31m-  struct LocVar *locvars;  /* information about local variables */[m
[31m-  TString **upvalues;  /* upvalue names */[m
[31m-  TString  *source;[m
[31m-  int sizeupvalues;[m
[31m-  int sizek;  /* size of `k' */[m
[31m-  int sizecode;[m
[31m-  int sizelineinfo;[m
[31m-  int sizep;  /* size of `p' */[m
[31m-  int sizelocvars;[m
[31m-  int linedefined;[m
[31m-  int lastlinedefined;[m
[31m-  GCObject *gclist;[m
[31m-  lu_byte nups;  /* number of upvalues */[m
[31m-  lu_byte numparams;[m
[31m-  lu_byte is_vararg;[m
[31m-  lu_byte maxstacksize;[m
[31m-} Proto;[m
[31m-[m
[31m-[m
[31m-/* masks for new-style vararg */[m
[31m-#define VARARG_HASARG		1[m
[31m-#define VARARG_ISVARARG		2[m
[31m-#define VARARG_NEEDSARG		4[m
[31m-[m
[31m-[m
[31m-typedef struct LocVar {[m
[31m-  TString *varname;[m
[31m-  int startpc;  /* first point where variable is active */[m
[31m-  int endpc;    /* first point where variable is dead */[m
[31m-} LocVar;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Upvalues[m
[31m-*/[m
[31m-[m
[31m-typedef struct UpVal {[m
[31m-  CommonHeader;[m
[31m-  TValue *v;  /* points to stack or to its own value */[m
[31m-  union {[m
[31m-    TValue value;  /* the value (when closed) */[m
[31m-    struct {  /* double linked list (when open) */[m
[31m-      struct UpVal *prev;[m
[31m-      struct UpVal *next;[m
[31m-    } l;[m
[31m-  } u;[m
[31m-} UpVal;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Closures[m
[31m-*/[m
[31m-[m
[31m-#define ClosureHeader \[m
[31m-	CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \[m
[31m-	struct Table *env[m
[31m-[m
[31m-typedef struct CClosure {[m
[31m-  ClosureHeader;[m
[31m-  lua_CFunction f;[m
[31m-  TValue upvalue[1];[m
[31m-} CClosure;[m
[31m-[m
[31m-[m
[31m-typedef struct LClosure {[m
[31m-  ClosureHeader;[m
[31m-  struct Proto *p;[m
[31m-  UpVal *upvals[1];[m
[31m-} LClosure;[m
[31m-[m
[31m-[m
[31m-typedef union Closure {[m
[31m-  CClosure c;[m
[31m-  LClosure l;[m
[31m-} Closure;[m
[31m-[m
[31m-[m
[31m-#define iscfunction(o)	(ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC)[m
[31m-#define isLfunction(o)	(ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Tables[m
[31m-*/[m
[31m-[m
[31m-typedef union TKey {[m
[31m-  struct {[m
[31m-    TValuefields;[m
[31m-    struct Node *next;  /* for chaining */[m
[31m-  } nk;[m
[31m-  TValue tvk;[m
[31m-} TKey;[m
[31m-[m
[31m-[m
[31m-typedef struct Node {[m
[31m-  TValue i_val;[m
[31m-  TKey i_key;[m
[31m-} Node;[m
[31m-[m
[31m-[m
[31m-typedef struct Table {[m
[31m-  CommonHeader;[m
[31m-  lu_byte flags;  /* 1<<p means tagmethod(p) is not present */ [m
[31m-  lu_byte lsizenode;  /* log2 of size of `node' array */[m
[31m-  struct Table *metatable;[m
[31m-  TValue *array;  /* array part */[m
[31m-  Node *node;[m
[31m-  Node *lastfree;  /* any free position is before this position */[m
[31m-  GCObject *gclist;[m
[31m-  int sizearray;  /* size of `array' array */[m
[31m-} Table;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `module' operation for hashing (size is always a power of 2)[m
[31m-*/[m
[31m-#define lmod(s,size) \[m
[31m-	(check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1)))))[m
[31m-[m
[31m-[m
[31m-#define twoto(x)	(1<<(x))[m
[31m-#define sizenode(t)	(twoto((t)->lsizenode))[m
[31m-[m
[31m-[m
[31m-#define luaO_nilobject		(&luaO_nilobject_)[m
[31m-[m
[31m-LUAI_DATA const TValue luaO_nilobject_;[m
[31m-[m
[31m-#define ceillog2(x)	(luaO_log2((x)-1) + 1)[m
[31m-[m
[31m-LUAI_FUNC int luaO_log2 (unsigned int x);[m
[31m-LUAI_FUNC int luaO_int2fb (unsigned int x);[m
[31m-LUAI_FUNC int luaO_fb2int (int x);[m
[31m-LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2);[m
[31m-LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result);[m
[31m-LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,[m
[31m-                                                       va_list argp);[m
[31m-LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);[m
[31m-LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len);[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lopcodes.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lopcodes.c[m
[1mdeleted file mode 100644[m
[1mindex 4cc7452..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lopcodes.c[m
[1m+++ /dev/null[m
[36m@@ -1,102 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lopcodes.c,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define lopcodes_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-[m
[31m-#include "lopcodes.h"[m
[31m-[m
[31m-[m
[31m-/* ORDER OP */[m
[31m-[m
[31m-const char *const luaP_opnames[NUM_OPCODES+1] = {[m
[31m-  "MOVE",[m
[31m-  "LOADK",[m
[31m-  "LOADBOOL",[m
[31m-  "LOADNIL",[m
[31m-  "GETUPVAL",[m
[31m-  "GETGLOBAL",[m
[31m-  "GETTABLE",[m
[31m-  "SETGLOBAL",[m
[31m-  "SETUPVAL",[m
[31m-  "SETTABLE",[m
[31m-  "NEWTABLE",[m
[31m-  "SELF",[m
[31m-  "ADD",[m
[31m-  "SUB",[m
[31m-  "MUL",[m
[31m-  "DIV",[m
[31m-  "MOD",[m
[31m-  "POW",[m
[31m-  "UNM",[m
[31m-  "NOT",[m
[31m-  "LEN",[m
[31m-  "CONCAT",[m
[31m-  "JMP",[m
[31m-  "EQ",[m
[31m-  "LT",[m
[31m-  "LE",[m
[31m-  "TEST",[m
[31m-  "TESTSET",[m
[31m-  "CALL",[m
[31m-  "TAILCALL",[m
[31m-  "RETURN",[m
[31m-  "FORLOOP",[m
[31m-  "FORPREP",[m
[31m-  "TFORLOOP",[m
[31m-  "SETLIST",[m
[31m-  "CLOSE",[m
[31m-  "CLOSURE",[m
[31m-  "VARARG",[m
[31m-  NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))[m
[31m-[m
[31m-const lu_byte luaP_opmodes[NUM_OPCODES] = {[m
[31m-/*       T  A    B       C     mode		   opcode	*/[m
[31m-  opmode(0, 1, OpArgR, OpArgN, iABC) 		/* OP_MOVE */[m
[31m- ,opmode(0, 1, OpArgK, OpArgN, iABx)		/* OP_LOADK */[m
[31m- ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_LOADBOOL */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_LOADNIL */[m
[31m- ,opmode(0, 1, OpArgU, OpArgN, iABC)		/* OP_GETUPVAL */[m
[31m- ,opmode(0, 1, OpArgK, OpArgN, iABx)		/* OP_GETGLOBAL */[m
[31m- ,opmode(0, 1, OpArgR, OpArgK, iABC)		/* OP_GETTABLE */[m
[31m- ,opmode(0, 0, OpArgK, OpArgN, iABx)		/* OP_SETGLOBAL */[m
[31m- ,opmode(0, 0, OpArgU, OpArgN, iABC)		/* OP_SETUPVAL */[m
[31m- ,opmode(0, 0, OpArgK, OpArgK, iABC)		/* OP_SETTABLE */[m
[31m- ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_NEWTABLE */[m
[31m- ,opmode(0, 1, OpArgR, OpArgK, iABC)		/* OP_SELF */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_ADD */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_SUB */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_MUL */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_DIV */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_MOD */[m
[31m- ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_POW */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_UNM */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_NOT */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_LEN */[m
[31m- ,opmode(0, 1, OpArgR, OpArgR, iABC)		/* OP_CONCAT */[m
[31m- ,opmode(0, 0, OpArgR, OpArgN, iAsBx)		/* OP_JMP */[m
[31m- ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_EQ */[m
[31m- ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_LT */[m
[31m- ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_LE */[m
[31m- ,opmode(1, 1, OpArgR, OpArgU, iABC)		/* OP_TEST */[m
[31m- ,opmode(1, 1, OpArgR, OpArgU, iABC)		/* OP_TESTSET */[m
[31m- ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_CALL */[m
[31m- ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_TAILCALL */[m
[31m- ,opmode(0, 0, OpArgU, OpArgN, iABC)		/* OP_RETURN */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iAsBx)		/* OP_FORLOOP */[m
[31m- ,opmode(0, 1, OpArgR, OpArgN, iAsBx)		/* OP_FORPREP */[m
[31m- ,opmode(1, 0, OpArgN, OpArgU, iABC)		/* OP_TFORLOOP */[m
[31m- ,opmode(0, 0, OpArgU, OpArgU, iABC)		/* OP_SETLIST */[m
[31m- ,opmode(0, 0, OpArgN, OpArgN, iABC)		/* OP_CLOSE */[m
[31m- ,opmode(0, 1, OpArgU, OpArgN, iABx)		/* OP_CLOSURE */[m
[31m- ,opmode(0, 1, OpArgU, OpArgN, iABC)		/* OP_VARARG */[m
[31m-};[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lopcodes.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lopcodes.h[m
[1mdeleted file mode 100644[m
[1mindex 41224d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lopcodes.h[m
[1m+++ /dev/null[m
[36m@@ -1,268 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lopcodes.h,v 1.125.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Opcodes for Lua virtual machine[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lopcodes_h[m
[31m-#define lopcodes_h[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-[m
[31m-[m
[31m-/*===========================================================================[m
[31m-  We assume that instructions are unsigned numbers.[m
[31m-  All instructions have an opcode in the first 6 bits.[m
[31m-  Instructions can have the following fields:[m
[31m-	`A' : 8 bits[m
[31m-	`B' : 9 bits[m
[31m-	`C' : 9 bits[m
[31m-	`Bx' : 18 bits (`B' and `C' together)[m
[31m-	`sBx' : signed Bx[m
[31m-[m
[31m-  A signed argument is represented in excess K; that is, the number[m
[31m-  value is the unsigned value minus K. K is exactly the maximum value[m
[31m-  for that argument (so that -max is represented by 0, and +max is[m
[31m-  represented by 2*max), which is half the maximum for the corresponding[m
[31m-  unsigned argument.[m
[31m-===========================================================================*/[m
[31m-[m
[31m-[m
[31m-enum OpMode {iABC, iABx, iAsBx};  /* basic instruction format */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** size and position of opcode arguments.[m
[31m-*/[m
[31m-#define SIZE_C		9[m
[31m-#define SIZE_B		9[m
[31m-#define SIZE_Bx		(SIZE_C + SIZE_B)[m
[31m-#define SIZE_A		8[m
[31m-[m
[31m-#define SIZE_OP		6[m
[31m-[m
[31m-#define POS_OP		0[m
[31m-#define POS_A		(POS_OP + SIZE_OP)[m
[31m-#define POS_C		(POS_A + SIZE_A)[m
[31m-#define POS_B		(POS_C + SIZE_C)[m
[31m-#define POS_Bx		POS_C[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** limits for opcode arguments.[m
[31m-** we use (signed) int to manipulate most arguments,[m
[31m-** so they must fit in LUAI_BITSINT-1 bits (-1 for sign)[m
[31m-*/[m
[31m-#if SIZE_Bx < LUAI_BITSINT-1[m
[31m-#define MAXARG_Bx        ((1<<SIZE_Bx)-1)[m
[31m-#define MAXARG_sBx        (MAXARG_Bx>>1)         /* `sBx' is signed */[m
[31m-#else[m
[31m-#define MAXARG_Bx        MAX_INT[m
[31m-#define MAXARG_sBx        MAX_INT[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define MAXARG_A        ((1<<SIZE_A)-1)[m
[31m-#define MAXARG_B        ((1<<SIZE_B)-1)[m
[31m-#define MAXARG_C        ((1<<SIZE_C)-1)[m
[31m-[m
[31m-[m
[31m-/* creates a mask with `n' 1 bits at position `p' */[m
[31m-#define MASK1(n,p)	((~((~(Instruction)0)<<n))<<p)[m
[31m-[m
[31m-/* creates a mask with `n' 0 bits at position `p' */[m
[31m-#define MASK0(n,p)	(~MASK1(n,p))[m
[31m-[m
[31m-/*[m
[31m-** the following macros help to manipulate instructions[m
[31m-*/[m
[31m-[m
[31m-#define GET_OPCODE(i)	(cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0)))[m
[31m-#define SET_OPCODE(i,o)	((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \[m
[31m-		((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP))))[m
[31m-[m
[31m-#define GETARG_A(i)	(cast(int, ((i)>>POS_A) & MASK1(SIZE_A,0)))[m
[31m-#define SETARG_A(i,u)	((i) = (((i)&MASK0(SIZE_A,POS_A)) | \[m
[31m-		((cast(Instruction, u)<<POS_A)&MASK1(SIZE_A,POS_A))))[m
[31m-[m
[31m-#define GETARG_B(i)	(cast(int, ((i)>>POS_B) & MASK1(SIZE_B,0)))[m
[31m-#define SETARG_B(i,b)	((i) = (((i)&MASK0(SIZE_B,POS_B)) | \[m
[31m-		((cast(Instruction, b)<<POS_B)&MASK1(SIZE_B,POS_B))))[m
[31m-[m
[31m-#define GETARG_C(i)	(cast(int, ((i)>>POS_C) & MASK1(SIZE_C,0)))[m
[31m-#define SETARG_C(i,b)	((i) = (((i)&MASK0(SIZE_C,POS_C)) | \[m
[31m-		((cast(Instruction, b)<<POS_C)&MASK1(SIZE_C,POS_C))))[m
[31m-[m
[31m-#define GETARG_Bx(i)	(cast(int, ((i)>>POS_Bx) & MASK1(SIZE_Bx,0)))[m
[31m-#define SETARG_Bx(i,b)	((i) = (((i)&MASK0(SIZE_Bx,POS_Bx)) | \[m
[31m-		((cast(Instruction, b)<<POS_Bx)&MASK1(SIZE_Bx,POS_Bx))))[m
[31m-[m
[31m-#define GETARG_sBx(i)	(GETARG_Bx(i)-MAXARG_sBx)[m
[31m-#define SETARG_sBx(i,b)	SETARG_Bx((i),cast(unsigned int, (b)+MAXARG_sBx))[m
[31m-[m
[31m-[m
[31m-#define CREATE_ABC(o,a,b,c)	((cast(Instruction, o)<<POS_OP) \[m
[31m-			| (cast(Instruction, a)<<POS_A) \[m
[31m-			| (cast(Instruction, b)<<POS_B) \[m
[31m-			| (cast(Instruction, c)<<POS_C))[m
[31m-[m
[31m-#define CREATE_ABx(o,a,bc)	((cast(Instruction, o)<<POS_OP) \[m
[31m-			| (cast(Instruction, a)<<POS_A) \[m
[31m-			| (cast(Instruction, bc)<<POS_Bx))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Macros to operate RK indices[m
[31m-*/[m
[31m-[m
[31m-/* this bit 1 means constant (0 means register) */[m
[31m-#define BITRK		(1 << (SIZE_B - 1))[m
[31m-[m
[31m-/* test whether value is a constant */[m
[31m-#define ISK(x)		((x) & BITRK)[m
[31m-[m
[31m-/* gets the index of the constant */[m
[31m-#define INDEXK(r)	((int)(r) & ~BITRK)[m
[31m-[m
[31m-#define MAXINDEXRK	(BITRK - 1)[m
[31m-[m
[31m-/* code a constant index as a RK value */[m
[31m-#define RKASK(x)	((x) | BITRK)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** invalid register that fits in 8 bits[m
[31m-*/[m
[31m-#define NO_REG		MAXARG_A[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** R(x) - register[m
[31m-** Kst(x) - constant (in constant table)[m
[31m-** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** grep "ORDER OP" if you change these enums[m
[31m-*/[m
[31m-[m
[31m-typedef enum {[m
[31m-/*----------------------------------------------------------------------[m
[31m-name		args	description[m
[31m-------------------------------------------------------------------------*/[m
[31m-OP_MOVE,/*	A B	R(A) := R(B)					*/[m
[31m-OP_LOADK,/*	A Bx	R(A) := Kst(Bx)					*/[m
[31m-OP_LOADBOOL,/*	A B C	R(A) := (Bool)B; if (C) pc++			*/[m
[31m-OP_LOADNIL,/*	A B	R(A) := ... := R(B) := nil			*/[m
[31m-OP_GETUPVAL,/*	A B	R(A) := UpValue[B]				*/[m
[31m-[m
[31m-OP_GETGLOBAL,/*	A Bx	R(A) := Gbl[Kst(Bx)]				*/[m
[31m-OP_GETTABLE,/*	A B C	R(A) := R(B)[RK(C)]				*/[m
[31m-[m
[31m-OP_SETGLOBAL,/*	A Bx	Gbl[Kst(Bx)] := R(A)				*/[m
[31m-OP_SETUPVAL,/*	A B	UpValue[B] := R(A)				*/[m
[31m-OP_SETTABLE,/*	A B C	R(A)[RK(B)] := RK(C)				*/[m
[31m-[m
[31m-OP_NEWTABLE,/*	A B C	R(A) := {} (size = B,C)				*/[m
[31m-[m
[31m-OP_SELF,/*	A B C	R(A+1) := R(B); R(A) := R(B)[RK(C)]		*/[m
[31m-[m
[31m-OP_ADD,/*	A B C	R(A) := RK(B) + RK(C)				*/[m
[31m-OP_SUB,/*	A B C	R(A) := RK(B) - RK(C)				*/[m
[31m-OP_MUL,/*	A B C	R(A) := RK(B) * RK(C)				*/[m
[31m-OP_DIV,/*	A B C	R(A) := RK(B) / RK(C)				*/[m
[31m-OP_MOD,/*	A B C	R(A) := RK(B) % RK(C)				*/[m
[31m-OP_POW,/*	A B C	R(A) := RK(B) ^ RK(C)				*/[m
[31m-OP_UNM,/*	A B	R(A) := -R(B)					*/[m
[31m-OP_NOT,/*	A B	R(A) := not R(B)				*/[m
[31m-OP_LEN,/*	A B	R(A) := length of R(B)				*/[m
[31m-[m
[31m-OP_CONCAT,/*	A B C	R(A) := R(B).. ... ..R(C)			*/[m
[31m-[m
[31m-OP_JMP,/*	sBx	pc+=sBx					*/[m
[31m-[m
[31m-OP_EQ,/*	A B C	if ((RK(B) == RK(C)) ~= A) then pc++		*/[m
[31m-OP_LT,/*	A B C	if ((RK(B) <  RK(C)) ~= A) then pc++  		*/[m
[31m-OP_LE,/*	A B C	if ((RK(B) <= RK(C)) ~= A) then pc++  		*/[m
[31m-[m
[31m-OP_TEST,/*	A C	if not (R(A) <=> C) then pc++			*/ [m
[31m-OP_TESTSET,/*	A B C	if (R(B) <=> C) then R(A) := R(B) else pc++	*/ [m
[31m-[m
[31m-OP_CALL,/*	A B C	R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */[m
[31m-OP_TAILCALL,/*	A B C	return R(A)(R(A+1), ... ,R(A+B-1))		*/[m
[31m-OP_RETURN,/*	A B	return R(A), ... ,R(A+B-2)	(see note)	*/[m
[31m-[m
[31m-OP_FORLOOP,/*	A sBx	R(A)+=R(A+2);[m
[31m-			if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/[m
[31m-OP_FORPREP,/*	A sBx	R(A)-=R(A+2); pc+=sBx				*/[m
[31m-[m
[31m-OP_TFORLOOP,/*	A C	R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); [m
[31m-                        if R(A+3) ~= nil then R(A+2)=R(A+3) else pc++	*/ [m
[31m-OP_SETLIST,/*	A B C	R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B	*/[m
[31m-[m
[31m-OP_CLOSE,/*	A 	close all variables in the stack up to (>=) R(A)*/[m
[31m-OP_CLOSURE,/*	A Bx	R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n))	*/[m
[31m-[m
[31m-OP_VARARG/*	A B	R(A), R(A+1), ..., R(A+B-1) = vararg		*/[m
[31m-} OpCode;[m
[31m-[m
[31m-[m
[31m-#define NUM_OPCODES	(cast(int, OP_VARARG) + 1)[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*===========================================================================[m
[31m-  Notes:[m
[31m-  (*) In OP_CALL, if (B == 0) then B = top. C is the number of returns - 1,[m
[31m-      and can be 0: OP_CALL then sets `top' to last_result+1, so[m
[31m-      next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'.[m
[31m-[m
[31m-  (*) In OP_VARARG, if (B == 0) then use actual number of varargs and[m
[31m-      set top (like in OP_CALL with C == 0).[m
[31m-[m
[31m-  (*) In OP_RETURN, if (B == 0) then return up to `top'[m
[31m-[m
[31m-  (*) In OP_SETLIST, if (B == 0) then B = `top';[m
[31m-      if (C == 0) then next `instruction' is real C[m
[31m-[m
[31m-  (*) For comparisons, A specifies what condition the test should accept[m
[31m-      (true or false).[m
[31m-[m
[31m-  (*) All `skips' (pc++) assume that next instruction is a jump[m
[31m-===========================================================================*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** masks for instruction properties. The format is:[m
[31m-** bits 0-1: op mode[m
[31m-** bits 2-3: C arg mode[m
[31m-** bits 4-5: B arg mode[m
[31m-** bit 6: instruction set register A[m
[31m-** bit 7: operator is a test[m
[31m-*/  [m
[31m-[m
[31m-enum OpArgMask {[m
[31m-  OpArgN,  /* argument is not used */[m
[31m-  OpArgU,  /* argument is used */[m
[31m-  OpArgR,  /* argument is a register or a jump offset */[m
[31m-  OpArgK   /* argument is a constant or register/constant */[m
[31m-};[m
[31m-[m
[31m-LUAI_DATA const lu_byte luaP_opmodes[NUM_OPCODES];[m
[31m-[m
[31m-#define getOpMode(m)	(cast(enum OpMode, luaP_opmodes[m] & 3))[m
[31m-#define getBMode(m)	(cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3))[m
[31m-#define getCMode(m)	(cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3))[m
[31m-#define testAMode(m)	(luaP_opmodes[m] & (1 << 6))[m
[31m-#define testTMode(m)	(luaP_opmodes[m] & (1 << 7))[m
[31m-[m
[31m-[m
[31m-LUAI_DATA const char *const luaP_opnames[NUM_OPCODES+1];  /* opcode names */[m
[31m-[m
[31m-[m
[31m-/* number of list items to accumulate before a SETLIST instruction */[m
[31m-#define LFIELDS_PER_FLUSH	50[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/loslib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/loslib.c[m
[1mdeleted file mode 100644[m
[1mindex da06a57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/loslib.c[m
[1m+++ /dev/null[m
[36m@@ -1,243 +0,0 @@[m
[31m-/*[m
[31m-** $Id: loslib.c,v 1.19.1.3 2008/01/18 16:38:18 roberto Exp $[m
[31m-** Standard Operating System library[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <locale.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-#include <time.h>[m
[31m-[m
[31m-#define loslib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-static int os_pushresult (lua_State *L, int i, const char *filename) {[m
[31m-  int en = errno;  /* calls to Lua API may change this value */[m
[31m-  if (i) {[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else {[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushfstring(L, "%s: %s", filename, strerror(en));[m
[31m-    lua_pushinteger(L, en);[m
[31m-    return 3;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_execute (lua_State *L) {[m
[31m-  lua_pushinteger(L, system(luaL_optstring(L, 1, NULL)));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_remove (lua_State *L) {[m
[31m-  const char *filename = luaL_checkstring(L, 1);[m
[31m-  return os_pushresult(L, remove(filename) == 0, filename);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_rename (lua_State *L) {[m
[31m-  const char *fromname = luaL_checkstring(L, 1);[m
[31m-  const char *toname = luaL_checkstring(L, 2);[m
[31m-  return os_pushresult(L, rename(fromname, toname) == 0, fromname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_tmpname (lua_State *L) {[m
[31m-  char buff[LUA_TMPNAMBUFSIZE];[m
[31m-  int err;[m
[31m-  lua_tmpnam(buff, err);[m
[31m-  if (err)[m
[31m-    return luaL_error(L, "unable to generate a unique filename");[m
[31m-  lua_pushstring(L, buff);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_getenv (lua_State *L) {[m
[31m-  lua_pushstring(L, getenv(luaL_checkstring(L, 1)));  /* if NULL push nil */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_clock (lua_State *L) {[m
[31m-  lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Time/Date operations[m
[31m-** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S,[m
[31m-**   wday=%w+1, yday=%j, isdst=? }[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-static void setfield (lua_State *L, const char *key, int value) {[m
[31m-  lua_pushinteger(L, value);[m
[31m-  lua_setfield(L, -2, key);[m
[31m-}[m
[31m-[m
[31m-static void setboolfield (lua_State *L, const char *key, int value) {[m
[31m-  if (value < 0)  /* undefined? */[m
[31m-    return;  /* does not set field */[m
[31m-  lua_pushboolean(L, value);[m
[31m-  lua_setfield(L, -2, key);[m
[31m-}[m
[31m-[m
[31m-static int getboolfield (lua_State *L, const char *key) {[m
[31m-  int res;[m
[31m-  lua_getfield(L, -1, key);[m
[31m-  res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1);[m
[31m-  lua_pop(L, 1);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int getfield (lua_State *L, const char *key, int d) {[m
[31m-  int res;[m
[31m-  lua_getfield(L, -1, key);[m
[31m-  if (lua_isnumber(L, -1))[m
[31m-    res = (int)lua_tointeger(L, -1);[m
[31m-  else {[m
[31m-    if (d < 0)[m
[31m-      return luaL_error(L, "field " LUA_QS " missing in date table", key);[m
[31m-    res = d;[m
[31m-  }[m
[31m-  lua_pop(L, 1);[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_date (lua_State *L) {[m
[31m-  const char *s = luaL_optstring(L, 1, "%c");[m
[31m-  time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL));[m
[31m-  struct tm *stm;[m
[31m-  if (*s == '!') {  /* UTC? */[m
[31m-    stm = gmtime(&t);[m
[31m-    s++;  /* skip `!' */[m
[31m-  }[m
[31m-  else[m
[31m-    stm = localtime(&t);[m
[31m-  if (stm == NULL)  /* invalid date? */[m
[31m-    lua_pushnil(L);[m
[31m-  else if (strcmp(s, "*t") == 0) {[m
[31m-    lua_createtable(L, 0, 9);  /* 9 = number of fields */[m
[31m-    setfield(L, "sec", stm->tm_sec);[m
[31m-    setfield(L, "min", stm->tm_min);[m
[31m-    setfield(L, "hour", stm->tm_hour);[m
[31m-    setfield(L, "day", stm->tm_mday);[m
[31m-    setfield(L, "month", stm->tm_mon+1);[m
[31m-    setfield(L, "year", stm->tm_year+1900);[m
[31m-    setfield(L, "wday", stm->tm_wday+1);[m
[31m-    setfield(L, "yday", stm->tm_yday+1);[m
[31m-    setboolfield(L, "isdst", stm->tm_isdst);[m
[31m-  }[m
[31m-  else {[m
[31m-    char cc[3];[m
[31m-    luaL_Buffer b;[m
[31m-    cc[0] = '%'; cc[2] = '\0';[m
[31m-    luaL_buffinit(L, &b);[m
[31m-    for (; *s; s++) {[m
[31m-      if (*s != '%' || *(s + 1) == '\0')  /* no conversion specifier? */[m
[31m-        luaL_addchar(&b, *s);[m
[31m-      else {[m
[31m-        size_t reslen;[m
[31m-        char buff[200];  /* should be big enough for any conversion result */[m
[31m-        cc[1] = *(++s);[m
[31m-        reslen = strftime(buff, sizeof(buff), cc, stm);[m
[31m-        luaL_addlstring(&b, buff, reslen);[m
[31m-      }[m
[31m-    }[m
[31m-    luaL_pushresult(&b);[m
[31m-  }[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_time (lua_State *L) {[m
[31m-  time_t t;[m
[31m-  if (lua_isnoneornil(L, 1))  /* called without args? */[m
[31m-    t = time(NULL);  /* get current time */[m
[31m-  else {[m
[31m-    struct tm ts;[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-    lua_settop(L, 1);  /* make sure table is at the top */[m
[31m-    ts.tm_sec = getfield(L, "sec", 0);[m
[31m-    ts.tm_min = getfield(L, "min", 0);[m
[31m-    ts.tm_hour = getfield(L, "hour", 12);[m
[31m-    ts.tm_mday = getfield(L, "day", -1);[m
[31m-    ts.tm_mon = getfield(L, "month", -1) - 1;[m
[31m-    ts.tm_year = getfield(L, "year", -1) - 1900;[m
[31m-    ts.tm_isdst = getboolfield(L, "isdst");[m
[31m-    t = mktime(&ts);[m
[31m-  }[m
[31m-  if (t == (time_t)(-1))[m
[31m-    lua_pushnil(L);[m
[31m-  else[m
[31m-    lua_pushnumber(L, (lua_Number)t);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_difftime (lua_State *L) {[m
[31m-  lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)),[m
[31m-                             (time_t)(luaL_optnumber(L, 2, 0))));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static int os_setlocale (lua_State *L) {[m
[31m-  static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY,[m
[31m-                      LC_NUMERIC, LC_TIME};[m
[31m-  static const char *const catnames[] = {"all", "collate", "ctype", "monetary",[m
[31m-     "numeric", "time", NULL};[m
[31m-  const char *l = luaL_optstring(L, 1, NULL);[m
[31m-  int op = luaL_checkoption(L, 2, "all", catnames);[m
[31m-  lua_pushstring(L, setlocale(cat[op], l));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int os_exit (lua_State *L) {[m
[31m-  exit(luaL_optint(L, 1, EXIT_SUCCESS));[m
[31m-}[m
[31m-[m
[31m-static const luaL_Reg syslib[] = {[m
[31m-  {"clock",     os_clock},[m
[31m-  {"date",      os_date},[m
[31m-  {"difftime",  os_difftime},[m
[31m-  {"execute",   os_execute},[m
[31m-  {"exit",      os_exit},[m
[31m-  {"getenv",    os_getenv},[m
[31m-  {"remove",    os_remove},[m
[31m-  {"rename",    os_rename},[m
[31m-  {"setlocale", os_setlocale},[m
[31m-  {"time",      os_time},[m
[31m-  {"tmpname",   os_tmpname},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_os (lua_State *L) {[m
[31m-  luaL_register(L, LUA_OSLIBNAME, syslib);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lparser.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lparser.c[m
[1mdeleted file mode 100644[m
[1mindex dda7488..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lparser.c[m
[1m+++ /dev/null[m
[36m@@ -1,1339 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lparser.c,v 2.42.1.4 2011/10/21 19:31:42 roberto Exp $[m
[31m-** Lua Parser[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lparser_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lcode.h"[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "llex.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lparser.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define hasmultret(k)		((k) == VCALL || (k) == VVARARG)[m
[31m-[m
[31m-#define getlocvar(fs, i)	((fs)->f->locvars[(fs)->actvar[i]])[m
[31m-[m
[31m-#define luaY_checklimit(fs,v,l,m)	if ((v)>(l)) errorlimit(fs,l,m)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** nodes for block list (list of active blocks)[m
[31m-*/[m
[31m-typedef struct BlockCnt {[m
[31m-  struct BlockCnt *previous;  /* chain */[m
[31m-  int breaklist;  /* list of jumps out of this loop */[m
[31m-  lu_byte nactvar;  /* # active locals outside the breakable structure */[m
[31m-  lu_byte upval;  /* true if some variable in the block is an upvalue */[m
[31m-  lu_byte isbreakable;  /* true if `block' is a loop */[m
[31m-} BlockCnt;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** prototypes for recursive non-terminal functions[m
[31m-*/[m
[31m-static void chunk (LexState *ls);[m
[31m-static void expr (LexState *ls, expdesc *v);[m
[31m-[m
[31m-[m
[31m-static void anchor_token (LexState *ls) {[m
[31m-  if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) {[m
[31m-    TString *ts = ls->t.seminfo.ts;[m
[31m-    luaX_newstring(ls, getstr(ts), ts->tsv.len);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void error_expected (LexState *ls, int token) {[m
[31m-  luaX_syntaxerror(ls,[m
[31m-      luaO_pushfstring(ls->L, LUA_QS " expected", luaX_token2str(ls, token)));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void errorlimit (FuncState *fs, int limit, const char *what) {[m
[31m-  const char *msg = (fs->f->linedefined == 0) ?[m
[31m-    luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) :[m
[31m-    luaO_pushfstring(fs->L, "function at line %d has more than %d %s",[m
[31m-                            fs->f->linedefined, limit, what);[m
[31m-  luaX_lexerror(fs->ls, msg, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int testnext (LexState *ls, int c) {[m
[31m-  if (ls->t.token == c) {[m
[31m-    luaX_next(ls);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void check (LexState *ls, int c) {[m
[31m-  if (ls->t.token != c)[m
[31m-    error_expected(ls, c);[m
[31m-}[m
[31m-[m
[31m-static void checknext (LexState *ls, int c) {[m
[31m-  check(ls, c);[m
[31m-  luaX_next(ls);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define check_condition(ls,c,msg)	{ if (!(c)) luaX_syntaxerror(ls, msg); }[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void check_match (LexState *ls, int what, int who, int where) {[m
[31m-  if (!testnext(ls, what)) {[m
[31m-    if (where == ls->linenumber)[m
[31m-      error_expected(ls, what);[m
[31m-    else {[m
[31m-      luaX_syntaxerror(ls, luaO_pushfstring(ls->L,[m
[31m-             LUA_QS " expected (to close " LUA_QS " at line %d)",[m
[31m-              luaX_token2str(ls, what), luaX_token2str(ls, who), where));[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static TString *str_checkname (LexState *ls) {[m
[31m-  TString *ts;[m
[31m-  check(ls, TK_NAME);[m
[31m-  ts = ls->t.seminfo.ts;[m
[31m-  luaX_next(ls);[m
[31m-  return ts;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void init_exp (expdesc *e, expkind k, int i) {[m
[31m-  e->f = e->t = NO_JUMP;[m
[31m-  e->k = k;[m
[31m-  e->u.s.info = i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void codestring (LexState *ls, expdesc *e, TString *s) {[m
[31m-  init_exp(e, VK, luaK_stringK(ls->fs, s));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void checkname(LexState *ls, expdesc *e) {[m
[31m-  codestring(ls, e, str_checkname(ls));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int registerlocalvar (LexState *ls, TString *varname) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  Proto *f = fs->f;[m
[31m-  int oldsize = f->sizelocvars;[m
[31m-  luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,[m
[31m-                  LocVar, SHRT_MAX, "too many local variables");[m
[31m-  while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;[m
[31m-  f->locvars[fs->nlocvars].varname = varname;[m
[31m-  luaC_objbarrier(ls->L, f, varname);[m
[31m-  return fs->nlocvars++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define new_localvarliteral(ls,v,n) \[m
[31m-  new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n)[m
[31m-[m
[31m-[m
[31m-static void new_localvar (LexState *ls, TString *name, int n) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables");[m
[31m-  fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void adjustlocalvars (LexState *ls, int nvars) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  fs->nactvar = cast_byte(fs->nactvar + nvars);[m
[31m-  for (; nvars; nvars--) {[m
[31m-    getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void removevars (LexState *ls, int tolevel) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  while (fs->nactvar > tolevel)[m
[31m-    getlocvar(fs, --fs->nactvar).endpc = fs->pc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int indexupvalue (FuncState *fs, TString *name, expdesc *v) {[m
[31m-  int i;[m
[31m-  Proto *f = fs->f;[m
[31m-  int oldsize = f->sizeupvalues;[m
[31m-  for (i=0; i<f->nups; i++) {[m
[31m-    if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) {[m
[31m-      lua_assert(f->upvalues[i] == name);[m
[31m-      return i;[m
[31m-    }[m
[31m-  }[m
[31m-  /* new one */[m
[31m-  luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues");[m
[31m-  luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues,[m
[31m-                  TString *, MAX_INT, "");[m
[31m-  while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL;[m
[31m-  f->upvalues[f->nups] = name;[m
[31m-  luaC_objbarrier(fs->L, f, name);[m
[31m-  lua_assert(v->k == VLOCAL || v->k == VUPVAL);[m
[31m-  fs->upvalues[f->nups].k = cast_byte(v->k);[m
[31m-  fs->upvalues[f->nups].info = cast_byte(v->u.s.info);[m
[31m-  return f->nups++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int searchvar (FuncState *fs, TString *n) {[m
[31m-  int i;[m
[31m-  for (i=fs->nactvar-1; i >= 0; i--) {[m
[31m-    if (n == getlocvar(fs, i).varname)[m
[31m-      return i;[m
[31m-  }[m
[31m-  return -1;  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void markupval (FuncState *fs, int level) {[m
[31m-  BlockCnt *bl = fs->bl;[m
[31m-  while (bl && bl->nactvar > level) bl = bl->previous;[m
[31m-  if (bl) bl->upval = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {[m
[31m-  if (fs == NULL) {  /* no more levels? */[m
[31m-    init_exp(var, VGLOBAL, NO_REG);  /* default is global variable */[m
[31m-    return VGLOBAL;[m
[31m-  }[m
[31m-  else {[m
[31m-    int v = searchvar(fs, n);  /* look up at current level */[m
[31m-    if (v >= 0) {[m
[31m-      init_exp(var, VLOCAL, v);[m
[31m-      if (!base)[m
[31m-        markupval(fs, v);  /* local will be used as an upval */[m
[31m-      return VLOCAL;[m
[31m-    }[m
[31m-    else {  /* not found at current level; try upper one */[m
[31m-      if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL)[m
[31m-        return VGLOBAL;[m
[31m-      var->u.s.info = indexupvalue(fs, n, var);  /* else was LOCAL or UPVAL */[m
[31m-      var->k = VUPVAL;  /* upvalue in this level */[m
[31m-      return VUPVAL;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void singlevar (LexState *ls, expdesc *var) {[m
[31m-  TString *varname = str_checkname(ls);[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  if (singlevaraux(fs, varname, var, 1) == VGLOBAL)[m
[31m-    var->u.s.info = luaK_stringK(fs, varname);  /* info points to global name */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int extra = nvars - nexps;[m
[31m-  if (hasmultret(e->k)) {[m
[31m-    extra++;  /* includes call itself */[m
[31m-    if (extra < 0) extra = 0;[m
[31m-    luaK_setreturns(fs, e, extra);  /* last exp. provides the difference */[m
[31m-    if (extra > 1) luaK_reserveregs(fs, extra-1);[m
[31m-  }[m
[31m-  else {[m
[31m-    if (e->k != VVOID) luaK_exp2nextreg(fs, e);  /* close last expression */[m
[31m-    if (extra > 0) {[m
[31m-      int reg = fs->freereg;[m
[31m-      luaK_reserveregs(fs, extra);[m
[31m-      luaK_nil(fs, reg, extra);[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void enterlevel (LexState *ls) {[m
[31m-  if (++ls->L->nCcalls > LUAI_MAXCCALLS)[m
[31m-	luaX_lexerror(ls, "chunk has too many syntax levels", 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define leavelevel(ls)	((ls)->L->nCcalls--)[m
[31m-[m
[31m-[m
[31m-static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) {[m
[31m-  bl->breaklist = NO_JUMP;[m
[31m-  bl->isbreakable = isbreakable;[m
[31m-  bl->nactvar = fs->nactvar;[m
[31m-  bl->upval = 0;[m
[31m-  bl->previous = fs->bl;[m
[31m-  fs->bl = bl;[m
[31m-  lua_assert(fs->freereg == fs->nactvar);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void leaveblock (FuncState *fs) {[m
[31m-  BlockCnt *bl = fs->bl;[m
[31m-  fs->bl = bl->previous;[m
[31m-  removevars(fs->ls, bl->nactvar);[m
[31m-  if (bl->upval)[m
[31m-    luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0);[m
[31m-  /* a block either controls scope or breaks (never both) */[m
[31m-  lua_assert(!bl->isbreakable || !bl->upval);[m
[31m-  lua_assert(bl->nactvar == fs->nactvar);[m
[31m-  fs->freereg = fs->nactvar;  /* free registers */[m
[31m-  luaK_patchtohere(fs, bl->breaklist);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  Proto *f = fs->f;[m
[31m-  int oldsize = f->sizep;[m
[31m-  int i;[m
[31m-  luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *,[m
[31m-                  MAXARG_Bx, "constant table overflow");[m
[31m-  while (oldsize < f->sizep) f->p[oldsize++] = NULL;[m
[31m-  f->p[fs->np++] = func->f;[m
[31m-  luaC_objbarrier(ls->L, f, func->f);[m
[31m-  init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1));[m
[31m-  for (i=0; i<func->f->nups; i++) {[m
[31m-    OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;[m
[31m-    luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void open_func (LexState *ls, FuncState *fs) {[m
[31m-  lua_State *L = ls->L;[m
[31m-  Proto *f = luaF_newproto(L);[m
[31m-  fs->f = f;[m
[31m-  fs->prev = ls->fs;  /* linked list of funcstates */[m
[31m-  fs->ls = ls;[m
[31m-  fs->L = L;[m
[31m-  ls->fs = fs;[m
[31m-  fs->pc = 0;[m
[31m-  fs->lasttarget = -1;[m
[31m-  fs->jpc = NO_JUMP;[m
[31m-  fs->freereg = 0;[m
[31m-  fs->nk = 0;[m
[31m-  fs->np = 0;[m
[31m-  fs->nlocvars = 0;[m
[31m-  fs->nactvar = 0;[m
[31m-  fs->bl = NULL;[m
[31m-  f->source = ls->source;[m
[31m-  f->maxstacksize = 2;  /* registers 0/1 are always valid */[m
[31m-  fs->h = luaH_new(L, 0, 0);[m
[31m-  /* anchor table of constants and prototype (to avoid being collected) */[m
[31m-  sethvalue2s(L, L->top, fs->h);[m
[31m-  incr_top(L);[m
[31m-  setptvalue2s(L, L->top, f);[m
[31m-  incr_top(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void close_func (LexState *ls) {[m
[31m-  lua_State *L = ls->L;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  Proto *f = fs->f;[m
[31m-  removevars(ls, 0);[m
[31m-  luaK_ret(fs, 0, 0);  /* final return */[m
[31m-  luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);[m
[31m-  f->sizecode = fs->pc;[m
[31m-  luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int);[m
[31m-  f->sizelineinfo = fs->pc;[m
[31m-  luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue);[m
[31m-  f->sizek = fs->nk;[m
[31m-  luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *);[m
[31m-  f->sizep = fs->np;[m
[31m-  luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);[m
[31m-  f->sizelocvars = fs->nlocvars;[m
[31m-  luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *);[m
[31m-  f->sizeupvalues = f->nups;[m
[31m-  lua_assert(luaG_checkcode(f));[m
[31m-  lua_assert(fs->bl == NULL);[m
[31m-  ls->fs = fs->prev;[m
[31m-  /* last token read was anchored in defunct function; must reanchor it */[m
[31m-  if (fs) anchor_token(ls);[m
[31m-  L->top -= 2;  /* remove table and prototype from the stack */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {[m
[31m-  struct LexState lexstate;[m
[31m-  struct FuncState funcstate;[m
[31m-  lexstate.buff = buff;[m
[31m-  luaX_setinput(L, &lexstate, z, luaS_new(L, name));[m
[31m-  open_func(&lexstate, &funcstate);[m
[31m-  funcstate.f->is_vararg = VARARG_ISVARARG;  /* main func. is always vararg */[m
[31m-  luaX_next(&lexstate);  /* read first token */[m
[31m-  chunk(&lexstate);[m
[31m-  check(&lexstate, TK_EOS);[m
[31m-  close_func(&lexstate);[m
[31m-  lua_assert(funcstate.prev == NULL);[m
[31m-  lua_assert(funcstate.f->nups == 0);[m
[31m-  lua_assert(lexstate.fs == NULL);[m
[31m-  return funcstate.f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*============================================================*/[m
[31m-/* GRAMMAR RULES */[m
[31m-/*============================================================*/[m
[31m-[m
[31m-[m
[31m-static void field (LexState *ls, expdesc *v) {[m
[31m-  /* field -> ['.' | ':'] NAME */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  expdesc key;[m
[31m-  luaK_exp2anyreg(fs, v);[m
[31m-  luaX_next(ls);  /* skip the dot or colon */[m
[31m-  checkname(ls, &key);[m
[31m-  luaK_indexed(fs, v, &key);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void yindex (LexState *ls, expdesc *v) {[m
[31m-  /* index -> '[' expr ']' */[m
[31m-  luaX_next(ls);  /* skip the '[' */[m
[31m-  expr(ls, v);[m
[31m-  luaK_exp2val(ls->fs, v);[m
[31m-  checknext(ls, ']');[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Rules for Constructors[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-struct ConsControl {[m
[31m-  expdesc v;  /* last list item read */[m
[31m-  expdesc *t;  /* table descriptor */[m
[31m-  int nh;  /* total number of `record' elements */[m
[31m-  int na;  /* total number of array elements */[m
[31m-  int tostore;  /* number of array elements pending to be stored */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void recfield (LexState *ls, struct ConsControl *cc) {[m
[31m-  /* recfield -> (NAME | `['exp1`]') = exp1 */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int reg = ls->fs->freereg;[m
[31m-  expdesc key, val;[m
[31m-  int rkkey;[m
[31m-  if (ls->t.token == TK_NAME) {[m
[31m-    luaY_checklimit(fs, cc->nh, MAX_INT, "items in a constructor");[m
[31m-    checkname(ls, &key);[m
[31m-  }[m
[31m-  else  /* ls->t.token == '[' */[m
[31m-    yindex(ls, &key);[m
[31m-  cc->nh++;[m
[31m-  checknext(ls, '=');[m
[31m-  rkkey = luaK_exp2RK(fs, &key);[m
[31m-  expr(ls, &val);[m
[31m-  luaK_codeABC(fs, OP_SETTABLE, cc->t->u.s.info, rkkey, luaK_exp2RK(fs, &val));[m
[31m-  fs->freereg = reg;  /* free registers */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void closelistfield (FuncState *fs, struct ConsControl *cc) {[m
[31m-  if (cc->v.k == VVOID) return;  /* there is no list item */[m
[31m-  luaK_exp2nextreg(fs, &cc->v);[m
[31m-  cc->v.k = VVOID;[m
[31m-  if (cc->tostore == LFIELDS_PER_FLUSH) {[m
[31m-    luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore);  /* flush */[m
[31m-    cc->tostore = 0;  /* no more items pending */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void lastlistfield (FuncState *fs, struct ConsControl *cc) {[m
[31m-  if (cc->tostore == 0) return;[m
[31m-  if (hasmultret(cc->v.k)) {[m
[31m-    luaK_setmultret(fs, &cc->v);[m
[31m-    luaK_setlist(fs, cc->t->u.s.info, cc->na, LUA_MULTRET);[m
[31m-    cc->na--;  /* do not count last expression (unknown number of elements) */[m
[31m-  }[m
[31m-  else {[m
[31m-    if (cc->v.k != VVOID)[m
[31m-      luaK_exp2nextreg(fs, &cc->v);[m
[31m-    luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void listfield (LexState *ls, struct ConsControl *cc) {[m
[31m-  expr(ls, &cc->v);[m
[31m-  luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor");[m
[31m-  cc->na++;[m
[31m-  cc->tostore++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void constructor (LexState *ls, expdesc *t) {[m
[31m-  /* constructor -> ?? */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int line = ls->linenumber;[m
[31m-  int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);[m
[31m-  struct ConsControl cc;[m
[31m-  cc.na = cc.nh = cc.tostore = 0;[m
[31m-  cc.t = t;[m
[31m-  init_exp(t, VRELOCABLE, pc);[m
[31m-  init_exp(&cc.v, VVOID, 0);  /* no value (yet) */[m
[31m-  luaK_exp2nextreg(ls->fs, t);  /* fix it at stack top (for gc) */[m
[31m-  checknext(ls, '{');[m
[31m-  do {[m
[31m-    lua_assert(cc.v.k == VVOID || cc.tostore > 0);[m
[31m-    if (ls->t.token == '}') break;[m
[31m-    closelistfield(fs, &cc);[m
[31m-    switch(ls->t.token) {[m
[31m-      case TK_NAME: {  /* may be listfields or recfields */[m
[31m-        luaX_lookahead(ls);[m
[31m-        if (ls->lookahead.token != '=')  /* expression? */[m
[31m-          listfield(ls, &cc);[m
[31m-        else[m
[31m-          recfield(ls, &cc);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '[': {  /* constructor_item -> recfield */[m
[31m-        recfield(ls, &cc);[m
[31m-        break;[m
[31m-      }[m
[31m-      default: {  /* constructor_part -> listfield */[m
[31m-        listfield(ls, &cc);[m
[31m-        break;[m
[31m-      }[m
[31m-    }[m
[31m-  } while (testnext(ls, ',') || testnext(ls, ';'));[m
[31m-  check_match(ls, '}', '{', line);[m
[31m-  lastlistfield(fs, &cc);[m
[31m-  SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */[m
[31m-  SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh));  /* set initial table size */[m
[31m-}[m
[31m-[m
[31m-/* }====================================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void parlist (LexState *ls) {[m
[31m-  /* parlist -> [ param { `,' param } ] */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  Proto *f = fs->f;[m
[31m-  int nparams = 0;[m
[31m-  f->is_vararg = 0;[m
[31m-  if (ls->t.token != ')') {  /* is `parlist' not empty? */[m
[31m-    do {[m
[31m-      switch (ls->t.token) {[m
[31m-        case TK_NAME: {  /* param -> NAME */[m
[31m-          new_localvar(ls, str_checkname(ls), nparams++);[m
[31m-          break;[m
[31m-        }[m
[31m-        case TK_DOTS: {  /* param -> `...' */[m
[31m-          luaX_next(ls);[m
[31m-#if defined(LUA_COMPAT_VARARG)[m
[31m-          /* use `arg' as default name */[m
[31m-          new_localvarliteral(ls, "arg", nparams++);[m
[31m-          f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG;[m
[31m-#endif[m
[31m-          f->is_vararg |= VARARG_ISVARARG;[m
[31m-          break;[m
[31m-        }[m
[31m-        default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected");[m
[31m-      }[m
[31m-    } while (!f->is_vararg && testnext(ls, ','));[m
[31m-  }[m
[31m-  adjustlocalvars(ls, nparams);[m
[31m-  f->numparams = cast_byte(fs->nactvar - (f->is_vararg & VARARG_HASARG));[m
[31m-  luaK_reserveregs(fs, fs->nactvar);  /* reserve register for parameters */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void body (LexState *ls, expdesc *e, int needself, int line) {[m
[31m-  /* body ->  `(' parlist `)' chunk END */[m
[31m-  FuncState new_fs;[m
[31m-  open_func(ls, &new_fs);[m
[31m-  new_fs.f->linedefined = line;[m
[31m-  checknext(ls, '(');[m
[31m-  if (needself) {[m
[31m-    new_localvarliteral(ls, "self", 0);[m
[31m-    adjustlocalvars(ls, 1);[m
[31m-  }[m
[31m-  parlist(ls);[m
[31m-  checknext(ls, ')');[m
[31m-  chunk(ls);[m
[31m-  new_fs.f->lastlinedefined = ls->linenumber;[m
[31m-  check_match(ls, TK_END, TK_FUNCTION, line);[m
[31m-  close_func(ls);[m
[31m-  pushclosure(ls, &new_fs, e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int explist1 (LexState *ls, expdesc *v) {[m
[31m-  /* explist1 -> expr { `,' expr } */[m
[31m-  int n = 1;  /* at least one expression */[m
[31m-  expr(ls, v);[m
[31m-  while (testnext(ls, ',')) {[m
[31m-    luaK_exp2nextreg(ls->fs, v);[m
[31m-    expr(ls, v);[m
[31m-    n++;[m
[31m-  }[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void funcargs (LexState *ls, expdesc *f) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  expdesc args;[m
[31m-  int base, nparams;[m
[31m-  int line = ls->linenumber;[m
[31m-  switch (ls->t.token) {[m
[31m-    case '(': {  /* funcargs -> `(' [ explist1 ] `)' */[m
[31m-      if (line != ls->lastline)[m
[31m-        luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)");[m
[31m-      luaX_next(ls);[m
[31m-      if (ls->t.token == ')')  /* arg list is empty? */[m
[31m-        args.k = VVOID;[m
[31m-      else {[m
[31m-        explist1(ls, &args);[m
[31m-        luaK_setmultret(fs, &args);[m
[31m-      }[m
[31m-      check_match(ls, ')', '(', line);[m
[31m-      break;[m
[31m-    }[m
[31m-    case '{': {  /* funcargs -> constructor */[m
[31m-      constructor(ls, &args);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_STRING: {  /* funcargs -> STRING */[m
[31m-      codestring(ls, &args, ls->t.seminfo.ts);[m
[31m-      luaX_next(ls);  /* must use `seminfo' before `next' */[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      luaX_syntaxerror(ls, "function arguments expected");[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  lua_assert(f->k == VNONRELOC);[m
[31m-  base = f->u.s.info;  /* base register for call */[m
[31m-  if (hasmultret(args.k))[m
[31m-    nparams = LUA_MULTRET;  /* open call */[m
[31m-  else {[m
[31m-    if (args.k != VVOID)[m
[31m-      luaK_exp2nextreg(fs, &args);  /* close last argument */[m
[31m-    nparams = fs->freereg - (base+1);[m
[31m-  }[m
[31m-  init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));[m
[31m-  luaK_fixline(fs, line);[m
[31m-  fs->freereg = base+1;  /* call remove function and arguments and leaves[m
[31m-                            (unless changed) one result */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Expression parsing[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static void prefixexp (LexState *ls, expdesc *v) {[m
[31m-  /* prefixexp -> NAME | '(' expr ')' */[m
[31m-  switch (ls->t.token) {[m
[31m-    case '(': {[m
[31m-      int line = ls->linenumber;[m
[31m-      luaX_next(ls);[m
[31m-      expr(ls, v);[m
[31m-      check_match(ls, ')', '(', line);[m
[31m-      luaK_dischargevars(ls->fs, v);[m
[31m-      return;[m
[31m-    }[m
[31m-    case TK_NAME: {[m
[31m-      singlevar(ls, v);[m
[31m-      return;[m
[31m-    }[m
[31m-    default: {[m
[31m-      luaX_syntaxerror(ls, "unexpected symbol");[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void primaryexp (LexState *ls, expdesc *v) {[m
[31m-  /* primaryexp ->[m
[31m-        prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  prefixexp(ls, v);[m
[31m-  for (;;) {[m
[31m-    switch (ls->t.token) {[m
[31m-      case '.': {  /* field */[m
[31m-        field(ls, v);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '[': {  /* `[' exp1 `]' */[m
[31m-        expdesc key;[m
[31m-        luaK_exp2anyreg(fs, v);[m
[31m-        yindex(ls, &key);[m
[31m-        luaK_indexed(fs, v, &key);[m
[31m-        break;[m
[31m-      }[m
[31m-      case ':': {  /* `:' NAME funcargs */[m
[31m-        expdesc key;[m
[31m-        luaX_next(ls);[m
[31m-        checkname(ls, &key);[m
[31m-        luaK_self(fs, v, &key);[m
[31m-        funcargs(ls, v);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '(': case TK_STRING: case '{': {  /* funcargs */[m
[31m-        luaK_exp2nextreg(fs, v);[m
[31m-        funcargs(ls, v);[m
[31m-        break;[m
[31m-      }[m
[31m-      default: return;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void simpleexp (LexState *ls, expdesc *v) {[m
[31m-  /* simpleexp -> NUMBER | STRING | NIL | true | false | ... |[m
[31m-                  constructor | FUNCTION body | primaryexp */[m
[31m-  switch (ls->t.token) {[m
[31m-    case TK_NUMBER: {[m
[31m-      init_exp(v, VKNUM, 0);[m
[31m-      v->u.nval = ls->t.seminfo.r;[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_STRING: {[m
[31m-      codestring(ls, v, ls->t.seminfo.ts);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_NIL: {[m
[31m-      init_exp(v, VNIL, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_TRUE: {[m
[31m-      init_exp(v, VTRUE, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_FALSE: {[m
[31m-      init_exp(v, VFALSE, 0);[m
[31m-      break;[m
[31m-    }[m
[31m-    case TK_DOTS: {  /* vararg */[m
[31m-      FuncState *fs = ls->fs;[m
[31m-      check_condition(ls, fs->f->is_vararg,[m
[31m-                      "cannot use " LUA_QL("...") " outside a vararg function");[m
[31m-      fs->f->is_vararg &= ~VARARG_NEEDSARG;  /* don't need 'arg' */[m
[31m-      init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));[m
[31m-      break;[m
[31m-    }[m
[31m-    case '{': {  /* constructor */[m
[31m-      constructor(ls, v);[m
[31m-      return;[m
[31m-    }[m
[31m-    case TK_FUNCTION: {[m
[31m-      luaX_next(ls);[m
[31m-      body(ls, v, 0, ls->linenumber);[m
[31m-      return;[m
[31m-    }[m
[31m-    default: {[m
[31m-      primaryexp(ls, v);[m
[31m-      return;[m
[31m-    }[m
[31m-  }[m
[31m-  luaX_next(ls);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static UnOpr getunopr (int op) {[m
[31m-  switch (op) {[m
[31m-    case TK_NOT: return OPR_NOT;[m
[31m-    case '-': return OPR_MINUS;[m
[31m-    case '#': return OPR_LEN;[m
[31m-    default: return OPR_NOUNOPR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static BinOpr getbinopr (int op) {[m
[31m-  switch (op) {[m
[31m-    case '+': return OPR_ADD;[m
[31m-    case '-': return OPR_SUB;[m
[31m-    case '*': return OPR_MUL;[m
[31m-    case '/': return OPR_DIV;[m
[31m-    case '%': return OPR_MOD;[m
[31m-    case '^': return OPR_POW;[m
[31m-    case TK_CONCAT: return OPR_CONCAT;[m
[31m-    case TK_NE: return OPR_NE;[m
[31m-    case TK_EQ: return OPR_EQ;[m
[31m-    case '<': return OPR_LT;[m
[31m-    case TK_LE: return OPR_LE;[m
[31m-    case '>': return OPR_GT;[m
[31m-    case TK_GE: return OPR_GE;[m
[31m-    case TK_AND: return OPR_AND;[m
[31m-    case TK_OR: return OPR_OR;[m
[31m-    default: return OPR_NOBINOPR;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const struct {[m
[31m-  lu_byte left;  /* left priority for each binary operator */[m
[31m-  lu_byte right; /* right priority */[m
[31m-} priority[] = {  /* ORDER OPR */[m
[31m-   {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7},  /* `+' `-' `/' `%' */[m
[31m-   {10, 9}, {5, 4},                 /* power and concat (right associative) */[m
[31m-   {3, 3}, {3, 3},                  /* equality and inequality */[m
[31m-   {3, 3}, {3, 3}, {3, 3}, {3, 3},  /* order */[m
[31m-   {2, 2}, {1, 1}                   /* logical (and/or) */[m
[31m-};[m
[31m-[m
[31m-#define UNARY_PRIORITY	8  /* priority for unary operators */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** subexpr -> (simpleexp | unop subexpr) { binop subexpr }[m
[31m-** where `binop' is any binary operator with a priority higher than `limit'[m
[31m-*/[m
[31m-static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) {[m
[31m-  BinOpr op;[m
[31m-  UnOpr uop;[m
[31m-  enterlevel(ls);[m
[31m-  uop = getunopr(ls->t.token);[m
[31m-  if (uop != OPR_NOUNOPR) {[m
[31m-    luaX_next(ls);[m
[31m-    subexpr(ls, v, UNARY_PRIORITY);[m
[31m-    luaK_prefix(ls->fs, uop, v);[m
[31m-  }[m
[31m-  else simpleexp(ls, v);[m
[31m-  /* expand while operators have priorities higher than `limit' */[m
[31m-  op = getbinopr(ls->t.token);[m
[31m-  while (op != OPR_NOBINOPR && priority[op].left > limit) {[m
[31m-    expdesc v2;[m
[31m-    BinOpr nextop;[m
[31m-    luaX_next(ls);[m
[31m-    luaK_infix(ls->fs, op, v);[m
[31m-    /* read sub-expression with higher priority */[m
[31m-    nextop = subexpr(ls, &v2, priority[op].right);[m
[31m-    luaK_posfix(ls->fs, op, v, &v2);[m
[31m-    op = nextop;[m
[31m-  }[m
[31m-  leavelevel(ls);[m
[31m-  return op;  /* return first untreated operator */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void expr (LexState *ls, expdesc *v) {[m
[31m-  subexpr(ls, v, 0);[m
[31m-}[m
[31m-[m
[31m-/* }==================================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Rules for Statements[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static int block_follow (int token) {[m
[31m-  switch (token) {[m
[31m-    case TK_ELSE: case TK_ELSEIF: case TK_END:[m
[31m-    case TK_UNTIL: case TK_EOS:[m
[31m-      return 1;[m
[31m-    default: return 0;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void block (LexState *ls) {[m
[31m-  /* block -> chunk */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BlockCnt bl;[m
[31m-  enterblock(fs, &bl, 0);[m
[31m-  chunk(ls);[m
[31m-  lua_assert(bl.breaklist == NO_JUMP);[m
[31m-  leaveblock(fs);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** structure to chain all variables in the left-hand side of an[m
[31m-** assignment[m
[31m-*/[m
[31m-struct LHS_assign {[m
[31m-  struct LHS_assign *prev;[m
[31m-  expdesc v;  /* variable (global, local, upvalue, or indexed) */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** check whether, in an assignment to a local variable, the local variable[m
[31m-** is needed in a previous assignment (to a table). If so, save original[m
[31m-** local value in a safe place and use this safe copy in the previous[m
[31m-** assignment.[m
[31m-*/[m
[31m-static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int extra = fs->freereg;  /* eventual position to save local variable */[m
[31m-  int conflict = 0;[m
[31m-  for (; lh; lh = lh->prev) {[m
[31m-    if (lh->v.k == VINDEXED) {[m
[31m-      if (lh->v.u.s.info == v->u.s.info) {  /* conflict? */[m
[31m-        conflict = 1;[m
[31m-        lh->v.u.s.info = extra;  /* previous assignment will use safe copy */[m
[31m-      }[m
[31m-      if (lh->v.u.s.aux == v->u.s.info) {  /* conflict? */[m
[31m-        conflict = 1;[m
[31m-        lh->v.u.s.aux = extra;  /* previous assignment will use safe copy */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  if (conflict) {[m
[31m-    luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0);  /* make copy */[m
[31m-    luaK_reserveregs(fs, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {[m
[31m-  expdesc e;[m
[31m-  check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED,[m
[31m-                      "syntax error");[m
[31m-  if (testnext(ls, ',')) {  /* assignment -> `,' primaryexp assignment */[m
[31m-    struct LHS_assign nv;[m
[31m-    nv.prev = lh;[m
[31m-    primaryexp(ls, &nv.v);[m
[31m-    if (nv.v.k == VLOCAL)[m
[31m-      check_conflict(ls, lh, &nv.v);[m
[31m-    luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls,[m
[31m-                    "variables in assignment");[m
[31m-    assignment(ls, &nv, nvars+1);[m
[31m-  }[m
[31m-  else {  /* assignment -> `=' explist1 */[m
[31m-    int nexps;[m
[31m-    checknext(ls, '=');[m
[31m-    nexps = explist1(ls, &e);[m
[31m-    if (nexps != nvars) {[m
[31m-      adjust_assign(ls, nvars, nexps, &e);[m
[31m-      if (nexps > nvars)[m
[31m-        ls->fs->freereg -= nexps - nvars;  /* remove extra values */[m
[31m-    }[m
[31m-    else {[m
[31m-      luaK_setoneret(ls->fs, &e);  /* close last expression */[m
[31m-      luaK_storevar(ls->fs, &lh->v, &e);[m
[31m-      return;  /* avoid default */[m
[31m-    }[m
[31m-  }[m
[31m-  init_exp(&e, VNONRELOC, ls->fs->freereg-1);  /* default assignment */[m
[31m-  luaK_storevar(ls->fs, &lh->v, &e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int cond (LexState *ls) {[m
[31m-  /* cond -> exp */[m
[31m-  expdesc v;[m
[31m-  expr(ls, &v);  /* read condition */[m
[31m-  if (v.k == VNIL) v.k = VFALSE;  /* `falses' are all equal here */[m
[31m-  luaK_goiftrue(ls->fs, &v);[m
[31m-  return v.f;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void breakstat (LexState *ls) {[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  BlockCnt *bl = fs->bl;[m
[31m-  int upval = 0;[m
[31m-  while (bl && !bl->isbreakable) {[m
[31m-    upval |= bl->upval;[m
[31m-    bl = bl->previous;[m
[31m-  }[m
[31m-  if (!bl)[m
[31m-    luaX_syntaxerror(ls, "no loop to break");[m
[31m-  if (upval)[m
[31m-    luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0);[m
[31m-  luaK_concat(fs, &bl->breaklist, luaK_jump(fs));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void whilestat (LexState *ls, int line) {[m
[31m-  /* whilestat -> WHILE cond DO block END */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int whileinit;[m
[31m-  int condexit;[m
[31m-  BlockCnt bl;[m
[31m-  luaX_next(ls);  /* skip WHILE */[m
[31m-  whileinit = luaK_getlabel(fs);[m
[31m-  condexit = cond(ls);[m
[31m-  enterblock(fs, &bl, 1);[m
[31m-  checknext(ls, TK_DO);[m
[31m-  block(ls);[m
[31m-  luaK_patchlist(fs, luaK_jump(fs), whileinit);[m
[31m-  check_match(ls, TK_END, TK_WHILE, line);[m
[31m-  leaveblock(fs);[m
[31m-  luaK_patchtohere(fs, condexit);  /* false conditions finish the loop */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void repeatstat (LexState *ls, int line) {[m
[31m-  /* repeatstat -> REPEAT block UNTIL cond */[m
[31m-  int condexit;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int repeat_init = luaK_getlabel(fs);[m
[31m-  BlockCnt bl1, bl2;[m
[31m-  enterblock(fs, &bl1, 1);  /* loop block */[m
[31m-  enterblock(fs, &bl2, 0);  /* scope block */[m
[31m-  luaX_next(ls);  /* skip REPEAT */[m
[31m-  chunk(ls);[m
[31m-  check_match(ls, TK_UNTIL, TK_REPEAT, line);[m
[31m-  condexit = cond(ls);  /* read condition (inside scope block) */[m
[31m-  if (!bl2.upval) {  /* no upvalues? */[m
[31m-    leaveblock(fs);  /* finish scope */[m
[31m-    luaK_patchlist(ls->fs, condexit, repeat_init);  /* close the loop */[m
[31m-  }[m
[31m-  else {  /* complete semantics when there are upvalues */[m
[31m-    breakstat(ls);  /* if condition then break */[m
[31m-    luaK_patchtohere(ls->fs, condexit);  /* else... */[m
[31m-    leaveblock(fs);  /* finish scope... */[m
[31m-    luaK_patchlist(ls->fs, luaK_jump(fs), repeat_init);  /* and repeat */[m
[31m-  }[m
[31m-  leaveblock(fs);  /* finish loop */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int exp1 (LexState *ls) {[m
[31m-  expdesc e;[m
[31m-  int k;[m
[31m-  expr(ls, &e);[m
[31m-  k = e.k;[m
[31m-  luaK_exp2nextreg(ls->fs, &e);[m
[31m-  return k;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void forbody (LexState *ls, int base, int line, int nvars, int isnum) {[m
[31m-  /* forbody -> DO block */[m
[31m-  BlockCnt bl;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int prep, endfor;[m
[31m-  adjustlocalvars(ls, 3);  /* control variables */[m
[31m-  checknext(ls, TK_DO);[m
[31m-  prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs);[m
[31m-  enterblock(fs, &bl, 0);  /* scope for declared variables */[m
[31m-  adjustlocalvars(ls, nvars);[m
[31m-  luaK_reserveregs(fs, nvars);[m
[31m-  block(ls);[m
[31m-  leaveblock(fs);  /* end of scope for declared variables */[m
[31m-  luaK_patchtohere(fs, prep);[m
[31m-  endfor = (isnum) ? luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP) :[m
[31m-                     luaK_codeABC(fs, OP_TFORLOOP, base, 0, nvars);[m
[31m-  luaK_fixline(fs, line);  /* pretend that `OP_FOR' starts the loop */[m
[31m-  luaK_patchlist(fs, (isnum ? endfor : luaK_jump(fs)), prep + 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void fornum (LexState *ls, TString *varname, int line) {[m
[31m-  /* fornum -> NAME = exp1,exp1[,exp1] forbody */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int base = fs->freereg;[m
[31m-  new_localvarliteral(ls, "(for index)", 0);[m
[31m-  new_localvarliteral(ls, "(for limit)", 1);[m
[31m-  new_localvarliteral(ls, "(for step)", 2);[m
[31m-  new_localvar(ls, varname, 3);[m
[31m-  checknext(ls, '=');[m
[31m-  exp1(ls);  /* initial value */[m
[31m-  checknext(ls, ',');[m
[31m-  exp1(ls);  /* limit */[m
[31m-  if (testnext(ls, ','))[m
[31m-    exp1(ls);  /* optional step */[m
[31m-  else {  /* default step = 1 */[m
[31m-    luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1));[m
[31m-    luaK_reserveregs(fs, 1);[m
[31m-  }[m
[31m-  forbody(ls, base, line, 1, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void forlist (LexState *ls, TString *indexname) {[m
[31m-  /* forlist -> NAME {,NAME} IN explist1 forbody */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  expdesc e;[m
[31m-  int nvars = 0;[m
[31m-  int line;[m
[31m-  int base = fs->freereg;[m
[31m-  /* create control variables */[m
[31m-  new_localvarliteral(ls, "(for generator)", nvars++);[m
[31m-  new_localvarliteral(ls, "(for state)", nvars++);[m
[31m-  new_localvarliteral(ls, "(for control)", nvars++);[m
[31m-  /* create declared variables */[m
[31m-  new_localvar(ls, indexname, nvars++);[m
[31m-  while (testnext(ls, ','))[m
[31m-    new_localvar(ls, str_checkname(ls), nvars++);[m
[31m-  checknext(ls, TK_IN);[m
[31m-  line = ls->linenumber;[m
[31m-  adjust_assign(ls, 3, explist1(ls, &e), &e);[m
[31m-  luaK_checkstack(fs, 3);  /* extra space to call generator */[m
[31m-  forbody(ls, base, line, nvars - 3, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void forstat (LexState *ls, int line) {[m
[31m-  /* forstat -> FOR (fornum | forlist) END */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  TString *varname;[m
[31m-  BlockCnt bl;[m
[31m-  enterblock(fs, &bl, 1);  /* scope for loop and control variables */[m
[31m-  luaX_next(ls);  /* skip `for' */[m
[31m-  varname = str_checkname(ls);  /* first variable name */[m
[31m-  switch (ls->t.token) {[m
[31m-    case '=': fornum(ls, varname, line); break;[m
[31m-    case ',': case TK_IN: forlist(ls, varname); break;[m
[31m-    default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected");[m
[31m-  }[m
[31m-  check_match(ls, TK_END, TK_FOR, line);[m
[31m-  leaveblock(fs);  /* loop scope (`break' jumps to this point) */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int test_then_block (LexState *ls) {[m
[31m-  /* test_then_block -> [IF | ELSEIF] cond THEN block */[m
[31m-  int condexit;[m
[31m-  luaX_next(ls);  /* skip IF or ELSEIF */[m
[31m-  condexit = cond(ls);[m
[31m-  checknext(ls, TK_THEN);[m
[31m-  block(ls);  /* `then' part */[m
[31m-  return condexit;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void ifstat (LexState *ls, int line) {[m
[31m-  /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  int flist;[m
[31m-  int escapelist = NO_JUMP;[m
[31m-  flist = test_then_block(ls);  /* IF cond THEN block */[m
[31m-  while (ls->t.token == TK_ELSEIF) {[m
[31m-    luaK_concat(fs, &escapelist, luaK_jump(fs));[m
[31m-    luaK_patchtohere(fs, flist);[m
[31m-    flist = test_then_block(ls);  /* ELSEIF cond THEN block */[m
[31m-  }[m
[31m-  if (ls->t.token == TK_ELSE) {[m
[31m-    luaK_concat(fs, &escapelist, luaK_jump(fs));[m
[31m-    luaK_patchtohere(fs, flist);[m
[31m-    luaX_next(ls);  /* skip ELSE (after patch, for correct line info) */[m
[31m-    block(ls);  /* `else' part */[m
[31m-  }[m
[31m-  else[m
[31m-    luaK_concat(fs, &escapelist, flist);[m
[31m-  luaK_patchtohere(fs, escapelist);[m
[31m-  check_match(ls, TK_END, TK_IF, line);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void localfunc (LexState *ls) {[m
[31m-  expdesc v, b;[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  new_localvar(ls, str_checkname(ls), 0);[m
[31m-  init_exp(&v, VLOCAL, fs->freereg);[m
[31m-  luaK_reserveregs(fs, 1);[m
[31m-  adjustlocalvars(ls, 1);[m
[31m-  body(ls, &b, 0, ls->linenumber);[m
[31m-  luaK_storevar(fs, &v, &b);[m
[31m-  /* debug information will only see the variable after this point! */[m
[31m-  getlocvar(fs, fs->nactvar - 1).startpc = fs->pc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void localstat (LexState *ls) {[m
[31m-  /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */[m
[31m-  int nvars = 0;[m
[31m-  int nexps;[m
[31m-  expdesc e;[m
[31m-  do {[m
[31m-    new_localvar(ls, str_checkname(ls), nvars++);[m
[31m-  } while (testnext(ls, ','));[m
[31m-  if (testnext(ls, '='))[m
[31m-    nexps = explist1(ls, &e);[m
[31m-  else {[m
[31m-    e.k = VVOID;[m
[31m-    nexps = 0;[m
[31m-  }[m
[31m-  adjust_assign(ls, nvars, nexps, &e);[m
[31m-  adjustlocalvars(ls, nvars);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int funcname (LexState *ls, expdesc *v) {[m
[31m-  /* funcname -> NAME {field} [`:' NAME] */[m
[31m-  int needself = 0;[m
[31m-  singlevar(ls, v);[m
[31m-  while (ls->t.token == '.')[m
[31m-    field(ls, v);[m
[31m-  if (ls->t.token == ':') {[m
[31m-    needself = 1;[m
[31m-    field(ls, v);[m
[31m-  }[m
[31m-  return needself;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void funcstat (LexState *ls, int line) {[m
[31m-  /* funcstat -> FUNCTION funcname body */[m
[31m-  int needself;[m
[31m-  expdesc v, b;[m
[31m-  luaX_next(ls);  /* skip FUNCTION */[m
[31m-  needself = funcname(ls, &v);[m
[31m-  body(ls, &b, needself, line);[m
[31m-  luaK_storevar(ls->fs, &v, &b);[m
[31m-  luaK_fixline(ls->fs, line);  /* definition `happens' in the first line */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void exprstat (LexState *ls) {[m
[31m-  /* stat -> func | assignment */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  struct LHS_assign v;[m
[31m-  primaryexp(ls, &v.v);[m
[31m-  if (v.v.k == VCALL)  /* stat -> func */[m
[31m-    SETARG_C(getcode(fs, &v.v), 1);  /* call statement uses no results */[m
[31m-  else {  /* stat -> assignment */[m
[31m-    v.prev = NULL;[m
[31m-    assignment(ls, &v, 1);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void retstat (LexState *ls) {[m
[31m-  /* stat -> RETURN explist */[m
[31m-  FuncState *fs = ls->fs;[m
[31m-  expdesc e;[m
[31m-  int first, nret;  /* registers with returned values */[m
[31m-  luaX_next(ls);  /* skip RETURN */[m
[31m-  if (block_follow(ls->t.token) || ls->t.token == ';')[m
[31m-    first = nret = 0;  /* return no values */[m
[31m-  else {[m
[31m-    nret = explist1(ls, &e);  /* optional return values */[m
[31m-    if (hasmultret(e.k)) {[m
[31m-      luaK_setmultret(fs, &e);[m
[31m-      if (e.k == VCALL && nret == 1) {  /* tail call? */[m
[31m-        SET_OPCODE(getcode(fs,&e), OP_TAILCALL);[m
[31m-        lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar);[m
[31m-      }[m
[31m-      first = fs->nactvar;[m
[31m-      nret = LUA_MULTRET;  /* return all values */[m
[31m-    }[m
[31m-    else {[m
[31m-      if (nret == 1)  /* only one single value? */[m
[31m-        first = luaK_exp2anyreg(fs, &e);[m
[31m-      else {[m
[31m-        luaK_exp2nextreg(fs, &e);  /* values must go to the `stack' */[m
[31m-        first = fs->nactvar;  /* return all `active' values */[m
[31m-        lua_assert(nret == fs->freereg - first);[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-  luaK_ret(fs, first, nret);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int statement (LexState *ls) {[m
[31m-  int line = ls->linenumber;  /* may be needed for error messages */[m
[31m-  switch (ls->t.token) {[m
[31m-    case TK_IF: {  /* stat -> ifstat */[m
[31m-      ifstat(ls, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_WHILE: {  /* stat -> whilestat */[m
[31m-      whilestat(ls, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_DO: {  /* stat -> DO block END */[m
[31m-      luaX_next(ls);  /* skip DO */[m
[31m-      block(ls);[m
[31m-      check_match(ls, TK_END, TK_DO, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_FOR: {  /* stat -> forstat */[m
[31m-      forstat(ls, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_REPEAT: {  /* stat -> repeatstat */[m
[31m-      repeatstat(ls, line);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_FUNCTION: {[m
[31m-      funcstat(ls, line);  /* stat -> funcstat */[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_LOCAL: {  /* stat -> localstat */[m
[31m-      luaX_next(ls);  /* skip LOCAL */[m
[31m-      if (testnext(ls, TK_FUNCTION))  /* local function? */[m
[31m-        localfunc(ls);[m
[31m-      else[m
[31m-        localstat(ls);[m
[31m-      return 0;[m
[31m-    }[m
[31m-    case TK_RETURN: {  /* stat -> retstat */[m
[31m-      retstat(ls);[m
[31m-      return 1;  /* must be last statement */[m
[31m-    }[m
[31m-    case TK_BREAK: {  /* stat -> breakstat */[m
[31m-      luaX_next(ls);  /* skip BREAK */[m
[31m-      breakstat(ls);[m
[31m-      return 1;  /* must be last statement */[m
[31m-    }[m
[31m-    default: {[m
[31m-      exprstat(ls);[m
[31m-      return 0;  /* to avoid warnings */[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void chunk (LexState *ls) {[m
[31m-  /* chunk -> { stat [`;'] } */[m
[31m-  int islast = 0;[m
[31m-  enterlevel(ls);[m
[31m-  while (!islast && !block_follow(ls->t.token)) {[m
[31m-    islast = statement(ls);[m
[31m-    testnext(ls, ';');[m
[31m-    lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&[m
[31m-               ls->fs->freereg >= ls->fs->nactvar);[m
[31m-    ls->fs->freereg = ls->fs->nactvar;  /* free registers */[m
[31m-  }[m
[31m-  leavelevel(ls);[m
[31m-}[m
[31m-[m
[31m-/* }====================================================================== */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lparser.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lparser.h[m
[1mdeleted file mode 100644[m
[1mindex 18836af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lparser.h[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lua Parser[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lparser_h[m
[31m-#define lparser_h[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Expression descriptor[m
[31m-*/[m
[31m-[m
[31m-typedef enum {[m
[31m-  VVOID,	/* no value */[m
[31m-  VNIL,[m
[31m-  VTRUE,[m
[31m-  VFALSE,[m
[31m-  VK,		/* info = index of constant in `k' */[m
[31m-  VKNUM,	/* nval = numerical value */[m
[31m-  VLOCAL,	/* info = local register */[m
[31m-  VUPVAL,       /* info = index of upvalue in `upvalues' */[m
[31m-  VGLOBAL,	/* info = index of table; aux = index of global name in `k' */[m
[31m-  VINDEXED,	/* info = table register; aux = index register (or `k') */[m
[31m-  VJMP,		/* info = instruction pc */[m
[31m-  VRELOCABLE,	/* info = instruction pc */[m
[31m-  VNONRELOC,	/* info = result register */[m
[31m-  VCALL,	/* info = instruction pc */[m
[31m-  VVARARG	/* info = instruction pc */[m
[31m-} expkind;[m
[31m-[m
[31m-typedef struct expdesc {[m
[31m-  expkind k;[m
[31m-  union {[m
[31m-    struct { int info, aux; } s;[m
[31m-    lua_Number nval;[m
[31m-  } u;[m
[31m-  int t;  /* patch list of `exit when true' */[m
[31m-  int f;  /* patch list of `exit when false' */[m
[31m-} expdesc;[m
[31m-[m
[31m-[m
[31m-typedef struct upvaldesc {[m
[31m-  lu_byte k;[m
[31m-  lu_byte info;[m
[31m-} upvaldesc;[m
[31m-[m
[31m-[m
[31m-struct BlockCnt;  /* defined in lparser.c */[m
[31m-[m
[31m-[m
[31m-/* state needed to generate code for a given function */[m
[31m-typedef struct FuncState {[m
[31m-  Proto *f;  /* current function header */[m
[31m-  Table *h;  /* table to find (and reuse) elements in `k' */[m
[31m-  struct FuncState *prev;  /* enclosing function */[m
[31m-  struct LexState *ls;  /* lexical state */[m
[31m-  struct lua_State *L;  /* copy of the Lua state */[m
[31m-  struct BlockCnt *bl;  /* chain of current blocks */[m
[31m-  int pc;  /* next position to code (equivalent to `ncode') */[m
[31m-  int lasttarget;   /* `pc' of last `jump target' */[m
[31m-  int jpc;  /* list of pending jumps to `pc' */[m
[31m-  int freereg;  /* first free register */[m
[31m-  int nk;  /* number of elements in `k' */[m
[31m-  int np;  /* number of elements in `p' */[m
[31m-  short nlocvars;  /* number of elements in `locvars' */[m
[31m-  lu_byte nactvar;  /* number of active local variables */[m
[31m-  upvaldesc upvalues[LUAI_MAXUPVALUES];  /* upvalues */[m
[31m-  unsigned short actvar[LUAI_MAXVARS];  /* declared-variable stack */[m
[31m-} FuncState;[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,[m
[31m-                                            const char *name);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstate.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstate.c[m
[1mdeleted file mode 100644[m
[1mindex 4313b83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstate.c[m
[1m+++ /dev/null[m
[36m@@ -1,214 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $[m
[31m-** Global State[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define lstate_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "llex.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-[m
[31m-[m
[31m-#define state_size(x)	(sizeof(x) + LUAI_EXTRASPACE)[m
[31m-#define fromstate(l)	(cast(lu_byte *, (l)) - LUAI_EXTRASPACE)[m
[31m-#define tostate(l)   (cast(lua_State *, cast(lu_byte *, l) + LUAI_EXTRASPACE))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Main thread combines a thread state and the global state[m
[31m-*/[m
[31m-typedef struct LG {[m
[31m-  lua_State l;[m
[31m-  global_State g;[m
[31m-} LG;[m
[31m-  [m
[31m-[m
[31m-[m
[31m-static void stack_init (lua_State *L1, lua_State *L) {[m
[31m-  /* initialize CallInfo array */[m
[31m-  L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo);[m
[31m-  L1->ci = L1->base_ci;[m
[31m-  L1->size_ci = BASIC_CI_SIZE;[m
[31m-  L1->end_ci = L1->base_ci + L1->size_ci - 1;[m
[31m-  /* initialize stack array */[m
[31m-  L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue);[m
[31m-  L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK;[m
[31m-  L1->top = L1->stack;[m
[31m-  L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1;[m
[31m-  /* initialize first ci */[m
[31m-  L1->ci->func = L1->top;[m
[31m-  setnilvalue(L1->top++);  /* `function' entry for this `ci' */[m
[31m-  L1->base = L1->ci->base = L1->top;[m
[31m-  L1->ci->top = L1->top + LUA_MINSTACK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void freestack (lua_State *L, lua_State *L1) {[m
[31m-  luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo);[m
[31m-  luaM_freearray(L, L1->stack, L1->stacksize, TValue);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** open parts that may cause memory-allocation errors[m
[31m-*/[m
[31m-static void f_luaopen (lua_State *L, void *ud) {[m
[31m-  global_State *g = G(L);[m
[31m-  UNUSED(ud);[m
[31m-  stack_init(L, L);  /* init stack */[m
[31m-  sethvalue(L, gt(L), luaH_new(L, 0, 2));  /* table of globals */[m
[31m-  sethvalue(L, registry(L), luaH_new(L, 0, 2));  /* registry */[m
[31m-  luaS_resize(L, MINSTRTABSIZE);  /* initial size of string table */[m
[31m-  luaT_init(L);[m
[31m-  luaX_init(L);[m
[31m-  luaS_fix(luaS_newliteral(L, MEMERRMSG));[m
[31m-  g->GCthreshold = 4*g->totalbytes;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void preinit_state (lua_State *L, global_State *g) {[m
[31m-  G(L) = g;[m
[31m-  L->stack = NULL;[m
[31m-  L->stacksize = 0;[m
[31m-  L->errorJmp = NULL;[m
[31m-  L->hook = NULL;[m
[31m-  L->hookmask = 0;[m
[31m-  L->basehookcount = 0;[m
[31m-  L->allowhook = 1;[m
[31m-  resethookcount(L);[m
[31m-  L->openupval = NULL;[m
[31m-  L->size_ci = 0;[m
[31m-  L->nCcalls = L->baseCcalls = 0;[m
[31m-  L->status = 0;[m
[31m-  L->base_ci = L->ci = NULL;[m
[31m-  L->savedpc = NULL;[m
[31m-  L->errfunc = 0;[m
[31m-  setnilvalue(gt(L));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void close_state (lua_State *L) {[m
[31m-  global_State *g = G(L);[m
[31m-  luaF_close(L, L->stack);  /* close all upvalues for this thread */[m
[31m-  luaC_freeall(L);  /* collect all objects */[m
[31m-  lua_assert(g->rootgc == obj2gco(L));[m
[31m-  lua_assert(g->strt.nuse == 0);[m
[31m-  luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *);[m
[31m-  luaZ_freebuffer(L, &g->buff);[m
[31m-  freestack(L, L);[m
[31m-  lua_assert(g->totalbytes == sizeof(LG));[m
[31m-  (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-lua_State *luaE_newthread (lua_State *L) {[m
[31m-  lua_State *L1 = tostate(luaM_malloc(L, state_size(lua_State)));[m
[31m-  luaC_link(L, obj2gco(L1), LUA_TTHREAD);[m
[31m-  preinit_state(L1, G(L));[m
[31m-  stack_init(L1, L);  /* init stack */[m
[31m-  setobj2n(L, gt(L1), gt(L));  /* share table of globals */[m
[31m-  L1->hookmask = L->hookmask;[m
[31m-  L1->basehookcount = L->basehookcount;[m
[31m-  L1->hook = L->hook;[m
[31m-  resethookcount(L1);[m
[31m-  lua_assert(iswhite(obj2gco(L1)));[m
[31m-  return L1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaE_freethread (lua_State *L, lua_State *L1) {[m
[31m-  luaF_close(L1, L1->stack);  /* close all upvalues for this thread */[m
[31m-  lua_assert(L1->openupval == NULL);[m
[31m-  luai_userstatefree(L1);[m
[31m-  freestack(L, L1);[m
[31m-  luaM_freemem(L, fromstate(L1), state_size(lua_State));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {[m
[31m-  int i;[m
[31m-  lua_State *L;[m
[31m-  global_State *g;[m
[31m-  void *l = (*f)(ud, NULL, 0, state_size(LG));[m
[31m-  if (l == NULL) return NULL;[m
[31m-  L = tostate(l);[m
[31m-  g = &((LG *)L)->g;[m
[31m-  L->next = NULL;[m
[31m-  L->tt = LUA_TTHREAD;[m
[31m-  g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT);[m
[31m-  L->marked = luaC_white(g);[m
[31m-  set2bits(L->marked, FIXEDBIT, SFIXEDBIT);[m
[31m-  preinit_state(L, g);[m
[31m-  g->frealloc = f;[m
[31m-  g->ud = ud;[m
[31m-  g->mainthread = L;[m
[31m-  g->uvhead.u.l.prev = &g->uvhead;[m
[31m-  g->uvhead.u.l.next = &g->uvhead;[m
[31m-  g->GCthreshold = 0;  /* mark it as unfinished state */[m
[31m-  g->strt.size = 0;[m
[31m-  g->strt.nuse = 0;[m
[31m-  g->strt.hash = NULL;[m
[31m-  setnilvalue(registry(L));[m
[31m-  luaZ_initbuffer(L, &g->buff);[m
[31m-  g->panic = NULL;[m
[31m-  g->gcstate = GCSpause;[m
[31m-  g->rootgc = obj2gco(L);[m
[31m-  g->sweepstrgc = 0;[m
[31m-  g->sweepgc = &g->rootgc;[m
[31m-  g->gray = NULL;[m
[31m-  g->grayagain = NULL;[m
[31m-  g->weak = NULL;[m
[31m-  g->tmudata = NULL;[m
[31m-  g->totalbytes = sizeof(LG);[m
[31m-  g->gcpause = LUAI_GCPAUSE;[m
[31m-  g->gcstepmul = LUAI_GCMUL;[m
[31m-  g->gcdept = 0;[m
[31m-  for (i=0; i<NUM_TAGS; i++) g->mt[i] = NULL;[m
[31m-  if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) {[m
[31m-    /* memory allocation error: free partial state */[m
[31m-    close_state(L);[m
[31m-    L = NULL;[m
[31m-  }[m
[31m-  else[m
[31m-    luai_userstateopen(L);[m
[31m-  return L;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void callallgcTM (lua_State *L, void *ud) {[m
[31m-  UNUSED(ud);[m
[31m-  luaC_callGCTM(L);  /* call GC metamethods for all udata */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-LUA_API void lua_close (lua_State *L) {[m
[31m-  L = G(L)->mainthread;  /* only the main thread can be closed */[m
[31m-  lua_lock(L);[m
[31m-  luaF_close(L, L->stack);  /* close all upvalues for this thread */[m
[31m-  luaC_separateudata(L, 1);  /* separate udata that have GC metamethods */[m
[31m-  L->errfunc = 0;  /* no error function during GC metamethods */[m
[31m-  do {  /* repeat until no more errors */[m
[31m-    L->ci = L->base_ci;[m
[31m-    L->base = L->top = L->ci->base;[m
[31m-    L->nCcalls = L->baseCcalls = 0;[m
[31m-  } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0);[m
[31m-  lua_assert(G(L)->tmudata == NULL);[m
[31m-  luai_userstateclose(L);[m
[31m-  close_state(L);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstate.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstate.h[m
[1mdeleted file mode 100644[m
[1mindex 3bc575b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstate.h[m
[1m+++ /dev/null[m
[36m@@ -1,169 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $[m
[31m-** Global State[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lstate_h[m
[31m-#define lstate_h[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-struct lua_longjmp;  /* defined in ldo.c */[m
[31m-[m
[31m-[m
[31m-/* table of globals */[m
[31m-#define gt(L)	(&L->l_gt)[m
[31m-[m
[31m-/* registry */[m
[31m-#define registry(L)	(&G(L)->l_registry)[m
[31m-[m
[31m-[m
[31m-/* extra stack space to handle TM calls and some other extras */[m
[31m-#define EXTRA_STACK   5[m
[31m-[m
[31m-[m
[31m-#define BASIC_CI_SIZE           8[m
[31m-[m
[31m-#define BASIC_STACK_SIZE        (2*LUA_MINSTACK)[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct stringtable {[m
[31m-  GCObject **hash;[m
[31m-  lu_int32 nuse;  /* number of elements */[m
[31m-  int size;[m
[31m-} stringtable;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** informations about a call[m
[31m-*/[m
[31m-typedef struct CallInfo {[m
[31m-  StkId base;  /* base for this function */[m
[31m-  StkId func;  /* function index in the stack */[m
[31m-  StkId	top;  /* top for this function */[m
[31m-  const Instruction *savedpc;[m
[31m-  int nresults;  /* expected number of results from this function */[m
[31m-  int tailcalls;  /* number of tail calls lost under this entry */[m
[31m-} CallInfo;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define curr_func(L)	(clvalue(L->ci->func))[m
[31m-#define ci_func(ci)	(clvalue((ci)->func))[m
[31m-#define f_isLua(ci)	(!ci_func(ci)->c.isC)[m
[31m-#define isLua(ci)	(ttisfunction((ci)->func) && f_isLua(ci))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `global state', shared by all threads of this state[m
[31m-*/[m
[31m-typedef struct global_State {[m
[31m-  stringtable strt;  /* hash table for strings */[m
[31m-  lua_Alloc frealloc;  /* function to reallocate memory */[m
[31m-  void *ud;         /* auxiliary data to `frealloc' */[m
[31m-  lu_byte currentwhite;[m
[31m-  lu_byte gcstate;  /* state of garbage collector */[m
[31m-  int sweepstrgc;  /* position of sweep in `strt' */[m
[31m-  GCObject *rootgc;  /* list of all collectable objects */[m
[31m-  GCObject **sweepgc;  /* position of sweep in `rootgc' */[m
[31m-  GCObject *gray;  /* list of gray objects */[m
[31m-  GCObject *grayagain;  /* list of objects to be traversed atomically */[m
[31m-  GCObject *weak;  /* list of weak tables (to be cleared) */[m
[31m-  GCObject *tmudata;  /* last element of list of userdata to be GC */[m
[31m-  Mbuffer buff;  /* temporary buffer for string concatentation */[m
[31m-  lu_mem GCthreshold;[m
[31m-  lu_mem totalbytes;  /* number of bytes currently allocated */[m
[31m-  lu_mem estimate;  /* an estimate of number of bytes actually in use */[m
[31m-  lu_mem gcdept;  /* how much GC is `behind schedule' */[m
[31m-  int gcpause;  /* size of pause between successive GCs */[m
[31m-  int gcstepmul;  /* GC `granularity' */[m
[31m-  lua_CFunction panic;  /* to be called in unprotected errors */[m
[31m-  TValue l_registry;[m
[31m-  struct lua_State *mainthread;[m
[31m-  UpVal uvhead;  /* head of double-linked list of all open upvalues */[m
[31m-  struct Table *mt[NUM_TAGS];  /* metatables for basic types */[m
[31m-  TString *tmname[TM_N];  /* array with tag-method names */[m
[31m-} global_State;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `per thread' state[m
[31m-*/[m
[31m-struct lua_State {[m
[31m-  CommonHeader;[m
[31m-  lu_byte status;[m
[31m-  StkId top;  /* first free slot in the stack */[m
[31m-  StkId base;  /* base of current function */[m
[31m-  global_State *l_G;[m
[31m-  CallInfo *ci;  /* call info for current function */[m
[31m-  const Instruction *savedpc;  /* `savedpc' of current function */[m
[31m-  StkId stack_last;  /* last free slot in the stack */[m
[31m-  StkId stack;  /* stack base */[m
[31m-  CallInfo *end_ci;  /* points after end of ci array*/[m
[31m-  CallInfo *base_ci;  /* array of CallInfo's */[m
[31m-  int stacksize;[m
[31m-  int size_ci;  /* size of array `base_ci' */[m
[31m-  unsigned short nCcalls;  /* number of nested C calls */[m
[31m-  unsigned short baseCcalls;  /* nested C calls when resuming coroutine */[m
[31m-  lu_byte hookmask;[m
[31m-  lu_byte allowhook;[m
[31m-  int basehookcount;[m
[31m-  int hookcount;[m
[31m-  lua_Hook hook;[m
[31m-  TValue l_gt;  /* table of globals */[m
[31m-  TValue env;  /* temporary place for environments */[m
[31m-  GCObject *openupval;  /* list of open upvalues in this stack */[m
[31m-  GCObject *gclist;[m
[31m-  struct lua_longjmp *errorJmp;  /* current error recover point */[m
[31m-  ptrdiff_t errfunc;  /* current error handling function (stack index) */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define G(L)	(L->l_G)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Union of all collectable objects[m
[31m-*/[m
[31m-union GCObject {[m
[31m-  GCheader gch;[m
[31m-  union TString ts;[m
[31m-  union Udata u;[m
[31m-  union Closure cl;[m
[31m-  struct Table h;[m
[31m-  struct Proto p;[m
[31m-  struct UpVal uv;[m
[31m-  struct lua_State th;  /* thread */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* macros to convert a GCObject into a specific value */[m
[31m-#define rawgco2ts(o)	check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts))[m
[31m-#define gco2ts(o)	(&rawgco2ts(o)->tsv)[m
[31m-#define rawgco2u(o)	check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u))[m
[31m-#define gco2u(o)	(&rawgco2u(o)->uv)[m
[31m-#define gco2cl(o)	check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl))[m
[31m-#define gco2h(o)	check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h))[m
[31m-#define gco2p(o)	check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p))[m
[31m-#define gco2uv(o)	check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv))[m
[31m-#define ngcotouv(o) \[m
[31m-	check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv))[m
[31m-#define gco2th(o)	check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th))[m
[31m-[m
[31m-/* macro to convert any Lua object into a GCObject */[m
[31m-#define obj2gco(v)	(cast(GCObject *, (v)))[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC lua_State *luaE_newthread (lua_State *L);[m
[31m-LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstring.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstring.c[m
[1mdeleted file mode 100644[m
[1mindex 4911315..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstring.c[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** String table (keeps all strings handled by Lua)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lstring_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-void luaS_resize (lua_State *L, int newsize) {[m
[31m-  GCObject **newhash;[m
[31m-  stringtable *tb;[m
[31m-  int i;[m
[31m-  if (G(L)->gcstate == GCSsweepstring)[m
[31m-    return;  /* cannot resize during GC traverse */[m
[31m-  newhash = luaM_newvector(L, newsize, GCObject *);[m
[31m-  tb = &G(L)->strt;[m
[31m-  for (i=0; i<newsize; i++) newhash[i] = NULL;[m
[31m-  /* rehash */[m
[31m-  for (i=0; i<tb->size; i++) {[m
[31m-    GCObject *p = tb->hash[i];[m
[31m-    while (p) {  /* for each node in the list */[m
[31m-      GCObject *next = p->gch.next;  /* save next */[m
[31m-      unsigned int h = gco2ts(p)->hash;[m
[31m-      int h1 = lmod(h, newsize);  /* new position */[m
[31m-      lua_assert(cast_int(h%newsize) == lmod(h, newsize));[m
[31m-      p->gch.next = newhash[h1];  /* chain it */[m
[31m-      newhash[h1] = p;[m
[31m-      p = next;[m
[31m-    }[m
[31m-  }[m
[31m-  luaM_freearray(L, tb->hash, tb->size, TString *);[m
[31m-  tb->size = newsize;[m
[31m-  tb->hash = newhash;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static TString *newlstr (lua_State *L, const char *str, size_t l,[m
[31m-                                       unsigned int h) {[m
[31m-  TString *ts;[m
[31m-  stringtable *tb;[m
[31m-  if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))[m
[31m-    luaM_toobig(L);[m
[31m-  ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString)));[m
[31m-  ts->tsv.len = l;[m
[31m-  ts->tsv.hash = h;[m
[31m-  ts->tsv.marked = luaC_white(G(L));[m
[31m-  ts->tsv.tt = LUA_TSTRING;[m
[31m-  ts->tsv.reserved = 0;[m
[31m-  memcpy(ts+1, str, l*sizeof(char));[m
[31m-  ((char *)(ts+1))[l] = '\0';  /* ending 0 */[m
[31m-  tb = &G(L)->strt;[m
[31m-  h = lmod(h, tb->size);[m
[31m-  ts->tsv.next = tb->hash[h];  /* chain new entry */[m
[31m-  tb->hash[h] = obj2gco(ts);[m
[31m-  tb->nuse++;[m
[31m-  if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= MAX_INT/2)[m
[31m-    luaS_resize(L, tb->size*2);  /* too crowded */[m
[31m-  return ts;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {[m
[31m-  GCObject *o;[m
[31m-  unsigned int h = cast(unsigned int, l);  /* seed */[m
[31m-  size_t step = (l>>5)+1;  /* if string is too long, don't hash all its chars */[m
[31m-  size_t l1;[m
[31m-  for (l1=l; l1>=step; l1-=step)  /* compute hash */[m
[31m-    h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1]));[m
[31m-  for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)];[m
[31m-       o != NULL;[m
[31m-       o = o->gch.next) {[m
[31m-    TString *ts = rawgco2ts(o);[m
[31m-    if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) {[m
[31m-      /* string may be dead */[m
[31m-      if (isdead(G(L), o)) changewhite(o);[m
[31m-      return ts;[m
[31m-    }[m
[31m-  }[m
[31m-  return newlstr(L, str, l, h);  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {[m
[31m-  Udata *u;[m
[31m-  if (s > MAX_SIZET - sizeof(Udata))[m
[31m-    luaM_toobig(L);[m
[31m-  u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata)));[m
[31m-  u->uv.marked = luaC_white(G(L));  /* is not finalized */[m
[31m-  u->uv.tt = LUA_TUSERDATA;[m
[31m-  u->uv.len = s;[m
[31m-  u->uv.metatable = NULL;[m
[31m-  u->uv.env = e;[m
[31m-  /* chain it on udata list (after main thread) */[m
[31m-  u->uv.next = G(L)->mainthread->next;[m
[31m-  G(L)->mainthread->next = obj2gco(u);[m
[31m-  return u;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstring.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstring.h[m
[1mdeleted file mode 100644[m
[1mindex 73a2ff8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstring.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** String table (keep all strings handled by Lua)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lstring_h[m
[31m-#define lstring_h[m
[31m-[m
[31m-[m
[31m-#include "lgc.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-[m
[31m-[m
[31m-#define sizestring(s)	(sizeof(union TString)+((s)->len+1)*sizeof(char))[m
[31m-[m
[31m-#define sizeudata(u)	(sizeof(union Udata)+(u)->len)[m
[31m-[m
[31m-#define luaS_new(L, s)	(luaS_newlstr(L, s, strlen(s)))[m
[31m-#define luaS_newliteral(L, s)	(luaS_newlstr(L, "" s, \[m
[31m-                                 (sizeof(s)/sizeof(char))-1))[m
[31m-[m
[31m-#define luaS_fix(s)	l_setbit((s)->tsv.marked, FIXEDBIT)[m
[31m-[m
[31m-LUAI_FUNC void luaS_resize (lua_State *L, int newsize);[m
[31m-LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e);[m
[31m-LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstrlib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstrlib.c[m
[1mdeleted file mode 100644[m
[1mindex 7a03489..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lstrlib.c[m
[1m+++ /dev/null[m
[36m@@ -1,871 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lstrlib.c,v 1.132.1.5 2010/05/14 15:34:19 roberto Exp $[m
[31m-** Standard library for string operations and pattern-matching[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <stddef.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lstrlib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-/* macro to `unsign' a character */[m
[31m-#define uchar(c)        ((unsigned char)(c))[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int str_len (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  luaL_checklstring(L, 1, &l);[m
[31m-  lua_pushinteger(L, l);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {[m
[31m-  /* relative string position: negative means back from end */[m
[31m-  if (pos < 0) pos += (ptrdiff_t)len + 1;[m
[31m-  return (pos >= 0) ? pos : 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_sub (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l);[m
[31m-  ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l);[m
[31m-  if (start < 1) start = 1;[m
[31m-  if (end > (ptrdiff_t)l) end = (ptrdiff_t)l;[m
[31m-  if (start <= end)[m
[31m-    lua_pushlstring(L, s+start-1, end-start+1);[m
[31m-  else lua_pushliteral(L, "");[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_reverse (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  luaL_Buffer b;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while (l--) luaL_addchar(&b, s[l]);[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_lower (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  size_t i;[m
[31m-  luaL_Buffer b;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (i=0; i<l; i++)[m
[31m-    luaL_addchar(&b, tolower(uchar(s[i])));[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_upper (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  size_t i;[m
[31m-  luaL_Buffer b;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (i=0; i<l; i++)[m
[31m-    luaL_addchar(&b, toupper(uchar(s[i])));[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-static int str_rep (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  luaL_Buffer b;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  int n = luaL_checkint(L, 2);[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while (n-- > 0)[m
[31m-    luaL_addlstring(&b, s, l);[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_byte (lua_State *L) {[m
[31m-  size_t l;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l);[m
[31m-  ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l);[m
[31m-  ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l);[m
[31m-  int n, i;[m
[31m-  if (posi <= 0) posi = 1;[m
[31m-  if ((size_t)pose > l) pose = l;[m
[31m-  if (posi > pose) return 0;  /* empty interval; return no values */[m
[31m-  n = (int)(pose -  posi + 1);[m
[31m-  if (posi + n <= pose)  /* overflow? */[m
[31m-    luaL_error(L, "string slice too long");[m
[31m-  luaL_checkstack(L, n, "string slice too long");[m
[31m-  for (i=0; i<n; i++)[m
[31m-    lua_pushinteger(L, uchar(s[posi+i-1]));[m
[31m-  return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_char (lua_State *L) {[m
[31m-  int n = lua_gettop(L);  /* number of arguments */[m
[31m-  int i;[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (i=1; i<=n; i++) {[m
[31m-    int c = luaL_checkint(L, i);[m
[31m-    luaL_argcheck(L, uchar(c) == c, i, "invalid value");[m
[31m-    luaL_addchar(&b, uchar(c));[m
[31m-  }[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int writer (lua_State *L, const void* b, size_t size, void* B) {[m
[31m-  (void)L;[m
[31m-  luaL_addlstring((luaL_Buffer*) B, (const char *)b, size);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_dump (lua_State *L) {[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_checktype(L, 1, LUA_TFUNCTION);[m
[31m-  lua_settop(L, 1);[m
[31m-  luaL_buffinit(L,&b);[m
[31m-  if (lua_dump(L, writer, &b) != 0)[m
[31m-    luaL_error(L, "unable to dump given function");[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** PATTERN MATCHING[m
[31m-** =======================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#define CAP_UNFINISHED	(-1)[m
[31m-#define CAP_POSITION	(-2)[m
[31m-[m
[31m-typedef struct MatchState {[m
[31m-  const char *src_init;  /* init of source string */[m
[31m-  const char *src_end;  /* end (`\0') of source string */[m
[31m-  lua_State *L;[m
[31m-  int level;  /* total number of captures (finished or unfinished) */[m
[31m-  struct {[m
[31m-    const char *init;[m
[31m-    ptrdiff_t len;[m
[31m-  } capture[LUA_MAXCAPTURES];[m
[31m-} MatchState;[m
[31m-[m
[31m-[m
[31m-#define L_ESC		'%'[m
[31m-#define SPECIALS	"^$*+?.([%-"[m
[31m-[m
[31m-[m
[31m-static int check_capture (MatchState *ms, int l) {[m
[31m-  l -= '1';[m
[31m-  if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)[m
[31m-    return luaL_error(ms->L, "invalid capture index");[m
[31m-  return l;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int capture_to_close (MatchState *ms) {[m
[31m-  int level = ms->level;[m
[31m-  for (level--; level>=0; level--)[m
[31m-    if (ms->capture[level].len == CAP_UNFINISHED) return level;[m
[31m-  return luaL_error(ms->L, "invalid pattern capture");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *classend (MatchState *ms, const char *p) {[m
[31m-  switch (*p++) {[m
[31m-    case L_ESC: {[m
[31m-      if (*p == '\0')[m
[31m-        luaL_error(ms->L, "malformed pattern (ends with " LUA_QL("%%") ")");[m
[31m-      return p+1;[m
[31m-    }[m
[31m-    case '[': {[m
[31m-      if (*p == '^') p++;[m
[31m-      do {  /* look for a `]' */[m
[31m-        if (*p == '\0')[m
[31m-          luaL_error(ms->L, "malformed pattern (missing " LUA_QL("]") ")");[m
[31m-        if (*(p++) == L_ESC && *p != '\0')[m
[31m-          p++;  /* skip escapes (e.g. `%]') */[m
[31m-      } while (*p != ']');[m
[31m-      return p+1;[m
[31m-    }[m
[31m-    default: {[m
[31m-      return p;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int match_class (int c, int cl) {[m
[31m-  int res;[m
[31m-  switch (tolower(cl)) {[m
[31m-    case 'a' : res = isalpha(c); break;[m
[31m-    case 'c' : res = iscntrl(c); break;[m
[31m-    case 'd' : res = isdigit(c); break;[m
[31m-    case 'l' : res = islower(c); break;[m
[31m-    case 'p' : res = ispunct(c); break;[m
[31m-    case 's' : res = isspace(c); break;[m
[31m-    case 'u' : res = isupper(c); break;[m
[31m-    case 'w' : res = isalnum(c); break;[m
[31m-    case 'x' : res = isxdigit(c); break;[m
[31m-    case 'z' : res = (c == 0); break;[m
[31m-    default: return (cl == c);[m
[31m-  }[m
[31m-  return (islower(cl) ? res : !res);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int matchbracketclass (int c, const char *p, const char *ec) {[m
[31m-  int sig = 1;[m
[31m-  if (*(p+1) == '^') {[m
[31m-    sig = 0;[m
[31m-    p++;  /* skip the `^' */[m
[31m-  }[m
[31m-  while (++p < ec) {[m
[31m-    if (*p == L_ESC) {[m
[31m-      p++;[m
[31m-      if (match_class(c, uchar(*p)))[m
[31m-        return sig;[m
[31m-    }[m
[31m-    else if ((*(p+1) == '-') && (p+2 < ec)) {[m
[31m-      p+=2;[m
[31m-      if (uchar(*(p-2)) <= c && c <= uchar(*p))[m
[31m-        return sig;[m
[31m-    }[m
[31m-    else if (uchar(*p) == c) return sig;[m
[31m-  }[m
[31m-  return !sig;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int singlematch (int c, const char *p, const char *ep) {[m
[31m-  switch (*p) {[m
[31m-    case '.': return 1;  /* matches any char */[m
[31m-    case L_ESC: return match_class(c, uchar(*(p+1)));[m
[31m-    case '[': return matchbracketclass(c, p, ep-1);[m
[31m-    default:  return (uchar(*p) == c);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *match (MatchState *ms, const char *s, const char *p);[m
[31m-[m
[31m-[m
[31m-static const char *matchbalance (MatchState *ms, const char *s,[m
[31m-                                   const char *p) {[m
[31m-  if (*p == 0 || *(p+1) == 0)[m
[31m-    luaL_error(ms->L, "unbalanced pattern");[m
[31m-  if (*s != *p) return NULL;[m
[31m-  else {[m
[31m-    int b = *p;[m
[31m-    int e = *(p+1);[m
[31m-    int cont = 1;[m
[31m-    while (++s < ms->src_end) {[m
[31m-      if (*s == e) {[m
[31m-        if (--cont == 0) return s+1;[m
[31m-      }[m
[31m-      else if (*s == b) cont++;[m
[31m-    }[m
[31m-  }[m
[31m-  return NULL;  /* string ends out of balance */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *max_expand (MatchState *ms, const char *s,[m
[31m-                                 const char *p, const char *ep) {[m
[31m-  ptrdiff_t i = 0;  /* counts maximum expand for item */[m
[31m-  while ((s+i)<ms->src_end && singlematch(uchar(*(s+i)), p, ep))[m
[31m-    i++;[m
[31m-  /* keeps trying to match with the maximum repetitions */[m
[31m-  while (i>=0) {[m
[31m-    const char *res = match(ms, (s+i), ep+1);[m
[31m-    if (res) return res;[m
[31m-    i--;  /* else didn't match; reduce 1 repetition to try again */[m
[31m-  }[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *min_expand (MatchState *ms, const char *s,[m
[31m-                                 const char *p, const char *ep) {[m
[31m-  for (;;) {[m
[31m-    const char *res = match(ms, s, ep+1);[m
[31m-    if (res != NULL)[m
[31m-      return res;[m
[31m-    else if (s<ms->src_end && singlematch(uchar(*s), p, ep))[m
[31m-      s++;  /* try with one more repetition */[m
[31m-    else return NULL;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *start_capture (MatchState *ms, const char *s,[m
[31m-                                    const char *p, int what) {[m
[31m-  const char *res;[m
[31m-  int level = ms->level;[m
[31m-  if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures");[m
[31m-  ms->capture[level].init = s;[m
[31m-  ms->capture[level].len = what;[m
[31m-  ms->level = level+1;[m
[31m-  if ((res=match(ms, s, p)) == NULL)  /* match failed? */[m
[31m-    ms->level--;  /* undo capture */[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *end_capture (MatchState *ms, const char *s,[m
[31m-                                  const char *p) {[m
[31m-  int l = capture_to_close(ms);[m
[31m-  const char *res;[m
[31m-  ms->capture[l].len = s - ms->capture[l].init;  /* close capture */[m
[31m-  if ((res = match(ms, s, p)) == NULL)  /* match failed? */[m
[31m-    ms->capture[l].len = CAP_UNFINISHED;  /* undo capture */[m
[31m-  return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *match_capture (MatchState *ms, const char *s, int l) {[m
[31m-  size_t len;[m
[31m-  l = check_capture(ms, l);[m
[31m-  len = ms->capture[l].len;[m
[31m-  if ((size_t)(ms->src_end-s) >= len &&[m
[31m-      memcmp(ms->capture[l].init, s, len) == 0)[m
[31m-    return s+len;[m
[31m-  else return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *match (MatchState *ms, const char *s, const char *p) {[m
[31m-  init: /* using goto's to optimize tail recursion */[m
[31m-  switch (*p) {[m
[31m-    case '(': {  /* start capture */[m
[31m-      if (*(p+1) == ')')  /* position capture? */[m
[31m-        return start_capture(ms, s, p+2, CAP_POSITION);[m
[31m-      else[m
[31m-        return start_capture(ms, s, p+1, CAP_UNFINISHED);[m
[31m-    }[m
[31m-    case ')': {  /* end capture */[m
[31m-      return end_capture(ms, s, p+1);[m
[31m-    }[m
[31m-    case L_ESC: {[m
[31m-      switch (*(p+1)) {[m
[31m-        case 'b': {  /* balanced string? */[m
[31m-          s = matchbalance(ms, s, p+2);[m
[31m-          if (s == NULL) return NULL;[m
[31m-          p+=4; goto init;  /* else return match(ms, s, p+4); */[m
[31m-        }[m
[31m-        case 'f': {  /* frontier? */[m
[31m-          const char *ep; char previous;[m
[31m-          p += 2;[m
[31m-          if (*p != '[')[m
[31m-            luaL_error(ms->L, "missing " LUA_QL("[") " after "[m
[31m-                               LUA_QL("%%f") " in pattern");[m
[31m-          ep = classend(ms, p);  /* points to what is next */[m
[31m-          previous = (s == ms->src_init) ? '\0' : *(s-1);[m
[31m-          if (matchbracketclass(uchar(previous), p, ep-1) ||[m
[31m-             !matchbracketclass(uchar(*s), p, ep-1)) return NULL;[m
[31m-          p=ep; goto init;  /* else return match(ms, s, ep); */[m
[31m-        }[m
[31m-        default: {[m
[31m-          if (isdigit(uchar(*(p+1)))) {  /* capture results (%0-%9)? */[m
[31m-            s = match_capture(ms, s, uchar(*(p+1)));[m
[31m-            if (s == NULL) return NULL;[m
[31m-            p+=2; goto init;  /* else return match(ms, s, p+2) */[m
[31m-          }[m
[31m-          goto dflt;  /* case default */[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-    case '\0': {  /* end of pattern */[m
[31m-      return s;  /* match succeeded */[m
[31m-    }[m
[31m-    case '$': {[m
[31m-      if (*(p+1) == '\0')  /* is the `$' the last char in pattern? */[m
[31m-        return (s == ms->src_end) ? s : NULL;  /* check end of string */[m
[31m-      else goto dflt;[m
[31m-    }[m
[31m-    default: dflt: {  /* it is a pattern item */[m
[31m-      const char *ep = classend(ms, p);  /* points to what is next */[m
[31m-      int m = s<ms->src_end && singlematch(uchar(*s), p, ep);[m
[31m-      switch (*ep) {[m
[31m-        case '?': {  /* optional */[m
[31m-          const char *res;[m
[31m-          if (m && ((res=match(ms, s+1, ep+1)) != NULL))[m
[31m-            return res;[m
[31m-          p=ep+1; goto init;  /* else return match(ms, s, ep+1); */[m
[31m-        }[m
[31m-        case '*': {  /* 0 or more repetitions */[m
[31m-          return max_expand(ms, s, p, ep);[m
[31m-        }[m
[31m-        case '+': {  /* 1 or more repetitions */[m
[31m-          return (m ? max_expand(ms, s+1, p, ep) : NULL);[m
[31m-        }[m
[31m-        case '-': {  /* 0 or more repetitions (minimum) */[m
[31m-          return min_expand(ms, s, p, ep);[m
[31m-        }[m
[31m-        default: {[m
[31m-          if (!m) return NULL;[m
[31m-          s++; p=ep; goto init;  /* else return match(ms, s+1, ep); */[m
[31m-        }[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static const char *lmemfind (const char *s1, size_t l1,[m
[31m-                               const char *s2, size_t l2) {[m
[31m-  if (l2 == 0) return s1;  /* empty strings are everywhere */[m
[31m-  else if (l2 > l1) return NULL;  /* avoids a negative `l1' */[m
[31m-  else {[m
[31m-    const char *init;  /* to search for a `*s2' inside `s1' */[m
[31m-    l2--;  /* 1st char will be checked by `memchr' */[m
[31m-    l1 = l1-l2;  /* `s2' cannot be found after that */[m
[31m-    while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) {[m
[31m-      init++;   /* 1st char is already checked */[m
[31m-      if (memcmp(init, s2+1, l2) == 0)[m
[31m-        return init-1;[m
[31m-      else {  /* correct `l1' and `s1' to try again */[m
[31m-        l1 -= init-s1;[m
[31m-        s1 = init;[m
[31m-      }[m
[31m-    }[m
[31m-    return NULL;  /* not found */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void push_onecapture (MatchState *ms, int i, const char *s,[m
[31m-                                                    const char *e) {[m
[31m-  if (i >= ms->level) {[m
[31m-    if (i == 0)  /* ms->level == 0, too */[m
[31m-      lua_pushlstring(ms->L, s, e - s);  /* add whole match */[m
[31m-    else[m
[31m-      luaL_error(ms->L, "invalid capture index");[m
[31m-  }[m
[31m-  else {[m
[31m-    ptrdiff_t l = ms->capture[i].len;[m
[31m-    if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture");[m
[31m-    if (l == CAP_POSITION)[m
[31m-      lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1);[m
[31m-    else[m
[31m-      lua_pushlstring(ms->L, ms->capture[i].init, l);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int push_captures (MatchState *ms, const char *s, const char *e) {[m
[31m-  int i;[m
[31m-  int nlevels = (ms->level == 0 && s) ? 1 : ms->level;[m
[31m-  luaL_checkstack(ms->L, nlevels, "too many captures");[m
[31m-  for (i = 0; i < nlevels; i++)[m
[31m-    push_onecapture(ms, i, s, e);[m
[31m-  return nlevels;  /* number of strings pushed */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_find_aux (lua_State *L, int find) {[m
[31m-  size_t l1, l2;[m
[31m-  const char *s = luaL_checklstring(L, 1, &l1);[m
[31m-  const char *p = luaL_checklstring(L, 2, &l2);[m
[31m-  ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1;[m
[31m-  if (init < 0) init = 0;[m
[31m-  else if ((size_t)(init) > l1) init = (ptrdiff_t)l1;[m
[31m-  if (find && (lua_toboolean(L, 4) ||  /* explicit request? */[m
[31m-      strpbrk(p, SPECIALS) == NULL)) {  /* or no special characters? */[m
[31m-    /* do a plain search */[m
[31m-    const char *s2 = lmemfind(s+init, l1-init, p, l2);[m
[31m-    if (s2) {[m
[31m-      lua_pushinteger(L, s2-s+1);[m
[31m-      lua_pushinteger(L, s2-s+l2);[m
[31m-      return 2;[m
[31m-    }[m
[31m-  }[m
[31m-  else {[m
[31m-    MatchState ms;[m
[31m-    int anchor = (*p == '^') ? (p++, 1) : 0;[m
[31m-    const char *s1=s+init;[m
[31m-    ms.L = L;[m
[31m-    ms.src_init = s;[m
[31m-    ms.src_end = s+l1;[m
[31m-    do {[m
[31m-      const char *res;[m
[31m-      ms.level = 0;[m
[31m-      if ((res=match(&ms, s1, p)) != NULL) {[m
[31m-        if (find) {[m
[31m-          lua_pushinteger(L, s1-s+1);  /* start */[m
[31m-          lua_pushinteger(L, res-s);   /* end */[m
[31m-          return push_captures(&ms, NULL, 0) + 2;[m
[31m-        }[m
[31m-        else[m
[31m-          return push_captures(&ms, s1, res);[m
[31m-      }[m
[31m-    } while (s1++ < ms.src_end && !anchor);[m
[31m-  }[m
[31m-  lua_pushnil(L);  /* not found */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_find (lua_State *L) {[m
[31m-  return str_find_aux(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_match (lua_State *L) {[m
[31m-  return str_find_aux(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int gmatch_aux (lua_State *L) {[m
[31m-  MatchState ms;[m
[31m-  size_t ls;[m
[31m-  const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls);[m
[31m-  const char *p = lua_tostring(L, lua_upvalueindex(2));[m
[31m-  const char *src;[m
[31m-  ms.L = L;[m
[31m-  ms.src_init = s;[m
[31m-  ms.src_end = s+ls;[m
[31m-  for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3));[m
[31m-       src <= ms.src_end;[m
[31m-       src++) {[m
[31m-    const char *e;[m
[31m-    ms.level = 0;[m
[31m-    if ((e = match(&ms, src, p)) != NULL) {[m
[31m-      lua_Integer newstart = e-s;[m
[31m-      if (e == src) newstart++;  /* empty match? go at least one position */[m
[31m-      lua_pushinteger(L, newstart);[m
[31m-      lua_replace(L, lua_upvalueindex(3));[m
[31m-      return push_captures(&ms, src, e);[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* not found */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int gmatch (lua_State *L) {[m
[31m-  luaL_checkstring(L, 1);[m
[31m-  luaL_checkstring(L, 2);[m
[31m-  lua_settop(L, 2);[m
[31m-  lua_pushinteger(L, 0);[m
[31m-  lua_pushcclosure(L, gmatch_aux, 3);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int gfind_nodef (lua_State *L) {[m
[31m-  return luaL_error(L, LUA_QL("string.gfind") " was renamed to "[m
[31m-                       LUA_QL("string.gmatch"));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void add_s (MatchState *ms, luaL_Buffer *b, const char *s,[m
[31m-                                                   const char *e) {[m
[31m-  size_t l, i;[m
[31m-  const char *news = lua_tolstring(ms->L, 3, &l);[m
[31m-  for (i = 0; i < l; i++) {[m
[31m-    if (news[i] != L_ESC)[m
[31m-      luaL_addchar(b, news[i]);[m
[31m-    else {[m
[31m-      i++;  /* skip ESC */[m
[31m-      if (!isdigit(uchar(news[i])))[m
[31m-        luaL_addchar(b, news[i]);[m
[31m-      else if (news[i] == '0')[m
[31m-          luaL_addlstring(b, s, e - s);[m
[31m-      else {[m
[31m-        push_onecapture(ms, news[i] - '1', s, e);[m
[31m-        luaL_addvalue(b);  /* add capture to accumulated result */[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,[m
[31m-                                                       const char *e) {[m
[31m-  lua_State *L = ms->L;[m
[31m-  switch (lua_type(L, 3)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-    case LUA_TSTRING: {[m
[31m-      add_s(ms, b, s, e);[m
[31m-      return;[m
[31m-    }[m
[31m-    case LUA_TFUNCTION: {[m
[31m-      int n;[m
[31m-      lua_pushvalue(L, 3);[m
[31m-      n = push_captures(ms, s, e);[m
[31m-      lua_call(L, n, 1);[m
[31m-      break;[m
[31m-    }[m
[31m-    case LUA_TTABLE: {[m
[31m-      push_onecapture(ms, 0, s, e);[m
[31m-      lua_gettable(L, 3);[m
[31m-      break;[m
[31m-    }[m
[31m-  }[m
[31m-  if (!lua_toboolean(L, -1)) {  /* nil or false? */[m
[31m-    lua_pop(L, 1);[m
[31m-    lua_pushlstring(L, s, e - s);  /* keep original text */[m
[31m-  }[m
[31m-  else if (!lua_isstring(L, -1))[m
[31m-    luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); [m
[31m-  luaL_addvalue(b);  /* add result to accumulator */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_gsub (lua_State *L) {[m
[31m-  size_t srcl;[m
[31m-  const char *src = luaL_checklstring(L, 1, &srcl);[m
[31m-  const char *p = luaL_checkstring(L, 2);[m
[31m-  int  tr = lua_type(L, 3);[m
[31m-  int max_s = luaL_optint(L, 4, srcl+1);[m
[31m-  int anchor = (*p == '^') ? (p++, 1) : 0;[m
[31m-  int n = 0;[m
[31m-  MatchState ms;[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||[m
[31m-                   tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,[m
[31m-                      "string/function/table expected");[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  ms.L = L;[m
[31m-  ms.src_init = src;[m
[31m-  ms.src_end = src+srcl;[m
[31m-  while (n < max_s) {[m
[31m-    const char *e;[m
[31m-    ms.level = 0;[m
[31m-    e = match(&ms, src, p);[m
[31m-    if (e) {[m
[31m-      n++;[m
[31m-      add_value(&ms, &b, src, e);[m
[31m-    }[m
[31m-    if (e && e>src) /* non empty match? */[m
[31m-      src = e;  /* skip it */[m
[31m-    else if (src < ms.src_end)[m
[31m-      luaL_addchar(&b, *src++);[m
[31m-    else break;[m
[31m-    if (anchor) break;[m
[31m-  }[m
[31m-  luaL_addlstring(&b, src, ms.src_end-src);[m
[31m-  luaL_pushresult(&b);[m
[31m-  lua_pushinteger(L, n);  /* number of substitutions */[m
[31m-  return 2;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */[m
[31m-#define MAX_ITEM	512[m
[31m-/* valid flags in a format specification */[m
[31m-#define FLAGS	"-+ #0"[m
[31m-/*[m
[31m-** maximum size of each format specification (such as '%-099.99d')[m
[31m-** (+10 accounts for %99.99x plus margin of error)[m
[31m-*/[m
[31m-#define MAX_FORMAT	(sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10)[m
[31m-[m
[31m-[m
[31m-static void addquoted (lua_State *L, luaL_Buffer *b, int arg) {[m
[31m-  size_t l;[m
[31m-  const char *s = luaL_checklstring(L, arg, &l);[m
[31m-  luaL_addchar(b, '"');[m
[31m-  while (l--) {[m
[31m-    switch (*s) {[m
[31m-      case '"': case '\\': case '\n': {[m
[31m-        luaL_addchar(b, '\\');[m
[31m-        luaL_addchar(b, *s);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '\r': {[m
[31m-        luaL_addlstring(b, "\\r", 2);[m
[31m-        break;[m
[31m-      }[m
[31m-      case '\0': {[m
[31m-        luaL_addlstring(b, "\\000", 4);[m
[31m-        break;[m
[31m-      }[m
[31m-      default: {[m
[31m-        luaL_addchar(b, *s);[m
[31m-        break;[m
[31m-      }[m
[31m-    }[m
[31m-    s++;[m
[31m-  }[m
[31m-  luaL_addchar(b, '"');[m
[31m-}[m
[31m-[m
[31m-static const char *scanformat (lua_State *L, const char *strfrmt, char *form) {[m
[31m-  const char *p = strfrmt;[m
[31m-  while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++;  /* skip flags */[m
[31m-  if ((size_t)(p - strfrmt) >= sizeof(FLAGS))[m
[31m-    luaL_error(L, "invalid format (repeated flags)");[m
[31m-  if (isdigit(uchar(*p))) p++;  /* skip width */[m
[31m-  if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */[m
[31m-  if (*p == '.') {[m
[31m-    p++;[m
[31m-    if (isdigit(uchar(*p))) p++;  /* skip precision */[m
[31m-    if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */[m
[31m-  }[m
[31m-  if (isdigit(uchar(*p)))[m
[31m-    luaL_error(L, "invalid format (width or precision too long)");[m
[31m-  *(form++) = '%';[m
[31m-  strncpy(form, strfrmt, p - strfrmt + 1);[m
[31m-  form += p - strfrmt + 1;[m
[31m-  *form = '\0';[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void addintlen (char *form) {[m
[31m-  size_t l = strlen(form);[m
[31m-  char spec = form[l - 1];[m
[31m-  strcpy(form + l - 1, LUA_INTFRMLEN);[m
[31m-  form[l + sizeof(LUA_INTFRMLEN) - 2] = spec;[m
[31m-  form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0';[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int str_format (lua_State *L) {[m
[31m-  int top = lua_gettop(L);[m
[31m-  int arg = 1;[m
[31m-  size_t sfl;[m
[31m-  const char *strfrmt = luaL_checklstring(L, arg, &sfl);[m
[31m-  const char *strfrmt_end = strfrmt+sfl;[m
[31m-  luaL_Buffer b;[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  while (strfrmt < strfrmt_end) {[m
[31m-    if (*strfrmt != L_ESC)[m
[31m-      luaL_addchar(&b, *strfrmt++);[m
[31m-    else if (*++strfrmt == L_ESC)[m
[31m-      luaL_addchar(&b, *strfrmt++);  /* %% */[m
[31m-    else { /* format item */[m
[31m-      char form[MAX_FORMAT];  /* to store the format (`%...') */[m
[31m-      char buff[MAX_ITEM];  /* to store the formatted item */[m
[31m-      if (++arg > top)[m
[31m-        luaL_argerror(L, arg, "no value");[m
[31m-      strfrmt = scanformat(L, strfrmt, form);[m
[31m-      switch (*strfrmt++) {[m
[31m-        case 'c': {[m
[31m-          sprintf(buff, form, (int)luaL_checknumber(L, arg));[m
[31m-          break;[m
[31m-        }[m
[31m-        case 'd':  case 'i': {[m
[31m-          addintlen(form);[m
[31m-          sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg));[m
[31m-          break;[m
[31m-        }[m
[31m-        case 'o':  case 'u':  case 'x':  case 'X': {[m
[31m-          addintlen(form);[m
[31m-          sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg));[m
[31m-          break;[m
[31m-        }[m
[31m-        case 'e':  case 'E': case 'f':[m
[31m-        case 'g': case 'G': {[m
[31m-          sprintf(buff, form, (double)luaL_checknumber(L, arg));[m
[31m-          break;[m
[31m-        }[m
[31m-        case 'q': {[m
[31m-          addquoted(L, &b, arg);[m
[31m-          continue;  /* skip the 'addsize' at the end */[m
[31m-        }[m
[31m-        case 's': {[m
[31m-          size_t l;[m
[31m-          const char *s = luaL_checklstring(L, arg, &l);[m
[31m-          if (!strchr(form, '.') && l >= 100) {[m
[31m-            /* no precision and string is too long to be formatted;[m
[31m-               keep original string */[m
[31m-            lua_pushvalue(L, arg);[m
[31m-            luaL_addvalue(&b);[m
[31m-            continue;  /* skip the `addsize' at the end */[m
[31m-          }[m
[31m-          else {[m
[31m-            sprintf(buff, form, s);[m
[31m-            break;[m
[31m-          }[m
[31m-        }[m
[31m-        default: {  /* also treat cases `pnLlh' */[m
[31m-          return luaL_error(L, "invalid option " LUA_QL("%%%c") " to "[m
[31m-                               LUA_QL("format"), *(strfrmt - 1));[m
[31m-        }[m
[31m-      }[m
[31m-      luaL_addlstring(&b, buff, strlen(buff));[m
[31m-    }[m
[31m-  }[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg strlib[] = {[m
[31m-  {"byte", str_byte},[m
[31m-  {"char", str_char},[m
[31m-  {"dump", str_dump},[m
[31m-  {"find", str_find},[m
[31m-  {"format", str_format},[m
[31m-  {"gfind", gfind_nodef},[m
[31m-  {"gmatch", gmatch},[m
[31m-  {"gsub", str_gsub},[m
[31m-  {"len", str_len},[m
[31m-  {"lower", str_lower},[m
[31m-  {"match", str_match},[m
[31m-  {"rep", str_rep},[m
[31m-  {"reverse", str_reverse},[m
[31m-  {"sub", str_sub},[m
[31m-  {"upper", str_upper},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void createmetatable (lua_State *L) {[m
[31m-  lua_createtable(L, 0, 1);  /* create metatable for strings */[m
[31m-  lua_pushliteral(L, "");  /* dummy string */[m
[31m-  lua_pushvalue(L, -2);[m
[31m-  lua_setmetatable(L, -2);  /* set string metatable */[m
[31m-  lua_pop(L, 1);  /* pop dummy string */[m
[31m-  lua_pushvalue(L, -2);  /* string library... */[m
[31m-  lua_setfield(L, -2, "__index");  /* ...is the __index metamethod */[m
[31m-  lua_pop(L, 1);  /* pop metatable */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Open string library[m
[31m-*/[m
[31m-LUALIB_API int luaopen_string (lua_State *L) {[m
[31m-  luaL_register(L, LUA_STRLIBNAME, strlib);[m
[31m-#if defined(LUA_COMPAT_GFIND)[m
[31m-  lua_getfield(L, -1, "gmatch");[m
[31m-  lua_setfield(L, -2, "gfind");[m
[31m-#endif[m
[31m-  createmetatable(L);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltable.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltable.c[m
[1mdeleted file mode 100644[m
[1mindex ec84f4f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltable.c[m
[1m+++ /dev/null[m
[36m@@ -1,588 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltable.c,v 2.32.1.2 2007/12/28 15:32:23 roberto Exp $[m
[31m-** Lua tables (hash)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Implementation of tables (aka arrays, objects, or hash tables).[m
[31m-** Tables keep its elements in two parts: an array part and a hash part.[m
[31m-** Non-negative integer keys are all candidates to be kept in the array[m
[31m-** part. The actual size of the array is the largest `n' such that at[m
[31m-** least half the slots between 0 and n are in use.[m
[31m-** Hash uses a mix of chained scatter table with Brent's variation.[m
[31m-** A main invariant of these tables is that, if an element is not[m
[31m-** in its main position (i.e. the `original' position that its hash gives[m
[31m-** to it), then the colliding element is in its own main position.[m
[31m-** Hence even when the load factor reaches 100%, performance remains good.[m
[31m-*/[m
[31m-[m
[31m-#include <math.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define ltable_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "ltable.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** max size of array part is 2^MAXBITS[m
[31m-*/[m
[31m-#if LUAI_BITSINT > 26[m
[31m-#define MAXBITS		26[m
[31m-#else[m
[31m-#define MAXBITS		(LUAI_BITSINT-2)[m
[31m-#endif[m
[31m-[m
[31m-#define MAXASIZE	(1 << MAXBITS)[m
[31m-[m
[31m-[m
[31m-#define hashpow2(t,n)      (gnode(t, lmod((n), sizenode(t))))[m
[31m-  [m
[31m-#define hashstr(t,str)  hashpow2(t, (str)->tsv.hash)[m
[31m-#define hashboolean(t,p)        hashpow2(t, p)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** for some types, it is better to avoid modulus by power of 2, as[m
[31m-** they tend to have many 2 factors.[m
[31m-*/[m
[31m-#define hashmod(t,n)	(gnode(t, ((n) % ((sizenode(t)-1)|1))))[m
[31m-[m
[31m-[m
[31m-#define hashpointer(t,p)	hashmod(t, IntPoint(p))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** number of ints inside a lua_Number[m
[31m-*/[m
[31m-#define numints		cast_int(sizeof(lua_Number)/sizeof(int))[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define dummynode		(&dummynode_)[m
[31m-[m
[31m-static const Node dummynode_ = {[m
[31m-  {{NULL}, LUA_TNIL},  /* value */[m
[31m-  {{{NULL}, LUA_TNIL, NULL}}  /* key */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** hash for lua_Numbers[m
[31m-*/[m
[31m-static Node *hashnum (const Table *t, lua_Number n) {[m
[31m-  unsigned int a[numints];[m
[31m-  int i;[m
[31m-  if (luai_numeq(n, 0))  /* avoid problems with -0 */[m
[31m-    return gnode(t, 0);[m
[31m-  memcpy(a, &n, sizeof(a));[m
[31m-  for (i = 1; i < numints; i++) a[0] += a[i];[m
[31m-  return hashmod(t, a[0]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** returns the `main' position of an element in a table (that is, the index[m
[31m-** of its hash value)[m
[31m-*/[m
[31m-static Node *mainposition (const Table *t, const TValue *key) {[m
[31m-  switch (ttype(key)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-      return hashnum(t, nvalue(key));[m
[31m-    case LUA_TSTRING:[m
[31m-      return hashstr(t, rawtsvalue(key));[m
[31m-    case LUA_TBOOLEAN:[m
[31m-      return hashboolean(t, bvalue(key));[m
[31m-    case LUA_TLIGHTUSERDATA:[m
[31m-      return hashpointer(t, pvalue(key));[m
[31m-    default:[m
[31m-      return hashpointer(t, gcvalue(key));[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** returns the index for `key' if `key' is an appropriate key to live in[m
[31m-** the array part of the table, -1 otherwise.[m
[31m-*/[m
[31m-static int arrayindex (const TValue *key) {[m
[31m-  if (ttisnumber(key)) {[m
[31m-    lua_Number n = nvalue(key);[m
[31m-    int k;[m
[31m-    lua_number2int(k, n);[m
[31m-    if (luai_numeq(cast_num(k), n))[m
[31m-      return k;[m
[31m-  }[m
[31m-  return -1;  /* `key' did not match some condition */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** returns the index of a `key' for table traversals. First goes all[m
[31m-** elements in the array part, then elements in the hash part. The[m
[31m-** beginning of a traversal is signalled by -1.[m
[31m-*/[m
[31m-static int findindex (lua_State *L, Table *t, StkId key) {[m
[31m-  int i;[m
[31m-  if (ttisnil(key)) return -1;  /* first iteration */[m
[31m-  i = arrayindex(key);[m
[31m-  if (0 < i && i <= t->sizearray)  /* is `key' inside array part? */[m
[31m-    return i-1;  /* yes; that's the index (corrected to C) */[m
[31m-  else {[m
[31m-    Node *n = mainposition(t, key);[m
[31m-    do {  /* check whether `key' is somewhere in the chain */[m
[31m-      /* key may be dead already, but it is ok to use it in `next' */[m
[31m-      if (luaO_rawequalObj(key2tval(n), key) ||[m
[31m-            (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) &&[m
[31m-             gcvalue(gkey(n)) == gcvalue(key))) {[m
[31m-        i = cast_int(n - gnode(t, 0));  /* key index in hash table */[m
[31m-        /* hash elements are numbered after array ones */[m
[31m-        return i + t->sizearray;[m
[31m-      }[m
[31m-      else n = gnext(n);[m
[31m-    } while (n);[m
[31m-    luaG_runerror(L, "invalid key to " LUA_QL("next"));  /* key not found */[m
[31m-    return 0;  /* to avoid warnings */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaH_next (lua_State *L, Table *t, StkId key) {[m
[31m-  int i = findindex(L, t, key);  /* find original element */[m
[31m-  for (i++; i < t->sizearray; i++) {  /* try first array part */[m
[31m-    if (!ttisnil(&t->array[i])) {  /* a non-nil value? */[m
[31m-      setnvalue(key, cast_num(i+1));[m
[31m-      setobj2s(L, key+1, &t->array[i]);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  for (i -= t->sizearray; i < sizenode(t); i++) {  /* then hash part */[m
[31m-    if (!ttisnil(gval(gnode(t, i)))) {  /* a non-nil value? */[m
[31m-      setobj2s(L, key, key2tval(gnode(t, i)));[m
[31m-      setobj2s(L, key+1, gval(gnode(t, i)));[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* no more elements */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {=============================================================[m
[31m-** Rehash[m
[31m-** ==============================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static int computesizes (int nums[], int *narray) {[m
[31m-  int i;[m
[31m-  int twotoi;  /* 2^i */[m
[31m-  int a = 0;  /* number of elements smaller than 2^i */[m
[31m-  int na = 0;  /* number of elements to go to array part */[m
[31m-  int n = 0;  /* optimal size for array part */[m
[31m-  for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) {[m
[31m-    if (nums[i] > 0) {[m
[31m-      a += nums[i];[m
[31m-      if (a > twotoi/2) {  /* more than half elements present? */[m
[31m-        n = twotoi;  /* optimal size (till now) */[m
[31m-        na = a;  /* all elements smaller than n will go to array part */[m
[31m-      }[m
[31m-    }[m
[31m-    if (a == *narray) break;  /* all elements already counted */[m
[31m-  }[m
[31m-  *narray = n;[m
[31m-  lua_assert(*narray/2 <= na && na <= *narray);[m
[31m-  return na;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int countint (const TValue *key, int *nums) {[m
[31m-  int k = arrayindex(key);[m
[31m-  if (0 < k && k <= MAXASIZE) {  /* is `key' an appropriate array index? */[m
[31m-    nums[ceillog2(k)]++;  /* count as such */[m
[31m-    return 1;[m
[31m-  }[m
[31m-  else[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int numusearray (const Table *t, int *nums) {[m
[31m-  int lg;[m
[31m-  int ttlg;  /* 2^lg */[m
[31m-  int ause = 0;  /* summation of `nums' */[m
[31m-  int i = 1;  /* count to traverse all array keys */[m
[31m-  for (lg=0, ttlg=1; lg<=MAXBITS; lg++, ttlg*=2) {  /* for each slice */[m
[31m-    int lc = 0;  /* counter */[m
[31m-    int lim = ttlg;[m
[31m-    if (lim > t->sizearray) {[m
[31m-      lim = t->sizearray;  /* adjust upper limit */[m
[31m-      if (i > lim)[m
[31m-        break;  /* no more elements to count */[m
[31m-    }[m
[31m-    /* count elements in range (2^(lg-1), 2^lg] */[m
[31m-    for (; i <= lim; i++) {[m
[31m-      if (!ttisnil(&t->array[i-1]))[m
[31m-        lc++;[m
[31m-    }[m
[31m-    nums[lg] += lc;[m
[31m-    ause += lc;[m
[31m-  }[m
[31m-  return ause;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int numusehash (const Table *t, int *nums, int *pnasize) {[m
[31m-  int totaluse = 0;  /* total number of elements */[m
[31m-  int ause = 0;  /* summation of `nums' */[m
[31m-  int i = sizenode(t);[m
[31m-  while (i--) {[m
[31m-    Node *n = &t->node[i];[m
[31m-    if (!ttisnil(gval(n))) {[m
[31m-      ause += countint(key2tval(n), nums);[m
[31m-      totaluse++;[m
[31m-    }[m
[31m-  }[m
[31m-  *pnasize += ause;[m
[31m-  return totaluse;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void setarrayvector (lua_State *L, Table *t, int size) {[m
[31m-  int i;[m
[31m-  luaM_reallocvector(L, t->array, t->sizearray, size, TValue);[m
[31m-  for (i=t->sizearray; i<size; i++)[m
[31m-     setnilvalue(&t->array[i]);[m
[31m-  t->sizearray = size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void setnodevector (lua_State *L, Table *t, int size) {[m
[31m-  int lsize;[m
[31m-  if (size == 0) {  /* no elements to hash part? */[m
[31m-    t->node = cast(Node *, dummynode);  /* use common `dummynode' */[m
[31m-    lsize = 0;[m
[31m-  }[m
[31m-  else {[m
[31m-    int i;[m
[31m-    lsize = ceillog2(size);[m
[31m-    if (lsize > MAXBITS)[m
[31m-      luaG_runerror(L, "table overflow");[m
[31m-    size = twoto(lsize);[m
[31m-    t->node = luaM_newvector(L, size, Node);[m
[31m-    for (i=0; i<size; i++) {[m
[31m-      Node *n = gnode(t, i);[m
[31m-      gnext(n) = NULL;[m
[31m-      setnilvalue(gkey(n));[m
[31m-      setnilvalue(gval(n));[m
[31m-    }[m
[31m-  }[m
[31m-  t->lsizenode = cast_byte(lsize);[m
[31m-  t->lastfree = gnode(t, size);  /* all positions are free */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void resize (lua_State *L, Table *t, int nasize, int nhsize) {[m
[31m-  int i;[m
[31m-  int oldasize = t->sizearray;[m
[31m-  int oldhsize = t->lsizenode;[m
[31m-  Node *nold = t->node;  /* save old hash ... */[m
[31m-  if (nasize > oldasize)  /* array part must grow? */[m
[31m-    setarrayvector(L, t, nasize);[m
[31m-  /* create new hash part with appropriate size */[m
[31m-  setnodevector(L, t, nhsize);  [m
[31m-  if (nasize < oldasize) {  /* array part must shrink? */[m
[31m-    t->sizearray = nasize;[m
[31m-    /* re-insert elements from vanishing slice */[m
[31m-    for (i=nasize; i<oldasize; i++) {[m
[31m-      if (!ttisnil(&t->array[i]))[m
[31m-        setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]);[m
[31m-    }[m
[31m-    /* shrink array */[m
[31m-    luaM_reallocvector(L, t->array, oldasize, nasize, TValue);[m
[31m-  }[m
[31m-  /* re-insert elements from hash part */[m
[31m-  for (i = twoto(oldhsize) - 1; i >= 0; i--) {[m
[31m-    Node *old = nold+i;[m
[31m-    if (!ttisnil(gval(old)))[m
[31m-      setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old));[m
[31m-  }[m
[31m-  if (nold != dummynode)[m
[31m-    luaM_freearray(L, nold, twoto(oldhsize), Node);  /* free old array */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaH_resizearray (lua_State *L, Table *t, int nasize) {[m
[31m-  int nsize = (t->node == dummynode) ? 0 : sizenode(t);[m
[31m-  resize(L, t, nasize, nsize);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void rehash (lua_State *L, Table *t, const TValue *ek) {[m
[31m-  int nasize, na;[m
[31m-  int nums[MAXBITS+1];  /* nums[i] = number of keys between 2^(i-1) and 2^i */[m
[31m-  int i;[m
[31m-  int totaluse;[m
[31m-  for (i=0; i<=MAXBITS; i++) nums[i] = 0;  /* reset counts */[m
[31m-  nasize = numusearray(t, nums);  /* count keys in array part */[m
[31m-  totaluse = nasize;  /* all those keys are integer keys */[m
[31m-  totaluse += numusehash(t, nums, &nasize);  /* count keys in hash part */[m
[31m-  /* count extra key */[m
[31m-  nasize += countint(ek, nums);[m
[31m-  totaluse++;[m
[31m-  /* compute new size for array part */[m
[31m-  na = computesizes(nums, &nasize);[m
[31m-  /* resize the table to new computed sizes */[m
[31m-  resize(L, t, nasize, totaluse - na);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** }=============================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-Table *luaH_new (lua_State *L, int narray, int nhash) {[m
[31m-  Table *t = luaM_new(L, Table);[m
[31m-  luaC_link(L, obj2gco(t), LUA_TTABLE);[m
[31m-  t->metatable = NULL;[m
[31m-  t->flags = cast_byte(~0);[m
[31m-  /* temporary values (kept only if some malloc fails) */[m
[31m-  t->array = NULL;[m
[31m-  t->sizearray = 0;[m
[31m-  t->lsizenode = 0;[m
[31m-  t->node = cast(Node *, dummynode);[m
[31m-  setarrayvector(L, t, narray);[m
[31m-  setnodevector(L, t, nhash);[m
[31m-  return t;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaH_free (lua_State *L, Table *t) {[m
[31m-  if (t->node != dummynode)[m
[31m-    luaM_freearray(L, t->node, sizenode(t), Node);[m
[31m-  luaM_freearray(L, t->array, t->sizearray, TValue);[m
[31m-  luaM_free(L, t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static Node *getfreepos (Table *t) {[m
[31m-  while (t->lastfree-- > t->node) {[m
[31m-    if (ttisnil(gkey(t->lastfree)))[m
[31m-      return t->lastfree;[m
[31m-  }[m
[31m-  return NULL;  /* could not find a free place */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** inserts a new key into a hash table; first, check whether key's main [m
[31m-** position is free. If not, check whether colliding node is in its main [m
[31m-** position or not: if it is not, move colliding node to an empty place and [m
[31m-** put new key in its main position; otherwise (colliding node is in its main [m
[31m-** position), new key goes to an empty position. [m
[31m-*/[m
[31m-static TValue *newkey (lua_State *L, Table *t, const TValue *key) {[m
[31m-  Node *mp = mainposition(t, key);[m
[31m-  if (!ttisnil(gval(mp)) || mp == dummynode) {[m
[31m-    Node *othern;[m
[31m-    Node *n = getfreepos(t);  /* get a free place */[m
[31m-    if (n == NULL) {  /* cannot find a free place? */[m
[31m-      rehash(L, t, key);  /* grow table */[m
[31m-      return luaH_set(L, t, key);  /* re-insert key into grown table */[m
[31m-    }[m
[31m-    lua_assert(n != dummynode);[m
[31m-    othern = mainposition(t, key2tval(mp));[m
[31m-    if (othern != mp) {  /* is colliding node out of its main position? */[m
[31m-      /* yes; move colliding node into free position */[m
[31m-      while (gnext(othern) != mp) othern = gnext(othern);  /* find previous */[m
[31m-      gnext(othern) = n;  /* redo the chain with `n' in place of `mp' */[m
[31m-      *n = *mp;  /* copy colliding node into free pos. (mp->next also goes) */[m
[31m-      gnext(mp) = NULL;  /* now `mp' is free */[m
[31m-      setnilvalue(gval(mp));[m
[31m-    }[m
[31m-    else {  /* colliding node is in its own main position */[m
[31m-      /* new node will go into free position */[m
[31m-      gnext(n) = gnext(mp);  /* chain new position */[m
[31m-      gnext(mp) = n;[m
[31m-      mp = n;[m
[31m-    }[m
[31m-  }[m
[31m-  gkey(mp)->value = key->value; gkey(mp)->tt = key->tt;[m
[31m-  luaC_barriert(L, t, key);[m
[31m-  lua_assert(ttisnil(gval(mp)));[m
[31m-  return gval(mp);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** search function for integers[m
[31m-*/[m
[31m-const TValue *luaH_getnum (Table *t, int key) {[m
[31m-  /* (1 <= key && key <= t->sizearray) */[m
[31m-  if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray))[m
[31m-    return &t->array[key-1];[m
[31m-  else {[m
[31m-    lua_Number nk = cast_num(key);[m
[31m-    Node *n = hashnum(t, nk);[m
[31m-    do {  /* check whether `key' is somewhere in the chain */[m
[31m-      if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk))[m
[31m-        return gval(n);  /* that's it */[m
[31m-      else n = gnext(n);[m
[31m-    } while (n);[m
[31m-    return luaO_nilobject;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** search function for strings[m
[31m-*/[m
[31m-const TValue *luaH_getstr (Table *t, TString *key) {[m
[31m-  Node *n = hashstr(t, key);[m
[31m-  do {  /* check whether `key' is somewhere in the chain */[m
[31m-    if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key)[m
[31m-      return gval(n);  /* that's it */[m
[31m-    else n = gnext(n);[m
[31m-  } while (n);[m
[31m-  return luaO_nilobject;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** main search function[m
[31m-*/[m
[31m-const TValue *luaH_get (Table *t, const TValue *key) {[m
[31m-  switch (ttype(key)) {[m
[31m-    case LUA_TNIL: return luaO_nilobject;[m
[31m-    case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key));[m
[31m-    case LUA_TNUMBER: {[m
[31m-      int k;[m
[31m-      lua_Number n = nvalue(key);[m
[31m-      lua_number2int(k, n);[m
[31m-      if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */[m
[31m-        return luaH_getnum(t, k);  /* use specialized version */[m
[31m-      /* else go through */[m
[31m-    }[m
[31m-    default: {[m
[31m-      Node *n = mainposition(t, key);[m
[31m-      do {  /* check whether `key' is somewhere in the chain */[m
[31m-        if (luaO_rawequalObj(key2tval(n), key))[m
[31m-          return gval(n);  /* that's it */[m
[31m-        else n = gnext(n);[m
[31m-      } while (n);[m
[31m-      return luaO_nilobject;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {[m
[31m-  const TValue *p = luaH_get(t, key);[m
[31m-  t->flags = 0;[m
[31m-  if (p != luaO_nilobject)[m
[31m-    return cast(TValue *, p);[m
[31m-  else {[m
[31m-    if (ttisnil(key)) luaG_runerror(L, "table index is nil");[m
[31m-    else if (ttisnumber(key) && luai_numisnan(nvalue(key)))[m
[31m-      luaG_runerror(L, "table index is NaN");[m
[31m-    return newkey(L, t, key);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TValue *luaH_setnum (lua_State *L, Table *t, int key) {[m
[31m-  const TValue *p = luaH_getnum(t, key);[m
[31m-  if (p != luaO_nilobject)[m
[31m-    return cast(TValue *, p);[m
[31m-  else {[m
[31m-    TValue k;[m
[31m-    setnvalue(&k, cast_num(key));[m
[31m-    return newkey(L, t, &k);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-TValue *luaH_setstr (lua_State *L, Table *t, TString *key) {[m
[31m-  const TValue *p = luaH_getstr(t, key);[m
[31m-  if (p != luaO_nilobject)[m
[31m-    return cast(TValue *, p);[m
[31m-  else {[m
[31m-    TValue k;[m
[31m-    setsvalue(L, &k, key);[m
[31m-    return newkey(L, t, &k);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int unbound_search (Table *t, unsigned int j) {[m
[31m-  unsigned int i = j;  /* i is zero or a present index */[m
[31m-  j++;[m
[31m-  /* find `i' and `j' such that i is present and j is not */[m
[31m-  while (!ttisnil(luaH_getnum(t, j))) {[m
[31m-    i = j;[m
[31m-    j *= 2;[m
[31m-    if (j > cast(unsigned int, MAX_INT)) {  /* overflow? */[m
[31m-      /* table was built with bad purposes: resort to linear search */[m
[31m-      i = 1;[m
[31m-      while (!ttisnil(luaH_getnum(t, i))) i++;[m
[31m-      return i - 1;[m
[31m-    }[m
[31m-  }[m
[31m-  /* now do a binary search between them */[m
[31m-  while (j - i > 1) {[m
[31m-    unsigned int m = (i+j)/2;[m
[31m-    if (ttisnil(luaH_getnum(t, m))) j = m;[m
[31m-    else i = m;[m
[31m-  }[m
[31m-  return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Try to find a boundary in table `t'. A `boundary' is an integer index[m
[31m-** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).[m
[31m-*/[m
[31m-int luaH_getn (Table *t) {[m
[31m-  unsigned int j = t->sizearray;[m
[31m-  if (j > 0 && ttisnil(&t->array[j - 1])) {[m
[31m-    /* there is a boundary in the array part: (binary) search for it */[m
[31m-    unsigned int i = 0;[m
[31m-    while (j - i > 1) {[m
[31m-      unsigned int m = (i+j)/2;[m
[31m-      if (ttisnil(&t->array[m - 1])) j = m;[m
[31m-      else i = m;[m
[31m-    }[m
[31m-    return i;[m
[31m-  }[m
[31m-  /* else must find a boundary in hash part */[m
[31m-  else if (t->node == dummynode)  /* hash part is empty? */[m
[31m-    return j;  /* that is easy... */[m
[31m-  else return unbound_search(t, j);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-#if defined(LUA_DEBUG)[m
[31m-[m
[31m-Node *luaH_mainposition (const Table *t, const TValue *key) {[m
[31m-  return mainposition(t, key);[m
[31m-}[m
[31m-[m
[31m-int luaH_isdummy (Node *n) { return n == dummynode; }[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltable.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltable.h[m
[1mdeleted file mode 100644[m
[1mindex f5b9d5e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltable.h[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lua tables (hash)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef ltable_h[m
[31m-#define ltable_h[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-#define gnode(t,i)	(&(t)->node[i])[m
[31m-#define gkey(n)		(&(n)->i_key.nk)[m
[31m-#define gval(n)		(&(n)->i_val)[m
[31m-#define gnext(n)	((n)->i_key.nk.next)[m
[31m-[m
[31m-#define key2tval(n)	(&(n)->i_key.tvk)[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC const TValue *luaH_getnum (Table *t, int key);[m
[31m-LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key);[m
[31m-LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);[m
[31m-LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key);[m
[31m-LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);[m
[31m-LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);[m
[31m-LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash);[m
[31m-LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize);[m
[31m-LUAI_FUNC void luaH_free (lua_State *L, Table *t);[m
[31m-LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);[m
[31m-LUAI_FUNC int luaH_getn (Table *t);[m
[31m-[m
[31m-[m
[31m-#if defined(LUA_DEBUG)[m
[31m-LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);[m
[31m-LUAI_FUNC int luaH_isdummy (Node *n);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltablib.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltablib.c[m
[1mdeleted file mode 100644[m
[1mindex b6d9cb4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltablib.c[m
[1m+++ /dev/null[m
[36m@@ -1,287 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $[m
[31m-** Library for Table Manipulation[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#define ltablib_c[m
[31m-#define LUA_LIB[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-#define aux_getn(L,n)	(luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))[m
[31m-[m
[31m-[m
[31m-static int foreachi (lua_State *L) {[m
[31m-  int i;[m
[31m-  int n = aux_getn(L, 1);[m
[31m-  luaL_checktype(L, 2, LUA_TFUNCTION);[m
[31m-  for (i=1; i <= n; i++) {[m
[31m-    lua_pushvalue(L, 2);  /* function */[m
[31m-    lua_pushinteger(L, i);  /* 1st argument */[m
[31m-    lua_rawgeti(L, 1, i);  /* 2nd argument */[m
[31m-    lua_call(L, 2, 1);[m
[31m-    if (!lua_isnil(L, -1))[m
[31m-      return 1;[m
[31m-    lua_pop(L, 1);  /* remove nil result */[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int foreach (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  luaL_checktype(L, 2, LUA_TFUNCTION);[m
[31m-  lua_pushnil(L);  /* first key */[m
[31m-  while (lua_next(L, 1)) {[m
[31m-    lua_pushvalue(L, 2);  /* function */[m
[31m-    lua_pushvalue(L, -3);  /* key */[m
[31m-    lua_pushvalue(L, -3);  /* value */[m
[31m-    lua_call(L, 2, 1);[m
[31m-    if (!lua_isnil(L, -1))[m
[31m-      return 1;[m
[31m-    lua_pop(L, 2);  /* remove value and result */[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int maxn (lua_State *L) {[m
[31m-  lua_Number max = 0;[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  lua_pushnil(L);  /* first key */[m
[31m-  while (lua_next(L, 1)) {[m
[31m-    lua_pop(L, 1);  /* remove value */[m
[31m-    if (lua_type(L, -1) == LUA_TNUMBER) {[m
[31m-      lua_Number v = lua_tonumber(L, -1);[m
[31m-      if (v > max) max = v;[m
[31m-    }[m
[31m-  }[m
[31m-  lua_pushnumber(L, max);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int getn (lua_State *L) {[m
[31m-  lua_pushinteger(L, aux_getn(L, 1));[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int setn (lua_State *L) {[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-#ifndef luaL_setn[m
[31m-  luaL_setn(L, 1, luaL_checkint(L, 2));[m
[31m-#else[m
[31m-  luaL_error(L, LUA_QL("setn") " is obsolete");[m
[31m-#endif[m
[31m-  lua_pushvalue(L, 1);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int tinsert (lua_State *L) {[m
[31m-  int e = aux_getn(L, 1) + 1;  /* first empty element */[m
[31m-  int pos;  /* where to insert new element */[m
[31m-  switch (lua_gettop(L)) {[m
[31m-    case 2: {  /* called with only 2 arguments */[m
[31m-      pos = e;  /* insert new element at the end */[m
[31m-      break;[m
[31m-    }[m
[31m-    case 3: {[m
[31m-      int i;[m
[31m-      pos = luaL_checkint(L, 2);  /* 2nd argument is the position */[m
[31m-      if (pos > e) e = pos;  /* `grow' array if necessary */[m
[31m-      for (i = e; i > pos; i--) {  /* move up elements */[m
[31m-        lua_rawgeti(L, 1, i-1);[m
[31m-        lua_rawseti(L, 1, i);  /* t[i] = t[i-1] */[m
[31m-      }[m
[31m-      break;[m
[31m-    }[m
[31m-    default: {[m
[31m-      return luaL_error(L, "wrong number of arguments to " LUA_QL("insert"));[m
[31m-    }[m
[31m-  }[m
[31m-  luaL_setn(L, 1, e);  /* new size */[m
[31m-  lua_rawseti(L, 1, pos);  /* t[pos] = v */[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int tremove (lua_State *L) {[m
[31m-  int e = aux_getn(L, 1);[m
[31m-  int pos = luaL_optint(L, 2, e);[m
[31m-  if (!(1 <= pos && pos <= e))  /* position is outside bounds? */[m
[31m-   return 0;  /* nothing to remove */[m
[31m-  luaL_setn(L, 1, e - 1);  /* t.n = n-1 */[m
[31m-  lua_rawgeti(L, 1, pos);  /* result = t[pos] */[m
[31m-  for ( ;pos<e; pos++) {[m
[31m-    lua_rawgeti(L, 1, pos+1);[m
[31m-    lua_rawseti(L, 1, pos);  /* t[pos] = t[pos+1] */[m
[31m-  }[m
[31m-  lua_pushnil(L);[m
[31m-  lua_rawseti(L, 1, e);  /* t[e] = nil */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void addfield (lua_State *L, luaL_Buffer *b, int i) {[m
[31m-  lua_rawgeti(L, 1, i);[m
[31m-  if (!lua_isstring(L, -1))[m
[31m-    luaL_error(L, "invalid value (%s) at index %d in table for "[m
[31m-                  LUA_QL("concat"), luaL_typename(L, -1), i);[m
[31m-    luaL_addvalue(b);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int tconcat (lua_State *L) {[m
[31m-  luaL_Buffer b;[m
[31m-  size_t lsep;[m
[31m-  int i, last;[m
[31m-  const char *sep = luaL_optlstring(L, 2, "", &lsep);[m
[31m-  luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-  i = luaL_optint(L, 3, 1);[m
[31m-  last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1));[m
[31m-  luaL_buffinit(L, &b);[m
[31m-  for (; i < last; i++) {[m
[31m-    addfield(L, &b, i);[m
[31m-    luaL_addlstring(&b, sep, lsep);[m
[31m-  }[m
[31m-  if (i == last)  /* add last value (if interval was not empty) */[m
[31m-    addfield(L, &b, i);[m
[31m-  luaL_pushresult(&b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================[m
[31m-** Quicksort[m
[31m-** (based on `Algorithms in MODULA-3', Robert Sedgewick;[m
[31m-**  Addison-Wesley, 1993.)[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-static void set2 (lua_State *L, int i, int j) {[m
[31m-  lua_rawseti(L, 1, i);[m
[31m-  lua_rawseti(L, 1, j);[m
[31m-}[m
[31m-[m
[31m-static int sort_comp (lua_State *L, int a, int b) {[m
[31m-  if (!lua_isnil(L, 2)) {  /* function? */[m
[31m-    int res;[m
[31m-    lua_pushvalue(L, 2);[m
[31m-    lua_pushvalue(L, a-1);  /* -1 to compensate function */[m
[31m-    lua_pushvalue(L, b-2);  /* -2 to compensate function and `a' */[m
[31m-    lua_call(L, 2, 1);[m
[31m-    res = lua_toboolean(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-    return res;[m
[31m-  }[m
[31m-  else  /* a < b? */[m
[31m-    return lua_lessthan(L, a, b);[m
[31m-}[m
[31m-[m
[31m-static void auxsort (lua_State *L, int l, int u) {[m
[31m-  while (l < u) {  /* for tail recursion */[m
[31m-    int i, j;[m
[31m-    /* sort elements a[l], a[(l+u)/2] and a[u] */[m
[31m-    lua_rawgeti(L, 1, l);[m
[31m-    lua_rawgeti(L, 1, u);[m
[31m-    if (sort_comp(L, -1, -2))  /* a[u] < a[l]? */[m
[31m-      set2(L, l, u);  /* swap a[l] - a[u] */[m
[31m-    else[m
[31m-      lua_pop(L, 2);[m
[31m-    if (u-l == 1) break;  /* only 2 elements */[m
[31m-    i = (l+u)/2;[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-    lua_rawgeti(L, 1, l);[m
[31m-    if (sort_comp(L, -2, -1))  /* a[i]<a[l]? */[m
[31m-      set2(L, i, l);[m
[31m-    else {[m
[31m-      lua_pop(L, 1);  /* remove a[l] */[m
[31m-      lua_rawgeti(L, 1, u);[m
[31m-      if (sort_comp(L, -1, -2))  /* a[u]<a[i]? */[m
[31m-        set2(L, i, u);[m
[31m-      else[m
[31m-        lua_pop(L, 2);[m
[31m-    }[m
[31m-    if (u-l == 2) break;  /* only 3 elements */[m
[31m-    lua_rawgeti(L, 1, i);  /* Pivot */[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_rawgeti(L, 1, u-1);[m
[31m-    set2(L, i, u-1);[m
[31m-    /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */[m
[31m-    i = l; j = u-1;[m
[31m-    for (;;) {  /* invariant: a[l..i] <= P <= a[j..u] */[m
[31m-      /* repeat ++i until a[i] >= P */[m
[31m-      while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {[m
[31m-        if (i>u) luaL_error(L, "invalid order function for sorting");[m
[31m-        lua_pop(L, 1);  /* remove a[i] */[m
[31m-      }[m
[31m-      /* repeat --j until a[j] <= P */[m
[31m-      while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {[m
[31m-        if (j<l) luaL_error(L, "invalid order function for sorting");[m
[31m-        lua_pop(L, 1);  /* remove a[j] */[m
[31m-      }[m
[31m-      if (j<i) {[m
[31m-        lua_pop(L, 3);  /* pop pivot, a[i], a[j] */[m
[31m-        break;[m
[31m-      }[m
[31m-      set2(L, i, j);[m
[31m-    }[m
[31m-    lua_rawgeti(L, 1, u-1);[m
[31m-    lua_rawgeti(L, 1, i);[m
[31m-    set2(L, u-1, i);  /* swap pivot (a[u-1]) with a[i] */[m
[31m-    /* a[l..i-1] <= a[i] == P <= a[i+1..u] */[m
[31m-    /* adjust so that smaller half is in [j..i] and larger one in [l..u] */[m
[31m-    if (i-l < u-i) {[m
[31m-      j=l; i=i-1; l=i+2;[m
[31m-    }[m
[31m-    else {[m
[31m-      j=i+1; i=u; u=j-2;[m
[31m-    }[m
[31m-    auxsort(L, j, i);  /* call recursively the smaller one */[m
[31m-  }  /* repeat the routine for the larger one */[m
[31m-}[m
[31m-[m
[31m-static int sort (lua_State *L) {[m
[31m-  int n = aux_getn(L, 1);[m
[31m-  luaL_checkstack(L, 40, "");  /* assume array is smaller than 2^40 */[m
[31m-  if (!lua_isnoneornil(L, 2))  /* is there a 2nd argument? */[m
[31m-    luaL_checktype(L, 2, LUA_TFUNCTION);[m
[31m-  lua_settop(L, 2);  /* make sure there is two arguments */[m
[31m-  auxsort(L, 1, n);[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* }====================================================== */[m
[31m-[m
[31m-[m
[31m-static const luaL_Reg tab_funcs[] = {[m
[31m-  {"concat", tconcat},[m
[31m-  {"foreach", foreach},[m
[31m-  {"foreachi", foreachi},[m
[31m-  {"getn", getn},[m
[31m-  {"maxn", maxn},[m
[31m-  {"insert", tinsert},[m
[31m-  {"remove", tremove},[m
[31m-  {"setn", setn},[m
[31m-  {"sort", sort},[m
[31m-  {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-LUALIB_API int luaopen_table (lua_State *L) {[m
[31m-  luaL_register(L, LUA_TABLIBNAME, tab_funcs);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltm.c[m
[1mdeleted file mode 100644[m
[1mindex c27f0f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltm.c[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Tag methods[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define ltm_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-const char *const luaT_typenames[] = {[m
[31m-  "nil", "boolean", "userdata", "number",[m
[31m-  "string", "table", "function", "userdata", "thread",[m
[31m-  "proto", "upval"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void luaT_init (lua_State *L) {[m
[31m-  static const char *const luaT_eventname[] = {  /* ORDER TM */[m
[31m-    "__index", "__newindex",[m
[31m-    "__gc", "__mode", "__eq",[m
[31m-    "__add", "__sub", "__mul", "__div", "__mod",[m
[31m-    "__pow", "__unm", "__len", "__lt", "__le",[m
[31m-    "__concat", "__call"[m
[31m-  };[m
[31m-  int i;[m
[31m-  for (i=0; i<TM_N; i++) {[m
[31m-    G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);[m
[31m-    luaS_fix(G(L)->tmname[i]);  /* never collect these names */[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** function to be used with macro "fasttm": optimized for absence of[m
[31m-** tag methods[m
[31m-*/[m
[31m-const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {[m
[31m-  const TValue *tm = luaH_getstr(events, ename);[m
[31m-  lua_assert(event <= TM_EQ);[m
[31m-  if (ttisnil(tm)) {  /* no tag method? */[m
[31m-    events->flags |= cast_byte(1u<<event);  /* cache this fact */[m
[31m-    return NULL;[m
[31m-  }[m
[31m-  else return tm;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {[m
[31m-  Table *mt;[m
[31m-  switch (ttype(o)) {[m
[31m-    case LUA_TTABLE:[m
[31m-      mt = hvalue(o)->metatable;[m
[31m-      break;[m
[31m-    case LUA_TUSERDATA:[m
[31m-      mt = uvalue(o)->metatable;[m
[31m-      break;[m
[31m-    default:[m
[31m-      mt = G(L)->mt[ttype(o)];[m
[31m-  }[m
[31m-  return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltm.h[m
[1mdeleted file mode 100644[m
[1mindex 64343b7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/ltm.h[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-/*[m
[31m-** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Tag methods[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef ltm_h[m
[31m-#define ltm_h[m
[31m-[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-* WARNING: if you change the order of this enumeration,[m
[31m-* grep "ORDER TM"[m
[31m-*/[m
[31m-typedef enum {[m
[31m-  TM_INDEX,[m
[31m-  TM_NEWINDEX,[m
[31m-  TM_GC,[m
[31m-  TM_MODE,[m
[31m-  TM_EQ,  /* last tag method with `fast' access */[m
[31m-  TM_ADD,[m
[31m-  TM_SUB,[m
[31m-  TM_MUL,[m
[31m-  TM_DIV,[m
[31m-  TM_MOD,[m
[31m-  TM_POW,[m
[31m-  TM_UNM,[m
[31m-  TM_LEN,[m
[31m-  TM_LT,[m
[31m-  TM_LE,[m
[31m-  TM_CONCAT,[m
[31m-  TM_CALL,[m
[31m-  TM_N		/* number of elements in the enum */[m
[31m-} TMS;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define gfasttm(g,et,e) ((et) == NULL ? NULL : \[m
[31m-  ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))[m
[31m-[m
[31m-#define fasttm(l,et,e)	gfasttm(G(l), et, e)[m
[31m-[m
[31m-LUAI_DATA const char *const luaT_typenames[];[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);[m
[31m-LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,[m
[31m-                                                       TMS event);[m
[31m-LUAI_FUNC void luaT_init (lua_State *L);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lua.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lua.c[m
[1mdeleted file mode 100644[m
[1mindex 3a46609..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lua.c[m
[1m+++ /dev/null[m
[36m@@ -1,392 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lua.c,v 1.160.1.2 2007/12/28 15:32:23 roberto Exp $[m
[31m-** Lua stand-alone interpreter[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <signal.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lua_c[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lauxlib.h"[m
[31m-#include "lualib.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-static lua_State *globalL = NULL;[m
[31m-[m
[31m-static const char *progname = LUA_PROGNAME;[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void lstop (lua_State *L, lua_Debug *ar) {[m
[31m-  (void)ar;  /* unused arg. */[m
[31m-  lua_sethook(L, NULL, 0, 0);[m
[31m-  luaL_error(L, "interrupted!");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void laction (int i) {[m
[31m-  signal(i, SIG_DFL); /* if another SIGINT happens before lstop,[m
[31m-                              terminate process (default action) */[m
[31m-  lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void print_usage (void) {[m
[31m-  fprintf(stderr,[m
[31m-  "usage: %s [options] [script [args]].\n"[m
[31m-  "Available options are:\n"[m
[31m-  "  -e stat  execute string " LUA_QL("stat") "\n"[m
[31m-  "  -l name  require library " LUA_QL("name") "\n"[m
[31m-  "  -i       enter interactive mode after executing " LUA_QL("script") "\n"[m
[31m-  "  -v       show version information\n"[m
[31m-  "  --       stop handling options\n"[m
[31m-  "  -        execute stdin and stop handling options\n"[m
[31m-  ,[m
[31m-  progname);[m
[31m-  fflush(stderr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void l_message (const char *pname, const char *msg) {[m
[31m-  if (pname) fprintf(stderr, "%s: ", pname);[m
[31m-  fprintf(stderr, "%s\n", msg);[m
[31m-  fflush(stderr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int report (lua_State *L, int status) {[m
[31m-  if (status && !lua_isnil(L, -1)) {[m
[31m-    const char *msg = lua_tostring(L, -1);[m
[31m-    if (msg == NULL) msg = "(error object is not a string)";[m
[31m-    l_message(progname, msg);[m
[31m-    lua_pop(L, 1);[m
[31m-  }[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int traceback (lua_State *L) {[m
[31m-  if (!lua_isstring(L, 1))  /* 'message' not a string? */[m
[31m-    return 1;  /* keep it intact */[m
[31m-  lua_getfield(L, LUA_GLOBALSINDEX, "debug");[m
[31m-  if (!lua_istable(L, -1)) {[m
[31m-    lua_pop(L, 1);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  lua_getfield(L, -1, "traceback");[m
[31m-  if (!lua_isfunction(L, -1)) {[m
[31m-    lua_pop(L, 2);[m
[31m-    return 1;[m
[31m-  }[m
[31m-  lua_pushvalue(L, 1);  /* pass error message */[m
[31m-  lua_pushinteger(L, 2);  /* skip this function and traceback */[m
[31m-  lua_call(L, 2, 1);  /* call debug.traceback */[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int docall (lua_State *L, int narg, int clear) {[m
[31m-  int status;[m
[31m-  int base = lua_gettop(L) - narg;  /* function index */[m
[31m-  lua_pushcfunction(L, traceback);  /* push traceback function */[m
[31m-  lua_insert(L, base);  /* put it under chunk and args */[m
[31m-  signal(SIGINT, laction);[m
[31m-  status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base);[m
[31m-  signal(SIGINT, SIG_DFL);[m
[31m-  lua_remove(L, base);  /* remove traceback function */[m
[31m-  /* force a complete garbage collection in case of errors */[m
[31m-  if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0);[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void print_version (void) {[m
[31m-  l_message(NULL, LUA_RELEASE "  " LUA_COPYRIGHT);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int getargs (lua_State *L, char **argv, int n) {[m
[31m-  int narg;[m
[31m-  int i;[m
[31m-  int argc = 0;[m
[31m-  while (argv[argc]) argc++;  /* count total number of arguments */[m
[31m-  narg = argc - (n + 1);  /* number of arguments to the script */[m
[31m-  luaL_checkstack(L, narg + 3, "too many arguments to script");[m
[31m-  for (i=n+1; i < argc; i++)[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-  lua_createtable(L, narg, n + 1);[m
[31m-  for (i=0; i < argc; i++) {[m
[31m-    lua_pushstring(L, argv[i]);[m
[31m-    lua_rawseti(L, -2, i - n);[m
[31m-  }[m
[31m-  return narg;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int dofile (lua_State *L, const char *name) {[m
[31m-  int status = luaL_loadfile(L, name) || docall(L, 0, 1);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int dostring (lua_State *L, const char *s, const char *name) {[m
[31m-  int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1);[m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int dolibrary (lua_State *L, const char *name) {[m
[31m-  lua_getglobal(L, "require");[m
[31m-  lua_pushstring(L, name);[m
[31m-  return report(L, docall(L, 1, 1));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *get_prompt (lua_State *L, int firstline) {[m
[31m-  const char *p;[m
[31m-  lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2");[m
[31m-  p = lua_tostring(L, -1);[m
[31m-  if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);[m
[31m-  lua_pop(L, 1);  /* remove global */[m
[31m-  return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int incomplete (lua_State *L, int status) {[m
[31m-  if (status == LUA_ERRSYNTAX) {[m
[31m-    size_t lmsg;[m
[31m-    const char *msg = lua_tolstring(L, -1, &lmsg);[m
[31m-    const char *tp = msg + lmsg - (sizeof(LUA_QL("<eof>")) - 1);[m
[31m-    if (strstr(msg, LUA_QL("<eof>")) == tp) {[m
[31m-      lua_pop(L, 1);[m
[31m-      return 1;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;  /* else... */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int pushline (lua_State *L, int firstline) {[m
[31m-  char buffer[LUA_MAXINPUT];[m
[31m-  char *b = buffer;[m
[31m-  size_t l;[m
[31m-  const char *prmt = get_prompt(L, firstline);[m
[31m-  if (lua_readline(L, b, prmt) == 0)[m
[31m-    return 0;  /* no input */[m
[31m-  l = strlen(b);[m
[31m-  if (l > 0 && b[l-1] == '\n')  /* line ends with newline? */[m
[31m-    b[l-1] = '\0';  /* remove it */[m
[31m-  if (firstline && b[0] == '=')  /* first line starts with `=' ? */[m
[31m-    lua_pushfstring(L, "return %s", b+1);  /* change it to `return' */[m
[31m-  else[m
[31m-    lua_pushstring(L, b);[m
[31m-  lua_freeline(L, b);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int loadline (lua_State *L) {[m
[31m-  int status;[m
[31m-  lua_settop(L, 0);[m
[31m-  if (!pushline(L, 1))[m
[31m-    return -1;  /* no input */[m
[31m-  for (;;) {  /* repeat until gets a complete line */[m
[31m-    status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin");[m
[31m-    if (!incomplete(L, status)) break;  /* cannot try to add lines? */[m
[31m-    if (!pushline(L, 0))  /* no more input? */[m
[31m-      return -1;[m
[31m-    lua_pushliteral(L, "\n");  /* add a new line... */[m
[31m-    lua_insert(L, -2);  /* ...between the two lines */[m
[31m-    lua_concat(L, 3);  /* join them */[m
[31m-  }[m
[31m-  lua_saveline(L, 1);[m
[31m-  lua_remove(L, 1);  /* remove line */[m
[31m-  return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void dotty (lua_State *L) {[m
[31m-  int status;[m
[31m-  const char *oldprogname = progname;[m
[31m-  progname = NULL;[m
[31m-  while ((status = loadline(L)) != -1) {[m
[31m-    if (status == 0) status = docall(L, 0, 0);[m
[31m-    report(L, status);[m
[31m-    if (status == 0 && lua_gettop(L) > 0) {  /* any result to print? */[m
[31m-      lua_getglobal(L, "print");[m
[31m-      lua_insert(L, 1);[m
[31m-      if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0)[m
[31m-        l_message(progname, lua_pushfstring(L,[m
[31m-                               "error calling " LUA_QL("print") " (%s)",[m
[31m-                               lua_tostring(L, -1)));[m
[31m-    }[m
[31m-  }[m
[31m-  lua_settop(L, 0);  /* clear stack */[m
[31m-  fputs("\n", stdout);[m
[31m-  fflush(stdout);[m
[31m-  progname = oldprogname;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int handle_script (lua_State *L, char **argv, int n) {[m
[31m-  int status;[m
[31m-  const char *fname;[m
[31m-  int narg = getargs(L, argv, n);  /* collect arguments */[m
[31m-  lua_setglobal(L, "arg");[m
[31m-  fname = argv[n];[m
[31m-  if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0) [m
[31m-    fname = NULL;  /* stdin */[m
[31m-  status = luaL_loadfile(L, fname);[m
[31m-  lua_insert(L, -(narg+1));[m
[31m-  if (status == 0)[m
[31m-    status = docall(L, narg, 0);[m
[31m-  else[m
[31m-    lua_pop(L, narg);      [m
[31m-  return report(L, status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* check that argument has no extra characters at the end */[m
[31m-#define notail(x)	{if ((x)[2] != '\0') return -1;}[m
[31m-[m
[31m-[m
[31m-static int collectargs (char **argv, int *pi, int *pv, int *pe) {[m
[31m-  int i;[m
[31m-  for (i = 1; argv[i] != NULL; i++) {[m
[31m-    if (argv[i][0] != '-')  /* not an option? */[m
[31m-        return i;[m
[31m-    switch (argv[i][1]) {  /* option */[m
[31m-      case '-':[m
[31m-        notail(argv[i]);[m
[31m-        return (argv[i+1] != NULL ? i+1 : 0);[m
[31m-      case '\0':[m
[31m-        return i;[m
[31m-      case 'i':[m
[31m-        notail(argv[i]);[m
[31m-        *pi = 1;  /* go through */[m
[31m-      case 'v':[m
[31m-        notail(argv[i]);[m
[31m-        *pv = 1;[m
[31m-        break;[m
[31m-      case 'e':[m
[31m-        *pe = 1;  /* go through */[m
[31m-      case 'l':[m
[31m-        if (argv[i][2] == '\0') {[m
[31m-          i++;[m
[31m-          if (argv[i] == NULL) return -1;[m
[31m-        }[m
[31m-        break;[m
[31m-      default: return -1;  /* invalid option */[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int runargs (lua_State *L, char **argv, int n) {[m
[31m-  int i;[m
[31m-  for (i = 1; i < n; i++) {[m
[31m-    if (argv[i] == NULL) continue;[m
[31m-    lua_assert(argv[i][0] == '-');[m
[31m-    switch (argv[i][1]) {  /* option */[m
[31m-      case 'e': {[m
[31m-        const char *chunk = argv[i] + 2;[m
[31m-        if (*chunk == '\0') chunk = argv[++i];[m
[31m-        lua_assert(chunk != NULL);[m
[31m-        if (dostring(L, chunk, "=(command line)") != 0)[m
[31m-          return 1;[m
[31m-        break;[m
[31m-      }[m
[31m-      case 'l': {[m
[31m-        const char *filename = argv[i] + 2;[m
[31m-        if (*filename == '\0') filename = argv[++i];[m
[31m-        lua_assert(filename != NULL);[m
[31m-        if (dolibrary(L, filename))[m
[31m-          return 1;  /* stop if file fails */[m
[31m-        break;[m
[31m-      }[m
[31m-      default: break;[m
[31m-    }[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int handle_luainit (lua_State *L) {[m
[31m-  const char *init = getenv(LUA_INIT);[m
[31m-  if (init == NULL) return 0;  /* status OK */[m
[31m-  else if (init[0] == '@')[m
[31m-    return dofile(L, init+1);[m
[31m-  else[m
[31m-    return dostring(L, init, "=" LUA_INIT);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-struct Smain {[m
[31m-  int argc;[m
[31m-  char **argv;[m
[31m-  int status;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static int pmain (lua_State *L) {[m
[31m-  struct Smain *s = (struct Smain *)lua_touserdata(L, 1);[m
[31m-  char **argv = s->argv;[m
[31m-  int script;[m
[31m-  int has_i = 0, has_v = 0, has_e = 0;[m
[31m-  globalL = L;[m
[31m-  if (argv[0] && argv[0][0]) progname = argv[0];[m
[31m-  lua_gc(L, LUA_GCSTOP, 0);  /* stop collector during initialization */[m
[31m-  luaL_openlibs(L);  /* open libraries */[m
[31m-  lua_gc(L, LUA_GCRESTART, 0);[m
[31m-  s->status = handle_luainit(L);[m
[31m-  if (s->status != 0) return 0;[m
[31m-  script = collectargs(argv, &has_i, &has_v, &has_e);[m
[31m-  if (script < 0) {  /* invalid args? */[m
[31m-    print_usage();[m
[31m-    s->status = 1;[m
[31m-    return 0;[m
[31m-  }[m
[31m-  if (has_v) print_version();[m
[31m-  s->status = runargs(L, argv, (script > 0) ? script : s->argc);[m
[31m-  if (s->status != 0) return 0;[m
[31m-  if (script)[m
[31m-    s->status = handle_script(L, argv, script);[m
[31m-  if (s->status != 0) return 0;[m
[31m-  if (has_i)[m
[31m-    dotty(L);[m
[31m-  else if (script == 0 && !has_e && !has_v) {[m
[31m-    if (lua_stdin_is_tty()) {[m
[31m-      print_version();[m
[31m-      dotty(L);[m
[31m-    }[m
[31m-    else dofile(L, NULL);  /* executes stdin as a file */[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int main (int argc, char **argv) {[m
[31m-  int status;[m
[31m-  struct Smain s;[m
[31m-  lua_State *L = lua_open();  /* create state */[m
[31m-  if (L == NULL) {[m
[31m-    l_message(argv[0], "cannot create state: not enough memory");[m
[31m-    return EXIT_FAILURE;[m
[31m-  }[m
[31m-  s.argc = argc;[m
[31m-  s.argv = argv;[m
[31m-  status = lua_cpcall(L, &pmain, &s);[m
[31m-  report(L, status);[m
[31m-  lua_close(L);[m
[31m-  return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lua.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lua.h[m
[1mdeleted file mode 100644[m
[1mindex a4b73e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lua.h[m
[1m+++ /dev/null[m
[36m@@ -1,388 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lua.h,v 1.218.1.7 2012/01/13 20:36:20 roberto Exp $[m
[31m-** Lua - An Extensible Extension Language[m
[31m-** Lua.org, PUC-Rio, Brazil (http://www.lua.org)[m
[31m-** See Copyright Notice at the end of this file[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lua_h[m
[31m-#define lua_h[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-#include "luaconf.h"[m
[31m-[m
[31m-[m
[31m-#define LUA_VERSION	"Lua 5.1"[m
[31m-#define LUA_RELEASE	"Lua 5.1.5"[m
[31m-#define LUA_VERSION_NUM	501[m
[31m-#define LUA_COPYRIGHT	"Copyright (C) 1994-2012 Lua.org, PUC-Rio"[m
[31m-#define LUA_AUTHORS 	"R. Ierusalimschy, L. H. de Figueiredo & W. Celes"[m
[31m-[m
[31m-[m
[31m-/* mark for precompiled code (`<esc>Lua') */[m
[31m-#define	LUA_SIGNATURE	"\033Lua"[m
[31m-[m
[31m-/* option for multiple returns in `lua_pcall' and `lua_call' */[m
[31m-#define LUA_MULTRET	(-1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** pseudo-indices[m
[31m-*/[m
[31m-#define LUA_REGISTRYINDEX	(-10000)[m
[31m-#define LUA_ENVIRONINDEX	(-10001)[m
[31m-#define LUA_GLOBALSINDEX	(-10002)[m
[31m-#define lua_upvalueindex(i)	(LUA_GLOBALSINDEX-(i))[m
[31m-[m
[31m-[m
[31m-/* thread status; 0 is OK */[m
[31m-#define LUA_YIELD	1[m
[31m-#define LUA_ERRRUN	2[m
[31m-#define LUA_ERRSYNTAX	3[m
[31m-#define LUA_ERRMEM	4[m
[31m-#define LUA_ERRERR	5[m
[31m-[m
[31m-[m
[31m-typedef struct lua_State lua_State;[m
[31m-[m
[31m-typedef int (*lua_CFunction) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** functions that read/write blocks when loading/dumping Lua chunks[m
[31m-*/[m
[31m-typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);[m
[31m-[m
[31m-typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** prototype for memory-allocation functions[m
[31m-*/[m
[31m-typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic types[m
[31m-*/[m
[31m-#define LUA_TNONE		(-1)[m
[31m-[m
[31m-#define LUA_TNIL		0[m
[31m-#define LUA_TBOOLEAN		1[m
[31m-#define LUA_TLIGHTUSERDATA	2[m
[31m-#define LUA_TNUMBER		3[m
[31m-#define LUA_TSTRING		4[m
[31m-#define LUA_TTABLE		5[m
[31m-#define LUA_TFUNCTION		6[m
[31m-#define LUA_TUSERDATA		7[m
[31m-#define LUA_TTHREAD		8[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* minimum Lua stack available to a C function */[m
[31m-#define LUA_MINSTACK	20[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** generic extra include file[m
[31m-*/[m
[31m-#if defined(LUA_USER_H)[m
[31m-#include LUA_USER_H[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* type of numbers in Lua */[m
[31m-typedef LUA_NUMBER lua_Number;[m
[31m-[m
[31m-[m
[31m-/* type for integer functions */[m
[31m-typedef LUA_INTEGER lua_Integer;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** state manipulation[m
[31m-*/[m
[31m-LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);[m
[31m-LUA_API void       (lua_close) (lua_State *L);[m
[31m-LUA_API lua_State *(lua_newthread) (lua_State *L);[m
[31m-[m
[31m-LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** basic stack manipulation[m
[31m-*/[m
[31m-LUA_API int   (lua_gettop) (lua_State *L);[m
[31m-LUA_API void  (lua_settop) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_pushvalue) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_remove) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_insert) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_replace) (lua_State *L, int idx);[m
[31m-LUA_API int   (lua_checkstack) (lua_State *L, int sz);[m
[31m-[m
[31m-LUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** access functions (stack -> C)[m
[31m-*/[m
[31m-[m
[31m-LUA_API int             (lua_isnumber) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isstring) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_iscfunction) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_isuserdata) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_type) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_typename) (lua_State *L, int tp);[m
[31m-[m
[31m-LUA_API int            (lua_equal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_rawequal) (lua_State *L, int idx1, int idx2);[m
[31m-LUA_API int            (lua_lessthan) (lua_State *L, int idx1, int idx2);[m
[31m-[m
[31m-LUA_API lua_Number      (lua_tonumber) (lua_State *L, int idx);[m
[31m-LUA_API lua_Integer     (lua_tointeger) (lua_State *L, int idx);[m
[31m-LUA_API int             (lua_toboolean) (lua_State *L, int idx);[m
[31m-LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);[m
[31m-LUA_API size_t          (lua_objlen) (lua_State *L, int idx);[m
[31m-LUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);[m
[31m-LUA_API void	       *(lua_touserdata) (lua_State *L, int idx);[m
[31m-LUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);[m
[31m-LUA_API const void     *(lua_topointer) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** push functions (C -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_pushnil) (lua_State *L);[m
[31m-LUA_API void  (lua_pushnumber) (lua_State *L, lua_Number n);[m
[31m-LUA_API void  (lua_pushinteger) (lua_State *L, lua_Integer n);[m
[31m-LUA_API void  (lua_pushlstring) (lua_State *L, const char *s, size_t l);[m
[31m-LUA_API void  (lua_pushstring) (lua_State *L, const char *s);[m
[31m-LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,[m
[31m-                                                      va_list argp);[m
[31m-LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);[m
[31m-LUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);[m
[31m-LUA_API void  (lua_pushboolean) (lua_State *L, int b);[m
[31m-LUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);[m
[31m-LUA_API int   (lua_pushthread) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** get functions (Lua -> stack)[m
[31m-*/[m
[31m-LUA_API void  (lua_gettable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_getfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawget) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawgeti) (lua_State *L, int idx, int n);[m
[31m-LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);[m
[31m-LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);[m
[31m-LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API void  (lua_getfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** set functions (stack -> Lua)[m
[31m-*/[m
[31m-LUA_API void  (lua_settable) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);[m
[31m-LUA_API void  (lua_rawset) (lua_State *L, int idx);[m
[31m-LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);[m
[31m-LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);[m
[31m-LUA_API int   (lua_setfenv) (lua_State *L, int idx);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** `load' and `call' functions (load and run Lua code)[m
[31m-*/[m
[31m-LUA_API void  (lua_call) (lua_State *L, int nargs, int nresults);[m
[31m-LUA_API int   (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);[m
[31m-LUA_API int   (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);[m
[31m-LUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt,[m
[31m-                                        const char *chunkname);[m
[31m-[m
[31m-LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** coroutine functions[m
[31m-*/[m
[31m-LUA_API int  (lua_yield) (lua_State *L, int nresults);[m
[31m-LUA_API int  (lua_resume) (lua_State *L, int narg);[m
[31m-LUA_API int  (lua_status) (lua_State *L);[m
[31m-[m
[31m-/*[m
[31m-** garbage-collection function and options[m
[31m-*/[m
[31m-[m
[31m-#define LUA_GCSTOP		0[m
[31m-#define LUA_GCRESTART		1[m
[31m-#define LUA_GCCOLLECT		2[m
[31m-#define LUA_GCCOUNT		3[m
[31m-#define LUA_GCCOUNTB		4[m
[31m-#define LUA_GCSTEP		5[m
[31m-#define LUA_GCSETPAUSE		6[m
[31m-#define LUA_GCSETSTEPMUL	7[m
[31m-[m
[31m-LUA_API int (lua_gc) (lua_State *L, int what, int data);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** miscellaneous functions[m
[31m-*/[m
[31m-[m
[31m-LUA_API int   (lua_error) (lua_State *L);[m
[31m-[m
[31m-LUA_API int   (lua_next) (lua_State *L, int idx);[m
[31m-[m
[31m-LUA_API void  (lua_concat) (lua_State *L, int n);[m
[31m-[m
[31m-LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);[m
[31m-LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* [m
[31m-** ===============================================================[m
[31m-** some useful macros[m
[31m-** ===============================================================[m
[31m-*/[m
[31m-[m
[31m-#define lua_pop(L,n)		lua_settop(L, -(n)-1)[m
[31m-[m
[31m-#define lua_newtable(L)		lua_createtable(L, 0, 0)[m
[31m-[m
[31m-#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))[m
[31m-[m
[31m-#define lua_pushcfunction(L,f)	lua_pushcclosure(L, (f), 0)[m
[31m-[m
[31m-#define lua_strlen(L,i)		lua_objlen(L, (i))[m
[31m-[m
[31m-#define lua_isfunction(L,n)	(lua_type(L, (n)) == LUA_TFUNCTION)[m
[31m-#define lua_istable(L,n)	(lua_type(L, (n)) == LUA_TTABLE)[m
[31m-#define lua_islightuserdata(L,n)	(lua_type(L, (n)) == LUA_TLIGHTUSERDATA)[m
[31m-#define lua_isnil(L,n)		(lua_type(L, (n)) == LUA_TNIL)[m
[31m-#define lua_isboolean(L,n)	(lua_type(L, (n)) == LUA_TBOOLEAN)[m
[31m-#define lua_isthread(L,n)	(lua_type(L, (n)) == LUA_TTHREAD)[m
[31m-#define lua_isnone(L,n)		(lua_type(L, (n)) == LUA_TNONE)[m
[31m-#define lua_isnoneornil(L, n)	(lua_type(L, (n)) <= 0)[m
[31m-[m
[31m-#define lua_pushliteral(L, s)	\[m
[31m-	lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)[m
[31m-[m
[31m-#define lua_setglobal(L,s)	lua_setfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-#define lua_getglobal(L,s)	lua_getfield(L, LUA_GLOBALSINDEX, (s))[m
[31m-[m
[31m-#define lua_tostring(L,i)	lua_tolstring(L, (i), NULL)[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** compatibility macros and functions[m
[31m-*/[m
[31m-[m
[31m-#define lua_open()	luaL_newstate()[m
[31m-[m
[31m-#define lua_getregistry(L)	lua_pushvalue(L, LUA_REGISTRYINDEX)[m
[31m-[m
[31m-#define lua_getgccount(L)	lua_gc(L, LUA_GCCOUNT, 0)[m
[31m-[m
[31m-#define lua_Chunkreader		lua_Reader[m
[31m-#define lua_Chunkwriter		lua_Writer[m
[31m-[m
[31m-[m
[31m-/* hack */[m
[31m-LUA_API void lua_setlevel	(lua_State *from, lua_State *to);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {======================================================================[m
[31m-** Debug API[m
[31m-** =======================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event codes[m
[31m-*/[m
[31m-#define LUA_HOOKCALL	0[m
[31m-#define LUA_HOOKRET	1[m
[31m-#define LUA_HOOKLINE	2[m
[31m-#define LUA_HOOKCOUNT	3[m
[31m-#define LUA_HOOKTAILRET 4[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** Event masks[m
[31m-*/[m
[31m-#define LUA_MASKCALL	(1 << LUA_HOOKCALL)[m
[31m-#define LUA_MASKRET	(1 << LUA_HOOKRET)[m
[31m-#define LUA_MASKLINE	(1 << LUA_HOOKLINE)[m
[31m-#define LUA_MASKCOUNT	(1 << LUA_HOOKCOUNT)[m
[31m-[m
[31m-typedef struct lua_Debug lua_Debug;  /* activation record */[m
[31m-[m
[31m-[m
[31m-/* Functions to be called by the debuger in specific events */[m
[31m-typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);[m
[31m-[m
[31m-[m
[31m-LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar);[m
[31m-LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);[m
[31m-LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);[m
[31m-LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n);[m
[31m-LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n);[m
[31m-[m
[31m-LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);[m
[31m-LUA_API lua_Hook lua_gethook (lua_State *L);[m
[31m-LUA_API int lua_gethookmask (lua_State *L);[m
[31m-LUA_API int lua_gethookcount (lua_State *L);[m
[31m-[m
[31m-[m
[31m-struct lua_Debug {[m
[31m-  int event;[m
[31m-  const char *name;	/* (n) */[m
[31m-  const char *namewhat;	/* (n) `global', `local', `field', `method' */[m
[31m-  const char *what;	/* (S) `Lua', `C', `main', `tail' */[m
[31m-  const char *source;	/* (S) */[m
[31m-  int currentline;	/* (l) */[m
[31m-  int nups;		/* (u) number of upvalues */[m
[31m-  int linedefined;	/* (S) */[m
[31m-  int lastlinedefined;	/* (S) */[m
[31m-  char short_src[LUA_IDSIZE]; /* (S) */[m
[31m-  /* private part */[m
[31m-  int i_ci;  /* active function */[m
[31m-};[m
[31m-[m
[31m-/* }====================================================================== */[m
[31m-[m
[31m-[m
[31m-/******************************************************************************[m
[31m-* Copyright (C) 1994-2012 Lua.org, PUC-Rio.  All rights reserved.[m
[31m-*[m
[31m-* Permission is hereby granted, free of charge, to any person obtaining[m
[31m-* a copy of this software and associated documentation files (the[m
[31m-* "Software"), to deal in the Software without restriction, including[m
[31m-* without limitation the rights to use, copy, modify, merge, publish,[m
[31m-* distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-* permit persons to whom the Software is furnished to do so, subject to[m
[31m-* the following conditions:[m
[31m-*[m
[31m-* The above copyright notice and this permission notice shall be[m
[31m-* included in all copies or substantial portions of the Software.[m
[31m-*[m
[31m-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-******************************************************************************/[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/luac.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/luac.c[m
[1mdeleted file mode 100644[m
[1mindex d070173..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/luac.c[m
[1m+++ /dev/null[m
[36m@@ -1,200 +0,0 @@[m
[31m-/*[m
[31m-** $Id: luac.c,v 1.54 2006/06/02 17:37:11 lhf Exp $[m
[31m-** Lua compiler (saves bytecodes to files; also list bytecodes)[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <errno.h>[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define luac_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-#include "lauxlib.h"[m
[31m-[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lstring.h"[m
[31m-#include "lundump.h"[m
[31m-[m
[31m-#define PROGNAME	"luac"		/* default program name */[m
[31m-#define	OUTPUT		PROGNAME ".out"	/* default output file */[m
[31m-[m
[31m-static int listing=0;			/* list bytecodes? */[m
[31m-static int dumping=1;			/* dump bytecodes? */[m
[31m-static int stripping=0;			/* strip debug information? */[m
[31m-static char Output[]={ OUTPUT };	/* default output file name */[m
[31m-static const char* output=Output;	/* actual output file name */[m
[31m-static const char* progname=PROGNAME;	/* actual program name */[m
[31m-[m
[31m-static void fatal(const char* message)[m
[31m-{[m
[31m- fprintf(stderr,"%s: %s\n",progname,message);[m
[31m- exit(EXIT_FAILURE);[m
[31m-}[m
[31m-[m
[31m-static void cannot(const char* what)[m
[31m-{[m
[31m- fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno));[m
[31m- exit(EXIT_FAILURE);[m
[31m-}[m
[31m-[m
[31m-static void usage(const char* message)[m
[31m-{[m
[31m- if (*message=='-')[m
[31m-  fprintf(stderr,"%s: unrecognized option " LUA_QS "\n",progname,message);[m
[31m- else[m
[31m-  fprintf(stderr,"%s: %s\n",progname,message);[m
[31m- fprintf(stderr,[m
[31m- "usage: %s [options] [filenames].\n"[m
[31m- "Available options are:\n"[m
[31m- "  -        process stdin\n"[m
[31m- "  -l       list\n"[m
[31m- "  -o name  output to file " LUA_QL("name") " (default is \"%s\")\n"[m
[31m- "  -p       parse only\n"[m
[31m- "  -s       strip debug information\n"[m
[31m- "  -v       show version information\n"[m
[31m- "  --       stop handling options\n",[m
[31m- progname,Output);[m
[31m- exit(EXIT_FAILURE);[m
[31m-}[m
[31m-[m
[31m-#define	IS(s)	(strcmp(argv[i],s)==0)[m
[31m-[m
[31m-static int doargs(int argc, char* argv[])[m
[31m-{[m
[31m- int i;[m
[31m- int version=0;[m
[31m- if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0];[m
[31m- for (i=1; i<argc; i++)[m
[31m- {[m
[31m-  if (*argv[i]!='-')			/* end of options; keep it */[m
[31m-   break;[m
[31m-  else if (IS("--"))			/* end of options; skip it */[m
[31m-  {[m
[31m-   ++i;[m
[31m-   if (version) ++version;[m
[31m-   break;[m
[31m-  }[m
[31m-  else if (IS("-"))			/* end of options; use stdin */[m
[31m-   break;[m
[31m-  else if (IS("-l"))			/* list */[m
[31m-   ++listing;[m
[31m-  else if (IS("-o"))			/* output file */[m
[31m-  {[m
[31m-   output=argv[++i];[m
[31m-   if (output==NULL || *output==0) usage(LUA_QL("-o") " needs argument");[m
[31m-   if (IS("-")) output=NULL;[m
[31m-  }[m
[31m-  else if (IS("-p"))			/* parse only */[m
[31m-   dumping=0;[m
[31m-  else if (IS("-s"))			/* strip debug information */[m
[31m-   stripping=1;[m
[31m-  else if (IS("-v"))			/* show version */[m
[31m-   ++version;[m
[31m-  else					/* unknown option */[m
[31m-   usage(argv[i]);[m
[31m- }[m
[31m- if (i==argc && (listing || !dumping))[m
[31m- {[m
[31m-  dumping=0;[m
[31m-  argv[--i]=Output;[m
[31m- }[m
[31m- if (version)[m
[31m- {[m
[31m-  printf("%s  %s\n",LUA_RELEASE,LUA_COPYRIGHT);[m
[31m-  if (version==argc-1) exit(EXIT_SUCCESS);[m
[31m- }[m
[31m- return i;[m
[31m-}[m
[31m-[m
[31m-#define toproto(L,i) (clvalue(L->top+(i))->l.p)[m
[31m-[m
[31m-static const Proto* combine(lua_State* L, int n)[m
[31m-{[m
[31m- if (n==1)[m
[31m-  return toproto(L,-1);[m
[31m- else[m
[31m- {[m
[31m-  int i,pc;[m
[31m-  Proto* f=luaF_newproto(L);[m
[31m-  setptvalue2s(L,L->top,f); incr_top(L);[m
[31m-  f->source=luaS_newliteral(L,"=(" PROGNAME ")");[m
[31m-  f->maxstacksize=1;[m
[31m-  pc=2*n+1;[m
[31m-  f->code=luaM_newvector(L,pc,Instruction);[m
[31m-  f->sizecode=pc;[m
[31m-  f->p=luaM_newvector(L,n,Proto*);[m
[31m-  f->sizep=n;[m
[31m-  pc=0;[m
[31m-  for (i=0; i<n; i++)[m
[31m-  {[m
[31m-   f->p[i]=toproto(L,i-n-1);[m
[31m-   f->code[pc++]=CREATE_ABx(OP_CLOSURE,0,i);[m
[31m-   f->code[pc++]=CREATE_ABC(OP_CALL,0,1,1);[m
[31m-  }[m
[31m-  f->code[pc++]=CREATE_ABC(OP_RETURN,0,1,0);[m
[31m-  return f;[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static int writer(lua_State* L, const void* p, size_t size, void* u)[m
[31m-{[m
[31m- UNUSED(L);[m
[31m- return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0);[m
[31m-}[m
[31m-[m
[31m-struct Smain {[m
[31m- int argc;[m
[31m- char** argv;[m
[31m-};[m
[31m-[m
[31m-static int pmain(lua_State* L)[m
[31m-{[m
[31m- struct Smain* s = (struct Smain*)lua_touserdata(L, 1);[m
[31m- int argc=s->argc;[m
[31m- char** argv=s->argv;[m
[31m- const Proto* f;[m
[31m- int i;[m
[31m- if (!lua_checkstack(L,argc)) fatal("too many input files");[m
[31m- for (i=0; i<argc; i++)[m
[31m- {[m
[31m-  const char* filename=IS("-") ? NULL : argv[i];[m
[31m-  if (luaL_loadfile(L,filename)!=0) fatal(lua_tostring(L,-1));[m
[31m- }[m
[31m- f=combine(L,argc);[m
[31m- if (listing) luaU_print(f,listing>1);[m
[31m- if (dumping)[m
[31m- {[m
[31m-  FILE* D= (output==NULL) ? stdout : fopen(output,"wb");[m
[31m-  if (D==NULL) cannot("open");[m
[31m-  lua_lock(L);[m
[31m-  luaU_dump(L,f,writer,D,stripping);[m
[31m-  lua_unlock(L);[m
[31m-  if (ferror(D)) cannot("write");[m
[31m-  if (fclose(D)) cannot("close");[m
[31m- }[m
[31m- return 0;[m
[31m-}[m
[31m-[m
[31m-int main(int argc, char* argv[])[m
[31m-{[m
[31m- lua_State* L;[m
[31m- struct Smain s;[m
[31m- int i=doargs(argc,argv);[m
[31m- argc-=i; argv+=i;[m
[31m- if (argc<=0) usage("no input files given");[m
[31m- L=lua_open();[m
[31m- if (L==NULL) fatal("not enough memory for state");[m
[31m- s.argc=argc;[m
[31m- s.argv=argv;[m
[31m- if (lua_cpcall(L,pmain,&s)!=0) fatal(lua_tostring(L,-1));[m
[31m- lua_close(L);[m
[31m- return EXIT_SUCCESS;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/luaconf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/luaconf.h[m
[1mdeleted file mode 100644[m
[1mindex 0979942..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/luaconf.h[m
[1m+++ /dev/null[m
[36m@@ -1,768 +0,0 @@[m
[31m-/*[m
[31m-** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $[m
[31m-** Configuration file for Lua[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lconfig_h[m
[31m-#define lconfig_h[m
[31m-[m
[31m-#include <limits.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** ==================================================================[m
[31m-** Search for "@@" to find all configurable definitions.[m
[31m-** ===================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_ANSI controls the use of non-ansi features.[m
[31m-** CHANGE it (define it) if you want Lua to avoid the use of any[m
[31m-** non-ansi feature or library.[m
[31m-*/[m
[31m-#if defined(__STRICT_ANSI__)[m
[31m-#define LUA_ANSI[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if !defined(LUA_ANSI) && defined(_WIN32)[m
[31m-#define LUA_WIN[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUA_USE_LINUX)[m
[31m-#define LUA_USE_POSIX[m
[31m-#define LUA_USE_DLOPEN		/* needs an extra library: -ldl */[m
[31m-#define LUA_USE_READLINE	/* needs some extra libraries */[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUA_USE_MACOSX)[m
[31m-#define LUA_USE_POSIX[m
[31m-#define LUA_DL_DYLD		/* does not need extra library */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_USE_POSIX includes all functionallity listed as X/Open System[m
[31m-@* Interfaces Extension (XSI).[m
[31m-** CHANGE it (define it) if your system is XSI compatible.[m
[31m-*/[m
[31m-#if defined(LUA_USE_POSIX)[m
[31m-#define LUA_USE_MKSTEMP[m
[31m-#define LUA_USE_ISATTY[m
[31m-#define LUA_USE_POPEN[m
[31m-#define LUA_USE_ULONGJMP[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PATH and LUA_CPATH are the names of the environment variables that[m
[31m-@* Lua check to set its paths.[m
[31m-@@ LUA_INIT is the name of the environment variable that Lua[m
[31m-@* checks for initialization code.[m
[31m-** CHANGE them if you want different names.[m
[31m-*/[m
[31m-#define LUA_PATH        "LUA_PATH"[m
[31m-#define LUA_CPATH       "LUA_CPATH"[m
[31m-#define LUA_INIT	"LUA_INIT"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for[m
[31m-@* Lua libraries.[m
[31m-@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for[m
[31m-@* C libraries.[m
[31m-** CHANGE them if your machine has a non-conventional directory[m
[31m-** hierarchy or if you want to install your libraries in[m
[31m-** non-conventional directories.[m
[31m-*/[m
[31m-#if defined(_WIN32)[m
[31m-/*[m
[31m-** In Windows, any exclamation mark ('!') in the path is replaced by the[m
[31m-** path of the directory of the executable file of the current process.[m
[31m-*/[m
[31m-#define LUA_LDIR	"!\\lua\\"[m
[31m-#define LUA_CDIR	"!\\"[m
[31m-#define LUA_PATH_DEFAULT  \[m
[31m-		".\\?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?\\init.lua;" \[m
[31m-		             LUA_CDIR"?.lua;"  LUA_CDIR"?\\init.lua"[m
[31m-#define LUA_CPATH_DEFAULT \[m
[31m-	".\\?.dll;"  LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"[m
[31m-[m
[31m-#else[m
[31m-#define LUA_ROOT	"/usr/local/"[m
[31m-#define LUA_LDIR	LUA_ROOT "share/lua/5.1/"[m
[31m-#define LUA_CDIR	LUA_ROOT "lib/lua/5.1/"[m
[31m-#define LUA_PATH_DEFAULT  \[m
[31m-		"./?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?/init.lua;" \[m
[31m-		            LUA_CDIR"?.lua;"  LUA_CDIR"?/init.lua"[m
[31m-#define LUA_CPATH_DEFAULT \[m
[31m-	"./?.so;"  LUA_CDIR"?.so;" LUA_CDIR"loadall.so"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_DIRSEP is the directory separator (for submodules).[m
[31m-** CHANGE it if your machine does not use "/" as the directory separator[m
[31m-** and is not Windows. (On Windows Lua automatically uses "\".)[m
[31m-*/[m
[31m-#if defined(_WIN32)[m
[31m-#define LUA_DIRSEP	"\\"[m
[31m-#else[m
[31m-#define LUA_DIRSEP	"/"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PATHSEP is the character that separates templates in a path.[m
[31m-@@ LUA_PATH_MARK is the string that marks the substitution points in a[m
[31m-@* template.[m
[31m-@@ LUA_EXECDIR in a Windows path is replaced by the executable's[m
[31m-@* directory.[m
[31m-@@ LUA_IGMARK is a mark to ignore all before it when bulding the[m
[31m-@* luaopen_ function name.[m
[31m-** CHANGE them if for some reason your system cannot use those[m
[31m-** characters. (E.g., if one of those characters is a common character[m
[31m-** in file/directory names.) Probably you do not need to change them.[m
[31m-*/[m
[31m-#define LUA_PATHSEP	";"[m
[31m-#define LUA_PATH_MARK	"?"[m
[31m-#define LUA_EXECDIR	"!"[m
[31m-#define LUA_IGMARK	"-"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger.[m
[31m-** CHANGE that if ptrdiff_t is not adequate on your machine. (On most[m
[31m-** machines, ptrdiff_t gives a good choice between int or long.)[m
[31m-*/[m
[31m-#define LUA_INTEGER	ptrdiff_t[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_API is a mark for all core API functions.[m
[31m-@@ LUALIB_API is a mark for all standard library functions.[m
[31m-** CHANGE them if you need to define those functions in some special way.[m
[31m-** For instance, if you want to create one Windows DLL with the core and[m
[31m-** the libraries, you may want to use the following definition (define[m
[31m-** LUA_BUILD_AS_DLL to get it).[m
[31m-*/[m
[31m-#if defined(LUA_BUILD_AS_DLL)[m
[31m-[m
[31m-#if defined(LUA_CORE) || defined(LUA_LIB)[m
[31m-#define LUA_API __declspec(dllexport)[m
[31m-#else[m
[31m-#define LUA_API __declspec(dllimport)[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define LUA_API		extern[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* more often than not the libs go together with the core */[m
[31m-#define LUALIB_API	LUA_API[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_FUNC is a mark for all extern functions that are not to be[m
[31m-@* exported to outside modules.[m
[31m-@@ LUAI_DATA is a mark for all extern (const) variables that are not to[m
[31m-@* be exported to outside modules.[m
[31m-** CHANGE them if you need to mark them in some special way. Elf/gcc[m
[31m-** (versions 3.2 and later) mark them as "hidden" to optimize access[m
[31m-** when Lua is compiled as a shared library.[m
[31m-*/[m
[31m-#if defined(luaall_c)[m
[31m-#define LUAI_FUNC	static[m
[31m-#define LUAI_DATA	/* empty */[m
[31m-[m
[31m-#elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \[m
[31m-      defined(__ELF__)[m
[31m-#define LUAI_FUNC	__attribute__((visibility("hidden"))) extern[m
[31m-#define LUAI_DATA	LUAI_FUNC[m
[31m-[m
[31m-#else[m
[31m-#define LUAI_FUNC	extern[m
[31m-#define LUAI_DATA	extern[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_QL describes how error messages quote program elements.[m
[31m-** CHANGE it if you want a different appearance.[m
[31m-*/[m
[31m-#define LUA_QL(x)	"'" x "'"[m
[31m-#define LUA_QS		LUA_QL("%s")[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_IDSIZE gives the maximum size for the description of the source[m
[31m-@* of a function in debug information.[m
[31m-** CHANGE it if you want a different size.[m
[31m-*/[m
[31m-#define LUA_IDSIZE	60[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {==================================================================[m
[31m-** Stand-alone configuration[m
[31m-** ===================================================================[m
[31m-*/[m
[31m-[m
[31m-#if defined(lua_c) || defined(luaall_c)[m
[31m-[m
[31m-/*[m
[31m-@@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that[m
[31m-@* is, whether we're running lua interactively).[m
[31m-** CHANGE it if you have a better definition for non-POSIX/non-Windows[m
[31m-** systems.[m
[31m-*/[m
[31m-#if defined(LUA_USE_ISATTY)[m
[31m-#include <unistd.h>[m
[31m-#define lua_stdin_is_tty()	isatty(0)[m
[31m-#elif defined(LUA_WIN)[m
[31m-#include <io.h>[m
[31m-#include <stdio.h>[m
[31m-#define lua_stdin_is_tty()	_isatty(_fileno(stdin))[m
[31m-#else[m
[31m-#define lua_stdin_is_tty()	1  /* assume stdin is a tty */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PROMPT is the default prompt used by stand-alone Lua.[m
[31m-@@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua.[m
[31m-** CHANGE them if you want different prompts. (You can also change the[m
[31m-** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.)[m
[31m-*/[m
[31m-#define LUA_PROMPT		"> "[m
[31m-#define LUA_PROMPT2		">> "[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_PROGNAME is the default name for the stand-alone Lua program.[m
[31m-** CHANGE it if your stand-alone interpreter has a different name and[m
[31m-** your system is not able to detect that name automatically.[m
[31m-*/[m
[31m-#define LUA_PROGNAME		"lua"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_MAXINPUT is the maximum length for an input line in the[m
[31m-@* stand-alone interpreter.[m
[31m-** CHANGE it if you need longer lines.[m
[31m-*/[m
[31m-#define LUA_MAXINPUT	512[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ lua_readline defines how to show a prompt and then read a line from[m
[31m-@* the standard input.[m
[31m-@@ lua_saveline defines how to "save" a read line in a "history".[m
[31m-@@ lua_freeline defines how to free a line read by lua_readline.[m
[31m-** CHANGE them if you want to improve this functionality (e.g., by using[m
[31m-** GNU readline and history facilities).[m
[31m-*/[m
[31m-#if defined(LUA_USE_READLINE)[m
[31m-#include <stdio.h>[m
[31m-#include <readline/readline.h>[m
[31m-#include <readline/history.h>[m
[31m-#define lua_readline(L,b,p)	((void)L, ((b)=readline(p)) != NULL)[m
[31m-#define lua_saveline(L,idx) \[m
[31m-	if (lua_strlen(L,idx) > 0)  /* non-empty line? */ \[m
[31m-	  add_history(lua_tostring(L, idx));  /* add it to history */[m
[31m-#define lua_freeline(L,b)	((void)L, free(b))[m
[31m-#else[m
[31m-#define lua_readline(L,b,p)	\[m
[31m-	((void)L, fputs(p, stdout), fflush(stdout),  /* show prompt */ \[m
[31m-	fgets(b, LUA_MAXINPUT, stdin) != NULL)  /* get line */[m
[31m-#define lua_saveline(L,idx)	{ (void)L; (void)idx; }[m
[31m-#define lua_freeline(L,b)	{ (void)L; (void)b; }[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* }================================================================== */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles[m
[31m-@* as a percentage.[m
[31m-** CHANGE it if you want the GC to run faster or slower (higher values[m
[31m-** mean larger pauses which mean slower collection.) You can also change[m
[31m-** this value dynamically.[m
[31m-*/[m
[31m-#define LUAI_GCPAUSE	200  /* 200% (wait memory to double before next GC) */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_GCMUL defines the default speed of garbage collection relative to[m
[31m-@* memory allocation as a percentage.[m
[31m-** CHANGE it if you want to change the granularity of the garbage[m
[31m-** collection. (Higher values mean coarser collections. 0 represents[m
[31m-** infinity, where each step performs a full collection.) You can also[m
[31m-** change this value dynamically.[m
[31m-*/[m
[31m-#define LUAI_GCMUL	200 /* GC runs 'twice the speed' of memory allocation */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_GETN controls compatibility with old getn behavior.[m
[31m-** CHANGE it (define it) if you want exact compatibility with the[m
[31m-** behavior of setn/getn in Lua 5.0.[m
[31m-*/[m
[31m-#undef LUA_COMPAT_GETN[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib.[m
[31m-** CHANGE it to undefined as soon as you do not need a global 'loadlib'[m
[31m-** function (the function is still available as 'package.loadlib').[m
[31m-*/[m
[31m-#undef LUA_COMPAT_LOADLIB[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_VARARG controls compatibility with old vararg feature.[m
[31m-** CHANGE it to undefined as soon as your programs use only '...' to[m
[31m-** access vararg parameters (instead of the old 'arg' table).[m
[31m-*/[m
[31m-#define LUA_COMPAT_VARARG[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_MOD controls compatibility with old math.mod function.[m
[31m-** CHANGE it to undefined as soon as your programs use 'math.fmod' or[m
[31m-** the new '%' operator instead of 'math.mod'.[m
[31m-*/[m
[31m-#define LUA_COMPAT_MOD[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting[m
[31m-@* facility.[m
[31m-** CHANGE it to 2 if you want the old behaviour, or undefine it to turn[m
[31m-** off the advisory error when nesting [[...]].[m
[31m-*/[m
[31m-#define LUA_COMPAT_LSTR		1[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name.[m
[31m-** CHANGE it to undefined as soon as you rename 'string.gfind' to[m
[31m-** 'string.gmatch'.[m
[31m-*/[m
[31m-#define LUA_COMPAT_GFIND[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib'[m
[31m-@* behavior.[m
[31m-** CHANGE it to undefined as soon as you replace to 'luaL_register'[m
[31m-** your uses of 'luaL_openlib'[m
[31m-*/[m
[31m-#define LUA_COMPAT_OPENLIB[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ luai_apicheck is the assert macro used by the Lua-C API.[m
[31m-** CHANGE luai_apicheck if you want Lua to perform some checks in the[m
[31m-** parameters it gets from API calls. This may slow down the interpreter[m
[31m-** a bit, but may be quite useful when debugging C code that interfaces[m
[31m-** with Lua. A useful redefinition is to use assert.h.[m
[31m-*/[m
[31m-#if defined(LUA_USE_APICHECK)[m
[31m-#include <assert.h>[m
[31m-#define luai_apicheck(L,o)	{ (void)L; assert(o); }[m
[31m-#else[m
[31m-#define luai_apicheck(L,o)	{ (void)L; }[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_BITSINT defines the number of bits in an int.[m
[31m-** CHANGE here if Lua cannot automatically detect the number of bits of[m
[31m-** your machine. Probably you do not need to change this.[m
[31m-*/[m
[31m-/* avoid overflows in comparison */[m
[31m-#if INT_MAX-20 < 32760[m
[31m-#define LUAI_BITSINT	16[m
[31m-#elif INT_MAX > 2147483640L[m
[31m-/* int has at least 32 bits */[m
[31m-#define LUAI_BITSINT	32[m
[31m-#else[m
[31m-#error "you must define LUA_BITSINT with number of bits in an integer"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_UINT32 is an unsigned integer with at least 32 bits.[m
[31m-@@ LUAI_INT32 is an signed integer with at least 32 bits.[m
[31m-@@ LUAI_UMEM is an unsigned integer big enough to count the total[m
[31m-@* memory used by Lua.[m
[31m-@@ LUAI_MEM is a signed integer big enough to count the total memory[m
[31m-@* used by Lua.[m
[31m-** CHANGE here if for some weird reason the default definitions are not[m
[31m-** good enough for your machine. (The definitions in the 'else'[m
[31m-** part always works, but may waste space on machines with 64-bit[m
[31m-** longs.) Probably you do not need to change this.[m
[31m-*/[m
[31m-#if LUAI_BITSINT >= 32[m
[31m-#define LUAI_UINT32	unsigned int[m
[31m-#define LUAI_INT32	int[m
[31m-#define LUAI_MAXINT32	INT_MAX[m
[31m-#define LUAI_UMEM	size_t[m
[31m-#define LUAI_MEM	ptrdiff_t[m
[31m-#else[m
[31m-/* 16-bit ints */[m
[31m-#define LUAI_UINT32	unsigned long[m
[31m-#define LUAI_INT32	long[m
[31m-#define LUAI_MAXINT32	LONG_MAX[m
[31m-#define LUAI_UMEM	unsigned long[m
[31m-#define LUAI_MEM	long[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXCALLS limits the number of nested calls.[m
[31m-** CHANGE it if you need really deep recursive calls. This limit is[m
[31m-** arbitrary; its only purpose is to stop infinite recursion before[m
[31m-** exhausting memory.[m
[31m-*/[m
[31m-#define LUAI_MAXCALLS	20000[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function[m
[31m-@* can use.[m
[31m-** CHANGE it if you need lots of (Lua) stack space for your C[m
[31m-** functions. This limit is arbitrary; its only purpose is to stop C[m
[31m-** functions to consume unlimited stack space. (must be smaller than[m
[31m-** -LUA_REGISTRYINDEX)[m
[31m-*/[m
[31m-#define LUAI_MAXCSTACK	8000[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {==================================================================[m
[31m-** CHANGE (to smaller values) the following definitions if your system[m
[31m-** has a small C stack. (Or you may want to change them to larger[m
[31m-** values if your system has a large C stack and these limits are[m
[31m-** too rigid for you.) Some of these constants control the size of[m
[31m-** stack-allocated arrays used by the compiler or the interpreter, while[m
[31m-** others limit the maximum number of recursive calls that the compiler[m
[31m-** or the interpreter can perform. Values too large may cause a C stack[m
[31m-** overflow for some forms of deep constructs.[m
[31m-** ===================================================================[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and[m
[31m-@* syntactical nested non-terminals in a program.[m
[31m-*/[m
[31m-#define LUAI_MAXCCALLS		200[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXVARS is the maximum number of local variables per function[m
[31m-@* (must be smaller than 250).[m
[31m-*/[m
[31m-#define LUAI_MAXVARS		200[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function[m
[31m-@* (must be smaller than 250).[m
[31m-*/[m
[31m-#define LUAI_MAXUPVALUES	60[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.[m
[31m-*/[m
[31m-#define LUAL_BUFFERSIZE		BUFSIZ[m
[31m-[m
[31m-/* }================================================================== */[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** {==================================================================[m
[31m-@@ LUA_NUMBER is the type of numbers in Lua.[m
[31m-** CHANGE the following definitions only if you want to build Lua[m
[31m-** with a number type different from double. You may also need to[m
[31m-** change lua_number2int & lua_number2integer.[m
[31m-** ===================================================================[m
[31m-*/[m
[31m-[m
[31m-#define LUA_NUMBER_DOUBLE[m
[31m-#define LUA_NUMBER	double[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'[m
[31m-@* over a number.[m
[31m-*/[m
[31m-#define LUAI_UACNUMBER	double[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_NUMBER_SCAN is the format for reading numbers.[m
[31m-@@ LUA_NUMBER_FMT is the format for writing numbers.[m
[31m-@@ lua_number2str converts a number to a string.[m
[31m-@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion.[m
[31m-@@ lua_str2number converts a string to a number.[m
[31m-*/[m
[31m-#define LUA_NUMBER_SCAN		"%lf"[m
[31m-#define LUA_NUMBER_FMT		"%.14g"[m
[31m-#define lua_number2str(s,n)	sprintf((s), LUA_NUMBER_FMT, (n))[m
[31m-#define LUAI_MAXNUMBER2STR	32 /* 16 digits, sign, point, and \0 */[m
[31m-#define lua_str2number(s,p)	strtod((s), (p))[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ The luai_num* macros define the primitive operations over numbers.[m
[31m-*/[m
[31m-#if defined(LUA_CORE)[m
[31m-#include <math.h>[m
[31m-#define luai_numadd(a,b)	((a)+(b))[m
[31m-#define luai_numsub(a,b)	((a)-(b))[m
[31m-#define luai_nummul(a,b)	((a)*(b))[m
[31m-#define luai_numdiv(a,b)	((a)/(b))[m
[31m-#define luai_nummod(a,b)	((a) - floor((a)/(b))*(b))[m
[31m-#define luai_numpow(a,b)	(pow(a,b))[m
[31m-#define luai_numunm(a)		(-(a))[m
[31m-#define luai_numeq(a,b)		((a)==(b))[m
[31m-#define luai_numlt(a,b)		((a)<(b))[m
[31m-#define luai_numle(a,b)		((a)<=(b))[m
[31m-#define luai_numisnan(a)	(!luai_numeq((a), (a)))[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ lua_number2int is a macro to convert lua_Number to int.[m
[31m-@@ lua_number2integer is a macro to convert lua_Number to lua_Integer.[m
[31m-** CHANGE them if you know a faster way to convert a lua_Number to[m
[31m-** int (with any rounding method and without throwing errors) in your[m
[31m-** system. In Pentium machines, a naive typecast from double to int[m
[31m-** in C is extremely slow, so any alternative is worth trying.[m
[31m-*/[m
[31m-[m
[31m-/* On a Pentium, resort to a trick */[m
[31m-#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \[m
[31m-    (defined(__i386) || defined (_M_IX86) || defined(__i386__))[m
[31m-[m
[31m-/* On a Microsoft compiler, use assembler */[m
[31m-#if defined(_MSC_VER)[m
[31m-[m
[31m-#define lua_number2int(i,d)   __asm fld d   __asm fistp i[m
[31m-#define lua_number2integer(i,n)		lua_number2int(i, n)[m
[31m-[m
[31m-/* the next trick should work on any Pentium, but sometimes clashes[m
[31m-   with a DirectX idiosyncrasy */[m
[31m-#else[m
[31m-[m
[31m-union luai_Cast { double l_d; long l_l; };[m
[31m-#define lua_number2int(i,d) \[m
[31m-  { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }[m
[31m-#define lua_number2integer(i,n)		lua_number2int(i, n)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* this option always works, but may be slow */[m
[31m-#else[m
[31m-#define lua_number2int(i,d)	((i)=(int)(d))[m
[31m-#define lua_number2integer(i,d)	((i)=(lua_Integer)(d))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* }================================================================== */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment.[m
[31m-** CHANGE it if your system requires alignments larger than double. (For[m
[31m-** instance, if your system supports long doubles and they must be[m
[31m-** aligned in 16-byte boundaries, then you should add long double in the[m
[31m-** union.) Probably you do not need to change this.[m
[31m-*/[m
[31m-#define LUAI_USER_ALIGNMENT_T	union { double u; void *s; long l; }[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_THROW/LUAI_TRY define how Lua does exception handling.[m
[31m-** CHANGE them if you prefer to use longjmp/setjmp even with C++[m
[31m-** or if want/don't to use _longjmp/_setjmp instead of regular[m
[31m-** longjmp/setjmp. By default, Lua handles errors with exceptions when[m
[31m-** compiling as C++ code, with _longjmp/_setjmp when asked to use them,[m
[31m-** and with longjmp/setjmp otherwise.[m
[31m-*/[m
[31m-#if defined(__cplusplus)[m
[31m-/* C++ exceptions */[m
[31m-#define LUAI_THROW(L,c)	throw(c)[m
[31m-#define LUAI_TRY(L,c,a)	try { a } catch(...) \[m
[31m-	{ if ((c)->status == 0) (c)->status = -1; }[m
[31m-#define luai_jmpbuf	int  /* dummy variable */[m
[31m-[m
[31m-#elif defined(LUA_USE_ULONGJMP)[m
[31m-/* in Unix, try _longjmp/_setjmp (more efficient) */[m
[31m-#define LUAI_THROW(L,c)	_longjmp((c)->b, 1)[m
[31m-#define LUAI_TRY(L,c,a)	if (_setjmp((c)->b) == 0) { a }[m
[31m-#define luai_jmpbuf	jmp_buf[m
[31m-[m
[31m-#else[m
[31m-/* default handling with long jumps */[m
[31m-#define LUAI_THROW(L,c)	longjmp((c)->b, 1)[m
[31m-#define LUAI_TRY(L,c,a)	if (setjmp((c)->b) == 0) { a }[m
[31m-#define luai_jmpbuf	jmp_buf[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_MAXCAPTURES is the maximum number of captures that a pattern[m
[31m-@* can do during pattern-matching.[m
[31m-** CHANGE it if you need more captures. This limit is arbitrary.[m
[31m-*/[m
[31m-#define LUA_MAXCAPTURES		32[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ lua_tmpnam is the function that the OS library uses to create a[m
[31m-@* temporary name.[m
[31m-@@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam.[m
[31m-** CHANGE them if you have an alternative to tmpnam (which is considered[m
[31m-** insecure) or if you want the original tmpnam anyway.  By default, Lua[m
[31m-** uses tmpnam except when POSIX is available, where it uses mkstemp.[m
[31m-*/[m
[31m-#if defined(loslib_c) || defined(luaall_c)[m
[31m-[m
[31m-#if defined(LUA_USE_MKSTEMP)[m
[31m-#include <unistd.h>[m
[31m-#define LUA_TMPNAMBUFSIZE	32[m
[31m-#define lua_tmpnam(b,e)	{ \[m
[31m-	strcpy(b, "/tmp/lua_XXXXXX"); \[m
[31m-	e = mkstemp(b); \[m
[31m-	if (e != -1) close(e); \[m
[31m-	e = (e == -1); }[m
[31m-[m
[31m-#else[m
[31m-#define LUA_TMPNAMBUFSIZE	L_tmpnam[m
[31m-#define lua_tmpnam(b,e)		{ e = (tmpnam(b) == NULL); }[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ lua_popen spawns a new process connected to the current one through[m
[31m-@* the file streams.[m
[31m-** CHANGE it if you have a way to implement it in your system.[m
[31m-*/[m
[31m-#if defined(LUA_USE_POPEN)[m
[31m-[m
[31m-#define lua_popen(L,c,m)	((void)L, fflush(NULL), popen(c,m))[m
[31m-#define lua_pclose(L,file)	((void)L, (pclose(file) != -1))[m
[31m-[m
[31m-#elif defined(LUA_WIN)[m
[31m-[m
[31m-#define lua_popen(L,c,m)	((void)L, _popen(c,m))[m
[31m-#define lua_pclose(L,file)	((void)L, (_pclose(file) != -1))[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define lua_popen(L,c,m)	((void)((void)c, m),  \[m
[31m-		luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0)[m
[31m-#define lua_pclose(L,file)		((void)((void)L, file), 0)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_DL_* define which dynamic-library system Lua should use.[m
[31m-** CHANGE here if Lua has problems choosing the appropriate[m
[31m-** dynamic-library system for your platform (either Windows' DLL, Mac's[m
[31m-** dyld, or Unix's dlopen). If your system is some kind of Unix, there[m
[31m-** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for[m
[31m-** it.  To use dlopen you also need to adapt the src/Makefile (probably[m
[31m-** adding -ldl to the linker options), so Lua does not select it[m
[31m-** automatically.  (When you change the makefile to add -ldl, you must[m
[31m-** also add -DLUA_USE_DLOPEN.)[m
[31m-** If you do not want any kind of dynamic library, undefine all these[m
[31m-** options.[m
[31m-** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD.[m
[31m-*/[m
[31m-#if defined(LUA_USE_DLOPEN)[m
[31m-#define LUA_DL_DLOPEN[m
[31m-#endif[m
[31m-[m
[31m-#if defined(LUA_WIN)[m
[31m-#define LUA_DL_DLL[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State[m
[31m-@* (the data goes just *before* the lua_State pointer).[m
[31m-** CHANGE (define) this if you really need that. This value must be[m
[31m-** a multiple of the maximum alignment required for your machine.[m
[31m-*/[m
[31m-#define LUAI_EXTRASPACE		0[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ luai_userstate* allow user-specific actions on threads.[m
[31m-** CHANGE them if you defined LUAI_EXTRASPACE and need to do something[m
[31m-** extra when a thread is created/deleted/resumed/yielded.[m
[31m-*/[m
[31m-#define luai_userstateopen(L)		((void)L)[m
[31m-#define luai_userstateclose(L)		((void)L)[m
[31m-#define luai_userstatethread(L,L1)	((void)L)[m
[31m-#define luai_userstatefree(L)		((void)L)[m
[31m-#define luai_userstateresume(L,n)	((void)L)[m
[31m-#define luai_userstateyield(L,n)	((void)L)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-@@ LUA_INTFRMLEN is the length modifier for integer conversions[m
[31m-@* in 'string.format'.[m
[31m-@@ LUA_INTFRM_T is the integer type correspoding to the previous length[m
[31m-@* modifier.[m
[31m-** CHANGE them if your system supports long long or does not support long.[m
[31m-*/[m
[31m-[m
[31m-#if defined(LUA_USELONGLONG)[m
[31m-[m
[31m-#define LUA_INTFRMLEN		"ll"[m
[31m-#define LUA_INTFRM_T		long long[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define LUA_INTFRMLEN		"l"[m
[31m-#define LUA_INTFRM_T		long[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* =================================================================== */[m
[31m-[m
[31m-/*[m
[31m-** Local configuration. You can use this space to add your redefinitions[m
[31m-** without modifying the main part of the file.[m
[31m-*/[m
[31m-[m
[31m-#undef LUA_COMPAT_VARARG[m
[31m-#undef LUA_COMPAT_MOD[m
[31m-#undef LUA_COMPAT_LSTR[m
[31m-#undef LUA_COMPAT_GFIND[m
[31m-#undef LUA_COMPAT_OPENLIB[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lualib.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lualib.h[m
[1mdeleted file mode 100644[m
[1mindex 469417f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lualib.h[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lua standard libraries[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lualib_h[m
[31m-#define lualib_h[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-[m
[31m-/* Key to file-handle type */[m
[31m-#define LUA_FILEHANDLE		"FILE*"[m
[31m-[m
[31m-[m
[31m-#define LUA_COLIBNAME	"coroutine"[m
[31m-LUALIB_API int (luaopen_base) (lua_State *L);[m
[31m-[m
[31m-#define LUA_TABLIBNAME	"table"[m
[31m-LUALIB_API int (luaopen_table) (lua_State *L);[m
[31m-[m
[31m-#define LUA_IOLIBNAME	"io"[m
[31m-LUALIB_API int (luaopen_io) (lua_State *L);[m
[31m-[m
[31m-#define LUA_OSLIBNAME	"os"[m
[31m-LUALIB_API int (luaopen_os) (lua_State *L);[m
[31m-[m
[31m-#define LUA_STRLIBNAME	"string"[m
[31m-LUALIB_API int (luaopen_string) (lua_State *L);[m
[31m-[m
[31m-#define LUA_MATHLIBNAME	"math"[m
[31m-LUALIB_API int (luaopen_math) (lua_State *L);[m
[31m-[m
[31m-#define LUA_DBLIBNAME	"debug"[m
[31m-LUALIB_API int (luaopen_debug) (lua_State *L);[m
[31m-[m
[31m-#define LUA_LOADLIBNAME	"package"[m
[31m-LUALIB_API int (luaopen_package) (lua_State *L);[m
[31m-[m
[31m-[m
[31m-/* open all previous libraries */[m
[31m-LUALIB_API void (luaL_openlibs) (lua_State *L); [m
[31m-[m
[31m-[m
[31m-[m
[31m-#ifndef lua_assert[m
[31m-#define lua_assert(x)	((void)0)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lundump.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lundump.c[m
[1mdeleted file mode 100644[m
[1mindex 8010a45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lundump.c[m
[1m+++ /dev/null[m
[36m@@ -1,227 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $[m
[31m-** load precompiled Lua chunks[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lundump_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lstring.h"[m
[31m-#include "lundump.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-typedef struct {[m
[31m- lua_State* L;[m
[31m- ZIO* Z;[m
[31m- Mbuffer* b;[m
[31m- const char* name;[m
[31m-} LoadState;[m
[31m-[m
[31m-#ifdef LUAC_TRUST_BINARIES[m
[31m-#define IF(c,s)[m
[31m-#define error(S,s)[m
[31m-#else[m
[31m-#define IF(c,s)		if (c) error(S,s)[m
[31m-[m
[31m-static void error(LoadState* S, const char* why)[m
[31m-{[m
[31m- luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why);[m
[31m- luaD_throw(S->L,LUA_ERRSYNTAX);[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#define LoadMem(S,b,n,size)	LoadBlock(S,b,(n)*(size))[m
[31m-#define	LoadByte(S)		(lu_byte)LoadChar(S)[m
[31m-#define LoadVar(S,x)		LoadMem(S,&x,1,sizeof(x))[m
[31m-#define LoadVector(S,b,n,size)	LoadMem(S,b,n,size)[m
[31m-[m
[31m-static void LoadBlock(LoadState* S, void* b, size_t size)[m
[31m-{[m
[31m- size_t r=luaZ_read(S->Z,b,size);[m
[31m- IF (r!=0, "unexpected end");[m
[31m-}[m
[31m-[m
[31m-static int LoadChar(LoadState* S)[m
[31m-{[m
[31m- char x;[m
[31m- LoadVar(S,x);[m
[31m- return x;[m
[31m-}[m
[31m-[m
[31m-static int LoadInt(LoadState* S)[m
[31m-{[m
[31m- int x;[m
[31m- LoadVar(S,x);[m
[31m- IF (x<0, "bad integer");[m
[31m- return x;[m
[31m-}[m
[31m-[m
[31m-static lua_Number LoadNumber(LoadState* S)[m
[31m-{[m
[31m- lua_Number x;[m
[31m- LoadVar(S,x);[m
[31m- return x;[m
[31m-}[m
[31m-[m
[31m-static TString* LoadString(LoadState* S)[m
[31m-{[m
[31m- size_t size;[m
[31m- LoadVar(S,size);[m
[31m- if (size==0)[m
[31m-  return NULL;[m
[31m- else[m
[31m- {[m
[31m-  char* s=luaZ_openspace(S->L,S->b,size);[m
[31m-  LoadBlock(S,s,size);[m
[31m-  return luaS_newlstr(S->L,s,size-1);		/* remove trailing '\0' */[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void LoadCode(LoadState* S, Proto* f)[m
[31m-{[m
[31m- int n=LoadInt(S);[m
[31m- f->code=luaM_newvector(S->L,n,Instruction);[m
[31m- f->sizecode=n;[m
[31m- LoadVector(S,f->code,n,sizeof(Instruction));[m
[31m-}[m
[31m-[m
[31m-static Proto* LoadFunction(LoadState* S, TString* p);[m
[31m-[m
[31m-static void LoadConstants(LoadState* S, Proto* f)[m
[31m-{[m
[31m- int i,n;[m
[31m- n=LoadInt(S);[m
[31m- f->k=luaM_newvector(S->L,n,TValue);[m
[31m- f->sizek=n;[m
[31m- for (i=0; i<n; i++) setnilvalue(&f->k[i]);[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  TValue* o=&f->k[i];[m
[31m-  int t=LoadChar(S);[m
[31m-  switch (t)[m
[31m-  {[m
[31m-   case LUA_TNIL:[m
[31m-   	setnilvalue(o);[m
[31m-	break;[m
[31m-   case LUA_TBOOLEAN:[m
[31m-   	setbvalue(o,LoadChar(S)!=0);[m
[31m-	break;[m
[31m-   case LUA_TNUMBER:[m
[31m-	setnvalue(o,LoadNumber(S));[m
[31m-	break;[m
[31m-   case LUA_TSTRING:[m
[31m-	setsvalue2n(S->L,o,LoadString(S));[m
[31m-	break;[m
[31m-   default:[m
[31m-	error(S,"bad constant");[m
[31m-	break;[m
[31m-  }[m
[31m- }[m
[31m- n=LoadInt(S);[m
[31m- f->p=luaM_newvector(S->L,n,Proto*);[m
[31m- f->sizep=n;[m
[31m- for (i=0; i<n; i++) f->p[i]=NULL;[m
[31m- for (i=0; i<n; i++) f->p[i]=LoadFunction(S,f->source);[m
[31m-}[m
[31m-[m
[31m-static void LoadDebug(LoadState* S, Proto* f)[m
[31m-{[m
[31m- int i,n;[m
[31m- n=LoadInt(S);[m
[31m- f->lineinfo=luaM_newvector(S->L,n,int);[m
[31m- f->sizelineinfo=n;[m
[31m- LoadVector(S,f->lineinfo,n,sizeof(int));[m
[31m- n=LoadInt(S);[m
[31m- f->locvars=luaM_newvector(S->L,n,LocVar);[m
[31m- f->sizelocvars=n;[m
[31m- for (i=0; i<n; i++) f->locvars[i].varname=NULL;[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  f->locvars[i].varname=LoadString(S);[m
[31m-  f->locvars[i].startpc=LoadInt(S);[m
[31m-  f->locvars[i].endpc=LoadInt(S);[m
[31m- }[m
[31m- n=LoadInt(S);[m
[31m- f->upvalues=luaM_newvector(S->L,n,TString*);[m
[31m- f->sizeupvalues=n;[m
[31m- for (i=0; i<n; i++) f->upvalues[i]=NULL;[m
[31m- for (i=0; i<n; i++) f->upvalues[i]=LoadString(S);[m
[31m-}[m
[31m-[m
[31m-static Proto* LoadFunction(LoadState* S, TString* p)[m
[31m-{[m
[31m- Proto* f;[m
[31m- if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep");[m
[31m- f=luaF_newproto(S->L);[m
[31m- setptvalue2s(S->L,S->L->top,f); incr_top(S->L);[m
[31m- f->source=LoadString(S); if (f->source==NULL) f->source=p;[m
[31m- f->linedefined=LoadInt(S);[m
[31m- f->lastlinedefined=LoadInt(S);[m
[31m- f->nups=LoadByte(S);[m
[31m- f->numparams=LoadByte(S);[m
[31m- f->is_vararg=LoadByte(S);[m
[31m- f->maxstacksize=LoadByte(S);[m
[31m- LoadCode(S,f);[m
[31m- LoadConstants(S,f);[m
[31m- LoadDebug(S,f);[m
[31m- IF (!luaG_checkcode(f), "bad code");[m
[31m- S->L->top--;[m
[31m- S->L->nCcalls--;[m
[31m- return f;[m
[31m-}[m
[31m-[m
[31m-static void LoadHeader(LoadState* S)[m
[31m-{[m
[31m- char h[LUAC_HEADERSIZE];[m
[31m- char s[LUAC_HEADERSIZE];[m
[31m- luaU_header(h);[m
[31m- LoadBlock(S,s,LUAC_HEADERSIZE);[m
[31m- IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header");[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-** load precompiled chunk[m
[31m-*/[m
[31m-Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name)[m
[31m-{[m
[31m- LoadState S;[m
[31m- if (*name=='@' || *name=='=')[m
[31m-  S.name=name+1;[m
[31m- else if (*name==LUA_SIGNATURE[0])[m
[31m-  S.name="binary string";[m
[31m- else[m
[31m-  S.name=name;[m
[31m- S.L=L;[m
[31m- S.Z=Z;[m
[31m- S.b=buff;[m
[31m- LoadHeader(&S);[m
[31m- return LoadFunction(&S,luaS_newliteral(L,"=?"));[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-* make header[m
[31m-*/[m
[31m-void luaU_header (char* h)[m
[31m-{[m
[31m- int x=1;[m
[31m- memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1);[m
[31m- h+=sizeof(LUA_SIGNATURE)-1;[m
[31m- *h++=(char)LUAC_VERSION;[m
[31m- *h++=(char)LUAC_FORMAT;[m
[31m- *h++=(char)*(char*)&x;				/* endianness */[m
[31m- *h++=(char)sizeof(int);[m
[31m- *h++=(char)sizeof(size_t);[m
[31m- *h++=(char)sizeof(Instruction);[m
[31m- *h++=(char)sizeof(lua_Number);[m
[31m- *h++=(char)(((lua_Number)0.5)==0);		/* is lua_Number integral? */[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lundump.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lundump.h[m
[1mdeleted file mode 100644[m
[1mindex c80189d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lundump.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** load precompiled Lua chunks[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lundump_h[m
[31m-#define lundump_h[m
[31m-[m
[31m-#include "lobject.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-/* load one chunk; from lundump.c */[m
[31m-LUAI_FUNC Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name);[m
[31m-[m
[31m-/* make header; from lundump.c */[m
[31m-LUAI_FUNC void luaU_header (char* h);[m
[31m-[m
[31m-/* dump one chunk; from ldump.c */[m
[31m-LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip);[m
[31m-[m
[31m-#ifdef luac_c[m
[31m-/* print one chunk; from print.c */[m
[31m-LUAI_FUNC void luaU_print (const Proto* f, int full);[m
[31m-#endif[m
[31m-[m
[31m-/* for header of binary files -- this is Lua 5.1 */[m
[31m-#define LUAC_VERSION		0x51[m
[31m-[m
[31m-/* for header of binary files -- this is the official format */[m
[31m-#define LUAC_FORMAT		0[m
[31m-[m
[31m-/* size of header of binary files */[m
[31m-#define LUAC_HEADERSIZE		12[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lvm.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lvm.c[m
[1mdeleted file mode 100644[m
[1mindex e0a0cd8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lvm.c[m
[1m+++ /dev/null[m
[36m@@ -1,767 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lvm.c,v 2.63.1.5 2011/08/17 20:43:11 roberto Exp $[m
[31m-** Lua virtual machine[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lvm_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "ldo.h"[m
[31m-#include "lfunc.h"[m
[31m-#include "lgc.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lstring.h"[m
[31m-#include "ltable.h"[m
[31m-#include "ltm.h"[m
[31m-#include "lvm.h"[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* limit for table tag-method chains (to avoid loops) */[m
[31m-#define MAXTAGLOOP	100[m
[31m-[m
[31m-[m
[31m-const TValue *luaV_tonumber (const TValue *obj, TValue *n) {[m
[31m-  lua_Number num;[m
[31m-  if (ttisnumber(obj)) return obj;[m
[31m-  if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) {[m
[31m-    setnvalue(n, num);[m
[31m-    return n;[m
[31m-  }[m
[31m-  else[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaV_tostring (lua_State *L, StkId obj) {[m
[31m-  if (!ttisnumber(obj))[m
[31m-    return 0;[m
[31m-  else {[m
[31m-    char s[LUAI_MAXNUMBER2STR];[m
[31m-    lua_Number n = nvalue(obj);[m
[31m-    lua_number2str(s, n);[m
[31m-    setsvalue2s(L, obj, luaS_new(L, s));[m
[31m-    return 1;[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void traceexec (lua_State *L, const Instruction *pc) {[m
[31m-  lu_byte mask = L->hookmask;[m
[31m-  const Instruction *oldpc = L->savedpc;[m
[31m-  L->savedpc = pc;[m
[31m-  if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) {[m
[31m-    resethookcount(L);[m
[31m-    luaD_callhook(L, LUA_HOOKCOUNT, -1);[m
[31m-  }[m
[31m-  if (mask & LUA_MASKLINE) {[m
[31m-    Proto *p = ci_func(L->ci)->l.p;[m
[31m-    int npc = pcRel(pc, p);[m
[31m-    int newline = getline(p, npc);[m
[31m-    /* call linehook when enter a new function, when jump back (loop),[m
[31m-       or when enter a new line */[m
[31m-    if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p)))[m
[31m-      luaD_callhook(L, LUA_HOOKLINE, newline);[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void callTMres (lua_State *L, StkId res, const TValue *f,[m
[31m-                        const TValue *p1, const TValue *p2) {[m
[31m-  ptrdiff_t result = savestack(L, res);[m
[31m-  setobj2s(L, L->top, f);  /* push function */[m
[31m-  setobj2s(L, L->top+1, p1);  /* 1st argument */[m
[31m-  setobj2s(L, L->top+2, p2);  /* 2nd argument */[m
[31m-  luaD_checkstack(L, 3);[m
[31m-  L->top += 3;[m
[31m-  luaD_call(L, L->top - 3, 1);[m
[31m-  res = restorestack(L, result);[m
[31m-  L->top--;[m
[31m-  setobjs2s(L, res, L->top);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void callTM (lua_State *L, const TValue *f, const TValue *p1,[m
[31m-                    const TValue *p2, const TValue *p3) {[m
[31m-  setobj2s(L, L->top, f);  /* push function */[m
[31m-  setobj2s(L, L->top+1, p1);  /* 1st argument */[m
[31m-  setobj2s(L, L->top+2, p2);  /* 2nd argument */[m
[31m-  setobj2s(L, L->top+3, p3);  /* 3th argument */[m
[31m-  luaD_checkstack(L, 4);[m
[31m-  L->top += 4;[m
[31m-  luaD_call(L, L->top - 4, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {[m
[31m-  int loop;[m
[31m-  for (loop = 0; loop < MAXTAGLOOP; loop++) {[m
[31m-    const TValue *tm;[m
[31m-    if (ttistable(t)) {  /* `t' is a table? */[m
[31m-      Table *h = hvalue(t);[m
[31m-      const TValue *res = luaH_get(h, key); /* do a primitive get */[m
[31m-      if (!ttisnil(res) ||  /* result is no nil? */[m
[31m-          (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */[m
[31m-        setobj2s(L, val, res);[m
[31m-        return;[m
[31m-      }[m
[31m-      /* else will try the tag method */[m
[31m-    }[m
[31m-    else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX)))[m
[31m-      luaG_typeerror(L, t, "index");[m
[31m-    if (ttisfunction(tm)) {[m
[31m-      callTMres(L, val, tm, t, key);[m
[31m-      return;[m
[31m-    }[m
[31m-    t = tm;  /* else repeat with `tm' */ [m
[31m-  }[m
[31m-  luaG_runerror(L, "loop in gettable");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {[m
[31m-  int loop;[m
[31m-  TValue temp;[m
[31m-  for (loop = 0; loop < MAXTAGLOOP; loop++) {[m
[31m-    const TValue *tm;[m
[31m-    if (ttistable(t)) {  /* `t' is a table? */[m
[31m-      Table *h = hvalue(t);[m
[31m-      TValue *oldval = luaH_set(L, h, key); /* do a primitive set */[m
[31m-      if (!ttisnil(oldval) ||  /* result is no nil? */[m
[31m-          (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */[m
[31m-        setobj2t(L, oldval, val);[m
[31m-        h->flags = 0;[m
[31m-        luaC_barriert(L, h, val);[m
[31m-        return;[m
[31m-      }[m
[31m-      /* else will try the tag method */[m
[31m-    }[m
[31m-    else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))[m
[31m-      luaG_typeerror(L, t, "index");[m
[31m-    if (ttisfunction(tm)) {[m
[31m-      callTM(L, tm, t, key, val);[m
[31m-      return;[m
[31m-    }[m
[31m-    /* else repeat with `tm' */[m
[31m-    setobj(L, &temp, tm);  /* avoid pointing inside table (may rehash) */[m
[31m-    t = &temp;[m
[31m-  }[m
[31m-  luaG_runerror(L, "loop in settable");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,[m
[31m-                       StkId res, TMS event) {[m
[31m-  const TValue *tm = luaT_gettmbyobj(L, p1, event);  /* try first operand */[m
[31m-  if (ttisnil(tm))[m
[31m-    tm = luaT_gettmbyobj(L, p2, event);  /* try second operand */[m
[31m-  if (ttisnil(tm)) return 0;[m
[31m-  callTMres(L, res, tm, p1, p2);[m
[31m-  return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2,[m
[31m-                                  TMS event) {[m
[31m-  const TValue *tm1 = fasttm(L, mt1, event);[m
[31m-  const TValue *tm2;[m
[31m-  if (tm1 == NULL) return NULL;  /* no metamethod */[m
[31m-  if (mt1 == mt2) return tm1;  /* same metatables => same metamethods */[m
[31m-  tm2 = fasttm(L, mt2, event);[m
[31m-  if (tm2 == NULL) return NULL;  /* no metamethod */[m
[31m-  if (luaO_rawequalObj(tm1, tm2))  /* same metamethods? */[m
[31m-    return tm1;[m
[31m-  return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,[m
[31m-                         TMS event) {[m
[31m-  const TValue *tm1 = luaT_gettmbyobj(L, p1, event);[m
[31m-  const TValue *tm2;[m
[31m-  if (ttisnil(tm1)) return -1;  /* no metamethod? */[m
[31m-  tm2 = luaT_gettmbyobj(L, p2, event);[m
[31m-  if (!luaO_rawequalObj(tm1, tm2))  /* different metamethods? */[m
[31m-    return -1;[m
[31m-  callTMres(L, L->top, tm1, p1, p2);[m
[31m-  return !l_isfalse(L->top);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int l_strcmp (const TString *ls, const TString *rs) {[m
[31m-  const char *l = getstr(ls);[m
[31m-  size_t ll = ls->tsv.len;[m
[31m-  const char *r = getstr(rs);[m
[31m-  size_t lr = rs->tsv.len;[m
[31m-  for (;;) {[m
[31m-    int temp = strcoll(l, r);[m
[31m-    if (temp != 0) return temp;[m
[31m-    else {  /* strings are equal up to a `\0' */[m
[31m-      size_t len = strlen(l);  /* index of first `\0' in both strings */[m
[31m-      if (len == lr)  /* r is finished? */[m
[31m-        return (len == ll) ? 0 : 1;[m
[31m-      else if (len == ll)  /* l is finished? */[m
[31m-        return -1;  /* l is smaller than r (because r is not finished) */[m
[31m-      /* both strings longer than `len'; go on comparing (after the `\0') */[m
[31m-      len++;[m
[31m-      l += len; ll -= len; r += len; lr -= len;[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {[m
[31m-  int res;[m
[31m-  if (ttype(l) != ttype(r))[m
[31m-    return luaG_ordererror(L, l, r);[m
[31m-  else if (ttisnumber(l))[m
[31m-    return luai_numlt(nvalue(l), nvalue(r));[m
[31m-  else if (ttisstring(l))[m
[31m-    return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0;[m
[31m-  else if ((res = call_orderTM(L, l, r, TM_LT)) != -1)[m
[31m-    return res;[m
[31m-  return luaG_ordererror(L, l, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int lessequal (lua_State *L, const TValue *l, const TValue *r) {[m
[31m-  int res;[m
[31m-  if (ttype(l) != ttype(r))[m
[31m-    return luaG_ordererror(L, l, r);[m
[31m-  else if (ttisnumber(l))[m
[31m-    return luai_numle(nvalue(l), nvalue(r));[m
[31m-  else if (ttisstring(l))[m
[31m-    return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0;[m
[31m-  else if ((res = call_orderTM(L, l, r, TM_LE)) != -1)  /* first try `le' */[m
[31m-    return res;[m
[31m-  else if ((res = call_orderTM(L, r, l, TM_LT)) != -1)  /* else try `lt' */[m
[31m-    return !res;[m
[31m-  return luaG_ordererror(L, l, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) {[m
[31m-  const TValue *tm;[m
[31m-  lua_assert(ttype(t1) == ttype(t2));[m
[31m-  switch (ttype(t1)) {[m
[31m-    case LUA_TNIL: return 1;[m
[31m-    case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2));[m
[31m-    case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2);  /* true must be 1 !! */[m
[31m-    case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2);[m
[31m-    case LUA_TUSERDATA: {[m
[31m-      if (uvalue(t1) == uvalue(t2)) return 1;[m
[31m-      tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable,[m
[31m-                         TM_EQ);[m
[31m-      break;  /* will try TM */[m
[31m-    }[m
[31m-    case LUA_TTABLE: {[m
[31m-      if (hvalue(t1) == hvalue(t2)) return 1;[m
[31m-      tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ);[m
[31m-      break;  /* will try TM */[m
[31m-    }[m
[31m-    default: return gcvalue(t1) == gcvalue(t2);[m
[31m-  }[m
[31m-  if (tm == NULL) return 0;  /* no TM? */[m
[31m-  callTMres(L, L->top, tm, t1, t2);  /* call TM */[m
[31m-  return !l_isfalse(L->top);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaV_concat (lua_State *L, int total, int last) {[m
[31m-  do {[m
[31m-    StkId top = L->base + last + 1;[m
[31m-    int n = 2;  /* number of elements handled in this pass (at least 2) */[m
[31m-    if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) {[m
[31m-      if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT))[m
[31m-        luaG_concaterror(L, top-2, top-1);[m
[31m-    } else if (tsvalue(top-1)->len == 0)  /* second op is empty? */[m
[31m-      (void)tostring(L, top - 2);  /* result is first op (as string) */[m
[31m-    else {[m
[31m-      /* at least two string values; get as many as possible */[m
[31m-      size_t tl = tsvalue(top-1)->len;[m
[31m-      char *buffer;[m
[31m-      int i;[m
[31m-      /* collect total length */[m
[31m-      for (n = 1; n < total && tostring(L, top-n-1); n++) {[m
[31m-        size_t l = tsvalue(top-n-1)->len;[m
[31m-        if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow");[m
[31m-        tl += l;[m
[31m-      }[m
[31m-      buffer = luaZ_openspace(L, &G(L)->buff, tl);[m
[31m-      tl = 0;[m
[31m-      for (i=n; i>0; i--) {  /* concat all strings */[m
[31m-        size_t l = tsvalue(top-i)->len;[m
[31m-        memcpy(buffer+tl, svalue(top-i), l);[m
[31m-        tl += l;[m
[31m-      }[m
[31m-      setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl));[m
[31m-    }[m
[31m-    total -= n-1;  /* got `n' strings to create 1 new */[m
[31m-    last -= n-1;[m
[31m-  } while (total > 1);  /* repeat until only 1 result left */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void Arith (lua_State *L, StkId ra, const TValue *rb,[m
[31m-                   const TValue *rc, TMS op) {[m
[31m-  TValue tempb, tempc;[m
[31m-  const TValue *b, *c;[m
[31m-  if ((b = luaV_tonumber(rb, &tempb)) != NULL &&[m
[31m-      (c = luaV_tonumber(rc, &tempc)) != NULL) {[m
[31m-    lua_Number nb = nvalue(b), nc = nvalue(c);[m
[31m-    switch (op) {[m
[31m-      case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break;[m
[31m-      case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break;[m
[31m-      case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break;[m
[31m-      case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break;[m
[31m-      case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break;[m
[31m-      case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break;[m
[31m-      case TM_UNM: setnvalue(ra, luai_numunm(nb)); break;[m
[31m-      default: lua_assert(0); break;[m
[31m-    }[m
[31m-  }[m
[31m-  else if (!call_binTM(L, rb, rc, ra, op))[m
[31m-    luaG_aritherror(L, rb, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-** some macros for common tasks in `luaV_execute'[m
[31m-*/[m
[31m-[m
[31m-#define runtime_check(L, c)	{ if (!(c)) break; }[m
[31m-[m
[31m-#define RA(i)	(base+GETARG_A(i))[m
[31m-/* to be used after possible stack reallocation */[m
[31m-#define RB(i)	check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))[m
[31m-#define RC(i)	check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))[m
[31m-#define RKB(i)	check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \[m
[31m-	ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))[m
[31m-#define RKC(i)	check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \[m
[31m-	ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))[m
[31m-#define KBx(i)	check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i))[m
[31m-[m
[31m-[m
[31m-#define dojump(L,pc,i)	{(pc) += (i); luai_threadyield(L);}[m
[31m-[m
[31m-[m
[31m-#define Protect(x)	{ L->savedpc = pc; {x;}; base = L->base; }[m
[31m-[m
[31m-[m
[31m-#define arith_op(op,tm) { \[m
[31m-        TValue *rb = RKB(i); \[m
[31m-        TValue *rc = RKC(i); \[m
[31m-        if (ttisnumber(rb) && ttisnumber(rc)) { \[m
[31m-          lua_Number nb = nvalue(rb), nc = nvalue(rc); \[m
[31m-          setnvalue(ra, op(nb, nc)); \[m
[31m-        } \[m
[31m-        else \[m
[31m-          Protect(Arith(L, ra, rb, rc, tm)); \[m
[31m-      }[m
[31m-[m
[31m-[m
[31m-[m
[31m-void luaV_execute (lua_State *L, int nexeccalls) {[m
[31m-  LClosure *cl;[m
[31m-  StkId base;[m
[31m-  TValue *k;[m
[31m-  const Instruction *pc;[m
[31m- reentry:  /* entry point */[m
[31m-  lua_assert(isLua(L->ci));[m
[31m-  pc = L->savedpc;[m
[31m-  cl = &clvalue(L->ci->func)->l;[m
[31m-  base = L->base;[m
[31m-  k = cl->p->k;[m
[31m-  /* main loop of interpreter */[m
[31m-  for (;;) {[m
[31m-    const Instruction i = *pc++;[m
[31m-    StkId ra;[m
[31m-    if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&[m
[31m-        (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {[m
[31m-      traceexec(L, pc);[m
[31m-      if (L->status == LUA_YIELD) {  /* did hook yield? */[m
[31m-        L->savedpc = pc - 1;[m
[31m-        return;[m
[31m-      }[m
[31m-      base = L->base;[m
[31m-    }[m
[31m-    /* warning!! several calls may realloc the stack and invalidate `ra' */[m
[31m-    ra = RA(i);[m
[31m-    lua_assert(base == L->base && L->base == L->ci->base);[m
[31m-    lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);[m
[31m-    lua_assert(L->top == L->ci->top || luaG_checkopenop(i));[m
[31m-    switch (GET_OPCODE(i)) {[m
[31m-      case OP_MOVE: {[m
[31m-        setobjs2s(L, ra, RB(i));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LOADK: {[m
[31m-        setobj2s(L, ra, KBx(i));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LOADBOOL: {[m
[31m-        setbvalue(ra, GETARG_B(i));[m
[31m-        if (GETARG_C(i)) pc++;  /* skip next instruction (if C) */[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LOADNIL: {[m
[31m-        TValue *rb = RB(i);[m
[31m-        do {[m
[31m-          setnilvalue(rb--);[m
[31m-        } while (rb >= ra);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_GETUPVAL: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        setobj2s(L, ra, cl->upvals[b]->v);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_GETGLOBAL: {[m
[31m-        TValue g;[m
[31m-        TValue *rb = KBx(i);[m
[31m-        sethvalue(L, &g, cl->env);[m
[31m-        lua_assert(ttisstring(rb));[m
[31m-        Protect(luaV_gettable(L, &g, rb, ra));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_GETTABLE: {[m
[31m-        Protect(luaV_gettable(L, RB(i), RKC(i), ra));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SETGLOBAL: {[m
[31m-        TValue g;[m
[31m-        sethvalue(L, &g, cl->env);[m
[31m-        lua_assert(ttisstring(KBx(i)));[m
[31m-        Protect(luaV_settable(L, &g, KBx(i), ra));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SETUPVAL: {[m
[31m-        UpVal *uv = cl->upvals[GETARG_B(i)];[m
[31m-        setobj(L, uv->v, ra);[m
[31m-        luaC_barrier(L, uv, ra);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SETTABLE: {[m
[31m-        Protect(luaV_settable(L, ra, RKB(i), RKC(i)));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_NEWTABLE: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        int c = GETARG_C(i);[m
[31m-        sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c)));[m
[31m-        Protect(luaC_checkGC(L));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SELF: {[m
[31m-        StkId rb = RB(i);[m
[31m-        setobjs2s(L, ra+1, rb);[m
[31m-        Protect(luaV_gettable(L, rb, RKC(i), ra));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_ADD: {[m
[31m-        arith_op(luai_numadd, TM_ADD);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SUB: {[m
[31m-        arith_op(luai_numsub, TM_SUB);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_MUL: {[m
[31m-        arith_op(luai_nummul, TM_MUL);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_DIV: {[m
[31m-        arith_op(luai_numdiv, TM_DIV);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_MOD: {[m
[31m-        arith_op(luai_nummod, TM_MOD);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_POW: {[m
[31m-        arith_op(luai_numpow, TM_POW);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_UNM: {[m
[31m-        TValue *rb = RB(i);[m
[31m-        if (ttisnumber(rb)) {[m
[31m-          lua_Number nb = nvalue(rb);[m
[31m-          setnvalue(ra, luai_numunm(nb));[m
[31m-        }[m
[31m-        else {[m
[31m-          Protect(Arith(L, ra, rb, rb, TM_UNM));[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_NOT: {[m
[31m-        int res = l_isfalse(RB(i));  /* next assignment may change this value */[m
[31m-        setbvalue(ra, res);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LEN: {[m
[31m-        const TValue *rb = RB(i);[m
[31m-        switch (ttype(rb)) {[m
[31m-          case LUA_TTABLE: {[m
[31m-            setnvalue(ra, cast_num(luaH_getn(hvalue(rb))));[m
[31m-            break;[m
[31m-          }[m
[31m-          case LUA_TSTRING: {[m
[31m-            setnvalue(ra, cast_num(tsvalue(rb)->len));[m
[31m-            break;[m
[31m-          }[m
[31m-          default: {  /* try metamethod */[m
[31m-            Protect([m
[31m-              if (!call_binTM(L, rb, luaO_nilobject, ra, TM_LEN))[m
[31m-                luaG_typeerror(L, rb, "get length of");[m
[31m-            )[m
[31m-          }[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_CONCAT: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        int c = GETARG_C(i);[m
[31m-        Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L));[m
[31m-        setobjs2s(L, RA(i), base+b);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_JMP: {[m
[31m-        dojump(L, pc, GETARG_sBx(i));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_EQ: {[m
[31m-        TValue *rb = RKB(i);[m
[31m-        TValue *rc = RKC(i);[m
[31m-        Protect([m
[31m-          if (equalobj(L, rb, rc) == GETARG_A(i))[m
[31m-            dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        )[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LT: {[m
[31m-        Protect([m
[31m-          if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i))[m
[31m-            dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        )[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_LE: {[m
[31m-        Protect([m
[31m-          if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i))[m
[31m-            dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        )[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_TEST: {[m
[31m-        if (l_isfalse(ra) != GETARG_C(i))[m
[31m-          dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_TESTSET: {[m
[31m-        TValue *rb = RB(i);[m
[31m-        if (l_isfalse(rb) != GETARG_C(i)) {[m
[31m-          setobjs2s(L, ra, rb);[m
[31m-          dojump(L, pc, GETARG_sBx(*pc));[m
[31m-        }[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_CALL: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        int nresults = GETARG_C(i) - 1;[m
[31m-        if (b != 0) L->top = ra+b;  /* else previous instruction set top */[m
[31m-        L->savedpc = pc;[m
[31m-        switch (luaD_precall(L, ra, nresults)) {[m
[31m-          case PCRLUA: {[m
[31m-            nexeccalls++;[m
[31m-            goto reentry;  /* restart luaV_execute over new Lua function */[m
[31m-          }[m
[31m-          case PCRC: {[m
[31m-            /* it was a C function (`precall' called it); adjust results */[m
[31m-            if (nresults >= 0) L->top = L->ci->top;[m
[31m-            base = L->base;[m
[31m-            continue;[m
[31m-          }[m
[31m-          default: {[m
[31m-            return;  /* yield */[m
[31m-          }[m
[31m-        }[m
[31m-      }[m
[31m-      case OP_TAILCALL: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        if (b != 0) L->top = ra+b;  /* else previous instruction set top */[m
[31m-        L->savedpc = pc;[m
[31m-        lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);[m
[31m-        switch (luaD_precall(L, ra, LUA_MULTRET)) {[m
[31m-          case PCRLUA: {[m
[31m-            /* tail call: put new frame in place of previous one */[m
[31m-            CallInfo *ci = L->ci - 1;  /* previous frame */[m
[31m-            int aux;[m
[31m-            StkId func = ci->func;[m
[31m-            StkId pfunc = (ci+1)->func;  /* previous function index */[m
[31m-            if (L->openupval) luaF_close(L, ci->base);[m
[31m-            L->base = ci->base = ci->func + ((ci+1)->base - pfunc);[m
[31m-            for (aux = 0; pfunc+aux < L->top; aux++)  /* move frame down */[m
[31m-              setobjs2s(L, func+aux, pfunc+aux);[m
[31m-            ci->top = L->top = func+aux;  /* correct top */[m
[31m-            lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize);[m
[31m-            ci->savedpc = L->savedpc;[m
[31m-            ci->tailcalls++;  /* one more call lost */[m
[31m-            L->ci--;  /* remove new frame */[m
[31m-            goto reentry;[m
[31m-          }[m
[31m-          case PCRC: {  /* it was a C function (`precall' called it) */[m
[31m-            base = L->base;[m
[31m-            continue;[m
[31m-          }[m
[31m-          default: {[m
[31m-            return;  /* yield */[m
[31m-          }[m
[31m-        }[m
[31m-      }[m
[31m-      case OP_RETURN: {[m
[31m-        int b = GETARG_B(i);[m
[31m-        if (b != 0) L->top = ra+b-1;[m
[31m-        if (L->openupval) luaF_close(L, base);[m
[31m-        L->savedpc = pc;[m
[31m-        b = luaD_poscall(L, ra);[m
[31m-        if (--nexeccalls == 0)  /* was previous function running `here'? */[m
[31m-          return;  /* no: return */[m
[31m-        else {  /* yes: continue its execution */[m
[31m-          if (b) L->top = L->ci->top;[m
[31m-          lua_assert(isLua(L->ci));[m
[31m-          lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL);[m
[31m-          goto reentry;[m
[31m-        }[m
[31m-      }[m
[31m-      case OP_FORLOOP: {[m
[31m-        lua_Number step = nvalue(ra+2);[m
[31m-        lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */[m
[31m-        lua_Number limit = nvalue(ra+1);[m
[31m-        if (luai_numlt(0, step) ? luai_numle(idx, limit)[m
[31m-                                : luai_numle(limit, idx)) {[m
[31m-          dojump(L, pc, GETARG_sBx(i));  /* jump back */[m
[31m-          setnvalue(ra, idx);  /* update internal index... */[m
[31m-          setnvalue(ra+3, idx);  /* ...and external index */[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_FORPREP: {[m
[31m-        const TValue *init = ra;[m
[31m-        const TValue *plimit = ra+1;[m
[31m-        const TValue *pstep = ra+2;[m
[31m-        L->savedpc = pc;  /* next steps may throw errors */[m
[31m-        if (!tonumber(init, ra))[m
[31m-          luaG_runerror(L, LUA_QL("for") " initial value must be a number");[m
[31m-        else if (!tonumber(plimit, ra+1))[m
[31m-          luaG_runerror(L, LUA_QL("for") " limit must be a number");[m
[31m-        else if (!tonumber(pstep, ra+2))[m
[31m-          luaG_runerror(L, LUA_QL("for") " step must be a number");[m
[31m-        setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep)));[m
[31m-        dojump(L, pc, GETARG_sBx(i));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_TFORLOOP: {[m
[31m-        StkId cb = ra + 3;  /* call base */[m
[31m-        setobjs2s(L, cb+2, ra+2);[m
[31m-        setobjs2s(L, cb+1, ra+1);[m
[31m-        setobjs2s(L, cb, ra);[m
[31m-        L->top = cb+3;  /* func. + 2 args (state and index) */[m
[31m-        Protect(luaD_call(L, cb, GETARG_C(i)));[m
[31m-        L->top = L->ci->top;[m
[31m-        cb = RA(i) + 3;  /* previous call may change the stack */[m
[31m-        if (!ttisnil(cb)) {  /* continue loop? */[m
[31m-          setobjs2s(L, cb-1, cb);  /* save control variable */[m
[31m-          dojump(L, pc, GETARG_sBx(*pc));  /* jump back */[m
[31m-        }[m
[31m-        pc++;[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_SETLIST: {[m
[31m-        int n = GETARG_B(i);[m
[31m-        int c = GETARG_C(i);[m
[31m-        int last;[m
[31m-        Table *h;[m
[31m-        if (n == 0) {[m
[31m-          n = cast_int(L->top - ra) - 1;[m
[31m-          L->top = L->ci->top;[m
[31m-        }[m
[31m-        if (c == 0) c = cast_int(*pc++);[m
[31m-        runtime_check(L, ttistable(ra));[m
[31m-        h = hvalue(ra);[m
[31m-        last = ((c-1)*LFIELDS_PER_FLUSH) + n;[m
[31m-        if (last > h->sizearray)  /* needs more space? */[m
[31m-          luaH_resizearray(L, h, last);  /* pre-alloc it at once */[m
[31m-        for (; n > 0; n--) {[m
[31m-          TValue *val = ra+n;[m
[31m-          setobj2t(L, luaH_setnum(L, h, last--), val);[m
[31m-          luaC_barriert(L, h, val);[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_CLOSE: {[m
[31m-        luaF_close(L, ra);[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_CLOSURE: {[m
[31m-        Proto *p;[m
[31m-        Closure *ncl;[m
[31m-        int nup, j;[m
[31m-        p = cl->p->p[GETARG_Bx(i)];[m
[31m-        nup = p->nups;[m
[31m-        ncl = luaF_newLclosure(L, nup, cl->env);[m
[31m-        ncl->l.p = p;[m
[31m-        for (j=0; j<nup; j++, pc++) {[m
[31m-          if (GET_OPCODE(*pc) == OP_GETUPVAL)[m
[31m-            ncl->l.upvals[j] = cl->upvals[GETARG_B(*pc)];[m
[31m-          else {[m
[31m-            lua_assert(GET_OPCODE(*pc) == OP_MOVE);[m
[31m-            ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc));[m
[31m-          }[m
[31m-        }[m
[31m-        setclvalue(L, ra, ncl);[m
[31m-        Protect(luaC_checkGC(L));[m
[31m-        continue;[m
[31m-      }[m
[31m-      case OP_VARARG: {[m
[31m-        int b = GETARG_B(i) - 1;[m
[31m-        int j;[m
[31m-        CallInfo *ci = L->ci;[m
[31m-        int n = cast_int(ci->base - ci->func) - cl->p->numparams - 1;[m
[31m-        if (b == LUA_MULTRET) {[m
[31m-          Protect(luaD_checkstack(L, n));[m
[31m-          ra = RA(i);  /* previous call may change the stack */[m
[31m-          b = n;[m
[31m-          L->top = ra + n;[m
[31m-        }[m
[31m-        for (j = 0; j < b; j++) {[m
[31m-          if (j < n) {[m
[31m-            setobjs2s(L, ra + j, ci->base - n + j);[m
[31m-          }[m
[31m-          else {[m
[31m-            setnilvalue(ra + j);[m
[31m-          }[m
[31m-        }[m
[31m-        continue;[m
[31m-      }[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lvm.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lvm.h[m
[1mdeleted file mode 100644[m
[1mindex bfe4f56..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lvm.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Lua virtual machine[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#ifndef lvm_h[m
[31m-#define lvm_h[m
[31m-[m
[31m-[m
[31m-#include "ldo.h"[m
[31m-#include "lobject.h"[m
[31m-#include "ltm.h"[m
[31m-[m
[31m-[m
[31m-#define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o)))[m
[31m-[m
[31m-#define tonumber(o,n)	(ttype(o) == LUA_TNUMBER || \[m
[31m-                         (((o) = luaV_tonumber(o,n)) != NULL))[m
[31m-[m
[31m-#define equalobj(L,o1,o2) \[m
[31m-	(ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2))[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);[m
[31m-LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2);[m
[31m-LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n);[m
[31m-LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);[m
[31m-LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key,[m
[31m-                                            StkId val);[m
[31m-LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key,[m
[31m-                                            StkId val);[m
[31m-LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);[m
[31m-LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lzio.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lzio.c[m
[1mdeleted file mode 100644[m
[1mindex 293edd5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lzio.c[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** a generic input stream interface[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#include <string.h>[m
[31m-[m
[31m-#define lzio_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "llimits.h"[m
[31m-#include "lmem.h"[m
[31m-#include "lstate.h"[m
[31m-#include "lzio.h"[m
[31m-[m
[31m-[m
[31m-int luaZ_fill (ZIO *z) {[m
[31m-  size_t size;[m
[31m-  lua_State *L = z->L;[m
[31m-  const char *buff;[m
[31m-  lua_unlock(L);[m
[31m-  buff = z->reader(L, z->data, &size);[m
[31m-  lua_lock(L);[m
[31m-  if (buff == NULL || size == 0) return EOZ;[m
[31m-  z->n = size - 1;[m
[31m-  z->p = buff;[m
[31m-  return char2int(*(z->p++));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int luaZ_lookahead (ZIO *z) {[m
[31m-  if (z->n == 0) {[m
[31m-    if (luaZ_fill(z) == EOZ)[m
[31m-      return EOZ;[m
[31m-    else {[m
[31m-      z->n++;  /* luaZ_fill removed first byte; put back it */[m
[31m-      z->p--;[m
[31m-    }[m
[31m-  }[m
[31m-  return char2int(*z->p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {[m
[31m-  z->L = L;[m
[31m-  z->reader = reader;[m
[31m-  z->data = data;[m
[31m-  z->n = 0;[m
[31m-  z->p = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* --------------------------------------------------------------- read --- */[m
[31m-size_t luaZ_read (ZIO *z, void *b, size_t n) {[m
[31m-  while (n) {[m
[31m-    size_t m;[m
[31m-    if (luaZ_lookahead(z) == EOZ)[m
[31m-      return n;  /* return number of missing bytes */[m
[31m-    m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */[m
[31m-    memcpy(b, z->p, m);[m
[31m-    z->n -= m;[m
[31m-    z->p += m;[m
[31m-    b = (char *)b + m;[m
[31m-    n -= m;[m
[31m-  }[m
[31m-  return 0;[m
[31m-}[m
[31m-[m
[31m-/* ------------------------------------------------------------------------ */[m
[31m-char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {[m
[31m-  if (n > buff->buffsize) {[m
[31m-    if (n < LUA_MINBUFFER) n = LUA_MINBUFFER;[m
[31m-    luaZ_resizebuffer(L, buff, n);[m
[31m-  }[m
[31m-  return buff->buffer;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lzio.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lzio.h[m
[1mdeleted file mode 100644[m
[1mindex 51d695d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/lzio.h[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-/*[m
[31m-** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $[m
[31m-** Buffered streams[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef lzio_h[m
[31m-#define lzio_h[m
[31m-[m
[31m-#include "lua.h"[m
[31m-[m
[31m-#include "lmem.h"[m
[31m-[m
[31m-[m
[31m-#define EOZ	(-1)			/* end of stream */[m
[31m-[m
[31m-typedef struct Zio ZIO;[m
[31m-[m
[31m-#define char2int(c)	cast(int, cast(unsigned char, (c)))[m
[31m-[m
[31m-#define zgetc(z)  (((z)->n--)>0 ?  char2int(*(z)->p++) : luaZ_fill(z))[m
[31m-[m
[31m-typedef struct Mbuffer {[m
[31m-  char *buffer;[m
[31m-  size_t n;[m
[31m-  size_t buffsize;[m
[31m-} Mbuffer;[m
[31m-[m
[31m-#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0)[m
[31m-[m
[31m-#define luaZ_buffer(buff)	((buff)->buffer)[m
[31m-#define luaZ_sizebuffer(buff)	((buff)->buffsize)[m
[31m-#define luaZ_bufflen(buff)	((buff)->n)[m
[31m-[m
[31m-#define luaZ_resetbuffer(buff) ((buff)->n = 0)[m
[31m-[m
[31m-[m
[31m-#define luaZ_resizebuffer(L, buff, size) \[m
[31m-	(luaM_reallocvector(L, (buff)->buffer, (buff)->buffsize, size, char), \[m
[31m-	(buff)->buffsize = size)[m
[31m-[m
[31m-#define luaZ_freebuffer(L, buff)	luaZ_resizebuffer(L, buff, 0)[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n);[m
[31m-LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader,[m
[31m-                                        void *data);[m
[31m-LUAI_FUNC size_t luaZ_read (ZIO* z, void* b, size_t n);	/* read next n bytes */[m
[31m-LUAI_FUNC int luaZ_lookahead (ZIO *z);[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* --------- Private Part ------------------ */[m
[31m-[m
[31m-struct Zio {[m
[31m-  size_t n;			/* bytes still unread */[m
[31m-  const char *p;		/* current position in buffer */[m
[31m-  lua_Reader reader;[m
[31m-  void* data;			/* additional data */[m
[31m-  lua_State *L;			/* Lua state (for reader) */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-LUAI_FUNC int luaZ_fill (ZIO *z);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/print.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/print.c[m
[1mdeleted file mode 100644[m
[1mindex e240cfc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/src/print.c[m
[1m+++ /dev/null[m
[36m@@ -1,227 +0,0 @@[m
[31m-/*[m
[31m-** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $[m
[31m-** print bytecodes[m
[31m-** See Copyright Notice in lua.h[m
[31m-*/[m
[31m-[m
[31m-#include <ctype.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#define luac_c[m
[31m-#define LUA_CORE[m
[31m-[m
[31m-#include "ldebug.h"[m
[31m-#include "lobject.h"[m
[31m-#include "lopcodes.h"[m
[31m-#include "lundump.h"[m
[31m-[m
[31m-#define PrintFunction	luaU_print[m
[31m-[m
[31m-#define Sizeof(x)	((int)sizeof(x))[m
[31m-#define VOID(p)		((const void*)(p))[m
[31m-[m
[31m-static void PrintString(const TString* ts)[m
[31m-{[m
[31m- const char* s=getstr(ts);[m
[31m- size_t i,n=ts->tsv.len;[m
[31m- putchar('"');[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  int c=s[i];[m
[31m-  switch (c)[m
[31m-  {[m
[31m-   case '"': printf("\\\""); break;[m
[31m-   case '\\': printf("\\\\"); break;[m
[31m-   case '\a': printf("\\a"); break;[m
[31m-   case '\b': printf("\\b"); break;[m
[31m-   case '\f': printf("\\f"); break;[m
[31m-   case '\n': printf("\\n"); break;[m
[31m-   case '\r': printf("\\r"); break;[m
[31m-   case '\t': printf("\\t"); break;[m
[31m-   case '\v': printf("\\v"); break;[m
[31m-   default:	if (isprint((unsigned char)c))[m
[31m-   			putchar(c);[m
[31m-		else[m
[31m-			printf("\\%03u",(unsigned char)c);[m
[31m-  }[m
[31m- }[m
[31m- putchar('"');[m
[31m-}[m
[31m-[m
[31m-static void PrintConstant(const Proto* f, int i)[m
[31m-{[m
[31m- const TValue* o=&f->k[i];[m
[31m- switch (ttype(o))[m
[31m- {[m
[31m-  case LUA_TNIL:[m
[31m-	printf("nil");[m
[31m-	break;[m
[31m-  case LUA_TBOOLEAN:[m
[31m-	printf(bvalue(o) ? "true" : "false");[m
[31m-	break;[m
[31m-  case LUA_TNUMBER:[m
[31m-	printf(LUA_NUMBER_FMT,nvalue(o));[m
[31m-	break;[m
[31m-  case LUA_TSTRING:[m
[31m-	PrintString(rawtsvalue(o));[m
[31m-	break;[m
[31m-  default:				/* cannot happen */[m
[31m-	printf("? type=%d",ttype(o));[m
[31m-	break;[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void PrintCode(const Proto* f)[m
[31m-{[m
[31m- const Instruction* code=f->code;[m
[31m- int pc,n=f->sizecode;[m
[31m- for (pc=0; pc<n; pc++)[m
[31m- {[m
[31m-  Instruction i=code[pc];[m
[31m-  OpCode o=GET_OPCODE(i);[m
[31m-  int a=GETARG_A(i);[m
[31m-  int b=GETARG_B(i);[m
[31m-  int c=GETARG_C(i);[m
[31m-  int bx=GETARG_Bx(i);[m
[31m-  int sbx=GETARG_sBx(i);[m
[31m-  int line=getline(f,pc);[m
[31m-  printf("\t%d\t",pc+1);[m
[31m-  if (line>0) printf("[%d]\t",line); else printf("[-]\t");[m
[31m-  printf("%-9s\t",luaP_opnames[o]);[m
[31m-  switch (getOpMode(o))[m
[31m-  {[m
[31m-   case iABC:[m
[31m-    printf("%d",a);[m
[31m-    if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b);[m
[31m-    if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c);[m
[31m-    break;[m
[31m-   case iABx:[m
[31m-    if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx);[m
[31m-    break;[m
[31m-   case iAsBx:[m
[31m-    if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx);[m
[31m-    break;[m
[31m-  }[m
[31m-  switch (o)[m
[31m-  {[m
[31m-   case OP_LOADK:[m
[31m-    printf("\t; "); PrintConstant(f,bx);[m
[31m-    break;[m
[31m-   case OP_GETUPVAL:[m
[31m-   case OP_SETUPVAL:[m
[31m-    printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-");[m
[31m-    break;[m
[31m-   case OP_GETGLOBAL:[m
[31m-   case OP_SETGLOBAL:[m
[31m-    printf("\t; %s",svalue(&f->k[bx]));[m
[31m-    break;[m
[31m-   case OP_GETTABLE:[m
[31m-   case OP_SELF:[m
[31m-    if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); }[m
[31m-    break;[m
[31m-   case OP_SETTABLE:[m
[31m-   case OP_ADD:[m
[31m-   case OP_SUB:[m
[31m-   case OP_MUL:[m
[31m-   case OP_DIV:[m
[31m-   case OP_POW:[m
[31m-   case OP_EQ:[m
[31m-   case OP_LT:[m
[31m-   case OP_LE:[m
[31m-    if (ISK(b) || ISK(c))[m
[31m-    {[m
[31m-     printf("\t; ");[m
[31m-     if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-");[m
[31m-     printf(" ");[m
[31m-     if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-");[m
[31m-    }[m
[31m-    break;[m
[31m-   case OP_JMP:[m
[31m-   case OP_FORLOOP:[m
[31m-   case OP_FORPREP:[m
[31m-    printf("\t; to %d",sbx+pc+2);[m
[31m-    break;[m
[31m-   case OP_CLOSURE:[m
[31m-    printf("\t; %p",VOID(f->p[bx]));[m
[31m-    break;[m
[31m-   case OP_SETLIST:[m
[31m-    if (c==0) printf("\t; %d",(int)code[++pc]);[m
[31m-    else printf("\t; %d",c);[m
[31m-    break;[m
[31m-   default:[m
[31m-    break;[m
[31m-  }[m
[31m-  printf("\n");[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-#define SS(x)	(x==1)?"":"s"[m
[31m-#define S(x)	x,SS(x)[m
[31m-[m
[31m-static void PrintHeader(const Proto* f)[m
[31m-{[m
[31m- const char* s=getstr(f->source);[m
[31m- if (*s=='@' || *s=='=')[m
[31m-  s++;[m
[31m- else if (*s==LUA_SIGNATURE[0])[m
[31m-  s="(bstring)";[m
[31m- else[m
[31m-  s="(string)";[m
[31m- printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n",[m
[31m- 	(f->linedefined==0)?"main":"function",s,[m
[31m-	f->linedefined,f->lastlinedefined,[m
[31m-	S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f));[m
[31m- printf("%d%s param%s, %d slot%s, %d upvalue%s, ",[m
[31m-	f->numparams,f->is_vararg?"+":"",SS(f->numparams),[m
[31m-	S(f->maxstacksize),S(f->nups));[m
[31m- printf("%d local%s, %d constant%s, %d function%s\n",[m
[31m-	S(f->sizelocvars),S(f->sizek),S(f->sizep));[m
[31m-}[m
[31m-[m
[31m-static void PrintConstants(const Proto* f)[m
[31m-{[m
[31m- int i,n=f->sizek;[m
[31m- printf("constants (%d) for %p:\n",n,VOID(f));[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  printf("\t%d\t",i+1);[m
[31m-  PrintConstant(f,i);[m
[31m-  printf("\n");[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void PrintLocals(const Proto* f)[m
[31m-{[m
[31m- int i,n=f->sizelocvars;[m
[31m- printf("locals (%d) for %p:\n",n,VOID(f));[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  printf("\t%d\t%s\t%d\t%d\n",[m
[31m-  i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-static void PrintUpvalues(const Proto* f)[m
[31m-{[m
[31m- int i,n=f->sizeupvalues;[m
[31m- printf("upvalues (%d) for %p:\n",n,VOID(f));[m
[31m- if (f->upvalues==NULL) return;[m
[31m- for (i=0; i<n; i++)[m
[31m- {[m
[31m-  printf("\t%d\t%s\n",i,getstr(f->upvalues[i]));[m
[31m- }[m
[31m-}[m
[31m-[m
[31m-void PrintFunction(const Proto* f, int full)[m
[31m-{[m
[31m- int i,n=f->sizep;[m
[31m- PrintHeader(f);[m
[31m- PrintCode(f);[m
[31m- if (full)[m
[31m- {[m
[31m-  PrintConstants(f);[m
[31m-  PrintLocals(f);[m
[31m-  PrintUpvalues(f);[m
[31m- }[m
[31m- for (i=0; i<n; i++) PrintFunction(f->p[i],full);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/README[m
[1mdeleted file mode 100644[m
[1mindex 0c7f38b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/README[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-These are simple tests for Lua.  Some of them contain useful code.[m
[31m-They are meant to be run to make sure Lua is built correctly and also[m
[31m-to be read, to see how Lua programs look.[m
[31m-[m
[31m-Here is a one-line summary of each program:[m
[31m-[m
[31m-   bisect.lua		bisection method for solving non-linear equations[m
[31m-   cf.lua		temperature conversion table (celsius to farenheit)[m
[31m-   echo.lua             echo command line arguments[m
[31m-   env.lua              environment variables as automatic global variables[m
[31m-   factorial.lua	factorial without recursion[m
[31m-   fib.lua		fibonacci function with cache[m
[31m-   fibfor.lua		fibonacci numbers with coroutines and generators[m
[31m-   globals.lua		report global variable usage[m
[31m-   hello.lua		the first program in every language[m
[31m-   life.lua		Conway's Game of Life[m
[31m-   luac.lua	 	bare-bones luac[m
[31m-   printf.lua		an implementation of printf[m
[31m-   readonly.lua		make global variables readonly[m
[31m-   sieve.lua		the sieve of of Eratosthenes programmed with coroutines[m
[31m-   sort.lua		two implementations of a sort function[m
[31m-   table.lua		make table, grouping all data for the same item[m
[31m-   trace-calls.lua	trace calls[m
[31m-   trace-globals.lua	trace assigments to global variables[m
[31m-   xd.lua		hex dump[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/bisect.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/bisect.lua[m
[1mdeleted file mode 100644[m
[1mindex f91e69b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/bisect.lua[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m--- bisection method for solving non-linear equations[m
[31m-[m
[31m-delta=1e-6	-- tolerance[m
[31m-[m
[31m-function bisect(f,a,b,fa,fb)[m
[31m- local c=(a+b)/2[m
[31m- io.write(n," c=",c," a=",a," b=",b,"\n")[m
[31m- if c==a or c==b or math.abs(a-b)<delta then return c,b-a end[m
[31m- n=n+1[m
[31m- local fc=f(c)[m
[31m- if fa*fc<0 then return bisect(f,a,c,fa,fc) else return bisect(f,c,b,fc,fb) end[m
[31m-end[m
[31m-[m
[31m--- find root of f in the inverval [a,b]. needs f(a)*f(b)<0[m
[31m-function solve(f,a,b)[m
[31m- n=0[m
[31m- local z,e=bisect(f,a,b,f(a),f(b))[m
[31m- io.write(string.format("after %d steps, root is %.17g with error %.1e, f=%.1e\n",n,z,e,f(z)))[m
[31m-end[m
[31m-[m
[31m--- our function[m
[31m-function f(x)[m
[31m- return x*x*x-x-1[m
[31m-end[m
[31m-[m
[31m--- find zero in [1,2][m
[31m-solve(f,1,2)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/cf.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/cf.lua[m
[1mdeleted file mode 100644[m
[1mindex 8cda54b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/cf.lua[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m--- temperature conversion table (celsius to farenheit)[m
[31m-[m
[31m-for c0=-20,50-1,10 do[m
[31m-	io.write("C ")[m
[31m-	for c=c0,c0+10-1 do[m
[31m-		io.write(string.format("%3.0f ",c))[m
[31m-	end[m
[31m-	io.write("\n")[m
[31m-	[m
[31m-	io.write("F ")[m
[31m-	for c=c0,c0+10-1 do[m
[31m-		f=(9/5)*c+32[m
[31m-		io.write(string.format("%3.0f ",f))[m
[31m-	end[m
[31m-	io.write("\n\n")[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/echo.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/echo.lua[m
[1mdeleted file mode 100644[m
[1mindex 4313439..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/echo.lua[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m--- echo command line arguments[m
[31m-[m
[31m-for i=0,table.getn(arg) do[m
[31m- print(i,arg[i])[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/env.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/env.lua[m
[1mdeleted file mode 100644[m
[1mindex 9e62a57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/env.lua[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m--- read environment variables as if they were global variables[m
[31m-[m
[31m-local f=function (t,i) return os.getenv(i) end[m
[31m-setmetatable(getfenv(),{__index=f})[m
[31m-[m
[31m--- an example[m
[31m-print(a,USER,PATH)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/factorial.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/factorial.lua[m
[1mdeleted file mode 100644[m
[1mindex 7c4cf0f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/factorial.lua[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m--- function closures are powerful[m
[31m-[m
[31m--- traditional fixed-point operator from functional programming[m
[31m-Y = function (g)[m
[31m-      local a = function (f) return f(f) end[m
[31m-      return a(function (f)[m
[31m-                 return g(function (x)[m
[31m-                             local c=f(f)[m
[31m-                             return c(x)[m
[31m-                           end)[m
[31m-               end)[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- factorial without recursion[m
[31m-F = function (f)[m
[31m-      return function (n)[m
[31m-               if n == 0 then return 1[m
[31m-               else return n*f(n-1) end[m
[31m-             end[m
[31m-    end[m
[31m-[m
[31m-factorial = Y(F)   -- factorial is the fixed point of F[m
[31m-[m
[31m--- now test it[m
[31m-function test(x)[m
[31m-	io.write(x,"! = ",factorial(x),"\n")[m
[31m-end[m
[31m-[m
[31m-for n=0,16 do[m
[31m-	test(n)[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/fib.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/fib.lua[m
[1mdeleted file mode 100644[m
[1mindex 97a921b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/fib.lua[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m--- fibonacci function with cache[m
[31m-[m
[31m--- very inefficient fibonacci function[m
[31m-function fib(n)[m
[31m-	N=N+1[m
[31m-	if n<2 then[m
[31m-		return n[m
[31m-	else[m
[31m-		return fib(n-1)+fib(n-2)[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m--- a general-purpose value cache[m
[31m-function cache(f)[m
[31m-	local c={}[m
[31m-	return function (x)[m
[31m-		local y=c[x][m
[31m-		if not y then[m
[31m-			y=f(x)[m
[31m-			c[x]=y[m
[31m-		end[m
[31m-		return y[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m--- run and time it[m
[31m-function test(s,f)[m
[31m-	N=0[m
[31m-	local c=os.clock()[m
[31m-	local v=f(n)[m
[31m-	local t=os.clock()-c[m
[31m-	print(s,n,v,t,N)[m
[31m-end[m
[31m-[m
[31m-n=arg[1] or 24		-- for other values, do lua fib.lua XX[m
[31m-n=tonumber(n)[m
[31m-print("","n","value","time","evals")[m
[31m-test("plain",fib)[m
[31m-fib=cache(fib)[m
[31m-test("cached",fib)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/fibfor.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/fibfor.lua[m
[1mdeleted file mode 100644[m
[1mindex 8bbba39..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/fibfor.lua[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m--- example of for with generator functions[m
[31m-[m
[31m-function generatefib (n)[m
[31m-  return coroutine.wrap(function ()[m
[31m-    local a,b = 1, 1[m
[31m-    while a <= n do[m
[31m-      coroutine.yield(a)[m
[31m-      a, b = b, a+b[m
[31m-    end[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-for i in generatefib(1000) do print(i) end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/globals.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/globals.lua[m
[1mdeleted file mode 100644[m
[1mindex d4c20e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/globals.lua[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m--- reads luac listings and reports global variable usage[m
[31m--- lines where a global is written to are marked with "*"[m
[31m--- typical usage: luac -p -l file.lua | lua globals.lua | sort | lua table.lua[m
[31m-[m
[31m-while 1 do[m
[31m- local s=io.read()[m
[31m- if s==nil then break end[m
[31m- local ok,_,l,op,g=string.find(s,"%[%-?(%d*)%]%s*([GS])ETGLOBAL.-;%s+(.*)$")[m
[31m- if ok then[m
[31m-  if op=="S" then op="*" else op="" end[m
[31m-  io.write(g,"\t",l,op,"\n")[m
[31m- end[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/hello.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/hello.lua[m
[1mdeleted file mode 100644[m
[1mindex 0925498..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/hello.lua[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m--- the first program in every language[m
[31m-[m
[31m-io.write("Hello world, from ",_VERSION,"!\n")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/life.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/life.lua[m
[1mdeleted file mode 100644[m
[1mindex 911d9fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/life.lua[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m--- life.lua[m
[31m--- original by Dave Bollinger <DBollinger@compuserve.com> posted to lua-l[m
[31m--- modified to use ANSI terminal escape sequences[m
[31m--- modified to use for instead of while[m
[31m-[m
[31m-local write=io.write[m
[31m-[m
[31m-ALIVE=""	DEAD=""[m
[31m-ALIVE="O"	DEAD="-"[m
[31m-[m
[31m-function delay() -- NOTE: SYSTEM-DEPENDENT, adjust as necessary[m
[31m-  for i=1,10000 do end[m
[31m-  -- local i=os.clock()+1 while(os.clock()<i) do end[m
[31m-end[m
[31m-[m
[31m-function ARRAY2D(w,h)[m
[31m-  local t = {w=w,h=h}[m
[31m-  for y=1,h do[m
[31m-    t[y] = {}[m
[31m-    for x=1,w do[m
[31m-      t[y][x]=0[m
[31m-    end[m
[31m-  end[m
[31m-  return t[m
[31m-end[m
[31m-[m
[31m-_CELLS = {}[m
[31m-[m
[31m--- give birth to a "shape" within the cell array[m
[31m-function _CELLS:spawn(shape,left,top)[m
[31m-  for y=0,shape.h-1 do[m
[31m-    for x=0,shape.w-1 do[m
[31m-      self[top+y][left+x] = shape[y*shape.w+x+1][m
[31m-    end[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- run the CA and produce the next generation[m
[31m-function _CELLS:evolve(next)[m
[31m-  local ym1,y,yp1,yi=self.h-1,self.h,1,self.h[m
[31m-  while yi > 0 do[m
[31m-    local xm1,x,xp1,xi=self.w-1,self.w,1,self.w[m
[31m-    while xi > 0 do[m
[31m-      local sum = self[ym1][xm1] + self[ym1][x] + self[ym1][xp1] +[m
[31m-                  self[y][xm1] + self[y][xp1] +[m
[31m-                  self[yp1][xm1] + self[yp1][x] + self[yp1][xp1][m
[31m-      next[y][x] = ((sum==2) and self[y][x]) or ((sum==3) and 1) or 0[m
[31m-      xm1,x,xp1,xi = x,xp1,xp1+1,xi-1[m
[31m-    end[m
[31m-    ym1,y,yp1,yi = y,yp1,yp1+1,yi-1[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m--- output the array to screen[m
[31m-function _CELLS:draw()[m
[31m-  local out="" -- accumulate to reduce flicker[m
[31m-  for y=1,self.h do[m
[31m-   for x=1,self.w do[m
[31m-      out=out..(((self[y][x]>0) and ALIVE) or DEAD)[m
[31m-    end[m
[31m-    out=out.."\n"[m
[31m-  end[m
[31m-  write(out)[m
[31m-end[m
[31m-[m
[31m--- constructor[m
[31m-function CELLS(w,h)[m
[31m-  local c = ARRAY2D(w,h)[m
[31m-  c.spawn = _CELLS.spawn[m
[31m-  c.evolve = _CELLS.evolve[m
[31m-  c.draw = _CELLS.draw[m
[31m-  return c[m
[31m-end[m
[31m-[m
[31m---[m
[31m--- shapes suitable for use with spawn() above[m
[31m---[m
[31m-HEART = { 1,0,1,1,0,1,1,1,1; w=3,h=3 }[m
[31m-GLIDER = { 0,0,1,1,0,1,0,1,1; w=3,h=3 }[m
[31m-EXPLODE = { 0,1,0,1,1,1,1,0,1,0,1,0; w=3,h=4 }[m
[31m-FISH = { 0,1,1,1,1,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0; w=5,h=4 }[m
[31m-BUTTERFLY = { 1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,0,1,1,0,0,0,1; w=5,h=5 }[m
[31m-[m
[31m--- the main routine[m
[31m-function LIFE(w,h)[m
[31m-  -- create two arrays[m
[31m-  local thisgen = CELLS(w,h)[m
[31m-  local nextgen = CELLS(w,h)[m
[31m-[m
[31m-  -- create some life[m
[31m-  -- about 1000 generations of fun, then a glider steady-state[m
[31m-  thisgen:spawn(GLIDER,5,4)[m
[31m-  thisgen:spawn(EXPLODE,25,10)[m
[31m-  thisgen:spawn(FISH,4,12)[m
[31m-[m
[31m-  -- run until break[m
[31m-  local gen=1[m
[31m-  write("\027[2J")	-- ANSI clear screen[m
[31m-  while 1 do[m
[31m-    thisgen:evolve(nextgen)[m
[31m-    thisgen,nextgen = nextgen,thisgen[m
[31m-    write("\027[H")	-- ANSI home cursor[m
[31m-    thisgen:draw()[m
[31m-    write("Life - generation ",gen,"\n")[m
[31m-    gen=gen+1[m
[31m-    if gen>2000 then break end[m
[31m-    --delay()		-- no delay[m
[31m-  end[m
[31m-end[m
[31m-[m
[31m-LIFE(40,20)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/luac.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/luac.lua[m
[1mdeleted file mode 100644[m
[1mindex 96a0a97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/luac.lua[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m--- bare-bones luac in Lua[m
[31m--- usage: lua luac.lua file.lua[m
[31m-[m
[31m-assert(arg[1]~=nil and arg[2]==nil,"usage: lua luac.lua file.lua")[m
[31m-f=assert(io.open("luac.out","wb"))[m
[31m-assert(f:write(string.dump(assert(loadfile(arg[1])))))[m
[31m-assert(f:close())[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/printf.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/printf.lua[m
[1mdeleted file mode 100644[m
[1mindex 58c63ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/printf.lua[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m--- an implementation of printf[m
[31m-[m
[31m-function printf(...)[m
[31m- io.write(string.format(...))[m
[31m-end[m
[31m-[m
[31m-printf("Hello %s from %s on %s\n",os.getenv"USER" or "there",_VERSION,os.date())[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/readonly.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/readonly.lua[m
[1mdeleted file mode 100644[m
[1mindex 85c0b4e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/readonly.lua[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m--- make global variables readonly[m
[31m-[m
[31m-local f=function (t,i) error("cannot redefine global variable `"..i.."'",2) end[m
[31m-local g={}[m
[31m-local G=getfenv()[m
[31m-setmetatable(g,{__index=G,__newindex=f})[m
[31m-setfenv(1,g)[m
[31m-[m
[31m--- an example[m
[31m-rawset(g,"x",3)[m
[31m-x=2[m
[31m-y=1	-- cannot redefine `y'[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/sieve.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/sieve.lua[m
[1mdeleted file mode 100644[m
[1mindex 0871bb2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/sieve.lua[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m--- the sieve of of Eratosthenes programmed with coroutines[m
[31m--- typical usage: lua -e N=1000 sieve.lua | column[m
[31m-[m
[31m--- generate all the numbers from 2 to n[m
[31m-function gen (n)[m
[31m-  return coroutine.wrap(function ()[m
[31m-    for i=2,n do coroutine.yield(i) end[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m--- filter the numbers generated by `g', removing multiples of `p'[m
[31m-function filter (p, g)[m
[31m-  return coroutine.wrap(function ()[m
[31m-    while 1 do[m
[31m-      local n = g()[m
[31m-      if n == nil then return end[m
[31m-      if math.mod(n, p) ~= 0 then coroutine.yield(n) end[m
[31m-    end[m
[31m-  end)[m
[31m-end[m
[31m-[m
[31m-N=N or 1000		-- from command line[m
[31m-x = gen(N)		-- generate primes up to N[m
[31m-while 1 do[m
[31m-  local n = x()		-- pick a number until done[m
[31m-  if n == nil then break end[m
[31m-  print(n)		-- must be a prime number[m
[31m-  x = filter(n, x)	-- now remove its multiples[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/sort.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/sort.lua[m
[1mdeleted file mode 100644[m
[1mindex 0bcb15f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/sort.lua[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m--- two implementations of a sort function[m
[31m--- this is an example only. Lua has now a built-in function "sort"[m
[31m-[m
[31m--- extracted from Programming Pearls, page 110[m
[31m-function qsort(x,l,u,f)[m
[31m- if l<u then[m
[31m-  local m=math.random(u-(l-1))+l-1	-- choose a random pivot in range l..u[m
[31m-  x[l],x[m]=x[m],x[l]			-- swap pivot to first position[m
[31m-  local t=x[l]				-- pivot value[m
[31m-  m=l[m
[31m-  local i=l+1[m
[31m-  while i<=u do[m
[31m-    -- invariant: x[l+1..m] < t <= x[m+1..i-1][m
[31m-    if f(x[i],t) then[m
[31m-      m=m+1[m
[31m-      x[m],x[i]=x[i],x[m]		-- swap x[i] and x[m][m
[31m-    end[m
[31m-    i=i+1[m
[31m-  end[m
[31m-  x[l],x[m]=x[m],x[l]			-- swap pivot to a valid place[m
[31m-  -- x[l+1..m-1] < x[m] <= x[m+1..u][m
[31m-  qsort(x,l,m-1,f)[m
[31m-  qsort(x,m+1,u,f)[m
[31m- end[m
[31m-end[m
[31m-[m
[31m-function selectionsort(x,n,f)[m
[31m- local i=1[m
[31m- while i<=n do[m
[31m-  local m,j=i,i+1[m
[31m-  while j<=n do[m
[31m-   if f(x[j],x[m]) then m=j end[m
[31m-   j=j+1[m
[31m-  end[m
[31m- x[i],x[m]=x[m],x[i]			-- swap x[i] and x[m][m
[31m- i=i+1[m
[31m- end[m
[31m-end[m
[31m-[m
[31m-function show(m,x)[m
[31m- io.write(m,"\n\t")[m
[31m- local i=1[m
[31m- while x[i] do[m
[31m-  io.write(x[i])[m
[31m-  i=i+1[m
[31m-  if x[i] then io.write(",") end[m
[31m- end[m
[31m- io.write("\n")[m
[31m-end[m
[31m-[m
[31m-function testsorts(x)[m
[31m- local n=1[m
[31m- while x[n] do n=n+1 end; n=n-1		-- count elements[m
[31m- show("original",x)[m
[31m- qsort(x,1,n,function (x,y) return x<y end)[m
[31m- show("after quicksort",x)[m
[31m- selectionsort(x,n,function (x,y) return x>y end)[m
[31m- show("after reverse selection sort",x)[m
[31m- qsort(x,1,n,function (x,y) return x<y end)[m
[31m- show("after quicksort again",x)[m
[31m-end[m
[31m-[m
[31m--- array to be sorted[m
[31m-x={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}[m
[31m-[m
[31m-testsorts(x)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/table.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/table.lua[m
[1mdeleted file mode 100644[m
[1mindex 235089c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/table.lua[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m--- make table, grouping all data for the same item[m
[31m--- input is 2 columns (item, data)[m
[31m-[m
[31m-local A[m
[31m-while 1 do[m
[31m- local l=io.read()[m
[31m- if l==nil then break end[m
[31m- local _,_,a,b=string.find(l,'"?([_%w]+)"?%s*(.*)$')[m
[31m- if a~=A then A=a io.write("\n",a,":") end[m
[31m- io.write(" ",b)[m
[31m-end[m
[31m-io.write("\n")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/trace-calls.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/trace-calls.lua[m
[1mdeleted file mode 100644[m
[1mindex 6d7a7b3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/trace-calls.lua[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m--- trace calls[m
[31m--- example: lua -ltrace-calls bisect.lua[m
[31m-[m
[31m-local level=0[m
[31m-[m
[31m-local function hook(event)[m
[31m- local t=debug.getinfo(3)[m
[31m- io.write(level," >>> ",string.rep(" ",level))[m
[31m- if t~=nil and t.currentline>=0 then io.write(t.short_src,":",t.currentline," ") end[m
[31m- t=debug.getinfo(2)[m
[31m- if event=="call" then[m
[31m-  level=level+1[m
[31m- else[m
[31m-  level=level-1 if level<0 then level=0 end[m
[31m- end[m
[31m- if t.what=="main" then[m
[31m-  if event=="call" then[m
[31m-   io.write("begin ",t.short_src)[m
[31m-  else[m
[31m-   io.write("end ",t.short_src)[m
[31m-  end[m
[31m- elseif t.what=="Lua" then[m
[31m--- table.foreach(t,print)[m
[31m-  io.write(event," ",t.name or "(Lua)"," <",t.linedefined,":",t.short_src,">")[m
[31m- else[m
[31m- io.write(event," ",t.name or "(C)"," [",t.what,"] ")[m
[31m- end[m
[31m- io.write("\n")[m
[31m-end[m
[31m-[m
[31m-debug.sethook(hook,"cr")[m
[31m-level=0[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/trace-globals.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/trace-globals.lua[m
[1mdeleted file mode 100644[m
[1mindex 295e670..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/trace-globals.lua[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m--- trace assigments to global variables[m
[31m-[m
[31m-do[m
[31m- -- a tostring that quotes strings. note the use of the original tostring.[m
[31m- local _tostring=tostring[m
[31m- local tostring=function(a)[m
[31m-  if type(a)=="string" then[m
[31m-   return string.format("%q",a)[m
[31m-  else[m
[31m-   return _tostring(a)[m
[31m-  end[m
[31m- end[m
[31m-[m
[31m- local log=function (name,old,new)[m
[31m-  local t=debug.getinfo(3,"Sl")[m
[31m-  local line=t.currentline[m
[31m-  io.write(t.short_src)[m
[31m-  if line>=0 then io.write(":",line) end[m
[31m-  io.write(": ",name," is now ",tostring(new)," (was ",tostring(old),")","\n")[m
[31m- end[m
[31m-[m
[31m- local g={}[m
[31m- local set=function (t,name,value)[m
[31m-  log(name,g[name],value)[m
[31m-  g[name]=value[m
[31m- end[m
[31m- setmetatable(getfenv(),{__index=g,__newindex=set})[m
[31m-end[m
[31m-[m
[31m--- an example[m
[31m-[m
[31m-a=1[m
[31m-b=2[m
[31m-a=10[m
[31m-b=20[m
[31m-b=nil[m
[31m-b=200[m
[31m-print(a,b,c)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/xd.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/xd.lua[m
[1mdeleted file mode 100644[m
[1mindex ebc3eff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-5.1.5/test/xd.lua[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m--- hex dump[m
[31m--- usage: lua xd.lua < file[m
[31m-[m
[31m-local offset=0[m
[31m-while true do[m
[31m- local s=io.read(16)[m
[31m- if s==nil then return end[m
[31m- io.write(string.format("%08X  ",offset))[m
[31m- string.gsub(s,"(.)",[m
[31m-	function (c) io.write(string.format("%02X ",string.byte(c))) end)[m
[31m- io.write(string.rep(" ",3*(16-string.len(s))))[m
[31m- io.write(" ",string.gsub(s,"%c","."),"\n") [m
[31m- offset=offset+16[m
[31m-end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 35e3809..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-env:[m
[31m-  matrix:[m
[31m-    - LUA=lua5.1-dev LUA_DEV=liblua5.1-dev LUA_INCLUDE_DIR=/usr/include/lua5.1 LUA_CMODULE_DIR=/lib LUALIB=-llua5.1[m
[31m-    - LUA=libluajit-5.1-dev LUA_DEV=libluajit-5.1-dev LUA_INCLUDE_DIR=/usr/include/luajit-2.0 LUA_CMODULE_DIR=/lib LUALIB=-lluajit-5.1[m
[31m-[m
[31m-install:[m
[31m-    - sudo apt-get update[m
[31m-    - sudo apt-get install -qq -y $LUA luarocks cppcheck valgrind[m
[31m-    - sudo apt-get install -qq -y cpanminus libipc-run3-perl > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-    - sudo cpanm --notest Test::Base Test::LongString > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-[m
[31m-script:[m
[31m-  - cppcheck --force --error-exitcode=1 --enable=warning . > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sh runtests.sh[m
[31m-  - make[m
[31m-  - prove -Itests tests[m
[31m-  - TEST_LUA_USE_VALGRIND=1 prove -Itests tests > build.log 2>&1[m
[31m-  - cat build.log[m
[31m-  - grep -E '^==[0-9]+==' build.log; if [ "$?" == 0 ]; then exit 1; else exit 0; fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/CMakeLists.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/CMakeLists.txt[m
[1mdeleted file mode 100644[m
[1mindex c17239b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/CMakeLists.txt[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-# If Lua is installed in a non-standard location, please set the LUA_DIR[m
[31m-# environment variable to point to prefix for the install. Eg:[m
[31m-#       Unix: export LUA_DIR=/home/user/pkg[m
[31m-#       Windows: set LUA_DIR=c:\lua51[m
[31m-[m
[31m-project(lua-cjson C)[m
[31m-cmake_minimum_required(VERSION 2.6)[m
[31m-[m
[31m-option(USE_INTERNAL_FPCONV "Use internal strtod() / g_fmt() code for performance")[m
[31m-option(MULTIPLE_THREADS "Support multi-threaded apps with internal fpconv - recommended" ON)[m
[31m-[m
[31m-if(NOT CMAKE_BUILD_TYPE)[m
[31m-    set(CMAKE_BUILD_TYPE Release CACHE STRING[m
[31m-        "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."[m
[31m-        FORCE)[m
[31m-endif()[m
[31m-[m
[31m-find_package(Lua51 REQUIRED)[m
[31m-include_directories(${LUA_INCLUDE_DIR})[m
[31m-[m
[31m-if(NOT USE_INTERNAL_FPCONV)[m
[31m-    # Use libc number conversion routines (strtod(), sprintf())[m
[31m-    set(FPCONV_SOURCES fpconv.c)[m
[31m-else()[m
[31m-    # Use internal number conversion routines[m
[31m-    add_definitions(-DUSE_INTERNAL_FPCONV)[m
[31m-    set(FPCONV_SOURCES g_fmt.c dtoa.c)[m
[31m-[m
[31m-    include(TestBigEndian)[m
[31m-    TEST_BIG_ENDIAN(IEEE_BIG_ENDIAN)[m
[31m-    if(IEEE_BIG_ENDIAN)[m
[31m-        add_definitions(-DIEEE_BIG_ENDIAN)[m
[31m-    endif()[m
[31m-[m
[31m-    if(MULTIPLE_THREADS)[m
[31m-        set(CMAKE_THREAD_PREFER_PTHREAD TRUE)[m
[31m-        find_package(Threads REQUIRED)[m
[31m-        if(NOT CMAKE_USE_PTHREADS_INIT)[m
[31m-            message(FATAL_ERROR[m
[31m-                    "Pthreads not found - required by MULTIPLE_THREADS option")[m
[31m-        endif()[m
[31m-        add_definitions(-DMULTIPLE_THREADS)[m
[31m-    endif()[m
[31m-endif()[m
[31m-[m
[31m-# Handle platforms missing isinf() macro (Eg, some Solaris systems).[m
[31m-include(CheckSymbolExists)[m
[31m-CHECK_SYMBOL_EXISTS(isinf math.h HAVE_ISINF)[m
[31m-if(NOT HAVE_ISINF)[m
[31m-    add_definitions(-DUSE_INTERNAL_ISINF)[m
[31m-endif()[m
[31m-[m
[31m-set(_MODULE_LINK "${CMAKE_THREAD_LIBS_INIT}")[m
[31m-get_filename_component(_lua_lib_dir ${LUA_LIBRARY} PATH)[m
[31m-[m
[31m-if(APPLE)[m
[31m-    set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS[m
[31m-        "${CMAKE_SHARED_MODULE_CREATE_C_FLAGS} -undefined dynamic_lookup")[m
[31m-endif()[m
[31m-[m
[31m-if(WIN32)[m
[31m-    # Win32 modules need to be linked to the Lua library.[m
[31m-    set(_MODULE_LINK ${LUA_LIBRARY} ${_MODULE_LINK})[m
[31m-    set(_lua_module_dir "${_lua_lib_dir}")[m
[31m-    # Windows sprintf()/strtod() handle NaN/inf differently. Not supported.[m
[31m-    add_definitions(-DDISABLE_INVALID_NUMBERS)[m
[31m-else()[m
[31m-    set(_lua_module_dir "${_lua_lib_dir}/lua/5.1")[m
[31m-endif()[m
[31m-[m
[31m-add_library(cjson MODULE lua_cjson.c strbuf.c ${FPCONV_SOURCES})[m
[31m-set_target_properties(cjson PROPERTIES PREFIX "")[m
[31m-target_link_libraries(cjson ${_MODULE_LINK})[m
[31m-install(TARGETS cjson DESTINATION "${_lua_module_dir}")[m
[31m-[m
[31m-# vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 747a8bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m-[m
[31m-Permission is hereby granted, free of charge, to any person obtaining[m
[31m-a copy of this software and associated documentation files (the[m
[31m-"Software"), to deal in the Software without restriction, including[m
[31m-without limitation the rights to use, copy, modify, merge, publish,[m
[31m-distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-permit persons to whom the Software is furnished to do so, subject to[m
[31m-the following conditions:[m
[31m-[m
[31m-The above copyright notice and this permission notice shall be[m
[31m-included in all copies or substantial portions of the Software.[m
[31m-[m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 2361028..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-##### Available defines for CJSON_CFLAGS #####[m
[31m-##[m
[31m-## USE_INTERNAL_ISINF:      Workaround for Solaris platforms missing isinf().[m
[31m-## DISABLE_INVALID_NUMBERS: Permanently disable invalid JSON numbers:[m
[31m-##                          NaN, Infinity, hex.[m
[31m-##[m
[31m-## Optional built-in number conversion uses the following defines:[m
[31m-## USE_INTERNAL_FPCONV:     Use builtin strtod/dtoa for numeric conversions.[m
[31m-## IEEE_BIG_ENDIAN:         Required on big endian architectures.[m
[31m-## MULTIPLE_THREADS:        Must be set when Lua CJSON may be used in a[m
[31m-##                          multi-threaded application. Requries _pthreads_.[m
[31m-[m
[31m-##### Build defaults #####[m
[31m-LUA_VERSION =       5.1[m
[31m-TARGET =            cjson.so[m
[31m-PREFIX =            /usr/local[m
[31m-#CFLAGS =            -g -Wall -pedantic -fno-inline[m
[31m-CFLAGS =            -O3 -Wall -pedantic -DNDEBUG[m
[31m-CJSON_CFLAGS =      -fpic[m
[31m-CJSON_LDFLAGS =     -shared[m
[31m-LUA_INCLUDE_DIR ?=   $(PREFIX)/include[m
[31m-LUA_CMODULE_DIR ?=   $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-LUA_MODULE_DIR ?=    $(PREFIX)/share/lua/$(LUA_VERSION)[m
[31m-LUA_BIN_DIR ?=       $(PREFIX)/bin[m
[31m-[m
[31m-##### Platform overrides #####[m
[31m-##[m
[31m-## Tweak one of the platform sections below to suit your situation.[m
[31m-##[m
[31m-## See http://lua-users.org/wiki/BuildingModules for further platform[m
[31m-## specific details.[m
[31m-[m
[31m-## Linux[m
[31m-[m
[31m-## FreeBSD[m
[31m-#LUA_INCLUDE_DIR =   $(PREFIX)/include/lua51[m
[31m-[m
[31m-## MacOSX (Macports)[m
[31m-#PREFIX =            /opt/local[m
[31m-#CJSON_LDFLAGS =     -bundle -undefined dynamic_lookup[m
[31m-[m
[31m-## Solaris[m
[31m-#PREFIX =            /home/user/opt[m
[31m-#CC =                gcc[m
[31m-#CJSON_CFLAGS =      -fpic -DUSE_INTERNAL_ISINF[m
[31m-[m
[31m-## Windows (MinGW)[m
[31m-#TARGET =            cjson.dll[m
[31m-#PREFIX =            /home/user/opt[m
[31m-#CJSON_CFLAGS =      -DDISABLE_INVALID_NUMBERS[m
[31m-#CJSON_LDFLAGS =     -shared -L$(PREFIX)/lib -llua51[m
[31m-#LUA_BIN_SUFFIX =    .lua[m
[31m-[m
[31m-##### Number conversion configuration #####[m
[31m-[m
[31m-## Use Libc support for number conversion (default)[m
[31m-FPCONV_OBJS =       fpconv.o[m
[31m-[m
[31m-## Use built in number conversion[m
[31m-#FPCONV_OBJS =       g_fmt.o dtoa.o[m
[31m-#CJSON_CFLAGS +=     -DUSE_INTERNAL_FPCONV[m
[31m-[m
[31m-## Compile built in number conversion for big endian architectures[m
[31m-#CJSON_CFLAGS +=     -DIEEE_BIG_ENDIAN[m
[31m-[m
[31m-## Compile built in number conversion to support multi-threaded[m
[31m-## applications (recommended)[m
[31m-#CJSON_CFLAGS +=     -pthread -DMULTIPLE_THREADS[m
[31m-#CJSON_LDFLAGS +=    -pthread[m
[31m-[m
[31m-##### End customisable sections #####[m
[31m-[m
[31m-TEST_FILES =        README bench.lua genutf8.pl test.lua octets-escaped.dat \[m
[31m-                    example1.json example2.json example3.json example4.json \[m
[31m-                    example5.json numbers.json rfc-example1.json \[m
[31m-                    rfc-example2.json types.json[m
[31m-DATAPERM =          644[m
[31m-EXECPERM =          755[m
[31m-[m
[31m-ASCIIDOC =          asciidoc[m
[31m-[m
[31m-BUILD_CFLAGS =      -I$(LUA_INCLUDE_DIR) $(CJSON_CFLAGS)[m
[31m-OBJS =              lua_cjson.o strbuf.o $(FPCONV_OBJS)[m
[31m-[m
[31m-.PHONY: all clean install install-extra doc[m
[31m-[m
[31m-.SUFFIXES: .html .txt[m
[31m-[m
[31m-.c.o:[m
[31m-	$(CC) -c $(CFLAGS) $(CPPFLAGS) $(BUILD_CFLAGS) -o $@ $<[m
[31m-[m
[31m-.txt.html:[m
[31m-	$(ASCIIDOC) -n -a toc $<[m
[31m-[m
[31m-all: $(TARGET)[m
[31m-[m
[31m-doc: manual.html performance.html[m
[31m-[m
[31m-$(TARGET): $(OBJS)[m
[31m-	$(CC) $(LDFLAGS) $(CJSON_LDFLAGS) -o $@ $(OBJS)[m
[31m-[m
[31m-install: $(TARGET)[m
[31m-	mkdir -p $(DESTDIR)$(LUA_CMODULE_DIR)[m
[31m-	rm -f $(DESTDIR)$(LUA_CMODULE_DIR)/$(TARGET)[m
[31m-	cp $(TARGET) $(DESTDIR)$(LUA_CMODULE_DIR)[m
[31m-	chmod $(EXECPERM) $(DESTDIR)$(LUA_CMODULE_DIR)/$(TARGET)[m
[31m-[m
[31m-install-extra:[m
[31m-	mkdir -p $(DESTDIR)$(LUA_MODULE_DIR)/cjson/tests \[m
[31m-		$(DESTDIR)$(LUA_BIN_DIR)[m
[31m-	cp lua/cjson/util.lua $(DESTDIR)$(LUA_MODULE_DIR)/cjson[m
[31m-	chmod $(DATAPERM) $(DESTDIR)$(LUA_MODULE_DIR)/cjson/util.lua[m
[31m-	cp lua/lua2json.lua $(DESTDIR)$(LUA_BIN_DIR)/lua2json$(LUA_BIN_SUFFIX)[m
[31m-	chmod $(EXECPERM) $(DESTDIR)$(LUA_BIN_DIR)/lua2json$(LUA_BIN_SUFFIX)[m
[31m-	cp lua/json2lua.lua $(DESTDIR)$(LUA_BIN_DIR)/json2lua$(LUA_BIN_SUFFIX)[m
[31m-	chmod $(EXECPERM) $(DESTDIR)$(LUA_BIN_DIR)/json2lua$(LUA_BIN_SUFFIX)[m
[31m-	cd tests; cp $(TEST_FILES) $(DESTDIR)$(LUA_MODULE_DIR)/cjson/tests[m
[31m-	cd tests; chmod $(DATAPERM) $(TEST_FILES); chmod $(EXECPERM) *.lua *.pl[m
[31m-[m
[31m-clean:[m
[31m-	rm -f *.o $(TARGET)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/NEWS b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/NEWS[m
[1mdeleted file mode 100644[m
[1mindex 8927d6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/NEWS[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-Version 2.1.0 (Mar 1 2012)[m
[31m-* Added cjson.safe module interface which returns nil after an error[m
[31m-* Improved Makefile compatibility with Solaris make[m
[31m-[m
[31m-Version 2.0.0 (Jan 22 2012)[m
[31m-* Improved platform compatibility for strtod/sprintf locale workaround[m
[31m-* Added option to build with David Gay's dtoa.c for improved performance[m
[31m-* Added support for Lua 5.2[m
[31m-* Added option to encode infinity/NaN as JSON null[m
[31m-* Fixed encode bug with a raised default limit and deeply nested tables[m
[31m-* Updated Makefile for compatibility with non-GNU make implementations[m
[31m-* Added CMake build support[m
[31m-* Added HTML manual[m
[31m-* Increased default nesting limit to 1000[m
[31m-* Added support for re-entrant use of encode and decode[m
[31m-* Added support for installing lua2json and json2lua utilities[m
[31m-* Added encode_invalid_numbers() and decode_invalid_numbers()[m
[31m-* Added decode_max_depth()[m
[31m-* Removed registration of global cjson module table[m
[31m-* Removed refuse_invalid_numbers()[m
[31m-[m
[31m-Version 1.0.4 (Nov 30 2011)[m
[31m-* Fixed numeric conversion under locales with a comma decimal separator[m
[31m-[m
[31m-Version 1.0.3 (Sep 15 2011)[m
[31m-* Fixed detection of objects with numeric string keys[m
[31m-* Provided work around for missing isinf() on Solaris[m
[31m-[m
[31m-Version 1.0.2 (May 30 2011)[m
[31m-* Portability improvements for Windows[m
[31m-  - No longer links with -lm[m
[31m-  - Use "socket" instead of "posix" for sub-second timing[m
[31m-* Removed UTF-8 test dependency on Perl Text::Iconv[m
[31m-* Added simple CLI commands for testing Lua <-> JSON conversions[m
[31m-* Added cjson.encode_number_precision()[m
[31m-[m
[31m-Version 1.0.1 (May 10 2011)[m
[31m-* Added build support for OSX[m
[31m-* Removed unnecessary whitespace from JSON output[m
[31m-* Added cjson.encode_keep_buffer()[m
[31m-* Fixed memory leak on Lua stack overflow exception[m
[31m-[m
[31m-Version 1.0 (May 9 2011)[m
[31m-* Initial release[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/THANKS b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/THANKS[m
[1mdeleted file mode 100644[m
[1mindex 4aade13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/THANKS[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-The following people have helped with bug reports, testing and/or[m
[31m-suggestions:[m
[31m-[m
[31m-- Louis-Philippe Perron (@loopole)[m
[31m-- Ondřej Jirman[m
[31m-- Steve Donovan <steve.j.donovan@gmail.com>[m
[31m-- Zhang "agentzh" Yichun <agentzh@gmail.com>[m
[31m-[m
[31m-Thanks![m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/dtoa.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/dtoa.c[m
[1mdeleted file mode 100644[m
[1mindex 56398ba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/dtoa.c[m
[1m+++ /dev/null[m
[36m@@ -1,4358 +0,0 @@[m
[31m-/****************************************************************[m
[31m- *[m
[31m- * The author of this software is David M. Gay.[m
[31m- *[m
[31m- * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.[m
[31m- *[m
[31m- * Permission to use, copy, modify, and distribute this software for any[m
[31m- * purpose without fee is hereby granted, provided that this entire notice[m
[31m- * is included in all copies of any software which is or includes a copy[m
[31m- * or modification of this software and in all copies of the supporting[m
[31m- * documentation for such software.[m
[31m- *[m
[31m- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED[m
[31m- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY[m
[31m- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY[m
[31m- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.[m
[31m- *[m
[31m- ***************************************************************/[m
[31m-[m
[31m-/* Please send bug reports to David M. Gay (dmg at acm dot org,[m
[31m- * with " at " changed at "@" and " dot " changed to ".").	*/[m
[31m-[m
[31m-/* On a machine with IEEE extended-precision registers, it is[m
[31m- * necessary to specify double-precision (53-bit) rounding precision[m
[31m- * before invoking strtod or dtoa.  If the machine uses (the equivalent[m
[31m- * of) Intel 80x87 arithmetic, the call[m
[31m- *	_control87(PC_53, MCW_PC);[m
[31m- * does this with many compilers.  Whether this or another call is[m
[31m- * appropriate depends on the compiler; for this to work, it may be[m
[31m- * necessary to #include "float.h" or another system-dependent header[m
[31m- * file.[m
[31m- */[m
[31m-[m
[31m-/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.[m
[31m- *[m
[31m- * This strtod returns a nearest machine number to the input decimal[m
[31m- * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are[m
[31m- * broken by the IEEE round-even rule.  Otherwise ties are broken by[m
[31m- * biased rounding (add half and chop).[m
[31m- *[m
[31m- * Inspired loosely by William D. Clinger's paper "How to Read Floating[m
[31m- * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].[m
[31m- *[m
[31m- * Modifications:[m
[31m- *[m
[31m- *	1. We only require IEEE, IBM, or VAX double-precision[m
[31m- *		arithmetic (not IEEE double-extended).[m
[31m- *	2. We get by with floating-point arithmetic in a case that[m
[31m- *		Clinger missed -- when we're computing d * 10^n[m
[31m- *		for a small integer d and the integer n is not too[m
[31m- *		much larger than 22 (the maximum integer k for which[m
[31m- *		we can represent 10^k exactly), we may be able to[m
[31m- *		compute (d*10^k) * 10^(e-k) with just one roundoff.[m
[31m- *	3. Rather than a bit-at-a-time adjustment of the binary[m
[31m- *		result in the hard case, we use floating-point[m
[31m- *		arithmetic to determine the adjustment to within[m
[31m- *		one bit; only in really hard cases do we need to[m
[31m- *		compute a second residual.[m
[31m- *	4. Because of 3., we don't need a large table of powers of 10[m
[31m- *		for ten-to-e (just some small tables, e.g. of 10^k[m
[31m- *		for 0 <= k <= 22).[m
[31m- */[m
[31m-[m
[31m-/*[m
[31m- * #define IEEE_8087 for IEEE-arithmetic machines where the least[m
[31m- *	significant byte has the lowest address.[m
[31m- * #define IEEE_MC68k for IEEE-arithmetic machines where the most[m
[31m- *	significant byte has the lowest address.[m
[31m- * #define Long int on machines with 32-bit ints and 64-bit longs.[m
[31m- * #define IBM for IBM mainframe-style floating-point arithmetic.[m
[31m- * #define VAX for VAX-style floating-point arithmetic (D_floating).[m
[31m- * #define No_leftright to omit left-right logic in fast floating-point[m
[31m- *	computation of dtoa.  This will cause dtoa modes 4 and 5 to be[m
[31m- *	treated the same as modes 2 and 3 for some inputs.[m
[31m- * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3[m
[31m- *	and strtod and dtoa should round accordingly.  Unless Trust_FLT_ROUNDS[m
[31m- *	is also #defined, fegetround() will be queried for the rounding mode.[m
[31m- *	Note that both FLT_ROUNDS and fegetround() are specified by the C99[m
[31m- *	standard (and are specified to be consistent, with fesetround()[m
[31m- *	affecting the value of FLT_ROUNDS), but that some (Linux) systems[m
[31m- *	do not work correctly in this regard, so using fegetround() is more[m
[31m- *	portable than using FLT_ROUNDS directly.[m
[31m- * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3[m
[31m- *	and Honor_FLT_ROUNDS is not #defined.[m
[31m- * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines[m
[31m- *	that use extended-precision instructions to compute rounded[m
[31m- *	products and quotients) with IBM.[m
[31m- * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic[m
[31m- *	that rounds toward +Infinity.[m
[31m- * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased[m
[31m- *	rounding when the underlying floating-point arithmetic uses[m
[31m- *	unbiased rounding.  This prevent using ordinary floating-point[m
[31m- *	arithmetic when the result could be computed with one rounding error.[m
[31m- * #define Inaccurate_Divide for IEEE-format with correctly rounded[m
[31m- *	products but inaccurate quotients, e.g., for Intel i860.[m
[31m- * #define NO_LONG_LONG on machines that do not have a "long long"[m
[31m- *	integer type (of >= 64 bits).  On such machines, you can[m
[31m- *	#define Just_16 to store 16 bits per 32-bit Long when doing[m
[31m- *	high-precision integer arithmetic.  Whether this speeds things[m
[31m- *	up or slows things down depends on the machine and the number[m
[31m- *	being converted.  If long long is available and the name is[m
[31m- *	something other than "long long", #define Llong to be the name,[m
[31m- *	and if "unsigned Llong" does not work as an unsigned version of[m
[31m- *	Llong, #define #ULLong to be the corresponding unsigned type.[m
[31m- * #define KR_headers for old-style C function headers.[m
[31m- * #define Bad_float_h if your system lacks a float.h or if it does not[m
[31m- *	define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,[m
[31m- *	FLT_RADIX, FLT_ROUNDS, and DBL_MAX.[m
[31m- * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)[m
[31m- *	if memory is available and otherwise does something you deem[m
[31m- *	appropriate.  If MALLOC is undefined, malloc will be invoked[m
[31m- *	directly -- and assumed always to succeed.  Similarly, if you[m
[31m- *	want something other than the system's free() to be called to[m
[31m- *	recycle memory acquired from MALLOC, #define FREE to be the[m
[31m- *	name of the alternate routine.  (FREE or free is only called in[m
[31m- *	pathological cases, e.g., in a dtoa call after a dtoa return in[m
[31m- *	mode 3 with thousands of digits requested.)[m
[31m- * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making[m
[31m- *	memory allocations from a private pool of memory when possible.[m
[31m- *	When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,[m
[31m- *	unless #defined to be a different length.  This default length[m
[31m- *	suffices to get rid of MALLOC calls except for unusual cases,[m
[31m- *	such as decimal-to-binary conversion of a very long string of[m
[31m- *	digits.  The longest string dtoa can return is about 751 bytes[m
[31m- *	long.  For conversions by strtod of strings of 800 digits and[m
[31m- *	all dtoa conversions in single-threaded executions with 8-byte[m
[31m- *	pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte[m
[31m- *	pointers, PRIVATE_MEM >= 7112 appears adequate.[m
[31m- * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK[m
[31m- *	#defined automatically on IEEE systems.  On such systems,[m
[31m- *	when INFNAN_CHECK is #defined, strtod checks[m
[31m- *	for Infinity and NaN (case insensitively).  On some systems[m
[31m- *	(e.g., some HP systems), it may be necessary to #define NAN_WORD0[m
[31m- *	appropriately -- to the most significant word of a quiet NaN.[m
[31m- *	(On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)[m
[31m- *	When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,[m
[31m- *	strtod also accepts (case insensitively) strings of the form[m
[31m- *	NaN(x), where x is a string of hexadecimal digits and spaces;[m
[31m- *	if there is only one string of hexadecimal digits, it is taken[m
[31m- *	for the 52 fraction bits of the resulting NaN; if there are two[m
[31m- *	or more strings of hex digits, the first is for the high 20 bits,[m
[31m- *	the second and subsequent for the low 32 bits, with intervening[m
[31m- *	white space ignored; but if this results in none of the 52[m
[31m- *	fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0[m
[31m- *	and NAN_WORD1 are used instead.[m
[31m- * #define MULTIPLE_THREADS if the system offers preemptively scheduled[m
[31m- *	multiple threads.  In this case, you must provide (or suitably[m
[31m- *	#define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed[m
[31m- *	by FREE_DTOA_LOCK(n) for n = 0 or 1.  (The second lock, accessed[m
[31m- *	in pow5mult, ensures lazy evaluation of only one copy of high[m
[31m- *	powers of 5; omitting this lock would introduce a small[m
[31m- *	probability of wasting memory, but would otherwise be harmless.)[m
[31m- *	You must also invoke freedtoa(s) to free the value s returned by[m
[31m- *	dtoa.  You may do so whether or not MULTIPLE_THREADS is #defined.[m
[31m- * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that[m
[31m- *	avoids underflows on inputs whose result does not underflow.[m
[31m- *	If you #define NO_IEEE_Scale on a machine that uses IEEE-format[m
[31m- *	floating-point numbers and flushes underflows to zero rather[m
[31m- *	than implementing gradual underflow, then you must also #define[m
[31m- *	Sudden_Underflow.[m
[31m- * #define USE_LOCALE to use the current locale's decimal_point value.[m
[31m- * #define SET_INEXACT if IEEE arithmetic is being used and extra[m
[31m- *	computation should be done to set the inexact flag when the[m
[31m- *	result is inexact and avoid setting inexact when the result[m
[31m- *	is exact.  In this case, dtoa.c must be compiled in[m
[31m- *	an environment, perhaps provided by #include "dtoa.c" in a[m
[31m- *	suitable wrapper, that defines two functions,[m
[31m- *		int get_inexact(void);[m
[31m- *		void clear_inexact(void);[m
[31m- *	such that get_inexact() returns a nonzero value if the[m
[31m- *	inexact bit is already set, and clear_inexact() sets the[m
[31m- *	inexact bit to 0.  When SET_INEXACT is #defined, strtod[m
[31m- *	also does extra computations to set the underflow and overflow[m
[31m- *	flags when appropriate (i.e., when the result is tiny and[m
[31m- *	inexact or when it is a numeric value rounded to +-infinity).[m
[31m- * #define NO_ERRNO if strtod should not assign errno = ERANGE when[m
[31m- *	the result overflows to +-Infinity or underflows to 0.[m
[31m- * #define NO_HEX_FP to omit recognition of hexadecimal floating-point[m
[31m- *	values by strtod.[m
[31m- * #define NO_STRTOD_BIGCOMP (on IEEE-arithmetic systems only for now)[m
[31m- *	to disable logic for "fast" testing of very long input strings[m
[31m- *	to strtod.  This testing proceeds by initially truncating the[m
[31m- *	input string, then if necessary comparing the whole string with[m
[31m- *	a decimal expansion to decide close cases. This logic is only[m
[31m- *	used for input more than STRTOD_DIGLIM digits long (default 40).[m
[31m- */[m
[31m-[m
[31m-#include "dtoa_config.h"[m
[31m-[m
[31m-#ifndef Long[m
[31m-#define Long long[m
[31m-#endif[m
[31m-#ifndef ULong[m
[31m-typedef unsigned Long ULong;[m
[31m-#endif[m
[31m-[m
[31m-#ifdef DEBUG[m
[31m-#include "stdio.h"[m
[31m-#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}[m
[31m-#endif[m
[31m-[m
[31m-#include "stdlib.h"[m
[31m-#include "string.h"[m
[31m-[m
[31m-#ifdef USE_LOCALE[m
[31m-#include "locale.h"[m
[31m-#endif[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-#ifndef Trust_FLT_ROUNDS[m
[31m-#include <fenv.h>[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifdef MALLOC[m
[31m-#ifdef KR_headers[m
[31m-extern char *MALLOC();[m
[31m-#else[m
[31m-extern void *MALLOC(size_t);[m
[31m-#endif[m
[31m-#else[m
[31m-#define MALLOC malloc[m
[31m-#endif[m
[31m-[m
[31m-#ifndef Omit_Private_Memory[m
[31m-#ifndef PRIVATE_MEM[m
[31m-#define PRIVATE_MEM 2304[m
[31m-#endif[m
[31m-#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))[m
[31m-static double private_mem[PRIVATE_mem], *pmem_next = private_mem;[m
[31m-#endif[m
[31m-[m
[31m-#undef IEEE_Arith[m
[31m-#undef Avoid_Underflow[m
[31m-#ifdef IEEE_MC68k[m
[31m-#define IEEE_Arith[m
[31m-#endif[m
[31m-#ifdef IEEE_8087[m
[31m-#define IEEE_Arith[m
[31m-#endif[m
[31m-[m
[31m-#ifdef IEEE_Arith[m
[31m-#ifndef NO_INFNAN_CHECK[m
[31m-#undef INFNAN_CHECK[m
[31m-#define INFNAN_CHECK[m
[31m-#endif[m
[31m-#else[m
[31m-#undef INFNAN_CHECK[m
[31m-#define NO_STRTOD_BIGCOMP[m
[31m-#endif[m
[31m-[m
[31m-#include "errno.h"[m
[31m-[m
[31m-#ifdef Bad_float_h[m
[31m-[m
[31m-#ifdef IEEE_Arith[m
[31m-#define DBL_DIG 15[m
[31m-#define DBL_MAX_10_EXP 308[m
[31m-#define DBL_MAX_EXP 1024[m
[31m-#define FLT_RADIX 2[m
[31m-#endif /*IEEE_Arith*/[m
[31m-[m
[31m-#ifdef IBM[m
[31m-#define DBL_DIG 16[m
[31m-#define DBL_MAX_10_EXP 75[m
[31m-#define DBL_MAX_EXP 63[m
[31m-#define FLT_RADIX 16[m
[31m-#define DBL_MAX 7.2370055773322621e+75[m
[31m-#endif[m
[31m-[m
[31m-#ifdef VAX[m
[31m-#define DBL_DIG 16[m
[31m-#define DBL_MAX_10_EXP 38[m
[31m-#define DBL_MAX_EXP 127[m
[31m-#define FLT_RADIX 2[m
[31m-#define DBL_MAX 1.7014118346046923e+38[m
[31m-#endif[m
[31m-[m
[31m-#ifndef LONG_MAX[m
[31m-#define LONG_MAX 2147483647[m
[31m-#endif[m
[31m-[m
[31m-#else /* ifndef Bad_float_h */[m
[31m-#include "float.h"[m
[31m-#endif /* Bad_float_h */[m
[31m-[m
[31m-#ifndef __MATH_H__[m
[31m-#include "math.h"[m
[31m-#endif[m
[31m-[m
[31m-#ifdef __cplusplus[m
[31m-extern "C" {[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CONST[m
[31m-#ifdef KR_headers[m
[31m-#define CONST /* blank */[m
[31m-#else[m
[31m-#define CONST const[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1[m
[31m-Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.[m
[31m-#endif[m
[31m-[m
[31m-typedef union { double d; ULong L[2]; } U;[m
[31m-[m
[31m-#ifdef IEEE_8087[m
[31m-#define word0(x) (x)->L[1][m
[31m-#define word1(x) (x)->L[0][m
[31m-#else[m
[31m-#define word0(x) (x)->L[0][m
[31m-#define word1(x) (x)->L[1][m
[31m-#endif[m
[31m-#define dval(x) (x)->d[m
[31m-[m
[31m-#ifndef STRTOD_DIGLIM[m
[31m-#define STRTOD_DIGLIM 40[m
[31m-#endif[m
[31m-[m
[31m-#ifdef DIGLIM_DEBUG[m
[31m-extern int strtod_diglim;[m
[31m-#else[m
[31m-#define strtod_diglim STRTOD_DIGLIM[m
[31m-#endif[m
[31m-[m
[31m-/* The following definition of Storeinc is appropriate for MIPS processors.[m
[31m- * An alternative that might be better on some machines is[m
[31m- * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)[m
[31m- */[m
[31m-#if defined(IEEE_8087) + defined(VAX)[m
[31m-#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \[m
[31m-((unsigned short *)a)[0] = (unsigned short)c, a++)[m
[31m-#else[m
[31m-#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \[m
[31m-((unsigned short *)a)[1] = (unsigned short)c, a++)[m
[31m-#endif[m
[31m-[m
[31m-/* #define P DBL_MANT_DIG */[m
[31m-/* Ten_pmax = floor(P*log(2)/log(5)) */[m
[31m-/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */[m
[31m-/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */[m
[31m-/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */[m
[31m-[m
[31m-#ifdef IEEE_Arith[m
[31m-#define Exp_shift  20[m
[31m-#define Exp_shift1 20[m
[31m-#define Exp_msk1    0x100000[m
[31m-#define Exp_msk11   0x100000[m
[31m-#define Exp_mask  0x7ff00000[m
[31m-#define P 53[m
[31m-#define Nbits 53[m
[31m-#define Bias 1023[m
[31m-#define Emax 1023[m
[31m-#define Emin (-1022)[m
[31m-#define Exp_1  0x3ff00000[m
[31m-#define Exp_11 0x3ff00000[m
[31m-#define Ebits 11[m
[31m-#define Frac_mask  0xfffff[m
[31m-#define Frac_mask1 0xfffff[m
[31m-#define Ten_pmax 22[m
[31m-#define Bletch 0x10[m
[31m-#define Bndry_mask  0xfffff[m
[31m-#define Bndry_mask1 0xfffff[m
[31m-#define LSB 1[m
[31m-#define Sign_bit 0x80000000[m
[31m-#define Log2P 1[m
[31m-#define Tiny0 0[m
[31m-#define Tiny1 1[m
[31m-#define Quick_max 14[m
[31m-#define Int_max 14[m
[31m-#ifndef NO_IEEE_Scale[m
[31m-#define Avoid_Underflow[m
[31m-#ifdef Flush_Denorm	/* debugging option */[m
[31m-#undef Sudden_Underflow[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifndef Flt_Rounds[m
[31m-#ifdef FLT_ROUNDS[m
[31m-#define Flt_Rounds FLT_ROUNDS[m
[31m-#else[m
[31m-#define Flt_Rounds 1[m
[31m-#endif[m
[31m-#endif /*Flt_Rounds*/[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-#undef Check_FLT_ROUNDS[m
[31m-#define Check_FLT_ROUNDS[m
[31m-#else[m
[31m-#define Rounding Flt_Rounds[m
[31m-#endif[m
[31m-[m
[31m-#else /* ifndef IEEE_Arith */[m
[31m-#undef Check_FLT_ROUNDS[m
[31m-#undef Honor_FLT_ROUNDS[m
[31m-#undef SET_INEXACT[m
[31m-#undef  Sudden_Underflow[m
[31m-#define Sudden_Underflow[m
[31m-#ifdef IBM[m
[31m-#undef Flt_Rounds[m
[31m-#define Flt_Rounds 0[m
[31m-#define Exp_shift  24[m
[31m-#define Exp_shift1 24[m
[31m-#define Exp_msk1   0x1000000[m
[31m-#define Exp_msk11  0x1000000[m
[31m-#define Exp_mask  0x7f000000[m
[31m-#define P 14[m
[31m-#define Nbits 56[m
[31m-#define Bias 65[m
[31m-#define Emax 248[m
[31m-#define Emin (-260)[m
[31m-#define Exp_1  0x41000000[m
[31m-#define Exp_11 0x41000000[m
[31m-#define Ebits 8	/* exponent has 7 bits, but 8 is the right value in b2d */[m
[31m-#define Frac_mask  0xffffff[m
[31m-#define Frac_mask1 0xffffff[m
[31m-#define Bletch 4[m
[31m-#define Ten_pmax 22[m
[31m-#define Bndry_mask  0xefffff[m
[31m-#define Bndry_mask1 0xffffff[m
[31m-#define LSB 1[m
[31m-#define Sign_bit 0x80000000[m
[31m-#define Log2P 4[m
[31m-#define Tiny0 0x100000[m
[31m-#define Tiny1 0[m
[31m-#define Quick_max 14[m
[31m-#define Int_max 15[m
[31m-#else /* VAX */[m
[31m-#undef Flt_Rounds[m
[31m-#define Flt_Rounds 1[m
[31m-#define Exp_shift  23[m
[31m-#define Exp_shift1 7[m
[31m-#define Exp_msk1    0x80[m
[31m-#define Exp_msk11   0x800000[m
[31m-#define Exp_mask  0x7f80[m
[31m-#define P 56[m
[31m-#define Nbits 56[m
[31m-#define Bias 129[m
[31m-#define Emax 126[m
[31m-#define Emin (-129)[m
[31m-#define Exp_1  0x40800000[m
[31m-#define Exp_11 0x4080[m
[31m-#define Ebits 8[m
[31m-#define Frac_mask  0x7fffff[m
[31m-#define Frac_mask1 0xffff007f[m
[31m-#define Ten_pmax 24[m
[31m-#define Bletch 2[m
[31m-#define Bndry_mask  0xffff007f[m
[31m-#define Bndry_mask1 0xffff007f[m
[31m-#define LSB 0x10000[m
[31m-#define Sign_bit 0x8000[m
[31m-#define Log2P 1[m
[31m-#define Tiny0 0x80[m
[31m-#define Tiny1 0[m
[31m-#define Quick_max 15[m
[31m-#define Int_max 15[m
[31m-#endif /* IBM, VAX */[m
[31m-#endif /* IEEE_Arith */[m
[31m-[m
[31m-#ifndef IEEE_Arith[m
[31m-#define ROUND_BIASED[m
[31m-#else[m
[31m-#ifdef ROUND_BIASED_without_Round_Up[m
[31m-#undef  ROUND_BIASED[m
[31m-#define ROUND_BIASED[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifdef RND_PRODQUOT[m
[31m-#define rounded_product(a,b) a = rnd_prod(a, b)[m
[31m-#define rounded_quotient(a,b) a = rnd_quot(a, b)[m
[31m-#ifdef KR_headers[m
[31m-extern double rnd_prod(), rnd_quot();[m
[31m-#else[m
[31m-extern double rnd_prod(double, double), rnd_quot(double, double);[m
[31m-#endif[m
[31m-#else[m
[31m-#define rounded_product(a,b) a *= b[m
[31m-#define rounded_quotient(a,b) a /= b[m
[31m-#endif[m
[31m-[m
[31m-#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))[m
[31m-#define Big1 0xffffffff[m
[31m-[m
[31m-#ifndef Pack_32[m
[31m-#define Pack_32[m
[31m-#endif[m
[31m-[m
[31m-typedef struct BCinfo BCinfo;[m
[31m- struct[m
[31m-BCinfo { int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflchk; };[m
[31m-[m
[31m-#ifdef KR_headers[m
[31m-#define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff)[m
[31m-#else[m
[31m-#define FFFFFFFF 0xffffffffUL[m
[31m-#endif[m
[31m-[m
[31m-#ifdef NO_LONG_LONG[m
[31m-#undef ULLong[m
[31m-#ifdef Just_16[m
[31m-#undef Pack_32[m
[31m-/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.[m
[31m- * This makes some inner loops simpler and sometimes saves work[m
[31m- * during multiplications, but it often seems to make things slightly[m
[31m- * slower.  Hence the default is now to store 32 bits per Long.[m
[31m- */[m
[31m-#endif[m
[31m-#else	/* long long available */[m
[31m-#ifndef Llong[m
[31m-#define Llong long long[m
[31m-#endif[m
[31m-#ifndef ULLong[m
[31m-#define ULLong unsigned Llong[m
[31m-#endif[m
[31m-#endif /* NO_LONG_LONG */[m
[31m-[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m-#define ACQUIRE_DTOA_LOCK(n)	/*nothing*/[m
[31m-#define FREE_DTOA_LOCK(n)	/*nothing*/[m
[31m-#endif[m
[31m-[m
[31m-#define Kmax 7[m
[31m-[m
[31m-#ifdef __cplusplus[m
[31m-extern "C" double fpconv_strtod(const char *s00, char **se);[m
[31m-extern "C" char *dtoa(double d, int mode, int ndigits,[m
[31m-			int *decpt, int *sign, char **rve);[m
[31m-#endif[m
[31m-[m
[31m- struct[m
[31m-Bigint {[m
[31m-	struct Bigint *next;[m
[31m-	int k, maxwds, sign, wds;[m
[31m-	ULong x[1];[m
[31m-	};[m
[31m-[m
[31m- typedef struct Bigint Bigint;[m
[31m-[m
[31m- static Bigint *freelist[Kmax+1];[m
[31m-[m
[31m- static Bigint *[m
[31m-Balloc[m
[31m-#ifdef KR_headers[m
[31m-	(k) int k;[m
[31m-#else[m
[31m-	(int k)[m
[31m-#endif[m
[31m-{[m
[31m-	int x;[m
[31m-	Bigint *rv;[m
[31m-#ifndef Omit_Private_Memory[m
[31m-	unsigned int len;[m
[31m-#endif[m
[31m-[m
[31m-	ACQUIRE_DTOA_LOCK(0);[m
[31m-	/* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */[m
[31m-	/* but this case seems very unlikely. */[m
[31m-	if (k <= Kmax && (rv = freelist[k]))[m
[31m-		freelist[k] = rv->next;[m
[31m-	else {[m
[31m-		x = 1 << k;[m
[31m-#ifdef Omit_Private_Memory[m
[31m-		rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));[m
[31m-#else[m
[31m-		len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)[m
[31m-			/sizeof(double);[m
[31m-		if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {[m
[31m-			rv = (Bigint*)pmem_next;[m
[31m-			pmem_next += len;[m
[31m-			}[m
[31m-		else[m
[31m-			rv = (Bigint*)MALLOC(len*sizeof(double));[m
[31m-#endif[m
[31m-		rv->k = k;[m
[31m-		rv->maxwds = x;[m
[31m-		}[m
[31m-	FREE_DTOA_LOCK(0);[m
[31m-	rv->sign = rv->wds = 0;[m
[31m-	return rv;[m
[31m-	}[m
[31m-[m
[31m- static void[m
[31m-Bfree[m
[31m-#ifdef KR_headers[m
[31m-	(v) Bigint *v;[m
[31m-#else[m
[31m-	(Bigint *v)[m
[31m-#endif[m
[31m-{[m
[31m-	if (v) {[m
[31m-		if (v->k > Kmax)[m
[31m-#ifdef FREE[m
[31m-			FREE((void*)v);[m
[31m-#else[m
[31m-			free((void*)v);[m
[31m-#endif[m
[31m-		else {[m
[31m-			ACQUIRE_DTOA_LOCK(0);[m
[31m-			v->next = freelist[v->k];[m
[31m-			freelist[v->k] = v;[m
[31m-			FREE_DTOA_LOCK(0);[m
[31m-			}[m
[31m-		}[m
[31m-	}[m
[31m-[m
[31m-#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \[m
[31m-y->wds*sizeof(Long) + 2*sizeof(int))[m
[31m-[m
[31m- static Bigint *[m
[31m-multadd[m
[31m-#ifdef KR_headers[m
[31m-	(b, m, a) Bigint *b; int m, a;[m
[31m-#else[m
[31m-	(Bigint *b, int m, int a)	/* multiply by m and add a */[m
[31m-#endif[m
[31m-{[m
[31m-	int i, wds;[m
[31m-#ifdef ULLong[m
[31m-	ULong *x;[m
[31m-	ULLong carry, y;[m
[31m-#else[m
[31m-	ULong carry, *x, y;[m
[31m-#ifdef Pack_32[m
[31m-	ULong xi, z;[m
[31m-#endif[m
[31m-#endif[m
[31m-	Bigint *b1;[m
[31m-[m
[31m-	wds = b->wds;[m
[31m-	x = b->x;[m
[31m-	i = 0;[m
[31m-	carry = a;[m
[31m-	do {[m
[31m-#ifdef ULLong[m
[31m-		y = *x * (ULLong)m + carry;[m
[31m-		carry = y >> 32;[m
[31m-		*x++ = y & FFFFFFFF;[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-		xi = *x;[m
[31m-		y = (xi & 0xffff) * m + carry;[m
[31m-		z = (xi >> 16) * m + (y >> 16);[m
[31m-		carry = z >> 16;[m
[31m-		*x++ = (z << 16) + (y & 0xffff);[m
[31m-#else[m
[31m-		y = *x * m + carry;[m
[31m-		carry = y >> 16;[m
[31m-		*x++ = y & 0xffff;[m
[31m-#endif[m
[31m-#endif[m
[31m-		}[m
[31m-		while(++i < wds);[m
[31m-	if (carry) {[m
[31m-		if (wds >= b->maxwds) {[m
[31m-			b1 = Balloc(b->k+1);[m
[31m-			Bcopy(b1, b);[m
[31m-			Bfree(b);[m
[31m-			b = b1;[m
[31m-			}[m
[31m-		b->x[wds++] = carry;[m
[31m-		b->wds = wds;[m
[31m-		}[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-s2b[m
[31m-#ifdef KR_headers[m
[31m-	(s, nd0, nd, y9, dplen) CONST char *s; int nd0, nd, dplen; ULong y9;[m
[31m-#else[m
[31m-	(const char *s, int nd0, int nd, ULong y9, int dplen)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b;[m
[31m-	int i, k;[m
[31m-	Long x, y;[m
[31m-[m
[31m-	x = (nd + 8) / 9;[m
[31m-	for(k = 0, y = 1; x > y; y <<= 1, k++) ;[m
[31m-#ifdef Pack_32[m
[31m-	b = Balloc(k);[m
[31m-	b->x[0] = y9;[m
[31m-	b->wds = 1;[m
[31m-#else[m
[31m-	b = Balloc(k+1);[m
[31m-	b->x[0] = y9 & 0xffff;[m
[31m-	b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;[m
[31m-#endif[m
[31m-[m
[31m-	i = 9;[m
[31m-	if (9 < nd0) {[m
[31m-		s += 9;[m
[31m-		do b = multadd(b, 10, *s++ - '0');[m
[31m-			while(++i < nd0);[m
[31m-		s += dplen;[m
[31m-		}[m
[31m-	else[m
[31m-		s += dplen + 9;[m
[31m-	for(; i < nd; i++)[m
[31m-		b = multadd(b, 10, *s++ - '0');[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m- static int[m
[31m-hi0bits[m
[31m-#ifdef KR_headers[m
[31m-	(x) ULong x;[m
[31m-#else[m
[31m-	(ULong x)[m
[31m-#endif[m
[31m-{[m
[31m-	int k = 0;[m
[31m-[m
[31m-	if (!(x & 0xffff0000)) {[m
[31m-		k = 16;[m
[31m-		x <<= 16;[m
[31m-		}[m
[31m-	if (!(x & 0xff000000)) {[m
[31m-		k += 8;[m
[31m-		x <<= 8;[m
[31m-		}[m
[31m-	if (!(x & 0xf0000000)) {[m
[31m-		k += 4;[m
[31m-		x <<= 4;[m
[31m-		}[m
[31m-	if (!(x & 0xc0000000)) {[m
[31m-		k += 2;[m
[31m-		x <<= 2;[m
[31m-		}[m
[31m-	if (!(x & 0x80000000)) {[m
[31m-		k++;[m
[31m-		if (!(x & 0x40000000))[m
[31m-			return 32;[m
[31m-		}[m
[31m-	return k;[m
[31m-	}[m
[31m-[m
[31m- static int[m
[31m-lo0bits[m
[31m-#ifdef KR_headers[m
[31m-	(y) ULong *y;[m
[31m-#else[m
[31m-	(ULong *y)[m
[31m-#endif[m
[31m-{[m
[31m-	int k;[m
[31m-	ULong x = *y;[m
[31m-[m
[31m-	if (x & 7) {[m
[31m-		if (x & 1)[m
[31m-			return 0;[m
[31m-		if (x & 2) {[m
[31m-			*y = x >> 1;[m
[31m-			return 1;[m
[31m-			}[m
[31m-		*y = x >> 2;[m
[31m-		return 2;[m
[31m-		}[m
[31m-	k = 0;[m
[31m-	if (!(x & 0xffff)) {[m
[31m-		k = 16;[m
[31m-		x >>= 16;[m
[31m-		}[m
[31m-	if (!(x & 0xff)) {[m
[31m-		k += 8;[m
[31m-		x >>= 8;[m
[31m-		}[m
[31m-	if (!(x & 0xf)) {[m
[31m-		k += 4;[m
[31m-		x >>= 4;[m
[31m-		}[m
[31m-	if (!(x & 0x3)) {[m
[31m-		k += 2;[m
[31m-		x >>= 2;[m
[31m-		}[m
[31m-	if (!(x & 1)) {[m
[31m-		k++;[m
[31m-		x >>= 1;[m
[31m-		if (!x)[m
[31m-			return 32;[m
[31m-		}[m
[31m-	*y = x;[m
[31m-	return k;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-i2b[m
[31m-#ifdef KR_headers[m
[31m-	(i) int i;[m
[31m-#else[m
[31m-	(int i)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b;[m
[31m-[m
[31m-	b = Balloc(1);[m
[31m-	b->x[0] = i;[m
[31m-	b->wds = 1;[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-mult[m
[31m-#ifdef KR_headers[m
[31m-	(a, b) Bigint *a, *b;[m
[31m-#else[m
[31m-	(Bigint *a, Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *c;[m
[31m-	int k, wa, wb, wc;[m
[31m-	ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;[m
[31m-	ULong y;[m
[31m-#ifdef ULLong[m
[31m-	ULLong carry, z;[m
[31m-#else[m
[31m-	ULong carry, z;[m
[31m-#ifdef Pack_32[m
[31m-	ULong z2;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-	if (a->wds < b->wds) {[m
[31m-		c = a;[m
[31m-		a = b;[m
[31m-		b = c;[m
[31m-		}[m
[31m-	k = a->k;[m
[31m-	wa = a->wds;[m
[31m-	wb = b->wds;[m
[31m-	wc = wa + wb;[m
[31m-	if (wc > a->maxwds)[m
[31m-		k++;[m
[31m-	c = Balloc(k);[m
[31m-	for(x = c->x, xa = x + wc; x < xa; x++)[m
[31m-		*x = 0;[m
[31m-	xa = a->x;[m
[31m-	xae = xa + wa;[m
[31m-	xb = b->x;[m
[31m-	xbe = xb + wb;[m
[31m-	xc0 = c->x;[m
[31m-#ifdef ULLong[m
[31m-	for(; xb < xbe; xc0++) {[m
[31m-		if ((y = *xb++)) {[m
[31m-			x = xa;[m
[31m-			xc = xc0;[m
[31m-			carry = 0;[m
[31m-			do {[m
[31m-				z = *x++ * (ULLong)y + *xc + carry;[m
[31m-				carry = z >> 32;[m
[31m-				*xc++ = z & FFFFFFFF;[m
[31m-				}[m
[31m-				while(x < xae);[m
[31m-			*xc = carry;[m
[31m-			}[m
[31m-		}[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-	for(; xb < xbe; xb++, xc0++) {[m
[31m-		if (y = *xb & 0xffff) {[m
[31m-			x = xa;[m
[31m-			xc = xc0;[m
[31m-			carry = 0;[m
[31m-			do {[m
[31m-				z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;[m
[31m-				carry = z >> 16;[m
[31m-				z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;[m
[31m-				carry = z2 >> 16;[m
[31m-				Storeinc(xc, z2, z);[m
[31m-				}[m
[31m-				while(x < xae);[m
[31m-			*xc = carry;[m
[31m-			}[m
[31m-		if (y = *xb >> 16) {[m
[31m-			x = xa;[m
[31m-			xc = xc0;[m
[31m-			carry = 0;[m
[31m-			z2 = *xc;[m
[31m-			do {[m
[31m-				z = (*x & 0xffff) * y + (*xc >> 16) + carry;[m
[31m-				carry = z >> 16;[m
[31m-				Storeinc(xc, z, z2);[m
[31m-				z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;[m
[31m-				carry = z2 >> 16;[m
[31m-				}[m
[31m-				while(x < xae);[m
[31m-			*xc = z2;[m
[31m-			}[m
[31m-		}[m
[31m-#else[m
[31m-	for(; xb < xbe; xc0++) {[m
[31m-		if (y = *xb++) {[m
[31m-			x = xa;[m
[31m-			xc = xc0;[m
[31m-			carry = 0;[m
[31m-			do {[m
[31m-				z = *x++ * y + *xc + carry;[m
[31m-				carry = z >> 16;[m
[31m-				*xc++ = z & 0xffff;[m
[31m-				}[m
[31m-				while(x < xae);[m
[31m-			*xc = carry;[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m-#endif[m
[31m-	for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;[m
[31m-	c->wds = wc;[m
[31m-	return c;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *p5s;[m
[31m-[m
[31m- static Bigint *[m
[31m-pow5mult[m
[31m-#ifdef KR_headers[m
[31m-	(b, k) Bigint *b; int k;[m
[31m-#else[m
[31m-	(Bigint *b, int k)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b1, *p5, *p51;[m
[31m-	int i;[m
[31m-	static int p05[3] = { 5, 25, 125 };[m
[31m-[m
[31m-	if ((i = k & 3))[m
[31m-		b = multadd(b, p05[i-1], 0);[m
[31m-[m
[31m-	if (!(k >>= 2))[m
[31m-		return b;[m
[31m-	if (!(p5 = p5s)) {[m
[31m-		/* first time */[m
[31m-#ifdef MULTIPLE_THREADS[m
[31m-		ACQUIRE_DTOA_LOCK(1);[m
[31m-		if (!(p5 = p5s)) {[m
[31m-			p5 = p5s = i2b(625);[m
[31m-			p5->next = 0;[m
[31m-			}[m
[31m-		FREE_DTOA_LOCK(1);[m
[31m-#else[m
[31m-		p5 = p5s = i2b(625);[m
[31m-		p5->next = 0;[m
[31m-#endif[m
[31m-		}[m
[31m-	for(;;) {[m
[31m-		if (k & 1) {[m
[31m-			b1 = mult(b, p5);[m
[31m-			Bfree(b);[m
[31m-			b = b1;[m
[31m-			}[m
[31m-		if (!(k >>= 1))[m
[31m-			break;[m
[31m-		if (!(p51 = p5->next)) {[m
[31m-#ifdef MULTIPLE_THREADS[m
[31m-			ACQUIRE_DTOA_LOCK(1);[m
[31m-			if (!(p51 = p5->next)) {[m
[31m-				p51 = p5->next = mult(p5,p5);[m
[31m-				p51->next = 0;[m
[31m-				}[m
[31m-			FREE_DTOA_LOCK(1);[m
[31m-#else[m
[31m-			p51 = p5->next = mult(p5,p5);[m
[31m-			p51->next = 0;[m
[31m-#endif[m
[31m-			}[m
[31m-		p5 = p51;[m
[31m-		}[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-lshift[m
[31m-#ifdef KR_headers[m
[31m-	(b, k) Bigint *b; int k;[m
[31m-#else[m
[31m-	(Bigint *b, int k)[m
[31m-#endif[m
[31m-{[m
[31m-	int i, k1, n, n1;[m
[31m-	Bigint *b1;[m
[31m-	ULong *x, *x1, *xe, z;[m
[31m-[m
[31m-#ifdef Pack_32[m
[31m-	n = k >> 5;[m
[31m-#else[m
[31m-	n = k >> 4;[m
[31m-#endif[m
[31m-	k1 = b->k;[m
[31m-	n1 = n + b->wds + 1;[m
[31m-	for(i = b->maxwds; n1 > i; i <<= 1)[m
[31m-		k1++;[m
[31m-	b1 = Balloc(k1);[m
[31m-	x1 = b1->x;[m
[31m-	for(i = 0; i < n; i++)[m
[31m-		*x1++ = 0;[m
[31m-	x = b->x;[m
[31m-	xe = x + b->wds;[m
[31m-#ifdef Pack_32[m
[31m-	if (k &= 0x1f) {[m
[31m-		k1 = 32 - k;[m
[31m-		z = 0;[m
[31m-		do {[m
[31m-			*x1++ = *x << k | z;[m
[31m-			z = *x++ >> k1;[m
[31m-			}[m
[31m-			while(x < xe);[m
[31m-		if ((*x1 = z))[m
[31m-			++n1;[m
[31m-		}[m
[31m-#else[m
[31m-	if (k &= 0xf) {[m
[31m-		k1 = 16 - k;[m
[31m-		z = 0;[m
[31m-		do {[m
[31m-			*x1++ = *x << k  & 0xffff | z;[m
[31m-			z = *x++ >> k1;[m
[31m-			}[m
[31m-			while(x < xe);[m
[31m-		if (*x1 = z)[m
[31m-			++n1;[m
[31m-		}[m
[31m-#endif[m
[31m-	else do[m
[31m-		*x1++ = *x++;[m
[31m-		while(x < xe);[m
[31m-	b1->wds = n1 - 1;[m
[31m-	Bfree(b);[m
[31m-	return b1;[m
[31m-	}[m
[31m-[m
[31m- static int[m
[31m-cmp[m
[31m-#ifdef KR_headers[m
[31m-	(a, b) Bigint *a, *b;[m
[31m-#else[m
[31m-	(Bigint *a, Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong *xa, *xa0, *xb, *xb0;[m
[31m-	int i, j;[m
[31m-[m
[31m-	i = a->wds;[m
[31m-	j = b->wds;[m
[31m-#ifdef DEBUG[m
[31m-	if (i > 1 && !a->x[i-1])[m
[31m-		Bug("cmp called with a->x[a->wds-1] == 0");[m
[31m-	if (j > 1 && !b->x[j-1])[m
[31m-		Bug("cmp called with b->x[b->wds-1] == 0");[m
[31m-#endif[m
[31m-	if (i -= j)[m
[31m-		return i;[m
[31m-	xa0 = a->x;[m
[31m-	xa = xa0 + j;[m
[31m-	xb0 = b->x;[m
[31m-	xb = xb0 + j;[m
[31m-	for(;;) {[m
[31m-		if (*--xa != *--xb)[m
[31m-			return *xa < *xb ? -1 : 1;[m
[31m-		if (xa <= xa0)[m
[31m-			break;[m
[31m-		}[m
[31m-	return 0;[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-diff[m
[31m-#ifdef KR_headers[m
[31m-	(a, b) Bigint *a, *b;[m
[31m-#else[m
[31m-	(Bigint *a, Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *c;[m
[31m-	int i, wa, wb;[m
[31m-	ULong *xa, *xae, *xb, *xbe, *xc;[m
[31m-#ifdef ULLong[m
[31m-	ULLong borrow, y;[m
[31m-#else[m
[31m-	ULong borrow, y;[m
[31m-#ifdef Pack_32[m
[31m-	ULong z;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-	i = cmp(a,b);[m
[31m-	if (!i) {[m
[31m-		c = Balloc(0);[m
[31m-		c->wds = 1;[m
[31m-		c->x[0] = 0;[m
[31m-		return c;[m
[31m-		}[m
[31m-	if (i < 0) {[m
[31m-		c = a;[m
[31m-		a = b;[m
[31m-		b = c;[m
[31m-		i = 1;[m
[31m-		}[m
[31m-	else[m
[31m-		i = 0;[m
[31m-	c = Balloc(a->k);[m
[31m-	c->sign = i;[m
[31m-	wa = a->wds;[m
[31m-	xa = a->x;[m
[31m-	xae = xa + wa;[m
[31m-	wb = b->wds;[m
[31m-	xb = b->x;[m
[31m-	xbe = xb + wb;[m
[31m-	xc = c->x;[m
[31m-	borrow = 0;[m
[31m-#ifdef ULLong[m
[31m-	do {[m
[31m-		y = (ULLong)*xa++ - *xb++ - borrow;[m
[31m-		borrow = y >> 32 & (ULong)1;[m
[31m-		*xc++ = y & FFFFFFFF;[m
[31m-		}[m
[31m-		while(xb < xbe);[m
[31m-	while(xa < xae) {[m
[31m-		y = *xa++ - borrow;[m
[31m-		borrow = y >> 32 & (ULong)1;[m
[31m-		*xc++ = y & FFFFFFFF;[m
[31m-		}[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-	do {[m
[31m-		y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;[m
[31m-		borrow = (y & 0x10000) >> 16;[m
[31m-		z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;[m
[31m-		borrow = (z & 0x10000) >> 16;[m
[31m-		Storeinc(xc, z, y);[m
[31m-		}[m
[31m-		while(xb < xbe);[m
[31m-	while(xa < xae) {[m
[31m-		y = (*xa & 0xffff) - borrow;[m
[31m-		borrow = (y & 0x10000) >> 16;[m
[31m-		z = (*xa++ >> 16) - borrow;[m
[31m-		borrow = (z & 0x10000) >> 16;[m
[31m-		Storeinc(xc, z, y);[m
[31m-		}[m
[31m-#else[m
[31m-	do {[m
[31m-		y = *xa++ - *xb++ - borrow;[m
[31m-		borrow = (y & 0x10000) >> 16;[m
[31m-		*xc++ = y & 0xffff;[m
[31m-		}[m
[31m-		while(xb < xbe);[m
[31m-	while(xa < xae) {[m
[31m-		y = *xa++ - borrow;[m
[31m-		borrow = (y & 0x10000) >> 16;[m
[31m-		*xc++ = y & 0xffff;[m
[31m-		}[m
[31m-#endif[m
[31m-#endif[m
[31m-	while(!*--xc)[m
[31m-		wa--;[m
[31m-	c->wds = wa;[m
[31m-	return c;[m
[31m-	}[m
[31m-[m
[31m- static double[m
[31m-ulp[m
[31m-#ifdef KR_headers[m
[31m-	(x) U *x;[m
[31m-#else[m
[31m-	(U *x)[m
[31m-#endif[m
[31m-{[m
[31m-	Long L;[m
[31m-	U u;[m
[31m-[m
[31m-	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;[m
[31m-#ifndef Avoid_Underflow[m
[31m-#ifndef Sudden_Underflow[m
[31m-	if (L > 0) {[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-		L |= Exp_msk1 >> 4;[m
[31m-#endif[m
[31m-		word0(&u) = L;[m
[31m-		word1(&u) = 0;[m
[31m-#ifndef Avoid_Underflow[m
[31m-#ifndef Sudden_Underflow[m
[31m-		}[m
[31m-	else {[m
[31m-		L = -L >> Exp_shift;[m
[31m-		if (L < Exp_shift) {[m
[31m-			word0(&u) = 0x80000 >> L;[m
[31m-			word1(&u) = 0;[m
[31m-			}[m
[31m-		else {[m
[31m-			word0(&u) = 0;[m
[31m-			L -= Exp_shift;[m
[31m-			word1(&u) = L >= 31 ? 1 : 1 << 31 - L;[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m-#endif[m
[31m-	return dval(&u);[m
[31m-	}[m
[31m-[m
[31m- static double[m
[31m-b2d[m
[31m-#ifdef KR_headers[m
[31m-	(a, e) Bigint *a; int *e;[m
[31m-#else[m
[31m-	(Bigint *a, int *e)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong *xa, *xa0, w, y, z;[m
[31m-	int k;[m
[31m-	U d;[m
[31m-#ifdef VAX[m
[31m-	ULong d0, d1;[m
[31m-#else[m
[31m-#define d0 word0(&d)[m
[31m-#define d1 word1(&d)[m
[31m-#endif[m
[31m-[m
[31m-	xa0 = a->x;[m
[31m-	xa = xa0 + a->wds;[m
[31m-	y = *--xa;[m
[31m-#ifdef DEBUG[m
[31m-	if (!y) Bug("zero y in b2d");[m
[31m-#endif[m
[31m-	k = hi0bits(y);[m
[31m-	*e = 32 - k;[m
[31m-#ifdef Pack_32[m
[31m-	if (k < Ebits) {[m
[31m-		d0 = Exp_1 | y >> (Ebits - k);[m
[31m-		w = xa > xa0 ? *--xa : 0;[m
[31m-		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);[m
[31m-		goto ret_d;[m
[31m-		}[m
[31m-	z = xa > xa0 ? *--xa : 0;[m
[31m-	if (k -= Ebits) {[m
[31m-		d0 = Exp_1 | y << k | z >> (32 - k);[m
[31m-		y = xa > xa0 ? *--xa : 0;[m
[31m-		d1 = z << k | y >> (32 - k);[m
[31m-		}[m
[31m-	else {[m
[31m-		d0 = Exp_1 | y;[m
[31m-		d1 = z;[m
[31m-		}[m
[31m-#else[m
[31m-	if (k < Ebits + 16) {[m
[31m-		z = xa > xa0 ? *--xa : 0;[m
[31m-		d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;[m
[31m-		w = xa > xa0 ? *--xa : 0;[m
[31m-		y = xa > xa0 ? *--xa : 0;[m
[31m-		d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;[m
[31m-		goto ret_d;[m
[31m-		}[m
[31m-	z = xa > xa0 ? *--xa : 0;[m
[31m-	w = xa > xa0 ? *--xa : 0;[m
[31m-	k -= Ebits + 16;[m
[31m-	d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;[m
[31m-	y = xa > xa0 ? *--xa : 0;[m
[31m-	d1 = w << k + 16 | y << k;[m
[31m-#endif[m
[31m- ret_d:[m
[31m-#ifdef VAX[m
[31m-	word0(&d) = d0 >> 16 | d0 << 16;[m
[31m-	word1(&d) = d1 >> 16 | d1 << 16;[m
[31m-#else[m
[31m-#undef d0[m
[31m-#undef d1[m
[31m-#endif[m
[31m-	return dval(&d);[m
[31m-	}[m
[31m-[m
[31m- static Bigint *[m
[31m-d2b[m
[31m-#ifdef KR_headers[m
[31m-	(d, e, bits) U *d; int *e, *bits;[m
[31m-#else[m
[31m-	(U *d, int *e, int *bits)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b;[m
[31m-	int de, k;[m
[31m-	ULong *x, y, z;[m
[31m-#ifndef Sudden_Underflow[m
[31m-	int i;[m
[31m-#endif[m
[31m-#ifdef VAX[m
[31m-	ULong d0, d1;[m
[31m-	d0 = word0(d) >> 16 | word0(d) << 16;[m
[31m-	d1 = word1(d) >> 16 | word1(d) << 16;[m
[31m-#else[m
[31m-#define d0 word0(d)[m
[31m-#define d1 word1(d)[m
[31m-#endif[m
[31m-[m
[31m-#ifdef Pack_32[m
[31m-	b = Balloc(1);[m
[31m-#else[m
[31m-	b = Balloc(2);[m
[31m-#endif[m
[31m-	x = b->x;[m
[31m-[m
[31m-	z = d0 & Frac_mask;[m
[31m-	d0 &= 0x7fffffff;	/* clear sign bit, which we ignore */[m
[31m-#ifdef Sudden_Underflow[m
[31m-	de = (int)(d0 >> Exp_shift);[m
[31m-#ifndef IBM[m
[31m-	z |= Exp_msk11;[m
[31m-#endif[m
[31m-#else[m
[31m-	if ((de = (int)(d0 >> Exp_shift)))[m
[31m-		z |= Exp_msk1;[m
[31m-#endif[m
[31m-#ifdef Pack_32[m
[31m-	if ((y = d1)) {[m
[31m-		if ((k = lo0bits(&y))) {[m
[31m-			x[0] = y | z << (32 - k);[m
[31m-			z >>= k;[m
[31m-			}[m
[31m-		else[m
[31m-			x[0] = y;[m
[31m-#ifndef Sudden_Underflow[m
[31m-		i =[m
[31m-#endif[m
[31m-		    b->wds = (x[1] = z) ? 2 : 1;[m
[31m-		}[m
[31m-	else {[m
[31m-		k = lo0bits(&z);[m
[31m-		x[0] = z;[m
[31m-#ifndef Sudden_Underflow[m
[31m-		i =[m
[31m-#endif[m
[31m-		    b->wds = 1;[m
[31m-		k += 32;[m
[31m-		}[m
[31m-#else[m
[31m-	if (y = d1) {[m
[31m-		if (k = lo0bits(&y))[m
[31m-			if (k >= 16) {[m
[31m-				x[0] = y | z << 32 - k & 0xffff;[m
[31m-				x[1] = z >> k - 16 & 0xffff;[m
[31m-				x[2] = z >> k;[m
[31m-				i = 2;[m
[31m-				}[m
[31m-			else {[m
[31m-				x[0] = y & 0xffff;[m
[31m-				x[1] = y >> 16 | z << 16 - k & 0xffff;[m
[31m-				x[2] = z >> k & 0xffff;[m
[31m-				x[3] = z >> k+16;[m
[31m-				i = 3;[m
[31m-				}[m
[31m-		else {[m
[31m-			x[0] = y & 0xffff;[m
[31m-			x[1] = y >> 16;[m
[31m-			x[2] = z & 0xffff;[m
[31m-			x[3] = z >> 16;[m
[31m-			i = 3;[m
[31m-			}[m
[31m-		}[m
[31m-	else {[m
[31m-#ifdef DEBUG[m
[31m-		if (!z)[m
[31m-			Bug("Zero passed to d2b");[m
[31m-#endif[m
[31m-		k = lo0bits(&z);[m
[31m-		if (k >= 16) {[m
[31m-			x[0] = z;[m
[31m-			i = 0;[m
[31m-			}[m
[31m-		else {[m
[31m-			x[0] = z & 0xffff;[m
[31m-			x[1] = z >> 16;[m
[31m-			i = 1;[m
[31m-			}[m
[31m-		k += 32;[m
[31m-		}[m
[31m-	while(!x[i])[m
[31m-		--i;[m
[31m-	b->wds = i + 1;[m
[31m-#endif[m
[31m-#ifndef Sudden_Underflow[m
[31m-	if (de) {[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-		*e = (de - Bias - (P-1) << 2) + k;[m
[31m-		*bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);[m
[31m-#else[m
[31m-		*e = de - Bias - (P-1) + k;[m
[31m-		*bits = P - k;[m
[31m-#endif[m
[31m-#ifndef Sudden_Underflow[m
[31m-		}[m
[31m-	else {[m
[31m-		*e = de - Bias - (P-1) + 1 + k;[m
[31m-#ifdef Pack_32[m
[31m-		*bits = 32*i - hi0bits(x[i-1]);[m
[31m-#else[m
[31m-		*bits = (i+2)*16 - hi0bits(x[i]);[m
[31m-#endif[m
[31m-		}[m
[31m-#endif[m
[31m-	return b;[m
[31m-	}[m
[31m-#undef d0[m
[31m-#undef d1[m
[31m-[m
[31m- static double[m
[31m-ratio[m
[31m-#ifdef KR_headers[m
[31m-	(a, b) Bigint *a, *b;[m
[31m-#else[m
[31m-	(Bigint *a, Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	U da, db;[m
[31m-	int k, ka, kb;[m
[31m-[m
[31m-	dval(&da) = b2d(a, &ka);[m
[31m-	dval(&db) = b2d(b, &kb);[m
[31m-#ifdef Pack_32[m
[31m-	k = ka - kb + 32*(a->wds - b->wds);[m
[31m-#else[m
[31m-	k = ka - kb + 16*(a->wds - b->wds);[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-	if (k > 0) {[m
[31m-		word0(&da) += (k >> 2)*Exp_msk1;[m
[31m-		if (k &= 3)[m
[31m-			dval(&da) *= 1 << k;[m
[31m-		}[m
[31m-	else {[m
[31m-		k = -k;[m
[31m-		word0(&db) += (k >> 2)*Exp_msk1;[m
[31m-		if (k &= 3)[m
[31m-			dval(&db) *= 1 << k;[m
[31m-		}[m
[31m-#else[m
[31m-	if (k > 0)[m
[31m-		word0(&da) += k*Exp_msk1;[m
[31m-	else {[m
[31m-		k = -k;[m
[31m-		word0(&db) += k*Exp_msk1;[m
[31m-		}[m
[31m-#endif[m
[31m-	return dval(&da) / dval(&db);[m
[31m-	}[m
[31m-[m
[31m- static CONST double[m
[31m-tens[] = {[m
[31m-		1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,[m
[31m-		1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,[m
[31m-		1e20, 1e21, 1e22[m
[31m-#ifdef VAX[m
[31m-		, 1e23, 1e24[m
[31m-#endif[m
[31m-		};[m
[31m-[m
[31m- static CONST double[m
[31m-#ifdef IEEE_Arith[m
[31m-bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };[m
[31m-static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,[m
[31m-#ifdef Avoid_Underflow[m
[31m-		9007199254740992.*9007199254740992.e-256[m
[31m-		/* = 2^106 * 1e-256 */[m
[31m-#else[m
[31m-		1e-256[m
[31m-#endif[m
[31m-		};[m
[31m-/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */[m
[31m-/* flag unnecessarily.  It leads to a song and dance at the end of strtod. */[m
[31m-#define Scale_Bit 0x10[m
[31m-#define n_bigtens 5[m
[31m-#else[m
[31m-#ifdef IBM[m
[31m-bigtens[] = { 1e16, 1e32, 1e64 };[m
[31m-static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };[m
[31m-#define n_bigtens 3[m
[31m-#else[m
[31m-bigtens[] = { 1e16, 1e32 };[m
[31m-static CONST double tinytens[] = { 1e-16, 1e-32 };[m
[31m-#define n_bigtens 2[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#undef Need_Hexdig[m
[31m-#ifdef INFNAN_CHECK[m
[31m-#ifndef No_Hex_NaN[m
[31m-#define Need_Hexdig[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifndef Need_Hexdig[m
[31m-#ifndef NO_HEX_FP[m
[31m-#define Need_Hexdig[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#ifdef Need_Hexdig /*{*/[m
[31m-static unsigned char hexdig[256];[m
[31m-[m
[31m- static void[m
[31m-#ifdef KR_headers[m
[31m-htinit(h, s, inc) unsigned char *h; unsigned char *s; int inc;[m
[31m-#else[m
[31m-htinit(unsigned char *h, unsigned char *s, int inc)[m
[31m-#endif[m
[31m-{[m
[31m-	int i, j;[m
[31m-	for(i = 0; (j = s[i]) !=0; i++)[m
[31m-		h[j] = i + inc;[m
[31m-	}[m
[31m-[m
[31m- static void[m
[31m-#ifdef KR_headers[m
[31m-hexdig_init()[m
[31m-#else[m
[31m-hexdig_init(void)[m
[31m-#endif[m
[31m-{[m
[31m-#define USC (unsigned char *)[m
[31m-	htinit(hexdig, USC "0123456789", 0x10);[m
[31m-	htinit(hexdig, USC "abcdef", 0x10 + 10);[m
[31m-	htinit(hexdig, USC "ABCDEF", 0x10 + 10);[m
[31m-	}[m
[31m-#endif /* } Need_Hexdig */[m
[31m-[m
[31m-#ifdef INFNAN_CHECK[m
[31m-[m
[31m-#ifndef NAN_WORD0[m
[31m-#define NAN_WORD0 0x7ff80000[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NAN_WORD1[m
[31m-#define NAN_WORD1 0[m
[31m-#endif[m
[31m-[m
[31m- static int[m
[31m-match[m
[31m-#ifdef KR_headers[m
[31m-	(sp, t) char **sp, *t;[m
[31m-#else[m
[31m-	(const char **sp, const char *t)[m
[31m-#endif[m
[31m-{[m
[31m-	int c, d;[m
[31m-	CONST char *s = *sp;[m
[31m-[m
[31m-	while((d = *t++)) {[m
[31m-		if ((c = *++s) >= 'A' && c <= 'Z')[m
[31m-			c += 'a' - 'A';[m
[31m-		if (c != d)[m
[31m-			return 0;[m
[31m-		}[m
[31m-	*sp = s + 1;[m
[31m-	return 1;[m
[31m-	}[m
[31m-[m
[31m-#ifndef No_Hex_NaN[m
[31m- static void[m
[31m-hexnan[m
[31m-#ifdef KR_headers[m
[31m-	(rvp, sp) U *rvp; CONST char **sp;[m
[31m-#else[m
[31m-	(U *rvp, const char **sp)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong c, x[2];[m
[31m-	CONST char *s;[m
[31m-	int c1, havedig, udx0, xshift;[m
[31m-[m
[31m-	if (!hexdig['0'])[m
[31m-		hexdig_init();[m
[31m-	x[0] = x[1] = 0;[m
[31m-	havedig = xshift = 0;[m
[31m-	udx0 = 1;[m
[31m-	s = *sp;[m
[31m-	/* allow optional initial 0x or 0X */[m
[31m-	while((c = *(CONST unsigned char*)(s+1)) && c <= ' ')[m
[31m-		++s;[m
[31m-	if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))[m
[31m-		s += 2;[m
[31m-	while((c = *(CONST unsigned char*)++s)) {[m
[31m-		if ((c1 = hexdig[c]))[m
[31m-			c  = c1 & 0xf;[m
[31m-		else if (c <= ' ') {[m
[31m-			if (udx0 && havedig) {[m
[31m-				udx0 = 0;[m
[31m-				xshift = 1;[m
[31m-				}[m
[31m-			continue;[m
[31m-			}[m
[31m-#ifdef GDTOA_NON_PEDANTIC_NANCHECK[m
[31m-		else if (/*(*/ c == ')' && havedig) {[m
[31m-			*sp = s + 1;[m
[31m-			break;[m
[31m-			}[m
[31m-		else[m
[31m-			return;	/* invalid form: don't change *sp */[m
[31m-#else[m
[31m-		else {[m
[31m-			do {[m
[31m-				if (/*(*/ c == ')') {[m
[31m-					*sp = s + 1;[m
[31m-					break;[m
[31m-					}[m
[31m-				} while((c = *++s));[m
[31m-			break;[m
[31m-			}[m
[31m-#endif[m
[31m-		havedig = 1;[m
[31m-		if (xshift) {[m
[31m-			xshift = 0;[m
[31m-			x[0] = x[1];[m
[31m-			x[1] = 0;[m
[31m-			}[m
[31m-		if (udx0)[m
[31m-			x[0] = (x[0] << 4) | (x[1] >> 28);[m
[31m-		x[1] = (x[1] << 4) | c;[m
[31m-		}[m
[31m-	if ((x[0] &= 0xfffff) || x[1]) {[m
[31m-		word0(rvp) = Exp_mask | x[0];[m
[31m-		word1(rvp) = x[1];[m
[31m-		}[m
[31m-	}[m
[31m-#endif /*No_Hex_NaN*/[m
[31m-#endif /* INFNAN_CHECK */[m
[31m-[m
[31m-#ifdef Pack_32[m
[31m-#define ULbits 32[m
[31m-#define kshift 5[m
[31m-#define kmask 31[m
[31m-#else[m
[31m-#define ULbits 16[m
[31m-#define kshift 4[m
[31m-#define kmask 15[m
[31m-#endif[m
[31m-[m
[31m-#if !defined(NO_HEX_FP) || defined(Honor_FLT_ROUNDS) /*{*/[m
[31m- static Bigint *[m
[31m-#ifdef KR_headers[m
[31m-increment(b) Bigint *b;[m
[31m-#else[m
[31m-increment(Bigint *b)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong *x, *xe;[m
[31m-	Bigint *b1;[m
[31m-[m
[31m-	x = b->x;[m
[31m-	xe = x + b->wds;[m
[31m-	do {[m
[31m-		if (*x < (ULong)0xffffffffL) {[m
[31m-			++*x;[m
[31m-			return b;[m
[31m-			}[m
[31m-		*x++ = 0;[m
[31m-		} while(x < xe);[m
[31m-	{[m
[31m-		if (b->wds >= b->maxwds) {[m
[31m-			b1 = Balloc(b->k+1);[m
[31m-			Bcopy(b1,b);[m
[31m-			Bfree(b);[m
[31m-			b = b1;[m
[31m-			}[m
[31m-		b->x[b->wds++] = 1;[m
[31m-		}[m
[31m-	return b;[m
[31m-	}[m
[31m-[m
[31m-#endif /*}*/[m
[31m-[m
[31m-#ifndef NO_HEX_FP /*{*/[m
[31m-[m
[31m- static void[m
[31m-#ifdef KR_headers[m
[31m-rshift(b, k) Bigint *b; int k;[m
[31m-#else[m
[31m-rshift(Bigint *b, int k)[m
[31m-#endif[m
[31m-{[m
[31m-	ULong *x, *x1, *xe, y;[m
[31m-	int n;[m
[31m-[m
[31m-	x = x1 = b->x;[m
[31m-	n = k >> kshift;[m
[31m-	if (n < b->wds) {[m
[31m-		xe = x + b->wds;[m
[31m-		x += n;[m
[31m-		if (k &= kmask) {[m
[31m-			n = 32 - k;[m
[31m-			y = *x++ >> k;[m
[31m-			while(x < xe) {[m
[31m-				*x1++ = (y | (*x << n)) & 0xffffffff;[m
[31m-				y = *x++ >> k;[m
[31m-				}[m
[31m-			if ((*x1 = y) !=0)[m
[31m-				x1++;[m
[31m-			}[m
[31m-		else[m
[31m-			while(x < xe)[m
[31m-				*x1++ = *x++;[m
[31m-		}[m
[31m-	if ((b->wds = x1 - b->x) == 0)[m
[31m-		b->x[0] = 0;[m
[31m-	}[m
[31m-[m
[31m- static ULong[m
[31m-#ifdef KR_headers[m
[31m-any_on(b, k) Bigint *b; int k;[m
[31m-#else[m
[31m-any_on(Bigint *b, int k)[m
[31m-#endif[m
[31m-{[m
[31m-	int n, nwds;[m
[31m-	ULong *x, *x0, x1, x2;[m
[31m-[m
[31m-	x = b->x;[m
[31m-	nwds = b->wds;[m
[31m-	n = k >> kshift;[m
[31m-	if (n > nwds)[m
[31m-		n = nwds;[m
[31m-	else if (n < nwds && (k &= kmask)) {[m
[31m-		x1 = x2 = x[n];[m
[31m-		x1 >>= k;[m
[31m-		x1 <<= k;[m
[31m-		if (x1 != x2)[m
[31m-			return 1;[m
[31m-		}[m
[31m-	x0 = x;[m
[31m-	x += n;[m
[31m-	while(x > x0)[m
[31m-		if (*--x)[m
[31m-			return 1;[m
[31m-	return 0;[m
[31m-	}[m
[31m-[m
[31m-enum {	/* rounding values: same as FLT_ROUNDS */[m
[31m-	Round_zero = 0,[m
[31m-	Round_near = 1,[m
[31m-	Round_up = 2,[m
[31m-	Round_down = 3[m
[31m-	};[m
[31m-[m
[31m- void[m
[31m-#ifdef KR_headers[m
[31m-gethex(sp, rvp, rounding, sign)[m
[31m-	CONST char **sp; U *rvp; int rounding, sign;[m
[31m-#else[m
[31m-gethex( CONST char **sp, U *rvp, int rounding, int sign)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b;[m
[31m-	CONST unsigned char *decpt, *s0, *s, *s1;[m
[31m-	Long e, e1;[m
[31m-	ULong L, lostbits, *x;[m
[31m-	int big, denorm, esign, havedig, k, n, nbits, up, zret;[m
[31m-#ifdef IBM[m
[31m-	int j;[m
[31m-#endif[m
[31m-	enum {[m
[31m-#ifdef IEEE_Arith /*{{*/[m
[31m-		emax = 0x7fe - Bias - P + 1,[m
[31m-		emin = Emin - P + 1[m
[31m-#else /*}{*/[m
[31m-		emin = Emin - P,[m
[31m-#ifdef VAX[m
[31m-		emax = 0x7ff - Bias - P + 1[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-		emax = 0x7f - Bias - P[m
[31m-#endif[m
[31m-#endif /*}}*/[m
[31m-		};[m
[31m-#ifdef USE_LOCALE[m
[31m-	int i;[m
[31m-#ifdef NO_LOCALE_CACHE[m
[31m-	const unsigned char *decimalpoint = (unsigned char*)[m
[31m-		localeconv()->decimal_point;[m
[31m-#else[m
[31m-	const unsigned char *decimalpoint;[m
[31m-	static unsigned char *decimalpoint_cache;[m
[31m-	if (!(s0 = decimalpoint_cache)) {[m
[31m-		s0 = (unsigned char*)localeconv()->decimal_point;[m
[31m-		if ((decimalpoint_cache = (unsigned char*)[m
[31m-				MALLOC(strlen((CONST char*)s0) + 1))) {[m
[31m-			strcpy((char*)decimalpoint_cache, (CONST char*)s0);[m
[31m-			s0 = decimalpoint_cache;[m
[31m-			}[m
[31m-		}[m
[31m-	decimalpoint = s0;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-	if (!hexdig['0'])[m
[31m-		hexdig_init();[m
[31m-	havedig = 0;[m
[31m-	s0 = *(CONST unsigned char **)sp + 2;[m
[31m-	while(s0[havedig] == '0')[m
[31m-		havedig++;[m
[31m-	s0 += havedig;[m
[31m-	s = s0;[m
[31m-	decpt = 0;[m
[31m-	zret = 0;[m
[31m-	e = 0;[m
[31m-	if (hexdig[*s])[m
[31m-		havedig++;[m
[31m-	else {[m
[31m-		zret = 1;[m
[31m-#ifdef USE_LOCALE[m
[31m-		for(i = 0; decimalpoint[i]; ++i) {[m
[31m-			if (s[i] != decimalpoint[i])[m
[31m-				goto pcheck;[m
[31m-			}[m
[31m-		decpt = s += i;[m
[31m-#else[m
[31m-		if (*s != '.')[m
[31m-			goto pcheck;[m
[31m-		decpt = ++s;[m
[31m-#endif[m
[31m-		if (!hexdig[*s])[m
[31m-			goto pcheck;[m
[31m-		while(*s == '0')[m
[31m-			s++;[m
[31m-		if (hexdig[*s])[m
[31m-			zret = 0;[m
[31m-		havedig = 1;[m
[31m-		s0 = s;[m
[31m-		}[m
[31m-	while(hexdig[*s])[m
[31m-		s++;[m
[31m-#ifdef USE_LOCALE[m
[31m-	if (*s == *decimalpoint && !decpt) {[m
[31m-		for(i = 1; decimalpoint[i]; ++i) {[m
[31m-			if (s[i] != decimalpoint[i])[m
[31m-				goto pcheck;[m
[31m-			}[m
[31m-		decpt = s += i;[m
[31m-#else[m
[31m-	if (*s == '.' && !decpt) {[m
[31m-		decpt = ++s;[m
[31m-#endif[m
[31m-		while(hexdig[*s])[m
[31m-			s++;[m
[31m-		}/*}*/[m
[31m-	if (decpt)[m
[31m-		e = -(((Long)(s-decpt)) << 2);[m
[31m- pcheck:[m
[31m-	s1 = s;[m
[31m-	big = esign = 0;[m
[31m-	switch(*s) {[m
[31m-	  case 'p':[m
[31m-	  case 'P':[m
[31m-		switch(*++s) {[m
[31m-		  case '-':[m
[31m-			esign = 1;[m
[31m-			/* no break */[m
[31m-		  case '+':[m
[31m-			s++;[m
[31m-		  }[m
[31m-		if ((n = hexdig[*s]) == 0 || n > 0x19) {[m
[31m-			s = s1;[m
[31m-			break;[m
[31m-			}[m
[31m-		e1 = n - 0x10;[m
[31m-		while((n = hexdig[*++s]) !=0 && n <= 0x19) {[m
[31m-			if (e1 & 0xf8000000)[m
[31m-				big = 1;[m
[31m-			e1 = 10*e1 + n - 0x10;[m
[31m-			}[m
[31m-		if (esign)[m
[31m-			e1 = -e1;[m
[31m-		e += e1;[m
[31m-	  }[m
[31m-	*sp = (char*)s;[m
[31m-	if (!havedig)[m
[31m-		*sp = (char*)s0 - 1;[m
[31m-	if (zret)[m
[31m-		goto retz1;[m
[31m-	if (big) {[m
[31m-		if (esign) {[m
[31m-#ifdef IEEE_Arith[m
[31m-			switch(rounding) {[m
[31m-			  case Round_up:[m
[31m-				if (sign)[m
[31m-					break;[m
[31m-				goto ret_tiny;[m
[31m-			  case Round_down:[m
[31m-				if (!sign)[m
[31m-					break;[m
[31m-				goto ret_tiny;[m
[31m-			  }[m
[31m-#endif[m
[31m-			goto retz;[m
[31m-#ifdef IEEE_Arith[m
[31m- ret_tiny:[m
[31m-#ifndef NO_ERRNO[m
[31m-			errno = ERANGE;[m
[31m-#endif[m
[31m-			word0(rvp) = 0;[m
[31m-			word1(rvp) = 1;[m
[31m-			return;[m
[31m-#endif /* IEEE_Arith */[m
[31m-			}[m
[31m-		switch(rounding) {[m
[31m-		  case Round_near:[m
[31m-			goto ovfl1;[m
[31m-		  case Round_up:[m
[31m-			if (!sign)[m
[31m-				goto ovfl1;[m
[31m-			goto ret_big;[m
[31m-		  case Round_down:[m
[31m-			if (sign)[m
[31m-				goto ovfl1;[m
[31m-			goto ret_big;[m
[31m-		  }[m
[31m- ret_big:[m
[31m-		word0(rvp) = Big0;[m
[31m-		word1(rvp) = Big1;[m
[31m-		return;[m
[31m-		}[m
[31m-	n = s1 - s0 - 1;[m
[31m-	for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1)[m
[31m-		k++;[m
[31m-	b = Balloc(k);[m
[31m-	x = b->x;[m
[31m-	n = 0;[m
[31m-	L = 0;[m
[31m-#ifdef USE_LOCALE[m
[31m-	for(i = 0; decimalpoint[i+1]; ++i);[m
[31m-#endif[m
[31m-	while(s1 > s0) {[m
[31m-#ifdef USE_LOCALE[m
[31m-		if (*--s1 == decimalpoint[i]) {[m
[31m-			s1 -= i;[m
[31m-			continue;[m
[31m-			}[m
[31m-#else[m
[31m-		if (*--s1 == '.')[m
[31m-			continue;[m
[31m-#endif[m
[31m-		if (n == ULbits) {[m
[31m-			*x++ = L;[m
[31m-			L = 0;[m
[31m-			n = 0;[m
[31m-			}[m
[31m-		L |= (hexdig[*s1] & 0x0f) << n;[m
[31m-		n += 4;[m
[31m-		}[m
[31m-	*x++ = L;[m
[31m-	b->wds = n = x - b->x;[m
[31m-	n = ULbits*n - hi0bits(L);[m
[31m-	nbits = Nbits;[m
[31m-	lostbits = 0;[m
[31m-	x = b->x;[m
[31m-	if (n > nbits) {[m
[31m-		n -= nbits;[m
[31m-		if (any_on(b,n)) {[m
[31m-			lostbits = 1;[m
[31m-			k = n - 1;[m
[31m-			if (x[k>>kshift] & 1 << (k & kmask)) {[m
[31m-				lostbits = 2;[m
[31m-				if (k > 0 && any_on(b,k))[m
[31m-					lostbits = 3;[m
[31m-				}[m
[31m-			}[m
[31m-		rshift(b, n);[m
[31m-		e += n;[m
[31m-		}[m
[31m-	else if (n < nbits) {[m
[31m-		n = nbits - n;[m
[31m-		b = lshift(b, n);[m
[31m-		e -= n;[m
[31m-		x = b->x;[m
[31m-		}[m
[31m-	if (e > Emax) {[m
[31m- ovfl:[m
[31m-		Bfree(b);[m
[31m- ovfl1:[m
[31m-#ifndef NO_ERRNO[m
[31m-		errno = ERANGE;[m
[31m-#endif[m
[31m-		word0(rvp) = Exp_mask;[m
[31m-		word1(rvp) = 0;[m
[31m-		return;[m
[31m-		}[m
[31m-	denorm = 0;[m
[31m-	if (e < emin) {[m
[31m-		denorm = 1;[m
[31m-		n = emin - e;[m
[31m-		if (n >= nbits) {[m
[31m-#ifdef IEEE_Arith /*{*/[m
[31m-			switch (rounding) {[m
[31m-			  case Round_near:[m
[31m-				if (n == nbits && (n < 2 || any_on(b,n-1)))[m
[31m-					goto ret_tiny;[m
[31m-				break;[m
[31m-			  case Round_up:[m
[31m-				if (!sign)[m
[31m-					goto ret_tiny;[m
[31m-				break;[m
[31m-			  case Round_down:[m
[31m-				if (sign)[m
[31m-					goto ret_tiny;[m
[31m-			  }[m
[31m-#endif /* } IEEE_Arith */[m
[31m-			Bfree(b);[m
[31m- retz:[m
[31m-#ifndef NO_ERRNO[m
[31m-			errno = ERANGE;[m
[31m-#endif[m
[31m- retz1:[m
[31m-			rvp->d = 0.;[m
[31m-			return;[m
[31m-			}[m
[31m-		k = n - 1;[m
[31m-		if (lostbits)[m
[31m-			lostbits = 1;[m
[31m-		else if (k > 0)[m
[31m-			lostbits = any_on(b,k);[m
[31m-		if (x[k>>kshift] & 1 << (k & kmask))[m
[31m-			lostbits |= 2;[m
[31m-		nbits -= n;[m
[31m-		rshift(b,n);[m
[31m-		e = emin;[m
[31m-		}[m
[31m-	if (lostbits) {[m
[31m-		up = 0;[m
[31m-		switch(rounding) {[m
[31m-		  case Round_zero:[m
[31m-			break;[m
[31m-		  case Round_near:[m
[31m-			if (lostbits & 2[m
[31m-			 && (lostbits & 1) | (x[0] & 1))[m
[31m-				up = 1;[m
[31m-			break;[m
[31m-		  case Round_up:[m
[31m-			up = 1 - sign;[m
[31m-			break;[m
[31m-		  case Round_down:[m
[31m-			up = sign;[m
[31m-		  }[m
[31m-		if (up) {[m
[31m-			k = b->wds;[m
[31m-			b = increment(b);[m
[31m-			x = b->x;[m
[31m-			if (denorm) {[m
[31m-#if 0[m
[31m-				if (nbits == Nbits - 1[m
[31m-				 && x[nbits >> kshift] & 1 << (nbits & kmask))[m
[31m-					denorm = 0; /* not currently used */[m
[31m-#endif[m
[31m-				}[m
[31m-			else if (b->wds > k[m
[31m-			 || ((n = nbits & kmask) !=0[m
[31m-			     && hi0bits(x[k-1]) < 32-n)) {[m
[31m-				rshift(b,1);[m
[31m-				if (++e > Emax)[m
[31m-					goto ovfl;[m
[31m-				}[m
[31m-			}[m
[31m-		}[m
[31m-#ifdef IEEE_Arith[m
[31m-	if (denorm)[m
[31m-		word0(rvp) = b->wds > 1 ? b->x[1] & ~0x100000 : 0;[m
[31m-	else[m
[31m-		word0(rvp) = (b->x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20);[m
[31m-	word1(rvp) = b->x[0];[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-	if ((j = e & 3)) {[m
[31m-		k = b->x[0] & ((1 << j) - 1);[m
[31m-		rshift(b,j);[m
[31m-		if (k) {[m
[31m-			switch(rounding) {[m
[31m-			  case Round_up:[m
[31m-				if (!sign)[m
[31m-					increment(b);[m
[31m-				break;[m
[31m-			  case Round_down:[m
[31m-				if (sign)[m
[31m-					increment(b);[m
[31m-				break;[m
[31m-			  case Round_near:[m
[31m-				j = 1 << (j-1);[m
[31m-				if (k & j && ((k & (j-1)) | lostbits))[m
[31m-					increment(b);[m
[31m-			  }[m
[31m-			}[m
[31m-		}[m
[31m-	e >>= 2;[m
[31m-	word0(rvp) = b->x[1] | ((e + 65 + 13) << 24);[m
[31m-	word1(rvp) = b->x[0];[m
[31m-#endif[m
[31m-#ifdef VAX[m
[31m-	/* The next two lines ignore swap of low- and high-order 2 bytes. */[m
[31m-	/* word0(rvp) = (b->x[1] & ~0x800000) | ((e + 129 + 55) << 23); */[m
[31m-	/* word1(rvp) = b->x[0]; */[m
[31m-	word0(rvp) = ((b->x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->x[1] << 16);[m
[31m-	word1(rvp) = (b->x[0] >> 16) | (b->x[0] << 16);[m
[31m-#endif[m
[31m-	Bfree(b);[m
[31m-	}[m
[31m-#endif /*!NO_HEX_FP}*/[m
[31m-[m
[31m- static int[m
[31m-#ifdef KR_headers[m
[31m-dshift(b, p2) Bigint *b; int p2;[m
[31m-#else[m
[31m-dshift(Bigint *b, int p2)[m
[31m-#endif[m
[31m-{[m
[31m-	int rv = hi0bits(b->x[b->wds-1]) - 4;[m
[31m-	if (p2 > 0)[m
[31m-		rv -= p2;[m
[31m-	return rv & kmask;[m
[31m-	}[m
[31m-[m
[31m- static int[m
[31m-quorem[m
[31m-#ifdef KR_headers[m
[31m-	(b, S) Bigint *b, *S;[m
[31m-#else[m
[31m-	(Bigint *b, Bigint *S)[m
[31m-#endif[m
[31m-{[m
[31m-	int n;[m
[31m-	ULong *bx, *bxe, q, *sx, *sxe;[m
[31m-#ifdef ULLong[m
[31m-	ULLong borrow, carry, y, ys;[m
[31m-#else[m
[31m-	ULong borrow, carry, y, ys;[m
[31m-#ifdef Pack_32[m
[31m-	ULong si, z, zs;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-	n = S->wds;[m
[31m-#ifdef DEBUG[m
[31m-	/*debug*/ if (b->wds > n)[m
[31m-	/*debug*/	Bug("oversize b in quorem");[m
[31m-#endif[m
[31m-	if (b->wds < n)[m
[31m-		return 0;[m
[31m-	sx = S->x;[m
[31m-	sxe = sx + --n;[m
[31m-	bx = b->x;[m
[31m-	bxe = bx + n;[m
[31m-	q = *bxe / (*sxe + 1);	/* ensure q <= true quotient */[m
[31m-#ifdef DEBUG[m
[31m-#ifdef NO_STRTOD_BIGCOMP[m
[31m-	/*debug*/ if (q > 9)[m
[31m-#else[m
[31m-	/* An oversized q is possible when quorem is called from bigcomp and */[m
[31m-	/* the input is near, e.g., twice the smallest denormalized number. */[m
[31m-	/*debug*/ if (q > 15)[m
[31m-#endif[m
[31m-	/*debug*/	Bug("oversized quotient in quorem");[m
[31m-#endif[m
[31m-	if (q) {[m
[31m-		borrow = 0;[m
[31m-		carry = 0;[m
[31m-		do {[m
[31m-#ifdef ULLong[m
[31m-			ys = *sx++ * (ULLong)q + carry;[m
[31m-			carry = ys >> 32;[m
[31m-			y = *bx - (ys & FFFFFFFF) - borrow;[m
[31m-			borrow = y >> 32 & (ULong)1;[m
[31m-			*bx++ = y & FFFFFFFF;[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-			si = *sx++;[m
[31m-			ys = (si & 0xffff) * q + carry;[m
[31m-			zs = (si >> 16) * q + (ys >> 16);[m
[31m-			carry = zs >> 16;[m
[31m-			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;[m
[31m-			borrow = (y & 0x10000) >> 16;[m
[31m-			z = (*bx >> 16) - (zs & 0xffff) - borrow;[m
[31m-			borrow = (z & 0x10000) >> 16;[m
[31m-			Storeinc(bx, z, y);[m
[31m-#else[m
[31m-			ys = *sx++ * q + carry;[m
[31m-			carry = ys >> 16;[m
[31m-			y = *bx - (ys & 0xffff) - borrow;[m
[31m-			borrow = (y & 0x10000) >> 16;[m
[31m-			*bx++ = y & 0xffff;[m
[31m-#endif[m
[31m-#endif[m
[31m-			}[m
[31m-			while(sx <= sxe);[m
[31m-		if (!*bxe) {[m
[31m-			bx = b->x;[m
[31m-			while(--bxe > bx && !*bxe)[m
[31m-				--n;[m
[31m-			b->wds = n;[m
[31m-			}[m
[31m-		}[m
[31m-	if (cmp(b, S) >= 0) {[m
[31m-		q++;[m
[31m-		borrow = 0;[m
[31m-		carry = 0;[m
[31m-		bx = b->x;[m
[31m-		sx = S->x;[m
[31m-		do {[m
[31m-#ifdef ULLong[m
[31m-			ys = *sx++ + carry;[m
[31m-			carry = ys >> 32;[m
[31m-			y = *bx - (ys & FFFFFFFF) - borrow;[m
[31m-			borrow = y >> 32 & (ULong)1;[m
[31m-			*bx++ = y & FFFFFFFF;[m
[31m-#else[m
[31m-#ifdef Pack_32[m
[31m-			si = *sx++;[m
[31m-			ys = (si & 0xffff) + carry;[m
[31m-			zs = (si >> 16) + (ys >> 16);[m
[31m-			carry = zs >> 16;[m
[31m-			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;[m
[31m-			borrow = (y & 0x10000) >> 16;[m
[31m-			z = (*bx >> 16) - (zs & 0xffff) - borrow;[m
[31m-			borrow = (z & 0x10000) >> 16;[m
[31m-			Storeinc(bx, z, y);[m
[31m-#else[m
[31m-			ys = *sx++ + carry;[m
[31m-			carry = ys >> 16;[m
[31m-			y = *bx - (ys & 0xffff) - borrow;[m
[31m-			borrow = (y & 0x10000) >> 16;[m
[31m-			*bx++ = y & 0xffff;[m
[31m-#endif[m
[31m-#endif[m
[31m-			}[m
[31m-			while(sx <= sxe);[m
[31m-		bx = b->x;[m
[31m-		bxe = bx + n;[m
[31m-		if (!*bxe) {[m
[31m-			while(--bxe > bx && !*bxe)[m
[31m-				--n;[m
[31m-			b->wds = n;[m
[31m-			}[m
[31m-		}[m
[31m-	return q;[m
[31m-	}[m
[31m-[m
[31m-#if defined(Avoid_Underflow) || !defined(NO_STRTOD_BIGCOMP) /*{*/[m
[31m- static double[m
[31m-sulp[m
[31m-#ifdef KR_headers[m
[31m-	(x, bc) U *x; BCinfo *bc;[m
[31m-#else[m
[31m-	(U *x, BCinfo *bc)[m
[31m-#endif[m
[31m-{[m
[31m-	U u;[m
[31m-	double rv;[m
[31m-	int i;[m
[31m-[m
[31m-	rv = ulp(x);[m
[31m-	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)[m
[31m-		return rv; /* Is there an example where i <= 0 ? */[m
[31m-	word0(&u) = Exp_1 + (i << Exp_shift);[m
[31m-	word1(&u) = 0;[m
[31m-	return rv * u.d;[m
[31m-	}[m
[31m-#endif /*}*/[m
[31m-[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m- static void[m
[31m-bigcomp[m
[31m-#ifdef KR_headers[m
[31m-	(rv, s0, bc)[m
[31m-	U *rv; CONST char *s0; BCinfo *bc;[m
[31m-#else[m
[31m-	(U *rv, const char *s0, BCinfo *bc)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b, *d;[m
[31m-	int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase;[m
[31m-[m
[31m-	dsign = bc->dsign;[m
[31m-	nd = bc->nd;[m
[31m-	nd0 = bc->nd0;[m
[31m-	p5 = nd + bc->e0 - 1;[m
[31m-	speccase = 0;[m
[31m-#ifndef Sudden_Underflow[m
[31m-	if (rv->d == 0.) {	/* special case: value near underflow-to-zero */[m
[31m-				/* threshold was rounded to zero */[m
[31m-		b = i2b(1);[m
[31m-		p2 = Emin - P + 1;[m
[31m-		bbits = 1;[m
[31m-#ifdef Avoid_Underflow[m
[31m-		word0(rv) = (P+2) << Exp_shift;[m
[31m-#else[m
[31m-		word1(rv) = 1;[m
[31m-#endif[m
[31m-		i = 0;[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-		if (bc->rounding == 1)[m
[31m-#endif[m
[31m-			{[m
[31m-			speccase = 1;[m
[31m-			--p2;[m
[31m-			dsign = 0;[m
[31m-			goto have_i;[m
[31m-			}[m
[31m-		}[m
[31m-	else[m
[31m-#endif[m
[31m-		b = d2b(rv, &p2, &bbits);[m
[31m-#ifdef Avoid_Underflow[m
[31m-	p2 -= bc->scale;[m
[31m-#endif[m
[31m-	/* floor(log2(rv)) == bbits - 1 + p2 */[m
[31m-	/* Check for denormal case. */[m
[31m-	i = P - bbits;[m
[31m-	if (i > (j = P - Emin - 1 + p2)) {[m
[31m-#ifdef Sudden_Underflow[m
[31m-		Bfree(b);[m
[31m-		b = i2b(1);[m
[31m-		p2 = Emin;[m
[31m-		i = P - 1;[m
[31m-#ifdef Avoid_Underflow[m
[31m-		word0(rv) = (1 + bc->scale) << Exp_shift;[m
[31m-#else[m
[31m-		word0(rv) = Exp_msk1;[m
[31m-#endif[m
[31m-		word1(rv) = 0;[m
[31m-#else[m
[31m-		i = j;[m
[31m-#endif[m
[31m-		}[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (bc->rounding != 1) {[m
[31m-		if (i > 0)[m
[31m-			b = lshift(b, i);[m
[31m-		if (dsign)[m
[31m-			b = increment(b);[m
[31m-		}[m
[31m-	else[m
[31m-#endif[m
[31m-		{[m
[31m-		b = lshift(b, ++i);[m
[31m-		b->x[0] |= 1;[m
[31m-		}[m
[31m-#ifndef Sudden_Underflow[m
[31m- have_i:[m
[31m-#endif[m
[31m-	p2 -= p5 + i;[m
[31m-	d = i2b(1);[m
[31m-	/* Arrange for convenient computation of quotients:[m
[31m-	 * shift left if necessary so divisor has 4 leading 0 bits.[m
[31m-	 */[m
[31m-	if (p5 > 0)[m
[31m-		d = pow5mult(d, p5);[m
[31m-	else if (p5 < 0)[m
[31m-		b = pow5mult(b, -p5);[m
[31m-	if (p2 > 0) {[m
[31m-		b2 = p2;[m
[31m-		d2 = 0;[m
[31m-		}[m
[31m-	else {[m
[31m-		b2 = 0;[m
[31m-		d2 = -p2;[m
[31m-		}[m
[31m-	i = dshift(d, d2);[m
[31m-	if ((b2 += i) > 0)[m
[31m-		b = lshift(b, b2);[m
[31m-	if ((d2 += i) > 0)[m
[31m-		d = lshift(d, d2);[m
[31m-[m
[31m-	/* Now b/d = exactly half-way between the two floating-point values */[m
[31m-	/* on either side of the input string.  Compute first digit of b/d. */[m
[31m-[m
[31m-	if (!(dig = quorem(b,d))) {[m
[31m-		b = multadd(b, 10, 0);	/* very unlikely */[m
[31m-		dig = quorem(b,d);[m
[31m-		}[m
[31m-[m
[31m-	/* Compare b/d with s0 */[m
[31m-[m
[31m-	for(i = 0; i < nd0; ) {[m
[31m-		if ((dd = s0[i++] - '0' - dig))[m
[31m-			goto ret;[m
[31m-		if (!b->x[0] && b->wds == 1) {[m
[31m-			if (i < nd)[m
[31m-				dd = 1;[m
[31m-			goto ret;[m
[31m-			}[m
[31m-		b = multadd(b, 10, 0);[m
[31m-		dig = quorem(b,d);[m
[31m-		}[m
[31m-	for(j = bc->dp1; i++ < nd;) {[m
[31m-		if ((dd = s0[j++] - '0' - dig))[m
[31m-			goto ret;[m
[31m-		if (!b->x[0] && b->wds == 1) {[m
[31m-			if (i < nd)[m
[31m-				dd = 1;[m
[31m-			goto ret;[m
[31m-			}[m
[31m-		b = multadd(b, 10, 0);[m
[31m-		dig = quorem(b,d);[m
[31m-		}[m
[31m-	if (b->x[0] || b->wds > 1)[m
[31m-		dd = -1;[m
[31m- ret:[m
[31m-	Bfree(b);[m
[31m-	Bfree(d);[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (bc->rounding != 1) {[m
[31m-		if (dd < 0) {[m
[31m-			if (bc->rounding == 0) {[m
[31m-				if (!dsign)[m
[31m-					goto retlow1;[m
[31m-				}[m
[31m-			else if (dsign)[m
[31m-				goto rethi1;[m
[31m-			}[m
[31m-		else if (dd > 0) {[m
[31m-			if (bc->rounding == 0) {[m
[31m-				if (dsign)[m
[31m-					goto rethi1;[m
[31m-				goto ret1;[m
[31m-				}[m
[31m-			if (!dsign)[m
[31m-				goto rethi1;[m
[31m-			dval(rv) += 2.*sulp(rv,bc);[m
[31m-			}[m
[31m-		else {[m
[31m-			bc->inexact = 0;[m
[31m-			if (dsign)[m
[31m-				goto rethi1;[m
[31m-			}[m
[31m-		}[m
[31m-	else[m
[31m-#endif[m
[31m-	if (speccase) {[m
[31m-		if (dd <= 0)[m
[31m-			rv->d = 0.;[m
[31m-		}[m
[31m-	else if (dd < 0) {[m
[31m-		if (!dsign)	/* does not happen for round-near */[m
[31m-retlow1:[m
[31m-			dval(rv) -= sulp(rv,bc);[m
[31m-		}[m
[31m-	else if (dd > 0) {[m
[31m-		if (dsign) {[m
[31m- rethi1:[m
[31m-			dval(rv) += sulp(rv,bc);[m
[31m-			}[m
[31m-		}[m
[31m-	else {[m
[31m-		/* Exact half-way case:  apply round-even rule. */[m
[31m-		if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) {[m
[31m-			i = 1 - j;[m
[31m-			if (i <= 31) {[m
[31m-				if (word1(rv) & (0x1 << i))[m
[31m-					goto odd;[m
[31m-				}[m
[31m-			else if (word0(rv) & (0x1 << (i-32)))[m
[31m-				goto odd;[m
[31m-			}[m
[31m-		else if (word1(rv) & 1) {[m
[31m- odd:[m
[31m-			if (dsign)[m
[31m-				goto rethi1;[m
[31m-			goto retlow1;[m
[31m-			}[m
[31m-		}[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m- ret1:[m
[31m-#endif[m
[31m-	return;[m
[31m-	}[m
[31m-#endif /* NO_STRTOD_BIGCOMP */[m
[31m-[m
[31m- double[m
[31m-fpconv_strtod[m
[31m-#ifdef KR_headers[m
[31m-	(s00, se) CONST char *s00; char **se;[m
[31m-#else[m
[31m-	(const char *s00, char **se)[m
[31m-#endif[m
[31m-{[m
[31m-	int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;[m
[31m-	int esign, i, j, k, nd, nd0, nf, nz, nz0, nz1, sign;[m
[31m-	CONST char *s, *s0, *s1;[m
[31m-	double aadj, aadj1;[m
[31m-	Long L;[m
[31m-	U aadj2, adj, rv, rv0;[m
[31m-	ULong y, z;[m
[31m-	BCinfo bc;[m
[31m-	Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;[m
[31m-#ifdef Avoid_Underflow[m
[31m-	ULong Lsb, Lsb1;[m
[31m-#endif[m
[31m-#ifdef SET_INEXACT[m
[31m-	int oldinexact;[m
[31m-#endif[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m-	int req_bigcomp = 0;[m
[31m-#endif[m
[31m-#ifdef Honor_FLT_ROUNDS /*{*/[m
[31m-#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */[m
[31m-	bc.rounding = Flt_Rounds;[m
[31m-#else /*}{*/[m
[31m-	bc.rounding = 1;[m
[31m-	switch(fegetround()) {[m
[31m-	  case FE_TOWARDZERO:	bc.rounding = 0; break;[m
[31m-	  case FE_UPWARD:	bc.rounding = 2; break;[m
[31m-	  case FE_DOWNWARD:	bc.rounding = 3;[m
[31m-	  }[m
[31m-#endif /*}}*/[m
[31m-#endif /*}*/[m
[31m-#ifdef USE_LOCALE[m
[31m-	CONST char *s2;[m
[31m-#endif[m
[31m-[m
[31m-	sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0;[m
[31m-	dval(&rv) = 0.;[m
[31m-	for(s = s00;;s++) switch(*s) {[m
[31m-		case '-':[m
[31m-			sign = 1;[m
[31m-			/* no break */[m
[31m-		case '+':[m
[31m-			if (*++s)[m
[31m-				goto break2;[m
[31m-			/* no break */[m
[31m-		case 0:[m
[31m-			goto ret0;[m
[31m-		case '\t':[m
[31m-		case '\n':[m
[31m-		case '\v':[m
[31m-		case '\f':[m
[31m-		case '\r':[m
[31m-		case ' ':[m
[31m-			continue;[m
[31m-		default:[m
[31m-			goto break2;[m
[31m-		}[m
[31m- break2:[m
[31m-	if (*s == '0') {[m
[31m-#ifndef NO_HEX_FP /*{*/[m
[31m-		switch(s[1]) {[m
[31m-		  case 'x':[m
[31m-		  case 'X':[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-			gethex(&s, &rv, bc.rounding, sign);[m
[31m-#else[m
[31m-			gethex(&s, &rv, 1, sign);[m
[31m-#endif[m
[31m-			goto ret;[m
[31m-		  }[m
[31m-#endif /*}*/[m
[31m-		nz0 = 1;[m
[31m-		while(*++s == '0') ;[m
[31m-		if (!*s)[m
[31m-			goto ret;[m
[31m-		}[m
[31m-	s0 = s;[m
[31m-	y = z = 0;[m
[31m-	for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)[m
[31m-		if (nd < 9)[m
[31m-			y = 10*y + c - '0';[m
[31m-		else if (nd < 16)[m
[31m-			z = 10*z + c - '0';[m
[31m-	nd0 = nd;[m
[31m-	bc.dp0 = bc.dp1 = s - s0;[m
[31m-	for(s1 = s; s1 > s0 && *--s1 == '0'; )[m
[31m-		++nz1;[m
[31m-#ifdef USE_LOCALE[m
[31m-	s1 = localeconv()->decimal_point;[m
[31m-	if (c == *s1) {[m
[31m-		c = '.';[m
[31m-		if (*++s1) {[m
[31m-			s2 = s;[m
[31m-			for(;;) {[m
[31m-				if (*++s2 != *s1) {[m
[31m-					c = 0;[m
[31m-					break;[m
[31m-					}[m
[31m-				if (!*++s1) {[m
[31m-					s = s2;[m
[31m-					break;[m
[31m-					}[m
[31m-				}[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m-	if (c == '.') {[m
[31m-		c = *++s;[m
[31m-		bc.dp1 = s - s0;[m
[31m-		bc.dplen = bc.dp1 - bc.dp0;[m
[31m-		if (!nd) {[m
[31m-			for(; c == '0'; c = *++s)[m
[31m-				nz++;[m
[31m-			if (c > '0' && c <= '9') {[m
[31m-				bc.dp0 = s0 - s;[m
[31m-				bc.dp1 = bc.dp0 + bc.dplen;[m
[31m-				s0 = s;[m
[31m-				nf += nz;[m
[31m-				nz = 0;[m
[31m-				goto have_dig;[m
[31m-				}[m
[31m-			goto dig_done;[m
[31m-			}[m
[31m-		for(; c >= '0' && c <= '9'; c = *++s) {[m
[31m- have_dig:[m
[31m-			nz++;[m
[31m-			if (c -= '0') {[m
[31m-				nf += nz;[m
[31m-				for(i = 1; i < nz; i++)[m
[31m-					if (nd++ < 9)[m
[31m-						y *= 10;[m
[31m-					else if (nd <= DBL_DIG + 1)[m
[31m-						z *= 10;[m
[31m-				if (nd++ < 9)[m
[31m-					y = 10*y + c;[m
[31m-				else if (nd <= DBL_DIG + 1)[m
[31m-					z = 10*z + c;[m
[31m-				nz = nz1 = 0;[m
[31m-				}[m
[31m-			}[m
[31m-		}[m
[31m- dig_done:[m
[31m-	e = 0;[m
[31m-	if (c == 'e' || c == 'E') {[m
[31m-		if (!nd && !nz && !nz0) {[m
[31m-			goto ret0;[m
[31m-			}[m
[31m-		s00 = s;[m
[31m-		esign = 0;[m
[31m-		switch(c = *++s) {[m
[31m-			case '-':[m
[31m-				esign = 1;[m
[31m-			case '+':[m
[31m-				c = *++s;[m
[31m-			}[m
[31m-		if (c >= '0' && c <= '9') {[m
[31m-			while(c == '0')[m
[31m-				c = *++s;[m
[31m-			if (c > '0' && c <= '9') {[m
[31m-				L = c - '0';[m
[31m-				s1 = s;[m
[31m-				while((c = *++s) >= '0' && c <= '9')[m
[31m-					L = 10*L + c - '0';[m
[31m-				if (s - s1 > 8 || L > 19999)[m
[31m-					/* Avoid confusion from exponents[m
[31m-					 * so large that e might overflow.[m
[31m-					 */[m
[31m-					e = 19999; /* safe for 16 bit ints */[m
[31m-				else[m
[31m-					e = (int)L;[m
[31m-				if (esign)[m
[31m-					e = -e;[m
[31m-				}[m
[31m-			else[m
[31m-				e = 0;[m
[31m-			}[m
[31m-		else[m
[31m-			s = s00;[m
[31m-		}[m
[31m-	if (!nd) {[m
[31m-		if (!nz && !nz0) {[m
[31m-#ifdef INFNAN_CHECK[m
[31m-			/* Check for Nan and Infinity */[m
[31m-			if (!bc.dplen)[m
[31m-			 switch(c) {[m
[31m-			  case 'i':[m
[31m-			  case 'I':[m
[31m-				if (match(&s,"nf")) {[m
[31m-					--s;[m
[31m-					if (!match(&s,"inity"))[m
[31m-						++s;[m
[31m-					word0(&rv) = 0x7ff00000;[m
[31m-					word1(&rv) = 0;[m
[31m-					goto ret;[m
[31m-					}[m
[31m-				break;[m
[31m-			  case 'n':[m
[31m-			  case 'N':[m
[31m-				if (match(&s, "an")) {[m
[31m-					word0(&rv) = NAN_WORD0;[m
[31m-					word1(&rv) = NAN_WORD1;[m
[31m-#ifndef No_Hex_NaN[m
[31m-					if (*s == '(') /*)*/[m
[31m-						hexnan(&rv, &s);[m
[31m-#endif[m
[31m-					goto ret;[m
[31m-					}[m
[31m-			  }[m
[31m-#endif /* INFNAN_CHECK */[m
[31m- ret0:[m
[31m-			s = s00;[m
[31m-			sign = 0;[m
[31m-			}[m
[31m-		goto ret;[m
[31m-		}[m
[31m-	bc.e0 = e1 = e -= nf;[m
[31m-[m
[31m-	/* Now we have nd0 digits, starting at s0, followed by a[m
[31m-	 * decimal point, followed by nd-nd0 digits.  The number we're[m
[31m-	 * after is the integer represented by those digits times[m
[31m-	 * 10**e */[m
[31m-[m
[31m-	if (!nd0)[m
[31m-		nd0 = nd;[m
[31m-	k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;[m
[31m-	dval(&rv) = y;[m
[31m-	if (k > 9) {[m
[31m-#ifdef SET_INEXACT[m
[31m-		if (k > DBL_DIG)[m
[31m-			oldinexact = get_inexact();[m
[31m-#endif[m
[31m-		dval(&rv) = tens[k - 9] * dval(&rv) + z;[m
[31m-		}[m
[31m-	bd0 = 0;[m
[31m-	if (nd <= DBL_DIG[m
[31m-#ifndef RND_PRODQUOT[m
[31m-#ifndef Honor_FLT_ROUNDS[m
[31m-		&& Flt_Rounds == 1[m
[31m-#endif[m
[31m-#endif[m
[31m-			) {[m
[31m-		if (!e)[m
[31m-			goto ret;[m
[31m-#ifndef ROUND_BIASED_without_Round_Up[m
[31m-		if (e > 0) {[m
[31m-			if (e <= Ten_pmax) {[m
[31m-#ifdef VAX[m
[31m-				goto vax_ovfl_check;[m
[31m-#else[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				/* round correctly FLT_ROUNDS = 2 or 3 */[m
[31m-				if (sign) {[m
[31m-					rv.d = -rv.d;[m
[31m-					sign = 0;[m
[31m-					}[m
[31m-#endif[m
[31m-				/* rv = */ rounded_product(dval(&rv), tens[e]);[m
[31m-				goto ret;[m
[31m-#endif[m
[31m-				}[m
[31m-			i = DBL_DIG - nd;[m
[31m-			if (e <= Ten_pmax + i) {[m
[31m-				/* A fancier test would sometimes let us do[m
[31m-				 * this for larger i values.[m
[31m-				 */[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				/* round correctly FLT_ROUNDS = 2 or 3 */[m
[31m-				if (sign) {[m
[31m-					rv.d = -rv.d;[m
[31m-					sign = 0;[m
[31m-					}[m
[31m-#endif[m
[31m-				e -= i;[m
[31m-				dval(&rv) *= tens[i];[m
[31m-#ifdef VAX[m
[31m-				/* VAX exponent range is so narrow we must[m
[31m-				 * worry about overflow here...[m
[31m-				 */[m
[31m- vax_ovfl_check:[m
[31m-				word0(&rv) -= P*Exp_msk1;[m
[31m-				/* rv = */ rounded_product(dval(&rv), tens[e]);[m
[31m-				if ((word0(&rv) & Exp_mask)[m
[31m-				 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))[m
[31m-					goto ovfl;[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-#else[m
[31m-				/* rv = */ rounded_product(dval(&rv), tens[e]);[m
[31m-#endif[m
[31m-				goto ret;[m
[31m-				}[m
[31m-			}[m
[31m-#ifndef Inaccurate_Divide[m
[31m-		else if (e >= -Ten_pmax) {[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-			/* round correctly FLT_ROUNDS = 2 or 3 */[m
[31m-			if (sign) {[m
[31m-				rv.d = -rv.d;[m
[31m-				sign = 0;[m
[31m-				}[m
[31m-#endif[m
[31m-			/* rv = */ rounded_quotient(dval(&rv), tens[-e]);[m
[31m-			goto ret;[m
[31m-			}[m
[31m-#endif[m
[31m-#endif /* ROUND_BIASED_without_Round_Up */[m
[31m-		}[m
[31m-	e1 += nd - k;[m
[31m-[m
[31m-#ifdef IEEE_Arith[m
[31m-#ifdef SET_INEXACT[m
[31m-	bc.inexact = 1;[m
[31m-	if (k <= DBL_DIG)[m
[31m-		oldinexact = get_inexact();[m
[31m-#endif[m
[31m-#ifdef Avoid_Underflow[m
[31m-	bc.scale = 0;[m
[31m-#endif[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (bc.rounding >= 2) {[m
[31m-		if (sign)[m
[31m-			bc.rounding = bc.rounding == 2 ? 0 : 2;[m
[31m-		else[m
[31m-			if (bc.rounding != 2)[m
[31m-				bc.rounding = 0;[m
[31m-		}[m
[31m-#endif[m
[31m-#endif /*IEEE_Arith*/[m
[31m-[m
[31m-	/* Get starting approximation = rv * 10**e1 */[m
[31m-[m
[31m-	if (e1 > 0) {[m
[31m-		if ((i = e1 & 15))[m
[31m-			dval(&rv) *= tens[i];[m
[31m-		if (e1 &= ~15) {[m
[31m-			if (e1 > DBL_MAX_10_EXP) {[m
[31m- ovfl:[m
[31m-				/* Can't trust HUGE_VAL */[m
[31m-#ifdef IEEE_Arith[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				switch(bc.rounding) {[m
[31m-				  case 0: /* toward 0 */[m
[31m-				  case 3: /* toward -infinity */[m
[31m-					word0(&rv) = Big0;[m
[31m-					word1(&rv) = Big1;[m
[31m-					break;[m
[31m-				  default:[m
[31m-					word0(&rv) = Exp_mask;[m
[31m-					word1(&rv) = 0;[m
[31m-				  }[m
[31m-#else /*Honor_FLT_ROUNDS*/[m
[31m-				word0(&rv) = Exp_mask;[m
[31m-				word1(&rv) = 0;[m
[31m-#endif /*Honor_FLT_ROUNDS*/[m
[31m-#ifdef SET_INEXACT[m
[31m-				/* set overflow bit */[m
[31m-				dval(&rv0) = 1e300;[m
[31m-				dval(&rv0) *= dval(&rv0);[m
[31m-#endif[m
[31m-#else /*IEEE_Arith*/[m
[31m-				word0(&rv) = Big0;[m
[31m-				word1(&rv) = Big1;[m
[31m-#endif /*IEEE_Arith*/[m
[31m- range_err:[m
[31m-				if (bd0) {[m
[31m-					Bfree(bb);[m
[31m-					Bfree(bd);[m
[31m-					Bfree(bs);[m
[31m-					Bfree(bd0);[m
[31m-					Bfree(delta);[m
[31m-					}[m
[31m-#ifndef NO_ERRNO[m
[31m-				errno = ERANGE;[m
[31m-#endif[m
[31m-				goto ret;[m
[31m-				}[m
[31m-			e1 >>= 4;[m
[31m-			for(j = 0; e1 > 1; j++, e1 >>= 1)[m
[31m-				if (e1 & 1)[m
[31m-					dval(&rv) *= bigtens[j];[m
[31m-		/* The last multiplication could overflow. */[m
[31m-			word0(&rv) -= P*Exp_msk1;[m
[31m-			dval(&rv) *= bigtens[j];[m
[31m-			if ((z = word0(&rv) & Exp_mask)[m
[31m-			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))[m
[31m-				goto ovfl;[m
[31m-			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {[m
[31m-				/* set to largest number */[m
[31m-				/* (Can't trust DBL_MAX) */[m
[31m-				word0(&rv) = Big0;[m
[31m-				word1(&rv) = Big1;[m
[31m-				}[m
[31m-			else[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-			}[m
[31m-		}[m
[31m-	else if (e1 < 0) {[m
[31m-		e1 = -e1;[m
[31m-		if ((i = e1 & 15))[m
[31m-			dval(&rv) /= tens[i];[m
[31m-		if (e1 >>= 4) {[m
[31m-			if (e1 >= 1 << n_bigtens)[m
[31m-				goto undfl;[m
[31m-#ifdef Avoid_Underflow[m
[31m-			if (e1 & Scale_Bit)[m
[31m-				bc.scale = 2*P;[m
[31m-			for(j = 0; e1 > 0; j++, e1 >>= 1)[m
[31m-				if (e1 & 1)[m
[31m-					dval(&rv) *= tinytens[j];[m
[31m-			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)[m
[31m-						>> Exp_shift)) > 0) {[m
[31m-				/* scaled rv is denormal; clear j low bits */[m
[31m-				if (j >= 32) {[m
[31m-					if (j > 54)[m
[31m-						goto undfl;[m
[31m-					word1(&rv) = 0;[m
[31m-					if (j >= 53)[m
[31m-					 word0(&rv) = (P+2)*Exp_msk1;[m
[31m-					else[m
[31m-					 word0(&rv) &= 0xffffffff << (j-32);[m
[31m-					}[m
[31m-				else[m
[31m-					word1(&rv) &= 0xffffffff << j;[m
[31m-				}[m
[31m-#else[m
[31m-			for(j = 0; e1 > 1; j++, e1 >>= 1)[m
[31m-				if (e1 & 1)[m
[31m-					dval(&rv) *= tinytens[j];[m
[31m-			/* The last multiplication could underflow. */[m
[31m-			dval(&rv0) = dval(&rv);[m
[31m-			dval(&rv) *= tinytens[j];[m
[31m-			if (!dval(&rv)) {[m
[31m-				dval(&rv) = 2.*dval(&rv0);[m
[31m-				dval(&rv) *= tinytens[j];[m
[31m-#endif[m
[31m-				if (!dval(&rv)) {[m
[31m- undfl:[m
[31m-					dval(&rv) = 0.;[m
[31m-					goto range_err;[m
[31m-					}[m
[31m-#ifndef Avoid_Underflow[m
[31m-				word0(&rv) = Tiny0;[m
[31m-				word1(&rv) = Tiny1;[m
[31m-				/* The refinement below will clean[m
[31m-				 * this approximation up.[m
[31m-				 */[m
[31m-				}[m
[31m-#endif[m
[31m-			}[m
[31m-		}[m
[31m-[m
[31m-	/* Now the hard part -- adjusting rv to the correct value.*/[m
[31m-[m
[31m-	/* Put digits into bd: true value = bd * 10^e */[m
[31m-[m
[31m-	bc.nd = nd - nz1;[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m-	bc.nd0 = nd0;	/* Only needed if nd > strtod_diglim, but done here */[m
[31m-			/* to silence an erroneous warning about bc.nd0 */[m
[31m-			/* possibly not being initialized. */[m
[31m-	if (nd > strtod_diglim) {[m
[31m-		/* ASSERT(strtod_diglim >= 18); 18 == one more than the */[m
[31m-		/* minimum number of decimal digits to distinguish double values */[m
[31m-		/* in IEEE arithmetic. */[m
[31m-		i = j = 18;[m
[31m-		if (i > nd0)[m
[31m-			j += bc.dplen;[m
[31m-		for(;;) {[m
[31m-			if (--j < bc.dp1 && j >= bc.dp0)[m
[31m-				j = bc.dp0 - 1;[m
[31m-			if (s0[j] != '0')[m
[31m-				break;[m
[31m-			--i;[m
[31m-			}[m
[31m-		e += nd - i;[m
[31m-		nd = i;[m
[31m-		if (nd0 > nd)[m
[31m-			nd0 = nd;[m
[31m-		if (nd < 9) { /* must recompute y */[m
[31m-			y = 0;[m
[31m-			for(i = 0; i < nd0; ++i)[m
[31m-				y = 10*y + s0[i] - '0';[m
[31m-			for(j = bc.dp1; i < nd; ++i)[m
[31m-				y = 10*y + s0[j++] - '0';[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m-	bd0 = s2b(s0, nd0, nd, y, bc.dplen);[m
[31m-[m
[31m-	for(;;) {[m
[31m-		bd = Balloc(bd0->k);[m
[31m-		Bcopy(bd, bd0);[m
[31m-		bb = d2b(&rv, &bbe, &bbbits);	/* rv = bb * 2^bbe */[m
[31m-		bs = i2b(1);[m
[31m-[m
[31m-		if (e >= 0) {[m
[31m-			bb2 = bb5 = 0;[m
[31m-			bd2 = bd5 = e;[m
[31m-			}[m
[31m-		else {[m
[31m-			bb2 = bb5 = -e;[m
[31m-			bd2 = bd5 = 0;[m
[31m-			}[m
[31m-		if (bbe >= 0)[m
[31m-			bb2 += bbe;[m
[31m-		else[m
[31m-			bd2 -= bbe;[m
[31m-		bs2 = bb2;[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-		if (bc.rounding != 1)[m
[31m-			bs2++;[m
[31m-#endif[m
[31m-#ifdef Avoid_Underflow[m
[31m-		Lsb = LSB;[m
[31m-		Lsb1 = 0;[m
[31m-		j = bbe - bc.scale;[m
[31m-		i = j + bbbits - 1;	/* logb(rv) */[m
[31m-		j = P + 1 - bbbits;[m
[31m-		if (i < Emin) {	/* denormal */[m
[31m-			i = Emin - i;[m
[31m-			j -= i;[m
[31m-			if (i < 32)[m
[31m-				Lsb <<= i;[m
[31m-			else if (i < 52)[m
[31m-				Lsb1 = Lsb << (i-32);[m
[31m-			else[m
[31m-				Lsb1 = Exp_mask;[m
[31m-			}[m
[31m-#else /*Avoid_Underflow*/[m
[31m-#ifdef Sudden_Underflow[m
[31m-#ifdef IBM[m
[31m-		j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);[m
[31m-#else[m
[31m-		j = P + 1 - bbbits;[m
[31m-#endif[m
[31m-#else /*Sudden_Underflow*/[m
[31m-		j = bbe;[m
[31m-		i = j + bbbits - 1;	/* logb(rv) */[m
[31m-		if (i < Emin)	/* denormal */[m
[31m-			j += P - Emin;[m
[31m-		else[m
[31m-			j = P + 1 - bbbits;[m
[31m-#endif /*Sudden_Underflow*/[m
[31m-#endif /*Avoid_Underflow*/[m
[31m-		bb2 += j;[m
[31m-		bd2 += j;[m
[31m-#ifdef Avoid_Underflow[m
[31m-		bd2 += bc.scale;[m
[31m-#endif[m
[31m-		i = bb2 < bd2 ? bb2 : bd2;[m
[31m-		if (i > bs2)[m
[31m-			i = bs2;[m
[31m-		if (i > 0) {[m
[31m-			bb2 -= i;[m
[31m-			bd2 -= i;[m
[31m-			bs2 -= i;[m
[31m-			}[m
[31m-		if (bb5 > 0) {[m
[31m-			bs = pow5mult(bs, bb5);[m
[31m-			bb1 = mult(bs, bb);[m
[31m-			Bfree(bb);[m
[31m-			bb = bb1;[m
[31m-			}[m
[31m-		if (bb2 > 0)[m
[31m-			bb = lshift(bb, bb2);[m
[31m-		if (bd5 > 0)[m
[31m-			bd = pow5mult(bd, bd5);[m
[31m-		if (bd2 > 0)[m
[31m-			bd = lshift(bd, bd2);[m
[31m-		if (bs2 > 0)[m
[31m-			bs = lshift(bs, bs2);[m
[31m-		delta = diff(bb, bd);[m
[31m-		bc.dsign = delta->sign;[m
[31m-		delta->sign = 0;[m
[31m-		i = cmp(delta, bs);[m
[31m-#ifndef NO_STRTOD_BIGCOMP /*{*/[m
[31m-		if (bc.nd > nd && i <= 0) {[m
[31m-			if (bc.dsign) {[m
[31m-				/* Must use bigcomp(). */[m
[31m-				req_bigcomp = 1;[m
[31m-				break;[m
[31m-				}[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-			if (bc.rounding != 1) {[m
[31m-				if (i < 0) {[m
[31m-					req_bigcomp = 1;[m
[31m-					break;[m
[31m-					}[m
[31m-				}[m
[31m-			else[m
[31m-#endif[m
[31m-				i = -1;	/* Discarded digits make delta smaller. */[m
[31m-			}[m
[31m-#endif /*}*/[m
[31m-#ifdef Honor_FLT_ROUNDS /*{*/[m
[31m-		if (bc.rounding != 1) {[m
[31m-			if (i < 0) {[m
[31m-				/* Error is less than an ulp */[m
[31m-				if (!delta->x[0] && delta->wds <= 1) {[m
[31m-					/* exact */[m
[31m-#ifdef SET_INEXACT[m
[31m-					bc.inexact = 0;[m
[31m-#endif[m
[31m-					break;[m
[31m-					}[m
[31m-				if (bc.rounding) {[m
[31m-					if (bc.dsign) {[m
[31m-						adj.d = 1.;[m
[31m-						goto apply_adj;[m
[31m-						}[m
[31m-					}[m
[31m-				else if (!bc.dsign) {[m
[31m-					adj.d = -1.;[m
[31m-					if (!word1(&rv)[m
[31m-					 && !(word0(&rv) & Frac_mask)) {[m
[31m-						y = word0(&rv) & Exp_mask;[m
[31m-#ifdef Avoid_Underflow[m
[31m-						if (!bc.scale || y > 2*P*Exp_msk1)[m
[31m-#else[m
[31m-						if (y)[m
[31m-#endif[m
[31m-						  {[m
[31m-						  delta = lshift(delta,Log2P);[m
[31m-						  if (cmp(delta, bs) <= 0)[m
[31m-							adj.d = -0.5;[m
[31m-						  }[m
[31m-						}[m
[31m- apply_adj:[m
[31m-#ifdef Avoid_Underflow /*{*/[m
[31m-					if (bc.scale && (y = word0(&rv) & Exp_mask)[m
[31m-						<= 2*P*Exp_msk1)[m
[31m-					  word0(&adj) += (2*P+1)*Exp_msk1 - y;[m
[31m-#else[m
[31m-#ifdef Sudden_Underflow[m
[31m-					if ((word0(&rv) & Exp_mask) <=[m
[31m-							P*Exp_msk1) {[m
[31m-						word0(&rv) += P*Exp_msk1;[m
[31m-						dval(&rv) += adj.d*ulp(dval(&rv));[m
[31m-						word0(&rv) -= P*Exp_msk1;[m
[31m-						}[m
[31m-					else[m
[31m-#endif /*Sudden_Underflow*/[m
[31m-#endif /*Avoid_Underflow}*/[m
[31m-					dval(&rv) += adj.d*ulp(&rv);[m
[31m-					}[m
[31m-				break;[m
[31m-				}[m
[31m-			adj.d = ratio(delta, bs);[m
[31m-			if (adj.d < 1.)[m
[31m-				adj.d = 1.;[m
[31m-			if (adj.d <= 0x7ffffffe) {[m
[31m-				/* adj = rounding ? ceil(adj) : floor(adj); */[m
[31m-				y = adj.d;[m
[31m-				if (y != adj.d) {[m
[31m-					if (!((bc.rounding>>1) ^ bc.dsign))[m
[31m-						y++;[m
[31m-					adj.d = y;[m
[31m-					}[m
[31m-				}[m
[31m-#ifdef Avoid_Underflow /*{*/[m
[31m-			if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)[m
[31m-				word0(&adj) += (2*P+1)*Exp_msk1 - y;[m
[31m-#else[m
[31m-#ifdef Sudden_Underflow[m
[31m-			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-				adj.d *= ulp(dval(&rv));[m
[31m-				if (bc.dsign)[m
[31m-					dval(&rv) += adj.d;[m
[31m-				else[m
[31m-					dval(&rv) -= adj.d;[m
[31m-				word0(&rv) -= P*Exp_msk1;[m
[31m-				goto cont;[m
[31m-				}[m
[31m-#endif /*Sudden_Underflow*/[m
[31m-#endif /*Avoid_Underflow}*/[m
[31m-			adj.d *= ulp(&rv);[m
[31m-			if (bc.dsign) {[m
[31m-				if (word0(&rv) == Big0 && word1(&rv) == Big1)[m
[31m-					goto ovfl;[m
[31m-				dval(&rv) += adj.d;[m
[31m-				}[m
[31m-			else[m
[31m-				dval(&rv) -= adj.d;[m
[31m-			goto cont;[m
[31m-			}[m
[31m-#endif /*}Honor_FLT_ROUNDS*/[m
[31m-[m
[31m-		if (i < 0) {[m
[31m-			/* Error is less than half an ulp -- check for[m
[31m-			 * special case of mantissa a power of two.[m
[31m-			 */[m
[31m-			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask[m
[31m-#ifdef IEEE_Arith /*{*/[m
[31m-#ifdef Avoid_Underflow[m
[31m-			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1[m
[31m-#else[m
[31m-			 || (word0(&rv) & Exp_mask) <= Exp_msk1[m
[31m-#endif[m
[31m-#endif /*}*/[m
[31m-				) {[m
[31m-#ifdef SET_INEXACT[m
[31m-				if (!delta->x[0] && delta->wds <= 1)[m
[31m-					bc.inexact = 0;[m
[31m-#endif[m
[31m-				break;[m
[31m-				}[m
[31m-			if (!delta->x[0] && delta->wds <= 1) {[m
[31m-				/* exact result */[m
[31m-#ifdef SET_INEXACT[m
[31m-				bc.inexact = 0;[m
[31m-#endif[m
[31m-				break;[m
[31m-				}[m
[31m-			delta = lshift(delta,Log2P);[m
[31m-			if (cmp(delta, bs) > 0)[m
[31m-				goto drop_down;[m
[31m-			break;[m
[31m-			}[m
[31m-		if (i == 0) {[m
[31m-			/* exactly half-way between */[m
[31m-			if (bc.dsign) {[m
[31m-				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1[m
[31m-				 &&  word1(&rv) == ([m
[31m-#ifdef Avoid_Underflow[m
[31m-			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)[m
[31m-		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :[m
[31m-#endif[m
[31m-						   0xffffffff)) {[m
[31m-					/*boundary case -- increment exponent*/[m
[31m-					if (word0(&rv) == Big0 && word1(&rv) == Big1)[m
[31m-						goto ovfl;[m
[31m-					word0(&rv) = (word0(&rv) & Exp_mask)[m
[31m-						+ Exp_msk1[m
[31m-#ifdef IBM[m
[31m-						| Exp_msk1 >> 4[m
[31m-#endif[m
[31m-						;[m
[31m-					word1(&rv) = 0;[m
[31m-#ifdef Avoid_Underflow[m
[31m-					bc.dsign = 0;[m
[31m-#endif[m
[31m-					break;[m
[31m-					}[m
[31m-				}[m
[31m-			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {[m
[31m- drop_down:[m
[31m-				/* boundary case -- decrement exponent */[m
[31m-#ifdef Sudden_Underflow /*{{*/[m
[31m-				L = word0(&rv) & Exp_mask;[m
[31m-#ifdef IBM[m
[31m-				if (L <  Exp_msk1)[m
[31m-#else[m
[31m-#ifdef Avoid_Underflow[m
[31m-				if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1))[m
[31m-#else[m
[31m-				if (L <= Exp_msk1)[m
[31m-#endif /*Avoid_Underflow*/[m
[31m-#endif /*IBM*/[m
[31m-					{[m
[31m-					if (bc.nd >nd) {[m
[31m-						bc.uflchk = 1;[m
[31m-						break;[m
[31m-						}[m
[31m-					goto undfl;[m
[31m-					}[m
[31m-				L -= Exp_msk1;[m
[31m-#else /*Sudden_Underflow}{*/[m
[31m-#ifdef Avoid_Underflow[m
[31m-				if (bc.scale) {[m
[31m-					L = word0(&rv) & Exp_mask;[m
[31m-					if (L <= (2*P+1)*Exp_msk1) {[m
[31m-						if (L > (P+2)*Exp_msk1)[m
[31m-							/* round even ==> */[m
[31m-							/* accept rv */[m
[31m-							break;[m
[31m-						/* rv = smallest denormal */[m
[31m-						if (bc.nd >nd) {[m
[31m-							bc.uflchk = 1;[m
[31m-							break;[m
[31m-							}[m
[31m-						goto undfl;[m
[31m-						}[m
[31m-					}[m
[31m-#endif /*Avoid_Underflow*/[m
[31m-				L = (word0(&rv) & Exp_mask) - Exp_msk1;[m
[31m-#endif /*Sudden_Underflow}}*/[m
[31m-				word0(&rv) = L | Bndry_mask1;[m
[31m-				word1(&rv) = 0xffffffff;[m
[31m-#ifdef IBM[m
[31m-				goto cont;[m
[31m-#else[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m-				if (bc.nd > nd)[m
[31m-					goto cont;[m
[31m-#endif[m
[31m-				break;[m
[31m-#endif[m
[31m-				}[m
[31m-#ifndef ROUND_BIASED[m
[31m-#ifdef Avoid_Underflow[m
[31m-			if (Lsb1) {[m
[31m-				if (!(word0(&rv) & Lsb1))[m
[31m-					break;[m
[31m-				}[m
[31m-			else if (!(word1(&rv) & Lsb))[m
[31m-				break;[m
[31m-#else[m
[31m-			if (!(word1(&rv) & LSB))[m
[31m-				break;[m
[31m-#endif[m
[31m-#endif[m
[31m-			if (bc.dsign)[m
[31m-#ifdef Avoid_Underflow[m
[31m-				dval(&rv) += sulp(&rv, &bc);[m
[31m-#else[m
[31m-				dval(&rv) += ulp(&rv);[m
[31m-#endif[m
[31m-#ifndef ROUND_BIASED[m
[31m-			else {[m
[31m-#ifdef Avoid_Underflow[m
[31m-				dval(&rv) -= sulp(&rv, &bc);[m
[31m-#else[m
[31m-				dval(&rv) -= ulp(&rv);[m
[31m-#endif[m
[31m-#ifndef Sudden_Underflow[m
[31m-				if (!dval(&rv)) {[m
[31m-					if (bc.nd >nd) {[m
[31m-						bc.uflchk = 1;[m
[31m-						break;[m
[31m-						}[m
[31m-					goto undfl;[m
[31m-					}[m
[31m-#endif[m
[31m-				}[m
[31m-#ifdef Avoid_Underflow[m
[31m-			bc.dsign = 1 - bc.dsign;[m
[31m-#endif[m
[31m-#endif[m
[31m-			break;[m
[31m-			}[m
[31m-		if ((aadj = ratio(delta, bs)) <= 2.) {[m
[31m-			if (bc.dsign)[m
[31m-				aadj = aadj1 = 1.;[m
[31m-			else if (word1(&rv) || word0(&rv) & Bndry_mask) {[m
[31m-#ifndef Sudden_Underflow[m
[31m-				if (word1(&rv) == Tiny1 && !word0(&rv)) {[m
[31m-					if (bc.nd >nd) {[m
[31m-						bc.uflchk = 1;[m
[31m-						break;[m
[31m-						}[m
[31m-					goto undfl;[m
[31m-					}[m
[31m-#endif[m
[31m-				aadj = 1.;[m
[31m-				aadj1 = -1.;[m
[31m-				}[m
[31m-			else {[m
[31m-				/* special case -- power of FLT_RADIX to be */[m
[31m-				/* rounded down... */[m
[31m-[m
[31m-				if (aadj < 2./FLT_RADIX)[m
[31m-					aadj = 1./FLT_RADIX;[m
[31m-				else[m
[31m-					aadj *= 0.5;[m
[31m-				aadj1 = -aadj;[m
[31m-				}[m
[31m-			}[m
[31m-		else {[m
[31m-			aadj *= 0.5;[m
[31m-			aadj1 = bc.dsign ? aadj : -aadj;[m
[31m-#ifdef Check_FLT_ROUNDS[m
[31m-			switch(bc.rounding) {[m
[31m-				case 2: /* towards +infinity */[m
[31m-					aadj1 -= 0.5;[m
[31m-					break;[m
[31m-				case 0: /* towards 0 */[m
[31m-				case 3: /* towards -infinity */[m
[31m-					aadj1 += 0.5;[m
[31m-				}[m
[31m-#else[m
[31m-			if (Flt_Rounds == 0)[m
[31m-				aadj1 += 0.5;[m
[31m-#endif /*Check_FLT_ROUNDS*/[m
[31m-			}[m
[31m-		y = word0(&rv) & Exp_mask;[m
[31m-[m
[31m-		/* Check for overflow */[m
[31m-[m
[31m-		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {[m
[31m-			dval(&rv0) = dval(&rv);[m
[31m-			word0(&rv) -= P*Exp_msk1;[m
[31m-			adj.d = aadj1 * ulp(&rv);[m
[31m-			dval(&rv) += adj.d;[m
[31m-			if ((word0(&rv) & Exp_mask) >=[m
[31m-					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {[m
[31m-				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)[m
[31m-					goto ovfl;[m
[31m-				word0(&rv) = Big0;[m
[31m-				word1(&rv) = Big1;[m
[31m-				goto cont;[m
[31m-				}[m
[31m-			else[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-			}[m
[31m-		else {[m
[31m-#ifdef Avoid_Underflow[m
[31m-			if (bc.scale && y <= 2*P*Exp_msk1) {[m
[31m-				if (aadj <= 0x7fffffff) {[m
[31m-					if ((z = aadj) <= 0)[m
[31m-						z = 1;[m
[31m-					aadj = z;[m
[31m-					aadj1 = bc.dsign ? aadj : -aadj;[m
[31m-					}[m
[31m-				dval(&aadj2) = aadj1;[m
[31m-				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;[m
[31m-				aadj1 = dval(&aadj2);[m
[31m-				adj.d = aadj1 * ulp(&rv);[m
[31m-				dval(&rv) += adj.d;[m
[31m-				if (rv.d == 0.)[m
[31m-#ifdef NO_STRTOD_BIGCOMP[m
[31m-					goto undfl;[m
[31m-#else[m
[31m-					{[m
[31m-					if (bc.nd > nd)[m
[31m-						bc.dsign = 1;[m
[31m-					break;[m
[31m-					}[m
[31m-#endif[m
[31m-				}[m
[31m-			else {[m
[31m-				adj.d = aadj1 * ulp(&rv);[m
[31m-				dval(&rv) += adj.d;[m
[31m-				}[m
[31m-#else[m
[31m-#ifdef Sudden_Underflow[m
[31m-			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {[m
[31m-				dval(&rv0) = dval(&rv);[m
[31m-				word0(&rv) += P*Exp_msk1;[m
[31m-				adj.d = aadj1 * ulp(&rv);[m
[31m-				dval(&rv) += adj.d;[m
[31m-#ifdef IBM[m
[31m-				if ((word0(&rv) & Exp_mask) <  P*Exp_msk1)[m
[31m-#else[m
[31m-				if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)[m
[31m-#endif[m
[31m-					{[m
[31m-					if (word0(&rv0) == Tiny0[m
[31m-					 && word1(&rv0) == Tiny1) {[m
[31m-						if (bc.nd >nd) {[m
[31m-							bc.uflchk = 1;[m
[31m-							break;[m
[31m-							}[m
[31m-						goto undfl;[m
[31m-						}[m
[31m-					word0(&rv) = Tiny0;[m
[31m-					word1(&rv) = Tiny1;[m
[31m-					goto cont;[m
[31m-					}[m
[31m-				else[m
[31m-					word0(&rv) -= P*Exp_msk1;[m
[31m-				}[m
[31m-			else {[m
[31m-				adj.d = aadj1 * ulp(&rv);[m
[31m-				dval(&rv) += adj.d;[m
[31m-				}[m
[31m-#else /*Sudden_Underflow*/[m
[31m-			/* Compute adj so that the IEEE rounding rules will[m
[31m-			 * correctly round rv + adj in some half-way cases.[m
[31m-			 * If rv * ulp(rv) is denormalized (i.e.,[m
[31m-			 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid[m
[31m-			 * trouble from bits lost to denormalization;[m
[31m-			 * example: 1.2e-307 .[m
[31m-			 */[m
[31m-			if (y <= (P-1)*Exp_msk1 && aadj > 1.) {[m
[31m-				aadj1 = (double)(int)(aadj + 0.5);[m
[31m-				if (!bc.dsign)[m
[31m-					aadj1 = -aadj1;[m
[31m-				}[m
[31m-			adj.d = aadj1 * ulp(&rv);[m
[31m-			dval(&rv) += adj.d;[m
[31m-#endif /*Sudden_Underflow*/[m
[31m-#endif /*Avoid_Underflow*/[m
[31m-			}[m
[31m-		z = word0(&rv) & Exp_mask;[m
[31m-#ifndef SET_INEXACT[m
[31m-		if (bc.nd == nd) {[m
[31m-#ifdef Avoid_Underflow[m
[31m-		if (!bc.scale)[m
[31m-#endif[m
[31m-		if (y == z) {[m
[31m-			/* Can we stop now? */[m
[31m-			L = (Long)aadj;[m
[31m-			aadj -= L;[m
[31m-			/* The tolerances below are conservative. */[m
[31m-			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {[m
[31m-				if (aadj < .4999999 || aadj > .5000001)[m
[31m-					break;[m
[31m-				}[m
[31m-			else if (aadj < .4999999/FLT_RADIX)[m
[31m-				break;[m
[31m-			}[m
[31m-		}[m
[31m-#endif[m
[31m- cont:[m
[31m-		Bfree(bb);[m
[31m-		Bfree(bd);[m
[31m-		Bfree(bs);[m
[31m-		Bfree(delta);[m
[31m-		}[m
[31m-	Bfree(bb);[m
[31m-	Bfree(bd);[m
[31m-	Bfree(bs);[m
[31m-	Bfree(bd0);[m
[31m-	Bfree(delta);[m
[31m-#ifndef NO_STRTOD_BIGCOMP[m
[31m-	if (req_bigcomp) {[m
[31m-		bd0 = 0;[m
[31m-		bc.e0 += nz1;[m
[31m-		bigcomp(&rv, s0, &bc);[m
[31m-		y = word0(&rv) & Exp_mask;[m
[31m-		if (y == Exp_mask)[m
[31m-			goto ovfl;[m
[31m-		if (y == 0 && rv.d == 0.)[m
[31m-			goto undfl;[m
[31m-		}[m
[31m-#endif[m
[31m-#ifdef SET_INEXACT[m
[31m-	if (bc.inexact) {[m
[31m-		if (!oldinexact) {[m
[31m-			word0(&rv0) = Exp_1 + (70 << Exp_shift);[m
[31m-			word1(&rv0) = 0;[m
[31m-			dval(&rv0) += 1.;[m
[31m-			}[m
[31m-		}[m
[31m-	else if (!oldinexact)[m
[31m-		clear_inexact();[m
[31m-#endif[m
[31m-#ifdef Avoid_Underflow[m
[31m-	if (bc.scale) {[m
[31m-		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;[m
[31m-		word1(&rv0) = 0;[m
[31m-		dval(&rv) *= dval(&rv0);[m
[31m-#ifndef NO_ERRNO[m
[31m-		/* try to avoid the bug of testing an 8087 register value */[m
[31m-#ifdef IEEE_Arith[m
[31m-		if (!(word0(&rv) & Exp_mask))[m
[31m-#else[m
[31m-		if (word0(&rv) == 0 && word1(&rv) == 0)[m
[31m-#endif[m
[31m-			errno = ERANGE;[m
[31m-#endif[m
[31m-		}[m
[31m-#endif /* Avoid_Underflow */[m
[31m-#ifdef SET_INEXACT[m
[31m-	if (bc.inexact && !(word0(&rv) & Exp_mask)) {[m
[31m-		/* set underflow bit */[m
[31m-		dval(&rv0) = 1e-300;[m
[31m-		dval(&rv0) *= dval(&rv0);[m
[31m-		}[m
[31m-#endif[m
[31m- ret:[m
[31m-	if (se)[m
[31m-		*se = (char *)s;[m
[31m-	return sign ? -dval(&rv) : dval(&rv);[m
[31m-	}[m
[31m-[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m- static char *dtoa_result;[m
[31m-#endif[m
[31m-[m
[31m- static char *[m
[31m-#ifdef KR_headers[m
[31m-rv_alloc(i) int i;[m
[31m-#else[m
[31m-rv_alloc(int i)[m
[31m-#endif[m
[31m-{[m
[31m-	int j, k, *r;[m
[31m-[m
[31m-	j = sizeof(ULong);[m
[31m-	for(k = 0;[m
[31m-		sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i;[m
[31m-		j <<= 1)[m
[31m-			k++;[m
[31m-	r = (int*)Balloc(k);[m
[31m-	*r = k;[m
[31m-	return[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m-	dtoa_result =[m
[31m-#endif[m
[31m-		(char *)(r+1);[m
[31m-	}[m
[31m-[m
[31m- static char *[m
[31m-#ifdef KR_headers[m
[31m-nrv_alloc(s, rve, n) char *s, **rve; int n;[m
[31m-#else[m
[31m-nrv_alloc(const char *s, char **rve, int n)[m
[31m-#endif[m
[31m-{[m
[31m-	char *rv, *t;[m
[31m-[m
[31m-	t = rv = rv_alloc(n);[m
[31m-	while((*t = *s++)) t++;[m
[31m-	if (rve)[m
[31m-		*rve = t;[m
[31m-	return rv;[m
[31m-	}[m
[31m-[m
[31m-/* freedtoa(s) must be used to free values s returned by dtoa[m
[31m- * when MULTIPLE_THREADS is #defined.  It should be used in all cases,[m
[31m- * but for consistency with earlier versions of dtoa, it is optional[m
[31m- * when MULTIPLE_THREADS is not defined.[m
[31m- */[m
[31m-[m
[31m- void[m
[31m-#ifdef KR_headers[m
[31m-freedtoa(s) char *s;[m
[31m-#else[m
[31m-freedtoa(char *s)[m
[31m-#endif[m
[31m-{[m
[31m-	Bigint *b = (Bigint *)((int *)s - 1);[m
[31m-	b->maxwds = 1 << (b->k = *(int*)b);[m
[31m-	Bfree(b);[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m-	if (s == dtoa_result)[m
[31m-		dtoa_result = 0;[m
[31m-#endif[m
[31m-	}[m
[31m-[m
[31m-/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.[m
[31m- *[m
[31m- * Inspired by "How to Print Floating-Point Numbers Accurately" by[m
[31m- * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].[m
[31m- *[m
[31m- * Modifications:[m
[31m- *	1. Rather than iterating, we use a simple numeric overestimate[m
[31m- *	   to determine k = floor(log10(d)).  We scale relevant[m
[31m- *	   quantities using O(log2(k)) rather than O(k) multiplications.[m
[31m- *	2. For some modes > 2 (corresponding to ecvt and fcvt), we don't[m
[31m- *	   try to generate digits strictly left to right.  Instead, we[m
[31m- *	   compute with fewer bits and propagate the carry if necessary[m
[31m- *	   when rounding the final digit up.  This is often faster.[m
[31m- *	3. Under the assumption that input will be rounded nearest,[m
[31m- *	   mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.[m
[31m- *	   That is, we allow equality in stopping tests when the[m
[31m- *	   round-nearest rule will give the same floating-point value[m
[31m- *	   as would satisfaction of the stopping test with strict[m
[31m- *	   inequality.[m
[31m- *	4. We remove common factors of powers of 2 from relevant[m
[31m- *	   quantities.[m
[31m- *	5. When converting floating-point integers less than 1e16,[m
[31m- *	   we use floating-point arithmetic rather than resorting[m
[31m- *	   to multiple-precision integers.[m
[31m- *	6. When asked to produce fewer than 15 digits, we first try[m
[31m- *	   to get by with floating-point arithmetic; we resort to[m
[31m- *	   multiple-precision integer arithmetic only if we cannot[m
[31m- *	   guarantee that the floating-point calculation has given[m
[31m- *	   the correctly rounded result.  For k requested digits and[m
[31m- *	   "uniformly" distributed input, the probability is[m
[31m- *	   something like 10^(k-15) that we must resort to the Long[m
[31m- *	   calculation.[m
[31m- */[m
[31m-[m
[31m- char *[m
[31m-dtoa[m
[31m-#ifdef KR_headers[m
[31m-	(dd, mode, ndigits, decpt, sign, rve)[m
[31m-	double dd; int mode, ndigits, *decpt, *sign; char **rve;[m
[31m-#else[m
[31m-	(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)[m
[31m-#endif[m
[31m-{[m
[31m- /*	Arguments ndigits, decpt, sign are similar to those[m
[31m-	of ecvt and fcvt; trailing zeros are suppressed from[m
[31m-	the returned string.  If not null, *rve is set to point[m
[31m-	to the end of the return value.  If d is +-Infinity or NaN,[m
[31m-	then *decpt is set to 9999.[m
[31m-[m
[31m-	mode:[m
[31m-		0 ==> shortest string that yields d when read in[m
[31m-			and rounded to nearest.[m
[31m-		1 ==> like 0, but with Steele & White stopping rule;[m
[31m-			e.g. with IEEE P754 arithmetic , mode 0 gives[m
[31m-			1e23 whereas mode 1 gives 9.999999999999999e22.[m
[31m-		2 ==> max(1,ndigits) significant digits.  This gives a[m
[31m-			return value similar to that of ecvt, except[m
[31m-			that trailing zeros are suppressed.[m
[31m-		3 ==> through ndigits past the decimal point.  This[m
[31m-			gives a return value similar to that from fcvt,[m
[31m-			except that trailing zeros are suppressed, and[m
[31m-			ndigits can be negative.[m
[31m-		4,5 ==> similar to 2 and 3, respectively, but (in[m
[31m-			round-nearest mode) with the tests of mode 0 to[m
[31m-			possibly return a shorter string that rounds to d.[m
[31m-			With IEEE arithmetic and compilation with[m
[31m-			-DHonor_FLT_ROUNDS, modes 4 and 5 behave the same[m
[31m-			as modes 2 and 3 when FLT_ROUNDS != 1.[m
[31m-		6-9 ==> Debugging modes similar to mode - 4:  don't try[m
[31m-			fast floating-point estimate (if applicable).[m
[31m-[m
[31m-		Values of mode other than 0-9 are treated as mode 0.[m
[31m-[m
[31m-		Sufficient space is allocated to the return value[m
[31m-		to hold the suppressed trailing zeros.[m
[31m-	*/[m
[31m-[m
[31m-	int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,[m
[31m-		j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,[m
[31m-		spec_case, try_quick;[m
[31m-	Long L;[m
[31m-#ifndef Sudden_Underflow[m
[31m-	int denorm;[m
[31m-	ULong x;[m
[31m-#endif[m
[31m-	Bigint *b, *b1, *delta, *mlo, *mhi, *S;[m
[31m-	U d2, eps, u;[m
[31m-	double ds;[m
[31m-	char *s, *s0;[m
[31m-#ifndef No_leftright[m
[31m-#ifdef IEEE_Arith[m
[31m-	U eps1;[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef SET_INEXACT[m
[31m-	int inexact, oldinexact;[m
[31m-#endif[m
[31m-#ifdef Honor_FLT_ROUNDS /*{*/[m
[31m-	int Rounding;[m
[31m-#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */[m
[31m-	Rounding = Flt_Rounds;[m
[31m-#else /*}{*/[m
[31m-	Rounding = 1;[m
[31m-	switch(fegetround()) {[m
[31m-	  case FE_TOWARDZERO:	Rounding = 0; break;[m
[31m-	  case FE_UPWARD:	Rounding = 2; break;[m
[31m-	  case FE_DOWNWARD:	Rounding = 3;[m
[31m-	  }[m
[31m-#endif /*}}*/[m
[31m-#endif /*}*/[m
[31m-[m
[31m-#ifndef MULTIPLE_THREADS[m
[31m-	if (dtoa_result) {[m
[31m-		freedtoa(dtoa_result);[m
[31m-		dtoa_result = 0;[m
[31m-		}[m
[31m-#endif[m
[31m-[m
[31m-	u.d = dd;[m
[31m-	if (word0(&u) & Sign_bit) {[m
[31m-		/* set sign for everything, including 0's and NaNs */[m
[31m-		*sign = 1;[m
[31m-		word0(&u) &= ~Sign_bit;	/* clear sign bit */[m
[31m-		}[m
[31m-	else[m
[31m-		*sign = 0;[m
[31m-[m
[31m-#if defined(IEEE_Arith) + defined(VAX)[m
[31m-#ifdef IEEE_Arith[m
[31m-	if ((word0(&u) & Exp_mask) == Exp_mask)[m
[31m-#else[m
[31m-	if (word0(&u)  == 0x8000)[m
[31m-#endif[m
[31m-		{[m
[31m-		/* Infinity or NaN */[m
[31m-		*decpt = 9999;[m
[31m-#ifdef IEEE_Arith[m
[31m-		if (!word1(&u) && !(word0(&u) & 0xfffff))[m
[31m-			return nrv_alloc("Infinity", rve, 8);[m
[31m-#endif[m
[31m-		return nrv_alloc("NaN", rve, 3);[m
[31m-		}[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-	dval(&u) += 0; /* normalize */[m
[31m-#endif[m
[31m-	if (!dval(&u)) {[m
[31m-		*decpt = 1;[m
[31m-		return nrv_alloc("0", rve, 1);[m
[31m-		}[m
[31m-[m
[31m-#ifdef SET_INEXACT[m
[31m-	try_quick = oldinexact = get_inexact();[m
[31m-	inexact = 1;[m
[31m-#endif[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (Rounding >= 2) {[m
[31m-		if (*sign)[m
[31m-			Rounding = Rounding == 2 ? 0 : 2;[m
[31m-		else[m
[31m-			if (Rounding != 2)[m
[31m-				Rounding = 0;[m
[31m-		}[m
[31m-#endif[m
[31m-[m
[31m-	b = d2b(&u, &be, &bbits);[m
[31m-#ifdef Sudden_Underflow[m
[31m-	i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));[m
[31m-#else[m
[31m-	if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {[m
[31m-#endif[m
[31m-		dval(&d2) = dval(&u);[m
[31m-		word0(&d2) &= Frac_mask1;[m
[31m-		word0(&d2) |= Exp_11;[m
[31m-#ifdef IBM[m
[31m-		if (j = 11 - hi0bits(word0(&d2) & Frac_mask))[m
[31m-			dval(&d2) /= 1 << j;[m
[31m-#endif[m
[31m-[m
[31m-		/* log(x)	~=~ log(1.5) + (x-1.5)/1.5[m
[31m-		 * log10(x)	 =  log(x) / log(10)[m
[31m-		 *		~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))[m
[31m-		 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)[m
[31m-		 *[m
[31m-		 * This suggests computing an approximation k to log10(d) by[m
[31m-		 *[m
[31m-		 * k = (i - Bias)*0.301029995663981[m
[31m-		 *	+ ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );[m
[31m-		 *[m
[31m-		 * We want k to be too large rather than too small.[m
[31m-		 * The error in the first-order Taylor series approximation[m
[31m-		 * is in our favor, so we just round up the constant enough[m
[31m-		 * to compensate for any error in the multiplication of[m
[31m-		 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,[m
[31m-		 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,[m
[31m-		 * adding 1e-13 to the constant term more than suffices.[m
[31m-		 * Hence we adjust the constant term to 0.1760912590558.[m
[31m-		 * (We could get a more accurate k by invoking log10,[m
[31m-		 *  but this is probably not worthwhile.)[m
[31m-		 */[m
[31m-[m
[31m-		i -= Bias;[m
[31m-#ifdef IBM[m
[31m-		i <<= 2;[m
[31m-		i += j;[m
[31m-#endif[m
[31m-#ifndef Sudden_Underflow[m
[31m-		denorm = 0;[m
[31m-		}[m
[31m-	else {[m
[31m-		/* d is denormalized */[m
[31m-[m
[31m-		i = bbits + be + (Bias + (P-1) - 1);[m
[31m-		x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)[m
[31m-			    : word1(&u) << (32 - i);[m
[31m-		dval(&d2) = x;[m
[31m-		word0(&d2) -= 31*Exp_msk1; /* adjust exponent */[m
[31m-		i -= (Bias + (P-1) - 1) + 1;[m
[31m-		denorm = 1;[m
[31m-		}[m
[31m-#endif[m
[31m-	ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;[m
[31m-	k = (int)ds;[m
[31m-	if (ds < 0. && ds != k)[m
[31m-		k--;	/* want k = floor(ds) */[m
[31m-	k_check = 1;[m
[31m-	if (k >= 0 && k <= Ten_pmax) {[m
[31m-		if (dval(&u) < tens[k])[m
[31m-			k--;[m
[31m-		k_check = 0;[m
[31m-		}[m
[31m-	j = bbits - i - 1;[m
[31m-	if (j >= 0) {[m
[31m-		b2 = 0;[m
[31m-		s2 = j;[m
[31m-		}[m
[31m-	else {[m
[31m-		b2 = -j;[m
[31m-		s2 = 0;[m
[31m-		}[m
[31m-	if (k >= 0) {[m
[31m-		b5 = 0;[m
[31m-		s5 = k;[m
[31m-		s2 += k;[m
[31m-		}[m
[31m-	else {[m
[31m-		b2 -= k;[m
[31m-		b5 = -k;[m
[31m-		s5 = 0;[m
[31m-		}[m
[31m-	if (mode < 0 || mode > 9)[m
[31m-		mode = 0;[m
[31m-[m
[31m-#ifndef SET_INEXACT[m
[31m-#ifdef Check_FLT_ROUNDS[m
[31m-	try_quick = Rounding == 1;[m
[31m-#else[m
[31m-	try_quick = 1;[m
[31m-#endif[m
[31m-#endif /*SET_INEXACT*/[m
[31m-[m
[31m-	if (mode > 5) {[m
[31m-		mode -= 4;[m
[31m-		try_quick = 0;[m
[31m-		}[m
[31m-	leftright = 1;[m
[31m-	ilim = ilim1 = -1;	/* Values for cases 0 and 1; done here to */[m
[31m-				/* silence erroneous "gcc -Wall" warning. */[m
[31m-	switch(mode) {[m
[31m-		case 0:[m
[31m-		case 1:[m
[31m-			i = 18;[m
[31m-			ndigits = 0;[m
[31m-			break;[m
[31m-		case 2:[m
[31m-			leftright = 0;[m
[31m-			/* no break */[m
[31m-		case 4:[m
[31m-			if (ndigits <= 0)[m
[31m-				ndigits = 1;[m
[31m-			ilim = ilim1 = i = ndigits;[m
[31m-			break;[m
[31m-		case 3:[m
[31m-			leftright = 0;[m
[31m-			/* no break */[m
[31m-		case 5:[m
[31m-			i = ndigits + k + 1;[m
[31m-			ilim = i;[m
[31m-			ilim1 = i - 1;[m
[31m-			if (i <= 0)[m
[31m-				i = 1;[m
[31m-		}[m
[31m-	s = s0 = rv_alloc(i);[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	if (mode > 1 && Rounding != 1)[m
[31m-		leftright = 0;[m
[31m-#endif[m
[31m-[m
[31m-	if (ilim >= 0 && ilim <= Quick_max && try_quick) {[m
[31m-[m
[31m-		/* Try to get by with floating-point arithmetic. */[m
[31m-[m
[31m-		i = 0;[m
[31m-		dval(&d2) = dval(&u);[m
[31m-		k0 = k;[m
[31m-		ilim0 = ilim;[m
[31m-		ieps = 2; /* conservative */[m
[31m-		if (k > 0) {[m
[31m-			ds = tens[k&0xf];[m
[31m-			j = k >> 4;[m
[31m-			if (j & Bletch) {[m
[31m-				/* prevent overflows */[m
[31m-				j &= Bletch - 1;[m
[31m-				dval(&u) /= bigtens[n_bigtens-1];[m
[31m-				ieps++;[m
[31m-				}[m
[31m-			for(; j; j >>= 1, i++)[m
[31m-				if (j & 1) {[m
[31m-					ieps++;[m
[31m-					ds *= bigtens[i];[m
[31m-					}[m
[31m-			dval(&u) /= ds;[m
[31m-			}[m
[31m-		else if ((j1 = -k)) {[m
[31m-			dval(&u) *= tens[j1 & 0xf];[m
[31m-			for(j = j1 >> 4; j; j >>= 1, i++)[m
[31m-				if (j & 1) {[m
[31m-					ieps++;[m
[31m-					dval(&u) *= bigtens[i];[m
[31m-					}[m
[31m-			}[m
[31m-		if (k_check && dval(&u) < 1. && ilim > 0) {[m
[31m-			if (ilim1 <= 0)[m
[31m-				goto fast_failed;[m
[31m-			ilim = ilim1;[m
[31m-			k--;[m
[31m-			dval(&u) *= 10.;[m
[31m-			ieps++;[m
[31m-			}[m
[31m-		dval(&eps) = ieps*dval(&u) + 7.;[m
[31m-		word0(&eps) -= (P-1)*Exp_msk1;[m
[31m-		if (ilim == 0) {[m
[31m-			S = mhi = 0;[m
[31m-			dval(&u) -= 5.;[m
[31m-			if (dval(&u) > dval(&eps))[m
[31m-				goto one_digit;[m
[31m-			if (dval(&u) < -dval(&eps))[m
[31m-				goto no_digits;[m
[31m-			goto fast_failed;[m
[31m-			}[m
[31m-#ifndef No_leftright[m
[31m-		if (leftright) {[m
[31m-			/* Use Steele & White method of only[m
[31m-			 * generating digits needed.[m
[31m-			 */[m
[31m-			dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);[m
[31m-#ifdef IEEE_Arith[m
[31m-			if (k0 < 0 && j1 >= 307) {[m
[31m-				eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */[m
[31m-				word0(&eps1) -= Exp_msk1 * (Bias+P-1);[m
[31m-				dval(&eps1) *= tens[j1 & 0xf];[m
[31m-				for(i = 0, j = (j1-256) >> 4; j; j >>= 1, i++)[m
[31m-					if (j & 1)[m
[31m-						dval(&eps1) *= bigtens[i];[m
[31m-				if (eps.d < eps1.d)[m
[31m-					eps.d = eps1.d;[m
[31m-				}[m
[31m-#endif[m
[31m-			for(i = 0;;) {[m
[31m-				L = dval(&u);[m
[31m-				dval(&u) -= L;[m
[31m-				*s++ = '0' + (int)L;[m
[31m-				if (1. - dval(&u) < dval(&eps))[m
[31m-					goto bump_up;[m
[31m-				if (dval(&u) < dval(&eps))[m
[31m-					goto ret1;[m
[31m-				if (++i >= ilim)[m
[31m-					break;[m
[31m-				dval(&eps) *= 10.;[m
[31m-				dval(&u) *= 10.;[m
[31m-				}[m
[31m-			}[m
[31m-		else {[m
[31m-#endif[m
[31m-			/* Generate ilim digits, then fix them up. */[m
[31m-			dval(&eps) *= tens[ilim-1];[m
[31m-			for(i = 1;; i++, dval(&u) *= 10.) {[m
[31m-				L = (Long)(dval(&u));[m
[31m-				if (!(dval(&u) -= L))[m
[31m-					ilim = i;[m
[31m-				*s++ = '0' + (int)L;[m
[31m-				if (i == ilim) {[m
[31m-					if (dval(&u) > 0.5 + dval(&eps))[m
[31m-						goto bump_up;[m
[31m-					else if (dval(&u) < 0.5 - dval(&eps)) {[m
[31m-						while(*--s == '0');[m
[31m-						s++;[m
[31m-						goto ret1;[m
[31m-						}[m
[31m-					break;[m
[31m-					}[m
[31m-				}[m
[31m-#ifndef No_leftright[m
[31m-			}[m
[31m-#endif[m
[31m- fast_failed:[m
[31m-		s = s0;[m
[31m-		dval(&u) = dval(&d2);[m
[31m-		k = k0;[m
[31m-		ilim = ilim0;[m
[31m-		}[m
[31m-[m
[31m-	/* Do we have a "small" integer? */[m
[31m-[m
[31m-	if (be >= 0 && k <= Int_max) {[m
[31m-		/* Yes. */[m
[31m-		ds = tens[k];[m
[31m-		if (ndigits < 0 && ilim <= 0) {[m
[31m-			S = mhi = 0;[m
[31m-			if (ilim < 0 || dval(&u) <= 5*ds)[m
[31m-				goto no_digits;[m
[31m-			goto one_digit;[m
[31m-			}[m
[31m-		for(i = 1;; i++, dval(&u) *= 10.) {[m
[31m-			L = (Long)(dval(&u) / ds);[m
[31m-			dval(&u) -= L*ds;[m
[31m-#ifdef Check_FLT_ROUNDS[m
[31m-			/* If FLT_ROUNDS == 2, L will usually be high by 1 */[m
[31m-			if (dval(&u) < 0) {[m
[31m-				L--;[m
[31m-				dval(&u) += ds;[m
[31m-				}[m
[31m-#endif[m
[31m-			*s++ = '0' + (int)L;[m
[31m-			if (!dval(&u)) {[m
[31m-#ifdef SET_INEXACT[m
[31m-				inexact = 0;[m
[31m-#endif[m
[31m-				break;[m
[31m-				}[m
[31m-			if (i == ilim) {[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				if (mode > 1)[m
[31m-				switch(Rounding) {[m
[31m-				  case 0: goto ret1;[m
[31m-				  case 2: goto bump_up;[m
[31m-				  }[m
[31m-#endif[m
[31m-				dval(&u) += dval(&u);[m
[31m-#ifdef ROUND_BIASED[m
[31m-				if (dval(&u) >= ds)[m
[31m-#else[m
[31m-				if (dval(&u) > ds || (dval(&u) == ds && L & 1))[m
[31m-#endif[m
[31m-					{[m
[31m- bump_up:[m
[31m-					while(*--s == '9')[m
[31m-						if (s == s0) {[m
[31m-							k++;[m
[31m-							*s = '0';[m
[31m-							break;[m
[31m-							}[m
[31m-					++*s++;[m
[31m-					}[m
[31m-				break;[m
[31m-				}[m
[31m-			}[m
[31m-		goto ret1;[m
[31m-		}[m
[31m-[m
[31m-	m2 = b2;[m
[31m-	m5 = b5;[m
[31m-	mhi = mlo = 0;[m
[31m-	if (leftright) {[m
[31m-		i =[m
[31m-#ifndef Sudden_Underflow[m
[31m-			denorm ? be + (Bias + (P-1) - 1 + 1) :[m
[31m-#endif[m
[31m-#ifdef IBM[m
[31m-			1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);[m
[31m-#else[m
[31m-			1 + P - bbits;[m
[31m-#endif[m
[31m-		b2 += i;[m
[31m-		s2 += i;[m
[31m-		mhi = i2b(1);[m
[31m-		}[m
[31m-	if (m2 > 0 && s2 > 0) {[m
[31m-		i = m2 < s2 ? m2 : s2;[m
[31m-		b2 -= i;[m
[31m-		m2 -= i;[m
[31m-		s2 -= i;[m
[31m-		}[m
[31m-	if (b5 > 0) {[m
[31m-		if (leftright) {[m
[31m-			if (m5 > 0) {[m
[31m-				mhi = pow5mult(mhi, m5);[m
[31m-				b1 = mult(mhi, b);[m
[31m-				Bfree(b);[m
[31m-				b = b1;[m
[31m-				}[m
[31m-			if ((j = b5 - m5))[m
[31m-				b = pow5mult(b, j);[m
[31m-			}[m
[31m-		else[m
[31m-			b = pow5mult(b, b5);[m
[31m-		}[m
[31m-	S = i2b(1);[m
[31m-	if (s5 > 0)[m
[31m-		S = pow5mult(S, s5);[m
[31m-[m
[31m-	/* Check for special case that d is a normalized power of 2. */[m
[31m-[m
[31m-	spec_case = 0;[m
[31m-	if ((mode < 2 || leftright)[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-			&& Rounding == 1[m
[31m-#endif[m
[31m-				) {[m
[31m-		if (!word1(&u) && !(word0(&u) & Bndry_mask)[m
[31m-#ifndef Sudden_Underflow[m
[31m-		 && word0(&u) & (Exp_mask & ~Exp_msk1)[m
[31m-#endif[m
[31m-				) {[m
[31m-			/* The special case */[m
[31m-			b2 += Log2P;[m
[31m-			s2 += Log2P;[m
[31m-			spec_case = 1;[m
[31m-			}[m
[31m-		}[m
[31m-[m
[31m-	/* Arrange for convenient computation of quotients:[m
[31m-	 * shift left if necessary so divisor has 4 leading 0 bits.[m
[31m-	 *[m
[31m-	 * Perhaps we should just compute leading 28 bits of S once[m
[31m-	 * and for all and pass them and a shift to quorem, so it[m
[31m-	 * can do shifts and ors to compute the numerator for q.[m
[31m-	 */[m
[31m-	i = dshift(S, s2);[m
[31m-	b2 += i;[m
[31m-	m2 += i;[m
[31m-	s2 += i;[m
[31m-	if (b2 > 0)[m
[31m-		b = lshift(b, b2);[m
[31m-	if (s2 > 0)[m
[31m-		S = lshift(S, s2);[m
[31m-	if (k_check) {[m
[31m-		if (cmp(b,S) < 0) {[m
[31m-			k--;[m
[31m-			b = multadd(b, 10, 0);	/* we botched the k estimate */[m
[31m-			if (leftright)[m
[31m-				mhi = multadd(mhi, 10, 0);[m
[31m-			ilim = ilim1;[m
[31m-			}[m
[31m-		}[m
[31m-	if (ilim <= 0 && (mode == 3 || mode == 5)) {[m
[31m-		if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {[m
[31m-			/* no digits, fcvt style */[m
[31m- no_digits:[m
[31m-			k = -1 - ndigits;[m
[31m-			goto ret;[m
[31m-			}[m
[31m- one_digit:[m
[31m-		*s++ = '1';[m
[31m-		k++;[m
[31m-		goto ret;[m
[31m-		}[m
[31m-	if (leftright) {[m
[31m-		if (m2 > 0)[m
[31m-			mhi = lshift(mhi, m2);[m
[31m-[m
[31m-		/* Compute mlo -- check for special case[m
[31m-		 * that d is a normalized power of 2.[m
[31m-		 */[m
[31m-[m
[31m-		mlo = mhi;[m
[31m-		if (spec_case) {[m
[31m-			mhi = Balloc(mhi->k);[m
[31m-			Bcopy(mhi, mlo);[m
[31m-			mhi = lshift(mhi, Log2P);[m
[31m-			}[m
[31m-[m
[31m-		for(i = 1;;i++) {[m
[31m-			dig = quorem(b,S) + '0';[m
[31m-			/* Do we yet have the shortest decimal string[m
[31m-			 * that will round to d?[m
[31m-			 */[m
[31m-			j = cmp(b, mlo);[m
[31m-			delta = diff(S, mhi);[m
[31m-			j1 = delta->sign ? 1 : cmp(b, delta);[m
[31m-			Bfree(delta);[m
[31m-#ifndef ROUND_BIASED[m
[31m-			if (j1 == 0 && mode != 1 && !(word1(&u) & 1)[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				&& Rounding >= 1[m
[31m-#endif[m
[31m-								   ) {[m
[31m-				if (dig == '9')[m
[31m-					goto round_9_up;[m
[31m-				if (j > 0)[m
[31m-					dig++;[m
[31m-#ifdef SET_INEXACT[m
[31m-				else if (!b->x[0] && b->wds <= 1)[m
[31m-					inexact = 0;[m
[31m-#endif[m
[31m-				*s++ = dig;[m
[31m-				goto ret;[m
[31m-				}[m
[31m-#endif[m
[31m-			if (j < 0 || (j == 0 && mode != 1[m
[31m-#ifndef ROUND_BIASED[m
[31m-							&& !(word1(&u) & 1)[m
[31m-#endif[m
[31m-					)) {[m
[31m-				if (!b->x[0] && b->wds <= 1) {[m
[31m-#ifdef SET_INEXACT[m
[31m-					inexact = 0;[m
[31m-#endif[m
[31m-					goto accept_dig;[m
[31m-					}[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				if (mode > 1)[m
[31m-				 switch(Rounding) {[m
[31m-				  case 0: goto accept_dig;[m
[31m-				  case 2: goto keep_dig;[m
[31m-				  }[m
[31m-#endif /*Honor_FLT_ROUNDS*/[m
[31m-				if (j1 > 0) {[m
[31m-					b = lshift(b, 1);[m
[31m-					j1 = cmp(b, S);[m
[31m-#ifdef ROUND_BIASED[m
[31m-					if (j1 >= 0 /*)*/[m
[31m-#else[m
[31m-					if ((j1 > 0 || (j1 == 0 && dig & 1))[m
[31m-#endif[m
[31m-					&& dig++ == '9')[m
[31m-						goto round_9_up;[m
[31m-					}[m
[31m- accept_dig:[m
[31m-				*s++ = dig;[m
[31m-				goto ret;[m
[31m-				}[m
[31m-			if (j1 > 0) {[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-				if (!Rounding)[m
[31m-					goto accept_dig;[m
[31m-#endif[m
[31m-				if (dig == '9') { /* possible if i == 1 */[m
[31m- round_9_up:[m
[31m-					*s++ = '9';[m
[31m-					goto roundoff;[m
[31m-					}[m
[31m-				*s++ = dig + 1;[m
[31m-				goto ret;[m
[31m-				}[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m- keep_dig:[m
[31m-#endif[m
[31m-			*s++ = dig;[m
[31m-			if (i == ilim)[m
[31m-				break;[m
[31m-			b = multadd(b, 10, 0);[m
[31m-			if (mlo == mhi)[m
[31m-				mlo = mhi = multadd(mhi, 10, 0);[m
[31m-			else {[m
[31m-				mlo = multadd(mlo, 10, 0);[m
[31m-				mhi = multadd(mhi, 10, 0);[m
[31m-				}[m
[31m-			}[m
[31m-		}[m
[31m-	else[m
[31m-		for(i = 1;; i++) {[m
[31m-			*s++ = dig = quorem(b,S) + '0';[m
[31m-			if (!b->x[0] && b->wds <= 1) {[m
[31m-#ifdef SET_INEXACT[m
[31m-				inexact = 0;[m
[31m-#endif[m
[31m-				goto ret;[m
[31m-				}[m
[31m-			if (i >= ilim)[m
[31m-				break;[m
[31m-			b = multadd(b, 10, 0);[m
[31m-			}[m
[31m-[m
[31m-	/* Round off last digit */[m
[31m-[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m-	switch(Rounding) {[m
[31m-	  case 0: goto trimzeros;[m
[31m-	  case 2: goto roundoff;[m
[31m-	  }[m
[31m-#endif[m
[31m-	b = lshift(b, 1);[m
[31m-	j = cmp(b, S);[m
[31m-#ifdef ROUND_BIASED[m
[31m-	if (j >= 0)[m
[31m-#else[m
[31m-	if (j > 0 || (j == 0 && dig & 1))[m
[31m-#endif[m
[31m-		{[m
[31m- roundoff:[m
[31m-		while(*--s == '9')[m
[31m-			if (s == s0) {[m
[31m-				k++;[m
[31m-				*s++ = '1';[m
[31m-				goto ret;[m
[31m-				}[m
[31m-		++*s++;[m
[31m-		}[m
[31m-	else {[m
[31m-#ifdef Honor_FLT_ROUNDS[m
[31m- trimzeros:[m
[31m-#endif[m
[31m-		while(*--s == '0');[m
[31m-		s++;[m
[31m-		}[m
[31m- ret:[m
[31m-	Bfree(S);[m
[31m-	if (mhi) {[m
[31m-		if (mlo && mlo != mhi)[m
[31m-			Bfree(mlo);[m
[31m-		Bfree(mhi);[m
[31m-		}[m
[31m- ret1:[m
[31m-#ifdef SET_INEXACT[m
[31m-	if (inexact) {[m
[31m-		if (!oldinexact) {[m
[31m-			word0(&u) = Exp_1 + (70 << Exp_shift);[m
[31m-			word1(&u) = 0;[m
[31m-			dval(&u) += 1.;[m
[31m-			}[m
[31m-		}[m
[31m-	else if (!oldinexact)[m
[31m-		clear_inexact();[m
[31m-#endif[m
[31m-	Bfree(b);[m
[31m-	*s = 0;[m
[31m-	*decpt = k + 1;[m
[31m-	if (rve)[m
[31m-		*rve = s;[m
[31m-	return s0;[m
[31m-	}[m
[31m-#ifdef __cplusplus[m
[31m-}[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/dtoa_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/dtoa_config.h[m
[1mdeleted file mode 100644[m
[1mindex 380e83b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/dtoa_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-#ifndef _DTOA_CONFIG_H[m
[31m-#define _DTOA_CONFIG_H[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-/* Ensure dtoa.c does not USE_LOCALE. Lua CJSON must not use locale[m
[31m- * aware conversion routines. */[m
[31m-#undef USE_LOCALE[m
[31m-[m
[31m-/* dtoa.c should not touch errno, Lua CJSON does not use it, and it[m
[31m- * may not be threadsafe */[m
[31m-#define NO_ERRNO[m
[31m-[m
[31m-#define Long    int32_t[m
[31m-#define ULong   uint32_t[m
[31m-#define Llong   int64_t[m
[31m-#define ULLong  uint64_t[m
[31m-[m
[31m-#ifdef IEEE_BIG_ENDIAN[m
[31m-#define IEEE_MC68k[m
[31m-#else[m
[31m-#define IEEE_8087[m
[31m-#endif[m
[31m-[m
[31m-#define MALLOC(n)   xmalloc(n)[m
[31m-[m
[31m-static void *xmalloc(size_t size)[m
[31m-{[m
[31m-    void *p;[m
[31m-[m
[31m-    p = malloc(size);[m
[31m-    if (!p) {[m
[31m-        fprintf(stderr, "Out of memory");[m
[31m-        abort();[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-#ifdef MULTIPLE_THREADS[m
[31m-[m
[31m-/* Enable locking to support multi-threaded applications */[m
[31m-[m
[31m-#include <pthread.h>[m
[31m-[m
[31m-static pthread_mutex_t private_dtoa_lock[2] = {[m
[31m-    PTHREAD_MUTEX_INITIALIZER,[m
[31m-    PTHREAD_MUTEX_INITIALIZER[m
[31m-};[m
[31m-[m
[31m-#define ACQUIRE_DTOA_LOCK(n)    do {                                \[m
[31m-    int r = pthread_mutex_lock(&private_dtoa_lock[n]);              \[m
[31m-    if (r) {                                                        \[m
[31m-        fprintf(stderr, "pthread_mutex_lock failed with %d\n", r);  \[m
[31m-        abort();                                                    \[m
[31m-    }                                                               \[m
[31m-} while (0)[m
[31m-[m
[31m-#define FREE_DTOA_LOCK(n)   do {                                    \[m
[31m-    int r = pthread_mutex_unlock(&private_dtoa_lock[n]);            \[m
[31m-    if (r) {                                                        \[m
[31m-        fprintf(stderr, "pthread_mutex_unlock failed with %d\n", r);\[m
[31m-        abort();                                                    \[m
[31m-    }                                                               \[m
[31m-} while (0)[m
[31m-[m
[31m-#endif  /* MULTIPLE_THREADS */[m
[31m-[m
[31m-#endif  /* _DTOA_CONFIG_H */[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/fpconv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/fpconv.c[m
[1mdeleted file mode 100644[m
[1mindex 854662c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/fpconv.c[m
[1m+++ /dev/null[m
[36m@@ -1,205 +0,0 @@[m
[31m-/* fpconv - Floating point conversion routines[m
[31m- *[m
[31m- * Copyright (c) 2011-2012  Mark Pulford <mark@kyne.com.au>[m
[31m- *[m
[31m- * Permission is hereby granted, free of charge, to any person obtaining[m
[31m- * a copy of this software and associated documentation files (the[m
[31m- * "Software"), to deal in the Software without restriction, including[m
[31m- * without limitation the rights to use, copy, modify, merge, publish,[m
[31m- * distribute, sublicense, and/or sell copies of the Software, and to[m
[31m- * permit persons to whom the Software is furnished to do so, subject to[m
[31m- * the following conditions:[m
[31m- *[m
[31m- * The above copyright notice and this permission notice shall be[m
[31m- * included in all copies or substantial portions of the Software.[m
[31m- *[m
[31m- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m- */[m
[31m-[m
[31m-/* JSON uses a '.' decimal separator. strtod() / sprintf() under C libraries[m
[31m- * with locale support will break when the decimal separator is a comma.[m
[31m- *[m
[31m- * fpconv_* will around these issues with a translation buffer if required.[m
[31m- */[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <assert.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#include "fpconv.h"[m
[31m-[m
[31m-/* Lua CJSON assumes the locale is the same for all threads within a[m
[31m- * process and doesn't change after initialisation.[m
[31m- *[m
[31m- * This avoids the need for per thread storage or expensive checks[m
[31m- * for call. */[m
[31m-static char locale_decimal_point = '.';[m
[31m-[m
[31m-/* In theory multibyte decimal_points are possible, but[m
[31m- * Lua CJSON only supports UTF-8 and known locales only have[m
[31m- * single byte decimal points ([.,]).[m
[31m- *[m
[31m- * localconv() may not be thread safe (=>crash), and nl_langinfo() is[m
[31m- * not supported on some platforms. Use sprintf() instead - if the[m
[31m- * locale does change, at least Lua CJSON won't crash. */[m
[31m-static void fpconv_update_locale()[m
[31m-{[m
[31m-    char buf[8];[m
[31m-[m
[31m-    snprintf(buf, sizeof(buf), "%g", 0.5);[m
[31m-[m
[31m-    /* Failing this test might imply the platform has a buggy dtoa[m
[31m-     * implementation or wide characters */[m
[31m-    if (buf[0] != '0' || buf[2] != '5' || buf[3] != 0) {[m
[31m-        fprintf(stderr, "Error: wide characters found or printf() bug.");[m
[31m-        abort();[m
[31m-    }[m
[31m-[m
[31m-    locale_decimal_point = buf[1];[m
[31m-}[m
[31m-[m
[31m-/* Check for a valid number character: [-+0-9a-yA-Y.][m
[31m- * Eg: -0.6e+5, infinity, 0xF0.F0pF0[m
[31m- *[m
[31m- * Used to find the probable end of a number. It doesn't matter if[m
[31m- * invalid characters are counted - strtod() will find the valid[m
[31m- * number if it exists.  The risk is that slightly more memory might[m
[31m- * be allocated before a parse error occurs. */[m
[31m-static inline int valid_number_character(char ch)[m
[31m-{[m
[31m-    char lower_ch;[m
[31m-[m
[31m-    if ('0' <= ch && ch <= '9')[m
[31m-        return 1;[m
[31m-    if (ch == '-' || ch == '+' || ch == '.')[m
[31m-        return 1;[m
[31m-[m
[31m-    /* Hex digits, exponent (e), base (p), "infinity",.. */[m
[31m-    lower_ch = ch | 0x20;[m
[31m-    if ('a' <= lower_ch && lower_ch <= 'y')[m
[31m-        return 1;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/* Calculate the size of the buffer required for a strtod locale[m
[31m- * conversion. */[m
[31m-static int strtod_buffer_size(const char *s)[m
[31m-{[m
[31m-    const char *p = s;[m
[31m-[m
[31m-    while (valid_number_character(*p))[m
[31m-        p++;[m
[31m-[m
[31m-    return p - s;[m
[31m-}[m
[31m-[m
[31m-/* Similar to strtod(), but must be passed the current locale's decimal point[m
[31m- * character. Guaranteed to be called at the start of any valid number in a string */[m
[31m-double fpconv_strtod(const char *nptr, char **endptr)[m
[31m-{[m
[31m-    char localbuf[FPCONV_G_FMT_BUFSIZE];[m
[31m-    char *buf, *endbuf, *dp;[m
[31m-    int buflen;[m
[31m-    double value;[m
[31m-[m
[31m-    /* System strtod() is fine when decimal point is '.' */[m
[31m-    if (locale_decimal_point == '.')[m
[31m-        return strtod(nptr, endptr);[m
[31m-[m
[31m-    buflen = strtod_buffer_size(nptr);[m
[31m-    if (!buflen) {[m
[31m-        /* No valid characters found, standard strtod() return */[m
[31m-        *endptr = (char *)nptr;[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    /* Duplicate number into buffer */[m
[31m-    if (buflen >= FPCONV_G_FMT_BUFSIZE) {[m
[31m-        /* Handle unusually large numbers */[m
[31m-        buf = malloc(buflen + 1);[m
[31m-        if (!buf) {[m
[31m-            fprintf(stderr, "Out of memory");[m
[31m-            abort();[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* This is the common case.. */[m
[31m-        buf = localbuf;[m
[31m-    }[m
[31m-    memcpy(buf, nptr, buflen);[m
[31m-    buf[buflen] = 0;[m
[31m-[m
[31m-    /* Update decimal point character if found */[m
[31m-    dp = strchr(buf, '.');[m
[31m-    if (dp)[m
[31m-        *dp = locale_decimal_point;[m
[31m-[m
[31m-    value = strtod(buf, &endbuf);[m
[31m-    *endptr = (char *)&nptr[endbuf - buf];[m
[31m-    if (buflen >= FPCONV_G_FMT_BUFSIZE)[m
[31m-        free(buf);[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-/* "fmt" must point to a buffer of at least 6 characters */[m
[31m-static void set_number_format(char *fmt, int precision)[m
[31m-{[m
[31m-    int d1, d2, i;[m
[31m-[m
[31m-    assert(1 <= precision && precision <= 16);[m
[31m-[m
[31m-    /* Create printf format (%.14g) from precision */[m
[31m-    d1 = precision / 10;[m
[31m-    d2 = precision % 10;[m
[31m-    fmt[0] = '%';[m
[31m-    fmt[1] = '.';[m
[31m-    i = 2;[m
[31m-    if (d1) {[m
[31m-        fmt[i++] = '0' + d1;[m
[31m-    }[m
[31m-    fmt[i++] = '0' + d2;[m
[31m-    fmt[i++] = 'g';[m
[31m-    fmt[i] = 0;[m
[31m-}[m
[31m-[m
[31m-/* Assumes there is always at least 32 characters available in the target buffer */[m
[31m-int fpconv_g_fmt(char *str, double num, int precision)[m
[31m-{[m
[31m-    char buf[FPCONV_G_FMT_BUFSIZE];[m
[31m-    char fmt[6];[m
[31m-    int len;[m
[31m-    char *b;[m
[31m-[m
[31m-    set_number_format(fmt, precision);[m
[31m-[m
[31m-    /* Pass through when decimal point character is dot. */[m
[31m-    if (locale_decimal_point == '.')[m
[31m-        return snprintf(str, FPCONV_G_FMT_BUFSIZE, fmt, num);[m
[31m-[m
[31m-    /* snprintf() to a buffer then translate for other decimal point characters */[m
[31m-    len = snprintf(buf, FPCONV_G_FMT_BUFSIZE, fmt, num);[m
[31m-[m
[31m-    /* Copy into target location. Translate decimal point if required */[m
[31m-    b = buf;[m
[31m-    do {[m
[31m-        *str++ = (*b == locale_decimal_point ? '.' : *b);[m
[31m-    } while(*b++);[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-void fpconv_init()[m
[31m-{[m
[31m-    fpconv_update_locale();[m
[31m-}[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/fpconv.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/fpconv.h[m
[1mdeleted file mode 100644[m
[1mindex 7b0d0ee..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/fpconv.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-/* Lua CJSON floating point conversion routines */[m
[31m-[m
[31m-/* Buffer required to store the largest string representation of a double.[m
[31m- *[m
[31m- * Longest double printed with %.14g is 21 characters long:[m
[31m- * -1.7976931348623e+308 */[m
[31m-# define FPCONV_G_FMT_BUFSIZE   32[m
[31m-[m
[31m-#ifdef USE_INTERNAL_FPCONV[m
[31m-static inline void fpconv_init()[m
[31m-{[m
[31m-    /* Do nothing - not required */[m
[31m-}[m
[31m-#else[m
[31m-extern void fpconv_init();[m
[31m-#endif[m
[31m-[m
[31m-extern int fpconv_g_fmt(char*, double, int);[m
[31m-extern double fpconv_strtod(const char*, char**);[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/g_fmt.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/g_fmt.c[m
[1mdeleted file mode 100644[m
[1mindex 50d6a1d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/g_fmt.c[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m-/****************************************************************[m
[31m- *[m
[31m- * The author of this software is David M. Gay.[m
[31m- *[m
[31m- * Copyright (c) 1991, 1996 by Lucent Technologies.[m
[31m- *[m
[31m- * Permission to use, copy, modify, and distribute this software for any[m
[31m- * purpose without fee is hereby granted, provided that this entire notice[m
[31m- * is included in all copies of any software which is or includes a copy[m
[31m- * or modification of this software and in all copies of the supporting[m
[31m- * documentation for such software.[m
[31m- *[m
[31m- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED[m
[31m- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY[m
[31m- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY[m
[31m- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.[m
[31m- *[m
[31m- ***************************************************************/[m
[31m-[m
[31m-/* g_fmt(buf,x) stores the closest decimal approximation to x in buf;[m
[31m- * it suffices to declare buf[m
[31m- *	char buf[32];[m
[31m- */[m
[31m-[m
[31m-#ifdef __cplusplus[m
[31m-extern "C" {[m
[31m-#endif[m
[31m- extern char *dtoa(double, int, int, int *, int *, char **);[m
[31m- extern int g_fmt(char *, double, int);[m
[31m- extern void freedtoa(char*);[m
[31m-#ifdef __cplusplus[m
[31m-	}[m
[31m-#endif[m
[31m-[m
[31m-int[m
[31m-fpconv_g_fmt(char *b, double x, int precision)[m
[31m-{[m
[31m-	register int i, k;[m
[31m-	register char *s;[m
[31m-	int decpt, j, sign;[m
[31m-	char *b0, *s0, *se;[m
[31m-[m
[31m-	b0 = b;[m
[31m-#ifdef IGNORE_ZERO_SIGN[m
[31m-	if (!x) {[m
[31m-		*b++ = '0';[m
[31m-		*b = 0;[m
[31m-		goto done;[m
[31m-		}[m
[31m-#endif[m
[31m-	s = s0 = dtoa(x, 2, precision, &decpt, &sign, &se);[m
[31m-	if (sign)[m
[31m-		*b++ = '-';[m
[31m-	if (decpt == 9999) /* Infinity or Nan */ {[m
[31m-		while((*b++ = *s++));[m
[31m-		/* "b" is used to calculate the return length. Decrement to exclude the[m
[31m-		 * Null terminator from the length */[m
[31m-		b--;[m
[31m-		goto done0;[m
[31m-		}[m
[31m-	if (decpt <= -4 || decpt > precision) {[m
[31m-		*b++ = *s++;[m
[31m-		if (*s) {[m
[31m-			*b++ = '.';[m
[31m-			while((*b = *s++))[m
[31m-				b++;[m
[31m-			}[m
[31m-		*b++ = 'e';[m
[31m-		/* sprintf(b, "%+.2d", decpt - 1); */[m
[31m-		if (--decpt < 0) {[m
[31m-			*b++ = '-';[m
[31m-			decpt = -decpt;[m
[31m-			}[m
[31m-		else[m
[31m-			*b++ = '+';[m
[31m-		for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10);[m
[31m-		for(;;) {[m
[31m-			i = decpt / k;[m
[31m-			*b++ = i + '0';[m
[31m-			if (--j <= 0)[m
[31m-				break;[m
[31m-			decpt -= i*k;[m
[31m-			decpt *= 10;[m
[31m-			}[m
[31m-		*b = 0;[m
[31m-		}[m
[31m-	else if (decpt <= 0) {[m
[31m-		*b++ = '0';[m
[31m-		*b++ = '.';[m
[31m-		for(; decpt < 0; decpt++)[m
[31m-			*b++ = '0';[m
[31m-		while((*b++ = *s++));[m
[31m-		b--;[m
[31m-		}[m
[31m-	else {[m
[31m-		while((*b = *s++)) {[m
[31m-			b++;[m
[31m-			if (--decpt == 0 && *s)[m
[31m-				*b++ = '.';[m
[31m-			}[m
[31m-		for(; decpt > 0; decpt--)[m
[31m-			*b++ = '0';[m
[31m-		*b = 0;[m
[31m-		}[m
[31m- done0:[m
[31m-	freedtoa(s0);[m
[31m-#ifdef IGNORE_ZERO_SIGN[m
[31m- done:[m
[31m-#endif[m
[31m-	return b - b0;[m
[31m-	}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua-cjson-2.1devel-1.rockspec b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua-cjson-2.1devel-1.rockspec[m
[1mdeleted file mode 100644[m
[1mindex 154e333..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua-cjson-2.1devel-1.rockspec[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-package = "lua-cjson"[m
[31m-version = "2.1devel-1"[m
[31m-[m
[31m-source = {[m
[31m-    url = "http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1devel.zip",[m
[31m-}[m
[31m-[m
[31m-description = {[m
[31m-    summary = "A fast JSON encoding/parsing module",[m
[31m-    detailed = [[[m
[31m-        The Lua CJSON module provides JSON support for Lua. It features:[m
[31m-        - Fast, standards compliant encoding/parsing routines[m
[31m-        - Full support for JSON with UTF-8, including decoding surrogate pairs[m
[31m-        - Optional run-time support for common exceptions to the JSON specification[m
[31m-          (infinity, NaN,..)[m
[31m-        - No dependencies on other libraries[m
[31m-    ]],[m
[31m-    homepage = "http://www.kyne.com.au/~mark/software/lua-cjson.php",[m
[31m-    license = "MIT"[m
[31m-}[m
[31m-[m
[31m-dependencies = {[m
[31m-    "lua >= 5.1"[m
[31m-}[m
[31m-[m
[31m-build = {[m
[31m-    type = "builtin",[m
[31m-    modules = {[m
[31m-        cjson = {[m
[31m-            sources = { "lua_cjson.c", "strbuf.c", "fpconv.c" },[m
[31m-            defines = {[m
[31m--- LuaRocks does not support platform specific configuration for Solaris.[m
[31m--- Uncomment the line below on Solaris platforms if required.[m
[31m---                "USE_INTERNAL_ISINF"[m
[31m-            }[m
[31m-        }[m
[31m-    },[m
[31m-    install = {[m
[31m-        lua = {[m
[31m-            ["cjson.util"] = "lua/cjson/util.lua"[m
[31m-        },[m
[31m-        bin = {[m
[31m-            json2lua = "lua/json2lua.lua",[m
[31m-            lua2json = "lua/lua2json.lua"[m
[31m-        }[m
[31m-    },[m
[31m-    -- Override default build options (per platform)[m
[31m-    platforms = {[m
[31m-        win32 = { modules = { cjson = { defines = {[m
[31m-            "DISABLE_INVALID_NUMBERS"[m
[31m-        } } } }[m
[31m-    },[m
[31m-    copy_directories = { "tests" }[m
[31m-}[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua-cjson.spec b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua-cjson.spec[m
[1mdeleted file mode 100644[m
[1mindex 13fc56d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua-cjson.spec[m
[1m+++ /dev/null[m
[36m@@ -1,80 +0,0 @@[m
[31m-%define luaver 5.1[m
[31m-%define lualibdir %{_libdir}/lua/%{luaver}[m
[31m-%define luadatadir %{_datadir}/lua/%{luaver}[m
[31m-[m
[31m-Name:		lua-cjson[m
[31m-Version:	2.1devel[m
[31m-Release:	1%{?dist}[m
[31m-Summary:	A fast JSON encoding/parsing module for Lua[m
[31m-[m
[31m-Group:		Development/Libraries[m
[31m-License:	MIT[m
[31m-URL:		http://www.kyne.com.au/~mark/software/lua-cjson/[m
[31m-Source0:	http://www.kyne.com.au/~mark/software/lua-cjson/download/lua-cjson-%{version}.tar.gz[m
[31m-BuildRoot:	%(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)[m
[31m-[m
[31m-BuildRequires:	lua >= %{luaver}, lua-devel >= %{luaver}[m
[31m-Requires:	lua >= %{luaver}[m
[31m-[m
[31m-%description[m
[31m-The Lua CJSON module provides JSON support for Lua. It features:[m
[31m-- Fast, standards compliant encoding/parsing routines[m
[31m-- Full support for JSON with UTF-8, including decoding surrogate pairs[m
[31m-- Optional run-time support for common exceptions to the JSON specification[m
[31m-  (infinity, NaN,..)[m
[31m-- No dependencies on other libraries[m
[31m-[m
[31m-[m
[31m-%prep[m
[31m-%setup -q[m
[31m-[m
[31m-[m
[31m-%build[m
[31m-make %{?_smp_mflags} CFLAGS="%{optflags}" LUA_INCLUDE_DIR="%{_includedir}"[m
[31m-[m
[31m-[m
[31m-%install[m
[31m-rm -rf "$RPM_BUILD_ROOT"[m
[31m-make install DESTDIR="$RPM_BUILD_ROOT" LUA_CMODULE_DIR="%{lualibdir}"[m
[31m-make install-extra DESTDIR="$RPM_BUILD_ROOT" LUA_MODULE_DIR="%{luadatadir}" \[m
[31m-	LUA_BIN_DIR="%{_bindir}"[m
[31m-[m
[31m-[m
[31m-%clean[m
[31m-rm -rf "$RPM_BUILD_ROOT"[m
[31m-[m
[31m-[m
[31m-%preun[m
[31m-/bin/rm -f "%{luadatadir}/cjson/tests/utf8.dat"[m
[31m-[m
[31m-[m
[31m-%files[m
[31m-%defattr(-,root,root,-)[m
[31m-%doc LICENSE NEWS performance.html performance.txt manual.html manual.txt rfc4627.txt THANKS[m
[31m-%{lualibdir}/*[m
[31m-%{luadatadir}/*[m
[31m-%{_bindir}/*[m
[31m-[m
[31m-[m
[31m-%changelog[m
[31m-* Thu Mar 1 2012 Mark Pulford <mark@kyne.com.au> - 2.1.0-1[m
[31m-- Update for 2.1.0[m
[31m-[m
[31m-* Sun Jan 22 2012 Mark Pulford <mark@kyne.com.au> - 2.0.0-1[m
[31m-- Update for 2.0.0[m
[31m-- Install lua2json / json2lua utilities[m
[31m-[m
[31m-* Wed Nov 27 2011 Mark Pulford <mark@kyne.com.au> - 1.0.4-1[m
[31m-- Update for 1.0.4[m
[31m-[m
[31m-* Wed Sep 15 2011 Mark Pulford <mark@kyne.com.au> - 1.0.3-1[m
[31m-- Update for 1.0.3[m
[31m-[m
[31m-* Sun May 29 2011 Mark Pulford <mark@kyne.com.au> - 1.0.2-1[m
[31m-- Update for 1.0.2[m
[31m-[m
[31m-* Sun May 10 2011 Mark Pulford <mark@kyne.com.au> - 1.0.1-1[m
[31m-- Update for 1.0.1[m
[31m-[m
[31m-* Sun May 1 2011 Mark Pulford <mark@kyne.com.au> - 1.0-1[m
[31m-- Initial package[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/cjson/util.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/cjson/util.lua[m
[1mdeleted file mode 100644[m
[1mindex 6916dad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/cjson/util.lua[m
[1m+++ /dev/null[m
[36m@@ -1,271 +0,0 @@[m
[31m-local json = require "cjson"[m
[31m-[m
[31m--- Various common routines used by the Lua CJSON package[m
[31m---[m
[31m--- Mark Pulford <mark@kyne.com.au>[m
[31m-[m
[31m--- Determine with a Lua table can be treated as an array.[m
[31m--- Explicitly returns "not an array" for very sparse arrays.[m
[31m--- Returns:[m
[31m--- -1   Not an array[m
[31m--- 0    Empty table[m
[31m--- >0   Highest index in the array[m
[31m-local function is_array(table)[m
[31m-    local max = 0[m
[31m-    local count = 0[m
[31m-    for k, v in pairs(table) do[m
[31m-        if type(k) == "number" then[m
[31m-            if k > max then max = k end[m
[31m-            count = count + 1[m
[31m-        else[m
[31m-            return -1[m
[31m-        end[m
[31m-    end[m
[31m-    if max > count * 2 then[m
[31m-        return -1[m
[31m-    end[m
[31m-[m
[31m-    return max[m
[31m-end[m
[31m-[m
[31m-local serialise_value[m
[31m-[m
[31m-local function serialise_table(value, indent, depth)[m
[31m-    local spacing, spacing2, indent2[m
[31m-    if indent then[m
[31m-        spacing = "\n" .. indent[m
[31m-        spacing2 = spacing .. "  "[m
[31m-        indent2 = indent .. "  "[m
[31m-    else[m
[31m-        spacing, spacing2, indent2 = " ", " ", false[m
[31m-    end[m
[31m-    depth = depth + 1[m
[31m-    if depth > 50 then[m
[31m-        return "Cannot serialise any further: too many nested tables"[m
[31m-    end[m
[31m-[m
[31m-    local max = is_array(value)[m
[31m-[m
[31m-    local comma = false[m
[31m-    local fragment = { "{" .. spacing2 }[m
[31m-    if max > 0 then[m
[31m-        -- Serialise array[m
[31m-        for i = 1, max do[m
[31m-            if comma then[m
[31m-                table.insert(fragment, "," .. spacing2)[m
[31m-            end[m
[31m-            table.insert(fragment, serialise_value(value[i], indent2, depth))[m
[31m-            comma = true[m
[31m-        end[m
[31m-    elseif max < 0 then[m
[31m-        -- Serialise table[m
[31m-        for k, v in pairs(value) do[m
[31m-            if comma then[m
[31m-                table.insert(fragment, "," .. spacing2)[m
[31m-            end[m
[31m-            table.insert(fragment,[m
[31m-                ("[%s] = %s"):format(serialise_value(k, indent2, depth),[m
[31m-                                     serialise_value(v, indent2, depth)))[m
[31m-            comma = true[m
[31m-        end[m
[31m-    end[m
[31m-    table.insert(fragment, spacing .. "}")[m
[31m-[m
[31m-    return table.concat(fragment)[m
[31m-end[m
[31m-[m
[31m-function serialise_value(value, indent, depth)[m
[31m-    if indent == nil then indent = "" end[m
[31m-    if depth == nil then depth = 0 end[m
[31m-[m
[31m-    if value == json.null then[m
[31m-        return "json.null"[m
[31m-    elseif type(value) == "string" then[m
[31m-        return ("%q"):format(value)[m
[31m-    elseif type(value) == "nil" or type(value) == "number" or[m
[31m-           type(value) == "boolean" then[m
[31m-        return tostring(value)[m
[31m-    elseif type(value) == "table" then[m
[31m-        return serialise_table(value, indent, depth)[m
[31m-    else[m
[31m-        return "\"<" .. type(value) .. ">\""[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function file_load(filename)[m
[31m-    local file[m
[31m-    if filename == nil then[m
[31m-        file = io.stdin[m
[31m-    else[m
[31m-        local err[m
[31m-        file, err = io.open(filename, "rb")[m
[31m-        if file == nil then[m
[31m-            error(("Unable to read '%s': %s"):format(filename, err))[m
[31m-        end[m
[31m-    end[m
[31m-    local data = file:read("*a")[m
[31m-[m
[31m-    if filename ~= nil then[m
[31m-        file:close()[m
[31m-    end[m
[31m-[m
[31m-    if data == nil then[m
[31m-        error("Failed to read " .. filename)[m
[31m-    end[m
[31m-[m
[31m-    return data[m
[31m-end[m
[31m-[m
[31m-local function file_save(filename, data)[m
[31m-    local file[m
[31m-    if filename == nil then[m
[31m-        file = io.stdout[m
[31m-    else[m
[31m-        local err[m
[31m-        file, err = io.open(filename, "wb")[m
[31m-        if file == nil then[m
[31m-            error(("Unable to write '%s': %s"):format(filename, err))[m
[31m-        end[m
[31m-    end[m
[31m-    file:write(data)[m
[31m-    if filename ~= nil then[m
[31m-        file:close()[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function compare_values(val1, val2)[m
[31m-    local type1 = type(val1)[m
[31m-    local type2 = type(val2)[m
[31m-    if type1 ~= type2 then[m
[31m-        return false[m
[31m-    end[m
[31m-[m
[31m-    -- Check for NaN[m
[31m-    if type1 == "number" and val1 ~= val1 and val2 ~= val2 then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    if type1 ~= "table" then[m
[31m-        return val1 == val2[m
[31m-    end[m
[31m-[m
[31m-    -- check_keys stores all the keys that must be checked in val2[m
[31m-    local check_keys = {}[m
[31m-    for k, _ in pairs(val1) do[m
[31m-        check_keys[k] = true[m
[31m-    end[m
[31m-[m
[31m-    for k, v in pairs(val2) do[m
[31m-        if not check_keys[k] then[m
[31m-            return false[m
[31m-        end[m
[31m-[m
[31m-        if not compare_values(val1[k], val2[k]) then[m
[31m-            return false[m
[31m-        end[m
[31m-[m
[31m-        check_keys[k] = nil[m
[31m-    end[m
[31m-    for k, _ in pairs(check_keys) do[m
[31m-        -- Not the same if any keys from val1 were not found in val2[m
[31m-        return false[m
[31m-    end[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local test_count_pass = 0[m
[31m-local test_count_total = 0[m
[31m-[m
[31m-local function run_test_summary()[m
[31m-    return test_count_pass, test_count_total[m
[31m-end[m
[31m-[m
[31m-local function run_test(testname, func, input, should_work, output)[m
[31m-    local function status_line(name, status, value)[m
[31m-        local statusmap = { [true] = ":success", [false] = ":error" }[m
[31m-        if status ~= nil then[m
[31m-            name = name .. statusmap[status][m
[31m-        end[m
[31m-        print(("[%s] %s"):format(name, serialise_value(value, false)))[m
[31m-    end[m
[31m-[m
[31m-    local result = { pcall(func, unpack(input)) }[m
[31m-    local success = table.remove(result, 1)[m
[31m-[m
[31m-    local correct = false[m
[31m-    if success == should_work and compare_values(result, output) then[m
[31m-        correct = true[m
[31m-        test_count_pass = test_count_pass + 1[m
[31m-    end[m
[31m-    test_count_total = test_count_total + 1[m
[31m-[m
[31m-    local teststatus = { [true] = "PASS", [false] = "FAIL" }[m
[31m-    print(("==> Test [%d] %s: %s"):format(test_count_total, testname,[m
[31m-                                          teststatus[correct]))[m
[31m-[m
[31m-    status_line("Input", nil, input)[m
[31m-    if not correct then[m
[31m-        status_line("Expected", should_work, output)[m
[31m-    end[m
[31m-    status_line("Received", success, result)[m
[31m-    print()[m
[31m-[m
[31m-    return correct, result[m
[31m-end[m
[31m-[m
[31m-local function run_test_group(tests)[m
[31m-    local function run_helper(name, func, input)[m
[31m-        if type(name) == "string" and #name > 0 then[m
[31m-            print("==> " .. name)[m
[31m-        end[m
[31m-        -- Not a protected call, these functions should never generate errors.[m
[31m-        func(unpack(input or {}))[m
[31m-        print()[m
[31m-    end[m
[31m-[m
[31m-    for _, v in ipairs(tests) do[m
[31m-        -- Run the helper if "should_work" is missing[m
[31m-        if v[4] == nil then[m
[31m-            run_helper(unpack(v))[m
[31m-        else[m
[31m-            run_test(unpack(v))[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- Run a Lua script in a separate environment[m
[31m-local function run_script(script, env)[m
[31m-    local env = env or {}[m
[31m-    local func[m
[31m-[m
[31m-    -- Use setfenv() if it exists, otherwise assume Lua 5.2 load() exists[m
[31m-    if _G.setfenv then[m
[31m-        func = loadstring(script)[m
[31m-        if func then[m
[31m-            setfenv(func, env)[m
[31m-        end[m
[31m-    else[m
[31m-        func = load(script, nil, nil, env)[m
[31m-    end[m
[31m-[m
[31m-    if func == nil then[m
[31m-            error("Invalid syntax.")[m
[31m-    end[m
[31m-    func()[m
[31m-[m
[31m-    return env[m
[31m-end[m
[31m-[m
[31m--- Export functions[m
[31m-return {[m
[31m-    serialise_value = serialise_value,[m
[31m-    file_load = file_load,[m
[31m-    file_save = file_save,[m
[31m-    compare_values = compare_values,[m
[31m-    run_test_summary = run_test_summary,[m
[31m-    run_test = run_test,[m
[31m-    run_test_group = run_test_group,[m
[31m-    run_script = run_script[m
[31m-}[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/json2lua.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/json2lua.lua[m
[1mdeleted file mode 100755[m
[1mindex 014416d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/json2lua.lua[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-#!/usr/bin/env lua[m
[31m-[m
[31m--- usage: json2lua.lua [json_file][m
[31m---[m
[31m--- Eg:[m
[31m--- echo '[ "testing" ]' | ./json2lua.lua[m
[31m--- ./json2lua.lua test.json[m
[31m-[m
[31m-local json = require "cjson"[m
[31m-local util = require "cjson.util"[m
[31m-[m
[31m-local json_text = util.file_load(arg[1])[m
[31m-local t = json.decode(json_text)[m
[31m-print(util.serialise_value(t))[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/lua2json.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/lua2json.lua[m
[1mdeleted file mode 100755[m
[1mindex aee8869..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua/lua2json.lua[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-#!/usr/bin/env lua[m
[31m-[m
[31m--- usage: lua2json.lua [lua_file][m
[31m---[m
[31m--- Eg:[m
[31m--- echo '{ "testing" }' | ./lua2json.lua[m
[31m--- ./lua2json.lua test.lua[m
[31m-[m
[31m-local json = require "cjson"[m
[31m-local util = require "cjson.util"[m
[31m-[m
[31m-local env = {[m
[31m-    json = { null = json.null },[m
[31m-    null = json.null[m
[31m-}[m
[31m-[m
[31m-local t = util.run_script("data = " .. util.file_load(arg[1]), env)[m
[31m-print(json.encode(t.data))[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua_cjson.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua_cjson.c[m
[1mdeleted file mode 100644[m
[1mindex 5f4faf2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/lua_cjson.c[m
[1m+++ /dev/null[m
[36m@@ -1,1476 +0,0 @@[m
[31m-/* Lua CJSON - JSON support for Lua[m
[31m- *[m
[31m- * Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m- *[m
[31m- * Permission is hereby granted, free of charge, to any person obtaining[m
[31m- * a copy of this software and associated documentation files (the[m
[31m- * "Software"), to deal in the Software without restriction, including[m
[31m- * without limitation the rights to use, copy, modify, merge, publish,[m
[31m- * distribute, sublicense, and/or sell copies of the Software, and to[m
[31m- * permit persons to whom the Software is furnished to do so, subject to[m
[31m- * the following conditions:[m
[31m- *[m
[31m- * The above copyright notice and this permission notice shall be[m
[31m- * included in all copies or substantial portions of the Software.[m
[31m- *[m
[31m- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m- */[m
[31m-[m
[31m-/* Caveats:[m
[31m- * - JSON "null" values are represented as lightuserdata since Lua[m
[31m- *   tables cannot contain "nil". Compare with cjson.null.[m
[31m- * - Invalid UTF-8 characters are not detected and will be passed[m
[31m- *   untouched. If required, UTF-8 error checking should be done[m
[31m- *   outside this library.[m
[31m- * - Javascript comments are not part of the JSON spec, and are not[m
[31m- *   currently supported.[m
[31m- *[m
[31m- * Note: Decoding is slower than encoding. Lua spends significant[m
[31m- *       time (30%) managing tables when parsing JSON since it is[m
[31m- *       difficult to know object/array sizes ahead of time.[m
[31m- */[m
[31m-[m
[31m-#include <assert.h>[m
[31m-#include <string.h>[m
[31m-#include <math.h>[m
[31m-#include <limits.h>[m
[31m-#include <lua.h>[m
[31m-#include <lauxlib.h>[m
[31m-[m
[31m-#include "strbuf.h"[m
[31m-#include "fpconv.h"[m
[31m-[m
[31m-#ifndef CJSON_MODNAME[m
[31m-#define CJSON_MODNAME   "cjson"[m
[31m-#endif[m
[31m-[m
[31m-#ifndef CJSON_VERSION[m
[31m-#define CJSON_VERSION   "2.1devel"[m
[31m-#endif[m
[31m-[m
[31m-/* Workaround for Solaris platforms missing isinf() */[m
[31m-#if !defined(isinf) && (defined(USE_INTERNAL_ISINF) || defined(MISSING_ISINF))[m
[31m-#define isinf(x) (!isnan(x) && isnan((x) - (x)))[m
[31m-#endif[m
[31m-[m
[31m-#define DEFAULT_SPARSE_CONVERT 0[m
[31m-#define DEFAULT_SPARSE_RATIO 2[m
[31m-#define DEFAULT_SPARSE_SAFE 10[m
[31m-#define DEFAULT_ENCODE_MAX_DEPTH 1000[m
[31m-#define DEFAULT_DECODE_MAX_DEPTH 1000[m
[31m-#define DEFAULT_ENCODE_INVALID_NUMBERS 0[m
[31m-#define DEFAULT_DECODE_INVALID_NUMBERS 1[m
[31m-#define DEFAULT_ENCODE_KEEP_BUFFER 1[m
[31m-#define DEFAULT_ENCODE_NUMBER_PRECISION 14[m
[31m-#define DEFAULT_ENCODE_EMPTY_TABLE_AS_OBJECT 1[m
[31m-[m
[31m-#ifdef DISABLE_INVALID_NUMBERS[m
[31m-#undef DEFAULT_DECODE_INVALID_NUMBERS[m
[31m-#define DEFAULT_DECODE_INVALID_NUMBERS 0[m
[31m-#endif[m
[31m-[m
[31m-static const char * const *json_empty_array;[m
[31m-[m
[31m-typedef enum {[m
[31m-    T_OBJ_BEGIN,[m
[31m-    T_OBJ_END,[m
[31m-    T_ARR_BEGIN,[m
[31m-    T_ARR_END,[m
[31m-    T_STRING,[m
[31m-    T_NUMBER,[m
[31m-    T_BOOLEAN,[m
[31m-    T_NULL,[m
[31m-    T_COLON,[m
[31m-    T_COMMA,[m
[31m-    T_END,[m
[31m-    T_WHITESPACE,[m
[31m-    T_ERROR,[m
[31m-    T_UNKNOWN[m
[31m-} json_token_type_t;[m
[31m-[m
[31m-static const char *json_token_type_name[] = {[m
[31m-    "T_OBJ_BEGIN",[m
[31m-    "T_OBJ_END",[m
[31m-    "T_ARR_BEGIN",[m
[31m-    "T_ARR_END",[m
[31m-    "T_STRING",[m
[31m-    "T_NUMBER",[m
[31m-    "T_BOOLEAN",[m
[31m-    "T_NULL",[m
[31m-    "T_COLON",[m
[31m-    "T_COMMA",[m
[31m-    "T_END",[m
[31m-    "T_WHITESPACE",[m
[31m-    "T_ERROR",[m
[31m-    "T_UNKNOWN",[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-typedef struct {[m
[31m-    json_token_type_t ch2token[256];[m
[31m-    char escape2char[256];  /* Decoding */[m
[31m-[m
[31m-    /* encode_buf is only allocated and used when[m
[31m-     * encode_keep_buffer is set */[m
[31m-    strbuf_t encode_buf;[m
[31m-[m
[31m-    int encode_sparse_convert;[m
[31m-    int encode_sparse_ratio;[m
[31m-    int encode_sparse_safe;[m
[31m-    int encode_max_depth;[m
[31m-    int encode_invalid_numbers;     /* 2 => Encode as "null" */[m
[31m-    int encode_number_precision;[m
[31m-    int encode_keep_buffer;[m
[31m-    int encode_empty_table_as_object;[m
[31m-[m
[31m-    int decode_invalid_numbers;[m
[31m-    int decode_max_depth;[m
[31m-} json_config_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    const char *data;[m
[31m-    const char *ptr;[m
[31m-    strbuf_t *tmp;    /* Temporary storage for strings */[m
[31m-    json_config_t *cfg;[m
[31m-    int current_depth;[m
[31m-} json_parse_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    json_token_type_t type;[m
[31m-    int index;[m
[31m-    union {[m
[31m-        const char *string;[m
[31m-        double number;[m
[31m-        int boolean;[m
[31m-    } value;[m
[31m-    int string_len;[m
[31m-} json_token_t;[m
[31m-[m
[31m-static const char *char2escape[256] = {[m
[31m-    "\\u0000", "\\u0001", "\\u0002", "\\u0003",[m
[31m-    "\\u0004", "\\u0005", "\\u0006", "\\u0007",[m
[31m-    "\\b", "\\t", "\\n", "\\u000b",[m
[31m-    "\\f", "\\r", "\\u000e", "\\u000f",[m
[31m-    "\\u0010", "\\u0011", "\\u0012", "\\u0013",[m
[31m-    "\\u0014", "\\u0015", "\\u0016", "\\u0017",[m
[31m-    "\\u0018", "\\u0019", "\\u001a", "\\u001b",[m
[31m-    "\\u001c", "\\u001d", "\\u001e", "\\u001f",[m
[31m-    NULL, NULL, "\\\"", NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, "\\/",[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, "\\\\", NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, "\\u007f",[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,[m
[31m-};[m
[31m-[m
[31m-/* ===== CONFIGURATION ===== */[m
[31m-[m
[31m-static json_config_t *json_fetch_config(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg;[m
[31m-[m
[31m-    cfg = lua_touserdata(l, lua_upvalueindex(1));[m
[31m-    if (!cfg)[m
[31m-        luaL_error(l, "BUG: Unable to fetch CJSON configuration");[m
[31m-[m
[31m-    return cfg;[m
[31m-}[m
[31m-[m
[31m-/* Ensure the correct number of arguments have been provided.[m
[31m- * Pad with nil to allow other functions to simply check arg[i][m
[31m- * to find whether an argument was provided */[m
[31m-static json_config_t *json_arg_init(lua_State *l, int args)[m
[31m-{[m
[31m-    luaL_argcheck(l, lua_gettop(l) <= args, args + 1,[m
[31m-                  "found too many arguments");[m
[31m-[m
[31m-    while (lua_gettop(l) < args)[m
[31m-        lua_pushnil(l);[m
[31m-[m
[31m-    return json_fetch_config(l);[m
[31m-}[m
[31m-[m
[31m-/* Process integer options for configuration functions */[m
[31m-static int json_integer_option(lua_State *l, int optindex, int *setting,[m
[31m-                               int min, int max)[m
[31m-{[m
[31m-    char errmsg[64];[m
[31m-    int value;[m
[31m-[m
[31m-    if (!lua_isnil(l, optindex)) {[m
[31m-        value = luaL_checkinteger(l, optindex);[m
[31m-        snprintf(errmsg, sizeof(errmsg), "expected integer between %d and %d", min, max);[m
[31m-        luaL_argcheck(l, min <= value && value <= max, 1, errmsg);[m
[31m-        *setting = value;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(l, *setting);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* Process enumerated arguments for a configuration function */[m
[31m-static int json_enum_option(lua_State *l, int optindex, int *setting,[m
[31m-                            const char **options, int bool_true)[m
[31m-{[m
[31m-    static const char *bool_options[] = { "off", "on", NULL };[m
[31m-[m
[31m-    if (!options) {[m
[31m-        options = bool_options;[m
[31m-        bool_true = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!lua_isnil(l, optindex)) {[m
[31m-        if (bool_true && lua_isboolean(l, optindex))[m
[31m-            *setting = lua_toboolean(l, optindex) * bool_true;[m
[31m-        else[m
[31m-            *setting = luaL_checkoption(l, optindex, NULL, options);[m
[31m-    }[m
[31m-[m
[31m-    if (bool_true && (*setting == 0 || *setting == bool_true))[m
[31m-        lua_pushboolean(l, *setting);[m
[31m-    else[m
[31m-        lua_pushstring(l, options[*setting]);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* Configures handling of extremely sparse arrays:[m
[31m- * convert: Convert extremely sparse arrays into objects? Otherwise error.[m
[31m- * ratio: 0: always allow sparse; 1: never allow sparse; >1: use ratio[m
[31m- * safe: Always use an array when the max index <= safe */[m
[31m-static int json_cfg_encode_sparse_array(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 3);[m
[31m-[m
[31m-    json_enum_option(l, 1, &cfg->encode_sparse_convert, NULL, 1);[m
[31m-    json_integer_option(l, 2, &cfg->encode_sparse_ratio, 0, INT_MAX);[m
[31m-    json_integer_option(l, 3, &cfg->encode_sparse_safe, 0, INT_MAX);[m
[31m-[m
[31m-    return 3;[m
[31m-}[m
[31m-[m
[31m-/* Configures the maximum number of nested arrays/objects allowed when[m
[31m- * encoding */[m
[31m-static int json_cfg_encode_max_depth(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    return json_integer_option(l, 1, &cfg->encode_max_depth, 1, INT_MAX);[m
[31m-}[m
[31m-[m
[31m-/* Configures the maximum number of nested arrays/objects allowed when[m
[31m- * encoding */[m
[31m-static int json_cfg_decode_max_depth(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    return json_integer_option(l, 1, &cfg->decode_max_depth, 1, INT_MAX);[m
[31m-}[m
[31m-[m
[31m-/* Configures number precision when converting doubles to text */[m
[31m-static int json_cfg_encode_number_precision(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    return json_integer_option(l, 1, &cfg->encode_number_precision, 1, 16);[m
[31m-}[m
[31m-[m
[31m-/* Configures how to treat empty table when encode lua table */[m
[31m-static int json_cfg_encode_empty_table_as_object(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    return json_enum_option(l, 1, &cfg->encode_empty_table_as_object, NULL, 1);[m
[31m-}[m
[31m-[m
[31m-/* Configures JSON encoding buffer persistence */[m
[31m-static int json_cfg_encode_keep_buffer(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-    int old_value;[m
[31m-[m
[31m-    old_value = cfg->encode_keep_buffer;[m
[31m-[m
[31m-    json_enum_option(l, 1, &cfg->encode_keep_buffer, NULL, 1);[m
[31m-[m
[31m-    /* Init / free the buffer if the setting has changed */[m
[31m-    if (old_value ^ cfg->encode_keep_buffer) {[m
[31m-        if (cfg->encode_keep_buffer)[m
[31m-            strbuf_init(&cfg->encode_buf, 0);[m
[31m-        else[m
[31m-            strbuf_free(&cfg->encode_buf);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-#if defined(DISABLE_INVALID_NUMBERS) && !defined(USE_INTERNAL_FPCONV)[m
[31m-void json_verify_invalid_number_setting(lua_State *l, int *setting)[m
[31m-{[m
[31m-    if (*setting == 1) {[m
[31m-        *setting = 0;[m
[31m-        luaL_error(l, "Infinity, NaN, and/or hexadecimal numbers are not supported.");[m
[31m-    }[m
[31m-}[m
[31m-#else[m
[31m-#define json_verify_invalid_number_setting(l, s)    do { } while(0)[m
[31m-#endif[m
[31m-[m
[31m-static int json_cfg_encode_invalid_numbers(lua_State *l)[m
[31m-{[m
[31m-    static const char *options[] = { "off", "on", "null", NULL };[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    json_enum_option(l, 1, &cfg->encode_invalid_numbers, options, 1);[m
[31m-[m
[31m-    json_verify_invalid_number_setting(l, &cfg->encode_invalid_numbers);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-static int json_cfg_decode_invalid_numbers(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_arg_init(l, 1);[m
[31m-[m
[31m-    json_enum_option(l, 1, &cfg->decode_invalid_numbers, NULL, 1);[m
[31m-[m
[31m-    json_verify_invalid_number_setting(l, &cfg->encode_invalid_numbers);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-static int json_destroy_config(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg;[m
[31m-[m
[31m-    cfg = lua_touserdata(l, 1);[m
[31m-    if (cfg)[m
[31m-        strbuf_free(&cfg->encode_buf);[m
[31m-    cfg = NULL;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-static void json_create_config(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg;[m
[31m-    int i;[m
[31m-[m
[31m-    cfg = lua_newuserdata(l, sizeof(*cfg));[m
[31m-[m
[31m-    /* Create GC method to clean up strbuf */[m
[31m-    lua_newtable(l);[m
[31m-    lua_pushcfunction(l, json_destroy_config);[m
[31m-    lua_setfield(l, -2, "__gc");[m
[31m-    lua_setmetatable(l, -2);[m
[31m-[m
[31m-    cfg->encode_sparse_convert = DEFAULT_SPARSE_CONVERT;[m
[31m-    cfg->encode_sparse_ratio = DEFAULT_SPARSE_RATIO;[m
[31m-    cfg->encode_sparse_safe = DEFAULT_SPARSE_SAFE;[m
[31m-    cfg->encode_max_depth = DEFAULT_ENCODE_MAX_DEPTH;[m
[31m-    cfg->decode_max_depth = DEFAULT_DECODE_MAX_DEPTH;[m
[31m-    cfg->encode_invalid_numbers = DEFAULT_ENCODE_INVALID_NUMBERS;[m
[31m-    cfg->decode_invalid_numbers = DEFAULT_DECODE_INVALID_NUMBERS;[m
[31m-    cfg->encode_keep_buffer = DEFAULT_ENCODE_KEEP_BUFFER;[m
[31m-    cfg->encode_number_precision = DEFAULT_ENCODE_NUMBER_PRECISION;[m
[31m-    cfg->encode_empty_table_as_object = DEFAULT_ENCODE_EMPTY_TABLE_AS_OBJECT;[m
[31m-[m
[31m-#if DEFAULT_ENCODE_KEEP_BUFFER > 0[m
[31m-    strbuf_init(&cfg->encode_buf, 0);[m
[31m-#endif[m
[31m-[m
[31m-    /* Decoding init */[m
[31m-[m
[31m-    /* Tag all characters as an error */[m
[31m-    for (i = 0; i < 256; i++)[m
[31m-        cfg->ch2token[i] = T_ERROR;[m
[31m-[m
[31m-    /* Set tokens that require no further processing */[m
[31m-    cfg->ch2token['{'] = T_OBJ_BEGIN;[m
[31m-    cfg->ch2token['}'] = T_OBJ_END;[m
[31m-    cfg->ch2token['['] = T_ARR_BEGIN;[m
[31m-    cfg->ch2token[']'] = T_ARR_END;[m
[31m-    cfg->ch2token[','] = T_COMMA;[m
[31m-    cfg->ch2token[':'] = T_COLON;[m
[31m-    cfg->ch2token['\0'] = T_END;[m
[31m-    cfg->ch2token[' '] = T_WHITESPACE;[m
[31m-    cfg->ch2token['\t'] = T_WHITESPACE;[m
[31m-    cfg->ch2token['\n'] = T_WHITESPACE;[m
[31m-    cfg->ch2token['\r'] = T_WHITESPACE;[m
[31m-[m
[31m-    /* Update characters that require further processing */[m
[31m-    cfg->ch2token['f'] = T_UNKNOWN;     /* false? */[m
[31m-    cfg->ch2token['i'] = T_UNKNOWN;     /* inf, ininity? */[m
[31m-    cfg->ch2token['I'] = T_UNKNOWN;[m
[31m-    cfg->ch2token['n'] = T_UNKNOWN;     /* null, nan? */[m
[31m-    cfg->ch2token['N'] = T_UNKNOWN;[m
[31m-    cfg->ch2token['t'] = T_UNKNOWN;     /* true? */[m
[31m-    cfg->ch2token['"'] = T_UNKNOWN;     /* string? */[m
[31m-    cfg->ch2token['+'] = T_UNKNOWN;     /* number? */[m
[31m-    cfg->ch2token['-'] = T_UNKNOWN;[m
[31m-    for (i = 0; i < 10; i++)[m
[31m-        cfg->ch2token['0' + i] = T_UNKNOWN;[m
[31m-[m
[31m-    /* Lookup table for parsing escape characters */[m
[31m-    for (i = 0; i < 256; i++)[m
[31m-        cfg->escape2char[i] = 0;          /* String error */[m
[31m-    cfg->escape2char['"'] = '"';[m
[31m-    cfg->escape2char['\\'] = '\\';[m
[31m-    cfg->escape2char['/'] = '/';[m
[31m-    cfg->escape2char['b'] = '\b';[m
[31m-    cfg->escape2char['t'] = '\t';[m
[31m-    cfg->escape2char['n'] = '\n';[m
[31m-    cfg->escape2char['f'] = '\f';[m
[31m-    cfg->escape2char['r'] = '\r';[m
[31m-    cfg->escape2char['u'] = 'u';          /* Unicode parsing required */[m
[31m-}[m
[31m-[m
[31m-/* ===== ENCODING ===== */[m
[31m-[m
[31m-static void json_encode_exception(lua_State *l, json_config_t *cfg, strbuf_t *json, int lindex,[m
[31m-                                  const char *reason)[m
[31m-{[m
[31m-    if (!cfg->encode_keep_buffer)[m
[31m-        strbuf_free(json);[m
[31m-    luaL_error(l, "Cannot serialise %s: %s",[m
[31m-                  lua_typename(l, lua_type(l, lindex)), reason);[m
[31m-}[m
[31m-[m
[31m-/* json_append_string args:[m
[31m- * - lua_State[m
[31m- * - JSON strbuf[m
[31m- * - String (Lua stack index)[m
[31m- *[m
[31m- * Returns nothing. Doesn't remove string from Lua stack */[m
[31m-static void json_append_string(lua_State *l, strbuf_t *json, int lindex)[m
[31m-{[m
[31m-    const char *escstr;[m
[31m-    int i;[m
[31m-    const char *str;[m
[31m-    size_t len;[m
[31m-[m
[31m-    str = lua_tolstring(l, lindex, &len);[m
[31m-[m
[31m-    /* Worst case is len * 6 (all unicode escapes).[m
[31m-     * This buffer is reused constantly for small strings[m
[31m-     * If there are any excess pages, they won't be hit anyway.[m
[31m-     * This gains ~5% speedup. */[m
[31m-    strbuf_ensure_empty_length(json, len * 6 + 2);[m
[31m-[m
[31m-    strbuf_append_char_unsafe(json, '\"');[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        escstr = char2escape[(unsigned char)str[i]];[m
[31m-        if (escstr)[m
[31m-            strbuf_append_string(json, escstr);[m
[31m-        else[m
[31m-            strbuf_append_char_unsafe(json, str[i]);[m
[31m-    }[m
[31m-    strbuf_append_char_unsafe(json, '\"');[m
[31m-}[m
[31m-[m
[31m-/* Find the size of the array on the top of the Lua stack[m
[31m- * -1   object (not a pure array)[m
[31m- * >=0  elements in array[m
[31m- */[m
[31m-static int lua_array_length(lua_State *l, json_config_t *cfg, strbuf_t *json)[m
[31m-{[m
[31m-    double k;[m
[31m-    int max;[m
[31m-    int items;[m
[31m-[m
[31m-    max = 0;[m
[31m-    items = 0;[m
[31m-[m
[31m-    lua_pushnil(l);[m
[31m-    /* table, startkey */[m
[31m-    while (lua_next(l, -2) != 0) {[m
[31m-        /* table, key, value */[m
[31m-        if (lua_type(l, -2) == LUA_TNUMBER &&[m
[31m-            (k = lua_tonumber(l, -2))) {[m
[31m-            /* Integer >= 1 ? */[m
[31m-            if (floor(k) == k && k >= 1) {[m
[31m-                if (k > max)[m
[31m-                    max = k;[m
[31m-                items++;[m
[31m-                lua_pop(l, 1);[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* Must not be an array (non integer key) */[m
[31m-        lua_pop(l, 2);[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    /* Encode excessively sparse arrays as objects (if enabled) */[m
[31m-    if (cfg->encode_sparse_ratio > 0 &&[m
[31m-        max > items * cfg->encode_sparse_ratio &&[m
[31m-        max > cfg->encode_sparse_safe) {[m
[31m-        if (!cfg->encode_sparse_convert)[m
[31m-            json_encode_exception(l, cfg, json, -1, "excessively sparse array");[m
[31m-[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return max;[m
[31m-}[m
[31m-[m
[31m-static void json_check_encode_depth(lua_State *l, json_config_t *cfg,[m
[31m-                                    int current_depth, strbuf_t *json)[m
[31m-{[m
[31m-    /* Ensure there are enough slots free to traverse a table (key,[m
[31m-     * value) and push a string for a potential error message.[m
[31m-     *[m
[31m-     * Unlike "decode", the key and value are still on the stack when[m
[31m-     * lua_checkstack() is called.  Hence an extra slot for luaL_error()[m
[31m-     * below is required just in case the next check to lua_checkstack()[m
[31m-     * fails.[m
[31m-     *[m
[31m-     * While this won't cause a crash due to the EXTRA_STACK reserve[m
[31m-     * slots, it would still be an improper use of the API. */[m
[31m-    if (current_depth <= cfg->encode_max_depth && lua_checkstack(l, 3))[m
[31m-        return;[m
[31m-[m
[31m-    if (!cfg->encode_keep_buffer)[m
[31m-        strbuf_free(json);[m
[31m-[m
[31m-    luaL_error(l, "Cannot serialise, excessive nesting (%d)",[m
[31m-               current_depth);[m
[31m-}[m
[31m-[m
[31m-static void json_append_data(lua_State *l, json_config_t *cfg,[m
[31m-                             int current_depth, strbuf_t *json);[m
[31m-[m
[31m-/* json_append_array args:[m
[31m- * - lua_State[m
[31m- * - JSON strbuf[m
[31m- * - Size of passwd Lua array (top of stack) */[m
[31m-static void json_append_array(lua_State *l, json_config_t *cfg, int current_depth,[m
[31m-                              strbuf_t *json, int array_length)[m
[31m-{[m
[31m-    int comma, i;[m
[31m-[m
[31m-    strbuf_append_char(json, '[');[m
[31m-[m
[31m-    comma = 0;[m
[31m-    for (i = 1; i <= array_length; i++) {[m
[31m-        if (comma)[m
[31m-            strbuf_append_char(json, ',');[m
[31m-        else[m
[31m-            comma = 1;[m
[31m-[m
[31m-        lua_rawgeti(l, -1, i);[m
[31m-        json_append_data(l, cfg, current_depth, json);[m
[31m-        lua_pop(l, 1);[m
[31m-    }[m
[31m-[m
[31m-    strbuf_append_char(json, ']');[m
[31m-}[m
[31m-[m
[31m-static void json_append_number(lua_State *l, json_config_t *cfg,[m
[31m-                               strbuf_t *json, int lindex)[m
[31m-{[m
[31m-    double num = lua_tonumber(l, lindex);[m
[31m-    int len;[m
[31m-[m
[31m-    if (cfg->encode_invalid_numbers == 0) {[m
[31m-        /* Prevent encoding invalid numbers */[m
[31m-        if (isinf(num) || isnan(num))[m
[31m-            json_encode_exception(l, cfg, json, lindex,[m
[31m-                                  "must not be NaN or Infinity");[m
[31m-    } else if (cfg->encode_invalid_numbers == 1) {[m
[31m-        /* Encode NaN/Infinity separately to ensure Javascript compatible[m
[31m-         * values are used. */[m
[31m-        if (isnan(num)) {[m
[31m-            strbuf_append_mem(json, "NaN", 3);[m
[31m-            return;[m
[31m-        }[m
[31m-        if (isinf(num)) {[m
[31m-            if (num < 0)[m
[31m-                strbuf_append_mem(json, "-Infinity", 9);[m
[31m-            else[m
[31m-                strbuf_append_mem(json, "Infinity", 8);[m
[31m-            return;[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* Encode invalid numbers as "null" */[m
[31m-        if (isinf(num) || isnan(num)) {[m
[31m-            strbuf_append_mem(json, "null", 4);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    strbuf_ensure_empty_length(json, FPCONV_G_FMT_BUFSIZE);[m
[31m-    len = fpconv_g_fmt(strbuf_empty_ptr(json), num, cfg->encode_number_precision);[m
[31m-    strbuf_extend_length(json, len);[m
[31m-}[m
[31m-[m
[31m-static void json_append_object(lua_State *l, json_config_t *cfg,[m
[31m-                               int current_depth, strbuf_t *json)[m
[31m-{[m
[31m-    int comma, keytype;[m
[31m-[m
[31m-    /* Object */[m
[31m-    strbuf_append_char(json, '{');[m
[31m-[m
[31m-    lua_pushnil(l);[m
[31m-    /* table, startkey */[m
[31m-    comma = 0;[m
[31m-    while (lua_next(l, -2) != 0) {[m
[31m-        if (comma)[m
[31m-            strbuf_append_char(json, ',');[m
[31m-        else[m
[31m-            comma = 1;[m
[31m-[m
[31m-        /* table, key, value */[m
[31m-        keytype = lua_type(l, -2);[m
[31m-        if (keytype == LUA_TNUMBER) {[m
[31m-            strbuf_append_char(json, '"');[m
[31m-            json_append_number(l, cfg, json, -2);[m
[31m-            strbuf_append_mem(json, "\":", 2);[m
[31m-        } else if (keytype == LUA_TSTRING) {[m
[31m-            json_append_string(l, json, -2);[m
[31m-            strbuf_append_char(json, ':');[m
[31m-        } else {[m
[31m-            json_encode_exception(l, cfg, json, -2,[m
[31m-                                  "table key must be a number or string");[m
[31m-            /* never returns */[m
[31m-        }[m
[31m-[m
[31m-        /* table, key, value */[m
[31m-        json_append_data(l, cfg, current_depth, json);[m
[31m-        lua_pop(l, 1);[m
[31m-        /* table, key */[m
[31m-    }[m
[31m-[m
[31m-    strbuf_append_char(json, '}');[m
[31m-}[m
[31m-[m
[31m-/* Serialise Lua data into JSON string. */[m
[31m-static void json_append_data(lua_State *l, json_config_t *cfg,[m
[31m-                             int current_depth, strbuf_t *json)[m
[31m-{[m
[31m-    int len;[m
[31m-[m
[31m-    switch (lua_type(l, -1)) {[m
[31m-    case LUA_TSTRING:[m
[31m-        json_append_string(l, json, -1);[m
[31m-        break;[m
[31m-    case LUA_TNUMBER:[m
[31m-        json_append_number(l, cfg, json, -1);[m
[31m-        break;[m
[31m-    case LUA_TBOOLEAN:[m
[31m-        if (lua_toboolean(l, -1))[m
[31m-            strbuf_append_mem(json, "true", 4);[m
[31m-        else[m
[31m-            strbuf_append_mem(json, "false", 5);[m
[31m-        break;[m
[31m-    case LUA_TTABLE:[m
[31m-        current_depth++;[m
[31m-        json_check_encode_depth(l, cfg, current_depth, json);[m
[31m-        len = lua_array_length(l, cfg, json);[m
[31m-        if (len > 0 || (len == 0 && !cfg->encode_empty_table_as_object))[m
[31m-            json_append_array(l, cfg, current_depth, json, len);[m
[31m-        else {[m
[31m-            int as_array = 0;[m
[31m-            if (lua_getmetatable(l, -1)) {[m
[31m-                lua_pushlightuserdata(l, &json_empty_array);[m
[31m-                lua_rawget(l, LUA_REGISTRYINDEX);[m
[31m-                as_array = lua_rawequal(l, -1, -2);[m
[31m-                lua_pop(l, 2);[m
[31m-            }[m
[31m-[m
[31m-            if (as_array) {[m
[31m-                json_append_array(l, cfg, current_depth, json, 0);[m
[31m-            } else {[m
[31m-                json_append_object(l, cfg, current_depth, json);[m
[31m-            }[m
[31m-        }[m
[31m-        break;[m
[31m-    case LUA_TNIL:[m
[31m-        strbuf_append_mem(json, "null", 4);[m
[31m-        break;[m
[31m-    case LUA_TLIGHTUSERDATA:[m
[31m-        if (lua_touserdata(l, -1) == NULL) {[m
[31m-            strbuf_append_mem(json, "null", 4);[m
[31m-        } else if (lua_touserdata(l, -1) == &json_empty_array) {[m
[31m-            json_append_array(l, cfg, current_depth, json, 0);[m
[31m-        }[m
[31m-        break;[m
[31m-    default:[m
[31m-        /* Remaining types (LUA_TFUNCTION, LUA_TUSERDATA, LUA_TTHREAD,[m
[31m-         * and LUA_TLIGHTUSERDATA) cannot be serialised */[m
[31m-        json_encode_exception(l, cfg, json, -1, "type not supported");[m
[31m-        /* never returns */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-static int json_encode(lua_State *l)[m
[31m-{[m
[31m-    json_config_t *cfg = json_fetch_config(l);[m
[31m-    strbuf_t local_encode_buf;[m
[31m-    strbuf_t *encode_buf;[m
[31m-    char *json;[m
[31m-    int len;[m
[31m-[m
[31m-    luaL_argcheck(l, lua_gettop(l) == 1, 1, "expected 1 argument");[m
[31m-[m
[31m-    if (!cfg->encode_keep_buffer) {[m
[31m-        /* Use private buffer */[m
[31m-        encode_buf = &local_encode_buf;[m
[31m-        strbuf_init(encode_buf, 0);[m
[31m-    } else {[m
[31m-        /* Reuse existing buffer */[m
[31m-        encode_buf = &cfg->encode_buf;[m
[31m-        strbuf_reset(encode_buf);[m
[31m-    }[m
[31m-[m
[31m-    json_append_data(l, cfg, 0, encode_buf);[m
[31m-    json = strbuf_string(encode_buf, &len);[m
[31m-[m
[31m-    lua_pushlstring(l, json, len);[m
[31m-[m
[31m-    if (!cfg->encode_keep_buffer)[m
[31m-        strbuf_free(encode_buf);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* ===== DECODING ===== */[m
[31m-[m
[31m-static void json_process_value(lua_State *l, json_parse_t *json,[m
[31m-                               json_token_t *token);[m
[31m-[m
[31m-static int hexdigit2int(char hex)[m
[31m-{[m
[31m-    if ('0' <= hex  && hex <= '9')[m
[31m-        return hex - '0';[m
[31m-[m
[31m-    /* Force lowercase */[m
[31m-    hex |= 0x20;[m
[31m-    if ('a' <= hex && hex <= 'f')[m
[31m-        return 10 + hex - 'a';[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-static int decode_hex4(const char *hex)[m
[31m-{[m
[31m-    int digit[4];[m
[31m-    int i;[m
[31m-[m
[31m-    /* Convert ASCII hex digit to numeric digit[m
[31m-     * Note: this returns an error for invalid hex digits, including[m
[31m-     *       NULL */[m
[31m-    for (i = 0; i < 4; i++) {[m
[31m-        digit[i] = hexdigit2int(hex[i]);[m
[31m-        if (digit[i] < 0) {[m
[31m-            return -1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return (digit[0] << 12) +[m
[31m-           (digit[1] << 8) +[m
[31m-           (digit[2] << 4) +[m
[31m-            digit[3];[m
[31m-}[m
[31m-[m
[31m-/* Converts a Unicode codepoint to UTF-8.[m
[31m- * Returns UTF-8 string length, and up to 4 bytes in *utf8 */[m
[31m-static int codepoint_to_utf8(char *utf8, int codepoint)[m
[31m-{[m
[31m-    /* 0xxxxxxx */[m
[31m-    if (codepoint <= 0x7F) {[m
[31m-        utf8[0] = codepoint;[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* 110xxxxx 10xxxxxx */[m
[31m-    if (codepoint <= 0x7FF) {[m
[31m-        utf8[0] = (codepoint >> 6) | 0xC0;[m
[31m-        utf8[1] = (codepoint & 0x3F) | 0x80;[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* 1110xxxx 10xxxxxx 10xxxxxx */[m
[31m-    if (codepoint <= 0xFFFF) {[m
[31m-        utf8[0] = (codepoint >> 12) | 0xE0;[m
[31m-        utf8[1] = ((codepoint >> 6) & 0x3F) | 0x80;[m
[31m-        utf8[2] = (codepoint & 0x3F) | 0x80;[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-    /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */[m
[31m-    if (codepoint <= 0x1FFFFF) {[m
[31m-        utf8[0] = (codepoint >> 18) | 0xF0;[m
[31m-        utf8[1] = ((codepoint >> 12) & 0x3F) | 0x80;[m
[31m-        utf8[2] = ((codepoint >> 6) & 0x3F) | 0x80;[m
[31m-        utf8[3] = (codepoint & 0x3F) | 0x80;[m
[31m-        return 4;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Called when index pointing to beginning of UTF-16 code escape: \uXXXX[m
[31m- * \u is guaranteed to exist, but the remaining hex characters may be[m
[31m- * missing.[m
[31m- * Translate to UTF-8 and append to temporary token string.[m
[31m- * Must advance index to the next character to be processed.[m
[31m- * Returns: 0   success[m
[31m- *          -1  error[m
[31m- */[m
[31m-static int json_append_unicode_escape(json_parse_t *json)[m
[31m-{[m
[31m-    char utf8[4];       /* Surrogate pairs require 4 UTF-8 bytes */[m
[31m-    int codepoint;[m
[31m-    int surrogate_low;[m
[31m-    int len;[m
[31m-    int escape_len = 6;[m
[31m-[m
[31m-    /* Fetch UTF-16 code unit */[m
[31m-    codepoint = decode_hex4(json->ptr + 2);[m
[31m-    if (codepoint < 0)[m
[31m-        return -1;[m
[31m-[m
[31m-    /* UTF-16 surrogate pairs take the following 2 byte form:[m
[31m-     *      11011 x yyyyyyyyyy[m
[31m-     * When x = 0: y is the high 10 bits of the codepoint[m
[31m-     *      x = 1: y is the low 10 bits of the codepoint[m
[31m-     *[m
[31m-     * Check for a surrogate pair (high or low) */[m
[31m-    if ((codepoint & 0xF800) == 0xD800) {[m
[31m-        /* Error if the 1st surrogate is not high */[m
[31m-        if (codepoint & 0x400)[m
[31m-            return -1;[m
[31m-[m
[31m-        /* Ensure the next code is a unicode escape */[m
[31m-        if (*(json->ptr + escape_len) != '\\' ||[m
[31m-            *(json->ptr + escape_len + 1) != 'u') {[m
[31m-            return -1;[m
[31m-        }[m
[31m-[m
[31m-        /* Fetch the next codepoint */[m
[31m-        surrogate_low = decode_hex4(json->ptr + 2 + escape_len);[m
[31m-        if (surrogate_low < 0)[m
[31m-            return -1;[m
[31m-[m
[31m-        /* Error if the 2nd code is not a low surrogate */[m
[31m-        if ((surrogate_low & 0xFC00) != 0xDC00)[m
[31m-            return -1;[m
[31m-[m
[31m-        /* Calculate Unicode codepoint */[m
[31m-        codepoint = (codepoint & 0x3FF) << 10;[m
[31m-        surrogate_low &= 0x3FF;[m
[31m-        codepoint = (codepoint | surrogate_low) + 0x10000;[m
[31m-        escape_len = 12;[m
[31m-    }[m
[31m-[m
[31m-    /* Convert codepoint to UTF-8 */[m
[31m-    len = codepoint_to_utf8(utf8, codepoint);[m
[31m-    if (!len)[m
[31m-        return -1;[m
[31m-[m
[31m-    /* Append bytes and advance parse index */[m
[31m-    strbuf_append_mem_unsafe(json->tmp, utf8, len);[m
[31m-    json->ptr += escape_len;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-static void json_set_token_error(json_token_t *token, json_parse_t *json,[m
[31m-                                 const char *errtype)[m
[31m-{[m
[31m-    token->type = T_ERROR;[m
[31m-    token->index = json->ptr - json->data;[m
[31m-    token->value.string = errtype;[m
[31m-}[m
[31m-[m
[31m-static void json_next_string_token(json_parse_t *json, json_token_t *token)[m
[31m-{[m
[31m-    char *escape2char = json->cfg->escape2char;[m
[31m-    char ch;[m
[31m-[m
[31m-    /* Caller must ensure a string is next */[m
[31m-    assert(*json->ptr == '"');[m
[31m-[m
[31m-    /* Skip " */[m
[31m-    json->ptr++;[m
[31m-[m
[31m-    /* json->tmp is the temporary strbuf used to accumulate the[m
[31m-     * decoded string value.[m
[31m-     * json->tmp is sized to handle JSON containing only a string value.[m
[31m-     */[m
[31m-    strbuf_reset(json->tmp);[m
[31m-[m
[31m-    while ((ch = *json->ptr) != '"') {[m
[31m-        if (!ch) {[m
[31m-            /* Premature end of the string */[m
[31m-            json_set_token_error(token, json, "unexpected end of string");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* Handle escapes */[m
[31m-        if (ch == '\\') {[m
[31m-            /* Fetch escape character */[m
[31m-            ch = *(json->ptr + 1);[m
[31m-[m
[31m-            /* Translate escape code and append to tmp string */[m
[31m-            ch = escape2char[(unsigned char)ch];[m
[31m-            if (ch == 'u') {[m
[31m-                if (json_append_unicode_escape(json) == 0)[m
[31m-                    continue;[m
[31m-[m
[31m-                json_set_token_error(token, json,[m
[31m-                                     "invalid unicode escape code");[m
[31m-                return;[m
[31m-            }[m
[31m-            if (!ch) {[m
[31m-                json_set_token_error(token, json, "invalid escape code");[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            /* Skip '\' */[m
[31m-            json->ptr++;[m
[31m-        }[m
[31m-        /* Append normal character or translated single character[m
[31m-         * Unicode escapes are handled above */[m
[31m-        strbuf_append_char_unsafe(json->tmp, ch);[m
[31m-        json->ptr++;[m
[31m-    }[m
[31m-    json->ptr++;    /* Eat final quote (") */[m
[31m-[m
[31m-    strbuf_ensure_null(json->tmp);[m
[31m-[m
[31m-    token->type = T_STRING;[m
[31m-    token->value.string = strbuf_string(json->tmp, &token->string_len);[m
[31m-}[m
[31m-[m
[31m-/* JSON numbers should take the following form:[m
[31m- *      -?(0|[1-9]|[1-9][0-9]+)(.[0-9]+)?([eE][-+]?[0-9]+)?[m
[31m- *[m
[31m- * json_next_number_token() uses strtod() which allows other forms:[m
[31m- * - numbers starting with '+'[m
[31m- * - NaN, -NaN, infinity, -infinity[m
[31m- * - hexadecimal numbers[m
[31m- * - numbers with leading zeros[m
[31m- *[m
[31m- * json_is_invalid_number() detects "numbers" which may pass strtod()'s[m
[31m- * error checking, but should not be allowed with strict JSON.[m
[31m- *[m
[31m- * json_is_invalid_number() may pass numbers which cause strtod()[m
[31m- * to generate an error.[m
[31m- */[m
[31m-static int json_is_invalid_number(json_parse_t *json)[m
[31m-{[m
[31m-    const char *p = json->ptr;[m
[31m-[m
[31m-    /* Reject numbers starting with + */[m
[31m-    if (*p == '+')[m
[31m-        return 1;[m
[31m-[m
[31m-    /* Skip minus sign if it exists */[m
[31m-    if (*p == '-')[m
[31m-        p++;[m
[31m-[m
[31m-    /* Reject numbers starting with 0x, or leading zeros */[m
[31m-    if (*p == '0') {[m
[31m-        int ch2 = *(p + 1);[m
[31m-[m
[31m-        if ((ch2 | 0x20) == 'x' ||          /* Hex */[m
[31m-            ('0' <= ch2 && ch2 <= '9'))     /* Leading zero */[m
[31m-            return 1;[m
[31m-[m
[31m-        return 0;[m
[31m-    } else if (*p <= '9') {[m
[31m-        return 0;                           /* Ordinary number */[m
[31m-    }[m
[31m-[m
[31m-    /* Reject inf/nan */[m
[31m-    if (!strncasecmp(p, "inf", 3))[m
[31m-        return 1;[m
[31m-    if (!strncasecmp(p, "nan", 3))[m
[31m-        return 1;[m
[31m-[m
[31m-    /* Pass all other numbers which may still be invalid, but[m
[31m-     * strtod() will catch them. */[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-static void json_next_number_token(json_parse_t *json, json_token_t *token)[m
[31m-{[m
[31m-    char *endptr;[m
[31m-[m
[31m-    token->type = T_NUMBER;[m
[31m-    token->value.number = fpconv_strtod(json->ptr, &endptr);[m
[31m-    if (json->ptr == endptr)[m
[31m-        json_set_token_error(token, json, "invalid number");[m
[31m-    else[m
[31m-        json->ptr = endptr;     /* Skip the processed number */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-/* Fills in the token struct.[m
[31m- * T_STRING will return a pointer to the json_parse_t temporary string[m
[31m- * T_ERROR will leave the json->ptr pointer at the error.[m
[31m- */[m
[31m-static void json_next_token(json_parse_t *json, json_token_t *token)[m
[31m-{[m
[31m-    const json_token_type_t *ch2token = json->cfg->ch2token;[m
[31m-    int ch;[m
[31m-[m
[31m-    /* Eat whitespace. */[m
[31m-    while (1) {[m
[31m-        ch = (unsigned char)*(json->ptr);[m
[31m-        token->type = ch2token[ch];[m
[31m-        if (token->type != T_WHITESPACE)[m
[31m-            break;[m
[31m-        json->ptr++;[m
[31m-    }[m
[31m-[m
[31m-    /* Store location of new token. Required when throwing errors[m
[31m-     * for unexpected tokens (syntax errors). */[m
[31m-    token->index = json->ptr - json->data;[m
[31m-[m
[31m-    /* Don't advance the pointer for an error or the end */[m
[31m-    if (token->type == T_ERROR) {[m
[31m-        json_set_token_error(token, json, "invalid token");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (token->type == T_END) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* Found a known single character token, advance index and return */[m
[31m-    if (token->type != T_UNKNOWN) {[m
[31m-        json->ptr++;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* Process characters which triggered T_UNKNOWN[m
[31m-     *[m
[31m-     * Must use strncmp() to match the front of the JSON string.[m
[31m-     * JSON identifier must be lowercase.[m
[31m-     * When strict_numbers if disabled, either case is allowed for[m
[31m-     * Infinity/NaN (since we are no longer following the spec..) */[m
[31m-    if (ch == '"') {[m
[31m-        json_next_string_token(json, token);[m
[31m-        return;[m
[31m-    } else if (ch == '-' || ('0' <= ch && ch <= '9')) {[m
[31m-        if (!json->cfg->decode_invalid_numbers && json_is_invalid_number(json)) {[m
[31m-            json_set_token_error(token, json, "invalid number");[m
[31m-            return;[m
[31m-        }[m
[31m-        json_next_number_token(json, token);[m
[31m-        return;[m
[31m-    } else if (!strncmp(json->ptr, "true", 4)) {[m
[31m-        token->type = T_BOOLEAN;[m
[31m-        token->value.boolean = 1;[m
[31m-        json->ptr += 4;[m
[31m-        return;[m
[31m-    } else if (!strncmp(json->ptr, "false", 5)) {[m
[31m-        token->type = T_BOOLEAN;[m
[31m-        token->value.boolean = 0;[m
[31m-        json->ptr += 5;[m
[31m-        return;[m
[31m-    } else if (!strncmp(json->ptr, "null", 4)) {[m
[31m-        token->type = T_NULL;[m
[31m-        json->ptr += 4;[m
[31m-        return;[m
[31m-    } else if (json->cfg->decode_invalid_numbers &&[m
[31m-               json_is_invalid_number(json)) {[m
[31m-        /* When decode_invalid_numbers is enabled, only attempt to process[m
[31m-         * numbers we know are invalid JSON (Inf, NaN, hex)[m
[31m-         * This is required to generate an appropriate token error,[m
[31m-         * otherwise all bad tokens will register as "invalid number"[m
[31m-         */[m
[31m-        json_next_number_token(json, token);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* Token starts with t/f/n but isn't recognised above. */[m
[31m-    json_set_token_error(token, json, "invalid token");[m
[31m-}[m
[31m-[m
[31m-/* This function does not return.[m
[31m- * DO NOT CALL WITH DYNAMIC MEMORY ALLOCATED.[m
[31m- * The only supported exception is the temporary parser string[m
[31m- * json->tmp struct.[m
[31m- * json and token should exist on the stack somewhere.[m
[31m- * luaL_error() will long_jmp and release the stack */[m
[31m-static void json_throw_parse_error(lua_State *l, json_parse_t *json,[m
[31m-                                   const char *exp, json_token_t *token)[m
[31m-{[m
[31m-    const char *found;[m
[31m-[m
[31m-    strbuf_free(json->tmp);[m
[31m-[m
[31m-    if (token->type == T_ERROR)[m
[31m-        found = token->value.string;[m
[31m-    else[m
[31m-        found = json_token_type_name[token->type];[m
[31m-[m
[31m-    /* Note: token->index is 0 based, display starting from 1 */[m
[31m-    luaL_error(l, "Expected %s but found %s at character %d",[m
[31m-               exp, found, token->index + 1);[m
[31m-}[m
[31m-[m
[31m-static inline void json_decode_ascend(json_parse_t *json)[m
[31m-{[m
[31m-    json->current_depth--;[m
[31m-}[m
[31m-[m
[31m-static void json_decode_descend(lua_State *l, json_parse_t *json, int slots)[m
[31m-{[m
[31m-    json->current_depth++;[m
[31m-[m
[31m-    if (json->current_depth <= json->cfg->decode_max_depth &&[m
[31m-        lua_checkstack(l, slots)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    strbuf_free(json->tmp);[m
[31m-    luaL_error(l, "Found too many nested data structures (%d) at character %d",[m
[31m-        json->current_depth, json->ptr - json->data);[m
[31m-}[m
[31m-[m
[31m-static void json_parse_object_context(lua_State *l, json_parse_t *json)[m
[31m-{[m
[31m-    json_token_t token;[m
[31m-[m
[31m-    /* 3 slots required:[m
[31m-     * .., table, key, value */[m
[31m-    json_decode_descend(l, json, 3);[m
[31m-[m
[31m-    lua_newtable(l);[m
[31m-[m
[31m-    json_next_token(json, &token);[m
[31m-[m
[31m-    /* Handle empty objects */[m
[31m-    if (token.type == T_OBJ_END) {[m
[31m-        json_decode_ascend(json);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    while (1) {[m
[31m-        if (token.type != T_STRING)[m
[31m-            json_throw_parse_error(l, json, "object key string", &token);[m
[31m-[m
[31m-        /* Push key */[m
[31m-        lua_pushlstring(l, token.value.string, token.string_len);[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-        if (token.type != T_COLON)[m
[31m-            json_throw_parse_error(l, json, "colon", &token);[m
[31m-[m
[31m-        /* Fetch value */[m
[31m-        json_next_token(json, &token);[m
[31m-        json_process_value(l, json, &token);[m
[31m-[m
[31m-        /* Set key = value */[m
[31m-        lua_rawset(l, -3);[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-[m
[31m-        if (token.type == T_OBJ_END) {[m
[31m-            json_decode_ascend(json);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (token.type != T_COMMA)[m
[31m-            json_throw_parse_error(l, json, "comma or object end", &token);[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* Handle the array context */[m
[31m-static void json_parse_array_context(lua_State *l, json_parse_t *json)[m
[31m-{[m
[31m-    json_token_t token;[m
[31m-    int i;[m
[31m-[m
[31m-    /* 2 slots required:[m
[31m-     * .., table, value */[m
[31m-    json_decode_descend(l, json, 2);[m
[31m-[m
[31m-    lua_newtable(l);[m
[31m-[m
[31m-    json_next_token(json, &token);[m
[31m-[m
[31m-    /* Handle empty arrays */[m
[31m-    if (token.type == T_ARR_END) {[m
[31m-        json_decode_ascend(json);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; ; i++) {[m
[31m-        json_process_value(l, json, &token);[m
[31m-        lua_rawseti(l, -2, i);            /* arr[i] = value */[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-[m
[31m-        if (token.type == T_ARR_END) {[m
[31m-            json_decode_ascend(json);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (token.type != T_COMMA)[m
[31m-            json_throw_parse_error(l, json, "comma or array end", &token);[m
[31m-[m
[31m-        json_next_token(json, &token);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* Handle the "value" context */[m
[31m-static void json_process_value(lua_State *l, json_parse_t *json,[m
[31m-                               json_token_t *token)[m
[31m-{[m
[31m-    switch (token->type) {[m
[31m-    case T_STRING:[m
[31m-        lua_pushlstring(l, token->value.string, token->string_len);[m
[31m-        break;;[m
[31m-    case T_NUMBER:[m
[31m-        lua_pushnumber(l, token->value.number);[m
[31m-        break;;[m
[31m-    case T_BOOLEAN:[m
[31m-        lua_pushboolean(l, token->value.boolean);[m
[31m-        break;;[m
[31m-    case T_OBJ_BEGIN:[m
[31m-        json_parse_object_context(l, json);[m
[31m-        break;;[m
[31m-    case T_ARR_BEGIN:[m
[31m-        json_parse_array_context(l, json);[m
[31m-        break;;[m
[31m-    case T_NULL:[m
[31m-        /* In Lua, setting "t[k] = nil" will delete k from the table.[m
[31m-         * Hence a NULL pointer lightuserdata object is used instead */[m
[31m-        lua_pushlightuserdata(l, NULL);[m
[31m-        break;;[m
[31m-    default:[m
[31m-        json_throw_parse_error(l, json, "value", token);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-static int json_decode(lua_State *l)[m
[31m-{[m
[31m-    json_parse_t json;[m
[31m-    json_token_t token;[m
[31m-    size_t json_len;[m
[31m-[m
[31m-    luaL_argcheck(l, lua_gettop(l) == 1, 1, "expected 1 argument");[m
[31m-[m
[31m-    json.cfg = json_fetch_config(l);[m
[31m-    json.data = luaL_checklstring(l, 1, &json_len);[m
[31m-    json.current_depth = 0;[m
[31m-    json.ptr = json.data;[m
[31m-[m
[31m-    /* Detect Unicode other than UTF-8 (see RFC 4627, Sec 3)[m
[31m-     *[m
[31m-     * CJSON can support any simple data type, hence only the first[m
[31m-     * character is guaranteed to be ASCII (at worst: '"'). This is[m
[31m-     * still enough to detect whether the wrong encoding is in use. */[m
[31m-    if (json_len >= 2 && (!json.data[0] || !json.data[1]))[m
[31m-        luaL_error(l, "JSON parser does not support UTF-16 or UTF-32");[m
[31m-[m
[31m-    /* Ensure the temporary buffer can hold the entire string.[m
[31m-     * This means we no longer need to do length checks since the decoded[m
[31m-     * string must be smaller than the entire json string */[m
[31m-    json.tmp = strbuf_new(json_len);[m
[31m-[m
[31m-    json_next_token(&json, &token);[m
[31m-    json_process_value(l, &json, &token);[m
[31m-[m
[31m-    /* Ensure there is no more input left */[m
[31m-    json_next_token(&json, &token);[m
[31m-[m
[31m-    if (token.type != T_END)[m
[31m-        json_throw_parse_error(l, &json, "the end", &token);[m
[31m-[m
[31m-    strbuf_free(json.tmp);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* ===== INITIALISATION ===== */[m
[31m-[m
[31m-#if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502[m
[31m-/* Compatibility for Lua 5.1.[m
[31m- *[m
[31m- * luaL_setfuncs() is used to create a module table where the functions have[m
[31m- * json_config_t as their first upvalue. Code borrowed from Lua 5.2 source. */[m
[31m-static void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)[m
[31m-{[m
[31m-    int i;[m
[31m-[m
[31m-    luaL_checkstack(l, nup, "too many upvalues");[m
[31m-    for (; reg->name != NULL; reg++) {  /* fill the table with given functions */[m
[31m-        for (i = 0; i < nup; i++)  /* copy upvalues to the top */[m
[31m-            lua_pushvalue(l, -nup);[m
[31m-        lua_pushcclosure(l, reg->func, nup);  /* closure with those upvalues */[m
[31m-        lua_setfield(l, -(nup + 2), reg->name);[m
[31m-    }[m
[31m-    lua_pop(l, nup);  /* remove upvalues */[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* Call target function in protected mode with all supplied args.[m
[31m- * Assumes target function only returns a single non-nil value.[m
[31m- * Convert and return thrown errors as: nil, "error message" */[m
[31m-static int json_protect_conversion(lua_State *l)[m
[31m-{[m
[31m-    int err;[m
[31m-[m
[31m-    /* Deliberately throw an error for invalid arguments */[m
[31m-    luaL_argcheck(l, lua_gettop(l) == 1, 1, "expected 1 argument");[m
[31m-[m
[31m-    /* pcall() the function stored as upvalue(1) */[m
[31m-    lua_pushvalue(l, lua_upvalueindex(1));[m
[31m-    lua_insert(l, 1);[m
[31m-    err = lua_pcall(l, 1, 1, 0);[m
[31m-    if (!err)[m
[31m-        return 1;[m
[31m-[m
[31m-    if (err == LUA_ERRRUN) {[m
[31m-        lua_pushnil(l);[m
[31m-        lua_insert(l, -2);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* Since we are not using a custom error handler, the only remaining[m
[31m-     * errors are memory related */[m
[31m-    return luaL_error(l, "Memory allocation error in CJSON protected call");[m
[31m-}[m
[31m-[m
[31m-/* Return cjson module table */[m
[31m-static int lua_cjson_new(lua_State *l)[m
[31m-{[m
[31m-    luaL_Reg reg[] = {[m
[31m-        { "encode", json_encode },[m
[31m-        { "decode", json_decode },[m
[31m-        { "encode_empty_table_as_object", json_cfg_encode_empty_table_as_object },[m
[31m-        { "encode_sparse_array", json_cfg_encode_sparse_array },[m
[31m-        { "encode_max_depth", json_cfg_encode_max_depth },[m
[31m-        { "decode_max_depth", json_cfg_decode_max_depth },[m
[31m-        { "encode_number_precision", json_cfg_encode_number_precision },[m
[31m-        { "encode_keep_buffer", json_cfg_encode_keep_buffer },[m
[31m-        { "encode_invalid_numbers", json_cfg_encode_invalid_numbers },[m
[31m-        { "decode_invalid_numbers", json_cfg_decode_invalid_numbers },[m
[31m-        { "new", lua_cjson_new },[m
[31m-        { NULL, NULL }[m
[31m-    };[m
[31m-[m
[31m-    /* Initialise number conversions */[m
[31m-    fpconv_init();[m
[31m-[m
[31m-    /* Create empty array metatable */[m
[31m-    lua_pushlightuserdata(l, &json_empty_array);[m
[31m-    lua_newtable(l);[m
[31m-    lua_rawset(l, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    /* cjson module table */[m
[31m-    lua_newtable(l);[m
[31m-[m
[31m-    /* Register functions with config data as upvalue */[m
[31m-    json_create_config(l);[m
[31m-    luaL_setfuncs(l, reg, 1);[m
[31m-[m
[31m-    /* Set cjson.null */[m
[31m-    lua_pushlightuserdata(l, NULL);[m
[31m-    lua_setfield(l, -2, "null");[m
[31m-[m
[31m-    /* Set cjson.empty_array_mt */[m
[31m-    lua_pushlightuserdata(l, &json_empty_array);[m
[31m-    lua_rawget(l, LUA_REGISTRYINDEX);[m
[31m-    lua_setfield(l, -2, "empty_array_mt");[m
[31m-[m
[31m-    /* Set cjson.empty_array */[m
[31m-    lua_pushlightuserdata(l, &json_empty_array);[m
[31m-    lua_setfield(l, -2, "empty_array");[m
[31m-[m
[31m-    /* Set module name / version fields */[m
[31m-    lua_pushliteral(l, CJSON_MODNAME);[m
[31m-    lua_setfield(l, -2, "_NAME");[m
[31m-    lua_pushliteral(l, CJSON_VERSION);[m
[31m-    lua_setfield(l, -2, "_VERSION");[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* Return cjson.safe module table */[m
[31m-static int lua_cjson_safe_new(lua_State *l)[m
[31m-{[m
[31m-    const char *func[] = { "decode", "encode", NULL };[m
[31m-    int i;[m
[31m-[m
[31m-    lua_cjson_new(l);[m
[31m-[m
[31m-    /* Fix new() method */[m
[31m-    lua_pushcfunction(l, lua_cjson_safe_new);[m
[31m-    lua_setfield(l, -2, "new");[m
[31m-[m
[31m-    for (i = 0; func[i]; i++) {[m
[31m-        lua_getfield(l, -1, func[i]);[m
[31m-        lua_pushcclosure(l, json_protect_conversion, 1);[m
[31m-        lua_setfield(l, -2, func[i]);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-int luaopen_cjson(lua_State *l)[m
[31m-{[m
[31m-    lua_cjson_new(l);[m
[31m-[m
[31m-#ifdef ENABLE_CJSON_GLOBAL[m
[31m-    /* Register a global "cjson" table. */[m
[31m-    lua_pushvalue(l, -1);[m
[31m-    lua_setglobal(l, CJSON_MODNAME);[m
[31m-#endif[m
[31m-[m
[31m-    /* Return cjson table */[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-int luaopen_cjson_safe(lua_State *l)[m
[31m-{[m
[31m-    lua_cjson_safe_new(l);[m
[31m-[m
[31m-    /* Return cjson.safe table */[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/manual.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/manual.txt[m
[1mdeleted file mode 100644[m
[1mindex a12e378..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/manual.txt[m
[1m+++ /dev/null[m
[36m@@ -1,612 +0,0 @@[m
[31m-= Lua CJSON 2.1devel Manual =[m
[31m-Mark Pulford <mark@kyne.com.au>[m
[31m-:revdate: 1st March 2012[m
[31m-[m
[31m-Overview[m
[31m---------[m
[31m-[m
[31m-The Lua CJSON module provides JSON support for Lua.[m
[31m-[m
[31m-*Features*::[m
[31m-- Fast, standards compliant encoding/parsing routines[m
[31m-- Full support for JSON with UTF-8, including decoding surrogate pairs[m
[31m-- Optional run-time support for common exceptions to the JSON[m
[31m-  specification (infinity, NaN,..)[m
[31m-- No dependencies on other libraries[m
[31m-[m
[31m-*Caveats*::[m
[31m-- UTF-16 and UTF-32 are not supported[m
[31m-[m
[31m-Lua CJSON is covered by the MIT license. Review the file +LICENSE+ for[m
[31m-details.[m
[31m-[m
[31m-The latest version of this software is available from the[m
[31m-http://www.kyne.com.au/%7Emark/software/lua-cjson.php[Lua CJSON website].[m
[31m-[m
[31m-Feel free to email me if you have any patches, suggestions, or comments.[m
[31m-[m
[31m-[m
[31m-Installation[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON requires either http://www.lua.org[Lua] 5.1, Lua 5.2, or[m
[31m-http://www.luajit.org[LuaJIT] to build.[m
[31m-[m
[31m-The build method can be selected from 4 options:[m
[31m-[m
[31m-Make:: Unix (including Linux, BSD, Mac OSX & Solaris), Windows[m
[31m-CMake:: Unix, Windows[m
[31m-RPM:: Linux[m
[31m-LuaRocks:: Unix, Windows[m
[31m-[m
[31m-[m
[31m-Make[m
[31m-~~~~[m
[31m-[m
[31m-The included +Makefile+ has generic settings.[m
[31m-[m
[31m-First, review and update the included makefile to suit your platform (if[m
[31m-required).[m
[31m-[m
[31m-Next, build and install the module:[m
[31m-[m
[31m-[source,sh][m
[31m-make install[m
[31m-[m
[31m-Or install manually into your Lua module directory:[m
[31m-[m
[31m-[source,sh][m
[31m-make[m
[31m-cp cjson.so $LUA_MODULE_DIRECTORY[m
[31m-[m
[31m-[m
[31m-CMake[m
[31m-~~~~~[m
[31m-[m
[31m-http://www.cmake.org[CMake] can generate build configuration for many[m
[31m-different platforms (including Unix and Windows).[m
[31m-[m
[31m-First, generate the makefile for your platform using CMake. If CMake is[m
[31m-unable to find Lua, manually set the +LUA_DIR+ environment variable to[m
[31m-the base prefix of your Lua 5.1 installation.[m
[31m-[m
[31m-While +cmake+ is used in the example below, +ccmake+ or +cmake-gui+ may[m
[31m-be used to present an interface for changing the default build options.[m
[31m-[m
[31m-[source,sh][m
[31m-mkdir build[m
[31m-cd build[m
[31m-# Optional: export LUA_DIR=$LUA51_PREFIX[m
[31m-cmake ..[m
[31m-[m
[31m-Next, build and install the module:[m
[31m-[m
[31m-[source,sh][m
[31m-make install[m
[31m-# Or:[m
[31m-make[m
[31m-cp cjson.so $LUA_MODULE_DIRECTORY[m
[31m-[m
[31m-Review the[m
[31m-http://www.cmake.org/cmake/help/documentation.html[CMake documentation][m
[31m-for further details.[m
[31m-[m
[31m-[m
[31m-RPM[m
[31m-~~~[m
[31m-[m
[31m-Linux distributions using http://rpm.org[RPM] can create a package via[m
[31m-the included RPM spec file. Ensure the +rpm-build+ package (or similar)[m
[31m-has been installed.[m
[31m-[m
[31m-Build and install the module via RPM:[m
[31m-[m
[31m-[source,sh][m
[31m-rpmbuild -tb lua-cjson-2.1devel.tar.gz[m
[31m-rpm -Uvh $LUA_CJSON_RPM[m
[31m-[m
[31m-[m
[31m-LuaRocks[m
[31m-~~~~~~~~[m
[31m-[m
[31m-http://luarocks.org[LuaRocks] can be used to install and manage Lua[m
[31m-modules on a wide range of platforms (including Windows).[m
[31m-[m
[31m-First, extract the Lua CJSON source package.[m
[31m-[m
[31m-Next, install the module:[m
[31m-[m
[31m-[source,sh][m
[31m-cd lua-cjson-2.1devel[m
[31m-luarocks make[m
[31m-[m
[31m-[NOTE][m
[31m-LuaRocks does not support platform specific configuration for Solaris.[m
[31m-On Solaris, you may need to manually uncomment +USE_INTERNAL_ISINF+ in[m
[31m-the rockspec before building this module.[m
[31m-[m
[31m-Review the http://luarocks.org/en/Documentation[LuaRocks documentation][m
[31m-for further details.[m
[31m-[m
[31m-[m
[31m-[[build_options]][m
[31m-Build Options (#define)[m
[31m-~~~~~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-Lua CJSON offers several +#define+ build options to address portability[m
[31m-issues, and enable non-default features. Some build methods may[m
[31m-automatically set platform specific options if required. Other features[m
[31m-should be enabled manually.[m
[31m-[m
[31m-USE_INTERNAL_ISINF:: Workaround for Solaris platforms missing +isinf+.[m
[31m-DISABLE_INVALID_NUMBERS:: Recommended on platforms where +strtod+ /[m
[31m-  +sprintf+ are not POSIX compliant (eg, Windows MinGW). Prevents[m
[31m-  +cjson.encode_invalid_numbers+ and +cjson.decode_invalid_numbers+ from[m
[31m-  being enabled. However, +cjson.encode_invalid_numbers+ may still be[m
[31m-  set to +"null"+. When using the Lua CJSON built-in floating point[m
[31m-  conversion this option is unnecessary and is ignored.[m
[31m-[m
[31m-[m
[31m-Built-in floating point conversion[m
[31m-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[m
[31m-[m
[31m-Lua CJSON may be built with David Gay's[m
[31m-http://www.netlib.org/fp/[floating point conversion routines]. This can[m
[31m-increase overall performance by up to 50% on some platforms when[m
[31m-converting a large amount of numeric data. However, this option reduces[m
[31m-portability and is disabled by default.[m
[31m-[m
[31m-USE_INTERNAL_FPCONV:: Enable internal number conversion routines.[m
[31m-IEEE_BIG_ENDIAN:: Must be set on big endian architectures.[m
[31m-MULTIPLE_THREADS:: Must be set if Lua CJSON may be used in a[m
[31m-  multi-threaded application. Requires the _pthreads_ library.[m
[31m-[m
[31m-[m
[31m-API (Functions)[m
[31m----------------[m
[31m-[m
[31m-Synopsis[m
[31m-~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m--- Module instantiation[m
[31m-local cjson = require "cjson"[m
[31m-local cjson2 = cjson.new()[m
[31m-local cjson_safe = require "cjson.safe"[m
[31m-[m
[31m--- Translate Lua value to/from JSON[m
[31m-text = cjson.encode(value)[m
[31m-value = cjson.decode(text)[m
[31m-[m
[31m--- Get and/or set Lua CJSON configuration[m
[31m-setting = cjson.decode_invalid_numbers([setting])[m
[31m-setting = cjson.encode_invalid_numbers([setting])[m
[31m-keep = cjson.encode_keep_buffer([keep])[m
[31m-depth = cjson.encode_max_depth([depth])[m
[31m-depth = cjson.decode_max_depth([depth])[m
[31m-convert, ratio, safe = cjson.encode_sparse_array([convert[, ratio[, safe]]])[m
[31m-------------[m
[31m-[m
[31m-[m
[31m-Module Instantiation[m
[31m-~~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-local cjson = require "cjson"[m
[31m-local cjson2 = cjson.new()[m
[31m-local cjson_safe = require "cjson.safe"[m
[31m-------------[m
[31m-[m
[31m-Import Lua CJSON via the Lua +require+ function. Lua CJSON does not[m
[31m-register a global module table.[m
[31m-[m
[31m-The +cjson+ module will throw an error during JSON conversion if any[m
[31m-invalid data is encountered. Refer to <<cjson_encode,+cjson.encode+>>[m
[31m-and <<cjson_decode,+cjson.decode+>> for details.[m
[31m-[m
[31m-The +cjson.safe+ module behaves identically to the +cjson+ module,[m
[31m-except when errors are encountered during JSON conversion. On error, the[m
[31m-+cjson_safe.encode+ and +cjson_safe.decode+ functions will return[m
[31m-+nil+ followed by the error message.[m
[31m-[m
[31m-+cjson.new+ can be used to instantiate an independent copy of the Lua[m
[31m-CJSON module. The new module has a separate persistent encoding buffer,[m
[31m-and default settings.[m
[31m-[m
[31m-Lua CJSON can support Lua implementations using multiple preemptive[m
[31m-threads within a single Lua state provided the persistent encoding[m
[31m-buffer is not shared. This can be achieved by one of the following[m
[31m-methods:[m
[31m-[m
[31m-- Disabling the persistent encoding buffer with[m
[31m-  <<encode_keep_buffer,+cjson.encode_keep_buffer+>>[m
[31m-- Ensuring each thread calls <<encode,+cjson.encode+>> separately (ie,[m
[31m-  treat +cjson.encode+ as non-reentrant).[m
[31m-- Using a separate +cjson+ module table per preemptive thread[m
[31m-  (+cjson.new+)[m
[31m-[m
[31m-[NOTE][m
[31m-Lua CJSON uses +strtod+ and +snprintf+ to perform numeric conversion as[m
[31m-they are usually well supported, fast and bug free. However, these[m
[31m-functions require a workaround for JSON encoding/parsing under locales[m
[31m-using a comma decimal separator. Lua CJSON detects the current locale[m
[31m-during instantiation to determine and automatically implement the[m
[31m-workaround if required. Lua CJSON should be reinitialised via[m
[31m-+cjson.new+ if the locale of the current process changes. Using a[m
[31m-different locale per thread is not supported.[m
[31m-[m
[31m-[m
[31m-decode[m
[31m-~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-value = cjson.decode(json_text)[m
[31m-------------[m
[31m-[m
[31m-+cjson.decode+ will deserialise any UTF-8 JSON string into a Lua value[m
[31m-or table.[m
[31m-[m
[31m-UTF-16 and UTF-32 JSON strings are not supported.[m
[31m-[m
[31m-+cjson.decode+ requires that any NULL (ASCII 0) and double quote (ASCII[m
[31m-34) characters are escaped within strings. All escape codes will be[m
[31m-decoded and other bytes will be passed transparently. UTF-8 characters[m
[31m-are not validated during decoding and should be checked elsewhere if[m
[31m-required.[m
[31m-[m
[31m-JSON +null+ will be converted to a NULL +lightuserdata+ value. This can[m
[31m-be compared with +cjson.null+ for convenience.[m
[31m-[m
[31m-By default, numbers incompatible with the JSON specification (infinity,[m
[31m-NaN, hexadecimal) can be decoded. This default can be changed with[m
[31m-<<decode_invalid_numbers,+cjson.decode_invalid_numbers+>>.[m
[31m-[m
[31m-.Example: Decoding[m
[31m-[source,lua][m
[31m-json_text = '[ true, { "foo": "bar" } ]'[m
[31m-value = cjson.decode(json_text)[m
[31m--- Returns: { true, { foo = "bar" } }[m
[31m-[m
[31m-[CAUTION][m
[31m-Care must be taken after decoding JSON objects with numeric keys. Each[m
[31m-numeric key will be stored as a Lua +string+. Any subsequent code[m
[31m-assuming type +number+ may break.[m
[31m-[m
[31m-[m
[31m-[[decode_invalid_numbers]][m
[31m-decode_invalid_numbers[m
[31m-~~~~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-setting = cjson.decode_invalid_numbers([setting])[m
[31m--- "setting" must be a boolean. Default: true.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON may generate an error when trying to decode numbers not[m
[31m-supported by the JSON specification. _Invalid numbers_ are defined as:[m
[31m-[m
[31m-- infinity[m
[31m-- NaN[m
[31m-- hexadecimal[m
[31m-[m
[31m-Available settings:[m
[31m-[m
[31m-+true+:: Accept and decode _invalid numbers_. This is the default[m
[31m-  setting.[m
[31m-+false+:: Throw an error when _invalid numbers_ are encountered.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[decode_max_depth]][m
[31m-decode_max_depth[m
[31m-~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-depth = cjson.decode_max_depth([depth])[m
[31m--- "depth" must be a positive integer. Default: 1000.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON will generate an error when parsing deeply nested JSON once[m
[31m-the maximum array/object depth has been exceeded. This check prevents[m
[31m-unnecessarily complicated JSON from slowing down the application, or[m
[31m-crashing the application due to lack of process stack space.[m
[31m-[m
[31m-An error may be generated before the depth limit is hit if Lua is unable[m
[31m-to allocate more objects on the Lua stack.[m
[31m-[m
[31m-By default, Lua CJSON will reject JSON with arrays and/or objects nested[m
[31m-more than 1000 levels deep.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[encode]][m
[31m-encode[m
[31m-~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-json_text = cjson.encode(value)[m
[31m-------------[m
[31m-[m
[31m-+cjson.encode+ will serialise a Lua value into a string containing the[m
[31m-JSON representation.[m
[31m-[m
[31m-+cjson.encode+ supports the following types:[m
[31m-[m
[31m-- +boolean+[m
[31m-- +lightuserdata+ (NULL value only)[m
[31m-- +nil+[m
[31m-- +number+[m
[31m-- +string+[m
[31m-- +table+[m
[31m-[m
[31m-The remaining Lua types will generate an error:[m
[31m-[m
[31m-- +function+[m
[31m-- +lightuserdata+ (non-NULL values)[m
[31m-- +thread+[m
[31m-- +userdata+[m
[31m-[m
[31m-By default, numbers are encoded with 14 significant digits. Refer to[m
[31m-<<encode_number_precision,+cjson.encode_number_precision+>> for details.[m
[31m-[m
[31m-Lua CJSON will escape the following characters within each UTF-8 string:[m
[31m-[m
[31m-- Control characters (ASCII 0 - 31)[m
[31m-- Double quote (ASCII 34)[m
[31m-- Forward slash (ASCII 47)[m
[31m-- Blackslash (ASCII 92)[m
[31m-- Delete (ASCII 127)[m
[31m-[m
[31m-All other bytes are passed transparently.[m
[31m-[m
[31m-[CAUTION][m
[31m-=========[m
[31m-Lua CJSON will successfully encode/decode binary strings, but this is[m
[31m-technically not supported by JSON and may not be compatible with other[m
[31m-JSON libraries. To ensure the output is valid JSON, applications should[m
[31m-ensure all Lua strings passed to +cjson.encode+ are UTF-8.[m
[31m-[m
[31m-Base64 is commonly used to encode binary data as the most efficient[m
[31m-encoding under UTF-8 can only reduce the encoded size by a further[m
[31m-&#126;8%. Lua Base64 routines can be found in the[m
[31m-http://w3.impa.br/%7Ediego/software/luasocket/[LuaSocket] and[m
[31m-http://www.tecgraf.puc-rio.br/%7Elhf/ftp/lua/#lbase64[lbase64] packages.[m
[31m-=========[m
[31m-[m
[31m-Lua CJSON uses a heuristic to determine whether to encode a Lua table as[m
[31m-a JSON array or an object. A Lua table with only positive integer keys[m
[31m-of type +number+ will be encoded as a JSON array. All other tables will[m
[31m-be encoded as a JSON object.[m
[31m-[m
[31m-Lua CJSON does not use metamethods when serialising tables.[m
[31m-[m
[31m-- +rawget+ is used to iterate over Lua arrays[m
[31m-- +next+ is used to iterate over Lua objects[m
[31m-[m
[31m-Lua arrays with missing entries (_sparse arrays_) may optionally be[m
[31m-encoded in several different ways. Refer to[m
[31m-<<encode_sparse_array,+cjson.encode_sparse_array+>> for details.[m
[31m-[m
[31m-JSON object keys are always strings. Hence +cjson.encode+ only supports[m
[31m-table keys which are type +number+ or +string+. All other types will[m
[31m-generate an error.[m
[31m-[m
[31m-[NOTE][m
[31m-Standards compliant JSON must be encapsulated in either an object (+{}+)[m
[31m-or an array (+[]+). If strictly standards compliant JSON is desired, a[m
[31m-table must be passed to +cjson.encode+.[m
[31m-[m
[31m-By default, encoding the following Lua values will generate errors:[m
[31m-[m
[31m-- Numbers incompatible with the JSON specification (infinity, NaN)[m
[31m-- Tables nested more than 1000 levels deep[m
[31m-- Excessively sparse Lua arrays[m
[31m-[m
[31m-These defaults can be changed with:[m
[31m-[m
[31m-- <<encode_invalid_numbers,+cjson.encode_invalid_numbers+>>[m
[31m-- <<encode_max_depth,+cjson.encode_max_depth+>>[m
[31m-- <<encode_sparse_array,+cjson.encode_sparse_array+>>[m
[31m-[m
[31m-.Example: Encoding[m
[31m-[source,lua][m
[31m-value = { true, { foo = "bar" } }[m
[31m-json_text = cjson.encode(value)[m
[31m--- Returns: '[true,{"foo":"bar"}]'[m
[31m-[m
[31m-[m
[31m-[[encode_invalid_numbers]][m
[31m-encode_invalid_numbers[m
[31m-~~~~~~~~~~~~~~~~~~~~~~[m
[31m-[source,lua][m
[31m-------------[m
[31m-setting = cjson.encode_invalid_numbers([setting])[m
[31m--- "setting" must a boolean or "null". Default: false.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON may generate an error when encoding floating point numbers not[m
[31m-supported by the JSON specification (_invalid numbers_):[m
[31m-[m
[31m-- infinity[m
[31m-- NaN[m
[31m-[m
[31m-Available settings:[m
[31m-[m
[31m-+true+:: Allow _invalid numbers_ to be encoded using the Javascript[m
[31m-  compatible values +NaN+ and +Infinity+. This will generate[m
[31m-  non-standard JSON, but these values are supported by some libraries.[m
[31m-+"null"+:: Encode _invalid numbers_ as a JSON +null+ value. This allows[m
[31m-  infinity and NaN to be encoded into valid JSON.[m
[31m-+false+:: Throw an error when attempting to encode _invalid numbers_.[m
[31m-  This is the default setting.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[encode_keep_buffer]][m
[31m-encode_keep_buffer[m
[31m-~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-keep = cjson.encode_keep_buffer([keep])[m
[31m--- "keep" must be a boolean. Default: true.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON can reuse the JSON encoding buffer to improve performance.[m
[31m-[m
[31m-Available settings:[m
[31m-[m
[31m-+true+:: The buffer will grow to the largest size required and is not[m
[31m-  freed until the Lua CJSON module is garbage collected. This is the[m
[31m-  default setting.[m
[31m-+false+:: Free the encode buffer after each call to +cjson.encode+.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[encode_max_depth]][m
[31m-encode_max_depth[m
[31m-~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-depth = cjson.encode_max_depth([depth])[m
[31m--- "depth" must be a positive integer. Default: 1000.[m
[31m-------------[m
[31m-[m
[31m-Once the maximum table depth has been exceeded Lua CJSON will generate[m
[31m-an error. This prevents a deeply nested or recursive data structure from[m
[31m-crashing the application.[m
[31m-[m
[31m-By default, Lua CJSON will generate an error when trying to encode data[m
[31m-structures with more than 1000 nested tables.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-.Example: Recursive Lua table[m
[31m-[source,lua][m
[31m-a = {}; a[1] = a[m
[31m-[m
[31m-[m
[31m-[[encode_number_precision]][m
[31m-encode_number_precision[m
[31m-~~~~~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-precision = cjson.encode_number_precision([precision])[m
[31m--- "precision" must be an integer between 1 and 14. Default: 14.[m
[31m-------------[m
[31m-[m
[31m-The amount of significant digits returned by Lua CJSON when encoding[m
[31m-numbers can be changed to balance accuracy versus performance. For data[m
[31m-structures containing many numbers, setting[m
[31m-+cjson.encode_number_precision+ to a smaller integer, for example +3+,[m
[31m-can improve encoding performance by up to 50%.[m
[31m-[m
[31m-By default, Lua CJSON will output 14 significant digits when converting[m
[31m-a number to text.[m
[31m-[m
[31m-The current setting is always returned, and is only updated when an[m
[31m-argument is provided.[m
[31m-[m
[31m-[m
[31m-[[encode_sparse_array]][m
[31m-encode_sparse_array[m
[31m-~~~~~~~~~~~~~~~~~~~[m
[31m-[m
[31m-[source,lua][m
[31m-------------[m
[31m-convert, ratio, safe = cjson.encode_sparse_array([convert[, ratio[, safe]]])[m
[31m--- "convert" must be a boolean. Default: false.[m
[31m--- "ratio" must be a positive integer. Default: 2.[m
[31m--- "safe" must be a positive integer. Default: 10.[m
[31m-------------[m
[31m-[m
[31m-Lua CJSON classifies a Lua table into one of three kinds when encoding a[m
[31m-JSON array. This is determined by the number of values missing from the[m
[31m-Lua array as follows:[m
[31m-[m
[31m-Normal:: All values are available.[m
[31m-Sparse:: At least 1 value is missing.[m
[31m-Excessively sparse:: The number of values missing exceeds the configured[m
[31m-  ratio.[m
[31m-[m
[31m-Lua CJSON encodes sparse Lua arrays as JSON arrays using JSON +null+ for[m
[31m-the missing entries.[m
[31m-[m
[31m-An array is excessively sparse when all the following conditions are[m
[31m-met:[m
[31m-[m
[31m-- +ratio+ > +0+[m
[31m-- _maximum_index_ > +safe+[m
[31m-- _maximum_index_ > _item_count_ * +ratio+[m
[31m-[m
[31m-Lua CJSON will never consider an array to be _excessively sparse_ when[m
[31m-+ratio+ = +0+. The +safe+ limit ensures that small Lua arrays are always[m
[31m-encoded as sparse arrays.[m
[31m-[m
[31m-By default, attempting to encode an _excessively sparse_ array will[m
[31m-generate an error. If +convert+ is set to +true+, _excessively sparse_[m
[31m-arrays will be converted to a JSON object.[m
[31m-[m
[31m-The current settings are always returned. A particular setting is only[m
[31m-changed when the argument is provided (non-++nil++).[m
[31m-[m
[31m-.Example: Encoding a sparse array[m
[31m-[source,lua][m
[31m-cjson.encode({ [3] = "data" })[m
[31m--- Returns: '[null,null,"data"]'[m
[31m-[m
[31m-.Example: Enabling conversion to a JSON object[m
[31m-[source,lua][m
[31m-cjson.encode_sparse_array(true)[m
[31m-cjson.encode({ [1000] = "excessively sparse" })[m
[31m--- Returns: '{"1000":"excessively sparse"}'[m
[31m-[m
[31m-[m
[31m-API (Variables)[m
[31m----------------[m
[31m-[m
[31m-_NAME[m
[31m-~~~~~[m
[31m-[m
[31m-The name of the Lua CJSON module (+"cjson"+).[m
[31m-[m
[31m-[m
[31m-_VERSION[m
[31m-~~~~~~~~[m
[31m-[m
[31m-The version number of the Lua CJSON module (+"2.1devel"+).[m
[31m-[m
[31m-[m
[31m-null[m
[31m-~~~~[m
[31m-[m
[31m-Lua CJSON decodes JSON +null+ as a Lua +lightuserdata+ NULL pointer.[m
[31m-+cjson.null+ is provided for comparison.[m
[31m-[m
[31m-[m
[31m-[sect1][m
[31m-References[m
[31m-----------[m
[31m-[m
[31m-- http://tools.ietf.org/html/rfc4627[RFC 4627][m
[31m-- http://www.json.org/[JSON website][m
[31m-[m
[31m-[m
[31m-// vi:ft=asciidoc tw=72:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/performance.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/performance.txt[m
[1mdeleted file mode 100644[m
[1mindex fc3a5bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/performance.txt[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-JSON module performance comparison under Lua[m
[31m-============================================[m
[31m-Mark Pulford <mark@kyne.com.au>[m
[31m-:revdate: January 22, 2012[m
[31m-[m
[31m-This performance comparison aims to provide a guide of relative[m
[31m-performance between several fast and popular JSON modules.[m
[31m-[m
[31m-The examples used in this comparison were mostly sourced from the[m
[31m-http://json.org[JSON website] and[m
[31m-http://tools.ietf.org/html/rfc4627[RFC 4627].[m
[31m-[m
[31m-Performance will vary widely between platforms and data sets. These[m
[31m-results should only be used as an approximation.[m
[31m-[m
[31m-[m
[31m-Modules[m
[31m--------[m
[31m-[m
[31m-The following JSON modules for Lua were tested:[m
[31m-[m
[31m-http://chiselapp.com/user/dhkolf/repository/dkjson/[DKJSON 2.1]::[m
[31m-  - Lua implementation with no dependencies on other libraries[m
[31m-  - Supports LPeg to improve decode performance[m
[31m-[m
[31m-https://github.com/brimworks/lua-yajl[Lua YAJL 2.0]::[m
[31m-  - C wrapper for the YAJL library[m
[31m-[m
[31m-http://www.kyne.com.au/%7Emark/software/lua-cjson.php[Lua CSJON 2.0.0]::[m
[31m-  - C implementation with no dependencies on other libraries[m
[31m-[m
[31m-[m
[31m-Summary[m
[31m--------[m
[31m-[m
[31m-All modules were built and tested as follows:[m
[31m-[m
[31m-DKJSON:: Tested with/without LPeg 10.2.[m
[31m-Lua YAJL:: Tested with YAJL 2.0.4.[m
[31m-Lua CJSON:: Tested with Libc and internal floating point conversion[m
[31m-  routines.[m
[31m-[m
[31m-The following Lua implementations were used for this comparison:[m
[31m-[m
[31m-- http://www.lua.org[Lua 5.1.4] (_Lua_)[m
[31m-- http://www.luajit.org[LuaJIT 2.0.0-beta9] (_JIT_)[m
[31m-[m
[31m-These results show the number of JSON operations per second sustained by[m
[31m-each module. All results have been normalised against the pure Lua[m
[31m-DKJSON implementation.[m
[31m-[m
[31m-.Decoding performance[m
[31m-............................................................................[m
[31m-             | DKJSON                  | Lua YAJL   | Lua CJSON[m
[31m-             | No LPeg     With LPeg   |            | Libc         Internal[m
[31m-             | Lua  JIT    Lua    JIT  | Lua   JIT  | Lua   JIT    Lua   JIT[m
[31m-example1     | 1x   2x     2.6x   3.4x | 7.1x  10x  | 14x   20x    14x   20x[m
[31m-example2     | 1x   2.2x   2.9x   4.4x | 6.7x  9.9x | 14x   22x    14x   22x[m
[31m-example3     | 1x   2.1x   3x     4.3x | 6.9x  9.3x | 14x   21x    15x   22x[m
[31m-example4     | 1x   2x     2.5x   3.7x | 7.3x  10x  | 12x   19x    12x   20x[m
[31m-example5     | 1x   2.2x   3x     4.5x | 7.8x  11x  | 16x   24x    16x   24x[m
[31m-numbers      | 1x   2.2x   2.3x   4x   | 4.6x  5.5x | 8.9x  10x    13x   17x[m
[31m-rfc-example1 | 1x   2.1x   2.8x   4.3x | 6.1x  8.1x | 13x   19x    14x   21x[m
[31m-rfc-example2 | 1x   2.1x   3.1x   4.2x | 7.1x  9.2x | 15x   21x    17x   24x[m
[31m-types        | 1x   2.2x   2.6x   4.3x | 5.3x  7.4x | 12x   20x    13x   21x[m
[31m--------------|-------------------------|------------|-----------------------[m
[31m-= Average => | 1x   2.1x   2.7x   4.1x | 6.5x  9x   | 13x   20x    14x   21x[m
[31m-............................................................................[m
[31m-[m
[31m-.Encoding performance[m
[31m-.............................................................................[m
[31m-             | DKJSON                  | Lua YAJL   | Lua CJSON[m
[31m-             | No LPeg     With LPeg   |            | Libc         Internal[m
[31m-             | Lua  JIT    Lua    JIT  | Lua   JIT  | Lua   JIT    Lua   JIT[m
[31m-example1     | 1x   1.8x   0.97x  1.6x | 3.1x  5.2x | 23x   29x    23x   29x[m
[31m-example2     | 1x   2x     0.97x  1.7x | 2.6x  4.3x | 22x   28x    22x   28x[m
[31m-example3     | 1x   1.9x   0.98x  1.6x | 2.8x  4.3x | 13x   15x    16x   18x[m
[31m-example4     | 1x   1.7x   0.96x  1.3x | 3.9x  6.1x | 15x   19x    17x   21x[m
[31m-example5     | 1x   2x     0.98x  1.7x | 2.7x  4.5x | 20x   23x    20x   23x[m
[31m-numbers      | 1x   2.3x   1x     2.2x | 1.3x  1.9x | 3.8x  4.1x   4.2x  4.6x[m
[31m-rfc-example1 | 1x   1.9x   0.97x  1.6x | 2.2x  3.2x | 8.5x  9.3x   11x   12x[m
[31m-rfc-example2 | 1x   1.9x   0.98x  1.6x | 2.6x  3.9x | 10x   11x    17x   19x[m
[31m-types        | 1x   2.2x   0.97x  2x   | 1.2x  1.9x | 11x   13x    12x   14x[m
[31m--------------|-------------------------|------------|-----------------------[m
[31m-= Average => | 1x   1.9x   0.98x  1.7x | 2.5x  3.9x | 14x   17x    16x   19x[m
[31m-.............................................................................[m
[31m-[m
[31m-[m
[31m-// vi:ft=asciidoc tw=72:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/rfc4627.txt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/rfc4627.txt[m
[1mdeleted file mode 100644[m
[1mindex 67b8909..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/rfc4627.txt[m
[1m+++ /dev/null[m
[36m@@ -1,563 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Network Working Group                                       D. Crockford[m
[31m-Request for Comments: 4627                                      JSON.org[m
[31m-Category: Informational                                        July 2006[m
[31m-[m
[31m-[m
[31m- The application/json Media Type for JavaScript Object Notation (JSON)[m
[31m-[m
[31m-Status of This Memo[m
[31m-[m
[31m-   This memo provides information for the Internet community.  It does[m
[31m-   not specify an Internet standard of any kind.  Distribution of this[m
[31m-   memo is unlimited.[m
[31m-[m
[31m-Copyright Notice[m
[31m-[m
[31m-   Copyright (C) The Internet Society (2006).[m
[31m-[m
[31m-Abstract[m
[31m-[m
[31m-   JavaScript Object Notation (JSON) is a lightweight, text-based,[m
[31m-   language-independent data interchange format.  It was derived from[m
[31m-   the ECMAScript Programming Language Standard.  JSON defines a small[m
[31m-   set of formatting rules for the portable representation of structured[m
[31m-   data.[m
[31m-[m
[31m-1.  Introduction[m
[31m-[m
[31m-   JavaScript Object Notation (JSON) is a text format for the[m
[31m-   serialization of structured data.  It is derived from the object[m
[31m-   literals of JavaScript, as defined in the ECMAScript Programming[m
[31m-   Language Standard, Third Edition [ECMA].[m
[31m-[m
[31m-   JSON can represent four primitive types (strings, numbers, booleans,[m
[31m-   and null) and two structured types (objects and arrays).[m
[31m-[m
[31m-   A string is a sequence of zero or more Unicode characters [UNICODE].[m
[31m-[m
[31m-   An object is an unordered collection of zero or more name/value[m
[31m-   pairs, where a name is a string and a value is a string, number,[m
[31m-   boolean, null, object, or array.[m
[31m-[m
[31m-   An array is an ordered sequence of zero or more values.[m
[31m-[m
[31m-   The terms "object" and "array" come from the conventions of[m
[31m-   JavaScript.[m
[31m-[m
[31m-   JSON's design goals were for it to be minimal, portable, textual, and[m
[31m-   a subset of JavaScript.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 1][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-1.1.  Conventions Used in This Document[m
[31m-[m
[31m-   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",[m
[31m-   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this[m
[31m-   document are to be interpreted as described in [RFC2119].[m
[31m-[m
[31m-   The grammatical rules in this document are to be interpreted as[m
[31m-   described in [RFC4234].[m
[31m-[m
[31m-2.  JSON Grammar[m
[31m-[m
[31m-   A JSON text is a sequence of tokens.  The set of tokens includes six[m
[31m-   structural characters, strings, numbers, and three literal names.[m
[31m-[m
[31m-   A JSON text is a serialized object or array.[m
[31m-[m
[31m-      JSON-text = object / array[m
[31m-[m
[31m-   These are the six structural characters:[m
[31m-[m
[31m-      begin-array     = ws %x5B ws  ; [ left square bracket[m
[31m-[m
[31m-      begin-object    = ws %x7B ws  ; { left curly bracket[m
[31m-[m
[31m-      end-array       = ws %x5D ws  ; ] right square bracket[m
[31m-[m
[31m-      end-object      = ws %x7D ws  ; } right curly bracket[m
[31m-[m
[31m-      name-separator  = ws %x3A ws  ; : colon[m
[31m-[m
[31m-      value-separator = ws %x2C ws  ; , comma[m
[31m-[m
[31m-   Insignificant whitespace is allowed before or after any of the six[m
[31m-   structural characters.[m
[31m-[m
[31m-      ws = *([m
[31m-                %x20 /              ; Space[m
[31m-                %x09 /              ; Horizontal tab[m
[31m-                %x0A /              ; Line feed or New line[m
[31m-                %x0D                ; Carriage return[m
[31m-            )[m
[31m-[m
[31m-2.1.  Values[m
[31m-[m
[31m-   A JSON value MUST be an object, array, number, or string, or one of[m
[31m-   the following three literal names:[m
[31m-[m
[31m-      false null true[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 2][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-   The literal names MUST be lowercase.  No other literal names are[m
[31m-   allowed.[m
[31m-[m
[31m-         value = false / null / true / object / array / number / string[m
[31m-[m
[31m-         false = %x66.61.6c.73.65   ; false[m
[31m-[m
[31m-         null  = %x6e.75.6c.6c      ; null[m
[31m-[m
[31m-         true  = %x74.72.75.65      ; true[m
[31m-[m
[31m-2.2.  Objects[m
[31m-[m
[31m-   An object structure is represented as a pair of curly brackets[m
[31m-   surrounding zero or more name/value pairs (or members).  A name is a[m
[31m-   string.  A single colon comes after each name, separating the name[m
[31m-   from the value.  A single comma separates a value from a following[m
[31m-   name.  The names within an object SHOULD be unique.[m
[31m-[m
[31m-      object = begin-object [ member *( value-separator member ) ][m
[31m-      end-object[m
[31m-[m
[31m-      member = string name-separator value[m
[31m-[m
[31m-2.3.  Arrays[m
[31m-[m
[31m-   An array structure is represented as square brackets surrounding zero[m
[31m-   or more values (or elements).  Elements are separated by commas.[m
[31m-[m
[31m-      array = begin-array [ value *( value-separator value ) ] end-array[m
[31m-[m
[31m-2.4.  Numbers[m
[31m-[m
[31m-   The representation of numbers is similar to that used in most[m
[31m-   programming languages.  A number contains an integer component that[m
[31m-   may be prefixed with an optional minus sign, which may be followed by[m
[31m-   a fraction part and/or an exponent part.[m
[31m-[m
[31m-   Octal and hex forms are not allowed.  Leading zeros are not allowed.[m
[31m-[m
[31m-   A fraction part is a decimal point followed by one or more digits.[m
[31m-[m
[31m-   An exponent part begins with the letter E in upper or lowercase,[m
[31m-   which may be followed by a plus or minus sign.  The E and optional[m
[31m-   sign are followed by one or more digits.[m
[31m-[m
[31m-   Numeric values that cannot be represented as sequences of digits[m
[31m-   (such as Infinity and NaN) are not permitted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 3][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-         number = [ minus ] int [ frac ] [ exp ][m
[31m-[m
[31m-         decimal-point = %x2E       ; .[m
[31m-[m
[31m-         digit1-9 = %x31-39         ; 1-9[m
[31m-[m
[31m-         e = %x65 / %x45            ; e E[m
[31m-[m
[31m-         exp = e [ minus / plus ] 1*DIGIT[m
[31m-[m
[31m-         frac = decimal-point 1*DIGIT[m
[31m-[m
[31m-         int = zero / ( digit1-9 *DIGIT )[m
[31m-[m
[31m-         minus = %x2D               ; -[m
[31m-[m
[31m-         plus = %x2B                ; +[m
[31m-[m
[31m-         zero = %x30                ; 0[m
[31m-[m
[31m-2.5.  Strings[m
[31m-[m
[31m-   The representation of strings is similar to conventions used in the C[m
[31m-   family of programming languages.  A string begins and ends with[m
[31m-   quotation marks.  All Unicode characters may be placed within the[m
[31m-   quotation marks except for the characters that must be escaped:[m
[31m-   quotation mark, reverse solidus, and the control characters (U+0000[m
[31m-   through U+001F).[m
[31m-[m
[31m-   Any character may be escaped.  If the character is in the Basic[m
[31m-   Multilingual Plane (U+0000 through U+FFFF), then it may be[m
[31m-   represented as a six-character sequence: a reverse solidus, followed[m
[31m-   by the lowercase letter u, followed by four hexadecimal digits that[m
[31m-   encode the character's code point.  The hexadecimal letters A though[m
[31m-   F can be upper or lowercase.  So, for example, a string containing[m
[31m-   only a single reverse solidus character may be represented as[m
[31m-   "\u005C".[m
[31m-[m
[31m-   Alternatively, there are two-character sequence escape[m
[31m-   representations of some popular characters.  So, for example, a[m
[31m-   string containing only a single reverse solidus character may be[m
[31m-   represented more compactly as "\\".[m
[31m-[m
[31m-   To escape an extended character that is not in the Basic Multilingual[m
[31m-   Plane, the character is represented as a twelve-character sequence,[m
[31m-   encoding the UTF-16 surrogate pair.  So, for example, a string[m
[31m-   containing only the G clef character (U+1D11E) may be represented as[m
[31m-   "\uD834\uDD1E".[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 4][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-         string = quotation-mark *char quotation-mark[m
[31m-[m
[31m-         char = unescaped /[m
[31m-                escape ([m
[31m-                    %x22 /          ; "    quotation mark  U+0022[m
[31m-                    %x5C /          ; \    reverse solidus U+005C[m
[31m-                    %x2F /          ; /    solidus         U+002F[m
[31m-                    %x62 /          ; b    backspace       U+0008[m
[31m-                    %x66 /          ; f    form feed       U+000C[m
[31m-                    %x6E /          ; n    line feed       U+000A[m
[31m-                    %x72 /          ; r    carriage return U+000D[m
[31m-                    %x74 /          ; t    tab             U+0009[m
[31m-                    %x75 4HEXDIG )  ; uXXXX                U+XXXX[m
[31m-[m
[31m-         escape = %x5C              ; \[m
[31m-[m
[31m-         quotation-mark = %x22      ; "[m
[31m-[m
[31m-         unescaped = %x20-21 / %x23-5B / %x5D-10FFFF[m
[31m-[m
[31m-3.  Encoding[m
[31m-[m
[31m-   JSON text SHALL be encoded in Unicode.  The default encoding is[m
[31m-   UTF-8.[m
[31m-[m
[31m-   Since the first two characters of a JSON text will always be ASCII[m
[31m-   characters [RFC0020], it is possible to determine whether an octet[m
[31m-   stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking[m
[31m-   at the pattern of nulls in the first four octets.[m
[31m-[m
[31m-           00 00 00 xx  UTF-32BE[m
[31m-           00 xx 00 xx  UTF-16BE[m
[31m-           xx 00 00 00  UTF-32LE[m
[31m-           xx 00 xx 00  UTF-16LE[m
[31m-           xx xx xx xx  UTF-8[m
[31m-[m
[31m-4.  Parsers[m
[31m-[m
[31m-   A JSON parser transforms a JSON text into another representation.  A[m
[31m-   JSON parser MUST accept all texts that conform to the JSON grammar.[m
[31m-   A JSON parser MAY accept non-JSON forms or extensions.[m
[31m-[m
[31m-   An implementation may set limits on the size of texts that it[m
[31m-   accepts.  An implementation may set limits on the maximum depth of[m
[31m-   nesting.  An implementation may set limits on the range of numbers.[m
[31m-   An implementation may set limits on the length and character contents[m
[31m-   of strings.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 5][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-5. Generators[m
[31m-[m
[31m-   A JSON generator produces JSON text.  The resulting text MUST[m
[31m-   strictly conform to the JSON grammar.[m
[31m-[m
[31m-6. IANA Considerations[m
[31m-[m
[31m-   The MIME media type for JSON text is application/json.[m
[31m-[m
[31m-   Type name: application[m
[31m-[m
[31m-   Subtype name: json[m
[31m-[m
[31m-   Required parameters: n/a[m
[31m-[m
[31m-   Optional parameters: n/a[m
[31m-[m
[31m-   Encoding considerations: 8bit if UTF-8; binary if UTF-16 or UTF-32[m
[31m-[m
[31m-      JSON may be represented using UTF-8, UTF-16, or UTF-32.  When JSON[m
[31m-      is written in UTF-8, JSON is 8bit compatible.  When JSON is[m
[31m-      written in UTF-16 or UTF-32, the binary content-transfer-encoding[m
[31m-      must be used.[m
[31m-[m
[31m-   Security considerations:[m
[31m-[m
[31m-   Generally there are security issues with scripting languages.  JSON[m
[31m-   is a subset of JavaScript, but it is a safe subset that excludes[m
[31m-   assignment and invocation.[m
[31m-[m
[31m-   A JSON text can be safely passed into JavaScript's eval() function[m
[31m-   (which compiles and executes a string) if all the characters not[m
[31m-   enclosed in strings are in the set of characters that form JSON[m
[31m-   tokens.  This can be quickly determined in JavaScript with two[m
[31m-   regular expressions and calls to the test and replace methods.[m
[31m-[m
[31m-      var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test([m
[31m-             text.replace(/"(\\.|[^"\\])*"/g, ''))) &&[m
[31m-         eval('(' + text + ')');[m
[31m-[m
[31m-   Interoperability considerations: n/a[m
[31m-[m
[31m-   Published specification: RFC 4627[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 6][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-   Applications that use this media type:[m
[31m-[m
[31m-      JSON has been used to exchange data between applications written[m
[31m-      in all of these programming languages: ActionScript, C, C#,[m
[31m-      ColdFusion, Common Lisp, E, Erlang, Java, JavaScript, Lua,[m
[31m-      Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Scheme.[m
[31m-[m
[31m-   Additional information:[m
[31m-[m
[31m-      Magic number(s): n/a[m
[31m-      File extension(s): .json[m
[31m-      Macintosh file type code(s): TEXT[m
[31m-[m
[31m-   Person & email address to contact for further information:[m
[31m-      Douglas Crockford[m
[31m-      douglas@crockford.com[m
[31m-[m
[31m-   Intended usage: COMMON[m
[31m-[m
[31m-   Restrictions on usage: none[m
[31m-[m
[31m-   Author:[m
[31m-      Douglas Crockford[m
[31m-      douglas@crockford.com[m
[31m-[m
[31m-   Change controller:[m
[31m-      Douglas Crockford[m
[31m-      douglas@crockford.com[m
[31m-[m
[31m-7. Security Considerations[m
[31m-[m
[31m-   See Security Considerations in Section 6.[m
[31m-[m
[31m-8. Examples[m
[31m-[m
[31m-   This is a JSON object:[m
[31m-[m
[31m-   {[m
[31m-      "Image": {[m
[31m-          "Width":  800,[m
[31m-          "Height": 600,[m
[31m-          "Title":  "View from 15th Floor",[m
[31m-          "Thumbnail": {[m
[31m-              "Url":    "http://www.example.com/image/481989943",[m
[31m-              "Height": 125,[m
[31m-              "Width":  "100"[m
[31m-          },[m
[31m-          "IDs": [116, 943, 234, 38793][m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 7][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-        }[m
[31m-   }[m
[31m-[m
[31m-   Its Image member is an object whose Thumbnail member is an object[m
[31m-   and whose IDs member is an array of numbers.[m
[31m-[m
[31m-   This is a JSON array containing two objects:[m
[31m-[m
[31m-   [[m
[31m-      {[m
[31m-         "precision": "zip",[m
[31m-         "Latitude":  37.7668,[m
[31m-         "Longitude": -122.3959,[m
[31m-         "Address":   "",[m
[31m-         "City":      "SAN FRANCISCO",[m
[31m-         "State":     "CA",[m
[31m-         "Zip":       "94107",[m
[31m-         "Country":   "US"[m
[31m-      },[m
[31m-      {[m
[31m-         "precision": "zip",[m
[31m-         "Latitude":  37.371991,[m
[31m-         "Longitude": -122.026020,[m
[31m-         "Address":   "",[m
[31m-         "City":      "SUNNYVALE",[m
[31m-         "State":     "CA",[m
[31m-         "Zip":       "94085",[m
[31m-         "Country":   "US"[m
[31m-      }[m
[31m-   ][m
[31m-[m
[31m-9. References[m
[31m-[m
[31m-9.1.  Normative References[m
[31m-[m
[31m-   [ECMA]    European Computer Manufacturers Association, "ECMAScript[m
[31m-             Language Specification 3rd Edition", December 1999,[m
[31m-             <http://www.ecma-international.org/publications/files/[m
[31m-             ecma-st/ECMA-262.pdf>.[m
[31m-[m
[31m-   [RFC0020] Cerf, V., "ASCII format for network interchange", RFC 20,[m
[31m-             October 1969.[m
[31m-[m
[31m-   [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate[m
[31m-             Requirement Levels", BCP 14, RFC 2119, March 1997.[m
[31m-[m
[31m-   [RFC4234] Crocker, D. and P.  Overell, "Augmented BNF for Syntax[m
[31m-             Specifications: ABNF", RFC 4234, October 2005.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 8][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-   [UNICODE] The Unicode Consortium, "The Unicode Standard Version 4.0",[m
[31m-             2003, <http://www.unicode.org/versions/Unicode4.1.0/>.[m
[31m-[m
[31m-Author's Address[m
[31m-[m
[31m-   Douglas Crockford[m
[31m-   JSON.org[m
[31m-   EMail: douglas@crockford.com[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                      [Page 9][m
[31m-[m
[31m-RFC 4627                          JSON                         July 2006[m
[31m-[m
[31m-[m
[31m-Full Copyright Statement[m
[31m-[m
[31m-   Copyright (C) The Internet Society (2006).[m
[31m-[m
[31m-   This document is subject to the rights, licenses and restrictions[m
[31m-   contained in BCP 78, and except as set forth therein, the authors[m
[31m-   retain all their rights.[m
[31m-[m
[31m-   This document and the information contained herein are provided on an[m
[31m-   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS[m
[31m-   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET[m
[31m-   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,[m
[31m-   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE[m
[31m-   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED[m
[31m-   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.[m
[31m-[m
[31m-Intellectual Property[m
[31m-[m
[31m-   The IETF takes no position regarding the validity or scope of any[m
[31m-   Intellectual Property Rights or other rights that might be claimed to[m
[31m-   pertain to the implementation or use of the technology described in[m
[31m-   this document or the extent to which any license under such rights[m
[31m-   might or might not be available; nor does it represent that it has[m
[31m-   made any independent effort to identify any such rights.  Information[m
[31m-   on the procedures with respect to rights in RFC documents can be[m
[31m-   found in BCP 78 and BCP 79.[m
[31m-[m
[31m-   Copies of IPR disclosures made to the IETF Secretariat and any[m
[31m-   assurances of licenses to be made available, or the result of an[m
[31m-   attempt made to obtain a general license or permission for the use of[m
[31m-   such proprietary rights by implementers or users of this[m
[31m-   specification can be obtained from the IETF on-line IPR repository at[m
[31m-   http://www.ietf.org/ipr.[m
[31m-[m
[31m-   The IETF invites any interested party to bring to its attention any[m
[31m-   copyrights, patents or patent applications, or other proprietary[m
[31m-   rights that may cover technology that may be required to implement[m
[31m-   this standard.  Please address the information to the IETF at[m
[31m-   ietf-ipr@ietf.org.[m
[31m-[m
[31m-Acknowledgement[m
[31m-[m
[31m-   Funding for the RFC Editor function is provided by the IETF[m
[31m-   Administrative Support Activity (IASA).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Crockford                    Informational                     [Page 10][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/runtests.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/runtests.sh[m
[1mdeleted file mode 100755[m
[1mindex 82dc8c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/runtests.sh[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-#!/bin/sh[m
[31m-[m
[31m-PLATFORM="`uname -s`"[m
[31m-[ "$1" ] && VERSION="$1" || VERSION="2.1devel"[m
[31m-[m
[31m-set -e[m
[31m-[m
[31m-# Portable "ggrep -A" replacement.[m
[31m-# Work around Solaris awk record limit of 2559 bytes.[m
[31m-# contextgrep PATTERN POST_MATCH_LINES[m
[31m-contextgrep() {[m
[31m-    cut -c -2500 | awk "/$1/ { count = ($2 + 1) } count > 0 { count--; print }"[m
[31m-}[m
[31m-[m
[31m-do_tests() {[m
[31m-    echo[m
[31m-    cd tests[m
[31m-    lua -e 'print("Testing Lua CJSON version " .. require("cjson")._VERSION)'[m
[31m-    ./test.lua | contextgrep 'FAIL|Summary' 3 | grep -v PASS | cut -c -150[m
[31m-    cd ..[m
[31m-}[m
[31m-[m
[31m-echo "===== Setting LuaRocks PATH ====="[m
[31m-eval "`luarocks path`"[m
[31m-[m
[31m-echo "===== Building UTF-8 test data ====="[m
[31m-( cd tests && ./genutf8.pl; )[m
[31m-[m
[31m-echo "===== Cleaning old build data ====="[m
[31m-make clean[m
[31m-rm -f tests/cjson.so[m
[31m-[m
[31m-echo "===== Verifying cjson.so is not installed ====="[m
[31m-[m
[31m-cd tests[m
[31m-if lua -e 'require "cjson"' 2>/dev/null[m
[31m-then[m
[31m-    cat <<EOT[m
[31m-Please ensure you do not have the Lua CJSON module installed before[m
[31m-running these tests.[m
[31m-EOT[m
[31m-    exit[m
[31m-fi[m
[31m-cd ..[m
[31m-[m
[31m-echo "===== Testing LuaRocks build ====="[m
[31m-luarocks make --local[m
[31m-do_tests[m
[31m-luarocks remove --local lua-cjson[m
[31m-make clean[m
[31m-[m
[31m-echo "===== Testing Makefile build ====="[m
[31m-make[m
[31m-cp -r lua/cjson cjson.so tests[m
[31m-do_tests[m
[31m-make clean[m
[31m-rm -rf tests/cjson{,.so}[m
[31m-[m
[31m-echo "===== Testing Cmake build ====="[m
[31m-mkdir build[m
[31m-cd build[m
[31m-cmake ..[m
[31m-make[m
[31m-cd ..[m
[31m-cp -r lua/cjson build/cjson.so tests[m
[31m-do_tests[m
[31m-rm -rf build tests/cjson{,.so}[m
[31m-[m
[31m-# vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/strbuf.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/strbuf.c[m
[1mdeleted file mode 100644[m
[1mindex f0f7f4b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/strbuf.c[m
[1m+++ /dev/null[m
[36m@@ -1,251 +0,0 @@[m
[31m-/* strbuf - String buffer routines[m
[31m- *[m
[31m- * Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m- *[m
[31m- * Permission is hereby granted, free of charge, to any person obtaining[m
[31m- * a copy of this software and associated documentation files (the[m
[31m- * "Software"), to deal in the Software without restriction, including[m
[31m- * without limitation the rights to use, copy, modify, merge, publish,[m
[31m- * distribute, sublicense, and/or sell copies of the Software, and to[m
[31m- * permit persons to whom the Software is furnished to do so, subject to[m
[31m- * the following conditions:[m
[31m- *[m
[31m- * The above copyright notice and this permission notice shall be[m
[31m- * included in all copies or substantial portions of the Software.[m
[31m- *[m
[31m- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m- */[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-#include "strbuf.h"[m
[31m-[m
[31m-static void die(const char *fmt, ...)[m
[31m-{[m
[31m-    va_list arg;[m
[31m-[m
[31m-    va_start(arg, fmt);[m
[31m-    vfprintf(stderr, fmt, arg);[m
[31m-    va_end(arg);[m
[31m-    fprintf(stderr, "\n");[m
[31m-[m
[31m-    exit(-1);[m
[31m-}[m
[31m-[m
[31m-void strbuf_init(strbuf_t *s, int len)[m
[31m-{[m
[31m-    int size;[m
[31m-[m
[31m-    if (len <= 0)[m
[31m-        size = STRBUF_DEFAULT_SIZE;[m
[31m-    else[m
[31m-        size = len + 1;         /* \0 terminator */[m
[31m-[m
[31m-    s->buf = NULL;[m
[31m-    s->size = size;[m
[31m-    s->length = 0;[m
[31m-    s->increment = STRBUF_DEFAULT_INCREMENT;[m
[31m-    s->dynamic = 0;[m
[31m-    s->reallocs = 0;[m
[31m-    s->debug = 0;[m
[31m-[m
[31m-    s->buf = malloc(size);[m
[31m-    if (!s->buf)[m
[31m-        die("Out of memory");[m
[31m-[m
[31m-    strbuf_ensure_null(s);[m
[31m-}[m
[31m-[m
[31m-strbuf_t *strbuf_new(int len)[m
[31m-{[m
[31m-    strbuf_t *s;[m
[31m-[m
[31m-    s = malloc(sizeof(strbuf_t));[m
[31m-    if (!s)[m
[31m-        die("Out of memory");[m
[31m-[m
[31m-    strbuf_init(s, len);[m
[31m-[m
[31m-    /* Dynamic strbuf allocation / deallocation */[m
[31m-    s->dynamic = 1;[m
[31m-[m
[31m-    return s;[m
[31m-}[m
[31m-[m
[31m-void strbuf_set_increment(strbuf_t *s, int increment)[m
[31m-{[m
[31m-    /* Increment > 0:  Linear buffer growth rate[m
[31m-     * Increment < -1: Exponential buffer growth rate */[m
[31m-    if (increment == 0 || increment == -1)[m
[31m-        die("BUG: Invalid string increment");[m
[31m-[m
[31m-    s->increment = increment;[m
[31m-}[m
[31m-[m
[31m-static inline void debug_stats(strbuf_t *s)[m
[31m-{[m
[31m-    if (s->debug) {[m
[31m-        fprintf(stderr, "strbuf(%lx) reallocs: %d, length: %d, size: %d\n",[m
[31m-                (long)s, s->reallocs, s->length, s->size);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* If strbuf_t has not been dynamically allocated, strbuf_free() can[m
[31m- * be called any number of times strbuf_init() */[m
[31m-void strbuf_free(strbuf_t *s)[m
[31m-{[m
[31m-    debug_stats(s);[m
[31m-[m
[31m-    if (s->buf) {[m
[31m-        free(s->buf);[m
[31m-        s->buf = NULL;[m
[31m-    }[m
[31m-    if (s->dynamic)[m
[31m-        free(s);[m
[31m-}[m
[31m-[m
[31m-char *strbuf_free_to_string(strbuf_t *s, int *len)[m
[31m-{[m
[31m-    char *buf;[m
[31m-[m
[31m-    debug_stats(s);[m
[31m-[m
[31m-    strbuf_ensure_null(s);[m
[31m-[m
[31m-    buf = s->buf;[m
[31m-    if (len)[m
[31m-        *len = s->length;[m
[31m-[m
[31m-    if (s->dynamic)[m
[31m-        free(s);[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-static int calculate_new_size(strbuf_t *s, int len)[m
[31m-{[m
[31m-    int reqsize, newsize;[m
[31m-[m
[31m-    if (len <= 0)[m
[31m-        die("BUG: Invalid strbuf length requested");[m
[31m-[m
[31m-    /* Ensure there is room for optional NULL termination */[m
[31m-    reqsize = len + 1;[m
[31m-[m
[31m-    /* If the user has requested to shrink the buffer, do it exactly */[m
[31m-    if (s->size > reqsize)[m
[31m-        return reqsize;[m
[31m-[m
[31m-    newsize = s->size;[m
[31m-    if (s->increment < 0) {[m
[31m-        /* Exponential sizing */[m
[31m-        while (newsize < reqsize)[m
[31m-            newsize *= -s->increment;[m
[31m-    } else {[m
[31m-        /* Linear sizing */[m
[31m-        newsize = ((newsize + s->increment - 1) / s->increment) * s->increment;[m
[31m-    }[m
[31m-[m
[31m-    return newsize;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Ensure strbuf can handle a string length bytes long (ignoring NULL[m
[31m- * optional termination). */[m
[31m-void strbuf_resize(strbuf_t *s, int len)[m
[31m-{[m
[31m-    int newsize;[m
[31m-[m
[31m-    newsize = calculate_new_size(s, len);[m
[31m-[m
[31m-    if (s->debug > 1) {[m
[31m-        fprintf(stderr, "strbuf(%lx) resize: %d => %d\n",[m
[31m-                (long)s, s->size, newsize);[m
[31m-    }[m
[31m-[m
[31m-    s->size = newsize;[m
[31m-    s->buf = realloc(s->buf, s->size);[m
[31m-    if (!s->buf)[m
[31m-        die("Out of memory");[m
[31m-    s->reallocs++;[m
[31m-}[m
[31m-[m
[31m-void strbuf_append_string(strbuf_t *s, const char *str)[m
[31m-{[m
[31m-    int space, i;[m
[31m-[m
[31m-    space = strbuf_empty_length(s);[m
[31m-[m
[31m-    for (i = 0; str[i]; i++) {[m
[31m-        if (space < 1) {[m
[31m-            strbuf_resize(s, s->length + 1);[m
[31m-            space = strbuf_empty_length(s);[m
[31m-        }[m
[31m-[m
[31m-        s->buf[s->length] = str[i];[m
[31m-        s->length++;[m
[31m-        space--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/* strbuf_append_fmt() should only be used when an upper bound[m
[31m- * is known for the output string. */[m
[31m-void strbuf_append_fmt(strbuf_t *s, int len, const char *fmt, ...)[m
[31m-{[m
[31m-    va_list arg;[m
[31m-    int fmt_len;[m
[31m-[m
[31m-    strbuf_ensure_empty_length(s, len);[m
[31m-[m
[31m-    va_start(arg, fmt);[m
[31m-    fmt_len = vsnprintf(s->buf + s->length, len, fmt, arg);[m
[31m-    va_end(arg);[m
[31m-[m
[31m-    if (fmt_len < 0)[m
[31m-        die("BUG: Unable to convert number");  /* This should never happen.. */[m
[31m-[m
[31m-    s->length += fmt_len;[m
[31m-}[m
[31m-[m
[31m-/* strbuf_append_fmt_retry() can be used when the there is no known[m
[31m- * upper bound for the output string. */[m
[31m-void strbuf_append_fmt_retry(strbuf_t *s, const char *fmt, ...)[m
[31m-{[m
[31m-    va_list arg;[m
[31m-    int fmt_len, try;[m
[31m-    int empty_len;[m
[31m-[m
[31m-    /* If the first attempt to append fails, resize the buffer appropriately[m
[31m-     * and try again */[m
[31m-    for (try = 0; ; try++) {[m
[31m-        va_start(arg, fmt);[m
[31m-        /* Append the new formatted string */[m
[31m-        /* fmt_len is the length of the string required, excluding the[m
[31m-         * trailing NULL */[m
[31m-        empty_len = strbuf_empty_length(s);[m
[31m-        /* Add 1 since there is also space to store the terminating NULL. */[m
[31m-        fmt_len = vsnprintf(s->buf + s->length, empty_len + 1, fmt, arg);[m
[31m-        va_end(arg);[m
[31m-[m
[31m-        if (fmt_len <= empty_len)[m
[31m-            break;  /* SUCCESS */[m
[31m-        if (try > 0)[m
[31m-            die("BUG: length of formatted string changed");[m
[31m-[m
[31m-        strbuf_resize(s, s->length + fmt_len);[m
[31m-    }[m
[31m-[m
[31m-    s->length += fmt_len;[m
[31m-}[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/strbuf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/strbuf.h[m
[1mdeleted file mode 100644[m
[1mindex d861108..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/strbuf.h[m
[1m+++ /dev/null[m
[36m@@ -1,154 +0,0 @@[m
[31m-/* strbuf - String buffer routines[m
[31m- *[m
[31m- * Copyright (c) 2010-2012  Mark Pulford <mark@kyne.com.au>[m
[31m- *[m
[31m- * Permission is hereby granted, free of charge, to any person obtaining[m
[31m- * a copy of this software and associated documentation files (the[m
[31m- * "Software"), to deal in the Software without restriction, including[m
[31m- * without limitation the rights to use, copy, modify, merge, publish,[m
[31m- * distribute, sublicense, and/or sell copies of the Software, and to[m
[31m- * permit persons to whom the Software is furnished to do so, subject to[m
[31m- * the following conditions:[m
[31m- *[m
[31m- * The above copyright notice and this permission notice shall be[m
[31m- * included in all copies or substantial portions of the Software.[m
[31m- *[m
[31m- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.[m
[31m- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY[m
[31m- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,[m
[31m- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE[m
[31m- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m- */[m
[31m-[m
[31m-#include <stdlib.h>[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-/* Size: Total bytes allocated to *buf[m
[31m- * Length: String length, excluding optional NULL terminator.[m
[31m- * Increment: Allocation increments when resizing the string buffer.[m
[31m- * Dynamic: True if created via strbuf_new()[m
[31m- */[m
[31m-[m
[31m-typedef struct {[m
[31m-    char *buf;[m
[31m-    int size;[m
[31m-    int length;[m
[31m-    int increment;[m
[31m-    int dynamic;[m
[31m-    int reallocs;[m
[31m-    int debug;[m
[31m-} strbuf_t;[m
[31m-[m
[31m-#ifndef STRBUF_DEFAULT_SIZE[m
[31m-#define STRBUF_DEFAULT_SIZE 1023[m
[31m-#endif[m
[31m-#ifndef STRBUF_DEFAULT_INCREMENT[m
[31m-#define STRBUF_DEFAULT_INCREMENT -2[m
[31m-#endif[m
[31m-[m
[31m-/* Initialise */[m
[31m-extern strbuf_t *strbuf_new(int len);[m
[31m-extern void strbuf_init(strbuf_t *s, int len);[m
[31m-extern void strbuf_set_increment(strbuf_t *s, int increment);[m
[31m-[m
[31m-/* Release */[m
[31m-extern void strbuf_free(strbuf_t *s);[m
[31m-extern char *strbuf_free_to_string(strbuf_t *s, int *len);[m
[31m-[m
[31m-/* Management */[m
[31m-extern void strbuf_resize(strbuf_t *s, int len);[m
[31m-static int strbuf_empty_length(strbuf_t *s);[m
[31m-static int strbuf_length(strbuf_t *s);[m
[31m-static char *strbuf_string(strbuf_t *s, int *len);[m
[31m-static void strbuf_ensure_empty_length(strbuf_t *s, int len);[m
[31m-static char *strbuf_empty_ptr(strbuf_t *s);[m
[31m-static void strbuf_extend_length(strbuf_t *s, int len);[m
[31m-[m
[31m-/* Update */[m
[31m-extern void strbuf_append_fmt(strbuf_t *s, int len, const char *fmt, ...);[m
[31m-extern void strbuf_append_fmt_retry(strbuf_t *s, const char *format, ...);[m
[31m-static void strbuf_append_mem(strbuf_t *s, const char *c, int len);[m
[31m-extern void strbuf_append_string(strbuf_t *s, const char *str);[m
[31m-static void strbuf_append_char(strbuf_t *s, const char c);[m
[31m-static void strbuf_ensure_null(strbuf_t *s);[m
[31m-[m
[31m-/* Reset string for before use */[m
[31m-static inline void strbuf_reset(strbuf_t *s)[m
[31m-{[m
[31m-    s->length = 0;[m
[31m-}[m
[31m-[m
[31m-static inline int strbuf_allocated(strbuf_t *s)[m
[31m-{[m
[31m-    return s->buf != NULL;[m
[31m-}[m
[31m-[m
[31m-/* Return bytes remaining in the string buffer[m
[31m- * Ensure there is space for a NULL terminator. */[m
[31m-static inline int strbuf_empty_length(strbuf_t *s)[m
[31m-{[m
[31m-    return s->size - s->length - 1;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_ensure_empty_length(strbuf_t *s, int len)[m
[31m-{[m
[31m-    if (len > strbuf_empty_length(s))[m
[31m-        strbuf_resize(s, s->length + len);[m
[31m-}[m
[31m-[m
[31m-static inline char *strbuf_empty_ptr(strbuf_t *s)[m
[31m-{[m
[31m-    return s->buf + s->length;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_extend_length(strbuf_t *s, int len)[m
[31m-{[m
[31m-    s->length += len;[m
[31m-}[m
[31m-[m
[31m-static inline int strbuf_length(strbuf_t *s)[m
[31m-{[m
[31m-    return s->length;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_append_char(strbuf_t *s, const char c)[m
[31m-{[m
[31m-    strbuf_ensure_empty_length(s, 1);[m
[31m-    s->buf[s->length++] = c;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_append_char_unsafe(strbuf_t *s, const char c)[m
[31m-{[m
[31m-    s->buf[s->length++] = c;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_append_mem(strbuf_t *s, const char *c, int len)[m
[31m-{[m
[31m-    strbuf_ensure_empty_length(s, len);[m
[31m-    memcpy(s->buf + s->length, c, len);[m
[31m-    s->length += len;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_append_mem_unsafe(strbuf_t *s, const char *c, int len)[m
[31m-{[m
[31m-    memcpy(s->buf + s->length, c, len);[m
[31m-    s->length += len;[m
[31m-}[m
[31m-[m
[31m-static inline void strbuf_ensure_null(strbuf_t *s)[m
[31m-{[m
[31m-    s->buf[s->length] = 0;[m
[31m-}[m
[31m-[m
[31m-static inline char *strbuf_string(strbuf_t *s, int *len)[m
[31m-{[m
[31m-    if (len)[m
[31m-        *len = s->length;[m
[31m-[m
[31m-    return s->buf;[m
[31m-}[m
[31m-[m
[31m-/* vi:ai et sw=4 ts=4:[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/README[m
[1mdeleted file mode 100644[m
[1mindex 39e8bd4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/README[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-These JSON examples were taken from the JSON website[m
[31m-(http://json.org/example.html) and RFC 4627.[m
[31m-[m
[31m-Used with permission.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/TestLua.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/TestLua.pm[m
[1mdeleted file mode 100644[m
[1mindex b029a72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/TestLua.pm[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-package TestLua;[m
[31m-[m
[31m-use Test::Base -Base;[m
[31m-use IPC::Run3;[m
[31m-use Cwd;[m
[31m-[m
[31m-use Test::LongString;[m
[31m-[m
[31m-our @EXPORT = qw( run_tests );[m
[31m-[m
[31m-$ENV{LUA_CPATH} = "../?.so;;";[m
[31m-$ENV{LUA_PATH} = "../lua/?.lua;;";[m
[31m-#$ENV{LUA_PATH} = ($ENV{LUA_PATH} || "" ) . ';' . getcwd . "/runtime/?.lua" . ';;';[m
[31m-[m
[31m-sub run_test ($) {[m
[31m-    my $block = shift;[m
[31m-    #print $json_xs->pretty->encode(\@new_rows);[m
[31m-    #my $res = #print $json_xs->pretty->encode($res);[m
[31m-    my $name = $block->name;[m
[31m-[m
[31m-    my $lua = $block->lua or[m
[31m-        die "No --- lua specified for test $name\n";[m
[31m-[m
[31m-    my $luafile = "test_case.lua";[m
[31m-[m
[31m-    open my $fh, ">$luafile" or[m
[31m-        die "Cannot open $luafile for writing: $!\n";[m
[31m-[m
[31m-    print $fh $lua;[m
[31m-    close $fh;[m
[31m-[m
[31m-    my ($res, $err);[m
[31m-[m
[31m-    my @cmd;[m
[31m-[m
[31m-    if ($ENV{TEST_LUA_USE_VALGRIND}) {[m
[31m-        warn "$name\n";[m
[31m-        @cmd =  ('valgrind', '-q', '--leak-check=full', 'lua', 'test_case.lua');[m
[31m-    } else {[m
[31m-        @cmd =  ('lua', 'test_case.lua');[m
[31m-    }[m
[31m-[m
[31m-    run3 \@cmd, undef, \$res, \$err;[m
[31m-    my $rc = $?;[m
[31m-[m
[31m-    #warn "res:$res\nerr:$err\n";[m
[31m-[m
[31m-    if (defined $block->err) {[m
[31m-        $err =~ /.*:.*:.*: (.*\s)?/;[m
[31m-        $err = $1;[m
[31m-        is $err, $block->err, "$name - err expected";[m
[31m-[m
[31m-    } elsif ($rc) {[m
[31m-        die "Failed to execute --- lua for test $name: $err\n";[m
[31m-[m
[31m-    } else {[m
[31m-        #is $res, $block->out, "$name - output ok";[m
[31m-        is $res, $block->out, "$name - output ok";[m
[31m-    }[m
[31m-[m
[31m-    is $rc, ($block->exit || 0), "$name - exit code ok";[m
[31m-    #unlink 'test_case.lua' or warn "could not delete \'test_case.lua\':$!";[m
[31m-}[m
[31m-[m
[31m-sub run_tests () {[m
[31m-    for my $block (blocks()) {[m
[31m-        run_test($block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/agentzh.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/agentzh.t[m
[1mdeleted file mode 100644[m
[1mindex e76f910..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/agentzh.t[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-use TestLua;[m
[31m-[m
[31m-plan tests => 2 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: empty tables as objects[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-print(cjson.encode({}))[m
[31m-print(cjson.encode({dogs = {}}))[m
[31m---- out[m
[31m-{}[m
[31m-{"dogs":{}}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty tables as arrays[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-cjson.encode_empty_table_as_object(false)[m
[31m-print(cjson.encode({}))[m
[31m-print(cjson.encode({dogs = {}}))[m
[31m---- out[m
[31m-[][m
[31m-{"dogs":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: empty tables as objects (explicit)[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-cjson.encode_empty_table_as_object(true)[m
[31m-print(cjson.encode({}))[m
[31m-print(cjson.encode({dogs = {}}))[m
[31m---- out[m
[31m-{}[m
[31m-{"dogs":{}}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: empty_array userdata[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-print(cjson.encode({arr = cjson.empty_array}))[m
[31m---- out[m
[31m-{"arr":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: empty_array_mt[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-local empty_arr = setmetatable({}, cjson.empty_array_mt)[m
[31m-print(cjson.encode({arr = empty_arr}))[m
[31m---- out[m
[31m-{"arr":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: empty_array_mt and empty tables as objects (explicit)[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-local empty_arr = setmetatable({}, cjson.empty_array_mt)[m
[31m-print(cjson.encode({obj = {}, arr = empty_arr}))[m
[31m---- out[m
[31m-{"arr":[],"obj":{}}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty_array_mt and empty tables as objects (explicit)[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-cjson.encode_empty_table_as_object(true)[m
[31m-local empty_arr = setmetatable({}, cjson.empty_array_mt)[m
[31m-local data = {[m
[31m-  arr = empty_arr,[m
[31m-  foo = {[m
[31m-    obj = {},[m
[31m-    foobar = {[m
[31m-      arr = cjson.empty_array,[m
[31m-      obj = {}[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-print(cjson.encode(data))[m
[31m---- out[m
[31m-{"foo":{"foobar":{"obj":{},"arr":[]},"obj":{}},"arr":[]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty_array_mt on non-empty tables[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-cjson.encode_empty_table_as_object(true)[m
[31m-local array = {"hello", "world", "lua"}[m
[31m-setmetatable(array, cjson.empty_array_mt)[m
[31m-local data = {[m
[31m-  arr = array,[m
[31m-  foo = {[m
[31m-    obj = {},[m
[31m-    foobar = {[m
[31m-      arr = cjson.empty_array,[m
[31m-      obj = {}[m
[31m-    }[m
[31m-  }[m
[31m-}[m
[31m-print(cjson.encode(data))[m
[31m---- out[m
[31m-{"foo":{"foobar":{"obj":{},"arr":[]},"obj":{}},"arr":["hello","world","lua"]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: & in JSON[m
[31m---- lua[m
[31m-local cjson = require "cjson"[m
[31m-local a="[\"a=1&b=2\"]"[m
[31m-local b=cjson.decode(a)[m
[31m-print(cjson.encode(b))[m
[31m---- out[m
[31m-["a=1&b=2"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: default and max precision[m
[31m---- lua[m
[31m-local math = require "math"[m
[31m-local cjson = require "cjson"[m
[31m-local double = math.pow(2, 53)[m
[31m-print(cjson.encode(double))[m
[31m-cjson.encode_number_precision(16)[m
[31m-print(cjson.encode(double))[m
[31m-print(string.format("%16.0f", cjson.decode("9007199254740992")))[m
[31m---- out[m
[31m-9.007199254741e+15[m
[31m-9007199254740992[m
[31m-9007199254740992[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/bench.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/bench.lua[m
[1mdeleted file mode 100755[m
[1mindex 648020b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/bench.lua[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env lua[m
[31m-[m
[31m--- This benchmark script measures wall clock time and should be[m
[31m--- run on an unloaded system.[m
[31m---[m
[31m--- Your Mileage May Vary.[m
[31m---[m
[31m--- Mark Pulford <mark@kyne.com.au>[m
[31m-[m
[31m-local json_module = os.getenv("JSON_MODULE") or "cjson"[m
[31m-[m
[31m-require "socket"[m
[31m-local json = require(json_module)[m
[31m-local util = require "cjson.util"[m
[31m-[m
[31m-local function find_func(mod, funcnames)[m
[31m-    for _, v in ipairs(funcnames) do[m
[31m-        if mod[v] then[m
[31m-            return mod[v][m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-local json_encode = find_func(json, { "encode", "Encode", "to_string", "stringify", "json" })[m
[31m-local json_decode = find_func(json, { "decode", "Decode", "to_value", "parse" })[m
[31m-[m
[31m-local function average(t)[m
[31m-    local total = 0[m
[31m-    for _, v in ipairs(t) do[m
[31m-        total = total + v[m
[31m-    end[m
[31m-    return total / #t[m
[31m-end[m
[31m-[m
[31m-function benchmark(tests, seconds, rep)[m
[31m-    local function bench(func, iter)[m
[31m-        -- Use socket.gettime() to measure microsecond resolution[m
[31m-        -- wall clock time.[m
[31m-        local t = socket.gettime()[m
[31m-        for i = 1, iter do[m
[31m-            func(i)[m
[31m-        end[m
[31m-        t = socket.gettime() - t[m
[31m-[m
[31m-        -- Don't trust any results when the run lasted for less than a[m
[31m-        -- millisecond - return nil.[m
[31m-        if t < 0.001 then[m
[31m-            return nil[m
[31m-        end[m
[31m-[m
[31m-        return (iter / t)[m
[31m-    end[m
[31m-[m
[31m-    -- Roughly calculate the number of interations required[m
[31m-    -- to obtain a particular time period.[m
[31m-    local function calc_iter(func, seconds)[m
[31m-        local iter = 1[m
[31m-        local rate[m
[31m-        -- Warm up the bench function first.[m
[31m-        func()[m
[31m-        while not rate do[m
[31m-            rate = bench(func, iter)[m
[31m-            iter = iter * 10[m
[31m-        end[m
[31m-        return math.ceil(seconds * rate)[m
[31m-    end[m
[31m-[m
[31m-    local test_results = {}[m
[31m-    for name, func in pairs(tests) do[m
[31m-        -- k(number), v(string)[m
[31m-        -- k(string), v(function)[m
[31m-        -- k(number), v(function)[m
[31m-        if type(func) == "string" then[m
[31m-            name = func[m
[31m-            func = _G[name][m
[31m-        end[m
[31m-[m
[31m-        local iter = calc_iter(func, seconds)[m
[31m-[m
[31m-        local result = {}[m
[31m-        for i = 1, rep do[m
[31m-            result[i] = bench(func, iter)[m
[31m-        end[m
[31m-[m
[31m-        -- Remove the slowest half (round down) of the result set[m
[31m-        table.sort(result)[m
[31m-        for i = 1, math.floor(#result / 2) do[m
[31m-            table.remove(result, 1)[m
[31m-        end[m
[31m-[m
[31m-        test_results[name] = average(result)[m
[31m-    end[m
[31m-[m
[31m-    return test_results[m
[31m-end[m
[31m-[m
[31m-function bench_file(filename)[m
[31m-    local data_json = util.file_load(filename)[m
[31m-    local data_obj = json_decode(data_json)[m
[31m-[m
[31m-    local function test_encode()[m
[31m-        json_encode(data_obj)[m
[31m-    end[m
[31m-    local function test_decode()[m
[31m-        json_decode(data_json)[m
[31m-    end[m
[31m-[m
[31m-    local tests = {}[m
[31m-    if json_encode then tests.encode = test_encode end[m
[31m-    if json_decode then tests.decode = test_decode end[m
[31m-[m
[31m-    return benchmark(tests, 0.1, 5)[m
[31m-end[m
[31m-[m
[31m--- Optionally load any custom configuration required for this module[m
[31m-local success, data = pcall(util.file_load, ("bench-%s.lua"):format(json_module))[m
[31m-if success then[m
[31m-    util.run_script(data, _G)[m
[31m-    configure(json)[m
[31m-end[m
[31m-[m
[31m-for i = 1, #arg do[m
[31m-    local results = bench_file(arg[i])[m
[31m-    for k, v in pairs(results) do[m
[31m-        print(("%s\t%s\t%d"):format(arg[i], k, v))[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example1.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example1.json[m
[1mdeleted file mode 100644[m
[1mindex 42486ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example1.json[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-{[m
[31m-    "glossary": {[m
[31m-        "title": "example glossary",[m
[31m-                "GlossDiv": {[m
[31m-            "title": "S",[m
[31m-                        "GlossList": {[m
[31m-                "GlossEntry": {[m
[31m-                    "ID": "SGML",[m
[31m-                                        "SortAs": "SGML",[m
[31m-                                        "GlossTerm": "Standard Generalized Mark up Language",[m
[31m-                                        "Acronym": "SGML",[m
[31m-                                        "Abbrev": "ISO 8879:1986",[m
[31m-                                        "GlossDef": {[m
[31m-                        "para": "A meta-markup language, used to create markup languages such as DocBook.",[m
[31m-                                                "GlossSeeAlso": ["GML", "XML"][m
[31m-                    },[m
[31m-                                        "GlossSee": "markup"[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example2.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example2.json[m
[1mdeleted file mode 100644[m
[1mindex 5600991..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example2.json[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-{"menu": {[m
[31m-  "id": "file",[m
[31m-  "value": "File",[m
[31m-  "popup": {[m
[31m-    "menuitem": [[m
[31m-      {"value": "New", "onclick": "CreateNewDoc()"},[m
[31m-      {"value": "Open", "onclick": "OpenDoc()"},[m
[31m-      {"value": "Close", "onclick": "CloseDoc()"}[m
[31m-    ][m
[31m-  }[m
[31m-}}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example3.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example3.json[m
[1mdeleted file mode 100644[m
[1mindex d7237a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example3.json[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-{"widget": {[m
[31m-    "debug": "on",[m
[31m-    "window": {[m
[31m-        "title": "Sample Konfabulator Widget",[m
[31m-        "name": "main_window",[m
[31m-        "width": 500,[m
[31m-        "height": 500[m
[31m-    },[m
[31m-    "image": {[m
[31m-        "src": "Images/Sun.png",[m
[31m-        "name": "sun1",[m
[31m-        "hOffset": 250,[m
[31m-        "vOffset": 250,[m
[31m-        "alignment": "center"[m
[31m-    },[m
[31m-    "text": {[m
[31m-        "data": "Click Here",[m
[31m-        "size": 36,[m
[31m-        "style": "bold",[m
[31m-        "name": "text1",[m
[31m-        "hOffset": 250,[m
[31m-        "vOffset": 100,[m
[31m-        "alignment": "center",[m
[31m-        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"[m
[31m-    }[m
[31m-}}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example4.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example4.json[m
[1mdeleted file mode 100644[m
[1mindex d31a395..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example4.json[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-{"web-app": {[m
[31m-  "servlet": [[m
[31m-    {[m
[31m-      "servlet-name": "cofaxCDS",[m
[31m-      "servlet-class": "org.cofax.cds.CDSServlet",[m
[31m-      "init-param": {[m
[31m-        "configGlossary:installationAt": "Philadelphia, PA",[m
[31m-        "configGlossary:adminEmail": "ksm@pobox.com",[m
[31m-        "configGlossary:poweredBy": "Cofax",[m
[31m-        "configGlossary:poweredByIcon": "/images/cofax.gif",[m
[31m-        "configGlossary:staticPath": "/content/static",[m
[31m-        "templateProcessorClass": "org.cofax.WysiwygTemplate",[m
[31m-        "templateLoaderClass": "org.cofax.FilesTemplateLoader",[m
[31m-        "templatePath": "templates",[m
[31m-        "templateOverridePath": "",[m
[31m-        "defaultListTemplate": "listTemplate.htm",[m
[31m-        "defaultFileTemplate": "articleTemplate.htm",[m
[31m-        "useJSP": false,[m
[31m-        "jspListTemplate": "listTemplate.jsp",[m
[31m-        "jspFileTemplate": "articleTemplate.jsp",[m
[31m-        "cachePackageTagsTrack": 200,[m
[31m-        "cachePackageTagsStore": 200,[m
[31m-        "cachePackageTagsRefresh": 60,[m
[31m-        "cacheTemplatesTrack": 100,[m
[31m-        "cacheTemplatesStore": 50,[m
[31m-        "cacheTemplatesRefresh": 15,[m
[31m-        "cachePagesTrack": 200,[m
[31m-        "cachePagesStore": 100,[m
[31m-        "cachePagesRefresh": 10,[m
[31m-        "cachePagesDirtyRead": 10,[m
[31m-        "searchEngineListTemplate": "forSearchEnginesList.htm",[m
[31m-        "searchEngineFileTemplate": "forSearchEngines.htm",[m
[31m-        "searchEngineRobotsDb": "WEB-INF/robots.db",[m
[31m-        "useDataStore": true,[m
[31m-        "dataStoreClass": "org.cofax.SqlDataStore",[m
[31m-        "redirectionClass": "org.cofax.SqlRedirection",[m
[31m-        "dataStoreName": "cofax",[m
[31m-        "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver",[m
[31m-        "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon",[m
[31m-        "dataStoreUser": "sa",[m
[31m-        "dataStorePassword": "dataStoreTestQuery",[m
[31m-        "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",[m
[31m-        "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",[m
[31m-        "dataStoreInitConns": 10,[m
[31m-        "dataStoreMaxConns": 100,[m
[31m-        "dataStoreConnUsageLimit": 100,[m
[31m-        "dataStoreLogLevel": "debug",[m
[31m-        "maxUrlLength": 500}},[m
[31m-    {[m
[31m-      "servlet-name": "cofaxEmail",[m
[31m-      "servlet-class": "org.cofax.cds.EmailServlet",[m
[31m-      "init-param": {[m
[31m-      "mailHost": "mail1",[m
[31m-      "mailHostOverride": "mail2"}},[m
[31m-    {[m
[31m-      "servlet-name": "cofaxAdmin",[m
[31m-      "servlet-class": "org.cofax.cds.AdminServlet"},[m
[31m-[m
[31m-    {[m
[31m-      "servlet-name": "fileServlet",[m
[31m-      "servlet-class": "org.cofax.cds.FileServlet"},[m
[31m-    {[m
[31m-      "servlet-name": "cofaxTools",[m
[31m-      "servlet-class": "org.cofax.cms.CofaxToolsServlet",[m
[31m-      "init-param": {[m
[31m-        "templatePath": "toolstemplates/",[m
[31m-        "log": 1,[m
[31m-        "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",[m
[31m-        "logMaxSize": "",[m
[31m-        "dataLog": 1,[m
[31m-        "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",[m
[31m-        "dataLogMaxSize": "",[m
[31m-        "removePageCache": "/content/admin/remove?cache=pages&id=",[m
[31m-        "removeTemplateCache": "/content/admin/remove?cache=templates&id=",[m
[31m-        "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",[m
[31m-        "lookInContext": 1,[m
[31m-        "adminGroupID": 4,[m
[31m-        "betaServer": true}}],[m
[31m-  "servlet-mapping": {[m
[31m-    "cofaxCDS": "/",[m
[31m-    "cofaxEmail": "/cofaxutil/aemail/*",[m
[31m-    "cofaxAdmin": "/admin/*",[m
[31m-    "fileServlet": "/static/*",[m
[31m-    "cofaxTools": "/tools/*"},[m
[31m-[m
[31m-  "taglib": {[m
[31m-    "taglib-uri": "cofax.tld",[m
[31m-    "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example5.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example5.json[m
[1mdeleted file mode 100644[m
[1mindex 49980ca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/example5.json[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-{"menu": {[m
[31m-    "header": "SVG Viewer",[m
[31m-    "items": [[m
[31m-        {"id": "Open"},[m
[31m-        {"id": "OpenNew", "label": "Open New"},[m
[31m-        null,[m
[31m-        {"id": "ZoomIn", "label": "Zoom In"},[m
[31m-        {"id": "ZoomOut", "label": "Zoom Out"},[m
[31m-        {"id": "OriginalView", "label": "Original View"},[m
[31m-        null,[m
[31m-        {"id": "Quality"},[m
[31m-        {"id": "Pause"},[m
[31m-        {"id": "Mute"},[m
[31m-        null,[m
[31m-        {"id": "Find", "label": "Find..."},[m
[31m-        {"id": "FindAgain", "label": "Find Again"},[m
[31m-        {"id": "Copy"},[m
[31m-        {"id": "CopyAgain", "label": "Copy Again"},[m
[31m-        {"id": "CopySVG", "label": "Copy SVG"},[m
[31m-        {"id": "ViewSVG", "label": "View SVG"},[m
[31m-        {"id": "ViewSource", "label": "View Source"},[m
[31m-        {"id": "SaveAs", "label": "Save As"},[m
[31m-        null,[m
[31m-        {"id": "Help"},[m
[31m-        {"id": "About", "label": "About Adobe CVG Viewer..."}[m
[31m-    ][m
[31m-}}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/genutf8.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/genutf8.pl[m
[1mdeleted file mode 100755[m
[1mindex db661a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/genutf8.pl[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-# Create test comparison data using a different UTF-8 implementation.[m
[31m-[m
[31m-# The generated utf8.dat file must have the following MD5 sum:[m
[31m-#       cff03b039d850f370a7362f3313e5268[m
[31m-[m
[31m-use strict;[m
[31m-[m
[31m-# 0xD800 - 0xDFFF are used to encode supplementary codepoints[m
[31m-# 0x10000 - 0x10FFFF are supplementary codepoints[m
[31m-my (@codepoints) = (0 .. 0xD7FF, 0xE000 .. 0x10FFFF);[m
[31m-[m
[31m-my $utf8 = pack("U*", @codepoints);[m
[31m-defined($utf8) or die "Unable create UTF-8 string\n";[m
[31m-[m
[31m-open(FH, ">:utf8", "utf8.dat")[m
[31m-    or die "Unable to open utf8.dat: $!\n";[m
[31m-print FH $utf8[m
[31m-    or die "Unable to write utf8.dat\n";[m
[31m-close(FH);[m
[31m-[m
[31m-# vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/numbers.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/numbers.json[m
[1mdeleted file mode 100644[m
[1mindex 4f981ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/numbers.json[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-[ 0.110001,[m
[31m-  0.12345678910111,[m
[31m-  0.412454033640,[m
[31m-  2.6651441426902,[m
[31m-  2.718281828459,[m
[31m-  3.1415926535898,[m
[31m-  2.1406926327793 ][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/octets-escaped.dat b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/octets-escaped.dat[m
[1mdeleted file mode 100644[m
[1mindex ee99a6b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/octets-escaped.dat[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-.\/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007f"[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/rfc-example1.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/rfc-example1.json[m
[1mdeleted file mode 100644[m
[1mindex 73532fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/rfc-example1.json[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-{[m
[31m-   "Image": {[m
[31m-       "Width":  800,[m
[31m-       "Height": 600,[m
[31m-       "Title":  "View from 15th Floor",[m
[31m-       "Thumbnail": {[m
[31m-           "Url":    "http://www.example.com/image/481989943",[m
[31m-           "Height": 125,[m
[31m-           "Width":  "100"[m
[31m-       },[m
[31m-       "IDs": [116, 943, 234, 38793][m
[31m-     }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/rfc-example2.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/rfc-example2.json[m
[1mdeleted file mode 100644[m
[1mindex 2a0cb68..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/rfc-example2.json[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[[m
[31m-   {[m
[31m-      "precision": "zip",[m
[31m-      "Latitude":  37.7668,[m
[31m-      "Longitude": -122.3959,[m
[31m-      "Address":   "",[m
[31m-      "City":      "SAN FRANCISCO",[m
[31m-      "State":     "CA",[m
[31m-      "Zip":       "94107",[m
[31m-      "Country":   "US"[m
[31m-   },[m
[31m-   {[m
[31m-      "precision": "zip",[m
[31m-      "Latitude":  37.371991,[m
[31m-      "Longitude": -122.026020,[m
[31m-      "Address":   "",[m
[31m-      "City":      "SUNNYVALE",[m
[31m-      "State":     "CA",[m
[31m-      "Zip":       "94085",[m
[31m-      "Country":   "US"[m
[31m-   }[m
[31m-][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/test.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/test.lua[m
[1mdeleted file mode 100755[m
[1mindex c96dd3d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/test.lua[m
[1m+++ /dev/null[m
[36m@@ -1,425 +0,0 @@[m
[31m-#!/usr/bin/env lua[m
[31m-[m
[31m--- Lua CJSON tests[m
[31m---[m
[31m--- Mark Pulford <mark@kyne.com.au>[m
[31m---[m
[31m--- Note: The output of this script is easier to read with "less -S"[m
[31m-[m
[31m-local json = require "cjson"[m
[31m-local json_safe = require "cjson.safe"[m
[31m-local util = require "cjson.util"[m
[31m-[m
[31m-local function gen_raw_octets()[m
[31m-    local chars = {}[m
[31m-    for i = 0, 255 do chars[i + 1] = string.char(i) end[m
[31m-    return table.concat(chars)[m
[31m-end[m
[31m-[m
[31m--- Generate every UTF-16 codepoint, including supplementary codes[m
[31m-local function gen_utf16_escaped()[m
[31m-    -- Create raw table escapes[m
[31m-    local utf16_escaped = {}[m
[31m-    local count = 0[m
[31m-[m
[31m-    local function append_escape(code)[m
[31m-        local esc = ('\\u%04X'):format(code)[m
[31m-        table.insert(utf16_escaped, esc)[m
[31m-    end[m
[31m-[m
[31m-    table.insert(utf16_escaped, '"')[m
[31m-    for i = 0, 0xD7FF do[m
[31m-        append_escape(i)[m
[31m-    end[m
[31m-    -- Skip 0xD800 - 0xDFFF since they are used to encode supplementary[m
[31m-    -- codepoints[m
[31m-    for i = 0xE000, 0xFFFF do[m
[31m-        append_escape(i)[m
[31m-    end[m
[31m-    -- Append surrogate pair for each supplementary codepoint[m
[31m-    for high = 0xD800, 0xDBFF do[m
[31m-        for low = 0xDC00, 0xDFFF do[m
[31m-            append_escape(high)[m
[31m-            append_escape(low)[m
[31m-        end[m
[31m-    end[m
[31m-    table.insert(utf16_escaped, '"')[m
[31m-[m
[31m-    return table.concat(utf16_escaped)[m
[31m-end[m
[31m-[m
[31m-function load_testdata()[m
[31m-    local data = {}[m
[31m-[m
[31m-    -- Data for 8bit raw <-> escaped octets tests[m
[31m-    data.octets_raw = gen_raw_octets()[m
[31m-    data.octets_escaped = util.file_load("octets-escaped.dat")[m
[31m-[m
[31m-    -- Data for \uXXXX -> UTF-8 test[m
[31m-    data.utf16_escaped = gen_utf16_escaped()[m
[31m-[m
[31m-    -- Load matching data for utf16_escaped[m
[31m-    local utf8_loaded[m
[31m-    utf8_loaded, data.utf8_raw = pcall(util.file_load, "utf8.dat")[m
[31m-    if not utf8_loaded then[m
[31m-        data.utf8_raw = "Failed to load utf8.dat - please run genutf8.pl"[m
[31m-    end[m
[31m-[m
[31m-    data.table_cycle = {}[m
[31m-    data.table_cycle[1] = data.table_cycle[m
[31m-[m
[31m-    local big = {}[m
[31m-    for i = 1, 1100 do[m
[31m-        big = { { 10, false, true, json.null }, "string", a = big }[m
[31m-    end[m
[31m-    data.deeply_nested_data = big[m
[31m-[m
[31m-    return data[m
[31m-end[m
[31m-[m
[31m-function test_decode_cycle(filename)[m
[31m-    local obj1 = json.decode(util.file_load(filename))[m
[31m-    local obj2 = json.decode(json.encode(obj1))[m
[31m-    return util.compare_values(obj1, obj2)[m
[31m-end[m
[31m-[m
[31m--- Set up data used in tests[m
[31m-local Inf = math.huge;[m
[31m-local NaN = math.huge * 0;[m
[31m-[m
[31m-local testdata = load_testdata()[m
[31m-[m
[31m-local cjson_tests = {[m
[31m-    -- Test API variables[m
[31m-    { "Check module name, version",[m
[31m-      function () return json._NAME, json._VERSION end, { },[m
[31m-      true, { "cjson", "2.1devel" } },[m
[31m-[m
[31m-    -- Test decoding simple types[m
[31m-    { "Decode string",[m
[31m-      json.decode, { '"test string"' }, true, { "test string" } },[m
[31m-    { "Decode numbers",[m
[31m-      json.decode, { '[ 0.0, -5e3, -1, 0.3e-3, 1023.2, 0e10 ]' },[m
[31m-      true, { { 0.0, -5000, -1, 0.0003, 1023.2, 0 } } },[m
[31m-    { "Decode null",[m
[31m-      json.decode, { 'null' }, true, { json.null } },[m
[31m-    { "Decode true",[m
[31m-      json.decode, { 'true' }, true, { true } },[m
[31m-    { "Decode false",[m
[31m-      json.decode, { 'false' }, true, { false } },[m
[31m-    { "Decode object with numeric keys",[m
[31m-      json.decode, { '{ "1": "one", "3": "three" }' },[m
[31m-      true, { { ["1"] = "one", ["3"] = "three" } } },[m
[31m-    { "Decode object with string keys",[m
[31m-      json.decode, { '{ "a": "a", "b": "b" }' },[m
[31m-      true, { { a = "a", b = "b" } } },[m
[31m-    { "Decode array",[m
[31m-      json.decode, { '[ "one", null, "three" ]' },[m
[31m-      true, { { "one", json.null, "three" } } },[m
[31m-[m
[31m-    -- Test decoding errors[m
[31m-    { "Decode UTF-16BE [throw error]",[m
[31m-      json.decode, { '\0"\0"' },[m
[31m-      false, { "JSON parser does not support UTF-16 or UTF-32" } },[m
[31m-    { "Decode UTF-16LE [throw error]",[m
[31m-      json.decode, { '"\0"\0' },[m
[31m-      false, { "JSON parser does not support UTF-16 or UTF-32" } },[m
[31m-    { "Decode UTF-32BE [throw error]",[m
[31m-      json.decode, { '\0\0\0"' },[m
[31m-      false, { "JSON parser does not support UTF-16 or UTF-32" } },[m
[31m-    { "Decode UTF-32LE [throw error]",[m
[31m-      json.decode, { '"\0\0\0' },[m
[31m-      false, { "JSON parser does not support UTF-16 or UTF-32" } },[m
[31m-    { "Decode partial JSON [throw error]",[m
[31m-      json.decode, { '{ "unexpected eof": ' },[m
[31m-      false, { "Expected value but found T_END at character 21" } },[m
[31m-    { "Decode with extra comma [throw error]",[m
[31m-      json.decode, { '{ "extra data": true }, false' },[m
[31m-      false, { "Expected the end but found T_COMMA at character 23" } },[m
[31m-    { "Decode invalid escape code [throw error]",[m
[31m-      json.decode, { [[ { "bad escape \q code" } ]] },[m
[31m-      false, { "Expected object key string but found invalid escape code at character 16" } },[m
[31m-    { "Decode invalid unicode escape [throw error]",[m
[31m-      json.decode, { [[ { "bad unicode \u0f6 escape" } ]] },[m
[31m-      false, { "Expected object key string but found invalid unicode escape code at character 17" } },[m
[31m-    { "Decode invalid keyword [throw error]",[m
[31m-      json.decode, { ' [ "bad barewood", test ] ' },[m
[31m-      false, { "Expected value but found invalid token at character 20" } },[m
[31m-    { "Decode invalid number #1 [throw error]",[m
[31m-      json.decode, { '[ -+12 ]' },[m
[31m-      false, { "Expected value but found invalid number at character 3" } },[m
[31m-    { "Decode invalid number #2 [throw error]",[m
[31m-      json.decode, { '-v' },[m
[31m-      false, { "Expected value but found invalid number at character 1" } },[m
[31m-    { "Decode invalid number exponent [throw error]",[m
[31m-      json.decode, { '[ 0.4eg10 ]' },[m
[31m-      false, { "Expected comma or array end but found invalid token at character 6" } },[m
[31m-[m
[31m-    -- Test decoding nested arrays / objects[m
[31m-    { "Set decode_max_depth(5)",[m
[31m-      json.decode_max_depth, { 5 }, true, { 5 } },[m
[31m-    { "Decode array at nested limit",[m
[31m-      json.decode, { '[[[[[ "nested" ]]]]]' },[m
[31m-      true, { {{{{{ "nested" }}}}} } },[m
[31m-    { "Decode array over nested limit [throw error]",[m
[31m-      json.decode, { '[[[[[[ "nested" ]]]]]]' },[m
[31m-      false, { "Found too many nested data structures (6) at character 6" } },[m
[31m-    { "Decode object at nested limit",[m
[31m-      json.decode, { '{"a":{"b":{"c":{"d":{"e":"nested"}}}}}' },[m
[31m-      true, { {a={b={c={d={e="nested"}}}}} } },[m
[31m-    { "Decode object over nested limit [throw error]",[m
[31m-      json.decode, { '{"a":{"b":{"c":{"d":{"e":{"f":"nested"}}}}}}' },[m
[31m-      false, { "Found too many nested data structures (6) at character 26" } },[m
[31m-    { "Set decode_max_depth(1000)",[m
[31m-      json.decode_max_depth, { 1000 }, true, { 1000 } },[m
[31m-    { "Decode deeply nested array [throw error]",[m
[31m-      json.decode, { string.rep("[", 1100) .. '1100' .. string.rep("]", 1100)},[m
[31m-      false, { "Found too many nested data structures (1001) at character 1001" } },[m
[31m-[m
[31m-    -- Test encoding nested tables[m
[31m-    { "Set encode_max_depth(5)",[m
[31m-      json.encode_max_depth, { 5 }, true, { 5 } },[m
[31m-    { "Encode nested table as array at nested limit",[m
[31m-      json.encode, { {{{{{"nested"}}}}} }, true, { '[[[[["nested"]]]]]' } },[m
[31m-    { "Encode nested table as array after nested limit [throw error]",[m
[31m-      json.encode, { { {{{{{"nested"}}}}} } },[m
[31m-      false, { "Cannot serialise, excessive nesting (6)" } },[m
[31m-    { "Encode nested table as object at nested limit",[m
[31m-      json.encode, { {a={b={c={d={e="nested"}}}}} },[m
[31m-      true, { '{"a":{"b":{"c":{"d":{"e":"nested"}}}}}' } },[m
[31m-    { "Encode nested table as object over nested limit [throw error]",[m
[31m-      json.encode, { {a={b={c={d={e={f="nested"}}}}}} },[m
[31m-      false, { "Cannot serialise, excessive nesting (6)" } },[m
[31m-    { "Encode table with cycle [throw error]",[m
[31m-      json.encode, { testdata.table_cycle },[m
[31m-      false, { "Cannot serialise, excessive nesting (6)" } },[m
[31m-    { "Set encode_max_depth(1000)",[m
[31m-      json.encode_max_depth, { 1000 }, true, { 1000 } },[m
[31m-    { "Encode deeply nested data [throw error]",[m
[31m-      json.encode, { testdata.deeply_nested_data },[m
[31m-      false, { "Cannot serialise, excessive nesting (1001)" } },[m
[31m-[m
[31m-    -- Test encoding simple types[m
[31m-    { "Encode null",[m
[31m-      json.encode, { json.null }, true, { 'null' } },[m
[31m-    { "Encode true",[m
[31m-      json.encode, { true }, true, { 'true' } },[m
[31m-    { "Encode false",[m
[31m-      json.encode, { false }, true, { 'false' } },[m
[31m-    { "Encode empty object",[m
[31m-      json.encode, { { } }, true, { '{}' } },[m
[31m-    { "Encode integer",[m
[31m-      json.encode, { 10 }, true, { '10' } },[m
[31m-    { "Encode string",[m
[31m-      json.encode, { "hello" }, true, { '"hello"' } },[m
[31m-    { "Encode Lua function [throw error]",[m
[31m-      json.encode, { function () end },[m
[31m-      false, { "Cannot serialise function: type not supported" } },[m
[31m-[m
[31m-    -- Test decoding invalid numbers[m
[31m-    { "Set decode_invalid_numbers(true)",[m
[31m-      json.decode_invalid_numbers, { true }, true, { true } },[m
[31m-    { "Decode hexadecimal",[m
[31m-      json.decode, { '0x6.ffp1' }, true, { 13.9921875 } },[m
[31m-    { "Decode numbers with leading zero",[m
[31m-      json.decode, { '[ 0123, 00.33 ]' }, true, { { 123, 0.33 } } },[m
[31m-    { "Decode +-Inf",[m
[31m-      json.decode, { '[ +Inf, Inf, -Inf ]' }, true, { { Inf, Inf, -Inf } } },[m
[31m-    { "Decode +-Infinity",[m
[31m-      json.decode, { '[ +Infinity, Infinity, -Infinity ]' },[m
[31m-      true, { { Inf, Inf, -Inf } } },[m
[31m-    { "Decode +-NaN",[m
[31m-      json.decode, { '[ +NaN, NaN, -NaN ]' }, true, { { NaN, NaN, NaN } } },[m
[31m-    { "Decode Infrared (not infinity) [throw error]",[m
[31m-      json.decode, { 'Infrared' },[m
[31m-      false, { "Expected the end but found invalid token at character 4" } },[m
[31m-    { "Decode Noodle (not NaN) [throw error]",[m
[31m-      json.decode, { 'Noodle' },[m
[31m-      false, { "Expected value but found invalid token at character 1" } },[m
[31m-    { "Set decode_invalid_numbers(false)",[m
[31m-      json.decode_invalid_numbers, { false }, true, { false } },[m
[31m-    { "Decode hexadecimal [throw error]",[m
[31m-      json.decode, { '0x6' },[m
[31m-      false, { "Expected value but found invalid number at character 1" } },[m
[31m-    { "Decode numbers with leading zero [throw error]",[m
[31m-      json.decode, { '[ 0123, 00.33 ]' },[m
[31m-      false, { "Expected value but found invalid number at character 3" } },[m
[31m-    { "Decode +-Inf [throw error]",[m
[31m-      json.decode, { '[ +Inf, Inf, -Inf ]' },[m
[31m-      false, { "Expected value but found invalid token at character 3" } },[m
[31m-    { "Decode +-Infinity [throw error]",[m
[31m-      json.decode, { '[ +Infinity, Infinity, -Infinity ]' },[m
[31m-      false, { "Expected value but found invalid token at character 3" } },[m
[31m-    { "Decode +-NaN [throw error]",[m
[31m-      json.decode, { '[ +NaN, NaN, -NaN ]' },[m
[31m-      false, { "Expected value but found invalid token at character 3" } },[m
[31m-    { 'Set decode_invalid_numbers("on")',[m
[31m-      json.decode_invalid_numbers, { "on" }, true, { true } },[m
[31m-[m
[31m-    -- Test encoding invalid numbers[m
[31m-    { "Set encode_invalid_numbers(false)",[m
[31m-      json.encode_invalid_numbers, { false }, true, { false } },[m
[31m-    { "Encode NaN [throw error]",[m
[31m-      json.encode, { NaN },[m
[31m-      false, { "Cannot serialise number: must not be NaN or Infinity" } },[m
[31m-    { "Encode Infinity [throw error]",[m
[31m-      json.encode, { Inf },[m
[31m-      false, { "Cannot serialise number: must not be NaN or Infinity" } },[m
[31m-    { "Set encode_invalid_numbers(\"null\")",[m
[31m-      json.encode_invalid_numbers, { "null" }, true, { "null" } },[m
[31m-    { "Encode NaN as null",[m
[31m-      json.encode, { NaN }, true, { "null" } },[m
[31m-    { "Encode Infinity as null",[m
[31m-      json.encode, { Inf }, true, { "null" } },[m
[31m-    { "Set encode_invalid_numbers(true)",[m
[31m-      json.encode_invalid_numbers, { true }, true, { true } },[m
[31m-    { "Encode NaN",[m
[31m-      json.encode, { NaN }, true, { "NaN" } },[m
[31m-    { "Encode +Infinity",[m
[31m-      json.encode, { Inf }, true, { "Infinity" } },[m
[31m-    { "Encode -Infinity",[m
[31m-      json.encode, { -Inf }, true, { "-Infinity" } },[m
[31m-    { 'Set encode_invalid_numbers("off")',[m
[31m-      json.encode_invalid_numbers, { "off" }, true, { false } },[m
[31m-[m
[31m-    -- Test encoding tables[m
[31m-    { "Set encode_sparse_array(true, 2, 3)",[m
[31m-      json.encode_sparse_array, { true, 2, 3 }, true, { true, 2, 3 } },[m
[31m-    { "Encode sparse table as array #1",[m
[31m-      json.encode, { { [3] = "sparse test" } },[m
[31m-      true, { '[null,null,"sparse test"]' } },[m
[31m-    { "Encode sparse table as array #2",[m
[31m-      json.encode, { { [1] = "one", [4] = "sparse test" } },[m
[31m-      true, { '["one",null,null,"sparse test"]' } },[m
[31m-    { "Encode sparse array as object",[m
[31m-      json.encode, { { [1] = "one", [5] = "sparse test" } },[m
[31m-      true, { '{"1":"one","5":"sparse test"}' } },[m
[31m-    { "Encode table with numeric string key as object",[m
[31m-      json.encode, { { ["2"] = "numeric string key test" } },[m
[31m-      true, { '{"2":"numeric string key test"}' } },[m
[31m-    { "Set encode_sparse_array(false)",[m
[31m-      json.encode_sparse_array, { false }, true, { false, 2, 3 } },[m
[31m-    { "Encode table with incompatible key [throw error]",[m
[31m-      json.encode, { { [false] = "wrong" } },[m
[31m-      false, { "Cannot serialise boolean: table key must be a number or string" } },[m
[31m-[m
[31m-    -- Test escaping[m
[31m-    { "Encode all octets (8-bit clean)",[m
[31m-      json.encode, { testdata.octets_raw }, true, { testdata.octets_escaped } },[m
[31m-    { "Decode all escaped octets",[m
[31m-      json.decode, { testdata.octets_escaped }, true, { testdata.octets_raw } },[m
[31m-    { "Decode single UTF-16 escape",[m
[31m-      json.decode, { [["\uF800"]] }, true, { "\239\160\128" } },[m
[31m-    { "Decode all UTF-16 escapes (including surrogate combinations)",[m
[31m-      json.decode, { testdata.utf16_escaped }, true, { testdata.utf8_raw } },[m
[31m-    { "Decode swapped surrogate pair [throw error]",[m
[31m-      json.decode, { [["\uDC00\uD800"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-    { "Decode duplicate high surrogate [throw error]",[m
[31m-      json.decode, { [["\uDB00\uDB00"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-    { "Decode duplicate low surrogate [throw error]",[m
[31m-      json.decode, { [["\uDB00\uDB00"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-    { "Decode missing low surrogate [throw error]",[m
[31m-      json.decode, { [["\uDB00"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-    { "Decode invalid low surrogate [throw error]",[m
[31m-      json.decode, { [["\uDB00\uD"]] },[m
[31m-      false, { "Expected value but found invalid unicode escape code at character 2" } },[m
[31m-[m
[31m-    -- Test locale support[m
[31m-    --[m
[31m-    -- The standard Lua interpreter is ANSI C online doesn't support locales[m
[31m-    -- by default. Force a known problematic locale to test strtod()/sprintf().[m
[31m-    { "Set locale to cs_CZ (comma separator)", function ()[m
[31m-        os.setlocale("cs_CZ")[m
[31m-        json.new()[m
[31m-    end },[m
[31m-    { "Encode number under comma locale",[m
[31m-      json.encode, { 1.5 }, true, { '1.5' } },[m
[31m-    { "Decode number in array under comma locale",[m
[31m-      json.decode, { '[ 10, "test" ]' }, true, { { 10, "test" } } },[m
[31m-    { "Revert locale to POSIX", function ()[m
[31m-        os.setlocale("C")[m
[31m-        json.new()[m
[31m-    end },[m
[31m-[m
[31m-    -- Test encode_keep_buffer() and enable_number_precision()[m
[31m-    { "Set encode_keep_buffer(false)",[m
[31m-      json.encode_keep_buffer, { false }, true, { false } },[m
[31m-    { "Set encode_number_precision(3)",[m
[31m-      json.encode_number_precision, { 3 }, true, { 3 } },[m
[31m-    { "Encode number with precision 3",[m
[31m-      json.encode, { 1/3 }, true, { "0.333" } },[m
[31m-    { "Set encode_number_precision(14)",[m
[31m-      json.encode_number_precision, { 14 }, true, { 14 } },[m
[31m-    { "Set encode_keep_buffer(true)",[m
[31m-      json.encode_keep_buffer, { true }, true, { true } },[m
[31m-[m
[31m-    -- Test config API errors[m
[31m-    -- Function is listed as '?' due to pcall[m
[31m-    { "Set encode_number_precision(0) [throw error]",[m
[31m-      json.encode_number_precision, { 0 },[m
[31m-      false, { "bad argument #1 to '?' (expected integer between 1 and 16)" } },[m
[31m-    { "Set encode_number_precision(\"five\") [throw error]",[m
[31m-      json.encode_number_precision, { "five" },[m
[31m-      false, { "bad argument #1 to '?' (number expected, got string)" } },[m
[31m-    { "Set encode_keep_buffer(nil, true) [throw error]",[m
[31m-      json.encode_keep_buffer, { nil, true },[m
[31m-      false, { "bad argument #2 to '?' (found too many arguments)" } },[m
[31m-    { "Set encode_max_depth(\"wrong\") [throw error]",[m
[31m-      json.encode_max_depth, { "wrong" },[m
[31m-      false, { "bad argument #1 to '?' (number expected, got string)" } },[m
[31m-    { "Set decode_max_depth(0) [throw error]",[m
[31m-      json.decode_max_depth, { "0" },[m
[31m-      false, { "bad argument #1 to '?' (expected integer between 1 and 2147483647)" } },[m
[31m-    { "Set encode_invalid_numbers(-2) [throw error]",[m
[31m-      json.encode_invalid_numbers, { -2 },[m
[31m-      false, { "bad argument #1 to '?' (invalid option '-2')" } },[m
[31m-    { "Set decode_invalid_numbers(true, false) [throw error]",[m
[31m-      json.decode_invalid_numbers, { true, false },[m
[31m-      false, { "bad argument #2 to '?' (found too many arguments)" } },[m
[31m-    { "Set encode_sparse_array(\"not quite on\") [throw error]",[m
[31m-      json.encode_sparse_array, { "not quite on" },[m
[31m-      false, { "bad argument #1 to '?' (invalid option 'not quite on')" } },[m
[31m-[m
[31m-    { "Reset Lua CJSON configuration", function () json = json.new() end },[m
[31m-    -- Wrap in a function to ensure the table returned by json.new() is used[m
[31m-    { "Check encode_sparse_array()",[m
[31m-      function (...) return json.encode_sparse_array(...) end, { },[m
[31m-      true, { false, 2, 10 } },[m
[31m-[m
[31m-    { "Encode (safe) simple value",[m
[31m-      json_safe.encode, { true },[m
[31m-      true, { "true" } },[m
[31m-    { "Encode (safe) argument validation [throw error]",[m
[31m-      json_safe.encode, { "arg1", "arg2" },[m
[31m-      false, { "bad argument #1 to '?' (expected 1 argument)" } },[m
[31m-    { "Decode (safe) error generation",[m
[31m-      json_safe.decode, { "Oops" },[m
[31m-      true, { nil, "Expected value but found invalid token at character 1" } },[m
[31m-    { "Decode (safe) error generation after new()",[m
[31m-      function(...) return json_safe.new().decode(...) end, { "Oops" },[m
[31m-      true, { nil, "Expected value but found invalid token at character 1" } },[m
[31m-}[m
[31m-[m
[31m-print(("==> Testing Lua CJSON version %s\n"):format(json._VERSION))[m
[31m-[m
[31m-util.run_test_group(cjson_tests)[m
[31m-[m
[31m-for _, filename in ipairs(arg) do[m
[31m-    util.run_test("Decode cycle " .. filename, test_decode_cycle, { filename },[m
[31m-                  true, { true })[m
[31m-end[m
[31m-[m
[31m-local pass, total = util.run_test_summary()[m
[31m-[m
[31m-if pass == total then[m
[31m-    print("==> Summary: all tests succeeded")[m
[31m-else[m
[31m-    print(("==> Summary: %d/%d tests failed"):format(total - pass, total))[m
[31m-    os.exit(1)[m
[31m-end[m
[31m-[m
[31m--- vi:ai et sw=4 ts=4:[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/types.json b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/types.json[m
[1mdeleted file mode 100644[m
[1mindex c01e7d2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-cjson-2.1.0.4/tests/types.json[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-{ "array": [ 10, true, null ] }[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex ebdac2e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-*~[m
[31m-*.swp[m
[31m-*.swo[m
[31m-test.rds[m
[31m-test_case.lua[m
[31m-*.o[m
[31m-*.so[m
[31m-reindex[m
[31m-tags[m
[31m-*.plist[m
[31m-analyze[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3b45039..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-version=0.09[m
[31m-[m
[31m-name=lua-rds-parser[m
[31m-dist=$(name)-$(version)[m
[31m-[m
[31m-LUA_VERSION =   5.1[m
[31m-[m
[31m-# See http://lua-users.org/wiki/BuildingModules for platform specific[m
[31m-# details.[m
[31m-[m
[31m-## Linux/BSD[m
[31m-PREFIX ?=          /usr/local[m
[31m-LDFLAGS +=         -shared[m
[31m-[m
[31m-## OSX (Macports)[m
[31m-#PREFIX ?=          /opt/local[m
[31m-#LDFLAGS +=         -bundle -undefined dynamic_lookup[m
[31m-[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-[m
[31m-#CFLAGS ?=          -g -Wall -pedantic -fno-inline[m
[31m-CFLAGS ?=          -g -O -Wall[m
[31m-override CFLAGS += -fpic -I$(LUA_INCLUDE_DIR)[m
[31m-[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all clean dist test t[m
[31m-[m
[31m-#CC = gcc[m
[31m-RM = rm -f[m
[31m-[m
[31m-all: parser.so[m
[31m-[m
[31m-src/rds_parser.o: src/ddebug.h src/rds_parser.h src/resty_dbd_stream.h[m
[31m-[m
[31m-.c.o:[m
[31m-	$(CC) -c $(CFLAGS) $(CPPFLAGS) $(BUILD_CFLAGS) -o $@ $<[m
[31m-[m
[31m-parser.so: src/rds_parser.o[m
[31m-	$(CC) $(LDFLAGS) -o $@ $^[m
[31m-[m
[31m-install:[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/rds[m
[31m-	$(INSTALL) parser.so $(DESTDIR)$(LUA_LIB_DIR)/rds[m
[31m-[m
[31m-clean:[m
[31m-	$(RM) *.so *.o rds/*.so[m
[31m-[m
[31m-test: all[m
[31m-	$(INSTALL) -d rds[m
[31m-	$(INSTALL) parser.so rds/[m
[31m-	prove -r t[m
[31m-[m
[31m-valtest: parser.so[m
[31m-	$(INSTALL) -d rds[m
[31m-	$(INSTALL) parser.so rds/[m
[31m-	TEST_LUA_USE_VALGRIND=1 prove -r t[m
[31m-[m
[31m-t: parser.so[m
[31m-	$(INSTALL) -d rds[m
[31m-	$(INSTALL) parser.so rds/[m
[31m-	TEST_LUA_USE_VALGRIND=1 prove t/sanity.t[m
[31m-[m
[31m-dist:[m
[31m-	git archive --prefix="$(dist)/" master | \[m
[31m-		gzip -9 > "$(dist).tar.gz"[m
[31m-	git archive --prefix="$(dist)/" \[m
[31m-		-o "$(dist).zip" master[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/README[m
[1mdeleted file mode 100644[m
[1mindex e8d40b3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/README[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-Name[m
[31m-    lua-rds-parser - Resty-DBD-Stream (RDS) parser for Lua written in C[m
[31m-[m
[31m-Status[m
[31m-    This module is production ready.[m
[31m-[m
[31m-Synopsis[m
[31m-    local parser = require "rds.parser"[m
[31m-[m
[31m-    local res, err = parser.parse(rds)[m
[31m-[m
[31m-    if res == nil then[m
[31m-        error("failed to parse: " .. err)[m
[31m-    end[m
[31m-[m
[31m-    print(res.errcode)[m
[31m-    print(res.errstr)[m
[31m-    print(res.insert_id)[m
[31m-    print(res.affected_rows)[m
[31m-[m
[31m-    local rows = res.resultset[m
[31m-    if rows then[m
[31m-        for i, row in ipairs(rows) do[m
[31m-            for col, val in pairs(row) do[m
[31m-                if val ~= parser.null then[m
[31m-                    print(col .. ": " .. val)[m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-Description[m
[31m-    This Lua library can be used to parse the Resty-DBD-Stream formatted data[m
[31m-    generated by ngx_drizzle (http://wiki.nginx.org/HttpDrizzleModule )[m
[31m-    and ngx_postgres (http://github.com/FRiCKLE/ngx_postgres/ ) into Lua[m
[31m-    data structures. In the past, we have to use JSON as the intermediate data[m
[31m-    format which is quite inefficient in terms of both memory and CPU time.[m
[31m-[m
[31m-    To maximize speed and minimize memory footprint, this library is implemented[m
[31m-    in pure C.[m
[31m-[m
[31m-    Null values in RDS are turned into the light user data "parser.null"[m
[31m-    where "parser" is the module object returned by Lua's "require".[m
[31m-[m
[31m-JSON Serialization[m
[31m-    If you want to serialize the parsed result into JSON, please[m
[31m-    use the lua-cjson library (http://www.kyne.com.au/~mark/software/lua-cjson.php )[m
[31m-    instead of lua-yajl, because lua-cjson is faster than lua-yajl[m
[31m-    in many common cases, and more importantly,[m
[31m-[m
[31m-        parser.null == cjson.null ~= yajl.null[m
[31m-[m
[31m-Using with HttpDrizzleModule[m
[31m-    To use with ngx_drizzle, here is a small example:[m
[31m-[m
[31m-        upstream backend {[m
[31m-            drizzle_server 127.0.0.1:3306 protocol=mysql[m
[31m-                           dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-            drizzle_keepalive max=10 overflow=ignore mode=single;[m
[31m-        }[m
[31m-[m
[31m-        server {[m
[31m-            ...[m
[31m-[m
[31m-            location /mysql {[m
[31m-               drizzle_query $echo_request_body;[m
[31m-               drizzle_pass backend;[m
[31m-            }[m
[31m-[m
[31m-            location /api {[m
[31m-               content_by_lua '[m
[31m-                   local sql = "select * from cats"[m
[31m-                   local resp = ngx.location.capture("/mysql", {[m
[31m-                       method = ngx.HTTP_POST, body = sql[m
[31m-                   })[m
[31m-                   if resp.status ~= ngx.HTTP_OK or not resp.body then[m
[31m-                       error("failed to query mysql")[m
[31m-                   end[m
[31m-[m
[31m-                   local parser = require "rds.parser"[m
[31m-                   local res, err = parser.parse(resp.body)[m
[31m-                   if res == nil then[m
[31m-                       error("failed to parse RDS: " .. err)[m
[31m-                   end[m
[31m-[m
[31m-                   local rows = res.resultset[m
[31m-                   if not rows or #rows == 0 then[m
[31m-                       ngx.say("empty resultset")[m
[31m-                       ngx.exit(0)[m
[31m-                   end[m
[31m-[m
[31m-                   for i, row in ipairs(rows) do[m
[31m-                       ngx.print("row ", i, ": ")[m
[31m-                       for col, val in pairs(row) do[m
[31m-                           if val ~= parser.null then[m
[31m-                               ngx.print(col, "=", val, " ")[m
[31m-                           else[m
[31m-                               ngx.print(col, "=null ")[m
[31m-                           end[m
[31m-                       end[m
[31m-                       ngx.say()[m
[31m-                   end[m
[31m-               ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    On my machine, GET /api will yield[m
[31m-[m
[31m-        row 1: id=2 name=null[m
[31m-        row 2: id=3 name=bob[m
[31m-[m
[31m-    of course, the actual output depends on the structure and contents of the[m
[31m-    "cats" table in the mysql database.[m
[31m-[m
[31m-    You can use this Lua library with the ngx_postgres module in a similar way.[m
[31m-[m
[31m-Installation[m
[31m-  Build requirements[m
[31m-    *   Lua (http://www.lua.org/)[m
[31m-[m
[31m-    *   or LuaJIT (http://www.luajit.org/)[m
[31m-[m
[31m-    Gnu make and gcc is required to build this module.[m
[31m-[m
[31m-  Linux/BSD/Solaris[m
[31m-        gmake CC=gcc[m
[31m-        gmake install CC=gcc[m
[31m-[m
[31m-  Mac OS X[m
[31m-        make LDFLAGS='-bundle -undefined dynamic_lookup' CC=gcc[m
[31m-        make install[m
[31m-[m
[31m-    If your Lua or LuaJIT is not installed into the system, specify its[m
[31m-    include directory like this:[m
[31m-[m
[31m-        make LUA_INCLUDE_DIR=/opt/luajit/include/luajit-2.0[m
[31m-[m
[31m-    You can specify a custom path for the installation target:[m
[31m-[m
[31m-        make install LUA_LIB_DIR=/opt/lualib[m
[31m-[m
[31m-    The "DESTDIR" variable is also supported, to ease RPM packaging.[m
[31m-[m
[31m-TODO[m
[31m-    * add support for option "compact" to generate a compact[m
[31m-      Lua table for the "resultset" field.[m
[31m-[m
[31m-Known Issues[m
[31m-    * The endianness flag in RDS is not supported yet in this library,[m
[31m-      and it will assume it's of the host's endian. So do not[m
[31m-      try parsing the RDS stream that is generated by another[m
[31m-      machine of a different endian.[m
[31m-[m
[31m-Author[m
[31m-    Zhang "agentzh" Yichun <agentzh@gmail.com>[m
[31m-[m
[31m-Copyright & License[m
[31m-    This module is licenced under the BSD license.[m
[31m-[m
[31m-    Copyright (C) 2011, Zhang "agentzh" Yichun (章亦春) <agentzh@gmail.com>.[m
[31m-[m
[31m-    All rights reserved.[m
[31m-[m
[31m-    Redistribution and use in source and binary forms, with or without[m
[31m-    modification, are permitted provided that the following conditions[m
[31m-    are met:[m
[31m-[m
[31m-        * Redistributions of source code must retain the above copyright[m
[31m-        notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-        * Redistributions in binary form must reproduce the above copyright[m
[31m-        notice, this list of conditions and the following disclaimer in the[m
[31m-        documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 5b61a26..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   include <stdio.h>[m
[31m-[m
[31m-#   define dd(...) \[m
[31m-    fprintf(stderr, __VA_ARGS__); \[m
[31m-    fprintf(stderr, "\n")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   define dd(fmt, ...)[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/rds_parser.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/rds_parser.c[m
[1mdeleted file mode 100644[m
[1mindex 6264e0e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/rds_parser.c[m
[1m+++ /dev/null[m
[36m@@ -1,452 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "rds_parser.h"[m
[31m-[m
[31m-#include <lua.h>[m
[31m-#include <lauxlib.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#define LUA_RDS_PARSER_VERSION "0.05"[m
[31m-[m
[31m-[m
[31m-static int rds_parse(lua_State *L);[m
[31m-static int rds_parse_header(lua_State *L, rds_buf_t *b, rds_header_t *header);[m
[31m-static int rds_parse_col(lua_State *L, rds_buf_t *b, rds_column_t *col);[m
[31m-static int rds_parse_row(lua_State *L, rds_buf_t *b, rds_header_t *header,[m
[31m-        rds_column_t *cols, int row);[m
[31m-static int rds_parse_field(lua_State *L, rds_buf_t *b, rds_header_t *header,[m
[31m-        rds_column_t *cols, int col, int row);[m
[31m-[m
[31m-[m
[31m-static char *rds_null = NULL;[m
[31m-[m
[31m-[m
[31m-static const struct luaL_Reg rds_parser[] = {[m
[31m-    {"parse", rds_parse},[m
[31m-    {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int[m
[31m-luaopen_rds_parser(lua_State *L)[m
[31m-{[m
[31m-    luaL_register(L, "rds.parser", rds_parser);[m
[31m-[m
[31m-    lua_pushliteral(L, LUA_RDS_PARSER_VERSION);[m
[31m-    lua_setfield(L, -2, "_VERSION");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, rds_null);[m
[31m-    lua_setfield(L, -2, "null");[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse(lua_State *L)[m
[31m-{[m
[31m-    rds_buf_t           b;[m
[31m-    size_t              len;[m
[31m-    int                 rc;[m
[31m-    rds_header_t        h;[m
[31m-    rds_column_t       *cols;[m
[31m-    int                 i;[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TSTRING);[m
[31m-[m
[31m-    b.start = (u_char *) lua_tolstring(L, 1, &len);[m
[31m-    b.end = b.start + len;[m
[31m-[m
[31m-    b.pos = b.start;[m
[31m-    b.last = b.end;[m
[31m-[m
[31m-    rc = rds_parse_header(L, &b, &h);[m
[31m-    if (rc != 0) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    cols = lua_newuserdata(L, h.col_count * sizeof(rds_column_t));[m
[31m-[m
[31m-    for (i = 0; i < h.col_count; i++) {[m
[31m-        rc = rds_parse_col(L, &b, &cols[i]);[m
[31m-        if (rc != 0) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        dd("pushing col name onto the stack, top %d", lua_gettop(L));[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) cols[i].name.data, cols[i].name.len);[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0 /* narr */, 4 /* nrec */);[m
[31m-[m
[31m-    lua_pushinteger(L, h.std_errcode);[m
[31m-    lua_setfield(L, -2, "errcode");[m
[31m-[m
[31m-    if (h.errstr.len > 0) {[m
[31m-        lua_pushlstring(L, (char *) h.errstr.data, h.errstr.len);[m
[31m-        lua_setfield(L, -2, "errstr");[m
[31m-    }[m
[31m-[m
[31m-    if (h.insert_id) {[m
[31m-        lua_pushinteger(L, h.insert_id);[m
[31m-        lua_setfield(L, -2, "insert_id");[m
[31m-    }[m
[31m-[m
[31m-    if (h.affected_rows) {[m
[31m-        lua_pushinteger(L, h.affected_rows);[m
[31m-        lua_setfield(L, -2, "affected_rows");[m
[31m-    }[m
[31m-[m
[31m-    if (h.col_count == 0) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("creating resultset, top %d", lua_gettop(L));[m
[31m-[m
[31m-    lua_newtable(L);[m
[31m-[m
[31m-    for (i = 0; ; i++) {[m
[31m-        rc = rds_parse_row(L, &b, &h, cols, i);[m
[31m-        if (rc == -2) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("saving resultset, top %d", lua_gettop(L));[m
[31m-    dd("-1: %s", luaL_typename(L, -1));[m
[31m-    dd("-2: %s", luaL_typename(L, -2));[m
[31m-    dd("-3: %s", luaL_typename(L, -3));[m
[31m-[m
[31m-    lua_setfield(L, -2, "resultset");[m
[31m-[m
[31m-    dd("returning %s", luaL_typename(L, -1));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse_row(lua_State *L, rds_buf_t *b, rds_header_t *header,[m
[31m-        rds_column_t *cols, int row)[m
[31m-{[m
[31m-    int         col;[m
[31m-    int         rc;[m
[31m-[m
[31m-    dd("parsing row %d, top %d", row + 1, lua_gettop(L));[m
[31m-[m
[31m-    if (b->last - b->pos < (ssize_t) sizeof(uint8_t)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "row flag is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (*b->pos++ == 0) {[m
[31m-        if (b->pos != b->last) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "seen unexpected leve-over data bytes "[m
[31m-                    "at offset %d, row %d",[m
[31m-                    (int) (b->pos - b->start), row + 1);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("creating row table, top %d", lua_gettop(L));[m
[31m-[m
[31m-    lua_createtable(L, 0, header->col_count /* nrec */);[m
[31m-[m
[31m-    for (col = 0; col < header->col_count; col++) {[m
[31m-        rc = rds_parse_field(L, b, header, cols, col, row);[m
[31m-        if (rc == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("saving row table, top %d", lua_gettop(L));[m
[31m-[m
[31m-    lua_rawseti(L, -2, row + 1);[m
[31m-[m
[31m-    return -2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse_field(lua_State *L, rds_buf_t *b, rds_header_t *header,[m
[31m-        rds_column_t *cols, int col, int row)[m
[31m-{[m
[31m-    size_t          len;[m
[31m-    lua_Number      num;[m
[31m-    lua_Integer     integer;[m
[31m-[m
[31m-    dd("parsing field at row %d, col %d, top %d", row + 1, col + 1,[m
[31m-            lua_gettop(L));[m
[31m-[m
[31m-    if (b->last - b->pos < (ssize_t) sizeof(uint32_t)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "field size is incomplete at offset %d, row %d, "[m
[31m-                "col %d", (int) (b->pos - b->start), row + 1, col + 1);[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    len = *(uint32_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint32_t);[m
[31m-[m
[31m-    /* push the key */[m
[31m-    lua_pushvalue(L, col + 3);[m
[31m-[m
[31m-    if (len == (uint32_t) -1) {[m
[31m-        /* SQL NULL found */[m
[31m-        //lua_pushlightuserdata(L, rds_null);[m
[31m-        lua_pushlightuserdata(L, rds_null);[m
[31m-[m
[31m-    } else {[m
[31m-        if (b->last - b->pos < (ssize_t) len) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "field value is incomplete at offset %d, row %d,"[m
[31m-                    " col %d", (int) (b->pos - b->start), row + 1, col + 1);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        switch (cols[col].std_type & 0xc000) {[m
[31m-        case rds_rough_col_type_float:[m
[31m-            lua_pushlstring(L, (char *) b->pos, len);[m
[31m-            num = lua_tonumber(L, -1);[m
[31m-            lua_pop(L, 1);[m
[31m-            lua_pushnumber(L, num);[m
[31m-            break;[m
[31m-[m
[31m-        case rds_rough_col_type_int:[m
[31m-            lua_pushlstring(L, (char *) b->pos, len);[m
[31m-            integer = lua_tointeger(L, -1);[m
[31m-            lua_pop(L, 1);[m
[31m-            lua_pushinteger(L, integer);[m
[31m-            break;[m
[31m-[m
[31m-        case rds_rough_col_type_bool:[m
[31m-            if (*b->pos == '0' || *b->pos == 'f' || *b->pos == 'F')[m
[31m-            {[m
[31m-                lua_pushboolean(L, 0);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (*b->pos == '1' || *b->pos == 't' || *b->pos == 'T' )[m
[31m-            {[m
[31m-                lua_pushboolean(L, 1);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "unrecognized boolean value at offset %d, "[m
[31m-                    "row %d, col %d", (int) (b->pos - b->start), row + 1,[m
[31m-                    col + 1);[m
[31m-            return 2;[m
[31m-[m
[31m-        default:[m
[31m-            lua_pushlstring(L, (char *) b->pos, len);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        b->pos += len;[m
[31m-    }[m
[31m-[m
[31m-    dd("saving field, top %d", lua_gettop(L));[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse_header(lua_State *L, rds_buf_t *b, rds_header_t *header)[m
[31m-{[m
[31m-    ssize_t          rest;[m
[31m-[m
[31m-    rest = sizeof(uint8_t)      /* endian type */[m
[31m-         + sizeof(uint32_t)     /* format version */[m
[31m-         + sizeof(uint8_t)      /* result type */[m
[31m-[m
[31m-         + sizeof(uint16_t)     /* standard error code */[m
[31m-         + sizeof(uint16_t)     /* driver-specific error code */[m
[31m-[m
[31m-         + sizeof(uint16_t)     /* driver-specific errstr len */[m
[31m-         + 0                    /* driver-specific errstr data */[m
[31m-         + sizeof(uint64_t)     /* affected rows */[m
[31m-         + sizeof(uint64_t)     /* insert id */[m
[31m-         + sizeof(uint16_t)     /* column count */[m
[31m-         ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "header part is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO check endian type */[m
[31m-[m
[31m-    b->pos += sizeof(uint8_t);[m
[31m-[m
[31m-    /* check RDS format version number */[m
[31m-[m
[31m-    if ( *(uint32_t *) b->pos != (uint32_t) resty_dbd_stream_version) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "found RDS format version %d, "[m
[31m-                "but we can only handle version %d",[m
[31m-                (int) *(uint32_t *) b->pos, resty_dbd_stream_version);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    dd("RDS format version: %d", (int) *(uint32_t *) b->pos);[m
[31m-[m
[31m-    b->pos += sizeof(uint32_t);[m
[31m-[m
[31m-    /* check RDS result type */[m
[31m-[m
[31m-    if (*b->pos != 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "RDS result type must be 0 for now but got %d",[m
[31m-                (int) *b->pos);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    b->pos++;[m
[31m-[m
[31m-    /* save the standard error code */[m
[31m-[m
[31m-    header->std_errcode = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save the driver-specific error code */[m
[31m-[m
[31m-    header->drv_errcode = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save the error string length */[m
[31m-[m
[31m-    header->errstr.len = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    dd("errstr len: %d", (int) header->errstr.len);[m
[31m-[m
[31m-    /* check the rest data's size */[m
[31m-[m
[31m-    rest = header->errstr.len[m
[31m-         + sizeof(uint64_t)     /* affected rows */[m
[31m-         + sizeof(uint64_t)     /* insert id */[m
[31m-         + sizeof(uint16_t)     /* column count */[m
[31m-         ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "header part is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* save the error string data */[m
[31m-[m
[31m-    header->errstr.data = b->pos;[m
[31m-[m
[31m-    b->pos += header->errstr.len;[m
[31m-[m
[31m-    /* save affected rows */[m
[31m-[m
[31m-    header->affected_rows = *(uint64_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint64_t);[m
[31m-[m
[31m-    /* save insert id */[m
[31m-[m
[31m-    header->insert_id = *(uint64_t *)b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint64_t);[m
[31m-[m
[31m-    /* save column count */[m
[31m-[m
[31m-    header->col_count = *(uint16_t *) b->pos;[m
[31m-[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    dd("saved column count: %d", (int) header->col_count);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-rds_parse_col(lua_State *L, rds_buf_t *b, rds_column_t *col)[m
[31m-{[m
[31m-    ssize_t         rest;[m
[31m-[m
[31m-    rest = sizeof(uint16_t)         /* std col type */[m
[31m-         + sizeof(uint16_t)         /* driver col type */[m
[31m-         + sizeof(uint16_t)         /* col name str len */[m
[31m-         ;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "column spec is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* save standard column type */[m
[31m-    col->std_type = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* save driver-specific column type */[m
[31m-    col->drv_type = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    /* read column name string length */[m
[31m-[m
[31m-    col->name.len = *(uint16_t *) b->pos;[m
[31m-    b->pos += sizeof(uint16_t);[m
[31m-[m
[31m-    if (col->name.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "column name empty");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    rest = col->name.len;[m
[31m-[m
[31m-    if (b->last - b->pos < rest) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "column name string is incomplete");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    col->name.data = b->pos;[m
[31m-[m
[31m-    b->pos += col->name.len;[m
[31m-[m
[31m-    dd("saved column name \"%.*s\" (len %d, offset %d)",[m
[31m-            (int) col->name.len, col->name.data,[m
[31m-            (int) col->name.len, (int) (b->pos - b->start));[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/rds_parser.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/rds_parser.h[m
[1mdeleted file mode 100644[m
[1mindex 458d8c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/rds_parser.h[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) agentzh[m
[31m- */[m
[31m-[m
[31m-#ifndef RDS_PARSER_H[m
[31m-#define RDS_PARSER_H[m
[31m-[m
[31m-[m
[31m-#include "resty_dbd_stream.h"[m
[31m-#include "sys/types.h"[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-#ifndef u_char[m
[31m-#define u_char  unsigned char[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char      *data;[m
[31m-    size_t       len;[m
[31m-} rds_str_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char      *start;[m
[31m-    u_char      *pos;[m
[31m-    u_char      *last;[m
[31m-    u_char      *end;[m
[31m-} rds_buf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint16_t        std_errcode;[m
[31m-    uint16_t        drv_errcode;[m
[31m-    rds_str_t       errstr;[m
[31m-[m
[31m-    uint64_t        affected_rows;[m
[31m-    uint64_t        insert_id;[m
[31m-    uint16_t        col_count;[m
[31m-[m
[31m-} rds_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct rds_column_s {[m
[31m-    rds_col_type_t      std_type;[m
[31m-    uint16_t            drv_type;[m
[31m-[m
[31m-    rds_str_t           name;[m
[31m-[m
[31m-} rds_column_t;[m
[31m-[m
[31m-[m
[31m-#endif /* RDS_PARSER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/resty_dbd_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/resty_dbd_stream.h[m
[1mdeleted file mode 100644[m
[1mindex ebb0cb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/src/resty_dbd_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-#ifndef RESTY_DBD_STREAME_H[m
[31m-#define RESTY_DBD_STREAME_H[m
[31m-[m
[31m-#define resty_dbd_stream_version 3[m
[31m-#define resty_dbd_stream_version_string "0.0.3"[m
[31m-[m
[31m-#define rds_content_type \[m
[31m-    "application/x-resty-dbd-stream"[m
[31m-[m
[31m-#define rds_content_type_len \[m
[31m-    (sizeof(rds_content_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_rough_col_type_int = 0 << 14,[m
[31m-    rds_rough_col_type_float = 1 << 14,[m
[31m-    rds_rough_col_type_str = 2 << 14,[m
[31m-    rds_rough_col_type_bool = 3 << 14[m
[31m-[m
[31m-} rds_rough_col_type_t;[m
[31m-[m
[31m-[m
[31m-/* The following types (or spellings thereof) are specified[m
[31m- * by SQL:[m
[31m- * bigint, bit, bit varying, boolean, char, character varying,[m
[31m- * character, varchar, date, double precision, integer,[m
[31m- * interval, numeric, decimal, real, smallint,[m
[31m- * time (with or without time zone),[m
[31m- * timestamp (with or without time zone), xml */[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_col_type_unknown = 0 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bigint = 1 | rds_rough_col_type_int,[m
[31m-    rds_col_type_bit = 2 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bit_varying = 3 | rds_rough_col_type_str,[m
[31m-[m
[31m-    rds_col_type_bool = 4 | rds_rough_col_type_bool,[m
[31m-    rds_col_type_char = 5 | rds_rough_col_type_str,[m
[31m-    rds_col_type_varchar = 6 | rds_rough_col_type_str,[m
[31m-    rds_col_type_date = 7 | rds_rough_col_type_str,[m
[31m-    rds_col_type_double = 8 | rds_rough_col_type_float,[m
[31m-    rds_col_type_integer = 9 | rds_rough_col_type_int,[m
[31m-    rds_col_type_interval = 10 | rds_rough_col_type_float,[m
[31m-    rds_col_type_decimal = 11 | rds_rough_col_type_float,[m
[31m-    rds_col_type_real = 12 | rds_rough_col_type_float,[m
[31m-    rds_col_type_smallint = 13 | rds_rough_col_type_int,[m
[31m-    rds_col_type_time_with_time_zone = 14 | rds_rough_col_type_str,[m
[31m-    rds_col_type_time = 15 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp_with_time_zone = 16 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp = 17 | rds_rough_col_type_str,[m
[31m-    rds_col_type_xml = 18 | rds_rough_col_type_str,[m
[31m-[m
[31m-    /* our additions */[m
[31m-    rds_col_type_blob = 19 | rds_rough_col_type_str[m
[31m-[m
[31m-} rds_col_type_t;[m
[31m-[m
[31m-#endif /* RESTY_DBD_STREAME_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/RdsParser.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/RdsParser.pm[m
[1mdeleted file mode 100644[m
[1mindex ecbfdc6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/RdsParser.pm[m
[1m+++ /dev/null[m
[36m@@ -1,90 +0,0 @@[m
[31m-package t::RdsParser;[m
[31m-[m
[31m-use Test::Base -Base;[m
[31m-use IPC::Run3;[m
[31m-use Cwd;[m
[31m-[m
[31m-use Test::LongString;[m
[31m-[m
[31m-our @EXPORT = qw( run_tests );[m
[31m-[m
[31m-$ENV{LUA_CPATH} = "?.so;" . ($ENV{LUA_CPATH} || "") . ';' . "/usr/local/openresty/lualib/?.so;;";[m
[31m-#$ENV{LUA_PATH} = ($ENV{LUA_PATH} || "" ) . ';' . getcwd . "/runtime/?.lua" . ';;';[m
[31m-[m
[31m-sub run_test ($) {[m
[31m-    my $block = shift;[m
[31m-    #print $json_xs->pretty->encode(\@new_rows);[m
[31m-    #my $res = #print $json_xs->pretty->encode($res);[m
[31m-    my $name = $block->name;[m
[31m-[m
[31m-    my $rds = $block->rds or[m
[31m-        die "No --- lua specified for test $name\n";[m
[31m-[m
[31m-    my $rdsfile = "test.rds";[m
[31m-    open my $fh, ">$rdsfile" or[m
[31m-        die "Cannot open $rdsfile for writing: $!\n";[m
[31m-    print $fh $rds;[m
[31m-    close $fh;[m
[31m-[m
[31m-    my $luafile = "test_case.lua";[m
[31m-[m
[31m-    open $fh, ">$luafile" or[m
[31m-        die "Cannot open $luafile for writing: $!\n";[m
[31m-[m
[31m-    print $fh <<'_EOC_';[m
[31m-local f, err = io.open("test.rds", "rb")[m
[31m-if f == nil then[m
[31m-    error("failed to open file test.rds: " .. err)[m
[31m-end[m
[31m-local rds = f:read("*a")[m
[31m-f:close()[m
[31m--- print("RDS:" .. rds)[m
[31m-local parser = require "rds.parser"[m
[31m-local res, err = parser.parse(rds)[m
[31m-if res == nil then[m
[31m-    print(res)[m
[31m-    print(err)[m
[31m-    return[m
[31m-end[m
[31m-local cjson = require "cjson"[m
[31m-print(cjson.encode(res))[m
[31m-_EOC_[m
[31m-[m
[31m-    close $fh;[m
[31m-[m
[31m-    my ($res, $err);[m
[31m-[m
[31m-    my @cmd;[m
[31m-[m
[31m-    if ($ENV{TEST_LUA_USE_VALGRIND}) {[m
[31m-        @cmd =  ('valgrind', '-q', '--leak-check=full', 'lua', 'test_case.lua');[m
[31m-    } else {[m
[31m-        @cmd =  ('lua', 'test_case.lua');[m
[31m-    }[m
[31m-[m
[31m-    run3 \@cmd, undef, \$res, \$err;[m
[31m-[m
[31m-    #warn "res:$res\nerr:$err\n";[m
[31m-[m
[31m-    if (defined $block->err) {[m
[31m-        $err =~ /.*:.*:.*: (.*\s)?/;[m
[31m-        $err = $1;[m
[31m-        is $err, $block->err, "$name - err expected";[m
[31m-    } elsif ($?) {[m
[31m-        die "Failed to execute --- lua for test $name: $err\n";[m
[31m-[m
[31m-    } else {[m
[31m-        #is $res, $block->out, "$name - output ok";[m
[31m-        is $res, $block->out, "$name - output ok";[m
[31m-    }[m
[31m-[m
[31m-    #unlink 'test_case.lua' or warn "could not delete \'test_case.lua\':$!";[m
[31m-}[m
[31m-[m
[31m-sub run_tests () {[m
[31m-    for my $block (blocks()) {[m
[31m-        run_test($block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/error.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/error.t[m
[1mdeleted file mode 100644[m
[1mindex 31e7631..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/error.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RdsParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: truncate at row terminator[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob"  # field data[m
[31m---- out[m
[31m-nil[m
[31m-row flag is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: truncate at field data[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bo"  # field data[m
[31m---- out[m
[31m-nil[m
[31m-field value is incomplete at offset 68, row 2, col 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: truncate at field len[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}"  # field len[m
[31m---- out[m
[31m-nil[m
[31m-field size is incomplete at offset 64, row 2, col 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: truncate at field len (a different cell)[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}"  # field len[m
[31m---- out[m
[31m-nil[m
[31m-field size is incomplete at offset 49, row 1, col 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: truncate at field len[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}"  # valid row flag[m
[31m---- out[m
[31m-nil[m
[31m-field size is incomplete at offset 59, row 2, col 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: truncate at col name data[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"nam"  # col name data[m
[31m---- out[m
[31m-nil[m
[31m-column name string is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: truncate at col name len[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}"  # col name len[m
[31m---- out[m
[31m-nil[m
[31m-column spec is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: truncate at col type[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}"  # drizzle col type[m
[31m---- out[m
[31m-nil[m
[31m-column spec is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: truncate at col count[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}"  # col count[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: truncate at insert id[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}"  # insert id[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: truncate at rows affected[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}"  # rows affected[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: truncate at errstr data[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{03}\x{00}".  # driver errstr len[m
[31m-"he"  # driver errstr data[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: truncate at errstr len[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{03}"  # driver errstr len[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: truncate at driver errcode[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}"  # driver errcode[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: truncate at std errcode[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}"  # std errcode[m
[31m---- out[m
[31m-nil[m
[31m-header part is incomplete[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad result type[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{03}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- out[m
[31m-nil[m
[31m-RDS result type must be 0 for now but got 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad format version[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{01}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{03}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- out[m
[31m-nil[m
[31m-found RDS format version 1, but we can only handle version 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 95ddab6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-rds-parser-0.06/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,108 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RdsParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple select[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".  # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".  # field data[m
[31m-"\x{01}".  # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".  # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".  # field data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- out[m
[31m-{"errcode":0,"resultset":[{"id":2,"name":null},{"id":3,"name":"bob"}]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: update[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- out[m
[31m-{"errstr":"Rows matched: 1  Changed: 0  Warnings: 0","errcode":0}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: select empty resultset[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".  # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer)[m
[31m-"\x{03}\x{00}".  # drizzle col type[m
[31m-"\x{02}\x{00}".     # col name len[m
[31m-"id".   # col name data[m
[31m-"\x{13}\x{80}".  # std col type (blob/str)[m
[31m-"\x{fc}\x{00}".  # drizzle col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".  # col name data[m
[31m-"\x{00}"  # row list terminator[m
[31m---- out[m
[31m-{"errcode":0,"resultset":{}}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: update, insert id, and affected rows[m
[31m---- rds eval[m
[31m-"\x{00}". # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3[m
[31m-"\x{00}". # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{00}\x{00}" . # driver errcode[m
[31m-"\x{28}\x{00}".  # driver errstr len[m
[31m-"Rows matched: 1  Changed: 0  Warnings: 0".  # driver errstr data[m
[31m-"\x{03}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{10}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"  # col count[m
[31m---- out[m
[31m-{"affected_rows":3,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0","errcode":0,"insert_id":272}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 66607d9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-*.swp[m
[31m-*.so[m
[31m-*.lo[m
[31m-*~[m
[31m-reindex[m
[31m-test_case.lua[m
[31m-tags[m
[31m-*.html[m
[31m-*.o[m
[31m-*.tar.gz[m
[31m-*.zip[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 4890d31..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-version=0.09[m
[31m-[m
[31m-name=lua-redis-parser[m
[31m-dist=$(name)-$(version)[m
[31m-[m
[31m-LUA_VERSION =   5.1[m
[31m-[m
[31m-# See http://lua-users.org/wiki/BuildingModules for platform specific[m
[31m-# details.[m
[31m-[m
[31m-## Linux/BSD[m
[31m-PREFIX ?=          /usr/local[m
[31m-LDFLAGS +=         -shared[m
[31m-[m
[31m-## OSX (Macports)[m
[31m-#PREFIX ?=          /opt/local[m
[31m-#LDFLAGS +=         -bundle -undefined dynamic_lookup[m
[31m-[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-[m
[31m-#CFLAGS ?=          -g -Wall -pedantic -fno-inline[m
[31m-CFLAGS ?=          -g -O -Wall[m
[31m-override CFLAGS += -fpic -I$(LUA_INCLUDE_DIR)[m
[31m-[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all clean dist test t[m
[31m-[m
[31m-#CC = gcc[m
[31m-RM = rm -f[m
[31m-[m
[31m-all: parser.so[m
[31m-[m
[31m-redis-parser.o: ddebug.h[m
[31m-[m
[31m-.c.o:[m
[31m-	$(CC) -c $(CFLAGS) $(CPPFLAGS) $(BUILD_CFLAGS) -o $@ $<[m
[31m-[m
[31m-parser.so: redis-parser.o[m
[31m-	$(CC) $(LDFLAGS) -o $@ $^[m
[31m-[m
[31m-install:[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/redis[m
[31m-	$(INSTALL) parser.so $(DESTDIR)$(LUA_LIB_DIR)/redis[m
[31m-[m
[31m-clean:[m
[31m-	$(RM) *.so *.o redis/*.so[m
[31m-[m
[31m-test: all[m
[31m-	$(INSTALL) -d redis[m
[31m-	$(INSTALL) parser.so redis/[m
[31m-	prove -r t[m
[31m-[m
[31m-valtest: parser.so[m
[31m-	$(INSTALL) -d redis[m
[31m-	$(INSTALL) parser.so redis/[m
[31m-	TEST_LUA_USE_VALGRIND=1 prove -r t[m
[31m-[m
[31m-t: parser.so[m
[31m-	$(INSTALL) -d redis[m
[31m-	$(INSTALL) parser.so redis/[m
[31m-	TEST_LUA_USE_VALGRIND=1 prove t/sanity.t[m
[31m-[m
[31m-dist:[m
[31m-	git archive --prefix="$(dist)/" master | \[m
[31m-		gzip -9 > "$(dist).tar.gz"[m
[31m-	git archive --prefix="$(dist)/" \[m
[31m-		-o "$(dist).zip" master[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 5b61a26..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   include <stdio.h>[m
[31m-[m
[31m-#   define dd(...) \[m
[31m-    fprintf(stderr, __VA_ARGS__); \[m
[31m-    fprintf(stderr, "\n")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   define dd(fmt, ...)[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/redis-parser.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/redis-parser.c[m
[1mdeleted file mode 100644[m
[1mindex 6900f79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/redis-parser.c[m
[1m+++ /dev/null[m
[36m@@ -1,716 +0,0 @@[m
[31m-#define DDEBUG 0[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <lua.h>[m
[31m-#include <lauxlib.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdint.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#define LUA_REDIS_PARSER_VERSION "0.10"[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    BAD_REPLY           = 0,[m
[31m-    STATUS_REPLY        = 1,[m
[31m-    ERROR_REPLY         = 2,[m
[31m-    INTEGER_REPLY       = 3,[m
[31m-    BULK_REPLY          = 4,[m
[31m-    MULTI_BULK_REPLY    = 5[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    PARSE_OK    = 0,[m
[31m-    PARSE_ERROR = 1[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static const char *redis_typenames[] = {[m
[31m-    "bad reply",[m
[31m-    "status reply",[m
[31m-    "error reply",[m
[31m-    "integer reply",[m
[31m-    "bulk reply",[m
[31m-    "multi-bulk reply"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define UINT64_LEN   (sizeof("18446744073709551615") - 1)[m
[31m-[m
[31m-static void *redis_null = NULL;[m
[31m-[m
[31m-static int parse_reply_helper(lua_State *L, char **src, size_t len);[m
[31m-static int redis_parse_reply(lua_State *L);[m
[31m-static int redis_parse_replies(lua_State *L);[m
[31m-static int redis_build_query(lua_State *L);[m
[31m-static const char * parse_single_line_reply(const char *src, const char *last,[m
[31m-        size_t *dst_len);[m
[31m-static const char * parse_bulk_reply(const char *src, const char *last,[m
[31m-        size_t *dst_len);[m
[31m-static int parse_multi_bulk_reply(lua_State *L, char **src,[m
[31m-        const char *last);[m
[31m-static size_t get_num_size(size_t i);[m
[31m-static char *sprintf_num(char *dst, int64_t ui64);[m
[31m-static int redis_typename(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#define redis_nelems(arr) \[m
[31m-            (sizeof(arr) / sizeof(arr[0]))[m
[31m-[m
[31m-[m
[31m-static const struct luaL_Reg redis_parser[] = {[m
[31m-    {"parse_reply", redis_parse_reply},[m
[31m-    {"parse_replies", redis_parse_replies},[m
[31m-    {"build_query", redis_build_query},[m
[31m-    {"typename", redis_typename},[m
[31m-    {NULL, NULL}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int[m
[31m-luaopen_redis_parser(lua_State *L)[m
[31m-{[m
[31m-    luaL_register(L, "redis.parser", redis_parser);[m
[31m-[m
[31m-    lua_pushliteral(L, LUA_REDIS_PARSER_VERSION);[m
[31m-    lua_setfield(L, -2, "_VERSION");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, redis_null);[m
[31m-    lua_setfield(L, -2, "null");[m
[31m-[m
[31m-    lua_pushnumber(L, BAD_REPLY);[m
[31m-    lua_setfield(L, -2, "BAD_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, STATUS_REPLY);[m
[31m-    lua_setfield(L, -2, "STATUS_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, ERROR_REPLY);[m
[31m-    lua_setfield(L, -2, "ERROR_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, INTEGER_REPLY);[m
[31m-    lua_setfield(L, -2, "INTEGER_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, BULK_REPLY);[m
[31m-    lua_setfield(L, -2, "BULK_REPLY");[m
[31m-[m
[31m-    lua_pushnumber(L, MULTI_BULK_REPLY);[m
[31m-    lua_setfield(L, -2, "MULTI_BULK_REPLY");[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-redis_parse_reply(lua_State *L)[m
[31m-{[m
[31m-    char            *p;[m
[31m-    size_t           len;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expected one argument but got %d",[m
[31m-                lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    p = (char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    return parse_reply_helper(L, &p, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-redis_parse_replies(lua_State *L)[m
[31m-{[m
[31m-    char        *p;[m
[31m-    char        *q;[m
[31m-    int          i, n, nret;[m
[31m-    size_t       len;[m
[31m-[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expected two arguments but got %d",[m
[31m-                lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    p = (char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    n = luaL_checknumber(L, 2);[m
[31m-[m
[31m-    dd("n = %d", (int) n);[m
[31m-[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    lua_createtable(L, n, 0); /* table */[m
[31m-[m
[31m-    for (i = 1; i <= n; i++) {[m
[31m-        dd("parsing reply %d", i);[m
[31m-[m
[31m-        lua_createtable(L, n, 2); /* table table */[m
[31m-        q = p;[m
[31m-        nret = parse_reply_helper(L, &p, len); /* table table res typ */[m
[31m-        if (nret != 2) {[m
[31m-            return luaL_error(L, "internal error: redis_parse_reply "[m
[31m-                    "returns %d", nret);[m
[31m-        }[m
[31m-[m
[31m-        dd("p = %p, q = %p, len = %d", p, q, (int) len);[m
[31m-[m
[31m-        len -= p - q;[m
[31m-[m
[31m-        dd("len is now %d", (int) len);[m
[31m-[m
[31m-        lua_rawseti(L, -3, 2); /* table table res */[m
[31m-        lua_rawseti(L, -2, 1); /* table table */[m
[31m-        lua_rawseti(L, -2, i); /* table */[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-parse_reply_helper(lua_State *L, char **src, size_t len)[m
[31m-{[m
[31m-    char            *p;[m
[31m-    const char      *last;[m
[31m-    const char      *dst;[m
[31m-    size_t           dst_len;[m
[31m-    lua_Number       num;[m
[31m-    int              rc;[m
[31m-[m
[31m-    p = *src;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        lua_pushliteral(L, "empty reply");[m
[31m-        lua_pushnumber(L, BAD_REPLY);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    last = p + len;[m
[31m-[m
[31m-    switch (*p) {[m
[31m-    case '+':[m
[31m-        p++;[m
[31m-        dst = parse_single_line_reply(p, last, &dst_len);[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            lua_pushliteral(L, "bad status reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        *src += dst_len + 1 + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        lua_pushlstring(L, dst, dst_len);[m
[31m-        lua_pushnumber(L, STATUS_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    case '-':[m
[31m-        p++;[m
[31m-        dst = parse_single_line_reply(p, last, &dst_len);[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            lua_pushliteral(L, "bad error reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        *src += dst_len + 1 + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        lua_pushlstring(L, dst, dst_len);[m
[31m-        lua_pushnumber(L, ERROR_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    case ':':[m
[31m-        p++;[m
[31m-        dst = parse_single_line_reply(p, last, &dst_len);[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            lua_pushliteral(L, "bad integer reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        *src += dst_len + 1 + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        lua_pushlstring(L, dst, dst_len);[m
[31m-        num = lua_tonumber(L, -1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        lua_pushnumber(L, num);[m
[31m-        lua_pushnumber(L, INTEGER_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    case '$':[m
[31m-        p++;[m
[31m-        dst = parse_bulk_reply(p, last, &dst_len);[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            lua_pushliteral(L, "bad bulk reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (dst_len == -1) {[m
[31m-            *src = (char *) dst + sizeof("\r\n") - 1;[m
[31m-[m
[31m-            /* lua_pushlightuserdata(L, redis_null); */[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushnumber(L, BULK_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        *src = (char *) dst + dst_len + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        lua_pushlstring(L, dst, dst_len);[m
[31m-        lua_pushnumber(L, BULK_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    case '*':[m
[31m-        p++;[m
[31m-        rc = parse_multi_bulk_reply(L, &p, last);[m
[31m-[m
[31m-        if (rc != PARSE_OK) {[m
[31m-            lua_pushliteral(L, "bad multi bulk reply");[m
[31m-            lua_pushnumber(L, BAD_REPLY);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == PARSE_OK */[m
[31m-[m
[31m-        *src = (char *) p;[m
[31m-[m
[31m-        lua_pushnumber(L, MULTI_BULK_REPLY);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        lua_pushliteral(L, "invalid reply");[m
[31m-        lua_pushnumber(L, BAD_REPLY);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *[m
[31m-parse_single_line_reply(const char *src, const char *last, size_t *dst_len)[m
[31m-{[m
[31m-    const char  *p = src;[m
[31m-    int          seen_cr = 0;[m
[31m-[m
[31m-    while (p != last) {[m
[31m-[m
[31m-        if (*p == '\r') {[m
[31m-            seen_cr = 1;[m
[31m-[m
[31m-        } else if (seen_cr) {[m
[31m-            if (*p == '\n') {[m
[31m-                *dst_len = p - src - 1;[m
[31m-                return src;[m
[31m-            }[m
[31m-[m
[31m-            seen_cr = 0;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    /* CRLF not found at all */[m
[31m-    *dst_len = -2;[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define CHECK_EOF if (p >= last) goto invalid;[m
[31m-[m
[31m-[m
[31m-static const char *[m
[31m-parse_bulk_reply(const char *src, const char *last, size_t *dst_len)[m
[31m-{[m
[31m-    const char *p = src;[m
[31m-    ssize_t     size = 0;[m
[31m-    const char *dst;[m
[31m-[m
[31m-    CHECK_EOF[m
[31m-[m
[31m-    /* read the bulk size */[m
[31m-[m
[31m-    if (*p == '-') {[m
[31m-        p++;[m
[31m-        CHECK_EOF[m
[31m-[m
[31m-        while (*p != '\r') {[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            p++;[m
[31m-            CHECK_EOF[m
[31m-        }[m
[31m-[m
[31m-        /* *p == '\r' */[m
[31m-[m
[31m-        if (last - p < size + sizeof("\r\n") - 1) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-[m
[31m-        if (*p++ != '\n') {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        *dst_len = -1;[m
[31m-        return p - (sizeof("\r\n") - 1);[m
[31m-    }[m
[31m-[m
[31m-    while (*p != '\r') {[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        size *= 10;[m
[31m-        size += *p - '0';[m
[31m-[m
[31m-        p++;[m
[31m-        CHECK_EOF[m
[31m-    }[m
[31m-[m
[31m-    /* *p == '\r' */[m
[31m-[m
[31m-    p++;[m
[31m-    CHECK_EOF[m
[31m-[m
[31m-    if (*p++ != '\n') {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    /* read the bulk data */[m
[31m-[m
[31m-    if (last - p < size + sizeof("\r\n") - 1) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    dst = p;[m
[31m-[m
[31m-    p += size;[m
[31m-[m
[31m-    if (*p++ != '\r') {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (*p++ != '\n') {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    *dst_len = size;[m
[31m-    return dst;[m
[31m-[m
[31m-invalid:[m
[31m-    *dst_len = -2;[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-parse_multi_bulk_reply(lua_State *L, char **src, const char *last)[m
[31m-{[m
[31m-    const char      *p = *src;[m
[31m-    int              count = 0;[m
[31m-    int              i;[m
[31m-    size_t           dst_len;[m
[31m-    const char      *dst;[m
[31m-[m
[31m-    dd("enter multi bulk parser");[m
[31m-[m
[31m-    CHECK_EOF[m
[31m-[m
[31m-    while (*p != '\r') {[m
[31m-        if (*p == '-') {[m
[31m-[m
[31m-            p++;[m
[31m-            CHECK_EOF[m
[31m-[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            while (*p != '\r') {[m
[31m-                p++;[m
[31m-                CHECK_EOF[m
[31m-            }[m
[31m-[m
[31m-            count = -1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            dd("expecting digit, but found %c", *p);[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        count *= 10;[m
[31m-        count += *p - '0';[m
[31m-[m
[31m-        p++;[m
[31m-        CHECK_EOF[m
[31m-    }[m
[31m-[m
[31m-    dd("count = %d", count);[m
[31m-[m
[31m-    /* *p == '\r' */[m
[31m-[m
[31m-    p++;[m
[31m-    CHECK_EOF[m
[31m-[m
[31m-    if (*p++ != '\n') {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    dd("reading the individual bulks");[m
[31m-[m
[31m-    if (count == -1) {[m
[31m-[m
[31m-        /* lua_pushlightuserdata(L, redis_null); */[m
[31m-        lua_pushnil(L);[m
[31m-[m
[31m-        *src = (char *) p;[m
[31m-        return PARSE_OK;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, count, 0);[m
[31m-[m
[31m-    for (i = 1; i <= count; i++) {[m
[31m-        CHECK_EOF[m
[31m-[m
[31m-        switch (*p) {[m
[31m-        case '+':[m
[31m-        case '-':[m
[31m-        case ':':[m
[31m-            p++;[m
[31m-            dst = parse_single_line_reply(p, last, &dst_len);[m
[31m-            break;[m
[31m-[m
[31m-        case '$':[m
[31m-            p++;[m
[31m-            dst = parse_bulk_reply(p, last, &dst_len);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        if (dst_len == -2) {[m
[31m-            dd("bulk %d reply parse fail for multi bulks", i);[m
[31m-            return PARSE_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (dst_len == -1) {[m
[31m-            lua_pushnil(L);[m
[31m-            p = dst + sizeof("\r\n") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushlstring(L, dst, dst_len);[m
[31m-            p = dst + dst_len + sizeof("\r\n") - 1;[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, -2, i);[m
[31m-    }[m
[31m-[m
[31m-    *src = (char *) p;[m
[31m-[m
[31m-    return PARSE_OK;[m
[31m-[m
[31m-invalid:[m
[31m-    return PARSE_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-redis_build_query(lua_State *L)[m
[31m-{[m
[31m-    int          i, n;[m
[31m-    size_t       len, total;[m
[31m-    const char  *p;[m
[31m-    char        *last;[m
[31m-    char        *buf;[m
[31m-    int          flag;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expected one argument but got %d",[m
[31m-                lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    n = luaL_getn(L, 1);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return luaL_error(L, "empty input param table");[m
[31m-    }[m
[31m-[m
[31m-    total = sizeof("*") - 1[m
[31m-          + get_num_size(n)[m
[31m-          + sizeof("\r\n") - 1[m
[31m-          ;[m
[31m-[m
[31m-    for (i = 1; i <= n; i++) {[m
[31m-        lua_rawgeti(L, 1, i);[m
[31m-[m
[31m-        dd("param type: %d (%d)", lua_type(L, -1), LUA_TUSERDATA);[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-            case LUA_TSTRING:[m
[31m-            case LUA_TNUMBER:[m
[31m-                lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-                total += sizeof("$") - 1[m
[31m-                       + get_num_size(len)[m
[31m-                       + sizeof("\r\n") - 1[m
[31m-                       + len[m
[31m-                       + sizeof("\r\n") - 1[m
[31m-                       ;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                total += sizeof("$1\r\n1\r\n") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                p = lua_touserdata(L, -1);[m
[31m-                dd("user data: %p", p);[m
[31m-                if (p == redis_null) {[m
[31m-                    total += sizeof("$-1\r\n") - 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "parameter %d is not a string, number, "[m
[31m-                        "redis.parser.null, or boolean value", i);[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    buf = lua_newuserdata(L, total); /* lua_newuserdata never returns NULL */[m
[31m-[m
[31m-    last = buf;[m
[31m-[m
[31m-    *last++ = '*';[m
[31m-    last = sprintf_num(last, n);[m
[31m-    *last++ = '\r'; *last++ = '\n';[m
[31m-[m
[31m-    for (i = 1; i <= n; i++) {[m
[31m-        lua_rawgeti(L, 1, i);[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-            case LUA_TSTRING:[m
[31m-            case LUA_TNUMBER:[m
[31m-                p = luaL_checklstring(L, -1, &len);[m
[31m-[m
[31m-                *last++ = '$';[m
[31m-[m
[31m-                last = sprintf_num(last, len);[m
[31m-[m
[31m-                *last++ = '\r'; *last++ = '\n';[m
[31m-[m
[31m-                memcpy(last, p, len);[m
[31m-                last += len;[m
[31m-[m
[31m-                *last++ = '\r'; *last++ = '\n';[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                memcpy(last, "$1\r\n", sizeof("$1\r\n") - 1);[m
[31m-                last += sizeof("$1\r\n") - 1;[m
[31m-[m
[31m-                flag = lua_toboolean(L, -1);[m
[31m-                *last++ = flag ? '1' : '0';[m
[31m-[m
[31m-                *last++ = '\r'; *last++ = '\n';[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                /* must be null */[m
[31m-                memcpy(last, "$-1\r\n", sizeof("$-1\r\n") - 1);[m
[31m-                last += sizeof("$-1\r\n") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                /* cannot reach here */[m
[31m-                break;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    if (last - buf != (ssize_t) total) {[m
[31m-        return luaL_error(L, "buffer error");[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, buf, total);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-get_num_size(size_t i)[m
[31m-{[m
[31m-    size_t          n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        i = i / 10;[m
[31m-        n++;[m
[31m-    } while (i > 0);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-sprintf_num(char *dst, int64_t ui64)[m
[31m-{[m
[31m-    char             *p;[m
[31m-    char              temp[UINT64_LEN + 1];[m
[31m-    size_t            len;[m
[31m-[m
[31m-    p = temp + UINT64_LEN;[m
[31m-[m
[31m-    do {[m
[31m-        *--p = (char) (ui64 % 10 + '0');[m
[31m-    } while (ui64 /= 10);[m
[31m-[m
[31m-    len = (temp + UINT64_LEN) - p;[m
[31m-[m
[31m-    memcpy(dst, p, len);[m
[31m-[m
[31m-    return dst + len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-redis_typename(lua_State *L)[m
[31m-{[m
[31m-    int         typ;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument but got %d",[m
[31m-                lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    typ = (int) luaL_checkinteger(L, 1);[m
[31m-[m
[31m-    if (typ < 0 || typ >= redis_nelems(redis_typenames)) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushstring(L, redis_typenames[typ]);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/RedisParser.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/RedisParser.pm[m
[1mdeleted file mode 100644[m
[1mindex 99ab0b5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/RedisParser.pm[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-package t::RedisParser;[m
[31m-[m
[31m-use Test::Base -Base;[m
[31m-use IPC::Run3;[m
[31m-use Cwd;[m
[31m-[m
[31m-use Test::LongString;[m
[31m-[m
[31m-our @EXPORT = qw( run_tests );[m
[31m-[m
[31m-$ENV{LUA_CPATH} = "?.so;" . ($ENV{LUA_CPATH} || "") . ';' . "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-#$ENV{LUA_PATH} = ($ENV{LUA_PATH} || "" ) . ';' . getcwd . "/runtime/?.lua" . ';;';[m
[31m-[m
[31m-sub run_test ($) {[m
[31m-    my $block = shift;[m
[31m-    #print $json_xs->pretty->encode(\@new_rows);[m
[31m-    #my $res = #print $json_xs->pretty->encode($res);[m
[31m-    my $name = $block->name;[m
[31m-[m
[31m-    my $lua = $block->lua or[m
[31m-        die "No --- lua specified for test $name\n";[m
[31m-[m
[31m-    open my $fh, ">test_case.lua";[m
[31m-    print $fh $lua;[m
[31m-    close $fh;[m
[31m-[m
[31m-    my ($res, $err);[m
[31m-[m
[31m-    my @cmd;[m
[31m-[m
[31m-    if ($ENV{TEST_LUA_USE_VALGRIND}) {[m
[31m-        @cmd =  ('valgrind', '-q', '--leak-check=full', 'lua', 'test_case.lua');[m
[31m-    } else {[m
[31m-        @cmd =  ('lua', 'test_case.lua');[m
[31m-    }[m
[31m-[m
[31m-    run3 \@cmd, undef, \$res, \$err;[m
[31m-[m
[31m-    #warn "res:$res\nerr:$err\n";[m
[31m-[m
[31m-    if (defined $block->err) {[m
[31m-        $err =~ /.*:.*:.*: (.*\s)?/;[m
[31m-        $err = $1;[m
[31m-        is $err, $block->err, "$name - err expected";[m
[31m-    } elsif ($?) {[m
[31m-        die "Failed to execute --- lua for test $name: $err\n";[m
[31m-[m
[31m-    } else {[m
[31m-        #is $res, $block->out, "$name - output ok";[m
[31m-        is_string $res, $block->out, "$name - output ok";[m
[31m-    }[m
[31m-[m
[31m-    unlink 'test_case.lua' or warn "could not delete \'test_case.lua\':$!";[m
[31m-}[m
[31m-[m
[31m-sub run_tests () {[m
[31m-    for my $block (blocks()) {[m
[31m-        run_test($block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/pipeline.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/pipeline.t[m
[1mdeleted file mode 100644[m
[1mindex b5e6386..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/pipeline.t[m
[1m+++ /dev/null[m
[36m@@ -1,287 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RedisParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single reply parsed by parse_replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '+OK\r\n'[m
[31m-results = parser.parse_replies(replies, 1)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-local res = results[1][m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.STATUS_REPLY)[m
[31m---- out[m
[31m-res count == 1[m
[31m-res[1] count == 2[m
[31m-res[1][1] == OK[m
[31m-res[1][2] == 1 == 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: single bad reply parsed by parse_replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '+OK'[m
[31m-results = parser.parse_replies(replies, 1)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-local res = results[1][m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m---- out[m
[31m-res count == 1[m
[31m-res[1] count == 2[m
[31m-res[1][1] == bad status reply[m
[31m-res[1][2] == 0 == 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multiple status replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '+OK\r\n+DONE\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.STATUS_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.STATUS_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == OK[m
[31m-res[1][2] == 1 == 1[m
[31m-res[2][1] == DONE[m
[31m-res[2][2] == 1 == 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple integer replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = ':-32\r\n:532\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.INTEGER_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.INTEGER_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == -32[m
[31m-res[1][2] == 3 == 3[m
[31m-res[2][1] == 532[m
[31m-res[2][2] == 3 == 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: multiple error replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '-ERROR\r\n-BAD\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.ERROR_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.ERROR_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == ERROR[m
[31m-res[1][2] == 2 == 2[m
[31m-res[2][1] == BAD[m
[31m-res[2][2] == 2 == 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple bad replies (invalid reply)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '\r\n-BAD\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == invalid reply[m
[31m-res[1][2] == 0 == 0[m
[31m-res[2][1] == invalid reply[m
[31m-res[2][2] == 0 == 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple bad replies (empty reply)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = ''[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. res[1])[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.BAD_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == empty reply[m
[31m-res[1][2] == 0 == 0[m
[31m-res[2][1] == empty reply[m
[31m-res[2][2] == 0 == 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: multiple bulk replies[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '$-1\r\n$5\r\nhello\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. (res[1] or "nil"))[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.BULK_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.BULK_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == nil[m
[31m-res[1][2] == 4 == 4[m
[31m-res[2][1] == hello[m
[31m-res[2][2] == 4 == 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multiple multi-bulk replies[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-replies = '*2\r\n$-1\r\n$5\r\nhello\r\n*1\r\n$1\r\na\r\n$2\r\nef\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. cjson.encode(res[1]))[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. cjson.encode(res[1]))[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == [null,"hello"][m
[31m-res[1][2] == 5 == 5[m
[31m-res[2][1] == ["a"][m
[31m-res[2][2] == 5 == 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nil multi bulk reply and status reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-replies = '*-1\r\n+DONE\r\n'[m
[31m-results = parser.parse_replies(replies, 2)[m
[31m-print("res count == " .. #results)[m
[31m-print("res[1] count == " .. #results[1])[m
[31m-print("res[2] count == " .. #results[2])[m
[31m-[m
[31m-local res = results[1][m
[31m-[m
[31m-print("res[1][1] == " .. (res[1] or "nil"))[m
[31m-print("res[1][2] == " .. res[2] .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-[m
[31m-res = results[2][m
[31m-[m
[31m-print("res[2][1] == " .. res[1])[m
[31m-print("res[2][2] == " .. res[2] .. ' == ' .. parser.STATUS_REPLY)[m
[31m-[m
[31m---- out[m
[31m-res count == 2[m
[31m-res[1] count == 2[m
[31m-res[2] count == 2[m
[31m-res[1][1] == nil[m
[31m-res[1][2] == 5 == 5[m
[31m-res[2][1] == DONE[m
[31m-res[2][2] == 1 == 1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 80350ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,514 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RedisParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no crlf in status reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '+OK'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.BAD_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == bad reply == 0[m
[31m-res == bad status reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: good status reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '+OK\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.STATUS_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 1 == status reply == 1[m
[31m-res == OK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: good error reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '-Bad argument\rHey\r\nblah blah blah\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.ERROR_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out eval[m
[31m-"typ == 2 == error reply == 2[m
[31m-res == Bad argument\rHey\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: good integer reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = ':-32\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.INTEGER_REPLY)[m
[31m-print("res == " .. res)[m
[31m-print("res type == " .. type(res))[m
[31m---- out[m
[31m-typ == 3 == integer reply == 3[m
[31m-res == -32[m
[31m-res type == number[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: non-numeric integer reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = ':abc\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.INTEGER_REPLY)[m
[31m-print("res == " .. res)[m
[31m-print("res type == " .. type(res))[m
[31m---- out[m
[31m-typ == 3 == 3[m
[31m-res == 0[m
[31m-res type == number[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad integer reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = ':12\r'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BAD_REPLY)[m
[31m-print("res == " .. res)[m
[31m-print("res type == " .. type(res))[m
[31m---- out[m
[31m-typ == 0 == 0[m
[31m-res == bad integer reply[m
[31m-res type == string[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: good bulk reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 4 == bulk reply == 4[m
[31m-res == hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: good bulk reply (ignoring trailing stuffs)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$5\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 4 == 4[m
[31m-res == hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bad bulk reply (bad bulk size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$3b\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bad bulk reply (bulk size too small)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$3\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: bad bulk reply (bulk size too large)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$6\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: bad bulk reply (bulk size too large, 2)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$7\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: bad bulk reply (bulk size too large, 3)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$8\r\nhello\r\nblah'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res == " .. res)[m
[31m---- out[m
[31m-typ == 0 == 4[m
[31m-res == bad bulk reply[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: good bulk reply (nil value)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-1\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 4 == 4[m
[31m-res\tnil\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: good bulk reply (nil value, -25 size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-25\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 4 == 4[m
[31m-res\tnil\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad bulk reply (nil value, -1 size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-1\r'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 0 == 4[m
[31m-res\tbad bulk reply\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad bulk reply (nil value, -1 size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-1\ra'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 0 == 4[m
[31m-res\tbad bulk reply\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad bulk reply (nil value, -1 size)[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-reply = '$-1ab'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.BULK_REPLY)[m
[31m-print("res", res)[m
[31m---- out eval[m
[31m-"typ == 0 == 4[m
[31m-res\tbad bulk reply\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: good multi bulk reply (1 bulk)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*1\r\n$1\r\na\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == multi-bulk reply == 5[m
[31m-res == ["a"]\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: good multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*4\r\n$1\r\na\r\n$-1\r\n$0\r\n\r\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m-print("res[2]:", res[2]);[m
[31m---- out eval[m
[31m-qq{typ == 5 == 5[m
[31m-res == ["a",null,"","hello"][m
[31m-res[2]:\tnil\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: bad multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*4\r\n$1\r\na\r\n$-1\r\n$0\r\n\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 0 == 5[m
[31m-res == "bad multi bulk reply"\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: bad multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*6\r\n$1\r\na\r\n$-1\r\n$0\r\n\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 0 == 5[m
[31m-res == "bad multi bulk reply"\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: bad multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*6\n$1\r\na\r\n$-1\r\n$0\r\n\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 0 == 5[m
[31m-res == "bad multi bulk reply"\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: bad multi bulk reply (4 bulks)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*6$1\r\na\r\n$-1\r\n$0\r\n\n$5\r\nhello\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 0 == 5[m
[31m-res == "bad multi bulk reply"\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: build query (empty param table)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- err[m
[31m-empty input param table[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: build query (single param)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {'ping'}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*1\r\n$4\r\nping\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: build query (single param)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {'get', 'one', '\r\n'}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*3\r\n$3\r\nget\r\n$3\r\none\r\n$2\r\n\r\n\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: build query (empty param "")[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {''}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*1\r\n$0\r\n\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: build query (empty param "")[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {''}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*1\r\n$0\r\n\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: build query (nil param)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {parser.null}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*1\r\n$-1\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: build query (numeric param)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {'set', 'foo', 3.1415926}[m
[31m-local query = parser.build_query(q)[m
[31m-print("query == " .. cjson.encode(query))[m
[31m---- out[m
[31m-query == "*3\r\n$3\r\nset\r\n$3\r\nfoo\r\n$9\r\n3.1415926\r\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: multi bulk reply contains single line reply[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*5\r\n$1\r\na\r\n:1\r\n-Bad argument\r\n+32\r\n$3\r\nfoo\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == 5[m
[31m-res == ["a","1","Bad argument","32","foo"]\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: we allow left-over bytes[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*3\r\n$1\r\na\r\n:1\r\n-Bad argument\r\n+32\r\n$3\r\nfoo\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == 5[m
[31m-res == ["a","1","Bad argument"]\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: bug reported by James Hurst[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = "*3\r\n$9\r\nsubscribe\r\n$38\r\nledge:d1d0ed5f3251473795548ab392181d06\r\n:1\r\n*3\r\n$7\r\nmessage\r\n$38\r\nledge:d1d0ed5f3251473795548ab392181d06\r\n$8\r\nfinished\r\n"[m
[31m-resp = parser.parse_replies(reply, 2)[m
[31m-print("res == " .. cjson.encode(resp))[m
[31m---- out[m
[31m-res == [[["subscribe","ledge:d1d0ed5f3251473795548ab392181d06","1"],5],[["message","ledge:d1d0ed5f3251473795548ab392181d06","finished"],5]][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: bad typ[m
[31m---- lua[m
[31m-local parser = require "redis.parser"[m
[31m-print(parser.typename(-1))[m
[31m-print(parser.typename(6))[m
[31m---- out[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: empty multi bulk reply (0 bulk)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*0\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == multi-bulk reply == 5[m
[31m-res == \{\}\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: nil multi bulk reply (-1 bulk)[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-reply = '*-1\r\n'[m
[31m-res, typ = parser.parse_reply(reply)[m
[31m-print("typ == " .. typ .. ' == ' .. parser.typename(typ) .. ' == ' .. parser.MULTI_BULK_REPLY)[m
[31m-print("res == " .. cjson.encode(res))[m
[31m---- out eval[m
[31m-qq{typ == 5 == multi-bulk reply == 5[m
[31m-res == null\n}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: many query arguments[m
[31m---- lua[m
[31m-cjson = require('cjson')[m
[31m-parser = require("redis.parser")[m
[31m-q = {}[m
[31m-for i = 1,2048 do[m
[31m-    table.insert(q, "a")[m
[31m-end[m
[31m-local query = parser.build_query(q)[m
[31m-print(string.len(query))[m
[31m---- out[m
[31m-14343[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex 235794f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-redis-parser-0.12/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use t::RedisParser;[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no crlf in status reply[m
[31m---- lua[m
[31m-parser = require("redis.parser")[m
[31m-print(parser._VERSION)[m
[31m---- out[m
[31m-0.10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 834b53e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/core/[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/ngx/[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/[m
[31m-	$(INSTALL) lib/resty/core/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/core/[m
[31m-	$(INSTALL) lib/ngx/*.lua $(DESTDIR)$(LUA_LIB_DIR)/ngx/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/balancer.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/balancer.lua[m
[1mdeleted file mode 100644[m
[1mindex 2d24c13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/balancer.lua[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-local ffi_str = ffi.string[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local FFI_ERROR = base.FFI_ERROR[m
[31m-local int_out = ffi.new("int[1]")[m
[31m-local getfenv = getfenv[m
[31m-local error = error[m
[31m-local type = type[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int ngx_http_lua_ffi_balancer_set_current_peer(ngx_http_request_t *r,[m
[31m-    const unsigned char *addr, size_t addr_len, int port, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_balancer_set_more_tries(ngx_http_request_t *r,[m
[31m-    int count, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_balancer_get_last_failure(ngx_http_request_t *r,[m
[31m-    int *status, char **err);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local peer_state_names = {[m
[31m-    [1] = "keepalive",[m
[31m-    [2] = "next",[m
[31m-    [4] = "failed",[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local _M = { version = base.version }[m
[31m-[m
[31m-[m
[31m-function _M.set_current_peer(addr, port)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if not port then[m
[31m-        port = 0[m
[31m-    elseif type(port) ~= "number" then[m
[31m-        port = tonumber(port)[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_balancer_set_current_peer(r, addr, #addr,[m
[31m-                                                            port, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_more_tries(count)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_balancer_set_more_tries(r, count, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        if errmsg[0] == nil then[m
[31m-            return true[m
[31m-        end[m
[31m-        return true, ffi_str(errmsg[0])  -- return the warning[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_last_failure()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local state = C.ngx_http_lua_ffi_balancer_get_last_failure(r,[m
[31m-                                                               int_out,[m
[31m-                                                               errmsg)[m
[31m-[m
[31m-    if state == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if state == FFI_ERROR then[m
[31m-        return nil, nil, ffi_str(errmsg[0])[m
[31m-    end[m
[31m-[m
[31m-    return peer_state_names[state] or "unknown", int_out[0][m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/ocsp.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/ocsp.lua[m
[1mdeleted file mode 100644[m
[1mindex 495a2c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/ocsp.lua[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-local ffi_str = ffi.string[m
[31m-local getfenv = getfenv[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_string_buf_size = base.get_string_buf_size[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local FFI_BUSY = base.FFI_BUSY[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int ngx_http_lua_ffi_ssl_get_ocsp_responder_from_der_chain([m
[31m-    const char *chain_data, size_t chain_len, char *out, size_t *out_size,[m
[31m-    char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_create_ocsp_request(const char *chain_data,[m
[31m-    size_t chain_len, unsigned char *out, size_t *out_size, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_validate_ocsp_response(const unsigned char *resp,[m
[31m-    size_t resp_len, const char *chain_data, size_t chain_len,[m
[31m-    unsigned char *errbuf, size_t *errbuf_size);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_set_ocsp_status_resp(ngx_http_request_t *r,[m
[31m-    const unsigned char *resp, size_t resp_len, char **err);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local _M = { version = base.version }[m
[31m-[m
[31m-[m
[31m-function _M.get_ocsp_responder_from_der_chain(certs, maxlen)[m
[31m-[m
[31m-    local buf_size = maxlen[m
[31m-    if not buf_size then[m
[31m-        buf_size = get_string_buf_size()[m
[31m-    end[m
[31m-    local buf = get_string_buf(buf_size)[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-    sizep[0] = buf_size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_get_ocsp_responder_from_der_chain(certs,[m
[31m-                                                   #certs, buf, sizep, errmsg)[m
[31m-[m
[31m-    if rc == FFI_DECLINED then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_OK then[m
[31m-        return ffi_str(buf, sizep[0])[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BUSY then[m
[31m-        return ffi_str(buf, sizep[0]), "truncated"[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.create_ocsp_request(certs, maxlen)[m
[31m-[m
[31m-    local buf_size = maxlen[m
[31m-    if not buf_size then[m
[31m-        buf_size = get_string_buf_size()[m
[31m-    end[m
[31m-    local buf = get_string_buf(buf_size)[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-    sizep[0] = buf_size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_create_ocsp_request(certs,[m
[31m-                                                          #certs, buf, sizep,[m
[31m-                                                          errmsg)[m
[31m-[m
[31m-    if rc == FFI_OK then[m
[31m-        return ffi_str(buf, sizep[0])[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BUSY then[m
[31m-        return nil, ffi_str(errmsg[0]) .. ": " .. tonumber(sizep[0])[m
[31m-               .. " > " .. buf_size[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.validate_ocsp_response(resp, chain, max_errmsg_len)[m
[31m-[m
[31m-    local errbuf_size = max_errmsg_len[m
[31m-    if not errbuf_size then[m
[31m-        errbuf_size = get_string_buf_size()[m
[31m-    end[m
[31m-    local errbuf = get_string_buf(errbuf_size)[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-    sizep[0] = errbuf_size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_validate_ocsp_response([m
[31m-                        resp, #resp, chain, #chain, errbuf, sizep)[m
[31m-[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    -- rc == FFI_ERROR[m
[31m-[m
[31m-    return nil, ffi_str(errbuf, sizep[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_ocsp_status_resp(ocsp_resp)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_set_ocsp_status_resp(r, ocsp_resp,[m
[31m-                                                           #ocsp_resp,[m
[31m-                                                           errmsg)[m
[31m-[m
[31m-    if rc == FFI_DECLINED then[m
[31m-        -- no client status req[m
[31m-        return true, "no status req"[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    -- rc == FFI_ERROR[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/semaphore.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/semaphore.lua[m
[1mdeleted file mode 100644[m
[1mindex dc28c30..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/semaphore.lua[m
[1m+++ /dev/null[m
[36m@@ -1,150 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m--- Copyright (C) cuiweixie[m
[31m--- I hereby assign copyright in this code to the lua-resty-core project,[m
[31m--- to be licensed under the same terms as the rest of the code.[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local FFI_ERROR = base.FFI_ERROR[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local ffi_gc = ffi.gc[m
[31m-local C = ffi.C[m
[31m-local type = type[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-local getfenv = getfenv[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local setmetatable = setmetatable[m
[31m-local co_yield = coroutine._yield[m
[31m-local ERR_BUF_SIZE = 128[m
[31m-[m
[31m-[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    struct ngx_http_lua_sema_s;[m
[31m-    typedef struct ngx_http_lua_sema_s ngx_http_lua_sema_t;[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sema_new(ngx_http_lua_sema_t **psem,[m
[31m-        int n, char **errmsg);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sema_post(ngx_http_lua_sema_t *sem, int n);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sema_count(ngx_http_lua_sema_t *sem);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sema_wait(ngx_http_request_t *r,[m
[31m-        ngx_http_lua_sema_t *sem, int wait_ms,[m
[31m-        unsigned char *errstr, size_t *errlen);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_sema_gc(ngx_http_lua_sema_t *sem);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local psem = ffi_new("ngx_http_lua_sema_t *[1]")[m
[31m-[m
[31m-[m
[31m-local _M = { version = base.version }[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(n)[m
[31m-    n = tonumber(n) or 0[m
[31m-    if n < 0 then[m
[31m-        return error("no negative number")[m
[31m-    end[m
[31m-[m
[31m-    local ret = C.ngx_http_lua_ffi_sema_new(psem, n, errmsg)[m
[31m-    if ret == FFI_ERROR then[m
[31m-        return nil, ffi_str(errmsg[0])[m
[31m-    end[m
[31m-[m
[31m-    local sem = psem[0][m
[31m-[m
[31m-    ffi_gc(sem, C.ngx_http_lua_ffi_sema_gc)[m
[31m-[m
[31m-    return setmetatable({ sem = sem }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.wait(self, seconds)[m
[31m-    if type(self) ~= "table" or type(self.sem) ~= "cdata" then[m
[31m-        return error("not a semaphore instance")[m
[31m-    end[m
[31m-[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local milliseconds = tonumber(seconds) * 1000[m
[31m-    if milliseconds < 0 then[m
[31m-        return error("no negative number")[m
[31m-    end[m
[31m-[m
[31m-    local cdata_sem = self.sem[m
[31m-[m
[31m-    local err = get_string_buf(ERR_BUF_SIZE)[m
[31m-    local errlen = get_size_ptr()[m
[31m-    errlen[0] = ERR_BUF_SIZE[m
[31m-[m
[31m-    local ret = C.ngx_http_lua_ffi_sema_wait(r, cdata_sem,[m
[31m-                                             milliseconds, err, errlen)[m
[31m-[m
[31m-    if ret == FFI_ERROR then[m
[31m-        return nil, ffi_str(err, errlen[0])[m
[31m-    end[m
[31m-[m
[31m-    if ret == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    if ret == FFI_DECLINED then[m
[31m-        return nil, "timeout"[m
[31m-    end[m
[31m-[m
[31m-    -- Note: we cannot use the tail-call form here since we[m
[31m-    -- might need the current function call's activation[m
[31m-    -- record to hold the reference to our semaphore object[m
[31m-    -- to prevent it from getting GC'd prematurely.[m
[31m-    local ok, err = co_yield()[m
[31m-    return ok, err[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.post(self, n)[m
[31m-    if type(self) ~= "table" or type(self.sem) ~= "cdata" then[m
[31m-        return error("not a semaphore instance")[m
[31m-    end[m
[31m-[m
[31m-    local cdata_sem = self.sem[m
[31m-[m
[31m-    local num = n and tonumber(n) or 1[m
[31m-    if num < 1 then[m
[31m-        return error("no negative number")[m
[31m-    end[m
[31m-[m
[31m-    -- always return NGX_OK[m
[31m-    C.ngx_http_lua_ffi_sema_post(cdata_sem, num)[m
[31m-[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.count(self)[m
[31m-    if type(self) ~= "table" or type(self.sem) ~= "cdata" then[m
[31m-        return error("not a semaphore instance")[m
[31m-    end[m
[31m-[m
[31m-    return C.ngx_http_lua_ffi_sema_count(self.sem)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/ssl.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/ssl.lua[m
[1mdeleted file mode 100644[m
[1mindex 7224d3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/ngx/ssl.lua[m
[1m+++ /dev/null[m
[36m@@ -1,222 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-local ffi_str = ffi.string[m
[31m-local getfenv = getfenv[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-[m
[31m-struct ngx_ssl_conn_s;[m
[31m-typedef struct ngx_ssl_conn_s  ngx_ssl_conn_t;[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_set_der_certificate(ngx_http_request_t *r,[m
[31m-    const char *data, size_t len, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_clear_certs(ngx_http_request_t *r, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_set_der_private_key(ngx_http_request_t *r,[m
[31m-    const char *data, size_t len, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_raw_server_addr(ngx_http_request_t *r, char **addr,[m
[31m-    size_t *addrlen, int *addrtype, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_server_name(ngx_http_request_t *r, char **name,[m
[31m-    size_t *namelen, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem, size_t pem_len,[m
[31m-    unsigned char *der, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,[m
[31m-    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-int ngx_http_lua_ffi_ssl_get_tls1_version(ngx_http_request_t *r, char **err);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local _M = { version = base.version }[m
[31m-[m
[31m-[m
[31m-local charpp = ffi.new("char*[1]")[m
[31m-local intp = ffi.new("int[1]")[m
[31m-[m
[31m-[m
[31m-function _M.clear_certs()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_clear_certs(r, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_der_cert(data)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_set_der_certificate(r, data, #data,[m
[31m-                                                          errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_der_priv_key(data)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_set_der_private_key(r, data, #data,[m
[31m-                                                          errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local addr_types = {[m
[31m-    [0] = "unix",[m
[31m-    [1] = "inet",[m
[31m-    [2] = "inet6",[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function _M.raw_server_addr()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_raw_server_addr(r, charpp, sizep,[m
[31m-                                                      intp, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        local typ = addr_types[intp[0]][m
[31m-        if not typ then[m
[31m-            return nil, nil, "unknown address type: " .. intp[0][m
[31m-        end[m
[31m-        return ffi_str(charpp[0], sizep[0]), typ[m
[31m-    end[m
[31m-[m
[31m-    return nil, nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.server_name()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local sizep = get_size_ptr()[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_ssl_server_name(r, charpp, sizep, errmsg)[m
[31m-    if rc == FFI_OK then[m
[31m-        return ffi_str(charpp[0], sizep[0])[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_DECLINED then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.cert_pem_to_der(pem)[m
[31m-    local outbuf = get_string_buf(#pem)[m
[31m-[m
[31m-    local sz = C.ngx_http_lua_ffi_cert_pem_to_der(pem, #pem, outbuf, errmsg)[m
[31m-    if sz > 0 then[m
[31m-        return ffi_str(outbuf, sz)[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.priv_key_pem_to_der(pem)[m
[31m-    local outbuf = get_string_buf(#pem)[m
[31m-[m
[31m-    local sz = C.ngx_http_lua_ffi_priv_key_pem_to_der(pem, #pem, outbuf, errmsg)[m
[31m-    if sz > 0 then[m
[31m-        return ffi_str(outbuf, sz)[m
[31m-    end[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function get_tls1_version()[m
[31m-[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local ver = C.ngx_http_lua_ffi_ssl_get_tls1_version(r, errmsg)[m
[31m-[m
[31m-    ver = tonumber(ver)[m
[31m-[m
[31m-    if ver >= 0 then[m
[31m-        return ver[m
[31m-    end[m
[31m-[m
[31m-    -- rc == FFI_ERROR[m
[31m-[m
[31m-    return nil, ffi_str(errmsg[0])[m
[31m-end[m
[31m-_M.get_tls1_version = get_tls1_version[m
[31m-[m
[31m-[m
[31m-do[m
[31m-    _M.SSL3_VERSION = 0x0300[m
[31m-    _M.TLS1_VERSION = 0x0301[m
[31m-    _M.TLS1_1_VERSION = 0x0302[m
[31m-    _M.TLS1_2_VERSION = 0x0303[m
[31m-[m
[31m-    local map = {[m
[31m-        [_M.SSL3_VERSION] = "SSLv3",[m
[31m-        [_M.TLS1_VERSION] = "TLSv1",[m
[31m-        [_M.TLS1_1_VERSION] = "TLSv1.1",[m
[31m-        [_M.TLS1_2_VERSION] = "TLSv1.2",[m
[31m-    }[m
[31m-[m
[31m-    function _M.get_tls1_version_str()[m
[31m-        local ver, err = get_tls1_version()[m
[31m-        if not ver then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-        return map[ver][m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core.lua[m
[1mdeleted file mode 100644[m
[1mindex 71bb946..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core.lua[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-require "resty.core.uri"[m
[31m-require "resty.core.hash"[m
[31m-require "resty.core.base64"[m
[31m-require "resty.core.regex"[m
[31m-require "resty.core.exit"[m
[31m-require "resty.core.shdict"[m
[31m-require "resty.core.var"[m
[31m-require "resty.core.ctx"[m
[31m-require "resty.core.misc"[m
[31m-require "resty.core.request"[m
[31m-require "resty.core.response"[m
[31m-require "resty.core.time"[m
[31m-require "resty.core.worker"[m
[31m-[m
[31m-[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/base.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/base.lua[m
[1mdeleted file mode 100644[m
[1mindex ab97e73..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/base.lua[m
[1m+++ /dev/null[m
[36m@@ -1,187 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local ffi_new = ffi.new[m
[31m-local error = error[m
[31m-local setmetatable = setmetatable[m
[31m-local floor = math.floor[m
[31m-local ceil = math.ceil[m
[31m-[m
[31m-[m
[31m-local str_buf_size = 4096[m
[31m-local str_buf[m
[31m-local size_ptr[m
[31m-local FREE_LIST_REF = 0[m
[31m-[m
[31m-[m
[31m-if not ngx.config[m
[31m-   or not ngx.config.ngx_lua_version[m
[31m-   or ngx.config.ngx_lua_version < 10003[m
[31m-then[m
[31m-    error("ngx_lua 0.10.3+ required")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if string.find(jit.version, " 2.0") then[m
[31m-    ngx.log(ngx.WARN, "use of lua-resty-core with LuaJIT 2.0 is "[m
[31m-            .. "not recommended; use LuaJIT 2.1+ instead")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local ok, clear_tab = pcall(require, "table.clear")[m
[31m-if not ok then[m
[31m-    clear_tab = function (tab)[m
[31m-                    for k, _ in pairs(tab) do[m
[31m-                        tab[k] = nil[m
[31m-                    end[m
[31m-                end[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- XXX for now LuaJIT 2.1 cannot compile require()[m
[31m--- so we make the fast code path Lua only in our own[m
[31m--- wrapper so that most of the require() calls in hot[m
[31m--- Lua code paths can be JIT compiled.[m
[31m-do[m
[31m-    local orig_require = require[m
[31m-    local pkg_loaded = package.loaded[m
[31m-    local function my_require(name)[m
[31m-        local mod = pkg_loaded[name][m
[31m-        if mod then[m
[31m-            return mod[m
[31m-        end[m
[31m-        return orig_require(name)[m
[31m-    end[m
[31m-    getfenv(0).require = my_require[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if not pcall(ffi.typeof, "ngx_str_t") then[m
[31m-    ffi.cdef[[[m
[31m-        typedef struct {[m
[31m-            size_t                 len;[m
[31m-            const unsigned char   *data;[m
[31m-        } ngx_str_t;[m
[31m-    ]][m
[31m-end[m
[31m-[m
[31m-[m
[31m-if not pcall(ffi.typeof, "ngx_http_request_t") then[m
[31m-    ffi.cdef[[[m
[31m-        struct ngx_http_request_s;[m
[31m-        typedef struct ngx_http_request_s  ngx_http_request_t;[m
[31m-    ]][m
[31m-end[m
[31m-[m
[31m-[m
[31m-if not pcall(ffi.typeof, "ngx_http_lua_ffi_str_t") then[m
[31m-    ffi.cdef[[[m
[31m-        typedef struct {[m
[31m-            int                       len;[m
[31m-            const unsigned char      *data;[m
[31m-        } ngx_http_lua_ffi_str_t;[m
[31m-    ]][m
[31m-end[m
[31m-[m
[31m-[m
[31m-local c_buf_type = ffi.typeof("char[?]")[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 16)[m
[31m-[m
[31m-[m
[31m-_M.version = "0.1.6"[m
[31m-_M.new_tab = new_tab[m
[31m-_M.clear_tab = clear_tab[m
[31m-[m
[31m-[m
[31m-local errmsg[m
[31m-[m
[31m-[m
[31m-function _M.get_errmsg_ptr()[m
[31m-    if not errmsg then[m
[31m-        errmsg = ffi_new("char *[1]")[m
[31m-    end[m
[31m-    return errmsg[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if not ngx then[m
[31m-    return error("no existing ngx. table found")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_string_buf_size(size)[m
[31m-    if size <= 0 then[m
[31m-        return[m
[31m-    end[m
[31m-    if str_buf then[m
[31m-        str_buf = nil[m
[31m-    end[m
[31m-    str_buf_size = ceil(size)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_string_buf_size()[m
[31m-    return str_buf_size[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_size_ptr()[m
[31m-    if not size_ptr then[m
[31m-        size_ptr = ffi_new("size_t[1]")[m
[31m-    end[m
[31m-[m
[31m-    return size_ptr[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_string_buf(size, must_alloc)[m
[31m-    -- ngx.log(ngx.ERR, "str buf size: ", str_buf_size)[m
[31m-    if size > str_buf_size or must_alloc then[m
[31m-        return ffi_new(c_buf_type, size)[m
[31m-    end[m
[31m-[m
[31m-    if not str_buf then[m
[31m-        str_buf = ffi_new(c_buf_type, str_buf_size)[m
[31m-    end[m
[31m-[m
[31m-    return str_buf[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.ref_in_table(tb, key)[m
[31m-    if key == nil then[m
[31m-        return -1[m
[31m-    end[m
[31m-    local ref = tb[FREE_LIST_REF][m
[31m-    if ref and ref ~= 0 then[m
[31m-         tb[FREE_LIST_REF] = tb[ref][m
[31m-[m
[31m-    else[m
[31m-        ref = #tb + 1[m
[31m-    end[m
[31m-    tb[ref] = key[m
[31m-[m
[31m-    -- print("ref key_id returned ", ref)[m
[31m-    return ref[m
[31m-end[m
[31m-[m
[31m-[m
[31m-_M.FFI_OK = 0[m
[31m-_M.FFI_NO_REQ_CTX = -100[m
[31m-_M.FFI_BAD_CONTEXT = -101[m
[31m-_M.FFI_ERROR = -1[m
[31m-_M.FFI_BUSY = -3[m
[31m-_M.FFI_DONE = -4[m
[31m-_M.FFI_DECLINED = -5[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/base64.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/base64.lua[m
[1mdeleted file mode 100644[m
[1mindex 83c0bf3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/base64.lua[m
[1m+++ /dev/null[m
[36m@@ -1,90 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-local ffi_string = ffi.string[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local error = error[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local floor = math.floor[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    size_t ngx_http_lua_ffi_encode_base64(const unsigned char *src,[m
[31m-                                          size_t len, unsigned char *dst,[m
[31m-                                          int no_padding);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_decode_base64(const unsigned char *src,[m
[31m-                                       size_t len, unsigned char *dst,[m
[31m-                                       size_t *dlen);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local function base64_encoded_length(len, no_padding)[m
[31m-    return no_padding and floor((len * 8 + 5) / 6) or[m
[31m-           floor((len + 2) / 3) * 4[m
[31m-end[m
[31m-[m
[31m-[m
[31m-ngx.encode_base64 = function (s, no_padding)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local slen = #s[m
[31m-    local no_padding_bool = false;[m
[31m-    local no_padding_int = 0;[m
[31m-[m
[31m-    if no_padding then[m
[31m-        if no_padding ~= true then[m
[31m-            return error("boolean argument only")[m
[31m-        end[m
[31m-[m
[31m-        no_padding_bool = true[m
[31m-        no_padding_int  = 1;[m
[31m-    end[m
[31m-[m
[31m-    local dlen = base64_encoded_length(slen, no_padding_bool)[m
[31m-    local dst = get_string_buf(dlen)[m
[31m-    local r_dlen = C.ngx_http_lua_ffi_encode_base64(s, slen, dst,[m
[31m-                                                    no_padding_int)[m
[31m-    -- if dlen ~= r_dlen then error("discrepancy in len") end[m
[31m-    return ffi_string(dst, r_dlen)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function base64_decoded_length(len)[m
[31m-    return floor((len + 3) / 4) * 3[m
[31m-end[m
[31m-[m
[31m-[m
[31m-ngx.decode_base64 = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        return error("string argument only")[m
[31m-    end[m
[31m-    local slen = #s[m
[31m-    local dlen = base64_decoded_length(slen)[m
[31m-    -- print("dlen: ", tonumber(dlen))[m
[31m-    local dst = get_string_buf(dlen)[m
[31m-    local pdlen = get_size_ptr()[m
[31m-    local ok = C.ngx_http_lua_ffi_decode_base64(s, slen, dst, pdlen)[m
[31m-    if ok == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-    return ffi_string(dst, pdlen[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/ctx.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/ctx.lua[m
[1mdeleted file mode 100644[m
[1mindex c75261f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/ctx.lua[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local debug = require 'debug'[m
[31m-local base = require "resty.core.base"[m
[31m-local misc = require "resty.core.misc"[m
[31m-[m
[31m-[m
[31m-local register_getter = misc.register_ngx_magic_key_getter[m
[31m-local register_setter = misc.register_ngx_magic_key_setter[m
[31m-local registry = debug.getregistry()[m
[31m-local new_tab = base.new_tab[m
[31m-local ref_in_table = base.ref_in_table[m
[31m-local getfenv = getfenv[m
[31m-local C = ffi.C[m
[31m-local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int ngx_http_lua_ffi_get_ctx_ref(ngx_http_request_t *r);[m
[31m-int ngx_http_lua_ffi_set_ctx_ref(ngx_http_request_t *r, int ref);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = base.version[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local function get_ctx_table()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local ctx_ref = C.ngx_http_lua_ffi_get_ctx_ref(r)[m
[31m-    if ctx_ref == FFI_NO_REQ_CTX then[m
[31m-        return error("no request ctx found")[m
[31m-    end[m
[31m-[m
[31m-    local ctxs = registry.ngx_lua_ctx_tables[m
[31m-    if ctx_ref < 0 then[m
[31m-        local ctx = new_tab(0, 4)[m
[31m-        ctx_ref = ref_in_table(ctxs, ctx)[m
[31m-        if C.ngx_http_lua_ffi_set_ctx_ref(r, ctx_ref) ~= FFI_OK then[m
[31m-            return nil[m
[31m-        end[m
[31m-        return ctx[m
[31m-    end[m
[31m-    return ctxs[ctx_ref][m
[31m-end[m
[31m-register_getter("ctx", get_ctx_table)[m
[31m-[m
[31m-[m
[31m-local function set_ctx_table(ctx)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local ctx_ref = C.ngx_http_lua_ffi_get_ctx_ref(r)[m
[31m-    if ctx_ref == FFI_NO_REQ_CTX then[m
[31m-        return error("no request ctx found")[m
[31m-    end[m
[31m-[m
[31m-    local ctxs = registry.ngx_lua_ctx_tables[m
[31m-    if ctx_ref < 0 then[m
[31m-        ctx_ref = ref_in_table(ctxs, ctx)[m
[31m-        C.ngx_http_lua_ffi_set_ctx_ref(r, ctx_ref)[m
[31m-        return[m
[31m-    end[m
[31m-    ctxs[ctx_ref] = ctx[m
[31m-end[m
[31m-register_setter("ctx", set_ctx_table)[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/exit.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/exit.lua[m
[1mdeleted file mode 100644[m
[1mindex 10cbc07..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/exit.lua[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local ffi_string = ffi.string[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-local error = error[m
[31m-local base = require "resty.core.base"[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local base = require "resty.core.base"[m
[31m-local getfenv = getfenv[m
[31m-local co_yield = coroutine._yield[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_exit(ngx_http_request_t *r, int status,[m
[31m-                               unsigned char *err, size_t *errlen);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local ERR_BUF_SIZE = 128[m
[31m-local FFI_DONE = base.FFI_DONE[m
[31m-[m
[31m-[m
[31m-ngx.exit = function (rc)[m
[31m-    local err = get_string_buf(ERR_BUF_SIZE)[m
[31m-    local errlen = get_size_ptr()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if r == nil then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-    errlen[0] = ERR_BUF_SIZE[m
[31m-    local rc = C.ngx_http_lua_ffi_exit(r, rc, err, errlen)[m
[31m-    if rc == 0 then[m
[31m-        -- print("yielding...")[m
[31m-        return co_yield()[m
[31m-    end[m
[31m-    if rc == FFI_DONE then[m
[31m-        return[m
[31m-    end[m
[31m-    return error(ffi_string(err, errlen[0]))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/hash.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/hash.lua[m
[1mdeleted file mode 100644[m
[1mindex 79c934a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/hash.lua[m
[1m+++ /dev/null[m
[36m@@ -1,80 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local ffi_string = ffi.string[m
[31m-local ffi_new = ffi.new[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local error = error[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    void ngx_http_lua_ffi_md5_bin(const unsigned char *src, size_t len,[m
[31m-                                  unsigned char *dst);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_md5(const unsigned char *src, size_t len,[m
[31m-                              unsigned char *dst);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_sha1_bin(const unsigned char *src, size_t len,[m
[31m-                                  unsigned char *dst);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local MD5_DIGEST_LEN = 16[m
[31m-local md5_buf = ffi_new("unsigned char[?]", MD5_DIGEST_LEN)[m
[31m-[m
[31m-ngx.md5_bin = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    C.ngx_http_lua_ffi_md5_bin(s, #s, md5_buf)[m
[31m-    return ffi_string(md5_buf, MD5_DIGEST_LEN)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local MD5_HEX_DIGEST_LEN = MD5_DIGEST_LEN * 2[m
[31m-local md5_hex_buf = ffi_new("unsigned char[?]", MD5_HEX_DIGEST_LEN)[m
[31m-[m
[31m-ngx.md5 = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    C.ngx_http_lua_ffi_md5(s, #s, md5_hex_buf)[m
[31m-    return ffi_string(md5_hex_buf, MD5_HEX_DIGEST_LEN)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local SHA_DIGEST_LEN = 20[m
[31m-local sha_buf = ffi_new("unsigned char[?]", SHA_DIGEST_LEN)[m
[31m-[m
[31m-ngx.sha1_bin = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    local ok = C.ngx_http_lua_ffi_sha1_bin(s, #s, sha_buf)[m
[31m-    if ok == 0 then[m
[31m-        return error("SHA-1 support missing in Nginx")[m
[31m-    end[m
[31m-    return ffi_string(sha_buf, SHA_DIGEST_LEN)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/misc.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/misc.lua[m
[1mdeleted file mode 100644[m
[1mindex 5b7a690..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/misc.lua[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local base = require "resty.core.base"[m
[31m-local ffi = require "ffi"[m
[31m-[m
[31m-[m
[31m-local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX[m
[31m-local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT[m
[31m-local new_tab = base.new_tab[m
[31m-local C = ffi.C[m
[31m-local getmetatable = getmetatable[m
[31m-local ngx_magic_key_getters = new_tab(0, 4)[m
[31m-local ngx_magic_key_setters = new_tab(0, 2)[m
[31m-local ngx = ngx[m
[31m-local getfenv = getfenv[m
[31m-local type = type[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 3)[m
[31m-_M._VERSION = base.version[m
[31m-[m
[31m-[m
[31m-local function register_getter(key, func)[m
[31m-    ngx_magic_key_getters[key] = func[m
[31m-end[m
[31m-_M.register_ngx_magic_key_getter = register_getter[m
[31m-[m
[31m-[m
[31m-local function register_setter(key, func)[m
[31m-    ngx_magic_key_setters[key] = func[m
[31m-end[m
[31m-_M.register_ngx_magic_key_setter = register_setter[m
[31m-[m
[31m-[m
[31m-local mt = getmetatable(ngx)[m
[31m-[m
[31m-[m
[31m-local old_index = mt.__index[m
[31m-mt.__index = function (tb, key)[m
[31m-    local f = ngx_magic_key_getters[key][m
[31m-    if f then[m
[31m-        return f()[m
[31m-    end[m
[31m-    return old_index(tb, key)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local old_newindex = mt.__newindex[m
[31m-mt.__newindex = function (tb, key, ctx)[m
[31m-    local f = ngx_magic_key_setters[key][m
[31m-    if f then[m
[31m-        return f(ctx)[m
[31m-    end[m
[31m-    return old_newindex(tb, key, ctx)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_get_resp_status(ngx_http_request_t *r);[m
[31m-    int ngx_http_lua_ffi_set_resp_status(ngx_http_request_t *r, int r);[m
[31m-    int ngx_http_lua_ffi_is_subrequest(ngx_http_request_t *r);[m
[31m-    int ngx_http_lua_ffi_headers_sent(ngx_http_request_t *r);[m
[31m-]][m
[31m-[m
[31m-[m
[31m--- ngx.status[m
[31m-[m
[31m-local function get_status()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_get_resp_status(r)[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return rc[m
[31m-end[m
[31m-register_getter("status", get_status)[m
[31m-[m
[31m-[m
[31m-local function set_status(status)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(status) ~= 'number' then[m
[31m-        status = tonumber(status)[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_set_resp_status(r, status)[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return[m
[31m-end[m
[31m-register_setter("status", set_status)[m
[31m-[m
[31m-[m
[31m--- ngx.is_subrequest[m
[31m-[m
[31m-local function is_subreq()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_is_subrequest(r)[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return rc == 1 and true or false[m
[31m-end[m
[31m-register_getter("is_subrequest", is_subreq)[m
[31m-[m
[31m-[m
[31m--- ngx.headers_sent[m
[31m-[m
[31m-local function headers_sent()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_headers_sent(r)[m
[31m-[m
[31m-    if rc == FFI_NO_REQ_CTX then[m
[31m-        return error("no request ctx found")[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return rc == 1[m
[31m-end[m
[31m-register_getter("headers_sent", headers_sent)[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/regex.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/regex.lua[m
[1mdeleted file mode 100644[m
[1mindex b469159..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/regex.lua[m
[1m+++ /dev/null[m
[36m@@ -1,862 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-local bit = require "bit"[m
[31m-require "resty.core.time"  -- for ngx.now used by resty.lrucache[m
[31m-local lrucache = require "resty.lrucache"[m
[31m-[m
[31m-local lrucache_get = lrucache.get[m
[31m-local lrucache_set = lrucache.set[m
[31m-local ffi_string = ffi.string[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_gc = ffi.gc[m
[31m-local ffi_copy = ffi.copy[m
[31m-local ffi_cast = ffi.cast[m
[31m-local C = ffi.C[m
[31m-local bor = bit.bor[m
[31m-local band = bit.band[m
[31m-local lshift = bit.lshift[m
[31m-local sub = string.sub[m
[31m-local fmt = string.format[m
[31m-local byte = string.byte[m
[31m-local setmetatable = setmetatable[m
[31m-local concat = table.concat[m
[31m-local ngx = ngx[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local error = error[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_string_buf_size = base.get_string_buf_size[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local new_tab = base.new_tab[m
[31m-local floor = math.floor[m
[31m-local print = print[m
[31m-local tonumber = tonumber[m
[31m-local ngx_log = ngx.log[m
[31m-local ngx_ERR = ngx.ERR[m
[31m-[m
[31m-[m
[31m-if not ngx.re then[m
[31m-    ngx.re = {}[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local MAX_ERR_MSG_LEN = 128[m
[31m-[m
[31m-[m
[31m-local FLAG_COMPILE_ONCE  = 0x01[m
[31m-local FLAG_DFA           = 0x02[m
[31m-local FLAG_JIT           = 0x04[m
[31m-local FLAG_DUPNAMES      = 0x08[m
[31m-local FLAG_NO_UTF8_CHECK = 0x10[m
[31m-[m
[31m-[m
[31m-local PCRE_CASELESS          = 0x0000001[m
[31m-local PCRE_MULTILINE         = 0x0000002[m
[31m-local PCRE_DOTALL            = 0x0000004[m
[31m-local PCRE_EXTENDED          = 0x0000008[m
[31m-local PCRE_ANCHORED          = 0x0000010[m
[31m-local PCRE_UTF8              = 0x0000800[m
[31m-local PCRE_DUPNAMES          = 0x0080000[m
[31m-local PCRE_JAVASCRIPT_COMPAT = 0x2000000[m
[31m-[m
[31m-[m
[31m-local PCRE_ERROR_NOMATCH = -1[m
[31m-[m
[31m-[m
[31m-local regex_match_cache[m
[31m-local regex_sub_func_cache = new_tab(0, 4)[m
[31m-local regex_sub_str_cache = new_tab(0, 4)[m
[31m-local max_regex_cache_size[m
[31m-local regex_cache_size = 0[m
[31m-local script_engine[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    typedef struct {[m
[31m-        ngx_str_t                   value;[m
[31m-        void                       *lengths;[m
[31m-        void                       *values;[m
[31m-    } ngx_http_lua_complex_value_t;[m
[31m-[m
[31m-    typedef struct {[m
[31m-        void                         *pool;[m
[31m-        unsigned char                *name_table;[m
[31m-        int                           name_count;[m
[31m-        int                           name_entry_size;[m
[31m-[m
[31m-        int                           ncaptures;[m
[31m-        int                          *captures;[m
[31m-[m
[31m-        void                         *regex;[m
[31m-        void                         *regex_sd;[m
[31m-[m
[31m-        ngx_http_lua_complex_value_t *replace;[m
[31m-[m
[31m-        const char                   *pattern;[m
[31m-    } ngx_http_lua_regex_t;[m
[31m-[m
[31m-    ngx_http_lua_regex_t *[m
[31m-        ngx_http_lua_ffi_compile_regex(const unsigned char *pat,[m
[31m-            size_t pat_len, int flags,[m
[31m-            int pcre_opts, unsigned char *errstr,[m
[31m-            size_t errstr_size);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_exec_regex(ngx_http_lua_regex_t *re, int flags,[m
[31m-        const unsigned char *s, size_t len, int pos);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_destroy_regex(ngx_http_lua_regex_t *re);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_compile_replace_template(ngx_http_lua_regex_t *re,[m
[31m-                                                  const unsigned char[m
[31m-                                                  *replace_data,[m
[31m-                                                  size_t replace_len);[m
[31m-[m
[31m-    struct ngx_http_lua_script_engine_s;[m
[31m-    typedef struct ngx_http_lua_script_engine_s  *ngx_http_lua_script_engine_t;[m
[31m-[m
[31m-    ngx_http_lua_script_engine_t *ngx_http_lua_ffi_create_script_engine(void);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_init_script_engine(ngx_http_lua_script_engine_t *e,[m
[31m-                                             const unsigned char *subj,[m
[31m-                                             ngx_http_lua_regex_t *compiled,[m
[31m-                                             int count);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_destroy_script_engine([m
[31m-        ngx_http_lua_script_engine_t *e);[m
[31m-[m
[31m-    size_t ngx_http_lua_ffi_script_eval_len(ngx_http_lua_script_engine_t *e,[m
[31m-                                            ngx_http_lua_complex_value_t *cv);[m
[31m-[m
[31m-    size_t ngx_http_lua_ffi_script_eval_data(ngx_http_lua_script_engine_t *e,[m
[31m-                                             ngx_http_lua_complex_value_t *cv,[m
[31m-                                             unsigned char *dst);[m
[31m-[m
[31m-    uint32_t ngx_http_lua_ffi_max_regex_cache_size(void);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local c_str_type = ffi.typeof("const char *")[m
[31m-[m
[31m-local cached_re_opts = new_tab(0, 4)[m
[31m-[m
[31m-local _M = {[m
[31m-    version = base.version[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local buf_grow_ratio = 2[m
[31m-[m
[31m-function _M.set_buf_grow_ratio(ratio)[m
[31m-    buf_grow_ratio = ratio[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function get_max_regex_cache_size()[m
[31m-    if max_regex_cache_size then[m
[31m-        return max_regex_cache_size[m
[31m-    end[m
[31m-    max_regex_cache_size = C.ngx_http_lua_ffi_max_regex_cache_size()[m
[31m-    return max_regex_cache_size[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function parse_regex_opts(opts)[m
[31m-    local t = cached_re_opts[opts][m
[31m-    if t then[m
[31m-        return t[1], t[2][m
[31m-    end[m
[31m-[m
[31m-    local flags = 0[m
[31m-    local pcre_opts = 0[m
[31m-    local len = #opts[m
[31m-[m
[31m-    for i = 1, len do[m
[31m-        local opt = byte(opts, i)[m
[31m-        if opt == byte("o") then[m
[31m-            flags = bor(flags, FLAG_COMPILE_ONCE)[m
[31m-[m
[31m-        elseif opt == byte("j") then[m
[31m-            flags = bor(flags, FLAG_JIT)[m
[31m-[m
[31m-        elseif opt == byte("i") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_CASELESS)[m
[31m-[m
[31m-        elseif opt == byte("s") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_DOTALL)[m
[31m-[m
[31m-        elseif opt == byte("m") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_MULTILINE)[m
[31m-[m
[31m-        elseif opt == byte("u") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_UTF8)[m
[31m-[m
[31m-        elseif opt == byte("U") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_UTF8)[m
[31m-            flags = bor(flags, FLAG_NO_UTF8_CHECK)[m
[31m-[m
[31m-        elseif opt == byte("x") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_EXTENDED)[m
[31m-[m
[31m-        elseif opt == byte("d") then[m
[31m-            flags = bor(flags, FLAG_DFA)[m
[31m-[m
[31m-        elseif opt == byte("a") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_ANCHORED)[m
[31m-[m
[31m-        elseif opt == byte("D") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_DUPNAMES)[m
[31m-            flags = bor(flags, FLAG_DUPNAMES)[m
[31m-[m
[31m-        elseif opt == byte("J") then[m
[31m-            pcre_opts = bor(pcre_opts, PCRE_JAVASCRIPT_COMPAT)[m
[31m-[m
[31m-        else[m
[31m-            return error(fmt('unknown flag "%s" (flags "%s")',[m
[31m-                             sub(opts, i, i), opts))[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    cached_re_opts[opts] = {flags, pcre_opts}[m
[31m-    return flags, pcre_opts[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function collect_named_captures(compiled, flags, res)[m
[31m-    local name_count = compiled.name_count[m
[31m-    local name_table = compiled.name_table[m
[31m-    local entry_size = compiled.name_entry_size[m
[31m-[m
[31m-    local ind = 0[m
[31m-    local dup_names = (band(flags, FLAG_DUPNAMES) ~= 0)[m
[31m-    for i = 1, name_count do[m
[31m-        local n = bor(lshift(name_table[ind], 8), name_table[ind + 1])[m
[31m-        -- ngx.say("n = ", n)[m
[31m-        local name = ffi_string(name_table + ind + 2)[m
[31m-        local cap = res[n][m
[31m-        if dup_names then[m
[31m-            -- unmatched captures (false) are not collected[m
[31m-            if cap then[m
[31m-                local old = res[name][m
[31m-                if old then[m
[31m-                    old[#old + 1] = cap[m
[31m-                else[m
[31m-                    res[name] = {cap}[m
[31m-                end[m
[31m-            end[m
[31m-        else[m
[31m-            res[name] = cap[m
[31m-        end[m
[31m-[m
[31m-        ind = ind + entry_size[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function collect_captures(compiled, rc, subj, flags, res)[m
[31m-    local cap = compiled.captures[m
[31m-    local ncap = compiled.ncaptures[m
[31m-    local name_count = compiled.name_count[m
[31m-[m
[31m-    if not res then[m
[31m-        res = new_tab(ncap, name_count)[m
[31m-    end[m
[31m-[m
[31m-    local i = 0[m
[31m-    local n = 0[m
[31m-    while i <= ncap do[m
[31m-        if i > rc then[m
[31m-            res[i] = false[m
[31m-        else[m
[31m-            local from = cap[n][m
[31m-            if from >= 0 then[m
[31m-                local to = cap[n + 1][m
[31m-                res[i] = sub(subj, from + 1, to)[m
[31m-            else[m
[31m-                res[i] = false[m
[31m-            end[m
[31m-        end[m
[31m-        i = i + 1[m
[31m-        n = n + 2[m
[31m-    end[m
[31m-[m
[31m-    if name_count > 0 then[m
[31m-        collect_named_captures(compiled, flags, res)[m
[31m-    end[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function destroy_compiled_regex(compiled)[m
[31m-    C.ngx_http_lua_ffi_destroy_regex(ffi_gc(compiled, nil))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_match_compile(regex, opts)[m
[31m-    local flags = 0[m
[31m-    local pcre_opts = 0[m
[31m-[m
[31m-    if opts then[m
[31m-        flags, pcre_opts = parse_regex_opts(opts)[m
[31m-    else[m
[31m-        opts = ""[m
[31m-    end[m
[31m-[m
[31m-    local compiled, key[m
[31m-    local compile_once = (band(flags, FLAG_COMPILE_ONCE) == 1)[m
[31m-[m
[31m-    -- FIXME: better put this in the outer scope when fixing the ngx.re API's[m
[31m-    -- compatibility in the init_by_lua* context.[m
[31m-    if not regex_match_cache then[m
[31m-        local sz = get_max_regex_cache_size()[m
[31m-        if sz <= 0 then[m
[31m-            compile_once = false[m
[31m-        else[m
[31m-            regex_match_cache = lrucache.new(sz)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if compile_once then[m
[31m-        key = regex .. '\0' .. opts[m
[31m-        compiled = lrucache_get(regex_match_cache, key)[m
[31m-    end[m
[31m-[m
[31m-    -- compile the regex[m
[31m-[m
[31m-    if compiled == nil then[m
[31m-        -- print("compiled regex not found, compiling regex...")[m
[31m-        local errbuf = get_string_buf(MAX_ERR_MSG_LEN)[m
[31m-[m
[31m-        compiled = C.ngx_http_lua_ffi_compile_regex(regex, #regex,[m
[31m-                                                    flags, pcre_opts,[m
[31m-                                                    errbuf, MAX_ERR_MSG_LEN)[m
[31m-[m
[31m-        if compiled == nil then[m
[31m-            return nil, ffi_string(errbuf)[m
[31m-        end[m
[31m-[m
[31m-        ffi_gc(compiled, C.ngx_http_lua_ffi_destroy_regex)[m
[31m-[m
[31m-        -- print("ncaptures: ", compiled.ncaptures)[m
[31m-[m
[31m-        if compile_once then[m
[31m-            -- print("inserting compiled regex into cache")[m
[31m-            lrucache_set(regex_match_cache, key, compiled)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return compiled, compile_once, flags[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_match_helper(subj, regex, opts, ctx, want_caps, res, nth)[m
[31m-    -- we need to cast this to strings to avoid exceptions when they are[m
[31m-    -- something else.[m
[31m-    subj  = tostring(subj)[m
[31m-[m
[31m-    local compiled, compile_once, flags = re_match_compile(regex, opts)[m
[31m-    if compiled == nil then[m
[31m-        -- compiled_once holds the error string[m
[31m-        if not want_caps then[m
[31m-            return nil, nil, compile_once[m
[31m-        end[m
[31m-        return nil, compile_once[m
[31m-    end[m
[31m-[m
[31m-    -- exec the compiled regex[m
[31m-[m
[31m-    local rc[m
[31m-    do[m
[31m-        local pos[m
[31m-        if ctx then[m
[31m-            pos = ctx.pos[m
[31m-            if not pos or pos <= 0 then[m
[31m-                pos = 0[m
[31m-            else[m
[31m-                pos = pos - 1[m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            pos = 0[m
[31m-        end[m
[31m-[m
[31m-        rc = C.ngx_http_lua_ffi_exec_regex(compiled, flags, subj, #subj, pos)[m
[31m-    end[m
[31m-[m
[31m-    if rc == PCRE_ERROR_NOMATCH then[m
[31m-        if not compile_once then[m
[31m-            destroy_compiled_regex(compiled)[m
[31m-        end[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if rc < 0 then[m
[31m-        if not compile_once then[m
[31m-            destroy_compiled_regex(compiled)[m
[31m-        end[m
[31m-        if not want_caps then[m
[31m-            return nil, nil, "pcre_exec() failed: " .. rc[m
[31m-        end[m
[31m-        return nil, "pcre_exec() failed: " .. rc[m
[31m-    end[m
[31m-[m
[31m-    if rc == 0 then[m
[31m-        if band(flags, FLAG_DFA) == 0 then[m
[31m-            if not want_caps then[m
[31m-                return nil, nil, "capture size too small"[m
[31m-            end[m
[31m-            return nil, "capture size too small"[m
[31m-        end[m
[31m-[m
[31m-        rc = 1[m
[31m-    end[m
[31m-[m
[31m-    -- print("cap 0: ", compiled.captures[0])[m
[31m-    -- print("cap 1: ", compiled.captures[1])[m
[31m-[m
[31m-    if ctx then[m
[31m-        ctx.pos = compiled.captures[1] + 1[m
[31m-    end[m
[31m-[m
[31m-    if not want_caps then[m
[31m-        if not nth or nth < 0 then[m
[31m-            nth = 0[m
[31m-        end[m
[31m-[m
[31m-        if nth > compiled.ncaptures then[m
[31m-            return nil, nil, "nth out of bound"[m
[31m-        end[m
[31m-[m
[31m-        if nth >= rc then[m
[31m-            return nil, nil[m
[31m-        end[m
[31m-[m
[31m-        local from = compiled.captures[nth * 2] + 1[m
[31m-        local to = compiled.captures[nth * 2 + 1][m
[31m-[m
[31m-        if from < 0 or to < 0 then[m
[31m-            return nil, nil[m
[31m-        end[m
[31m-[m
[31m-        return from, to[m
[31m-    end[m
[31m-[m
[31m-    res = collect_captures(compiled, rc, subj, flags, res)[m
[31m-[m
[31m-    if not compile_once then[m
[31m-        destroy_compiled_regex(compiled)[m
[31m-    end[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.re.match(subj, regex, opts, ctx, res)[m
[31m-    return re_match_helper(subj, regex, opts, ctx, true, res)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.re.find(subj, regex, opts, ctx, nth)[m
[31m-    return re_match_helper(subj, regex, opts, ctx, false, nil, nth)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function new_script_engine(subj, compiled, count)[m
[31m-    if not script_engine then[m
[31m-        script_engine = C.ngx_http_lua_ffi_create_script_engine()[m
[31m-        if script_engine == nil then[m
[31m-            return nil[m
[31m-        end[m
[31m-        ffi_gc(script_engine, C.ngx_http_lua_ffi_destroy_script_engine)[m
[31m-    end[m
[31m-[m
[31m-    C.ngx_http_lua_ffi_init_script_engine(script_engine, subj, compiled,[m
[31m-                                          count)[m
[31m-    return script_engine[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function check_buf_size(buf, buf_size, pos, len, new_len, must_alloc)[m
[31m-    if new_len > buf_size then[m
[31m-        buf_size = buf_size * buf_grow_ratio[m
[31m-        if buf_size < new_len then[m
[31m-            buf_size = new_len[m
[31m-        end[m
[31m-        local new_buf = get_string_buf(buf_size, must_alloc)[m
[31m-        ffi_copy(new_buf, buf, len)[m
[31m-        buf = new_buf[m
[31m-        pos = buf + len[m
[31m-    end[m
[31m-    return buf, buf_size, pos, new_len[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_sub_compile(regex, opts, replace, func)[m
[31m-    local flags = 0[m
[31m-    local pcre_opts = 0[m
[31m-[m
[31m-    if opts then[m
[31m-        flags, pcre_opts = parse_regex_opts(opts)[m
[31m-    else[m
[31m-        opts = ""[m
[31m-    end[m
[31m-[m
[31m-    local compiled[m
[31m-    local compile_once = (band(flags, FLAG_COMPILE_ONCE) == 1)[m
[31m-    if compile_once then[m
[31m-        if func then[m
[31m-            local subcache = regex_sub_func_cache[opts][m
[31m-            if subcache then[m
[31m-                -- print("cache hit!")[m
[31m-                compiled = subcache[regex][m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            local subcache = regex_sub_str_cache[opts][m
[31m-            if subcache then[m
[31m-                local subsubcache = subcache[regex][m
[31m-                if subsubcache then[m
[31m-                    -- print("cache hit!")[m
[31m-                    compiled = subsubcache[replace][m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- compile the regex[m
[31m-[m
[31m-    if compiled == nil then[m
[31m-        -- print("compiled regex not found, compiling regex...")[m
[31m-        local errbuf = get_string_buf(MAX_ERR_MSG_LEN)[m
[31m-[m
[31m-        compiled = C.ngx_http_lua_ffi_compile_regex(regex, #regex, flags,[m
[31m-                                                    pcre_opts, errbuf,[m
[31m-                                                    MAX_ERR_MSG_LEN)[m
[31m-[m
[31m-        if compiled == nil then[m
[31m-            return nil, ffi_string(errbuf)[m
[31m-        end[m
[31m-[m
[31m-        ffi_gc(compiled, C.ngx_http_lua_ffi_destroy_regex)[m
[31m-[m
[31m-        if func == nil then[m
[31m-            local rc =[m
[31m-                C.ngx_http_lua_ffi_compile_replace_template(compiled,[m
[31m-                                                            replace, #replace)[m
[31m-            if rc ~= 0 then[m
[31m-                if not compile_once then[m
[31m-                    destroy_compiled_regex(compiled)[m
[31m-                end[m
[31m-                return nil, "failed to compile the replacement template"[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        -- print("ncaptures: ", compiled.ncaptures)[m
[31m-[m
[31m-        if compile_once then[m
[31m-            if regex_cache_size < get_max_regex_cache_size() then[m
[31m-                -- print("inserting compiled regex into cache")[m
[31m-                if func then[m
[31m-                    local subcache = regex_sub_func_cache[opts][m
[31m-                    if not subcache then[m
[31m-                        regex_sub_func_cache[opts] = {[regex] = compiled}[m
[31m-[m
[31m-                    else[m
[31m-                        subcache[regex] = compiled[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    local subcache = regex_sub_str_cache[opts][m
[31m-                    if not subcache then[m
[31m-                        regex_sub_str_cache[opts] =[m
[31m-                            {[regex] = {[replace] = compiled}}[m
[31m-[m
[31m-                    else[m
[31m-                        local subsubcache = subcache[regex][m
[31m-                        if not subsubcache then[m
[31m-                            subcache[regex] = {[replace] = compiled}[m
[31m-[m
[31m-                        else[m
[31m-                            subsubcache[replace] = compiled[m
[31m-                        end[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                regex_cache_size = regex_cache_size + 1[m
[31m-            else[m
[31m-                compile_once = false[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return compiled, compile_once, flags[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_sub_func_helper(subj, regex, replace, opts, global)[m
[31m-    local compiled, compile_once, flags =[m
[31m-                                    re_sub_compile(regex, opts, nil, replace)[m
[31m-    if not compiled then[m
[31m-        -- error string is in compile_once[m
[31m-        return nil, nil, compile_once[m
[31m-    end[m
[31m-[m
[31m-    -- exec the compiled regex[m
[31m-[m
[31m-    subj = tostring(subj)[m
[31m-    local subj_len = #subj[m
[31m-    local count = 0[m
[31m-    local pos = 0[m
[31m-    local cp_pos = 0[m
[31m-[m
[31m-    local dst_buf_size = get_string_buf_size()[m
[31m-    -- Note: we have to always allocate the string buffer because[m
[31m-    -- the user might call whatever resty.core's API functions recursively[m
[31m-    -- in the user callback function.[m
[31m-    local dst_buf = get_string_buf(dst_buf_size, true)[m
[31m-    local dst_pos = dst_buf[m
[31m-    local dst_len = 0[m
[31m-[m
[31m-    while true do[m
[31m-        local rc = C.ngx_http_lua_ffi_exec_regex(compiled, flags, subj,[m
[31m-                                                 subj_len, pos)[m
[31m-        if rc == PCRE_ERROR_NOMATCH then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        if rc < 0 then[m
[31m-            if not compile_once then[m
[31m-                destroy_compiled_regex(compiled)[m
[31m-            end[m
[31m-            return nil, nil, "pcre_exec() failed: " .. rc[m
[31m-        end[m
[31m-[m
[31m-        if rc == 0 then[m
[31m-            if band(flags, FLAG_DFA) == 0 then[m
[31m-                if not compile_once then[m
[31m-                    destroy_compiled_regex(compiled)[m
[31m-                end[m
[31m-                return nil, nil, "capture size too small"[m
[31m-            end[m
[31m-[m
[31m-            rc = 1[m
[31m-        end[m
[31m-[m
[31m-        count = count + 1[m
[31m-        local prefix_len = compiled.captures[0] - cp_pos[m
[31m-[m
[31m-        local res = collect_captures(compiled, rc, subj, flags)[m
[31m-[m
[31m-        local bit = tostring(replace(res))[m
[31m-        local bit_len = #bit[m
[31m-[m
[31m-        local new_dst_len = dst_len + prefix_len + bit_len[m
[31m-        dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-            check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                           new_dst_len, true)[m
[31m-[m
[31m-        if prefix_len > 0 then[m
[31m-            ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                     prefix_len)[m
[31m-            dst_pos = dst_pos + prefix_len[m
[31m-        end[m
[31m-[m
[31m-        if bit_len > 0 then[m
[31m-            ffi_copy(dst_pos, bit, bit_len)[m
[31m-            dst_pos = dst_pos + bit_len[m
[31m-        end[m
[31m-[m
[31m-        cp_pos = compiled.captures[1][m
[31m-        pos = cp_pos[m
[31m-        if pos == compiled.captures[0] then[m
[31m-            pos = pos + 1[m
[31m-            if pos > subj_len then[m
[31m-                break[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if not global then[m
[31m-            break[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if not compile_once then[m
[31m-        destroy_compiled_regex(compiled)[m
[31m-    end[m
[31m-[m
[31m-    if count > 0 then[m
[31m-        if pos < subj_len then[m
[31m-            local suffix_len = subj_len - cp_pos[m
[31m-[m
[31m-            local new_dst_len = dst_len + suffix_len[m
[31m-            dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-                check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                               new_dst_len, true)[m
[31m-[m
[31m-            ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                     suffix_len)[m
[31m-        end[m
[31m-        return ffi_string(dst_buf, dst_len), count[m
[31m-    end[m
[31m-[m
[31m-    return subj, 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_sub_str_helper(subj, regex, replace, opts, global)[m
[31m-    local compiled, compile_once, flags =[m
[31m-                                    re_sub_compile(regex, opts, replace, nil)[m
[31m-    if not compiled then[m
[31m-        -- error string is in compile_once[m
[31m-        return nil, nil, compile_once[m
[31m-    end[m
[31m-[m
[31m-    -- exec the compiled regex[m
[31m-[m
[31m-    subj = tostring(subj)[m
[31m-    local subj_len = #subj[m
[31m-    local count = 0[m
[31m-    local pos = 0[m
[31m-    local cp_pos = 0[m
[31m-[m
[31m-    local dst_buf_size = get_string_buf_size()[m
[31m-    local dst_buf = get_string_buf(dst_buf_size)[m
[31m-    local dst_pos = dst_buf[m
[31m-    local dst_len = 0[m
[31m-[m
[31m-    while true do[m
[31m-        local rc = C.ngx_http_lua_ffi_exec_regex(compiled, flags, subj,[m
[31m-                                                 subj_len, pos)[m
[31m-        if rc == PCRE_ERROR_NOMATCH then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        if rc < 0 then[m
[31m-            if not compile_once then[m
[31m-                destroy_compiled_regex(compiled)[m
[31m-            end[m
[31m-            return nil, nil, "pcre_exec() failed: " .. rc[m
[31m-        end[m
[31m-[m
[31m-        if rc == 0 then[m
[31m-            if band(flags, FLAG_DFA) == 0 then[m
[31m-                if not compile_once then[m
[31m-                    destroy_compiled_regex(compiled)[m
[31m-                end[m
[31m-                return nil, nil, "capture size too small"[m
[31m-            end[m
[31m-[m
[31m-            rc = 1[m
[31m-        end[m
[31m-[m
[31m-        count = count + 1[m
[31m-        local prefix_len = compiled.captures[0] - cp_pos[m
[31m-[m
[31m-        local cv = compiled.replace[m
[31m-        if cv.lengths ~= nil then[m
[31m-            local e = new_script_engine(subj, compiled, rc)[m
[31m-            if e == nil then[m
[31m-                return nil, nil, "failed to create script engine"[m
[31m-            end[m
[31m-[m
[31m-            local bit_len = C.ngx_http_lua_ffi_script_eval_len(e, cv)[m
[31m-            local new_dst_len = dst_len + prefix_len + bit_len[m
[31m-            dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-                check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                               new_dst_len)[m
[31m-[m
[31m-            if prefix_len > 0 then[m
[31m-                ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                         prefix_len)[m
[31m-                dst_pos = dst_pos + prefix_len[m
[31m-            end[m
[31m-[m
[31m-            if bit_len > 0 then[m
[31m-                C.ngx_http_lua_ffi_script_eval_data(e, cv, dst_pos)[m
[31m-                dst_pos = dst_pos + bit_len[m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            local bit_len = cv.value.len[m
[31m-[m
[31m-            dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-                check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                               dst_len + prefix_len + bit_len)[m
[31m-[m
[31m-            if prefix_len > 0 then[m
[31m-                ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                         prefix_len)[m
[31m-                dst_pos = dst_pos + prefix_len[m
[31m-            end[m
[31m-[m
[31m-            if bit_len > 0 then[m
[31m-                ffi_copy(dst_pos, cv.value.data, bit_len)[m
[31m-                dst_pos = dst_pos + bit_len[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        cp_pos = compiled.captures[1][m
[31m-        pos = cp_pos[m
[31m-        if pos == compiled.captures[0] then[m
[31m-            pos = pos + 1[m
[31m-            if pos > subj_len then[m
[31m-                break[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if not global then[m
[31m-            break[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if not compile_once then[m
[31m-        destroy_compiled_regex(compiled)[m
[31m-    end[m
[31m-[m
[31m-    if count > 0 then[m
[31m-        if pos < subj_len then[m
[31m-            local suffix_len = subj_len - cp_pos[m
[31m-[m
[31m-            local new_dst_len = dst_len + suffix_len[m
[31m-            dst_buf, dst_buf_size, dst_pos, dst_len =[m
[31m-                check_buf_size(dst_buf, dst_buf_size, dst_pos, dst_len,[m
[31m-                               new_dst_len)[m
[31m-[m
[31m-            ffi_copy(dst_pos, ffi_cast(c_str_type, subj) + cp_pos,[m
[31m-                     suffix_len)[m
[31m-        end[m
[31m-        return ffi_string(dst_buf, dst_len), count[m
[31m-    end[m
[31m-[m
[31m-    return subj, 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function re_sub_helper(subj, regex, replace, opts, global)[m
[31m-    local repl_type = type(replace)[m
[31m-    if repl_type == "function" then[m
[31m-        return re_sub_func_helper(subj, regex, replace, opts, global)[m
[31m-    end[m
[31m-[m
[31m-    if repl_type ~= "string" then[m
[31m-        replace = tostring(replace)[m
[31m-    end[m
[31m-[m
[31m-    return re_sub_str_helper(subj, regex, replace, opts, global)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.re.sub(subj, regex, replace, opts)[m
[31m-    return re_sub_helper(subj, regex, replace, opts, false)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.re.gsub(subj, regex, replace, opts)[m
[31m-    return re_sub_helper(subj, regex, replace, opts, true)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/request.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/request.lua[m
[1mdeleted file mode 100644[m
[1mindex c737366..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/request.lua[m
[1m+++ /dev/null[m
[36m@@ -1,351 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local FFI_OK = base.FFI_OK[m
[31m-local new_tab = base.new_tab[m
[31m-local C = ffi.C[m
[31m-local ffi_cast = ffi.cast[m
[31m-local ffi_str = ffi.string[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local setmetatable = setmetatable[m
[31m-local gsub = ngx.re.gsub[m
[31m-local lower = string.lower[m
[31m-local rawget = rawget[m
[31m-local ngx = ngx[m
[31m-local getfenv = getfenv[m
[31m-local type = type[m
[31m-local error = error[m
[31m-local tostring = tostring[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    typedef struct {[m
[31m-        ngx_http_lua_ffi_str_t   key;[m
[31m-        ngx_http_lua_ffi_str_t   value;[m
[31m-    } ngx_http_lua_ffi_table_elt_t;[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_headers_count(ngx_http_request_t *r,[m
[31m-        int max);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_headers(ngx_http_request_t *r,[m
[31m-        ngx_http_lua_ffi_table_elt_t *out, int count, int raw);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_uri_args_count(ngx_http_request_t *r,[m
[31m-        int max);[m
[31m-[m
[31m-    size_t ngx_http_lua_ffi_req_get_querystring_len(ngx_http_request_t *r);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_uri_args(ngx_http_request_t *r,[m
[31m-        unsigned char *buf, ngx_http_lua_ffi_table_elt_t *out, int count);[m
[31m-[m
[31m-    double ngx_http_lua_ffi_req_start_time(ngx_http_request_t *r);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_method(ngx_http_request_t *r);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_get_method_name(ngx_http_request_t *r,[m
[31m-        char *name, size_t *len);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_set_method(ngx_http_request_t *r, int method);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_req_header_set_single_value(ngx_http_request_t *r,[m
[31m-        const unsigned char *key, size_t key_len, const unsigned char *value,[m
[31m-        size_t value_len);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local table_elt_type = ffi.typeof("ngx_http_lua_ffi_table_elt_t*")[m
[31m-local table_elt_size = ffi.sizeof("ngx_http_lua_ffi_table_elt_t")[m
[31m-local req_headers_mt = {[m
[31m-    __index = function (tb, key)[m
[31m-        return rawget(tb, (gsub(lower(key), '_', '-', "jo")))[m
[31m-    end[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx.req.get_headers(max_headers, raw)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if not max_headers then[m
[31m-        max_headers = -1[m
[31m-    end[m
[31m-[m
[31m-    if not raw then[m
[31m-        raw = 0[m
[31m-    else[m
[31m-        raw = 1[m
[31m-    end[m
[31m-[m
[31m-    local n = C.ngx_http_lua_ffi_req_get_headers_count(r, max_headers)[m
[31m-    if n == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    if n == 0 then[m
[31m-        return {}[m
[31m-    end[m
[31m-[m
[31m-    local raw_buf = get_string_buf(n * table_elt_size)[m
[31m-    local buf = ffi_cast(table_elt_type, raw_buf)[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_req_get_headers(r, buf, n, raw)[m
[31m-    if rc == 0 then[m
[31m-        local headers = new_tab(0, n)[m
[31m-        for i = 0, n - 1 do[m
[31m-            local h = buf[i][m
[31m-[m
[31m-            local key = h.key[m
[31m-            key = ffi_str(key.data, key.len)[m
[31m-[m
[31m-            local value = h.value[m
[31m-            value = ffi_str(value.data, value.len)[m
[31m-[m
[31m-            local existing = headers[key][m
[31m-            if existing then[m
[31m-                if type(existing) == "table" then[m
[31m-                    existing[#existing + 1] = value[m
[31m-                else[m
[31m-                    headers[key] = {existing, value}[m
[31m-                end[m
[31m-[m
[31m-            else[m
[31m-                headers[key] = value[m
[31m-            end[m
[31m-        end[m
[31m-        if raw == 0 then[m
[31m-            return setmetatable(headers, req_headers_mt)[m
[31m-        end[m
[31m-        return headers[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.req.get_uri_args(max_args)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if not max_args then[m
[31m-        max_args = -1[m
[31m-    end[m
[31m-[m
[31m-    local n = C.ngx_http_lua_ffi_req_get_uri_args_count(r, max_args)[m
[31m-    if n == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    if n == 0 then[m
[31m-        return {}[m
[31m-    end[m
[31m-[m
[31m-    local args_len = C.ngx_http_lua_ffi_req_get_querystring_len(r)[m
[31m-[m
[31m-    local strbuf = get_string_buf(args_len + n * table_elt_size)[m
[31m-    local kvbuf = ffi_cast(table_elt_type, strbuf + args_len)[m
[31m-[m
[31m-    local nargs = C.ngx_http_lua_ffi_req_get_uri_args(r, strbuf, kvbuf, n)[m
[31m-[m
[31m-    local args = new_tab(0, nargs)[m
[31m-    for i = 0, nargs - 1 do[m
[31m-        local arg = kvbuf[i][m
[31m-[m
[31m-        local key = arg.key[m
[31m-        key = ffi_str(key.data, key.len)[m
[31m-[m
[31m-        local value = arg.value[m
[31m-        local len = value.len[m
[31m-        if len == -1 then[m
[31m-            value = true[m
[31m-        else[m
[31m-            value = ffi_str(value.data, len)[m
[31m-        end[m
[31m-[m
[31m-        local existing = args[key][m
[31m-        if existing then[m
[31m-            if type(existing) == "table" then[m
[31m-                existing[#existing + 1] = value[m
[31m-            else[m
[31m-                args[key] = {existing, value}[m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            args[key] = value[m
[31m-        end[m
[31m-    end[m
[31m-    return args[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.req.start_time()[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    return tonumber(C.ngx_http_lua_ffi_req_start_time(r))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-do[m
[31m-    local methods = {[m
[31m-        [0x0002] = "GET",[m
[31m-        [0x0004] = "HEAD",[m
[31m-        [0x0008] = "POST",[m
[31m-        [0x0010] = "PUT",[m
[31m-        [0x0020] = "DELETE",[m
[31m-        [0x0040] = "MKCOL",[m
[31m-        [0x0080] = "COPY",[m
[31m-        [0x0100] = "MOVE",[m
[31m-        [0x0200] = "OPTIONS",[m
[31m-        [0x0400] = "PROPFIND",[m
[31m-        [0x0800] = "PROPPATCH",[m
[31m-        [0x1000] = "LOCK",[m
[31m-        [0x2000] = "UNLOCK",[m
[31m-        [0x4000] = "PATCH",[m
[31m-        [0x8000] = "TRACE",[m
[31m-    }[m
[31m-[m
[31m-    function ngx.req.get_method()[m
[31m-        local r = getfenv(0).__ngx_req[m
[31m-        if not r then[m
[31m-            return error("no request found")[m
[31m-        end[m
[31m-[m
[31m-        do[m
[31m-            local id = C.ngx_http_lua_ffi_req_get_method(r)[m
[31m-            if id == FFI_BAD_CONTEXT then[m
[31m-                return error("API disabled in the current context")[m
[31m-            end[m
[31m-[m
[31m-            local method = methods[id][m
[31m-            if method then[m
[31m-                return method[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local buf = get_string_buf(32)[m
[31m-        local sizep = get_size_ptr()[m
[31m-        sizep[0] = 32[m
[31m-[m
[31m-        local rc = C.ngx_http_lua_ffi_req_get_method_name(r, buf, sizep)[m
[31m-        if rc ~= 0 then[m
[31m-            return nil[m
[31m-        end[m
[31m-[m
[31m-        return ffi_str(buf, sizep[0])[m
[31m-    end[m
[31m-end  -- do[m
[31m-[m
[31m-[m
[31m-function ngx.req.set_method(method)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(method) ~= "number" then[m
[31m-        return error("bad method number")[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_req_set_method(r, method)[m
[31m-    if rc == FFI_OK then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_DECLINED then[m
[31m-        return error("unsupported HTTP method: " .. method)[m
[31m-    end[m
[31m-[m
[31m-    return error("unknown error: " .. rc)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-do[m
[31m-    local orig_func = ngx.req.set_header[m
[31m-[m
[31m-    function ngx.req.set_header(name, value)[m
[31m-        if type(value) == "table" then[m
[31m-            return orig_func(name, value)[m
[31m-        end[m
[31m-[m
[31m-        local r = getfenv(0).__ngx_req[m
[31m-        if not r then[m
[31m-            return error("no request found")[m
[31m-        end[m
[31m-[m
[31m-        if type(name) ~= "string" then[m
[31m-            name = tostring(name)[m
[31m-        end[m
[31m-[m
[31m-        local rc[m
[31m-        if not value then[m
[31m-            rc = C.ngx_http_lua_ffi_req_header_set_single_value(r, name,[m
[31m-                                                         #name, nil, 0)[m
[31m-[m
[31m-        else[m
[31m-            if type(value) ~= "string" then[m
[31m-                value = tostring(value)[m
[31m-            end[m
[31m-[m
[31m-            rc = C.ngx_http_lua_ffi_req_header_set_single_value(r, name,[m
[31m-                                                         #name, value, #value)[m
[31m-        end[m
[31m-[m
[31m-        if rc == FFI_OK or rc == FFI_DECLINED then[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        if rc == FFI_BAD_CONTEXT then[m
[31m-            return error("API disabled in the current context")[m
[31m-        end[m
[31m-[m
[31m-        return error("error")[m
[31m-    end[m
[31m-end  -- do[m
[31m-[m
[31m-[m
[31m-function ngx.req.clear_header(name)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(name) ~= "string" then[m
[31m-        name = tostring(name)[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_req_header_set_single_value(r, name, #name,[m
[31m-                                                                       nil, 0)[m
[31m-[m
[31m-    if rc == FFI_OK or rc == FFI_DECLINED then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    return error("error")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/response.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/response.lua[m
[1mdeleted file mode 100644[m
[1mindex 2944d75..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/response.lua[m
[1m+++ /dev/null[m
[36m@@ -1,165 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-local ffi_cast = ffi.cast[m
[31m-local ffi_str = ffi.string[m
[31m-local new_tab = base.new_tab[m
[31m-local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT[m
[31m-local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX[m
[31m-local FFI_DECLINED = base.FFI_DECLINED[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local getmetatable = getmetatable[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local getfenv = getfenv[m
[31m-local error = error[m
[31m-local ngx = ngx[m
[31m-[m
[31m-[m
[31m-local MAX_HEADER_VALUES = 100[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-local ffi_str_type = ffi.typeof("ngx_http_lua_ffi_str_t*")[m
[31m-local ffi_str_size = ffi.sizeof("ngx_http_lua_ffi_str_t")[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r,[m
[31m-        const char *key_data, size_t key_len, int is_nil,[m
[31m-        const char *sval, size_t sval_len, ngx_http_lua_ffi_str_t *mvals,[m
[31m-        size_t mvals_len, char **errmsg);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_get_resp_header(ngx_http_request_t *r,[m
[31m-        const unsigned char *key, size_t key_len,[m
[31m-        unsigned char *key_buf, ngx_http_lua_ffi_str_t *values,[m
[31m-        int max_nvalues);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local function set_resp_header(tb, key, value)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local rc[m
[31m-    if value == nil then[m
[31m-        rc = C.ngx_http_lua_ffi_set_resp_header(r, key, #key, true, nil, 0,[m
[31m-                                                nil, 0, errmsg)[m
[31m-    else[m
[31m-        local sval, sval_len, mvals, mvals_len, buf[m
[31m-[m
[31m-        if type(value) == "table" then[m
[31m-            mvals_len = #value[m
[31m-            buf = get_string_buf(ffi_str_size * mvals_len)[m
[31m-            mvals = ffi_cast(ffi_str_type, buf)[m
[31m-            for i = 1, mvals_len do[m
[31m-                local s = value[i][m
[31m-                if type(s) ~= "string" then[m
[31m-                    s = tostring(s)[m
[31m-                    value[i] = s[m
[31m-                end[m
[31m-                local str = mvals[i - 1][m
[31m-                str.data = s[m
[31m-                str.len = #s[m
[31m-            end[m
[31m-[m
[31m-            sval_len = 0[m
[31m-[m
[31m-        else[m
[31m-            if type(value) ~= "string" then[m
[31m-                sval = tostring(value)[m
[31m-            else[m
[31m-                sval = value[m
[31m-            end[m
[31m-            sval_len = #sval[m
[31m-[m
[31m-            mvals_len = 0[m
[31m-        end[m
[31m-[m
[31m-        rc = C.ngx_http_lua_ffi_set_resp_header(r, key, #key, false, sval,[m
[31m-                                                sval_len, mvals, mvals_len,[m
[31m-                                                errmsg)[m
[31m-    end[m
[31m-[m
[31m-    if rc == 0 or rc == FFI_DECLINED then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_NO_REQ_CTX then[m
[31m-        return error("no request ctx found")[m
[31m-    end[m
[31m-[m
[31m-    if rc == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    -- rc == FFI_ERROR[m
[31m-    return error(ffi_str(errmsg[0]))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function get_resp_header(tb, key)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-[m
[31m-    local key_buf = get_string_buf(key_len + ffi_str_size * MAX_HEADER_VALUES)[m
[31m-    local values = ffi_cast(ffi_str_type, key_buf + key_len)[m
[31m-    local n = C.ngx_http_lua_ffi_get_resp_header(r, key, key_len, key_buf,[m
[31m-                                                 values, MAX_HEADER_VALUES)[m
[31m-[m
[31m-    -- print("retval: ", n)[m
[31m-[m
[31m-    if n == FFI_BAD_CONTEXT then[m
[31m-        return error("API disabled in the current context")[m
[31m-    end[m
[31m-[m
[31m-    if n == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if n == 1 then[m
[31m-        local v = values[0][m
[31m-        return ffi_str(v.data, v.len)[m
[31m-    end[m
[31m-[m
[31m-    if n > 0 then[m
[31m-        local ret = new_tab(n, 0)[m
[31m-        for i = 1, n do[m
[31m-            local v = values[i - 1][m
[31m-            ret[i] = ffi_str(v.data, v.len)[m
[31m-        end[m
[31m-        return ret[m
[31m-    end[m
[31m-[m
[31m-    -- n == FFI_ERROR[m
[31m-    return error("no memory")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-do[m
[31m-    local mt = getmetatable(ngx.header)[m
[31m-    mt.__newindex = set_resp_header[m
[31m-    mt.__index = get_resp_header[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/shdict.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/shdict.lua[m
[1mdeleted file mode 100644[m
[1mindex 5ae98ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/shdict.lua[m
[1m+++ /dev/null[m
[36m@@ -1,382 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_string_buf_size = base.get_string_buf_size[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local tonumber = tonumber[m
[31m-local tostring = tostring[m
[31m-local next = next[m
[31m-local type = type[m
[31m-local error = error[m
[31m-local ngx_shared = ngx.shared[m
[31m-local getmetatable = getmetatable[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_shdict_get(void *zone, const unsigned char *key,[m
[31m-        size_t key_len, int *value_type, unsigned char **str_value_buf,[m
[31m-        size_t *str_value_len, double *num_value, int *user_flags,[m
[31m-        int get_stale, int *is_stale);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_shdict_incr(void *zone, const unsigned char *key,[m
[31m-        size_t key_len, double *value, char **err);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_shdict_store(void *zone, int op,[m
[31m-        const unsigned char *key, size_t key_len, int value_type,[m
[31m-        const unsigned char *str_value_buf, size_t str_value_len,[m
[31m-        double num_value, int exptime, int user_flags, char **errmsg,[m
[31m-        int *forcible);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_shdict_flush_all(void *zone);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-if not pcall(function () return C.free end) then[m
[31m-    ffi.cdef[[[m
[31m-        void free(void *ptr);[m
[31m-    ]][m
[31m-end[m
[31m-[m
[31m-[m
[31m-local value_type = ffi_new("int[1]")[m
[31m-local user_flags = ffi_new("int[1]")[m
[31m-local num_value = ffi_new("double[1]")[m
[31m-local is_stale = ffi_new("int[1]")[m
[31m-local forcible = ffi_new("int[1]")[m
[31m-local str_value_buf = ffi_new("unsigned char *[1]")[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-[m
[31m-[m
[31m-local function check_zone(zone)[m
[31m-    if not zone or type(zone) ~= "table" then[m
[31m-        return error("bad \"zone\" argument")[m
[31m-    end[m
[31m-[m
[31m-    zone = zone[1][m
[31m-    if type(zone) ~= "userdata" then[m
[31m-        return error("bad \"zone\" argument")[m
[31m-    end[m
[31m-[m
[31m-    return zone[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_store(zone, op, key, value, exptime, flags)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    if not exptime then[m
[31m-        exptime = 0[m
[31m-    elseif exptime < 0 then[m
[31m-        return error('bad "exptime" argument')[m
[31m-    end[m
[31m-[m
[31m-    if not flags then[m
[31m-        flags = 0[m
[31m-    end[m
[31m-[m
[31m-    if key == nil then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-    if key_len == 0 then[m
[31m-        return nil, "empty key"[m
[31m-    end[m
[31m-    if key_len > 65535 then[m
[31m-        return nil, "key too long"[m
[31m-    end[m
[31m-[m
[31m-    local str_value_buf[m
[31m-    local str_value_len = 0[m
[31m-    local num_value = 0[m
[31m-    local valtyp = type(value)[m
[31m-[m
[31m-    -- print("value type: ", valtyp)[m
[31m-    -- print("exptime: ", exptime)[m
[31m-[m
[31m-    if valtyp == "string" then[m
[31m-        valtyp = 4  -- LUA_TSTRING[m
[31m-        str_value_buf = value[m
[31m-        str_value_len = #value[m
[31m-[m
[31m-    elseif valtyp == "number" then[m
[31m-        valtyp = 3  -- LUA_TNUMBER[m
[31m-        num_value = value[m
[31m-[m
[31m-    elseif value == nil then[m
[31m-        valtyp = 0  -- LUA_TNIL[m
[31m-[m
[31m-    elseif valtyp == "boolean" then[m
[31m-        valtyp = 1  -- LUA_TBOOLEAN[m
[31m-        num_value = value and 1 or 0[m
[31m-[m
[31m-    else[m
[31m-        return nil, "bad value type"[m
[31m-    end[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_shdict_store(zone, op, key, key_len,[m
[31m-                                               valtyp, str_value_buf,[m
[31m-                                               str_value_len, num_value,[m
[31m-                                               exptime * 1000, flags, errmsg,[m
[31m-                                               forcible)[m
[31m-[m
[31m-    -- print("rc == ", rc)[m
[31m-[m
[31m-    if rc == 0 then  -- NGX_OK[m
[31m-        return true, nil, forcible[0] == 1[m
[31m-    end[m
[31m-[m
[31m-    -- NGX_DECLINED or NGX_ERROR[m
[31m-    return false, ffi_str(errmsg[0]), forcible[0] == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_set(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_safe_set(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0x0004, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_add(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0x0001, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_safe_add(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0x0005, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_replace(zone, key, value, exptime, flags)[m
[31m-    return shdict_store(zone, 0x0002, key, value, exptime, flags)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_delete(zone, key)[m
[31m-    return shdict_set(zone, key, nil)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_get(zone, key)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    if key == nil then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-    if key_len == 0 then[m
[31m-        return nil, "empty key"[m
[31m-    end[m
[31m-    if key_len > 65535 then[m
[31m-        return nil, "key too long"[m
[31m-    end[m
[31m-[m
[31m-    local size = get_string_buf_size()[m
[31m-    local buf = get_string_buf(size)[m
[31m-    str_value_buf[0] = buf[m
[31m-    local value_len = get_size_ptr()[m
[31m-    value_len[0] = size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_shdict_get(zone, key, key_len, value_type,[m
[31m-                                             str_value_buf, value_len,[m
[31m-                                             num_value, user_flags, 0,[m
[31m-                                             is_stale)[m
[31m-    if rc ~= 0 then[m
[31m-        return error("failed to get the key")[m
[31m-    end[m
[31m-[m
[31m-    local typ = value_type[0][m
[31m-[m
[31m-    if typ == 0 then -- LUA_TNIL[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    local flags = tonumber(user_flags[0])[m
[31m-[m
[31m-    local val[m
[31m-[m
[31m-    if typ == 4 then -- LUA_TSTRING[m
[31m-        if str_value_buf[0] ~= buf then[m
[31m-            -- ngx.say("len: ", tonumber(value_len[0]))[m
[31m-            buf = str_value_buf[0][m
[31m-            val = ffi_str(buf, value_len[0])[m
[31m-            C.free(buf)[m
[31m-        else[m
[31m-            val = ffi_str(buf, value_len[0])[m
[31m-        end[m
[31m-[m
[31m-    elseif typ == 3 then -- LUA_TNUMBER[m
[31m-        val = tonumber(num_value[0])[m
[31m-[m
[31m-    elseif typ == 1 then -- LUA_TBOOLEAN[m
[31m-        val = (tonumber(buf[0]) ~= 0)[m
[31m-[m
[31m-    else[m
[31m-        return error("unknown value type: " .. typ)[m
[31m-    end[m
[31m-[m
[31m-    if flags ~= 0 then[m
[31m-        return val, flags[m
[31m-    end[m
[31m-[m
[31m-    return val[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_get_stale(zone, key)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    if key == nil then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-    if key_len == 0 then[m
[31m-        return nil, "empty key"[m
[31m-    end[m
[31m-    if key_len > 65535 then[m
[31m-        return nil, "key too long"[m
[31m-    end[m
[31m-[m
[31m-    local size = get_string_buf_size()[m
[31m-    local buf = get_string_buf(size)[m
[31m-    str_value_buf[0] = buf[m
[31m-    local value_len = get_size_ptr()[m
[31m-    value_len[0] = size[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_shdict_get(zone, key, key_len, value_type,[m
[31m-                                             str_value_buf, value_len,[m
[31m-                                             num_value, user_flags, 1,[m
[31m-                                             is_stale)[m
[31m-    if rc ~= 0 then[m
[31m-        return error("failed to get the key")[m
[31m-    end[m
[31m-[m
[31m-    local typ = value_type[0][m
[31m-[m
[31m-    if typ == 0 then -- LUA_TNIL[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    local flags = tonumber(user_flags[0])[m
[31m-    local val[m
[31m-[m
[31m-    if typ == 4 then -- LUA_TSTRING[m
[31m-        if str_value_buf[0] ~= buf then[m
[31m-            -- ngx.say("len: ", tonumber(value_len[0]))[m
[31m-            buf = str_value_buf[0][m
[31m-            val = ffi_str(buf, value_len[0])[m
[31m-            C.free(buf)[m
[31m-        else[m
[31m-            val = ffi_str(buf, value_len[0])[m
[31m-        end[m
[31m-[m
[31m-    elseif typ == 3 then -- LUA_TNUMBER[m
[31m-        val = tonumber(num_value[0])[m
[31m-[m
[31m-    elseif typ == 1 then -- LUA_TBOOLEAN[m
[31m-        val = (tonumber(buf[0]) ~= 0)[m
[31m-[m
[31m-    else[m
[31m-        return error("unknown value type: " .. typ)[m
[31m-    end[m
[31m-[m
[31m-    if flags ~= 0 then[m
[31m-        return val, flags, is_stale[0] == 1[m
[31m-    end[m
[31m-[m
[31m-    return val, nil, is_stale[0] == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_incr(zone, key, value)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    if key == nil then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local key_len = #key[m
[31m-    if key_len == 0 then[m
[31m-        return nil, "empty key"[m
[31m-    end[m
[31m-    if key_len > 65535 then[m
[31m-        return nil, "key too long"[m
[31m-    end[m
[31m-[m
[31m-    if type(value) ~= "number" then[m
[31m-        value = tonumber(value)[m
[31m-    end[m
[31m-    num_value[0] = value[m
[31m-[m
[31m-    local rc = C.ngx_http_lua_ffi_shdict_incr(zone, key, key_len, num_value,[m
[31m-                                             errmsg)[m
[31m-    if rc ~= 0 then  -- ~= NGX_OK[m
[31m-        return nil, ffi_str(errmsg[0])[m
[31m-    end[m
[31m-[m
[31m-    return tonumber(num_value[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function shdict_flush_all(zone)[m
[31m-    zone = check_zone(zone)[m
[31m-[m
[31m-    C.ngx_http_lua_ffi_shdict_flush_all(zone)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if ngx_shared then[m
[31m-    local name, dict = next(ngx_shared, nil)[m
[31m-    if dict then[m
[31m-        local mt = getmetatable(dict)[m
[31m-        if mt then[m
[31m-            mt = mt.__index[m
[31m-            if mt then[m
[31m-                mt.get = shdict_get[m
[31m-                mt.get_stale = shdict_get_stale[m
[31m-                mt.incr = shdict_incr[m
[31m-                mt.set = shdict_set[m
[31m-                mt.safe_set = shdict_safe_set[m
[31m-                mt.add = shdict_add[m
[31m-                mt.safe_add = shdict_safe_add[m
[31m-                mt.replace = shdict_replace[m
[31m-                mt.delete = shdict_delete[m
[31m-                mt.flush_all = shdict_flush_all[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/time.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/time.lua[m
[1mdeleted file mode 100644[m
[1mindex 6e45512..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/time.lua[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local tonumber = tonumber[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-double ngx_http_lua_ffi_now(void);[m
[31m-long ngx_http_lua_ffi_time(void);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-function ngx.now()[m
[31m-    return tonumber(C.ngx_http_lua_ffi_now())[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.time()[m
[31m-    return tonumber(C.ngx_http_lua_ffi_time())[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/uri.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/uri.lua[m
[1mdeleted file mode 100644[m
[1mindex af0e655..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/uri.lua[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local ffi_string = ffi.string[m
[31m-local C = ffi.C[m
[31m-local ngx = ngx[m
[31m-local type = type[m
[31m-local tostring = tostring[m
[31m-local base = require "resty.core.base"[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    size_t ngx_http_lua_ffi_uri_escaped_length(const unsigned char *src,[m
[31m-                                               size_t len);[m
[31m-[m
[31m-    void ngx_http_lua_ffi_escape_uri(const unsigned char *src, size_t len,[m
[31m-                                     unsigned char *dst);[m
[31m-[m
[31m-    size_t ngx_http_lua_ffi_unescape_uri(const unsigned char *src,[m
[31m-                                         size_t len, unsigned char *dst);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-ngx.escape_uri = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    local slen = #s[m
[31m-    local dlen = C.ngx_http_lua_ffi_uri_escaped_length(s, slen)[m
[31m-    -- print("dlen: ", tonumber(dlen))[m
[31m-    if dlen == slen then[m
[31m-        return s[m
[31m-    end[m
[31m-    local dst = get_string_buf(dlen)[m
[31m-    C.ngx_http_lua_ffi_escape_uri(s, slen, dst)[m
[31m-    return ffi_string(dst, dlen)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-ngx.unescape_uri = function (s)[m
[31m-    if type(s) ~= 'string' then[m
[31m-        if not s then[m
[31m-            s = ''[m
[31m-        else[m
[31m-            s = tostring(s)[m
[31m-        end[m
[31m-    end[m
[31m-    local slen = #s[m
[31m-    local dlen = slen[m
[31m-    local dst = get_string_buf(dlen)[m
[31m-    dlen = C.ngx_http_lua_ffi_unescape_uri(s, slen, dst)[m
[31m-    return ffi_string(dst, dlen)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version,[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/var.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/var.lua[m
[1mdeleted file mode 100644[m
[1mindex 3fda66a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/var.lua[m
[1m+++ /dev/null[m
[36m@@ -1,127 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local type = type[m
[31m-local getfenv = getfenv[m
[31m-local get_string_buf = base.get_string_buf[m
[31m-local get_size_ptr = base.get_size_ptr[m
[31m-local error = error[m
[31m-local tostring = tostring[m
[31m-local ngx_var = ngx.var[m
[31m-local getmetatable = getmetatable[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int ngx_http_lua_ffi_var_get(ngx_http_request_t *r,[m
[31m-        const char *name_data, size_t name_len, char *lowcase_buf,[m
[31m-        int capture_id, char **value, size_t *value_len, char **err);[m
[31m-[m
[31m-    int ngx_http_lua_ffi_var_set(ngx_http_request_t *r,[m
[31m-        const unsigned char *name_data, size_t name_len,[m
[31m-        unsigned char *lowcase_buf, const unsigned char *value,[m
[31m-        size_t value_len, unsigned char *errbuf, size_t errlen);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-local value_ptr = ffi_new("unsigned char *[1]")[m
[31m-local errmsg = base.get_errmsg_ptr()[m
[31m-[m
[31m-[m
[31m-local function var_get(self, name)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    local value_len = get_size_ptr()[m
[31m-    local rc[m
[31m-    if type(name) == "number" then[m
[31m-        rc = C.ngx_http_lua_ffi_var_get(r, nil, 0, nil, name, value_ptr,[m
[31m-                                        value_len, errmsg)[m
[31m-[m
[31m-    else[m
[31m-        if type(name) ~= "string" then[m
[31m-            return error("bad variable name")[m
[31m-        end[m
[31m-[m
[31m-        local name_len = #name[m
[31m-        local lowcase_buf = get_string_buf(name_len)[m
[31m-[m
[31m-        rc = C.ngx_http_lua_ffi_var_get(r, name, name_len, lowcase_buf, 0,[m
[31m-                                        value_ptr, value_len, errmsg)[m
[31m-    end[m
[31m-[m
[31m-    -- ngx.log(ngx.WARN, "rc = ", rc)[m
[31m-[m
[31m-    if rc == 0 then -- NGX_OK[m
[31m-        return ffi_str(value_ptr[0], value_len[0])[m
[31m-    end[m
[31m-[m
[31m-    if rc == -5 then  -- NGX_DECLINED[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if rc == -1 then  -- NGX_ERROR[m
[31m-        return error(ffi_str(errmsg[0]))[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function var_set(self, name, value)[m
[31m-    local r = getfenv(0).__ngx_req[m
[31m-    if not r then[m
[31m-        return error("no request found")[m
[31m-    end[m
[31m-[m
[31m-    if type(name) ~= "string" then[m
[31m-        return error("bad variable name")[m
[31m-    end[m
[31m-    local name_len = #name[m
[31m-[m
[31m-    local errlen = 256[m
[31m-    local lowcase_buf = get_string_buf(name_len + errlen)[m
[31m-[m
[31m-    local value_len[m
[31m-    if value == nil then[m
[31m-        value_len = 0[m
[31m-    else[m
[31m-        if type(value) ~= 'string' then[m
[31m-            value = tostring(value)[m
[31m-        end[m
[31m-        value_len = #value[m
[31m-    end[m
[31m-[m
[31m-    local errbuf = lowcase_buf + name_len[m
[31m-    local rc = C.ngx_http_lua_ffi_var_set(r, name, name_len, lowcase_buf,[m
[31m-                                          value, value_len, errbuf, errlen)[m
[31m-[m
[31m-    -- ngx.log(ngx.WARN, "rc = ", rc)[m
[31m-[m
[31m-    if rc == 0 then -- NGX_OK[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if rc == -1 then  -- NGX_ERROR[m
[31m-        return error(ffi_str(errbuf, errlen))[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-if ngx_var then[m
[31m-    local mt = getmetatable(ngx_var)[m
[31m-    if mt then[m
[31m-        mt.__index = var_get[m
[31m-        mt.__newindex = var_set[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    version = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/worker.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/worker.lua[m
[1mdeleted file mode 100644[m
[1mindex 1e9b096..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/lib/resty/core/worker.lua[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require 'ffi'[m
[31m-local base = require "resty.core.base"[m
[31m-[m
[31m-[m
[31m-local C = ffi.C[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int ngx_http_lua_ffi_worker_pid(void);[m
[31m-int ngx_http_lua_ffi_worker_exiting(void);[m
[31m-int ngx_http_lua_ffi_worker_id(void);[m
[31m-int ngx_http_lua_ffi_worker_count(void);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-function ngx.worker.exiting()[m
[31m-    return C.ngx_http_lua_ffi_worker_exiting() ~= 0 and true or false[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.worker.pid()[m
[31m-    return C.ngx_http_lua_ffi_worker_pid()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.worker.id()[m
[31m-    local id = C.ngx_http_lua_ffi_worker_id()[m
[31m-    if id < 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return id[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function ngx.worker.count()[m
[31m-    return C.ngx_http_lua_ffi_worker_count()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return {[m
[31m-    _VERSION = base.version[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/balancer.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/balancer.t[m
[1mdeleted file mode 100644[m
[1mindex aba3e04..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/balancer.t[m
[1m+++ /dev/null[m
[36m@@ -1,834 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_CWD} = cwd();[m
[31m-[m
[31m-#worker_connections(1024);[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set current peer (separate addr and port)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{connect\(\) failed .*?, upstream: "http://127\.0\.0\.3:12345/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set current peer & next upstream (3 tries)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr{connect\(\) failed .*, upstream: "http://.*?"}[m
[31m---- grep_error_log_out eval[m
[31m-qr#^(?:connect\(\) failed .*?, upstream: "http://127.0.0.3:12345/t"\n){3}$#[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set current peer & next upstream (no retries)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr{connect\(\) failed .*, upstream: "http://.*?"}[m
[31m---- grep_error_log_out eval[m
[31m-qr#^(?:connect\(\) failed .*?, upstream: "http://127.0.0.3:12345/t"\n){1}$#[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set current peer & next upstream (3 tries exceeding the limit)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 2;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr{connect\(\) failed .*, upstream: "http://.*?"}[m
[31m---- grep_error_log_out eval[m
[31m-qr#^(?:connect\(\) failed .*?, upstream: "http://127.0.0.3:12345/t"\n){2}$#[m
[31m---- error_log[m
[31m-set more tries: reduced tries due to limit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get last peer failure status (404)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            local state, status = b.get_last_failure()[m
[31m-            print("last peer failure: ", state, " ", status)[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.1", tonumber(ngx.var.server_port)))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- grep_error_log eval: qr{last peer failure: \S+ \S+}[m
[31m---- grep_error_log_out[m
[31m-last peer failure: nil nil[m
[31m-last peer failure: next 404[m
[31m-last peer failure: next 404[m
[31m-[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: get last peer failure status (500)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            local state, status = b.get_last_failure()[m
[31m-            print("last peer failure: ", state, " ", status)[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.1", tonumber(ngx.var.server_port)))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- grep_error_log eval: qr{last peer failure: \S+ \S+}[m
[31m---- grep_error_log_out[m
[31m-last peer failure: nil nil[m
[31m-last peer failure: failed 500[m
[31m-last peer failure: failed 500[m
[31m-[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get last peer failure status (503)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            local state, status = b.get_last_failure()[m
[31m-            print("last peer failure: ", state, " ", status)[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.1", tonumber(ngx.var.server_port)))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 503;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 503 Service Temporarily Unavailable[m
[31m---- error_code: 503[m
[31m---- grep_error_log eval: qr{last peer failure: \S+ \S+}[m
[31m---- grep_error_log_out[m
[31m-last peer failure: nil nil[m
[31m-last peer failure: failed 502[m
[31m-last peer failure: failed 502[m
[31m-[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: get last peer failure status (connect failed)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;[m
[31m-    proxy_next_upstream_tries 10;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-[m
[31m-            local state, status = b.get_last_failure()[m
[31m-            print("last peer failure: ", state, " ", status)[m
[31m-[m
[31m-            if not ngx.ctx.tries then[m
[31m-                ngx.ctx.tries = 0[m
[31m-            end[m
[31m-[m
[31m-            if ngx.ctx.tries < 2 then[m
[31m-                local ok, err = b.set_more_tries(1)[m
[31m-                if not ok then[m
[31m-                    return error("failed to set more tries: ", err)[m
[31m-                elseif err then[m
[31m-                    ngx.log(ngx.WARN, "set more tries: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.ctx.tries = ngx.ctx.tries + 1[m
[31m-            assert(b.set_current_peer("127.0.0.3", 12345))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr{last peer failure: \S+ \S+}[m
[31m---- grep_error_log_out[m
[31m-last peer failure: nil nil[m
[31m-last peer failure: failed 502[m
[31m-last peer failure: failed 502[m
[31m-[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set current peer (port embedded in addr)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            assert(b.set_current_peer("127.0.0.3:12345"))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{connect\(\) failed .*?, upstream: "http://127\.0\.0\.3:12345/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: keepalive before balancer[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        keepalive 10;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            local b = require "ngx.balancer"[m
[31m-            assert(b.set_current_peer("127.0.0.3:12345"))[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- grep_error_log eval: qr/load balancing method redefined in/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"load balancing method redefined in[m
[31m-",[m
[31m-"",[m
[31m-][m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{connect\(\) failed .*?, upstream: "http://127\.0\.0\.3:12345/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: keepalive after balancer[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-            assert(b.set_current_peer("127.0.0.1", tonumber(ngx.var.server_port)))[m
[31m-        }[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local res0 = ngx.location.capture("/tt")[m
[31m-            local res1 = ngx.location.capture("/tt")[m
[31m-            local res2 = ngx.location.capture("/tt")[m
[31m-[m
[31m-            if res2.status == ngx.HTTP_OK then[m
[31m-                ngx.print(res2.body)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /tt {[m
[31m-        proxy_pass http://backend/back;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Connection "";[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "hello keepalive!";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-hello keepalive![m
[31m---- error_code: 200[m
[31m---- grep_error_log eval: qr{\S+ keepalive peer:.*?connection}[m
[31m---- grep_error_log_out eval[m
[31m-["free keepalive peer: saving connection[m
[31m-get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-",[m
[31m-"get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-get keepalive peer: using connection[m
[31m-free keepalive peer: saving connection[m
[31m-",[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set_current_peer called in a wrong context[m
[31m---- wait: 0.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-    location = /fake {[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/fake;[m
[31m-[m
[31m-        log_by_lua_block {[m
[31m-            local balancer = require "ngx.balancer"[m
[31m-            local ok, err = balancer.set_current_peer("127.0.0.1", 1234)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to call: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.ALERT, "unexpected success")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? log_by_lua.*? failed to call: API disabled in the current context/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: get_last_failure called in a wrong context[m
[31m---- wait: 0.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-    location = /fake {[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/fake;[m
[31m-[m
[31m-        log_by_lua_block {[m
[31m-            local balancer = require "ngx.balancer"[m
[31m-            local state, status, err = balancer.get_last_failure()[m
[31m-            if not state and err then[m
[31m-                ngx.log(ngx.ERR, "failed to call: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.ALERT, "unexpected success")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? log_by_lua.*? failed to call: API disabled in the current context/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set_more_tries called in a wrong context[m
[31m---- wait: 0.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-    location = /fake {[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend/fake;[m
[31m-[m
[31m-        log_by_lua_block {[m
[31m-            local balancer = require "ngx.balancer"[m
[31m-            local ok, err = balancer.set_more_tries(1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to call: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.ALERT, "unexpected success")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? log_by_lua.*? failed to call: API disabled in the current context/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: hot loop when proxy_upstream_next error is hit and keepalive is used.[m
[31m-github issue openresty/lua-nginx-module#693[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-            print("hello from balancer by lua!")[m
[31m-            assert(b.set_current_peer("127.0.0.1", $TEST_NGINX_SERVER_PORT))[m
[31m-        }[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite ^/t(.*) $1 break;[m
[31m-        proxy_pass http://backend;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Connection "";[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        return 200;[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        echo_location /t/back;[m
[31m-        echo_location /t/bad;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.exit(444)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- ignore_response[m
[31m---- grep_error_log eval: qr{hello from balancer by lua!}[m
[31m---- grep_error_log_out[m
[31m-hello from balancer by lua![m
[31m-hello from balancer by lua![m
[31m-hello from balancer by lua![m
[31m---- error_log eval[m
[31m-qr/\[error] .*? upstream prematurely closed connection while reading response header from upstream/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: https (keepalive)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-            print("hello from balancer by lua!")[m
[31m-            assert(b.set_current_peer("127.0.0.1", 1234))[m
[31m-        }[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        listen 1234 ssl;[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location = /back {[m
[31m-            return 200 "ok";[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        proxy_pass https://backend/back;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Connection "";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m---- response_body chomp[m
[31m-ok[m
[31m---- grep_error_log eval: qr{hello from balancer by lua!}[m
[31m---- grep_error_log_out[m
[31m-hello from balancer by lua![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: https (no keepalive)[m
[31m---- skip_nginx: 4: < 1.7.5[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local b = require "ngx.balancer"[m
[31m-            print("hello from balancer by lua!")[m
[31m-            assert(b.set_current_peer("127.0.0.1", 1234))[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        listen 1234 ssl;[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location = /back {[m
[31m-            return 200 "ok";[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        proxy_pass https://backend/back;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Connection "";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m---- response_body chomp[m
[31m-ok[m
[31m---- grep_error_log eval: qr{hello from balancer by lua!}[m
[31m---- grep_error_log_out[m
[31m-hello from balancer by lua![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: test ngx.var.upstream_addr after using more than one set_current_peer[m
[31m---- wait: 0.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_CWD/lib/?.lua;;";[m
[31m-    proxy_next_upstream_tries 3;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            local balancer = require "ngx.balancer"[m
[31m-            if ngx.ctx.tries == nil then[m
[31m-                balancer.set_more_tries(1)[m
[31m-                ngx.ctx.tries = 1[m
[31m-                balancer.set_current_peer("127.0.0.3", 12345)[m
[31m-            else[m
[31m-                balancer.set_current_peer("127.0.0.3", 12346)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-        log_by_lua_block {[m
[31m-            ngx.log(ngx.INFO, "ngx.var.upstream_addr is " .. ngx.var.upstream_addr)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log[m
[31m-[lua] log_by_lua(nginx.conf:59):2: ngx.var.upstream_addr is 127.0.0.3:12345, 127.0.0.3:12346[m
[31m---- no_error_log[m
[31m-[alert][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/chain.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/chain.der[m
[1mdeleted file mode 100644[m
[1mindex ee6d9ba..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/chain.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/chain.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/chain.pem[m
[1mdeleted file mode 100644[m
[1mindex 21b704f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/chain.pem[m
[1m+++ /dev/null[m
[36m@@ -1,172 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4100 (0x1004)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, O=OpenResty, CN=Signing-CA-2[m
[31m-        Validity[m
[31m-            Not Before: Sep 20 05:27:46 2014 GMT[m
[31m-            Not After : Aug 27 05:27:46 2114 GMT[m
[31m-        Subject: C=US, ST=California, O=OpenResty, CN=test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:d8:53:ac:ac:5c:3f:f9:80:a8:96:4b:b0:58:db:[m
[31m-                    5a:86:de:ca:30:02:d9:19:c8:f6:14:c5:40:c9:41:[m
[31m-                    eb:bb:7a:d1:e1:f9:96:3b:54:d5:e8:bf:ac:50:5a:[m
[31m-                    49:11:da:99:60:44:e0:25:68:40:36:7c:f6:ce:b4:[m
[31m-                    9c:b9:58:d6:ea:e7:44:98:63:eb:a2:72:f8:e9:69:[m
[31m-                    b4:4a:4d:68:86:41:ca:67:58:61:e6:70:e8:08:fe:[m
[31m-                    ad:c2:75:59:24:0e:f0:2f:1a:70:83:8c:a3:77:64:[m
[31m-                    e8:4d:d5:c5:28:62:a9:53:d1:a1:22:f5:36:43:a7:[m
[31m-                    46:00:aa:97:54:72:d4:72:47[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                1F:DB:C0:D9:3C:4B:77:A8:9A:AC:33:1F:7B:70:C4:CF:BA:C8:07:DD[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:39:77:77:A3:4E:92:8B:E2:25:20:72:64:35:0A:7A:87:A8:58:A9:F8[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         1e:cd:83:66:b1:db:ea:5c:37:7e:bc:31:44:52:72:03:ae:9b:[m
[31m-         44:20:2c:ad:00:20:a5:dc:cf:9d:c8:c8:8f:df:cf:24:26:9c:[m
[31m-         43:83:f4:d2:ff:eb:d9:e4:7d:25:cf:1f:b8:aa:63:58:03:b9:[m
[31m-         da:52:42:f8:fe:2e:71:cc:8f:de:26:34:cd:da:5c:7a:3b:64:[m
[31m-         07:18:27:a1:61:b6:58:32:96:10:97:f2:7f:00:c4:44:43:b7:[m
[31m-         9d:e2:31:69:4f:c2:95:c5:a3:32:d1:c0:00:c6:ef:58:b9:0f:[m
[31m-         e6:08:3a:0d:c9:c0:14:f7:26:8c:43:13:55:1b:93:71:72:c7:[m
[31m-         ad:2f[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICijCCAfOgAwIBAgICEAQwDQYJKoZIhvcNAQEFBQAwTTELMAkGA1UEBhMCVVMx[m
[31m-EzARBgNVBAgMCkNhbGlmb3JuaWExEjAQBgNVBAoMCU9wZW5SZXN0eTEVMBMGA1UE[m
[31m-AwwMU2lnbmluZy1DQS0yMCAXDTE0MDkyMDA1Mjc0NloYDzIxMTQwODI3MDUyNzQ2[m
[31m-WjBJMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTESMBAGA1UECgwJ[m
[31m-T3BlblJlc3R5MREwDwYDVQQDDAh0ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB[m
[31m-jQAwgYkCgYEA2FOsrFw/+YColkuwWNtaht7KMALZGcj2FMVAyUHru3rR4fmWO1TV[m
[31m-6L+sUFpJEdqZYETgJWhANnz2zrScuVjW6udEmGPronL46Wm0Sk1ohkHKZ1hh5nDo[m
[31m-CP6twnVZJA7wLxpwg4yjd2ToTdXFKGKpU9GhIvU2Q6dGAKqXVHLUckcCAwEAAaN7[m
[31m-MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQg[m
[31m-Q2VydGlmaWNhdGUwHQYDVR0OBBYEFB/bwNk8S3eomqwzH3twxM+6yAfdMB8GA1Ud[m
[31m-IwQYMBaAFDl3d6NOkoviJSByZDUKeoeoWKn4MA0GCSqGSIb3DQEBBQUAA4GBAB7N[m
[31m-g2ax2+pcN368MURScgOum0QgLK0AIKXcz53IyI/fzyQmnEOD9NL/69nkfSXPH7iq[m
[31m-Y1gDudpSQvj+LnHMj94mNM3aXHo7ZAcYJ6FhtlgylhCX8n8AxERDt53iMWlPwpXF[m
[31m-ozLRwADG71i5D+YIOg3JwBT3JoxDE1Ubk3Fyx60v[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4098 (0x1002)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=San Francisco, O=OpenResty, CN=Root CA[m
[31m-        Validity[m
[31m-            Not Before: Sep 20 05:09:05 2014 GMT[m
[31m-            Not After : Aug 27 05:09:05 2114 GMT[m
[31m-        Subject: C=US, ST=California, O=OpenResty, CN=Signing-CA-1[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:b9:9a:3d:b6:31:dd:b6:8a:f1:9f:61:25:79:70:[m
[31m-                    f6:ea:4b:6a:0f:0c:72:ea:45:fc:4d:51:cf:f5:71:[m
[31m-                    88:94:9c:f9:04:40:99:fd:2d:17:15:3a:de:5f:70:[m
[31m-                    4a:06:79:13:fb:81:49:ad:da:59:44:12:81:74:9d:[m
[31m-                    d8:19:3e:4e:e8:c7:00:ee:f9:96:81:7a:bf:09:e6:[m
[31m-                    88:b0:e3:b2:e8:ca:e3:72:23:e4:86:83:41:ca:b3:[m
[31m-                    49:c0:f5:76:8a:d7:b5:fc:a3:12:1b:2b:0b:b4:57:[m
[31m-                    10:24:97:40:be:cb:17:e7:c5:de:93:1b:59:94:ff:[m
[31m-                    34:3f:cd:4d:14:76:09:0e:f3[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                12:57:8E:2C:9B:CA:C9:8D:F8:88:B1:4D:EE:A6:6D:F3:99:C3:AF:E1[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:56:65:C9:8B:65:55:27:2E:AB:14:F0:26:46:BD:BB:9E:A1:2B:41:58[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         1e:fb:6f:3e:12:bd:45:11:59:52:d5:60:ff:7c:73:9e:32:ce:[m
[31m-         76:fa:0b:b6:4a:58:68:db:92:a4:a0:d2:63:24:27:9c:6a:c5:[m
[31m-         6c:fa:84:d4:b5:80:93:b0:79:8f:33:c6:06:99:49:81:99:f4:[m
[31m-         52:ba:bd:ff:6e:f5:69:3f:65:e0:59:51:ce:16:66:2f:39:b5:[m
[31m-         31:ff:18:2a:a4:8e:14:77:7b:a2:2c:54:4b:f0:a5:2c:83:12:[m
[31m-         c4:d5:1c:4a:5f:7b:31:26:ed:63:ba:d5:83:e2:b5:1d:c3:f3:[m
[31m-         34:a0:ba:dd:ee:87:ee:70:71:ae:1b:c5:97:9b:08:a6:9c:ad:[m
[31m-         c0:c2[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICdjCCAd+gAwIBAgICEAIwDQYJKoZIhvcNAQEFBQAwYDELMAkGA1UEBhMCVVMx[m
[31m-EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQ[m
[31m-BgNVBAoMCU9wZW5SZXN0eTEQMA4GA1UEAwwHUm9vdCBDQTAgFw0xNDA5MjAwNTA5[m
[31m-MDVaGA8yMTE0MDgyNzA1MDkwNVowTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh[m
[31m-bGlmb3JuaWExEjAQBgNVBAoMCU9wZW5SZXN0eTEVMBMGA1UEAwwMU2lnbmluZy1D[m
[31m-QS0xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5mj22Md22ivGfYSV5cPbq[m
[31m-S2oPDHLqRfxNUc/1cYiUnPkEQJn9LRcVOt5fcEoGeRP7gUmt2llEEoF0ndgZPk7o[m
[31m-xwDu+ZaBer8J5oiw47LoyuNyI+SGg0HKs0nA9XaK17X8oxIbKwu0VxAkl0C+yxfn[m
[31m-xd6TG1mU/zQ/zU0UdgkO8wIDAQABo1AwTjAdBgNVHQ4EFgQUEleOLJvKyY34iLFN[m
[31m-7qZt85nDr+EwHwYDVR0jBBgwFoAUVmXJi2VVJy6rFPAmRr27nqErQVgwDAYDVR0T[m
[31m-BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAe+28+Er1FEVlS1WD/fHOeMs52+gu2[m
[31m-Slho25KkoNJjJCecasVs+oTUtYCTsHmPM8YGmUmBmfRSur3/bvVpP2XgWVHOFmYv[m
[31m-ObUx/xgqpI4Ud3uiLFRL8KUsgxLE1RxKX3sxJu1jutWD4rUdw/M0oLrd7ofucHGu[m
[31m-G8WXmwimnK3Awg==[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4099 (0x1003)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, O=OpenResty, CN=Signing-CA-1[m
[31m-        Validity[m
[31m-            Not Before: Sep 20 05:25:04 2014 GMT[m
[31m-            Not After : Aug 27 05:25:04 2114 GMT[m
[31m-        Subject: C=US, ST=California, O=OpenResty, CN=Signing-CA-2[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:a4:d0:ae:16:a8:8f:9d:2c:ee:12:f5:0c:5e:29:[m
[31m-                    65:9b:cc:9b:67:6f:40:24:d7:44:ff:d4:de:8d:d4:[m
[31m-                    36:1c:e1:37:2b:df:ff:69:35:6d:0b:4f:ae:9a:16:[m
[31m-                    e7:a9:c6:24:d3:8e:a4:c3:2f:25:d8:f3:66:73:8e:[m
[31m-                    84:8e:9c:a6:c7:f9:ce:8c:b7:9d:60:26:85:4c:8f:[m
[31m-                    f4:43:17:af:9d:94:1a:f5:21:7b:1c:2b:9c:ee:fe:[m
[31m-                    4a:ca:6d:c7:cf:ee:2a:02:28:1f:6e:13:94:85:3f:[m
[31m-                    50:a3:03:18:bd:6c:f9:b5:9d:37:b9:27:61:29:75:[m
[31m-                    d3:39:77:5e:83:41:aa:8c:21[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                39:77:77:A3:4E:92:8B:E2:25:20:72:64:35:0A:7A:87:A8:58:A9:F8[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:12:57:8E:2C:9B:CA:C9:8D:F8:88:B1:4D:EE:A6:6D:F3:99:C3:AF:E1[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         3b:4b:b6:31:51:72:9a:ef:42:60:5e:98:60:71:d7:26:4a:46:[m
[31m-         f1:0e:1f:08:be:e6:1b:5f:e2:fd:28:54:8d:b1:c5:09:6f:04:[m
[31m-         cb:69:dc:39:5e:67:e0:91:9f:10:94:bc:35:90:4a:65:fe:58:[m
[31m-         bd:e9:9d:18:f0:b2:c4:2c:6e:05:00:a4:63:59:6a:85:cf:0e:[m
[31m-         28:3a:ad:34:1c:1e:8c:08:cf:ac:79:18:e6:2b:16:49:9c:0b:[m
[31m-         09:66:50:29:53:78:04:9e:3d:27:40:c4:0c:72:d6:8c:d6:b1:[m
[31m-         9c:f5:f2:f8:8c:9c:0b:0d:e1:4b:9b:ec:c9:65:0c:1e:fe:27:[m
[31m-         07:96[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICYzCCAcygAwIBAgICEAMwDQYJKoZIhvcNAQEFBQAwTTELMAkGA1UEBhMCVVMx[m
[31m-EzARBgNVBAgMCkNhbGlmb3JuaWExEjAQBgNVBAoMCU9wZW5SZXN0eTEVMBMGA1UE[m
[31m-AwwMU2lnbmluZy1DQS0xMCAXDTE0MDkyMDA1MjUwNFoYDzIxMTQwODI3MDUyNTA0[m
[31m-WjBNMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTESMBAGA1UECgwJ[m
[31m-T3BlblJlc3R5MRUwEwYDVQQDDAxTaWduaW5nLUNBLTIwgZ8wDQYJKoZIhvcNAQEB[m
[31m-BQADgY0AMIGJAoGBAKTQrhaoj50s7hL1DF4pZZvMm2dvQCTXRP/U3o3UNhzhNyvf[m
[31m-/2k1bQtPrpoW56nGJNOOpMMvJdjzZnOOhI6cpsf5zoy3nWAmhUyP9EMXr52UGvUh[m
[31m-exwrnO7+Ssptx8/uKgIoH24TlIU/UKMDGL1s+bWdN7knYSl10zl3XoNBqowhAgMB[m
[31m-AAGjUDBOMB0GA1UdDgQWBBQ5d3ejTpKL4iUgcmQ1CnqHqFip+DAfBgNVHSMEGDAW[m
[31m-gBQSV44sm8rJjfiIsU3upm3zmcOv4TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB[m
[31m-BQUAA4GBADtLtjFRcprvQmBemGBx1yZKRvEOHwi+5htf4v0oVI2xxQlvBMtp3Dle[m
[31m-Z+CRnxCUvDWQSmX+WL3pnRjwssQsbgUApGNZaoXPDig6rTQcHowIz6x5GOYrFkmc[m
[31m-CwlmUClTeASePSdAxAxy1ozWsZz18viMnAsN4Uub7MllDB7+JweW[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/root-ca.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/root-ca.crt[m
[1mdeleted file mode 100644[m
[1mindex d2f3c8f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/root-ca.crt[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICkDCCAfmgAwIBAgIJAK3s1yAQ5tdfMA0GCSqGSIb3DQEBBQUAMGAxCzAJBgNV[m
[31m-BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNp[m
[31m-c2NvMRIwEAYDVQQKDAlPcGVuUmVzdHkxEDAOBgNVBAMMB1Jvb3QgQ0EwIBcNMTQw[m
[31m-OTIwMDM1NTU0WhgPMjExNDA4MjcwMzU1NTRaMGAxCzAJBgNVBAYTAlVTMRMwEQYD[m
[31m-VQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMRIwEAYDVQQK[m
[31m-DAlPcGVuUmVzdHkxEDAOBgNVBAMMB1Jvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQAD[m
[31m-gY0AMIGJAoGBAN7CcpCjiafBdl1KaExRcuutAF0/eq4/ht7L4/i0nPDzikscFJ/O[m
[31m-aVyH3UpUF/KMq+72vom2bEbUeRROr1rL/JRe9raGlQtvdovHZt6f4c3/Coihtupp[m
[31m-9BXYrBCU4P+Bxai5gtTXGFvLC2a72qKcXDNeH+NxpIaemfPxSvemCYUXAgMBAAGj[m
[31m-UDBOMB0GA1UdDgQWBBRWZcmLZVUnLqsU8CZGvbueoStBWDAfBgNVHSMEGDAWgBRW[m
[31m-ZcmLZVUnLqsU8CZGvbueoStBWDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAGjMH6qkY+61311DERFhDuYzMSSZjH53qzFseq/chlIMGjrgJIMy6rl7T0AU[m
[31m-2hjvW+FOyhf5NqRrAQDTTuLbtXZ/ygiUformE8lR/SNRY/DVj1yarQkWUC5UpqOs[m
[31m-GWG1VW9DHQAMFVkYwPO3XKeTXpEFOxPLHtXBYcVemCT4zo42[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/test-com.key.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/test-com.key.der[m
[1mdeleted file mode 100644[m
[1mindex 3a19bbc..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/test-com.key.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/test-com.key.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/test-com.key.pem[m
[1mdeleted file mode 100644[m
[1mindex 883ea79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/chain/test-com.key.pem[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXAIBAAKBgQDYU6ysXD/5gKiWS7BY21qG3sowAtkZyPYUxUDJQeu7etHh+ZY7[m
[31m-VNXov6xQWkkR2plgROAlaEA2fPbOtJy5WNbq50SYY+uicvjpabRKTWiGQcpnWGHm[m
[31m-cOgI/q3CdVkkDvAvGnCDjKN3ZOhN1cUoYqlT0aEi9TZDp0YAqpdUctRyRwIDAQAB[m
[31m-AoGBAIl/5elIWYGFPaMKSPSxuECxq2II7WVuTru1BRDnTabE0lMICW185tohuqz4[m
[31m-NimbAJIoNTCRqv73Pwjz1AobZb6Nm7TDaahhstak6IlTYKcjXVBuM/UU4G13Kz/f[m
[31m-hNVblv2cCn9CkeTNOvPZjYJXw/c4XlHasjDMMh8S83Q9095BAkEA+6oPzEiSsdo5[m
[31m-RX9D0EV+Uv4ID08johKbcZdGbsp+mo+PQ9CYOlE67QcKf8J4Hp2SFmq7mpTvvS7F[m
[31m-tA/a2WwJswJBANwNwsJre3QPJmJCBAGsIrPrw9rFKLiT0/ajyhT7kKfG4Rw9t55S[m
[31m-lY9VPFOxAJF9lDo4QiFUHi/8Htvd0B78wx0CQFh5cRRgbzIXhgrosu6Ff+Otayf2[m
[31m-qpBP+lX02M4aYmf0EGnG672U0SKDVy2TMKeSvckjvNCbi6z2xIqJCGdnlAECQFTh[m
[31m-+f6E91oNfgDo9iKvA7PjfeklpE+OtnStOYZeg640SSFbrTilIovnlR2zaUS17DeI[m
[31m-+/lfOUXJOx4UsfNCDQECQD7nndBJDJeSggFSJKcZ0RI59NVG8eGRSX7/3ycbq6+t[m
[31m-guGI7WBvhDH4jNNL8jhuE+XuJuhhzOwP85872AFgIgw=[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/chain.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/chain.pem[m
[1mdeleted file mode 100644[m
[1mindex 4743a36..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/chain.pem[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4 (0x4)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:c7:bd:50:99:71:46:af:93:22:85:ab:74:8b:5b:[m
[31m-                    19:74:af:3e:ad:d2:e1:17:3e:cb:5b:36:9c:8a:38:[m
[31m-                    bd:1b:47:2d:8b:92:55:1d:fe:a6:72:92:78:00:de:[m
[31m-                    30:cb:a3:10:b5:92:aa:b8:e0:7b:44:9a:f5:99:89:[m
[31m-                    36:f4:84:20:81:e3:5c:76:00:9d:76:e7:b9:41:ab:[m
[31m-                    74:b6:14:9f:b2:94:b3:b6:48:a8:92:dc:09:e3:3d:[m
[31m-                    04:e3:5f:0f:5b:50:ad:0c:59:3a:88:06:39:2d:34:[m
[31m-                    a6:52:2f:58:6f:53:1b:df:9f:98:ea:82:8d:52:60:[m
[31m-                    b1:ef:6b:e9:f5:ad:29:87:45[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                67:DF:28:25:D1:F8:83:36:28:EE:DB:41:63:E4:E0:3A:32:0D:EA:30[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-                DirName:/C=US/ST=California/L=Default City/O=OpenResty/CN=signing-ca-1[m
[31m-                serial:03[m
[31m-[m
[31m-            Authority Information Access: [m
[31m-                OCSP - URI:http://127.0.0.1:8888/ocsp?foo=1[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         37:29:3f:ed:d9:47:9a:51:36:a3:5b:00:85:66:de:51:4d:48:[m
[31m-         2d:f8:bc:f1:5e:b4:fd:30:48:f0:25:ee:77:57:9c:f1:4b:0a:[m
[31m-         4f:7e:96:1a:f8:48:76:23:46:8d:d6:f2:5e:1e:08:52:12:53:[m
[31m-         08:07:9f:75:db:77:22:2e:7e:89:c2:2c:66:85:6b:df:e9:77:[m
[31m-         ca:23:6d:9a:af:87:8a:8c:27:37:1e:9e:55:92:8e:8a:a9:93:[m
[31m-         24:41:a8:96:01:c0:65:93:8e:3d:7a:6c:bf:ed:c8:2a:f8:26:[m
[31m-         cc:00:17:b7:27:ca:85:6c:2e:d5:2a:0a:8d:f3:88:e8:26:48:[m
[31m-         e3:e8[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDaTCCAtKgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMjAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MREwDwYDVQQDEwh0ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw[m
[31m-gYkCgYEAx71QmXFGr5Mihat0i1sZdK8+rdLhFz7LWzaciji9G0cti5JVHf6mcpJ4[m
[31m-AN4wy6MQtZKquOB7RJr1mYk29IQggeNcdgCddue5Qat0thSfspSztkioktwJ4z0E[m
[31m-418PW1CtDFk6iAY5LTSmUi9Yb1Mb35+Y6oKNUmCx72vp9a0ph0UCAwEAAaOCASsw[m
[31m-ggEnMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk[m
[31m-IENlcnRpZmljYXRlMB0GA1UdDgQWBBRn3ygl0fiDNiju20Fj5OA6Mg3qMDCBjgYD[m
[31m-VR0jBIGGMIGDgBSzC/V9URZRfig3w6IPHS8QwFGjs6FopGYwZDELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTES[m
[31m-MBAGA1UEChMJT3BlblJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTGCAQMwPAYI[m
[31m-KwYBBQUHAQEEMDAuMCwGCCsGAQUFBzABhiBodHRwOi8vMTI3LjAuMC4xOjg4ODgv[m
[31m-b2NzcD9mb289MTANBgkqhkiG9w0BAQUFAAOBgQA3KT/t2UeaUTajWwCFZt5RTUgt[m
[31m-+LzxXrT9MEjwJe53V5zxSwpPfpYa+Eh2I0aN1vJeHghSElMIB59123ciLn6Jwixm[m
[31m-hWvf6XfKI22ar4eKjCc3Hp5Vko6KqZMkQaiWAcBlk449emy/7cgq+CbMABe3J8qF[m
[31m-bC7VKgqN84joJkjj6A==[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 3 (0x3)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:d3:24:1c:92:a5:bb:00:d9:b1:fb:2b:1d:7a:32:[m
[31m-                    a1:6c:49:eb:3c:2d:29:80:d6:65:8b:17:3a:f0:4b:[m
[31m-                    dc:0c:57:fb:d5:31:68:a5:e4:54:86:55:f9:1b:a8:[m
[31m-                    d7:7d:32:01:3b:cf:5c:38:2b:f5:bc:d3:8b:c8:b6:[m
[31m-                    ab:76:65:32:e6:4b:d5:e4:fd:d1:92:c8:33:6a:74:[m
[31m-                    f3:c7:ec:97:c3:c7:9f:e4:d5:55:75:b8:bd:39:ec:[m
[31m-                    2d:1f:c6:54:c8:2b:2d:17:e0:05:77:28:44:f7:dd:[m
[31m-                    e1:6e:f0:59:05:51:f5:b9:b4:fe:be:ad:40:a6:d5:[m
[31m-                    9a:c1:64:e0:9b:dd:67:e5:f1[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         0c:61:c0:c7:11:c2:f0:39:f0:76:9d:4f:43:d4:90:54:1f:26:[m
[31m-         3d:54:3d:77:5f:c0:b3:4a:c2:1b:b6:18:d2:12:8d:24:4d:76:[m
[31m-         f5:07:0b:14:3e:17:2d:42:ee:85:30:db:e3:4d:81:67:59:97:[m
[31m-         0a:b3:bb:c5:27:ea:69:c6:ee:99:5c:44:36:53:3e:c4:47:68:[m
[31m-         f8:fe:c6:53:38:fb:e7:9a:0c:3c:6c:78:93:29:d2:49:7d:29:[m
[31m-         d0:61:6e:81:9b:d6:ec:1a:e2:3e:62:62:41:bc:6d:4d:33:91:[m
[31m-         76:20:5e:32:70:08:3e:24:72:fe:b1:8a:83:57:04:19:b5:cb:[m
[31m-         99:b7[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICkDCCAfmgAwIBAgIBAzANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMTAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowZDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTIwgZ8wDQYJKoZIhvcNAQEBBQAD[m
[31m-gY0AMIGJAoGBANMkHJKluwDZsfsrHXoyoWxJ6zwtKYDWZYsXOvBL3AxX+9UxaKXk[m
[31m-VIZV+Ruo130yATvPXDgr9bzTi8i2q3ZlMuZL1eT90ZLIM2p088fsl8PHn+TVVXW4[m
[31m-vTnsLR/GVMgrLRfgBXcoRPfd4W7wWQVR9bm0/r6tQKbVmsFk4JvdZ+XxAgMBAAGj[m
[31m-UDBOMB0GA1UdDgQWBBSzC/V9URZRfig3w6IPHS8QwFGjszAfBgNVHSMEGDAWgBTS[m
[31m-MHFWUKa8IcWhoasRpwhb6zqkJzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAAxhwMcRwvA58HadT0PUkFQfJj1UPXdfwLNKwhu2GNISjSRNdvUHCxQ+Fy1C[m
[31m-7oUw2+NNgWdZlwqzu8Un6mnG7plcRDZTPsRHaPj+xlM4++eaDDxseJMp0kl9KdBh[m
[31m-boGb1uwa4j5iYkG8bU0zkXYgXjJwCD4kcv6xioNXBBm1y5m3[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 2 (0x2)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=root-ca[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:a0:3e:1a:4f:6c:b9:3d:ab:0f:02:de:da:82:92:[m
[31m-                    ee:a2:69:88:80:ed:f2:b6:98:bc:c6:ee:d3:47:82:[m
[31m-                    4a:e7:d3:7f:55:68:5c:6d:9e:aa:ba:59:e3:5b:7f:[m
[31m-                    32:4f:79:44:4a:4f:13:e4:2e:3f:1f:98:10:a4:72:[m
[31m-                    d5:f0:e7:44:8e:d4:a7:b9:fb:54:be:b6:fa:f7:dc:[m
[31m-                    9c:29:93:d4:9f:a1:5b:18:6e:68:93:91:1b:8c:a0:[m
[31m-                    4f:02:52:e9:9d:e8:98:f3:fd:67:da:78:4b:4f:d8:[m
[31m-                    2d:90:83:5c:0b:e5:fe:48:27:e4:ec:bb:99:26:06:[m
[31m-                    8e:34:fe:93:e4:d2:fc:97:57[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:1D:2F:09:60:EB:E4:EA:B5:0B:52:A9:5C:5E:09:2B:DD:34:70:CF:BA[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         a6:16:2f:fc:13:67:5e:ce:0e:79:cb:b0:91:52:9b:9e:b5:9f:[m
[31m-         e1:fa:7d:78:f4:2a:93:f3:94:62:45:17:87:b9:0a:59:b9:a3:[m
[31m-         a9:75:51:ca:f0:04:6c:01:d1:3a:a9:dd:66:7d:27:7b:1e:4f:[m
[31m-         48:3a:25:ea:a5:01:32:fc:87:4b:08:da:f8:f5:62:88:e8:b9:[m
[31m-         94:c7:cb:ee:33:08:ab:2f:52:f4:4a:14:4f:ac:2d:a2:f8:de:[m
[31m-         c9:6f:95:b7:91:23:b9:ec:95:90:de:86:21:f5:6f:1b:cf:13:[m
[31m-         47:77:78:dd:7a:16:e9:8b:cc:df:3d:45:8a:76:af:15:d1:9a:[m
[31m-         37:a2[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICizCCAfSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxEDAOBgNVBAMTB3Jvb3QtY2EwIBcNMTQxMDE2MDMyNzA5[m
[31m-WhgPMjExNDA5MjIwMzI3MDlaMGQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxp[m
[31m-Zm9ybmlhMRUwEwYDVQQHEwxEZWZhdWx0IENpdHkxEjAQBgNVBAoTCU9wZW5SZXN0[m
[31m-eTEVMBMGA1UEAxMMc2lnbmluZy1jYS0xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB[m
[31m-iQKBgQCgPhpPbLk9qw8C3tqCku6iaYiA7fK2mLzG7tNHgkrn039VaFxtnqq6WeNb[m
[31m-fzJPeURKTxPkLj8fmBCkctXw50SO1Ke5+1S+tvr33Jwpk9SfoVsYbmiTkRuMoE8C[m
[31m-Uumd6Jjz/WfaeEtP2C2Qg1wL5f5IJ+Tsu5kmBo40/pPk0vyXVwIDAQABo1AwTjAd[m
[31m-BgNVHQ4EFgQU0jBxVlCmvCHFoaGrEacIW+s6pCcwHwYDVR0jBBgwFoAUHS8JYOvk[m
[31m-6rULUqlcXgkr3TRwz7owDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCm[m
[31m-Fi/8E2dezg55y7CRUpuetZ/h+n149CqT85RiRReHuQpZuaOpdVHK8ARsAdE6qd1m[m
[31m-fSd7Hk9IOiXqpQEy/IdLCNr49WKI6LmUx8vuMwirL1L0ShRPrC2i+N7Jb5W3kSO5[m
[31m-7JWQ3oYh9W8bzxNHd3jdehbpi8zfPUWKdq8V0Zo3og==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-req.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-req.der[m
[1mdeleted file mode 100644[m
[1mindex f125311..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-req.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-no-certs.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-no-certs.der[m
[1mdeleted file mode 100644[m
[1mindex 01a45cf..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-no-certs.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned-no-certs.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned-no-certs.der[m
[1mdeleted file mode 100644[m
[1mindex 61c775f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned-no-certs.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned.der[m
[1mdeleted file mode 100644[m
[1mindex 506dbd2..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp-signed-by-orphaned.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp.der[m
[1mdeleted file mode 100644[m
[1mindex 1fe910f..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/ocsp-resp.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/revoked-chain.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/revoked-chain.pem[m
[1mdeleted file mode 100644[m
[1mindex 3f98b7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/revoked-chain.pem[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 8 (0x8)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=revoked-test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:ca:50:23:9a:59:70:ea:00:47:ff:72:05:29:9b:[m
[31m-                    5d:6d:4b:73:37:a4:ff:38:20:4b:5b:ac:1f:3b:34:[m
[31m-                    f5:12:f8:8b:0e:02:bc:bd:14:34:39:6f:7d:5b:1f:[m
[31m-                    d4:15:e7:64:2e:65:fb:b1:a8:aa:f6:96:d3:e6:2b:[m
[31m-                    00:0e:f3:8a:ef:99:ab:3e:e6:5d:eb:6d:a6:4a:d0:[m
[31m-                    aa:ff:a9:d6:9a:41:f0:66:22:0a:38:9c:28:4f:1f:[m
[31m-                    0d:cf:a2:79:96:f9:fc:3d:1e:83:70:f5:97:6e:07:[m
[31m-                    cf:a2:17:87:0d:2a:41:19:3a:44:96:89:e7:0d:cb:[m
[31m-                    88:20:86:e1:de:08:8b:0d:db[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                FB:98:2B:56:90:69:E1:B4:2B:C2:DB:25:7C:13:87:D5:D7:BC:70:B6[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-                DirName:/C=US/ST=California/L=Default City/O=OpenResty/CN=signing-ca-1[m
[31m-                serial:03[m
[31m-[m
[31m-            Authority Information Access: [m
[31m-                OCSP - URI:http://127.0.0.1:8888/ocsp?foo=1[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         43:77:33:e9:cc:b1:42:35:94:0a:57:a5:dd:94:21:c0:cc:42:[m
[31m-         04:81:bd:b2:ac:4d:10:68:f3:fe:33:0a:8e:b9:3e:e9:f2:44:[m
[31m-         aa:1c:e7:3e:e8:e0:57:40:41:ef:4a:b1:32:b0:f2:75:7c:aa:[m
[31m-         77:d2:64:9d:ba:a1:12:ea:f9:83:31:ba:9f:83:58:1c:38:e9:[m
[31m-         d0:a6:dd:04:72:85:d1:2d:c7:3b:b2:71:ef:e4:f6:57:0c:6a:[m
[31m-         b6:fc:e5:13:2d:be:a6:c1:f4:4b:4d:c8:69:cc:7c:2e:25:c1:[m
[31m-         8e:80:9e:19:c3:17:b2:21:a7:af:e8:2f:f1:d4:bb:8c:a3:39:[m
[31m-         be:49[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDcTCCAtqgAwIBAgIBCDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMjAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowaDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MRkwFwYDVQQDExByZXZva2VkLXRlc3QuY29tMIGfMA0GCSqGSIb3DQEB[m
[31m-AQUAA4GNADCBiQKBgQDKUCOaWXDqAEf/cgUpm11tS3M3pP84IEtbrB87NPUS+IsO[m
[31m-Ary9FDQ5b31bH9QV52QuZfuxqKr2ltPmKwAO84rvmas+5l3rbaZK0Kr/qdaaQfBm[m
[31m-Igo4nChPHw3PonmW+fw9HoNw9ZduB8+iF4cNKkEZOkSWiecNy4gghuHeCIsN2wID[m
[31m-AQABo4IBKzCCAScwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH[m
[31m-ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFPuYK1aQaeG0K8LbJXwTh9XX[m
[31m-vHC2MIGOBgNVHSMEgYYwgYOAFLML9X1RFlF+KDfDog8dLxDAUaOzoWikZjBkMQsw[m
[31m-CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVs[m
[31m-dCBDaXR5MRIwEAYDVQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2Et[m
[31m-MYIBAzA8BggrBgEFBQcBAQQwMC4wLAYIKwYBBQUHMAGGIGh0dHA6Ly8xMjcuMC4w[m
[31m-LjE6ODg4OC9vY3NwP2Zvbz0xMA0GCSqGSIb3DQEBBQUAA4GBAEN3M+nMsUI1lApX[m
[31m-pd2UIcDMQgSBvbKsTRBo8/4zCo65PunyRKoc5z7o4FdAQe9KsTKw8nV8qnfSZJ26[m
[31m-oRLq+YMxup+DWBw46dCm3QRyhdEtxzuyce/k9lcMarb85RMtvqbB9EtNyGnMfC4l[m
[31m-wY6AnhnDF7Ihp6/oL/HUu4yjOb5J[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 3 (0x3)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:d3:24:1c:92:a5:bb:00:d9:b1:fb:2b:1d:7a:32:[m
[31m-                    a1:6c:49:eb:3c:2d:29:80:d6:65:8b:17:3a:f0:4b:[m
[31m-                    dc:0c:57:fb:d5:31:68:a5:e4:54:86:55:f9:1b:a8:[m
[31m-                    d7:7d:32:01:3b:cf:5c:38:2b:f5:bc:d3:8b:c8:b6:[m
[31m-                    ab:76:65:32:e6:4b:d5:e4:fd:d1:92:c8:33:6a:74:[m
[31m-                    f3:c7:ec:97:c3:c7:9f:e4:d5:55:75:b8:bd:39:ec:[m
[31m-                    2d:1f:c6:54:c8:2b:2d:17:e0:05:77:28:44:f7:dd:[m
[31m-                    e1:6e:f0:59:05:51:f5:b9:b4:fe:be:ad:40:a6:d5:[m
[31m-                    9a:c1:64:e0:9b:dd:67:e5:f1[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         0c:61:c0:c7:11:c2:f0:39:f0:76:9d:4f:43:d4:90:54:1f:26:[m
[31m-         3d:54:3d:77:5f:c0:b3:4a:c2:1b:b6:18:d2:12:8d:24:4d:76:[m
[31m-         f5:07:0b:14:3e:17:2d:42:ee:85:30:db:e3:4d:81:67:59:97:[m
[31m-         0a:b3:bb:c5:27:ea:69:c6:ee:99:5c:44:36:53:3e:c4:47:68:[m
[31m-         f8:fe:c6:53:38:fb:e7:9a:0c:3c:6c:78:93:29:d2:49:7d:29:[m
[31m-         d0:61:6e:81:9b:d6:ec:1a:e2:3e:62:62:41:bc:6d:4d:33:91:[m
[31m-         76:20:5e:32:70:08:3e:24:72:fe:b1:8a:83:57:04:19:b5:cb:[m
[31m-         99:b7[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICkDCCAfmgAwIBAgIBAzANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMTAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowZDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTIwgZ8wDQYJKoZIhvcNAQEBBQAD[m
[31m-gY0AMIGJAoGBANMkHJKluwDZsfsrHXoyoWxJ6zwtKYDWZYsXOvBL3AxX+9UxaKXk[m
[31m-VIZV+Ruo130yATvPXDgr9bzTi8i2q3ZlMuZL1eT90ZLIM2p088fsl8PHn+TVVXW4[m
[31m-vTnsLR/GVMgrLRfgBXcoRPfd4W7wWQVR9bm0/r6tQKbVmsFk4JvdZ+XxAgMBAAGj[m
[31m-UDBOMB0GA1UdDgQWBBSzC/V9URZRfig3w6IPHS8QwFGjszAfBgNVHSMEGDAWgBTS[m
[31m-MHFWUKa8IcWhoasRpwhb6zqkJzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAAxhwMcRwvA58HadT0PUkFQfJj1UPXdfwLNKwhu2GNISjSRNdvUHCxQ+Fy1C[m
[31m-7oUw2+NNgWdZlwqzu8Un6mnG7plcRDZTPsRHaPj+xlM4++eaDDxseJMp0kl9KdBh[m
[31m-boGb1uwa4j5iYkG8bU0zkXYgXjJwCD4kcv6xioNXBBm1y5m3[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 2 (0x2)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=root-ca[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:a0:3e:1a:4f:6c:b9:3d:ab:0f:02:de:da:82:92:[m
[31m-                    ee:a2:69:88:80:ed:f2:b6:98:bc:c6:ee:d3:47:82:[m
[31m-                    4a:e7:d3:7f:55:68:5c:6d:9e:aa:ba:59:e3:5b:7f:[m
[31m-                    32:4f:79:44:4a:4f:13:e4:2e:3f:1f:98:10:a4:72:[m
[31m-                    d5:f0:e7:44:8e:d4:a7:b9:fb:54:be:b6:fa:f7:dc:[m
[31m-                    9c:29:93:d4:9f:a1:5b:18:6e:68:93:91:1b:8c:a0:[m
[31m-                    4f:02:52:e9:9d:e8:98:f3:fd:67:da:78:4b:4f:d8:[m
[31m-                    2d:90:83:5c:0b:e5:fe:48:27:e4:ec:bb:99:26:06:[m
[31m-                    8e:34:fe:93:e4:d2:fc:97:57[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:1D:2F:09:60:EB:E4:EA:B5:0B:52:A9:5C:5E:09:2B:DD:34:70:CF:BA[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         a6:16:2f:fc:13:67:5e:ce:0e:79:cb:b0:91:52:9b:9e:b5:9f:[m
[31m-         e1:fa:7d:78:f4:2a:93:f3:94:62:45:17:87:b9:0a:59:b9:a3:[m
[31m-         a9:75:51:ca:f0:04:6c:01:d1:3a:a9:dd:66:7d:27:7b:1e:4f:[m
[31m-         48:3a:25:ea:a5:01:32:fc:87:4b:08:da:f8:f5:62:88:e8:b9:[m
[31m-         94:c7:cb:ee:33:08:ab:2f:52:f4:4a:14:4f:ac:2d:a2:f8:de:[m
[31m-         c9:6f:95:b7:91:23:b9:ec:95:90:de:86:21:f5:6f:1b:cf:13:[m
[31m-         47:77:78:dd:7a:16:e9:8b:cc:df:3d:45:8a:76:af:15:d1:9a:[m
[31m-         37:a2[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICizCCAfSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxEDAOBgNVBAMTB3Jvb3QtY2EwIBcNMTQxMDE2MDMyNzA5[m
[31m-WhgPMjExNDA5MjIwMzI3MDlaMGQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxp[m
[31m-Zm9ybmlhMRUwEwYDVQQHEwxEZWZhdWx0IENpdHkxEjAQBgNVBAoTCU9wZW5SZXN0[m
[31m-eTEVMBMGA1UEAxMMc2lnbmluZy1jYS0xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB[m
[31m-iQKBgQCgPhpPbLk9qw8C3tqCku6iaYiA7fK2mLzG7tNHgkrn039VaFxtnqq6WeNb[m
[31m-fzJPeURKTxPkLj8fmBCkctXw50SO1Ke5+1S+tvr33Jwpk9SfoVsYbmiTkRuMoE8C[m
[31m-Uumd6Jjz/WfaeEtP2C2Qg1wL5f5IJ+Tsu5kmBo40/pPk0vyXVwIDAQABo1AwTjAd[m
[31m-BgNVHQ4EFgQU0jBxVlCmvCHFoaGrEacIW+s6pCcwHwYDVR0jBBgwFoAUHS8JYOvk[m
[31m-6rULUqlcXgkr3TRwz7owDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCm[m
[31m-Fi/8E2dezg55y7CRUpuetZ/h+n149CqT85RiRReHuQpZuaOpdVHK8ARsAdE6qd1m[m
[31m-fSd7Hk9IOiXqpQEy/IdLCNr49WKI6LmUx8vuMwirL1L0ShRPrC2i+N7Jb5W3kSO5[m
[31m-7JWQ3oYh9W8bzxNHd3jdehbpi8zfPUWKdq8V0Zo3og==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/revoked-ocsp-resp.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/revoked-ocsp-resp.der[m
[1mdeleted file mode 100644[m
[1mindex 71d41a7..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/revoked-ocsp-resp.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/test-com.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/test-com.crt[m
[1mdeleted file mode 100644[m
[1mindex d34cb6b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/test-com.crt[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4 (0x4)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:c7:bd:50:99:71:46:af:93:22:85:ab:74:8b:5b:[m
[31m-                    19:74:af:3e:ad:d2:e1:17:3e:cb:5b:36:9c:8a:38:[m
[31m-                    bd:1b:47:2d:8b:92:55:1d:fe:a6:72:92:78:00:de:[m
[31m-                    30:cb:a3:10:b5:92:aa:b8:e0:7b:44:9a:f5:99:89:[m
[31m-                    36:f4:84:20:81:e3:5c:76:00:9d:76:e7:b9:41:ab:[m
[31m-                    74:b6:14:9f:b2:94:b3:b6:48:a8:92:dc:09:e3:3d:[m
[31m-                    04:e3:5f:0f:5b:50:ad:0c:59:3a:88:06:39:2d:34:[m
[31m-                    a6:52:2f:58:6f:53:1b:df:9f:98:ea:82:8d:52:60:[m
[31m-                    b1:ef:6b:e9:f5:ad:29:87:45[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                67:DF:28:25:D1:F8:83:36:28:EE:DB:41:63:E4:E0:3A:32:0D:EA:30[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-                DirName:/C=US/ST=California/L=Default City/O=OpenResty/CN=signing-ca-1[m
[31m-                serial:03[m
[31m-[m
[31m-            Authority Information Access: [m
[31m-                OCSP - URI:http://127.0.0.1:8888/ocsp?foo=1[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         37:29:3f:ed:d9:47:9a:51:36:a3:5b:00:85:66:de:51:4d:48:[m
[31m-         2d:f8:bc:f1:5e:b4:fd:30:48:f0:25:ee:77:57:9c:f1:4b:0a:[m
[31m-         4f:7e:96:1a:f8:48:76:23:46:8d:d6:f2:5e:1e:08:52:12:53:[m
[31m-         08:07:9f:75:db:77:22:2e:7e:89:c2:2c:66:85:6b:df:e9:77:[m
[31m-         ca:23:6d:9a:af:87:8a:8c:27:37:1e:9e:55:92:8e:8a:a9:93:[m
[31m-         24:41:a8:96:01:c0:65:93:8e:3d:7a:6c:bf:ed:c8:2a:f8:26:[m
[31m-         cc:00:17:b7:27:ca:85:6c:2e:d5:2a:0a:8d:f3:88:e8:26:48:[m
[31m-         e3:e8[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDaTCCAtKgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMjAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MREwDwYDVQQDEwh0ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw[m
[31m-gYkCgYEAx71QmXFGr5Mihat0i1sZdK8+rdLhFz7LWzaciji9G0cti5JVHf6mcpJ4[m
[31m-AN4wy6MQtZKquOB7RJr1mYk29IQggeNcdgCddue5Qat0thSfspSztkioktwJ4z0E[m
[31m-418PW1CtDFk6iAY5LTSmUi9Yb1Mb35+Y6oKNUmCx72vp9a0ph0UCAwEAAaOCASsw[m
[31m-ggEnMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk[m
[31m-IENlcnRpZmljYXRlMB0GA1UdDgQWBBRn3ygl0fiDNiju20Fj5OA6Mg3qMDCBjgYD[m
[31m-VR0jBIGGMIGDgBSzC/V9URZRfig3w6IPHS8QwFGjs6FopGYwZDELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTES[m
[31m-MBAGA1UEChMJT3BlblJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTGCAQMwPAYI[m
[31m-KwYBBQUHAQEEMDAuMCwGCCsGAQUFBzABhiBodHRwOi8vMTI3LjAuMC4xOjg4ODgv[m
[31m-b2NzcD9mb289MTANBgkqhkiG9w0BAQUFAAOBgQA3KT/t2UeaUTajWwCFZt5RTUgt[m
[31m-+LzxXrT9MEjwJe53V5zxSwpPfpYa+Eh2I0aN1vJeHghSElMIB59123ciLn6Jwixm[m
[31m-hWvf6XfKI22ar4eKjCc3Hp5Vko6KqZMkQaiWAcBlk449emy/7cgq+CbMABe3J8qF[m
[31m-bC7VKgqN84joJkjj6A==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/wrong-issuer-order-chain.pem b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/wrong-issuer-order-chain.pem[m
[1mdeleted file mode 100644[m
[1mindex 098e862..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/ocsp/wrong-issuer-order-chain.pem[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 4 (0x4)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=test.com[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:c7:bd:50:99:71:46:af:93:22:85:ab:74:8b:5b:[m
[31m-                    19:74:af:3e:ad:d2:e1:17:3e:cb:5b:36:9c:8a:38:[m
[31m-                    bd:1b:47:2d:8b:92:55:1d:fe:a6:72:92:78:00:de:[m
[31m-                    30:cb:a3:10:b5:92:aa:b8:e0:7b:44:9a:f5:99:89:[m
[31m-                    36:f4:84:20:81:e3:5c:76:00:9d:76:e7:b9:41:ab:[m
[31m-                    74:b6:14:9f:b2:94:b3:b6:48:a8:92:dc:09:e3:3d:[m
[31m-                    04:e3:5f:0f:5b:50:ad:0c:59:3a:88:06:39:2d:34:[m
[31m-                    a6:52:2f:58:6f:53:1b:df:9f:98:ea:82:8d:52:60:[m
[31m-                    b1:ef:6b:e9:f5:ad:29:87:45[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:FALSE[m
[31m-            Netscape Comment: [m
[31m-                OpenSSL Generated Certificate[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                67:DF:28:25:D1:F8:83:36:28:EE:DB:41:63:E4:E0:3A:32:0D:EA:30[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-                DirName:/C=US/ST=California/L=Default City/O=OpenResty/CN=signing-ca-1[m
[31m-                serial:03[m
[31m-[m
[31m-            Authority Information Access: [m
[31m-                OCSP - URI:http://127.0.0.1:8888/ocsp?foo=1[m
[31m-[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         37:29:3f:ed:d9:47:9a:51:36:a3:5b:00:85:66:de:51:4d:48:[m
[31m-         2d:f8:bc:f1:5e:b4:fd:30:48:f0:25:ee:77:57:9c:f1:4b:0a:[m
[31m-         4f:7e:96:1a:f8:48:76:23:46:8d:d6:f2:5e:1e:08:52:12:53:[m
[31m-         08:07:9f:75:db:77:22:2e:7e:89:c2:2c:66:85:6b:df:e9:77:[m
[31m-         ca:23:6d:9a:af:87:8a:8c:27:37:1e:9e:55:92:8e:8a:a9:93:[m
[31m-         24:41:a8:96:01:c0:65:93:8e:3d:7a:6c:bf:ed:c8:2a:f8:26:[m
[31m-         cc:00:17:b7:27:ca:85:6c:2e:d5:2a:0a:8d:f3:88:e8:26:48:[m
[31m-         e3:e8[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDaTCCAtKgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMjAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MREwDwYDVQQDEwh0ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw[m
[31m-gYkCgYEAx71QmXFGr5Mihat0i1sZdK8+rdLhFz7LWzaciji9G0cti5JVHf6mcpJ4[m
[31m-AN4wy6MQtZKquOB7RJr1mYk29IQggeNcdgCddue5Qat0thSfspSztkioktwJ4z0E[m
[31m-418PW1CtDFk6iAY5LTSmUi9Yb1Mb35+Y6oKNUmCx72vp9a0ph0UCAwEAAaOCASsw[m
[31m-ggEnMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk[m
[31m-IENlcnRpZmljYXRlMB0GA1UdDgQWBBRn3ygl0fiDNiju20Fj5OA6Mg3qMDCBjgYD[m
[31m-VR0jBIGGMIGDgBSzC/V9URZRfig3w6IPHS8QwFGjs6FopGYwZDELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTES[m
[31m-MBAGA1UEChMJT3BlblJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTGCAQMwPAYI[m
[31m-KwYBBQUHAQEEMDAuMCwGCCsGAQUFBzABhiBodHRwOi8vMTI3LjAuMC4xOjg4ODgv[m
[31m-b2NzcD9mb289MTANBgkqhkiG9w0BAQUFAAOBgQA3KT/t2UeaUTajWwCFZt5RTUgt[m
[31m-+LzxXrT9MEjwJe53V5zxSwpPfpYa+Eh2I0aN1vJeHghSElMIB59123ciLn6Jwixm[m
[31m-hWvf6XfKI22ar4eKjCc3Hp5Vko6KqZMkQaiWAcBlk449emy/7cgq+CbMABe3J8qF[m
[31m-bC7VKgqN84joJkjj6A==[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 2 (0x2)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=root-ca[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:a0:3e:1a:4f:6c:b9:3d:ab:0f:02:de:da:82:92:[m
[31m-                    ee:a2:69:88:80:ed:f2:b6:98:bc:c6:ee:d3:47:82:[m
[31m-                    4a:e7:d3:7f:55:68:5c:6d:9e:aa:ba:59:e3:5b:7f:[m
[31m-                    32:4f:79:44:4a:4f:13:e4:2e:3f:1f:98:10:a4:72:[m
[31m-                    d5:f0:e7:44:8e:d4:a7:b9:fb:54:be:b6:fa:f7:dc:[m
[31m-                    9c:29:93:d4:9f:a1:5b:18:6e:68:93:91:1b:8c:a0:[m
[31m-                    4f:02:52:e9:9d:e8:98:f3:fd:67:da:78:4b:4f:d8:[m
[31m-                    2d:90:83:5c:0b:e5:fe:48:27:e4:ec:bb:99:26:06:[m
[31m-                    8e:34:fe:93:e4:d2:fc:97:57[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:1D:2F:09:60:EB:E4:EA:B5:0B:52:A9:5C:5E:09:2B:DD:34:70:CF:BA[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         a6:16:2f:fc:13:67:5e:ce:0e:79:cb:b0:91:52:9b:9e:b5:9f:[m
[31m-         e1:fa:7d:78:f4:2a:93:f3:94:62:45:17:87:b9:0a:59:b9:a3:[m
[31m-         a9:75:51:ca:f0:04:6c:01:d1:3a:a9:dd:66:7d:27:7b:1e:4f:[m
[31m-         48:3a:25:ea:a5:01:32:fc:87:4b:08:da:f8:f5:62:88:e8:b9:[m
[31m-         94:c7:cb:ee:33:08:ab:2f:52:f4:4a:14:4f:ac:2d:a2:f8:de:[m
[31m-         c9:6f:95:b7:91:23:b9:ec:95:90:de:86:21:f5:6f:1b:cf:13:[m
[31m-         47:77:78:dd:7a:16:e9:8b:cc:df:3d:45:8a:76:af:15:d1:9a:[m
[31m-         37:a2[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICizCCAfSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxEDAOBgNVBAMTB3Jvb3QtY2EwIBcNMTQxMDE2MDMyNzA5[m
[31m-WhgPMjExNDA5MjIwMzI3MDlaMGQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxp[m
[31m-Zm9ybmlhMRUwEwYDVQQHEwxEZWZhdWx0IENpdHkxEjAQBgNVBAoTCU9wZW5SZXN0[m
[31m-eTEVMBMGA1UEAxMMc2lnbmluZy1jYS0xMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB[m
[31m-iQKBgQCgPhpPbLk9qw8C3tqCku6iaYiA7fK2mLzG7tNHgkrn039VaFxtnqq6WeNb[m
[31m-fzJPeURKTxPkLj8fmBCkctXw50SO1Ke5+1S+tvr33Jwpk9SfoVsYbmiTkRuMoE8C[m
[31m-Uumd6Jjz/WfaeEtP2C2Qg1wL5f5IJ+Tsu5kmBo40/pPk0vyXVwIDAQABo1AwTjAd[m
[31m-BgNVHQ4EFgQU0jBxVlCmvCHFoaGrEacIW+s6pCcwHwYDVR0jBBgwFoAUHS8JYOvk[m
[31m-6rULUqlcXgkr3TRwz7owDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCm[m
[31m-Fi/8E2dezg55y7CRUpuetZ/h+n149CqT85RiRReHuQpZuaOpdVHK8ARsAdE6qd1m[m
[31m-fSd7Hk9IOiXqpQEy/IdLCNr49WKI6LmUx8vuMwirL1L0ShRPrC2i+N7Jb5W3kSO5[m
[31m-7JWQ3oYh9W8bzxNHd3jdehbpi8zfPUWKdq8V0Zo3og==[m
[31m------END CERTIFICATE-----[m
[31m-Certificate:[m
[31m-    Data:[m
[31m-        Version: 3 (0x2)[m
[31m-        Serial Number: 3 (0x3)[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-        Issuer: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-1[m
[31m-        Validity[m
[31m-            Not Before: Oct 16 03:27:09 2014 GMT[m
[31m-            Not After : Sep 22 03:27:09 2114 GMT[m
[31m-        Subject: C=US, ST=California, L=Default City, O=OpenResty, CN=signing-ca-2[m
[31m-        Subject Public Key Info:[m
[31m-            Public Key Algorithm: rsaEncryption[m
[31m-                Public-Key: (1024 bit)[m
[31m-                Modulus:[m
[31m-                    00:d3:24:1c:92:a5:bb:00:d9:b1:fb:2b:1d:7a:32:[m
[31m-                    a1:6c:49:eb:3c:2d:29:80:d6:65:8b:17:3a:f0:4b:[m
[31m-                    dc:0c:57:fb:d5:31:68:a5:e4:54:86:55:f9:1b:a8:[m
[31m-                    d7:7d:32:01:3b:cf:5c:38:2b:f5:bc:d3:8b:c8:b6:[m
[31m-                    ab:76:65:32:e6:4b:d5:e4:fd:d1:92:c8:33:6a:74:[m
[31m-                    f3:c7:ec:97:c3:c7:9f:e4:d5:55:75:b8:bd:39:ec:[m
[31m-                    2d:1f:c6:54:c8:2b:2d:17:e0:05:77:28:44:f7:dd:[m
[31m-                    e1:6e:f0:59:05:51:f5:b9:b4:fe:be:ad:40:a6:d5:[m
[31m-                    9a:c1:64:e0:9b:dd:67:e5:f1[m
[31m-                Exponent: 65537 (0x10001)[m
[31m-        X509v3 extensions:[m
[31m-            X509v3 Subject Key Identifier: [m
[31m-                B3:0B:F5:7D:51:16:51:7E:28:37:C3:A2:0F:1D:2F:10:C0:51:A3:B3[m
[31m-            X509v3 Authority Key Identifier: [m
[31m-                keyid:D2:30:71:56:50:A6:BC:21:C5:A1:A1:AB:11:A7:08:5B:EB:3A:A4:27[m
[31m-[m
[31m-            X509v3 Basic Constraints: [m
[31m-                CA:TRUE[m
[31m-    Signature Algorithm: sha1WithRSAEncryption[m
[31m-         0c:61:c0:c7:11:c2:f0:39:f0:76:9d:4f:43:d4:90:54:1f:26:[m
[31m-         3d:54:3d:77:5f:c0:b3:4a:c2:1b:b6:18:d2:12:8d:24:4d:76:[m
[31m-         f5:07:0b:14:3e:17:2d:42:ee:85:30:db:e3:4d:81:67:59:97:[m
[31m-         0a:b3:bb:c5:27:ea:69:c6:ee:99:5c:44:36:53:3e:c4:47:68:[m
[31m-         f8:fe:c6:53:38:fb:e7:9a:0c:3c:6c:78:93:29:d2:49:7d:29:[m
[31m-         d0:61:6e:81:9b:d6:ec:1a:e2:3e:62:62:41:bc:6d:4d:33:91:[m
[31m-         76:20:5e:32:70:08:3e:24:72:fe:b1:8a:83:57:04:19:b5:cb:[m
[31m-         99:b7[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICkDCCAfmgAwIBAgIBAzANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMRGVmYXVsdCBDaXR5MRIwEAYD[m
[31m-VQQKEwlPcGVuUmVzdHkxFTATBgNVBAMTDHNpZ25pbmctY2EtMTAgFw0xNDEwMTYw[m
[31m-MzI3MDlaGA8yMTE0MDkyMjAzMjcwOVowZDELMAkGA1UEBhMCVVMxEzARBgNVBAgT[m
[31m-CkNhbGlmb3JuaWExFTATBgNVBAcTDERlZmF1bHQgQ2l0eTESMBAGA1UEChMJT3Bl[m
[31m-blJlc3R5MRUwEwYDVQQDEwxzaWduaW5nLWNhLTIwgZ8wDQYJKoZIhvcNAQEBBQAD[m
[31m-gY0AMIGJAoGBANMkHJKluwDZsfsrHXoyoWxJ6zwtKYDWZYsXOvBL3AxX+9UxaKXk[m
[31m-VIZV+Ruo130yATvPXDgr9bzTi8i2q3ZlMuZL1eT90ZLIM2p088fsl8PHn+TVVXW4[m
[31m-vTnsLR/GVMgrLRfgBXcoRPfd4W7wWQVR9bm0/r6tQKbVmsFk4JvdZ+XxAgMBAAGj[m
[31m-UDBOMB0GA1UdDgQWBBSzC/V9URZRfig3w6IPHS8QwFGjszAfBgNVHSMEGDAWgBTS[m
[31m-MHFWUKa8IcWhoasRpwhb6zqkJzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAAxhwMcRwvA58HadT0PUkFQfJj1UPXdfwLNKwhu2GNISjSRNdvUHCxQ+Fy1C[m
[31m-7oUw2+NNgWdZlwqzu8Un6mnG7plcRDZTPsRHaPj+xlM4++eaDDxseJMp0kl9KdBh[m
[31m-boGb1uwa4j5iYkG8bU0zkXYgXjJwCD4kcv6xioNXBBm1y5m3[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.crt[m
[1mdeleted file mode 100644[m
[1mindex a69a011..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.crt[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICqTCCAhICCQClDm1WkreW4jANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQD[m
[31m-DAh0ZXN0LmNvbTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20wIBcN[m
[31m-MTQwNzIxMDMyMzQ3WhgPMjE1MTA2MTMwMzIzNDdaMIGXMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MRIwEAYDVQQLDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl[m
[31m-c3QuY29tMSAwHgYJKoZIhvcNAQkBFhFhZ2VudHpoQGdtYWlsLmNvbTCBnzANBgkq[m
[31m-hkiG9w0BAQEFAAOBjQAwgYkCgYEA6P18zUvtmaKQK2xePy8ZbFwSyTLw+jW6t9eZ[m
[31m-aiTec8X3ibN9WemrxHzkTRikxP3cAQoITRuZiQvF4Q7DO6wMkz/b0zwfgX5uedGq[m
[31m-047AJP6n/mwlDOjGSNomBLoXQzo7tVe60ikEm3ZyDUqnJPJMt3hImO5XSop4MPMu[m
[31m-Za9WhFcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQA4OBb9bOyWB1//93nSXX1mdENZ[m
[31m-IQeyTK0Dd6My76lnZxnZ4hTWrvvd0b17KLDU6JnS2N5ee3ATVkojPidRLWLIhnh5[m
[31m-0eXrcKalbO2Ce6nShoFvQCQKXN2Txmq2vO/Mud2bHAWwJALg+qi1Iih/gVYB9sct[m
[31m-FLg8zFOzRlYiU+6Mmw==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.crt.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.crt.der[m
[1mdeleted file mode 100644[m
[1mindex 0b6ef63..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.crt.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.key b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.key[m
[1mdeleted file mode 100644[m
[1mindex 6c13527..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXgIBAAKBgQDo/XzNS+2ZopArbF4/LxlsXBLJMvD6Nbq315lqJN5zxfeJs31Z[m
[31m-6avEfORNGKTE/dwBCghNG5mJC8XhDsM7rAyTP9vTPB+Bfm550arTjsAk/qf+bCUM[m
[31m-6MZI2iYEuhdDOju1V7rSKQSbdnINSqck8ky3eEiY7ldKingw8y5lr1aEVwIDAQAB[m
[31m-AoGBANgB66sKMga2SKN5nQdHS3LDCkevCutu1OWM5ZcbB4Kej5kC57xsf+tzPtab[m
[31m-emeIVGhCPOAALqB4YcT+QtMX967oM1MjcFbtH7si5oq6UYyp3i0G9Si6jIoVHz3+[m
[31m-8yOUaqwKbK+bRX8VS0YsHZmBsPK5ryN50iUwsU08nemoA94BAkEA9GS9Q5OPeFkM[m
[31m-tFxsIQ1f2FSsZAuN/1cpZgJqY+YaAN7MSPGTWyfd7nWG/Zgk3GO9/2ihh4gww+7B[m
[31m-To09GkmW4QJBAPQOHC2V+t2TA98+6Lj6+TYwcGEkhOENfVpH25mQ+kXgF/1Bd6rA[m
[31m-nosT1bdAY+SnmWXbSw6Kv5C20Em+bEX8WjcCQCSRRjhsRdVODbaW9Z7kb2jhEoJN[m
[31m-sEt6cTlQNzcHYPCsZYisjM3g4zYg47fiIfHQAsfKkhDDcfh/KvFj9LaQOEECQQCH[m
[31m-eBWYEDpSJ7rsfqT7mQQgWj7nDThdG/nK1TxGP71McBmg0Gg2dfkLRhVJRQqt74Is[m
[31m-kc9V4Rp4n6F6baL4Lh19AkEA6pZZer0kg3Kv9hjhaITIKUYdfIp9vYnDRWbQlBmR[m
[31m-atV8V9u9q2ETZvqfHpN+9Lu6NYR4yXIEIRf1bnIZ/mr9eQ==[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.key.der b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.key.der[m
[1mdeleted file mode 100644[m
[1mindex 537a4f1..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test.key.der and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test2.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test2.crt[m
[1mdeleted file mode 100644[m
[1mindex edc3b0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test2.crt[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIChzCCAfACCQDjCkJpJUtZmjANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZI[m
[31m-hvcNAQkBFhNvcGVucmVzdHlAZ21haWwuY29tMCAXDTE0MDkxMzAwMTgxMFoYDzIx[m
[31m-MTQwODIwMDAxODEwWjCBhjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3Ju[m
[31m-aWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCU9wZW5SZXN0eTES[m
[31m-MBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZIhvcNAQkBFhNvcGVucmVzdHlAZ21h[m
[31m-aWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDy+OVI2u5NBOeB2Cyz[m
[31m-Gnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7f[m
[31m-JrKFziJxMy4g4Kdn9G659vE7CWu/UAVjRUtc+mTBAEfjdbumizmHLG7DmnNhGl3R[m
[31m-NGiVNLsUInSMGfUlJRzZJXhI4QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAEMmRvyN[m
[31m-N7uE24Tc6TR19JadNHK8g3YGktRoXWiqd/y0HY4NRPgvnK/nX7CY/wXa1j+uDO8K[m
[31m-e6/Ldm5RZrjtvfHJmTSAu8zkqTJz8bqRDH7kzL5Ni2Ky2x8r9dtB0ImpOiSlwvZN[m
[31m-snMvbrxEdwBiqlC9prV2f9aG+ACo1KnPL0j6[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test2.key b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test2.key[m
[1mdeleted file mode 100644[m
[1mindex 82ce6ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/cert/test2.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXAIBAAKBgQDy+OVI2u5NBOeB2CyzGnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4[m
[31m-PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7fJrKFziJxMy4g4Kdn9G659vE7CWu/UAVj[m
[31m-RUtc+mTBAEfjdbumizmHLG7DmnNhGl3RNGiVNLsUInSMGfUlJRzZJXhI4QIDAQAB[m
[31m-AoGAEqBB83PVENJvbOTFiHVfUAjGtr3R/Wnwd4jOcjHHZB3fZ9sjVoxJntxfp3s1[m
[31m-dwZir2rxlqVS6i3VAFiGiVTOGo2Vvzhw2J7f58twCECmnLb2f863AkGEYe4dAndD[m
[31m-GHGD0WI0CBMD1sT18YCj561o0Wol5deWH0gM9pr2N3HkeIECQQD6hUKFlFhrpaHP[m
[31m-WNJsl6BxgE6pB5kxLcMcpIQ7P+kHUvtyvCJl5QZJqPrpPGjRsAI5Ph92rpsp/zDp[m
[31m-/IZNWGVjAkEA+Ele31Rt+XbV32MrLKZgBDBk+Pzss5LTn9fZ5v1k/7hrMk2VVWvk[m
[31m-AD6n5QiGe/g59woANpPb1T9l956SBf0d6wJABTXOS17pc9uvANP1FGMW6CVl/Wf2[m
[31m-DKrJ+weE5IKQwyE7r4gwIvRfbBrClSU3fNzvPueG2f4JphbzmnoxBNzIxwJAYivY[m
[31m-mGNwzHehXx99/byXMHDWK+EN0n8WsBgP75Z3rekEcbJdfpYXY8Via1vwmOnwOW65[m
[31m-4NqbzHix37PSNw37GwJBALxaGNpREO2Tk+oWOvsD2QyviMVae3mXAJHc6nLVdKDM[m
[31m-q0YvDT6VdeNYYFTkAuzJacsVXOpn6AnUMFj0OBedMhc=[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/count.t[m
[1mdeleted file mode 100644[m
[1mindex 74e61bc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/count.t[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module size[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local base = require "resty.core.base"[m
[31m-            local n = 0[m
[31m-            for _, _ in pairs(base) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("base size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m-[m
[31m---- stap2[m
[31m-global c[m
[31m-probe process("$LIBLUA_PATH").function("rehashtab") {[m
[31m-    c++[m
[31m-    printf("rehash: %d\n", c)[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-base size: 16[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ctx.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ctx.t[m
[1mdeleted file mode 100644[m
[1mindex a848ea0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ctx.t[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;\$prefix/html/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get ngx.ctx[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.ctx.foo = i[m
[31m-            end[m
[31m-            ngx.say("ctx.foo = ", ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ctx.foo = 100[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set ngx.ctx[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.ctx = {foo = i}[m
[31m-            end[m
[31m-            ngx.say("ctx.foo = ", ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ctx.foo = 100[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/decode-base64.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/decode-base64.t[m
[1mdeleted file mode 100644[m
[1mindex 632d080..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/decode-base64.t[m
[1m+++ /dev/null[m
[36m@@ -1,188 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64("aGVsbG8=")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set base64 (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64("")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body eval: "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set base64 (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64("My4xNA==")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-3.14[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set base64 (boolean)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64("dHJ1ZQ==")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-true[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: string (buf size just smaller than 4096)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64(string.rep("a", 5460))[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.say("bad base64 string")[m
[31m-            else[m
[31m-                ngx.say(string.len(s))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-4095[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: string (buf size just a bit bigger than 4096)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.decode_base64(string.rep("a", 5462))[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.say("bad base64 string")[m
[31m-            else[m
[31m-                ngx.say(string.len(s))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-4096[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/encode-base64.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/encode-base64.t[m
[1mdeleted file mode 100644[m
[1mindex f6bda69..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/encode-base64.t[m
[1m+++ /dev/null[m
[36m@@ -1,228 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set base64 (string)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64("hello")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-aGVsbG8=[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set base64 (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(nil)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body eval: "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set base64 (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(3.14)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-My4xNA==[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set base64 (boolean)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(true)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-dHJ1ZQ==[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set base64 (buf is a little larger than 4096)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(string.rep("a", 3073))[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-4100[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set base64 (buf is just 4096)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.encode_base64(string.rep("a", 3071))[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-4096[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set base64 (number) without padding (explicitly specified)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 200 do[m
[31m-                s = ngx.encode_base64(3.14, true)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-My4xNA[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set base64 (number) with padding (explictly specified)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /base64 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 200 do[m
[31m-                s = ngx.encode_base64(3.14, false)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /base64[m
[31m---- response_body[m
[31m-My4xNA==[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/exit.t[m
[1mdeleted file mode 100644[m
[1mindex 86cebb9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(120);[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;\$prefix/html/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-qr/ -- NYI: (?!FastFunc coroutine.yield)/,[m
[31m-" bad argument"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: call ngx.exit() from a custom lua module[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            foo.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local exit = ngx.exit[m
[31m-[m
[31m-local function go()[m
[31m-    exit(403)[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m-return { go = go }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-qr/ -- NYI: (?!FastFunc coroutine.yield)/,[m
[31m-" bad argument"][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/md5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/md5.t[m
[1mdeleted file mode 100644[m
[1mindex 73a5f16..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/md5.t[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local v = require "jit.v"[m
[31m-        v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        require "resty.core"[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set md5 hello[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5("hello")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   1 content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nil string to ngx.md5[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5(nil)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   1 content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: empty string to ngx.md5[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5("")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   1 content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: number to ngx.md5[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5(3.14)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-4beed3b9c4a886067de0e3a094246f78[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   1 content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/md5_bin.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/md5_bin.t[m
[1mdeleted file mode 100644[m
[1mindex decc7e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/md5_bin.t[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set md5_bin (string)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5_bin("hello")[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set md5_bin (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5_bin(nil)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set md5_bin (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5_bin(3.14)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set md5_bin (boolean)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.md5_bin(true)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/misc.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/misc.t[m
[1mdeleted file mode 100644[m
[1mindex 213731e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/misc.t[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6 + 1);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;\$prefix/html/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.is_subrequest[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        return 201;[m
[31m-        header_filter_by_lua '[m
[31m-            local rc[m
[31m-            for i = 1, 100 do[m
[31m-                rc = ngx.is_subrequest[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "is subrequest: ", rc)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- error_code: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-["is subrequest: false,",[m
[31m-qr/\[TRACE\s+\d+\s+header_filter_by_lua:3 loop\]/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.headers_sent (false)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local rc[m
[31m-            for i = 1, 100 do[m
[31m-                rc = ngx.headers_sent[m
[31m-            end[m
[31m-            ngx.say("headers sent: ", rc)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-headers sent: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.headers_sent (true)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            local rc[m
[31m-            for i = 1, 100 do[m
[31m-                rc = ngx.headers_sent[m
[31m-            end[m
[31m-            ngx.say("headers sent: ", rc)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-headers sent: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ocsp.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ocsp.t[m
[1mdeleted file mode 100644[m
[1mindex f66a7ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ocsp.t[m
[1m+++ /dev/null[m
[36m@@ -1,1549 +0,0 @@[m
[31m-# vim:set ft=ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(10140);[m
[31m-#workers(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6 + 13);[m
[31m-[m
[31m-our $CWD = cwd();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-$ENV{TEST_NGINX_LUA_PACKAGE_PATH} = "$::CWD/lib/?.lua;;";[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get OCSP responder (good case)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data)[m
[31m-            if not url then[m
[31m-                ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP url found: http://127.0.0.1:8888/ocsp?foo=1,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get OCSP responder (not found)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data)[m
[31m-            if not url then[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.WARN, "OCSP responder not found")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP responder not found[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get OCSP responder (no issuer cert at all)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/test-com.crt"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data)[m
[31m-            if not url then[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.WARN, "OCSP responder not found")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to get OCSP responder: no issuer certificate in chain[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get OCSP responder (issuer cert not next to the leaf cert)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/wrong-issuer-order-chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data)[m
[31m-            if not url then[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.WARN, "OCSP responder not found")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to get OCSP responder: issuer certificate not next to leaf[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get OCSP responder (truncated)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local url, err = ocsp.get_ocsp_responder_from_der_chain(cert_data, 6)[m
[31m-            if not url then[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.WARN, "OCSP responder not found")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if err then[m
[31m-                ngx.log(ngx.WARN, "still get an error: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP url found: ", url)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP url found: http:/,[m
[31m-still get an error: truncated[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: create OCSP request (good)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req, err = ocsp.create_ocsp_request(cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP request created with length ", #req)[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-req.der", "r"))[m
[31m-            local expected = assert(f:read("*a"))[m
[31m-            f:close()[m
[31m-            if req ~= expected then[m
[31m-                ngx.log(ngx.ERR, "ocsp responder: got unexpected OCSP request")[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP request created with length 68[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: create OCSP request (buffer too small)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req, err = ocsp.create_ocsp_request(cert_data, 67)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP request created with length ", #req)[m
[31m-            local bytes = {string.byte(req, 1, #req)}[m
[31m-            for i, byte in ipairs(bytes) do[m
[31m-                bytes[i] = string.format("%02x", byte)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "OCSP request content: ", table.concat(bytes, " "))[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to create OCSP request: output buffer too small: 68 > 67[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: create OCSP request (empty string cert chain)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local cert_data = ""[m
[31m-            local req, err = ocsp.create_ocsp_request(cert_data, 67)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP request created with length ", #req)[m
[31m-            local bytes = {string.byte(req, 1, #req)}[m
[31m-            for i, byte in ipairs(bytes) do[m
[31m-                bytes[i] = string.format("%02x", byte)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "OCSP request content: ", table.concat(bytes, " "))[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to create OCSP request: d2i_X509_bio() failed[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: create OCSP request (no issuer cert in the chain)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/test-com.crt"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req, err = ocsp.create_ocsp_request(cert_data, 67)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP request created with length ", #req)[m
[31m-            local bytes = {string.byte(req, 1, #req)}[m
[31m-            for i, byte in ipairs(bytes) do[m
[31m-                bytes[i] = string.format("%02x", byte)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "OCSP request content: ", table.concat(bytes, " "))[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to create OCSP request: no issuer certificate in chain[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: validate good OCSP response[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP response validation ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: fail to validate OCSP response - no issuer cert[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/test-com.crt"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to validate OCSP response: no issuer certificate in chain[m
[31m-[m
[31m---- no_error_log[m
[31m-OCSP response validation ok[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: validate good OCSP response - no certs in response[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp-no-certs.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP response validation ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: validate OCSP response - OCSP response signed by an unknown cert and the OCSP response contains the unknown cert[m
[31m-[m
[31m-FIXME: we should complain in this case.[m
[31m-[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp-signed-by-orphaned.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-OCSP response validation ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: fail to validate OCSP response - OCSP response signed by an unknown cert and the OCSP response does not contain the unknown cert[m
[31m-[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp-signed-by-orphaned-no-certs.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to validate OCSP response: OCSP_basic_verify() failed[m
[31m-[m
[31m---- no_error_log[m
[31m-OCSP response validation ok[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: fail to validate OCSP response - OCSP response returns revoked status[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/revoked-chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/revoked-ocsp-resp.der"))[m
[31m-            local resp = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local req, err = ocsp.validate_ocsp_response(resp, cert_data)[m
[31m-            if not req then[m
[31m-                ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "OCSP response validation ok")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to validate OCSP response: certificate status "revoked" in the OCSP response[m
[31m-[m
[31m---- no_error_log[m
[31m-OCSP response validation ok[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: good status req from client[m
[31m-FIXME: check the OCSP staple actually received by the ssl client[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp.der"))[m
[31m-            local resp = assert(f:read("*a"))[m
[31m-            f:close()[m
[31m-[m
[31m-            print("resp len: ", #resp)[m
[31m-[m
[31m-            local ok, err = ocsp.set_ocsp_status_resp(resp)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set ocsp status resp: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "ocsp status resp set ok: ", err)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true, true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ocsp status resp set ok: nil,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: no status req from client[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/ocsp/ocsp-resp.der"))[m
[31m-            local resp = assert(f:read("*a"))[m
[31m-            f:close()[m
[31m-[m
[31m-            print("resp len: ", #resp)[m
[31m-[m
[31m-            local ok, err = ocsp.set_ocsp_status_resp(resp)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set ocsp status resp: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "ocsp status resp set ok: ", err)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ocsp status resp set ok: no status req,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-find.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-find.t[m
[1mdeleted file mode 100644[m
[1mindex 3b2c889..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-find.t[m
[1m+++ /dev/null[m
[36m@@ -1,263 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched, no submatch, no jit compile, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local from, to, err[m
[31m-            local find = ngx.re.find[m
[31m-            local s = "a"[m
[31m-            for i = 1, 100 do[m
[31m-                from, to, err = find(s, "a")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not from then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("from: ", from)[m
[31m-            ngx.say("to: ", to)[m
[31m-            ngx.say("matched: ", string.sub(s, from, to))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 1[m
[31m-matched: a[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):5 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: matched, no submatch, jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local from, to, err[m
[31m-            local find = ngx.re.find[m
[31m-            local s = "a"[m
[31m-            for i = 1, 200 do[m
[31m-                from, to, err = find(s, "a", "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not from then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("from: ", from)[m
[31m-            ngx.say("to: ", to)[m
[31m-            ngx.say("matched: ", string.sub(s, from, to))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 1[m
[31m-matched: a[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):5 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: not matched, no submatch, jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local from, to, err[m
[31m-            local find = ngx.re.find[m
[31m-            local s = "b"[m
[31m-            for i = 1, 200 do[m
[31m-                from, to, err = find(s, "a", "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not from then[m
[31m-                ngx.say("no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("from: ", from)[m
[31m-            ngx.say("to: ", to)[m
[31m-            ngx.say("matched: ", string.sub(s, from, to))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-no match[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):5 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: nil submatch (2nd)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err[m
[31m-            for i = 1, 100 do[m
[31m-                from, to, err = ngx.re.find(s, "([0-9])|(hello world)", "jo", nil, 2)[m
[31m-            end[m
[31m-            if from or to then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: nil submatch (1st)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err[m
[31m-            for i = 1, 400 do[m
[31m-                from, to, err = ngx.re.find(s, "(hello world)|([0-9])", "jo", nil, 1)[m
[31m-            end[m
[31m-            if from or to then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: specify the group (2)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err[m
[31m-            for i = 1, 100 do[m
[31m-                from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 2)[m
[31m-            end[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 9[m
[31m-to: 11[m
[31m-matched: 234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-match.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-match.t[m
[1mdeleted file mode 100644[m
[1mindex 02a856c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-match.t[m
[1m+++ /dev/null[m
[36m@@ -1,593 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 1);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched, no submatch, no jit compile, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 400 do[m
[31m-                m, err = match("a", "a")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            -- ngx.say("$2: ", m[2])[m
[31m-            -- ngx.say("$3: ", m[3])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-matched: a[m
[31m-$1: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: matched, no submatch, jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 400 do[m
[31m-                m, err = match("a", "a", "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-matched: a[m
[31m-$1: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: not matched, no submatch, jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 200 do[m
[31m-                m, err = match("b", "a", "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.say("no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-no match[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched, no submatch, no jit compile, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("b", "a")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.say("no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-no match[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: submatches, matched, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("hello, 1234", [[(\\d)(\\d+)]])[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            ngx.say("$2: ", m[2])[m
[31m-            ngx.say("$3: ", m[3])[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-matched: 1234[m
[31m-$1: 1[m
[31m-$2: 234[m
[31m-$3: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: submatches, matched, with regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("hello, 1234", [[(\\d)(\\d+)]], "jo")[m
[31m-            end[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if not m then[m
[31m-                ngx.log(ngx.ERR, "no match")[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("matched: ", m[0])[m
[31m-            ngx.say("$1: ", m[1])[m
[31m-            ngx.say("$2: ", m[2])[m
[31m-            ngx.say("$3: ", m[3])[m
[31m-            -- ngx.say(table.maxn(m))[m
[31m-            -- collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-matched: 1234[m
[31m-$1: 1[m
[31m-$2: 234[m
[31m-$3: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: named subpatterns w/ extraction (matched)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z]+), [0-9]+", "jo")[m
[31m-            end[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-hello[m
[31m-nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: named subpatterns w/ extraction (use of duplicate names in non-duplicate mode)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 200 do[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "jo")[m
[31m-            end[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-error: pcre_compile\(\) failed: two named subpatterns have the same name[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: named subpatterns w/ extraction (use of duplicate names in duplicate mode)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local match = ngx.re.match[m
[31m-            for i = 1, 100 do[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-                m, err = match("hello, 1234", "(?<first>[a-z])(?<first>[a-z]+), [0-9]+", "joD")[m
[31m-            end[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first, "|"))[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like[m
[31m-hello, 1234[m
[31m-h[m
[31m-ello[m
[31m-h|ello[m
[31m-nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: captures input table in ngx.re.match[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local new_tab = require "table.new"[m
[31m-            local clear_tab = require "table.clear"[m
[31m-            local m[m
[31m-            local res = new_tab(5, 0)[m
[31m-            res[5] = "hello"[m
[31m-            for i = 1, 100 do[m
[31m-                m = ngx.re.match("hello, 1234", "([0-9])([0-9])([0-9])([0-9])", "jo", nil, res)[m
[31m-            end[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-                ngx.say(m[4])[m
[31m-                ngx.say(m[5])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: unmatched captures are false[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello!", "(hello)(, .+)?(!)", "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello![m
[31m-hello[m
[31m-false[m
[31m-![m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: unmatched trailing captures are false[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello", "(hello)(, .+)?(!)?", "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-false[m
[31m-false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: unmatched named captures are false[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello!", "(?<first>hello)(?<second>, .+)?(?<third>!)", "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-                ngx.say(m.third)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello![m
[31m-hello[m
[31m-false[m
[31m-![m
[31m-hello[m
[31m-false[m
[31m-![m
[31m---- no_error_log[m
[31m-[error][m
[31m-NYI[m
[31m---- error_log eval[m
[31m-qr/\[TRACE\s+\d+\s+/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: subject is not a string type[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match(12345, [=[(\\d+)]=], "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-12345[m
[31m-12345[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'subj' (a number value)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: subject is not a string type[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match(12345, "123", "jo")[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-123[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'regex' (a number value)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-sub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-sub.t[m
[1mdeleted file mode 100644[m
[1mindex f8af691..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/re-sub.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 9);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sub, no submatch, no jit compile, regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local sub = ngx.re.sub[m
[31m-            for i = 1, 350 do[m
[31m-                s, n, err = sub("abcbd", "b", "B", "jo")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-s: aBcbd[m
[31m-n: 1[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sub, no submatch, no jit compile, no regex cache[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local sub = ngx.re.sub[m
[31m-            for i = 1, 400 do[m
[31m-                s, n, err = sub("abcbd", "b", "B")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-s: aBcbd[m
[31m-n: 1[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: func + submatches[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local function f(m)[m
[31m-                return "[" .. m[0] .. "(" .. m[1] .. ")]"[m
[31m-            end[m
[31m-            local sub = ngx.re.sub[m
[31m-            for i = 1, 200 do[m
[31m-                s, n, err = sub("abcbd", "b(c)", f, "jo")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-s: a[bc(c)]bd[m
[31m-n: 1[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-"bad argument type",[m
[31m-qr/NYI (?!bytecode 51 at)/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: replace template + submatches[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local sub = ngx.re.sub[m
[31m-            for i = 1, 350 do[m
[31m-                s, n, err = sub("abcbd", "b(c)", "[$0($1)]", "jo")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body[m
[31m-s: a[bc(c)]bd[m
[31m-n: 1[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: replace template + submatches (exceeding buffers)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /re {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local m, err[m
[31m-            local gsub = ngx.re.gsub[m
[31m-            local subj = string.rep("bcbd", 2048)[m
[31m-            for i = 1, 10 do[m
[31m-                s, n, err = gsub(subj, "b(c)", "[$0($1)]", "jo")[m
[31m-            end[m
[31m-            if not s then[m
[31m-                ngx.log(ngx.ERR, "failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /re[m
[31m---- response_body eval[m
[31m-"s: " . ("[bc(c)]bd" x 2048) .[m
[31m-"\nn: 2048\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.re.gsub: use of ngx.req.get_headers in the user callback[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        local data = [[[m
[31m-            INNER[m
[31m-            INNER[m
[31m-]][m
[31m-[m
[31m-        -- ngx.say(data)[m
[31m-[m
[31m-        local res =  ngx.re.gsub(data, "INNER", function(inner_matches)[m
[31m-            local header = ngx.req.get_headers()["Host"][m
[31m-            -- local header = ngx.var["http_HEADER"][m
[31m-            return "INNER_REPLACED"[m
[31m-        end, "s")[m
[31m-[m
[31m-        ngx.print(res)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-            INNER_REPLACED[m
[31m-            INNER_REPLACED[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.re.gsub: use of ngx.var in the user callback[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        local data = [[[m
[31m-            INNER[m
[31m-            INNER[m
[31m-]][m
[31m-[m
[31m-        -- ngx.say(data)[m
[31m-[m
[31m-        local res =  ngx.re.gsub(data, "INNER", function(inner_matches)[m
[31m-            -- local header = ngx.req.get_headers()["Host"][m
[31m-            local header = ngx.var["http_HEADER"][m
[31m-            return "INNER_REPLACED"[m
[31m-        end, "s")[m
[31m-[m
[31m-        ngx.print(res)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-            INNER_REPLACED[m
[31m-            INNER_REPLACED[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.re.gsub: recursive calling (github openresty/lua-nginx-module#445)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        function test()[m
[31m-            local data = [[[m
[31m-                OUTER {FIRST}[m
[31m-]][m
[31m-[m
[31m-            local p1 = "(OUTER)(.+)"[m
[31m-            local p2 = "{([A-Z]+)}"[m
[31m-[m
[31m-            ngx.print(data)[m
[31m-[m
[31m-            local res =  ngx.re.gsub(data, p1, function(m)[m
[31m-                -- ngx.say("pre: m[1]: [", m[1], "]")[m
[31m-                -- ngx.say("pre: m[2]: [", m[2], "]")[m
[31m-[m
[31m-                local res = ngx.re.gsub(m[2], p2, function(_)[m
[31m-                    return "REPLACED"[m
[31m-                end, "")[m
[31m-[m
[31m-                -- ngx.say("post: m[1]: [", m[1], "]")[m
[31m-                -- ngx.say("post m[2]: [", m[2], "]")[m
[31m-                return m[1] .. res[m
[31m-            end, "")[m
[31m-[m
[31m-            ngx.print(res)[m
[31m-        end[m
[31m-[m
[31m-        test()[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-                OUTER {FIRST}[m
[31m-                OUTER REPLACED[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: string replace subj is not a string type[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-			local newstr, n, err = ngx.re.sub(1234, "([0-9])[0-9]", 5, "jo")[m
[31m-[m
[31m-			ngx.say(newstr)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-534[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'subj' (a number value)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: func replace return is not a string type (ngx.re.sub)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-			local lookup = function(m)[m
[31m-				-- note we are returning a number type here[m
[31m-				return 5[m
[31m-			end[m
[31m-[m
[31m-			local newstr, n, err = ngx.re.sub("hello, 1234", "([0-9])[0-9]", lookup, "jo")[m
[31m-			ngx.say(newstr)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 534[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'bit' (a number value)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: func replace return is not a string type (ngx.re.gsub)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-			local lookup = function(m)[m
[31m-				-- note we are returning a number type here[m
[31m-				return 5[m
[31m-			end[m
[31m-[m
[31m-			local newstr, n, err = ngx.re.gsub("hello, 1234", "([0-9])[0-9]", lookup, "jo")[m
[31m-			ngx.say(newstr)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 55[m
[31m---- no_error_log[m
[31m-[error][m
[31m-attempt to get length of local 'bit' (a number value)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/request.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/request.t[m
[1mdeleted file mode 100644[m
[1mindex 3d13035..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/request.t[m
[1m+++ /dev/null[m
[36m@@ -1,573 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 10);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on("b", "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.req.get_headers[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local headers[m
[31m-            for i = 1, 200 do[m
[31m-                headers = ngx.req.get_headers()[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(headers) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                ngx.say(k, ": ", headers[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-bar: bar[m
[31m-baz: baz[m
[31m-connection: close[m
[31m-foo: foo[m
[31m-host: localhost[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Bar: bar[m
[31m-Baz: baz[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ .*? -> 1\]/[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-qr/ -- NYI: (?!return to lower frame)/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.req.get_headers (raw)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local headers[m
[31m-            for i = 1, 200 do[m
[31m-                headers = ngx.req.get_headers(100, true)[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(headers) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                ngx.say(k, ": ", headers[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Bar: bar[m
[31m-Baz: baz[m
[31m-Connection: close[m
[31m-Foo: foo[m
[31m-Host: localhost[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Bar: bar[m
[31m-Baz: baz[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ .*? -> 1\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.req.get_headers (count is 2)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local headers[m
[31m-            for i = 1, 200 do[m
[31m-                headers = ngx.req.get_headers(2, true)[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(headers) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                ngx.say(k, ": ", headers[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Connection: close[m
[31m-Host: localhost[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Bar: bar[m
[31m-Baz: baz[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.req.get_headers (metatable)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local headers, header[m
[31m-            for i = 1, 100 do[m
[31m-                headers = ngx.req.get_headers()[m
[31m-                header = headers["foo_BAR"][m
[31m-            end[m
[31m-            ngx.say("foo_BAR: ", header)[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(headers) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                ngx.say(k, ": ", headers[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-foo_BAR: foo[m
[31m-baz: baz[m
[31m-connection: close[m
[31m-foo-bar: foo[m
[31m-host: localhost[m
[31m---- more_headers[m
[31m-Foo-Bar: foo[m
[31m-Baz: baz[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ .*? -> \d\]/[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-qr/ -- NYI: (?!return to lower frame at)(?!C function 0x[0-9a-f]+ at content_by_lua\(nginx.conf:\d+\):15)/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.req.get_uri_args[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local args[m
[31m-            for i = 1, 200 do[m
[31m-                args = ngx.req.get_uri_args()[m
[31m-            end[m
[31m-            if type(args) ~= "table" then[m
[31m-                ngx.say("bad args type found: ", args)[m
[31m-                return[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(args) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                local v = args[k][m
[31m-                if type(v) == "table" then[m
[31m-                    ngx.say(k, ": ", table.concat(v, ", "))[m
[31m-                else[m
[31m-                    ngx.say(k, ": ", v)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t?a=3%200&foo%20bar=&a=hello&blah[m
[31m---- response_body[m
[31m-a: 3 0, hello[m
[31m-blah: true[m
[31m-foo bar: [m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ .*? -> \d+\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m---- wait: 0.2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.req.get_uri_args (empty)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local args[m
[31m-            for i = 1, 200 do[m
[31m-                args = ngx.req.get_uri_args()[m
[31m-            end[m
[31m-            if type(args) ~= "table" then[m
[31m-                ngx.say("bad args type found: ", args)[m
[31m-                return[m
[31m-            end[m
[31m-            local keys = {}[m
[31m-            for k, _ in pairs(args) do[m
[31m-                keys[#keys + 1] = k[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for _, k in ipairs(keys) do[m
[31m-                local v = args[k][m
[31m-                if type(v) == "table" then[m
[31m-                    ngx.say(k, ": ", table.concat(v, ", "))[m
[31m-                else[m
[31m-                    ngx.say(k, ": ", v)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t?[m
[31m---- response_body[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.req.start_time()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.start_time()[m
[31m-            end[m
[31m-            ngx.sleep(0.10)[m
[31m-            local elapsed = ngx.now() - t[m
[31m-            ngx.say(t > 1399867351)[m
[31m-            ngx.say(">= 0.099: ", elapsed >= 0.099)[m
[31m-            ngx.say("< 0.11: ", elapsed < 0.11)[m
[31m-            -- ngx.say(t, " ", elapsed)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m->= 0.099: true[m
[31m-< 0.11: true[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.req.get_method (GET)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-method: GET[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.get_method (OPTIONS)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-OPTIONS /t[m
[31m---- response_body[m
[31m-method: OPTIONS[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.req.get_method (POST)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-            ngx.req.discard_body()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- response_body[m
[31m-method: POST[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.req.get_method (unknown method)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-            ngx.req.discard_body()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-BLAH /t[m
[31m-hello[m
[31m---- response_body[m
[31m-method: BLAH[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.req.get_method (CONNECT)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.get_method()[m
[31m-            end[m
[31m-            ngx.say("method: ", t)[m
[31m-            ngx.req.discard_body()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-CONNECT /t[m
[31m-hello[m
[31m---- response_body[m
[31m-method: CONNECT[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.req.set_method (GET -> PUT)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                ngx.req.set_method(ngx.HTTP_PUT)[m
[31m-            end[m
[31m-            ngx.say("method: ", ngx.req.get_method())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-method: PUT[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.req.set_header (single number value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                ngx.req.set_header("foo", i)[m
[31m-            end[m
[31m-            ngx.say("header foo: ", ngx.var.http_foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-header foo: 500[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.req.set_header (nil value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                ngx.req.set_header("foo", nil)[m
[31m-            end[m
[31m-            ngx.say("header foo: ", type(ngx.var.http_foo))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-header foo: nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.req.clear_header[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("foo", "hello")[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.req.clear_header("foo")[m
[31m-            end[m
[31m-            ngx.say("header foo: ", type(ngx.var.http_foo))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-header foo: nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/response.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/response.t[m
[1mdeleted file mode 100644[m
[1mindex 8851018..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/response.t[m
[1m+++ /dev/null[m
[36m@@ -1,234 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on("b", "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: write to ngx.header.HEADER (single value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.header["Foo"] = i[m
[31m-            end[m
[31m-            ngx.say("Foo: ", ngx.header["Foo"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: 100[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: write to ngx.header.HEADER (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 200 do[m
[31m-                ngx.header["Foo"] = i[m
[31m-                ngx.header["Foo"] = nil[m
[31m-            end[m
[31m-            ngx.say("Foo: ", ngx.header["Foo"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: write to ngx.header.HEADER (multi-value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 200 do[m
[31m-                ngx.header["Foo"] = {i, i + 1}[m
[31m-            end[m
[31m-            local v = ngx.header["Foo"][m
[31m-            if type(v) == "table" then[m
[31m-                ngx.say("Foo: ", table.concat(v, ", "))[m
[31m-            else[m
[31m-                ngx.say("Foo: ", v)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: 200, 201[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: read from ngx.header.HEADER (single value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.header["Foo"] = i[m
[31m-                v = ngx.header["Foo"][m
[31m-            end[m
[31m-            ngx.say("Foo: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: 100[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-qr/ -- NYI: (?!return to lower frame)/,[m
[31m-"stitch",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: read from ngx.header.HEADER (not found)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            for i = 1, 100 do[m
[31m-                v = ngx.header["Foo"][m
[31m-            end[m
[31m-            ngx.say("Foo: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: nil[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: read from ngx.header.HEADER (multi-value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = {"foo", "bar"}[m
[31m-            local v[m
[31m-            for i = 1, 100 do[m
[31m-                v = ngx.header["Foo"][m
[31m-            end[m
[31m-            ngx.say("Foo: ", table.concat(v, ", "))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Foo: foo, bar[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set multi values to cache-control and override it with multiple values[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store" }[m
[31m-            ngx.header.cache_control = { "no-cache", "blah", "foo" }[m
[31m-            local v[m
[31m-            for i = 1, 400 do[m
[31m-                v = ngx.header.cache_control[m
[31m-            end[m
[31m-            ngx.say("Cache-Control: ", table.concat(v, ", "))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: no-cache, blah, foo[m
[31m---- response_body_like chop[m
[31m-^Cache-Control: no-cache[;,] blah[;,] foo$[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):5 (?:loop|-> \d+)\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/semaphore.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/semaphore.t[m
[1mdeleted file mode 100644[m
[1mindex 18c8389..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/semaphore.t[m
[1m+++ /dev/null[m
[36m@@ -1,1843 +0,0 @@[m
[31m-# vim:set ft=ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(10140);[m
[31m-#workers(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 3);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-$ENV{TEST_NGINX_LUA_PACKAGE_PATH} = "\"$pwd/lib/?.lua;;\"";[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic semaphore in uthread[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new()[m
[31m-[m
[31m-            local function sem_wait()[m
[31m-                ngx.say("enter waiting")[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.say("err: ", err)[m
[31m-                else[m
[31m-                    ngx.say("wait success")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local co = ngx.thread.spawn(sem_wait)[m
[31m-[m
[31m-            ngx.say("back in main thread")[m
[31m-[m
[31m-            sem:post()[m
[31m-[m
[31m-            ngx.say("still in main thread")[m
[31m-[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            ngx.say("main thread end")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-enter waiting[m
[31m-back in main thread[m
[31m-still in main thread[m
[31m-wait success[m
[31m-main thread end[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: semaphore wait order[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new()[m
[31m-[m
[31m-            local function sem_wait(id)[m
[31m-                ngx.say("enter waiting, id: ", id)[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.say("err: ", err)[m
[31m-                else[m
[31m-                    ngx.say("wait success, id: ", id)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local co1 = ngx.thread.spawn(sem_wait, 1)[m
[31m-            local co2 = ngx.thread.spawn(sem_wait, 2)[m
[31m-[m
[31m-            ngx.say("back in main thread")[m
[31m-[m
[31m-            sem:post(2)[m
[31m-[m
[31m-            local ok, err = sem:wait(0)[m
[31m-            if ok then[m
[31m-                ngx.say("wait success in main thread")[m
[31m-            else[m
[31m-                ngx.say("wait failed in main thread: ", err) -- busy[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("still in main thread")[m
[31m-[m
[31m-            local ok, err = sem:wait(0.01)[m
[31m-            if ok then[m
[31m-                ngx.say("wait success in main thread")[m
[31m-            else[m
[31m-                ngx.say("wait failed in main thread: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            ngx.say("main thread end")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-enter waiting, id: 1[m
[31m-enter waiting, id: 2[m
[31m-back in main thread[m
[31m-wait failed in main thread: timeout[m
[31m-still in main thread[m
[31m-wait success, id: 1[m
[31m-wait success, id: 2[m
[31m-wait failed in main thread: timeout[m
[31m-main thread end[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: semaphore wait time=0[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(1)[m
[31m-[m
[31m-            local function wait_1s()[m
[31m-                ngx.say("enter 1s wait")[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.say("err in wait 1s: ", err)[m
[31m-                else[m
[31m-                    ngx.say("wait success in 1s wait")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function wait_0()[m
[31m-                local ok, err = sem:wait(0)[m
[31m-                if not ok then[m
[31m-                    ngx.say("err: ", err)[m
[31m-                else[m
[31m-                    ngx.say("wait success")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            wait_0()[m
[31m-            wait_0()[m
[31m-[m
[31m-            local co = ngx.thread.spawn(wait_1s)[m
[31m-[m
[31m-            ngx.say("back in main thread")[m
[31m-[m
[31m-            wait_0()[m
[31m-[m
[31m-            sem:post(2)[m
[31m-[m
[31m-            wait_0()[m
[31m-[m
[31m-            ngx.say("still in main thread")[m
[31m-[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            wait_0()[m
[31m-[m
[31m-            ngx.say("main thread end")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-wait success[m
[31m-err: timeout[m
[31m-enter 1s wait[m
[31m-back in main thread[m
[31m-err: timeout[m
[31m-err: timeout[m
[31m-still in main thread[m
[31m-wait success in 1s wait[m
[31m-wait success[m
[31m-main thread end[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: basic semaphore in subrequest[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua_block {[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/sem_wait"},[m
[31m-                { "/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local g = package.loaded["semaphore_test"] or {}[m
[31m-            package.loaded["semaphore_test"] = g[m
[31m-[m
[31m-            if not g.test then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    return[m
[31m-                end[m
[31m-                g.test = sem[m
[31m-            end[m
[31m-            local sem = g.test[m
[31m-            local ok, err = sem:wait(1)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local g = package.loaded["semaphore_test"] or {}[m
[31m-            package.loaded["semaphore_test"] = g[m
[31m-[m
[31m-            if not g.test then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    ngx.exit(500)[m
[31m-                end[m
[31m-                g.test = sem[m
[31m-            end[m
[31m-            local sem = g.test[m
[31m-            ngx.sleep(0.001)[m
[31m-            collectgarbage("collect")[m
[31m-            sem:post()[m
[31m-            ngx.print("post")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: semaphore.new in init_by_lua* (w/o shdict)[m
[31m---- http_config[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, err)[m
[31m-        else[m
[31m-            ngx.log(ngx.WARN, "sema created: ", tostring(sem))[m
[31m-        end[m
[31m-        sem:post(2)[m
[31m-        package.loaded.my_sema = sem[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.my_sema[m
[31m-            ngx.say("sem count: ", sem:count())[m
[31m-            -- sem:post(1)[m
[31m-            local ok, err = sem:wait(0)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("waited successfully.")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like[m
[31m-sem count: [12][m
[31m-waited successfully.[m
[31m---- grep_error_log eval[m
[31m-qr/\[lua\] init_by_lua:\d+: sema created: table: 0x[a-f0-9]+/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-qr/\[lua\] init_by_lua:\d+: sema created: table: 0x[a-f0-9]+/,[m
[31m-"",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: semaphore.new in init_by_lua* (with shdict)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, err)[m
[31m-        else[m
[31m-            ngx.log(ngx.WARN, "sema created: ", tostring(sem))[m
[31m-        end[m
[31m-        sem:post(2)[m
[31m-        package.loaded.my_sema = sem[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.my_sema[m
[31m-            ngx.say("sem count: ", sem:count())[m
[31m-            -- sem:post(1)[m
[31m-            local ok, err = sem:wait(0)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("waited successfully.")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like[m
[31m-sem count: [12][m
[31m-waited successfully.[m
[31m---- grep_error_log eval[m
[31m-qr/\[lua\] init_by_lua:\d+: sema created: table: 0x[a-f0-9]+/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-qr/\[lua\] init_by_lua:\d+: sema created: table: 0x[a-f0-9]+/,[m
[31m-"",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: semaphore in init_worker_by_lua (wait is not allowed)[m
[31m---- http_config[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_worker_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, "sem new: ", err)[m
[31m-        end[m
[31m-[m
[31m-        sem:post(1)[m
[31m-[m
[31m-        local count = sem:count()[m
[31m-        ngx.log(ngx.ERR, "sem count: ", count)[m
[31m-[m
[31m-        local ok, err = sem:wait(0.1)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "sem wait: ", err)[m
[31m-        end[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo "ok";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem \w+: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem count: 1,[m
[31m-sem wait: API disabled in the context of init_worker_by_lua*,[m
[31m-",[m
[31m-"",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: semaphore in init_worker_by_lua (new and post)[m
[31m---- http_config[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_worker_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, "sem new: ", err)[m
[31m-        end[m
[31m-[m
[31m-        sem:post(2)[m
[31m-[m
[31m-        local count = sem:count()[m
[31m-        ngx.log(ngx.WARN, "sem count: ", count)[m
[31m-[m
[31m-        package.loaded.my_sema = sem[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.my_sema[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("sem wait successfully.")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sem wait successfully.[m
[31m---- grep_error_log eval: qr/sem \w+: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem count: 2,[m
[31m-",[m
[31m-""[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: semaphore in set_by_lua (wait is not allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set_by_lua_block $res {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-        echo "ok";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of set_by_lua*,[m
[31m-",[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of set_by_lua*,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: semaphore in rewrite_by_lua (all allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sem:wait(0.01)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-        echo "ok";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: semaphore in access_by_lua (all allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sem:wait(0.01)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-        echo "ok";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: semaphore in content_by_lua (all allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sem:wait(0.01)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            else[m
[31m-                ngx.say("ok")[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: semaphore in log_by_lua (wait not allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo "ok";[m
[31m-        log_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 1 while logging request,[m
[31m-sem: API disabled in the context of log_by_lua* while logging request,[m
[31m-",[m
[31m-"sem: 1 while logging request,[m
[31m-sem: API disabled in the context of log_by_lua* while logging request,[m
[31m-",[m
[31m-][m
[31m---- wait: 0.2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: semaphore in header_filter_by_lua (wait not allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo "ok";[m
[31m-        header_filter_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of header_filter_by_lua*,[m
[31m-",[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of header_filter_by_lua*,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: semaphore in body_filter_by_lua (wait not allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo "ok";[m
[31m-        body_filter_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-[m
[31m-            sem:post(1)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-            local ok, err = sem:wait(0.1)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "sem: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of body_filter_by_lua*,[m
[31m-sem: 1,[m
[31m-sem: API disabled in the context of body_filter_by_lua*,[m
[31m-",[m
[31m-"sem: 1,[m
[31m-sem: API disabled in the context of body_filter_by_lua*,[m
[31m-sem: 1,[m
[31m-sem: API disabled in the context of body_filter_by_lua*,[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: semaphore in ngx.timer (all allowed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            local function func_sem()[m
[31m-                local semaphore = require "ngx.semaphore"[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.log(ngx.ERR, "sem: ", err)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sem:wait(0.01)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "sem: ", err)[m
[31m-                end[m
[31m-[m
[31m-                sem:post(1)[m
[31m-[m
[31m-                local count = sem:count()[m
[31m-                ngx.log(ngx.ERR, "sem: ", count)[m
[31m-[m
[31m-                local ok, err = sem:wait(0.1)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "sem: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.timer.at(0, func_sem)[m
[31m-            if ok then[m
[31m-                ngx.sleep(0.01)[m
[31m-                ngx.say("ok")[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-"sem: timeout,[m
[31m-sem: 1,[m
[31m-",[m
[31m-][m
[31m---- wait: 0.2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: semaphore post in all phase (in a request)[m
[31m---- http_config[m
[31m-    lua_package_path $TEST_NGINX_LUA_PACKAGE_PATH;[m
[31m-    init_worker_by_lua_block {[m
[31m-        local semaphore = require "ngx.semaphore"[m
[31m-        local sem, err = semaphore.new(0)[m
[31m-        if not sem then[m
[31m-            ngx.log(ngx.ERR, err)[m
[31m-        end[m
[31m-        package.loaded.sem = sem[m
[31m-[m
[31m-        local function wait()[m
[31m-            local i = 0[m
[31m-            while true do[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "sem: ", err)[m
[31m-                end[m
[31m-                i = i + 1[m
[31m-                if i % 6 == 0 then[m
[31m-                    ngx.log(ngx.ERR, "sem: 6 times")[m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, wait)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "sem: ", err)[m
[31m-        end[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set_by_lua_block $res {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        rewrite_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        access_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-        header_filter_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        body_filter_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/sem: .*?,/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"sem: 6 times,[m
[31m-",[m
[31m-"sem: 6 times,[m
[31m-",[m
[31m-][m
[31m---- wait: 0.2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: semaphore wait post in access_by_lua[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-[m
[31m-            local func_wait = function ()[m
[31m-                ngx.say("enter wait")[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if ok then[m
[31m-                    ngx.say("wait success")[m
[31m-                end[m
[31m-            end[m
[31m-            local func_post = function ()[m
[31m-                ngx.say("enter post")[m
[31m-[m
[31m-                sem:post()[m
[31m-                ngx.say("post success")[m
[31m-            end[m
[31m-[m
[31m-            local co1 = ngx.thread.spawn(func_wait)[m
[31m-            local co2 = ngx.thread.spawn(func_post)[m
[31m-[m
[31m-            ngx.thread.wait(co1)[m
[31m-            ngx.thread.wait(co2)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-enter wait[m
[31m-enter post[m
[31m-post success[m
[31m-wait success[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: semaphore wait post in rewrite_by_lua[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-[m
[31m-            local func_wait = function ()[m
[31m-                ngx.say("enter wait")[m
[31m-[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if ok then[m
[31m-                    ngx.say("wait success")[m
[31m-                end[m
[31m-            end[m
[31m-            local func_post = function ()[m
[31m-                ngx.say("enter post")[m
[31m-[m
[31m-                sem:post()[m
[31m-                ngx.say("post success")[m
[31m-            end[m
[31m-[m
[31m-            local co1 = ngx.thread.spawn(func_wait)[m
[31m-            local co2 = ngx.thread.spawn(func_post)[m
[31m-[m
[31m-            ngx.thread.wait(co1)[m
[31m-            ngx.thread.wait(co2)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-enter wait[m
[31m-enter post[m
[31m-post success[m
[31m-wait success[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: semaphore wait in timer.at[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new()[m
[31m-[m
[31m-            local function func_wait(premature)[m
[31m-                local ok, err = sem:wait(1)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, err)[m
[31m-                else[m
[31m-                    ngx.log(ngx.ERR, "wait success")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.timer.at(0, func_wait)[m
[31m-[m
[31m-            sem:post()[m
[31m-            ngx.sleep(0.01)[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-wait success[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: semaphore post in header_filter_by_lua (subrequest)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/sem_wait"},[m
[31m-                {"/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    ngx.exit(500)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            local ok, err = sem:wait(1)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-                ngx.exit(200)[m
[31m-            else[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        header_filter_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.log(ngx.ERR, err)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            ngx.print("post")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: semaphore post in body_filter_by_lua (subrequest)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/sem_wait"},[m
[31m-                {"/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    ngx.exit(500)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            local ok, err = sem:wait(10)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-                ngx.exit(200)[m
[31m-            else[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        body_filter_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.log(ngx.ERR, err)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            ngx.print("post")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: semaphore post in set_by_lua[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/sem_wait"},[m
[31m-                {"/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.say(err)[m
[31m-                    ngx.exit(500)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            local ok, err = sem:wait(10)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-                ngx.exit(200)[m
[31m-            else[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        set_by_lua_block $res {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            if not package.loaded.sem then[m
[31m-                local sem, err = semaphore.new(0)[m
[31m-                if not sem then[m
[31m-                    ngx.log(ngx.ERR, err)[m
[31m-                end[m
[31m-                package.loaded.sem = sem[m
[31m-            end[m
[31m-            local sem = package.loaded.sem[m
[31m-            sem:post()[m
[31m-        }[m
[31m-        content_by_lua_block {[m
[31m-            ngx.print("post")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: semaphore post in timer.at[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            package.loaded.sem = semaphore.new(0)[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/sem_wait"},[m
[31m-                {"/sem_post"},[m
[31m-            }[m
[31m-            ngx.say(res1.status)[m
[31m-            ngx.say(res1.body)[m
[31m-            ngx.say(res2.status)[m
[31m-            ngx.say(res2.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_wait {[m
[31m-        content_by_lua_block {[m
[31m-            local sem = package.loaded.sem[m
[31m-            local ok, err = sem:wait(2)[m
[31m-            if ok then[m
[31m-                ngx.print("wait")[m
[31m-                ngx.exit(200)[m
[31m-            else[m
[31m-                ngx.status = 500[m
[31m-                ngx.say(err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /sem_post {[m
[31m-        content_by_lua_block {[m
[31m-            local function func(premature)[m
[31m-                local sem = package.loaded.sem[m
[31m-                sem:post()[m
[31m-            end[m
[31m-            ngx.timer.at(0, func, g)[m
[31m-            ngx.sleep(0)[m
[31m-            ngx.print("post")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-200[m
[31m-wait[m
[31m-200[m
[31m-post[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: two thread wait for each other[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem_A = semaphore.new(0)[m
[31m-            local sem_B = semaphore.new(0)[m
[31m-            if not sem_A or not sem_B then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-[m
[31m-            local function th_A()[m
[31m-                for i = 1, 11 do[m
[31m-                    local ok, err = sem_A:wait(1)[m
[31m-                    if not ok then[m
[31m-                        ngx.log(ngx.ERR, err)[m
[31m-                    end[m
[31m-                    sem_B:post(1)[m
[31m-                end[m
[31m-                ngx.say("count in A: ", sem_A:count())[m
[31m-            end[m
[31m-            local function th_B()[m
[31m-                for i = 1, 10 do[m
[31m-                    local ok, err = sem_B:wait(1)[m
[31m-                    if not ok then[m
[31m-                        ngx.log(ngx.ERR, err)[m
[31m-                    end[m
[31m-                    sem_A:post(1)[m
[31m-                end[m
[31m-                ngx.say("count in B: ", sem_B:count())[m
[31m-            end[m
[31m-[m
[31m-            local co_A = ngx.thread.spawn(th_A)[m
[31m-            local co_B = ngx.thread.spawn(th_B)[m
[31m-[m
[31m-            sem_A:post(1)[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-count in B: 0[m
[31m-count in A: 0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: kill a light thread that is waiting on a semaphore(no resource)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-[m
[31m-            local function func_wait()[m
[31m-                sem:wait(1)[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(func_wait)[m
[31m-            local ok, err = ngx.thread.kill(co)[m
[31m-            if ok then[m
[31m-                ngx.say("ok")[m
[31m-            else[m
[31m-                ngx.say(err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: kill a light thread that is waiting on a semaphore(after post)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-[m
[31m-            local function func_wait()[m
[31m-                sem:wait(1)[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(func_wait)[m
[31m-[m
[31m-            sem:post()[m
[31m-            local ok, err = ngx.thread.kill(co)[m
[31m-[m
[31m-            if ok then[m
[31m-                ngx.say("ok")[m
[31m-            else[m
[31m-                ngx.say(err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.say("count: ", count)[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m-count: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: kill a thread that is waiting on another thread that is waiting on semaphore[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-[m
[31m-            local function sem_wait()[m
[31m-                ngx.say("sem waiting start")[m
[31m-                local ok, err = sem:wait(0.1)[m
[31m-                if not ok then[m
[31m-                    ngx.say("sem wait err: ", err)[m
[31m-                end[m
[31m-                ngx.say("sem waiting done")[m
[31m-            end[m
[31m-[m
[31m-            local function thread_wait()[m
[31m-                local co = ngx.thread.spawn(sem_wait)[m
[31m-[m
[31m-                ngx.say("thread waiting start")[m
[31m-                local ok, err = ngx.thread.wait(co)[m
[31m-                if not ok then[m
[31m-                    ngx.say("thread wait err: ", err)[m
[31m-                end[m
[31m-                ngx.say("thread waiting done")[m
[31m-            end[m
[31m-[m
[31m-            local co2 = ngx.thread.spawn(thread_wait)[m
[31m-            ngx.sleep(0.01)[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(co2)[m
[31m-            if ok then[m
[31m-                ngx.say("thread kill success")[m
[31m-            else[m
[31m-                ngx.say("kill err: ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-sem waiting start[m
[31m-thread waiting start[m
[31m-thread kill success[m
[31m-sem wait err: timeout[m
[31m-sem waiting done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: a light thread that is going to exit is waiting on a semaphore[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-            local function func(sem)[m
[31m-                ngx.say("sem waiting")[m
[31m-                local ok, err = sem:wait(0.1)[m
[31m-                if ok then[m
[31m-                    ngx.say("wait success")[m
[31m-                else[m
[31m-                    ngx.say("err: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(func, sem)[m
[31m-            ngx.say("ok")[m
[31m-            ngx.exit(200)[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-sem waiting[m
[31m-ok[m
[31m---- error_log[m
[31m-http lua semaphore cleanup[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: main thread wait a light thread that is waiting on a semaphore[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                error("create failed")[m
[31m-            end[m
[31m-            local function func(sem)[m
[31m-                local ok, err = sem:wait(0.001)[m
[31m-                if ok then[m
[31m-                    ngx.say("wait success")[m
[31m-                else[m
[31m-                    ngx.say("err: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(func, sem)[m
[31m-            ngx.thread.wait(co)[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-err: timeout[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: multi wait and mult post with one semaphore[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if not sem then[m
[31m-                ngx.log(ngx.ERR, err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            local function func(op, id)[m
[31m-                ngx.say(op, ": ", id)[m
[31m-                if op == "wait" then[m
[31m-                    local ok, err = sem:wait(1)[m
[31m-                    if ok then[m
[31m-                        ngx.say("wait success: ", id)[m
[31m-                    end[m
[31m-                else[m
[31m-                    sem:post()[m
[31m-                end[m
[31m-            end[m
[31m-            local tco = {}[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                tco[#tco + 1] = ngx.thread.spawn(func, "wait", i)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                tco[#tco + 1] = ngx.thread.spawn(func, "post", i)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, #tco do[m
[31m-                ngx.thread.wait(tco[i])[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-wait: 1[m
[31m-wait: 2[m
[31m-wait: 3[m
[31m-post: 1[m
[31m-post: 2[m
[31m-post: 3[m
[31m-wait success: 1[m
[31m-wait success: 2[m
[31m-wait success: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: semaphore wait time is zero[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            local ok, err = sem:wait(0)[m
[31m-            if not ok then[m
[31m-                ngx.say(err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-timeout[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: test semaphore gc[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem, err = semaphore.new(0)[m
[31m-            if sem then[m
[31m-                ngx.say("success")[m
[31m-            end[m
[31m-            sem = nil[m
[31m-            collectgarbage("collect")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-success[m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-in lua gc, semaphore[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: basic semaphore_mm alloc[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(0)[m
[31m-            if sem then[m
[31m-                ngx.say("ok")[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/(new block, alloc semaphore|from head of free queue, alloc semaphore)/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"new block, alloc semaphore[m
[31m-",[m
[31m-"from head of free queue, alloc semaphore[m
[31m-",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: basic semaphore_mm free insert tail[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sems = package.loaded.sems or {}[m
[31m-            package.loaded.sems = sems[m
[31m-[m
[31m-            local num_per_block = 4095[m
[31m-            if not sems[num_per_block] then[m
[31m-                for i = 1, num_per_block * 3 do[m
[31m-                    sems[i] = semaphore.new(0)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                if sems[i] then[m
[31m-                    sems[i] = nil[m
[31m-                    ngx.say("ok")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            collectgarbage("collect")[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-add to free queue tail[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: basic semaphore_mm free insert head[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sems = package.loaded.sems or {}[m
[31m-            package.loaded.sems = sems[m
[31m-[m
[31m-            local num_per_block = 4095[m
[31m-            if not sems[num_per_block] then[m
[31m-                for i = 1, num_per_block * 3 do[m
[31m-                    sems[i] = semaphore.new(0)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            if sems[#sems] then[m
[31m-                sems[#sems] = nil[m
[31m-                ngx.say("ok")[m
[31m-            end[m
[31m-            collectgarbage("collect")[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-add to free queue head[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: semaphore_mm free block (load <= 50% & the on the older side)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sems = package.loaded.sems or {}[m
[31m-            package.loaded.sems = sems[m
[31m-[m
[31m-            local num_per_block = 4095[m
[31m-            if not sems[num_per_block * 3] then[m
[31m-                for i = 1, num_per_block * 3 do[m
[31m-                    sems[i] = semaphore.new(0)[m
[31m-                end[m
[31m-[m
[31m-                for i = num_per_block + 1, num_per_block * 2 do[m
[31m-                    sems[i] = nil[m
[31m-                end[m
[31m-            else[m
[31m-                for i = 1, num_per_block do[m
[31m-                    sems[i] = nil[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage("collect")[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- log_level: debug[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/free semaphore block/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"",[m
[31m-"free semaphore block[m
[31m-",[m
[31m-][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: basic semaphore count[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new(10)[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-[m
[31m-            sem:wait(0)[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-[m
[31m-            sem:post(3)[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-10[m
[31m-9[m
[31m-12[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: basic semaphore count(negative number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sem = semaphore.new()[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-[m
[31m-            local function wait()[m
[31m-                sem:wait(0.01)[m
[31m-            end[m
[31m-            local co = ngx.thread.spawn(wait)[m
[31m-[m
[31m-            local count = sem:count()[m
[31m-            ngx.say(count)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-0[m
[31m--1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: bugfix: semaphore instance can't be garbage collected when someone is waiting on it[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-[m
[31m-            local my_sema = {}[m
[31m-            local key = "my key"[m
[31m-[m
[31m-            local function my_clean()[m
[31m-                print("cleaning up")[m
[31m-[m
[31m-                my_sema[key]:post()[m
[31m-                my_sema[key] = nil[m
[31m-[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.timer.at(0.001, my_clean)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to create timer: ", err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            my_sema[key] = semaphore:new(0)[m
[31m-[m
[31m-            local ok, err = my_sema[key]:wait(2)[m
[31m-            ngx.say(ok, ", ", err)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-true, nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/sha1_bin.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/sha1_bin.t[m
[1mdeleted file mode 100644[m
[1mindex 8187941..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/sha1_bin.t[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set sha1_bin (string)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /sha1_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.sha1_bin("hello")[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1_bin[m
[31m---- response_body[m
[31m-20[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set sha1_bin (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /sha1_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.sha1_bin(nil)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1_bin[m
[31m---- response_body[m
[31m-20[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set sha1_bin (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /sha1_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.sha1_bin(3.14)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1_bin[m
[31m---- response_body[m
[31m-20[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set sha1_bin (boolean)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /sha1_bin {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.sha1_bin(true)[m
[31m-            end[m
[31m-            ngx.say(string.len(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1_bin[m
[31m---- response_body[m
[31m-20[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/shdict.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/shdict.t[m
[1mdeleted file mode 100644[m
[1mindex c62e25e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/shdict.t[m
[1m+++ /dev/null[m
[36m@@ -1,917 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 2);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, forcible = dogs:set("foo", "bar", 0, 72)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):11 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get an nonexistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            -- dogs:set("foo", "bar")[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: nil[m
[31m-value: nil[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get a boolean value (true)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", true, 0, 5678)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: boolean[m
[31m-value: true[m
[31m-flags: 5678[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get a boolean value (false)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", false, 0, 777)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: boolean[m
[31m-value: false[m
[31m-flags: 777[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get a number value (int)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", 51203)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 51203[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: get a number value (double)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", 3.1415926, 0, 78)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 3.1415926[m
[31m-flags: 78[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get a large string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", string.rep("bbbb", 1024) .. "a", 0, 912)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags = dogs:get("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"value type: string[m
[31m-value: " . ("bbbb" x 1024) . "a[m
[31m-flags: 912[m
[31m-"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: get_stale (false)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags, stale[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", "bar", 0, 72)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags, stale = dogs:get_stale("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-            ngx.say("stale: ", stale)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m-stale: false[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get_stale (true)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags, stale[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, forcible = dogs:set("foo", "bar", 0.001, 72)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.sleep(0.002)[m
[31m-            for i = 1, 100 do[m
[31m-                val, flags, stale = dogs:get_stale("foo")[m
[31m-            end[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-            ngx.say("stale: ", stale)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m-stale: true[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):12 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: incr int[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, foricible = dogs:set("foo", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            for i = 1, 100 do[m
[31m-                val, err = dogs:incr("foo", 2)[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: 256[m
[31m-err: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):11 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: incr double[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", 56)[m
[31m-            for i = 1, 100 do[m
[31m-                val, err = dogs:incr("foo", 2.1)[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: 266[m
[31m-err: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:set("foo", "bar", 0, 72)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: set a boolean value (true)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:set("foo", true, 0, 5678)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: boolean[m
[31m-value: true[m
[31m-flags: 5678[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set a boolean value (false)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 100 do[m
[31m-                dogs:set("foo", false, 0, 777)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: boolean[m
[31m-value: false[m
[31m-flags: 777[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set a number value (int)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 100 do[m
[31m-                dogs:set("foo", 51203)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 51203[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set a number value (double)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 100 do[m
[31m-                dogs:set("foo", 3.1415926, 0, 78)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 3.1415926[m
[31m-flags: 78[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set a number value and a nil[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 150 do[m
[31m-                dogs:set("foo", 3.1415926, 0, 78)[m
[31m-                dogs:set("foo", nil)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: nil[m
[31m-value: nil[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: safe set a number value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 100 do[m
[31m-                dogs:safe_set("foo", 3.1415926, 0, 78)[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: number[m
[31m-value: 3.1415926[m
[31m-flags: 78[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: add a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:flush_all()[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:add("foo" .. i, "bar", 0, 72)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo100")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):8 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: safe add a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:flush_all()[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:safe_add("foo" .. i, "bar", 0, 72)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo100")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):8 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: replace a string value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            dogs:set("foo", "hello")[m
[31m-            local ok, err, forcible[m
[31m-            for i = 1, 100 do[m
[31m-                ok, err, forcible = dogs:replace("foo", "bar" .. i, 0, 72)[m
[31m-            end[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: string[m
[31m-value: bar100[m
[31m-flags: 72[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):8 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: set a number value and delete[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 150 do[m
[31m-                dogs:set("foo", 3.1415926, 0, 78)[m
[31m-                dogs:delete("foo")[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: nil[m
[31m-value: nil[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):6 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: set nil key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set(nil, "bar")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to set: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: get nil key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local value, err = dogs:get(nil, "bar")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to get: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: get stale key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local value, err = dogs:get_stale(nil, "bar")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to get stale: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to get stale: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: incr key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local value, err = dogs:incr(nil, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to incr: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to incr: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: flush_all[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val, flags[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "bah")[m
[31m-            -- local cd = ffi.cast("void *", dogs)[m
[31m-            for i = 1, 150 do[m
[31m-                dogs:flush_all()[m
[31m-            end[m
[31m-            val, flags = dogs:get("foo")[m
[31m-            ngx.say("value type: ", type(val))[m
[31m-            ngx.say("value: ", val)[m
[31m-            ngx.say("flags: ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value type: nil[m
[31m-value: nil[m
[31m-flags: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):7 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-stitch[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ssl.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ssl.t[m
[1mdeleted file mode 100644[m
[1mindex 81cca13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/ssl.t[m
[1m+++ /dev/null[m
[36m@@ -1,1559 +0,0 @@[m
[31m-# vim:set ft=ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(10140);[m
[31m-#workers(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6 + 1);[m
[31m-[m
[31m-our $CWD = cwd();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-$ENV{TEST_NGINX_LUA_PACKAGE_PATH} = "$::CWD/lib/?.lua;;";[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear certs[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            ssl.clear_certs()[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-sslv3 alert handshake failure[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set DER cert and private key[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            ssl.clear_certs()[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/test.crt.der"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_cert(cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/test.key.der"))[m
[31m-            local pkey_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_priv_key(pkey_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read SNI name via ssl.server_name()[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            print("read SNI name from Lua: ", ssl.server_name())[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-read SNI name from Lua: test.com[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: read SNI name via ssl.server_name() when no SNI name specified[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local name = ssl.server_name(),[m
[31m-            print("read SNI name from Lua: ", name, ", type: ", type(name))[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, nil, true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-read SNI name from Lua: nil, type: nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: read raw server addr via ssl.raw_server_addr() (unix domain socket)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local addr, addrtyp, err = ssl.raw_server_addr()[m
[31m-            if not addr then[m
[31m-                ngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if addrtyp == "inet" then  -- IPv4[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),[m
[31m-                                   byte(addr, 3), byte(addr, 4))[m
[31m-                print("Using IPv4 address: ", ip)[m
[31m-[m
[31m-            elseif addrtyp == "inet6" then  -- IPv6[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 13), byte(addr, 14),[m
[31m-                                   byte(addr, 15), byte(addr, 16))[m
[31m-                print("Using IPv6 address: ", ip)[m
[31m-[m
[31m-            else  -- unix[m
[31m-                print("Using unix socket file ", addr)[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua ssl server name: "test.com"',[m
[31m-qr/Using unix socket file .*?nginx\.sock/[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: read raw server addr via ssl.raw_server_addr() (IPv4)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.1:12345 ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local byte = string.byte[m
[31m-[m
[31m-            local addr, addrtyp, err = ssl.raw_server_addr()[m
[31m-            if not addr then[m
[31m-                ngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if addrtyp == "inet" then  -- IPv4[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),[m
[31m-                                   byte(addr, 3), byte(addr, 4))[m
[31m-                print("Using IPv4 address: ", ip)[m
[31m-[m
[31m-            elseif addrtyp == "inet6" then  -- IPv6[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 13), byte(addr, 14),[m
[31m-                                   byte(addr, 15), byte(addr, 16))[m
[31m-                print("Using IPv6 address: ", ip)[m
[31m-[m
[31m-            else  -- unix[m
[31m-                print("Using unix socket file ", addr)[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", 12345)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-Using IPv4 address: 127.0.0.1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read raw server addr via ssl.raw_server_addr() (IPv6)[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen [::1]:12345 ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local byte = string.byte[m
[31m-[m
[31m-            local addr, addrtyp, err = ssl.raw_server_addr()[m
[31m-            if not addr then[m
[31m-                ngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            if addrtyp == "inet" then  -- IPv4[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),[m
[31m-                                   byte(addr, 3), byte(addr, 4))[m
[31m-                print("Using IPv4 address: ", ip)[m
[31m-[m
[31m-            elseif addrtyp == "inet6" then  -- IPv6[m
[31m-                ip = string.format("%d.%d.%d.%d", byte(addr, 13), byte(addr, 14),[m
[31m-                                   byte(addr, 15), byte(addr, 16))[m
[31m-                print("Using IPv6 address: ", ip)[m
[31m-[m
[31m-            else  -- unix[m
[31m-                print("Using unix socket file ", addr)[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("[::1]", 12345)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-Using IPv6 address: 0.0.0.1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- skip_eval: 3: system("ping6 -c 1 ::1 >/dev/null 2>&1") ne 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set DER cert chain[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            ssl.clear_certs()[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/chain.der"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_cert(cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/test-com.key.der"))[m
[31m-            local pkey_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_priv_key(pkey_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/chain/root-ca.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: read PEM cert chain but set DER cert chain[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            ssl.clear_certs()[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ssl.set_der_cert(cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/test-com.key.der"))[m
[31m-            local pkey_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            local ok, err = ssl.set_der_priv_key(pkey_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER private key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/chain/root-ca.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: tls version - SSLv3[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            local ver, err = ssl.get_tls1_version_str(resp)[m
[31m-            if not ver then[m
[31m-                ngx.log(ngx.ERR, "failed to get TLS1 version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "got TLS1 version: ", ver)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols SSLv3;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols SSLv3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-got TLS1 version: SSLv3,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: tls version - TLSv1[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            local ver, err = ssl.get_tls1_version_str(resp)[m
[31m-            if not ver then[m
[31m-                ngx.log(ngx.ERR, "failed to get TLS1 version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "got TLS1 version: ", ver)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols TLSv1;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols TLSv1;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-got TLS1 version: TLSv1,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: tls version - TLSv1.1[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            local ver, err = ssl.get_tls1_version_str(resp)[m
[31m-            if not ver then[m
[31m-                ngx.log(ngx.ERR, "failed to get TLS1 version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "got TLS1 version: ", ver)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols TLSv1.1;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols TLSv1.1;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-got TLS1 version: TLSv1.1,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: tls version - TLSv1.2[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            local ver, err = ssl.get_tls1_version_str(resp)[m
[31m-            if not ver then[m
[31m-                ngx.log(ngx.ERR, "failed to get TLS1 version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "got TLS1 version: ", ver)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols TLSv1.2;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols TLSv1.2;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-got TLS1 version: TLSv1.2,[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.semaphore in ssl_certificate_by_lua*[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-[m
[31m-            local sema = assert(semaphore.new())[m
[31m-[m
[31m-            local function f()[m
[31m-                assert(sema:wait(1))[m
[31m-            end[m
[31m-[m
[31m-            local t = assert(ngx.thread.spawn(f))[m
[31m-            ngx.sleep(0.25)[m
[31m-[m
[31m-            assert(sema:post())[m
[31m-[m
[31m-            assert(ngx.thread.wait(t))[m
[31m-            print("ssl cert by lua done")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-        ssl_protocols TLSv1.2;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    lua_ssl_protocols TLSv1.2;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- grep_error_log eval: qr/http lua semaphore (?:wait yielding|\w[^:,]*)/[m
[31m---- grep_error_log_out[m
[31m-http lua semaphore new[m
[31m-http lua semaphore wait[m
[31m-http lua semaphore wait yielding[m
[31m-http lua semaphore post[m
[31m---- error_log[m
[31m-ssl cert by lua done[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: read PEM key chain but set DER key chain[m
[31m---- http_config[m
[31m-    lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH/?.lua;;";[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-[m
[31m-            ssl.clear_certs()[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/chain.pem"))[m
[31m-            local cert_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            cert_data, err = ssl.cert_pem_to_der(cert_data)[m
[31m-            if not cert_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ssl.set_der_cert(cert_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/chain/test-com.key.pem"))[m
[31m-            local pkey_data = f:read("*a")[m
[31m-            f:close()[m
[31m-[m
[31m-            pkey_data, err = ssl.priv_key_pem_to_der(pkey_data)[m
[31m-            if not pkey_data then[m
[31m-                ngx.log(ngx.ERR, "failed to convert pem key to der key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ssl.set_der_priv_key(pkey_data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set private key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/chain/root-ca.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/status.t[m
[1mdeleted file mode 100644[m
[1mindex e611b78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/status.t[m
[1m+++ /dev/null[m
[36m@@ -1,92 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 7);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;\$prefix/html/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get ngx.status[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        return 201;[m
[31m-        header_filter_by_lua '[m
[31m-            local sum = 0[m
[31m-            for i = 1, 100 do[m
[31m-                sum = sum + ngx.status[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "sum: ", sum)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- error_code: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-["sum: 20100,",[m
[31m-qr/\[TRACE\s+\d+\s+header_filter_by_lua:3 loop\]/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set ngx.status[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        return 201;[m
[31m-        header_filter_by_lua '[m
[31m-            for i = 100, 200 do[m
[31m-                ngx.status = i[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "status: ", ngx.status)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- bad argument[m
[31m---- error_log eval[m
[31m-["status: 200,",[m
[31m-qr/\[TRACE\s+\d+\s+header_filter_by_lua:2 loop\]/[m
[31m-][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/time.t[m
[1mdeleted file mode 100644[m
[1mindex b9e1c7c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/time.t[m
[1m+++ /dev/null[m
[36m@@ -1,106 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        -- local verbose = true[m
[31m-        local verbose = false[m
[31m-        local outfile = "$Test::Nginx::Util::ErrLogFile"[m
[31m-        -- local outfile = "/tmp/v.log"[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, outfile)[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on(outfile)[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.opt.start("hotloop=1")[m
[31m-        -- jit.opt.start("loopunroll=1000000")[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.now()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.now()[m
[31m-            end[m
[31m-            ngx.sleep(0.10)[m
[31m-            local elapsed = ngx.now() - t[m
[31m-            ngx.say(t > 1399867351)[m
[31m-            ngx.say(">= 0.099: ", elapsed >= 0.099)[m
[31m-            ngx.say("< 0.11: ", elapsed < 0.11)[m
[31m-            -- ngx.say(t, " ", elapsed)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m->= 0.099: true[m
[31m-< 0.11: true[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.time()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-            for i = 1, 500 do[m
[31m-                t = ngx.time()[m
[31m-            end[m
[31m-            ngx.say(t > 1400960598)[m
[31m-            local diff = os.time() - t[m
[31m-            ngx.say(diff <= 1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-stitch[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/uri.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/uri.t[m
[1mdeleted file mode 100644[m
[1mindex cd531d4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/uri.t[m
[1m+++ /dev/null[m
[36m@@ -1,262 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: unescape_uri (string)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.unescape_uri("hello%20world")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-hello world[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unescape_uri (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.unescape_uri(nil)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unescape_uri (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.unescape_uri(3.14)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-3.14[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: escape_uri (string, escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri("hello world")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-hello%20world[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: escape_uri (string, no escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri("helloworld")[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-helloworld[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: escape_uri (nil)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(nil)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: escape_uri (number)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(3.14)[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body[m
[31m-3.14[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: escape_uri (larger than 4k, nothing to be escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(string.rep("a", 4097))[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "a" x 4097 . "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: escape_uri (a little smaller than 4k, need to be escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(string.rep(" ", 1365))[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "%20" x 1365 . "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: escape_uri (a little bigger than 4k, need to be escaped)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /uri {[m
[31m-        content_by_lua '[m
[31m-            local s[m
[31m-            for i = 1, 100 do[m
[31m-                s = ngx.escape_uri(string.rep(" ", 1366))[m
[31m-            end[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /uri[m
[31m---- response_body eval: "%20" x 1366 . "\n"[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/var.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/var.t[m
[1mdeleted file mode 100644[m
[1mindex a924641..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/var.t[m
[1m+++ /dev/null[m
[36m@@ -1,218 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on(nil, "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get normal var[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            for i = 1, 100 do[m
[31m-                val = ngx.var.foo[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: hello[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI: (?!return to lower frame)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get normal var (case)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            for i = 1, 100 do[m
[31m-                val = ngx.var.FOO[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: hello[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI: (?!return to lower frame)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get capturing var (bad)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            for i = 1, 100 do[m
[31m-                val = ngx.var[0][m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get capturing var[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location ~ '^(/t)' {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val[m
[31m-            for i = 1, 100 do[m
[31m-                val = ngx.var[1][m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: /t[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI: (?!return to lower frame)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set normal var (string value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local val = "hello"[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.var.foo = val[m
[31m-            end[m
[31m-            ngx.say("value: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: hello[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set normal var (nil value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.var.foo = nil[m
[31m-            end[m
[31m-            ngx.say("value: ", ngx.var.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: nil[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set normal var (number value)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo hello;[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            for i = 1, 100 do[m
[31m-                ngx.var.foo = i[m
[31m-            end[m
[31m-            ngx.say("value: ", ngx.var.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-value: 100[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/worker.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/worker.t[m
[1mdeleted file mode 100644[m
[1mindex 1083b14..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/worker.t[m
[1m+++ /dev/null[m
[36m@@ -1,144 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on("b", "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.worker.exiting[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local exiting = ngx.worker.exiting[m
[31m-            for i = 1, 400 do[m
[31m-                v = exiting()[m
[31m-            end[m
[31m-            ngx.say(v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-false[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.worker.pid[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local pid = ngx.worker.pid[m
[31m-            for i = 1, 400 do[m
[31m-                v = pid()[m
[31m-            end[m
[31m-            ngx.say(v == tonumber(ngx.var.pid))[m
[31m-            ngx.say(v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^true[m
[31m-\d+$[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.worker.id[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local id = ngx.worker.id[m
[31m-            for i = 1, 400 do[m
[31m-                v = id()[m
[31m-            end[m
[31m-            ngx.say("worker id: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^worker id: [0-1]$[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[31m---- skip_nginx: 3: <=1.9.0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.worker.count[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local count = ngx.worker.count[m
[31m-            for i = 1, 400 do[m
[31m-                v = count()[m
[31m-            end[m
[31m-            ngx.say("workers: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-workers: 1[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/worker_count_5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/worker_count_5.t[m
[1mdeleted file mode 100644[m
[1mindex c0d6828..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/t/worker_count_5.t[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-workers(5);[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";[m
[31m-    init_by_lua '[m
[31m-        local verbose = false[m
[31m-        if verbose then[m
[31m-            local dump = require "jit.dump"[m
[31m-            dump.on("b", "$Test::Nginx::Util::ErrLogFile")[m
[31m-        else[m
[31m-            local v = require "jit.v"[m
[31m-            v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-        end[m
[31m-[m
[31m-        require "resty.core"[m
[31m-        -- jit.off()[m
[31m-    ';[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.worker.count[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local v[m
[31m-            local count = ngx.worker.count[m
[31m-            for i = 1, 400 do[m
[31m-                v = count()[m
[31m-            end[m
[31m-            ngx.say("workers: ", v)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-workers: 5[m
[31m---- error_log eval[m
[31m-qr/\[TRACE   \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/[m
[31m---- no_error_log[m
[31m-[error][m
[31m- -- NYI:[m
[31m- stitch[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 389b0bc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-core-0.1.6/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_notify_init[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_connection[m
[31m-   fun:ngx_event_connect_peer[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex c3add77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-  matrix:[m
[31m-    - LUA=libluajit-5.1-dev LUA_DEV=libluajit-5.1-dev LUA_INCLUDE_DIR=/usr/include/luajit-2.0 LUA_CMODULE_DIR=/lib LUALIB=-lluajit-5.1[m
[31m-[m
[31m-install:[m
[31m-    - sudo apt-get update[m
[31m-    - sudo apt-get install -qq -y $LUA cpanminus[m
[31m-    - sudo cpanm --notest Test::Nginx > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-    - wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz[m
[31m-    - git clone https://github.com/openresty/lua-nginx-module.git[m
[31m-    - git clone https://github.com/openresty/lua-cjson.git[m
[31m-[m
[31m-script:[m
[31m-  - cd lua-cjson && make && sudo make install && cd ..[m
[31m-  - tar xzf nginx-${NGINX_VERSION}.tar.gz[m
[31m-  - cd nginx-${NGINX_VERSION}/[m
[31m-  - ./configure --with-debug --with-cc-opt="-DDEBUG_MALLOC" --with-ipv6 --add-module=../lua-nginx-module > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j2 > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - export PATH=$PATH:`pwd`/objs[m
[31m-  - cd ..[m
[31m-  - make[m
[31m-  - prove -lv t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/Makefile[m
[1mdeleted file mode 100644[m
[1mindex a9fc3fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/dns[m
[31m-	$(INSTALL) lib/resty/dns/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/dns/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/lib/resty/dns/resolver.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/lib/resty/dns/resolver.lua[m
[1mdeleted file mode 100644[m
[1mindex 08543a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/lib/resty/dns/resolver.lua[m
[1m+++ /dev/null[m
[36m@@ -1,889 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m--- local socket = require "socket"[m
[31m-local bit = require "bit"[m
[31m-local udp = ngx.socket.udp[m
[31m-local rand = math.random[m
[31m-local char = string.char[m
[31m-local byte = string.byte[m
[31m-local find = string.find[m
[31m-local gsub = string.gsub[m
[31m-local sub = string.sub[m
[31m-local rep = string.rep[m
[31m-local format = string.format[m
[31m-local band = bit.band[m
[31m-local rshift = bit.rshift[m
[31m-local lshift = bit.lshift[m
[31m-local insert = table.insert[m
[31m-local concat = table.concat[m
[31m-local re_sub = ngx.re.sub[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local log = ngx.log[m
[31m-local DEBUG = ngx.DEBUG[m
[31m-local randomseed = math.randomseed[m
[31m-local ngx_time = ngx.time[m
[31m-local unpack = unpack[m
[31m-local setmetatable = setmetatable[m
[31m-local type = type[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local DOT_CHAR = byte(".")[m
[31m-local ZERO_CHAR = byte("0")[m
[31m-local COLON_CHAR = byte(":")[m
[31m-[m
[31m-local IP6_ARPA = "ip6.arpa"[m
[31m-[m
[31m-local TYPE_A      = 1[m
[31m-local TYPE_NS     = 2[m
[31m-local TYPE_CNAME  = 5[m
[31m-local TYPE_PTR    = 12[m
[31m-local TYPE_MX     = 15[m
[31m-local TYPE_TXT    = 16[m
[31m-local TYPE_AAAA   = 28[m
[31m-local TYPE_SRV    = 33[m
[31m-local TYPE_SPF    = 99[m
[31m-[m
[31m-local CLASS_IN    = 1[m
[31m-[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION    = '0.16',[m
[31m-    TYPE_A      = TYPE_A,[m
[31m-    TYPE_NS     = TYPE_NS,[m
[31m-    TYPE_CNAME  = TYPE_CNAME,[m
[31m-    TYPE_PTR    = TYPE_PTR,[m
[31m-    TYPE_MX     = TYPE_MX,[m
[31m-    TYPE_TXT    = TYPE_TXT,[m
[31m-    TYPE_AAAA   = TYPE_AAAA,[m
[31m-    TYPE_SRV    = TYPE_SRV,[m
[31m-    TYPE_SPF    = TYPE_SPF,[m
[31m-    CLASS_IN    = CLASS_IN,[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local resolver_errstrs = {[m
[31m-    "format error",     -- 1[m
[31m-    "server failure",   -- 2[m
[31m-    "name error",       -- 3[m
[31m-    "not implemented",  -- 4[m
[31m-    "refused",          -- 5[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-local arpa_tmpl = new_tab(72, 0)[m
[31m-[m
[31m-for i = 1, #IP6_ARPA do[m
[31m-    arpa_tmpl[64 + i] = byte(IP6_ARPA, i)[m
[31m-end[m
[31m-[m
[31m-for i = 2, 64, 2 do[m
[31m-    arpa_tmpl[i] = DOT_CHAR[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.new(class, opts)[m
[31m-    if not opts then[m
[31m-        return nil, "no options table specified"[m
[31m-    end[m
[31m-[m
[31m-    local servers = opts.nameservers[m
[31m-    if not servers or #servers == 0 then[m
[31m-        return nil, "no nameservers specified"[m
[31m-    end[m
[31m-[m
[31m-    local timeout = opts.timeout or 2000  -- default 2 sec[m
[31m-[m
[31m-    local n = #servers[m
[31m-[m
[31m-    local socks = {}[m
[31m-[m
[31m-    for i = 1, n do[m
[31m-        local server = servers[i][m
[31m-        local sock, err = udp()[m
[31m-        if not sock then[m
[31m-            return nil, "failed to create udp socket: " .. err[m
[31m-        end[m
[31m-[m
[31m-        local host, port[m
[31m-        if type(server) == 'table' then[m
[31m-            host = server[1][m
[31m-            port = server[2] or 53[m
[31m-[m
[31m-        else[m
[31m-            host = server[m
[31m-            port = 53[m
[31m-            servers[i] = {host, port}[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = sock:setpeername(host, port)[m
[31m-        if not ok then[m
[31m-            return nil, "failed to set peer name: " .. err[m
[31m-        end[m
[31m-[m
[31m-        sock:settimeout(timeout)[m
[31m-[m
[31m-        insert(socks, sock)[m
[31m-    end[m
[31m-[m
[31m-    local tcp_sock, err = tcp()[m
[31m-    if not tcp_sock then[m
[31m-        return nil, "failed to create tcp socket: " .. err[m
[31m-    end[m
[31m-[m
[31m-    tcp_sock:settimeout(timeout)[m
[31m-[m
[31m-    return setmetatable([m
[31m-                { cur = rand(1, n), socks = socks,[m
[31m-                  tcp_sock = tcp_sock,[m
[31m-                  servers = servers,[m
[31m-                  retrans = opts.retrans or 5,[m
[31m-                  no_recurse = opts.no_recurse,[m
[31m-                }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function pick_sock(self, socks)[m
[31m-    local cur = self.cur[m
[31m-[m
[31m-    if cur == #socks then[m
[31m-        self.cur = 1[m
[31m-    else[m
[31m-        self.cur = cur + 1[m
[31m-    end[m
[31m-[m
[31m-    return socks[cur][m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _get_cur_server(self)[m
[31m-    local cur = self.cur[m
[31m-[m
[31m-    local servers = self.servers[m
[31m-[m
[31m-    if cur == 1 then[m
[31m-        return servers[#servers][m
[31m-    end[m
[31m-[m
[31m-    return servers[cur - 1][m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local socks = self.socks[m
[31m-    if not socks then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    for i = 1, #socks do[m
[31m-        local sock = socks[i][m
[31m-        sock:settimeout(timeout)[m
[31m-    end[m
[31m-[m
[31m-    local tcp_sock = self.tcp_sock[m
[31m-    if not tcp_sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    tcp_sock:settimeout(timeout)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _encode_name(s)[m
[31m-    return char(#s) .. s[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _decode_name(buf, pos)[m
[31m-    local labels = {}[m
[31m-    local nptrs = 0[m
[31m-    local p = pos[m
[31m-    while nptrs < 128 do[m
[31m-        local fst = byte(buf, p)[m
[31m-[m
[31m-        if not fst then[m
[31m-            return nil, 'truncated';[m
[31m-        end[m
[31m-[m
[31m-        -- print("fst at ", p, ": ", fst)[m
[31m-[m
[31m-        if fst == 0 then[m
[31m-            if nptrs == 0 then[m
[31m-                pos = pos + 1[m
[31m-            end[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        if band(fst, 0xc0) ~= 0 then[m
[31m-            -- being a pointer[m
[31m-            if nptrs == 0 then[m
[31m-                pos = pos + 2[m
[31m-            end[m
[31m-[m
[31m-            nptrs = nptrs + 1[m
[31m-[m
[31m-            local snd = byte(buf, p + 1)[m
[31m-            if not snd then[m
[31m-                return nil, 'truncated'[m
[31m-            end[m
[31m-[m
[31m-            p = lshift(band(fst, 0x3f), 8) + snd + 1[m
[31m-[m
[31m-            -- print("resolving ptr ", p, ": ", byte(buf, p))[m
[31m-[m
[31m-        else[m
[31m-            -- being a label[m
[31m-            local label = sub(buf, p + 1, p + fst)[m
[31m-            insert(labels, label)[m
[31m-[m
[31m-            -- print("resolved label ", label)[m
[31m-[m
[31m-            p = p + fst + 1[m
[31m-[m
[31m-            if nptrs == 0 then[m
[31m-                pos = p[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return concat(labels, "."), pos[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _build_request(qname, id, no_recurse, opts)[m
[31m-    local qtype[m
[31m-[m
[31m-    if opts then[m
[31m-        qtype = opts.qtype[m
[31m-    end[m
[31m-[m
[31m-    if not qtype then[m
[31m-        qtype = 1  -- A record[m
[31m-    end[m
[31m-[m
[31m-    local ident_hi = char(rshift(id, 8))[m
[31m-    local ident_lo = char(band(id, 0xff))[m
[31m-[m
[31m-    local flags[m
[31m-    if no_recurse then[m
[31m-        -- print("found no recurse")[m
[31m-        flags = "\0\0"[m
[31m-    else[m
[31m-        flags = "\1\0"[m
[31m-    end[m
[31m-[m
[31m-    local nqs = "\0\1"[m
[31m-    local nan = "\0\0"[m
[31m-    local nns = "\0\0"[m
[31m-    local nar = "\0\0"[m
[31m-    local typ = "\0" .. char(qtype)[m
[31m-    local class = "\0\1"    -- the Internet class[m
[31m-[m
[31m-    if byte(qname, 1) == DOT_CHAR then[m
[31m-        return nil, "bad name"[m
[31m-    end[m
[31m-[m
[31m-    local name = gsub(qname, "([^.]+)%.?", _encode_name) .. '\0'[m
[31m-[m
[31m-    return {[m
[31m-        ident_hi, ident_lo, flags, nqs, nan, nns, nar,[m
[31m-        name, typ, class[m
[31m-    }[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function parse_response(buf, id)[m
[31m-    local n = #buf[m
[31m-    if n < 12 then[m
[31m-        return nil, 'truncated';[m
[31m-    end[m
[31m-[m
[31m-    -- header layout: ident flags nqs nan nns nar[m
[31m-[m
[31m-    local ident_hi = byte(buf, 1)[m
[31m-    local ident_lo = byte(buf, 2)[m
[31m-    local ans_id = lshift(ident_hi, 8) + ident_lo[m
[31m-[m
[31m-    -- print("id: ", id, ", ans id: ", ans_id)[m
[31m-[m
[31m-    if ans_id ~= id then[m
[31m-        -- identifier mismatch and throw it away[m
[31m-        log(DEBUG, "id mismatch in the DNS reply: ", ans_id, " ~= ", id)[m
[31m-        return nil, "id mismatch"[m
[31m-    end[m
[31m-[m
[31m-    local flags_hi = byte(buf, 3)[m
[31m-    local flags_lo = byte(buf, 4)[m
[31m-    local flags = lshift(flags_hi, 8) + flags_lo[m
[31m-[m
[31m-    -- print(format("flags: 0x%x", flags))[m
[31m-[m
[31m-    if band(flags, 0x8000) == 0 then[m
[31m-        return nil, format("bad QR flag in the DNS response")[m
[31m-    end[m
[31m-[m
[31m-    if band(flags, 0x200) ~= 0 then[m
[31m-        return nil, "truncated"[m
[31m-    end[m
[31m-[m
[31m-    local code = band(flags, 0xf)[m
[31m-[m
[31m-    -- print(format("code: %d", code))[m
[31m-[m
[31m-    local nqs_hi = byte(buf, 5)[m
[31m-    local nqs_lo = byte(buf, 6)[m
[31m-    local nqs = lshift(nqs_hi, 8) + nqs_lo[m
[31m-[m
[31m-    -- print("nqs: ", nqs)[m
[31m-[m
[31m-    if nqs ~= 1 then[m
[31m-        return nil, format("bad number of questions in DNS response: %d", nqs)[m
[31m-    end[m
[31m-[m
[31m-    local nan_hi = byte(buf, 7)[m
[31m-    local nan_lo = byte(buf, 8)[m
[31m-    local nan = lshift(nan_hi, 8) + nan_lo[m
[31m-[m
[31m-    -- print("nan: ", nan)[m
[31m-[m
[31m-    -- skip the question part[m
[31m-[m
[31m-    local ans_qname, pos = _decode_name(buf, 13)[m
[31m-    if not ans_qname then[m
[31m-        return nil, pos[m
[31m-    end[m
[31m-[m
[31m-    -- print("qname in reply: ", ans_qname)[m
[31m-[m
[31m-    -- print("question: ", sub(buf, 13, pos))[m
[31m-[m
[31m-    if pos + 3 + nan * 12 > n then[m
[31m-        -- print(format("%d > %d", pos + 3 + nan * 12, n))[m
[31m-        return nil, 'truncated';[m
[31m-    end[m
[31m-[m
[31m-    -- question section layout: qname qtype(2) qclass(2)[m
[31m-[m
[31m-    local type_hi = byte(buf, pos)[m
[31m-    local type_lo = byte(buf, pos + 1)[m
[31m-    local ans_type = lshift(type_hi, 8) + type_lo[m
[31m-[m
[31m-    -- print("ans qtype: ", ans_type)[m
[31m-[m
[31m-    local class_hi = byte(buf, pos + 2)[m
[31m-    local class_lo = byte(buf, pos + 3)[m
[31m-    local qclass = lshift(class_hi, 8) + class_lo[m
[31m-[m
[31m-    -- print("ans qclass: ", qclass)[m
[31m-[m
[31m-    if qclass ~= 1 then[m
[31m-        return nil, format("unknown query class %d in DNS response", qclass)[m
[31m-    end[m
[31m-[m
[31m-    pos = pos + 4[m
[31m-[m
[31m-    local answers = {}[m
[31m-[m
[31m-    if code ~= 0 then[m
[31m-        answers.errcode = code[m
[31m-        answers.errstr = resolver_errstrs[code] or "unknown"[m
[31m-    end[m
[31m-[m
[31m-    for i = 1, nan do[m
[31m-        -- print(format("ans %d: qtype:%d qclass:%d", i, qtype, qclass))[m
[31m-[m
[31m-        local ans = {}[m
[31m-        insert(answers, ans)[m
[31m-[m
[31m-        local name[m
[31m-        name, pos = _decode_name(buf, pos)[m
[31m-        if not name then[m
[31m-            return nil, pos[m
[31m-        end[m
[31m-[m
[31m-        ans.name = name[m
[31m-[m
[31m-        -- print("name: ", name)[m
[31m-[m
[31m-        type_hi = byte(buf, pos)[m
[31m-        type_lo = byte(buf, pos + 1)[m
[31m-        local typ = lshift(type_hi, 8) + type_lo[m
[31m-[m
[31m-        ans.type = typ[m
[31m-[m
[31m-        -- print("type: ", typ)[m
[31m-[m
[31m-        class_hi = byte(buf, pos + 2)[m
[31m-        class_lo = byte(buf, pos + 3)[m
[31m-        local class = lshift(class_hi, 8) + class_lo[m
[31m-[m
[31m-        ans.class = class[m
[31m-[m
[31m-        -- print("class: ", class)[m
[31m-[m
[31m-        local ttl_bytes = { byte(buf, pos + 4, pos + 7) }[m
[31m-[m
[31m-        -- print("ttl bytes: ", concat(ttl_bytes, " "))[m
[31m-[m
[31m-        local ttl = lshift(ttl_bytes[1], 24) + lshift(ttl_bytes[2], 16)[m
[31m-                    + lshift(ttl_bytes[3], 8) + ttl_bytes[4][m
[31m-[m
[31m-        -- print("ttl: ", ttl)[m
[31m-[m
[31m-        ans.ttl = ttl[m
[31m-[m
[31m-        local len_hi = byte(buf, pos + 8)[m
[31m-        local len_lo = byte(buf, pos + 9)[m
[31m-        local len = lshift(len_hi, 8) + len_lo[m
[31m-[m
[31m-        -- print("record len: ", len)[m
[31m-[m
[31m-        pos = pos + 10[m
[31m-[m
[31m-        if typ == TYPE_A then[m
[31m-[m
[31m-            if len ~= 4 then[m
[31m-                return nil, "bad A record value length: " .. len[m
[31m-            end[m
[31m-[m
[31m-            local addr_bytes = { byte(buf, pos, pos + 3) }[m
[31m-            local addr = concat(addr_bytes, ".")[m
[31m-            -- print("ipv4 address: ", addr)[m
[31m-[m
[31m-            ans.address = addr[m
[31m-[m
[31m-            pos = pos + 4[m
[31m-[m
[31m-        elseif typ == TYPE_CNAME then[m
[31m-[m
[31m-            local cname, p = _decode_name(buf, pos)[m
[31m-            if not cname then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad cname record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-            -- print("cname: ", cname)[m
[31m-[m
[31m-            ans.cname = cname[m
[31m-[m
[31m-        elseif typ == TYPE_AAAA then[m
[31m-[m
[31m-            if len ~= 16 then[m
[31m-                return nil, "bad AAAA record value length: " .. len[m
[31m-            end[m
[31m-[m
[31m-            local addr_bytes = { byte(buf, pos, pos + 15) }[m
[31m-            local flds = {}[m
[31m-            local comp_begin, comp_end[m
[31m-            for i = 1, 16, 2 do[m
[31m-                local a = addr_bytes[i][m
[31m-                local b = addr_bytes[i + 1][m
[31m-                if a == 0 then[m
[31m-                    insert(flds, format("%x", b))[m
[31m-[m
[31m-                else[m
[31m-                    insert(flds, format("%x%02x", a, b))[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            -- we do not compress the IPv6 addresses by default[m
[31m-            --  due to performance considerations[m
[31m-[m
[31m-            ans.address = concat(flds, ":")[m
[31m-[m
[31m-            pos = pos + 16[m
[31m-[m
[31m-        elseif typ == TYPE_MX then[m
[31m-[m
[31m-            -- print("len = ", len)[m
[31m-[m
[31m-            if len < 3 then[m
[31m-                return nil, "bad MX record value length: " .. len[m
[31m-            end[m
[31m-[m
[31m-            local pref_hi = byte(buf, pos)[m
[31m-            local pref_lo = byte(buf, pos + 1)[m
[31m-[m
[31m-            ans.preference = lshift(pref_hi, 8) + pref_lo[m
[31m-[m
[31m-            local host, p = _decode_name(buf, pos + 2)[m
[31m-            if not host then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad cname record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            ans.exchange = host[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-        elseif typ == TYPE_SRV then[m
[31m-            if len < 7 then[m
[31m-                return nil, "bad SRV record value length: " .. len[m
[31m-            end[m
[31m-[m
[31m-            local prio_hi = byte(buf, pos)[m
[31m-            local prio_lo = byte(buf, pos + 1)[m
[31m-            ans.priority = lshift(prio_hi, 8) + prio_lo[m
[31m-[m
[31m-            local weight_hi = byte(buf, pos + 2)[m
[31m-            local weight_lo = byte(buf, pos + 3)[m
[31m-            ans.weight = lshift(weight_hi, 8) + weight_lo[m
[31m-[m
[31m-            local port_hi = byte(buf, pos + 4)[m
[31m-            local port_lo = byte(buf, pos + 5)[m
[31m-            ans.port = lshift(port_hi, 8) + port_lo[m
[31m-[m
[31m-            local name, p = _decode_name(buf, pos + 6)[m
[31m-            if not name then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad srv record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            ans.target = name[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-        elseif typ == TYPE_NS then[m
[31m-[m
[31m-            local name, p = _decode_name(buf, pos)[m
[31m-            if not name then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad cname record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-            -- print("name: ", name)[m
[31m-[m
[31m-            ans.nsdname = name[m
[31m-[m
[31m-        elseif typ == TYPE_TXT or typ == TYPE_SPF then[m
[31m-[m
[31m-            local key = (typ == TYPE_TXT) and "txt" or "spf"[m
[31m-[m
[31m-            local slen = byte(buf, pos)[m
[31m-            if slen + 1 > len then[m
[31m-                -- truncate the over-run TXT record data[m
[31m-                slen = len[m
[31m-            end[m
[31m-[m
[31m-            -- print("slen: ", len)[m
[31m-[m
[31m-            local val = sub(buf, pos + 1, pos + slen)[m
[31m-            local last = pos + len[m
[31m-            pos = pos + slen + 1[m
[31m-[m
[31m-            if pos < last then[m
[31m-                -- more strings to be processed[m
[31m-                -- this code path is usually cold, so we do not[m
[31m-                -- merge the following loop on this code path[m
[31m-                -- with the processing logic above.[m
[31m-[m
[31m-                val = {val}[m
[31m-                local idx = 2[m
[31m-                repeat[m
[31m-                    local slen = byte(buf, pos)[m
[31m-                    if pos + slen + 1 > last then[m
[31m-                        -- truncate the over-run TXT record data[m
[31m-                        slen = last - pos - 1[m
[31m-                    end[m
[31m-[m
[31m-                    val[idx] = sub(buf, pos + 1, pos + slen)[m
[31m-                    idx = idx + 1[m
[31m-                    pos = pos + slen + 1[m
[31m-[m
[31m-                until pos >= last[m
[31m-            end[m
[31m-[m
[31m-            ans[key] = val[m
[31m-[m
[31m-        elseif typ == TYPE_PTR then[m
[31m-[m
[31m-            local name, p = _decode_name(buf, pos)[m
[31m-            if not name then[m
[31m-                return nil, pos[m
[31m-            end[m
[31m-[m
[31m-            if p - pos ~= len then[m
[31m-                return nil, format("bad cname record length: %d ~= %d",[m
[31m-                                   p - pos, len)[m
[31m-            end[m
[31m-[m
[31m-            pos = p[m
[31m-[m
[31m-            -- print("name: ", name)[m
[31m-[m
[31m-            ans.ptrdname = name[m
[31m-[m
[31m-        else[m
[31m-            -- for unknown types, just forward the raw value[m
[31m-[m
[31m-            ans.rdata = sub(buf, pos, pos + len - 1)[m
[31m-            pos = pos + len[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return answers[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _gen_id(self)[m
[31m-    local id = self._id   -- for regression testing[m
[31m-    if id then[m
[31m-        return id[m
[31m-    end[m
[31m-    return rand(0, 65535)   -- two bytes[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _tcp_query(self, query, id)[m
[31m-    local sock = self.tcp_sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    log(DEBUG, "query the TCP server due to reply truncation")[m
[31m-[m
[31m-    local server = _get_cur_server(self)[m
[31m-[m
[31m-    local ok, err = sock:connect(server[1], server[2])[m
[31m-    if not ok then[m
[31m-        return nil, "failed to connect to TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    query = concat(query, "")[m
[31m-    local len = #query[m
[31m-[m
[31m-    local len_hi = char(rshift(len, 8))[m
[31m-    local len_lo = char(band(len, 0xff))[m
[31m-[m
[31m-    local bytes, err = sock:send({len_hi, len_lo, query})[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send query to TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    local buf, err = sock:receive(2)[m
[31m-    if not buf then[m
[31m-        return nil, "failed to receive the reply length field from TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    local len_hi = byte(buf, 1)[m
[31m-    local len_lo = byte(buf, 2)[m
[31m-    local len = lshift(len_hi, 8) + len_lo[m
[31m-[m
[31m-    -- print("tcp message len: ", len)[m
[31m-[m
[31m-    buf, err = sock:receive(len)[m
[31m-    if not buf then[m
[31m-        return nil, "failed to receive the reply message body from TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    local answers, err = parse_response(buf, id)[m
[31m-    if not answers then[m
[31m-        return nil, "failed to parse the reply from the TCP server "[m
[31m-            .. concat(server, ":") .. ": " .. err[m
[31m-    end[m
[31m-[m
[31m-    sock:close()[m
[31m-[m
[31m-    return answers[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.tcp_query(self, qname, opts)[m
[31m-    local socks = self.socks[m
[31m-    if not socks then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    pick_sock(self, socks)[m
[31m-[m
[31m-    local id = _gen_id(self)[m
[31m-[m
[31m-    local query, err = _build_request(qname, id, self.no_recurse, opts)[m
[31m-    if not query then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return _tcp_query(self, query, id)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.query(self, qname, opts)[m
[31m-    local socks = self.socks[m
[31m-    if not socks then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local id = _gen_id(self)[m
[31m-[m
[31m-    local query, err = _build_request(qname, id, self.no_recurse, opts)[m
[31m-    if not query then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    -- local cjson = require "cjson"[m
[31m-    -- print("query: ", cjson.encode(concat(query, "")))[m
[31m-[m
[31m-    local retrans = self.retrans[m
[31m-[m
[31m-    -- print("retrans: ", retrans)[m
[31m-[m
[31m-    for i = 1, retrans do[m
[31m-        local sock = pick_sock(self, socks)[m
[31m-[m
[31m-        local ok, err = sock:send(query)[m
[31m-        if not ok then[m
[31m-            local server = _get_cur_server(self)[m
[31m-            return nil, "failed to send request to UDP server "[m
[31m-                .. concat(server, ":") .. ": " .. err[m
[31m-        end[m
[31m-[m
[31m-        local buf, err[m
[31m-[m
[31m-        for j = 1, 128 do[m
[31m-            buf, err = sock:receive(4096)[m
[31m-[m
[31m-            if err then[m
[31m-                break[m
[31m-            end[m
[31m-[m
[31m-            if buf then[m
[31m-                local answers[m
[31m-                answers, err = parse_response(buf, id)[m
[31m-                if not answers then[m
[31m-                    if err == "truncated" then[m
[31m-                        return _tcp_query(self, query, id)[m
[31m-                    end[m
[31m-[m
[31m-                    if err ~= "id mismatch" then[m
[31m-                        return nil, err[m
[31m-                    end[m
[31m-[m
[31m-                    -- retry receiving when err == "id mismatch"[m
[31m-                else[m
[31m-                    return answers[m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if err ~= "timeout" or i == retrans then[m
[31m-            local server = _get_cur_server(self)[m
[31m-            return nil, "failed to receive reply from UDP server "[m
[31m-                .. concat(server, ":") .. ": " .. err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- impossible to reach here[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.compress_ipv6_addr(addr)[m
[31m-    local addr = re_sub(addr, "^(0:)+|(:0)+$|:(0:)+", "::", "jo")[m
[31m-    if addr == "::0" then[m
[31m-        addr = "::"[m
[31m-    end[m
[31m-[m
[31m-    return addr[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _expand_ipv6_addr(addr)[m
[31m-    if find(addr, "::", 1, true) then[m
[31m-        local ncol, addrlen = 8, #addr[m
[31m-[m
[31m-        for i = 1, addrlen do[m
[31m-            if byte(addr, i) == COLON_CHAR then[m
[31m-                ncol = ncol - 1[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if byte(addr, 1) == COLON_CHAR then[m
[31m-            addr = "0" .. addr[m
[31m-        end[m
[31m-[m
[31m-        if byte(addr, -1) == COLON_CHAR then[m
[31m-            addr = addr .. "0"[m
[31m-        end[m
[31m-[m
[31m-        addr = re_sub(addr, "::", ":" .. rep("0:", ncol), "jo")[m
[31m-    end[m
[31m-[m
[31m-    return addr[m
[31m-end[m
[31m-[m
[31m-[m
[31m-_M.expand_ipv6_addr = _expand_ipv6_addr[m
[31m-[m
[31m-[m
[31m-function _M.arpa_str(addr)[m
[31m-    if find(addr, ":", 1, true) then[m
[31m-        addr = _expand_ipv6_addr(addr)[m
[31m-        local idx, hidx, addrlen = 1, 1, #addr[m
[31m-[m
[31m-        for i = addrlen, 0, -1 do[m
[31m-            local s = byte(addr, i)[m
[31m-            if s == COLON_CHAR or not s then[m
[31m-                for j = hidx, 4 do[m
[31m-                    arpa_tmpl[idx] = ZERO_CHAR[m
[31m-                    idx = idx + 2[m
[31m-                end[m
[31m-                hidx = 1[m
[31m-            else[m
[31m-                arpa_tmpl[idx] = s[m
[31m-                idx = idx + 2[m
[31m-                hidx = hidx + 1[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        addr = char(unpack(arpa_tmpl))[m
[31m-    else[m
[31m-        addr = re_sub(addr, [[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})]],[m
[31m-                      "$4.$3.$2.$1.in-addr.arpa", "ajo")[m
[31m-    end[m
[31m-[m
[31m-    return addr[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reverse_query(self, addr)[m
[31m-    return self.query(self, self.arpa_str(addr),[m
[31m-                      {qtype = self.TYPE_PTR})[m
[31m-end[m
[31m-[m
[31m-[m
[31m-randomseed(ngx_time())[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/TestDNS.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/TestDNS.pm[m
[1mdeleted file mode 100644[m
[1mindex 2b3e6e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/TestDNS.pm[m
[1m+++ /dev/null[m
[36m@@ -1,277 +0,0 @@[m
[31m-package TestDNS;[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use 5.010001;[m
[31m-use Test::Nginx::Socket::Lua -Base;[m
[31m-#use JSON::XS;[m
[31m-[m
[31m-use constant {[m
[31m-    TYPE_A => 1,[m
[31m-    TYPE_TXT => 16,[m
[31m-    TYPE_CNAME => 5,[m
[31m-    TYPE_AAAA => 28,[m
[31m-    CLASS_INTERNET => 1,[m
[31m-};[m
[31m-[m
[31m-sub encode_name ($);[m
[31m-sub encode_ipv4 ($);[m
[31m-sub encode_ipv6 ($);[m
[31m-sub gen_dns_reply ($$);[m
[31m-[m
[31m-sub Test::Base::Filter::dns {[m
[31m-    my ($self, $code) = @_;[m
[31m-[m
[31m-    my $args = $self->current_arguments;[m
[31m-    #warn "args: $args";[m
[31m-    if (defined $args && $args ne 'tcp' && $args ne 'udp') {[m
[31m-        die "Invalid argument to the \"dns\" filter: $args\n";[m
[31m-    }[m
[31m-[m
[31m-    my $mode = $args // 'udp';[m
[31m-[m
[31m-    my $block = $self->current_block;[m
[31m-[m
[31m-    my $pointer_spec = $block->dns_pointers;[m
[31m-    my @pointers;[m
[31m-    if (defined $pointer_spec) {[m
[31m-        my @loops = split /\s*,\s*/, $pointer_spec;[m
[31m-        for my $loop (@loops) {[m
[31m-            my @nodes = split /\s*=>\s*/, $loop;[m
[31m-            my $prev;[m
[31m-            for my $n (@nodes) {[m
[31m-                if ($n !~ /^\d+$/ || $n == 0) {[m
[31m-                    die "bad name ID in the --- dns_pointers: $n\n";[m
[31m-                }[m
[31m-[m
[31m-                if (!defined $prev) {[m
[31m-                    $prev = $n;[m
[31m-                    next;[m
[31m-                }[m
[31m-[m
[31m-                $pointers[$prev] = $n;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $input = eval $code;[m
[31m-    if ($@) {[m
[31m-        die "failed to evaluate code $code: $@\n";[m
[31m-    }[m
[31m-[m
[31m-    if (!ref $input) {[m
[31m-        return $input;[m
[31m-    }[m
[31m-[m
[31m-    if (ref $input eq 'ARRAY') {[m
[31m-        my @replies;[m
[31m-        for my $t (@$input) {[m
[31m-            push @replies, gen_dns_reply($t, $mode);[m
[31m-        }[m
[31m-[m
[31m-        return \@replies;[m
[31m-    }[m
[31m-[m
[31m-    if (ref $input eq 'HASH') {[m
[31m-        return gen_dns_reply($input, $mode);[m
[31m-    }[m
[31m-[m
[31m-    return $input;[m
[31m-}[m
[31m-[m
[31m-sub gen_dns_reply ($$) {[m
[31m-    my ($t, $mode) = @_;[m
[31m-[m
[31m-    my @raw_names;[m
[31m-    push @raw_names, \($t->{qname});[m
[31m-[m
[31m-    my $answers = $t->{answer} // [];[m
[31m-    if (!ref $answers) {[m
[31m-        $answers = [$answers];[m
[31m-    }[m
[31m-[m
[31m-    for my $ans (@$answers) {[m
[31m-        push @raw_names, \($ans->{name});[m
[31m-        if (defined $ans->{cname}) {[m
[31m-            push @raw_names, \($ans->{cname});[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for my $rname (@raw_names) {[m
[31m-        $$rname = encode_name($$rname // "");[m
[31m-    }[m
[31m-[m
[31m-    my $qname = $t->{qname};[m
[31m-[m
[31m-    my $s = '';[m
[31m-[m
[31m-    my $id = $t->{id} // 0;[m
[31m-[m
[31m-    $s .= pack("n", $id);[m
[31m-    #warn "id: ", length($s), " ", encode_json([$s]);[m
[31m-[m
[31m-    my $qr = $t->{qr} // 1;[m
[31m-[m
[31m-    my $opcode = $t->{opcode} // 0;[m
[31m-[m
[31m-    my $aa = $t->{aa} // 0;[m
[31m-[m
[31m-    my $tc = $t->{tc} // 0;[m
[31m-    my $rd = $t->{rd} // 1;[m
[31m-    my $ra = $t->{ra} // 1;[m
[31m-[m
[31m-    my $ad = $t->{ad} // 0;[m
[31m-    my $cd = $t->{cd} // 0;[m
[31m-[m
[31m-    my $rcode = $t->{rcode} // 0;[m
[31m-[m
[31m-    my $flags = ($qr << 15) + ($opcode << 11) + ($aa << 10) + ($tc << 9)[m
[31m-                + ($rd << 8) + ($ra << 7) + ($ad << 4) + ($cd << 5) + $rcode;[m
[31m-[m
[31m-    #warn sprintf("flags: %b", $flags);[m
[31m-[m
[31m-    $flags = pack("n", $flags);[m
[31m-    $s .= $flags;[m
[31m-[m
[31m-    #warn "flags: ", length($flags), " ", encode_json([$flags]);[m
[31m-[m
[31m-    my $qdcount = $t->{qdcount} // 1;[m
[31m-    my $ancount = $t->{ancount} // scalar @$answers;[m
[31m-    my $nscount = 0;[m
[31m-    my $arcount = 0;[m
[31m-[m
[31m-    $s .= pack("nnnn", $qdcount, $ancount, $nscount, $arcount);[m
[31m-[m
[31m-    #warn "qname: ", length($qname), " ", encode_json([$qname]);[m
[31m-[m
[31m-    $s .= $qname;[m
[31m-[m
[31m-    my $qs_type = $t->{qtype} // TYPE_A;[m
[31m-    my $qs_class = $t->{qclass} // CLASS_INTERNET;[m
[31m-[m
[31m-    $s .= pack("nn", $qs_type, $qs_class);[m
[31m-[m
[31m-    for my $ans (@$answers) {[m
[31m-        my $name = $ans->{name};[m
[31m-        my $type = $ans->{type};[m
[31m-        my $class = $ans->{class};[m
[31m-        my $ttl = $ans->{ttl};[m
[31m-        my $rdlength = $ans->{rdlength};[m
[31m-        my $rddata = $ans->{rddata};[m
[31m-[m
[31m-        my $ipv4 = $ans->{ipv4};[m
[31m-        if (defined $ipv4) {[m
[31m-            my ($data, $len) = encode_ipv4($ipv4);[m
[31m-            $rddata //= $data;[m
[31m-            $rdlength //= $len;[m
[31m-            $type //= TYPE_A;[m
[31m-            $class //= CLASS_INTERNET;[m
[31m-        }[m
[31m-[m
[31m-        my $ipv6 = $ans->{ipv6};[m
[31m-        if (defined $ipv6) {[m
[31m-            my ($data, $len) = encode_ipv6($ipv6);[m
[31m-            $rddata //= $data;[m
[31m-            $rdlength //= $len;[m
[31m-            $type //= TYPE_AAAA;[m
[31m-            $class //= CLASS_INTERNET;[m
[31m-        }[m
[31m-[m
[31m-        my $cname = $ans->{cname};[m
[31m-        if (defined $cname) {[m
[31m-            $rddata //= $cname;[m
[31m-            $rdlength //= length $rddata;[m
[31m-            $type //= TYPE_CNAME;[m
[31m-            $class //= CLASS_INTERNET;[m
[31m-        }[m
[31m-[m
[31m-        my $txt = $ans->{txt};[m
[31m-        if (defined $txt) {[m
[31m-            $rddata //= $txt;[m
[31m-            $rdlength //= length $rddata;[m
[31m-            $type //= TYPE_TXT;[m
[31m-            $class //= CLASS_INTERNET;[m
[31m-        }[m
[31m-[m
[31m-        $type //= 0;[m
[31m-        $class //= 0;[m
[31m-        $ttl //= 0;[m
[31m-[m
[31m-        #warn "rdlength: $rdlength, rddata: ", encode_json([$rddata]), "\n";[m
[31m-[m
[31m-        $s .= $name . pack("nnNn", $type, $class, $ttl, $rdlength) . $rddata;[m
[31m-    }[m
[31m-[m
[31m-    if ($mode eq 'tcp') {[m
[31m-        return pack("n", length($s)) . $s;[m
[31m-    }[m
[31m-[m
[31m-    return $s;[m
[31m-}[m
[31m-[m
[31m-sub encode_ipv4 ($) {[m
[31m-    my $txt = shift;[m
[31m-    my @bytes = split /\./, $txt;[m
[31m-    return pack("CCCC", @bytes), 4;[m
[31m-}[m
[31m-[m
[31m-sub encode_ipv6 ($) {[m
[31m-    my $txt = shift;[m
[31m-    my @groups = split /:/, $txt;[m
[31m-    my $nils = 0;[m
[31m-    my $nonnils = 0;[m
[31m-    for my $g (@groups) {[m
[31m-        if ($g eq '') {[m
[31m-            $nils++;[m
[31m-        } else {[m
[31m-            $nonnils++;[m
[31m-            $g = hex($g);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $total = $nils + $nonnils;[m
[31m-    if ($total > 8 ) {[m
[31m-        die "Invalid IPv6 address: too many groups: $total: $txt";[m
[31m-    }[m
[31m-[m
[31m-    if ($nils) {[m
[31m-        my $found = 0;[m
[31m-        my @new_groups;[m
[31m-        for my $g (@groups) {[m
[31m-            if ($g eq '') {[m
[31m-                if ($found) {[m
[31m-                    next;[m
[31m-                }[m
[31m-[m
[31m-                for (1 .. 8 - $nonnils) {[m
[31m-                    push @new_groups, 0;[m
[31m-                }[m
[31m-[m
[31m-                $found = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                push @new_groups, $g;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        @groups = @new_groups;[m
[31m-    }[m
[31m-[m
[31m-    if (@groups != 8) {[m
[31m-        die "Invalid IPv6 address: $txt: @groups\n";[m
[31m-    }[m
[31m-[m
[31m-    #warn "IPv6 groups: @groups";[m
[31m-[m
[31m-    return pack("nnnnnnnn", @groups), 16;[m
[31m-}[m
[31m-[m
[31m-sub encode_name ($) {[m
[31m-    my $name = shift;[m
[31m-    $name =~ s/([^.]+)\.?/chr(length($1)) . $1/ge;[m
[31m-    $name .= "\0";[m
[31m-    return $name;[m
[31m-}[m
[31m-[m
[31m-1[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/mock.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/mock.t[m
[1mdeleted file mode 100644[m
[1mindex b9bf219..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/mock.t[m
[1m+++ /dev/null[m
[36m@@ -1,1516 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use lib 't';[m
[31m-use TestDNS;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 16);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-log_level('notice');[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single answer reply, good A answer[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty answer reply[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    qname => 'www.google.com',[m
[31m-    opcode => 0,[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: one byte reply, truncated, without TCP server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply: a[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to connect to TCP server 127.0.0.1:1953: connection refused[m
[31m---- error_log[m
[31m-connect() failed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: empty reply[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply:[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to connect to TCP server 127.0.0.1:1953: connection refused[m
[31m---- error_log[m
[31m-connect() failed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: two answers reply that contains AAAA records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 },[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456},{"address":"0:0:0:0:0:0:0:1","type":28,"class":1,"name":"l.www.google.com","ttl":0}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: good CNAME answer[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", cname => "blah.google.com", ttl => 125 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"ttl":125,"type":5,"class":1,"name":"www.google.com","cname":"blah.google.com"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: CNAME answer with bad rd length[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", cname => "blah.google.com", ttl => 125, rdlength => 3 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad cname record length: 17 ~= 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: single answer reply, bad A answer, wrong record length[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456, rdlength => 1 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad A record value length: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bad AAAA record, wrong len[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0, rdlength => 21 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad AAAA record value length: 21[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: timeout[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 1,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(100)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply_delay: 200ms[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to receive reply from UDP server 127.0.0.1:1953: timeout[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: not timeout finally (re-transmission works)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply_delay: 500ms[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "l.www.google.com", ipv6 => "FF01::101", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"address":"ff01:0:0:0:0:0:0:101","type":28,"class":1,"name":"l.www.google.com","ttl":0}][m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: timeout finally (re-transmission works but not enough retrans times)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 2,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply_delay: 500ms[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "l.www.google.com", ipv6 => "FF01::101", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to receive reply from UDP server 127.0.0.1:1953: timeout[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: RCODE - format error[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 1,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":1,"errstr":"format error"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: RCODE - server failure[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            if ans.errcode then[m
[31m-                ngx.say("error code: ", ans.errcode, ": ", ans.errstr)[m
[31m-            end[m
[31m-[m
[31m-            for i, rec in ipairs(ans) do[m
[31m-                ngx.say("record: ", cjson.encode(rec))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 2,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-error code: 2: server failure[m
[31m-record: {"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: RCODE - name error[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 3,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":3,"errstr":"name error"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: RCODE - not implemented[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 4,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":4,"errstr":"not implemented"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: RCODE - refused[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 5,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":5,"errstr":"refused"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: RCODE - unknown[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    rcode => 6,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {"errcode":6,"errstr":"unknown"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: TC (TrunCation) = 1, no TCP server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(1000)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    tc => 1,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: failed to connect to TCP server 127.0.0.1:1953: connection refused[m
[31m---- error_log[m
[31m-connect() failed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: bad QR flag (0)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(1000)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    qr => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad QR flag in the DNS response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: Recursion Desired off[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-                no_recurse = true,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(200)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: id mismatch (timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                timeout = 10,[m
[31m-                retrans = 2,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 126,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-failed to query: failed to receive reply from UDP server 127.0.0.1:1953: timeout[m
[31m---- error_log[m
[31m-id mismatch in the DNS reply: 126 ~= 125[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: id mismatch (and then match)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                timeout = 10,[m
[31m-                retrans = 2,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-[[m
[31m-{[m
[31m-    id => 126,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-},[m
[31m-{[m
[31m-    id => 127,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-},[m
[31m-{[m
[31m-    id => 120,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-},[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-},[m
[31m-][m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}][m
[31m---- error_log[m
[31m-id mismatch in the DNS reply: 126 ~= 125[m
[31m-id mismatch in the DNS reply: 120 ~= 125[m
[31m-id mismatch in the DNS reply: 127 ~= 125[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: TC (TrunCation) = 1, with TCP server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} },[m
[31m-                retrans = 3,[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r:set_timeout(1000)   -- in ms[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    tc => 1,[m
[31m-    qname => 'www.google.com',[m
[31m-}[m
[31m---- tcp_listen: 1953[m
[31m---- tcp_query_len: 34[m
[31m---- tcp_reply dns=tcp[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 },[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456},{"address":"0:0:0:0:0:0:0:1","type":28,"class":1,"name":"l.www.google.com","ttl":0}][m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-query the TCP server due to reply truncation[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: one byte reply, truncated, with TCP server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply: a[m
[31m---- tcp_listen: 1953[m
[31m---- tcp_query_len: 34[m
[31m---- tcp_reply dns=tcp[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [[m
[31m-        { name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 },[m
[31m-        { name => "l.www.google.com", ipv6 => "::1", ttl => 0 },[m
[31m-    ],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456},{"address":"0:0:0:0:0:0:0:1","type":28,"class":1,"name":"l.www.google.com","ttl":0}][m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-query the TCP server due to reply truncation[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: single answer reply, TXT answer with a single char string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qtype => 16,  # TXT[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", txt => "\5hello", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{10}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"class":1,"name":"www.google.com","ttl":123456,"txt":"hello","type":16}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: single answer reply, TXT answer with a null char string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qtype => 16,  # TXT[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", txt => "\0", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{10}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"class":1,"name":"www.google.com","ttl":123456,"txt":"","type":16}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: single answer reply, TXT answer with a multiple char strings[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qtype => 16,  # TXT[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", txt => "\5hello\5world", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{10}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"class":1,"name":"www.google.com","ttl":123456,"txt":["hello","world"],"type":16}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: single answer reply, multiple TXT answers[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qtype => 16,  # TXT[m
[31m-    qname => 'www.google.com',[m
[31m-    answer => [{ name => "www.google.com", txt => "\5hello\6world!", ttl => 123456 }, { name => "www.google.com", txt => "\4blah", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{10}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"class":1,"name":"www.google.com","ttl":123456,"txt":["hello","world!"],"type":16},{"class":1,"name":"www.google.com","ttl":123456,"txt":"blah","type":16}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: single answer reply, good A answer (AD is set)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    ad => 1,[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: single answer reply, good A answer (CD is set)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{[m
[31m-                nameservers = { {"127.0.0.1", 1953} }[m
[31m-            }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            r._id = 125[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply dns[m
[31m-{[m
[31m-    id => 125,[m
[31m-    opcode => 0,[m
[31m-    qname => 'www.google.com',[m
[31m-    cd => 1,[m
[31m-    answer => [{ name => "www.google.com", ipv4 => "127.0.0.1", ttl => 123456 }],[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- udp_query eval[m
[31m-"\x{00}}\x{01}\x{00}\x{00}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{03}www\x{06}google\x{03}com\x{00}\x{00}\x{01}\x{00}\x{01}"[m
[31m---- response_body[m
[31m-records: [{"address":"127.0.0.1","type":1,"class":1,"name":"www.google.com","ttl":123456}][m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex c51b390..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,535 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/t/lib/?.lua;$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: A records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"address":"(?:\d{1,3}\.){3}\d+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: CNAME records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.yahoo.com", { qtype = r.TYPE_CNAME })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"cname":"[-_a-z0-9.]+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: AAAA records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com", { qtype = r.TYPE_AAAA })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"address":"[a-fA-F0-9]*(?::[a-fA-F0-9]*)+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: compress ipv6 addr[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local c = resolver.compress_ipv6_addr[m
[31m-[m
[31m-            ngx.say(c("1080:0:0:0:8:800:200C:417A"))[m
[31m-            ngx.say(c("FF01:0:0:0:0:0:0:101"))[m
[31m-            ngx.say(c("0:0:0:0:0:0:0:1"))[m
[31m-            ngx.say(c("1:5:0:0:0:0:0:0"))[m
[31m-            ngx.say(c("7:25:0:0:0:3:0:0"))[m
[31m-            ngx.say(c("0:0:0:0:0:0:0:0"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1080::8:800:200C:417A[m
[31m-FF01::101[m
[31m-::1[m
[31m-1:5::[m
[31m-7:25::3:0:0[m
[31m-::[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: A records (TCP)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:tcp_query("www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"address":"(?:\d{1,3}\.){3}\d+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: MX records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("gmail.com", { qtype = r.TYPE_MX })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"preference":\d+,.*?"exchange":"[^"]+".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: NS records[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("agentzh.org", { qtype = r.TYPE_NS })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"nsdname":"[^"]+".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: TXT query (no ans)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("agentzh.org", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {}[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: TXT query (with ans)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("gmail.com", { qtype = r.TYPE_TXT })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"txt":"v=spf\d+\s[^"]+".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: PTR query[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("4.4.8.8.in-addr.arpa", { qtype = r.TYPE_PTR })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"ptrdname":"google-public-dns-b\.google\.com".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: domains with a trailing dot[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("www.google.com.", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[.*?"address":"(?:\d{1,3}\.){3}\d+".*?\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: domains with a leading dot[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query(".www.google.com", { qtype = r.TYPE_A })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to query: bad name[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: SRV records or XMPP[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("_xmpp-client._tcp.jabber.org", { qtype = r.TYPE_SRV })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("records: ", ljson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[(?:{"class":1,"name":"_xmpp-client._tcp.jabber.org","port":\d+,"priority":\d+,"target":"[\w.]+\.jabber.org","ttl":\d+,"type":33,"weight":\d+},?)+\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: SPF query (with ans)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("linkedin.com", { qtype = r.TYPE_SPF })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^records: \[\{.*?"spf":"v=spf\d+\s[^"]+".*?\}\]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: SPF query (no ans)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-[m
[31m-            local r, err = resolver:new{ nameservers = { "$TEST_NGINX_RESOLVER" } }[m
[31m-            if not r then[m
[31m-                ngx.say("failed to instantiate resolver: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ans, err = r:query("agentzh.org", { qtype = r.TYPE_SPF })[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("records: ", cjson.encode(ans))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-records: {}[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: generate arpa_str[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resolver = require "resty.dns.resolver"[m
[31m-            local c = resolver.arpa_str[m
[31m-            ngx.say(c("1234:5678:abcd:ef99:1234:5678:abcd:ef99"))[m
[31m-            ngx.say(c("1080::8:800:200c:417a"))[m
[31m-            ngx.say(c("ff01::101"))[m
[31m-            ngx.say(c("::1"))[m
[31m-            ngx.say(c("::"))[m
[31m-            ngx.say(c("1::"))[m
[31m-            ngx.say(c("127.0.0.1"))[m
[31m-            ngx.say(c("251.252.253.254"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-9.9.f.e.d.c.b.a.8.7.6.5.4.3.2.1.9.9.f.e.d.c.b.a.8.7.6.5.4.3.2.1.ip6.arpa[m
[31m-a.7.1.4.c.0.0.2.0.0.8.0.8.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.0.1.ip6.arpa[m
[31m-1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.f.f.ip6.arpa[m
[31m-1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa[m
[31m-0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa[m
[31m-0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.ip6.arpa[m
[31m-1.0.0.127.in-addr.arpa[m
[31m-254.253.252.251.in-addr.arpa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ee195dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-dns-0.16/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,549 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 4e1b699..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/lib/resty/lock.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/lib/resty/lock.lua[m
[1mdeleted file mode 100644[m
[1mindex dcd601b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/lib/resty/lock.lua[m
[1m+++ /dev/null[m
[36m@@ -1,208 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local shared = ngx.shared[m
[31m-local sleep = ngx.sleep[m
[31m-local shdict_mt[m
[31m-local debug = ngx.config.debug[m
[31m-local setmetatable = setmetatable[m
[31m-local getmetatable = getmetatable[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.04' }[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-local FREE_LIST_REF = 0[m
[31m-[m
[31m--- FIXME: we don't need this when we have __gc metamethod support on Lua[m
[31m---        tables.[m
[31m-local memo = {}[m
[31m-if debug then _M.memo = memo end[m
[31m-[m
[31m-[m
[31m-local function ref_obj(key)[m
[31m-    if key == nil then[m
[31m-        return -1[m
[31m-    end[m
[31m-    local ref = memo[FREE_LIST_REF][m
[31m-    if ref and ref ~= 0 then[m
[31m-         memo[FREE_LIST_REF] = memo[ref][m
[31m-[m
[31m-    else[m
[31m-        ref = #memo + 1[m
[31m-    end[m
[31m-    memo[ref] = key[m
[31m-[m
[31m-    -- print("ref key_id returned ", ref)[m
[31m-    return ref[m
[31m-end[m
[31m-if debug then _M.ref_obj = ref_obj end[m
[31m-[m
[31m-[m
[31m-local function unref_obj(ref)[m
[31m-    if ref >= 0 then[m
[31m-        memo[ref] = memo[FREE_LIST_REF][m
[31m-        memo[FREE_LIST_REF] = ref[m
[31m-    end[m
[31m-end[m
[31m-if debug then _M.unref_obj = unref_obj end[m
[31m-[m
[31m-[m
[31m-local function gc_lock(cdata)[m
[31m-    local dict_id = tonumber(cdata.dict_id)[m
[31m-    local key_id = tonumber(cdata.key_id)[m
[31m-[m
[31m-    -- print("key_id: ", key_id, ", key: ", memo[key_id], "dict: ",[m
[31m-    --       type(memo[cdata.dict_id]))[m
[31m-    if key_id > 0 then[m
[31m-        local key = memo[key_id][m
[31m-        unref_obj(key_id)[m
[31m-        local dict = memo[dict_id][m
[31m-        -- print("dict.delete type: ", type(dict.delete))[m
[31m-        local ok, err = dict:delete(key)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, 'failed to delete key "', key, '": ', err)[m
[31m-        end[m
[31m-        cdata.key_id = 0[m
[31m-    end[m
[31m-[m
[31m-    unref_obj(dict_id)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local ctype = ffi.metatype("struct { int key_id; int dict_id; }",[m
[31m-                           { __gc = gc_lock })[m
[31m-[m
[31m-[m
[31m-function _M.new(_, dict_name, opts)[m
[31m-    local dict = shared[dict_name][m
[31m-    if not dict then[m
[31m-        return nil, "dictionary not found"[m
[31m-    end[m
[31m-    local cdata = ffi_new(ctype)[m
[31m-    cdata.key_id = 0[m
[31m-    cdata.dict_id = ref_obj(dict)[m
[31m-[m
[31m-    local timeout, exptime, step, ratio, max_step[m
[31m-    if opts then[m
[31m-        timeout = opts.timeout[m
[31m-        exptime = opts.exptime[m
[31m-        step = opts.step[m
[31m-        ratio = opts.ratio[m
[31m-        max_step = opts.max_step[m
[31m-    end[m
[31m-[m
[31m-    if not exptime then[m
[31m-        exptime = 30[m
[31m-    end[m
[31m-[m
[31m-    if timeout and timeout > exptime then[m
[31m-        timeout = exptime[m
[31m-    end[m
[31m-[m
[31m-    local self = {[m
[31m-        cdata = cdata,[m
[31m-        dict = dict,[m
[31m-        timeout = timeout or 5,[m
[31m-        exptime = exptime,[m
[31m-        step = step or 0.001,[m
[31m-        ratio = ratio or 2,[m
[31m-        max_step = max_step or 0.5,[m
[31m-    }[m
[31m-    return setmetatable(self, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.lock(self, key)[m
[31m-    if not key then[m
[31m-        return nil, "nil key"[m
[31m-    end[m
[31m-[m
[31m-    local dict = self.dict[m
[31m-    local cdata = self.cdata[m
[31m-    if cdata.key_id > 0 then[m
[31m-        return nil, "locked"[m
[31m-    end[m
[31m-    local exptime = self.exptime[m
[31m-    local ok, err = dict:add(key, true, exptime)[m
[31m-    if ok then[m
[31m-        cdata.key_id = ref_obj(key)[m
[31m-        if not shdict_mt then[m
[31m-            shdict_mt = getmetatable(dict)[m
[31m-        end[m
[31m-        return 0[m
[31m-    end[m
[31m-    if err ~= "exists" then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-    -- lock held by others[m
[31m-    local step = self.step[m
[31m-    local ratio = self.ratio[m
[31m-    local timeout = self.timeout[m
[31m-    local max_step = self.max_step[m
[31m-    local elapsed = 0[m
[31m-    while timeout > 0 do[m
[31m-        if step > timeout then[m
[31m-            step = timeout[m
[31m-        end[m
[31m-[m
[31m-        sleep(step)[m
[31m-        elapsed = elapsed + step[m
[31m-        timeout = timeout - step[m
[31m-[m
[31m-        local ok, err = dict:add(key, true, exptime)[m
[31m-        if ok then[m
[31m-            cdata.key_id = ref_obj(key)[m
[31m-            if not shdict_mt then[m
[31m-                shdict_mt = getmetatable(dict)[m
[31m-            end[m
[31m-            return elapsed[m
[31m-        end[m
[31m-[m
[31m-        if err ~= "exists" then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if timeout <= 0 then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        step = step * ratio[m
[31m-        if step <= 0 then[m
[31m-            step = 0.001[m
[31m-        end[m
[31m-        if step > max_step then[m
[31m-            step = max_step[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return nil, "timeout"[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.unlock(self)[m
[31m-    local dict = self.dict[m
[31m-    local cdata = self.cdata[m
[31m-    local key_id = tonumber(cdata.key_id)[m
[31m-    if key_id <= 0 then[m
[31m-        return nil, "unlocked"[m
[31m-    end[m
[31m-[m
[31m-    local key = memo[key_id][m
[31m-    unref_obj(key_id)[m
[31m-[m
[31m-    local ok, err = dict:delete(key)[m
[31m-    if not ok then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-    cdata.key_id = 0[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex b04497c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,470 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-    lua_shared_dict cache_locks 100k;[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: lock is subject to garbage collection[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            for i = 1, 2 do[m
[31m-                collectgarbage("collect")[m
[31m-                local lock = lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock("foo")[m
[31m-                ngx.say("lock: ", elapsed, ", ", err)[m
[31m-            end[m
[31m-            collectgarbage("collect")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-lock: 0, nil[m
[31m-lock: 0, nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: serial lock and unlock[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            for i = 1, 2 do[m
[31m-                local lock = lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock("foo")[m
[31m-                ngx.say("lock: ", elapsed, ", ", err)[m
[31m-                local ok, err = lock:unlock()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to unlock: ", err)[m
[31m-                end[m
[31m-                ngx.say("unlock: ", ok)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-lock: 0, nil[m
[31m-unlock: 1[m
[31m-lock: 0, nil[m
[31m-unlock: 1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: timed out locks[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            for i = 1, 2 do[m
[31m-                local lock1 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-                local lock2 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-[m
[31m-                local elapsed, err = lock1:lock("foo")[m
[31m-                ngx.say("lock 1: lock: ", elapsed, ", ", err)[m
[31m-[m
[31m-                local elapsed, err = lock2:lock("foo")[m
[31m-                ngx.say("lock 2: lock: ", elapsed, ", ", err)[m
[31m-[m
[31m-                local ok, err = lock1:unlock()[m
[31m-                ngx.say("lock 1: unlock: ", ok, ", ", err)[m
[31m-[m
[31m-                local ok, err = lock2:unlock()[m
[31m-                ngx.say("lock 2: unlock: ", ok, ", ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-lock 1: lock: 0, nil[m
[31m-lock 2: lock: nil, timeout[m
[31m-lock 1: unlock: 1, nil[m
[31m-lock 2: unlock: nil, unlocked[m
[31m-lock 1: lock: 0, nil[m
[31m-lock 2: lock: nil, timeout[m
[31m-lock 1: unlock: 1, nil[m
[31m-lock 2: unlock: nil, unlocked[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: waited locks[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks")[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-sub thread: unlock: 1[m
[31m-main thread: lock: 0.12[6-9] nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: waited locks (custom step)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks", { step = 0.01 })[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-sub thread: unlock: 1[m
[31m-main thread: lock: 0.1[4-5]\d* nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: waited locks (custom ratio)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks", { ratio = 3 })[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-sub thread: unlock: 1[m
[31m-main thread: lock: 0.1[2]\d* nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: waited locks (custom max step)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks")[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks", { max_step = 0.05 })[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-sub thread: unlock: 1[m
[31m-main thread: lock: 0.11[2-4]\d* nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: lock expired by itself[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_lock = require "resty.lock"[m
[31m-            local key = "blah"[m
[31m-            local t, err = ngx.thread.spawn(function ()[m
[31m-                local lock = resty_lock:new("cache_locks", { exptime = 0.1 })[m
[31m-                local elapsed, err = lock:lock(key)[m
[31m-                ngx.say("sub thread: lock: ", elapsed, " ", err)[m
[31m-                ngx.sleep(0.1)[m
[31m-                -- ngx.say("sub thread: unlock: ", lock:unlock(key))[m
[31m-            end)[m
[31m-[m
[31m-            local lock = resty_lock:new("cache_locks", { max_step = 0.05 })[m
[31m-            local elapsed, err = lock:lock(key)[m
[31m-            ngx.say("main thread: lock: ", elapsed, " ", err)[m
[31m-            ngx.say("main thread: unlock: ", lock:unlock())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^sub thread: lock: 0 nil[m
[31m-main thread: lock: 0.11[2-4]\d* nil[m
[31m-main thread: unlock: 1[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ref & unref (1 at most)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            local memo = lock.memo[m
[31m-            local ref = lock.ref_obj("foo")[m
[31m-            ngx.say(#memo)[m
[31m-            lock.unref_obj(ref)[m
[31m-            ngx.say(#memo)[m
[31m-            ref = lock.ref_obj("bar")[m
[31m-            ngx.say(#memo)[m
[31m-            lock.unref_obj(ref)[m
[31m-            ngx.say(#memo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m-0[m
[31m-1[m
[31m-0[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ref & unref (2 at most)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            local memo = lock.memo[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local refs = {}[m
[31m-[m
[31m-                refs[1] = lock.ref_obj("foo")[m
[31m-                ngx.say(#memo)[m
[31m-[m
[31m-                refs[2] = lock.ref_obj("bar")[m
[31m-                ngx.say(#memo)[m
[31m-[m
[31m-                lock.unref_obj(refs[1])[m
[31m-                ngx.say(#memo)[m
[31m-[m
[31m-                lock.unref_obj(refs[2])[m
[31m-                ngx.say(#memo)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-2[m
[31m-2[m
[31m-2[m
[31m-2[m
[31m-1[m
[31m-1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: lock on a nil key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            local lock = lock:new("cache_locks")[m
[31m-            local elapsed, err = lock:lock(nil)[m
[31m-            if elapsed then[m
[31m-                ngx.say("lock: ", elapsed, ", ", err)[m
[31m-                local ok, err = lock:unlock()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to unlock: ", err)[m
[31m-                end[m
[31m-            else[m
[31m-                ngx.say("failed to lock: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to lock: nil key[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: same shdict, multple locks[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            local memo = lock.memo[m
[31m-            local lock1 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-            for i = 1, 3 do[m
[31m-                lock1:lock("lock_key")[m
[31m-                lock1:unlock()[m
[31m-                collectgarbage("collect")[m
[31m-            end[m
[31m-[m
[31m-            local lock2 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-            local lock3 = lock:new("cache_locks", { timeout = 0.01 })[m
[31m-            lock2:lock("lock_key")[m
[31m-            lock3:lock("lock_key")[m
[31m-            collectgarbage("collect")[m
[31m-[m
[31m-            ngx.say(#memo)[m
[31m-[m
[31m-            lock2:unlock()[m
[31m-            lock3:unlock()[m
[31m-            collectgarbage("collect")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: timed out locks (0 timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lock = require "resty.lock"[m
[31m-            for i = 1, 2 do[m
[31m-                local lock1 = lock:new("cache_locks", { timeout = 0 })[m
[31m-                local lock2 = lock:new("cache_locks", { timeout = 0 })[m
[31m-[m
[31m-                local elapsed, err = lock1:lock("foo")[m
[31m-                ngx.say("lock 1: lock: ", elapsed, ", ", err)[m
[31m-[m
[31m-                local elapsed, err = lock2:lock("foo")[m
[31m-                ngx.say("lock 2: lock: ", elapsed, ", ", err)[m
[31m-[m
[31m-                local ok, err = lock1:unlock()[m
[31m-                ngx.say("lock 1: unlock: ", ok, ", ", err)[m
[31m-[m
[31m-                local ok, err = lock2:unlock()[m
[31m-                ngx.say("lock 2: unlock: ", ok, ", ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-lock 1: lock: 0, nil[m
[31m-lock 2: lock: nil, timeout[m
[31m-lock 1: unlock: 1, nil[m
[31m-lock 2: unlock: nil, unlocked[m
[31m-lock 1: lock: 0, nil[m
[31m-lock 2: lock: nil, timeout[m
[31m-lock 1: unlock: 1, nil[m
[31m-lock 2: unlock: nil, unlocked[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 3097828..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lock-0.04/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Param[m
[31m-    epoll_ctl(event)[m
[31m-    fun:epoll_ctl[m
[31m-    fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 133810f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/lrucache[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/[m
[31m-	$(INSTALL) lib/resty/lrucache/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/lrucache/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/lib/resty/lrucache.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/lib/resty/lrucache.lua[m
[1mdeleted file mode 100644[m
[1mindex fdaccde..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/lib/resty/lrucache.lua[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_sizeof = ffi.sizeof[m
[31m-local ffi_cast = ffi.cast[m
[31m-local ffi_fill = ffi.fill[m
[31m-local ngx_now = ngx.now[m
[31m-local uintptr_t = ffi.typeof("uintptr_t")[m
[31m-local setmetatable = setmetatable[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m--- queue data types[m
[31m---[m
[31m--- this queue is a double-ended queue and the first node[m
[31m--- is reserved for the queue itself.[m
[31m--- the implementation is mostly borrowed from nginx's ngx_queue_t data[m
[31m--- structure.[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    typedef struct lrucache_queue_s  lrucache_queue_t;[m
[31m-    struct lrucache_queue_s {[m
[31m-        double             expire;  /* in seconds */[m
[31m-        lrucache_queue_t  *prev;[m
[31m-        lrucache_queue_t  *next;[m
[31m-    };[m
[31m-]][m
[31m-[m
[31m-local queue_arr_type = ffi.typeof("lrucache_queue_t[?]")[m
[31m-local queue_ptr_type = ffi.typeof("lrucache_queue_t*")[m
[31m-local queue_type = ffi.typeof("lrucache_queue_t")[m
[31m-local NULL = ffi.null[m
[31m-[m
[31m-[m
[31m--- queue utility functions[m
[31m-[m
[31m-local function queue_insert_tail(h, x)[m
[31m-    local last = h[0].prev[m
[31m-    x.prev = last[m
[31m-    last.next = x[m
[31m-    x.next = h[m
[31m-    h[0].prev = x[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_init(size)[m
[31m-    if not size then[m
[31m-        size = 0[m
[31m-    end[m
[31m-    local q = ffi_new(queue_arr_type, size + 1)[m
[31m-    ffi_fill(q, ffi_sizeof(queue_type, size + 1), 0)[m
[31m-[m
[31m-    if size == 0 then[m
[31m-        q[0].prev = q[m
[31m-        q[0].next = q[m
[31m-[m
[31m-    else[m
[31m-        local prev = q[0][m
[31m-        for i = 1, size do[m
[31m-          local e = q[i][m
[31m-          prev.next = e[m
[31m-          e.prev = prev[m
[31m-          prev = e[m
[31m-        end[m
[31m-[m
[31m-        local last = q[size][m
[31m-        last.next = q[m
[31m-        q[0].prev = last[m
[31m-    end[m
[31m-[m
[31m-    return q[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_is_empty(q)[m
[31m-    -- print("q: ", tostring(q), "q.prev: ", tostring(q), ": ", q == q.prev)[m
[31m-    return q == q[0].prev[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_remove(x)[m
[31m-    local prev = x.prev[m
[31m-    local next = x.next[m
[31m-[m
[31m-    next.prev = prev[m
[31m-    prev.next = next[m
[31m-[m
[31m-    -- for debugging purpose only:[m
[31m-    x.prev = NULL[m
[31m-    x.next = NULL[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_insert_head(h, x)[m
[31m-    x.next = h[0].next[m
[31m-    x.next.prev = x[m
[31m-    x.prev = h[m
[31m-    h[0].next = x[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_last(h)[m
[31m-    return h[0].prev[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_head(h)[m
[31m-    return h[0].next[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- true module stuffs[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = '0.04'[m
[31m-}[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-local function ptr2num(ptr)[m
[31m-    return tonumber(ffi_cast(uintptr_t, ptr))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.new(size)[m
[31m-    if size < 1 then[m
[31m-        return nil, "size too small"[m
[31m-    end[m
[31m-[m
[31m-    local self = {[m
[31m-        keys = {},[m
[31m-        hasht = {},[m
[31m-        free_queue = queue_init(size),[m
[31m-        cache_queue = queue_init(),[m
[31m-        key2node = {},[m
[31m-        node2key = {},[m
[31m-    }[m
[31m-    return setmetatable(self, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get(self, key)[m
[31m-    local hasht = self.hasht[m
[31m-    local val = hasht[key][m
[31m-    if not val then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    local node = self.key2node[key][m
[31m-[m
[31m-    -- print(key, ": moving node ", tostring(node), " to cache queue head")[m
[31m-    local cache_queue = self.cache_queue[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_head(cache_queue, node)[m
[31m-[m
[31m-    if node.expire >= 0 and node.expire < ngx_now() then[m
[31m-        -- print("expired: ", node.expire, " > ", ngx_now())[m
[31m-        return nil, val[m
[31m-    end[m
[31m-    return val[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.delete(self, key)[m
[31m-    self.hasht[key] = nil[m
[31m-[m
[31m-    local key2node = self.key2node[m
[31m-    local node = key2node[key][m
[31m-[m
[31m-    if not node then[m
[31m-        return false[m
[31m-    end[m
[31m-[m
[31m-    key2node[key] = nil[m
[31m-    self.node2key[ptr2num(node)] = nil[m
[31m-[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_tail(self.free_queue, node)[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set(self, key, value, ttl)[m
[31m-    local hasht = self.hasht[m
[31m-    hasht[key] = value[m
[31m-[m
[31m-    local key2node = self.key2node[m
[31m-    local node = key2node[key][m
[31m-    if not node then[m
[31m-        local free_queue = self.free_queue[m
[31m-        local node2key = self.node2key[m
[31m-[m
[31m-        if queue_is_empty(free_queue) then[m
[31m-            -- evict the least recently used key[m
[31m-            -- assert(not queue_is_empty(self.cache_queue))[m
[31m-            node = queue_last(self.cache_queue)[m
[31m-[m
[31m-            local oldkey = node2key[ptr2num(node)][m
[31m-            -- print(key, ": evicting oldkey: ", oldkey, ", oldnode: ",[m
[31m-            --         tostring(node))[m
[31m-            if oldkey then[m
[31m-                hasht[oldkey] = nil[m
[31m-                key2node[oldkey] = nil[m
[31m-            end[m
[31m-[m
[31m-        else[m
[31m-            -- take a free queue node[m
[31m-            node = queue_head(free_queue)[m
[31m-            -- print(key, ": get a new free node: ", tostring(node))[m
[31m-        end[m
[31m-[m
[31m-        node2key[ptr2num(node)] = key[m
[31m-        key2node[key] = node[m
[31m-    end[m
[31m-[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_head(self.cache_queue, node)[m
[31m-[m
[31m-    if ttl then[m
[31m-        node.expire = ngx_now() + ttl[m
[31m-    else[m
[31m-        node.expire = -1[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/lib/resty/lrucache/pureffi.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/lib/resty/lrucache/pureffi.lua[m
[1mdeleted file mode 100644[m
[1mindex 6f82ed5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/lib/resty/lrucache/pureffi.lua[m
[1m+++ /dev/null[m
[36m@@ -1,534 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m--- Copyright (C) Shuxin Yang[m
[31m-[m
[31m---[[[m
[31m-  This module implements a key/value cache store. We adopt LRU as our[m
[31m-replace/evict policy. Each key/value pair is tagged with a Time-to-Live (TTL);[m
[31m-from user's perspective, stale pairs are automatically removed from the cache.[m
[31m-[m
[31m-Why FFI[m
[31m--------[m
[31m-  In Lua, expression "table[key] = nil" does not *PHYSICALLY* remove the value[m
[31m-associated with the key; it just set the value to be nil! So the table will[m
[31m-keep growing with large number of the key/nil pairs which will be purged until[m
[31m-resize() operator is called.[m
[31m-[m
[31m-  This "feature" is terribly ill-suited to what we need. Therefore we have to[m
[31m-rely on FFI to build a hash-table where any entry can be physically deleted[m
[31m-immediately.[m
[31m-[m
[31m-Under the hood:[m
[31m---------------[m
[31m-  In concept, we introduce three data structures to implement the cache store:[m
[31m-    1. key/value vector for storing keys and values.[m
[31m-    2. a queue to mimic the LRU.[m
[31m-    3. hash-table for looking up the value for a given key.[m
[31m-[m
[31m-  Unfortunately, efficiency and clarity usually come at each other cost. The[m
[31m-data strucutres we are using are slightly more complicated than what we[m
[31m-described above.[m
[31m-[m
[31m-   o. Lua does not have efficient way to store a vector of pair. So, we use[m
[31m-      two vectors for key/value pair: one for keys and the other for values[m
[31m-      (_M.key_v and _M.val_v, respectively), and i-th key corresponds to[m
[31m-      i-th value.[m
[31m-[m
[31m-      A key/value pair is identified by the "id" field in a "node" (we shall[m
[31m-      discuss node later)[m
[31m-[m
[31m-    o. The queue is nothing more than a doubly-linked list of "node" linked via[m
[31m-        lrucache_pureffi_queue_s::{next|prev} fields.[m
[31m-[m
[31m-    o. The hash-table has two parts:[m
[31m-        - the _M.bucket_v[] a vector of bucket, indiced by hash-value, and[m
[31m-        - a bucket is a singly-linked list of "node" via the[m
[31m-          lrucache_pureffi_queue_s::conflict field.[m
[31m-[m
[31m-      A key must be a string, and the hash value of a key is evaluated by:[m
[31m-      crc32(key-cast-to-pointer) % size(_M.bucket_v).[m
[31m-      We mandate size(_M.bucket_v) being a power-of-two in order to avoid[m
[31m-      expensive modulo operation.[m
[31m-[m
[31m-    At the heart of the module is an array of "node" (of type[m
[31m-    lrucache_pureffi_queue_s). A node:[m
[31m-      - keeps the meta-data of its corresponding key/value pair[m
[31m-        (embodied by the "id", and "expire" field);[m
[31m-      - is a part of LRU queue (embodied by "prev" and "next" fields);[m
[31m-      - is a part of hash-table (embodied by the "conflict" field).[m
[31m-]][m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local bit = require "bit"[m
[31m-[m
[31m-[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_sizeof = ffi.sizeof[m
[31m-local ffi_cast = ffi.cast[m
[31m-local ffi_fill = ffi.fill[m
[31m-local ngx_now = ngx.now[m
[31m-local uintptr_t = ffi.typeof("uintptr_t")[m
[31m-local c_str_t = ffi.typeof("const char*")[m
[31m-local int_t = ffi.typeof("int")[m
[31m-local int_array_t = ffi.typeof("int[?]")[m
[31m-[m
[31m-[m
[31m-local crc_tab = ffi.new("const unsigned int[256]", {[m
[31m-    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,[m
[31m-    0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,[m
[31m-    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,[m
[31m-    0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,[m
[31m-    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,[m
[31m-    0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,[m
[31m-    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,[m
[31m-    0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,[m
[31m-    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,[m
[31m-    0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,[m
[31m-    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,[m
[31m-    0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,[m
[31m-    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,[m
[31m-    0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,[m
[31m-    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,[m
[31m-    0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,[m
[31m-    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,[m
[31m-    0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,[m
[31m-    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,[m
[31m-    0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,[m
[31m-    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,[m
[31m-    0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,[m
[31m-    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,[m
[31m-    0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,[m
[31m-    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,[m
[31m-    0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,[m
[31m-    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,[m
[31m-    0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,[m
[31m-    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,[m
[31m-    0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,[m
[31m-    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,[m
[31m-    0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,[m
[31m-    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,[m
[31m-    0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,[m
[31m-    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,[m
[31m-    0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,[m
[31m-    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,[m
[31m-    0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,[m
[31m-    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,[m
[31m-    0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,[m
[31m-    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,[m
[31m-    0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,[m
[31m-    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D });[m
[31m-[m
[31m-local setmetatable = setmetatable[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-local brshift = bit.rshift[m
[31m-local bxor = bit.bxor[m
[31m-local band = bit.band[m
[31m-[m
[31m-local ok, tab_new = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    tab_new = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m--- queue data types[m
[31m---[m
[31m--- this queue is a double-ended queue and the first node[m
[31m--- is reserved for the queue itself.[m
[31m--- the implementation is mostly borrowed from nginx's ngx_queue_t data[m
[31m--- structure.[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    /* A lrucache_pureffi_queue_s node hook together three data structures:[m
[31m-     *   o. the key/value store as embodied by the "id" (which is in essence the[m
[31m-     *      indentifier of key/pair pair) and the "expire" (which is a metadata[m
[31m-     *      of the corresponding key/pair pair).[m
[31m-     *   o. The LRU queue via the prev/next fields.[m
[31m-     *   o. The hash-tabble as embodied by the "conflict" field.[m
[31m-     */[m
[31m-    typedef struct lrucache_pureffi_queue_s  lrucache_pureffi_queue_t;[m
[31m-    struct lrucache_pureffi_queue_s {[m
[31m-        /* Each node is assigned a unique ID at construction time, and the[m
[31m-         * ID remain immutatble, regardless the node is in active-list or[m
[31m-         * free-list. The queue header is assigned ID 0. Since queue-header[m
[31m-         * is a sentinel node, 0 denodes "invalid ID".[m
[31m-         *[m
[31m-         * Intuitively, we can view the "id" as the identifier of key/value[m
[31m-         * pair.[m
[31m-         */[m
[31m-        int                id;[m
[31m-[m
[31m-        /* The bucket of the hash-table is implemented as a singly-linked list.[m
[31m-         * The "conflict" refers to the ID of the next node in the bucket.[m
[31m-         */[m
[31m-        int                conflict;[m
[31m-[m
[31m-        double             expire;  /* in seconds */[m
[31m-[m
[31m-        lrucache_pureffi_queue_t  *prev;[m
[31m-        lrucache_pureffi_queue_t  *next;[m
[31m-    };[m
[31m-]][m
[31m-[m
[31m-local queue_arr_type = ffi.typeof("lrucache_pureffi_queue_t[?]")[m
[31m-local queue_ptr_type = ffi.typeof("lrucache_pureffi_queue_t*")[m
[31m-local queue_type = ffi.typeof("lrucache_pureffi_queue_t")[m
[31m-local NULL = ffi.null[m
[31m-[m
[31m-[m
[31m---========================================================================[m
[31m---[m
[31m---              Queue utility functions[m
[31m---[m
[31m---========================================================================[m
[31m-[m
[31m--- Append the element "x" to the given queue "h".[m
[31m-local function queue_insert_tail(h, x)[m
[31m-    local last = h[0].prev[m
[31m-    x.prev = last[m
[31m-    last.next = x[m
[31m-    x.next = h[m
[31m-    h[0].prev = x[m
[31m-end[m
[31m-[m
[31m-[m
[31m---[[[m
[31m-Allocate a queue with size + 1 elements. Elements are linked together in a[m
[31m-circular way, i.e. the last element's "next" points to the first element,[m
[31m-while the first element's "prev" element points to the last element.[m
[31m-]][m
[31m-local function queue_init(size)[m
[31m-    if not size then[m
[31m-        size = 0[m
[31m-    end[m
[31m-    local q = ffi_new(queue_arr_type, size + 1)[m
[31m-    ffi_fill(q, ffi_sizeof(queue_type, size + 1), 0)[m
[31m-[m
[31m-    if size == 0 then[m
[31m-        q[0].prev = q[m
[31m-        q[0].next = q[m
[31m-[m
[31m-    else[m
[31m-        local prev = q[0][m
[31m-        for i = 1, size do[m
[31m-          local e = q[i][m
[31m-          e.id = i[m
[31m-          prev.next = e[m
[31m-          e.prev = prev[m
[31m-          prev = e[m
[31m-        end[m
[31m-[m
[31m-        local last = q[size][m
[31m-        last.next = q[m
[31m-        q[0].prev = last[m
[31m-    end[m
[31m-[m
[31m-    return q[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_is_empty(q)[m
[31m-    -- print("q: ", tostring(q), "q.prev: ", tostring(q), ": ", q == q.prev)[m
[31m-    return q == q[0].prev[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_remove(x)[m
[31m-    local prev = x.prev[m
[31m-    local next = x.next[m
[31m-[m
[31m-    next.prev = prev[m
[31m-    prev.next = next[m
[31m-[m
[31m-    -- for debugging purpose only:[m
[31m-    x.prev = NULL[m
[31m-    x.next = NULL[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- Insert the element "x" the to the given queue "h"[m
[31m-local function queue_insert_head(h, x)[m
[31m-    x.next = h[0].next[m
[31m-    x.next.prev = x[m
[31m-    x.prev = h[m
[31m-    h[0].next = x[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_last(h)[m
[31m-    return h[0].prev[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function queue_head(h)[m
[31m-    return h[0].next[m
[31m-end[m
[31m-[m
[31m-[m
[31m---========================================================================[m
[31m---[m
[31m---              Miscellaneous Utility Functions[m
[31m---[m
[31m---========================================================================[m
[31m-[m
[31m-local function ptr2num(ptr)[m
[31m-    return tonumber(ffi_cast(uintptr_t, ptr))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function crc32_ptr(ptr)[m
[31m-    local crc32 = 0;[m
[31m-[m
[31m-    local p = brshift(ptr2num(ptr), 3)[m
[31m-    local b = band(p, 255)[m
[31m-    crc32 = crc_tab[b][m
[31m-[m
[31m-    b = band(brshift(p, 8), 255)[m
[31m-    crc32 = bxor(brshift(crc32, 8), crc_tab[band(bxor(crc32, b), 255)])[m
[31m-[m
[31m-    b = band(brshift(p, 16), 255)[m
[31m-    crc32 = bxor(brshift(crc32, 8), crc_tab[band(bxor(crc32, b), 255)])[m
[31m-[m
[31m-    --b = band(brshift(p, 24), 255)[m
[31m-    --crc32 = bxor(brshift(crc32, 8), crc_tab[band(bxor(crc32, b), 255)])[m
[31m-    return crc32[m
[31m-end[m
[31m-[m
[31m-[m
[31m---========================================================================[m
[31m---[m
[31m---              Implementation of "export" functions[m
[31m---[m
[31m---========================================================================[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = '0.04'[m
[31m-}[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m--- "size" specifies the maximum number of entries in the LRU queue, and the[m
[31m--- "load_factor" designates the 'load factor' of the hash-table we are using[m
[31m--- internally. The default value of load-factor is 0.5 (i.e. 50%); if the[m
[31m--- load-factor is specified, it will be clamped to the range of [0.1, 1](i.e.[m
[31m--- if load-factor is greater than 1, it will be saturated to 1, likewise,[m
[31m--- if load-factor is smaller than 0.1, it will be clamped to 0.1).[m
[31m-function _M.new(size, load_factor)[m
[31m-    if size < 1 then[m
[31m-        return nil, "size too small"[m
[31m-    end[m
[31m-[m
[31m-    -- Determine bucket size, which must be power of two.[m
[31m-    local load_f = load_factor[m
[31m-    if not load_factor then[m
[31m-        load_f = 0.5[m
[31m-    elseif load_factor > 1 then[m
[31m-        load_f = 1[m
[31m-    elseif load_factor < 0.1 then[m
[31m-        load_f = 0.1[m
[31m-    end[m
[31m-[m
[31m-    local bs_min = size / load_f[m
[31m-    -- The bucket_sz *MUST* be a power-of-two. See the hash_string().[m
[31m-    local bucket_sz = 1[m
[31m-    repeat[m
[31m-        bucket_sz = bucket_sz * 2[m
[31m-    until bucket_sz >= bs_min[m
[31m-[m
[31m-    local self = {[m
[31m-        size = size,[m
[31m-        bucket_sz = bucket_sz,[m
[31m-        free_queue = queue_init(size),[m
[31m-        cache_queue = queue_init(0),[m
[31m-        node_v = nil,[m
[31m-        key_v = tab_new(size, 0),[m
[31m-        val_v = tab_new(size, 0),[m
[31m-        bucket_v = ffi_new(int_array_t, bucket_sz)[m
[31m-    }[m
[31m-    -- "note_v" is an array of all the nodes used in the LRU queue. Exprpession[m
[31m-    -- node_v[i] evaluates to the element of ID "i".[m
[31m-    self.node_v = self.free_queue[m
[31m-[m
[31m-    -- Allocate the array-part of the key_v, val_v, bucket_v.[m
[31m-    local key_v = self.key_v[m
[31m-    local val_v = self.val_v[m
[31m-    local bucket_v = self.bucket_v[m
[31m-    ffi_fill(self.bucket_v, ffi_sizeof(int_t, bucket_sz), 0)[m
[31m-[m
[31m-    return setmetatable(self, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function hash_string(self, str)[m
[31m-    local c_str = ffi_cast(c_str_t, str)[m
[31m-[m
[31m-    local hv = crc32_ptr(c_str)[m
[31m-    hv = band(hv, self.bucket_sz - 1)[m
[31m-    -- Hint: bucket is 0-based[m
[31m-    return hv[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- Search the node associated with the key in the bucket, if found returns[m
[31m--- the the id of the node, and the id of its previous node in the conflict list.[m
[31m--- The "bucket_hdr_id" is the ID of the first node in the bucket[m
[31m-local function _find_node_in_bucket(key, key_v, node_v, bucket_hdr_id)[m
[31m-    if bucket_hdr_id ~= 0 then[m
[31m-        local prev = 0[m
[31m-        local cur = bucket_hdr_id[m
[31m-[m
[31m-        while cur ~= 0 and key_v[cur] ~= key do[m
[31m-            prev = cur[m
[31m-            cur = node_v[cur].conflict[m
[31m-        end[m
[31m-[m
[31m-        if cur ~= 0 then[m
[31m-            return cur, prev[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m--- Return the node corresponding to the key/val.[m
[31m-local function find_key(self, key)[m
[31m-    local key_hash = hash_string(self, key)[m
[31m-    return _find_node_in_bucket(key, self.key_v, self.node_v,[m
[31m-                                self.bucket_v[key_hash])[m
[31m-end[m
[31m-[m
[31m-[m
[31m---[[ This function tries to[m
[31m-  1. Remove the given key and the associated value from the key/value store,[m
[31m-  2. Remove the entry associated with the key from the hash-table.[m
[31m-[m
[31m-  NOTE: all queues remain intact.[m
[31m-[m
[31m-  If there was a node bound to the key/val, return that node; otherwise,[m
[31m-  nil is returned.[m
[31m-]][m
[31m-local function remove_key(self, key)[m
[31m-    local key_v = self.key_v[m
[31m-    local val_v = self.val_v[m
[31m-    local node_v = self.node_v[m
[31m-    local bucket_v = self.bucket_v[m
[31m-[m
[31m-    local key_hash = hash_string(self, key)[m
[31m-    local cur, prev =[m
[31m-        _find_node_in_bucket(key, key_v, node_v, bucket_v[key_hash])[m
[31m-[m
[31m-    if cur then[m
[31m-        -- In an attempt to make key and val dead.[m
[31m-        key_v[cur] = nil[m
[31m-        val_v[cur] = nil[m
[31m-[m
[31m-        -- Remove the node from the hash table[m
[31m-        local next_node = node_v[cur].conflict[m
[31m-        if prev ~= 0 then[m
[31m-            node_v[prev].conflict = next_node[m
[31m-        else[m
[31m-            bucket_v[key_hash] = next_node[m
[31m-        end[m
[31m-        node_v[cur].conflict = 0[m
[31m-[m
[31m-        return cur[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m---[[ Bind the key/val with the given node, and insert the node into the Hashtab.[m
[31m-    NOTE: this function does not touch any queue[m
[31m-]][m
[31m-local function insert_key(self, key, val, node)[m
[31m-    -- Bind the key/val with the node[m
[31m-    local node_id = node.id[m
[31m-    self.key_v[node_id] = key[m
[31m-    self.val_v[node_id] = val[m
[31m-[m
[31m-    -- Insert the node into the hash-table[m
[31m-    local key_hash = hash_string(self, key)[m
[31m-    local bucket_v = self.bucket_v[m
[31m-    node.conflict = bucket_v[key_hash][m
[31m-    bucket_v[key_hash] = node_id[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get(self, key)[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local node_id = find_key(self, key)[m
[31m-    if not node_id then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    -- print(key, ": moving node ", tostring(node), " to cache queue head")[m
[31m-    local cache_queue = self.cache_queue[m
[31m-    local node = self.node_v + node_id[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_head(cache_queue, node)[m
[31m-[m
[31m-    local expire = node.expire[m
[31m-    if expire >= 0 and expire < ngx_now() then[m
[31m-        -- print("expired: ", node.expire, " > ", ngx_now())[m
[31m-        return nil, self.val_v[node_id][m
[31m-    end[m
[31m-[m
[31m-    return self.val_v[node_id][m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.delete(self, key)[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local node_id = remove_key(self, key);[m
[31m-    if not node_id then[m
[31m-        return false[m
[31m-    end[m
[31m-[m
[31m-    local node = self.node_v + node_id[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_tail(self.free_queue, node)[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set(self, key, value, ttl)[m
[31m-    if type(key) ~= "string" then[m
[31m-        key = tostring(key)[m
[31m-    end[m
[31m-[m
[31m-    local node_id = find_key(self, key)[m
[31m-    local node[m
[31m-    if not node_id then[m
[31m-        local free_queue = self.free_queue[m
[31m-        if queue_is_empty(free_queue) then[m
[31m-            -- evict the least recently used key[m
[31m-            -- assert(not queue_is_empty(self.cache_queue))[m
[31m-            node = queue_last(self.cache_queue)[m
[31m-            remove_key(self, self.key_v[node.id])[m
[31m-        else[m
[31m-            -- take a free queue node[m
[31m-            node = queue_head(free_queue)[m
[31m-            -- print(key, ": get a new free node: ", tostring(node))[m
[31m-        end[m
[31m-[m
[31m-        -- insert the key[m
[31m-        insert_key(self, key, value, node)[m
[31m-    else[m
[31m-        node = self.node_v + node_id[m
[31m-        self.val_v[node_id] = value[m
[31m-    end[m
[31m-[m
[31m-    queue_remove(node)[m
[31m-    queue_insert_head(self.cache_queue, node)[m
[31m-[m
[31m-    if ttl then[m
[31m-        node.expire = ngx_now() + ttl[m
[31m-    else[m
[31m-        node.expire = -1[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/init-by-lua.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/init-by-lua.t[m
[1mdeleted file mode 100644[m
[1mindex 1de94fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/init-by-lua.t[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 13;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. qq![m
[31m-        init_by_lua '[m
[31m-            local function log(...)[m
[31m-                ngx.log(ngx.WARN, ...)[m
[31m-            end[m
[31m-[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:delete("dog")[m
[31m-            c:delete("cat")[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-![m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. qq![m
[31m-init_by_lua '[m
[31m-    lrucache = require "resty.lrucache"[m
[31m-    flv_index, err = lrucache.new(200)[m
[31m-    if not flv_index then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    flv_meta, err = lrucache.new(200)[m
[31m-    if not flv_meta then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    flv_channel, err = lrucache.new(200)[m
[31m-    if not flv_channel then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.log(ngx.WARN, "3 lrucache initialized.")[m
[31m-';[m
[31m-![m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-3 lrucache initialized.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/mixed.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/mixed.t[m
[1mdeleted file mode 100644[m
[1mindex 29300ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/mixed.t[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c2 = lrucache.new(2)[m
[31m-[m
[31m-            ngx.say("dog: ", c2:get("dog"))[m
[31m-            ngx.say("cat: ", c2:get("cat"))[m
[31m-[m
[31m-            c2:set("dog", 9)[m
[31m-            c2:set("cat", "hi")[m
[31m-[m
[31m-            ngx.say("dog: ", c2:get("dog"))[m
[31m-            ngx.say("cat: ", c2:get("cat"))[m
[31m-[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-dog: 9[m
[31m-cat: hi[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/pureffi/init-by-lua.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/pureffi/init-by-lua.t[m
[1mdeleted file mode 100644[m
[1mindex ad30c99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/pureffi/init-by-lua.t[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 13;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. qq![m
[31m-        init_by_lua '[m
[31m-            local function log(...)[m
[31m-                ngx.log(ngx.WARN, ...)[m
[31m-            end[m
[31m-[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:delete("dog")[m
[31m-            c:delete("cat")[m
[31m-            log("dog: ", c:get("dog"))[m
[31m-            log("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-![m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. qq![m
[31m-init_by_lua '[m
[31m-    lrucache = require "resty.lrucache.pureffi"[m
[31m-    flv_index, err = lrucache.new(200)[m
[31m-    if not flv_index then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    flv_meta, err = lrucache.new(200)[m
[31m-    if not flv_meta then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    flv_channel, err = lrucache.new(200)[m
[31m-    if not flv_channel then[m
[31m-        ngx.log(ngx.ERR, "failed to create the cache: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.log(ngx.WARN, "3 lrucache initialized.")[m
[31m-';[m
[31m-![m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-3 lrucache initialized.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/pureffi/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/pureffi/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 67268f7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/pureffi/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,390 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:delete("dog")[m
[31m-            c:delete("cat")[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: evict existing items[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-            if not c then[m
[31m-               ngx.say("failed to init lrucace: ", err)[m
[31m-               return[m
[31m-            end[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("bird", 76)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-            ngx.say("bird: ", c:get("bird"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: 56[m
[31m-bird: 76[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: evict existing items (reordered, get should also count)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-            if not c then[m
[31m-               ngx.say("failed to init lrucace: ", err)[m
[31m-               return[m
[31m-            end[m
[31m-[m
[31m-            c:set("cat", 56)[m
[31m-            c:set("dog", 32)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("bird", 76)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-            ngx.say("bird: ", c:get("bird"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: 56[m
[31m-bird: 76[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ttl[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 0.6)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.31)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 32[m
[31m-dog: nil32[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: load factor[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1, 0.25)[m
[31m-[m
[31m-            ngx.say(c.bucket_sz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-4[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: load factor clamped to 0.1[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(3, 0.05)[m
[31m-[m
[31m-            ngx.say(c.bucket_sz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: load factor saturated to 1[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(3, 2.1)[m
[31m-[m
[31m-            ngx.say(c.bucket_sz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: non-string keys[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local function log(...)[m
[31m-                ngx.say(...)[m
[31m-            end[m
[31m-[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local tab1 = {1, 2}[m
[31m-            local tab2 = {3, 4}[m
[31m-[m
[31m-            c:set(tab1, 32)[m
[31m-            c:set(tab2, 56)[m
[31m-            log("tab1: ", c:get(tab1))[m
[31m-            log("tab2: ", c:get(tab2))[m
[31m-[m
[31m-            c:set(tab1, 32)[m
[31m-            c:set(tab2, 56)[m
[31m-            log("tab1: ", c:get(tab1))[m
[31m-            log("tab2: ", c:get(tab2))[m
[31m-[m
[31m-            c:delete(tab1)[m
[31m-            c:delete(tab2)[m
[31m-            log("tab1: ", c:get(tab1))[m
[31m-            log("tab2: ", c:get(tab2))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-tab1: 32[m
[31m-tab2: 56[m
[31m-tab1: 32[m
[31m-tab2: 56[m
[31m-tab1: nil[m
[31m-tab2: nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: replace value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            c:set("dog", 33)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: replace value 2[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 1.0)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            c:set("dog", 33, 0.3)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.4)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 33[m
[31m-dog: nil33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: replace value 3 (the old value has longer expire time)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 1.2)[m
[31m-            c:set("dog", 33, 0.6)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.5)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 33[m
[31m-dog: nil33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: replace value 4[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache.pureffi"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 0.1)[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            c:set("dog", 33)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 961b7db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<"_EOC_";[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/../lua-resty-core/lib/?.lua;;";[m
[31m-    #init_by_lua '[m
[31m-    #local v = require "jit.v"[m
[31m-    #v.on("$Test::Nginx::Util::ErrLogFile")[m
[31m-    #require "resty.core"[m
[31m-    #';[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:delete("dog")[m
[31m-            c:delete("cat")[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: evict existing items[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-            if not c then[m
[31m-               ngx.say("failed to init lrucace: ", err)[m
[31m-               return[m
[31m-            end[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            c:set("cat", 56)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("bird", 76)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-            ngx.say("bird: ", c:get("bird"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: 56[m
[31m-bird: 76[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: evict existing items (reordered, get should also count)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(2)[m
[31m-            if not c then[m
[31m-               ngx.say("failed to init lrucace: ", err)[m
[31m-               return[m
[31m-            end[m
[31m-[m
[31m-            c:set("cat", 56)[m
[31m-            c:set("dog", 32)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-[m
[31m-            c:set("bird", 76)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-            ngx.say("cat: ", c:get("cat"))[m
[31m-            ngx.say("bird: ", c:get("bird"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-cat: 56[m
[31m-dog: nil[m
[31m-cat: 56[m
[31m-bird: 76[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ttl[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32, 0.5)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.25)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            ngx.sleep(0.26)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 32[m
[31m-dog: nil32[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ttl[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local lim = 5[m
[31m-            local c = lrucache.new(lim)[m
[31m-            local n = 1000[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                c:set("dog" .. i, i)[m
[31m-                c:delete("dog" .. i, i)[m
[31m-                c:set("dog" .. i, i)[m
[31m-                local cnt = 0[m
[31m-                for k, v in pairs(c.hasht) do[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-                assert(cnt <= lim)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                local key = "dog" .. math.random(1, n)[m
[31m-                c:get(key)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                local key = "dog" .. math.random(1, n)[m
[31m-                c:get(key)[m
[31m-                c:set("dog" .. i, i)[m
[31m-[m
[31m-                local cnt = 0[m
[31m-                for k, v in pairs(c.hasht) do[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-                assert(cnt <= lim)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 20[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: replace value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local lrucache = require "resty.lrucache"[m
[31m-            local c = lrucache.new(1)[m
[31m-[m
[31m-            c:set("dog", 32)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-[m
[31m-            c:set("dog", 33)[m
[31m-            ngx.say("dog: ", c:get("dog"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-dog: 32[m
[31m-dog: 33[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex a3c8067..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-lrucache-0.04/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex eebc749..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-*.t_[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f42cae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty-debug[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/lib/resty/memcached.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/lib/resty/memcached.lua[m
[1mdeleted file mode 100644[m
[1mindex 3390e68..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/lib/resty/memcached.lua[m
[1m+++ /dev/null[m
[36m@@ -1,741 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-local sub = string.sub[m
[31m-local escape_uri = ngx.escape_uri[m
[31m-local unescape_uri = ngx.unescape_uri[m
[31m-local match = string.match[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local strlen = string.len[m
[31m-local concat = table.concat[m
[31m-local setmetatable = setmetatable[m
[31m-local type = type[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = '0.13'[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(self, opts)[m
[31m-    local sock, err = tcp()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local escape_key = escape_uri[m
[31m-    local unescape_key = unescape_uri[m
[31m-[m
[31m-    if opts then[m
[31m-       local key_transform = opts.key_transform[m
[31m-[m
[31m-       if key_transform then[m
[31m-          escape_key = key_transform[1][m
[31m-          unescape_key = key_transform[2][m
[31m-          if not escape_key or not unescape_key then[m
[31m-             return nil, "expecting key_transform = { escape, unescape } table"[m
[31m-          end[m
[31m-       end[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({[m
[31m-        sock = sock,[m
[31m-        escape_key = escape_key,[m
[31m-        unescape_key = unescape_key,[m
[31m-    }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    sock:settimeout(timeout)[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.connect(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:connect(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _multi_get(self, keys)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local nkeys = #keys[m
[31m-[m
[31m-    if nkeys == 0 then[m
[31m-        return {}, nil[m
[31m-    end[m
[31m-[m
[31m-    local escape_key = self.escape_key[m
[31m-    local cmd = {"get"}[m
[31m-    local n = 1[m
[31m-[m
[31m-    for i = 1, nkeys do[m
[31m-        cmd[n + 1] = " "[m
[31m-        cmd[n + 2] = escape_key(keys[i])[m
[31m-        n = n + 2[m
[31m-    end[m
[31m-    cmd[n + 1] = "\r\n"[m
[31m-[m
[31m-    -- print("multi get cmd: ", cmd)[m
[31m-[m
[31m-    local bytes, err = sock:send(cmd)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local unescape_key = self.unescape_key[m
[31m-    local results = {}[m
[31m-[m
[31m-    while true do[m
[31m-        local line, err = sock:receive()[m
[31m-        if not line then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if line == 'END' then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        local key, flags, len = match(line, '^VALUE (%S+) (%d+) (%d+)$')[m
[31m-        -- print("key: ", key, "len: ", len, ", flags: ", flags)[m
[31m-[m
[31m-        if not key then[m
[31m-            return nil, line[m
[31m-        end[m
[31m-[m
[31m-        local data, err = sock:receive(len)[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        results[unescape_key(key)] = {data, flags}[m
[31m-[m
[31m-        data, err = sock:receive(2) -- discard the trailing CRLF[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return results[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get(self, key)[m
[31m-    if type(key) == "table" then[m
[31m-        return _multi_get(self, key)[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("get " .. self.escape_key(key) .. "\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    if line == 'END' then[m
[31m-        return nil, nil, nil[m
[31m-    end[m
[31m-[m
[31m-    local flags, len = match(line, '^VALUE %S+ (%d+) (%d+)$')[m
[31m-    if not flags then[m
[31m-        return nil, nil, line[m
[31m-    end[m
[31m-[m
[31m-    -- print("len: ", len, ", flags: ", flags)[m
[31m-[m
[31m-    local data, err = sock:receive(len)[m
[31m-    if not data then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    line, err = sock:receive(7) -- discard the trailing "\r\nEND\r\n"[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    return data, flags[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _multi_gets(self, keys)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local nkeys = #keys[m
[31m-[m
[31m-    if nkeys == 0 then[m
[31m-        return {}, nil[m
[31m-    end[m
[31m-[m
[31m-    local escape_key = self.escape_key[m
[31m-    local cmd = {"gets"}[m
[31m-    local n = 1[m
[31m-    for i = 1, nkeys do[m
[31m-        cmd[n + 1] = " "[m
[31m-        cmd[n + 2] = escape_key(keys[i])[m
[31m-        n = n + 2[m
[31m-    end[m
[31m-    cmd[n + 1] = "\r\n"[m
[31m-[m
[31m-    -- print("multi get cmd: ", cmd)[m
[31m-[m
[31m-    local bytes, err = sock:send(cmd)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local unescape_key = self.unescape_key[m
[31m-    local results = {}[m
[31m-[m
[31m-    while true do[m
[31m-        local line, err = sock:receive()[m
[31m-        if not line then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if line == 'END' then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        local key, flags, len, cas_uniq =[m
[31m-                match(line, '^VALUE (%S+) (%d+) (%d+) (%d+)$')[m
[31m-[m
[31m-        -- print("key: ", key, "len: ", len, ", flags: ", flags)[m
[31m-[m
[31m-        if not key then[m
[31m-            return nil, line[m
[31m-        end[m
[31m-[m
[31m-        local data, err = sock:receive(len)[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        results[unescape_key(key)] = {data, flags, cas_uniq}[m
[31m-[m
[31m-        data, err = sock:receive(2) -- discard the trailing CRLF[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return results[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.gets(self, key)[m
[31m-    if type(key) == "table" then[m
[31m-        return _multi_gets(self, key)[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("gets " .. self.escape_key(key) .. "\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    if line == 'END' then[m
[31m-        return nil, nil, nil, nil[m
[31m-    end[m
[31m-[m
[31m-    local flags, len, cas_uniq = match(line, '^VALUE %S+ (%d+) (%d+) (%d+)$')[m
[31m-    if not flags then[m
[31m-        return nil, nil, nil, line[m
[31m-    end[m
[31m-[m
[31m-    -- print("len: ", len, ", flags: ", flags)[m
[31m-[m
[31m-    local data, err = sock:receive(len)[m
[31m-    if not data then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    line, err = sock:receive(7) -- discard the trailing "\r\nEND\r\n"[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    return data, flags, cas_uniq[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _expand_table(value)[m
[31m-    local segs = {}[m
[31m-    local nelems = #value[m
[31m-    local nsegs = 0[m
[31m-    for i = 1, nelems do[m
[31m-        local seg = value[i][m
[31m-        nsegs = nsegs + 1[m
[31m-        if type(seg) == "table" then[m
[31m-            segs[nsegs] = _expand_table(seg)[m
[31m-        else[m
[31m-            segs[nsegs] = seg[m
[31m-        end[m
[31m-    end[m
[31m-    return concat(segs)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _store(self, cmd, key, value, exptime, flags)[m
[31m-    if not exptime then[m
[31m-        exptime = 0[m
[31m-    end[m
[31m-[m
[31m-    if not flags then[m
[31m-        flags = 0[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if type(value) == "table" then[m
[31m-        value = _expand_table(value)[m
[31m-    end[m
[31m-[m
[31m-    local req = cmd .. " " .. self.escape_key(key) .. " " .. flags .. " "[m
[31m-                .. exptime .. " " .. strlen(value) .. "\r\n" .. value[m
[31m-                .. "\r\n"[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local data, err = sock:receive()[m
[31m-    if not data then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if data == "STORED" then[m
[31m-        return 1[m
[31m-    end[m
[31m-[m
[31m-    return nil, data[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set(self, ...)[m
[31m-    return _store(self, "set", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.add(self, ...)[m
[31m-    return _store(self, "add", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.replace(self, ...)[m
[31m-    return _store(self, "replace", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.append(self, ...)[m
[31m-    return _store(self, "append", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.prepend(self, ...)[m
[31m-    return _store(self, "prepend", ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.cas(self, key, value, cas_uniq, exptime, flags)[m
[31m-    if not exptime then[m
[31m-        exptime = 0[m
[31m-    end[m
[31m-[m
[31m-    if not flags then[m
[31m-        flags = 0[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req = "cas " .. self.escape_key(key) .. " " .. flags .. " "[m
[31m-                .. exptime .. " " .. strlen(value) .. " " .. cas_uniq[m
[31m-                .. "\r\n" .. value .. "\r\n"[m
[31m-[m
[31m-    -- local cjson = require "cjson"[m
[31m-    -- print("request: ", cjson.encode(req))[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    -- print("response: [", line, "]")[m
[31m-[m
[31m-    if line == "STORED" then[m
[31m-        return 1[m
[31m-    end[m
[31m-[m
[31m-    return nil, line[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.delete(self, key)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    key = self.escape_key(key)[m
[31m-[m
[31m-    local req = "delete " .. key .. "\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local res, err = sock:receive()[m
[31m-    if not res then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if res ~= 'DELETED' then[m
[31m-        return nil, res[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_keepalive(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:setkeepalive(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_reused_times(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:getreusedtimes()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.flush_all(self, time)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req[m
[31m-    if time then[m
[31m-        req = "flush_all " .. time .. "\r\n"[m
[31m-    else[m
[31m-        req = "flush_all\r\n"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local res, err = sock:receive()[m
[31m-    if not res then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if res ~= 'OK' then[m
[31m-        return nil, res[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _incr_decr(self, cmd, key, value)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req = cmd .. " " .. self.escape_key(key) .. " " .. value .. "\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if not match(line, '^%d+$') then[m
[31m-        return nil, line[m
[31m-    end[m
[31m-[m
[31m-    return line[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.incr(self, key, value)[m
[31m-    return _incr_decr(self, "incr", key, value)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.decr(self, key, value)[m
[31m-    return _incr_decr(self, "decr", key, value)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.stats(self, args)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req[m
[31m-    if args then[m
[31m-        req = "stats " .. args .. "\r\n"[m
[31m-    else[m
[31m-        req = "stats\r\n"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local lines = {}[m
[31m-    local n = 0[m
[31m-    while true do[m
[31m-        local line, err = sock:receive()[m
[31m-        if not line then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if line == 'END' then[m
[31m-            return lines, nil[m
[31m-        end[m
[31m-[m
[31m-        if not match(line, "ERROR") then[m
[31m-            n = n + 1[m
[31m-            lines[n] = line[m
[31m-        else[m
[31m-            return nil, line[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- cannot reach here...[m
[31m-    return lines[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.version(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("version\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local ver = match(line, "^VERSION (.+)$")[m
[31m-    if not ver then[m
[31m-        return nil, ver[m
[31m-    end[m
[31m-[m
[31m-    return ver[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.quit(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("quit\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.verbosity(self, level)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("verbosity " .. level .. "\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if line ~= 'OK' then[m
[31m-        return nil, line[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.touch(self, key, exptime)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send("touch " .. self.escape_key(key) .. " "[m
[31m-                                 .. exptime .. "\r\n")[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    -- moxi server from couchbase returned stored after touching[m
[31m-    if line == "TOUCHED" or line =="STORED" then[m
[31m-        return 1[m
[31m-    end[m
[31m-    return nil, line[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.close(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:close()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/mock.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/mock.t[m
[1mdeleted file mode 100644[m
[1mindex bde19de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/mock.t[m
[1m+++ /dev/null[m
[36m@@ -1,193 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks() + 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: fail to flush[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("flush: ", ok);[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query_len: 11[m
[31m---- tcp_query eval[m
[31m-"flush_all\r\n"[m
[31m---- tcp_reply eval[m
[31m-"SOME ERROR\r\n"[m
[31m---- response_body[m
[31m-failed to flush all: SOME ERROR[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: continue using the obj when read timeout happens[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            memc:set_timeout(100) -- 0.1 sec[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local data, flags, err = memc:get("foo")[m
[31m-                if not data and err then[m
[31m-                    ngx.say("failed to get: ", err)[m
[31m-                else[m
[31m-                    ngx.say("get: ", data);[m
[31m-                end[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query_len: 9[m
[31m---- tcp_query eval[m
[31m-"get foo\r\n"[m
[31m---- tcp_reply eval[m
[31m-"VALUE foo 0 5\r\nhello\r\nEND\r\n"[m
[31m---- tcp_reply_delay: 150ms[m
[31m---- response_body[m
[31m-failed to get: timeout[m
[31m-failed to get: closed[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: gets multi getting error responses[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = memc:gets({"dog", "cat"})[m
[31m-            if not res then[m
[31m-                ngx.say("failed to gets: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("gets: ", table.concat(res, ", "));[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query_len: 14[m
[31m---- tcp_query eval[m
[31m-"gets dog cat\r\n"[m
[31m---- tcp_reply eval[m
[31m-"SERVER_ERROR\r\n"[m
[31m---- response_body[m
[31m-failed to gets: SERVER_ERROR[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get multi getting error responses[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = memc:get({"dog", "cat"})[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("get: ", table.concat(res, ", "));[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query_len: 13[m
[31m---- tcp_query eval[m
[31m-"get dog cat\r\n"[m
[31m---- tcp_reply eval[m
[31m-"SERVER_ERROR\r\n"[m
[31m---- response_body[m
[31m-failed to get: SERVER_ERROR[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 2661e13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,2195 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() - 1);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            assert(memc:set_timeout(1000)) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, flags, err = memc:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 32 (flags: 0)[m
[31m-dog: 32 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: add an exsitent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:add("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to add dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to add dog: NOT_STORED[m
[31m-dog: 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: add a nonexistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:add("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to add dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: replace an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:replace("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to replace dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: replace a nonexsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:replace("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to replace dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to replace dog: NOT_STORED[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: prepend to a nonexsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:prepend("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to prepend to dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to prepend to dog: NOT_STORED[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: prepend to an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:prepend("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to prepend to dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 5632[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: append to a nonexsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:append("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to append to dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to append to dog: NOT_STORED[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: append to an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:append("dog", 56)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to append to dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 3256[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: delete an exsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:delete("dog")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to delete dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-[m
[31m-            local res, flags, err = memc:add("dog", 772)[m
[31m-            if err then[m
[31m-                ngx.say("failed to add dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: delete a nonexsistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:delete("dog")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to delete dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to delete dog: NOT_FOUND[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: delete an exsistent key with delay[m
[31m---- SKIP[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:delete("dog", 1)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to delete dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:add("dog", 76)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to add dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:replace("dog", 53)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to replace dog: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to add dog: NOT_STORED[m
[31m-failed to replace dog: NOT_STORED[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: flags[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32, 0, 526)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 32 (flags: 526)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set with exptime[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep");[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32, 1, 526)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush with a delay[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all(3)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 32 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: incr an existent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, err = memc:incr("dog", 2)[m
[31m-            if not value then[m
[31m-                ngx.say("failed to incr dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog is now: ", value)[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog is now: 34[m
[31m-dog: 34 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: incr a nonexistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, err = memc:incr("dog", 2)[m
[31m-            if not value then[m
[31m-                ngx.say("failed to incr dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog is now: ", value)[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to incr dog: NOT_FOUND[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: decr an existent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, err = memc:decr("dog", 3)[m
[31m-            if not value then[m
[31m-                ngx.say("failed to decr dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog is now: ", value)[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog is now: 29[m
[31m-dog: 29 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: decr a nonexistent key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, err = memc:decr("dog", 2)[m
[31m-            if not value then[m
[31m-                ngx.say("failed to decr dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog is now: ", value)[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to decr dog: NOT_FOUND[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: general stats[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local lines, err = memc:stats()[m
[31m-            if not lines then[m
[31m-                ngx.say("failed to stats: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("stats:\\n", table.concat(lines, "\\n"))[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^stats:[m
[31m-STAT pid \d+[m
[31m-(?:STAT [^\n]+\n)*$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: stats items[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local lines, err = memc:stats("items")[m
[31m-            if not lines then[m
[31m-                ngx.say("failed to stats items: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("stats:\\n", table.concat(lines, "\\n"))[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^stats:[m
[31m-(?:STAT items:[^\n]+\n)*$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: stats sizes[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local lines, err = memc:stats("sizes")[m
[31m-            if not lines then[m
[31m-                ngx.say("failed to stats sizes: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("stats:\\n", table.concat(lines, "\\n"))[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^stats:[m
[31m-(?:STAT \d+ \d+\n)*$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ver, err = memc:version()[m
[31m-            if not ver then[m
[31m-                ngx.say("failed to get version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("version: ", ver)[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^version: \d+(?:\.\d+)*$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: quit[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:quit()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to quit: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ver, err = memc:version()[m
[31m-            if not ver then[m
[31m-                ngx.say("failed to get version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("closed successfully")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^failed to get version: (closed|timeout|broken pipe|connection reset by peer)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: verbosity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:verbosity(2)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to quit: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("successfully set verbosity to level 2")[m
[31m-[m
[31m-            local ver, err = memc:version()[m
[31m-            if not ver then[m
[31m-                ngx.say("failed to get version: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-successfully set verbosity to level 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: multi get[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("cat", "hello\\nworld\\n")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local results, err = memc:get({"dog", "blah", "cat"})[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get keys: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not results then[m
[31m-                    ngx.say("results empty")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", results.dog and table.concat(results.dog, " ") or "not found")[m
[31m-                ngx.say("cat: ", results.cat and table.concat(results.cat, " ") or "not found")[m
[31m-                ngx.say("blah: ", results.blah and table.concat(results.blah, " ") or "not found")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: 32 0[m
[31m-cat: hello[m
[31m-world[m
[31m- 0[m
[31m-blah: not found[m
[31m-dog: 32 0[m
[31m-cat: hello[m
[31m-world[m
[31m- 0[m
[31m-blah: not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multi get (special chars in keys)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog A", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("cat B", "hello\\nworld\\n")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local results, err = memc:get({"dog A", "blah", "cat B"})[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not results then[m
[31m-                ngx.say("results empty")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog A: ", results["dog A"] and table.concat(results["dog A"], " ") or "not found")[m
[31m-            ngx.say("cat B: ", results["cat B"] and table.concat(results["cat B"], " ") or "not found")[m
[31m-            ngx.say("blah: ", results.blah and table.concat(results.blah, " ") or "not found")[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog A: 32 0[m
[31m-cat B: hello[m
[31m-world[m
[31m- 0[m
[31m-blah: not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: connect timeout[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(100) -- 100 ms[m
[31m-[m
[31m-            local ok, err = memc:connect("www.taobao.com", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: set keepalive and get reused times[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local times = memc:get_reused_times()[m
[31m-            ngx.say("reused times: ", times)[m
[31m-[m
[31m-            local ok, err = memc:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            times = memc:get_reused_times()[m
[31m-            ngx.say("reused times: ", times)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-reused times: 0[m
[31m-reused times: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: gets (single key, found)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, cas_uniq, err = memc:gets("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 \(flags: 0, cas_uniq: \d+\)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: gets (single key, not found)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, flags, cas_uniq, err = memc:gets("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("dog not found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-dog not found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: gets (multiple key)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("cat", "hello\\nworld\\n")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local results, err = memc:gets({"dog", "blah", "cat"})[m
[31m-            if err then[m
[31m-                ngx.say("failed to get keys: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not results then[m
[31m-                ngx.say("results empty")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if results.dog then[m
[31m-                ngx.say("dog: ", table.concat(results.dog, " "))[m
[31m-            else[m
[31m-                ngx.say("dog not found")[m
[31m-            end[m
[31m-[m
[31m-            if results.blah then[m
[31m-                ngx.say("blah: ", table.concat(results.blah, " "))[m
[31m-            else[m
[31m-                ngx.say("blah not found")[m
[31m-            end[m
[31m-[m
[31m-            if results.cat then[m
[31m-                ngx.say("cat: ", table.concat(results.cat, " "))[m
[31m-            else[m
[31m-                ngx.say("cat not found")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 0 \d+[m
[31m-blah not found[m
[31m-cat: hello[m
[31m-world[m
[31m- 0 \d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: gets (single key) + cas[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, flags, cas_uniq, err = memc:gets("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-[m
[31m-            local ok, err = memc:cas("dog", "hello world", cas_uniq, 0, 78)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to cas: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("cas succeeded")[m
[31m-[m
[31m-            local value, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 \(flags: 0, cas_uniq: \d+\)[m
[31m-cas succeeded[m
[31m-dog: hello world \(flags: 78\)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: gets (multi key) + cas[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local results, err = memc:gets({"dog"})[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, flags, cas_uniq, err = unpack(results.dog)[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-[m
[31m-            local ok, err = memc:cas("dog", "hello world", cas_uniq, 0, 78)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to cas: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("cas succeeded")[m
[31m-[m
[31m-            local value, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 \(flags: 0, cas_uniq: \d+\)[m
[31m-cas succeeded[m
[31m-dog: hello world \(flags: 78\)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: gets (single key) + cas[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local value, flags, cas_uniq, err = memc:gets("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = memc:set("dog", 117)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ", cas_uniq: ", cas_uniq, ")")[m
[31m-[m
[31m-            local ok, err = memc:cas("dog", "hello world", cas_uniq, 0, 78)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to cas: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("cas succeeded")[m
[31m-[m
[31m-            local value, flags, err = memc:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", value, " (flags: ", flags, ")")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog: 32 \(flags: 0, cas_uniq: \d+\)[m
[31m-failed to cas: EXISTS$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: change escape method[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-[m
[31m-            function identity(str)[m
[31m-                return str[m
[31m-            end[m
[31m-[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new{ key_transform = { identity, identity }}[m
[31m-            local key = "dog&cat"[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set(key, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, flags, err = memc:get(key)[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get", key, ": ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say(key, " not found")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say(key, ": ", res, " (flags: ", flags, ")")[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog&cat: 32 (flags: 0)[m
[31m-dog&cat: 32 (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: gets (multiple key) + change only unescape key[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            function identity(str)[m
[31m-                return str[m
[31m-            end[m
[31m-[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new{key_transform = {ngx.escape_uri, identity}}[m
[31m-[m
[31m-            local key = "dog&cat"[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set(key, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("cat", "hello\\nworld\\n")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local results, err = memc:gets({key, "blah", "cat"})[m
[31m-            if err then[m
[31m-                ngx.say("failed to get keys: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not results then[m
[31m-                ngx.say("results empty")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if results[key] then[m
[31m-                ngx.say(key, ": ", table.concat(results[key], " "))[m
[31m-            else[m
[31m-                ngx.say(key, " not found")[m
[31m-            end[m
[31m-[m
[31m-            -- encode key for second run[m
[31m-            key = ngx.escape_uri(key)[m
[31m-[m
[31m-            if results[key] then[m
[31m-                ngx.say(key, ": ", table.concat(results[key], " "))[m
[31m-            else[m
[31m-                ngx.say(key, " not found")[m
[31m-            end[m
[31m-[m
[31m-[m
[31m-            if results.blah then[m
[31m-                ngx.say("blah: ", table.concat(results.blah, " "))[m
[31m-            else[m
[31m-                ngx.say("blah not found")[m
[31m-            end[m
[31m-[m
[31m-            if results.cat then[m
[31m-                ngx.say("cat: ", table.concat(results.cat, " "))[m
[31m-            else[m
[31m-                ngx.say("cat not found")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^dog&cat not found[m
[31m-dog%26cat: 32 0 \d+[m
[31m-blah not found[m
[31m-cat: hello[m
[31m-world[m
[31m- 0 \d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/tableset.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/tableset.t[m
[1mdeleted file mode 100644[m
[1mindex 6dadf33..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/tableset.t[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set with table[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", { "c", "a", "t" })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, flags, err = memc:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: cat (flags: 0)[m
[31m-dog: cat (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set with nested table[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set("dog", { "c", "a", { "t"} })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, flags, err = memc:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res, " (flags: ", flags, ")")[m
[31m-            end[m
[31m-[m
[31m-            memc:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dog: cat (flags: 0)[m
[31m-dog: cat (flags: 0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/touch.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/touch.t[m
[1mdeleted file mode 100644[m
[1mindex 62ea21f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/touch.t[m
[1m+++ /dev/null[m
[36m@@ -1,115 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local key = "dog&cat&rabbit"[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:set(key, "value", 1)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:touch(key, 120) -- 120sec[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to touch ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("touch: ", ok)[m
[31m-[m
[31m-            ngx.sleep(1.1)[m
[31m-[m
[31m-            local val, err = memc:get(key)[m
[31m-            if not val then[m
[31m-                ngx.say("failed to get ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("get key: ", val)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-touch: 1[m
[31m-get key: value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not exists[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local key = "dog&cat&rabbit"[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc = memcached:new()[m
[31m-            memc:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = memc:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:flush_all()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = memc:touch(key, 120) --120sec[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to touch ", key, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("touch: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m- GET /t[m
[31m---- response_body[m
[31m-failed to touch dog&cat&rabbit: NOT_FOUND[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex c27381c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memc = require "resty.memcached"[m
[31m-            ngx.say(memc._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ee195dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-memcached-0.14/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,549 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex b1c7a31..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,9 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-tags[m
[31m-*.t_[m
[31m-src/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f42cae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty-debug[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/lib/resty/mysql.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/lib/resty/mysql.lua[m
[1mdeleted file mode 100644[m
[1mindex 99a253e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/lib/resty/mysql.lua[m
[1m+++ /dev/null[m
[36m@@ -1,897 +0,0 @@[m
[31m--- Copyright (C) 2012 Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local bit = require "bit"[m
[31m-local sub = string.sub[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local strbyte = string.byte[m
[31m-local strchar = string.char[m
[31m-local strfind = string.find[m
[31m-local format = string.format[m
[31m-local strrep = string.rep[m
[31m-local null = ngx.null[m
[31m-local band = bit.band[m
[31m-local bxor = bit.bxor[m
[31m-local bor = bit.bor[m
[31m-local lshift = bit.lshift[m
[31m-local rshift = bit.rshift[m
[31m-local tohex = bit.tohex[m
[31m-local sha1 = ngx.sha1_bin[m
[31m-local concat = table.concat[m
[31m-local unpack = unpack[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-if not ngx.config[m
[31m-   or not ngx.config.ngx_lua_version[m
[31m-   or ngx.config.ngx_lua_version < 9011[m
[31m-then[m
[31m-    error("ngx_lua 0.9.11+ required")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.16' }[m
[31m-[m
[31m-[m
[31m--- constants[m
[31m-[m
[31m-local STATE_CONNECTED = 1[m
[31m-local STATE_COMMAND_SENT = 2[m
[31m-[m
[31m-local COM_QUIT = 0x01[m
[31m-local COM_QUERY = 0x03[m
[31m-local CLIENT_SSL = 0x0800[m
[31m-[m
[31m-local SERVER_MORE_RESULTS_EXISTS = 8[m
[31m-[m
[31m--- 16MB - 1, the default max allowed packet size used by libmysqlclient[m
[31m-local FULL_PACKET_SIZE = 16777215[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m--- mysql field value type converters[m
[31m-local converters = new_tab(0, 8)[m
[31m-[m
[31m-for i = 0x01, 0x05 do[m
[31m-    -- tiny, short, long, float, double[m
[31m-    converters[i] = tonumber[m
[31m-end[m
[31m--- converters[0x08] = tonumber  -- long long[m
[31m-converters[0x09] = tonumber  -- int24[m
[31m-converters[0x0d] = tonumber  -- year[m
[31m-converters[0xf6] = tonumber  -- newdecimal[m
[31m-[m
[31m-[m
[31m-local function _get_byte2(data, i)[m
[31m-    local a, b = strbyte(data, i, i + 1)[m
[31m-    return bor(a, lshift(b, 8)), i + 2[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _get_byte3(data, i)[m
[31m-    local a, b, c = strbyte(data, i, i + 2)[m
[31m-    return bor(a, lshift(b, 8), lshift(c, 16)), i + 3[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _get_byte4(data, i)[m
[31m-    local a, b, c, d = strbyte(data, i, i + 3)[m
[31m-    return bor(a, lshift(b, 8), lshift(c, 16), lshift(d, 24)), i + 4[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _get_byte8(data, i)[m
[31m-    local a, b, c, d, e, f, g, h = strbyte(data, i, i + 7)[m
[31m-[m
[31m-    -- XXX workaround for the lack of 64-bit support in bitop:[m
[31m-    local lo = bor(a, lshift(b, 8), lshift(c, 16), lshift(d, 24))[m
[31m-    local hi = bor(e, lshift(f, 8), lshift(g, 16), lshift(h, 24))[m
[31m-    return lo + hi * 4294967296, i + 8[m
[31m-[m
[31m-    -- return bor(a, lshift(b, 8), lshift(c, 16), lshift(d, 24), lshift(e, 32),[m
[31m-               -- lshift(f, 40), lshift(g, 48), lshift(h, 56)), i + 8[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _set_byte2(n)[m
[31m-    return strchar(band(n, 0xff), band(rshift(n, 8), 0xff))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _set_byte3(n)[m
[31m-    return strchar(band(n, 0xff),[m
[31m-                   band(rshift(n, 8), 0xff),[m
[31m-                   band(rshift(n, 16), 0xff))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _set_byte4(n)[m
[31m-    return strchar(band(n, 0xff),[m
[31m-                   band(rshift(n, 8), 0xff),[m
[31m-                   band(rshift(n, 16), 0xff),[m
[31m-                   band(rshift(n, 24), 0xff))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _from_cstring(data, i)[m
[31m-    local last = strfind(data, "\0", i, true)[m
[31m-    if not last then[m
[31m-        return nil, nil[m
[31m-    end[m
[31m-[m
[31m-    return sub(data, i, last), last + 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _to_cstring(data)[m
[31m-    return data .. "\0"[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _to_binary_coded_string(data)[m
[31m-    return strchar(#data) .. data[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _dump(data)[m
[31m-    local len = #data[m
[31m-    local bytes = new_tab(len, 0)[m
[31m-    for i = 1, len do[m
[31m-        bytes[i] = format("%x", strbyte(data, i))[m
[31m-    end[m
[31m-    return concat(bytes, " ")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _dumphex(data)[m
[31m-    local len = #data[m
[31m-    local bytes = new_tab(len, 0)[m
[31m-    for i = 1, len do[m
[31m-        bytes[i] = tohex(strbyte(data, i), 2)[m
[31m-    end[m
[31m-    return concat(bytes, " ")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _compute_token(password, scramble)[m
[31m-    if password == "" then[m
[31m-        return ""[m
[31m-    end[m
[31m-[m
[31m-    local stage1 = sha1(password)[m
[31m-    local stage2 = sha1(stage1)[m
[31m-    local stage3 = sha1(scramble .. stage2)[m
[31m-    local n = #stage1[m
[31m-    local bytes = new_tab(n, 0)[m
[31m-    for i = 1, n do[m
[31m-         bytes[i] = strchar(bxor(strbyte(stage3, i), strbyte(stage1, i)))[m
[31m-    end[m
[31m-[m
[31m-    return concat(bytes)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _send_packet(self, req, size)[m
[31m-    local sock = self.sock[m
[31m-[m
[31m-    self.packet_no = self.packet_no + 1[m
[31m-[m
[31m-    -- print("packet no: ", self.packet_no)[m
[31m-[m
[31m-    local packet = _set_byte3(size) .. strchar(self.packet_no) .. req[m
[31m-[m
[31m-    -- print("sending packet: ", _dump(packet))[m
[31m-[m
[31m-    -- print("sending packet... of size " .. #packet)[m
[31m-[m
[31m-    return sock:send(packet)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _recv_packet(self)[m
[31m-    local sock = self.sock[m
[31m-[m
[31m-    local data, err = sock:receive(4) -- packet header[m
[31m-    if not data then[m
[31m-        return nil, nil, "failed to receive packet header: " .. err[m
[31m-    end[m
[31m-[m
[31m-    --print("packet header: ", _dump(data))[m
[31m-[m
[31m-    local len, pos = _get_byte3(data, 1)[m
[31m-[m
[31m-    --print("packet length: ", len)[m
[31m-[m
[31m-    if len == 0 then[m
[31m-        return nil, nil, "empty packet"[m
[31m-    end[m
[31m-[m
[31m-    if len > self._max_packet_size then[m
[31m-        return nil, nil, "packet size too big: " .. len[m
[31m-    end[m
[31m-[m
[31m-    local num = strbyte(data, pos)[m
[31m-[m
[31m-    --print("recv packet: packet no: ", num)[m
[31m-[m
[31m-    self.packet_no = num[m
[31m-[m
[31m-    data, err = sock:receive(len)[m
[31m-[m
[31m-    --print("receive returned")[m
[31m-[m
[31m-    if not data then[m
[31m-        return nil, nil, "failed to read packet content: " .. err[m
[31m-    end[m
[31m-[m
[31m-    --print("packet content: ", _dump(data))[m
[31m-    --print("packet content (ascii): ", data)[m
[31m-[m
[31m-    local field_count = strbyte(data, 1)[m
[31m-[m
[31m-    local typ[m
[31m-    if field_count == 0x00 then[m
[31m-        typ = "OK"[m
[31m-    elseif field_count == 0xff then[m
[31m-        typ = "ERR"[m
[31m-    elseif field_count == 0xfe then[m
[31m-        typ = "EOF"[m
[31m-    elseif field_count <= 250 then[m
[31m-        typ = "DATA"[m
[31m-    end[m
[31m-[m
[31m-    return data, typ[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _from_length_coded_bin(data, pos)[m
[31m-    local first = strbyte(data, pos)[m
[31m-[m
[31m-    --print("LCB: first: ", first)[m
[31m-[m
[31m-    if not first then[m
[31m-        return nil, pos[m
[31m-    end[m
[31m-[m
[31m-    if first >= 0 and first <= 250 then[m
[31m-        return first, pos + 1[m
[31m-    end[m
[31m-[m
[31m-    if first == 251 then[m
[31m-        return null, pos + 1[m
[31m-    end[m
[31m-[m
[31m-    if first == 252 then[m
[31m-        pos = pos + 1[m
[31m-        return _get_byte2(data, pos)[m
[31m-    end[m
[31m-[m
[31m-    if first == 253 then[m
[31m-        pos = pos + 1[m
[31m-        return _get_byte3(data, pos)[m
[31m-    end[m
[31m-[m
[31m-    if first == 254 then[m
[31m-        pos = pos + 1[m
[31m-        return _get_byte8(data, pos)[m
[31m-    end[m
[31m-[m
[31m-    return false, pos + 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _from_length_coded_str(data, pos)[m
[31m-    local len[m
[31m-    len, pos = _from_length_coded_bin(data, pos)[m
[31m-    if len == nil or len == null then[m
[31m-        return null, pos[m
[31m-    end[m
[31m-[m
[31m-    return sub(data, pos, pos + len - 1), pos + len[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_ok_packet(packet)[m
[31m-    local res = new_tab(0, 5)[m
[31m-    local pos[m
[31m-[m
[31m-    res.affected_rows, pos = _from_length_coded_bin(packet, 2)[m
[31m-[m
[31m-    --print("affected rows: ", res.affected_rows, ", pos:", pos)[m
[31m-[m
[31m-    res.insert_id, pos = _from_length_coded_bin(packet, pos)[m
[31m-[m
[31m-    --print("insert id: ", res.insert_id, ", pos:", pos)[m
[31m-[m
[31m-    res.server_status, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    --print("server status: ", res.server_status, ", pos:", pos)[m
[31m-[m
[31m-    res.warning_count, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    --print("warning count: ", res.warning_count, ", pos: ", pos)[m
[31m-[m
[31m-    local message = sub(packet, pos)[m
[31m-    if message and message ~= "" then[m
[31m-        res.message = message[m
[31m-    end[m
[31m-[m
[31m-    --print("message: ", res.message, ", pos:", pos)[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_eof_packet(packet)[m
[31m-    local pos = 2[m
[31m-[m
[31m-    local warning_count, pos = _get_byte2(packet, pos)[m
[31m-    local status_flags = _get_byte2(packet, pos)[m
[31m-[m
[31m-    return warning_count, status_flags[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_err_packet(packet)[m
[31m-    local errno, pos = _get_byte2(packet, 2)[m
[31m-    local marker = sub(packet, pos, pos)[m
[31m-    local sqlstate[m
[31m-    if marker == '#' then[m
[31m-        -- with sqlstate[m
[31m-        pos = pos + 1[m
[31m-        sqlstate = sub(packet, pos, pos + 5 - 1)[m
[31m-        pos = pos + 5[m
[31m-    end[m
[31m-[m
[31m-    local message = sub(packet, pos)[m
[31m-    return errno, message, sqlstate[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_result_set_header_packet(packet)[m
[31m-    local field_count, pos = _from_length_coded_bin(packet, 1)[m
[31m-[m
[31m-    local extra[m
[31m-    extra = _from_length_coded_bin(packet, pos)[m
[31m-[m
[31m-    return field_count, extra[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_field_packet(data)[m
[31m-    local col = new_tab(0, 2)[m
[31m-    local catalog, db, table, orig_table, orig_name, charsetnr, length[m
[31m-    local pos[m
[31m-    catalog, pos = _from_length_coded_str(data, 1)[m
[31m-[m
[31m-    --print("catalog: ", col.catalog, ", pos:", pos)[m
[31m-[m
[31m-    db, pos = _from_length_coded_str(data, pos)[m
[31m-    table, pos = _from_length_coded_str(data, pos)[m
[31m-    orig_table, pos = _from_length_coded_str(data, pos)[m
[31m-    col.name, pos = _from_length_coded_str(data, pos)[m
[31m-[m
[31m-    orig_name, pos = _from_length_coded_str(data, pos)[m
[31m-[m
[31m-    pos = pos + 1 -- ignore the filler[m
[31m-[m
[31m-    charsetnr, pos = _get_byte2(data, pos)[m
[31m-[m
[31m-    length, pos = _get_byte4(data, pos)[m
[31m-[m
[31m-    col.type = strbyte(data, pos)[m
[31m-[m
[31m-    --[[[m
[31m-    pos = pos + 1[m
[31m-[m
[31m-    col.flags, pos = _get_byte2(data, pos)[m
[31m-[m
[31m-    col.decimals = strbyte(data, pos)[m
[31m-    pos = pos + 1[m
[31m-[m
[31m-    local default = sub(data, pos + 2)[m
[31m-    if default and default ~= "" then[m
[31m-        col.default = default[m
[31m-    end[m
[31m-    --]][m
[31m-[m
[31m-    return col[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _parse_row_data_packet(data, cols, compact)[m
[31m-    local pos = 1[m
[31m-    local ncols = #cols[m
[31m-    local row[m
[31m-    if compact then[m
[31m-        row = new_tab(ncols, 0)[m
[31m-    else[m
[31m-        row = new_tab(0, ncols)[m
[31m-    end[m
[31m-    for i = 1, ncols do[m
[31m-        local value[m
[31m-        value, pos = _from_length_coded_str(data, pos)[m
[31m-        local col = cols[i][m
[31m-        local typ = col.type[m
[31m-        local name = col.name[m
[31m-[m
[31m-        --print("row field value: ", value, ", type: ", typ)[m
[31m-[m
[31m-        if value ~= null then[m
[31m-            local conv = converters[typ][m
[31m-            if conv then[m
[31m-                value = conv(value)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if compact then[m
[31m-            row[i] = value[m
[31m-[m
[31m-        else[m
[31m-            row[name] = value[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return row[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _recv_field_packet(self)[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if typ == "ERR" then[m
[31m-        local errno, msg, sqlstate = _parse_err_packet(packet)[m
[31m-        return nil, msg, errno, sqlstate[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= 'DATA' then[m
[31m-        return nil, "bad field packet type: " .. typ[m
[31m-    end[m
[31m-[m
[31m-    -- typ == 'DATA'[m
[31m-[m
[31m-    return _parse_field_packet(packet)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local sock, err = tcp()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-    return setmetatable({ sock = sock }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(timeout)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.connect(self, opts)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local max_packet_size = opts.max_packet_size[m
[31m-    if not max_packet_size then[m
[31m-        max_packet_size = 1024 * 1024 -- default 1 MB[m
[31m-    end[m
[31m-    self._max_packet_size = max_packet_size[m
[31m-[m
[31m-    local ok, err[m
[31m-[m
[31m-    self.compact = opts.compact_arrays[m
[31m-[m
[31m-    local database = opts.database or ""[m
[31m-    local user = opts.user or ""[m
[31m-[m
[31m-    local pool = opts.pool[m
[31m-[m
[31m-    local host = opts.host[m
[31m-    if host then[m
[31m-        local port = opts.port or 3306[m
[31m-        if not pool then[m
[31m-            pool = user .. ":" .. database .. ":" .. host .. ":" .. port[m
[31m-        end[m
[31m-[m
[31m-        ok, err = sock:connect(host, port, { pool = pool })[m
[31m-[m
[31m-    else[m
[31m-        local path = opts.path[m
[31m-        if not path then[m
[31m-            return nil, 'neither "host" nor "path" options are specified'[m
[31m-        end[m
[31m-[m
[31m-        if not pool then[m
[31m-            pool = user .. ":" .. database .. ":" .. path[m
[31m-        end[m
[31m-[m
[31m-        ok, err = sock:connect("unix:" .. path, { pool = pool })[m
[31m-    end[m
[31m-[m
[31m-    if not ok then[m
[31m-        return nil, 'failed to connect: ' .. err[m
[31m-    end[m
[31m-[m
[31m-    local reused = sock:getreusedtimes()[m
[31m-[m
[31m-    if reused and reused > 0 then[m
[31m-        self.state = STATE_CONNECTED[m
[31m-        return 1[m
[31m-    end[m
[31m-[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if typ == "ERR" then[m
[31m-        local errno, msg, sqlstate = _parse_err_packet(packet)[m
[31m-        return nil, msg, errno, sqlstate[m
[31m-    end[m
[31m-[m
[31m-    self.protocol_ver = strbyte(packet)[m
[31m-[m
[31m-    --print("protocol version: ", self.protocol_ver)[m
[31m-[m
[31m-    local server_ver, pos = _from_cstring(packet, 2)[m
[31m-    if not server_ver then[m
[31m-        return nil, "bad handshake initialization packet: bad server version"[m
[31m-    end[m
[31m-[m
[31m-    --print("server version: ", server_ver)[m
[31m-[m
[31m-    self._server_ver = server_ver[m
[31m-[m
[31m-    local thread_id, pos = _get_byte4(packet, pos)[m
[31m-[m
[31m-    --print("thread id: ", thread_id)[m
[31m-[m
[31m-    local scramble = sub(packet, pos, pos + 8 - 1)[m
[31m-    if not scramble then[m
[31m-        return nil, "1st part of scramble not found"[m
[31m-    end[m
[31m-[m
[31m-    pos = pos + 9 -- skip filler[m
[31m-[m
[31m-    -- two lower bytes[m
[31m-    local capabilities  -- server capabilities[m
[31m-    capabilities, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    -- print(format("server capabilities: %#x", capabilities))[m
[31m-[m
[31m-    self._server_lang = strbyte(packet, pos)[m
[31m-    pos = pos + 1[m
[31m-[m
[31m-    --print("server lang: ", self._server_lang)[m
[31m-[m
[31m-    self._server_status, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    --print("server status: ", self._server_status)[m
[31m-[m
[31m-    local more_capabilities[m
[31m-    more_capabilities, pos = _get_byte2(packet, pos)[m
[31m-[m
[31m-    capabilities = bor(capabilities, lshift(more_capabilities, 16))[m
[31m-[m
[31m-    --print("server capabilities: ", capabilities)[m
[31m-[m
[31m-    -- local len = strbyte(packet, pos)[m
[31m-    local len = 21 - 8 - 1[m
[31m-[m
[31m-    --print("scramble len: ", len)[m
[31m-[m
[31m-    pos = pos + 1 + 10[m
[31m-[m
[31m-    local scramble_part2 = sub(packet, pos, pos + len - 1)[m
[31m-    if not scramble_part2 then[m
[31m-        return nil, "2nd part of scramble not found"[m
[31m-    end[m
[31m-[m
[31m-    scramble = scramble .. scramble_part2[m
[31m-    --print("scramble: ", _dump(scramble))[m
[31m-[m
[31m-    local client_flags = 0x3f7cf;[m
[31m-[m
[31m-    local ssl_verify = opts.ssl_verify[m
[31m-    local use_ssl = opts.ssl or ssl_verify[m
[31m-[m
[31m-    if use_ssl then[m
[31m-        if band(capabilities, CLIENT_SSL) == 0 then[m
[31m-            return nil, "ssl disabled on server"[m
[31m-        end[m
[31m-[m
[31m-        -- send a SSL Request Packet[m
[31m-        local req = _set_byte4(bor(client_flags, CLIENT_SSL))[m
[31m-                    .. _set_byte4(self._max_packet_size)[m
[31m-                    .. "\0" -- TODO: add support for charset encoding[m
[31m-                    .. strrep("\0", 23)[m
[31m-[m
[31m-        local packet_len = 4 + 4 + 1 + 23[m
[31m-        local bytes, err = _send_packet(self, req, packet_len)[m
[31m-        if not bytes then[m
[31m-            return nil, "failed to send client authentication packet: " .. err[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = sock:sslhandshake(false, nil, ssl_verify)[m
[31m-        if not ok then[m
[31m-            return nil, "failed to do ssl handshake: " .. (err or "")[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local password = opts.password or ""[m
[31m-[m
[31m-    local token = _compute_token(password, scramble)[m
[31m-[m
[31m-    --print("token: ", _dump(token))[m
[31m-[m
[31m-    local req = _set_byte4(client_flags)[m
[31m-                .. _set_byte4(self._max_packet_size)[m
[31m-                .. "\0" -- TODO: add support for charset encoding[m
[31m-                .. strrep("\0", 23)[m
[31m-                .. _to_cstring(user)[m
[31m-                .. _to_binary_coded_string(token)[m
[31m-                .. _to_cstring(database)[m
[31m-[m
[31m-    local packet_len = 4 + 4 + 1 + 23 + #user + 1[m
[31m-        + #token + 1 + #database + 1[m
[31m-[m
[31m-    -- print("packet content length: ", packet_len)[m
[31m-    -- print("packet content: ", _dump(concat(req, "")))[m
[31m-[m
[31m-    local bytes, err = _send_packet(self, req, packet_len)[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send client authentication packet: " .. err[m
[31m-    end[m
[31m-[m
[31m-    --print("packet sent ", bytes, " bytes")[m
[31m-[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, "failed to receive the result packet: " .. err[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'ERR' then[m
[31m-        local errno, msg, sqlstate = _parse_err_packet(packet)[m
[31m-        return nil, msg, errno, sqlstate[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'EOF' then[m
[31m-        return nil, "old pre-4.1 authentication protocol not supported"[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= 'OK' then[m
[31m-        return nil, "bad packet type: " .. typ[m
[31m-    end[m
[31m-[m
[31m-    self.state = STATE_CONNECTED[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_keepalive(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if self.state ~= STATE_CONNECTED then[m
[31m-        return nil, "cannot be reused in the current connection state: "[m
[31m-                    .. (self.state or "nil")[m
[31m-    end[m
[31m-[m
[31m-    self.state = nil[m
[31m-    return sock:setkeepalive(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_reused_times(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:getreusedtimes()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.close(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    self.state = nil[m
[31m-[m
[31m-    local bytes, err = _send_packet(self, strchar(COM_QUIT), 1)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return sock:close()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.server_ver(self)[m
[31m-    return self._server_ver[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function send_query(self, query)[m
[31m-    if self.state ~= STATE_CONNECTED then[m
[31m-        return nil, "cannot send query in the current context: "[m
[31m-                    .. (self.state or "nil")[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    self.packet_no = -1[m
[31m-[m
[31m-    local cmd_packet = strchar(COM_QUERY) .. query[m
[31m-    local packet_len = 1 + #query[m
[31m-[m
[31m-    local bytes, err = _send_packet(self, cmd_packet, packet_len)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    self.state = STATE_COMMAND_SENT[m
[31m-[m
[31m-    --print("packet sent ", bytes, " bytes")[m
[31m-[m
[31m-    return bytes[m
[31m-end[m
[31m-_M.send_query = send_query[m
[31m-[m
[31m-[m
[31m-local function read_result(self, est_nrows)[m
[31m-    if self.state ~= STATE_COMMAND_SENT then[m
[31m-        return nil, "cannot read result in the current context: "[m
[31m-                    .. (self.state or "nil")[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if typ == "ERR" then[m
[31m-        self.state = STATE_CONNECTED[m
[31m-[m
[31m-        local errno, msg, sqlstate = _parse_err_packet(packet)[m
[31m-        return nil, msg, errno, sqlstate[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'OK' then[m
[31m-        local res = _parse_ok_packet(packet)[m
[31m-        if res and band(res.server_status, SERVER_MORE_RESULTS_EXISTS) ~= 0 then[m
[31m-            return res, "again"[m
[31m-        end[m
[31m-[m
[31m-        self.state = STATE_CONNECTED[m
[31m-        return res[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= 'DATA' then[m
[31m-        self.state = STATE_CONNECTED[m
[31m-[m
[31m-        return nil, "packet type " .. typ .. " not supported"[m
[31m-    end[m
[31m-[m
[31m-    -- typ == 'DATA'[m
[31m-[m
[31m-    --print("read the result set header packet")[m
[31m-[m
[31m-    local field_count, extra = _parse_result_set_header_packet(packet)[m
[31m-[m
[31m-    --print("field count: ", field_count)[m
[31m-[m
[31m-    local cols = new_tab(field_count, 0)[m
[31m-    for i = 1, field_count do[m
[31m-        local col, err, errno, sqlstate = _recv_field_packet(self)[m
[31m-        if not col then[m
[31m-            return nil, err, errno, sqlstate[m
[31m-        end[m
[31m-[m
[31m-        cols[i] = col[m
[31m-    end[m
[31m-[m
[31m-    local packet, typ, err = _recv_packet(self)[m
[31m-    if not packet then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= 'EOF' then[m
[31m-        return nil, "unexpected packet type " .. typ .. " while eof packet is "[m
[31m-            .. "expected"[m
[31m-    end[m
[31m-[m
[31m-    -- typ == 'EOF'[m
[31m-[m
[31m-    local compact = self.compact[m
[31m-[m
[31m-    local rows = new_tab(est_nrows or 4, 0)[m
[31m-    local i = 0[m
[31m-    while true do[m
[31m-        --print("reading a row")[m
[31m-[m
[31m-        packet, typ, err = _recv_packet(self)[m
[31m-        if not packet then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if typ == 'EOF' then[m
[31m-            local warning_count, status_flags = _parse_eof_packet(packet)[m
[31m-[m
[31m-            --print("status flags: ", status_flags)[m
[31m-[m
[31m-            if band(status_flags, SERVER_MORE_RESULTS_EXISTS) ~= 0 then[m
[31m-                return rows, "again"[m
[31m-            end[m
[31m-[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        -- if typ ~= 'DATA' then[m
[31m-            -- return nil, 'bad row packet type: ' .. typ[m
[31m-        -- end[m
[31m-[m
[31m-        -- typ == 'DATA'[m
[31m-[m
[31m-        local row = _parse_row_data_packet(packet, cols, compact)[m
[31m-        i = i + 1[m
[31m-        rows[i] = row[m
[31m-    end[m
[31m-[m
[31m-    self.state = STATE_CONNECTED[m
[31m-[m
[31m-    return rows[m
[31m-end[m
[31m-_M.read_result = read_result[m
[31m-[m
[31m-[m
[31m-function _M.query(self, query, est_nrows)[m
[31m-    local bytes, err = send_query(self, query)[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send query: " .. err[m
[31m-    end[m
[31m-[m
[31m-    return read_result(self, est_nrows)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_compact_arrays(self, value)[m
[31m-    self.compact = value[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/big.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/big.t[m
[1mdeleted file mode 100644[m
[1mindex 5fc3905..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/big.t[m
[1m+++ /dev/null[m
[36m@@ -1,408 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-my @skip;[m
[31m-BEGIN {[m
[31m-    if ($ENV{LD_PRELOAD} =~ /\bmockeagain\.so\b/) {[m
[31m-        @skip = (skip_all => 'too slow in mockeagain mode')[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua @skip;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(50);[m
[31m-#repeat_each(10);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-log_level 'warn';[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: big field value exceeding 256[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(1024))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'"[m
[31m-                   .. string.rep("B", 1024)[m
[31m-                   .. "\')")[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-'connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-1 rows inserted into table cats (last id: 1)[m
[31m-result: [{"id":"1","name":"' . ('B' x 1024)[m
[31m-   . '"}]' . "\n" .[m
[31m-'result: [{"id":"1","name":"' . ('B' x 1024)[m
[31m-   . '"}]' . "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: big field value exceeding max packet size[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                max_packet_size = 1024 })[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(1024))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'"[m
[31m-                   .. string.rep("B", 1024)[m
[31m-                   .. "\')")[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-'connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-1 rows inserted into table cats (last id: 1)[m
[31m-bad result: packet size too big: 1029: nil: nil.[m
[31m-'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: big field value exceeding 256 (first field in rows)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(1024))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'"[m
[31m-                   .. string.rep("B", 1024)[m
[31m-                   .. "\')")[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-'connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-1 rows inserted into table cats (last id: 1)[m
[31m-result: [{"name":"' . ('B' x 1024)[m
[31m-   . '"}]' . "\n" .[m
[31m-'result: [{"name":"' . ('B' x 1024)[m
[31m-   . '"}]' . "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: big field value exceeding 65536 (first field in rows)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(65540))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'"[m
[31m-                   .. string.rep("B", 65540)[m
[31m-                   .. "\')")[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-'connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-1 rows inserted into table cats (last id: 1)[m
[31m-result: [{"name":"' . ('B' x 65540)[m
[31m-   . '"}]' . "\n" .[m
[31m-'result: [{"name":"' . ('B' x 65540)[m
[31m-   . '"}]' . "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/compact_arrays.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/compact_arrays.t[m
[1mdeleted file mode 100644[m
[1mindex 4581f77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/compact_arrays.t[m
[1m+++ /dev/null[m
[36m@@ -1,345 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: send query w/o result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect{[m
[31m-                compact_arrays = true,[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"}[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: (?:{"insert_id":0,"server_status":2,"warning_count":[01],"affected_rows":0}|{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]})$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: select query with an non-empty result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect{[m
[31m-                compact_arrays = true,[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"}[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name, id from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name, id from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [["Bob","1"],["","2"],[null,"3"]][m
[31m-result: [[null,"3"],["","2"],["Bob","1"]][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: select query with an empty result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect{[m
[31m-                compact_arrays = true,[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"}[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-result: [][m
[31m-result: [][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select query with an non-empty result set - set_compact_arrays[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect{[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"}[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            db:set_compact_arrays(true)[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name, id from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            db:set_compact_arrays(false)[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name, id from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [["Bob","1"],["","2"],[null,"3"]][m
[31m-result: [{"id":"3","name":null},{"id":"2","name":""},{"id":"1","name":"Bob"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/data/test.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/data/test.crt[m
[1mdeleted file mode 100644[m
[1mindex a69a011..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/data/test.crt[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICqTCCAhICCQClDm1WkreW4jANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQD[m
[31m-DAh0ZXN0LmNvbTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20wIBcN[m
[31m-MTQwNzIxMDMyMzQ3WhgPMjE1MTA2MTMwMzIzNDdaMIGXMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MRIwEAYDVQQLDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl[m
[31m-c3QuY29tMSAwHgYJKoZIhvcNAQkBFhFhZ2VudHpoQGdtYWlsLmNvbTCBnzANBgkq[m
[31m-hkiG9w0BAQEFAAOBjQAwgYkCgYEA6P18zUvtmaKQK2xePy8ZbFwSyTLw+jW6t9eZ[m
[31m-aiTec8X3ibN9WemrxHzkTRikxP3cAQoITRuZiQvF4Q7DO6wMkz/b0zwfgX5uedGq[m
[31m-047AJP6n/mwlDOjGSNomBLoXQzo7tVe60ikEm3ZyDUqnJPJMt3hImO5XSop4MPMu[m
[31m-Za9WhFcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQA4OBb9bOyWB1//93nSXX1mdENZ[m
[31m-IQeyTK0Dd6My76lnZxnZ4hTWrvvd0b17KLDU6JnS2N5ee3ATVkojPidRLWLIhnh5[m
[31m-0eXrcKalbO2Ce6nShoFvQCQKXN2Txmq2vO/Mud2bHAWwJALg+qi1Iih/gVYB9sct[m
[31m-FLg8zFOzRlYiU+6Mmw==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/data/test.key b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/data/test.key[m
[1mdeleted file mode 100644[m
[1mindex 6c13527..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/data/test.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXgIBAAKBgQDo/XzNS+2ZopArbF4/LxlsXBLJMvD6Nbq315lqJN5zxfeJs31Z[m
[31m-6avEfORNGKTE/dwBCghNG5mJC8XhDsM7rAyTP9vTPB+Bfm550arTjsAk/qf+bCUM[m
[31m-6MZI2iYEuhdDOju1V7rSKQSbdnINSqck8ky3eEiY7ldKingw8y5lr1aEVwIDAQAB[m
[31m-AoGBANgB66sKMga2SKN5nQdHS3LDCkevCutu1OWM5ZcbB4Kej5kC57xsf+tzPtab[m
[31m-emeIVGhCPOAALqB4YcT+QtMX967oM1MjcFbtH7si5oq6UYyp3i0G9Si6jIoVHz3+[m
[31m-8yOUaqwKbK+bRX8VS0YsHZmBsPK5ryN50iUwsU08nemoA94BAkEA9GS9Q5OPeFkM[m
[31m-tFxsIQ1f2FSsZAuN/1cpZgJqY+YaAN7MSPGTWyfd7nWG/Zgk3GO9/2ihh4gww+7B[m
[31m-To09GkmW4QJBAPQOHC2V+t2TA98+6Lj6+TYwcGEkhOENfVpH25mQ+kXgF/1Bd6rA[m
[31m-nosT1bdAY+SnmWXbSw6Kv5C20Em+bEX8WjcCQCSRRjhsRdVODbaW9Z7kb2jhEoJN[m
[31m-sEt6cTlQNzcHYPCsZYisjM3g4zYg47fiIfHQAsfKkhDDcfh/KvFj9LaQOEECQQCH[m
[31m-eBWYEDpSJ7rsfqT7mQQgWj7nDThdG/nK1TxGP71McBmg0Gg2dfkLRhVJRQqt74Is[m
[31m-kc9V4Rp4n6F6baL4Lh19AkEA6pZZer0kg3Kv9hjhaITIKUYdfIp9vYnDRWbQlBmR[m
[31m-atV8V9u9q2ETZvqfHpN+9Lu6NYR4yXIEIRf1bnIZ/mr9eQ==[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 42d7a9b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,1252 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 4);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad user[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "user_not_found",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            db:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: Access denied for user 'user_not_found'@'localhost' (using password: YES): 1045 28000[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bad host[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "host-not-found.org",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            db:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^failed to connect: failed to connect: host-not-found.org could not be resolved(?: \(3: Host not found\))?: nil nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 7[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: connected[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver())[m
[31m-[m
[31m-            db:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-connected to mysql \d\.\S+[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: send query w/o result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: \{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]\}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: send bad query[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("bad SQL")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 12 bytes\.[m
[31m-bad result: You have an error in your SQL syntax; check the manual that corresponds to your (?:MySQL|MariaDB) server version for the right syntax to use near 'bad SQL' at line 1: 1064: 42000\.$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: select query with an non-empty result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [{"id":"1","name":"Bob"},{"id":"2","name":""},{"id":"3","name":null}][m
[31m-result: [{"id":"3","name":null},{"id":"2","name":""},{"id":"1","name":"Bob"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: select query with an empty result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-result: [][m
[31m-result: [][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: numerical types[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists foo")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table foo dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table foo (id serial primary key, bar tinyint, baz smallint, bah float, blah double, kah bigint, hah mediumint, haha year, lah int)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table foo created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into foo (bar, baz, bah, blah, kah, hah, haha, lah) value (3, 4, 3.14, 5.16, 65535, 256, 1998, 579),(null, null, null, null, null, null, null, null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table foo (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from foo order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select * from foo order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table foo dropped.[m
[31m-table foo created.[m
[31m-2 rows inserted into table foo (last id: 1)[m
[31m-result: [{"bah":3.14,"bar":3,"baz":4,"blah":5.16,"hah":256,"haha":1998,"id":"1","kah":"65535","lah":579},{"bah":null,"bar":null,"baz":null,"blah":null,"hah":null,"haha":null,"id":"2","kah":null,"lah":null}][m
[31m-result: [{"bah":null,"bar":null,"baz":null,"blah":null,"hah":null,"haha":null,"id":"2","kah":null,"lah":null},{"bah":3.14,"bar":3,"baz":4,"blah":5.16,"hah":256,"haha":1998,"id":"1","kah":"65535","lah":579}][m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multiple DDL statements[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate =[m
[31m-                db:query("drop table if exists foo; "[m
[31m-                         .. "create table foo (id serial primary key, name text);")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from foo order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            else[m
[31m-                ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-            end[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            else[m
[31m-                ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-            end[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from foo order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            else[m
[31m-                ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-result: {"affected_rows":0,"insert_id":0,"server_status":10,"warning_count":0}, err:again[m
[31m-bad result: failed to send query: cannot send query in the current context: 2: nil: nil.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: multiple select queries[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate =[m
[31m-                db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("create table cats "[m
[31m-                         .. "(id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("insert into cats (name) "[m
[31m-                         .. "values (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows .. " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc; "[m
[31m-                         .. "select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [{"id":"1","name":"Bob"},{"id":"2","name":""},{"id":"3","name":null}], err:again[m
[31m-result: [{"id":"3","name":null},{"id":"2","name":""},{"id":"1","name":"Bob"}], err:nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set_keepalive in the wrong state[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate =[m
[31m-                db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("create table cats "[m
[31m-                         .. "(id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("insert into cats (name) "[m
[31m-                         .. "values (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows .. " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc; "[m
[31m-                         .. "select * from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [{"id":"1","name":"Bob"},{"id":"2","name":""},{"id":"3","name":null}], err:again[m
[31m-failed to set keepalive: cannot be reused in the current connection state: 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set keepalive (tcp)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc;")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql: [02][m
[31m-connected to mysql: [13][m
[31m-result: \[\{"id":"1","name":"Bob"\},\{"id":"2","name":""\},\{"id":"3","name":null\}\], err:nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/lua tcp socket keepalive create connection pool for key "ngx_test:ngx_test:[^\s:]+:\d+"/[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: send query w/o result set (unix domain socket)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: (?:\{"insert_id":0,"server_status":2,"warning_count":1,"affected_rows":0}|{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]\})$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: null at the beginning of a row[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:query("drop table if exists cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats dropped.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("table cats created.")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")")[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id asc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            res, err, errno, sqlstate = db:query("select name from cats order by id desc")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected to mysql.[m
[31m-table cats dropped.[m
[31m-table cats created.[m
[31m-3 rows inserted into table cats (last id: 1)[m
[31m-result: [{"name":"Bob"},{"name":""},{"name":null}][m
[31m-result: [{"name":null},{"name":""},{"name":"Bob"}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set keepalive (uds)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc;")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql: [02][m
[31m-connected to mysql: [13][m
[31m-result: \[\{"id":"1","name":"Bob"\},\{"id":"2","name":""\},\{"id":"3","name":null\}\], err:nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/lua tcp socket keepalive create connection pool for key "ngx_test:ngx_test:[^\s:]+"/[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set keepalive (explicit pool name)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                pool = "my_pool"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                pool = "my_pool"})[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select * from cats order by id asc;")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql: [02][m
[31m-connected to mysql: [13][m
[31m-result: \[\{"id":"1","name":"Bob"\},\{"id":"2","name":""\},\{"id":"3","name":null\}\], err:nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/lua tcp socket keepalive create connection pool for key "my_pool"/[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: the mysql newdecimal type[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                path = "$TEST_NGINX_MYSQL_PATH",[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                pool = "my_pool"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                pool = "my_pool"})[m
[31m-[m
[31m-            ngx.say("connected to mysql: ", db:get_reused_times())[m
[31m-[m
[31m-            res, err, errno, sqlstate =[m
[31m-                db:query("select sum(id) from cats")[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("result: ", ljson.encode(res), ", err:", err)[m
[31m-[m
[31m-            local ok, err = db:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql: [02][m
[31m-connected to mysql: [13][m
[31m-result: \[\{"sum\(id\)":6\}\], err:nil$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/lua tcp socket keepalive create connection pool for key "my_pool"/[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: large insert_id exceeding a 32-bit integer value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require("resty.mysql")[m
[31m-            local create_sql = [[[m
[31m-                CREATE TABLE `large_t` ([m
[31m-                    `id` bigint(11) NOT NULL AUTO_INCREMENT,[m
[31m-                    PRIMARY KEY (`id`)[m
[31m-                ) AUTO_INCREMENT=5000000312;[m
[31m-            ]][m
[31m-            local drop_sql = [[[m
[31m-                DROP TABLE IF EXISTS `large_t`;[m
[31m-            ]][m
[31m-            local insert_sql = [[[m
[31m-                INSERT INTO `large_t` VALUES(NULL);[m
[31m-            ]][m
[31m-            local db, err = mysql:new()[m
[31m-            if not db then[m
[31m-                ngx.say("failed to instantiate mysql: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            db:set_timeout(1000)[m
[31m-            local ok, err = db:connect{[m
[31m-                                       host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                                       port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                                       database="ngx_test",[m
[31m-                                       user="ngx_test",[m
[31m-                                       password="ngx_test"}[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-            local res, err = db:query(drop_sql)[m
[31m-            if not res then[m
[31m-                ngx.say("drop table error:" .. err)[m
[31m-                return[m
[31m-            end[m
[31m-            local res, err = db:query(create_sql)[m
[31m-            if not res then[m
[31m-                ngx.say("create table error:" .. err)[m
[31m-                return[m
[31m-            end[m
[31m-            local res, err = db:query(insert_sql)[m
[31m-            if not res then[m
[31m-                ngx.say("insert table error:" .. err)[m
[31m-                return[m
[31m-            else[m
[31m-                ngx.say(res.insert_id)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-5000000312[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/ssl.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/ssl.t[m
[1mdeleted file mode 100644[m
[1mindex 4b55b5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/ssl.t[m
[1m+++ /dev/null[m
[36m@@ -1,211 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: send query w/o result set[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(4000) -- 4 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                ssl = true,[m
[31m-            })[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: \{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]\}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: send query w/o result set (verify)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_ssl_trusted_certificate ../../data/test.crt;  # assuming used by the MySQL server[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(4000) -- 4 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                ssl = true,[m
[31m-                ssl_verify = true,[m
[31m-            })[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected to mysql \d\.\S+\.[m
[31m-sent 30 bytes\.[m
[31m-result: \{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]\}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: send query w/o result set (verify, failed)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            db:set_timeout(4000) -- 4 sec[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "ngx_test",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test",[m
[31m-                ssl = true,[m
[31m-                ssl_verify = true,[m
[31m-            })[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected to mysql ", db:server_ver(), ".")[m
[31m-[m
[31m-            local bytes, err = db:send_query("drop table if exists cats")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send query: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sent ", bytes, " bytes.")[m
[31m-[m
[31m-            local res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            end[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-            ngx.say("result: ", ljson.encode(res))[m
[31m-[m
[31m-            local ok, err = db:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: failed to do ssl handshake: 18: self signed certificate: nil nil[m
[31m---- error_log[m
[31m-lua ssl certificate verify error: (18: self signed certificate)[m
[31m---- timeout: 5[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex 0e767d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            ngx.say(mysql._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/world.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/world.t[m
[1mdeleted file mode 100644[m
[1mindex a8eb8d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/t/world.t[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    resolver \$TEST_NGINX_RESOLVER;[m
[31m-    lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test an old bug in table.new() on i386 in luajit v2.1[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            -- jit.off()[m
[31m-            local mysql = require "resty.mysql"[m
[31m-            local db = mysql:new()[m
[31m-[m
[31m-            local ok, err, errno, sqlstate = db:connect({[m
[31m-                host = "$TEST_NGINX_MYSQL_HOST",[m
[31m-                port = $TEST_NGINX_MYSQL_PORT,[m
[31m-                database = "world",[m
[31m-                user = "ngx_test",[m
[31m-                password = "ngx_test"})[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            local res, err, errno, sqlstate[m
[31m-            for j = 1, 10 do[m
[31m-                res, err, errno, sqlstate = db:query("select * from City order by ID limit 50", 50)[m
[31m-                if not res then[m
[31m-                    ngx.log(ngx.ERR, "bad result #1: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                    return ngx.exit(500)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for _, row in ipairs(res) do[m
[31m-                local ncols = 0[m
[31m-                for k, v in pairs(row) do[m
[31m-                    ncols = ncols + 1[m
[31m-                end[m
[31m-                ngx.say("ncols: ", ncols)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = db:set_keepalive(10000, 50)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set keepalive: ", err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"ncols: 5\n" x 50[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex ee195dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-mysql-0.16/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,549 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex c1cf553..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-*.t_[m
[31m-tags[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 9b5a448..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,68 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-services:[m
[31m- - redis-server[m
[31m-[m
[31m-cache:[m
[31m-  directories:[m
[31m-  - download-cache[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - JOBS=3[m
[31m-    - NGX_BUILD_JOBS=$JOBS[m
[31m-    - LUAJIT_PREFIX=/opt/luajit21[m
[31m-    - LUAJIT_LIB=$LUAJIT_PREFIX/lib[m
[31m-    - LUAJIT_INC=$LUAJIT_PREFIX/include/luajit-2.1[m
[31m-    - LUA_INCLUDE_DIR=$LUAJIT_INC[m
[31m-    - LUA_CMODULE_DIR=/lib[m
[31m-    - OPENSSL_PREFIX=/opt/ssl[m
[31m-    - OPENSSL_LIB=$OPENSSL_PREFIX/lib[m
[31m-    - OPENSSL_INC=$OPENSSL_PREFIX/include[m
[31m-    - OPENSSL_VER=1.0.2h[m
[31m-    - LD_LIBRARY_PATH=$LUAJIT_LIB:$LD_LIBRARY_PATH[m
[31m-    - TEST_NGINX_SLEEP=0.006[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-#    - NGINX_VERSION=1.10.0[m
[31m-[m
[31m-install:[m
[31m-  - if [ ! -d download-cache ]; then mkdir download-cache; fi[m
[31m-  - if [ ! -f download-cache/openssl-$OPENSSL_VER.tar.gz ]; then wget -O download-cache/openssl-$OPENSSL_VER.tar.gz https://www.openssl.org/source/openssl-$OPENSSL_VER.tar.gz; fi[m
[31m-  - sudo apt-get install -qq -y cpanminus axel[m
[31m-  - sudo cpanm --notest Test::Nginx > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz[m
[31m-  - git clone https://github.com/openresty/openresty.git ../openresty[m
[31m-  - git clone https://github.com/openresty/nginx-devel-utils.git[m
[31m-  - git clone https://github.com/openresty/lua-cjson.git[m
[31m-  - git clone https://github.com/openresty/lua-nginx-module.git ../lua-nginx-module[m
[31m-  - git clone https://github.com/openresty/echo-nginx-module.git ../echo-nginx-module[m
[31m-  - git clone https://github.com/openresty/no-pool-nginx.git ../no-pool-nginx[m
[31m-  - git clone -b v2.1-agentzh https://github.com/openresty/luajit2.git[m
[31m-[m
[31m-script:[m
[31m-  - cd luajit2/[m
[31m-  - make -j$JOBS CCDEBUG=-g Q= PREFIX=$LUAJIT_PREFIX CC=$CC XCFLAGS='-DLUA_USE_APICHECK -DLUA_USE_ASSERT' > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make install PREFIX=$LUAJIT_PREFIX > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ../lua-cjson && make && sudo PATH=$PATH make install && cd ..[m
[31m-  - tar zxf download-cache/openssl-$OPENSSL_VER.tar.gz[m
[31m-  - cd openssl-$OPENSSL_VER/[m
[31m-  - ./config shared --prefix=$OPENSSL_PREFIX -DPURIFY > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make PATH=$PATH install_sw > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - export PATH=$PWD/work/nginx/sbin:$PWD/nginx-devel-utils:$PATH[m
[31m-  - export NGX_BUILD_CC=$CC[m
[31m-  - ngx-build $NGINX_VERSION --with-ipv6 --with-http_realip_module --with-http_ssl_module --add-module=../echo-nginx-module --add-module=../lua-nginx-module --with-debug[m
[31m-  - nginx -V[m
[31m-  - ldd `which nginx`|grep -E 'luajit|ssl|pcre'[m
[31m-  - prove -r t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f42cae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty-debug[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/lib/resty/redis.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/lib/resty/redis.lua[m
[1mdeleted file mode 100644[m
[1mindex e44bd1b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/lib/resty/redis.lua[m
[1m+++ /dev/null[m
[36m@@ -1,468 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-local sub = string.sub[m
[31m-local byte = string.byte[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local null = ngx.null[m
[31m-local type = type[m
[31m-local pairs = pairs[m
[31m-local unpack = unpack[m
[31m-local setmetatable = setmetatable[m
[31m-local tonumber = tonumber[m
[31m-local tostring = tostring[m
[31m---local error = error[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok or type(new_tab) ~= "function" then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 155)[m
[31m-_M._VERSION = '0.24'[m
[31m-[m
[31m-[m
[31m-local commands = {[m
[31m-    "append",            "auth",              "bgrewriteaof",[m
[31m-    "bgsave",            "bitcount",          "bitop",[m
[31m-    "blpop",             "brpop",[m
[31m-    "brpoplpush",        "client",            "config",[m
[31m-    "dbsize",[m
[31m-    "debug",             "decr",              "decrby",[m
[31m-    "del",               "discard",           "dump",[m
[31m-    "echo",[m
[31m-    "eval",              "exec",              "exists",[m
[31m-    "expire",            "expireat",          "flushall",[m
[31m-    "flushdb",           "get",               "getbit",[m
[31m-    "getrange",          "getset",            "hdel",[m
[31m-    "hexists",           "hget",              "hgetall",[m
[31m-    "hincrby",           "hincrbyfloat",      "hkeys",[m
[31m-    "hlen",[m
[31m-    "hmget",             --[[ "hmset", ]]     "hscan",[m
[31m-    "hset",[m
[31m-    "hsetnx",            "hvals",             "incr",[m
[31m-    "incrby",            "incrbyfloat",       "info",[m
[31m-    "keys",[m
[31m-    "lastsave",          "lindex",            "linsert",[m
[31m-    "llen",              "lpop",              "lpush",[m
[31m-    "lpushx",            "lrange",            "lrem",[m
[31m-    "lset",              "ltrim",             "mget",[m
[31m-    "migrate",[m
[31m-    "monitor",           "move",              "mset",[m
[31m-    "msetnx",            "multi",             "object",[m
[31m-    "persist",           "pexpire",           "pexpireat",[m
[31m-    "ping",              "psetex",       --[[ "psubscribe", ]][m
[31m-    "pttl",[m
[31m-    "publish",      --[[ "punsubscribe", ]]   "pubsub",[m
[31m-    "quit",[m
[31m-    "randomkey",         "rename",            "renamenx",[m
[31m-    "restore",[m
[31m-    "rpop",              "rpoplpush",         "rpush",[m
[31m-    "rpushx",            "sadd",              "save",[m
[31m-    "scan",              "scard",             "script",[m
[31m-    "sdiff",             "sdiffstore",[m
[31m-    "select",            "set",               "setbit",[m
[31m-    "setex",             "setnx",             "setrange",[m
[31m-    "shutdown",          "sinter",            "sinterstore",[m
[31m-    "sismember",         "slaveof",           "slowlog",[m
[31m-    "smembers",          "smove",             "sort",[m
[31m-    "spop",              "srandmember",       "srem",[m
[31m-    "sscan",[m
[31m-    "strlen",       --[[ "subscribe", ]]      "sunion",[m
[31m-    "sunionstore",       "sync",              "time",[m
[31m-    "ttl",[m
[31m-    "type",         --[[ "unsubscribe", ]]    "unwatch",[m
[31m-    "watch",             "zadd",              "zcard",[m
[31m-    "zcount",            "zincrby",           "zinterstore",[m
[31m-    "zrange",            "zrangebyscore",     "zrank",[m
[31m-    "zrem",              "zremrangebyrank",   "zremrangebyscore",[m
[31m-    "zrevrange",         "zrevrangebyscore",  "zrevrank",[m
[31m-    "zscan",[m
[31m-    "zscore",            "zunionstore",       "evalsha"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local sub_commands = {[m
[31m-    "subscribe", "psubscribe"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local unsub_commands = {[m
[31m-    "unsubscribe", "punsubscribe"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local sock, err = tcp()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-    return setmetatable({ sock = sock }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(timeout)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.connect(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    self.subscribed = nil[m
[31m-[m
[31m-    return sock:connect(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_keepalive(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if self.subscribed then[m
[31m-        return nil, "subscribed state"[m
[31m-    end[m
[31m-[m
[31m-    return sock:setkeepalive(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.get_reused_times(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:getreusedtimes()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function close(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:close()[m
[31m-end[m
[31m-_M.close = close[m
[31m-[m
[31m-[m
[31m-local function _read_reply(self, sock)[m
[31m-    local line, err = sock:receive()[m
[31m-    if not line then[m
[31m-        if err == "timeout" and not self.subscribed then[m
[31m-            sock:close()[m
[31m-        end[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local prefix = byte(line)[m
[31m-[m
[31m-    if prefix == 36 then    -- char '$'[m
[31m-        -- print("bulk reply")[m
[31m-[m
[31m-        local size = tonumber(sub(line, 2))[m
[31m-        if size < 0 then[m
[31m-            return null[m
[31m-        end[m
[31m-[m
[31m-        local data, err = sock:receive(size)[m
[31m-        if not data then[m
[31m-            if err == "timeout" then[m
[31m-                sock:close()[m
[31m-            end[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        local dummy, err = sock:receive(2) -- ignore CRLF[m
[31m-        if not dummy then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        return data[m
[31m-[m
[31m-    elseif prefix == 43 then    -- char '+'[m
[31m-        -- print("status reply")[m
[31m-[m
[31m-        return sub(line, 2)[m
[31m-[m
[31m-    elseif prefix == 42 then -- char '*'[m
[31m-        local n = tonumber(sub(line, 2))[m
[31m-[m
[31m-        -- print("multi-bulk reply: ", n)[m
[31m-        if n < 0 then[m
[31m-            return null[m
[31m-        end[m
[31m-[m
[31m-        local vals = new_tab(n, 0)[m
[31m-        local nvals = 0[m
[31m-        for i = 1, n do[m
[31m-            local res, err = _read_reply(self, sock)[m
[31m-            if res then[m
[31m-                nvals = nvals + 1[m
[31m-                vals[nvals] = res[m
[31m-[m
[31m-            elseif res == nil then[m
[31m-                return nil, err[m
[31m-[m
[31m-            else[m
[31m-                -- be a valid redis error value[m
[31m-                nvals = nvals + 1[m
[31m-                vals[nvals] = {false, err}[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        return vals[m
[31m-[m
[31m-    elseif prefix == 58 then    -- char ':'[m
[31m-        -- print("integer reply")[m
[31m-        return tonumber(sub(line, 2))[m
[31m-[m
[31m-    elseif prefix == 45 then    -- char '-'[m
[31m-        -- print("error reply: ", n)[m
[31m-[m
[31m-        return false, sub(line, 2)[m
[31m-[m
[31m-    else[m
[31m-        -- when `line` is an empty string, `prefix` will be equal to nil.[m
[31m-        return nil, "unkown prefix: \"" .. tostring(prefix) .. "\""[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _gen_req(args)[m
[31m-    local nargs = #args[m
[31m-[m
[31m-    local req = new_tab(nargs * 5 + 1, 0)[m
[31m-    req[1] = "*" .. nargs .. "\r\n"[m
[31m-    local nbits = 2[m
[31m-[m
[31m-    for i = 1, nargs do[m
[31m-        local arg = args[i][m
[31m-        if type(arg) ~= "string" then[m
[31m-            arg = tostring(arg)[m
[31m-        end[m
[31m-[m
[31m-        req[nbits] = "$"[m
[31m-        req[nbits + 1] = #arg[m
[31m-        req[nbits + 2] = "\r\n"[m
[31m-        req[nbits + 3] = arg[m
[31m-        req[nbits + 4] = "\r\n"[m
[31m-[m
[31m-        nbits = nbits + 5[m
[31m-    end[m
[31m-[m
[31m-    -- it is much faster to do string concatenation on the C land[m
[31m-    -- in real world (large number of strings in the Lua VM)[m
[31m-    return req[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _do_cmd(self, ...)[m
[31m-    local args = {...}[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local req = _gen_req(args)[m
[31m-[m
[31m-    local reqs = self._reqs[m
[31m-    if reqs then[m
[31m-        reqs[#reqs + 1] = req[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    -- print("request: ", table.concat(req))[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return _read_reply(self, sock)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function _check_subscribed(self, res)[m
[31m-    if type(res) == "table"[m
[31m-       and (res[1] == "unsubscribe" or res[1] == "punsubscribe")[m
[31m-       and res[3] == 0[m
[31m-   then[m
[31m-        self.subscribed = nil[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.read_reply(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if not self.subscribed then[m
[31m-        return nil, "not subscribed"[m
[31m-    end[m
[31m-[m
[31m-    local res, err = _read_reply(self, sock)[m
[31m-    _check_subscribed(self, res)[m
[31m-[m
[31m-    return res, err[m
[31m-end[m
[31m-[m
[31m-[m
[31m-for i = 1, #commands do[m
[31m-    local cmd = commands[i][m
[31m-[m
[31m-    _M[cmd] =[m
[31m-        function (self, ...)[m
[31m-            return _do_cmd(self, cmd, ...)[m
[31m-        end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-for i = 1, #sub_commands do[m
[31m-    local cmd = sub_commands[i][m
[31m-[m
[31m-    _M[cmd] =[m
[31m-        function (self, ...)[m
[31m-            self.subscribed = true[m
[31m-            return _do_cmd(self, cmd, ...)[m
[31m-        end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-for i = 1, #unsub_commands do[m
[31m-    local cmd = unsub_commands[i][m
[31m-[m
[31m-    _M[cmd] =[m
[31m-        function (self, ...)[m
[31m-            local res, err = _do_cmd(self, cmd, ...)[m
[31m-            _check_subscribed(self, res)[m
[31m-            return res, err[m
[31m-        end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.hmset(self, hashname, ...)[m
[31m-    local args = {...}[m
[31m-    if #args == 1 then[m
[31m-        local t = args[1][m
[31m-[m
[31m-        local n = 0[m
[31m-        for k, v in pairs(t) do[m
[31m-            n = n + 2[m
[31m-        end[m
[31m-[m
[31m-        local array = new_tab(n, 0)[m
[31m-[m
[31m-        local i = 0[m
[31m-        for k, v in pairs(t) do[m
[31m-            array[i + 1] = k[m
[31m-            array[i + 2] = v[m
[31m-            i = i + 2[m
[31m-        end[m
[31m-        -- print("key", hashname)[m
[31m-        return _do_cmd(self, "hmset", hashname, unpack(array))[m
[31m-    end[m
[31m-[m
[31m-    -- backwards compatibility[m
[31m-    return _do_cmd(self, "hmset", hashname, ...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.init_pipeline(self, n)[m
[31m-    self._reqs = new_tab(n or 4, 0)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.cancel_pipeline(self)[m
[31m-    self._reqs = nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.commit_pipeline(self)[m
[31m-    local reqs = self._reqs[m
[31m-    if not reqs then[m
[31m-        return nil, "no pipeline"[m
[31m-    end[m
[31m-[m
[31m-    self._reqs = nil[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(reqs)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local nvals = 0[m
[31m-    local nreqs = #reqs[m
[31m-    local vals = new_tab(nreqs, 0)[m
[31m-    for i = 1, nreqs do[m
[31m-        local res, err = _read_reply(self, sock)[m
[31m-        if res then[m
[31m-            nvals = nvals + 1[m
[31m-            vals[nvals] = res[m
[31m-[m
[31m-        elseif res == nil then[m
[31m-            if err == "timeout" then[m
[31m-                close(self)[m
[31m-            end[m
[31m-            return nil, err[m
[31m-[m
[31m-        else[m
[31m-            -- be a valid redis error value[m
[31m-            nvals = nvals + 1[m
[31m-            vals[nvals] = {false, err}[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return vals[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.array_to_hash(self, t)[m
[31m-    local n = #t[m
[31m-    -- print("n = ", n)[m
[31m-    local h = new_tab(0, n / 2)[m
[31m-    for i = 1, n, 2 do[m
[31m-        h[t[i]] = t[i + 1][m
[31m-    end[m
[31m-    return h[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.add_commands(...)[m
[31m-    local cmds = {...}[m
[31m-    for i = 1, #cmds do[m
[31m-        local cmd = cmds[i][m
[31m-        _M[cmd] =[m
[31m-            function (self, ...)[m
[31m-                return _do_cmd(self, cmd, ...)[m
[31m-            end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 58453ba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-my $HtmlDir = html_dir;[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$HtmlDir/?.lua;$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: github issue #108: ngx.locaiton.capture + redis.set_keepalive[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /r1 {[m
[31m-        default_type text/html;[m
[31m-        set $port $TEST_NGINX_REDIS_PORT;[m
[31m-        #lua_code_cache off;[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua_file html/r1.lua;[m
[31m-    }[m
[31m-[m
[31m-    location /r2 {[m
[31m-        default_type text/html;[m
[31m-        set $port $TEST_NGINX_REDIS_PORT;[m
[31m-        #lua_code_cache off;[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua_file html/r2.lua;[m
[31m-    }[m
[31m-[m
[31m-    location /anyurl {[m
[31m-        internal;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/dummy;[m
[31m-    }[m
[31m-[m
[31m-    location = /dummy {[m
[31m-        echo dummy;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> r1.lua[m
[31m-local redis = require "resty.redis"[m
[31m-local red = redis:new()[m
[31m-local ok, err = red:connect("127.0.0.1", ngx.var.port)[m
[31m-if not ok then[m
[31m-    ngx.say("failed to connect: ", err)[m
[31m-    return[m
[31m-end[m
[31m-local ok, err = red:flushall()[m
[31m-if not ok then[m
[31m-    ngx.say("failed to flushall: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ok, err = red:set_keepalive()[m
[31m-if not ok then[m
[31m-    ngx.say("failed to set keepalive: ", err)[m
[31m-    return[m
[31m-end[m
[31m-local http_ress = ngx.location.capture("/r2") -- 1[m
[31m-ngx.say("ok")[m
[31m-[m
[31m->>> r2.lua[m
[31m-local redis = require "resty.redis"[m
[31m-local red = redis:new()[m
[31m-local ok, err = red:connect("127.0.0.1", ngx.var.port) --2[m
[31m-if not ok then[m
[31m-    ngx.say("failed to connect: ", err)[m
[31m-    return[m
[31m-end[m
[31m-local res = ngx.location.capture("/anyurl") --3[m
[31m---- request[m
[31m-    GET /r1[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit(404) after I/O (ngx_lua github issue #110[m
[31m-https://github.com/chaoslawful/lua-nginx-module/issues/110[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    error_page 400 /400.html;[m
[31m-    error_page 404 /404.html;[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(2000) -- 2 sec[m
[31m-[m
[31m-            -- ngx.log(ngx.ERR, "hello");[m
[31m-[m
[31m-            -- or connect to a unix domain socket file listened[m
[31m-            -- by a redis server:[m
[31m-            --     local ok, err = red:connect("unix:/path/to/redis.sock")[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:set("dog", "an animal")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.say("set dog: ", res)[m
[31m-[m
[31m-            local res, err = red:get("dog")[m
[31m-            if err then[m
[31m-                ngx.log(ngx.ERR, "failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "dog not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.say("dog: ", res)[m
[31m-[m
[31m-            -- red:close()[m
[31m-            local ok, err = red:set_keepalive(0, 100)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-        echo Hello;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 400.html[m
[31m-Bad request, dear...[m
[31m->>> 404.html[m
[31m-Not found, dear...[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-Not found, dear...[m
[31m---- error_code: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set and get an empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            -- or connect to a unix domain socket file listened[m
[31m-            -- by a redis server:[m
[31m-            --     local ok, err = red:connect("unix:/path/to/redis.sock")[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:set("dog", "")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set dog: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, err = red:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res)[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-set dog: OK[m
[31m-dog: [m
[31m-dog: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exec() after red:get()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:get("dog")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.exec("/hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /hello {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/count.t[m
[1mdeleted file mode 100644[m
[1mindex 17ebfba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/count.t[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module size of resty.redis[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            n = 0[m
[31m-            for _, _ in pairs(redis) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-size: 155[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/hmset.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/hmset.t[m
[1mdeleted file mode 100644[m
[1mindex 1a76211..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/hmset.t[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hmset key-pairs[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:hmset("animals", "dog", "bark", "cat", "meow")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hmset animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hmget("animals", "dog", "cat")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmget animals: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hmset animals: OK[m
[31m-hmget animals: barkmeow[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: hmset lua tables[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local t = { dog = "bark", cat = "meow", cow = "moo" }[m
[31m-            local res, err = red:hmset("animals", t)[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hmset animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hmget("animals", "dog", "cat", "cow")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmget animals: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hmset animals: OK[m
[31m-hmget animals: barkmeowmoo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: hmset a single scalar[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:hmset("animals", "cat")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hmset animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hmget("animals", "cat")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmget animals: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-table expected, got string[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/mock.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/mock.t[m
[1mdeleted file mode 100644[m
[1mindex d8c578f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/mock.t[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: continue using the obj when read timeout happens[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", 1921);[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            red:set_timeout(100) -- 0.1 sec[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local data, err = red:get("foo")[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to get: ", err)[m
[31m-                else[m
[31m-                    ngx.say("get: ", data);[m
[31m-                end[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- tcp_listen: 1921[m
[31m---- tcp_query eval[m
[31m-"*2\r[m
[31m-\$3\r[m
[31m-get\r[m
[31m-\$3\r[m
[31m-foo\r[m
[31m-"[m
[31m---- tcp_reply eval[m
[31m-"\$5\r\nhello\r\n"[m
[31m---- tcp_reply_delay: 150ms[m
[31m---- response_body[m
[31m-failed to get: timeout[m
[31m-failed to get: closed[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/pipeline.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/pipeline.t[m
[1mdeleted file mode 100644[m
[1mindex e37b9bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/pipeline.t[m
[1m+++ /dev/null[m
[36m@@ -1,329 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                red:init_pipeline()[m
[31m-[m
[31m-                red:set("dog", "an animal")[m
[31m-                red:get("dog")[m
[31m-                red:set("dog", "hello")[m
[31m-                red:get("dog")[m
[31m-[m
[31m-                local results = red:commit_pipeline()[m
[31m-                local cjson = require "cjson"[m
[31m-                ngx.say(cjson.encode(results))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-["OK","an animal","OK","hello"][m
[31m-["OK","an animal","OK","hello"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cancel automatically[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            red:init_pipeline()[m
[31m-[m
[31m-            red:set("dog", "an animal")[m
[31m-            red:get("dog")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                red:init_pipeline()[m
[31m-[m
[31m-                red:set("dog", "an animal")[m
[31m-                red:get("dog")[m
[31m-                red:set("dog", "hello")[m
[31m-                red:get("dog")[m
[31m-[m
[31m-                local results = red:commit_pipeline()[m
[31m-                local cjson = require "cjson"[m
[31m-                ngx.say(cjson.encode(results))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-["OK","an animal","OK","hello"][m
[31m-["OK","an animal","OK","hello"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cancel explicitly[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            red:init_pipeline()[m
[31m-[m
[31m-            red:set("dog", "an animal")[m
[31m-            red:get("dog")[m
[31m-[m
[31m-            red:cancel_pipeline()[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                red:init_pipeline()[m
[31m-[m
[31m-                red:set("dog", "an animal")[m
[31m-                red:get("dog")[m
[31m-                red:set("dog", "hello")[m
[31m-                red:get("dog")[m
[31m-[m
[31m-                local results = red:commit_pipeline()[m
[31m-                local cjson = require "cjson"[m
[31m-                ngx.say(cjson.encode(results))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-["OK","an animal","OK","hello"][m
[31m-["OK","an animal","OK","hello"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: mixed[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:set("dog", "an aniaml")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set result: ", res)[m
[31m-[m
[31m-            local res, err = red:get("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if res == ngx.null then[m
[31m-                ngx.say("dog not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("dog: ", res)[m
[31m-[m
[31m-            red:init_pipeline()[m
[31m-            red:set("cat", "Marry")[m
[31m-            red:set("horse", "Bob")[m
[31m-            red:get("cat")[m
[31m-            red:get("horse")[m
[31m-            local results, err = red:commit_pipeline()[m
[31m-            if not results then[m
[31m-                ngx.say("failed to commit the pipelined requests: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i, res in ipairs(results) do[m
[31m-                if type(res) == "table" then[m
[31m-                    if res[1] == false then[m
[31m-                        ngx.say("failed to run command ", i, ": ", res[2])[m
[31m-                    else[m
[31m-                        ngx.say("cmd ", i, ": ", res)[m
[31m-                    end[m
[31m-                else[m
[31m-                    -- process the scalar value[m
[31m-                    ngx.say("cmd ", i, ": ", res)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            -- put it into the connection pool of size 100,[m
[31m-            -- with 0 idle timeout[m
[31m-            local ok, err = red:set_keepalive(0, 100)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- or just close the connection right away:[m
[31m-            -- local ok, err = red:close()[m
[31m-            -- if not ok then[m
[31m-            --     ngx.say("failed to close: ", err)[m
[31m-            --     return[m
[31m-            -- end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-set result: OK[m
[31m-dog: an aniaml[m
[31m-cmd 1: OK[m
[31m-cmd 2: OK[m
[31m-cmd 3: Marry[m
[31m-cmd 4: Bob[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: redis return error in pipeline[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:del("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to del dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            red:init_pipeline()[m
[31m-            red:hkeys("dog")[m
[31m-            red:set("dog", "an animal")[m
[31m-            red:hkeys("dog")[m
[31m-            red:get("dog")[m
[31m-            local results, err = red:commit_pipeline()[m
[31m-            if not results then[m
[31m-                ngx.say("failed to commit the pipelined requests: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i, res in ipairs(results) do[m
[31m-                if type(res) == "table" then[m
[31m-                    if res[1] == false then[m
[31m-                        ngx.say("failed to run command ", i, ": ", res[2])[m
[31m-                    else[m
[31m-                        ngx.say("cmd ", i, ": ", res)[m
[31m-                    end[m
[31m-                else[m
[31m-                    -- process the scalar value[m
[31m-                    ngx.say("cmd ", i, ": ", res)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            -- put it into the connection pool of size 100,[m
[31m-            -- with 0 idle timeout[m
[31m-            local ok, err = red:set_keepalive(0, 100)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-cmd 1: [m
[31m-cmd 2: OK[m
[31m-failed to run command 3: WRONGTYPE Operation against a key holding the wrong kind of value[m
[31m-cmd 4: an animal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/pubsub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/pubsub.t[m
[1mdeleted file mode 100644[m
[1mindex 54f4e9b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/pubsub.t[m
[1m+++ /dev/null[m
[36m@@ -1,559 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single channel[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red2:publish("dog", "Hello")[m
[31m-            if not res then[m
[31m-                ngx.say("2: failed to publish: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: publish: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: receive: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-2: publish: 1[m
[31m-1: receive: ["message","dog","Hello"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: single channel (retry read_reply() after timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            red:set_timeout(1)[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:read_reply()[m
[31m-                if not res then[m
[31m-                    ngx.say("1: failed to read reply: ", err)[m
[31m-                    if err ~= "timeout" then[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-            red:set_timeout(1000)[m
[31m-[m
[31m-            res, err = red:unsubscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to unsubscribe: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: unsubscribe: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            res, err = red2:publish("dog", "Hello")[m
[31m-            if not res then[m
[31m-                ngx.say("2: failed to publish: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: publish: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:unsubscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to unsubscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: unsubscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: failed to read reply: timeout[m
[31m-1: failed to read reply: timeout[m
[31m-1: unsubscribe: ["unsubscribe","dog",0][m
[31m-2: publish: 0[m
[31m-1: failed to read reply: not subscribed[m
[31m-1: unsubscribe: ["unsubscribe","dog",0][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multiple channels[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_log_errors off;[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe dog: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:subscribe("cat")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe cat: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red2:publish("dog", "Hello")[m
[31m-            if not res then[m
[31m-                ngx.say("2: failed to publish: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: publish: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:set_timeout(10) -- 10ms[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-            red:set_timeout(1000) -- 1s[m
[31m-[m
[31m-            res, err = red:unsubscribe()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to unscribe: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: unsubscribe: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:set_timeout(10) -- 10ms[m
[31m-            res, err = red:read_reply()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to read reply: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: receive: ", cjson.encode(res))[m
[31m-            end[m
[31m-            red:set_timeout(1000) -- 1s[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^1: subscribe dog: \["subscribe","dog",1\][m
[31m-1: subscribe cat: \["subscribe","cat",2\][m
[31m-2: publish: 1[m
[31m-1: receive: \["message","dog","Hello"\][m
[31m-1: failed to read reply: timeout[m
[31m-1: unsubscribe: \["unsubscribe","(?:cat|dog)",1\][m
[31m-1: receive: \["unsubscribe","(?:dog|cat)",0\][m
[31m-1: failed to read reply: not subscribed$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: call subscribe after read_reply() times out[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            red:set_timeout(1)[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:read_reply()[m
[31m-                if not res then[m
[31m-                    ngx.say("1: failed to read reply: ", err)[m
[31m-                    if err ~= "timeout" then[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-            red:set_timeout(1000)[m
[31m-[m
[31m-            res, err = red:subscribe("cat")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe to cat: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: failed to read reply: timeout[m
[31m-1: failed to read reply: timeout[m
[31m-1: subscribe: ["subscribe","cat",2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: call set_keepalive in subscribed mode (previous read_reply calls timed out)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            red:set_timeout(1)[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:read_reply()[m
[31m-                if not res then[m
[31m-                    ngx.say("1: failed to read reply: ", err)[m
[31m-                    if err ~= "timeout" then[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-            red:set_timeout(1000)[m
[31m-[m
[31m-            res, err = red:set_keepalive()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to set keepalive: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: set keepalive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: failed to read reply: timeout[m
[31m-1: failed to read reply: timeout[m
[31m-1: failed to set keepalive: subscribed state[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: call set_keepalive in subscribed mode[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:set_keepalive()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to set keepalive: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: set keepalive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: failed to set keepalive: subscribed state[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: call set_keepalive in unsubscribed mode[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-            local red2 = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-            red2:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red2:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:subscribe("dog")[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to subscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:unsubscribe()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to unsubscribe: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: unsubscribe: ", cjson.encode(res))[m
[31m-[m
[31m-            res, err = red:set_keepalive()[m
[31m-            if not res then[m
[31m-                ngx.say("1: failed to set keepalive: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: set keepalive: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-            red2:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: subscribe: ["subscribe","dog",1][m
[31m-1: unsubscribe: ["unsubscribe","dog",0][m
[31m-1: set keepalive: 1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 90fe403..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,776 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set and get[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:select(1)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to select: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:set("dog", "an animal")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set dog: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, err = red:get("dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("dog: ", res)[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-set dog: OK[m
[31m-dog: an animal[m
[31m-dog: an animal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: flushall[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get nil bulk value[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:get("not_found")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if res == ngx.null then[m
[31m-                    ngx.say("not_found not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("get not_found: ", res)[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-not_found not found.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get nil list[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res, err = red:lrange("nokey", 0, 1)[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if res == ngx.null then[m
[31m-                    ngx.say("nokey not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("get nokey: ", #res, " (", type(res), ")")[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-get nokey: 0 (table)[m
[31m-get nokey: 0 (table)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: incr and decr[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:set("connections", 10)[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set connections: ", res)[m
[31m-[m
[31m-            res, err = red:incr("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("incr connections: ", res)[m
[31m-[m
[31m-            local res, err = red:get("connections")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:incr("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to incr connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("incr connections: ", res)[m
[31m-[m
[31m-            res, err = red:decr("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to decr connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("decr connections: ", res)[m
[31m-[m
[31m-            res, err = red:get("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("connections not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connections: ", res)[m
[31m-[m
[31m-            res, err = red:del("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to del connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("del connections: ", res)[m
[31m-[m
[31m-            res, err = red:incr("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set connections: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("incr connections: ", res)[m
[31m-[m
[31m-            res, err = red:get("connections")[m
[31m-            if not res then[m
[31m-                ngx.say("connections not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connections: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-set connections: OK[m
[31m-incr connections: 11[m
[31m-incr connections: 12[m
[31m-decr connections: 11[m
[31m-connections: 11[m
[31m-del connections: 1[m
[31m-incr connections: 1[m
[31m-connections: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad incr command format[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:incr("connections", 12)[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set connections: ", res, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("incr connections: ", res)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to set connections: false: ERR wrong number of arguments for 'incr' command[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: lpush and lrange[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            local res, err = red:lpush("mylist", "world")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to lpush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("lpush result: ", res)[m
[31m-[m
[31m-            res, err = red:lpush("mylist", "hello")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to lpush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("lpush result: ", res)[m
[31m-[m
[31m-            res, err = red:lrange("mylist", 0, -1)[m
[31m-            if not res then[m
[31m-                ngx.say("failed to lrange: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("lrange result: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-lpush result: 1[m
[31m-lpush result: 2[m
[31m-lrange result: ["hello","world"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: blpop expires its own timeout[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(2500) -- 2.5 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            local res, err = red:blpop("key", 1)[m
[31m-            if err then[m
[31m-                ngx.say("failed to blpop: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if res == ngx.null then[m
[31m-                ngx.say("no element popped.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("blpop result: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-no element popped.[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: blpop expires cosocket timeout[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:flushall()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to flushall: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("flushall: ", res)[m
[31m-[m
[31m-            red:set_timeout(200) -- 200 ms[m
[31m-[m
[31m-            local res, err = red:blpop("key", 1)[m
[31m-            if err then[m
[31m-                ngx.say("failed to blpop: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("no element popped.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say("blpop result: ", cjson.encode(res))[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-flushall: OK[m
[31m-failed to blpop: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set keepalive and get reused times[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local times = red:get_reused_times()[m
[31m-            ngx.say("reused times: ", times)[m
[31m-[m
[31m-            local ok, err = red:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            times = red:get_reused_times()[m
[31m-            ngx.say("reused times: ", times)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-reused times: 0[m
[31m-reused times: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: mget[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:flushall()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:set("dog", "an animal")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set dog: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set dog: ", res)[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res, err = red:mget("dog", "cat", "dog")[m
[31m-                if err then[m
[31m-                    ngx.say("failed to get dog: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not res then[m
[31m-                    ngx.say("dog not found.")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local cjson = require "cjson"[m
[31m-                ngx.say("res: ", cjson.encode(res))[m
[31m-            end[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-set dog: OK[m
[31m-res: ["an animal",null,"an animal"][m
[31m-res: ["an animal",null,"an animal"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: hmget array_to_hash[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:flushall()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to flush all: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:hmset("animals", { dog = "bark", cat = "meow", cow = "moo" })[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmset animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hmget("animals", "dog", "cat", "cow")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("hmget animals: ", res)[m
[31m-[m
[31m-            local res, err = red:hgetall("animals")[m
[31m-            if err then[m
[31m-                ngx.say("failed to get animals: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if not res then[m
[31m-                ngx.say("animals not found.")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local h = red:array_to_hash(res)[m
[31m-[m
[31m-            ngx.say("dog: ", h.dog)[m
[31m-            ngx.say("cat: ", h.cat)[m
[31m-            ngx.say("cow: ", h.cow)[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hmset animals: OK[m
[31m-hmget animals: barkmeowmoo[m
[31m-dog: bark[m
[31m-cat: meow[m
[31m-cow: moo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: boolean args[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = red:set("foo", true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:get("foo")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("foo: ", res, ", type: ", type(res))[m
[31m-[m
[31m-            ok, err = red:set("foo", false)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:get("foo")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("foo: ", res, ", type: ", type(res))[m
[31m-[m
[31m-            ok, err = red:set("foo", nil)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:get("foo")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to get: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("foo: ", res, ", type: ", type(res))[m
[31m-[m
[31m-            local ok, err = red:set_keepalive(10, 10)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set_keepalive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-foo: true, type: string[m
[31m-foo: false, type: string[m
[31m-failed to set: ERR wrong number of arguments for 'set' command[m
[31m-foo: false, type: string[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/transaction.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/transaction.t[m
[1mdeleted file mode 100644[m
[1mindex a62f4c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/transaction.t[m
[1m+++ /dev/null[m
[36m@@ -1,142 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local redis_key = "foo"[m
[31m-[m
[31m-            local ok, err = red:multi()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run multi: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("multi ans: ", cjson.encode(ok))[m
[31m-[m
[31m-            local ans, err = red:sort("log", "by", redis_key .. ":*->timestamp")[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to run sort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("sort ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            ans, err = red:exec()[m
[31m-[m
[31m-            ngx.say("exec ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            local ok, err = red:set_keepalive(0, 1024)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to put the current redis connection into pool: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-multi ans: "OK"[m
[31m-sort ans: "QUEUED"[m
[31m-exec ans: [{}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: redis cmd reference sample: redis does not halt on errors[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = red:multi()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run multi: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("multi ans: ", cjson.encode(ok))[m
[31m-[m
[31m-            local ans, err = red:set("a", "abc")[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to run sort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            local ans, err = red:lpop("a")[m
[31m-            if not ans then[m
[31m-                ngx.say("failed to run sort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("set ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            ans, err = red:exec()[m
[31m-[m
[31m-            ngx.say("exec ans: ", cjson.encode(ans))[m
[31m-[m
[31m-            red:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^multi ans: "OK"[m
[31m-set ans: "QUEUED"[m
[31m-set ans: "QUEUED"[m
[31m-exec ans: \["OK",\[false,"(?:ERR|WRONGTYPE) Operation against a key holding the wrong kind of value"\]\][m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/user-cmds.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/user-cmds.t[m
[1mdeleted file mode 100644[m
[1mindex dc7df0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/user-cmds.t[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single channel[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            local redis = require "resty.redis"[m
[31m-[m
[31m-            redis.add_commands("foo", "bar")[m
[31m-[m
[31m-            local red = redis:new()[m
[31m-[m
[31m-            red:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = red:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = red:foo("a")[m
[31m-            if not res then[m
[31m-                ngx.say("failed to foo: ", err)[m
[31m-            end[m
[31m-[m
[31m-            res, err = red:bar()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to bar: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to foo: ERR unknown command 'foo'[m
[31m-failed to bar: ERR unknown command 'bar'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex fd75ccf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local redis = require "resty.redis"[m
[31m-            ngx.say(redis._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 14d92de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-redis-0.24/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,462 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex cc9fc36..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/Makefile[m
[1mdeleted file mode 100644[m
[1mindex b5f8719..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/aes.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/aes.lua[m
[1mdeleted file mode 100644[m
[1mindex d20697d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/aes.lua[m
[1m+++ /dev/null[m
[36m@@ -1,238 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m---local asn1 = require "resty.asn1"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_gc = ffi.gc[m
[31m-local ffi_str = ffi.string[m
[31m-local ffi_copy = ffi.copy[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-local type = type[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef struct engine_st ENGINE;[m
[31m-[m
[31m-typedef struct evp_cipher_st EVP_CIPHER;[m
[31m-typedef struct evp_cipher_ctx_st[m
[31m-{[m
[31m-const EVP_CIPHER *cipher;[m
[31m-ENGINE *engine;[m
[31m-int encrypt;[m
[31m-int buf_len;[m
[31m-[m
[31m-unsigned char  oiv[16];[m
[31m-unsigned char  iv[16];[m
[31m-unsigned char buf[32];[m
[31m-int num;[m
[31m-[m
[31m-void *app_data;[m
[31m-int key_len;[m
[31m-unsigned long flags;[m
[31m-void *cipher_data;[m
[31m-int final_used;[m
[31m-int block_mask;[m
[31m-unsigned char final[32];[m
[31m-} EVP_CIPHER_CTX;[m
[31m-[m
[31m-typedef struct env_md_ctx_st EVP_MD_CTX;[m
[31m-typedef struct env_md_st EVP_MD;[m
[31m-[m
[31m-const EVP_MD *EVP_md5(void);[m
[31m-const EVP_MD *EVP_sha(void);[m
[31m-const EVP_MD *EVP_sha1(void);[m
[31m-const EVP_MD *EVP_sha224(void);[m
[31m-const EVP_MD *EVP_sha256(void);[m
[31m-const EVP_MD *EVP_sha384(void);[m
[31m-const EVP_MD *EVP_sha512(void);[m
[31m-[m
[31m-const EVP_CIPHER *EVP_aes_128_ecb(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_cbc(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_cfb1(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_cfb8(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_cfb128(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_ofb(void);[m
[31m-const EVP_CIPHER *EVP_aes_128_ctr(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_ecb(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_cbc(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_cfb1(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_cfb8(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_cfb128(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_ofb(void);[m
[31m-const EVP_CIPHER *EVP_aes_192_ctr(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_ecb(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_cbc(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_cfb1(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_cfb8(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_cfb128(void);[m
[31m-const EVP_CIPHER *EVP_aes_256_ofb(void);[m
[31m-[m
[31m-void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a);[m
[31m-int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);[m
[31m-[m
[31m-int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher,[m
[31m-        ENGINE *impl, unsigned char *key, const unsigned char *iv);[m
[31m-[m
[31m-int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,[m
[31m-        const unsigned char *in, int inl);[m
[31m-[m
[31m-int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);[m
[31m-[m
[31m-int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher,[m
[31m-        ENGINE *impl, unsigned char *key, const unsigned char *iv);[m
[31m-[m
[31m-int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,[m
[31m-        const unsigned char *in, int inl);[m
[31m-[m
[31m-int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);[m
[31m-[m
[31m-int EVP_BytesToKey(const EVP_CIPHER *type,const EVP_MD *md,[m
[31m-        const unsigned char *salt, const unsigned char *data, int datal,[m
[31m-        int count, unsigned char *key,unsigned char *iv);[m
[31m-]][m
[31m-[m
[31m-local ctx_ptr_type = ffi.typeof("EVP_CIPHER_CTX[1]")[m
[31m-[m
[31m-local hash[m
[31m-hash = {[m
[31m-    md5 = C.EVP_md5(),[m
[31m-    sha1 = C.EVP_sha1(),[m
[31m-    sha224 = C.EVP_sha224(),[m
[31m-    sha256 = C.EVP_sha256(),[m
[31m-    sha384 = C.EVP_sha384(),[m
[31m-    sha512 = C.EVP_sha512()[m
[31m-}[m
[31m-_M.hash = hash[m
[31m-[m
[31m-local cipher[m
[31m-cipher = function (size, _cipher)[m
[31m-    local _size = size or 128[m
[31m-    local _cipher = _cipher or "cbc"[m
[31m-    local func = "EVP_aes_" .. _size .. "_" .. _cipher[m
[31m-    if C[func] then[m
[31m-        return { size=_size, cipher=_cipher, method=C[func]()}[m
[31m-    else[m
[31m-        return nil[m
[31m-    end[m
[31m-end[m
[31m-_M.cipher = cipher[m
[31m-[m
[31m-function _M.new(self, key, salt, _cipher, _hash, hash_rounds)[m
[31m-    local encrypt_ctx = ffi_new(ctx_ptr_type)[m
[31m-    local decrypt_ctx = ffi_new(ctx_ptr_type)[m
[31m-    local _cipher = _cipher or cipher()[m
[31m-    local _hash = _hash or hash.md5[m
[31m-    local hash_rounds = hash_rounds or 1[m
[31m-    local _cipherLength = _cipher.size/8[m
[31m-    local gen_key = ffi_new("unsigned char[?]",_cipherLength)[m
[31m-    local gen_iv = ffi_new("unsigned char[?]",_cipherLength)[m
[31m-[m
[31m-    if type(_hash) == "table" then[m
[31m-        if not _hash.iv or #_hash.iv ~= 16 then[m
[31m-          return nil, "bad iv"[m
[31m-        end[m
[31m-[m
[31m-        if _hash.method then[m
[31m-            local tmp_key = _hash.method(key)[m
[31m-[m
[31m-            if #tmp_key ~= _cipherLength then[m
[31m-                return nil, "bad key length"[m
[31m-            end[m
[31m-[m
[31m-            ffi_copy(gen_key, tmp_key, _cipherLength)[m
[31m-[m
[31m-        elseif #key ~= _cipherLength then[m
[31m-            return nil, "bad key length"[m
[31m-[m
[31m-        else[m
[31m-            ffi_copy(gen_key, key, _cipherLength)[m
[31m-        end[m
[31m-[m
[31m-        ffi_copy(gen_iv, _hash.iv, 16)[m
[31m-[m
[31m-    else[m
[31m-        if C.EVP_BytesToKey(_cipher.method, _hash, salt, key, #key,[m
[31m-                            hash_rounds, gen_key, gen_iv)[m
[31m-            ~= _cipherLength[m
[31m-        then[m
[31m-            return nil[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    C.EVP_CIPHER_CTX_init(encrypt_ctx)[m
[31m-    C.EVP_CIPHER_CTX_init(decrypt_ctx)[m
[31m-[m
[31m-    if C.EVP_EncryptInit_ex(encrypt_ctx, _cipher.method, nil,[m
[31m-      gen_key, gen_iv) == 0 or[m
[31m-      C.EVP_DecryptInit_ex(decrypt_ctx, _cipher.method, nil,[m
[31m-      gen_key, gen_iv) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    ffi_gc(encrypt_ctx, C.EVP_CIPHER_CTX_cleanup)[m
[31m-    ffi_gc(decrypt_ctx, C.EVP_CIPHER_CTX_cleanup)[m
[31m-[m
[31m-    return setmetatable({[m
[31m-      _encrypt_ctx = encrypt_ctx,[m
[31m-      _decrypt_ctx = decrypt_ctx[m
[31m-      }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.encrypt(self, s)[m
[31m-    local s_len = #s[m
[31m-    local max_len = s_len + 16[m
[31m-    local buf = ffi_new("unsigned char[?]", max_len)[m
[31m-    local out_len = ffi_new("int[1]")[m
[31m-    local tmp_len = ffi_new("int[1]")[m
[31m-    local ctx = self._encrypt_ctx[m
[31m-[m
[31m-    if C.EVP_EncryptInit_ex(ctx, nil, nil, nil, nil) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if C.EVP_EncryptUpdate(ctx, buf, out_len, s, s_len) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if C.EVP_EncryptFinal_ex(ctx, buf + out_len[0], tmp_len) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return ffi_str(buf, out_len[0] + tmp_len[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.decrypt(self, s)[m
[31m-    local s_len = #s[m
[31m-    local buf = ffi_new("unsigned char[?]", s_len)[m
[31m-    local out_len = ffi_new("int[1]")[m
[31m-    local tmp_len = ffi_new("int[1]")[m
[31m-    local ctx = self._decrypt_ctx[m
[31m-[m
[31m-    if C.EVP_DecryptInit_ex(ctx, nil, nil, nil, nil) == 0 then[m
[31m-      return nil[m
[31m-    end[m
[31m-[m
[31m-    if C.EVP_DecryptUpdate(ctx, buf, out_len, s, s_len) == 0 then[m
[31m-      return nil[m
[31m-    end[m
[31m-[m
[31m-    if C.EVP_DecryptFinal_ex(ctx, buf + out_len[0], tmp_len) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return ffi_str(buf, out_len[0] + tmp_len[0])[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/md5.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/md5.lua[m
[1mdeleted file mode 100644[m
[1mindex 44d9abe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/md5.lua[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef unsigned long MD5_LONG ;[m
[31m-[m
[31m-enum {[m
[31m-    MD5_CBLOCK = 64,[m
[31m-    MD5_LBLOCK = MD5_CBLOCK/4[m
[31m-};[m
[31m-[m
[31m-typedef struct MD5state_st[m
[31m-        {[m
[31m-        MD5_LONG A,B,C,D;[m
[31m-        MD5_LONG Nl,Nh;[m
[31m-        MD5_LONG data[MD5_LBLOCK];[m
[31m-        unsigned int num;[m
[31m-        } MD5_CTX;[m
[31m-[m
[31m-int MD5_Init(MD5_CTX *c);[m
[31m-int MD5_Update(MD5_CTX *c, const void *data, size_t len);[m
[31m-int MD5_Final(unsigned char *md, MD5_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local buf = ffi_new("char[16]")[m
[31m-local ctx_ptr_type = ffi.typeof("MD5_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.MD5_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.MD5_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.MD5_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, 16)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.MD5_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/random.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/random.lua[m
[1mdeleted file mode 100644[m
[1mindex 25bf568..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/random.lua[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int RAND_bytes(unsigned char *buf, int num);[m
[31m-int RAND_pseudo_bytes(unsigned char *buf, int num);[m
[31m-]][m
[31m-[m
[31m-[m
[31m-function _M.bytes(len, strong)[m
[31m-    local buf = ffi_new("char[?]", len)[m
[31m-    if strong then[m
[31m-        if C.RAND_bytes(buf, len) == 0 then[m
[31m-            return nil[m
[31m-        end[m
[31m-    else[m
[31m-        C.RAND_pseudo_bytes(buf,len)[m
[31m-    end[m
[31m-[m
[31m-    return ffi_str(buf, len)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha.lua[m
[1mdeleted file mode 100644[m
[1mindex d8e69c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha.lua[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef unsigned long SHA_LONG;[m
[31m-typedef unsigned long long SHA_LONG64;[m
[31m-[m
[31m-enum {[m
[31m-    SHA_LBLOCK = 16[m
[31m-};[m
[31m-]];[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha1.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha1.lua[m
[1mdeleted file mode 100644[m
[1mindex 9ff27a3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha1.lua[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha = require "resty.sha"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef struct SHAstate_st[m
[31m-        {[m
[31m-        SHA_LONG h0,h1,h2,h3,h4;[m
[31m-        SHA_LONG Nl,Nh;[m
[31m-        SHA_LONG data[SHA_LBLOCK];[m
[31m-        unsigned int num;[m
[31m-        } SHA_CTX;[m
[31m-[m
[31m-int SHA1_Init(SHA_CTX *c);[m
[31m-int SHA1_Update(SHA_CTX *c, const void *data, size_t len);[m
[31m-int SHA1_Final(unsigned char *md, SHA_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 20[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA1_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA1_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA1_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA1_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha224.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha224.lua[m
[1mdeleted file mode 100644[m
[1mindex 91302db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha224.lua[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha256 = require "resty.sha256"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int SHA224_Init(SHA256_CTX *c);[m
[31m-int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);[m
[31m-int SHA224_Final(unsigned char *md, SHA256_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 28[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA256_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA224_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA224_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA224_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA224_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha256.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha256.lua[m
[1mdeleted file mode 100644[m
[1mindex 330c3fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha256.lua[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha = require "resty.sha"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef struct SHA256state_st[m
[31m-        {[m
[31m-        SHA_LONG h[8];[m
[31m-        SHA_LONG Nl,Nh;[m
[31m-        SHA_LONG data[SHA_LBLOCK];[m
[31m-        unsigned int num,md_len;[m
[31m-        } SHA256_CTX;[m
[31m-[m
[31m-int SHA256_Init(SHA256_CTX *c);[m
[31m-int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);[m
[31m-int SHA256_Final(unsigned char *md, SHA256_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 32[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA256_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA256_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA256_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA256_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA256_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha384.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha384.lua[m
[1mdeleted file mode 100644[m
[1mindex 36b80f3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha384.lua[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha512 = require "resty.sha512"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-int SHA384_Init(SHA512_CTX *c);[m
[31m-int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);[m
[31m-int SHA384_Final(unsigned char *md, SHA512_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 48[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA512_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA384_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA384_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA384_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA384_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-return _M[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha512.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha512.lua[m
[1mdeleted file mode 100644[m
[1mindex 561df6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/sha512.lua[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sha = require "resty.sha"[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-enum {[m
[31m-    SHA512_CBLOCK = SHA_LBLOCK*8[m
[31m-};[m
[31m-[m
[31m-typedef struct SHA512state_st[m
[31m-        {[m
[31m-        SHA_LONG64 h[8];[m
[31m-        SHA_LONG64 Nl,Nh;[m
[31m-        union {[m
[31m-                SHA_LONG64      d[SHA_LBLOCK];[m
[31m-                unsigned char   p[SHA512_CBLOCK];[m
[31m-        } u;[m
[31m-        unsigned int num,md_len;[m
[31m-        } SHA512_CTX;[m
[31m-[m
[31m-int SHA512_Init(SHA512_CTX *c);[m
[31m-int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);[m
[31m-int SHA512_Final(unsigned char *md, SHA512_CTX *c);[m
[31m-]][m
[31m-[m
[31m-local digest_len = 64[m
[31m-[m
[31m-local buf = ffi_new("char[?]", digest_len)[m
[31m-local ctx_ptr_type = ffi.typeof("SHA512_CTX[1]")[m
[31m-[m
[31m-[m
[31m-function _M.new(self)[m
[31m-    local ctx = ffi_new(ctx_ptr_type)[m
[31m-    if C.SHA512_Init(ctx) == 0 then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({ _ctx = ctx }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.update(self, s)[m
[31m-    return C.SHA512_Update(self._ctx, s, #s) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.final(self)[m
[31m-    if C.SHA512_Final(buf, self._ctx) == 1 then[m
[31m-        return ffi_str(buf, digest_len)[m
[31m-    end[m
[31m-[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.reset(self)[m
[31m-    return C.SHA512_Init(self._ctx) == 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/string.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/string.lua[m
[1mdeleted file mode 100644[m
[1mindex 09fd652..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/lib/resty/string.lua[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m--- Copyright (C) by Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local ffi = require "ffi"[m
[31m-local ffi_new = ffi.new[m
[31m-local ffi_str = ffi.string[m
[31m-local C = ffi.C[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-local tonumber = tonumber[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.09' }[m
[31m-[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-typedef unsigned char u_char;[m
[31m-[m
[31m-u_char * ngx_hex_dump(u_char *dst, const u_char *src, size_t len);[m
[31m-[m
[31m-intptr_t ngx_atoi(const unsigned char *line, size_t n);[m
[31m-]][m
[31m-[m
[31m-local str_type = ffi.typeof("uint8_t[?]")[m
[31m-[m
[31m-[m
[31m-function _M.to_hex(s)[m
[31m-    local len = #s * 2[m
[31m-    local buf = ffi_new(str_type, len)[m
[31m-    C.ngx_hex_dump(buf, s, #s)[m
[31m-    return ffi_str(buf, len)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.atoi(s)[m
[31m-    return tonumber(C.ngx_atoi(s, #s))[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/aes.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/aes.t[m
[1mdeleted file mode 100644[m
[1mindex d64065d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/aes.t[m
[1m+++ /dev/null[m
[36m@@ -1,300 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: AES default hello[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret")[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 CBC MD5: 7b47a4dbb11e2cddb2f3740c9e3a552b[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: AES empty key hello[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("")[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 (empty key) CBC MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 (empty key) CBC MD5: 6cb1a35bf9d66e92c9dec684fc329746[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: AES 8-byte salt[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret","WhatSalt")[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 (salted) CBC MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 (salted) CBC MD5: f72db89f8e19326d8da4928be106705c[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: AES oversized 10-byte salt[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret","Oversized!")[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 (oversized salt) CBC MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret","Oversize")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 (oversized salt) CBC MD5: 90a9c9a96f06c597c8da99c37a6c689f[m
[31m-true[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: AES-256 ECB SHA1 no salt[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret",nil,[m
[31m-              aes.cipher(256,"ecb"),aes.hash.sha1)[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-256 ECB SHA1: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-256 ECB SHA1: 927148b31f0e89696a222489403f540d[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: AES-256 ECB SHA1x5 no salt[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("secret",nil,[m
[31m-              aes.cipher(256,"ecb"),aes.hash.sha1,5)[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-256 ECB SHA1: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-256 ECB SHA1: d1a9b6e59b8980e783df223889563bee[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: AES-128 CBC custom keygen[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new("Xr4ilOzQ4PCOq3aQ0qbuaQ==",nil,[m
[31m-              aes.cipher(128,"cbc"),[m
[31m-              {iv = ngx.decode_base64("Jq5cyFTja2vfyjZoSN6muw=="),[m
[31m-               method = ngx.decode_base64})[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC (custom keygen) MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 CBC (custom keygen) MD5: 7b47a4dbb11e2cddb2f3740c9e3a552b[m
[31m-true[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: AES-128 CBC custom keygen (without method)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-            local aes_default = aes:new(ngx.decode_base64("Xr4ilOzQ4PCOq3aQ0qbuaQ=="),nil,[m
[31m-              aes.cipher(128,"cbc"),[m
[31m-              {iv = ngx.decode_base64("Jq5cyFTja2vfyjZoSN6muw==")})[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC (custom keygen) MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-AES-128 CBC (custom keygen) MD5: 7b47a4dbb11e2cddb2f3740c9e3a552b[m
[31m-true[m
[31m-true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: AES-128 CBC custom keygen (without method, bad key len)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-[m
[31m-            local aes_default, err = aes:new("hel", nil, aes.cipher(128,"cbc"),[m
[31m-              {iv = ngx.decode_base64("Jq5cyFTja2vfyjZoSN6muw==")})[m
[31m-[m
[31m-            if not aes_default then[m
[31m-                ngx.say("failed to new: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC (custom keygen) MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to new: bad key length[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: AES-128 CBC custom keygen (without method, bad iv)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            local str = require "resty.string"[m
[31m-[m
[31m-            local aes_default, err = aes:new([m
[31m-                ngx.decode_base64("Xr4ilOzQ4PCOq3aQ0qbuaQ=="),[m
[31m-                nil,[m
[31m-                aes.cipher(128,"cbc"),[m
[31m-                {iv = "hello"}[m
[31m-            )[m
[31m-[m
[31m-            if not aes_default then[m
[31m-                ngx.say("failed to new: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local encrypted = aes_default:encrypt("hello")[m
[31m-            ngx.say("AES-128 CBC (custom keygen) MD5: ", str.to_hex(encrypted))[m
[31m-            local decrypted = aes_default:decrypt(encrypted)[m
[31m-            ngx.say(decrypted == "hello")[m
[31m-            local aes_check = aes:new("secret")[m
[31m-            local encrypted_check = aes_check:encrypt("hello")[m
[31m-            ngx.say(encrypted_check == encrypted)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to new: bad iv[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/atoi.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/atoi.t[m
[1mdeleted file mode 100644[m
[1mindex 0c92041..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/atoi.t[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: atoi[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local str = require "resty.string"[m
[31m-            ngx.say(1 + str.atoi("32"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-33[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/md5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/md5.t[m
[1mdeleted file mode 100644[m
[1mindex e5decfe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/md5.t[m
[1m+++ /dev/null[m
[36m@@ -1,92 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello MD5[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_md5 = require "resty.md5"[m
[31m-            local str = require "resty.string"[m
[31m-            local md5 = resty_md5:new()[m
[31m-            ngx.say(md5:update("hello"))[m
[31m-            local digest = md5:final()[m
[31m-            ngx.say(digest == ngx.md5_bin("hello"))[m
[31m-            ngx.say("md5: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-md5: 5d41402abc4b2a76b9719d911017c592[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: MD5 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_md5 = require "resty.md5"[m
[31m-            local str = require "resty.string"[m
[31m-            local md5 = resty_md5:new()[m
[31m-            ngx.say(md5:update("hel"))[m
[31m-            ngx.say(md5:update("lo"))[m
[31m-            local digest = md5:final()[m
[31m-            ngx.say("md5: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-md5: 5d41402abc4b2a76b9719d911017c592[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: MD5 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_md5 = require "resty.md5"[m
[31m-            local str = require "resty.string"[m
[31m-            local md5 = resty_md5:new()[m
[31m-            ngx.say(md5:update(""))[m
[31m-            local digest = md5:final()[m
[31m-            ngx.say(digest == ngx.md5_bin(""))[m
[31m-            ngx.say("md5: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-md5: d41d8cd98f00b204e9800998ecf8427e[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/random.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/random.t[m
[1mdeleted file mode 100644[m
[1mindex 876edfd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/random.t[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: pseudo random bytes[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local rand = require "resty.random"[m
[31m-            local str = require "resty.string"[m
[31m-            local s = rand.bytes(5)[m
[31m-            ngx.say("res: ", str.to_hex(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^res: [a-f0-9]{10}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: strong random bytes[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local rand = require "resty.random"[m
[31m-            local str = require "resty.string"[m
[31m-            local s = rand.bytes(5, true)[m
[31m-            ngx.say("res: ", str.to_hex(s))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^res: [a-f0-9]{10}$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha1.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha1.t[m
[1mdeleted file mode 100644[m
[1mindex 97e9b37..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha1.t[m
[1m+++ /dev/null[m
[36m@@ -1,93 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-1[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha1 = require "resty.sha1"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha1 = resty_sha1:new()[m
[31m-            ngx.say(sha1:update("hello"))[m
[31m-            local digest = sha1:final()[m
[31m-            ngx.say(digest == ngx.sha1_bin("hello"))[m
[31m-            ngx.say("sha1: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-1 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha1 = require "resty.sha1"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha1 = resty_sha1:new()[m
[31m-            ngx.say(sha1:update("hel"))[m
[31m-            ngx.say(sha1:update("lo"))[m
[31m-            local digest = sha1:final()[m
[31m-            ngx.say("sha1: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-1 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha1 = require "resty.sha1"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha1 = resty_sha1:new()[m
[31m-            ngx.say(sha1:update(""))[m
[31m-            local digest = sha1:final()[m
[31m-            ngx.say(digest == ngx.sha1_bin(""))[m
[31m-            ngx.say("sha1: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha224.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha224.t[m
[1mdeleted file mode 100644[m
[1mindex 7697d63..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha224.t[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-224[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha224 = require "resty.sha224"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha224 = resty_sha224:new()[m
[31m-            ngx.say(sha224:update("hello"))[m
[31m-            local digest = sha224:final()[m
[31m-            ngx.say("sha224: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha224: ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-224 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha224 = require "resty.sha224"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha224 = resty_sha224:new()[m
[31m-            ngx.say(sha224:update("hel"))[m
[31m-            ngx.say(sha224:update("lo"))[m
[31m-            local digest = sha224:final()[m
[31m-            ngx.say("sha224: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha224: ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-224 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha224 = require "resty.sha224"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha224 = resty_sha224:new()[m
[31m-            ngx.say(sha224:update(""))[m
[31m-            local digest = sha224:final()[m
[31m-            ngx.say("sha224: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha224: d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: hello (SHA-1 + SHA-224 + SHA-256 + SHA-512 at the same time)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha224 = require "resty.sha224"[m
[31m-            local resty_sha256 = require "resty.sha256"[m
[31m-            local resty_sha1 = require "resty.sha1"[m
[31m-            local resty_sha512 = require "resty.sha512"[m
[31m-[m
[31m-            local str = require "resty.string"[m
[31m-[m
[31m-            local sha224 = resty_sha224:new()[m
[31m-            local sha256 = resty_sha256:new()[m
[31m-            local sha1 = resty_sha1:new()[m
[31m-            local sha512 = resty_sha512:new()[m
[31m-[m
[31m-            ngx.say(sha224:update("hello"))[m
[31m-            ngx.say(sha256:update("hello"))[m
[31m-            ngx.say(sha1:update("hello"))[m
[31m-            ngx.say(sha512:update("hello"))[m
[31m-[m
[31m-[m
[31m-            local digest = sha224:final()[m
[31m-            ngx.say("sha224: ", str.to_hex(digest))[m
[31m-[m
[31m-            digest = sha256:final()[m
[31m-            ngx.say("sha256: ", str.to_hex(digest))[m
[31m-[m
[31m-            digest = sha1:final()[m
[31m-            ngx.say("sha1: ", str.to_hex(digest))[m
[31m-[m
[31m-            digest = sha512:final()[m
[31m-            ngx.say("sha512: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-true[m
[31m-true[m
[31m-sha224: ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193[m
[31m-sha256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824[m
[31m-sha1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d[m
[31m-sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha256.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha256.t[m
[1mdeleted file mode 100644[m
[1mindex a044a8d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha256.t[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-256[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha256 = require "resty.sha256"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha256 = resty_sha256:new()[m
[31m-            ngx.say(sha256:update("hello"))[m
[31m-            local digest = sha256:final()[m
[31m-            ngx.say("sha256: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-256 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha256 = require "resty.sha256"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha256 = resty_sha256:new()[m
[31m-            ngx.say(sha256:update("hel"))[m
[31m-            ngx.say(sha256:update("lo"))[m
[31m-            local digest = sha256:final()[m
[31m-            ngx.say("sha256: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-256 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha256 = require "resty.sha256"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha256 = resty_sha256:new()[m
[31m-            ngx.say(sha256:update(""))[m
[31m-            local digest = sha256:final()[m
[31m-            ngx.say("sha256: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha384.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha384.lua[m
[1mdeleted file mode 100644[m
[1mindex b40a040..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha384.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-384[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha384 = require "resty.sha384"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha384 = resty_sha384:new()[m
[31m-            ngx.say(sha384:update("hello"))[m
[31m-            local digest = sha384:final()[m
[31m-            ngx.say("sha384: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha384: 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-384 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha384 = require "resty.sha384"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha384 = resty_sha384:new()[m
[31m-            ngx.say(sha384:update("hel"))[m
[31m-            ngx.say(sha384:update("lo"))[m
[31m-            local digest = sha384:final()[m
[31m-            ngx.say("sha384: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha384: 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-384 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha384 = require "resty.sha384"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha384 = resty_sha384:new()[m
[31m-            ngx.say(sha384:update(""))[m
[31m-            local digest = sha384:final()[m
[31m-            ngx.say("sha384: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha384: 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha512.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha512.t[m
[1mdeleted file mode 100644[m
[1mindex 0ce2d15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/sha512.t[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-our $HttpConfig = <<'_EOC_';[m
[31m-    #lua_code_cache off;[m
[31m-    lua_package_path 'lib/?.lua;;';[m
[31m-    lua_package_cpath 'lib/?.so;;';[m
[31m-_EOC_[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: hello SHA-512[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha512 = require "resty.sha512"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha512 = resty_sha512:new()[m
[31m-            ngx.say(sha512:update("hello"))[m
[31m-            local digest = sha512:final()[m
[31m-            ngx.say("sha512: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: SHA-512 incremental[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha512 = require "resty.sha512"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha512 = resty_sha512:new()[m
[31m-            ngx.say(sha512:update("hel"))[m
[31m-            ngx.say(sha512:update("lo"))[m
[31m-            local digest = sha512:final()[m
[31m-            ngx.say("sha512: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-true[m
[31m-sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SHA-512 empty string[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local resty_sha512 = require "resty.sha512"[m
[31m-            local str = require "resty.string"[m
[31m-            local sha512 = resty_sha512:new()[m
[31m-            ngx.say(sha512:update(""))[m
[31m-            local digest = sha512:final()[m
[31m-            ngx.say("sha512: ", str.to_hex(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-true[m
[31m-sha512: cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex 12e53da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sha1 version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sha1 = require "resty.sha1"[m
[31m-            ngx.say(sha1._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: md5 version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local md5 = require "resty.md5"[m
[31m-            ngx.say(md5._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: resty.string version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local str = require "resty.string"[m
[31m-            ngx.say(str._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: resty.random version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local rand = require "resty.random"[m
[31m-            ngx.say(rand._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: resty.aes version[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local aes = require "resty.aes"[m
[31m-            ngx.say(aes._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex c7a4937..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-string-0.09/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,550 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 8023628..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-test.html[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 3f42cae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty-debug[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-	$(INSTALL) lib/resty/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/lib/resty/upload.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/lib/resty/upload.lua[m
[1mdeleted file mode 100644[m
[1mindex 5584dda..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/lib/resty/upload.lua[m
[1m+++ /dev/null[m
[36m@@ -1,267 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local sub = string.sub[m
[31m-local req_socket = ngx.req.socket[m
[31m-local null = ngx.null[m
[31m-local match = string.match[m
[31m-local setmetatable = setmetatable[m
[31m-local error = error[m
[31m-local get_headers = ngx.req.get_headers[m
[31m-local type = type[m
[31m--- local print = print[m
[31m-[m
[31m-[m
[31m-local _M = { _VERSION = '0.08' }[m
[31m-[m
[31m-[m
[31m-local MAX_LINE_SIZE = 512[m
[31m-[m
[31m-local STATE_BEGIN = 1[m
[31m-local STATE_READING_HEADER = 2[m
[31m-local STATE_READING_BODY = 3[m
[31m-local STATE_EOF = 4[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-local state_handlers[m
[31m-[m
[31m-[m
[31m-local function get_boundary()[m
[31m-    local header = get_headers()["content-type"][m
[31m-    if not header then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    if type(header) == "table" then[m
[31m-        header = header[1][m
[31m-    end[m
[31m-[m
[31m-    local m = match(header, ";%s*boundary=\"([^\"]+)\"")[m
[31m-    if m then[m
[31m-        return m[m
[31m-    end[m
[31m-[m
[31m-    return match(header, ";%s*boundary=([^\",;]+)")[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.new(self, chunk_size)[m
[31m-    local boundary = get_boundary()[m
[31m-[m
[31m-    -- print("boundary: ", boundary)[m
[31m-[m
[31m-    if not boundary then[m
[31m-        return nil, "no boundary defined in Content-Type"[m
[31m-    end[m
[31m-[m
[31m-    -- print('boundary: "', boundary, '"')[m
[31m-[m
[31m-    local sock, err = req_socket()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local read2boundary, err = sock:receiveuntil("--" .. boundary)[m
[31m-    if not read2boundary then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local read_line, err = sock:receiveuntil("\r\n")[m
[31m-    if not read_line then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({[m
[31m-        sock = sock,[m
[31m-        size = chunk_size or 4096,[m
[31m-        read2boundary = read2boundary,[m
[31m-        read_line = read_line,[m
[31m-        boundary = boundary,[m
[31m-        state = STATE_BEGIN[m
[31m-    }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, timeout)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(timeout)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function discard_line(self)[m
[31m-    local read_line = self.read_line[m
[31m-[m
[31m-    local line, err = self.read_line(MAX_LINE_SIZE)[m
[31m-    if not line then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local dummy, err = self.read_line(1)[m
[31m-    if dummy then[m
[31m-        return nil, "line too long: " .. line .. dummy .. "..."[m
[31m-    end[m
[31m-[m
[31m-    if err then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function discard_rest(self)[m
[31m-    local sock = self.sock[m
[31m-    local size = self.size[m
[31m-[m
[31m-    while true do[m
[31m-        local dummy, err = sock:receive(size)[m
[31m-        if err and err ~= 'closed' then[m
[31m-            return nil, err[m
[31m-        end[m
[31m-[m
[31m-        if not dummy then[m
[31m-            return 1[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function read_body_part(self)[m
[31m-    local read2boundary = self.read2boundary[m
[31m-[m
[31m-    local chunk, err = read2boundary(self.size)[m
[31m-    if err then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    if not chunk then[m
[31m-        local sock = self.sock[m
[31m-[m
[31m-        local data = sock:receive(2)[m
[31m-        if data == "--" then[m
[31m-            local ok, err = discard_rest(self)[m
[31m-            if not ok then[m
[31m-                return nil, nil, err[m
[31m-            end[m
[31m-[m
[31m-            self.state = STATE_EOF[m
[31m-            return "part_end"[m
[31m-        end[m
[31m-[m
[31m-        if data ~= "\r\n" then[m
[31m-            local ok, err = discard_line(self)[m
[31m-            if not ok then[m
[31m-                return nil, nil, err[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        self.state = STATE_READING_HEADER[m
[31m-        return "part_end"[m
[31m-    end[m
[31m-[m
[31m-    return "body", chunk[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function read_header(self)[m
[31m-    local read_line = self.read_line[m
[31m-[m
[31m-    local line, err = read_line(MAX_LINE_SIZE)[m
[31m-    if err then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    local dummy, err = read_line(1)[m
[31m-    if dummy then[m
[31m-        return nil, nil, "line too long: " .. line .. dummy .. "..."[m
[31m-    end[m
[31m-[m
[31m-    if err then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    -- print("read line: ", line)[m
[31m-[m
[31m-    if line == "" then[m
[31m-        -- after the last header[m
[31m-        self.state = STATE_READING_BODY[m
[31m-        return read_body_part(self)[m
[31m-    end[m
[31m-[m
[31m-    local key, value = match(line, "([^: \t]+)%s*:%s*(.+)")[m
[31m-    if not key then[m
[31m-        return 'header', line[m
[31m-    end[m
[31m-[m
[31m-    return 'header', {key, value, line}[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function eof()[m
[31m-    return "eof", nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.read(self)[m
[31m-    local size = self.size[m
[31m-[m
[31m-    local handler = state_handlers[self.state][m
[31m-    if handler then[m
[31m-        return handler(self)[m
[31m-    end[m
[31m-[m
[31m-    return nil, nil, "bad state: " .. self.state[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function read_preamble(self)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local size = self.size[m
[31m-    local read2boundary = self.read2boundary[m
[31m-[m
[31m-    while true do[m
[31m-        local preamble, err = read2boundary(size)[m
[31m-        if not preamble then[m
[31m-            break[m
[31m-        end[m
[31m-[m
[31m-        -- discard the preamble data chunk[m
[31m-        -- print("read preamble: ", preamble)[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = discard_line(self)[m
[31m-    if not ok then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    local read2boundary, err = sock:receiveuntil("\r\n--" .. self.boundary)[m
[31m-    if not read2boundary then[m
[31m-        return nil, nil, err[m
[31m-    end[m
[31m-[m
[31m-    self.read2boundary = read2boundary[m
[31m-[m
[31m-    self.state = STATE_READING_HEADER[m
[31m-    return read_header(self)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-state_handlers = {[m
[31m-    read_preamble,[m
[31m-    read_header,[m
[31m-    read_body_part,[m
[31m-    eof[m
[31m-}[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex e6e89e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,592 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(5)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: in-part header line too long[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(5)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-} . ("Hello, world" x 64) . qq{\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-failed to read: line too long: Hello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, worldHello, wo...[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: terminate line too long[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(5)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179} . ("a" x 1024) . qq{--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-failed to read: line too long: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: example from RFC 1521[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(20)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-content-TYPE: multipart/form-data; boundary="simple boundary"[m
[31m---- request eval[m
[31m-qq{POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME conformant readers.[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["body","This is implicitly t"][m
[31m-read: ["body","yped plain ASCII tex"][m
[31m-read: ["body","t.\nIt does NOT end w"][m
[31m-read: ["body","ith a linebreak."][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-type","text\/plain; charset=us-ascii","Content-type: text\/plain; charset=us-ascii"]][m
[31m-read: ["body","This is explicitly t"][m
[31m-read: ["body","yped plain ASCII tex"][m
[31m-read: ["body","t.\nIt DOES end with "][m
[31m-read: ["body","a linebreak.\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: example from RFC 1521, no double quotes for the boundary value in the Content-Type response header[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(20)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=simple boundary[m
[31m---- request eval[m
[31m-qq{POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME conformant readers.[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["body","This is implicitly t"][m
[31m-read: ["body","yped plain ASCII tex"][m
[31m-read: ["body","t.\nIt does NOT end w"][m
[31m-read: ["body","ith a linebreak."][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-type","text\/plain; charset=us-ascii","Content-type: text\/plain; charset=us-ascii"]][m
[31m-read: ["body","This is explicitly t"][m
[31m-read: ["body","yped plain ASCII tex"][m
[31m-read: ["body","t.\nIt DOES end with "][m
[31m-read: ["body","a linebreak.\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: example from RFC 1521, using the default chunk size[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new()[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=simple boundary[m
[31m---- request eval[m
[31m-qq{POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME conformant readers.[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-read: ["body","This is implicitly typed plain ASCII text.\nIt does NOT end with a linebreak."][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-type","text\/plain; charset=us-ascii","Content-type: text\/plain; charset=us-ascii"]][m
[31m-read: ["body","This is explicitly typed plain ASCII text.\nIt DOES end with a linebreak.\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: github issue #2: cannot parse boundary - no space before parameter (w/o quotes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form, err = upload:new(5)[m
[31m-            if not form then[m
[31m-                ngx.say("cannot get form: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data;boundary=---------------------------820127721219505131303151179[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: github issue #2: cannot parse boundary - no space before parameter (with quotes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form, err = upload:new(5)[m
[31m-            if not form then[m
[31m-                ngx.say("cannot get form: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data;boundary="---------------------------820127721219505131303151179"[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multiple Content-Type headers[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            local cjson = require "cjson"[m
[31m-[m
[31m-            local form = upload:new(5)[m
[31m-[m
[31m-            form:set_timeout(1000) -- 1 sec[m
[31m-[m
[31m-            while true do[m
[31m-                local typ, res, err = form:read()[m
[31m-                if not typ then[m
[31m-                    ngx.say("failed to read: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-[m
[31m-                if typ == "eof" then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local typ, res, err = form:read()[m
[31m-            ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m-Content-Type: multipart/form-data; boundary=---------------------------820127721219505131303151179[m
[31m-[m
[31m---- request eval[m
[31m-qq{POST /t\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="file1"; filename="a.txt"\r[m
[31m-Content-Type: text/plain\r[m
[31m-\r[m
[31m-Hello, world\r\n-----------------------------820127721219505131303151179\r[m
[31m-Content-Disposition: form-data; name="test"\r[m
[31m-\r[m
[31m-value\r[m
[31m-\r\n-----------------------------820127721219505131303151179--\r[m
[31m-}[m
[31m---- response_body[m
[31m-read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-read: ["body","Hello"][m
[31m-read: ["body",", wor"][m
[31m-read: ["body","ld"][m
[31m-read: ["part_end"][m
[31m-read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-read: ["body","value"][m
[31m-read: ["body","\r\n"][m
[31m-read: ["part_end"][m
[31m-read: ["eof"][m
[31m-read: ["eof"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex bec0061..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upload = require "resty.upload"[m
[31m-            ngx.say(upload._VERSION)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\d+\.\d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 49ac2e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upload-0.09/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,537 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 84b6760..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-nginx[m
[31m-ctags[m
[31m-tags[m
[31m-a.lua[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/Makefile[m
[1mdeleted file mode 100644[m
[1mindex 2a9f15a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/upstream/[m
[31m-	$(INSTALL) lib/resty/upstream/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/upstream/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/lib/resty/upstream/healthcheck.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/lib/resty/upstream/healthcheck.lua[m
[1mdeleted file mode 100644[m
[1mindex 2118282..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/lib/resty/upstream/healthcheck.lua[m
[1m+++ /dev/null[m
[36m@@ -1,704 +0,0 @@[m
[31m-local stream_sock = ngx.socket.tcp[m
[31m-local log = ngx.log[m
[31m-local ERR = ngx.ERR[m
[31m-local INFO = ngx.INFO[m
[31m-local WARN = ngx.WARN[m
[31m-local DEBUG = ngx.DEBUG[m
[31m-local str_find = string.find[m
[31m-local sub = string.sub[m
[31m-local re_find = ngx.re.find[m
[31m-local new_timer = ngx.timer.at[m
[31m-local shared = ngx.shared[m
[31m-local debug_mode = ngx.config.debug[m
[31m-local concat = table.concat[m
[31m-local tonumber = tonumber[m
[31m-local tostring = tostring[m
[31m-local ipairs = ipairs[m
[31m-local ceil = math.ceil[m
[31m-local spawn = ngx.thread.spawn[m
[31m-local wait = ngx.thread.wait[m
[31m-local pcall = pcall[m
[31m-[m
[31m-local _M = {[m
[31m-    _VERSION = '0.03'[m
[31m-}[m
[31m-[m
[31m-if not ngx.config[m
[31m-   or not ngx.config.ngx_lua_version[m
[31m-   or ngx.config.ngx_lua_version < 9005[m
[31m-then[m
[31m-    error("ngx_lua 0.9.5+ required")[m
[31m-end[m
[31m-[m
[31m-local ok, upstream = pcall(require, "ngx.upstream")[m
[31m-if not ok then[m
[31m-    error("ngx_upstream_lua module required")[m
[31m-end[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok or type(new_tab) ~= "function" then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local set_peer_down = upstream.set_peer_down[m
[31m-local get_primary_peers = upstream.get_primary_peers[m
[31m-local get_backup_peers = upstream.get_backup_peers[m
[31m-local get_upstreams = upstream.get_upstreams[m
[31m-[m
[31m-local upstream_checker_statuses = {}[m
[31m-[m
[31m-local function info(...)[m
[31m-    log(INFO, "healthcheck: ", ...)[m
[31m-end[m
[31m-[m
[31m-local function warn(...)[m
[31m-    log(WARN, "healthcheck: ", ...)[m
[31m-end[m
[31m-[m
[31m-local function errlog(...)[m
[31m-    log(ERR, "healthcheck: ", ...)[m
[31m-end[m
[31m-[m
[31m-local function debug(...)[m
[31m-    -- print("debug mode: ", debug_mode)[m
[31m-    if debug_mode then[m
[31m-        log(DEBUG, "healthcheck: ", ...)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function gen_peer_key(prefix, u, is_backup, id)[m
[31m-    if is_backup then[m
[31m-        return prefix .. u .. ":b" .. id[m
[31m-    end[m
[31m-    return prefix .. u .. ":p" .. id[m
[31m-end[m
[31m-[m
[31m-local function set_peer_down_globally(ctx, is_backup, id, value)[m
[31m-    local u = ctx.upstream[m
[31m-    local dict = ctx.dict[m
[31m-    local ok, err = set_peer_down(u, is_backup, id, value)[m
[31m-    if not ok then[m
[31m-        errlog("failed to set peer down: ", err)[m
[31m-    end[m
[31m-[m
[31m-    if not ctx.new_version then[m
[31m-        ctx.new_version = true[m
[31m-    end[m
[31m-[m
[31m-    local key = gen_peer_key("d:", u, is_backup, id)[m
[31m-    local ok, err = dict:set(key, value)[m
[31m-    if not ok then[m
[31m-        errlog("failed to set peer down state: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function peer_fail(ctx, is_backup, id, peer)[m
[31m-    debug("peer ", peer.name, " was checked to be not ok")[m
[31m-[m
[31m-    local u = ctx.upstream[m
[31m-    local dict = ctx.dict[m
[31m-[m
[31m-    local key = gen_peer_key("nok:", u, is_backup, id)[m
[31m-    local fails, err = dict:get(key)[m
[31m-    if not fails then[m
[31m-        if err then[m
[31m-            errlog("failed to get peer nok key: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        fails = 1[m
[31m-[m
[31m-        -- below may have a race condition, but it is fine for our[m
[31m-        -- purpose here.[m
[31m-        local ok, err = dict:set(key, 1)[m
[31m-        if not ok then[m
[31m-            errlog("failed to set peer nok key: ", err)[m
[31m-        end[m
[31m-    else[m
[31m-        fails = fails + 1[m
[31m-        local ok, err = dict:incr(key, 1)[m
[31m-        if not ok then[m
[31m-            errlog("failed to incr peer nok key: ", err)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if fails == 1 then[m
[31m-        key = gen_peer_key("ok:", u, is_backup, id)[m
[31m-        local succ, err = dict:get(key)[m
[31m-        if not succ or succ == 0 then[m
[31m-            if err then[m
[31m-                errlog("failed to get peer ok key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        else[m
[31m-            local ok, err = dict:set(key, 0)[m
[31m-            if not ok then[m
[31m-                errlog("failed to set peer ok key: ", err)[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- print("ctx fall: ", ctx.fall, ", peer down: ", peer.down,[m
[31m-          -- ", fails: ", fails)[m
[31m-[m
[31m-    if not peer.down and fails >= ctx.fall then[m
[31m-        warn("peer ", peer.name, " is turned down after ", fails,[m
[31m-                " failure(s)")[m
[31m-        peer.down = true[m
[31m-        set_peer_down_globally(ctx, is_backup, id, true)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function peer_ok(ctx, is_backup, id, peer)[m
[31m-    debug("peer ", peer.name, " was checked to be ok")[m
[31m-[m
[31m-    local u = ctx.upstream[m
[31m-    local dict = ctx.dict[m
[31m-[m
[31m-    local key = gen_peer_key("ok:", u, is_backup, id)[m
[31m-    local succ, err = dict:get(key)[m
[31m-    if not succ then[m
[31m-        if err then[m
[31m-            errlog("failed to get peer ok key: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        succ = 1[m
[31m-[m
[31m-        -- below may have a race condition, but it is fine for our[m
[31m-        -- purpose here.[m
[31m-        local ok, err = dict:set(key, 1)[m
[31m-        if not ok then[m
[31m-            errlog("failed to set peer ok key: ", err)[m
[31m-        end[m
[31m-    else[m
[31m-        succ = succ + 1[m
[31m-        local ok, err = dict:incr(key, 1)[m
[31m-        if not ok then[m
[31m-            errlog("failed to incr peer ok key: ", err)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if succ == 1 then[m
[31m-        key = gen_peer_key("nok:", u, is_backup, id)[m
[31m-        local fails, err = dict:get(key)[m
[31m-        if not fails or fails == 0 then[m
[31m-            if err then[m
[31m-                errlog("failed to get peer nok key: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        else[m
[31m-            local ok, err = dict:set(key, 0)[m
[31m-            if not ok then[m
[31m-                errlog("failed to set peer nok key: ", err)[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    if peer.down and succ >= ctx.rise then[m
[31m-        warn("peer ", peer.name, " is turned up after ", succ,[m
[31m-                " success(es)")[m
[31m-        peer.down = nil[m
[31m-        set_peer_down_globally(ctx, is_backup, id, nil)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- shortcut error function for check_peer()[m
[31m-local function peer_error(ctx, is_backup, id, peer, ...)[m
[31m-  if not peer.down then[m
[31m-      errlog(...)[m
[31m-  end[m
[31m-  peer_fail(ctx, is_backup, id, peer)[m
[31m-end[m
[31m-[m
[31m-local function check_peer(ctx, id, peer, is_backup)[m
[31m-    local ok, err[m
[31m-    local name = peer.name[m
[31m-    local statuses = ctx.statuses[m
[31m-    local req = ctx.http_req[m
[31m-[m
[31m-    local sock, err = stream_sock()[m
[31m-    if not sock then[m
[31m-        errlog("failed to create stream socket: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    sock:settimeout(ctx.timeout)[m
[31m-[m
[31m-    if peer.host then[m
[31m-        -- print("peer port: ", peer.port)[m
[31m-        ok, err = sock:connect(peer.host, peer.port)[m
[31m-    else[m
[31m-        ok, err = sock:connect(name)[m
[31m-    end[m
[31m-    if not ok then[m
[31m-        if not peer.down then[m
[31m-            errlog("failed to connect to ", name, ": ", err)[m
[31m-        end[m
[31m-        return peer_fail(ctx, is_backup, id, peer)[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return peer_error(ctx, is_backup, id, peer,[m
[31m-                          "failed to send request to ", name, ": ", err)[m
[31m-    end[m
[31m-[m
[31m-    local status_line, err = sock:receive()[m
[31m-    if not status_line then[m
[31m-        peer_error(ctx, is_backup, id, peer,[m
[31m-                   "failed to receive status line from ", name, ": ", err)[m
[31m-        if err == "timeout" then[m
[31m-            sock:close()  -- timeout errors do not close the socket.[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    if statuses then[m
[31m-        local from, to, err = re_find(status_line,[m
[31m-                                      [[^HTTP/\d+\.\d+\s+(\d+)]],[m
[31m-                                      "joi", nil, 1)[m
[31m-        if not from then[m
[31m-            peer_error(ctx, is_backup, id, peer,[m
[31m-                       "bad status line from ", name, ": ",[m
[31m-                       status_line)[m
[31m-            sock:close()[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        local status = tonumber(sub(status_line, from, to))[m
[31m-        if not statuses[status] then[m
[31m-            peer_error(ctx, is_backup, id, peer, "bad status code from ",[m
[31m-                       name, ": ", status)[m
[31m-            sock:close()[m
[31m-            return[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    peer_ok(ctx, is_backup, id, peer)[m
[31m-    sock:close()[m
[31m-end[m
[31m-[m
[31m-local function check_peer_range(ctx, from, to, peers, is_backup)[m
[31m-    for i = from, to do[m
[31m-        check_peer(ctx, i - 1, peers[i], is_backup)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function check_peers(ctx, peers, is_backup)[m
[31m-    local n = #peers[m
[31m-    if n == 0 then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local concur = ctx.concurrency[m
[31m-    if concur <= 1 then[m
[31m-        for i = 1, n do[m
[31m-            check_peer(ctx, i - 1, peers[i], is_backup)[m
[31m-        end[m
[31m-    else[m
[31m-        local threads[m
[31m-        local nthr[m
[31m-[m
[31m-        if n <= concur then[m
[31m-            nthr = n - 1[m
[31m-            threads = new_tab(nthr, 0)[m
[31m-            for i = 1, nthr do[m
[31m-[m
[31m-                if debug_mode then[m
[31m-                    debug("spawn a thread checking ",[m
[31m-                          is_backup and "backup" or "primary", " peer ", i - 1)[m
[31m-                end[m
[31m-[m
[31m-                threads[i] = spawn(check_peer, ctx, i - 1, peers[i], is_backup)[m
[31m-            end[m
[31m-            -- use the current "light thread" to run the last task[m
[31m-            if debug_mode then[m
[31m-                debug("check ", is_backup and "backup" or "primary", " peer ",[m
[31m-                      n - 1)[m
[31m-            end[m
[31m-            check_peer(ctx, n - 1, peers[n], is_backup)[m
[31m-[m
[31m-        else[m
[31m-            local group_size = ceil(n / concur)[m
[31m-            local nthr = ceil(n / group_size) - 1[m
[31m-[m
[31m-            threads = new_tab(nthr, 0)[m
[31m-            local from = 1[m
[31m-            local rest = n[m
[31m-            for i = 1, nthr do[m
[31m-                local to[m
[31m-                if rest >= group_size then[m
[31m-                    rest = rest - group_size[m
[31m-                    to = from + group_size - 1[m
[31m-                else[m
[31m-                    rest = 0[m
[31m-                    to = from + rest - 1[m
[31m-                end[m
[31m-[m
[31m-                if debug_mode then[m
[31m-                    debug("spawn a thread checking ",[m
[31m-                          is_backup and "backup" or "primary", " peers ",[m
[31m-                          from - 1, " to ", to - 1)[m
[31m-                end[m
[31m-[m
[31m-                threads[i] = spawn(check_peer_range, ctx, from, to, peers,[m
[31m-                                   is_backup)[m
[31m-                from = from + group_size[m
[31m-                if rest == 0 then[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            if rest > 0 then[m
[31m-                local to = from + rest - 1[m
[31m-[m
[31m-                if debug_mode then[m
[31m-                    debug("check ", is_backup and "backup" or "primary",[m
[31m-                          " peers ", from - 1, " to ", to - 1)[m
[31m-                end[m
[31m-[m
[31m-                check_peer_range(ctx, from, to, peers, is_backup)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        if nthr and nthr > 0 then[m
[31m-            for i = 1, nthr do[m
[31m-                local t = threads[i][m
[31m-                if t then[m
[31m-                    wait(t)[m
[31m-                end[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function upgrade_peers_version(ctx, peers, is_backup)[m
[31m-    local dict = ctx.dict[m
[31m-    local u = ctx.upstream[m
[31m-    local n = #peers[m
[31m-    for i = 1, n do[m
[31m-        local peer = peers[i][m
[31m-        local id = i - 1[m
[31m-        local key = gen_peer_key("d:", u, is_backup, id)[m
[31m-        local down = false[m
[31m-        local res, err = dict:get(key)[m
[31m-        if not res then[m
[31m-            if err then[m
[31m-                errlog("failed to get peer down state: ", err)[m
[31m-            end[m
[31m-        else[m
[31m-            down = true[m
[31m-        end[m
[31m-        if (peer.down and not down) or (not peer.down and down) then[m
[31m-            local ok, err = set_peer_down(u, is_backup, id, down)[m
[31m-            if not ok then[m
[31m-                errlog("failed to set peer down: ", err)[m
[31m-            else[m
[31m-                -- update our cache too[m
[31m-                peer.down = down[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function check_peers_updates(ctx)[m
[31m-    local dict = ctx.dict[m
[31m-    local u = ctx.upstream[m
[31m-    local key = "v:" .. u[m
[31m-    local ver, err = dict:get(key)[m
[31m-    if not ver then[m
[31m-        if err then[m
[31m-            errlog("failed to get peers version: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        if ctx.version > 0 then[m
[31m-            ctx.new_version = true[m
[31m-        end[m
[31m-[m
[31m-    elseif ctx.version < ver then[m
[31m-        debug("upgrading peers version to ", ver)[m
[31m-        upgrade_peers_version(ctx, ctx.primary_peers, false);[m
[31m-        upgrade_peers_version(ctx, ctx.backup_peers, true);[m
[31m-        ctx.version = ver[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function get_lock(ctx)[m
[31m-    local dict = ctx.dict[m
[31m-    local key = "l:" .. ctx.upstream[m
[31m-[m
[31m-    -- the lock is held for the whole interval to prevent multiple[m
[31m-    -- worker processes from sending the test request simultaneously.[m
[31m-    -- here we substract the lock expiration time by 1ms to prevent[m
[31m-    -- a race condition with the next timer event.[m
[31m-    local ok, err = dict:add(key, true, ctx.interval - 0.001)[m
[31m-    if not ok then[m
[31m-        if err == "exists" then[m
[31m-            return nil[m
[31m-        end[m
[31m-        errlog("failed to add key \"", key, "\": ", err)[m
[31m-        return nil[m
[31m-    end[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local function do_check(ctx)[m
[31m-    debug("healthcheck: run a check cycle")[m
[31m-[m
[31m-    check_peers_updates(ctx)[m
[31m-[m
[31m-    if get_lock(ctx) then[m
[31m-        check_peers(ctx, ctx.primary_peers, false)[m
[31m-        check_peers(ctx, ctx.backup_peers, true)[m
[31m-    end[m
[31m-[m
[31m-    if ctx.new_version then[m
[31m-        local key = "v:" .. ctx.upstream[m
[31m-        local dict = ctx.dict[m
[31m-[m
[31m-        if debug_mode then[m
[31m-            debug("publishing peers version ", ctx.version + 1)[m
[31m-        end[m
[31m-[m
[31m-        dict:add(key, 0)[m
[31m-        local new_ver, err = dict:incr(key, 1)[m
[31m-        if not new_ver then[m
[31m-            errlog("failed to publish new peers version: ", err)[m
[31m-        end[m
[31m-[m
[31m-        ctx.version = new_ver[m
[31m-        ctx.new_version = nil[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function update_upstream_checker_status(upstream, success)[m
[31m-    local cnt = upstream_checker_statuses[upstream][m
[31m-    if not cnt then[m
[31m-        cnt = 0[m
[31m-    end[m
[31m-[m
[31m-    if success then[m
[31m-        cnt = cnt + 1[m
[31m-    else[m
[31m-        cnt = cnt - 1[m
[31m-    end[m
[31m-[m
[31m-    upstream_checker_statuses[upstream] = cnt[m
[31m-end[m
[31m-[m
[31m-local check[m
[31m-check = function (premature, ctx)[m
[31m-    if premature then[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = pcall(do_check, ctx)[m
[31m-    if not ok then[m
[31m-        errlog("failed to run healthcheck cycle: ", err)[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = new_timer(ctx.interval, check, ctx)[m
[31m-    if not ok then[m
[31m-        if err ~= "process exiting" then[m
[31m-            errlog("failed to create timer: ", err)[m
[31m-        end[m
[31m-[m
[31m-        update_upstream_checker_status(ctx.upstream, false)[m
[31m-        return[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function preprocess_peers(peers)[m
[31m-    local n = #peers[m
[31m-    for i = 1, n do[m
[31m-        local p = peers[i][m
[31m-        local name = p.name[m
[31m-[m
[31m-        if name then[m
[31m-            local from, to, err = re_find(name, [[^(.*):\d+$]], "jo", nil, 1)[m
[31m-            if from then[m
[31m-                p.host = sub(name, 1, to)[m
[31m-                p.port = tonumber(sub(name, to + 2))[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-    return peers[m
[31m-end[m
[31m-[m
[31m-function _M.spawn_checker(opts)[m
[31m-    local typ = opts.type[m
[31m-    if not typ then[m
[31m-        return nil, "\"type\" option required"[m
[31m-    end[m
[31m-[m
[31m-    if typ ~= "http" then[m
[31m-        return nil, "only \"http\" type is supported right now"[m
[31m-    end[m
[31m-[m
[31m-    local http_req = opts.http_req[m
[31m-    if not http_req then[m
[31m-        return nil, "\"http_req\" option required"[m
[31m-    end[m
[31m-[m
[31m-    local timeout = opts.timeout[m
[31m-    if not timeout then[m
[31m-        timeout = 1000[m
[31m-    end[m
[31m-[m
[31m-    local interval = opts.interval[m
[31m-    if not interval then[m
[31m-        interval = 1[m
[31m-[m
[31m-    else[m
[31m-        interval = interval / 1000[m
[31m-        if interval < 0.002 then  -- minimum 2ms[m
[31m-            interval = 0.002[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local valid_statuses = opts.valid_statuses[m
[31m-    local statuses[m
[31m-    if valid_statuses then[m
[31m-        statuses = new_tab(0, #valid_statuses)[m
[31m-        for _, status in ipairs(valid_statuses) do[m
[31m-            -- print("found good status ", status)[m
[31m-            statuses[status] = true[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- debug("interval: ", interval)[m
[31m-[m
[31m-    local concur = opts.concurrency[m
[31m-    if not concur then[m
[31m-        concur = 1[m
[31m-    end[m
[31m-[m
[31m-    local fall = opts.fall[m
[31m-    if not fall then[m
[31m-        fall = 5[m
[31m-    end[m
[31m-[m
[31m-    local rise = opts.rise[m
[31m-    if not rise then[m
[31m-        rise = 2[m
[31m-    end[m
[31m-[m
[31m-    local shm = opts.shm[m
[31m-    if not shm then[m
[31m-        return nil, "\"shm\" option required"[m
[31m-    end[m
[31m-[m
[31m-    local dict = shared[shm][m
[31m-    if not dict then[m
[31m-        return nil, "shm \"" .. tostring(shm) .. "\" not found"[m
[31m-    end[m
[31m-[m
[31m-    local u = opts.upstream[m
[31m-    if not u then[m
[31m-        return nil, "no upstream specified"[m
[31m-    end[m
[31m-[m
[31m-    local ppeers, err = get_primary_peers(u)[m
[31m-    if not ppeers then[m
[31m-        return nil, "failed to get primary peers: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local bpeers, err = get_backup_peers(u)[m
[31m-    if not bpeers then[m
[31m-        return nil, "failed to get backup peers: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local ctx = {[m
[31m-        upstream = u,[m
[31m-        primary_peers = preprocess_peers(ppeers),[m
[31m-        backup_peers = preprocess_peers(bpeers),[m
[31m-        http_req = http_req,[m
[31m-        timeout = timeout,[m
[31m-        interval = interval,[m
[31m-        dict = dict,[m
[31m-        fall = fall,[m
[31m-        rise = rise,[m
[31m-        statuses = statuses,[m
[31m-        version = 0,[m
[31m-        concurrency = concur,[m
[31m-    }[m
[31m-[m
[31m-    local ok, err = new_timer(0, check, ctx)[m
[31m-    if not ok then[m
[31m-        return nil, "failed to create timer: " .. err[m
[31m-    end[m
[31m-[m
[31m-    update_upstream_checker_status(u, true)[m
[31m-[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local function gen_peers_status_info(peers, bits, idx)[m
[31m-    local npeers = #peers[m
[31m-    for i = 1, npeers do[m
[31m-        local peer = peers[i][m
[31m-        bits[idx] = "        "[m
[31m-        bits[idx + 1] = peer.name[m
[31m-        if peer.down then[m
[31m-            bits[idx + 2] = " DOWN\n"[m
[31m-        else[m
[31m-            bits[idx + 2] = " up\n"[m
[31m-        end[m
[31m-        idx = idx + 3[m
[31m-    end[m
[31m-    return idx[m
[31m-end[m
[31m-[m
[31m-function _M.status_page()[m
[31m-    -- generate an HTML page[m
[31m-    local us, err = get_upstreams()[m
[31m-    if not us then[m
[31m-        return "failed to get upstream names: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local n = #us[m
[31m-    local bits = new_tab(n * 20, 0)[m
[31m-    local idx = 1[m
[31m-    for i = 1, n do[m
[31m-        if i > 1 then[m
[31m-            bits[idx] = "\n"[m
[31m-            idx = idx + 1[m
[31m-        end[m
[31m-[m
[31m-        local u = us[i][m
[31m-[m
[31m-        bits[idx] = "Upstream "[m
[31m-        bits[idx + 1] = u[m
[31m-        idx = idx + 2[m
[31m-[m
[31m-        local ncheckers = upstream_checker_statuses[u][m
[31m-        if not ncheckers or ncheckers == 0 then[m
[31m-            bits[idx] = " (NO checkers)"[m
[31m-            idx = idx + 1[m
[31m-        end[m
[31m-[m
[31m-        bits[idx] = "\n    Primary Peers\n"[m
[31m-        idx = idx + 1[m
[31m-[m
[31m-        local peers, err = get_primary_peers(u)[m
[31m-        if not peers then[m
[31m-            return "failed to get primary peers in upstream " .. u .. ": "[m
[31m-                   .. err[m
[31m-        end[m
[31m-[m
[31m-        idx = gen_peers_status_info(peers, bits, idx)[m
[31m-[m
[31m-        bits[idx] = "    Backup Peers\n"[m
[31m-        idx = idx + 1[m
[31m-[m
[31m-        peers, err = get_backup_peers(u)[m
[31m-        if not peers then[m
[31m-            return "failed to get backup peers in upstream " .. u .. ": "[m
[31m-                   .. err[m
[31m-        end[m
[31m-[m
[31m-        idx = gen_peers_status_info(peers, bits, idx)[m
[31m-    end[m
[31m-    return concat(bits)[m
[31m-end[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 792c359..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,1373 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6 + 9);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = <<_EOC_;[m
[31m-    lua_socket_log_errors off;[m
[31m-    lua_package_path "$pwd/../lua-resty-lock/?.lua;$pwd/lib/?.lua;$pwd/t/lib/?.lua;;";[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: health check (good case), status ignored by default[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[warn][m
[31m-was checked to be not ok[m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|publishing peers version \d+|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){3,5}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: health check (bad case), no listening port in the backup peer[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 DOWN[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: failed to connect to 127.0.0.1:12356: connection refused[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|publishing peers version \d+|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12356 is turned down after 2 failure\(s\)[m
[31m-publishing peers version 1[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be not ok[m
[31m-){2,4}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: health check (bad case), no listening port in a primary peer[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 DOWN[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: failed to connect to 127.0.0.1:12355: connection refused[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned down after 2 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){2,4}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: health check (bad case), bad status[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-        valid_statuses = {200, 503},[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 DOWN[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|healthcheck: bad status code from .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: bad status code from 127\.0\.0\.1:12355: 404[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: bad status code from 127\.0\.0\.1:12355: 404[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned down after 2 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){1,4}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: health check (bad case), timed out[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        echo_sleep 0.5;[m
[31m-        echo ok;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        timeout = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 DOWN[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: failed to receive status line from 127.0.0.1:12354: timeout[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|healthcheck: bad status code from .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12354 is turned down after 2 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){0,2}$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: health check (bad case), bad status, and then rise again[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        content_by_lua '[m
[31m-            local cnt = package.loaded.cnt[m
[31m-            if not cnt then[m
[31m-                cnt = 0[m
[31m-            end[m
[31m-            cnt = cnt + 1[m
[31m-            package.loaded.cnt = cnt[m
[31m-            if cnt >= 3 then[m
[31m-                return ngx.exit(200)[m
[31m-            end[m
[31m-            return ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 1,[m
[31m-        rise = 2,[m
[31m-        valid_statuses = {200, 503},[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|warn\(\): .*(?=,)|healthcheck: bad status code from .*(?=,)|publishing peers version \d+|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: bad status code from 127\.0\.0\.1:12355: 403[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned down after 1 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-publishing peers version 1[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned up after 2 success\(es\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-publishing peers version 2[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){1,3}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: peers version upgrade (make up peers down)[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    local dict = ngx.shared.healthcheck[m
[31m-    dict:flush_all()[m
[31m-    assert(dict:set("v:foo.com", 1))[m
[31m-    assert(dict:set("d:foo.com:b0", true))[m
[31m-    assert(dict:set("d:foo.com:p1", true))[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-was checked to be not ok[m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|publishing peers version \d+|warn\(\): .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^upgrading peers version to 1[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12355 is turned up after 2 success\(es\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12356 is turned up after 2 success\(es\)[m
[31m-publishing peers version 2[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){2,4}$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: peers version upgrade (make down peers up)[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354 down;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    local dict = ngx.shared.healthcheck[m
[31m-    dict:flush_all()[m
[31m-    assert(dict:set("v:foo.com", 1))[m
[31m-    -- assert(dict:set("d:foo.com:b0", true))[m
[31m-    -- assert(dict:set("d:foo.com:p1", true))[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 DOWN[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m-[m
[31m---- error_log[m
[31m-failed to connect to 127.0.0.1:12354: connection refused[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|publishing peers version \d+|warn\(\): .*(?=,)|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^upgrading peers version to 1[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-warn\(\): healthcheck: peer 127\.0\.0\.1:12354 is turned down after 2 failure\(s\)[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-publishing peers version 2[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be not ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12355 was checked to be ok[m
[31m-healthcheck: peer 127\.0\.0\.1:12356 was checked to be ok[m
[31m-){3,5}$/[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: concurrency == 2 (odd number of peers)[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356;[m
[31m-    server 127.0.0.1:12357;[m
[31m-    server 127.0.0.1:12358;[m
[31m-    server 127.0.0.1:12359 backup;[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-        concurrency = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: peer 127.0.0.1:12354 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12355 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12356 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12357 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12358 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12359 is turned down after 2 failure(s)[m
[31m---- grep_error_log eval: qr/spawn a thread checking .* peer.*|check .*? peer.*/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^(?:spawn a thread checking primary peers 0 to 2[m
[31m-check primary peers 3 to 4[m
[31m-check backup peer 0[m
[31m-){4,6}$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: concurrency == 3 (odd number of peers)[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356;[m
[31m-    server 127.0.0.1:12359 backup;[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-        concurrency = 3,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: peer 127.0.0.1:12354 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12355 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12356 is turned down after 2 failure(s)[m
[31m-healthcheck: peer 127.0.0.1:12359 is turned down after 2 failure(s)[m
[31m---- grep_error_log eval: qr/spawn a thread checking .* peer.*|check .*? peer.*/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^(?:spawn a thread checking primary peer 0[m
[31m-spawn a thread checking primary peer 1[m
[31m-check primary peer 2[m
[31m-check backup peer 0[m
[31m-){4,6}$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: health check (good case), status ignored by default[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:7983;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua '[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\\\\r\\\\nHost: localhost\\\\r\\\\n\\\\r\\\\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 1,[m
[31m-        valid_statuses = {200},[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-';[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.12)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- tcp_listen: 7983[m
[31m---- tcp_query eval: "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n"[m
[31m---- tcp_reply[m
[31m-<html>[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:7983 DOWN[m
[31m-    Backup Peers[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-bad argument #2 to 'sub' (number expected, got nil)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: health check (bad case), bad status, multiple upstreams[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-upstream bar.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12357;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    listen 12357;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 2m;[m
[31m-init_worker_by_lua_block {[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    for i, upstream in ipairs{'foo.com', 'bar.com'} do[m
[31m-        local ok, err = hc.spawn_checker{[m
[31m-            shm = "healthcheck",[m
[31m-            upstream = upstream,[m
[31m-            type = "http",[m
[31m-            http_req = "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n",[m
[31m-            interval = 50,  -- ms[m
[31m-            fall = 1,[m
[31m-            valid_statuses = {200, 503},[m
[31m-        }[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    end[m
[31m-}[m
[31m-[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 DOWN[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-[m
[31m-Upstream bar.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 DOWN[m
[31m-        127.0.0.1:12357 DOWN[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-healthcheck: bad status code from 127.0.0.1:12355[m
[31m-healthcheck: bad status code from 127.0.0.1:12357[m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: crashes in init_by_lua_worker*[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server 127.0.0.1:12355;[m
[31m-    server 127.0.0.1:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua_block {[m
[31m-    error("bad thing!")[m
[31m-}[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com (NO checkers)[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        127.0.0.1:12355 up[m
[31m-    Backup Peers[m
[31m-        127.0.0.1:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: 127.0.0.1:12355[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-failed to run healthcheck cycle[m
[31m---- error_log[m
[31m-bad thing![m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: health check with ipv6 backend (good case), status ignored by default[m
[31m---- http_config eval[m
[31m-"$::HttpConfig"[m
[31m-. q{[m
[31m-upstream foo.com {[m
[31m-    server 127.0.0.1:12354;[m
[31m-    server [::1]:12355;[m
[31m-    server [0:0::1]:12356 backup;[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen 12354;[m
[31m-    location = /status {[m
[31m-        return 200;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen [::1]:12355;[m
[31m-    location = /status {[m
[31m-        return 404;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-server {[m
[31m-    listen [0:0::1]:12356;[m
[31m-    location = /status {[m
[31m-        return 503;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-lua_shared_dict healthcheck 1m;[m
[31m-init_worker_by_lua_block {[m
[31m-    ngx.shared.healthcheck:flush_all()[m
[31m-    local hc = require "resty.upstream.healthcheck"[m
[31m-    local ok, err = hc.spawn_checker{[m
[31m-        shm = "healthcheck",[m
[31m-        upstream = "foo.com",[m
[31m-        type = "http",[m
[31m-        http_req = "GET /status HTTP/1.0\r\nHost: localhost\r\n\r\n",[m
[31m-        interval = 100,  -- 100ms[m
[31m-        fall = 2,[m
[31m-    }[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-}[m
[31m-}[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_log off;[m
[31m-        content_by_lua_block {[m
[31m-            ngx.sleep(0.52)[m
[31m-[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-            ngx.print(hc.status_page())[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("upstream addr: ", res.header["X-Foo"])[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-        proxy_pass http://foo.com/;[m
[31m-        header_filter_by_lua_block {[m
[31m-            ngx.header["X-Foo"] = ngx.var.upstream_addr;[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Upstream foo.com[m
[31m-    Primary Peers[m
[31m-        127.0.0.1:12354 up[m
[31m-        [::1]:12355 up[m
[31m-    Backup Peers[m
[31m-        [0:0::1]:12356 up[m
[31m-upstream addr: 127.0.0.1:12354[m
[31m-upstream addr: [::1]:12355[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[warn][m
[31m-was checked to be not ok[m
[31m-failed to run healthcheck cycle[m
[31m---- grep_error_log eval: qr/healthcheck: .*? was checked .*|publishing peers version \d+|upgrading peers version to \d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer \[::1\]:12355 was checked to be ok[m
[31m-healthcheck: peer \[0:0::1\]:12356 was checked to be ok[m
[31m-(?:healthcheck: peer 127\.0\.0\.1:12354 was checked to be ok[m
[31m-healthcheck: peer \[::1\]:12355 was checked to be ok[m
[31m-healthcheck: peer \[0:0::1\]:12356 was checked to be ok[m
[31m-){3,7}$/[m
[31m---- timeout: 6[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex c276f4c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-upstream-healthcheck-0.04/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,91 +0,0 @@[m
[31m-# Valgrind suppression file for LuaJIT 2.0.[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_cmp[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Addr1[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   Optimized string compare[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Param[m
[31m-    epoll_ctl(event)[m
[31m-    fun:epoll_ctl[m
[31m-    fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Param[m
[31m-    epoll_ctl(event)[m
[31m-    fun:epoll_ctl[m
[31m-    fun:ngx_epoll_add_connection[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Addr4[m
[31m-    fun:ngx_init_cycle[m
[31m-    fun:ngx_master_process_cycle[m
[31m-    fun:main[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Cond[m
[31m-    fun:ngx_init_cycle[m
[31m-    fun:ngx_master_process_cycle[m
[31m-    fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_notify_init[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 19dfbba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-*.swp[m
[31m-*.swo[m
[31m-*~[m
[31m-go[m
[31m-t/servroot/[m
[31m-reindex[m
[31m-*.t_[m
[31m-tags[m
[31m-a.patch[m
[31m-*.html[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/Makefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/Makefile[m
[1mdeleted file mode 100644[m
[1mindex c0b7bc7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/Makefile[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-OPENRESTY_PREFIX=/usr/local/openresty[m
[31m-[m
[31m-PREFIX ?=          /usr/local[m
[31m-LUA_INCLUDE_DIR ?= $(PREFIX)/include[m
[31m-LUA_LIB_DIR ?=     $(PREFIX)/lib/lua/$(LUA_VERSION)[m
[31m-INSTALL ?= install[m
[31m-[m
[31m-.PHONY: all test install[m
[31m-[m
[31m-all: ;[m
[31m-[m
[31m-install: all[m
[31m-	$(INSTALL) -d $(DESTDIR)$(LUA_LIB_DIR)/resty/websocket[m
[31m-	$(INSTALL) lib/resty/websocket/*.lua $(DESTDIR)$(LUA_LIB_DIR)/resty/websocket/[m
[31m-[m
[31m-test: all[m
[31m-	PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/client.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/client.lua[m
[1mdeleted file mode 100644[m
[1mindex 41e41bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/client.lua[m
[1m+++ /dev/null[m
[36m@@ -1,336 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m--- FIXME: this library is very rough and is currently just for testing[m
[31m---        the websocket server.[m
[31m-[m
[31m-[m
[31m-local wbproto = require "resty.websocket.protocol"[m
[31m-local bit = require "bit"[m
[31m-[m
[31m-[m
[31m-local _recv_frame = wbproto.recv_frame[m
[31m-local _send_frame = wbproto.send_frame[m
[31m-local new_tab = wbproto.new_tab[m
[31m-local tcp = ngx.socket.tcp[m
[31m-local re_match = ngx.re.match[m
[31m-local encode_base64 = ngx.encode_base64[m
[31m-local concat = table.concat[m
[31m-local char = string.char[m
[31m-local str_find = string.find[m
[31m-local rand = math.random[m
[31m-local rshift = bit.rshift[m
[31m-local band = bit.band[m
[31m-local setmetatable = setmetatable[m
[31m-local type = type[m
[31m-local debug = ngx.config.debug[m
[31m-local ngx_log = ngx.log[m
[31m-local ngx_DEBUG = ngx.DEBUG[m
[31m-local ssl_support = true[m
[31m-[m
[31m-if not ngx.config[m
[31m-    or not ngx.config.ngx_lua_version[m
[31m-    or ngx.config.ngx_lua_version < 9011[m
[31m-then[m
[31m-    ssl_support = false[m
[31m-end[m
[31m-[m
[31m-local _M = new_tab(0, 13)[m
[31m-_M._VERSION = '0.05'[m
[31m-[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(self, opts)[m
[31m-    local sock, err = tcp()[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local max_payload_len, send_unmasked, timeout[m
[31m-    if opts then[m
[31m-        max_payload_len = opts.max_payload_len[m
[31m-        send_unmasked = opts.send_unmasked[m
[31m-        timeout = opts.timeout[m
[31m-[m
[31m-        if timeout then[m
[31m-            sock:settimeout(timeout)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({[m
[31m-        sock = sock,[m
[31m-        max_payload_len = max_payload_len or 65535,[m
[31m-        send_unmasked = send_unmasked,[m
[31m-    }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.connect(self, uri, opts)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    local m, err = re_match(uri, [[^(wss?)://([^:/]+)(?::(\d+))?(.*)]], "jo")[m
[31m-    if not m then[m
[31m-        if err then[m
[31m-            return nil, "failed to match the uri: " .. err[m
[31m-        end[m
[31m-[m
[31m-        return nil, "bad websocket uri"[m
[31m-    end[m
[31m-[m
[31m-    local scheme = m[1][m
[31m-    local host = m[2][m
[31m-    local port = m[3][m
[31m-    local path = m[4][m
[31m-[m
[31m-    -- ngx.say("host: ", host)[m
[31m-    -- ngx.say("port: ", port)[m
[31m-[m
[31m-    if not port then[m
[31m-        port = 80[m
[31m-    end[m
[31m-[m
[31m-    if path == "" then[m
[31m-        path = "/"[m
[31m-    end[m
[31m-[m
[31m-    local ssl_verify, proto_header, origin_header, sock_opts = false[m
[31m-[m
[31m-    if opts then[m
[31m-        local protos = opts.protocols[m
[31m-        if protos then[m
[31m-            if type(protos) == "table" then[m
[31m-                proto_header = "\r\nSec-WebSocket-Protocol: "[m
[31m-                               .. concat(protos, ",")[m
[31m-[m
[31m-            else[m
[31m-                proto_header = "\r\nSec-WebSocket-Protocol: " .. protos[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local origin = opts.origin[m
[31m-        if origin then[m
[31m-            origin_header = "\r\nOrigin: " .. origin[m
[31m-        end[m
[31m-[m
[31m-        local pool = opts.pool[m
[31m-        if pool then[m
[31m-            sock_opts = { pool = pool }[m
[31m-        end[m
[31m-[m
[31m-        if opts.ssl_verify then[m
[31m-            if not ssl_support then[m
[31m-                return nil, "ngx_lua 0.9.11+ required for SSL sockets"[m
[31m-            end[m
[31m-            ssl_verify = true[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local ok, err[m
[31m-    if sock_opts then[m
[31m-        ok, err = sock:connect(host, port, sock_opts)[m
[31m-    else[m
[31m-        ok, err = sock:connect(host, port)[m
[31m-    end[m
[31m-    if not ok then[m
[31m-        return nil, "failed to connect: " .. err[m
[31m-    end[m
[31m-[m
[31m-    if scheme == "wss" then[m
[31m-        if not ssl_support then[m
[31m-            return nil, "ngx_lua 0.9.11+ required for SSL sockets"[m
[31m-        end[m
[31m-        ok, err = sock:sslhandshake(false, host, ssl_verify)[m
[31m-        if not ok then[m
[31m-            return nil, "ssl handshake failed: " .. err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- check for connections from pool:[m
[31m-[m
[31m-    local count,err = sock:getreusedtimes()[m
[31m-    if not count then[m
[31m-        return nil, "failed to get reused times: " .. err[m
[31m-    end[m
[31m-    if count > 0 then[m
[31m-        -- being a reused connection (must have done handshake)[m
[31m-        return 1[m
[31m-    end[m
[31m-[m
[31m-    -- do the websocket handshake:[m
[31m-[m
[31m-    local bytes = char(rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1, rand(256) - 1, rand(256) - 1,[m
[31m-                       rand(256) - 1)[m
[31m-[m
[31m-    local key = encode_base64(bytes)[m
[31m-    local req = "GET " .. path .. " HTTP/1.1\r\nUpgrade: websocket\r\nHost: "[m
[31m-                .. host .. ":" .. port[m
[31m-                .. "\r\nSec-WebSocket-Key: " .. key[m
[31m-                .. (proto_header or "")[m
[31m-                .. "\r\nSec-WebSocket-Version: 13"[m
[31m-                .. (origin_header or "")[m
[31m-                .. "\r\nConnection: Upgrade\r\n\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send the handshake request: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local header_reader = sock:receiveuntil("\r\n\r\n")[m
[31m-    -- FIXME: check for too big response headers[m
[31m-    local header, err, partial = header_reader()[m
[31m-    if not header then[m
[31m-        return nil, "failed to receive response header: " .. err[m
[31m-    end[m
[31m-[m
[31m-    -- FIXME: verify the response headers[m
[31m-[m
[31m-    m, err = re_match(header, [[^\s*HTTP/1\.1\s+]], "jo")[m
[31m-    if not m then[m
[31m-        return nil, "bad HTTP response status line: " .. header[m
[31m-    end[m
[31m-[m
[31m-    return 1[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, time)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(time)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.recv_frame(self)[m
[31m-    if self.fatal then[m
[31m-        return nil, nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    local data, typ, err =  _recv_frame(sock, self.max_payload_len, false)[m
[31m-    if not data and not str_find(err, ": timeout", 1, true) then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-    return data, typ, err[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function send_frame(self, fin, opcode, payload, max_payload_len)[m
[31m-    if self.fatal then[m
[31m-        return nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    if self.closed then[m
[31m-        return nil, "already closed"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = _send_frame(sock, fin, opcode, payload,[m
[31m-                                   self.max_payload_len,[m
[31m-                                   not self.send_unmasked)[m
[31m-    if not bytes then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-    return bytes, err[m
[31m-end[m
[31m-_M.send_frame = send_frame[m
[31m-[m
[31m-[m
[31m-function _M.send_text(self, data)[m
[31m-    return send_frame(self, true, 0x1, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_binary(self, data)[m
[31m-    return send_frame(self, true, 0x2, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function send_close(self, code, msg)[m
[31m-    local payload[m
[31m-    if code then[m
[31m-        if type(code) ~= "number" or code > 0x7fff then[m
[31m-            return nil, "bad status code"[m
[31m-        end[m
[31m-        payload = char(band(rshift(code, 8), 0xff), band(code, 0xff))[m
[31m-                        .. (msg or "")[m
[31m-    end[m
[31m-[m
[31m-    if debug then[m
[31m-        ngx_log(ngx_DEBUG, "sending the close frame")[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = send_frame(self, true, 0x8, payload)[m
[31m-[m
[31m-    if not bytes then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-[m
[31m-    self.closed = true[m
[31m-[m
[31m-    return bytes, err[m
[31m-end[m
[31m-_M.send_close = send_close[m
[31m-[m
[31m-[m
[31m-function _M.send_ping(self, data)[m
[31m-    return send_frame(self, true, 0x9, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_pong(self, data)[m
[31m-    return send_frame(self, true, 0xa, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.close(self)[m
[31m-    if self.fatal then[m
[31m-        return nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    if not self.closed then[m
[31m-        local bytes, err = send_close(self)[m
[31m-        if not bytes then[m
[31m-            return nil, "failed to send close frame: " .. err[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return sock:close()[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_keepalive(self, ...)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized"[m
[31m-    end[m
[31m-[m
[31m-    return sock:setkeepalive(...)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/protocol.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/protocol.lua[m
[1mdeleted file mode 100644[m
[1mindex 37050de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/protocol.lua[m
[1m+++ /dev/null[m
[36m@@ -1,327 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local bit = require "bit"[m
[31m-[m
[31m-[m
[31m-local byte = string.byte[m
[31m-local char = string.char[m
[31m-local sub = string.sub[m
[31m-local band = bit.band[m
[31m-local bor = bit.bor[m
[31m-local bxor = bit.bxor[m
[31m-local lshift = bit.lshift[m
[31m-local rshift = bit.rshift[m
[31m-local tohex = bit.tohex[m
[31m-local concat = table.concat[m
[31m-local str_char = string.char[m
[31m-local rand = math.random[m
[31m-local type = type[m
[31m-local debug = ngx.config.debug[m
[31m-local ngx_log = ngx.log[m
[31m-local ngx_DEBUG = ngx.DEBUG[m
[31m-[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 5)[m
[31m-[m
[31m-_M.new_tab = new_tab[m
[31m-_M._VERSION = '0.05'[m
[31m-[m
[31m-[m
[31m-local types = {[m
[31m-    [0x0] = "continuation",[m
[31m-    [0x1] = "text",[m
[31m-    [0x2] = "binary",[m
[31m-    [0x8] = "close",[m
[31m-    [0x9] = "ping",[m
[31m-    [0xa] = "pong",[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function _M.recv_frame(sock, max_payload_len, force_masking)[m
[31m-    local data, err = sock:receive(2)[m
[31m-    if not data then[m
[31m-        return nil, nil, "failed to receive the first 2 bytes: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local fst, snd = byte(data, 1, 2)[m
[31m-[m
[31m-    local fin = band(fst, 0x80) ~= 0[m
[31m-    -- print("fin: ", fin)[m
[31m-[m
[31m-    if band(fst, 0x70) ~= 0 then[m
[31m-        return nil, nil, "bad RSV1, RSV2, or RSV3 bits"[m
[31m-    end[m
[31m-[m
[31m-    local opcode = band(fst, 0x0f)[m
[31m-    -- print("opcode: ", tohex(opcode))[m
[31m-[m
[31m-    if opcode >= 0x3 and opcode <= 0x7 then[m
[31m-        return nil, nil, "reserved non-control frames"[m
[31m-    end[m
[31m-[m
[31m-    if opcode >= 0xb and opcode <= 0xf then[m
[31m-        return nil, nil, "reserved control frames"[m
[31m-    end[m
[31m-[m
[31m-    local mask = band(snd, 0x80) ~= 0[m
[31m-[m
[31m-    if debug then[m
[31m-        ngx_log(ngx_DEBUG, "recv_frame: mask bit: ", mask and 1 or 0)[m
[31m-    end[m
[31m-[m
[31m-    if force_masking and not mask then[m
[31m-        return nil, nil, "frame unmasked"[m
[31m-    end[m
[31m-[m
[31m-    local payload_len = band(snd, 0x7f)[m
[31m-    -- print("payload len: ", payload_len)[m
[31m-[m
[31m-    if payload_len == 126 then[m
[31m-        local data, err = sock:receive(2)[m
[31m-        if not data then[m
[31m-            return nil, nil, "failed to receive the 2 byte payload length: "[m
[31m-                             .. (err or "unknown")[m
[31m-        end[m
[31m-[m
[31m-        payload_len = bor(lshift(byte(data, 1), 8), byte(data, 2))[m
[31m-[m
[31m-    elseif payload_len == 127 then[m
[31m-        local data, err = sock:receive(8)[m
[31m-        if not data then[m
[31m-            return nil, nil, "failed to receive the 8 byte payload length: "[m
[31m-                             .. (err or "unknown")[m
[31m-        end[m
[31m-[m
[31m-        if byte(data, 1) ~= 0[m
[31m-           or byte(data, 2) ~= 0[m
[31m-           or byte(data, 3) ~= 0[m
[31m-           or byte(data, 4) ~= 0[m
[31m-        then[m
[31m-            return nil, nil, "payload len too large"[m
[31m-        end[m
[31m-[m
[31m-        local fifth = byte(data, 5)[m
[31m-        if band(fifth, 0x80) ~= 0 then[m
[31m-            return nil, nil, "payload len too large"[m
[31m-        end[m
[31m-[m
[31m-        payload_len = bor(lshift(fifth, 24),[m
[31m-                          lshift(byte(data, 6), 16),[m
[31m-                          lshift(byte(data, 7), 8),[m
[31m-                          byte(data, 8))[m
[31m-    end[m
[31m-[m
[31m-    if band(opcode, 0x8) ~= 0 then[m
[31m-        -- being a control frame[m
[31m-        if payload_len > 125 then[m
[31m-            return nil, nil, "too long payload for control frame"[m
[31m-        end[m
[31m-[m
[31m-        if not fin then[m
[31m-            return nil, nil, "fragmented control frame"[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    -- print("payload len: ", payload_len, ", max payload len: ",[m
[31m-          -- max_payload_len)[m
[31m-[m
[31m-    if payload_len > max_payload_len then[m
[31m-        return nil, nil, "exceeding max payload len"[m
[31m-    end[m
[31m-[m
[31m-    local rest[m
[31m-    if mask then[m
[31m-        rest = payload_len + 4[m
[31m-[m
[31m-    else[m
[31m-        rest = payload_len[m
[31m-    end[m
[31m-    -- print("rest: ", rest)[m
[31m-[m
[31m-    local data[m
[31m-    if rest > 0 then[m
[31m-        data, err = sock:receive(rest)[m
[31m-        if not data then[m
[31m-            return nil, nil, "failed to read masking-len and payload: "[m
[31m-                             .. (err or "unknown")[m
[31m-        end[m
[31m-    else[m
[31m-        data = ""[m
[31m-    end[m
[31m-[m
[31m-    -- print("received rest")[m
[31m-[m
[31m-    if opcode == 0x8 then[m
[31m-        -- being a close frame[m
[31m-        if payload_len > 0 then[m
[31m-            if payload_len < 2 then[m
[31m-                return nil, nil, "close frame with a body must carry a 2-byte"[m
[31m-                                 .. " status code"[m
[31m-            end[m
[31m-[m
[31m-            local msg, code[m
[31m-            if mask then[m
[31m-                local fst = bxor(byte(data, 4 + 1), byte(data, 1))[m
[31m-                local snd = bxor(byte(data, 4 + 2), byte(data, 2))[m
[31m-                code = bor(lshift(fst, 8), snd)[m
[31m-[m
[31m-                if payload_len > 2 then[m
[31m-                    -- TODO string.buffer optimizations[m
[31m-                    local bytes = new_tab(payload_len - 2, 0)[m
[31m-                    for i = 3, payload_len do[m
[31m-                        bytes[i - 2] = str_char(bxor(byte(data, 4 + i),[m
[31m-                                                     byte(data,[m
[31m-                                                          (i - 1) % 4 + 1)))[m
[31m-                    end[m
[31m-                    msg = concat(bytes)[m
[31m-[m
[31m-                else[m
[31m-                    msg = ""[m
[31m-                end[m
[31m-[m
[31m-            else[m
[31m-                local fst = byte(data, 1)[m
[31m-                local snd = byte(data, 2)[m
[31m-                code = bor(lshift(fst, 8), snd)[m
[31m-[m
[31m-                -- print("parsing unmasked close frame payload: ", payload_len)[m
[31m-[m
[31m-                if payload_len > 2 then[m
[31m-                    msg = sub(data, 3)[m
[31m-[m
[31m-                else[m
[31m-                    msg = ""[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            return msg, "close", code[m
[31m-        end[m
[31m-[m
[31m-        return "", "close", nil[m
[31m-    end[m
[31m-[m
[31m-    local msg[m
[31m-    if mask then[m
[31m-        -- TODO string.buffer optimizations[m
[31m-        local bytes = new_tab(payload_len, 0)[m
[31m-        for i = 1, payload_len do[m
[31m-            bytes[i] = str_char(bxor(byte(data, 4 + i),[m
[31m-                                     byte(data, (i - 1) % 4 + 1)))[m
[31m-        end[m
[31m-        msg = concat(bytes)[m
[31m-[m
[31m-    else[m
[31m-        msg = data[m
[31m-    end[m
[31m-[m
[31m-    return msg, types[opcode], not fin and "again" or nil[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function build_frame(fin, opcode, payload_len, payload, masking)[m
[31m-    -- XXX optimize this when we have string.buffer in LuaJIT 2.1[m
[31m-    local fst[m
[31m-    if fin then[m
[31m-        fst = bor(0x80, opcode)[m
[31m-    else[m
[31m-        fst = opcode[m
[31m-    end[m
[31m-[m
[31m-    local snd, extra_len_bytes[m
[31m-    if payload_len <= 125 then[m
[31m-        snd = payload_len[m
[31m-        extra_len_bytes = ""[m
[31m-[m
[31m-    elseif payload_len <= 65535 then[m
[31m-        snd = 126[m
[31m-        extra_len_bytes = char(band(rshift(payload_len, 8), 0xff),[m
[31m-                               band(payload_len, 0xff))[m
[31m-[m
[31m-    else[m
[31m-        if band(payload_len, 0x7fffffff) < payload_len then[m
[31m-            return nil, "payload too big"[m
[31m-        end[m
[31m-[m
[31m-        snd = 127[m
[31m-        -- XXX we only support 31-bit length here[m
[31m-        extra_len_bytes = char(0, 0, 0, 0, band(rshift(payload_len, 24), 0xff),[m
[31m-                               band(rshift(payload_len, 16), 0xff),[m
[31m-                               band(rshift(payload_len, 8), 0xff),[m
[31m-                               band(payload_len, 0xff))[m
[31m-    end[m
[31m-[m
[31m-    local masking_key[m
[31m-    if masking then[m
[31m-        -- set the mask bit[m
[31m-        snd = bor(snd, 0x80)[m
[31m-        local key = rand(0xffffffff)[m
[31m-        masking_key = char(band(rshift(key, 24), 0xff),[m
[31m-                           band(rshift(key, 16), 0xff),[m
[31m-                           band(rshift(key, 8), 0xff),[m
[31m-                           band(key, 0xff))[m
[31m-[m
[31m-        -- TODO string.buffer optimizations[m
[31m-        local bytes = new_tab(payload_len, 0)[m
[31m-        for i = 1, payload_len do[m
[31m-            bytes[i] = str_char(bxor(byte(payload, i),[m
[31m-                                     byte(masking_key, (i - 1) % 4 + 1)))[m
[31m-        end[m
[31m-        payload = concat(bytes)[m
[31m-[m
[31m-    else[m
[31m-        masking_key = ""[m
[31m-    end[m
[31m-[m
[31m-    return char(fst, snd) .. extra_len_bytes .. masking_key .. payload[m
[31m-end[m
[31m-_M.build_frame = build_frame[m
[31m-[m
[31m-[m
[31m-function _M.send_frame(sock, fin, opcode, payload, max_payload_len, masking)[m
[31m-    -- ngx.log(ngx.WARN, ngx.var.uri, ": masking: ", masking)[m
[31m-[m
[31m-    if not payload then[m
[31m-        payload = ""[m
[31m-[m
[31m-    elseif type(payload) ~= "string" then[m
[31m-        payload = tostring(payload)[m
[31m-    end[m
[31m-[m
[31m-    local payload_len = #payload[m
[31m-[m
[31m-    if payload_len > max_payload_len then[m
[31m-        return nil, "payload too big"[m
[31m-    end[m
[31m-[m
[31m-    if band(opcode, 0x8) ~= 0 then[m
[31m-        -- being a control frame[m
[31m-        if payload_len > 125 then[m
[31m-            return nil, "too much payload for control frame"[m
[31m-        end[m
[31m-        if not fin then[m
[31m-            return nil, "fragmented control frame"[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    local frame, err = build_frame(fin, opcode, payload_len, payload,[m
[31m-                                   masking)[m
[31m-    if not frame then[m
[31m-        return nil, "failed to build frame: " .. err[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send(frame)[m
[31m-    if not bytes then[m
[31m-        return nil, "failed to send frame: " .. err[m
[31m-    end[m
[31m-    return bytes[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/server.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/server.lua[m
[1mdeleted file mode 100644[m
[1mindex 98cc1f1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/lib/resty/websocket/server.lua[m
[1m+++ /dev/null[m
[36m@@ -1,209 +0,0 @@[m
[31m--- Copyright (C) Yichun Zhang (agentzh)[m
[31m-[m
[31m-[m
[31m-local bit = require "bit"[m
[31m-local wbproto = require "resty.websocket.protocol"[m
[31m-[m
[31m-local new_tab = wbproto.new_tab[m
[31m-local _recv_frame = wbproto.recv_frame[m
[31m-local _send_frame = wbproto.send_frame[m
[31m-local http_ver = ngx.req.http_version[m
[31m-local req_sock = ngx.req.socket[m
[31m-local ngx_header = ngx.header[m
[31m-local req_headers = ngx.req.get_headers[m
[31m-local str_lower = string.lower[m
[31m-local char = string.char[m
[31m-local str_find = string.find[m
[31m-local sha1_bin = ngx.sha1_bin[m
[31m-local base64 = ngx.encode_base64[m
[31m-local ngx = ngx[m
[31m-local read_body = ngx.req.read_body[m
[31m-local band = bit.band[m
[31m-local rshift = bit.rshift[m
[31m-local type = type[m
[31m-local setmetatable = setmetatable[m
[31m--- local print = print[m
[31m-[m
[31m-[m
[31m-local _M = new_tab(0, 10)[m
[31m-_M._VERSION = '0.05'[m
[31m-[m
[31m-local mt = { __index = _M }[m
[31m-[m
[31m-[m
[31m-function _M.new(self, opts)[m
[31m-    if ngx.headers_sent then[m
[31m-        return nil, "response header already sent"[m
[31m-    end[m
[31m-[m
[31m-    read_body()[m
[31m-[m
[31m-    if http_ver() ~= 1.1 then[m
[31m-        return nil, "bad http version"[m
[31m-    end[m
[31m-[m
[31m-    local headers = req_headers()[m
[31m-[m
[31m-    local val = headers.upgrade[m
[31m-    if type(val) == "table" then[m
[31m-        val = val[1][m
[31m-    end[m
[31m-    if not val or str_lower(val) ~= "websocket" then[m
[31m-        return nil, "bad \"upgrade\" request header"[m
[31m-    end[m
[31m-[m
[31m-    val = headers.connection[m
[31m-    if type(val) == "table" then[m
[31m-        val = val[1][m
[31m-    end[m
[31m-    if not val or not str_find(str_lower(val), "upgrade", 1, true) then[m
[31m-        return nil, "bad \"connection\" request header"[m
[31m-    end[m
[31m-[m
[31m-    local key = headers["sec-websocket-key"][m
[31m-    if type(key) == "table" then[m
[31m-        key = key[1][m
[31m-    end[m
[31m-    if not key then[m
[31m-        return nil, "bad \"sec-websocket-key\" request header"[m
[31m-    end[m
[31m-[m
[31m-    local ver = headers["sec-websocket-version"][m
[31m-    if type(ver) == "table" then[m
[31m-        ver = ver[1][m
[31m-    end[m
[31m-    if not ver or ver ~= "13" then[m
[31m-        return nil, "bad \"sec-websocket-version\" request header"[m
[31m-    end[m
[31m-[m
[31m-    local protocols = headers["sec-websocket-protocol"][m
[31m-    if type(protocols) == "table" then[m
[31m-        protocols = protocols[1][m
[31m-    end[m
[31m-[m
[31m-    if protocols then[m
[31m-        ngx_header["Sec-WebSocket-Protocol"] = protocols[m
[31m-    end[m
[31m-    ngx_header["Upgrade"] = "websocket"[m
[31m-[m
[31m-    local sha1 = sha1_bin(key .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")[m
[31m-    ngx_header["Sec-WebSocket-Accept"] = base64(sha1)[m
[31m-[m
[31m-    ngx_header["Content-Type"] = nil[m
[31m-[m
[31m-    ngx.status = 101[m
[31m-    local ok, err = ngx.send_headers()[m
[31m-    if not ok then[m
[31m-        return nil, "failed to send response header: " .. (err or "unknonw")[m
[31m-    end[m
[31m-    ok, err = ngx.flush(true)[m
[31m-    if not ok then[m
[31m-        return nil, "failed to flush response header: " .. (err or "unknown")[m
[31m-    end[m
[31m-[m
[31m-    local sock[m
[31m-    sock, err = req_sock(true)[m
[31m-    if not sock then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local max_payload_len, send_masked, timeout[m
[31m-    if opts then[m
[31m-        max_payload_len = opts.max_payload_len[m
[31m-        send_masked = opts.send_masked[m
[31m-        timeout = opts.timeout[m
[31m-[m
[31m-        if timeout then[m
[31m-            sock:settimeout(timeout)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return setmetatable({[m
[31m-        sock = sock,[m
[31m-        max_payload_len = max_payload_len or 65535,[m
[31m-        send_masked = send_masked,[m
[31m-    }, mt)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.set_timeout(self, time)[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    return sock:settimeout(time)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.recv_frame(self)[m
[31m-    if self.fatal then[m
[31m-        return nil, nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    local data, typ, err =  _recv_frame(sock, self.max_payload_len, true)[m
[31m-    if not data and not str_find(err, ": timeout", 1, true) then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-    return data, typ, err[m
[31m-end[m
[31m-[m
[31m-[m
[31m-local function send_frame(self, fin, opcode, payload)[m
[31m-    if self.fatal then[m
[31m-        return nil, "fatal error already happened"[m
[31m-    end[m
[31m-[m
[31m-    local sock = self.sock[m
[31m-    if not sock then[m
[31m-        return nil, "not initialized yet"[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = _send_frame(sock, fin, opcode, payload,[m
[31m-                                   self.max_payload_len, self.send_masked)[m
[31m-    if not bytes then[m
[31m-        self.fatal = true[m
[31m-    end[m
[31m-    return bytes, err[m
[31m-end[m
[31m-_M.send_frame = send_frame[m
[31m-[m
[31m-[m
[31m-function _M.send_text(self, data)[m
[31m-    return send_frame(self, true, 0x1, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_binary(self, data)[m
[31m-    return send_frame(self, true, 0x2, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_close(self, code, msg)[m
[31m-    local payload[m
[31m-    if code then[m
[31m-        if type(code) ~= "number" or code > 0x7fff then[m
[31m-        end[m
[31m-        payload = char(band(rshift(code, 8), 0xff), band(code, 0xff))[m
[31m-                        .. (msg or "")[m
[31m-    end[m
[31m-    return send_frame(self, true, 0x8, payload)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_ping(self, data)[m
[31m-    return send_frame(self, true, 0x9, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-function _M.send_pong(self, data)[m
[31m-    return send_frame(self, true, 0xa, data)[m
[31m-end[m
[31m-[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cert/test.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cert/test.crt[m
[1mdeleted file mode 100644[m
[1mindex a69a011..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cert/test.crt[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICqTCCAhICCQClDm1WkreW4jANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQD[m
[31m-DAh0ZXN0LmNvbTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20wIBcN[m
[31m-MTQwNzIxMDMyMzQ3WhgPMjE1MTA2MTMwMzIzNDdaMIGXMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MRIwEAYDVQQLDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl[m
[31m-c3QuY29tMSAwHgYJKoZIhvcNAQkBFhFhZ2VudHpoQGdtYWlsLmNvbTCBnzANBgkq[m
[31m-hkiG9w0BAQEFAAOBjQAwgYkCgYEA6P18zUvtmaKQK2xePy8ZbFwSyTLw+jW6t9eZ[m
[31m-aiTec8X3ibN9WemrxHzkTRikxP3cAQoITRuZiQvF4Q7DO6wMkz/b0zwfgX5uedGq[m
[31m-047AJP6n/mwlDOjGSNomBLoXQzo7tVe60ikEm3ZyDUqnJPJMt3hImO5XSop4MPMu[m
[31m-Za9WhFcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQA4OBb9bOyWB1//93nSXX1mdENZ[m
[31m-IQeyTK0Dd6My76lnZxnZ4hTWrvvd0b17KLDU6JnS2N5ee3ATVkojPidRLWLIhnh5[m
[31m-0eXrcKalbO2Ce6nShoFvQCQKXN2Txmq2vO/Mud2bHAWwJALg+qi1Iih/gVYB9sct[m
[31m-FLg8zFOzRlYiU+6Mmw==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cert/test.key b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cert/test.key[m
[1mdeleted file mode 100644[m
[1mindex 6c13527..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cert/test.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXgIBAAKBgQDo/XzNS+2ZopArbF4/LxlsXBLJMvD6Nbq315lqJN5zxfeJs31Z[m
[31m-6avEfORNGKTE/dwBCghNG5mJC8XhDsM7rAyTP9vTPB+Bfm550arTjsAk/qf+bCUM[m
[31m-6MZI2iYEuhdDOju1V7rSKQSbdnINSqck8ky3eEiY7ldKingw8y5lr1aEVwIDAQAB[m
[31m-AoGBANgB66sKMga2SKN5nQdHS3LDCkevCutu1OWM5ZcbB4Kej5kC57xsf+tzPtab[m
[31m-emeIVGhCPOAALqB4YcT+QtMX967oM1MjcFbtH7si5oq6UYyp3i0G9Si6jIoVHz3+[m
[31m-8yOUaqwKbK+bRX8VS0YsHZmBsPK5ryN50iUwsU08nemoA94BAkEA9GS9Q5OPeFkM[m
[31m-tFxsIQ1f2FSsZAuN/1cpZgJqY+YaAN7MSPGTWyfd7nWG/Zgk3GO9/2ihh4gww+7B[m
[31m-To09GkmW4QJBAPQOHC2V+t2TA98+6Lj6+TYwcGEkhOENfVpH25mQ+kXgF/1Bd6rA[m
[31m-nosT1bdAY+SnmWXbSw6Kv5C20Em+bEX8WjcCQCSRRjhsRdVODbaW9Z7kb2jhEoJN[m
[31m-sEt6cTlQNzcHYPCsZYisjM3g4zYg47fiIfHQAsfKkhDDcfh/KvFj9LaQOEECQQCH[m
[31m-eBWYEDpSJ7rsfqT7mQQgWj7nDThdG/nK1TxGP71McBmg0Gg2dfkLRhVJRQqt74Is[m
[31m-kc9V4Rp4n6F6baL4Lh19AkEA6pZZer0kg3Kv9hjhaITIKUYdfIp9vYnDRWbQlBmR[m
[31m-atV8V9u9q2ETZvqfHpN+9Lu6NYR4yXIEIRf1bnIZ/mr9eQ==[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/count.t[m
[1mdeleted file mode 100644[m
[1mindex 085963c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/count.t[m
[1m+++ /dev/null[m
[36m@@ -1,91 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-use Protocol::WebSocket::Frame;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module size of resty.websocket.protocol[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local proto = require "resty.websocket.protocol"[m
[31m-            n = 0[m
[31m-            for _, _ in pairs(proto) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-size: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: module size of resty.websocket.client[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            n = 0[m
[31m-            for _, _ in pairs(client) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-size: 13[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: module size of resty.websocket.server[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            n = 0[m
[31m-            for _, _ in pairs(server) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("size: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-size: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cs.t[m
[1mdeleted file mode 100644[m
[1mindex c58848d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/cs.t[m
[1m+++ /dev/null[m
[36m@@ -1,1960 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-use Protocol::WebSocket::Frame;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 14);[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-check_accum_error_log();[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: text frame[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local bytes, err = wb:send_text("copy: " .. data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-1: received: 你好, WebSocket! (text)[m
[31m-2: received: copy: 你好, WebSocket! (text)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m---- error_log[m
[31m-recv_frame: mask bit: 0[m
[31m-recv_frame: mask bit: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: binary frame[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local bytes, err = wb:send_binary("copy: " .. data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = wb:send_binary("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_binary(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-1: received: 你好, WebSocket! (binary)[m
[31m-2: received: copy: 你好, WebSocket! (binary)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: close frame (without msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lingering_close always;[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            wb:recv_frame()  -- receive the close frame[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            wb:send_close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received close: : nil[m
[31m-[m
[31m---- error_log[m
[31m-received: close: : nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: close frame (with msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_close(1000, "server, let\'s close!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_close(1001, "client, let\'s close!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received close: client, let's close!: 1001[m
[31m-[m
[31m---- error_log[m
[31m-received: close: server, let's close!: 1000[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ping frame (without msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_ping()[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_ping()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received ping: : nil[m
[31m-[m
[31m---- error_log[m
[31m-received: ping: : nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ping frame (with msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_ping("hey, server?")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_ping("hey, client?")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received ping: hey, client?: nil[m
[31m-[m
[31m---- error_log[m
[31m-received: ping: hey, server?: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: pong frame (without msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_pong()[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            wb:recv_frame()  -- receive the close frame[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_pong()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            wb:send_close()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received pong: : nil[m
[31m-[m
[31m---- error_log[m
[31m-received: pong: : nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: pong frame (with msg body)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_pong("halo, server!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_pong("halo, client!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received pong: halo, client!: nil[m
[31m-[m
[31m---- error_log[m
[31m-received: pong: halo, server!: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: client recv timeout (set_timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1)[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1000)[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-            else[m
[31m-                ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-failed to receive 1st frame: failed to receive the first 2 bytes: timeout[m
[31m-2: received: 你好, WebSocket! (text)[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: client recv timeout (timeout option)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new{ timeout = 100 }[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-            else[m
[31m-                ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1000)[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-            else[m
[31m-                ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-failed to receive 1st frame: failed to receive the first 2 bytes: timeout[m
[31m-2: received: 你好, WebSocket! (text)[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: server recv timeout (set_timeout)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1)[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive 1st frame: ", err)[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, "1: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1000)[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive 2nd frame: ", err)[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, "2: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-failed to receive 1st frame: failed to receive the first 2 bytes: timeout[m
[31m-2: received: 你好, WebSocket! (text)[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: server recv timeout (in constructor)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new{ timeout = 1 }[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive 1st frame: ", err)[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, "1: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-[m
[31m-            wb:set_timeout(1000)[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive 2nd frame: ", err)[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, "2: received: ", data, " (", typ, ")")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-failed to receive 1st frame: failed to receive the first 2 bytes: timeout[m
[31m-2: received: 你好, WebSocket! (text)[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: reused upstream websocket connections (set_keepalive)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-                -- ngx.say("uri: ", uri)[m
[31m-                local ok, err = wb:connect(uri)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: " .. err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data = "hello " .. i[m
[31m-                local bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-                local ok, err = wb:set_keepalive()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to recycle conn: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-[m
[31m-                -- send it back![m
[31m-                bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello 1 (text)[m
[31m-received: hello 2 (text)[m
[31m-received: hello 3 (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m---- error_log[m
[31m-recv_frame: mask bit: 0[m
[31m-recv_frame: mask bit: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: pool option[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    lua_socket_log_errors off;[m
[31m-    location = /c2 {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s2"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri, { pool = "my_conn_pool" })[m
[31m-            if not ok then[m
[31m-                ok, err = wb:connect(uri)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: " .. err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:send_text("hello websocket")[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local ok, err = wb:set_keepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s2 {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    -- ngx.log(ngx.ERR, "failed to recv text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-[m
[31m-                local bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c2[m
[31m---- response_body[m
[31m-received: hello websocket (text)[m
[31m---- stap[m
[31m-F(ngx_http_lua_socket_tcp_setkeepalive) {[m
[31m-    println("socket tcp set keepalive")[m
[31m-}[m
[31m---- stap_out[m
[31m-socket tcp set keepalive[m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "my_conn_pool"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: text frame (send masked frames on the server side)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local bytes, err = wb:send_text("copy: " .. data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new{ send_masked = true }[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.001)  -- lingering close[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-1: received: 你好, WebSocket! (text)[m
[31m-2: received: copy: 你好, WebSocket! (text)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-recv_frame: mask bit: 0[m
[31m---- error_log[m
[31m-recv_frame: mask bit: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: text frame (send unmasked frames on the client side)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new{ send_unmasked = true }[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local bytes, err = wb:send_text("copy: " .. data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: received: ", data, " (", typ, ")")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = wb:send_text("你好, WebSocket!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.001)  -- lingering close[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body_like eval[m
[31m-qr/^1: received: 你好, WebSocket! \(text\)[m
[31m-(?:failed to receive 2nd frame: failed to receive the first 2 bytes: (?:closed|connection reset by peer)[m
[31m-|failed to send frame: failed to send frame: broken pipe)$/[m
[31m---- no_error_log[m
[31m-[warn][m
[31m---- error_log[m
[31m-recv_frame: mask bit: 0[m
[31m-failed to receive a frame: frame unmasked[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: close frame (without msg body) + close()[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = wb:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("successfully closed the TCP connection")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received close: : nil[m
[31m-successfully closed the TCP connection[m
[31m-[m
[31m---- error_log[m
[31m-received: close: : nil[m
[31m-sending the close frame[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: directly calling close() without sending the close frame ourselves[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: receiving frame")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 1st frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- print("c: received frame")[m
[31m-[m
[31m-            ngx.say("received ", typ, ": ", data, ": ", err)[m
[31m-[m
[31m-            local ok, err = wb:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("successfully closed the TCP connection")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sending close")[m
[31m-[m
[31m-            local bytes, err = wb:send_close()[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 1st text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- print("s: sent close")[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.WARN, "received: ", typ, ": ", data, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received close: : nil[m
[31m-successfully closed the TCP connection[m
[31m-[m
[31m---- error_log[m
[31m-received: close: : nil[m
[31m-sending the close frame[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: client handshake (scalar protocols)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            math.randomseed(0)[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:7986/"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri, { protocols = "json" })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m---- tcp_listen: 7986[m
[31m---- tcp_query eval[m
[31m-"GET / HTTP/1.1\r[m
[31m-Upgrade: websocket\r[m
[31m-Host: 127.0.0.1:7986\r[m
[31m-Sec-WebSocket-Key: y7KXwBSpVrxtkR0O+bQt+Q==\r[m
[31m-Sec-WebSocket-Protocol: json\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Connection: Upgrade\r[m
[31m-\r[m
[31m-"[m
[31m---- tcp_reply: blah[m
[31m---- response_body[m
[31m-failed to connect: failed to receive response header: closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: client handshake (table protocols)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            math.randomseed(0)[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:7986/"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri, { protocols = {"xml", "json"} })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m---- tcp_listen: 7986[m
[31m---- tcp_query eval[m
[31m-"GET / HTTP/1.1\r[m
[31m-Upgrade: websocket\r[m
[31m-Host: 127.0.0.1:7986\r[m
[31m-Sec-WebSocket-Key: y7KXwBSpVrxtkR0O+bQt+Q==\r[m
[31m-Sec-WebSocket-Protocol: xml,json\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Connection: Upgrade\r[m
[31m-\r[m
[31m-"[m
[31m---- tcp_reply: blah[m
[31m---- response_body[m
[31m-failed to connect: failed to receive response header: closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: client handshake (origin)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            math.randomseed(0)[m
[31m-            local wb, err = client:new()[m
[31m-            local uri = "ws://127.0.0.1:7986/"[m
[31m-            -- ngx.say("uri: ", uri)[m
[31m-            local ok, err = wb:connect(uri, { origin = "test.com" })[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m---- tcp_listen: 7986[m
[31m---- tcp_query eval[m
[31m-"GET / HTTP/1.1\r[m
[31m-Upgrade: websocket\r[m
[31m-Host: 127.0.0.1:7986\r[m
[31m-Sec-WebSocket-Key: y7KXwBSpVrxtkR0O+bQt+Q==\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Origin: test.com\r[m
[31m-Connection: Upgrade\r[m
[31m-\r[m
[31m-"[m
[31m---- tcp_reply: blah[m
[31m---- response_body[m
[31m-failed to connect: failed to receive response header: closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: SSL with keepalive[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local uri = "wss://127.0.0.1:12345/s"[m
[31m-                local ok, err = wb:connect(uri)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: " .. err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data = "hello " .. i[m
[31m-                local bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-                local ok, err = wb:set_keepalive()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to recycle conn: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-[m
[31m-                -- send it back![m
[31m-                bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello 1 (text)[m
[31m-received: hello 2 (text)[m
[31m-received: hello 3 (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: SSL without keepalive[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            local uri = "wss://127.0.0.1:12345/s"[m
[31m-            local ok, err = wb:connect(uri)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = "hello"[m
[31m-            local bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local ok, err = wb:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close conn: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: SSL with ssl_verify[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    resolver 127.0.0.1:1953 ipv6=off;[m
[31m-    resolver_timeout 1s;[m
[31m-[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 1;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            local uri = "wss://test.com:12345/s"[m
[31m-            local ok, err = wb:connect(uri, {ssl_verify = true})[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = "hello"[m
[31m-            local bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-            local ok, err = wb:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close conn: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, typ, err = wb:recv_frame()[m
[31m-            if not data then[m
[31m-                -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            -- send it back![m
[31m-            bytes, err = wb:send_text(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply eval[m
[31m-sub {[m
[31m-    # Get DNS request ID from passed UDP datagram[m
[31m-    my $dns_id = unpack("n", shift);[m
[31m-    # Set name and encode it[m
[31m-    my $name = "test.com";[m
[31m-    $name =~ s/([^.]+)\.?/chr(length($1)) . $1/ge;[m
[31m-    $name .= "\0";[m
[31m-    my $s = '';[m
[31m-    $s .= pack("n", $dns_id);[m
[31m-    # DNS response flags, hardcoded[m
[31m-    my $flags = (1 << 15) + (0 << 11) + (0 << 10) + (0 << 9) + (1 << 8) + (1 << 7) + 0;[m
[31m-    $flags = pack("n", $flags);[m
[31m-    $s .= $flags;[m
[31m-    $s .= pack("nnnn", 1, 1, 0, 0);[m
[31m-    $s .= $name;[m
[31m-    $s .= pack("nn", 1, 1);[m
[31m-    # Set response address and pack it[m
[31m-    my @addr = split /\./, "127.0.0.1";[m
[31m-    my $data = pack("CCCC", @addr);[m
[31m-    $s .= $name. pack("nnNn", 1, 1, 1, 4) . $data;[m
[31m-    return $s;[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: SSL with ssl_verify (handshake failed)[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    resolver 127.0.0.1:1953 ipv6=off;[m
[31m-    resolver_timeout 1s;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            local uri = "wss://test.com:12345/s"[m
[31m-            local ok, err = wb:connect(uri, {ssl_verify = true})[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 1953[m
[31m---- udp_reply eval[m
[31m-sub {[m
[31m-    # Get DNS request ID from passed UDP datagram[m
[31m-    my $dns_id = unpack("n", shift);[m
[31m-    # Set name and encode it[m
[31m-    my $name = "test.com";[m
[31m-    $name =~ s/([^.]+)\.?/chr(length($1)) . $1/ge;[m
[31m-    $name .= "\0";[m
[31m-    my $s = '';[m
[31m-    $s .= pack("n", $dns_id);[m
[31m-    # DNS response flags, hardcoded[m
[31m-    my $flags = (1 << 15) + (0 << 11) + (0 << 10) + (0 << 9) + (1 << 8) + (1 << 7) + 0;[m
[31m-    $flags = pack("n", $flags);[m
[31m-    $s .= $flags;[m
[31m-    $s .= pack("nnnn", 1, 1, 0, 0);[m
[31m-    $s .= $name;[m
[31m-    $s .= pack("nn", 1, 1);[m
[31m-    # Set response address and pack it[m
[31m-    my @addr = split /\./, "127.0.0.1";[m
[31m-    my $data = pack("CCCC", @addr);[m
[31m-    $s .= $name. pack("nnNn", 1, 1, 1, 4) . $data;[m
[31m-    return $s;[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /c[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl certificate verify error: (18: self signed certificate)[m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: SSL without ssl_verify[m
[31m---- no_check_leak[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    listen 12345 ssl;[m
[31m-    server_name test.com;[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location = /c {[m
[31m-        content_by_lua '[m
[31m-            local client = require "resty.websocket.client"[m
[31m-            local wb, err = client:new()[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local uri = "wss://127.0.0.1:12345/s"[m
[31m-                local ok, err = wb:connect(uri, {ssl_verify = false})[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: " .. err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data = "hello " .. i[m
[31m-                local bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to receive 2nd frame: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", data, " (", typ, ")")[m
[31m-[m
[31m-                local ok, err = wb:set_keepalive()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to close conn: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /s {[m
[31m-        content_by_lua '[m
[31m-            local server = require "resty.websocket.server"[m
[31m-            local wb, err = server:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local data, typ, err = wb:recv_frame()[m
[31m-                if not data then[m
[31m-                    -- ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-[m
[31m-                -- send it back![m
[31m-                bytes, err = wb:send_text(data)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send the 2nd text: ", err)[m
[31m-                    return ngx.exit(444)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /c[m
[31m---- response_body[m
[31m-received: hello 1 (text)[m
[31m-received: hello 2 (text)[m
[31m-received: hello 3 (text)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 448b088..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,943 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use Cwd qw(cwd);[m
[31m-use Protocol::WebSocket::Frame;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 162;[m
[31m-[m
[31m-my $pwd = cwd();[m
[31m-[m
[31m-our $HttpConfig = qq{[m
[31m-    lua_package_path "$pwd/lib/?.lua;;";[m
[31m-    lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;";[m
[31m-};[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple handshake[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage()[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Origin: http://example.com\r[m
[31m-\r[m
[31m-"[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m-!Content-Type[m
[31m---- raw_response_headers_like: ^HTTP/1.1 101 Switching Protocols\r\n[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple text data frame (3 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received: foo: nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple text data frame (0 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => '', type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received: ,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: simple text data frame (125 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 124 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log eval[m
[31m-"text msg received: " . ("a" x 124) . "b,",[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: simple text data frame (126 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 125 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log eval[m
[31m-"text msg received: " . ("a" x 125) . "b,",[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple text data frame (127 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 126 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log eval[m
[31m-"text msg received: " . ("a" x 126) . "b,",[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple text data frame (65535 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local m, err = ngx.re.match(msg, "^a{65534}b$", "jo")[m
[31m-            if m then[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is expected")[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is NOT expected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 65534 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received is expected,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple text data frame (65536 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new{ max_payload_len = 65536 }[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local m, err = ngx.re.match(msg, "^a{65535}b$", "jo")[m
[31m-            if m then[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is expected")[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is NOT expected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 65535 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received is expected,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: simple text data frame (1 Mbytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new{ max_payload_len = 1048576 + 1 }[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local m, err = ngx.re.match(msg, "^a+b$", "jo")[m
[31m-            if m and #msg == 1048576 + 1 then[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is expected")[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.log(ngx.ERR, "failed to match regex: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is NOT expected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(max_payload_size => 1048576 + 1, buffer => "a" x 1048576 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received is expected,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: simple binary data frame (3 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'binary', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-binary msg received: foo,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: close frame (status code + non-empty msg)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => pack("n", 1000) . 'yes, closed', type => 'close', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-close msg received: yes, closed: 1000,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: close frame (just status code)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => pack("n", 1002), type => 'close', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-close msg received: : 1002,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: close frame (no payload at all)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "", type => 'close', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-close msg received: : nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ping frame (no payload at all)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "", type => 'ping', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-ping msg received: : nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ping frame (with payload)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "are you there? 你好", type => 'ping', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-ping msg received: are you there? 你好: nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: pong frame (with payload)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "are you there? 你好", type => 'pong', masked => 1)->to_bytes();[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-pong msg received: are you there? 你好: nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exceeding the default 65535 max frame len limit (65536 bytes)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local m, err = ngx.re.match(msg, "^a{65535}b$", "jo")[m
[31m-            if m then[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is expected")[m
[31m-            else[m
[31m-                ngx.log(ngx.WARN, typ, " msg received is NOT expected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-" . Protocol::WebSocket::Frame->new(buffer => "a" x 65535 . "b", type => 'text', masked => 1)->to_bytes();[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to read msg: exceeding max payload len[m
[31m---- no_error_log[m
[31m-text msg received is expected,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: simple text data frame (3 bytes, fragmented, first frame)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-my $frame = Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'text', masked => 1)->to_bytes();[m
[31m-$frame =~ s/./chr(ord($&) & 0x7f)/e; # clear the FIN bit[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-$frame";[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-text msg received: foo: again,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: simple text data frame (3 bytes, fragmented, last frame)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-my $frame = Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'text', masked => 1)->to_bytes();[m
[31m-$frame =~ s/./chr(ord($&) & 0xf0)/e; # clear the opcode[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-$frame";[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-continuation msg received: foo: nil,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: simple text data frame (3 bytes, fragmented, middle frame)[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            local msg, typ, err = wb:recv_frame()[m
[31m-            if not msg then[m
[31m-                ngx.log(ngx.ERR, "failed to read msg: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, typ, " msg received: ", msg, ": ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-my $frame = Protocol::WebSocket::Frame->new(buffer => 'foo', type => 'text', masked => 1)->to_bytes();[m
[31m-$frame =~ s/./chr(ord($&) & 0x70)/e; # clear the opcode[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: Upgrade\r[m
[31m-Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-\r[m
[31m-$frame";[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- error_log[m
[31m-continuation msg received: foo: again,[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: Firefox 22.0 handshake[m
[31m---- http_config eval: $::HttpConfig[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local websocket = require "resty.websocket.server"[m
[31m-            local wb, err = websocket:new()[m
[31m-            if not wb then[m
[31m-                ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: server.example.com\r[m
[31m-Upgrade: websocket\r[m
[31m-Connection: keep-alive, Upgrade\r[m
[31m-Cache-Control: no-cache\r[m
[31m-Pragma: no-cache\r[m
[31m-Sec-WebSocket-Key: 05EiFj8mhoZ5F/oFE3Tyeg==\r[m
[31m-Sec-WebSocket-Protocol: chat\r[m
[31m-Sec-WebSocket-Version: 13\r[m
[31m-Origin: null\r[m
[31m-\r[m
[31m-"[m
[31m---- response_headers[m
[31m-Upgrade: websocket[m
[31m-Connection: upgrade[m
[31m-Sec-WebSocket-Accept: tBNO4O+F4DrQyajB62pvtRNU8LM=[m
[31m-Sec-WebSocket-Protocol: chat[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 101[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 14d92de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/lua-resty-websocket-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,462 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex ed5f748..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-.libs[m
[31m-*.t_[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-genmobi.sh[m
[31m-*.mobi[m
[31m-misc/chunked[m
[31m-reindex[m
[31m-src/response.c[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.c[m
[31m-src/handler.c[m
[31m-src/response.rl[m
[31m-src/response.h[m
[31m-src/module.h[m
[31m-src/util.h[m
[31m-src/request.h[m
[31m-src/request.c[m
[31m-ctags[m
[31m-nginx[m
[31m-*.html[m
[31m-t/servroot/[m
[31m-all[m
[31m-Changes[m
[31m-build1[0-9][m
[31m-go[m
[31m-buildroot/[m
[31m-analyze[m
[31m-*.plist[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/config[m
[1mdeleted file mode 100644[m
[1mindex 7e4bfd6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/config[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_memc_module[m
[31m-[m
[31m-MEMC_SRCS="                                                                 \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_module.c                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_request.c                          \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_response.c                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_util.c                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_handler.c                          \[m
[31m-        "[m
[31m-[m
[31m-MEMC_DEPS="                                                                 \[m
[31m-        $ngx_addon_dir/src/ddebug.h                                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_module.h                           \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_request.h                          \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_response.h                         \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_util.h                             \[m
[31m-        $ngx_addon_dir/src/ngx_http_memc_handler.h                          \[m
[31m-        "[m
[31m-[m
[31m-if [ -n "$ngx_module_link" ]; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_srcs="$MEMC_SRCS"[m
[31m-    ngx_module_deps="$MEMC_DEPS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $MEMC_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $MEMC_DEPS"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 36e810e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-#ifndef DDEBUG_H[m
[31m-#define DDEBUG_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "memc *** "); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char* fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* DDEBUG_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_common.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_common.rl[m
[1mdeleted file mode 100644[m
[1mindex eeb61c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_common.rl[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_common;[m
[31m-[m
[31m-    action catch_err {[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-[m
[31m-    msg = any* -- "\r\n";[m
[31m-[m
[31m-    error_helper = "ERROR\r\n"[m
[31m-                 | "CLIENT_ERROR " msg "\r\n"[m
[31m-                 | "SERVER_ERROR " msg "\r\n"[m
[31m-                 ;[m
[31m-[m
[31m-    error = error_helper @catch_err[m
[31m-          ;[m
[31m-[m
[31m-    action finalize {[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-[m
[31m-    action check {[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-[m
[31m-    action handle_stored {[m
[31m-        dd("status set to 201");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_CREATED;[m
[31m-    }[m
[31m-[m
[31m-    action handle_not_found {[m
[31m-        dd("status set to 404");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_delete.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_delete.rl[m
[1mdeleted file mode 100644[m
[1mindex 1e01b05..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_delete.rl[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_delete;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    response = "DELETED\r\n"[m
[31m-             | "NOT_FOUND\r\n" @handle_not_found[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_flush_all.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_flush_all.rl[m
[1mdeleted file mode 100644[m
[1mindex 74c7288..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_flush_all.rl[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_flush_all;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    response = "OK\r\n"[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_incr_decr.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_incr_decr.rl[m
[1mdeleted file mode 100644[m
[1mindex b4b13a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_incr_decr.rl[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_incr_decr;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    value = digit+[m
[31m-          ;[m
[31m-[m
[31m-    response = value " "* "\r\n" @handle_stored[m
[31m-             | "NOT_FOUND\r\n" @handle_not_found[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize $check[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_stats.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_stats.rl[m
[1mdeleted file mode 100644[m
[1mindex 9526b77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_stats.rl[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_stats;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    content = any+ - "\r\n"[m
[31m-            ;[m
[31m-[m
[31m-    stat_line = "STAT " content "\r\n"[m
[31m-              ;[m
[31m-[m
[31m-    response = stat_line* "END\r\n"[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_storage.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_storage.rl[m
[1mdeleted file mode 100644[m
[1mindex b64a441..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_storage.rl[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_storage;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    response = "STORED\r\n" @handle_stored[m
[31m-             | "NOT_STORED\r\n"[m
[31m-             | "EXISTS\r\n"[m
[31m-             | "NOT_FOUND\r\n" @handle_not_found[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_version.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_version.rl[m
[1mdeleted file mode 100644[m
[1mindex 3a85b59..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/memc_version.rl[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-%%{[m
[31m-    machine memc_version;[m
[31m-[m
[31m-    alphtype short;[m
[31m-[m
[31m-    include memc_common "memc_common.rl";[m
[31m-[m
[31m-    version = any+ - "\r\n"[m
[31m-            ;[m
[31m-[m
[31m-    response = "VERSION " version "\r\n"[m
[31m-             | error[m
[31m-             ;[m
[31m-[m
[31m-    main := response @finalize[m
[31m-         ;[m
[31m-[m
[31m-}%%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 6edd0b6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,611 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_memc_handler.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-#include "ngx_http_memc_request.h"[m
[31m-#include "ngx_http_memc_response.h"[m
[31m-#include "ngx_http_memc_util.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_memc_flags_as_http_time_variable([m
[31m-    ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t ngx_http_memc_variables[] = {[m
[31m-[m
[31m-    { ngx_string("memc_flags_as_http_time"), NULL,[m
[31m-      ngx_http_memc_flags_as_http_time_variable, 0,[m
[31m-      0, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_memc_key = ngx_string("memc_key");[m
[31m-static ngx_str_t  ngx_http_memc_cmd = ngx_string("memc_cmd");[m
[31m-static ngx_str_t  ngx_http_memc_value = ngx_string("memc_value");[m
[31m-static ngx_str_t  ngx_http_memc_flags = ngx_string("memc_flags");[m
[31m-static ngx_str_t  ngx_http_memc_exptime = ngx_string("memc_exptime");[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_memc_add_more_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_memc_variable_not_found(ngx_http_request_t *r,[m
[31m-        ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_memc_add_variable(ngx_conf_t *cf, ngx_str_t *name);[m
[31m-static ngx_flag_t ngx_http_memc_in_cmds_allowed(ngx_http_memc_loc_conf_t *mlcf,[m
[31m-        ngx_http_memc_cmd_t memc_cmd);[m
[31m-static ngx_int_t ngx_http_memc_reinit_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_memc_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_memc_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-static ngx_flag_t ngx_http_memc_valid_uint32_str(u_char *data, size_t len);[m
[31m-static ngx_flag_t ngx_http_memc_valid_uint64_str(u_char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_http_memc_loc_conf_t       *mlcf;[m
[31m-    ngx_http_memc_main_conf_t      *mmcf;[m
[31m-    ngx_str_t                       target;[m
[31m-    ngx_url_t                       url;[m
[31m-[m
[31m-    ngx_http_variable_value_t      *cmd_vv;[m
[31m-    ngx_http_variable_value_t      *key_vv;[m
[31m-    ngx_http_variable_value_t      *value_vv;[m
[31m-    ngx_http_variable_value_t      *flags_vv;[m
[31m-    ngx_http_variable_value_t      *exptime_vv;[m
[31m-[m
[31m-    ngx_http_memc_cmd_t             memc_cmd;[m
[31m-    ngx_flag_t                      is_storage_cmd = 0;[m
[31m-[m
[31m-    dd("memc handler");[m
[31m-[m
[31m-    mmcf = ngx_http_get_module_main_conf(r, ngx_http_memc_module);[m
[31m-[m
[31m-    key_vv = ngx_http_get_indexed_variable(r, mmcf->key_index);[m
[31m-    if (key_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmd_vv = ngx_http_get_indexed_variable(r, mmcf->cmd_index);[m
[31m-    if (cmd_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd_vv->not_found || cmd_vv->len == 0) {[m
[31m-        dd("variable $memc_cmd not found");[m
[31m-        cmd_vv->not_found = 0;[m
[31m-        cmd_vv->valid = 1;[m
[31m-        cmd_vv->no_cacheable = 0;[m
[31m-[m
[31m-        if (r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD)) {[m
[31m-            cmd_vv->len = sizeof("get") - 1;[m
[31m-            cmd_vv->data = (u_char*) "get";[m
[31m-            memc_cmd = ngx_http_memc_cmd_get;[m
[31m-[m
[31m-        } else if (r->method == NGX_HTTP_POST) {[m
[31m-            cmd_vv->len = sizeof("add") - 1;[m
[31m-            cmd_vv->data = (u_char*) "add";[m
[31m-            memc_cmd = ngx_http_memc_cmd_add;[m
[31m-            is_storage_cmd = 1;[m
[31m-[m
[31m-        } else if (r->method == NGX_HTTP_PUT) {[m
[31m-            cmd_vv->len = sizeof("set") - 1;[m
[31m-            cmd_vv->data = (u_char*) "set";[m
[31m-            memc_cmd = ngx_http_memc_cmd_set;[m
[31m-            is_storage_cmd = 1;[m
[31m-[m
[31m-        } else if (r->method == NGX_HTTP_DELETE) {[m
[31m-            cmd_vv->len = sizeof("delete") - 1;[m
[31m-            cmd_vv->data = (u_char*) "delete";[m
[31m-            memc_cmd = ngx_http_memc_cmd_delete;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "ngx_memc: $memc_cmd variable not found for HTTP "[m
[31m-                          "%V requests", &r->method_name);[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        memc_cmd = ngx_http_memc_parse_cmd(cmd_vv->data, cmd_vv->len,[m
[31m-                                           &is_storage_cmd);[m
[31m-[m
[31m-        if (memc_cmd == ngx_http_memc_cmd_unknown) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "ngx_memc: unknown $memc_cmd \"%v\"", cmd_vv);[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memc_module);[m
[31m-[m
[31m-    dd("XXX connect timeout %d", (int) mlcf->upstream.connect_timeout);[m
[31m-[m
[31m-    if (!ngx_http_memc_in_cmds_allowed(mlcf, memc_cmd)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "ngx_memc: memcached command \"%v\" not allowed",[m
[31m-                      cmd_vv);[m
[31m-[m
[31m-        return NGX_HTTP_FORBIDDEN;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && \[m
[31m-    ((nginx_version >= 7063 && nginx_version < 8000) \[m
[31m-     || nginx_version >= 8007)[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#else /* 0.7.x < 0.7.63, 0.8.x < 0.8.7 */[m
[31m-[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-#  if (NGX_THREADS)[m
[31m-    u->peer.lock = &r->connection->lock;[m
[31m-#  endif[m
[31m-[m
[31m-    r->upstream = u;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (mlcf->complex_target) {[m
[31m-        /* variables used in the memc_pass directive */[m
[31m-        if (ngx_http_complex_value(r, mlcf->complex_target, &target)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            dd("failed to compile");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (target.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memc: handler: empty \"memc_pass\" target");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        url.host = target;[m
[31m-        url.port = 0;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        mlcf->upstream.upstream = ngx_http_memc_upstream_add(r, &url);[m
[31m-[m
[31m-        if (mlcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memc: upstream \"%V\" not found", &target);[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->schema.len = sizeof("memcached://") - 1;[m
[31m-    u->schema.data = (u_char *) "memcached://";[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_memc_module;[m
[31m-[m
[31m-    u->conf = &mlcf->upstream;[m
[31m-[m
[31m-    ctx = ngx_palloc(r->pool, sizeof(ngx_http_memc_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->body_length = 0;[m
[31m-    ctx->memc_key_vv = key_vv;[m
[31m-    ctx->memc_value_vv = NULL;[m
[31m-    ctx->memc_flags_vv = NULL;[m
[31m-[m
[31m-    ctx->parser_state = NGX_ERROR;[m
[31m-[m
[31m-    ctx->rest = NGX_HTTP_MEMC_END;[m
[31m-    ctx->request = r;[m
[31m-[m
[31m-    ctx->cmd_str.data = cmd_vv->data;[m
[31m-    ctx->cmd_str.len  = cmd_vv->len;[m
[31m-[m
[31m-    ctx->cmd = memc_cmd;[m
[31m-[m
[31m-    ctx->is_storage_cmd = is_storage_cmd;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_memc_module);[m
[31m-[m
[31m-    if (is_storage_cmd) {[m
[31m-        u->create_request = ngx_http_memc_create_storage_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_get) {[m
[31m-        u->create_request = ngx_http_memc_create_get_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_get_cmd_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_get_cmd_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_get_cmd_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-        u->create_request = ngx_http_memc_create_flush_all_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_version[m
[31m-            || memc_cmd == ngx_http_memc_cmd_stats)[m
[31m-    {[m
[31m-        u->create_request = ngx_http_memc_create_noarg_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_delete) {[m
[31m-        u->create_request = ngx_http_memc_create_delete_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else if (memc_cmd == ngx_http_memc_cmd_incr[m
[31m-            || memc_cmd == ngx_http_memc_cmd_decr) {[m
[31m-        u->create_request = ngx_http_memc_create_incr_decr_cmd_request;[m
[31m-        u->process_header = ngx_http_memc_process_simple_header;[m
[31m-[m
[31m-        u->input_filter_init = ngx_http_memc_empty_filter_init;[m
[31m-        u->input_filter = ngx_http_memc_empty_filter;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-            "assertion failed: command \"%v\" does not have proper "[m
[31m-            "handlers.", cmd_vv);[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->reinit_request = ngx_http_memc_reinit_request;[m
[31m-    u->abort_request = ngx_http_memc_abort_request;[m
[31m-    u->finalize_request = ngx_http_memc_finalize_request;[m
[31m-[m
[31m-    u->input_filter_ctx = ctx;[m
[31m-[m
[31m-    if (is_storage_cmd[m
[31m-            || memc_cmd == ngx_http_memc_cmd_flush_all[m
[31m-            || memc_cmd == ngx_http_memc_cmd_delete)[m
[31m-    {[m
[31m-        exptime_vv = ngx_http_get_indexed_variable(r, mmcf->exptime_index);[m
[31m-[m
[31m-        if (exptime_vv == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->memc_exptime_vv = exptime_vv;[m
[31m-[m
[31m-        if (!exptime_vv->not_found[m
[31m-            && exptime_vv->len[m
[31m-            && !ngx_http_memc_valid_uint32_str(exptime_vv->data,[m
[31m-                                               exptime_vv->len))[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "variable \"$memc_exptime\" takes invalid value: %v",[m
[31m-                          exptime_vv);[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (is_storage_cmd || memc_cmd == ngx_http_memc_cmd_get) {[m
[31m-        flags_vv = ngx_http_get_indexed_variable(r, mmcf->flags_index);[m
[31m-        if (flags_vv == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->memc_flags_vv = flags_vv;[m
[31m-[m
[31m-        if (is_storage_cmd[m
[31m-            && !flags_vv->not_found[m
[31m-            && flags_vv->len[m
[31m-            && !ngx_http_memc_valid_uint32_str(flags_vv->data, flags_vv->len))[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "variable \"$memc_flags\" takes invalid value: %v",[m
[31m-                          flags_vv);[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (is_storage_cmd[m
[31m-        || memc_cmd == ngx_http_memc_cmd_incr[m
[31m-        || memc_cmd == ngx_http_memc_cmd_decr)[m
[31m-    {[m
[31m-        value_vv = ngx_http_get_indexed_variable(r, mmcf->value_index);[m
[31m-        if (value_vv == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (memc_cmd == ngx_http_memc_cmd_incr[m
[31m-            || memc_cmd == ngx_http_memc_cmd_decr)[m
[31m-        {[m
[31m-            if (value_vv->not_found || value_vv->len == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "the \"$memc_value\" variable is required for "[m
[31m-                              "command \"%V\"", &ctx->cmd_str);[m
[31m-[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            if (!ngx_http_memc_valid_uint64_str(value_vv->data,[m
[31m-                                                value_vv->len))[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "variable \"$memc_value\" is invalid for "[m
[31m-                              "incr/decr: %v", value_vv);[m
[31m-[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ctx->memc_value_vv = value_vv;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_memc_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http memcached request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_memc_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http memcached request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_memc_in_cmds_allowed(ngx_http_memc_loc_conf_t *mlcf,[m
[31m-    ngx_http_memc_cmd_t memc_cmd)[m
[31m-{[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_http_memc_cmd_t         *value;[m
[31m-[m
[31m-    if (mlcf->cmds_allowed == NULL || mlcf->cmds_allowed->nelts == 0) {[m
[31m-        /* by default, all the memcached commands supported are allowed. */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    value = mlcf->cmds_allowed->elts;[m
[31m-[m
[31m-    for (i = 0; i < mlcf->cmds_allowed->nelts; i++) {[m
[31m-        if (memc_cmd == value[i]) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_memc_valid_uint32_str(u_char *data, size_t len)[m
[31m-{[m
[31m-    u_char              *p, *last;[m
[31m-[m
[31m-    if (len > NGX_UINT32_LEN) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    last = data + len;[m
[31m-    for (p = data; p != last; p++) {[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_flag_t[m
[31m-ngx_http_memc_valid_uint64_str(u_char *data, size_t len)[m
[31m-{[m
[31m-    u_char              *p, *last;[m
[31m-[m
[31m-    if (len > NGX_UINT64_LEN) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    last = data + len;[m
[31m-    for (p = data; p != last; p++) {[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_memc_main_conf_t       *mmcf;[m
[31m-[m
[31m-    mmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_memc_module);[m
[31m-[m
[31m-    if (!mmcf->module_used) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->key_index = ngx_http_memc_add_variable(cf, &ngx_http_memc_key);[m
[31m-    if (mmcf->key_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->cmd_index = ngx_http_memc_add_variable(cf, &ngx_http_memc_cmd);[m
[31m-    if (mmcf->cmd_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->flags_index = ngx_http_memc_add_variable(cf, &ngx_http_memc_flags);[m
[31m-    if (mmcf->flags_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->exptime_index = ngx_http_memc_add_variable(cf,[m
[31m-                                                     &ngx_http_memc_exptime);[m
[31m-    if (mmcf->exptime_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mmcf->value_index = ngx_http_memc_add_variable(cf, &ngx_http_memc_value);[m
[31m-    if (mmcf->value_index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_memc_add_more_variables(cf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_add_variable(ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_variable_t         *v;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->get_handler = ngx_http_memc_variable_not_found;[m
[31m-    return ngx_http_get_variable_index(cf, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_variable_not_found(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->not_found = 1;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_add_more_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t *var, *v;[m
[31m-    for (v = ngx_http_memc_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_flags_as_http_time_variable([m
[31m-    ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    time_t                       flags_time = 0;[m
[31m-    ngx_http_memc_ctx_t         *ctx;[m
[31m-[m
[31m-    ngx_http_variable_value_t   *flags_vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    flags_vv = ctx->memc_flags_vv;[m
[31m-    if (flags_vv == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    if (flags_vv->not_found || flags_vv->len == 0) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    flags_time = ngx_atotm(flags_vv->data, flags_vv->len);[m
[31m-    if (flags_time == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_time(p, flags_time);[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->not_found = 0;[m
[31m-    v->no_cacheable = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->data = NULL;[m
[31m-    v->valid = 1;[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_handler.h[m
[1mdeleted file mode 100644[m
[1mindex cd63c4c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef NGX_HTTP_MEMC_HANDLER_H[m
[31m-#define NGX_HTTP_MEMC_HANDLER_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_memc_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_HANDLER_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6136390..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,404 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Zhang "agentzh" Yichun[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-#include "ngx_http_memc_handler.h"[m
[31m-#include "ngx_http_memc_util.h"[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_memc_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_memc_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_memc_cmds_allowed(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_memc_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_memc_upstream_max_fails_unsupported(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_memc_upstream_fail_timeout_unsupported(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_memc_create_main_conf(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_memc_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_memc_commands[] = {[m
[31m-[m
[31m-    { ngx_string("memc_cmds_allowed"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_memc_cmds_allowed,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_memc_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_memc_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("memc_upstream_max_fails"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_memc_upstream_max_fails_unsupported,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_upstream_fail_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_memc_upstream_fail_timeout_unsupported,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_flags_to_last_modified"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, flags_to_last_modified),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memc_ignore_client_abort"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memc_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_memc_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_memc_init,                    /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_memc_create_main_conf,        /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_memc_create_loc_conf,    /* create location configration */[m
[31m-    ngx_http_memc_merge_loc_conf      /* merge location configration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_memc_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_memc_module_ctx,        /* module context */[m
[31m-    ngx_http_memc_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_memc_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memc_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->cmds_allowed = NULL;[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->flags_to_last_modified = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t *prev = parent;[m
[31m-    ngx_http_memc_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->flags_to_last_modified,[m
[31m-                         prev->flags_to_last_modified, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                                 prev->upstream.next_upstream,[m
[31m-                                 (NGX_CONF_BITMASK_SET[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.upstream == NULL) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->cmds_allowed == NULL) {[m
[31m-        conf->cmds_allowed = prev->cmds_allowed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                         prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t    *mlcf = conf;[m
[31m-    ngx_http_memc_main_conf_t   *mmcf;[m
[31m-[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_url_t                  url;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_uint_t                 n;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    if (mlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_memc_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    mmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_memc_module);[m
[31m-    mmcf->module_used = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-    if (n) {[m
[31m-        mlcf->complex_target = ngx_palloc(cf->pool,[m
[31m-                                          sizeof(ngx_http_complex_value_t));[m
[31m-        if (mlcf->complex_target == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = mlcf->complex_target;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    mlcf->complex_target = NULL;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url = value[1];[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    mlcf->upstream.upstream = ngx_http_upstream_add(cf, &url, 0);[m
[31m-    if (mlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_upstream_max_fails_unsupported(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "\"memc_upstream_max_fails\" is not supported, "[m
[31m-                       "use the \"max_fails\" parameter of the \"server\" "[m
[31m-                       "directive inside the \"upstream\" block");[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_upstream_fail_timeout_unsupported(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "\"memc_upstream_fail_timeout\" is not supported, "[m
[31m-                       "use the \"fail_timeout\" parameter of the \"server\" "[m
[31m-                       "directive inside the \"upstream\" block");[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memc_cmds_allowed(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t *mlcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_http_memc_cmd_t        memc_cmd;[m
[31m-    ngx_http_memc_cmd_t        *c;[m
[31m-    ngx_flag_t                 is_storage_cmd;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    mlcf->cmds_allowed = ngx_array_create(cf->pool, cf->args->nelts - 1,[m
[31m-                                          sizeof(ngx_http_memc_cmd_t));[m
[31m-[m
[31m-    if (mlcf->cmds_allowed == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        memc_cmd = ngx_http_memc_parse_cmd(value[i].data, value[i].len,[m
[31m-                                           &is_storage_cmd);[m
[31m-[m
[31m-        if (memc_cmd == ngx_http_memc_cmd_unknown) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "Unknown memcached command \"%V\" used in "[m
[31m-                               "\"memc_cmds_allowed\"", &value[i]);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c = ngx_array_push(mlcf->cmds_allowed);[m
[31m-        if (c == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *c = memc_cmd;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_memc_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_memc_main_conf_t    *mmcf;[m
[31m-[m
[31m-    mmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memc_main_conf_t));[m
[31m-    if (mmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return mmcf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_module.h[m
[1mdeleted file mode 100644[m
[1mindex bea4578..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,98 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_MEMC_MODULE_H[m
[31m-#define NGX_HTTP_MEMC_MODULE_H[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_memc_cmd_set,[m
[31m-    ngx_http_memc_cmd_add,[m
[31m-    ngx_http_memc_cmd_replace,[m
[31m-    ngx_http_memc_cmd_append,[m
[31m-    ngx_http_memc_cmd_prepend,[m
[31m-    /* ngx_http_memc_cmd_cas, */[m
[31m-[m
[31m-    ngx_http_memc_cmd_get,[m
[31m-    /* ngx_http_memc_cmd_gets, */[m
[31m-[m
[31m-    ngx_http_memc_cmd_delete,[m
[31m-[m
[31m-    ngx_http_memc_cmd_incr,[m
[31m-    ngx_http_memc_cmd_decr,[m
[31m-[m
[31m-    ngx_http_memc_cmd_stats,[m
[31m-[m
[31m-    ngx_http_memc_cmd_flush_all,[m
[31m-    ngx_http_memc_cmd_version,[m
[31m-    /* ngx_http_memc_cmd_verbosity, */[m
[31m-[m
[31m-    /* we do not want to support the "quit" command here */[m
[31m-    /* ngx_http_memc_cmd_quit, */[m
[31m-[m
[31m-    ngx_http_memc_cmd_unknown[m
[31m-} ngx_http_memc_cmd_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t                       flags_to_last_modified;[m
[31m-    ngx_http_upstream_conf_t         upstream;[m
[31m-    ngx_array_t                     *cmds_allowed;[m
[31m-    ngx_http_complex_value_t        *complex_target;[m
[31m-[m
[31m-} ngx_http_memc_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t       key_index;[m
[31m-    ngx_int_t       cmd_index;[m
[31m-    ngx_int_t       value_index;[m
[31m-    ngx_int_t       flags_index;[m
[31m-    ngx_int_t       exptime_index;[m
[31m-    ngx_int_t       module_used;[m
[31m-} ngx_http_memc_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    off_t                      rest;[m
[31m-#else[m
[31m-    size_t                     rest;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_request_t        *request;[m
[31m-    ngx_str_t                  key;[m
[31m-[m
[31m-    ngx_str_t                  cmd_str;[m
[31m-    ngx_http_memc_cmd_t        cmd;[m
[31m-[m
[31m-    ngx_http_variable_value_t  *memc_value_vv;[m
[31m-    ngx_http_variable_value_t  *memc_key_vv;[m
[31m-    ngx_http_variable_value_t  *memc_flags_vv;[m
[31m-    ngx_http_variable_value_t  *memc_exptime_vv;[m
[31m-[m
[31m-    ngx_flag_t                 is_storage_cmd;[m
[31m-[m
[31m-    int                        parser_state;[m
[31m-[m
[31m-    /* just for the subrequests in memory support */[m
[31m-    size_t                     body_length;[m
[31m-[m
[31m-} ngx_http_memc_ctx_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_memc_module;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MEMC_END   (sizeof(CRLF "END" CRLF) - 1)[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_MODULE_H */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_request.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_request.c[m
[1mdeleted file mode 100644[m
[1mindex b02e322..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_request.c[m
[1m+++ /dev/null[m
[36m@@ -1,571 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (c) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_memc_request.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-#include "ngx_http_memc_util.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_storage_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    off_t                           bytes;[m
[31m-    size_t                          bytes_len;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *cl, *in;[m
[31m-    ngx_chain_t                   **ll;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-[m
[31m-    ngx_http_variable_value_t      *key_vv;[m
[31m-    ngx_http_variable_value_t      *flags_vv;[m
[31m-    ngx_http_variable_value_t      *exptime_vv;[m
[31m-    ngx_http_variable_value_t      *memc_value_vv;[m
[31m-[m
[31m-    u_char                          bytes_buf[NGX_UINT32_LEN];[m
[31m-[m
[31m-    /* TODO add support for the "cas" command */[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    /* prepare the "key" argument */[m
[31m-[m
[31m-    key_vv = ctx->memc_key_vv;[m
[31m-[m
[31m-    if (key_vv == NULL || key_vv->not_found || key_vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memc_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, key_vv->data, key_vv->len,[m
[31m-                                NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    /* prepare the "bytes" argument */[m
[31m-[m
[31m-    if (ctx->memc_value_vv && !ctx->memc_value_vv->not_found) {[m
[31m-        dd("found variable $memc_value");[m
[31m-[m
[31m-        memc_value_vv = ctx->memc_value_vv;[m
[31m-[m
[31m-        bytes = memc_value_vv->len;[m
[31m-[m
[31m-    } else if (r->request_body == NULL || r->request_body->bufs == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "neither the \"$memc_value\" variable "[m
[31m-                      "nor the request body is available");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-    } else {[m
[31m-        memc_value_vv = NULL;[m
[31m-[m
[31m-        bytes = 0;[m
[31m-        for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-            bytes += ngx_buf_size(cl->buf);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    bytes_len = ngx_snprintf(bytes_buf, sizeof(bytes_buf), "%O", bytes)[m
[31m-        - bytes_buf;[m
[31m-[m
[31m-    /* prepare the "flags" argument */[m
[31m-[m
[31m-    flags_vv = ctx->memc_flags_vv;[m
[31m-[m
[31m-    if (flags_vv == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags_vv->not_found) {[m
[31m-        flags_vv->not_found = 0;[m
[31m-        flags_vv->valid = 1;[m
[31m-        flags_vv->no_cacheable = 0;[m
[31m-        flags_vv->len = sizeof("0") - 1;[m
[31m-        flags_vv->data = (u_char *) "0";[m
[31m-    } else if (flags_vv->len == 0) {[m
[31m-        flags_vv->len = sizeof("0") - 1;[m
[31m-        flags_vv->data = (u_char *) "0";[m
[31m-    }[m
[31m-[m
[31m-    /* prepare the "exptime" argument */[m
[31m-[m
[31m-    exptime_vv = ctx->memc_exptime_vv;[m
[31m-[m
[31m-    if (exptime_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (exptime_vv->not_found || exptime_vv->len == 0) {[m
[31m-        dd("setting exptime to its default value 0...");[m
[31m-[m
[31m-        exptime_vv->not_found = 0;[m
[31m-        exptime_vv->valid = 1;[m
[31m-        exptime_vv->no_cacheable = 0;[m
[31m-        exptime_vv->len = sizeof("0") - 1;[m
[31m-        exptime_vv->data = (u_char *) "0";[m
[31m-    }[m
[31m-[m
[31m-    /* calculate the total length of the command */[m
[31m-[m
[31m-    len = ctx->cmd_str.len + sizeof(" ") - 1[m
[31m-        + key_vv->len + escape + sizeof(" ") - 1[m
[31m-        + flags_vv->len + sizeof(" ") - 1[m
[31m-        + exptime_vv->len + sizeof(" ") - 1[m
[31m-        + bytes_len[m
[31m-        + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    ll = &cl->next;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    /* copy the memcached command over */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    /* copy the memcached key over */[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, key_vv->data, key_vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, key_vv->data, key_vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    ctx->key.len = b->last - ctx->key.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http memcached request: \"%V\"", &ctx->key);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    /* copy the memcached flags over */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, flags_vv->data, flags_vv->len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    /* copy the memcached exptime over */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, exptime_vv->data, exptime_vv->len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    /* copy the memcached bytes over */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, bytes_buf, bytes_len);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (memc_value_vv) {[m
[31m-        if (memc_value_vv->len) {[m
[31m-            dd("copy $memc_value to the request");[m
[31m-            b = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->memory = 1;[m
[31m-[m
[31m-            b->start = b->pos = memc_value_vv->data;[m
[31m-            b->last  = b->end = b->start + memc_value_vv->len;[m
[31m-[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = b;[m
[31m-            cl->next = NULL;[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* to preserve the r->request_body->bufs untouched */[m
[31m-[m
[31m-        in = r->request_body->bufs;[m
[31m-[m
[31m-        while (in) {[m
[31m-            cl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = ngx_calloc_buf(r->pool);[m
[31m-            if (cl->buf == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->memory = 1;[m
[31m-            *cl->buf = *in->buf;[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-            in = in->next;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* append the trailing CRLF */[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->start = b->pos = (u_char *) CRLF;[m
[31m-    b->last  = b->end = b->start + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_get_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_http_variable_value_t      *vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    vv = ctx->memc_key_vv;[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found || vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memc_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, vv->data, vv->len, NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    len = sizeof("get ") - 1 + vv->len + escape + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' ';[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, vv->data, vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, vv->data, vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    ctx->key.len = b->last - ctx->key.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http memcached request: \"%V\"", &ctx->key);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    ctx->parser_state = NGX_ERROR;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_noarg_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    len = ctx->cmd_str.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_flush_all_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_http_variable_value_t      *exptime_vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    /* prepare the (optional) "exptime" argument */[m
[31m-[m
[31m-    exptime_vv = ctx->memc_exptime_vv;[m
[31m-[m
[31m-    if (exptime_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = ctx->cmd_str.len;[m
[31m-[m
[31m-    if (!exptime_vv->not_found && exptime_vv->len) {[m
[31m-        dd("found exptime: %s", exptime_vv->data);[m
[31m-[m
[31m-        len += sizeof(' ') + exptime_vv->len;[m
[31m-    }[m
[31m-[m
[31m-    len += sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    if (!exptime_vv->not_found && exptime_vv->len) {[m
[31m-        *b->last++ = ' ';[m
[31m-        b->last = ngx_copy(b->last, exptime_vv->data, exptime_vv->len);[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_delete_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_http_variable_value_t      *key_vv;[m
[31m-    ngx_http_variable_value_t      *exptime_vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    /* prepare the "key" argument */[m
[31m-[m
[31m-    key_vv = ctx->memc_key_vv;[m
[31m-[m
[31m-    if (key_vv == NULL || key_vv->not_found || key_vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memc_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, key_vv->data, key_vv->len,[m
[31m-                                NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    /* prepare the (optional) "exptime" argument */[m
[31m-[m
[31m-    exptime_vv = ctx->memc_exptime_vv;[m
[31m-[m
[31m-    if (exptime_vv == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = ctx->cmd_str.len + sizeof(' ') + key_vv->len + escape;[m
[31m-[m
[31m-    if (!exptime_vv->not_found && exptime_vv->len) {[m
[31m-        dd("found exptime: %s", exptime_vv->data);[m
[31m-[m
[31m-        len += sizeof(' ') + exptime_vv->len;[m
[31m-    }[m
[31m-[m
[31m-    len += sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, key_vv->data, key_vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, key_vv->data, key_vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    if (!exptime_vv->not_found && exptime_vv->len) {[m
[31m-        *b->last++ = ' ';[m
[31m-        b->last = ngx_copy(b->last, exptime_vv->data, exptime_vv->len);[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_create_incr_decr_cmd_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_http_memc_ctx_t            *ctx;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_http_variable_value_t      *key_vv;[m
[31m-    ngx_http_variable_value_t      *value_vv;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    /* prepare the "key" argument */[m
[31m-[m
[31m-    key_vv = ctx->memc_key_vv;[m
[31m-[m
[31m-    if (key_vv == NULL || key_vv->not_found || key_vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memc_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, key_vv->data, key_vv->len,[m
[31m-                                NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    /* prepare the "value" argument */[m
[31m-[m
[31m-    value_vv = ctx->memc_value_vv;[m
[31m-[m
[31m-    /* XXX validate if $memc_value_vv is a valid uint64 string */[m
[31m-[m
[31m-    len = ctx->cmd_str.len + sizeof(' ') + key_vv->len + escape[m
[31m-        + sizeof(' ') + value_vv->len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, key_vv->data, key_vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, key_vv->data, key_vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, value_vv->data, value_vv->len);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_request.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_request.h[m
[1mdeleted file mode 100644[m
[1mindex 10e74c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_request.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_MEMC_REQUEST_H[m
[31m-#define NGX_HTTP_MEMC_REQUEST_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_get_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_storage_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_noarg_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_flush_all_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_delete_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_create_incr_decr_cmd_request(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_REQUEST_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.c[m
[1mdeleted file mode 100644[m
[1mindex 697cf13..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.c[m
[1m+++ /dev/null[m
[36m@@ -1,3443 +0,0 @@[m
[31m-[m
[31m-#line 1 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_memc_response.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-[m
[31m-[m
[31m-#ifdef s_char[m
[31m-#undef s_char[m
[31m-#endif[m
[31m-[m
[31m-#define s_char signed char[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 24 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 29 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_storage_start = 1;[m
[31m-static const int memc_storage_first_final = 54;[m
[31m-static const int memc_storage_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 25 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 27 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 42 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_flush_all_start = 1;[m
[31m-static const int memc_flush_all_first_final = 30;[m
[31m-static const int memc_flush_all_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 28 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 30 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 55 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_version_start = 1;[m
[31m-static const int memc_version_first_final = 39;[m
[31m-static const int memc_version_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 31 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 33 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 68 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_stats_start = 1;[m
[31m-static const int memc_stats_first_final = 43;[m
[31m-static const int memc_stats_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 34 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 36 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 81 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_delete_start = 1;[m
[31m-static const int memc_delete_first_final = 45;[m
[31m-static const int memc_delete_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 37 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-#line 39 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-#line 94 "src/ngx_http_memc_response.c"[m
[31m-static const int memc_incr_decr_start = 1;[m
[31m-static const int memc_incr_decr_first_final = 40;[m
[31m-static const int memc_incr_decr_error = 0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-#line 40 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-[m
[31m-u_char  ngx_http_memc_end[] = CRLF "END" CRLF;[m
[31m-[m
[31m-[m
[31m-static u_char *parse_memc_storage(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_flush_all(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_version(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_stats(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_delete(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_incr_decr(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static ngx_int_t ngx_http_memc_write_simple_response(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u, ngx_http_memc_ctx_t *ctx,[m
[31m-        ngx_uint_t status, ngx_str_t *resp);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_process_simple_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    int                      cs;[m
[31m-    s_char                  *p;[m
[31m-    s_char                  *pe;[m
[31m-    s_char                  *orig;[m
[31m-    ngx_str_t                resp;[m
[31m-    ngx_http_upstream_t     *u;[m
[31m-    ngx_http_memc_ctx_t     *ctx;[m
[31m-    ngx_uint_t               status;[m
[31m-    unsigned                 done = 0;[m
[31m-    int                      error_state;[m
[31m-    int                      final_state;[m
[31m-[m
[31m-    status = NGX_HTTP_OK;[m
[31m-[m
[31m-    dd("process simple cmd header");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    if (ctx->parser_state == NGX_ERROR) {[m
[31m-        dd("reinit state");[m
[31m-[m
[31m-        if (ctx->is_storage_cmd) {[m
[31m-            dd("init memc_storage machine...");[m
[31m-[m
[31m-            [m
[31m-#line 91 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 156 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_storage_start;[m
[31m-	}[m
[31m-[m
[31m-#line 92 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-            dd("init memc_flush_all machine...");[m
[31m-[m
[31m-            [m
[31m-#line 97 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 169 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_flush_all_start;[m
[31m-	}[m
[31m-[m
[31m-#line 98 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_version) {[m
[31m-            dd("init memc_version machine...");[m
[31m-[m
[31m-            [m
[31m-#line 103 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 182 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_version_start;[m
[31m-	}[m
[31m-[m
[31m-#line 104 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_stats) {[m
[31m-            dd("init memc_stats machine...");[m
[31m-[m
[31m-            [m
[31m-#line 109 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 195 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_stats_start;[m
[31m-	}[m
[31m-[m
[31m-#line 110 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_delete) {[m
[31m-            dd("init memc_delete machine...");[m
[31m-[m
[31m-            [m
[31m-#line 115 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 208 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_delete_start;[m
[31m-	}[m
[31m-[m
[31m-#line 116 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_incr[m
[31m-                || ctx->cmd == ngx_http_memc_cmd_decr)[m
[31m-        {[m
[31m-            dd("init memc_incr_decr machine...");[m
[31m-[m
[31m-            [m
[31m-#line 123 "src/ngx_http_memc_response.rl"[m
[31m-            [m
[31m-#line 223 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	cs = memc_incr_decr_start;[m
[31m-	}[m
[31m-[m
[31m-#line 124 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-              "unrecognized memcached command in "[m
[31m-              "ngx_http_memc_process_simple_header: \"%V\"",[m
[31m-              &ctx->cmd_str);[m
[31m-[m
[31m-            return NGX_ERROR; /* this results in 500 status */[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cs = ctx->parser_state;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    orig = (s_char *) u->buffer.pos;[m
[31m-[m
[31m-    p  = (s_char *) u->buffer.pos;[m
[31m-    pe = (s_char *) u->buffer.last;[m
[31m-[m
[31m-    dd("buffer len: %d", (int) (pe - p));[m
[31m-[m
[31m-    if (ctx->is_storage_cmd) {[m
[31m-        error_state = memc_storage_error;[m
[31m-        final_state = memc_storage_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_storage(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-        error_state = memc_flush_all_error;[m
[31m-        final_state = memc_flush_all_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_flush_all(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_version) {[m
[31m-        error_state = memc_version_error;[m
[31m-        final_state = memc_version_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_version(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_stats) {[m
[31m-        error_state = memc_stats_error;[m
[31m-        final_state = memc_stats_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_stats(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_delete) {[m
[31m-        error_state = memc_delete_error;[m
[31m-        final_state = memc_delete_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_delete(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_incr[m
[31m-            || ctx->cmd == ngx_http_memc_cmd_decr)[m
[31m-    {[m
[31m-        error_state = memc_incr_decr_error;[m
[31m-        final_state = memc_incr_decr_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_incr_decr(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-          "unrecognized memcached command in "[m
[31m-          "ngx_http_memc_process_simple_header: \"%V\"",[m
[31m-          &ctx->cmd_str);[m
[31m-[m
[31m-        return NGX_ERROR; /* this results in 500 status */[m
[31m-    }[m
[31m-[m
[31m-    ctx->parser_state = cs;[m
[31m-[m
[31m-    resp.data = u->buffer.start;[m
[31m-    resp.len  = (u_char *) p - resp.data;[m
[31m-[m
[31m-    u->buffer.pos = (u_char *) p;[m
[31m-[m
[31m-    dd("machine state: %d (done: %d)", cs, done);[m
[31m-    dd("memcached response: (len: %d) %s", (int) resp.len, resp.data);[m
[31m-[m
[31m-    if (done || cs >= final_state) {[m
[31m-        dd("memcached response parsed (resp.len: %d)", (int) resp.len);[m
[31m-[m
[31m-        rc = ngx_http_memc_write_simple_response(r, u, ctx, status, &resp);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (cs == error_state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response for command \"%V\" "[m
[31m-                  "at pos %O: %V", &ctx->cmd_str, (off_t) (p - orig), &resp);[m
[31m-[m
[31m-        status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        u->headers_in.status_n = status;[m
[31m-        u->state->status = status;[m
[31m-[m
[31m-        /* u->headers_in.status_n will be the final status */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("we need more data to proceed (returned NGX_AGAIN)");[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_empty_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    u->length = 0;[m
[31m-[m
[31m-    /* to persuade ngx_http_upstream_keepalive (if any)[m
[31m-       to cache the connection if the status is neither[m
[31m-       200 nor 404. */[m
[31m-    if (u->headers_in.status_n == NGX_HTTP_CREATED) {[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_empty_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    /* recover the buffer for subrequests in memory */[m
[31m-    u->buffer.last += ctx->body_length;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_get_cmd_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    dd("filter init: u->length: %d", (int) u->length);[m
[31m-[m
[31m-    u->length = u->headers_in.content_length_n + NGX_HTTP_MEMC_END;[m
[31m-[m
[31m-    dd("filter init (2): u->length: %d", (int) u->length);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_get_cmd_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-[m
[31m-    u_char               *last;[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (u->length == ctx->rest) {[m
[31m-[m
[31m-        if (ngx_strncmp(b->last,[m
[31m-                        ngx_http_memc_end + NGX_HTTP_MEMC_END - ctx->rest,[m
[31m-                        bytes) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                          "memcached sent invalid trailer");[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            ctx->rest = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->length -= bytes;[m
[31m-        ctx->rest -= bytes;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = b->last;[m
[31m-    cl->buf->pos = last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "memcached filter bytes:%z size:%z length:%z rest:%z",[m
[31m-                   bytes, b->last - b->pos, u->length, ctx->rest);[m
[31m-[m
[31m-    if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMC_END)) {[m
[31m-        u->length -= bytes;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    last += u->length - NGX_HTTP_MEMC_END;[m
[31m-[m
[31m-    if (ngx_strncmp(last, ngx_http_memc_end, b->last - last) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                      "memcached sent invalid trailer");[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        b->last = last;[m
[31m-        cl->buf->last = last;[m
[31m-        u->length = 0;[m
[31m-        ctx->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest -= b->last - last;[m
[31m-    b->last = last;[m
[31m-    cl->buf->last = last;[m
[31m-    u->length = ctx->rest;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_process_get_cmd_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t        *conf;[m
[31m-    u_char                          *p, *len;[m
[31m-    ngx_str_t                        line;[m
[31m-    ngx_http_upstream_t             *u;[m
[31m-    ngx_http_memc_ctx_t             *ctx;[m
[31m-    ngx_http_variable_value_t       *flags_vv;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    dd("process header: u->length: %u", (unsigned) u->length);[m
[31m-[m
[31m-    for (p = u->buffer.pos; p < u->buffer.last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    line.len = p - u->buffer.pos - 1;[m
[31m-    line.data = u->buffer.pos;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "memcached: \"%V\"", &line);[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {[m
[31m-[m
[31m-        p += sizeof("VALUE ") - 1;[m
[31m-[m
[31m-        if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid key in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        p += ctx->key.len;[m
[31m-[m
[31m-        if (*p++ != ' ') {[m
[31m-            goto no_valid;[m
[31m-        }[m
[31m-[m
[31m-        /* save flags */[m
[31m-[m
[31m-        flags_vv = ctx->memc_flags_vv;[m
[31m-[m
[31m-        if (flags_vv == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (flags_vv->not_found) {[m
[31m-            flags_vv->not_found = 0;[m
[31m-            flags_vv->valid = 1;[m
[31m-            flags_vv->no_cacheable = 0;[m
[31m-        }[m
[31m-[m
[31m-        flags_vv->data = p;[m
[31m-[m
[31m-        while (*p) {[m
[31m-            if (*p++ == ' ') {[m
[31m-                flags_vv->len = p - 1 - flags_vv->data;[m
[31m-                conf = ngx_http_get_module_loc_conf(r, ngx_http_memc_module);[m
[31m-[m
[31m-                if (conf->flags_to_last_modified) {[m
[31m-                    r->headers_out.last_modified_time =[m
[31m-                            ngx_atotm(flags_vv->data, flags_vv->len);[m
[31m-                }[m
[31m-[m
[31m-                goto length;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto no_valid;[m
[31m-[m
[31m-    length:[m
[31m-[m
[31m-        len = p;[m
[31m-[m
[31m-        while (*p && *p++ != CR) { /* void */ }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        u->headers_in.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (u->headers_in.content_length_n == -1) {[m
[31m-#else[m
[31m-        r->headers_out.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (r->headers_out.content_length_n == -1) {[m
[31m-#endif[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid length in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-        u->state->status = NGX_HTTP_OK;[m
[31m-        u->buffer.pos = p + 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(p, "END\x0d") == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "key: \"%V\" was not found by memcached", &ctx->key);[m
[31m-[m
[31m-        u->headers_in.status_n = NGX_HTTP_NOT_FOUND;[m
[31m-        u->state->status = NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        u->keepalive = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-no_valid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response: \"%V\"", &line);[m
[31m-[m
[31m-    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_write_simple_response(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_memc_ctx_t *ctx, ngx_uint_t status,[m
[31m-    ngx_str_t *resp)[m
[31m-{[m
[31m-    ngx_chain_t             *cl, **ll;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-    cl->buf->pos = resp->data;[m
[31m-    cl->buf->last = cl->buf->pos + resp->len;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    /* for subrequests in memory */[m
[31m-    u->buffer.pos = resp->data;[m
[31m-    u->buffer.last = resp->data + resp->len;[m
[31m-    ctx->body_length = resp->len;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    u->headers_in.content_length_n = resp->len;[m
[31m-    u->keepalive = 1;[m
[31m-#else[m
[31m-    r->headers_out.content_length_n = resp->len;[m
[31m-#endif[m
[31m-[m
[31m-    u->headers_in.status_n = status;[m
[31m-    u->state->status = status;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_storage(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 577 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 578 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 686 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 69: goto st16;[m
[31m-		case 78: goto st28;[m
[31m-		case 83: goto st43;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr18;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr18:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st54;[m
[31m-tr30:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st54;[m
[31m-tr41:[m
[31m-#line 37 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 404");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st54;[m
[31m-tr56:[m
[31m-#line 31 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 201");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_CREATED;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st54;[m
[31m-st54:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof54;[m
[31m-case 54:[m
[31m-#line 854 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	switch( (*p) ) {[m
[31m-		case 82: goto st17;[m
[31m-		case 88: goto st22;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st20;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr18;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 83 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st25;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	if ( (*p) == 83 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st27;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr30;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st30;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st31;[m
[31m-	goto st0;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-	switch( (*p) ) {[m
[31m-		case 70: goto st32;[m
[31m-		case 83: goto st38;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	if ( (*p) == 85 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st35;[m
[31m-	goto st0;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st36;[m
[31m-	goto st0;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st37;[m
[31m-	goto st0;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr41;[m
[31m-	goto st0;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st39;[m
[31m-	goto st0;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st40;[m
[31m-	goto st0;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st41;[m
[31m-	goto st0;[m
[31m-st41:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof41;[m
[31m-case 41:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st42;[m
[31m-	goto st0;[m
[31m-st42:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof42;[m
[31m-case 42:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st43:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof43;[m
[31m-case 43:[m
[31m-	switch( (*p) ) {[m
[31m-		case 69: goto st44;[m
[31m-		case 84: goto st48;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st44:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof44;[m
[31m-case 44:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st45;[m
[31m-	goto st0;[m
[31m-st45:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof45;[m
[31m-case 45:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st46;[m
[31m-	goto st0;[m
[31m-st46:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof46;[m
[31m-case 46:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st47;[m
[31m-	goto st0;[m
[31m-st47:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof47;[m
[31m-case 47:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st48:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof48;[m
[31m-case 48:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st49;[m
[31m-	goto st0;[m
[31m-st49:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof49;[m
[31m-case 49:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st50;[m
[31m-	goto st0;[m
[31m-st50:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof50;[m
[31m-case 50:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st51;[m
[31m-	goto st0;[m
[31m-st51:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof51;[m
[31m-case 51:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st52;[m
[31m-	goto st0;[m
[31m-st52:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof52;[m
[31m-case 52:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st53;[m
[31m-	goto st0;[m
[31m-st53:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof53;[m
[31m-case 53:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr56;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof54: cs = 54; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof41: cs = 41; goto _test_eof; [m
[31m-	_test_eof42: cs = 42; goto _test_eof; [m
[31m-	_test_eof43: cs = 43; goto _test_eof; [m
[31m-	_test_eof44: cs = 44; goto _test_eof; [m
[31m-	_test_eof45: cs = 45; goto _test_eof; [m
[31m-	_test_eof46: cs = 46; goto _test_eof; [m
[31m-	_test_eof47: cs = 47; goto _test_eof; [m
[31m-	_test_eof48: cs = 48; goto _test_eof; [m
[31m-	_test_eof49: cs = 49; goto _test_eof; [m
[31m-	_test_eof50: cs = 50; goto _test_eof; [m
[31m-	_test_eof51: cs = 51; goto _test_eof; [m
[31m-	_test_eof52: cs = 52; goto _test_eof; [m
[31m-	_test_eof53: cs = 53; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 579 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_flush_all(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 593 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 594 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 1206 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 69: goto st16;[m
[31m-		case 79: goto st22;[m
[31m-		case 83: goto st25;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr18;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr18:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st30;[m
[31m-tr26:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st30;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-#line 1348 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st17;[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st20;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr18;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 75 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr26;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st27;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st28;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 595 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_version(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 609 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 610 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 1502 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 69: goto st16;[m
[31m-		case 83: goto st22;[m
[31m-		case 86: goto st27;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr18;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr18:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st39;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-#line 1637 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st17;[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st20;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr18;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st25;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st28;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 83 )[m
[31m-		goto st30;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st31;[m
[31m-	goto st0;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st32;[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st37;[m
[31m-	goto st35;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st36;[m
[31m-	goto st35;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr38;[m
[31m-		case 13: goto st36;[m
[31m-	}[m
[31m-	goto st35;[m
[31m-tr38:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st40;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-#line 1799 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st36;[m
[31m-	goto st35;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto st38;[m
[31m-		case 13: goto st36;[m
[31m-	}[m
[31m-	goto st35;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	goto st35;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 611 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_stats(int *cs_addr, u_char *p, u_char *pe, ngx_uint_t *status_addr,[m
[31m-    unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 625 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 626 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 1881 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 69: goto st16;[m
[31m-		case 83: goto st25;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr17;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr17:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st43;[m
[31m-tr22:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st43;[m
[31m-st43:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof43;[m
[31m-case 43:[m
[31m-#line 2022 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	switch( (*p) ) {[m
[31m-		case 78: goto st17;[m
[31m-		case 82: goto st20;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr22;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st22;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st24;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr17;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	switch( (*p) ) {[m
[31m-		case 69: goto st26;[m
[31m-		case 84: goto st30;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st27;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st28;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	if ( (*p) == 65 )[m
[31m-		goto st31;[m
[31m-	goto st0;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st32;[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st41;[m
[31m-	goto st34;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st35;[m
[31m-	goto st34;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto st36;[m
[31m-		case 13: goto st35;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st35;[m
[31m-		case 69: goto st37;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st35;[m
[31m-		case 78: goto st38;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st35;[m
[31m-		case 68: goto st39;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st40;[m
[31m-	goto st34;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr43;[m
[31m-		case 13: goto st35;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-tr43:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st44;[m
[31m-st44:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof44;[m
[31m-case 44:[m
[31m-#line 2224 "src/ngx_http_memc_response.c"[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto st35;[m
[31m-		case 69: goto st37;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st41:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof41;[m
[31m-case 41:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto st42;[m
[31m-		case 13: goto st35;[m
[31m-	}[m
[31m-	goto st34;[m
[31m-st42:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof42;[m
[31m-case 42:[m
[31m-	goto st34;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof43: cs = 43; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof44: cs = 44; goto _test_eof; [m
[31m-	_test_eof41: cs = 41; goto _test_eof; [m
[31m-	_test_eof42: cs = 42; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 627 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_delete(int *cs_addr, u_char *p, u_char *pe, ngx_uint_t *status_addr,[m
[31m-    unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 641 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 642 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 2312 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto st2;[m
[31m-		case 68: goto st16;[m
[31m-		case 69: goto st24;[m
[31m-		case 78: goto st30;[m
[31m-		case 83: goto st40;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st3;[m
[31m-	goto st0;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto st4;[m
[31m-	goto st0;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st5;[m
[31m-	goto st0;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st6;[m
[31m-	goto st0;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st8;[m
[31m-	goto st0;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st9;[m
[31m-	goto st0;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st10;[m
[31m-	goto st0;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st11;[m
[31m-	goto st0;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st12;[m
[31m-	goto st0;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st13;[m
[31m-	goto st0;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto st14;[m
[31m-	goto st0;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st15;[m
[31m-	goto st14;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr19;[m
[31m-		case 13: goto st15;[m
[31m-	}[m
[31m-	goto st14;[m
[31m-tr19:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st45;[m
[31m-tr27:[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st45;[m
[31m-tr42:[m
[31m-#line 37 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 404");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-	goto st45;[m
[31m-st45:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof45;[m
[31m-case 45:[m
[31m-#line 2468 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st17;[m
[31m-	goto st0;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto st18;[m
[31m-	goto st0;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st19;[m
[31m-	goto st0;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st20;[m
[31m-	goto st0;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st21;[m
[31m-	goto st0;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st22;[m
[31m-	goto st0;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st23;[m
[31m-	goto st0;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr27;[m
[31m-	goto st0;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st25;[m
[31m-	goto st0;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st26;[m
[31m-	goto st0;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st27;[m
[31m-	goto st0;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st28;[m
[31m-	goto st0;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st29;[m
[31m-	goto st0;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr19;[m
[31m-	goto st0;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st31;[m
[31m-	goto st0;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto st32;[m
[31m-	goto st0;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto st33;[m
[31m-	goto st0;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-	if ( (*p) == 70 )[m
[31m-		goto st34;[m
[31m-	goto st0;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto st35;[m
[31m-	goto st0;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-	if ( (*p) == 85 )[m
[31m-		goto st36;[m
[31m-	goto st0;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto st37;[m
[31m-	goto st0;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto st38;[m
[31m-	goto st0;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto st39;[m
[31m-	goto st0;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr42;[m
[31m-	goto st0;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st41;[m
[31m-	goto st0;[m
[31m-st41:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof41;[m
[31m-case 41:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st42;[m
[31m-	goto st0;[m
[31m-st42:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof42;[m
[31m-case 42:[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto st43;[m
[31m-	goto st0;[m
[31m-st43:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof43;[m
[31m-case 43:[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto st44;[m
[31m-	goto st0;[m
[31m-st44:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof44;[m
[31m-case 44:[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto st7;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof45: cs = 45; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof41: cs = 41; goto _test_eof; [m
[31m-	_test_eof42: cs = 42; goto _test_eof; [m
[31m-	_test_eof43: cs = 43; goto _test_eof; [m
[31m-	_test_eof44: cs = 44; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 643 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_incr_decr(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    [m
[31m-#line 657 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 658 "src/ngx_http_memc_response.rl"[m
[31m-    [m
[31m-#line 2742 "src/ngx_http_memc_response.c"[m
[31m-	{[m
[31m-	if ( p == pe )[m
[31m-		goto _test_eof;[m
[31m-	switch ( cs )[m
[31m-	{[m
[31m-case 1:[m
[31m-	switch( (*p) ) {[m
[31m-		case 67: goto tr2;[m
[31m-		case 69: goto tr3;[m
[31m-		case 78: goto tr4;[m
[31m-		case 83: goto tr5;[m
[31m-	}[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto tr0;[m
[31m-	goto st0;[m
[31m-st0:[m
[31m-cs = 0;[m
[31m-	goto _out;[m
[31m-tr0:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st2;[m
[31m-st2:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof2;[m
[31m-case 2:[m
[31m-#line 2772 "src/ngx_http_memc_response.c"[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto tr6;[m
[31m-		case 32: goto tr7;[m
[31m-	}[m
[31m-	if ( 48 <= (*p) && (*p) <= 57 )[m
[31m-		goto tr0;[m
[31m-	goto st0;[m
[31m-tr6:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st3;[m
[31m-st3:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof3;[m
[31m-case 3:[m
[31m-#line 2791 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr8;[m
[31m-	goto st0;[m
[31m-tr8:[m
[31m-#line 31 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 201");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_CREATED;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st40;[m
[31m-tr22:[m
[31m-#line 4 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("caught error...");[m
[31m-        dd("machine state: %d", cs);[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st40;[m
[31m-tr37:[m
[31m-#line 37 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("status set to 404");[m
[31m-[m
[31m-        *status_addr = NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-#line 21 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("done it!");[m
[31m-        *done_addr = 1;[m
[31m-    }[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st40;[m
[31m-st40:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof40;[m
[31m-case 40:[m
[31m-#line 2854 "src/ngx_http_memc_response.c"[m
[31m-	goto st0;[m
[31m-tr7:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st4;[m
[31m-st4:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof4;[m
[31m-case 4:[m
[31m-#line 2867 "src/ngx_http_memc_response.c"[m
[31m-	switch( (*p) ) {[m
[31m-		case 13: goto tr6;[m
[31m-		case 32: goto tr7;[m
[31m-	}[m
[31m-	goto st0;[m
[31m-tr2:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st5;[m
[31m-st5:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof5;[m
[31m-case 5:[m
[31m-#line 2884 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 76 )[m
[31m-		goto tr9;[m
[31m-	goto st0;[m
[31m-tr9:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st6;[m
[31m-st6:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof6;[m
[31m-case 6:[m
[31m-#line 2899 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 73 )[m
[31m-		goto tr10;[m
[31m-	goto st0;[m
[31m-tr10:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st7;[m
[31m-st7:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof7;[m
[31m-case 7:[m
[31m-#line 2914 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto tr11;[m
[31m-	goto st0;[m
[31m-tr11:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st8;[m
[31m-st8:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof8;[m
[31m-case 8:[m
[31m-#line 2929 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto tr12;[m
[31m-	goto st0;[m
[31m-tr12:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st9;[m
[31m-st9:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof9;[m
[31m-case 9:[m
[31m-#line 2944 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto tr13;[m
[31m-	goto st0;[m
[31m-tr13:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st10;[m
[31m-st10:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof10;[m
[31m-case 10:[m
[31m-#line 2959 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto tr14;[m
[31m-	goto st0;[m
[31m-tr14:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st11;[m
[31m-st11:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof11;[m
[31m-case 11:[m
[31m-#line 2974 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto tr15;[m
[31m-	goto st0;[m
[31m-tr15:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st12;[m
[31m-st12:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof12;[m
[31m-case 12:[m
[31m-#line 2989 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr16;[m
[31m-	goto st0;[m
[31m-tr16:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st13;[m
[31m-st13:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof13;[m
[31m-case 13:[m
[31m-#line 3004 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr17;[m
[31m-	goto st0;[m
[31m-tr17:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st14;[m
[31m-st14:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof14;[m
[31m-case 14:[m
[31m-#line 3019 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto tr18;[m
[31m-	goto st0;[m
[31m-tr18:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st15;[m
[31m-st15:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof15;[m
[31m-case 15:[m
[31m-#line 3034 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr19;[m
[31m-	goto st0;[m
[31m-tr19:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st16;[m
[31m-st16:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof16;[m
[31m-case 16:[m
[31m-#line 3049 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 32 )[m
[31m-		goto tr20;[m
[31m-	goto st0;[m
[31m-tr20:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st17;[m
[31m-st17:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof17;[m
[31m-case 17:[m
[31m-#line 3064 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto tr21;[m
[31m-	goto tr20;[m
[31m-tr21:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st18;[m
[31m-st18:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof18;[m
[31m-case 18:[m
[31m-#line 3079 "src/ngx_http_memc_response.c"[m
[31m-	switch( (*p) ) {[m
[31m-		case 10: goto tr22;[m
[31m-		case 13: goto tr21;[m
[31m-	}[m
[31m-	goto tr20;[m
[31m-tr3:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st19;[m
[31m-st19:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof19;[m
[31m-case 19:[m
[31m-#line 3096 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr23;[m
[31m-	goto st0;[m
[31m-tr23:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st20;[m
[31m-st20:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof20;[m
[31m-case 20:[m
[31m-#line 3111 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr24;[m
[31m-	goto st0;[m
[31m-tr24:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st21;[m
[31m-st21:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof21;[m
[31m-case 21:[m
[31m-#line 3126 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto tr25;[m
[31m-	goto st0;[m
[31m-tr25:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st22;[m
[31m-st22:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof22;[m
[31m-case 22:[m
[31m-#line 3141 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr26;[m
[31m-	goto st0;[m
[31m-tr26:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st23;[m
[31m-st23:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof23;[m
[31m-case 23:[m
[31m-#line 3156 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto tr27;[m
[31m-	goto st0;[m
[31m-tr27:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st24;[m
[31m-st24:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof24;[m
[31m-case 24:[m
[31m-#line 3171 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr22;[m
[31m-	goto st0;[m
[31m-tr4:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st25;[m
[31m-st25:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof25;[m
[31m-case 25:[m
[31m-#line 3186 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto tr28;[m
[31m-	goto st0;[m
[31m-tr28:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st26;[m
[31m-st26:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof26;[m
[31m-case 26:[m
[31m-#line 3201 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 84 )[m
[31m-		goto tr29;[m
[31m-	goto st0;[m
[31m-tr29:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st27;[m
[31m-st27:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof27;[m
[31m-case 27:[m
[31m-#line 3216 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 95 )[m
[31m-		goto tr30;[m
[31m-	goto st0;[m
[31m-tr30:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st28;[m
[31m-st28:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof28;[m
[31m-case 28:[m
[31m-#line 3231 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 70 )[m
[31m-		goto tr31;[m
[31m-	goto st0;[m
[31m-tr31:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st29;[m
[31m-st29:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof29;[m
[31m-case 29:[m
[31m-#line 3246 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 79 )[m
[31m-		goto tr32;[m
[31m-	goto st0;[m
[31m-tr32:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st30;[m
[31m-st30:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof30;[m
[31m-case 30:[m
[31m-#line 3261 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 85 )[m
[31m-		goto tr33;[m
[31m-	goto st0;[m
[31m-tr33:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st31;[m
[31m-st31:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof31;[m
[31m-case 31:[m
[31m-#line 3276 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 78 )[m
[31m-		goto tr34;[m
[31m-	goto st0;[m
[31m-tr34:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st32;[m
[31m-st32:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof32;[m
[31m-case 32:[m
[31m-#line 3291 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 68 )[m
[31m-		goto tr35;[m
[31m-	goto st0;[m
[31m-tr35:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st33;[m
[31m-st33:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof33;[m
[31m-case 33:[m
[31m-#line 3306 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 13 )[m
[31m-		goto tr36;[m
[31m-	goto st0;[m
[31m-tr36:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st34;[m
[31m-st34:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof34;[m
[31m-case 34:[m
[31m-#line 3321 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 10 )[m
[31m-		goto tr37;[m
[31m-	goto st0;[m
[31m-tr5:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st35;[m
[31m-st35:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof35;[m
[31m-case 35:[m
[31m-#line 3336 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto tr38;[m
[31m-	goto st0;[m
[31m-tr38:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st36;[m
[31m-st36:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof36;[m
[31m-case 36:[m
[31m-#line 3351 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr39;[m
[31m-	goto st0;[m
[31m-tr39:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st37;[m
[31m-st37:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof37;[m
[31m-case 37:[m
[31m-#line 3366 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 86 )[m
[31m-		goto tr40;[m
[31m-	goto st0;[m
[31m-tr40:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st38;[m
[31m-st38:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof38;[m
[31m-case 38:[m
[31m-#line 3381 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 69 )[m
[31m-		goto tr41;[m
[31m-	goto st0;[m
[31m-tr41:[m
[31m-#line 26 "src/memc_common.rl"[m
[31m-	{[m
[31m-        dd("state %d, left %d, reading char '%c'", cs,[m
[31m-        (int) (pe - p), *p);[m
[31m-    }[m
[31m-	goto st39;[m
[31m-st39:[m
[31m-	if ( ++p == pe )[m
[31m-		goto _test_eof39;[m
[31m-case 39:[m
[31m-#line 3396 "src/ngx_http_memc_response.c"[m
[31m-	if ( (*p) == 82 )[m
[31m-		goto tr13;[m
[31m-	goto st0;[m
[31m-	}[m
[31m-	_test_eof2: cs = 2; goto _test_eof; [m
[31m-	_test_eof3: cs = 3; goto _test_eof; [m
[31m-	_test_eof40: cs = 40; goto _test_eof; [m
[31m-	_test_eof4: cs = 4; goto _test_eof; [m
[31m-	_test_eof5: cs = 5; goto _test_eof; [m
[31m-	_test_eof6: cs = 6; goto _test_eof; [m
[31m-	_test_eof7: cs = 7; goto _test_eof; [m
[31m-	_test_eof8: cs = 8; goto _test_eof; [m
[31m-	_test_eof9: cs = 9; goto _test_eof; [m
[31m-	_test_eof10: cs = 10; goto _test_eof; [m
[31m-	_test_eof11: cs = 11; goto _test_eof; [m
[31m-	_test_eof12: cs = 12; goto _test_eof; [m
[31m-	_test_eof13: cs = 13; goto _test_eof; [m
[31m-	_test_eof14: cs = 14; goto _test_eof; [m
[31m-	_test_eof15: cs = 15; goto _test_eof; [m
[31m-	_test_eof16: cs = 16; goto _test_eof; [m
[31m-	_test_eof17: cs = 17; goto _test_eof; [m
[31m-	_test_eof18: cs = 18; goto _test_eof; [m
[31m-	_test_eof19: cs = 19; goto _test_eof; [m
[31m-	_test_eof20: cs = 20; goto _test_eof; [m
[31m-	_test_eof21: cs = 21; goto _test_eof; [m
[31m-	_test_eof22: cs = 22; goto _test_eof; [m
[31m-	_test_eof23: cs = 23; goto _test_eof; [m
[31m-	_test_eof24: cs = 24; goto _test_eof; [m
[31m-	_test_eof25: cs = 25; goto _test_eof; [m
[31m-	_test_eof26: cs = 26; goto _test_eof; [m
[31m-	_test_eof27: cs = 27; goto _test_eof; [m
[31m-	_test_eof28: cs = 28; goto _test_eof; [m
[31m-	_test_eof29: cs = 29; goto _test_eof; [m
[31m-	_test_eof30: cs = 30; goto _test_eof; [m
[31m-	_test_eof31: cs = 31; goto _test_eof; [m
[31m-	_test_eof32: cs = 32; goto _test_eof; [m
[31m-	_test_eof33: cs = 33; goto _test_eof; [m
[31m-	_test_eof34: cs = 34; goto _test_eof; [m
[31m-	_test_eof35: cs = 35; goto _test_eof; [m
[31m-	_test_eof36: cs = 36; goto _test_eof; [m
[31m-	_test_eof37: cs = 37; goto _test_eof; [m
[31m-	_test_eof38: cs = 38; goto _test_eof; [m
[31m-	_test_eof39: cs = 39; goto _test_eof; [m
[31m-[m
[31m-	_test_eof: {}[m
[31m-	_out: {}[m
[31m-	}[m
[31m-[m
[31m-#line 659 "src/ngx_http_memc_response.rl"[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.h[m
[1mdeleted file mode 100644[m
[1mindex aec26dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.h[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_MEMC_RESPONSE_H[m
[31m-#define NGX_HTTP_MEMC_RESPONSE_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_process_get_cmd_header(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_get_cmd_filter_init(void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_get_cmd_filter(void *data, ssize_t bytes);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_process_simple_header(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_empty_filter_init(void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_empty_filter(void *data, ssize_t bytes);[m
[31m-[m
[31m-ngx_int_t ngx_http_memc_process_flush_all_cmd_header(ngx_http_request_t *r);[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_RESPONSE_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.rl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.rl[m
[1mdeleted file mode 100644[m
[1mindex 31f7c83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_response.rl[m
[1m+++ /dev/null[m
[36m@@ -1,663 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_memc_response.h"[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-[m
[31m-[m
[31m-#ifdef s_char[m
[31m-#undef s_char[m
[31m-#endif[m
[31m-[m
[31m-#define s_char signed char[m
[31m-[m
[31m-[m
[31m-%% machine memc_storage;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_flush_all;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_version;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_stats;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_delete;[m
[31m-%% write data;[m
[31m-[m
[31m-%% machine memc_incr_decr;[m
[31m-%% write data;[m
[31m-[m
[31m-[m
[31m-u_char  ngx_http_memc_end[] = CRLF "END" CRLF;[m
[31m-[m
[31m-[m
[31m-static u_char *parse_memc_storage(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_flush_all(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_version(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_stats(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_delete(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static u_char *parse_memc_incr_decr(int *cs_addr, u_char *p, u_char *pe,[m
[31m-        ngx_uint_t *status_addr, unsigned *done_addr);[m
[31m-static ngx_int_t ngx_http_memc_write_simple_response(ngx_http_request_t *r,[m
[31m-        ngx_http_upstream_t *u, ngx_http_memc_ctx_t *ctx,[m
[31m-        ngx_uint_t status, ngx_str_t *resp);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_process_simple_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    int                      cs;[m
[31m-    s_char                  *p;[m
[31m-    s_char                  *pe;[m
[31m-    s_char                  *orig;[m
[31m-    ngx_str_t                resp;[m
[31m-    ngx_http_upstream_t     *u;[m
[31m-    ngx_http_memc_ctx_t     *ctx;[m
[31m-    ngx_uint_t               status;[m
[31m-    unsigned                 done = 0;[m
[31m-    int                      error_state;[m
[31m-    int                      final_state;[m
[31m-[m
[31m-    status = NGX_HTTP_OK;[m
[31m-[m
[31m-    dd("process simple cmd header");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    if (ctx->parser_state == NGX_ERROR) {[m
[31m-        dd("reinit state");[m
[31m-[m
[31m-        if (ctx->is_storage_cmd) {[m
[31m-            dd("init memc_storage machine...");[m
[31m-[m
[31m-            %% machine memc_storage;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-            dd("init memc_flush_all machine...");[m
[31m-[m
[31m-            %% machine memc_flush_all;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_version) {[m
[31m-            dd("init memc_version machine...");[m
[31m-[m
[31m-            %% machine memc_version;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_stats) {[m
[31m-            dd("init memc_stats machine...");[m
[31m-[m
[31m-            %% machine memc_stats;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_delete) {[m
[31m-            dd("init memc_delete machine...");[m
[31m-[m
[31m-            %% machine memc_delete;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else if (ctx->cmd == ngx_http_memc_cmd_incr[m
[31m-                || ctx->cmd == ngx_http_memc_cmd_decr)[m
[31m-        {[m
[31m-            dd("init memc_incr_decr machine...");[m
[31m-[m
[31m-            %% machine memc_incr_decr;[m
[31m-            %% write init;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-              "unrecognized memcached command in "[m
[31m-              "ngx_http_memc_process_simple_header: \"%V\"",[m
[31m-              &ctx->cmd_str);[m
[31m-[m
[31m-            return NGX_ERROR; /* this results in 500 status */[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cs = ctx->parser_state;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    orig = (s_char *) u->buffer.pos;[m
[31m-[m
[31m-    p  = (s_char *) u->buffer.pos;[m
[31m-    pe = (s_char *) u->buffer.last;[m
[31m-[m
[31m-    dd("buffer len: %d", (int) (pe - p));[m
[31m-[m
[31m-    if (ctx->is_storage_cmd) {[m
[31m-        error_state = memc_storage_error;[m
[31m-        final_state = memc_storage_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_storage(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_flush_all) {[m
[31m-        error_state = memc_flush_all_error;[m
[31m-        final_state = memc_flush_all_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_flush_all(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_version) {[m
[31m-        error_state = memc_version_error;[m
[31m-        final_state = memc_version_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_version(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_stats) {[m
[31m-        error_state = memc_stats_error;[m
[31m-        final_state = memc_stats_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_stats(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_delete) {[m
[31m-        error_state = memc_delete_error;[m
[31m-        final_state = memc_delete_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_delete(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else if (ctx->cmd == ngx_http_memc_cmd_incr[m
[31m-            || ctx->cmd == ngx_http_memc_cmd_decr)[m
[31m-    {[m
[31m-        error_state = memc_incr_decr_error;[m
[31m-        final_state = memc_incr_decr_first_final;[m
[31m-[m
[31m-        p = (s_char *) parse_memc_incr_decr(&cs, (u_char *) p, (u_char *) pe,[m
[31m-                &status, &done);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-          "unrecognized memcached command in "[m
[31m-          "ngx_http_memc_process_simple_header: \"%V\"",[m
[31m-          &ctx->cmd_str);[m
[31m-[m
[31m-        return NGX_ERROR; /* this results in 500 status */[m
[31m-    }[m
[31m-[m
[31m-    ctx->parser_state = cs;[m
[31m-[m
[31m-    resp.data = u->buffer.start;[m
[31m-    resp.len  = (u_char *) p - resp.data;[m
[31m-[m
[31m-    u->buffer.pos = (u_char *) p;[m
[31m-[m
[31m-    dd("machine state: %d (done: %d)", cs, done);[m
[31m-    dd("memcached response: (len: %d) %s", (int) resp.len, resp.data);[m
[31m-[m
[31m-    if (done || cs >= final_state) {[m
[31m-        dd("memcached response parsed (resp.len: %d)", (int) resp.len);[m
[31m-[m
[31m-        rc = ngx_http_memc_write_simple_response(r, u, ctx, status, &resp);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (cs == error_state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response for command \"%V\" "[m
[31m-                  "at pos %O: %V", &ctx->cmd_str, (off_t) (p - orig), &resp);[m
[31m-[m
[31m-        status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        u->headers_in.status_n = status;[m
[31m-        u->state->status = status;[m
[31m-[m
[31m-        /* u->headers_in.status_n will be the final status */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("we need more data to proceed (returned NGX_AGAIN)");[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_empty_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    u->length = 0;[m
[31m-[m
[31m-    /* to persuade ngx_http_upstream_keepalive (if any)[m
[31m-       to cache the connection if the status is neither[m
[31m-       200 nor 404. */[m
[31m-    if (u->headers_in.status_n == NGX_HTTP_CREATED) {[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_empty_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    /* recover the buffer for subrequests in memory */[m
[31m-    u->buffer.last += ctx->body_length;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_get_cmd_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    dd("filter init: u->length: %d", (int) u->length);[m
[31m-[m
[31m-    u->length = u->headers_in.content_length_n + NGX_HTTP_MEMC_END;[m
[31m-[m
[31m-    dd("filter init (2): u->length: %d", (int) u->length);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_get_cmd_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memc_ctx_t  *ctx = data;[m
[31m-[m
[31m-    u_char               *last;[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (u->length == ctx->rest) {[m
[31m-[m
[31m-        if (ngx_strncmp(b->last,[m
[31m-                        ngx_http_memc_end + NGX_HTTP_MEMC_END - ctx->rest,[m
[31m-                        bytes) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                          "memcached sent invalid trailer");[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            ctx->rest = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->length -= bytes;[m
[31m-        ctx->rest -= bytes;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = b->last;[m
[31m-    cl->buf->pos = last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "memcached filter bytes:%z size:%z length:%z rest:%z",[m
[31m-                   bytes, b->last - b->pos, u->length, ctx->rest);[m
[31m-[m
[31m-    if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMC_END)) {[m
[31m-        u->length -= bytes;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    last += u->length - NGX_HTTP_MEMC_END;[m
[31m-[m
[31m-    if (ngx_strncmp(last, ngx_http_memc_end, b->last - last) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                      "memcached sent invalid trailer");[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        b->last = last;[m
[31m-        cl->buf->last = last;[m
[31m-        u->length = 0;[m
[31m-        ctx->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest -= b->last - last;[m
[31m-    b->last = last;[m
[31m-    cl->buf->last = last;[m
[31m-    u->length = ctx->rest;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_memc_process_get_cmd_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_memc_loc_conf_t        *conf;[m
[31m-    u_char                          *p, *len;[m
[31m-    ngx_str_t                        line;[m
[31m-    ngx_http_upstream_t             *u;[m
[31m-    ngx_http_memc_ctx_t             *ctx;[m
[31m-    ngx_http_variable_value_t       *flags_vv;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    dd("process header: u->length: %u", (unsigned) u->length);[m
[31m-[m
[31m-    for (p = u->buffer.pos; p < u->buffer.last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    line.len = p - u->buffer.pos - 1;[m
[31m-    line.data = u->buffer.pos;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "memcached: \"%V\"", &line);[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);[m
[31m-[m
[31m-    if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {[m
[31m-[m
[31m-        p += sizeof("VALUE ") - 1;[m
[31m-[m
[31m-        if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid key in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        p += ctx->key.len;[m
[31m-[m
[31m-        if (*p++ != ' ') {[m
[31m-            goto no_valid;[m
[31m-        }[m
[31m-[m
[31m-        /* save flags */[m
[31m-[m
[31m-        flags_vv = ctx->memc_flags_vv;[m
[31m-[m
[31m-        if (flags_vv == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (flags_vv->not_found) {[m
[31m-            flags_vv->not_found = 0;[m
[31m-            flags_vv->valid = 1;[m
[31m-            flags_vv->no_cacheable = 0;[m
[31m-        }[m
[31m-[m
[31m-        flags_vv->data = p;[m
[31m-[m
[31m-        while (*p) {[m
[31m-            if (*p++ == ' ') {[m
[31m-                flags_vv->len = p - 1 - flags_vv->data;[m
[31m-                conf = ngx_http_get_module_loc_conf(r, ngx_http_memc_module);[m
[31m-[m
[31m-                if (conf->flags_to_last_modified) {[m
[31m-                    r->headers_out.last_modified_time =[m
[31m-                            ngx_atotm(flags_vv->data, flags_vv->len);[m
[31m-                }[m
[31m-[m
[31m-                goto length;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto no_valid;[m
[31m-[m
[31m-    length:[m
[31m-[m
[31m-        len = p;[m
[31m-[m
[31m-        while (*p && *p++ != CR) { /* void */ }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        u->headers_in.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (u->headers_in.content_length_n == -1) {[m
[31m-#else[m
[31m-        r->headers_out.content_length_n = ngx_atoof(len, p - len - 1);[m
[31m-        if (r->headers_out.content_length_n == -1) {[m
[31m-#endif[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid length in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-        u->state->status = NGX_HTTP_OK;[m
[31m-        u->buffer.pos = p + 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(p, "END\x0d") == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "key: \"%V\" was not found by memcached", &ctx->key);[m
[31m-[m
[31m-        u->headers_in.status_n = NGX_HTTP_NOT_FOUND;[m
[31m-        u->state->status = NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        u->keepalive = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-no_valid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response: \"%V\"", &line);[m
[31m-[m
[31m-    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memc_write_simple_response(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_memc_ctx_t *ctx, ngx_uint_t status,[m
[31m-    ngx_str_t *resp)[m
[31m-{[m
[31m-    ngx_chain_t             *cl, **ll;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-    cl->buf->pos = resp->data;[m
[31m-    cl->buf->last = cl->buf->pos + resp->len;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    /* for subrequests in memory */[m
[31m-    u->buffer.pos = resp->data;[m
[31m-    u->buffer.last = resp->data + resp->len;[m
[31m-    ctx->body_length = resp->len;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-    u->headers_in.content_length_n = resp->len;[m
[31m-    u->keepalive = 1;[m
[31m-#else[m
[31m-    r->headers_out.content_length_n = resp->len;[m
[31m-#endif[m
[31m-[m
[31m-    u->headers_in.status_n = status;[m
[31m-    u->state->status = status;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_storage(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_storage;[m
[31m-    %% include "memc_storage.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_flush_all(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_flush_all;[m
[31m-    %% include "memc_flush_all.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_version(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_version;[m
[31m-    %% include "memc_version.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_stats(int *cs_addr, u_char *p, u_char *pe, ngx_uint_t *status_addr,[m
[31m-    unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_stats;[m
[31m-    %% include "memc_stats.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_delete(int *cs_addr, u_char *p, u_char *pe, ngx_uint_t *status_addr,[m
[31m-    unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_delete;[m
[31m-    %% include "memc_delete.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-parse_memc_incr_decr(int *cs_addr, u_char *p, u_char *pe,[m
[31m-    ngx_uint_t *status_addr, unsigned *done_addr)[m
[31m-{[m
[31m-    int cs = *cs_addr;[m
[31m-[m
[31m-    %% machine memc_incr_decr;[m
[31m-    %% include "memc_incr_decr.rl";[m
[31m-    %% write exec;[m
[31m-[m
[31m-    *cs_addr = cs;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_util.c[m
[1mdeleted file mode 100644[m
[1mindex 090bf43..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,158 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_memc_util.h"[m
[31m-[m
[31m-ngx_http_memc_cmd_t[m
[31m-ngx_http_memc_parse_cmd(u_char *data, size_t len, ngx_flag_t *is_storage_cmd)[m
[31m-{[m
[31m-    switch (len) {[m
[31m-        case 3:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "set") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_set;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "add") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_add;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-            if (ngx_str3cmp(data, 'c', 'a', 's')) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_cas;[m
[31m-            }[m
[31m-            */[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "get") == 0) {[m
[31m-                return ngx_http_memc_cmd_get;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 4:[m
[31m-            /*[m
[31m-            if (ngx_str4cmp(data, 'g', 'e', 't', 's')) {[m
[31m-                return ngx_http_memc_cmd_gets;[m
[31m-            }[m
[31m-            */[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "incr") == 0) {[m
[31m-                return ngx_http_memc_cmd_incr;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "decr") == 0) {[m
[31m-                return ngx_http_memc_cmd_decr;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 5:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "stats") == 0) {[m
[31m-                return ngx_http_memc_cmd_stats;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 6:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "append") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_append;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "delete") == 0) {[m
[31m-                return ngx_http_memc_cmd_delete;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 7:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "replace") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_replace;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "prepend") == 0) {[m
[31m-                *is_storage_cmd = 1;[m
[31m-                return ngx_http_memc_cmd_prepend;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_memc_strcmp_const(data, "version") == 0) {[m
[31m-                return ngx_http_memc_cmd_version;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 9:[m
[31m-            if (ngx_http_memc_strcmp_const(data, "flush_all") == 0) {[m
[31m-                return ngx_http_memc_cmd_flush_all;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-            if (ngx_str9cmp(data, 'v', 'e', 'r', 'b', 'o', 's', 'i', 't', 'y'))[m
[31m-            {[m
[31m-                return ngx_http_memc_cmd_verbosity;[m
[31m-            }[m
[31m-            */[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            break;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_memc_cmd_unknown;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_memc_upstream_add(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-    ngx_uint_t                      i;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != url->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-                url->host.len) != 0)[m
[31m-        {[m
[31m-            dd("upstream_add: host not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            dd("upstream_add: port not match: %d != %d",[m
[31m-                    (int) uscfp[i]->port, (int) url->port);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && url->default_port[m
[31m-            && uscfp[i]->default_port != url->default_port)[m
[31m-        {[m
[31m-            dd("upstream_add: default_port not match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    dd("No upstream found: %.*s", (int) url->host.len, url->host.data);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_util.h[m
[1mdeleted file mode 100644[m
[1mindex 4d18531..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/src/ngx_http_memc_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_MEMC_UTIL_H[m
[31m-#define NGX_HTTP_MEMC_UTIL_H[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include "ngx_http_memc_module.h"[m
[31m-[m
[31m-#ifndef NGX_UINT32_LEN[m
[31m-#define NGX_UINT32_LEN (NGX_INT32_LEN - 1)[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_UINT64_LEN[m
[31m-#define NGX_UINT64_LEN (NGX_INT64_LEN - 1)[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_http_memc_strcmp_const(a, b) \[m
[31m-    ngx_strncmp(a, b, sizeof(b) - 1)[m
[31m-[m
[31m-ngx_http_memc_cmd_t ngx_http_memc_parse_cmd(u_char *data, size_t len,[m
[31m-        ngx_flag_t *is_storage_cmd);[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *ngx_http_memc_upstream_add([m
[31m-        ngx_http_request_t *r, ngx_url_t *url);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_MEMC_UTIL_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/bugs.t[m
[1mdeleted file mode 100644[m
[1mindex a39260d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,240 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-no_shuffle();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set only[m
[31m---- http_config[m
[31m-   upstream mc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-   }[m
[31m-[m
[31m---- config[m
[31m-   location = "/set" {[m
[31m-       set $memc_cmd 'set';[m
[31m-       set $memc_key 'jalla';[m
[31m-       set $memc_value 'myvalue';[m
[31m-       set $memc_exptime 24;[m
[31m-       memc_pass mc;[m
[31m-   }[m
[31m-[m
[31m-[m
[31m-   location = "/get" {[m
[31m-       set $memc_cmd 'get';[m
[31m-       set $memc_key 'jalla';[m
[31m-       memc_pass mc;[m
[31m-   }[m
[31m-[m
[31m-   location = "/delete" {[m
[31m-       set $memc_cmd 'delete';[m
[31m-       set $memc_key 'jalla';[m
[31m-       memc_pass mc;[m
[31m-   }[m
[31m-   location = "/flush" {[m
[31m-       echo_location /get;[m
[31m-       #echo "";[m
[31m-       echo_location /delete;[m
[31m-   }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set in a subrequest issued from an output filter[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'blah';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        default_type 'text/html';[m
[31m-        add_before_body '/memc';[m
[31m-        echo '~~';[m
[31m-        add_after_body '/memc';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-~~[m
[31m-STORED\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: reuse request body[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo';[m
[31m-        echo_subrequest POST '/memc?key=foo&cmd=set';[m
[31m-[m
[31m-        echo 'set bar';[m
[31m-        echo_subrequest POST '/memc?key=bar&cmd=set';[m
[31m-[m
[31m-        echo 'get bar';[m
[31m-        echo_location '/memc?key=bar&cmd=get';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-Hello[m
[31m---- response_body eval[m
[31m-"flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-set foo[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-set bar[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-get bar[m
[31m-status: 200[m
[31m-exptime: [m
[31m-Helloget foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-Hello"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: zero buf when $memc_value is empty[m
[31m-http://github.com/agentzh/memc-nginx-module/issues#issue/2[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value '';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: zero buf when $memc_value is empty[m
[31m-http://github.com/agentzh/memc-nginx-module/issues#issue/2[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value '';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set too long keys[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo';[m
[31m-        set $memc_value 'hi';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_body eval[m
[31m-"CLIENT_ERROR bad command line format\r[m
[31m-"[m
[31m---- error_code: 502[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get too long keys[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd 'get';[m
[31m-        set $memc_key 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set only[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $echo_request_body;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /memc?key=foo&cmd=set[m
[31m-hello, world[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc?key=foo&cmd=get[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/cmd.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/cmd.t[m
[1mdeleted file mode 100644[m
[1mindex 54858cd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/cmd.t[m
[1m+++ /dev/null[m
[36m@@ -1,144 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad cmd[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $memc_cmd blah;[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-ngx_memc: unknown $memc_cmd "blah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no default value for $memc_cmd for method COPY[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    COPY /foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-ngx_memc: $memc_cmd variable not found for HTTP COPY requests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: bad cmd (case sensitive)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $memc_cmd GET;[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: explicit $memc_cmd in non-empty cmds_allowed list[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd version;[m
[31m-        memc_cmds_allowed get version;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: ^VERSION \d+(\.\d+)+\S*?\r\n$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: explicit $memc_cmd in non-empty cmds_allowed list (in first)[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd version;[m
[31m-        memc_cmds_allowed version get;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: ^VERSION \d+(\.\d+)+\S*?\r\n$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: explicit $memc_cmd NOT in non-empty cmds_allowed list[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd version;[m
[31m-        memc_cmds_allowed set get add delete;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-ngx_memc: memcached command "version" not allowed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: implicit $memc_cmd NOT in non-empty cmds_allowed list[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        memc_cmds_allowed set add delete version;[m
[31m-[m
[31m-        set $memcached_key foo;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: $memc_cmd has its default values when it's an empty string[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-        echo 'set big2';[m
[31m-        echo_subrequest PUT '/memc?key=big2';[m
[31m-[m
[31m-        echo 'get big2';[m
[31m-        echo_location '/memc?key=big2&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-nice to meet you![m
[31m---- response_body eval[m
[31m-"set big2[m
[31m-STORED\r[m
[31m-get big2[m
[31m-nice to meet you!"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/core-bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/core-bugs.t[m
[1mdeleted file mode 100644[m
[1mindex a9a580c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/core-bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-#repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-#no_diff;[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bug in nginx core? (1)[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- config[m
[31m-    location /set {[m
[31m-        set $memc_key foo;[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_value '[["mafiaclans.eu", 12], ["picfu.net", 5], ["www.test.com", 0], ["www.ayom.com", 0], ["www.21dezember2012.org", 0], ["the-indie.ch", 0], ["spiele-check.de", 0], ["online-right-now.net", 0], ["google.com", 0]]';[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bug in nginx core? (2)[m
[31m---- http_config[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- config[m
[31m-    location /get {[m
[31m-        set $memcached_key foo;[m
[31m-        memcached_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /get[m
[31m---- response_body eval[m
[31m-qq{[["mafiaclans.eu", 12], ["picfu.net", 5], ["www.test.com", 0], ["www.ayom.com", 0], ["www.21dezember2012.org", 0], ["the-indie.ch", 0], ["spiele-check.de", 0], ["online-right-now.net", 0], ["google.com", 0]]}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/delete.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/delete.t[m
[1mdeleted file mode 100644[m
[1mindex 9fccf37..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/delete.t[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: delete non-existent item[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'delete foo';[m
[31m-        echo_location '/memc?key=foo&cmd=delete';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-delete foo[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set and delete and set[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo bar';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=bar';[m
[31m-[m
[31m-        echo 'delete foo';[m
[31m-        echo_location '/memc?key=foo&cmd=delete';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^set foo bar[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-delete foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-DELETED\r[m
[31m-get foo[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set and delete and set (with exptime)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo bar';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=bar';[m
[31m-[m
[31m-        echo 'delete foo 1';[m
[31m-        echo_location '/memc?key=foo&cmd=delete&exptime=1';[m
[31m-[m
[31m-        echo 'add foo cat';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=cat';[m
[31m-[m
[31m-        echo_blocking_sleep 1.6;[m
[31m-[m
[31m-        echo 'add foo cat - 2nd';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=cat';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo bar[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-delete foo 1[m
[31m-status: 200[m
[31m-exptime: 1[m
[31m-DELETED\r[m
[31m-add foo cat[m
[31m-status: 200[m
[31m-exptime: 0[m
[31m-NOT_STORED\r[m
[31m-add foo cat - 2nd[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-"[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/errors.t[m
[1mdeleted file mode 100644[m
[1mindex 1cda000..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: empty pass[m
[31m-little-endian systems only[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key foo;[m
[31m-        set $backend "not-exist";[m
[31m-        memc_pass $backend;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: connection refused[m
[31m-little-endian systems only[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key foo;[m
[31m-        set $backend "not-exist";[m
[31m-        memc_pass 127.0.0.1:1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /memc[m
[31m---- error_code: 502[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex 8736de7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket; # skip_all => 'ngx_memc storage commands do not work with the ngx_eval module';[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set in eval (NO subrequest in memory)[m
[31m---- http_config[m
[31m-   upstream mc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-   }[m
[31m-[m
[31m---- config[m
[31m-    location = /main {[m
[31m-        echo_location /eval;[m
[31m-        echo_location /eval;[m
[31m-    }[m
[31m-   location = /eval {[m
[31m-       eval_subrequest_in_memory off;[m
[31m-       eval_override_content_type text/plain;[m
[31m-       eval $res {[m
[31m-           default_type 'text/plain';[m
[31m-           set $memc_cmd 'set';[m
[31m-           set $memc_key 'foo';[m
[31m-           set $memc_value 'myvalue';[m
[31m-           set $memc_exptime 24;[m
[31m-           memc_pass mc;[m
[31m-       }[m
[31m-       echo [$res];[m
[31m-   }[m
[31m-[m
[31m---- request[m
[31m-    GET /eval[m
[31m---- response_body[m
[31m-[STORED][m
[31m---- timeout: 30[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set in eval (subrequest in memory)[m
[31m---- http_config[m
[31m-   upstream mc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-   }[m
[31m-[m
[31m---- config[m
[31m-    location = /main {[m
[31m-        echo_location /eval;[m
[31m-        echo_location /eval;[m
[31m-    }[m
[31m-   location = /eval {[m
[31m-       eval_subrequest_in_memory on;[m
[31m-       eval_override_content_type text/plain;[m
[31m-       eval $res {[m
[31m-           default_type 'text/plain';[m
[31m-           set $memc_cmd 'set';[m
[31m-           set $memc_key 'foo';[m
[31m-           set $memc_value 'myvalue';[m
[31m-           set $memc_exptime 24;[m
[31m-           memc_pass mc;[m
[31m-       }[m
[31m-       echo [$res];[m
[31m-   }[m
[31m-[m
[31m---- request[m
[31m-    GET /eval[m
[31m---- response_body[m
[31m-[STORED][m
[31m---- timeout: 30[m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set in eval (subrequest in memory)[m
[31m---- http_config[m
[31m-   upstream mc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-   }[m
[31m-[m
[31m---- config[m
[31m-    location = /main {[m
[31m-        echo_location /get;[m
[31m-        echo_location /del?foo;[m
[31m-    }[m
[31m-    location = /get {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass mc;[m
[31m-    }[m
[31m-    location = /del {[m
[31m-       eval $res {[m
[31m-           set $memc_cmd delete;[m
[31m-           set $memc_key $query_string;[m
[31m-           memc_pass mc;[m
[31m-       }[m
[31m-       return 200;[m
[31m-   }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-[STORED][m
[31m---- timeout: 30[m
[31m---- error_code: 200[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/exptime.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/exptime.t[m
[1mdeleted file mode 100644[m
[1mindex 0a62190..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/exptime.t[m
[1m+++ /dev/null[m
[36m@@ -1,166 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set exptime[m
[31m---- config[m
[31m-    location /exptime {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo&exptime=1' -b BAR;[m
[31m-[m
[31m-        echo 'get foo - 0 sec';[m
[31m-        echo_location '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo_blocking_sleep 1.1;[m
[31m-[m
[31m-        echo 'get foo - 1.1 sec';[m
[31m-        echo_location '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /exptime[m
[31m---- response_body_like[m
[31m-^flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-exptime: 1[m
[31m-STORED\r[m
[31m-get foo - 0 sec[m
[31m-status: 200[m
[31m-exptime: [m
[31m-BAR[m
[31m-get foo - 1\.1 sec[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test empty flags (default to 0)[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (exptime: EMPTY)';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo_blocking_sleep 1;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (exptime: EMPTY)[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: invalid exptime in set[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'nice';[m
[31m-        set $memc_exptime 'my invalid';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-variable "$memc_exptime" takes invalid value: my invalid,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: invalid exptime in flush_all[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'flush_all';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'nice';[m
[31m-        set $memc_exptime 'invalid';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: invalid exptime in delete[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'delete';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'nice';[m
[31m-        set $memc_exptime 'invalid';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set negative exptime[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'sun';[m
[31m-        set $memc_value 'tree';[m
[31m-        set $memc_exptime '-1';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/flags.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/flags.t[m
[1mdeleted file mode 100644[m
[1mindex aa2b29b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/flags.t[m
[1m+++ /dev/null[m
[36m@@ -1,263 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-no_shuffle;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set flags and get flags[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (flag: 1234567890)';[m
[31m-        echo_subrequest PUT '/memc?key=foo&flags=1234567890' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (flag: 1234567890)[m
[31m-status: 201[m
[31m-flags: 1234567890[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 1234567890[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test empty flags (default to 0)[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (flag: EMPTY)';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (flag: EMPTY)[m
[31m-status: 201[m
[31m-flags: 0[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 0[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test empty flags (default to 0) (another form)[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (flag: EMPTY)';[m
[31m-        echo_subrequest PUT '/memc?key=foo&flags=' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (flag: EMPTY)[m
[31m-status: 201[m
[31m-flags: 0[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 0[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: add flags and get flags[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'flush_all';[m
[31m-        echo_subrequest GET '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo BAR (flag: 54321)';[m
[31m-        echo_subrequest POST '/memc?key=foo&flags=54321' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"flush_all[m
[31m-status: 200[m
[31m-flags: [m
[31m-OK\r[m
[31m-add foo BAR (flag: 54321)[m
[31m-status: 201[m
[31m-flags: 54321[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 54321[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set invalid flags[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'foo';[m
[31m-        set $memc_value 'nice';[m
[31m-        set $memc_flags 'invalid';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-variable "$memc_flags" takes invalid value: invalid,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set negative flags[m
[31m---- config[m
[31m-    location /allow {[m
[31m-        set $memc_cmd 'set';[m
[31m-        set $memc_key 'sun';[m
[31m-        set $memc_value 'tree';[m
[31m-        set $memc_flags '-1';[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /allow[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set flags and get flags in http time[m
[31m---- config[m
[31m-    location /flags {[m
[31m-        echo 'set foo BAR (flag: 1264680563)';[m
[31m-        echo_subrequest PUT '/memc?key=foo&flags=1264680563' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "flags: $memc_flags $memc_flags_as_http_time";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_flags $arg_flags;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flags[m
[31m---- response_body eval[m
[31m-"set foo BAR (flag: 1264680563)[m
[31m-status: 201[m
[31m-flags: 1264680563 Thu, 28 Jan 2010 12:09:23 GMT[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-flags: 1264680563 Thu, 28 Jan 2010 12:09:23 GMT[m
[31m-BAR"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: last-modified (conditional GET)[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_key;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        memc_flags_to_last_modified on;[m
[31m-        add_header X-Flags $memc_flags;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=foo[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 28 Jan 2010 12:09:23 GMT[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 28 Jan 2010 12:09:23 GMT[m
[31m-X-Flags: 1264680563[m
[31m---- error_code: 304[m
[31m---- response_body:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: last-modified (unconditional GET)[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_key;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        memc_flags_to_last_modified on;[m
[31m-        add_header X-Flags $memc_flags;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=foo[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 28 Jan 2010 12:09:23 GMT[m
[31m-X-Flags: 1264680563[m
[31m---- error_code: 200[m
[31m---- response_body: BAR[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/flush-all.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/flush-all.t[m
[1mdeleted file mode 100644[m
[1mindex aeea8dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/flush-all.t[m
[1m+++ /dev/null[m
[36m@@ -1,120 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush_all[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /flush[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set and flush and get[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=blah';[m
[31m-[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^set foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-flush_all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set exptime[m
[31m---- config[m
[31m-    location /exptime {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'flush_all exptime=2';[m
[31m-        echo_location '/memc?cmd=flush_all&exptime=2';[m
[31m-[m
[31m-        echo 'get foo - 0 sec';[m
[31m-        echo_location '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo_blocking_sleep 2;[m
[31m-[m
[31m-        echo 'get foo - 2 sec';[m
[31m-        echo_location '/memc?key=foo';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /exptime[m
[31m---- response_body_like[m
[31m-flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-flush_all exptime=2[m
[31m-status: 200[m
[31m-exptime: 2[m
[31m-OK\r[m
[31m-get foo - 0 sec[m
[31m-status: 200[m
[31m-exptime: [m
[31m-BAR[m
[31m-get foo - 2 sec[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m---- timeout: 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/if.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/if.t[m
[1mdeleted file mode 100644[m
[1mindex 89c5859..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/if.t[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad cmd[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        if ($uri ~* 'foo') {[m
[31m-            set $memc_cmd flush_all;[m
[31m-        }[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/incr-decr.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/incr-decr.t[m
[1mdeleted file mode 100644[m
[1mindex 8412ec9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/incr-decr.t[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: value required for incr[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: invalid value for incr[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo&val=nice[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- error_log[m
[31m-variable "$memc_value" is invalid for incr/decr: nice,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: invalid value (negative intenger) for incr[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo&val=-5[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: key required for incr[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&val=2[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- SKIP[m
[31m---- TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: incr[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-incr 51[m
[31m-status: 201[m
[31m-exptime: [m
[31m-83\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-83"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: decr[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'decr 13';[m
[31m-        echo_location '/memc?key=foo&cmd=decr&val=13';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-decr 13[m
[31m-status: 201[m
[31m-exptime: [m
[31m-19\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-19"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: incr an non-existent key[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^flush all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-incr 51[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: decr[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'decr 13';[m
[31m-        echo_location '/memc?key=foo&cmd=decr&val=13';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-decr 13[m
[31m-status: 201[m
[31m-exptime: [m
[31m-19\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-19"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: incr an non-existent key (with fallback)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        error_page 404 = /set_and_incr?$query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /set_and_incr {[m
[31m-        internal;[m
[31m-[m
[31m-        echo_location /memc?cmd=add&key=$arg_key&val=0;[m
[31m-        echo_location /memc?$query_string;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-incr 51[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-status: 201[m
[31m-exptime: [m
[31m-51\r[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex e1292e6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: keepalive[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-      #server 127.0.0.1:11985;[m
[31m-      #server 127.0.0.1:11986;[m
[31m-      keepalive 2;[m
[31m-      #hash $arg_key;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value 'value';[m
[31m-        memc_pass backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=dog[m
[31m---- response_body eval[m
[31m-"STORED\r[m
[31m-"[m
[31m---- error_code: 201[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive/incr-decr.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive/incr-decr.t[m
[1mdeleted file mode 100644[m
[1mindex b03f1e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive/incr-decr.t[m
[1m+++ /dev/null[m
[36m@@ -1,306 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: value required for incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: invalid value for incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo&val=nice[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: invalid value (negative intenger) for incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&key=foo&val=-5[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: key required for incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?cmd=incr&val=2[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- SKIP[m
[31m---- TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: incr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-incr 51[m
[31m-status: 201[m
[31m-exptime: [m
[31m-83\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-83"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: decr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'decr 13';[m
[31m-        echo_location '/memc?key=foo&cmd=decr&val=13';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-decr 13[m
[31m-status: 201[m
[31m-exptime: [m
[31m-19\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-19"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: incr an non-existent key[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-^flush all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-incr 51[m
[31m-status: 404[m
[31m-exptime: [m
[31m-<html>.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: decr[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 32';[m
[31m-        echo_location '/memc?cmd=set&key=foo&val=32';[m
[31m-[m
[31m-        echo 'decr 13';[m
[31m-        echo_location '/memc?key=foo&cmd=decr&val=13';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 32[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-decr 13[m
[31m-status: 201[m
[31m-exptime: [m
[31m-19\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-exptime: [m
[31m-19"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: incr an non-existent key (with fallback)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'incr 51';[m
[31m-        echo_location '/memc?key=foo&cmd=incr&val=51';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-[m
[31m-        error_page 404 = /set_and_incr?$query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /set_and_incr {[m
[31m-        internal;[m
[31m-[m
[31m-        echo_location /memc?cmd=add&key=$arg_key&val=0;[m
[31m-        echo_location /memc?$query_string;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-incr 51[m
[31m-status: 201[m
[31m-exptime: 0[m
[31m-STORED\r[m
[31m-status: 201[m
[31m-exptime: [m
[31m-51\r[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive/storage.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive/storage.t[m
[1mdeleted file mode 100644[m
[1mindex 69c2116..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/keepalive/storage.t[m
[1m+++ /dev/null[m
[36m@@ -1,749 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() - 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream foo {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 1;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-#no_shuffle();[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-log_level('warn');[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set only[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=foo&cmd=set&val=blah[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set and get[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=blah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-blah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set UTF-8 and get UTF-8[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 你好';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=你好';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 你好[m
[31m-STORED\r[m
[31m-get foo[m
[31m-你好"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set and get empty values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-OK\r[m
[31m-set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: add[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-added"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set using POST[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo';[m
[31m-        echo_subrequest POST '/memc?key=foo&cmd=set';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, world[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-set foo[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-hello, world"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: default REST interface when no $memc_cmd is set[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'set foo FOO';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b FOO;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"set foo FOO[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-FOO[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-BAR[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: default REST interface when no $memc_cmd is set (read client req body)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'set foo <client req body>';[m
[31m-        echo_subrequest PUT '/memc?key=foo';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-rock[m
[31m---- response_body eval[m
[31m-"set foo <client req body>[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-rock[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-BAR[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: default REST interface when no $memc_cmd is set (read client req body)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'set foo <client req body>';[m
[31m-        echo_subrequest PUT '/memc?key=foo';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'add foo BAR';[m
[31m-        echo_subrequest POST '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-howdy[m
[31m---- response_body eval[m
[31m-"set foo <client req body>[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-howdy[m
[31m-add foo BAR[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-howdy[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: test replace (stored) (without sleep)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-replace foo bah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-bah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: test replace (stored) (with sleep)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-        echo_blocking_sleep 0.001;[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-replace foo bah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-bah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: test replace (not stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-replace foo bah[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: test append (stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo hello';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=hello';[m
[31m-[m
[31m-        echo 'append foo ,world';[m
[31m-        echo_location '/memc?key=foo&cmd=append&val=,world';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo hello[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-append foo ,world[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-hello,world"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: test append (not stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'append foo ,world';[m
[31m-        echo_location '/memc?key=foo&cmd=append&val=,world';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-append foo ,world[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: test prepend (stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo hello';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=hello';[m
[31m-[m
[31m-        echo 'prepend foo world,';[m
[31m-        echo_location '/memc?key=foo&cmd=prepend&val=world,';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo hello[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-prepend foo world,[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-world,hello"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: test prepend (not stored)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'prepend foo world,';[m
[31m-        echo_location '/memc?key=foo&cmd=prepend&val=world,';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-prepend foo world,[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set and get big value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /big {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        client_body_buffer_size 1k;[m
[31m-        client_max_body_size 100k;[m
[31m-[m
[31m-        echo 'set big';[m
[31m-        echo_subrequest POST '/memc?key=big&cmd=set';[m
[31m-[m
[31m-        echo 'get big';[m
[31m-        echo_location '/memc?key=big&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /big\n" .[m
[31m- 'a' x (1024 * 1) . 'efg'[m
[31m-[m
[31m---- response_body eval[m
[31m-"set big[m
[31m-STORED\r[m
[31m-get big[m
[31m-" . 'a' x (1024 * 1) . 'efg'[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set and get too big values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /big {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        client_max_body_size 100k;[m
[31m-[m
[31m-        echo 'set big';[m
[31m-        echo_subrequest POST '/memc?key=big&cmd=set';[m
[31m-[m
[31m-        echo 'get big';[m
[31m-        echo_location '/memc?key=big&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /big\n" .[m
[31m- 'a' x (1024 * 100) . 'efg'[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-client intended to send too large body: 102403 bytes[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: replace non-existent item[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'replace foo bar';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bar';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-replace foo bar[m
[31m-status: 200[m
[31m-exptime: 0[m
[31m-NOT_STORED\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: eval + memc[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /main {[m
[31m-        eval $data {[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/foo;[m
[31m-        }[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key /foo;[m
[31m-        set $memc_value $data;[m
[31m-        memc_pass foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/stats.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/stats.t[m
[1mdeleted file mode 100644[m
[1mindex 7dd5ea7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/stats.t[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-log_level('error');[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    location /stats {[m
[31m-        set $memc_cmd stats;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /stats[m
[31m---- response_body_like: ^(?:STAT [^\r]*\r\n)*END\r\n$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: timeout[m
[31m---- config[m
[31m-    memc_connect_timeout 10ms;[m
[31m-    memc_send_timeout 10ms;[m
[31m-    location /stats {[m
[31m-        set $memc_cmd stats;[m
[31m-        memc_pass www.taobao.com:12345;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /stats[m
[31m---- response_body_like: 504 Gateway Time-out[m
[31m---- timeout: 1[m
[31m---- error_code: 504[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/storage.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/storage.t[m
[1mdeleted file mode 100644[m
[1mindex ee0706b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/storage.t[m
[1m+++ /dev/null[m
[36m@@ -1,740 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_shuffle();[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set only[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=foo&cmd=set&val=blah[m
[31m---- response_body eval[m
[31m-"STORED\r\n"[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set and get[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=blah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-blah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set UTF-8 and get UTF-8[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo 你好';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=你好';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo 你好[m
[31m-STORED\r[m
[31m-get foo[m
[31m-你好"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set and get empty values[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-OK\r[m
[31m-set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: add[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-added"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set using POST[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'set foo';[m
[31m-        echo_subrequest POST '/memc?key=foo&cmd=set';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello, world[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-set foo[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-hello, world"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: default REST interface when no $memc_cmd is set[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo FOO';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b FOO;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body eval[m
[31m-"set foo FOO[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-FOO[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-BAR[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: default REST interface when no $memc_cmd is set (read client req body)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-        echo 'set foo <client req body>';[m
[31m-        echo_subrequest PUT '/memc?key=foo';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'set foo BAR';[m
[31m-        echo_subrequest PUT '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-rock[m
[31m---- response_body eval[m
[31m-"set foo <client req body>[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-rock[m
[31m-set foo BAR[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-BAR[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: default REST interface when no $memc_cmd is set (read client req body)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_read_request_body;[m
[31m-        echo 'set foo <client req body>';[m
[31m-        echo_subrequest PUT '/memc?key=foo';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-[m
[31m-        echo 'add foo BAR';[m
[31m-        echo_subrequest POST '/memc?key=foo' -b BAR;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_subrequest GET '/memc?key=foo';[m
[31m-        echo;[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        #set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-howdy[m
[31m---- response_body eval[m
[31m-"set foo <client req body>[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-howdy[m
[31m-add foo BAR[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-howdy[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: test replace (stored) (without sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-replace foo bah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-bah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: test replace (stored) (with sleep)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-        echo_blocking_sleep 0.001;[m
[31m-[m
[31m-        echo 'add foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=added';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-        #echo_sleep 0.001;[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo blah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-replace foo bah[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-bah"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: test replace (not stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'replace foo bah';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-replace foo bah[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: test append (stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo hello';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=hello';[m
[31m-[m
[31m-        echo 'append foo ,world';[m
[31m-        echo_location '/memc?key=foo&cmd=append&val=,world';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo hello[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-append foo ,world[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-hello,world"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: test append (not stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'append foo ,world';[m
[31m-        echo_location '/memc?key=foo&cmd=append&val=,world';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-append foo ,world[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: test prepend (stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'add foo hello';[m
[31m-        echo_location '/memc?key=foo&cmd=add&val=hello';[m
[31m-[m
[31m-        echo 'prepend foo world,';[m
[31m-        echo_location '/memc?key=foo&cmd=prepend&val=world,';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-add foo hello[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-prepend foo world,[m
[31m-status: 201[m
[31m-STORED\r[m
[31m-get foo[m
[31m-status: 200[m
[31m-world,hello"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: test prepend (not stored)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'prepend foo world,';[m
[31m-        echo_location '/memc?key=foo&cmd=prepend&val=world,';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body_like[m
[31m-flush all[m
[31m-status: 200[m
[31m-OK\r[m
[31m-prepend foo world,[m
[31m-status: 200[m
[31m-NOT_STORED\r[m
[31m-get foo[m
[31m-status: 404.*?404 Not Found.*$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set and get big value[m
[31m---- config[m
[31m-    location /big {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        client_max_body_size 100k;[m
[31m-[m
[31m-        echo_read_request_body;[m
[31m-        echo 'set big';[m
[31m-        echo_subrequest POST '/memc?key=big&cmd=set';[m
[31m-[m
[31m-        echo 'get big';[m
[31m-        echo_location '/memc?key=big&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /big\n" .[m
[31m- 'a' x (1024 * 1) . 'efg'[m
[31m-[m
[31m---- response_body eval[m
[31m-"set big[m
[31m-STORED\r[m
[31m-get big[m
[31m-" . 'a' x (1024 * 1) . 'efg'[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set and get too big values[m
[31m---- config[m
[31m-    location /big {[m
[31m-        client_body_buffer_size 1k;[m
[31m-        client_max_body_size 100k;[m
[31m-[m
[31m-        echo 'set big';[m
[31m-        echo_subrequest POST '/memc?key=big&cmd=set';[m
[31m-[m
[31m-        echo 'get big';[m
[31m-        echo_location '/memc?key=big&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /big\n" .[m
[31m- 'a' x (1024 * 100) . 'efg'[m
[31m-[m
[31m---- response_body_like: 413 Request Entity Too Large[m
[31m---- error_code: 413[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: replace non-existent item[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'flush_all';[m
[31m-        echo_location '/memc?cmd=flush_all';[m
[31m-[m
[31m-        echo 'replace foo bar';[m
[31m-        echo_location '/memc?key=foo&cmd=replace&val=bar';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        echo_before_body "status: $echo_response_status";[m
[31m-        echo_before_body "exptime: $memc_exptime";[m
[31m-[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"flush_all[m
[31m-status: 200[m
[31m-exptime: [m
[31m-OK\r[m
[31m-replace foo bar[m
[31m-status: 200[m
[31m-exptime: 0[m
[31m-NOT_STORED\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: eval + memc[m
[31m---- config[m
[31m-    location /main {[m
[31m-        eval $data {[m
[31m-            proxy_pass $scheme://127.0.0.1:$server_port/foo;[m
[31m-        }[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key /foo;[m
[31m-        set $memc_value $data;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: set and get (binary data containing \0)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo 'set foo blah';[m
[31m-        echo_location '/memc?key=foo&cmd=set&val=blah%00blah';[m
[31m-[m
[31m-        echo 'get foo';[m
[31m-        echo_location '/memc?key=foo&cmd=get';[m
[31m-    }[m
[31m-    location /memc {[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        set_unescape_uri $memc_key $arg_key;[m
[31m-        set_unescape_uri $memc_value $arg_val;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"set foo blah[m
[31m-STORED\r[m
[31m-get foo[m
[31m-blah\0blah"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/upstream.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/upstream.t[m
[1mdeleted file mode 100644[m
[1mindex a50fcac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/upstream.t[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /stats {[m
[31m-        set $memc_cmd stats;[m
[31m-        memc_pass backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /stats[m
[31m---- response_body_like: ^(?:STAT [^\r]*\r\n)*END\r\n$[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-      server 127.0.0.1:11985;[m
[31m-      server 127.0.0.1:11986;[m
[31m-      #keepalive 2;[m
[31m-      #hash $arg_key;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd set;[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_value 'value';[m
[31m-        memc_pass backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /memc?key=dog[m
[31m---- response_body[m
[31m---- error_code: 201[m
[31m---- timeout: 3[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity with dynamic backend[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-      server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /stats {[m
[31m-        set $memc_cmd stats;[m
[31m-        memc_pass $arg_target;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /stats?target=backend[m
[31m---- response_body_like: ^(?:STAT [^\r]*\r\n)*END\r\n$[m
[31m---- timeout: 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/used.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/used.t[m
[1mdeleted file mode 100644[m
[1mindex 4e7b2ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/used.t[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: module not used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local v = ngx.var[m
[31m-            ngx.say(v.memc_cmd, v.memc_exptime, v.memc_value, v.memc_key, v.memc_flags)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap[m
[31m-F(ngx_http_memc_add_variable) {[m
[31m-    printf("memc add variable \"%s\"\n", user_string_n($name->data, $name->len))[m
[31m-}[m
[31m---- stap_out[m
[31m---- response_body[m
[31m-nilnilnilnilnil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: module used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local v = ngx.var[m
[31m-            ngx.say(v.memc_cmd, v.memc_exptime, v.memc_value, v.memc_key, v.memc_flags)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /bah {[m
[31m-        set $memc_key foo;[m
[31m-        memc_pass 127.0.0.1:11211;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap[m
[31m-F(ngx_http_memc_add_variable) {[m
[31m-    printf("memc add variable \"%s\"\n", user_string_n($name->data, $name->len))[m
[31m-}[m
[31m---- stap_out[m
[31m-memc add variable "memc_key"[m
[31m-memc add variable "memc_cmd"[m
[31m-memc add variable "memc_flags"[m
[31m-memc add variable "memc_exptime"[m
[31m-memc add variable "memc_value"[m
[31m-[m
[31m---- response_body[m
[31m-nilnilnilnilnil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/version.t[m
[1mdeleted file mode 100644[m
[1mindex 72d9595..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/t/version.t[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-# vi:filetype=[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: the "version" command[m
[31m---- config[m
[31m-    location /ver {[m
[31m-        set $memc_cmd version;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /ver[m
[31m---- response_body_like: ^VERSION \d+(\.\d+)+\S*?\r\n$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 5b05fcb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-ragel -I src -G2 src/ngx_http_memc_response.rl[m
[31m-util/fix-clang-warnings[m
[31m-[m
[31m-if [ $? != 0 ]; then[m
[31m-    echo 'Failed to generate the memcached response parser.' 1>&2[m
[31m-    exit 1;[m
[31m-fi[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-ngx-build $force $version \[m
[31m-    --with-ld-opt="-L$PCRE_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:/usr/local/lib" \[m
[31m-    --with-cc-opt="-O2" \[m
[31m-    --with-http_addition_module \[m
[31m-    --without-mail_pop3_module \[m
[31m-    --without-mail_imap_module \[m
[31m-    --without-mail_smtp_module \[m
[31m-    --without-http_upstream_ip_hash_module \[m
[31m-    --without-http_empty_gif_module \[m
[31m-    --without-http_referer_module \[m
[31m-    --without-http_autoindex_module \[m
[31m-    --without-http_auth_basic_module \[m
[31m-    --without-http_userid_module \[m
[31m-    --add-module=$root $opts \[m
[31m-    --add-module=$root/../ndk-nginx-module \[m
[31m-    --add-module=$root/../eval-nginx-module \[m
[31m-    --add-module=$root/../echo-nginx-module \[m
[31m-    --add-module=$root/../set-misc-nginx-module \[m
[31m-    --add-module=$root/../lua-nginx-module \[m
[31m-    --add-module=$home/work/nginx/ngx_http_upstream_keepalive-0.7 \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-    --with-debug[m
[31m-    #--add-module=$home/work/nginx/nginx_upstream_hash-0.3 \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/fix-clang-warnings b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/fix-clang-warnings[m
[1mdeleted file mode 100755[m
[1mindex 6b1bda6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/fix-clang-warnings[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use File::Temp 'tempfile';[m
[31m-[m
[31m-my $infile = "src/ngx_http_memc_response.c";[m
[31m-my ($out, $outfile) = tempfile();[m
[31m-open my $in, $infile[m
[31m-    or die "Cannot open $infile for reading: $!\n";[m
[31m-my $hits = 0;[m
[31m-while (<$in>) {[m
[31m-    if (/ \b memc_ (?: storage | flush_all | version | stats | delete | incr_decr )[m
[31m-             _en_main \b /x)[m
[31m-     {[m
[31m-        #warn "HIT!";[m
[31m-        $hits++;[m
[31m-        next;[m
[31m-    }[m
[31m-    print $out $_;[m
[31m-}[m
[31m-close $in;[m
[31m-close $out;[m
[31m-if ($hits) {[m
[31m-    my $cmd = "cp $outfile $infile";[m
[31m-    system($cmd) == 0[m
[31m-        or die "Cannot run command \"$cmd\": $!";[m
[31m-}[m
[31m-#die;[m
[31m-[m
[31m-__END__[m
[31m-[m
[31m-This script is to fix the following clang warnings when using Ragel 6.8/6.9/etc:[m
[31m-[m
[31m-src/ngx_http_memc_response.c:33:18: error: unused variable 'memc_storage_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_storage_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:46:18: error: unused variable 'memc_flush_all_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_flush_all_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:59:18: error: unused variable 'memc_version_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_version_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:72:18: error: unused variable 'memc_stats_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_stats_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:85:18: error: unused variable 'memc_delete_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_delete_en_main = 1;[m
[31m-                 ^[m
[31m-src/ngx_http_memc_response.c:98:18: error: unused variable 'memc_incr_decr_en_main' [-Werror,-Wunused-const-variable][m
[31m-static const int memc_incr_decr_en_main = 1;[m
[31m-                 ^[m
[31m-6 errors generated.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex fd9c9d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/readme.wiki > /tmp/a.pod \[m
[31m-    && pod2text /tmp/a.pod > README \[m
[31m-    && perl -i -pe 's{(https?://.*?)>}{$1 >}g' README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/wiki2pod.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/wiki2pod.pl[m
[1mdeleted file mode 100644[m
[1mindex cdd33a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/util/wiki2pod.pl[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use bytes;[m
[31m-[m
[31m-my @nl_counts;[m
[31m-my $last_nl_count_level;[m
[31m-[m
[31m-my @bl_counts;[m
[31m-my $last_bl_count_level;[m
[31m-[m
[31m-sub fmt_pos ($) {[m
[31m-    (my $s = $_[0]) =~ s{\#(.*)}{/"$1"};[m
[31m-    $s;[m
[31m-}[m
[31m-[m
[31m-sub fmt_mark ($$) {[m
[31m-    my ($tag, $s) = @_;[m
[31m-    my $max_level = 0;[m
[31m-    while ($s =~ /([<>])\1*/g) {[m
[31m-        my $level = length $&;[m
[31m-        if ($level > $max_level) {[m
[31m-            $max_level = $level;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    my $times = $max_level + 1;[m
[31m-    if ($times > 1) {[m
[31m-        $s = " $s ";[m
[31m-    }[m
[31m-    return $tag . ('<' x $times) . $s . ('>' x $times);[m
[31m-}[m
[31m-[m
[31m-print "=encoding utf-8\n\n";[m
[31m-[m
[31m-while (<>) {[m
[31m-    if ($. == 1) {[m
[31m-        # strip the leading U+FEFF byte in MS-DOS text files[m
[31m-        my $first = ord(substr($_, 0, 1));[m
[31m-        #printf STDERR "0x%x", $first;[m
[31m-        #my $second = ord(substr($_, 2, 1));[m
[31m-        #printf STDERR "0x%x", $second;[m
[31m-        if ($first == 0xEF) {[m
[31m-            substr($_, 0, 1, '');[m
[31m-            #warn "Hit!";[m
[31m-        }[m
[31m-    }[m
[31m-    s{\[(http[^ \]]+) ([^\]]*)\]}{$2 (L<$1>)}gi;[m
[31m-    s{ \[\[ ( [^\]\|]+ ) \| ([^\]]*) \]\] }{"L<$2|" . fmt_pos($1) . ">"}gixe;[m
[31m-    s{<code>(.*?)</code>}{fmt_mark('C', $1)}gie;[m
[31m-    s{'''(.*?)'''}{fmt_mark('B', $1)}ge;[m
[31m-    s{''(.*?)''}{fmt_mark('I', $1)}ge;[m
[31m-    if (s{^\s*<[^>]+>\s*$}{}) {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if (/^\s*$/) {[m
[31m-        print "\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-=begin cmt[m
[31m-[m
[31m-    if ($. == 1) {[m
[31m-        warn $_;[m
[31m-        for my $i (0..length($_) - 1) {[m
[31m-            my $chr = substr($_, $i, 1);[m
[31m-            warn "chr ord($i): ".ord($chr)." \"$chr\"\n";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-=end cmt[m
[31m-=cut[m
[31m-[m
[31m-    if (/(=+) (.*) \1$/) {[m
[31m-        #warn "HERE! $_" if $. == 1;[m
[31m-        my ($level, $title) = (length $1, $2);[m
[31m-        collapse_lists();[m
[31m-[m
[31m-        print "\n=head$level $title\n\n";[m
[31m-    } elsif (/^(\#+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_nl_count_level && $level != $last_nl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_nl_count_level = $level;[m
[31m-        $nl_counts[$level] ||= 0;[m
[31m-        if ($nl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $nl_counts[$level]++;[m
[31m-        print "\n=item $nl_counts[$level].\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } elsif (/^(\*+) (.*)/) {[m
[31m-        my ($level, $txt) = (length($1) - 1, $2);[m
[31m-        if (defined $last_bl_count_level && $level != $last_bl_count_level) {[m
[31m-            print "\n=back\n\n";[m
[31m-        }[m
[31m-        $last_bl_count_level = $level;[m
[31m-        $bl_counts[$level] ||= 0;[m
[31m-        if ($bl_counts[$level] == 0) {[m
[31m-            print "\n=over\n\n";[m
[31m-        }[m
[31m-        $bl_counts[$level]++;[m
[31m-        print "\n=item *\n\n";[m
[31m-        print "$txt\n";[m
[31m-    } else {[m
[31m-        collapse_lists();[m
[31m-        print;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-collapse_lists();[m
[31m-[m
[31m-sub collapse_lists {[m
[31m-    while (defined $last_nl_count_level && $last_nl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_nl_count_level--;[m
[31m-    }[m
[31m-    undef $last_nl_count_level;[m
[31m-    undef @nl_counts;[m
[31m-[m
[31m-    while (defined $last_bl_count_level && $last_bl_count_level >= 0) {[m
[31m-        print "\n=back\n\n";[m
[31m-        $last_bl_count_level--;[m
[31m-    }[m
[31m-    undef $last_bl_count_level;[m
[31m-    undef @bl_counts;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex b2c63a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/memc-nginx-module-0.17/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_event[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_add_connection[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_init[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-   fun:ngx_epoll_notify_init[m
[31m-   fun:ngx_epoll_init[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/README[m
[1mdeleted file mode 100644[m
[1mindex 262822a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/README[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-This is an Nginx fork that adds dtrace USDT probes.[m
[31m-[m
[31m-Installation:[m
[31m-[m
[31m-    ./configure --with-dtrace-probes \[m
[31m-        --with-dtrace=/usr/sbin/dtrace \[m
[31m-        ...[m
[31m-    make[m
[31m-    make install[m
[31m-[m
[31m-Usage on Linux (with systemtap):[m
[31m-[m
[31m-    # make the stap-nginx script visiable in your PATH[m
[31m-    export PATH=/usr/local/nginx/sbin:$PATH[m
[31m-[m
[31m-    # list all the static probes available in your nginx[m
[31m-    stap-nginx -L 'process("nginx").mark("*")'[m
[31m-[m
[31m-    # run the test.stp file[m
[31m-    stap-nginx test.stp[m
[31m-[m
[31m-Sample test.stp file:[m
[31m-[m
[31m-    probe begin[m
[31m-    {[m
[31m-        print("Tracing.  Hit CTRL-C to stop.\n")[m
[31m-    }[m
[31m-[m
[31m-    probe process("nginx").mark("http-subrequest-start")[m
[31m-    {[m
[31m-        printf("uri: %s?%s\n", ngx_http_req_uri($arg1),[m
[31m-            ngx_http_req_args($arg1))[m
[31m-    }[m
[31m-[m
[31m-For now, only tested on Solaris 11 Express and Fedora Linux 17.[m
[31m-[m
[31m-The original Nginx documentation is available at http://nginx.org[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/acc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/acc[m
[1mdeleted file mode 100644[m
[1mindex 6baee67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/acc[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# aCC: HP ANSI C++ B3910B A.03.55.02[m
[31m-[m
[31m-# C89 mode[m
[31m-[m
[31m-CFLAGS="$CFLAGS -Ae"[m
[31m-CC_TEST_FLAGS="-Ae"[m
[31m-[m
[31m-PCRE_OPT="$PCRE_OPT -Ae"[m
[31m-ZLIB_OPT="$ZLIB_OPT -Ae"[m
[31m-MD5_OPT="$MD5_OPT -Ae"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/bcc[m
[1mdeleted file mode 100644[m
[1mindex ec82e60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/bcc[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Borland C++ 5.5[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-# maximize speed[m
[31m-CFLAGS="$CFLAGS -O2"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-5"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-6"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-# __stdcall[m
[31m-#CPU_OPT="$CPU_OPT -ps"[m
[31m-# __fastcall[m
[31m-#CPU_OPT="$CPU_OPT -pr"[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-# multithreaded[m
[31m-CFLAGS="$CFLAGS -tWM"[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -w!"[m
[31m-[m
[31m-# disable logo[m
[31m-CFLAGS="$CFLAGS -q"[m
[31m-[m
[31m-[m
[31m-# precompiled headers[m
[31m-CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.csm"[m
[31m-NGX_PCH="$NGX_OBJS/ngx_config.csm"[m
[31m-NGX_BUILD_PCH="-H=$NGX_OBJS/ngx_config.csm"[m
[31m-NGX_USE_PCH="-Hu -H=$NGX_OBJS/ngx_config.csm"[m
[31m-[m
[31m-[m
[31m-# Win32 GUI mode application[m
[31m-#LINK="\$(CC) -laa"[m
[31m-[m
[31m-[m
[31m-# the resource file[m
[31m-NGX_RES="$NGX_OBJS/nginx.res"[m
[31m-NGX_RCC="brcc32 -fo$NGX_OBJS/nginx.res \$(CORE_INCS) $NGX_WIN32_RC"[m
[31m-# the pragma allows to link the resource file using bcc32 and[m
[31m-# to avoid the direct ilink32 calling and the c0w32.obj's WinMain/main problem[m
[31m-NGX_PRAGMA="#pragma resource \"$NGX_OBJS/nginx.res\""[m
[31m-[m
[31m-[m
[31m-ngx_include_opt="-I"[m
[31m-ngx_objout="-o"[m
[31m-ngx_binout="-e"[m
[31m-ngx_objext="obj"[m
[31m-ngx_binext=".exe"[m
[31m-[m
[31m-ngx_long_start='@&&|[m
[31m-	'[m
[31m-ngx_long_end='|'[m
[31m-[m
[31m-ngx_regex_dirsep='\\'[m
[31m-ngx_dirsep="\\"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/ccc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/ccc[m
[1mdeleted file mode 100644[m
[1mindex c964045..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/ccc[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Compaq C V6.5-207[m
[31m-[m
[31m-ngx_include_opt="-I"[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_enable level6 -msg_fatal level6"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable unknownmacro"[m
[31m-CFLAGS="$CFLAGS -msg_disable unusedincl"[m
[31m-CFLAGS="$CFLAGS -msg_disable unnecincl"[m
[31m-CFLAGS="$CFLAGS -msg_disable nestincl"[m
[31m-CFLAGS="$CFLAGS -msg_disable strctpadding"[m
[31m-CFLAGS="$CFLAGS -msg_disable ansialiascast"[m
[31m-CFLAGS="$CFLAGS -msg_disable inlinestoclsmod"[m
[31m-CFLAGS="$CFLAGS -msg_disable cxxkeyword"[m
[31m-CFLAGS="$CFLAGS -msg_disable longlongsufx"[m
[31m-CFLAGS="$CFLAGS -msg_disable valuepres"[m
[31m-[m
[31m-# STUB[m
[31m-CFLAGS="$CFLAGS -msg_disable truncintcast"[m
[31m-CFLAGS="$CFLAGS -msg_disable trunclongcast"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable truncintasn"[m
[31m-CFLAGS="$CFLAGS -msg_disable trunclongint"[m
[31m-CFLAGS="$CFLAGS -msg_disable intconcastsgn"[m
[31m-CFLAGS="$CFLAGS -msg_disable intconstsign"[m
[31m-CFLAGS="$CFLAGS -msg_disable switchlong"[m
[31m-CFLAGS="$CFLAGS -msg_disable subscrbounds2"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable hexoctunsign"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable ignorecallval"[m
[31m-CFLAGS="$CFLAGS -msg_disable nonstandcast"[m
[31m-CFLAGS="$CFLAGS -msg_disable embedcomment"[m
[31m-CFLAGS="$CFLAGS -msg_disable unreachcode"[m
[31m-CFLAGS="$CFLAGS -msg_disable questcompare2"[m
[31m-CFLAGS="$CFLAGS -msg_disable unusedtop"[m
[31m-CFLAGS="$CFLAGS -msg_disable unrefdecl"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -msg_disable bitnotint"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/clang b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/clang[m
[1mdeleted file mode 100644[m
[1mindex 22b22a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/clang[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# clang[m
[31m-[m
[31m-[m
[31m-NGX_CLANG_VER=`$CC -v 2>&1 | grep '\(clang\|LLVM\) version' 2>&1 \[m
[31m-                           | sed -e 's/^.* version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + clang version: $NGX_CLANG_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"clang $NGX_CLANG_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-CC_TEST_FLAGS="-pipe"[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-#NGX_CLANG_OPT="-O2"[m
[31m-#NGX_CLANG_OPT="-Oz"[m
[31m-NGX_CLANG_OPT="-O"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro | pentium3)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-march=pentiumpro"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-    athlon)[m
[31m-        # optimize for Athlon[m
[31m-        CPU_OPT="-march=athlon"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron[m
[31m-        CPU_OPT="-march=opteron"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS -pipe $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    PCRE_OPT="$PCRE_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    MD5_OPT="$MD5_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    ZLIB_OPT="$ZLIB_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS $NGX_CLANG_OPT -Wall -Wextra -Wpointer-arith"[m
[31m-CFLAGS="$CFLAGS -Wconditional-uninitialized"[m
[31m-#CFLAGS="$CFLAGS -Wmissing-prototypes"[m
[31m-[m
[31m-# we have a lot of unused function arguments[m
[31m-CFLAGS="$CFLAGS -Wno-unused-parameter"[m
[31m-[m
[31m-# deprecated system OpenSSL library on OS X[m
[31m-if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-    CFLAGS="$CFLAGS -Wno-deprecated-declarations"[m
[31m-fi[m
[31m-[m
[31m-# stop on warning[m
[31m-#CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[31m-[m
[31m-if [ ".$CPP" = "." ]; then[m
[31m-    CPP="$CC -E"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/clang.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/clang.orig[m
[1mdeleted file mode 100644[m
[1mindex 25707b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/clang.orig[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# clang[m
[31m-[m
[31m-[m
[31m-NGX_CLANG_VER=`$CC -v 2>&1 | grep '\(clang\|LLVM\) version' 2>&1 \[m
[31m-                           | sed -e 's/^.* version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + clang version: $NGX_CLANG_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"clang $NGX_CLANG_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-CC_TEST_FLAGS="-pipe"[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-#NGX_CLANG_OPT="-O2"[m
[31m-#NGX_CLANG_OPT="-Oz"[m
[31m-NGX_CLANG_OPT="-O"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro | pentium3)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-march=pentiumpro"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-    athlon)[m
[31m-        # optimize for Athlon[m
[31m-        CPU_OPT="-march=athlon"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron[m
[31m-        CPU_OPT="-march=opteron"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS -pipe $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    PCRE_OPT="$PCRE_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    MD5_OPT="$MD5_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O2 -pipe $CPU_OPT"[m
[31m-else[m
[31m-    ZLIB_OPT="$ZLIB_OPT -pipe"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS $NGX_CLANG_OPT -Wall -Wextra -Wpointer-arith"[m
[31m-CFLAGS="$CFLAGS -Wconditional-uninitialized"[m
[31m-#CFLAGS="$CFLAGS -Wmissing-prototypes"[m
[31m-[m
[31m-# we have a lot of unused function arguments[m
[31m-CFLAGS="$CFLAGS -Wno-unused-parameter"[m
[31m-[m
[31m-# deprecated system OpenSSL library on OS X[m
[31m-if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-    CFLAGS="$CFLAGS -Wno-deprecated-declarations"[m
[31m-fi[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[31m-[m
[31m-if [ ".$CPP" = "." ]; then[m
[31m-    CPP="$CC -E"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/conf[m
[1mdeleted file mode 100644[m
[1mindex e7477c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/conf[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-LINK="\$(CC)"[m
[31m-[m
[31m-MAIN_LINK=[m
[31m-MODULE_LINK="-shared"[m
[31m-[m
[31m-ngx_include_opt="-I "[m
[31m-ngx_compile_opt="-c"[m
[31m-ngx_pic_opt="-fPIC"[m
[31m-ngx_objout="-o "[m
[31m-ngx_binout="-o "[m
[31m-ngx_objext="o"[m
[31m-ngx_binext=[m
[31m-ngx_modext=".so"[m
[31m-[m
[31m-ngx_long_start=[m
[31m-ngx_long_end=[m
[31m-[m
[31m-ngx_regex_dirsep="\/"[m
[31m-ngx_dirsep='/'[m
[31m-[m
[31m-ngx_regex_cont=' \\\[m
[31m-	'[m
[31m-ngx_cont=' \[m
[31m-	'[m
[31m-ngx_tab=' \[m
[31m-		'[m
[31m-ngx_spacer=[m
[31m-[m
[31m-ngx_long_regex_cont=$ngx_regex_cont[m
[31m-ngx_long_cont=$ngx_cont[m
[31m-[m
[31m-. auto/cc/name[m
[31m-[m
[31m-if test -n "$CFLAGS"; then[m
[31m-[m
[31m-    CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT"[m
[31m-[m
[31m-    case $NGX_CC_NAME in[m
[31m-[m
[31m-        ccc)[m
[31m-            # Compaq C V6.5-207[m
[31m-[m
[31m-            ngx_include_opt="-I"[m
[31m-        ;;[m
[31m-[m
[31m-        sunc)[m
[31m-[m
[31m-            MAIN_LINK=[m
[31m-            MODULE_LINK="-G"[m
[31m-[m
[31m-            case "$NGX_MACHINE" in[m
[31m-[m
[31m-                i86pc)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"[m
[31m-                ;;[m
[31m-[m
[31m-                sun4u | sun4v)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-[m
[31m-            case $CPU in[m
[31m-[m
[31m-                amd64)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    case $NGX_CC_NAME in[m
[31m-        gcc)[m
[31m-            # gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2[m
[31m-            #     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2[m
[31m-            #     4.0.0, 4.0.1, 4.1.0[m
[31m-[m
[31m-            . auto/cc/gcc[m
[31m-        ;;[m
[31m-[m
[31m-        clang)[m
[31m-            # Clang C compiler[m
[31m-[m
[31m-            . auto/cc/clang[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            # Intel C++ compiler 7.1, 8.0, 8.1[m
[31m-[m
[31m-            . auto/cc/icc[m
[31m-        ;;[m
[31m-[m
[31m-        sunc)[m
[31m-            # Sun C 5.7 Patch 117837-04 2005/05/11[m
[31m-[m
[31m-            . auto/cc/sunc[m
[31m-        ;;[m
[31m-[m
[31m-        ccc)[m
[31m-            # Compaq C V6.5-207[m
[31m-[m
[31m-            . auto/cc/ccc[m
[31m-        ;;[m
[31m-[m
[31m-        acc)[m
[31m-            # aCC: HP ANSI C++ B3910B A.03.55.02[m
[31m-[m
[31m-            . auto/cc/acc[m
[31m-        ;;[m
[31m-[m
[31m-        msvc*)[m
[31m-            # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003[m
[31m-[m
[31m-            . auto/cc/msvc[m
[31m-        ;;[m
[31m-[m
[31m-        owc)[m
[31m-            # Open Watcom C 1.0, 1.2[m
[31m-[m
[31m-            . auto/cc/owc[m
[31m-        ;;[m
[31m-[m
[31m-        bcc)[m
[31m-            # Borland C++ 5.5[m
[31m-[m
[31m-            . auto/cc/bcc[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-    CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT"[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS $NGX_CC_OPT"[m
[31m-NGX_TEST_LD_OPT="$NGX_LD_OPT"[m
[31m-[m
[31m-if [ 1 ]; then[m
[31m-[m
[31m-    if test -n "$NGX_LD_OPT"; then[m
[31m-        ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\"[m
[31m-        ngx_feature_name=[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs=[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test=[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\"[m
[31m-            echo[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="-Wl,-E switch"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=-Wl,-E[m
[31m-    ngx_feature_test=[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        MAIN_LINK="-Wl,-E"[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc builtin atomic operations"[m
[31m-    ngx_feature_name=NGX_HAVE_GCC_ATOMIC[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="long  n = 0;[m
[31m-                      if (!__sync_bool_compare_and_swap(&n, 0, 1))[m
[31m-                          return 1;[m
[31m-                      if (__sync_fetch_and_add(&n, 1) != 1)[m
[31m-                          return 1;[m
[31m-                      if (n != 2)[m
[31m-                          return 1;[m
[31m-                      __sync_synchronize();"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-    if [ "$NGX_CC_NAME" = "ccc" ]; then[m
[31m-        echo "checking for C99 variadic macros ... disabled"[m
[31m-    else[m
[31m-        ngx_feature="C99 variadic macros"[m
[31m-        ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS"[m
[31m-        ngx_feature_run=yes[m
[31m-        ngx_feature_incs="#include <stdio.h>[m
[31m-#define var(dummy, ...)  sprintf(__VA_ARGS__)"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="char  buf[30]; buf[0] = '0';[m
[31m-                          var(0, buf, \"%d\", 1);[m
[31m-                          if (buf[0] != '1') return 1"[m
[31m-        . auto/feature[m
[31m-     fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc variadic macros"[m
[31m-    ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS"[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs="#include <stdio.h>[m
[31m-#define var(dummy, args...)  sprintf(args)"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="char  buf[30]; buf[0] = '0';[m
[31m-                      var(0, buf, \"%d\", 1);[m
[31m-                      if (buf[0] != '1') return 1"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc builtin 64 bit byteswap"[m
[31m-    ngx_feature_name="NGX_HAVE_GCC_BSWAP64"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="__builtin_bswap64(0)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-#    ngx_feature="inline"[m
[31m-#    ngx_feature_name=[m
[31m-#    ngx_feature_run=no[m
[31m-#    ngx_feature_incs="int inline f(void) { return 1 }"[m
[31m-#    ngx_feature_path=[m
[31m-#    ngx_feature_libs=[m
[31m-#    ngx_feature_test=[m
[31m-#    . auto/feature[m
[31m-#[m
[31m-#    if [ $ngx_found = yes ]; then[m
[31m-#    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/conf.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/conf.orig[m
[1mdeleted file mode 100644[m
[1mindex f2c25ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/conf.orig[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-LINK="\$(CC)"[m
[31m-[m
[31m-MAIN_LINK=[m
[31m-MODULE_LINK="-shared"[m
[31m-[m
[31m-ngx_include_opt="-I "[m
[31m-ngx_compile_opt="-c"[m
[31m-ngx_pic_opt="-fPIC"[m
[31m-ngx_objout="-o "[m
[31m-ngx_binout="-o "[m
[31m-ngx_objext="o"[m
[31m-ngx_binext=[m
[31m-ngx_modext=".so"[m
[31m-[m
[31m-ngx_long_start=[m
[31m-ngx_long_end=[m
[31m-[m
[31m-ngx_regex_dirsep="\/"[m
[31m-ngx_dirsep='/'[m
[31m-[m
[31m-ngx_regex_cont=' \\\[m
[31m-	'[m
[31m-ngx_cont=' \[m
[31m-	'[m
[31m-ngx_tab=' \[m
[31m-		'[m
[31m-ngx_spacer=[m
[31m-[m
[31m-ngx_long_regex_cont=$ngx_regex_cont[m
[31m-ngx_long_cont=$ngx_cont[m
[31m-[m
[31m-. auto/cc/name[m
[31m-[m
[31m-if test -n "$CFLAGS"; then[m
[31m-[m
[31m-    CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT"[m
[31m-[m
[31m-    case $NGX_CC_NAME in[m
[31m-[m
[31m-        ccc)[m
[31m-            # Compaq C V6.5-207[m
[31m-[m
[31m-            ngx_include_opt="-I"[m
[31m-        ;;[m
[31m-[m
[31m-        sunc)[m
[31m-[m
[31m-            MAIN_LINK=[m
[31m-            MODULE_LINK="-G"[m
[31m-[m
[31m-            case "$NGX_MACHINE" in[m
[31m-[m
[31m-                i86pc)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"[m
[31m-                ;;[m
[31m-[m
[31m-                sun4u | sun4v)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-[m
[31m-            case $CPU in[m
[31m-[m
[31m-                amd64)[m
[31m-                    NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    case $NGX_CC_NAME in[m
[31m-        gcc)[m
[31m-            # gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2[m
[31m-            #     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2[m
[31m-            #     4.0.0, 4.0.1, 4.1.0[m
[31m-[m
[31m-            . auto/cc/gcc[m
[31m-        ;;[m
[31m-[m
[31m-        clang)[m
[31m-            # Clang C compiler[m
[31m-[m
[31m-            . auto/cc/clang[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            # Intel C++ compiler 7.1, 8.0, 8.1[m
[31m-[m
[31m-            . auto/cc/icc[m
[31m-        ;;[m
[31m-[m
[31m-        sunc)[m
[31m-            # Sun C 5.7 Patch 117837-04 2005/05/11[m
[31m-[m
[31m-            . auto/cc/sunc[m
[31m-        ;;[m
[31m-[m
[31m-        ccc)[m
[31m-            # Compaq C V6.5-207[m
[31m-[m
[31m-            . auto/cc/ccc[m
[31m-        ;;[m
[31m-[m
[31m-        acc)[m
[31m-            # aCC: HP ANSI C++ B3910B A.03.55.02[m
[31m-[m
[31m-            . auto/cc/acc[m
[31m-        ;;[m
[31m-[m
[31m-        msvc*)[m
[31m-            # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003[m
[31m-[m
[31m-            . auto/cc/msvc[m
[31m-        ;;[m
[31m-[m
[31m-        owc)[m
[31m-            # Open Watcom C 1.0, 1.2[m
[31m-[m
[31m-            . auto/cc/owc[m
[31m-        ;;[m
[31m-[m
[31m-        bcc)[m
[31m-            # Borland C++ 5.5[m
[31m-[m
[31m-            . auto/cc/bcc[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-    CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT"[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-CFLAGS="$CFLAGS $NGX_CC_OPT"[m
[31m-NGX_TEST_LD_OPT="$NGX_LD_OPT"[m
[31m-[m
[31m-if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-    if test -n "$NGX_LD_OPT"; then[m
[31m-        ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\"[m
[31m-        ngx_feature_name=[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs=[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test=[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\"[m
[31m-            echo[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="-Wl,-E switch"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=-Wl,-E[m
[31m-    ngx_feature_test=[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        MAIN_LINK="-Wl,-E"[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc builtin atomic operations"[m
[31m-    ngx_feature_name=NGX_HAVE_GCC_ATOMIC[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="long  n = 0;[m
[31m-                      if (!__sync_bool_compare_and_swap(&n, 0, 1))[m
[31m-                          return 1;[m
[31m-                      if (__sync_fetch_and_add(&n, 1) != 1)[m
[31m-                          return 1;[m
[31m-                      if (n != 2)[m
[31m-                          return 1;[m
[31m-                      __sync_synchronize();"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-    if [ "$NGX_CC_NAME" = "ccc" ]; then[m
[31m-        echo "checking for C99 variadic macros ... disabled"[m
[31m-    else[m
[31m-        ngx_feature="C99 variadic macros"[m
[31m-        ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS"[m
[31m-        ngx_feature_run=yes[m
[31m-        ngx_feature_incs="#include <stdio.h>[m
[31m-#define var(dummy, ...)  sprintf(__VA_ARGS__)"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="char  buf[30]; buf[0] = '0';[m
[31m-                          var(0, buf, \"%d\", 1);[m
[31m-                          if (buf[0] != '1') return 1"[m
[31m-        . auto/feature[m
[31m-     fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc variadic macros"[m
[31m-    ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS"[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs="#include <stdio.h>[m
[31m-#define var(dummy, args...)  sprintf(args)"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="char  buf[30]; buf[0] = '0';[m
[31m-                      var(0, buf, \"%d\", 1);[m
[31m-                      if (buf[0] != '1') return 1"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-    ngx_feature="gcc builtin 64 bit byteswap"[m
[31m-    ngx_feature_name="NGX_HAVE_GCC_BSWAP64"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="__builtin_bswap64(0)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-#    ngx_feature="inline"[m
[31m-#    ngx_feature_name=[m
[31m-#    ngx_feature_run=no[m
[31m-#    ngx_feature_incs="int inline f(void) { return 1 }"[m
[31m-#    ngx_feature_path=[m
[31m-#    ngx_feature_libs=[m
[31m-#    ngx_feature_test=[m
[31m-#    . auto/feature[m
[31m-#[m
[31m-#    if [ $ngx_found = yes ]; then[m
[31m-#    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/gcc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/gcc[m
[1mdeleted file mode 100644[m
[1mindex 3aae5f7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/gcc[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2[m
[31m-#     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2[m
[31m-#     4.0.0, 4.0.1, 4.1.0[m
[31m-[m
[31m-[m
[31m-NGX_GCC_VER=`$CC -v 2>&1 | grep 'gcc version' 2>&1 \[m
[31m-                         | sed -e 's/^.* version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + gcc version: $NGX_GCC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"gcc $NGX_GCC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-# Solaris 7's /usr/ccs/bin/as does not support "-pipe"[m
[31m-[m
[31m-CC_TEST_FLAGS="-pipe"[m
[31m-[m
[31m-ngx_feature="gcc -pipe switch"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test=[m
[31m-. auto/feature[m
[31m-[m
[31m-CC_TEST_FLAGS=[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    PIPE="-pipe"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case "$NGX_MACHINE" in[m
[31m-[m
[31m-    sun4u | sun4v | sparc | sparc64 )[m
[31m-        # "-mcpu=v9" enables the "casa" assembler instruction[m
[31m-        CFLAGS="$CFLAGS -mcpu=v9"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-#NGX_GCC_OPT="-O2"[m
[31m-#NGX_GCC_OPT="-Os"[m
[31m-NGX_GCC_OPT="-O"[m
[31m-[m
[31m-#CFLAGS="$CFLAGS -fomit-frame-pointer"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro | pentium3)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-march=pentiumpro"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4, gcc 3.x[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-    athlon)[m
[31m-        # optimize for Athlon, gcc 3.x[m
[31m-        CPU_OPT="-march=athlon"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron, gcc 3.x[m
[31m-        CPU_OPT="-march=opteron"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc32)[m
[31m-        # build 32-bit UltraSparc binary[m
[31m-        CPU_OPT="-m32"[m
[31m-        CORE_LINK="$CORE_LINK -m32"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc64)[m
[31m-        # build 64-bit UltraSparc binary[m
[31m-        CPU_OPT="-m64"[m
[31m-        CORE_LINK="$CORE_LINK -m64"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    ppc64)[m
[31m-        # build 64-bit PowerPC binary[m
[31m-        CPU_OPT="-m64"[m
[31m-        CPU_OPT="$CPU_OPT -falign-functions=32 -falign-labels=32"[m
[31m-        CPU_OPT="$CPU_OPT -falign-loops=32 -falign-jumps=32"[m
[31m-        CORE_LINK="$CORE_LINK -m64"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"[m
[31m-[m
[31m-case "$NGX_GCC_VER" in[m
[31m-    2.7*)[m
[31m-        # batch build[m
[31m-        CPU_OPT=[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS $PIPE $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    PCRE_OPT="$PCRE_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    MD5_OPT="$MD5_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    ZLIB_OPT="$ZLIB_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-# -W requires at least -O[m
[31m-CFLAGS="$CFLAGS ${NGX_GCC_OPT:--O} -W"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -Wall -Wpointer-arith"[m
[31m-#CFLAGS="$CFLAGS -Wconversion"[m
[31m-#CFLAGS="$CFLAGS -Winline"[m
[31m-#CFLAGS="$CFLAGS -Wmissing-prototypes"[m
[31m-[m
[31m-[m
[31m-case "$NGX_GCC_VER" in[m
[31m-    [3-5].*)[m
[31m-        # we have a lot of the unused function arguments[m
[31m-        CFLAGS="$CFLAGS -Wno-unused-parameter"[m
[31m-        # 4.2.1 shows the warning in wrong places[m
[31m-        #CFLAGS="$CFLAGS -Wunreachable-code"[m
[31m-[m
[31m-        # deprecated system OpenSSL library on OS X[m
[31m-        if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-            CFLAGS="$CFLAGS -Wno-deprecated-declarations"[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        # we have a lot of the unused function arguments[m
[31m-        CFLAGS="$CFLAGS -Wno-unused"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-# stop on warning[m
[31m-#CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[31m-[m
[31m-# DragonFly's gcc3 generates DWARF[m
[31m-#CFLAGS="$CFLAGS -g -gstabs"[m
[31m-[m
[31m-if [ ".$CPP" = "." ]; then[m
[31m-    CPP="$CC -E"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/gcc.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/gcc.orig[m
[1mdeleted file mode 100644[m
[1mindex c9101fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/gcc.orig[m
[1m+++ /dev/null[m
[36m@@ -1,186 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2[m
[31m-#     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2[m
[31m-#     4.0.0, 4.0.1, 4.1.0[m
[31m-[m
[31m-[m
[31m-NGX_GCC_VER=`$CC -v 2>&1 | grep 'gcc version' 2>&1 \[m
[31m-                         | sed -e 's/^.* version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + gcc version: $NGX_GCC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"gcc $NGX_GCC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-# Solaris 7's /usr/ccs/bin/as does not support "-pipe"[m
[31m-[m
[31m-CC_TEST_FLAGS="-pipe"[m
[31m-[m
[31m-ngx_feature="gcc -pipe switch"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test=[m
[31m-. auto/feature[m
[31m-[m
[31m-CC_TEST_FLAGS=[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    PIPE="-pipe"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case "$NGX_MACHINE" in[m
[31m-[m
[31m-    sun4u | sun4v | sparc | sparc64 )[m
[31m-        # "-mcpu=v9" enables the "casa" assembler instruction[m
[31m-        CFLAGS="$CFLAGS -mcpu=v9"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-#NGX_GCC_OPT="-O2"[m
[31m-#NGX_GCC_OPT="-Os"[m
[31m-NGX_GCC_OPT="-O"[m
[31m-[m
[31m-#CFLAGS="$CFLAGS -fomit-frame-pointer"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro | pentium3)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-march=pentiumpro"[m
[31m-        NGX_CPU_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4, gcc 3.x[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-    athlon)[m
[31m-        # optimize for Athlon, gcc 3.x[m
[31m-        CPU_OPT="-march=athlon"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron, gcc 3.x[m
[31m-        CPU_OPT="-march=opteron"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc32)[m
[31m-        # build 32-bit UltraSparc binary[m
[31m-        CPU_OPT="-m32"[m
[31m-        CORE_LINK="$CORE_LINK -m32"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc64)[m
[31m-        # build 64-bit UltraSparc binary[m
[31m-        CPU_OPT="-m64"[m
[31m-        CORE_LINK="$CORE_LINK -m64"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    ppc64)[m
[31m-        # build 64-bit PowerPC binary[m
[31m-        CPU_OPT="-m64"[m
[31m-        CPU_OPT="$CPU_OPT -falign-functions=32 -falign-labels=32"[m
[31m-        CPU_OPT="$CPU_OPT -falign-loops=32 -falign-jumps=32"[m
[31m-        CORE_LINK="$CORE_LINK -m64"[m
[31m-        NGX_CPU_CACHE_LINE=128[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"[m
[31m-[m
[31m-case "$NGX_GCC_VER" in[m
[31m-    2.7*)[m
[31m-        # batch build[m
[31m-        CPU_OPT=[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS $PIPE $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    PCRE_OPT="$PCRE_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    MD5_OPT="$MD5_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"[m
[31m-else[m
[31m-    ZLIB_OPT="$ZLIB_OPT $PIPE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-# -W requires at least -O[m
[31m-CFLAGS="$CFLAGS ${NGX_GCC_OPT:--O} -W"[m
[31m-[m
[31m-CFLAGS="$CFLAGS -Wall -Wpointer-arith"[m
[31m-#CFLAGS="$CFLAGS -Wconversion"[m
[31m-#CFLAGS="$CFLAGS -Winline"[m
[31m-#CFLAGS="$CFLAGS -Wmissing-prototypes"[m
[31m-[m
[31m-[m
[31m-case "$NGX_GCC_VER" in[m
[31m-    [3-5].*)[m
[31m-        # we have a lot of the unused function arguments[m
[31m-        CFLAGS="$CFLAGS -Wno-unused-parameter"[m
[31m-        # 4.2.1 shows the warning in wrong places[m
[31m-        #CFLAGS="$CFLAGS -Wunreachable-code"[m
[31m-[m
[31m-        # deprecated system OpenSSL library on OS X[m
[31m-        if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-            CFLAGS="$CFLAGS -Wno-deprecated-declarations"[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        # we have a lot of the unused function arguments[m
[31m-        CFLAGS="$CFLAGS -Wno-unused"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[31m-[m
[31m-# DragonFly's gcc3 generates DWARF[m
[31m-#CFLAGS="$CFLAGS -g -gstabs"[m
[31m-[m
[31m-if [ ".$CPP" = "." ]; then[m
[31m-    CPP="$CC -E"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/icc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/icc[m
[1mdeleted file mode 100644[m
[1mindex 41eec08..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/icc[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Intel C++ compiler 7.1, 8.0, 8.1, 9.0, 11.1[m
[31m-[m
[31m-NGX_ICC_VER=`$CC -V 2>&1 | grep 'Version' 2>&1 \[m
[31m-                         | sed -e 's/^.* Version \([^ ]*\) *Build.*$/\1/'`[m
[31m-[m
[31m-echo " + icc version: $NGX_ICC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"Intel C Compiler $NGX_ICC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-CFLAGS="$CFLAGS -O"[m
[31m-[m
[31m-CORE_LINK="$CORE_LINK -opt_report_file=$NGX_OBJS/opt_report_file"[m
[31m-[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-march=pentium"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-mcpu=pentiumpro -march=pentiumpro"[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4, default[m
[31m-        CPU_OPT="-march=pentium4"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="-O $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="-O $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="-O $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS -w2"[m
[31m-[m
[31m-# disable some warnings[m
[31m-[m
[31m-# invalid type conversion: "int" to "char *"[m
[31m-CFLAGS="$CFLAGS -wd171"[m
[31m-# argument is incompatible with corresponding format string conversion[m
[31m-CFLAGS="$CFLAGS -wd181"[m
[31m-# zero used for undefined preprocessing identifier[m
[31m-CFLAGS="$CFLAGS -wd193"[m
[31m-# the format string ends before this argument[m
[31m-CFLAGS="$CFLAGS -wd268"[m
[31m-# invalid format string conversion[m
[31m-CFLAGS="$CFLAGS -wd269"[m
[31m-# conversion from "long long" to "size_t" may lose significant bits[m
[31m-CFLAGS="$CFLAGS -wd810"[m
[31m-# parameter was never referenced[m
[31m-CFLAGS="$CFLAGS -wd869"[m
[31m-# attribute "unused" is only allowed in a function definition, warning on pTHX_[m
[31m-CFLAGS="$CFLAGS -wd1301"[m
[31m-[m
[31m-# STUB[m
[31m-# enumerated type mixed with another type[m
[31m-CFLAGS="$CFLAGS -wd188"[m
[31m-# controlling expression is constant[m
[31m-CFLAGS="$CFLAGS -wd279"[m
[31m-# operands are evaluated in unspecified order[m
[31m-CFLAGS="$CFLAGS -wd981"[m
[31m-# external definition with no prior declaration[m
[31m-CFLAGS="$CFLAGS -wd1418"[m
[31m-# external declaration in primary source file[m
[31m-CFLAGS="$CFLAGS -wd1419"[m
[31m-[m
[31m-case "$NGX_ICC_VER" in[m
[31m-    9.*)[m
[31m-        # "cc" clobber ignored, warnings for Linux's htonl()/htons()[m
[31m-        CFLAGS="$CFLAGS -wd1469"[m
[31m-        # explicit conversion of a 64-bit integral type to a smaller[m
[31m-        # integral type[m
[31m-        CFLAGS="$CFLAGS -wd1683"[m
[31m-        # conversion from pointer to same-sized integral type,[m
[31m-        # warning on offsetof()[m
[31m-        CFLAGS="$CFLAGS -wd1684"[m
[31m-        # floating-point equality and inequality comparisons are unreliable,[m
[31m-        # warning on SvTRUE()[m
[31m-        CFLAGS="$CFLAGS -wd1572"[m
[31m-    ;;[m
[31m-[m
[31m-    8.*)[m
[31m-        # "cc" clobber ignored, warnings for Linux's htonl()/htons()[m
[31m-        CFLAGS="$CFLAGS -wd1469"[m
[31m-        # floating-point equality and inequality comparisons are unreliable,[m
[31m-        # warning on SvTRUE()[m
[31m-        CFLAGS="$CFLAGS -wd1572"[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-# stop on warning[m
[31m-#CFLAGS="$CFLAGS -Werror"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/msvc[m
[1mdeleted file mode 100644[m
[1mindex 4eef101..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/msvc[m
[1m+++ /dev/null[m
[36m@@ -1,157 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# MSVC 6.0 SP2                            cl 12.00[m
[31m-# MSVC Toolkit 2003 (7.1)                 cl 13.10[m
[31m-# MSVC 2005 Express Edition SP1 (8.0)     cl 14.00[m
[31m-# MSVC 2008 Express Edition (9.0)         cl 15.00[m
[31m-# MSVC 2010 (10.0)                        cl 16.00[m
[31m-# MSVC 2015 (14.0)                        cl 19.00[m
[31m-[m
[31m-[m
[31m-NGX_MSVC_VER=`$NGX_WINE $CC 2>&1 | grep 'Compiler Version' 2>&1 \[m
[31m-                                 | sed -e 's/^.* Version \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + cl version: $NGX_MSVC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"cl $NGX_MSVC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-ngx_msvc_ver=`echo $NGX_MSVC_VER | sed -e 's/^\([0-9]*\).*/\1/'`[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-# maximize speed, equivalent to -Og -Oi -Ot -Oy -Ob2 -Gs -GF -Gy[m
[31m-CFLAGS="$CFLAGS -O2"[m
[31m-[m
[31m-# enable global optimization[m
[31m-#CFLAGS="$CFLAGS -Og"[m
[31m-# enable intrinsic functions[m
[31m-#CFLAGS="$CFLAGS -Oi"[m
[31m-[m
[31m-# disable inline expansion[m
[31m-#CFLAGS="$CFLAGS -Ob0"[m
[31m-# explicit inline expansion[m
[31m-#CFLAGS="$CFLAGS -Ob1"[m
[31m-# explicit and implicit inline expansion[m
[31m-#CFLAGS="$CFLAGS -Ob2"[m
[31m-[m
[31m-# enable frame pointer omission[m
[31m-#CFLAGS="$CFLAGS -Oy"[m
[31m-# disable stack checking calls[m
[31m-#CFLAGS="$CFLAGS -Gs"[m
[31m-[m
[31m-# pools strings as read/write[m
[31m-#CFLAGS="$CFLAGS -Gf"[m
[31m-# pools strings as read-only[m
[31m-#CFLAGS="$CFLAGS -GF"[m
[31m-[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-G5"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        CPU_OPT="-G6"[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4, MSVC 7[m
[31m-        CPU_OPT="-G7"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-# __cdecl, default, must be used with OpenSSL, md5 asm, and sha1 asm[m
[31m-#CPU_OPT="$CPU_OPT -Gd"[m
[31m-# __stdcall[m
[31m-#CPU_OPT="$CPU_OPT -Gz"[m
[31m-# __fastcall[m
[31m-#CPU_OPT="$CPU_OPT -Gr"[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-CFLAGS="$CFLAGS -W4"[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -WX"[m
[31m-[m
[31m-# disable logo[m
[31m-CFLAGS="$CFLAGS -nologo"[m
[31m-[m
[31m-# the link flags[m
[31m-CORE_LINK="$CORE_LINK -link -verbose:lib"[m
[31m-[m
[31m-# link with libcmt.lib, multithreaded[m
[31m-LIBC="-MT"[m
[31m-# link with msvcrt.dll[m
[31m-# however, MSVC Toolkit 2003 has no MSVCRT.LIB[m
[31m-#LIBC="-MD"[m
[31m-[m
[31m-CFLAGS="$CFLAGS $LIBC"[m
[31m-[m
[31m-CORE_LIBS="$CORE_LIBS kernel32.lib user32.lib"[m
[31m-[m
[31m-# Win32 GUI mode application[m
[31m-#CORE_LINK="$CORE_LINK -subsystem:windows -entry:mainCRTStartup"[m
[31m-[m
[31m-# debug[m
[31m-# msvc under Wine issues[m
[31m-# C1902: Program database manager mismatch; please check your installation[m
[31m-if [ -z "$NGX_WINE" ]; then[m
[31m-   CFLAGS="$CFLAGS -Zi"[m
[31m-   CORE_LINK="$CORE_LINK -debug"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# MSVC 2005 supports C99 variadic macros[m
[31m-if [ "$ngx_msvc_ver" -ge 14 ]; then[m
[31m-    have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# precompiled headers[m
[31m-CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch"[m
[31m-CORE_LINK="$CORE_LINK $NGX_OBJS/ngx_pch.obj"[m
[31m-NGX_PCH="$NGX_OBJS/ngx_config.pch"[m
[31m-NGX_BUILD_PCH="-Ycngx_config.h -Fp$NGX_OBJS/ngx_config.pch"[m
[31m-NGX_USE_PCH="-Yungx_config.h -Fp$NGX_OBJS/ngx_config.pch"[m
[31m-[m
[31m-[m
[31m-# the resource file[m
[31m-NGX_RES="$NGX_OBJS/nginx.res"[m
[31m-NGX_RCC="rc -fo$NGX_RES \$(CORE_INCS) $NGX_WIN32_RC"[m
[31m-CORE_LINK="$NGX_RES $CORE_LINK"[m
[31m-[m
[31m-[m
[31m-# dynamic modules[m
[31m-#MAIN_LINK="-link -def:$NGX_OBJS/nginx.def"[m
[31m-#MODULE_LINK="-LD $NGX_OBJS/nginx.lib"[m
[31m-[m
[31m-[m
[31m-ngx_pic_opt=[m
[31m-ngx_objout="-Fo"[m
[31m-ngx_binout="-Fe"[m
[31m-ngx_objext="obj"[m
[31m-ngx_binext=".exe"[m
[31m-[m
[31m-ngx_long_start='@<<[m
[31m-	'[m
[31m-ngx_long_end='<<'[m
[31m-ngx_long_regex_cont=' \[m
[31m-	'[m
[31m-ngx_long_cont='[m
[31m-	'[m
[31m-[m
[31m-# MSVC understand / in path[m
[31m-#ngx_regex_dirsep='\\'[m
[31m-#ngx_dirsep="\\"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/name b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/name[m
[1mdeleted file mode 100644[m
[1mindex 35d319e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/name[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-    ngx_feature="C compiler"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test=[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        echo[m
[31m-        echo $0: error: C compiler $CC is not found[m
[31m-        echo[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ "$CC" = cl ]; then[m
[31m-    NGX_CC_NAME=msvc[m
[31m-    echo " + using Microsoft Visual C++ compiler"[m
[31m-[m
[31m-elif [ "$CC" = wcl386 ]; then[m
[31m-    NGX_CC_NAME=owc[m
[31m-    echo " + using Open Watcom C compiler"[m
[31m-[m
[31m-elif [ "$CC" = bcc32 ]; then[m
[31m-    NGX_CC_NAME=bcc[m
[31m-    echo " + using Borland C++ compiler"[m
[31m-[m
[31m-elif `$CC -V 2>&1 | grep '^Intel(R) C' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=icc[m
[31m-    echo " + using Intel C++ compiler"[m
[31m-[m
[31m-elif `$CC -v 2>&1 | grep 'gcc version' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=gcc[m
[31m-    echo " + using GNU C compiler"[m
[31m-[m
[31m-elif `$CC -v 2>&1 | grep '\(clang\|LLVM\) version' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=clang[m
[31m-    echo " + using Clang C compiler"[m
[31m-[m
[31m-elif `$CC -V 2>&1 | grep 'Sun C' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=sunc[m
[31m-    echo " + using Sun C compiler"[m
[31m-[m
[31m-elif `$CC -V 2>&1 | grep '^Compaq C' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=ccc[m
[31m-    echo " + using Compaq C compiler"[m
[31m-[m
[31m-elif `$CC -V 2>&1 | grep '^aCC: ' >/dev/null 2>&1`; then[m
[31m-    NGX_CC_NAME=acc[m
[31m-    echo " + using HP aC++ compiler"[m
[31m-[m
[31m-else[m
[31m-    NGX_CC_NAME=unknown[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/owc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/owc[m
[1mdeleted file mode 100644[m
[1mindex a063aa3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/owc[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Open Watcom C 1.0, 1.2, 1.3[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-# maximize speed[m
[31m-CFLAGS="$CFLAGS -ot"[m
[31m-# reorder instructions for best pipeline usage[m
[31m-CFLAGS="$CFLAGS -op"[m
[31m-# inline intrinsic functions[m
[31m-CFLAGS="$CFLAGS -oi"[m
[31m-# inline expansion[m
[31m-CFLAGS="$CFLAGS -oe"[m
[31m-# disable stack checking calls[m
[31m-CFLAGS="$CFLAGS -s"[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        # register-based arguments passing conventions[m
[31m-        CPU_OPT="-5r"[m
[31m-        # stack-based arguments passing conventions[m
[31m-        #CPU_OPT="-5s"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II and Pentium III[m
[31m-        # register-based arguments passing conventions[m
[31m-        CPU_OPT="-6r"[m
[31m-        # stack-based arguments passing conventions[m
[31m-        #CPU_OPT="-6s"[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-# warnings[m
[31m-[m
[31m-# maximum level[m
[31m-CFLAGS="$CFLAGS -wx"[m
[31m-#CFLAGS="$CFLAGS -w3"[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -we"[m
[31m-[m
[31m-# built target is NT[m
[31m-CFLAGS="$CFLAGS -bt=nt"[m
[31m-[m
[31m-# multithreaded[m
[31m-CFLAGS="$CFLAGS -bm"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -d2"[m
[31m-[m
[31m-# quiet[m
[31m-CFLAGS="$CFLAGS -zq"[m
[31m-[m
[31m-# Open Watcom C 1.2[m
[31m-have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have[m
[31m-[m
[31m-[m
[31m-# the precompiled headers[m
[31m-#CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch"[m
[31m-#NGX_PCH="$NGX_OBJS/ngx_config.pch"[m
[31m-#NGX_BUILD_PCH="-fhq=$NGX_OBJS/ngx_config.pch"[m
[31m-#NGX_USE_PCH="-fh=$NGX_OBJS/ngx_config.pch"[m
[31m-[m
[31m-[m
[31m-# the link flags, built target is NT GUI mode application[m
[31m-#CORE_LINK="$CORE_LINK -l=nt_win"[m
[31m-[m
[31m-[m
[31m-# the resource file[m
[31m-NGX_RCC="wrc \$(CORE_INCS) -fo=$NGX_OBJS/nginx.res "[m
[31m-NGX_RCC="$NGX_RCC $NGX_WIN32_RC $NGX_OBJS/nginx.exe"[m
[31m-[m
[31m-[m
[31m-ngx_include_opt="-i="[m
[31m-ngx_objout="-fo"[m
[31m-ngx_binout="-fe="[m
[31m-ngx_objext="obj"[m
[31m-ngx_binext=".exe"[m
[31m-[m
[31m-ngx_regex_dirsep='\\'[m
[31m-ngx_dirsep="\\"[m
[31m-[m
[31m-ngx_long_start=' '[m
[31m-ngx_long_end=' '[m
[31m-ngx_long_regex_cont=' \&\[m
[31m-	'[m
[31m-ngx_long_cont=' &[m
[31m-	'[m
[31m-[m
[31m-ngx_regex_cont=' \&\[m
[31m-	'[m
[31m-ngx_cont=' &[m
[31m-	'[m
[31m-ngx_tab=' &[m
[31m-		'[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/sunc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/sunc[m
[1mdeleted file mode 100644[m
[1mindex 8360c49..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/cc/sunc[m
[1m+++ /dev/null[m
[36m@@ -1,161 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-# Sun C 5.7 Patch 117837-04 2005/05/11    Sun Studio 10[m
[31m-# Sun C 5.8 2005/10/13                    Sun Studio 11[m
[31m-# Sun C 5.9 SunOS_i386 2007/05/03         Sun Studio 12[m
[31m-# Sun C 5.9 SunOS_sparc 2007/05/03[m
[31m-# Sun C 5.10 SunOS_i386 2009/06/03        Sun Studio 12.1[m
[31m-# Sun C 5.11 SunOS_i386 2010/08/13        Sun Studio 12.2[m
[31m-[m
[31m-NGX_SUNC_VER=`$CC -V 2>&1 | grep 'Sun C' 2>&1 \[m
[31m-                          | sed -e 's/^.* Sun C \(.*\)/\1/'`[m
[31m-[m
[31m-echo " + Sun C version: $NGX_SUNC_VER"[m
[31m-[m
[31m-have=NGX_COMPILER value="\"Sun C $NGX_SUNC_VER\"" . auto/define[m
[31m-[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-int main() { printf("%d", __SUNPRO_C); }[m
[31m-[m
[31m-END[m
[31m-[m
[31m-eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    ngx_sunc_ver=`$NGX_AUTOTEST`[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-# 1424 == 0x590, Sun Studio 12[m
[31m-[m
[31m-if [ "$ngx_sunc_ver" -ge 1424 ]; then[m
[31m-    ngx_sparc32="-m32"[m
[31m-    ngx_sparc64="-m64"[m
[31m-    ngx_amd64="-m64"[m
[31m-[m
[31m-else[m
[31m-    ngx_sparc32="-xarch=v8plus"[m
[31m-    ngx_sparc64="-xarch=v9"[m
[31m-    ngx_amd64="-xarch=amd64"[m
[31m-fi[m
[31m-[m
[31m-case "$NGX_MACHINE" in[m
[31m-[m
[31m-    i86pc)[m
[31m-        NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"[m
[31m-    ;;[m
[31m-[m
[31m-    sun4u | sun4v)[m
[31m-        NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-MAIN_LINK=[m
[31m-MODULE_LINK="-G"[m
[31m-[m
[31m-[m
[31m-# optimizations[m
[31m-[m
[31m-# 20736 == 0x5100, Sun Studio 12.1[m
[31m-[m
[31m-if [ "$ngx_sunc_ver" -ge 20736 ]; then[m
[31m-    ngx_fast="-fast"[m
[31m-[m
[31m-else[m
[31m-    # older versions had problems with bit-fields[m
[31m-    ngx_fast="-fast -xalias_level=any"[m
[31m-fi[m
[31m-[m
[31m-IPO=-xipo[m
[31m-CFLAGS="$CFLAGS $ngx_fast $IPO"[m
[31m-CORE_LINK="$CORE_LINK $ngx_fast $IPO"[m
[31m-[m
[31m-[m
[31m-case $CPU in[m
[31m-    pentium)[m
[31m-        # optimize for Pentium and Athlon[m
[31m-        CPU_OPT="-xchip=pentium"[m
[31m-    ;;[m
[31m-[m
[31m-    pentiumpro)[m
[31m-        # optimize for Pentium Pro, Pentium II[m
[31m-        CPU_OPT="-xchip=pentium_pro"[m
[31m-    ;;[m
[31m-[m
[31m-    pentium3)[m
[31m-        # optimize for Pentium III[m
[31m-        CPU_OPT="-xchip=pentium3"[m
[31m-        #CPU_OPT="$CPU_OPT -xarch=sse"[m
[31m-        CPU_OPT="$CPU_OPT -xcache=16/32/4:256/32/4"[m
[31m-    ;;[m
[31m-[m
[31m-    pentium4)[m
[31m-        # optimize for Pentium 4[m
[31m-        CPU_OPT="-xchip=pentium4"[m
[31m-        #CPU_OPT="$CPU_OPT -xarch=sse2"[m
[31m-        CPU_OPT="$CPU_OPT -xcache=8/64/4:256/128/8"[m
[31m-    ;;[m
[31m-[m
[31m-    opteron)[m
[31m-        # optimize for Opteron[m
[31m-        CPU_OPT="-xchip=opteron"[m
[31m-        #CPU_OPT="$CPU_OPT -xarch=sse2"[m
[31m-        CPU_OPT="$CPU_OPT -xcache=64/64/2:1024/64/16"[m
[31m-    ;;[m
[31m-[m
[31m-    sparc32)[m
[31m-        # build 32-bit UltraSparc binary[m
[31m-        CPU_OPT="$ngx_sparc32"[m
[31m-        CORE_LINK="$CORE_LINK $ngx_sparc32"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_sparc32"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sparc64)[m
[31m-        # build 64-bit UltraSparc binary[m
[31m-        CPU_OPT="$ngx_sparc64"[m
[31m-        CORE_LINK="$CORE_LINK $ngx_sparc64"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_sparc64"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    amd64)[m
[31m-        # build 64-bit amd64 binary[m
[31m-        CPU_OPT="$ngx_amd64"[m
[31m-        CORE_LINK="$CORE_LINK $ngx_amd64"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_amd64"[m
[31m-        NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"[m
[31m-        NGX_CPU_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-CFLAGS="$CFLAGS $CPU_OPT"[m
[31m-[m
[31m-[m
[31m-if [ ".$PCRE_OPT" = "." ]; then[m
[31m-    PCRE_OPT="$ngx_fast $IPO $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$MD5_OPT" = "." ]; then[m
[31m-    MD5_OPT="$ngx_fast $IPO $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-if [ ".$ZLIB_OPT" = "." ]; then[m
[31m-    ZLIB_OPT="$ngx_fast $IPO $CPU_OPT"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# stop on warning[m
[31m-CFLAGS="$CFLAGS -errwarn=%all"[m
[31m-[m
[31m-# debug[m
[31m-CFLAGS="$CFLAGS -g"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/define b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/define[m
[1mdeleted file mode 100644[m
[1mindex b5a7622..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/define[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $have[m
[31m-#define $have  $value[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/endianness b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/endianness[m
[1mdeleted file mode 100644[m
[1mindex 70b0a10..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/endianness[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for system byte ordering ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for system byte ordering[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-int main() {[m
[31m-    int i = 0x11223344;[m
[31m-    char *p;[m
[31m-[m
[31m-    p = (char *) &i;[m
[31m-    if (*p == 0x44) return 0;[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \[m
[31m-          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"[m
[31m-[m
[31m-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    if $NGX_AUTOTEST >/dev/null 2>&1; then[m
[31m-        echo " little endian"[m
[31m-        have=NGX_HAVE_LITTLE_ENDIAN . auto/have[m
[31m-    else[m
[31m-        echo " big endian"[m
[31m-    fi[m
[31m-[m
[31m-    rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-else[m
[31m-    rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-    echo[m
[31m-    echo "$0: error: cannot detect system byte ordering"[m
[31m-    exit 1[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/feature b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/feature[m
[1mdeleted file mode 100644[m
[1mindex 1145f28..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/feature[m
[1m+++ /dev/null[m
[36m@@ -1,123 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_feature ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_feature[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_found=no[m
[31m-[m
[31m-if test -n "$ngx_feature_name"; then[m
[31m-    ngx_have_feature=`echo $ngx_feature_name \[m
[31m-                   | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`[m
[31m-fi[m
[31m-[m
[31m-if test -n "$ngx_feature_path"; then[m
[31m-    for ngx_temp in $ngx_feature_path; do[m
[31m-        ngx_feature_inc_path="$ngx_feature_inc_path -I $ngx_temp"[m
[31m-    done[m
[31m-fi[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-$NGX_INCLUDE_UNISTD_H[m
[31m-$ngx_feature_incs[m
[31m-[m
[31m-int main() {[m
[31m-    $ngx_feature_test;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \[m
[31m-          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_TEST_LD_OPT $ngx_feature_libs"[m
[31m-[m
[31m-ngx_feature_inc_path=[m
[31m-[m
[31m-eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-[m
[31m-    case "$ngx_feature_run" in[m
[31m-[m
[31m-        yes)[m
[31m-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages[m
[31m-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then[m
[31m-                echo " found"[m
[31m-                ngx_found=yes[m
[31m-[m
[31m-                if test -n "$ngx_feature_name"; then[m
[31m-                    have=$ngx_have_feature . auto/have[m
[31m-                fi[m
[31m-[m
[31m-            else[m
[31m-                echo " found but is not working"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        value)[m
[31m-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages[m
[31m-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then[m
[31m-                echo " found"[m
[31m-                ngx_found=yes[m
[31m-[m
[31m-                cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $ngx_feature_name[m
[31m-#define $ngx_feature_name  `$NGX_AUTOTEST`[m
[31m-#endif[m
[31m-[m
[31m-END[m
[31m-            else[m
[31m-                echo " found but is not working"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        bug)[m
[31m-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages[m
[31m-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then[m
[31m-                echo " not found"[m
[31m-[m
[31m-            else[m
[31m-                echo " found"[m
[31m-                ngx_found=yes[m
[31m-[m
[31m-                if test -n "$ngx_feature_name"; then[m
[31m-                    have=$ngx_have_feature . auto/have[m
[31m-                fi[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            echo " found"[m
[31m-            ngx_found=yes[m
[31m-[m
[31m-            if test -n "$ngx_feature_name"; then[m
[31m-                have=$ngx_have_feature . auto/have[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-    echo " not found"[m
[31m-[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    echo $ngx_test       >> $NGX_AUTOCONF_ERR[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/have b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/have[m
[1mdeleted file mode 100644[m
[1mindex f8e3751..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/have[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $have[m
[31m-#define $have  1[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/have_headers b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/have_headers[m
[1mdeleted file mode 100644[m
[1mindex a3a7543..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/have_headers[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_HEADERS_H[m
[31m-[m
[31m-#ifndef $have[m
[31m-#define $have  1[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/headers b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/headers[m
[1mdeleted file mode 100644[m
[1mindex 5a2e6b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/headers[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-ngx_include="unistd.h";      . auto/include[m
[31m-ngx_include="inttypes.h";    . auto/include[m
[31m-ngx_include="limits.h";      . auto/include[m
[31m-ngx_include="sys/filio.h";   . auto/include[m
[31m-ngx_include="sys/param.h";   . auto/include[m
[31m-ngx_include="sys/mount.h";   . auto/include[m
[31m-ngx_include="sys/statvfs.h"; . auto/include[m
[31m-ngx_include="crypt.h";       . auto/include[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/include b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/include[m
[1mdeleted file mode 100644[m
[1mindex e34dabd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/include[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_include ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_include[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_found=no[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-$NGX_INCLUDE_SYS_PARAM_H[m
[31m-#include <$ngx_include>[m
[31m-[m
[31m-int main() {[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c"[m
[31m-[m
[31m-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-[m
[31m-    ngx_found=yes[m
[31m-[m
[31m-    echo " found"[m
[31m-[m
[31m-    ngx_name=`echo $ngx_include \[m
[31m-              | tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__`[m
[31m-[m
[31m-[m
[31m-    have=NGX_HAVE_$ngx_name . auto/have_headers[m
[31m-[m
[31m-    eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"[m
[31m-[m
[31m-    #STUB[m
[31m-    eval "NGX_$ngx_name='#include <$ngx_include>'"[m
[31m-[m
[31m-else[m
[31m-    echo " not found"[m
[31m-[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    echo $ngx_test       >> $NGX_AUTOCONF_ERR[m
[31m-    echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/init b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/init[m
[1mdeleted file mode 100644[m
[1mindex 910f529..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/init[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-NGX_MAKEFILE=$NGX_OBJS/Makefile[m
[31m-NGX_MODULES_C=$NGX_OBJS/ngx_modules.c[m
[31m-[m
[31m-NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h[m
[31m-NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h[m
[31m-[m
[31m-NGX_AUTOTEST=$NGX_OBJS/autotest[m
[31m-NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err[m
[31m-[m
[31m-# STUBs[m
[31m-NGX_ERR=$NGX_OBJS/autoconf.err[m
[31m-MAKEFILE=$NGX_OBJS/Makefile[m
[31m-[m
[31m-[m
[31m-NGX_PCH=[m
[31m-NGX_USE_PCH=[m
[31m-[m
[31m-[m
[31m-# check the echo's "-n" option and "\c" capability[m
[31m-[m
[31m-if echo "test\c" | grep c >/dev/null; then[m
[31m-[m
[31m-    if echo -n test | grep n >/dev/null; then[m
[31m-        ngx_n=[m
[31m-        ngx_c=[m
[31m-[m
[31m-    else[m
[31m-        ngx_n=-n[m
[31m-        ngx_c=[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-    ngx_n=[m
[31m-    ngx_c='\c'[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# create Makefile[m
[31m-[m
[31m-cat << END > Makefile[m
[31m-[m
[31m-default:	build[m
[31m-[m
[31m-clean:[m
[31m-	rm -rf Makefile $NGX_OBJS[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/install b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/install[m
[1mdeleted file mode 100644[m
[1mindex c502767..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/install[m
[1m+++ /dev/null[m
[36m@@ -1,285 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $USE_PERL != NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-install_perl_modules:[m
[31m-	cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install[m
[31m-END[m
[31m-[m
[31m-    NGX_INSTALL_PERL_MODULES=install_perl_modules[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case ".$NGX_STAP_NGX_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    .)[m
[31m-        NGX_STAP_NGX_PATH=$NGX_PREFIX/sbin/stap-nginx[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_STAP_NGX_PATH=$NGX_PREFIX/$NGX_STAP_NGX_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_SBIN_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_SBIN_PATH=$NGX_PREFIX/$NGX_SBIN_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_MODULES_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_MODULES_PATH=$NGX_PREFIX/$NGX_MODULES_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-NGX_MODULES_PATH=`dirname $NGX_MODULES_PATH/.`[m
[31m-[m
[31m-[m
[31m-case ".$NGX_CONF_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_CONF_PATH=$NGX_PREFIX/$NGX_CONF_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`[m
[31m-[m
[31m-[m
[31m-case ".$NGX_PID_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_PID_PATH=$NGX_PREFIX/$NGX_PID_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_TAPSET_PREFIX" in[m
[31m-    ./* | .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_TAPSET_PREFIX=$NGX_PREFIX/$NGX_TAPSET_PREFIX[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_ERROR_LOG_PATH" in[m
[31m-    ./* | .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_ERROR_LOG_PATH=$NGX_PREFIX/$NGX_ERROR_LOG_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_HTTP_LOG_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_HTTP_LOG_PATH=$NGX_PREFIX/$NGX_HTTP_LOG_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if test -f man/nginx.8 ; then[m
[31m-    NGX_MAN=man/nginx.8[m
[31m-else[m
[31m-    NGX_MAN=docs/man/nginx.8[m
[31m-fi[m
[31m-[m
[31m-if test -d html ; then[m
[31m-    NGX_HTML=html[m
[31m-else[m
[31m-    NGX_HTML=docs/html[m
[31m-fi[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-manpage:	$NGX_OBJS/nginx.8[m
[31m-[m
[31m-$NGX_OBJS/nginx.8:	$NGX_MAN $NGX_AUTO_CONFIG_H[m
[31m-	sed -e "s|%%PREFIX%%|$NGX_PREFIX|" \\[m
[31m-		-e "s|%%PID_PATH%%|$NGX_PID_PATH|" \\[m
[31m-		-e "s|%%CONF_PATH%%|$NGX_CONF_PATH|" \\[m
[31m-		-e "s|%%ERROR_LOG_PATH%%|${NGX_ERROR_LOG_PATH:-stderr}|" \\[m
[31m-		< $NGX_MAN > \$@[m
[31m-[m
[31m-install:	build $NGX_INSTALL_PERL_MODULES[m
[31m-	test -d '\$(DESTDIR)$NGX_PREFIX' || mkdir -p '\$(DESTDIR)$NGX_PREFIX'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`'[m
[31m-	test ! -f '\$(DESTDIR)$NGX_SBIN_PATH' \\[m
[31m-		|| mv '\$(DESTDIR)$NGX_SBIN_PATH' \\[m
[31m-			'\$(DESTDIR)$NGX_SBIN_PATH.old'[m
[31m-	cp $NGX_OBJS/nginx '\$(DESTDIR)$NGX_SBIN_PATH'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_CONF_PREFIX' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-[m
[31m-	cp conf/koi-win '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/koi-utf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/win-utf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types' \\[m
[31m-		|| cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params' \\[m
[31m-		|| cp conf/fastcgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/fastcgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf' \\[m
[31m-		|| cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params' \\[m
[31m-		|| cp conf/uwsgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/uwsgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params' \\[m
[31m-		|| cp conf/scgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/scgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PATH' \\[m
[31m-		|| cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PATH'[m
[31m-	cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PREFIX/nginx.conf.default'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_PID_PATH"`'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_PREFIX/html' \\[m
[31m-		|| cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX'[m
[31m-END[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES -a $DTRACE_FROM_SYSTEMTAP = YES ]; then[m
[31m-[m
[31m-    ngx_tapset_srcs="$NGX_TAPSET_SRCS"[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-	test -d '\$(DESTDIR)$NGX_TAPSET_PREFIX' || \[m
[31m-		mkdir -p '\$(DESTDIR)$NGX_TAPSET_PREFIX'[m
[31m-END[m
[31m-[m
[31m-    for ngx_tapset_src in $ngx_tapset_srcs[m
[31m-    do[m
[31m-        ngx_tapset_file=`basename $ngx_tapset_src`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-	sed -e "s|NGX_SBIN_PATH|$NGX_SBIN_PATH|g" $ngx_long_cont \[m
[31m-                $ngx_tapset_src > '\$(DESTDIR)$NGX_TAPSET_PREFIX/$ngx_tapset_file'[m
[31m-END[m
[31m-[m
[31m-    done[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_STAP_NGX_PATH"`' || \[m
[31m-		mkdir -p '\$(DESTDIR)`dirname "$NGX_STAP_NGX_PATH"`'[m
[31m-	cp $NGX_OBJS/stap-nginx '\$(DESTDIR)$NGX_STAP_NGX_PATH'[m
[31m-	chmod 0755 '\$(DESTDIR)$NGX_STAP_NGX_PATH'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-if test -n "$NGX_ERROR_LOG_PATH"; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if test -n "$DYNAMIC_MODULES"; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_MODULES_PATH' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)$NGX_MODULES_PATH'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-for ngx_module in $DYNAMIC_MODULES[m
[31m-do[m
[31m-    ngx_module=$ngx_module$ngx_modext[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test ! -f '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\[m
[31m-		|| mv '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\[m
[31m-			'\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module.old'[m
[31m-	cp $NGX_OBJS/$ngx_module '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module'[m
[31m-END[m
[31m-[m
[31m-done[m
[31m-[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$NGX_OBJS${ngx_dirsep}stap-nginx: src/dtrace/stap-nginx[m
[31m-	sed -e "s|NGX_TAPSET_PREFIX|$NGX_TAPSET_PREFIX|g" $ngx_long_cont \[m
[31m-            -e "s|NGX_SBIN_DIR|`dirname $NGX_SBIN_PATH`|g" $ngx_long_cont \[m
[31m-            -e "s|NGX_SBIN_PATH|$NGX_SBIN_PATH|g" $ngx_long_cont \[m
[31m-            src/dtrace/stap-nginx > $NGX_OBJS${ngx_dirsep}stap-nginx[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# create Makefile[m
[31m-[m
[31m-cat << END >> Makefile[m
[31m-[m
[31m-build:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE[m
[31m-[m
[31m-install:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE install[m
[31m-[m
[31m-modules:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE modules[m
[31m-[m
[31m-upgrade:[m
[31m-	$NGX_SBIN_PATH -t[m
[31m-[m
[31m-	kill -USR2 \`cat $NGX_PID_PATH\`[m
[31m-	sleep 1[m
[31m-	test -f $NGX_PID_PATH.oldbin[m
[31m-[m
[31m-	kill -QUIT \`cat $NGX_PID_PATH.oldbin\`[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/install.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/install.orig[m
[1mdeleted file mode 100644[m
[1mindex d884487..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/install.orig[m
[1m+++ /dev/null[m
[36m@@ -1,218 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $USE_PERL != NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-install_perl_modules:[m
[31m-	cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install[m
[31m-END[m
[31m-[m
[31m-    NGX_INSTALL_PERL_MODULES=install_perl_modules[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case ".$NGX_SBIN_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_SBIN_PATH=$NGX_PREFIX/$NGX_SBIN_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_MODULES_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_MODULES_PATH=$NGX_PREFIX/$NGX_MODULES_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-NGX_MODULES_PATH=`dirname $NGX_MODULES_PATH/.`[m
[31m-[m
[31m-[m
[31m-case ".$NGX_CONF_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_CONF_PATH=$NGX_PREFIX/$NGX_CONF_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`[m
[31m-[m
[31m-[m
[31m-case ".$NGX_PID_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_PID_PATH=$NGX_PREFIX/$NGX_PID_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_ERROR_LOG_PATH" in[m
[31m-    ./* | .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_ERROR_LOG_PATH=$NGX_PREFIX/$NGX_ERROR_LOG_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case ".$NGX_HTTP_LOG_PATH" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_HTTP_LOG_PATH=$NGX_PREFIX/$NGX_HTTP_LOG_PATH[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if test -f man/nginx.8 ; then[m
[31m-    NGX_MAN=man/nginx.8[m
[31m-else[m
[31m-    NGX_MAN=docs/man/nginx.8[m
[31m-fi[m
[31m-[m
[31m-if test -d html ; then[m
[31m-    NGX_HTML=html[m
[31m-else[m
[31m-    NGX_HTML=docs/html[m
[31m-fi[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-manpage:	$NGX_OBJS/nginx.8[m
[31m-[m
[31m-$NGX_OBJS/nginx.8:	$NGX_MAN $NGX_AUTO_CONFIG_H[m
[31m-	sed -e "s|%%PREFIX%%|$NGX_PREFIX|" \\[m
[31m-		-e "s|%%PID_PATH%%|$NGX_PID_PATH|" \\[m
[31m-		-e "s|%%CONF_PATH%%|$NGX_CONF_PATH|" \\[m
[31m-		-e "s|%%ERROR_LOG_PATH%%|${NGX_ERROR_LOG_PATH:-stderr}|" \\[m
[31m-		< $NGX_MAN > \$@[m
[31m-[m
[31m-install:	build $NGX_INSTALL_PERL_MODULES[m
[31m-	test -d '\$(DESTDIR)$NGX_PREFIX' || mkdir -p '\$(DESTDIR)$NGX_PREFIX'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`'[m
[31m-	test ! -f '\$(DESTDIR)$NGX_SBIN_PATH' \\[m
[31m-		|| mv '\$(DESTDIR)$NGX_SBIN_PATH' \\[m
[31m-			'\$(DESTDIR)$NGX_SBIN_PATH.old'[m
[31m-	cp $NGX_OBJS/nginx '\$(DESTDIR)$NGX_SBIN_PATH'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_CONF_PREFIX' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-[m
[31m-	cp conf/koi-win '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/koi-utf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/win-utf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types' \\[m
[31m-		|| cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params' \\[m
[31m-		|| cp conf/fastcgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/fastcgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf' \\[m
[31m-		|| cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params' \\[m
[31m-		|| cp conf/uwsgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/uwsgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params' \\[m
[31m-		|| cp conf/scgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'[m
[31m-	cp conf/scgi_params \\[m
[31m-		'\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params.default'[m
[31m-[m
[31m-	test -f '\$(DESTDIR)$NGX_CONF_PATH' \\[m
[31m-		|| cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PATH'[m
[31m-	cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PREFIX/nginx.conf.default'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_PID_PATH"`'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`'[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_PREFIX/html' \\[m
[31m-		|| cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX'[m
[31m-END[m
[31m-[m
[31m-[m
[31m-if test -n "$NGX_ERROR_LOG_PATH"; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if test -n "$DYNAMIC_MODULES"; then[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test -d '\$(DESTDIR)$NGX_MODULES_PATH' \\[m
[31m-		|| mkdir -p '\$(DESTDIR)$NGX_MODULES_PATH'[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-for ngx_module in $DYNAMIC_MODULES[m
[31m-do[m
[31m-    ngx_module=$ngx_module$ngx_modext[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-	test ! -f '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\[m
[31m-		|| mv '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\[m
[31m-			'\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module.old'[m
[31m-	cp $NGX_OBJS/$ngx_module '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module'[m
[31m-END[m
[31m-[m
[31m-done[m
[31m-[m
[31m-[m
[31m-# create Makefile[m
[31m-[m
[31m-cat << END >> Makefile[m
[31m-[m
[31m-build:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE[m
[31m-[m
[31m-install:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE install[m
[31m-[m
[31m-modules:[m
[31m-	\$(MAKE) -f $NGX_MAKEFILE modules[m
[31m-[m
[31m-upgrade:[m
[31m-	$NGX_SBIN_PATH -t[m
[31m-[m
[31m-	kill -USR2 \`cat $NGX_PID_PATH\`[m
[31m-	sleep 1[m
[31m-	test -f $NGX_PID_PATH.oldbin[m
[31m-[m
[31m-	kill -QUIT \`cat $NGX_PID_PATH.oldbin\`[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/conf[m
[1mdeleted file mode 100644[m
[1mindex a6242e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/conf[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $USE_PCRE = YES -o $PCRE != NONE ]; then[m
[31m-    . auto/lib/pcre/conf[m
[31m-[m
[31m-else[m
[31m-    if [ $USE_PCRE = DISABLED -a $HTTP_REWRITE = YES ]; then[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP rewrite module requires the PCRE library.[m
[31m-You can either disable the module by using --without-http_rewrite_module[m
[31m-option or you have to enable the PCRE support.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $USE_OPENSSL = YES ]; then[m
[31m-    . auto/lib/openssl/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_MD5 = YES ]; then[m
[31m-[m
[31m-    if [ $USE_OPENSSL = YES ]; then[m
[31m-        have=NGX_HAVE_OPENSSL_MD5_H . auto/have[m
[31m-        have=NGX_OPENSSL_MD5 . auto/have[m
[31m-        have=NGX_HAVE_MD5 . auto/have[m
[31m-        MD5=YES[m
[31m-        MD5_LIB=OpenSSL[m
[31m-[m
[31m-    else[m
[31m-        . auto/lib/md5/conf[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_SHA1 = YES ]; then[m
[31m-[m
[31m-    if [ $USE_OPENSSL = YES ]; then[m
[31m-        have=NGX_HAVE_OPENSSL_SHA1_H . auto/have[m
[31m-        have=NGX_HAVE_SHA1 . auto/have[m
[31m-        SHA1=YES[m
[31m-        SHA1_LIB=OpenSSL[m
[31m-[m
[31m-    else[m
[31m-        . auto/lib/sha1/conf[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_ZLIB = YES ]; then[m
[31m-    . auto/lib/zlib/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_LIBXSLT != NO ]; then[m
[31m-    . auto/lib/libxslt/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_LIBGD != NO ]; then[m
[31m-    . auto/lib/libgd/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_PERL != NO ]; then[m
[31m-    . auto/lib/perl/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_GEOIP != NO ]; then[m
[31m-    . auto/lib/geoip/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then[m
[31m-    . auto/lib/google-perftools/conf[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_LIBATOMIC != NO ]; then[m
[31m-    . auto/lib/libatomic/conf[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/geoip/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/geoip/conf[m
[1mdeleted file mode 100644[m
[1mindex ebd2e15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/geoip/conf[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    ngx_feature="GeoIP library"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <GeoIP.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-lGeoIP"[m
[31m-    ngx_feature_test="GeoIP_open(NULL, 0)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="GeoIP library in /usr/local/"[m
[31m-    ngx_feature_path="/usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lGeoIP"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lGeoIP"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # NetBSD port[m
[31m-[m
[31m-    ngx_feature="GeoIP library in /usr/pkg/"[m
[31m-    ngx_feature_path="/usr/pkg/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lGeoIP"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/pkg/lib -lGeoIP"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="GeoIP library in /opt/local/"[m
[31m-    ngx_feature_path="/opt/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lGeoIP"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lGeoIP"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-[m
[31m-    if [ $USE_GEOIP = YES ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_GEOIP=$ngx_feature_libs[m
[31m-[m
[31m-    if [ $NGX_IPV6 = YES ]; then[m
[31m-        ngx_feature="GeoIP IPv6 support"[m
[31m-        ngx_feature_name="NGX_HAVE_GEOIP_V6"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <stdio.h>[m
[31m-                          #include <GeoIP.h>"[m
[31m-        #ngx_feature_path=[m
[31m-        #ngx_feature_libs=[m
[31m-        ngx_feature_test="printf(\"%d\", GEOIP_CITY_EDITION_REV0_V6);"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the GeoIP module requires the GeoIP library.[m
[31m-You can either do not enable the module or install the library.[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/google-perftools/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/google-perftools/conf[m
[1mdeleted file mode 100644[m
[1mindex 5d5ddae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/google-perftools/conf[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    ngx_feature="Google perftools"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-lprofiler"[m
[31m-    ngx_feature_test="ProfilerStop()"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="Google perftools in /usr/local/"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lprofiler"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lprofiler"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="Google perftools in /opt/local/"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lprofiler"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lprofiler"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-[m
[31m-else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the Google perftools module requires the Google perftools[m
[31m-library. You can either do not enable the module or install the library.[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libatomic/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libatomic/conf[m
[1mdeleted file mode 100644[m
[1mindex d1e484a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libatomic/conf[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $NGX_LIBATOMIC != YES ]; then[m
[31m-[m
[31m-    have=NGX_HAVE_LIBATOMIC . auto/have[m
[31m-    CORE_INCS="$CORE_INCS $NGX_LIBATOMIC/src"[m
[31m-    LINK_DEPS="$LINK_DEPS $NGX_LIBATOMIC/src/libatomic_ops.a"[m
[31m-    CORE_LIBS="$CORE_LIBS $NGX_LIBATOMIC/src/libatomic_ops.a"[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    ngx_feature="atomic_ops library"[m
[31m-    ngx_feature_name=NGX_HAVE_LIBATOMIC[m
[31m-    ngx_feature_run=yes[m
[31m-    ngx_feature_incs="#define AO_REQUIRE_CAS[m
[31m-                      #include <atomic_ops.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-latomic_ops"[m
[31m-    ngx_feature_test="long  n = 0;[m
[31m-                      if (!AO_compare_and_swap(&n, 0, 1))[m
[31m-                          return 1;[m
[31m-                      if (AO_fetch_and_add(&n, 1) != 1)[m
[31m-                          return 1;[m
[31m-                      if (n != 2)[m
[31m-                          return 1;[m
[31m-                      AO_nop();"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-    else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: libatomic_ops library was not found.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libatomic/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libatomic/make[m
[1mdeleted file mode 100644[m
[1mindex c90318e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libatomic/make[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$NGX_LIBATOMIC/src/libatomic_ops.a:	$NGX_LIBATOMIC/Makefile[m
[31m-	cd $NGX_LIBATOMIC && \$(MAKE)[m
[31m-[m
[31m-$NGX_LIBATOMIC/Makefile:	$NGX_MAKEFILE[m
[31m-	cd $NGX_LIBATOMIC \\[m
[31m-	&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\[m
[31m-	&& ./configure[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libgd/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libgd/conf[m
[1mdeleted file mode 100644[m
[1mindex 6e4e91c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libgd/conf[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    ngx_feature="GD library"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <gd.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs="-lgd"[m
[31m-    ngx_feature_test="gdImagePtr img = gdImageCreateFromGifPtr(1, NULL);"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="GD library in /usr/local/"[m
[31m-    ngx_feature_path="/usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lgd"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lgd"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # NetBSD port[m
[31m-[m
[31m-    ngx_feature="GD library in /usr/pkg/"[m
[31m-    ngx_feature_path="/usr/pkg/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lgd"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/pkg/lib -lgd"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="GD library in /opt/local/"[m
[31m-    ngx_feature_path="/opt/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lgd"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lgd"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-[m
[31m-    if [ $USE_LIBGD = YES ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_LIBGD=$ngx_feature_libs[m
[31m-[m
[31m-else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP image filter module requires the GD library.[m
[31m-You can either do not enable the module or install the libraries.[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libxslt/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libxslt/conf[m
[1mdeleted file mode 100644[m
[1mindex 3a0f37b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/libxslt/conf[m
[1m+++ /dev/null[m
[36m@@ -1,165 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-    ngx_feature="libxslt"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <libxml/parser.h>[m
[31m-                      #include <libxml/tree.h>[m
[31m-                      #include <libxslt/xslt.h>[m
[31m-                      #include <libxslt/xsltInternals.h>[m
[31m-                      #include <libxslt/transform.h>[m
[31m-                      #include <libxslt/xsltutils.h>"[m
[31m-    ngx_feature_path="/usr/include/libxml2"[m
[31m-    ngx_feature_libs="-lxml2 -lxslt"[m
[31m-    ngx_feature_test="xmlParserCtxtPtr    ctxt = NULL;[m
[31m-                      xsltStylesheetPtr   sheet = NULL;[m
[31m-                      xmlDocPtr           doc;[m
[31m-                      doc = xmlParseChunk(ctxt, NULL, 0, 0);[m
[31m-                      xsltApplyStylesheet(sheet, doc, NULL);"[m
[31m-    . auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="libxslt in /usr/local/"[m
[31m-    ngx_feature_path="/usr/local/include/libxml2 /usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lxml2 -lxslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lxml2 -lxslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # NetBSD port[m
[31m-[m
[31m-    ngx_feature="libxslt in /usr/pkg/"[m
[31m-    ngx_feature_path="/usr/pkg/include/libxml2 /usr/pkg/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lxml2 -lxslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/pkg/lib -lxml2 -lxslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="libxslt in /opt/local/"[m
[31m-    ngx_feature_path="/opt/local/include/libxml2 /opt/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lxml2 -lxslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lxml2 -lxslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-[m
[31m-    if [ $USE_LIBXSLT = YES ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_LIBXSLT=$ngx_feature_libs[m
[31m-[m
[31m-else[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP XSLT module requires the libxml2/libxslt[m
[31m-libraries. You can either do not enable the module or install the libraries.[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-    ngx_feature="libexslt"[m
[31m-    ngx_feature_name=NGX_HAVE_EXSLT[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <libexslt/exslt.h>"[m
[31m-    ngx_feature_path="/usr/include/libxml2"[m
[31m-    ngx_feature_libs="-lexslt"[m
[31m-    ngx_feature_test="exsltRegisterAll();"[m
[31m-    . auto/feature[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # FreeBSD port[m
[31m-[m
[31m-    ngx_feature="libexslt in /usr/local/"[m
[31m-    ngx_feature_path="/usr/local/include/libxml2 /usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lexslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/local/lib -lexslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # NetBSD port[m
[31m-[m
[31m-    ngx_feature="libexslt in /usr/pkg/"[m
[31m-    ngx_feature_path="/usr/pkg/include/libxml2 /usr/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lexslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/usr/pkg/lib -lexslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # MacPorts[m
[31m-[m
[31m-    ngx_feature="libexslt in /opt/local/"[m
[31m-    ngx_feature_path="/opt/local/include/libxml2 /opt/local/include"[m
[31m-[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lexslt"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L/opt/local/lib -lexslt"[m
[31m-    fi[m
[31m-[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    if [ $USE_LIBXSLT = YES ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -lexslt"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_LIBXSLT="$NGX_LIB_LIBXSLT -lexslt"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/make[m
[1mdeleted file mode 100644[m
[1mindex 6298b94..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/make[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $PCRE != NONE -a $PCRE != NO -a $PCRE != YES ]; then[m
[31m-    . auto/lib/pcre/make[m
[31m-fi[m
[31m-[m
[31m-if [ $MD5 != NONE -a $MD5 != NO -a $MD5 != YES ]; then[m
[31m-    . auto/lib/md5/make[m
[31m-fi[m
[31m-[m
[31m-if [ $SHA1 != NONE -a $SHA1 != NO -a $SHA1 != YES ]; then[m
[31m-    . auto/lib/sha1/make[m
[31m-fi[m
[31m-[m
[31m-if [ $OPENSSL != NONE -a $OPENSSL != NO -a $OPENSSL != YES ]; then[m
[31m-    . auto/lib/openssl/make[m
[31m-fi[m
[31m-[m
[31m-if [ $ZLIB != NONE -a $ZLIB != NO -a $ZLIB != YES ]; then[m
[31m-    . auto/lib/zlib/make[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_LIBATOMIC != NO -a $NGX_LIBATOMIC != YES ]; then[m
[31m-    . auto/lib/libatomic/make[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_PERL != NO ]; then[m
[31m-    . auto/lib/perl/make[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/conf[m
[1mdeleted file mode 100644[m
[1mindex 49c0ddf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/conf[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $MD5 != NONE ]; then[m
[31m-[m
[31m-    if grep MD5_Init $MD5/md5.h 2>&1 >/dev/null; then[m
[31m-        # OpenSSL md5[m
[31m-        OPENSSL_MD5=YES[m
[31m-        have=NGX_HAVE_OPENSSL_MD5 . auto/have[m
[31m-        have=NGX_OPENSSL_MD5 . auto/have[m
[31m-    else[m
[31m-        # rsaref md5[m
[31m-        OPENSSL_MD5=NO[m
[31m-    fi[m
[31m-[m
[31m-    have=NGX_HAVE_MD5 . auto/have[m
[31m-    CORE_INCS="$CORE_INCS $MD5"[m
[31m-[m
[31m-    case "$NGX_CC_NAME" in[m
[31m-[m
[31m-        msvc | owc | bcc)[m
[31m-            LINK_DEPS="$LINK_DEPS $MD5/md5.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $MD5/md5.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            LINK_DEPS="$LINK_DEPS $MD5/libmd5.a"[m
[31m-[m
[31m-            # to allow -ipo optimization we link with the *.o but not library[m
[31m-            CORE_LIBS="$CORE_LIBS $MD5/md5_dgst.o"[m
[31m-[m
[31m-            if [ $MD5_ASM = YES ]; then[m
[31m-                CORE_LIBS="$CORE_LIBS $MD5/asm/mx86-elf.o"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            LINK_DEPS="$LINK_DEPS $MD5/libmd5.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $MD5/libmd5.a"[m
[31m-            #CORE_LIBS="$CORE_LIBS -L $MD5 -lmd5"[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-            MD5=NO[m
[31m-[m
[31m-            # FreeBSD, Solaris 10[m
[31m-[m
[31m-            ngx_feature="md5 in system md library"[m
[31m-            ngx_feature_name=NGX_HAVE_MD5[m
[31m-            ngx_feature_run=no[m
[31m-            ngx_feature_incs="#include <md5.h>"[m
[31m-            ngx_feature_path=[m
[31m-            ngx_feature_libs="-lmd"[m
[31m-            ngx_feature_test="MD5_CTX md5; MD5Init(&md5)"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            ngx_md5_lib="system md"[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # Solaris 8/9[m
[31m-[m
[31m-            ngx_feature="md5 in system md5 library"[m
[31m-            ngx_feature_libs="-lmd5"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            ngx_md5_lib="system md5"[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # OpenSSL crypto library[m
[31m-[m
[31m-            ngx_feature="md5 in system OpenSSL crypto library"[m
[31m-            ngx_feature_name="NGX_OPENSSL_MD5"[m
[31m-            ngx_feature_incs="#include <openssl/md5.h>"[m
[31m-            ngx_feature_libs="-lcrypto"[m
[31m-            ngx_feature_test="MD5_CTX md5; MD5_Init(&md5)"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            ngx_md5_lib="system crypto"[m
[31m-[m
[31m-            if [ $ngx_found = yes ]; then[m
[31m-                have=NGX_HAVE_OPENSSL_MD5_H . auto/have[m
[31m-                have=NGX_HAVE_MD5 . auto/have[m
[31m-            fi[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            MD5=YES[m
[31m-            MD5_LIB=$ngx_md5_lib[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/make[m
[1mdeleted file mode 100644[m
[1mindex 7000b20..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/make[m
[1m+++ /dev/null[m
[36m@@ -1,96 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    msvc)[m
[31m-        ngx_makefile=makefile.msvc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC MD5_ASM=$MD5_ASM"[m
[31m-        ngx_md5="MD5=\"$MD5\""[m
[31m-    ;;[m
[31m-[m
[31m-    owc)[m
[31m-        ngx_makefile=makefile.owc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_md5=`echo MD5=\"$MD5\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    bcc)[m
[31m-        ngx_makefile=makefile.bcc[m
[31m-        ngx_opt="-DCPU_OPT=\"$CPU_OPT\" -DMD5_ASM=$MD5_ASM"[m
[31m-        ngx_md5=`echo \-DMD5=\"$MD5\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-done=NO[m
[31m-[m
[31m-[m
[31m-case "$NGX_PLATFORM" in[m
[31m-[m
[31m-    win32)[m
[31m-        cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$MD5/md5.lib:	$NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/md5/$ngx_makefile $ngx_opt $ngx_md5[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        done=YES[m
[31m-    ;;[m
[31m-[m
[31m-    SunOS:*:i86pc)[m
[31m-        if [ $MD5_ASM = YES ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$MD5/libmd5.a:	$NGX_MAKEFILE[m
[31m-	cd $MD5 \\[m
[31m-	&& \$(MAKE) CFLAGS="$MD5_OPT -DSOL -DMD5_ASM -DL_ENDIAN" \\[m
[31m-		CC="\$(CC)" CPP="\$(CPP)" \\[m
[31m-		MD5_ASM_OBJ=asm/mx86-sol.o clean libmd5.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-            done=YES[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-    # FreeBSD: i386[m
[31m-    # Linux: i686[m
[31m-[m
[31m-    *:i386 | *:i686)[m
[31m-        if [ $MD5_ASM = YES ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$MD5/libmd5.a:	$NGX_MAKEFILE[m
[31m-	cd $MD5 \\[m
[31m-	&& \$(MAKE) CFLAGS="$MD5_OPT -DELF -DMD5_ASM -DL_ENDIAN" \\[m
[31m-		CC="\$(CC)" CPP="\$(CPP)" \\[m
[31m-		MD5_ASM_OBJ=asm/mx86-elf.o clean libmd5.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-            done=YES[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ $done = NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$MD5/libmd5.a:	$NGX_MAKEFILE[m
[31m-	cd $MD5 \\[m
[31m-	&& \$(MAKE) CFLAGS="$MD5_OPT" \\[m
[31m-		CC="\$(CC)" MD5_ASM_OBJ= clean libmd5.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex eb6fb62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -q -O2 -tWM $(CPU_OPT) -DL_ENDIAN[m
[31m-[m
[31m-!if "$(MD5_ASM)" == "YES"[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	bcc32 -c $(CFLAGS) -DMD5_ASM md5_dgst.c[m
[31m-	tlib md5.lib +md5_dgst.obj +"asm\m-win32.obj"[m
[31m-[m
[31m-!else[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	bcc32 -c $(CFLAGS) md5_dgst.c[m
[31m-	tlib md5.lib +md5_dgst.obj[m
[31m-[m
[31m-!endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex 90d62fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -D L_ENDIAN[m
[31m-[m
[31m-!IF "$(MD5_ASM)" == "YES"[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	cl -c $(CFLAGS) -D MD5_ASM md5_dgst.c[m
[31m-	link -lib -out:md5.lib md5_dgst.obj asm/m-win32.obj[m
[31m-[m
[31m-!ELSE[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	cl -c $(CFLAGS) md5_dgst.c[m
[31m-	link -lib -out:md5.lib md5_dgst.obj[m
[31m-[m
[31m-!ENDIF[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.owc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.owc[m
[1mdeleted file mode 100644[m
[1mindex 78c1e61..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/md5/makefile.owc[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -zq -bt=nt -bm -ot -op -oi -oe -s $(CPU_OPT)[m
[31m-[m
[31m-md5.lib:[m
[31m-	cd $(MD5)[m
[31m-	wcl386 -c $(CFLAGS) -dL_ENDIAN md5_dgst.c[m
[31m-	wlib -n md5.lib md5_dgst.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/conf[m
[1mdeleted file mode 100644[m
[1mindex 39d9602..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/conf[m
[1m+++ /dev/null[m
[36m@@ -1,127 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $OPENSSL != NONE ]; then[m
[31m-[m
[31m-    case "$CC" in[m
[31m-[m
[31m-        cl | bcc32)[m
[31m-            have=NGX_OPENSSL . auto/have[m
[31m-            have=NGX_SSL . auto/have[m
[31m-[m
[31m-            CFLAGS="$CFLAGS -DNO_SYS_TYPES_H"[m
[31m-[m
[31m-            CORE_INCS="$CORE_INCS $OPENSSL/openssl/include"[m
[31m-            CORE_DEPS="$CORE_DEPS $OPENSSL/openssl/include/openssl/ssl.h"[m
[31m-            CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib"[m
[31m-[m
[31m-            # libeay32.lib requires gdi32.lib[m
[31m-            CORE_LIBS="$CORE_LIBS gdi32.lib"[m
[31m-            # OpenSSL 1.0.0 requires crypt32.lib[m
[31m-            CORE_LIBS="$CORE_LIBS crypt32.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            have=NGX_OPENSSL . auto/have[m
[31m-            have=NGX_SSL . auto/have[m
[31m-[m
[31m-            CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"[m
[31m-            CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"[m
[31m-            CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $NGX_LIBDL"[m
[31m-[m
[31m-            if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-                CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32"[m
[31m-            fi[m
[31m-        ;;[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-        OPENSSL=NO[m
[31m-[m
[31m-        ngx_feature="OpenSSL library"[m
[31m-        ngx_feature_name="NGX_OPENSSL"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <openssl/ssl.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lssl -lcrypto $NGX_LIBDL"[m
[31m-        ngx_feature_test="SSL_CTX_set_options(NULL, 0)"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # FreeBSD port[m
[31m-[m
[31m-            ngx_feature="OpenSSL library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # NetBSD port[m
[31m-[m
[31m-            ngx_feature="OpenSSL library in /usr/pkg/"[m
[31m-            ngx_feature_path="/usr/pkg/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/pkg/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # MacPorts[m
[31m-[m
[31m-            ngx_feature="OpenSSL library in /opt/local/"[m
[31m-            ngx_feature_path="/opt/local/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/opt/local/lib -lssl -lcrypto $NGX_LIBDL"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            have=NGX_SSL . auto/have[m
[31m-            CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            OPENSSL=YES[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $OPENSSL != YES ]; then[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: SSL modules require the OpenSSL library.[m
[31m-You can either do not enable the modules, or install the OpenSSL library[m
[31m-into the system, or build the OpenSSL library statically from the source[m
[31m-with nginx by using --with-openssl=<path> option.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/make[m
[1mdeleted file mode 100644[m
[1mindex a6090c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/make[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$CC" in[m
[31m-[m
[31m-    cl)[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$OPENSSL/openssl/include/openssl/ssl.h:	$NGX_MAKEFILE[m
[31m-	\$(MAKE) -f auto/lib/openssl/makefile.msvc			\[m
[31m-		OPENSSL="$OPENSSL" OPENSSL_OPT="$OPENSSL_OPT"[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ;;[m
[31m-[m
[31m-    bcc32)[m
[31m-[m
[31m-        ngx_opt=`echo "-DOPENSSL=\"$OPENSSL\" -DOPENSSL_OPT=\"$OPENSSL_OPT\"" \[m
[31m-            | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$OPENSSL\\openssl\\lib\\libeay32.lib:				\[m
[31m-	$OPENSSL\\openssl\\include\\openssl\\ssl.h"			\[m
[31m-	| sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-`echo "$OPENSSL\\openssl\\lib\\ssleay32.lib:				\[m
[31m-	$OPENSSL\\openssl\\include\\openssl\\ssl.h"			\[m
[31m-	| sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-`echo "$OPENSSL\\openssl\\include\\openssl\\ssl.h:	$NGX_MAKEFILE"	\[m
[31m-	| sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/openssl/makefile.bcc $ngx_opt[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        case $OPENSSL in[m
[31m-            /*) ngx_prefix="$OPENSSL/.openssl" ;;[m
[31m-            *)  ngx_prefix="$PWD/$OPENSSL/.openssl" ;;[m
[31m-        esac[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$OPENSSL/.openssl/include/openssl/ssl.h:	$NGX_MAKEFILE[m
[31m-	cd $OPENSSL \\[m
[31m-	&& if [ -f Makefile ]; then \$(MAKE) clean; fi \\[m
[31m-	&& ./config --prefix=$ngx_prefix no-shared $OPENSSL_OPT \\[m
[31m-	&& \$(MAKE) \\[m
[31m-	&& \$(MAKE) install_sw LIBDIR=lib[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex 6a94ff7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-all:[m
[31m-	cd $(OPENSSL)[m
[31m-[m
[31m-	perl Configure BC-32 no-shared --prefix=openssl $(OPENSSL_OPT)[m
[31m-[m
[31m-	ms\do_nasm[m
[31m-[m
[31m-	$(MAKE) -f ms\bcb.mak[m
[31m-	$(MAKE) -f ms\bcb.mak install[m
[31m-[m
[31m-	# Borland's make does not expand "[ch]" in[m
[31m-	#    copy "inc32\openssl\*.[ch]" "openssl\include\openssl"[m
[31m-	copy inc32\openssl\*.h openssl\include\openssl[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex fc9e578..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/openssl/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-all:[m
[31m-	cd $(OPENSSL)[m
[31m-[m
[31m-	perl Configure VC-WIN32 no-shared --prefix=openssl $(OPENSSL_OPT)[m
[31m-[m
[31m-	ms\do_ms[m
[31m-[m
[31m-	$(MAKE) -f ms\nt.mak[m
[31m-	$(MAKE) -f ms\nt.mak install[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/conf[m
[1mdeleted file mode 100644[m
[1mindex 5e3960f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/conf[m
[1m+++ /dev/null[m
[36m@@ -1,203 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $PCRE != NONE ]; then[m
[31m-    CORE_INCS="$CORE_INCS $PCRE"[m
[31m-[m
[31m-    case "$NGX_CC_NAME" in[m
[31m-[m
[31m-        msvc | owc | bcc)[m
[31m-            have=NGX_PCRE . auto/have[m
[31m-            have=PCRE_STATIC . auto/have[m
[31m-            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"[m
[31m-            LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            have=NGX_PCRE . auto/have[m
[31m-            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"[m
[31m-[m
[31m-            LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"[m
[31m-[m
[31m-            echo $ngx_n "checking for PCRE library ...$ngx_c"[m
[31m-[m
[31m-            if [ -f $PCRE/pcre.h ]; then[m
[31m-                ngx_pcre_ver=`grep PCRE_MAJOR $PCRE/pcre.h \[m
[31m-                              | sed -e 's/^.*PCRE_MAJOR.* \(.*\)$/\1/'`[m
[31m-[m
[31m-            else if [ -f $PCRE/configure.in ]; then[m
[31m-                ngx_pcre_ver=`grep PCRE_MAJOR= $PCRE/configure.in \[m
[31m-                              | sed -e 's/^.*=\(.*\)$/\1/'`[m
[31m-[m
[31m-            else[m
[31m-                ngx_pcre_ver=`grep pcre_major, $PCRE/configure.ac \[m
[31m-                              | sed -e 's/^.*pcre_major,.*\[\(.*\)\].*$/\1/'`[m
[31m-            fi[m
[31m-            fi[m
[31m-[m
[31m-            echo " $ngx_pcre_ver major version found"[m
[31m-[m
[31m-            # to allow -ipo optimization we link with the *.o but not library[m
[31m-[m
[31m-            case "$ngx_pcre_ver" in[m
[31m-                4|5)[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre.o"[m
[31m-                ;;[m
[31m-[m
[31m-                6)[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_chartables.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_compile.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_exec.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_fullinfo.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_globals.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_tables.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_try_flipped.o"[m
[31m-                ;;[m
[31m-[m
[31m-                *)[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_chartables.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_compile.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_exec.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_fullinfo.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_globals.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_tables.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_try_flipped.o"[m
[31m-                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_newline.o"[m
[31m-                ;;[m
[31m-[m
[31m-            esac[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            have=NGX_PCRE . auto/have[m
[31m-[m
[31m-            if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-                have=PCRE_STATIC . auto/have[m
[31m-            fi[m
[31m-[m
[31m-            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"[m
[31m-            LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a"[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-[m
[31m-    if [ $PCRE_JIT = YES ]; then[m
[31m-        have=NGX_HAVE_PCRE_JIT . auto/have[m
[31m-        PCRE_CONF_OPT="$PCRE_CONF_OPT --enable-jit"[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-        PCRE=NO[m
[31m-[m
[31m-        ngx_feature="PCRE library"[m
[31m-        ngx_feature_name="NGX_PCRE"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <pcre.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lpcre"[m
[31m-        ngx_feature_test="pcre *re;[m
[31m-                          re = pcre_compile(NULL, 0, NULL, 0, NULL);[m
[31m-                          if (re == NULL) return 1"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # FreeBSD port[m
[31m-[m
[31m-            ngx_feature="PCRE library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpcre"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -lpcre"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # RedHat RPM, Solaris package[m
[31m-[m
[31m-            ngx_feature="PCRE library in /usr/include/pcre/"[m
[31m-            ngx_feature_path="/usr/include/pcre"[m
[31m-            ngx_feature_libs="-lpcre"[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # NetBSD port[m
[31m-[m
[31m-            ngx_feature="PCRE library in /usr/pkg/"[m
[31m-            ngx_feature_path="/usr/pkg/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lpcre"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/pkg/lib -lpcre"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # MacPorts[m
[31m-[m
[31m-            ngx_feature="PCRE library in /opt/local/"[m
[31m-            ngx_feature_path="/opt/local/include"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lpcre"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/opt/local/lib -lpcre"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            PCRE=YES[m
[31m-        fi[m
[31m-[m
[31m-        if [ $PCRE = YES ]; then[m
[31m-            ngx_feature="PCRE JIT support"[m
[31m-            ngx_feature_name="NGX_HAVE_PCRE_JIT"[m
[31m-            ngx_feature_test="int jit = 0;[m
[31m-                              pcre_free_study(NULL);[m
[31m-                              pcre_config(PCRE_CONFIG_JIT, &jit);[m
[31m-                              if (jit != 1) return 1;"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            if [ $ngx_found = yes ]; then[m
[31m-                PCRE_JIT=YES[m
[31m-            fi[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $PCRE != YES ]; then[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP rewrite module requires the PCRE library.[m
[31m-You can either disable the module by using --without-http_rewrite_module[m
[31m-option, or install the PCRE library into the system, or build the PCRE library[m
[31m-statically from the source with nginx by using --with-pcre=<path> option.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/make[m
[1mdeleted file mode 100644[m
[1mindex 97c9f3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/make[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    msvc)[m
[31m-        ngx_makefile=makefile.msvc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"[m
[31m-        ngx_pcre="PCRE=\"$PCRE\""[m
[31m-    ;;[m
[31m-[m
[31m-    owc)[m
[31m-        ngx_makefile=makefile.owc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    bcc)[m
[31m-        ngx_makefile=makefile.bcc[m
[31m-        ngx_opt="-DCPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_pcre=`echo \-DPCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        ngx_makefile=[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ -n "$ngx_makefile" ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$PCRE/pcre.lib:	$PCRE/pcre.h $NGX_MAKEFILE"			\[m
[31m-	| sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre $ngx_opt[m
[31m-[m
[31m-`echo "$PCRE/pcre.h:" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre pcre.h[m
[31m-[m
[31m-END[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$PCRE/pcre.h:	$PCRE/Makefile[m
[31m-[m
[31m-$PCRE/Makefile:	$NGX_MAKEFILE[m
[31m-	cd $PCRE \\[m
[31m-	&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\[m
[31m-	&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\[m
[31m-	./configure --disable-shared $PCRE_CONF_OPT[m
[31m-[m
[31m-$PCRE/.libs/libpcre.a:	$PCRE/Makefile[m
[31m-	cd $PCRE \\[m
[31m-	&& \$(MAKE) libpcre.la[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex 7a0f2be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS =	-q -O2 -tWM -w-8004 $(CPU_OPT)[m
[31m-PCREFLAGS =	-DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \[m
[31m-		-DSUPPORT_PCRE8 -DHAVE_MEMMOVE[m
[31m-[m
[31m-[m
[31m-pcre.lib:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	bcc32 -c $(CFLAGS) -I. $(PCREFLAGS) pcre_*.c[m
[31m-[m
[31m-	copy /y nul pcre.lst[m
[31m-	for %n in (*.obj) do @echo +%n ^^& >> pcre.lst[m
[31m-	echo + >> pcre.lst[m
[31m-[m
[31m-	tlib pcre.lib @pcre.lst[m
[31m-[m
[31m-pcre.h:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	copy /y pcre.h.generic pcre.h[m
[31m-	copy /y config.h.generic config.h[m
[31m-	copy /y pcre_chartables.c.dist pcre_chartables.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex 07fd9a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS =	-O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT)[m
[31m-PCREFLAGS =	-DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \[m
[31m-		-DSUPPORT_PCRE8 -DHAVE_MEMMOVE[m
[31m-[m
[31m-[m
[31m-pcre.lib:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	cl -nologo -c $(CFLAGS) -I . $(PCREFLAGS) pcre_*.c[m
[31m-[m
[31m-	link -lib -out:pcre.lib -verbose:lib pcre_*.obj[m
[31m-[m
[31m-pcre.h:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	copy /y pcre.h.generic pcre.h[m
[31m-	copy /y config.h.generic config.h[m
[31m-	copy /y pcre_chartables.c.dist pcre_chartables.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.owc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.owc[m
[1mdeleted file mode 100644[m
[1mindex 122fd5b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/pcre/makefile.owc[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS =	-c -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT)[m
[31m-PCREFLAGS =	-DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 &[m
[31m-		-DSUPPORT_PCRE8 -DHAVE_MEMMOVE[m
[31m-[m
[31m-[m
[31m-pcre.lib:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	wcl386 $(CFLAGS) -i=. $(PCREFLAGS) pcre_*.c[m
[31m-[m
[31m-	dir /b *.obj > pcre.lst[m
[31m-[m
[31m-	wlib -n pcre.lib @pcre.lst[m
[31m-[m
[31m-pcre.h:[m
[31m-	cd $(PCRE)[m
[31m-[m
[31m-	copy /y pcre.h.generic pcre.h[m
[31m-	copy /y config.h.generic config.h[m
[31m-	copy /y pcre_chartables.c.dist pcre_chartables.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/perl/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/perl/conf[m
[1mdeleted file mode 100644[m
[1mindex f5f5d3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/perl/conf[m
[1m+++ /dev/null[m
[36m@@ -1,81 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo "checking for perl"[m
[31m-[m
[31m-[m
[31m-NGX_PERL_VER=`$NGX_PERL -v 2>&1 | grep '^This is perl' 2>&1 \[m
[31m-                                | sed -e 's/^This is perl, \(.*\)/\1/'`[m
[31m-[m
[31m-if test -n "$NGX_PERL_VER"; then[m
[31m-    echo " + perl version: $NGX_PERL_VER"[m
[31m-[m
[31m-    if [ "`$NGX_PERL -e 'use 5.006001; print "OK"'`" != "OK" ]; then[m
[31m-        echo[m
[31m-        echo "$0: error: perl 5.6.1 or higher is required"[m
[31m-        echo[m
[31m-[m
[31m-        exit 1;[m
[31m-    fi[m
[31m-[m
[31m-    if [ "`$NGX_PERL -MExtUtils::Embed -e 'print "OK"'`" != "OK" ]; then[m
[31m-        echo[m
[31m-        echo "$0: error: perl module ExtUtils::Embed is required"[m
[31m-        echo[m
[31m-[m
[31m-        exit 1;[m
[31m-    fi[m
[31m-[m
[31m-    NGX_PERL_CFLAGS="$CFLAGS `$NGX_PERL -MExtUtils::Embed -e ccopts`"[m
[31m-    NGX_PM_CFLAGS=`$NGX_PERL -MExtUtils::Embed -e ccopts`[m
[31m-[m
[31m-    # gcc 4.1/4.2 warn about unused values in pTHX_[m
[31m-    NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \[m
[31m-                     | sed -e 's/-Wunused-value/-Wno-unused-value/'`[m
[31m-    # icc8 warns 'declaration hides parameter "my_perl"' in ENTER and LEAVE[m
[31m-    NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \[m
[31m-                     | sed -e 's/-wd171/-wd171 -wd1599/'`[m
[31m-[m
[31m-    ngx_perl_ldopts=`$NGX_PERL -MExtUtils::Embed -e ldopts`[m
[31m-[m
[31m-    ngx_perl_dlext=`$NGX_PERL -MConfig -e 'print $Config{dlext}'`[m
[31m-    ngx_perl_libdir="src/http/modules/perl/blib/arch/auto"[m
[31m-    ngx_perl_module="$ngx_perl_libdir/nginx/nginx.$ngx_perl_dlext"[m
[31m-[m
[31m-    if $NGX_PERL -V:usemultiplicity | grep define > /dev/null; then[m
[31m-        have=NGX_HAVE_PERL_MULTIPLICITY . auto/have[m
[31m-        echo " + perl interpreter multiplicity found"[m
[31m-    fi[m
[31m-[m
[31m-    if $NGX_PERL -V:useithreads | grep undef > /dev/null; then[m
[31m-        # FreeBSD port wants to link with -pthread non-threaded perl[m
[31m-        ngx_perl_ldopts=`echo $ngx_perl_ldopts | sed 's/ -pthread//'`[m
[31m-    fi[m
[31m-[m
[31m-    if [ "$NGX_SYSTEM" = "Darwin" ]; then[m
[31m-        # OS X system perl wants to link universal binaries[m
[31m-        ngx_perl_ldopts=`echo $ngx_perl_ldopts \[m
[31m-                         | sed -e 's/-arch i386//' -e 's/-arch x86_64//'`[m
[31m-    fi[m
[31m-[m
[31m-    if [ $USE_PERL = YES ]; then[m
[31m-        CORE_LINK="$CORE_LINK $ngx_perl_ldopts"[m
[31m-    fi[m
[31m-[m
[31m-    NGX_LIB_PERL="$ngx_perl_ldopts"[m
[31m-[m
[31m-    if test -n "$NGX_PERL_MODULES"; then[m
[31m-        have=NGX_PERL_MODULES value="(u_char *) \"$NGX_PERL_MODULES\""[m
[31m-        . auto/define[m
[31m-        NGX_PERL_MODULES_MAN=$NGX_PERL_MODULES/man3[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-    echo[m
[31m-    echo "$0: error: perl 5.6.1 or higher is required"[m
[31m-    echo[m
[31m-[m
[31m-    exit 1;[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/perl/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/perl/make[m
[1mdeleted file mode 100644[m
[1mindex 8af8902..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/perl/make[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-v=`grep 'define NGINX_VERSION' src/core/nginx.h | sed -e 's/^.*"\(.*\)".*/\1/'`[m
[31m-[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-$NGX_OBJS/src/http/modules/perl/ngx_http_perl_module.o: \\[m
[31m-		$NGX_OBJS/$ngx_perl_module[m
[31m-[m
[31m-$NGX_OBJS/$ngx_perl_module: \\[m
[31m-		\$(CORE_DEPS) \$(HTTP_DEPS) \\[m
[31m-		src/http/modules/perl/ngx_http_perl_module.h \\[m
[31m-		$NGX_OBJS/src/http/modules/perl/Makefile[m
[31m-	cd $NGX_OBJS/src/http/modules/perl && \$(MAKE)[m
[31m-[m
[31m-	rm -rf $NGX_OBJS/install_perl[m
[31m-[m
[31m-[m
[31m-$NGX_OBJS/src/http/modules/perl/Makefile: \\[m
[31m-		$NGX_AUTO_CONFIG_H \\[m
[31m-		src/core/nginx.h \\[m
[31m-		src/http/modules/perl/Makefile.PL \\[m
[31m-		src/http/modules/perl/nginx.pm \\[m
[31m-		src/http/modules/perl/nginx.xs \\[m
[31m-		src/http/modules/perl/typemap[m
[31m-	sed "s/%%VERSION%%/$v/" src/http/modules/perl/nginx.pm > \\[m
[31m-		$NGX_OBJS/src/http/modules/perl/nginx.pm[m
[31m-	cp -p src/http/modules/perl/nginx.xs $NGX_OBJS/src/http/modules/perl/[m
[31m-	cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/[m
[31m-	cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/[m
[31m-[m
[31m-	cd $NGX_OBJS/src/http/modules/perl \\[m
[31m-		&& NGX_PM_CFLAGS="\$(NGX_PM_CFLAGS) -g $NGX_CC_OPT" \\[m
[31m-			NGX_INCS="$CORE_INCS $NGX_OBJS $HTTP_INCS" \\[m
[31m-			NGX_DEPS="\$(CORE_DEPS) \$(HTTP_DEPS)" \\[m
[31m-		$NGX_PERL Makefile.PL \\[m
[31m-			LIB=$NGX_PERL_MODULES \\[m
[31m-			INSTALLSITEMAN3DIR=$NGX_PERL_MODULES_MAN[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/conf[m
[1mdeleted file mode 100644[m
[1mindex 78f9efd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/conf[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $SHA1 != NONE ]; then[m
[31m-[m
[31m-    have=NGX_HAVE_SHA1 . auto/have[m
[31m-    CORE_INCS="$CORE_INCS $SHA1"[m
[31m-[m
[31m-    case "$NGX_CC_NAME" in[m
[31m-[m
[31m-        msvc | owc | bcc)[m
[31m-            LINK_DEPS="$LINK_DEPS $SHA1/sha1.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $SHA1/sha1.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            LINK_DEPS="$LINK_DEPS $SHA1/libsha.a"[m
[31m-[m
[31m-            # to allow -ipo optimization we link with the *.o but not library[m
[31m-            CORE_LIBS="$CORE_LIBS $SHA1/sha1_dgst.o"[m
[31m-[m
[31m-            if [ $SHA1_ASM = YES ]; then[m
[31m-                CORE_LIBS="$CORE_LIBS $SHA1/asm/sx86-elf.o"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            LINK_DEPS="$LINK_DEPS $SHA1/libsha.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $SHA1/libsha.a"[m
[31m-            #CORE_LIBS="$CORE_LIBS -L $SHA1 -lsha"[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-[m
[31m-        SHA1=NO[m
[31m-[m
[31m-        # FreeBSD[m
[31m-[m
[31m-        ngx_feature="sha1 in system md library"[m
[31m-        ngx_feature_name=NGX_HAVE_SHA1[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <sha.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lmd"[m
[31m-        ngx_feature_test="SHA_CTX sha1; SHA1_Init(&sha1)"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        ngx_sha1_lib="system md"[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-[m
[31m-            # OpenSSL crypto library[m
[31m-[m
[31m-            ngx_feature="sha1 in system OpenSSL crypto library"[m
[31m-            ngx_feature_incs="#include <openssl/sha.h>"[m
[31m-            ngx_feature_libs="-lcrypto"[m
[31m-            . auto/feature[m
[31m-[m
[31m-            ngx_sha1_lib="system crypto"[m
[31m-[m
[31m-            if [ $ngx_found = yes ]; then[m
[31m-                have=NGX_HAVE_OPENSSL_SHA1_H . auto/have[m
[31m-            fi[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            SHA1=YES[m
[31m-            SHA1_LIB=$ngx_sha1_lib[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/make[m
[1mdeleted file mode 100644[m
[1mindex fc3b340..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/make[m
[1m+++ /dev/null[m
[36m@@ -1,96 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    msvc)[m
[31m-        ngx_makefile=makefile.msvc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC SHA1_ASM=$SHA1_ASM"[m
[31m-        ngx_sha1="SHA1=\"$SHA1\""[m
[31m-    ;;[m
[31m-[m
[31m-    owc)[m
[31m-        ngx_makefile=makefile.owc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_sha1=`echo SHA1=\"$SHA1\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    bcc)[m
[31m-        ngx_makefile=makefile.bcc[m
[31m-        ngx_opt="-DCPU_OPT=\"$CPU_OPT\" -DSHA1_ASM=$SHA1_ASM"[m
[31m-        ngx_sha1=`echo \-DSHA1=\"$SHA1\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-done=NO[m
[31m-[m
[31m-[m
[31m-case "$NGX_PLATFORM" in[m
[31m-[m
[31m-    win32)[m
[31m-        cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$SHA1/sha1.lib:	$NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/sha1/$ngx_makefile $ngx_opt $ngx_sha1[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        done=YES[m
[31m-    ;;[m
[31m-[m
[31m-    SunOS:*:i86pc)[m
[31m-        if [ $SHA1_ASM = YES ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$SHA1/libsha.a:	$NGX_MAKEFILE[m
[31m-	cd $SHA1 \\[m
[31m-	&& \$(MAKE) CFLAGS="$SHA1_OPT -DSOL -DSHA1_ASM -DL_ENDIAN" \\[m
[31m-		CC="\$(CC)" CPP="\$(CPP)" \\[m
[31m-		SHA_ASM_OBJ=asm/sx86-sol.o clean libsha.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-            done=YES[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-    # FreeBSD: i386[m
[31m-    # Linux: i686[m
[31m-[m
[31m-    *:i386 | *:i686)[m
[31m-        if [ $SHA1_ASM = YES ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$SHA1/libsha.a:	$NGX_MAKEFILE[m
[31m-	cd $SHA1 \\[m
[31m-	&& \$(MAKE) CFLAGS="$SHA1_OPT -DELF -DSHA1_ASM -DL_ENDIAN" \\[m
[31m-		CC="\$(CC)" CPP="\$(CPP)" \\[m
[31m-		SHA_ASM_OBJ=asm/sx86-elf.o clean libsha.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-            done=YES[m
[31m-        fi[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ $done = NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$SHA1/libsha.a:	$NGX_MAKEFILE[m
[31m-	cd $SHA1 \\[m
[31m-	&& \$(MAKE) CFLAGS="$SHA1_OPT" \\[m
[31m-		CC="\$(CC)" SHA_ASM_OBJ= clean libsha.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex b0685fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -q -O2 -tWM $(CPU_OPT) -DL_ENDIAN[m
[31m-[m
[31m-!if "$(SHA1_ASM)" == "YES"[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	bcc32 -c $(CFLAGS) -DSHA1_ASM sha1dgst.c[m
[31m-	tlib sha1.lib +sha1dgst.obj +"asm\s-win32.obj"[m
[31m-[m
[31m-!else[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	bcc32 -c $(CFLAGS) sha1dgst.c[m
[31m-	tlib sha1.lib +sha1dgst.obj[m
[31m-[m
[31m-!endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex 3cbd21b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -D L_ENDIAN[m
[31m-[m
[31m-!IF "$(SHA1_ASM)" == "YES"[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	cl -c $(CFLAGS) -D SHA1_ASM sha1dgst.c[m
[31m-	link -lib -out:sha1.lib sha1dgst.obj asm/s-win32.obj[m
[31m-[m
[31m-!ELSE[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	cl -c $(CFLAGS) sha1dgst.c[m
[31m-	link -lib -out:sha1.lib sha1dgst.obj[m
[31m-[m
[31m-!ENDIF[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.owc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.owc[m
[1mdeleted file mode 100644[m
[1mindex fc095cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/sha1/makefile.owc[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -zq -bt=nt -bm -ot -op -oi -oe -s $(CPU_OPT)[m
[31m-[m
[31m-sha1.lib:[m
[31m-	cd $(SHA1)[m
[31m-	wcl386 -c $(CFLAGS) -dL_ENDIAN sha1dgst.c[m
[31m-	wlib -n sha1.lib sha1dgst.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/test b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/test[m
[1mdeleted file mode 100644[m
[1mindex ba943a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/test[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_lib ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_lib[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_found=no[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-$ngx_lib_incs[m
[31m-[m
[31m-int main() {[m
[31m-    $ngx_lib_test;[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-eval "$CC $cc_test_flags $ngx_lib_cflags \[m
[31m-     -o $NGX_AUTOTEST $NGX_AUTOTEST.c $ngx_libs \[m
[31m-     >> $NGX_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    echo " found"[m
[31m-[m
[31m-    ngx_found=yes[m
[31m-[m
[31m-else[m
[31m-    echo " not found"[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/conf[m
[1mdeleted file mode 100644[m
[1mindex 239592e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/conf[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $ZLIB != NONE ]; then[m
[31m-    CORE_INCS="$CORE_INCS $ZLIB"[m
[31m-[m
[31m-    case "$NGX_CC_NAME" in[m
[31m-[m
[31m-        msvc | owc | bcc)[m
[31m-            have=NGX_ZLIB . auto/have[m
[31m-            LINK_DEPS="$LINK_DEPS $ZLIB/zlib.lib"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/zlib.lib"[m
[31m-        ;;[m
[31m-[m
[31m-        icc)[m
[31m-            have=NGX_ZLIB . auto/have[m
[31m-            LINK_DEPS="$LINK_DEPS $ZLIB/libz.a"[m
[31m-[m
[31m-            # to allow -ipo optimization we link with the *.o but not library[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/adler32.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/crc32.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/deflate.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/trees.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/zutil.o"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/compress.o"[m
[31m-[m
[31m-            if [ $ZLIB_ASM != NO ]; then[m
[31m-                CORE_LIBS="$CORE_LIBS $ZLIB/match.o"[m
[31m-            fi[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-            have=NGX_ZLIB . auto/have[m
[31m-            LINK_DEPS="$LINK_DEPS $ZLIB/libz.a"[m
[31m-            CORE_LIBS="$CORE_LIBS $ZLIB/libz.a"[m
[31m-            #CORE_LIBS="$CORE_LIBS -L $ZLIB -lz"[m
[31m-        ;;[m
[31m-[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-        ZLIB=NO[m
[31m-[m
[31m-        # FreeBSD, Solaris, Linux[m
[31m-[m
[31m-        ngx_feature="zlib library"[m
[31m-        ngx_feature_name="NGX_ZLIB"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <zlib.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lz"[m
[31m-        ngx_feature_test="z_stream z; deflate(&z, Z_NO_FLUSH)"[m
[31m-        . auto/feature[m
[31m-[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-            ZLIB=YES[m
[31m-            ngx_found=no[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ZLIB != YES ]; then[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the HTTP gzip module requires the zlib library.[m
[31m-You can either disable the module by using --without-http_gzip_module[m
[31m-option, or install the zlib library into the system, or build the zlib library[m
[31m-statically from the source with nginx by using --with-zlib=<path> option.[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/make[m
[1mdeleted file mode 100644[m
[1mindex 0082ad5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/make[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    msvc)[m
[31m-        ngx_makefile=makefile.msvc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"[m
[31m-        ngx_zlib="ZLIB=\"$ZLIB\""[m
[31m-[m
[31m-    ;;[m
[31m-[m
[31m-    owc)[m
[31m-        ngx_makefile=makefile.owc[m
[31m-        ngx_opt="CPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_zlib=`echo ZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    bcc)[m
[31m-        ngx_makefile=makefile.bcc[m
[31m-        ngx_opt="-DCPU_OPT=\"$CPU_OPT\""[m
[31m-        ngx_zlib=`echo \-DZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        ngx_makefile=[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-done=NO[m
[31m-[m
[31m-[m
[31m-case "$NGX_PLATFORM" in[m
[31m-[m
[31m-    win32)[m
[31m-[m
[31m-        if [ -n "$ngx_makefile" ]; then[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-`echo "$ZLIB/zlib.lib:	$NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-	\$(MAKE) -f auto/lib/zlib/$ngx_makefile $ngx_opt $ngx_zlib[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        else[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ZLIB/libz.a:	$NGX_MAKEFILE[m
[31m-	cd $ZLIB \\[m
[31m-	&& \$(MAKE) distclean \\[m
[31m-	&& \$(MAKE) -f win32/Makefile.gcc \\[m
[31m-		CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\[m
[31m-		libz.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        fi[m
[31m-[m
[31m-        done=YES[m
[31m-    ;;[m
[31m-[m
[31m-    # FreeBSD: i386[m
[31m-    # Linux: i686[m
[31m-[m
[31m-    *:i386 | *:i686)[m
[31m-        case $ZLIB_ASM in[m
[31m-            pentium)[m
[31m-[m
[31m-                cat << END                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ZLIB/libz.a:	$NGX_MAKEFILE[m
[31m-	cd $ZLIB \\[m
[31m-	&& \$(MAKE) distclean \\[m
[31m-	&& cp contrib/asm586/match.S . \\[m
[31m-	&& CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\[m
[31m-		./configure \\[m
[31m-	&& \$(MAKE) OBJA=match.o libz.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-                done=YES[m
[31m-            ;;[m
[31m-[m
[31m-            pentiumpro)[m
[31m-[m
[31m-                cat << END                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ZLIB/libz.a:	$NGX_MAKEFILE[m
[31m-	cd $ZLIB \\[m
[31m-	&& \$(MAKE) distclean \\[m
[31m-	&& cp contrib/asm686/match.S . \\[m
[31m-	&& CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\[m
[31m-		./configure \\[m
[31m-	&& \$(MAKE) OBJA=match.o libz.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-                done=YES[m
[31m-            ;;[m
[31m-[m
[31m-            NO)[m
[31m-            ;;[m
[31m-[m
[31m-            *)[m
[31m-                echo "$0: error: invalid --with-zlib-asm=$ZLIB_ASM option."[m
[31m-                echo "The valid values are \"pentium\" and \"pentiumpro\" only".[m
[31m-                echo[m
[31m-[m
[31m-                exit 1;[m
[31m-            ;;[m
[31m-        esac[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ $done = NO ]; then[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ZLIB/libz.a:	$NGX_MAKEFILE[m
[31m-	cd $ZLIB \\[m
[31m-	&& \$(MAKE) distclean \\[m
[31m-	&& CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\[m
[31m-		./configure \\[m
[31m-	&& \$(MAKE) libz.a[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.bcc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.bcc[m
[1mdeleted file mode 100644[m
[1mindex 97a30ea..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.bcc[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -q -O2 -tWM -w-8004 -w-8012 $(CPU_OPT)[m
[31m-[m
[31m-zlib.lib:[m
[31m-	cd $(ZLIB)[m
[31m-[m
[31m-	bcc32 -c $(CFLAGS) adler32.c crc32.c deflate.c \[m
[31m-		trees.c zutil.c compress.c \[m
[31m-		inflate.c inffast.c inftrees.c[m
[31m-[m
[31m-	tlib zlib.lib +adler32.obj +crc32.obj +deflate.obj \[m
[31m-		+trees.obj +zutil.obj +compress.obj \[m
[31m-		+inflate.obj +inffast.obj +inftrees.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.msvc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.msvc[m
[1mdeleted file mode 100644[m
[1mindex 6fbd691..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.msvc[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT)[m
[31m-[m
[31m-zlib.lib:[m
[31m-	cd $(ZLIB)[m
[31m-[m
[31m-	cl -c $(CFLAGS) adler32.c crc32.c deflate.c \[m
[31m-		trees.c zutil.c compress.c \[m
[31m-		inflate.c inffast.c inftrees.c[m
[31m-[m
[31m-	link -lib -out:zlib.lib adler32.obj crc32.obj deflate.obj \[m
[31m-		trees.obj zutil.obj compress.obj \[m
[31m-		inflate.obj inffast.obj inftrees.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.owc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.owc[m
[1mdeleted file mode 100644[m
[1mindex 9e123be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/lib/zlib/makefile.owc[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CFLAGS = -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT)[m
[31m-[m
[31m-zlib.lib:[m
[31m-	cd $(ZLIB)[m
[31m-[m
[31m-	wcl386 -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c &[m
[31m-		compress.c inflate.c inffast.c inftrees.c[m
[31m-	wlib -n zlib.lib adler32.obj crc32.obj deflate.obj trees.obj &[m
[31m-		zutil.obj compress.obj inflate.obj inffast.obj inftrees.obj[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/make b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/make[m
[1mdeleted file mode 100644[m
[1mindex abbf68e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/make[m
[1m+++ /dev/null[m
[36m@@ -1,725 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo "creating $NGX_MAKEFILE"[m
[31m-[m
[31m-mkdir -p $NGX_OBJS/src/core $NGX_OBJS/src/event $NGX_OBJS/src/event/modules \[m
[31m-         $NGX_OBJS/src/os/unix $NGX_OBJS/src/os/win32 \[m
[31m-         $NGX_OBJS/src/http $NGX_OBJS/src/http/v2 $NGX_OBJS/src/http/modules \[m
[31m-         $NGX_OBJS/src/http/modules/perl \[m
[31m-         $NGX_OBJS/src/mail \[m
[31m-         $NGX_OBJS/src/stream \[m
[31m-         $NGX_OBJS/src/misc[m
[31m-[m
[31m-[m
[31m-ngx_objs_dir=$NGX_OBJS$ngx_regex_dirsep[m
[31m-ngx_use_pch=`echo $NGX_USE_PCH | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-[m
[31m-cat << END                                                     > $NGX_MAKEFILE[m
[31m-[m
[31m-CC =	$CC[m
[31m-CFLAGS = $CFLAGS[m
[31m-CPP =	$CPP[m
[31m-LINK =	$LINK[m
[31m-[m
[31m-END[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    echo DTRACE = $DTRACE                   >> $NGX_MAKEFILE[m
[31m-fi[m
[31m-[m
[31m-if test -n "$NGX_PERL_CFLAGS"; then[m
[31m-    echo NGX_PERL_CFLAGS = $NGX_PERL_CFLAGS                   >> $NGX_MAKEFILE[m
[31m-    echo NGX_PM_CFLAGS = $NGX_PM_CFLAGS                       >> $NGX_MAKEFILE[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# ALL_INCS, required by the addons and by OpenWatcom C precompiled headers[m
[31m-[m
[31m-ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS $STREAM_INCS\[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-ALL_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_all_srcs="$CORE_SRCS"[m
[31m-[m
[31m-[m
[31m-# the core dependencies and include paths[m
[31m-[m
[31m-ngx_deps=`echo $CORE_DEPS $NGX_AUTO_CONFIG_H $NGX_PCH \[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-ngx_incs=`echo $CORE_INCS $NGX_OBJS \[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-CORE_DEPS = $ngx_deps[m
[31m-[m
[31m-[m
[31m-CORE_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-# the http dependencies and include paths[m
[31m-[m
[31m-if [ $HTTP = YES ]; then[m
[31m-[m
[31m-    ngx_all_srcs="$ngx_all_srcs $HTTP_SRCS"[m
[31m-[m
[31m-    ngx_deps=`echo $HTTP_DEPS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_incs=`echo $HTTP_INCS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-HTTP_DEPS = $ngx_deps[m
[31m-[m
[31m-[m
[31m-HTTP_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the mail dependencies and include paths[m
[31m-[m
[31m-if [ $MAIL != NO ]; then[m
[31m-[m
[31m-    if [ $MAIL = YES ]; then[m
[31m-        ngx_all_srcs="$ngx_all_srcs $MAIL_SRCS"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_deps=`echo $MAIL_DEPS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_incs=`echo $MAIL_INCS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-MAIL_DEPS = $ngx_deps[m
[31m-[m
[31m-[m
[31m-MAIL_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the stream dependencies and include paths[m
[31m-[m
[31m-if [ $STREAM != NO ]; then[m
[31m-[m
[31m-    if [ $STREAM = YES ]; then[m
[31m-        ngx_all_srcs="$ngx_all_srcs $STREAM_SRCS"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_deps=`echo $STREAM_DEPS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_incs=`echo $STREAM_INCS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-STREAM_DEPS = $ngx_deps[m
[31m-[m
[31m-[m
[31m-STREAM_INCS = $ngx_include_opt$ngx_incs[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_all_srcs="$ngx_all_srcs $MISC_SRCS"[m
[31m-[m
[31m-[m
[31m-if test -n "$NGX_ADDON_SRCS"; then[m
[31m-[m
[31m-cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-ADDON_DEPS = \$(CORE_DEPS) $NGX_ADDON_DEPS[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# nginx[m
[31m-[m
[31m-ngx_all_srcs=`echo $ngx_all_srcs | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-for ngx_src in $NGX_ADDON_SRCS[m
[31m-do[m
[31m-    ngx_obj="addon/`basename \`dirname $ngx_src\``"[m
[31m-[m
[31m-    test -d $NGX_OBJS/$ngx_obj || mkdir -p $NGX_OBJS/$ngx_obj[m
[31m-[m
[31m-    ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \[m
[31m-        | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_all_srcs="$ngx_all_srcs $ngx_obj"[m
[31m-done[m
[31m-[m
[31m-ngx_all_objs=`echo $ngx_all_srcs \[m
[31m-    | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-          -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-          -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-          -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"`[m
[31m-[m
[31m-ngx_modules_c=`echo $NGX_MODULES_C | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-ngx_modules_obj=`echo $ngx_modules_c | sed -e "s/\(.*\.\)c/\1$ngx_objext/"`[m
[31m-[m
[31m-[m
[31m-if test -n "$NGX_RES"; then[m
[31m-   ngx_res=$NGX_RES[m
[31m-else[m
[31m-   ngx_res="$NGX_RC $NGX_ICONS"[m
[31m-   ngx_rcc=`echo $NGX_RCC | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-fi[m
[31m-[m
[31m-ngx_deps=`echo $ngx_all_objs $ngx_modules_obj $ngx_res $LINK_DEPS \[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \[m
[31m-    | sed -e "s/  *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \[m
[31m-          -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-[m
[31m-    ngx_dtrace_obj=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.$ngx_objext[m
[31m-[m
[31m-    ngx_dtrace_h=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.h[m
[31m-[m
[31m-    ngx_dtrace_d=$NGX_OBJS${ngx_dirsep}dtrace_providers.d[m
[31m-[m
[31m-    ngx_dtrace_providers=`echo $NGX_DTRACE_PROVIDERS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-all: $NGX_OBJS${ngx_dirsep}nginx${ngx_binext}[m
[31m-[m
[31m-$ngx_dtrace_d: $ngx_dtrace_providers[m
[31m-	cat $ngx_dtrace_providers > $ngx_dtrace_d[m
[31m-[m
[31m-$ngx_dtrace_h: $ngx_dtrace_d[m
[31m-	\$(DTRACE) -h -o $ngx_dtrace_h -s $ngx_dtrace_d[m
[31m-END[m
[31m-[m
[31m-    if [ $DTRACE_PROBE_OBJ = YES ]; then[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-$ngx_dtrace_obj: $ngx_dtrace_d $ngx_deps$ngx_spacer[m
[31m-	\$(DTRACE) -G -o $ngx_dtrace_obj -s $ngx_dtrace_d $ngx_objs[m
[31m-END[m
[31m-[m
[31m-        ngx_deps="$ngx_deps$ngx_long_cont$ngx_dtrace_obj"[m
[31m-        ngx_objs="$ngx_objs$ngx_long_cont$ngx_dtrace_obj"[m
[31m-[m
[31m-        if [ "$DTRACE_FROM_SYSTEMTAP" = YES ]; then[m
[31m-            ngx_deps="$ngx_deps$ngx_long_cont$NGX_OBJS${ngx_dirsep}stap-nginx"[m
[31m-        fi[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_libs=[m
[31m-if test -n "$NGX_LD_OPT$CORE_LIBS"; then[m
[31m-    ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \[m
[31m-        | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`[m
[31m-fi[m
[31m-[m
[31m-ngx_link=${CORE_LINK:+`echo $CORE_LINK \[m
[31m-    | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}[m
[31m-[m
[31m-ngx_main_link=${MAIN_LINK:+`echo $MAIN_LINK \[m
[31m-    | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}[m
[31m-[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-build:	binary modules manpage[m
[31m-[m
[31m-binary:	$NGX_OBJS${ngx_dirsep}nginx$ngx_binext[m
[31m-[m
[31m-$NGX_OBJS${ngx_dirsep}nginx$ngx_binext:	$ngx_deps$ngx_spacer[m
[31m-	\$(LINK) $ngx_long_start$ngx_binout$NGX_OBJS${ngx_dirsep}nginx$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_main_link[m
[31m-	$ngx_rcc[m
[31m-$ngx_long_end[m
[31m-[m
[31m-modules:[m
[31m-END[m
[31m-[m
[31m-[m
[31m-# ngx_modules.c[m
[31m-[m
[31m-if test -n "$NGX_PCH"; then[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-else[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS)"[m
[31m-fi[m
[31m-[m
[31m-cat << END                                                    >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_modules_obj:	\$(CORE_DEPS)$ngx_cont$ngx_modules_c[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_modules_obj$ngx_tab$ngx_modules_c$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-# the core sources[m
[31m-[m
[31m-for ngx_src in $CORE_SRCS[m
[31m-do[m
[31m-    ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ngx_obj=`echo $ngx_src \[m
[31m-        | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-              -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-              -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-              -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-done[m
[31m-[m
[31m-[m
[31m-# the http sources[m
[31m-[m
[31m-if [ $HTTP = YES ]; then[m
[31m-[m
[31m-    if test -n "$NGX_PCH"; then[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-    else[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(HTTP_INCS)"[m
[31m-        ngx_perl_cc="\$(CC) $ngx_compile_opt \$(NGX_PERL_CFLAGS)"[m
[31m-        ngx_perl_cc="$ngx_perl_cc \$(CORE_INCS) \$(HTTP_INCS)"[m
[31m-    fi[m
[31m-[m
[31m-    for ngx_source in $HTTP_SRCS[m
[31m-    do[m
[31m-        ngx_src=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-        ngx_obj=`echo $ngx_src \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        if [ $ngx_source = src/http/modules/perl/ngx_http_perl_module.c ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) \$(HTTP_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_perl_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-        else[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) \$(HTTP_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        fi[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the mail sources[m
[31m-[m
[31m-if [ $MAIL = YES ]; then[m
[31m-[m
[31m-    if test -n "$NGX_PCH"; then[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-    else[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(MAIL_INCS)"[m
[31m-    fi[m
[31m-[m
[31m-    for ngx_src in $MAIL_SRCS[m
[31m-    do[m
[31m-        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-        ngx_obj=`echo $ngx_src \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) \$(MAIL_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the stream sources[m
[31m-[m
[31m-if [ $STREAM = YES ]; then[m
[31m-[m
[31m-    if test -n "$NGX_PCH"; then[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-    else[m
[31m-        ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(STREAM_INCS)"[m
[31m-    fi[m
[31m-[m
[31m-    for ngx_src in $STREAM_SRCS[m
[31m-    do[m
[31m-        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-        ngx_obj=`echo $ngx_src \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) \$(STREAM_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the misc sources[m
[31m-[m
[31m-if test -n "$MISC_SRCS"; then[m
[31m-[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-[m
[31m-    for ngx_src in $MISC_SRCS[m
[31m-    do[m
[31m-        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-        ngx_obj=`echo $ngx_src \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(CORE_DEPS) $ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the addons sources[m
[31m-[m
[31m-if test -n "$NGX_ADDON_SRCS"; then[m
[31m-[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-[m
[31m-    for ngx_src in $NGX_ADDON_SRCS[m
[31m-    do[m
[31m-        ngx_obj="addon/`basename \`dirname $ngx_src\``"[m
[31m-[m
[31m-        ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \[m
[31m-            | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-        ngx_obj=`echo $ngx_obj \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-        cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	\$(ADDON_DEPS)$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-     done[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the addons config.make[m
[31m-[m
[31m-if test -n "$NGX_ADDONS$DYNAMIC_ADDONS"; then[m
[31m-[m
[31m-    for ngx_addon_dir in $NGX_ADDONS $DYNAMIC_ADDONS[m
[31m-    do[m
[31m-        if test -f $ngx_addon_dir/config.make; then[m
[31m-            . $ngx_addon_dir/config.make[m
[31m-        fi[m
[31m-    done[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# Win32 resource file[m
[31m-[m
[31m-if test -n "$NGX_RES"; then[m
[31m-[m
[31m-    ngx_res=`echo "$NGX_RES:	$NGX_RC $NGX_ICONS" \[m
[31m-                 | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-    ngx_rcc=`echo $NGX_RCC | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_res[m
[31m-	$ngx_rcc[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the precompiled headers[m
[31m-[m
[31m-if test -n "$NGX_PCH"; then[m
[31m-    echo "#include <ngx_config.h>" > $NGX_OBJS/ngx_pch.c[m
[31m-[m
[31m-    ngx_pch="src/core/ngx_config.h $OS_CONFIG $NGX_OBJS/ngx_auto_config.h"[m
[31m-    ngx_pch=`echo "$NGX_PCH:	$ngx_pch" | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_src="\$(CC) \$(CFLAGS) $NGX_BUILD_PCH $ngx_compile_opt \$(ALL_INCS)"[m
[31m-    ngx_src="$ngx_src $ngx_objout$NGX_OBJS/ngx_pch.obj $NGX_OBJS/ngx_pch.c"[m
[31m-    ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    cat << END                                                >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_pch[m
[31m-	$ngx_src[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# dynamic modules[m
[31m-[m
[31m-if test -n "$NGX_PCH"; then[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"[m
[31m-else[m
[31m-    ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) \$(ALL_INCS)"[m
[31m-    ngx_perl_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(NGX_PERL_CFLAGS)"[m
[31m-    ngx_perl_cc="$ngx_perl_cc \$(ALL_INCS)"[m
[31m-fi[m
[31m-[m
[31m-ngx_obj_deps="\$(CORE_DEPS)"[m
[31m-if [ $HTTP != NO ]; then[m
[31m-    ngx_obj_deps="$ngx_obj_deps \$(HTTP_DEPS)"[m
[31m-fi[m
[31m-if [ $MAIL != NO ]; then[m
[31m-    ngx_obj_deps="$ngx_obj_deps \$(MAIL_DEPS)"[m
[31m-fi[m
[31m-if [ $STREAM != NO ]; then[m
[31m-    ngx_obj_deps="$ngx_obj_deps \$(STREAM_DEPS)"[m
[31m-fi[m
[31m-[m
[31m-for ngx_module in $DYNAMIC_MODULES[m
[31m-do[m
[31m-    eval ngx_module_srcs="\$${ngx_module}_SRCS"[m
[31m-    eval eval ngx_module_libs="\\\"\$${ngx_module}_LIBS\\\""[m
[31m-[m
[31m-    eval ngx_module_modules="\$${ngx_module}_MODULES"[m
[31m-    eval ngx_module_order="\$${ngx_module}_ORDER"[m
[31m-[m
[31m-    ngx_modules_c=$NGX_OBJS/${ngx_module}_modules.c[m
[31m-[m
[31m-    cat << END                                    > $ngx_modules_c[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    for mod in $ngx_module_modules[m
[31m-    do[m
[31m-        echo "extern ngx_module_t  $mod;"         >> $ngx_modules_c[m
[31m-    done[m
[31m-[m
[31m-    echo                                          >> $ngx_modules_c[m
[31m-    echo 'ngx_module_t *ngx_modules[] = {'        >> $ngx_modules_c[m
[31m-[m
[31m-    for mod in $ngx_module_modules[m
[31m-    do[m
[31m-        echo "    &$mod,"                         >> $ngx_modules_c[m
[31m-    done[m
[31m-[m
[31m-    cat << END                                    >> $ngx_modules_c[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    echo 'char *ngx_module_names[] = {'           >> $ngx_modules_c[m
[31m-[m
[31m-    for mod in $ngx_module_modules[m
[31m-    do[m
[31m-        echo "    \"$mod\","                      >> $ngx_modules_c[m
[31m-    done[m
[31m-[m
[31m-    cat << END                                    >> $ngx_modules_c[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    echo 'char *ngx_module_order[] = {'           >> $ngx_modules_c[m
[31m-[m
[31m-    for mod in $ngx_module_order[m
[31m-    do[m
[31m-        echo "    \"$mod\","                      >> $ngx_modules_c[m
[31m-    done[m
[31m-[m
[31m-    cat << END                                    >> $ngx_modules_c[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ngx_modules_c=`echo $ngx_modules_c | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_modules_obj=`echo $ngx_modules_c \[m
[31m-        | sed -e "s/\(.*\.\)c/\1$ngx_objext/"`[m
[31m-[m
[31m-    ngx_module_objs=[m
[31m-    for ngx_src in $ngx_module_srcs[m
[31m-    do[m
[31m-        case "$ngx_src" in[m
[31m-            src/*)[m
[31m-                ngx_obj=$ngx_src[m
[31m-                ;;[m
[31m-            *)[m
[31m-                ngx_obj="addon/`basename \`dirname $ngx_src\``"[m
[31m-                mkdir -p $NGX_OBJS/$ngx_obj[m
[31m-                ngx_obj="$ngx_obj/`basename $ngx_src`"[m
[31m-                ;;[m
[31m-        esac[m
[31m-[m
[31m-        ngx_module_objs="$ngx_module_objs $ngx_obj"[m
[31m-    done[m
[31m-[m
[31m-    ngx_module_objs=`echo $ngx_module_objs \[m
[31m-        | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-              -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-              -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \[m
[31m-              -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"`[m
[31m-[m
[31m-    ngx_deps=`echo $ngx_module_objs $ngx_modules_obj $LINK_DEPS \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_objs=`echo $ngx_module_objs $ngx_modules_obj \[m
[31m-        | sed -e "s/  *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \[m
[31m-              -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-    ngx_obj=$NGX_OBJS$ngx_dirsep$ngx_module$ngx_modext[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-        ngx_module_libs="$CORE_LIBS $ngx_module_libs"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_libs=[m
[31m-    if test -n "$NGX_LD_OPT$ngx_module_libs"; then[m
[31m-        ngx_libs=`echo $NGX_LD_OPT $ngx_module_libs \[m
[31m-            | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`[m
[31m-    fi[m
[31m-[m
[31m-    ngx_link=${CORE_LINK:+`echo $CORE_LINK \[m
[31m-        | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}[m
[31m-[m
[31m-    ngx_module_link=${MODULE_LINK:+`echo $MODULE_LINK \[m
[31m-        | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}[m
[31m-[m
[31m-[m
[31m-    cat << END                                            >> $NGX_MAKEFILE[m
[31m-[m
[31m-modules:	$ngx_obj[m
[31m-[m
[31m-$ngx_obj:	$ngx_deps$ngx_spacer[m
[31m-	\$(LINK) $ngx_long_start$ngx_binout$ngx_obj$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_module_link[m
[31m-$ngx_long_end[m
[31m-[m
[31m-$ngx_modules_obj:	\$(CORE_DEPS)$ngx_cont$ngx_modules_c[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_modules_obj$ngx_tab$ngx_modules_c$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    for ngx_source in $ngx_module_srcs[m
[31m-    do[m
[31m-        case "$ngx_source" in[m
[31m-            src/*)[m
[31m-                ngx_obj=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-                ;;[m
[31m-            *)[m
[31m-                ngx_obj="addon/`basename \`dirname $ngx_source\``"[m
[31m-                ngx_obj=`echo $ngx_obj/\`basename $ngx_source\` \[m
[31m-                    | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-                ;;[m
[31m-        esac[m
[31m-[m
[31m-        ngx_obj=`echo $ngx_obj \[m
[31m-            | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \[m
[31m-                  -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`[m
[31m-[m
[31m-        ngx_src=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"`[m
[31m-[m
[31m-        if [ $ngx_source = src/http/modules/perl/ngx_http_perl_module.c ]; then[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	$ngx_obj_deps$ngx_cont$ngx_src[m
[31m-	$ngx_perl_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-        else[m
[31m-[m
[31m-            cat << END                                        >> $NGX_MAKEFILE[m
[31m-[m
[31m-$ngx_obj:	$ngx_obj_deps$ngx_cont$ngx_src[m
[31m-	$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX[m
[31m-[m
[31m-END[m
[31m-[m
[31m-        fi[m
[31m-    done[m
[31m-done[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/module b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/module[m
[1mdeleted file mode 100644[m
[1mindex 16a816f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/module[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Ruslan Ermilov[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-case $ngx_module_type in[m
[31m-    HTTP_*) ngx_var=HTTP ;;[m
[31m-    *)      ngx_var=$ngx_module_type ;;[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-if [ "$ngx_module_link" = DYNAMIC ]; then[m
[31m-[m
[31m-    for ngx_module in $ngx_module_name; do[m
[31m-        # extract the first name[m
[31m-        break[m
[31m-    done[m
[31m-[m
[31m-    DYNAMIC_MODULES="$DYNAMIC_MODULES $ngx_module"[m
[31m-    eval ${ngx_module}_SRCS=\"$ngx_module_srcs\"[m
[31m-[m
[31m-    eval ${ngx_module}_MODULES=\"$ngx_module_name\"[m
[31m-[m
[31m-    if [ -z "$ngx_module_order" -a \[m
[31m-         \( "$ngx_module_type" = "HTTP_FILTER" \[m
[31m-         -o "$ngx_module_type" = "HTTP_AUX_FILTER" \) ][m
[31m-    then[m
[31m-        eval ${ngx_module}_ORDER=\"$ngx_module_name \[m
[31m-                                   ngx_http_copy_filter_module\"[m
[31m-    else[m
[31m-        eval ${ngx_module}_ORDER=\"$ngx_module_order\"[m
[31m-    fi[m
[31m-[m
[31m-    if test -n "$ngx_module_incs"; then[m
[31m-        CORE_INCS="$CORE_INCS $ngx_module_incs"[m
[31m-    fi[m
[31m-[m
[31m-    libs=[m
[31m-    for lib in $ngx_module_libs[m
[31m-    do[m
[31m-        case $lib in[m
[31m-[m
[31m-            LIBXSLT | LIBGD | GEOIP | PERL)[m
[31m-                libs="$libs \$NGX_LIB_$lib"[m
[31m-[m
[31m-                if eval [ "\$USE_${lib}" = NO ] ; then[m
[31m-                    eval USE_${lib}=DYNAMIC[m
[31m-                fi[m
[31m-            ;;[m
[31m-[m
[31m-            PCRE | OPENSSL | MD5 | SHA1 | ZLIB)[m
[31m-                eval USE_${lib}=YES[m
[31m-            ;;[m
[31m-[m
[31m-            *)[m
[31m-                libs="$libs $lib"[m
[31m-            ;;[m
[31m-[m
[31m-        esac[m
[31m-    done[m
[31m-    eval ${ngx_module}_LIBS=\'$libs\'[m
[31m-[m
[31m-elif [ "$ngx_module_link" = YES ]; then[m
[31m-[m
[31m-    eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \[m
[31m-                                      $ngx_module_name\"[m
[31m-[m
[31m-    eval ${ngx_var}_SRCS=\"\$${ngx_var}_SRCS $ngx_module_srcs\"[m
[31m-[m
[31m-    if test -n "$ngx_module_incs"; then[m
[31m-        eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\"[m
[31m-    fi[m
[31m-[m
[31m-    if test -n "$ngx_module_deps"; then[m
[31m-        eval ${ngx_var}_DEPS=\"\$${ngx_var}_DEPS $ngx_module_deps\"[m
[31m-    fi[m
[31m-[m
[31m-    for lib in $ngx_module_libs[m
[31m-    do[m
[31m-        case $lib in[m
[31m-[m
[31m-            PCRE | OPENSSL | MD5 | SHA1 | ZLIB | LIBXSLT | LIBGD | PERL | GEOIP)[m
[31m-                eval USE_${lib}=YES[m
[31m-            ;;[m
[31m-[m
[31m-            *)[m
[31m-                CORE_LIBS="$CORE_LIBS $lib"[m
[31m-            ;;[m
[31m-[m
[31m-        esac[m
[31m-    done[m
[31m-[m
[31m-elif [ "$ngx_module_link" = ADDON ]; then[m
[31m-[m
[31m-    eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \[m
[31m-                                      $ngx_module_name\"[m
[31m-[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_module_srcs"[m
[31m-[m
[31m-    if test -n "$ngx_module_incs"; then[m
[31m-        eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\"[m
[31m-    fi[m
[31m-[m
[31m-    if test -n "$ngx_module_deps"; then[m
[31m-        NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_module_deps"[m
[31m-    fi[m
[31m-[m
[31m-    for lib in $ngx_module_libs[m
[31m-    do[m
[31m-        case $lib in[m
[31m-[m
[31m-            PCRE | OPENSSL | MD5 | SHA1 | ZLIB | LIBXSLT | LIBGD | PERL | GEOIP)[m
[31m-                eval USE_${lib}=YES[m
[31m-            ;;[m
[31m-[m
[31m-            *)[m
[31m-                CORE_LIBS="$CORE_LIBS $lib"[m
[31m-            ;;[m
[31m-[m
[31m-        esac[m
[31m-    done[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/modules b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/modules[m
[1mdeleted file mode 100644[m
[1mindex 5a82885..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/modules[m
[1m+++ /dev/null[m
[36m@@ -1,1272 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $EVENT_SELECT = NO -a $EVENT_FOUND = NO ]; then[m
[31m-    EVENT_SELECT=YES[m
[31m-fi[m
[31m-[m
[31m-if [ $EVENT_SELECT = YES ]; then[m
[31m-    have=NGX_HAVE_SELECT . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $SELECT_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $EVENT_POLL = NO -a $EVENT_FOUND = NO ]; then[m
[31m-    EVENT_POLL=YES[m
[31m-fi[m
[31m-[m
[31m-if [ $EVENT_POLL = YES ]; then[m
[31m-    have=NGX_HAVE_POLL . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $POLL_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $POLL_MODULE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $NGX_TEST_BUILD_DEVPOLL = YES ]; then[m
[31m-    have=NGX_HAVE_DEVPOLL . auto/have[m
[31m-    have=NGX_TEST_BUILD_DEVPOLL . auto/have[m
[31m-    EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE"[m
[31m-    CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $NGX_TEST_BUILD_EVENTPORT = YES ]; then[m
[31m-    have=NGX_HAVE_EVENTPORT . auto/have[m
[31m-    have=NGX_TEST_BUILD_EVENTPORT . auto/have[m
[31m-    EVENT_MODULES="$EVENT_MODULES $EVENTPORT_MODULE"[m
[31m-    CORE_SRCS="$CORE_SRCS $EVENTPORT_SRCS"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_TEST_BUILD_EPOLL = YES ]; then[m
[31m-    have=NGX_HAVE_EPOLL . auto/have[m
[31m-    have=NGX_HAVE_EPOLLRDHUP . auto/have[m
[31m-    have=NGX_HAVE_EVENTFD . auto/have[m
[31m-    have=NGX_TEST_BUILD_EPOLL . auto/have[m
[31m-    EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE"[m
[31m-    CORE_SRCS="$CORE_SRCS $EPOLL_SRCS"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_TEST_BUILD_SOLARIS_SENDFILEV = YES ]; then[m
[31m-    have=NGX_TEST_BUILD_SOLARIS_SENDFILEV . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-HTTP_MODULES=[m
[31m-HTTP_DEPS=[m
[31m-HTTP_INCS=[m
[31m-[m
[31m-ngx_module_type=HTTP[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name="ngx_http_module \[m
[31m-                     ngx_http_core_module \[m
[31m-                     ngx_http_log_module \[m
[31m-                     ngx_http_upstream_module"[m
[31m-    ngx_module_incs="src/http src/http/modules"[m
[31m-    ngx_module_deps="src/http/ngx_http.h \[m
[31m-                     src/http/ngx_http_request.h \[m
[31m-                     src/http/ngx_http_config.h \[m
[31m-                     src/http/ngx_http_core_module.h \[m
[31m-                     src/http/ngx_http_cache.h \[m
[31m-                     src/http/ngx_http_variables.h \[m
[31m-                     src/http/ngx_http_script.h \[m
[31m-                     src/http/ngx_http_upstream.h \[m
[31m-                     src/http/ngx_http_upstream_round_robin.h \[m
[31m-                     src/http/ngx_http_probe.h"[m
[31m-    ngx_module_srcs="src/http/ngx_http.c \[m
[31m-                     src/http/ngx_http_core_module.c \[m
[31m-                     src/http/ngx_http_special_response.c \[m
[31m-                     src/http/ngx_http_request.c \[m
[31m-                     src/http/ngx_http_parse.c \[m
[31m-                     src/http/modules/ngx_http_log_module.c \[m
[31m-                     src/http/ngx_http_request_body.c \[m
[31m-                     src/http/ngx_http_variables.c \[m
[31m-                     src/http/ngx_http_script.c \[m
[31m-                     src/http/ngx_http_upstream.c \[m
[31m-                     src/http/ngx_http_upstream_round_robin.c"[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP != YES ]; then[m
[31m-    have=NGX_CRYPT . auto/nohave[m
[31m-    CRYPT_LIB=[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP_CACHE = YES ]; then[m
[31m-    USE_MD5=YES[m
[31m-    have=NGX_HTTP_CACHE . auto/have[m
[31m-    HTTP_SRCS="$HTTP_SRCS $HTTP_FILE_CACHE_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP_SSI = YES ]; then[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP_SLICE = YES ]; then[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP_ADDITION = YES ]; then[m
[31m-    HTTP_POSTPONE=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# the module order is important[m
[31m-#     ngx_http_static_module[m
[31m-#     ngx_http_gzip_static_module[m
[31m-#     ngx_http_dav_module[m
[31m-#     ngx_http_autoindex_module[m
[31m-#     ngx_http_index_module[m
[31m-#     ngx_http_random_index_module[m
[31m-#[m
[31m-#     ngx_http_access_module[m
[31m-#     ngx_http_realip_module[m
[31m-#[m
[31m-#[m
[31m-# the filter order is important[m
[31m-#     ngx_http_write_filter[m
[31m-#     ngx_http_header_filter[m
[31m-#     ngx_http_chunked_filter[m
[31m-#     ngx_http_v2_filter[m
[31m-#     ngx_http_range_header_filter[m
[31m-#     ngx_http_gzip_filter[m
[31m-#     ngx_http_postpone_filter[m
[31m-#     ngx_http_ssi_filter[m
[31m-#     ngx_http_charset_filter[m
[31m-#         ngx_http_xslt_filter[m
[31m-#         ngx_http_image_filter[m
[31m-#         ngx_http_sub_filter[m
[31m-#         ngx_http_addition_filter[m
[31m-#         ngx_http_gunzip_filter[m
[31m-#         ngx_http_userid_filter[m
[31m-#         ngx_http_headers_filter[m
[31m-#     ngx_http_copy_filter[m
[31m-#     ngx_http_range_body_filter[m
[31m-#     ngx_http_not_modified_filter[m
[31m-#     ngx_http_slice_filter[m
[31m-[m
[31m-ngx_module_type=HTTP_FILTER[m
[31m-HTTP_FILTER_MODULES=[m
[31m-[m
[31m-ngx_module_order="ngx_http_static_module \[m
[31m-                  ngx_http_gzip_static_module \[m
[31m-                  ngx_http_dav_module \[m
[31m-                  ngx_http_autoindex_module \[m
[31m-                  ngx_http_index_module \[m
[31m-                  ngx_http_random_index_module \[m
[31m-                  ngx_http_access_module \[m
[31m-                  ngx_http_realip_module \[m
[31m-                  ngx_http_write_filter_module \[m
[31m-                  ngx_http_header_filter_module \[m
[31m-                  ngx_http_chunked_filter_module \[m
[31m-                  ngx_http_v2_filter_module \[m
[31m-                  ngx_http_range_header_filter_module \[m
[31m-                  ngx_http_gzip_filter_module \[m
[31m-                  ngx_http_postpone_filter_module \[m
[31m-                  ngx_http_ssi_filter_module \[m
[31m-                  ngx_http_charset_filter_module \[m
[31m-                  ngx_http_xslt_filter_module \[m
[31m-                  ngx_http_image_filter_module \[m
[31m-                  ngx_http_sub_filter_module \[m
[31m-                  ngx_http_addition_filter_module \[m
[31m-                  ngx_http_gunzip_filter_module \[m
[31m-                  ngx_http_userid_filter_module \[m
[31m-                  ngx_http_headers_filter_module \[m
[31m-                  ngx_http_copy_filter_module \[m
[31m-                  ngx_http_range_body_filter_module \[m
[31m-                  ngx_http_not_modified_filter_module \[m
[31m-                  ngx_http_slice_filter_module"[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_write_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/ngx_http_write_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_header_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/ngx_http_header_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_chunked_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_chunked_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_V2 = YES ]; then[m
[31m-    ngx_module_name=ngx_http_v2_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/v2/ngx_http_v2_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_V2[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_range_header_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_range_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GZIP = YES ]; then[m
[31m-    have=NGX_HTTP_GZIP . auto/have[m
[31m-    USE_ZLIB=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_gzip_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_gzip_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_GZIP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_POSTPONE = YES ]; then[m
[31m-    ngx_module_name=ngx_http_postpone_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/ngx_http_postpone_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_POSTPONE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SSI = YES ]; then[m
[31m-    have=NGX_HTTP_SSI . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_ssi_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=src/http/modules/ngx_http_ssi_filter_module.h[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_ssi_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SSI[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_CHARSET = YES ]; then[m
[31m-    ngx_module_name=ngx_http_charset_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_charset_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_CHARSET[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_XSLT != NO ]; then[m
[31m-    ngx_module_name=ngx_http_xslt_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_xslt_filter_module.c[m
[31m-    ngx_module_libs=LIBXSLT[m
[31m-    ngx_module_link=$HTTP_XSLT[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_IMAGE_FILTER != NO ]; then[m
[31m-    ngx_module_name=ngx_http_image_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_image_filter_module.c[m
[31m-    ngx_module_libs=LIBGD[m
[31m-    ngx_module_link=$HTTP_IMAGE_FILTER[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SUB = YES ]; then[m
[31m-    ngx_module_name=ngx_http_sub_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_sub_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SUB[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_ADDITION = YES ]; then[m
[31m-    ngx_module_name=ngx_http_addition_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_addition_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_ADDITION[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GUNZIP = YES ]; then[m
[31m-    have=NGX_HTTP_GZIP . auto/have[m
[31m-    USE_ZLIB=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_gunzip_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_gunzip_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_GUNZIP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_USERID = YES ]; then[m
[31m-    ngx_module_name=ngx_http_userid_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_userid_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_USERID[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_headers_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_headers_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_module_type=HTTP_INIT_FILTER[m
[31m-HTTP_INIT_FILTER_MODULES=[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_copy_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/ngx_http_copy_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_range_body_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_not_modified_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_not_modified_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SLICE = YES ]; then[m
[31m-    ngx_module_name=ngx_http_slice_filter_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_slice_filter_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SLICE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_module_type=HTTP[m
[31m-[m
[31m-if [ $HTTP_V2 = YES ]; then[m
[31m-    have=NGX_HTTP_V2 . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_v2_module[m
[31m-    ngx_module_incs=src/http/v2[m
[31m-    ngx_module_deps="src/http/v2/ngx_http_v2.h src/http/v2/ngx_http_v2_module.h"[m
[31m-    ngx_module_srcs="src/http/v2/ngx_http_v2.c \[m
[31m-                     src/http/v2/ngx_http_v2_table.c \[m
[31m-                     src/http/v2/ngx_http_v2_huff_decode.c \[m
[31m-                     src/http/v2/ngx_http_v2_huff_encode.c \[m
[31m-                     src/http/v2/ngx_http_v2_module.c"[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_V2[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_static_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_static_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GZIP_STATIC = YES ]; then[m
[31m-    have=NGX_HTTP_GZIP . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_gzip_static_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_gzip_static_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_GZIP_STATIC[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_DAV = YES ]; then[m
[31m-    have=NGX_HTTP_DAV . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_dav_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_dav_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_DAV[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_AUTOINDEX = YES ]; then[m
[31m-    ngx_module_name=ngx_http_autoindex_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_autoindex_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_AUTOINDEX[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if :; then[m
[31m-    ngx_module_name=ngx_http_index_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_index_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_RANDOM_INDEX = YES ]; then[m
[31m-    ngx_module_name=ngx_http_random_index_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_random_index_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_RANDOM_INDEX[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_AUTH_REQUEST = YES ]; then[m
[31m-    ngx_module_name=ngx_http_auth_request_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_auth_request_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_AUTH_REQUEST[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_AUTH_BASIC = YES ]; then[m
[31m-    USE_MD5=YES[m
[31m-    USE_SHA1=YES[m
[31m-    have=NGX_CRYPT . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_auth_basic_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_auth_basic_module.c[m
[31m-    ngx_module_libs=$CRYPT_LIB[m
[31m-    ngx_module_link=$HTTP_AUTH_BASIC[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_ACCESS = YES ]; then[m
[31m-    ngx_module_name=ngx_http_access_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_access_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_ACCESS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_LIMIT_CONN = YES ]; then[m
[31m-    ngx_module_name=ngx_http_limit_conn_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_limit_conn_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_LIMIT_CONN[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_LIMIT_REQ = YES ]; then[m
[31m-    ngx_module_name=ngx_http_limit_req_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_limit_req_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_LIMIT_REQ[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_REALIP = YES ]; then[m
[31m-    have=NGX_HTTP_REALIP . auto/have[m
[31m-    have=NGX_HTTP_X_FORWARDED_FOR . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_realip_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_realip_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_REALIP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_STATUS = YES ]; then[m
[31m-    ngx_module_name=ngx_http_status_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_status_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_STATUS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GEO = YES ]; then[m
[31m-    have=NGX_HTTP_X_FORWARDED_FOR . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_geo_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_geo_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_GEO[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_GEOIP != NO ]; then[m
[31m-    have=NGX_HTTP_X_FORWARDED_FOR . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_geoip_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_geoip_module.c[m
[31m-    ngx_module_libs=GEOIP[m
[31m-    ngx_module_link=$HTTP_GEOIP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_MAP = YES ]; then[m
[31m-    ngx_module_name=ngx_http_map_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_map_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_MAP[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SPLIT_CLIENTS = YES ]; then[m
[31m-    ngx_module_name=ngx_http_split_clients_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_split_clients_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SPLIT_CLIENTS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_REFERER = YES ]; then[m
[31m-    ngx_module_name=ngx_http_referer_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_referer_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_REFERER[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_REWRITE = YES -a $USE_PCRE != DISABLED ]; then[m
[31m-    USE_PCRE=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_rewrite_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_rewrite_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_REWRITE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SSL = YES ]; then[m
[31m-    USE_OPENSSL=YES[m
[31m-    have=NGX_HTTP_SSL . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_ssl_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=src/http/modules/ngx_http_ssl_module.h[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_ssl_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SSL[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_PROXY = YES ]; then[m
[31m-    have=NGX_HTTP_X_FORWARDED_FOR . auto/have[m
[31m-    #USE_MD5=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_proxy_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_proxy_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_PROXY[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_FASTCGI = YES ]; then[m
[31m-    ngx_module_name=ngx_http_fastcgi_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_fastcgi_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_FASTCGI[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UWSGI = YES ]; then[m
[31m-    ngx_module_name=ngx_http_uwsgi_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_uwsgi_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UWSGI[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SCGI = YES ]; then[m
[31m-    ngx_module_name=ngx_http_scgi_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_scgi_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SCGI[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_PERL != NO ]; then[m
[31m-    ngx_module_name=ngx_http_perl_module[m
[31m-    ngx_module_incs=src/http/modules/perl[m
[31m-    ngx_module_deps=src/http/modules/perl/ngx_http_perl_module.h[m
[31m-    ngx_module_srcs=src/http/modules/perl/ngx_http_perl_module.c[m
[31m-    ngx_module_libs=PERL[m
[31m-    ngx_module_link=$HTTP_PERL[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_MEMCACHED = YES ]; then[m
[31m-    ngx_module_name=ngx_http_memcached_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_memcached_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_MEMCACHED[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_EMPTY_GIF = YES ]; then[m
[31m-    ngx_module_name=ngx_http_empty_gif_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_empty_gif_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_EMPTY_GIF[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_BROWSER = YES ]; then[m
[31m-    ngx_module_name=ngx_http_browser_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_browser_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_BROWSER[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SECURE_LINK = YES ]; then[m
[31m-    USE_MD5=YES[m
[31m-[m
[31m-    ngx_module_name=ngx_http_secure_link_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_secure_link_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_SECURE_LINK[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_DEGRADATION = YES ]; then[m
[31m-    have=NGX_HTTP_DEGRADATION . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_degradation_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_degradation_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_DEGRADATION[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_FLV = YES ]; then[m
[31m-    ngx_module_name=ngx_http_flv_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_flv_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_FLV[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_MP4 = YES ]; then[m
[31m-    ngx_module_name=ngx_http_mp4_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_mp4_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_MP4[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_HASH = YES ]; then[m
[31m-    ngx_module_name=ngx_http_upstream_hash_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_hash_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_HASH[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_IP_HASH = YES ]; then[m
[31m-    ngx_module_name=ngx_http_upstream_ip_hash_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_ip_hash_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_IP_HASH[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_LEAST_CONN = YES ]; then[m
[31m-    ngx_module_name=ngx_http_upstream_least_conn_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_least_conn_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_LEAST_CONN[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_KEEPALIVE = YES ]; then[m
[31m-    ngx_module_name=ngx_http_upstream_keepalive_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_keepalive_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_KEEPALIVE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UPSTREAM_ZONE = YES ]; then[m
[31m-    have=NGX_HTTP_UPSTREAM_ZONE . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_upstream_zone_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_upstream_zone_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_UPSTREAM_ZONE[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_STUB_STATUS = YES ]; then[m
[31m-    have=NGX_STAT_STUB . auto/have[m
[31m-[m
[31m-    ngx_module_name=ngx_http_stub_status_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/http/modules/ngx_http_stub_status_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$HTTP_STUB_STATUS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $MAIL != NO ]; then[m
[31m-    MAIL_MODULES=[m
[31m-    MAIL_DEPS=[m
[31m-    MAIL_INCS=[m
[31m-[m
[31m-    ngx_module_type=MAIL[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    ngx_module_order=[m
[31m-[m
[31m-    ngx_module_name="ngx_mail_module ngx_mail_core_module"[m
[31m-    ngx_module_incs="src/mail"[m
[31m-    ngx_module_deps="src/mail/ngx_mail.h"[m
[31m-    ngx_module_srcs="src/mail/ngx_mail.c \[m
[31m-                     src/mail/ngx_mail_core_module.c \[m
[31m-                     src/mail/ngx_mail_handler.c \[m
[31m-                     src/mail/ngx_mail_parse.c"[m
[31m-[m
[31m-    . auto/module[m
[31m-[m
[31m-    ngx_module_incs=[m
[31m-[m
[31m-    if [ $MAIL_SSL = YES ]; then[m
[31m-        USE_OPENSSL=YES[m
[31m-        have=NGX_MAIL_SSL . auto/have[m
[31m-[m
[31m-        ngx_module_name=ngx_mail_ssl_module[m
[31m-        ngx_module_deps=src/mail/ngx_mail_ssl_module.h[m
[31m-        ngx_module_srcs=src/mail/ngx_mail_ssl_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $MAIL_POP3 = YES ]; then[m
[31m-        ngx_module_name=ngx_mail_pop3_module[m
[31m-        ngx_module_deps=src/mail/ngx_mail_pop3_module.h[m
[31m-        ngx_module_srcs="src/mail/ngx_mail_pop3_module.c \[m
[31m-                         src/mail/ngx_mail_pop3_handler.c"[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $MAIL_IMAP = YES ]; then[m
[31m-        ngx_module_name=ngx_mail_imap_module[m
[31m-        ngx_module_deps=src/mail/ngx_mail_imap_module.h[m
[31m-        ngx_module_srcs="src/mail/ngx_mail_imap_module.c \[m
[31m-                         src/mail/ngx_mail_imap_handler.c"[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $MAIL_SMTP = YES ]; then[m
[31m-        ngx_module_name=ngx_mail_smtp_module[m
[31m-        ngx_module_deps=src/mail/ngx_mail_smtp_module.h[m
[31m-        ngx_module_srcs="src/mail/ngx_mail_smtp_module.c \[m
[31m-                         src/mail/ngx_mail_smtp_handler.c"[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    ngx_module_name=ngx_mail_auth_http_module[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/mail/ngx_mail_auth_http_module.c[m
[31m-[m
[31m-    . auto/module[m
[31m-[m
[31m-    ngx_module_name=ngx_mail_proxy_module[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/mail/ngx_mail_proxy_module.c[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $STREAM != NO ]; then[m
[31m-    STREAM_MODULES=[m
[31m-    STREAM_DEPS=[m
[31m-    STREAM_INCS=[m
[31m-[m
[31m-    ngx_module_type=STREAM[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-[m
[31m-    ngx_module_order=[m
[31m-[m
[31m-    ngx_module_name="ngx_stream_module \[m
[31m-                     ngx_stream_core_module \[m
[31m-                     ngx_stream_proxy_module \[m
[31m-                     ngx_stream_upstream_module"[m
[31m-    ngx_module_incs="src/stream"[m
[31m-    ngx_module_deps="src/stream/ngx_stream.h \[m
[31m-                     src/stream/ngx_stream_upstream.h \[m
[31m-                     src/stream/ngx_stream_upstream_round_robin.h"[m
[31m-    ngx_module_srcs="src/stream/ngx_stream.c \[m
[31m-                     src/stream/ngx_stream_handler.c \[m
[31m-                     src/stream/ngx_stream_core_module.c \[m
[31m-                     src/stream/ngx_stream_proxy_module.c \[m
[31m-                     src/stream/ngx_stream_upstream.c \[m
[31m-                     src/stream/ngx_stream_upstream_round_robin.c"[m
[31m-[m
[31m-    . auto/module[m
[31m-[m
[31m-    ngx_module_incs=[m
[31m-[m
[31m-    if [ $STREAM_SSL = YES ]; then[m
[31m-        USE_OPENSSL=YES[m
[31m-        have=NGX_STREAM_SSL . auto/have[m
[31m-[m
[31m-        ngx_module_name=ngx_stream_ssl_module[m
[31m-        ngx_module_deps=src/stream/ngx_stream_ssl_module.h[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_ssl_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_LIMIT_CONN = YES ]; then[m
[31m-        ngx_module_name=ngx_stream_limit_conn_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_limit_conn_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_ACCESS = YES ]; then[m
[31m-        ngx_module_name=ngx_stream_access_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_access_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_UPSTREAM_HASH = YES ]; then[m
[31m-        ngx_module_name=ngx_stream_upstream_hash_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_upstream_hash_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_UPSTREAM_LEAST_CONN = YES ]; then[m
[31m-        ngx_module_name=ngx_stream_upstream_least_conn_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_upstream_least_conn_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    if [ $STREAM_UPSTREAM_ZONE = YES ]; then[m
[31m-        have=NGX_STREAM_UPSTREAM_ZONE . auto/have[m
[31m-[m
[31m-        ngx_module_name=ngx_stream_upstream_zone_module[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=src/stream/ngx_stream_upstream_zone_module.c[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-#if [ -r $NGX_OBJS/auto ]; then[m
[31m-#    . $NGX_OBJS/auto[m
[31m-#fi[m
[31m-[m
[31m-[m
[31m-if test -n "$NGX_ADDONS"; then[m
[31m-[m
[31m-    echo configuring additional modules[m
[31m-[m
[31m-    for ngx_addon_dir in $NGX_ADDONS[m
[31m-    do[m
[31m-        echo "adding module in $ngx_addon_dir"[m
[31m-[m
[31m-        ngx_module_type=[m
[31m-        ngx_module_name=[m
[31m-        ngx_module_incs=[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=[m
[31m-        ngx_module_libs=[m
[31m-        ngx_module_order=[m
[31m-        ngx_module_link=ADDON[m
[31m-[m
[31m-        if test -f $ngx_addon_dir/config; then[m
[31m-            . $ngx_addon_dir/config[m
[31m-[m
[31m-            echo " + $ngx_addon_name was configured"[m
[31m-[m
[31m-        else[m
[31m-            echo "$0: error: no $ngx_addon_dir/config was found"[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    done[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if test -n "$DYNAMIC_ADDONS"; then[m
[31m-[m
[31m-    echo configuring additional dynamic modules[m
[31m-[m
[31m-    for ngx_addon_dir in $DYNAMIC_ADDONS[m
[31m-    do[m
[31m-        echo "adding module in $ngx_addon_dir"[m
[31m-[m
[31m-        ngx_module_type=[m
[31m-        ngx_module_name=[m
[31m-        ngx_module_incs=[m
[31m-        ngx_module_deps=[m
[31m-        ngx_module_srcs=[m
[31m-        ngx_module_libs=[m
[31m-        ngx_module_order=[m
[31m-        ngx_module_link=DYNAMIC[m
[31m-[m
[31m-        if test -f $ngx_addon_dir/config; then[m
[31m-            . $ngx_addon_dir/config[m
[31m-[m
[31m-            echo " + $ngx_addon_name was configured"[m
[31m-[m
[31m-        else[m
[31m-            echo "$0: error: no $ngx_addon_dir/config was found"[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    done[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $USE_OPENSSL = YES ]; then[m
[31m-    ngx_module_type=CORE[m
[31m-    ngx_module_name=ngx_openssl_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=src/event/ngx_event_openssl.h[m
[31m-    ngx_module_srcs="src/event/ngx_event_openssl.c[m
[31m-                     src/event/ngx_event_openssl_stapling.c"[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-    ngx_module_order=[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $USE_PCRE = YES ]; then[m
[31m-    ngx_module_type=CORE[m
[31m-    ngx_module_name=ngx_regex_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=src/core/ngx_regex.h[m
[31m-    ngx_module_srcs=src/core/ngx_regex.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=YES[m
[31m-    ngx_module_order=[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-modules="$CORE_MODULES $EVENT_MODULES"[m
[31m-[m
[31m-[m
[31m-# thread pool module should be initialized after events[m
[31m-if [ $USE_THREADS = YES ]; then[m
[31m-    modules="$modules $THREAD_POOL_MODULE"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP = YES ]; then[m
[31m-    modules="$modules $HTTP_MODULES $HTTP_FILTER_MODULES \[m
[31m-             $HTTP_AUX_FILTER_MODULES $HTTP_INIT_FILTER_MODULES"[m
[31m-[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(HTTP_DEPS)"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $MAIL != NO ]; then[m
[31m-[m
[31m-    if [ $MAIL = YES ]; then[m
[31m-        modules="$modules $MAIL_MODULES"[m
[31m-[m
[31m-    elif [ $MAIL = DYNAMIC ]; then[m
[31m-        ngx_module_name=$MAIL_MODULES[m
[31m-        ngx_module_incs=[m
[31m-        ngx_module_deps=$MAIL_DEPS[m
[31m-        ngx_module_srcs=$MAIL_SRCS[m
[31m-        ngx_module_libs=[m
[31m-        ngx_module_link=DYNAMIC[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(MAIL_DEPS)"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $STREAM != NO ]; then[m
[31m-[m
[31m-    if [ $STREAM = YES ]; then[m
[31m-        modules="$modules $STREAM_MODULES"[m
[31m-[m
[31m-    elif [ $STREAM = DYNAMIC ]; then[m
[31m-        ngx_module_name=$STREAM_MODULES[m
[31m-        ngx_module_incs=[m
[31m-        ngx_module_deps=$STREAM_DEPS[m
[31m-        ngx_module_srcs=$STREAM_SRCS[m
[31m-        ngx_module_libs=[m
[31m-        ngx_module_link=DYNAMIC[m
[31m-[m
[31m-        . auto/module[m
[31m-    fi[m
[31m-[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(STREAM_DEPS)"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_module_type=MISC[m
[31m-MISC_MODULES=[m
[31m-[m
[31m-if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then[m
[31m-    ngx_module_name=ngx_google_perftools_module[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/misc/ngx_google_perftools_module.c[m
[31m-    ngx_module_libs=[m
[31m-    ngx_module_link=$NGX_GOOGLE_PERFTOOLS[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_CPP_TEST = YES ]; then[m
[31m-    ngx_module_name=[m
[31m-    ngx_module_incs=[m
[31m-    ngx_module_deps=[m
[31m-    ngx_module_srcs=src/misc/ngx_cpp_test_module.cpp[m
[31m-    ngx_module_libs=-lstdc++[m
[31m-    ngx_module_link=$NGX_CPP_TEST[m
[31m-[m
[31m-    . auto/module[m
[31m-fi[m
[31m-[m
[31m-modules="$modules $MISC_MODULES"[m
[31m-[m
[31m-[m
[31m-cat << END                                    > $NGX_MODULES_C[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-$NGX_PRAGMA[m
[31m-[m
[31m-END[m
[31m-[m
[31m-for mod in $modules[m
[31m-do[m
[31m-    echo "extern ngx_module_t  $mod;"         >> $NGX_MODULES_C[m
[31m-done[m
[31m-[m
[31m-echo                                          >> $NGX_MODULES_C[m
[31m-echo 'ngx_module_t *ngx_modules[] = {'        >> $NGX_MODULES_C[m
[31m-[m
[31m-for mod in $modules[m
[31m-do[m
[31m-    echo "    &$mod,"                         >> $NGX_MODULES_C[m
[31m-done[m
[31m-[m
[31m-cat << END                                    >> $NGX_MODULES_C[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[31m-[m
[31m-echo 'char *ngx_module_names[] = {'           >> $NGX_MODULES_C[m
[31m-[m
[31m-for mod in $modules[m
[31m-do[m
[31m-    echo "    \"$mod\","                      >> $NGX_MODULES_C[m
[31m-done[m
[31m-[m
[31m-cat << END                                    >> $NGX_MODULES_C[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/nohave b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/nohave[m
[1mdeleted file mode 100644[m
[1mindex dfb1718..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/nohave[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $have[m
[31m-#define $have  0[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/options b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/options[m
[1mdeleted file mode 100644[m
[1mindex aed0343..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/options[m
[1m+++ /dev/null[m
[36m@@ -1,608 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-help=no[m
[31m-[m
[31m-NGX_PREFIX=[m
[31m-NGX_SBIN_PATH=[m
[31m-NGX_MODULES_PATH=[m
[31m-NGX_CONF_PREFIX=[m
[31m-NGX_CONF_PATH=[m
[31m-NGX_ERROR_LOG_PATH=[m
[31m-NGX_PID_PATH=[m
[31m-NGX_LOCK_PATH=[m
[31m-NGX_TAPSET_PREFIX=[m
[31m-NGX_STAP_NGX_PATH=[m
[31m-NGX_USER=[m
[31m-NGX_GROUP=[m
[31m-NGX_BUILD=[m
[31m-[m
[31m-CC=${CC:-cc}[m
[31m-CPP=[m
[31m-NGX_OBJS=objs[m
[31m-[m
[31m-NGX_DEBUG=NO[m
[31m-NGX_DTRACE=NO[m
[31m-DTRACE=dtrace[m
[31m-[m
[31m-DTRACE_PROBE_OBJ=YES[m
[31m-DTRACE_FROM_SYSTEMTAP=NO[m
[31m-[m
[31m-NGX_CC_OPT=[m
[31m-NGX_LD_OPT=[m
[31m-CPU=NO[m
[31m-[m
[31m-NGX_RPATH=NO[m
[31m-[m
[31m-NGX_TEST_BUILD_DEVPOLL=NO[m
[31m-NGX_TEST_BUILD_EVENTPORT=NO[m
[31m-NGX_TEST_BUILD_EPOLL=NO[m
[31m-NGX_TEST_BUILD_SOLARIS_SENDFILEV=NO[m
[31m-[m
[31m-NGX_PLATFORM=[m
[31m-NGX_WINE=[m
[31m-[m
[31m-EVENT_FOUND=NO[m
[31m-[m
[31m-EVENT_SELECT=NO[m
[31m-EVENT_POLL=NO[m
[31m-[m
[31m-USE_THREADS=NO[m
[31m-[m
[31m-NGX_FILE_AIO=NO[m
[31m-NGX_IPV6=NO[m
[31m-[m
[31m-HTTP=YES[m
[31m-[m
[31m-NGX_HTTP_LOG_PATH=[m
[31m-NGX_HTTP_CLIENT_TEMP_PATH=[m
[31m-NGX_HTTP_PROXY_TEMP_PATH=[m
[31m-NGX_HTTP_FASTCGI_TEMP_PATH=[m
[31m-NGX_HTTP_UWSGI_TEMP_PATH=[m
[31m-NGX_HTTP_SCGI_TEMP_PATH=[m
[31m-[m
[31m-HTTP_CACHE=YES[m
[31m-HTTP_CHARSET=YES[m
[31m-HTTP_GZIP=YES[m
[31m-HTTP_SSL=NO[m
[31m-HTTP_V2=NO[m
[31m-HTTP_SSI=YES[m
[31m-HTTP_POSTPONE=NO[m
[31m-HTTP_REALIP=NO[m
[31m-HTTP_XSLT=NO[m
[31m-HTTP_IMAGE_FILTER=NO[m
[31m-HTTP_SUB=NO[m
[31m-HTTP_ADDITION=NO[m
[31m-HTTP_DAV=NO[m
[31m-HTTP_ACCESS=YES[m
[31m-HTTP_AUTH_BASIC=YES[m
[31m-HTTP_AUTH_REQUEST=NO[m
[31m-HTTP_USERID=YES[m
[31m-HTTP_SLICE=NO[m
[31m-HTTP_AUTOINDEX=YES[m
[31m-HTTP_RANDOM_INDEX=NO[m
[31m-HTTP_STATUS=NO[m
[31m-HTTP_GEO=YES[m
[31m-HTTP_GEOIP=NO[m
[31m-HTTP_MAP=YES[m
[31m-HTTP_SPLIT_CLIENTS=YES[m
[31m-HTTP_REFERER=YES[m
[31m-HTTP_REWRITE=YES[m
[31m-HTTP_PROXY=YES[m
[31m-HTTP_FASTCGI=YES[m
[31m-HTTP_UWSGI=YES[m
[31m-HTTP_SCGI=YES[m
[31m-HTTP_PERL=NO[m
[31m-HTTP_MEMCACHED=YES[m
[31m-HTTP_LIMIT_CONN=YES[m
[31m-HTTP_LIMIT_REQ=YES[m
[31m-HTTP_EMPTY_GIF=YES[m
[31m-HTTP_BROWSER=YES[m
[31m-HTTP_SECURE_LINK=NO[m
[31m-HTTP_DEGRADATION=NO[m
[31m-HTTP_FLV=NO[m
[31m-HTTP_MP4=NO[m
[31m-HTTP_GUNZIP=NO[m
[31m-HTTP_GZIP_STATIC=NO[m
[31m-HTTP_UPSTREAM_HASH=YES[m
[31m-HTTP_UPSTREAM_IP_HASH=YES[m
[31m-HTTP_UPSTREAM_LEAST_CONN=YES[m
[31m-HTTP_UPSTREAM_KEEPALIVE=YES[m
[31m-HTTP_UPSTREAM_ZONE=YES[m
[31m-[m
[31m-# STUB[m
[31m-HTTP_STUB_STATUS=NO[m
[31m-[m
[31m-MAIL=NO[m
[31m-MAIL_SSL=NO[m
[31m-MAIL_POP3=YES[m
[31m-MAIL_IMAP=YES[m
[31m-MAIL_SMTP=YES[m
[31m-[m
[31m-STREAM=NO[m
[31m-STREAM_SSL=NO[m
[31m-STREAM_LIMIT_CONN=YES[m
[31m-STREAM_ACCESS=YES[m
[31m-STREAM_UPSTREAM_HASH=YES[m
[31m-STREAM_UPSTREAM_LEAST_CONN=YES[m
[31m-STREAM_UPSTREAM_ZONE=YES[m
[31m-[m
[31m-DYNAMIC_MODULES=[m
[31m-[m
[31m-NGX_ADDONS=[m
[31m-NGX_ADDON_DEPS=[m
[31m-DYNAMIC_ADDONS=[m
[31m-[m
[31m-USE_PCRE=NO[m
[31m-PCRE=NONE[m
[31m-PCRE_OPT=[m
[31m-PCRE_CONF_OPT=[m
[31m-PCRE_JIT=NO[m
[31m-[m
[31m-USE_OPENSSL=NO[m
[31m-OPENSSL=NONE[m
[31m-[m
[31m-USE_MD5=NO[m
[31m-MD5=NONE[m
[31m-MD5_OPT=[m
[31m-MD5_ASM=NO[m
[31m-[m
[31m-USE_SHA1=NO[m
[31m-SHA1=NONE[m
[31m-SHA1_OPT=[m
[31m-SHA1_ASM=NO[m
[31m-[m
[31m-USE_ZLIB=NO[m
[31m-ZLIB=NONE[m
[31m-ZLIB_OPT=[m
[31m-ZLIB_ASM=NO[m
[31m-[m
[31m-USE_PERL=NO[m
[31m-NGX_PERL=perl[m
[31m-[m
[31m-USE_LIBXSLT=NO[m
[31m-USE_LIBGD=NO[m
[31m-USE_GEOIP=NO[m
[31m-[m
[31m-NGX_GOOGLE_PERFTOOLS=NO[m
[31m-NGX_CPP_TEST=NO[m
[31m-[m
[31m-NGX_LIBATOMIC=NO[m
[31m-[m
[31m-NGX_CPU_CACHE_LINE=[m
[31m-[m
[31m-NGX_POST_CONF_MSG=[m
[31m-[m
[31m-opt=[m
[31m-[m
[31m-for option[m
[31m-do[m
[31m-    opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"[m
[31m-[m
[31m-    case "$option" in[m
[31m-        -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;[m
[31m-           *) value="" ;;[m
[31m-    esac[m
[31m-[m
[31m-    case "$option" in[m
[31m-        --help)                          help=yes                   ;;[m
[31m-[m
[31m-        --prefix=)                       NGX_PREFIX="!"             ;;[m
[31m-        --prefix=*)                      NGX_PREFIX="$value"        ;;[m
[31m-        --sbin-path=*)                   NGX_SBIN_PATH="$value"     ;;[m
[31m-        --modules-path=*)                NGX_MODULES_PATH="$value"  ;;[m
[31m-        --conf-path=*)                   NGX_CONF_PATH="$value"     ;;[m
[31m-        --error-log-path=*)              NGX_ERROR_LOG_PATH="$value";;[m
[31m-        --pid-path=*)                    NGX_PID_PATH="$value"      ;;[m
[31m-        --lock-path=*)                   NGX_LOCK_PATH="$value"     ;;[m
[31m-        --tapset-prefix=*)               NGX_TAPSET_PREFIX="$value" ;;[m
[31m-        --stap-nginx-path=*)             NGX_STAP_NGX_PATH="$value" ;;[m
[31m-        --user=*)                        NGX_USER="$value"          ;;[m
[31m-        --group=*)                       NGX_GROUP="$value"         ;;[m
[31m-[m
[31m-        --crossbuild=*)                  NGX_PLATFORM="$value"      ;;[m
[31m-[m
[31m-        --build=*)                       NGX_BUILD="$value"         ;;[m
[31m-        --builddir=*)                    NGX_OBJS="$value"          ;;[m
[31m-[m
[31m-        --with-select_module)            EVENT_SELECT=YES           ;;[m
[31m-        --without-select_module)         EVENT_SELECT=NONE          ;;[m
[31m-        --with-poll_module)              EVENT_POLL=YES             ;;[m
[31m-        --without-poll_module)           EVENT_POLL=NONE            ;;[m
[31m-[m
[31m-        --with-threads)                  USE_THREADS=YES            ;;[m
[31m-[m
[31m-        --with-file-aio)                 NGX_FILE_AIO=YES           ;;[m
[31m-        --with-ipv6)                     NGX_IPV6=YES               ;;[m
[31m-[m
[31m-        --without-http)                  HTTP=NO                    ;;[m
[31m-        --without-http-cache)            HTTP_CACHE=NO              ;;[m
[31m-[m
[31m-        --http-log-path=*)               NGX_HTTP_LOG_PATH="$value" ;;[m
[31m-        --http-client-body-temp-path=*)  NGX_HTTP_CLIENT_TEMP_PATH="$value" ;;[m
[31m-        --http-proxy-temp-path=*)        NGX_HTTP_PROXY_TEMP_PATH="$value" ;;[m
[31m-        --http-fastcgi-temp-path=*)      NGX_HTTP_FASTCGI_TEMP_PATH="$value" ;;[m
[31m-        --http-uwsgi-temp-path=*)        NGX_HTTP_UWSGI_TEMP_PATH="$value" ;;[m
[31m-        --http-scgi-temp-path=*)         NGX_HTTP_SCGI_TEMP_PATH="$value" ;;[m
[31m-[m
[31m-        --with-http_ssl_module)          HTTP_SSL=YES               ;;[m
[31m-        --with-http_v2_module)           HTTP_V2=YES                ;;[m
[31m-        --with-http_realip_module)       HTTP_REALIP=YES            ;;[m
[31m-        --with-http_addition_module)     HTTP_ADDITION=YES          ;;[m
[31m-        --with-http_xslt_module)         HTTP_XSLT=YES              ;;[m
[31m-        --with-http_xslt_module=dynamic) HTTP_XSLT=DYNAMIC          ;;[m
[31m-        --with-http_image_filter_module) HTTP_IMAGE_FILTER=YES      ;;[m
[31m-        --with-http_image_filter_module=dynamic)[m
[31m-                                         HTTP_IMAGE_FILTER=DYNAMIC  ;;[m
[31m-        --with-http_geoip_module)        HTTP_GEOIP=YES             ;;[m
[31m-        --with-http_geoip_module=dynamic)[m
[31m-                                         HTTP_GEOIP=DYNAMIC         ;;[m
[31m-        --with-http_sub_module)          HTTP_SUB=YES               ;;[m
[31m-        --with-http_dav_module)          HTTP_DAV=YES               ;;[m
[31m-        --with-http_flv_module)          HTTP_FLV=YES               ;;[m
[31m-        --with-http_mp4_module)          HTTP_MP4=YES               ;;[m
[31m-        --with-http_gunzip_module)       HTTP_GUNZIP=YES            ;;[m
[31m-        --with-http_gzip_static_module)  HTTP_GZIP_STATIC=YES       ;;[m
[31m-        --with-http_auth_request_module) HTTP_AUTH_REQUEST=YES      ;;[m
[31m-        --with-http_random_index_module) HTTP_RANDOM_INDEX=YES      ;;[m
[31m-        --with-http_secure_link_module)  HTTP_SECURE_LINK=YES       ;;[m
[31m-        --with-http_degradation_module)  HTTP_DEGRADATION=YES       ;;[m
[31m-        --with-http_slice_module)        HTTP_SLICE=YES             ;;[m
[31m-[m
[31m-        --without-http_charset_module)   HTTP_CHARSET=NO            ;;[m
[31m-        --without-http_gzip_module)      HTTP_GZIP=NO               ;;[m
[31m-        --without-http_ssi_module)       HTTP_SSI=NO                ;;[m
[31m-        --without-http_userid_module)    HTTP_USERID=NO             ;;[m
[31m-        --without-http_access_module)    HTTP_ACCESS=NO             ;;[m
[31m-        --without-http_auth_basic_module) HTTP_AUTH_BASIC=NO        ;;[m
[31m-        --without-http_autoindex_module) HTTP_AUTOINDEX=NO          ;;[m
[31m-        --without-http_status_module)    HTTP_STATUS=NO             ;;[m
[31m-        --without-http_geo_module)       HTTP_GEO=NO                ;;[m
[31m-        --without-http_map_module)       HTTP_MAP=NO                ;;[m
[31m-        --without-http_split_clients_module) HTTP_SPLIT_CLIENTS=NO  ;;[m
[31m-        --without-http_referer_module)   HTTP_REFERER=NO            ;;[m
[31m-        --without-http_rewrite_module)   HTTP_REWRITE=NO            ;;[m
[31m-        --without-http_proxy_module)     HTTP_PROXY=NO              ;;[m
[31m-        --without-http_fastcgi_module)   HTTP_FASTCGI=NO            ;;[m
[31m-        --without-http_uwsgi_module)     HTTP_UWSGI=NO              ;;[m
[31m-        --without-http_scgi_module)      HTTP_SCGI=NO               ;;[m
[31m-        --without-http_memcached_module) HTTP_MEMCACHED=NO          ;;[m
[31m-        --without-http_limit_conn_module) HTTP_LIMIT_CONN=NO        ;;[m
[31m-        --without-http_limit_req_module) HTTP_LIMIT_REQ=NO         ;;[m
[31m-        --without-http_empty_gif_module) HTTP_EMPTY_GIF=NO          ;;[m
[31m-        --without-http_browser_module)   HTTP_BROWSER=NO            ;;[m
[31m-        --without-http_upstream_hash_module) HTTP_UPSTREAM_HASH=NO  ;;[m
[31m-        --without-http_upstream_ip_hash_module) HTTP_UPSTREAM_IP_HASH=NO ;;[m
[31m-        --without-http_upstream_least_conn_module)[m
[31m-                                         HTTP_UPSTREAM_LEAST_CONN=NO ;;[m
[31m-        --without-http_upstream_keepalive_module) HTTP_UPSTREAM_KEEPALIVE=NO ;;[m
[31m-        --without-http_upstream_zone_module) HTTP_UPSTREAM_ZONE=NO  ;;[m
[31m-[m
[31m-        --with-http_perl_module)         HTTP_PERL=YES              ;;[m
[31m-        --with-http_perl_module=dynamic) HTTP_PERL=DYNAMIC          ;;[m
[31m-        --with-perl_modules_path=*)      NGX_PERL_MODULES="$value"  ;;[m
[31m-        --with-perl=*)                   NGX_PERL="$value"          ;;[m
[31m-[m
[31m-        # STUB[m
[31m-        --with-http_stub_status_module)  HTTP_STUB_STATUS=YES       ;;[m
[31m-[m
[31m-        --with-mail)                     MAIL=YES                   ;;[m
[31m-        --with-mail=dynamic)             MAIL=DYNAMIC               ;;[m
[31m-        --with-mail_ssl_module)          MAIL_SSL=YES               ;;[m
[31m-        # STUB[m
[31m-        --with-imap)[m
[31m-            MAIL=YES[m
[31m-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG[m
[31m-$0: warning: the \"--with-imap\" option is deprecated, \[m
[31m-use the \"--with-mail\" option instead"[m
[31m-        ;;[m
[31m-        --with-imap_ssl_module)[m
[31m-            MAIL_SSL=YES[m
[31m-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG[m
[31m-$0: warning: the \"--with-imap_ssl_module\" option is deprecated, \[m
[31m-use the \"--with-mail_ssl_module\" option instead"[m
[31m-        ;;[m
[31m-        --without-mail_pop3_module)      MAIL_POP3=NO               ;;[m
[31m-        --without-mail_imap_module)      MAIL_IMAP=NO               ;;[m
[31m-        --without-mail_smtp_module)      MAIL_SMTP=NO               ;;[m
[31m-[m
[31m-        --with-stream)                   STREAM=YES                 ;;[m
[31m-        --with-stream=dynamic)           STREAM=DYNAMIC             ;;[m
[31m-        --with-stream_ssl_module)        STREAM_SSL=YES             ;;[m
[31m-        --without-stream_limit_conn_module)[m
[31m-                                         STREAM_LIMIT_CONN=NO       ;;[m
[31m-        --without-stream_access_module)  STREAM_ACCESS=NO           ;;[m
[31m-        --without-stream_upstream_hash_module)[m
[31m-                                         STREAM_UPSTREAM_HASH=NO    ;;[m
[31m-        --without-stream_upstream_least_conn_module)[m
[31m-                                         STREAM_UPSTREAM_LEAST_CONN=NO ;;[m
[31m-        --without-stream_upstream_zone_module)[m
[31m-                                         STREAM_UPSTREAM_ZONE=NO    ;;[m
[31m-[m
[31m-        --with-google_perftools_module)  NGX_GOOGLE_PERFTOOLS=YES   ;;[m
[31m-        --with-cpp_test_module)          NGX_CPP_TEST=YES           ;;[m
[31m-[m
[31m-        --add-module=*)                  NGX_ADDONS="$NGX_ADDONS $value" ;;[m
[31m-        --add-dynamic-module=*)          DYNAMIC_ADDONS="$DYNAMIC_ADDONS $value" ;;[m
[31m-[m
[31m-        --with-cc=*)                     CC="$value"                ;;[m
[31m-        --with-cpp=*)                    CPP="$value"               ;;[m
[31m-        --with-cc-opt=*)                 NGX_CC_OPT="$value"        ;;[m
[31m-        --with-ld-opt=*)                 NGX_LD_OPT="$value"        ;;[m
[31m-        --with-cpu-opt=*)                CPU="$value"               ;;[m
[31m-        --with-debug)                    NGX_DEBUG=YES              ;;[m
[31m-        --with-dtrace=*)                 DTRACE="$value"            ;;[m
[31m-        --with-dtrace-probes)            NGX_DTRACE=YES             ;;[m
[31m-        --without-pcre)                  USE_PCRE=DISABLED          ;;[m
[31m-        --with-pcre)                     USE_PCRE=YES               ;;[m
[31m-        --with-pcre=*)                   PCRE="$value"              ;;[m
[31m-        --with-pcre-opt=*)               PCRE_OPT="$value"          ;;[m
[31m-        --with-pcre-conf-opt=*)          PCRE_CONF_OPT="$value"     ;;[m
[31m-        --with-pcre-jit)                 PCRE_JIT=YES               ;;[m
[31m-[m
[31m-        --with-openssl=*)                OPENSSL="$value"           ;;[m
[31m-        --with-openssl-opt=*)            OPENSSL_OPT="$value"       ;;[m
[31m-[m
[31m-        --with-md5=*)                    MD5="$value"               ;;[m
[31m-        --with-md5-opt=*)                MD5_OPT="$value"           ;;[m
[31m-        --with-md5-asm)                  MD5_ASM=YES                ;;[m
[31m-[m
[31m-        --with-sha1=*)                   SHA1="$value"              ;;[m
[31m-        --with-sha1-opt=*)               SHA1_OPT="$value"          ;;[m
[31m-        --with-sha1-asm)                 SHA1_ASM=YES               ;;[m
[31m-[m
[31m-        --with-zlib=*)                   ZLIB="$value"              ;;[m
[31m-        --with-zlib-opt=*)               ZLIB_OPT="$value"          ;;[m
[31m-        --with-zlib-asm=*)               ZLIB_ASM="$value"          ;;[m
[31m-[m
[31m-        --with-libatomic)                NGX_LIBATOMIC=YES          ;;[m
[31m-        --with-libatomic=*)              NGX_LIBATOMIC="$value"     ;;[m
[31m-[m
[31m-        --test-build-devpoll)            NGX_TEST_BUILD_DEVPOLL=YES ;;[m
[31m-        --test-build-eventport)          NGX_TEST_BUILD_EVENTPORT=YES ;;[m
[31m-        --test-build-epoll)              NGX_TEST_BUILD_EPOLL=YES   ;;[m
[31m-        --test-build-solaris-sendfilev)  NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;;[m
[31m-[m
[31m-        *)[m
[31m-            echo "$0: error: invalid option \"$option\""[m
[31m-            exit 1[m
[31m-        ;;[m
[31m-    esac[m
[31m-done[m
[31m-[m
[31m-[m
[31m-NGX_CONFIGURE="$opt"[m
[31m-[m
[31m-[m
[31m-if [ $help = yes ]; then[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-  --help                             print this message[m
[31m-[m
[31m-  --prefix=PATH                      set installation prefix[m
[31m-  --sbin-path=PATH                   set nginx binary pathname[m
[31m-  --modules-path=PATH                set modules path[m
[31m-  --conf-path=PATH                   set nginx.conf pathname[m
[31m-  --error-log-path=PATH              set error log pathname[m
[31m-  --pid-path=PATH                    set nginx.pid pathname[m
[31m-  --lock-path=PATH                   set nginx.lock pathname[m
[31m-  --tapset-prefix=PATH               set systemtap tapset directory prefix[m
[31m-  --stap-nginx-path=PATH             set stap-nginx pathname[m
[31m-[m
[31m-  --user=USER                        set non-privileged user for[m
[31m-                                     worker processes[m
[31m-  --group=GROUP                      set non-privileged group for[m
[31m-                                     worker processes[m
[31m-[m
[31m-  --build=NAME                       set build name[m
[31m-  --builddir=DIR                     set build directory[m
[31m-[m
[31m-  --with-select_module               enable select module[m
[31m-  --without-select_module            disable select module[m
[31m-  --with-poll_module                 enable poll module[m
[31m-  --without-poll_module              disable poll module[m
[31m-[m
[31m-  --with-threads                     enable thread pool support[m
[31m-[m
[31m-  --with-file-aio                    enable file AIO support[m
[31m-  --with-ipv6                        enable IPv6 support[m
[31m-[m
[31m-  --with-http_ssl_module             enable ngx_http_ssl_module[m
[31m-  --with-http_v2_module              enable ngx_http_v2_module[m
[31m-  --with-http_realip_module          enable ngx_http_realip_module[m
[31m-  --with-http_addition_module        enable ngx_http_addition_module[m
[31m-  --with-http_xslt_module            enable ngx_http_xslt_module[m
[31m-  --with-http_xslt_module=dynamic    enable dynamic ngx_http_xslt_module[m
[31m-  --with-http_image_filter_module    enable ngx_http_image_filter_module[m
[31m-  --with-http_image_filter_module=dynamic[m
[31m-                                     enable dynamic ngx_http_image_filter_module[m
[31m-  --with-http_geoip_module           enable ngx_http_geoip_module[m
[31m-  --with-http_geoip_module=dynamic   enable dynamic ngx_http_geoip_module[m
[31m-  --with-http_sub_module             enable ngx_http_sub_module[m
[31m-  --with-http_dav_module             enable ngx_http_dav_module[m
[31m-  --with-http_flv_module             enable ngx_http_flv_module[m
[31m-  --with-http_mp4_module             enable ngx_http_mp4_module[m
[31m-  --with-http_gunzip_module          enable ngx_http_gunzip_module[m
[31m-  --with-http_gzip_static_module     enable ngx_http_gzip_static_module[m
[31m-  --with-http_auth_request_module    enable ngx_http_auth_request_module[m
[31m-  --with-http_random_index_module    enable ngx_http_random_index_module[m
[31m-  --with-http_secure_link_module     enable ngx_http_secure_link_module[m
[31m-  --with-http_degradation_module     enable ngx_http_degradation_module[m
[31m-  --with-http_slice_module           enable ngx_http_slice_module[m
[31m-  --with-http_stub_status_module     enable ngx_http_stub_status_module[m
[31m-[m
[31m-  --without-http_charset_module      disable ngx_http_charset_module[m
[31m-  --without-http_gzip_module         disable ngx_http_gzip_module[m
[31m-  --without-http_ssi_module          disable ngx_http_ssi_module[m
[31m-  --without-http_userid_module       disable ngx_http_userid_module[m
[31m-  --without-http_access_module       disable ngx_http_access_module[m
[31m-  --without-http_auth_basic_module   disable ngx_http_auth_basic_module[m
[31m-  --without-http_autoindex_module    disable ngx_http_autoindex_module[m
[31m-  --without-http_geo_module          disable ngx_http_geo_module[m
[31m-  --without-http_map_module          disable ngx_http_map_module[m
[31m-  --without-http_split_clients_module disable ngx_http_split_clients_module[m
[31m-  --without-http_referer_module      disable ngx_http_referer_module[m
[31m-  --without-http_rewrite_module      disable ngx_http_rewrite_module[m
[31m-  --without-http_proxy_module        disable ngx_http_proxy_module[m
[31m-  --without-http_fastcgi_module      disable ngx_http_fastcgi_module[m
[31m-  --without-http_uwsgi_module        disable ngx_http_uwsgi_module[m
[31m-  --without-http_scgi_module         disable ngx_http_scgi_module[m
[31m-  --without-http_memcached_module    disable ngx_http_memcached_module[m
[31m-  --without-http_limit_conn_module   disable ngx_http_limit_conn_module[m
[31m-  --without-http_limit_req_module    disable ngx_http_limit_req_module[m
[31m-  --without-http_empty_gif_module    disable ngx_http_empty_gif_module[m
[31m-  --without-http_browser_module      disable ngx_http_browser_module[m
[31m-  --without-http_upstream_hash_module[m
[31m-                                     disable ngx_http_upstream_hash_module[m
[31m-  --without-http_upstream_ip_hash_module[m
[31m-                                     disable ngx_http_upstream_ip_hash_module[m
[31m-  --without-http_upstream_least_conn_module[m
[31m-                                     disable ngx_http_upstream_least_conn_module[m
[31m-  --without-http_upstream_keepalive_module[m
[31m-                                     disable ngx_http_upstream_keepalive_module[m
[31m-  --without-http_upstream_zone_module[m
[31m-                                     disable ngx_http_upstream_zone_module[m
[31m-[m
[31m-  --with-http_perl_module            enable ngx_http_perl_module[m
[31m-  --with-http_perl_module=dynamic    enable dynamic ngx_http_perl_module[m
[31m-  --with-perl_modules_path=PATH      set Perl modules path[m
[31m-  --with-perl=PATH                   set perl binary pathname[m
[31m-[m
[31m-  --http-log-path=PATH               set http access log pathname[m
[31m-  --http-client-body-temp-path=PATH  set path to store[m
[31m-                                     http client request body temporary files[m
[31m-  --http-proxy-temp-path=PATH        set path to store[m
[31m-                                     http proxy temporary files[m
[31m-  --http-fastcgi-temp-path=PATH      set path to store[m
[31m-                                     http fastcgi temporary files[m
[31m-  --http-uwsgi-temp-path=PATH        set path to store[m
[31m-                                     http uwsgi temporary files[m
[31m-  --http-scgi-temp-path=PATH         set path to store[m
[31m-                                     http scgi temporary files[m
[31m-[m
[31m-  --without-http                     disable HTTP server[m
[31m-  --without-http-cache               disable HTTP cache[m
[31m-[m
[31m-  --with-mail                        enable POP3/IMAP4/SMTP proxy module[m
[31m-  --with-mail=dynamic                enable dynamic POP3/IMAP4/SMTP proxy module[m
[31m-  --with-mail_ssl_module             enable ngx_mail_ssl_module[m
[31m-  --without-mail_pop3_module         disable ngx_mail_pop3_module[m
[31m-  --without-mail_imap_module         disable ngx_mail_imap_module[m
[31m-  --without-mail_smtp_module         disable ngx_mail_smtp_module[m
[31m-[m
[31m-  --with-stream                      enable TCP/UDP proxy module[m
[31m-  --with-stream=dynamic              enable dynamic TCP/UDP proxy module[m
[31m-  --with-stream_ssl_module           enable ngx_stream_ssl_module[m
[31m-  --without-stream_limit_conn_module disable ngx_stream_limit_conn_module[m
[31m-  --without-stream_access_module     disable ngx_stream_access_module[m
[31m-  --without-stream_upstream_hash_module[m
[31m-                                     disable ngx_stream_upstream_hash_module[m
[31m-  --without-stream_upstream_least_conn_module[m
[31m-                                     disable ngx_stream_upstream_least_conn_module[m
[31m-  --without-stream_upstream_zone_module[m
[31m-                                     disable ngx_stream_upstream_zone_module[m
[31m-[m
[31m-  --with-google_perftools_module     enable ngx_google_perftools_module[m
[31m-  --with-cpp_test_module             enable ngx_cpp_test_module[m
[31m-[m
[31m-  --add-module=PATH                  enable external module[m
[31m-  --add-dynamic-module=PATH          enable dynamic external module[m
[31m-[m
[31m-  --with-cc=PATH                     set C compiler pathname[m
[31m-  --with-cpp=PATH                    set C preprocessor pathname[m
[31m-  --with-cc-opt=OPTIONS              set additional C compiler options[m
[31m-  --with-ld-opt=OPTIONS              set additional linker options[m
[31m-  --with-cpu-opt=CPU                 build for the specified CPU, valid values:[m
[31m-                                     pentium, pentiumpro, pentium3, pentium4,[m
[31m-                                     athlon, opteron, sparc32, sparc64, ppc64[m
[31m-[m
[31m-  --without-pcre                     disable PCRE library usage[m
[31m-  --with-pcre                        force PCRE library usage[m
[31m-  --with-pcre=DIR                    set path to PCRE library sources[m
[31m-  --with-pcre-opt=OPTIONS            set additional build options for PCRE[m
[31m-  --with-pcre-conf-opt=OPTIONS       set additional configure options for PCRE[m
[31m-  --with-pcre-jit                    build PCRE with JIT compilation support[m
[31m-[m
[31m-  --with-md5=DIR                     set path to md5 library sources[m
[31m-  --with-md5-opt=OPTIONS             set additional build options for md5[m
[31m-  --with-md5-asm                     use md5 assembler sources[m
[31m-[m
[31m-  --with-sha1=DIR                    set path to sha1 library sources[m
[31m-  --with-sha1-opt=OPTIONS            set additional build options for sha1[m
[31m-  --with-sha1-asm                    use sha1 assembler sources[m
[31m-[m
[31m-  --with-zlib=DIR                    set path to zlib library sources[m
[31m-  --with-zlib-opt=OPTIONS            set additional build options for zlib[m
[31m-  --with-zlib-asm=CPU                use zlib assembler sources optimized[m
[31m-                                     for the specified CPU, valid values:[m
[31m-                                     pentium, pentiumpro[m
[31m-[m
[31m-  --with-libatomic                   force libatomic_ops library usage[m
[31m-  --with-libatomic=DIR               set path to libatomic_ops library sources[m
[31m-[m
[31m-  --with-openssl=DIR                 set path to OpenSSL library sources[m
[31m-  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL[m
[31m-[m
[31m-  --with-debug                       enable debug logging[m
[31m-  --with-dtrace-probes               enable dtrace USDT probes[m
[31m-  --with-dtrace=PATH                 set dtrace utility pathname[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP = NO ]; then[m
[31m-    HTTP_CHARSET=NO[m
[31m-    HTTP_GZIP=NO[m
[31m-    HTTP_SSI=NO[m
[31m-    HTTP_USERID=NO[m
[31m-    HTTP_ACCESS=NO[m
[31m-    HTTP_STATUS=NO[m
[31m-    HTTP_REWRITE=NO[m
[31m-    HTTP_PROXY=NO[m
[31m-    HTTP_FASTCGI=NO[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ ".$NGX_PLATFORM" = ".win32" ]; then[m
[31m-    NGX_WINE=$WINE[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx}[m
[31m-NGX_MODULES_PATH=${NGX_MODULES_PATH:-modules}[m
[31m-NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}[m
[31m-NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`[m
[31m-NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}[m
[31m-NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}[m
[31m-NGX_TAPSET_PREFIX=${NGX_TAPSET_PREFIX:-tapset}[m
[31m-[m
[31m-if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then[m
[31m-    NGX_ERROR_LOG_PATH=[m
[31m-else[m
[31m-    NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}[m
[31m-fi[m
[31m-[m
[31m-NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log}[m
[31m-NGX_HTTP_CLIENT_TEMP_PATH=${NGX_HTTP_CLIENT_TEMP_PATH:-client_body_temp}[m
[31m-NGX_HTTP_PROXY_TEMP_PATH=${NGX_HTTP_PROXY_TEMP_PATH:-proxy_temp}[m
[31m-NGX_HTTP_FASTCGI_TEMP_PATH=${NGX_HTTP_FASTCGI_TEMP_PATH:-fastcgi_temp}[m
[31m-NGX_HTTP_UWSGI_TEMP_PATH=${NGX_HTTP_UWSGI_TEMP_PATH:-uwsgi_temp}[m
[31m-NGX_HTTP_SCGI_TEMP_PATH=${NGX_HTTP_SCGI_TEMP_PATH:-scgi_temp}[m
[31m-[m
[31m-case ".$NGX_PERL_MODULES" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES[m
[31m-    ;;[m
[31m-esac[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/options.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/options.orig[m
[1mdeleted file mode 100644[m
[1mindex ba6f2b2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/options.orig[m
[1m+++ /dev/null[m
[36m@@ -1,606 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-help=no[m
[31m-[m
[31m-NGX_PREFIX=[m
[31m-NGX_SBIN_PATH=[m
[31m-NGX_MODULES_PATH=[m
[31m-NGX_CONF_PREFIX=[m
[31m-NGX_CONF_PATH=[m
[31m-NGX_ERROR_LOG_PATH=[m
[31m-NGX_PID_PATH=[m
[31m-NGX_LOCK_PATH=[m
[31m-NGX_TAPSET_PREFIX=[m
[31m-NGX_STAP_NGX_PATH=[m
[31m-NGX_USER=[m
[31m-NGX_GROUP=[m
[31m-NGX_BUILD=[m
[31m-[m
[31m-CC=${CC:-cc}[m
[31m-CPP=[m
[31m-NGX_OBJS=objs[m
[31m-[m
[31m-NGX_DEBUG=NO[m
[31m-NGX_DTRACE=NO[m
[31m-DTRACE=dtrace[m
[31m-[m
[31m-DTRACE_PROBE_OBJ=YES[m
[31m-DTRACE_FROM_SYSTEMTAP=NO[m
[31m-[m
[31m-NGX_CC_OPT=[m
[31m-NGX_LD_OPT=[m
[31m-CPU=NO[m
[31m-[m
[31m-NGX_RPATH=NO[m
[31m-[m
[31m-NGX_TEST_BUILD_DEVPOLL=NO[m
[31m-NGX_TEST_BUILD_EVENTPORT=NO[m
[31m-NGX_TEST_BUILD_EPOLL=NO[m
[31m-NGX_TEST_BUILD_SOLARIS_SENDFILEV=NO[m
[31m-[m
[31m-NGX_PLATFORM=[m
[31m-NGX_WINE=[m
[31m-[m
[31m-EVENT_FOUND=NO[m
[31m-[m
[31m-EVENT_SELECT=NO[m
[31m-EVENT_POLL=NO[m
[31m-[m
[31m-USE_THREADS=NO[m
[31m-[m
[31m-NGX_FILE_AIO=NO[m
[31m-NGX_IPV6=NO[m
[31m-[m
[31m-HTTP=YES[m
[31m-[m
[31m-NGX_HTTP_LOG_PATH=[m
[31m-NGX_HTTP_CLIENT_TEMP_PATH=[m
[31m-NGX_HTTP_PROXY_TEMP_PATH=[m
[31m-NGX_HTTP_FASTCGI_TEMP_PATH=[m
[31m-NGX_HTTP_UWSGI_TEMP_PATH=[m
[31m-NGX_HTTP_SCGI_TEMP_PATH=[m
[31m-[m
[31m-HTTP_CACHE=YES[m
[31m-HTTP_CHARSET=YES[m
[31m-HTTP_GZIP=YES[m
[31m-HTTP_SSL=NO[m
[31m-HTTP_V2=NO[m
[31m-HTTP_SSI=YES[m
[31m-HTTP_POSTPONE=NO[m
[31m-HTTP_REALIP=NO[m
[31m-HTTP_XSLT=NO[m
[31m-HTTP_IMAGE_FILTER=NO[m
[31m-HTTP_SUB=NO[m
[31m-HTTP_ADDITION=NO[m
[31m-HTTP_DAV=NO[m
[31m-HTTP_ACCESS=YES[m
[31m-HTTP_AUTH_BASIC=YES[m
[31m-HTTP_AUTH_REQUEST=NO[m
[31m-HTTP_USERID=YES[m
[31m-HTTP_SLICE=NO[m
[31m-HTTP_AUTOINDEX=YES[m
[31m-HTTP_RANDOM_INDEX=NO[m
[31m-HTTP_STATUS=NO[m
[31m-HTTP_GEO=YES[m
[31m-HTTP_GEOIP=NO[m
[31m-HTTP_MAP=YES[m
[31m-HTTP_SPLIT_CLIENTS=YES[m
[31m-HTTP_REFERER=YES[m
[31m-HTTP_REWRITE=YES[m
[31m-HTTP_PROXY=YES[m
[31m-HTTP_FASTCGI=YES[m
[31m-HTTP_UWSGI=YES[m
[31m-HTTP_SCGI=YES[m
[31m-HTTP_PERL=NO[m
[31m-HTTP_MEMCACHED=YES[m
[31m-HTTP_LIMIT_CONN=YES[m
[31m-HTTP_LIMIT_REQ=YES[m
[31m-HTTP_EMPTY_GIF=YES[m
[31m-HTTP_BROWSER=YES[m
[31m-HTTP_SECURE_LINK=NO[m
[31m-HTTP_DEGRADATION=NO[m
[31m-HTTP_FLV=NO[m
[31m-HTTP_MP4=NO[m
[31m-HTTP_GUNZIP=NO[m
[31m-HTTP_GZIP_STATIC=NO[m
[31m-HTTP_UPSTREAM_HASH=YES[m
[31m-HTTP_UPSTREAM_IP_HASH=YES[m
[31m-HTTP_UPSTREAM_LEAST_CONN=YES[m
[31m-HTTP_UPSTREAM_KEEPALIVE=YES[m
[31m-HTTP_UPSTREAM_ZONE=YES[m
[31m-[m
[31m-# STUB[m
[31m-HTTP_STUB_STATUS=NO[m
[31m-[m
[31m-MAIL=NO[m
[31m-MAIL_SSL=NO[m
[31m-MAIL_POP3=YES[m
[31m-MAIL_IMAP=YES[m
[31m-MAIL_SMTP=YES[m
[31m-[m
[31m-STREAM=NO[m
[31m-STREAM_SSL=NO[m
[31m-STREAM_LIMIT_CONN=YES[m
[31m-STREAM_ACCESS=YES[m
[31m-STREAM_UPSTREAM_HASH=YES[m
[31m-STREAM_UPSTREAM_LEAST_CONN=YES[m
[31m-STREAM_UPSTREAM_ZONE=YES[m
[31m-[m
[31m-DYNAMIC_MODULES=[m
[31m-[m
[31m-NGX_ADDONS=[m
[31m-NGX_ADDON_DEPS=[m
[31m-DYNAMIC_ADDONS=[m
[31m-[m
[31m-USE_PCRE=NO[m
[31m-PCRE=NONE[m
[31m-PCRE_OPT=[m
[31m-PCRE_CONF_OPT=[m
[31m-PCRE_JIT=NO[m
[31m-[m
[31m-USE_OPENSSL=NO[m
[31m-OPENSSL=NONE[m
[31m-[m
[31m-USE_MD5=NO[m
[31m-MD5=NONE[m
[31m-MD5_OPT=[m
[31m-MD5_ASM=NO[m
[31m-[m
[31m-USE_SHA1=NO[m
[31m-SHA1=NONE[m
[31m-SHA1_OPT=[m
[31m-SHA1_ASM=NO[m
[31m-[m
[31m-USE_ZLIB=NO[m
[31m-ZLIB=NONE[m
[31m-ZLIB_OPT=[m
[31m-ZLIB_ASM=NO[m
[31m-[m
[31m-USE_PERL=NO[m
[31m-NGX_PERL=perl[m
[31m-[m
[31m-USE_LIBXSLT=NO[m
[31m-USE_LIBGD=NO[m
[31m-USE_GEOIP=NO[m
[31m-[m
[31m-NGX_GOOGLE_PERFTOOLS=NO[m
[31m-NGX_CPP_TEST=NO[m
[31m-[m
[31m-NGX_LIBATOMIC=NO[m
[31m-[m
[31m-NGX_CPU_CACHE_LINE=[m
[31m-[m
[31m-NGX_POST_CONF_MSG=[m
[31m-[m
[31m-opt=[m
[31m-[m
[31m-for option[m
[31m-do[m
[31m-    opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"[m
[31m-[m
[31m-    case "$option" in[m
[31m-        -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;[m
[31m-           *) value="" ;;[m
[31m-    esac[m
[31m-[m
[31m-    case "$option" in[m
[31m-        --help)                          help=yes                   ;;[m
[31m-[m
[31m-        --prefix=)                       NGX_PREFIX="!"             ;;[m
[31m-        --prefix=*)                      NGX_PREFIX="$value"        ;;[m
[31m-        --sbin-path=*)                   NGX_SBIN_PATH="$value"     ;;[m
[31m-        --modules-path=*)                NGX_MODULES_PATH="$value"  ;;[m
[31m-        --conf-path=*)                   NGX_CONF_PATH="$value"     ;;[m
[31m-        --error-log-path=*)              NGX_ERROR_LOG_PATH="$value";;[m
[31m-        --pid-path=*)                    NGX_PID_PATH="$value"      ;;[m
[31m-        --lock-path=*)                   NGX_LOCK_PATH="$value"     ;;[m
[31m-        --tapset-prefix=*)               NGX_TAPSET_PREFIX="$value" ;;[m
[31m-        --stap-nginx-path=*)             NGX_STAP_NGX_PATH="$value" ;;[m
[31m-        --user=*)                        NGX_USER="$value"          ;;[m
[31m-        --group=*)                       NGX_GROUP="$value"         ;;[m
[31m-[m
[31m-        --crossbuild=*)                  NGX_PLATFORM="$value"      ;;[m
[31m-[m
[31m-        --build=*)                       NGX_BUILD="$value"         ;;[m
[31m-        --builddir=*)                    NGX_OBJS="$value"          ;;[m
[31m-[m
[31m-        --with-select_module)            EVENT_SELECT=YES           ;;[m
[31m-        --without-select_module)         EVENT_SELECT=NONE          ;;[m
[31m-        --with-poll_module)              EVENT_POLL=YES             ;;[m
[31m-        --without-poll_module)           EVENT_POLL=NONE            ;;[m
[31m-[m
[31m-        --with-threads)                  USE_THREADS=YES            ;;[m
[31m-[m
[31m-        --with-file-aio)                 NGX_FILE_AIO=YES           ;;[m
[31m-        --with-ipv6)                     NGX_IPV6=YES               ;;[m
[31m-[m
[31m-        --without-http)                  HTTP=NO                    ;;[m
[31m-        --without-http-cache)            HTTP_CACHE=NO              ;;[m
[31m-[m
[31m-        --http-log-path=*)               NGX_HTTP_LOG_PATH="$value" ;;[m
[31m-        --http-client-body-temp-path=*)  NGX_HTTP_CLIENT_TEMP_PATH="$value" ;;[m
[31m-        --http-proxy-temp-path=*)        NGX_HTTP_PROXY_TEMP_PATH="$value" ;;[m
[31m-        --http-fastcgi-temp-path=*)      NGX_HTTP_FASTCGI_TEMP_PATH="$value" ;;[m
[31m-        --http-uwsgi-temp-path=*)        NGX_HTTP_UWSGI_TEMP_PATH="$value" ;;[m
[31m-        --http-scgi-temp-path=*)         NGX_HTTP_SCGI_TEMP_PATH="$value" ;;[m
[31m-[m
[31m-        --with-http_ssl_module)          HTTP_SSL=YES               ;;[m
[31m-        --with-http_v2_module)           HTTP_V2=YES                ;;[m
[31m-        --with-http_realip_module)       HTTP_REALIP=YES            ;;[m
[31m-        --with-http_addition_module)     HTTP_ADDITION=YES          ;;[m
[31m-        --with-http_xslt_module)         HTTP_XSLT=YES              ;;[m
[31m-        --with-http_xslt_module=dynamic) HTTP_XSLT=DYNAMIC          ;;[m
[31m-        --with-http_image_filter_module) HTTP_IMAGE_FILTER=YES      ;;[m
[31m-        --with-http_image_filter_module=dynamic)[m
[31m-                                         HTTP_IMAGE_FILTER=DYNAMIC  ;;[m
[31m-        --with-http_geoip_module)        HTTP_GEOIP=YES             ;;[m
[31m-        --with-http_geoip_module=dynamic)[m
[31m-                                         HTTP_GEOIP=DYNAMIC         ;;[m
[31m-        --with-http_sub_module)          HTTP_SUB=YES               ;;[m
[31m-        --with-http_dav_module)          HTTP_DAV=YES               ;;[m
[31m-        --with-http_flv_module)          HTTP_FLV=YES               ;;[m
[31m-        --with-http_mp4_module)          HTTP_MP4=YES               ;;[m
[31m-        --with-http_gunzip_module)       HTTP_GUNZIP=YES            ;;[m
[31m-        --with-http_gzip_static_module)  HTTP_GZIP_STATIC=YES       ;;[m
[31m-        --with-http_auth_request_module) HTTP_AUTH_REQUEST=YES      ;;[m
[31m-        --with-http_random_index_module) HTTP_RANDOM_INDEX=YES      ;;[m
[31m-        --with-http_secure_link_module)  HTTP_SECURE_LINK=YES       ;;[m
[31m-        --with-http_degradation_module)  HTTP_DEGRADATION=YES       ;;[m
[31m-        --with-http_slice_module)        HTTP_SLICE=YES             ;;[m
[31m-[m
[31m-        --without-http_charset_module)   HTTP_CHARSET=NO            ;;[m
[31m-        --without-http_gzip_module)      HTTP_GZIP=NO               ;;[m
[31m-        --without-http_ssi_module)       HTTP_SSI=NO                ;;[m
[31m-        --without-http_userid_module)    HTTP_USERID=NO             ;;[m
[31m-        --without-http_access_module)    HTTP_ACCESS=NO             ;;[m
[31m-        --without-http_auth_basic_module) HTTP_AUTH_BASIC=NO        ;;[m
[31m-        --without-http_autoindex_module) HTTP_AUTOINDEX=NO          ;;[m
[31m-        --without-http_status_module)    HTTP_STATUS=NO             ;;[m
[31m-        --without-http_geo_module)       HTTP_GEO=NO                ;;[m
[31m-        --without-http_map_module)       HTTP_MAP=NO                ;;[m
[31m-        --without-http_split_clients_module) HTTP_SPLIT_CLIENTS=NO  ;;[m
[31m-        --without-http_referer_module)   HTTP_REFERER=NO            ;;[m
[31m-        --without-http_rewrite_module)   HTTP_REWRITE=NO            ;;[m
[31m-        --without-http_proxy_module)     HTTP_PROXY=NO              ;;[m
[31m-        --without-http_fastcgi_module)   HTTP_FASTCGI=NO            ;;[m
[31m-        --without-http_uwsgi_module)     HTTP_UWSGI=NO              ;;[m
[31m-        --without-http_scgi_module)      HTTP_SCGI=NO               ;;[m
[31m-        --without-http_memcached_module) HTTP_MEMCACHED=NO          ;;[m
[31m-        --without-http_limit_conn_module) HTTP_LIMIT_CONN=NO        ;;[m
[31m-        --without-http_limit_req_module) HTTP_LIMIT_REQ=NO         ;;[m
[31m-        --without-http_empty_gif_module) HTTP_EMPTY_GIF=NO          ;;[m
[31m-        --without-http_browser_module)   HTTP_BROWSER=NO            ;;[m
[31m-        --without-http_upstream_hash_module) HTTP_UPSTREAM_HASH=NO  ;;[m
[31m-        --without-http_upstream_ip_hash_module) HTTP_UPSTREAM_IP_HASH=NO ;;[m
[31m-        --without-http_upstream_least_conn_module)[m
[31m-                                         HTTP_UPSTREAM_LEAST_CONN=NO ;;[m
[31m-        --without-http_upstream_keepalive_module) HTTP_UPSTREAM_KEEPALIVE=NO ;;[m
[31m-        --without-http_upstream_zone_module) HTTP_UPSTREAM_ZONE=NO  ;;[m
[31m-[m
[31m-        --with-http_perl_module)         HTTP_PERL=YES              ;;[m
[31m-        --with-http_perl_module=dynamic) HTTP_PERL=DYNAMIC          ;;[m
[31m-        --with-perl_modules_path=*)      NGX_PERL_MODULES="$value"  ;;[m
[31m-        --with-perl=*)                   NGX_PERL="$value"          ;;[m
[31m-[m
[31m-        # STUB[m
[31m-        --with-http_stub_status_module)  HTTP_STUB_STATUS=YES       ;;[m
[31m-[m
[31m-        --with-mail)                     MAIL=YES                   ;;[m
[31m-        --with-mail=dynamic)             MAIL=DYNAMIC               ;;[m
[31m-        --with-mail_ssl_module)          MAIL_SSL=YES               ;;[m
[31m-        # STUB[m
[31m-        --with-imap)[m
[31m-            MAIL=YES[m
[31m-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG[m
[31m-$0: warning: the \"--with-imap\" option is deprecated, \[m
[31m-use the \"--with-mail\" option instead"[m
[31m-        ;;[m
[31m-        --with-imap_ssl_module)[m
[31m-            MAIL_SSL=YES[m
[31m-            NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG[m
[31m-$0: warning: the \"--with-imap_ssl_module\" option is deprecated, \[m
[31m-use the \"--with-mail_ssl_module\" option instead"[m
[31m-        ;;[m
[31m-        --without-mail_pop3_module)      MAIL_POP3=NO               ;;[m
[31m-        --without-mail_imap_module)      MAIL_IMAP=NO               ;;[m
[31m-        --without-mail_smtp_module)      MAIL_SMTP=NO               ;;[m
[31m-[m
[31m-        --with-stream)                   STREAM=YES                 ;;[m
[31m-        --with-stream=dynamic)           STREAM=DYNAMIC             ;;[m
[31m-        --with-stream_ssl_module)        STREAM_SSL=YES             ;;[m
[31m-        --without-stream_limit_conn_module)[m
[31m-                                         STREAM_LIMIT_CONN=NO       ;;[m
[31m-        --without-stream_access_module)  STREAM_ACCESS=NO           ;;[m
[31m-        --without-stream_upstream_hash_module)[m
[31m-                                         STREAM_UPSTREAM_HASH=NO    ;;[m
[31m-        --without-stream_upstream_least_conn_module)[m
[31m-                                         STREAM_UPSTREAM_LEAST_CONN=NO ;;[m
[31m-        --without-stream_upstream_zone_module)[m
[31m-                                         STREAM_UPSTREAM_ZONE=NO    ;;[m
[31m-[m
[31m-        --with-google_perftools_module)  NGX_GOOGLE_PERFTOOLS=YES   ;;[m
[31m-        --with-cpp_test_module)          NGX_CPP_TEST=YES           ;;[m
[31m-[m
[31m-        --add-module=*)                  NGX_ADDONS="$NGX_ADDONS $value" ;;[m
[31m-        --add-dynamic-module=*)          DYNAMIC_ADDONS="$DYNAMIC_ADDONS $value" ;;[m
[31m-[m
[31m-        --with-cc=*)                     CC="$value"                ;;[m
[31m-        --with-cpp=*)                    CPP="$value"               ;;[m
[31m-        --with-cc-opt=*)                 NGX_CC_OPT="$value"        ;;[m
[31m-        --with-ld-opt=*)                 NGX_LD_OPT="$value"        ;;[m
[31m-        --with-cpu-opt=*)                CPU="$value"               ;;[m
[31m-        --with-debug)                    NGX_DEBUG=YES              ;;[m
[31m-        --with-dtrace=*)                 DTRACE="$value"            ;;[m
[31m-        --with-dtrace-probes)            NGX_DTRACE=YES             ;;[m
[31m-        --without-pcre)                  USE_PCRE=DISABLED          ;;[m
[31m-        --with-pcre)                     USE_PCRE=YES               ;;[m
[31m-        --with-pcre=*)                   PCRE="$value"              ;;[m
[31m-        --with-pcre-opt=*)               PCRE_OPT="$value"          ;;[m
[31m-        --with-pcre-jit)                 PCRE_JIT=YES               ;;[m
[31m-[m
[31m-        --with-openssl=*)                OPENSSL="$value"           ;;[m
[31m-        --with-openssl-opt=*)            OPENSSL_OPT="$value"       ;;[m
[31m-[m
[31m-        --with-md5=*)                    MD5="$value"               ;;[m
[31m-        --with-md5-opt=*)                MD5_OPT="$value"           ;;[m
[31m-        --with-md5-asm)                  MD5_ASM=YES                ;;[m
[31m-[m
[31m-        --with-sha1=*)                   SHA1="$value"              ;;[m
[31m-        --with-sha1-opt=*)               SHA1_OPT="$value"          ;;[m
[31m-        --with-sha1-asm)                 SHA1_ASM=YES               ;;[m
[31m-[m
[31m-        --with-zlib=*)                   ZLIB="$value"              ;;[m
[31m-        --with-zlib-opt=*)               ZLIB_OPT="$value"          ;;[m
[31m-        --with-zlib-asm=*)               ZLIB_ASM="$value"          ;;[m
[31m-[m
[31m-        --with-libatomic)                NGX_LIBATOMIC=YES          ;;[m
[31m-        --with-libatomic=*)              NGX_LIBATOMIC="$value"     ;;[m
[31m-[m
[31m-        --test-build-devpoll)            NGX_TEST_BUILD_DEVPOLL=YES ;;[m
[31m-        --test-build-eventport)          NGX_TEST_BUILD_EVENTPORT=YES ;;[m
[31m-        --test-build-epoll)              NGX_TEST_BUILD_EPOLL=YES   ;;[m
[31m-        --test-build-solaris-sendfilev)  NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;;[m
[31m-[m
[31m-        *)[m
[31m-            echo "$0: error: invalid option \"$option\""[m
[31m-            exit 1[m
[31m-        ;;[m
[31m-    esac[m
[31m-done[m
[31m-[m
[31m-[m
[31m-NGX_CONFIGURE="$opt"[m
[31m-[m
[31m-[m
[31m-if [ $help = yes ]; then[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-  --help                             print this message[m
[31m-[m
[31m-  --prefix=PATH                      set installation prefix[m
[31m-  --sbin-path=PATH                   set nginx binary pathname[m
[31m-  --modules-path=PATH                set modules path[m
[31m-  --conf-path=PATH                   set nginx.conf pathname[m
[31m-  --error-log-path=PATH              set error log pathname[m
[31m-  --pid-path=PATH                    set nginx.pid pathname[m
[31m-  --lock-path=PATH                   set nginx.lock pathname[m
[31m-  --tapset-prefix=PATH               set systemtap tapset directory prefix[m
[31m-  --stap-nginx-path=PATH             set stap-nginx pathname[m
[31m-[m
[31m-  --user=USER                        set non-privileged user for[m
[31m-                                     worker processes[m
[31m-  --group=GROUP                      set non-privileged group for[m
[31m-                                     worker processes[m
[31m-[m
[31m-  --build=NAME                       set build name[m
[31m-  --builddir=DIR                     set build directory[m
[31m-[m
[31m-  --with-select_module               enable select module[m
[31m-  --without-select_module            disable select module[m
[31m-  --with-poll_module                 enable poll module[m
[31m-  --without-poll_module              disable poll module[m
[31m-[m
[31m-  --with-threads                     enable thread pool support[m
[31m-[m
[31m-  --with-file-aio                    enable file AIO support[m
[31m-  --with-ipv6                        enable IPv6 support[m
[31m-[m
[31m-  --with-http_ssl_module             enable ngx_http_ssl_module[m
[31m-  --with-http_v2_module              enable ngx_http_v2_module[m
[31m-  --with-http_realip_module          enable ngx_http_realip_module[m
[31m-  --with-http_addition_module        enable ngx_http_addition_module[m
[31m-  --with-http_xslt_module            enable ngx_http_xslt_module[m
[31m-  --with-http_xslt_module=dynamic    enable dynamic ngx_http_xslt_module[m
[31m-  --with-http_image_filter_module    enable ngx_http_image_filter_module[m
[31m-  --with-http_image_filter_module=dynamic[m
[31m-                                     enable dynamic ngx_http_image_filter_module[m
[31m-  --with-http_geoip_module           enable ngx_http_geoip_module[m
[31m-  --with-http_geoip_module=dynamic   enable dynamic ngx_http_geoip_module[m
[31m-  --with-http_sub_module             enable ngx_http_sub_module[m
[31m-  --with-http_dav_module             enable ngx_http_dav_module[m
[31m-  --with-http_flv_module             enable ngx_http_flv_module[m
[31m-  --with-http_mp4_module             enable ngx_http_mp4_module[m
[31m-  --with-http_gunzip_module          enable ngx_http_gunzip_module[m
[31m-  --with-http_gzip_static_module     enable ngx_http_gzip_static_module[m
[31m-  --with-http_auth_request_module    enable ngx_http_auth_request_module[m
[31m-  --with-http_random_index_module    enable ngx_http_random_index_module[m
[31m-  --with-http_secure_link_module     enable ngx_http_secure_link_module[m
[31m-  --with-http_degradation_module     enable ngx_http_degradation_module[m
[31m-  --with-http_slice_module           enable ngx_http_slice_module[m
[31m-  --with-http_stub_status_module     enable ngx_http_stub_status_module[m
[31m-[m
[31m-  --without-http_charset_module      disable ngx_http_charset_module[m
[31m-  --without-http_gzip_module         disable ngx_http_gzip_module[m
[31m-  --without-http_ssi_module          disable ngx_http_ssi_module[m
[31m-  --without-http_userid_module       disable ngx_http_userid_module[m
[31m-  --without-http_access_module       disable ngx_http_access_module[m
[31m-  --without-http_auth_basic_module   disable ngx_http_auth_basic_module[m
[31m-  --without-http_autoindex_module    disable ngx_http_autoindex_module[m
[31m-  --without-http_geo_module          disable ngx_http_geo_module[m
[31m-  --without-http_map_module          disable ngx_http_map_module[m
[31m-  --without-http_split_clients_module disable ngx_http_split_clients_module[m
[31m-  --without-http_referer_module      disable ngx_http_referer_module[m
[31m-  --without-http_rewrite_module      disable ngx_http_rewrite_module[m
[31m-  --without-http_proxy_module        disable ngx_http_proxy_module[m
[31m-  --without-http_fastcgi_module      disable ngx_http_fastcgi_module[m
[31m-  --without-http_uwsgi_module        disable ngx_http_uwsgi_module[m
[31m-  --without-http_scgi_module         disable ngx_http_scgi_module[m
[31m-  --without-http_memcached_module    disable ngx_http_memcached_module[m
[31m-  --without-http_limit_conn_module   disable ngx_http_limit_conn_module[m
[31m-  --without-http_limit_req_module    disable ngx_http_limit_req_module[m
[31m-  --without-http_empty_gif_module    disable ngx_http_empty_gif_module[m
[31m-  --without-http_browser_module      disable ngx_http_browser_module[m
[31m-  --without-http_upstream_hash_module[m
[31m-                                     disable ngx_http_upstream_hash_module[m
[31m-  --without-http_upstream_ip_hash_module[m
[31m-                                     disable ngx_http_upstream_ip_hash_module[m
[31m-  --without-http_upstream_least_conn_module[m
[31m-                                     disable ngx_http_upstream_least_conn_module[m
[31m-  --without-http_upstream_keepalive_module[m
[31m-                                     disable ngx_http_upstream_keepalive_module[m
[31m-  --without-http_upstream_zone_module[m
[31m-                                     disable ngx_http_upstream_zone_module[m
[31m-[m
[31m-  --with-http_perl_module            enable ngx_http_perl_module[m
[31m-  --with-http_perl_module=dynamic    enable dynamic ngx_http_perl_module[m
[31m-  --with-perl_modules_path=PATH      set Perl modules path[m
[31m-  --with-perl=PATH                   set perl binary pathname[m
[31m-[m
[31m-  --http-log-path=PATH               set http access log pathname[m
[31m-  --http-client-body-temp-path=PATH  set path to store[m
[31m-                                     http client request body temporary files[m
[31m-  --http-proxy-temp-path=PATH        set path to store[m
[31m-                                     http proxy temporary files[m
[31m-  --http-fastcgi-temp-path=PATH      set path to store[m
[31m-                                     http fastcgi temporary files[m
[31m-  --http-uwsgi-temp-path=PATH        set path to store[m
[31m-                                     http uwsgi temporary files[m
[31m-  --http-scgi-temp-path=PATH         set path to store[m
[31m-                                     http scgi temporary files[m
[31m-[m
[31m-  --without-http                     disable HTTP server[m
[31m-  --without-http-cache               disable HTTP cache[m
[31m-[m
[31m-  --with-mail                        enable POP3/IMAP4/SMTP proxy module[m
[31m-  --with-mail=dynamic                enable dynamic POP3/IMAP4/SMTP proxy module[m
[31m-  --with-mail_ssl_module             enable ngx_mail_ssl_module[m
[31m-  --without-mail_pop3_module         disable ngx_mail_pop3_module[m
[31m-  --without-mail_imap_module         disable ngx_mail_imap_module[m
[31m-  --without-mail_smtp_module         disable ngx_mail_smtp_module[m
[31m-[m
[31m-  --with-stream                      enable TCP/UDP proxy module[m
[31m-  --with-stream=dynamic              enable dynamic TCP/UDP proxy module[m
[31m-  --with-stream_ssl_module           enable ngx_stream_ssl_module[m
[31m-  --without-stream_limit_conn_module disable ngx_stream_limit_conn_module[m
[31m-  --without-stream_access_module     disable ngx_stream_access_module[m
[31m-  --without-stream_upstream_hash_module[m
[31m-                                     disable ngx_stream_upstream_hash_module[m
[31m-  --without-stream_upstream_least_conn_module[m
[31m-                                     disable ngx_stream_upstream_least_conn_module[m
[31m-  --without-stream_upstream_zone_module[m
[31m-                                     disable ngx_stream_upstream_zone_module[m
[31m-[m
[31m-  --with-google_perftools_module     enable ngx_google_perftools_module[m
[31m-  --with-cpp_test_module             enable ngx_cpp_test_module[m
[31m-[m
[31m-  --add-module=PATH                  enable external module[m
[31m-  --add-dynamic-module=PATH          enable dynamic external module[m
[31m-[m
[31m-  --with-cc=PATH                     set C compiler pathname[m
[31m-  --with-cpp=PATH                    set C preprocessor pathname[m
[31m-  --with-cc-opt=OPTIONS              set additional C compiler options[m
[31m-  --with-ld-opt=OPTIONS              set additional linker options[m
[31m-  --with-cpu-opt=CPU                 build for the specified CPU, valid values:[m
[31m-                                     pentium, pentiumpro, pentium3, pentium4,[m
[31m-                                     athlon, opteron, sparc32, sparc64, ppc64[m
[31m-[m
[31m-  --without-pcre                     disable PCRE library usage[m
[31m-  --with-pcre                        force PCRE library usage[m
[31m-  --with-pcre=DIR                    set path to PCRE library sources[m
[31m-  --with-pcre-opt=OPTIONS            set additional build options for PCRE[m
[31m-  --with-pcre-jit                    build PCRE with JIT compilation support[m
[31m-[m
[31m-  --with-md5=DIR                     set path to md5 library sources[m
[31m-  --with-md5-opt=OPTIONS             set additional build options for md5[m
[31m-  --with-md5-asm                     use md5 assembler sources[m
[31m-[m
[31m-  --with-sha1=DIR                    set path to sha1 library sources[m
[31m-  --with-sha1-opt=OPTIONS            set additional build options for sha1[m
[31m-  --with-sha1-asm                    use sha1 assembler sources[m
[31m-[m
[31m-  --with-zlib=DIR                    set path to zlib library sources[m
[31m-  --with-zlib-opt=OPTIONS            set additional build options for zlib[m
[31m-  --with-zlib-asm=CPU                use zlib assembler sources optimized[m
[31m-                                     for the specified CPU, valid values:[m
[31m-                                     pentium, pentiumpro[m
[31m-[m
[31m-  --with-libatomic                   force libatomic_ops library usage[m
[31m-  --with-libatomic=DIR               set path to libatomic_ops library sources[m
[31m-[m
[31m-  --with-openssl=DIR                 set path to OpenSSL library sources[m
[31m-  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL[m
[31m-[m
[31m-  --with-debug                       enable debug logging[m
[31m-  --with-dtrace-probes               enable dtrace USDT probes[m
[31m-  --with-dtrace=PATH                 set dtrace utility pathname[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $HTTP = NO ]; then[m
[31m-    HTTP_CHARSET=NO[m
[31m-    HTTP_GZIP=NO[m
[31m-    HTTP_SSI=NO[m
[31m-    HTTP_USERID=NO[m
[31m-    HTTP_ACCESS=NO[m
[31m-    HTTP_STATUS=NO[m
[31m-    HTTP_REWRITE=NO[m
[31m-    HTTP_PROXY=NO[m
[31m-    HTTP_FASTCGI=NO[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ ".$NGX_PLATFORM" = ".win32" ]; then[m
[31m-    NGX_WINE=$WINE[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx}[m
[31m-NGX_MODULES_PATH=${NGX_MODULES_PATH:-modules}[m
[31m-NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}[m
[31m-NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`[m
[31m-NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}[m
[31m-NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}[m
[31m-NGX_TAPSET_PREFIX=${NGX_TAPSET_PREFIX:-tapset}[m
[31m-[m
[31m-if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then[m
[31m-    NGX_ERROR_LOG_PATH=[m
[31m-else[m
[31m-    NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}[m
[31m-fi[m
[31m-[m
[31m-NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log}[m
[31m-NGX_HTTP_CLIENT_TEMP_PATH=${NGX_HTTP_CLIENT_TEMP_PATH:-client_body_temp}[m
[31m-NGX_HTTP_PROXY_TEMP_PATH=${NGX_HTTP_PROXY_TEMP_PATH:-proxy_temp}[m
[31m-NGX_HTTP_FASTCGI_TEMP_PATH=${NGX_HTTP_FASTCGI_TEMP_PATH:-fastcgi_temp}[m
[31m-NGX_HTTP_UWSGI_TEMP_PATH=${NGX_HTTP_UWSGI_TEMP_PATH:-uwsgi_temp}[m
[31m-NGX_HTTP_SCGI_TEMP_PATH=${NGX_HTTP_SCGI_TEMP_PATH:-scgi_temp}[m
[31m-[m
[31m-case ".$NGX_PERL_MODULES" in[m
[31m-    ./*)[m
[31m-    ;;[m
[31m-[m
[31m-    .)[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES[m
[31m-    ;;[m
[31m-esac[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/conf[m
[1mdeleted file mode 100644[m
[1mindex 6ad0e74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/conf[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo "checking for $NGX_SYSTEM specific features"[m
[31m-[m
[31m-case "$NGX_PLATFORM" in[m
[31m-[m
[31m-    FreeBSD:*)[m
[31m-        . auto/os/freebsd[m
[31m-    ;;[m
[31m-[m
[31m-    Linux:*)[m
[31m-        . auto/os/linux[m
[31m-    ;;[m
[31m-[m
[31m-    SunOS:*)[m
[31m-        . auto/os/solaris[m
[31m-    ;;[m
[31m-[m
[31m-    Darwin:*)[m
[31m-        . auto/os/darwin[m
[31m-    ;;[m
[31m-[m
[31m-    win32)[m
[31m-        . auto/os/win32[m
[31m-    ;;[m
[31m-[m
[31m-    DragonFly:*)[m
[31m-        have=NGX_FREEBSD . auto/have_headers[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $FREEBSD_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS $FREEBSD_SRCS"[m
[31m-[m
[31m-        echo " + sendfile() found"[m
[31m-        have=NGX_HAVE_SENDFILE . auto/have[m
[31m-        CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS"[m
[31m-[m
[31m-        ngx_spacer='[m
[31m-'[m
[31m-    ;;[m
[31m-[m
[31m-    HP-UX:*)[m
[31m-        # HP/UX[m
[31m-        have=NGX_HPUX . auto/have_headers[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS -D_HPUX_ALT_XOPEN_SOCKET_API"[m
[31m-    ;;[m
[31m-[m
[31m-    OSF1:*)[m
[31m-        # Tru64 UNIX[m
[31m-        have=NGX_TRU64 . auto/have_headers[m
[31m-        have=NGX_HAVE_STRERROR_R . auto/nohave[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS"[m
[31m-    ;;[m
[31m-[m
[31m-    GNU:*)[m
[31m-        # GNU Hurd[m
[31m-        have=NGX_GNU_HURD . auto/have_headers[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS"[m
[31m-        CC_AUX_FLAGS="$CC_AUX_FLAGS -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        CORE_INCS="$UNIX_INCS"[m
[31m-        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"[m
[31m-        CORE_SRCS="$UNIX_SRCS"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-case "$NGX_MACHINE" in[m
[31m-[m
[31m-    i386 | i686 | i86pc)[m
[31m-        have=NGX_HAVE_NONALIGNED . auto/have[m
[31m-        NGX_MACH_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-    amd64 | x86_64)[m
[31m-        have=NGX_HAVE_NONALIGNED . auto/have[m
[31m-        NGX_MACH_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    sun4u | sun4v | sparc | sparc64)[m
[31m-        have=NGX_ALIGNMENT value=16 . auto/define[m
[31m-        # TODO[m
[31m-        NGX_MACH_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    ia64 )[m
[31m-        have=NGX_ALIGNMENT value=16 . auto/define[m
[31m-        # TODO[m
[31m-        NGX_MACH_CACHE_LINE=64[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        have=NGX_ALIGNMENT value=16 . auto/define[m
[31m-        NGX_MACH_CACHE_LINE=32[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-if test -z "$NGX_CPU_CACHE_LINE"; then[m
[31m-    NGX_CPU_CACHE_LINE=$NGX_MACH_CACHE_LINE[m
[31m-fi[m
[31m-[m
[31m-have=NGX_CPU_CACHE_LINE value=$NGX_CPU_CACHE_LINE . auto/define[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/darwin b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/darwin[m
[1mdeleted file mode 100644[m
[1mindex 1bd931c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/darwin[m
[1m+++ /dev/null[m
[36m@@ -1,121 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_DARWIN . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$UNIX_INCS"[m
[31m-CORE_DEPS="$UNIX_DEPS $DARWIN_DEPS"[m
[31m-CORE_SRCS="$UNIX_SRCS $DARWIN_SRCS"[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_spacer='[m
[31m-'[m
[31m-[m
[31m-MAIN_LINK=[m
[31m-MODULE_LINK="-shared -Wl,-undefined,dynamic_lookup"[m
[31m-[m
[31m-# kqueue[m
[31m-[m
[31m-echo " + kqueue found"[m
[31m-have=NGX_HAVE_KQUEUE . auto/have[m
[31m-have=NGX_HAVE_CLEAR_EVENT . auto/have[m
[31m-EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"[m
[31m-CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"[m
[31m-EVENT_FOUND=YES[m
[31m-NGX_KQUEUE_CHECKED=YES[m
[31m-[m
[31m-ngx_feature="kqueue's EVFILT_TIMER"[m
[31m-ngx_feature_name="NGX_HAVE_TIMER_EVENT"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/event.h>[m
[31m-                  #include <sys/time.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int      kq;[m
[31m-                  struct kevent    kev;[m
[31m-                  struct timespec  ts;[m
[31m-[m
[31m-                  if ((kq = kqueue()) == -1) return 1;[m
[31m-[m
[31m-                  kev.ident = 0;[m
[31m-                  kev.filter = EVFILT_TIMER;[m
[31m-                  kev.flags = EV_ADD|EV_ENABLE;[m
[31m-                  kev.fflags = 0;[m
[31m-                  kev.data = 1000;[m
[31m-                  kev.udata = 0;[m
[31m-[m
[31m-                  ts.tv_sec = 0;[m
[31m-                  ts.tv_nsec = 0;[m
[31m-[m
[31m-                  if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1;[m
[31m-[m
[31m-                  if (kev.flags & EV_ERROR) return 1;"[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="Darwin 64-bit kqueue millisecond timeout bug"[m
[31m-ngx_feature_name=NGX_DARWIN_KEVENT_BUG[m
[31m-ngx_feature_run=bug[m
[31m-ngx_feature_incs="#include <sys/event.h>[m
[31m-                  #include <sys/time.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int  kq;[m
[31m-                  struct kevent    kev;[m
[31m-                  struct timespec  ts;[m
[31m-                  struct timeval   tv, tv0;[m
[31m-[m
[31m-                  kq = kqueue();[m
[31m-[m
[31m-                  ts.tv_sec = 0;[m
[31m-                  ts.tv_nsec = 999000000;[m
[31m-[m
[31m-                  gettimeofday(&tv, 0);[m
[31m-                  kevent(kq, NULL, 0, &kev, 1, &ts);[m
[31m-                  gettimeofday(&tv0, 0);[m
[31m-                  timersub(&tv0, &tv, &tv);[m
[31m-[m
[31m-                  if (tv.tv_sec * 1000000 + tv.tv_usec < 900000) return 1;"[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# sendfile()[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS"[m
[31m-ngx_feature="sendfile()"[m
[31m-ngx_feature_name="NGX_HAVE_SENDFILE"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/socket.h>[m
[31m-                  #include <sys/uio.h>[m
[31m-                  #include <sys/errno.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int s = 0, fd = 1;[m
[31m-                  off_t n; off_t off = 0;[m
[31m-                  n = sendfile(s, fd, off, &n, NULL, 0);[m
[31m-                  if (n == -1 && errno == ENOSYS) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $DARWIN_SENDFILE_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="atomic(3)"[m
[31m-ngx_feature_name=NGX_DARWIN_ATOMIC[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <libkern/OSAtomic.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int32_t  lock, n;[m
[31m-                  n = OSAtomicCompareAndSwap32Barrier(0, 1, &lock)"[m
[31m-. auto/feature[m
[31m-[m
[31m-DTRACE_PROBE_OBJ=NO[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/freebsd b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/freebsd[m
[1mdeleted file mode 100644[m
[1mindex d76b32b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/freebsd[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_FREEBSD . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$UNIX_INCS"[m
[31m-CORE_DEPS="$UNIX_DEPS $FREEBSD_DEPS"[m
[31m-CORE_SRCS="$UNIX_SRCS $FREEBSD_SRCS"[m
[31m-[m
[31m-ngx_spacer='[m
[31m-'[m
[31m-[m
[31m-[m
[31m-# __FreeBSD_version and sysctl kern.osreldate are the best ways[m
[31m-# to determine whether some capability exists and is safe to use.[m
[31m-# __FreeBSD_version is used for the testing of the build environment.[m
[31m-# sysctl kern.osreldate is used for the testing of the kernel capabilities.[m
[31m-[m
[31m-version=`grep "#define __FreeBSD_version" /usr/include/osreldate.h \[m
[31m-         | sed -e 's/^.* \(.*\)$/\1/'`[m
[31m-[m
[31m-osreldate=`/sbin/sysctl -n kern.osreldate`[m
[31m-[m
[31m-[m
[31m-# setproctitle() in libutil[m
[31m-[m
[31m-if [ \( $version -ge 500000 -a $version -lt 500012 \) \[m
[31m-     -o $version -lt 410002 ][m
[31m-then[m
[31m-    echo " + setproctitle() in libutil"[m
[31m-[m
[31m-    CORE_LIBS="$CORE_LIBS -lutil"[m
[31m-    NGX_SETPROCTITLE_LIB="-lutil"[m
[31m-fi[m
[31m-[m
[31m-# sendfile[m
[31m-[m
[31m-if [ $osreldate -gt 300007 ]; then[m
[31m-    echo " + sendfile() found"[m
[31m-[m
[31m-    have=NGX_HAVE_SENDFILE . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_FILE_AIO = YES ]; then[m
[31m-    if [ $osreldate -gt 502103 ]; then[m
[31m-        echo " + sendfile()'s SF_NODISKIO found"[m
[31m-[m
[31m-        have=NGX_HAVE_AIO_SENDFILE . auto/have[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-# POSIX semaphores[m
[31m-# http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/127545[m
[31m-[m
[31m-if [ $osreldate -ge 701106 ]; then[m
[31m-    echo " + POSIX semaphores should work"[m
[31m-else[m
[31m-    have=NGX_HAVE_POSIX_SEM . auto/nohave[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# kqueue[m
[31m-[m
[31m-if [ \( $osreldate -lt 500000 -a $osreldate -ge 410000 \) \[m
[31m-     -o $osreldate -ge 500011 ][m
[31m-then[m
[31m-    echo " + kqueue found"[m
[31m-[m
[31m-    have=NGX_HAVE_KQUEUE . auto/have[m
[31m-    have=NGX_HAVE_CLEAR_EVENT . auto/have[m
[31m-    EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"[m
[31m-    CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"[m
[31m-    EVENT_FOUND=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-NGX_KQUEUE_CHECKED=YES[m
[31m-[m
[31m-[m
[31m-# kqueue's NOTE_LOWAT[m
[31m-[m
[31m-if [ \( $version -lt 500000 -a $version -ge 430000 \) \[m
[31m-     -o $version -ge 500018 ][m
[31m-then[m
[31m-    echo " + kqueue's NOTE_LOWAT found"[m
[31m-    have=NGX_HAVE_LOWAT_EVENT . auto/have[m
[31m-fi[m
[31m-[m
[31m-# kqueue's EVFILT_TIMER[m
[31m-[m
[31m-if [ \( $version -lt 500000 -a $version -ge 440001 \) \[m
[31m-     -o $version -ge 500023 ][m
[31m-then[m
[31m-    echo " + kqueue's EVFILT_TIMER found"[m
[31m-    have=NGX_HAVE_TIMER_EVENT . auto/have[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# cpuset_setaffinity()[m
[31m-[m
[31m-if [ $version -ge 701000 ]; then[m
[31m-    echo " + cpuset_setaffinity() found"[m
[31m-    have=NGX_HAVE_CPUSET_SETAFFINITY . auto/have[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    NGX_LD_OPT="$NGX_LD_OPT -lelf"[m
[31m-fi[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/linux b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/linux[m
[1mdeleted file mode 100644[m
[1mindex b5114d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/linux[m
[1m+++ /dev/null[m
[36m@@ -1,175 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_LINUX . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$UNIX_INCS"[m
[31m-CORE_DEPS="$UNIX_DEPS $LINUX_DEPS"[m
[31m-CORE_SRCS="$UNIX_SRCS $LINUX_SRCS"[m
[31m-[m
[31m-ngx_spacer='[m
[31m-'[m
[31m-[m
[31m-cc_aux_flags="$CC_AUX_FLAGS"[m
[31m-CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"[m
[31m-[m
[31m-[m
[31m-# Linux kernel version[m
[31m-[m
[31m-version=$((`uname -r \[m
[31m-    | sed -n -e 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/ \[m
[31m-                                                 \1*256*256+\2*256+\3/p' \[m
[31m-             -e 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1*256*256+\2*256/p'`))[m
[31m-[m
[31m-version=${version:-0}[m
[31m-[m
[31m-[m
[31m-# posix_fadvise64() had been implemented in 2.5.60[m
[31m-[m
[31m-if [ $version -lt 132412 ]; then[m
[31m-    have=NGX_HAVE_POSIX_FADVISE . auto/nohave[m
[31m-fi[m
[31m-[m
[31m-# epoll, EPOLLET version[m
[31m-[m
[31m-ngx_feature="epoll"[m
[31m-ngx_feature_name="NGX_HAVE_EPOLL"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/epoll.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int efd = 0;[m
[31m-                  struct epoll_event ee;[m
[31m-                  ee.events = EPOLLIN|EPOLLOUT|EPOLLET;[m
[31m-                  ee.data.ptr = NULL;[m
[31m-                  efd = epoll_create(100);[m
[31m-                  if (efd == -1) return 1;"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    have=NGX_HAVE_CLEAR_EVENT . auto/have[m
[31m-    CORE_SRCS="$CORE_SRCS $EPOLL_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE"[m
[31m-    EVENT_FOUND=YES[m
[31m-[m
[31m-[m
[31m-    # EPOLLRDHUP appeared in Linux 2.6.17, glibc 2.8[m
[31m-[m
[31m-    ngx_feature="EPOLLRDHUP"[m
[31m-    ngx_feature_name="NGX_HAVE_EPOLLRDHUP"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <sys/epoll.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="int efd = 0, fd = 0;[m
[31m-                      struct epoll_event ee;[m
[31m-                      ee.events = EPOLLIN|EPOLLRDHUP|EPOLLET;[m
[31m-                      ee.data.ptr = NULL;[m
[31m-                      epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# O_PATH and AT_EMPTY_PATH were introduced in 2.6.39, glibc 2.14[m
[31m-[m
[31m-ngx_feature="O_PATH"[m
[31m-ngx_feature_name="NGX_HAVE_O_PATH"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/stat.h>[m
[31m-                  #include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int fd; struct stat sb;[m
[31m-                  fd = openat(AT_FDCWD, \".\", O_PATH|O_DIRECTORY|O_NOFOLLOW);[m
[31m-                  if (fstatat(fd, \"\", &sb, AT_EMPTY_PATH) != 0) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# sendfile()[m
[31m-[m
[31m-CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE"[m
[31m-ngx_feature="sendfile()"[m
[31m-ngx_feature_name="NGX_HAVE_SENDFILE"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/sendfile.h>[m
[31m-                  #include <errno.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int s = 0, fd = 1;[m
[31m-                  ssize_t n; off_t off = 0;[m
[31m-                  n = sendfile(s, fd, &off, 1);[m
[31m-                  if (n == -1 && errno == ENOSYS) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $LINUX_SENDFILE_SRCS"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-# sendfile64()[m
[31m-[m
[31m-CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"[m
[31m-ngx_feature="sendfile64()"[m
[31m-ngx_feature_name="NGX_HAVE_SENDFILE64"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/sendfile.h>[m
[31m-                  #include <errno.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int s = 0, fd = 1;[m
[31m-                  ssize_t n; off_t off = 0;[m
[31m-                  n = sendfile(s, fd, &off, 1);[m
[31m-                  if (n == -1 && errno == ENOSYS) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_include="sys/prctl.h"; . auto/include[m
[31m-[m
[31m-# prctl(PR_SET_DUMPABLE)[m
[31m-[m
[31m-ngx_feature="prctl(PR_SET_DUMPABLE)"[m
[31m-ngx_feature_name="NGX_HAVE_PR_SET_DUMPABLE"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/prctl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# sched_setaffinity()[m
[31m-[m
[31m-ngx_feature="sched_setaffinity()"[m
[31m-ngx_feature_name="NGX_HAVE_SCHED_SETAFFINITY"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sched.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="cpu_set_t mask;[m
[31m-                  CPU_ZERO(&mask);[m
[31m-                  sched_setaffinity(0, sizeof(cpu_set_t), &mask)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# crypt_r()[m
[31m-[m
[31m-ngx_feature="crypt_r()"[m
[31m-ngx_feature_name="NGX_HAVE_GNU_CRYPT_R"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <crypt.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=-lcrypt[m
[31m-ngx_feature_test="struct crypt_data  cd;[m
[31m-                  crypt_r(\"key\", \"salt\", &cd);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_include="sys/vfs.h";     . auto/include[m
[31m-[m
[31m-[m
[31m-CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"[m
[31m-[m
[31m-DTRACE_FROM_SYSTEMTAP=YES[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/solaris b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/solaris[m
[1mdeleted file mode 100644[m
[1mindex d39df0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/solaris[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_SOLARIS . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$UNIX_INCS"[m
[31m-CORE_DEPS="$UNIX_DEPS $SOLARIS_DEPS"[m
[31m-CORE_SRCS="$UNIX_SRCS $SOLARIS_SRCS "[m
[31m-CORE_LIBS="$CORE_LIBS -lsocket -lnsl"[m
[31m-[m
[31m-NGX_RPATH=YES[m
[31m-[m
[31m-# Solaris's make does not support a blank line between target and rules[m
[31m-ngx_spacer=[m
[31m-[m
[31m-CC_AUX_FLAGS="$CC_AUX_FLAGS -D_FILE_OFFSET_BITS=64 -lsocket -lnsl"[m
[31m-[m
[31m-[m
[31m-if [ $ZLIB_ASM != NO ]; then[m
[31m-    echo "$0: error: the --with-zlib-asm=CPU option is not supported"[m
[31m-    echo "on that platform"[m
[31m-    echo[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="sendfilev()"[m
[31m-ngx_feature_name="NGX_HAVE_SENDFILE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/sendfile.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs="-lsendfile"[m
[31m-ngx_feature_test="int fd = 1; sendfilevec_t vec[1];[m
[31m-                  size_t sent; ssize_t n;[m
[31m-                  n = sendfilev(fd, vec, 1, &sent);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS"[m
[31m-    CORE_LIBS="$CORE_LIBS -lsendfile"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="event ports"[m
[31m-ngx_feature_name="NGX_HAVE_EVENTPORT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <port.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int n = port_create()"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $EVENTPORT_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $EVENTPORT_MODULE"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/win32 b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/win32[m
[1mdeleted file mode 100644[m
[1mindex 14ae3b8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/os/win32[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_WIN32 . auto/have_headers[m
[31m-[m
[31m-CORE_INCS="$WIN32_INCS"[m
[31m-CORE_DEPS="$WIN32_DEPS"[m
[31m-CORE_SRCS="$WIN32_SRCS $IOCP_SRCS"[m
[31m-OS_CONFIG="$WIN32_CONFIG"[m
[31m-NGX_ICONS="$NGX_WIN32_ICONS"[m
[31m-SELECT_SRCS=$WIN32_SELECT_SRCS[m
[31m-[m
[31m-ngx_pic_opt=[m
[31m-[m
[31m-case "$NGX_CC_NAME" in[m
[31m-[m
[31m-    gcc)[m
[31m-        CORE_LIBS="$CORE_LIBS -ladvapi32 -lws2_32"[m
[31m-        MAIN_LINK="$MAIN_LINK -Wl,--export-all-symbols"[m
[31m-        MAIN_LINK="$MAIN_LINK -Wl,--out-implib=$NGX_OBJS/libnginx.a"[m
[31m-        MODULE_LINK="-shared -L $NGX_OBJS -lnginx"[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        CORE_LIBS="$CORE_LIBS advapi32.lib ws2_32.lib"[m
[31m-    ;;[m
[31m-[m
[31m-esac[m
[31m-[m
[31m-EVENT_MODULES="$EVENT_MODULES $IOCP_MODULE"[m
[31m-EVENT_FOUND=YES[m
[31m-[m
[31m-if [ $EVENT_SELECT = NO ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $SELECT_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_IPV6 = YES ]; then[m
[31m-    have=NGX_HAVE_INET6 . auto/have[m
[31m-fi[m
[31m-[m
[31m-have=NGX_HAVE_IOCP . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/sources b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/sources[m
[1mdeleted file mode 100644[m
[1mindex 2abdc3b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/sources[m
[1m+++ /dev/null[m
[36m@@ -1,264 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CORE_MODULES="ngx_core_module ngx_errlog_module ngx_conf_module"[m
[31m-[m
[31m-CORE_INCS="src/core"[m
[31m-[m
[31m-CORE_DEPS="src/core/nginx.h \[m
[31m-           src/core/ngx_config.h \[m
[31m-           src/core/ngx_core.h \[m
[31m-           src/core/ngx_log.h \[m
[31m-           src/core/ngx_palloc.h \[m
[31m-           src/core/ngx_array.h \[m
[31m-           src/core/ngx_list.h \[m
[31m-           src/core/ngx_hash.h \[m
[31m-           src/core/ngx_buf.h \[m
[31m-           src/core/ngx_queue.h \[m
[31m-           src/core/ngx_string.h \[m
[31m-           src/core/ngx_parse.h \[m
[31m-           src/core/ngx_parse_time.h \[m
[31m-           src/core/ngx_inet.h \[m
[31m-           src/core/ngx_file.h \[m
[31m-           src/core/ngx_crc.h \[m
[31m-           src/core/ngx_crc32.h \[m
[31m-           src/core/ngx_murmurhash.h \[m
[31m-           src/core/ngx_md5.h \[m
[31m-           src/core/ngx_sha1.h \[m
[31m-           src/core/ngx_rbtree.h \[m
[31m-           src/core/ngx_radix_tree.h \[m
[31m-           src/core/ngx_rwlock.h \[m
[31m-           src/core/ngx_slab.h \[m
[31m-           src/core/ngx_times.h \[m
[31m-           src/core/ngx_shmtx.h \[m
[31m-           src/core/ngx_connection.h \[m
[31m-           src/core/ngx_cycle.h \[m
[31m-           src/core/ngx_conf_file.h \[m
[31m-           src/core/ngx_module.h \[m
[31m-           src/core/ngx_resolver.h \[m
[31m-           src/core/ngx_open_file_cache.h \[m
[31m-           src/core/ngx_crypt.h \[m
[31m-           src/core/ngx_core_probe.h \[m
[31m-           src/core/ngx_proxy_protocol.h \[m
[31m-           src/core/ngx_syslog.h"[m
[31m-[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    CORE_DEPS="$CORE_DEPS objs/ngx_dtrace_provider.h"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-CORE_SRCS="src/core/nginx.c \[m
[31m-           src/core/ngx_log.c \[m
[31m-           src/core/ngx_palloc.c \[m
[31m-           src/core/ngx_array.c \[m
[31m-           src/core/ngx_list.c \[m
[31m-           src/core/ngx_hash.c \[m
[31m-           src/core/ngx_buf.c \[m
[31m-           src/core/ngx_queue.c \[m
[31m-           src/core/ngx_output_chain.c \[m
[31m-           src/core/ngx_string.c \[m
[31m-           src/core/ngx_parse.c \[m
[31m-           src/core/ngx_parse_time.c \[m
[31m-           src/core/ngx_inet.c \[m
[31m-           src/core/ngx_file.c \[m
[31m-           src/core/ngx_crc32.c \[m
[31m-           src/core/ngx_murmurhash.c \[m
[31m-           src/core/ngx_md5.c \[m
[31m-           src/core/ngx_rbtree.c \[m
[31m-           src/core/ngx_radix_tree.c \[m
[31m-           src/core/ngx_slab.c \[m
[31m-           src/core/ngx_times.c \[m
[31m-           src/core/ngx_shmtx.c \[m
[31m-           src/core/ngx_connection.c \[m
[31m-           src/core/ngx_cycle.c \[m
[31m-           src/core/ngx_spinlock.c \[m
[31m-           src/core/ngx_rwlock.c \[m
[31m-           src/core/ngx_cpuinfo.c \[m
[31m-           src/core/ngx_conf_file.c \[m
[31m-           src/core/ngx_module.c \[m
[31m-           src/core/ngx_resolver.c \[m
[31m-           src/core/ngx_open_file_cache.c \[m
[31m-           src/core/ngx_crypt.c \[m
[31m-           src/core/ngx_proxy_protocol.c \[m
[31m-           src/core/ngx_syslog.c"[m
[31m-[m
[31m-[m
[31m-EVENT_MODULES="ngx_events_module ngx_event_core_module"[m
[31m-[m
[31m-EVENT_INCS="src/event src/event/modules"[m
[31m-[m
[31m-EVENT_DEPS="src/event/ngx_event.h \[m
[31m-            src/event/ngx_event_timer.h \[m
[31m-            src/event/ngx_event_posted.h \[m
[31m-            src/event/ngx_event_connect.h \[m
[31m-            src/event/ngx_event_pipe.h \[m
[31m-            src/event/ngx_event_probe.h"[m
[31m-[m
[31m-EVENT_SRCS="src/event/ngx_event.c \[m
[31m-            src/event/ngx_event_timer.c \[m
[31m-            src/event/ngx_event_posted.c \[m
[31m-            src/event/ngx_event_accept.c \[m
[31m-            src/event/ngx_event_connect.c \[m
[31m-            src/event/ngx_event_pipe.c"[m
[31m-[m
[31m-[m
[31m-SELECT_MODULE=ngx_select_module[m
[31m-SELECT_SRCS=src/event/modules/ngx_select_module.c[m
[31m-WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c[m
[31m-[m
[31m-POLL_MODULE=ngx_poll_module[m
[31m-POLL_SRCS=src/event/modules/ngx_poll_module.c[m
[31m-[m
[31m-KQUEUE_MODULE=ngx_kqueue_module[m
[31m-KQUEUE_SRCS=src/event/modules/ngx_kqueue_module.c[m
[31m-[m
[31m-DEVPOLL_MODULE=ngx_devpoll_module[m
[31m-DEVPOLL_SRCS=src/event/modules/ngx_devpoll_module.c[m
[31m-[m
[31m-EVENTPORT_MODULE=ngx_eventport_module[m
[31m-EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c[m
[31m-[m
[31m-EPOLL_MODULE=ngx_epoll_module[m
[31m-EPOLL_SRCS=src/event/modules/ngx_epoll_module.c[m
[31m-[m
[31m-IOCP_MODULE=ngx_iocp_module[m
[31m-IOCP_SRCS=src/event/modules/ngx_iocp_module.c[m
[31m-[m
[31m-FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"[m
[31m-LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c"[m
[31m-[m
[31m-UNIX_INCS="$CORE_INCS $EVENT_INCS src/os/unix"[m
[31m-[m
[31m-UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \[m
[31m-            src/os/unix/ngx_time.h \[m
[31m-            src/os/unix/ngx_errno.h \[m
[31m-            src/os/unix/ngx_alloc.h \[m
[31m-            src/os/unix/ngx_files.h \[m
[31m-            src/os/unix/ngx_channel.h \[m
[31m-            src/os/unix/ngx_shmem.h \[m
[31m-            src/os/unix/ngx_process.h \[m
[31m-            src/os/unix/ngx_setaffinity.h \[m
[31m-            src/os/unix/ngx_setproctitle.h \[m
[31m-            src/os/unix/ngx_atomic.h \[m
[31m-            src/os/unix/ngx_gcc_atomic_x86.h \[m
[31m-            src/os/unix/ngx_thread.h \[m
[31m-            src/os/unix/ngx_socket.h \[m
[31m-            src/os/unix/ngx_os.h \[m
[31m-            src/os/unix/ngx_user.h \[m
[31m-            src/os/unix/ngx_dlopen.h \[m
[31m-            src/os/unix/ngx_process_cycle.h"[m
[31m-[m
[31m-# add to UNIX_DEPS[m
[31m-#            src/os/unix/ngx_gcc_atomic_amd64.h \[m
[31m-#            src/os/unix/ngx_gcc_atomic_sparc64.h \[m
[31m-#            src/os/unix/ngx_gcc_atomic_ppc.h \[m
[31m-#            src/os/unix/ngx_sunpro_atomic_sparc64.h \[m
[31m-#            src/os/unix/ngx_sunpro_x86.il \[m
[31m-#            src/os/unix/ngx_sunpro_amd64.il \[m
[31m-#            src/os/unix/ngx_sunpro_sparc64.il \[m
[31m-[m
[31m-[m
[31m-UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \[m
[31m-            src/os/unix/ngx_time.c \[m
[31m-            src/os/unix/ngx_errno.c \[m
[31m-            src/os/unix/ngx_alloc.c \[m
[31m-            src/os/unix/ngx_files.c \[m
[31m-            src/os/unix/ngx_socket.c \[m
[31m-            src/os/unix/ngx_recv.c \[m
[31m-            src/os/unix/ngx_readv_chain.c \[m
[31m-            src/os/unix/ngx_udp_recv.c \[m
[31m-            src/os/unix/ngx_send.c \[m
[31m-            src/os/unix/ngx_writev_chain.c \[m
[31m-            src/os/unix/ngx_udp_send.c \[m
[31m-            src/os/unix/ngx_channel.c \[m
[31m-            src/os/unix/ngx_shmem.c \[m
[31m-            src/os/unix/ngx_process.c \[m
[31m-            src/os/unix/ngx_daemon.c \[m
[31m-            src/os/unix/ngx_setaffinity.c \[m
[31m-            src/os/unix/ngx_setproctitle.c \[m
[31m-            src/os/unix/ngx_posix_init.c \[m
[31m-            src/os/unix/ngx_user.c \[m
[31m-            src/os/unix/ngx_dlopen.c \[m
[31m-            src/os/unix/ngx_process_cycle.c"[m
[31m-[m
[31m-POSIX_DEPS=src/os/unix/ngx_posix_config.h[m
[31m-[m
[31m-THREAD_POOL_MODULE=ngx_thread_pool_module[m
[31m-THREAD_POOL_DEPS=src/core/ngx_thread_pool.h[m
[31m-THREAD_POOL_SRCS="src/core/ngx_thread_pool.c[m
[31m-                  src/os/unix/ngx_thread_cond.c[m
[31m-                  src/os/unix/ngx_thread_mutex.c[m
[31m-                  src/os/unix/ngx_thread_id.c"[m
[31m-[m
[31m-FREEBSD_DEPS="src/os/unix/ngx_freebsd_config.h src/os/unix/ngx_freebsd.h"[m
[31m-FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c[m
[31m-FREEBSD_SENDFILE_SRCS=src/os/unix/ngx_freebsd_sendfile_chain.c[m
[31m-[m
[31m-LINUX_DEPS="src/os/unix/ngx_linux_config.h src/os/unix/ngx_linux.h"[m
[31m-LINUX_SRCS=src/os/unix/ngx_linux_init.c[m
[31m-LINUX_SENDFILE_SRCS=src/os/unix/ngx_linux_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-SOLARIS_DEPS="src/os/unix/ngx_solaris_config.h src/os/unix/ngx_solaris.h"[m
[31m-SOLARIS_SRCS=src/os/unix/ngx_solaris_init.c[m
[31m-SOLARIS_SENDFILEV_SRCS=src/os/unix/ngx_solaris_sendfilev_chain.c[m
[31m-[m
[31m-[m
[31m-DARWIN_DEPS="src/os/unix/ngx_darwin_config.h src/os/unix/ngx_darwin.h"[m
[31m-DARWIN_SRCS=src/os/unix/ngx_darwin_init.c[m
[31m-DARWIN_SENDFILE_SRCS=src/os/unix/ngx_darwin_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-WIN32_INCS="$CORE_INCS $EVENT_INCS src/os/win32"[m
[31m-[m
[31m-WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \[m
[31m-            src/os/win32/ngx_win32_config.h \[m
[31m-            src/os/win32/ngx_time.h \[m
[31m-            src/os/win32/ngx_errno.h \[m
[31m-            src/os/win32/ngx_alloc.h \[m
[31m-            src/os/win32/ngx_files.h \[m
[31m-            src/os/win32/ngx_shmem.h \[m
[31m-            src/os/win32/ngx_process.h \[m
[31m-            src/os/win32/ngx_atomic.h \[m
[31m-            src/os/win32/ngx_thread.h \[m
[31m-            src/os/win32/ngx_socket.h \[m
[31m-            src/os/win32/ngx_os.h \[m
[31m-            src/os/win32/ngx_user.h \[m
[31m-            src/os/win32/ngx_dlopen.h \[m
[31m-            src/os/win32/ngx_process_cycle.h"[m
[31m-[m
[31m-WIN32_CONFIG=src/os/win32/ngx_win32_config.h[m
[31m-[m
[31m-WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \[m
[31m-            src/os/win32/ngx_errno.c \[m
[31m-            src/os/win32/ngx_alloc.c \[m
[31m-            src/os/win32/ngx_files.c \[m
[31m-            src/os/win32/ngx_shmem.c \[m
[31m-            src/os/win32/ngx_time.c \[m
[31m-            src/os/win32/ngx_process.c \[m
[31m-            src/os/win32/ngx_thread.c \[m
[31m-            src/os/win32/ngx_socket.c \[m
[31m-            src/os/win32/ngx_wsarecv.c \[m
[31m-            src/os/win32/ngx_wsarecv_chain.c \[m
[31m-            src/os/win32/ngx_udp_wsarecv.c \[m
[31m-            src/os/win32/ngx_wsasend.c \[m
[31m-            src/os/win32/ngx_wsasend_chain.c \[m
[31m-            src/os/win32/ngx_win32_init.c \[m
[31m-            src/os/win32/ngx_user.c \[m
[31m-            src/os/win32/ngx_dlopen.c \[m
[31m-            src/os/win32/ngx_event_log.c \[m
[31m-            src/os/win32/ngx_process_cycle.c \[m
[31m-            src/event/ngx_event_acceptex.c"[m
[31m-[m
[31m-NGX_WIN32_ICONS="src/os/win32/nginx.ico"[m
[31m-NGX_WIN32_RC="src/os/win32/nginx.rc"[m
[31m-[m
[31m-[m
[31m-HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c[m
[31m-[m
[31m-NGX_DTRACE_PROVIDERS=src/dtrace/nginx_provider.d[m
[31m-[m
[31m-NGX_TAPSET_SRCS=src/dtrace/nginx.stp[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/sources.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/sources.orig[m
[1mdeleted file mode 100644[m
[1mindex 27849e6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/sources.orig[m
[1m+++ /dev/null[m
[36m@@ -1,253 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-CORE_MODULES="ngx_core_module ngx_errlog_module ngx_conf_module"[m
[31m-[m
[31m-CORE_INCS="src/core"[m
[31m-[m
[31m-CORE_DEPS="src/core/nginx.h \[m
[31m-           src/core/ngx_config.h \[m
[31m-           src/core/ngx_core.h \[m
[31m-           src/core/ngx_log.h \[m
[31m-           src/core/ngx_palloc.h \[m
[31m-           src/core/ngx_array.h \[m
[31m-           src/core/ngx_list.h \[m
[31m-           src/core/ngx_hash.h \[m
[31m-           src/core/ngx_buf.h \[m
[31m-           src/core/ngx_queue.h \[m
[31m-           src/core/ngx_string.h \[m
[31m-           src/core/ngx_parse.h \[m
[31m-           src/core/ngx_parse_time.h \[m
[31m-           src/core/ngx_inet.h \[m
[31m-           src/core/ngx_file.h \[m
[31m-           src/core/ngx_crc.h \[m
[31m-           src/core/ngx_crc32.h \[m
[31m-           src/core/ngx_murmurhash.h \[m
[31m-           src/core/ngx_md5.h \[m
[31m-           src/core/ngx_sha1.h \[m
[31m-           src/core/ngx_rbtree.h \[m
[31m-           src/core/ngx_radix_tree.h \[m
[31m-           src/core/ngx_rwlock.h \[m
[31m-           src/core/ngx_slab.h \[m
[31m-           src/core/ngx_times.h \[m
[31m-           src/core/ngx_shmtx.h \[m
[31m-           src/core/ngx_connection.h \[m
[31m-           src/core/ngx_cycle.h \[m
[31m-           src/core/ngx_conf_file.h \[m
[31m-           src/core/ngx_module.h \[m
[31m-           src/core/ngx_resolver.h \[m
[31m-           src/core/ngx_open_file_cache.h \[m
[31m-           src/core/ngx_crypt.h \[m
[31m-           src/core/ngx_proxy_protocol.h \[m
[31m-           src/core/ngx_syslog.h"[m
[31m-[m
[31m-[m
[31m-CORE_SRCS="src/core/nginx.c \[m
[31m-           src/core/ngx_log.c \[m
[31m-           src/core/ngx_palloc.c \[m
[31m-           src/core/ngx_array.c \[m
[31m-           src/core/ngx_list.c \[m
[31m-           src/core/ngx_hash.c \[m
[31m-           src/core/ngx_buf.c \[m
[31m-           src/core/ngx_queue.c \[m
[31m-           src/core/ngx_output_chain.c \[m
[31m-           src/core/ngx_string.c \[m
[31m-           src/core/ngx_parse.c \[m
[31m-           src/core/ngx_parse_time.c \[m
[31m-           src/core/ngx_inet.c \[m
[31m-           src/core/ngx_file.c \[m
[31m-           src/core/ngx_crc32.c \[m
[31m-           src/core/ngx_murmurhash.c \[m
[31m-           src/core/ngx_md5.c \[m
[31m-           src/core/ngx_rbtree.c \[m
[31m-           src/core/ngx_radix_tree.c \[m
[31m-           src/core/ngx_slab.c \[m
[31m-           src/core/ngx_times.c \[m
[31m-           src/core/ngx_shmtx.c \[m
[31m-           src/core/ngx_connection.c \[m
[31m-           src/core/ngx_cycle.c \[m
[31m-           src/core/ngx_spinlock.c \[m
[31m-           src/core/ngx_rwlock.c \[m
[31m-           src/core/ngx_cpuinfo.c \[m
[31m-           src/core/ngx_conf_file.c \[m
[31m-           src/core/ngx_module.c \[m
[31m-           src/core/ngx_resolver.c \[m
[31m-           src/core/ngx_open_file_cache.c \[m
[31m-           src/core/ngx_crypt.c \[m
[31m-           src/core/ngx_proxy_protocol.c \[m
[31m-           src/core/ngx_syslog.c"[m
[31m-[m
[31m-[m
[31m-EVENT_MODULES="ngx_events_module ngx_event_core_module"[m
[31m-[m
[31m-EVENT_INCS="src/event src/event/modules"[m
[31m-[m
[31m-EVENT_DEPS="src/event/ngx_event.h \[m
[31m-            src/event/ngx_event_timer.h \[m
[31m-            src/event/ngx_event_posted.h \[m
[31m-            src/event/ngx_event_connect.h \[m
[31m-            src/event/ngx_event_pipe.h"[m
[31m-[m
[31m-EVENT_SRCS="src/event/ngx_event.c \[m
[31m-            src/event/ngx_event_timer.c \[m
[31m-            src/event/ngx_event_posted.c \[m
[31m-            src/event/ngx_event_accept.c \[m
[31m-            src/event/ngx_event_connect.c \[m
[31m-            src/event/ngx_event_pipe.c"[m
[31m-[m
[31m-[m
[31m-SELECT_MODULE=ngx_select_module[m
[31m-SELECT_SRCS=src/event/modules/ngx_select_module.c[m
[31m-WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c[m
[31m-[m
[31m-POLL_MODULE=ngx_poll_module[m
[31m-POLL_SRCS=src/event/modules/ngx_poll_module.c[m
[31m-[m
[31m-KQUEUE_MODULE=ngx_kqueue_module[m
[31m-KQUEUE_SRCS=src/event/modules/ngx_kqueue_module.c[m
[31m-[m
[31m-DEVPOLL_MODULE=ngx_devpoll_module[m
[31m-DEVPOLL_SRCS=src/event/modules/ngx_devpoll_module.c[m
[31m-[m
[31m-EVENTPORT_MODULE=ngx_eventport_module[m
[31m-EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c[m
[31m-[m
[31m-EPOLL_MODULE=ngx_epoll_module[m
[31m-EPOLL_SRCS=src/event/modules/ngx_epoll_module.c[m
[31m-[m
[31m-IOCP_MODULE=ngx_iocp_module[m
[31m-IOCP_SRCS=src/event/modules/ngx_iocp_module.c[m
[31m-[m
[31m-FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"[m
[31m-LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c"[m
[31m-[m
[31m-UNIX_INCS="$CORE_INCS $EVENT_INCS src/os/unix"[m
[31m-[m
[31m-UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \[m
[31m-            src/os/unix/ngx_time.h \[m
[31m-            src/os/unix/ngx_errno.h \[m
[31m-            src/os/unix/ngx_alloc.h \[m
[31m-            src/os/unix/ngx_files.h \[m
[31m-            src/os/unix/ngx_channel.h \[m
[31m-            src/os/unix/ngx_shmem.h \[m
[31m-            src/os/unix/ngx_process.h \[m
[31m-            src/os/unix/ngx_setaffinity.h \[m
[31m-            src/os/unix/ngx_setproctitle.h \[m
[31m-            src/os/unix/ngx_atomic.h \[m
[31m-            src/os/unix/ngx_gcc_atomic_x86.h \[m
[31m-            src/os/unix/ngx_thread.h \[m
[31m-            src/os/unix/ngx_socket.h \[m
[31m-            src/os/unix/ngx_os.h \[m
[31m-            src/os/unix/ngx_user.h \[m
[31m-            src/os/unix/ngx_dlopen.h \[m
[31m-            src/os/unix/ngx_process_cycle.h"[m
[31m-[m
[31m-# add to UNIX_DEPS[m
[31m-#            src/os/unix/ngx_gcc_atomic_amd64.h \[m
[31m-#            src/os/unix/ngx_gcc_atomic_sparc64.h \[m
[31m-#            src/os/unix/ngx_gcc_atomic_ppc.h \[m
[31m-#            src/os/unix/ngx_sunpro_atomic_sparc64.h \[m
[31m-#            src/os/unix/ngx_sunpro_x86.il \[m
[31m-#            src/os/unix/ngx_sunpro_amd64.il \[m
[31m-#            src/os/unix/ngx_sunpro_sparc64.il \[m
[31m-[m
[31m-[m
[31m-UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \[m
[31m-            src/os/unix/ngx_time.c \[m
[31m-            src/os/unix/ngx_errno.c \[m
[31m-            src/os/unix/ngx_alloc.c \[m
[31m-            src/os/unix/ngx_files.c \[m
[31m-            src/os/unix/ngx_socket.c \[m
[31m-            src/os/unix/ngx_recv.c \[m
[31m-            src/os/unix/ngx_readv_chain.c \[m
[31m-            src/os/unix/ngx_udp_recv.c \[m
[31m-            src/os/unix/ngx_send.c \[m
[31m-            src/os/unix/ngx_writev_chain.c \[m
[31m-            src/os/unix/ngx_udp_send.c \[m
[31m-            src/os/unix/ngx_channel.c \[m
[31m-            src/os/unix/ngx_shmem.c \[m
[31m-            src/os/unix/ngx_process.c \[m
[31m-            src/os/unix/ngx_daemon.c \[m
[31m-            src/os/unix/ngx_setaffinity.c \[m
[31m-            src/os/unix/ngx_setproctitle.c \[m
[31m-            src/os/unix/ngx_posix_init.c \[m
[31m-            src/os/unix/ngx_user.c \[m
[31m-            src/os/unix/ngx_dlopen.c \[m
[31m-            src/os/unix/ngx_process_cycle.c"[m
[31m-[m
[31m-POSIX_DEPS=src/os/unix/ngx_posix_config.h[m
[31m-[m
[31m-THREAD_POOL_MODULE=ngx_thread_pool_module[m
[31m-THREAD_POOL_DEPS=src/core/ngx_thread_pool.h[m
[31m-THREAD_POOL_SRCS="src/core/ngx_thread_pool.c[m
[31m-                  src/os/unix/ngx_thread_cond.c[m
[31m-                  src/os/unix/ngx_thread_mutex.c[m
[31m-                  src/os/unix/ngx_thread_id.c"[m
[31m-[m
[31m-FREEBSD_DEPS="src/os/unix/ngx_freebsd_config.h src/os/unix/ngx_freebsd.h"[m
[31m-FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c[m
[31m-FREEBSD_SENDFILE_SRCS=src/os/unix/ngx_freebsd_sendfile_chain.c[m
[31m-[m
[31m-LINUX_DEPS="src/os/unix/ngx_linux_config.h src/os/unix/ngx_linux.h"[m
[31m-LINUX_SRCS=src/os/unix/ngx_linux_init.c[m
[31m-LINUX_SENDFILE_SRCS=src/os/unix/ngx_linux_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-SOLARIS_DEPS="src/os/unix/ngx_solaris_config.h src/os/unix/ngx_solaris.h"[m
[31m-SOLARIS_SRCS=src/os/unix/ngx_solaris_init.c[m
[31m-SOLARIS_SENDFILEV_SRCS=src/os/unix/ngx_solaris_sendfilev_chain.c[m
[31m-[m
[31m-[m
[31m-DARWIN_DEPS="src/os/unix/ngx_darwin_config.h src/os/unix/ngx_darwin.h"[m
[31m-DARWIN_SRCS=src/os/unix/ngx_darwin_init.c[m
[31m-DARWIN_SENDFILE_SRCS=src/os/unix/ngx_darwin_sendfile_chain.c[m
[31m-[m
[31m-[m
[31m-WIN32_INCS="$CORE_INCS $EVENT_INCS src/os/win32"[m
[31m-[m
[31m-WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \[m
[31m-            src/os/win32/ngx_win32_config.h \[m
[31m-            src/os/win32/ngx_time.h \[m
[31m-            src/os/win32/ngx_errno.h \[m
[31m-            src/os/win32/ngx_alloc.h \[m
[31m-            src/os/win32/ngx_files.h \[m
[31m-            src/os/win32/ngx_shmem.h \[m
[31m-            src/os/win32/ngx_process.h \[m
[31m-            src/os/win32/ngx_atomic.h \[m
[31m-            src/os/win32/ngx_thread.h \[m
[31m-            src/os/win32/ngx_socket.h \[m
[31m-            src/os/win32/ngx_os.h \[m
[31m-            src/os/win32/ngx_user.h \[m
[31m-            src/os/win32/ngx_dlopen.h \[m
[31m-            src/os/win32/ngx_process_cycle.h"[m
[31m-[m
[31m-WIN32_CONFIG=src/os/win32/ngx_win32_config.h[m
[31m-[m
[31m-WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \[m
[31m-            src/os/win32/ngx_errno.c \[m
[31m-            src/os/win32/ngx_alloc.c \[m
[31m-            src/os/win32/ngx_files.c \[m
[31m-            src/os/win32/ngx_shmem.c \[m
[31m-            src/os/win32/ngx_time.c \[m
[31m-            src/os/win32/ngx_process.c \[m
[31m-            src/os/win32/ngx_thread.c \[m
[31m-            src/os/win32/ngx_socket.c \[m
[31m-            src/os/win32/ngx_wsarecv.c \[m
[31m-            src/os/win32/ngx_wsarecv_chain.c \[m
[31m-            src/os/win32/ngx_udp_wsarecv.c \[m
[31m-            src/os/win32/ngx_wsasend.c \[m
[31m-            src/os/win32/ngx_wsasend_chain.c \[m
[31m-            src/os/win32/ngx_win32_init.c \[m
[31m-            src/os/win32/ngx_user.c \[m
[31m-            src/os/win32/ngx_dlopen.c \[m
[31m-            src/os/win32/ngx_event_log.c \[m
[31m-            src/os/win32/ngx_process_cycle.c \[m
[31m-            src/event/ngx_event_acceptex.c"[m
[31m-[m
[31m-NGX_WIN32_ICONS="src/os/win32/nginx.ico"[m
[31m-NGX_WIN32_RC="src/os/win32/nginx.rc"[m
[31m-[m
[31m-[m
[31m-HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/stubs b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/stubs[m
[1mdeleted file mode 100644[m
[1mindex d8bc1f0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/stubs[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-have=NGX_SUPPRESS_WARN . auto/have[m
[31m-[m
[31m-have=NGX_SMP . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/summary b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/summary[m
[1mdeleted file mode 100644[m
[1mindex ed67c75..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/summary[m
[1m+++ /dev/null[m
[36m@@ -1,109 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo[m
[31m-echo "Configuration summary"[m
[31m-[m
[31m-[m
[31m-if [ $USE_THREADS = YES ]; then[m
[31m-    echo "  + using threads"[m
[31m-fi[m
[31m-[m
[31m-if [ $USE_PCRE = DISABLED ]; then[m
[31m-    echo "  + PCRE library is disabled"[m
[31m-[m
[31m-else[m
[31m-    case $PCRE in[m
[31m-        YES)   echo "  + using system PCRE library" ;;[m
[31m-        NONE)  echo "  + PCRE library is not used" ;;[m
[31m-        *)     echo "  + using PCRE library: $PCRE" ;;[m
[31m-    esac[m
[31m-fi[m
[31m-[m
[31m-case $OPENSSL in[m
[31m-    YES)   echo "  + using system OpenSSL library" ;;[m
[31m-    NONE)  echo "  + OpenSSL library is not used" ;;[m
[31m-    *)     echo "  + using OpenSSL library: $OPENSSL" ;;[m
[31m-esac[m
[31m-[m
[31m-case $MD5 in[m
[31m-    YES)   echo "  + md5: using $MD5_LIB library" ;;[m
[31m-    NONE)  echo "  + md5 library is not used" ;;[m
[31m-    NO)    echo "  + using builtin md5 code" ;;[m
[31m-    *)     echo "  + using md5 library: $MD5" ;;[m
[31m-esac[m
[31m-[m
[31m-case $SHA1 in[m
[31m-    YES)   echo "  + sha1: using $SHA1_LIB library" ;;[m
[31m-    NONE)  echo "  + sha1 library is not used" ;;[m
[31m-    NO)    echo "  + sha1 library is not found" ;;[m
[31m-    *)     echo "  + using sha1 library: $SHA1" ;;[m
[31m-esac[m
[31m-[m
[31m-case $ZLIB in[m
[31m-    YES)   echo "  + using system zlib library" ;;[m
[31m-    NONE)  echo "  + zlib library is not used" ;;[m
[31m-    *)     echo "  + using zlib library: $ZLIB" ;;[m
[31m-esac[m
[31m-[m
[31m-case $NGX_LIBATOMIC in[m
[31m-    YES)   echo "  + using system libatomic_ops library" ;;[m
[31m-    NO)    ;; # not used[m
[31m-    *)     echo "  + using libatomic_ops library: $NGX_LIBATOMIC" ;;[m
[31m-esac[m
[31m-[m
[31m-echo[m
[31m-[m
[31m-[m
[31m-cat << END[m
[31m-  nginx path prefix: "$NGX_PREFIX"[m
[31m-  nginx binary file: "$NGX_SBIN_PATH"[m
[31m-  nginx modules path: "$NGX_MODULES_PATH"[m
[31m-  nginx configuration prefix: "$NGX_CONF_PREFIX"[m
[31m-  nginx configuration file: "$NGX_CONF_PATH"[m
[31m-  nginx pid file: "$NGX_PID_PATH"[m
[31m-END[m
[31m-[m
[31m-if test -n "$NGX_ERROR_LOG_PATH"; then[m
[31m-    echo "  nginx error log file: \"$NGX_ERROR_LOG_PATH\""[m
[31m-else[m
[31m-    echo "  nginx logs errors to stderr"[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    cat << END[m
[31m-  nginx dtrace static probes enabled[m
[31m-END[m
[31m-[m
[31m-    if [ $DTRACE_FROM_SYSTEMTAP = YES ]; then[m
[31m-        cat << END[m
[31m-  nginx systemtap tapset prefix: "$NGX_TAPSET_PREFIX"[m
[31m-  nginx systemtap wrapper script: "$NGX_STAP_NGX_PATH"[m
[31m-END[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-cat << END[m
[31m-  nginx http access log file: "$NGX_HTTP_LOG_PATH"[m
[31m-  nginx http client request body temporary files: "$NGX_HTTP_CLIENT_TEMP_PATH"[m
[31m-END[m
[31m-[m
[31m-if [ $HTTP_PROXY = YES ]; then[m
[31m-    echo "  nginx http proxy temporary files: \"$NGX_HTTP_PROXY_TEMP_PATH\""[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_FASTCGI = YES ]; then[m
[31m-    echo "  nginx http fastcgi temporary files: \"$NGX_HTTP_FASTCGI_TEMP_PATH\""[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_UWSGI = YES ]; then[m
[31m-    echo "  nginx http uwsgi temporary files: \"$NGX_HTTP_UWSGI_TEMP_PATH\""[m
[31m-fi[m
[31m-[m
[31m-if [ $HTTP_SCGI = YES ]; then[m
[31m-    echo "  nginx http scgi temporary files: \"$NGX_HTTP_SCGI_TEMP_PATH\""[m
[31m-fi[m
[31m-[m
[31m-echo "$NGX_POST_CONF_MSG"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/threads b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/threads[m
[1mdeleted file mode 100644[m
[1mindex 381f07a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/threads[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-if [ $USE_THREADS = YES ]; then[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-        cat << END[m
[31m-[m
[31m-$0: --with-threads is not supported on Windows[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-    have=NGX_THREADS . auto/have[m
[31m-    CORE_DEPS="$CORE_DEPS $THREAD_POOL_DEPS"[m
[31m-    CORE_SRCS="$CORE_SRCS $THREAD_POOL_SRCS"[m
[31m-    CORE_LIBS="$CORE_LIBS -lpthread"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/sizeof b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/sizeof[m
[1mdeleted file mode 100644[m
[1mindex b5b71bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/sizeof[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_type size ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_type size[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_size=[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-$NGX_INCLUDE_UNISTD_H[m
[31m-#include <signal.h>[m
[31m-#include <stdio.h>[m
[31m-#include <sys/resource.h>[m
[31m-$NGX_INCLUDE_INTTYPES_H[m
[31m-$NGX_INCLUDE_AUTO_CONFIG_H[m
[31m-[m
[31m-int main() {[m
[31m-    printf("%d", (int) sizeof($ngx_type));[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-[m
[31m-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \[m
[31m-          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"[m
[31m-[m
[31m-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    ngx_size=`$NGX_AUTOTEST`[m
[31m-    echo " $ngx_size bytes"[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-case $ngx_size in[m
[31m-    4)[m
[31m-        ngx_max_value=2147483647[m
[31m-        ngx_max_len='(sizeof("-2147483648") - 1)'[m
[31m-    ;;[m
[31m-[m
[31m-    8)[m
[31m-        ngx_max_value=9223372036854775807LL[m
[31m-        ngx_max_len='(sizeof("-9223372036854775808") - 1)'[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        echo[m
[31m-        echo "$0: error: can not detect $ngx_type size"[m
[31m-[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-        cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-        echo $ngx_test       >> $NGX_AUTOCONF_ERR[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-        rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-        exit 1[m
[31m-esac[m
[31m-[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/typedef b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/typedef[m
[1mdeleted file mode 100644[m
[1mindex b55237e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/typedef[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for $ngx_type ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for $ngx_type[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_found=no[m
[31m-[m
[31m-for ngx_try in $ngx_type $ngx_types[m
[31m-do[m
[31m-[m
[31m-    cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <signal.h>[m
[31m-#include <sys/socket.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <netinet/in.h>[m
[31m-$NGX_INCLUDE_INTTYPES_H[m
[31m-[m
[31m-int main() {[m
[31m-    $ngx_try i = 0;[m
[31m-    return (int) i;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-    ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \[m
[31m-              -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"[m
[31m-[m
[31m-    eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-    if [ -x $NGX_AUTOTEST ]; then[m
[31m-        if [ $ngx_try = $ngx_type ]; then[m
[31m-            echo " found"[m
[31m-            ngx_found=yes[m
[31m-        else[m
[31m-            echo ", $ngx_try used"[m
[31m-            ngx_found=$ngx_try[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        if [ $ngx_try = $ngx_type ]; then[m
[31m-            echo $ngx_n " $ngx_try not found$ngx_c"[m
[31m-        else[m
[31m-            echo $ngx_n ", $ngx_try not found$ngx_c"[m
[31m-        fi[m
[31m-[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-        cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-        echo $ngx_test       >> $NGX_AUTOCONF_ERR[m
[31m-        echo "----------"    >> $NGX_AUTOCONF_ERR[m
[31m-    fi[m
[31m-[m
[31m-    rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-    if [ $ngx_found != no ]; then[m
[31m-        break[m
[31m-    fi[m
[31m-done[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    echo[m
[31m-    echo "$0: error: can not define $ngx_type"[m
[31m-[m
[31m-    exit 1[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found != yes ]; then[m
[31m-    echo "typedef $ngx_found  $ngx_type;"   >> $NGX_AUTO_CONFIG_H[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/uintptr_t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/uintptr_t[m
[1mdeleted file mode 100644[m
[1mindex 2b7212e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/uintptr_t[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-echo $ngx_n "checking for uintptr_t ...$ngx_c"[m
[31m-[m
[31m-cat << END >> $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-----------------------------------------[m
[31m-checking for uintptr_t[m
[31m-[m
[31m-END[m
[31m-[m
[31m-found=no[m
[31m-[m
[31m-cat << END > $NGX_AUTOTEST.c[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-$NGX_INTTYPES_H[m
[31m-[m
[31m-int main() {[m
[31m-    uintptr_t i = 0;[m
[31m-    return (int) i;[m
[31m-}[m
[31m-[m
[31m-END[m
[31m-[m
[31m-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \[m
[31m-          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT"[m
[31m-[m
[31m-eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"[m
[31m-[m
[31m-if [ -x $NGX_AUTOTEST ]; then[m
[31m-    echo " uintptr_t found"[m
[31m-    found=yes[m
[31m-else[m
[31m-    echo $ngx_n " uintptr_t not found" $ngx_c[m
[31m-fi[m
[31m-[m
[31m-rm -rf $NGX_AUTOTEST*[m
[31m-[m
[31m-[m
[31m-if [ $found = no ]; then[m
[31m-    found="uint`expr 8 \* $ngx_ptr_size`_t"[m
[31m-    echo ", $found used"[m
[31m-[m
[31m-    echo "typedef $found  uintptr_t;"                   >> $NGX_AUTO_CONFIG_H[m
[31m-    echo "typedef $found  intptr_t;" | sed -e 's/u//g'  >> $NGX_AUTO_CONFIG_H[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/value b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/value[m
[1mdeleted file mode 100644[m
[1mindex ac88a39..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/types/value[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#ifndef $ngx_param[m
[31m-#define $ngx_param  $ngx_value[m
[31m-#endif[m
[31m-[m
[31m-END[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/unix b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/unix[m
[1mdeleted file mode 100755[m
[1mindex 8c0e813..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/auto/unix[m
[1m+++ /dev/null[m
[36m@@ -1,911 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-NGX_USER=${NGX_USER:-nobody}[m
[31m-[m
[31m-if [ -z "$NGX_GROUP" ]; then[m
[31m-    if [ $NGX_USER = nobody ]; then[m
[31m-        if grep nobody /etc/group 2>&1 >/dev/null; then[m
[31m-            echo "checking for nobody group ... found"[m
[31m-            NGX_GROUP=nobody[m
[31m-        else[m
[31m-            echo "checking for nobody group ... not found"[m
[31m-[m
[31m-            if grep nogroup /etc/group 2>&1 >/dev/null; then[m
[31m-                echo "checking for nogroup group ... found"[m
[31m-                NGX_GROUP=nogroup[m
[31m-            else[m
[31m-                echo "checking for nogroup group ... not found"[m
[31m-                NGX_GROUP=nobody[m
[31m-            fi[m
[31m-        fi[m
[31m-    else[m
[31m-        NGX_GROUP=$NGX_USER[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="poll()"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <poll.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int  n; struct pollfd  pl;[m
[31m-                  pl.fd = 0;[m
[31m-                  pl.events = 0;[m
[31m-                  pl.revents = 0;[m
[31m-                  n = poll(&pl, 1, 0);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    EVENT_POLL=NONE[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="/dev/poll"[m
[31m-ngx_feature_name="NGX_HAVE_DEVPOLL"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/devpoll.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int  n, dp; struct dvpoll  dvp;[m
[31m-                  dp = 0;[m
[31m-                  dvp.dp_fds = NULL;[m
[31m-                  dvp.dp_nfds = 0;[m
[31m-                  dvp.dp_timeout = 0;[m
[31m-                  n = ioctl(dp, DP_POLL, &dvp);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS"[m
[31m-    EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE"[m
[31m-    EVENT_FOUND=YES[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if test -z "$NGX_KQUEUE_CHECKED"; then[m
[31m-    ngx_feature="kqueue"[m
[31m-    ngx_feature_name="NGX_HAVE_KQUEUE"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <sys/event.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="int kq; kq = kqueue()"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-        have=NGX_HAVE_CLEAR_EVENT . auto/have[m
[31m-        EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"[m
[31m-        CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"[m
[31m-        EVENT_FOUND=YES[m
[31m-[m
[31m-        ngx_feature="kqueue's NOTE_LOWAT"[m
[31m-        ngx_feature_name="NGX_HAVE_LOWAT_EVENT"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <sys/event.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="struct kevent  kev;[m
[31m-                          kev.fflags = NOTE_LOWAT;"[m
[31m-        . auto/feature[m
[31m-[m
[31m-[m
[31m-        ngx_feature="kqueue's EVFILT_TIMER"[m
[31m-        ngx_feature_name="NGX_HAVE_TIMER_EVENT"[m
[31m-        ngx_feature_run=yes[m
[31m-        ngx_feature_incs="#include <sys/event.h>[m
[31m-                          #include <sys/time.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="int      kq;[m
[31m-                  struct kevent    kev;[m
[31m-                  struct timespec  ts;[m
[31m-[m
[31m-                  if ((kq = kqueue()) == -1) return 1;[m
[31m-[m
[31m-                  kev.ident = 0;[m
[31m-                  kev.filter = EVFILT_TIMER;[m
[31m-                  kev.flags = EV_ADD|EV_ENABLE;[m
[31m-                  kev.fflags = 0;[m
[31m-                  kev.data = 1000;[m
[31m-                  kev.udata = 0;[m
[31m-[m
[31m-                  ts.tv_sec = 0;[m
[31m-                  ts.tv_nsec = 0;[m
[31m-[m
[31m-                  if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1;[m
[31m-[m
[31m-                  if (kev.flags & EV_ERROR) return 1;"[m
[31m-[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ "$NGX_SYSTEM" = "NetBSD" ]; then[m
[31m-[m
[31m-    # NetBSD 2.0 incompatibly defines kevent.udata as "intptr_t"[m
[31m-[m
[31m-    cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#define NGX_KQUEUE_UDATA_T[m
[31m-[m
[31m-END[m
[31m-[m
[31m-else[m
[31m-    cat << END >> $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-#define NGX_KQUEUE_UDATA_T  (void *)[m
[31m-[m
[31m-END[m
[31m-[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="crypt()"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="crypt(\"test\", \"salt\");"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    ngx_feature="crypt() in libcrypt"[m
[31m-    ngx_feature_name=[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs=[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=-lcrypt[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CRYPT_LIB="-lcrypt"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="F_READAHEAD"[m
[31m-ngx_feature_name="NGX_HAVE_F_READAHEAD"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="fcntl(0, F_READAHEAD, 1);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="posix_fadvise()"[m
[31m-ngx_feature_name="NGX_HAVE_POSIX_FADVISE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="O_DIRECT"[m
[31m-ngx_feature_name="NGX_HAVE_O_DIRECT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="fcntl(0, F_SETFL, O_DIRECT);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = yes -a "$NGX_SYSTEM" = "Linux" ]; then[m
[31m-    have=NGX_HAVE_ALIGNED_DIRECTIO . auto/have[m
[31m-fi[m
[31m-[m
[31m-ngx_feature="F_NOCACHE"[m
[31m-ngx_feature_name="NGX_HAVE_F_NOCACHE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="fcntl(0, F_NOCACHE, 1);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="directio()"[m
[31m-ngx_feature_name="NGX_HAVE_DIRECTIO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="directio(0, DIRECTIO_ON);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="statfs()"[m
[31m-ngx_feature_name="NGX_HAVE_STATFS"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="$NGX_INCLUDE_SYS_PARAM_H[m
[31m-                  $NGX_INCLUDE_SYS_MOUNT_H[m
[31m-                  $NGX_INCLUDE_SYS_VFS_H"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct statfs  fs;[m
[31m-                  statfs(\".\", &fs);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="statvfs()"[m
[31m-ngx_feature_name="NGX_HAVE_STATVFS"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/statvfs.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct statvfs  fs;[m
[31m-                  statvfs(\".\", &fs);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="dlopen()"[m
[31m-ngx_feature_name="NGX_HAVE_DLOPEN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <dlfcn.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); dlsym(NULL, NULL)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found != yes ]; then[m
[31m-[m
[31m-    ngx_feature="dlopen() in libdl"[m
[31m-    ngx_feature_libs="-ldl"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -ldl"[m
[31m-        NGX_LIBDL="-ldl"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="sched_yield()"[m
[31m-ngx_feature_name="NGX_HAVE_SCHED_YIELD"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sched.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="sched_yield()"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found != yes ]; then[m
[31m-[m
[31m-    ngx_feature="sched_yield() in librt"[m
[31m-    ngx_feature_libs="-lrt"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -lrt"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="SO_SETFIB"[m
[31m-ngx_feature_name="NGX_HAVE_SETFIB"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="SO_REUSEPORT"[m
[31m-ngx_feature_name="NGX_HAVE_REUSEPORT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_REUSEPORT, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="SO_ACCEPTFILTER"[m
[31m-ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# BSD way to get IPv4 datagram destination address[m
[31m-[m
[31m-ngx_feature="IP_RECVDSTADDR"[m
[31m-ngx_feature_name="NGX_HAVE_IP_RECVDSTADDR"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_RECVDSTADDR, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# Linux way to get IPv4 datagram destination address[m
[31m-[m
[31m-ngx_feature="IP_PKTINFO"[m
[31m-ngx_feature_name="NGX_HAVE_IP_PKTINFO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_PKTINFO, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# RFC 3542 way to get IPv6 datagram destination address[m
[31m-[m
[31m-ngx_feature="IPV6_RECVPKTINFO"[m
[31m-ngx_feature_name="NGX_HAVE_IPV6_RECVPKTINFO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_IPV6, IPV6_RECVPKTINFO, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="TCP_DEFER_ACCEPT"[m
[31m-ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_DEFER_ACCEPT, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="TCP_KEEPIDLE"[m
[31m-ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPIDLE, NULL, 0);[m
[31m-                  setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0);[m
[31m-                  setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="TCP_FASTOPEN"[m
[31m-ngx_feature_name="NGX_HAVE_TCP_FASTOPEN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_FASTOPEN, NULL, 0)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="TCP_INFO"[m
[31m-ngx_feature_name="NGX_HAVE_TCP_INFO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <netinet/in.h>[m
[31m-                  #include <netinet/tcp.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="socklen_t optlen = sizeof(struct tcp_info);[m
[31m-                  struct tcp_info ti;[m
[31m-                  ti.tcpi_rtt = 0;[m
[31m-                  ti.tcpi_rttvar = 0;[m
[31m-                  ti.tcpi_snd_cwnd = 0;[m
[31m-                  ti.tcpi_rcv_space = 0;[m
[31m-                  getsockopt(0, IPPROTO_TCP, TCP_INFO, &ti, &optlen)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="accept4()"[m
[31m-ngx_feature_name="NGX_HAVE_ACCEPT4"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="accept4(0, NULL, NULL, SOCK_NONBLOCK)"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $NGX_FILE_AIO = YES ]; then[m
[31m-[m
[31m-    ngx_feature="kqueue AIO support"[m
[31m-    ngx_feature_name="NGX_HAVE_FILE_AIO"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <aio.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="int  n; struct aiocb  iocb;[m
[31m-                      iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;[m
[31m-                      n = aio_read(&iocb)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_SRCS="$CORE_SRCS $FILE_AIO_SRCS"[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-[m
[31m-        ngx_feature="Linux AIO support"[m
[31m-        ngx_feature_name="NGX_HAVE_FILE_AIO"[m
[31m-        ngx_feature_run=no[m
[31m-        ngx_feature_incs="#include <linux/aio_abi.h>[m
[31m-                          #include <sys/eventfd.h>"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs=[m
[31m-        ngx_feature_test="struct iocb  iocb;[m
[31m-                          iocb.aio_lio_opcode = IOCB_CMD_PREAD;[m
[31m-                          iocb.aio_flags = IOCB_FLAG_RESFD;[m
[31m-                          iocb.aio_resfd = -1;[m
[31m-                          (void) eventfd(0, 0)"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            have=NGX_HAVE_EVENTFD . auto/have[m
[31m-            have=NGX_HAVE_SYS_EVENTFD_H . auto/have[m
[31m-            CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS"[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-[m
[31m-        ngx_feature="Linux AIO support (SYS_eventfd)"[m
[31m-        ngx_feature_incs="#include <linux/aio_abi.h>[m
[31m-                          #include <sys/syscall.h>"[m
[31m-        ngx_feature_test="int  n = SYS_eventfd;[m
[31m-                          struct iocb  iocb;[m
[31m-                          iocb.aio_lio_opcode = IOCB_CMD_PREAD;[m
[31m-                          iocb.aio_flags = IOCB_FLAG_RESFD;[m
[31m-                          iocb.aio_resfd = -1;"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = yes ]; then[m
[31m-            have=NGX_HAVE_EVENTFD . auto/have[m
[31m-            CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS"[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        cat << END[m
[31m-[m
[31m-$0: no supported file AIO was found[m
[31m-Currently file AIO is supported on FreeBSD 4.3+ and Linux 2.6.22+ only[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-else[m
[31m-[m
[31m-    ngx_feature="eventfd()"[m
[31m-    ngx_feature_name="NGX_HAVE_EVENTFD"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <sys/eventfd.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="(void) eventfd(0, 0)"[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        have=NGX_HAVE_SYS_EVENTFD_H . auto/have[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-[m
[31m-        ngx_feature="eventfd() (SYS_eventfd)"[m
[31m-        ngx_feature_incs="#include <sys/syscall.h>"[m
[31m-        ngx_feature_test="int n = SYS_eventfd"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-have=NGX_HAVE_UNIX_DOMAIN . auto/have[m
[31m-[m
[31m-ngx_feature_libs=[m
[31m-[m
[31m-[m
[31m-# C types[m
[31m-[m
[31m-ngx_type="int"; . auto/types/sizeof[m
[31m-[m
[31m-ngx_type="long"; . auto/types/sizeof[m
[31m-[m
[31m-ngx_type="long long"; . auto/types/sizeof[m
[31m-[m
[31m-ngx_type="void *"; . auto/types/sizeof; ngx_ptr_size=$ngx_size[m
[31m-ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value[m
[31m-[m
[31m-[m
[31m-# POSIX types[m
[31m-[m
[31m-NGX_INCLUDE_AUTO_CONFIG_H="#include \"ngx_auto_config.h\""[m
[31m-[m
[31m-ngx_type="uint32_t"; ngx_types="u_int32_t"; . auto/types/typedef[m
[31m-ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef[m
[31m-[m
[31m-ngx_type="sig_atomic_t"; ngx_types="int"; . auto/types/typedef[m
[31m-. auto/types/sizeof[m
[31m-ngx_param=NGX_SIG_ATOMIC_T_SIZE; ngx_value=$ngx_size; . auto/types/value[m
[31m-[m
[31m-ngx_type="socklen_t"; ngx_types="int"; . auto/types/typedef[m
[31m-[m
[31m-ngx_type="in_addr_t"; ngx_types="uint32_t u_int32_t"; . auto/types/typedef[m
[31m-[m
[31m-ngx_type="in_port_t"; ngx_types="u_short"; . auto/types/typedef[m
[31m-[m
[31m-ngx_type="rlim_t"; ngx_types="int"; . auto/types/typedef[m
[31m-[m
[31m-. auto/types/uintptr_t[m
[31m-[m
[31m-. auto/endianness[m
[31m-[m
[31m-ngx_type="size_t"; . auto/types/sizeof[m
[31m-ngx_param=NGX_MAX_SIZE_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value[m
[31m-ngx_param=NGX_SIZE_T_LEN; ngx_value=$ngx_max_len; . auto/types/value[m
[31m-[m
[31m-ngx_type="off_t"; . auto/types/sizeof[m
[31m-ngx_param=NGX_MAX_OFF_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value[m
[31m-ngx_param=NGX_OFF_T_LEN; ngx_value=$ngx_max_len; . auto/types/value[m
[31m-[m
[31m-ngx_type="time_t"; . auto/types/sizeof[m
[31m-ngx_param=NGX_TIME_T_SIZE; ngx_value=$ngx_size; . auto/types/value[m
[31m-ngx_param=NGX_TIME_T_LEN; ngx_value=$ngx_max_len; . auto/types/value[m
[31m-ngx_param=NGX_MAX_TIME_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value[m
[31m-[m
[31m-[m
[31m-# syscalls, libc calls and some features[m
[31m-[m
[31m-[m
[31m-if [ $NGX_IPV6 = YES ]; then[m
[31m-    ngx_feature="AF_INET6"[m
[31m-    ngx_feature_name="NGX_HAVE_INET6"[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_incs="#include <sys/socket.h>[m
[31m-                      #include <netinet/in.h>[m
[31m-                      #include <arpa/inet.h>"[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test="struct sockaddr_in6  sin6;[m
[31m-                      sin6.sin6_family = AF_INET6;"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="setproctitle()"[m
[31m-ngx_feature_name="NGX_HAVE_SETPROCTITLE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdlib.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=$NGX_SETPROCTITLE_LIB[m
[31m-ngx_feature_test="setproctitle(\"test\");"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="pread()"[m
[31m-ngx_feature_name="NGX_HAVE_PREAD"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="char buf[1]; ssize_t n; n = pread(0, buf, 1, 0);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="pwrite()"[m
[31m-ngx_feature_name="NGX_HAVE_PWRITE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="char buf[1]; ssize_t n; n = pwrite(1, buf, 1, 0);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-# pwritev() was introduced in FreeBSD 6 and Linux 2.6.30, glibc 2.10[m
[31m-[m
[31m-ngx_feature="pwritev()"[m
[31m-ngx_feature_name="NGX_HAVE_PWRITEV"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs='#include <sys/uio.h>'[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="char buf[1]; struct iovec vec[1]; ssize_t n;[m
[31m-                  vec[0].iov_base = buf;[m
[31m-                  vec[0].iov_len = 1;[m
[31m-                  n = pwritev(1, vec, 1, 0);[m
[31m-                  if (n == -1) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="sys_nerr"[m
[31m-ngx_feature_name="NGX_SYS_NERR"[m
[31m-ngx_feature_run=value[m
[31m-ngx_feature_incs='#include <errno.h>[m
[31m-                  #include <stdio.h>'[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test='printf("%d", sys_nerr);'[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # Cygiwn defines _sys_nerr[m
[31m-    ngx_feature="_sys_nerr"[m
[31m-    ngx_feature_name="NGX_SYS_NERR"[m
[31m-    ngx_feature_run=value[m
[31m-    ngx_feature_incs='#include <errno.h>[m
[31m-                      #include <stdio.h>'[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test='printf("%d", _sys_nerr);'[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # Solaris has no sys_nerr[m
[31m-    ngx_feature='maximum errno'[m
[31m-    ngx_feature_name=NGX_SYS_NERR[m
[31m-    ngx_feature_run=value[m
[31m-    ngx_feature_incs='#include <errno.h>[m
[31m-                      #include <string.h>[m
[31m-                      #include <stdio.h>'[m
[31m-    ngx_feature_path=[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_test='int  n;[m
[31m-                      char *p;[m
[31m-                      for (n = 1; n < 1000; n++) {[m
[31m-                          errno = 0;[m
[31m-                          p = strerror(n);[m
[31m-                          if (errno == EINVAL[m
[31m-                              || p == NULL[m
[31m-                              || strncmp(p, "Unknown error", 13) == 0)[m
[31m-                          {[m
[31m-                              break;[m
[31m-                          }[m
[31m-                      }[m
[31m-                      printf("%d", n);'[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="localtime_r()"[m
[31m-ngx_feature_name="NGX_HAVE_LOCALTIME_R"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <time.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct tm t; time_t c=0; localtime_r(&c, &t)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="posix_memalign()"[m
[31m-ngx_feature_name="NGX_HAVE_POSIX_MEMALIGN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdlib.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="void *p; int n; n = posix_memalign(&p, 4096, 4096);[m
[31m-                  if (n != 0) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="memalign()"[m
[31m-ngx_feature_name="NGX_HAVE_MEMALIGN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdlib.h>[m
[31m-                  #include <malloc.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="void *p; p = memalign(4096, 4096);[m
[31m-                  if (p == NULL) return 1"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="mmap(MAP_ANON|MAP_SHARED)"[m
[31m-ngx_feature_name="NGX_HAVE_MAP_ANON"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/mman.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="void *p;[m
[31m-                  p = mmap(NULL, 4096, PROT_READ|PROT_WRITE,[m
[31m-                           MAP_ANON|MAP_SHARED, -1, 0);[m
[31m-                  if (p == MAP_FAILED) return 1;"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature='mmap("/dev/zero", MAP_SHARED)'[m
[31m-ngx_feature_name="NGX_HAVE_MAP_DEVZERO"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/mman.h>[m
[31m-                  #include <sys/stat.h>[m
[31m-                  #include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test='void *p; int  fd;[m
[31m-                  fd = open("/dev/zero", O_RDWR);[m
[31m-                  p = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);[m
[31m-                  if (p == MAP_FAILED) return 1;'[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="System V shared memory"[m
[31m-ngx_feature_name="NGX_HAVE_SYSVSHM"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <sys/ipc.h>[m
[31m-                  #include <sys/shm.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int  id;[m
[31m-                  id = shmget(IPC_PRIVATE, 4096, (SHM_R|SHM_W|IPC_CREAT));[m
[31m-                  if (id == -1) return 1;[m
[31m-                  shmctl(id, IPC_RMID, NULL);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="POSIX semaphores"[m
[31m-ngx_feature_name="NGX_HAVE_POSIX_SEM"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <semaphore.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="sem_t  sem;[m
[31m-                  if (sem_init(&sem, 1, 0) == -1) return 1;[m
[31m-                  sem_destroy(&sem);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # Linux has POSIX semaphores in libpthread[m
[31m-    ngx_feature="POSIX semaphores in libpthread"[m
[31m-    ngx_feature_libs=-lpthread[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -lpthread"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-[m
[31m-    # Solaris has POSIX semaphores in librt[m
[31m-    ngx_feature="POSIX semaphores in librt"[m
[31m-    ngx_feature_libs=-lrt[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        CORE_LIBS="$CORE_LIBS -lrt"[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-[m
[31m-ngx_feature="struct msghdr.msg_control"[m
[31m-ngx_feature_name="NGX_HAVE_MSGHDR_MSG_CONTROL"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/socket.h>[m
[31m-                  #include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct msghdr  msg;[m
[31m-                  printf(\"%d\", (int) sizeof(msg.msg_control))"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="ioctl(FIONBIO)"[m
[31m-ngx_feature_name="NGX_HAVE_FIONBIO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/ioctl.h>[m
[31m-                  #include <stdio.h>[m
[31m-                  $NGX_INCLUDE_SYS_FILIO_H"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="int i = FIONBIO; printf(\"%d\", i)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="struct tm.tm_gmtoff"[m
[31m-ngx_feature_name="NGX_HAVE_GMTOFF"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <time.h>[m
[31m-                  #include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct tm  tm; tm.tm_gmtoff = 0;[m
[31m-                  printf(\"%d\", (int) tm.tm_gmtoff)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="struct dirent.d_namlen"[m
[31m-ngx_feature_name="NGX_HAVE_D_NAMLEN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <dirent.h>[m
[31m-                  #include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct dirent  dir; dir.d_namlen = 0;[m
[31m-                  printf(\"%d\", (int) dir.d_namlen)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="struct dirent.d_type"[m
[31m-ngx_feature_name="NGX_HAVE_D_TYPE"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <dirent.h>[m
[31m-                  #include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct dirent  dir; dir.d_type = DT_REG;[m
[31m-                  printf(\"%d\", (int) dir.d_type)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="sysconf(_SC_NPROCESSORS_ONLN)"[m
[31m-ngx_feature_name="NGX_HAVE_SC_NPROCESSORS_ONLN"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs=[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="sysconf(_SC_NPROCESSORS_ONLN)"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="openat(), fstatat()"[m
[31m-ngx_feature_name="NGX_HAVE_OPENAT"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/stat.h>[m
[31m-                  #include <fcntl.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test="struct stat sb;[m
[31m-                  openat(AT_FDCWD, \".\", O_RDONLY|O_NOFOLLOW);[m
[31m-                  fstatat(AT_FDCWD, \".\", &sb, AT_SYMLINK_NOFOLLOW);"[m
[31m-. auto/feature[m
[31m-[m
[31m-[m
[31m-ngx_feature="getaddrinfo()"[m
[31m-ngx_feature_name="NGX_HAVE_GETADDRINFO"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-                  #include <sys/socket.h>[m
[31m-                  #include <netdb.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_test='struct addrinfo *res;[m
[31m-                  if (getaddrinfo("localhost", NULL, NULL, &res) != 0) return 1;[m
[31m-                  freeaddrinfo(res)'[m
[31m-. auto/feature[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/fastcgi.conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/fastcgi.conf[m
[1mdeleted file mode 100644[m
[1mindex 091738c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/fastcgi.conf[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;[m
[31m-fastcgi_param  QUERY_STRING       $query_string;[m
[31m-fastcgi_param  REQUEST_METHOD     $request_method;[m
[31m-fastcgi_param  CONTENT_TYPE       $content_type;[m
[31m-fastcgi_param  CONTENT_LENGTH     $content_length;[m
[31m-[m
[31m-fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;[m
[31m-fastcgi_param  REQUEST_URI        $request_uri;[m
[31m-fastcgi_param  DOCUMENT_URI       $document_uri;[m
[31m-fastcgi_param  DOCUMENT_ROOT      $document_root;[m
[31m-fastcgi_param  SERVER_PROTOCOL    $server_protocol;[m
[31m-fastcgi_param  REQUEST_SCHEME     $scheme;[m
[31m-fastcgi_param  HTTPS              $https if_not_empty;[m
[31m-[m
[31m-fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;[m
[31m-fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;[m
[31m-[m
[31m-fastcgi_param  REMOTE_ADDR        $remote_addr;[m
[31m-fastcgi_param  REMOTE_PORT        $remote_port;[m
[31m-fastcgi_param  SERVER_ADDR        $server_addr;[m
[31m-fastcgi_param  SERVER_PORT        $server_port;[m
[31m-fastcgi_param  SERVER_NAME        $server_name;[m
[31m-[m
[31m-# PHP only, required if PHP was built with --enable-force-cgi-redirect[m
[31m-fastcgi_param  REDIRECT_STATUS    200;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/fastcgi_params b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/fastcgi_params[m
[1mdeleted file mode 100644[m
[1mindex 28decb9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/fastcgi_params[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-fastcgi_param  QUERY_STRING       $query_string;[m
[31m-fastcgi_param  REQUEST_METHOD     $request_method;[m
[31m-fastcgi_param  CONTENT_TYPE       $content_type;[m
[31m-fastcgi_param  CONTENT_LENGTH     $content_length;[m
[31m-[m
[31m-fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;[m
[31m-fastcgi_param  REQUEST_URI        $request_uri;[m
[31m-fastcgi_param  DOCUMENT_URI       $document_uri;[m
[31m-fastcgi_param  DOCUMENT_ROOT      $document_root;[m
[31m-fastcgi_param  SERVER_PROTOCOL    $server_protocol;[m
[31m-fastcgi_param  REQUEST_SCHEME     $scheme;[m
[31m-fastcgi_param  HTTPS              $https if_not_empty;[m
[31m-[m
[31m-fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;[m
[31m-fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;[m
[31m-[m
[31m-fastcgi_param  REMOTE_ADDR        $remote_addr;[m
[31m-fastcgi_param  REMOTE_PORT        $remote_port;[m
[31m-fastcgi_param  SERVER_ADDR        $server_addr;[m
[31m-fastcgi_param  SERVER_PORT        $server_port;[m
[31m-fastcgi_param  SERVER_NAME        $server_name;[m
[31m-[m
[31m-# PHP only, required if PHP was built with --enable-force-cgi-redirect[m
[31m-fastcgi_param  REDIRECT_STATUS    200;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/koi-utf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/koi-utf[m
[1mdeleted file mode 100644[m
[1mindex e7974ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/koi-utf[m
[1m+++ /dev/null[m
[36m@@ -1,109 +0,0 @@[m
[31m-[m
[31m-# This map is not a full koi8-r <> utf8 map: it does not contain[m
[31m-# box-drawing and some other characters.  Besides this map contains[m
[31m-# several koi8-u and Byelorussian letters which are not in koi8-r.[m
[31m-# If you need a full and standard map, use contrib/unicode2nginx/koi-utf[m
[31m-# map instead.[m
[31m-[m
[31m-charset_map  koi8-r  utf-8 {[m
[31m-[m
[31m-    80  E282AC ; # euro[m
[31m-[m
[31m-    95  E280A2 ; # bullet[m
[31m-[m
[31m-    9A  C2A0 ;   # &nbsp;[m
[31m-[m
[31m-    9E  C2B7 ;   # &middot;[m
[31m-[m
[31m-    A3  D191 ;   # small yo[m
[31m-    A4  D194 ;   # small Ukrainian ye[m
[31m-[m
[31m-    A6  D196 ;   # small Ukrainian i[m
[31m-    A7  D197 ;   # small Ukrainian yi[m
[31m-[m
[31m-    AD  D291 ;   # small Ukrainian soft g[m
[31m-    AE  D19E ;   # small Byelorussian short u[m
[31m-[m
[31m-    B0  C2B0 ;   # &deg;[m
[31m-[m
[31m-    B3  D081 ;   # capital YO[m
[31m-    B4  D084 ;   # capital Ukrainian YE[m
[31m-[m
[31m-    B6  D086 ;   # capital Ukrainian I[m
[31m-    B7  D087 ;   # capital Ukrainian YI[m
[31m-[m
[31m-    B9  E28496 ; # numero sign[m
[31m-[m
[31m-    BD  D290 ;   # capital Ukrainian soft G[m
[31m-    BE  D18E ;   # capital Byelorussian short U[m
[31m-[m
[31m-    BF  C2A9 ;   # (C)[m
[31m-[m
[31m-    C0  D18E ;   # small yu[m
[31m-    C1  D0B0 ;   # small a[m
[31m-    C2  D0B1 ;   # small b[m
[31m-    C3  D186 ;   # small ts[m
[31m-    C4  D0B4 ;   # small d[m
[31m-    C5  D0B5 ;   # small ye[m
[31m-    C6  D184 ;   # small f[m
[31m-    C7  D0B3 ;   # small g[m
[31m-    C8  D185 ;   # small kh[m
[31m-    C9  D0B8 ;   # small i[m
[31m-    CA  D0B9 ;   # small j[m
[31m-    CB  D0BA ;   # small k[m
[31m-    CC  D0BB ;   # small l[m
[31m-    CD  D0BC ;   # small m[m
[31m-    CE  D0BD ;   # small n[m
[31m-    CF  D0BE ;   # small o[m
[31m-[m
[31m-    D0  D0BF ;   # small p[m
[31m-    D1  D18F ;   # small ya[m
[31m-    D2  D180 ;   # small r[m
[31m-    D3  D181 ;   # small s[m
[31m-    D4  D182 ;   # small t[m
[31m-    D5  D183 ;   # small u[m
[31m-    D6  D0B6 ;   # small zh[m
[31m-    D7  D0B2 ;   # small v[m
[31m-    D8  D18C ;   # small soft sign[m
[31m-    D9  D18B ;   # small y[m
[31m-    DA  D0B7 ;   # small z[m
[31m-    DB  D188 ;   # small sh[m
[31m-    DC  D18D ;   # small e[m
[31m-    DD  D189 ;   # small shch[m
[31m-    DE  D187 ;   # small ch[m
[31m-    DF  D18A ;   # small hard sign[m
[31m-[m
[31m-    E0  D0AE ;   # capital YU[m
[31m-    E1  D090 ;   # capital A[m
[31m-    E2  D091 ;   # capital B[m
[31m-    E3  D0A6 ;   # capital TS[m
[31m-    E4  D094 ;   # capital D[m
[31m-    E5  D095 ;   # capital YE[m
[31m-    E6  D0A4 ;   # capital F[m
[31m-    E7  D093 ;   # capital G[m
[31m-    E8  D0A5 ;   # capital KH[m
[31m-    E9  D098 ;   # capital I[m
[31m-    EA  D099 ;   # capital J[m
[31m-    EB  D09A ;   # capital K[m
[31m-    EC  D09B ;   # capital L[m
[31m-    ED  D09C ;   # capital M[m
[31m-    EE  D09D ;   # capital N[m
[31m-    EF  D09E ;   # capital O[m
[31m-[m
[31m-    F0  D09F ;   # capital P[m
[31m-    F1  D0AF ;   # capital YA[m
[31m-    F2  D0A0 ;   # capital R[m
[31m-    F3  D0A1 ;   # capital S[m
[31m-    F4  D0A2 ;   # capital T[m
[31m-    F5  D0A3 ;   # capital U[m
[31m-    F6  D096 ;   # capital ZH[m
[31m-    F7  D092 ;   # capital V[m
[31m-    F8  D0AC ;   # capital soft sign[m
[31m-    F9  D0AB ;   # capital Y[m
[31m-    FA  D097 ;   # capital Z[m
[31m-    FB  D0A8 ;   # capital SH[m
[31m-    FC  D0AD ;   # capital E[m
[31m-    FD  D0A9 ;   # capital SHCH[m
[31m-    FE  D0A7 ;   # capital CH[m
[31m-    FF  D0AA ;   # capital hard sign[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/koi-win b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/koi-win[m
[1mdeleted file mode 100644[m
[1mindex 72afabe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/koi-win[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-[m
[31m-charset_map  koi8-r  windows-1251 {[m
[31m-[m
[31m-    80  88 ; # euro[m
[31m-[m
[31m-    95  95 ; # bullet[m
[31m-[m
[31m-    9A  A0 ; # &nbsp;[m
[31m-[m
[31m-    9E  B7 ; # &middot;[m
[31m-[m
[31m-    A3  B8 ; # small yo[m
[31m-    A4  BA ; # small Ukrainian ye[m
[31m-[m
[31m-    A6  B3 ; # small Ukrainian i[m
[31m-    A7  BF ; # small Ukrainian yi[m
[31m-[m
[31m-    AD  B4 ; # small Ukrainian soft g[m
[31m-    AE  A2 ; # small Byelorussian short u[m
[31m-[m
[31m-    B0  B0 ; # &deg;[m
[31m-[m
[31m-    B3  A8 ; # capital YO[m
[31m-    B4  AA ; # capital Ukrainian YE[m
[31m-[m
[31m-    B6  B2 ; # capital Ukrainian I[m
[31m-    B7  AF ; # capital Ukrainian YI[m
[31m-[m
[31m-    B9  B9 ; # numero sign[m
[31m-[m
[31m-    BD  A5 ; # capital Ukrainian soft G[m
[31m-    BE  A1 ; # capital Byelorussian short U[m
[31m-[m
[31m-    BF  A9 ; # (C)[m
[31m-[m
[31m-    C0  FE ; # small yu[m
[31m-    C1  E0 ; # small a[m
[31m-    C2  E1 ; # small b[m
[31m-    C3  F6 ; # small ts[m
[31m-    C4  E4 ; # small d[m
[31m-    C5  E5 ; # small ye[m
[31m-    C6  F4 ; # small f[m
[31m-    C7  E3 ; # small g[m
[31m-    C8  F5 ; # small kh[m
[31m-    C9  E8 ; # small i[m
[31m-    CA  E9 ; # small j[m
[31m-    CB  EA ; # small k[m
[31m-    CC  EB ; # small l[m
[31m-    CD  EC ; # small m[m
[31m-    CE  ED ; # small n[m
[31m-    CF  EE ; # small o[m
[31m-[m
[31m-    D0  EF ; # small p[m
[31m-    D1  FF ; # small ya[m
[31m-    D2  F0 ; # small r[m
[31m-    D3  F1 ; # small s[m
[31m-    D4  F2 ; # small t[m
[31m-    D5  F3 ; # small u[m
[31m-    D6  E6 ; # small zh[m
[31m-    D7  E2 ; # small v[m
[31m-    D8  FC ; # small soft sign[m
[31m-    D9  FB ; # small y[m
[31m-    DA  E7 ; # small z[m
[31m-    DB  F8 ; # small sh[m
[31m-    DC  FD ; # small e[m
[31m-    DD  F9 ; # small shch[m
[31m-    DE  F7 ; # small ch[m
[31m-    DF  FA ; # small hard sign[m
[31m-[m
[31m-    E0  DE ; # capital YU[m
[31m-    E1  C0 ; # capital A[m
[31m-    E2  C1 ; # capital B[m
[31m-    E3  D6 ; # capital TS[m
[31m-    E4  C4 ; # capital D[m
[31m-    E5  C5 ; # capital YE[m
[31m-    E6  D4 ; # capital F[m
[31m-    E7  C3 ; # capital G[m
[31m-    E8  D5 ; # capital KH[m
[31m-    E9  C8 ; # capital I[m
[31m-    EA  C9 ; # capital J[m
[31m-    EB  CA ; # capital K[m
[31m-    EC  CB ; # capital L[m
[31m-    ED  CC ; # capital M[m
[31m-    EE  CD ; # capital N[m
[31m-    EF  CE ; # capital O[m
[31m-[m
[31m-    F0  CF ; # capital P[m
[31m-    F1  DF ; # capital YA[m
[31m-    F2  D0 ; # capital R[m
[31m-    F3  D1 ; # capital S[m
[31m-    F4  D2 ; # capital T[m
[31m-    F5  D3 ; # capital U[m
[31m-    F6  C6 ; # capital ZH[m
[31m-    F7  C2 ; # capital V[m
[31m-    F8  DC ; # capital soft sign[m
[31m-    F9  DB ; # capital Y[m
[31m-    FA  C7 ; # capital Z[m
[31m-    FB  D8 ; # capital SH[m
[31m-    FC  DD ; # capital E[m
[31m-    FD  D9 ; # capital SHCH[m
[31m-    FE  D7 ; # capital CH[m
[31m-    FF  DA ; # capital hard sign[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/mime.types b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/mime.types[m
[1mdeleted file mode 100644[m
[1mindex 89be9a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/mime.types[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-[m
[31m-types {[m
[31m-    text/html                             html htm shtml;[m
[31m-    text/css                              css;[m
[31m-    text/xml                              xml;[m
[31m-    image/gif                             gif;[m
[31m-    image/jpeg                            jpeg jpg;[m
[31m-    application/javascript                js;[m
[31m-    application/atom+xml                  atom;[m
[31m-    application/rss+xml                   rss;[m
[31m-[m
[31m-    text/mathml                           mml;[m
[31m-    text/plain                            txt;[m
[31m-    text/vnd.sun.j2me.app-descriptor      jad;[m
[31m-    text/vnd.wap.wml                      wml;[m
[31m-    text/x-component                      htc;[m
[31m-[m
[31m-    image/png                             png;[m
[31m-    image/tiff                            tif tiff;[m
[31m-    image/vnd.wap.wbmp                    wbmp;[m
[31m-    image/x-icon                          ico;[m
[31m-    image/x-jng                           jng;[m
[31m-    image/x-ms-bmp                        bmp;[m
[31m-    image/svg+xml                         svg svgz;[m
[31m-    image/webp                            webp;[m
[31m-[m
[31m-    application/font-woff                 woff;[m
[31m-    application/java-archive              jar war ear;[m
[31m-    application/json                      json;[m
[31m-    application/mac-binhex40              hqx;[m
[31m-    application/msword                    doc;[m
[31m-    application/pdf                       pdf;[m
[31m-    application/postscript                ps eps ai;[m
[31m-    application/rtf                       rtf;[m
[31m-    application/vnd.apple.mpegurl         m3u8;[m
[31m-    application/vnd.ms-excel              xls;[m
[31m-    application/vnd.ms-fontobject         eot;[m
[31m-    application/vnd.ms-powerpoint         ppt;[m
[31m-    application/vnd.wap.wmlc              wmlc;[m
[31m-    application/vnd.google-earth.kml+xml  kml;[m
[31m-    application/vnd.google-earth.kmz      kmz;[m
[31m-    application/x-7z-compressed           7z;[m
[31m-    application/x-cocoa                   cco;[m
[31m-    application/x-java-archive-diff       jardiff;[m
[31m-    application/x-java-jnlp-file          jnlp;[m
[31m-    application/x-makeself                run;[m
[31m-    application/x-perl                    pl pm;[m
[31m-    application/x-pilot                   prc pdb;[m
[31m-    application/x-rar-compressed          rar;[m
[31m-    application/x-redhat-package-manager  rpm;[m
[31m-    application/x-sea                     sea;[m
[31m-    application/x-shockwave-flash         swf;[m
[31m-    application/x-stuffit                 sit;[m
[31m-    application/x-tcl                     tcl tk;[m
[31m-    application/x-x509-ca-cert            der pem crt;[m
[31m-    application/x-xpinstall               xpi;[m
[31m-    application/xhtml+xml                 xhtml;[m
[31m-    application/xspf+xml                  xspf;[m
[31m-    application/zip                       zip;[m
[31m-[m
[31m-    application/octet-stream              bin exe dll;[m
[31m-    application/octet-stream              deb;[m
[31m-    application/octet-stream              dmg;[m
[31m-    application/octet-stream              iso img;[m
[31m-    application/octet-stream              msi msp msm;[m
[31m-[m
[31m-    application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;[m
[31m-    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;[m
[31m-    application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;[m
[31m-[m
[31m-    audio/midi                            mid midi kar;[m
[31m-    audio/mpeg                            mp3;[m
[31m-    audio/ogg                             ogg;[m
[31m-    audio/x-m4a                           m4a;[m
[31m-    audio/x-realaudio                     ra;[m
[31m-[m
[31m-    video/3gpp                            3gpp 3gp;[m
[31m-    video/mp2t                            ts;[m
[31m-    video/mp4                             mp4;[m
[31m-    video/mpeg                            mpeg mpg;[m
[31m-    video/quicktime                       mov;[m
[31m-    video/webm                            webm;[m
[31m-    video/x-flv                           flv;[m
[31m-    video/x-m4v                           m4v;[m
[31m-    video/x-mng                           mng;[m
[31m-    video/x-ms-asf                        asx asf;[m
[31m-    video/x-ms-wmv                        wmv;[m
[31m-    video/x-msvideo                       avi;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/nginx.conf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/nginx.conf[m
[1mdeleted file mode 100644[m
[1mindex 29bc085..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/nginx.conf[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-[m
[31m-#user  nobody;[m
[31m-worker_processes  1;[m
[31m-[m
[31m-#error_log  logs/error.log;[m
[31m-#error_log  logs/error.log  notice;[m
[31m-#error_log  logs/error.log  info;[m
[31m-[m
[31m-#pid        logs/nginx.pid;[m
[31m-[m
[31m-[m
[31m-events {[m
[31m-    worker_connections  1024;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-http {[m
[31m-    include       mime.types;[m
[31m-    default_type  application/octet-stream;[m
[31m-[m
[31m-    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '[m
[31m-    #                  '$status $body_bytes_sent "$http_referer" '[m
[31m-    #                  '"$http_user_agent" "$http_x_forwarded_for"';[m
[31m-[m
[31m-    #access_log  logs/access.log  main;[m
[31m-[m
[31m-    sendfile        on;[m
[31m-    #tcp_nopush     on;[m
[31m-[m
[31m-    #keepalive_timeout  0;[m
[31m-    keepalive_timeout  65;[m
[31m-[m
[31m-    #gzip  on;[m
[31m-[m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  localhost;[m
[31m-[m
[31m-        #charset koi8-r;[m
[31m-[m
[31m-        #access_log  logs/host.access.log  main;[m
[31m-[m
[31m-        location / {[m
[31m-            root   html;[m
[31m-            index  index.html index.htm;[m
[31m-        }[m
[31m-[m
[31m-        #error_page  404              /404.html;[m
[31m-[m
[31m-        # redirect server error pages to the static page /50x.html[m
[31m-        #[m
[31m-        error_page   500 502 503 504  /50x.html;[m
[31m-        location = /50x.html {[m
[31m-            root   html;[m
[31m-        }[m
[31m-[m
[31m-        # proxy the PHP scripts to Apache listening on 127.0.0.1:80[m
[31m-        #[m
[31m-        #location ~ \.php$ {[m
[31m-        #    proxy_pass   http://127.0.0.1;[m
[31m-        #}[m
[31m-[m
[31m-        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000[m
[31m-        #[m
[31m-        #location ~ \.php$ {[m
[31m-        #    root           html;[m
[31m-        #    fastcgi_pass   127.0.0.1:9000;[m
[31m-        #    fastcgi_index  index.php;[m
[31m-        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;[m
[31m-        #    include        fastcgi_params;[m
[31m-        #}[m
[31m-[m
[31m-        # deny access to .htaccess files, if Apache's document root[m
[31m-        # concurs with nginx's one[m
[31m-        #[m
[31m-        #location ~ /\.ht {[m
[31m-        #    deny  all;[m
[31m-        #}[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    # another virtual host using mix of IP-, name-, and port-based configuration[m
[31m-    #[m
[31m-    #server {[m
[31m-    #    listen       8000;[m
[31m-    #    listen       somename:8080;[m
[31m-    #    server_name  somename  alias  another.alias;[m
[31m-[m
[31m-    #    location / {[m
[31m-    #        root   html;[m
[31m-    #        index  index.html index.htm;[m
[31m-    #    }[m
[31m-    #}[m
[31m-[m
[31m-[m
[31m-    # HTTPS server[m
[31m-    #[m
[31m-    #server {[m
[31m-    #    listen       443 ssl;[m
[31m-    #    server_name  localhost;[m
[31m-[m
[31m-    #    ssl_certificate      cert.pem;[m
[31m-    #    ssl_certificate_key  cert.key;[m
[31m-[m
[31m-    #    ssl_session_cache    shared:SSL:1m;[m
[31m-    #    ssl_session_timeout  5m;[m
[31m-[m
[31m-    #    ssl_ciphers  HIGH:!aNULL:!MD5;[m
[31m-    #    ssl_prefer_server_ciphers  on;[m
[31m-[m
[31m-    #    location / {[m
[31m-    #        root   html;[m
[31m-    #        index  index.html index.htm;[m
[31m-    #    }[m
[31m-    #}[m
[31m-[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/scgi_params b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/scgi_params[m
[1mdeleted file mode 100644[m
[1mindex 6d4ce4f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/scgi_params[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-scgi_param  REQUEST_METHOD     $request_method;[m
[31m-scgi_param  REQUEST_URI        $request_uri;[m
[31m-scgi_param  QUERY_STRING       $query_string;[m
[31m-scgi_param  CONTENT_TYPE       $content_type;[m
[31m-[m
[31m-scgi_param  DOCUMENT_URI       $document_uri;[m
[31m-scgi_param  DOCUMENT_ROOT      $document_root;[m
[31m-scgi_param  SCGI               1;[m
[31m-scgi_param  SERVER_PROTOCOL    $server_protocol;[m
[31m-scgi_param  REQUEST_SCHEME     $scheme;[m
[31m-scgi_param  HTTPS              $https if_not_empty;[m
[31m-[m
[31m-scgi_param  REMOTE_ADDR        $remote_addr;[m
[31m-scgi_param  REMOTE_PORT        $remote_port;[m
[31m-scgi_param  SERVER_PORT        $server_port;[m
[31m-scgi_param  SERVER_NAME        $server_name;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/uwsgi_params b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/uwsgi_params[m
[1mdeleted file mode 100644[m
[1mindex 09c732c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/uwsgi_params[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-uwsgi_param  QUERY_STRING       $query_string;[m
[31m-uwsgi_param  REQUEST_METHOD     $request_method;[m
[31m-uwsgi_param  CONTENT_TYPE       $content_type;[m
[31m-uwsgi_param  CONTENT_LENGTH     $content_length;[m
[31m-[m
[31m-uwsgi_param  REQUEST_URI        $request_uri;[m
[31m-uwsgi_param  PATH_INFO          $document_uri;[m
[31m-uwsgi_param  DOCUMENT_ROOT      $document_root;[m
[31m-uwsgi_param  SERVER_PROTOCOL    $server_protocol;[m
[31m-uwsgi_param  REQUEST_SCHEME     $scheme;[m
[31m-uwsgi_param  HTTPS              $https if_not_empty;[m
[31m-[m
[31m-uwsgi_param  REMOTE_ADDR        $remote_addr;[m
[31m-uwsgi_param  REMOTE_PORT        $remote_port;[m
[31m-uwsgi_param  SERVER_PORT        $server_port;[m
[31m-uwsgi_param  SERVER_NAME        $server_name;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/win-utf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/win-utf[m
[1mdeleted file mode 100644[m
[1mindex ed8bc00..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/conf/win-utf[m
[1m+++ /dev/null[m
[36m@@ -1,126 +0,0 @@[m
[31m-[m
[31m-# This map is not a full windows-1251 <> utf8 map: it does not[m
[31m-# contain Serbian and Macedonian letters.  If you need a full map,[m
[31m-# use contrib/unicode2nginx/win-utf map instead.[m
[31m-[m
[31m-charset_map  windows-1251  utf-8 {[m
[31m-[m
[31m-    82  E2809A ; # single low-9 quotation mark[m
[31m-[m
[31m-    84  E2809E ; # double low-9 quotation mark[m
[31m-    85  E280A6 ; # ellipsis[m
[31m-    86  E280A0 ; # dagger[m
[31m-    87  E280A1 ; # double dagger[m
[31m-    88  E282AC ; # euro[m
[31m-    89  E280B0 ; # per mille[m
[31m-[m
[31m-    91  E28098 ; # left single quotation mark[m
[31m-    92  E28099 ; # right single quotation mark[m
[31m-    93  E2809C ; # left double quotation mark[m
[31m-    94  E2809D ; # right double quotation mark[m
[31m-    95  E280A2 ; # bullet[m
[31m-    96  E28093 ; # en dash[m
[31m-    97  E28094 ; # em dash[m
[31m-[m
[31m-    99  E284A2 ; # trade mark sign[m
[31m-[m
[31m-    A0  C2A0 ;   # &nbsp;[m
[31m-    A1  D18E ;   # capital Byelorussian short U[m
[31m-    A2  D19E ;   # small Byelorussian short u[m
[31m-[m
[31m-    A4  C2A4 ;   # currency sign[m
[31m-    A5  D290 ;   # capital Ukrainian soft G[m
[31m-    A6  C2A6 ;   # borken bar[m
[31m-    A7  C2A7 ;   # section sign[m
[31m-    A8  D081 ;   # capital YO[m
[31m-    A9  C2A9 ;   # (C)[m
[31m-    AA  D084 ;   # capital Ukrainian YE[m
[31m-    AB  C2AB ;   # left-pointing double angle quotation mark[m
[31m-    AC  C2AC ;   # not sign[m
[31m-    AD  C2AD ;   # soft hypen[m
[31m-    AE  C2AE ;   # (R)[m
[31m-    AF  D087 ;   # capital Ukrainian YI[m
[31m-[m
[31m-    B0  C2B0 ;   # &deg;[m
[31m-    B1  C2B1 ;   # plus-minus sign[m
[31m-    B2  D086 ;   # capital Ukrainian I[m
[31m-    B3  D196 ;   # small Ukrainian i[m
[31m-    B4  D291 ;   # small Ukrainian soft g[m
[31m-    B5  C2B5 ;   # micro sign[m
[31m-    B6  C2B6 ;   # pilcrow sign[m
[31m-    B7  C2B7 ;   # &middot;[m
[31m-    B8  D191 ;   # small yo[m
[31m-    B9  E28496 ; # numero sign[m
[31m-    BA  D194 ;   # small Ukrainian ye[m
[31m-    BB  C2BB ;   # right-pointing double angle quotation mark[m
[31m-[m
[31m-    BF  D197 ;   # small Ukrainian yi[m
[31m-[m
[31m-    C0  D090 ;   # capital A[m
[31m-    C1  D091 ;   # capital B[m
[31m-    C2  D092 ;   # capital V[m
[31m-    C3  D093 ;   # capital G[m
[31m-    C4  D094 ;   # capital D[m
[31m-    C5  D095 ;   # capital YE[m
[31m-    C6  D096 ;   # capital ZH[m
[31m-    C7  D097 ;   # capital Z[m
[31m-    C8  D098 ;   # capital I[m
[31m-    C9  D099 ;   # capital J[m
[31m-    CA  D09A ;   # capital K[m
[31m-    CB  D09B ;   # capital L[m
[31m-    CC  D09C ;   # capital M[m
[31m-    CD  D09D ;   # capital N[m
[31m-    CE  D09E ;   # capital O[m
[31m-    CF  D09F ;   # capital P[m
[31m-[m
[31m-    D0  D0A0 ;   # capital R[m
[31m-    D1  D0A1 ;   # capital S[m
[31m-    D2  D0A2 ;   # capital T[m
[31m-    D3  D0A3 ;   # capital U[m
[31m-    D4  D0A4 ;   # capital F[m
[31m-    D5  D0A5 ;   # capital KH[m
[31m-    D6  D0A6 ;   # capital TS[m
[31m-    D7  D0A7 ;   # capital CH[m
[31m-    D8  D0A8 ;   # capital SH[m
[31m-    D9  D0A9 ;   # capital SHCH[m
[31m-    DA  D0AA ;   # capital hard sign[m
[31m-    DB  D0AB ;   # capital Y[m
[31m-    DC  D0AC ;   # capital soft sign[m
[31m-    DD  D0AD ;   # capital E[m
[31m-    DE  D0AE ;   # capital YU[m
[31m-    DF  D0AF ;   # capital YA[m
[31m-[m
[31m-    E0  D0B0 ;   # small a[m
[31m-    E1  D0B1 ;   # small b[m
[31m-    E2  D0B2 ;   # small v[m
[31m-    E3  D0B3 ;   # small g[m
[31m-    E4  D0B4 ;   # small d[m
[31m-    E5  D0B5 ;   # small ye[m
[31m-    E6  D0B6 ;   # small zh[m
[31m-    E7  D0B7 ;   # small z[m
[31m-    E8  D0B8 ;   # small i[m
[31m-    E9  D0B9 ;   # small j[m
[31m-    EA  D0BA ;   # small k[m
[31m-    EB  D0BB ;   # small l[m
[31m-    EC  D0BC ;   # small m[m
[31m-    ED  D0BD ;   # small n[m
[31m-    EE  D0BE ;   # small o[m
[31m-    EF  D0BF ;   # small p[m
[31m-[m
[31m-    F0  D180 ;   # small r[m
[31m-    F1  D181 ;   # small s[m
[31m-    F2  D182 ;   # small t[m
[31m-    F3  D183 ;   # small u[m
[31m-    F4  D184 ;   # small f[m
[31m-    F5  D185 ;   # small kh[m
[31m-    F6  D186 ;   # small ts[m
[31m-    F7  D187 ;   # small ch[m
[31m-    F8  D188 ;   # small sh[m
[31m-    F9  D189 ;   # small shch[m
[31m-    FA  D18A ;   # small hard sign[m
[31m-    FB  D18B ;   # small y[m
[31m-    FC  D18C ;   # small soft sign[m
[31m-    FD  D18D ;   # small e[m
[31m-    FE  D18E ;   # small yu[m
[31m-    FF  D18F ;   # small ya[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/configure b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/configure[m
[1mdeleted file mode 100755[m
[1mindex 49223f8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/configure[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-#!/bin/sh[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-LC_ALL=C[m
[31m-export LC_ALL[m
[31m-[m
[31m-. auto/options[m
[31m-. auto/init[m
[31m-. auto/sources[m
[31m-[m
[31m-test -d $NGX_OBJS || mkdir -p $NGX_OBJS[m
[31m-[m
[31m-echo > $NGX_AUTO_HEADERS_H[m
[31m-echo > $NGX_AUTOCONF_ERR[m
[31m-[m
[31m-echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H[m
[31m-[m
[31m-[m
[31m-if [ $NGX_DEBUG = YES ]; then[m
[31m-    have=NGX_DEBUG . auto/have[m
[31m-fi[m
[31m-[m
[31m-if [ $NGX_DTRACE = YES ]; then[m
[31m-    have=NGX_DTRACE . auto/have[m
[31m-fi[m
[31m-[m
[31m-if test -z "$NGX_PLATFORM"; then[m
[31m-    echo "checking for OS"[m
[31m-[m
[31m-    NGX_SYSTEM=`uname -s 2>/dev/null`[m
[31m-    NGX_RELEASE=`uname -r 2>/dev/null`[m
[31m-    NGX_MACHINE=`uname -m 2>/dev/null`[m
[31m-[m
[31m-    echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"[m
[31m-[m
[31m-    NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";[m
[31m-[m
[31m-    case "$NGX_SYSTEM" in[m
[31m-        MINGW32_*)[m
[31m-            NGX_PLATFORM=win32[m
[31m-        ;;[m
[31m-    esac[m
[31m-[m
[31m-else[m
[31m-    echo "building for $NGX_PLATFORM"[m
[31m-    NGX_SYSTEM=$NGX_PLATFORM[m
[31m-fi[m
[31m-[m
[31m-. auto/cc/conf[m
[31m-[m
[31m-if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-    . auto/headers[m
[31m-fi[m
[31m-[m
[31m-. auto/os/conf[m
[31m-[m
[31m-if [ "$NGX_PLATFORM" != win32 ]; then[m
[31m-    . auto/unix[m
[31m-fi[m
[31m-[m
[31m-. auto/threads[m
[31m-. auto/modules[m
[31m-. auto/lib/conf[m
[31m-[m
[31m-case ".$NGX_PREFIX" in[m
[31m-    .)[m
[31m-        NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx}[m
[31m-        have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define[m
[31m-    ;;[m
[31m-[m
[31m-    .!)[m
[31m-        NGX_PREFIX=[m
[31m-    ;;[m
[31m-[m
[31m-    *)[m
[31m-        have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define[m
[31m-    ;;[m
[31m-esac[m
[31m-[m
[31m-if [ ".$NGX_CONF_PREFIX" != "." ]; then[m
[31m-    have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define[m
[31m-fi[m
[31m-[m
[31m-have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define[m
[31m-have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define[m
[31m-have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define[m
[31m-have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define[m
[31m-have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define[m
[31m-[m
[31m-have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define[m
[31m-have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-have=NGX_HTTP_PROXY_TEMP_PATH value="\"$NGX_HTTP_PROXY_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-have=NGX_HTTP_FASTCGI_TEMP_PATH value="\"$NGX_HTTP_FASTCGI_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-have=NGX_HTTP_UWSGI_TEMP_PATH value="\"$NGX_HTTP_UWSGI_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\""[m
[31m-. auto/define[m
[31m-[m
[31m-. auto/make[m
[31m-. auto/lib/make[m
[31m-. auto/install[m
[31m-[m
[31m-# STUB[m
[31m-. auto/stubs[m
[31m-[m
[31m-have=NGX_USER value="\"$NGX_USER\"" . auto/define[m
[31m-have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define[m
[31m-[m
[31m-if [ ".$NGX_BUILD" != "." ]; then[m
[31m-    have=NGX_BUILD value="\"$NGX_BUILD\"" . auto/define[m
[31m-fi[m
[31m-[m
[31m-. auto/summary[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/README[m
[1mdeleted file mode 100644[m
[1mindex fec4b20..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/README[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-geo2nginx.pl 		by Andrei Nigmatulin[m
[31m-[m
[31m-	The perl script to convert CSV geoip database ( free download[m
[31m-	at http://www.maxmind.com/app/geoip_country ) to format, suitable[m
[31m-	for use by the ngx_http_geo_module.[m
[31m-[m
[31m-[m
[31m-unicode2nginx		by Maxim Dounin[m
[31m-[m
[31m-	The perl script to convert unicode mappings ( available[m
[31m-	at http://www.unicode.org/Public/MAPPINGS/ ) to the nginx[m
[31m-	configuration file format.[m
[31m-	Two generated full maps for windows-1251 and koi8-r.[m
[31m-[m
[31m-[m
[31m-vim			by Evan Miller[m
[31m-[m
[31m-	Syntax highlighting of nginx configuration for vim, to be[m
[31m-	placed into ~/.vim/.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/geo2nginx.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/geo2nginx.pl[m
[1mdeleted file mode 100644[m
[1mindex 29243ec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/geo2nginx.pl[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-#!/usr/bin/perl -w[m
[31m-[m
[31m-# (c) Andrei Nigmatulin, 2005[m
[31m-#[m
[31m-# this script provided "as is", without any warranties. use it at your own risk.[m
[31m-#[m
[31m-# special thanx to Andrew Sitnikov for perl port[m
[31m-#[m
[31m-# this script converts CSV geoip database (free download at http://www.maxmind.com/app/geoip_country)[m
[31m-# to format, suitable for use with nginx_http_geo module (http://sysoev.ru/nginx)[m
[31m-#[m
[31m-# for example, line with ip range[m
[31m-#[m
[31m-#   "62.16.68.0","62.16.127.255","1041253376","1041268735","RU","Russian Federation"[m
[31m-#[m
[31m-# will be converted to four subnetworks:[m
[31m-#[m
[31m-#   62.16.68.0/22 RU;[m
[31m-#   62.16.72.0/21 RU;[m
[31m-#   62.16.80.0/20 RU;[m
[31m-#   62.16.96.0/19 RU;[m
[31m-[m
[31m-[m
[31m-use warnings;[m
[31m-use strict;[m
[31m-[m
[31m-while( <STDIN> ){[m
[31m-	if (/"[^"]+","[^"]+","([^"]+)","([^"]+)","([^"]+)"/){[m
[31m-		print_subnets($1, $2, $3);[m
[31m-	}[m
[31m-}[m
[31m-[m
[31m-sub  print_subnets {[m
[31m-	my ($a1, $a2, $c) = @_;[m
[31m-	my $l;[m
[31m-    while ($a1 <= $a2) {[m
[31m-		for ($l = 0; ($a1 & (1 << $l)) == 0 && ($a1 + ((1 << ($l + 1)) - 1)) <= $a2; $l++){};[m
[31m-		print long2ip($a1) . "/" . (32 - $l) . " " . $c . ";\n";[m
[31m-    	$a1 += (1 << $l);[m
[31m-	}[m
[31m-}[m
[31m-[m
[31m-sub long2ip {[m
[31m-	my $ip = shift;[m
[31m-[m
[31m-	my $str = 0;[m
[31m-[m
[31m-	$str = ($ip & 255);[m
[31m-[m
[31m-	$ip >>= 8;[m
[31m-	$str = ($ip & 255).".$str";[m
[31m-[m
[31m-	$ip >>= 8;[m
[31m-	$str = ($ip & 255).".$str";[m
[31m-[m
[31m-	$ip >>= 8;[m
[31m-	$str = ($ip & 255).".$str";[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/koi-utf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/koi-utf[m
[1mdeleted file mode 100644[m
[1mindex 48853af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/koi-utf[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-charset_map  koi8-r  utf-8 {[m
[31m-[m
[31m-    80  E29480 ; #	BOX DRAWINGS LIGHT HORIZONTAL[m
[31m-    81  E29482 ; #	BOX DRAWINGS LIGHT VERTICAL[m
[31m-    82  E2948C ; #	BOX DRAWINGS LIGHT DOWN AND RIGHT[m
[31m-    83  E29490 ; #	BOX DRAWINGS LIGHT DOWN AND LEFT[m
[31m-    84  E29494 ; #	BOX DRAWINGS LIGHT UP AND RIGHT[m
[31m-    85  E29498 ; #	BOX DRAWINGS LIGHT UP AND LEFT[m
[31m-    86  E2949C ; #	BOX DRAWINGS LIGHT VERTICAL AND RIGHT[m
[31m-    87  E294A4 ; #	BOX DRAWINGS LIGHT VERTICAL AND LEFT[m
[31m-    88  E294AC ; #	BOX DRAWINGS LIGHT DOWN AND HORIZONTAL[m
[31m-    89  E294B4 ; #	BOX DRAWINGS LIGHT UP AND HORIZONTAL[m
[31m-    8A  E294BC ; #	BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL[m
[31m-    8B  E29680 ; #	UPPER HALF BLOCK[m
[31m-    8C  E29684 ; #	LOWER HALF BLOCK[m
[31m-    8D  E29688 ; #	FULL BLOCK[m
[31m-    8E  E2968C ; #	LEFT HALF BLOCK[m
[31m-    8F  E29690 ; #	RIGHT HALF BLOCK[m
[31m-    90  E29691 ; #	LIGHT SHADE[m
[31m-    91  E29692 ; #	MEDIUM SHADE[m
[31m-    92  E29693 ; #	DARK SHADE[m
[31m-    93  E28CA0 ; #	TOP HALF INTEGRAL[m
[31m-    94  E296A0 ; #	BLACK SQUARE[m
[31m-    95  E28899 ; #	BULLET OPERATOR[m
[31m-    96  E2889A ; #	SQUARE ROOT[m
[31m-    97  E28988 ; #	ALMOST EQUAL TO[m
[31m-    98  E289A4 ; #	LESS-THAN OR EQUAL TO[m
[31m-    99  E289A5 ; #	GREATER-THAN OR EQUAL TO[m
[31m-    9A  C2A0 ; #	NO-BREAK SPACE[m
[31m-    9B  E28CA1 ; #	BOTTOM HALF INTEGRAL[m
[31m-    9C  C2B0 ; #	DEGREE SIGN[m
[31m-    9D  C2B2 ; #	SUPERSCRIPT TWO[m
[31m-    9E  C2B7 ; #	MIDDLE DOT[m
[31m-    9F  C3B7 ; #	DIVISION SIGN[m
[31m-    A0  E29590 ; #	BOX DRAWINGS DOUBLE HORIZONTAL[m
[31m-    A1  E29591 ; #	BOX DRAWINGS DOUBLE VERTICAL[m
[31m-    A2  E29592 ; #	BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE[m
[31m-    A3  D191 ; #	CYRILLIC SMALL LETTER IO[m
[31m-    A4  E29593 ; #	BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE[m
[31m-    A5  E29594 ; #	BOX DRAWINGS DOUBLE DOWN AND RIGHT[m
[31m-    A6  E29595 ; #	BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE[m
[31m-    A7  E29596 ; #	BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE[m
[31m-    A8  E29597 ; #	BOX DRAWINGS DOUBLE DOWN AND LEFT[m
[31m-    A9  E29598 ; #	BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE[m
[31m-    AA  E29599 ; #	BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE[m
[31m-    AB  E2959A ; #	BOX DRAWINGS DOUBLE UP AND RIGHT[m
[31m-    AC  E2959B ; #	BOX DRAWINGS UP SINGLE AND LEFT DOUBLE[m
[31m-    AD  E2959C ; #	BOX DRAWINGS UP DOUBLE AND LEFT SINGLE[m
[31m-    AE  E2959D ; #	BOX DRAWINGS DOUBLE UP AND LEFT[m
[31m-    AF  E2959E ; #	BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE[m
[31m-    B0  E2959F ; #	BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE[m
[31m-    B1  E295A0 ; #	BOX DRAWINGS DOUBLE VERTICAL AND RIGHT[m
[31m-    B2  E295A1 ; #	BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE[m
[31m-    B3  D081 ; #	CYRILLIC CAPITAL LETTER IO[m
[31m-    B4  E295A2 ; #	BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE[m
[31m-    B5  E295A3 ; #	BOX DRAWINGS DOUBLE VERTICAL AND LEFT[m
[31m-    B6  E295A4 ; #	BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE[m
[31m-    B7  E295A5 ; #	BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE[m
[31m-    B8  E295A6 ; #	BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL[m
[31m-    B9  E295A7 ; #	BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE[m
[31m-    BA  E295A8 ; #	BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE[m
[31m-    BB  E295A9 ; #	BOX DRAWINGS DOUBLE UP AND HORIZONTAL[m
[31m-    BC  E295AA ; #	BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE[m
[31m-    BD  E295AB ; #	BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE[m
[31m-    BE  E295AC ; #	BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL[m
[31m-    BF  C2A9 ; #	COPYRIGHT SIGN[m
[31m-    C0  D18E ; #	CYRILLIC SMALL LETTER YU[m
[31m-    C1  D0B0 ; #	CYRILLIC SMALL LETTER A[m
[31m-    C2  D0B1 ; #	CYRILLIC SMALL LETTER BE[m
[31m-    C3  D186 ; #	CYRILLIC SMALL LETTER TSE[m
[31m-    C4  D0B4 ; #	CYRILLIC SMALL LETTER DE[m
[31m-    C5  D0B5 ; #	CYRILLIC SMALL LETTER IE[m
[31m-    C6  D184 ; #	CYRILLIC SMALL LETTER EF[m
[31m-    C7  D0B3 ; #	CYRILLIC SMALL LETTER GHE[m
[31m-    C8  D185 ; #	CYRILLIC SMALL LETTER HA[m
[31m-    C9  D0B8 ; #	CYRILLIC SMALL LETTER I[m
[31m-    CA  D0B9 ; #	CYRILLIC SMALL LETTER SHORT I[m
[31m-    CB  D0BA ; #	CYRILLIC SMALL LETTER KA[m
[31m-    CC  D0BB ; #	CYRILLIC SMALL LETTER EL[m
[31m-    CD  D0BC ; #	CYRILLIC SMALL LETTER EM[m
[31m-    CE  D0BD ; #	CYRILLIC SMALL LETTER EN[m
[31m-    CF  D0BE ; #	CYRILLIC SMALL LETTER O[m
[31m-    D0  D0BF ; #	CYRILLIC SMALL LETTER PE[m
[31m-    D1  D18F ; #	CYRILLIC SMALL LETTER YA[m
[31m-    D2  D180 ; #	CYRILLIC SMALL LETTER ER[m
[31m-    D3  D181 ; #	CYRILLIC SMALL LETTER ES[m
[31m-    D4  D182 ; #	CYRILLIC SMALL LETTER TE[m
[31m-    D5  D183 ; #	CYRILLIC SMALL LETTER U[m
[31m-    D6  D0B6 ; #	CYRILLIC SMALL LETTER ZHE[m
[31m-    D7  D0B2 ; #	CYRILLIC SMALL LETTER VE[m
[31m-    D8  D18C ; #	CYRILLIC SMALL LETTER SOFT SIGN[m
[31m-    D9  D18B ; #	CYRILLIC SMALL LETTER YERU[m
[31m-    DA  D0B7 ; #	CYRILLIC SMALL LETTER ZE[m
[31m-    DB  D188 ; #	CYRILLIC SMALL LETTER SHA[m
[31m-    DC  D18D ; #	CYRILLIC SMALL LETTER E[m
[31m-    DD  D189 ; #	CYRILLIC SMALL LETTER SHCHA[m
[31m-    DE  D187 ; #	CYRILLIC SMALL LETTER CHE[m
[31m-    DF  D18A ; #	CYRILLIC SMALL LETTER HARD SIGN[m
[31m-    E0  D0AE ; #	CYRILLIC CAPITAL LETTER YU[m
[31m-    E1  D090 ; #	CYRILLIC CAPITAL LETTER A[m
[31m-    E2  D091 ; #	CYRILLIC CAPITAL LETTER BE[m
[31m-    E3  D0A6 ; #	CYRILLIC CAPITAL LETTER TSE[m
[31m-    E4  D094 ; #	CYRILLIC CAPITAL LETTER DE[m
[31m-    E5  D095 ; #	CYRILLIC CAPITAL LETTER IE[m
[31m-    E6  D0A4 ; #	CYRILLIC CAPITAL LETTER EF[m
[31m-    E7  D093 ; #	CYRILLIC CAPITAL LETTER GHE[m
[31m-    E8  D0A5 ; #	CYRILLIC CAPITAL LETTER HA[m
[31m-    E9  D098 ; #	CYRILLIC CAPITAL LETTER I[m
[31m-    EA  D099 ; #	CYRILLIC CAPITAL LETTER SHORT I[m
[31m-    EB  D09A ; #	CYRILLIC CAPITAL LETTER KA[m
[31m-    EC  D09B ; #	CYRILLIC CAPITAL LETTER EL[m
[31m-    ED  D09C ; #	CYRILLIC CAPITAL LETTER EM[m
[31m-    EE  D09D ; #	CYRILLIC CAPITAL LETTER EN[m
[31m-    EF  D09E ; #	CYRILLIC CAPITAL LETTER O[m
[31m-    F0  D09F ; #	CYRILLIC CAPITAL LETTER PE[m
[31m-    F1  D0AF ; #	CYRILLIC CAPITAL LETTER YA[m
[31m-    F2  D0A0 ; #	CYRILLIC CAPITAL LETTER ER[m
[31m-    F3  D0A1 ; #	CYRILLIC CAPITAL LETTER ES[m
[31m-    F4  D0A2 ; #	CYRILLIC CAPITAL LETTER TE[m
[31m-    F5  D0A3 ; #	CYRILLIC CAPITAL LETTER U[m
[31m-    F6  D096 ; #	CYRILLIC CAPITAL LETTER ZHE[m
[31m-    F7  D092 ; #	CYRILLIC CAPITAL LETTER VE[m
[31m-    F8  D0AC ; #	CYRILLIC CAPITAL LETTER SOFT SIGN[m
[31m-    F9  D0AB ; #	CYRILLIC CAPITAL LETTER YERU[m
[31m-    FA  D097 ; #	CYRILLIC CAPITAL LETTER ZE[m
[31m-    FB  D0A8 ; #	CYRILLIC CAPITAL LETTER SHA[m
[31m-    FC  D0AD ; #	CYRILLIC CAPITAL LETTER E[m
[31m-    FD  D0A9 ; #	CYRILLIC CAPITAL LETTER SHCHA[m
[31m-    FE  D0A7 ; #	CYRILLIC CAPITAL LETTER CHE[m
[31m-    FF  D0AA ; #	CYRILLIC CAPITAL LETTER HARD SIGN[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/unicode-to-nginx.pl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/unicode-to-nginx.pl[m
[1mdeleted file mode 100755[m
[1mindex daaf354..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/unicode-to-nginx.pl[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-#!/usr/bin/perl -w[m
[31m-[m
[31m-# Convert unicode mappings to nginx configuration file format.[m
[31m-[m
[31m-# You may find useful mappings in various places, including[m
[31m-# unicode.org official site:[m
[31m-#[m
[31m-# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT[m
[31m-# http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT[m
[31m-[m
[31m-# Needs perl 5.6 or later.[m
[31m-[m
[31m-# Written by Maxim Dounin, mdounin@rambler-co.ru[m
[31m-[m
[31m-###############################################################################[m
[31m-[m
[31m-require 5.006;[m
[31m-[m
[31m-while (<>) {[m
[31m-	# Skip comments and empty lines[m
[31m-[m
[31m-	next if /^#/;[m
[31m-	next if /^\s*$/;[m
[31m-	chomp;[m
[31m-[m
[31m-	# Convert mappings[m
[31m-[m
[31m-	if (/^\s*0x(..)\s*0x(....)\s*(#.*)/) {[m
[31m-		# Mapping <from-code> <unicode-code> "#" <unicode-name>[m
[31m-		my $cs_code = $1;[m
[31m-		my $un_code = $2;[m
[31m-		my $un_name = $3;[m
[31m-[m
[31m-		# Produce UTF-8 sequence from character code;[m
[31m-[m
[31m-		my $un_utf8 = join('', map { sprintf("%02X", $_) } unpack("C*", pack("U", hex($un_code))));[m
[31m-[m
[31m-		print "    $cs_code  $un_utf8 ; $un_name\n";[m
[31m-[m
[31m-	} else {[m
[31m-		warn "Unrecognized line: '$_'";[m
[31m-	}[m
[31m-}[m
[31m-[m
[31m-###############################################################################[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/win-utf b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/win-utf[m
[1mdeleted file mode 100644[m
[1mindex af9f9aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/unicode2nginx/win-utf[m
[1m+++ /dev/null[m
[36m@@ -1,130 +0,0 @@[m
[31m-charset_map  windows-1251  utf-8 {[m
[31m-[m
[31m-    80  D082 ; #CYRILLIC CAPITAL LETTER DJE[m
[31m-    81  D083 ; #CYRILLIC CAPITAL LETTER GJE[m
[31m-    82  E2809A ; #SINGLE LOW-9 QUOTATION MARK[m
[31m-    83  D193 ; #CYRILLIC SMALL LETTER GJE[m
[31m-    84  E2809E ; #DOUBLE LOW-9 QUOTATION MARK[m
[31m-    85  E280A6 ; #HORIZONTAL ELLIPSIS[m
[31m-    86  E280A0 ; #DAGGER[m
[31m-    87  E280A1 ; #DOUBLE DAGGER[m
[31m-    88  E282AC ; #EURO SIGN[m
[31m-    89  E280B0 ; #PER MILLE SIGN[m
[31m-    8A  D089 ; #CYRILLIC CAPITAL LETTER LJE[m
[31m-    8B  E280B9 ; #SINGLE LEFT-POINTING ANGLE QUOTATION MARK[m
[31m-    8C  D08A ; #CYRILLIC CAPITAL LETTER NJE[m
[31m-    8D  D08C ; #CYRILLIC CAPITAL LETTER KJE[m
[31m-    8E  D08B ; #CYRILLIC CAPITAL LETTER TSHE[m
[31m-    8F  D08F ; #CYRILLIC CAPITAL LETTER DZHE[m
[31m-    90  D192 ; #CYRILLIC SMALL LETTER DJE[m
[31m-    91  E28098 ; #LEFT SINGLE QUOTATION MARK[m
[31m-    92  E28099 ; #RIGHT SINGLE QUOTATION MARK[m
[31m-    93  E2809C ; #LEFT DOUBLE QUOTATION MARK[m
[31m-    94  E2809D ; #RIGHT DOUBLE QUOTATION MARK[m
[31m-    95  E280A2 ; #BULLET[m
[31m-    96  E28093 ; #EN DASH[m
[31m-    97  E28094 ; #EM DASH[m
[31m-    99  E284A2 ; #TRADE MARK SIGN[m
[31m-    9A  D199 ; #CYRILLIC SMALL LETTER LJE[m
[31m-    9B  E280BA ; #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK[m
[31m-    9C  D19A ; #CYRILLIC SMALL LETTER NJE[m
[31m-    9D  D19C ; #CYRILLIC SMALL LETTER KJE[m
[31m-    9E  D19B ; #CYRILLIC SMALL LETTER TSHE[m
[31m-    9F  D19F ; #CYRILLIC SMALL LETTER DZHE[m
[31m-    A0  C2A0 ; #NO-BREAK SPACE[m
[31m-    A1  D08E ; #CYRILLIC CAPITAL LETTER SHORT U[m
[31m-    A2  D19E ; #CYRILLIC SMALL LETTER SHORT U[m
[31m-    A3  D088 ; #CYRILLIC CAPITAL LETTER JE[m
[31m-    A4  C2A4 ; #CURRENCY SIGN[m
[31m-    A5  D290 ; #CYRILLIC CAPITAL LETTER GHE WITH UPTURN[m
[31m-    A6  C2A6 ; #BROKEN BAR[m
[31m-    A7  C2A7 ; #SECTION SIGN[m
[31m-    A8  D081 ; #CYRILLIC CAPITAL LETTER IO[m
[31m-    A9  C2A9 ; #COPYRIGHT SIGN[m
[31m-    AA  D084 ; #CYRILLIC CAPITAL LETTER UKRAINIAN IE[m
[31m-    AB  C2AB ; #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK[m
[31m-    AC  C2AC ; #NOT SIGN[m
[31m-    AD  C2AD ; #SOFT HYPHEN[m
[31m-    AE  C2AE ; #REGISTERED SIGN[m
[31m-    AF  D087 ; #CYRILLIC CAPITAL LETTER YI[m
[31m-    B0  C2B0 ; #DEGREE SIGN[m
[31m-    B1  C2B1 ; #PLUS-MINUS SIGN[m
[31m-    B2  D086 ; #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I[m
[31m-    B3  D196 ; #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I[m
[31m-    B4  D291 ; #CYRILLIC SMALL LETTER GHE WITH UPTURN[m
[31m-    B5  C2B5 ; #MICRO SIGN[m
[31m-    B6  C2B6 ; #PILCROW SIGN[m
[31m-    B7  C2B7 ; #MIDDLE DOT[m
[31m-    B8  D191 ; #CYRILLIC SMALL LETTER IO[m
[31m-    B9  E28496 ; #NUMERO SIGN[m
[31m-    BA  D194 ; #CYRILLIC SMALL LETTER UKRAINIAN IE[m
[31m-    BB  C2BB ; #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK[m
[31m-    BC  D198 ; #CYRILLIC SMALL LETTER JE[m
[31m-    BD  D085 ; #CYRILLIC CAPITAL LETTER DZE[m
[31m-    BE  D195 ; #CYRILLIC SMALL LETTER DZE[m
[31m-    BF  D197 ; #CYRILLIC SMALL LETTER YI[m
[31m-    C0  D090 ; #CYRILLIC CAPITAL LETTER A[m
[31m-    C1  D091 ; #CYRILLIC CAPITAL LETTER BE[m
[31m-    C2  D092 ; #CYRILLIC CAPITAL LETTER VE[m
[31m-    C3  D093 ; #CYRILLIC CAPITAL LETTER GHE[m
[31m-    C4  D094 ; #CYRILLIC CAPITAL LETTER DE[m
[31m-    C5  D095 ; #CYRILLIC CAPITAL LETTER IE[m
[31m-    C6  D096 ; #CYRILLIC CAPITAL LETTER ZHE[m
[31m-    C7  D097 ; #CYRILLIC CAPITAL LETTER ZE[m
[31m-    C8  D098 ; #CYRILLIC CAPITAL LETTER I[m
[31m-    C9  D099 ; #CYRILLIC CAPITAL LETTER SHORT I[m
[31m-    CA  D09A ; #CYRILLIC CAPITAL LETTER KA[m
[31m-    CB  D09B ; #CYRILLIC CAPITAL LETTER EL[m
[31m-    CC  D09C ; #CYRILLIC CAPITAL LETTER EM[m
[31m-    CD  D09D ; #CYRILLIC CAPITAL LETTER EN[m
[31m-    CE  D09E ; #CYRILLIC CAPITAL LETTER O[m
[31m-    CF  D09F ; #CYRILLIC CAPITAL LETTER PE[m
[31m-    D0  D0A0 ; #CYRILLIC CAPITAL LETTER ER[m
[31m-    D1  D0A1 ; #CYRILLIC CAPITAL LETTER ES[m
[31m-    D2  D0A2 ; #CYRILLIC CAPITAL LETTER TE[m
[31m-    D3  D0A3 ; #CYRILLIC CAPITAL LETTER U[m
[31m-    D4  D0A4 ; #CYRILLIC CAPITAL LETTER EF[m
[31m-    D5  D0A5 ; #CYRILLIC CAPITAL LETTER HA[m
[31m-    D6  D0A6 ; #CYRILLIC CAPITAL LETTER TSE[m
[31m-    D7  D0A7 ; #CYRILLIC CAPITAL LETTER CHE[m
[31m-    D8  D0A8 ; #CYRILLIC CAPITAL LETTER SHA[m
[31m-    D9  D0A9 ; #CYRILLIC CAPITAL LETTER SHCHA[m
[31m-    DA  D0AA ; #CYRILLIC CAPITAL LETTER HARD SIGN[m
[31m-    DB  D0AB ; #CYRILLIC CAPITAL LETTER YERU[m
[31m-    DC  D0AC ; #CYRILLIC CAPITAL LETTER SOFT SIGN[m
[31m-    DD  D0AD ; #CYRILLIC CAPITAL LETTER E[m
[31m-    DE  D0AE ; #CYRILLIC CAPITAL LETTER YU[m
[31m-    DF  D0AF ; #CYRILLIC CAPITAL LETTER YA[m
[31m-    E0  D0B0 ; #CYRILLIC SMALL LETTER A[m
[31m-    E1  D0B1 ; #CYRILLIC SMALL LETTER BE[m
[31m-    E2  D0B2 ; #CYRILLIC SMALL LETTER VE[m
[31m-    E3  D0B3 ; #CYRILLIC SMALL LETTER GHE[m
[31m-    E4  D0B4 ; #CYRILLIC SMALL LETTER DE[m
[31m-    E5  D0B5 ; #CYRILLIC SMALL LETTER IE[m
[31m-    E6  D0B6 ; #CYRILLIC SMALL LETTER ZHE[m
[31m-    E7  D0B7 ; #CYRILLIC SMALL LETTER ZE[m
[31m-    E8  D0B8 ; #CYRILLIC SMALL LETTER I[m
[31m-    E9  D0B9 ; #CYRILLIC SMALL LETTER SHORT I[m
[31m-    EA  D0BA ; #CYRILLIC SMALL LETTER KA[m
[31m-    EB  D0BB ; #CYRILLIC SMALL LETTER EL[m
[31m-    EC  D0BC ; #CYRILLIC SMALL LETTER EM[m
[31m-    ED  D0BD ; #CYRILLIC SMALL LETTER EN[m
[31m-    EE  D0BE ; #CYRILLIC SMALL LETTER O[m
[31m-    EF  D0BF ; #CYRILLIC SMALL LETTER PE[m
[31m-    F0  D180 ; #CYRILLIC SMALL LETTER ER[m
[31m-    F1  D181 ; #CYRILLIC SMALL LETTER ES[m
[31m-    F2  D182 ; #CYRILLIC SMALL LETTER TE[m
[31m-    F3  D183 ; #CYRILLIC SMALL LETTER U[m
[31m-    F4  D184 ; #CYRILLIC SMALL LETTER EF[m
[31m-    F5  D185 ; #CYRILLIC SMALL LETTER HA[m
[31m-    F6  D186 ; #CYRILLIC SMALL LETTER TSE[m
[31m-    F7  D187 ; #CYRILLIC SMALL LETTER CHE[m
[31m-    F8  D188 ; #CYRILLIC SMALL LETTER SHA[m
[31m-    F9  D189 ; #CYRILLIC SMALL LETTER SHCHA[m
[31m-    FA  D18A ; #CYRILLIC SMALL LETTER HARD SIGN[m
[31m-    FB  D18B ; #CYRILLIC SMALL LETTER YERU[m
[31m-    FC  D18C ; #CYRILLIC SMALL LETTER SOFT SIGN[m
[31m-    FD  D18D ; #CYRILLIC SMALL LETTER E[m
[31m-    FE  D18E ; #CYRILLIC SMALL LETTER YU[m
[31m-    FF  D18F ; #CYRILLIC SMALL LETTER YA[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/ftdetect/nginx.vim b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/ftdetect/nginx.vim[m
[1mdeleted file mode 100644[m
[1mindex 3ae470d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/ftdetect/nginx.vim[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-au BufRead,BufNewFile *.nginx set ft=nginx[m
[31m-au BufRead,BufNewFile */etc/nginx/* set ft=nginx[m
[31m-au BufRead,BufNewFile */usr/local/nginx/conf/* set ft=nginx[m
[31m-au BufRead,BufNewFile nginx.conf set ft=nginx[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/indent/nginx.vim b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/indent/nginx.vim[m
[1mdeleted file mode 100644[m
[1mindex 8601366..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/indent/nginx.vim[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m-if exists("b:did_indent")[m
[31m-    finish[m
[31m-endif[m
[31m-let b:did_indent = 1[m
[31m-[m
[31m-setlocal indentexpr=[m
[31m-[m
[31m-" cindent actually works for nginx' simple file structure[m
[31m-setlocal cindent[m
[31m-" Just make sure that the comments are not reset as defs would be.[m
[31m-setlocal cinkeys-=0#[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/syntax/nginx.vim b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/syntax/nginx.vim[m
[1mdeleted file mode 100644[m
[1mindex f1fd48a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/contrib/vim/syntax/nginx.vim[m
[1m+++ /dev/null[m
[36m@@ -1,836 +0,0 @@[m
[31m-" Vim syntax file[m
[31m-" Language: nginx.conf[m
[31m-[m
[31m-if exists("b:current_syntax")[m
[31m-  finish[m
[31m-end[m
[31m-[m
[31m-setlocal iskeyword+=.[m
[31m-setlocal iskeyword+=/[m
[31m-setlocal iskeyword+=:[m
[31m-[m
[31m-syn match ngxVariable '\$\(\w\+\|{\w\+}\)'[m
[31m-syn match ngxVariableBlock '\$\(\w\+\|{\w\+}\)' contained[m
[31m-syn match ngxVariableString '\$\(\w\+\|{\w\+}\)' contained[m
[31m-syn region ngxBlock start=+^+ end=+{+ skip=+\${+ contains=ngxComment,ngxDirectiveBlock,ngxVariableBlock,ngxString oneline[m
[31m-syn region ngxString start=+\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ contains=ngxVariableString[m
[31m-syn match ngxComment ' *#.*$'[m
[31m-[m
[31m-syn keyword ngxBoolean on[m
[31m-syn keyword ngxBoolean off[m
[31m-[m
[31m-syn keyword ngxDirectiveBlock http         contained[m
[31m-syn keyword ngxDirectiveBlock mail         contained[m
[31m-syn keyword ngxDirectiveBlock events       contained[m
[31m-syn keyword ngxDirectiveBlock server       contained[m
[31m-syn keyword ngxDirectiveBlock types        contained[m
[31m-syn keyword ngxDirectiveBlock location     contained[m
[31m-syn keyword ngxDirectiveBlock upstream     contained[m
[31m-syn keyword ngxDirectiveBlock charset_map  contained[m
[31m-syn keyword ngxDirectiveBlock limit_except contained[m
[31m-syn keyword ngxDirectiveBlock if           contained[m
[31m-syn keyword ngxDirectiveBlock geo          contained[m
[31m-syn keyword ngxDirectiveBlock map          contained[m
[31m-syn keyword ngxDirectiveBlock split_clients contained[m
[31m-[m
[31m-syn keyword ngxDirectiveImportant include[m
[31m-syn keyword ngxDirectiveImportant root[m
[31m-syn keyword ngxDirectiveImportant server[m
[31m-syn keyword ngxDirectiveImportant server_name[m
[31m-syn keyword ngxDirectiveImportant listen[m
[31m-syn keyword ngxDirectiveImportant internal[m
[31m-syn keyword ngxDirectiveImportant proxy_pass[m
[31m-syn keyword ngxDirectiveImportant memcached_pass[m
[31m-syn keyword ngxDirectiveImportant fastcgi_pass[m
[31m-syn keyword ngxDirectiveImportant scgi_pass[m
[31m-syn keyword ngxDirectiveImportant uwsgi_pass[m
[31m-syn keyword ngxDirectiveImportant try_files[m
[31m-[m
[31m-syn keyword ngxDirectiveControl break[m
[31m-syn keyword ngxDirectiveControl return[m
[31m-syn keyword ngxDirectiveControl rewrite[m
[31m-syn keyword ngxDirectiveControl set[m
[31m-[m
[31m-syn keyword ngxDirectiveError error_page[m
[31m-syn keyword ngxDirectiveError post_action[m
[31m-[m
[31m-syn keyword ngxDirectiveDeprecated connections[m
[31m-syn keyword ngxDirectiveDeprecated imap[m
[31m-syn keyword ngxDirectiveDeprecated limit_zone[m
[31m-syn keyword ngxDirectiveDeprecated mysql_test[m
[31m-syn keyword ngxDirectiveDeprecated open_file_cache_retest[m
[31m-syn keyword ngxDirectiveDeprecated optimize_server_names[m
[31m-syn keyword ngxDirectiveDeprecated satisfy_any[m
[31m-syn keyword ngxDirectiveDeprecated so_keepalive[m
[31m-[m
[31m-syn keyword ngxDirective accept_mutex[m
[31m-syn keyword ngxDirective accept_mutex_delay[m
[31m-syn keyword ngxDirective acceptex_read[m
[31m-syn keyword ngxDirective access_log[m
[31m-syn keyword ngxDirective add_after_body[m
[31m-syn keyword ngxDirective add_before_body[m
[31m-syn keyword ngxDirective add_header[m
[31m-syn keyword ngxDirective addition_types[m
[31m-syn keyword ngxDirective aio[m
[31m-syn keyword ngxDirective alias[m
[31m-syn keyword ngxDirective allow[m
[31m-syn keyword ngxDirective ancient_browser[m
[31m-syn keyword ngxDirective ancient_browser_value[m
[31m-syn keyword ngxDirective auth_basic[m
[31m-syn keyword ngxDirective auth_basic_user_file[m
[31m-syn keyword ngxDirective auth_http[m
[31m-syn keyword ngxDirective auth_http_header[m
[31m-syn keyword ngxDirective auth_http_timeout[m
[31m-syn keyword ngxDirective auth_request[m
[31m-syn keyword ngxDirective auth_request_set[m
[31m-syn keyword ngxDirective autoindex[m
[31m-syn keyword ngxDirective autoindex_exact_size[m
[31m-syn keyword ngxDirective autoindex_localtime[m
[31m-syn keyword ngxDirective charset[m
[31m-syn keyword ngxDirective charset_types[m
[31m-syn keyword ngxDirective chunked_transfer_encoding[m
[31m-syn keyword ngxDirective client_body_buffer_size[m
[31m-syn keyword ngxDirective client_body_in_file_only[m
[31m-syn keyword ngxDirective client_body_in_single_buffer[m
[31m-syn keyword ngxDirective client_body_temp_path[m
[31m-syn keyword ngxDirective client_body_timeout[m
[31m-syn keyword ngxDirective client_header_buffer_size[m
[31m-syn keyword ngxDirective client_header_timeout[m
[31m-syn keyword ngxDirective client_max_body_size[m
[31m-syn keyword ngxDirective connection_pool_size[m
[31m-syn keyword ngxDirective create_full_put_path[m
[31m-syn keyword ngxDirective daemon[m
[31m-syn keyword ngxDirective dav_access[m
[31m-syn keyword ngxDirective dav_methods[m
[31m-syn keyword ngxDirective debug_connection[m
[31m-syn keyword ngxDirective debug_points[m
[31m-syn keyword ngxDirective default_type[m
[31m-syn keyword ngxDirective degradation[m
[31m-syn keyword ngxDirective degrade[m
[31m-syn keyword ngxDirective deny[m
[31m-syn keyword ngxDirective devpoll_changes[m
[31m-syn keyword ngxDirective devpoll_events[m
[31m-syn keyword ngxDirective directio[m
[31m-syn keyword ngxDirective directio_alignment[m
[31m-syn keyword ngxDirective disable_symlinks[m
[31m-syn keyword ngxDirective empty_gif[m
[31m-syn keyword ngxDirective env[m
[31m-syn keyword ngxDirective epoll_events[m
[31m-syn keyword ngxDirective error_log[m
[31m-syn keyword ngxDirective etag[m
[31m-syn keyword ngxDirective eventport_events[m
[31m-syn keyword ngxDirective expires[m
[31m-syn keyword ngxDirective fastcgi_bind[m
[31m-syn keyword ngxDirective fastcgi_buffer_size[m
[31m-syn keyword ngxDirective fastcgi_buffering[m
[31m-syn keyword ngxDirective fastcgi_buffers[m
[31m-syn keyword ngxDirective fastcgi_busy_buffers_size[m
[31m-syn keyword ngxDirective fastcgi_cache[m
[31m-syn keyword ngxDirective fastcgi_cache_bypass[m
[31m-syn keyword ngxDirective fastcgi_cache_key[m
[31m-syn keyword ngxDirective fastcgi_cache_lock[m
[31m-syn keyword ngxDirective fastcgi_cache_lock_timeout[m
[31m-syn keyword ngxDirective fastcgi_cache_methods[m
[31m-syn keyword ngxDirective fastcgi_cache_min_uses[m
[31m-syn keyword ngxDirective fastcgi_cache_path[m
[31m-syn keyword ngxDirective fastcgi_cache_revalidate[m
[31m-syn keyword ngxDirective fastcgi_cache_use_stale[m
[31m-syn keyword ngxDirective fastcgi_cache_valid[m
[31m-syn keyword ngxDirective fastcgi_catch_stderr[m
[31m-syn keyword ngxDirective fastcgi_connect_timeout[m
[31m-syn keyword ngxDirective fastcgi_force_ranges[m
[31m-syn keyword ngxDirective fastcgi_hide_header[m
[31m-syn keyword ngxDirective fastcgi_ignore_client_abort[m
[31m-syn keyword ngxDirective fastcgi_ignore_headers[m
[31m-syn keyword ngxDirective fastcgi_index[m
[31m-syn keyword ngxDirective fastcgi_intercept_errors[m
[31m-syn keyword ngxDirective fastcgi_keep_conn[m
[31m-syn keyword ngxDirective fastcgi_max_temp_file_size[m
[31m-syn keyword ngxDirective fastcgi_next_upstream[m
[31m-syn keyword ngxDirective fastcgi_next_upstream_timeout[m
[31m-syn keyword ngxDirective fastcgi_next_upstream_tries[m
[31m-syn keyword ngxDirective fastcgi_no_cache[m
[31m-syn keyword ngxDirective fastcgi_param[m
[31m-syn keyword ngxDirective fastcgi_pass_header[m
[31m-syn keyword ngxDirective fastcgi_pass_request_body[m
[31m-syn keyword ngxDirective fastcgi_pass_request_headers[m
[31m-syn keyword ngxDirective fastcgi_read_timeout[m
[31m-syn keyword ngxDirective fastcgi_send_lowat[m
[31m-syn keyword ngxDirective fastcgi_send_timeout[m
[31m-syn keyword ngxDirective fastcgi_split_path_info[m
[31m-syn keyword ngxDirective fastcgi_store[m
[31m-syn keyword ngxDirective fastcgi_store_access[m
[31m-syn keyword ngxDirective fastcgi_temp_file_write_size[m
[31m-syn keyword ngxDirective fastcgi_temp_path[m
[31m-syn keyword ngxDirective flv[m
[31m-syn keyword ngxDirective geoip_city[m
[31m-syn keyword ngxDirective geoip_country[m
[31m-syn keyword ngxDirective geoip_org[m
[31m-syn keyword ngxDirective geoip_proxy[m
[31m-syn keyword ngxDirective geoip_proxy_recursive[m
[31m-syn keyword ngxDirective google_perftools_profiles[m
[31m-syn keyword ngxDirective gunzip[m
[31m-syn keyword ngxDirective gunzip_buffers[m
[31m-syn keyword ngxDirective gzip[m
[31m-syn keyword ngxDirective gzip_buffers[m
[31m-syn keyword ngxDirective gzip_comp_level[m
[31m-syn keyword ngxDirective gzip_disable[m
[31m-syn keyword ngxDirective gzip_hash[m
[31m-syn keyword ngxDirective gzip_http_version[m
[31m-syn keyword ngxDirective gzip_min_length[m
[31m-syn keyword ngxDirective gzip_no_buffer[m
[31m-syn keyword ngxDirective gzip_proxied[m
[31m-syn keyword ngxDirective gzip_static[m
[31m-syn keyword ngxDirective gzip_types[m
[31m-syn keyword ngxDirective gzip_vary[m
[31m-syn keyword ngxDirective gzip_window[m
[31m-syn keyword ngxDirective hash[m
[31m-syn keyword ngxDirective if_modified_since[m
[31m-syn keyword ngxDirective ignore_invalid_headers[m
[31m-syn keyword ngxDirective image_filter[m
[31m-syn keyword ngxDirective image_filter_buffer[m
[31m-syn keyword ngxDirective image_filter_interlace[m
[31m-syn keyword ngxDirective image_filter_jpeg_quality[m
[31m-syn keyword ngxDirective image_filter_sharpen[m
[31m-syn keyword ngxDirective image_filter_transparency[m
[31m-syn keyword ngxDirective imap_auth[m
[31m-syn keyword ngxDirective imap_capabilities[m
[31m-syn keyword ngxDirective imap_client_buffer[m
[31m-syn keyword ngxDirective index[m
[31m-syn keyword ngxDirective iocp_threads[m
[31m-syn keyword ngxDirective ip_hash[m
[31m-syn keyword ngxDirective keepalive[m
[31m-syn keyword ngxDirective keepalive_disable[m
[31m-syn keyword ngxDirective keepalive_requests[m
[31m-syn keyword ngxDirective keepalive_timeout[m
[31m-syn keyword ngxDirective kqueue_changes[m
[31m-syn keyword ngxDirective kqueue_events[m
[31m-syn keyword ngxDirective large_client_header_buffers[m
[31m-syn keyword ngxDirective least_conn[m
[31m-syn keyword ngxDirective limit_conn[m
[31m-syn keyword ngxDirective limit_conn_log_level[m
[31m-syn keyword ngxDirective limit_conn_status[m
[31m-syn keyword ngxDirective limit_conn_zone[m
[31m-syn keyword ngxDirective limit_rate[m
[31m-syn keyword ngxDirective limit_rate_after[m
[31m-syn keyword ngxDirective limit_req[m
[31m-syn keyword ngxDirective limit_req_log_level[m
[31m-syn keyword ngxDirective limit_req_status[m
[31m-syn keyword ngxDirective limit_req_zone[m
[31m-syn keyword ngxDirective lingering_close[m
[31m-syn keyword ngxDirective lingering_time[m
[31m-syn keyword ngxDirective lingering_timeout[m
[31m-syn keyword ngxDirective lock_file[m
[31m-syn keyword ngxDirective log_format[m
[31m-syn keyword ngxDirective log_not_found[m
[31m-syn keyword ngxDirective log_subrequest[m
[31m-syn keyword ngxDirective map_hash_bucket_size[m
[31m-syn keyword ngxDirective map_hash_max_size[m
[31m-syn keyword ngxDirective master_process[m
[31m-syn keyword ngxDirective max_ranges[m
[31m-syn keyword ngxDirective memcached_bind[m
[31m-syn keyword ngxDirective memcached_buffer_size[m
[31m-syn keyword ngxDirective memcached_connect_timeout[m
[31m-syn keyword ngxDirective memcached_gzip_flag[m
[31m-syn keyword ngxDirective memcached_next_upstream[m
[31m-syn keyword ngxDirective memcached_next_upstream_timeout[m
[31m-syn keyword ngxDirective memcached_next_upstream_tries[m
[31m-syn keyword ngxDirective memcached_read_timeout[m
[31m-syn keyword ngxDirective memcached_send_timeout[m
[31m-syn keyword ngxDirective merge_slashes[m
[31m-syn keyword ngxDirective min_delete_depth[m
[31m-syn keyword ngxDirective modern_browser[m
[31m-syn keyword ngxDirective modern_browser_value[m
[31m-syn keyword ngxDirective mp4[m
[31m-syn keyword ngxDirective mp4_buffer_size[m
[31m-syn keyword ngxDirective mp4_max_buffer_size[m
[31m-syn keyword ngxDirective msie_padding[m
[31m-syn keyword ngxDirective msie_refresh[m
[31m-syn keyword ngxDirective multi_accept[m
[31m-syn keyword ngxDirective open_file_cache[m
[31m-syn keyword ngxDirective open_file_cache_errors[m
[31m-syn keyword ngxDirective open_file_cache_events[m
[31m-syn keyword ngxDirective open_file_cache_min_uses[m
[31m-syn keyword ngxDirective open_file_cache_valid[m
[31m-syn keyword ngxDirective open_log_file_cache[m
[31m-syn keyword ngxDirective output_buffers[m
[31m-syn keyword ngxDirective override_charset[m
[31m-syn keyword ngxDirective pcre_jit[m
[31m-syn keyword ngxDirective perl[m
[31m-syn keyword ngxDirective perl_modules[m
[31m-syn keyword ngxDirective perl_require[m
[31m-syn keyword ngxDirective perl_set[m
[31m-syn keyword ngxDirective pid[m
[31m-syn keyword ngxDirective pop3_auth[m
[31m-syn keyword ngxDirective pop3_capabilities[m
[31m-syn keyword ngxDirective port_in_redirect[m
[31m-syn keyword ngxDirective post_acceptex[m
[31m-syn keyword ngxDirective postpone_gzipping[m
[31m-syn keyword ngxDirective postpone_output[m
[31m-syn keyword ngxDirective protocol[m
[31m-syn keyword ngxDirective proxy[m
[31m-syn keyword ngxDirective proxy_bind[m
[31m-syn keyword ngxDirective proxy_buffer[m
[31m-syn keyword ngxDirective proxy_buffer_size[m
[31m-syn keyword ngxDirective proxy_buffering[m
[31m-syn keyword ngxDirective proxy_buffers[m
[31m-syn keyword ngxDirective proxy_busy_buffers_size[m
[31m-syn keyword ngxDirective proxy_cache[m
[31m-syn keyword ngxDirective proxy_cache_bypass[m
[31m-syn keyword ngxDirective proxy_cache_key[m
[31m-syn keyword ngxDirective proxy_cache_lock[m
[31m-syn keyword ngxDirective proxy_cache_lock_timeout[m
[31m-syn keyword ngxDirective proxy_cache_methods[m
[31m-syn keyword ngxDirective proxy_cache_min_uses[m
[31m-syn keyword ngxDirective proxy_cache_path[m
[31m-syn keyword ngxDirective proxy_cache_revalidate[m
[31m-syn keyword ngxDirective proxy_cache_use_stale[m
[31m-syn keyword ngxDirective proxy_cache_valid[m
[31m-syn keyword ngxDirective proxy_connect_timeout[m
[31m-syn keyword ngxDirective proxy_cookie_domain[m
[31m-syn keyword ngxDirective proxy_cookie_path[m
[31m-syn keyword ngxDirective proxy_force_ranges[m
[31m-syn keyword ngxDirective proxy_headers_hash_bucket_size[m
[31m-syn keyword ngxDirective proxy_headers_hash_max_size[m
[31m-syn keyword ngxDirective proxy_hide_header[m
[31m-syn keyword ngxDirective proxy_http_version[m
[31m-syn keyword ngxDirective proxy_ignore_client_abort[m
[31m-syn keyword ngxDirective proxy_ignore_headers[m
[31m-syn keyword ngxDirective proxy_intercept_errors[m
[31m-syn keyword ngxDirective proxy_max_temp_file_size[m
[31m-syn keyword ngxDirective proxy_method[m
[31m-syn keyword ngxDirective proxy_next_upstream[m
[31m-syn keyword ngxDirective proxy_next_upstream_timeout[m
[31m-syn keyword ngxDirective proxy_next_upstream_tries[m
[31m-syn keyword ngxDirective proxy_no_cache[m
[31m-syn keyword ngxDirective proxy_pass_error_message[m
[31m-syn keyword ngxDirective proxy_pass_header[m
[31m-syn keyword ngxDirective proxy_pass_request_body[m
[31m-syn keyword ngxDirective proxy_pass_request_headers[m
[31m-syn keyword ngxDirective proxy_read_timeout[m
[31m-syn keyword ngxDirective proxy_redirect[m
[31m-syn keyword ngxDirective proxy_send_lowat[m
[31m-syn keyword ngxDirective proxy_send_timeout[m
[31m-syn keyword ngxDirective proxy_set_body[m
[31m-syn keyword ngxDirective proxy_set_header[m
[31m-syn keyword ngxDirective proxy_ssl_ciphers[m
[31m-syn keyword ngxDirective proxy_ssl_crl[m
[31m-syn keyword ngxDirective proxy_ssl_name[m
[31m-syn keyword ngxDirective proxy_ssl_protocols[m
[31m-syn keyword ngxDirective proxy_ssl_server_name[m
[31m-syn keyword ngxDirective proxy_ssl_session_reuse[m
[31m-syn keyword ngxDirective proxy_ssl_trusted_certificate[m
[31m-syn keyword ngxDirective proxy_ssl_verify[m
[31m-syn keyword ngxDirective proxy_ssl_verify_depth[m
[31m-syn keyword ngxDirective proxy_store[m
[31m-syn keyword ngxDirective proxy_store_access[m
[31m-syn keyword ngxDirective proxy_temp_file_write_size[m
[31m-syn keyword ngxDirective proxy_temp_path[m
[31m-syn keyword ngxDirective proxy_timeout[m
[31m-syn keyword ngxDirective random_index[m
[31m-syn keyword ngxDirective read_ahead[m
[31m-syn keyword ngxDirective real_ip_header[m
[31m-syn keyword ngxDirective real_ip_recursive[m
[31m-syn keyword ngxDirective recursive_error_pages[m
[31m-syn keyword ngxDirective referer_hash_bucket_size[m
[31m-syn keyword ngxDirective referer_hash_max_size[m
[31m-syn keyword ngxDirective request_pool_size[m
[31m-syn keyword ngxDirective reset_timedout_connection[m
[31m-syn keyword ngxDirective resolver[m
[31m-syn keyword ngxDirective resolver_timeout[m
[31m-syn keyword ngxDirective rewrite_log[m
[31m-syn keyword ngxDirective rtsig_overflow_events[m
[31m-syn keyword ngxDirective rtsig_overflow_test[m
[31m-syn keyword ngxDirective rtsig_overflow_threshold[m
[31m-syn keyword ngxDirective rtsig_signo[m
[31m-syn keyword ngxDirective satisfy[m
[31m-syn keyword ngxDirective scgi_bind[m
[31m-syn keyword ngxDirective scgi_buffer_size[m
[31m-syn keyword ngxDirective scgi_buffering[m
[31m-syn keyword ngxDirective scgi_buffers[m
[31m-syn keyword ngxDirective scgi_busy_buffers_size[m
[31m-syn keyword ngxDirective scgi_cache[m
[31m-syn keyword ngxDirective scgi_cache_bypass[m
[31m-syn keyword ngxDirective scgi_cache_key[m
[31m-syn keyword ngxDirective scgi_cache_lock[m
[31m-syn keyword ngxDirective scgi_cache_lock_timeout[m
[31m-syn keyword ngxDirective scgi_cache_methods[m
[31m-syn keyword ngxDirective scgi_cache_min_uses[m
[31m-syn keyword ngxDirective scgi_cache_path[m
[31m-syn keyword ngxDirective scgi_cache_revalidate[m
[31m-syn keyword ngxDirective scgi_cache_use_stale[m
[31m-syn keyword ngxDirective scgi_cache_valid[m
[31m-syn keyword ngxDirective scgi_connect_timeout[m
[31m-syn keyword ngxDirective scgi_force_ranges[m
[31m-syn keyword ngxDirective scgi_hide_header[m
[31m-syn keyword ngxDirective scgi_ignore_client_abort[m
[31m-syn keyword ngxDirective scgi_ignore_headers[m
[31m-syn keyword ngxDirective scgi_intercept_errors[m
[31m-syn keyword ngxDirective scgi_max_temp_file_size[m
[31m-syn keyword ngxDirective scgi_next_upstream[m
[31m-syn keyword ngxDirective scgi_next_upstream_timeout[m
[31m-syn keyword ngxDirective scgi_next_upstream_tries[m
[31m-syn keyword ngxDirective scgi_no_cache[m
[31m-syn keyword ngxDirective scgi_param[m
[31m-syn keyword ngxDirective scgi_pass_header[m
[31m-syn keyword ngxDirective scgi_pass_request_body[m
[31m-syn keyword ngxDirective scgi_pass_request_headers[m
[31m-syn keyword ngxDirective scgi_read_timeout[m
[31m-syn keyword ngxDirective scgi_send_timeout[m
[31m-syn keyword ngxDirective scgi_store[m
[31m-syn keyword ngxDirective scgi_store_access[m
[31m-syn keyword ngxDirective scgi_temp_file_write_size[m
[31m-syn keyword ngxDirective scgi_temp_path[m
[31m-syn keyword ngxDirective secure_link[m
[31m-syn keyword ngxDirective secure_link_md5[m
[31m-syn keyword ngxDirective secure_link_secret[m
[31m-syn keyword ngxDirective send_lowat[m
[31m-syn keyword ngxDirective send_timeout[m
[31m-syn keyword ngxDirective sendfile[m
[31m-syn keyword ngxDirective sendfile_max_chunk[m
[31m-syn keyword ngxDirective server_name_in_redirect[m
[31m-syn keyword ngxDirective server_names_hash_bucket_size[m
[31m-syn keyword ngxDirective server_names_hash_max_size[m
[31m-syn keyword ngxDirective server_tokens[m
[31m-syn keyword ngxDirective set_real_ip_from[m
[31m-syn keyword ngxDirective smtp_auth[m
[31m-syn keyword ngxDirective smtp_capabilities[m
[31m-syn keyword ngxDirective smtp_client_buffer[m
[31m-syn keyword ngxDirective smtp_greeting_delay[m
[31m-syn keyword ngxDirective source_charset[m
[31m-syn keyword ngxDirective spdy_chunk_size[m
[31m-syn keyword ngxDirective spdy_headers_comp[m
[31m-syn keyword ngxDirective spdy_keepalive_timeout[m
[31m-syn keyword ngxDirective spdy_max_concurrent_streams[m
[31m-syn keyword ngxDirective spdy_pool_size[m
[31m-syn keyword ngxDirective spdy_recv_buffer_size[m
[31m-syn keyword ngxDirective spdy_recv_timeout[m
[31m-syn keyword ngxDirective spdy_streams_index_size[m
[31m-syn keyword ngxDirective ssi[m
[31m-syn keyword ngxDirective ssi_ignore_recycled_buffers[m
[31m-syn keyword ngxDirective ssi_last_modified[m
[31m-syn keyword ngxDirective ssi_min_file_chunk[m
[31m-syn keyword ngxDirective ssi_silent_errors[m
[31m-syn keyword ngxDirective ssi_types[m
[31m-syn keyword ngxDirective ssi_value_length[m
[31m-syn keyword ngxDirective ssl[m
[31m-syn keyword ngxDirective ssl_buffer_size[m
[31m-syn keyword ngxDirective ssl_certificate[m
[31m-syn keyword ngxDirective ssl_certificate_key[m
[31m-syn keyword ngxDirective ssl_ciphers[m
[31m-syn keyword ngxDirective ssl_client_certificate[m
[31m-syn keyword ngxDirective ssl_crl[m
[31m-syn keyword ngxDirective ssl_dhparam[m
[31m-syn keyword ngxDirective ssl_ecdh_curve[m
[31m-syn keyword ngxDirective ssl_engine[m
[31m-syn keyword ngxDirective ssl_password_file[m
[31m-syn keyword ngxDirective ssl_prefer_server_ciphers[m
[31m-syn keyword ngxDirective ssl_protocols[m
[31m-syn keyword ngxDirective ssl_session_cache[m
[31m-syn keyword ngxDirective ssl_session_ticket_key[m
[31m-syn keyword ngxDirective ssl_session_tickets[m
[31m-syn keyword ngxDirective ssl_session_timeout[m
[31m-syn keyword ngxDirective ssl_stapling[m
[31m-syn keyword ngxDirective ssl_stapling_file[m
[31m-syn keyword ngxDirective ssl_stapling_responder[m
[31m-syn keyword ngxDirective ssl_stapling_verify[m
[31m-syn keyword ngxDirective ssl_trusted_certificate[m
[31m-syn keyword ngxDirective ssl_verify_client[m
[31m-syn keyword ngxDirective ssl_verify_depth[m
[31m-syn keyword ngxDirective starttls[m
[31m-syn keyword ngxDirective stub_status[m
[31m-syn keyword ngxDirective sub_filter[m
[31m-syn keyword ngxDirective sub_filter_last_modified[m
[31m-syn keyword ngxDirective sub_filter_once[m
[31m-syn keyword ngxDirective sub_filter_types[m
[31m-syn keyword ngxDirective tcp_nodelay[m
[31m-syn keyword ngxDirective tcp_nopush[m
[31m-syn keyword ngxDirective thread_stack_size[m
[31m-syn keyword ngxDirective timeout[m
[31m-syn keyword ngxDirective timer_resolution[m
[31m-syn keyword ngxDirective types_hash_bucket_size[m
[31m-syn keyword ngxDirective types_hash_max_size[m
[31m-syn keyword ngxDirective underscores_in_headers[m
[31m-syn keyword ngxDirective uninitialized_variable_warn[m
[31m-syn keyword ngxDirective use[m
[31m-syn keyword ngxDirective user[m
[31m-syn keyword ngxDirective userid[m
[31m-syn keyword ngxDirective userid_domain[m
[31m-syn keyword ngxDirective userid_expires[m
[31m-syn keyword ngxDirective userid_mark[m
[31m-syn keyword ngxDirective userid_name[m
[31m-syn keyword ngxDirective userid_p3p[m
[31m-syn keyword ngxDirective userid_path[m
[31m-syn keyword ngxDirective userid_service[m
[31m-syn keyword ngxDirective uwsgi_bind[m
[31m-syn keyword ngxDirective uwsgi_buffer_size[m
[31m-syn keyword ngxDirective uwsgi_buffering[m
[31m-syn keyword ngxDirective uwsgi_buffers[m
[31m-syn keyword ngxDirective uwsgi_busy_buffers_size[m
[31m-syn keyword ngxDirective uwsgi_cache[m
[31m-syn keyword ngxDirective uwsgi_cache_bypass[m
[31m-syn keyword ngxDirective uwsgi_cache_key[m
[31m-syn keyword ngxDirective uwsgi_cache_lock[m
[31m-syn keyword ngxDirective uwsgi_cache_lock_timeout[m
[31m-syn keyword ngxDirective uwsgi_cache_methods[m
[31m-syn keyword ngxDirective uwsgi_cache_min_uses[m
[31m-syn keyword ngxDirective uwsgi_cache_path[m
[31m-syn keyword ngxDirective uwsgi_cache_revalidate[m
[31m-syn keyword ngxDirective uwsgi_cache_use_stale[m
[31m-syn keyword ngxDirective uwsgi_cache_valid[m
[31m-syn keyword ngxDirective uwsgi_connect_timeout[m
[31m-syn keyword ngxDirective uwsgi_force_ranges[m
[31m-syn keyword ngxDirective uwsgi_hide_header[m
[31m-syn keyword ngxDirective uwsgi_ignore_client_abort[m
[31m-syn keyword ngxDirective uwsgi_ignore_headers[m
[31m-syn keyword ngxDirective uwsgi_intercept_errors[m
[31m-syn keyword ngxDirective uwsgi_max_temp_file_size[m
[31m-syn keyword ngxDirective uwsgi_modifier1[m
[31m-syn keyword ngxDirective uwsgi_modifier2[m
[31m-syn keyword ngxDirective uwsgi_next_upstream[m
[31m-syn keyword ngxDirective uwsgi_next_upstream_timeout[m
[31m-syn keyword ngxDirective uwsgi_next_upstream_tries[m
[31m-syn keyword ngxDirective uwsgi_no_cache[m
[31m-syn keyword ngxDirective uwsgi_param[m
[31m-syn keyword ngxDirective uwsgi_pass_header[m
[31m-syn keyword ngxDirective uwsgi_pass_request_body[m
[31m-syn keyword ngxDirective uwsgi_pass_request_headers[m
[31m-syn keyword ngxDirective uwsgi_read_timeout[m
[31m-syn keyword ngxDirective uwsgi_send_timeout[m
[31m-syn keyword ngxDirective uwsgi_ssl_ciphers[m
[31m-syn keyword ngxDirective uwsgi_ssl_crl[m
[31m-syn keyword ngxDirective uwsgi_ssl_name[m
[31m-syn keyword ngxDirective uwsgi_ssl_protocols[m
[31m-syn keyword ngxDirective uwsgi_ssl_server_name[m
[31m-syn keyword ngxDirective uwsgi_ssl_session_reuse[m
[31m-syn keyword ngxDirective uwsgi_ssl_trusted_certificate[m
[31m-syn keyword ngxDirective uwsgi_ssl_verify[m
[31m-syn keyword ngxDirective uwsgi_ssl_verify_depth[m
[31m-syn keyword ngxDirective uwsgi_store[m
[31m-syn keyword ngxDirective uwsgi_store_access[m
[31m-syn keyword ngxDirective uwsgi_string[m
[31m-syn keyword ngxDirective uwsgi_temp_file_write_size[m
[31m-syn keyword ngxDirective uwsgi_temp_path[m
[31m-syn keyword ngxDirective valid_referers[m
[31m-syn keyword ngxDirective variables_hash_bucket_size[m
[31m-syn keyword ngxDirective variables_hash_max_size[m
[31m-syn keyword ngxDirective worker_aio_requests[m
[31m-syn keyword ngxDirective worker_connections[m
[31m-syn keyword ngxDirective worker_cpu_affinity[m
[31m-syn keyword ngxDirective worker_priority[m
[31m-syn keyword ngxDirective worker_processes[m
[31m-syn keyword ngxDirective worker_rlimit_core[m
[31m-syn keyword ngxDirective worker_rlimit_nofile[m
[31m-syn keyword ngxDirective worker_rlimit_sigpending[m
[31m-syn keyword ngxDirective worker_threads[m
[31m-syn keyword ngxDirective working_directory[m
[31m-syn keyword ngxDirective xclient[m
[31m-syn keyword ngxDirective xml_entities[m
[31m-syn keyword ngxDirective xslt_last_modified[m
[31m-syn keyword ngxDirective xslt_param[m
[31m-syn keyword ngxDirective xslt_string_param[m
[31m-syn keyword ngxDirective xslt_stylesheet[m
[31m-syn keyword ngxDirective xslt_types[m
[31m-[m
[31m-" 3rd party module list:[m
[31m-" http://wiki.nginx.org/Nginx3rdPartyModules[m
[31m-[m
[31m-" Accept Language Module <http://wiki.nginx.org/NginxAcceptLanguageModule>[m
[31m-" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales.[m
[31m-syn keyword ngxDirectiveThirdParty set_from_accept_language[m
[31m-[m
[31m-" Access Key Module <http://wiki.nginx.org/NginxHttpAccessKeyModule>[m
[31m-" Denies access unless the request URL contains an access key.[m
[31m-syn keyword ngxDirectiveThirdParty accesskey[m
[31m-syn keyword ngxDirectiveThirdParty accesskey_arg[m
[31m-syn keyword ngxDirectiveThirdParty accesskey_hashmethod[m
[31m-syn keyword ngxDirectiveThirdParty accesskey_signature[m
[31m-[m
[31m-" Auth PAM Module <http://web.iti.upv.es/~sto/nginx/>[m
[31m-" HTTP Basic Authentication using PAM.[m
[31m-syn keyword ngxDirectiveThirdParty auth_pam[m
[31m-syn keyword ngxDirectiveThirdParty auth_pam_service_name[m
[31m-[m
[31m-" Cache Purge Module <http://labs.frickle.com/nginx_ngx_cache_purge/>[m
[31m-" Module adding ability to purge content from FastCGI and proxy caches.[m
[31m-syn keyword ngxDirectiveThirdParty fastcgi_cache_purge[m
[31m-syn keyword ngxDirectiveThirdParty proxy_cache_purge[m
[31m-[m
[31m-" Chunkin Module <http://wiki.nginx.org/NginxHttpChunkinModule>[m
[31m-" HTTP 1.1 chunked-encoding request body support for Nginx.[m
[31m-syn keyword ngxDirectiveThirdParty chunkin[m
[31m-syn keyword ngxDirectiveThirdParty chunkin_keepalive[m
[31m-syn keyword ngxDirectiveThirdParty chunkin_max_chunks_per_buf[m
[31m-syn keyword ngxDirectiveThirdParty chunkin_resume[m
[31m-[m
[31m-" Circle GIF Module <http://wiki.nginx.org/NginxHttpCircleGifModule>[m
[31m-" Generates simple circle images with the colors and size specified in the URL.[m
[31m-syn keyword ngxDirectiveThirdParty circle_gif[m
[31m-syn keyword ngxDirectiveThirdParty circle_gif_max_radius[m
[31m-syn keyword ngxDirectiveThirdParty circle_gif_min_radius[m
[31m-syn keyword ngxDirectiveThirdParty circle_gif_step_radius[m
[31m-[m
[31m-" Drizzle Module <http://github.com/chaoslawful/drizzle-nginx-module>[m
[31m-" Make nginx talk directly to mysql, drizzle, and sqlite3 by libdrizzle.[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_connect_timeout[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_dbname[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_keepalive[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_module_header[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_pass[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_query[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_recv_cols_timeout[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_recv_rows_timeout[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_send_query_timeout[m
[31m-syn keyword ngxDirectiveThirdParty drizzle_server[m
[31m-[m
[31m-" Echo Module <http://wiki.nginx.org/NginxHttpEchoModule>[m
[31m-" Brings 'echo', 'sleep', 'time', 'exec' and more shell-style goodies to Nginx config file.[m
[31m-syn keyword ngxDirectiveThirdParty echo[m
[31m-syn keyword ngxDirectiveThirdParty echo_after_body[m
[31m-syn keyword ngxDirectiveThirdParty echo_before_body[m
[31m-syn keyword ngxDirectiveThirdParty echo_blocking_sleep[m
[31m-syn keyword ngxDirectiveThirdParty echo_duplicate[m
[31m-syn keyword ngxDirectiveThirdParty echo_end[m
[31m-syn keyword ngxDirectiveThirdParty echo_exec[m
[31m-syn keyword ngxDirectiveThirdParty echo_flush[m
[31m-syn keyword ngxDirectiveThirdParty echo_foreach_split[m
[31m-syn keyword ngxDirectiveThirdParty echo_location[m
[31m-syn keyword ngxDirectiveThirdParty echo_location_async[m
[31m-syn keyword ngxDirectiveThirdParty echo_read_request_body[m
[31m-syn keyword ngxDirectiveThirdParty echo_request_body[m
[31m-syn keyword ngxDirectiveThirdParty echo_reset_timer[m
[31m-syn keyword ngxDirectiveThirdParty echo_sleep[m
[31m-syn keyword ngxDirectiveThirdParty echo_subrequest[m
[31m-syn keyword ngxDirectiveThirdParty echo_subrequest_async[m
[31m-[m
[31m-" Events Module <http://docs.dutov.org/nginx_modules_events_en.html>[m
[31m-" Provides options for start/stop events.[m
[31m-syn keyword ngxDirectiveThirdParty on_start[m
[31m-syn keyword ngxDirectiveThirdParty on_stop[m
[31m-[m
[31m-" EY Balancer Module <http://github.com/ry/nginx-ey-balancer>[m
[31m-" Adds a request queue to Nginx that allows the limiting of concurrent requests passed to the upstream.[m
[31m-syn keyword ngxDirectiveThirdParty max_connections[m
[31m-syn keyword ngxDirectiveThirdParty max_connections_max_queue_length[m
[31m-syn keyword ngxDirectiveThirdParty max_connections_queue_timeout[m
[31m-[m
[31m-" Fancy Indexes Module <https://connectical.com/projects/ngx-fancyindex/wiki>[m
[31m-" Like the built-in autoindex module, but fancier.[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_exact_size[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_footer[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_header[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_localtime[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_readme[m
[31m-syn keyword ngxDirectiveThirdParty fancyindex_readme_mode[m
[31m-[m
[31m-" GeoIP Module (DEPRECATED) <http://wiki.nginx.org/NginxHttp3rdPartyGeoIPModule>[m
[31m-" Country code lookups via the MaxMind GeoIP API.[m
[31m-syn keyword ngxDirectiveThirdParty geoip_country_file[m
[31m-[m
[31m-" Headers More Module <http://wiki.nginx.org/NginxHttpHeadersMoreModule>[m
[31m-" Set and clear input and output headers...more than "add"![m
[31m-syn keyword ngxDirectiveThirdParty more_clear_headers[m
[31m-syn keyword ngxDirectiveThirdParty more_clear_input_headers[m
[31m-syn keyword ngxDirectiveThirdParty more_set_headers[m
[31m-syn keyword ngxDirectiveThirdParty more_set_input_headers[m
[31m-[m
[31m-" HTTP Push Module <http://pushmodule.slact.net/>[m
[31m-" Turn Nginx into an adept long-polling HTTP Push (Comet) server.[m
[31m-syn keyword ngxDirectiveThirdParty push_buffer_size[m
[31m-syn keyword ngxDirectiveThirdParty push_listener[m
[31m-syn keyword ngxDirectiveThirdParty push_message_timeout[m
[31m-syn keyword ngxDirectiveThirdParty push_queue_messages[m
[31m-syn keyword ngxDirectiveThirdParty push_sender[m
[31m-[m
[31m-" HTTP Redis Module <http://people.FreeBSD.ORG/~osa/ngx_http_redis-0.3.1.tar.gz>>[m
[31m-" Redis <http://code.google.com/p/redis/> support.>[m
[31m-syn keyword ngxDirectiveThirdParty redis_bind[m
[31m-syn keyword ngxDirectiveThirdParty redis_buffer_size[m
[31m-syn keyword ngxDirectiveThirdParty redis_connect_timeout[m
[31m-syn keyword ngxDirectiveThirdParty redis_next_upstream[m
[31m-syn keyword ngxDirectiveThirdParty redis_pass[m
[31m-syn keyword ngxDirectiveThirdParty redis_read_timeout[m
[31m-syn keyword ngxDirectiveThirdParty redis_send_timeout[m
[31m-[m
[31m-" HTTP JavaScript Module <http://wiki.github.com/kung-fu-tzu/ngx_http_js_module>[m
[31m-" Embedding SpiderMonkey. Nearly full port on Perl module.[m
[31m-syn keyword ngxDirectiveThirdParty js[m
[31m-syn keyword ngxDirectiveThirdParty js_filter[m
[31m-syn keyword ngxDirectiveThirdParty js_filter_types[m
[31m-syn keyword ngxDirectiveThirdParty js_load[m
[31m-syn keyword ngxDirectiveThirdParty js_maxmem[m
[31m-syn keyword ngxDirectiveThirdParty js_require[m
[31m-syn keyword ngxDirectiveThirdParty js_set[m
[31m-syn keyword ngxDirectiveThirdParty js_utf8[m
[31m-[m
[31m-" Log Request Speed <http://wiki.nginx.org/NginxHttpLogRequestSpeed>[m
[31m-" Log the time it took to process each request.[m
[31m-syn keyword ngxDirectiveThirdParty log_request_speed_filter[m
[31m-syn keyword ngxDirectiveThirdParty log_request_speed_filter_timeout[m
[31m-[m
[31m-" Memc Module <http://wiki.nginx.org/NginxHttpMemcModule>[m
[31m-" An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands.[m
[31m-syn keyword ngxDirectiveThirdParty memc_buffer_size[m
[31m-syn keyword ngxDirectiveThirdParty memc_cmds_allowed[m
[31m-syn keyword ngxDirectiveThirdParty memc_connect_timeout[m
[31m-syn keyword ngxDirectiveThirdParty memc_flags_to_last_modified[m
[31m-syn keyword ngxDirectiveThirdParty memc_next_upstream[m
[31m-syn keyword ngxDirectiveThirdParty memc_pass[m
[31m-syn keyword ngxDirectiveThirdParty memc_read_timeout[m
[31m-syn keyword ngxDirectiveThirdParty memc_send_timeout[m
[31m-syn keyword ngxDirectiveThirdParty memc_upstream_fail_timeout[m
[31m-syn keyword ngxDirectiveThirdParty memc_upstream_max_fails[m
[31m-[m
[31m-" Mogilefs Module <http://www.grid.net.ru/nginx/mogilefs.en.html>[m
[31m-" Implements a MogileFS client, provides a replace to the Perlbal reverse proxy of the original MogileFS.[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_connect_timeout[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_domain[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_methods[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_noverify[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_pass[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_read_timeout[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_send_timeout[m
[31m-syn keyword ngxDirectiveThirdParty mogilefs_tracker[m
[31m-[m
[31m-" MP4 Streaming Lite Module <http://wiki.nginx.org/NginxMP4StreamingLite>[m
[31m-" Will seek to a certain time within H.264/MP4 files when provided with a 'start' parameter in the URL.[m
[31m-syn keyword ngxDirectiveThirdParty mp4[m
[31m-[m
[31m-" Nginx Notice Module <http://xph.us/software/nginx-notice/>[m
[31m-" Serve static file to POST requests.[m
[31m-syn keyword ngxDirectiveThirdParty notice[m
[31m-syn keyword ngxDirectiveThirdParty notice_type[m
[31m-[m
[31m-" Phusion Passenger <http://www.modrails.com/documentation.html>[m
[31m-" Easy and robust deployment of Ruby on Rails application on Apache and Nginx webservers.[m
[31m-syn keyword ngxDirectiveThirdParty passenger_base_uri[m
[31m-syn keyword ngxDirectiveThirdParty passenger_default_user[m
[31m-syn keyword ngxDirectiveThirdParty passenger_enabled[m
[31m-syn keyword ngxDirectiveThirdParty passenger_log_level[m
[31m-syn keyword ngxDirectiveThirdParty passenger_max_instances_per_app[m
[31m-syn keyword ngxDirectiveThirdParty passenger_max_pool_size[m
[31m-syn keyword ngxDirectiveThirdParty passenger_pool_idle_time[m
[31m-syn keyword ngxDirectiveThirdParty passenger_root[m
[31m-syn keyword ngxDirectiveThirdParty passenger_ruby[m
[31m-syn keyword ngxDirectiveThirdParty passenger_use_global_queue[m
[31m-syn keyword ngxDirectiveThirdParty passenger_user_switching[m
[31m-syn keyword ngxDirectiveThirdParty rack_env[m
[31m-syn keyword ngxDirectiveThirdParty rails_app_spawner_idle_time[m
[31m-syn keyword ngxDirectiveThirdParty rails_env[m
[31m-syn keyword ngxDirectiveThirdParty rails_framework_spawner_idle_time[m
[31m-syn keyword ngxDirectiveThirdParty rails_spawn_method[m
[31m-[m
[31m-" RDS JSON Module <http://github.com/agentzh/rds-json-nginx-module>[m
[31m-" Help ngx_drizzle and other DBD modules emit JSON data.[m
[31m-syn keyword ngxDirectiveThirdParty rds_json[m
[31m-syn keyword ngxDirectiveThirdParty rds_json_content_type[m
[31m-syn keyword ngxDirectiveThirdParty rds_json_format[m
[31m-syn keyword ngxDirectiveThirdParty rds_json_ret[m
[31m-[m
[31m-" RRD Graph Module <http://wiki.nginx.org/NginxNgx_rrd_graph>[m
[31m-" This module provides an HTTP interface to RRDtool's graphing facilities.[m
[31m-syn keyword ngxDirectiveThirdParty rrd_graph[m
[31m-syn keyword ngxDirectiveThirdParty rrd_graph_root[m
[31m-[m
[31m-" Secure Download <http://wiki.nginx.org/NginxHttpSecureDownload>[m
[31m-" Create expiring links.[m
[31m-syn keyword ngxDirectiveThirdParty secure_download[m
[31m-syn keyword ngxDirectiveThirdParty secure_download_fail_location[m
[31m-syn keyword ngxDirectiveThirdParty secure_download_path_mode[m
[31m-syn keyword ngxDirectiveThirdParty secure_download_secret[m
[31m-[m
[31m-" SlowFS Cache Module <http://labs.frickle.com/nginx_ngx_slowfs_cache/>[m
[31m-" Module adding ability to cache static files.[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_big_file_size[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_key[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_min_uses[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_path[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_purge[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_cache_valid[m
[31m-syn keyword ngxDirectiveThirdParty slowfs_temp_path[m
[31m-[m
[31m-" Strip Module <http://wiki.nginx.org/NginxHttpStripModule>[m
[31m-" Whitespace remover.[m
[31m-syn keyword ngxDirectiveThirdParty strip[m
[31m-[m
[31m-" Substitutions Module <http://wiki.nginx.org/NginxHttpSubsModule>[m
[31m-" A filter module which can do both regular expression and fixed string substitutions on response bodies.[m
[31m-syn keyword ngxDirectiveThirdParty subs_filter[m
[31m-syn keyword ngxDirectiveThirdParty subs_filter_types[m
[31m-[m
[31m-" Supervisord Module <http://labs.frickle.com/nginx_ngx_supervisord/>[m
[31m-" Module providing nginx with API to communicate with supervisord and manage (start/stop) backends on-demand.[m
[31m-syn keyword ngxDirectiveThirdParty supervisord[m
[31m-syn keyword ngxDirectiveThirdParty supervisord_inherit_backend_status[m
[31m-syn keyword ngxDirectiveThirdParty supervisord_name[m
[31m-syn keyword ngxDirectiveThirdParty supervisord_start[m
[31m-syn keyword ngxDirectiveThirdParty supervisord_stop[m
[31m-[m
[31m-" Upload Module <http://www.grid.net.ru/nginx/upload.en.html>[m
[31m-" Parses multipart/form-data allowing arbitrary handling of uploaded files.[m
[31m-syn keyword ngxDirectiveThirdParty upload_aggregate_form_field[m
[31m-syn keyword ngxDirectiveThirdParty upload_buffer_size[m
[31m-syn keyword ngxDirectiveThirdParty upload_cleanup[m
[31m-syn keyword ngxDirectiveThirdParty upload_limit_rate[m
[31m-syn keyword ngxDirectiveThirdParty upload_max_file_size[m
[31m-syn keyword ngxDirectiveThirdParty upload_max_output_body_len[m
[31m-syn keyword ngxDirectiveThirdParty upload_max_part_header_len[m
[31m-syn keyword ngxDirectiveThirdParty upload_pass[m
[31m-syn keyword ngxDirectiveThirdParty upload_pass_args[m
[31m-syn keyword ngxDirectiveThirdParty upload_pass_form_field[m
[31m-syn keyword ngxDirectiveThirdParty upload_set_form_field[m
[31m-syn keyword ngxDirectiveThirdParty upload_store[m
[31m-syn keyword ngxDirectiveThirdParty upload_store_access[m
[31m-[m
[31m-" Upload Progress Module <http://wiki.nginx.org/NginxHttpUploadProgressModule>[m
[31m-" Tracks and reports upload progress.[m
[31m-syn keyword ngxDirectiveThirdParty report_uploads[m
[31m-syn keyword ngxDirectiveThirdParty track_uploads[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress_content_type[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress_header[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress_json_output[m
[31m-syn keyword ngxDirectiveThirdParty upload_progress_template[m
[31m-[m
[31m-" Upstream Fair Balancer <http://wiki.nginx.org/NginxHttpUpstreamFairModule>[m
[31m-" Sends an incoming request to the least-busy backend server, rather than distributing requests round-robin.[m
[31m-syn keyword ngxDirectiveThirdParty fair[m
[31m-syn keyword ngxDirectiveThirdParty upstream_fair_shm_size[m
[31m-[m
[31m-" Upstream Consistent Hash <http://wiki.nginx.org/NginxHttpUpstreamConsistentHash>[m
[31m-" Select backend based on Consistent hash ring.[m
[31m-syn keyword ngxDirectiveThirdParty consistent_hash[m
[31m-[m
[31m-" Upstream Hash Module <http://wiki.nginx.org/NginxHttpUpstreamRequestHashModule>[m
[31m-" Provides simple upstream load distribution by hashing a configurable variable.[m
[31m-syn keyword ngxDirectiveThirdParty hash[m
[31m-syn keyword ngxDirectiveThirdParty hash_again[m
[31m-[m
[31m-" XSS Module <http://github.com/agentzh/xss-nginx-module>[m
[31m-" Native support for cross-site scripting (XSS) in an nginx.[m
[31m-syn keyword ngxDirectiveThirdParty xss_callback_arg[m
[31m-syn keyword ngxDirectiveThirdParty xss_get[m
[31m-syn keyword ngxDirectiveThirdParty xss_input_types[m
[31m-syn keyword ngxDirectiveThirdParty xss_output_type[m
[31m-[m
[31m-" highlight[m
[31m-[m
[31m-hi link ngxComment Comment[m
[31m-hi link ngxVariable Identifier[m
[31m-hi link ngxVariableBlock Identifier[m
[31m-hi link ngxVariableString PreProc[m
[31m-hi link ngxBlock Normal[m
[31m-hi link ngxString String[m
[31m-[m
[31m-hi link ngxBoolean Boolean[m
[31m-hi link ngxDirectiveBlock Statement[m
[31m-hi link ngxDirectiveImportant Type[m
[31m-hi link ngxDirectiveControl Keyword[m
[31m-hi link ngxDirectiveError Constant[m
[31m-hi link ngxDirectiveDeprecated Error[m
[31m-hi link ngxDirective Identifier[m
[31m-hi link ngxDirectiveThirdParty Special[m
[31m-[m
[31m-let b:current_syntax = "nginx"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/GNUmakefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/GNUmakefile[m
[1mdeleted file mode 100644[m
[1mindex 9a920fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/GNUmakefile[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-[m
[31m-VER=	$(shell grep 'define NGINX_VERSION' src/core/nginx.h		\[m
[31m-		| sed -e 's/^.*"\(.*\)".*/\1/')[m
[31m-NGINX=	nginx-$(VER)[m
[31m-TEMP=	tmp[m
[31m-XSLS?=	xslscript.pl[m
[31m-[m
[31m-[m
[31m-all:		changes[m
[31m-[m
[31m-changes:	$(TEMP)/$(NGINX)/CHANGES.ru				\[m
[31m-		$(TEMP)/$(NGINX)/CHANGES[m
[31m-[m
[31m-[m
[31m-$(TEMP)/$(NGINX)/CHANGES.ru:	docs/dtd/changes.dtd			\[m
[31m-				docs/xml/nginx/changes.xml		\[m
[31m-				docs/xml/change_log_conf.xml		\[m
[31m-				docs/xslt/changes.xslt[m
[31m-[m
[31m-	mkdir -p $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	xmllint --noout --valid docs/xml/nginx/changes.xml[m
[31m-	xsltproc --stringparam lang ru					\[m
[31m-		-o $@ docs/xslt/changes.xslt docs/xml/nginx/changes.xml[m
[31m-[m
[31m-[m
[31m-$(TEMP)/$(NGINX)/CHANGES:	docs/dtd/changes.dtd			\[m
[31m-				docs/xml/nginx/changes.xml		\[m
[31m-				docs/xml/change_log_conf.xml		\[m
[31m-				docs/xslt/changes.xslt[m
[31m-[m
[31m-	mkdir -p $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	xmllint --noout --valid docs/xml/nginx/changes.xml[m
[31m-	xsltproc --stringparam lang en					\[m
[31m-		-o $@ docs/xslt/changes.xslt docs/xml/nginx/changes.xml[m
[31m-[m
[31m-[m
[31m-docs/xslt/changes.xslt:		docs/xsls/changes.xsls[m
[31m-[m
[31m-	$(XSLS) -o $@ $<[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/dtd/change_log_conf.dtd b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/dtd/change_log_conf.dtd[m
[1mdeleted file mode 100644[m
[1mindex 40a0123..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/dtd/change_log_conf.dtd[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-<!ELEMENT configuration   (length, start, indent, changes+) >[m
[31m-[m
[31m-<!ELEMENT length          (#PCDATA) >[m
[31m-<!ELEMENT start           (#PCDATA) >[m
[31m-<!ELEMENT indent          (#PCDATA) >[m
[31m-[m
[31m-<!ELEMENT changes         (title, length,[m
[31m-                           bugfix, feature, change, workaround,[m
[31m-                           (month, month, month, month, month, month,[m
[31m-                            month, month, month, month, month, month)?) >[m
[31m-[m
[31m-<!ATTLIST changes         lang ( ru | en) #REQUIRED>[m
[31m-[m
[31m-<!ELEMENT title           (#PCDATA) >[m
[31m-[m
[31m-<!ELEMENT bugfix          (#PCDATA) >[m
[31m-<!ELEMENT feature         (#PCDATA) >[m
[31m-<!ELEMENT change          (#PCDATA) >[m
[31m-<!ELEMENT workaround      (#PCDATA) >[m
[31m-[m
[31m-<!ELEMENT month           (#PCDATA) >[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/dtd/changes.dtd b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/dtd/changes.dtd[m
[1mdeleted file mode 100644[m
[1mindex e14518a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/dtd/changes.dtd[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-<!ENTITY  nbsp         "&#xA0;" >[m
[31m-<!ENTITY  mdash        "&#xA0;- " >[m
[31m-[m
[31m-[m
[31m-<!ELEMENT change_log   (changes)* >[m
[31m-<!ATTLIST change_log   title  CDATA #REQUIRED >[m
[31m-[m
[31m-<!ELEMENT changes      (change)* >[m
[31m-<!ATTLIST changes      ver    CDATA #REQUIRED[m
[31m-                       date   CDATA #REQUIRED[m
[31m->[m
[31m-[m
[31m-<!ELEMENT change       (para)* >[m
[31m-<!ATTLIST change       type (bugfix | feature | change | security | workaround) #IMPLIED >[m
[31m-[m
[31m-<!ELEMENT para         (#PCDATA | at | br | nobr)* >[m
[31m-<!ATTLIST para         lang (ru | en) #REQUIRED >[m
[31m-[m
[31m-<!ELEMENT at           EMPTY >[m
[31m-<!ELEMENT br           EMPTY >[m
[31m-<!ELEMENT nobr         (#PCDATA) >[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/html/50x.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/html/50x.html[m
[1mdeleted file mode 100644[m
[1mindex f60f5e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/html/50x.html[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-<!DOCTYPE html>[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Error</title>[m
[31m-<style>[m
[31m-    body {[m
[31m-        width: 35em;[m
[31m-        margin: 0 auto;[m
[31m-        font-family: Tahoma, Verdana, Arial, sans-serif;[m
[31m-    }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<h1>An error occurred.</h1>[m
[31m-<p>Sorry, the page you are looking for is currently unavailable.<br/>[m
[31m-Please try again later.</p>[m
[31m-<p>If you are the system administrator of this resource then you should check[m
[31m-the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>[m
[31m-<p><em>Faithfully yours, nginx.</em></p>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/html/index.html b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/html/index.html[m
[1mdeleted file mode 100644[m
[1mindex 2ca3b95..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/html/index.html[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-<!DOCTYPE html>[m
[31m-<html>[m
[31m-<head>[m
[31m-<title>Welcome to nginx!</title>[m
[31m-<style>[m
[31m-    body {[m
[31m-        width: 35em;[m
[31m-        margin: 0 auto;[m
[31m-        font-family: Tahoma, Verdana, Arial, sans-serif;[m
[31m-    }[m
[31m-</style>[m
[31m-</head>[m
[31m-<body>[m
[31m-<h1>Welcome to nginx!</h1>[m
[31m-<p>If you see this page, the nginx web server is successfully installed and[m
[31m-working. Further configuration is required.</p>[m
[31m-[m
[31m-<p>For online documentation and support please refer to[m
[31m-<a href="http://nginx.org/">nginx.org</a>.<br/>[m
[31m-Commercial support is available at[m
[31m-<a href="http://nginx.com/">nginx.com</a>.</p>[m
[31m-[m
[31m-<p><em>Thank you for using nginx.</em></p>[m
[31m-</body>[m
[31m-</html>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/man/nginx.8 b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/man/nginx.8[m
[1mdeleted file mode 100644[m
[1mindex 1f4dc89..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/man/nginx.8[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-.\"[m
[31m-.\" Copyright (C) 2010 Sergey A. Osokin[m
[31m-.\" Copyright (C) Nginx, Inc.[m
[31m-.\" All rights reserved.[m
[31m-.\"[m
[31m-.\" Redistribution and use in source and binary forms, with or without[m
[31m-.\" modification, are permitted provided that the following conditions[m
[31m-.\" are met:[m
[31m-.\" 1. Redistributions of source code must retain the above copyright[m
[31m-.\"    notice, this list of conditions and the following disclaimer.[m
[31m-.\" 2. Redistributions in binary form must reproduce the above copyright[m
[31m-.\"    notice, this list of conditions and the following disclaimer in the[m
[31m-.\"    documentation and/or other materials provided with the distribution.[m
[31m-.\"[m
[31m-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m-.\" SUCH DAMAGE.[m
[31m-.\"[m
[31m-.\"[m
[31m-.Dd June 16, 2015[m
[31m-.Dt NGINX 8[m
[31m-.Os[m
[31m-.Sh NAME[m
[31m-.Nm nginx[m
[31m-.Nd "HTTP and reverse proxy server, mail proxy server"[m
[31m-.Sh SYNOPSIS[m
[31m-.Nm[m
[31m-.Op Fl ?hqTtVv[m
[31m-.Op Fl c Ar file[m
[31m-.Op Fl g Ar directives[m
[31m-.Op Fl p Ar prefix[m
[31m-.Op Fl s Ar signal[m
[31m-.Sh DESCRIPTION[m
[31m-.Nm[m
[31m-(pronounced[m
[31m-.Dq engine x )[m
[31m-is an HTTP and reverse proxy server, as well as a mail proxy server.[m
[31m-It is known for its high performance, stability, rich feature set, simple[m
[31m-configuration, and low resource consumption.[m
[31m-.Pp[m
[31m-The options are as follows:[m
[31m-.Bl -tag -width ".Fl d Ar directives"[m
[31m-.It Fl ?\& , h[m
[31m-Print help.[m
[31m-.It Fl c Ar file[m
[31m-Use an alternative configuration[m
[31m-.Ar file .[m
[31m-.It Fl g Ar directives[m
[31m-Set global configuration directives.[m
[31m-See[m
[31m-.Sx EXAMPLES[m
[31m-for details.[m
[31m-.It Fl p Ar prefix[m
[31m-Set the prefix path.[m
[31m-The default value is[m
[31m-.Pa %%PREFIX%% .[m
[31m-.It Fl q[m
[31m-Suppress non-error messages during configuration testing.[m
[31m-.It Fl s Ar signal[m
[31m-Send a signal to the master process.[m
[31m-The argument[m
[31m-.Ar signal[m
[31m-can be one of:[m
[31m-.Cm stop , quit , reopen , reload .[m
[31m-The following table shows the corresponding system signals:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Cm reopen" -compact[m
[31m-.It Cm stop[m
[31m-.Dv SIGTERM[m
[31m-.It Cm quit[m
[31m-.Dv SIGQUIT[m
[31m-.It Cm reopen[m
[31m-.Dv SIGUSR1[m
[31m-.It Cm reload[m
[31m-.Dv SIGHUP[m
[31m-.El[m
[31m-.It Fl t[m
[31m-Do not run, just test the configuration file.[m
[31m-.Nm[m
[31m-checks the configuration file syntax and then tries to open files[m
[31m-referenced in the configuration file.[m
[31m-.It Fl T[m
[31m-Same as[m
[31m-.Fl t ,[m
[31m-but additionally dump configuration files to standard output.[m
[31m-.It Fl V[m
[31m-Print the[m
[31m-.Nm[m
[31m-version, compiler version, and[m
[31m-.Pa configure[m
[31m-script parameters.[m
[31m-.It Fl v[m
[31m-Print the[m
[31m-.Nm[m
[31m-version.[m
[31m-.El[m
[31m-.Sh SIGNALS[m
[31m-The master process of[m
[31m-.Nm[m
[31m-can handle the following signals:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Dv SIGINT , SIGTERM" -compact[m
[31m-.It Dv SIGINT , SIGTERM[m
[31m-Shut down quickly.[m
[31m-.It Dv SIGHUP[m
[31m-Reload configuration, start the new worker process with a new[m
[31m-configuration, and gracefully shut down old worker processes.[m
[31m-.It Dv SIGQUIT[m
[31m-Shut down gracefully.[m
[31m-.It Dv SIGUSR1[m
[31m-Reopen log files.[m
[31m-.It Dv SIGUSR2[m
[31m-Upgrade the[m
[31m-.Nm[m
[31m-executable on the fly.[m
[31m-.It Dv SIGWINCH[m
[31m-Shut down worker processes gracefully.[m
[31m-.El[m
[31m-.Pp[m
[31m-While there is no need to explicitly control worker processes normally,[m
[31m-they support some signals too:[m
[31m-.Pp[m
[31m-.Bl -tag -width ".Dv SIGINT , SIGTERM" -compact[m
[31m-.It Dv SIGTERM[m
[31m-Shut down quickly.[m
[31m-.It Dv SIGQUIT[m
[31m-Shut down gracefully.[m
[31m-.It Dv SIGUSR1[m
[31m-Reopen log files.[m
[31m-.El[m
[31m-.Sh DEBUGGING LOG[m
[31m-To enable a debugging log, reconfigure[m
[31m-.Nm[m
[31m-to build with debugging:[m
[31m-.Pp[m
[31m-.Dl "./configure --with-debug ..."[m
[31m-.Pp[m
[31m-and then set the[m
[31m-.Cm debug[m
[31m-level of the[m
[31m-.Va error_log :[m
[31m-.Pp[m
[31m-.Dl "error_log /path/to/log debug;"[m
[31m-.Pp[m
[31m-It is also possible to enable the debugging for a particular IP address:[m
[31m-.Bd -literal -offset indent[m
[31m-events {[m
[31m-	debug_connection 127.0.0.1;[m
[31m-}[m
[31m-.Ed[m
[31m-.Sh ENVIRONMENT[m
[31m-The[m
[31m-.Ev NGINX[m
[31m-environment variable is used internally by[m
[31m-.Nm[m
[31m-and should not be set directly by the user.[m
[31m-.Sh FILES[m
[31m-.Bl -tag -width indent[m
[31m-.It Pa %%PID_PATH%%[m
[31m-Contains the process ID of[m
[31m-.Nm .[m
[31m-The contents of this file are not sensitive, so it can be world-readable.[m
[31m-.It Pa %%CONF_PATH%%[m
[31m-The main configuration file.[m
[31m-.It Pa %%ERROR_LOG_PATH%%[m
[31m-Error log file.[m
[31m-.El[m
[31m-.Sh EXIT STATUS[m
[31m-Exit status is 0 on success, or 1 if the command fails.[m
[31m-.Sh EXAMPLES[m
[31m-Test configuration file[m
[31m-.Pa ~/mynginx.conf[m
[31m-with global directives for PID and quantity of worker processes:[m
[31m-.Bd -literal -offset indent[m
[31m-nginx -t -c ~/mynginx.conf \e[m
[31m-	-g "pid /var/run/mynginx.pid; worker_processes 2;"[m
[31m-.Ed[m
[31m-.Sh SEE ALSO[m
[31m-.\"Xr nginx.conf 5[m
[31m-.\"Pp[m
[31m-Documentation at[m
[31m-.Pa http://nginx.org/en/docs/ .[m
[31m-.Pp[m
[31m-For questions and technical support, please refer to[m
[31m-.Pa http://nginx.org/en/support.html .[m
[31m-.Sh HISTORY[m
[31m-Development of[m
[31m-.Nm[m
[31m-started in 2002, with the first public release on October 4, 2004.[m
[31m-.Sh AUTHORS[m
[31m-.An -nosplit[m
[31m-.An Igor Sysoev Aq igor@sysoev.ru .[m
[31m-.Pp[m
[31m-This manual page was originally written by[m
[31m-.An Sergey A. Osokin Aq osa@FreeBSD.org.ru[m
[31m-as a result of compiling many[m
[31m-.Nm[m
[31m-documents from all over the world.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/text/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/text/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 1d3d15c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/text/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-/* [m
[31m- * Copyright (C) 2002-2016 Igor Sysoev[m
[31m- * Copyright (C) 2011-2016 Nginx, Inc.[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xml/change_log_conf.xml b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xml/change_log_conf.xml[m
[1mdeleted file mode 100644[m
[1mindex c03dc34..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xml/change_log_conf.xml[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-<?xml version="1.0" ?>[m
[31m-<!DOCTYPE configuration SYSTEM "../dtd/change_log_conf.dtd" >[m
[31m-[m
[31m-<configuration>[m
[31m-[m
[31m-<length>76</length>[m
[31m-[m
[31m-<start>    *) </start>[m
[31m-<indent>       </indent>[m
[31m-[m
[31m-<changes lang="ru">[m
[31m-    <title>Изменения в </title>[m
[31m-    <length>66</length>[m
[31m-[m
[31m-    <bugfix>Исправление</bugfix>[m
[31m-    <feature>Добавление</feature>[m
[31m-    <change>Изменение</change>[m
[31m-    <security>Безопасность</security>[m
[31m-    <workaround>Изменение</workaround>[m
[31m-</changes>[m
[31m-[m
[31m-<changes lang="en">[m
[31m-    <title>Changes with </title>[m
[31m-    <length>65</length>[m
[31m-[m
[31m-    <bugfix>Bugfix</bugfix>[m
[31m-    <feature>Feature</feature>[m
[31m-    <change>Change</change>[m
[31m-    <security>Security</security>[m
[31m-    <workaround>Workaround</workaround>[m
[31m-[m
[31m-    <month> Jan </month>[m
[31m-    <month> Feb </month>[m
[31m-    <month> Mar </month>[m
[31m-    <month> Apr </month>[m
[31m-    <month> May </month>[m
[31m-    <month> Jun </month>[m
[31m-    <month> Jul </month>[m
[31m-    <month> Aug </month>[m
[31m-    <month> Sep </month>[m
[31m-    <month> Oct </month>[m
[31m-    <month> Nov </month>[m
[31m-    <month> Dec </month>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-</configuration>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xml/nginx/changes.xml b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xml/nginx/changes.xml[m
[1mdeleted file mode 100644[m
[1mindex 5f40bbc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xml/nginx/changes.xml[m
[1m+++ /dev/null[m
[36m@@ -1,24362 +0,0 @@[m
[31m-<?xml version="1.0" ?>[m
[31m-<!DOCTYPE change_log SYSTEM "../../dtd/changes.dtd" >[m
[31m-[m
[31m-[m
[31m-<change_log title="nginx">[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.15" date="19.04.2016">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HHVM в качестве FastCGI-сервера[m
[31m-могли возникать ошибки "recv() failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"recv() failed" errors might occur[m
[31m-when using HHVM as a FastCGI server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2 и директив limit_req или auth_request[m
[31m-при чтении тела запроса мог произойти таймаут[m
[31m-или ошибка "client violated flow control";[m
[31m-ошибка появилась в 1.9.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-when using HTTP/2 and the "limit_req" or "auth_request" directives[m
[31m-a timeout or a "client violated flow control" error[m
[31m-might occur while reading client request body;[m
[31m-the bug had appeared in 1.9.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2 ответ мог не показываться некоторыми браузерами,[m
[31m-если тело запроса было прочитано не целиком;[m
[31m-ошибка появилась в 1.9.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a response might not be shown by some browsers[m
[31m-if HTTP/2 was used and client request body was not fully read;[m
[31m-the bug had appeared in 1.9.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "aio threads" соединения могли зависать.<br/>[m
[31m-Спасибо Mindaugas Rasiukevicius.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections might hang when using the "aio threads" directive.<br/>[m
[31m-Thanks to Mindaugas Rasiukevicius.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.14" date="05.04.2016">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL 1.1.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL 1.1.0 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_request_buffering, fastcgi_request_buffering,[m
[31m-scgi_request_buffering и uwsgi_request_buffering[m
[31m-теперь работают при использовании HTTP/2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_request_buffering", "fastcgi_request_buffering",[m
[31m-"scgi_request_buffering", and "uwsgi_request_buffering" directives[m
[31m-now work with HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-в логах могли появляться сообщения "zero size buf in output".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"zero size buf in output" alerts might appear in logs[m
[31m-when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-директива client_max_body_size могла работать неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "client_max_body_size" directive might work incorrectly[m
[31m-when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-незначительных ошибок логгирования.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of minor bugs in logging.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.13" date="29.03.2016">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-неидемпотентные запросы (POST, LOCK, PATCH)[m
[31m-теперь по умолчанию не передаются на другой сервер,[m
[31m-если запрос уже был отправлен на бэкенд;[m
[31m-параметр non_idempotent директивы proxy_next_upstream[m
[31m-явно разрешает повторять такие запросы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-non-idempotent requests (POST, LOCK, PATCH)[m
[31m-are no longer passed to the next server by default[m
[31m-if a request has been sent to a backend;[m
[31m-the "non_idempotent" parameter of the "proxy_next_upstream" directive[m
[31m-explicitly allows retrying such requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module теперь можно собрать динамически.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module can be built dynamically.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка UDP в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-UDP support in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива aio_write.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "aio_write" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь cache manager следит за количеством элементов в кэше[m
[31m-и старается не допускать переполнений зоны разделяемой памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now cache manager monitors number of elements in caches[m
[31m-and tries to avoid cache keys zone overflows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив sendfile и aio с подзапросами[m
[31m-в логах могли появляться сообщения "task already active" и "second aio post".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-[m
[31m-"task already active" and "second aio post" alerts might appear in logs[m
[31m-when using the "sendfile" and "aio" directives with subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования[m
[31m-в логах могли появляться сообщения "zero size buf in output",[m
[31m-если клиент закрывал соединение преждевременно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"zero size buf in output" alerts might appear in logs[m
[31m-if caching was used[m
[31m-and a client closed a connection prematurely.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования[m
[31m-соединения с клиентами могли закрываться без необходимости.<br/>[m
[31m-Спасибо Justin Li.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections with clients might be closed needlessly[m
[31m-if caching was used.<br/>[m
[31m-Thanks to Justin Li.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог нагружать процессор[m
[31m-при использовании директивы sendfile на Linux и Solaris,[m
[31m-если отправляемый файл был изменён в процессе отправки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might hog CPU[m
[31m-if the "sendfile" directive was used on Linux or Solaris[m
[31m-and a file being sent was changed during sending.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив sendfile и "aio threads"[m
[31m-соединения могли зависать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections might hang[m
[31m-when using the "sendfile" and "aio threads" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах proxy_pass, fastcgi_pass, scgi_pass и uwsgi_pass[m
[31m-при использовании переменных.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_pass", "fastcgi_pass", "scgi_pass", and "uwsgi_pass" directives[m
[31m-when using variables.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в закэшированном соединении к бэкенду происходила ошибка,[m
[31m-запрос передавался на другой сервер[m
[31m-без учёта директивы proxy_next_upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if an error occurred in a cached backend connection,[m
[31m-the request was passed to the next server[m
[31m-regardless of the proxy_next_upstream directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "CreateFile() failed" при создании временных файлов на Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"CreateFile() failed" errors when creating temporary files on Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.12" date="24.02.2016">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-кодирование Хаффмана заголовков ответов в HTTP/2.<br/>[m
[31m-Спасибо Владу Краснову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Huffman encoding of response headers in HTTP/2.<br/>[m
[31m-Thanks to Vlad Krasnov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_cpu_affinity теперь поддерживает более 64 процессоров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_cpu_affinity" directive now supports more than 64 CPUs.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость со сторонними модулями на C++;[m
[31m-ошибка появилась в 1.9.11.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with 3rd party C++ modules;[m
[31m-the bug had appeared in 1.9.11.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался статически с OpenSSL на Linux;[m
[31m-ошибка появилась в 1.9.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built statically with OpenSSL on Linux;[m
[31m-the bug had appeared in 1.9.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "add_header ... always" с пустым значением[m
[31m-не удаляла из заголовков ошибочных ответов[m
[31m-строки Last-Modified и ETag.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header ... always" directive with an empty value[m
[31m-did not delete "Last-Modified" and "ETag" header lines[m
[31m-from error responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-при использовании OpenSSL 1.0.2f в логах могли появляться[m
[31m-сообщения "called a function you should not call" и[m
[31m-"shutdown while in init".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"called a function you should not call"[m
[31m-and "shutdown while in init" messages might appear in logs[m
[31m-when using OpenSSL 1.0.2f.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибочные заголовки могли логгироваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-invalid headers might be logged incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов при использовании HTTP/2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_v2_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_v2_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.11" date="09.02.2016">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь resolver поддерживает TCP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-TCP support in resolver.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-динамические модули.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-dynamic modules.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-переменная $request_length не учитывала размер заголовков запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_length variable did not include size of request headers[m
[31m-when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_v2_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_v2_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.10" date="26.01.2016">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы resolver[m
[31m-во время обработки ответов DNS-сервера[m
[31m-могло происходить разыменование некорректного адреса,[m
[31m-что позволяло атакующему,[m
[31m-имеющему возможность подделывать UDP-пакеты от DNS-сервера,[m
[31m-вызвать segmentation fault в рабочем процессе (CVE-2016-0742).[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-invalid pointer dereference might occur[m
[31m-during DNS server response processing[m
[31m-if the "resolver" directive was used,[m
[31m-allowing an attacker who is able to forge UDP packets from the DNS server[m
[31m-to cause segmentation fault in a worker process (CVE-2016-0742).[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы resolver[m
[31m-во время обработки CNAME-записей[m
[31m-могло произойти обращение к ранее освобождённой памяти,[m
[31m-что позволяло атакующему,[m
[31m-имеющему возможность инициировать преобразование произвольных имён в адреса,[m
[31m-вызвать segmentation fault в рабочем процессе,[m
[31m-а также потенциально могло иметь другие последствия (CVE-2016-0746).[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-use-after-free condition might occur[m
[31m-during CNAME response processing[m
[31m-if the "resolver" directive was used,[m
[31m-allowing an attacker who is able to trigger name resolution[m
[31m-to cause segmentation fault in a worker process,[m
[31m-or might have potential other impact (CVE-2016-0746).[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы resolver[m
[31m-во время обработки CNAME-записей[m
[31m-не во всех случаях проверялось ограничение[m
[31m-на максимальное количество записей в цепочке,[m
[31m-что позволяло атакующему,[m
[31m-имеющему возможность инициировать преобразование произвольных имён в адреса,[m
[31m-вызвать чрезмерное потребление ресурсов рабочими процессами (CVE-2016-0747).[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-CNAME resolution was insufficiently limited[m
[31m-if the "resolver" directive was used,[m
[31m-allowing an attacker who is able to trigger arbitrary name resolution[m
[31m-to cause excessive resource consumption in worker processes (CVE-2016-0747).[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр auto директивы worker_cpu_affinity.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auto" parameter of the "worker_cpu_affinity" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр proxy_protocol директивы listen не работал[m
[31m-с IPv6 listen-сокетами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_protocol" parameter of the "listen" directive did not work[m
[31m-with IPv6 listen sockets.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы keepalive[m
[31m-соединения к бэкендам могли кэшироваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections to upstream servers might be cached incorrectly[m
[31m-when using the "keepalive" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с помощью X-Accel-Redirect[m
[31m-при проксировании использовался HTTP-метод оригинального запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxying used the HTTP method of the original request[m
[31m-after an "X-Accel-Redirect" redirection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.9" date="09.12.2015">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-проксирование в unix domain сокеты не работало при использовании переменных;[m
[31m-ошибка появилась в 1.9.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxying to unix domain sockets did not work when using variables;[m
[31m-the bug had appeared in 1.9.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.8" date="08.12.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка pwritev().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-pwritev() support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива include в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "include" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_slice_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_slice_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании LibreSSL[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 1.9.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when using LibreSSL;[m
[31m-the bug had appeared in 1.9.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не собираться на OS X.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OS X in some cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.7" date="17.11.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр nohostname логгирования в syslog.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "nohostname" parameter of logging to syslog.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_cache_convert_head.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_convert_head" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $realip_remote_addr в модуле ngx_http_realip_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $realip_remote_addr variable in the ngx_http_realip_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива expires могла не срабатывать при использовании переменных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive might not work when using variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 1.9.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when using HTTP/2;[m
[31m-the bug had appeared in 1.9.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_v2_module,[m
[31m-протокол HTTP/2 мог быть использован клиентом,[m
[31m-даже если не был указан параметр http2 директивы listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with the ngx_http_v2_module[m
[31m-it was possible to use the HTTP/2 protocol[m
[31m-even if the "http2" parameter of the "listen" directive was not specified.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_v2_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_v2_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.6" date="27.10.2015">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Piotr Sikora и Denis Andzakovic.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when using HTTP/2.<br/>[m
[31m-Thanks to Piotr Sikora and Denis Andzakovic.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP/2 переменная $server_protocol была пустой.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $server_protocol variable was empty when using HTTP/2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL-соединения к бэкендам в модуле stream[m
[31m-могли неожиданно завершаться по таймауту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-backend SSL connections in the stream module[m
[31m-might be timed out unexpectedly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании различных настроек ssl_session_cache[m
[31m-в разных виртуальных серверах[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if different ssl_session_cache settings were used[m
[31m-in different virtual servers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не собирался с MinGW gcc;[m
[31m-ошибка появилась в 1.9.4.<br/>[m
[31m-Спасибо Kouhei Sutou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not be built with MinGW gcc;[m
[31m-the bug had appeared in 1.9.4.<br/>[m
[31m-Thanks to Kouhei Sutou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы timer_resolution на Windows время не обновлялось.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-time was not updated when the timer_resolution directive was used on Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Незначительные исправления и улучшения.<br/>[m
[31m-Спасибо Markus Linnala, Kurtis Nusbaum и Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Miscellaneous minor fixes and improvements.<br/>[m
[31m-Thanks to Markus Linnala, Kurtis Nusbaum and Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.5" date="22.09.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_v2_module (заменяет модуль ngx_http_spdy_module).<br/>[m
[31m-Спасибо Dropbox и Automattic за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_v2_module (replaces ngx_http_spdy_module).<br/>[m
[31m-Thanks to Dropbox and Automattic for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию директива output_buffers использует два буфера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "output_buffers" directive uses two buffers by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx ограничивает максимальную вложенность подзапросов,[m
[31m-а не количество одновременных подзапросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx limits subrequests recursion,[m
[31m-not simultaneous subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при возврате ответов из кэша nginx проверяет ключ полностью.<br/>[m
[31m-Спасибо Геннадию Махомеду и Сергею Брестеру.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx checks the whole cache key when returning a response from cache.<br/>[m
[31m-Thanks to Gena Makhomed and Sergey Brester.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэша[m
[31m-в логах могли появляться сообщения "header already sent";[m
[31m-ошибка появилась в 1.7.5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"header already sent" alerts might appear in logs[m
[31m-when using cache;[m
[31m-the bug had appeared in 1.7.5.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании CephFS и директивы timer_resolution на Linux[m
[31m-в логах могли появляться сообщения[m
[31m-"writev() failed (4: Interrupted system call)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"writev() failed (4: Interrupted system call)"[m
[31m-errors might appear in logs[m
[31m-when using CephFS and the "timer_resolution" directive on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок конфигурации.<br/>[m
[31m-Спасибо Markus Linnala.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in invalid configurations handling.<br/>[m
[31m-Thanks to Markus Linnala.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы sub_filter на уровне http[m
[31m-в рабочем процессе происходил segmentation fault;[m
[31m-ошибка появилась в 1.9.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process[m
[31m-if the "sub_filter" directive was used at http level;[m
[31m-the bug had appeared in 1.9.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.4" date="18.08.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_downstream_buffer и proxy_upstream_buffer в модуле stream[m
[31m-заменены директивой proxy_buffer_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_downstream_buffer" and "proxy_upstream_buffer" directives[m
[31m-of the stream module are replaced with the "proxy_buffer_size" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива tcp_nodelay в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "tcp_nodelay" directive in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно указать несколько директив sub_filter одновременно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-multiple "sub_filter" directives can be used simultaneously.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива sub_filter поддерживает переменные в строке поиска.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the search string of the "sub_filter" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-тестирование конфигурации могло не работать под Linux OpenVZ.<br/>[m
[31m-Спасибо Геннадию Махомеду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-configuration testing might fail under Linux OpenVZ.<br/>[m
[31m-Thanks to Gena Makhomed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после переконфигурации старые рабочие процессы могли сильно нагружать процессор[m
[31m-при больших значениях worker_connections.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-old worker processes might hog CPU after reconfiguration[m
[31m-with a large number of worker_connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при совместном использовании директив try_files и alias[m
[31m-внутри location'а, заданного регулярным выражением,[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 1.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "try_files" and "alias" directives were used[m
[31m-inside a location given by a regular expression;[m
[31m-the bug had appeared in 1.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files внутри вложенного location'а, заданного регулярным[m
[31m-выражением, работала неправильно, если во внешнем location'е использовалась[m
[31m-директива alias.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive inside a nested location[m
[31m-given by a regular expression worked incorrectly[m
[31m-if the "alias" directive was used in the outer location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при построении хэш-таблиц.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in hash table initialization error handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с Visual Studio 2015.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with Visual Studio 2015.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.3" date="14.07.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-дублирующиеся блоки http, mail и stream теперь запрещены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-duplicate "http", "mail", and "stream" blocks are now disallowed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ограничение количества соединений в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connection limiting in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ограничение скорости в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-data rate limiting in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива zone в блоке upstream не работала на Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "zone" directive inside the "upstream" block did not work on Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с LibreSSL в модуле stream.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with LibreSSL in the stream module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в параметре --builddir в configure.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "--builddir" configure parameter.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ssl_stapling_file не работала;[m
[31m-ошибка появилась в 1.9.2.<br/>[m
[31m-Спасибо Faidon Liambotis и Brandon Black.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_stapling_file" directive did not work;[m
[31m-the bug had appeared in 1.9.2.<br/>[m
[31m-Thanks to Faidon Liambotis and Brandon Black.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы ssl_stapling[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 1.9.2.<br/>[m
[31m-Спасибо Matthew Baldwin.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "ssl_stapling" directive was used;[m
[31m-the bug had appeared in 1.9.2.<br/>[m
[31m-Thanks to Matthew Baldwin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.2" date="16.06.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр backlog директивы listen[m
[31m-в почтовом прокси-сервере и модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "backlog" parameter of the "listen" directives[m
[31m-of the mail proxy and stream modules.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы allow и deny в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "allow" and "deny" directives in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_bind в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_bind" directive in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_protocol в модуле stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_protocol" directive in the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -T.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -T switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр REQUEST_SCHEME добавлен в стандартные конфигурационные файлы[m
[31m-fastcgi.conf, fastcgi_params, scgi_params и uwsgi_params.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the REQUEST_SCHEME parameter added to the fastcgi.conf, fastcgi_params,[m
[31m-scgi_params, and uwsgi_params standard configuration files.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр reuseport директивы listen в модуле stream[m
[31m-не работал.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "reuseport" parameter of the "listen" directive of the stream module[m
[31m-did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-OCSP stapling в некоторых случаях мог вернуть устаревший OCSP-ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OCSP stapling might return an expired OCSP response in some cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.1" date="26.05.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь протокол SSLv3 по умолчанию запрещён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now SSLv3 protocol is disabled by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-некоторые давно устаревшие директивы больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some long deprecated directives are not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр reuseport директивы listen.<br/>[m
[31m-Спасибо Yingqi Lu из Intel и Sepherosa Ziehau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "reuseport" parameter of the "listen" directive.<br/>[m
[31m-Thanks to Yingqi Lu at Intel and Sepherosa Ziehau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_connect_time.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_connect_time variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве hash на big-endian платформах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "hash" directive on big-endian platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не запускаться на некоторых старых версиях Linux;[m
[31m-ошибка появилась в 1.7.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might fail to start on some old Linux variants;[m
[31m-the bug had appeared in 1.7.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в парсинге IP-адресов.<br/>[m
[31m-Спасибо Сергею Половко.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in IP address parsing.<br/>[m
[31m-Thanks to Sergey Polovko.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.9.0" date="28.04.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-устаревшие методы обработки соединений aio и rtsig больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-obsolete aio and rtsig event methods have been removed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива zone в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "zone" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль stream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the stream module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка byte ranges для ответов модуля ngx_http_memcached_module.<br/>[m
[31m-Спасибо Martin Mlynář.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-byte ranges support in the ngx_http_memcached_module.<br/>[m
[31m-Thanks to Martin Mlynář.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-разделяемую память теперь можно использовать на версиях Windows[m
[31m-с рандомизацией адресного пространства.<br/>[m
[31m-Спасибо Сергею Брестеру.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-shared memory can now be used on Windows versions[m
[31m-with address space layout randomization.<br/>[m
[31m-Thanks to Sergey Brester.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву error_log теперь можно использовать[m
[31m-на уровнях mail и server в почтовом прокси-сервере.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_log" directive can now be used[m
[31m-on mail and server levels in mail proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр proxy_protocol директивы listen не работал,[m
[31m-если не был указан в первой директиве listen для данного listen-сокета.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_protocol" parameter of the "listen" directive did not work[m
[31m-if not specified in the first "listen" directive for a listen socket.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.12" date="07.04.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива tcp_nodelay работает для SSL-соединений с бэкендами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "tcp_nodelay" directive works with backend SSL connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь потоки могут использоваться для чтения заголовков файлов в кэше.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now thread pools can be used to read cache file headers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_request_buffering.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_request_buffering" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании потоков на Linux[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when using thread pools on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при использовании директивы ssl_stapling.<br/>[m
[31m-Спасибо Filipe da Silva.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling when using the "ssl_stapling" directive.<br/>[m
[31m-Thanks to Filipe da Silva.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.11" date="24.03.2015">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр sendfile директивы aio более не нужен;[m
[31m-теперь nginx автоматически использует AIO для подгрузки данных для sendfile,[m
[31m-если одновременно используются директивы aio и sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile" parameter of the "aio" directive is deprecated;[m
[31m-now nginx automatically uses AIO to pre-load data for sendfile[m
[31m-if both "aio" and "sendfile" directives are used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-экспериментальная поддержка потоков.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-experimental thread pools support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_request_buffering, fastcgi_request_buffering,[m
[31m-scgi_request_buffering и uwsgi_request_buffering.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_request_buffering", "fastcgi_request_buffering",[m
[31m-"scgi_request_buffering", and "uwsgi_request_buffering" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-экспериментальное API для обработки тела запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-request body filters experimental API.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-проверка клиентских SSL-сертификатов в почтовом прокси-сервере.<br/>[m
[31m-Спасибо Sven Peter, Franck Levionnois и Filipe Da Silva.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-client SSL certificates support in mail proxy.<br/>[m
[31m-Thanks to Sven Peter, Franck Levionnois, and Filipe Da Silva.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение времени запуска[m
[31m-при использовании директивы "hash ... consistent" в блоке upstream.<br/>[m
[31m-Спасибо Wai Keen Woon.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-startup speedup[m
[31m-when using the "hash ... consistent" directive in the upstream block.<br/>[m
[31m-Thanks to Wai Keen Woon.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-отладочное логгирование в кольцевой буфер в памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-debug logging into a cyclic memory buffer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке хэш-таблиц.<br/>[m
[31m-Спасибо Chris West.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in hash table handling.<br/>[m
[31m-Thanks to Chris West.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_cache_revalidate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_cache_revalidate" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL-соединения могли зависать, если использовался отложенный accept[m
[31m-или параметр proxy_protocol директивы listen.<br/>[m
[31m-Спасибо James Hamlin.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL connections might hang if deferred accept[m
[31m-or the "proxy_protocol" parameter of the "listen" directive were used.<br/>[m
[31m-Thanks to James Hamlin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_time могла содержать неверное значение[m
[31m-при использовании директивы image_filter.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_time variable might contain a wrong value[m
[31m-if the "image_filter" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке целочисленных переполнений.<br/>[m
[31m-Спасибо Régis Leroy.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in integer overflow handling.<br/>[m
[31m-Thanks to Régis Leroy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании LibreSSL было невозможно включить поддержку SSLv3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it was not possible to enable SSLv3 with LibreSSL.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании LibreSSL в логах появлялись сообщения[m
[31m-"ignoring stale global SSL error ... called a function you should not call".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ignoring stale global SSL error ... called a function you should not call"[m
[31m-alerts appeared in logs when using LibreSSL.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сертификаты, указанные в директивах ssl_client_certificate и[m
[31m-ssl_trusted_certificate, использовались[m
[31m-для автоматического построения цепочек сертификатов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-certificates specified by the "ssl_client_certificate" and[m
[31m-"ssl_trusted_certificate" directives were inadvertently used[m
[31m-to automatically construct certificate chains.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.10" date="10.02.2015">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр use_temp_path директив proxy_cache_path, fastcgi_cache_path,[m
[31m-scgi_cache_path и uwsgi_cache_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "use_temp_path" parameter of the "proxy_cache_path", "fastcgi_cache_path",[m
[31m-"scgi_cache_path", and "uwsgi_cache_path" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_header_time.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_header_time variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-теперь при переполнении диска nginx пытается писать error_log'и только[m
[31m-раз в секунду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on disk overflow nginx tries to write error logs once a second only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files при тестировании каталогов[m
[31m-не игнорировала обычные файлы.<br/>[m
[31m-Спасибо Damien Tournoud.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive did not ignore normal files[m
[31m-while testing directories.<br/>[m
[31m-Thanks to Damien Tournoud.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы sendfile на OS X[m
[31m-возникали ошибки "sendfile() failed";[m
[31m-ошибка появилась в nginx 1.7.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "sendfile() failed"[m
[31m-if the "sendfile" directive was used on OS X;[m
[31m-the bug had appeared in 1.7.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в лог могли писаться сообщения "sem_post() failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "sem_post() failed" might appear in logs.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с musl libc.<br/>[m
[31m-Спасибо James Taylor.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with musl libc.<br/>[m
[31m-Thanks to James Taylor.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Tru64 UNIX.<br/>[m
[31m-Спасибо Goetz T. Fischer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Tru64 UNIX.<br/>[m
[31m-Thanks to Goetz T. Fischer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.9" date="23.12.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache, fastcgi_cache, scgi_cache и uwsgi_cache[m
[31m-поддерживают переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "proxy_cache", "fastcgi_cache", "scgi_cache",[m
[31m-and "uwsgi_cache" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива expires поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "expires" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-возможность загрузки секретных ключей с аппаратных устройств[m
[31m-с помощью OpenSSL engines.<br/>[m
[31m-Спасибо Дмитрию Пичулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-loading of secret keys from hardware tokens[m
[31m-with OpenSSL engines.<br/>[m
[31m-Thanks to Dmitrii Pichulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива autoindex_format.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "autoindex_format" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ревалидация элементов кэша теперь используется только для ответов[m
[31m-с кодами 200 и 206.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache revalidation is now only used for responses[m
[31m-with 200 and 206 status codes.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строка "TE" заголовка запроса клиента передавалась на бэкенд при проксировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "TE" client request header line was passed to backends while proxying.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass, fastcgi_pass, scgi_pass и uwsgi_pass[m
[31m-могли неправильно работать внутри блоков if и limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass", "fastcgi_pass", "scgi_pass", and "uwsgi_pass" directives[m
[31m-might not work correctly inside the "if" and "limit_except" blocks.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_store с параметром "on" игнорировалась,[m
[31m-если на предыдущем уровне использовалась директива proxy_store[m
[31m-с явно заданным путём к файлам.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store" directive with the "on" parameter was ignored[m
[31m-if the "proxy_store" directive with an explicitly specified file path[m
[31m-was used on a previous level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с BoringSSL.<br/>[m
[31m-Спасибо Lukas Tribus.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with BoringSSL.<br/>[m
[31m-Thanks to Lukas Tribus.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.8" date="02.12.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь строки "If-Modified-Since", "If-Range" и им подобные[m
[31m-в заголовке запроса клиента передаются бэкенду при включённом кэшировании,[m
[31m-если nginx заранее знает, что не будет кэшировать ответ[m
[31m-(например, при использовании proxy_cache_min_uses).[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "If-Modified-Since", "If-Range", etc.[m
[31m-client request header lines are passed to a backend while caching[m
[31m-if nginx knows in advance that the response will not be cached[m
[31m-(e.g., when using proxy_cache_min_uses).[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь после истечения proxy_cache_lock_timeout[m
[31m-nginx отправляет запрос на бэкенд без кэширования;[m
[31m-новые директивы proxy_cache_lock_age, fastcgi_cache_lock_age,[m
[31m-scgi_cache_lock_age и uwsgi_cache_lock_age позволяют указать,[m
[31m-через какое время блокировка будет принудительно снята[m
[31m-и будет сделана ещё одна попытка закэшировать ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now after proxy_cache_lock_timeout[m
[31m-nginx sends a request to a backend with caching disabled;[m
[31m-the new directives "proxy_cache_lock_age", "fastcgi_cache_lock_age",[m
[31m-"scgi_cache_lock_age", and "uwsgi_cache_lock_age" specify a time[m
[31m-after which the lock will be released[m
[31m-and another attempt to cache a response will be made.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива log_format теперь может использоваться только на уровне http.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_format" directive can now be used only at http level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ssl_certificate, proxy_ssl_certificate_key,[m
[31m-proxy_ssl_password_file, uwsgi_ssl_certificate,[m
[31m-uwsgi_ssl_certificate_key и uwsgi_ssl_password_file.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ssl_certificate", "proxy_ssl_certificate_key",[m
[31m-"proxy_ssl_password_file", "uwsgi_ssl_certificate",[m
[31m-"uwsgi_ssl_certificate_key", and "uwsgi_ssl_password_file" directives.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь с помощью X-Accel-Redirect[m
[31m-можно перейти в именованный location.<br/>[m
[31m-Спасибо Toshikuni Fukaya.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it is now possible to switch to a named location[m
[31m-using "X-Accel-Redirect".<br/>[m
[31m-Thanks to Toshikuni Fukaya.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива tcp_nodelay работает для SPDY-соединений.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "tcp_nodelay" directive works with SPDY connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новые директивы в скриптах подсветки синтаксиса для vim.<br/>[m
[31m-Спасибо Peter Wu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-new directives in vim syntax highliting scripts.<br/>[m
[31m-Thanks to Peter Wu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx игнорировал значение "s-maxage"[m
[31m-в строке "Cache-Control" в заголовке ответа бэкенда.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx ignored the "s-maxage" value[m
[31m-in the "Cache-Control" backend response header line.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве ssl_password_file[m
[31m-при использовании OpenSSL 0.9.8zc, 1.0.0o, 1.0.1j.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "ssl_password_file" directive[m
[31m-when using OpenSSL 0.9.8zc, 1.0.0o, 1.0.1j.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы post_action[m
[31m-в лог писались сообщения "header already sent";[m
[31m-ошибка появилась в nginx 1.5.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "header already sent" appeared in logs[m
[31m-if the "post_action" directive was used;[m
[31m-the bug had appeared in 1.5.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "postpone_output 0" с SSI-подзапросами[m
[31m-в лог могли писаться сообщения "the http output chain is empty".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "the http output chain is empty" might appear in logs[m
[31m-if the "postpone_output 0" directive was used with SSI includes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_cache_lock при использовании SSI-подзапросов.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_cache_lock" directive with SSI subrequests.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.7" date="28.10.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx учитывает при кэшировании строку "Vary"[m
[31m-в заголовке ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx takes into account the "Vary"[m
[31m-header line in a backend response while caching.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_force_ranges, fastcgi_force_ranges,[m
[31m-scgi_force_ranges и uwsgi_force_ranges.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_force_ranges", "fastcgi_force_ranges",[m
[31m-"scgi_force_ranges", and "uwsgi_force_ranges" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_limit_rate, fastcgi_limit_rate,[m
[31m-scgi_limit_rate и uwsgi_limit_rate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_limit_rate", "fastcgi_limit_rate",[m
[31m-"scgi_limit_rate", and "uwsgi_limit_rate" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр Vary директив proxy_ignore_headers, fastcgi_ignore_headers,[m
[31m-scgi_ignore_headers и uwsgi_ignore_headers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Vary" parameter of the "proxy_ignore_headers", "fastcgi_ignore_headers",[m
[31m-"scgi_ignore_headers", and "uwsgi_ignore_headers" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-последняя часть ответа, полученного от бэкенда[m
[31m-при небуферизированном проксировании,[m
[31m-могла не отправляться клиенту,[m
[31m-если использовались директивы gzip или gunzip.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the last part of a response received from a backend[m
[31m-with unbufferred proxy[m
[31m-might not be sent to a client[m
[31m-if "gzip" or "gunzip" directives were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_cache_revalidate.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_cache_revalidate" directive.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок.<br/>[m
[31m-Спасибо Yichun Zhang и Даниилу Бондареву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling.<br/>[m
[31m-Thanks to Yichun Zhang and Daniil Bondarev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах[m
[31m-proxy_next_upstream_tries и proxy_next_upstream_timeout.<br/>[m
[31m-Спасибо Feng Gu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_next_upstream_tries" and "proxy_next_upstream_timeout"[m
[31m-directives.<br/>[m
[31m-Thanks to Feng Gu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не собирался с MinGW-w64 gcc.<br/>[m
[31m-Спасибо Kouhei Sutou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not be built with MinGW-w64 gcc.<br/>[m
[31m-Thanks to Kouhei Sutou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.6" date="30.09.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-устаревшая директива limit_zone больше не поддерживается.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the deprecated "limit_zone" directive is not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в директивах limit_conn_zone и limit_req_zone теперь можно использовать[m
[31m-комбинации нескольких переменных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_conn_zone" and "limit_req_zone" directives now can be used[m
[31m-with combinations of multiple variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при повторной отправке FastCGI-запроса на бэкенд[m
[31m-тело запроса могло передаваться неправильно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-request body might be transmitted incorrectly[m
[31m-when retrying a FastCGI request to the next upstream server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в логгировании в syslog.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in logging to syslog.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.5" date="16.09.2014">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании общего для нескольких блоков server[m
[31m-разделяемого кэша SSL-сессий или общего ключа для шифрования[m
[31m-TLS session tickets было возможно повторно использовать[m
[31m-SSL-сессию в контексте другого блока server (CVE-2014-3616).<br/>[m
[31m-Спасибо Antoine Delignat-Lavaud.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it was possible to reuse SSL sessions in unrelated contexts[m
[31m-if a shared SSL session cache or the same TLS session ticket key[m
[31m-was used for multiple "server" blocks (CVE-2014-3616).<br/>[m
[31m-Thanks to Antoine Delignat-Lavaud.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директиву stub_status теперь можно указывать без параметров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "stub_status" directive does not require a parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр always директивы add_header.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "always" parameter of the "add_header" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы[m
[31m-proxy_next_upstream_tries, proxy_next_upstream_timeout,[m
[31m-fastcgi_next_upstream_tries, fastcgi_next_upstream_timeout,[m
[31m-memcached_next_upstream_tries, memcached_next_upstream_timeout,[m
[31m-scgi_next_upstream_tries, scgi_next_upstream_timeout,[m
[31m-uwsgi_next_upstream_tries и uwsgi_next_upstream_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the[m
[31m-"proxy_next_upstream_tries", "proxy_next_upstream_timeout",[m
[31m-"fastcgi_next_upstream_tries", "fastcgi_next_upstream_timeout",[m
[31m-"memcached_next_upstream_tries", "memcached_next_upstream_timeout",[m
[31m-"scgi_next_upstream_tries", "scgi_next_upstream_timeout",[m
[31m-"uwsgi_next_upstream_tries", and "uwsgi_next_upstream_timeout"[m
[31m-directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в параметре if директивы access_log.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "if" parameter of the "access_log" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_perl_module.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_perl_module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива listen почтового прокси-сервера[m
[31m-не позволяла указать более двух параметров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive of the mail proxy module[m
[31m-did not allow to specify more than two parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива sub_filter не работала[m
[31m-с заменяемой строкой из одного символа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sub_filter" directive did not work[m
[31m-with a string to replace consisting of a single character.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-запросы могли зависать, если использовался resolver[m
[31m-и в процессе обращения к DNS-серверу происходил таймаут.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-requests might hang if resolver was used[m
[31m-and a timeout occurred during a DNS request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module при использовании совместно с AIO.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module when using with AIO.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если с помощью директивы set изменялись переменные[m
[31m-"$http_...", "$sent_http_..." или "$upstream_http_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "set" directive was used to change the "$http_...",[m
[31m-"$sent_http_...", or "$upstream_http_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок выделения памяти.<br/>[m
[31m-Спасибо Markus Linnala и Feng Gu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation error handling.<br/>[m
[31m-Thanks to Markus Linnala and Feng Gu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.4" date="05.08.2014">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-pipelined-команды не отбрасывались[m
[31m-после команды STARTTLS в SMTP прокси-сервере (CVE-2014-3556);[m
[31m-ошибка появилась в 1.5.6.<br/>[m
[31m-Спасибо Chris Boulton.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-pipelined commands were not discarded[m
[31m-after STARTTLS command in SMTP proxy (CVE-2014-3556);[m
[31m-the bug had appeared in 1.5.6.<br/>[m
[31m-Thanks to Chris Boulton.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-экранирование символов в URI теперь использует[m
[31m-шестнадцатеричные цифры в верхнем регистре.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-URI escaping now uses[m
[31m-uppercase hexadecimal digits.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx можно собрать с BoringSSL и LibreSSL.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx can be build with BoringSSL and LibreSSL.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-запросы могли зависать, если использовался resolver[m
[31m-и DNS-сервер возвращал некорректный ответ;[m
[31m-ошибка появилась в 1.5.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-requests might hang if resolver was used[m
[31m-and a DNS server returned a malformed response;[m
[31m-the bug had appeared in 1.5.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $uri могла содержать мусор[m
[31m-при возврате ошибок с кодом 400.<br/>[m
[31m-Спасибо Сергею Боброву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $uri variable might contain garbage[m
[31m-when returning errors with code 400.<br/>[m
[31m-Thanks to Sergey Bobrov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок в директиве proxy_store[m
[31m-и в модуле ngx_http_dav_module.<br/>[m
[31m-Спасибо Feng Gu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling in the "proxy_store" directive[m
[31m-and the ngx_http_dav_module.<br/>[m
[31m-Thanks to Feng Gu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при логгировании ошибок в syslog мог происходить segmentation fault;[m
[31m-ошибка появилась в 1.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if logging of errors to syslog was used;[m
[31m-the bug had appeared in 1.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные $geoip_latitude, $geoip_longitude, $geoip_dma_code[m
[31m-и $geoip_area_code могли не работать.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $geoip_latitude, $geoip_longitude, $geoip_dma_code,[m
[31m-and $geoip_area_code variables might not work.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок выделения памяти.<br/>[m
[31m-Спасибо Tatsuhiko Kubo и Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation error handling.<br/>[m
[31m-Thanks to Tatsuhiko Kubo and Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.3" date="08.07.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-weak entity tags теперь не удаляются при изменениях ответа,[m
[31m-а strong entity tags преобразуются в weak.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-weak entity tags are now preserved on response modifications,[m
[31m-and strong ones are changed to weak.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ревалидация элементов кэша теперь, если это возможно,[m
[31m-использует заголовок If-None-Match.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache revalidation now uses If-None-Match header[m
[31m-if possible.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_password_file.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_password_file" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при возврате ответа из кэша[m
[31m-заголовок запроса If-None-Match игнорировался,[m
[31m-если в ответе не было заголовка Last-Modified.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the If-None-Match request header line was ignored[m
[31m-if there was no Last-Modified header[m
[31m-in a response returned from cache.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "peer closed connection in SSL handshake"[m
[31m-при соединении с бэкендами логгировались на уровне info вместо error.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"peer closed connection in SSL handshake" messages[m
[31m-were logged at "info" level instead of "error" while connecting to backends.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_dav_module в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_dav_module module in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SPDY-соединения могли неожиданно закрываться,[m
[31m-если использовалось кэширование.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SPDY connections might be closed prematurely[m
[31m-if caching was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.2" date="17.06.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива hash в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "hash" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-дефрагментация свободных блоков разделяемой памяти.<br/>[m
[31m-Спасибо Wandenberg Peixoto и Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-defragmentation of free shared memory blocks.<br/>[m
[31m-Thanks to Wandenberg Peixoto and Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалось значение access_log по умолчанию;[m
[31m-ошибка появилась в 1.7.0.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the default value of the "access_log" directive was used;[m
[31m-the bug had appeared in 1.7.0.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-завершающий слэш ошибочно удалялся[m
[31m-из последнего параметра директивы try_files.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-trailing slash was mistakenly removed[m
[31m-from the last parameter of the "try_files" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не собираться на OS X.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OS X in some cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.1" date="27.05.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$upstream_cookie_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$upstream_cookie_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_client_fingerprint.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_fingerprint variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы error_log и access_log теперь поддерживают логгирование в syslog.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_log" and "access_log" directives now support logging to syslog.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер теперь логгирует порт клиента при соединении.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy now logs client port on connect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при использовании директивы "ssl_stapling".<br/>[m
[31m-Спасибо Filipe da Silva.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak if the "ssl_stapling" directive was used.<br/>[m
[31m-Thanks to Filipe da Silva.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива alias внутри location'а, заданного регулярным выражением,[m
[31m-работала неправильно, если использовались директивы if или limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "alias" directive used inside a location given by a regular expression[m
[31m-worked incorrectly if the "if" or "limit_except" directives were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива charset не ставила кодировку для сжатых ответов бэкендов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "charset" directive did not set a charset to encoded backend responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass без URI могла использовать оригинальный запрос[m
[31m-после установки переменной $args.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part might use original request[m
[31m-after the $args variable was set.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в работе параметра none директивы smtp_auth;[m
[31m-ошибка появилась в 1.5.6.<br/>[m
[31m-Спасибо Святославу Никольскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "none" parameter in the "smtp_auth" directive;[m
[31m-the bug had appeared in 1.5.6.<br/>[m
[31m-Thanks to Svyatoslav Nikolsky.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при совместном использовании sub_filter и SSI[m
[31m-ответы могли передаваться неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if sub_filter and SSI were used together,[m
[31m-then responses might be transferred incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --with-file-aio на Linux/aarch64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the --with-file-aio option on Linux/aarch64.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.7.0" date="24.04.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-проверка SSL-сертификатов бэкендов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-backend SSL certificate verification.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка SNI при работе с бэкендами по SSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support for SNI while working with SSL backends.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_server_name.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_server_name variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр if директивы access_log.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" parameter of the "access_log" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.13" date="08.04.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-улучшена обработка хэш-таблиц;[m
[31m-в директивах variables_hash_max_size и types_hash_bucket_size[m
[31m-значения по умолчанию изменены на 1024 и 64 соответственно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-improved hash table handling;[m
[31m-the default values of the "variables_hash_max_size" and[m
[31m-"types_hash_bucket_size" were changed to 1024 and 64 respectively.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module теперь понимает аргумент end.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_mp4_module now supports the "end" argument.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка byte ranges модулем ngx_http_mp4_module и при сохранении[m
[31m-ответов в кэш.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-byte ranges support in the ngx_http_mp4_module and while saving responses[m
[31m-to cache.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx не пишет в лог сообщения "ngx_slab_alloc() failed: no memory"[m
[31m-при использовании разделяемой памяти в ssl_session_cache[m
[31m-и в модуле ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "ngx_slab_alloc() failed: no memory" no longer logged[m
[31m-when using shared memory in the "ssl_session_cache" directive[m
[31m-and in the ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива underscores_in_headers[m
[31m-не разрешала подчёркивание в первом символе заголовка.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "underscores_in_headers" directive[m
[31m-did not allow underscore as a first character of a header.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-cache manager мог нагружать процессор при выходе в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache manager might hog CPU on exit in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании ssl_session_cache с параметром shared[m
[31m-рабочий процесс nginx/Windows завершался аварийно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows terminated abnormally[m
[31m-if the "ssl_session_cache" directive was used with the "shared" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.12" date="18.03.2014">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного запроса модулем ngx_http_spdy_module[m
[31m-могло происходить переполнение буфера в рабочем процессе,[m
[31m-что потенциально могло приводить к выполнению произвольного кода[m
[31m-(CVE-2014-0133).<br/>[m
[31m-Спасибо Lucas Molas из Programa STIC, Fundación Dr. Manuel[m
[31m-Sadosky, Buenos Aires, Argentina.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a heap memory buffer overflow might occur in a worker process[m
[31m-while handling a specially crafted request by ngx_http_spdy_module,[m
[31m-potentially resulting in arbitrary code execution[m
[31m-(CVE-2014-0133).<br/>[m
[31m-Thanks to Lucas Molas, researcher at Programa STIC, Fundación Dr. Manuel[m
[31m-Sadosky, Buenos Aires, Argentina.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр proxy_protocol в директивах listen и real_ip_header,[m
[31m-переменная $proxy_protocol_addr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_protocol" parameters of the "listen" and "real_ip_header" directives,[m
[31m-the $proxy_protocol_addr variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве fastcgi_next_upstream.<br/>[m
[31m-Спасибо Lucas Molas.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "fastcgi_next_upstream" directive.<br/>[m
[31m-Thanks to Lucas Molas.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.11" date="04.03.2014">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного запроса модулем ngx_http_spdy_module[m
[31m-на 32-битных платформах могла повреждаться память рабочего процесса,[m
[31m-что потенциально могло приводить к выполнению произвольного кода[m
[31m-(CVE-2014-0088);[m
[31m-ошибка появилась в 1.5.10.<br/>[m
[31m-Спасибо Lucas Molas из Programa STIC, Fundación Dr. Manuel[m
[31m-Sadosky, Buenos Aires, Argentina.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory corruption might occur in a worker process on 32-bit platforms[m
[31m-while handling a specially crafted request by ngx_http_spdy_module,[m
[31m-potentially resulting in arbitrary code execution (CVE-2014-0088);[m
[31m-the bug had appeared in 1.5.10.<br/>[m
[31m-Thanks to Lucas Molas, researcher at Programa STIC, Fundación Dr. Manuel[m
[31m-Sadosky, Buenos Aires, Argentina.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_session_reused.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_session_reused variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива client_max_body_size могла не работать[m
[31m-при чтении тела запроса с использованием chunked transfer encoding;[m
[31m-ошибка появилась в 1.3.9.<br/>[m
[31m-Спасибо Lucas Molas.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "client_max_body_size" directive might not work[m
[31m-when reading a request body using chunked transfer encoding;[m
[31m-the bug had appeared in 1.3.9.<br/>[m
[31m-Thanks to Lucas Molas.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании WebSocket-соединений[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-when proxying WebSocket connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_spdy_module на 32-битных платформах;[m
[31m-ошибка появилась в 1.5.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_spdy_module was used on 32-bit platforms;[m
[31m-the bug had appeared in 1.5.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-значение переменной $upstream_status могло быть неверным,[m
[31m-если использовались директивы proxy_cache_use_stale[m
[31m-или proxy_cache_revalidate.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_status variable might contain wrong data[m
[31m-if the "proxy_cache_use_stale" or "proxy_cache_revalidate" directives[m
[31m-were used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если ошибки с кодом 400 с помощью директивы error_page[m
[31m-перенаправлялись в именованный location.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if errors with code 400 were redirected to a named location[m
[31m-using the "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не собирался с Visual Studio 2013.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not be built with Visual Studio 2013.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.10" date="04.02.2014">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_spdy_module теперь использует протокол SPDY 3.1.<br/>[m
[31m-Спасибо Automattic и MaxCDN за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_spdy_module now uses SPDY 3.1 protocol.<br/>[m
[31m-Thanks to Automattic and MaxCDN for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module теперь пропускает дорожки,[m
[31m-имеющие меньшую длину, чем запрошенная перемотка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_mp4_module now skips tracks[m
[31m-too short for a seek requested.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если переменная $ssl_session_id использовалась при логгировании;[m
[31m-ошибка появилась в 1.5.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the $ssl_session_id variable was used in logs;[m
[31m-the bug had appeared in 1.5.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные $date_local и $date_gmt использовали неверный формат[m
[31m-вне модуля ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $date_local and $date_gmt variables used wrong format[m
[31m-outside of the ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-клиентские соединения могли сразу закрываться,[m
[31m-если использовался отложенный accept;[m
[31m-ошибка появилась в 1.3.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-client connections might be immediately closed[m
[31m-if deferred accept was used;[m
[31m-the bug had appeared in 1.3.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "getsockopt(TCP_FASTOPEN) ... failed" записывались в лог[m
[31m-в процессе обновления исполняемого файла на Linux;[m
[31m-ошибка появилась в 1.5.8.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "getsockopt(TCP_FASTOPEN) ... failed" appeared in logs[m
[31m-during binary upgrade on Linux;[m
[31m-the bug had appeared in 1.5.8.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.9" date="22.01.2014">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь в заголовке X-Accel-Redirect nginx ожидает закодированный URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx expects escaped URIs in "X-Accel-Redirect" headers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_buffer_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_buffer_size" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву limit_rate теперь можно использовать для[m
[31m-ограничения скорости передачи ответов клиенту в SPDY-соединениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive can now be used to[m
[31m-rate limit responses sent in SPDY connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива spdy_chunk_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "spdy_chunk_size" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_session_tickets.<br/>[m
[31m-Спасибо Dirkjan Bussink.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_tickets" directive.<br/>[m
[31m-Thanks to Dirkjan Bussink.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_session_id содержала всю сессию в сериализованном виде[m
[31m-вместо её идентификатора.<br/>[m
[31m-Спасибо Ivan Ristić.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_session_id variable contained full session serialized[m
[31m-instead of just a session id.<br/>[m
[31m-Thanks to Ivan Ristić.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неправильно обрабатывал закодированный символ "?" в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx incorrectly handled escaped "?" character in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module не раскодировал целевой URI при[m
[31m-обработке методов COPY и MOVE.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module did not unescape destination URI[m
[31m-of the COPY and MOVE methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-resolver не понимал доменные имена с точкой в конце.[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-resolver did not understand domain names with a trailing dot.[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании в логах могли появляться сообщения "zero size buf in output";[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-alerts "zero size buf in output" might appear in logs while proxying;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_spdy_module was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании методов обработки соединений select, poll и /dev/poll[m
[31m-проксируемые WebSocket-соединения могли зависать сразу после открытия.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxied WebSocket connections might hang right after handshake[m
[31m-if the select, poll, or /dev/poll methods were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива xclient почтового прокси-сервера[m
[31m-некорректно передавала IPv6-адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "xclient" directive of the mail proxy module[m
[31m-incorrectly handled IPv6 client addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.8" date="17.12.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь resolver поддерживает IPv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-IPv6 support in resolver.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen поддерживает параметр fastopen.<br/>[m
[31m-Спасибо Mathew Rodley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive supports the "fastopen" parameter.<br/>[m
[31m-Thanks to Mathew Rodley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка SSL в модуле ngx_http_uwsgi_module.<br/>[m
[31m-Спасибо Roberto De Ioris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL support in the ngx_http_uwsgi_module.<br/>[m
[31m-Thanks to Roberto De Ioris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-скрипты подсветки синтаксиса для vim добавлены в contrib.<br/>[m
[31m-Спасибо Evan Miller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-vim syntax highlighting scripts were added to contrib.<br/>[m
[31m-Thanks to Evan Miller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при чтении тела запроса с использованием chunked transfer encoding[m
[31m-по SSL-соединению мог произойти таймаут.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a timeout might occur while reading client request body[m
[31m-in an SSL connection using chunked transfer encoding.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива master_process работала неправильно в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "master_process" directive did not work correctly in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр setfib директивы listen мог не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "setfib" parameter of the "listen" directive might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.7" date="19.11.2013">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-символ, следующий за незакодированным пробелом в строке запроса,[m
[31m-обрабатывался неправильно (CVE-2013-4547);[m
[31m-ошибка появилась в 0.8.41.<br/>[m
[31m-Спасибо Ivan Fratric из Google Security Team.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a character following an unescaped space in a request line[m
[31m-was handled incorrectly (CVE-2013-4547);[m
[31m-the bug had appeared in 0.8.41.<br/>[m
[31m-Thanks to Ivan Fratric of the Google Security Team.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-уровень логгирования ошибок auth_basic об отсутствии пароля[m
[31m-понижен с уровня error до info.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a logging level of auth_basic errors about no user/password provided[m
[31m-has been lowered from "error" to "info".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache_revalidate, fastcgi_cache_revalidate,[m
[31m-scgi_cache_revalidate и uwsgi_cache_revalidate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_revalidate", "fastcgi_cache_revalidate",[m
[31m-"scgi_cache_revalidate", and "uwsgi_cache_revalidate" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_session_ticket_key.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_ticket_key" directive.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "add_header Cache-Control ''"[m
[31m-добавляла строку заголовка ответа "Cache-Control" с пустым значением.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the directive "add_header Cache-Control ''"[m
[31m-added a "Cache-Control" response header line with an empty value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "satisfy any" могла вернуть ошибку 403 вместо 401[m
[31m-при использовании директив auth_request и auth_basic.<br/>[m
[31m-Спасибо Jan Marc Hoffmann.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "satisfy any" directive might return 403 error instead of 401[m
[31m-if auth_request and auth_basic directives were used.<br/>[m
[31m-Thanks to Jan Marc Hoffmann.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры accept_filter и deferred директивы listen игнорировались[m
[31m-для listen-сокетов, создаваемых в процессе обновления исполняемого файла.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "accept_filter" and "deferred" parameters of the "listen" directive[m
[31m-were ignored for listen sockets created during binary upgrade.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-часть данных, полученных от бэкенда при небуферизированном проксировании,[m
[31m-могла не отправляться клиенту сразу,[m
[31m-если использовались директивы gzip или gunzip.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some data received from a backend with unbufferred proxy[m
[31m-might not be sent to a client immediately[m
[31m-if "gzip" or "gunzip" directives were used.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок в модуле ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling in ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы могли зависать,[m
[31m-если использовался модуль ngx_http_spdy_module[m
[31m-и директива auth_request.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-responses might hang[m
[31m-if the ngx_http_spdy_module was used[m
[31m-with the "auth_request" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.6" date="01.10.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_buffering.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_buffering" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ssl_protocols и proxy_ssl_ciphers.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ssl_protocols" and "proxy_ssl_ciphers" directives.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-оптимизация SSL handshake при использовании длинных цепочек сертификатов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-optimization of SSL handshakes when using long certificate chains.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер поддерживает SMTP pipelining.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy supports SMTP pipelining.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_auth_basic_module[m
[31m-при использовании метода шифрования паролей "$apr1$".<br/>[m
[31m-Спасибо Markus Linnala.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_auth_basic_module[m
[31m-when using "$apr1$" password encryption method.<br/>[m
[31m-Thanks to Markus Linnala.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на MacOSX, Cygwin и nginx/Windows[m
[31m-для обработки запроса мог использоваться неверный location,[m
[31m-если для задания location'ов использовались символы разных регистров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in MacOSX, Cygwin, and nginx/Windows[m
[31m-incorrect location might be used to process a request[m
[31m-if locations were given using characters in different cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-автоматическое перенаправление с добавлением завершающего слэша[m
[31m-для проксированных location'ов могло не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-automatic redirect with appended trailing slash[m
[31m-for proxied locations might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в почтовом прокси-сервере.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the mail proxy server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.5" date="17.09.2013">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx по умолчанию использует HTTP/1.0,[m
[31m-если точно определить протокол не удалось.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx assumes HTTP/1.0 by default[m
[31m-if it is not able to detect protocol reliably.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива disable_symlinks теперь использует O_PATH на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "disable_symlinks" directive now uses O_PATH on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-для определения того, что клиент закрыл соединение,[m
[31m-при использовании метода epoll[m
[31m-теперь используются события EPOLLRDHUP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses EPOLLRDHUP events[m
[31m-to detect premature connection close by clients[m
[31m-if the "epoll" method is used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве valid_referers при использовании параметра server_names.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "valid_referers" directive if the "server_names" parameter was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $request_time не работала в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_time variable did not work in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве image_filter.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "image_filter" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL 1.0.1f.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL 1.0.1f compatibility.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.4" date="27.08.2013">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-MIME-тип для расширения js изменён на "application/javascript";[m
[31m-значение по умолчанию директивы charset_types изменено соответственно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "js" extension MIME type has been changed to "application/javascript";[m
[31m-default value of the "charset_types" directive was changed accordingly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива image_filter с параметром size[m
[31m-возвращает ответ с MIME-типом "application/json".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "image_filter" directive with the "size" parameter[m
[31m-returns responses with the "application/json" MIME type.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_auth_request_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_auth_request_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на старте или во время переконфигурации мог произойти segmentation fault,[m
[31m-если использовалась директива try_files с пустым параметром.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur on start or during reconfiguration[m
[31m-if the "try_files" directive was used with an empty parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при использовании в директивах root и auth_basic_user_file[m
[31m-относительных путей, заданных с помощью переменных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak if relative paths were specified using variables[m
[31m-in the "root" or "auth_basic_user_file" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива valid_referers неправильно выполняла регулярные выражения,[m
[31m-если заголовок Referer начинался с "https://".<br/>[m
[31m-Спасибо Liangbin Li.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid_referers" directive incorrectly executed regular expressions[m
[31m-if a "Referer" header started with "https://".<br/>[m
[31m-Thanks to Liangbin Li.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы могли зависать, если использовались подзапросы и при обработке подзапроса[m
[31m-происходила ошибка во время SSL handshake с бэкендом.<br/>[m
[31m-Спасибо Aviram Cohen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-responses might hang if subrequests were used[m
[31m-and an SSL handshake error happened during subrequest processing.<br/>[m
[31m-Thanks to Aviram Cohen.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.3" date="30.07.2013">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменение во внутреннем API:[m
[31m-теперь при небуферизированной работе с бэкендами[m
[31m-u->length по умолчанию устанавливается в -1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Change in internal API:[m
[31m-now u->length defaults to -1[m
[31m-if working with backends in unbuffered mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при получении неполного ответа от бэкенда[m
[31m-nginx отправляет полученную часть ответа,[m
[31m-после чего закрывает соединение с клиентом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now after receiving an incomplete response from a backend server[m
[31m-nginx tries to send an available part of the response to a client,[m
[31m-and then closes client connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_spdy_module[m
[31m-и директива client_body_in_file_only.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_spdy_module was used[m
[31m-with the "client_body_in_file_only" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр so_keepalive директивы listen[m
[31m-мог работать некорректно на DragonFlyBSD.<br/>[m
[31m-Спасибо Sepherosa Ziehau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "so_keepalive" parameter of the "listen" directive[m
[31m-might be handled incorrectly on DragonFlyBSD.<br/>[m
[31m-Thanks to Sepherosa Ziehau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_xslt_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_xslt_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.2" date="02.07.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно использовать несколько директив error_log.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now several "error_log" directives can be used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод $r->header_in() встроенного перла не возвращал значения строк[m
[31m-"Cookie" и "X-Forwarded-For" из заголовка запроса;[m
[31m-ошибка появилась в 1.3.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->header_in() embedded perl method did not return value of the[m
[31m-"Cookie" and "X-Forwarded-For" request header lines;[m
[31m-the bug had appeared in 1.3.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_spdy_module.<br/>[m
[31m-Спасибо Jim Radford.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_spdy_module.<br/>[m
[31m-Thanks to Jim Radford.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux при использовании x32 ABI.<br/>[m
[31m-Спасибо Сергею Иванцову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux with x32 ABI.<br/>[m
[31m-Thanks to Serguei Ivantsov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.1" date="04.06.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssi_last_modified, sub_filter_last_modified и[m
[31m-xslt_last_modified.<br/>[m
[31m-Спасибо Алексею Колпакову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi_last_modified", "sub_filter_last_modified", and[m
[31m-"xslt_last_modified" directives.<br/>[m
[31m-Thanks to Alexey Kolpakov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр http_403 в директивах proxy_next_upstream, fastcgi_next_upstream,[m
[31m-scgi_next_upstream и uwsgi_next_upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "http_403" parameter of the "proxy_next_upstream", "fastcgi_next_upstream",[m
[31m-"scgi_next_upstream", and "uwsgi_next_upstream" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы allow и deny теперь поддерживают unix domain сокеты.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "allow" and "deny" directives now support unix domain sockets.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с модулем ngx_mail_ssl_module,[m
[31m-но без модуля ngx_http_ssl_module;[m
[31m-ошибка появилась в 1.3.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the ngx_mail_ssl_module,[m
[31m-but without ngx_http_ssl_module;[m
[31m-the bug had appeared in 1.3.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_set_body.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_set_body" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве lingering_time.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "lingering_time" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр fail_timeout директивы server[m
[31m-в блоке upstream мог не работать,[m
[31m-если использовался параметр max_fails;[m
[31m-ошибка появилась в 1.3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fail_timeout" parameter of the "server" directive[m
[31m-in the "upstream" context might not work[m
[31m-if "max_fails" parameter was used;[m
[31m-the bug had appeared in 1.3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива ssl_stapling.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "ssl_stapling" directive was used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в почтовом прокси-сервере.<br/>[m
[31m-Спасибо Filipe Da Silva.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the mail proxy server.<br/>[m
[31m-Thanks to Filipe Da Silva.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог перестать принимать соединения,[m
[31m-если использовалось несколько рабочих процессов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might stop accepting connections[m
[31m-if several worker processes were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.5.0" date="07.05.2013">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного запроса[m
[31m-мог перезаписываться стек рабочего процесса,[m
[31m-что могло приводить к выполнению произвольного кода (CVE-2013-2028);[m
[31m-ошибка появилась в 1.3.9.<br/>[m
[31m-Спасибо Greg MacManus, iSIGHT Partners Labs.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a stack-based buffer overflow might occur in a worker process[m
[31m-while handling a specially crafted request,[m
[31m-potentially resulting in arbitrary code execution (CVE-2013-2028);[m
[31m-the bug had appeared in 1.3.9.<br/>[m
[31m-Thanks to Greg MacManus, iSIGHT Partners Labs.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.4.0" date="24.04.2013">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с модулем ngx_http_perl_module,[m
[31m-если использовался параметр --with-openssl;[m
[31m-ошибка появилась в 1.3.16.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the ngx_http_perl_module[m
[31m-if the --with-openssl option was used;[m
[31m-the bug had appeared in 1.3.16.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в работе с телом запроса из модуля ngx_http_perl_module;[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a request body handling in the ngx_http_perl_module;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.16" date="16.04.2013">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовались подзапросы;[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if subrequests were used;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива tcp_nodelay вызывала ошибку[m
[31m-при проксировании WebSocket-соединений в unix domain сокет.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "tcp_nodelay" directive caused an error[m
[31m-if a WebSocket connection was proxied into a unix domain socket.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_length возвращала значение "0",[m
[31m-если не использовалась буферизация.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_length variable has an incorrect value "0"[m
[31m-if buffering was not used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в методах обработки соединений eventport и /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the eventport and /dev/poll methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.15" date="26.03.2013">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-открытие и закрытие соединения без отправки в нём каких-либо данных[m
[31m-больше не записывается в access_log с кодом ошибки 400.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-opening and closing a connection without sending any data in it[m
[31m-is no longer logged to access_log with error code 400.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_spdy_module.<br/>[m
[31m-Спасибо Automattic за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_spdy_module.<br/>[m
[31m-Thanks to Automattic for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы limit_req_status и limit_conn_status.<br/>[m
[31m-Спасибо Nick Marden.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_req_status" and "limit_conn_status" directives.<br/>[m
[31m-Thanks to Nick Marden.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_interlace.<br/>[m
[31m-Спасибо Ивану Боброву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_interlace" directive.<br/>[m
[31m-Thanks to Ian Babrou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $connections_waiting в модуле ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$connections_waiting variable in the ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь почтовый прокси-сервер поддерживает IPv6-бэкенды.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy module now supports IPv6 backends.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при повторной отправке запроса на бэкенд[m
[31m-тело запроса могло передаваться неправильно;[m
[31m-ошибка появилась в 1.3.9.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-request body might be transmitted incorrectly[m
[31m-when retrying a request to the next upstream server;[m
[31m-the bug had appeared in 1.3.9.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве client_body_in_file_only;[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "client_body_in_file_only" directive;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы могли зависать,[m
[31m-если использовались подзапросы[m
[31m-и при обработке подзапроса происходила DNS-ошибка.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-responses might hang[m
[31m-if subrequests were used[m
[31m-and a DNS error happened during subrequest processing.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в процедуре учёта использования бэкендов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in backend usage accounting.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.14" date="05.03.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $connections_active, $connections_reading и $connections_writing[m
[31m-в модуле ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$connections_active, $connections_reading, and $connections_writing variables[m
[31m-in the ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка WebSocket-соединений[m
[31m-в модулях ngx_http_uwsgi_module и ngx_http_scgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support of WebSocket connections[m
[31m-in the ngx_http_uwsgi_module and ngx_http_scgi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке виртуальных серверов при использовании SNI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in virtual servers handling with SNI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "ssl_session_cache shared"[m
[31m-новые сессии могли не сохраняться,[m
[31m-если заканчивалось место в разделяемой памяти.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-new sessions were not always stored[m
[31m-if the "ssl_session_cache shared" directive was used[m
[31m-and there was no free space in shared memory.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-несколько заголовков X-Forwarded-For обрабатывались неправильно.<br/>[m
[31m-Спасибо Neal Poole за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-multiple X-Forwarded-For headers were handled incorrectly.<br/>[m
[31m-Thanks to Neal Poole for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.<br/>[m
[31m-Спасибо Gernot Vormayr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.<br/>[m
[31m-Thanks to Gernot Vormayr.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.13" date="19.02.2013">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь для сборки по умолчанию используется компилятор с именем "cc".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a compiler with name "cc" is now used by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка проксирования WebSocket-соединений.<br/>[m
[31m-Спасибо Apcera и CloudBees за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support for proxying of WebSocket connections.<br/>[m
[31m-Thanks to Apcera and CloudBees for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic_user_file поддерживает шифрование паролей[m
[31m-методом "{SHA}".<br/>[m
[31m-Спасибо Louis Opter.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_basic_user_file" directive supports "{SHA}"[m
[31m-password encryption method.<br/>[m
[31m-Thanks to Louis Opter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.12" date="05.02.2013">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_bind, fastcgi_bind, memcached_bind, scgi_bind и uwsgi_bind[m
[31m-поддерживают переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "proxy_bind", "fastcgi_bind", "memcached_bind",[m
[31m-"scgi_bind", and "uwsgi_bind" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $pipe, $request_length, $time_iso8601 и $time_local[m
[31m-теперь можно использовать не только в директиве log_format.<br/>[m
[31m-Спасибо Kiril Kalchev.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $pipe, $request_length, $time_iso8601, and $time_local variables[m
[31m-can now be used not only in the "log_format" directive.[m
[31m-Thanks to Kiril Kalchev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка IPv6 в модуле ngx_http_geoip_module.<br/>[m
[31m-Спасибо Gregor Kališnik.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-IPv6 support in the ngx_http_geoip_module.<br/>[m
[31m-Thanks to Gregor Kališnik.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_method работала неверно, если была указана на уровне http.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_method" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался resolver и метод poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if resolver was used with the poll method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог нагружать процессор во время SSL handshake с бэкендом[m
[31m-при использовании методов обработки соединений select, poll и /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might hog CPU during SSL handshake with a backend[m
[31m-if the select, poll, or /dev/poll methods were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка "[crit] SSL_write() failed (SSL:)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[crit] SSL_write() failed (SSL:)" error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве client_body_in_file_only;[m
[31m-ошибка появилась в 1.3.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "client_body_in_file_only" directive;[m
[31m-the bug had appeared in 1.3.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве fastcgi_keep_conn.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "fastcgi_keep_conn" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.11" date="10.01.2013">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при записи в лог мог происходить segmentation fault;[m
[31m-ошибка появилась в 1.3.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if logging was used;[m
[31m-the bug had appeared in 1.3.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass не работала с IP-адресами[m
[31m-без явного указания порта;[m
[31m-ошибка появилась в 1.3.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" directive did not work with IP addresses[m
[31m-without port specified;[m
[31m-the bug had appeared in 1.3.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на старте или во время переконфигурации происходил segmentation fault,[m
[31m-если директива keepalive была указана несколько раз[m
[31m-в одном блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred on start or during reconfiguration[m
[31m-if the "keepalive" directive was specified more than once[m
[31m-in a single upstream block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр default директивы geo не определял значение по умолчанию[m
[31m-для IPv6-адресов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-parameter "default" of the "geo" directive did not set default value[m
[31m-for IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.10" date="25.12.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-для указанных в конфигурационном файле доменных имён теперь[m
[31m-используются не только IPv4, но и IPv6 адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-domain names specified in configuration file[m
[31m-are now resolved to IPv6 addresses as well as IPv4 ones.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании директивы include с маской на Unix-системах[m
[31m-включаемые файлы сортируются в алфавитном порядке.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if the "include" directive with mask is used on Unix systems,[m
[31m-included files are sorted in alphabetical order.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива add_header добавляет строки в ответы с кодом 201.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header" directive adds headers to 201 responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива geo теперь поддерживает IPv6 адреса в формате CIDR.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "geo" directive now supports IPv6 addresses in CIDR notation.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры flush и gzip в директиве access_log.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "flush" and "gzip" parameters of the "access_log" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "auth_basic" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx в некоторых случаях не собирался с модулем ngx_http_perl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the ngx_http_perl_module in some cases.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_xslt_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_xslt_module was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не собираться на MacOSX.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOSX in some cases.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы limit_rate с большими значениями скорости[m
[31m-на 32-битных системах ответ мог возвращаться не целиком.<br/>[m
[31m-Спасибо Алексею Антропову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive with high rates[m
[31m-might result in truncated responses on 32-bit platforms.<br/>[m
[31m-Thanks to Alexey Antropov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива if.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "if" directive was used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ "100 Continue" выдавался[m
[31m-вместе с ответом "413 Request Entity Too Large".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "100 Continue" response was issued[m
[31m-with "413 Request Entity Too Large" responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы image_filter, image_filter_jpeg_quality и image_filter_sharpen[m
[31m-могли наследоваться некорректно.<br/>[m
[31m-Спасибо Ивану Боброву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter", "image_filter_jpeg_quality"[m
[31m-and "image_filter_sharpen" directives[m
[31m-might be inherited incorrectly.<br/>[m
[31m-Thanks to Ian Babrou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы auth_basic под Linux[m
[31m-могли возникать ошибки "crypt_r() failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"crypt_r() failed" errors might appear[m
[31m-if the "auth_basic" directive was used on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке backup-серверов.<br/>[m
[31m-Спасибо Thomas Chen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in backup servers handling.<br/>[m
[31m-Thanks to Thomas Chen.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании HEAD-запросов мог возвращаться некорректный ответ,[m
[31m-если использовалась директива gzip.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxied HEAD requests might return incorrect response[m
[31m-if the "gzip" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.9" date="27.11.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка chunked transfer encoding при получении тела запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support for chunked transfer encoding while reading client request body.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $request_time и $msec[m
[31m-теперь можно использовать не только в директиве log_format.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_time and $msec variables[m
[31m-can now be used not only in the "log_format" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-cache manager и cache loader могли не запускаться,[m
[31m-если использовалось более 512 listen-сокетов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache manager and cache loader processes might not be able to start[m
[31m-if more than 512 listen sockets were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_dav_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_dav_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.8" date="30.10.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр optional_no_ca директивы ssl_verify_client.<br/>[m
[31m-Спасибо Михаилу Казанцеву и Eric O'Connor.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "optional_no_ca" parameter of the "ssl_verify_client" directive.<br/>[m
[31m-Thanks to Mike Kazantsev and Eric O'Connor.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $bytes_sent, $connection и $connection_requests[m
[31m-теперь можно использовать не только в директиве log_format.<br/>[m
[31m-Спасибо Benjamin Grössing.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $bytes_sent, $connection, and $connection_requests variables[m
[31m-can now be used not only in the "log_format" directive.<br/>[m
[31m-Thanks to Benjamin Grössing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр auto директивы worker_processes.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auto" parameter of the "worker_processes" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "cache file ... has md5 collision".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"cache file ... has md5 collision" alert.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве ssl_stapling.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "ssl_stapling" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.7" date="02.10.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка OCSP stapling.<br/>[m
[31m-Спасибо Comodo, DigiCert и GlobalSign за спонсирование разработки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OCSP stapling support.<br/>[m
[31m-Thanks to Comodo, DigiCert and GlobalSign for sponsoring this work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_trusted_certificate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_trusted_certificate" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь resolver случайным образом меняет порядок[m
[31m-возвращаемых закэшированных адресов.<br/>[m
[31m-Спасибо Антону Жулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-resolver now randomly rotates addresses[m
[31m-returned from cache.<br/>[m
[31m-Thanks to Anton Jouline.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL 0.9.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL 0.9.7 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.6" date="12.09.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_gunzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива memcached_gzip_flag.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "memcached_gzip_flag" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр always директивы gzip_static.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "always" parameter of the "gzip_static" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве "limit_req";[m
[31m-ошибка появилась в 1.1.14.<br/>[m
[31m-Спасибо Charles Chen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "limit_req" directive;[m
[31m-the bug had appeared in 1.1.14.<br/>[m
[31m-Thanks to Charles Chen.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался gcc 4.7 с оптимизацией -O2[m
[31m-если использовался параметр --with-ipv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by gcc 4.7 with -O2 optimization[m
[31m-if the --with-ipv6 option was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.5" date="21.08.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module больше не отфильтровывает дорожки[m
[31m-в форматах, отличных от H.264 и AAC.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_mp4_module module no longer skips[m
[31m-tracks in formats other than H.264 and AAC.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если в директиве map в качестве значений использовались переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "map" directive was used with variables as values.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault[m
[31m-при использовании директивы geo с параметром ranges,[m
[31m-но без параметра default; ошибка появилась в 0.8.43.<br/>[m
[31m-Спасибо Zhen Chen и Weibin Yao.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "geo" directive was used with the "ranges" parameter[m
[31m-but without the "default" parameter; the bug had appeared in 0.8.43.<br/>[m
[31m-Thanks to Zhen Chen and Weibin Yao.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке параметра командной строки -p.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the -p command-line parameter handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в почтовом прокси-сервере.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the mail proxy server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-незначительных потенциальных ошибок.<br/>[m
[31m-Спасибо Coverity.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of minor potential bugs.<br/>[m
[31m-Thanks to Coverity.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не собирался с Visual Studio 2005 Express.<br/>[m
[31m-Спасибо HAYASHI Kentaro.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not be built with Visual Studio 2005 Express.<br/>[m
[31m-Thanks to HAYASHI Kentaro.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.4" date="31.07.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь на слушающих IPv6-сокетах параметр ipv6only[m
[31m-включён по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ipv6only" parameter is now turned on by default for[m
[31m-listening IPv6 sockets.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка компилятора Clang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Clang compiler support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-могли создаваться лишние слушающие сокеты.<br/>[m
[31m-Спасибо Роману Одайскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-extra listening sockets might be created.<br/>[m
[31m-Thanks to Roman Odaisky.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог нагружать процессор, если при запуске рабочего процесса[m
[31m-происходила ошибка.<br/>[m
[31m-Спасибо Ricardo Villalobos Guevara.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might hog CPU if a worker process failed to start.<br/>[m
[31m-Thanks to Ricardo Villalobos Guevara.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass_header, fastcgi_pass_header, scgi_pass_header,[m
[31m-uwsgi_pass_header, proxy_hide_header, fastcgi_hide_header,[m
[31m-scgi_hide_header и uwsgi_hide_header[m
[31m-могли наследоваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass_header", "fastcgi_pass_header", "scgi_pass_header",[m
[31m-"uwsgi_pass_header", "proxy_hide_header", "fastcgi_hide_header",[m
[31m-"scgi_hide_header", and "uwsgi_hide_header" directives[m
[31m-might be inherited incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.3" date="10.07.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка entity tags и директива etag.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-entity tags support and the "etag" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы map с параметром hostnames[m
[31m-не игнорировалась конечная точка в исходном значении.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-trailing dot in a source value was not ignored[m
[31m-if the "map" directive was used with the "hostnames" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для обработки запроса мог использоваться неверный location,[m
[31m-если переход в именованный location происходил[m
[31m-после изменения URI с помощью директивы rewrite.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-incorrect location might be used to process a request[m
[31m-if a URI was changed via a "rewrite" directive[m
[31m-before an internal redirect to a named location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.2" date="26.06.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр single директивы keepalive теперь игнорируется.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "single" parameter of the "keepalive" directive is now ignored.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-сжатие SSL теперь отключено[m
[31m-в том числе при использовании OpenSSL старее 1.0.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL compression is now disabled when using all versions of OpenSSL,[m
[31m-including ones prior to 1.0.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву "ip_hash" теперь можно использовать для балансировки IPv6 клиентов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it is now possible to use the "ip_hash" directive to balance IPv6 clients.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменную $status теперь можно использовать не только в директиве log_format.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $status variable can now be used not only in the "log_format" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при завершении рабочего процесса мог произойти segmentation fault,[m
[31m-если использовалась директива resolver.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process on shutdown[m
[31m-if the "resolver" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался модуль ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the ngx_http_mp4_module was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовались конфликтующие имена серверов с масками.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if conflicting wildcard server names were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на платформе ARM nginx мог аварийно завершаться по сигналу SIGBUS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might be terminated abnormally on a SIGBUS signal on ARM platform.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время переконфигурации на HP-UX в лог[m
[31m-записывался alert "sendmsg() failed (9: Bad file number)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an alert "sendmsg() failed (9: Bad file number)" on HP-UX[m
[31m-while reconfiguration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.1" date="05.06.2012">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует точку в конце компонента URI[m
[31m-и не разрешает URI, содержащие последовательность ":$".<br/>[m
[31m-Спасибо Владимиру Кочеткову, Positive Research Center.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores trailing dot in URI path component, and[m
[31m-does not allow URIs with ":$" in it.<br/>[m
[31m-Thanks to Vladimir Kochetkov, Positive Research Center.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass, fastcgi_pass, scgi_pass, uwsgi_pass и[m
[31m-директива server в блоке upstream[m
[31m-теперь поддерживают IPv6-адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass", "fastcgi_pass", "scgi_pass", "uwsgi_pass" directives, and[m
[31m-the "server" directive inside the "upstream" block,[m
[31m-now support IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в директиве resolver теперь можно указывать порт и[m
[31m-задавать IPv6-адреса DNS-серверов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "resolver" directive now supports IPv6 addresses and[m
[31m-an optional port specification.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива least_conn в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "least_conn" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы ip_hash[m
[31m-теперь можно задавать веса серверов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-it is now possible to specify a weight for servers[m
[31m-while using the "ip_hash" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива image_filter;[m
[31m-ошибка появилась в 1.3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "image_filter" directive was used;[m
[31m-the bug had appeared in 1.3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с модулем ngx_cpp_test_module;[m
[31m-ошибка появилась в 1.1.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with ngx_cpp_test_module;[m
[31m-the bug had appeared in 1.1.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-доступ к переменным из SSI и встроенного перла мог не работать после[m
[31m-переконфигурации.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-access to variables from SSI and embedded perl module might not work after[m
[31m-reconfiguration.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_xslt_filter_module.<br/>[m
[31m-Спасибо Kuramoto Eiji.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_xslt_filter_module.<br/>[m
[31m-Thanks to Kuramoto Eiji.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при использовании переменной $geoip_org.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak if $geoip_org variable was used.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах proxy_cookie_domain и proxy_cookie_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_cookie_domain" and "proxy_cookie_path" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.3.0" date="15.05.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива debug_connection теперь поддерживает IPv6-адреса[m
[31m-и параметр "unix:".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "debug_connection" directive now supports IPv6 addresses[m
[31m-and the "unix:" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива set_real_ip_from и параметр proxy[m
[31m-директивы geo теперь поддерживают IPv6-адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set_real_ip_from" directive and the "proxy" parameter[m
[31m-of the "geo" directive now support IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы real_ip_recursive, geoip_proxy и geoip_proxy_recursive.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "real_ip_recursive", "geoip_proxy", and "geoip_proxy_recursive" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр proxy_recursive директивы geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_recursive" parameter of the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива resolver.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "resolver" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовались директивы fastcgi_pass, scgi_pass или uwsgi_pass[m
[31m-и бэкенд возвращал некорректный ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "fastcgi_pass", "scgi_pass", or "uwsgi_pass" directives were used[m
[31m-and backend returned incorrect response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива rewrite и в новых аргументах запроса в строке[m
[31m-замены использовались переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "rewrite" directive was used and new request arguments[m
[31m-in a replacement used variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог нагружать процессор,[m
[31m-если было достигнуто ограничение на количество открытых файлов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might hog CPU[m
[31m-if the open file resource limit was reached.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы proxy_next_upstream с параметром http_404[m
[31m-nginx мог бесконечно перебирать бэкенды, если в блоке upstream был[m
[31m-хотя бы один сервер с флагом backup.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might loop infinitely over backends[m
[31m-if the "proxy_next_upstream" directive with the "http_404" parameter was used[m
[31m-and there were backup servers specified in an upstream block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы ip_hash[m
[31m-установка параметра down директивы server[m
[31m-могла приводить к ненужному перераспределению клиентов между бэкендами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-adding the "down" parameter of the "server" directive[m
[31m-might cause unneeded client redistribution among backend servers[m
[31m-if the "ip_hash" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_fastcgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_fastcgi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.2.0" date="23.04.2012">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива try_files;[m
[31m-ошибка появилась в 1.1.19.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "try_files" directive was used;[m
[31m-the bug had appeared in 1.1.19.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ мог быть передан не полностью,[m
[31m-если использовалось больше IOV_MAX буферов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-response might be truncated[m
[31m-if there were more than IOV_MAX buffers used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в работе параметра crop директивы image_filter.<br/>[m
[31m-Спасибо Maxim Bublis.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "crop" parameter of the "image_filter" directive.<br/>[m
[31m-Thanks to Maxim Bublis.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.19" date="12.04.2012">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного mp4 файла модулем ngx_http_mp4_module[m
[31m-могли перезаписываться области памяти рабочего процесса, что могло[m
[31m-приводить к выполнению произвольного кода (CVE-2012-2089).<br/>[m
[31m-Спасибо Matthew Daley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-specially crafted mp4 file might allow to overwrite[m
[31m-memory locations in a worker process[m
[31m-if the ngx_http_mp4_module was used,[m
[31m-potentially resulting in arbitrary code execution (CVE-2012-2089).<br/>[m
[31m-Thanks to Matthew Daley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог завершаться аварийно.<br/>[m
[31m-Спасибо Vincent Lee.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might be terminated abnormally.<br/>[m
[31m-Thanks to Vincent Lee.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx нагружал процессор, если все серверы в upstream'е были помечены[m
[31m-флагом backup.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx hogged CPU if all servers in an upstream were marked as "backup".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы allow и deny могли наследоваться некорректно,[m
[31m-если в них использовались IPv6 адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "allow" and "deny" directives might be inherited incorrectly[m
[31m-if they were used with IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы modern_browser и ancient_browser[m
[31m-могли наследоваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "modern_browser" and "ancient_browser" directives[m
[31m-might be inherited incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-таймауты могли работать некорректно на Solaris/SPARC.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-timeouts might be handled incorrectly on Solaris/SPARC.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.18" date="28.03.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь keepalive соединения не запрещены для Safari по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-keepalive connections are no longer disabled for Safari by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $connection_requests.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $connection_requests variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd и[m
[31m-$tcpinfo_rcv_space.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd and[m
[31m-$tcpinfo_rcv_space variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_cpu_affinity теперь работает на FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_cpu_affinity" directive now works on FreeBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы xslt_param и xslt_string_param.<br/>[m
[31m-Спасибо Samuel Behan.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "xslt_param" and "xslt_string_param" directives.<br/>[m
[31m-Thanks to Samuel Behan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в configure.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in configure tests.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_xslt_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_xslt_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Debian GNU/Hurd.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Debian GNU/Hurd.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.17" date="15.03.2012">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-содержимое ранее освобождённой памяти могло быть отправлено клиенту,[m
[31m-если бэкенд возвращал специально созданный ответ.<br/>[m
[31m-Спасибо Matthew Daley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-content of previously freed memory might be sent to a client[m
[31m-if backend returned specially crafted response.<br/>[m
[31m-Thanks to Matthew Daley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании встроенного перла из SSI.<br/>[m
[31m-Спасибо Matthew Daley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the embedded perl module if used from SSI.<br/>[m
[31m-Thanks to Matthew Daley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_uwsgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_uwsgi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.16" date="29.02.2012">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ограничение на количество одновременных подзапросов поднято до 200.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the simultaneous subrequest limit has been raised to 200.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр from в директиве disable_symlinks.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "from" parameter of the "disable_symlinks" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы return и error_page теперь могут использоваться для возврата[m
[31m-перенаправлений с кодом 307.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "return" and "error_page" directives can now be used to return 307[m
[31m-redirections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива resolver[m
[31m-и на глобальном уровне не была задана директива error_log.<br/>[m
[31m-Спасибо Роману Арутюняну.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "resolver" directive was used[m
[31m-and there was no "error_log" directive specified at global level.<br/>[m
[31m-Thanks to Roman Arutyunyan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовались директивы "proxy_http_version 1.1" или[m
[31m-"fastcgi_keep_conn on".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if the "proxy_http_version 1.1" or "fastcgi_keep_conn on" directives[m
[31m-were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечек памяти.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leaks.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве disable_symlinks.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "disable_symlinks" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании ZFS размер кэша на диске мог считаться некорректно;[m
[31m-ошибка появилась в 1.0.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on ZFS filesystem disk cache size might be calculated incorrectly;[m
[31m-the bug had appeared in 1.0.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался компилятором icc 12.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by the icc 12.1 compiler.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался gcc на Solaris;[m
[31m-ошибка появилась в 1.1.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by gcc on Solaris;[m
[31m-the bug had appeared in 1.1.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.15" date="15.02.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива disable_symlinks.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "disable_symlinks" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cookie_domain и proxy_cookie_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cookie_domain" and "proxy_cookie_path" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог некорректно сообщать об ошибке "upstream prematurely closed[m
[31m-connection" вместо "upstream sent too big header".<br/>[m
[31m-Спасибо Feibo Li.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might log incorrect error "upstream prematurely closed connection"[m
[31m-instead of correct "upstream sent too big header" one.<br/>[m
[31m-Thanks to Feibo Li.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с модулем ngx_http_perl_module,[m
[31m-если использовался параметр --with-openssl.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the ngx_http_perl_module[m
[31m-if the --with-openssl option was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-количество внутренних перенаправлений в именованные location'ы[m
[31m-не ограничивалось.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the number of internal redirects to named locations was not limited.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-вызов $r->flush() несколько раз подряд мог приводить к ошибкам[m
[31m-в модуле ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-calling $r->flush() multiple times might cause errors[m
[31m-in the ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы proxy_store с SSI-подзапросами[m
[31m-временные файлы могли не удаляться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-temporary files might be not removed[m
[31m-if the "proxy_store" directive was used with SSI includes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в некоторых случаях некэшируемые переменные (такие, как $args)[m
[31m-возвращали старое пустое закэшированное значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in some cases non-cacheable variables (such as the $args variable)[m
[31m-returned old empty cached value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если одновременно создавалось слишком много SSI-подзапросов;[m
[31m-ошибка появилась в 0.7.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if too many SSI subrequests were issued simultaneously;[m
[31m-the bug had appeared in 0.7.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.14" date="30.01.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно указать несколько ограничений limit_req одновременно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-multiple "limit_req" limits may be used simultaneously.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при соединении с бэкендом.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error handling while connecting to a backend.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при использовании AIO на FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in AIO error handling on FreeBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в инициализации библиотеки OpenSSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the OpenSSL library initialization.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_redirect могли наследоваться некорректно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directives might be inherited incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при переконфигурации, если использовалась директива pcre_jit.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak during reconfiguration if the "pcre_jit" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.13" date="16.01.2012">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры TLSv1.1 и TLSv1.2 в директиве ssl_protocols.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "TLSv1.1" and "TLSv1.2" parameters of the "ssl_protocols" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры директивы limit_req наследовались некорректно;[m
[31m-ошибка появилась в 1.1.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_req" directive parameters were not inherited correctly;[m
[31m-the bug had appeared in 1.1.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_redirect некорректно обрабатывала заголовок Refresh[m
[31m-при использовании регулярных выражений.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directive incorrectly processed "Refresh" header[m
[31m-if regular expression were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_cache_use_stale с параметром error не возвращала ответ из[m
[31m-кэша, если все бэкенды были признаны неработающими.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_use_stale" directive with "error" parameter did not return[m
[31m-answer from cache if there were no live upstreams.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива worker_cpu_affinity могла не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_cpu_affinity" directive might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris;[m
[31m-ошибка появилась в 1.1.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris;[m
[31m-the bug had appeared in 1.1.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.12" date="26.12.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с помощью директивы error_page[m
[31m-директива proxy_pass без URI теперь использует изменённый URI.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part now uses changed URI[m
[31m-after redirection with the "error_page" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy/fastcgi/scgi/uwsgi_cache_lock,[m
[31m-proxy/fastcgi/scgi/uwsgi_cache_lock_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy/fastcgi/scgi/uwsgi_cache_lock",[m
[31m-"proxy/fastcgi/scgi/uwsgi_cache_lock_timeout" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива pcre_jit.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "pcre_jit" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-SSI команда if поддерживает выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" SSI command supports captures in regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSI команда if не работала внутри команды block.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" SSI command did not work inside the "block" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы limit_conn_log_level и limit_req_log_level могли не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_conn_log_level" and "limit_req_log_level" directives might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate не позволяла передавать на полной скорости,[m
[31m-даже если был указан очень большой лимит.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive did not allow to use full throughput,[m
[31m-even if limit value was very high.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива sendfile_max_chunk не работала,[m
[31m-если использовалась директива limit_rate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile_max_chunk" directive did not work,[m
[31m-if the "limit_rate" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве proxy_pass использовались переменные и не был указан URI,[m
[31m-всегда использовался URI исходного запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part always used original request URI[m
[31m-if variables were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с помощью директивы try_files[m
[31m-директива proxy_pass без URI могла использовать URI исходного запроса.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part might use original request[m
[31m-after redirection with the "try_files" directive.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_scgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_scgi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris;[m
[31m-ошибка появилась в 1.1.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris;[m
[31m-the bug had appeared in 1.1.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.11" date="12.12.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр so_keepalive в директиве listen.<br/>[m
[31m-Спасибо Всеволоду Стахову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "so_keepalive" parameter of the "listen" directive.<br/>[m
[31m-Thanks to Vsevolod Stakhov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр if_not_empty в директивах fastcgi/scgi/uwsgi_param.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if_not_empty" parameter of the "fastcgi/scgi/uwsgi_param" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $https.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $https variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_redirect поддерживает переменные в первом параметре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directive supports variables in the first parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_redirect поддерживает регулярные выражения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directive supports regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $sent_http_cache_control могла содержать неверное значение при[m
[31m-использовании директивы expires.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $sent_http_cache_control variable might contain a wrong value if the[m
[31m-"expires" directive was used.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива read_ahead могла не работать при использовании совместно с[m
[31m-try_files и open_file_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "read_ahead" directive might not work combined with "try_files"[m
[31m-and "open_file_cache".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в параметре inactive директивы proxy_cache_path[m
[31m-было указано малое время,[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if small time was used in the "inactive" parameter of[m
[31m-the "proxy_cache_path" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы из кэша могли зависать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-responses from cache might hang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.10" date="30.11.2011">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании AIO на Linux в рабочем процессе происходил segmentation fault;[m
[31m-ошибка появилась в 1.1.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process if AIO was used on Linux;[m
[31m-the bug had appeared in 1.1.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.9" date="28.11.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь двойные кавычки экранируется при выводе SSI-командой echo.<br/>[m
[31m-Спасибо Зауру Абасмирзоеву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now double quotes are encoded in an "echo" SSI-command output.<br/>[m
[31m-Thanks to Zaur Abasmirzoev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр valid в директиве resolver.  По умолчанию теперь[m
[31m-используется TTL, возвращённый DNS-сервером.<br/>[m
[31m-Спасибо Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid" parameter of the "resolver" directive.  By default TTL[m
[31m-returned by a DNS server is used.<br/>[m
[31m-Thanks to Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог перестать отвечать, если рабочий процесс завершался аварийно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might hang after a worker process abnormal termination.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалось SNI;[m
[31m-ошибка появилась в 1.1.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if SNI was used;[m
[31m-the bug had appeared in 1.1.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве keepalive_disable;[m
[31m-ошибка появилась в 1.1.8.<br/>[m
[31m-Спасибо Александру Усову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "keepalive_disable" directive;[m
[31m-the bug had appeared in 1.1.8.<br/>[m
[31m-Thanks to Alexander Usov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сигнал SIGWINCH переставал работать после первого обновления исполняемого[m
[31m-файла;[m
[31m-ошибка появилась в 1.1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SIGWINCH signal did not work after first binary upgrade;[m
[31m-the bug had appeared in 1.1.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь ответы бэкендов, длина которых не соответствует заголовку[m
[31m-Content-Length, не кэширутся.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-backend responses with length not matching "Content-Length" header line[m
[31m-are no longer cached.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве scgi_param при использовании составных параметров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "scgi_param" directive, if complex parameters were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в методе epoll.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "epoll" event method.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_flv_module.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_flv_module.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx понимает IPv6-адреса в строке запроса и в заголовке Host.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-IPv6 addresses are now handled properly in a request line and in a "Host"[m
[31m-request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы add_header и expires не работали для ответов с кодом 206,[m
[31m-если запрос проксировался.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"add_header" and "expires" directives did not work if a request was proxied[m
[31m-and response status code was 206.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на FreeBSD 10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on FreeBSD 10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на AIX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on AIX.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.8" date="14.11.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_limit_zone_module переименован в ngx_http_limit_conn_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_limit_zone_module was renamed to the ngx_http_limit_conn_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива limit_zone заменена директивой limit_conn_zone с новым синтаксисом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_zone" directive was superseded by the "limit_conn_zone" directive[m
[31m-with a new syntax.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка ограничения по нескольким limit_conn на одном уровне.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support for multiple "limit_conn" limits on the same level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_sharpen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_sharpen" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если resolver получил большой DNS-ответ.<br/>[m
[31m-Спасибо Ben Hawkes.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if resolver got a big DNS response.<br/>[m
[31m-Thanks to Ben Hawkes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в вычислении ключа для кэширования,[m
[31m-если использовалась внутренняя реализация MD5;[m
[31m-ошибка появилась в 1.0.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in cache key calculation[m
[31m-if internal MD5 implementation was used;[m
[31m-the bug had appeared in 1.0.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "If-Modified-Since", "If-Range" и им подобные в заголовке запроса[m
[31m-клиента могли передаваться бэкенду при кэшировании; или не передаваться при[m
[31m-выключенном кэшировании, если кэширование было включено в другой части[m
[31m-конфигурации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Modified-Since", "If-Range", etc. client request header lines[m
[31m-might be passed to backend while caching; or not passed without caching[m
[31m-if caching was enabled in another part of the configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module выдавал неверную строку "Content-Length"[m
[31m-в заголовке ответа, использовался аргумент start.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the module ngx_http_mp4_module sent incorrect "Content-Length" response[m
[31m-header line if the "start" argument was used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.7" date="31.10.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка нескольких DNS серверов в директиве "resolver".<br/>[m
[31m-Спасибо Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-support of several DNS servers in the "resolver" directive.<br/>[m
[31m-Thanks to Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на старте или во время переконфигурации происходил segmentation fault,[m
[31m-если директива ssl использовалась на уровне http и не был указан[m
[31m-ssl_certificate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred on start or during reconfiguration[m
[31m-if the "ssl" directive was used at http level and there was[m
[31m-no "ssl_certificate" defined.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-уменьшено потребление памяти при проксировании больших файлов,[m
[31m-если они буферизировались на диск.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-reduced memory consumption while proxying big files[m
[31m-if they were buffered to disk.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовалась директива "proxy_http_version 1.1".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if "proxy_http_version 1.1" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве "expires @time".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "expires @time" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.6" date="17.10.2011">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменение во внутреннем API: теперь при внутреннем редиректе[m
[31m-в именованный location контексты модулей очищаются.<br/>[m
[31m-По запросу Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Change in internal API: now module context data are cleared[m
[31m-while internal redirect to named location.<br/>[m
[31m-Requested by Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь если сервер, описанный в блоке upstream, был признан неработающим,[m
[31m-то после истечения fail_timeout на него будет отправлен только один запрос;[m
[31m-сервер будет считаться работающим, если успешно ответит на этот запрос.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a server in an upstream failed, only one request will be sent to it[m
[31m-after fail_timeout; the server will be considered alive if it will[m
[31m-successfully respond to the request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь символы 0x7F-0xFF в access_log записываются в виде \xXX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the 0x7F-0xFF characters are escaped as \xXX in an access_log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы "proxy/fastcgi/scgi/uwsgi_ignore_headers" теперь поддерживают[m
[31m-значения X-Accel-Limit-Rate, X-Accel-Buffering и X-Accel-Charset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"proxy/fastcgi/scgi/uwsgi_ignore_headers" directives support the following[m
[31m-additional values: X-Accel-Limit-Rate, X-Accel-Buffering, X-Accel-Charset.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение потребления памяти при использовании SSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-decrease of memory consumption if SSL is used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-некоторые UTF-8 символы обрабатывались неправильно.<br/>[m
[31m-Спасибо Алексею Куцу.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some UTF-8 characters were processed incorrectly.<br/>[m
[31m-Thanks to Alexey Kuts.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы модуля ngx_http_rewrite_module, заданные на уровне server,[m
[31m-применялись повторно, если для запроса не находилось ни одного location'а.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_rewrite_module directives specified at "server" level were[m
[31m-executed twice if no matching locations were defined.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании "aio sendfile" могла происходить утечка сокетов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a socket leak might occurred if "aio sendfile" was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании файлового AIO соединения с быстрыми клиентами[m
[31m-могли быть закрыты по истечению send_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-connections with fast clients might be closed after send_timeout[m
[31m-if file AIO was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module не поддерживал перемотку на 32-битных платформах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the module ngx_http_mp4_module did not support seeking on 32-bit platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.5" date="05.10.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы uwsgi_buffering и scgi_buffering.<br/>[m
[31m-Спасибо Peter Smit.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "uwsgi_buffering" and "scgi_buffering" directives.<br/>[m
[31m-Thanks to Peter Smit.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании proxy_cache_bypass могли быть закэшированы[m
[31m-некэшируемые ответы.<br/>[m
[31m-Спасибо John Ferlito.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-non-cacheable responses might be cached if "proxy_cache_bypass" directive[m
[31m-was used.<br/>[m
[31m-Thanks to John Ferlito.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_proxy_module при работе с бэкендами по HTTP/1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in HTTP/1.1 support in the ngx_http_proxy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-закэшированные ответы с пустым телом возвращались некорректно;[m
[31m-ошибка появилась в 0.8.31.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cached responses with an empty body were returned incorrectly;[m
[31m-the bug had appeared in 0.8.31.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы с кодом 201 модуля ngx_http_dav_module были некорректны;[m
[31m-ошибка появилась в 0.8.32.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-201 responses of the ngx_http_dav_module were incorrect;[m
[31m-the bug had appeared in 0.8.32.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве return.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "return" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "ssl_session_cache builtin" происходил[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 1.1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_cache builtin" directive caused segmentation fault;[m
[31m-the bug had appeared in 1.1.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.4" date="20.09.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_upstream_keepalive.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_upstream_keepalive module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_http_version.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_http_version" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_keep_conn.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_keep_conn" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_aio_requests.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_aio_requests" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с файловым AIO,[m
[31m-он не мог запускаться на Linux без поддержки AIO.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built --with-file-aio it could not be run on Linux[m
[31m-kernel which did not support AIO.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок при работе с Linux AIO.[m
[31m-<br/>[m
[31m-Спасибо Hagai Avrahami.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in Linux AIO error processing.[m
[31m-<br/>[m
[31m-Thanks to Hagai Avrahami.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-уменьшено потребление памяти для долгоживущих запросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-reduced memory consumption for long-lived requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module не поддерживал 64-битный MP4-атом co64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the module ngx_http_mp4_module did not support 64-bit MP4 "co64" atom.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.3" date="14.09.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_mp4_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the module ngx_http_mp4_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в Linux AIO, используемым совместно с open_file_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in Linux AIO combined with open_file_cache.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-open_file_cache не обновлял информацию о файле,[m
[31m-если файл был изменён не атомарно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-open_file_cache did not update file info on retest[m
[31m-if file was not atomically changed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на MacOSX 10.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOSX 10.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.2" date="05.09.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь, если суммарный размер всех диапазонов больше размера исходного ответа,[m
[31m-то nginx возвращает только исходный ответ, не обрабатывая диапазоны.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if total size of all ranges is greater than source response size,[m
[31m-then nginx disables ranges and returns just the source response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива max_ranges.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "max_ranges" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_verify_client, ssl_verify_depth и ssl_prefer_server_cipher[m
[31m-могли работать некорректно, если использовался SNI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_verify_client", "ssl_verify_depth", and "ssl_prefer_server_ciphers"[m
[31m-directives might work incorrectly if SNI was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах proxy/fastcgi/scgi/ uwsgi_ignore_client_abort.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy/fastcgi/scgi/uwsgi_ignore_client_abort" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.1" date="22.08.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь загрузчик кэша за каждую итерацию либо обрабатывает число файлов,[m
[31m-указанное в параметре load_files, либо работает не дольше времени,[m
[31m-указанного в параметре loader_threshold.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now cache loader processes either as many files as specified by "loader_files"[m
[31m-parameter or works no longer than time specified by the "loader_threshold"[m
[31m-parameter during each iteration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-SIGWINCH сигнал теперь работает только в режиме демона.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now SIGWINCH signal works only in daemon mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь разделяемые зоны и кэши используют семафоры POSIX на Solaris.<br/>[m
[31m-Спасибо Денису Иванову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now shared zones and caches use POSIX semaphores on Solaris.<br/>[m
[31m-Thanks to Den Ivanov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь на NetBSD поддерживаются accept фильтры.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-accept filters are now supported on NetBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux 3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux 3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в некоторых случаях nginx не использовал сжатие;[m
[31m-ошибка появилась в 1.1.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not use gzipping in some cases;[m
[31m-the bug had appeared in 1.1.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-обработка тела запроса могла быть неверной, если клиент использовал pipelining.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-request body might be processed incorrectly if client used pipelining.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве request_body_in_single_buf.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "request_body_in_single_buf" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах proxy_set_body и proxy_pass_request_body[m
[31m-при использовании SSL-соединения с бэкендом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in "proxy_set_body" and "proxy_pass_request_body" directives[m
[31m-if SSL connection to backend was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx нагружал процессор, если все серверы в upstream'е были помечены[m
[31m-флагом down.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx hogged CPU if all servers in an upstream were marked as "down".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при переконфигурации мог произойти segmentation fault,[m
[31m-если в предыдущей конфигурации был определён, но не использовался[m
[31m-ssl_session_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur during reconfiguration[m
[31m-if ssl_session_cache was defined but not used in previous configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании большого количества backup-серверов[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if many backup servers were used in an upstream.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив fastcgi/scgi/uwsgi_param[m
[31m-со значениями, начинающимися со строки "HTTP_",[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.8.40.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-if "fastcgi/scgi/uwsgi_param" directives were used[m
[31m-with values starting with "HTTP_";[m
[31m-the bug had appeared in 0.8.40.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.1.0" date="01.08.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение времени работы загрузчика кэша.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cache loader run time decrease.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры loader_files, loader_sleep и loader_threshold[m
[31m-директив proxy/fastcgi/scgi/uwsgi_cache_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"loader_files", "loader_sleep", and "loader_threshold" options[m
[31m-of the "proxy/fastcgi/scgi/uwsgi_cache_path" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение времени загрузки конфигураций с большим количеством HTTPS серверов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-loading time decrease of configuration with large number of HTTPS sites.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx поддерживает шифры с обменом ECDHE-ключами.<br/>[m
[31m-Спасибо Adrian Kotelba.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx supports ECDHE key exchange ciphers.<br/>[m
[31m-Thanks to Adrian Kotelba.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива lingering_close.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "lingering_close" directive.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-закрытия соединения для pipelined-запросов.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in closing connection for pipelined requests.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запрещал сжатие при получении значения "gzip;q=0"[m
[31m-в строке "Accept-Encoding" в заголовке запроса клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not disable gzipping if client sent "gzip;q=0" in[m
[31m-"Accept-Encoding" request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-таймаута при небуферизированном проксировании.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in timeout in unbuffered proxied mode.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти при использовании переменных в директиве proxy_pass[m
[31m-при работе с бэкендом по HTTPS.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leaks when a "proxy_pass" directive contains variables and proxies[m
[31m-to an HTTPS backend.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в проверке параметра директивы proxy_pass, заданного переменными.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in parameter validation of a "proxy_pass" directive with variables.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL не работал на QNX.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL did not work on QNX.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL модули не собирались gcc 4.6 без параметра --with-debug.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL modules could not be built by gcc 4.6 without --with-debug option.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.5" date="19.07.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию используются следующие шифры SSL: "HIGH:!aNULL:!MD5".<br/>[m
[31m-Спасибо Rob Stradling.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now default SSL ciphers are "HIGH:!aNULL:!MD5".<br/>[m
[31m-Thanks to Rob Stradling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы referer_hash_max_size и referer_hash_bucket_size.<br/>[m
[31m-Спасибо Witold Filipczyk.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "referer_hash_max_size" and "referer_hash_bucket_size"[m
[31m-directives.<br/>[m
[31m-Thanks to Witold Filipczyk.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $uid_reset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$uid_reset variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Lanshun Zhou.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if a caching was used.<br/>[m
[31m-Thanks to Lanshun Zhou.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования рабочие процессы[m
[31m-могли зациклиться во время переконфигурации;[m
[31m-ошибка появилась в 0.8.48.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes may got caught in an endless loop during reconfiguration,[m
[31m-if a caching was used;[m
[31m-the bug had appeared in 0.8.48.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "stalled cache updating".<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"stalled cache updating" alert.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.4" date="01.06.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь в регулярных выражениях в директиве map можно задать[m
[31m-чувствительность к регистру с помощью префиксов "~" и "~*".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now regular expressions case sensitivity in the "map" directive[m
[31m-is given by prefixes "~" or "~*".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь разделяемые зоны и кэши используют семафоры POSIX на Linux.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now shared zones and caches use POSIX semaphores on Linux.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-сообщения "stalled cache updating".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"stalled cache updating" alert.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http_auth_basic_module;[m
[31m-ошибка появилась в 1.0.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http_auth_basic_module;[m
[31m-the bug had appeared in 1.0.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.3" date="25.05.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic_user_file поддерживает шифрование пароля[m
[31m-методами "$apr1", "{PLAIN}" и "{SSHA}".<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_basic_user_file" directive supports "$apr1", "{PLAIN}",[m
[31m-and "{SSHA}" password encryption methods.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива geoip_org и переменная $geoip_org.<br/>[m
[31m-Спасибо Александру Ускову, Arnaud Granal и Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "geoip_org" directive and $geoip_org variable.<br/>[m
[31m-Thanks to Alexander Uskov, Arnaud Granal, and Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модули ngx_http_geo_module и ngx_http_geoip_module поддерживают[m
[31m-адреса IPv4, отображённые на IPv6 адреса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_geo_module and ngx_http_geoip_module support IPv4 addresses[m
[31m-mapped to IPv6 addresses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проверке адреса IPv4, отображённого на адрес IPv6,[m
[31m-в рабочем процессе происходил segmentation fault,[m
[31m-если директивы access или deny были определены только для адресов IPv6;[m
[31m-ошибка появилась в 0.8.22.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process[m
[31m-during testing IPv4 address mapped to IPv6 address,[m
[31m-if access or deny rules were defined only for IPv6;[m
[31m-the bug had appeared in 0.8.22.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-закэшированный ответ мог быть испорчен, если значения директив[m
[31m-proxy/fastcgi/scgi/uwsgi_cache_bypass и proxy/fastcgi/scgi/ uwsgi_no_cache[m
[31m-были разными;[m
[31m-ошибка появилась в 0.8.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a cached response may be broken if "proxy/fastcgi/scgi/ uwsgi_cache_bypass"[m
[31m-and "proxy/fastcgi/scgi/uwsgi_no_cache" directive values were different;[m
[31m-the bug had appeared in 0.8.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.2" date="10.05.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь разделяемые зоны и кэши используют семафоры POSIX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now shared zones and caches use POSIX semaphores.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в работе параметра rotate директивы image_filter.<br/>[m
[31m-Спасибо Adam Bocim.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "rotate" parameter of the "image_filter" directive.<br/>[m
[31m-Thanks to Adam Bocim.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris;[m
[31m-ошибка появилась в 1.0.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris;[m
[31m-the bug had appeared in 1.0.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.1" date="03.05.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива split_clients использует алгоритм MurmurHash2 из-за[m
[31m-лучшего распределения.<br/>[m
[31m-Спасибо Олегу Мамонтову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "split_clients" directive uses MurmurHash2 algorithm because[m
[31m-of better distribution.<br/>[m
[31m-Thanks to Oleg Mamontov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь длинные строки, начинающиеся с нуля, не считаются ложными[m
[31m-значениями.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now long strings starting with zero are not considered as false values.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию nginx использует значение 511 для listen backlog на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses a default listen backlog value 511 on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $upstream_... можно использовать в SSI и перловом модулях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_... variables may be used in the SSI and perl modules.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx лучше ограничивает размер кэша на диске.<br/>[m
[31m-Спасибо Олегу Мамонтову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx limits better disk cache size.<br/>[m
[31m-Thanks to Oleg Mamontov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при парсинге неправильного IPv4 адреса мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.8.22.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur while parsing incorrect IPv4 address;[m
[31m-the bug had appeared in 0.9.3.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался gcc 4.6 без параметра --with-debug.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by gcc 4.6 without --with-debug option.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris 9 и более ранних;[m
[31m-ошибка появилась в 0.9.3.<br/>[m
[31m-Спасибо Dagobert Michelsen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris 9 and earlier;[m
[31m-the bug had appeared in 0.9.3.<br/>[m
[31m-Thanks to Dagobert Michelsen.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $request_time имела неверные значения, если использовались[m
[31m-подзапросы;[m
[31m-ошибка появилась в 0.8.47.<br/>[m
[31m-Спасибо Игорю А. Валькову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$request_time variable had invalid values if subrequests were used;[m
[31m-the bug had appeared in 0.8.47.<br/>[m
[31m-Thanks to Igor A. Valcov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="1.0.0" date="12.04.2011">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-cache manager мог нагружать процессор после переконфигурации.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a cache manager might hog CPU after reload.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "image_filter crop" неправильно работала в сочетании с[m
[31m-"image_filter rotate 180".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "image_filter crop" directive worked incorrectly coupled with[m
[31m-an "image_filter rotate 180" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "satisfy any" запрещала выдачу пользовательской страницы[m
[31m-для 401 кода.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "satisfy any" directive disabled custom 401 error page.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.7" date="04.04.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь соединения в состоянии keepalive могут быть закрыты преждевременно,[m
[31m-если у воркера нет свободных соединений.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now keepalive connections may be closed premature,[m
[31m-if there are no free worker connections.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр rotate директивы image_filter.<br/>[m
[31m-Спасибо Adam Bocim.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rotate" parameter of the "image_filter" directive.<br/>[m
[31m-Thanks to Adam Bocim.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ситуации, когда бэкенд в директивах fastcgi_pass, scgi_pass или uwsgi_pass[m
[31m-задан выражением и ссылается на описанный upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a case when a backend in "fastcgi_pass", "scgi_pass", or "uwsgi_pass"[m
[31m-directives is given by expression and refers to a defined upstream.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.6" date="21.03.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает регулярные выражения в качестве значения[m
[31m-первого параметра.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports regular expressions as value of the first[m
[31m-parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $time_iso8601 для access_log.<br/>[m
[31m-Спасибо Michael Lustfield.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$time_iso8601 access_log variable.<br/>[m
[31m-Thanks to Michael Lustfield.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.5" date="21.02.2011">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию nginx использует значение -1 для listen backlog[m
[31m-на Linux.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses a default listen backlog value -1 on Linux.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр utf8 в директивах geoip_country и geoip_city.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "utf8" parameter of "geoip_country" and "geoip_city" directives.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-исправление в умолчательной директиве proxy_redirect, если в директиве[m
[31m-proxy_pass не был описан URI.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a default "proxy_redirect" directive if "proxy_pass" directive has no[m
[31m-URI part.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не работала с нестандартными кодами ошибок;[m
[31m-ошибка появилась в 0.8.53.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "error_page" directive did not work with nonstandard error codes;[m
[31m-the bug had appeared in 0.8.53.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.4" date="21.01.2011">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает переменную $hostname.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" directive supports the $hostname variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-494 код для ошибки "Request Header Too Large".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-494 code for "Request Header Too Large" error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.3" date="13.12.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если для пары IPv6-адрес:порт описан только один сервер, то выделения[m
[31m-в регулярных выражениях в директиве server_name не работали.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if there was a single server for given IPv6 address:port pair,[m
[31m-then captures in regular expressions in a "server_name" directive did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под Solaris;[m
[31m-ошибка появилась в 0.9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris;[m
[31m-the bug had appeared in 0.9.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.2" date="06.12.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка строки "If-Unmodified-Since" в заголовке запроса клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Unmodified-Since" client request header line support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-использование accept(), если accept4() не реализован;[m
[31m-ошибка появилась в 0.9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fallback to accept() syscall if accept4() was not implemented;[m
[31m-the issue had appeared in 0.9.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под Cygwin;[m
[31m-ошибка появилась в 0.9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Cygwin;[m
[31m-the bug had appeared in 0.9.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-уязвимости в OpenSSL CVE-2010-4180.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for OpenSSL vulnerability CVE-2010-4180.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.1" date="30.11.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы вида "return CODE message" не работали;[m
[31m-ошибка появилась в 0.9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"return CODE message" directives did not work;[m
[31m-the bug had appeared in 0.9.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.9.0" date="29.11.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива keepalive_disable.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "keepalive_disable" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает переменные в качестве значения определяемой[m
[31m-переменной.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports variables as value of a defined variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает пустые строки в качестве значения первого параметра.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports empty strings as value of the first parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает выражения в первом параметре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports expressions as the first parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-страница руководства nginx(8).<br/>[m
[31m-Спасибо Сергею Осокину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx(8) manual page.<br/>[m
[31m-Thanks to Sergey Osokin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка accept4() в Linux.<br/>[m
[31m-Спасибо Simon Liu.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Linux accept4() support.<br/>[m
[31m-Thanks to Simon Liu.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-устранение предупреждения линкера о "sys_errlist" и "sys_nerr" под Linux;[m
[31m-предупреждение появилось в 0.8.35.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-elimination of Linux linker warning about "sys_errlist" and "sys_nerr";[m
[31m-the warning had appeared in 0.8.35.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы auth_basic[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Михаилу Лалетину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if the "auth_basic" directive was used.<br/>[m
[31m-Thanks to Michail Laletin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с модулем ngx_http_eval_module;[m
[31m-ошибка появилась в 0.8.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with ngx_http_eval_module;[m
[31m-the bug had appeared in 0.8.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.53" date="18.10.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива error_page позволяет менять код статуса у редиректа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "error_page" directive allows to change a status code in a redirect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_disable поддерживает специальную маску degradation.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "gzip_disable" directive supports special "degradation" mask.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании файлового AIO могла происходить утечка сокетов.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a socket leak might occurred if file AIO was used.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в первом сервере не была описана директива listen и нигде явно[m
[31m-не описан сервер по умолчанию, то сервером по умолчанию становился[m
[31m-следующий сервер с директивой listen;[m
[31m-ошибка появилась в 0.8.21.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the first server had no "listen" directive and there was no explicit[m
[31m-default server, then a next server with a "listen" directive became[m
[31m-the default server;[m
[31m-the bug had appeared in 0.8.21.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.52" date="28.09.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx использовал режим SSL для listen сокета, если для него был[m
[31m-установлен любой listen-параметр;[m
[31m-ошибка появилась в 0.8.51.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx used SSL mode for a listen socket if any listen option was set;[m
[31m-the bug had appeared in 0.8.51.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.51" date="27.09.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива secure_link_expires упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "secure_link_expires" directive has been canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-уровень логгирования ошибок resolver'а понижен с уровня alert на error.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a logging level of resolver errors has been lowered from "alert" to "error".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь параметр "ssl" listen-сокета можно устанавливать несколько раз.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a listen socket "ssl" parameter may be set several times.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.50" date="02.09.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы secure_link, secure_link_md5 и secure_link_expires[m
[31m-модуля ngx_http_secure_link_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "secure_link", "secure_link_md5", and "secure_link_expires" directives of[m
[31m-the ngx_http_secure_link_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -q.<br/>[m
[31m-Спасибо Геннадию Махомеду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -q switch.<br/>[m
[31m-Thanks to Gena Makhomed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании кэширования рабочие процессы и могли зациклиться[m
[31m-во время переконфигурации;[m
[31m-ошибка появилась в 0.8.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes may got caught in an endless loop during reconfiguration,[m
[31m-if a caching was used;[m
[31m-the bug had appeared in 0.8.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве gzip_disable.<br/>[m
[31m-Спасибо Derrick Petzold.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "gzip_disable" directive.<br/>[m
[31m-Thanks to Derrick Petzold.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не мог посылать сигналы stop, quit, reopen, reload процессу,[m
[31m-запущенному в другой сессии.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows could not send stop, quit, reopen, and reload signals[m
[31m-to a process run in other session.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.49" date="09.08.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_jpeg_quality поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_jpeg_quality" directive supports variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной $geoip_region_name[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.8.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if the $geoip_region_name variables was used;[m
[31m-the bug had appeared in 0.8.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки, перехваченные error_page, кэшировались только до следующего запроса;[m
[31m-ошибка появилась в 0.8.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors intercepted by error_page were cached only for next request;[m
[31m-the bug had appeared in 0.8.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.48" date="03.08.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию директива server_name имеет значение пустое имя "".<br/>[m
[31m-Спасибо Геннадию Махомеду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "server_name" directive default value is an empty name "".<br/>[m
[31m-Thanks to Gena Makhomed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию директива server_name_in_redirect имеет значение off.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "server_name_in_redirect" directive default value is "off".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $geoip_dma_code, $geoip_area_code и $geoip_region_name.<br/>[m
[31m-Спасибо Christine McGonagle.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $geoip_dma_code, $geoip_area_code, and $geoip_region_name variables.<br/>[m
[31m-Thanks to Christine McGonagle.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass, fastcgi_pass, uwsgi_pass и scgi_pass не наследовались[m
[31m-в блоки limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass", "fastcgi_pass", "uwsgi_pass", and "scgi_pass" directives[m
[31m-were not inherited inside "limit_except" blocks.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache_min_uses, fastcgi_cache_min_uses[m
[31m-uwsgi_cache_min_uses и scgi_cache_min_uses не работали;[m
[31m-ошибка появилась в 0.8.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_min_uses", "fastcgi_cache_min_uses"[m
[31m-"uwsgi_cache_min_uses", and "scgi_cache_min_uses" directives did not work;[m
[31m-the bug had appeared in 0.8.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_split_path_info неверно использовала выделения,[m
[31m-если в выделения попадала только часть URI.<br/>[m
[31m-Спасибо Юрию Тарадаю и Frank Enderle.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_split_path_info" directive used incorrectly captures,[m
[31m-if only parts of an URI were captured.<br/>[m
[31m-Thanks to Yuriy Taraday and Frank Enderle.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива rewrite не экранировала символ ";" при копировании из URI[m
[31m-в аргументы.<br/>[m
[31m-Спасибо Daisuke Murase.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rewrite" directive did not escape a ";" character during copying[m
[31m-from URI to query string.<br/>[m
[31m-Thanks to Daisuke Murase.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_image_filter_module закрывал соединение,[m
[31m-если изображение было больше размера image_filter_buffer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_image_filter_module closed a connection,[m
[31m-if an image was larger than "image_filter_buffer" size.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.47" date="28.07.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $request_time имела неверные значения для подзапросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$request_time variable had invalid values for subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки, перехваченные error_page, не кэшировались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors intercepted by error_page could not be cached.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался параметр max_size, то cache manager мог зациклиться;[m
[31m-ошибка появилась в 0.8.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a cache manager process may got caught in an endless loop,[m
[31m-if max_size parameter was used;[m
[31m-the bug had appeared in 0.8.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.46" date="19.07.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_no_cache, fastcgi_no_cache, uwsgi_no_cache[m
[31m-и scgi_no_cache теперь влияют только на сохранение закэшированного ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "proxy_no_cache", "fastcgi_no_cache", "uwsgi_no_cache", and[m
[31m-"scgi_no_cache" directives affect on a cached response saving only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache_bypass, fastcgi_cache_bypass, uwsgi_cache_bypass[m
[31m-и scgi_cache_bypass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_bypass", "fastcgi_cache_bypass", "uwsgi_cache_bypass",[m
[31m-and "scgi_cache_bypass" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не освобождал память в keys_zone кэшей в случае ошибки работы с[m
[31m-бэкендом: память освобождалась только по истечении времени неактивности[m
[31m-или при недостатке памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not free memory in cache keys zones if there was an error[m
[31m-during working with backend: the memory was freed only after inactivity[m
[31m-time or on memory low condition.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.45" date="13.07.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-улучшения в модуле ngx_http_xslt_filter.<br/>[m
[31m-Спасибо Laurence Rowe.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_xslt_filter improvements.<br/>[m
[31m-Thanks to Laurence Rowe.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ SSI модуля мог передаваться не полностью после команды include[m
[31m-с параметром wait="yes";[m
[31m-ошибка появилась в 0.7.25.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSI response might be truncated after include with wait="yes";[m
[31m-the bug had appeared in 0.7.25.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива listen не поддерживала параметр setfib=0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive did not support the "setfib=0" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.44" date="05.07.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx по умолчанию не кэширует ответы бэкендов,[m
[31m-в заголовке которых есть строка "Set-Cookie".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx does not cache by default backend responses,[m
[31m-if they have a "Set-Cookie" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen поддерживает параметр setfib.<br/>[m
[31m-Спасибо Андрею Филонову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive supports the "setfib" parameter.<br/>[m
[31m-Thanks to Andrew Filonov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива sub_filter могла изменять регистр букв при частичном совпадении.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sub_filter" directive might change character case on partial match.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с HP/UX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with HP/UX.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с компилятором AIX xlC_r.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with AIX xlC_r compiler.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx считал большие пакеты SSLv2 как обычные текстовые запросы.<br/>[m
[31m-Спасибо Miroslaw Jaworski.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx treated large SSLv2 packets as plain requests.<br/>[m
[31m-Thanks to Miroslaw Jaworski.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.43" date="30.06.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ускорение загрузки больших баз geo-диапазонов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large geo ranges base loading speed-up.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-перенаправление ошибки в "location /zero {return 204;}" без изменения[m
[31m-кода ответа оставляло тело ошибки;[m
[31m-ошибка появилась в 0.8.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an error_page redirection to "location /zero {return 204;}" without[m
[31m-changing status code kept the error body;[m
[31m-the bug had appeared in 0.8.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог закрывать IPv6 listen сокет во время переконфигурации.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might close IPv6 listen socket during reconfiguration.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменную $uid_set можно использовать на любой стадии обработки запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $uid_set variable may be used at any request processing stage.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.42" date="21.06.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx проверяет location'ы, заданные регулярными выражениями,[m
[31m-если запрос полностью совпал с location'ом, заданным строкой префикса.[m
[31m-Предыдущее поведение появилось в 0.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx tests locations given by regular expressions,[m
[31m-if request was matched exactly by a location given by a prefix string.[m
[31m-The previous behavior has been introduced in 0.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_scgi_module.<br/>[m
[31m-Спасибо Manlio Perillo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_scgi_module.<br/>[m
[31m-Thanks to Manlio Perillo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в директиве return можно добавлять текст ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a text answer may be added to a "return" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.41" date="15.06.2010">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс nginx/Windows мог завершаться аварийно при запросе файла[m
[31m-с неверной кодировкой UTF-8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows worker might be terminated abnormally if a requested file name[m
[31m-has invalid UTF-8 encoding.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx разрешает использовать пробелы в строке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx allows to use spaces in a request line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_redirect неправильно изменяла строку "Refresh" в заголовке[m
[31m-ответа бэкенда.<br/>[m
[31m-Спасибо Андрею Андрееву и Максиму Согину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect" directive changed incorrectly a backend "Refresh"[m
[31m-response header line.<br/>[m
[31m-Thanks to Andrey Andreew and Max Sogin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал путь без имени хоста в[m
[31m-строке "Destination" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support path without host name[m
[31m-in "Destination" request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.40" date="07.06.2010">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует имя потока файла по умолчанию.<br/>[m
[31m-Спасибо Jose Antonio Vazquez Gonzalez.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores default file stream name.<br/>[m
[31m-Thanks to Jose Antonio Vazquez Gonzalez.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_uwsgi_module.<br/>[m
[31m-Спасибо Roberto De Ioris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_uwsgi_module.<br/>[m
[31m-Thanks to Roberto De Ioris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_param со значением, начинающимся со строки "HTTP_",[m
[31m-изменяет строку заголовка в запросе клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "fastcgi_param" directive with value starting with "HTTP_" overrides[m
[31m-a client request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "If-Modified-Since", "If-Range" и им подобные в заголовке запроса[m
[31m-клиента передавались FastCGI-серверу при кэшировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Modified-Since", "If-Range", etc. client request header lines[m
[31m-were passed to FastCGI-server while caching.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-listen unix domain сокет нельзя было изменить во время переконфигурации.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-listen unix domain socket could not be changed during reconfiguration.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.39" date="31.05.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-наследуемая директива alias неправильно работала во вложенном location'е.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an inherited "alias" directive worked incorrectly in inclusive location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в комбинации директив alias с переменными и try_files;[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in "alias" with variables and "try_files" directives combination.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-listen unix domain и IPv6 сокеты не наследовались во время обновления[m
[31m-без перерыва.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-listen unix domain and IPv6 sockets did not inherit while online upgrade.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.38" date="24.05.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_no_cache и fastcgi_no_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_no_cache" and "fastcgi_no_cache" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании переменной $scheme в директиве rewrite[m
[31m-автоматически делается редирект.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "rewrite" directive does a redirect automatically[m
[31m-if the $scheme variable is used.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь задержки в директиве limit_req соответствует описанному алгоритму.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now "limit_req" delay directive conforms to the described algorithm.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменную $uid_got нельзя было использовать в SSI и перловом модулях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $uid_got variable might not be used in the SSI and perl modules.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.37" date="17.05.2010">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_split_clients_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_split_clients_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает ключи больше 255 символов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports keys more than 255 characters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx игнорировал значения "private" и "no-store" в строке "Cache-Control"[m
[31m-в заголовке ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx ignored the "private" and "no-store" values[m
[31m-in the "Cache-Control" backend response header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр stub в SSI-директиве include не использовался,[m
[31m-если пустой ответ имел код 200.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "stub" parameter of an "include" SSI directive was not used,[m
[31m-if empty response has 200 status code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если проксированный или FastCGI запрос внутренне перенаправлялся[m
[31m-в другой проксированный или FastCGI location,[m
[31m-то в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.8.33.<br/>[m
[31m-Спасибо Yichun Zhang.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a proxied or FastCGI request was internally redirected[m
[31m-to another proxied or FastCGI location,[m
[31m-then a segmentation fault might occur in a worker process;[m
[31m-the bug had appeared in 0.8.33.<br/>[m
[31m-Thanks to Yichun Zhang.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-соединения IMAP к серверу Zimbra могло зависнуть до таймаута.<br/>[m
[31m-Спасибо Alan Batie.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-IMAP connections may hang until they timed out[m
[31m-while talking to Zimbra server.<br/>[m
[31m-Thanks to Alan Batie.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.36" date="22.04.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module неправильно обрабатывал методы DELETE, COPY и MOVE[m
[31m-для симлинков.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module handled incorrectly the DELETE, COPY, and MOVE methods[m
[31m-for symlinks.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль SSI в подзапросах использовал закэшированные в основном запросе[m
[31m-значения переменных $query_string, $arg_... и им подобных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-values of the $query_string, $arg_..., etc. variables cached in main[m
[31m-request were used by the SSI module in subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-значение переменной повторно экранировалось после каждого вывода[m
[31m-SSI-команды echo;[m
[31m-ошибка появилась в 0.6.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a variable value was repeatedly encoded after each[m
[31m-an "echo" SSI-command output;[m
[31m-the bug had appeared in 0.6.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс зависал при запросе файла FIFO.<br/>[m
[31m-Спасибо Vicente Aguilar и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process hung if a FIFO file was requested.<br/>[m
[31m-Thanks to Vicente Aguilar and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL-1.0.0 на 64-битном Linux.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL-1.0.0 compatibility on 64-bit Linux.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http-cache;[m
[31m-ошибка появилась в 0.8.35.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http-cache;[m
[31m-the bug had appeared in 0.8.35.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.35" date="01.04.2010">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь charset-фильтр работает до SSI-фильтра.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the charset filter runs before the SSI filter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива chunked_transfer_encoding.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "chunked_transfer_encoding" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-символ "&amp;" при копировании в аргументы в правилах rewrite не экранировался.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "&amp;" character was not escaped when it was copied in arguments part[m
[31m-in a rewrite rule.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог завершаться аварийно во время обработки сигнала или[m
[31m-при использовании директивы timer_resolution на платформах,[m
[31m-не поддерживающих методы kqueue или eventport.<br/>[m
[31m-Спасибо George Xie и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might be terminated abnormally[m
[31m-while a signal processing or if the directive "timer_resolution" was used[m
[31m-on platforms which do not support kqueue or eventport notification methods.<br/>[m
[31m-Thanks to George Xie and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если временные файлы и постоянное место хранения располагались на разных[m
[31m-файловых системах, то у постоянных файлов время изменения было неверным.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if temporary files and permanent storage area resided at different[m
[31m-file systems, then permanent file modification times were incorrect.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_memcached_module мог выдавать ошибку "memcached sent invalid[m
[31m-trailer".<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_memcached_module might issue the error message "memcached sent invalid[m
[31m-trailer".<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не мог собрать библиотеку zlib-1.2.4 из исходных текстов.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not built zlib-1.2.4 library using the library sources.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе происходил segmentation fault,[m
[31m-если перед ответом FastCGI-сервера было много вывода в stderr;[m
[31m-ошибка появилась в 0.8.34.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process,[m
[31m-if there was large stderr output before FastCGI response;[m
[31m-the bug had appeared in 0.8.34.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.34" date="03.03.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал все шифры, используемые в клиентских сертификатах.<br/>[m
[31m-Спасибо Иннокентию Еникееву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support all ciphers and digests used in client certificates.<br/>[m
[31m-Thanks to Innocenty Enikeew.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неправильно кэшировал FastCGI-ответы, если перед ответом было[m
[31m-много вывода в stderr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx cached incorrectly FastCGI responses if there was large stderr output[m
[31m-before response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал HTTPS-рефереры.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support HTTPS referrers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог не находить файлы, если путь в конфигурации был задан[m
[31m-в другом регистре;[m
[31m-ошибка появилась в 0.8.33.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might not find file if path in configuration was given[m
[31m-in other character case;[m
[31m-the bug had appeared in 0.8.33.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $date_local выдавала неверное время,[m
[31m-если использовался формат "%s".<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $date_local variable has an incorrect value,[m
[31m-if the "%s" format was used.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ssl_session_cache не был установлен или установлен в none,[m
[31m-то при проверке клиентского сертификаты могла происходить[m
[31m-ошибка "session id context uninitialized";[m
[31m-ошибка появилась в 0.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if ssl_session_cache was not set or was set to "none",[m
[31m-then during client certificate verify[m
[31m-the error "session id context uninitialized" might occur;[m
[31m-the bug had appeared in 0.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-geo-диапазон возвращал значение по умолчанию, если диапазон включал[m
[31m-в себя одну и более сетей размером /16 и не начинался на границе сети[m
[31m-размером /16.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a geo range returned default value if the range included two or more[m
[31m-/16 networks and did not begin at /16 network boundary.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-блок, используемый в параметре stub в SSI-директиве include,[m
[31m-выводился с MIME-типом "text/plain".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a block used in a "stub" parameter of an "include" SSI directive[m
[31m-was output with "text/plain" MIME type.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-$r->sleep() не работал;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$r->sleep() did not work;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.33" date="01.02.2010">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует пробелы в конце URI.<br/>[m
[31m-Спасибо Dan Crowley, Core Security Technologies.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores trailing spaces in URI.<br/>[m
[31m-Thanks to Dan Crowley, Core Security Technologies.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует короткие имена файлов.<br/>[m
[31m-Спасибо Dan Crowley, Core Security Technologies.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores short files names.<br/>[m
[31m-Thanks to Dan Crowley, Core Security Technologies.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь keepalive соединения после запросов POST не запрещаются для[m
[31m-MSIE 7.0+.<br/>[m
[31m-Спасибо Adam Lounds.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now keepalive connections after POST requests are not disabled for[m
[31m-MSIE 7.0+.<br/>[m
[31m-Thanks to Adam Lounds.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-теперь keepalive соединения запрещены для Safari.<br/>[m
[31m-Спасибо Joshua Sierles.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now keepalive connections are disabled for Safari.<br/>[m
[31m-Thanks to Joshua Sierles.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если проксированный или FastCGI запрос внутренне перенаправлялся[m
[31m-в другой проксированный или FastCGI location, то переменная[m
[31m-$upstream_response_time могла иметь ненормально большое значение;[m
[31m-ошибка появилась в 0.8.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a proxied or FastCGI request was internally redirected[m
[31m-to another proxied or FastCGI location,[m
[31m-then $upstream_response_time variable may have abnormally large value;[m
[31m-the bug had appeared in 0.8.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault[m
[31m-при отбрасывания тела запроса;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-while discarding a request body;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.32" date="11.01.2010">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании кодировки UTF-8 в ngx_http_autoindex_module.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-UTF-8 encoding usage in the ngx_http_autoindex_module.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-именованные выделения в регулярных выражениях работали только для[m
[31m-двух переменных.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expression named captures worked for two names only.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь в строке заголовка запроса "Host" используется имя "localhost",[m
[31m-если в директиве auth_http указан unix domain сокет.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "localhost" name is used in the "Host" request header line,[m
[31m-if an unix domain socket is defined in the "auth_http" directive.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал передачу chunk'ами для 201-ых ответов.<br/>[m
[31m-Спасибо Julian Reich.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support chunked transfer encoding for 201 responses.<br/>[m
[31m-Thanks to Julian Reich.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если директива "expires modified" выставляла дату в прошлом, то в строке[m
[31m-заголовка ответа "Cache-Control" выдавалось отрицательное число.<br/>[m
[31m-Спасибо Алексею Капранову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "expires modified" set date in the past, then a negative number[m
[31m-was set in the "Cache-Control" response header line.<br/>[m
[31m-Thanks to Alex Kapranoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.31" date="23.12.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива error_page может перенаправлять ответы со статусом 301 и 302.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "error_page" directive may redirect the 301 and 302 responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $geoip_city_continent_code, $geoip_latitude и $geoip_longitude.<br/>[m
[31m-Спасибо Arvind Sundararajan.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $geoip_city_continent_code, $geoip_latitude, and $geoip_longitude[m
[31m-variables.<br/>[m
[31m-Thanks to Arvind Sundararajan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_image_filter_module теперь всегда удаляет[m
[31m-EXIF и другие данные, если они занимают больше 5% в JPEG-файле.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_image_filter_module deletes always EXIF and other[m
[31m-application specific data if the data consume more than 5% of a JPEG file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx закрывал соединение при запросе закэшированного[m
[31m-ответа с пустым телом.<br/>[m
[31m-Спасибо Piotr Sikora.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx closed a connection if a cached response had an empty body.<br/>[m
[31m-Thanks to Piotr Sikora.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог не собираться gcc 4.x при использовании оптимизации -O2 и выше.<br/>[m
[31m-Спасибо Максиму Дунину и Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might not be built by gcc 4.x if the -O2 or higher optimization option[m
[31m-was used.<br/>[m
[31m-Thanks to Maxim Dounin and Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-регулярные выражения в location всегда тестировались с учётом регистра;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expressions in location were always tested in case-sensitive mode;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx кэшировал 304 ответ, если в заголовке проксируемого запроса[m
[31m-была строка "If-None-Match".<br/>[m
[31m-Спасибо Tim Dettrick и David Kostal.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx cached a 304 response if there was the "If-None-Match" header line[m
[31m-in a proxied request.<br/>[m
[31m-Thanks to Tim Dettrick and David Kostal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows пытался дважды удалить временный файл[m
[31m-при перезаписи уже существующего файла.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows tried to delete a temporary file twice[m
[31m-if the file should replace an already existent file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.30" date="15.12.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию размер буфера директивы large_client_header_buffers[m
[31m-равен 8K.<br/>[m
[31m-Спасибо Andrew Cholakian.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the default buffer size of the "large_client_header_buffers"[m
[31m-directive is 8K.<br/>[m
[31m-Thanks to Andrew Cholakian.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-файл conf/fastcgi.conf для простых конфигураций FastCGI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the conf/fastcgi.conf for simple FastCGI configurations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows пытался дважды переименовать временный файл[m
[31m-при перезаписи уже существующего файла.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows tried to rename a temporary file twice if the file[m
[31m-should replace an already existent file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки double free or corruption, возникающей, если имя хоста не было найдено;[m
[31m-ошибка появилась в 0.8.22.<br/>[m
[31m-Спасибо Константину Свисту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of "double free or corruption" error issued if host could not be resolved;[m
[31m-the bug had appeared in 0.8.22.<br/>[m
[31m-Thanks to Konstantin Svist.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании libatomic на некоторых платформах.<br/>[m
[31m-Спасибо W-Mark Kubacki.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in libatomic usage on some platforms.<br/>[m
[31m-Thanks to W-Mark Kubacki.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.29" date="30.11.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь для проксируемых ответов HTTP/0.9 в лог пишется код ответа "009".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "009" status code is written to an access log for proxied HTTP/0.9[m
[31m-responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы addition_types, charset_types, gzip_types, ssi_types,[m
[31m-sub_filter_types и xslt_types поддерживают параметр "*".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "addition_types", "charset_types", "gzip_types", "ssi_types",[m
[31m-"sub_filter_types", and "xslt_types" directives support an "*" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-использование встроенных атомарных операций GCC 4.1+.<br/>[m
[31m-Спасибо W-Mark Kubacki.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-GCC 4.1+ built-in atomic operations usage.<br/>[m
[31m-Thanks to W-Mark Kubacki.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр --with-libatomic[=DIR] в configure.<br/>[m
[31m-Спасибо W-Mark Kubacki.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --with-libatomic[=DIR] option in the configure.<br/>[m
[31m-Thanks to W-Mark Kubacki.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-listen unix domain сокет имели ограниченные права доступа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-listen unix domain socket had limited access rights.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-закэшированные ответы ответов HTTP/0.9 неправильно обрабатывались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-cached HTTP/0.9 responses were handled incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-именованные выделения в регулярных выражениях, заданные как "?P&lt;...&gt;",[m
[31m-не работали в директиве server_name.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expression named captures given by "?P&lt;...&gt;" did not work[m
[31m-in a "server_name" directive.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.28" date="23.11.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-pcre;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the --without-pcre parameter;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.27" date="17.11.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-регулярные выражения не работали в nginx/Windows;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expressions did not work in nginx/Windows;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.26" date="16.11.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании выделений в директиве rewrite;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in captures usage in "rewrite" directive;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без параметра --with-debug;[m
[31m-ошибка появилась в 0.8.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without the --with-debug option;[m
[31m-the bug had appeared in 0.8.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.25" date="16.11.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь в лог ошибок не пишется сообщение, если переменная не найдена[m
[31m-с помощью метода $r->variable().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now no message is written in an error log if a variable is not found by[m
[31m-$r->variable() method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_degradation_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_degradation_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-именованные выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regular expression named captures.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании переменных в директиве proxy_pass не требуется[m
[31m-задавать URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now URI part is not required a "proxy_pass" directive if variables are used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива msie_padding работает и для Chrome.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "msie_padding" directive works for Chrome too.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе происходил segmentation fault при недостатке памяти;[m
[31m-ошибка появилась в 0.8.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a worker process on low memory condition;[m
[31m-the bug had appeared in 0.8.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx передавал сжатые ответы клиентам, не поддерживающим сжатие,[m
[31m-при настройках gzip_static on и gzip_vary off;[m
[31m-ошибка появилась в 0.8.16.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx sent gzipped responses to clients those do not support gzip,[m
[31m-if "gzip_static on" and "gzip_vary off";[m
[31m-the bug had appeared in 0.8.16.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.24" date="11.11.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx всегда добавлял строку "Content-Encoding: gzip" в заголовок[m
[31m-304-ых ответов модуля ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx always added "Content-Encoding: gzip" response header line[m
[31m-in 304 responses sent by ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без параметра --with-debug;[m
[31m-ошибка появилась в 0.8.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without the --with-debug option;[m
[31m-the bug had appeared in 0.8.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр "unix:" в директиве set_real_ip_from неправильно наследовался[m
[31m-с предыдущего уровня.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "unix:" parameter of the "set_real_ip_from" directive inherited[m
[31m-incorrectly from previous level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в resolver'е при определении пустого имени.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in resolving empty name.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.23" date="11.11.2009">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь SSL/TLS renegotiation запрещён.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now SSL/TLS renegotiation is disabled.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-listen unix domain сокет не наследовался во время обновления без перерыва.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-listen unix domain socket did not inherit while online upgrade.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр "unix:" в директиве set_real_ip_from не работал без ещё[m
[31m-одной директивы с любым IP-адресом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "unix:" parameter of the "set_real_ip_from" directive did not without[m
[31m-yet another directive with any IP address.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-segmentation fault и зацикливания в resolver'е.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault and infinite looping in resolver.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в resolver'е.<br/>[m
[31m-Спасибо Артёму Бохану.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in resolver.<br/>[m
[31m-Thanks to Artem Bokhan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.22" date="03.11.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_bind, fastcgi_bind и memcached_bind.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_bind", "fastcgi_bind", and "memcached_bind" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы access и deny поддерживают IPv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access" and the "deny" directives support IPv6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива set_real_ip_from поддерживает IPv6 адреса в заголовках запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set_real_ip_from" directive supports IPv6 addresses in request headers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр "unix:" в директиве set_real_ip_from.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "unix:" parameter of the "set_real_ip_from" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не удалял unix domain сокет после тестирования конфигурации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not delete unix domain socket after configuration testing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx удалял unix domain сокет во время обновления без перерыва.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx deleted unix domain socket while online upgrade.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-оператор "!-x" не работал.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "!-x" operator did not work.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault[m
[31m-при использовании limit_rate в HTTPS сервере.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if limit_rate was used in HTTPS server.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при записи в лог переменной $limit_rate[m
[31m-в рабочем процессе происходил segmentation fault.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process[m
[31m-while $limit_rate logging.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если внутри блока server не было директивы listen;[m
[31m-ошибка появилась в 0.8.21.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in a worker process,[m
[31m-if there was no "listen" directive in "server" block;[m
[31m-the bug had appeared in 0.8.21.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.21" date="26.10.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь ключ -V показывает статус поддержки TLS SNI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "-V" switch shows TLS SNI support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen модуля HTTP поддерживает unix domain сокеты.<br/>[m
[31m-Спасибо Hongli Lai.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive of the HTTP module supports unix domain sockets.<br/>[m
[31m-Thanks to Hongli Lai.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр "default_server" в директиве listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "default_server" parameter of the "listen" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь параметр "default" не обязателен для установки параметров listen-сокета.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a "default" parameter is not required to set listen socket options.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал даты в 2038 году на 32-битных платформах;[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support dates in 2038 year on 32-bit platforms;[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.20" date="14.10.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию используются следующие шифры SSL: "HIGH:!ADH:!MD5".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now default SSL ciphers are "HIGH:!ADH:!MD5".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module не показывал последний слэш для линков[m
[31m-на каталоги;[m
[31m-ошибка появилась в 0.7.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not show the trailing slash in links to[m
[31m-a directory;[m
[31m-the bug had appeared in 0.7.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не закрывал лог, заданный параметром конфигурации --error-log-path;[m
[31m-ошибка появилась в 0.7.53.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not close a log file set by the --error-log-path configuration option;[m
[31m-the bug had appeared in 0.7.53.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не считал запятую разделителем в строке "Cache-Control" в[m
[31m-заголовке ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not treat a comma as separator in the "Cache-Control" backend response[m
[31m-header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows мог не создать временный файл, файл в кэше или файл[m
[31m-с помощью директив proxy/fastcgi_store, если рабочий процесс не имел[m
[31m-достаточно прав для работы с каталогами верхнего уровня.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows might not create temporary file, a cache file, or[m
[31m-"proxy/fastcgi_store"d file if a worker had no enough access rights[m
[31m-for top level directories.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "Set-Cookie" и "P3P" в заголовке ответа FastCGI-сервера не скрывались[m
[31m-при кэшировании, если не использовались директивы fastcgi_hide_header[m
[31m-с любыми параметрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Set-Cookie" and "P3P" FastCGI response header lines were not hidden[m
[31m-while caching if no "fastcgi_hide_header" directives were used with[m
[31m-any parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неверно считал размер кэша на диске.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx counted incorrectly disk cache size.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.19" date="06.10.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь протокол SSLv2 по умолчанию запрещён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now SSLv2 protocol is disabled by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию используются следующие шифры SSL:[m
[31m-"ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now default SSL ciphers are "ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива limit_req не работала;[m
[31m-ошибка появилась в 0.8.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "limit_req" directive did not work;[m
[31m-the bug had appeared in 0.8.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.18" date="06.10.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива read_ahead.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "read_ahead" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно использовать несколько директив perl_modules.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now several "perl_modules" directives may be used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы limit_req_log_level и limit_conn_log_level.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_req_log_level" and "limit_conn_log_level" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь директива limit_req соответствует алгоритму leaky bucket.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now "limit_req" directive conforms to the leaky bucket algorithm.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на Linux/sparc.<br/>[m
[31m-Спасибо Marcus Ramberg.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on Linux/sparc.<br/>[m
[31m-Thanks to Marcus Ramberg.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx слал символ '\0' в строке "Location" в заголовке в ответе на запрос[m
[31m-MKCOL.<br/>[m
[31m-Спасибо Xie Zhenye.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx sent '\0' in a "Location" response header line on MKCOL request.<br/>[m
[31m-Thanks to Xie Zhenye.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-вместо кода ответа 499 в лог записывался код 0;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-zero status code was logged instead of 499 status code;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.17" date="28.09.2009">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-теперь символы "/../" запрещены в строке "Destination" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now "/../" are disabled in "Destination" request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь значение переменной $host всегда в нижнем регистре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now $host variable value is always low case.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_session_id.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_session_id variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.16" date="22.09.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_transparency.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_transparency" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "addition_types" была неверно названа "addtion_types".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"addition_types" directive was incorrectly named "addtion_types".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-порчи кэша resolver'а.<br/>[m
[31m-Спасибо Matthew Dempsky.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-resolver cache poisoning.<br/>[m
[31m-Thanks to Matthew Dempsky.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти в resolver'е.<br/>[m
[31m-Спасибо Matthew Dempsky.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak in resolver.<br/>[m
[31m-Thanks to Matthew Dempsky.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-неверная строка запроса в переменной $request записывалась в access_log[m
[31m-только при использовании error_log на уровне info или debug.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-invalid request line in $request variable was written in access_log[m
[31m-only if error_log was set to "info" or "debug" level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в поддержке альфа-канала PNG в модуле ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in PNG alpha-channel support in the ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx всегда добавлял строку "Vary: Accept-Encoding" в заголовок ответа,[m
[31m-если обе директивы gzip_static и gzip_vary были включены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx always added "Vary: Accept-Encoding" response header line,[m
[31m-if both "gzip_static" and "gzip_vary" were on.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в поддержке кодировки UTF-8 директивой try_files в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in UTF-8 encoding support by "try_files" directive in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании post_action;[m
[31m-ошибка появилась в 0.8.11.<br/>[m
[31m-Спасибо Игорю Артемьеву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in "post_action" directive usage;[m
[31m-the bug had appeared in 0.8.11.<br/>[m
[31m-Thanks to Igor Artemiev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.15" date="14.09.2009">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при обработке специально созданного запроса[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Chris Ries.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-while specially crafted request handling.<br/>[m
[31m-Thanks to Chris Ries.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если были описаны имена .domain.tld, .sub.domain.tld и .domain-some.tld,[m
[31m-то имя .sub.domain.tld попадало под маску .domain.tld.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if names .domain.tld, .sub.domain.tld, and .domain-some.tld were defined,[m
[31m-then the name .sub.domain.tld was matched by .domain.tld.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в поддержке прозрачности в модуле ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in transparency support in the ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в файловом AIO.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in file AIO.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании X-Accel-Redirect;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in X-Accel-Redirect usage;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании встроенного перла;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in embedded perl module;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.14" date="07.09.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-устаревший закэшированный запрос мог залипнуть в состоянии "UPDATING".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an expired cached response might stick in the "UPDATING" state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании error_log на уровне info или debug[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Сергею Боченкову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if error_log was set to info or debug level.<br/>[m
[31m-Thanks to Sergey Bochenkov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании встроенного перла;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in embedded perl module;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не перенаправляла ошибку 413;[m
[31m-ошибка появилась в 0.6.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "error_page" directive did not redirect a 413 error;[m
[31m-the bug had appeared in 0.6.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.13" date="31.08.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве "aio sendfile";[m
[31m-ошибка появилась в 0.8.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "aio sendfile" directive;[m
[31m-the bug had appeared in 0.8.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без параметра --with-file-aio на FreeBSD;[m
[31m-ошибка появилась в 0.8.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without the --with-file-aio option on FreeBSD;[m
[31m-the bug had appeared in 0.8.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.12" date="31.08.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр sendfile в директиве aio во FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile" parameter in the "aio" directive on FreeBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании try_files;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in try_files;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании memcached;[m
[31m-ошибка появилась в 0.8.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memcached;[m
[31m-the bug had appeared in 0.8.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-<changes ver="0.8.11" date="28.08.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива "gzip_disable msie6" не запрещает сжатие для[m
[31m-<nobr>MSIE 6.0 SV1.</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now directive "gzip_disable msie6" does not disable gzipping for[m
[31m-<nobr>MSIE 6.0 SV1.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка файлового AIO во FreeBSD и Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-file AIO support on FreeBSD and Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio_alignment.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio_alignment" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.10" date="24.08.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечек памяти при использовании базы GeoIP City.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leaks if GeoIP City database was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при копировании временных файлов в постоянное место хранения;[m
[31m-ошибка появилась в 0.8.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in copying temporary files to permanent storage area;[m
[31m-the bug had appeared in 0.8.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.9" date="17.08.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь стартовый загрузчик кэша работает в отдельном процесс;[m
[31m-это должно улучшить обработку больших кэшей.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the start cache loader runs in a separate process;[m
[31m-this should improve large caches handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь временные файлы и постоянное место хранения могут располагаться[m
[31m-на разных файловых системах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now temporary files and permanent storage area may reside at[m
[31m-different file systems.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.8" date="10.08.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке заголовков ответа, разделённых в FastCGI-записях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in handling FastCGI headers split in records.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если запрос обрабатывался в двух проксированных или FastCGI location'ах[m
[31m-и в первом из них использовалось кэширование,[m
[31m-то в рабочем процессе происходил segmentation fault;[m
[31m-ошибка появилась в 0.8.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if a request was handled in two proxied or FastCGIed locations[m
[31m-and a caching was enabled in the first location;[m
[31m-the bug had appeared in 0.8.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.7" date="27.07.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-минимальная поддерживаемая версия OpenSSL&mdash;0.9.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-minimum supported OpenSSL version is 0.9.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр ask директивы ssl_verify_client изменён на параметр optional[m
[31m-и теперь он проверяет клиентский сертификат, если он был предложен.<br/>[m
[31m-Спасибо Brice Figureau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ask" parameter of the "ssl_verify_client" directive was changed[m
[31m-to the "optional" parameter and now it checks a client certificate if it was[m
[31m-offered.<br/>[m
[31m-Thanks to Brice Figureau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_client_verify.<br/>[m
[31m-Спасибо Brice Figureau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_verify variable.<br/>[m
[31m-Thanks to Brice Figureau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_crl.<br/>[m
[31m-Спасибо Brice Figureau.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_crl" directive.<br/>[m
[31m-Thanks to Brice Figureau.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр proxy директивы geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy" parameter of the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter поддерживает переменные для задания размеров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter" directive supports variables for setting size.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-использование переменной $ssl_client_cert портило память;[m
[31m-ошибка появилась в 0.7.7.<br/>[m
[31m-Спасибо Сергею Журавлёву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_cert variable usage corrupted memory;[m
[31m-the bug had appeared in 0.7.7.<br/>[m
[31m-Thanks to Sergey Zhuravlev.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass_header и fastcgi_pass_header" не передавали клиенту[m
[31m-строки "X-Accel-Redirect", "X-Accel-Limit-Rate", "X-Accel-Buffering" и[m
[31m-"X-Accel-Charset" из заголовка ответа бэкенда.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"proxy_pass_header" and "fastcgi_pass_header" directives did not pass to[m
[31m-a client the "X-Accel-Redirect", "X-Accel-Limit-Rate", "X-Accel-Buffering",[m
[31m-and "X-Accel-Charset" lines from backend response header.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке строк "Last-Modified" и "Accept-Ranges" в заголовке ответа бэкенда;[m
[31m-ошибка появилась в 0.7.44.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in handling "Last-Modified" and "Accept-Ranges" backend response header lines;[m
[31m-the bug had appeared in 0.7.44.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "[alert] zero size buf" при получении пустых ответы в подзапросах;[m
[31m-ошибка появилась в 0.8.5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error if subrequest returns an empty response;[m
[31m-the bug had appeared in 0.8.5.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.6" date="20.07.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_geoip_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_geoip_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-XSLT-фильтр мог выдавать ошибку "not well formed XML document" для[m
[31m-правильного документа.<br/>[m
[31m-Спасибо Kuramoto Eiji.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-XSLT filter may fail with message "not well formed XML document"[m
[31m-for valid XML document.<br/>[m
[31m-Thanks to Kuramoto Eiji.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в MacOSX, Cygwin и nginx/Windows при проверке location'ов, заданных[m
[31m-регулярным выражением, теперь всегда делается сравнение без учёта[m
[31m-регистра символов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now in MacOSX, Cygwin, and nginx/Windows locations given by a regular[m
[31m-expression are always tested in case insensitive mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx/Windows игнорирует точки в конце URI.<br/>[m
[31m-Спасибо Hugo Leisink.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx/Windows ignores trailing dots in URI.<br/>[m
[31m-Thanks to Hugo Leisink.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-имя файла указанного в --conf-path игнорировалось при установке;[m
[31m-ошибка появилась в 0.6.6.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-name of file specified in --conf-path was not honored during installation;[m
[31m-the bug had appeared in 0.6.6.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.5" date="13.07.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx разрешает подчёркивания в методе запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx allows underscores in a request method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTP Basic-аутентификации на Windows[m
[31m-для неверных имени/пароля возвращалась 500-ая ошибка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a 500 error code was returned for invalid login/password while HTTP[m
[31m-Basic authentication on Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы модуля ngx_http_perl_module не работали в подзапросах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module responses did not work in subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_limit_req_module.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in ngx_http_limit_req_module.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.4" date="22.06.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http-cache;[m
[31m-ошибка появилась в 0.8.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http-cache;[m
[31m-the bug had appeared in 0.8.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.3" date="19.06.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_cache_status.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_cache_status variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на MacOSX 10.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOSX 10.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http-cache;[m
[31m-ошибка появилась в 0.8.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http-cache;[m
[31m-the bug had appeared in 0.8.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался перехват 401 ошибки от бэкенда и бэкенд[m
[31m-не возвращал строку "WWW-Authenticate" в заголовке ответа,[m
[31m-то в рабочем процессе происходил segmentation fault.<br/>[m
[31m-Спасибо Евгению Мычло.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if a backend 401 error was intercepted and the backend did not set[m
[31m-the "WWW-Authenticate" response header line.<br/>[m
[31m-Thanks to Eugene Mychlo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.2" date="15.06.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во взаимодействии open_file_cache и proxy/fastcgi кэша на старте.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in open_file_cache and proxy/fastcgi cache interaction on start up.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-open_file_cache мог кэшировать открытые файлы очень долго;[m
[31m-ошибка появилась в 0.7.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-open_file_cache might cache open file descriptors too long;[m
[31m-the bug had appeared in 0.7.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.1" date="08.06.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр updating в директивах proxy_cache_use_stale и fastcgi_cache_use_stale.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "updating" parameter in "proxy_cache_use_stale" and[m
[31m-"fastcgi_cache_use_stale" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "If-Modified-Since", "If-Range" и им подобные в заголовке запроса[m
[31m-клиента передавались бэкенду при кэшировании, если не использовалась[m
[31m-директива proxy_set_header с любыми параметрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Modified-Since", "If-Range", etc. client request header lines[m
[31m-were passed to backend while caching if no "proxy_set_header" directive[m
[31m-was used with any parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки "Set-Cookie" и "P3P" в заголовке ответа бэкенда не скрывались[m
[31m-при кэшировании, если не использовались директивы[m
[31m-proxy_hide_header/fastcgi_hide_header с любыми параметрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Set-Cookie" and "P3P" response header lines were not hidden while caching[m
[31m-if no "proxy_hide_header/fastcgi_hide_header" directives were used with[m
[31m-any parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_image_filter_module не понимал формат GIF87a.<br/>[m
[31m-Спасибо Денису Ильиных.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_image_filter_module did not support GIF87a format.<br/>[m
[31m-Thanks to Denis Ilyinyh.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris 10 и более ранних;[m
[31m-ошибка появилась в 0.7.56.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built modules on Solaris 10 and early;[m
[31m-the bug had appeared in 0.7.56.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.8.0" date="02.06.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива keepalive_requests.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "keepalive_requests" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate_after.<br/>[m
[31m-Спасибо Ivan Debnar.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate_after" directive.<br/>[m
[31m-Thanks to Ivan Debnar.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-XSLT-фильтр не работал в подзапросах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-XLST filter did not work in subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-обработке относительных путей в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in relative paths handling in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в proxy_store, fastcgi_store, proxy_cache и fastcgi_cache в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in proxy_store, fastcgi_store, proxy_cache, and fastcgi_cache in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке ошибок выделения памяти.<br/>[m
[31m-Спасибо Максиму Дунину и Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation error handling.<br/>[m
[31m-Thanks to Maxim Dounin and Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.59" date="25.05.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_cache_methods и fastcgi_cache_methods.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_methods" and "fastcgi_cache_methods" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.7.25.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.7.25.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной $request_body[m
[31m-в рабочем процессе происходил segmentation fault,[m
[31m-если в запросе не было тела;[m
[31m-ошибка появилась в 0.7.58.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-<nobr>if a request</nobr> had no body and the $request_body[m
[31m-variable was used;<br/>[m
[31m-the bug had appeared in 0.7.58.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSL-модули могли не собираться на Solaris и Linux;[m
[31m-ошибка появилась в 0.7.56.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the SSL modules might not built on Solaris and Linux;<br/>[m
[31m-the bug had appeared in 0.7.56.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы модуля ngx_http_xslt_filter_module не обрабатывались[m
[31m-SSI-, charset- и gzip-фильтрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_xslt_filter_module responses were not handled by SSI, charset,[m
[31m-and gzip filters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива charset не ставила кодировку для ответов модуля[m
[31m-ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "charset" directive did not set a charset to ngx_http_gzip_static_module[m
[31m-responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.58" date="18.05.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen почтового прокси-сервера поддерживает IPv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "listen" directive of the mail proxy module supports IPv6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива image_filter_jpeg_quality.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "image_filter_jpeg_quality" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива client_body_in_single_buffer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "client_body_in_single_buffer" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $request_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_body variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_autoindex_module в ссылках на имена файлов,[m
[31m-содержащих символ ":".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in ngx_http_autoindex_module in file name links[m
[31m-having a ":" symbol in the name.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-процедура "make upgrade" не работала;[m
[31m-ошибка появилась в 0.7.53.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"make upgrade" procedure did not work;[m
[31m-the bug had appeared in 0.7.53.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.57" date="12.05.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении ошибок модуля ngx_http_image_filter_module[m
[31m-в именованный location в рабочем процессе происходил floating-point fault;[m
[31m-ошибка появилась в 0.7.56.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a floating-point fault occurred in worker process,[m
[31m-if the ngx_http_image_filter_module errors were redirected to named location;[m
[31m-the bug had appeared in 0.7.56.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.56" date="11.05.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows поддерживает IPv6 в директиве listen модуля HTTP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows supports IPv6 in a "listen" directive of the HTTP module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.55" date="06.05.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры http_XXX в директивах proxy_cache_use_stale[m
[31m-и fastcgi_cache_use_stale не работали.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the http_XXX parameters in "proxy_cache_use_stale" and[m
[31m-"fastcgi_cache_use_stale" directives did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-fastcgi кэш не кэшировал ответы, состоящие только из заголовка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fastcgi cache did not cache header only responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "select() failed (9: Bad file descriptor)" в nginx/Unix[m
[31m-и "select() failed (10038: ...)" в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of "select() failed (9: Bad file descriptor)" error in nginx/Unix[m
[31m-and "select() failed (10038: ...)" error in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы debug_connection[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.7.54.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if an "debug_connection" directive was used;[m
[31m-the bug had appeared in 0.7.54.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в сборке модуля ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fix ngx_http_image_filter_module building errors.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-файлы больше 2G не передавались с использованием $r->sendfile.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files bigger than 2G could not be transferred using $r->sendfile.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.54" date="01.05.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_image_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ignore_headers и fastcgi_ignore_headers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ignore_headers" and "fastcgi_ignore_headers" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменных "open_file_cache_errors on"[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.7.53.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if an "open_file_cache_errors off" directive was used;[m
[31m-the bug had appeared in 0.7.53.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "port_in_redirect off" не работала;[m
[31m-ошибка появилась в 0.7.39.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "port_in_redirect off" directive did not work;[m
[31m-the bug had appeared in 0.7.39.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-улучшение обработки ошибок метода select.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-improve handling of "select" method errors.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "select() failed (10022: ...)" в nginx/Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of "select() failed (10022: ...)" error in nginx/Windows.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в текстовых сообщениях об ошибках в nginx/Windows;[m
[31m-ошибка появилась в 0.7.53.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in error text descriptions in nginx/Windows;[m
[31m-the bug had appeared in 0.7.53.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.53" date="27.04.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь лог, указанный в --error-log-path, создаётся с самого начала работы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a log set by --error-log-path is created from the very start-up.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь ошибки и предупреждения при старте записываются в error_log[m
[31m-и выводятся на stderr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the start up errors and warnings are outputted to an error_log and stderr.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-при сборке с пустым параметром --prefix= nginx использует как префикс каталог,[m
[31m-в котором он был запущен.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the empty --prefix= configure parameter forces nginx to use a directory[m
[31m-where it was run as prefix.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -p.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -p switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -s на Unix-платформах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -s switch on Unix platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключи -? и -h.<br/>[m
[31m-Спасибо Jerome Loyet.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -? and -h switches.<br/>[m
[31m-Thanks to Jerome Loyet.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь ключи можно задавать в сжатой форме.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now switches may be set in condensed form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx/Windows не работал, если файл конфигурации был задан ключом -c.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx/Windows did not work if configuration file was given by the -c switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив proxy_store, fastcgi_store,[m
[31m-proxy_cache или fastcgi_cache временные файлы могли не удаляться.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-temporary files might be not removed if the "proxy_store", "fastcgi_store",[m
[31m-"proxy_cache", or "fastcgi_cache" were used.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в заголовке Auth-Method запроса серверу аутентификации почтового[m
[31m-прокси-сервера передавалось неверное значение;[m
[31m-ошибка появилась в 0.7.34.<br/>[m
[31m-Спасибо Simon Lecaille.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an incorrect value was passed to mail proxy authentication server[m
[31m-in "Auth-Method" header line;[m
[31m-the bug had appeared<br/>[m
[31m-in 0.7.34.<br/>[m
[31m-Thanks to Simon Lecaille.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при логгировании на Linux не писались текстовые описания системных ошибок;[m
[31m-ошибка появилась в 0.7.45.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-system error text descriptions were not logged on Linux;<br/>[m
[31m-the bug had appeared in 0.7.45.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_cache_min_uses не работала.<br/>[m
[31m-Спасибо Андрею Воробьёву.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_cache_min_uses" directive did not work.<br/>[m
[31m-Thanks to Andrew Vorobyoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.52" date="20.04.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-первая бинарная версия под Windows.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the first native Windows binary release.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-корректная обработка метода HEAD при кэшировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in processing HEAD method while caching.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-корректная обработка строк "If-Modified-Since", "If-Range" и им подобных[m
[31m-в заголовке запроса клиента при кэшировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in processing the "If-Modified-Since", "If-Range", etc. client request[m
[31m-header lines while caching.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь строки "Set-Cookie" и "P3P" скрываются в заголовке ответа[m
[31m-для закэшированных ответов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "Set-Cookie" and "P3P" header lines are hidden in cacheable responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_perl_module и perl[m
[31m-поддерживал потоки, то при выходе основного процесса[m
[31m-могла выдаваться ошибка "panic: MUTEX_LOCK".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with the ngx_http_perl_module and with a perl which[m
[31m-supports threads, then during a master process exit[m
[31m-the message "panic: MUTEX_LOCK" might be issued.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http-cache;[m
[31m-ошибка появилась в 0.7.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http-cache;[m
[31m-the bug had appeared in 0.7.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.7.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.7.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.51" date="12.04.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива try_files поддерживает код ответа в последнем параметре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive supports a response code in the fallback parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь в директиве return можно использовать любой код ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now any response code can be used in the "return" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page делала внешний редирект без строки запроса;[m
[31m-ошибка появилась в 0.7.44.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive made an external redirect without query string;[m
[31m-the bug had appeared in 0.7.44.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если сервера слушали на нескольких явно описанных адресах,[m
[31m-то виртуальные сервера могли не работать;[m
[31m-ошибка появилась в 0.7.39.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if servers listened on several defined explicitly addresses,[m
[31m-then virtual servers might not work;[m
[31m-the bug had appeared in 0.7.39.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.50" date="06.04.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные $arg_... не работали;[m
[31m-ошибка появилась в 0.7.49.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $arg_... variables did not work;[m
[31m-the bug had appeared in 0.7.49.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.49" date="06.04.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменных $arg_...[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.7.48.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if the $arg_... variables were used;[m
[31m-the bug had appeared in 0.7.48.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.48" date="06.04.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_cache_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_cache_key" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx учитывает при кэшировании строки "X-Accel-Expires",[m
[31m-"Expires" и "Cache-Control" в заголовке ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx takes into account the "X-Accel-Expires", "Expires", and[m
[31m-"Cache-Control" header lines in a backend response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx кэширует только ответы на запросы GET.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx caches responses for the GET requests only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_cache_key не наследовалась.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_cache_key" directive was not inherited.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные $arg_... не работали с SSI-подзапросами.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $arg_... variables did not work with SSI subrequests.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с библиотекой uclibc.<br/>[m
[31m-Спасибо Timothy Redaelli.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with uclibc library.<br/>[m
[31m-Thanks to Timothy Redaelli.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на OpenBSD;[m
[31m-ошибка появилась <nobr>в 0.7.46.</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OpenBSD;[m
[31m-the bug had <nobr>appeared in 0.7.46.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.47" date="01.04.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на FreeBSD 6 и более ранних версиях;[m
[31m-ошибка появилась в 0.7.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on FreeBSD 6 and early versions;[m
[31m-the bug had appeared in 0.7.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на MacOSX;[m
[31m-ошибка появилась в 0.7.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOSX;[m
[31m-the bug had <nobr>appeared in 0.7.46.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался параметр max_size, то cache manager мог удалить весь кэш;[m
[31m-ошибка появилась в 0.7.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "max_size" parameter was set, then the cache manager might purge[m
[31m-a whole cache;[m
[31m-the bug had appeared in 0.7.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если директивы proxy_cache/fastcgi_cache[m
[31m-и proxy_cache_valid/ fastcgi_cache_valid не были заданы на одном уровне;[m
[31m-ошибка появилась в 0.7.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if the "proxy_cache"/"fastcgi_cache" and[m
[31m-the "proxy_cache_valid"/ "fastcgi_cache_valid" were set on different levels;[m
[31m-the bug had appeared in 0.7.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault[m
[31m-при перенаправлении запроса проксированному или FastCGI-серверу[m
[31m-с помощью error_page или try_files;[m
[31m-ошибка появилась в 0.7.44.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if a request was redirected to a proxied or FastCGI server via[m
[31m-error_page or try_files;[m
[31m-the bug had appeared in 0.7.44.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.46" date="30.03.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-архив предыдущего релиза был неверным.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the previous release tarball was incorrect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.45" date="30.03.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директивы proxy_cache и proxy_cache_valid можно задавать[m
[31m-на разных уровнях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "proxy_cache" and the "proxy_cache_valid" directives can be set on[m
[31m-different levels.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр clean_time в директиве proxy_cache_path удалён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "clean_time" parameter of the "proxy_cache_path" directive is canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр max_size в директиве proxy_cache_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "max_size" parameter of the "proxy_cache_path" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-предварительная поддержка кэширования в модуле ngx_http_fastcgi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_fastcgi_module preliminary cache support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при ошибках выделения в разделяемой памяти в логе указываются[m
[31m-названия директивы и зоны.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on shared memory allocation errors directive and zone names are logged.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "add_header last-modified ''" не удаляла в заголовке ответа[m
[31m-строку "Last-Modified";[m
[31m-ошибка появилась в 0.7.44.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the directive "add_header last-modified ''" did not delete a "Last-Modified"[m
[31m-response header line;[m
[31m-the bug had appeared in 0.7.44.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве auth_basic_user_file не работал относительный путь,[m
[31m-заданный строкой без переменных;[m
[31m-ошибка появилась в 0.7.44.<br/>[m
[31m-Спасибо Jerome Loyet.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a relative path in the "auth_basic_user_file" directive given without variables[m
[31m-did not work;[m
[31m-the bug had appeared in 0.7.44.<br/>[m
[31m-Thanks to Jerome Loyet.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве alias, заданной переменными[m
[31m-без ссылок на выделения в регулярных выражениях;[m
[31m-ошибка появилась в 0.7.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in an "alias" directive given using variables[m
[31m-without references to captures of regular expressions;[m
[31m-the bug had appeared in 0.7.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.44" date="23.03.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-предварительная поддержка кэширования в модуле ngx_http_proxy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_proxy_module preliminary cache support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр --with-pcre в configure.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --with-pcre option in the configure.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива try_files может быть использована на уровне server.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive is now allowed on the server block level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files неправильно обрабатывала строку запроса в последнем[m
[31m-параметре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive handled incorrectly a query string[m
[31m-in a fallback parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files могла неверно тестировать каталоги.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive might test incorrectly directories.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если для пары адрес:порт описан только один сервер, то выделения[m
[31m-в регулярных выражениях в директиве server_name не работали.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if there was a single server for given address:port pair,[m
[31m-then captures in regular expressions in a "server_name" directive did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.43" date="18.03.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-запрос обрабатывался неверно, если директива root использовала переменные;[m
[31m-ошибка появилась в 0.7.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a request was handled incorrectly, if a "root" directive used variables;[m
[31m-the bug had appeared in 0.7.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если сервер слушал на адресах типа "*", то значение переменной $server_addr[m
[31m-было "0.0.0.0";[m
[31m-ошибка появилась в 0.7.36.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a server listened on wildcard address, then the $server_addr variable[m
[31m-value was "0.0.0.0";[m
[31m-the bug had appeared in 0.7.36.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.42" date="16.03.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ошибка "Invalid argument", возвращаемая setsockopt(TCP_NODELAY) на Solaris,[m
[31m-теперь игнорируется.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "Invalid argument" error returned by setsockopt(TCP_NODELAY) on Solaris,[m
[31m-is ignored.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-при отсутствии файла, указанного в директиве auth_basic_user_file,[m
[31m-теперь возвращается ошибка 403 вместо 500.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if a file specified in a "auth_basic_user_file" directive is absent,[m
[31m-then the 403 error is returned instead of the 500 one.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic_user_file поддерживает переменные.[m
[31m-<br/>[m
[31m-Спасибо Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_basic_user_file" directive supports variables.<br/>[m
[31m-Thanks to Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen поддерживает параметр ipv6only.<br/>[m
[31m-Спасибо Zhang Hua.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive supports the "ipv6only" parameter.[m
[31m-<br/>[m
[31m-Thanks to Zhang Hua.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве alias со ссылками на выделения в регулярных выражениях;[m
[31m-ошибка появилась в 0.7.40.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in an "alias" directive with references to captures of regular expressions;[m
[31m-the bug had appeared in 0.7.40.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с Tru64 UNIX.<br/>[m
[31m-Спасибо Dustin Marquess.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with Tru64 UNIX.<br/>[m
[31m-Thanks to Dustin Marquess.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без библиотеки PCRE;[m
[31m-ошибка появилась в 0.7.41.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without PCRE library;[m
[31m-the bug had appeared in 0.7.41.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.41" date="11.03.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если в server_name или location были выделения в регулярных выражениях;[m
[31m-ошибка появилась в 0.7.40.<br/>[m
[31m-Спасибо Владимиру Сопоту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if a "server_name" or a "location" directives had captures[m
[31m-in regular expressions;[m
[31m-the issue had appeared in 0.7.40.<br/>[m
[31m-Thanks to Vladimir Sopot.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.40" date="09.03.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива location поддерживает выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "location" directive supports captures in regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву alias с ссылками на выделения в регулярных выражениях[m
[31m-можно использовать внутри location'а, заданного регулярным выражением[m
[31m-с выделениями.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an "alias" directive with capture references may be used inside[m
[31m-a location given by a regular expression with captures.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" directive supports captures in regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module не показывал последний слэш для каталогов[m
[31m-на файловой системе XFS;[m
[31m-ошибка появилась в 0.7.15.<br/>[m
[31m-Спасибо Дмитрию Кузьменко.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not show the trailing slash in directories[m
[31m-on XFS filesystem;[m
[31m-the issue had appeared in 0.7.15.<br/>[m
[31m-Thanks to Dmitry Kuzmenko.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.39" date="02.03.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включённом сжатии большие ответы с использованием SSI могли зависать;[m
[31m-ошибка появилась в 0.7.28.<br/>[m
[31m-Спасибо Артёму Бохану.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large response with SSI might hang, if gzipping was enabled;[m
[31m-the bug had appeared in 0.7.28.<br/>[m
[31m-Thanks to Artem Bokhan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании коротких статических вариантов в директиве try_files[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process,[m
[31m-if short static variants are used in a "try_files" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.38" date="23.02.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-логгирование ошибок аутентификации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-authentication failures logging.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-имя/пароль, заданные в auth_basic_user_file, игнорировались после нечётного[m
[31m-числа пустых строк.<br/>[m
[31m-Спасибо Александру Загребину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-name/password in auth_basic_user_file were ignored after odd number[m
[31m-of empty lines.<br/>[m
[31m-Thanks to Alexander Zagrebin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании длинного пути в unix domain сокете[m
[31m-в главном процессе происходил segmentation fault;[m
[31m-ошибка появилась в 0.7.36.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in a master process,[m
[31m-if long path was used in unix domain socket;[m
[31m-the bug had appeared in 0.7.36.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.37" date="21.02.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы, использующие upstream'ы, не работали;[m
[31m-ошибка появилась в 0.7.36.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-directives using upstreams did not work;[m
[31m-the bug had appeared in 0.7.36.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.36" date="21.02.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-предварительная поддержка IPv6;[m
[31m-директива listen модуля HTTP поддерживает IPv6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a preliminary IPv6 support;[m
[31m-the "listen" directive of the HTTP module supports IPv6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $ancient_browser не работала для браузеров, заданных[m
[31m-директивами modern_browser.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ancient_browser variable did not work for browsers[m
[31m-preset by a "modern_browser" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.35" date="16.02.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ssl_engine не использовала SSL-акселератор[m
[31m-для асимметричных шифров.<br/>[m
[31m-Спасибо Marcin Gozdalik.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "ssl_engine" directive did not use a SSL-accelerator[m
[31m-for asymmetric ciphers.<br/>[m
[31m-Thanks to Marcin Gozdalik.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива try_files выставляла MIME-type, исходя из расширения[m
[31m-первоначального запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "try_files" directive set MIME type depending on an[m
[31m-original request extension.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директивах server_name, valid_referers и map[m
[31m-неправильно обрабатывались имена вида "*domain.tld",[m
[31m-если использовались маски вида ".domain.tld" и ".subdomain.domain.tld";[m
[31m-ошибка появилась в 0.7.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"*domain.tld" names were handled incorrectly in[m
[31m-"server_name", "valid_referers", and "map" directives,[m
[31m-if ".domain.tld" and ".subdomain.domain.tld" wildcards were used;[m
[31m-<nobr>the bug had</nobr> appeared in 0.7.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.34" date="10.02.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр off в директиве if_modified_since.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "off" parameter of the "if_modified_since" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь после команды XCLIENT nginx посылает команду HELO/EHLO.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx sends an HELO/EHLO command after a XCLIENT command.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка Microsoft-специфичного режима[m
[31m-<nobr>"AUTH LOGIN with User Name"</nobr>[m
[31m-в почтовом прокси-сервере.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Microsoft specific "AUTH LOGIN with User Name" mode support[m
[31m-in mail proxy server.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве rewrite, возвращающей редирект, старые аргументы присоединялись[m
[31m-к новым через символ "?" вместо "&amp;";<br/>[m
[31m-ошибка появилась в 0.1.18.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a redirect rewrite directive original arguments were concatenated with[m
[31m-new arguments by a "?" rather than an "&amp;";<br/>[m
[31m-the bug had appeared in 0.1.18.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на AIX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on AIX.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.33" date="02.02.2009">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если на запрос с телом возвращался редирект, то ответ мог быть двойным[m
[31m-при использовании методов epoll или rtsig.<br/>[m
[31m-Спасибо Eden Li.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a double response might be returned if the epoll or rtsig methods are used[m
[31m-and a redirect was returned to a request with body.<br/>[m
[31m-Thanks to Eden Li.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для некоторых типов редиректов в переменной $sent_http_location[m
[31m-было пустое значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $sent_http_location variable was empty for some redirects types.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы resolver в SMTP прокси-сервере[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if "resolver" directive was used in SMTP proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.32" date="26.01.2009">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь в директиве try_files можно явно указать проверку каталога.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a directory existence testing can be set explicitly[m
[31m-in the "try_files" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-fastcgi_store не всегда сохранял файлы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fastcgi_store stored files not always.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в гео-диапазонах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in geo ranges.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки выделения больших блоков в разделяемой памяти,[m
[31m-если nginx был собран без отладки.<br/>[m
[31m-Спасибо Андрею Квасову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in shared memory allocations if nginx was built without debugging.<br/>[m
[31m-Thanks to Andrey Kvasov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.31" date="19.01.2009">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива try_files проверяет только файлы, игнорируя каталоги.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "try_files" directive tests files only and ignores directories.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_split_path_info.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_split_path_info" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в поддержке строки "Expect" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in an "Expect" request header line support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в гео-диапазонах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in geo ranges.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при отсутствии ответа ngx_http_memcached_module возвращал[m
[31m-в теле ответа строку "END" вместо 404-ой страницы по умолчанию;[m
[31m-ошибка появилась в 0.7.18.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a miss case ngx_http_memcached_module returned the "END" line[m
[31m-as response body instead of default 404 page body;[m
[31m-the bug had appeared in 0.7.18.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании SMTP nginx выдавал сообщение[m
[31m-<nobr>"250 2.0.0 OK"</nobr> вместо "235 2.0.0 OK";[m
[31m-ошибка появилась в 0.7.22.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while SMTP proxying nginx issued message[m
[31m-"250 2.0.0 OK" instead of "235 2.0.0 OK";[m
[31m-the bug had appeared in 0.7.22.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.30" date="24.12.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе происходил segmentation fault,[m
[31m-если в директивах fastcgi_pass или proxy_pass[m
[31m-использовались переменные и имя хоста должно было резолвиться;[m
[31m-ошибка появилась в 0.7.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if variables were used in the "fastcgi_pass" or "proxy_pass" directives[m
[31m-and host name must be resolved;[m
[31m-the bug had appeared in 0.7.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.29" date="24.12.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы fastcgi_pass и proxy_pass не поддерживали переменные[m
[31m-при использовании unix domain сокетов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_pass" and "proxy_pass" directives did not support[m
[31m-variables if unix domain sockets were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в обработке подзапросов;[m
[31m-ошибки появились в 0.7.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in subrequest processing;[m
[31m-the bugs had appeared in 0.7.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ "100 Continue" выдавался для запросов версии HTTP/1.0;<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "100 Continue" response was issued for HTTP/1.0 requests;<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в выделении памяти в модуле ngx_http_gzip_filter_module под Cygwin.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation in the ngx_http_gzip_filter_module on Cygwin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.28" date="22.12.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в выделении памяти в модуле ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in memory allocation in the ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-значения по умолчанию для директивы gzip_buffers изменены с 4 4k/8k[m
[31m-на 32 4k или 16 8k.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the default "gzip_buffers" directive values have been changed[m
[31m-to 32 4k or 16 8k from 4 4k/8k.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.27" date="15.12.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива try_files.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "try_files" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_pass поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "fastcgi_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива geo может брать адрес из переменной.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the $geo variable may get an address from a variable.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь модификатор location'а можно указывать без пробела перед названием.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a location's modifier may be used without space before name.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_length.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_length variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь директива add_header не добавляет пустое значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a "add_header" directive does not add an empty value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при запросе файла нулевой длины nginx закрывал соединение, ничего не передав;[m
[31m-ошибка появилась в 0.7.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if zero length static file was requested, then nginx just closed connection;[m
[31m-the bug had appeared in 0.7.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод MOVE не мог перемещать файл в несуществующий каталог.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a MOVE method could not move file in non-existent directory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в сервере не был описан ни один именованный location,[m
[31m-но такой location использовался в директиве error_page,[m
[31m-то в рабочем процессе происходил segmentation fault.<br/>[m
[31m-Спасибо Сергею Боченкову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if no one named location was defined in server,[m
[31m-but some one was used in an error_page directive.<br/>[m
[31m-Thanks to Sergey Bochenkov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.26" date="08.12.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке подзапросов;[m
[31m-ошибка появилась в 0.7.25.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in subrequest processing;[m
[31m-the bug had appeared in 0.7.25.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.25" date="08.12.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в обработке подзапросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in subrequest processing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь разрешаются POST'ы без строки "Content-Length" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now POSTs without "Content-Length" header line are allowed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь директивы limit_req и limit_conn указывают причину запрета запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "limit_req" and "limit_conn" directives log a prohibition reason.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в параметре delete директивы geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "delete" parameter of the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.24" date="01.12.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if_modified_since.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if_modified_since" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не обрабатывал ответ FastCGI-сервера,[m
[31m-если перед ответом сервер передавал много сообщений в stderr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not process a FastCGI server response,[m
[31m-if the server send too many messages to stderr before response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные "$cookie_..." не работали в SSI and в перловом модуле.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$cookie_..." variables did not work in the SSI and the perl module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.23" date="27.11.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры delete и ranges в директиве geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "delete" and "ranges" parameters in the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ускорение загрузки geo-базы с большим числом значений.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-speeding up loading of geo base with large number of values.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-уменьшение памяти, необходимой для загрузки geo-базы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-decrease of memory required for geo base load.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.22" date="20.11.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр none в директиве smtp_auth.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "none" parameter in the "smtp_auth" directive.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$cookie_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$cookie_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива directio не работала с файловой системой XFS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" directive did not work in XFS filesystem.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-resolver не понимал большие DNS-ответы.<br/>[m
[31m-Спасибо Zyb.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the resolver did not understand big DNS responses.<br/>[m
[31m-Thanks to Zyb.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.21" date="11.11.2008">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменения в модуле ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Changes in the ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка EXSLT в модуле ngx_http_xslt_module.<br/>[m
[31m-Спасибо Денису Латыпову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the EXSLT support in the ngx_http_xslt_module.<br/>[m
[31m-Thanks to Denis F. Latypoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-совместимость с glibc 2.3.<br/>[m
[31m-Спасибо Eric Benson и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with glibc 2.3.<br/>[m
[31m-Thanks to Eric Benson and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запускался на MacOSX 10.4 и более ранних;[m
[31m-ошибка появилась в 0.7.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not run on MacOSX 10.4 and earlier;[m
[31m-the bug had appeared in 0.7.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.20" date="10.11.2008">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменения в модуле ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Changes in the ngx_http_gzip_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_limit_req_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на платформах sparc и ppc рабочие процессы могли выходить по сигналу SIGBUS;[m
[31m-ошибка появилась в 0.7.3.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes might exit on a SIGBUS signal on sparc and ppc platforms;[m
[31m-the bug had appeared in 0.7.3.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы вида "proxy_pass http://host/some:uri" не работали;[m
[31m-ошибка появилась в 0.7.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass http://host/some:uri" directives did not work;[m
[31m-the bug had appeared in 0.7.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTPS запросы могли завершаться с ошибкой "bad write retry".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in HTTPS mode requests might fail with the "bad write retry" error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_secure_link_module не работал внутри location'ов[m
[31m-с именами меньше 3 символов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_secure_link_module did not work inside locations,[m
[31m-whose names are less than 3 characters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $server_addr могла не иметь значения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$server_addr variable might have no value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.19" date="13.10.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-обновление номера версии.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-version number update.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.18" date="13.10.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива underscores_in_headers;[m
[31m-теперь nginx по умолчанию не разрешает подчёркивания в именах строк[m
[31m-в заголовке запроса клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "underscores_in_headers" directive;[m
[31m-now nginx does not allows underscores in a client request header line names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_secure_link_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_secure_link_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива real_ip_header поддерживает любой заголовок.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "real_ip_header" directive supports any header.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива log_subrequest.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_subrequest" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $realpath_root.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $realpath_root variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры http_502 и http_504 в директиве proxy_next_upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "http_502" and "http_504" parameters of the "proxy_next_upstream" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр http_503 в директивах proxy_next_upstream или fastcgi_next_upstream[m
[31m-не работал.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "http_503" parameter of the "proxy_next_upstream" or[m
[31m-"fastcgi_next_upstream" directives did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx мог выдавать строку "Transfer-Encoding: chunked" для запросов  HEAD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx might send a "Transfer-Encoding: chunked" header line for HEAD requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь accept-лимит зависит от числа worker_connections.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now accept threshold depends on worker_connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.17" date="15.09.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio теперь работает на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "directio" directive works on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $pid.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $pid variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-оптимизация directio, появившаяся в 0.7.15, не работала при использовании[m
[31m-open_file_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" optimization that had appeared in 0.7.15 did not work with[m
[31m-open_file_cache.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-access_log с переменными не работал на Linux;[m
[31m-ошибка появилась в 0.7.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access_log" with variables did not work on Linux;[m
[31m-the bug had appeared in 0.7.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_charset_module не понимал название кодировки в кавычках,[m
[31m-полученное от бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_charset_module did not understand quoted charset name[m
[31m-received from backend.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.16" date="08.09.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на 64-битных платформах;[m
[31m-ошибка появилась в 0.7.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on 64-bit platforms;[m
[31m-the bug had appeared in 0.7.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.15" date="08.09.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_random_index_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_random_index_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio оптимизирована для запросов файлов, начинающихся[m
[31m-с произвольной позиции.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" directive has been optimized for file requests starting[m
[31m-from arbitrary position.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio при необходимости запрещает использование sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" directive turns off sendfile if it is necessary.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx разрешает подчёркивания в именах строк в заголовке запроса клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx allows underscores in a client request header line names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.14" date="01.09.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директивы ssl_certificate и ssl_certificate_key не имеют[m
[31m-значений по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ssl_certificate and ssl_certificate_key directives have no[m
[31m-default values.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива listen поддерживает параметр ssl.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive supports the "ssl" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при переконфигурации nginx учитывает изменение временной зоны[m
[31m-на FreeBSD и Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx takes into account a time zone change while reconfiguration[m
[31m-on FreeBSD and Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры директивы listen, такие как backlog, rcvbuf и прочие,[m
[31m-не устанавливались, если сервером по умолчанию был не первый сервер.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directive parameters such as "backlog", "rcvbuf", etc.[m
[31m-were not set, if a default server was not the first one.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании в качестве аргументов части URI, выделенного с помощью[m
[31m-директивы rewrite, эти аргументы не экранировались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if URI part captured by a "rewrite" directive was used as a query string,[m
[31m-then the query string was not escaped.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-улучшения тестирования правильности конфигурационного файла.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-configuration file validity test improvements.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.13" date="26.08.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux и Solaris;[m
[31m-ошибка появилась в 0.7.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux and Solaris;[m
[31m-the bug had appeared in 0.7.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.12" date="26.08.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает пустое имя "".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" directive supports empty name "".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_disable поддерживает специальную маску msie6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "gzip_disable" directive supports special "msie6" mask.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании параметра max_fails=0 в upstream'е с несколькими[m
[31m-серверами рабочий процесс выходил по сигналу SIGFPE.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "max_fails=0" parameter was used in upstream with several servers,[m
[31m-then a worker process exited on a SIGFPE signal.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса с помощью директивы error_page[m
[31m-терялось тело запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a request body was dropped while redirection via an "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса с методом HEAD с помощью директивы error_page[m
[31m-возвращался полный ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a full response was returned for request method HEAD[m
[31m-while redirection via an "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод $r->header_in() не возвращал значения строк "Host", "User-Agent",[m
[31m-и "Connection" из заголовка запроса;[m
[31m-ошибка появилась в 0.7.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->header_in() method did not return value of the "Host",[m
[31m-"User-Agent", and "Connection" request header lines;[m
[31m-the bug had appeared in 0.7.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.11" date="18.08.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь ngx_http_charset_module по умолчанию не работает MIME-типом text/css.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now ngx_http_charset_module does not work by default with text/css MIME type.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx возвращает код 405 для метода POST при запросе статического[m
[31m-файла, только если файл существует.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx returns the 405 status code for POST method requesting a static file[m
[31m-only if the file exists.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_ssl_session_reuse.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ssl_session_reuse" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с помощью "X-Accel-Redirect"[m
[31m-директива proxy_pass без URI могла использовать оригинальный запрос.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive without URI part might use original request[m
[31m-after the "X-Accel-Redirect" redirection was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если у каталога были права доступа только на поиск файлов[m
[31m-и первый индексный файл отсутствовал, то nginx возвращал ошибку 500.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a directory has search only rights and the first index file was absent,[m
[31m-then nginx returned the 500 status code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибок во вложенных location'ах;[m
[31m-ошибки появились в 0.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in inclusive locations;[m
[31m-the bugs had appeared in 0.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.10" date="13.08.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибок в директивах addition_types, charset_types,[m
[31m-gzip_types, ssi_types, sub_filter_types и xslt_types;[m
[31m-ошибки появились в 0.7.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "addition_types", "charset_types",[m
[31m-"gzip_types", "ssi_types", "sub_filter_types", and "xslt_types" directives;[m
[31m-the bugs had appeared in 0.7.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рекурсивной error_page для 500 ошибки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of recursive error_page for 500 status code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь модуль ngx_http_realip_module устанавливает адрес не для[m
[31m-всего keepalive соединения, а для каждого запроса по этому соединению.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_realip_module sets address not for whole keepalive connection,[m
[31m-but for each request passed via the connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.9" date="12.08.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь ngx_http_charset_module по умолчанию работает со следующими MIME-типами:[m
[31m-text/html, text/css, text/xml, text/plain, text/vnd.wap.wml,[m
[31m-application/x-javascript и application/rss+xml.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now ngx_http_charset_module works by default with following MIME types:[m
[31m-text/html, text/css, text/xml, text/plain, text/vnd.wap.wml,[m
[31m-application/x-javascript, and application/rss+xml.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы charset_types и addition_types.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "charset_types" and "addition_types" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директивы gzip_types, ssi_types и sub_filter_types используют хэш.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "gzip_types", "ssi_types", and "sub_filter_types" directives use hash.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_cpp_test_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_cpp_test_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива expires поддерживает суточное время.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive supports daily time.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-улучшения и исправления в модуле ngx_http_xslt_module.<br/>[m
[31m-Спасибо Денису Латыпову и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_xslt_module improvements and bug fixing.<br/>[m
[31m-Thanks to Denis F. Latypoff and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива log_not_found не работала при поиске индексных файлов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_not_found" directive did not work for index files tests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-HTTPS-соединения могли зависнуть,[m
[31m-если использовались методы kqueue, epoll, rtsig или eventport;[m
[31m-ошибка появилась в 0.7.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-HTTPS connections might hang,[m
[31m-if kqueue, epoll, rtsig, or eventport methods were used;[m
[31m-the bug had appeared in 0.7.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директивах server_name, valid_referers и map[m
[31m-использовалась маска вида "*.domain.tld" и при этом полное имя[m
[31m-вида "domain.tld" не было описано, то это имя попадало под маску;[m
[31m-ошибка появилась в 0.3.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "server_name", "valid_referers", and "map" directives used[m
[31m-an "*.domain.tld" wildcard and exact name "domain.tld" was not set,[m
[31m-then the exact name was matched by the wildcard;[m
[31m-the bug had appeared in 0.3.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.8" date="04.08.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_xslt_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_xslt_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$arg_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$arg_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка directio в Solaris.<br/>[m
[31m-Спасибо Ivan Debnar.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Solaris directio support.<br/>[m
[31m-Thanks to Ivan Debnar.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь, если FastCGI-сервер присылает строку "Location" в заголовке ответа[m
[31m-без строки статуса, то nginx использует код статуса 302.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if FastCGI server sends a "Location" header line without status line,[m
[31m-then nginx uses 302 status code.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.7" date="30.07.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь ошибка EAGAIN при вызове connect() не считается временной.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the EAGAIN error returned by connect() is not considered as temporary error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-значением переменной $ssl_client_cert теперь является сертификат,[m
[31m-перед каждой строкой которого, кроме первой, вставляется символ табуляции;[m
[31m-неизменённый сертификат доступен через переменную $ssl_client_raw_cert.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the $ssl_client_cert variable value is a certificate with TAB character[m
[31m-intended before each line except first one;[m
[31m-an unchanged certificate is available in the $ssl_client_raw_cert variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр ask директивы ssl_verify_client.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ask" parameter in the "ssl_verify_client" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-улучшения в обработке byte-range.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-byte-range processing improvements.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива directio.<br/>[m
[31m-Спасибо Jiang Hong.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "directio" directive.<br/>[m
[31m-Thanks to Jiang Hong.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка sendfile() в MacOSX 10.5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-MacOSX 10.5 sendfile() support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в MacOSX и Cygwin при проверке location'ов теперь делается сравнение[m
[31m-без учёта регистра символов;[m
[31m-однако, сравнение ограничено только однобайтными locale'ями.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now in MacOSX and Cygwin locations are tested in case insensitive mode;[m
[31m-however, the compare is provided by single-byte locales only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-соединения почтового прокси-сервера зависали в режиме SSL,[m
[31m-если использовались методы select, poll или /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-mail proxy SSL connections hanged,[m
[31m-if select, poll, or /dev/poll methods were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании кодировки UTF-8 в ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-UTF-8 encoding usage in the ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.6" date="07.07.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании переменных в директиве access_log[m
[31m-всегда проверяется существовании root'а для запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if variables are used in the "access_log" directive[m
[31m-a request root existence is always tested.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_flv_module не поддерживал несколько значений в[m
[31m-аргументах запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_flv_module did not support several values in a query string.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.5" date="01.07.2008">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в поддержке переменных в директиве access_log;[m
[31m-ошибки появились в 0.7.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in variables support in the "access_log" directive;[m
[31m-the bugs had appeared in 0.7.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http_gzip_module;[m
[31m-ошибка появилась в 0.7.3.<br/>[m
[31m-Спасибо Кириллу Коринскому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built --without-http_gzip_module;[m
[31m-the bug had appeared in 0.7.3.<br/>[m
[31m-Thanks to Kirill A. Korinskiy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при совместном использовании sub_filter и SSI[m
[31m-ответы могли передаваться неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if sub_filter and SSI were used together, then responses might[m
[31m-were transferred incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.4" date="30.06.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива access_log поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "access_log" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива open_log_file_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "open_log_file_cache" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -g.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -g switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка строки "Expect" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Expect" request header line support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-большие включения в SSI могли передавались не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large SSI inclusions might be truncated.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.3" date="23.06.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-MIME-тип для расширения rss изменён на "application/rss+xml".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rss" extension MIME type has been changed to "application/rss+xml".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива "gzip_vary on" выдаёт строку[m
[31m-<nobr>"Vary: Accept-Encoding"</nobr>[m
[31m-в заголовке ответа и для несжатых ответов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "gzip_vary" directive turned on issues[m
[31m-a <nobr>"Vary: Accept-Encoding"</nobr>[m
[31m-header line for uncompressed responses too.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании протокола "https://" в директиве rewrite[m
[31m-автоматически делается редирект.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "rewrite" directive does a redirect automatically[m
[31m-if the "https://" protocol is used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass не работала с протоколом HTTPS;[m
[31m-ошибка появилась в 0.6.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" directive did not work with the HTTPS protocol;[m
[31m-the bug had appeared in 0.6.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.2" date="16.06.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx поддерживает шифры с обменом EDH-ключами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx supports EDH key exchange ciphers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_dhparam.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_dhparam" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_client_cert.<br/>[m
[31m-Спасибо Manlio Perillo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_cert variable.<br/>[m
[31m-Thanks to Manlio Perillo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после изменения URI с помощью директивы rewrite nginx не искал новый location;[m
[31m-ошибка появилась в 0.7.1.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-after changing URI via a "rewrite" directive nginx did not search[m
[31m-a new location;[m
[31m-the bug had appeared in 0.7.1.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без библиотеки PCRE;[m
[31m-ошибка появилась в 0.7.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without PCRE library;[m
[31m-the bug had appeared in 0.7.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при редиректе запроса к каталогу с добавлением слэша nginx[m
[31m-не добавлял аргументы из оригинального запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-when a request to a directory was redirected with the slash added,[m
[31m-nginx dropped a query string from the original request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.1" date="26.05.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь поиск location'а делается с помощью дерева.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now locations are searched in a tree.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива optimize_server_names упразднена в связи с появлением[m
[31m-директивы server_name_in_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "optimize_server_names" directive was canceled[m
[31m-due to the "server_name_in_redirect" directive introduction.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-некоторые давно устаревшие директивы больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some long deprecated directives are not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр "none" в директиве ssl_session_cache;[m
[31m-теперь этот параметр используется по умолчанию.<br/>[m
[31m-Спасибо Rob Mueller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "none" parameter in the "ssl_session_cache" directive;[m
[31m-now this is default parameter.<br/>[m
[31m-Thanks to Rob Mueller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочие процессы могли не реагировать на сигналы переконфигурации[m
[31m-и ротации логов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes might not catch reconfiguration and log rotation signals.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на последних Fedora 9 Linux.<br/>[m
[31m-Спасибо Roxis.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on latest Fedora 9 Linux.<br/>[m
[31m-Thanks to Roxis.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.7.0" date="19.05.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь символы 0x00-0x1F, '"' и '\' в access_log записываются в виде \xXX.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX in an[m
[31m-access_log.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx разрешает несколько строк "Host" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx allows several "Host" request header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива expires поддерживает флаг modified.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "modified" flag in the "expires" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $uid_got и $uid_set можно использовать на любой стадии обработки[m
[31m-запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $uid_got and $uid_set variables may be used at any request processing stage.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $hostname.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $hostname variable.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка DESTDIR.<br/>[m
[31m-Спасибо Todd A. Fisher и Andras Voroskoi.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-DESTDIR support.<br/>[m
[31m-Thanks to Todd A. Fisher and Andras Voroskoi.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании keepalive на Linux[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process on Linux,[m
[31m-if keepalive was enabled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.31" date="12.05.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не обрабатывал ответ FastCGI-сервера, если строка заголовка ответа была[m
[31m-в конце записи FastCGI;[m
[31m-ошибка появилась в 0.6.2.<br/>[m
[31m-Спасибо Сергею Серову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not process FastCGI response[m
[31m-if header was at the end of FastCGI record;[m
[31m-the bug had appeared in 0.6.2.<br/>[m
[31m-Thanks to Sergey Serov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при удалении файла и использовании директивы open_file_cache_errors off[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process if a file was deleted[m
[31m-and the "open_file_cache_errors" directive was off.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.30" date="29.04.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь, если маске, заданной в директиве include, не соответствует[m
[31m-ни один файл, то nginx не выдаёт ошибку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if an "include" directive pattern does not match any file,[m
[31m-then nginx does not issue an error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь время в директивах можно задавать без пробела, например, "1h50m".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the time in directives may be specified without spaces,[m
[31m-for example, "1h50m".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечек памяти, если директива ssl_verify_client имела значение on.<br/>[m
[31m-Спасибо Chavelle Vincent.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leaks if the "ssl_verify_client" directive was on.<br/>[m
[31m-Thanks to Chavelle Vincent.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива sub_filter могла вставлять заменяемый текст в вывод.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sub_filter" directive might set text to change into output.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не воспринимала параметры в перенаправляемом URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive did not take into account arguments in[m
[31m-redirected URI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь при сборке с Cygwin nginx всегда открывает файлы в бинарном режиме.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx always opens files in binary mode under Cygwin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под OpenBSD;[m
[31m-ошибка появилась в 0.6.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OpenBSD;[m
[31m-the bug had appeared in 0.6.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.29" date="18.03.2008">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_google_perftools_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_google_perftools_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module не собирался на 64-битных платформах;[m
[31m-ошибка появилась в 0.6.27.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module could not be built on 64-bit platforms;[m
[31m-the bug had appeared in 0.6.27.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.28" date="13.03.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод rtsig не собирался;[m
[31m-ошибка появилась в 0.6.27.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the rtsig method could not be built;[m
[31m-the bug had appeared in 0.6.27.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.27" date="12.03.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь на Linux 2.6.18+ по умолчанию не собирается метод rtsig.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now by default the rtsig method is not built on <nobr>Linux 2.6.18+.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при перенаправлении запроса в именованный location с помощью[m
[31m-директивы error_page метод запроса не изменяется.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a request method is not changed while redirection to a named location[m
[31m-via an "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы resolver и resolver_timeout в SMTP прокси-сервере.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "resolver" and "resolver_timeout" directives in SMTP proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива post_action поддерживает именованные location'ы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_action" directive supports named locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса из location'а c обработчиком proxy, FastCGI[m
[31m-или memcached в именованный location со статическим обработчиком[m
[31m-в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if a request was redirected from proxy, FastCGI, or memcached location[m
[31m-to static named locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-браузеры не повторяли SSL handshake, если при первом handshake[m
[31m-не оказалось правильного клиентского сертификата.[m
[31m-<br/>[m
[31m-Спасибо Александру Инюхину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-browsers did not repeat SSL handshake if there is no valid client certificate[m
[31m-in first handshake.[m
[31m-<br/>[m
[31m-Thanks to Alexander V. Inyukhin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении ошибок 495-497 с помощью директивы error_page[m
[31m-без изменения кода ошибки nginx пытался выделить очень много памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if response code 495-497 was redirected via an "error_page" directive[m
[31m-without code change, then nginx tried to allocate too many memory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти в долгоживущих небуфферизированных соединениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak in long-lived non buffered connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки памяти в resolver'е.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-memory leak in resolver.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса из location'а c обработчиком proxy[m
[31m-в другой location с обработчиком proxy[m
[31m-в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if a request was redirected from proxy, FastCGI, or memcached location[m
[31m-to static named locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в кэшировании переменных $proxy_host и $proxy_port.<br/>[m
[31m-Спасибо Сергею Боченкову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the $proxy_host and $proxy_port variables caching.<br/>[m
[31m-Thanks to Sergey Bochenkov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass с переменными использовала порт, описанной в другой[m
[31m-директиве proxy_pass без переменных, но с таким же именем хоста.<br/>[m
[31m-Спасибо Сергею Боченкову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "proxy_pass" directive with variables used incorrectly the same port[m
[31m-as in another "proxy_pass" directive with the same host name[m
[31m-and without variables.<br/>[m
[31m-Thanks to Sergey Bochenkov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время переконфигурации на некоторых 64-битном платформах в лог[m
[31m-записывался alert "sendmsg() failed (9: Bad file descriptor)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-an alert "sendmsg() failed (9: Bad file descriptor)" on some 64-bit platforms[m
[31m-while reconfiguration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при повторном использовании в SSI пустого block'а в качестве заглушки[m
[31m-в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if empty stub block was used second time in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при копировании части URI, содержащего экранированные символы,[m
[31m-в аргументы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in copying URI part contained escaped symbols into arguments.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.26" date="11.02.2008">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_store и fastcgi_store не проверяли длину ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store" and "fastcgi_store" directives did not check[m
[31m-a response length.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании большого значения в директиве expires[m
[31m-в рабочем процессе происходил segmentation fault.<br/>[m
[31m-Спасибо Joaquin Cuenca Abela.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if big value was used in a "expires" directive.<br/>[m
[31m-Thanks to Joaquin Cuenca Abela.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неверно определял длину строки кэша на <nobr>Pentium 4.</nobr><br/>[m
[31m-Спасибо Геннадию Махомеду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx incorrectly detected cache line size on Pentium 4.<br/>[m
[31m-Thanks to Gena Makhomed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в проксированных подзапросах и подзапросах к FastCGI-серверу[m
[31m-вместо метода GET использовался оригинальный метод клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in proxied or FastCGI subrequests a client original method was used[m
[31m-instead of the GET method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов в режиме HTTPS при использовании отложенного accept'а.<br/>[m
[31m-Спасибо Ben Maurer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak in HTTPS mode if deferred accept was used.<br/>[m
[31m-Thanks to Ben Maurer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx выдавал ошибочное сообщение "SSL_shutdown() failed (SSL: )";[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx issued the bogus error message "SSL_shutdown() failed (SSL: )";[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTPS запросы могли завершаться с ошибкой "bad write retry";[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in HTTPS mode requests might fail with the "bad write retry" error;[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.25" date="08.01.2008">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-вместо специального параметра "*" в директиве server_name теперь[m
[31m-используется директива server_name_in_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "server_name_in_redirect" directive is used instead of[m
[31m-the "server_name" directive's special "*" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в качестве основного имени в директиве server_name теперь[m
[31m-можно использовать имена с масками и регулярными выражениями.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now wildcard and regex names can be used as main name in[m
[31m-a "server_name" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива satisfy_any заменена директивой satisfy.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "satisfy_any" directive was replaced by the "satisfy" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-после переконфигурации старые рабочие процесс могли сильно нагружать процессор[m
[31m-при запуске под Linux OpenVZ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-old worker processes might hog CPU after reconfiguration if they was run[m
[31m-under Linux OpenVZ.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива min_delete_depth.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "min_delete_depth" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-методы COPY и MOVE не работали с одиночными файлами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the COPY and MOVE methods did not work with single files.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_gzip_static_module не позволял работать модулю[m
[31m-ngx_http_dav_module;[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_gzip_static_module did not allow the ngx_http_dav_module to work;[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов в режиме HTTPS при использовании отложенного accept'а.<br/>[m
[31m-Спасибо Ben Maurer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak in HTTPS mode if deferred accept was used.<br/>[m
[31m-Thanks to Ben Maurer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без библиотеки PCRE;[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without PCRE library;[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-<changes ver="0.6.24" date="27.12.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTPS в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.6.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process if HTTPS was used;[m
[31m-the bug had appeared in 0.6.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.23" date="27.12.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр "off" в директиве ssl_session_cache;[m
[31m-теперь этот параметр используется по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "off" parameter in the "ssl_session_cache" directive;[m
[31m-now this is default parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива open_file_cache_retest переименована в open_file_cache_valid.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "open_file_cache_retest" directive was renamed[m
[31m-to the "open_file_cache_valid".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива open_file_cache_min_uses.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "open_file_cache_min_uses" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_gzip_static_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_disable.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "gzip_disable" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву memcached_pass можно использовать внутри блока if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "memcached_pass" directive may be used inside the "if" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если внутри одного location'а использовались директивы "memcached_pass" и "if",[m
[31m-то в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if the "memcached_pass" and "if" directives were used in the same location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании директивы satisfy_any on" были заданы директивы[m
[31m-не всех модулей доступа, то заданные директивы не проверялись.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a "satisfy_any on" directive was used and not all access and auth modules[m
[31m-directives were set, then other given access and auth directives[m
[31m-were not tested;[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметры, заданные регулярным выражением в директиве valid_referers,[m
[31m-не наследовалась с предыдущего уровня.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-regex parameters in a "valid_referers" directive were not inherited[m
[31m-from previous level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива post_action не работала, если запрос завершался с кодом 499.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a "post_action" directive did run if a request was completed[m
[31m-with 499 status code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-оптимизация использования 16K буфера для SSL-соединения.<br/>[m
[31m-Спасибо Ben Maurer.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-optimization of 16K buffer usage in a SSL connection.<br/>[m
[31m-Thanks to Ben Maurer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-STARTTLS в режиме SMTP не работал.<br/>[m
[31m-Спасибо Олегу Мотиенко.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the STARTTLS in SMTP mode did not work.<br/>[m
[31m-Thanks to Oleg Motienko.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании HTTPS запросы могли завершаться с ошибкой "bad write retry";[m
[31m-ошибка появилась в 0.5.13.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in HTTPS mode requests might fail with the "bad write retry" error;[m
[31m-the bug had appeared in 0.5.13.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.22" date="19.12.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь все методы модуля ngx_http_perl_module[m
[31m-возвращают значения, скопированные в память, выделенную perl'ом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now all ngx_http_perl_module methods return values copied to perl's[m
[31m-allocated memory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_perl_module,[m
[31m-использовался perl до версии 5.8.6 и perl поддерживал потоки,[m
[31m-то во время переконфигурации основной процесс аварийно выходил;[m
[31m-ошибка появилась в 0.5.9.<br/>[m
[31m-Спасибо Борису Жмурову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with ngx_http_perl_module,[m
[31m-the perl before 5.8.6 was used, and perl supported threads,[m
[31m-then during reconfiguration the master process aborted;[m
[31m-the bug had appeared in 0.5.9.<br/>[m
[31m-Thanks to Boris Zhmurov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в методы модуля ngx_http_perl_module[m
[31m-могли передаваться неверные результаты выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module methods may get invalid values of the regex captures.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если метод $r->has_request_body() вызывался для запроса,[m
[31m-у которого небольшое тело запроса было уже полностью получено,[m
[31m-то в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process,[m
[31m-if the $r->has_request_body() method was called for a request[m
[31m-whose small request body was already received.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-large_client_header_buffers не освобождались перед переходом в состояние[m
[31m-keep-alive.<br/>[m
[31m-Спасибо Олександру Штепе.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large_client_header_buffers did not freed before going to keep-alive state.<br/>[m
[31m-Thanks to Olexander Shtepa.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в переменной $upstream_addr не записывался последний адрес;[m
[31m-ошибка появилась в 0.6.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the last address was missed in the $upstream_addr variable;[m
[31m-the bug had appeared in 0.6.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_catch_stderr не возвращала ошибку;[m
[31m-теперь она возвращает ошибку 502, которую можно направить на следующий сервер[m
[31m-с помощью "fastcgi_next_upstream invalid_header".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_catch_stderr" directive did return error code;[m
[31m-now it returns 502 code, that can be rerouted to a next server using[m
[31m-the "fastcgi_next_upstream invalid_header" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы fastcgi_catch_stderr[m
[31m-в основном процессе происходил segmentation fault;[m
[31m-ошибка появилась в 0.6.10.<br/>[m
[31m-Спасибо Manlio Perillo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in master process[m
[31m-if the "fastcgi_catch_stderr" directive was used;[m
[31m-the bug had appeared in 0.6.10.<br/>[m
[31m-Thanks to Manlio Perillo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.21" date="03.12.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-если в значениях переменных директивы proxy_pass используются[m
[31m-только IP-адреса, то указывать resolver не нужно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if variable values used in a "proxy_pass" directive contain IP-addresses only,[m
[31m-then a "resolver" directive is not mandatory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы proxy_pass c URI-частью[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.6.19.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if a "proxy_pass" directive with URI-part was used;[m
[31m-the bug had appeared in 0.6.19.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если resolver использовался на платформах, не поддерживающих метод kqueue,[m
[31m-то nginx выдавал alert "name is out of response".<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if resolver was used on platform that does not support kqueue,[m
[31m-then nginx issued an alert "name is out of response".<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-При использовании переменной $server_protocol в FastCGI-параметрах[m
[31m-и запросе, длина которого была близка к значению директивы[m
[31m-client_header_buffer_size,[m
[31m-nginx выдавал alert "fastcgi: the request record is too big".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the $server_protocol was used in FastCGI parameters[m
[31m-and a request line length was near to the "client_header_buffer_size"[m
[31m-directive value,[m
[31m-then nginx issued an alert "fastcgi: the request record is too big".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при обычном запросе версии HTTP/0.9 к HTTPS серверу nginx возвращал[m
[31m-обычный ответ.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a plain text HTTP/0.9 version request was made to HTTPS server,[m
[31m-then nginx returned usual response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.20" date="28.11.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы proxy_pass c URI-частью[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.6.19.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if a "proxy_pass" directive with URI-part was used;[m
[31m-the bug had appeared in 0.6.19.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.19" date="27.11.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-версия 0.6.18 не собиралась.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the 0.6.18 version could not be built.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-<changes ver="0.6.18" date="27.11.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь модуль ngx_http_userid_module в поле куки с номером процесса[m
[31m-добавляет микросекунды на время старта.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_userid_module adds start time microseconds[m
[31m-to the cookie field contains a pid value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в error_log теперь записывается полная строка запроса вместо только URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the full request line instead of URI only is written to error_log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-variables support in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы resolver и resolver_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "resolver" and "resolver_timeout" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь директива "add_header last-modified ''" удаляет в заголовке ответа[m
[31m-строку "Last-Modified".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the directive "add_header last-modified ''" deletes a "Last-Modified"[m
[31m-response header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate не позволяла передавать на полной скорости,[m
[31m-даже если был указан очень большой лимит.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive did not allow to use full throughput,[m
[31m-even if limit value was very high.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.17" date="15.11.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка строки "If-Range" в заголовке запроса.<br/>[m
[31m-Спасибо Александру Инюхину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "If-Range" request header line support.<br/>[m
[31m-Thanks to Alexander V. Inyukhin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы msie_refresh повторно экранировались[m
[31m-уже экранированные символы;[m
[31m-ошибка появилась в 0.6.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-URL double escaping in a redirect of the "msie_refresh" directive;[m
[31m-the bug had appeared in 0.6.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива autoindex не работала при использовании "alias /".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "autoindex" directive did not work with the "alias /" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании подзапросов[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process if subrequests were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSL и gzip большие ответы могли передаваться не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the big responses may be transferred truncated if SSL and gzip were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ответ проксированного сервера был версии HTTP/0.9,[m
[31m-то переменная $status была равна 0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $status variable was equal to 0 if a proxied server returned response[m
[31m-in HTTP/0.9 version.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.16" date="29.10.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь на Linux используется uname(2) вместо procfs.<br/>[m
[31m-Спасибо Илье Новикову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the uname(2) is used on Linux instead of procfs.<br/>[m
[31m-Thanks to Ilya Novikov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве error_page использовался символ "?", то он экранировался[m
[31m-при проксировании запроса;[m
[31m-ошибка появилась в 0.6.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "?" character was in a "error_page" directive, then it was escaped[m
[31m-in a proxied request;[m
[31m-the bug had appeared in 0.6.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с mget.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-compatibility with mget.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.15" date="22.10.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-совместимость с Cygwin.<br/>[m
[31m-Спасибо Владимиру Кутакову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Cygwin compatibility.<br/>[m
[31m-Thanks to Vladimir Kutakov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива merge_slashes.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "merge_slashes" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_vary.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "gzip_vary" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_tokens.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_tokens" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не раскодировал URI в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not unescape URI in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной в директивах charset или source_charset[m
[31m-на старте или во время переконфигурации происходил segmentation fault,[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred on start or while reconfiguration[m
[31m-if variable was used in the "charset" or "source_charset" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx возвращал ошибку 400 на запросы вида[m
[31m-<nobr>"GET http://www.domain.com HTTP/1.0"</nobr>.<br/>[m
[31m-Спасибо James Oakley.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx returned the 400 response on requests like[m
[31m-<nobr>"GET http://www.domain.com HTTP/1.0"</nobr>.<br/>[m
[31m-Thanks to James Oakley.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления запроса с телом запроса с помощью директивы[m
[31m-error_page nginx пытался снова прочитать тело запроса;[m
[31m-ошибка появилась в 0.6.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if request with request body was redirected using the "error_page" directive,[m
[31m-then nginx tried to read the request body again;[m
[31m-the bug had appeared in 0.6.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе происходил segmentation fault, если у сервера,[m
[31m-обрабатывающему запрос, не был явно определён server_name;[m
[31m-ошибка появилась в 0.6.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if no server_name was explicitly defined for server processing request;[m
[31m-the bug had appeared in 0.6.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.14" date="15.10.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию команда SSI echo использует кодирование entity.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now by default the "echo" SSI command uses entity encoding.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр encoding в команде SSI echo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "encoding" parameter in the "echo" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву access_log можно использовать внутри блока limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access_log" directive may be used inside the "limit_except" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если все сервера апстрима оказывались недоступными,[m
[31m-то до восстановления работоспособности[m
[31m-у всех серверов вес становился равным одному;[m
[31m-ошибка появилась в 0.6.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if all upstream servers were failed, then all servers had got weight[m
[31m-the was equal one until servers became alive;[m
[31m-the bug had appeared in 0.6.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменных $date_local и $date_gmt вне модуля[m
[31m-ngx_http_ssi_filter_module в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if $date_local and $date_gmt were used outside the ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании включённом отладочном логе[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if debug log was enabled.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_memcached_module не устанавливал $upstream_response_time.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_memcached_module did not set $upstream_response_time.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс мог зациклиться при использовании memcached.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop, if the memcached was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx распознавал параметры "close" и "keep-alive" в строке "Connection"[m
[31m-в заголовке запроса только, если они были в нижнем регистре;[m
[31m-ошибка появилась в 0.6.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx supported low case only "close" and "keep-alive" values[m
[31m-in the "Connection" request header line;[m
[31m-the bug had appeared in 0.6.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-sub_filter не работал с пустой строкой замены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-sub_filter did not work with empty substitution.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в парсинге sub_filter.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in sub_filter parsing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.13" date="24.09.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не закрывал файл каталога для запроса HEAD,[m
[31m-если использовался autoindex<br/>[m
[31m-Спасибо Arkadiusz Patyk.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not close directory file on HEAD request if autoindex was used.<br/>[m
[31m-Thanks to Arkadiusz Patyk.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.12" date="21.09.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер разделён на три модуля: pop3, imap и smtp.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-mail proxy was split on three modules: pop3, imap and smtp.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры конфигурации --without-mail_pop3_module,[m
[31m---without-mail_imap_module и --without-mail_smtp_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --without-mail_pop3_module, --without-mail_imap_module,[m
[31m-and --without-mail_smtp_module configuration parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы smtp_greeting_delay и smtp_client_buffer модуля ngx_mail_smtp_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "smtp_greeting_delay" and "smtp_client_buffer" directives[m
[31m-of the ngx_mail_smtp_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-wildcard в конце имени сервера не работали;[m
[31m-ошибка появилась в 0.6.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the trailing wildcards did not work;[m
[31m-the bug had appeared in 0.6.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании разделяемой библиотеки PCRE,[m
[31m-расположенной в нестандартном месте, nginx не запускался на Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not start on Solaris if the shared PCRE library located[m
[31m-in non-standard place was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_hide_header и fastcgi_hide_header не скрывали[m
[31m-строки заголовка ответа с именем больше 32 символов.<br/>[m
[31m-Спасибо Manlio Perillo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_hide_header" and "fastcgi_hide_header" directives did not[m
[31m-hide response header lines whose name was longer than 32 characters.<br/>[m
[31m-Thanks to Manlio Perillo.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.11" date="11.09.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-счётчик активных соединений всегда рос при использовании почтового[m
[31m-прокси-сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-active connection counter always increased if mail proxy was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд возвращал только заголовок ответа при небуферизированном[m
[31m-проксировании, то nginx закрывал соединение с бэкендом по таймауту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if backend returned response header only using non-buffered proxy,[m
[31m-then nginx closed backend connection on timeout.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не поддерживал несколько строк "Connection" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not support several "Connection" request header lines.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в сервере апстрима был задан max_fails, то после первой же неудачной[m
[31m-попытки вес сервера навсегда становился равным одному;[m
[31m-ошибка появилась в 0.6.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "max_fails" was set for upstream server, then after first[m
[31m-failure server weight was always one;[m
[31m-the bug had appeared in 0.6.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.10" date="03.09.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы open_file_cache, open_file_cache_retest и open_file_cache_errors.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "open_file_cache", "open_file_cache_retest", and "open_file_cache_errors"[m
[31m-directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-утечки сокетов;[m
[31m-ошибка появилась в 0.6.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-socket leak;[m
[31m-the bug had appeared in 0.6.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-В строку заголовка ответа "Content-Type", указанную в методе[m
[31m-$r->send_http_header(), не добавлялась кодировка, указанная в директиве charset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a charset set by the "charset" directive was not appended[m
[31m-to the "Content-Type" header set by $r->send_http_header().[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода /dev/poll[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if /dev/poll method was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.9" date="28.08.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс мог зациклиться при использовании протокола HTTPS;[m
[31m-ошибка появилась в 0.6.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop,[m
[31m-if the HTTPS protocol was used;[m
[31m-the bug had appeared in 0.6.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если сервер слушал на двух адресах или портах, то nginx не запускался[m
[31m-при использовании wildcard в конце имени сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if server listened on two addresses or ports and trailing wildcard was used,[m
[31m-then nginx did not run.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ip_hash могла неверно помечать сервера как нерабочие.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ip_hash" directive might incorrectly mark servers as down.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на amd64;[m
[31m-ошибка появилась в 0.6.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on amd64;[m
[31m-the bug had appeared in 0.6.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.8" date="20.08.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx пытается установить директивы worker_priority,[m
[31m-worker_rlimit_nofile, worker_rlimit_core, worker_rlimit_sigpending[m
[31m-без привилегий root'а.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx tries to set the "worker_priority", "worker_rlimit_nofile",[m
[31m-"worker_rlimit_core", and "worker_rlimit_sigpending" without super-user[m
[31m-privileges.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx экранирует символы пробела и "%" при передаче запроса[m
[31m-серверу аутентификации почтового прокси-сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx escapes space and "%" in request to a mail proxy authentication[m
[31m-server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx экранирует символ "%" в переменной $memcached_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx escapes "%" in $memcached_key variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при указании относительного пути к конфигурационному файлу в качестве[m
[31m-параметра ключа -c nginx определял путь относительно конфигурационного префикса;[m
[31m-ошибка появилась в 0.6.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx used path relative to configuration prefix for non-absolute[m
[31m-configuration file path specified in the "-c" key;[m
[31m-the bug had appeared in 0.6.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на FreeBSD/sparc64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on FreeBSD/sparc64.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.7" date="15.08.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь пути, указанные в директивах include, auth_basic_user_file,[m
[31m-perl_modules, ssl_certificate, ssl_certificate_key и[m
[31m-ssl_client_certificate, определяются относительно каталога конфигурационного[m
[31m-файла nginx.conf, а не относительно префикса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the paths specified in the "include", "auth_basic_user_file",[m
[31m-"perl_modules", "ssl_certificate", "ssl_certificate_key", and[m
[31m-"ssl_client_certificate" directives are relative to directory of[m
[31m-nginx configuration file nginx.conf, but not to nginx prefix directory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр --sysconfdir=PATH в configure упразднён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --sysconfdir=PATH option in configure was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-для обновления на лету версий 0.1.x создан специальный сценарий[m
[31m-<nobr>make upgrade1.</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the special make target "upgrade1" was defined for online upgrade of[m
[31m-0.1.x versions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы server_name и valid_referers поддерживают регулярные выражения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" and "valid_referers" directives support regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server в блоке upstream поддерживает параметр backup.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server" directive in the "upstream" context supports[m
[31m-the "backup" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->discard_request_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->discard_request_body.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива "add_header Last-Modified ..." меняет строку "Last-Modified"[m
[31m-в заголовке ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header Last-Modified ..." directive changes the "Last-Modified"[m
[31m-response header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если на запрос с телом возвращался ответ с кодом HTTP отличным от 200,[m
[31m-и после этого запроса соединение переходило в состояние keep-alive,[m
[31m-то на следующий запрос nginx возвращал 400.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a response different than 200 was returned to a request with body[m
[31m-and connection went to the keep-alive state after the request, then[m
[31m-nginx returned 400 for the next request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве auth_http был задан неправильный адрес, то[m
[31m-в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if invalid address was set in the "auth_http" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь по умолчанию nginx использует значение 511 для listen backlog[m
[31m-на всех платформах, кроме FreeBSD.<br/>[m
[31m-Спасибо Jiang Hong.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses default listen backlog value 511 on all platforms[m
[31m-except FreeBSD.<br/>[m
[31m-Thanks to Jiang Hong.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочий процесс мог зациклиться, если server в блоке upstream был помечен[m
[31m-как down;[m
[31m-ошибка появилась в 0.6.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop, if a "server" inside[m
[31m-"upstream" block was marked as "down";[m
[31m-the bug had appeared in 0.6.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-sendfilev() в Solaris теперь не используется при передаче тела запроса[m
[31m-FastCGI-серверу через unix domain сокет.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now Solaris sendfilev() is not used to transfer the client request body[m
[31m-to FastCGI-server via the unix domain socket.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.6" date="30.07.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр --sysconfdir=PATH в configure.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --sysconfdir=PATH option in configure.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-именованные location'ы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-named locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменную $args можно устанавливать с помощью set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $args variable can be set with the "set" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $is_args.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $is_args variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-равномерное распределение запросов к апстримам с большими весами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fair big weight upstream balancer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если клиент в почтовом прокси-сервере закрывал соединение,[m
[31m-то nginx мог не закрывать соединение с бэкендом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a client has closed connection to mail proxy[m
[31m- then nginx might not close connection to backend.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании одного хоста в качестве бэкендов для протоколов HTTP и HTTPS[m
[31m-без явного указания портов, nginx использовал только один порт&mdash;80 или 443.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the same host without specified port was used as backend for HTTP and HTTPS,[m
[31m-then nginx used only one port&mdash;80 or 443.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris/amd64 Sun Studio 11 и более ранними версиями;[m
[31m-ошибка появилась в 0.6.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-fix building on Solaris/amd64 by Sun Studio 11 and early versions;[m
[31m-the bug had appeared in 0.6.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.5" date="23.07.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $nginx_version.<br/>[m
[31m-Спасибо Николаю Гречуху.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-$nginx_version variable.<br/>[m
[31m-Thanks to Nick S. Grechukh.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер поддерживает AUTHENTICATE в режиме IMAP.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy supports AUTHENTICATE in IMAP mode.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер поддерживает STARTTLS в режиме SMTP.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy supports STARTTLS in SMTP mode.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx экранирует пробел в переменной $memcached_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx escapes space in $memcached_key variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx неправильно собирался Sun Studio на Solaris/amd64.<br/>[m
[31m-Спасибо Jiang Hong.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx was incorrectly built by Sun Studio on Solaris/amd64.<br/>[m
[31m-Thanks to Jiang Hong.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-незначительных потенциальных ошибок.<br/>[m
[31m-Спасибо Coverity's Scan.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of minor potential bugs.<br/>[m
[31m-Thanks to Coverity's Scan.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.4" date="17.07.2007">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы msie_refresh был возможен XSS.<br/>[m
[31m-Спасибо Максиму Богуку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "msie_refresh" directive allowed XSS.<br/>[m
[31m-Thanks to Maxim Boguk.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_store и fastcgi_store изменены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store" and "fastcgi_store" directives were changed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_store_access и fastcgi_store_access.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store_access" and "fastcgi_store_access" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на Solaris/sparc64, если был собран Sun Studio.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on Solaris/sparc64 if it was built by Sun Studio.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки в Sun Studio 12.<br/>[m
[31m-Спасибо Jiang Hong.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for Sun Studio 12.<br/>[m
[31m-Thanks to Jiang Hong.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.3" date="12.07.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_store и fastcgi_store.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_store" and "fastcgi_store" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы auth_http_header[m
[31m-в рабочем процессе мог произойти segmentation fault.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the "auth_http_header" directive was used.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался метод аутентификации CRAM-MD5, но он не был разрешён,[m
[31m-то в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if the CRAM-MD5 authentication method was used, but it was not enabled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании протокола HTTPS в директиве proxy_pass[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process when[m
[31m-the HTTPS protocol was used in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в рабочем процессе мог произойти segmentation fault,[m
[31m-если использовался метод eventport.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the eventport method was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ignore_client_abort и fastcgi_ignore_client_abort не работали;[m
[31m-ошибка появилась в 0.5.13.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ignore_client_abort" and "fastcgi_ignore_client_abort" directives[m
[31m-did not work;[m
[31m-the bug had appeared in 0.5.13.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.2" date="09.07.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если заголовок ответа был разделён в FastCGI-записях, то nginx передавал[m
[31m-клиенту мусор в таких заголовках.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the FastCGI header was split in records,[m
[31m-then nginx passed garbage in the header to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.1" date="17.06.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в парсинге SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in SSI parsing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании удалённого подзапроса в SSI последующий[m
[31m-подзапрос локального файла мог отдаваться клиенту в неверном порядке.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if remote SSI subrequest was used, then posterior local file subrequest[m
[31m-might transferred to client in wrong order.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-большие включения в SSI, сохранённые во временные файлы,[m
[31m-передавались не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-large SSI inclusions buffered in temporary files were truncated.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-значение perl'овой переменной $$ модуля ngx_http_perl_module было равно[m
[31m-номеру главного процесса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the perl $$ variable value in ngx_http_perl_module was equal to the master[m
[31m-process identification number.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.6.0" date="14.06.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы "server_name", "map", and "valid_referers" поддерживают[m
[31m-маски вида "www.example.*".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name", "map", and "valid_referers" directives support[m
[31m-the "www.example.*" wildcards.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.25" date="11.06.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-http_rewrite_module;[m
[31m-ошибка появилась в 0.5.24.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the --without-http_rewrite_module parameter;[m
[31m-the bug had appeared in 0.5.24.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.24" date="06.06.2007">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-директива ssl_verify_client не работала, если запрос выполнялся[m
[31m-по протоколу HTTP/0.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_verify_client" directive did not work if request was made[m
[31m-using HTTP/0.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании сжатия часть ответа могла передаваться несжатой;[m
[31m-ошибка появилась в 0.5.23.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a part of response body might be passed uncompressed if gzip was used;[m
[31m-the bug had appeared in 0.5.23.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.23" date="04.06.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssl_module поддерживает расширение TLS Server Name Indication.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssl_module supports Server Name Indication TLS extension.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_catch_stderr.<br/>[m
[31m-Спасибо Николаю Гречуху, проект OWOX.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_catch_stderr" directive.<br/>[m
[31m-Thanks to Nick S. Grechukh, OWOX project.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Линуксе в основном процессе происходил segmentation fault,[m
[31m-если два виртуальных сервера должны bind()ится к пересекающимся портам.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in master process if[m
[31m-two virtual servers should bind() to the overlapping ports.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_perl_module и perl[m
[31m-поддерживал потоки, то во время второй переконфигурации[m
[31m-выдавались ошибки "panic: MUTEX_LOCK" и "perl_parse() failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with ngx_http_perl_module and perl supported threads,[m
[31m-then during second reconfiguration the error messages[m
[31m-"panic: MUTEX_LOCK" and "perl_parse() failed" were issued.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании протокола HTTPS в директиве proxy_pass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the HTTPS protocol in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.22" date="29.05.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-большое тело запроса могло не передаваться бэкенду;[m
[31m-ошибка появилась в 0.5.21.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a big request body might not be passed to backend;[m
[31m-the bug had appeared in 0.5.21.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.21" date="28.05.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если внутри сервера описано больше примерно десяти location'ов,[m
[31m-то location'ы, заданные с помощью регулярного выражения,[m
[31m-могли выполняться не в том, порядке, в каком они описаны.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if server has more than about ten locations, then regex locations[m
[31m-might be chosen not in that order as they were specified.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на 64-битной платформе рабочий процесс мог зациклиться, если 33-тий[m
[31m-по счёту или последующий бэкенд упал.<br/>[m
[31m-Спасибо Антону Поварову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop on 64-bit platform,[m
[31m-if the 33-rd or next in succession backend has failed.<br/>[m
[31m-Thanks to Anton Povarov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании библиотеки PCRE на Solaris/sparc64[m
[31m-мог произойти bus error.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a bus error might occur on Solaris/sparc64 if the PCRE library was used.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании протокола HTTPS в директиве proxy_pass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the HTTPS protocol in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.20" date="07.05.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива sendfile_max_chunk.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile_max_chunk" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$http_...", "$sent_http_..." и "$upstream_http_..."[m
[31m-можно менять директивой set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$http_...", "$sent_http_...", and "$upstream_http_..." variables[m
[31m-may be changed using the "set" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSI-команды 'if expr="$var = /"'[m
[31m-в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the SSI command 'if expr="$var = /"' was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-завершающая строка multipart range ответа передавалась неверно.<br/>[m
[31m-Спасибо Evan Miller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-trailing boundary of multipart range response was transferred incorrectly.<br/>[m
[31m-Thanks to Evan Miller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на Solaris/sparc64, если был собран Sun Studio.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on Solaris/sparc64 if it was built by Sun Studio.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module не собирался make в Solaris.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module could not be built by Solaris make.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.19" date="24.04.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-значение переменной $request_time теперь записывается с точностью[m
[31m-до миллисекунд.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the $request_time variable has millisecond precision.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-метод $r->rflush в модуле ngx_http_perl_module переименован в $r->flush.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the method $r->rflush of ngx_http_perl_module was renamed to the $r->flush.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_addr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_addr variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_headers_hash_max_size и proxy_headers_hash_bucket_size.<br/>[m
[31m-Спасибо Володымыру Костырко.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_headers_hash_max_size" and "proxy_headers_hash_bucket_size"[m
[31m-directives.<br/>[m
[31m-Thanks to Volodymyr Kostyrko.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile и limit_rate на 64-битных платформах[m
[31m-нельзя было передавать файлы больше 2G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files more than 2G could not be transferred using sendfile and limit_rate[m
[31m-on 64-bit platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile на 64-битном Linux нельзя было передавать файлы[m
[31m-больше 2G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files more than 2G could not be transferred using sendfile on 64-bit Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.18" date="19.04.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_sub_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$upstream_http_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$upstream_http_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь переменные $upstream_status и $upstream_response_time[m
[31m-содержат данные о всех обращениях к апстримам, сделанным до X-Accel-Redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the $upstream_status and $upstream_response_time variables[m
[31m-keep data about all upstreams before X-Accel-Redirect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_perl_module и perl[m
[31m-не поддерживал multiplicity, то после первой переконфигурации[m
[31m-и после получения любого сигнала[m
[31m-в основном процессе происходил segmentation fault;[m
[31m-ошибка появилась в 0.5.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in master process[m
[31m-after first reconfiguration and receiving any signal[m
[31m-if nginx was built with ngx_http_perl_module and perl[m
[31m-did not support multiplicity;[m
[31m-the bug had appeared in 0.5.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если perl не поддерживал multiplicity, то после переконфигурации[m
[31m-перловый код не работал;[m
[31m-ошибка появилась в 0.3.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if perl did not support multiplicity, then after reconfiguration[m
[31m-perl code did not work;[m
[31m-the bug had appeared in 0.3.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.17" date="02.04.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx для метода TRACE всегда возвращает код 405.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx always returns the 405 status for the TRACE method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx поддерживает директиву include внутри блока types.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx supports the "include" directive inside the "types" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-использование переменной $document_root в директиве root и alias[m
[31m-запрещено: оно вызывало рекурсивное переполнение стека.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $document_root variable usage in the "root" and "alias" directives[m
[31m-is disabled: this caused recursive stack overflow.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании протокола HTTPS в директиве proxy_pass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the HTTPS protocol in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в некоторых случаях некэшируемые переменные (такие, как $uri)[m
[31m-возвращали старое закэшированное значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in some cases non-cacheable variables (such as $uri variable)[m
[31m-returned old cached value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.16" date="26.03.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в качестве ключа для хэша в директиве ip_hash не использовалась сеть[m
[31m-класса С.<br/>[m
[31m-Спасибо Павлу Ярковому.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the C-class network was not used as hash key in the "ip_hash" directive.<br/>[m
[31m-Thanks to Pavel Yarkovoy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в строке "Content-Type" в заголовке ответа бэкенда был указан charset[m
[31m-и строка завершалась символом ";",[m
[31m-то в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if a charset was set in the "Content-Type" header line and the line[m
[31m-has trailing ";";[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "[alert] zero size buf" при работе с FastCGI-сервером, если[m
[31m-тело запроса, записанное во временный файл, было кратно 32K.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error when FastCGI server was used and[m
[31m-a request body written in a temporary file was multiple of 32K.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Solaris без параметра --with-debug;[m
[31m-ошибка появилась в 0.5.15.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Solaris without the --with-debug option;[m
[31m-the bug had appeared in 0.5.15.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.15" date="19.03.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-почтовый прокси-сервер поддерживает аутентифицированное SMTP-проксирование и[m
[31m-директивы smtp_auth, smtp_capabilities и xclient.<br/>[m
[31m-Спасибо Антону Южанинову и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mail proxy supports authenticated SMTP proxying and[m
[31m-the "smtp_auth", "smtp_capabilities", and "xclient" directives.<br/>[m
[31m-Thanks to Anton Yuzhaninov and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь keep-alive соединения закрываются сразу же по получении сигнала[m
[31m-переконфигурации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the keep-alive connections are closed just after receiving[m
[31m-the reconfiguration signal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы imap и auth переименованы соответственно в mail и pop3_auth.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "imap" and "auth" directives were renamed[m
[31m-to the "mail" and "pop3_auth" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовался метод аутентификации CRAM-MD5 и не был разрешён метод APOP,[m
[31m-то в рабочем процессе происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred in worker process[m
[31m-if the CRAM-MD5 authentication method was used[m
[31m-and the APOP method was disabled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы starttls only в протоколе POP3 nginx[m
[31m-разрешал аутентификацию без перехода в режим SSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "starttls only" directive was used in POP3 protocol,[m
[31m-then nginx allowed authentication without switching to the SSL mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочие процессы не выходили после переконфигурации и не переоткрывали логи,[m
[31m-если использовался метод eventport.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-worker processes did not exit after reconfiguration and[m
[31m-did not rotate logs if the eventport method was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы ip_hash рабочий процесс мог зациклиться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop,[m
[31m-if the "ip_hash" directive was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь nginx не пишет в лог некоторые alert'ы,[m
[31m-если используются методы eventport или /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx does not log some alerts if eventport or /dev/poll methods are used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.14" date="23.02.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx игнорировал лишние закрывающие скобки "}" в конце[m
[31m-конфигурационного файла.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx ignored superfluous closing "}" in the end of configuration file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.13" date="19.02.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-методы COPY и MOVE.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the COPY and MOVE methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_realip_module устанавливал мусор для запросов,[m
[31m-переданных по keep-alive соединению.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_realip_module set garbage for requests passed via[m
[31m-keep-alive connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на 64-битном big-endian Linux.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not work on big-endian 64-bit Linux.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при получении слишком длинной команды IMAP/POP3-прокси теперь сразу[m
[31m-закрывает соединение, а не по таймауту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now when IMAP/POP3 proxy receives too long command it closes the connection[m
[31m-right away, but not after timeout.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании метода epoll клиент закрывал преждевременно[m
[31m-соединение со своей стороны, то nginx закрывал это соединение только[m
[31m-по истечении таймаута на передачу.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "epoll" method was used and a client closed a connection prematurely,[m
[31m-then nginx closed the connection after a send timeout only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.5.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.5.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.12" date="12.02.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.5.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.5.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании временных файлов в время работы с FastCGI-сервером[m
[31m-в рабочем процессе мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.5.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the temporary files were used while working with FastCGI server;[m
[31m-the bug had appeared in 0.5.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если переменная $fastcgi_script_name записывалась в лог,[m
[31m-то в рабочем процессе мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if the $fastcgi_script_name variable was logged.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_perl_module не собирался на Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module could not be built on Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.11" date="05.02.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь configure определяет библиотеку PCRE в MacPorts.<br/>[m
[31m-Спасибо Chris McGrath.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now configure detects system PCRE library in MacPorts.<br/>[m
[31m-Thanks to Chris McGrath.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ был неверным, если запрашивалось несколько диапазонов;[m
[31m-ошибка появилась в 0.5.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response was incorrect if several ranges were requested;[m
[31m-the bug had appeared in 0.5.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива create_full_put_path не могла создавать промежуточные каталоги,[m
[31m-если не была установлена директива dav_access.<br/>[m
[31m-Спасибо Evan Miller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "create_full_put_path" directive could not create the intermediate[m
[31m-directories if no "dav_access" directive was set.<br/>[m
[31m-Thanks to Evan Miller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-вместо кодов ошибок "400" и "408" в access_log мог записываться код "0".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "0" response code might be logged in the access_log instead of[m
[31m-the "400" and "408" error codes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при сборке с оптимизацией -O2 в рабочем процессе мог произойти[m
[31m-segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if nginx was built with -O2 optimization.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.10" date="26.01.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время обновления исполняемого файла новый процесс не наследовал[m
[31m-слушающие сокеты;[m
[31m-ошибка появилась в 0.5.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while online executable file upgrade the new master process did not[m
[31m-inherit the listening sockets;[m
[31m-the bug had appeared in 0.5.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при сборке с оптимизацией -O2 в рабочем процессе мог произойти[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 0.5.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur in worker process[m
[31m-if nginx was built with -O2 optimization;[m
[31m-the bug had appeared in 0.5.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.9" date="25.01.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_memcached_module теперь в качестве ключа использует[m
[31m-значение переменной $memcached_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_memcached_module uses the $memcached_key variable value[m
[31m-as a key.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $memcached_key.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $memcached_key variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр clean в директиве client_body_in_file_only.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "clean" parameter in the "client_body_in_file_only" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива env.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "env" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива sendfile работает внутри блока if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "sendfile" directive is available inside the "if" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь при ошибке записи в access_log nginx записывает сообщение в error_log,[m
[31m-но не чаще одного раза в минуту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on failure of the writing to access nginx logs a message to error_log,[m
[31m-but not more often than once a minute.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива "access_log off" не всегда запрещала запись в лог.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access_log off" directive did not always turn off the logging.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.8" date="19.01.2007">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если использовалась директива <nobr>"client_body_in_file_only on"</nobr>[m
[31m-и тело запроса было небольшое, то мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if[m
[31m-<nobr>"client_body_in_file_only on"</nobr> was used[m
[31m-and a request body was small.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если использовались директивы[m
[31m-<nobr>"client_body_in_file_only on"</nobr>[m
[31m-и <nobr>"proxy_pass_request_body off"</nobr>[m
[31m-или <nobr>"fastcgi_pass_request_body off"</nobr>,[m
[31m-и делался переход к следующему бэкенду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if <nobr>"client_body_in_file_only on"</nobr>[m
[31m-and <nobr>"proxy_pass_request_body off"</nobr>[m
[31m-or <nobr>"fastcgi_pass_request_body off"</nobr>[m
[31m-directives were used, and nginx switched to a next upstream.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании директивы "proxy_buffering off" соединение с клиентом[m
[31m-было неактивно, то оно закрывалось по таймауту, заданному директивой[m
[31m-send_timeout;[m
[31m-ошибка появилась в 0.4.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_buffering off" directive was used and a client connection[m
[31m-was non-active, then the connection was closed after send timeout;[m
[31m-the bug had appeared in 0.4.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании метода epoll клиент закрывал преждевременно[m
[31m-соединение со своей стороны, то nginx закрывал это соединение только[m
[31m-по истечении таймаута на передачу.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "epoll" method was used and a client closed a connection prematurely,[m
[31m-then nginx closed the connection after a send timeout only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "[alert] zero size buf" при работе с FastCGI-сервером.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error when FastCGI server was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправление ошибок в директиве limit_zone.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in the "limit_zone" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.7" date="15.01.2007">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-оптимизация использования памяти в ssl_session_cache.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ssl_session_cache storage optimization.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправление ошибок в директивах ssl_session_cache и limit_zone.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in the "ssl_session_cache" and "limit_zone" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на старте или во время переконфигурации происходил segmentation fault,[m
[31m-если директивы ssl_session_cache или limit_zone использовались[m
[31m-на 64-битных платформах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred on start or while reconfiguration[m
[31m-if the "ssl_session_cache" or "limit_zone" directives were used[m
[31m-on 64-bit platforms.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директив add_before_body или add_after_body происходил[m
[31m-segmentation fault, если в заголовке ответа нет строки "Content-Type".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if the "add_before_body" or "add_after_body"[m
[31m-directives were used and there was no "Content-Type" header line in response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-библиотека OpenSSL всегда собиралась с поддержкой потоков.<br/>[m
[31m-Спасибо Дену Иванову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the OpenSSL library was always built with the threads support.<br/>[m
[31m-Thanks to Den Ivanov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость библиотеки PCRE-6.5+ и компилятора icc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the PCRE-6.5+ library and the icc compiler compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.6" date="09.01.2007">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь модуль ngx_http_index_module игнорирует все методы,[m
[31m-кроме GET, HEAD и POST.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_index_module ignores all methods except the GET, HEAD, and[m
[31m-POST methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_limit_zone_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_limit_zone_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $binary_remote_addr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $binary_remote_addr variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_session_cache модулей ngx_http_ssl_module и ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_cache" directives[m
[31m-of the ngx_http_ssl_module and ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-метод DELETE поддерживает рекурсивное удаление.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the DELETE method supports recursive removal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании $r->sendfile() byte-ranges передавались неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the byte-ranges were transferred incorrectly if the $r->sendfile() was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.5" date="24.12.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ключ -v больше не выводит информацию о компиляторе.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -v switch does not show compiler information any more.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -V.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -V switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_rlimit_core поддерживает указание размера в K, M и G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_rlimit_core" directive supports size in K, M, and G.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль nginx.pm теперь может устанавливаться непривилегированным пользователем.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the nginx.pm module now could be installed by an unprivileged user.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании методов $r->request_body или $r->request_body_file мог[m
[31m-произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if the $r->request_body or[m
[31m-$r->request_body_file methods were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибок, специфичных для платформы ppc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ppc platform specific bugs.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.4" date="15.12.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву perl можно использовать внутри блока limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "perl" directive may be used inside the "limit_except" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module требовал строку "Date" в заголовке запроса[m
[31m-для метода DELETE.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module required the "Date" request header line[m
[31m-for the DELETE method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании одного параметра в директиве dav_access nginx мог[m
[31m-сообщить об ошибке в конфигурации.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if one only parameter was used in the "dav_access" directive, then[m
[31m-nginx might report about configuration error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной $host мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.4.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if the $host variable was used;[m
[31m-the bug had appeared in 0.4.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.3" date="13.12.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает методы $r->status, $r->log_error[m
[31m-и $r->sleep.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->status, $r->log_error,[m
[31m-and $r->sleep methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-метод $r->variable поддерживает переменные, неописанные в конфигурации nginx'а.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->variable method supports variables that do not exist in nginx[m
[31m-configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод $r->has_request_body не работал.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->has_request_body method did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.2" date="11.12.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директивах proxy_pass использовалось имя, указанное в upstream,[m
[31m-то nginx пытался найти IP-адрес этого имени;[m
[31m-ошибка появилась в 0.5.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_pass" directive used the name of the "upstream" block,[m
[31m-then nginx tried to resolve the name;[m
[31m-the bug had appeared in 0.5.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.1" date="11.12.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива post_action могла не работать после неудачного завершения запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_action" directive might not run after a unsuccessful completion[m
[31m-of a request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки в Eudora для Mac;[m
[31m-ошибка появилась в 0.4.11.<br/>[m
[31m-Спасибо Bron Gondwana.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for Eudora for Mac;[m
[31m-the bug had appeared in 0.4.11.<br/>[m
[31m-Thanks to Bron Gondwana.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при указании в директиве fastcgi_pass имени описанного upstream'а выдавалось[m
[31m-сообщение "no port in upstream";[m
[31m-ошибка появилась в 0.5.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "upstream" name was used in the "fastcgi_pass", then the message[m
[31m-"no port in upstream" was issued;[m
[31m-the bug had appeared in 0.5.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директивах proxy_pass и fastcgi_pass использовались одинаковых имена[m
[31m-серверов, но с разными портами, то эти директивы использовали первый[m
[31m-описанный порт;[m
[31m-ошибка появилась в 0.5.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_pass" and "fastcgi_pass" directives used the same servers but[m
[31m-different ports, then these directives uses the first described port;[m
[31m-the bug had appeared in 0.5.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директивах proxy_pass и fastcgi_pass использовались unix domain сокеты,[m
[31m-то эти директивы использовали первый описанный сокет;[m
[31m-ошибка появилась в 0.5.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_pass" and "fastcgi_pass" directives used the unix domain sockets,[m
[31m-then these directives used first described socket;[m
[31m-the bug had appeared in 0.5.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_auth_basic_module игнорировал пользователя, если он был указан[m
[31m-в последней строке файла паролей и после пароля не было перевода строки,[m
[31m-возврата каретки или символа ":".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_auth_basic_module ignored the user if it was in the last line in[m
[31m-the password file and there was no the carriage return, the line feed,[m
[31m-or the ":" symbol after the password.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_time могла быть равна "0.000", хотя время[m
[31m-обработки было больше 1 миллисекунды.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_time variable might be equal to "0.000", although[m
[31m-response time was more than 1 millisecond.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.5.0" date="04.12.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметры в виде "%name" в директиве log_format больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the parameters in the "%name" form in the "log_format" directive[m
[31m-are not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_upstream_max_fails, proxy_upstream_fail_timeout,[m
[31m-fastcgi_upstream_max_fails, и fastcgi_upstream_fail_timeout,[m
[31m-memcached_upstream_max_fails и memcached_upstream_fail_timeout[m
[31m-больше не поддерживаются.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_upstream_max_fails", "proxy_upstream_fail_timeout",[m
[31m-"fastcgi_upstream_max_fails", "fastcgi_upstream_fail_timeout",[m
[31m-"memcached_upstream_max_fails", and "memcached_upstream_fail_timeout"[m
[31m-directives are not supported anymore.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server в блоке upstream поддерживает параметры[m
[31m-max_fails, fail_timeout и down.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server" directive in the "upstream" context supports[m
[31m-the "max_fails", "fail_timeout", and "down" parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ip_hash в блоке upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ip_hash" directive inside the "upstream" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-статус WAIT в строке "Auth-Status" в заголовке ответа сервера аутентификации[m
[31m-IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the WAIT status in the "Auth-Status" header line of the IMAP/POP3 proxy[m
[31m-authentication server response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на 64-битных платформах;[m
[31m-ошибка появилась в 0.4.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on 64-bit platforms;[m
[31m-the bug had appeared in 0.4.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.14" date="27.11.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass_error_message в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass_error_message" directive in IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь configure определяет библиотеку PCRE на FreeBSD, Linux и NetBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now configure detects system PCRE library on FreeBSD, Linux, and NetBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_perl_module не работал с перлом, собранным с поддержкой потоков;[m
[31m-ошибка появилась в 0.3.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module did not work with perl built with the threads support;[m
[31m-the bug had appeared in 0.3.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_perl_module не работал корректно, если перл вызывался рекурсивно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module did not work if perl was called recursively.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx игнорировал имя сервера в строке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx ignored a host name in a request line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если FastCGI сервер передавал много в stderr,[m
[31m-то рабочий процесс мог зациклиться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop,[m
[31m-if a FastCGI server sent too many data to the stderr.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при изменении системного времени переменная $upstream_response_time[m
[31m-могла быть отрицательной.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_time variable may be negative if the system time[m
[31m-was changed backward.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании POP3 серверу аутентификации IMAP/POP3 прокси[m
[31m-не передавался параметр Auth-Login-Attempt.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Auth-Login-Attempt" parameter was not sent to[m
[31m-IMAP/POP3 proxy authentication server when POP3 was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при ошибке соединения с сервером аутентификации IMAP/POP3 прокси[m
[31m-мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if connect to IMAP/POP3 proxy[m
[31m-authentication server failed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.13" date="15.11.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директиву proxy_pass можно использовать внутри блока limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" directive may be used inside the "limit_except" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива limit_except поддерживает все WebDAV методы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_except" directive supports all WebDAV methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы add_before_body без директивы add_after_body[m
[31m-ответ передавался не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "add_before_body" directive was used without[m
[31m-the "add_after_body" directive, then a response did not transferred complete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-большое тело запроса не принималось, если использовались метод epoll[m
[31m-и deferred accept().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a large request body did not receive if the epoll method[m
[31m-and the deferred accept() were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для ответов модуля ngx_http_autoindex_module не выставлялась кодировка;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a charset could not be set for ngx_http_autoindex_module responses;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "[alert] zero size buf" при работе с FastCGI-сервером;[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error when FastCGI server was used;[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр конфигурации --group= игнорировался.<br/>[m
[31m-Спасибо Thomas Moschny.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --group= configuration parameter was ignored.<br/>[m
[31m-Thanks to Thomas Moschny.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-50-й подзапрос в SSI ответе не работал;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the 50th subrequest in SSI response did not work;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.12" date="31.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->variable.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->variable method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении в ответ большого статического файла с помощью SSI[m
[31m-ответ мог передаваться не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a big static file was included using SSI in a response,[m
[31m-then the response may be transferred incomplete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не убирал "#fragment" в URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not omit the "#fragment" part in URI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.11" date="25.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-POP3 прокси поддерживает AUTH LOIGN PLAIN и CRAM-MD5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the POP3 proxy supports the AUTH LOGIN PLAIN and CRAM-MD5.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->allow_ranges.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->allow_ranges method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включённой поддержке команды APOP в POP3 прокси могли[m
[31m-не работать команды USER/PASS;[m
[31m-ошибка появилась в 0.4.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the APOP was enabled in the POP3 proxy, then the USER/PASS commands[m
[31m-might not work;[m
[31m-the bug had appeared in 0.4.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.10" date="23.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-POP3 прокси поддерживает APOP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the POP3 proxy supports the APOP command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании методов select, poll и /dev/poll во время ожидания[m
[31m-ответа от сервера аутентификации IMAP/POP3 прокси нагружал процессор.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the select, poll or /dev/poll methods were used, then while[m
[31m-waiting authentication server response the IMAP/POP3 proxy hogged CPU.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменной $server_addr в директиве map мог[m
[31m-произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault might occur if the $server_addr variable was used[m
[31m-in the "map" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_flv_module не поддерживал byte ranges для полных ответов;[m
[31m-ошибка появилась в 0.4.7.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_flv_module did not support the byte ranges for full responses;[m
[31m-the bug had appeared in 0.4.7.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Debian amd64;[m
[31m-ошибка появилась в 0.4.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Debian amd64;[m
[31m-the bug had appeared in 0.4.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.9" date="13.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр set в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set" parameter in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module теперь проверяет версию модуля nginx.pm.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module now tests the nginx.pm module version.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.8" date="11.10.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если до команды SSI include с параметром wait выполнялась ещё[m
[31m-одна команда SSI include, то параметр wait мог не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if an "include" SSI command were before another "include" SSI command[m
[31m-with a "wait" parameter, then the "wait" parameter might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_flv_module добавлял FLV-заголовок для полных ответов.<br/>[m
[31m-Спасибо Алексею Ковырину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_flv_module added the FLV header to the full responses.<br/>[m
[31m-Thanks to Alexey Kovyrin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.7" date="10.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_flv_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_flv_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $request_body_file.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_body_file variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы charset и source_charset поддерживают переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "charset" and "source_charset" directives support the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если до команды SSI include с параметром wait выполнялась ещё[m
[31m-одна команда SSI include, то параметр wait мог не работать.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if an "include" SSI command were before another "include" SSI command[m
[31m-with a "wait" parameter, then the "wait" parameter might not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании директивы "proxy_buffering off" или при работе[m
[31m-с memcached соединения могли не закрываться по таймауту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_buffering off" directive was used or while working with[m
[31m-memcached the connections might not be closed on timeout.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запускался на 64-битных платформах, отличных от amd64, sparc64 и ppc64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not run on 64-bit platforms except amd64, sparc64, and ppc64.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.6" date="06.10.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запускался на 64-битных платформах, отличных от amd64, sparc64 и ppc64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not run on 64-bit platforms except amd64, sparc64, and ppc64.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при запросе версии HTTP/1.1 nginx передавал ответ chunk'ами,[m
[31m-если длина ответа в методе $r->headers_out("Content-Length", ...)[m
[31m-была задана текстовой строкой.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx sent the chunked response for HTTP/1.1 request,<br/>[m
[31m-if its length was set by text string in[m
[31m-the $r->headers_out("Content-Length", ...) method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после перенаправления ошибки с помощью директивы error_page любая директива[m
[31m-модуля ngx_http_rewrite_module возвращала эту ошибку;[m
[31m-ошибка появилась в 0.4.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-after redirecting error by an "error_page" directive[m
[31m-any ngx_http_rewrite_module directive returned this error code;[m
[31m-the bug had appeared in 0.4.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.5" date="02.10.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux и Solaris;[m
[31m-ошибка появилась в 0.4.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux and Solaris;[m
[31m-the bug had appeared in 0.4.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.4" date="02.10.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $scheme.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $scheme variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива expires поддерживает параметр max.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive supports the "max" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива include поддерживает маску "*".<br/>[m
[31m-Спасибо Jonathan Dance.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "include" directive supports the "*" mask.<br/>[m
[31m-Thanks to Jonathan Dance.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива return всегда изменяла код ответа, перенаправленного[m
[31m-директивой error_page.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "return" directive always overrode the "error_page" response code[m
[31m-redirected by the "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если в методе PUT передавалось[m
[31m-тело нулевой длины.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if zero-length body was in PUT method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании переменных в директиве proxy_redirect редирект[m
[31m-изменялся неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the redirect was changed incorrectly if the variables were used[m
[31m-in the "proxy_redirect" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.3" date="26.09.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ошибку 499 теперь нельзя перенаправить с помощью директивы error_page.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the 499 error could not be redirected using an "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка Solaris 10 event ports.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Solaris 10 event ports support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_browser_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_browser_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении ошибки 400 проксированному серверу[m
[31m-помощью директивы error_page мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault may occur while redirecting the 400 error[m
[31m-to the proxied server using a "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если в директиве proxy_pass использовался[m
[31m-unix domain сокет;[m
[31m-ошибка появилась в 0.3.47.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if an unix domain socket was used in[m
[31m-a "proxy_pass" directive;[m
[31m-the bug had appeared in 0.3.47.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-SSI не работал с ответами memcached и небуферизированными проксированными[m
[31m-ответами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSI did work with memcached and nonbuffered responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки PAUSE hardware capability в Sun Studio.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of the Sun Studio PAUSE hardware capability bug.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.2" date="14.09.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-убрана поддержка флага O_NOATIME на Linux;[m
[31m-ошибка появилась в 0.4.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the O_NOATIME flag support on Linux was canceled;[m
[31m-the bug had appeared in 0.4.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.1" date="14.09.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с DragonFlyBSD.<br/>[m
[31m-Спасибо Павлу Назарову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the DragonFlyBSD compatibility.<br/>[m
[31m-Thanks to Pavel Nazarov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки в sendfile() в 64-битном Linux при передаче файлов больше 2G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-of bug in 64-bit Linux sendfile(), when file is more than 2G.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь на Linux nginx для статических запросов использует флаг O_NOATIME.<br/>[m
[31m-Спасибо Yusuf Goolamabbas.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on Linux nginx uses O_NOATIME flag for static requests.<br/>[m
[31m-Thanks to Yusuf Goolamabbas.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.4.0" date="30.08.2006">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменение во внутреннем API: инициализация модулей HTTP перенесена из фазы[m
[31m-init module в фазу HTTP postconfiguration.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Change in internal API: the HTTP modules initialization was moved[m
[31m-from the init module phase to the HTTP postconfiguration phase.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь тело запроса в модуле ngx_http_perl_module не считывается[m
[31m-заранее: нужно явно инициировать чтение с помощью метода $r->has_request_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the request body is not read beforehand for the ngx_http_perl_module:[m
[31m-it's required to start the reading using the $r->has_request_body method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает код возврата DECLINED.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the DECLINED return code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module поддерживает входящую строку заголовка "Date"[m
[31m-для метода PUT.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module supports the incoming "Date" header line[m
[31m-for the PUT method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssi работает внутри блока if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi" directive is available inside the "if" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если в директиве index использовалась[m
[31m-переменные и при этом первое имя индексного файла было без переменных;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if there was an "index" directive with[m
[31m-variables and the first index name was without variables;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.61" date="28.08.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива tcp_nodelay теперь по умолчанию включена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "tcp_nodelay" directive is turned on by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива msie_refresh.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "msie_refresh" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива recursive_error_pages.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "recursive_error_pages" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива rewrite возвращала неправильный редирект, если редирект[m
[31m-включал в себя выделенные закодированные символы из оригинального URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rewrite" directive returned incorrect redirect, if the redirect[m
[31m-had the captured escaped symbols from original URI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.60" date="18.08.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время перенаправления ошибки рабочий процесс мог зациклиться;[m
[31m-ошибка появилась в 0.3.59.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a worker process may got caught in an endless loop[m
[31m-while an error redirection;[m
[31m-the bug had appeared in 0.3.59.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.59" date="16.08.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь можно делать несколько перенаправлений через директиву error_page.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now is possible to do several redirection using the "error_page" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива dav_access не поддерживала три параметра.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "dav_access" directive did not support three parameters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не изменяла строку "Content-Type"[m
[31m-после перенаправления с помощью "X-Accel-Redirect";[m
[31m-ошибка появилась в 0.3.58.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive did not changes the "Content-Type" header line[m
[31m-after the "X-Accel-Redirect" was used;[m
[31m-the bug had appeared in 0.3.58.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.58" date="14.08.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива error_page поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive supports the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь на Linux используется интерфейс procfs вместо sysctl.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the procfs interface instead of sysctl is used on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь при использовании "X-Accel-Redirect" строка "Content-Type" наследуется[m
[31m-из первоначального ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "Content-Type" header line is inherited from first response[m
[31m-when the "X-Accel-Redirect" was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива error_page не перенаправляла ошибку 413.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive did not redirect the 413 error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-завершающий "?" не удалял старые аргументы, если в переписанном URI[m
[31m-не было новых аргументов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the trailing "?" did not remove old arguments if no new arguments[m
[31m-were added to a rewritten URI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не запускался на 64-битной FreeBSD 7.0-CURRENT.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not run on 64-bit FreeBSD 7.0-CURRENT.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.57" date="09.08.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $ssl_client_serial.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_client_serial variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в операторе "!-e" в директиве if.<br/>[m
[31m-Спасибо Андриану Буданцову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "!-e" operator of the "if" directive.<br/>[m
[31m-Thanks to Andrian Budanstov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проверке клиентского сертификата nginx не передавал клиенту[m
[31m-информацию о требуемых сертификатах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while a client certificate verification nginx did not send to a client[m
[31m-the required certificates information.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $document_root не поддерживала переменные в директиве root.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $document_root variable did not support the variables in the "root"[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.56" date="04.08.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива dav_access.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "dav_access" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if поддерживает операторы "-d", "!-d", "-e", "!-e", "-x" и "!-x".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" directive supports the "-d", "!-d", "-e", "!-e", "-x", and "!-x"[m
[31m-operators.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при записи в access_log некоторых передаваемых клиенту строк заголовков[m
[31m-происходил segmentation fault, если запрос возвращал редирект.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if a request returned a redirect and[m
[31m-some sent to client header lines were logged in the access log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.55" date="28.07.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр stub в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "stub" parameter in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-команда SSI block.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "block" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-скрипт unicode2nginx добавлен в contrib.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the unicode2nginx script was added to contrib.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если root был задан только переменной, то корень задавался[m
[31m-относительно префикса сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a "root" was specified by variable only, then the root was relative[m
[31m-to a server prefix.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в запросе был "//" или "/.", и после этого закодированные[m
[31m-символы в виде "%XX", то проксируемый запрос передавался незакодированным.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request contained "//" or "/./" and escaped symbols after them,[m
[31m-then the proxied request was sent unescaped.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод $r->header_in("Cookie") модуля ngx_http_perl_module теперь возвращает[m
[31m-все строки "Cookie" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $r->header_in("Cookie") of the ngx_http_perl_module now returns[m
[31m-all "Cookie" header lines.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-происходил segmentation fault, если использовался[m
[31m-<nobr>"client_body_in_file_only on"</nobr>[m
[31m-и делался переход к следующему бэкенду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a segmentation fault occurred if <nobr>"client_body_in_file_only on"</nobr>[m
[31m-was used and nginx switched to a next upstream.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условиях во время переконфигурации коды символов[m
[31m-внутри директивы charset_map могли считаться неверными;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on some condition while reconfiguration character codes[m
[31m-inside the "charset_map" may be treated invalid;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.54" date="11.07.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-nginx теперь записывает в лог информацию о подзапросах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now logs the subrequest information to the error log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_next_upstream, fastcgi_next_upstream и memcached_next_upstream[m
[31m-поддерживают параметр off.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_next_upstream", "fastcgi_next_upstream",[m
[31m-and "memcached_next_upstream" directives support the "off" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива debug_connection поддерживает запись адресов в формате CIDR.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "debug_connection" directive supports the CIDR address form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перекодировании ответа проксированного сервера или сервера FastCGI[m
[31m-в UTF-8 или наоборот ответ мог передаваться не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a response of proxied server or FastCGI server was converted from UTF-8[m
[31m-or back, then it may be transferred incomplete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $upstream_response_time содержала время только первого[m
[31m-обращения к бэкенду.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $upstream_response_time variable had the time of the first[m
[31m-request to a backend only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформе amd64;[m
[31m-ошибка появилась в 0.3.53.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on amd64 platform;[m
[31m-the bug had appeared in 0.3.53.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.53" date="07.07.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива add_header добавляет строки в ответы с кодом 204, 301 и 302.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header" directive adds the string to 204, 301, and 302 responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server в блоке upstream поддерживает параметр weight.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server" directive in the "upstream" context supports[m
[31m-the "weight" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает маску "*".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_name" directive supports the "*" wildcard.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-nginx поддерживает тело запроса больше 2G.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx supports the request body size more than 2G.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если при использовании "satisfy_any on" клиент успешно проходил аутентификацию,[m
[31m-в лог всё равно записалоcь сообщение "access forbidden by rule".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a client was successfully authorized using "satisfy_any on", then anyway[m
[31m-the message "access forbidden by rule" was written in the log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-метод PUT мог ошибочно не создать файл и вернуть код 409.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "PUT" method may erroneously not create a file and return the 409 code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если во время аутентификации IMAP/POP3 бэкенд возвращал ошибку, nginx[m
[31m-продолжал проксирование.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the IMAP/POP3 backend returned an error, then nginx continued proxying[m
[31m-anyway.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.52" date="03.07.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-восстановлено поведение модуля ngx_http_index_module для запросов "POST /":[m
[31m-как в версии до 0.3.40, модуль теперь не выдаёт ошибку 405.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_index_module behavior for the "POST /" requests is reverted[m
[31m-to the 0.3.40 version state: the module now does not return the 405 error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании ограничения скорости рабочий процесс мог зациклиться;[m
[31m-ошибка появилась в 0.3.37.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker process may got caught in an endless loop if the limit rate was used;[m
[31m-the bug had appeared in 0.3.37.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_charset_module записывал в лог ошибку "unknown charset",[m
[31m-даже если перекодировка не требовалась;[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_charset_module logged "unknown charset" alert, even if the recoding[m
[31m-was not needed;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в результате запроса PUT возвращался код 409, то временный файл[m
[31m-не удалялся.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a code response of the PUT request was 409, then a temporary file[m
[31m-was not removed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.51" date="30.06.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условиях в SSI мог пропадать символы "&lt;";[m
[31m-ошибка появилась в 0.3.50.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "&lt;" symbols might disappeared some conditions in the SSI;[m
[31m-the bug had appeared in 0.3.50.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.50" date="28.06.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_redirect_errors и fastcgi_redirect_errors[m
[31m-переименованы соответственно в proxy_intercept_errors и[m
[31m-fastcgi_intercept_errors.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect_errors" and "fastcgi_redirect_errors" directives[m
[31m-was renamed to the "proxy_intercept_errors" and[m
[31m-"fastcgi_intercept_errors" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_charset_module поддерживает перекодирование из[m
[31m-однобайтных кодировок в UTF-8 и обратно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_charset_module supports the recoding from the single byte[m
[31m-encodings to the UTF-8 encoding and back.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси и FastCGI поддерживается строка заголовка "X-Accel-Charset"[m
[31m-в ответе бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Charset" response header line is supported in proxy[m
[31m-and FastCGI mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-символ "\" в парах "\"" и "\'" в SSI командах убирался, только если[m
[31m-также использовался символ "$".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "\" escape symbol in the "\"" and "\'" pairs in the SSI command[m
[31m-was removed only if the command also has the "$" symbol.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условиях в SSI после вставки могла быть добавлена[m
[31m-строка "&lt;!--".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "&lt;!--" string might be added on some conditions[m
[31m-in the SSI after inclusion.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в заголовке ответа была строка <nobr>"Content-Length: 0",</nobr>[m
[31m-то при использовании небуферизированного проксировании не закрывалось соединение[m
[31m-с клиентом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "Content-Length: 0" header line was in response, then[m
[31m-in nonbuffered proxying mode the client connection was not closed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.49" date="31.05.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "set" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении в ssi двух и более подзапросов, обрабатываемых через FastCGI,[m
[31m-вместо вывода второго и остальных подзапросов в ответ включался вывод[m
[31m-первого подзапроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if two or more FastCGI subrequests was in SSI, then first subrequest output[m
[31m-was included instead of second and following subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.48" date="29.05.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь модуль ngx_http_charset_module работает для подзапросов,[m
[31m-в ответах которых нет строки заголовка "Content-Type".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_charset_module works for subrequests,[m
[31m-if the response has no "Content-Type" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве proxy_pass не было URI,[m
[31m-то директива "proxy_redirect  default" добавляла в переписанный[m
[31m-редирект в начало лишний слэш.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "proxy_pass" directive has no URI part,[m
[31m-then the "proxy_redirect  default" directive add the unnecessary slash[m
[31m-in start of the rewritten redirect.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-внутренний редирект всегда превращал любой HTTP-метод в GET,[m
[31m-теперь это делается только для редиректов, выполняемых с помощью[m
[31m-X-Accel-Redirect, и у которых метод не равен HEAD;[m
[31m-ошибка появилась в 0.3.42.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the internal redirect always transform client's HTTP method to GET,[m
[31m-now the transformation is made for the "X-Accel-Redirect" redirects only[m
[31m-and if the method is not HEAD;[m
[31m-the bug had appeared in 0.3.42.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module не собирался, если перл был с поддержкой потоков;[m
[31m-ошибка появилась в 0.3.46.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module could not be built, if the perl was built[m
[31m-with the threads support;[m
[31m-the bug had appeared in 0.3.46.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.47" date="23.05.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "upstream" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-символ "\" в парах "\"" и "\'" в SSI командах теперь всегда убирается.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "\" escape symbol in the "\"" and "\'" pairs in the SSI command[m
[31m-is always removed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.46" date="11.05.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_hide_header, proxy_pass_header, fastcgi_hide_header[m
[31m-и fastcgi_pass_header.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_hide_header", "proxy_pass_header", "fastcgi_hide_header",[m
[31m-and "fastcgi_pass_header" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass_x_powered_by, fastcgi_x_powered_by и proxy_pass_server[m
[31m-упразднены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass_x_powered_by", "fastcgi_x_powered_by", and "proxy_pass_server"[m
[31m-directives were canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси поддерживается строка заголовка "X-Accel-Buffering"[m
[31m-в ответе бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Buffering" response header line is supported in proxy mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибок и утечек памяти при переконфигурации в модуле ngx_http_perl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the reconfiguration bug and memory leaks in the ngx_http_perl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.45" date="06.05.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_verify_client, ssl_verify_depth и ssl_client_certificate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate"[m
[31m-directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь переменная $request_method возвращает метод только основного запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $request_method variable now returns the main request method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в таблице перекодировки koi-win изменены коды символа &amp;deg;.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the &amp;deg; symbol codes were changed in koi-win conversion table.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в таблицу перекодировки koi-win добавлены символы евро и номера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the euro and N symbols were added to koi-win conversion table.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если nginx распределял запросы на несколько машин, то при падении[m
[31m-одной из них запросы, предназначенные для этой машины, перенаправлялись только[m
[31m-на одну машину вместо того, чтобы равномерно распределяться между остальными.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx distributed the requests among several backends and some backend[m
[31m-failed, then requests intended for this backend was directed to one live[m
[31m-backend only instead of being distributed among the rest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.44" date="04.05.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр wait в команде SSI include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "wait" parameter in the "include" SSI command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в таблицу перекодировки koi-win добавлены украинские и белорусские символы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Ukrainian and Byelorussian characters were added to koi-win conversion[m
[31m-table.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.43" date="26.04.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.42" date="26.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр bind в директиве listen в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "bind" option of the "listen" directive in IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании в директиве rewrite одного и того же[m
[31m-выделения более одного раза.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the same capture in the "rewrite" directive was used more then once.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в лог не записывались переменные[m
[31m-$sent_http_content_type, $sent_http_content_length, $sent_http_last_modified,[m
[31m-$sent_http_connection, $sent_http_keep_alive и $sent_http_transfer_encoding.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $sent_http_content_type, $sent_http_content_length,[m
[31m-$sent_http_last_modified, $sent_http_connection, $sent_http_keep_alive,[m
[31m-and $sent_http_transfer_encoding variables were not written to access log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменная $sent_http_cache_control возвращала содержимое только одной[m
[31m-строки "Cache-Control" в заголовке ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $sent_http_cache_control returned value of the single "Cache-Control"[m
[31m-response header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.41" date="21.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -v.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -v switch.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении в SSI удалённых подзапросов[m
[31m-мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if the SSI page has remote subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в обработке FastCGI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in FastCGI handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если путь к перловым модулям не был указан с помощью[m
[31m---with-perl_modules_path=PATH или директивы perl_modules,[m
[31m-то на старте происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the perl modules path was not set using[m
[31m---with-perl_modules_path=PATH or the "perl_modules", then[m
[31m-the segmentation fault was occurred.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.40" date="19.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module поддерживает метод MKCOL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module supports the MKCOL method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива create_full_put_path.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "create_full_put_path" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $limit_rate.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$limit_rate" variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.39" date="17.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива uninitialized_variable_warn; уровень логгирования сообщения[m
[31m-о неинициализированной переменной понижен с уровня alert на warn.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "uninitialized_variable_warn" directive; the logging level of the[m
[31m-"uninitialized variable" message was lowered from "alert" to "warn".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива override_charset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "override_charset" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-при использовании неизвестной переменной в SSI-командах echo и if expr='$name'[m
[31m-теперь не записывается в лог сообщение о неизвестной переменной.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now if the unknown variable is used in the "echo" and "if expr='$name'"[m
[31m-SSI-commands, then the "unknown variable" message is not logged.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-счётчик активных соединений рос при превышении лимита соединений,[m
[31m-заданного директивой worker_connections;[m
[31m-ошибка появилась в 0.2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the active connection counter increased on the exceeding of the connection[m
[31m-limit specified by the "worker_connections" directive;[m
[31m-the bug had appeared in 0.2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условия ограничение скорости соединения могло не работать;[m
[31m-ошибка появилась в 0.3.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the limit rate might not work on some condition;[m
[31m-the bug had appeared in 0.3.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.38" date="14.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_dav_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_dav_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-оптимизация модуля ngx_http_perl_module.<br/>[m
[31m-Спасибо Сергею Скворцову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module optimizations.<br/>[m
[31m-Thanks to Sergey Skvortsov.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->request_body_file.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->request_body_file method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива client_body_in_file_only.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "client_body_in_file_only" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-теперь при переполнении диска nginx пытается писать access_log'и только[m
[31m-раз в секунду.<br/>[m
[31m-Спасибо Антону Южанинову и Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on disk overflow nginx tries to write access logs once a second only.<br/>[m
[31m-Thanks to Anton Yuzhaninov and Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-теперь директива limit_rate точнее ограничивает скорость при значениях[m
[31m-больше <nobr>100 Kbyte/s.</nobr><br/>[m
[31m-Спасибо ForJest.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "limit_rate" directive more precisely limits rate if rate is more[m
[31m-than <nobr>100 Kbyte/s.</nobr><br/>[m
[31m-Thanks to ForJest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси теперь передаёт серверу авторизации символы "\r" и "\n"[m
[31m-в логине и пароле в закодированном виде.<br/>[m
[31m-Спасибо Максиму Дунину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the IMAP/POP3 proxy escapes the "\r" and "\n" symbols in login and[m
[31m-password to pass authorization server.<br/>[m
[31m-Thanks to Maxim Dounin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.37" date="07.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива limit_except.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_except" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if поддерживает операторы "!~", "!~*", "-f" и "!-f".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" directive supports the "!~", "!~*", "-f", and "!-f" operators.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает метод $r->request_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->request_body method.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в модуле ngx_http_addition_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_addition_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.36" date="05.04.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_addition_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_addition_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_pass и fastcgi_pass можно использовать внутри блока if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" and "fastcgi_pass" directives may be used inside[m
[31m-the "if" block.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_ignore_client_abort и fastcgi_ignore_client_abort.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_ignore_client_abort" and "fastcgi_ignore_client_abort" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $request_completion.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$request_completion" variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает методы $r->request_method и[m
[31m-$r->remote_addr.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->request_method and $r->remote_addr.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает команду elif.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the "elif" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строка "\/" в начале выражения команды if модуля ngx_http_ssi_module[m
[31m-воспринималась неверно.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "\/" string in the expression of the "if" command of the[m
[31m-ngx_http_ssi_module was treated incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании регулярных выражениях в команде if модуля ngx_http_ssi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the regular expressions in the "if" command of the ngx_http_ssi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при задании относительного пути в директивах[m
[31m-client_body_temp_path, proxy_temp_path, fastcgi_temp_path и perl_modules[m
[31m-использовался каталог относительно текущего каталога, а не относительно[m
[31m-префикса сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the relative path was specified in the "client_body_temp_path",[m
[31m-"proxy_temp_path", "fastcgi_temp_path", and "perl_modules" directives,[m
[31m-then the directory was used relatively to a current path but not[m
[31m-to a server prefix.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.35" date="22.03.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-accept-фильтр и TCP_DEFER_ACCEPT устанавливались только для первой[m
[31m-директивы listen;[m
[31m-ошибка появилась в 0.3.31.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the accept-filter and the TCP_DEFER_ACCEPT option were set for first "listen"[m
[31m-directive only;[m
[31m-the bug had appeared in 0.3.31.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_pass без URI при использовании в подзапросе.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "proxy_pass" directive without the URI part in a subrequest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.34" date="21.03.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива add_header поддерживает переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header" directive supports the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.33" date="15.03.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр http_503 в директивах proxy_next_upstream или fastcgi_next_upstream.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "http_503" parameter of the "proxy_next_upstream" or[m
[31m-"fastcgi_next_upstream" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_perl_module не работал со встроенным в конфигурационный файл кодом,[m
[31m-если он не начинался сразу же с "sub".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-ngx_http_perl_module did not work with inlined in the configuration code,[m
[31m-if it was not started with the "sub" word.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве post_action.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the "post_action" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.32" date="11.03.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-удаление отладочного логгирования на старте и при переконфигурации;[m
[31m-ошибка появилась в 0.3.31.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the debug logging on startup and reconfiguration time was removed;[m
[31m-the bug had appeared in 0.3.31.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.31" date="10.03.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь nginx передаёт неверные ответы проксированного бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx passes the malformed proxied backend responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы listen поддерживают адрес в виде "*:порт".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "listen" directives support the address in the "*:port" form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка EVFILER_TIMER в MacOSX 10.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the EVFILER_TIMER support in MacOSX 10.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки обработки миллисекундных таймаутов kqueue в 64-битном ядре[m
[31m-MacOSX.<br/>[m
[31m-Спасибо Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for MacOSX 64-bit kernel kqueue millisecond timeout bug.<br/>[m
[31m-Thanks to Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если внутри одного сервера описаны несколько директив listen, слушающих на[m
[31m-разных адресах, то имена серверов вида "*.domain.tld" работали только[m
[31m-для первого адреса;[m
[31m-ошибка появилась в 0.3.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if there were several "listen" directives listening one various addresses[m
[31m-inside one server, then server names like "*.domain.tld" worked for first[m
[31m-address only;[m
[31m-the bug had appeared in 0.3.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании протокола HTTPS в директиве proxy_pass не передавались[m
[31m-запросы с телом, записанным во временный файл.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the HTTPS protocol was used in the "proxy_pass" directive and[m
[31m-the request body was in temporary file then the request was not transferred.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с perl 5.8.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-perl 5.8.8 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.30" date="22.02.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-уровень записи в лог ошибки ECONNABORTED изменён на error с уровня crit.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ECONNABORTED error log level was changed to "error" from "crit".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module не собирался без модуля ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module could not be build without[m
[31m-the ngx_http_ssi_filter_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на i386 платформе, если использовался PIC;[m
[31m-ошибка появилась в 0.3.27.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on i386 platform, if the PIC was used;[m
[31m-the bug had appeared in 0.3.27.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.29" date="20.02.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-теперь nginx использует меньше памяти, если PHP в режиме FastCGI передаёт[m
[31m-большое количество предупреждений перед ответом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now nginx uses less memory, if PHP in FastCGI mode sends many warnings[m
[31m-before the response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в ответах 204 для запросов версии HTTP/1.1 выдавалась строка заголовка[m
[31m-"Transfer-Encoding: chunked".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Transfer-Encoding: chunked" header line was issued in the 204 responses[m
[31m-for the HTTP/1.1 requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx возвращал 502 код ответа, если FastCGI сервер передавал полные строки[m
[31m-заголовка ответа в отдельных FastCGI записях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx returned the 502 response, if the complete response header lines[m
[31m-were transferred in a separate FastCGI records.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве post_action был указан проксируемый URI, то он выполнялся[m
[31m-только после успешного завершения запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the proxied URI was specified in the "post_action" directive, then it ran[m
[31m-only after a successful completion of a request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.28" date="16.02.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива restrict_host_names упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "restrict_host_names" directive was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр конфигурации --with-cpu-opt=ppc64.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --with-cpu-opt=ppc64 configuration parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых условиях проксированное соединение с клиентом завершалось[m
[31m-преждевременно.<br/>[m
[31m-Спасибо Владимиру Шутову.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on some condition the proxied connection with a client was terminated[m
[31m-prematurely.<br/>[m
[31m-Thanks to Vladimir Shutoff.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строка заголовка "X-Accel-Limit-Rate" не учитывалась для запросов,[m
[31m-перенаправленных с помощью строки "X-Accel-Redirect".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Limit-Rate" header line was not taken into account[m
[31m-if the request was redirected using the "X-Accel-Redirect" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива post_action работала только после успешного завершения запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_action" directive ran only after a successful completion of a request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-тело проксированного ответа, создаваемого директивой post_action,[m
[31m-передавалось клиенту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxied response body generated by the "post_action" directive[m
[31m-was transferred to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.27" date="08.02.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы variables_hash_max_size и variables_hash_bucket_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "variables_hash_max_size" and "variables_hash_bucket_size" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменная $body_bytes_sent доступна не только в директиве log_format.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $body_bytes_sent variable can be used not only in the "log_format"[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные $ssl_protocol и $ssl_cipher.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $ssl_protocol and $ssl_cipher variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-определение размера строки кэша распространённых процессоров при старте.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the cache line size detection for widespread CPUs at start time.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива accept_mutex теперь поддерживается посредством fcntl(2)[m
[31m-на платформах, отличных от i386, amd64, sparc64 и ppc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "accept_mutex" directive is supported using fcntl(2)[m
[31m-on platforms different from i386, amd64, sparc64, and ppc.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива lock_file и параметр автоконфигурации --with-lock-path=PATH.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "lock_file" directive and the --with-lock-path=PATH autoconfiguration[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании протокола HTTPS в директиве proxy_pass не передавались[m
[31m-запросы с телом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the HTTPS protocol was used in the "proxy_pass" directive then[m
[31m-the requests with the body was not transferred.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.26" date="03.02.2006">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива optimize_host_names переименована в optimize_server_names.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "optimize_host_names" directive was renamed to the "optimize_server_names".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании подзапроса в SSI бэкенду передавался URI основного запроса,[m
[31m-если в директиве proxy_pass отсутствовал URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if in the "proxy_pass" directive was no the URI part, then the main request[m
[31m-URI was transferred to a backend while proxying the SSI subrequest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.25" date="01.02.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при неверной конфигурации на старте или во время переконфигурации происходил[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 0.3.24.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred on start or while reconfiguration[m
[31m-if there was invalid configuration;[m
[31m-the bug had appeared in 0.3.24.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.24" date="01.02.2006">[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обход ошибки в kqueue во FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-for bug in FreeBSD kqueue.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответ, создаваемый директивой post_action, теперь не передаётся клиенту.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now a response generated by the "post_action" directive is not transferred[m
[31m-to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании большого количества лог-файлов происходила утечка памяти.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the memory leaks were occurring if many log files were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-внутри одного location работала только первая директива proxy_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the first "proxy_redirect" directive was working inside one location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на 64-битных платформах при старте мог произойти segmentation fault,[m
[31m-если использовалось большое количество имён в директивах server_name;[m
[31m-ошибка появилась в 0.3.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on 64-bit platforms segmentation fault may occurred on start[m
[31m-if the many names were used in the "server_name" directives;[m
[31m-the bug had appeared in 0.3.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.23" date="24.01.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива optimize_host_names.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "optimize_host_names" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании переменных в директивах path и alias.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in using of the variables in the "path" and "alias" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module неправильно собирался на Linux и Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module was incorrectly built on Linux and Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.22" date="17.01.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module поддерживает методы $r->args и $r->unescape.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module supports the $r->args and $r->unescape methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-метод $r->query_string в модуле ngx_http_perl_module упразднён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the method $r->query_string of ngx_http_perl_module was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве valid_referers указаны только none или blocked, то[m
[31m-происходил segmentation fault;[m
[31m-ошибка появилась в 0.3.18.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault was occurred if the "none" or "blocked" values was[m
[31m-specified in the "valid_referers" directive;[m
[31m-the bug had appeared in 0.3.18.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.21" date="16.01.2006">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_perl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_perl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива valid_referers разрешает использовать рефереры совсем без URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid_referers" directive allows the referrers without URI part.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.20" date="11.01.2006">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в обработке SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in SSI handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_memcached_module не поддерживал ключи в виде /uri?args.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_memcached_module did not support the keys in the "/usr?args" form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-<changes ver="0.3.19" date="28.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы path и alias поддерживают переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "path" and "alias" directives support the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива valid_referers опять учитывает URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "valid_referers" directive again checks the URI part.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в обработке SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in SSI handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.18" date="26.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_names поддерживает имена вида ".domain.tld".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_names" directive supports the ".domain.tld" names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_names использует хэш для имён вида "*.domain.tld"[m
[31m-и более эффективный хэш для обычных имён.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_names" directive uses the hash for the "*.domain.tld" names[m
[31m-and more effective hash for usual names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы server_names_hash_max_size и server_names_hash_bucket_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_names_hash_max_size" and "server_names_hash_bucket_size" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы server_names_hash и server_names_hash_threshold упразднены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "server_names_hash" and "server_names_hash_threshold" directives[m
[31m-were canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива valid_referers использует хэш для имён сайтов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid_referers" directive uses the hash site names.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-теперь директива valid_referers проверяет только имена сайтов без учёта URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "valid_referers" directive checks the site names only without[m
[31m-the URI part.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-некоторые имена вида ".domain.tld" неверно обрабатывались модулем[m
[31m-ngx_http_map_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some ".domain.tld" names incorrectly processed by the ngx_http_map_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если конфигурационного файла не было, то происходил segmentation fault;[m
[31m-ошибка появилась в 0.3.12.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault was occurred if configuration file did not exist;[m
[31m-the bug had appeared in 0.3.12.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на 64-битных платформах при старте мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.3.16.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on 64-bit platforms segmentation fault may occurred on start;[m
[31m-the bug had appeared in 0.3.16.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.17" date="18.12.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-на Linux configure теперь проверяет наличие epoll и sendfile64() в ядре.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now on Linux configure checks the presence of epoll and sendfile64() in kernel.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива map поддерживает доменные имена в формате ".domain.tld".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "map" directive supports domain names in the ".domain.tld" form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время SSL handshake не иcпользовались таймауты;[m
[31m-ошибка появилась в 0.2.4.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the timeouts were not used in SSL handshake;[m
[31m-the bug had appeared in 0.2.4.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в использовании протокола HTTPS в директиве proxy_pass.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the HTTPS protocol in the "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании протокола HTTPS в директиве proxy_pass по умолчанию[m
[31m-использовался порт 80.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-when the HTTPS protocol was used in the "proxy_pass" directive the port 80[m
[31m-was used by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.16" date="16.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_map_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_map_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы types_hash_max_size и types_hash_bucket_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "types_hash_max_size" and "types_hash_bucket_size" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssi_value_length.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi_value_length" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_rlimit_core.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_rlimit_core" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-при сборке компиляторами icc 8.1 и 9.0 с оптимизацией для[m
[31m-<nobr>Pentium 4</nobr> номер соединения в логах всегда был равен 1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the connection number in logs was always 1 if nginx was built by the[m
[31m-icc 8.1 or 9.0 compilers with optimization for <nobr>Pentium 4.</nobr>[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-команда config timefmt в SSI задавала неверный формат времени.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "config timefmt" SSI command set incorrect time format.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не закрывал соединения с IMAP/POP3 бэкендом при использовании SSL[m
[31m-соединений;[m
[31m-ошибка появилась в 0.3.13.<br/>[m
[31m-Спасибо Rob Mueller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not close connection to IMAP/POP3 backend for the SSL[m
[31m-connections;[m
[31m-the bug had appeared in 0.3.13.<br/>[m
[31m-Thanks to Rob Mueller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-segmentation fault мог произойти во время SSL shutdown;[m
[31m-ошибка появилась в 0.3.13.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault may occurred in at SSL shutdown;[m
[31m-the bug had appeared in 0.3.13.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.15" date="07.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новой код 444 в директиве return для закрытия соединения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new 444 code of the "return" directive to close connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива so_keepalive в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "so_keepalive" directive in IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx теперь вызывает abort() при обнаружении незакрытых соединений[m
[31m-только при плавном выходе и включённой директиве debug_points.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if there are unclosed connection nginx now calls abort() only on graceful[m
[31m-quit and active "debug_points" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.14" date="05.12.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в ответе 304 передавалось тело ответа;[m
[31m-ошибка появилась в 0.3.13.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the 304 response the body was transferred;[m
[31m-the bug had appeared in 0.3.13.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.13" date="05.12.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси поддерживает STARTTLS и STLS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the IMAP/POP3 proxy supports STARTTLS and STLS.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси не работала с методами select, poll и /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the IMAP/POP3 proxy did not work with the select, poll, and /dev/poll methods.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в обработке SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in SSI handling.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-sendfilev() в Solaris теперь не используется при передаче тела запроса[m
[31m-FastCGI-серверу через unix domain сокет.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now Solaris sendfilev() is not used to transfer the client request body[m
[31m-to FastCGI-server via the unix domain socket.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива auth_basic не запрещала аутентификацию;[m
[31m-ошибка появилась в 0.3.11.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_basic" directive did not disable the authorization;[m
[31m-the bug had appeared in 0.3.11.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.12" date="26.11.2005">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-если nginx был собран с модулем ngx_http_realip_module, то при использовании[m
[31m-директивы "satisfy_any on" директивы доступа и аутентификации не работали.[m
[31m-Модуль ngx_http_realip_module не собирался и не собирается по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if nginx was built with the ngx_http_realip_module and the "satisfy_any on"[m
[31m-directive was used, then access and authorization directives did not work.[m
[31m-The ngx_http_realip_module was not built and is not built by default.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-имя переменной "$time_gmt" изменено на "$time_local".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$time_gmt" variable name was changed to "$time_local".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_header_buffer_size и fastcgi_header_buffer_size[m
[31m-переименованы соответственно в proxy_buffer_size и fastcgi_buffer_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_header_buffer_size" and "fastcgi_header_buffer_size" directives[m
[31m-was renamed to the "proxy_buffer_size" and "fastcgi_buffer_size" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_memcached_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_memcached_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_buffering.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_buffering" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-изменение в работе с accept mutex при использовании метода rtsig;[m
[31m-ошибка появилась в 0.3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the changes in accept mutex  handling when the "rtsig" method was used;[m
[31m-the bug had appeared in 0.3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если клиент передал строку "Transfer-Encoding: chunked" в заголовке[m
[31m-запроса, то nginx теперь выдаёт ошибку 411.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the client sent the "Transfer-Encoding: chunked" header line, then[m
[31m-nginx returns the 411 error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при наследовании директивы auth_basic с уровня http в строке[m
[31m-"WWW-Authenticate" заголовка ответа выводился realm без текста "Basic realm".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "auth_basic" directive was inherited from the http level,[m
[31m-then the realm in the "WWW-Authenticate" header line was without[m
[31m-the "Basic realm" text.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве access_log был явно указан формат combined, то в лог[m
[31m-записывались пустые строки;[m
[31m-ошибка появилась в 0.3.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "combined" format was explicitly specified in the "access_log" directive,[m
[31m-then the empty lines was written to the log;[m
[31m-the bug had appeared in 0.3.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на платформе sparc под любыми OS, кроме Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not run on the sparc platform under any OS except Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве if теперь не нужно разделять пробелом строку в кавычках и[m
[31m-закрывающую скобку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now it is not necessary to place space between the quoted string and closing[m
[31m-bracket in the "if" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.11" date="15.11.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не передавал при проксировании тело запроса и строки заголовка клиента;[m
[31m-ошибка появилась в 0.3.10.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not pass the client request headers and body while proxying;[m
[31m-the bug had appeared in 0.3.10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.10" date="15.11.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива valid_referers и переменная $invalid_referer перенесены[m
[31m-из модуля ngx_http_rewrite_module в новый модуль ngx_http_referer_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "valid_referers" directive and the "$invalid_referer" variable[m
[31m-were moved to the new ngx_http_referer_module from the ngx_http_rewrite_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-имя переменной "$apache_bytes_sent" изменено на "$body_bytes_sent".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$apache_bytes_sent" variable name was changed to "$body_bytes_sent".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные "$sent_http_...".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$sent_http_..." variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if поддерживает операции "=" и "!=".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" directive supports the "=" and "!=" operations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass поддерживает протокол HTTPS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" directive supports the HTTPS protocol.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_body.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_set_body" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива post_action.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_action" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_empty_gif_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_empty_gif_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_cpu_affinity для Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_cpu_affinity" directive for Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива rewrite не раскодировала символы в редиректах в URI,[m
[31m-теперь символы раскодируются, кроме символов %00-%25 и %7F-%FF.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rewrite" directive did not unescape URI part in redirect,[m
[31m-now it is unescaped except the %00-%25 and %7F-%FF characters.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался компилятором icc 9.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by the icc 9.0 compiler.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если для статического файла нулевого размера был разрешён SSI,[m
[31m-то ответ передавался неверно при кодировании chunk'ами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the SSI was enabled for zero size static file, then the chunked[m
[31m-response was encoded incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.9" date="10.11.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx считал небезопасными URI, в которых между двумя слэшами[m
[31m-находилось два любых символа;[m
[31m-ошибка появилась в 0.3.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx considered URI as unsafe if two any symbols was between two slashes;[m
[31m-the bug had appeared in 0.3.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.8" date="09.11.2005">[m
[31m-[m
[31m-<change type="security">[m
[31m-<para lang="ru">[m
[31m-nginx теперь проверят URI, полученные от бэкенда в строке "X-Accel-Redirect"[m
[31m-в заголовке ответа, или в SSI файле на наличие путей "/../" и нулей.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now checks URI got from a backend in "X-Accel-Redirect" header line[m
[31m-or in SSI file for the "/../" paths and zeroes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-nginx теперь не воспринимает пустое имя как правильное[m
[31m-в строке "Authorization" в заголовке запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now does not treat the empty user name in the "Authorization" header[m
[31m-line as valid one.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssl_session_timeout модулей[m
[31m-ngx_http_ssl_module и ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_session_timeout" directives[m
[31m-of the ngx_http_ssl_module and ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива auth_http_header модуля ngx_imap_auth_http_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "auth_http_header" directive of the ngx_imap_auth_http_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива add_header.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "add_header" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_realip_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_realip_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новые переменные для использования в директиве log_format:[m
[31m-$bytes_sent, $apache_bytes_sent, $status, $time_gmt,[m
[31m-$uri, $request_time, $request_length,[m
[31m-$upstream_status, $upstream_response_time,[m
[31m-$gzip_ratio,[m
[31m-$uid_got, $uid_set,[m
[31m-$connection, $pipe и $msec.[m
[31m-Параметры в виде "%name" скоро будут упразднены.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new variables to use in the "log_format" directive:[m
[31m-$bytes_sent, $apache_bytes_sent, $status, $time_gmt,[m
[31m-$uri, $request_time, $request_length,[m
[31m-$upstream_status, $upstream_response_time,[m
[31m-$gzip_ratio,[m
[31m-$uid_got, $uid_set,[m
[31m-$connection, $pipe, and $msec.[m
[31m-The parameters in the "%name" form will be canceled soon.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в директиве "if" ложными значениями переменных теперь являются[m
[31m-пустая строка "" и строки, начинающиеся на "0".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the false variable values in the "if" directive are the empty string ""[m
[31m-and string starting with "0".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при работает с проксированными или FastCGI-серверами nginx мог оставлять[m
[31m-открытыми соединения и временные файлы с запросами клиентов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while using proxied or FastCGI-server nginx may leave connections[m
[31m-and temporary files with client requests in open state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-рабочие процессы не сбрасывали буферизированные логи при плавном выходе.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker processes did not flush the buffered logs on graceful exit.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если URI запроса изменялось с помощью rewrite, а затем запрос проксировался[m
[31m-в location, заданном регулярным выражением, то бэкенду передавался[m
[31m-неверный запрос;[m
[31m-ошибка появилась в 0.2.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request URI was changes by the "rewrite" directive and the request[m
[31m-was proxied in location given by regular expression, then the incorrect[m
[31m-request was transferred to backend;[m
[31m-the bug had appeared in 0.2.6.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива expires не удаляла уже установленную строку заголовка "Expires".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive did not remove the previous "Expires" header.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода rtsig и нескольких рабочих процессах nginx[m
[31m-мог перестать принимать запросы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx may stop to accept requests if the "rtsig" method and several worker[m
[31m-processes were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в SSI командах неверно обрабатывались строки "\"" и "\'".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "\"" and "\'" escape symbols were incorrectly handled in SSI commands.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ответ заканчивался сразу же после SSI команды, то при использовании[m
[31m-сжатия ответ передавался не до конца или не передавался вообще.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the response was ended just after the SSI command and gzipping was used,[m
[31m-then the response did not transferred complete or did not transferred at all.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.7" date="27.10.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива access_log поддерживает параметр buffer=.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "access_log" supports the "buffer=" parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.3.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.3.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.6" date="24.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси теперь не передаёт серверу авторизации пустой логин.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the IMAP/POP3 proxy do not send the empty login to authorization server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива log_format поддерживает переменные в виде $name.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_format" supports the variables in the $name form.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если хотя бы в одном сервере не было описано ни одной директивы listen, то[m
[31m-nginx не слушал на 80 порту;[m
[31m-ошибка появилась в 0.3.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if at least in one server was no the "listen" directive, then nginx did not[m
[31m-listen on the 80 port;[m
[31m-the bug had appeared in 0.3.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве proxy_pass отсутствовал URI, то всегда использовался порт 80.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the URI part is omitted in "proxy_pass" directive, the 80 port was[m
[31m-always used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.5" date="21.10.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если логин IMAP/POP3 менялся сервером авторизации, то мог произойти[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 0.2.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if the IMAP/POP3 login was changed[m
[31m-by authorization server;[m
[31m-the bug had appeared in 0.2.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-accept mutex не работал, все соединения обрабатывались одним рабочим процессом;[m
[31m-ошибка появилась в 0.3.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the accept mutex did not work and all connections were handled by one process;[m
[31m-the bug had appeared in 0.3.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода rtsig и директивы timer_resolution[m
[31m-не работали таймауты.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the timeout did not work if the "rtsig" method and the "timer_resolution"[m
[31m-directive were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.4" date="19.10.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на Linux 2.4+ и MacOS X;[m
[31m-ошибка появилась в 0.3.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on Linux 2.4+ and MacOS X;[m
[31m-the bug had appeared in 0.3.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.3" date="19.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметры "bl" и "af" директивы listen переименованы в "backlog"[m
[31m-и "accept_filter".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "bl" and "af" parameters of the "listen" directive was renamed to[m
[31m-the "backlog" and "accept_filter".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры "rcvbuf" и "sndbuf" в директиве listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rcvbuf" and "sndbuf" parameters of the "listen" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметр лога $msec теперь не требует дополнительного системного[m
[31m-вызова gettimeofday().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "$msec" log parameter does not require now the additional[m
[31m-the gettimeofday() system call.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-ключ -t теперь проверяет директивы listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the -t switch now tests the "listen" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в директиве listen был указан неверный адрес, то nginx после[m
[31m-сигнала -HUP оставлял открытый сокет в состоянии CLOSED.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the invalid address was specified in the "listen" directive, then[m
[31m-after the -HUP signal nginx left an open socket in the CLOSED state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для индексных файлов, содержащих в имени переменную, мог неверно выставляться[m
[31m-тип mime по умолчанию;[m
[31m-ошибка появилась в 0.3.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the mime type may be incorrectly set to default value for index file with[m
[31m-variable in the name;[m
[31m-the bug had appeared in 0.3.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива timer_resolution.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "timer_resolution" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр лога $upstream_response_time в миллисекундах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the millisecond "$upstream_response_time" log parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-временный файл с телом запроса клиента теперь удаляется сразу после того,[m
[31m-как клиенту передан заголовок ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a temporary file with client request body now is removed just after[m
[31m-the response header was transferred to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с OpenSSL 0.9.6.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-OpenSSL 0.9.6 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-пути к файлам с SSL сертификатом и ключом не могли быть относительными.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the SSL certificate and key file paths could not be relative.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ssl_prefer_server_ciphers не работала для модуля ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_prefer_server_ciphers" directive did not work in[m
[31m-the ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива ssl_protocols позволяла задать только один протокол.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_protocols" directive allowed to specify the single protocol only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.2" date="12.10.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка Sun Studio 10 C compiler.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Sun Studio 10 C compiler support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_upstream_max_fails, proxy_upstream_fail_timeout,[m
[31m-fastcgi_upstream_max_fails и fastcgi_upstream_fail_timeout.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_upstream_max_fails", "proxy_upstream_fail_timeout",[m
[31m-"fastcgi_upstream_max_fails", and "fastcgi_upstream_fail_timeout"[m
[31m-directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.1" date="10.10.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время переполнения очереди сигналов при использовании метода rtsig[m
[31m-происходил segmentation fault;[m
[31m-ошибка появилась в 0.2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault occurred when the signal queue overflowed[m
[31m-if the "rtsig" method was used;[m
[31m-the bug had appeared in 0.2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-корректная обработка пар "\\", "\"", "\'" и "\$" в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-correct handling of the "\\", "\"", "\'", and "\$" pairs in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.3.0" date="07.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-убрано десятидневное ограничение времени работы рабочего процесса.[m
[31m-Ограничение было введено из-за переполнения миллисекундных таймеров.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the 10-days live time limit of worker process was eliminated.[m
[31m-The limit was introduced because of millisecond timers overflow.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.6" date="05.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-с 60 до 10 секунд уменьшено время повторного обращения к бэкенду[m
[31m-при использовании распределения нагрузки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while using load-balancing the time before the failed backend retry[m
[31m-was decreased from 60 to 10 seconds.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass_unparsed_uri упразднена, оригинальный запрос теперь[m
[31m-передаётся, если в директиве proxy_pass отсутствует URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass_unparsed_uri" was canceled, the original URI now passed,[m
[31m-if the URI part is omitted in "proxy_pass" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива error_page поддерживает редиректы и позволяет более гибко[m
[31m-менять код ошибки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "error_page" directive supports redirects and allows more flexible[m
[31m-to change an error code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в проксированных подзапросах теперь игнорируется переданный charset.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the charset in the "Content-Type" header line now is ignored[m
[31m-in proxied subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если после изменения URI в блоке if для запроса не находилась[m
[31m-новая конфигурация, то правила модуля ngx_http_rewrite_module выполнялись[m
[31m-снова.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the URI was changed in the "if" block and request did not found[m
[31m-new configuration, then the ngx_http_rewrite_module rules ran again.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если директива set устанавливала переменную модуля ngx_http_geo_module[m
[31m-в какой-либо части конфигурации, то эта переменная не была доступна в[m
[31m-других частях конфигурации и выдавалась ошибка "using uninitialized variable";[m
[31m-ошибка появилась в 0.2.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "set" directive set the ngx_http_geo_module variable in some[m
[31m-configuration part, the this variable was not available in other[m
[31m-configuration parts and the "using uninitialized variable" error was occurred;[m
[31m-the bug had appeared in 0.2.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.5" date="04.10.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-дублирующее значение переменной модуля ngx_http_geo_module теперь[m
[31m-выдаёт предупреждение и изменяет старое значение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the duplicate value of the ngx_http_geo_module variable now causes[m
[31m-the warning and changes old value.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает команду set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the "set" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает параметр file в команде include.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the "file" parameter in the "include" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает подстановку значений переменных[m
[31m-в выражениях команды if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the variable value substitutions in[m
[31m-expressions of the "if" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.4" date="03.10.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает выражения[m
[31m-"$var=text", "$var!=text", "$var=/text/" и "$var!=/text/"[m
[31m-в команде if.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports[m
[31m-"$var=text", "$var!=text", "$var=/text/", and "$var!=/text/" expressions[m
[31m-in the "if" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при проксировании location без слэша в конце;[m
[31m-ошибка появилась в 0.1.44.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in proxying location without trailing slash;[m
[31m-the bug had appeared in 0.1.44.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода rtsig мог произойти segmentation fault;[m
[31m-ошибка появилась в 0.2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if the "rtsig" method was used;[m
[31m-the bug had appeared in 0.2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.3" date="30.09.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался без параметра --with-debug;[m
[31m-ошибка появилась в 0.2.2.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built without the --with-debug option;[m
[31m-the bug had appeared in 0.2.2.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.2" date="30.09.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-команда config errmsg в модуле ngx_http_ssi_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "config errmsg" command of the ngx_http_ssi_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-переменные модуля ngx_http_geo_module можно переопределять директивой set.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_geo_module variables can be overridden by the "set" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_protocols и ssl_prefer_server_ciphers модулей[m
[31m-ngx_http_ssl_module и ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_protocols" and "ssl_prefer_server_ciphers" directives[m
[31m-of the ngx_http_ssl_module and ngx_imap_ssl_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_autoindex_module при показе длинных имён файлов;[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not show correctly the long file names;[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module теперь не показывает файлы,[m
[31m-начинающиеся на точку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module now do not show the files starting by dot.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если SSL handshake завершался с ошибкой, то это могло привести также[m
[31m-к закрытию другого соединения.<br/>[m
[31m-Спасибо Rob Mueller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the SSL handshake failed then another connection may be closed too.<br/>[m
[31m-Thanks to Rob Mueller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-экспортные версии MSIE 5.x не могли соединиться по HTTPS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the export versions of MSIE 5.x could not connect via HTTPS.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.1" date="23.09.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если все бэкенды, используемые для балансировки нагрузки, оказывались[m
[31m-в нерабочем состоянии после одной ошибки, то nginx мог зациклится;[m
[31m-ошибка появилась в 0.2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if all backend using in load-balancing failed after one error, then[m
[31m-nginx may got caught in an endless loop;[m
[31m-the bug had appeared in 0.2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.2.0" date="23.09.2005">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменились имена pid-файлов, используемые во время обновления исполняемого[m
[31m-файла. Ручное переименование теперь не нужно.[m
[31m-Старый основной процесс добавляет к своему pid-файл суффикс ".oldbin"[m
[31m-и запускает новый исполняемый файл.[m
[31m-Новый основной процесс создаёт обычный pid-файл без суффикса ".newbin".[m
[31m-Если новый основной процесс выходит, то старый процесс переименовывает свой[m
[31m-pid-файл c суффиксом ".oldbin" в pid-файл без суффикса.[m
[31m-При обновлении с версии 0.1.х до 0.2.0 нужно учитывать, что оба[m
[31m-процесса&mdash;старый 0.1.x и новый 0.2.0&mdash;используют pid-файл[m
[31m-без суффиксов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-The pid-file names used during online upgrade was changed and now is not[m
[31m-required a manual rename operation.[m
[31m-The old master process adds the ".oldbin" suffix to its pid-file and[m
[31m-executes a new binary file.[m
[31m-The new master process creates usual pid-file without the ".newbin" suffix.[m
[31m-If the master process exits, then old master process renames back[m
[31m-its pid-file with the ".oldbin" suffix to the pid-file without suffix.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива worker_connections, новое название директивы connections;[m
[31m-директива теперь задаёт максимальное число соединений,[m
[31m-а не максимально возможный номер дескриптора для сокета.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_connections" directive, new name of the "connections" directive;[m
[31m-now the directive specifies maximum number of connections,[m
[31m-but not maximum socket descriptor number.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-SSL поддерживает кэширование сессий в пределах одного рабочего процесса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-SSL supports the session cache inside one worker process.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива satisfy_any.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "satisfy_any" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модули ngx_http_access_module и ngx_http_auth_basic_module не работают[m
[31m-для подзапросов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_access_module and ngx_http_auth_basic_module do not run[m
[31m-for subrequests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы worker_rlimit_nofile и worker_rlimit_sigpending.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "worker_rlimit_nofile" and "worker_rlimit_sigpending" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если все бэкенды, используемые для балансировки нагрузки, оказывались[m
[31m-в нерабочем состоянии после одной ошибки, то nginx не обращался к ним[m
[31m-в течение 60 секунд.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if all backend using in load-balancing failed after one error, then[m
[31m-nginx did not try do connect to them during 60 seconds.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в парсинге аргументов IMAP/POP3 команд.<br/>[m
[31m-Спасибо Rob Mueller.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in IMAP/POP3 command argument parsing.<br/>[m
[31m-Thanks to Rob Mueller.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании SSL в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors while using SSL in IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании SSI и сжатия.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors while using SSI and gzipping.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в ответах 304 не добавлялись строки заголовка ответа "Expires" и[m
[31m-"Cache-Control".<br/>[m
[31m-Спасибо Александру Кукушкину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Expires" and "Cache-Control" header lines were omitted[m
[31m-from the 304 responses.<br/>[m
[31m-Thanks to Alexandr Kukushkin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.45" date="08.09.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива ssl_engine упразднена в модуле ngx_http_ssl_module и[m
[31m-перенесена на глобальный уровень.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssl_engine" directive was canceled in the ngx_http_ssl_module[m
[31m-and now is introduced at global level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ответы с подзапросами, включённые с помощью SSI, не передавались[m
[31m-через SSL соединение.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the responses with SSI subrequests did not transferred via SSL connection.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Разные исправления в IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Various bug fixes in the IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.44" date="06.09.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси поддерживает SSL.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the IMAP/POP3 proxy supports SSL.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_timeout модуля ngx_imap_proxy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_timeout" directive of the ngx_imap_proxy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива userid_mark.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "userid_mark" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-значение переменной $remote_user определяется независимо от того,[m
[31m-используется ли авторизация или нет.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the $remote_user variable value is determined independently of[m
[31m-authorization use.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.43" date="30.08.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-listen(2) backlog в директиве listen можно менять по сигналу -HUP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the listen(2) backlog in the "listen" directive[m
[31m-can be changed using the -HUP signal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-скрипт geo2nginx.pl добавлен в contrib.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the geo2nginx.pl script was added to contrib.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-параметры FastCGI с пустым значениями теперь передаются серверу.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the FastCGI parameters with the empty values now are passed to a server.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<!--[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при ошибках в работе с проксированным сервером или FastCGI сервером[m
[31m-мог произойти segmentation fault;[m
[31m-в режиме прокси ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if there were errors while[m
[31m-working with proxied or FastCGI server;[m
[31m-in the proxied mode the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m--->[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в ответе проксированного сервера или FastCGI сервера была строка[m
[31m-"Cache-Control", то при использовании директивы expires происходил[m
[31m-segmentation fault или рабочий процесс мог зациклится;[m
[31m-в режиме прокси ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault occurred or the worker process may got caught[m
[31m-in an endless loop if the proxied or FastCGI server sent the "Cache-Control"[m
[31m-header line and the "expires" directive was used;[m
[31m-in the proxied mode the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.42" date="23.08.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если URI запроса получался нулевой длины после обработки модулем[m
[31m-ngx_http_rewrite_module, то в модуле ngx_http_proxy_module происходил[m
[31m-segmentation fault или bus error.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request URI had a zero length after the processing in[m
[31m-the ngx_http_proxy_module, then the segmentation fault or bus error occurred[m
[31m-in the ngx_http_proxy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate не работала внутри блока if;[m
[31m-ошибка появилась в 0.1.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive did not work inside the "if" block;[m
[31m-the bug had appeared in 0.1.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.41" date="25.07.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если переменная использовалась в файле конфигурации,[m
[31m-то она не могла использоваться в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the variable was used in the configuration file,[m
[31m-then it can not be used in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.40" date="22.07.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если клиент слал очень длинную строку заголовка, то в логе не помещалась[m
[31m-информация, связанная с этим запросом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a client sent too long header line, then the request information[m
[31m-did not logged in the error log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании "X-Accel-Redirect" не передавалась строка "Set-Cookie";[m
[31m-ошибка появилась в 0.1.39.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Set-Cookie" header line was not transferred when the "X-Accel-Redirect"[m
[31m-was used;[m
[31m-the bug had appeared in 0.1.39.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании "X-Accel-Redirect" не передавалась строка[m
[31m-"Content-Disposition".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Content-Disposition" header line was not transferred when[m
[31m-the "X-Accel-Redirect" was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-по сигналу SIGQUIT основной процесс не закрывал сокеты, на которых он слушал.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the master process did not close the listen socket on the SIGQUIT signal.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после обновления исполняемого файла на лету на Linux и Solaris[m
[31m-название процесса в команде ps становилось короче.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-after on-line upgrade on Linux and Solaris the process name[m
[31m-became shorter in the "ps" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.39" date="14.07.2005">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Изменения в модуле ngx_http_charset_module:[m
[31m-директива default_charset упразднена;[m
[31m-директива charset задаёт кодировку ответа;[m
[31m-директива source_charset задаёт только исходную кодировку.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-The changes in the ngx_http_charset_module:[m
[31m-the "default_charset" directive was canceled;[m
[31m-the "charset" directive sets the response charset;[m
[31m-the "source_charset" directive sets the source charset only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении ошибки 401, полученной от бэкенда, не передавалась[m
[31m-строка заголовка "WWW-Authenticate".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the backend "WWW-Authenticate" header line did not transferred while[m
[31m-the 401 response code redirecting.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модули ngx_http_proxy_module и ngx_http_fastcgi_module могли закрыть[m
[31m-соединение до того, как что-нибудь было передано клиенту;[m
[31m-ошибка появилась в 0.1.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_proxy_module and ngx_http_fastcgi_module may close[m
[31m-a connection before anything was transferred to a client;[m
[31m-the bug had appeared in 0.1.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-обработка ошибки инициализации в crypt_r() в Linux glibc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Linux glibc crypt_r() initialization bug.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module не поддерживал относительные URI в[m
[31m-команде include virtual.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module did not support the relative URI in[m
[31m-the "include virtual" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в строке заголовка ответа бэкенда была строка "Location",[m
[31m-которую nginx не должен был изменять, то в ответе передавалось тело 500 ошибки;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the backend response had the "Location" header line and nginx[m
[31m-should not rewrite this line, then the 500 code response body was transferred;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-некоторые директивы модулей ngx_http_proxy_module и ngx_http_fastcgi_module[m
[31m-не наследовались с уровня server на уровень location;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some directives of the ngx_http_proxy_module and ngx_http_fastcgi_module[m
[31m-were not inherited from the server to the location level;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssl_module не поддерживал цепочки сертификатов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssl_module did not support the certificate chain.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_autoindex_module при показе длинных имён файлов;[m
[31m-ошибка появилась в 0.1.38.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not show correctly the long file names;[m
[31m-the bug had appeared in 0.1.38.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Исправления в IMAP/POP3 прокси при взаимодействии с бэкендом на стадии login.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-Bugfixes in IMAP/POP3 proxy in interaction with a backend at the login state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.38" date="08.07.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива limit_rate поддерживается в режиме прокси и FastCGI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "limit_rate" directive is supported in proxy and FastCGI mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси и FastCGI поддерживается строка заголовка "X-Accel-Limit-Rate"[m
[31m-в ответе бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Limit-Rate" response header line is supported in proxy[m
[31m-and FastCGI mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива break.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "break" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива log_not_found.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "log_not_found" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при перенаправлении запроса с помощью строки заголовка "X-Accel-Redirect"[m
[31m-не изменялся код ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response status code was not changed when request was redirected[m
[31m-by the ""X-Accel-Redirect" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные, установленные директивой set не могли использоваться в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the variables set by the "set" directive could not be used in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении в SSI более одного удалённого подзапроса[m
[31m-мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred if the SSI page has more than one[m
[31m-remote subrequest.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если статусная строка в ответе бэкенда передавалась в двух пакетах, то[m
[31m-nginx считал ответ неверным;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx treated the backend response as invalid if the status line in the[m
[31m-header was transferred in two packets;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssi_types.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi_types" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива autoindex_exact_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "autoindex_exact_size" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module не поддерживал длинные имена файлов в UTF-8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not support the long file names in UTF-8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-IMAP/POP3 прокси.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the IMAP/POP3 proxy.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.37" date="23.06.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в конце файла nginx.pid теперь добавляется "\n".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the "\n" is added to the end of the "nginx.pid" file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении большого количества вставок или нескольких больших вставок[m
[31m-с помощью SSI ответ мог передаваться не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the responses may be transferred not completely,[m
[31m-if many parts or the big parts were included by SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если все бэкенды возвращали ответ 404, то при использовании параметра http_404[m
[31m-в директивах proxy_next_upstream или fastcgi_next_upstream, nginx[m
[31m-начинал запрашивать все бэкенды снова.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if all backends had returned the 404 response and the "http_404" parameter of[m
[31m-the "proxy_next_upstream" or "fastcgi_next_upstream" directives was used,[m
[31m-then nginx started to request all backends again.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.36" date="15.06.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-если в заголовке запроса есть дублирующиеся строки "Host", "Connection",[m
[31m-"Content-Length" и "Authorization", то nginx теперь выдаёт ошибку 400.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request header has duplicate the "Host", "Connection", "Content-Length",[m
[31m-or "Authorization" lines, then nginx now returns the 400 error.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива post_accept_timeout упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "post_accept_timeout" directive was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры default, af=, bl=, deferred и bind в директиве listen.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "default", "af=", "bl=", "deferred", and "bind" parameters[m
[31m-of the "listen" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка accept фильтров во FreeBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the FreeBSD accept filters support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка TCP_DEFER_ACCEPT в Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the Linux TCP_DEFER_ACCEPT support.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module не поддерживал имена файлов в UTF-8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module did not support the file names in UTF-8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-после добавления новый лог-файл ротация этого лога по сигналу -USR1[m
[31m-выполнялась, только если переконфигурировать nginx два раза по сигналу -HUP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new log file can be rotated by the -USR1 signal only if[m
[31m-the reconfiguration by the -HUP signal was made twice.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.35" date="07.06.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива working_directory.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "working_directory" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива port_in_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "port_in_redirect" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если заголовок ответа бэкенда не помещался в один пакет, то[m
[31m-происходил segmentation fault;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred if the backend response header was in[m
[31m-several packets;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если было сконфигурировано более 10 серверов или в сервере не описана[m
[31m-директива "listen",[m
[31m-то при запуске мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if more than 10 servers were configured or some server did not use the[m
[31m-"listen" directive, then the segmentation fault was occurred on the start.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ответ не помещался во временный файл,[m
[31m-то мог произойти segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault might occur if the response was bigger than[m
[31m-the temporary file.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx возвращал ошибку 400 на запросы вида[m
[31m-<nobr>"GET http://www.domain.com/uri HTTP/1.0"</nobr>;[m
[31m-ошибка появилась в 0.1.28.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx returned the 400 response on requests like[m
[31m-<nobr>"GET http://www.domain.com/uri HTTP/1.0"</nobr>;[m
[31m-the bug had appeared in 0.1.28.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.34" date="26.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при включении больших ответов с помощью SSI рабочий процесс мог зациклиться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker process may got caught in an endless loop if the big response[m
[31m-part were include by SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-переменные, устанавливаемые директивой "set", не были доступны в SSI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the variables set by the "set" directive were not available in SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива autoindex_localtime.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "autoindex_localtime" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-пустое значение в директиве proxy_set_header запрещает передачу заголовка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the empty value of the "proxy_set_header" directive forbids the client[m
[31m-request header line passing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.33" date="23.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался с параметром --without-pcre;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built with the --without-pcre parameter;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-3, 5, 7 и 8 директив proxy_set_header на одном уровне вызывали[m
[31m-bus fault при запуске.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-3, 4, 7, and 8 the "proxy_set_header" directives in one level cause[m
[31m-the bus fault on start up.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в редиректах внутри HTTPS сервера был указан протокол HTTP.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the HTTP protocol was specified in the HTTPS redirects.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если директива rewrite использовала выделения внутри директивы if, то[m
[31m-возвращалась ошибка 500.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the "rewrite" directive used the captures inside the "if" directive, then[m
[31m-the 500 error code was returned.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.32" date="19.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в редиректах, выдаваемых с помощью директивы rewrite, не передавались аргументы;[m
[31m-ошибка появилась в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the arguments were omitted in the redirects, issued by the "rewrite" directive;[m
[31m-the bug had appeared in 0.1.29.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива if поддерживает выделения в регулярных выражениях.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "if" directive supports the captures in regular expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива set поддерживает переменные и выделения из регулярных выражений.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set" directive supports the variables and the captures of regular[m
[31m-expressions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси и FastCGI поддерживается строка заголовка "X-Accel-Redirect"[m
[31m-в ответе бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "X-Accel-Redirect" response header line is supported in proxy and FastCGI[m
[31m-mode.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.31" date="16.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSL ответ мог передаваться не до конца.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response encrypted by SSL may not transferred complete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при обработке SSI в ответе, полученного от FastCGI-сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors while processing FastCGI response by SSI.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки при использовании SSI и сжатия.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-errors while using SSI and gzipping.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-редирект с кодом 301 передавался без тела ответа;[m
[31m-ошибка появилась в 0.1.30.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the redirect with the 301 code was transferred without response body;[m
[31m-the bug had appeared in 0.1.30.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.30" date="14.05.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSI рабочий процесс мог зациклиться.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker process may got caught in an endless loop if the SSI was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSL ответ мог передаваться не до конца.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response encrypted by SSL may not transferred complete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если длина части ответа, полученного за один раз от проксируемого или[m
[31m-FastCGI сервера была равна 500 байт, то nginx возвращал код ответа 500;[m
[31m-в режиме прокси ошибка появилась только в 0.1.29.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the length of the response part received at once from proxied[m
[31m-or FastCGI server was equal to 500, then nginx returns the 500 response code;[m
[31m-in proxy mode the bug had appeared in 0.1.29 only.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не считал неверными директивы с 8-ю или 9-ю параметрами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not consider the directives with 8 or 9 parameters as invalid.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива return может возвращать код ответа 204.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "return" directive can return the 204 response code.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ignore_invalid_headers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ignore_invalid_headers" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.29" date="12.05.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает команду include virtual.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports "include virtual" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает условную команду вида[m
[31m-'if expr="$NAME"' и команды else и endif.[m
[31m-Допускается только один уровень вложенности.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the condition command like[m
[31m-'if expr="$NAME"' and "else" and "endif" commands.[m
[31m-Only one nested level is supported.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_module поддерживает две переменные DATE_LOCAL и DATE_GMT[m
[31m-и команду config timefmt.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_module supports the DATE_LOCAL and DATE_GMT variables[m
[31m-and "config timefmt" command.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива ssi_ignore_recycled_buffers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "ssi_ignore_recycled_buffers" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если переменная QUERY_STRING не была определена, то в команде echo[m
[31m-не ставилось значение по умолчанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "echo" command did not show the default value for the empty QUERY_STRING[m
[31m-variable.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_proxy_module полностью переписан.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_proxy_module was rewritten.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_redirect, proxy_pass_request_headers,[m
[31m-proxy_pass_request_body и proxy_method.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_redirect", "proxy_pass_request_headers",[m
[31m-"proxy_pass_request_body", and "proxy_method" directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_header.[m
[31m-Директива proxy_x_var упразднена и должна быть заменена директивой[m
[31m-proxy_set_header.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_set_header" directive.[m
[31m-The "proxy_x_var" was canceled and must be replaced with the proxy_set_header[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_preserve_host упразднена и должна быть заменена директивами[m
[31m-"proxy_set_header Host $host" и "proxy_redirect off"[m
[31m-или директивой <nobr>"proxy_set_header Host $host:$proxy_port"</nobr>[m
[31m-и соответствующими ей директивами proxy_redirect.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_preserve_host" is canceled and must be replaced with[m
[31m-the "proxy_set_header Host $host" and the "proxy_redirect off" directives,[m
[31m-the <nobr>"proxy_set_header Host $host:$proxy_port" directive</nobr>[m
[31m-and the appropriate proxy_redirect directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_x_real_ip упразднена и должна быть заменена директивой[m
[31m-"proxy_set_header X-Real-IP $remote_addr".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_set_x_real_ip" is canceled and must be replaced with[m
[31m-the "proxy_set_header X-Real-IP $remote_addr" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_add_x_forwarded_for упразднена и должна быть заменена[m
[31m-директивой[m
[31m-<nobr>"proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for".</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_add_x_forwarded_for" is canceled and must be replaced with[m
[31m-<nobr>the "proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for"</nobr>[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_x_url упразднена и должна быть заменена директивой[m
[31m-<nobr>"proxy_set_header X-URL http://$host:$server_port$request_uri".</nobr>[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_set_x_url" is canceled and must be replaced with[m
[31m-the "proxy_set_header X-URL http://$host:$server_port$request_uri"[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_param.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_param" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-директивы fastcgi_root, fastcgi_set_var и fastcgi_params упразднены[m
[31m-и должны быть замены директивами fastcgi_param.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "fastcgi_root", "fastcgi_set_var" and "fastcgi_params" directive[m
[31m-are canceled and must be replaced with the fastcgi_param directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива index может использовать переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "index" directive can use the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива index может быть указана на уровне http и server.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "index" directive can be used at http and server levels.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-только последний параметр в директиве index может быть абсолютным.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the last index only in the "index" directive can be absolute.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-в директиве rewrite могут использоваться переменные.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "rewrite" directive can use the variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива internal.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "internal" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-переменные CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR,[m
[31m-SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME,[m
[31m-REQUEST_METHOD, REQUEST_URI и REMOTE_USER.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR,[m
[31m-SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME,[m
[31m-REQUEST_METHOD, REQUEST_URI, and REMOTE_USER variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-nginx теперь передаёт неверные строки в заголовках запроса клиента и[m
[31m-ответа бэкенда.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now passes the invalid lines in a client request headers[m
[31m-or a backend response header.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд долго не передавал ответ и send_timeout был меньше, чем[m
[31m-proxy_read_timeout, то клиенту возвращался ответ 408.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the backend did not transfer response for a long time and[m
[31m-the "send_timeout" was less than "proxy_read_timeout", then nginx[m
[31m-returned the 408 response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд передавал неверную строку в заголовке ответа, то происходил[m
[31m-segmentation fault;[m
[31m-ошибка появилась в 0.1.26.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault was occurred if the backend sent an invalid line[m
[31m-in response header;[m
[31m-the bug had appeared in 0.1.26.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании отказоустойчивой конфигурации в FastCGI мог[m
[31m-происходить segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault may occurred in FastCGI fault tolerance configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива expires не удаляла уже установленные строки заголовка[m
[31m-"Expires" и "Cache-Control".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "expires" directive did not remove the previous "Expires" and[m
[31m-"Cache-Control" headers.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не учитывал завершающую точку в строке заголовка запроса "Host".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not take into account trailing dot in "Host" header line.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_auth_module не работал на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_auth_module did not work under Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива rewrite неверно работала, если в запросе присутствовали аргументы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the rewrite directive worked incorrectly, if the arguments were in a request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на MacOS X.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on MacOS X.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.28" date="08.04.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании больших файлов nginx сильно нагружал процессор.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx hogs CPU while proxying the huge files.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался gcc 4.0 на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by gcc 4.0 on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.27" date="28.03.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр blocked в директиве valid_referers.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "blocked" parameter of the "valid_referers" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ошибки обработки заголовка запроса теперь записываются на уровне[m
[31m-info, в лог также записывается имя сервера и строки заголовка[m
[31m-запроса "Host" и "Referer".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the errors while handling the request header now logged at "info" level.[m
[31m-The server name and the "Host" and "Referer" header lines also logged.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-при записи ошибок в лог записывается также строка заголовка запроса "Host".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Host" header line is also logged in error log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass_unparsed_uri.[m
[31m-Специальная обработка символов "://" в URI, введённая в версии 0.1.11,[m
[31m-теперь упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_pass_unparsed_uri directive.[m
[31m-The special handling of the "://" symbols in URI, appeared in 0.1.11 version,[m
[31m-now is canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на FreeBSD и Linux, если был указан параметр конфигурации[m
[31m---without-ngx_http_auth_basic_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on FreeBSD and Linux, if the[m
[31m---without-ngx_http_auth_basic_module configuration parameter was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.26" date="22.03.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-неверные строки заголовка, переданные клиентом, теперь игнорируется и[m
[31m-записываются в error_log на уровне info.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the invalid client header lines are now ignored and logged at the info level.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-при записи ошибок в лог записывается также имя сервера, при обращении[m
[31m-к которому произошла ошибка.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the server name is also logged in error log.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_auth_basic_module и директивы auth_basic и[m
[31m-auth_basic_user_file.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_auth_basic_module module and the auth_basic and[m
[31m-auth_basic_user_file directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.25" date="19.03.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не работал на Linux parisc.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did run on Linux parisc.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-nginx теперь не запускается под FreeBSD, если значение[m
[31m-sysctl kern.ipc.somaxconn слишком большое.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx now does not start under FreeBSD if the sysctl kern.ipc.somaxconn[m
[31m-value is too big.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если модуль ngx_http_index_module делал внутреннее перенаправление запроса[m
[31m-в модули ngx_http_proxy_module или ngx_http_fastcgi_module, то файл индекса[m
[31m-не закрывался после обслуживания запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if a request was internally redirected by the ngx_http_index_module[m
[31m-module to the ngx_http_proxy_module or ngx_http_fastcgi_module modules,[m
[31m-then the index file was not closed after request completion.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_pass может использоваться в location, заданных регулярным[m
[31m-выражением.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "proxy_pass" can be used in location with regular expression.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_rewrite_filter_module поддерживает условия вида[m
[31m-"if ($HTTP_USER_AGENT ~ MSIE)".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_rewrite_filter_module module supports the condition like[m
[31m-"if ($HTTP_USER_AGENT ~ MSIE)".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx очень медленно запускался при большом количестве адресов и[m
[31m-использовании текстовых значений в директиве geo.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx started too slow if the large number of addresses and text values[m
[31m-were used in the "geo" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-имя переменной в директиве geo нужно указывать, как $name.[m
[31m-Прежний вариант без "$" пока работает, но вскоре будет убран.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-a variable name must be declared as "$name" in the "geo" directive.[m
[31m-The previous variant without "$" is still supported, but will be removed soon.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр лога "%{VARIABLE}v".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "%{VARIABLE}v" logging parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива "set $name value".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "set $name value" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-совместимость с gcc 4.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-gcc 4.0 compatibility.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр автоконфигурации --with-openssl-opt=OPTIONS.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --with-openssl-opt=OPTIONS autoconfiguration directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.24" date="04.03.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_filter_module поддерживает переменные[m
[31m-QUERY_STRING и DOCUMENT_URI.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_filter_module supports the QUERY_STRING and DOCUMENT_URI[m
[31m-variables.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module мог выдавать ответ 404[m
[31m-на существующий каталог, если этот каталог был указан как alias.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module may some times return the 404 response[m
[31m-for existent directory, if this directory was used in "alias" directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_filter_module неправильно работал при больших[m
[31m-ответах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_filter_module ran incorrectly for large responses.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-отсутствие строки заголовка "Referer" всегда считалось правильным referrer'ом.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the lack of the "Referer" header line was always accounted as valid referrer.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.23" date="01.03.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_ssi_filter_module и[m
[31m-директивы ssi, ssi_silent_errors и ssi_min_file_chunk.[m
[31m-Поддерживаются команды 'echo var="HTTP_..." default=""' и[m
[31m-'echo var="REMOTE_ADDR"'.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_ssi_filter_module and[m
[31m-the ssi, ssi_silent_errors, and ssi_min_file_chunk directives.[m
[31m-The 'echo var="HTTP_..." default=""' and 'echo var="REMOTE_ADDR"' commands[m
[31m-are supported.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр лога %request_time.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %request_time log parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-если запрос пришёл без строки заголовка "Host", то директива[m
[31m-proxy_preserve_host устанавливает в качестве этого заголовка первое имя[m
[31m-сервера из директивы server_name.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request has no the "Host" header line, then the "proxy_preserve_host"[m
[31m-directive set this header line to the first server name of the "server_name"[m
[31m-directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался на платформах, отличных от i386, amd64, sparc и ppc;[m
[31m-ошибка появилась в 0.1.22.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on platforms different from i386, amd64, sparc,[m
[31m-and ppc;[m
[31m-the bug had appeared in 0.1.22.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module теперь показывает информацию не о[m
[31m-символическом линке, а о файле или каталоге, на который он указывает.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module now shows the information not about the symlink,[m
[31m-but about file or directory it points to.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если клиенту ничего не передавалось, то параметр %apache_length[m
[31m-записывал в лог отрицательную длину заголовка ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %apache_length parameter logged the negative length[m
[31m-of the response header if the no response was transferred to a client.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.22" date="22.02.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_stub_status_module показывал неверную статистику[m
[31m-для обработанных соединений, если использовалось проксирование[m
[31m-или FastCGI-сервер.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_stub_status_module showed incorrect handled connections[m
[31m-statistics if the proxying or FastCGI server were used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Linux и Solaris установочные пути были неверно заключены в кавычки;[m
[31m-ошибка появилась в 0.1.21.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the installation paths were incorrectly quoted on Linux and Solaris;[m
[31m-the bug had appeared in 0.1.21.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.21" date="22.02.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_stub_status_module показывал неверную статистику[m
[31m-при использовании метода rtsig или при использовании нескольких[m
[31m-рабочих процессов на SMP машине.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_stub_status_module showed incorrect statistics[m
[31m-if "rtsig" method was used or if several worker process ran on SMP.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался компилятором icc под Линуксом или[m
[31m-если библиотека zlib-1.2.x собиралась из исходных текстов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built by the icc compiler on Linux or[m
[31m-if the zlib-1.2.x library was building from sources.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под NetBSD 2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on NetBSD 2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.20" date="17.02.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новые параметры script_filename и remote_port в директиве fastcgi_params.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new "script_filename" and "remote_port" parameters[m
[31m-of the fastcgi_params directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-неправильно обрабатывался поток stderr от FastCGI-сервера.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the FastCGI stderr stream was handled incorrectly.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.19" date="16.02.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в запросе есть нуль, то для локальных запросов теперь возвращается[m
[31m-ошибка 404.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now, if request contains the zero, then the 404 error is returned[m
[31m-for the local requests.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под NetBSD 2.0.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on NetBSD 2.0.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-во время чтения тела запроса клиента в SSL соединении мог произойти таймаут.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the timeout may occur while reading of the client request body[m
[31m-via SSL connections.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.18" date="09.02.2005">[m
[31m-[m
[31m-<change type="workaround">[m
[31m-<para lang="ru">[m
[31m-для совместимости с Solaris 10 в директивах devpoll_events и devpoll_changes[m
[31m-значения по умолчанию уменьшены с 512 до 32.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the default values of the devpoll_events and the devpoll_changes directives[m
[31m-changed from 512 to 32 to be compatible with Solaris 10.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_set_x_var и fastcgi_set_var не наследовались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_set_x_var and fastcgi_set_var directives were not inherited.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в директиве rewrite, возвращающей редирект, аргументы присоединялись[m
[31m-к URI через символ "&amp;" вместо "?".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in a redirect rewrite directive arguments were concatenated with URI[m
[31m-by an "&amp;" rather than a "?".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-строки для модуля ngx_http_geo_module без символа ";" во включённом файле[m
[31m-игнорировались.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the lines without trailing ";" in the file being included[m
[31m-by the ngx_http_geo_module were silently ignored.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_stub_status_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-неизвестный формат лог-файла в директиве access_log вызывал segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the unknown log format in the access_log directive caused[m
[31m-the segmentation fault.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новый параметр document_root в директиве fastcgi_params.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new "document_root" parameter of the fastcgi_params directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива fastcgi_redirect_errors.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the fastcgi_redirect_errors directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-новый модификатор break в директиве rewrite позволяет прекратить[m
[31m-цикл rewrite/location и устанавливает текущую конфигурацию для запроса.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the new "break" modifier of the "rewrite" directive allows to stop[m
[31m-the rewrite/location cycle and sets the current configuration to the request.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.17" date="03.02.2005">[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_rewrite_module полностью переписан.[m
[31m-Теперь можно делать редиректы, возвращать коды ошибок[m
[31m-и проверять переменные и рефереры.[m
[31m-Эти директивы можно использовать внутри location.[m
[31m-Директива redirect упразднена.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_rewrite_module was rewritten from the scratch.[m
[31m-Now it is possible to redirect, to return the error codes,[m
[31m-to check the variables and referrers. The directives can be used[m
[31m-inside locations.[m
[31m-The redirect directive was canceled.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_geo_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_geo_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы proxy_set_x_var и fastcgi_set_var.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_set_x_var and fastcgi_set_var directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-конфигурация location с модификатором "=" могла использоваться[m
[31m-в другом location.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the location configuration with "=" modifier may be used in another[m
[31m-location.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-правильный тип ответа выставлялся только для запросов, у которых в расширении[m
[31m-были только маленькие буквы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the correct content type was set only for requests that use small caps letters[m
[31m-in extension.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если для location установлен proxy_pass или fastcgi_pass, и доступ[m
[31m-к нему запрещался, а ошибка перенаправлялась на статическую страницу,[m
[31m-то происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the proxy_pass or fastcgi_pass directives were set in the location,[m
[31m-and access was denied, and the error was redirected to a static page,[m
[31m-then the segmentation fault occurred.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в проксированном ответе в заголовке "Location" передавался[m
[31m-относительный URL, то к нему добавлялось имя хоста и слэш;[m
[31m-ошибка появилась в 0.1.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if in a proxied "Location" header was a relative URL,[m
[31m-then a host name and a slash were added to them;[m
[31m-the bug had appeared in 0.1.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Linux в лог не записывался текст системной ошибки.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the system error message was not logged on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.16" date="25.01.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если ответ передавался chunk'ами, то при запросе HEAD выдавался[m
[31m-завершающий chunk.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the response were transferred by chunks, then on the HEAD request[m
[31m-the final chunk was issued.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-заголовок "Connection: keep-alive" выдавался, даже если директива[m
[31m-keepalive_timeout запрещала использование keep-alive.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Connection: keep-alive" header were issued, even if the[m
[31m-keepalive_timeout directive forbade the keep-alive use.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в модуле ngx_http_fastcgi_module вызывали segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the errors in the ngx_http_fastcgi_module caused the segmentation faults.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании SSL сжатый ответ мог передаваться не до конца.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the compressed response encrypted by SSL may not transferred complete.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-опции TCP_NODELAY, TCP_NOPUSH и TCP_CORK, специфичные для TCP сокетов,[m
[31m-не используются для unix domain сокетов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the TCP-specific TCP_NODELAY, TCP_NOPUSH, and TCP_CORK options,[m
[31m-are not used for the unix domain sockets.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива rewrite поддерживает перезаписывание аргументов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the rewrite directive supports the arguments rewriting.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на запрос POST с заголовком "Content-Length: 0" возвращался ответ 400;[m
[31m-ошибка появилась в 0.1.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the response code 400 was returned for the POST request with the[m
[31m-"Content-Length: 0" header;[m
[31m-the bug had appeared in 0.1.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.15" date="19.01.2005">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка соединения с FastCGI-сервером вызывала segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the error while the connecting to the FastCGI server caused[m
[31m-segmentation fault.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-корректная обработка регулярного выражения, в котором число[m
[31m-выделенных частей не совпадает с числом подстановок.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the correct handling of the regular expression, that[m
[31m-has different number of the captures and substitutions.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-location, который передаётся FastCGI-серверу, может быть задан[m
[31m-с помощью регулярного выражения.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the location, that is passed to the FastCGI server, can be[m
[31m-regular expression.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр FastCGI REQUEST_URI теперь передаётся вместе с аргументами[m
[31m-и в том виде, в котором был получен от клиента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the FastCGI's parameter REQUEST_URI is now passed with the arguments[m
[31m-and in the original state.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-для использования регулярных выражений в location нужно было[m
[31m-собирать nginx вместе с ngx_http_rewrite_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_rewrite_module module was required to be built to use[m
[31m-the regular expressions in locations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд слушал на 80-ом порту, то при использовании директивы[m
[31m-<nobr>"proxy_preserve_host  on"</nobr> в заголовке "Host" указывался[m
[31m-также порт 80;[m
[31m-ошибка появилась в 0.1.14.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the directive <nobr>"proxy_preserve_host  on"</nobr> adds port 80[m
[31m-to the "Host" headers, if upstream listen on port 80;[m
[31m-the bug had appeared in 0.1.14.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если задать одинаковые пути в параметрах автоконфигурации[m
[31m---http-client-body-temp-path=PATH и --http-proxy-temp-path=PATH[m
[31m-или --http-client-body-temp-path=PATH и --http-fastcgi-temp-path=PATH,[m
[31m-то происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the same paths in autoconfiguration parameters[m
[31m---http-client-body-temp-path=PATH and --http-proxy-temp-path=PATH,[m
[31m-or --http-client-body-temp-path=PATH and --http-fastcgi-temp-path=PATH[m
[31m-caused segmentation fault.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.14" date="18.01.2005">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры автоконфигурации[m
[31m---http-client-body-temp-path=PATH,[m
[31m---http-proxy-temp-path=PATH[m
[31m-и --http-fastcgi-temp-path=PATH[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the autoconfiguration directives:[m
[31m---http-client-body-temp-path=PATH,[m
[31m---http-proxy-temp-path=PATH,[m
[31m-and --http-fastcgi-temp-path=PATH[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-имя каталога с временными файлами, содержащие тело запроса клиента,[m
[31m-задаётся директивой client_body_temp_path,[m
[31m-по умолчанию &lt;prefix&gt;/client_body_temp.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the directory name for the temporary files with the client request body[m
[31m-is specified by directive client_body_temp_path,[m
[31m-by default it is &lt;prefix&gt;/client_body_temp.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_fastcgi_module и директивы[m
[31m-fastcgi_pass,[m
[31m-fastcgi_root,[m
[31m-fastcgi_index,[m
[31m-fastcgi_params,[m
[31m-fastcgi_connect_timeout,[m
[31m-fastcgi_send_timeout,[m
[31m-fastcgi_read_timeout,[m
[31m-fastcgi_send_lowat,[m
[31m-fastcgi_header_buffer_size,[m
[31m-fastcgi_buffers,[m
[31m-fastcgi_busy_buffers_size,[m
[31m-fastcgi_temp_path,[m
[31m-fastcgi_max_temp_file_size,[m
[31m-fastcgi_temp_file_write_size,[m
[31m-fastcgi_next_upstream[m
[31m-и fastcgi_x_powered_by.[m
[31m-[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_fastcgi_module and the directives:[m
[31m-fastcgi_pass,[m
[31m-fastcgi_root,[m
[31m-fastcgi_index,[m
[31m-fastcgi_params,[m
[31m-fastcgi_connect_timeout,[m
[31m-fastcgi_send_timeout,[m
[31m-fastcgi_read_timeout,[m
[31m-fastcgi_send_lowat,[m
[31m-fastcgi_header_buffer_size,[m
[31m-fastcgi_buffers,[m
[31m-fastcgi_busy_buffers_size,[m
[31m-fastcgi_temp_path,[m
[31m-fastcgi_max_temp_file_size,[m
[31m-fastcgi_temp_file_write_size,[m
[31m-fastcgi_next_upstream,[m
[31m-and fastcgi_x_powered_by.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка "[alert] zero size buf";[m
[31m-ошибка появилась в 0.1.3.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "[alert] zero size buf" error;[m
[31m-the bug had appeared in 0.1.3.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-в директиве proxy_pass нужно обязательно указывать URI после имени хоста.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the URI must be specified after the host name in the proxy_pass directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-если в URI встречался символ %3F, то он считался началом строки аргументов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %3F symbol in the URI was considered as the argument string start.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-поддержка unix domain сокетов в модуле ngx_http_proxy_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the unix domain sockets support in the ngx_http_proxy_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы ssl_engine и ssl_ciphers.<br/>[m
[31m-Спасибо Сергею Скворцову за SSL-акселератор.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ssl_engine and ssl_ciphers directives.<br/>[m
[31m-Thanks to Sergey Skvortsov for SSL-accelerator.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.13" date="21.12.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директивы server_names_hash и server_names_hash_threshold.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the server_names_hash and server_names_hash_threshold directives.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-имена *.domain.tld в директиве server_name не работали.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the *.domain.tld names in the "server_name" directive did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-параметр лога %request_length записывал неверную длину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %request_length log parameter logged the incorrect length.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.12" date="06.12.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметр лога %request_length.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the %request_length log parameter.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании /dev/poll, select и poll на платформах, где возможны[m
[31m-ложные срабатывания указанных методов, могли быть длительные задержки[m
[31m-при обработке запроса по keep-alive соединению.[m
[31m-Наблюдалось по крайней мере на Solaris с использованием /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-when using the /dev/poll, select and poll on the platforms, where[m
[31m-these methods may do the false reports, there may be the long delay when[m
[31m-the request was passed via the keep-alive connection.[m
[31m-It may be at least on Solaris when using the /dev/poll.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива send_lowat игнорируется на Linux, так как Linux не поддерживает[m
[31m-опцию SO_SNDLOWAT.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the send_lowat directive is ignored on Linux because Linux does not support[m
[31m-the SO_SNDLOWAT option.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.11" date="02.12.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива worker_priority.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker_priority directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-под FreeBSD директивы tcp_nopush и tcp_nodelay вместе влияют на передачу[m
[31m-ответа.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-both tcp_nopush and tcp_nodelay directives affect the transferred response.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не вызывал initgroups().<br/>[m
[31m-Спасибо Андрею Ситникову и Андрею Нигматулину.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx did not call initgroups().<br/>[m
[31m-Thanks to Andrew Sitnikov and Andrei Nigmatulin.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-ngx_http_auto_index_module теперь выдаёт размер файлов в байтах.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-now the ngx_http_autoindex_module shows the file size in the bytes.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ngx_http_auto_index_module возвращал ошибку 500, если в каталоге есть[m
[31m-битый symlink.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module returned the 500 error if the broken symlink[m
[31m-was in a directory.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-файлы больше 4G не передавались с использованием sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files bigger than 4G could not be transferred using sendfile.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если бэкенд резолвился в несколько адресов и при ожидании от него ответа[m
[31m-происходила ошибка, то процесс зацикливался.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the backend was resolved to several backends and there was an error while[m
[31m-the response waiting then process may got caught in an endless loop.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании метода /dev/poll рабочий процесс мог завершиться[m
[31m-с сообщением "unknown cycle".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the worker process may exit with the "unknown cycle" message when the /dev/poll[m
[31m-method was used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки "close() channel failed".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-"close() channel failed" errors.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-автоматическое определение групп nobody и nogroup.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the autodetection of the "nobody" and "nogroup" groups.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-директива send_lowat не работала на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the send_lowat directive did not work on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в конфигурации не было раздела events, то происходил segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the segmentation fault occurred if there was no events section[m
[31m-in configuration.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-nginx не собирался под OpenBSD.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-nginx could not be built on OpenBSD.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-двойные слэшы в "://" в URI превращались в ":/".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the double slashes in "://" in the URI were converted to ":/".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.10" date="26.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в запросе без аргументов есть "//", "/./", "/../" или "%XX",[m
[31m-то терялся последний символ в строке запроса;[m
[31m-ошибка появилась в 0.1.9.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if the request without arguments contains "//", "/./", "/../" or "%XX"[m
[31m-then the last character in the request line was lost;[m
[31m-the bug had appeared in 0.1.9.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-исправление в версии 0.1.9 для файлов больше 2G на Linux не работало.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the fix in 0.1.9 for the files bigger than 2G on Linux did not work.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.9" date="25.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-если в запросе есть "//", "/./", "/../" или "%XX", то проксируемый[m
[31m-запрос передавался без аргументов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxied request was sent without arguments if the request contains[m
[31m-"//", "/./", "/../" or "%XX".[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при сжатии больших ответов иногда они передавались не полностью.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the large compressed responses may be transferred not completely.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-не передавались файлы больше 2G на Linux, неподдерживающем sendfile64().[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the files bigger than 2G was not transferred on Linux that does not support[m
[31m-sendfile64().[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Linux при конфигурации сборки нужно было обязательно использовать[m
[31m-параметр --with-poll_module;[m
[31m-ошибка появилась в 0.1.8.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while the build configuration on Linux the --with-poll_module parameter[m
[31m-was required;[m
[31m-the bug had appeared in 0.1.8.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.8" date="20.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_autoindex_module при показе длинных имён файлов.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_autoindex_module if the long file names were in the listing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модификатор "^~" в директиве location.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "^~" modifier in the location directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_max_temp_file_size.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_max_temp_file_size directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.7" date="12.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile, если передаваемый файл менялся, то мог[m
[31m-произойти segmentation fault на FreeBSD;[m
[31m-ошибка появилась в 0.1.5.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on FreeBSD the segmentation fault may occur if the size of the transferred[m
[31m-file was changed;[m
[31m-the bug had appeared in 0.1.5.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.6" date="11.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при некоторых комбинациях директив location c регулярными выражениями[m
[31m-использовалась конфигурация не из того location.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-some location directive combinations with the regular expressions caused[m
[31m-the wrong configuration choose.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.5" date="11.11.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Solaris и Linux могло быть очень много сообщений "recvmsg() returned[m
[31m-not enough data".[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on Solaris and Linux there may be too many "recvmsg() returned not enough data"[m
[31m-alerts.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в режиме прокси без использования sendfile на Solaris возникала[m
[31m-ошибка "writev() failed <nobr>(22: Invalid argument)".</nobr>[m
[31m-На других платформах, не поддерживающих sendfile, процесс зацикливался.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-there were the "writev() failed <nobr>(22: Invalid argument)"</nobr> errors on[m
[31m-Solaris in proxy mode without sendfile. On other platforms that do not[m
[31m-support sendfile at all the process got caught in an endless loop.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile в режиме прокси на Solaris возникал[m
[31m-segmentation fault.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault on Solaris in proxy mode and using sendfile.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-segmentation fault на Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-segmentation fault on Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-обновление исполняемого файла на лету не работало на Linux.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-on-line upgrade did not work on Linux.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-в списке файлов, выдаваемом модулем ngx_http_autoindex_module,[m
[31m-не перекодировались пробелы, кавычки и знаки процента.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module module did not escape the spaces,[m
[31m-the quotes, and the percent signs in the directory listing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="change">[m
[31m-<para lang="ru">[m
[31m-уменьшение операций копирования.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the decrease of the copy operations.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива userid_p3p.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the userid_p3p directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.4" date="26.10.2004">[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-in the ngx_http_autoindex_module.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.3" date="25.10.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-модуль ngx_http_autoindex_module и директива autoindex.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_autoindex_module and the autoindex directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива proxy_set_x_url.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the proxy_set_x_url directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль проксировании мог привести к зацикливанию, если не использовался[m
[31m-sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxy module may get caught in an endless loop when sendfile is not used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.2" date="21.10.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-параметры --user=USER, --group=GROUP и --with-ld-opt=OPTIONS в configure.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the --user=USER, --group=GROUP, and --with-ld-opt=OPTIONS options in configure.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива server_name поддерживает *.domain.tld.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the server_name directive supports *.domain.tld.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-улучшена переносимость на неизвестные платформы.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the portability improvements.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-нельзя переконфигурировать nginx, если конфигурационный файл указан[m
[31m-в командной строке;[m
[31m-ошибка появилась в 0.1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-if configuration file was set in command line, the reconfiguration[m
[31m-was impossible;[m
[31m-the bug had appeared in 0.1.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль проксировании мог привести к зацикливанию, если не использовался[m
[31m-sendfile.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-proxy module may get caught in an endless loop when sendfile is not used.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при использовании sendfile текст ответа не перекодировался[m
[31m-согласно директивам модуля charset;[m
[31m-ошибка появилась в 0.1.1.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-with sendfile the response was not recoded according to the charset[m
[31m-module directives;[m
[31m-the bug had appeared in 0.1.1.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-очень редкая ошибка при обработке kqueue.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-very seldom bug in the kqueue processing.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-модуль сжатия сжимал уже сжатые ответы, полученные при проксировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the gzip module compressed the proxied responses that was already compressed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.1" date="11.10.2004">[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива gzip_types.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the gzip_types directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива tcp_nodelay.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the tcp_nodelay directive.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-директива send_lowat работает не только на платформах, поддерживающих[m
[31m-kqueue NOTE_LOWAT, но и на всех, поддерживающих SO_SNDLOWAT.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the send_lowat directive is working not only on OSes that support[m
[31m-kqueue NOTE_LOWAT, but also on OSes that support SO_SNDLOWAT.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="feature">[m
[31m-<para lang="ru">[m
[31m-эмуляция setproctitle() для Linux и Solaris.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the setproctitle() emulation for Linux and Solaris.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка при переписывании заголовка "Location" при проксировании.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the "Location" header rewrite bug fixed while the proxying.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибка в модуле ngx_http_chunked_module, приводившая к зацикливанию.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the ngx_http_chunked_module module may get caught in an endless loop.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-ошибки в модуле /dev/poll.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the /dev/poll module bugs fixed.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-при проксировании и использовании временных файлов ответы портились.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the responses were corrupted when the temporary files were used[m
[31m-while the proxying.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-бэкенду передавались запросы с неперекодированными символами.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-the unescaped requests were passed to the backend.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-<change type="bugfix">[m
[31m-<para lang="ru">[m
[31m-на Linux 2.4 при конфигурации сборки нужно было обязательно использовать[m
[31m-параметр --with-poll_module.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-while the build configuration on Linux 2.4 the --with-poll_module parameter[m
[31m-was required.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-<changes ver="0.1.0" date="04.10.2004">[m
[31m-[m
[31m-<change>[m
[31m-<para lang="ru">[m
[31m-Первая публично доступная версия.[m
[31m-</para>[m
[31m-<para lang="en">[m
[31m-The first public version.[m
[31m-</para>[m
[31m-</change>[m
[31m-[m
[31m-</changes>[m
[31m-[m
[31m-[m
[31m-</change_log>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xsls/changes.xsls b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xsls/changes.xsls[m
[1mdeleted file mode 100644[m
[1mindex 8be25a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xsls/changes.xsls[m
[1m+++ /dev/null[m
[36m@@ -1,128 +0,0 @@[m
[31m-X:stylesheet {[m
[31m-[m
[31m-X:output method="text";[m
[31m-[m
[31m-X:param lang="'en'";[m
[31m-X:param configuration="'../xml/change_log_conf.xml'";[m
[31m-[m
[31m-X:var conf = "document($configuration)/configuration";[m
[31m-X:var start = "$conf/start";[m
[31m-X:var indent = "$conf/indent";[m
[31m-X:var max = "$conf/length";[m
[31m-X:var br = {&lt;br&gt;}[m
[31m-[m
[31m-[m
[31m-X:template = "/" { !! "change_log"; }[m
[31m-X:template = "change_log" { !! "changes"; }[m
[31m-[m
[31m-[m
[31m-X:template = "changes" {[m
[31m-    X:text {&#10;}[m
[31m-[m
[31m-    !{substring(concat($conf/changes[@lang=$lang]/title,[m
[31m-                       //change_log/@title,[m
[31m-                       ' ', @ver,[m
[31m-                       '                                                    '),[m
[31m-                1, $conf/changes[@lang=$lang]/length)}[m
[31m-[m
[31m-    X:if "$lang='ru'" { !{@date} }[m
[31m-[m
[31m-    X:if "$lang='en'" {[m
[31m-        !{substring(@date, 1, 2)}[m
[31m-        !{$conf/changes[@lang=$lang]/month[number(substring(current()/@date,[m
[31m-                                                            4, 2))]}[m
[31m-        !{substring(@date, 7, 4)}[m
[31m-    }[m
[31m-[m
[31m-    X:text {&#10;}[m
[31m-[m
[31m-    !! "change";[m
[31m-[m
[31m-    X:text {&#10;}[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template = "change" {[m
[31m-    X:var prefix = "$conf/changes[@lang=$lang]/*[local-name(.)=current()/@type]"[m
[31m-[m
[31m-    X:var postfix = { X:if "$prefix" { X:text {: } } }[m
[31m-[m
[31m-    !! "para[@lang=$lang]" (prefix = "concat($start, $prefix, $postfix)");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template para(prefix) = "para" {[m
[31m-    X:var text = { !!; }[m
[31m-[m
[31m-    X:text {&#10;}[m
[31m-[m
[31m-    !wrap(text = "normalize-space($text)",[m
[31m-          prefix = { X:if "position() = 1" { !{$prefix} } else { !{$indent} } })[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template wrap(text, prefix) {[m
[31m-    X:if "$text" {[m
[31m-        X:var offset = {[m
[31m-            X:choose {[m
[31m-                X:when "starts-with($text, concat($br, ' '))" {[m
[31m-                    !{string-length($br) + 2}[m
[31m-                }[m
[31m-                X:when "starts-with($text, $br)" {[m
[31m-                    !{string-length($br) + 1}[m
[31m-                }[m
[31m-                X:otherwise {[m
[31m-                    1[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        X:var length = {[m
[31m-            !length(text = "substring($text, $offset)",[m
[31m-                    prefix = "string-length($prefix)",[m
[31m-                    length = "$max")[m
[31m-        }[m
[31m-[m
[31m-        !{$prefix}[m
[31m-[m
[31m-        !{normalize-space(translate(substring($text, $offset, $length),[m
[31m-                                    '&#xA0;', ' '))}[m
[31m-[m
[31m-        X:text {&#10;}[m
[31m-[m
[31m-        !wrap(text = "substring($text, $length + $offset)", prefix = "$indent")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template length(text, prefix, length) {[m
[31m-    X:var break = "substring-before(substring($text, 1,[m
[31m-                                    $length - $prefix + string-length($br)),[m
[31m-                                    $br)"[m
[31m-[m
[31m-    X:choose {[m
[31m-        X:when "$break" { !{string-length($break)} }[m
[31m-[m
[31m-        X:when "$length = 0" { !{$max - $prefix} }[m
[31m-[m
[31m-        X:when "string-length($text) + $prefix &lt;= $length" {[m
[31m-            !{$length - $prefix}[m
[31m-        }[m
[31m-[m
[31m-        X:when "substring($text, $length - $prefix + 1, 1) = ' '" {[m
[31m-            !{$length - $prefix + 1}[m
[31m-        }[m
[31m-[m
[31m-        X:otherwise {[m
[31m-            !length(text = "$text", prefix = "$prefix", length = "$length - 1")[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-X:template = "at" {@}[m
[31m-X:template = "br" { !{$br} }[m
[31m-X:template = "nobr" { !{translate(., ' ', '&#xA0;')} }[m
[31m-[m
[31m-[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xslt/changes.xslt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xslt/changes.xslt[m
[1mdeleted file mode 100644[m
[1mindex a0178f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/docs/xslt/changes.xslt[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-<?xml version="1.0" encoding="utf-8"?>[m
[31m-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">[m
[31m-[m
[31m-<xsl:output method="text"/>[m
[31m-[m
[31m-<xsl:param select="'en'" name="lang"/>[m
[31m-<xsl:param select="'../xml/change_log_conf.xml'" name="configuration"/>[m
[31m-[m
[31m-<xsl:variable select="document($configuration)/configuration" name="conf"/>[m
[31m-<xsl:variable select="$conf/start" name="start"/>[m
[31m-<xsl:variable select="$conf/indent" name="indent"/>[m
[31m-<xsl:variable select="$conf/length" name="max"/>[m
[31m-<xsl:variable name="br">&lt;br&gt;</xsl:variable>[m
[31m-[m
[31m-[m
[31m-<xsl:template match="/"> <xsl:apply-templates select="change_log"/> </xsl:template>[m
[31m-<xsl:template match="change_log"> <xsl:apply-templates select="changes"/> </xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template match="changes">[m
[31m-    <xsl:text>&#10;</xsl:text>[m
[31m-[m
[31m-    <xsl:value-of select="substring(concat($conf/changes[@lang=$lang]/title,[m
[31m-                       //change_log/@title,[m
[31m-                       ' ', @ver,[m
[31m-                       '                                                    '),[m
[31m-                1, $conf/changes[@lang=$lang]/length)"/>[m
[31m-[m
[31m-    <xsl:if test="$lang='ru'"> <xsl:value-of select="@date"/> </xsl:if>[m
[31m-[m
[31m-    <xsl:if test="$lang='en'">[m
[31m-        <xsl:value-of select="substring(@date, 1, 2)"/>[m
[31m-        <xsl:value-of select="$conf/changes[@lang=$lang]/month[number(substring(current()/@date,[m
[31m-                                                            4, 2))]"/>[m
[31m-        <xsl:value-of select="substring(@date, 7, 4)"/>[m
[31m-    </xsl:if>[m
[31m-[m
[31m-    <xsl:text>&#10;</xsl:text>[m
[31m-[m
[31m-    <xsl:apply-templates select="change"/>[m
[31m-[m
[31m-    <xsl:text>&#10;</xsl:text>[m
[31m-</xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template match="change">[m
[31m-    <xsl:variable select="$conf/changes[@lang=$lang]/*[local-name(.)=current()/@type]" name="prefix"/>[m
[31m-[m
[31m-    <xsl:variable name="postfix"> <xsl:if test="$prefix"> <xsl:text>: </xsl:text> </xsl:if> </xsl:variable>[m
[31m-[m
[31m-    <xsl:apply-templates select="para[@lang=$lang]"><xsl:with-param select="concat($start, $prefix, $postfix)" name="prefix"/></xsl:apply-templates>[m
[31m-</xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template name="para" match="para"><xsl:param name="prefix"/>[m
[31m-    <xsl:variable name="text"> <xsl:apply-templates/> </xsl:variable>[m
[31m-[m
[31m-    <xsl:text>&#10;</xsl:text>[m
[31m-[m
[31m-    <xsl:call-template name="wrap"><xsl:with-param select="normalize-space($text)" name="text"/><xsl:with-param name="prefix"> <xsl:choose><xsl:when test="position() = 1"> <xsl:value-of select="$prefix"/> </xsl:when><xsl:otherwise> <xsl:value-of select="$indent"/> </xsl:otherwise></xsl:choose> </xsl:with-param></xsl:call-template></xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template name="wrap"><xsl:param name="text"/><xsl:param name="prefix"/>[m
[31m-    <xsl:if test="$text">[m
[31m-        <xsl:variable name="offset">[m
[31m-            <xsl:choose>[m
[31m-                <xsl:when test="starts-with($text, concat($br, ' '))">[m
[31m-                    <xsl:value-of select="string-length($br) + 2"/>[m
[31m-                </xsl:when>[m
[31m-                <xsl:when test="starts-with($text, $br)">[m
[31m-                    <xsl:value-of select="string-length($br) + 1"/>[m
[31m-                </xsl:when>[m
[31m-                <xsl:otherwise>[m
[31m-                    1[m
[31m-                </xsl:otherwise>[m
[31m-            </xsl:choose>[m
[31m-        </xsl:variable>[m
[31m-[m
[31m-        <xsl:variable name="length">[m
[31m-            <xsl:call-template name="length"><xsl:with-param select="substring($text, $offset)" name="text"/><xsl:with-param select="string-length($prefix)" name="prefix"/><xsl:with-param select="$max" name="length"/></xsl:call-template></xsl:variable>[m
[31m-[m
[31m-        <xsl:value-of select="$prefix"/>[m
[31m-[m
[31m-        <xsl:value-of select="normalize-space(translate(substring($text, $offset, $length),[m
[31m-                                    '&#xA0;', ' '))"/>[m
[31m-[m
[31m-        <xsl:text>&#10;</xsl:text>[m
[31m-[m
[31m-        <xsl:call-template name="wrap"><xsl:with-param select="substring($text, $length + $offset)" name="text"/><xsl:with-param select="$indent" name="prefix"/></xsl:call-template></xsl:if>[m
[31m-</xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template name="length"><xsl:param name="text"/><xsl:param name="prefix"/><xsl:param name="length"/>[m
[31m-    <xsl:variable select="substring-before(substring($text, 1,[m
[31m-                                    $length - $prefix + string-length($br)),[m
[31m-                                    $br)" name="break"/>[m
[31m-[m
[31m-    <xsl:choose>[m
[31m-        <xsl:when test="$break"> <xsl:value-of select="string-length($break)"/> </xsl:when>[m
[31m-[m
[31m-        <xsl:when test="$length = 0"> <xsl:value-of select="$max - $prefix"/> </xsl:when>[m
[31m-[m
[31m-        <xsl:when test="string-length($text) + $prefix &lt;= $length">[m
[31m-            <xsl:value-of select="$length - $prefix"/>[m
[31m-        </xsl:when>[m
[31m-[m
[31m-        <xsl:when test="substring($text, $length - $prefix + 1, 1) = ' '">[m
[31m-            <xsl:value-of select="$length - $prefix + 1"/>[m
[31m-        </xsl:when>[m
[31m-[m
[31m-        <xsl:otherwise>[m
[31m-            <xsl:call-template name="length"><xsl:with-param select="$text" name="text"/><xsl:with-param select="$prefix" name="prefix"/><xsl:with-param select="$length - 1" name="length"/></xsl:call-template></xsl:otherwise>[m
[31m-    </xsl:choose>[m
[31m-</xsl:template>[m
[31m-[m
[31m-[m
[31m-<xsl:template match="at">@</xsl:template>[m
[31m-<xsl:template match="br"> <xsl:value-of select="$br"/> </xsl:template>[m
[31m-<xsl:template match="nobr"> <xsl:value-of select="translate(., ' ', '&#xA0;')"/> </xsl:template>[m
[31m-[m
[31m-[m
[31m-</xsl:stylesheet>[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/misc/GNUmakefile b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/misc/GNUmakefile[m
[1mdeleted file mode 100644[m
[1mindex 1f021c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/misc/GNUmakefile[m
[1m+++ /dev/null[m
[36m@@ -1,154 +0,0 @@[m
[31m-[m
[31m-VER =		$(shell grep 'define NGINX_VERSION' src/core/nginx.h	\[m
[31m-			| sed -e 's/^.*"\(.*\)".*/\1/')[m
[31m-NGINX =		nginx-$(VER)[m
[31m-TEMP =		tmp[m
[31m-[m
[31m-OBJS =		objs.msvc8[m
[31m-OPENSSL =	openssl-1.0.2g[m
[31m-ZLIB =		zlib-1.2.8[m
[31m-PCRE =		pcre-8.38[m
[31m-[m
[31m-[m
[31m-release: export[m
[31m-[m
[31m-	mv $(TEMP)/$(NGINX)/auto/configure $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	# delete incomplete sources[m
[31m-	rm $(TEMP)/$(NGINX)/src/event/ngx_event_acceptex.c[m
[31m-	rm $(TEMP)/$(NGINX)/src/event/ngx_event_connectex.c[m
[31m-	rm $(TEMP)/$(NGINX)/src/event/modules/ngx_iocp_module.*[m
[31m-	rm -r $(TEMP)/$(NGINX)/src/os/win32[m
[31m-[m
[31m-	mv $(TEMP)/$(NGINX)/docs/text/LICENSE $(TEMP)/$(NGINX)[m
[31m-	mv $(TEMP)/$(NGINX)/docs/text/README $(TEMP)/$(NGINX)[m
[31m-	mv $(TEMP)/$(NGINX)/docs/html $(TEMP)/$(NGINX)[m
[31m-	mv $(TEMP)/$(NGINX)/docs/man $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	$(MAKE) -f docs/GNUmakefile changes[m
[31m-[m
[31m-	rm -r $(TEMP)/$(NGINX)/docs[m
[31m-	rm -r $(TEMP)/$(NGINX)/misc[m
[31m-[m
[31m-	tar -c -z -f $(NGINX).tar.gz --directory $(TEMP) $(NGINX)[m
[31m-[m
[31m-[m
[31m-export:[m
[31m-	rm -rf $(TEMP)[m
[31m-	hg archive -X '.hg*' $(TEMP)/$(NGINX)[m
[31m-[m
[31m-[m
[31m-RELEASE:[m
[31m-	hg ci -m nginx-$(VER)-RELEASE[m
[31m-	hg tag -m "release-$(VER) tag" release-$(VER)[m
[31m-[m
[31m-	$(MAKE) -f misc/GNUmakefile release[m
[31m-[m
[31m-[m
[31m-win32:[m
[31m-	./auto/configure						\[m
[31m-		--with-cc=cl						\[m
[31m-		--builddir=$(OBJS)					\[m
[31m-		--with-debug						\[m
[31m-		--prefix= 						\[m
[31m-		--conf-path=conf/nginx.conf				\[m
[31m-		--pid-path=logs/nginx.pid				\[m
[31m-		--http-log-path=logs/access.log				\[m
[31m-		--error-log-path=logs/error.log				\[m
[31m-		--sbin-path=nginx.exe					\[m
[31m-		--http-client-body-temp-path=temp/client_body_temp	\[m
[31m-		--http-proxy-temp-path=temp/proxy_temp			\[m
[31m-		--http-fastcgi-temp-path=temp/fastcgi_temp		\[m
[31m-		--http-scgi-temp-path=temp/scgi_temp			\[m
[31m-		--http-uwsgi-temp-path=temp/uwsgi_temp			\[m
[31m-		--with-cc-opt=-DFD_SETSIZE=1024				\[m
[31m-		--with-pcre=$(OBJS)/lib/$(PCRE)				\[m
[31m-		--with-zlib=$(OBJS)/lib/$(ZLIB)				\[m
[31m-		--with-select_module					\[m
[31m-		--with-http_realip_module				\[m
[31m-		--with-http_addition_module				\[m
[31m-		--with-http_sub_module					\[m
[31m-		--with-http_dav_module					\[m
[31m-		--with-http_stub_status_module				\[m
[31m-		--with-http_flv_module					\[m
[31m-		--with-http_mp4_module					\[m
[31m-		--with-http_gunzip_module				\[m
[31m-		--with-http_gzip_static_module				\[m
[31m-		--with-http_auth_request_module				\[m
[31m-		--with-http_random_index_module				\[m
[31m-		--with-http_secure_link_module				\[m
[31m-		--with-http_slice_module				\[m
[31m-		--with-mail						\[m
[31m-		--with-stream						\[m
[31m-		--with-openssl=$(OBJS)/lib/$(OPENSSL)			\[m
[31m-		--with-openssl-opt=no-asm				\[m
[31m-		--with-http_ssl_module					\[m
[31m-		--with-mail_ssl_module					\[m
[31m-		--with-stream_ssl_module				\[m
[31m-		--with-ipv6[m
[31m-[m
[31m-[m
[31m-zip: export[m
[31m-	rm -f $(NGINX).zip[m
[31m-[m
[31m-	mkdir -p $(TEMP)/$(NGINX)/docs.new[m
[31m-	mkdir -p $(TEMP)/$(NGINX)/logs[m
[31m-	mkdir -p $(TEMP)/$(NGINX)/temp[m
[31m-[m
[31m-	sed -i '' -e "s/$$/`printf '\r'`/" $(TEMP)/$(NGINX)/conf/*[m
[31m-[m
[31m-	mv $(TEMP)/$(NGINX)/docs/text/LICENSE $(TEMP)/$(NGINX)/docs.new[m
[31m-	mv $(TEMP)/$(NGINX)/docs/text/README $(TEMP)/$(NGINX)/docs.new[m
[31m-	mv $(TEMP)/$(NGINX)/docs/html $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	rm -r $(TEMP)/$(NGINX)/docs[m
[31m-	mv $(TEMP)/$(NGINX)/docs.new $(TEMP)/$(NGINX)/docs[m
[31m-[m
[31m-	cp -p $(OBJS)/nginx.exe $(TEMP)/$(NGINX)[m
[31m-[m
[31m-	$(MAKE) -f docs/GNUmakefile changes[m
[31m-	mv $(TEMP)/$(NGINX)/CHANGES* $(TEMP)/$(NGINX)/docs/[m
[31m-[m
[31m-	cp -p $(OBJS)/lib/$(OPENSSL)/LICENSE				\[m
[31m-		$(TEMP)/$(NGINX)/docs/OpenSSL.LICENSE[m
[31m-[m
[31m-	cp -p $(OBJS)/lib/$(PCRE)/LICENCE				\[m
[31m-		$(TEMP)/$(NGINX)/docs/PCRE.LICENCE[m
[31m-[m
[31m-	sed -ne '/^ (C) 1995-20/,/^  jloup@gzip\.org/p'			\[m
[31m-		$(OBJS)/lib/$(ZLIB)/README				\[m
[31m-		> $(TEMP)/$(NGINX)/docs/zlib.LICENSE[m
[31m-[m
[31m-	touch -r $(OBJS)/lib/$(ZLIB)/README				\[m
[31m-		$(TEMP)/$(NGINX)/docs/zlib.LICENSE[m
[31m-[m
[31m-	rm -r $(TEMP)/$(NGINX)/auto[m
[31m-	rm -r $(TEMP)/$(NGINX)/misc[m
[31m-	rm -r $(TEMP)/$(NGINX)/src[m
[31m-[m
[31m-	cd $(TEMP) && zip -r ../$(NGINX).zip $(NGINX)[m
[31m-[m
[31m-[m
[31m-icons:	src/os/win32/nginx.ico[m
[31m-[m
[31m-# 48x48, 32x32 and 16x16 icons[m
[31m-[m
[31m-src/os/win32/nginx.ico:	src/os/win32/nginx_icon48.xpm			\[m
[31m-			src/os/win32/nginx_icon32.xpm			\[m
[31m-			src/os/win32/nginx_icon16.xpm[m
[31m-[m
[31m-	test -d $(TEMP) || mkdir $(TEMP)[m
[31m-[m
[31m-	xpmtoppm --alphaout=$(TEMP)/nginx48.pbm				\[m
[31m-		src/os/win32/nginx_icon48.xpm > $(TEMP)/nginx48.ppm[m
[31m-[m
[31m-	xpmtoppm --alphaout=$(TEMP)/nginx32.pbm				\[m
[31m-		src/os/win32/nginx_icon32.xpm > $(TEMP)/nginx32.ppm[m
[31m-[m
[31m-	xpmtoppm --alphaout=$(TEMP)/nginx16.pbm				\[m
[31m-		src/os/win32/nginx_icon16.xpm > $(TEMP)/nginx16.ppm[m
[31m-[m
[31m-	ppmtowinicon -output src/os/win32/nginx.ico -andpgms		\[m
[31m-		$(TEMP)/nginx48.ppm $(TEMP)/nginx48.pbm			\[m
[31m-		$(TEMP)/nginx32.ppm $(TEMP)/nginx32.pbm			\[m
[31m-		$(TEMP)/nginx16.ppm $(TEMP)/nginx16.pbm[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/misc/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/misc/README[m
[1mdeleted file mode 100644[m
[1mindex 3f7b323..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/misc/README[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-[m
[31m-make -f misc/GNUmakefile release[m
[31m-[m
[31m-the required tools:[m
[31m-*) xsltproc to build CHANGES,[m
[31m-*) xslscript.pl ( http://hg.nginx.org/xslscript ) to build XSLTs[m
[31m-   from XSLScript sources.[m
[31m-[m
[31m-[m
[31m-make -f misc/GNUmakefile icons[m
[31m-[m
[31m-the required tool:[m
[31m-*) netpbm to create Win32 icons from xpm sources.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.c[m
[1mdeleted file mode 100644[m
[1mindex 60f8fe7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.c[m
[1m+++ /dev/null[m
[36m@@ -1,1542 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_show_version_info(void);[m
[31m-static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_get_options(int argc, char *const *argv);[m
[31m-static ngx_int_t ngx_process_options(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv);[m
[31m-static void *ngx_core_module_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_set_env(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_load_module(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-static void ngx_unload_module(void *data);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_debug_points[] = {[m
[31m-    { ngx_string("stop"), NGX_DEBUG_POINTS_STOP },[m
[31m-    { ngx_string("abort"), NGX_DEBUG_POINTS_ABORT },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("daemon"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, daemon),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("master_process"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, master),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("timer_resolution"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, timer_resolution),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("pid"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, pid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lock_file"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, lock_file),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_processes"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_set_worker_processes,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("debug_points"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, debug_points),[m
[31m-      &ngx_debug_points },[m
[31m-[m
[31m-    { ngx_string("user"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_set_user,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_priority"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_set_priority,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_cpu_affinity"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_set_cpu_affinity,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_rlimit_nofile"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, rlimit_nofile),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_rlimit_core"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, rlimit_core),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("working_directory"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_core_conf_t, working_directory),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("env"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_set_env,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("load_module"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_load_module,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_core_module_ctx = {[m
[31m-    ngx_string("core"),[m
[31m-    ngx_core_module_create_conf,[m
[31m-    ngx_core_module_init_conf[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_core_module_ctx,                  /* module context */[m
[31m-    ngx_core_commands,                     /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t   ngx_show_help;[m
[31m-static ngx_uint_t   ngx_show_version;[m
[31m-static ngx_uint_t   ngx_show_configure;[m
[31m-static u_char      *ngx_prefix;[m
[31m-static u_char      *ngx_conf_file;[m
[31m-static u_char      *ngx_conf_params;[m
[31m-static char        *ngx_signal;[m
[31m-[m
[31m-[m
[31m-static char **ngx_os_environ;[m
[31m-[m
[31m-[m
[31m-int ngx_cdecl[m
[31m-main(int argc, char *const *argv)[m
[31m-{[m
[31m-    ngx_buf_t        *b;[m
[31m-    ngx_log_t        *log;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_cycle_t      *cycle, init_cycle;[m
[31m-    ngx_conf_dump_t  *cd;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ngx_debug_init();[m
[31m-[m
[31m-    if (ngx_strerror_init() != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_get_options(argc, argv) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_show_version) {[m
[31m-        ngx_show_version_info();[m
[31m-[m
[31m-        if (!ngx_test_config) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* TODO */ ngx_max_sockets = -1;[m
[31m-[m
[31m-    ngx_time_init();[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_init();[m
[31m-#endif[m
[31m-[m
[31m-    ngx_pid = ngx_getpid();[m
[31m-[m
[31m-    log = ngx_log_init(ngx_prefix);[m
[31m-    if (log == NULL) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* STUB */[m
[31m-#if (NGX_OPENSSL)[m
[31m-    ngx_ssl_init(log);[m
[31m-#endif[m
[31m-[m
[31m-    /*[m
[31m-     * init_cycle->log is required for signal handlers and[m
[31m-     * ngx_process_options()[m
[31m-     */[m
[31m-[m
[31m-    ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));[m
[31m-    init_cycle.log = log;[m
[31m-    ngx_cycle = &init_cycle;[m
[31m-[m
[31m-    init_cycle.pool = ngx_create_pool(1024, log);[m
[31m-    if (init_cycle.pool == NULL) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process_options(&init_cycle) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_os_init(log) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init()[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_crc32_table_init() != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_preinit_modules() != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    cycle = ngx_init_cycle(&init_cycle);[m
[31m-    if (cycle == NULL) {[m
[31m-        if (ngx_test_config) {[m
[31m-            ngx_log_stderr(0, "configuration file %s test failed",[m
[31m-                           init_cycle.conf_file.data);[m
[31m-        }[m
[31m-[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_test_config) {[m
[31m-        if (!ngx_quiet_mode) {[m
[31m-            ngx_log_stderr(0, "configuration file %s test is successful",[m
[31m-                           cycle->conf_file.data);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_dump_config) {[m
[31m-            cd = cycle->config_dump.elts;[m
[31m-[m
[31m-            for (i = 0; i < cycle->config_dump.nelts; i++) {[m
[31m-[m
[31m-                ngx_write_stdout("# configuration file ");[m
[31m-                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,[m
[31m-                                    cd[i].name.len);[m
[31m-                ngx_write_stdout(":" NGX_LINEFEED);[m
[31m-[m
[31m-                b = cd[i].buffer;[m
[31m-[m
[31m-                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);[m
[31m-                ngx_write_stdout(NGX_LINEFEED);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_signal) {[m
[31m-        return ngx_signal_process(cycle, ngx_signal);[m
[31m-    }[m
[31m-[m
[31m-    ngx_os_status(cycle->log);[m
[31m-[m
[31m-    ngx_cycle = cycle;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) {[m
[31m-        ngx_process = NGX_PROCESS_MASTER;[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-    if (ngx_init_signals(cycle->log) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_inherited && ccf->daemon) {[m
[31m-        if (ngx_daemon(cycle->log) != NGX_OK) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_daemonized = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inherited) {[m
[31m-        ngx_daemonized = 1;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_log_redirect_stderr(cycle) != NGX_OK) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (log->file->fd != ngx_stderr) {[m
[31m-        if (ngx_close_file(log->file->fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_close_file_n " built-in log failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_use_stderr = 0;[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_SINGLE) {[m
[31m-        ngx_single_process_cycle(cycle);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_master_process_cycle(cycle);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_show_version_info(void)[m
[31m-{[m
[31m-    ngx_write_stderr("nginx version: " NGINX_VER_BUILD NGX_LINEFEED);[m
[31m-[m
[31m-    if (ngx_show_help) {[m
[31m-        ngx_write_stderr([m
[31m-            "Usage: nginx [-?hvVtTq] [-s signal] [-c filename] "[m
[31m-                         "[-p prefix] [-g directives]" NGX_LINEFEED[m
[31m-                         NGX_LINEFEED[m
[31m-            "Options:" NGX_LINEFEED[m
[31m-            "  -?,-h         : this help" NGX_LINEFEED[m
[31m-            "  -v            : show version and exit" NGX_LINEFEED[m
[31m-            "  -V            : show version and configure options then exit"[m
[31m-                               NGX_LINEFEED[m
[31m-            "  -t            : test configuration and exit" NGX_LINEFEED[m
[31m-            "  -T            : test configuration, dump it and exit"[m
[31m-                               NGX_LINEFEED[m
[31m-            "  -q            : suppress non-error messages "[m
[31m-                               "during configuration testing" NGX_LINEFEED[m
[31m-            "  -s signal     : send signal to a master process: "[m
[31m-                               "stop, quit, reopen, reload" NGX_LINEFEED[m
[31m-#ifdef NGX_PREFIX[m
[31m-            "  -p prefix     : set prefix path (default: " NGX_PREFIX ")"[m
[31m-                               NGX_LINEFEED[m
[31m-#else[m
[31m-            "  -p prefix     : set prefix path (default: NONE)" NGX_LINEFEED[m
[31m-#endif[m
[31m-            "  -c filename   : set configuration file (default: " NGX_CONF_PATH[m
[31m-                               ")" NGX_LINEFEED[m
[31m-            "  -g directives : set global directives out of configuration "[m
[31m-                               "file" NGX_LINEFEED NGX_LINEFEED[m
[31m-        );[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_show_configure) {[m
[31m-[m
[31m-#ifdef NGX_COMPILER[m
[31m-        ngx_write_stderr("built by " NGX_COMPILER NGX_LINEFEED);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_SSL)[m
[31m-        if (ngx_strcmp(ngx_ssl_version(), OPENSSL_VERSION_TEXT) == 0) {[m
[31m-            ngx_write_stderr("built with " OPENSSL_VERSION_TEXT NGX_LINEFEED);[m
[31m-        } else {[m
[31m-            ngx_write_stderr("built with " OPENSSL_VERSION_TEXT[m
[31m-                             " (running with ");[m
[31m-            ngx_write_stderr((char *) (uintptr_t) ngx_ssl_version());[m
[31m-            ngx_write_stderr(")" NGX_LINEFEED);[m
[31m-        }[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-        ngx_write_stderr("TLS SNI support enabled" NGX_LINEFEED);[m
[31m-#else[m
[31m-        ngx_write_stderr("TLS SNI support disabled" NGX_LINEFEED);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-        ngx_write_stderr("configure arguments:" NGX_CONFIGURE NGX_LINEFEED);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_add_inherited_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_char           *p, *v, *inherited;[m
[31m-    ngx_int_t         s;[m
[31m-    ngx_listening_t  *ls;[m
[31m-[m
[31m-    inherited = (u_char *) getenv(NGINX_VAR);[m
[31m-[m
[31m-    if (inherited == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                  "using inherited sockets from \"%s\"", inherited);[m
[31m-[m
[31m-    if (ngx_array_init(&cycle->listening, cycle->pool, 10,[m
[31m-                       sizeof(ngx_listening_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (p = inherited, v = p; *p; p++) {[m
[31m-        if (*p == ':' || *p == ';') {[m
[31m-            s = ngx_atoi(v, p - v);[m
[31m-            if (s == NGX_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                              "invalid socket number \"%s\" in " NGINX_VAR[m
[31m-                              " environment variable, ignoring the rest"[m
[31m-                              " of the variable", v);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            v = p + 1;[m
[31m-[m
[31m-            ls = ngx_array_push(&cycle->listening);[m
[31m-            if (ls == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(ls, sizeof(ngx_listening_t));[m
[31m-[m
[31m-            ls->fd = (ngx_socket_t) s;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (v != p) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "invalid socket number \"%s\" in " NGINX_VAR[m
[31m-                      " environment variable, ignoring", v);[m
[31m-    }[m
[31m-[m
[31m-    ngx_inherited = 1;[m
[31m-[m
[31m-    return ngx_set_inherited_sockets(cycle);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char **[m
[31m-ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last)[m
[31m-{[m
[31m-    char             **p, **env;[m
[31m-    ngx_str_t         *var;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (last == NULL && ccf->environment) {[m
[31m-        return ccf->environment;[m
[31m-    }[m
[31m-[m
[31m-    var = ccf->env.elts;[m
[31m-[m
[31m-    for (i = 0; i < ccf->env.nelts; i++) {[m
[31m-        if (ngx_strcmp(var[i].data, "TZ") == 0[m
[31m-            || ngx_strncmp(var[i].data, "TZ=", 3) == 0)[m
[31m-        {[m
[31m-            goto tz_found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_array_push(&ccf->env);[m
[31m-    if (var == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    var->len = 2;[m
[31m-    var->data = (u_char *) "TZ";[m
[31m-[m
[31m-    var = ccf->env.elts;[m
[31m-[m
[31m-tz_found:[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < ccf->env.nelts; i++) {[m
[31m-[m
[31m-        if (var[i].data[var[i].len] == '=') {[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for (p = ngx_os_environ; *p; p++) {[m
[31m-[m
[31m-            if (ngx_strncmp(*p, var[i].data, var[i].len) == 0[m
[31m-                && (*p)[var[i].len] == '=')[m
[31m-            {[m
[31m-                n++;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        env = ngx_alloc((*last + n + 1) * sizeof(char *), cycle->log);[m
[31m-        *last = n;[m
[31m-[m
[31m-    } else {[m
[31m-        env = ngx_palloc(cycle->pool, (n + 1) * sizeof(char *));[m
[31m-    }[m
[31m-[m
[31m-    if (env == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < ccf->env.nelts; i++) {[m
[31m-[m
[31m-        if (var[i].data[var[i].len] == '=') {[m
[31m-            env[n++] = (char *) var[i].data;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for (p = ngx_os_environ; *p; p++) {[m
[31m-[m
[31m-            if (ngx_strncmp(*p, var[i].data, var[i].len) == 0[m
[31m-                && (*p)[var[i].len] == '=')[m
[31m-            {[m
[31m-                env[n++] = *p;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    env[n] = NULL;[m
[31m-[m
[31m-    if (last == NULL) {[m
[31m-        ccf->environment = env;[m
[31m-        environ = env;[m
[31m-    }[m
[31m-[m
[31m-    return env;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv)[m
[31m-{[m
[31m-    char             **env, *var;[m
[31m-    u_char            *p;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_pid_t          pid;[m
[31m-    ngx_exec_ctx_t     ctx;[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-    ngx_listening_t   *ls;[m
[31m-[m
[31m-    ngx_memzero(&ctx, sizeof(ngx_exec_ctx_t));[m
[31m-[m
[31m-    ctx.path = argv[0];[m
[31m-    ctx.name = "new binary process";[m
[31m-    ctx.argv = argv;[m
[31m-[m
[31m-    n = 2;[m
[31m-    env = ngx_set_environment(cycle, &n);[m
[31m-    if (env == NULL) {[m
[31m-        return NGX_INVALID_PID;[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_alloc(sizeof(NGINX_VAR)[m
[31m-                    + cycle->listening.nelts * (NGX_INT32_LEN + 1) + 2,[m
[31m-                    cycle->log);[m
[31m-    if (var == NULL) {[m
[31m-        ngx_free(env);[m
[31m-        return NGX_INVALID_PID;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(var, NGINX_VAR "=", sizeof(NGINX_VAR));[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-        p = ngx_sprintf(p, "%ud;", ls[i].fd);[m
[31m-    }[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    env[n++] = var;[m
[31m-[m
[31m-#if (NGX_SETPROCTITLE_USES_ENV)[m
[31m-[m
[31m-    /* allocate the spare 300 bytes for the new binary process title */[m
[31m-[m
[31m-    env[n++] = "SPARE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"[m
[31m-               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"[m
[31m-               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"[m
[31m-               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"[m
[31m-               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    env[n] = NULL;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    char  **e;[m
[31m-    for (e = env; *e; e++) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "env: %s", *e);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx.envp = (char *const *) env;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (ngx_rename_file(ccf->pid.data, ccf->oldpid.data) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      ngx_rename_file_n " %s to %s failed "[m
[31m-                      "before executing new binary process \"%s\"",[m
[31m-                      ccf->pid.data, ccf->oldpid.data, argv[0]);[m
[31m-[m
[31m-        ngx_free(env);[m
[31m-        ngx_free(var);[m
[31m-[m
[31m-        return NGX_INVALID_PID;[m
[31m-    }[m
[31m-[m
[31m-    pid = ngx_execute(cycle, &ctx);[m
[31m-[m
[31m-    if (pid == NGX_INVALID_PID) {[m
[31m-        if (ngx_rename_file(ccf->oldpid.data, ccf->pid.data)[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_rename_file_n " %s back to %s failed after "[m
[31m-                          "an attempt to execute new binary process \"%s\"",[m
[31m-                          ccf->oldpid.data, ccf->pid.data, argv[0]);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(env);[m
[31m-    ngx_free(var);[m
[31m-[m
[31m-    return pid;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_get_options(int argc, char *const *argv)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    ngx_int_t   i;[m
[31m-[m
[31m-    for (i = 1; i < argc; i++) {[m
[31m-[m
[31m-        p = (u_char *) argv[i];[m
[31m-[m
[31m-        if (*p++ != '-') {[m
[31m-            ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        while (*p) {[m
[31m-[m
[31m-            switch (*p++) {[m
[31m-[m
[31m-            case '?':[m
[31m-            case 'h':[m
[31m-                ngx_show_version = 1;[m
[31m-                ngx_show_help = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'v':[m
[31m-                ngx_show_version = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'V':[m
[31m-                ngx_show_version = 1;[m
[31m-                ngx_show_configure = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 't':[m
[31m-                ngx_test_config = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'T':[m
[31m-                ngx_test_config = 1;[m
[31m-                ngx_dump_config = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'q':[m
[31m-                ngx_quiet_mode = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'p':[m
[31m-                if (*p) {[m
[31m-                    ngx_prefix = p;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                if (argv[++i]) {[m
[31m-                    ngx_prefix = (u_char *) argv[i];[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_stderr(0, "option \"-p\" requires directory name");[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            case 'c':[m
[31m-                if (*p) {[m
[31m-                    ngx_conf_file = p;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                if (argv[++i]) {[m
[31m-                    ngx_conf_file = (u_char *) argv[i];[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_stderr(0, "option \"-c\" requires file name");[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            case 'g':[m
[31m-                if (*p) {[m
[31m-                    ngx_conf_params = p;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                if (argv[++i]) {[m
[31m-                    ngx_conf_params = (u_char *) argv[i];[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_stderr(0, "option \"-g\" requires parameter");[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            case 's':[m
[31m-                if (*p) {[m
[31m-                    ngx_signal = (char *) p;[m
[31m-[m
[31m-                } else if (argv[++i]) {[m
[31m-                    ngx_signal = argv[i];[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_log_stderr(0, "option \"-s\" requires parameter");[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strcmp(ngx_signal, "stop") == 0[m
[31m-                    || ngx_strcmp(ngx_signal, "quit") == 0[m
[31m-                    || ngx_strcmp(ngx_signal, "reopen") == 0[m
[31m-                    || ngx_strcmp(ngx_signal, "reload") == 0)[m
[31m-                {[m
[31m-                    ngx_process = NGX_PROCESS_SIGNALLER;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_stderr(0, "invalid option: \"-s %s\"", ngx_signal);[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_stderr(0, "invalid option: \"%c\"", *(p - 1));[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-[m
[31m-    ngx_os_argv = (char **) argv;[m
[31m-    ngx_argc = argc;[m
[31m-    ngx_argv = (char **) argv;[m
[31m-[m
[31m-#else[m
[31m-    size_t     len;[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    ngx_os_argv = (char **) argv;[m
[31m-    ngx_argc = argc;[m
[31m-[m
[31m-    ngx_argv = ngx_alloc((argc + 1) * sizeof(char *), cycle->log);[m
[31m-    if (ngx_argv == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < argc; i++) {[m
[31m-        len = ngx_strlen(argv[i]) + 1;[m
[31m-[m
[31m-        ngx_argv[i] = ngx_alloc(len, cycle->log);[m
[31m-        if (ngx_argv[i] == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_cpystrn((u_char *) ngx_argv[i], (u_char *) argv[i], len);[m
[31m-    }[m
[31m-[m
[31m-    ngx_argv[i] = NULL;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_os_environ = environ;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_process_options(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-    size_t   len;[m
[31m-[m
[31m-    if (ngx_prefix) {[m
[31m-        len = ngx_strlen(ngx_prefix);[m
[31m-        p = ngx_prefix;[m
[31m-[m
[31m-        if (len && !ngx_path_separator(p[len - 1])) {[m
[31m-            p = ngx_pnalloc(cycle->pool, len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(p, ngx_prefix, len);[m
[31m-            p[len++] = '/';[m
[31m-        }[m
[31m-[m
[31m-        cycle->conf_prefix.len = len;[m
[31m-        cycle->conf_prefix.data = p;[m
[31m-        cycle->prefix.len = len;[m
[31m-        cycle->prefix.data = p;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#ifndef NGX_PREFIX[m
[31m-[m
[31m-        p = ngx_pnalloc(cycle->pool, NGX_MAX_PATH);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_getcwd(p, NGX_MAX_PATH) == 0) {[m
[31m-            ngx_log_stderr(ngx_errno, "[emerg]: " ngx_getcwd_n " failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_strlen(p);[m
[31m-[m
[31m-        p[len++] = '/';[m
[31m-[m
[31m-        cycle->conf_prefix.len = len;[m
[31m-        cycle->conf_prefix.data = p;[m
[31m-        cycle->prefix.len = len;[m
[31m-        cycle->prefix.data = p;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#ifdef NGX_CONF_PREFIX[m
[31m-        ngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX);[m
[31m-#else[m
[31m-        ngx_str_set(&cycle->conf_prefix, NGX_PREFIX);[m
[31m-#endif[m
[31m-        ngx_str_set(&cycle->prefix, NGX_PREFIX);[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_file) {[m
[31m-        cycle->conf_file.len = ngx_strlen(ngx_conf_file);[m
[31m-        cycle->conf_file.data = ngx_conf_file;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (p = cycle->conf_file.data + cycle->conf_file.len - 1;[m
[31m-         p > cycle->conf_file.data;[m
[31m-         p--)[m
[31m-    {[m
[31m-        if (ngx_path_separator(*p)) {[m
[31m-            cycle->conf_prefix.len = p - ngx_cycle->conf_file.data + 1;[m
[31m-            cycle->conf_prefix.data = ngx_cycle->conf_file.data;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_params) {[m
[31m-        cycle->conf_param.len = ngx_strlen(ngx_conf_params);[m
[31m-        cycle->conf_param.data = ngx_conf_params;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_test_config) {[m
[31m-        cycle->log->log_level = NGX_LOG_INFO;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_core_module_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = ngx_pcalloc(cycle->pool, sizeof(ngx_core_conf_t));[m
[31m-    if (ccf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc()[m
[31m-     *[m
[31m-     *     ccf->pid = NULL;[m
[31m-     *     ccf->oldpid = NULL;[m
[31m-     *     ccf->priority = 0;[m
[31m-     *     ccf->cpu_affinity_auto = 0;[m
[31m-     *     ccf->cpu_affinity_n = 0;[m
[31m-     *     ccf->cpu_affinity = NULL;[m
[31m-     */[m
[31m-[m
[31m-    ccf->daemon = NGX_CONF_UNSET;[m
[31m-    ccf->master = NGX_CONF_UNSET;[m
[31m-    ccf->timer_resolution = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    ccf->worker_processes = NGX_CONF_UNSET;[m
[31m-    ccf->debug_points = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ccf->rlimit_nofile = NGX_CONF_UNSET;[m
[31m-    ccf->rlimit_core = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ccf->user = (ngx_uid_t) NGX_CONF_UNSET_UINT;[m
[31m-    ccf->group = (ngx_gid_t) NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    if (ngx_array_init(&ccf->env, cycle->pool, 1, sizeof(ngx_str_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return ccf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    ngx_conf_init_value(ccf->daemon, 1);[m
[31m-    ngx_conf_init_value(ccf->master, 1);[m
[31m-    ngx_conf_init_msec_value(ccf->timer_resolution, 0);[m
[31m-[m
[31m-    ngx_conf_init_value(ccf->worker_processes, 1);[m
[31m-    ngx_conf_init_value(ccf->debug_points, 0);[m
[31m-[m
[31m-#if (NGX_HAVE_CPU_AFFINITY)[m
[31m-[m
[31m-    if (!ccf->cpu_affinity_auto[m
[31m-        && ccf->cpu_affinity_n[m
[31m-        && ccf->cpu_affinity_n != 1[m
[31m-        && ccf->cpu_affinity_n != (ngx_uint_t) ccf->worker_processes)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cycle->log, 0,[m
[31m-                      "the number of \"worker_processes\" is not equal to "[m
[31m-                      "the number of \"worker_cpu_affinity\" masks, "[m
[31m-                      "using last mask for remaining worker processes");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-    if (ccf->pid.len == 0) {[m
[31m-        ngx_str_set(&ccf->pid, NGX_PID_PATH);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cycle, &ccf->pid, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccf->oldpid.len = ccf->pid.len + sizeof(NGX_OLDPID_EXT);[m
[31m-[m
[31m-    ccf->oldpid.data = ngx_pnalloc(cycle->pool, ccf->oldpid.len);[m
[31m-    if (ccf->oldpid.data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(ngx_cpymem(ccf->oldpid.data, ccf->pid.data, ccf->pid.len),[m
[31m-               NGX_OLDPID_EXT, sizeof(NGX_OLDPID_EXT));[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-    if (ccf->user == (uid_t) NGX_CONF_UNSET_UINT && geteuid() == 0) {[m
[31m-        struct group   *grp;[m
[31m-        struct passwd  *pwd;[m
[31m-[m
[31m-        ngx_set_errno(0);[m
[31m-        pwd = getpwnam(NGX_USER);[m
[31m-        if (pwd == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "getpwnam(\"" NGX_USER "\") failed");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccf->username = NGX_USER;[m
[31m-        ccf->user = pwd->pw_uid;[m
[31m-[m
[31m-        ngx_set_errno(0);[m
[31m-        grp = getgrnam(NGX_GROUP);[m
[31m-        if (grp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "getgrnam(\"" NGX_GROUP "\") failed");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccf->group = grp->gr_gid;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ccf->lock_file.len == 0) {[m
[31m-        ngx_str_set(&ccf->lock_file, NGX_LOCK_PATH);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cycle, &ccf->lock_file, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    {[m
[31m-    ngx_str_t  lock_file;[m
[31m-[m
[31m-    lock_file = cycle->old_cycle->lock_file;[m
[31m-[m
[31m-    if (lock_file.len) {[m
[31m-        lock_file.len--;[m
[31m-[m
[31m-        if (ccf->lock_file.len != lock_file.len[m
[31m-            || ngx_strncmp(ccf->lock_file.data, lock_file.data, lock_file.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                          "\"lock_file\" could not be changed, ignored");[m
[31m-        }[m
[31m-[m
[31m-        cycle->lock_file.len = lock_file.len + 1;[m
[31m-        lock_file.len += sizeof(".accept");[m
[31m-[m
[31m-        cycle->lock_file.data = ngx_pstrdup(cycle->pool, &lock_file);[m
[31m-        if (cycle->lock_file.data == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cycle->lock_file.len = ccf->lock_file.len + 1;[m
[31m-        cycle->lock_file.data = ngx_pnalloc(cycle->pool,[m
[31m-                                      ccf->lock_file.len + sizeof(".accept"));[m
[31m-        if (cycle->lock_file.data == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(ngx_cpymem(cycle->lock_file.data, ccf->lock_file.data,[m
[31m-                              ccf->lock_file.len),[m
[31m-                   ".accept", sizeof(".accept"));[m
[31m-    }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"user\" is not supported, ignored");[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    char             *group;[m
[31m-    struct passwd    *pwd;[m
[31m-    struct group     *grp;[m
[31m-    ngx_str_t        *value;[m
[31m-[m
[31m-    if (ccf->user != (uid_t) NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (geteuid() != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "the \"user\" directive makes sense only "[m
[31m-                           "if the master process runs "[m
[31m-                           "with super-user privileges, ignored");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ccf->username = (char *) value[1].data;[m
[31m-[m
[31m-    ngx_set_errno(0);[m
[31m-    pwd = getpwnam((const char *) value[1].data);[m
[31m-    if (pwd == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           "getpwnam(\"%s\") failed", value[1].data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccf->user = pwd->pw_uid;[m
[31m-[m
[31m-    group = (char *) ((cf->args->nelts == 2) ? value[1].data : value[2].data);[m
[31m-[m
[31m-    ngx_set_errno(0);[m
[31m-    grp = getgrnam(group);[m
[31m-    if (grp == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           "getgrnam(\"%s\") failed", group);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccf->group = grp->gr_gid;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_env(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    ngx_str_t   *value, *var;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    var = ngx_array_push(&ccf->env);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    *var = value[1];[m
[31m-[m
[31m-    for (i = 0; i < value[1].len; i++) {[m
[31m-[m
[31m-        if (value[1].data[i] == '=') {[m
[31m-[m
[31m-            var->len = i;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_uint_t        n, minus;[m
[31m-[m
[31m-    if (ccf->priority != 0) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].data[0] == '-') {[m
[31m-        n = 1;[m
[31m-        minus = 1;[m
[31m-[m
[31m-    } else if (value[1].data[0] == '+') {[m
[31m-        n = 1;[m
[31m-        minus = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        n = 0;[m
[31m-        minus = 0;[m
[31m-    }[m
[31m-[m
[31m-    ccf->priority = ngx_atoi(&value[1].data[n], value[1].len - n);[m
[31m-    if (ccf->priority == NGX_ERROR) {[m
[31m-        return "invalid number";[m
[31m-    }[m
[31m-[m
[31m-    if (minus) {[m
[31m-        ccf->priority = -ccf->priority;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_HAVE_CPU_AFFINITY)[m
[31m-    ngx_core_conf_t  *ccf = conf;[m
[31m-[m
[31m-    u_char            ch, *p;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_uint_t        i, n;[m
[31m-    ngx_cpuset_t     *mask;[m
[31m-[m
[31m-    if (ccf->cpu_affinity) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    mask = ngx_palloc(cf->pool, (cf->args->nelts - 1) * sizeof(ngx_cpuset_t));[m
[31m-    if (mask == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccf->cpu_affinity_n = cf->args->nelts - 1;[m
[31m-    ccf->cpu_affinity = mask;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "auto") == 0) {[m
[31m-[m
[31m-        if (cf->args->nelts > 3) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid number of arguments in "[m
[31m-                               "\"worker_cpu_affinity\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccf->cpu_affinity_auto = 1;[m
[31m-[m
[31m-        CPU_ZERO(&mask[0]);[m
[31m-        for (i = 0; i < (ngx_uint_t) ngx_min(ngx_ncpu, CPU_SETSIZE); i++) {[m
[31m-            CPU_SET(i, &mask[0]);[m
[31m-        }[m
[31m-[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    for ( /* void */ ; n < cf->args->nelts; n++) {[m
[31m-[m
[31m-        if (value[n].len > CPU_SETSIZE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                         "\"worker_cpu_affinity\" supports up to %d CPUs only",[m
[31m-                         CPU_SETSIZE);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-        CPU_ZERO(&mask[n - 1]);[m
[31m-[m
[31m-        for (p = value[n].data + value[n].len - 1;[m
[31m-             p >= value[n].data;[m
[31m-             p--)[m
[31m-        {[m
[31m-            ch = *p;[m
[31m-[m
[31m-            if (ch == ' ') {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            if (ch == '0') {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '1') {[m
[31m-                CPU_SET(i - 1, &mask[n - 1]);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                          "invalid character \"%c\" in \"worker_cpu_affinity\"",[m
[31m-                          ch);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"worker_cpu_affinity\" is not supported "[m
[31m-                       "on this platform, ignored");[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_cpuset_t *[m
[31m-ngx_get_cpu_affinity(ngx_uint_t n)[m
[31m-{[m
[31m-#if (NGX_HAVE_CPU_AFFINITY)[m
[31m-    ngx_uint_t        i, j;[m
[31m-    ngx_cpuset_t     *mask;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    static ngx_cpuset_t  result;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    if (ccf->cpu_affinity == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->cpu_affinity_auto) {[m
[31m-        mask = &ccf->cpu_affinity[ccf->cpu_affinity_n - 1];[m
[31m-[m
[31m-        for (i = 0, j = n; /* void */ ; i++) {[m
[31m-[m
[31m-            if (CPU_ISSET(i % CPU_SETSIZE, mask) && j-- == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (i == CPU_SETSIZE && j == n) {[m
[31m-                /* empty mask */[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            /* void */[m
[31m-        }[m
[31m-[m
[31m-        CPU_ZERO(&result);[m
[31m-        CPU_SET(i % CPU_SETSIZE, &result);[m
[31m-[m
[31m-        return &result;[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->cpu_affinity_n > n) {[m
[31m-        return &ccf->cpu_affinity[n];[m
[31m-    }[m
[31m-[m
[31m-    return &ccf->cpu_affinity[ccf->cpu_affinity_n - 1];[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    return NULL;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) conf;[m
[31m-[m
[31m-    if (ccf->worker_processes != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "auto") == 0) {[m
[31m-        ccf->worker_processes = ngx_ncpu;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ccf->worker_processes = ngx_atoi(value[1].data, value[1].len);[m
[31m-[m
[31m-    if (ccf->worker_processes == NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_load_module(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-    void                *handle;[m
[31m-    char               **names, **order;[m
[31m-    ngx_str_t           *value, file;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_module_t        *module, **modules;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    if (cf->cycle->modules_used) {[m
[31m-        return "is specified too late";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    file = value[1];[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &file, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->cycle->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    handle = ngx_dlopen(file.data);[m
[31m-    if (handle == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           ngx_dlopen_n " \"%s\" failed (%s)",[m
[31m-                           file.data, ngx_dlerror());[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_unload_module;[m
[31m-    cln->data = handle;[m
[31m-[m
[31m-    modules = ngx_dlsym(handle, "ngx_modules");[m
[31m-    if (modules == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           ngx_dlsym_n " \"%V\", \"%s\" failed (%s)",[m
[31m-                           &value[1], "ngx_modules", ngx_dlerror());[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    names = ngx_dlsym(handle, "ngx_module_names");[m
[31m-    if (names == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           ngx_dlsym_n " \"%V\", \"%s\" failed (%s)",[m
[31m-                           &value[1], "ngx_module_names", ngx_dlerror());[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    order = ngx_dlsym(handle, "ngx_module_order");[m
[31m-[m
[31m-    for (i = 0; modules[i]; i++) {[m
[31m-        module = modules[i];[m
[31m-        module->name = names[i];[m
[31m-[m
[31m-        if (ngx_add_module(cf, &file, module, order) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cf->log, 0, "module: %s i:%ui",[m
[31m-                       module->name, module->index);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "\"load_module\" is not supported "[m
[31m-                       "on this platform");[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-[m
[31m-static void[m
[31m-ngx_unload_module(void *data)[m
[31m-{[m
[31m-    void  *handle = data;[m
[31m-[m
[31m-    if (ngx_dlclose(handle) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      ngx_dlclose_n " failed (%s)", ngx_dlerror());[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.h[m
[1mdeleted file mode 100644[m
[1mindex 24022dd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGINX_H_INCLUDED_[m
[31m-#define _NGINX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define nginx_version      1009015[m
[31m-#define NGINX_VERSION      "1.9.15"[m
[31m-#define NGINX_VER          "openresty/" NGINX_VERSION ".1"[m
[31m-[m
[31m-#ifdef NGX_BUILD[m
[31m-#define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"[m
[31m-#else[m
[31m-#define NGINX_VER_BUILD    NGINX_VER[m
[31m-#endif[m
[31m-[m
[31m-#define NGINX_VAR          "NGINX"[m
[31m-#define NGX_OLDPID_EXT     ".oldbin"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGINX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.h.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.h.orig[m
[1mdeleted file mode 100644[m
[1mindex ba8a9c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/nginx.h.orig[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGINX_H_INCLUDED_[m
[31m-#define _NGINX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define nginx_version      1009015[m
[31m-#define NGINX_VERSION      "1.9.15"[m
[31m-#define NGINX_VER          "nginx/" NGINX_VERSION[m
[31m-[m
[31m-#ifdef NGX_BUILD[m
[31m-#define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"[m
[31m-#else[m
[31m-#define NGINX_VER_BUILD    NGINX_VER[m
[31m-#endif[m
[31m-[m
[31m-#define NGINX_VAR          "NGINX"[m
[31m-#define NGX_OLDPID_EXT     ".oldbin"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGINX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_array.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_array.c[m
[1mdeleted file mode 100644[m
[1mindex 4ea226f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_array.c[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)[m
[31m-{[m
[31m-    ngx_array_t *a;[m
[31m-[m
[31m-    a = ngx_palloc(p, sizeof(ngx_array_t));[m
[31m-    if (a == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(a, p, n, size) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_array_destroy(ngx_array_t *a)[m
[31m-{[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = a->pool;[m
[31m-[m
[31m-    if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {[m
[31m-        p->d.last -= a->size * a->nalloc;[m
[31m-    }[m
[31m-[m
[31m-    if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {[m
[31m-        p->d.last = (u_char *) a;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_array_push(ngx_array_t *a)[m
[31m-{[m
[31m-    void        *elt, *new;[m
[31m-    size_t       size;[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    if (a->nelts == a->nalloc) {[m
[31m-[m
[31m-        /* the array is full */[m
[31m-[m
[31m-        size = a->size * a->nalloc;[m
[31m-[m
[31m-        p = a->pool;[m
[31m-[m
[31m-        if ((u_char *) a->elts + size == p->d.last[m
[31m-            && p->d.last + a->size <= p->d.end)[m
[31m-        {[m
[31m-            /*[m
[31m-             * the array allocation is the last in the pool[m
[31m-             * and there is space for new allocation[m
[31m-             */[m
[31m-[m
[31m-            p->d.last += a->size;[m
[31m-            a->nalloc++;[m
[31m-[m
[31m-        } else {[m
[31m-            /* allocate a new array */[m
[31m-[m
[31m-            new = ngx_palloc(p, 2 * size);[m
[31m-            if (new == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(new, a->elts, size);[m
[31m-            a->elts = new;[m
[31m-            a->nalloc *= 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    elt = (u_char *) a->elts + a->size * a->nelts;[m
[31m-    a->nelts++;[m
[31m-[m
[31m-    return elt;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)[m
[31m-{[m
[31m-    void        *elt, *new;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   nalloc;[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    size = n * a->size;[m
[31m-[m
[31m-    if (a->nelts + n > a->nalloc) {[m
[31m-[m
[31m-        /* the array is full */[m
[31m-[m
[31m-        p = a->pool;[m
[31m-[m
[31m-        if ((u_char *) a->elts + a->size * a->nalloc == p->d.last[m
[31m-            && p->d.last + size <= p->d.end)[m
[31m-        {[m
[31m-            /*[m
[31m-             * the array allocation is the last in the pool[m
[31m-             * and there is space for new allocation[m
[31m-             */[m
[31m-[m
[31m-            p->d.last += size;[m
[31m-            a->nalloc += n;[m
[31m-[m
[31m-        } else {[m
[31m-            /* allocate a new array */[m
[31m-[m
[31m-            nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);[m
[31m-[m
[31m-            new = ngx_palloc(p, nalloc * a->size);[m
[31m-            if (new == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(new, a->elts, a->nelts * a->size);[m
[31m-            a->elts = new;[m
[31m-            a->nalloc = nalloc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    elt = (u_char *) a->elts + a->size * a->nelts;[m
[31m-    a->nelts += n;[m
[31m-[m
[31m-    return elt;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_array.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_array.h[m
[1mdeleted file mode 100644[m
[1mindex a0f2a74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_array.h[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ARRAY_H_INCLUDED_[m
[31m-#define _NGX_ARRAY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void        *elts;[m
[31m-    ngx_uint_t   nelts;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   nalloc;[m
[31m-    ngx_pool_t  *pool;[m
[31m-} ngx_array_t;[m
[31m-[m
[31m-[m
[31m-ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);[m
[31m-void ngx_array_destroy(ngx_array_t *a);[m
[31m-void *ngx_array_push(ngx_array_t *a);[m
[31m-void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)[m
[31m-{[m
[31m-    /*[m
[31m-     * set "array->nelts" before "array->elts", otherwise MSVC thinks[m
[31m-     * that "array->nelts" may be used without having been initialized[m
[31m-     */[m
[31m-[m
[31m-    array->nelts = 0;[m
[31m-    array->size = size;[m
[31m-    array->nalloc = n;[m
[31m-    array->pool = pool;[m
[31m-[m
[31m-    array->elts = ngx_palloc(pool, n * size);[m
[31m-    if (array->elts == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ARRAY_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_buf.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_buf.c[m
[1mdeleted file mode 100644[m
[1mindex 00b6644..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_buf.c[m
[1m+++ /dev/null[m
[36m@@ -1,308 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_buf_t *[m
[31m-ngx_create_temp_buf(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    ngx_buf_t *b;[m
[31m-[m
[31m-    b = ngx_calloc_buf(pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->start = ngx_palloc(pool, size);[m
[31m-    if (b->start == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_calloc_buf():[m
[31m-     *[m
[31m-     *     b->file_pos = 0;[m
[31m-     *     b->file_last = 0;[m
[31m-     *     b->file = NULL;[m
[31m-     *     b->shadow = NULL;[m
[31m-     *     b->tag = 0;[m
[31m-     *     and flags[m
[31m-     */[m
[31m-[m
[31m-    b->pos = b->start;[m
[31m-    b->last = b->start;[m
[31m-    b->end = b->last + size;[m
[31m-    b->temporary = 1;[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_alloc_chain_link(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = pool->chain;[m
[31m-[m
[31m-    if (cl) {[m
[31m-        pool->chain = cl->next;[m
[31m-        return cl;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_palloc(pool, sizeof(ngx_chain_t));[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)[m
[31m-{[m
[31m-    u_char       *p;[m
[31m-    ngx_int_t     i;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *chain, *cl, **ll;[m
[31m-[m
[31m-    p = ngx_palloc(pool, bufs->num * bufs->size);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ll = &chain;[m
[31m-[m
[31m-    for (i = 0; i < bufs->num; i++) {[m
[31m-[m
[31m-        b = ngx_calloc_buf(pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * set by ngx_calloc_buf():[m
[31m-         *[m
[31m-         *     b->file_pos = 0;[m
[31m-         *     b->file_last = 0;[m
[31m-         *     b->file = NULL;[m
[31m-         *     b->shadow = NULL;[m
[31m-         *     b->tag = 0;[m
[31m-         *     and flags[m
[31m-         *[m
[31m-         */[m
[31m-[m
[31m-        b->pos = p;[m
[31m-        b->last = p;[m
[31m-        b->temporary = 1;[m
[31m-[m
[31m-        b->start = p;[m
[31m-        p += bufs->size;[m
[31m-        b->end = p;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    return chain;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t  *cl, **ll;[m
[31m-[m
[31m-    ll = chain;[m
[31m-[m
[31m-    for (cl = *chain; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    while (in) {[m
[31m-        cl = ngx_alloc_chain_link(pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = in->buf;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (*free) {[m
[31m-        cl = *free;[m
[31m-        *free = cl->next;[m
[31m-        cl->next = NULL;[m
[31m-        return cl;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(p);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ngx_calloc_buf(p);[m
[31m-    if (cl->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free, ngx_chain_t **busy,[m
[31m-    ngx_chain_t **out, ngx_buf_tag_t tag)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (*busy == NULL) {[m
[31m-        *busy = *out;[m
[31m-[m
[31m-    } else {[m
[31m-        for (cl = *busy; cl->next; cl = cl->next) { /* void */ }[m
[31m-[m
[31m-        cl->next = *out;[m
[31m-    }[m
[31m-[m
[31m-    *out = NULL;[m
[31m-[m
[31m-    while (*busy) {[m
[31m-        cl = *busy;[m
[31m-[m
[31m-        if (ngx_buf_size(cl->buf) != 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->tag != tag) {[m
[31m-            *busy = cl->next;[m
[31m-            ngx_free_chain(p, cl);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf->pos = cl->buf->start;[m
[31m-        cl->buf->last = cl->buf->start;[m
[31m-[m
[31m-        *busy = cl->next;[m
[31m-        cl->next = *free;[m
[31m-        *free = cl;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-off_t[m
[31m-ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit)[m
[31m-{[m
[31m-    off_t         total, size, aligned, fprev;[m
[31m-    ngx_fd_t      fd;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    total = 0;[m
[31m-[m
[31m-    cl = *in;[m
[31m-    fd = cl->buf->file->fd;[m
[31m-[m
[31m-    do {[m
[31m-        size = cl->buf->file_last - cl->buf->file_pos;[m
[31m-[m
[31m-        if (size > limit - total) {[m
[31m-            size = limit - total;[m
[31m-[m
[31m-            aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)[m
[31m-                       & ~((off_t) ngx_pagesize - 1);[m
[31m-[m
[31m-            if (aligned <= cl->buf->file_last) {[m
[31m-                size = aligned - cl->buf->file_pos;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        total += size;[m
[31m-        fprev = cl->buf->file_pos + size;[m
[31m-        cl = cl->next;[m
[31m-[m
[31m-    } while (cl[m
[31m-             && cl->buf->in_file[m
[31m-             && total < limit[m
[31m-             && fd == cl->buf->file->fd[m
[31m-             && fprev == cl->buf->file_pos);[m
[31m-[m
[31m-    *in = cl;[m
[31m-[m
[31m-    return total;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_chain_update_sent(ngx_chain_t *in, off_t sent)[m
[31m-{[m
[31m-    off_t  size;[m
[31m-[m
[31m-    for ( /* void */ ; in; in = in->next) {[m
[31m-[m
[31m-        if (ngx_buf_special(in->buf)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (sent == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        size = ngx_buf_size(in->buf);[m
[31m-[m
[31m-        if (sent >= size) {[m
[31m-            sent -= size;[m
[31m-[m
[31m-            if (ngx_buf_in_memory(in->buf)) {[m
[31m-                in->buf->pos = in->buf->last;[m
[31m-            }[m
[31m-[m
[31m-            if (in->buf->in_file) {[m
[31m-                in->buf->file_pos = in->buf->file_last;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_in_memory(in->buf)) {[m
[31m-            in->buf->pos += (size_t) sent;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->in_file) {[m
[31m-            in->buf->file_pos += sent;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_buf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_buf.h[m
[1mdeleted file mode 100644[m
[1mindex f652b20..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_buf.h[m
[1m+++ /dev/null[m
[36m@@ -1,176 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_BUF_H_INCLUDED_[m
[31m-#define _NGX_BUF_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef void *            ngx_buf_tag_t;[m
[31m-[m
[31m-typedef struct ngx_buf_s  ngx_buf_t;[m
[31m-[m
[31m-struct ngx_buf_s {[m
[31m-    u_char          *pos;[m
[31m-    u_char          *last;[m
[31m-    off_t            file_pos;[m
[31m-    off_t            file_last;[m
[31m-[m
[31m-    u_char          *start;         /* start of buffer */[m
[31m-    u_char          *end;           /* end of buffer */[m
[31m-    ngx_buf_tag_t    tag;[m
[31m-    ngx_file_t      *file;[m
[31m-    ngx_buf_t       *shadow;[m
[31m-[m
[31m-[m
[31m-    /* the buf's content could be changed */[m
[31m-    unsigned         temporary:1;[m
[31m-[m
[31m-    /*[m
[31m-     * the buf's content is in a memory cache or in a read only memory[m
[31m-     * and must not be changed[m
[31m-     */[m
[31m-    unsigned         memory:1;[m
[31m-[m
[31m-    /* the buf's content is mmap()ed and must not be changed */[m
[31m-    unsigned         mmap:1;[m
[31m-[m
[31m-    unsigned         recycled:1;[m
[31m-    unsigned         in_file:1;[m
[31m-    unsigned         flush:1;[m
[31m-    unsigned         sync:1;[m
[31m-    unsigned         last_buf:1;[m
[31m-    unsigned         last_in_chain:1;[m
[31m-[m
[31m-    unsigned         last_shadow:1;[m
[31m-    unsigned         temp_file:1;[m
[31m-[m
[31m-    /* STUB */ int   num;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_chain_s {[m
[31m-    ngx_buf_t    *buf;[m
[31m-    ngx_chain_t  *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t    num;[m
[31m-    size_t       size;[m
[31m-} ngx_bufs_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_output_chain_ctx_s  ngx_output_chain_ctx_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_output_chain_filter_pt)(void *ctx, ngx_chain_t *in);[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-typedef void (*ngx_output_chain_aio_pt)(ngx_output_chain_ctx_t *ctx,[m
[31m-    ngx_file_t *file);[m
[31m-#endif[m
[31m-[m
[31m-struct ngx_output_chain_ctx_s {[m
[31m-    ngx_buf_t                   *buf;[m
[31m-    ngx_chain_t                 *in;[m
[31m-    ngx_chain_t                 *free;[m
[31m-    ngx_chain_t                 *busy;[m
[31m-[m
[31m-    unsigned                     sendfile:1;[m
[31m-    unsigned                     directio:1;[m
[31m-#if (NGX_HAVE_ALIGNED_DIRECTIO)[m
[31m-    unsigned                     unaligned:1;[m
[31m-#endif[m
[31m-    unsigned                     need_in_memory:1;[m
[31m-    unsigned                     need_in_temp:1;[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    unsigned                     aio:1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-    ngx_output_chain_aio_pt      aio_handler;[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    ssize_t                    (*aio_preload)(ngx_buf_t *file);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_int_t                  (*thread_handler)(ngx_thread_task_t *task,[m
[31m-                                                 ngx_file_t *file);[m
[31m-    ngx_thread_task_t           *thread_task;[m
[31m-#endif[m
[31m-[m
[31m-    off_t                        alignment;[m
[31m-[m
[31m-    ngx_pool_t                  *pool;[m
[31m-    ngx_int_t                    allocated;[m
[31m-    ngx_bufs_t                   bufs;[m
[31m-    ngx_buf_tag_t                tag;[m
[31m-[m
[31m-    ngx_output_chain_filter_pt   output_filter;[m
[31m-    void                        *filter_ctx;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t                 *out;[m
[31m-    ngx_chain_t                **last;[m
[31m-    ngx_connection_t            *connection;[m
[31m-    ngx_pool_t                  *pool;[m
[31m-    off_t                        limit;[m
[31m-} ngx_chain_writer_ctx_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_CHAIN_ERROR     (ngx_chain_t *) NGX_ERROR[m
[31m-[m
[31m-[m
[31m-#define ngx_buf_in_memory(b)        (b->temporary || b->memory || b->mmap)[m
[31m-#define ngx_buf_in_memory_only(b)   (ngx_buf_in_memory(b) && !b->in_file)[m
[31m-[m
[31m-#define ngx_buf_special(b)                                                   \[m
[31m-    ((b->flush || b->last_buf || b->sync)                                    \[m
[31m-     && !ngx_buf_in_memory(b) && !b->in_file)[m
[31m-[m
[31m-#define ngx_buf_sync_only(b)                                                 \[m
[31m-    (b->sync                                                                 \[m
[31m-     && !ngx_buf_in_memory(b) && !b->in_file && !b->flush && !b->last_buf)[m
[31m-[m
[31m-#define ngx_buf_size(b)                                                      \[m
[31m-    (ngx_buf_in_memory(b) ? (off_t) (b->last - b->pos):                      \[m
[31m-                            (b->file_last - b->file_pos))[m
[31m-[m
[31m-ngx_buf_t *ngx_create_temp_buf(ngx_pool_t *pool, size_t size);[m
[31m-ngx_chain_t *ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs);[m
[31m-[m
[31m-[m
[31m-#define ngx_alloc_buf(pool)  ngx_palloc(pool, sizeof(ngx_buf_t))[m
[31m-#define ngx_calloc_buf(pool) ngx_pcalloc(pool, sizeof(ngx_buf_t))[m
[31m-[m
[31m-ngx_chain_t *ngx_alloc_chain_link(ngx_pool_t *pool);[m
[31m-#define ngx_free_chain(pool, cl)                                             \[m
[31m-    cl->next = pool->chain;                                                  \[m
[31m-    pool->chain = cl[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in);[m
[31m-ngx_int_t ngx_chain_writer(void *ctx, ngx_chain_t *in);[m
[31m-[m
[31m-ngx_int_t ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain,[m
[31m-    ngx_chain_t *in);[m
[31m-ngx_chain_t *ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free);[m
[31m-void ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free,[m
[31m-    ngx_chain_t **busy, ngx_chain_t **out, ngx_buf_tag_t tag);[m
[31m-[m
[31m-off_t ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit);[m
[31m-[m
[31m-ngx_chain_t *ngx_chain_update_sent(ngx_chain_t *in, off_t sent);[m
[31m-[m
[31m-#endif /* _NGX_BUF_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_conf_file.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_conf_file.c[m
[1mdeleted file mode 100644[m
[1mindex c60d5fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_conf_file.c[m
[1m+++ /dev/null[m
[36m@@ -1,1444 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#define NGX_CONF_BUFFER  4096[m
[31m-[m
[31m-static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last);[m
[31m-static ngx_int_t ngx_conf_read_token(ngx_conf_t *cf);[m
[31m-static void ngx_conf_flush_files(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_conf_commands[] = {[m
[31m-[m
[31m-    { ngx_string("include"),[m
[31m-      NGX_ANY_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_include,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_conf_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    NULL,                                  /* module context */[m
[31m-    ngx_conf_commands,                     /* module directives */[m
[31m-    NGX_CONF_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    ngx_conf_flush_files,                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* The eight fixed arguments */[m
[31m-[m
[31m-static ngx_uint_t argument_number[] = {[m
[31m-    NGX_CONF_NOARGS,[m
[31m-    NGX_CONF_TAKE1,[m
[31m-    NGX_CONF_TAKE2,[m
[31m-    NGX_CONF_TAKE3,[m
[31m-    NGX_CONF_TAKE4,[m
[31m-    NGX_CONF_TAKE5,[m
[31m-    NGX_CONF_TAKE6,[m
[31m-    NGX_CONF_TAKE7[m
[31m-};[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_param(ngx_conf_t *cf)[m
[31m-{[m
[31m-    char             *rv;[m
[31m-    ngx_str_t        *param;[m
[31m-    ngx_buf_t         b;[m
[31m-    ngx_conf_file_t   conf_file;[m
[31m-[m
[31m-    param = &cf->cycle->conf_param;[m
[31m-[m
[31m-    if (param->len == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&conf_file, sizeof(ngx_conf_file_t));[m
[31m-[m
[31m-    ngx_memzero(&b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    b.start = param->data;[m
[31m-    b.pos = param->data;[m
[31m-    b.last = param->data + param->len;[m
[31m-    b.end = b.last;[m
[31m-    b.temporary = 1;[m
[31m-[m
[31m-    conf_file.file.fd = NGX_INVALID_FILE;[m
[31m-    conf_file.file.name.data = NULL;[m
[31m-    conf_file.line = 0;[m
[31m-[m
[31m-    cf->conf_file = &conf_file;[m
[31m-    cf->conf_file->buffer = &b;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    cf->conf_file = NULL;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)[m
[31m-{[m
[31m-    char             *rv;[m
[31m-    u_char           *p;[m
[31m-    off_t             size;[m
[31m-    ngx_fd_t          fd;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_buf_t         buf, *tbuf;[m
[31m-    ngx_conf_file_t  *prev, conf_file;[m
[31m-    ngx_conf_dump_t  *cd;[m
[31m-    enum {[m
[31m-        parse_file = 0,[m
[31m-        parse_block,[m
[31m-        parse_param[m
[31m-    } type;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    fd = NGX_INVALID_FILE;[m
[31m-    prev = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    if (filename) {[m
[31m-[m
[31m-        /* open configuration file */[m
[31m-[m
[31m-        fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-        if (fd == NGX_INVALID_FILE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_open_file_n " \"%s\" failed",[m
[31m-                               filename->data);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        prev = cf->conf_file;[m
[31m-[m
[31m-        cf->conf_file = &conf_file;[m
[31m-[m
[31m-        if (ngx_fd_info(fd, &cf->conf_file->file.info) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno,[m
[31m-                          ngx_fd_info_n " \"%s\" failed", filename->data);[m
[31m-        }[m
[31m-[m
[31m-        cf->conf_file->buffer = &buf;[m
[31m-[m
[31m-        buf.start = ngx_alloc(NGX_CONF_BUFFER, cf->log);[m
[31m-        if (buf.start == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        buf.pos = buf.start;[m
[31m-        buf.last = buf.start;[m
[31m-        buf.end = buf.last + NGX_CONF_BUFFER;[m
[31m-        buf.temporary = 1;[m
[31m-[m
[31m-        cf->conf_file->file.fd = fd;[m
[31m-        cf->conf_file->file.name.len = filename->len;[m
[31m-        cf->conf_file->file.name.data = filename->data;[m
[31m-        cf->conf_file->file.offset = 0;[m
[31m-        cf->conf_file->file.log = cf->log;[m
[31m-        cf->conf_file->line = 1;[m
[31m-[m
[31m-        type = parse_file;[m
[31m-[m
[31m-        if (ngx_dump_config[m
[31m-#if (NGX_DEBUG)[m
[31m-            || 1[m
[31m-#endif[m
[31m-           )[m
[31m-        {[m
[31m-            p = ngx_pstrdup(cf->cycle->pool, filename);[m
[31m-            if (p == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            size = ngx_file_size(&cf->conf_file->file.info);[m
[31m-[m
[31m-            tbuf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size);[m
[31m-            if (tbuf == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            cd = ngx_array_push(&cf->cycle->config_dump);[m
[31m-            if (cd == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            cd->name.len = filename->len;[m
[31m-            cd->name.data = p;[m
[31m-            cd->buffer = tbuf;[m
[31m-[m
[31m-            cf->conf_file->dump = tbuf;[m
[31m-[m
[31m-        } else {[m
[31m-            cf->conf_file->dump = NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else if (cf->conf_file->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        type = parse_block;[m
[31m-[m
[31m-    } else {[m
[31m-        type = parse_param;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        rc = ngx_conf_read_token(cf);[m
[31m-[m
[31m-        /*[m
[31m-         * ngx_conf_read_token() may return[m
[31m-         *[m
[31m-         *    NGX_ERROR             there is error[m
[31m-         *    NGX_OK                the token terminated by ";" was found[m
[31m-         *    NGX_CONF_BLOCK_START  the token terminated by "{" was found[m
[31m-         *    NGX_CONF_BLOCK_DONE   the "}" was found[m
[31m-         *    NGX_CONF_FILE_DONE    the configuration file is done[m
[31m-         */[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_CONF_BLOCK_DONE) {[m
[31m-[m
[31m-            if (type != parse_block) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected \"}\"");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_CONF_FILE_DONE) {[m
[31m-[m
[31m-            if (type == parse_block) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected end of file, expecting \"}\"");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_CONF_BLOCK_START) {[m
[31m-[m
[31m-            if (type == parse_param) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "block directives are not supported "[m
[31m-                                   "in -g option");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_OK || rc == NGX_CONF_BLOCK_START */[m
[31m-[m
[31m-        if (cf->handler) {[m
[31m-[m
[31m-            /*[m
[31m-             * the custom handler, i.e., that is used in the http's[m
[31m-             * "types { ... }" directive[m
[31m-             */[m
[31m-[m
[31m-            if (rc == NGX_CONF_BLOCK_START) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected \"{\"");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            rv = (*cf->handler)(cf, NULL, cf->handler_conf);[m
[31m-            if (rv == NGX_CONF_OK) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rv == NGX_CONF_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, rv);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        rc = ngx_conf_handler(cf, rc);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc = NGX_ERROR;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (filename) {[m
[31m-        if (cf->conf_file->buffer->start) {[m
[31m-            ngx_free(cf->conf_file->buffer->start);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " %s failed",[m
[31m-                          filename->data);[m
[31m-            rc = NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cf->conf_file = prev;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last)[m
[31m-{[m
[31m-    char           *rv;[m
[31m-    void           *conf, **confp;[m
[31m-    ngx_uint_t      i, found;[m
[31m-    ngx_str_t      *name;[m
[31m-    ngx_command_t  *cmd;[m
[31m-[m
[31m-    name = cf->args->elts;[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-[m
[31m-        cmd = cf->cycle->modules[i]->commands;[m
[31m-        if (cmd == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; cmd->name.len; cmd++) {[m
[31m-[m
[31m-            if (name->len != cmd->name.len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strcmp(name->data, cmd->name.data) != 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            found = 1;[m
[31m-[m
[31m-            if (cf->cycle->modules[i]->type != NGX_CONF_MODULE[m
[31m-                && cf->cycle->modules[i]->type != cf->module_type)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* is the directive's location right ? */[m
[31m-[m
[31m-            if (!(cmd->type & cf->cmd_type)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (!(cmd->type & NGX_CONF_BLOCK) && last != NGX_OK) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                  "directive \"%s\" is not terminated by \";\"",[m
[31m-                                  name->data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if ((cmd->type & NGX_CONF_BLOCK) && last != NGX_CONF_BLOCK_START) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "directive \"%s\" has no opening \"{\"",[m
[31m-                                   name->data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* is the directive's argument count right ? */[m
[31m-[m
[31m-            if (!(cmd->type & NGX_CONF_ANY)) {[m
[31m-[m
[31m-                if (cmd->type & NGX_CONF_FLAG) {[m
[31m-[m
[31m-                    if (cf->args->nelts != 2) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                } else if (cmd->type & NGX_CONF_1MORE) {[m
[31m-[m
[31m-                    if (cf->args->nelts < 2) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                } else if (cmd->type & NGX_CONF_2MORE) {[m
[31m-[m
[31m-                    if (cf->args->nelts < 3) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                } else if (cf->args->nelts > NGX_CONF_MAX_ARGS) {[m
[31m-[m
[31m-                    goto invalid;[m
[31m-[m
[31m-                } else if (!(cmd->type & argument_number[cf->args->nelts - 1]))[m
[31m-                {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            /* set up the directive's configuration context */[m
[31m-[m
[31m-            conf = NULL;[m
[31m-[m
[31m-            if (cmd->type & NGX_DIRECT_CONF) {[m
[31m-                conf = ((void **) cf->ctx)[cf->cycle->modules[i]->index];[m
[31m-[m
[31m-            } else if (cmd->type & NGX_MAIN_CONF) {[m
[31m-                conf = &(((void **) cf->ctx)[cf->cycle->modules[i]->index]);[m
[31m-[m
[31m-            } else if (cf->ctx) {[m
[31m-                confp = *(void **) ((char *) cf->ctx + cmd->conf);[m
[31m-[m
[31m-                if (confp) {[m
[31m-                    conf = confp[cf->cycle->modules[i]->ctx_index];[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            rv = cmd->set(cf, cmd, conf);[m
[31m-[m
[31m-            if (rv == NGX_CONF_OK) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (rv == NGX_CONF_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%s\" directive %s", name->data, rv);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (found) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%s\" directive is not allowed here", name->data);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "unknown directive \"%s\"", name->data);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid number of arguments in \"%s\" directive",[m
[31m-                       name->data);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_conf_read_token(ngx_conf_t *cf)[m
[31m-{[m
[31m-    u_char      *start, ch, *src, *dst;[m
[31m-    off_t        file_size;[m
[31m-    size_t       len;[m
[31m-    ssize_t      n, size;[m
[31m-    ngx_uint_t   found, need_space, last_space, sharp_comment, variable;[m
[31m-    ngx_uint_t   quoted, s_quoted, d_quoted, start_line;[m
[31m-    ngx_str_t   *word;[m
[31m-    ngx_buf_t   *b, *dump;[m
[31m-[m
[31m-    found = 0;[m
[31m-    need_space = 0;[m
[31m-    last_space = 1;[m
[31m-    sharp_comment = 0;[m
[31m-    variable = 0;[m
[31m-    quoted = 0;[m
[31m-    s_quoted = 0;[m
[31m-    d_quoted = 0;[m
[31m-[m
[31m-    cf->args->nelts = 0;[m
[31m-    b = cf->conf_file->buffer;[m
[31m-    dump = cf->conf_file->dump;[m
[31m-    start = b->pos;[m
[31m-    start_line = cf->conf_file->line;[m
[31m-[m
[31m-    file_size = ngx_file_size(&cf->conf_file->file.info);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (b->pos >= b->last) {[m
[31m-[m
[31m-            if (cf->conf_file->file.offset >= file_size) {[m
[31m-[m
[31m-                if (cf->args->nelts > 0 || !last_space) {[m
[31m-[m
[31m-                    if (cf->conf_file->file.fd == NGX_INVALID_FILE) {[m
[31m-                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                           "unexpected end of parameter, "[m
[31m-                                           "expecting \";\"");[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                  "unexpected end of file, "[m
[31m-                                  "expecting \";\" or \"}\"");[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_CONF_FILE_DONE;[m
[31m-            }[m
[31m-[m
[31m-            len = b->pos - start;[m
[31m-[m
[31m-            if (len == NGX_CONF_BUFFER) {[m
[31m-                cf->conf_file->line = start_line;[m
[31m-[m
[31m-                if (d_quoted) {[m
[31m-                    ch = '"';[m
[31m-[m
[31m-                } else if (s_quoted) {[m
[31m-                    ch = '\'';[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "too long parameter \"%*s...\" started",[m
[31m-                                       10, start);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "too long parameter, probably "[m
[31m-                                   "missing terminating \"%c\" character", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                ngx_memmove(b->start, start, len);[m
[31m-            }[m
[31m-[m
[31m-            size = (ssize_t) (file_size - cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (size > b->end - (b->start + len)) {[m
[31m-                size = b->end - (b->start + len);[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_read_file(&cf->conf_file->file, b->start + len, size,[m
[31m-                              cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n != size) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   ngx_read_file_n " returned "[m
[31m-                                   "only %z bytes instead of %z",[m
[31m-                                   n, size);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start + len;[m
[31m-            b->last = b->pos + n;[m
[31m-            start = b->start;[m
[31m-[m
[31m-            if (dump) {[m
[31m-                dump->last = ngx_cpymem(dump->last, b->pos, size);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ch = *b->pos++;[m
[31m-[m
[31m-        if (ch == LF) {[m
[31m-            cf->conf_file->line++;[m
[31m-[m
[31m-            if (sharp_comment) {[m
[31m-                sharp_comment = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (sharp_comment) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (quoted) {[m
[31m-            quoted = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (need_space) {[m
[31m-            if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) {[m
[31m-                last_space = 1;[m
[31m-                need_space = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ';') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '{') {[m
[31m-                return NGX_CONF_BLOCK_START;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ')') {[m
[31m-                last_space = 1;[m
[31m-                need_space = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected \"%c\"", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (last_space) {[m
[31m-            if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            start = b->pos - 1;[m
[31m-            start_line = cf->conf_file->line;[m
[31m-[m
[31m-            switch (ch) {[m
[31m-[m
[31m-            case ';':[m
[31m-            case '{':[m
[31m-                if (cf->args->nelts == 0) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "unexpected \"%c\"", ch);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (ch == '{') {[m
[31m-                    return NGX_CONF_BLOCK_START;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            case '}':[m
[31m-                if (cf->args->nelts != 0) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "unexpected \"}\"");[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_CONF_BLOCK_DONE;[m
[31m-[m
[31m-            case '#':[m
[31m-                sharp_comment = 1;[m
[31m-                continue;[m
[31m-[m
[31m-            case '\\':[m
[31m-                quoted = 1;[m
[31m-                last_space = 0;[m
[31m-                continue;[m
[31m-[m
[31m-            case '"':[m
[31m-                start++;[m
[31m-                d_quoted = 1;[m
[31m-                last_space = 0;[m
[31m-                continue;[m
[31m-[m
[31m-            case '\'':[m
[31m-                start++;[m
[31m-                s_quoted = 1;[m
[31m-                last_space = 0;[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-                last_space = 0;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ch == '{' && variable) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            variable = 0;[m
[31m-[m
[31m-            if (ch == '\\') {[m
[31m-                quoted = 1;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '$') {[m
[31m-                variable = 1;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (d_quoted) {[m
[31m-                if (ch == '"') {[m
[31m-                    d_quoted = 0;[m
[31m-                    need_space = 1;[m
[31m-                    found = 1;[m
[31m-                }[m
[31m-[m
[31m-            } else if (s_quoted) {[m
[31m-                if (ch == '\'') {[m
[31m-                    s_quoted = 0;[m
[31m-                    need_space = 1;[m
[31m-                    found = 1;[m
[31m-                }[m
[31m-[m
[31m-            } else if (ch == ' ' || ch == '\t' || ch == CR || ch == LF[m
[31m-                       || ch == ';' || ch == '{')[m
[31m-            {[m
[31m-                last_space = 1;[m
[31m-                found = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (found) {[m
[31m-                word = ngx_array_push(cf->args);[m
[31m-                if (word == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                word->data = ngx_pnalloc(cf->pool, b->pos - 1 - start + 1);[m
[31m-                if (word->data == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                for (dst = word->data, src = start, len = 0;[m
[31m-                     src < b->pos - 1;[m
[31m-                     len++)[m
[31m-                {[m
[31m-                    if (*src == '\\') {[m
[31m-                        switch (src[1]) {[m
[31m-                        case '"':[m
[31m-                        case '\'':[m
[31m-                        case '\\':[m
[31m-                            src++;[m
[31m-                            break;[m
[31m-[m
[31m-                        case 't':[m
[31m-                            *dst++ = '\t';[m
[31m-                            src += 2;[m
[31m-                            continue;[m
[31m-[m
[31m-                        case 'r':[m
[31m-                            *dst++ = '\r';[m
[31m-                            src += 2;[m
[31m-                            continue;[m
[31m-[m
[31m-                        case 'n':[m
[31m-                            *dst++ = '\n';[m
[31m-                            src += 2;[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                    }[m
[31m-                    *dst++ = *src++;[m
[31m-                }[m
[31m-                *dst = '\0';[m
[31m-                word->len = len;[m
[31m-[m
[31m-                if (ch == ';') {[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                if (ch == '{') {[m
[31m-                    return NGX_CONF_BLOCK_START;[m
[31m-                }[m
[31m-[m
[31m-                found = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_str_t   *value, file, name;[m
[31m-    ngx_glob_t   gl;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    file = value[1];[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (strpbrk((char *) file.data, "*?[") == NULL) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-        return ngx_conf_parse(cf, &file);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&gl, sizeof(ngx_glob_t));[m
[31m-[m
[31m-    gl.pattern = file.data;[m
[31m-    gl.log = cf->log;[m
[31m-    gl.test = 1;[m
[31m-[m
[31m-    if (ngx_open_glob(&gl) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           ngx_open_glob_n " \"%s\" failed", file.data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rv = NGX_CONF_OK;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = ngx_read_glob(&gl, &name);[m
[31m-[m
[31m-        if (n != NGX_OK) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        file.len = name.len++;[m
[31m-        file.data = ngx_pstrdup(cf->pool, &name);[m
[31m-        if (file.data == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-        rv = ngx_conf_parse(cf, &file);[m
[31m-[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_glob(&gl);[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name, ngx_uint_t conf_prefix)[m
[31m-{[m
[31m-    ngx_str_t  *prefix;[m
[31m-[m
[31m-    prefix = conf_prefix ? &cycle->conf_prefix : &cycle->prefix;[m
[31m-[m
[31m-    return ngx_get_full_name(cycle->pool, prefix, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_open_file_t *[m
[31m-ngx_conf_open_file(ngx_cycle_t *cycle, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_str_t         full;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_open_file_t  *file;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    ngx_str_null(&full);[m
[31m-#endif[m
[31m-[m
[31m-    if (name->len) {[m
[31m-        full = *name;[m
[31m-[m
[31m-        if (ngx_conf_full_name(cycle, &full, 0) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        part = &cycle->open_files.part;[m
[31m-        file = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-                part = part->next;[m
[31m-                file = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (full.len != file[i].name.len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strcmp(full.data, file[i].name.data) == 0) {[m
[31m-                return &file[i];[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    file = ngx_list_push(&cycle->open_files);[m
[31m-    if (file == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len) {[m
[31m-        file->fd = NGX_INVALID_FILE;[m
[31m-        file->name = full;[m
[31m-[m
[31m-    } else {[m
[31m-        file->fd = ngx_stderr;[m
[31m-        file->name = *name;[m
[31m-    }[m
[31m-[m
[31m-    file->flush = NULL;[m
[31m-    file->data = NULL;[m
[31m-[m
[31m-    return file;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_conf_flush_files(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_open_file_t  *file;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "flush files");[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].flush) {[m
[31m-            file[i].flush(&file[i], cycle->log);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf, ngx_err_t err,[m
[31m-    const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   errstr[NGX_MAX_CONF_ERRSTR], *p, *last;[m
[31m-    va_list  args;[m
[31m-[m
[31m-    last = errstr + NGX_MAX_CONF_ERRSTR;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(errstr, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    if (err) {[m
[31m-        p = ngx_log_errno(p, last, err);[m
[31m-    }[m
[31m-[m
[31m-    if (cf->conf_file == NULL) {[m
[31m-        ngx_log_error(level, cf->log, 0, "%*s", p - errstr, errstr);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->conf_file->file.fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(level, cf->log, 0, "%*s in command line",[m
[31m-                      p - errstr, errstr);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, cf->log, 0, "%*s in %s:%ui",[m
[31m-                  p - errstr, errstr,[m
[31m-                  cf->conf_file->file.name.data, cf->conf_file->line);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_flag_t       *fp;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    fp = (ngx_flag_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*fp != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcasecmp(value[1].data, (u_char *) "on") == 0) {[m
[31m-        *fp = 1;[m
[31m-[m
[31m-    } else if (ngx_strcasecmp(value[1].data, (u_char *) "off") == 0) {[m
[31m-        *fp = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                     "invalid value \"%s\" in \"%s\" directive, "[m
[31m-                     "it must be \"on\" or \"off\"",[m
[31m-                     value[1].data, cmd->name.data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, fp);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t        *field, *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    field = (ngx_str_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (field->data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *field = value[1];[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, field);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_str_array_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t         *value, *s;[m
[31m-    ngx_array_t      **a;[m
[31m-    ngx_conf_post_t   *post;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NGX_CONF_UNSET_PTR) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = ngx_array_push(*a);[m
[31m-    if (s == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *s = value[1];[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, s);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_keyval_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t         *value;[m
[31m-    ngx_array_t      **a;[m
[31m-    ngx_keyval_t      *kv;[m
[31m-    ngx_conf_post_t   *post;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_keyval_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    kv = ngx_array_push(*a);[m
[31m-    if (kv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    kv->key = value[1];[m
[31m-    kv->value = value[2];[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, kv);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_num_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t        *np;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    np = (ngx_int_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*np != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    *np = ngx_atoi(value[1].data, value[1].len);[m
[31m-    if (*np == NGX_ERROR) {[m
[31m-        return "invalid number";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, np);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    size_t           *sp;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    sp = (size_t *) (p + cmd->offset);[m
[31m-    if (*sp != NGX_CONF_UNSET_SIZE) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *sp = ngx_parse_size(&value[1]);[m
[31m-    if (*sp == (size_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, sp);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_off_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    off_t            *op;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    op = (off_t *) (p + cmd->offset);[m
[31m-    if (*op != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *op = ngx_parse_offset(&value[1]);[m
[31m-    if (*op == (off_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, op);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_msec_t       *msp;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    msp = (ngx_msec_t *) (p + cmd->offset);[m
[31m-    if (*msp != NGX_CONF_UNSET_MSEC) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *msp = ngx_parse_time(&value[1], 0);[m
[31m-    if (*msp == (ngx_msec_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, msp);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_sec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    time_t           *sp;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    sp = (time_t *) (p + cmd->offset);[m
[31m-    if (*sp != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *sp = ngx_parse_time(&value[1], 1);[m
[31m-    if (*sp == (time_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, sp);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char *p = conf;[m
[31m-[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_bufs_t  *bufs;[m
[31m-[m
[31m-[m
[31m-    bufs = (ngx_bufs_t *) (p + cmd->offset);[m
[31m-    if (bufs->num) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    bufs->num = ngx_atoi(value[1].data, value[1].len);[m
[31m-    if (bufs->num == NGX_ERROR || bufs->num == 0) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    bufs->size = ngx_parse_size(&value[2]);[m
[31m-    if (bufs->size == (size_t) NGX_ERROR || bufs->size == 0) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_enum_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_uint_t       *np, i;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_enum_t  *e;[m
[31m-[m
[31m-    np = (ngx_uint_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*np != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    e = cmd->post;[m
[31m-[m
[31m-    for (i = 0; e[i].name.len != 0; i++) {[m
[31m-        if (e[i].name.len != value[1].len[m
[31m-            || ngx_strcasecmp(e[i].name.data, value[1].data) != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *np = e[i].value;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "invalid value \"%s\"", value[1].data);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_bitmask_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_uint_t          *np, i, m;[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_conf_bitmask_t  *mask;[m
[31m-[m
[31m-[m
[31m-    np = (ngx_uint_t *) (p + cmd->offset);[m
[31m-    value = cf->args->elts;[m
[31m-    mask = cmd->post;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        for (m = 0; mask[m].name.len != 0; m++) {[m
[31m-[m
[31m-            if (mask[m].name.len != value[i].len[m
[31m-                || ngx_strcasecmp(mask[m].name.data, value[i].data) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (*np & mask[m].mask) {[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                                   "duplicate value \"%s\"", value[i].data);[m
[31m-[m
[31m-            } else {[m
[31m-                *np |= mask[m].mask;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (mask[m].name.len == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "invalid value \"%s\"", value[i].data);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_unsupported(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    return "unsupported on this platform";[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_deprecated(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_conf_deprecated_t  *d = post;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "the \"%s\" directive is deprecated, "[m
[31m-                       "use the \"%s\" directive instead",[m
[31m-                       d->old_name, d->new_name);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_conf_num_bounds_t  *bounds = post;[m
[31m-    ngx_int_t  *np = data;[m
[31m-[m
[31m-    if (bounds->high == -1) {[m
[31m-        if (*np >= bounds->low) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "value must be equal to or greater than %i",[m
[31m-                           bounds->low);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*np >= bounds->low && *np <= bounds->high) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "value must be between %i and %i",[m
[31m-                       bounds->low, bounds->high);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_conf_file.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_conf_file.h[m
[1mdeleted file mode 100644[m
[1mindex 9ccee36..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_conf_file.h[m
[1m+++ /dev/null[m
[36m@@ -1,296 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CONF_FILE_H_INCLUDED_[m
[31m-#define _NGX_CONF_FILE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- *        AAAA  number of arguments[m
[31m- *      FF      command flags[m
[31m- *    TT        command type, i.e. HTTP "location" or "server" command[m
[31m- */[m
[31m-[m
[31m-#define NGX_CONF_NOARGS      0x00000001[m
[31m-#define NGX_CONF_TAKE1       0x00000002[m
[31m-#define NGX_CONF_TAKE2       0x00000004[m
[31m-#define NGX_CONF_TAKE3       0x00000008[m
[31m-#define NGX_CONF_TAKE4       0x00000010[m
[31m-#define NGX_CONF_TAKE5       0x00000020[m
[31m-#define NGX_CONF_TAKE6       0x00000040[m
[31m-#define NGX_CONF_TAKE7       0x00000080[m
[31m-[m
[31m-#define NGX_CONF_MAX_ARGS    8[m
[31m-[m
[31m-#define NGX_CONF_TAKE12      (NGX_CONF_TAKE1|NGX_CONF_TAKE2)[m
[31m-#define NGX_CONF_TAKE13      (NGX_CONF_TAKE1|NGX_CONF_TAKE3)[m
[31m-[m
[31m-#define NGX_CONF_TAKE23      (NGX_CONF_TAKE2|NGX_CONF_TAKE3)[m
[31m-[m
[31m-#define NGX_CONF_TAKE123     (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3)[m
[31m-#define NGX_CONF_TAKE1234    (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3   \[m
[31m-                              |NGX_CONF_TAKE4)[m
[31m-[m
[31m-#define NGX_CONF_ARGS_NUMBER 0x000000ff[m
[31m-#define NGX_CONF_BLOCK       0x00000100[m
[31m-#define NGX_CONF_FLAG        0x00000200[m
[31m-#define NGX_CONF_ANY         0x00000400[m
[31m-#define NGX_CONF_1MORE       0x00000800[m
[31m-#define NGX_CONF_2MORE       0x00001000[m
[31m-#define NGX_CONF_MULTI       0x00000000  /* compatibility */[m
[31m-[m
[31m-#define NGX_DIRECT_CONF      0x00010000[m
[31m-[m
[31m-#define NGX_MAIN_CONF        0x01000000[m
[31m-#define NGX_ANY_CONF         0x1F000000[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define NGX_CONF_UNSET       -1[m
[31m-#define NGX_CONF_UNSET_UINT  (ngx_uint_t) -1[m
[31m-#define NGX_CONF_UNSET_PTR   (void *) -1[m
[31m-#define NGX_CONF_UNSET_SIZE  (size_t) -1[m
[31m-#define NGX_CONF_UNSET_MSEC  (ngx_msec_t) -1[m
[31m-[m
[31m-[m
[31m-#define NGX_CONF_OK          NULL[m
[31m-#define NGX_CONF_ERROR       (void *) -1[m
[31m-[m
[31m-#define NGX_CONF_BLOCK_START 1[m
[31m-#define NGX_CONF_BLOCK_DONE  2[m
[31m-#define NGX_CONF_FILE_DONE   3[m
[31m-[m
[31m-#define NGX_CORE_MODULE      0x45524F43  /* "CORE" */[m
[31m-#define NGX_CONF_MODULE      0x464E4F43  /* "CONF" */[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_CONF_ERRSTR  1024[m
[31m-[m
[31m-[m
[31m-struct ngx_command_s {[m
[31m-    ngx_str_t             name;[m
[31m-    ngx_uint_t            type;[m
[31m-    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-    ngx_uint_t            conf;[m
[31m-    ngx_uint_t            offset;[m
[31m-    void                 *post;[m
[31m-};[m
[31m-[m
[31m-#define ngx_null_command  { ngx_null_string, 0, NULL, 0, 0, NULL }[m
[31m-[m
[31m-[m
[31m-struct ngx_open_file_s {[m
[31m-    ngx_fd_t              fd;[m
[31m-    ngx_str_t             name;[m
[31m-[m
[31m-    void                (*flush)(ngx_open_file_t *file, ngx_log_t *log);[m
[31m-    void                 *data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_file_t            file;[m
[31m-    ngx_buf_t            *buffer;[m
[31m-    ngx_buf_t            *dump;[m
[31m-    ngx_uint_t            line;[m
[31m-} ngx_conf_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t             name;[m
[31m-    ngx_buf_t            *buffer;[m
[31m-} ngx_conf_dump_t;[m
[31m-[m
[31m-[m
[31m-typedef char *(*ngx_conf_handler_pt)(ngx_conf_t *cf,[m
[31m-    ngx_command_t *dummy, void *conf);[m
[31m-[m
[31m-[m
[31m-struct ngx_conf_s {[m
[31m-    char                 *name;[m
[31m-    ngx_array_t          *args;[m
[31m-[m
[31m-    ngx_cycle_t          *cycle;[m
[31m-    ngx_pool_t           *pool;[m
[31m-    ngx_pool_t           *temp_pool;[m
[31m-    ngx_conf_file_t      *conf_file;[m
[31m-    ngx_log_t            *log;[m
[31m-[m
[31m-    void                 *ctx;[m
[31m-    ngx_uint_t            module_type;[m
[31m-    ngx_uint_t            cmd_type;[m
[31m-[m
[31m-    ngx_conf_handler_pt   handler;[m
[31m-    char                 *handler_conf;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef char *(*ngx_conf_post_handler_pt) (ngx_conf_t *cf,[m
[31m-    void *data, void *conf);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_post_handler_pt  post_handler;[m
[31m-} ngx_conf_post_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_post_handler_pt  post_handler;[m
[31m-    char                     *old_name;[m
[31m-    char                     *new_name;[m
[31m-} ngx_conf_deprecated_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_post_handler_pt  post_handler;[m
[31m-    ngx_int_t                 low;[m
[31m-    ngx_int_t                 high;[m
[31m-} ngx_conf_num_bounds_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_uint_t                value;[m
[31m-} ngx_conf_enum_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_CONF_BITMASK_SET  1[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_uint_t                mask;[m
[31m-} ngx_conf_bitmask_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-char * ngx_conf_deprecated(ngx_conf_t *cf, void *post, void *data);[m
[31m-char *ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-[m
[31m-#define ngx_get_conf(conf_ctx, module)  conf_ctx[module.index][m
[31m-[m
[31m-[m
[31m-[m
[31m-#define ngx_conf_init_value(conf, default)                                   \[m
[31m-    if (conf == NGX_CONF_UNSET) {                                            \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_init_ptr_value(conf, default)                               \[m
[31m-    if (conf == NGX_CONF_UNSET_PTR) {                                        \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_init_uint_value(conf, default)                              \[m
[31m-    if (conf == NGX_CONF_UNSET_UINT) {                                       \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_init_size_value(conf, default)                              \[m
[31m-    if (conf == NGX_CONF_UNSET_SIZE) {                                       \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_init_msec_value(conf, default)                              \[m
[31m-    if (conf == NGX_CONF_UNSET_MSEC) {                                       \[m
[31m-        conf = default;                                                      \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_value(conf, prev, default)                            \[m
[31m-    if (conf == NGX_CONF_UNSET) {                                            \[m
[31m-        conf = (prev == NGX_CONF_UNSET) ? default : prev;                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_ptr_value(conf, prev, default)                        \[m
[31m-    if (conf == NGX_CONF_UNSET_PTR) {                                        \[m
[31m-        conf = (prev == NGX_CONF_UNSET_PTR) ? default : prev;                \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_uint_value(conf, prev, default)                       \[m
[31m-    if (conf == NGX_CONF_UNSET_UINT) {                                       \[m
[31m-        conf = (prev == NGX_CONF_UNSET_UINT) ? default : prev;               \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_msec_value(conf, prev, default)                       \[m
[31m-    if (conf == NGX_CONF_UNSET_MSEC) {                                       \[m
[31m-        conf = (prev == NGX_CONF_UNSET_MSEC) ? default : prev;               \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_sec_value(conf, prev, default)                        \[m
[31m-    if (conf == NGX_CONF_UNSET) {                                            \[m
[31m-        conf = (prev == NGX_CONF_UNSET) ? default : prev;                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_size_value(conf, prev, default)                       \[m
[31m-    if (conf == NGX_CONF_UNSET_SIZE) {                                       \[m
[31m-        conf = (prev == NGX_CONF_UNSET_SIZE) ? default : prev;               \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_off_value(conf, prev, default)                        \[m
[31m-    if (conf == NGX_CONF_UNSET) {                                            \[m
[31m-        conf = (prev == NGX_CONF_UNSET) ? default : prev;                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_str_value(conf, prev, default)                        \[m
[31m-    if (conf.data == NULL) {                                                 \[m
[31m-        if (prev.data) {                                                     \[m
[31m-            conf.len = prev.len;                                             \[m
[31m-            conf.data = prev.data;                                           \[m
[31m-        } else {                                                             \[m
[31m-            conf.len = sizeof(default) - 1;                                  \[m
[31m-            conf.data = (u_char *) default;                                  \[m
[31m-        }                                                                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_bufs_value(conf, prev, default_num, default_size)     \[m
[31m-    if (conf.num == 0) {                                                     \[m
[31m-        if (prev.num) {                                                      \[m
[31m-            conf.num = prev.num;                                             \[m
[31m-            conf.size = prev.size;                                           \[m
[31m-        } else {                                                             \[m
[31m-            conf.num = default_num;                                          \[m
[31m-            conf.size = default_size;                                        \[m
[31m-        }                                                                    \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_conf_merge_bitmask_value(conf, prev, default)                    \[m
[31m-    if (conf == 0) {                                                         \[m
[31m-        conf = (prev == 0) ? default : prev;                                 \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-char *ngx_conf_param(ngx_conf_t *cf);[m
[31m-char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename);[m
[31m-char *ngx_conf_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name,[m
[31m-    ngx_uint_t conf_prefix);[m
[31m-ngx_open_file_t *ngx_conf_open_file(ngx_cycle_t *cycle, ngx_str_t *name);[m
[31m-void ngx_cdecl ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf,[m
[31m-    ngx_err_t err, const char *fmt, ...);[m
[31m-[m
[31m-[m
[31m-char *ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_str_array_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_conf_set_keyval_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_num_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_off_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_sec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_enum_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_set_bitmask_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CONF_FILE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_config.h[m
[1mdeleted file mode 100644[m
[1mindex a0bfa63..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,132 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_headers.h>[m
[31m-[m
[31m-[m
[31m-#if defined __DragonFly__ && !defined __FreeBSD__[m
[31m-#define __FreeBSD__        4[m
[31m-#define __FreeBSD_version  480101[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_FREEBSD)[m
[31m-#include <ngx_freebsd_config.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_LINUX)[m
[31m-#include <ngx_linux_config.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_SOLARIS)[m
[31m-#include <ngx_solaris_config.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_DARWIN)[m
[31m-#include <ngx_darwin_config.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_WIN32)[m
[31m-#include <ngx_win32_config.h>[m
[31m-[m
[31m-[m
[31m-#else /* POSIX */[m
[31m-#include <ngx_posix_config.h>[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SO_SNDLOWAT[m
[31m-#define NGX_HAVE_SO_SNDLOWAT     1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-#define ngx_signal_helper(n)     SIG##n[m
[31m-#define ngx_signal_value(n)      ngx_signal_helper(n)[m
[31m-[m
[31m-#define ngx_random               random[m
[31m-[m
[31m-/* TODO: #ifndef */[m
[31m-#define NGX_SHUTDOWN_SIGNAL      QUIT[m
[31m-#define NGX_TERMINATE_SIGNAL     TERM[m
[31m-#define NGX_NOACCEPT_SIGNAL      WINCH[m
[31m-#define NGX_RECONFIGURE_SIGNAL   HUP[m
[31m-[m
[31m-#if (NGX_LINUXTHREADS)[m
[31m-#define NGX_REOPEN_SIGNAL        INFO[m
[31m-#define NGX_CHANGEBIN_SIGNAL     XCPU[m
[31m-#else[m
[31m-#define NGX_REOPEN_SIGNAL        USR1[m
[31m-#define NGX_CHANGEBIN_SIGNAL     USR2[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_cdecl[m
[31m-#define ngx_libc_cdecl[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef intptr_t        ngx_int_t;[m
[31m-typedef uintptr_t       ngx_uint_t;[m
[31m-typedef intptr_t        ngx_flag_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_INT32_LEN   (sizeof("-2147483648") - 1)[m
[31m-#define NGX_INT64_LEN   (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-#define NGX_INT_T_LEN   NGX_INT32_LEN[m
[31m-#define NGX_MAX_INT_T_VALUE  2147483647[m
[31m-[m
[31m-#else[m
[31m-#define NGX_INT_T_LEN   NGX_INT64_LEN[m
[31m-#define NGX_MAX_INT_T_VALUE  9223372036854775807[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_ALIGNMENT[m
[31m-#define NGX_ALIGNMENT   sizeof(unsigned long)    /* platform word */[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_align(d, a)     (((d) + (a - 1)) & ~(a - 1))[m
[31m-#define ngx_align_ptr(p, a)                                                   \[m
[31m-    (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))[m
[31m-[m
[31m-[m
[31m-#define ngx_abort       abort[m
[31m-[m
[31m-[m
[31m-/* TODO: platform specific: array[NGX_INVALID_ARRAY_INDEX] must cause SIGSEGV */[m
[31m-#define NGX_INVALID_ARRAY_INDEX 0x80000000[m
[31m-[m
[31m-[m
[31m-/* TODO: auto_conf: ngx_inline   inline __inline __inline__ */[m
[31m-#ifndef ngx_inline[m
[31m-#define ngx_inline      inline[m
[31m-#endif[m
[31m-[m
[31m-#ifndef INADDR_NONE  /* Solaris */[m
[31m-#define INADDR_NONE  ((unsigned int) -1)[m
[31m-#endif[m
[31m-[m
[31m-#ifdef MAXHOSTNAMELEN[m
[31m-#define NGX_MAXHOSTNAMELEN  MAXHOSTNAMELEN[m
[31m-#else[m
[31m-#define NGX_MAXHOSTNAMELEN  256[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_UINT32_VALUE  (uint32_t) 0xffffffff[m
[31m-#define NGX_MAX_INT32_VALUE   (uint32_t) 0x7fffffff[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_connection.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_connection.c[m
[1mdeleted file mode 100644[m
[1mindex 5a53bac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_connection.c[m
[1m+++ /dev/null[m
[36m@@ -1,1402 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ngx_os_io_t  ngx_io;[m
[31m-[m
[31m-[m
[31m-static void ngx_drain_connections(void);[m
[31m-[m
[31m-[m
[31m-ngx_listening_t *[m
[31m-ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)[m
[31m-{[m
[31m-    size_t            len;[m
[31m-    ngx_listening_t  *ls;[m
[31m-    struct sockaddr  *sa;[m
[31m-    u_char            text[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    ls = ngx_array_push(&cf->cycle->listening);[m
[31m-    if (ls == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(ls, sizeof(ngx_listening_t));[m
[31m-[m
[31m-    sa = ngx_palloc(cf->pool, socklen);[m
[31m-    if (sa == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(sa, sockaddr, socklen);[m
[31m-[m
[31m-    ls->sockaddr = sa;[m
[31m-    ls->socklen = socklen;[m
[31m-[m
[31m-    len = ngx_sock_ntop(sa, socklen, text, NGX_SOCKADDR_STRLEN, 1);[m
[31m-    ls->addr_text.len = len;[m
[31m-[m
[31m-    switch (ls->sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;[m
[31m-        break;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        ls->addr_text_max_len = NGX_UNIX_ADDRSTRLEN;[m
[31m-        len++;[m
[31m-        break;[m
[31m-#endif[m
[31m-    case AF_INET:[m
[31m-        ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;[m
[31m-        break;[m
[31m-    default:[m
[31m-        ls->addr_text_max_len = NGX_SOCKADDR_STRLEN;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ls->addr_text.data = ngx_pnalloc(cf->pool, len);[m
[31m-    if (ls->addr_text.data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(ls->addr_text.data, text, len);[m
[31m-[m
[31m-    ls->fd = (ngx_socket_t) -1;[m
[31m-    ls->type = SOCK_STREAM;[m
[31m-[m
[31m-    ls->backlog = NGX_LISTEN_BACKLOG;[m
[31m-    ls->rcvbuf = -1;[m
[31m-    ls->sndbuf = -1;[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    ls->setfib = -1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    ls->fastopen = -1;[m
[31m-#endif[m
[31m-[m
[31m-    return ls;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls)[m
[31m-{[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-    ngx_listening_t   ols;[m
[31m-[m
[31m-    if (!ls->reuseport) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ols = *ls;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    for (n = 1; n < ccf->worker_processes; n++) {[m
[31m-[m
[31m-        /* create a socket for each worker process */[m
[31m-[m
[31m-        ls = ngx_array_push(&cf->cycle->listening);[m
[31m-        if (ls == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *ls = ols;[m
[31m-        ls->worker = n;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_set_inherited_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    size_t                     len;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_listening_t           *ls;[m
[31m-    socklen_t                  olen;[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT || NGX_HAVE_TCP_FASTOPEN)[m
[31m-    ngx_err_t                  err;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-    struct accept_filter_arg   af;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-    int                        timeout;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    int                        reuseport;[m
[31m-#endif[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        ls[i].sockaddr = ngx_palloc(cycle->pool, NGX_SOCKADDRLEN);[m
[31m-        if (ls[i].sockaddr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].socklen = NGX_SOCKADDRLEN;[m
[31m-        if (getsockname(ls[i].fd, ls[i].sockaddr, &ls[i].socklen) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockname() of the inherited "[m
[31m-                          "socket #%d failed", ls[i].fd);[m
[31m-            ls[i].ignore = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (ls[i].sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            ls[i].addr_text_max_len = NGX_INET6_ADDRSTRLEN;[m
[31m-            len = NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            ls[i].addr_text_max_len = NGX_UNIX_ADDRSTRLEN;[m
[31m-            len = NGX_UNIX_ADDRSTRLEN;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        case AF_INET:[m
[31m-            ls[i].addr_text_max_len = NGX_INET_ADDRSTRLEN;[m
[31m-            len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,[m
[31m-                          "the inherited socket #%d has "[m
[31m-                          "an unsupported protocol family", ls[i].fd);[m
[31m-            ls[i].ignore = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].addr_text.data = ngx_pnalloc(cycle->pool, len);[m
[31m-        if (ls[i].addr_text.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_sock_ntop(ls[i].sockaddr, ls[i].socklen,[m
[31m-                            ls[i].addr_text.data, len, 1);[m
[31m-        if (len == 0) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].addr_text.len = len;[m
[31m-[m
[31m-        ls[i].backlog = NGX_LISTEN_BACKLOG;[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_TYPE, (void *) &ls[i].type,[m
[31m-                       &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_TYPE) %V failed", &ls[i].addr_text);[m
[31m-            ls[i].ignore = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF, (void *) &ls[i].rcvbuf,[m
[31m-                       &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_RCVBUF) %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-[m
[31m-            ls[i].rcvbuf = -1;[m
[31m-        }[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_SNDBUF, (void *) &ls[i].sndbuf,[m
[31m-                       &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_SNDBUF) %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-[m
[31m-            ls[i].sndbuf = -1;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        /* SO_SETFIB is currently a set only option */[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB,[m
[31m-                       (void *) &ls[i].setfib, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_SETFIB) %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-[m
[31m-            ls[i].setfib = -1;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-        reuseport = 0;[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT,[m
[31m-                       (void *) &reuseport, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                          "getsockopt(SO_REUSEPORT) %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-[m
[31m-        } else {[m
[31m-            ls[i].reuseport = reuseport ? 1 : 0;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (ls[i].type != SOCK_STREAM) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, IPPROTO_TCP, TCP_FASTOPEN,[m
[31m-                       (void *) &ls[i].fastopen, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err != NGX_EOPNOTSUPP && err != NGX_ENOPROTOOPT) {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, cycle->log, err,[m
[31m-                              "getsockopt(TCP_FASTOPEN) %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-[m
[31m-            ls[i].fastopen = -1;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-[m
[31m-        ngx_memzero(&af, sizeof(struct accept_filter_arg));[m
[31m-        olen = sizeof(struct accept_filter_arg);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, &af, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err == NGX_EINVAL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, err,[m
[31m-                          "getsockopt(SO_ACCEPTFILTER) for %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (olen < sizeof(struct accept_filter_arg) || af.af_name[0] == '\0') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].accept_filter = ngx_palloc(cycle->pool, 16);[m
[31m-        if (ls[i].accept_filter == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_cpystrn((u_char *) ls[i].accept_filter,[m
[31m-                           (u_char *) af.af_name, 16);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-[m
[31m-        timeout = 0;[m
[31m-        olen = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &timeout, &olen)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err == NGX_EOPNOTSUPP) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, err,[m
[31m-                          "getsockopt(TCP_DEFER_ACCEPT) for %V failed, ignored",[m
[31m-                          &ls[i].addr_text);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (olen < sizeof(int) || timeout == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ls[i].deferred_accept = 1;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_listening_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int               reuseaddr;[m
[31m-    ngx_uint_t        i, tries, failed;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_log_t        *log;[m
[31m-    ngx_socket_t      s;[m
[31m-    ngx_listening_t  *ls;[m
[31m-[m
[31m-    reuseaddr = 1;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    failed = 0;[m
[31m-#endif[m
[31m-[m
[31m-    log = cycle->log;[m
[31m-[m
[31m-    /* TODO: configurable try number */[m
[31m-[m
[31m-    for (tries = 5; tries; tries--) {[m
[31m-        failed = 0;[m
[31m-[m
[31m-        /* for each listening socket */[m
[31m-[m
[31m-        ls = cycle->listening.elts;[m
[31m-        for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-            if (ls[i].ignore) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-            if (ls[i].add_reuseport) {[m
[31m-[m
[31m-                /*[m
[31m-                 * to allow transition from a socket without SO_REUSEPORT[m
[31m-                 * to multiple sockets with SO_REUSEPORT, we have to set[m
[31m-                 * SO_REUSEPORT on the old socket before opening new ones[m
[31m-                 */[m
[31m-[m
[31m-                int  reuseport = 1;[m
[31m-[m
[31m-                if (setsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT,[m
[31m-                               (const void *) &reuseport, sizeof(int))[m
[31m-                    == -1)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                                  "setsockopt(SO_REUSEPORT) %V failed, ignored",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                ls[i].add_reuseport = 0;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (ls[i].fd != (ngx_socket_t) -1) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ls[i].inherited) {[m
[31m-[m
[31m-                /* TODO: close on exit */[m
[31m-                /* TODO: nonblocking */[m
[31m-                /* TODO: deferred accept */[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_socket(ls[i].sockaddr->sa_family, ls[i].type, 0);[m
[31m-[m
[31m-            if (s == (ngx_socket_t) -1) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                              ngx_socket_n " %V failed", &ls[i].addr_text);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,[m
[31m-                           (const void *) &reuseaddr, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_REUSEADDR) %V failed",[m
[31m-                              &ls[i].addr_text);[m
[31m-[m
[31m-                if (ngx_close_socket(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-            if (ls[i].reuseport) {[m
[31m-                int  reuseport;[m
[31m-[m
[31m-                reuseport = 1;[m
[31m-[m
[31m-                if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT,[m
[31m-                               (const void *) &reuseport, sizeof(int))[m
[31m-                    == -1)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  "setsockopt(SO_REUSEPORT) %V failed, ignored",[m
[31m-                                  &ls[i].addr_text);[m
[31m-[m
[31m-                    if (ngx_close_socket(s) == -1) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                      ngx_close_socket_n " %V failed",[m
[31m-                                      &ls[i].addr_text);[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-[m
[31m-            if (ls[i].sockaddr->sa_family == AF_INET6) {[m
[31m-                int  ipv6only;[m
[31m-[m
[31m-                ipv6only = ls[i].ipv6only;[m
[31m-[m
[31m-                if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,[m
[31m-                               (const void *) &ipv6only, sizeof(int))[m
[31m-                    == -1)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  "setsockopt(IPV6_V6ONLY) %V failed, ignored",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-            /* TODO: close on exit */[m
[31m-[m
[31m-            if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {[m
[31m-                if (ngx_nonblocking(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  ngx_nonblocking_n " %V failed",[m
[31m-                                  &ls[i].addr_text);[m
[31m-[m
[31m-                    if (ngx_close_socket(s) == -1) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                      ngx_close_socket_n " %V failed",[m
[31m-                                      &ls[i].addr_text);[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                           "bind() %V #%d ", &ls[i].addr_text, s);[m
[31m-[m
[31m-            if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) {[m
[31m-                err = ngx_socket_errno;[m
[31m-[m
[31m-                if (err != NGX_EADDRINUSE || !ngx_test_config) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                                  "bind() to %V failed", &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_close_socket(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                if (err != NGX_EADDRINUSE) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (!ngx_test_config) {[m
[31m-                    failed = 1;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-            if (ls[i].sockaddr->sa_family == AF_UNIX) {[m
[31m-                mode_t   mode;[m
[31m-                u_char  *name;[m
[31m-[m
[31m-                name = ls[i].addr_text.data + sizeof("unix:") - 1;[m
[31m-                mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);[m
[31m-[m
[31m-                if (chmod((char *) name, mode) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                  "chmod() \"%s\" failed", name);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_test_config) {[m
[31m-                    if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                      ngx_delete_file_n " %s failed", name);[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (ls[i].type != SOCK_STREAM) {[m
[31m-                ls[i].fd = s;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (listen(s, ls[i].backlog) == -1) {[m
[31m-                err = ngx_socket_errno;[m
[31m-[m
[31m-                /*[m
[31m-                 * on OpenVZ after suspend/resume EADDRINUSE[m
[31m-                 * may be returned by listen() instead of bind(), see[m
[31m-                 * https://bugzilla.openvz.org/show_bug.cgi?id=2470[m
[31m-                 */[m
[31m-[m
[31m-                if (err != NGX_EADDRINUSE || !ngx_test_config) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                                  "listen() to %V, backlog %d failed",[m
[31m-                                  &ls[i].addr_text, ls[i].backlog);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_close_socket(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                if (err != NGX_EADDRINUSE) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (!ngx_test_config) {[m
[31m-                    failed = 1;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls[i].listen = 1;[m
[31m-[m
[31m-            ls[i].fd = s;[m
[31m-        }[m
[31m-[m
[31m-        if (!failed) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* TODO: delay configurable */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                      "try again to bind() after 500ms");[m
[31m-[m
[31m-        ngx_msleep(500);[m
[31m-    }[m
[31m-[m
[31m-    if (failed) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, 0, "still could not bind()");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_configure_listening_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int                        value;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_listening_t           *ls;[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-    struct accept_filter_arg   af;[m
[31m-#endif[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        ls[i].log = *ls[i].logp;[m
[31m-[m
[31m-        if (ls[i].rcvbuf != -1) {[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF,[m
[31m-                           (const void *) &ls[i].rcvbuf, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_RCVBUF, %d) %V failed, ignored",[m
[31m-                              ls[i].rcvbuf, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].sndbuf != -1) {[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SNDBUF,[m
[31m-                           (const void *) &ls[i].sndbuf, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_SNDBUF, %d) %V failed, ignored",[m
[31m-                              ls[i].sndbuf, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].keepalive) {[m
[31m-            value = (ls[i].keepalive == 1) ? 1 : 0;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_KEEPALIVE,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_KEEPALIVE, %d) %V failed, ignored",[m
[31m-                              value, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-[m
[31m-        if (ls[i].keepidle) {[m
[31m-            value = ls[i].keepidle;[m
[31m-[m
[31m-#if (NGX_KEEPALIVE_FACTOR)[m
[31m-            value *= NGX_KEEPALIVE_FACTOR;[m
[31m-#endif[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPIDLE,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_KEEPIDLE, %d) %V failed, ignored",[m
[31m-                              value, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].keepintvl) {[m
[31m-            value = ls[i].keepintvl;[m
[31m-[m
[31m-#if (NGX_KEEPALIVE_FACTOR)[m
[31m-            value *= NGX_KEEPALIVE_FACTOR;[m
[31m-#endif[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPINTVL,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                             "setsockopt(TCP_KEEPINTVL, %d) %V failed, ignored",[m
[31m-                             value, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].keepcnt) {[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPCNT,[m
[31m-                           (const void *) &ls[i].keepcnt, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_KEEPCNT, %d) %V failed, ignored",[m
[31m-                              ls[i].keepcnt, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        if (ls[i].setfib != -1) {[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB,[m
[31m-                           (const void *) &ls[i].setfib, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_SETFIB, %d) %V failed, ignored",[m
[31m-                              ls[i].setfib, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        if (ls[i].fastopen != -1) {[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_FASTOPEN,[m
[31m-                           (const void *) &ls[i].fastopen, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_FASTOPEN, %d) %V failed, ignored",[m
[31m-                              ls[i].fastopen, &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if 0[m
[31m-        if (1) {[m
[31m-            int tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_NODELAY) %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ls[i].listen) {[m
[31m-[m
[31m-            /* change backlog via listen() */[m
[31m-[m
[31m-            if (listen(ls[i].fd, ls[i].backlog) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "listen() to %V, backlog %d failed, ignored",[m
[31m-                              &ls[i].addr_text, ls[i].backlog);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * setting deferred mode should be last operation on socket,[m
[31m-         * because code may prematurely continue cycle on failure[m
[31m-         */[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT)[m
[31m-[m
[31m-#ifdef SO_ACCEPTFILTER[m
[31m-[m
[31m-        if (ls[i].delete_deferred) {[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_ACCEPTFILTER, NULL) "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-[m
[31m-                if (ls[i].accept_filter) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                                  "could not change the accept filter "[m
[31m-                                  "to \"%s\" for %V, ignored",[m
[31m-                                  ls[i].accept_filter, &ls[i].addr_text);[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls[i].deferred_accept = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].add_deferred) {[m
[31m-            ngx_memzero(&af, sizeof(struct accept_filter_arg));[m
[31m-            (void) ngx_cpystrn((u_char *) af.af_name,[m
[31m-                               (u_char *) ls[i].accept_filter, 16);[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER,[m
[31m-                           &af, sizeof(struct accept_filter_arg))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_ACCEPTFILTER, \"%s\") "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              ls[i].accept_filter, &ls[i].addr_text);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls[i].deferred_accept = 1;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#ifdef TCP_DEFER_ACCEPT[m
[31m-[m
[31m-        if (ls[i].add_deferred || ls[i].delete_deferred) {[m
[31m-[m
[31m-            if (ls[i].add_deferred) {[m
[31m-                /*[m
[31m-                 * There is no way to find out how long a connection was[m
[31m-                 * in queue (and a connection may bypass deferred queue at all[m
[31m-                 * if syncookies were used), hence we use 1 second timeout[m
[31m-                 * here.[m
[31m-                 */[m
[31m-                value = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                value = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT,[m
[31m-                           &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(TCP_DEFER_ACCEPT, %d) for %V failed, "[m
[31m-                              "ignored",[m
[31m-                              value, &ls[i].addr_text);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ls[i].add_deferred) {[m
[31m-            ls[i].deferred_accept = 1;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_HAVE_DEFERRED_ACCEPT */[m
[31m-[m
[31m-#if (NGX_HAVE_IP_RECVDSTADDR)[m
[31m-[m
[31m-        if (ls[i].wildcard[m
[31m-            && ls[i].type == SOCK_DGRAM[m
[31m-            && ls[i].sockaddr->sa_family == AF_INET)[m
[31m-        {[m
[31m-            value = 1;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_IP, IP_RECVDSTADDR,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(IP_RECVDSTADDR) "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#elif (NGX_HAVE_IP_PKTINFO)[m
[31m-[m
[31m-        if (ls[i].wildcard[m
[31m-            && ls[i].type == SOCK_DGRAM[m
[31m-            && ls[i].sockaddr->sa_family == AF_INET)[m
[31m-        {[m
[31m-            value = 1;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_IP, IP_PKTINFO,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(IP_PKTINFO) "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)[m
[31m-[m
[31m-        if (ls[i].wildcard[m
[31m-            && ls[i].type == SOCK_DGRAM[m
[31m-            && ls[i].sockaddr->sa_family == AF_INET6)[m
[31m-        {[m
[31m-            value = 1;[m
[31m-[m
[31m-            if (setsockopt(ls[i].fd, IPPROTO_IPV6, IPV6_RECVPKTINFO,[m
[31m-                           (const void *) &value, sizeof(int))[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,[m
[31m-                              "setsockopt(IPV6_RECVPKTINFO) "[m
[31m-                              "for %V failed, ignored",[m
[31m-                              &ls[i].addr_text);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_listening_sockets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_accept_mutex_held = 0;[m
[31m-    ngx_use_accept_mutex = 0;[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        c = ls[i].connection;[m
[31m-[m
[31m-        if (c) {[m
[31m-            if (c->read->active) {[m
[31m-                if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {[m
[31m-[m
[31m-                    /*[m
[31m-                     * it seems that Linux-2.6.x OpenVZ sends events[m
[31m-                     * for closed shared listening sockets unless[m
[31m-                     * the events was explicitly deleted[m
[31m-                     */[m
[31m-[m
[31m-                    ngx_del_event(c->read, NGX_READ_EVENT, 0);[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_free_connection(c);[m
[31m-[m
[31m-            c->fd = (ngx_socket_t) -1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "close listening %V #%d ", &ls[i].addr_text, ls[i].fd);[m
[31m-[m
[31m-        if (ngx_close_socket(ls[i].fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " %V failed", &ls[i].addr_text);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-        if (ls[i].sockaddr->sa_family == AF_UNIX[m
[31m-            && ngx_process <= NGX_PROCESS_MASTER[m
[31m-            && ngx_new_binary == 0)[m
[31m-        {[m
[31m-            u_char *name = ls[i].addr_text.data + sizeof("unix:") - 1;[m
[31m-[m
[31m-            if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                              ngx_delete_file_n " %s failed", name);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ls[i].fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    cycle->listening.nelts = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_connection_t *[m
[31m-ngx_get_connection(ngx_socket_t s, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t         instance;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    /* disable warning: Win32 SOCKET is u_int while UNIX socket is int */[m
[31m-[m
[31m-    if (ngx_cycle->files && (ngx_uint_t) s >= ngx_cycle->files_n) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "the new socket has number %d, "[m
[31m-                      "but only %ui files are available",[m
[31m-                      s, ngx_cycle->files_n);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_cycle->free_connections;[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        ngx_drain_connections();[m
[31m-        c = ngx_cycle->free_connections;[m
[31m-    }[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "%ui worker_connections are not enough",[m
[31m-                      ngx_cycle->connection_n);[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cycle->free_connections = c->data;[m
[31m-    ngx_cycle->free_connection_n--;[m
[31m-[m
[31m-    if (ngx_cycle->files && ngx_cycle->files[s] == NULL) {[m
[31m-        ngx_cycle->files[s] = c;[m
[31m-    }[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_memzero(c, sizeof(ngx_connection_t));[m
[31m-[m
[31m-    c->read = rev;[m
[31m-    c->write = wev;[m
[31m-    c->fd = s;[m
[31m-    c->log = log;[m
[31m-[m
[31m-    instance = rev->instance;[m
[31m-[m
[31m-    ngx_memzero(rev, sizeof(ngx_event_t));[m
[31m-    ngx_memzero(wev, sizeof(ngx_event_t));[m
[31m-[m
[31m-    rev->instance = !instance;[m
[31m-    wev->instance = !instance;[m
[31m-[m
[31m-    rev->index = NGX_INVALID_INDEX;[m
[31m-    wev->index = NGX_INVALID_INDEX;[m
[31m-[m
[31m-    rev->data = c;[m
[31m-    wev->data = c;[m
[31m-[m
[31m-    wev->write = 1;[m
[31m-[m
[31m-    return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_free_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    c->data = ngx_cycle->free_connections;[m
[31m-    ngx_cycle->free_connections = c;[m
[31m-    ngx_cycle->free_connection_n++;[m
[31m-[m
[31m-    if (ngx_cycle->files && ngx_cycle->files[c->fd] == c) {[m
[31m-        ngx_cycle->files[c->fd] = NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_uint_t    log_error, level;[m
[31m-    ngx_socket_t  fd;[m
[31m-[m
[31m-    if (c->fd == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "connection already closed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (!c->shared) {[m
[31m-        if (ngx_del_conn) {[m
[31m-            ngx_del_conn(c, NGX_CLOSE_EVENT);[m
[31m-[m
[31m-        } else {[m
[31m-            if (c->read->active || c->read->disabled) {[m
[31m-                ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-[m
[31m-            if (c->write->active || c->write->disabled) {[m
[31m-                ngx_del_event(c->write, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->posted) {[m
[31m-        ngx_delete_posted_event(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->posted) {[m
[31m-        ngx_delete_posted_event(c->write);[m
[31m-    }[m
[31m-[m
[31m-    c->read->closed = 1;[m
[31m-    c->write->closed = 1;[m
[31m-[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    log_error = c->log_error;[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    fd = c->fd;[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (c->shared) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_socket(fd) == -1) {[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_ECONNRESET || err == NGX_ENOTCONN) {[m
[31m-[m
[31m-            switch (log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                level = NGX_LOG_CRIT;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-        }[m
[31m-[m
[31m-        /* we use ngx_cycle->log because c->log was in c->pool */[m
[31m-[m
[31m-        ngx_log_error(level, ngx_cycle->log, err,[m
[31m-                      ngx_close_socket_n " %d failed", fd);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "reusable connection: %ui", reusable);[m
[31m-[m
[31m-    if (c->reusable) {[m
[31m-        ngx_queue_remove(&c->queue);[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_waiting, -1);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    c->reusable = reusable;[m
[31m-[m
[31m-    if (reusable) {[m
[31m-        /* need cast as ngx_cycle is volatile */[m
[31m-[m
[31m-        ngx_queue_insert_head([m
[31m-            (ngx_queue_t *) &ngx_cycle->reusable_connections_queue, &c->queue);[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_waiting, 1);[m
[31m-#endif[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_drain_connections(void)[m
[31m-{[m
[31m-    ngx_int_t          i;[m
[31m-    ngx_queue_t       *q;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    for (i = 0; i < 32; i++) {[m
[31m-        if (ngx_queue_empty(&ngx_cycle->reusable_connections_queue)) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&ngx_cycle->reusable_connections_queue);[m
[31m-        c = ngx_queue_data(q, ngx_connection_t, queue);[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                       "reusing connection");[m
[31m-[m
[31m-        c->close = 1;[m
[31m-        c->read->handler(c->read);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_idle_connections(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = cycle->connections;[m
[31m-[m
[31m-    for (i = 0; i < cycle->connection_n; i++) {[m
[31m-[m
[31m-        /* THREAD: lock */[m
[31m-[m
[31m-        if (c[i].fd != (ngx_socket_t) -1 && c[i].idle) {[m
[31m-            c[i].close = 1;[m
[31m-            c[i].read->handler(c[i].read);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,[m
[31m-    ngx_uint_t port)[m
[31m-{[m
[31m-    socklen_t             len;[m
[31m-    ngx_uint_t            addr;[m
[31m-    u_char                sa[NGX_SOCKADDRLEN];[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t            i;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    addr = 0;[m
[31m-[m
[31m-    if (c->local_socklen) {[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-[m
[31m-            for (i = 0; addr == 0 && i < 16; i++) {[m
[31m-                addr |= sin6->sin6_addr.s6_addr[i];[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            addr = 1;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-            addr = sin->sin_addr.s_addr;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (addr == 0) {[m
[31m-[m
[31m-        len = NGX_SOCKADDRLEN;[m
[31m-[m
[31m-        if (getsockname(c->fd, (struct sockaddr *) &sa, &len) == -1) {[m
[31m-            ngx_connection_error(c, ngx_socket_errno, "getsockname() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->local_sockaddr = ngx_palloc(c->pool, len);[m
[31m-        if (c->local_sockaddr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(c->local_sockaddr, &sa, len);[m
[31m-[m
[31m-        c->local_socklen = len;[m
[31m-    }[m
[31m-[m
[31m-    if (s == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    s->len = ngx_sock_ntop(c->local_sockaddr, c->local_socklen,[m
[31m-                           s->data, s->len, port);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text)[m
[31m-{[m
[31m-    ngx_uint_t  level;[m
[31m-[m
[31m-    /* Winsock may return NGX_ECONNABORTED instead of NGX_ECONNRESET */[m
[31m-[m
[31m-    if ((err == NGX_ECONNRESET[m
[31m-#if (NGX_WIN32)[m
[31m-         || err == NGX_ECONNABORTED[m
[31m-#endif[m
[31m-        ) && c->log_error == NGX_ERROR_IGNORE_ECONNRESET)[m
[31m-    {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-    if (err == NGX_EINVAL && c->log_error == NGX_ERROR_IGNORE_EINVAL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (err == 0[m
[31m-        || err == NGX_ECONNRESET[m
[31m-#if (NGX_WIN32)[m
[31m-        || err == NGX_ECONNABORTED[m
[31m-#else[m
[31m-        || err == NGX_EPIPE[m
[31m-#endif[m
[31m-        || err == NGX_ENOTCONN[m
[31m-        || err == NGX_ETIMEDOUT[m
[31m-        || err == NGX_ECONNREFUSED[m
[31m-        || err == NGX_ENETDOWN[m
[31m-        || err == NGX_ENETUNREACH[m
[31m-        || err == NGX_EHOSTDOWN[m
[31m-        || err == NGX_EHOSTUNREACH)[m
[31m-    {[m
[31m-        switch (c->log_error) {[m
[31m-[m
[31m-        case NGX_ERROR_IGNORE_EINVAL:[m
[31m-        case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-        case NGX_ERROR_INFO:[m
[31m-            level = NGX_LOG_INFO;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            level = NGX_LOG_ERR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        level = NGX_LOG_ALERT;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, c->log, err, text);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_connection.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_connection.h[m
[1mdeleted file mode 100644[m
[1mindex b0d162a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_connection.h[m
[1m+++ /dev/null[m
[36m@@ -1,232 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CONNECTION_H_INCLUDED_[m
[31m-#define _NGX_CONNECTION_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_listening_s  ngx_listening_t;[m
[31m-[m
[31m-struct ngx_listening_s {[m
[31m-    ngx_socket_t        fd;[m
[31m-[m
[31m-    struct sockaddr    *sockaddr;[m
[31m-    socklen_t           socklen;    /* size of sockaddr */[m
[31m-    size_t              addr_text_max_len;[m
[31m-    ngx_str_t           addr_text;[m
[31m-[m
[31m-    int                 type;[m
[31m-[m
[31m-    int                 backlog;[m
[31m-    int                 rcvbuf;[m
[31m-    int                 sndbuf;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    int                 keepidle;[m
[31m-    int                 keepintvl;[m
[31m-    int                 keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-    /* handler of accepted connection */[m
[31m-    ngx_connection_handler_pt   handler;[m
[31m-[m
[31m-    void               *servers;  /* array of ngx_http_in_addr_t, for example */[m
[31m-[m
[31m-    ngx_log_t           log;[m
[31m-    ngx_log_t          *logp;[m
[31m-[m
[31m-    size_t              pool_size;[m
[31m-    /* should be here because of the AcceptEx() preread */[m
[31m-    size_t              post_accept_buffer_size;[m
[31m-    /* should be here because of the deferred accept */[m
[31m-    ngx_msec_t          post_accept_timeout;[m
[31m-[m
[31m-    ngx_listening_t    *previous;[m
[31m-    ngx_connection_t   *connection;[m
[31m-[m
[31m-    ngx_uint_t          worker;[m
[31m-[m
[31m-    unsigned            open:1;[m
[31m-    unsigned            remain:1;[m
[31m-    unsigned            ignore:1;[m
[31m-[m
[31m-    unsigned            bound:1;       /* already bound */[m
[31m-    unsigned            inherited:1;   /* inherited from previous process */[m
[31m-    unsigned            nonblocking_accept:1;[m
[31m-    unsigned            listen:1;[m
[31m-    unsigned            nonblocking:1;[m
[31m-    unsigned            shared:1;    /* shared between threads or processes */[m
[31m-    unsigned            addr_ntop:1;[m
[31m-    unsigned            wildcard:1;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    unsigned            ipv6only:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    unsigned            reuseport:1;[m
[31m-    unsigned            add_reuseport:1;[m
[31m-#endif[m
[31m-    unsigned            keepalive:2;[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT)[m
[31m-    unsigned            deferred_accept:1;[m
[31m-    unsigned            delete_deferred:1;[m
[31m-    unsigned            add_deferred:1;[m
[31m-#ifdef SO_ACCEPTFILTER[m
[31m-    char               *accept_filter;[m
[31m-#endif[m
[31m-#endif[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    int                 setfib;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    int                 fastopen;[m
[31m-#endif[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_ERROR_ALERT = 0,[m
[31m-    NGX_ERROR_ERR,[m
[31m-    NGX_ERROR_INFO,[m
[31m-    NGX_ERROR_IGNORE_ECONNRESET,[m
[31m-    NGX_ERROR_IGNORE_EINVAL[m
[31m-} ngx_connection_log_error_e;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_TCP_NODELAY_UNSET = 0,[m
[31m-    NGX_TCP_NODELAY_SET,[m
[31m-    NGX_TCP_NODELAY_DISABLED[m
[31m-} ngx_connection_tcp_nodelay_e;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_TCP_NOPUSH_UNSET = 0,[m
[31m-    NGX_TCP_NOPUSH_SET,[m
[31m-    NGX_TCP_NOPUSH_DISABLED[m
[31m-} ngx_connection_tcp_nopush_e;[m
[31m-[m
[31m-[m
[31m-#define NGX_LOWLEVEL_BUFFERED  0x0f[m
[31m-#define NGX_SSL_BUFFERED       0x01[m
[31m-#define NGX_HTTP_V2_BUFFERED   0x02[m
[31m-[m
[31m-[m
[31m-struct ngx_connection_s {[m
[31m-    void               *data;[m
[31m-    ngx_event_t        *read;[m
[31m-    ngx_event_t        *write;[m
[31m-[m
[31m-    ngx_socket_t        fd;[m
[31m-[m
[31m-    ngx_recv_pt         recv;[m
[31m-    ngx_send_pt         send;[m
[31m-    ngx_recv_chain_pt   recv_chain;[m
[31m-    ngx_send_chain_pt   send_chain;[m
[31m-[m
[31m-    ngx_listening_t    *listening;[m
[31m-[m
[31m-    off_t               sent;[m
[31m-[m
[31m-    ngx_log_t          *log;[m
[31m-[m
[31m-    ngx_pool_t         *pool;[m
[31m-[m
[31m-    int                 type;[m
[31m-[m
[31m-    struct sockaddr    *sockaddr;[m
[31m-    socklen_t           socklen;[m
[31m-    ngx_str_t           addr_text;[m
[31m-[m
[31m-    ngx_str_t           proxy_protocol_addr;[m
[31m-[m
[31m-#if (NGX_SSL)[m
[31m-    ngx_ssl_connection_t  *ssl;[m
[31m-#endif[m
[31m-[m
[31m-    struct sockaddr    *local_sockaddr;[m
[31m-    socklen_t           local_socklen;[m
[31m-[m
[31m-    ngx_buf_t          *buffer;[m
[31m-[m
[31m-    ngx_queue_t         queue;[m
[31m-[m
[31m-    ngx_atomic_uint_t   number;[m
[31m-[m
[31m-    ngx_uint_t          requests;[m
[31m-[m
[31m-    unsigned            buffered:8;[m
[31m-[m
[31m-    unsigned            log_error:3;     /* ngx_connection_log_error_e */[m
[31m-[m
[31m-    unsigned            unexpected_eof:1;[m
[31m-    unsigned            timedout:1;[m
[31m-    unsigned            error:1;[m
[31m-    unsigned            destroyed:1;[m
[31m-[m
[31m-    unsigned            idle:1;[m
[31m-    unsigned            reusable:1;[m
[31m-    unsigned            close:1;[m
[31m-    unsigned            shared:1;[m
[31m-[m
[31m-    unsigned            sendfile:1;[m
[31m-    unsigned            sndlowat:1;[m
[31m-    unsigned            tcp_nodelay:2;   /* ngx_connection_tcp_nodelay_e */[m
[31m-    unsigned            tcp_nopush:2;    /* ngx_connection_tcp_nopush_e */[m
[31m-[m
[31m-    unsigned            need_last_buf:1;[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-    unsigned            accept_context_updated:1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    unsigned            busy_count:2;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_thread_task_t  *sendfile_task;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define ngx_set_connection_log(c, l)                                         \[m
[31m-                                                                             \[m
[31m-    c->log->file = l->file;                                                  \[m
[31m-    c->log->next = l->next;                                                  \[m
[31m-    c->log->writer = l->writer;                                              \[m
[31m-    c->log->wdata = l->wdata;                                                \[m
[31m-    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {                   \[m
[31m-        c->log->log_level = l->log_level;                                    \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-ngx_listening_t *ngx_create_listening(ngx_conf_t *cf, void *sockaddr,[m
[31m-    socklen_t socklen);[m
[31m-ngx_int_t ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls);[m
[31m-ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle);[m
[31m-void ngx_configure_listening_sockets(ngx_cycle_t *cycle);[m
[31m-void ngx_close_listening_sockets(ngx_cycle_t *cycle);[m
[31m-void ngx_close_connection(ngx_connection_t *c);[m
[31m-void ngx_close_idle_connections(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,[m
[31m-    ngx_uint_t port);[m
[31m-ngx_int_t ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text);[m
[31m-[m
[31m-ngx_connection_t *ngx_get_connection(ngx_socket_t s, ngx_log_t *log);[m
[31m-void ngx_free_connection(ngx_connection_t *c);[m
[31m-[m
[31m-void ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable);[m
[31m-[m
[31m-#endif /* _NGX_CONNECTION_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_core.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_core.h[m
[1mdeleted file mode 100644[m
[1mindex 2819c1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_core.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CORE_H_INCLUDED_[m
[31m-#define _NGX_CORE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_module_s      ngx_module_t;[m
[31m-typedef struct ngx_conf_s        ngx_conf_t;[m
[31m-typedef struct ngx_cycle_s       ngx_cycle_t;[m
[31m-typedef struct ngx_pool_s        ngx_pool_t;[m
[31m-typedef struct ngx_chain_s       ngx_chain_t;[m
[31m-typedef struct ngx_log_s         ngx_log_t;[m
[31m-typedef struct ngx_open_file_s   ngx_open_file_t;[m
[31m-typedef struct ngx_command_s     ngx_command_t;[m
[31m-typedef struct ngx_file_s        ngx_file_t;[m
[31m-typedef struct ngx_event_s       ngx_event_t;[m
[31m-typedef struct ngx_event_aio_s   ngx_event_aio_t;[m
[31m-typedef struct ngx_connection_s  ngx_connection_t;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-typedef struct ngx_thread_task_s  ngx_thread_task_t;[m
[31m-#endif[m
[31m-[m
[31m-typedef void (*ngx_event_handler_pt)(ngx_event_t *ev);[m
[31m-typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-#define  NGX_OK          0[m
[31m-#define  NGX_ERROR      -1[m
[31m-#define  NGX_AGAIN      -2[m
[31m-#define  NGX_BUSY       -3[m
[31m-#define  NGX_DONE       -4[m
[31m-#define  NGX_DECLINED   -5[m
[31m-#define  NGX_ABORT      -6[m
[31m-[m
[31m-[m
[31m-#include <ngx_errno.h>[m
[31m-#include <ngx_atomic.h>[m
[31m-#include <ngx_thread.h>[m
[31m-#include <ngx_rbtree.h>[m
[31m-#include <ngx_time.h>[m
[31m-#include <ngx_socket.h>[m
[31m-#include <ngx_string.h>[m
[31m-#include <ngx_files.h>[m
[31m-#include <ngx_shmem.h>[m
[31m-#include <ngx_process.h>[m
[31m-#include <ngx_user.h>[m
[31m-#include <ngx_dlopen.h>[m
[31m-#include <ngx_parse.h>[m
[31m-#include <ngx_parse_time.h>[m
[31m-#include <ngx_log.h>[m
[31m-#include <ngx_alloc.h>[m
[31m-#include <ngx_palloc.h>[m
[31m-#include <ngx_buf.h>[m
[31m-#include <ngx_queue.h>[m
[31m-#include <ngx_array.h>[m
[31m-#include <ngx_list.h>[m
[31m-#include <ngx_hash.h>[m
[31m-#include <ngx_file.h>[m
[31m-#include <ngx_crc.h>[m
[31m-#include <ngx_crc32.h>[m
[31m-#include <ngx_murmurhash.h>[m
[31m-#if (NGX_PCRE)[m
[31m-#include <ngx_regex.h>[m
[31m-#endif[m
[31m-#include <ngx_radix_tree.h>[m
[31m-#include <ngx_times.h>[m
[31m-#include <ngx_rwlock.h>[m
[31m-#include <ngx_shmtx.h>[m
[31m-#include <ngx_slab.h>[m
[31m-#include <ngx_inet.h>[m
[31m-#include <ngx_cycle.h>[m
[31m-#include <ngx_resolver.h>[m
[31m-#if (NGX_OPENSSL)[m
[31m-#include <ngx_event_openssl.h>[m
[31m-#endif[m
[31m-#include <ngx_process_cycle.h>[m
[31m-#include <ngx_conf_file.h>[m
[31m-#include <ngx_module.h>[m
[31m-#include <ngx_open_file_cache.h>[m
[31m-#include <ngx_os.h>[m
[31m-#include <ngx_connection.h>[m
[31m-#include <ngx_syslog.h>[m
[31m-#include <ngx_proxy_protocol.h>[m
[31m-[m
[31m-[m
[31m-#define LF     (u_char) '\n'[m
[31m-#define CR     (u_char) '\r'[m
[31m-#define CRLF   "\r\n"[m
[31m-[m
[31m-[m
[31m-#define ngx_abs(value)       (((value) >= 0) ? (value) : - (value))[m
[31m-#define ngx_max(val1, val2)  ((val1 < val2) ? (val2) : (val1))[m
[31m-#define ngx_min(val1, val2)  ((val1 > val2) ? (val2) : (val1))[m
[31m-[m
[31m-void ngx_cpuinfo(void);[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-#define NGX_DISABLE_SYMLINKS_OFF        0[m
[31m-#define NGX_DISABLE_SYMLINKS_ON         1[m
[31m-#define NGX_DISABLE_SYMLINKS_NOTOWNER   2[m
[31m-#endif[m
[31m-[m
[31m-#endif /* _NGX_CORE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_core_probe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_core_probe.h[m
[1mdeleted file mode 100644[m
[1mindex 1841df9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_core_probe.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-#ifndef _NGX_CORE_PROBE_H_INCLUDED_[m
[31m-#define _NGX_CORE_PROBE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-[m
[31m-#include <ngx_dtrace_provider.h>[m
[31m-[m
[31m-#define ngx_core_probe_create_pool_done(pool, size)                             \[m
[31m-    NGINX_CREATE_POOL_DONE(pool, size)[m
[31m-[m
[31m-#else /* !(NGX_DTRACE) */[m
[31m-[m
[31m-#define ngx_core_probe_create_pool_done(pool, size)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CORE_PROBE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cpuinfo.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cpuinfo.c[m
[1mdeleted file mode 100644[m
[1mindex 7205319..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cpuinfo.c[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (( __i386__ || __amd64__ ) && ( __GNUC__ || __INTEL_COMPILER ))[m
[31m-[m
[31m-[m
[31m-static ngx_inline void ngx_cpuid(uint32_t i, uint32_t *buf);[m
[31m-[m
[31m-[m
[31m-#if ( __i386__ )[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_cpuid(uint32_t i, uint32_t *buf)[m
[31m-{[m
[31m-[m
[31m-    /*[m
[31m-     * we could not use %ebx as output parameter if gcc builds PIC,[m
[31m-     * and we could not save %ebx on stack, because %esp is used,[m
[31m-     * when the -fomit-frame-pointer optimization is specified.[m
[31m-     */[m
[31m-[m
[31m-    __asm__ ([m
[31m-[m
[31m-    "    mov    %%ebx, %%esi;  "[m
[31m-[m
[31m-    "    cpuid;                "[m
[31m-    "    mov    %%eax, (%1);   "[m
[31m-    "    mov    %%ebx, 4(%1);  "[m
[31m-    "    mov    %%edx, 8(%1);  "[m
[31m-    "    mov    %%ecx, 12(%1); "[m
[31m-[m
[31m-    "    mov    %%esi, %%ebx;  "[m
[31m-[m
[31m-    : : "a" (i), "D" (buf) : "ecx", "edx", "esi", "memory" );[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else /* __amd64__ */[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_cpuid(uint32_t i, uint32_t *buf)[m
[31m-{[m
[31m-    uint32_t  eax, ebx, ecx, edx;[m
[31m-[m
[31m-    __asm__ ([m
[31m-[m
[31m-        "cpuid"[m
[31m-[m
[31m-    : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (i) );[m
[31m-[m
[31m-    buf[0] = eax;[m
[31m-    buf[1] = ebx;[m
[31m-    buf[2] = edx;[m
[31m-    buf[3] = ecx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* auto detect the L2 cache line size of modern and widespread CPUs */[m
[31m-[m
[31m-void[m
[31m-ngx_cpuinfo(void)[m
[31m-{[m
[31m-    u_char    *vendor;[m
[31m-    uint32_t   vbuf[5], cpu[4], model;[m
[31m-[m
[31m-    vbuf[0] = 0;[m
[31m-    vbuf[1] = 0;[m
[31m-    vbuf[2] = 0;[m
[31m-    vbuf[3] = 0;[m
[31m-    vbuf[4] = 0;[m
[31m-[m
[31m-    ngx_cpuid(0, vbuf);[m
[31m-[m
[31m-    vendor = (u_char *) &vbuf[1];[m
[31m-[m
[31m-    if (vbuf[0] == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cpuid(1, cpu);[m
[31m-[m
[31m-    if (ngx_strcmp(vendor, "GenuineIntel") == 0) {[m
[31m-[m
[31m-        switch ((cpu[0] & 0xf00) >> 8) {[m
[31m-[m
[31m-        /* Pentium */[m
[31m-        case 5:[m
[31m-            ngx_cacheline_size = 32;[m
[31m-            break;[m
[31m-[m
[31m-        /* Pentium Pro, II, III */[m
[31m-        case 6:[m
[31m-            ngx_cacheline_size = 32;[m
[31m-[m
[31m-            model = ((cpu[0] & 0xf0000) >> 8) | (cpu[0] & 0xf0);[m
[31m-[m
[31m-            if (model >= 0xd0) {[m
[31m-                /* Intel Core, Core 2, Atom */[m
[31m-                ngx_cacheline_size = 64;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /*[m
[31m-         * Pentium 4, although its cache line size is 64 bytes,[m
[31m-         * it prefetches up to two cache lines during memory read[m
[31m-         */[m
[31m-        case 15:[m
[31m-            ngx_cacheline_size = 128;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_strcmp(vendor, "AuthenticAMD") == 0) {[m
[31m-        ngx_cacheline_size = 64;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_cpuinfo(void)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc.h[m
[1mdeleted file mode 100644[m
[1mindex 35981bc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc.h[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CRC_H_INCLUDED_[m
[31m-#define _NGX_CRC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/* 32-bit crc16 */[m
[31m-[m
[31m-static ngx_inline uint32_t[m
[31m-ngx_crc(u_char *data, size_t len)[m
[31m-{[m
[31m-    uint32_t  sum;[m
[31m-[m
[31m-    for (sum = 0; len; len--) {[m
[31m-[m
[31m-        /*[m
[31m-         * gcc 2.95.2 x86 and icc 7.1.006 compile[m
[31m-         * that operator into the single "rol" opcode,[m
[31m-         * msvc 6.0sp2 compiles it into four opcodes.[m
[31m-         */[m
[31m-        sum = sum >> 1 | sum << 31;[m
[31m-[m
[31m-        sum += *data++;[m
[31m-    }[m
[31m-[m
[31m-    return sum;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CRC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc32.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc32.c[m
[1mdeleted file mode 100644[m
[1mindex a5b4017..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc32.c[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The code and lookup tables are based on the algorithm[m
[31m- * described at http://www.w3.org/TR/PNG/[m
[31m- *[m
[31m- * The 256 element lookup table takes 1024 bytes, and it may be completely[m
[31m- * cached after processing about 30-60 bytes of data.  So for short data[m
[31m- * we use the 16 element lookup table that takes only 64 bytes and align it[m
[31m- * to CPU cache line size.  Of course, the small table adds code inside[m
[31m- * CRC32 loop, but the cache misses overhead is bigger than overhead of[m
[31m- * the additional code.  For example, ngx_crc32_short() of 16 bytes of data[m
[31m- * takes half as much CPU clocks than ngx_crc32_long().[m
[31m- */[m
[31m-[m
[31m-[m
[31m-static uint32_t  ngx_crc32_table16[] = {[m
[31m-    0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,[m
[31m-    0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,[m
[31m-    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,[m
[31m-    0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c[m
[31m-};[m
[31m-[m
[31m-[m
[31m-uint32_t  ngx_crc32_table256[] = {[m
[31m-    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,[m
[31m-    0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,[m
[31m-    0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,[m
[31m-    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,[m
[31m-    0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,[m
[31m-    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,[m
[31m-    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,[m
[31m-    0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,[m
[31m-    0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,[m
[31m-    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,[m
[31m-    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,[m
[31m-    0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,[m
[31m-    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,[m
[31m-    0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,[m
[31m-    0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,[m
[31m-    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,[m
[31m-    0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,[m
[31m-    0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,[m
[31m-    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,[m
[31m-    0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,[m
[31m-    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,[m
[31m-    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,[m
[31m-    0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,[m
[31m-    0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,[m
[31m-    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,[m
[31m-    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,[m
[31m-    0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,[m
[31m-    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,[m
[31m-    0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,[m
[31m-    0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,[m
[31m-    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,[m
[31m-    0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,[m
[31m-    0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,[m
[31m-    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,[m
[31m-    0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,[m
[31m-    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,[m
[31m-    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,[m
[31m-    0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,[m
[31m-    0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,[m
[31m-    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,[m
[31m-    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,[m
[31m-    0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,[m
[31m-    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,[m
[31m-    0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,[m
[31m-    0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,[m
[31m-    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,[m
[31m-    0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,[m
[31m-    0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,[m
[31m-    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,[m
[31m-    0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,[m
[31m-    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,[m
[31m-    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,[m
[31m-    0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,[m
[31m-    0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,[m
[31m-    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,[m
[31m-    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,[m
[31m-    0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,[m
[31m-    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,[m
[31m-    0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,[m
[31m-    0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,[m
[31m-    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,[m
[31m-    0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,[m
[31m-    0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,[m
[31m-    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d[m
[31m-};[m
[31m-[m
[31m-[m
[31m-uint32_t *ngx_crc32_table_short = ngx_crc32_table16;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_crc32_table_init(void)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    if (((uintptr_t) ngx_crc32_table_short[m
[31m-          & ~((uintptr_t) ngx_cacheline_size - 1))[m
[31m-        == (uintptr_t) ngx_crc32_table_short)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_alloc(16 * sizeof(uint32_t) + ngx_cacheline_size, ngx_cycle->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_align_ptr(p, ngx_cacheline_size);[m
[31m-[m
[31m-    ngx_memcpy(p, ngx_crc32_table16, 16 * sizeof(uint32_t));[m
[31m-[m
[31m-    ngx_crc32_table_short = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc32.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc32.h[m
[1mdeleted file mode 100644[m
[1mindex f6d6865..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crc32.h[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CRC32_H_INCLUDED_[m
[31m-#define _NGX_CRC32_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-extern uint32_t  *ngx_crc32_table_short;[m
[31m-extern uint32_t   ngx_crc32_table256[];[m
[31m-[m
[31m-[m
[31m-static ngx_inline uint32_t[m
[31m-ngx_crc32_short(u_char *p, size_t len)[m
[31m-{[m
[31m-    u_char    c;[m
[31m-    uint32_t  crc;[m
[31m-[m
[31m-    crc = 0xffffffff;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        c = *p++;[m
[31m-        crc = ngx_crc32_table_short[(crc ^ (c & 0xf)) & 0xf] ^ (crc >> 4);[m
[31m-        crc = ngx_crc32_table_short[(crc ^ (c >> 4)) & 0xf] ^ (crc >> 4);[m
[31m-    }[m
[31m-[m
[31m-    return crc ^ 0xffffffff;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline uint32_t[m
[31m-ngx_crc32_long(u_char *p, size_t len)[m
[31m-{[m
[31m-    uint32_t  crc;[m
[31m-[m
[31m-    crc = 0xffffffff;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        crc = ngx_crc32_table256[(crc ^ *p++) & 0xff] ^ (crc >> 8);[m
[31m-    }[m
[31m-[m
[31m-    return crc ^ 0xffffffff;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_crc32_init(crc)                                                   \[m
[31m-    crc = 0xffffffff[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_crc32_update(uint32_t *crc, u_char *p, size_t len)[m
[31m-{[m
[31m-    uint32_t  c;[m
[31m-[m
[31m-    c = *crc;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        c = ngx_crc32_table256[(c ^ *p++) & 0xff] ^ (c >> 8);[m
[31m-    }[m
[31m-[m
[31m-    *crc = c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_crc32_final(crc)                                                  \[m
[31m-    crc ^= 0xffffffff[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_crc32_table_init(void);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CRC32_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crypt.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crypt.c[m
[1mdeleted file mode 100644[m
[1mindex 9db74f4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crypt.c[m
[1m+++ /dev/null[m
[36m@@ -1,283 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_crypt.h>[m
[31m-#include <ngx_md5.h>[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-#include <ngx_sha1.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_CRYPT)[m
[31m-[m
[31m-static ngx_int_t ngx_crypt_apr1(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-static ngx_int_t ngx_crypt_plain(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-[m
[31m-static ngx_int_t ngx_crypt_ssha(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-static ngx_int_t ngx_crypt_sha(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_crypt_to64(u_char *p, uint32_t v, size_t n);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    if (ngx_strncmp(salt, "$apr1$", sizeof("$apr1$") - 1) == 0) {[m
[31m-        return ngx_crypt_apr1(pool, key, salt, encrypted);[m
[31m-[m
[31m-    } else if (ngx_strncmp(salt, "{PLAIN}", sizeof("{PLAIN}") - 1) == 0) {[m
[31m-        return ngx_crypt_plain(pool, key, salt, encrypted);[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-    } else if (ngx_strncmp(salt, "{SSHA}", sizeof("{SSHA}") - 1) == 0) {[m
[31m-        return ngx_crypt_ssha(pool, key, salt, encrypted);[m
[31m-[m
[31m-    } else if (ngx_strncmp(salt, "{SHA}", sizeof("{SHA}") - 1) == 0) {[m
[31m-        return ngx_crypt_sha(pool, key, salt, encrypted);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    /* fallback to libc crypt() */[m
[31m-[m
[31m-    return ngx_libc_crypt(pool, key, salt, encrypted);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_crypt_apr1(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    ngx_int_t          n;[m
[31m-    ngx_uint_t         i;[m
[31m-    u_char            *p, *last, final[16];[m
[31m-    size_t             saltlen, keylen;[m
[31m-    ngx_md5_t          md5, ctx1;[m
[31m-[m
[31m-    /* Apache's apr1 crypt is Poul-Henning Kamp's md5 crypt with $apr1$ magic */[m
[31m-[m
[31m-    keylen = ngx_strlen(key);[m
[31m-[m
[31m-    /* true salt: no magic, max 8 chars, stop at first $ */[m
[31m-[m
[31m-    salt += sizeof("$apr1$") - 1;[m
[31m-    last = salt + 8;[m
[31m-    for (p = salt; *p && *p != '$' && p < last; p++) { /* void */ }[m
[31m-    saltlen = p - salt;[m
[31m-[m
[31m-    /* hash key and salt */[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, key, keylen);[m
[31m-    ngx_md5_update(&md5, (u_char *) "$apr1$", sizeof("$apr1$") - 1);[m
[31m-    ngx_md5_update(&md5, salt, saltlen);[m
[31m-[m
[31m-    ngx_md5_init(&ctx1);[m
[31m-    ngx_md5_update(&ctx1, key, keylen);[m
[31m-    ngx_md5_update(&ctx1, salt, saltlen);[m
[31m-    ngx_md5_update(&ctx1, key, keylen);[m
[31m-    ngx_md5_final(final, &ctx1);[m
[31m-[m
[31m-    for (n = keylen; n > 0; n -= 16) {[m
[31m-        ngx_md5_update(&md5, final, n > 16 ? 16 : n);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(final, sizeof(final));[m
[31m-[m
[31m-    for (i = keylen; i; i >>= 1) {[m
[31m-        if (i & 1) {[m
[31m-            ngx_md5_update(&md5, final, 1);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_md5_update(&md5, key, 1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_final(final, &md5);[m
[31m-[m
[31m-    for (i = 0; i < 1000; i++) {[m
[31m-        ngx_md5_init(&ctx1);[m
[31m-[m
[31m-        if (i & 1) {[m
[31m-            ngx_md5_update(&ctx1, key, keylen);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_md5_update(&ctx1, final, 16);[m
[31m-        }[m
[31m-[m
[31m-        if (i % 3) {[m
[31m-            ngx_md5_update(&ctx1, salt, saltlen);[m
[31m-        }[m
[31m-[m
[31m-        if (i % 7) {[m
[31m-            ngx_md5_update(&ctx1, key, keylen);[m
[31m-        }[m
[31m-[m
[31m-        if (i & 1) {[m
[31m-            ngx_md5_update(&ctx1, final, 16);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_md5_update(&ctx1, key, keylen);[m
[31m-        }[m
[31m-[m
[31m-        ngx_md5_final(final, &ctx1);[m
[31m-    }[m
[31m-[m
[31m-    /* output */[m
[31m-[m
[31m-    *encrypted = ngx_pnalloc(pool, sizeof("$apr1$") - 1 + saltlen + 1 + 22 + 1);[m
[31m-    if (*encrypted == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(*encrypted, "$apr1$", sizeof("$apr1$") - 1);[m
[31m-    p = ngx_copy(p, salt, saltlen);[m
[31m-    *p++ = '$';[m
[31m-[m
[31m-    p = ngx_crypt_to64(p, (final[ 0]<<16) | (final[ 6]<<8) | final[12], 4);[m
[31m-    p = ngx_crypt_to64(p, (final[ 1]<<16) | (final[ 7]<<8) | final[13], 4);[m
[31m-    p = ngx_crypt_to64(p, (final[ 2]<<16) | (final[ 8]<<8) | final[14], 4);[m
[31m-    p = ngx_crypt_to64(p, (final[ 3]<<16) | (final[ 9]<<8) | final[15], 4);[m
[31m-    p = ngx_crypt_to64(p, (final[ 4]<<16) | (final[10]<<8) | final[ 5], 4);[m
[31m-    p = ngx_crypt_to64(p, final[11], 2);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_crypt_to64(u_char *p, uint32_t v, size_t n)[m
[31m-{[m
[31m-    static u_char   itoa64[] =[m
[31m-        "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";[m
[31m-[m
[31m-    while (n--) {[m
[31m-        *p++ = itoa64[v & 0x3f];[m
[31m-        v >>= 6;[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_crypt_plain(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    len = ngx_strlen(key);[m
[31m-[m
[31m-    *encrypted = ngx_pnalloc(pool, sizeof("{PLAIN}") - 1 + len + 1);[m
[31m-    if (*encrypted == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(*encrypted, "{PLAIN}", sizeof("{PLAIN}") - 1);[m
[31m-    ngx_memcpy(p, key, len + 1);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_crypt_ssha(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    size_t       len;[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_str_t    encoded, decoded;[m
[31m-    ngx_sha1_t   sha1;[m
[31m-[m
[31m-    /* "{SSHA}" base64(SHA1(key salt) salt) */[m
[31m-[m
[31m-    /* decode base64 salt to find out true salt */[m
[31m-[m
[31m-    encoded.data = salt + sizeof("{SSHA}") - 1;[m
[31m-    encoded.len = ngx_strlen(encoded.data);[m
[31m-[m
[31m-    len = ngx_max(ngx_base64_decoded_length(encoded.len), 20);[m
[31m-[m
[31m-    decoded.data = ngx_pnalloc(pool, len);[m
[31m-    if (decoded.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_decode_base64(&decoded, &encoded);[m
[31m-[m
[31m-    if (rc != NGX_OK || decoded.len < 20) {[m
[31m-        decoded.len = 20;[m
[31m-    }[m
[31m-[m
[31m-    /* update SHA1 from key and salt */[m
[31m-[m
[31m-    ngx_sha1_init(&sha1);[m
[31m-    ngx_sha1_update(&sha1, key, ngx_strlen(key));[m
[31m-    ngx_sha1_update(&sha1, decoded.data + 20, decoded.len - 20);[m
[31m-    ngx_sha1_final(decoded.data, &sha1);[m
[31m-[m
[31m-    /* encode it back to base64 */[m
[31m-[m
[31m-    len = sizeof("{SSHA}") - 1 + ngx_base64_encoded_length(decoded.len) + 1;[m
[31m-[m
[31m-    *encrypted = ngx_pnalloc(pool, len);[m
[31m-    if (*encrypted == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    encoded.data = ngx_cpymem(*encrypted, "{SSHA}", sizeof("{SSHA}") - 1);[m
[31m-    ngx_encode_base64(&encoded, &decoded);[m
[31m-    encoded.data[encoded.len] = '\0';[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_crypt_sha(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    ngx_str_t   encoded, decoded;[m
[31m-    ngx_sha1_t  sha1;[m
[31m-    u_char      digest[20];[m
[31m-[m
[31m-    /* "{SHA}" base64(SHA1(key)) */[m
[31m-[m
[31m-    decoded.len = sizeof(digest);[m
[31m-    decoded.data = digest;[m
[31m-[m
[31m-    ngx_sha1_init(&sha1);[m
[31m-    ngx_sha1_update(&sha1, key, ngx_strlen(key));[m
[31m-    ngx_sha1_final(digest, &sha1);[m
[31m-[m
[31m-    len = sizeof("{SHA}") - 1 + ngx_base64_encoded_length(decoded.len) + 1;[m
[31m-[m
[31m-    *encrypted = ngx_pnalloc(pool, len);[m
[31m-    if (*encrypted == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    encoded.data = ngx_cpymem(*encrypted, "{SHA}", sizeof("{SHA}") - 1);[m
[31m-    ngx_encode_base64(&encoded, &decoded);[m
[31m-    encoded.data[encoded.len] = '\0';[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_HAVE_SHA1 */[m
[31m-[m
[31m-#endif /* NGX_CRYPT */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crypt.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crypt.h[m
[1mdeleted file mode 100644[m
[1mindex 3869114..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_crypt.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CRYPT_H_INCLUDED_[m
[31m-#define _NGX_CRYPT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CRYPT_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cycle.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cycle.c[m
[1mdeleted file mode 100644[m
[1mindex 98599f3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cycle.c[m
[1m+++ /dev/null[m
[36m@@ -1,1343 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_destroy_cycle_pools(ngx_conf_t *conf);[m
[31m-static ngx_int_t ngx_init_zone_pool(ngx_cycle_t *cycle,[m
[31m-    ngx_shm_zone_t *shm_zone);[m
[31m-static ngx_int_t ngx_test_lockfile(u_char *file, ngx_log_t *log);[m
[31m-static void ngx_clean_old_cycles(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-volatile ngx_cycle_t  *ngx_cycle;[m
[31m-ngx_array_t            ngx_old_cycles;[m
[31m-[m
[31m-static ngx_pool_t     *ngx_temp_pool;[m
[31m-static ngx_event_t     ngx_cleaner_event;[m
[31m-[m
[31m-ngx_uint_t             ngx_test_config;[m
[31m-ngx_uint_t             ngx_dump_config;[m
[31m-ngx_uint_t             ngx_quiet_mode;[m
[31m-[m
[31m-[m
[31m-/* STUB NAME */[m
[31m-static ngx_connection_t  dumb;[m
[31m-/* STUB */[m
[31m-[m
[31m-[m
[31m-ngx_cycle_t *[m
[31m-ngx_init_cycle(ngx_cycle_t *old_cycle)[m
[31m-{[m
[31m-    void                *rv;[m
[31m-    char               **senv, **env;[m
[31m-    ngx_uint_t           i, n;[m
[31m-    ngx_log_t           *log;[m
[31m-    ngx_time_t          *tp;[m
[31m-    ngx_conf_t           conf;[m
[31m-    ngx_pool_t          *pool;[m
[31m-    ngx_cycle_t         *cycle, **old;[m
[31m-    ngx_shm_zone_t      *shm_zone, *oshm_zone;[m
[31m-    ngx_list_part_t     *part, *opart;[m
[31m-    ngx_open_file_t     *file;[m
[31m-    ngx_listening_t     *ls, *nls;[m
[31m-    ngx_core_conf_t     *ccf, *old_ccf;[m
[31m-    ngx_core_module_t   *module;[m
[31m-    char                 hostname[NGX_MAXHOSTNAMELEN];[m
[31m-[m
[31m-    ngx_timezone_update();[m
[31m-[m
[31m-    /* force localtime update with a new timezone */[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    tp->sec = 0;[m
[31m-[m
[31m-    ngx_time_update();[m
[31m-[m
[31m-[m
[31m-    log = old_cycle->log;[m
[31m-[m
[31m-    pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-    pool->log = log;[m
[31m-[m
[31m-    cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));[m
[31m-    if (cycle == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->pool = pool;[m
[31m-    cycle->log = log;[m
[31m-    cycle->old_cycle = old_cycle;[m
[31m-[m
[31m-    cycle->conf_prefix.len = old_cycle->conf_prefix.len;[m
[31m-    cycle->conf_prefix.data = ngx_pstrdup(pool, &old_cycle->conf_prefix);[m
[31m-    if (cycle->conf_prefix.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->prefix.len = old_cycle->prefix.len;[m
[31m-    cycle->prefix.data = ngx_pstrdup(pool, &old_cycle->prefix);[m
[31m-    if (cycle->prefix.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->conf_file.len = old_cycle->conf_file.len;[m
[31m-    cycle->conf_file.data = ngx_pnalloc(pool, old_cycle->conf_file.len + 1);[m
[31m-    if (cycle->conf_file.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-    ngx_cpystrn(cycle->conf_file.data, old_cycle->conf_file.data,[m
[31m-                old_cycle->conf_file.len + 1);[m
[31m-[m
[31m-    cycle->conf_param.len = old_cycle->conf_param.len;[m
[31m-    cycle->conf_param.data = ngx_pstrdup(pool, &old_cycle->conf_param);[m
[31m-    if (cycle->conf_param.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    n = old_cycle->paths.nelts ? old_cycle->paths.nelts : 10;[m
[31m-[m
[31m-    cycle->paths.elts = ngx_pcalloc(pool, n * sizeof(ngx_path_t *));[m
[31m-    if (cycle->paths.elts == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->paths.nelts = 0;[m
[31m-    cycle->paths.size = sizeof(ngx_path_t *);[m
[31m-    cycle->paths.nalloc = n;[m
[31m-    cycle->paths.pool = pool;[m
[31m-[m
[31m-[m
[31m-    if (ngx_array_init(&cycle->config_dump, pool, 1, sizeof(ngx_conf_dump_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (old_cycle->open_files.part.nelts) {[m
[31m-        n = old_cycle->open_files.part.nelts;[m
[31m-        for (part = old_cycle->open_files.part.next; part; part = part->next) {[m
[31m-            n += part->nelts;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        n = 20;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (old_cycle->shared_memory.part.nelts) {[m
[31m-        n = old_cycle->shared_memory.part.nelts;[m
[31m-        for (part = old_cycle->shared_memory.part.next; part; part = part->next)[m
[31m-        {[m
[31m-            n += part->nelts;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&cycle->shared_memory, pool, n, sizeof(ngx_shm_zone_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;[m
[31m-[m
[31m-    cycle->listening.elts = ngx_pcalloc(pool, n * sizeof(ngx_listening_t));[m
[31m-    if (cycle->listening.elts == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cycle->listening.nelts = 0;[m
[31m-    cycle->listening.size = sizeof(ngx_listening_t);[m
[31m-    cycle->listening.nalloc = n;[m
[31m-    cycle->listening.pool = pool;[m
[31m-[m
[31m-[m
[31m-    ngx_queue_init(&cycle->reusable_connections_queue);[m
[31m-[m
[31m-[m
[31m-    cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));[m
[31m-    if (cycle->conf_ctx == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed");[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* on Linux gethostname() silently truncates name that does not fit */[m
[31m-[m
[31m-    hostname[NGX_MAXHOSTNAMELEN - 1] = '\0';[m
[31m-    cycle->hostname.len = ngx_strlen(hostname);[m
[31m-[m
[31m-    cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len);[m
[31m-    if (cycle->hostname.data == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(cycle->hostname.data, (u_char *) hostname, cycle->hostname.len);[m
[31m-[m
[31m-[m
[31m-    if (ngx_cycle_modules(cycle) != NGX_OK) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->type != NGX_CORE_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_conf) {[m
[31m-            rv = module->create_conf(cycle);[m
[31m-            if (rv == NULL) {[m
[31m-                ngx_destroy_pool(pool);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-            cycle->conf_ctx[cycle->modules[i]->index] = rv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    senv = environ;[m
[31m-[m
[31m-[m
[31m-    ngx_memzero(&conf, sizeof(ngx_conf_t));[m
[31m-    /* STUB: init array ? */[m
[31m-    conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));[m
[31m-    if (conf.args == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);[m
[31m-    if (conf.temp_pool == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    conf.ctx = cycle->conf_ctx;[m
[31m-    conf.cycle = cycle;[m
[31m-    conf.pool = pool;[m
[31m-    conf.log = log;[m
[31m-    conf.module_type = NGX_CORE_MODULE;[m
[31m-    conf.cmd_type = NGX_MAIN_CONF;[m
[31m-[m
[31m-#if 0[m
[31m-    log->log_level = NGX_LOG_DEBUG_ALL;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_conf_param(&conf) != NGX_CONF_OK) {[m
[31m-        environ = senv;[m
[31m-        ngx_destroy_cycle_pools(&conf);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {[m
[31m-        environ = senv;[m
[31m-        ngx_destroy_cycle_pools(&conf);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_test_config && !ngx_quiet_mode) {[m
[31m-        ngx_log_stderr(0, "the configuration file %s syntax is ok",[m
[31m-                       cycle->conf_file.data);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->type != NGX_CORE_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->init_conf) {[m
[31m-            if (module->init_conf(cycle,[m
[31m-                                  cycle->conf_ctx[cycle->modules[i]->index])[m
[31m-                == NGX_CONF_ERROR)[m
[31m-            {[m
[31m-                environ = senv;[m
[31m-                ngx_destroy_cycle_pools(&conf);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_SIGNALLER) {[m
[31m-        return cycle;[m
[31m-    }[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (ngx_test_config) {[m
[31m-[m
[31m-        if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-    } else if (!ngx_is_init_cycle(old_cycle)) {[m
[31m-[m
[31m-        /*[m
[31m-         * we do not create the pid file in the first ngx_init_cycle() call[m
[31m-         * because we need to write the demonized process pid[m
[31m-         */[m
[31m-[m
[31m-        old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,[m
[31m-                                                   ngx_core_module);[m
[31m-        if (ccf->pid.len != old_ccf->pid.len[m
[31m-            || ngx_strcmp(ccf->pid.data, old_ccf->pid.data) != 0)[m
[31m-        {[m
[31m-            /* new pid file name */[m
[31m-[m
[31m-            if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ngx_delete_pidfile(old_cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_test_lockfile(cycle->lock_file.data, log) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_create_paths(cycle, ccf->user) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_log_open_default(cycle) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /* open the new files */[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].name.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        file[i].fd = ngx_open_file(file[i].name.data,[m
[31m-                                   NGX_FILE_APPEND,[m
[31m-                                   NGX_FILE_CREATE_OR_OPEN,[m
[31m-                                   NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "log: %p %d \"%s\"",[m
[31m-                       &file[i], file[i].fd, file[i].name.data);[m
[31m-[m
[31m-        if (file[i].fd == NGX_INVALID_FILE) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          ngx_open_file_n " \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-        if (fcntl(file[i].fd, F_SETFD, FD_CLOEXEC) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          "fcntl(FD_CLOEXEC) \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    cycle->log = &cycle->new_log;[m
[31m-    pool->log = &cycle->new_log;[m
[31m-[m
[31m-[m
[31m-    /* create shared memory */[m
[31m-[m
[31m-    part = &cycle->shared_memory.part;[m
[31m-    shm_zone = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            shm_zone = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (shm_zone[i].shm.size == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, 0,[m
[31m-                          "zero size shared memory zone \"%V\"",[m
[31m-                          &shm_zone[i].shm.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        shm_zone[i].shm.log = cycle->log;[m
[31m-[m
[31m-        opart = &old_cycle->shared_memory.part;[m
[31m-        oshm_zone = opart->elts;[m
[31m-[m
[31m-        for (n = 0; /* void */ ; n++) {[m
[31m-[m
[31m-            if (n >= opart->nelts) {[m
[31m-                if (opart->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-                opart = opart->next;[m
[31m-                oshm_zone = opart->elts;[m
[31m-                n = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (shm_zone[i].shm.name.len != oshm_zone[n].shm.name.len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp(shm_zone[i].shm.name.data,[m
[31m-                            oshm_zone[n].shm.name.data,[m
[31m-                            shm_zone[i].shm.name.len)[m
[31m-                != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (shm_zone[i].tag == oshm_zone[n].tag[m
[31m-                && shm_zone[i].shm.size == oshm_zone[n].shm.size[m
[31m-                && !shm_zone[i].noreuse)[m
[31m-            {[m
[31m-                shm_zone[i].shm.addr = oshm_zone[n].shm.addr;[m
[31m-#if (NGX_WIN32)[m
[31m-                shm_zone[i].shm.handle = oshm_zone[n].shm.handle;[m
[31m-#endif[m
[31m-[m
[31m-                if (shm_zone[i].init(&shm_zone[i], oshm_zone[n].data)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                goto shm_zone_found;[m
[31m-            }[m
[31m-[m
[31m-            ngx_shm_free(&oshm_zone[n].shm);[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_shm_alloc(&shm_zone[i].shm) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_init_zone_pool(cycle, &shm_zone[i]) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (shm_zone[i].init(&shm_zone[i], NULL) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-    shm_zone_found:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* handle the listening sockets */[m
[31m-[m
[31m-    if (old_cycle->listening.nelts) {[m
[31m-        ls = old_cycle->listening.elts;[m
[31m-        for (i = 0; i < old_cycle->listening.nelts; i++) {[m
[31m-            ls[i].remain = 0;[m
[31m-        }[m
[31m-[m
[31m-        nls = cycle->listening.elts;[m
[31m-        for (n = 0; n < cycle->listening.nelts; n++) {[m
[31m-[m
[31m-            for (i = 0; i < old_cycle->listening.nelts; i++) {[m
[31m-                if (ls[i].ignore) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ls[i].remain) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ls[i].type != nls[n].type) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_cmp_sockaddr(nls[n].sockaddr, nls[n].socklen,[m
[31m-                                     ls[i].sockaddr, ls[i].socklen, 1)[m
[31m-                    == NGX_OK)[m
[31m-                {[m
[31m-                    nls[n].fd = ls[i].fd;[m
[31m-                    nls[n].previous = &ls[i];[m
[31m-                    ls[i].remain = 1;[m
[31m-[m
[31m-                    if (ls[i].backlog != nls[n].backlog) {[m
[31m-                        nls[n].listen = 1;[m
[31m-                    }[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-[m
[31m-                    /*[m
[31m-                     * FreeBSD, except the most recent versions,[m
[31m-                     * could not remove accept filter[m
[31m-                     */[m
[31m-                    nls[n].deferred_accept = ls[i].deferred_accept;[m
[31m-[m
[31m-                    if (ls[i].accept_filter && nls[n].accept_filter) {[m
[31m-                        if (ngx_strcmp(ls[i].accept_filter,[m
[31m-                                       nls[n].accept_filter)[m
[31m-                            != 0)[m
[31m-                        {[m
[31m-                            nls[n].delete_deferred = 1;[m
[31m-                            nls[n].add_deferred = 1;[m
[31m-                        }[m
[31m-[m
[31m-                    } else if (ls[i].accept_filter) {[m
[31m-                        nls[n].delete_deferred = 1;[m
[31m-[m
[31m-                    } else if (nls[n].accept_filter) {[m
[31m-                        nls[n].add_deferred = 1;[m
[31m-                    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-[m
[31m-                    if (ls[i].deferred_accept && !nls[n].deferred_accept) {[m
[31m-                        nls[n].delete_deferred = 1;[m
[31m-[m
[31m-                    } else if (ls[i].deferred_accept != nls[n].deferred_accept)[m
[31m-                    {[m
[31m-                        nls[n].add_deferred = 1;[m
[31m-                    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-                    if (nls[n].reuseport && !ls[i].reuseport) {[m
[31m-                        nls[n].add_reuseport = 1;[m
[31m-                    }[m
[31m-#endif[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (nls[n].fd == (ngx_socket_t) -1) {[m
[31m-                nls[n].open = 1;[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-                if (nls[n].accept_filter) {[m
[31m-                    nls[n].add_deferred = 1;[m
[31m-                }[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-                if (nls[n].deferred_accept) {[m
[31m-                    nls[n].add_deferred = 1;[m
[31m-                }[m
[31m-#endif[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ls = cycle->listening.elts;[m
[31m-        for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-            ls[i].open = 1;[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-            if (ls[i].accept_filter) {[m
[31m-                ls[i].add_deferred = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-            if (ls[i].deferred_accept) {[m
[31m-                ls[i].add_deferred = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_listening_sockets(cycle) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_test_config) {[m
[31m-        ngx_configure_listening_sockets(cycle);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* commit the new cycle configuration */[m
[31m-[m
[31m-    if (!ngx_use_stderr) {[m
[31m-        (void) ngx_log_redirect_stderr(cycle);[m
[31m-    }[m
[31m-[m
[31m-    pool->log = cycle->log;[m
[31m-[m
[31m-    if (ngx_init_modules(cycle) != NGX_OK) {[m
[31m-        /* fatal */[m
[31m-        exit(1);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* close and delete stuff that lefts from an old cycle */[m
[31m-[m
[31m-    /* free the unnecessary shared memory */[m
[31m-[m
[31m-    opart = &old_cycle->shared_memory.part;[m
[31m-    oshm_zone = opart->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= opart->nelts) {[m
[31m-            if (opart->next == NULL) {[m
[31m-                goto old_shm_zone_done;[m
[31m-            }[m
[31m-            opart = opart->next;[m
[31m-            oshm_zone = opart->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        part = &cycle->shared_memory.part;[m
[31m-        shm_zone = part->elts;[m
[31m-[m
[31m-        for (n = 0; /* void */ ; n++) {[m
[31m-[m
[31m-            if (n >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-                part = part->next;[m
[31m-                shm_zone = part->elts;[m
[31m-                n = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (oshm_zone[i].shm.name.len == shm_zone[n].shm.name.len[m
[31m-                && ngx_strncmp(oshm_zone[i].shm.name.data,[m
[31m-                               shm_zone[n].shm.name.data,[m
[31m-                               oshm_zone[i].shm.name.len)[m
[31m-                == 0)[m
[31m-            {[m
[31m-                goto live_shm_zone;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_shm_free(&oshm_zone[i].shm);[m
[31m-[m
[31m-    live_shm_zone:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-old_shm_zone_done:[m
[31m-[m
[31m-[m
[31m-    /* close the unnecessary listening sockets */[m
[31m-[m
[31m-    ls = old_cycle->listening.elts;[m
[31m-    for (i = 0; i < old_cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        if (ls[i].remain || ls[i].fd == (ngx_socket_t) -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_socket(ls[i].fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " listening socket on %V failed",[m
[31m-                          &ls[i].addr_text);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-        if (ls[i].sockaddr->sa_family == AF_UNIX) {[m
[31m-            u_char  *name;[m
[31m-[m
[31m-            name = ls[i].addr_text.data + sizeof("unix:") - 1;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_WARN, cycle->log, 0,[m
[31m-                          "deleting socket %s", name);[m
[31m-[m
[31m-            if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                              ngx_delete_file_n " %s failed", name);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* close the unnecessary open files */[m
[31m-[m
[31m-    part = &old_cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(conf.temp_pool);[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_MASTER || ngx_is_init_cycle(old_cycle)) {[m
[31m-[m
[31m-        /*[m
[31m-         * perl_destruct() frees environ, if it is not the same as it was at[m
[31m-         * perl_construct() time, therefore we save the previous cycle[m
[31m-         * environment before ngx_conf_parse() where it will be changed.[m
[31m-         */[m
[31m-[m
[31m-        env = environ;[m
[31m-        environ = senv;[m
[31m-[m
[31m-        ngx_destroy_pool(old_cycle->pool);[m
[31m-        cycle->old_cycle = NULL;[m
[31m-[m
[31m-        environ = env;[m
[31m-[m
[31m-        return cycle;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_temp_pool == NULL) {[m
[31m-        ngx_temp_pool = ngx_create_pool(128, cycle->log);[m
[31m-        if (ngx_temp_pool == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                          "could not create ngx_temp_pool");[m
[31m-            exit(1);[m
[31m-        }[m
[31m-[m
[31m-        n = 10;[m
[31m-        ngx_old_cycles.elts = ngx_pcalloc(ngx_temp_pool,[m
[31m-                                          n * sizeof(ngx_cycle_t *));[m
[31m-        if (ngx_old_cycles.elts == NULL) {[m
[31m-            exit(1);[m
[31m-        }[m
[31m-        ngx_old_cycles.nelts = 0;[m
[31m-        ngx_old_cycles.size = sizeof(ngx_cycle_t *);[m
[31m-        ngx_old_cycles.nalloc = n;[m
[31m-        ngx_old_cycles.pool = ngx_temp_pool;[m
[31m-[m
[31m-        ngx_cleaner_event.handler = ngx_clean_old_cycles;[m
[31m-        ngx_cleaner_event.log = cycle->log;[m
[31m-        ngx_cleaner_event.data = &dumb;[m
[31m-        dumb.fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_temp_pool->log = cycle->log;[m
[31m-[m
[31m-    old = ngx_array_push(&ngx_old_cycles);[m
[31m-    if (old == NULL) {[m
[31m-        exit(1);[m
[31m-    }[m
[31m-    *old = old_cycle;[m
[31m-[m
[31m-    if (!ngx_cleaner_event.timer_set) {[m
[31m-        ngx_add_timer(&ngx_cleaner_event, 30000);[m
[31m-        ngx_cleaner_event.timer_set = 1;[m
[31m-    }[m
[31m-[m
[31m-    return cycle;[m
[31m-[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (!ngx_is_init_cycle(old_cycle)) {[m
[31m-        old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,[m
[31m-                                                   ngx_core_module);[m
[31m-        if (old_ccf->environment) {[m
[31m-            environ = old_ccf->environment;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* rollback the new cycle configuration */[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_test_config) {[m
[31m-        ngx_destroy_cycle_pools(&conf);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-        if (ls[i].fd == (ngx_socket_t) -1 || !ls[i].open) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_socket(ls[i].fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " %V failed",[m
[31m-                          &ls[i].addr_text);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_cycle_pools(&conf);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_destroy_cycle_pools(ngx_conf_t *conf)[m
[31m-{[m
[31m-    ngx_destroy_pool(conf->temp_pool);[m
[31m-    ngx_destroy_pool(conf->pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)[m
[31m-{[m
[31m-    u_char           *file;[m
[31m-    ngx_slab_pool_t  *sp;[m
[31m-[m
[31m-    sp = (ngx_slab_pool_t *) zn->shm.addr;[m
[31m-[m
[31m-    if (zn->shm.exists) {[m
[31m-[m
[31m-        if (sp == sp->addr) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-        /* remap at the required address */[m
[31m-[m
[31m-        if (ngx_shm_remap(&zn->shm, sp->addr) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sp = (ngx_slab_pool_t *) zn->shm.addr;[m
[31m-[m
[31m-        if (sp == sp->addr) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "shared zone \"%V\" has no equal addresses: %p vs %p",[m
[31m-                      &zn->shm.name, sp->addr, sp);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sp->end = zn->shm.addr + zn->shm.size;[m
[31m-    sp->min_shift = 3;[m
[31m-    sp->addr = zn->shm.addr;[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-    file = NULL;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    file = ngx_pnalloc(cycle->pool, cycle->lock_file.len + zn->shm.name.len);[m
[31m-    if (file == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_sprintf(file, "%V%V%Z", &cycle->lock_file, &zn->shm.name);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_shmtx_create(&sp->mutex, &sp->lock, file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_slab_init(sp);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    ngx_uint_t  create;[m
[31m-    ngx_file_t  file;[m
[31m-    u_char      pid[NGX_INT64_LEN + 2];[m
[31m-[m
[31m-    if (ngx_process > NGX_PROCESS_MASTER) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-[m
[31m-    file.name = *name;[m
[31m-    file.log = log;[m
[31m-[m
[31m-    create = ngx_test_config ? NGX_FILE_CREATE_OR_OPEN : NGX_FILE_TRUNCATE;[m
[31m-[m
[31m-    file.fd = ngx_open_file(file.name.data, NGX_FILE_RDWR,[m
[31m-                            create, NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (file.fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_test_config) {[m
[31m-        len = ngx_snprintf(pid, NGX_INT64_LEN + 2, "%P%N", ngx_pid) - pid;[m
[31m-[m
[31m-        if (ngx_write_file(&file, pid, len, 0) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file.name.data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_delete_pidfile(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_char           *name;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    name = ngx_new_binary ? ccf->oldpid.data : ccf->pid.data;[m
[31m-[m
[31m-    if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      ngx_delete_file_n " \"%s\" failed", name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_signal_process(ngx_cycle_t *cycle, char *sig)[m
[31m-{[m
[31m-    ssize_t           n;[m
[31m-    ngx_pid_t         pid;[m
[31m-    ngx_file_t        file;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-    u_char            buf[NGX_INT64_LEN + 2];[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "signal process started");[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-[m
[31m-    file.name = ccf->pid;[m
[31m-    file.log = cycle->log;[m
[31m-[m
[31m-    file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY,[m
[31m-                            NGX_FILE_OPEN, NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (file.fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", file.name.data);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_file(&file, buf, NGX_INT64_LEN + 2, 0);[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file.name.data);[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    while (n-- && (buf[n] == CR || buf[n] == LF)) { /* void */ }[m
[31m-[m
[31m-    pid = ngx_atoi(buf, ++n);[m
[31m-[m
[31m-    if (pid == (ngx_pid_t) NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cycle->log, 0,[m
[31m-                      "invalid PID number \"%*s\" in \"%s\"",[m
[31m-                      n, buf, file.name.data);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_os_signal_process(cycle, sig, pid);[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_test_lockfile(u_char *file, ngx_log_t *log)[m
[31m-{[m
[31m-#if !(NGX_HAVE_ATOMIC_OPS)[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    fd = ngx_open_file(file, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN,[m
[31m-                       NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", file);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_delete_file(file) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_delete_file_n " \"%s\" failed", file);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user)[m
[31m-{[m
[31m-    ngx_fd_t          fd;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_open_file_t  *file;[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    file = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            file = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].name.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (file[i].flush) {[m
[31m-            file[i].flush(&file[i], cycle->log);[m
[31m-        }[m
[31m-[m
[31m-        fd = ngx_open_file(file[i].name.data, NGX_FILE_APPEND,[m
[31m-                           NGX_FILE_CREATE_OR_OPEN, NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "reopen file \"%s\", old:%d new:%d",[m
[31m-                       file[i].name.data, file[i].fd, fd);[m
[31m-[m
[31m-        if (fd == NGX_INVALID_FILE) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          ngx_open_file_n " \"%s\" failed", file[i].name.data);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-        if (user != (ngx_uid_t) NGX_CONF_UNSET_UINT) {[m
[31m-            ngx_file_info_t  fi;[m
[31m-[m
[31m-            if (ngx_file_info((const char *) file[i].name.data, &fi)[m
[31m-                == NGX_FILE_ERROR)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                              ngx_file_info_n " \"%s\" failed",[m
[31m-                              file[i].name.data);[m
[31m-[m
[31m-                if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                  ngx_close_file_n " \"%s\" failed",[m
[31m-                                  file[i].name.data);[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (fi.st_uid != user) {[m
[31m-                if (chown((const char *) file[i].name.data, user, -1) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                  "chown(\"%s\", %d) failed",[m
[31m-                                  file[i].name.data, user);[m
[31m-[m
[31m-                    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                      ngx_close_file_n " \"%s\" failed",[m
[31m-                                      file[i].name.data);[m
[31m-                    }[m
[31m-[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if ((fi.st_mode & (S_IRUSR|S_IWUSR)) != (S_IRUSR|S_IWUSR)) {[m
[31m-[m
[31m-                fi.st_mode |= (S_IRUSR|S_IWUSR);[m
[31m-[m
[31m-                if (chmod((const char *) file[i].name.data, fi.st_mode) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                  "chmod() \"%s\" failed", file[i].name.data);[m
[31m-[m
[31m-                    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                                      ngx_close_file_n " \"%s\" failed",[m
[31m-                                      file[i].name.data);[m
[31m-                    }[m
[31m-[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "fcntl(FD_CLOEXEC) \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-[m
[31m-            if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                              ngx_close_file_n " \"%s\" failed",[m
[31m-                              file[i].name.data);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed",[m
[31m-                          file[i].name.data);[m
[31m-        }[m
[31m-[m
[31m-        file[i].fd = fd;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_log_redirect_stderr(cycle);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_shm_zone_t *[m
[31m-ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, size_t size, void *tag)[m
[31m-{[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_shm_zone_t   *shm_zone;[m
[31m-    ngx_list_part_t  *part;[m
[31m-[m
[31m-    part = &cf->cycle->shared_memory.part;[m
[31m-    shm_zone = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            shm_zone = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (name->len != shm_zone[i].shm.name.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(name->data, shm_zone[i].shm.name.data, name->len)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (tag != shm_zone[i].tag) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                            "the shared memory zone \"%V\" is "[m
[31m-                            "already declared for a different use",[m
[31m-                            &shm_zone[i].shm.name);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (shm_zone[i].shm.size == 0) {[m
[31m-            shm_zone[i].shm.size = size;[m
[31m-        }[m
[31m-[m
[31m-        if (size && size != shm_zone[i].shm.size) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                            "the size %uz of shared memory zone \"%V\" "[m
[31m-                            "conflicts with already declared size %uz",[m
[31m-                            size, &shm_zone[i].shm.name, shm_zone[i].shm.size);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        return &shm_zone[i];[m
[31m-    }[m
[31m-[m
[31m-    shm_zone = ngx_list_push(&cf->cycle->shared_memory);[m
[31m-[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone->data = NULL;[m
[31m-    shm_zone->shm.log = cf->cycle->log;[m
[31m-    shm_zone->shm.size = size;[m
[31m-    shm_zone->shm.name = *name;[m
[31m-    shm_zone->shm.exists = 0;[m
[31m-    shm_zone->init = NULL;[m
[31m-    shm_zone->tag = tag;[m
[31m-    shm_zone->noreuse = 0;[m
[31m-[m
[31m-    return shm_zone;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_clean_old_cycles(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_uint_t     i, n, found, live;[m
[31m-    ngx_log_t     *log;[m
[31m-    ngx_cycle_t  **cycle;[m
[31m-[m
[31m-    log = ngx_cycle->log;[m
[31m-    ngx_temp_pool->log = log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycles");[m
[31m-[m
[31m-    live = 0;[m
[31m-[m
[31m-    cycle = ngx_old_cycles.elts;[m
[31m-    for (i = 0; i < ngx_old_cycles.nelts; i++) {[m
[31m-[m
[31m-        if (cycle[i] == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        found = 0;[m
[31m-[m
[31m-        for (n = 0; n < cycle[i]->connection_n; n++) {[m
[31m-            if (cycle[i]->connections[n].fd != (ngx_socket_t) -1) {[m
[31m-                found = 1;[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "live fd:%ui", n);[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (found) {[m
[31m-            live = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycle: %ui", i);[m
[31m-[m
[31m-        ngx_destroy_pool(cycle[i]->pool);[m
[31m-        cycle[i] = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "old cycles status: %ui", live);[m
[31m-[m
[31m-    if (live) {[m
[31m-        ngx_add_timer(ev, 30000);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_destroy_pool(ngx_temp_pool);[m
[31m-        ngx_temp_pool = NULL;[m
[31m-        ngx_old_cycles.nelts = 0;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cycle.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cycle.h[m
[1mdeleted file mode 100644[m
[1mindex c51b7ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_cycle.h[m
[1m+++ /dev/null[m
[36m@@ -1,137 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CYCLE_H_INCLUDED_[m
[31m-#define _NGX_CYCLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_CYCLE_POOL_SIZE[m
[31m-#define NGX_CYCLE_POOL_SIZE     NGX_DEFAULT_POOL_SIZE[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_DEBUG_POINTS_STOP   1[m
[31m-#define NGX_DEBUG_POINTS_ABORT  2[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_shm_zone_s  ngx_shm_zone_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone, void *data);[m
[31m-[m
[31m-struct ngx_shm_zone_s {[m
[31m-    void                     *data;[m
[31m-    ngx_shm_t                 shm;[m
[31m-    ngx_shm_zone_init_pt      init;[m
[31m-    void                     *tag;[m
[31m-    ngx_uint_t                noreuse;  /* unsigned  noreuse:1; */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_cycle_s {[m
[31m-    void                  ****conf_ctx;[m
[31m-    ngx_pool_t               *pool;[m
[31m-[m
[31m-    ngx_log_t                *log;[m
[31m-    ngx_log_t                 new_log;[m
[31m-[m
[31m-    ngx_uint_t                log_use_stderr;  /* unsigned  log_use_stderr:1; */[m
[31m-[m
[31m-    ngx_connection_t        **files;[m
[31m-    ngx_connection_t         *free_connections;[m
[31m-    ngx_uint_t                free_connection_n;[m
[31m-[m
[31m-    ngx_module_t            **modules;[m
[31m-    ngx_uint_t                modules_n;[m
[31m-    ngx_uint_t                modules_used;    /* unsigned  modules_used:1; */[m
[31m-[m
[31m-    ngx_queue_t               reusable_connections_queue;[m
[31m-[m
[31m-    ngx_array_t               listening;[m
[31m-    ngx_array_t               paths;[m
[31m-    ngx_array_t               config_dump;[m
[31m-    ngx_list_t                open_files;[m
[31m-    ngx_list_t                shared_memory;[m
[31m-[m
[31m-    ngx_uint_t                connection_n;[m
[31m-    ngx_uint_t                files_n;[m
[31m-[m
[31m-    ngx_connection_t         *connections;[m
[31m-    ngx_event_t              *read_events;[m
[31m-    ngx_event_t              *write_events;[m
[31m-[m
[31m-    ngx_cycle_t              *old_cycle;[m
[31m-[m
[31m-    ngx_str_t                 conf_file;[m
[31m-    ngx_str_t                 conf_param;[m
[31m-    ngx_str_t                 conf_prefix;[m
[31m-    ngx_str_t                 prefix;[m
[31m-    ngx_str_t                 lock_file;[m
[31m-    ngx_str_t                 hostname;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t                daemon;[m
[31m-    ngx_flag_t                master;[m
[31m-[m
[31m-    ngx_msec_t                timer_resolution;[m
[31m-[m
[31m-    ngx_int_t                 worker_processes;[m
[31m-    ngx_int_t                 debug_points;[m
[31m-[m
[31m-    ngx_int_t                 rlimit_nofile;[m
[31m-    off_t                     rlimit_core;[m
[31m-[m
[31m-    int                       priority;[m
[31m-[m
[31m-    ngx_uint_t                cpu_affinity_auto;[m
[31m-    ngx_uint_t                cpu_affinity_n;[m
[31m-    ngx_cpuset_t             *cpu_affinity;[m
[31m-[m
[31m-    char                     *username;[m
[31m-    ngx_uid_t                 user;[m
[31m-    ngx_gid_t                 group;[m
[31m-[m
[31m-    ngx_str_t                 working_directory;[m
[31m-    ngx_str_t                 lock_file;[m
[31m-[m
[31m-    ngx_str_t                 pid;[m
[31m-    ngx_str_t                 oldpid;[m
[31m-[m
[31m-    ngx_array_t               env;[m
[31m-    char                    **environment;[m
[31m-} ngx_core_conf_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_is_init_cycle(cycle)  (cycle->conf_ctx == NULL)[m
[31m-[m
[31m-[m
[31m-ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);[m
[31m-ngx_int_t ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log);[m
[31m-void ngx_delete_pidfile(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_signal_process(ngx_cycle_t *cycle, char *sig);[m
[31m-void ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user);[m
[31m-char **ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last);[m
[31m-ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv);[m
[31m-ngx_cpuset_t *ngx_get_cpu_affinity(ngx_uint_t n);[m
[31m-ngx_shm_zone_t *ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name,[m
[31m-    size_t size, void *tag);[m
[31m-[m
[31m-[m
[31m-extern volatile ngx_cycle_t  *ngx_cycle;[m
[31m-extern ngx_array_t            ngx_old_cycles;[m
[31m-extern ngx_module_t           ngx_core_module;[m
[31m-extern ngx_uint_t             ngx_test_config;[m
[31m-extern ngx_uint_t             ngx_dump_config;[m
[31m-extern ngx_uint_t             ngx_quiet_mode;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CYCLE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_file.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_file.c[m
[1mdeleted file mode 100644[m
[1mindex fc2dfd3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_file.c[m
[1m+++ /dev/null[m
[36m@@ -1,1102 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_test_full_name(ngx_str_t *name);[m
[31m-[m
[31m-[m
[31m-static ngx_atomic_t   temp_number = 0;[m
[31m-ngx_atomic_t         *ngx_temp_number = &temp_number;[m
[31m-ngx_atomic_int_t      ngx_random_number = 123456;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix, ngx_str_t *name)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    u_char     *p, *n;[m
[31m-    ngx_int_t   rc;[m
[31m-[m
[31m-    rc = ngx_test_full_name(name);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    len = prefix->len;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-    if (rc == 2) {[m
[31m-        len = rc;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = ngx_pnalloc(pool, len + name->len + 1);[m
[31m-    if (n == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(n, prefix->data, len);[m
[31m-    ngx_cpystrn(p, name->data, name->len + 1);[m
[31m-[m
[31m-    name->len += len;[m
[31m-    name->data = n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_test_full_name(ngx_str_t *name)[m
[31m-{[m
[31m-#if (NGX_WIN32)[m
[31m-    u_char  c0, c1;[m
[31m-[m
[31m-    c0 = name->data[0];[m
[31m-[m
[31m-    if (name->len < 2) {[m
[31m-        if (c0 == '/') {[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    c1 = name->data[1];[m
[31m-[m
[31m-    if (c1 == ':') {[m
[31m-        c0 |= 0x20;[m
[31m-[m
[31m-        if ((c0 >= 'a' && c0 <= 'z')) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (c1 == '/') {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c0 == '/') {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (name->data[0] == '/') {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (tf->file.fd == NGX_INVALID_FILE) {[m
[31m-        rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                  tf->persistent, tf->clean, tf->access);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (tf->log_level) {[m
[31m-            ngx_log_error(tf->log_level, tf->file.log, 0, "%s %V",[m
[31m-                          tf->warn, &tf->file.name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS && NGX_HAVE_PWRITEV)[m
[31m-[m
[31m-    if (tf->thread_write) {[m
[31m-        return ngx_thread_write_chain_to_file(&tf->file, chain, tf->offset,[m
[31m-                                              tf->pool);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_write_chain_to_file(&tf->file, chain, tf->offset, tf->pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool,[m
[31m-    ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access)[m
[31m-{[m
[31m-    uint32_t                  n;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_pool_cleanup_t       *cln;[m
[31m-    ngx_pool_cleanup_file_t  *clnf;[m
[31m-[m
[31m-    file->name.len = path->name.len + 1 + path->len + 10;[m
[31m-[m
[31m-    file->name.data = ngx_pnalloc(pool, file->name.len + 1);[m
[31m-    if (file->name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    for (i = 0; i < file->name.len; i++) {[m
[31m-        file->name.data[i] = 'X';[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memcpy(file->name.data, path->name.data, path->name.len);[m
[31m-[m
[31m-    n = (uint32_t) ngx_next_temp_number(0);[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        (void) ngx_sprintf(file->name.data + path->name.len + 1 + path->len,[m
[31m-                           "%010uD%Z", n);[m
[31m-[m
[31m-        ngx_create_hashed_filename(path, file->name.data, file->name.len);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                       "hashed path: %s", file->name.data);[m
[31m-[m
[31m-        file->fd = ngx_open_tempfile(file->name.data, persistent, access);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                       "temp fd:%d", file->fd);[m
[31m-[m
[31m-        if (file->fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-            cln->handler = clean ? ngx_pool_delete_file : ngx_pool_cleanup_file;[m
[31m-            clnf = cln->data;[m
[31m-[m
[31m-            clnf->fd = file->fd;[m
[31m-            clnf->name = file->name.data;[m
[31m-            clnf->log = pool->log;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_EEXIST_FILE) {[m
[31m-            n = (uint32_t) ngx_next_temp_number(1);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((path->level[0] == 0) || (err != NGX_ENOPATH)) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                          ngx_open_tempfile_n " \"%s\" failed",[m
[31m-                          file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_create_path(file, path) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len)[m
[31m-{[m
[31m-    size_t      i, level;[m
[31m-    ngx_uint_t  n;[m
[31m-[m
[31m-    i = path->name.len + 1;[m
[31m-[m
[31m-    file[path->name.len + path->len]  = '/';[m
[31m-[m
[31m-    for (n = 0; n < 3; n++) {[m
[31m-        level = path->level[n];[m
[31m-[m
[31m-        if (level == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        len -= level;[m
[31m-        file[i - 1] = '/';[m
[31m-        ngx_memcpy(&file[i], &file[len], level);[m
[31m-        i += level + 1;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_path(ngx_file_t *file, ngx_path_t *path)[m
[31m-{[m
[31m-    size_t      pos;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    pos = path->name.len;[m
[31m-[m
[31m-    for (i = 0; i < 3; i++) {[m
[31m-        if (path->level[i] == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        pos += path->level[i] + 1;[m
[31m-[m
[31m-        file->name.data[pos] = '\0';[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                       "temp file: \"%s\"", file->name.data);[m
[31m-[m
[31m-        if (ngx_create_dir(file->name.data, 0700) == NGX_FILE_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-            if (err != NGX_EEXIST) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                              ngx_create_dir_n " \"%s\" failed",[m
[31m-                              file->name.data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        file->name.data[pos] = '/';[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_create_full_path(u_char *dir, ngx_uint_t access)[m
[31m-{[m
[31m-    u_char     *p, ch;[m
[31m-    ngx_err_t   err;[m
[31m-[m
[31m-    err = 0;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    p = dir + 3;[m
[31m-#else[m
[31m-    p = dir + 1;[m
[31m-#endif[m
[31m-[m
[31m-    for ( /* void */ ; *p; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        if (ch != '/') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        if (ngx_create_dir(dir, access) == NGX_FILE_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            switch (err) {[m
[31m-            case NGX_EEXIST:[m
[31m-                err = 0;[m
[31m-            case NGX_EACCES:[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return err;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *p = '/';[m
[31m-    }[m
[31m-[m
[31m-    return err;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_next_temp_number(ngx_uint_t collision)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  n, add;[m
[31m-[m
[31m-    add = collision ? ngx_random_number : 1;[m
[31m-[m
[31m-    n = ngx_atomic_fetch_add(ngx_temp_number, add);[m
[31m-[m
[31m-    return n + add;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ssize_t      level;[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_uint_t   i, n;[m
[31m-    ngx_path_t  *path, **slot;[m
[31m-[m
[31m-    slot = (ngx_path_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*slot) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));[m
[31m-    if (path == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    path->name = value[1];[m
[31m-[m
[31m-    if (path->name.data[path->name.len - 1] == '/') {[m
[31m-        path->name.len--;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &path->name, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    path->conf_file = cf->conf_file->file.name.data;[m
[31m-    path->line = cf->conf_file->line;[m
[31m-[m
[31m-    for (i = 0, n = 2; n < cf->args->nelts; i++, n++) {[m
[31m-        level = ngx_atoi(value[n].data, value[n].len);[m
[31m-        if (level == NGX_ERROR || level == 0) {[m
[31m-            return "invalid value";[m
[31m-        }[m
[31m-[m
[31m-        path->level[i] = level;[m
[31m-        path->len += level + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (path->len > 10 + i) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    *slot = path;[m
[31m-[m
[31m-    if (ngx_add_path(cf, slot) == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path, ngx_path_t *prev,[m
[31m-    ngx_path_init_t *init)[m
[31m-{[m
[31m-    if (*path) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (prev) {[m
[31m-        *path = prev;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    *path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));[m
[31m-    if (*path == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (*path)->name = init->name;[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &(*path)->name, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (*path)->level[0] = init->level[0];[m
[31m-    (*path)->level[1] = init->level[1];[m
[31m-    (*path)->level[2] = init->level[2];[m
[31m-[m
[31m-    (*path)->len = init->level[0] + (init->level[0] ? 1 : 0)[m
[31m-                   + init->level[1] + (init->level[1] ? 1 : 0)[m
[31m-                   + init->level[2] + (init->level[2] ? 1 : 0);[m
[31m-[m
[31m-    if (ngx_add_path(cf, path) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *confp = conf;[m
[31m-[m
[31m-    u_char      *p;[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_uint_t   i, right, shift, *access;[m
[31m-[m
[31m-    access = (ngx_uint_t *) (confp + cmd->offset);[m
[31m-[m
[31m-    if (*access != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *access = 0600;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        p = value[i].data;[m
[31m-[m
[31m-        if (ngx_strncmp(p, "user:", sizeof("user:") - 1) == 0) {[m
[31m-            shift = 6;[m
[31m-            p += sizeof("user:") - 1;[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "group:", sizeof("group:") - 1) == 0) {[m
[31m-            shift = 3;[m
[31m-            p += sizeof("group:") - 1;[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "all:", sizeof("all:") - 1) == 0) {[m
[31m-            shift = 0;[m
[31m-            p += sizeof("all:") - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(p, "rw") == 0) {[m
[31m-            right = 6;[m
[31m-[m
[31m-        } else if (ngx_strcmp(p, "r") == 0) {[m
[31m-            right = 4;[m
[31m-[m
[31m-        } else {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        *access |= right << shift;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid value \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot)[m
[31m-{[m
[31m-    ngx_uint_t   i, n;[m
[31m-    ngx_path_t  *path, **p;[m
[31m-[m
[31m-    path = *slot;[m
[31m-[m
[31m-    p = cf->cycle->paths.elts;[m
[31m-    for (i = 0; i < cf->cycle->paths.nelts; i++) {[m
[31m-        if (p[i]->name.len == path->name.len[m
[31m-            && ngx_strcmp(p[i]->name.data, path->name.data) == 0)[m
[31m-        {[m
[31m-            if (p[i]->data != path->data) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the same path name \"%V\" "[m
[31m-                                   "used in %s:%ui and",[m
[31m-                                   &p[i]->name, p[i]->conf_file, p[i]->line);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            for (n = 0; n < 3; n++) {[m
[31m-                if (p[i]->level[n] != path->level[n]) {[m
[31m-                    if (path->conf_file == NULL) {[m
[31m-                        if (p[i]->conf_file == NULL) {[m
[31m-                            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                                      "the default path name \"%V\" has "[m
[31m-                                      "the same name as another default path, "[m
[31m-                                      "but the different levels, you need to "[m
[31m-                                      "redefine one of them in http section",[m
[31m-                                      &p[i]->name);[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                                      "the path name \"%V\" in %s:%ui has "[m
[31m-                                      "the same name as default path, but "[m
[31m-                                      "the different levels, you need to "[m
[31m-                                      "define default path in http section",[m
[31m-                                      &p[i]->name, p[i]->conf_file, p[i]->line);[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                      "the same path name \"%V\" in %s:%ui "[m
[31m-                                      "has the different levels than",[m
[31m-                                      &p[i]->name, p[i]->conf_file, p[i]->line);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (p[i]->level[n] == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            *slot = p[i];[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_array_push(&cf->cycle->paths);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *p = path;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user)[m
[31m-{[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_path_t      **path;[m
[31m-[m
[31m-    path = cycle->paths.elts;[m
[31m-    for (i = 0; i < cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_create_dir(path[i]->name.data, 0700) == NGX_FILE_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-            if (err != NGX_EEXIST) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, err,[m
[31m-                              ngx_create_dir_n " \"%s\" failed",[m
[31m-                              path[i]->name.data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (user == (ngx_uid_t) NGX_CONF_UNSET_UINT) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-        {[m
[31m-        ngx_file_info_t   fi;[m
[31m-[m
[31m-        if (ngx_file_info((const char *) path[i]->name.data, &fi)[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          ngx_file_info_n " \"%s\" failed", path[i]->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (fi.st_uid != user) {[m
[31m-            if (chown((const char *) path[i]->name.data, user, -1) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                              "chown(\"%s\", %d) failed",[m
[31m-                              path[i]->name.data, user);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if ((fi.st_mode & (S_IRUSR|S_IWUSR|S_IXUSR))[m
[31m-                                                  != (S_IRUSR|S_IWUSR|S_IXUSR))[m
[31m-        {[m
[31m-            fi.st_mode |= (S_IRUSR|S_IWUSR|S_IXUSR);[m
[31m-[m
[31m-            if (chmod((const char *) path[i]->name.data, fi.st_mode) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                              "chmod() \"%s\" failed", path[i]->name.data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to, ngx_ext_rename_file_t *ext)[m
[31m-{[m
[31m-    u_char           *name;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_copy_file_t   cf;[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-    if (ext->access) {[m
[31m-        if (ngx_change_file_access(src->data, ext->access) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                          ngx_change_file_access_n " \"%s\" failed", src->data);[m
[31m-            err = 0;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ext->time != -1) {[m
[31m-        if (ngx_set_file_time(src->data, ext->fd, ext->time) != NGX_OK) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                          ngx_set_file_time_n " \"%s\" failed", src->data);[m
[31m-            err = 0;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    if (err == NGX_ENOPATH) {[m
[31m-[m
[31m-        if (!ext->create_path) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_create_full_path(to->data, ngx_dir_access(ext->path_access));[m
[31m-[m
[31m-        if (err) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, err,[m
[31m-                          ngx_create_dir_n " \"%s\" failed", to->data);[m
[31m-            err = 0;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-    if (err == NGX_EEXIST || err == NGX_EEXIST_FILE) {[m
[31m-        err = ngx_win32_rename_file(src, to, ext->log);[m
[31m-[m
[31m-        if (err == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (err == NGX_EXDEV) {[m
[31m-[m
[31m-        cf.size = -1;[m
[31m-        cf.buf_size = 0;[m
[31m-        cf.access = ext->access;[m
[31m-        cf.time = ext->time;[m
[31m-        cf.log = ext->log;[m
[31m-[m
[31m-        name = ngx_alloc(to->len + 1 + 10 + 1, ext->log);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_sprintf(name, "%*s.%010uD%Z", to->len, to->data,[m
[31m-                           (uint32_t) ngx_next_temp_number(0));[m
[31m-[m
[31m-        if (ngx_copy_file(src->data, name, &cf) == NGX_OK) {[m
[31m-[m
[31m-            if (ngx_rename_file(name, to->data) != NGX_FILE_ERROR) {[m
[31m-                ngx_free(name);[m
[31m-[m
[31m-                if (ngx_delete_file(src->data) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                                  ngx_delete_file_n " \"%s\" failed",[m
[31m-                                  src->data);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                          ngx_rename_file_n " \"%s\" to \"%s\" failed",[m
[31m-                          name, to->data);[m
[31m-[m
[31m-            if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                              ngx_delete_file_n " \"%s\" failed", name);[m
[31m-[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_free(name);[m
[31m-[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ext->delete_file) {[m
[31m-        if (ngx_delete_file(src->data) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,[m
[31m-                          ngx_delete_file_n " \"%s\" failed", src->data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ext->log, err,[m
[31m-                      ngx_rename_file_n " \"%s\" to \"%s\" failed",[m
[31m-                      src->data, to->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_copy_file(u_char *from, u_char *to, ngx_copy_file_t *cf)[m
[31m-{[m
[31m-    char             *buf;[m
[31m-    off_t             size;[m
[31m-    size_t            len;[m
[31m-    ssize_t           n;[m
[31m-    ngx_fd_t          fd, nfd;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_file_info_t   fi;[m
[31m-[m
[31m-    rc = NGX_ERROR;[m
[31m-    buf = NULL;[m
[31m-    nfd = NGX_INVALID_FILE;[m
[31m-[m
[31m-    fd = ngx_open_file(from, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", from);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->size != -1) {[m
[31m-        size = cf->size;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_fd_info_n " \"%s\" failed", from);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        size = ngx_file_size(&fi);[m
[31m-    }[m
[31m-[m
[31m-    len = cf->buf_size ? cf->buf_size : 65536;[m
[31m-[m
[31m-    if ((off_t) len > size) {[m
[31m-        len = (size_t) size;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_alloc(len, cf->log);[m
[31m-    if (buf == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    nfd = ngx_open_file(to, NGX_FILE_WRONLY, NGX_FILE_CREATE_OR_OPEN,[m
[31m-                        cf->access);[m
[31m-[m
[31m-    if (nfd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", to);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    while (size > 0) {[m
[31m-[m
[31m-        if ((off_t) len > size) {[m
[31m-            len = (size_t) size;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_read_fd(fd, buf, len);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_read_fd_n " \"%s\" failed", from);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) n != len) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, 0,[m
[31m-                          ngx_read_fd_n " has read only %z of %O from %s",[m
[31m-                          n, size, from);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_write_fd(nfd, buf, len);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_write_fd_n " \"%s\" failed", to);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) n != len) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, 0,[m
[31m-                          ngx_write_fd_n " has written only %z of %O to %s",[m
[31m-                          n, size, to);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        size -= n;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->time != -1) {[m
[31m-        if (ngx_set_file_time(to, nfd, cf->time) != NGX_OK) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_set_file_time_n " \"%s\" failed", to);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (nfd != NGX_INVALID_FILE) {[m
[31m-        if (ngx_close_file(nfd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", to);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (fd != NGX_INVALID_FILE) {[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", from);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (buf) {[m
[31m-        ngx_free(buf);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ctx->init_handler() - see ctx->alloc[m
[31m- * ctx->file_handler() - file handler[m
[31m- * ctx->pre_tree_handler() - handler is called before entering directory[m
[31m- * ctx->post_tree_handler() - handler is called after leaving directory[m
[31m- * ctx->spec_handler() - special (socket, FIFO, etc.) file handler[m
[31m- *[m
[31m- * ctx->data - some data structure, it may be the same on all levels, or[m
[31m- *     reallocated if ctx->alloc is nonzero[m
[31m- *[m
[31m- * ctx->alloc - a size of data structure that is allocated at every level[m
[31m- *     and is initialized by ctx->init_handler()[m
[31m- *[m
[31m- * ctx->log - a log[m
[31m- *[m
[31m- * on fatal (memory) error handler must return NGX_ABORT to stop walking tree[m
[31m- */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree)[m
[31m-{[m
[31m-    void       *data, *prev;[m
[31m-    u_char     *p, *name;[m
[31m-    size_t      len;[m
[31m-    ngx_int_t   rc;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_str_t   file, buf;[m
[31m-    ngx_dir_t   dir;[m
[31m-[m
[31m-    ngx_str_null(&buf);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                   "walk tree \"%V\"", tree);[m
[31m-[m
[31m-    if (ngx_open_dir(tree, &dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,[m
[31m-                      ngx_open_dir_n " \"%s\" failed", tree->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    prev = ctx->data;[m
[31m-[m
[31m-    if (ctx->alloc) {[m
[31m-        data = ngx_alloc(ctx->alloc, ctx->log);[m
[31m-        if (data == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->init_handler(data, prev) == NGX_ABORT) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ctx->data = data;[m
[31m-[m
[31m-    } else {[m
[31m-        data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        ngx_set_errno(0);[m
[31m-[m
[31m-        if (ngx_read_dir(&dir) == NGX_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_ENOMOREFILES) {[m
[31m-                rc = NGX_OK;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, ctx->log, err,[m
[31m-                              ngx_read_dir_n " \"%s\" failed", tree->data);[m
[31m-                rc = NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_de_namelen(&dir);[m
[31m-        name = ngx_de_name(&dir);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                      "tree name %uz:\"%s\"", len, name);[m
[31m-[m
[31m-        if (len == 1 && name[0] == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len == 2 && name[0] == '.' && name[1] == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        file.len = tree->len + 1 + len;[m
[31m-[m
[31m-        if (file.len + NGX_DIR_MASK_LEN > buf.len) {[m
[31m-[m
[31m-            if (buf.len) {[m
[31m-                ngx_free(buf.data);[m
[31m-            }[m
[31m-[m
[31m-            buf.len = tree->len + 1 + len + NGX_DIR_MASK_LEN;[m
[31m-[m
[31m-            buf.data = ngx_alloc(buf.len + 1, ctx->log);[m
[31m-            if (buf.data == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(buf.data, tree->data, tree->len);[m
[31m-        *p++ = '/';[m
[31m-        ngx_memcpy(p, name, len + 1);[m
[31m-[m
[31m-        file.data = buf.data;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                       "tree path \"%s\"", file.data);[m
[31m-[m
[31m-        if (!dir.valid_info) {[m
[31m-            if (ngx_de_info(file.data, &dir) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,[m
[31m-                              ngx_de_info_n " \"%s\" failed", file.data);[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_de_is_file(&dir)) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                           "tree file \"%s\"", file.data);[m
[31m-[m
[31m-            ctx->size = ngx_de_size(&dir);[m
[31m-            ctx->fs_size = ngx_de_fs_size(&dir);[m
[31m-            ctx->access = ngx_de_access(&dir);[m
[31m-            ctx->mtime = ngx_de_mtime(&dir);[m
[31m-[m
[31m-            if (ctx->file_handler(ctx, &file) == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-        } else if (ngx_de_is_dir(&dir)) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                           "tree enter dir \"%s\"", file.data);[m
[31m-[m
[31m-            ctx->access = ngx_de_access(&dir);[m
[31m-            ctx->mtime = ngx_de_mtime(&dir);[m
[31m-[m
[31m-            rc = ctx->pre_tree_handler(ctx, &file);[m
[31m-[m
[31m-            if (rc == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                               "tree skip dir \"%s\"", file.data);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_walk_tree(ctx, &file) == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ctx->access = ngx_de_access(&dir);[m
[31m-            ctx->mtime = ngx_de_mtime(&dir);[m
[31m-[m
[31m-            if (ctx->post_tree_handler(ctx, &file) == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,[m
[31m-                           "tree special \"%s\"", file.data);[m
[31m-[m
[31m-            if (ctx->spec_handler(ctx, &file) == NGX_ABORT) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc = NGX_ABORT;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (buf.len) {[m
[31m-        ngx_free(buf.data);[m
[31m-    }[m
[31m-[m
[31m-    if (data) {[m
[31m-        ngx_free(data);[m
[31m-        ctx->data = prev;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_dir(&dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%s\" failed", tree->data);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_file.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_file.h[m
[1mdeleted file mode 100644[m
[1mindex 5f8228b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_file.h[m
[1m+++ /dev/null[m
[36m@@ -1,162 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FILE_H_INCLUDED_[m
[31m-#define _NGX_FILE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-struct ngx_file_s {[m
[31m-    ngx_fd_t                   fd;[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_file_info_t            info;[m
[31m-[m
[31m-    off_t                      offset;[m
[31m-    off_t                      sys_offset;[m
[31m-[m
[31m-    ngx_log_t                 *log;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_int_t                (*thread_handler)(ngx_thread_task_t *task,[m
[31m-                                               ngx_file_t *file);[m
[31m-    void                      *thread_ctx;[m
[31m-    ngx_thread_task_t         *thread_task;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-    ngx_event_aio_t           *aio;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                   valid_info:1;[m
[31m-    unsigned                   directio:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_PATH_LEVEL  3[m
[31m-[m
[31m-[m
[31m-typedef time_t (*ngx_path_manager_pt) (void *data);[m
[31m-typedef void (*ngx_path_loader_pt) (void *data);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  name;[m
[31m-    size_t                     len;[m
[31m-    size_t                     level[3];[m
[31m-[m
[31m-    ngx_path_manager_pt        manager;[m
[31m-    ngx_path_loader_pt         loader;[m
[31m-    void                      *data;[m
[31m-[m
[31m-    u_char                    *conf_file;[m
[31m-    ngx_uint_t                 line;[m
[31m-} ngx_path_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  name;[m
[31m-    size_t                     level[3];[m
[31m-} ngx_path_init_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_file_t                 file;[m
[31m-    off_t                      offset;[m
[31m-    ngx_path_t                *path;[m
[31m-    ngx_pool_t                *pool;[m
[31m-    char                      *warn;[m
[31m-[m
[31m-    ngx_uint_t                 access;[m
[31m-[m
[31m-    unsigned                   log_level:8;[m
[31m-    unsigned                   persistent:1;[m
[31m-    unsigned                   clean:1;[m
[31m-    unsigned                   thread_write:1;[m
[31m-} ngx_temp_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                 access;[m
[31m-    ngx_uint_t                 path_access;[m
[31m-    time_t                     time;[m
[31m-    ngx_fd_t                   fd;[m
[31m-[m
[31m-    unsigned                   create_path:1;[m
[31m-    unsigned                   delete_file:1;[m
[31m-[m
[31m-    ngx_log_t                 *log;[m
[31m-} ngx_ext_rename_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t                      size;[m
[31m-    size_t                     buf_size;[m
[31m-[m
[31m-    ngx_uint_t                 access;[m
[31m-    time_t                     time;[m
[31m-[m
[31m-    ngx_log_t                 *log;[m
[31m-} ngx_copy_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_tree_ctx_s  ngx_tree_ctx_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_tree_init_handler_pt) (void *ctx, void *prev);[m
[31m-typedef ngx_int_t (*ngx_tree_handler_pt) (ngx_tree_ctx_t *ctx, ngx_str_t *name);[m
[31m-[m
[31m-struct ngx_tree_ctx_s {[m
[31m-    off_t                      size;[m
[31m-    off_t                      fs_size;[m
[31m-    ngx_uint_t                 access;[m
[31m-    time_t                     mtime;[m
[31m-[m
[31m-    ngx_tree_init_handler_pt   init_handler;[m
[31m-    ngx_tree_handler_pt        file_handler;[m
[31m-    ngx_tree_handler_pt        pre_tree_handler;[m
[31m-    ngx_tree_handler_pt        post_tree_handler;[m
[31m-    ngx_tree_handler_pt        spec_handler;[m
[31m-[m
[31m-    void                      *data;[m
[31m-    size_t                     alloc;[m
[31m-[m
[31m-    ngx_log_t                 *log;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix,[m
[31m-    ngx_str_t *name);[m
[31m-[m
[31m-ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain);[m
[31m-ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,[m
[31m-    ngx_pool_t *pool, ngx_uint_t persistent, ngx_uint_t clean,[m
[31m-    ngx_uint_t access);[m
[31m-void ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len);[m
[31m-ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path);[m
[31m-ngx_err_t ngx_create_full_path(u_char *dir, ngx_uint_t access);[m
[31m-ngx_int_t ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot);[m
[31m-ngx_int_t ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user);[m
[31m-ngx_int_t ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to,[m
[31m-    ngx_ext_rename_file_t *ext);[m
[31m-ngx_int_t ngx_copy_file(u_char *from, u_char *to, ngx_copy_file_t *cf);[m
[31m-ngx_int_t ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree);[m
[31m-[m
[31m-ngx_atomic_uint_t ngx_next_temp_number(ngx_uint_t collision);[m
[31m-[m
[31m-char *ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path,[m
[31m-    ngx_path_t *prev, ngx_path_init_t *init);[m
[31m-char *ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-extern ngx_atomic_t      *ngx_temp_number;[m
[31m-extern ngx_atomic_int_t   ngx_random_number;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FILE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_hash.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_hash.c[m
[1mdeleted file mode 100644[m
[1mindex 151e643..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_hash.c[m
[1m+++ /dev/null[m
[36m@@ -1,989 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len)[m
[31m-{[m
[31m-    ngx_uint_t       i;[m
[31m-    ngx_hash_elt_t  *elt;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "hf:\"%*s\"", len, name);[m
[31m-#endif[m
[31m-[m
[31m-    elt = hash->buckets[key % hash->size];[m
[31m-[m
[31m-    if (elt == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    while (elt->value) {[m
[31m-        if (len != (size_t) elt->len) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            if (name[i] != elt->name[i]) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return elt->value;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        elt = (ngx_hash_elt_t *) ngx_align_ptr(&elt->name[0] + elt->len,[m
[31m-                                               sizeof(void *));[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len)[m
[31m-{[m
[31m-    void        *value;[m
[31m-    ngx_uint_t   i, n, key;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "wch:\"%*s\"", len, name);[m
[31m-#endif[m
[31m-[m
[31m-    n = len;[m
[31m-[m
[31m-    while (n) {[m
[31m-        if (name[n - 1] == '.') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        n--;[m
[31m-    }[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = n; i < len; i++) {[m
[31m-        key = ngx_hash(key, name[i]);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "key:\"%ui\"", key);[m
[31m-#endif[m
[31m-[m
[31m-    value = ngx_hash_find(&hwc->hash, key, &name[n], len - n);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "value:\"%p\"", value);[m
[31m-#endif[m
[31m-[m
[31m-    if (value) {[m
[31m-[m
[31m-        /*[m
[31m-         * the 2 low bits of value have the special meaning:[m
[31m-         *     00 - value is data pointer for both "example.com"[m
[31m-         *          and "*.example.com";[m
[31m-         *     01 - value is data pointer for "*.example.com" only;[m
[31m-         *     10 - value is pointer to wildcard hash allowing[m
[31m-         *          both "example.com" and "*.example.com";[m
[31m-         *     11 - value is pointer to wildcard hash allowing[m
[31m-         *          "*.example.com" only.[m
[31m-         */[m
[31m-[m
[31m-        if ((uintptr_t) value & 2) {[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-[m
[31m-                /* "example.com" */[m
[31m-[m
[31m-                if ((uintptr_t) value & 1) {[m
[31m-                    return NULL;[m
[31m-                }[m
[31m-[m
[31m-                hwc = (ngx_hash_wildcard_t *)[m
[31m-                                          ((uintptr_t) value & (uintptr_t) ~3);[m
[31m-                return hwc->value;[m
[31m-            }[m
[31m-[m
[31m-            hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3);[m
[31m-[m
[31m-            value = ngx_hash_find_wc_head(hwc, name, n - 1);[m
[31m-[m
[31m-            if (value) {[m
[31m-                return value;[m
[31m-            }[m
[31m-[m
[31m-            return hwc->value;[m
[31m-        }[m
[31m-[m
[31m-        if ((uintptr_t) value & 1) {[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-[m
[31m-                /* "example.com" */[m
[31m-[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            return (void *) ((uintptr_t) value & (uintptr_t) ~3);[m
[31m-        }[m
[31m-[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    return hwc->value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len)[m
[31m-{[m
[31m-    void        *value;[m
[31m-    ngx_uint_t   i, key;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "wct:\"%*s\"", len, name);[m
[31m-#endif[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        if (name[i] == '.') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        key = ngx_hash(key, name[i]);[m
[31m-    }[m
[31m-[m
[31m-    if (i == len) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "key:\"%ui\"", key);[m
[31m-#endif[m
[31m-[m
[31m-    value = ngx_hash_find(&hwc->hash, key, name, i);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "value:\"%p\"", value);[m
[31m-#endif[m
[31m-[m
[31m-    if (value) {[m
[31m-[m
[31m-        /*[m
[31m-         * the 2 low bits of value have the special meaning:[m
[31m-         *     00 - value is data pointer;[m
[31m-         *     11 - value is pointer to wildcard hash allowing "example.*".[m
[31m-         */[m
[31m-[m
[31m-        if ((uintptr_t) value & 2) {[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3);[m
[31m-[m
[31m-            value = ngx_hash_find_wc_tail(hwc, &name[i], len - i);[m
[31m-[m
[31m-            if (value) {[m
[31m-                return value;[m
[31m-            }[m
[31m-[m
[31m-            return hwc->value;[m
[31m-        }[m
[31m-[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    return hwc->value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key, u_char *name,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    void  *value;[m
[31m-[m
[31m-    if (hash->hash.buckets) {[m
[31m-        value = ngx_hash_find(&hash->hash, key, name, len);[m
[31m-[m
[31m-        if (value) {[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (hash->wc_head && hash->wc_head->hash.buckets) {[m
[31m-        value = ngx_hash_find_wc_head(hash->wc_head, name, len);[m
[31m-[m
[31m-        if (value) {[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (hash->wc_tail && hash->wc_tail->hash.buckets) {[m
[31m-        value = ngx_hash_find_wc_tail(hash->wc_tail, name, len);[m
[31m-[m
[31m-        if (value) {[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define NGX_HASH_ELT_SIZE(name)                                               \[m
[31m-    (sizeof(void *) + ngx_align((name)->key.len + 2, sizeof(void *)))[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts)[m
[31m-{[m
[31m-    u_char          *elts;[m
[31m-    size_t           len;[m
[31m-    u_short         *test;[m
[31m-    ngx_uint_t       i, n, key, size, start, bucket_size;[m
[31m-    ngx_hash_elt_t  *elt, **buckets;[m
[31m-[m
[31m-    if (hinit->max_size == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,[m
[31m-                      "could not build %s, you should "[m
[31m-                      "increase %s_max_size: %i",[m
[31m-                      hinit->name, hinit->name, hinit->max_size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < nelts; n++) {[m
[31m-        if (hinit->bucket_size < NGX_HASH_ELT_SIZE(&names[n]) + sizeof(void *))[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,[m
[31m-                          "could not build %s, you should "[m
[31m-                          "increase %s_bucket_size: %i",[m
[31m-                          hinit->name, hinit->name, hinit->bucket_size);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    test = ngx_alloc(hinit->max_size * sizeof(u_short), hinit->pool->log);[m
[31m-    if (test == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bucket_size = hinit->bucket_size - sizeof(void *);[m
[31m-[m
[31m-    start = nelts / (bucket_size / (2 * sizeof(void *)));[m
[31m-    start = start ? start : 1;[m
[31m-[m
[31m-    if (hinit->max_size > 10000 && nelts && hinit->max_size / nelts < 100) {[m
[31m-        start = hinit->max_size - 1000;[m
[31m-    }[m
[31m-[m
[31m-    for (size = start; size <= hinit->max_size; size++) {[m
[31m-[m
[31m-        ngx_memzero(test, size * sizeof(u_short));[m
[31m-[m
[31m-        for (n = 0; n < nelts; n++) {[m
[31m-            if (names[n].key.data == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            key = names[n].key_hash % size;[m
[31m-            test[key] = (u_short) (test[key] + NGX_HASH_ELT_SIZE(&names[n]));[m
[31m-[m
[31m-#if 0[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "%ui: %ui %ui \"%V\"",[m
[31m-                          size, key, test[key], &names[n].key);[m
[31m-#endif[m
[31m-[m
[31m-            if (test[key] > (u_short) bucket_size) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto found;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    size = hinit->max_size;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_WARN, hinit->pool->log, 0,[m
[31m-                  "could not build optimal %s, you should increase "[m
[31m-                  "either %s_max_size: %i or %s_bucket_size: %i; "[m
[31m-                  "ignoring %s_bucket_size",[m
[31m-                  hinit->name, hinit->name, hinit->max_size,[m
[31m-                  hinit->name, hinit->bucket_size, hinit->name);[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        test[i] = sizeof(void *);[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < nelts; n++) {[m
[31m-        if (names[n].key.data == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        key = names[n].key_hash % size;[m
[31m-        test[key] = (u_short) (test[key] + NGX_HASH_ELT_SIZE(&names[n]));[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        if (test[i] == sizeof(void *)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        test[i] = (u_short) (ngx_align(test[i], ngx_cacheline_size));[m
[31m-[m
[31m-        len += test[i];[m
[31m-    }[m
[31m-[m
[31m-    if (hinit->hash == NULL) {[m
[31m-        hinit->hash = ngx_pcalloc(hinit->pool, sizeof(ngx_hash_wildcard_t)[m
[31m-                                             + size * sizeof(ngx_hash_elt_t *));[m
[31m-        if (hinit->hash == NULL) {[m
[31m-            ngx_free(test);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buckets = (ngx_hash_elt_t **)[m
[31m-                      ((u_char *) hinit->hash + sizeof(ngx_hash_wildcard_t));[m
[31m-[m
[31m-    } else {[m
[31m-        buckets = ngx_pcalloc(hinit->pool, size * sizeof(ngx_hash_elt_t *));[m
[31m-        if (buckets == NULL) {[m
[31m-            ngx_free(test);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    elts = ngx_palloc(hinit->pool, len + ngx_cacheline_size);[m
[31m-    if (elts == NULL) {[m
[31m-        ngx_free(test);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    elts = ngx_align_ptr(elts, ngx_cacheline_size);[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        if (test[i] == sizeof(void *)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        buckets[i] = (ngx_hash_elt_t *) elts;[m
[31m-        elts += test[i];[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        test[i] = 0;[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < nelts; n++) {[m
[31m-        if (names[n].key.data == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        key = names[n].key_hash % size;[m
[31m-        elt = (ngx_hash_elt_t *) ((u_char *) buckets[key] + test[key]);[m
[31m-[m
[31m-        elt->value = names[n].value;[m
[31m-        elt->len = (u_short) names[n].key.len;[m
[31m-[m
[31m-        ngx_strlow(elt->name, names[n].key.data, names[n].key.len);[m
[31m-[m
[31m-        test[key] = (u_short) (test[key] + NGX_HASH_ELT_SIZE(&names[n]));[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        if (buckets[i] == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        elt = (ngx_hash_elt_t *) ((u_char *) buckets[i] + test[i]);[m
[31m-[m
[31m-        elt->value = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(test);[m
[31m-[m
[31m-    hinit->hash->buckets = buckets;[m
[31m-    hinit->hash->size = size;[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-        ngx_str_t   val;[m
[31m-        ngx_uint_t  key;[m
[31m-[m
[31m-        elt = buckets[i];[m
[31m-[m
[31m-        if (elt == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "%ui: NULL", i);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        while (elt->value) {[m
[31m-            val.len = elt->len;[m
[31m-            val.data = &elt->name[0];[m
[31m-[m
[31m-            key = hinit->key(val.data, val.len);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "%ui: %p \"%V\" %ui", i, elt, &val, key);[m
[31m-[m
[31m-            elt = (ngx_hash_elt_t *) ngx_align_ptr(&elt->name[0] + elt->len,[m
[31m-                                                   sizeof(void *));[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,[m
[31m-    ngx_uint_t nelts)[m
[31m-{[m
[31m-    size_t                len, dot_len;[m
[31m-    ngx_uint_t            i, n, dot;[m
[31m-    ngx_array_t           curr_names, next_names;[m
[31m-    ngx_hash_key_t       *name, *next_name;[m
[31m-    ngx_hash_init_t       h;[m
[31m-    ngx_hash_wildcard_t  *wdc;[m
[31m-[m
[31m-    if (ngx_array_init(&curr_names, hinit->temp_pool, nelts,[m
[31m-                       sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&next_names, hinit->temp_pool, nelts,[m
[31m-                       sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < nelts; n = i) {[m
[31m-[m
[31m-#if 0[m
[31m-        ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                      "wc0: \"%V\"", &names[n].key);[m
[31m-#endif[m
[31m-[m
[31m-        dot = 0;[m
[31m-[m
[31m-        for (len = 0; len < names[n].key.len; len++) {[m
[31m-            if (names[n].key.data[len] == '.') {[m
[31m-                dot = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        name = ngx_array_push(&curr_names);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name->key.len = len;[m
[31m-        name->key.data = names[n].key.data;[m
[31m-        name->key_hash = hinit->key(name->key.data, name->key.len);[m
[31m-        name->value = names[n].value;[m
[31m-[m
[31m-#if 0[m
[31m-        ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                      "wc1: \"%V\" %ui", &name->key, dot);[m
[31m-#endif[m
[31m-[m
[31m-        dot_len = len + 1;[m
[31m-[m
[31m-        if (dot) {[m
[31m-            len++;[m
[31m-        }[m
[31m-[m
[31m-        next_names.nelts = 0;[m
[31m-[m
[31m-        if (names[n].key.len != len) {[m
[31m-            next_name = ngx_array_push(&next_names);[m
[31m-            if (next_name == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            next_name->key.len = names[n].key.len - len;[m
[31m-            next_name->key.data = names[n].key.data + len;[m
[31m-            next_name->key_hash = 0;[m
[31m-            next_name->value = names[n].value;[m
[31m-[m
[31m-#if 0[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "wc2: \"%V\"", &next_name->key);[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        for (i = n + 1; i < nelts; i++) {[m
[31m-            if (ngx_strncmp(names[n].key.data, names[i].key.data, len) != 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (!dot[m
[31m-                && names[i].key.len > len[m
[31m-                && names[i].key.data[len] != '.')[m
[31m-            {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            next_name = ngx_array_push(&next_names);[m
[31m-            if (next_name == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            next_name->key.len = names[i].key.len - dot_len;[m
[31m-            next_name->key.data = names[i].key.data + dot_len;[m
[31m-            next_name->key_hash = 0;[m
[31m-            next_name->value = names[i].value;[m
[31m-[m
[31m-#if 0[m
[31m-            ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,[m
[31m-                          "wc3: \"%V\"", &next_name->key);[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (next_names.nelts) {[m
[31m-[m
[31m-            h = *hinit;[m
[31m-            h.hash = NULL;[m
[31m-[m
[31m-            if (ngx_hash_wildcard_init(&h, (ngx_hash_key_t *) next_names.elts,[m
[31m-                                       next_names.nelts)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            wdc = (ngx_hash_wildcard_t *) h.hash;[m
[31m-[m
[31m-            if (names[n].key.len == len) {[m
[31m-                wdc->value = names[n].value;[m
[31m-            }[m
[31m-[m
[31m-            name->value = (void *) ((uintptr_t) wdc | (dot ? 3 : 2));[m
[31m-[m
[31m-        } else if (dot) {[m
[31m-            name->value = (void *) ((uintptr_t) name->value | 1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_hash_init(hinit, (ngx_hash_key_t *) curr_names.elts,[m
[31m-                      curr_names.nelts)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_hash_key(u_char *data, size_t len)[m
[31m-{[m
[31m-    ngx_uint_t  i, key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        key = ngx_hash(key, data[i]);[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_hash_key_lc(u_char *data, size_t len)[m
[31m-{[m
[31m-    ngx_uint_t  i, key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        key = ngx_hash(key, ngx_tolower(data[i]));[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_hash_strlow(u_char *dst, u_char *src, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    while (n--) {[m
[31m-        *dst = ngx_tolower(*src);[m
[31m-        key = ngx_hash(key, *dst);[m
[31m-        dst++;[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t  asize;[m
[31m-[m
[31m-    if (type == NGX_HASH_SMALL) {[m
[31m-        asize = 4;[m
[31m-        ha->hsize = 107;[m
[31m-[m
[31m-    } else {[m
[31m-        asize = NGX_HASH_LARGE_ASIZE;[m
[31m-        ha->hsize = NGX_HASH_LARGE_HSIZE;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&ha->keys, ha->temp_pool, asize, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&ha->dns_wc_head, ha->temp_pool, asize,[m
[31m-                       sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&ha->dns_wc_tail, ha->temp_pool, asize,[m
[31m-                       sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ha->keys_hash = ngx_pcalloc(ha->temp_pool, sizeof(ngx_array_t) * ha->hsize);[m
[31m-    if (ha->keys_hash == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ha->dns_wc_head_hash = ngx_pcalloc(ha->temp_pool,[m
[31m-                                       sizeof(ngx_array_t) * ha->hsize);[m
[31m-    if (ha->dns_wc_head_hash == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ha->dns_wc_tail_hash = ngx_pcalloc(ha->temp_pool,[m
[31m-                                       sizeof(ngx_array_t) * ha->hsize);[m
[31m-    if (ha->dns_wc_tail_hash == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, void *value,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    size_t           len;[m
[31m-    u_char          *p;[m
[31m-    ngx_str_t       *name;[m
[31m-    ngx_uint_t       i, k, n, skip, last;[m
[31m-    ngx_array_t     *keys, *hwc;[m
[31m-    ngx_hash_key_t  *hk;[m
[31m-[m
[31m-    last = key->len;[m
[31m-[m
[31m-    if (flags & NGX_HASH_WILDCARD_KEY) {[m
[31m-[m
[31m-        /*[m
[31m-         * supported wildcards:[m
[31m-         *     "*.example.com", ".example.com", and "www.example.*"[m
[31m-         */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        for (i = 0; i < key->len; i++) {[m
[31m-[m
[31m-            if (key->data[i] == '*') {[m
[31m-                if (++n > 1) {[m
[31m-                    return NGX_DECLINED;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (key->data[i] == '.' && key->data[i + 1] == '.') {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (key->data[i] == '\0') {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (key->len > 1 && key->data[0] == '.') {[m
[31m-            skip = 1;[m
[31m-            goto wildcard;[m
[31m-        }[m
[31m-[m
[31m-        if (key->len > 2) {[m
[31m-[m
[31m-            if (key->data[0] == '*' && key->data[1] == '.') {[m
[31m-                skip = 2;[m
[31m-                goto wildcard;[m
[31m-            }[m
[31m-[m
[31m-            if (key->data[i - 2] == '.' && key->data[i - 1] == '*') {[m
[31m-                skip = 0;[m
[31m-                last -= 2;[m
[31m-                goto wildcard;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* exact hash */[m
[31m-[m
[31m-    k = 0;[m
[31m-[m
[31m-    for (i = 0; i < last; i++) {[m
[31m-        if (!(flags & NGX_HASH_READONLY_KEY)) {[m
[31m-            key->data[i] = ngx_tolower(key->data[i]);[m
[31m-        }[m
[31m-        k = ngx_hash(k, key->data[i]);[m
[31m-    }[m
[31m-[m
[31m-    k %= ha->hsize;[m
[31m-[m
[31m-    /* check conflicts in exact hash */[m
[31m-[m
[31m-    name = ha->keys_hash[k].elts;[m
[31m-[m
[31m-    if (name) {[m
[31m-        for (i = 0; i < ha->keys_hash[k].nelts; i++) {[m
[31m-            if (last != name[i].len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp(key->data, name[i].data, last) == 0) {[m
[31m-                return NGX_BUSY;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_array_init(&ha->keys_hash[k], ha->temp_pool, 4,[m
[31m-                           sizeof(ngx_str_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    name = ngx_array_push(&ha->keys_hash[k]);[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *name = *key;[m
[31m-[m
[31m-    hk = ngx_array_push(&ha->keys);[m
[31m-    if (hk == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hk->key = *key;[m
[31m-    hk->key_hash = ngx_hash_key(key->data, last);[m
[31m-    hk->value = value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-[m
[31m-wildcard:[m
[31m-[m
[31m-    /* wildcard hash */[m
[31m-[m
[31m-    k = ngx_hash_strlow(&key->data[skip], &key->data[skip], last - skip);[m
[31m-[m
[31m-    k %= ha->hsize;[m
[31m-[m
[31m-    if (skip == 1) {[m
[31m-[m
[31m-        /* check conflicts in exact hash for ".example.com" */[m
[31m-[m
[31m-        name = ha->keys_hash[k].elts;[m
[31m-[m
[31m-        if (name) {[m
[31m-            len = last - skip;[m
[31m-[m
[31m-            for (i = 0; i < ha->keys_hash[k].nelts; i++) {[m
[31m-                if (len != name[i].len) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strncmp(&key->data[1], name[i].data, len) == 0) {[m
[31m-                    return NGX_BUSY;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_array_init(&ha->keys_hash[k], ha->temp_pool, 4,[m
[31m-                               sizeof(ngx_str_t))[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        name = ngx_array_push(&ha->keys_hash[k]);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name->len = last - 1;[m
[31m-        name->data = ngx_pnalloc(ha->temp_pool, name->len);[m
[31m-        if (name->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(name->data, &key->data[1], name->len);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (skip) {[m
[31m-[m
[31m-        /*[m
[31m-         * convert "*.example.com" to "com.example.\0"[m
[31m-         *      and ".example.com" to "com.example\0"[m
[31m-         */[m
[31m-[m
[31m-        p = ngx_pnalloc(ha->temp_pool, last);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = 0;[m
[31m-        n = 0;[m
[31m-[m
[31m-        for (i = last - 1; i; i--) {[m
[31m-            if (key->data[i] == '.') {[m
[31m-                ngx_memcpy(&p[n], &key->data[i + 1], len);[m
[31m-                n += len;[m
[31m-                p[n++] = '.';[m
[31m-                len = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len++;[m
[31m-        }[m
[31m-[m
[31m-        if (len) {[m
[31m-            ngx_memcpy(&p[n], &key->data[1], len);[m
[31m-            n += len;[m
[31m-        }[m
[31m-[m
[31m-        p[n] = '\0';[m
[31m-[m
[31m-        hwc = &ha->dns_wc_head;[m
[31m-        keys = &ha->dns_wc_head_hash[k];[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* convert "www.example.*" to "www.example\0" */[m
[31m-[m
[31m-        last++;[m
[31m-[m
[31m-        p = ngx_pnalloc(ha->temp_pool, last);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_cpystrn(p, key->data, last);[m
[31m-[m
[31m-        hwc = &ha->dns_wc_tail;[m
[31m-        keys = &ha->dns_wc_tail_hash[k];[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* check conflicts in wildcard hash */[m
[31m-[m
[31m-    name = keys->elts;[m
[31m-[m
[31m-    if (name) {[m
[31m-        len = last - skip;[m
[31m-[m
[31m-        for (i = 0; i < keys->nelts; i++) {[m
[31m-            if (len != name[i].len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp(key->data + skip, name[i].data, len) == 0) {[m
[31m-                return NGX_BUSY;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_array_init(keys, ha->temp_pool, 4, sizeof(ngx_str_t)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    name = ngx_array_push(keys);[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->len = last - skip;[m
[31m-    name->data = ngx_pnalloc(ha->temp_pool, name->len);[m
[31m-    if (name->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name->data, key->data + skip, name->len);[m
[31m-[m
[31m-[m
[31m-    /* add to wildcard hash */[m
[31m-[m
[31m-    hk = ngx_array_push(hwc);[m
[31m-    if (hk == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hk->key.len = last - 1;[m
[31m-    hk->key.data = p;[m
[31m-    hk->key_hash = 0;[m
[31m-    hk->value = value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_hash.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_hash.h[m
[1mdeleted file mode 100644[m
[1mindex abc3cbe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_hash.h[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HASH_H_INCLUDED_[m
[31m-#define _NGX_HASH_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void             *value;[m
[31m-    u_short           len;[m
[31m-    u_char            name[1];[m
[31m-} ngx_hash_elt_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_elt_t  **buckets;[m
[31m-    ngx_uint_t        size;[m
[31m-} ngx_hash_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t        hash;[m
[31m-    void             *value;[m
[31m-} ngx_hash_wildcard_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t         key;[m
[31m-    ngx_uint_t        key_hash;[m
[31m-    void             *value;[m
[31m-} ngx_hash_key_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_uint_t (*ngx_hash_key_pt) (u_char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t            hash;[m
[31m-    ngx_hash_wildcard_t  *wc_head;[m
[31m-    ngx_hash_wildcard_t  *wc_tail;[m
[31m-} ngx_hash_combined_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t       *hash;[m
[31m-    ngx_hash_key_pt   key;[m
[31m-[m
[31m-    ngx_uint_t        max_size;[m
[31m-    ngx_uint_t        bucket_size;[m
[31m-[m
[31m-    char             *name;[m
[31m-    ngx_pool_t       *pool;[m
[31m-    ngx_pool_t       *temp_pool;[m
[31m-} ngx_hash_init_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HASH_SMALL            1[m
[31m-#define NGX_HASH_LARGE            2[m
[31m-[m
[31m-#define NGX_HASH_LARGE_ASIZE      16384[m
[31m-#define NGX_HASH_LARGE_HSIZE      10007[m
[31m-[m
[31m-#define NGX_HASH_WILDCARD_KEY     1[m
[31m-#define NGX_HASH_READONLY_KEY     2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t        hsize;[m
[31m-[m
[31m-    ngx_pool_t       *pool;[m
[31m-    ngx_pool_t       *temp_pool;[m
[31m-[m
[31m-    ngx_array_t       keys;[m
[31m-    ngx_array_t      *keys_hash;[m
[31m-[m
[31m-    ngx_array_t       dns_wc_head;[m
[31m-    ngx_array_t      *dns_wc_head_hash;[m
[31m-[m
[31m-    ngx_array_t       dns_wc_tail;[m
[31m-    ngx_array_t      *dns_wc_tail_hash;[m
[31m-} ngx_hash_keys_arrays_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t        hash;[m
[31m-    ngx_str_t         key;[m
[31m-    ngx_str_t         value;[m
[31m-    u_char           *lowcase_key;[m
[31m-} ngx_table_elt_t;[m
[31m-[m
[31m-[m
[31m-void *ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len);[m
[31m-void *ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len);[m
[31m-void *ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len);[m
[31m-void *ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key,[m
[31m-    u_char *name, size_t len);[m
[31m-[m
[31m-ngx_int_t ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,[m
[31m-    ngx_uint_t nelts);[m
[31m-ngx_int_t ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,[m
[31m-    ngx_uint_t nelts);[m
[31m-[m
[31m-#define ngx_hash(key, c)   ((ngx_uint_t) key * 31 + c)[m
[31m-ngx_uint_t ngx_hash_key(u_char *data, size_t len);[m
[31m-ngx_uint_t ngx_hash_key_lc(u_char *data, size_t len);[m
[31m-ngx_uint_t ngx_hash_strlow(u_char *dst, u_char *src, size_t n);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type);[m
[31m-ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key,[m
[31m-    void *value, ngx_uint_t flags);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HASH_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_inet.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_inet.c[m
[1mdeleted file mode 100644[m
[1mindex 33b303d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_inet.c[m
[1m+++ /dev/null[m
[36m@@ -1,1277 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-static ngx_int_t ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-[m
[31m-[m
[31m-in_addr_t[m
[31m-ngx_inet_addr(u_char *text, size_t len)[m
[31m-{[m
[31m-    u_char      *p, c;[m
[31m-    in_addr_t    addr;[m
[31m-    ngx_uint_t   octet, n;[m
[31m-[m
[31m-    addr = 0;[m
[31m-    octet = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (p = text; p < text + len; p++) {[m
[31m-        c = *p;[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            octet = octet * 10 + (c - '0');[m
[31m-[m
[31m-            if (octet > 255) {[m
[31m-                return INADDR_NONE;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (c == '.') {[m
[31m-            addr = (addr << 8) + octet;[m
[31m-            octet = 0;[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return INADDR_NONE;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 3) {[m
[31m-        addr = (addr << 8) + octet;[m
[31m-        return htonl(addr);[m
[31m-    }[m
[31m-[m
[31m-    return INADDR_NONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_inet6_addr(u_char *p, size_t len, u_char *addr)[m
[31m-{[m
[31m-    u_char      c, *zero, *digit, *s, *d;[m
[31m-    size_t      len4;[m
[31m-    ngx_uint_t  n, nibbles, word;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    zero = NULL;[m
[31m-    digit = NULL;[m
[31m-    len4 = 0;[m
[31m-    nibbles = 0;[m
[31m-    word = 0;[m
[31m-    n = 8;[m
[31m-[m
[31m-    if (p[0] == ':') {[m
[31m-        p++;[m
[31m-        len--;[m
[31m-    }[m
[31m-[m
[31m-    for (/* void */; len; len--) {[m
[31m-        c = *p++;[m
[31m-[m
[31m-        if (c == ':') {[m
[31m-            if (nibbles) {[m
[31m-                digit = p;[m
[31m-                len4 = len;[m
[31m-                *addr++ = (u_char) (word >> 8);[m
[31m-                *addr++ = (u_char) (word & 0xff);[m
[31m-[m
[31m-                if (--n) {[m
[31m-                    nibbles = 0;[m
[31m-                    word = 0;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                if (zero == NULL) {[m
[31m-                    digit = p;[m
[31m-                    len4 = len;[m
[31m-                    zero = addr;[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (c == '.' && nibbles) {[m
[31m-            if (n < 2 || digit == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            word = ngx_inet_addr(digit, len4 - 1);[m
[31m-            if (word == INADDR_NONE) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            word = ntohl(word);[m
[31m-            *addr++ = (u_char) ((word >> 24) & 0xff);[m
[31m-            *addr++ = (u_char) ((word >> 16) & 0xff);[m
[31m-            n--;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (++nibbles > 4) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            word = word * 16 + (c - '0');[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        c |= 0x20;[m
[31m-[m
[31m-        if (c >= 'a' && c <= 'f') {[m
[31m-            word = word * 16 + (c - 'a') + 10;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (nibbles == 0 && zero == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *addr++ = (u_char) (word >> 8);[m
[31m-    *addr++ = (u_char) (word & 0xff);[m
[31m-[m
[31m-    if (--n) {[m
[31m-        if (zero) {[m
[31m-            n *= 2;[m
[31m-            s = addr - 1;[m
[31m-            d = s + n;[m
[31m-            while (s >= zero) {[m
[31m-                *d-- = *s--;[m
[31m-            }[m
[31m-            ngx_memzero(zero, n);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (zero == NULL) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, size_t len,[m
[31m-    ngx_uint_t port)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    size_t                n;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    struct sockaddr_un   *saun;[m
[31m-#endif[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-[m
[31m-        sin = (struct sockaddr_in *) sa;[m
[31m-        p = (u_char *) &sin->sin_addr;[m
[31m-[m
[31m-        if (port) {[m
[31m-            p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud:%d",[m
[31m-                             p[0], p[1], p[2], p[3], ntohs(sin->sin_port));[m
[31m-        } else {[m
[31m-            p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",[m
[31m-                             p[0], p[1], p[2], p[3]);[m
[31m-        }[m
[31m-[m
[31m-        return (p - text);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-[m
[31m-        sin6 = (struct sockaddr_in6 *) sa;[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        if (port) {[m
[31m-            text[n++] = '[';[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_inet6_ntop(sin6->sin6_addr.s6_addr, &text[n], len);[m
[31m-[m
[31m-        if (port) {[m
[31m-            n = ngx_sprintf(&text[1 + n], "]:%d",[m
[31m-                            ntohs(sin6->sin6_port)) - text;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    case AF_UNIX:[m
[31m-        saun = (struct sockaddr_un *) sa;[m
[31m-[m
[31m-        /* on Linux sockaddr might not include sun_path at all */[m
[31m-[m
[31m-        if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)) {[m
[31m-            p = ngx_snprintf(text, len, "unix:%Z");[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path);[m
[31m-        }[m
[31m-[m
[31m-        /* we do not include trailing zero in address length */[m
[31m-[m
[31m-        return (p - text - 1);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_inet_ntop(int family, void *addr, u_char *text, size_t len)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    switch (family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-[m
[31m-        p = addr;[m
[31m-[m
[31m-        return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",[m
[31m-                            p[0], p[1], p[2], p[3])[m
[31m-               - text;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-        return ngx_inet6_ntop(addr, text, len);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-size_t[m
[31m-ngx_inet6_ntop(u_char *p, u_char *text, size_t len)[m
[31m-{[m
[31m-    u_char      *dst;[m
[31m-    size_t       max, n;[m
[31m-    ngx_uint_t   i, zero, last;[m
[31m-[m
[31m-    if (len < NGX_INET6_ADDRSTRLEN) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    zero = (ngx_uint_t) -1;[m
[31m-    last = (ngx_uint_t) -1;[m
[31m-    max = 1;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < 16; i += 2) {[m
[31m-[m
[31m-        if (p[i] || p[i + 1]) {[m
[31m-[m
[31m-            if (max < n) {[m
[31m-                zero = last;[m
[31m-                max = n;[m
[31m-            }[m
[31m-[m
[31m-            n = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n++ == 0) {[m
[31m-            last = i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (max < n) {[m
[31m-        zero = last;[m
[31m-        max = n;[m
[31m-    }[m
[31m-[m
[31m-    dst = text;[m
[31m-    n = 16;[m
[31m-[m
[31m-    if (zero == 0) {[m
[31m-[m
[31m-        if ((max == 5 && p[10] == 0xff && p[11] == 0xff)[m
[31m-            || (max == 6)[m
[31m-            || (max == 7 && p[14] != 0 && p[15] != 1))[m
[31m-        {[m
[31m-            n = 12;[m
[31m-        }[m
[31m-[m
[31m-        *dst++ = ':';[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < n; i += 2) {[m
[31m-[m
[31m-        if (i == zero) {[m
[31m-            *dst++ = ':';[m
[31m-            i += (max - 1) * 2;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dst = ngx_sprintf(dst, "%xd", p[i] * 256 + p[i + 1]);[m
[31m-[m
[31m-        if (i < 14) {[m
[31m-            *dst++ = ':';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n == 12) {[m
[31m-        dst = ngx_sprintf(dst, "%ud.%ud.%ud.%ud", p[12], p[13], p[14], p[15]);[m
[31m-    }[m
[31m-[m
[31m-    return dst - text;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr)[m
[31m-{[m
[31m-    u_char      *addr, *mask, *last;[m
[31m-    size_t       len;[m
[31m-    ngx_int_t    shift;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_uint_t   s, i;[m
[31m-#endif[m
[31m-[m
[31m-    addr = text->data;[m
[31m-    last = addr + text->len;[m
[31m-[m
[31m-    mask = ngx_strlchr(addr, last, '/');[m
[31m-    len = (mask ? mask : last) - addr;[m
[31m-[m
[31m-    cidr->u.in.addr = ngx_inet_addr(addr, len);[m
[31m-[m
[31m-    if (cidr->u.in.addr != INADDR_NONE) {[m
[31m-        cidr->family = AF_INET;[m
[31m-[m
[31m-        if (mask == NULL) {[m
[31m-            cidr->u.in.mask = 0xffffffff;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    } else if (ngx_inet6_addr(addr, len, cidr->u.in6.addr.s6_addr) == NGX_OK) {[m
[31m-        cidr->family = AF_INET6;[m
[31m-[m
[31m-        if (mask == NULL) {[m
[31m-            ngx_memset(cidr->u.in6.mask.s6_addr, 0xff, 16);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    } else {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mask++;[m
[31m-[m
[31m-    shift = ngx_atoi(mask, last - mask);[m
[31m-    if (shift == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (cidr->family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        if (shift > 128) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        addr = cidr->u.in6.addr.s6_addr;[m
[31m-        mask = cidr->u.in6.mask.s6_addr;[m
[31m-        rc = NGX_OK;[m
[31m-[m
[31m-        for (i = 0; i < 16; i++) {[m
[31m-[m
[31m-            s = (shift > 8) ? 8 : shift;[m
[31m-            shift -= s;[m
[31m-[m
[31m-            mask[i] = (u_char) (0xffu << (8 - s));[m
[31m-[m
[31m-            if (addr[i] != (addr[i] & mask[i])) {[m
[31m-                rc = NGX_DONE;[m
[31m-                addr[i] &= mask[i];[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        if (shift > 32) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (shift) {[m
[31m-            cidr->u.in.mask = htonl((uint32_t) (0xffffffffu << (32 - shift)));[m
[31m-[m
[31m-        } else {[m
[31m-            /* x86 compilers use a shl instruction that shifts by modulo 32 */[m
[31m-            cidr->u.in.mask = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (cidr->u.in.addr == (cidr->u.in.addr & cidr->u.in.mask)) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        cidr->u.in.addr &= cidr->u.in.mask;[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len)[m
[31m-{[m
[31m-    in_addr_t             inaddr;[m
[31m-    ngx_uint_t            family;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct in6_addr       inaddr6;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-    /*[m
[31m-     * prevent MSVC8 warning:[m
[31m-     *    potentially uninitialized local variable 'inaddr6' used[m
[31m-     */[m
[31m-    ngx_memzero(&inaddr6, sizeof(struct in6_addr));[m
[31m-#endif[m
[31m-[m
[31m-    inaddr = ngx_inet_addr(text, len);[m
[31m-[m
[31m-    if (inaddr != INADDR_NONE) {[m
[31m-        family = AF_INET;[m
[31m-        len = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    } else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) == NGX_OK) {[m
[31m-        family = AF_INET6;[m
[31m-        len = sizeof(struct sockaddr_in6);[m
[31m-[m
[31m-#endif[m
[31m-    } else {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    addr->sockaddr = ngx_pcalloc(pool, len);[m
[31m-    if (addr->sockaddr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addr->sockaddr->sa_family = (u_char) family;[m
[31m-    addr->socklen = len;[m
[31m-[m
[31m-    switch (family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) addr->sockaddr;[m
[31m-        ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) addr->sockaddr;[m
[31m-        sin->sin_addr.s_addr = inaddr;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-    size_t   len;[m
[31m-[m
[31m-    p = u->url.data;[m
[31m-    len = u->url.len;[m
[31m-[m
[31m-    if (len >= 5 && ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) {[m
[31m-        return ngx_parse_unix_domain_url(pool, u);[m
[31m-    }[m
[31m-[m
[31m-    if (len && p[0] == '[') {[m
[31m-        return ngx_parse_inet6_url(pool, u);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_parse_inet_url(pool, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    u_char              *path, *uri, *last;[m
[31m-    size_t               len;[m
[31m-    struct sockaddr_un  *saun;[m
[31m-[m
[31m-    len = u->url.len;[m
[31m-    path = u->url.data;[m
[31m-[m
[31m-    path += 5;[m
[31m-    len -= 5;[m
[31m-[m
[31m-    if (u->uri_part) {[m
[31m-[m
[31m-        last = path + len;[m
[31m-        uri = ngx_strlchr(path, last, ':');[m
[31m-[m
[31m-        if (uri) {[m
[31m-            len = uri - path;[m
[31m-            uri++;[m
[31m-            u->uri.len = last - uri;[m
[31m-            u->uri.data = uri;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        u->err = "no path in the unix domain socket";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->host.len = len++;[m
[31m-    u->host.data = path;[m
[31m-[m
[31m-    if (len > sizeof(saun->sun_path)) {[m
[31m-        u->err = "too long path in the unix domain socket";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->socklen = sizeof(struct sockaddr_un);[m
[31m-    saun = (struct sockaddr_un *) &u->sockaddr;[m
[31m-    saun->sun_family = AF_UNIX;[m
[31m-    (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);[m
[31m-[m
[31m-    u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));[m
[31m-    if (u->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un));[m
[31m-    if (saun == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->family = AF_UNIX;[m
[31m-    u->naddrs = 1;[m
[31m-[m
[31m-    saun->sun_family = AF_UNIX;[m
[31m-    (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);[m
[31m-[m
[31m-    u->addrs[0].sockaddr = (struct sockaddr *) saun;[m
[31m-    u->addrs[0].socklen = sizeof(struct sockaddr_un);[m
[31m-    u->addrs[0].name.len = len + 4;[m
[31m-    u->addrs[0].name.data = u->url.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u->err = "the unix domain sockets are not supported on this platform";[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-    u_char               *p, *host, *port, *last, *uri, *args;[m
[31m-    size_t                len;[m
[31m-    ngx_int_t             n;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    u->socklen = sizeof(struct sockaddr_in);[m
[31m-    sin = (struct sockaddr_in *) &u->sockaddr;[m
[31m-    sin->sin_family = AF_INET;[m
[31m-[m
[31m-    u->family = AF_INET;[m
[31m-[m
[31m-    host = u->url.data;[m
[31m-[m
[31m-    last = host + u->url.len;[m
[31m-[m
[31m-    port = ngx_strlchr(host, last, ':');[m
[31m-[m
[31m-    uri = ngx_strlchr(host, last, '/');[m
[31m-[m
[31m-    args = ngx_strlchr(host, last, '?');[m
[31m-[m
[31m-    if (args) {[m
[31m-        if (uri == NULL || args < uri) {[m
[31m-            uri = args;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (uri) {[m
[31m-        if (u->listen || !u->uri_part) {[m
[31m-            u->err = "invalid host";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->uri.len = last - uri;[m
[31m-        u->uri.data = uri;[m
[31m-[m
[31m-        last = uri;[m
[31m-[m
[31m-        if (uri < port) {[m
[31m-            port = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (port) {[m
[31m-        port++;[m
[31m-[m
[31m-        len = last - port;[m
[31m-[m
[31m-        n = ngx_atoi(port, len);[m
[31m-[m
[31m-        if (n < 1 || n > 65535) {[m
[31m-            u->err = "invalid port";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->port = (in_port_t) n;[m
[31m-        sin->sin_port = htons((in_port_t) n);[m
[31m-[m
[31m-        u->port_text.len = len;[m
[31m-        u->port_text.data = port;[m
[31m-[m
[31m-        last = port - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        if (uri == NULL) {[m
[31m-[m
[31m-            if (u->listen) {[m
[31m-[m
[31m-                /* test value as port only */[m
[31m-[m
[31m-                n = ngx_atoi(host, last - host);[m
[31m-[m
[31m-                if (n != NGX_ERROR) {[m
[31m-[m
[31m-                    if (n < 1 || n > 65535) {[m
[31m-                        u->err = "invalid port";[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    u->port = (in_port_t) n;[m
[31m-                    sin->sin_port = htons((in_port_t) n);[m
[31m-[m
[31m-                    u->port_text.len = last - host;[m
[31m-                    u->port_text.data = host;[m
[31m-[m
[31m-                    u->wildcard = 1;[m
[31m-[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        u->no_port = 1;[m
[31m-        u->port = u->default_port;[m
[31m-        sin->sin_port = htons(u->default_port);[m
[31m-    }[m
[31m-[m
[31m-    len = last - host;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        u->err = "no host";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->host.len = len;[m
[31m-    u->host.data = host;[m
[31m-[m
[31m-    if (u->listen && len == 1 && *host == '*') {[m
[31m-        sin->sin_addr.s_addr = INADDR_ANY;[m
[31m-        u->wildcard = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sin->sin_addr.s_addr = ngx_inet_addr(host, len);[m
[31m-[m
[31m-    if (sin->sin_addr.s_addr != INADDR_NONE) {[m
[31m-[m
[31m-        if (sin->sin_addr.s_addr == INADDR_ANY) {[m
[31m-            u->wildcard = 1;[m
[31m-        }[m
[31m-[m
[31m-        u->naddrs = 1;[m
[31m-[m
[31m-        u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));[m
[31m-        if (u->addrs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));[m
[31m-        if (sin == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(sin, u->sockaddr, sizeof(struct sockaddr_in));[m
[31m-[m
[31m-        u->addrs[0].sockaddr = (struct sockaddr *) sin;[m
[31m-        u->addrs[0].socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-        p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",[m
[31m-                                           &u->host, u->port) - p;[m
[31m-        u->addrs[0].name.data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->no_resolve) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inet_resolve_host(pool, u) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->family = u->addrs[0].sockaddr->sa_family;[m
[31m-    u->socklen = u->addrs[0].socklen;[m
[31m-    ngx_memcpy(u->sockaddr, u->addrs[0].sockaddr, u->addrs[0].socklen);[m
[31m-[m
[31m-    switch (u->family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) &u->sockaddr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {[m
[31m-            u->wildcard = 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) &u->sockaddr;[m
[31m-[m
[31m-        if (sin->sin_addr.s_addr == INADDR_ANY) {[m
[31m-            u->wildcard = 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char               *p, *host, *port, *last, *uri;[m
[31m-    size_t                len;[m
[31m-    ngx_int_t             n;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-    u->socklen = sizeof(struct sockaddr_in6);[m
[31m-    sin6 = (struct sockaddr_in6 *) &u->sockaddr;[m
[31m-    sin6->sin6_family = AF_INET6;[m
[31m-[m
[31m-    host = u->url.data + 1;[m
[31m-[m
[31m-    last = u->url.data + u->url.len;[m
[31m-[m
[31m-    p = ngx_strlchr(host, last, ']');[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        u->err = "invalid host";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (last - p) {[m
[31m-[m
[31m-        port = p + 1;[m
[31m-[m
[31m-        uri = ngx_strlchr(port, last, '/');[m
[31m-[m
[31m-        if (uri) {[m
[31m-            if (u->listen || !u->uri_part) {[m
[31m-                u->err = "invalid host";[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            u->uri.len = last - uri;[m
[31m-            u->uri.data = uri;[m
[31m-[m
[31m-            last = uri;[m
[31m-        }[m
[31m-[m
[31m-        if (*port == ':') {[m
[31m-            port++;[m
[31m-[m
[31m-            len = last - port;[m
[31m-[m
[31m-            n = ngx_atoi(port, len);[m
[31m-[m
[31m-            if (n < 1 || n > 65535) {[m
[31m-                u->err = "invalid port";[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            u->port = (in_port_t) n;[m
[31m-            sin6->sin6_port = htons((in_port_t) n);[m
[31m-[m
[31m-            u->port_text.len = len;[m
[31m-            u->port_text.data = port;[m
[31m-[m
[31m-        } else {[m
[31m-            u->no_port = 1;[m
[31m-            u->port = u->default_port;[m
[31m-            sin6->sin6_port = htons(u->default_port);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = p - host;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        u->err = "no host";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->host.len = len + 2;[m
[31m-    u->host.data = host - 1;[m
[31m-[m
[31m-    if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) {[m
[31m-        u->err = "invalid IPv6 address";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {[m
[31m-        u->wildcard = 1;[m
[31m-    }[m
[31m-[m
[31m-    u->family = AF_INET6;[m
[31m-    u->naddrs = 1;[m
[31m-[m
[31m-    u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));[m
[31m-    if (u->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6));[m
[31m-    if (sin6 == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(sin6, u->sockaddr, sizeof(struct sockaddr_in6));[m
[31m-[m
[31m-    u->addrs[0].sockaddr = (struct sockaddr *) sin6;[m
[31m-    u->addrs[0].socklen = sizeof(struct sockaddr_in6);[m
[31m-[m
[31m-    p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",[m
[31m-                                       &u->host, u->port) - p;[m
[31m-    u->addrs[0].name.data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u->err = "the INET6 sockets are not supported on this platform";[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-    u_char               *p, *host;[m
[31m-    size_t                len;[m
[31m-    in_port_t             port;[m
[31m-    ngx_uint_t            i;[m
[31m-    struct addrinfo       hints, *res, *rp;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-    port = htons(u->port);[m
[31m-[m
[31m-    host = ngx_alloc(u->host.len + 1, pool->log);[m
[31m-    if (host == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);[m
[31m-[m
[31m-    ngx_memzero(&hints, sizeof(struct addrinfo));[m
[31m-    hints.ai_family = AF_UNSPEC;[m
[31m-    hints.ai_socktype = SOCK_STREAM;[m
[31m-#ifdef AI_ADDRCONFIG[m
[31m-    hints.ai_flags = AI_ADDRCONFIG;[m
[31m-#endif[m
[31m-[m
[31m-    if (getaddrinfo((char *) host, NULL, &hints, &res) != 0) {[m
[31m-        u->err = "host not found";[m
[31m-        ngx_free(host);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(host);[m
[31m-[m
[31m-    for (i = 0, rp = res; rp != NULL; rp = rp->ai_next) {[m
[31m-[m
[31m-        switch (rp->ai_family) {[m
[31m-[m
[31m-        case AF_INET:[m
[31m-        case AF_INET6:[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        i++;[m
[31m-    }[m
[31m-[m
[31m-    if (i == 0) {[m
[31m-        u->err = "host not found";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /* MP: ngx_shared_palloc() */[m
[31m-[m
[31m-    u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));[m
[31m-    if (u->addrs == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    u->naddrs = i;[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    /* AF_INET addresses first */[m
[31m-[m
[31m-    for (rp = res; rp != NULL; rp = rp->ai_next) {[m
[31m-[m
[31m-        if (rp->ai_family != AF_INET) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        sin = ngx_pcalloc(pool, rp->ai_addrlen);[m
[31m-        if (sin == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(sin, rp->ai_addr, rp->ai_addrlen);[m
[31m-[m
[31m-        sin->sin_port = port;[m
[31m-[m
[31m-        u->addrs[i].sockaddr = (struct sockaddr *) sin;[m
[31m-        u->addrs[i].socklen = rp->ai_addrlen;[m
[31m-[m
[31m-        len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;[m
[31m-[m
[31m-        p = ngx_pnalloc(pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_sock_ntop((struct sockaddr *) sin, rp->ai_addrlen, p, len, 1);[m
[31m-[m
[31m-        u->addrs[i].name.len = len;[m
[31m-        u->addrs[i].name.data = p;[m
[31m-[m
[31m-        i++;[m
[31m-    }[m
[31m-[m
[31m-    for (rp = res; rp != NULL; rp = rp->ai_next) {[m
[31m-[m
[31m-        if (rp->ai_family != AF_INET6) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        sin6 = ngx_pcalloc(pool, rp->ai_addrlen);[m
[31m-        if (sin6 == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(sin6, rp->ai_addr, rp->ai_addrlen);[m
[31m-[m
[31m-        sin6->sin6_port = port;[m
[31m-[m
[31m-        u->addrs[i].sockaddr = (struct sockaddr *) sin6;[m
[31m-        u->addrs[i].socklen = rp->ai_addrlen;[m
[31m-[m
[31m-        len = NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1;[m
[31m-[m
[31m-        p = ngx_pnalloc(pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_sock_ntop((struct sockaddr *) sin6, rp->ai_addrlen, p,[m
[31m-                            len, 1);[m
[31m-[m
[31m-        u->addrs[i].name.len = len;[m
[31m-        u->addrs[i].name.data = p;[m
[31m-[m
[31m-        i++;[m
[31m-    }[m
[31m-[m
[31m-    freeaddrinfo(res);[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    freeaddrinfo(res);[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#else /* !NGX_HAVE_GETADDRINFO || !NGX_HAVE_INET6 */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)[m
[31m-{[m
[31m-    u_char              *p, *host;[m
[31m-    size_t               len;[m
[31m-    in_port_t            port;[m
[31m-    in_addr_t            in_addr;[m
[31m-    ngx_uint_t           i;[m
[31m-    struct hostent      *h;[m
[31m-    struct sockaddr_in  *sin;[m
[31m-[m
[31m-    /* AF_INET only */[m
[31m-[m
[31m-    port = htons(u->port);[m
[31m-[m
[31m-    in_addr = ngx_inet_addr(u->host.data, u->host.len);[m
[31m-[m
[31m-    if (in_addr == INADDR_NONE) {[m
[31m-        host = ngx_alloc(u->host.len + 1, pool->log);[m
[31m-        if (host == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);[m
[31m-[m
[31m-        h = gethostbyname((char *) host);[m
[31m-[m
[31m-        ngx_free(host);[m
[31m-[m
[31m-        if (h == NULL || h->h_addr_list[0] == NULL) {[m
[31m-            u->err = "host not found";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ }[m
[31m-[m
[31m-        /* MP: ngx_shared_palloc() */[m
[31m-[m
[31m-        u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));[m
[31m-        if (u->addrs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->naddrs = i;[m
[31m-[m
[31m-        for (i = 0; i < u->naddrs; i++) {[m
[31m-[m
[31m-            sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));[m
[31m-            if (sin == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sin->sin_family = AF_INET;[m
[31m-            sin->sin_port = port;[m
[31m-            sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);[m
[31m-[m
[31m-            u->addrs[i].sockaddr = (struct sockaddr *) sin;[m
[31m-            u->addrs[i].socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-            len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;[m
[31m-[m
[31m-            p = ngx_pnalloc(pool, len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = ngx_sock_ntop((struct sockaddr *) sin,[m
[31m-                                sizeof(struct sockaddr_in), p, len, 1);[m
[31m-[m
[31m-            u->addrs[i].name.len = len;[m
[31m-            u->addrs[i].name.data = p;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* MP: ngx_shared_palloc() */[m
[31m-[m
[31m-        u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));[m
[31m-        if (u->addrs == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));[m
[31m-        if (sin == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->naddrs = 1;[m
[31m-[m
[31m-        sin->sin_family = AF_INET;[m
[31m-        sin->sin_port = port;[m
[31m-        sin->sin_addr.s_addr = in_addr;[m
[31m-[m
[31m-        u->addrs[0].sockaddr = (struct sockaddr *) sin;[m
[31m-        u->addrs[0].socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-        p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",[m
[31m-                                           &u->host, ntohs(port)) - p;[m
[31m-        u->addrs[0].name.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6 */[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1,[m
[31m-    struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port)[m
[31m-{[m
[31m-    struct sockaddr_in   *sin1, *sin2;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin61, *sin62;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    struct sockaddr_un   *saun1, *saun2;[m
[31m-#endif[m
[31m-[m
[31m-    if (sa1->sa_family != sa2->sa_family) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    switch (sa1->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-[m
[31m-        sin61 = (struct sockaddr_in6 *) sa1;[m
[31m-        sin62 = (struct sockaddr_in6 *) sa2;[m
[31m-[m
[31m-        if (cmp_port && sin61->sin6_port != sin62->sin6_port) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_memcmp(&sin61->sin6_addr, &sin62->sin6_addr, 16) != 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-[m
[31m-        /* TODO length */[m
[31m-[m
[31m-        saun1 = (struct sockaddr_un *) sa1;[m
[31m-        saun2 = (struct sockaddr_un *) sa2;[m
[31m-[m
[31m-        if (ngx_memcmp(&saun1->sun_path, &saun2->sun_path,[m
[31m-                       sizeof(saun1->sun_path))[m
[31m-            != 0)[m
[31m-        {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-[m
[31m-        sin1 = (struct sockaddr_in *) sa1;[m
[31m-        sin2 = (struct sockaddr_in *) sa2;[m
[31m-[m
[31m-        if (cmp_port && sin1->sin_port != sin2->sin_port) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_inet.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_inet.h[m
[1mdeleted file mode 100644[m
[1mindex 0555750..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_inet.h[m
[1m+++ /dev/null[m
[36m@@ -1,122 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_INET_H_INCLUDED_[m
[31m-#define _NGX_INET_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * TODO: autoconfigure NGX_SOCKADDRLEN and NGX_SOCKADDR_STRLEN as[m
[31m- *       sizeof(struct sockaddr_storage)[m
[31m- *       sizeof(struct sockaddr_un)[m
[31m- *       sizeof(struct sockaddr_in6)[m
[31m- *       sizeof(struct sockaddr_in)[m
[31m- */[m
[31m-[m
[31m-#define NGX_INET_ADDRSTRLEN   (sizeof("255.255.255.255") - 1)[m
[31m-#define NGX_INET6_ADDRSTRLEN                                                 \[m
[31m-    (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)[m
[31m-#define NGX_UNIX_ADDRSTRLEN                                                  \[m
[31m-    (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-#define NGX_SOCKADDR_STRLEN   (sizeof("unix:") - 1 + NGX_UNIX_ADDRSTRLEN)[m
[31m-#else[m
[31m-#define NGX_SOCKADDR_STRLEN   (NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1)[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-#define NGX_SOCKADDRLEN       sizeof(struct sockaddr_un)[m
[31m-#else[m
[31m-#define NGX_SOCKADDRLEN       512[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t                 addr;[m
[31m-    in_addr_t                 mask;[m
[31m-} ngx_in_cidr_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr           addr;[m
[31m-    struct in6_addr           mask;[m
[31m-} ngx_in6_cidr_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                family;[m
[31m-    union {[m
[31m-        ngx_in_cidr_t         in;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        ngx_in6_cidr_t        in6;[m
[31m-#endif[m
[31m-    } u;[m
[31m-} ngx_cidr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct sockaddr          *sockaddr;[m
[31m-    socklen_t                 socklen;[m
[31m-    ngx_str_t                 name;[m
[31m-} ngx_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 url;[m
[31m-    ngx_str_t                 host;[m
[31m-    ngx_str_t                 port_text;[m
[31m-    ngx_str_t                 uri;[m
[31m-[m
[31m-    in_port_t                 port;[m
[31m-    in_port_t                 default_port;[m
[31m-    int                       family;[m
[31m-[m
[31m-    unsigned                  listen:1;[m
[31m-    unsigned                  uri_part:1;[m
[31m-    unsigned                  no_resolve:1;[m
[31m-    unsigned                  one_addr:1;  /* compatibility */[m
[31m-[m
[31m-    unsigned                  no_port:1;[m
[31m-    unsigned                  wildcard:1;[m
[31m-[m
[31m-    socklen_t                 socklen;[m
[31m-    u_char                    sockaddr[NGX_SOCKADDRLEN];[m
[31m-[m
[31m-    ngx_addr_t               *addrs;[m
[31m-    ngx_uint_t                naddrs;[m
[31m-[m
[31m-    char                     *err;[m
[31m-} ngx_url_t;[m
[31m-[m
[31m-[m
[31m-in_addr_t ngx_inet_addr(u_char *text, size_t len);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-ngx_int_t ngx_inet6_addr(u_char *p, size_t len, u_char *addr);[m
[31m-size_t ngx_inet6_ntop(u_char *p, u_char *text, size_t len);[m
[31m-#endif[m
[31m-size_t ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text,[m
[31m-    size_t len, ngx_uint_t port);[m
[31m-size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len);[m
[31m-ngx_int_t ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr);[m
[31m-ngx_int_t ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text,[m
[31m-    size_t len);[m
[31m-ngx_int_t ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-ngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u);[m
[31m-ngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1,[m
[31m-    struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_INET_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_list.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_list.c[m
[1mdeleted file mode 100644[m
[1mindex d0eb159..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_list.c[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_list_t *[m
[31m-ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)[m
[31m-{[m
[31m-    ngx_list_t  *list;[m
[31m-[m
[31m-    list = ngx_palloc(pool, sizeof(ngx_list_t));[m
[31m-    if (list == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(list, pool, n, size) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return list;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_list_push(ngx_list_t *l)[m
[31m-{[m
[31m-    void             *elt;[m
[31m-    ngx_list_part_t  *last;[m
[31m-[m
[31m-    last = l->last;[m
[31m-[m
[31m-    if (last->nelts == l->nalloc) {[m
[31m-[m
[31m-        /* the last part is full, allocate a new list part */[m
[31m-[m
[31m-        last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));[m
[31m-        if (last == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        last->elts = ngx_palloc(l->pool, l->nalloc * l->size);[m
[31m-        if (last->elts == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        last->nelts = 0;[m
[31m-        last->next = NULL;[m
[31m-[m
[31m-        l->last->next = last;[m
[31m-        l->last = last;[m
[31m-    }[m
[31m-[m
[31m-    elt = (char *) last->elts + l->size * last->nelts;[m
[31m-    last->nelts++;[m
[31m-[m
[31m-    return elt;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_list.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_list.h[m
[1mdeleted file mode 100644[m
[1mindex e0fe643..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_list.h[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LIST_H_INCLUDED_[m
[31m-#define _NGX_LIST_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_list_part_s  ngx_list_part_t;[m
[31m-[m
[31m-struct ngx_list_part_s {[m
[31m-    void             *elts;[m
[31m-    ngx_uint_t        nelts;[m
[31m-    ngx_list_part_t  *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_list_part_t  *last;[m
[31m-    ngx_list_part_t   part;[m
[31m-    size_t            size;[m
[31m-    ngx_uint_t        nalloc;[m
[31m-    ngx_pool_t       *pool;[m
[31m-} ngx_list_t;[m
[31m-[m
[31m-[m
[31m-ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size);[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)[m
[31m-{[m
[31m-    list->part.elts = ngx_palloc(pool, n * size);[m
[31m-    if (list->part.elts == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    list->part.nelts = 0;[m
[31m-    list->part.next = NULL;[m
[31m-    list->last = &list->part;[m
[31m-    list->size = size;[m
[31m-    list->nalloc = n;[m
[31m-    list->pool = pool;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- *[m
[31m- *  the iteration through the list:[m
[31m- *[m
[31m- *  part = &list.part;[m
[31m- *  data = part->elts;[m
[31m- *[m
[31m- *  for (i = 0 ;; i++) {[m
[31m- *[m
[31m- *      if (i >= part->nelts) {[m
[31m- *          if (part->next == NULL) {[m
[31m- *              break;[m
[31m- *          }[m
[31m- *[m
[31m- *          part = part->next;[m
[31m- *          data = part->elts;[m
[31m- *          i = 0;[m
[31m- *      }[m
[31m- *[m
[31m- *      ...  data[i] ...[m
[31m- *[m
[31m- *  }[m
[31m- */[m
[31m-[m
[31m-[m
[31m-void *ngx_list_push(ngx_list_t *list);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LIST_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.c[m
[1mdeleted file mode 100644[m
[1mindex 8e9408d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.c[m
[1m+++ /dev/null[m
[36m@@ -1,755 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log);[m
[31m-static void ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log);[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-static void ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level,[m
[31m-    u_char *buf, size_t len);[m
[31m-static void ngx_log_memory_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char        *start;[m
[31m-    u_char        *end;[m
[31m-    u_char        *pos;[m
[31m-    ngx_atomic_t   written;[m
[31m-} ngx_log_memory_buf_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_errlog_commands[] = {[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_error_log,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_errlog_module_ctx = {[m
[31m-    ngx_string("errlog"),[m
[31m-    NULL,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_errlog_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_errlog_module_ctx,                /* module context */[m
[31m-    ngx_errlog_commands,                   /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_log_t        ngx_log;[m
[31m-static ngx_open_file_t  ngx_log_file;[m
[31m-ngx_uint_t              ngx_use_stderr = 1;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t err_levels[] = {[m
[31m-    ngx_null_string,[m
[31m-    ngx_string("emerg"),[m
[31m-    ngx_string("alert"),[m
[31m-    ngx_string("crit"),[m
[31m-    ngx_string("error"),[m
[31m-    ngx_string("warn"),[m
[31m-    ngx_string("notice"),[m
[31m-    ngx_string("info"),[m
[31m-    ngx_string("debug")[m
[31m-};[m
[31m-[m
[31m-static const char *debug_levels[] = {[m
[31m-    "debug_core", "debug_alloc", "debug_mutex", "debug_event",[m
[31m-    "debug_http", "debug_mail", "debug_stream"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-void[m
[31m-ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-void[m
[31m-ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, va_list args)[m
[31m-[m
[31m-#endif[m
[31m-{[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-    va_list      args;[m
[31m-#endif[m
[31m-    u_char      *p, *last, *msg;[m
[31m-    ssize_t      n;[m
[31m-    ngx_uint_t   wrote_stderr, debug_connection;[m
[31m-    u_char       errstr[NGX_MAX_ERROR_STR];[m
[31m-[m
[31m-    last = errstr + NGX_MAX_ERROR_STR;[m
[31m-[m
[31m-    p = ngx_cpymem(errstr, ngx_cached_err_log_time.data,[m
[31m-                   ngx_cached_err_log_time.len);[m
[31m-[m
[31m-    p = ngx_slprintf(p, last, " [%V] ", &err_levels[level]);[m
[31m-[m
[31m-    /* pid#tid */[m
[31m-    p = ngx_slprintf(p, last, "%P#" NGX_TID_T_FMT ": ",[m
[31m-                    ngx_log_pid, ngx_log_tid);[m
[31m-[m
[31m-    if (log->connection) {[m
[31m-        p = ngx_slprintf(p, last, "*%uA ", log->connection);[m
[31m-    }[m
[31m-[m
[31m-    msg = p;[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(p, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    p = ngx_vslprintf(p, last, fmt, args);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (err) {[m
[31m-        p = ngx_log_errno(p, last, err);[m
[31m-    }[m
[31m-[m
[31m-    if (level != NGX_LOG_DEBUG && log->handler) {[m
[31m-        p = log->handler(log, p, last - p);[m
[31m-    }[m
[31m-[m
[31m-    if (p > last - NGX_LINEFEED_SIZE) {[m
[31m-        p = last - NGX_LINEFEED_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_linefeed(p);[m
[31m-[m
[31m-    wrote_stderr = 0;[m
[31m-    debug_connection = (log->log_level & NGX_LOG_DEBUG_CONNECTION) != 0;[m
[31m-[m
[31m-    while (log) {[m
[31m-[m
[31m-        if (log->log_level < level && !debug_connection) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (log->writer) {[m
[31m-            log->writer(log, level, errstr, p - errstr);[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_time() == log->disk_full_time) {[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD writing to a full filesystem with enabled softupdates[m
[31m-             * may block process for much longer time than writing to non-full[m
[31m-             * filesystem, so we skip writing to a log for one second[m
[31m-             */[m
[31m-[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_write_fd(log->file->fd, errstr, p - errstr);[m
[31m-[m
[31m-        if (n == -1 && ngx_errno == NGX_ENOSPC) {[m
[31m-            log->disk_full_time = ngx_time();[m
[31m-        }[m
[31m-[m
[31m-        if (log->file->fd == ngx_stderr) {[m
[31m-            wrote_stderr = 1;[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        log = log->next;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_use_stderr[m
[31m-        || level > NGX_LOG_WARN[m
[31m-        || wrote_stderr)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    msg -= (7 + err_levels[level].len + 3);[m
[31m-[m
[31m-    (void) ngx_sprintf(msg, "nginx: [%V] ", &err_levels[level]);[m
[31m-[m
[31m-    (void) ngx_write_console(ngx_stderr, msg, p - msg);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if !(NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...)[m
[31m-{[m
[31m-    va_list  args;[m
[31m-[m
[31m-    if (log->log_level >= level) {[m
[31m-        va_start(args, fmt);[m
[31m-        ngx_log_error_core(level, log, err, fmt, args);[m
[31m-        va_end(args);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...)[m
[31m-{[m
[31m-    va_list  args;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, args);[m
[31m-    va_end(args);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_log_abort(ngx_err_t err, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p;[m
[31m-    va_list   args;[m
[31m-    u_char    errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vsnprintf(errstr, sizeof(errstr) - 1, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,[m
[31m-                  "%*s", p - errstr, errstr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_log_stderr(ngx_err_t err, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p, *last;[m
[31m-    va_list   args;[m
[31m-    u_char    errstr[NGX_MAX_ERROR_STR];[m
[31m-[m
[31m-    last = errstr + NGX_MAX_ERROR_STR;[m
[31m-[m
[31m-    p = ngx_cpymem(errstr, "nginx: ", 7);[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(p, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    if (err) {[m
[31m-        p = ngx_log_errno(p, last, err);[m
[31m-    }[m
[31m-[m
[31m-    if (p > last - NGX_LINEFEED_SIZE) {[m
[31m-        p = last - NGX_LINEFEED_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_linefeed(p);[m
[31m-[m
[31m-    (void) ngx_write_console(ngx_stderr, errstr, p - errstr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err)[m
[31m-{[m
[31m-    if (buf > last - 50) {[m
[31m-[m
[31m-        /* leave a space for an error code */[m
[31m-[m
[31m-        buf = last - 50;[m
[31m-        *buf++ = '.';[m
[31m-        *buf++ = '.';[m
[31m-        *buf++ = '.';[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    buf = ngx_slprintf(buf, last, ((unsigned) err < 0x80000000)[m
[31m-                                       ? " (%d: " : " (%Xd: ", err);[m
[31m-#else[m
[31m-    buf = ngx_slprintf(buf, last, " (%d: ", err);[m
[31m-#endif[m
[31m-[m
[31m-    buf = ngx_strerror(err, buf, last - buf);[m
[31m-[m
[31m-    if (buf < last) {[m
[31m-        *buf++ = ')';[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_log_t *[m
[31m-ngx_log_init(u_char *prefix)[m
[31m-{[m
[31m-    u_char  *p, *name;[m
[31m-    size_t   nlen, plen;[m
[31m-[m
[31m-    ngx_log.file = &ngx_log_file;[m
[31m-    ngx_log.log_level = NGX_LOG_NOTICE;[m
[31m-[m
[31m-    name = (u_char *) NGX_ERROR_LOG_PATH;[m
[31m-[m
[31m-    /*[m
[31m-     * we use ngx_strlen() here since BCC warns about[m
[31m-     * condition is always false and unreachable code[m
[31m-     */[m
[31m-[m
[31m-    nlen = ngx_strlen(name);[m
[31m-[m
[31m-    if (nlen == 0) {[m
[31m-        ngx_log_file.fd = ngx_stderr;[m
[31m-        return &ngx_log;[m
[31m-    }[m
[31m-[m
[31m-    p = NULL;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    if (name[1] != ':') {[m
[31m-#else[m
[31m-    if (name[0] != '/') {[m
[31m-#endif[m
[31m-[m
[31m-        if (prefix) {[m
[31m-            plen = ngx_strlen(prefix);[m
[31m-[m
[31m-        } else {[m
[31m-#ifdef NGX_PREFIX[m
[31m-            prefix = (u_char *) NGX_PREFIX;[m
[31m-            plen = ngx_strlen(prefix);[m
[31m-#else[m
[31m-            plen = 0;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (plen) {[m
[31m-            name = malloc(plen + nlen + 2);[m
[31m-            if (name == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_cpymem(name, prefix, plen);[m
[31m-[m
[31m-            if (!ngx_path_separator(*(p - 1))) {[m
[31m-                *p++ = '/';[m
[31m-            }[m
[31m-[m
[31m-            ngx_cpystrn(p, (u_char *) NGX_ERROR_LOG_PATH, nlen + 1);[m
[31m-[m
[31m-            p = name;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND,[m
[31m-                                    NGX_FILE_CREATE_OR_OPEN,[m
[31m-                                    NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (ngx_log_file.fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_stderr(ngx_errno,[m
[31m-                       "[alert] could not open error log file: "[m
[31m-                       ngx_open_file_n " \"%s\" failed", name);[m
[31m-#if (NGX_WIN32)[m
[31m-        ngx_event_log(ngx_errno,[m
[31m-                       "could not open error log file: "[m
[31m-                       ngx_open_file_n " \"%s\" failed", name);[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_file.fd = ngx_stderr;[m
[31m-    }[m
[31m-[m
[31m-    if (p) {[m
[31m-        ngx_free(p);[m
[31m-    }[m
[31m-[m
[31m-    return &ngx_log;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_log_open_default(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_log_t         *log;[m
[31m-    static ngx_str_t   error_log = ngx_string(NGX_ERROR_LOG_PATH);[m
[31m-[m
[31m-    if (ngx_log_get_file_log(&cycle->new_log) != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (cycle->new_log.log_level != 0) {[m
[31m-        /* there are some error logs, but no files */[m
[31m-[m
[31m-        log = ngx_pcalloc(cycle->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* no error logs at all */[m
[31m-        log = &cycle->new_log;[m
[31m-    }[m
[31m-[m
[31m-    log->log_level = NGX_LOG_ERR;[m
[31m-[m
[31m-    log->file = ngx_conf_open_file(cycle, &error_log);[m
[31m-    if (log->file == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (log != &cycle->new_log) {[m
[31m-        ngx_log_insert(&cycle->new_log, log);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_log_redirect_stderr(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    if (cycle->log_use_stderr) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* file log always exists when we are called */[m
[31m-    fd = ngx_log_get_file_log(cycle->log)->file->fd;[m
[31m-[m
[31m-    if (fd != ngx_stderr) {[m
[31m-        if (ngx_set_stderr(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_set_stderr_n " failed");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_log_t *[m
[31m-ngx_log_get_file_log(ngx_log_t *head)[m
[31m-{[m
[31m-    ngx_log_t  *log;[m
[31m-[m
[31m-    for (log = head; log; log = log->next) {[m
[31m-        if (log->file != NULL) {[m
[31m-            return log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t   i, n, d, found;[m
[31m-    ngx_str_t   *value;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        log->log_level = NGX_LOG_ERR;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-        found = 0;[m
[31m-[m
[31m-        for (n = 1; n <= NGX_LOG_DEBUG; n++) {[m
[31m-            if (ngx_strcmp(value[i].data, err_levels[n].data) == 0) {[m
[31m-[m
[31m-                if (log->log_level != 0) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "duplicate log level \"%V\"",[m
[31m-                                       &value[i]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                log->log_level = n;[m
[31m-                found = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) {[m
[31m-            if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) {[m
[31m-                if (log->log_level & ~NGX_LOG_DEBUG_ALL) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid log level \"%V\"",[m
[31m-                                       &value[i]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                log->log_level |= d;[m
[31m-                found = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        if (!found) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid log level \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (log->log_level == NGX_LOG_DEBUG) {[m
[31m-        log->log_level = NGX_LOG_DEBUG_ALL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_log_t  *dummy;[m
[31m-[m
[31m-    dummy = &cf->cycle->new_log;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &dummy);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head)[m
[31m-{[m
[31m-    ngx_log_t          *new_log;[m
[31m-    ngx_str_t          *value, name;[m
[31m-    ngx_syslog_peer_t  *peer;[m
[31m-[m
[31m-    if (*head != NULL && (*head)->log_level == 0) {[m
[31m-        new_log = *head;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        new_log = ngx_pcalloc(cf->pool, sizeof(ngx_log_t));[m
[31m-        if (new_log == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (*head == NULL) {[m
[31m-            *head = new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "stderr") == 0) {[m
[31m-        ngx_str_null(&name);[m
[31m-        cf->cycle->log_use_stderr = 1;[m
[31m-[m
[31m-        new_log->file = ngx_conf_open_file(cf->cycle, &name);[m
[31m-        if (new_log->file == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_strncmp(value[1].data, "memory:", 7) == 0) {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        size_t                 size, needed;[m
[31m-        ngx_pool_cleanup_t    *cln;[m
[31m-        ngx_log_memory_buf_t  *buf;[m
[31m-[m
[31m-        value[1].len -= 7;[m
[31m-        value[1].data += 7;[m
[31m-[m
[31m-        needed = sizeof("MEMLOG  :" NGX_LINEFEED)[m
[31m-                 + cf->conf_file->file.name.len[m
[31m-                 + NGX_SIZE_T_LEN[m
[31m-                 + NGX_INT_T_LEN[m
[31m-                 + NGX_MAX_ERROR_STR;[m
[31m-[m
[31m-        size = ngx_parse_size(&value[1]);[m
[31m-[m
[31m-        if (size == (size_t) NGX_ERROR || size < needed) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid buffer size \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf = ngx_pcalloc(cf->pool, sizeof(ngx_log_memory_buf_t));[m
[31m-        if (buf == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf->start = ngx_pnalloc(cf->pool, size);[m
[31m-        if (buf->start == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf->end = buf->start + size;[m
[31m-[m
[31m-        buf->pos = ngx_slprintf(buf->start, buf->end, "MEMLOG %uz %V:%ui%N",[m
[31m-                                size, &cf->conf_file->file.name,[m
[31m-                                cf->conf_file->line);[m
[31m-[m
[31m-        ngx_memset(buf->pos, ' ', buf->end - buf->pos);[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->data = new_log;[m
[31m-        cln->handler = ngx_log_memory_cleanup;[m
[31m-[m
[31m-        new_log->writer = ngx_log_memory_writer;[m
[31m-        new_log->wdata = buf;[m
[31m-[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "nginx was built without debug support");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) {[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        new_log->writer = ngx_syslog_writer;[m
[31m-        new_log->wdata = peer;[m
[31m-[m
[31m-    } else {[m
[31m-        new_log->file = ngx_conf_open_file(cf->cycle, &value[1]);[m
[31m-        if (new_log->file == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_log_set_levels(cf, new_log) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*head != new_log) {[m
[31m-        ngx_log_insert(*head, new_log);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log)[m
[31m-{[m
[31m-    ngx_log_t  tmp;[m
[31m-[m
[31m-    if (new_log->log_level > log->log_level) {[m
[31m-[m
[31m-        /*[m
[31m-         * list head address is permanent, insert new log after[m
[31m-         * head and swap its contents with head[m
[31m-         */[m
[31m-[m
[31m-        tmp = *log;[m
[31m-        *log = *new_log;[m
[31m-        *new_log = tmp;[m
[31m-[m
[31m-        log->next = new_log;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    while (log->next) {[m
[31m-        if (new_log->log_level > log->next->log_level) {[m
[31m-            new_log->next = log->next;[m
[31m-            log->next = new_log;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        log = log->next;[m
[31m-    }[m
[31m-[m
[31m-    log->next = new_log;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-static void[m
[31m-ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    size_t                 avail, written;[m
[31m-    ngx_log_memory_buf_t  *mem;[m
[31m-[m
[31m-    mem = log->wdata;[m
[31m-[m
[31m-    if (mem == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    written = ngx_atomic_fetch_add(&mem->written, len);[m
[31m-[m
[31m-    p = mem->pos + written % (mem->end - mem->pos);[m
[31m-[m
[31m-    avail = mem->end - p;[m
[31m-[m
[31m-    if (avail >= len) {[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memcpy(p, buf, avail);[m
[31m-        ngx_memcpy(mem->pos, buf + avail, len - avail);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_log_memory_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_log_t *log = data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "destroy memory log buffer");[m
[31m-[m
[31m-    log->wdata = NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.h[m
[1mdeleted file mode 100644[m
[1mindex 385fee4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.h[m
[1m+++ /dev/null[m
[36m@@ -1,270 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LOG_H_INCLUDED_[m
[31m-#define _NGX_LOG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_LOG_STDERR            0[m
[31m-#define NGX_LOG_EMERG             1[m
[31m-#define NGX_LOG_ALERT             2[m
[31m-#define NGX_LOG_CRIT              3[m
[31m-#define NGX_LOG_ERR               4[m
[31m-#define NGX_LOG_WARN              5[m
[31m-#define NGX_LOG_NOTICE            6[m
[31m-#define NGX_LOG_INFO              7[m
[31m-#define NGX_LOG_DEBUG             8[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_CORE        0x010[m
[31m-#define NGX_LOG_DEBUG_ALLOC       0x020[m
[31m-#define NGX_LOG_DEBUG_MUTEX       0x040[m
[31m-#define NGX_LOG_DEBUG_EVENT       0x080[m
[31m-#define NGX_LOG_DEBUG_HTTP        0x100[m
[31m-#define NGX_LOG_DEBUG_MAIL        0x200[m
[31m-#define NGX_LOG_DEBUG_STREAM      0x400[m
[31m-[m
[31m-/*[m
[31m- * do not forget to update debug_levels[] in src/core/ngx_log.c[m
[31m- * after the adding a new debug level[m
[31m- */[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_FIRST       NGX_LOG_DEBUG_CORE[m
[31m-#define NGX_LOG_DEBUG_LAST        NGX_LOG_DEBUG_STREAM[m
[31m-#define NGX_LOG_DEBUG_CONNECTION  0x80000000[m
[31m-#define NGX_LOG_DEBUG_ALL         0x7ffffff0[m
[31m-[m
[31m-[m
[31m-typedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len);[m
[31m-typedef void (*ngx_log_writer_pt) (ngx_log_t *log, ngx_uint_t level,[m
[31m-    u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-struct ngx_log_s {[m
[31m-    ngx_uint_t           log_level;[m
[31m-    ngx_open_file_t     *file;[m
[31m-[m
[31m-    ngx_atomic_uint_t    connection;[m
[31m-[m
[31m-    time_t               disk_full_time;[m
[31m-[m
[31m-    ngx_log_handler_pt   handler;[m
[31m-    void                *data;[m
[31m-[m
[31m-    ngx_log_writer_pt    writer;[m
[31m-    void                *wdata;[m
[31m-[m
[31m-    /*[m
[31m-     * we declare "action" as "char *" because the actions are usually[m
[31m-     * the static strings and in the "u_char *" case we have to override[m
[31m-     * their types all the time[m
[31m-     */[m
[31m-[m
[31m-    char                *action;[m
[31m-[m
[31m-    ngx_log_t           *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_MAX_ERROR_STR[m
[31m-#define NGX_MAX_ERROR_STR   4096[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_HAVE_C99_VARIADIC_MACROS)[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  1[m
[31m-[m
[31m-#define ngx_log_error(level, log, ...)                                        \[m
[31m-    if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__)[m
[31m-[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-#define ngx_log_debug(level, log, ...)                                        \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#elif (NGX_HAVE_GCC_VARIADIC_MACROS)[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  1[m
[31m-[m
[31m-#define ngx_log_error(level, log, args...)                                    \[m
[31m-    if ((log)->log_level >= level) ngx_log_error_core(level, log, args)[m
[31m-[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-#define ngx_log_debug(level, log, args...)                                    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_error_core(NGX_LOG_DEBUG, log, args)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#else /* no variadic macros */[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  0[m
[31m-[m
[31m-void ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, va_list args);[m
[31m-void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-[m
[31m-#endif /* variadic macros */[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)                                  \[m
[31m-        ngx_log_debug(level, log, err, fmt)[m
[31m-[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)                            \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1)[m
[31m-[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2)[m
[31m-[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3)[m
[31m-[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-[m
[31m-#define ngx_log_debug6(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)                    \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-[m
[31m-#define ngx_log_debug7(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)[m
[31m-[m
[31m-#define ngx_log_debug8(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)[m
[31m-[m
[31m-[m
[31m-#else /* no variadic macros */[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)                                  \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt)[m
[31m-[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)                            \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1)[m
[31m-[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2)[m
[31m-[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3)[m
[31m-[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-[m
[31m-#define ngx_log_debug6(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)                    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-[m
[31m-#define ngx_log_debug7(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt,                                     \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)[m
[31m-[m
[31m-#define ngx_log_debug8(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt,                                     \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#else /* !NGX_DEBUG */[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-#define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-#define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \[m
[31m-                       arg6, arg7)[m
[31m-#define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \[m
[31m-                       arg6, arg7, arg8)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-ngx_log_t *ngx_log_init(u_char *prefix);[m
[31m-void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);[m
[31m-void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);[m
[31m-u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);[m
[31m-ngx_int_t ngx_log_open_default(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle);[m
[31m-ngx_log_t *ngx_log_get_file_log(ngx_log_t *head);[m
[31m-char *ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_write_stderr() cannot be implemented as macro, since[m
[31m- * MSVC does not allow to use #ifdef inside macro parameters.[m
[31m- *[m
[31m- * ngx_write_fd() is used instead of ngx_write_console(), since[m
[31m- * CharToOemBuff() inside ngx_write_console() cannot be used with[m
[31m- * read only buffer as destination and CharToOemBuff() is not needed[m
[31m- * for ngx_write_stderr() anyway.[m
[31m- */[m
[31m-static ngx_inline void[m
[31m-ngx_write_stderr(char *text)[m
[31m-{[m
[31m-    (void) ngx_write_fd(ngx_stderr, text, ngx_strlen(text));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_write_stdout(char *text)[m
[31m-{[m
[31m-    (void) ngx_write_fd(ngx_stdout, text, ngx_strlen(text));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_errlog_module;[m
[31m-extern ngx_uint_t    ngx_use_stderr;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LOG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.h.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.h.orig[m
[1mdeleted file mode 100644[m
[1mindex afb73bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_log.h.orig[m
[1m+++ /dev/null[m
[36m@@ -1,268 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LOG_H_INCLUDED_[m
[31m-#define _NGX_LOG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_LOG_STDERR            0[m
[31m-#define NGX_LOG_EMERG             1[m
[31m-#define NGX_LOG_ALERT             2[m
[31m-#define NGX_LOG_CRIT              3[m
[31m-#define NGX_LOG_ERR               4[m
[31m-#define NGX_LOG_WARN              5[m
[31m-#define NGX_LOG_NOTICE            6[m
[31m-#define NGX_LOG_INFO              7[m
[31m-#define NGX_LOG_DEBUG             8[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_CORE        0x010[m
[31m-#define NGX_LOG_DEBUG_ALLOC       0x020[m
[31m-#define NGX_LOG_DEBUG_MUTEX       0x040[m
[31m-#define NGX_LOG_DEBUG_EVENT       0x080[m
[31m-#define NGX_LOG_DEBUG_HTTP        0x100[m
[31m-#define NGX_LOG_DEBUG_MAIL        0x200[m
[31m-#define NGX_LOG_DEBUG_STREAM      0x400[m
[31m-[m
[31m-/*[m
[31m- * do not forget to update debug_levels[] in src/core/ngx_log.c[m
[31m- * after the adding a new debug level[m
[31m- */[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_FIRST       NGX_LOG_DEBUG_CORE[m
[31m-#define NGX_LOG_DEBUG_LAST        NGX_LOG_DEBUG_STREAM[m
[31m-#define NGX_LOG_DEBUG_CONNECTION  0x80000000[m
[31m-#define NGX_LOG_DEBUG_ALL         0x7ffffff0[m
[31m-[m
[31m-[m
[31m-typedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len);[m
[31m-typedef void (*ngx_log_writer_pt) (ngx_log_t *log, ngx_uint_t level,[m
[31m-    u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-struct ngx_log_s {[m
[31m-    ngx_uint_t           log_level;[m
[31m-    ngx_open_file_t     *file;[m
[31m-[m
[31m-    ngx_atomic_uint_t    connection;[m
[31m-[m
[31m-    time_t               disk_full_time;[m
[31m-[m
[31m-    ngx_log_handler_pt   handler;[m
[31m-    void                *data;[m
[31m-[m
[31m-    ngx_log_writer_pt    writer;[m
[31m-    void                *wdata;[m
[31m-[m
[31m-    /*[m
[31m-     * we declare "action" as "char *" because the actions are usually[m
[31m-     * the static strings and in the "u_char *" case we have to override[m
[31m-     * their types all the time[m
[31m-     */[m
[31m-[m
[31m-    char                *action;[m
[31m-[m
[31m-    ngx_log_t           *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_ERROR_STR   2048[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_HAVE_C99_VARIADIC_MACROS)[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  1[m
[31m-[m
[31m-#define ngx_log_error(level, log, ...)                                        \[m
[31m-    if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__)[m
[31m-[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-#define ngx_log_debug(level, log, ...)                                        \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#elif (NGX_HAVE_GCC_VARIADIC_MACROS)[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  1[m
[31m-[m
[31m-#define ngx_log_error(level, log, args...)                                    \[m
[31m-    if ((log)->log_level >= level) ngx_log_error_core(level, log, args)[m
[31m-[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-#define ngx_log_debug(level, log, args...)                                    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_error_core(NGX_LOG_DEBUG, log, args)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#else /* no variadic macros */[m
[31m-[m
[31m-#define NGX_HAVE_VARIADIC_MACROS  0[m
[31m-[m
[31m-void ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, va_list args);[m
[31m-void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,[m
[31m-    const char *fmt, ...);[m
[31m-[m
[31m-[m
[31m-#endif /* variadic macros */[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)                                  \[m
[31m-        ngx_log_debug(level, log, err, fmt)[m
[31m-[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)                            \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1)[m
[31m-[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2)[m
[31m-[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3)[m
[31m-[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \[m
[31m-        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-[m
[31m-#define ngx_log_debug6(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)                    \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-[m
[31m-#define ngx_log_debug7(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)[m
[31m-[m
[31m-#define ngx_log_debug8(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \[m
[31m-        ngx_log_debug(level, log, err, fmt,                                   \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)[m
[31m-[m
[31m-[m
[31m-#else /* no variadic macros */[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)                                  \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt)[m
[31m-[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)                            \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1)[m
[31m-[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2)[m
[31m-[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3)[m
[31m-[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-[m
[31m-#define ngx_log_debug6(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6)                    \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-[m
[31m-#define ngx_log_debug7(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt,                                     \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)[m
[31m-[m
[31m-#define ngx_log_debug8(level, log, err, fmt,                                  \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \[m
[31m-    if ((log)->log_level & level)                                             \[m
[31m-        ngx_log_debug_core(log, err, fmt,                                     \[m
[31m-                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#else /* !NGX_DEBUG */[m
[31m-[m
[31m-#define ngx_log_debug0(level, log, err, fmt)[m
[31m-#define ngx_log_debug1(level, log, err, fmt, arg1)[m
[31m-#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)[m
[31m-#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)[m
[31m-#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)[m
[31m-#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)[m
[31m-#define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)[m
[31m-#define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \[m
[31m-                       arg6, arg7)[m
[31m-#define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \[m
[31m-                       arg6, arg7, arg8)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-ngx_log_t *ngx_log_init(u_char *prefix);[m
[31m-void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);[m
[31m-void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);[m
[31m-u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);[m
[31m-ngx_int_t ngx_log_open_default(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle);[m
[31m-ngx_log_t *ngx_log_get_file_log(ngx_log_t *head);[m
[31m-char *ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head);[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_write_stderr() cannot be implemented as macro, since[m
[31m- * MSVC does not allow to use #ifdef inside macro parameters.[m
[31m- *[m
[31m- * ngx_write_fd() is used instead of ngx_write_console(), since[m
[31m- * CharToOemBuff() inside ngx_write_console() cannot be used with[m
[31m- * read only buffer as destination and CharToOemBuff() is not needed[m
[31m- * for ngx_write_stderr() anyway.[m
[31m- */[m
[31m-static ngx_inline void[m
[31m-ngx_write_stderr(char *text)[m
[31m-{[m
[31m-    (void) ngx_write_fd(ngx_stderr, text, ngx_strlen(text));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_write_stdout(char *text)[m
[31m-{[m
[31m-    (void) ngx_write_fd(ngx_stdout, text, ngx_strlen(text));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_errlog_module;[m
[31m-extern ngx_uint_t    ngx_use_stderr;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LOG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_md5.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_md5.c[m
[1mdeleted file mode 100644[m
[1mindex 440c75b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_md5.c[m
[1m+++ /dev/null[m
[36m@@ -1,289 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * An internal implementation, based on Alexander Peslyak's[m
[31m- * public domain implementation:[m
[31m- * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5[m
[31m- * It is not expected to be optimal and is used only[m
[31m- * if no MD5 implementation was found in system.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_md5.h>[m
[31m-[m
[31m-[m
[31m-#if !(NGX_HAVE_MD5)[m
[31m-[m
[31m-static const u_char *ngx_md5_body(ngx_md5_t *ctx, const u_char *data,[m
[31m-    size_t size);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_md5_init(ngx_md5_t *ctx)[m
[31m-{[m
[31m-    ctx->a = 0x67452301;[m
[31m-    ctx->b = 0xefcdab89;[m
[31m-    ctx->c = 0x98badcfe;[m
[31m-    ctx->d = 0x10325476;[m
[31m-[m
[31m-    ctx->bytes = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_md5_update(ngx_md5_t *ctx, const void *data, size_t size)[m
[31m-{[m
[31m-    size_t  used, free;[m
[31m-[m
[31m-    used = (size_t) (ctx->bytes & 0x3f);[m
[31m-    ctx->bytes += size;[m
[31m-[m
[31m-    if (used) {[m
[31m-        free = 64 - used;[m
[31m-[m
[31m-        if (size < free) {[m
[31m-            ngx_memcpy(&ctx->buffer[used], data, size);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(&ctx->buffer[used], data, free);[m
[31m-        data = (u_char *) data + free;[m
[31m-        size -= free;[m
[31m-        (void) ngx_md5_body(ctx, ctx->buffer, 64);[m
[31m-    }[m
[31m-[m
[31m-    if (size >= 64) {[m
[31m-        data = ngx_md5_body(ctx, data, size & ~(size_t) 0x3f);[m
[31m-        size &= 0x3f;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(ctx->buffer, data, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_md5_final(u_char result[16], ngx_md5_t *ctx)[m
[31m-{[m
[31m-    size_t  used, free;[m
[31m-[m
[31m-    used = (size_t) (ctx->bytes & 0x3f);[m
[31m-[m
[31m-    ctx->buffer[used++] = 0x80;[m
[31m-[m
[31m-    free = 64 - used;[m
[31m-[m
[31m-    if (free < 8) {[m
[31m-        ngx_memzero(&ctx->buffer[used], free);[m
[31m-        (void) ngx_md5_body(ctx, ctx->buffer, 64);[m
[31m-        used = 0;[m
[31m-        free = 64;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ctx->buffer[used], free - 8);[m
[31m-[m
[31m-    ctx->bytes <<= 3;[m
[31m-    ctx->buffer[56] = (u_char) ctx->bytes;[m
[31m-    ctx->buffer[57] = (u_char) (ctx->bytes >> 8);[m
[31m-    ctx->buffer[58] = (u_char) (ctx->bytes >> 16);[m
[31m-    ctx->buffer[59] = (u_char) (ctx->bytes >> 24);[m
[31m-    ctx->buffer[60] = (u_char) (ctx->bytes >> 32);[m
[31m-    ctx->buffer[61] = (u_char) (ctx->bytes >> 40);[m
[31m-    ctx->buffer[62] = (u_char) (ctx->bytes >> 48);[m
[31m-    ctx->buffer[63] = (u_char) (ctx->bytes >> 56);[m
[31m-[m
[31m-    (void) ngx_md5_body(ctx, ctx->buffer, 64);[m
[31m-[m
[31m-    result[0] = (u_char) ctx->a;[m
[31m-    result[1] = (u_char) (ctx->a >> 8);[m
[31m-    result[2] = (u_char) (ctx->a >> 16);[m
[31m-    result[3] = (u_char) (ctx->a >> 24);[m
[31m-    result[4] = (u_char) ctx->b;[m
[31m-    result[5] = (u_char) (ctx->b >> 8);[m
[31m-    result[6] = (u_char) (ctx->b >> 16);[m
[31m-    result[7] = (u_char) (ctx->b >> 24);[m
[31m-    result[8] = (u_char) ctx->c;[m
[31m-    result[9] = (u_char) (ctx->c >> 8);[m
[31m-    result[10] = (u_char) (ctx->c >> 16);[m
[31m-    result[11] = (u_char) (ctx->c >> 24);[m
[31m-    result[12] = (u_char) ctx->d;[m
[31m-    result[13] = (u_char) (ctx->d >> 8);[m
[31m-    result[14] = (u_char) (ctx->d >> 16);[m
[31m-    result[15] = (u_char) (ctx->d >> 24);[m
[31m-[m
[31m-    ngx_memzero(ctx, sizeof(*ctx));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The basic MD5 functions.[m
[31m- *[m
[31m- * F and G are optimized compared to their RFC 1321 definitions for[m
[31m- * architectures that lack an AND-NOT instruction, just like in[m
[31m- * Colin Plumb's implementation.[m
[31m- */[m
[31m-[m
[31m-#define F(x, y, z)  ((z) ^ ((x) & ((y) ^ (z))))[m
[31m-#define G(x, y, z)  ((y) ^ ((z) & ((x) ^ (y))))[m
[31m-#define H(x, y, z)  ((x) ^ (y) ^ (z))[m
[31m-#define I(x, y, z)  ((y) ^ ((x) | ~(z)))[m
[31m-[m
[31m-/*[m
[31m- * The MD5 transformation for all four rounds.[m
[31m- */[m
[31m-[m
[31m-#define STEP(f, a, b, c, d, x, t, s)                                          \[m
[31m-    (a) += f((b), (c), (d)) + (x) + (t);                                      \[m
[31m-    (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));                \[m
[31m-    (a) += (b)[m
[31m-[m
[31m-/*[m
[31m- * SET() reads 4 input bytes in little-endian byte order and stores them[m
[31m- * in a properly aligned word in host byte order.[m
[31m- *[m
[31m- * The check for little-endian architectures that tolerate unaligned[m
[31m- * memory accesses is just an optimization.  Nothing will break if it[m
[31m- * does not work.[m
[31m- */[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define SET(n)      (*(uint32_t *) &p[n * 4])[m
[31m-#define GET(n)      (*(uint32_t *) &p[n * 4])[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define SET(n)                                                                \[m
[31m-    (block[n] =                                                               \[m
[31m-    (uint32_t) p[n * 4] |                                                     \[m
[31m-    ((uint32_t) p[n * 4 + 1] << 8) |                                          \[m
[31m-    ((uint32_t) p[n * 4 + 2] << 16) |                                         \[m
[31m-    ((uint32_t) p[n * 4 + 3] << 24))[m
[31m-[m
[31m-#define GET(n)      block[n][m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * This processes one or more 64-byte data blocks, but does not update[m
[31m- * the bit counters.  There are no alignment requirements.[m
[31m- */[m
[31m-[m
[31m-static const u_char *[m
[31m-ngx_md5_body(ngx_md5_t *ctx, const u_char *data, size_t size)[m
[31m-{[m
[31m-    uint32_t       a, b, c, d;[m
[31m-    uint32_t       saved_a, saved_b, saved_c, saved_d;[m
[31m-    const u_char  *p;[m
[31m-#if !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-    uint32_t       block[16];[m
[31m-#endif[m
[31m-[m
[31m-    p = data;[m
[31m-[m
[31m-    a = ctx->a;[m
[31m-    b = ctx->b;[m
[31m-    c = ctx->c;[m
[31m-    d = ctx->d;[m
[31m-[m
[31m-    do {[m
[31m-        saved_a = a;[m
[31m-        saved_b = b;[m
[31m-        saved_c = c;[m
[31m-        saved_d = d;[m
[31m-[m
[31m-        /* Round 1 */[m
[31m-[m
[31m-        STEP(F, a, b, c, d, SET(0),  0xd76aa478, 7);[m
[31m-        STEP(F, d, a, b, c, SET(1),  0xe8c7b756, 12);[m
[31m-        STEP(F, c, d, a, b, SET(2),  0x242070db, 17);[m
[31m-        STEP(F, b, c, d, a, SET(3),  0xc1bdceee, 22);[m
[31m-        STEP(F, a, b, c, d, SET(4),  0xf57c0faf, 7);[m
[31m-        STEP(F, d, a, b, c, SET(5),  0x4787c62a, 12);[m
[31m-        STEP(F, c, d, a, b, SET(6),  0xa8304613, 17);[m
[31m-        STEP(F, b, c, d, a, SET(7),  0xfd469501, 22);[m
[31m-        STEP(F, a, b, c, d, SET(8),  0x698098d8, 7);[m
[31m-        STEP(F, d, a, b, c, SET(9),  0x8b44f7af, 12);[m
[31m-        STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17);[m
[31m-        STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22);[m
[31m-        STEP(F, a, b, c, d, SET(12), 0x6b901122, 7);[m
[31m-        STEP(F, d, a, b, c, SET(13), 0xfd987193, 12);[m
[31m-        STEP(F, c, d, a, b, SET(14), 0xa679438e, 17);[m
[31m-        STEP(F, b, c, d, a, SET(15), 0x49b40821, 22);[m
[31m-[m
[31m-        /* Round 2 */[m
[31m-[m
[31m-        STEP(G, a, b, c, d, GET(1),  0xf61e2562, 5);[m
[31m-        STEP(G, d, a, b, c, GET(6),  0xc040b340, 9);[m
[31m-        STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14);[m
[31m-        STEP(G, b, c, d, a, GET(0),  0xe9b6c7aa, 20);[m
[31m-        STEP(G, a, b, c, d, GET(5),  0xd62f105d, 5);[m
[31m-        STEP(G, d, a, b, c, GET(10), 0x02441453, 9);[m
[31m-        STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14);[m
[31m-        STEP(G, b, c, d, a, GET(4),  0xe7d3fbc8, 20);[m
[31m-        STEP(G, a, b, c, d, GET(9),  0x21e1cde6, 5);[m
[31m-        STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9);[m
[31m-        STEP(G, c, d, a, b, GET(3),  0xf4d50d87, 14);[m
[31m-        STEP(G, b, c, d, a, GET(8),  0x455a14ed, 20);[m
[31m-        STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5);[m
[31m-        STEP(G, d, a, b, c, GET(2),  0xfcefa3f8, 9);[m
[31m-        STEP(G, c, d, a, b, GET(7),  0x676f02d9, 14);[m
[31m-        STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20);[m
[31m-[m
[31m-        /* Round 3 */[m
[31m-[m
[31m-        STEP(H, a, b, c, d, GET(5),  0xfffa3942, 4);[m
[31m-        STEP(H, d, a, b, c, GET(8),  0x8771f681, 11);[m
[31m-        STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16);[m
[31m-        STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23);[m
[31m-        STEP(H, a, b, c, d, GET(1),  0xa4beea44, 4);[m
[31m-        STEP(H, d, a, b, c, GET(4),  0x4bdecfa9, 11);[m
[31m-        STEP(H, c, d, a, b, GET(7),  0xf6bb4b60, 16);[m
[31m-        STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23);[m
[31m-        STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4);[m
[31m-        STEP(H, d, a, b, c, GET(0),  0xeaa127fa, 11);[m
[31m-        STEP(H, c, d, a, b, GET(3),  0xd4ef3085, 16);[m
[31m-        STEP(H, b, c, d, a, GET(6),  0x04881d05, 23);[m
[31m-        STEP(H, a, b, c, d, GET(9),  0xd9d4d039, 4);[m
[31m-        STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11);[m
[31m-        STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16);[m
[31m-        STEP(H, b, c, d, a, GET(2),  0xc4ac5665, 23);[m
[31m-[m
[31m-        /* Round 4 */[m
[31m-[m
[31m-        STEP(I, a, b, c, d, GET(0),  0xf4292244, 6);[m
[31m-        STEP(I, d, a, b, c, GET(7),  0x432aff97, 10);[m
[31m-        STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15);[m
[31m-        STEP(I, b, c, d, a, GET(5),  0xfc93a039, 21);[m
[31m-        STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6);[m
[31m-        STEP(I, d, a, b, c, GET(3),  0x8f0ccc92, 10);[m
[31m-        STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15);[m
[31m-        STEP(I, b, c, d, a, GET(1),  0x85845dd1, 21);[m
[31m-        STEP(I, a, b, c, d, GET(8),  0x6fa87e4f, 6);[m
[31m-        STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10);[m
[31m-        STEP(I, c, d, a, b, GET(6),  0xa3014314, 15);[m
[31m-        STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21);[m
[31m-        STEP(I, a, b, c, d, GET(4),  0xf7537e82, 6);[m
[31m-        STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10);[m
[31m-        STEP(I, c, d, a, b, GET(2),  0x2ad7d2bb, 15);[m
[31m-        STEP(I, b, c, d, a, GET(9),  0xeb86d391, 21);[m
[31m-[m
[31m-        a += saved_a;[m
[31m-        b += saved_b;[m
[31m-        c += saved_c;[m
[31m-        d += saved_d;[m
[31m-[m
[31m-        p += 64;[m
[31m-[m
[31m-    } while (size -= 64);[m
[31m-[m
[31m-    ctx->a = a;[m
[31m-    ctx->b = b;[m
[31m-    ctx->c = c;[m
[31m-    ctx->d = d;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_md5.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_md5.h[m
[1mdeleted file mode 100644[m
[1mindex 18d09d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_md5.h[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MD5_H_INCLUDED_[m
[31m-#define _NGX_MD5_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_MD5)[m
[31m-[m
[31m-#if (NGX_HAVE_OPENSSL_MD5_H)[m
[31m-#include <openssl/md5.h>[m
[31m-#else[m
[31m-#include <md5.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef MD5_CTX  ngx_md5_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_OPENSSL_MD5)[m
[31m-[m
[31m-#define ngx_md5_init    MD5_Init[m
[31m-#define ngx_md5_update  MD5_Update[m
[31m-#define ngx_md5_final   MD5_Final[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_md5_init    MD5Init[m
[31m-#define ngx_md5_update  MD5Update[m
[31m-#define ngx_md5_final   MD5Final[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#else /* !NGX_HAVE_MD5 */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint64_t  bytes;[m
[31m-    uint32_t  a, b, c, d;[m
[31m-    u_char    buffer[64];[m
[31m-} ngx_md5_t;[m
[31m-[m
[31m-[m
[31m-void ngx_md5_init(ngx_md5_t *ctx);[m
[31m-void ngx_md5_update(ngx_md5_t *ctx, const void *data, size_t size);[m
[31m-void ngx_md5_final(u_char result[16], ngx_md5_t *ctx);[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* _NGX_MD5_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_module.c[m
[1mdeleted file mode 100644[m
[1mindex 3e3c506..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,360 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_DYNAMIC_MODULES  128[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t ngx_module_index(ngx_cycle_t *cycle);[m
[31m-static ngx_uint_t ngx_module_ctx_index(ngx_cycle_t *cycle, ngx_uint_t type,[m
[31m-    ngx_uint_t index);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t         ngx_max_module;[m
[31m-static ngx_uint_t  ngx_modules_n;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_preinit_modules(void)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    for (i = 0; ngx_modules[i]; i++) {[m
[31m-        ngx_modules[i]->index = i;[m
[31m-        ngx_modules[i]->name = ngx_module_names[i];[m
[31m-    }[m
[31m-[m
[31m-    ngx_modules_n = i;[m
[31m-    ngx_max_module = ngx_modules_n + NGX_MAX_DYNAMIC_MODULES;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_cycle_modules(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    /*[m
[31m-     * create a list of modules to be used for this cycle,[m
[31m-     * copy static modules to it[m
[31m-     */[m
[31m-[m
[31m-    cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1)[m
[31m-                                              * sizeof(ngx_module_t *));[m
[31m-    if (cycle->modules == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(cycle->modules, ngx_modules,[m
[31m-               ngx_modules_n * sizeof(ngx_module_t *));[m
[31m-[m
[31m-    cycle->modules_n = ngx_modules_n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_init_modules(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_module) {[m
[31m-            if (cycle->modules[i]->init_module(cycle) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_count_modules(ngx_cycle_t *cycle, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t     i, next, max;[m
[31m-    ngx_module_t  *module;[m
[31m-[m
[31m-    next = 0;[m
[31m-    max = 0;[m
[31m-[m
[31m-    /* count appropriate modules, set up their indices */[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        module = cycle->modules[i];[m
[31m-[m
[31m-        if (module->type != type) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (module->ctx_index != NGX_MODULE_UNSET_INDEX) {[m
[31m-[m
[31m-            /* if ctx_index was assigned, preserve it */[m
[31m-[m
[31m-            if (module->ctx_index > max) {[m
[31m-                max = module->ctx_index;[m
[31m-            }[m
[31m-[m
[31m-            if (module->ctx_index == next) {[m
[31m-                next++;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* search for some free index */[m
[31m-[m
[31m-        module->ctx_index = ngx_module_ctx_index(cycle, type, next);[m
[31m-[m
[31m-        if (module->ctx_index > max) {[m
[31m-            max = module->ctx_index;[m
[31m-        }[m
[31m-[m
[31m-        next = module->ctx_index + 1;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * make sure the number returned is big enough for previous[m
[31m-     * cycle as well, else there will be problems if the number[m
[31m-     * will be stored in a global variable (as it's used to be)[m
[31m-     * and we'll have to roll back to the previous cycle[m
[31m-     */[m
[31m-[m
[31m-    if (cycle->old_cycle && cycle->old_cycle->modules) {[m
[31m-[m
[31m-        for (i = 0; cycle->old_cycle->modules[i]; i++) {[m
[31m-            module = cycle->old_cycle->modules[i];[m
[31m-[m
[31m-            if (module->type != type) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (module->ctx_index > max) {[m
[31m-                max = module->ctx_index;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* prevent loading of additional modules */[m
[31m-[m
[31m-    cycle->modules_used = 1;[m
[31m-[m
[31m-    return max + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_add_module(ngx_conf_t *cf, ngx_str_t *file, ngx_module_t *module,[m
[31m-    char **order)[m
[31m-{[m
[31m-    void               *rv;[m
[31m-    ngx_uint_t          i, m, before;[m
[31m-    ngx_core_module_t  *core_module;[m
[31m-[m
[31m-    if (cf->cycle->modules_n >= ngx_max_module) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "too many modules loaded");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (module->version != nginx_version) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "module \"%V\" version %ui instead of %ui",[m
[31m-                           file, module->version, (ngx_uint_t) nginx_version);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(module->signature, NGX_MODULE_SIGNATURE) != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "module \"%V\" is not binary compatible",[m
[31m-                           file);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (ngx_strcmp(cf->cycle->modules[m]->name, module->name) == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "module \"%s\" is already loaded",[m
[31m-                               module->name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * if the module wasn't previously loaded, assign an index[m
[31m-     */[m
[31m-[m
[31m-    if (module->index == NGX_MODULE_UNSET_INDEX) {[m
[31m-        module->index = ngx_module_index(cf->cycle);[m
[31m-[m
[31m-        if (module->index >= ngx_max_module) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "too many modules loaded");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * put the module into the cycle->modules array[m
[31m-     */[m
[31m-[m
[31m-    before = cf->cycle->modules_n;[m
[31m-[m
[31m-    if (order) {[m
[31m-        for (i = 0; order[i]; i++) {[m
[31m-            if (ngx_strcmp(order[i], module->name) == 0) {[m
[31m-                i++;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; order[i]; i++) {[m
[31m-[m
[31m-#if 0[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_CORE, cf->log, 0,[m
[31m-                           "module: %s before %s",[m
[31m-                           module->name, order[i]);[m
[31m-#endif[m
[31m-[m
[31m-            for (m = 0; m < before; m++) {[m
[31m-                if (ngx_strcmp(cf->cycle->modules[m]->name, order[i]) == 0) {[m
[31m-[m
[31m-                    ngx_log_debug3(NGX_LOG_DEBUG_CORE, cf->log, 0,[m
[31m-                                   "module: %s before %s:%i",[m
[31m-                                   module->name, order[i], m);[m
[31m-[m
[31m-                    before = m;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* put the module before modules[before] */[m
[31m-[m
[31m-    if (before != cf->cycle->modules_n) {[m
[31m-        ngx_memmove(&cf->cycle->modules[before + 1],[m
[31m-                    &cf->cycle->modules[before],[m
[31m-                    (cf->cycle->modules_n - before) * sizeof(ngx_module_t *));[m
[31m-    }[m
[31m-[m
[31m-    cf->cycle->modules[before] = module;[m
[31m-    cf->cycle->modules_n++;[m
[31m-[m
[31m-    if (module->type == NGX_CORE_MODULE) {[m
[31m-[m
[31m-        /*[m
[31m-         * we are smart enough to initialize core modules;[m
[31m-         * other modules are expected to be loaded before[m
[31m-         * initialization - e.g., http modules must be loaded[m
[31m-         * before http{} block[m
[31m-         */[m
[31m-[m
[31m-        core_module = module->ctx;[m
[31m-[m
[31m-        if (core_module->create_conf) {[m
[31m-            rv = core_module->create_conf(cf->cycle);[m
[31m-            if (rv == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cf->cycle->conf_ctx[module->index] = rv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_module_index(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t     i, index;[m
[31m-    ngx_module_t  *module;[m
[31m-[m
[31m-    index = 0;[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    /* find an unused index */[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        module = cycle->modules[i];[m
[31m-[m
[31m-        if (module->index == index) {[m
[31m-            index++;[m
[31m-            goto again;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* check previous cycle */[m
[31m-[m
[31m-    if (cycle->old_cycle && cycle->old_cycle->modules) {[m
[31m-[m
[31m-        for (i = 0; cycle->old_cycle->modules[i]; i++) {[m
[31m-            module = cycle->old_cycle->modules[i];[m
[31m-[m
[31m-            if (module->index == index) {[m
[31m-                index++;[m
[31m-                goto again;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return index;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_module_ctx_index(ngx_cycle_t *cycle, ngx_uint_t type, ngx_uint_t index)[m
[31m-{[m
[31m-    ngx_uint_t     i;[m
[31m-    ngx_module_t  *module;[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    /* find an unused ctx_index */[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        module = cycle->modules[i];[m
[31m-[m
[31m-        if (module->type != type) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (module->ctx_index == index) {[m
[31m-            index++;[m
[31m-            goto again;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* check previous cycle */[m
[31m-[m
[31m-    if (cycle->old_cycle && cycle->old_cycle->modules) {[m
[31m-[m
[31m-        for (i = 0; cycle->old_cycle->modules[i]; i++) {[m
[31m-            module = cycle->old_cycle->modules[i];[m
[31m-[m
[31m-            if (module->type != type) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (module->ctx_index == index) {[m
[31m-                index++;[m
[31m-                goto again;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return index;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_module.h[m
[1mdeleted file mode 100644[m
[1mindex e911cb4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,307 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MODULE_H_INCLUDED_[m
[31m-#define _NGX_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MODULE_UNSET_INDEX  (ngx_uint_t) -1[m
[31m-[m
[31m-[m
[31m-#define NGX_MODULE_SIGNATURE_0                                                \[m
[31m-    ngx_value(NGX_PTR_SIZE) ","                                               \[m
[31m-    ngx_value(NGX_SIG_ATOMIC_T_SIZE) ","                                      \[m
[31m-    ngx_value(NGX_TIME_T_SIZE) ","[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-#define NGX_MODULE_SIGNATURE_1   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_1   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-#define NGX_MODULE_SIGNATURE_2   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_2   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-#define NGX_MODULE_SIGNATURE_3   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_3   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-#define NGX_MODULE_SIGNATURE_4   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_4   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-#define NGX_MODULE_SIGNATURE_5   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_5   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL)[m
[31m-#define NGX_MODULE_SIGNATURE_6   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_6   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-#define NGX_MODULE_SIGNATURE_7   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_7   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-#define NGX_MODULE_SIGNATURE_8   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_8   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-#define NGX_MODULE_SIGNATURE_9   "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_9   "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-#define NGX_MODULE_SIGNATURE_10  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_10  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-#define NGX_MODULE_SIGNATURE_11  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_11  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-#define NGX_MODULE_SIGNATURE_12  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_12  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-#define NGX_MODULE_SIGNATURE_13  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_13  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-#define NGX_MODULE_SIGNATURE_14  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_14  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-#define NGX_MODULE_SIGNATURE_15  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_15  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-#define NGX_MODULE_SIGNATURE_16  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_16  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_MD5)[m
[31m-#define NGX_MODULE_SIGNATURE_17  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_17  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-#define NGX_MODULE_SIGNATURE_18  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_18  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-#define NGX_MODULE_SIGNATURE_19  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_19  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-#define NGX_MODULE_SIGNATURE_20  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_20  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#define NGX_MODULE_SIGNATURE_21  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_21  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-#define NGX_MODULE_SIGNATURE_22  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_22  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-#define NGX_MODULE_SIGNATURE_23  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_23  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-#define NGX_MODULE_SIGNATURE_24  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_24  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-#define NGX_MODULE_SIGNATURE_25  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_25  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-#define NGX_MODULE_SIGNATURE_26  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_26  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-#define NGX_MODULE_SIGNATURE_27  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_27  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-#define NGX_MODULE_SIGNATURE_28  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_28  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-#define NGX_MODULE_SIGNATURE_29  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_29  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_HEADERS)[m
[31m-#define NGX_MODULE_SIGNATURE_30  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_30  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-#define NGX_MODULE_SIGNATURE_31  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_31  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-#define NGX_MODULE_SIGNATURE_32  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_32  "0"[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-#define NGX_MODULE_SIGNATURE_33  "1"[m
[31m-#else[m
[31m-#define NGX_MODULE_SIGNATURE_33  "0"[m
[31m-#endif[m
[31m-[m
[31m-#define NGX_MODULE_SIGNATURE                                                  \[m
[31m-    NGX_MODULE_SIGNATURE_0 NGX_MODULE_SIGNATURE_1 NGX_MODULE_SIGNATURE_2      \[m
[31m-    NGX_MODULE_SIGNATURE_3 NGX_MODULE_SIGNATURE_4 NGX_MODULE_SIGNATURE_5      \[m
[31m-    NGX_MODULE_SIGNATURE_6 NGX_MODULE_SIGNATURE_7 NGX_MODULE_SIGNATURE_8      \[m
[31m-    NGX_MODULE_SIGNATURE_9 NGX_MODULE_SIGNATURE_10 NGX_MODULE_SIGNATURE_11    \[m
[31m-    NGX_MODULE_SIGNATURE_12 NGX_MODULE_SIGNATURE_13 NGX_MODULE_SIGNATURE_14   \[m
[31m-    NGX_MODULE_SIGNATURE_15 NGX_MODULE_SIGNATURE_16 NGX_MODULE_SIGNATURE_17   \[m
[31m-    NGX_MODULE_SIGNATURE_18 NGX_MODULE_SIGNATURE_19 NGX_MODULE_SIGNATURE_20   \[m
[31m-    NGX_MODULE_SIGNATURE_21 NGX_MODULE_SIGNATURE_22 NGX_MODULE_SIGNATURE_23   \[m
[31m-    NGX_MODULE_SIGNATURE_24 NGX_MODULE_SIGNATURE_25 NGX_MODULE_SIGNATURE_26   \[m
[31m-    NGX_MODULE_SIGNATURE_27 NGX_MODULE_SIGNATURE_28 NGX_MODULE_SIGNATURE_29   \[m
[31m-    NGX_MODULE_SIGNATURE_30 NGX_MODULE_SIGNATURE_31 NGX_MODULE_SIGNATURE_32   \[m
[31m-    NGX_MODULE_SIGNATURE_33[m
[31m-[m
[31m-[m
[31m-#define NGX_MODULE_V1                                                         \[m
[31m-    NGX_MODULE_UNSET_INDEX, NGX_MODULE_UNSET_INDEX,                           \[m
[31m-    NULL, 0, 0, nginx_version, NGX_MODULE_SIGNATURE[m
[31m-[m
[31m-#define NGX_MODULE_V1_PADDING  0, 0, 0, 0, 0, 0, 0, 0[m
[31m-[m
[31m-[m
[31m-struct ngx_module_s {[m
[31m-    ngx_uint_t            ctx_index;[m
[31m-    ngx_uint_t            index;[m
[31m-[m
[31m-    char                 *name;[m
[31m-[m
[31m-    ngx_uint_t            spare0;[m
[31m-    ngx_uint_t            spare1;[m
[31m-[m
[31m-    ngx_uint_t            version;[m
[31m-    const char           *signature;[m
[31m-[m
[31m-    void                 *ctx;[m
[31m-    ngx_command_t        *commands;[m
[31m-    ngx_uint_t            type;[m
[31m-[m
[31m-    ngx_int_t           (*init_master)(ngx_log_t *log);[m
[31m-[m
[31m-    ngx_int_t           (*init_module)(ngx_cycle_t *cycle);[m
[31m-[m
[31m-    ngx_int_t           (*init_process)(ngx_cycle_t *cycle);[m
[31m-    ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);[m
[31m-    void                (*exit_thread)(ngx_cycle_t *cycle);[m
[31m-    void                (*exit_process)(ngx_cycle_t *cycle);[m
[31m-[m
[31m-    void                (*exit_master)(ngx_cycle_t *cycle);[m
[31m-[m
[31m-    uintptr_t             spare_hook0;[m
[31m-    uintptr_t             spare_hook1;[m
[31m-    uintptr_t             spare_hook2;[m
[31m-    uintptr_t             spare_hook3;[m
[31m-    uintptr_t             spare_hook4;[m
[31m-    uintptr_t             spare_hook5;[m
[31m-    uintptr_t             spare_hook6;[m
[31m-    uintptr_t             spare_hook7;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t             name;[m
[31m-    void               *(*create_conf)(ngx_cycle_t *cycle);[m
[31m-    char               *(*init_conf)(ngx_cycle_t *cycle, void *conf);[m
[31m-} ngx_core_module_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_preinit_modules(void);[m
[31m-ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_init_modules(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_count_modules(ngx_cycle_t *cycle, ngx_uint_t type);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_add_module(ngx_conf_t *cf, ngx_str_t *file,[m
[31m-    ngx_module_t *module, char **order);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  *ngx_modules[];[m
[31m-extern ngx_uint_t     ngx_max_module;[m
[31m-[m
[31m-extern char          *ngx_module_names[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_murmurhash.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_murmurhash.c[m
[1mdeleted file mode 100644[m
[1mindex c31e0e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_murmurhash.c[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Austin Appleby[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-uint32_t[m
[31m-ngx_murmur_hash2(u_char *data, size_t len)[m
[31m-{[m
[31m-    uint32_t  h, k;[m
[31m-[m
[31m-    h = 0 ^ len;[m
[31m-[m
[31m-    while (len >= 4) {[m
[31m-        k  = data[0];[m
[31m-        k |= data[1] << 8;[m
[31m-        k |= data[2] << 16;[m
[31m-        k |= data[3] << 24;[m
[31m-[m
[31m-        k *= 0x5bd1e995;[m
[31m-        k ^= k >> 24;[m
[31m-        k *= 0x5bd1e995;[m
[31m-[m
[31m-        h *= 0x5bd1e995;[m
[31m-        h ^= k;[m
[31m-[m
[31m-        data += 4;[m
[31m-        len -= 4;[m
[31m-    }[m
[31m-[m
[31m-    switch (len) {[m
[31m-    case 3:[m
[31m-        h ^= data[2] << 16;[m
[31m-    case 2:[m
[31m-        h ^= data[1] << 8;[m
[31m-    case 1:[m
[31m-        h ^= data[0];[m
[31m-        h *= 0x5bd1e995;[m
[31m-    }[m
[31m-[m
[31m-    h ^= h >> 13;[m
[31m-    h *= 0x5bd1e995;[m
[31m-    h ^= h >> 15;[m
[31m-[m
[31m-    return h;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_murmurhash.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_murmurhash.h[m
[1mdeleted file mode 100644[m
[1mindex 54e867d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_murmurhash.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MURMURHASH_H_INCLUDED_[m
[31m-#define _NGX_MURMURHASH_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-uint32_t ngx_murmur_hash2(u_char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MURMURHASH_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_open_file_cache.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_open_file_cache.c[m
[1mdeleted file mode 100644[m
[1mindex b23ee78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_open_file_cache.c[m
[1m+++ /dev/null[m
[36m@@ -1,1253 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * open file cache caches[m
[31m- *    open file handles with stat() info;[m
[31m- *    directories stat() info;[m
[31m- *    files and directories errors: not found, access denied, etc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#define NGX_MIN_READ_AHEAD  (128 * 1024)[m
[31m-[m
[31m-[m
[31m-static void ngx_open_file_cache_cleanup(void *data);[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-static ngx_fd_t ngx_openat_file_owner(ngx_fd_t at_fd, const u_char *name,[m
[31m-    ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log);[m
[31m-#if (NGX_HAVE_O_PATH)[m
[31m-static ngx_int_t ngx_file_o_path_info(ngx_fd_t fd, ngx_file_info_t *fi,[m
[31m-    ngx_log_t *log);[m
[31m-#endif[m
[31m-#endif[m
[31m-static ngx_fd_t ngx_open_file_wrapper(ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_int_t mode, ngx_int_t create,[m
[31m-    ngx_int_t access, ngx_log_t *log);[m
[31m-static ngx_int_t ngx_file_info_wrapper(ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_file_info_t *fi, ngx_log_t *log);[m
[31m-static ngx_int_t ngx_open_and_stat_file(ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_log_t *log);[m
[31m-static void ngx_open_file_add_event(ngx_open_file_cache_t *cache,[m
[31m-    ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log);[m
[31m-static void ngx_open_file_cleanup(void *data);[m
[31m-static void ngx_close_cached_file(ngx_open_file_cache_t *cache,[m
[31m-    ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log);[m
[31m-static void ngx_open_file_del_event(ngx_cached_open_file_t *file);[m
[31m-static void ngx_expire_old_cached_files(ngx_open_file_cache_t *cache,[m
[31m-    ngx_uint_t n, ngx_log_t *log);[m
[31m-static void ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-static ngx_cached_open_file_t *[m
[31m-    ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name,[m
[31m-    uint32_t hash);[m
[31m-static void ngx_open_file_cache_remove(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_open_file_cache_t *[m
[31m-ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_open_file_cache_t  *cache;[m
[31m-[m
[31m-    cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t));[m
[31m-    if (cache == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(&cache->rbtree, &cache->sentinel,[m
[31m-                    ngx_open_file_cache_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&cache->expire_queue);[m
[31m-[m
[31m-    cache->current = 0;[m
[31m-    cache->max = max;[m
[31m-    cache->inactive = inactive;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_open_file_cache_cleanup;[m
[31m-    cln->data = cache;[m
[31m-[m
[31m-    return cache;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_cache_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_open_file_cache_t  *cache = data;[m
[31m-[m
[31m-    ngx_queue_t             *q;[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                   "open file cache cleanup");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->expire_queue)) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->expire_queue);[m
[31m-[m
[31m-        file = ngx_queue_data(q, ngx_cached_open_file_t, queue);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->rbtree, &file->node);[m
[31m-[m
[31m-        cache->current--;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                       "delete cached open file: %s", file->name);[m
[31m-[m
[31m-        if (!file->err && !file->is_dir) {[m
[31m-            file->close = 1;[m
[31m-            file->count = 0;[m
[31m-            ngx_close_cached_file(cache, file, 0, ngx_cycle->log);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_free(file->name);[m
[31m-            ngx_free(file);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cache->current) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "%ui items still left in open file cache",[m
[31m-                      cache->current);[m
[31m-    }[m
[31m-[m
[31m-    if (cache->rbtree.root != cache->rbtree.sentinel) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "rbtree still is not empty in open file cache");[m
[31m-[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_pool_t *pool)[m
[31m-{[m
[31m-    time_t                          now;[m
[31m-    uint32_t                        hash;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_file_info_t                 fi;[m
[31m-    ngx_pool_cleanup_t             *cln;[m
[31m-    ngx_cached_open_file_t         *file;[m
[31m-    ngx_pool_cleanup_file_t        *clnf;[m
[31m-    ngx_open_file_cache_cleanup_t  *ofcln;[m
[31m-[m
[31m-    of->fd = NGX_INVALID_FILE;[m
[31m-    of->err = 0;[m
[31m-[m
[31m-    if (cache == NULL) {[m
[31m-[m
[31m-        if (of->test_only) {[m
[31m-[m
[31m-            if (ngx_file_info_wrapper(name, of, &fi, pool->log)[m
[31m-                == NGX_FILE_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            of->uniq = ngx_file_uniq(&fi);[m
[31m-            of->mtime = ngx_file_mtime(&fi);[m
[31m-            of->size = ngx_file_size(&fi);[m
[31m-            of->fs_size = ngx_file_fs_size(&fi);[m
[31m-            of->is_dir = ngx_is_dir(&fi);[m
[31m-            of->is_file = ngx_is_file(&fi);[m
[31m-            of->is_link = ngx_is_link(&fi);[m
[31m-            of->is_exec = ngx_is_exec(&fi);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_open_and_stat_file(name, of, pool->log);[m
[31m-[m
[31m-        if (rc == NGX_OK && !of->is_dir) {[m
[31m-            cln->handler = ngx_pool_cleanup_file;[m
[31m-            clnf = cln->data;[m
[31m-[m
[31m-            clnf->fd = of->fd;[m
[31m-            clnf->name = name->data;[m
[31m-            clnf->log = pool->log;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(pool, sizeof(ngx_open_file_cache_cleanup_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    hash = ngx_crc32_long(name->data, name->len);[m
[31m-[m
[31m-    file = ngx_open_file_lookup(cache, name, hash);[m
[31m-[m
[31m-    if (file) {[m
[31m-[m
[31m-        file->uses++;[m
[31m-[m
[31m-        ngx_queue_remove(&file->queue);[m
[31m-[m
[31m-        if (file->fd == NGX_INVALID_FILE && file->err == 0 && !file->is_dir) {[m
[31m-[m
[31m-            /* file was not used often enough to keep open */[m
[31m-[m
[31m-            rc = ngx_open_and_stat_file(name, of, pool->log);[m
[31m-[m
[31m-            if (rc != NGX_OK && (of->err == 0 || !of->errors)) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            goto add_event;[m
[31m-        }[m
[31m-[m
[31m-        if (file->use_event[m
[31m-            || (file->event == NULL[m
[31m-                && (of->uniq == 0 || of->uniq == file->uniq)[m
[31m-                && now - file->created < of->valid[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-                && of->disable_symlinks == file->disable_symlinks[m
[31m-                && of->disable_symlinks_from == file->disable_symlinks_from[m
[31m-#endif[m
[31m-            ))[m
[31m-        {[m
[31m-            if (file->err == 0) {[m
[31m-[m
[31m-                of->fd = file->fd;[m
[31m-                of->uniq = file->uniq;[m
[31m-                of->mtime = file->mtime;[m
[31m-                of->size = file->size;[m
[31m-[m
[31m-                of->is_dir = file->is_dir;[m
[31m-                of->is_file = file->is_file;[m
[31m-                of->is_link = file->is_link;[m
[31m-                of->is_exec = file->is_exec;[m
[31m-                of->is_directio = file->is_directio;[m
[31m-[m
[31m-                if (!file->is_dir) {[m
[31m-                    file->count++;[m
[31m-                    ngx_open_file_add_event(cache, file, of, pool->log);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                of->err = file->err;[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-                of->failed = file->disable_symlinks ? ngx_openat_file_n[m
[31m-                                                    : ngx_open_file_n;[m
[31m-#else[m
[31m-                of->failed = ngx_open_file_n;[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0,[m
[31m-                       "retest open file: %s, fd:%d, c:%d, e:%d",[m
[31m-                       file->name, file->fd, file->count, file->err);[m
[31m-[m
[31m-        if (file->is_dir) {[m
[31m-[m
[31m-            /*[m
[31m-             * chances that directory became file are very small[m
[31m-             * so test_dir flag allows to use a single syscall[m
[31m-             * in ngx_file_info() instead of three syscalls[m
[31m-             */[m
[31m-[m
[31m-            of->test_dir = 1;[m
[31m-        }[m
[31m-[m
[31m-        of->fd = file->fd;[m
[31m-        of->uniq = file->uniq;[m
[31m-[m
[31m-        rc = ngx_open_and_stat_file(name, of, pool->log);[m
[31m-[m
[31m-        if (rc != NGX_OK && (of->err == 0 || !of->errors)) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (of->is_dir) {[m
[31m-[m
[31m-            if (file->is_dir || file->err) {[m
[31m-                goto update;[m
[31m-            }[m
[31m-[m
[31m-            /* file became directory */[m
[31m-[m
[31m-        } else if (of->err == 0) {  /* file */[m
[31m-[m
[31m-            if (file->is_dir || file->err) {[m
[31m-                goto add_event;[m
[31m-            }[m
[31m-[m
[31m-            if (of->uniq == file->uniq) {[m
[31m-[m
[31m-                if (file->event) {[m
[31m-                    file->use_event = 1;[m
[31m-                }[m
[31m-[m
[31m-                of->is_directio = file->is_directio;[m
[31m-[m
[31m-                goto update;[m
[31m-            }[m
[31m-[m
[31m-            /* file was changed */[m
[31m-[m
[31m-        } else { /* error to cache */[m
[31m-[m
[31m-            if (file->err || file->is_dir) {[m
[31m-                goto update;[m
[31m-            }[m
[31m-[m
[31m-            /* file was removed, etc. */[m
[31m-        }[m
[31m-[m
[31m-        if (file->count == 0) {[m
[31m-[m
[31m-            ngx_open_file_del_event(file);[m
[31m-[m
[31m-            if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,[m
[31m-                              ngx_close_file_n " \"%V\" failed", name);[m
[31m-            }[m
[31m-[m
[31m-            goto add_event;[m
[31m-        }[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->rbtree, &file->node);[m
[31m-[m
[31m-        cache->current--;[m
[31m-[m
[31m-        file->close = 1;[m
[31m-[m
[31m-        goto create;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    rc = ngx_open_and_stat_file(name, of, pool->log);[m
[31m-[m
[31m-    if (rc != NGX_OK && (of->err == 0 || !of->errors)) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-create:[m
[31m-[m
[31m-    if (cache->current >= cache->max) {[m
[31m-        ngx_expire_old_cached_files(cache, 0, pool->log);[m
[31m-    }[m
[31m-[m
[31m-    file = ngx_alloc(sizeof(ngx_cached_open_file_t), pool->log);[m
[31m-[m
[31m-    if (file == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    file->name = ngx_alloc(name->len + 1, pool->log);[m
[31m-[m
[31m-    if (file->name == NULL) {[m
[31m-        ngx_free(file);[m
[31m-        file = NULL;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cpystrn(file->name, name->data, name->len + 1);[m
[31m-[m
[31m-    file->node.key = hash;[m
[31m-[m
[31m-    ngx_rbtree_insert(&cache->rbtree, &file->node);[m
[31m-[m
[31m-    cache->current++;[m
[31m-[m
[31m-    file->uses = 1;[m
[31m-    file->count = 0;[m
[31m-    file->use_event = 0;[m
[31m-    file->event = NULL;[m
[31m-[m
[31m-add_event:[m
[31m-[m
[31m-    ngx_open_file_add_event(cache, file, of, pool->log);[m
[31m-[m
[31m-update:[m
[31m-[m
[31m-    file->fd = of->fd;[m
[31m-    file->err = of->err;[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    file->disable_symlinks = of->disable_symlinks;[m
[31m-    file->disable_symlinks_from = of->disable_symlinks_from;[m
[31m-#endif[m
[31m-[m
[31m-    if (of->err == 0) {[m
[31m-        file->uniq = of->uniq;[m
[31m-        file->mtime = of->mtime;[m
[31m-        file->size = of->size;[m
[31m-[m
[31m-        file->close = 0;[m
[31m-[m
[31m-        file->is_dir = of->is_dir;[m
[31m-        file->is_file = of->is_file;[m
[31m-        file->is_link = of->is_link;[m
[31m-        file->is_exec = of->is_exec;[m
[31m-        file->is_directio = of->is_directio;[m
[31m-[m
[31m-        if (!of->is_dir) {[m
[31m-            file->count++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    file->created = now;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    file->accessed = now;[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->expire_queue, &file->queue);[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_CORE, pool->log, 0,[m
[31m-                   "cached open file: %s, fd:%d, c:%d, e:%d, u:%d",[m
[31m-                   file->name, file->fd, file->count, file->err, file->uses);[m
[31m-[m
[31m-    if (of->err == 0) {[m
[31m-[m
[31m-        if (!of->is_dir) {[m
[31m-            cln->handler = ngx_open_file_cleanup;[m
[31m-            ofcln = cln->data;[m
[31m-[m
[31m-            ofcln->cache = cache;[m
[31m-            ofcln->file = file;[m
[31m-            ofcln->min_uses = of->min_uses;[m
[31m-            ofcln->log = pool->log;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (file) {[m
[31m-        ngx_rbtree_delete(&cache->rbtree, &file->node);[m
[31m-[m
[31m-        cache->current--;[m
[31m-[m
[31m-        if (file->count == 0) {[m
[31m-[m
[31m-            if (file->fd != NGX_INVALID_FILE) {[m
[31m-                if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,[m
[31m-                                  ngx_close_file_n " \"%s\" failed",[m
[31m-                                  file->name);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_free(file->name);[m
[31m-            ngx_free(file);[m
[31m-[m
[31m-        } else {[m
[31m-            file->close = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (of->fd != NGX_INVALID_FILE) {[m
[31m-        if (ngx_close_file(of->fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-static ngx_fd_t[m
[31m-ngx_openat_file_owner(ngx_fd_t at_fd, const u_char *name,[m
[31m-    ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t         fd;[m
[31m-    ngx_err_t        err;[m
[31m-    ngx_file_info_t  fi, atfi;[m
[31m-[m
[31m-    /*[m
[31m-     * To allow symlinks with the same owner, use openat() (followed[m
[31m-     * by fstat()) and fstatat(AT_SYMLINK_NOFOLLOW), and then compare[m
[31m-     * uids between fstat() and fstatat().[m
[31m-     *[m
[31m-     * As there is a race between openat() and fstatat() we don't[m
[31m-     * know if openat() in fact opened symlink or not.  Therefore,[m
[31m-     * we have to compare uids even if fstatat() reports the opened[m
[31m-     * component isn't a symlink (as we don't know whether it was[m
[31m-     * symlink during openat() or not).[m
[31m-     */[m
[31m-[m
[31m-    fd = ngx_openat_file(at_fd, name, mode, create, access);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        return NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_file_at_info(at_fd, name, &atfi, AT_SYMLINK_NOFOLLOW)[m
[31m-        == NGX_FILE_ERROR)[m
[31m-    {[m
[31m-        err = ngx_errno;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_O_PATH)[m
[31m-    if (ngx_file_o_path_info(fd, &fi, log) == NGX_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#else[m
[31m-    if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (fi.st_uid != atfi.st_uid) {[m
[31m-        err = NGX_ELOOP;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    ngx_set_errno(err);[m
[31m-[m
[31m-    return NGX_INVALID_FILE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_O_PATH)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_file_o_path_info(ngx_fd_t fd, ngx_file_info_t *fi, ngx_log_t *log)[m
[31m-{[m
[31m-    static ngx_uint_t  use_fstat = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * In Linux 2.6.39 the O_PATH flag was introduced that allows to obtain[m
[31m-     * a descriptor without actually opening file or directory.  It requires[m
[31m-     * less permissions for path components, but till Linux 3.6 fstat() returns[m
[31m-     * EBADF on such descriptors, and fstatat() with the AT_EMPTY_PATH flag[m
[31m-     * should be used instead.[m
[31m-     *[m
[31m-     * Three scenarios are handled in this function:[m
[31m-     *[m
[31m-     * 1) The kernel is newer than 3.6 or fstat() with O_PATH support was[m
[31m-     *    backported by vendor.  Then fstat() is used.[m
[31m-     *[m
[31m-     * 2) The kernel is newer than 2.6.39 but older than 3.6.  In this case[m
[31m-     *    the first call of fstat() returns EBADF and we fallback to fstatat()[m
[31m-     *    with AT_EMPTY_PATH which was introduced at the same time as O_PATH.[m
[31m-     *[m
[31m-     * 3) The kernel is older than 2.6.39 but nginx was build with O_PATH[m
[31m-     *    support.  Since descriptors are opened with O_PATH|O_RDONLY flags[m
[31m-     *    and O_PATH is ignored by the kernel then the O_RDONLY flag is[m
[31m-     *    actually used.  In this case fstat() just works.[m
[31m-     */[m
[31m-[m
[31m-    if (use_fstat) {[m
[31m-        if (ngx_fd_info(fd, fi) != NGX_FILE_ERROR) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_errno != NGX_EBADF) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                      "fstat(O_PATH) failed with EBADF, "[m
[31m-                      "switching to fstatat(AT_EMPTY_PATH)");[m
[31m-[m
[31m-        use_fstat = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_file_at_info(fd, "", fi, AT_EMPTY_PATH) != NGX_FILE_ERROR) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_HAVE_OPENAT */[m
[31m-[m
[31m-[m
[31m-static ngx_fd_t[m
[31m-ngx_open_file_wrapper(ngx_str_t *name, ngx_open_file_info_t *of,[m
[31m-    ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-#if !(NGX_HAVE_OPENAT)[m
[31m-[m
[31m-    fd = ngx_open_file(name->data, mode, create, access);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        of->err = ngx_errno;[m
[31m-        of->failed = ngx_open_file_n;[m
[31m-        return NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u_char           *p, *cp, *end;[m
[31m-    ngx_fd_t          at_fd;[m
[31m-    ngx_str_t         at_name;[m
[31m-[m
[31m-    if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {[m
[31m-        fd = ngx_open_file(name->data, mode, create, access);[m
[31m-[m
[31m-        if (fd == NGX_INVALID_FILE) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_open_file_n;[m
[31m-            return NGX_INVALID_FILE;[m
[31m-        }[m
[31m-[m
[31m-        return fd;[m
[31m-    }[m
[31m-[m
[31m-    p = name->data;[m
[31m-    end = p + name->len;[m
[31m-[m
[31m-    at_name = *name;[m
[31m-[m
[31m-    if (of->disable_symlinks_from) {[m
[31m-[m
[31m-        cp = p + of->disable_symlinks_from;[m
[31m-[m
[31m-        *cp = '\0';[m
[31m-[m
[31m-        at_fd = ngx_open_file(p, NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,[m
[31m-                              NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-        *cp = '/';[m
[31m-[m
[31m-        if (at_fd == NGX_INVALID_FILE) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_open_file_n;[m
[31m-            return NGX_INVALID_FILE;[m
[31m-        }[m
[31m-[m
[31m-        at_name.len = of->disable_symlinks_from;[m
[31m-        p = cp + 1;[m
[31m-[m
[31m-    } else if (*p == '/') {[m
[31m-[m
[31m-        at_fd = ngx_open_file("/",[m
[31m-                              NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,[m
[31m-                              NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-        if (at_fd == NGX_INVALID_FILE) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_openat_file_n;[m
[31m-            return NGX_INVALID_FILE;[m
[31m-        }[m
[31m-[m
[31m-        at_name.len = 1;[m
[31m-        p++;[m
[31m-[m
[31m-    } else {[m
[31m-        at_fd = NGX_AT_FDCWD;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        cp = ngx_strlchr(p, end, '/');[m
[31m-        if (cp == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (cp == p) {[m
[31m-            p++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *cp = '\0';[m
[31m-[m
[31m-        if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_NOTOWNER) {[m
[31m-            fd = ngx_openat_file_owner(at_fd, p,[m
[31m-                                       NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,[m
[31m-                                       NGX_FILE_OPEN, 0, log);[m
[31m-[m
[31m-        } else {[m
[31m-            fd = ngx_openat_file(at_fd, p,[m
[31m-                           NGX_FILE_SEARCH|NGX_FILE_NONBLOCK|NGX_FILE_NOFOLLOW,[m
[31m-                           NGX_FILE_OPEN, 0);[m
[31m-        }[m
[31m-[m
[31m-        *cp = '/';[m
[31m-[m
[31m-        if (fd == NGX_INVALID_FILE) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_openat_file_n;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (at_fd != NGX_AT_FDCWD && ngx_close_file(at_fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", &at_name);[m
[31m-        }[m
[31m-[m
[31m-        p = cp + 1;[m
[31m-        at_fd = fd;[m
[31m-        at_name.len = cp - at_name.data;[m
[31m-    }[m
[31m-[m
[31m-    if (p == end) {[m
[31m-[m
[31m-        /*[m
[31m-         * If pathname ends with a trailing slash, assume the last path[m
[31m-         * component is a directory and reopen it with requested flags;[m
[31m-         * if not, fail with ENOTDIR as per POSIX.[m
[31m-         *[m
[31m-         * We cannot rely on O_DIRECTORY in the loop above to check[m
[31m-         * that the last path component is a directory because[m
[31m-         * O_DIRECTORY doesn't work on FreeBSD 8.  Fortunately, by[m
[31m-         * reopening a directory, we don't depend on it at all.[m
[31m-         */[m
[31m-[m
[31m-        fd = ngx_openat_file(at_fd, ".", mode, create, access);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_NOTOWNER[m
[31m-        && !(create & (NGX_FILE_CREATE_OR_OPEN|NGX_FILE_TRUNCATE)))[m
[31m-    {[m
[31m-        fd = ngx_openat_file_owner(at_fd, p, mode, create, access, log);[m
[31m-[m
[31m-    } else {[m
[31m-        fd = ngx_openat_file(at_fd, p, mode|NGX_FILE_NOFOLLOW, create, access);[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        of->err = ngx_errno;[m
[31m-        of->failed = ngx_openat_file_n;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (at_fd != NGX_AT_FDCWD && ngx_close_file(at_fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%V\" failed", &at_name);[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_file_info_wrapper(ngx_str_t *name, ngx_open_file_info_t *of,[m
[31m-    ngx_file_info_t *fi, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-#if !(NGX_HAVE_OPENAT)[m
[31m-[m
[31m-    rc = ngx_file_info(name->data, fi);[m
[31m-[m
[31m-    if (rc == NGX_FILE_ERROR) {[m
[31m-        of->err = ngx_errno;[m
[31m-        of->failed = ngx_file_info_n;[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {[m
[31m-[m
[31m-        rc = ngx_file_info(name->data, fi);[m
[31m-[m
[31m-        if (rc == NGX_FILE_ERROR) {[m
[31m-            of->err = ngx_errno;[m
[31m-            of->failed = ngx_file_info_n;[m
[31m-            return NGX_FILE_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,[m
[31m-                               NGX_FILE_OPEN, 0, log);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_fd_info(fd, fi);[m
[31m-[m
[31m-    if (rc == NGX_FILE_ERROR) {[m
[31m-        of->err = ngx_errno;[m
[31m-        of->failed = ngx_fd_info_n;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%V\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_open_and_stat_file(ngx_str_t *name, ngx_open_file_info_t *of,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t         fd;[m
[31m-    ngx_file_info_t  fi;[m
[31m-[m
[31m-    if (of->fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        if (ngx_file_info_wrapper(name, of, &fi, log) == NGX_FILE_ERROR) {[m
[31m-            of->fd = NGX_INVALID_FILE;[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (of->uniq == ngx_file_uniq(&fi)) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-    } else if (of->test_dir) {[m
[31m-[m
[31m-        if (ngx_file_info_wrapper(name, of, &fi, log) == NGX_FILE_ERROR) {[m
[31m-            of->fd = NGX_INVALID_FILE;[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_is_dir(&fi)) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!of->log) {[m
[31m-[m
[31m-        /*[m
[31m-         * Use non-blocking open() not to hang on FIFO files, etc.[m
[31m-         * This flag has no effect on a regular files.[m
[31m-         */[m
[31m-[m
[31m-        fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,[m
[31m-                                   NGX_FILE_OPEN, 0, log);[m
[31m-[m
[31m-    } else {[m
[31m-        fd = ngx_open_file_wrapper(name, of, NGX_FILE_APPEND,[m
[31m-                                   NGX_FILE_CREATE_OR_OPEN,[m
[31m-                                   NGX_FILE_DEFAULT_ACCESS, log);[m
[31m-    }[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,[m
[31m-                      ngx_fd_info_n " \"%V\" failed", name);[m
[31m-[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-    } else {[m
[31m-        of->fd = fd;[m
[31m-[m
[31m-        if (of->read_ahead && ngx_file_size(&fi) > NGX_MIN_READ_AHEAD) {[m
[31m-            if (ngx_read_ahead(fd, of->read_ahead) == NGX_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                              ngx_read_ahead_n " \"%V\" failed", name);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (of->directio <= ngx_file_size(&fi)) {[m
[31m-            if (ngx_directio_on(fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                              ngx_directio_on_n " \"%V\" failed", name);[m
[31m-[m
[31m-            } else {[m
[31m-                of->is_directio = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    of->uniq = ngx_file_uniq(&fi);[m
[31m-    of->mtime = ngx_file_mtime(&fi);[m
[31m-    of->size = ngx_file_size(&fi);[m
[31m-    of->fs_size = ngx_file_fs_size(&fi);[m
[31m-    of->is_dir = ngx_is_dir(&fi);[m
[31m-    of->is_file = ngx_is_file(&fi);[m
[31m-    of->is_link = ngx_is_link(&fi);[m
[31m-    of->is_exec = ngx_is_exec(&fi);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * we ignore any possible event setting error and[m
[31m- * fallback to usual periodic file retests[m
[31m- */[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_add_event(ngx_open_file_cache_t *cache,[m
[31m-    ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_open_file_cache_event_t  *fev;[m
[31m-[m
[31m-    if (!(ngx_event_flags & NGX_USE_VNODE_EVENT)[m
[31m-        || !of->events[m
[31m-        || file->event[m
[31m-        || of->fd == NGX_INVALID_FILE[m
[31m-        || file->uses < of->min_uses)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    file->use_event = 0;[m
[31m-[m
[31m-    file->event = ngx_calloc(sizeof(ngx_event_t), log);[m
[31m-    if (file->event== NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    fev = ngx_alloc(sizeof(ngx_open_file_cache_event_t), log);[m
[31m-    if (fev == NULL) {[m
[31m-        ngx_free(file->event);[m
[31m-        file->event = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    fev->fd = of->fd;[m
[31m-    fev->file = file;[m
[31m-    fev->cache = cache;[m
[31m-[m
[31m-    file->event->handler = ngx_open_file_cache_remove;[m
[31m-    file->event->data = fev;[m
[31m-[m
[31m-    /*[m
[31m-     * although vnode event may be called while ngx_cycle->poll[m
[31m-     * destruction, however, cleanup procedures are run before any[m
[31m-     * memory freeing and events will be canceled.[m
[31m-     */[m
[31m-[m
[31m-    file->event->log = ngx_cycle->log;[m
[31m-[m
[31m-    if (ngx_add_event(file->event, NGX_VNODE_EVENT, NGX_ONESHOT_EVENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_free(file->event->data);[m
[31m-        ngx_free(file->event);[m
[31m-        file->event = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set file->use_event here because there may be a race[m
[31m-     * condition: a file may be deleted between opening the file and[m
[31m-     * adding event, so we rely upon event notification only after[m
[31m-     * one file revalidation on next file access[m
[31m-     */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_open_file_cache_cleanup_t  *c = data;[m
[31m-[m
[31m-    c->file->count--;[m
[31m-[m
[31m-    ngx_close_cached_file(c->cache, c->file, c->min_uses, c->log);[m
[31m-[m
[31m-    /* drop one or two expired open files */[m
[31m-    ngx_expire_old_cached_files(c->cache, 1, c->log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_close_cached_file(ngx_open_file_cache_t *cache,[m
[31m-    ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "close cached open file: %s, fd:%d, c:%d, u:%d, %d",[m
[31m-                   file->name, file->fd, file->count, file->uses, file->close);[m
[31m-[m
[31m-    if (!file->close) {[m
[31m-[m
[31m-        file->accessed = ngx_time();[m
[31m-[m
[31m-        ngx_queue_remove(&file->queue);[m
[31m-[m
[31m-        ngx_queue_insert_head(&cache->expire_queue, &file->queue);[m
[31m-[m
[31m-        if (file->uses >= min_uses || file->count) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_open_file_del_event(file);[m
[31m-[m
[31m-    if (file->count) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (file->fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", file->name);[m
[31m-        }[m
[31m-[m
[31m-        file->fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    if (!file->close) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(file->name);[m
[31m-    ngx_free(file);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_del_event(ngx_cached_open_file_t *file)[m
[31m-{[m
[31m-    if (file->event == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_del_event(file->event, NGX_VNODE_EVENT,[m
[31m-                         file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT);[m
[31m-[m
[31m-    ngx_free(file->event->data);[m
[31m-    ngx_free(file->event);[m
[31m-    file->event = NULL;[m
[31m-    file->use_event = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, ngx_uint_t n,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    time_t                   now;[m
[31m-    ngx_queue_t             *q;[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    /*[m
[31m-     * n == 1 deletes one or two inactive files[m
[31m-     * n == 0 deletes least recently used file by force[m
[31m-     *        and one or two inactive files[m
[31m-     */[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->expire_queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->expire_queue);[m
[31m-[m
[31m-        file = ngx_queue_data(q, ngx_cached_open_file_t, queue);[m
[31m-[m
[31m-        if (n++ != 0 && now - file->accessed <= cache->inactive) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->rbtree, &file->node);[m
[31m-[m
[31m-        cache->current--;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "expire cached open file: %s", file->name);[m
[31m-[m
[31m-        if (!file->err && !file->is_dir) {[m
[31m-            file->close = 1;[m
[31m-            ngx_close_cached_file(cache, file, 0, log);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_free(file->name);[m
[31m-            ngx_free(file);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t       **p;[m
[31m-    ngx_cached_open_file_t    *file, *file_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            file = (ngx_cached_open_file_t *) node;[m
[31m-            file_temp = (ngx_cached_open_file_t *) temp;[m
[31m-[m
[31m-            p = (ngx_strcmp(file->name, file_temp->name) < 0)[m
[31m-                    ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_cached_open_file_t *[m
[31m-ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_rbtree_node_t       *node, *sentinel;[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-[m
[31m-    node = cache->rbtree.root;[m
[31m-    sentinel = cache->rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        file = (ngx_cached_open_file_t *) node;[m
[31m-[m
[31m-        rc = ngx_strcmp(name->data, file->name);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return file;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_open_file_cache_remove(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_cached_open_file_t       *file;[m
[31m-    ngx_open_file_cache_event_t  *fev;[m
[31m-[m
[31m-    fev = ev->data;[m
[31m-    file = fev->file;[m
[31m-[m
[31m-    ngx_queue_remove(&file->queue);[m
[31m-[m
[31m-    ngx_rbtree_delete(&fev->cache->rbtree, &file->node);[m
[31m-[m
[31m-    fev->cache->current--;[m
[31m-[m
[31m-    /* NGX_ONESHOT_EVENT was already deleted */[m
[31m-    file->event = NULL;[m
[31m-    file->use_event = 0;[m
[31m-[m
[31m-    file->close = 1;[m
[31m-[m
[31m-    ngx_close_cached_file(fev->cache, file, 0, ev->log);[m
[31m-[m
[31m-    /* free memory only when fev->cache and fev->file are already not needed */[m
[31m-[m
[31m-    ngx_free(ev->data);[m
[31m-    ngx_free(ev);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_open_file_cache.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_open_file_cache.h[m
[1mdeleted file mode 100644[m
[1mindex d119c12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_open_file_cache.h[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_OPEN_FILE_CACHE_H_INCLUDED_[m
[31m-#define _NGX_OPEN_FILE_CACHE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define NGX_OPEN_FILE_DIRECTIO_OFF  NGX_MAX_OFF_T_VALUE[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_fd_t                 fd;[m
[31m-    ngx_file_uniq_t          uniq;[m
[31m-    time_t                   mtime;[m
[31m-    off_t                    size;[m
[31m-    off_t                    fs_size;[m
[31m-    off_t                    directio;[m
[31m-    size_t                   read_ahead;[m
[31m-[m
[31m-    ngx_err_t                err;[m
[31m-    char                    *failed;[m
[31m-[m
[31m-    time_t                   valid;[m
[31m-[m
[31m-    ngx_uint_t               min_uses;[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    size_t                   disable_symlinks_from;[m
[31m-    unsigned                 disable_symlinks:2;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                 test_dir:1;[m
[31m-    unsigned                 test_only:1;[m
[31m-    unsigned                 log:1;[m
[31m-    unsigned                 errors:1;[m
[31m-    unsigned                 events:1;[m
[31m-[m
[31m-    unsigned                 is_dir:1;[m
[31m-    unsigned                 is_file:1;[m
[31m-    unsigned                 is_link:1;[m
[31m-    unsigned                 is_exec:1;[m
[31m-    unsigned                 is_directio:1;[m
[31m-} ngx_open_file_info_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_cached_open_file_s  ngx_cached_open_file_t;[m
[31m-[m
[31m-struct ngx_cached_open_file_s {[m
[31m-    ngx_rbtree_node_t        node;[m
[31m-    ngx_queue_t              queue;[m
[31m-[m
[31m-    u_char                  *name;[m
[31m-    time_t                   created;[m
[31m-    time_t                   accessed;[m
[31m-[m
[31m-    ngx_fd_t                 fd;[m
[31m-    ngx_file_uniq_t          uniq;[m
[31m-    time_t                   mtime;[m
[31m-    off_t                    size;[m
[31m-    ngx_err_t                err;[m
[31m-[m
[31m-    uint32_t                 uses;[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    size_t                   disable_symlinks_from;[m
[31m-    unsigned                 disable_symlinks:2;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                 count:24;[m
[31m-    unsigned                 close:1;[m
[31m-    unsigned                 use_event:1;[m
[31m-[m
[31m-    unsigned                 is_dir:1;[m
[31m-    unsigned                 is_file:1;[m
[31m-    unsigned                 is_link:1;[m
[31m-    unsigned                 is_exec:1;[m
[31m-    unsigned                 is_directio:1;[m
[31m-[m
[31m-    ngx_event_t             *event;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t             rbtree;[m
[31m-    ngx_rbtree_node_t        sentinel;[m
[31m-    ngx_queue_t              expire_queue;[m
[31m-[m
[31m-    ngx_uint_t               current;[m
[31m-    ngx_uint_t               max;[m
[31m-    time_t                   inactive;[m
[31m-} ngx_open_file_cache_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_open_file_cache_t   *cache;[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-    ngx_uint_t               min_uses;[m
[31m-    ngx_log_t               *log;[m
[31m-} ngx_open_file_cache_cleanup_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-[m
[31m-    /* ngx_connection_t stub to allow use c->fd as event ident */[m
[31m-    void                    *data;[m
[31m-    ngx_event_t             *read;[m
[31m-    ngx_event_t             *write;[m
[31m-    ngx_fd_t                 fd;[m
[31m-[m
[31m-    ngx_cached_open_file_t  *file;[m
[31m-    ngx_open_file_cache_t   *cache;[m
[31m-} ngx_open_file_cache_event_t;[m
[31m-[m
[31m-[m
[31m-ngx_open_file_cache_t *ngx_open_file_cache_init(ngx_pool_t *pool,[m
[31m-    ngx_uint_t max, time_t inactive);[m
[31m-ngx_int_t ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,[m
[31m-    ngx_open_file_info_t *of, ngx_pool_t *pool);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_OPEN_FILE_CACHE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_output_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_output_chain.c[m
[1mdeleted file mode 100644[m
[1mindex f784578..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_output_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,767 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-#define NGX_SENDFILE_LIMIT  4096[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m- * When DIRECTIO is enabled FreeBSD, Solaris, and MacOSX read directly[m
[31m- * to an application memory from a device if parameters are aligned[m
[31m- * to device sector boundary (512 bytes).  They fallback to usual read[m
[31m- * operation if the parameters are not aligned.[m
[31m- * Linux allows DIRECTIO only if the parameters are aligned to a filesystem[m
[31m- * sector boundary, otherwise it returns EINVAL.  The sector size is[m
[31m- * usually 512 bytes, however, on XFS it may be 4096 bytes.[m
[31m- */[m
[31m-[m
[31m-#define NGX_NONE            1[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-    ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf);[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-static ngx_int_t ngx_output_chain_aio_setup(ngx_output_chain_ctx_t *ctx,[m
[31m-    ngx_file_t *file);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_output_chain_add_copy(ngx_pool_t *pool,[m
[31m-    ngx_chain_t **chain, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx,[m
[31m-    off_t bsize);[m
[31m-static ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx,[m
[31m-    off_t bsize);[m
[31m-static ngx_int_t ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    off_t         bsize;[m
[31m-    ngx_int_t     rc, last;[m
[31m-    ngx_chain_t  *cl, *out, **last_out;[m
[31m-[m
[31m-    if (ctx->in == NULL && ctx->busy == NULL[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-        && !ctx->aio[m
[31m-#endif[m
[31m-       )[m
[31m-    {[m
[31m-        /*[m
[31m-         * the short path for the case when the ctx->in and ctx->busy chains[m
[31m-         * are empty, the incoming chain is empty too or has the single buf[m
[31m-         * that does not require the copy[m
[31m-         */[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            return ctx->output_filter(ctx->filter_ctx, in);[m
[31m-        }[m
[31m-[m
[31m-        if (in->next == NULL[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-            && !(in->buf->in_file && in->buf->file_last > NGX_SENDFILE_LIMIT)[m
[31m-#endif[m
[31m-            && ngx_output_chain_as_is(ctx, in->buf))[m
[31m-        {[m
[31m-            return ctx->output_filter(ctx->filter_ctx, in);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* add the incoming buf to the chain ctx->in */[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_output_chain_add_copy(ctx->pool, &ctx->in, in) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    last_out = &out;[m
[31m-    last = NGX_NONE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-        if (ctx->aio) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        while (ctx->in) {[m
[31m-[m
[31m-            /*[m
[31m-             * cycle while there are the ctx->in bufs[m
[31m-             * and there are the free output bufs to copy in[m
[31m-             */[m
[31m-[m
[31m-            bsize = ngx_buf_size(ctx->in->buf);[m
[31m-[m
[31m-            if (bsize == 0 && !ngx_buf_special(ctx->in->buf)) {[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,[m
[31m-                              "zero size buf in output "[m
[31m-                              "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                              ctx->in->buf->temporary,[m
[31m-                              ctx->in->buf->recycled,[m
[31m-                              ctx->in->buf->in_file,[m
[31m-                              ctx->in->buf->start,[m
[31m-                              ctx->in->buf->pos,[m
[31m-                              ctx->in->buf->last,[m
[31m-                              ctx->in->buf->file,[m
[31m-                              ctx->in->buf->file_pos,[m
[31m-                              ctx->in->buf->file_last);[m
[31m-[m
[31m-                ngx_debug_point();[m
[31m-[m
[31m-                ctx->in = ctx->in->next;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_output_chain_as_is(ctx, ctx->in->buf)) {[m
[31m-[m
[31m-                /* move the chain link to the output chain */[m
[31m-[m
[31m-                cl = ctx->in;[m
[31m-                ctx->in = cl->next;[m
[31m-[m
[31m-                *last_out = cl;[m
[31m-                last_out = &cl->next;[m
[31m-                cl->next = NULL;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->buf == NULL) {[m
[31m-[m
[31m-                rc = ngx_output_chain_align_file_buf(ctx, bsize);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-[m
[31m-                    if (ctx->free) {[m
[31m-[m
[31m-                        /* get the free buf */[m
[31m-[m
[31m-                        cl = ctx->free;[m
[31m-                        ctx->buf = cl->buf;[m
[31m-                        ctx->free = cl->next;[m
[31m-[m
[31m-                        ngx_free_chain(ctx->pool, cl);[m
[31m-[m
[31m-                    } else if (out || ctx->allocated == ctx->bufs.num) {[m
[31m-[m
[31m-                        break;[m
[31m-[m
[31m-                    } else if (ngx_output_chain_get_buf(ctx, bsize) != NGX_OK) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_output_chain_copy_buf(ctx);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                if (out) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            /* delete the completed buf from the ctx->in chain */[m
[31m-[m
[31m-            if (ngx_buf_size(ctx->in->buf) == 0) {[m
[31m-                ctx->in = ctx->in->next;[m
[31m-            }[m
[31m-[m
[31m-            cl = ngx_alloc_chain_link(ctx->pool);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf = ctx->buf;[m
[31m-            cl->next = NULL;[m
[31m-            *last_out = cl;[m
[31m-            last_out = &cl->next;[m
[31m-            ctx->buf = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (out == NULL && last != NGX_NONE) {[m
[31m-[m
[31m-            if (ctx->in) {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            return last;[m
[31m-        }[m
[31m-[m
[31m-        last = ctx->output_filter(ctx->filter_ctx, out);[m
[31m-[m
[31m-        if (last == NGX_ERROR || last == NGX_DONE) {[m
[31m-            return last;[m
[31m-        }[m
[31m-[m
[31m-        ngx_chain_update_chains(ctx->pool, &ctx->free, &ctx->busy, &out,[m
[31m-                                ctx->tag);[m
[31m-        last_out = &out;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_uint_t  sendfile;[m
[31m-[m
[31m-    if (ngx_buf_special(buf)) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (buf->in_file) {[m
[31m-        buf->file->thread_handler = ctx->thread_handler;[m
[31m-        buf->file->thread_ctx = ctx->filter_ctx;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (buf->in_file && buf->file->directio) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    sendfile = ctx->sendfile;[m
[31m-[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-[m
[31m-    if (buf->in_file && buf->file_pos >= NGX_SENDFILE_LIMIT) {[m
[31m-        sendfile = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (!sendfile) {[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(buf)) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        buf->in_file = 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    if (ctx->aio_preload && buf->in_file) {[m
[31m-        (void) ngx_output_chain_aio_setup(ctx, buf->file);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->need_in_memory && !ngx_buf_in_memory(buf)) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->need_in_temp && (buf->memory || buf->mmap)) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_aio_setup(ngx_output_chain_ctx_t *ctx, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    if (file->aio == NULL && ngx_file_aio_init(file, ctx->pool) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio = file->aio;[m
[31m-[m
[31m-    aio->data = ctx->filter_ctx;[m
[31m-    aio->preload_handler = ctx->aio_preload;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t  *cl, **ll;[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-    ngx_buf_t    *b, *buf;[m
[31m-#endif[m
[31m-[m
[31m-    ll = chain;[m
[31m-[m
[31m-    for (cl = *chain; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    while (in) {[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-[m
[31m-        buf = in->buf;[m
[31m-[m
[31m-        if (buf->in_file[m
[31m-            && buf->file_pos < NGX_SENDFILE_LIMIT[m
[31m-            && buf->file_last > NGX_SENDFILE_LIMIT)[m
[31m-        {[m
[31m-            /* split a file buf on two bufs by the sendfile limit */[m
[31m-[m
[31m-            b = ngx_calloc_buf(pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            if (ngx_buf_in_memory(buf)) {[m
[31m-                buf->pos += (ssize_t) (NGX_SENDFILE_LIMIT - buf->file_pos);[m
[31m-                b->last = buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            buf->file_pos = NGX_SENDFILE_LIMIT;[m
[31m-            b->file_last = NGX_SENDFILE_LIMIT;[m
[31m-[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf = buf;[m
[31m-            in = in->next;[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-        cl->buf = in->buf;[m
[31m-        in = in->next;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        cl->next = NULL;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)[m
[31m-{[m
[31m-    size_t      size;[m
[31m-    ngx_buf_t  *in;[m
[31m-[m
[31m-    in = ctx->in->buf;[m
[31m-[m
[31m-    if (in->file == NULL || !in->file->directio) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx->directio = 1;[m
[31m-[m
[31m-    size = (size_t) (in->file_pos - (in->file_pos & ~(ctx->alignment - 1)));[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-[m
[31m-        if (bsize >= (off_t) ctx->bufs.size) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        size = (size_t) bsize;[m
[31m-[m
[31m-    } else {[m
[31m-        size = (size_t) ctx->alignment - size;[m
[31m-[m
[31m-        if ((off_t) size > bsize) {[m
[31m-            size = (size_t) bsize;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->buf = ngx_create_temp_buf(ctx->pool, size);[m
[31m-    if (ctx->buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set ctx->buf->tag, because we do not want[m
[31m-     * to reuse the buf via ctx->free list[m
[31m-     */[m
[31m-[m
[31m-#if (NGX_HAVE_ALIGNED_DIRECTIO)[m
[31m-    ctx->unaligned = 1;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)[m
[31m-{[m
[31m-    size_t       size;[m
[31m-    ngx_buf_t   *b, *in;[m
[31m-    ngx_uint_t   recycled;[m
[31m-[m
[31m-    in = ctx->in->buf;[m
[31m-    size = ctx->bufs.size;[m
[31m-    recycled = 1;[m
[31m-[m
[31m-    if (in->last_in_chain) {[m
[31m-[m
[31m-        if (bsize < (off_t) size) {[m
[31m-[m
[31m-            /*[m
[31m-             * allocate a small temp buf for a small last buf[m
[31m-             * or its small last part[m
[31m-             */[m
[31m-[m
[31m-            size = (size_t) bsize;[m
[31m-            recycled = 0;[m
[31m-[m
[31m-        } else if (!ctx->directio[m
[31m-                   && ctx->bufs.num == 1[m
[31m-                   && (bsize < (off_t) (size + size / 4)))[m
[31m-        {[m
[31m-            /*[m
[31m-             * allocate a temp buf that equals to a last buf,[m
[31m-             * if there is no directio, the last buf size is lesser[m
[31m-             * than 1.25 of bufs.size and the temp buf is single[m
[31m-             */[m
[31m-[m
[31m-            size = (size_t) bsize;[m
[31m-            recycled = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_calloc_buf(ctx->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->directio) {[m
[31m-[m
[31m-        /*[m
[31m-         * allocate block aligned to a disk sector size to enable[m
[31m-         * userland buffer direct usage conjunctly with directio[m
[31m-         */[m
[31m-[m
[31m-        b->start = ngx_pmemalign(ctx->pool, size, (size_t) ctx->alignment);[m
[31m-        if (b->start == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        b->start = ngx_palloc(ctx->pool, size);[m
[31m-        if (b->start == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = b->start;[m
[31m-    b->last = b->start;[m
[31m-    b->end = b->last + size;[m
[31m-    b->temporary = 1;[m
[31m-    b->tag = ctx->tag;[m
[31m-    b->recycled = recycled;[m
[31m-[m
[31m-    ctx->buf = b;[m
[31m-    ctx->allocated++;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx)[m
[31m-{[m
[31m-    off_t        size;[m
[31m-    ssize_t      n;[m
[31m-    ngx_buf_t   *src, *dst;[m
[31m-    ngx_uint_t   sendfile;[m
[31m-[m
[31m-    src = ctx->in->buf;[m
[31m-    dst = ctx->buf;[m
[31m-[m
[31m-    size = ngx_buf_size(src);[m
[31m-    size = ngx_min(size, dst->end - dst->pos);[m
[31m-[m
[31m-    sendfile = ctx->sendfile & !ctx->directio;[m
[31m-[m
[31m-#if (NGX_SENDFILE_LIMIT)[m
[31m-[m
[31m-    if (src->in_file && src->file_pos >= NGX_SENDFILE_LIMIT) {[m
[31m-        sendfile = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_buf_in_memory(src)) {[m
[31m-        ngx_memcpy(dst->pos, src->pos, (size_t) size);[m
[31m-        src->pos += (size_t) size;[m
[31m-        dst->last += (size_t) size;[m
[31m-[m
[31m-        if (src->in_file) {[m
[31m-[m
[31m-            if (sendfile) {[m
[31m-                dst->in_file = 1;[m
[31m-                dst->file = src->file;[m
[31m-                dst->file_pos = src->file_pos;[m
[31m-                dst->file_last = src->file_pos + size;[m
[31m-[m
[31m-            } else {[m
[31m-                dst->in_file = 0;[m
[31m-            }[m
[31m-[m
[31m-            src->file_pos += size;[m
[31m-[m
[31m-        } else {[m
[31m-            dst->in_file = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (src->pos == src->last) {[m
[31m-            dst->flush = src->flush;[m
[31m-            dst->last_buf = src->last_buf;[m
[31m-            dst->last_in_chain = src->last_in_chain;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#if (NGX_HAVE_ALIGNED_DIRECTIO)[m
[31m-[m
[31m-        if (ctx->unaligned) {[m
[31m-            if (ngx_directio_off(src->file->fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, ngx_errno,[m
[31m-                              ngx_directio_off_n " \"%s\" failed",[m
[31m-                              src->file->name.data);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-        if (ctx->aio_handler) {[m
[31m-            n = ngx_file_aio_read(src->file, dst->pos, (size_t) size,[m
[31m-                                  src->file_pos, ctx->pool);[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                ctx->aio_handler(ctx, src->file);[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-        } else[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-        if (ctx->thread_handler) {[m
[31m-            src->file->thread_task = ctx->thread_task;[m
[31m-            src->file->thread_handler = ctx->thread_handler;[m
[31m-            src->file->thread_ctx = ctx->filter_ctx;[m
[31m-[m
[31m-            n = ngx_thread_read(src->file, dst->pos, (size_t) size,[m
[31m-                                src->file_pos, ctx->pool);[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                ctx->thread_task = src->file->thread_task;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-        } else[m
[31m-#endif[m
[31m-        {[m
[31m-            n = ngx_read_file(src->file, dst->pos, (size_t) size,[m
[31m-                              src->file_pos);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_ALIGNED_DIRECTIO)[m
[31m-[m
[31m-        if (ctx->unaligned) {[m
[31m-            ngx_err_t  err;[m
[31m-[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (ngx_directio_on(src->file->fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, ngx_errno,[m
[31m-                              ngx_directio_on_n " \"%s\" failed",[m
[31m-                              src->file->name.data);[m
[31m-            }[m
[31m-[m
[31m-            ngx_set_errno(err);[m
[31m-[m
[31m-            ctx->unaligned = 0;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return (ngx_int_t) n;[m
[31m-        }[m
[31m-[m
[31m-        if (n != size) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,[m
[31m-                          ngx_read_file_n " read only %z of %O from \"%s\"",[m
[31m-                          n, size, src->file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dst->last += n;[m
[31m-[m
[31m-        if (sendfile) {[m
[31m-            dst->in_file = 1;[m
[31m-            dst->file = src->file;[m
[31m-            dst->file_pos = src->file_pos;[m
[31m-            dst->file_last = src->file_pos + n;[m
[31m-[m
[31m-        } else {[m
[31m-            dst->in_file = 0;[m
[31m-        }[m
[31m-[m
[31m-        src->file_pos += n;[m
[31m-[m
[31m-        if (src->file_pos == src->file_last) {[m
[31m-            dst->flush = src->flush;[m
[31m-            dst->last_buf = src->last_buf;[m
[31m-            dst->last_in_chain = src->last_in_chain;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_chain_writer(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_writer_ctx_t *ctx = data;[m
[31m-[m
[31m-    off_t              size;[m
[31m-    ngx_chain_t       *cl, *ln, *chain;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ctx->connection;[m
[31m-[m
[31m-    for (size = 0; in; in = in->next) {[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_buf_size(in->buf) == 0 && !ngx_buf_special(in->buf)) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,[m
[31m-                          "zero size buf in chain writer "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          in->buf->temporary,[m
[31m-                          in->buf->recycled,[m
[31m-                          in->buf->in_file,[m
[31m-                          in->buf->start,[m
[31m-                          in->buf->pos,[m
[31m-                          in->buf->last,[m
[31m-                          in->buf->file,[m
[31m-                          in->buf->file_pos,[m
[31m-                          in->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        size += ngx_buf_size(in->buf);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                       "chain writer buf fl:%d s:%uO",[m
[31m-                       in->buf->flush, ngx_buf_size(in->buf));[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(ctx->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = in->buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last = cl;[m
[31m-        ctx->last = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "chain writer in: %p", ctx->out);[m
[31m-[m
[31m-    for (cl = ctx->out; cl; cl = cl->next) {[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,[m
[31m-                          "zero size buf in chain writer "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          cl->buf->temporary,[m
[31m-                          cl->buf->recycled,[m
[31m-                          cl->buf->in_file,[m
[31m-                          cl->buf->start,[m
[31m-                          cl->buf->pos,[m
[31m-                          cl->buf->last,[m
[31m-                          cl->buf->file,[m
[31m-                          cl->buf->file_pos,[m
[31m-                          cl->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0 && !c->buffered) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    chain = c->send_chain(c, ctx->out, ctx->limit);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "chain writer out: %p", chain);[m
[31m-[m
[31m-    if (chain == NGX_CHAIN_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = ctx->out; cl && cl != chain; /* void */) {[m
[31m-        ln = cl;[m
[31m-        cl = cl->next;[m
[31m-        ngx_free_chain(ctx->pool, ln);[m
[31m-    }[m
[31m-[m
[31m-    ctx->out = chain;[m
[31m-[m
[31m-    if (ctx->out == NULL) {[m
[31m-        ctx->last = &ctx->out;[m
[31m-[m
[31m-        if (!c->buffered) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.c[m
[1mdeleted file mode 100644[m
[1mindex d62ac45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.c[m
[1m+++ /dev/null[m
[36m@@ -1,433 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_core_probe.h>[m
[31m-[m
[31m-[m
[31m-static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size,[m
[31m-    ngx_uint_t align);[m
[31m-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);[m
[31m-static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);[m
[31m-[m
[31m-[m
[31m-ngx_pool_t *[m
[31m-ngx_create_pool(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m-    p->d.end = (u_char *) p + size;[m
[31m-    p->d.next = NULL;[m
[31m-    p->d.failed = 0;[m
[31m-[m
[31m-    size = size - sizeof(ngx_pool_t);[m
[31m-    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;[m
[31m-[m
[31m-    p->current = p;[m
[31m-    p->chain = NULL;[m
[31m-    p->large = NULL;[m
[31m-    p->cleanup = NULL;[m
[31m-    p->log = log;[m
[31m-[m
[31m-    ngx_core_probe_create_pool_done(p, size);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_destroy_pool(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t          *p, *n;[m
[31m-    ngx_pool_large_t    *l;[m
[31m-    ngx_pool_cleanup_t  *c;[m
[31m-[m
[31m-    for (c = pool->cleanup; c; c = c->next) {[m
[31m-        if (c->handler) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                           "run cleanup: %p", c);[m
[31m-            c->handler(c->data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    /*[m
[31m-     * we could allocate the pool->log from this pool[m
[31m-     * so we cannot use this log while free()ing the pool[m
[31m-     */[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                       "free: %p, unused: %uz", p, p->d.end - p->d.last);[m
[31m-[m
[31m-        if (n == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (l->alloc) {[m
[31m-            ngx_free(l->alloc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-        ngx_free(p);[m
[31m-[m
[31m-        if (n == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_reset_pool(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t        *p;[m
[31m-    ngx_pool_large_t  *l;[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (l->alloc) {[m
[31m-            ngx_free(l->alloc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool; p; p = p->d.next) {[m
[31m-        p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m-        p->d.failed = 0;[m
[31m-    }[m
[31m-[m
[31m-    pool->current = pool;[m
[31m-    pool->chain = NULL;[m
[31m-    pool->large = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_palloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-#if !(NGX_DEBUG_PALLOC)[m
[31m-    if (size <= pool->max) {[m
[31m-        return ngx_palloc_small(pool, size, 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_palloc_large(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pnalloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-#if !(NGX_DEBUG_PALLOC)[m
[31m-    if (size <= pool->max) {[m
[31m-        return ngx_palloc_small(pool, size, 0);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_palloc_large(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void *[m
[31m-ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)[m
[31m-{[m
[31m-    u_char      *m;[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = pool->current;[m
[31m-[m
[31m-    do {[m
[31m-        m = p->d.last;[m
[31m-[m
[31m-        if (align) {[m
[31m-            m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) (p->d.end - m) >= size) {[m
[31m-            p->d.last = m + size;[m
[31m-[m
[31m-            return m;[m
[31m-        }[m
[31m-[m
[31m-        p = p->d.next;[m
[31m-[m
[31m-    } while (p);[m
[31m-[m
[31m-    return ngx_palloc_block(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_palloc_block(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    u_char      *m;[m
[31m-    size_t       psize;[m
[31m-    ngx_pool_t  *p, *new;[m
[31m-[m
[31m-    psize = (size_t) (pool->d.end - (u_char *) pool);[m
[31m-[m
[31m-    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);[m
[31m-    if (m == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    new = (ngx_pool_t *) m;[m
[31m-[m
[31m-    new->d.end = m + psize;[m
[31m-    new->d.next = NULL;[m
[31m-    new->d.failed = 0;[m
[31m-[m
[31m-    m += sizeof(ngx_pool_data_t);[m
[31m-    m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m-    new->d.last = m + size;[m
[31m-[m
[31m-    for (p = pool->current; p->d.next; p = p->d.next) {[m
[31m-        if (p->d.failed++ > 4) {[m
[31m-            pool->current = p->d.next;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p->d.next = new;[m
[31m-[m
[31m-    return m;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_palloc_large(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void              *p;[m
[31m-    ngx_uint_t         n;[m
[31m-    ngx_pool_large_t  *large;[m
[31m-[m
[31m-    p = ngx_alloc(size, pool->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (large = pool->large; large; large = large->next) {[m
[31m-        if (large->alloc == NULL) {[m
[31m-            large->alloc = p;[m
[31m-            return p;[m
[31m-        }[m
[31m-[m
[31m-        if (n++ > 3) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m-    if (large == NULL) {[m
[31m-        ngx_free(p);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large->alloc = p;[m
[31m-    large->next = pool->large;[m
[31m-    pool->large = large;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)[m
[31m-{[m
[31m-    void              *p;[m
[31m-    ngx_pool_large_t  *large;[m
[31m-[m
[31m-    p = ngx_memalign(alignment, size, pool->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m-    if (large == NULL) {[m
[31m-        ngx_free(p);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large->alloc = p;[m
[31m-    large->next = pool->large;[m
[31m-    pool->large = large;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_pfree(ngx_pool_t *pool, void *p)[m
[31m-{[m
[31m-    ngx_pool_large_t  *l;[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (p == l->alloc) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                           "free: %p", l->alloc);[m
[31m-            ngx_free(l->alloc);[m
[31m-            l->alloc = NULL;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pcalloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void *p;[m
[31m-[m
[31m-    p = ngx_palloc(pool, size);[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pool_cleanup_t *[m
[31m-ngx_pool_cleanup_add(ngx_pool_t *p, size_t size)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *c;[m
[31m-[m
[31m-    c = ngx_palloc(p, sizeof(ngx_pool_cleanup_t));[m
[31m-    if (c == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        c->data = ngx_palloc(p, size);[m
[31m-        if (c->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        c->data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    c->handler = NULL;[m
[31m-    c->next = p->cleanup;[m
[31m-[m
[31m-    p->cleanup = c;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, p->log, 0, "add cleanup: %p", c);[m
[31m-[m
[31m-    return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t       *c;[m
[31m-    ngx_pool_cleanup_file_t  *cf;[m
[31m-[m
[31m-    for (c = p->cleanup; c; c = c->next) {[m
[31m-        if (c->handler == ngx_pool_cleanup_file) {[m
[31m-[m
[31m-            cf = c->data;[m
[31m-[m
[31m-            if (cf->fd == fd) {[m
[31m-                c->handler(cf);[m
[31m-                c->handler = NULL;[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_cleanup_file(void *data)[m
[31m-{[m
[31m-    ngx_pool_cleanup_file_t  *c = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d",[m
[31m-                   c->fd);[m
[31m-[m
[31m-    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", c->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_delete_file(void *data)[m
[31m-{[m
[31m-    ngx_pool_cleanup_file_t  *c = data;[m
[31m-[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d %s",[m
[31m-                   c->fd, c->name);[m
[31m-[m
[31m-    if (ngx_delete_file(c->name) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, c->log, err,[m
[31m-                          ngx_delete_file_n " \"%s\" failed", c->name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", c->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-static void *[m
[31m-ngx_get_cached_block(size_t size)[m
[31m-{[m
[31m-    void                     *p;[m
[31m-    ngx_cached_block_slot_t  *slot;[m
[31m-[m
[31m-    if (ngx_cycle->cache == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    slot = &ngx_cycle->cache[(size + ngx_pagesize - 1) / ngx_pagesize];[m
[31m-[m
[31m-    slot->tries++;[m
[31m-[m
[31m-    if (slot->number) {[m
[31m-        p = slot->block;[m
[31m-        slot->block = slot->block->next;[m
[31m-        slot->number--;[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.c.orig[m
[1mdeleted file mode 100644[m
[1mindex d3044ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,430 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size,[m
[31m-    ngx_uint_t align);[m
[31m-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);[m
[31m-static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);[m
[31m-[m
[31m-[m
[31m-ngx_pool_t *[m
[31m-ngx_create_pool(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m-    p->d.end = (u_char *) p + size;[m
[31m-    p->d.next = NULL;[m
[31m-    p->d.failed = 0;[m
[31m-[m
[31m-    size = size - sizeof(ngx_pool_t);[m
[31m-    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;[m
[31m-[m
[31m-    p->current = p;[m
[31m-    p->chain = NULL;[m
[31m-    p->large = NULL;[m
[31m-    p->cleanup = NULL;[m
[31m-    p->log = log;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_destroy_pool(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t          *p, *n;[m
[31m-    ngx_pool_large_t    *l;[m
[31m-    ngx_pool_cleanup_t  *c;[m
[31m-[m
[31m-    for (c = pool->cleanup; c; c = c->next) {[m
[31m-        if (c->handler) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                           "run cleanup: %p", c);[m
[31m-            c->handler(c->data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    /*[m
[31m-     * we could allocate the pool->log from this pool[m
[31m-     * so we cannot use this log while free()ing the pool[m
[31m-     */[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                       "free: %p, unused: %uz", p, p->d.end - p->d.last);[m
[31m-[m
[31m-        if (n == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (l->alloc) {[m
[31m-            ngx_free(l->alloc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-        ngx_free(p);[m
[31m-[m
[31m-        if (n == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_reset_pool(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t        *p;[m
[31m-    ngx_pool_large_t  *l;[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (l->alloc) {[m
[31m-            ngx_free(l->alloc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p = pool; p; p = p->d.next) {[m
[31m-        p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m-        p->d.failed = 0;[m
[31m-    }[m
[31m-[m
[31m-    pool->current = pool;[m
[31m-    pool->chain = NULL;[m
[31m-    pool->large = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_palloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-#if !(NGX_DEBUG_PALLOC)[m
[31m-    if (size <= pool->max) {[m
[31m-        return ngx_palloc_small(pool, size, 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_palloc_large(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pnalloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-#if !(NGX_DEBUG_PALLOC)[m
[31m-    if (size <= pool->max) {[m
[31m-        return ngx_palloc_small(pool, size, 0);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_palloc_large(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void *[m
[31m-ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)[m
[31m-{[m
[31m-    u_char      *m;[m
[31m-    ngx_pool_t  *p;[m
[31m-[m
[31m-    p = pool->current;[m
[31m-[m
[31m-    do {[m
[31m-        m = p->d.last;[m
[31m-[m
[31m-        if (align) {[m
[31m-            m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) (p->d.end - m) >= size) {[m
[31m-            p->d.last = m + size;[m
[31m-[m
[31m-            return m;[m
[31m-        }[m
[31m-[m
[31m-        p = p->d.next;[m
[31m-[m
[31m-    } while (p);[m
[31m-[m
[31m-    return ngx_palloc_block(pool, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_palloc_block(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    u_char      *m;[m
[31m-    size_t       psize;[m
[31m-    ngx_pool_t  *p, *new;[m
[31m-[m
[31m-    psize = (size_t) (pool->d.end - (u_char *) pool);[m
[31m-[m
[31m-    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);[m
[31m-    if (m == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    new = (ngx_pool_t *) m;[m
[31m-[m
[31m-    new->d.end = m + psize;[m
[31m-    new->d.next = NULL;[m
[31m-    new->d.failed = 0;[m
[31m-[m
[31m-    m += sizeof(ngx_pool_data_t);[m
[31m-    m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m-    new->d.last = m + size;[m
[31m-[m
[31m-    for (p = pool->current; p->d.next; p = p->d.next) {[m
[31m-        if (p->d.failed++ > 4) {[m
[31m-            pool->current = p->d.next;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p->d.next = new;[m
[31m-[m
[31m-    return m;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_palloc_large(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void              *p;[m
[31m-    ngx_uint_t         n;[m
[31m-    ngx_pool_large_t  *large;[m
[31m-[m
[31m-    p = ngx_alloc(size, pool->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (large = pool->large; large; large = large->next) {[m
[31m-        if (large->alloc == NULL) {[m
[31m-            large->alloc = p;[m
[31m-            return p;[m
[31m-        }[m
[31m-[m
[31m-        if (n++ > 3) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m-    if (large == NULL) {[m
[31m-        ngx_free(p);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large->alloc = p;[m
[31m-    large->next = pool->large;[m
[31m-    pool->large = large;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)[m
[31m-{[m
[31m-    void              *p;[m
[31m-    ngx_pool_large_t  *large;[m
[31m-[m
[31m-    p = ngx_memalign(alignment, size, pool->log);[m
[31m-    if (p == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m-    if (large == NULL) {[m
[31m-        ngx_free(p);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    large->alloc = p;[m
[31m-    large->next = pool->large;[m
[31m-    pool->large = large;[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_pfree(ngx_pool_t *pool, void *p)[m
[31m-{[m
[31m-    ngx_pool_large_t  *l;[m
[31m-[m
[31m-    for (l = pool->large; l; l = l->next) {[m
[31m-        if (p == l->alloc) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m-                           "free: %p", l->alloc);[m
[31m-            ngx_free(l->alloc);[m
[31m-            l->alloc = NULL;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_pcalloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void *p;[m
[31m-[m
[31m-    p = ngx_palloc(pool, size);[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pool_cleanup_t *[m
[31m-ngx_pool_cleanup_add(ngx_pool_t *p, size_t size)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *c;[m
[31m-[m
[31m-    c = ngx_palloc(p, sizeof(ngx_pool_cleanup_t));[m
[31m-    if (c == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        c->data = ngx_palloc(p, size);[m
[31m-        if (c->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        c->data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    c->handler = NULL;[m
[31m-    c->next = p->cleanup;[m
[31m-[m
[31m-    p->cleanup = c;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, p->log, 0, "add cleanup: %p", c);[m
[31m-[m
[31m-    return c;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t       *c;[m
[31m-    ngx_pool_cleanup_file_t  *cf;[m
[31m-[m
[31m-    for (c = p->cleanup; c; c = c->next) {[m
[31m-        if (c->handler == ngx_pool_cleanup_file) {[m
[31m-[m
[31m-            cf = c->data;[m
[31m-[m
[31m-            if (cf->fd == fd) {[m
[31m-                c->handler(cf);[m
[31m-                c->handler = NULL;[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_cleanup_file(void *data)[m
[31m-{[m
[31m-    ngx_pool_cleanup_file_t  *c = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d",[m
[31m-                   c->fd);[m
[31m-[m
[31m-    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", c->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_pool_delete_file(void *data)[m
[31m-{[m
[31m-    ngx_pool_cleanup_file_t  *c = data;[m
[31m-[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d %s",[m
[31m-                   c->fd, c->name);[m
[31m-[m
[31m-    if (ngx_delete_file(c->name) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, c->log, err,[m
[31m-                          ngx_delete_file_n " \"%s\" failed", c->name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", c->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-static void *[m
[31m-ngx_get_cached_block(size_t size)[m
[31m-{[m
[31m-    void                     *p;[m
[31m-    ngx_cached_block_slot_t  *slot;[m
[31m-[m
[31m-    if (ngx_cycle->cache == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    slot = &ngx_cycle->cache[(size + ngx_pagesize - 1) / ngx_pagesize];[m
[31m-[m
[31m-    slot->tries++;[m
[31m-[m
[31m-    if (slot->number) {[m
[31m-        p = slot->block;[m
[31m-        slot->block = slot->block->next;[m
[31m-        slot->number--;[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.h[m
[1mdeleted file mode 100644[m
[1mindex d652829..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_palloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,95 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PALLOC_H_INCLUDED_[m
[31m-#define _NGX_PALLOC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_MAX_ALLOC_FROM_POOL should be (ngx_pagesize - 1), i.e. 4095 on x86.[m
[31m- * On Windows NT it decreases a number of locked pages in a kernel.[m
[31m- */[m
[31m-#define NGX_MAX_ALLOC_FROM_POOL  (ngx_pagesize - 1)[m
[31m-[m
[31m-#define NGX_DEFAULT_POOL_SIZE    (16 * 1024)[m
[31m-[m
[31m-#define NGX_POOL_ALIGNMENT       16[m
[31m-#define NGX_MIN_POOL_SIZE                                                     \[m
[31m-    ngx_align((sizeof(ngx_pool_t) + 2 * sizeof(ngx_pool_large_t)),            \[m
[31m-              NGX_POOL_ALIGNMENT)[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_pool_cleanup_pt)(void *data);[m
[31m-[m
[31m-typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;[m
[31m-[m
[31m-struct ngx_pool_cleanup_s {[m
[31m-    ngx_pool_cleanup_pt   handler;[m
[31m-    void                 *data;[m
[31m-    ngx_pool_cleanup_t   *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_pool_large_s  ngx_pool_large_t;[m
[31m-[m
[31m-struct ngx_pool_large_s {[m
[31m-    ngx_pool_large_t     *next;[m
[31m-    void                 *alloc;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char               *last;[m
[31m-    u_char               *end;[m
[31m-    ngx_pool_t           *next;[m
[31m-    ngx_uint_t            failed;[m
[31m-} ngx_pool_data_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_pool_s {[m
[31m-    ngx_pool_data_t       d;[m
[31m-    size_t                max;[m
[31m-    ngx_pool_t           *current;[m
[31m-    ngx_chain_t          *chain;[m
[31m-    ngx_pool_large_t     *large;[m
[31m-    ngx_pool_cleanup_t   *cleanup;[m
[31m-    ngx_log_t            *log;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_fd_t              fd;[m
[31m-    u_char               *name;[m
[31m-    ngx_log_t            *log;[m
[31m-} ngx_pool_cleanup_file_t;[m
[31m-[m
[31m-[m
[31m-void *ngx_alloc(size_t size, ngx_log_t *log);[m
[31m-void *ngx_calloc(size_t size, ngx_log_t *log);[m
[31m-[m
[31m-ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);[m
[31m-void ngx_destroy_pool(ngx_pool_t *pool);[m
[31m-void ngx_reset_pool(ngx_pool_t *pool);[m
[31m-[m
[31m-void *ngx_palloc(ngx_pool_t *pool, size_t size);[m
[31m-void *ngx_pnalloc(ngx_pool_t *pool, size_t size);[m
[31m-void *ngx_pcalloc(ngx_pool_t *pool, size_t size);[m
[31m-void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment);[m
[31m-ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);[m
[31m-[m
[31m-[m
[31m-ngx_pool_cleanup_t *ngx_pool_cleanup_add(ngx_pool_t *p, size_t size);[m
[31m-void ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd);[m
[31m-void ngx_pool_cleanup_file(void *data);[m
[31m-void ngx_pool_delete_file(void *data);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PALLOC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse.c[m
[1mdeleted file mode 100644[m
[1mindex 7b60c5f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse.c[m
[1m+++ /dev/null[m
[36m@@ -1,273 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_parse_size(ngx_str_t *line)[m
[31m-{[m
[31m-    u_char   unit;[m
[31m-    size_t   len;[m
[31m-    ssize_t  size, scale, max;[m
[31m-[m
[31m-    len = line->len;[m
[31m-    unit = line->data[len - 1];[m
[31m-[m
[31m-    switch (unit) {[m
[31m-    case 'K':[m
[31m-    case 'k':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_SIZE_T_VALUE / 1024;[m
[31m-        scale = 1024;[m
[31m-        break;[m
[31m-[m
[31m-    case 'M':[m
[31m-    case 'm':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_SIZE_T_VALUE / (1024 * 1024);[m
[31m-        scale = 1024 * 1024;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        max = NGX_MAX_SIZE_T_VALUE;[m
[31m-        scale = 1;[m
[31m-    }[m
[31m-[m
[31m-    size = ngx_atosz(line->data, len);[m
[31m-    if (size == NGX_ERROR || size > max) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size *= scale;[m
[31m-[m
[31m-    return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-off_t[m
[31m-ngx_parse_offset(ngx_str_t *line)[m
[31m-{[m
[31m-    u_char  unit;[m
[31m-    off_t   offset, scale, max;[m
[31m-    size_t  len;[m
[31m-[m
[31m-    len = line->len;[m
[31m-    unit = line->data[len - 1];[m
[31m-[m
[31m-    switch (unit) {[m
[31m-    case 'K':[m
[31m-    case 'k':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_OFF_T_VALUE / 1024;[m
[31m-        scale = 1024;[m
[31m-        break;[m
[31m-[m
[31m-    case 'M':[m
[31m-    case 'm':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_OFF_T_VALUE / (1024 * 1024);[m
[31m-        scale = 1024 * 1024;[m
[31m-        break;[m
[31m-[m
[31m-    case 'G':[m
[31m-    case 'g':[m
[31m-        len--;[m
[31m-        max = NGX_MAX_OFF_T_VALUE / (1024 * 1024 * 1024);[m
[31m-        scale = 1024 * 1024 * 1024;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        max = NGX_MAX_OFF_T_VALUE;[m
[31m-        scale = 1;[m
[31m-    }[m
[31m-[m
[31m-    offset = ngx_atoof(line->data, len);[m
[31m-    if (offset == NGX_ERROR || offset > max) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    offset *= scale;[m
[31m-[m
[31m-    return offset;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec)[m
[31m-{[m
[31m-    u_char      *p, *last;[m
[31m-    ngx_int_t    value, total, scale;[m
[31m-    ngx_int_t    max, cutoff, cutlim;[m
[31m-    ngx_uint_t   valid;[m
[31m-    enum {[m
[31m-        st_start = 0,[m
[31m-        st_year,[m
[31m-        st_month,[m
[31m-        st_week,[m
[31m-        st_day,[m
[31m-        st_hour,[m
[31m-        st_min,[m
[31m-        st_sec,[m
[31m-        st_msec,[m
[31m-        st_last[m
[31m-    } step;[m
[31m-[m
[31m-    valid = 0;[m
[31m-    value = 0;[m
[31m-    total = 0;[m
[31m-    cutoff = NGX_MAX_INT_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_INT_T_VALUE % 10;[m
[31m-    step = is_sec ? st_start : st_month;[m
[31m-[m
[31m-    p = line->data;[m
[31m-    last = p + line->len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        if (*p >= '0' && *p <= '9') {[m
[31m-            if (value >= cutoff && (value > cutoff || *p - '0' > cutlim)) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            value = value * 10 + (*p++ - '0');[m
[31m-            valid = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (*p++) {[m
[31m-[m
[31m-        case 'y':[m
[31m-            if (step > st_start) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_year;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 365);[m
[31m-            scale = 60 * 60 * 24 * 365;[m
[31m-            break;[m
[31m-[m
[31m-        case 'M':[m
[31m-            if (step >= st_month) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_month;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 30);[m
[31m-            scale = 60 * 60 * 24 * 30;[m
[31m-            break;[m
[31m-[m
[31m-        case 'w':[m
[31m-            if (step >= st_week) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_week;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 7);[m
[31m-            scale = 60 * 60 * 24 * 7;[m
[31m-            break;[m
[31m-[m
[31m-        case 'd':[m
[31m-            if (step >= st_day) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_day;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24);[m
[31m-            scale = 60 * 60 * 24;[m
[31m-            break;[m
[31m-[m
[31m-        case 'h':[m
[31m-            if (step >= st_hour) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_hour;[m
[31m-            max = NGX_MAX_INT_T_VALUE / (60 * 60);[m
[31m-            scale = 60 * 60;[m
[31m-            break;[m
[31m-[m
[31m-        case 'm':[m
[31m-            if (p < last && *p == 's') {[m
[31m-                if (is_sec || step >= st_msec) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                p++;[m
[31m-                step = st_msec;[m
[31m-                max = NGX_MAX_INT_T_VALUE;[m
[31m-                scale = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (step >= st_min) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_min;[m
[31m-            max = NGX_MAX_INT_T_VALUE / 60;[m
[31m-            scale = 60;[m
[31m-            break;[m
[31m-[m
[31m-        case 's':[m
[31m-            if (step >= st_sec) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_sec;[m
[31m-            max = NGX_MAX_INT_T_VALUE;[m
[31m-            scale = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case ' ':[m
[31m-            if (step >= st_sec) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            step = st_last;[m
[31m-            max = NGX_MAX_INT_T_VALUE;[m
[31m-            scale = 1;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (step != st_msec && !is_sec) {[m
[31m-            scale *= 1000;[m
[31m-            max /= 1000;[m
[31m-        }[m
[31m-[m
[31m-        if (value > max) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value *= scale;[m
[31m-[m
[31m-        if (total > NGX_MAX_INT_T_VALUE - value) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        total += value;[m
[31m-[m
[31m-        value = 0;[m
[31m-[m
[31m-        while (p < last && *p == ' ') {[m
[31m-            p++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!valid) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!is_sec) {[m
[31m-        if (value > NGX_MAX_INT_T_VALUE / 1000) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value *= 1000;[m
[31m-    }[m
[31m-[m
[31m-    if (total > NGX_MAX_INT_T_VALUE - value) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return total + value;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse.h[m
[1mdeleted file mode 100644[m
[1mindex ec093b5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PARSE_H_INCLUDED_[m
[31m-#define _NGX_PARSE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_parse_size(ngx_str_t *line);[m
[31m-off_t ngx_parse_offset(ngx_str_t *line);[m
[31m-ngx_int_t ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PARSE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse_time.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse_time.c[m
[1mdeleted file mode 100644[m
[1mindex 13afde3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse_time.c[m
[1m+++ /dev/null[m
[36m@@ -1,276 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t  mday[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };[m
[31m-[m
[31m-time_t[m
[31m-ngx_parse_http_time(u_char *value, size_t len)[m
[31m-{[m
[31m-    u_char      *p, *end;[m
[31m-    ngx_int_t    month;[m
[31m-    ngx_uint_t   day, year, hour, min, sec;[m
[31m-    uint64_t     time;[m
[31m-    enum {[m
[31m-        no = 0,[m
[31m-        rfc822,   /* Tue, 10 Nov 2002 23:50:13   */[m
[31m-        rfc850,   /* Tuesday, 10-Dec-02 23:50:13 */[m
[31m-        isoc      /* Tue Dec 10 23:50:13 2002    */[m
[31m-    } fmt;[m
[31m-[m
[31m-    fmt = 0;[m
[31m-    end = value + len;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    day = 32;[m
[31m-    year = 2038;[m
[31m-#endif[m
[31m-[m
[31m-    for (p = value; p < end; p++) {[m
[31m-        if (*p == ',') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == ' ') {[m
[31m-            fmt = isoc;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (p++; p < end; p++)[m
[31m-        if (*p != ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    if (end - p < 18) {[m
[31m-        return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    if (fmt != isoc) {[m
[31m-        if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        day = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-        p += 2;[m
[31m-[m
[31m-        if (*p == ' ') {[m
[31m-            if (end - p < 18) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            fmt = rfc822;[m
[31m-[m
[31m-        } else if (*p == '-') {[m
[31m-            fmt = rfc850;[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    switch (*p) {[m
[31m-[m
[31m-    case 'J':[m
[31m-        month = *(p + 1) == 'a' ? 0 : *(p + 2) == 'n' ? 5 : 6;[m
[31m-        break;[m
[31m-[m
[31m-    case 'F':[m
[31m-        month = 1;[m
[31m-        break;[m
[31m-[m
[31m-    case 'M':[m
[31m-        month = *(p + 2) == 'r' ? 2 : 4;[m
[31m-        break;[m
[31m-[m
[31m-    case 'A':[m
[31m-        month = *(p + 1) == 'p' ? 3 : 7;[m
[31m-        break;[m
[31m-[m
[31m-    case 'S':[m
[31m-        month = 8;[m
[31m-        break;[m
[31m-[m
[31m-    case 'O':[m
[31m-        month = 9;[m
[31m-        break;[m
[31m-[m
[31m-    case 'N':[m
[31m-        month = 10;[m
[31m-        break;[m
[31m-[m
[31m-    case 'D':[m
[31m-        month = 11;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p += 3;[m
[31m-[m
[31m-    if ((fmt == rfc822 && *p != ' ') || (fmt == rfc850 && *p != '-')) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p++;[m
[31m-[m
[31m-    if (fmt == rfc822) {[m
[31m-        if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9'[m
[31m-            || *(p + 2) < '0' || *(p + 2) > '9'[m
[31m-            || *(p + 3) < '0' || *(p + 3) > '9')[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100[m
[31m-               + (*(p + 2) - '0') * 10 + *(p + 3) - '0';[m
[31m-        p += 4;[m
[31m-[m
[31m-    } else if (fmt == rfc850) {[m
[31m-        if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        year = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-        year += (year < 70) ? 2000 : 1900;[m
[31m-        p += 2;[m
[31m-    }[m
[31m-[m
[31m-    if (fmt == isoc) {[m
[31m-        if (*p == ' ') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        day = *p++ - '0';[m
[31m-[m
[31m-        if (*p != ' ') {[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            day = day * 10 + *p++ - '0';[m
[31m-        }[m
[31m-[m
[31m-        if (end - p < 14) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (*p++ != ' ') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hour = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-    p += 2;[m
[31m-[m
[31m-    if (*p++ != ':') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    min = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-    p += 2;[m
[31m-[m
[31m-    if (*p++ != ':') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sec = (*p - '0') * 10 + *(p + 1) - '0';[m
[31m-[m
[31m-    if (fmt == isoc) {[m
[31m-        p += 2;[m
[31m-[m
[31m-        if (*p++ != ' ') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9'[m
[31m-            || *(p + 2) < '0' || *(p + 2) > '9'[m
[31m-            || *(p + 3) < '0' || *(p + 3) > '9')[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100[m
[31m-               + (*(p + 2) - '0') * 10 + *(p + 3) - '0';[m
[31m-    }[m
[31m-[m
[31m-    if (hour > 23 || min > 59 || sec > 59) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (day == 29 && month == 1) {[m
[31m-        if ((year & 3) || ((year % 100 == 0) && (year % 400) != 0)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else if (day > mday[month]) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * shift new year to March 1 and start months from 1 (not 0),[m
[31m-     * it is needed for Gauss' formula[m
[31m-     */[m
[31m-[m
[31m-    if (--month <= 0) {[m
[31m-        month += 12;[m
[31m-        year -= 1;[m
[31m-    }[m
[31m-[m
[31m-    /* Gauss' formula for Gregorian days since March 1, 1 BC */[m
[31m-[m
[31m-    time = (uint64_t) ([m
[31m-            /* days in years including leap years since March 1, 1 BC */[m
[31m-[m
[31m-            365 * year + year / 4 - year / 100 + year / 400[m
[31m-[m
[31m-            /* days before the month */[m
[31m-[m
[31m-            + 367 * month / 12 - 30[m
[31m-[m
[31m-            /* days before the day */[m
[31m-[m
[31m-            + day - 1[m
[31m-[m
[31m-            /*[m
[31m-             * 719527 days were between March 1, 1 BC and March 1, 1970,[m
[31m-             * 31 and 28 days were in January and February 1970[m
[31m-             */[m
[31m-[m
[31m-            - 719527 + 31 + 28) * 86400 + hour * 3600 + min * 60 + sec;[m
[31m-[m
[31m-#if (NGX_TIME_T_SIZE <= 4)[m
[31m-[m
[31m-    if (time > 0x7fffffff) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return (time_t) time;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse_time.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse_time.h[m
[1mdeleted file mode 100644[m
[1mindex aa542eb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_parse_time.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PARSE_TIME_H_INCLUDED_[m
[31m-#define _NGX_PARSE_TIME_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-time_t ngx_parse_http_time(u_char *value, size_t len);[m
[31m-[m
[31m-/* compatibility */[m
[31m-#define ngx_http_parse_time(value, len)  ngx_parse_http_time(value, len)[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PARSE_TIME_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_proxy_protocol.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_proxy_protocol.c[m
[1mdeleted file mode 100644[m
[1mindex f347e7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_proxy_protocol.c[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last)[m
[31m-{[m
[31m-    size_t  len;[m
[31m-    u_char  ch, *p, *addr;[m
[31m-[m
[31m-    p = buf;[m
[31m-    len = last - buf;[m
[31m-[m
[31m-    if (len < 8 || ngx_strncmp(p, "PROXY ", 6) != 0) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    p += 6;[m
[31m-    len -= 6;[m
[31m-[m
[31m-    if (len >= 7 && ngx_strncmp(p, "UNKNOWN", 7) == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                       "PROXY protocol unknown protocol");[m
[31m-        p += 7;[m
[31m-        goto skip;[m
[31m-    }[m
[31m-[m
[31m-    if (len < 5 || ngx_strncmp(p, "TCP", 3) != 0[m
[31m-        || (p[3] != '4' && p[3] != '6') || p[4] != ' ')[m
[31m-    {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    p += 5;[m
[31m-    addr = p;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (p == last) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        ch = *p++;[m
[31m-[m
[31m-        if (ch == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ch != ':' && ch != '.'[m
[31m-            && (ch < 'a' || ch > 'f')[m
[31m-            && (ch < 'A' || ch > 'F')[m
[31m-            && (ch < '0' || ch > '9'))[m
[31m-        {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = p - addr - 1;[m
[31m-    c->proxy_protocol_addr.data = ngx_pnalloc(c->pool, len);[m
[31m-[m
[31m-    if (c->proxy_protocol_addr.data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(c->proxy_protocol_addr.data, addr, len);[m
[31m-    c->proxy_protocol_addr.len = len;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "PROXY protocol address: \"%V\"", &c->proxy_protocol_addr);[m
[31m-[m
[31m-skip:[m
[31m-[m
[31m-    for ( /* void */ ; p < last - 1; p++) {[m
[31m-        if (p[0] == CR && p[1] == LF) {[m
[31m-            return p + 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                  "broken header: \"%*s\"", (size_t) (last - buf), buf);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf, u_char *last)[m
[31m-{[m
[31m-    ngx_uint_t  port, lport;[m
[31m-[m
[31m-    if (last - buf < NGX_PROXY_PROTOCOL_MAX_HEADER) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    switch (c->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        buf = ngx_cpymem(buf, "PROXY TCP4 ", sizeof("PROXY TCP4 ") - 1);[m
[31m-[m
[31m-        port = ntohs(((struct sockaddr_in *) c->sockaddr)->sin_port);[m
[31m-        lport = ntohs(((struct sockaddr_in *) c->local_sockaddr)->sin_port);[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        buf = ngx_cpymem(buf, "PROXY TCP6 ", sizeof("PROXY TCP6 ") - 1);[m
[31m-[m
[31m-        port = ntohs(((struct sockaddr_in6 *) c->sockaddr)->sin6_port);[m
[31m-        lport = ntohs(((struct sockaddr_in6 *) c->local_sockaddr)->sin6_port);[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        return ngx_cpymem(buf, "PROXY UNKNOWN" CRLF,[m
[31m-                          sizeof("PROXY UNKNOWN" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    buf += ngx_sock_ntop(c->sockaddr, c->socklen, buf, last - buf, 0);[m
[31m-[m
[31m-    *buf++ = ' ';[m
[31m-[m
[31m-    buf += ngx_sock_ntop(c->local_sockaddr, c->local_socklen, buf, last - buf,[m
[31m-                         0);[m
[31m-[m
[31m-    return ngx_slprintf(buf, last, " %ui %ui" CRLF, port, lport);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_proxy_protocol.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_proxy_protocol.h[m
[1mdeleted file mode 100644[m
[1mindex fb848f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_proxy_protocol.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROXY_PROTOCOL_H_INCLUDED_[m
[31m-#define _NGX_PROXY_PROTOCOL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_PROXY_PROTOCOL_MAX_HEADER  107[m
[31m-[m
[31m-[m
[31m-u_char *ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf,[m
[31m-    u_char *last);[m
[31m-u_char *ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf,[m
[31m-    u_char *last);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROXY_PROTOCOL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_queue.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_queue.c[m
[1mdeleted file mode 100644[m
[1mindex 3cacaf3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_queue.c[m
[1m+++ /dev/null[m
[36m@@ -1,80 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * find the middle queue element if the queue has odd number of elements[m
[31m- * or the first element of the queue's second part otherwise[m
[31m- */[m
[31m-[m
[31m-ngx_queue_t *[m
[31m-ngx_queue_middle(ngx_queue_t *queue)[m
[31m-{[m
[31m-    ngx_queue_t  *middle, *next;[m
[31m-[m
[31m-    middle = ngx_queue_head(queue);[m
[31m-[m
[31m-    if (middle == ngx_queue_last(queue)) {[m
[31m-        return middle;[m
[31m-    }[m
[31m-[m
[31m-    next = ngx_queue_head(queue);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        middle = ngx_queue_next(middle);[m
[31m-[m
[31m-        next = ngx_queue_next(next);[m
[31m-[m
[31m-        if (next == ngx_queue_last(queue)) {[m
[31m-            return middle;[m
[31m-        }[m
[31m-[m
[31m-        next = ngx_queue_next(next);[m
[31m-[m
[31m-        if (next == ngx_queue_last(queue)) {[m
[31m-            return middle;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* the stable insertion sort */[m
[31m-[m
[31m-void[m
[31m-ngx_queue_sort(ngx_queue_t *queue,[m
[31m-    ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *))[m
[31m-{[m
[31m-    ngx_queue_t  *q, *prev, *next;[m
[31m-[m
[31m-    q = ngx_queue_head(queue);[m
[31m-[m
[31m-    if (q == ngx_queue_last(queue)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for (q = ngx_queue_next(q); q != ngx_queue_sentinel(queue); q = next) {[m
[31m-[m
[31m-        prev = ngx_queue_prev(q);[m
[31m-        next = ngx_queue_next(q);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        do {[m
[31m-            if (cmp(prev, q) <= 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            prev = ngx_queue_prev(prev);[m
[31m-[m
[31m-        } while (prev != ngx_queue_sentinel(queue));[m
[31m-[m
[31m-        ngx_queue_insert_after(prev, q);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_queue.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_queue.h[m
[1mdeleted file mode 100644[m
[1mindex 038bf12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_queue.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_QUEUE_H_INCLUDED_[m
[31m-#define _NGX_QUEUE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_queue_s  ngx_queue_t;[m
[31m-[m
[31m-struct ngx_queue_s {[m
[31m-    ngx_queue_t  *prev;[m
[31m-    ngx_queue_t  *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_init(q)                                                     \[m
[31m-    (q)->prev = q;                                                            \[m
[31m-    (q)->next = q[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_empty(h)                                                    \[m
[31m-    (h == (h)->prev)[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_insert_head(h, x)                                           \[m
[31m-    (x)->next = (h)->next;                                                    \[m
[31m-    (x)->next->prev = x;                                                      \[m
[31m-    (x)->prev = h;                                                            \[m
[31m-    (h)->next = x[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_insert_after   ngx_queue_insert_head[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_insert_tail(h, x)                                           \[m
[31m-    (x)->prev = (h)->prev;                                                    \[m
[31m-    (x)->prev->next = x;                                                      \[m
[31m-    (x)->next = h;                                                            \[m
[31m-    (h)->prev = x[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_head(h)                                                     \[m
[31m-    (h)->next[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_last(h)                                                     \[m
[31m-    (h)->prev[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_sentinel(h)                                                 \[m
[31m-    (h)[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_next(q)                                                     \[m
[31m-    (q)->next[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_prev(q)                                                     \[m
[31m-    (q)->prev[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-#define ngx_queue_remove(x)                                                   \[m
[31m-    (x)->next->prev = (x)->prev;                                              \[m
[31m-    (x)->prev->next = (x)->next;                                              \[m
[31m-    (x)->prev = NULL;                                                         \[m
[31m-    (x)->next = NULL[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_queue_remove(x)                                                   \[m
[31m-    (x)->next->prev = (x)->prev;                                              \[m
[31m-    (x)->prev->next = (x)->next[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_split(h, q, n)                                              \[m
[31m-    (n)->prev = (h)->prev;                                                    \[m
[31m-    (n)->prev->next = n;                                                      \[m
[31m-    (n)->next = q;                                                            \[m
[31m-    (h)->prev = (q)->prev;                                                    \[m
[31m-    (h)->prev->next = h;                                                      \[m
[31m-    (q)->prev = n;[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_add(h, n)                                                   \[m
[31m-    (h)->prev->next = (n)->next;                                              \[m
[31m-    (n)->next->prev = (h)->prev;                                              \[m
[31m-    (h)->prev = (n)->prev;                                                    \[m
[31m-    (h)->prev->next = h;[m
[31m-[m
[31m-[m
[31m-#define ngx_queue_data(q, type, link)                                         \[m
[31m-    (type *) ((u_char *) q - offsetof(type, link))[m
[31m-[m
[31m-[m
[31m-ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue);[m
[31m-void ngx_queue_sort(ngx_queue_t *queue,[m
[31m-    ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *));[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_QUEUE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_radix_tree.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_radix_tree.c[m
[1mdeleted file mode 100644[m
[1mindex c1d8737..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_radix_tree.c[m
[1m+++ /dev/null[m
[36m@@ -1,488 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static ngx_radix_node_t *ngx_radix_alloc(ngx_radix_tree_t *tree);[m
[31m-[m
[31m-[m
[31m-ngx_radix_tree_t *[m
[31m-ngx_radix_tree_create(ngx_pool_t *pool, ngx_int_t preallocate)[m
[31m-{[m
[31m-    uint32_t           key, mask, inc;[m
[31m-    ngx_radix_tree_t  *tree;[m
[31m-[m
[31m-    tree = ngx_palloc(pool, sizeof(ngx_radix_tree_t));[m
[31m-    if (tree == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    tree->pool = pool;[m
[31m-    tree->free = NULL;[m
[31m-    tree->start = NULL;[m
[31m-    tree->size = 0;[m
[31m-[m
[31m-    tree->root = ngx_radix_alloc(tree);[m
[31m-    if (tree->root == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    tree->root->right = NULL;[m
[31m-    tree->root->left = NULL;[m
[31m-    tree->root->parent = NULL;[m
[31m-    tree->root->value = NGX_RADIX_NO_VALUE;[m
[31m-[m
[31m-    if (preallocate == 0) {[m
[31m-        return tree;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Preallocation of first nodes : 0, 1, 00, 01, 10, 11, 000, 001, etc.[m
[31m-     * increases TLB hits even if for first lookup iterations.[m
[31m-     * On 32-bit platforms the 7 preallocated bits takes continuous 4K,[m
[31m-     * 8 - 8K, 9 - 16K, etc.  On 64-bit platforms the 6 preallocated bits[m
[31m-     * takes continuous 4K, 7 - 8K, 8 - 16K, etc.  There is no sense to[m
[31m-     * to preallocate more than one page, because further preallocation[m
[31m-     * distributes the only bit per page.  Instead, a random insertion[m
[31m-     * may distribute several bits per page.[m
[31m-     *[m
[31m-     * Thus, by default we preallocate maximum[m
[31m-     *     6 bits on amd64 (64-bit platform and 4K pages)[m
[31m-     *     7 bits on i386 (32-bit platform and 4K pages)[m
[31m-     *     7 bits on sparc64 in 64-bit mode (8K pages)[m
[31m-     *     8 bits on sparc64 in 32-bit mode (8K pages)[m
[31m-     */[m
[31m-[m
[31m-    if (preallocate == -1) {[m
[31m-        switch (ngx_pagesize / sizeof(ngx_radix_node_t)) {[m
[31m-[m
[31m-        /* amd64 */[m
[31m-        case 128:[m
[31m-            preallocate = 6;[m
[31m-            break;[m
[31m-[m
[31m-        /* i386, sparc64 */[m
[31m-        case 256:[m
[31m-            preallocate = 7;[m
[31m-            break;[m
[31m-[m
[31m-        /* sparc64 in 32-bit mode */[m
[31m-        default:[m
[31m-            preallocate = 8;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    mask = 0;[m
[31m-    inc = 0x80000000;[m
[31m-[m
[31m-    while (preallocate--) {[m
[31m-[m
[31m-        key = 0;[m
[31m-        mask >>= 1;[m
[31m-        mask |= 0x80000000;[m
[31m-[m
[31m-        do {[m
[31m-            if (ngx_radix32tree_insert(tree, key, mask, NGX_RADIX_NO_VALUE)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            key += inc;[m
[31m-[m
[31m-        } while (key);[m
[31m-[m
[31m-        inc >>= 1;[m
[31m-    }[m
[31m-[m
[31m-    return tree;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_radix32tree_insert(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask,[m
[31m-    uintptr_t value)[m
[31m-{[m
[31m-    uint32_t           bit;[m
[31m-    ngx_radix_node_t  *node, *next;[m
[31m-[m
[31m-    bit = 0x80000000;[m
[31m-[m
[31m-    node = tree->root;[m
[31m-    next = tree->root;[m
[31m-[m
[31m-    while (bit & mask) {[m
[31m-        if (key & bit) {[m
[31m-            next = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            next = node->left;[m
[31m-        }[m
[31m-[m
[31m-        if (next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-        node = next;[m
[31m-    }[m
[31m-[m
[31m-    if (next) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-[m
[31m-        node->value = value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    while (bit & mask) {[m
[31m-        next = ngx_radix_alloc(tree);[m
[31m-        if (next == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        next->right = NULL;[m
[31m-        next->left = NULL;[m
[31m-        next->parent = node;[m
[31m-        next->value = NGX_RADIX_NO_VALUE;[m
[31m-[m
[31m-        if (key & bit) {[m
[31m-            node->right = next;[m
[31m-[m
[31m-        } else {[m
[31m-            node->left = next;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-        node = next;[m
[31m-    }[m
[31m-[m
[31m-    node->value = value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_radix32tree_delete(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask)[m
[31m-{[m
[31m-    uint32_t           bit;[m
[31m-    ngx_radix_node_t  *node;[m
[31m-[m
[31m-    bit = 0x80000000;[m
[31m-    node = tree->root;[m
[31m-[m
[31m-    while (node && (bit & mask)) {[m
[31m-        if (key & bit) {[m
[31m-            node = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            node = node->left;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-    }[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (node->right || node->left) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            node->value = NGX_RADIX_NO_VALUE;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (node->parent->right == node) {[m
[31m-            node->parent->right = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            node->parent->left = NULL;[m
[31m-        }[m
[31m-[m
[31m-        node->right = tree->free;[m
[31m-        tree->free = node;[m
[31m-[m
[31m-        node = node->parent;[m
[31m-[m
[31m-        if (node->right || node->left) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (node->parent == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key)[m
[31m-{[m
[31m-    uint32_t           bit;[m
[31m-    uintptr_t          value;[m
[31m-    ngx_radix_node_t  *node;[m
[31m-[m
[31m-    bit = 0x80000000;[m
[31m-    value = NGX_RADIX_NO_VALUE;[m
[31m-    node = tree->root;[m
[31m-[m
[31m-    while (node) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            value = node->value;[m
[31m-        }[m
[31m-[m
[31m-        if (key & bit) {[m
[31m-            node = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            node = node->left;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_radix128tree_insert(ngx_radix_tree_t *tree, u_char *key, u_char *mask,[m
[31m-    uintptr_t value)[m
[31m-{[m
[31m-    u_char             bit;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_radix_node_t  *node, *next;[m
[31m-[m
[31m-    i = 0;[m
[31m-    bit = 0x80;[m
[31m-[m
[31m-    node = tree->root;[m
[31m-    next = tree->root;[m
[31m-[m
[31m-    while (bit & mask[i]) {[m
[31m-        if (key[i] & bit) {[m
[31m-            next = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            next = node->left;[m
[31m-        }[m
[31m-[m
[31m-        if (next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-        node = next;[m
[31m-[m
[31m-        if (bit == 0) {[m
[31m-            if (++i == 16) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            bit = 0x80;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (next) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-[m
[31m-        node->value = value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    while (bit & mask[i]) {[m
[31m-        next = ngx_radix_alloc(tree);[m
[31m-        if (next == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        next->right = NULL;[m
[31m-        next->left = NULL;[m
[31m-        next->parent = node;[m
[31m-        next->value = NGX_RADIX_NO_VALUE;[m
[31m-[m
[31m-        if (key[i] & bit) {[m
[31m-            node->right = next;[m
[31m-[m
[31m-        } else {[m
[31m-            node->left = next;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-        node = next;[m
[31m-[m
[31m-        if (bit == 0) {[m
[31m-            if (++i == 16) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            bit = 0x80;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    node->value = value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_radix128tree_delete(ngx_radix_tree_t *tree, u_char *key, u_char *mask)[m
[31m-{[m
[31m-    u_char             bit;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_radix_node_t  *node;[m
[31m-[m
[31m-    i = 0;[m
[31m-    bit = 0x80;[m
[31m-    node = tree->root;[m
[31m-[m
[31m-    while (node && (bit & mask[i])) {[m
[31m-        if (key[i] & bit) {[m
[31m-            node = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            node = node->left;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-[m
[31m-        if (bit == 0) {[m
[31m-            if (++i == 16) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            bit = 0x80;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (node->right || node->left) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            node->value = NGX_RADIX_NO_VALUE;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (node->parent->right == node) {[m
[31m-            node->parent->right = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            node->parent->left = NULL;[m
[31m-        }[m
[31m-[m
[31m-        node->right = tree->free;[m
[31m-        tree->free = node;[m
[31m-[m
[31m-        node = node->parent;[m
[31m-[m
[31m-        if (node->right || node->left) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (node->parent == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_radix128tree_find(ngx_radix_tree_t *tree, u_char *key)[m
[31m-{[m
[31m-    u_char             bit;[m
[31m-    uintptr_t          value;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_radix_node_t  *node;[m
[31m-[m
[31m-    i = 0;[m
[31m-    bit = 0x80;[m
[31m-    value = NGX_RADIX_NO_VALUE;[m
[31m-    node = tree->root;[m
[31m-[m
[31m-    while (node) {[m
[31m-        if (node->value != NGX_RADIX_NO_VALUE) {[m
[31m-            value = node->value;[m
[31m-        }[m
[31m-[m
[31m-        if (key[i] & bit) {[m
[31m-            node = node->right;[m
[31m-[m
[31m-        } else {[m
[31m-            node = node->left;[m
[31m-        }[m
[31m-[m
[31m-        bit >>= 1;[m
[31m-[m
[31m-        if (bit == 0) {[m
[31m-            i++;[m
[31m-            bit = 0x80;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_radix_node_t *[m
[31m-ngx_radix_alloc(ngx_radix_tree_t *tree)[m
[31m-{[m
[31m-    ngx_radix_node_t  *p;[m
[31m-[m
[31m-    if (tree->free) {[m
[31m-        p = tree->free;[m
[31m-        tree->free = tree->free->right;[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    if (tree->size < sizeof(ngx_radix_node_t)) {[m
[31m-        tree->start = ngx_pmemalign(tree->pool, ngx_pagesize, ngx_pagesize);[m
[31m-        if (tree->start == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        tree->size = ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    p = (ngx_radix_node_t *) tree->start;[m
[31m-    tree->start += sizeof(ngx_radix_node_t);[m
[31m-    tree->size -= sizeof(ngx_radix_node_t);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_radix_tree.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_radix_tree.h[m
[1mdeleted file mode 100644[m
[1mindex 4fe06e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_radix_tree.h[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_RADIX_TREE_H_INCLUDED_[m
[31m-#define _NGX_RADIX_TREE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_RADIX_NO_VALUE   (uintptr_t) -1[m
[31m-[m
[31m-typedef struct ngx_radix_node_s  ngx_radix_node_t;[m
[31m-[m
[31m-struct ngx_radix_node_s {[m
[31m-    ngx_radix_node_t  *right;[m
[31m-    ngx_radix_node_t  *left;[m
[31m-    ngx_radix_node_t  *parent;[m
[31m-    uintptr_t          value;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_radix_node_t  *root;[m
[31m-    ngx_pool_t        *pool;[m
[31m-    ngx_radix_node_t  *free;[m
[31m-    char              *start;[m
[31m-    size_t             size;[m
[31m-} ngx_radix_tree_t;[m
[31m-[m
[31m-[m
[31m-ngx_radix_tree_t *ngx_radix_tree_create(ngx_pool_t *pool,[m
[31m-    ngx_int_t preallocate);[m
[31m-[m
[31m-ngx_int_t ngx_radix32tree_insert(ngx_radix_tree_t *tree,[m
[31m-    uint32_t key, uint32_t mask, uintptr_t value);[m
[31m-ngx_int_t ngx_radix32tree_delete(ngx_radix_tree_t *tree,[m
[31m-    uint32_t key, uint32_t mask);[m
[31m-uintptr_t ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-ngx_int_t ngx_radix128tree_insert(ngx_radix_tree_t *tree,[m
[31m-    u_char *key, u_char *mask, uintptr_t value);[m
[31m-ngx_int_t ngx_radix128tree_delete(ngx_radix_tree_t *tree,[m
[31m-    u_char *key, u_char *mask);[m
[31m-uintptr_t ngx_radix128tree_find(ngx_radix_tree_t *tree, u_char *key);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_RADIX_TREE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rbtree.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rbtree.c[m
[1mdeleted file mode 100644[m
[1mindex 6c66f40..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rbtree.c[m
[1m+++ /dev/null[m
[36m@@ -1,380 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The red-black tree code is based on the algorithm described in[m
[31m- * the "Introduction to Algorithms" by Cormen, Leiserson and Rivest.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_node_t **root,[m
[31m-    ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node);[m
[31m-static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_node_t **root,[m
[31m-    ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rbtree_insert(ngx_rbtree_t *tree, ngx_rbtree_node_t *node)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **root, *temp, *sentinel;[m
[31m-[m
[31m-    /* a binary tree insert */[m
[31m-[m
[31m-    root = (ngx_rbtree_node_t **) &tree->root;[m
[31m-    sentinel = tree->sentinel;[m
[31m-[m
[31m-    if (*root == sentinel) {[m
[31m-        node->parent = NULL;[m
[31m-        node->left = sentinel;[m
[31m-        node->right = sentinel;[m
[31m-        ngx_rbt_black(node);[m
[31m-        *root = node;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    tree->insert(*root, node, sentinel);[m
[31m-[m
[31m-    /* re-balance tree */[m
[31m-[m
[31m-    while (node != *root && ngx_rbt_is_red(node->parent)) {[m
[31m-[m
[31m-        if (node->parent == node->parent->parent->left) {[m
[31m-            temp = node->parent->parent->right;[m
[31m-[m
[31m-            if (ngx_rbt_is_red(temp)) {[m
[31m-                ngx_rbt_black(node->parent);[m
[31m-                ngx_rbt_black(temp);[m
[31m-                ngx_rbt_red(node->parent->parent);[m
[31m-                node = node->parent->parent;[m
[31m-[m
[31m-            } else {[m
[31m-                if (node == node->parent->right) {[m
[31m-                    node = node->parent;[m
[31m-                    ngx_rbtree_left_rotate(root, sentinel, node);[m
[31m-                }[m
[31m-[m
[31m-                ngx_rbt_black(node->parent);[m
[31m-                ngx_rbt_red(node->parent->parent);[m
[31m-                ngx_rbtree_right_rotate(root, sentinel, node->parent->parent);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            temp = node->parent->parent->left;[m
[31m-[m
[31m-            if (ngx_rbt_is_red(temp)) {[m
[31m-                ngx_rbt_black(node->parent);[m
[31m-                ngx_rbt_black(temp);[m
[31m-                ngx_rbt_red(node->parent->parent);[m
[31m-                node = node->parent->parent;[m
[31m-[m
[31m-            } else {[m
[31m-                if (node == node->parent->left) {[m
[31m-                    node = node->parent;[m
[31m-                    ngx_rbtree_right_rotate(root, sentinel, node);[m
[31m-                }[m
[31m-[m
[31m-                ngx_rbt_black(node->parent);[m
[31m-                ngx_rbt_red(node->parent->parent);[m
[31m-                ngx_rbtree_left_rotate(root, sentinel, node->parent->parent);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbt_black(*root);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,[m
[31m-    ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        p = (node->key < temp->key) ? &temp->left : &temp->right;[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,[m
[31m-    ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /*[m
[31m-         * Timer values[m
[31m-         * 1) are spread in small range, usually several minutes,[m
[31m-         * 2) and overflow each 49 days, if milliseconds are stored in 32 bits.[m
[31m-         * The comparison takes into account that overflow.[m
[31m-         */[m
[31m-[m
[31m-        /*  node->key < temp->key */[m
[31m-[m
[31m-        p = ((ngx_rbtree_key_int_t) (node->key - temp->key) < 0)[m
[31m-            ? &temp->left : &temp->right;[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rbtree_delete(ngx_rbtree_t *tree, ngx_rbtree_node_t *node)[m
[31m-{[m
[31m-    ngx_uint_t           red;[m
[31m-    ngx_rbtree_node_t  **root, *sentinel, *subst, *temp, *w;[m
[31m-[m
[31m-    /* a binary tree delete */[m
[31m-[m
[31m-    root = (ngx_rbtree_node_t **) &tree->root;[m
[31m-    sentinel = tree->sentinel;[m
[31m-[m
[31m-    if (node->left == sentinel) {[m
[31m-        temp = node->right;[m
[31m-        subst = node;[m
[31m-[m
[31m-    } else if (node->right == sentinel) {[m
[31m-        temp = node->left;[m
[31m-        subst = node;[m
[31m-[m
[31m-    } else {[m
[31m-        subst = ngx_rbtree_min(node->right, sentinel);[m
[31m-[m
[31m-        if (subst->left != sentinel) {[m
[31m-            temp = subst->left;[m
[31m-        } else {[m
[31m-            temp = subst->right;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (subst == *root) {[m
[31m-        *root = temp;[m
[31m-        ngx_rbt_black(temp);[m
[31m-[m
[31m-        /* DEBUG stuff */[m
[31m-        node->left = NULL;[m
[31m-        node->right = NULL;[m
[31m-        node->parent = NULL;[m
[31m-        node->key = 0;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    red = ngx_rbt_is_red(subst);[m
[31m-[m
[31m-    if (subst == subst->parent->left) {[m
[31m-        subst->parent->left = temp;[m
[31m-[m
[31m-    } else {[m
[31m-        subst->parent->right = temp;[m
[31m-    }[m
[31m-[m
[31m-    if (subst == node) {[m
[31m-[m
[31m-        temp->parent = subst->parent;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (subst->parent == node) {[m
[31m-            temp->parent = subst;[m
[31m-[m
[31m-        } else {[m
[31m-            temp->parent = subst->parent;[m
[31m-        }[m
[31m-[m
[31m-        subst->left = node->left;[m
[31m-        subst->right = node->right;[m
[31m-        subst->parent = node->parent;[m
[31m-        ngx_rbt_copy_color(subst, node);[m
[31m-[m
[31m-        if (node == *root) {[m
[31m-            *root = subst;[m
[31m-[m
[31m-        } else {[m
[31m-            if (node == node->parent->left) {[m
[31m-                node->parent->left = subst;[m
[31m-            } else {[m
[31m-                node->parent->right = subst;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (subst->left != sentinel) {[m
[31m-            subst->left->parent = subst;[m
[31m-        }[m
[31m-[m
[31m-        if (subst->right != sentinel) {[m
[31m-            subst->right->parent = subst;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* DEBUG stuff */[m
[31m-    node->left = NULL;[m
[31m-    node->right = NULL;[m
[31m-    node->parent = NULL;[m
[31m-    node->key = 0;[m
[31m-[m
[31m-    if (red) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* a delete fixup */[m
[31m-[m
[31m-    while (temp != *root && ngx_rbt_is_black(temp)) {[m
[31m-[m
[31m-        if (temp == temp->parent->left) {[m
[31m-            w = temp->parent->right;[m
[31m-[m
[31m-            if (ngx_rbt_is_red(w)) {[m
[31m-                ngx_rbt_black(w);[m
[31m-                ngx_rbt_red(temp->parent);[m
[31m-                ngx_rbtree_left_rotate(root, sentinel, temp->parent);[m
[31m-                w = temp->parent->right;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_rbt_is_black(w->left) && ngx_rbt_is_black(w->right)) {[m
[31m-                ngx_rbt_red(w);[m
[31m-                temp = temp->parent;[m
[31m-[m
[31m-            } else {[m
[31m-                if (ngx_rbt_is_black(w->right)) {[m
[31m-                    ngx_rbt_black(w->left);[m
[31m-                    ngx_rbt_red(w);[m
[31m-                    ngx_rbtree_right_rotate(root, sentinel, w);[m
[31m-                    w = temp->parent->right;[m
[31m-                }[m
[31m-[m
[31m-                ngx_rbt_copy_color(w, temp->parent);[m
[31m-                ngx_rbt_black(temp->parent);[m
[31m-                ngx_rbt_black(w->right);[m
[31m-                ngx_rbtree_left_rotate(root, sentinel, temp->parent);[m
[31m-                temp = *root;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            w = temp->parent->left;[m
[31m-[m
[31m-            if (ngx_rbt_is_red(w)) {[m
[31m-                ngx_rbt_black(w);[m
[31m-                ngx_rbt_red(temp->parent);[m
[31m-                ngx_rbtree_right_rotate(root, sentinel, temp->parent);[m
[31m-                w = temp->parent->left;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_rbt_is_black(w->left) && ngx_rbt_is_black(w->right)) {[m
[31m-                ngx_rbt_red(w);[m
[31m-                temp = temp->parent;[m
[31m-[m
[31m-            } else {[m
[31m-                if (ngx_rbt_is_black(w->left)) {[m
[31m-                    ngx_rbt_black(w->right);[m
[31m-                    ngx_rbt_red(w);[m
[31m-                    ngx_rbtree_left_rotate(root, sentinel, w);[m
[31m-                    w = temp->parent->left;[m
[31m-                }[m
[31m-[m
[31m-                ngx_rbt_copy_color(w, temp->parent);[m
[31m-                ngx_rbt_black(temp->parent);[m
[31m-                ngx_rbt_black(w->left);[m
[31m-                ngx_rbtree_right_rotate(root, sentinel, temp->parent);[m
[31m-                temp = *root;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbt_black(temp);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_rbtree_left_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,[m
[31m-    ngx_rbtree_node_t *node)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  *temp;[m
[31m-[m
[31m-    temp = node->right;[m
[31m-    node->right = temp->left;[m
[31m-[m
[31m-    if (temp->left != sentinel) {[m
[31m-        temp->left->parent = node;[m
[31m-    }[m
[31m-[m
[31m-    temp->parent = node->parent;[m
[31m-[m
[31m-    if (node == *root) {[m
[31m-        *root = temp;[m
[31m-[m
[31m-    } else if (node == node->parent->left) {[m
[31m-        node->parent->left = temp;[m
[31m-[m
[31m-    } else {[m
[31m-        node->parent->right = temp;[m
[31m-    }[m
[31m-[m
[31m-    temp->left = node;[m
[31m-    node->parent = temp;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_rbtree_right_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,[m
[31m-    ngx_rbtree_node_t *node)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  *temp;[m
[31m-[m
[31m-    temp = node->left;[m
[31m-    node->left = temp->right;[m
[31m-[m
[31m-    if (temp->right != sentinel) {[m
[31m-        temp->right->parent = node;[m
[31m-    }[m
[31m-[m
[31m-    temp->parent = node->parent;[m
[31m-[m
[31m-    if (node == *root) {[m
[31m-        *root = temp;[m
[31m-[m
[31m-    } else if (node == node->parent->right) {[m
[31m-        node->parent->right = temp;[m
[31m-[m
[31m-    } else {[m
[31m-        node->parent->left = temp;[m
[31m-    }[m
[31m-[m
[31m-    temp->right = node;[m
[31m-    node->parent = temp;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rbtree.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rbtree.h[m
[1mdeleted file mode 100644[m
[1mindex 1d33e3f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rbtree.h[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_RBTREE_H_INCLUDED_[m
[31m-#define _NGX_RBTREE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_uint_t  ngx_rbtree_key_t;[m
[31m-typedef ngx_int_t   ngx_rbtree_key_int_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_rbtree_node_s  ngx_rbtree_node_t;[m
[31m-[m
[31m-struct ngx_rbtree_node_s {[m
[31m-    ngx_rbtree_key_t       key;[m
[31m-    ngx_rbtree_node_t     *left;[m
[31m-    ngx_rbtree_node_t     *right;[m
[31m-    ngx_rbtree_node_t     *parent;[m
[31m-    u_char                 color;[m
[31m-    u_char                 data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_rbtree_s  ngx_rbtree_t;[m
[31m-[m
[31m-typedef void (*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-struct ngx_rbtree_s {[m
[31m-    ngx_rbtree_node_t     *root;[m
[31m-    ngx_rbtree_node_t     *sentinel;[m
[31m-    ngx_rbtree_insert_pt   insert;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define ngx_rbtree_init(tree, s, i)                                           \[m
[31m-    ngx_rbtree_sentinel_init(s);                                              \[m
[31m-    (tree)->root = s;                                                         \[m
[31m-    (tree)->sentinel = s;                                                     \[m
[31m-    (tree)->insert = i[m
[31m-[m
[31m-[m
[31m-void ngx_rbtree_insert(ngx_rbtree_t *tree, ngx_rbtree_node_t *node);[m
[31m-void ngx_rbtree_delete(ngx_rbtree_t *tree, ngx_rbtree_node_t *node);[m
[31m-void ngx_rbtree_insert_value(ngx_rbtree_node_t *root, ngx_rbtree_node_t *node,[m
[31m-    ngx_rbtree_node_t *sentinel);[m
[31m-void ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *root,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-[m
[31m-#define ngx_rbt_red(node)               ((node)->color = 1)[m
[31m-#define ngx_rbt_black(node)             ((node)->color = 0)[m
[31m-#define ngx_rbt_is_red(node)            ((node)->color)[m
[31m-#define ngx_rbt_is_black(node)          (!ngx_rbt_is_red(node))[m
[31m-#define ngx_rbt_copy_color(n1, n2)      (n1->color = n2->color)[m
[31m-[m
[31m-[m
[31m-/* a sentinel must be black */[m
[31m-[m
[31m-#define ngx_rbtree_sentinel_init(node)  ngx_rbt_black(node)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_rbtree_node_t *[m
[31m-ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    while (node->left != sentinel) {[m
[31m-        node = node->left;[m
[31m-    }[m
[31m-[m
[31m-    return node;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_RBTREE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_regex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_regex.c[m
[1mdeleted file mode 100644[m
[1mindex 9939dce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_regex.c[m
[1m+++ /dev/null[m
[36m@@ -1,435 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t  pcre_jit;[m
[31m-} ngx_regex_conf_t;[m
[31m-[m
[31m-[m
[31m-static void * ngx_libc_cdecl ngx_regex_malloc(size_t size);[m
[31m-static void ngx_libc_cdecl ngx_regex_free(void *p);[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-static void ngx_pcre_free_studies(void *data);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_regex_module_init(ngx_cycle_t *cycle);[m
[31m-[m
[31m-static void *ngx_regex_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static char *ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data);[m
[31m-static ngx_conf_post_t  ngx_regex_pcre_jit_post = { ngx_regex_pcre_jit };[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_regex_commands[] = {[m
[31m-[m
[31m-    { ngx_string("pcre_jit"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_regex_conf_t, pcre_jit),[m
[31m-      &ngx_regex_pcre_jit_post },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_regex_module_ctx = {[m
[31m-    ngx_string("regex"),[m
[31m-    ngx_regex_create_conf,[m
[31m-    ngx_regex_init_conf[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_regex_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_regex_module_ctx,                 /* module context */[m
[31m-    ngx_regex_commands,                    /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    ngx_regex_module_init,                 /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_pool_t  *ngx_pcre_pool;[m
[31m-static ngx_list_t  *ngx_pcre_studies;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_regex_init(void)[m
[31m-{[m
[31m-    pcre_malloc = ngx_regex_malloc;[m
[31m-    pcre_free = ngx_regex_free;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_regex_malloc_init(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pcre_pool = pool;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_regex_malloc_done(void)[m
[31m-{[m
[31m-    ngx_pcre_pool = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_regex_compile(ngx_regex_compile_t *rc)[m
[31m-{[m
[31m-    int               n, erroff;[m
[31m-    char             *p;[m
[31m-    pcre             *re;[m
[31m-    const char       *errstr;[m
[31m-    ngx_regex_elt_t  *elt;[m
[31m-[m
[31m-    ngx_regex_malloc_init(rc->pool);[m
[31m-[m
[31m-    re = pcre_compile((const char *) rc->pattern.data, (int) rc->options,[m
[31m-                      &errstr, &erroff, NULL);[m
[31m-[m
[31m-    /* ensure that there is no current pool */[m
[31m-    ngx_regex_malloc_done();[m
[31m-[m
[31m-    if (re == NULL) {[m
[31m-        if ((size_t) erroff == rc->pattern.len) {[m
[31m-           rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                              "pcre_compile() failed: %s in \"%V\"",[m
[31m-                               errstr, &rc->pattern)[m
[31m-                      - rc->err.data;[m
[31m-[m
[31m-        } else {[m
[31m-           rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                              "pcre_compile() failed: %s in \"%V\" at \"%s\"",[m
[31m-                               errstr, &rc->pattern, rc->pattern.data + erroff)[m
[31m-                      - rc->err.data;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc->regex = ngx_pcalloc(rc->pool, sizeof(ngx_regex_t));[m
[31m-    if (rc->regex == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    rc->regex->code = re;[m
[31m-[m
[31m-    /* do not study at runtime */[m
[31m-[m
[31m-    if (ngx_pcre_studies != NULL) {[m
[31m-        elt = ngx_list_push(ngx_pcre_studies);[m
[31m-        if (elt == NULL) {[m
[31m-            goto nomem;[m
[31m-        }[m
[31m-[m
[31m-        elt->regex = rc->regex;[m
[31m-        elt->name = rc->pattern.data;[m
[31m-    }[m
[31m-[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &rc->captures);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_CAPTURECOUNT) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc->captures == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMECOUNT, &rc->named_captures);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMECOUNT) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc->named_captures == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &rc->name_size);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMEENTRYSIZE) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMETABLE, &rc->names);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMETABLE) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, p, &rc->pattern, n)[m
[31m-                  - rc->err.data;[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                               "regex \"%V\" compilation failed: no memory",[m
[31m-                               &rc->pattern)[m
[31m-                  - rc->err.data;[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_regex_elt_t  *re;[m
[31m-[m
[31m-    re = a->elts;[m
[31m-[m
[31m-    for (i = 0; i < a->nelts; i++) {[m
[31m-[m
[31m-        n = ngx_regex_exec(re[i].regex, s, NULL, 0);[m
[31m-[m
[31m-        if (n == NGX_REGEX_NO_MATCHED) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n < 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          ngx_regex_exec_n " failed: %i on \"%V\" using \"%s\"",[m
[31m-                          n, s, re[i].name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* match */[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void * ngx_libc_cdecl[m
[31m-ngx_regex_malloc(size_t size)[m
[31m-{[m
[31m-    ngx_pool_t      *pool;[m
[31m-    pool = ngx_pcre_pool;[m
[31m-[m
[31m-    if (pool) {[m
[31m-        return ngx_palloc(pool, size);[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void ngx_libc_cdecl[m
[31m-ngx_regex_free(void *p)[m
[31m-{[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-[m
[31m-static void[m
[31m-ngx_pcre_free_studies(void *data)[m
[31m-{[m
[31m-    ngx_list_t *studies = data;[m
[31m-[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_regex_elt_t  *elts;[m
[31m-[m
[31m-    part = &studies->part;[m
[31m-    elts = part->elts;[m
[31m-[m
[31m-    for (i = 0 ; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            elts = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (elts[i].regex->extra != NULL) {[m
[31m-            pcre_free_study(elts[i].regex->extra);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_regex_module_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int               opt;[m
[31m-    const char       *errstr;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_regex_elt_t  *elts;[m
[31m-[m
[31m-    opt = 0;[m
[31m-[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-    {[m
[31m-    ngx_regex_conf_t    *rcf;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    rcf = (ngx_regex_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_regex_module);[m
[31m-[m
[31m-    if (rcf->pcre_jit) {[m
[31m-        opt = PCRE_STUDY_JIT_COMPILE;[m
[31m-[m
[31m-        /*[m
[31m-         * The PCRE JIT compiler uses mmap for its executable codes, so we[m
[31m-         * have to explicitly call the pcre_free_study() function to free[m
[31m-         * this memory.[m
[31m-         */[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(cycle->pool, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_pcre_free_studies;[m
[31m-        cln->data = ngx_pcre_studies;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_regex_malloc_init(cycle->pool);[m
[31m-[m
[31m-    part = &ngx_pcre_studies->part;[m
[31m-    elts = part->elts;[m
[31m-[m
[31m-    for (i = 0 ; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            elts = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        elts[i].regex->extra = pcre_study(elts[i].regex->code, opt, &errstr);[m
[31m-[m
[31m-        if (errstr != NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "pcre_study() failed: %s in \"%s\"",[m
[31m-                          errstr, elts[i].name);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-        if (opt & PCRE_STUDY_JIT_COMPILE) {[m
[31m-            int jit, n;[m
[31m-[m
[31m-            jit = 0;[m
[31m-            n = pcre_fullinfo(elts[i].regex->code, elts[i].regex->extra,[m
[31m-                              PCRE_INFO_JIT, &jit);[m
[31m-[m
[31m-            if (n != 0 || jit != 1) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, cycle->log, 0,[m
[31m-                              "JIT compiler does not support pattern: \"%s\"",[m
[31m-                              elts[i].name);[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ngx_regex_malloc_done();[m
[31m-[m
[31m-    ngx_pcre_studies = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_regex_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_regex_conf_t  *rcf;[m
[31m-[m
[31m-    rcf = ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t));[m
[31m-    if (rcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rcf->pcre_jit = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ngx_pcre_studies = ngx_list_create(cycle->pool, 8, sizeof(ngx_regex_elt_t));[m
[31m-    if (ngx_pcre_studies == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return rcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_regex_conf_t *rcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_value(rcf->pcre_jit, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_flag_t  *fp = data;[m
[31m-[m
[31m-    if (*fp == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_PCRE_JIT)[m
[31m-    {[m
[31m-    int  jit, r;[m
[31m-[m
[31m-    jit = 0;[m
[31m-    r = pcre_config(PCRE_CONFIG_JIT, &jit);[m
[31m-[m
[31m-    if (r != 0 || jit != 1) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "PCRE library does not support JIT");[m
[31m-        *fp = 0;[m
[31m-    }[m
[31m-    }[m
[31m-#else[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "nginx was built without PCRE JIT support");[m
[31m-    *fp = 0;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_regex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_regex.h[m
[1mdeleted file mode 100644[m
[1mindex 680486c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_regex.h[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_REGEX_H_INCLUDED_[m
[31m-#define _NGX_REGEX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#include <pcre.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_REGEX_NO_MATCHED  PCRE_ERROR_NOMATCH   /* -1 */[m
[31m-[m
[31m-#define NGX_REGEX_CASELESS    PCRE_CASELESS[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    pcre        *code;[m
[31m-    pcre_extra  *extra;[m
[31m-} ngx_regex_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     pattern;[m
[31m-    ngx_pool_t   *pool;[m
[31m-    ngx_int_t     options;[m
[31m-[m
[31m-    ngx_regex_t  *regex;[m
[31m-    int           captures;[m
[31m-    int           named_captures;[m
[31m-    int           name_size;[m
[31m-    u_char       *names;[m
[31m-    ngx_str_t     err;[m
[31m-} ngx_regex_compile_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_regex_t  *regex;[m
[31m-    u_char       *name;[m
[31m-} ngx_regex_elt_t;[m
[31m-[m
[31m-[m
[31m-void ngx_regex_init(void);[m
[31m-ngx_int_t ngx_regex_compile(ngx_regex_compile_t *rc);[m
[31m-[m
[31m-#define ngx_regex_exec(re, s, captures, size)                                \[m
[31m-    pcre_exec(re->code, re->extra, (const char *) (s)->data, (s)->len, 0, 0, \[m
[31m-              captures, size)[m
[31m-#define ngx_regex_exec_n      "pcre_exec()"[m
[31m-[m
[31m-ngx_int_t ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_REGEX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_resolver.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_resolver.c[m
[1mdeleted file mode 100644[m
[1mindex e00fe22..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_resolver.c[m
[1m+++ /dev/null[m
[36m@@ -1,4662 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_RESOLVER_UDP_SIZE   4096[m
[31m-[m
[31m-#define NGX_RESOLVER_TCP_RSIZE  (2 + 65535)[m
[31m-#define NGX_RESOLVER_TCP_WSIZE  8192[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  ident_hi;[m
[31m-    u_char  ident_lo;[m
[31m-    u_char  flags_hi;[m
[31m-    u_char  flags_lo;[m
[31m-    u_char  nqs_hi;[m
[31m-    u_char  nqs_lo;[m
[31m-    u_char  nan_hi;[m
[31m-    u_char  nan_lo;[m
[31m-    u_char  nns_hi;[m
[31m-    u_char  nns_lo;[m
[31m-    u_char  nar_hi;[m
[31m-    u_char  nar_lo;[m
[31m-} ngx_resolver_hdr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  type_hi;[m
[31m-    u_char  type_lo;[m
[31m-    u_char  class_hi;[m
[31m-    u_char  class_lo;[m
[31m-} ngx_resolver_qs_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  type_hi;[m
[31m-    u_char  type_lo;[m
[31m-    u_char  class_hi;[m
[31m-    u_char  class_lo;[m
[31m-    u_char  ttl[4];[m
[31m-    u_char  len_hi;[m
[31m-    u_char  len_lo;[m
[31m-} ngx_resolver_an_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_resolver_node(n)                                                 \[m
[31m-    (ngx_resolver_node_t *)                                                  \[m
[31m-        ((u_char *) (n) - offsetof(ngx_resolver_node_t, node))[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_udp_connect(ngx_resolver_connection_t *rec);[m
[31m-ngx_int_t ngx_tcp_connect(ngx_resolver_connection_t *rec);[m
[31m-[m
[31m-[m
[31m-static void ngx_resolver_cleanup(void *data);[m
[31m-static void ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree);[m
[31m-static ngx_int_t ngx_resolve_name_locked(ngx_resolver_t *r,[m
[31m-    ngx_resolver_ctx_t *ctx, ngx_str_t *name);[m
[31m-static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree,[m
[31m-    ngx_queue_t *queue);[m
[31m-static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn);[m
[31m-static ngx_int_t ngx_resolver_send_udp_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_connection_t *rec, u_char *query, u_short qlen);[m
[31m-static ngx_int_t ngx_resolver_send_tcp_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_connection_t *rec, u_char *query, u_short qlen);[m
[31m-static ngx_int_t ngx_resolver_create_name_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn, ngx_str_t *name);[m
[31m-static ngx_int_t ngx_resolver_create_srv_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn, ngx_str_t *name);[m
[31m-static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn, ngx_resolver_addr_t *addr);[m
[31m-static void ngx_resolver_resend_handler(ngx_event_t *ev);[m
[31m-static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree,[m
[31m-    ngx_queue_t *queue);[m
[31m-static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r);[m
[31m-static void ngx_resolver_udp_read(ngx_event_t *rev);[m
[31m-static void ngx_resolver_tcp_write(ngx_event_t *wev);[m
[31m-static void ngx_resolver_tcp_read(ngx_event_t *rev);[m
[31m-static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf,[m
[31m-    size_t n, ngx_uint_t tcp);[m
[31m-static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,[m
[31m-    ngx_uint_t nan, ngx_uint_t trunc, ngx_uint_t ans);[m
[31m-static void ngx_resolver_process_srv(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan,[m
[31m-    ngx_uint_t trunc, ngx_uint_t ans);[m
[31m-static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan);[m
[31m-static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r,[m
[31m-    ngx_str_t *name, uint32_t hash);[m
[31m-static ngx_resolver_node_t *ngx_resolver_lookup_srv(ngx_resolver_t *r,[m
[31m-    ngx_str_t *name, uint32_t hash);[m
[31m-static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r,[m
[31m-    in_addr_t addr);[m
[31m-static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-static ngx_int_t ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name,[m
[31m-    u_char *buf, u_char *src, u_char *last);[m
[31m-static void ngx_resolver_timeout_handler(ngx_event_t *ev);[m
[31m-static void ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn);[m
[31m-static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size);[m
[31m-static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size);[m
[31m-static void ngx_resolver_free(ngx_resolver_t *r, void *p);[m
[31m-static void ngx_resolver_free_locked(ngx_resolver_t *r, void *p);[m
[31m-static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size);[m
[31m-static ngx_resolver_addr_t *ngx_resolver_export(ngx_resolver_t *r,[m
[31m-    ngx_resolver_node_t *rn, ngx_uint_t rotate);[m
[31m-static void ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx);[m
[31m-static u_char *ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-static void ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx,[m
[31m-    ngx_resolver_node_t *rn);[m
[31m-static void ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_resolver_cmp_srvs(const void *one, const void *two);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static void ngx_resolver_rbtree_insert_addr6_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-static ngx_resolver_node_t *ngx_resolver_lookup_addr6(ngx_resolver_t *r,[m
[31m-    struct in6_addr *addr, uint32_t hash);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_resolver_t *[m
[31m-ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_str_t                   s;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_uint_t                  i, j;[m
[31m-    ngx_resolver_t             *r;[m
[31m-    ngx_pool_cleanup_t         *cln;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_resolver_cleanup;[m
[31m-[m
[31m-    r = ngx_calloc(sizeof(ngx_resolver_t), cf->log);[m
[31m-    if (r == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->data = r;[m
[31m-[m
[31m-    r->event = ngx_calloc(sizeof(ngx_event_t), cf->log);[m
[31m-    if (r->event == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel,[m
[31m-                    ngx_resolver_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_rbtree_init(&r->srv_rbtree, &r->srv_sentinel,[m
[31m-                    ngx_resolver_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_rbtree_init(&r->addr_rbtree, &r->addr_sentinel,[m
[31m-                    ngx_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&r->name_resend_queue);[m
[31m-    ngx_queue_init(&r->srv_resend_queue);[m
[31m-    ngx_queue_init(&r->addr_resend_queue);[m
[31m-[m
[31m-    ngx_queue_init(&r->name_expire_queue);[m
[31m-    ngx_queue_init(&r->srv_expire_queue);[m
[31m-    ngx_queue_init(&r->addr_expire_queue);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    r->ipv6 = 1;[m
[31m-[m
[31m-    ngx_rbtree_init(&r->addr6_rbtree, &r->addr6_sentinel,[m
[31m-                    ngx_resolver_rbtree_insert_addr6_value);[m
[31m-[m
[31m-    ngx_queue_init(&r->addr6_resend_queue);[m
[31m-[m
[31m-    ngx_queue_init(&r->addr6_expire_queue);[m
[31m-#endif[m
[31m-[m
[31m-    r->event->handler = ngx_resolver_resend_handler;[m
[31m-    r->event->data = r;[m
[31m-    r->event->log = &cf->cycle->new_log;[m
[31m-    r->ident = -1;[m
[31m-[m
[31m-    r->resend_timeout = 5;[m
[31m-    r->tcp_timeout = 5;[m
[31m-    r->expire = 30;[m
[31m-    r->valid = 0;[m
[31m-[m
[31m-    r->log = &cf->cycle->new_log;[m
[31m-    r->log_level = NGX_LOG_ERR;[m
[31m-[m
[31m-    if (n) {[m
[31m-        if (ngx_array_init(&r->connections, cf->pool, n,[m
[31m-                           sizeof(ngx_resolver_connection_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        if (ngx_strncmp(names[i].data, "valid=", 6) == 0) {[m
[31m-            s.len = names[i].len - 6;[m
[31m-            s.data = names[i].data + 6;[m
[31m-[m
[31m-            r->valid = ngx_parse_time(&s, 1);[m
[31m-[m
[31m-            if (r->valid == (time_t) NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid parameter: %V", &names[i]);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (ngx_strncmp(names[i].data, "ipv6=", 5) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&names[i].data[5], "on") == 0) {[m
[31m-                r->ipv6 = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&names[i].data[5], "off") == 0) {[m
[31m-                r->ipv6 = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid parameter: %V", &names[i]);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-        u.url = names[i];[m
[31m-        u.default_port = 53;[m
[31m-[m
[31m-        if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-            if (u.err) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "%s in resolver \"%V\"",[m
[31m-                                   u.err, &u.url);[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        rec = ngx_array_push_n(&r->connections, u.naddrs);[m
[31m-        if (rec == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(rec, u.naddrs * sizeof(ngx_resolver_connection_t));[m
[31m-[m
[31m-        for (j = 0; j < u.naddrs; j++) {[m
[31m-            rec[j].sockaddr = u.addrs[j].sockaddr;[m
[31m-            rec[j].socklen = u.addrs[j].socklen;[m
[31m-            rec[j].server = u.addrs[j].name;[m
[31m-            rec[j].resolver = r;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_resolver_t  *r = data;[m
[31m-[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    if (r) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                       "cleanup resolver");[m
[31m-[m
[31m-        ngx_resolver_cleanup_tree(r, &r->name_rbtree);[m
[31m-[m
[31m-        ngx_resolver_cleanup_tree(r, &r->srv_rbtree);[m
[31m-[m
[31m-        ngx_resolver_cleanup_tree(r, &r->addr_rbtree);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        ngx_resolver_cleanup_tree(r, &r->addr6_rbtree);[m
[31m-#endif[m
[31m-[m
[31m-        if (r->event) {[m
[31m-            ngx_free(r->event);[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        rec = r->connections.elts;[m
[31m-[m
[31m-        for (i = 0; i < r->connections.nelts; i++) {[m
[31m-            if (rec[i].udp) {[m
[31m-                ngx_close_connection(rec[i].udp);[m
[31m-            }[m
[31m-[m
[31m-            if (rec[i].tcp) {[m
[31m-                ngx_close_connection(rec[i].tcp);[m
[31m-            }[m
[31m-[m
[31m-            if (rec[i].read_buf) {[m
[31m-                ngx_resolver_free(r, rec[i].read_buf->start);[m
[31m-                ngx_resolver_free(r, rec[i].read_buf);[m
[31m-            }[m
[31m-[m
[31m-            if (rec[i].write_buf) {[m
[31m-                ngx_resolver_free(r, rec[i].write_buf->start);[m
[31m-                ngx_resolver_free(r, rec[i].write_buf);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_free(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t   *ctx, *next;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    while (tree->root != tree->sentinel) {[m
[31m-[m
[31m-        rn = ngx_resolver_node(ngx_rbtree_min(tree->root, tree->sentinel));[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        for (ctx = rn->waiting; ctx; ctx = next) {[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            if (ctx->event) {[m
[31m-                ngx_resolver_free(r, ctx->event);[m
[31m-            }[m
[31m-[m
[31m-            ngx_resolver_free(r, ctx);[m
[31m-        }[m
[31m-[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_resolver_ctx_t *[m
[31m-ngx_resolve_start(ngx_resolver_t *r, ngx_resolver_ctx_t *temp)[m
[31m-{[m
[31m-    in_addr_t            addr;[m
[31m-    ngx_resolver_ctx_t  *ctx;[m
[31m-[m
[31m-    if (temp) {[m
[31m-        addr = ngx_inet_addr(temp->name.data, temp->name.len);[m
[31m-[m
[31m-        if (addr != INADDR_NONE) {[m
[31m-            temp->resolver = r;[m
[31m-            temp->state = NGX_OK;[m
[31m-            temp->naddrs = 1;[m
[31m-            temp->addrs = &temp->addr;[m
[31m-            temp->addr.sockaddr = (struct sockaddr *) &temp->sin;[m
[31m-            temp->addr.socklen = sizeof(struct sockaddr_in);[m
[31m-            ngx_memzero(&temp->sin, sizeof(struct sockaddr_in));[m
[31m-            temp->sin.sin_family = AF_INET;[m
[31m-            temp->sin.sin_addr.s_addr = addr;[m
[31m-            temp->quick = 1;[m
[31m-[m
[31m-            return temp;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->connections.nelts == 0) {[m
[31m-        return NGX_NO_RESOLVER;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_resolver_calloc(r, sizeof(ngx_resolver_ctx_t));[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        ctx->resolver = r;[m
[31m-    }[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_resolve_name(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t           slen;[m
[31m-    ngx_int_t        rc;[m
[31m-    ngx_str_t        name;[m
[31m-    ngx_resolver_t  *r;[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    if (ctx->name.len > 0 && ctx->name.data[ctx->name.len - 1] == '.') {[m
[31m-        ctx->name.len--;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve: \"%V\"", &ctx->name);[m
[31m-[m
[31m-    if (ctx->quick) {[m
[31m-        ctx->handler(ctx);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->service.len) {[m
[31m-        slen = ctx->service.len;[m
[31m-[m
[31m-        if (ngx_strlchr(ctx->service.data,[m
[31m-                        ctx->service.data + ctx->service.len, '.')[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            slen += sizeof("_._tcp") - 1;[m
[31m-        }[m
[31m-[m
[31m-        name.len = slen + 1 + ctx->name.len;[m
[31m-[m
[31m-        name.data = ngx_resolver_alloc(r, name.len);[m
[31m-        if (name.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (slen == ctx->service.len) {[m
[31m-            ngx_sprintf(name.data, "%V.%V", &ctx->service, &ctx->name);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_sprintf(name.data, "_%V._tcp.%V", &ctx->service, &ctx->name);[m
[31m-        }[m
[31m-[m
[31m-        /* lock name mutex */[m
[31m-[m
[31m-        rc = ngx_resolve_name_locked(r, ctx, &name);[m
[31m-[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    } else {[m
[31m-        /* lock name mutex */[m
[31m-[m
[31m-        rc = ngx_resolve_name_locked(r, ctx, &ctx->name);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* NGX_ERROR */[m
[31m-[m
[31m-    if (ctx->event) {[m
[31m-        ngx_resolver_free(r, ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_resolve_name_done(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_resolver_t       *r;[m
[31m-    ngx_resolver_ctx_t   *w, **p;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve name done: %i", ctx->state);[m
[31m-[m
[31m-    if (ctx->quick) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->event && ctx->event->timer_set) {[m
[31m-        ngx_del_timer(ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    /* lock name mutex */[m
[31m-[m
[31m-    if (ctx->nsrvs) {[m
[31m-        for (i = 0; i < ctx->nsrvs; i++) {[m
[31m-            if (ctx->srvs[i].ctx) {[m
[31m-                ngx_resolve_name_done(ctx->srvs[i].ctx);[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->srvs[i].addrs) {[m
[31m-                ngx_resolver_free(r, ctx->srvs[i].addrs->sockaddr);[m
[31m-                ngx_resolver_free(r, ctx->srvs[i].addrs);[m
[31m-            }[m
[31m-[m
[31m-            ngx_resolver_free(r, ctx->srvs[i].name.data);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free(r, ctx->srvs);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) {[m
[31m-[m
[31m-        rn = ctx->node;[m
[31m-[m
[31m-        if (rn) {[m
[31m-            p = &rn->waiting;[m
[31m-            w = rn->waiting;[m
[31m-[m
[31m-            while (w) {[m
[31m-                if (w == ctx) {[m
[31m-                    *p = w->next;[m
[31m-[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                p = &w->next;[m
[31m-                w = w->next;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->log, 0,[m
[31m-                          "could not cancel %V resolving", &ctx->name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (ctx->service.len) {[m
[31m-        ngx_resolver_expire(r, &r->srv_rbtree, &r->srv_expire_queue);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_resolver_expire(r, &r->name_rbtree, &r->name_expire_queue);[m
[31m-    }[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    if (ctx->event) {[m
[31m-        ngx_resolver_free_locked(r, ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free_locked(r, ctx);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-[m
[31m-    if (r->event->timer_set && ngx_resolver_resend_empty(r)) {[m
[31m-        ngx_del_timer(r->event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    uint32_t              hash;[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_str_t             cname;[m
[31m-    ngx_uint_t            i, naddrs;[m
[31m-    ngx_queue_t          *resend_queue, *expire_queue;[m
[31m-    ngx_rbtree_t         *tree;[m
[31m-    ngx_resolver_ctx_t   *next, *last;[m
[31m-    ngx_resolver_addr_t  *addrs;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    ngx_strlow(name->data, name->data, name->len);[m
[31m-[m
[31m-    hash = ngx_crc32_short(name->data, name->len);[m
[31m-[m
[31m-    if (ctx->service.len) {[m
[31m-        rn = ngx_resolver_lookup_srv(r, name, hash);[m
[31m-[m
[31m-        tree = &r->srv_rbtree;[m
[31m-        resend_queue = &r->srv_resend_queue;[m
[31m-        expire_queue = &r->srv_expire_queue;[m
[31m-[m
[31m-    } else {[m
[31m-        rn = ngx_resolver_lookup_name(r, name, hash);[m
[31m-[m
[31m-        tree = &r->name_rbtree;[m
[31m-        resend_queue = &r->name_resend_queue;[m
[31m-        expire_queue = &r->name_expire_queue;[m
[31m-    }[m
[31m-[m
[31m-    if (rn) {[m
[31m-[m
[31m-        /* ctx can be a list after NGX_RESOLVE_CNAME */[m
[31m-        for (last = ctx; last->next; last = last->next);[m
[31m-[m
[31m-        if (rn->valid >= ngx_time()) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");[m
[31m-[m
[31m-            ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-            rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-            ngx_queue_insert_head(expire_queue, &rn->queue);[m
[31m-[m
[31m-            naddrs = (rn->naddrs == (u_short) -1) ? 0 : rn->naddrs;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            naddrs += (rn->naddrs6 == (u_short) -1) ? 0 : rn->naddrs6;[m
[31m-#endif[m
[31m-[m
[31m-            if (naddrs) {[m
[31m-[m
[31m-                if (naddrs == 1 && rn->naddrs == 1) {[m
[31m-                    addrs = NULL;[m
[31m-[m
[31m-                } else {[m
[31m-                    addrs = ngx_resolver_export(r, rn, 1);[m
[31m-                    if (addrs == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                last->next = rn->waiting;[m
[31m-                rn->waiting = NULL;[m
[31m-[m
[31m-                /* unlock name mutex */[m
[31m-[m
[31m-                do {[m
[31m-                    ctx->state = NGX_OK;[m
[31m-                    ctx->valid = rn->valid;[m
[31m-                    ctx->naddrs = naddrs;[m
[31m-[m
[31m-                    if (addrs == NULL) {[m
[31m-                        ctx->addrs = &ctx->addr;[m
[31m-                        ctx->addr.sockaddr = (struct sockaddr *) &ctx->sin;[m
[31m-                        ctx->addr.socklen = sizeof(struct sockaddr_in);[m
[31m-                        ngx_memzero(&ctx->sin, sizeof(struct sockaddr_in));[m
[31m-                        ctx->sin.sin_family = AF_INET;[m
[31m-                        ctx->sin.sin_addr.s_addr = rn->u.addr;[m
[31m-[m
[31m-                    } else {[m
[31m-                        ctx->addrs = addrs;[m
[31m-                    }[m
[31m-[m
[31m-                    next = ctx->next;[m
[31m-[m
[31m-                    ctx->handler(ctx);[m
[31m-[m
[31m-                    ctx = next;[m
[31m-                } while (ctx);[m
[31m-[m
[31m-                if (addrs != NULL) {[m
[31m-                    ngx_resolver_free(r, addrs->sockaddr);[m
[31m-                    ngx_resolver_free(r, addrs);[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (rn->nsrvs) {[m
[31m-                last->next = rn->waiting;[m
[31m-                rn->waiting = NULL;[m
[31m-[m
[31m-                /* unlock name mutex */[m
[31m-[m
[31m-                do {[m
[31m-                    next = ctx->next;[m
[31m-[m
[31m-                    ngx_resolver_resolve_srv_names(ctx, rn);[m
[31m-[m
[31m-                    ctx = next;[m
[31m-                } while (ctx);[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            /* NGX_RESOLVE_CNAME */[m
[31m-[m
[31m-            if (ctx->recursion++ < NGX_RESOLVER_MAX_RECURSION) {[m
[31m-[m
[31m-                cname.len = rn->cnlen;[m
[31m-                cname.data = rn->u.cname;[m
[31m-[m
[31m-                return ngx_resolve_name_locked(r, ctx, &cname);[m
[31m-            }[m
[31m-[m
[31m-            last->next = rn->waiting;[m
[31m-            rn->waiting = NULL;[m
[31m-[m
[31m-            /* unlock name mutex */[m
[31m-[m
[31m-            do {[m
[31m-                ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-                ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-                next = ctx->next;[m
[31m-[m
[31m-                ctx->handler(ctx);[m
[31m-[m
[31m-                ctx = next;[m
[31m-            } while (ctx);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rn->waiting) {[m
[31m-[m
[31m-            if (ctx->event == NULL && ctx->timeout) {[m
[31m-                ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));[m
[31m-                if (ctx->event == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->event->handler = ngx_resolver_timeout_handler;[m
[31m-                ctx->event->data = ctx;[m
[31m-                ctx->event->log = r->log;[m
[31m-                ctx->ident = -1;[m
[31m-[m
[31m-                ngx_add_timer(ctx->event, ctx->timeout);[m
[31m-            }[m
[31m-[m
[31m-            last->next = rn->waiting;[m
[31m-            rn->waiting = ctx;[m
[31m-            ctx->state = NGX_AGAIN;[m
[31m-[m
[31m-            do {[m
[31m-                ctx->node = rn;[m
[31m-                ctx = ctx->next;[m
[31m-            } while (ctx);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        /* lock alloc mutex */[m
[31m-[m
[31m-        if (rn->query) {[m
[31m-            ngx_resolver_free_locked(r, rn->query);[m
[31m-            rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            rn->query6 = NULL;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (rn->cnlen) {[m
[31m-            ngx_resolver_free_locked(r, rn->u.cname);[m
[31m-        }[m
[31m-[m
[31m-        if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) {[m
[31m-            ngx_resolver_free_locked(r, rn->u.addrs);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (rn->naddrs6 > 1 && rn->naddrs6 != (u_short) -1) {[m
[31m-            ngx_resolver_free_locked(r, rn->u6.addrs6);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (rn->nsrvs) {[m
[31m-            for (i = 0; i < rn->nsrvs; i++) {[m
[31m-                if (rn->u.srvs[i].name.data) {[m
[31m-                    ngx_resolver_free_locked(r, rn->u.srvs[i].name.data);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_resolver_free_locked(r, rn->u.srvs);[m
[31m-        }[m
[31m-[m
[31m-        /* unlock alloc mutex */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));[m
[31m-        if (rn == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rn->name = ngx_resolver_dup(r, name->data, name->len);[m
[31m-        if (rn->name == NULL) {[m
[31m-            ngx_resolver_free(r, rn);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rn->node.key = hash;[m
[31m-        rn->nlen = (u_short) name->len;[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ngx_rbtree_insert(tree, &rn->node);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->service.len) {[m
[31m-        rc = ngx_resolver_create_srv_query(r, rn, name);[m
[31m-[m
[31m-    } else {[m
[31m-        rc = ngx_resolver_create_name_query(r, rn, name);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        ngx_resolver_free(r, rn->name);[m
[31m-        ngx_resolver_free(r, rn);[m
[31m-[m
[31m-        do {[m
[31m-            ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-[m
[31m-            ctx = next;[m
[31m-        } while (ctx);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rn->last_connection = r->last_connection++;[m
[31m-    if (r->last_connection == r->connections.nelts) {[m
[31m-        r->last_connection = 0;[m
[31m-    }[m
[31m-[m
[31m-    rn->naddrs = (u_short) -1;[m
[31m-    rn->tcp = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    rn->naddrs6 = r->ipv6 ? (u_short) -1 : 0;[m
[31m-    rn->tcp6 = 0;[m
[31m-#endif[m
[31m-    rn->nsrvs = 0;[m
[31m-[m
[31m-    if (ngx_resolver_send_query(r, rn) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->event == NULL && ctx->timeout) {[m
[31m-        ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));[m
[31m-        if (ctx->event == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ctx->event->handler = ngx_resolver_timeout_handler;[m
[31m-        ctx->event->data = ctx;[m
[31m-        ctx->event->log = r->log;[m
[31m-        ctx->ident = -1;[m
[31m-[m
[31m-        ngx_add_timer(ctx->event, ctx->timeout);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_queue_empty(resend_queue)) {[m
[31m-        ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));[m
[31m-    }[m
[31m-[m
[31m-    rn->expire = ngx_time() + r->resend_timeout;[m
[31m-[m
[31m-    ngx_queue_insert_head(resend_queue, &rn->queue);[m
[31m-[m
[31m-    rn->code = 0;[m
[31m-    rn->cnlen = 0;[m
[31m-    rn->valid = 0;[m
[31m-    rn->ttl = NGX_MAX_UINT32_VALUE;[m
[31m-    rn->waiting = ctx;[m
[31m-[m
[31m-    ctx->state = NGX_AGAIN;[m
[31m-[m
[31m-    do {[m
[31m-        ctx->node = rn;[m
[31m-        ctx = ctx->next;[m
[31m-    } while (ctx);[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-    if (rn->query) {[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, rn->name);[m
[31m-[m
[31m-    ngx_resolver_free(r, rn);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_resolve_addr(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char               *name;[m
[31m-    in_addr_t             addr;[m
[31m-    ngx_queue_t          *resend_queue, *expire_queue;[m
[31m-    ngx_rbtree_t         *tree;[m
[31m-    ngx_resolver_t       *r;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    uint32_t              hash;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    addr = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    hash = 0;[m
[31m-    sin6 = NULL;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    switch (ctx->addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) ctx->addr.sockaddr;[m
[31m-        hash = ngx_crc32_short(sin6->sin6_addr.s6_addr, 16);[m
[31m-[m
[31m-        /* lock addr mutex */[m
[31m-[m
[31m-        rn = ngx_resolver_lookup_addr6(r, &sin6->sin6_addr, hash);[m
[31m-[m
[31m-        tree = &r->addr6_rbtree;[m
[31m-        resend_queue = &r->addr6_resend_queue;[m
[31m-        expire_queue = &r->addr6_expire_queue;[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) ctx->addr.sockaddr;[m
[31m-        addr = ntohl(sin->sin_addr.s_addr);[m
[31m-[m
[31m-        /* lock addr mutex */[m
[31m-[m
[31m-        rn = ngx_resolver_lookup_addr(r, addr);[m
[31m-[m
[31m-        tree = &r->addr_rbtree;[m
[31m-        resend_queue = &r->addr_resend_queue;[m
[31m-        expire_queue = &r->addr_expire_queue;[m
[31m-    }[m
[31m-[m
[31m-    if (rn) {[m
[31m-[m
[31m-        if (rn->valid >= ngx_time()) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached");[m
[31m-[m
[31m-            ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-            rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-            ngx_queue_insert_head(expire_queue, &rn->queue);[m
[31m-[m
[31m-            name = ngx_resolver_dup(r, rn->name, rn->nlen);[m
[31m-            if (name == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ctx->name.len = rn->nlen;[m
[31m-            ctx->name.data = name;[m
[31m-[m
[31m-            /* unlock addr mutex */[m
[31m-[m
[31m-            ctx->state = NGX_OK;[m
[31m-            ctx->valid = rn->valid;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-[m
[31m-            ngx_resolver_free(r, name);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rn->waiting) {[m
[31m-[m
[31m-            if (ctx->event == NULL && ctx->timeout) {[m
[31m-                ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));[m
[31m-                if (ctx->event == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->event->handler = ngx_resolver_timeout_handler;[m
[31m-                ctx->event->data = ctx;[m
[31m-                ctx->event->log = r->log;[m
[31m-                ctx->ident = -1;[m
[31m-[m
[31m-                ngx_add_timer(ctx->event, ctx->timeout);[m
[31m-            }[m
[31m-[m
[31m-            ctx->next = rn->waiting;[m
[31m-            rn->waiting = ctx;[m
[31m-            ctx->state = NGX_AGAIN;[m
[31m-            ctx->node = rn;[m
[31m-[m
[31m-            /* unlock addr mutex */[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));[m
[31m-        if (rn == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        switch (ctx->addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            rn->addr6 = sin6->sin6_addr;[m
[31m-            rn->node.key = hash;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            rn->node.key = addr;[m
[31m-        }[m
[31m-[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ngx_rbtree_insert(tree, &rn->node);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_resolver_create_addr_query(r, rn, &ctx->addr) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    rn->last_connection = r->last_connection++;[m
[31m-    if (r->last_connection == r->connections.nelts) {[m
[31m-        r->last_connection = 0;[m
[31m-    }[m
[31m-[m
[31m-    rn->naddrs = (u_short) -1;[m
[31m-    rn->tcp = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    rn->naddrs6 = (u_short) -1;[m
[31m-    rn->tcp6 = 0;[m
[31m-#endif[m
[31m-    rn->nsrvs = 0;[m
[31m-[m
[31m-    if (ngx_resolver_send_query(r, rn) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->event == NULL && ctx->timeout) {[m
[31m-        ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));[m
[31m-        if (ctx->event == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ctx->event->handler = ngx_resolver_timeout_handler;[m
[31m-        ctx->event->data = ctx;[m
[31m-        ctx->event->log = r->log;[m
[31m-        ctx->ident = -1;[m
[31m-[m
[31m-        ngx_add_timer(ctx->event, ctx->timeout);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_queue_empty(resend_queue)) {[m
[31m-        ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000));[m
[31m-    }[m
[31m-[m
[31m-    rn->expire = ngx_time() + r->resend_timeout;[m
[31m-[m
[31m-    ngx_queue_insert_head(resend_queue, &rn->queue);[m
[31m-[m
[31m-    rn->code = 0;[m
[31m-    rn->cnlen = 0;[m
[31m-    rn->name = NULL;[m
[31m-    rn->nlen = 0;[m
[31m-    rn->valid = 0;[m
[31m-    rn->ttl = NGX_MAX_UINT32_VALUE;[m
[31m-    rn->waiting = ctx;[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    ctx->state = NGX_AGAIN;[m
[31m-    ctx->node = rn;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (rn) {[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        if (rn->query) {[m
[31m-            ngx_resolver_free(r, rn->query);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free(r, rn);[m
[31m-    }[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    if (ctx->event) {[m
[31m-        ngx_resolver_free(r, ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_queue_t          *expire_queue;[m
[31m-    ngx_rbtree_t         *tree;[m
[31m-    ngx_resolver_t       *r;[m
[31m-    ngx_resolver_ctx_t   *w, **p;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    switch (ctx->addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        tree = &r->addr6_rbtree;[m
[31m-        expire_queue = &r->addr6_expire_queue;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        tree = &r->addr_rbtree;[m
[31m-        expire_queue = &r->addr_expire_queue;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve addr done: %i", ctx->state);[m
[31m-[m
[31m-    if (ctx->event && ctx->event->timer_set) {[m
[31m-        ngx_del_timer(ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    /* lock addr mutex */[m
[31m-[m
[31m-    if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) {[m
[31m-[m
[31m-        rn = ctx->node;[m
[31m-[m
[31m-        if (rn) {[m
[31m-            p = &rn->waiting;[m
[31m-            w = rn->waiting;[m
[31m-[m
[31m-            while (w) {[m
[31m-                if (w == ctx) {[m
[31m-                    *p = w->next;[m
[31m-[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                p = &w->next;[m
[31m-                w = w->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        {[m
[31m-            u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-            ngx_str_t  addrtext;[m
[31m-[m
[31m-            addrtext.data = text;[m
[31m-            addrtext.len = ngx_sock_ntop(ctx->addr.sockaddr, ctx->addr.socklen,[m
[31m-                                         text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->log, 0,[m
[31m-                          "could not cancel %V resolving", &addrtext);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_resolver_expire(r, tree, expire_queue);[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    if (ctx->event) {[m
[31m-        ngx_resolver_free_locked(r, ctx->event);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free_locked(r, ctx);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-[m
[31m-    if (r->event->timer_set && ngx_resolver_resend_empty(r)) {[m
[31m-        ngx_del_timer(r->event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)[m
[31m-{[m
[31m-    time_t                now;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_queue_t          *q;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver expire");[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    for (i = 0; i < 2; i++) {[m
[31m-        if (ngx_queue_empty(queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(queue);[m
[31m-[m
[31m-        rn = ngx_queue_data(q, ngx_resolver_node_t, queue);[m
[31m-[m
[31m-        if (now <= rn->expire) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                       "resolver expire \"%*s\"", (size_t) rn->nlen, rn->name);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_send_query(ngx_resolver_t *r, ngx_resolver_node_t *rn)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    rec = r->connections.elts;[m
[31m-    rec = &rec[rn->last_connection];[m
[31m-[m
[31m-    if (rec->log.handler == NULL) {[m
[31m-        rec->log = *r->log;[m
[31m-        rec->log.handler = ngx_resolver_log_error;[m
[31m-        rec->log.data = rec;[m
[31m-        rec->log.action = "resolving";[m
[31m-    }[m
[31m-[m
[31m-    if (rn->naddrs == (u_short) -1) {[m
[31m-        rc = rn->tcp ? ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen)[m
[31m-                     : ngx_resolver_send_udp_query(r, rec, rn->query, rn->qlen);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    if (rn->query6 && rn->naddrs6 == (u_short) -1) {[m
[31m-        rc = rn->tcp6[m
[31m-                    ? ngx_resolver_send_tcp_query(r, rec, rn->query6, rn->qlen)[m
[31m-                    : ngx_resolver_send_udp_query(r, rec, rn->query6, rn->qlen);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_send_udp_query(ngx_resolver_t *r, ngx_resolver_connection_t  *rec,[m
[31m-    u_char *query, u_short qlen)[m
[31m-{[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    if (rec->udp == NULL) {[m
[31m-        if (ngx_udp_connect(rec) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rec->udp->data = rec;[m
[31m-        rec->udp->read->handler = ngx_resolver_udp_read;[m
[31m-        rec->udp->read->resolver = 1;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_send(rec->udp, query, qlen);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != (size_t) qlen) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, &rec->log, 0, "send() incomplete");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_send_tcp_query(ngx_resolver_t *r, ngx_resolver_connection_t *rec,[m
[31m-    u_char *query, u_short qlen)[m
[31m-{[m
[31m-    ngx_buf_t  *b;[m
[31m-    ngx_int_t   rc;[m
[31m-[m
[31m-    rc = NGX_OK;[m
[31m-[m
[31m-    if (rec->tcp == NULL) {[m
[31m-        b = rec->read_buf;[m
[31m-[m
[31m-        if (b == NULL) {[m
[31m-            b = ngx_resolver_calloc(r, sizeof(ngx_buf_t));[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = ngx_resolver_alloc(r, NGX_RESOLVER_TCP_RSIZE);[m
[31m-            if (b->start == NULL) {[m
[31m-                ngx_resolver_free(r, b);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->end = b->start + NGX_RESOLVER_TCP_RSIZE;[m
[31m-[m
[31m-            rec->read_buf = b;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-[m
[31m-        b = rec->write_buf;[m
[31m-[m
[31m-        if (b == NULL) {[m
[31m-            b = ngx_resolver_calloc(r, sizeof(ngx_buf_t));[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = ngx_resolver_alloc(r, NGX_RESOLVER_TCP_WSIZE);[m
[31m-            if (b->start == NULL) {[m
[31m-                ngx_resolver_free(r, b);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->end = b->start + NGX_RESOLVER_TCP_WSIZE;[m
[31m-[m
[31m-            rec->write_buf = b;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-[m
[31m-        rc = ngx_tcp_connect(rec);[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rec->tcp->data = rec;[m
[31m-        rec->tcp->write->handler = ngx_resolver_tcp_write;[m
[31m-        rec->tcp->read->handler = ngx_resolver_tcp_read;[m
[31m-        rec->tcp->read->resolver = 1;[m
[31m-[m
[31m-        ngx_add_timer(rec->tcp->write, (ngx_msec_t) (r->tcp_timeout * 1000));[m
[31m-    }[m
[31m-[m
[31m-    b = rec->write_buf;[m
[31m-[m
[31m-    if (b->end - b->last <  2 + qlen) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, &rec->log, 0, "buffer overflow");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = (u_char) (qlen >> 8);[m
[31m-    *b->last++ = (u_char) qlen;[m
[31m-    b->last = ngx_cpymem(b->last, query, qlen);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        ngx_resolver_tcp_write(rec->tcp->write);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_resend_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    time_t           timer, atimer, stimer, ntimer;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    time_t           a6timer;[m
[31m-#endif[m
[31m-    ngx_resolver_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver resend handler");[m
[31m-[m
[31m-    /* lock name mutex */[m
[31m-[m
[31m-    ntimer = ngx_resolver_resend(r, &r->name_rbtree, &r->name_resend_queue);[m
[31m-[m
[31m-    stimer = ngx_resolver_resend(r, &r->srv_rbtree, &r->srv_resend_queue);[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    /* lock addr mutex */[m
[31m-[m
[31m-    atimer = ngx_resolver_resend(r, &r->addr_rbtree, &r->addr_resend_queue);[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    /* lock addr6 mutex */[m
[31m-[m
[31m-    a6timer = ngx_resolver_resend(r, &r->addr6_rbtree, &r->addr6_resend_queue);[m
[31m-[m
[31m-    /* unlock addr6 mutex */[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    timer = ntimer;[m
[31m-[m
[31m-    if (timer == 0) {[m
[31m-        timer = atimer;[m
[31m-[m
[31m-    } else if (atimer) {[m
[31m-        timer = ngx_min(timer, atimer);[m
[31m-    }[m
[31m-[m
[31m-    if (timer == 0) {[m
[31m-        timer = stimer;[m
[31m-[m
[31m-    } else if (stimer) {[m
[31m-        timer = ngx_min(timer, stimer);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    if (timer == 0) {[m
[31m-        timer = a6timer;[m
[31m-[m
[31m-    } else if (a6timer) {[m
[31m-        timer = ngx_min(timer, a6timer);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (timer) {[m
[31m-        ngx_add_timer(r->event, (ngx_msec_t) (timer * 1000));[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)[m
[31m-{[m
[31m-    time_t                now;[m
[31m-    ngx_queue_t          *q;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (ngx_queue_empty(queue)) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(queue);[m
[31m-[m
[31m-        rn = ngx_queue_data(q, ngx_resolver_node_t, queue);[m
[31m-[m
[31m-        if (now < rn->expire) {[m
[31m-            return rn->expire - now;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                       "resolver resend \"%*s\" %p",[m
[31m-                       (size_t) rn->nlen, rn->name, rn->waiting);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        if (rn->waiting) {[m
[31m-[m
[31m-            if (++rn->last_connection == r->connections.nelts) {[m
[31m-                rn->last_connection = 0;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_resolver_send_query(r, rn);[m
[31m-[m
[31m-            rn->expire = now + r->resend_timeout;[m
[31m-[m
[31m-            ngx_queue_insert_head(queue, q);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_resolver_resend_empty(ngx_resolver_t *r)[m
[31m-{[m
[31m-    return ngx_queue_empty(&r->name_resend_queue)[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-           && ngx_queue_empty(&r->addr6_resend_queue)[m
[31m-#endif[m
[31m-           && ngx_queue_empty(&r->addr_resend_queue);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_udp_read(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t                     n;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-    u_char                      buf[NGX_RESOLVER_UDP_SIZE];[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    rec = c->data;[m
[31m-[m
[31m-    do {[m
[31m-        n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE);[m
[31m-[m
[31m-        if (n < 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_process_response(rec->resolver, buf, n, 0);[m
[31m-[m
[31m-    } while (rev->ready);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_tcp_write(ngx_event_t *wev)[m
[31m-{[m
[31m-    off_t                       sent;[m
[31m-    ssize_t                     n;[m
[31m-    ngx_buf_t                  *b;[m
[31m-    ngx_resolver_t             *r;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    rec = c->data;[m
[31m-    b = rec->write_buf;[m
[31m-    r = rec->resolver;[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    sent = c->sent;[m
[31m-[m
[31m-    while (wev->ready && b->pos < b->last) {[m
[31m-        n = ngx_send(c, b->pos, b->last - b->pos);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        b->pos += n;[m
[31m-    }[m
[31m-[m
[31m-    if (b->pos != b->start) {[m
[31m-        b->last = ngx_movemem(b->start, b->pos, b->last - b->pos);[m
[31m-        b->pos = b->start;[m
[31m-    }[m
[31m-[m
[31m-    if (c->sent != sent) {[m
[31m-        ngx_add_timer(wev, (ngx_msec_t) (r->tcp_timeout * 1000));[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    rec->tcp = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_tcp_read(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      size;[m
[31m-    ssize_t                     n;[m
[31m-    u_short                     qlen;[m
[31m-    ngx_buf_t                  *b;[m
[31m-    ngx_resolver_t             *r;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    rec = c->data;[m
[31m-    b = rec->read_buf;[m
[31m-    r = rec->resolver;[m
[31m-[m
[31m-    while (rev->ready) {[m
[31m-        n = ngx_recv(c, b->last, b->end - b->last);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        b->last += n;[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            p = b->pos;[m
[31m-            size = b->last - p;[m
[31m-[m
[31m-            if (size < 2) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            qlen = (u_short) *p++ << 8;[m
[31m-            qlen += *p++;[m
[31m-[m
[31m-            if (size < (size_t) (2 + qlen)) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ngx_resolver_process_response(r, p, qlen, 1);[m
[31m-[m
[31m-            b->pos += 2 + qlen;[m
[31m-        }[m
[31m-[m
[31m-        if (b->pos != b->start) {[m
[31m-            b->last = ngx_movemem(b->start, b->pos, b->last - b->pos);[m
[31m-            b->pos = b->start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    rec->tcp = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t tcp)[m
[31m-{[m
[31m-    char                 *err;[m
[31m-    ngx_uint_t            i, times, ident, qident, flags, code, nqs, nan, trunc,[m
[31m-                          qtype, qclass;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t            qident6;[m
[31m-#endif[m
[31m-    ngx_queue_t          *q;[m
[31m-    ngx_resolver_qs_t    *qs;[m
[31m-    ngx_resolver_hdr_t   *response;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    if (n < sizeof(ngx_resolver_hdr_t)) {[m
[31m-        goto short_response;[m
[31m-    }[m
[31m-[m
[31m-    response = (ngx_resolver_hdr_t *) buf;[m
[31m-[m
[31m-    ident = (response->ident_hi << 8) + response->ident_lo;[m
[31m-    flags = (response->flags_hi << 8) + response->flags_lo;[m
[31m-    nqs = (response->nqs_hi << 8) + response->nqs_lo;[m
[31m-    nan = (response->nan_hi << 8) + response->nan_lo;[m
[31m-    trunc = flags & 0x0200;[m
[31m-[m
[31m-    ngx_log_debug6(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver DNS response %ui fl:%04Xi %ui/%ui/%ud/%ud",[m
[31m-                   ident, flags, nqs, nan,[m
[31m-                   (response->nns_hi << 8) + response->nns_lo,[m
[31m-                   (response->nar_hi << 8) + response->nar_lo);[m
[31m-[m
[31m-    /* response to a standard query */[m
[31m-    if ((flags & 0xf870) != 0x8000 || (trunc && tcp)) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "invalid %s DNS response %ui fl:%04Xi",[m
[31m-                      tcp ? "TCP" : "UDP", ident, flags);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    code = flags & 0xf;[m
[31m-[m
[31m-    if (code == NGX_RESOLVE_FORMERR) {[m
[31m-[m
[31m-        times = 0;[m
[31m-[m
[31m-        for (q = ngx_queue_head(&r->name_resend_queue);[m
[31m-             q != ngx_queue_sentinel(&r->name_resend_queue) && times++ < 100;[m
[31m-             q = ngx_queue_next(q))[m
[31m-        {[m
[31m-            rn = ngx_queue_data(q, ngx_resolver_node_t, queue);[m
[31m-            qident = (rn->query[0] << 8) + rn->query[1];[m
[31m-[m
[31m-            if (qident == ident) {[m
[31m-                goto dns_error_name;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            if (rn->query6) {[m
[31m-                qident6 = (rn->query6[0] << 8) + rn->query6[1];[m
[31m-[m
[31m-                if (qident6 == ident) {[m
[31m-                    goto dns_error_name;[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        goto dns_error;[m
[31m-    }[m
[31m-[m
[31m-    if (code > NGX_RESOLVE_REFUSED) {[m
[31m-        goto dns_error;[m
[31m-    }[m
[31m-[m
[31m-    if (nqs != 1) {[m
[31m-        err = "invalid number of questions in DNS response";[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    i = sizeof(ngx_resolver_hdr_t);[m
[31m-[m
[31m-    while (i < (ngx_uint_t) n) {[m
[31m-        if (buf[i] == '\0') {[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        i += 1 + buf[i];[m
[31m-    }[m
[31m-[m
[31m-    goto short_response;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (i++ == sizeof(ngx_resolver_hdr_t)) {[m
[31m-        err = "zero-length domain name in DNS response";[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (i + sizeof(ngx_resolver_qs_t) + nan * (2 + sizeof(ngx_resolver_an_t))[m
[31m-        > (ngx_uint_t) n)[m
[31m-    {[m
[31m-        goto short_response;[m
[31m-    }[m
[31m-[m
[31m-    qs = (ngx_resolver_qs_t *) &buf[i];[m
[31m-[m
[31m-    qtype = (qs->type_hi << 8) + qs->type_lo;[m
[31m-    qclass = (qs->class_hi << 8) + qs->class_lo;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver DNS response qt:%ui cl:%ui", qtype, qclass);[m
[31m-[m
[31m-    if (qclass != 1) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unknown query class %ui in DNS response", qclass);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    switch (qtype) {[m
[31m-[m
[31m-    case NGX_RESOLVE_A:[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case NGX_RESOLVE_AAAA:[m
[31m-#endif[m
[31m-[m
[31m-        ngx_resolver_process_a(r, buf, n, ident, code, qtype, nan, trunc,[m
[31m-                               i + sizeof(ngx_resolver_qs_t));[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_RESOLVE_SRV:[m
[31m-[m
[31m-        ngx_resolver_process_srv(r, buf, n, ident, code, nan, trunc,[m
[31m-                                 i + sizeof(ngx_resolver_qs_t));[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_RESOLVE_PTR:[m
[31m-[m
[31m-        ngx_resolver_process_ptr(r, buf, n, ident, code, nan);[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unknown query type %ui in DNS response", qtype);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-short_response:[m
[31m-[m
[31m-    err = "short DNS response";[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-dns_error_name:[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "DNS error (%ui: %s), query id:%ui, name:\"%*s\"",[m
[31m-                  code, ngx_resolver_strerror(code), ident,[m
[31m-                  (size_t) rn->nlen, rn->name);[m
[31m-    return;[m
[31m-[m
[31m-dns_error:[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "DNS error (%ui: %s), query id:%ui",[m
[31m-                  code, ngx_resolver_strerror(code), ident);[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype,[m
[31m-    ngx_uint_t nan, ngx_uint_t trunc, ngx_uint_t ans)[m
[31m-{[m
[31m-    char                       *err;[m
[31m-    u_char                     *cname;[m
[31m-    size_t                      len;[m
[31m-    int32_t                     ttl;[m
[31m-    uint32_t                    hash;[m
[31m-    in_addr_t                  *addr;[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_uint_t                  type, class, qident, naddrs, a, i, j, start;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct in6_addr            *addr6;[m
[31m-#endif[m
[31m-    ngx_resolver_an_t          *an;[m
[31m-    ngx_resolver_ctx_t         *ctx, *next;[m
[31m-    ngx_resolver_node_t        *rn;[m
[31m-    ngx_resolver_addr_t        *addrs;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    if (ngx_resolver_copy(r, &name, buf,[m
[31m-                          buf + sizeof(ngx_resolver_hdr_t), buf + n)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);[m
[31m-[m
[31m-    hash = ngx_crc32_short(name.data, name.len);[m
[31m-[m
[31m-    /* lock name mutex */[m
[31m-[m
[31m-    rn = ngx_resolver_lookup_name(r, &name, hash);[m
[31m-[m
[31m-    if (rn == NULL) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unexpected response for %V", &name);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    switch (qtype) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-        if (rn->query6 == NULL || rn->naddrs6 != (u_short) -1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected response for %V", &name);[m
[31m-            ngx_resolver_free(r, name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (trunc && rn->tcp6) {[m
[31m-            ngx_resolver_free(r, name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        qident = (rn->query6[0] << 8) + rn->query6[1];[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-        if (rn->query == NULL || rn->naddrs != (u_short) -1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected response for %V", &name);[m
[31m-            ngx_resolver_free(r, name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (trunc && rn->tcp) {[m
[31m-            ngx_resolver_free(r, name.data);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        qident = (rn->query[0] << 8) + rn->query[1];[m
[31m-    }[m
[31m-[m
[31m-    if (ident != qident) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "wrong ident %ui response for %V, expect %ui",[m
[31m-                      ident, &name, qident);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    if (trunc) {[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        if (rn->waiting == NULL) {[m
[31m-            ngx_rbtree_delete(&r->name_rbtree, &rn->node);[m
[31m-            ngx_resolver_free_node(r, rn);[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        rec = r->connections.elts;[m
[31m-        rec = &rec[rn->last_connection];[m
[31m-[m
[31m-        switch (qtype) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            rn->tcp6 = 1;[m
[31m-[m
[31m-            (void) ngx_resolver_send_tcp_query(r, rec, rn->query6, rn->qlen);[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-            rn->tcp = 1;[m
[31m-[m
[31m-            (void) ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen);[m
[31m-        }[m
[31m-[m
[31m-        rn->expire = ngx_time() + r->resend_timeout;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->name_resend_queue, &rn->queue);[m
[31m-[m
[31m-        goto next;[m
[31m-    }[m
[31m-[m
[31m-    if (code == 0 && rn->code) {[m
[31m-        code = rn->code;[m
[31m-    }[m
[31m-[m
[31m-    if (code == 0 && nan == 0) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        switch (qtype) {[m
[31m-[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            rn->naddrs6 = 0;[m
[31m-[m
[31m-            if (rn->naddrs == (u_short) -1) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (rn->naddrs) {[m
[31m-                goto export;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-            rn->naddrs = 0;[m
[31m-[m
[31m-            if (rn->naddrs6 == (u_short) -1) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (rn->naddrs6) {[m
[31m-                goto export;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        code = NGX_RESOLVE_NXDOMAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (code) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        switch (qtype) {[m
[31m-[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            rn->naddrs6 = 0;[m
[31m-[m
[31m-            if (rn->naddrs == (u_short) -1) {[m
[31m-                rn->code = (u_char) code;[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-            rn->naddrs = 0;[m
[31m-[m
[31m-            if (rn->naddrs6 == (u_short) -1) {[m
[31m-                rn->code = (u_char) code;[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        ngx_rbtree_delete(&r->name_rbtree, &rn->node);[m
[31m-[m
[31m-        /* unlock name mutex */[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            ctx->state = code;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    i = ans;[m
[31m-    naddrs = 0;[m
[31m-    cname = NULL;[m
[31m-[m
[31m-    for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-        start = i;[m
[31m-[m
[31m-        while (i < n) {[m
[31m-[m
[31m-            if (buf[i] & 0xc0) {[m
[31m-                i += 2;[m
[31m-                goto found;[m
[31m-            }[m
[31m-[m
[31m-            if (buf[i] == 0) {[m
[31m-                i++;[m
[31m-                goto test_length;[m
[31m-            }[m
[31m-[m
[31m-            i += 1 + buf[i];[m
[31m-        }[m
[31m-[m
[31m-        goto short_response;[m
[31m-[m
[31m-    test_length:[m
[31m-[m
[31m-        if (i - start < 2) {[m
[31m-            err = "invalid name in DNS response";[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        if (i + sizeof(ngx_resolver_an_t) >= n) {[m
[31m-            goto short_response;[m
[31m-        }[m
[31m-[m
[31m-        an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-        type = (an->type_hi << 8) + an->type_lo;[m
[31m-        class = (an->class_hi << 8) + an->class_lo;[m
[31m-        len = (an->len_hi << 8) + an->len_lo;[m
[31m-        ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)[m
[31m-            + (an->ttl[2] << 8) + (an->ttl[3]);[m
[31m-[m
[31m-        if (class != 1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR class %ui", class);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ttl < 0) {[m
[31m-            ttl = 0;[m
[31m-        }[m
[31m-[m
[31m-        rn->ttl = ngx_min(rn->ttl, (uint32_t) ttl);[m
[31m-[m
[31m-        i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-        switch (type) {[m
[31m-[m
[31m-        case NGX_RESOLVE_A:[m
[31m-[m
[31m-            if (qtype != NGX_RESOLVE_A) {[m
[31m-                err = "unexpected A record in DNS response";[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (len != 4) {[m
[31m-                err = "invalid A record in DNS response";[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (i + 4 > n) {[m
[31m-                goto short_response;[m
[31m-            }[m
[31m-[m
[31m-            naddrs++;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            if (qtype != NGX_RESOLVE_AAAA) {[m
[31m-                err = "unexpected AAAA record in DNS response";[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (len != 16) {[m
[31m-                err = "invalid AAAA record in DNS response";[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (i + 16 > n) {[m
[31m-                goto short_response;[m
[31m-            }[m
[31m-[m
[31m-            naddrs++;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        case NGX_RESOLVE_CNAME:[m
[31m-[m
[31m-            cname = &buf[i];[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_RESOLVE_DNAME:[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR type %ui", type);[m
[31m-        }[m
[31m-[m
[31m-        i += len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver naddrs:%ui cname:%p ttl:%uD",[m
[31m-                   naddrs, cname, rn->ttl);[m
[31m-[m
[31m-    if (naddrs) {[m
[31m-[m
[31m-        switch (qtype) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-            if (naddrs == 1) {[m
[31m-                addr6 = &rn->u6.addr6;[m
[31m-                rn->naddrs6 = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                addr6 = ngx_resolver_alloc(r, naddrs * sizeof(struct in6_addr));[m
[31m-                if (addr6 == NULL) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                rn->u6.addrs6 = addr6;[m
[31m-                rn->naddrs6 = (u_short) naddrs;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-            addr = NULL;[m
[31m-#endif[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-            if (naddrs == 1) {[m
[31m-                addr = &rn->u.addr;[m
[31m-                rn->naddrs = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                addr = ngx_resolver_alloc(r, naddrs * sizeof(in_addr_t));[m
[31m-                if (addr == NULL) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                rn->u.addrs = addr;[m
[31m-                rn->naddrs = (u_short) naddrs;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_SUPPRESS_WARN)[m
[31m-            addr6 = NULL;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        j = 0;[m
[31m-        i = ans;[m
[31m-[m
[31m-        for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-            for ( ;; ) {[m
[31m-[m
[31m-                if (buf[i] & 0xc0) {[m
[31m-                    i += 2;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (buf[i] == 0) {[m
[31m-                    i++;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                i += 1 + buf[i];[m
[31m-            }[m
[31m-[m
[31m-            an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-            type = (an->type_hi << 8) + an->type_lo;[m
[31m-            len = (an->len_hi << 8) + an->len_lo;[m
[31m-[m
[31m-            i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-            if (type == NGX_RESOLVE_A) {[m
[31m-[m
[31m-                addr[j] = htonl((buf[i] << 24) + (buf[i + 1] << 16)[m
[31m-                                + (buf[i + 2] << 8) + (buf[i + 3]));[m
[31m-[m
[31m-                if (++j == naddrs) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-                    if (rn->naddrs6 == (u_short) -1) {[m
[31m-                        goto next;[m
[31m-                    }[m
[31m-#endif[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            else if (type == NGX_RESOLVE_AAAA) {[m
[31m-[m
[31m-                ngx_memcpy(addr6[j].s6_addr, &buf[i], 16);[m
[31m-[m
[31m-                if (++j == naddrs) {[m
[31m-[m
[31m-                    if (rn->naddrs == (u_short) -1) {[m
[31m-                        goto next;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            i += len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (qtype) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case NGX_RESOLVE_AAAA:[m
[31m-[m
[31m-        if (rn->naddrs6 == (u_short) -1) {[m
[31m-            rn->naddrs6 = 0;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* NGX_RESOLVE_A */[m
[31m-[m
[31m-        if (rn->naddrs == (u_short) -1) {[m
[31m-            rn->naddrs = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rn->naddrs != (u_short) -1[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        && rn->naddrs6 != (u_short) -1[m
[31m-#endif[m
[31m-        && rn->naddrs[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-           + rn->naddrs6[m
[31m-#endif[m
[31m-           > 0)[m
[31m-    {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    export:[m
[31m-#endif[m
[31m-[m
[31m-        naddrs = rn->naddrs;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        naddrs += rn->naddrs6;[m
[31m-#endif[m
[31m-[m
[31m-        if (naddrs == 1 && rn->naddrs == 1) {[m
[31m-            addrs = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            addrs = ngx_resolver_export(r, rn, 0);[m
[31m-            if (addrs == NULL) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);[m
[31m-        rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);[m
[31m-[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        /* unlock name mutex */[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            ctx->state = NGX_OK;[m
[31m-            ctx->valid = rn->valid;[m
[31m-            ctx->naddrs = naddrs;[m
[31m-[m
[31m-            if (addrs == NULL) {[m
[31m-                ctx->addrs = &ctx->addr;[m
[31m-                ctx->addr.sockaddr = (struct sockaddr *) &ctx->sin;[m
[31m-                ctx->addr.socklen = sizeof(struct sockaddr_in);[m
[31m-                ngx_memzero(&ctx->sin, sizeof(struct sockaddr_in));[m
[31m-                ctx->sin.sin_family = AF_INET;[m
[31m-                ctx->sin.sin_addr.s_addr = rn->u.addr;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->addrs = addrs;[m
[31m-            }[m
[31m-[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-        }[m
[31m-[m
[31m-        if (addrs != NULL) {[m
[31m-            ngx_resolver_free(r, addrs->sockaddr);[m
[31m-            ngx_resolver_free(r, addrs);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (cname) {[m
[31m-[m
[31m-        /* CNAME only */[m
[31m-[m
[31m-        if (rn->naddrs == (u_short) -1[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            || rn->naddrs6 == (u_short) -1[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_resolver_copy(r, &name, buf, cname, buf + n) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                       "resolver cname:\"%V\"", &name);[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        rn->cnlen = (u_short) name.len;[m
[31m-        rn->u.cname = name.data;[m
[31m-[m
[31m-        rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);[m
[31m-        rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->name_expire_queue, &rn->queue);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ctx = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        if (ctx) {[m
[31m-[m
[31m-            if (ctx->recursion++ >= NGX_RESOLVER_MAX_RECURSION) {[m
[31m-[m
[31m-                /* unlock name mutex */[m
[31m-[m
[31m-                do {[m
[31m-                    ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-                    next = ctx->next;[m
[31m-[m
[31m-                    ctx->handler(ctx);[m
[31m-[m
[31m-                    ctx = next;[m
[31m-                } while (ctx);[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            for (next = ctx; next; next = next->next) {[m
[31m-                next->node = NULL;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_resolve_name_locked(r, ctx, &name);[m
[31m-        }[m
[31m-[m
[31m-        /* unlock name mutex */[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "no A or CNAME types in DNS response");[m
[31m-    return;[m
[31m-[m
[31m-short_response:[m
[31m-[m
[31m-    err = "short DNS response";[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-next:[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_process_srv(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan,[m
[31m-    ngx_uint_t trunc, ngx_uint_t ans)[m
[31m-{[m
[31m-    char                       *err;[m
[31m-    u_char                     *cname;[m
[31m-    size_t                      len;[m
[31m-    int32_t                     ttl;[m
[31m-    uint32_t                    hash;[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_uint_t                  type, qident, class, start, nsrvs, a, i, j;[m
[31m-    ngx_resolver_an_t          *an;[m
[31m-    ngx_resolver_ctx_t         *ctx, *next;[m
[31m-    ngx_resolver_srv_t         *srvs;[m
[31m-    ngx_resolver_node_t        *rn;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    if (ngx_resolver_copy(r, &name, buf,[m
[31m-                          buf + sizeof(ngx_resolver_hdr_t), buf + n)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);[m
[31m-[m
[31m-    hash = ngx_crc32_short(name.data, name.len);[m
[31m-[m
[31m-    rn = ngx_resolver_lookup_srv(r, &name, hash);[m
[31m-[m
[31m-    if (rn == NULL || rn->query == NULL) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unexpected response for %V", &name);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (trunc && rn->tcp) {[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    qident = (rn->query[0] << 8) + rn->query[1];[m
[31m-[m
[31m-    if (ident != qident) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "wrong ident %ui response for %V, expect %ui",[m
[31m-                      ident, &name, qident);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    if (trunc) {[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        if (rn->waiting == NULL) {[m
[31m-            ngx_rbtree_delete(&r->srv_rbtree, &rn->node);[m
[31m-            ngx_resolver_free_node(r, rn);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rec = r->connections.elts;[m
[31m-        rec = &rec[rn->last_connection];[m
[31m-[m
[31m-        rn->tcp = 1;[m
[31m-[m
[31m-        (void) ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen);[m
[31m-[m
[31m-        rn->expire = ngx_time() + r->resend_timeout;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->srv_resend_queue, &rn->queue);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (code == 0 && rn->code) {[m
[31m-        code = rn->code;[m
[31m-    }[m
[31m-[m
[31m-    if (code == 0 && nan == 0) {[m
[31m-        code = NGX_RESOLVE_NXDOMAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (code) {[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        ngx_rbtree_delete(&r->srv_rbtree, &rn->node);[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            ctx->state = code;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    i = ans;[m
[31m-    nsrvs = 0;[m
[31m-    cname = NULL;[m
[31m-[m
[31m-    for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-        start = i;[m
[31m-[m
[31m-        while (i < n) {[m
[31m-[m
[31m-            if (buf[i] & 0xc0) {[m
[31m-                i += 2;[m
[31m-                goto found;[m
[31m-            }[m
[31m-[m
[31m-            if (buf[i] == 0) {[m
[31m-                i++;[m
[31m-                goto test_length;[m
[31m-            }[m
[31m-[m
[31m-            i += 1 + buf[i];[m
[31m-        }[m
[31m-[m
[31m-        goto short_response;[m
[31m-[m
[31m-    test_length:[m
[31m-[m
[31m-        if (i - start < 2) {[m
[31m-            err = "invalid name DNS response";[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        if (i + sizeof(ngx_resolver_an_t) >= n) {[m
[31m-            goto short_response;[m
[31m-        }[m
[31m-[m
[31m-        an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-        type = (an->type_hi << 8) + an->type_lo;[m
[31m-        class = (an->class_hi << 8) + an->class_lo;[m
[31m-        len = (an->len_hi << 8) + an->len_lo;[m
[31m-        ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)[m
[31m-            + (an->ttl[2] << 8) + (an->ttl[3]);[m
[31m-[m
[31m-        if (class != 1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR class %ui", class);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ttl < 0) {[m
[31m-            ttl = 0;[m
[31m-        }[m
[31m-[m
[31m-        rn->ttl = ngx_min(rn->ttl, (uint32_t) ttl);[m
[31m-[m
[31m-        i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-        switch (type) {[m
[31m-[m
[31m-        case NGX_RESOLVE_SRV:[m
[31m-[m
[31m-            if (i + 6 > n) {[m
[31m-                goto short_response;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_resolver_copy(r, NULL, buf, &buf[i + 6], buf + n)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            nsrvs++;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_RESOLVE_CNAME:[m
[31m-[m
[31m-            cname = &buf[i];[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_RESOLVE_DNAME:[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR type %ui", type);[m
[31m-        }[m
[31m-[m
[31m-        i += len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolver nsrvs:%ui cname:%p ttl:%uD",[m
[31m-                   nsrvs, cname, rn->ttl);[m
[31m-[m
[31m-    if (nsrvs) {[m
[31m-[m
[31m-        srvs = ngx_resolver_calloc(r, nsrvs * sizeof(ngx_resolver_srv_t));[m
[31m-        if (srvs == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        rn->u.srvs = srvs;[m
[31m-        rn->nsrvs = (u_short) nsrvs;[m
[31m-[m
[31m-        j = 0;[m
[31m-        i = ans;[m
[31m-[m
[31m-        for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-            for ( ;; ) {[m
[31m-[m
[31m-                if (buf[i] & 0xc0) {[m
[31m-                    i += 2;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (buf[i] == 0) {[m
[31m-                    i++;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                i += 1 + buf[i];[m
[31m-            }[m
[31m-[m
[31m-            an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-            type = (an->type_hi << 8) + an->type_lo;[m
[31m-            len = (an->len_hi << 8) + an->len_lo;[m
[31m-[m
[31m-            i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-            if (type == NGX_RESOLVE_SRV) {[m
[31m-[m
[31m-                srvs[j].priority = (buf[i] << 8) + buf[i + 1];[m
[31m-                srvs[j].weight = (buf[i + 2] << 8) + buf[i + 3];[m
[31m-[m
[31m-                if (srvs[j].weight == 0) {[m
[31m-                    srvs[j].weight = 1;[m
[31m-                }[m
[31m-[m
[31m-                srvs[j].port = (buf[i + 4] << 8) + buf[i + 5];[m
[31m-[m
[31m-                if (ngx_resolver_copy(r, &srvs[j].name, buf, &buf[i + 6],[m
[31m-                                      buf + n)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                j++;[m
[31m-            }[m
[31m-[m
[31m-            i += len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_sort(srvs, nsrvs, sizeof(ngx_resolver_srv_t),[m
[31m-                 ngx_resolver_cmp_srvs);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);[m
[31m-        rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->srv_expire_queue, &rn->queue);[m
[31m-[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ngx_resolver_resolve_srv_names(ctx, rn);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rn->nsrvs = 0;[m
[31m-[m
[31m-    if (cname) {[m
[31m-[m
[31m-        /* CNAME only */[m
[31m-[m
[31m-        if (ngx_resolver_copy(r, &name, buf, cname, buf + n) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                       "resolver cname:\"%V\"", &name);[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        rn->cnlen = (u_short) name.len;[m
[31m-        rn->u.cname = name.data;[m
[31m-[m
[31m-        rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl);[m
[31m-        rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-        ngx_queue_insert_head(&r->srv_expire_queue, &rn->queue);[m
[31m-[m
[31m-        ngx_resolver_free(r, rn->query);[m
[31m-        rn->query = NULL;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        rn->query6 = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ctx = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        if (ctx) {[m
[31m-[m
[31m-            if (ctx->recursion++ >= NGX_RESOLVER_MAX_RECURSION) {[m
[31m-[m
[31m-                /* unlock name mutex */[m
[31m-[m
[31m-                do {[m
[31m-                    ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-                    next = ctx->next;[m
[31m-[m
[31m-                    ctx->handler(ctx);[m
[31m-[m
[31m-                    ctx = next;[m
[31m-                } while (ctx);[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            for (next = ctx; next; next = next->next) {[m
[31m-                next->node = NULL;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_resolve_name_locked(r, ctx, &name);[m
[31m-        }[m
[31m-[m
[31m-        /* unlock name mutex */[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, "no SRV type in DNS response");[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-short_response:[m
[31m-[m
[31m-    err = "short DNS response";[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    /* unlock name mutex */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx, ngx_resolver_node_t *rn)[m
[31m-{[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_resolver_t           *r;[m
[31m-    ngx_resolver_ctx_t       *cctx;[m
[31m-    ngx_resolver_srv_name_t  *srvs;[m
[31m-[m
[31m-    r = ctx->resolver;[m
[31m-[m
[31m-    ctx->node = NULL;[m
[31m-    ctx->state = NGX_OK;[m
[31m-    ctx->valid = rn->valid;[m
[31m-    ctx->count = rn->nsrvs;[m
[31m-[m
[31m-    srvs = ngx_resolver_calloc(r, rn->nsrvs * sizeof(ngx_resolver_srv_name_t));[m
[31m-    if (srvs == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ctx->srvs = srvs;[m
[31m-    ctx->nsrvs = rn->nsrvs;[m
[31m-[m
[31m-    for (i = 0; i < rn->nsrvs; i++) {[m
[31m-        srvs[i].name.data = ngx_resolver_alloc(r, rn->u.srvs[i].name.len);[m
[31m-        if (srvs[i].name.data == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        srvs[i].name.len = rn->u.srvs[i].name.len;[m
[31m-        ngx_memcpy(srvs[i].name.data, rn->u.srvs[i].name.data,[m
[31m-                   srvs[i].name.len);[m
[31m-[m
[31m-        cctx = ngx_resolve_start(r, NULL);[m
[31m-        if (cctx == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        cctx->name = srvs[i].name;[m
[31m-        cctx->handler = ngx_resolver_srv_names_handler;[m
[31m-        cctx->data = ctx;[m
[31m-        cctx->srvs = &srvs[i];[m
[31m-        cctx->timeout = 0;[m
[31m-[m
[31m-        srvs[i].priority = rn->u.srvs[i].priority;[m
[31m-        srvs[i].weight = rn->u.srvs[i].weight;[m
[31m-        srvs[i].port = rn->u.srvs[i].port;[m
[31m-        srvs[i].ctx = cctx;[m
[31m-[m
[31m-        if (ngx_resolve_name(cctx) == NGX_ERROR) {[m
[31m-            srvs[i].ctx = NULL;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ctx->state = NGX_ERROR;[m
[31m-    ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-    ctx->handler(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)[m
[31m-{[m
[31m-    ngx_uint_t                 i;[m
[31m-    u_char                   (*sockaddr)[NGX_SOCKADDRLEN];[m
[31m-    ngx_addr_t                *addrs;[m
[31m-    ngx_resolver_t            *r;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-    ngx_resolver_ctx_t        *ctx;[m
[31m-    ngx_resolver_srv_name_t   *srv;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    r = cctx->resolver;[m
[31m-    ctx = cctx->data;[m
[31m-    srv = cctx->srvs;[m
[31m-[m
[31m-    ctx->count--;[m
[31m-[m
[31m-    srv->ctx = NULL;[m
[31m-[m
[31m-    if (cctx->naddrs) {[m
[31m-[m
[31m-        ctx->valid = ngx_min(ctx->valid, cctx->valid);[m
[31m-[m
[31m-        addrs = ngx_resolver_calloc(r, cctx->naddrs * sizeof(ngx_addr_t));[m
[31m-        if (addrs == NULL) {[m
[31m-            ngx_resolve_name_done(cctx);[m
[31m-[m
[31m-            ctx->state = NGX_ERROR;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sockaddr = ngx_resolver_alloc(r, cctx->naddrs * NGX_SOCKADDRLEN);[m
[31m-        if (sockaddr == NULL) {[m
[31m-            ngx_resolver_free(r, addrs);[m
[31m-            ngx_resolve_name_done(cctx);[m
[31m-[m
[31m-            ctx->state = NGX_ERROR;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < cctx->naddrs; i++) {[m
[31m-            addrs[i].sockaddr = (struct sockaddr *) sockaddr[i];[m
[31m-            addrs[i].socklen = cctx->addrs[i].socklen;[m
[31m-[m
[31m-            ngx_memcpy(sockaddr[i], cctx->addrs[i].sockaddr,[m
[31m-                       addrs[i].socklen);[m
[31m-[m
[31m-            switch (addrs[i].sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                sin6 = (struct sockaddr_in6 *) addrs[i].sockaddr;[m
[31m-                sin6->sin6_port = htons(srv->port);[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                sin = (struct sockaddr_in *) addrs[i].sockaddr;[m
[31m-                sin->sin_port = htons(srv->port);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        srv->addrs = addrs;[m
[31m-        srv->naddrs = cctx->naddrs;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(cctx);[m
[31m-[m
[31m-    if (ctx->count == 0) {[m
[31m-        ngx_resolver_report_srv(r, ctx);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n,[m
[31m-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan)[m
[31m-{[m
[31m-    char                 *err;[m
[31m-    size_t                len;[m
[31m-    in_addr_t             addr;[m
[31m-    int32_t               ttl;[m
[31m-    ngx_int_t             octet;[m
[31m-    ngx_str_t             name;[m
[31m-    ngx_uint_t            mask, type, class, qident, a, i, start;[m
[31m-    ngx_queue_t          *expire_queue;[m
[31m-    ngx_rbtree_t         *tree;[m
[31m-    ngx_resolver_an_t    *an;[m
[31m-    ngx_resolver_ctx_t   *ctx, *next;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    uint32_t              hash;[m
[31m-    ngx_int_t             digit;[m
[31m-    struct in6_addr       addr6;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_resolver_copy(r, &name, buf,[m
[31m-                          buf + sizeof(ngx_resolver_hdr_t), buf + n)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name);[m
[31m-[m
[31m-    /* AF_INET */[m
[31m-[m
[31m-    addr = 0;[m
[31m-    i = sizeof(ngx_resolver_hdr_t);[m
[31m-[m
[31m-    for (mask = 0; mask < 32; mask += 8) {[m
[31m-        len = buf[i++];[m
[31m-[m
[31m-        octet = ngx_atoi(&buf[i], len);[m
[31m-        if (octet == NGX_ERROR || octet > 255) {[m
[31m-            goto invalid_in_addr_arpa;[m
[31m-        }[m
[31m-[m
[31m-        addr += octet << mask;[m
[31m-        i += len;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcasecmp(&buf[i], (u_char *) "\7in-addr\4arpa") == 0) {[m
[31m-        i += sizeof("\7in-addr\4arpa");[m
[31m-[m
[31m-        /* lock addr mutex */[m
[31m-[m
[31m-        rn = ngx_resolver_lookup_addr(r, addr);[m
[31m-[m
[31m-        tree = &r->addr_rbtree;[m
[31m-        expire_queue = &r->addr_expire_queue;[m
[31m-[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-invalid_in_addr_arpa:[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    i = sizeof(ngx_resolver_hdr_t);[m
[31m-[m
[31m-    for (octet = 15; octet >= 0; octet--) {[m
[31m-        if (buf[i++] != '\1') {[m
[31m-            goto invalid_ip6_arpa;[m
[31m-        }[m
[31m-[m
[31m-        digit = ngx_hextoi(&buf[i++], 1);[m
[31m-        if (digit == NGX_ERROR) {[m
[31m-            goto invalid_ip6_arpa;[m
[31m-        }[m
[31m-[m
[31m-        addr6.s6_addr[octet] = (u_char) digit;[m
[31m-[m
[31m-        if (buf[i++] != '\1') {[m
[31m-            goto invalid_ip6_arpa;[m
[31m-        }[m
[31m-[m
[31m-        digit = ngx_hextoi(&buf[i++], 1);[m
[31m-        if (digit == NGX_ERROR) {[m
[31m-            goto invalid_ip6_arpa;[m
[31m-        }[m
[31m-[m
[31m-        addr6.s6_addr[octet] += (u_char) (digit * 16);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcasecmp(&buf[i], (u_char *) "\3ip6\4arpa") == 0) {[m
[31m-        i += sizeof("\3ip6\4arpa");[m
[31m-[m
[31m-        /* lock addr mutex */[m
[31m-[m
[31m-        hash = ngx_crc32_short(addr6.s6_addr, 16);[m
[31m-        rn = ngx_resolver_lookup_addr6(r, &addr6, hash);[m
[31m-[m
[31m-        tree = &r->addr6_rbtree;[m
[31m-        expire_queue = &r->addr6_expire_queue;[m
[31m-[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-invalid_ip6_arpa:[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "invalid in-addr.arpa or ip6.arpa name in DNS response");[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-    return;[m
[31m-[m
[31m-valid:[m
[31m-[m
[31m-    if (rn == NULL || rn->query == NULL) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "unexpected response for %V", &name);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    qident = (rn->query[0] << 8) + rn->query[1];[m
[31m-[m
[31m-    if (ident != qident) {[m
[31m-        ngx_log_error(r->log_level, r->log, 0,[m
[31m-                      "wrong ident %ui response for %V, expect %ui",[m
[31m-                      ident, &name, qident);[m
[31m-        ngx_resolver_free(r, name.data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    if (code == 0 && nan == 0) {[m
[31m-        code = NGX_RESOLVE_NXDOMAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (code) {[m
[31m-        next = rn->waiting;[m
[31m-        rn->waiting = NULL;[m
[31m-[m
[31m-        ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-        ngx_rbtree_delete(tree, &rn->node);[m
[31m-[m
[31m-        /* unlock addr mutex */[m
[31m-[m
[31m-        while (next) {[m
[31m-            ctx = next;[m
[31m-            ctx->state = code;[m
[31m-            ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-            next = ctx->next;[m
[31m-[m
[31m-            ctx->handler(ctx);[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free_node(r, rn);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    i += sizeof(ngx_resolver_qs_t);[m
[31m-[m
[31m-    for (a = 0; a < nan; a++) {[m
[31m-[m
[31m-        start = i;[m
[31m-[m
[31m-        while (i < n) {[m
[31m-[m
[31m-            if (buf[i] & 0xc0) {[m
[31m-                i += 2;[m
[31m-                goto found;[m
[31m-            }[m
[31m-[m
[31m-            if (buf[i] == 0) {[m
[31m-                i++;[m
[31m-                goto test_length;[m
[31m-            }[m
[31m-[m
[31m-            i += 1 + buf[i];[m
[31m-        }[m
[31m-[m
[31m-        goto short_response;[m
[31m-[m
[31m-    test_length:[m
[31m-[m
[31m-        if (i - start < 2) {[m
[31m-            err = "invalid name in DNS response";[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        if (i + sizeof(ngx_resolver_an_t) >= n) {[m
[31m-            goto short_response;[m
[31m-        }[m
[31m-[m
[31m-        an = (ngx_resolver_an_t *) &buf[i];[m
[31m-[m
[31m-        type = (an->type_hi << 8) + an->type_lo;[m
[31m-        class = (an->class_hi << 8) + an->class_lo;[m
[31m-        len = (an->len_hi << 8) + an->len_lo;[m
[31m-        ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)[m
[31m-            + (an->ttl[2] << 8) + (an->ttl[3]);[m
[31m-[m
[31m-        if (class != 1) {[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR class %ui", class);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ttl < 0) {[m
[31m-            ttl = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                      "resolver qt:%ui cl:%ui len:%uz",[m
[31m-                      type, class, len);[m
[31m-[m
[31m-        i += sizeof(ngx_resolver_an_t);[m
[31m-[m
[31m-        switch (type) {[m
[31m-[m
[31m-        case NGX_RESOLVE_PTR:[m
[31m-[m
[31m-            goto ptr;[m
[31m-[m
[31m-        case NGX_RESOLVE_CNAME:[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            ngx_log_error(r->log_level, r->log, 0,[m
[31m-                          "unexpected RR type %ui", type);[m
[31m-        }[m
[31m-[m
[31m-        i += len;[m
[31m-    }[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0,[m
[31m-                  "no PTR type in DNS response");[m
[31m-    return;[m
[31m-[m
[31m-ptr:[m
[31m-[m
[31m-    if (ngx_resolver_copy(r, &name, buf, buf + i, buf + n) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver an:%V", &name);[m
[31m-[m
[31m-    if (name.len != (size_t) rn->nlen[m
[31m-        || ngx_strncmp(name.data, rn->name, name.len) != 0)[m
[31m-    {[m
[31m-        if (rn->nlen) {[m
[31m-            ngx_resolver_free(r, rn->name);[m
[31m-        }[m
[31m-[m
[31m-        rn->nlen = (u_short) name.len;[m
[31m-        rn->name = name.data;[m
[31m-[m
[31m-        name.data = ngx_resolver_dup(r, rn->name, name.len);[m
[31m-        if (name.data == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(&rn->queue);[m
[31m-[m
[31m-    rn->valid = ngx_time() + (r->valid ? r->valid : ttl);[m
[31m-    rn->expire = ngx_time() + r->expire;[m
[31m-[m
[31m-    ngx_queue_insert_head(expire_queue, &rn->queue);[m
[31m-[m
[31m-    next = rn->waiting;[m
[31m-    rn->waiting = NULL;[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    while (next) {[m
[31m-        ctx = next;[m
[31m-        ctx->state = NGX_OK;[m
[31m-        ctx->valid = rn->valid;[m
[31m-        ctx->name = name;[m
[31m-        next = ctx->next;[m
[31m-[m
[31m-        ctx->handler(ctx);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free(r, name.data);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-short_response:[m
[31m-[m
[31m-    err = "short DNS response";[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    /* unlock addr mutex */[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_resolver_node_t *[m
[31m-ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_rbtree_node_t    *node, *sentinel;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    node = r->name_rbtree.root;[m
[31m-    sentinel = r->name_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        rn = ngx_resolver_node(node);[m
[31m-[m
[31m-        rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return rn;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_resolver_node_t *[m
[31m-ngx_resolver_lookup_srv(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_rbtree_node_t    *node, *sentinel;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    node = r->srv_rbtree.root;[m
[31m-    sentinel = r->srv_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        rn = ngx_resolver_node(node);[m
[31m-[m
[31m-        rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return rn;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_resolver_node_t *[m
[31m-ngx_resolver_lookup_addr(ngx_resolver_t *r, in_addr_t addr)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  *node, *sentinel;[m
[31m-[m
[31m-    node = r->addr_rbtree.root;[m
[31m-    sentinel = r->addr_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (addr < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (addr > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* addr == node->key */[m
[31m-[m
[31m-        return ngx_resolver_node(node);[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_resolver_node_t *[m
[31m-ngx_resolver_lookup_addr6(ngx_resolver_t *r, struct in6_addr *addr,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_rbtree_node_t    *node, *sentinel;[m
[31m-    ngx_resolver_node_t  *rn;[m
[31m-[m
[31m-    node = r->addr6_rbtree.root;[m
[31m-    sentinel = r->addr6_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        rn = ngx_resolver_node(node);[m
[31m-[m
[31m-        rc = ngx_memcmp(addr, &rn->addr6, 16);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return rn;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t    **p;[m
[31m-    ngx_resolver_node_t   *rn, *rn_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            rn = ngx_resolver_node(node);[m
[31m-            rn_temp = ngx_resolver_node(temp);[m
[31m-[m
[31m-            p = (ngx_memn2cmp(rn->name, rn_temp->name, rn->nlen, rn_temp->nlen)[m
[31m-                 < 0) ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_rbtree_insert_addr6_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t    **p;[m
[31m-    ngx_resolver_node_t   *rn, *rn_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            rn = ngx_resolver_node(node);[m
[31m-            rn_temp = ngx_resolver_node(temp);[m
[31m-[m
[31m-            p = (ngx_memcmp(&rn->addr6, &rn_temp->addr6, 16)[m
[31m-                 < 0) ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    u_char              *p, *s;[m
[31m-    size_t               len, nlen;[m
[31m-    ngx_uint_t           ident;[m
[31m-    ngx_resolver_qs_t   *qs;[m
[31m-    ngx_resolver_hdr_t  *query;[m
[31m-[m
[31m-    nlen = name->len ? (1 + name->len + 1) : 1;[m
[31m-[m
[31m-    len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    p = ngx_resolver_alloc(r, r->ipv6 ? len * 2 : len);[m
[31m-#else[m
[31m-    p = ngx_resolver_alloc(r, len);[m
[31m-#endif[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rn->qlen = (u_short) len;[m
[31m-    rn->query = p;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (r->ipv6) {[m
[31m-        rn->query6 = p + len;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    query = (ngx_resolver_hdr_t *) p;[m
[31m-[m
[31m-    ident = ngx_random();[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve: \"%V\" A %i", name, ident & 0xffff);[m
[31m-[m
[31m-    query->ident_hi = (u_char) ((ident >> 8) & 0xff);[m
[31m-    query->ident_lo = (u_char) (ident & 0xff);[m
[31m-[m
[31m-    /* recursion query */[m
[31m-    query->flags_hi = 1; query->flags_lo = 0;[m
[31m-[m
[31m-    /* one question */[m
[31m-    query->nqs_hi = 0; query->nqs_lo = 1;[m
[31m-    query->nan_hi = 0; query->nan_lo = 0;[m
[31m-    query->nns_hi = 0; query->nns_lo = 0;[m
[31m-    query->nar_hi = 0; query->nar_lo = 0;[m
[31m-[m
[31m-    p += sizeof(ngx_resolver_hdr_t) + nlen;[m
[31m-[m
[31m-    qs = (ngx_resolver_qs_t *) p;[m
[31m-[m
[31m-    /* query type */[m
[31m-    qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_A;[m
[31m-[m
[31m-    /* IN query class */[m
[31m-    qs->class_hi = 0; qs->class_lo = 1;[m
[31m-[m
[31m-    /* convert "www.example.com" to "\3www\7example\3com\0" */[m
[31m-[m
[31m-    len = 0;[m
[31m-    p--;[m
[31m-    *p-- = '\0';[m
[31m-[m
[31m-    if (name->len == 0)  {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    for (s = name->data + name->len - 1; s >= name->data; s--) {[m
[31m-        if (*s != '.') {[m
[31m-            *p = *s;[m
[31m-            len++;[m
[31m-[m
[31m-        } else {[m
[31m-            if (len == 0 || len > 255) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            *p = (u_char) len;[m
[31m-            len = 0;[m
[31m-        }[m
[31m-[m
[31m-        p--;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 || len > 255) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    *p = (u_char) len;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (!r->ipv6) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = rn->query6;[m
[31m-[m
[31m-    ngx_memcpy(p, rn->query, rn->qlen);[m
[31m-[m
[31m-    query = (ngx_resolver_hdr_t *) p;[m
[31m-[m
[31m-    ident = ngx_random();[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve: \"%V\" AAAA %i", name, ident & 0xffff);[m
[31m-[m
[31m-    query->ident_hi = (u_char) ((ident >> 8) & 0xff);[m
[31m-    query->ident_lo = (u_char) (ident & 0xff);[m
[31m-[m
[31m-    p += sizeof(ngx_resolver_hdr_t) + nlen;[m
[31m-[m
[31m-    qs = (ngx_resolver_qs_t *) p;[m
[31m-[m
[31m-    qs->type_lo = NGX_RESOLVE_AAAA;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_create_srv_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    u_char              *p, *s;[m
[31m-    size_t               len, nlen;[m
[31m-    ngx_uint_t           ident;[m
[31m-    ngx_resolver_qs_t   *qs;[m
[31m-    ngx_resolver_hdr_t  *query;[m
[31m-[m
[31m-    nlen = name->len ? (1 + name->len + 1) : 1;[m
[31m-[m
[31m-    len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t);[m
[31m-[m
[31m-    p = ngx_resolver_alloc(r, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rn->qlen = (u_short) len;[m
[31m-    rn->query = p;[m
[31m-[m
[31m-    query = (ngx_resolver_hdr_t *) p;[m
[31m-[m
[31m-    ident = ngx_random();[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0,[m
[31m-                   "resolve: \"%V\" SRV %i", name, ident & 0xffff);[m
[31m-[m
[31m-    query->ident_hi = (u_char) ((ident >> 8) & 0xff);[m
[31m-    query->ident_lo = (u_char) (ident & 0xff);[m
[31m-[m
[31m-    /* recursion query */[m
[31m-    query->flags_hi = 1; query->flags_lo = 0;[m
[31m-[m
[31m-    /* one question */[m
[31m-    query->nqs_hi = 0; query->nqs_lo = 1;[m
[31m-    query->nan_hi = 0; query->nan_lo = 0;[m
[31m-    query->nns_hi = 0; query->nns_lo = 0;[m
[31m-    query->nar_hi = 0; query->nar_lo = 0;[m
[31m-[m
[31m-    p += sizeof(ngx_resolver_hdr_t) + nlen;[m
[31m-[m
[31m-    qs = (ngx_resolver_qs_t *) p;[m
[31m-[m
[31m-    /* query type */[m
[31m-    qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_SRV;[m
[31m-[m
[31m-    /* IN query class */[m
[31m-    qs->class_hi = 0; qs->class_lo = 1;[m
[31m-[m
[31m-    /* converts "www.example.com" to "\3www\7example\3com\0" */[m
[31m-[m
[31m-    len = 0;[m
[31m-    p--;[m
[31m-    *p-- = '\0';[m
[31m-[m
[31m-    if (name->len == 0)  {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    for (s = name->data + name->len - 1; s >= name->data; s--) {[m
[31m-        if (*s != '.') {[m
[31m-            *p = *s;[m
[31m-            len++;[m
[31m-[m
[31m-        } else {[m
[31m-            if (len == 0 || len > 255) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            *p = (u_char) len;[m
[31m-            len = 0;[m
[31m-        }[m
[31m-[m
[31m-        p--;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 || len > 255) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    *p = (u_char) len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_create_addr_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,[m
[31m-    ngx_resolver_addr_t *addr)[m
[31m-{[m
[31m-    u_char               *p, *d;[m
[31m-    size_t                len;[m
[31m-    in_addr_t             inaddr;[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_uint_t            ident;[m
[31m-    ngx_resolver_hdr_t   *query;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    switch (addr->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        len = sizeof(ngx_resolver_hdr_t)[m
[31m-              + 64 + sizeof(".ip6.arpa.") - 1[m
[31m-              + sizeof(ngx_resolver_qs_t);[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        len = sizeof(ngx_resolver_hdr_t)[m
[31m-              + sizeof(".255.255.255.255.in-addr.arpa.") - 1[m
[31m-              + sizeof(ngx_resolver_qs_t);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_resolver_alloc(r, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rn->query = p;[m
[31m-    query = (ngx_resolver_hdr_t *) p;[m
[31m-[m
[31m-    ident = ngx_random();[m
[31m-[m
[31m-    query->ident_hi = (u_char) ((ident >> 8) & 0xff);[m
[31m-    query->ident_lo = (u_char) (ident & 0xff);[m
[31m-[m
[31m-    /* recursion query */[m
[31m-    query->flags_hi = 1; query->flags_lo = 0;[m
[31m-[m
[31m-    /* one question */[m
[31m-    query->nqs_hi = 0; query->nqs_lo = 1;[m
[31m-    query->nan_hi = 0; query->nan_lo = 0;[m
[31m-    query->nns_hi = 0; query->nns_lo = 0;[m
[31m-    query->nar_hi = 0; query->nar_lo = 0;[m
[31m-[m
[31m-    p += sizeof(ngx_resolver_hdr_t);[m
[31m-[m
[31m-    switch (addr->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) addr->sockaddr;[m
[31m-[m
[31m-        for (n = 15; n >= 0; n--) {[m
[31m-            p = ngx_sprintf(p, "\1%xd\1%xd",[m
[31m-                            sin6->sin6_addr.s6_addr[n] & 0xf,[m
[31m-                            (sin6->sin6_addr.s6_addr[n] >> 4) & 0xf);[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, "\3ip6\4arpa\0", 10);[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-[m
[31m-        sin = (struct sockaddr_in *) addr->sockaddr;[m
[31m-        inaddr = ntohl(sin->sin_addr.s_addr);[m
[31m-[m
[31m-        for (n = 0; n < 32; n += 8) {[m
[31m-            d = ngx_sprintf(&p[1], "%ud", (inaddr >> n) & 0xff);[m
[31m-            *p = (u_char) (d - &p[1]);[m
[31m-            p = d;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14);[m
[31m-    }[m
[31m-[m
[31m-    /* query type "PTR", IN query class */[m
[31m-    p = ngx_cpymem(p, "\0\14\0\1", 4);[m
[31m-[m
[31m-    rn->qlen = (u_short) (p - rn->query);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, u_char *buf, u_char *src,[m
[31m-    u_char *last)[m
[31m-{[m
[31m-    char        *err;[m
[31m-    u_char      *p, *dst;[m
[31m-    ssize_t      len;[m
[31m-    ngx_uint_t   i, n;[m
[31m-[m
[31m-    p = src;[m
[31m-    len = -1;[m
[31m-[m
[31m-    /*[m
[31m-     * compression pointers allow to create endless loop, so we set limit;[m
[31m-     * 128 pointers should be enough to store 255-byte name[m
[31m-     */[m
[31m-[m
[31m-    for (i = 0; i < 128; i++) {[m
[31m-        n = *p++;[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (n & 0xc0) {[m
[31m-            n = ((n & 0x3f) << 8) + *p;[m
[31m-            p = &buf[n];[m
[31m-[m
[31m-        } else {[m
[31m-            len += 1 + n;[m
[31m-            p = &p[n];[m
[31m-        }[m
[31m-[m
[31m-        if (p >= last) {[m
[31m-            err = "name is out of response";[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    err = "compression pointers loop";[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_log_error(r->log_level, r->log, 0, err);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (len == -1) {[m
[31m-        ngx_str_null(name);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dst = ngx_resolver_alloc(r, len);[m
[31m-    if (dst == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->data = dst;[m
[31m-[m
[31m-    n = *src++;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (n & 0xc0) {[m
[31m-            n = ((n & 0x3f) << 8) + *src;[m
[31m-            src = &buf[n];[m
[31m-[m
[31m-            n = *src++;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_strlow(dst, src, n);[m
[31m-            dst += n;[m
[31m-            src += n;[m
[31m-[m
[31m-            n = *src++;[m
[31m-[m
[31m-            if (n != 0) {[m
[31m-                *dst++ = '.';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            name->len = dst - name->data;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_timeout_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ev->data;[m
[31m-[m
[31m-    ctx->state = NGX_RESOLVE_TIMEDOUT;[m
[31m-[m
[31m-    ctx->handler(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    if (rn->query) {[m
[31m-        ngx_resolver_free_locked(r, rn->query);[m
[31m-    }[m
[31m-[m
[31m-    if (rn->name) {[m
[31m-        ngx_resolver_free_locked(r, rn->name);[m
[31m-    }[m
[31m-[m
[31m-    if (rn->cnlen) {[m
[31m-        ngx_resolver_free_locked(r, rn->u.cname);[m
[31m-    }[m
[31m-[m
[31m-    if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) {[m
[31m-        ngx_resolver_free_locked(r, rn->u.addrs);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (rn->naddrs6 > 1 && rn->naddrs6 != (u_short) -1) {[m
[31m-        ngx_resolver_free_locked(r, rn->u6.addrs6);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (rn->nsrvs) {[m
[31m-        for (i = 0; i < rn->nsrvs; i++) {[m
[31m-            if (rn->u.srvs[i].name.data) {[m
[31m-                ngx_resolver_free_locked(r, rn->u.srvs[i].name.data);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolver_free_locked(r, rn->u.srvs);[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolver_free_locked(r, rn);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_resolver_alloc(ngx_resolver_t *r, size_t size)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    p = ngx_alloc(size, r->log);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_resolver_calloc(ngx_resolver_t *r, size_t size)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_resolver_alloc(r, size);[m
[31m-[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_free(ngx_resolver_t *r, void *p)[m
[31m-{[m
[31m-    /* lock alloc mutex */[m
[31m-[m
[31m-    ngx_free(p);[m
[31m-[m
[31m-    /* unlock alloc mutex */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_free_locked(ngx_resolver_t *r, void *p)[m
[31m-{[m
[31m-    ngx_free(p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size)[m
[31m-{[m
[31m-    void  *dst;[m
[31m-[m
[31m-    dst = ngx_resolver_alloc(r, size);[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(dst, src, size);[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_resolver_addr_t *[m
[31m-ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn,[m
[31m-    ngx_uint_t rotate)[m
[31m-{[m
[31m-    ngx_uint_t             d, i, j, n;[m
[31m-    u_char               (*sockaddr)[NGX_SOCKADDRLEN];[m
[31m-    in_addr_t             *addr;[m
[31m-    struct sockaddr_in    *sin;[m
[31m-    ngx_resolver_addr_t   *dst;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct in6_addr       *addr6;[m
[31m-    struct sockaddr_in6   *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    n = rn->naddrs;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    n += rn->naddrs6;[m
[31m-#endif[m
[31m-[m
[31m-    dst = ngx_resolver_calloc(r, n * sizeof(ngx_resolver_addr_t));[m
[31m-    if (dst == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    sockaddr = ngx_resolver_calloc(r, n * NGX_SOCKADDRLEN);[m
[31m-    if (sockaddr == NULL) {[m
[31m-        ngx_resolver_free(r, dst);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    i = 0;[m
[31m-    d = rotate ? ngx_random() % n : 0;[m
[31m-[m
[31m-    if (rn->naddrs) {[m
[31m-        j = rotate ? ngx_random() % rn->naddrs : 0;[m
[31m-[m
[31m-        addr = (rn->naddrs == 1) ? &rn->u.addr : rn->u.addrs;[m
[31m-[m
[31m-        do {[m
[31m-            sin = (struct sockaddr_in *) sockaddr[d];[m
[31m-            sin->sin_family = AF_INET;[m
[31m-            sin->sin_addr.s_addr = addr[j++];[m
[31m-            dst[d].sockaddr = (struct sockaddr *) sin;[m
[31m-            dst[d++].socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-            if (d == n) {[m
[31m-                d = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (j == rn->naddrs) {[m
[31m-                j = 0;[m
[31m-            }[m
[31m-        } while (++i < rn->naddrs);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (rn->naddrs6) {[m
[31m-        j = rotate ? ngx_random() % rn->naddrs6 : 0;[m
[31m-[m
[31m-        addr6 = (rn->naddrs6 == 1) ? &rn->u6.addr6 : rn->u6.addrs6;[m
[31m-[m
[31m-        do {[m
[31m-            sin6 = (struct sockaddr_in6 *) sockaddr[d];[m
[31m-            sin6->sin6_family = AF_INET6;[m
[31m-            ngx_memcpy(sin6->sin6_addr.s6_addr, addr6[j++].s6_addr, 16);[m
[31m-            dst[d].sockaddr = (struct sockaddr *) sin6;[m
[31m-            dst[d++].socklen = sizeof(struct sockaddr_in6);[m
[31m-[m
[31m-            if (d == n) {[m
[31m-                d = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (j == rn->naddrs6) {[m
[31m-                j = 0;[m
[31m-            }[m
[31m-        } while (++i < n);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t                naddrs, nsrvs, nw, i, j, k, l, m, n, w;[m
[31m-    ngx_resolver_addr_t      *addrs;[m
[31m-    ngx_resolver_srv_name_t  *srvs;[m
[31m-[m
[31m-    naddrs = 0;[m
[31m-[m
[31m-    for (i = 0; i < ctx->nsrvs; i++) {[m
[31m-        naddrs += ctx->srvs[i].naddrs;[m
[31m-    }[m
[31m-[m
[31m-    if (naddrs == 0) {[m
[31m-        ctx->state = NGX_RESOLVE_NXDOMAIN;[m
[31m-        ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-        ctx->handler(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    addrs = ngx_resolver_calloc(r, naddrs * sizeof(ngx_resolver_addr_t));[m
[31m-    if (addrs == NULL) {[m
[31m-        ctx->state = NGX_ERROR;[m
[31m-        ctx->valid = ngx_time() + (r->valid ? r->valid : 10);[m
[31m-[m
[31m-        ctx->handler(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    srvs = ctx->srvs;[m
[31m-    nsrvs = ctx->nsrvs;[m
[31m-[m
[31m-    i = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    do {[m
[31m-        nw = 0;[m
[31m-[m
[31m-        for (j = i; j < nsrvs; j++) {[m
[31m-            if (srvs[j].priority != srvs[i].priority) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            nw += srvs[j].naddrs * srvs[j].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (nw == 0) {[m
[31m-            goto next_srv;[m
[31m-        }[m
[31m-[m
[31m-        w = ngx_random() % nw;[m
[31m-[m
[31m-        for (k = i; k < j; k++) {[m
[31m-            if (w < srvs[k].naddrs * srvs[k].weight) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            w -= srvs[k].naddrs * srvs[k].weight;[m
[31m-        }[m
[31m-[m
[31m-        for (l = i; l < j; l++) {[m
[31m-[m
[31m-            for (m = 0; m < srvs[k].naddrs; m++) {[m
[31m-                addrs[n].socklen = srvs[k].addrs[m].socklen;[m
[31m-                addrs[n].sockaddr = srvs[k].addrs[m].sockaddr;[m
[31m-                addrs[n].name = srvs[k].name;[m
[31m-                addrs[n].priority = srvs[k].priority;[m
[31m-                addrs[n].weight = srvs[k].weight;[m
[31m-                n++;[m
[31m-            }[m
[31m-[m
[31m-            if (++k == j) {[m
[31m-                k = i;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-next_srv:[m
[31m-[m
[31m-        i = j;[m
[31m-[m
[31m-    } while (i < ctx->nsrvs);[m
[31m-[m
[31m-    ctx->state = NGX_OK;[m
[31m-    ctx->addrs = addrs;[m
[31m-    ctx->naddrs = naddrs;[m
[31m-[m
[31m-    ctx->handler(ctx);[m
[31m-[m
[31m-    ngx_resolver_free(r, addrs);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_resolver_strerror(ngx_int_t err)[m
[31m-{[m
[31m-    static char *errors[] = {[m
[31m-        "Format error",     /* FORMERR */[m
[31m-        "Server failure",   /* SERVFAIL */[m
[31m-        "Host not found",   /* NXDOMAIN */[m
[31m-        "Unimplemented",    /* NOTIMP */[m
[31m-        "Operation refused" /* REFUSED */[m
[31m-    };[m
[31m-[m
[31m-    if (err > 0 && err < 6) {[m
[31m-        return errors[err - 1];[m
[31m-    }[m
[31m-[m
[31m-    if (err == NGX_RESOLVE_TIMEDOUT) {[m
[31m-        return "Operation timed out";[m
[31m-    }[m
[31m-[m
[31m-    return "Unknown error";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    ngx_resolver_connection_t  *rec;[m
[31m-[m
[31m-    p = buf;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-    }[m
[31m-[m
[31m-    rec = log->data;[m
[31m-[m
[31m-    if (rec) {[m
[31m-        p = ngx_snprintf(p, len, ", resolver: %V", &rec->server);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_udp_connect(ngx_resolver_connection_t *rec)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    ngx_int_t          event;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    s = ngx_socket(rec->sockaddr->sa_family, SOCK_DGRAM, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "UDP socket %d", s);[m
[31m-[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(s, &rec->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n "failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = &rec->log;[m
[31m-    wev->log = &rec->log;[m
[31m-[m
[31m-    rec->udp = c;[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &rec->log, 0,[m
[31m-                   "connect to %V, fd:%d #%uA", &rec->server, s, c->number);[m
[31m-[m
[31m-    rc = connect(s, rec->sockaddr, rec->socklen);[m
[31m-[m
[31m-    /* TODO: iocp */[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, &rec->log, ngx_socket_errno,[m
[31m-                      "connect() failed");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /* UDP sockets are always ready to write */[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?[m
[31m-                /* kqueue, epoll */                 NGX_CLEAR_EVENT:[m
[31m-                /* select, poll, /dev/poll */       NGX_LEVEL_EVENT;[m
[31m-                /* eventport event type has no meaning: oneshot only */[m
[31m-[m
[31m-    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    rec->udp = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_tcp_connect(ngx_resolver_connection_t *rec)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    ngx_int_t          event;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_uint_t         level;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    s = ngx_socket(rec->sockaddr->sa_family, SOCK_STREAM, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "TCP socket %d", s);[m
[31m-[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(s, &rec->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n "failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = &rec->log;[m
[31m-    wev->log = &rec->log;[m
[31m-[m
[31m-    rec->tcp = c;[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &rec->log, 0,[m
[31m-                   "connect to %V, fd:%d #%uA", &rec->server, s, c->number);[m
[31m-[m
[31m-    rc = connect(s, rec->sockaddr, rec->socklen);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-[m
[31m-        if (err != NGX_EINPROGRESS[m
[31m-#if (NGX_WIN32)[m
[31m-            /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */[m
[31m-            && err != NGX_EAGAIN[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            if (err == NGX_ECONNREFUSED[m
[31m-#if (NGX_LINUX)[m
[31m-                /*[m
[31m-                 * Linux returns EAGAIN instead of ECONNREFUSED[m
[31m-                 * for unix sockets if listen queue is full[m
[31m-                 */[m
[31m-                || err == NGX_EAGAIN[m
[31m-#endif[m
[31m-                || err == NGX_ECONNRESET[m
[31m-                || err == NGX_ENETDOWN[m
[31m-                || err == NGX_ENETUNREACH[m
[31m-                || err == NGX_EHOSTDOWN[m
[31m-                || err == NGX_EHOSTUNREACH)[m
[31m-            {[m
[31m-                level = NGX_LOG_ERR;[m
[31m-[m
[31m-            } else {[m
[31m-                level = NGX_LOG_CRIT;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(level, c->log, err, "connect() to %V failed",[m
[31m-                          &rec->server);[m
[31m-[m
[31m-            ngx_close_connection(c);[m
[31m-            rec->tcp = NULL;[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        if (rc == -1) {[m
[31m-[m
[31m-            /* NGX_EINPROGRESS */[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "connected");[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, ngx_socket_errno,[m
[31m-                       "connect(): %d", rc);[m
[31m-[m
[31m-        if (ngx_blocking(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno,[m
[31m-                          ngx_blocking_n " failed");[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * FreeBSD's aio allows to post an operation on non-connected socket.[m
[31m-         * NT does not support it.[m
[31m-         *[m
[31m-         * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT[m
[31m-         */[m
[31m-[m
[31m-        rev->ready = 1;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue */[m
[31m-[m
[31m-        event = NGX_CLEAR_EVENT;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        event = NGX_LEVEL_EVENT;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-[m
[31m-        /* NGX_EINPROGRESS */[m
[31m-[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "connected");[m
[31m-[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    rec->tcp = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_resolver_cmp_srvs(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_int_t            p1, p2;[m
[31m-    ngx_resolver_srv_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_resolver_srv_t *) one;[m
[31m-    second = (ngx_resolver_srv_t *) two;[m
[31m-[m
[31m-    p1 = first->priority;[m
[31m-    p2 = second->priority;[m
[31m-[m
[31m-    return p1 - p2;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_resolver.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_resolver.h[m
[1mdeleted file mode 100644[m
[1mindex e36cfdc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_resolver.h[m
[1m+++ /dev/null[m
[36m@@ -1,237 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_RESOLVER_H_INCLUDED_[m
[31m-#define _NGX_RESOLVER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define NGX_RESOLVE_A         1[m
[31m-#define NGX_RESOLVE_CNAME     5[m
[31m-#define NGX_RESOLVE_PTR       12[m
[31m-#define NGX_RESOLVE_MX        15[m
[31m-#define NGX_RESOLVE_TXT       16[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-#define NGX_RESOLVE_AAAA      28[m
[31m-#endif[m
[31m-#define NGX_RESOLVE_SRV       33[m
[31m-#define NGX_RESOLVE_DNAME     39[m
[31m-[m
[31m-#define NGX_RESOLVE_FORMERR   1[m
[31m-#define NGX_RESOLVE_SERVFAIL  2[m
[31m-#define NGX_RESOLVE_NXDOMAIN  3[m
[31m-#define NGX_RESOLVE_NOTIMP    4[m
[31m-#define NGX_RESOLVE_REFUSED   5[m
[31m-#define NGX_RESOLVE_TIMEDOUT  NGX_ETIMEDOUT[m
[31m-[m
[31m-[m
[31m-#define NGX_NO_RESOLVER       (void *) -1[m
[31m-[m
[31m-#define NGX_RESOLVER_MAX_RECURSION    50[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_resolver_s  ngx_resolver_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_connection_t         *udp;[m
[31m-    ngx_connection_t         *tcp;[m
[31m-    struct sockaddr          *sockaddr;[m
[31m-    socklen_t                 socklen;[m
[31m-    ngx_str_t                 server;[m
[31m-    ngx_log_t                 log;[m
[31m-    ngx_buf_t                *read_buf;[m
[31m-    ngx_buf_t                *write_buf;[m
[31m-    ngx_resolver_t           *resolver;[m
[31m-} ngx_resolver_connection_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_resolver_ctx_s  ngx_resolver_ctx_t;[m
[31m-[m
[31m-typedef void (*ngx_resolver_handler_pt)(ngx_resolver_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct sockaddr          *sockaddr;[m
[31m-    socklen_t                 socklen;[m
[31m-    ngx_str_t                 name;[m
[31m-    u_short                   priority;[m
[31m-    u_short                   weight;[m
[31m-} ngx_resolver_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    u_short                   priority;[m
[31m-    u_short                   weight;[m
[31m-    u_short                   port;[m
[31m-} ngx_resolver_srv_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    u_short                   priority;[m
[31m-    u_short                   weight;[m
[31m-    u_short                   port;[m
[31m-[m
[31m-    ngx_resolver_ctx_t       *ctx;[m
[31m-[m
[31m-    ngx_uint_t                naddrs;[m
[31m-    ngx_addr_t               *addrs;[m
[31m-} ngx_resolver_srv_name_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_node_t         node;[m
[31m-    ngx_queue_t               queue;[m
[31m-[m
[31m-    /* PTR: resolved name, A: name to resolve */[m
[31m-    u_char                   *name;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    /* PTR: IPv6 address to resolve (IPv4 address is in rbtree node key) */[m
[31m-    struct in6_addr           addr6;[m
[31m-#endif[m
[31m-[m
[31m-    u_short                   nlen;[m
[31m-    u_short                   qlen;[m
[31m-[m
[31m-    u_char                   *query;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                   *query6;[m
[31m-#endif[m
[31m-[m
[31m-    union {[m
[31m-        in_addr_t             addr;[m
[31m-        in_addr_t            *addrs;[m
[31m-        u_char               *cname;[m
[31m-        ngx_resolver_srv_t   *srvs;[m
[31m-    } u;[m
[31m-[m
[31m-    u_char                    code;[m
[31m-    u_short                   naddrs;[m
[31m-    u_short                   nsrvs;[m
[31m-    u_short                   cnlen;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    union {[m
[31m-        struct in6_addr       addr6;[m
[31m-        struct in6_addr      *addrs6;[m
[31m-    } u6;[m
[31m-[m
[31m-    u_short                   naddrs6;[m
[31m-#endif[m
[31m-[m
[31m-    time_t                    expire;[m
[31m-    time_t                    valid;[m
[31m-    uint32_t                  ttl;[m
[31m-[m
[31m-    unsigned                  tcp:1;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    unsigned                  tcp6:1;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t                last_connection;[m
[31m-[m
[31m-    ngx_resolver_ctx_t       *waiting;[m
[31m-} ngx_resolver_node_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_resolver_s {[m
[31m-    /* has to be pointer because of "incomplete type" */[m
[31m-    ngx_event_t              *event;[m
[31m-    void                     *dummy;[m
[31m-    ngx_log_t                *log;[m
[31m-[m
[31m-    /* event ident must be after 3 pointers as in ngx_connection_t */[m
[31m-    ngx_int_t                 ident;[m
[31m-[m
[31m-    /* simple round robin DNS peers balancer */[m
[31m-    ngx_array_t               connections;[m
[31m-    ngx_uint_t                last_connection;[m
[31m-[m
[31m-    ngx_rbtree_t              name_rbtree;[m
[31m-    ngx_rbtree_node_t         name_sentinel;[m
[31m-[m
[31m-    ngx_rbtree_t              srv_rbtree;[m
[31m-    ngx_rbtree_node_t         srv_sentinel;[m
[31m-[m
[31m-    ngx_rbtree_t              addr_rbtree;[m
[31m-    ngx_rbtree_node_t         addr_sentinel;[m
[31m-[m
[31m-    ngx_queue_t               name_resend_queue;[m
[31m-    ngx_queue_t               srv_resend_queue;[m
[31m-    ngx_queue_t               addr_resend_queue;[m
[31m-[m
[31m-    ngx_queue_t               name_expire_queue;[m
[31m-    ngx_queue_t               srv_expire_queue;[m
[31m-    ngx_queue_t               addr_expire_queue;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t                ipv6;                 /* unsigned  ipv6:1; */[m
[31m-    ngx_rbtree_t              addr6_rbtree;[m
[31m-    ngx_rbtree_node_t         addr6_sentinel;[m
[31m-    ngx_queue_t               addr6_resend_queue;[m
[31m-    ngx_queue_t               addr6_expire_queue;[m
[31m-#endif[m
[31m-[m
[31m-    time_t                    resend_timeout;[m
[31m-    time_t                    tcp_timeout;[m
[31m-    time_t                    expire;[m
[31m-    time_t                    valid;[m
[31m-[m
[31m-    ngx_uint_t                log_level;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_resolver_ctx_s {[m
[31m-    ngx_resolver_ctx_t       *next;[m
[31m-    ngx_resolver_t           *resolver;[m
[31m-    ngx_resolver_node_t      *node;[m
[31m-[m
[31m-    /* event ident must be after 3 pointers as in ngx_connection_t */[m
[31m-    ngx_int_t                 ident;[m
[31m-[m
[31m-    ngx_int_t                 state;[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_str_t                 service;[m
[31m-[m
[31m-    time_t                    valid;[m
[31m-    ngx_uint_t                naddrs;[m
[31m-    ngx_resolver_addr_t      *addrs;[m
[31m-    ngx_resolver_addr_t       addr;[m
[31m-    struct sockaddr_in        sin;[m
[31m-[m
[31m-    ngx_uint_t                count;[m
[31m-    ngx_uint_t                nsrvs;[m
[31m-    ngx_resolver_srv_name_t  *srvs;[m
[31m-[m
[31m-    ngx_resolver_handler_pt   handler;[m
[31m-    void                     *data;[m
[31m-    ngx_msec_t                timeout;[m
[31m-[m
[31m-    ngx_uint_t                quick;  /* unsigned  quick:1; */[m
[31m-    ngx_uint_t                recursion;[m
[31m-    ngx_event_t              *event;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_resolver_t *ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names,[m
[31m-    ngx_uint_t n);[m
[31m-ngx_resolver_ctx_t *ngx_resolve_start(ngx_resolver_t *r,[m
[31m-    ngx_resolver_ctx_t *temp);[m
[31m-ngx_int_t ngx_resolve_name(ngx_resolver_ctx_t *ctx);[m
[31m-void ngx_resolve_name_done(ngx_resolver_ctx_t *ctx);[m
[31m-ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx);[m
[31m-void ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx);[m
[31m-char *ngx_resolver_strerror(ngx_int_t err);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_RESOLVER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rwlock.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rwlock.c[m
[1mdeleted file mode 100644[m
[1mindex 905de78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rwlock.c[m
[1m+++ /dev/null[m
[36m@@ -1,120 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-[m
[31m-#define NGX_RWLOCK_SPIN   2048[m
[31m-#define NGX_RWLOCK_WLOCK  ((ngx_atomic_uint_t) -1)[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rwlock_wlock(ngx_atomic_t *lock)[m
[31m-{[m
[31m-    ngx_uint_t  i, n;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ncpu > 1) {[m
[31m-[m
[31m-            for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) {[m
[31m-[m
[31m-                for (i = 0; i < n; i++) {[m
[31m-                    ngx_cpu_pause();[m
[31m-                }[m
[31m-[m
[31m-                if (*lock == 0[m
[31m-                    && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK))[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_sched_yield();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rwlock_rlock(ngx_atomic_t *lock)[m
[31m-{[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_atomic_uint_t  readers;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        readers = *lock;[m
[31m-[m
[31m-        if (readers != NGX_RWLOCK_WLOCK[m
[31m-            && ngx_atomic_cmp_set(lock, readers, readers + 1))[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ncpu > 1) {[m
[31m-[m
[31m-            for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) {[m
[31m-[m
[31m-                for (i = 0; i < n; i++) {[m
[31m-                    ngx_cpu_pause();[m
[31m-                }[m
[31m-[m
[31m-                readers = *lock;[m
[31m-[m
[31m-                if (readers != NGX_RWLOCK_WLOCK[m
[31m-                    && ngx_atomic_cmp_set(lock, readers, readers + 1))[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_sched_yield();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_rwlock_unlock(ngx_atomic_t *lock)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  readers;[m
[31m-[m
[31m-    readers = *lock;[m
[31m-[m
[31m-    if (readers == NGX_RWLOCK_WLOCK) {[m
[31m-        *lock = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_atomic_cmp_set(lock, readers, readers - 1)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        readers = *lock;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE || NGX_STREAM_UPSTREAM_ZONE)[m
[31m-[m
[31m-#error ngx_atomic_cmp_set() is not defined![m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rwlock.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rwlock.h[m
[1mdeleted file mode 100644[m
[1mindex 8b16eca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_rwlock.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_RWLOCK_H_INCLUDED_[m
[31m-#define _NGX_RWLOCK_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void ngx_rwlock_wlock(ngx_atomic_t *lock);[m
[31m-void ngx_rwlock_rlock(ngx_atomic_t *lock);[m
[31m-void ngx_rwlock_unlock(ngx_atomic_t *lock);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_RWLOCK_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_sha1.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_sha1.h[m
[1mdeleted file mode 100644[m
[1mindex 81c909e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_sha1.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SHA1_H_INCLUDED_[m
[31m-#define _NGX_SHA1_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENSSL_SHA1_H)[m
[31m-#include <openssl/sha.h>[m
[31m-#else[m
[31m-#include <sha.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef SHA_CTX  ngx_sha1_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_sha1_init    SHA1_Init[m
[31m-#define ngx_sha1_update  SHA1_Update[m
[31m-#define ngx_sha1_final   SHA1_Final[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SHA1_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_shmtx.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_shmtx.c[m
[1mdeleted file mode 100644[m
[1mindex a255903..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_shmtx.c[m
[1m+++ /dev/null[m
[36m@@ -1,310 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-[m
[31m-static void ngx_shmtx_wakeup(ngx_shmtx_t *mtx);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, u_char *name)[m
[31m-{[m
[31m-    mtx->lock = &addr->lock;[m
[31m-[m
[31m-    if (mtx->spin == (ngx_uint_t) -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    mtx->spin = 2048;[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-[m
[31m-    mtx->wait = &addr->wait;[m
[31m-[m
[31m-    if (sem_init(&mtx->sem, 1, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      "sem_init() failed");[m
[31m-    } else {[m
[31m-        mtx->semaphore = 1;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_destroy(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-[m
[31m-    if (mtx->semaphore) {[m
[31m-        if (sem_destroy(&mtx->sem) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                          "sem_destroy() failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_shmtx_trylock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_lock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    ngx_uint_t         i, n;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "shmtx lock");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ncpu > 1) {[m
[31m-[m
[31m-            for (n = 1; n < mtx->spin; n <<= 1) {[m
[31m-[m
[31m-                for (i = 0; i < n; i++) {[m
[31m-                    ngx_cpu_pause();[m
[31m-                }[m
[31m-[m
[31m-                if (*mtx->lock == 0[m
[31m-                    && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid))[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-[m
[31m-        if (mtx->semaphore) {[m
[31m-            (void) ngx_atomic_fetch_add(mtx->wait, 1);[m
[31m-[m
[31m-            if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)) {[m
[31m-                (void) ngx_atomic_fetch_add(mtx->wait, -1);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                           "shmtx wait %uA", *mtx->wait);[m
[31m-[m
[31m-            while (sem_wait(&mtx->sem) == -1) {[m
[31m-                ngx_err_t  err;[m
[31m-[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                if (err != NGX_EINTR) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,[m
[31m-                                  "sem_wait() failed while waiting on shmtx");[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                           "shmtx awoke");[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_sched_yield();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_unlock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    if (mtx->spin != (ngx_uint_t) -1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "shmtx unlock");[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_atomic_cmp_set(mtx->lock, ngx_pid, 0)) {[m
[31m-        ngx_shmtx_wakeup(mtx);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                   "shmtx forced unlock");[m
[31m-[m
[31m-    if (ngx_atomic_cmp_set(mtx->lock, pid, 0)) {[m
[31m-        ngx_shmtx_wakeup(mtx);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_shmtx_wakeup(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-    ngx_atomic_uint_t  wait;[m
[31m-[m
[31m-    if (!mtx->semaphore) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        wait = *mtx->wait;[m
[31m-[m
[31m-        if ((ngx_atomic_int_t) wait <= 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_atomic_cmp_set(mtx->wait, wait, wait - 1)) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                   "shmtx wake %uA", wait);[m
[31m-[m
[31m-    if (sem_post(&mtx->sem) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      "sem_post() failed while wake shmtx");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, u_char *name)[m
[31m-{[m
[31m-    if (mtx->name) {[m
[31m-[m
[31m-        if (ngx_strcmp(name, mtx->name) == 0) {[m
[31m-            mtx->name = name;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_destroy(mtx);[m
[31m-    }[m
[31m-[m
[31m-    mtx->fd = ngx_open_file(name, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN,[m
[31m-                            NGX_FILE_DEFAULT_ACCESS);[m
[31m-[m
[31m-    if (mtx->fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      ngx_delete_file_n " \"%s\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    mtx->name = name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_destroy(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    if (ngx_close_file(mtx->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", mtx->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_shmtx_trylock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = ngx_trylock_fd(mtx->fd);[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (err == NGX_EAGAIN) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#if __osf__ /* Tru64 UNIX */[m
[31m-[m
[31m-    if (err == NGX_EACCES) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_abort(err, ngx_trylock_fd_n " %s failed", mtx->name);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_lock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = ngx_lock_fd(mtx->fd);[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_abort(err, ngx_lock_fd_n " %s failed", mtx->name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shmtx_unlock(ngx_shmtx_t *mtx)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = ngx_unlock_fd(mtx->fd);[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_abort(err, ngx_unlock_fd_n " %s failed", mtx->name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid)[m
[31m-{[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_shmtx.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_shmtx.h[m
[1mdeleted file mode 100644[m
[1mindex 91e11be..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_shmtx.h[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SHMTX_H_INCLUDED_[m
[31m-#define _NGX_SHMTX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_atomic_t   lock;[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-    ngx_atomic_t   wait;[m
[31m-#endif[m
[31m-} ngx_shmtx_sh_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-    ngx_atomic_t  *lock;[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-    ngx_atomic_t  *wait;[m
[31m-    ngx_uint_t     semaphore;[m
[31m-    sem_t          sem;[m
[31m-#endif[m
[31m-#else[m
[31m-    ngx_fd_t       fd;[m
[31m-    u_char        *name;[m
[31m-#endif[m
[31m-    ngx_uint_t     spin;[m
[31m-} ngx_shmtx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr,[m
[31m-    u_char *name);[m
[31m-void ngx_shmtx_destroy(ngx_shmtx_t *mtx);[m
[31m-ngx_uint_t ngx_shmtx_trylock(ngx_shmtx_t *mtx);[m
[31m-void ngx_shmtx_lock(ngx_shmtx_t *mtx);[m
[31m-void ngx_shmtx_unlock(ngx_shmtx_t *mtx);[m
[31m-ngx_uint_t ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SHMTX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_slab.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_slab.c[m
[1mdeleted file mode 100644[m
[1mindex 56e7765..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_slab.c[m
[1m+++ /dev/null[m
[36m@@ -1,790 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_SLAB_PAGE_MASK   3[m
[31m-#define NGX_SLAB_PAGE        0[m
[31m-#define NGX_SLAB_BIG         1[m
[31m-#define NGX_SLAB_EXACT       2[m
[31m-#define NGX_SLAB_SMALL       3[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-[m
[31m-#define NGX_SLAB_PAGE_FREE   0[m
[31m-#define NGX_SLAB_PAGE_BUSY   0xffffffff[m
[31m-#define NGX_SLAB_PAGE_START  0x80000000[m
[31m-[m
[31m-#define NGX_SLAB_SHIFT_MASK  0x0000000f[m
[31m-#define NGX_SLAB_MAP_MASK    0xffff0000[m
[31m-#define NGX_SLAB_MAP_SHIFT   16[m
[31m-[m
[31m-#define NGX_SLAB_BUSY        0xffffffff[m
[31m-[m
[31m-#else /* (NGX_PTR_SIZE == 8) */[m
[31m-[m
[31m-#define NGX_SLAB_PAGE_FREE   0[m
[31m-#define NGX_SLAB_PAGE_BUSY   0xffffffffffffffff[m
[31m-#define NGX_SLAB_PAGE_START  0x8000000000000000[m
[31m-[m
[31m-#define NGX_SLAB_SHIFT_MASK  0x000000000000000f[m
[31m-#define NGX_SLAB_MAP_MASK    0xffffffff00000000[m
[31m-#define NGX_SLAB_MAP_SHIFT   32[m
[31m-[m
[31m-#define NGX_SLAB_BUSY        0xffffffffffffffff[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG_MALLOC)[m
[31m-[m
[31m-#define ngx_slab_junk(p, size)     ngx_memset(p, 0xA5, size)[m
[31m-[m
[31m-#elif (NGX_HAVE_DEBUG_MALLOC)[m
[31m-[m
[31m-#define ngx_slab_junk(p, size)                                                \[m
[31m-    if (ngx_debug_malloc)          ngx_memset(p, 0xA5, size)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_slab_junk(p, size)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-static ngx_slab_page_t *ngx_slab_alloc_pages(ngx_slab_pool_t *pool,[m
[31m-    ngx_uint_t pages);[m
[31m-static void ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page,[m
[31m-    ngx_uint_t pages);[m
[31m-static void ngx_slab_error(ngx_slab_pool_t *pool, ngx_uint_t level,[m
[31m-    char *text);[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t  ngx_slab_max_size;[m
[31m-static ngx_uint_t  ngx_slab_exact_size;[m
[31m-static ngx_uint_t  ngx_slab_exact_shift;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_slab_init(ngx_slab_pool_t *pool)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    size_t            size;[m
[31m-    ngx_int_t         m;[m
[31m-    ngx_uint_t        i, n, pages;[m
[31m-    ngx_slab_page_t  *slots;[m
[31m-[m
[31m-    /* STUB */[m
[31m-    if (ngx_slab_max_size == 0) {[m
[31m-        ngx_slab_max_size = ngx_pagesize / 2;[m
[31m-        ngx_slab_exact_size = ngx_pagesize / (8 * sizeof(uintptr_t));[m
[31m-        for (n = ngx_slab_exact_size; n >>= 1; ngx_slab_exact_shift++) {[m
[31m-            /* void */[m
[31m-        }[m
[31m-    }[m
[31m-    /**/[m
[31m-[m
[31m-    pool->min_size = 1 << pool->min_shift;[m
[31m-[m
[31m-    p = (u_char *) pool + sizeof(ngx_slab_pool_t);[m
[31m-    size = pool->end - p;[m
[31m-[m
[31m-    ngx_slab_junk(p, size);[m
[31m-[m
[31m-    slots = (ngx_slab_page_t *) p;[m
[31m-    n = ngx_pagesize_shift - pool->min_shift;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        slots[i].slab = 0;[m
[31m-        slots[i].next = &slots[i];[m
[31m-        slots[i].prev = 0;[m
[31m-    }[m
[31m-[m
[31m-    p += n * sizeof(ngx_slab_page_t);[m
[31m-[m
[31m-    pages = (ngx_uint_t) (size / (ngx_pagesize + sizeof(ngx_slab_page_t)));[m
[31m-[m
[31m-    ngx_memzero(p, pages * sizeof(ngx_slab_page_t));[m
[31m-[m
[31m-    pool->pages = (ngx_slab_page_t *) p;[m
[31m-[m
[31m-    pool->free.prev = 0;[m
[31m-    pool->free.next = (ngx_slab_page_t *) p;[m
[31m-[m
[31m-    pool->pages->slab = pages;[m
[31m-    pool->pages->next = &pool->free;[m
[31m-    pool->pages->prev = (uintptr_t) &pool->free;[m
[31m-[m
[31m-    pool->start = (u_char *)[m
[31m-                  ngx_align_ptr((uintptr_t) p + pages * sizeof(ngx_slab_page_t),[m
[31m-                                 ngx_pagesize);[m
[31m-[m
[31m-    m = pages - (pool->end - pool->start) / ngx_pagesize;[m
[31m-    if (m > 0) {[m
[31m-        pages -= m;[m
[31m-        pool->pages->slab = pages;[m
[31m-    }[m
[31m-[m
[31m-    pool->last = pool->pages + pages;[m
[31m-[m
[31m-    pool->log_nomem = 1;[m
[31m-    pool->log_ctx = &pool->zero;[m
[31m-    pool->zero = '\0';[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    ngx_shmtx_lock(&pool->mutex);[m
[31m-[m
[31m-    p = ngx_slab_alloc_locked(pool, size);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&pool->mutex);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    size_t            s;[m
[31m-    uintptr_t         p, n, m, mask, *bitmap;[m
[31m-    ngx_uint_t        i, slot, shift, map;[m
[31m-    ngx_slab_page_t  *page, *prev, *slots;[m
[31m-[m
[31m-    if (size > ngx_slab_max_size) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0,[m
[31m-                       "slab alloc: %uz", size);[m
[31m-[m
[31m-        page = ngx_slab_alloc_pages(pool, (size >> ngx_pagesize_shift)[m
[31m-                                          + ((size % ngx_pagesize) ? 1 : 0));[m
[31m-        if (page) {[m
[31m-            p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-            p += (uintptr_t) pool->start;[m
[31m-[m
[31m-        } else {[m
[31m-            p = 0;[m
[31m-        }[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (size > pool->min_size) {[m
[31m-        shift = 1;[m
[31m-        for (s = size - 1; s >>= 1; shift++) { /* void */ }[m
[31m-        slot = shift - pool->min_shift;[m
[31m-[m
[31m-    } else {[m
[31m-        size = pool->min_size;[m
[31m-        shift = pool->min_shift;[m
[31m-        slot = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0,[m
[31m-                   "slab alloc: %uz slot: %ui", size, slot);[m
[31m-[m
[31m-    slots = (ngx_slab_page_t *) ((u_char *) pool + sizeof(ngx_slab_pool_t));[m
[31m-    page = slots[slot].next;[m
[31m-[m
[31m-    if (page->next != page) {[m
[31m-[m
[31m-        if (shift < ngx_slab_exact_shift) {[m
[31m-[m
[31m-            do {[m
[31m-                p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-                bitmap = (uintptr_t *) (pool->start + p);[m
[31m-[m
[31m-                map = (1 << (ngx_pagesize_shift - shift))[m
[31m-                          / (sizeof(uintptr_t) * 8);[m
[31m-[m
[31m-                for (n = 0; n < map; n++) {[m
[31m-[m
[31m-                    if (bitmap[n] != NGX_SLAB_BUSY) {[m
[31m-[m
[31m-                        for (m = 1, i = 0; m; m <<= 1, i++) {[m
[31m-                            if ((bitmap[n] & m)) {[m
[31m-                                continue;[m
[31m-                            }[m
[31m-[m
[31m-                            bitmap[n] |= m;[m
[31m-[m
[31m-                            i = ((n * sizeof(uintptr_t) * 8) << shift)[m
[31m-                                + (i << shift);[m
[31m-[m
[31m-                            if (bitmap[n] == NGX_SLAB_BUSY) {[m
[31m-                                for (n = n + 1; n < map; n++) {[m
[31m-                                    if (bitmap[n] != NGX_SLAB_BUSY) {[m
[31m-                                        p = (uintptr_t) bitmap + i;[m
[31m-[m
[31m-                                        goto done;[m
[31m-                                    }[m
[31m-                                }[m
[31m-[m
[31m-                                prev = (ngx_slab_page_t *)[m
[31m-                                            (page->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                                prev->next = page->next;[m
[31m-                                page->next->prev = page->prev;[m
[31m-[m
[31m-                                page->next = NULL;[m
[31m-                                page->prev = NGX_SLAB_SMALL;[m
[31m-                            }[m
[31m-[m
[31m-                            p = (uintptr_t) bitmap + i;[m
[31m-[m
[31m-                            goto done;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                page = page->next;[m
[31m-[m
[31m-            } while (page);[m
[31m-[m
[31m-        } else if (shift == ngx_slab_exact_shift) {[m
[31m-[m
[31m-            do {[m
[31m-                if (page->slab != NGX_SLAB_BUSY) {[m
[31m-[m
[31m-                    for (m = 1, i = 0; m; m <<= 1, i++) {[m
[31m-                        if ((page->slab & m)) {[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                        page->slab |= m;[m
[31m-[m
[31m-                        if (page->slab == NGX_SLAB_BUSY) {[m
[31m-                            prev = (ngx_slab_page_t *)[m
[31m-                                            (page->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                            prev->next = page->next;[m
[31m-                            page->next->prev = page->prev;[m
[31m-[m
[31m-                            page->next = NULL;[m
[31m-                            page->prev = NGX_SLAB_EXACT;[m
[31m-                        }[m
[31m-[m
[31m-                        p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-                        p += i << shift;[m
[31m-                        p += (uintptr_t) pool->start;[m
[31m-[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                page = page->next;[m
[31m-[m
[31m-            } while (page);[m
[31m-[m
[31m-        } else { /* shift > ngx_slab_exact_shift */[m
[31m-[m
[31m-            n = ngx_pagesize_shift - (page->slab & NGX_SLAB_SHIFT_MASK);[m
[31m-            n = 1 << n;[m
[31m-            n = ((uintptr_t) 1 << n) - 1;[m
[31m-            mask = n << NGX_SLAB_MAP_SHIFT;[m
[31m-[m
[31m-            do {[m
[31m-                if ((page->slab & NGX_SLAB_MAP_MASK) != mask) {[m
[31m-[m
[31m-                    for (m = (uintptr_t) 1 << NGX_SLAB_MAP_SHIFT, i = 0;[m
[31m-                         m & mask;[m
[31m-                         m <<= 1, i++)[m
[31m-                    {[m
[31m-                        if ((page->slab & m)) {[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                        page->slab |= m;[m
[31m-[m
[31m-                        if ((page->slab & NGX_SLAB_MAP_MASK) == mask) {[m
[31m-                            prev = (ngx_slab_page_t *)[m
[31m-                                            (page->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                            prev->next = page->next;[m
[31m-                            page->next->prev = page->prev;[m
[31m-[m
[31m-                            page->next = NULL;[m
[31m-                            page->prev = NGX_SLAB_BIG;[m
[31m-                        }[m
[31m-[m
[31m-                        p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-                        p += i << shift;[m
[31m-                        p += (uintptr_t) pool->start;[m
[31m-[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                page = page->next;[m
[31m-[m
[31m-            } while (page);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    page = ngx_slab_alloc_pages(pool, 1);[m
[31m-[m
[31m-    if (page) {[m
[31m-        if (shift < ngx_slab_exact_shift) {[m
[31m-            p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-            bitmap = (uintptr_t *) (pool->start + p);[m
[31m-[m
[31m-            s = 1 << shift;[m
[31m-            n = (1 << (ngx_pagesize_shift - shift)) / 8 / s;[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                n = 1;[m
[31m-            }[m
[31m-[m
[31m-            bitmap[0] = (2 << n) - 1;[m
[31m-[m
[31m-            map = (1 << (ngx_pagesize_shift - shift)) / (sizeof(uintptr_t) * 8);[m
[31m-[m
[31m-            for (i = 1; i < map; i++) {[m
[31m-                bitmap[i] = 0;[m
[31m-            }[m
[31m-[m
[31m-            page->slab = shift;[m
[31m-            page->next = &slots[slot];[m
[31m-            page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_SMALL;[m
[31m-[m
[31m-            slots[slot].next = page;[m
[31m-[m
[31m-            p = ((page - pool->pages) << ngx_pagesize_shift) + s * n;[m
[31m-            p += (uintptr_t) pool->start;[m
[31m-[m
[31m-            goto done;[m
[31m-[m
[31m-        } else if (shift == ngx_slab_exact_shift) {[m
[31m-[m
[31m-            page->slab = 1;[m
[31m-            page->next = &slots[slot];[m
[31m-            page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_EXACT;[m
[31m-[m
[31m-            slots[slot].next = page;[m
[31m-[m
[31m-            p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-            p += (uintptr_t) pool->start;[m
[31m-[m
[31m-            goto done;[m
[31m-[m
[31m-        } else { /* shift > ngx_slab_exact_shift */[m
[31m-[m
[31m-            page->slab = ((uintptr_t) 1 << NGX_SLAB_MAP_SHIFT) | shift;[m
[31m-            page->next = &slots[slot];[m
[31m-            page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_BIG;[m
[31m-[m
[31m-            slots[slot].next = page;[m
[31m-[m
[31m-            p = (page - pool->pages) << ngx_pagesize_shift;[m
[31m-            p += (uintptr_t) pool->start;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = 0;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0,[m
[31m-                   "slab alloc: %p", (void *) p);[m
[31m-[m
[31m-    return (void *) p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    ngx_shmtx_lock(&pool->mutex);[m
[31m-[m
[31m-    p = ngx_slab_calloc_locked(pool, size);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&pool->mutex);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = ngx_slab_alloc_locked(pool, size);[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_slab_free(ngx_slab_pool_t *pool, void *p)[m
[31m-{[m
[31m-    ngx_shmtx_lock(&pool->mutex);[m
[31m-[m
[31m-    ngx_slab_free_locked(pool, p);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&pool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p)[m
[31m-{[m
[31m-    size_t            size;[m
[31m-    uintptr_t         slab, m, *bitmap;[m
[31m-    ngx_uint_t        n, type, slot, shift, map;[m
[31m-    ngx_slab_page_t  *slots, *page;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, "slab free: %p", p);[m
[31m-[m
[31m-    if ((u_char *) p < pool->start || (u_char *) p > pool->end) {[m
[31m-        ngx_slab_error(pool, NGX_LOG_ALERT, "ngx_slab_free(): outside of pool");[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    n = ((u_char *) p - pool->start) >> ngx_pagesize_shift;[m
[31m-    page = &pool->pages[n];[m
[31m-    slab = page->slab;[m
[31m-    type = page->prev & NGX_SLAB_PAGE_MASK;[m
[31m-[m
[31m-    switch (type) {[m
[31m-[m
[31m-    case NGX_SLAB_SMALL:[m
[31m-[m
[31m-        shift = slab & NGX_SLAB_SHIFT_MASK;[m
[31m-        size = 1 << shift;[m
[31m-[m
[31m-        if ((uintptr_t) p & (size - 1)) {[m
[31m-            goto wrong_chunk;[m
[31m-        }[m
[31m-[m
[31m-        n = ((uintptr_t) p & (ngx_pagesize - 1)) >> shift;[m
[31m-        m = (uintptr_t) 1 << (n & (sizeof(uintptr_t) * 8 - 1));[m
[31m-        n /= (sizeof(uintptr_t) * 8);[m
[31m-        bitmap = (uintptr_t *)[m
[31m-                             ((uintptr_t) p & ~((uintptr_t) ngx_pagesize - 1));[m
[31m-[m
[31m-        if (bitmap[n] & m) {[m
[31m-[m
[31m-            if (page->next == NULL) {[m
[31m-                slots = (ngx_slab_page_t *)[m
[31m-                                   ((u_char *) pool + sizeof(ngx_slab_pool_t));[m
[31m-                slot = shift - pool->min_shift;[m
[31m-[m
[31m-                page->next = slots[slot].next;[m
[31m-                slots[slot].next = page;[m
[31m-[m
[31m-                page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_SMALL;[m
[31m-                page->next->prev = (uintptr_t) page | NGX_SLAB_SMALL;[m
[31m-            }[m
[31m-[m
[31m-            bitmap[n] &= ~m;[m
[31m-[m
[31m-            n = (1 << (ngx_pagesize_shift - shift)) / 8 / (1 << shift);[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                n = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (bitmap[0] & ~(((uintptr_t) 1 << n) - 1)) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            map = (1 << (ngx_pagesize_shift - shift)) / (sizeof(uintptr_t) * 8);[m
[31m-[m
[31m-            for (n = 1; n < map; n++) {[m
[31m-                if (bitmap[n]) {[m
[31m-                    goto done;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_slab_free_pages(pool, page, 1);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        goto chunk_already_free;[m
[31m-[m
[31m-    case NGX_SLAB_EXACT:[m
[31m-[m
[31m-        m = (uintptr_t) 1 <<[m
[31m-                (((uintptr_t) p & (ngx_pagesize - 1)) >> ngx_slab_exact_shift);[m
[31m-        size = ngx_slab_exact_size;[m
[31m-[m
[31m-        if ((uintptr_t) p & (size - 1)) {[m
[31m-            goto wrong_chunk;[m
[31m-        }[m
[31m-[m
[31m-        if (slab & m) {[m
[31m-            if (slab == NGX_SLAB_BUSY) {[m
[31m-                slots = (ngx_slab_page_t *)[m
[31m-                                   ((u_char *) pool + sizeof(ngx_slab_pool_t));[m
[31m-                slot = ngx_slab_exact_shift - pool->min_shift;[m
[31m-[m
[31m-                page->next = slots[slot].next;[m
[31m-                slots[slot].next = page;[m
[31m-[m
[31m-                page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_EXACT;[m
[31m-                page->next->prev = (uintptr_t) page | NGX_SLAB_EXACT;[m
[31m-            }[m
[31m-[m
[31m-            page->slab &= ~m;[m
[31m-[m
[31m-            if (page->slab) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            ngx_slab_free_pages(pool, page, 1);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        goto chunk_already_free;[m
[31m-[m
[31m-    case NGX_SLAB_BIG:[m
[31m-[m
[31m-        shift = slab & NGX_SLAB_SHIFT_MASK;[m
[31m-        size = 1 << shift;[m
[31m-[m
[31m-        if ((uintptr_t) p & (size - 1)) {[m
[31m-            goto wrong_chunk;[m
[31m-        }[m
[31m-[m
[31m-        m = (uintptr_t) 1 << ((((uintptr_t) p & (ngx_pagesize - 1)) >> shift)[m
[31m-                              + NGX_SLAB_MAP_SHIFT);[m
[31m-[m
[31m-        if (slab & m) {[m
[31m-[m
[31m-            if (page->next == NULL) {[m
[31m-                slots = (ngx_slab_page_t *)[m
[31m-                                   ((u_char *) pool + sizeof(ngx_slab_pool_t));[m
[31m-                slot = shift - pool->min_shift;[m
[31m-[m
[31m-                page->next = slots[slot].next;[m
[31m-                slots[slot].next = page;[m
[31m-[m
[31m-                page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_BIG;[m
[31m-                page->next->prev = (uintptr_t) page | NGX_SLAB_BIG;[m
[31m-            }[m
[31m-[m
[31m-            page->slab &= ~m;[m
[31m-[m
[31m-            if (page->slab & NGX_SLAB_MAP_MASK) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            ngx_slab_free_pages(pool, page, 1);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        goto chunk_already_free;[m
[31m-[m
[31m-    case NGX_SLAB_PAGE:[m
[31m-[m
[31m-        if ((uintptr_t) p & (ngx_pagesize - 1)) {[m
[31m-            goto wrong_chunk;[m
[31m-        }[m
[31m-[m
[31m-        if (slab == NGX_SLAB_PAGE_FREE) {[m
[31m-            ngx_slab_error(pool, NGX_LOG_ALERT,[m
[31m-                           "ngx_slab_free(): page is already free");[m
[31m-            goto fail;[m
[31m-        }[m
[31m-[m
[31m-        if (slab == NGX_SLAB_PAGE_BUSY) {[m
[31m-            ngx_slab_error(pool, NGX_LOG_ALERT,[m
[31m-                           "ngx_slab_free(): pointer to wrong page");[m
[31m-            goto fail;[m
[31m-        }[m
[31m-[m
[31m-        n = ((u_char *) p - pool->start) >> ngx_pagesize_shift;[m
[31m-        size = slab & ~NGX_SLAB_PAGE_START;[m
[31m-[m
[31m-        ngx_slab_free_pages(pool, &pool->pages[n], size);[m
[31m-[m
[31m-        ngx_slab_junk(p, size << ngx_pagesize_shift);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* not reached */[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_slab_junk(p, size);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-wrong_chunk:[m
[31m-[m
[31m-    ngx_slab_error(pool, NGX_LOG_ALERT,[m
[31m-                   "ngx_slab_free(): pointer to wrong chunk");[m
[31m-[m
[31m-    goto fail;[m
[31m-[m
[31m-chunk_already_free:[m
[31m-[m
[31m-    ngx_slab_error(pool, NGX_LOG_ALERT,[m
[31m-                   "ngx_slab_free(): chunk is already free");[m
[31m-[m
[31m-fail:[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_slab_page_t *[m
[31m-ngx_slab_alloc_pages(ngx_slab_pool_t *pool, ngx_uint_t pages)[m
[31m-{[m
[31m-    ngx_slab_page_t  *page, *p;[m
[31m-[m
[31m-    for (page = pool->free.next; page != &pool->free; page = page->next) {[m
[31m-[m
[31m-        if (page->slab >= pages) {[m
[31m-[m
[31m-            if (page->slab > pages) {[m
[31m-                page[page->slab - 1].prev = (uintptr_t) &page[pages];[m
[31m-[m
[31m-                page[pages].slab = page->slab - pages;[m
[31m-                page[pages].next = page->next;[m
[31m-                page[pages].prev = page->prev;[m
[31m-[m
[31m-                p = (ngx_slab_page_t *) page->prev;[m
[31m-                p->next = &page[pages];[m
[31m-                page->next->prev = (uintptr_t) &page[pages];[m
[31m-[m
[31m-            } else {[m
[31m-                p = (ngx_slab_page_t *) page->prev;[m
[31m-                p->next = page->next;[m
[31m-                page->next->prev = page->prev;[m
[31m-            }[m
[31m-[m
[31m-            page->slab = pages | NGX_SLAB_PAGE_START;[m
[31m-            page->next = NULL;[m
[31m-            page->prev = NGX_SLAB_PAGE;[m
[31m-[m
[31m-            if (--pages == 0) {[m
[31m-                return page;[m
[31m-            }[m
[31m-[m
[31m-            for (p = page + 1; pages; pages--) {[m
[31m-                p->slab = NGX_SLAB_PAGE_BUSY;[m
[31m-                p->next = NULL;[m
[31m-                p->prev = NGX_SLAB_PAGE;[m
[31m-                p++;[m
[31m-            }[m
[31m-[m
[31m-            return page;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pool->log_nomem) {[m
[31m-        ngx_slab_error(pool, NGX_LOG_CRIT,[m
[31m-                       "ngx_slab_alloc() failed: no memory");[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page,[m
[31m-    ngx_uint_t pages)[m
[31m-{[m
[31m-    ngx_uint_t        type;[m
[31m-    ngx_slab_page_t  *prev, *join;[m
[31m-[m
[31m-    page->slab = pages--;[m
[31m-[m
[31m-    if (pages) {[m
[31m-        ngx_memzero(&page[1], pages * sizeof(ngx_slab_page_t));[m
[31m-    }[m
[31m-[m
[31m-    if (page->next) {[m
[31m-        prev = (ngx_slab_page_t *) (page->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-        prev->next = page->next;[m
[31m-        page->next->prev = page->prev;[m
[31m-    }[m
[31m-[m
[31m-    join = page + page->slab;[m
[31m-[m
[31m-    if (join < pool->last) {[m
[31m-        type = join->prev & NGX_SLAB_PAGE_MASK;[m
[31m-[m
[31m-        if (type == NGX_SLAB_PAGE) {[m
[31m-[m
[31m-            if (join->next != NULL) {[m
[31m-                pages += join->slab;[m
[31m-                page->slab += join->slab;[m
[31m-[m
[31m-                prev = (ngx_slab_page_t *) (join->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                prev->next = join->next;[m
[31m-                join->next->prev = join->prev;[m
[31m-[m
[31m-                join->slab = NGX_SLAB_PAGE_FREE;[m
[31m-                join->next = NULL;[m
[31m-                join->prev = NGX_SLAB_PAGE;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (page > pool->pages) {[m
[31m-        join = page - 1;[m
[31m-        type = join->prev & NGX_SLAB_PAGE_MASK;[m
[31m-[m
[31m-        if (type == NGX_SLAB_PAGE) {[m
[31m-[m
[31m-            if (join->slab == NGX_SLAB_PAGE_FREE) {[m
[31m-                join = (ngx_slab_page_t *) (join->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-            }[m
[31m-[m
[31m-            if (join->next != NULL) {[m
[31m-                pages += join->slab;[m
[31m-                join->slab += page->slab;[m
[31m-[m
[31m-                prev = (ngx_slab_page_t *) (join->prev & ~NGX_SLAB_PAGE_MASK);[m
[31m-                prev->next = join->next;[m
[31m-                join->next->prev = join->prev;[m
[31m-[m
[31m-                page->slab = NGX_SLAB_PAGE_FREE;[m
[31m-                page->next = NULL;[m
[31m-                page->prev = NGX_SLAB_PAGE;[m
[31m-[m
[31m-                page = join;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pages) {[m
[31m-        page[pages].prev = (uintptr_t) page;[m
[31m-    }[m
[31m-[m
[31m-    page->prev = (uintptr_t) &pool->free;[m
[31m-    page->next = pool->free.next;[m
[31m-[m
[31m-    page->next->prev = (uintptr_t) page;[m
[31m-[m
[31m-    pool->free.next = page;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_slab_error(ngx_slab_pool_t *pool, ngx_uint_t level, char *text)[m
[31m-{[m
[31m-    ngx_log_error(level, ngx_cycle->log, 0, "%s%s", text, pool->log_ctx);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_slab.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_slab.h[m
[1mdeleted file mode 100644[m
[1mindex 2922a80..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_slab.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SLAB_H_INCLUDED_[m
[31m-#define _NGX_SLAB_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_slab_page_s  ngx_slab_page_t;[m
[31m-[m
[31m-struct ngx_slab_page_s {[m
[31m-    uintptr_t         slab;[m
[31m-    ngx_slab_page_t  *next;[m
[31m-    uintptr_t         prev;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shmtx_sh_t    lock;[m
[31m-[m
[31m-    size_t            min_size;[m
[31m-    size_t            min_shift;[m
[31m-[m
[31m-    ngx_slab_page_t  *pages;[m
[31m-    ngx_slab_page_t  *last;[m
[31m-    ngx_slab_page_t   free;[m
[31m-[m
[31m-    u_char           *start;[m
[31m-    u_char           *end;[m
[31m-[m
[31m-    ngx_shmtx_t       mutex;[m
[31m-[m
[31m-    u_char           *log_ctx;[m
[31m-    u_char            zero;[m
[31m-[m
[31m-    unsigned          log_nomem:1;[m
[31m-[m
[31m-    void             *data;[m
[31m-    void             *addr;[m
[31m-} ngx_slab_pool_t;[m
[31m-[m
[31m-[m
[31m-void ngx_slab_init(ngx_slab_pool_t *pool);[m
[31m-void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);[m
[31m-void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);[m
[31m-void *ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size);[m
[31m-void *ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size);[m
[31m-void ngx_slab_free(ngx_slab_pool_t *pool, void *p);[m
[31m-void ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SLAB_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_spinlock.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_spinlock.c[m
[1mdeleted file mode 100644[m
[1mindex 9c93afa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_spinlock.c[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)[m
[31m-{[m
[31m-[m
[31m-#if (NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-    ngx_uint_t  i, n;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ncpu > 1) {[m
[31m-[m
[31m-            for (n = 1; n < spin; n <<= 1) {[m
[31m-[m
[31m-                for (i = 0; i < n; i++) {[m
[31m-                    ngx_cpu_pause();[m
[31m-                }[m
[31m-[m
[31m-                if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_sched_yield();[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-#error ngx_spinlock() or ngx_atomic_cmp_set() are not defined ![m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_string.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_string.c[m
[1mdeleted file mode 100644[m
[1mindex cf665a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_string.c[m
[1m+++ /dev/null[m
[36m@@ -1,1976 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64,[m
[31m-    u_char zero, ngx_uint_t hexadecimal, ngx_uint_t width);[m
[31m-static void ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src,[m
[31m-    const u_char *basis, ngx_uint_t padding);[m
[31m-static ngx_int_t ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src,[m
[31m-    const u_char *basis);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_strlow(u_char *dst, u_char *src, size_t n)[m
[31m-{[m
[31m-    while (n) {[m
[31m-        *dst = ngx_tolower(*src);[m
[31m-        dst++;[m
[31m-        src++;[m
[31m-        n--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_cpystrn(u_char *dst, u_char *src, size_t n)[m
[31m-{[m
[31m-    if (n == 0) {[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    while (--n) {[m
[31m-        *dst = *src;[m
[31m-[m
[31m-        if (*dst == '\0') {[m
[31m-            return dst;[m
[31m-        }[m
[31m-[m
[31m-        dst++;[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    *dst = '\0';[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src)[m
[31m-{[m
[31m-    u_char  *dst;[m
[31m-[m
[31m-    dst = ngx_pnalloc(pool, src->len);[m
[31m-    if (dst == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(dst, src->data, src->len);[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * supported formats:[m
[31m- *    %[0][width][x][X]O        off_t[m
[31m- *    %[0][width]T              time_t[m
[31m- *    %[0][width][u][x|X]z      ssize_t/size_t[m
[31m- *    %[0][width][u][x|X]d      int/u_int[m
[31m- *    %[0][width][u][x|X]l      long[m
[31m- *    %[0][width|m][u][x|X]i    ngx_int_t/ngx_uint_t[m
[31m- *    %[0][width][u][x|X]D      int32_t/uint32_t[m
[31m- *    %[0][width][u][x|X]L      int64_t/uint64_t[m
[31m- *    %[0][width|m][u][x|X]A    ngx_atomic_int_t/ngx_atomic_uint_t[m
[31m- *    %[0][width][.width]f      double, max valid number fits to %18.15f[m
[31m- *    %P                        ngx_pid_t[m
[31m- *    %M                        ngx_msec_t[m
[31m- *    %r                        rlim_t[m
[31m- *    %p                        void *[m
[31m- *    %V                        ngx_str_t *[m
[31m- *    %v                        ngx_variable_value_t *[m
[31m- *    %s                        null-terminated string[m
[31m- *    %*s                       length and string[m
[31m- *    %Z                        '\0'[m
[31m- *    %N                        '\n'[m
[31m- *    %c                        char[m
[31m- *    %%                        %[m
[31m- *[m
[31m- *  reserved:[m
[31m- *    %t                        ptrdiff_t[m
[31m- *    %S                        null-terminated wchar string[m
[31m- *    %C                        wchar[m
[31m- */[m
[31m-[m
[31m-[m
[31m-u_char * ngx_cdecl[m
[31m-ngx_sprintf(u_char *buf, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p;[m
[31m-    va_list   args;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(buf, (void *) -1, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char * ngx_cdecl[m
[31m-ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p;[m
[31m-    va_list   args;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(buf, buf + max, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char * ngx_cdecl[m
[31m-ngx_slprintf(u_char *buf, u_char *last, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char   *p;[m
[31m-    va_list   args;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(buf, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args)[m
[31m-{[m
[31m-    u_char                *p, zero;[m
[31m-    int                    d;[m
[31m-    double                 f;[m
[31m-    size_t                 len, slen;[m
[31m-    int64_t                i64;[m
[31m-    uint64_t               ui64, frac;[m
[31m-    ngx_msec_t             ms;[m
[31m-    ngx_uint_t             width, sign, hex, max_width, frac_width, scale, n;[m
[31m-    ngx_str_t             *v;[m
[31m-    ngx_variable_value_t  *vv;[m
[31m-[m
[31m-    while (*fmt && buf < last) {[m
[31m-[m
[31m-        /*[m
[31m-         * "buf < last" means that we could copy at least one character:[m
[31m-         * the plain character, "%%", "%c", and minus without the checking[m
[31m-         */[m
[31m-[m
[31m-        if (*fmt == '%') {[m
[31m-[m
[31m-            i64 = 0;[m
[31m-            ui64 = 0;[m
[31m-[m
[31m-            zero = (u_char) ((*++fmt == '0') ? '0' : ' ');[m
[31m-            width = 0;[m
[31m-            sign = 1;[m
[31m-            hex = 0;[m
[31m-            max_width = 0;[m
[31m-            frac_width = 0;[m
[31m-            slen = (size_t) -1;[m
[31m-[m
[31m-            while (*fmt >= '0' && *fmt <= '9') {[m
[31m-                width = width * 10 + *fmt++ - '0';[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            for ( ;; ) {[m
[31m-                switch (*fmt) {[m
[31m-[m
[31m-                case 'u':[m
[31m-                    sign = 0;[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                case 'm':[m
[31m-                    max_width = 1;[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                case 'X':[m
[31m-                    hex = 2;[m
[31m-                    sign = 0;[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                case 'x':[m
[31m-                    hex = 1;[m
[31m-                    sign = 0;[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                case '.':[m
[31m-                    fmt++;[m
[31m-[m
[31m-                    while (*fmt >= '0' && *fmt <= '9') {[m
[31m-                        frac_width = frac_width * 10 + *fmt++ - '0';[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case '*':[m
[31m-                    slen = va_arg(args, size_t);[m
[31m-                    fmt++;[m
[31m-                    continue;[m
[31m-[m
[31m-                default:[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            switch (*fmt) {[m
[31m-[m
[31m-            case 'V':[m
[31m-                v = va_arg(args, ngx_str_t *);[m
[31m-[m
[31m-                len = ngx_min(((size_t) (last - buf)), v->len);[m
[31m-                buf = ngx_cpymem(buf, v->data, len);[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 'v':[m
[31m-                vv = va_arg(args, ngx_variable_value_t *);[m
[31m-[m
[31m-                len = ngx_min(((size_t) (last - buf)), vv->len);[m
[31m-                buf = ngx_cpymem(buf, vv->data, len);[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 's':[m
[31m-                p = va_arg(args, u_char *);[m
[31m-[m
[31m-                if (slen == (size_t) -1) {[m
[31m-                    while (*p && buf < last) {[m
[31m-                        *buf++ = *p++;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    len = ngx_min(((size_t) (last - buf)), slen);[m
[31m-                    buf = ngx_cpymem(buf, p, len);[m
[31m-                }[m
[31m-[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 'O':[m
[31m-                i64 = (int64_t) va_arg(args, off_t);[m
[31m-                sign = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'P':[m
[31m-                i64 = (int64_t) va_arg(args, ngx_pid_t);[m
[31m-                sign = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'T':[m
[31m-                i64 = (int64_t) va_arg(args, time_t);[m
[31m-                sign = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case 'M':[m
[31m-                ms = (ngx_msec_t) va_arg(args, ngx_msec_t);[m
[31m-                if ((ngx_msec_int_t) ms == -1) {[m
[31m-                    sign = 1;[m
[31m-                    i64 = -1;[m
[31m-                } else {[m
[31m-                    sign = 0;[m
[31m-                    ui64 = (uint64_t) ms;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'z':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, ssize_t);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, size_t);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'i':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, ngx_int_t);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, ngx_uint_t);[m
[31m-                }[m
[31m-[m
[31m-                if (max_width) {[m
[31m-                    width = NGX_INT_T_LEN;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case 'd':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, int);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, u_int);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'l':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, long);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, u_long);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'D':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, int32_t);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, uint32_t);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'L':[m
[31m-                if (sign) {[m
[31m-                    i64 = va_arg(args, int64_t);[m
[31m-                } else {[m
[31m-                    ui64 = va_arg(args, uint64_t);[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            case 'A':[m
[31m-                if (sign) {[m
[31m-                    i64 = (int64_t) va_arg(args, ngx_atomic_int_t);[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) va_arg(args, ngx_atomic_uint_t);[m
[31m-                }[m
[31m-[m
[31m-                if (max_width) {[m
[31m-                    width = NGX_ATOMIC_T_LEN;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case 'f':[m
[31m-                f = va_arg(args, double);[m
[31m-[m
[31m-                if (f < 0) {[m
[31m-                    *buf++ = '-';[m
[31m-                    f = -f;[m
[31m-                }[m
[31m-[m
[31m-                ui64 = (int64_t) f;[m
[31m-                frac = 0;[m
[31m-[m
[31m-                if (frac_width) {[m
[31m-[m
[31m-                    scale = 1;[m
[31m-                    for (n = frac_width; n; n--) {[m
[31m-                        scale *= 10;[m
[31m-                    }[m
[31m-[m
[31m-                    frac = (uint64_t) ((f - (double) ui64) * scale + 0.5);[m
[31m-[m
[31m-                    if (frac == scale) {[m
[31m-                        ui64++;[m
[31m-                        frac = 0;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                buf = ngx_sprintf_num(buf, last, ui64, zero, 0, width);[m
[31m-[m
[31m-                if (frac_width) {[m
[31m-                    if (buf < last) {[m
[31m-                        *buf++ = '.';[m
[31m-                    }[m
[31m-[m
[31m-                    buf = ngx_sprintf_num(buf, last, frac, '0', 0, frac_width);[m
[31m-                }[m
[31m-[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-            case 'r':[m
[31m-                i64 = (int64_t) va_arg(args, rlim_t);[m
[31m-                sign = 1;[m
[31m-                break;[m
[31m-#endif[m
[31m-[m
[31m-            case 'p':[m
[31m-                ui64 = (uintptr_t) va_arg(args, void *);[m
[31m-                hex = 2;[m
[31m-                sign = 0;[m
[31m-                zero = '0';[m
[31m-                width = 2 * sizeof(void *);[m
[31m-                break;[m
[31m-[m
[31m-            case 'c':[m
[31m-                d = va_arg(args, int);[m
[31m-                *buf++ = (u_char) (d & 0xff);[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 'Z':[m
[31m-                *buf++ = '\0';[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case 'N':[m
[31m-#if (NGX_WIN32)[m
[31m-                *buf++ = CR;[m
[31m-                if (buf < last) {[m
[31m-                    *buf++ = LF;[m
[31m-                }[m
[31m-#else[m
[31m-                *buf++ = LF;[m
[31m-#endif[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case '%':[m
[31m-                *buf++ = '%';[m
[31m-                fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-                *buf++ = *fmt++;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (sign) {[m
[31m-                if (i64 < 0) {[m
[31m-                    *buf++ = '-';[m
[31m-                    ui64 = (uint64_t) -i64;[m
[31m-[m
[31m-                } else {[m
[31m-                    ui64 = (uint64_t) i64;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            buf = ngx_sprintf_num(buf, last, ui64, zero, hex, width);[m
[31m-[m
[31m-            fmt++;[m
[31m-[m
[31m-        } else {[m
[31m-            *buf++ = *fmt++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64, u_char zero,[m
[31m-    ngx_uint_t hexadecimal, ngx_uint_t width)[m
[31m-{[m
[31m-    u_char         *p, temp[NGX_INT64_LEN + 1];[m
[31m-                       /*[m
[31m-                        * we need temp[NGX_INT64_LEN] only,[m
[31m-                        * but icc issues the warning[m
[31m-                        */[m
[31m-    size_t          len;[m
[31m-    uint32_t        ui32;[m
[31m-    static u_char   hex[] = "0123456789abcdef";[m
[31m-    static u_char   HEX[] = "0123456789ABCDEF";[m
[31m-[m
[31m-    p = temp + NGX_INT64_LEN;[m
[31m-[m
[31m-    if (hexadecimal == 0) {[m
[31m-[m
[31m-        if (ui64 <= (uint64_t) NGX_MAX_UINT32_VALUE) {[m
[31m-[m
[31m-            /*[m
[31m-             * To divide 64-bit numbers and to find remainders[m
[31m-             * on the x86 platform gcc and icc call the libc functions[m
[31m-             * [u]divdi3() and [u]moddi3(), they call another function[m
[31m-             * in its turn.  On FreeBSD it is the qdivrem() function,[m
[31m-             * its source code is about 170 lines of the code.[m
[31m-             * The glibc counterpart is about 150 lines of the code.[m
[31m-             *[m
[31m-             * For 32-bit numbers and some divisors gcc and icc use[m
[31m-             * a inlined multiplication and shifts.  For example,[m
[31m-             * unsigned "i32 / 10" is compiled to[m
[31m-             *[m
[31m-             *     (i32 * 0xCCCCCCCD) >> 35[m
[31m-             */[m
[31m-[m
[31m-            ui32 = (uint32_t) ui64;[m
[31m-[m
[31m-            do {[m
[31m-                *--p = (u_char) (ui32 % 10 + '0');[m
[31m-            } while (ui32 /= 10);[m
[31m-[m
[31m-        } else {[m
[31m-            do {[m
[31m-                *--p = (u_char) (ui64 % 10 + '0');[m
[31m-            } while (ui64 /= 10);[m
[31m-        }[m
[31m-[m
[31m-    } else if (hexadecimal == 1) {[m
[31m-[m
[31m-        do {[m
[31m-[m
[31m-            /* the "(uint32_t)" cast disables the BCC's warning */[m
[31m-            *--p = hex[(uint32_t) (ui64 & 0xf)];[m
[31m-[m
[31m-        } while (ui64 >>= 4);[m
[31m-[m
[31m-    } else { /* hexadecimal == 2 */[m
[31m-[m
[31m-        do {[m
[31m-[m
[31m-            /* the "(uint32_t)" cast disables the BCC's warning */[m
[31m-            *--p = HEX[(uint32_t) (ui64 & 0xf)];[m
[31m-[m
[31m-        } while (ui64 >>= 4);[m
[31m-    }[m
[31m-[m
[31m-    /* zero or space padding */[m
[31m-[m
[31m-    len = (temp + NGX_INT64_LEN) - p;[m
[31m-[m
[31m-    while (len++ < width && buf < last) {[m
[31m-        *buf++ = zero;[m
[31m-    }[m
[31m-[m
[31m-    /* number safe copy */[m
[31m-[m
[31m-    len = (temp + NGX_INT64_LEN) - p;[m
[31m-[m
[31m-    if (buf + len > last) {[m
[31m-        len = last - buf;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_cpymem(buf, p, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * We use ngx_strcasecmp()/ngx_strncasecmp() for 7-bit ASCII strings only,[m
[31m- * and implement our own ngx_strcasecmp()/ngx_strncasecmp()[m
[31m- * to avoid libc locale overhead.  Besides, we use the ngx_uint_t's[m
[31m- * instead of the u_char's, because they are slightly faster.[m
[31m- */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_strcasecmp(u_char *s1, u_char *s2)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        c1 = (ngx_uint_t) *s1++;[m
[31m-        c2 = (ngx_uint_t) *s2++;[m
[31m-[m
[31m-        c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-        c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-[m
[31m-        if (c1 == c2) {[m
[31m-[m
[31m-            if (c1) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        return c1 - c2;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_strncasecmp(u_char *s1, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    while (n) {[m
[31m-        c1 = (ngx_uint_t) *s1++;[m
[31m-        c2 = (ngx_uint_t) *s2++;[m
[31m-[m
[31m-        c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-        c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-[m
[31m-        if (c1 == c2) {[m
[31m-[m
[31m-            if (c1) {[m
[31m-                n--;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        return c1 - c2;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strnstr(u_char *s1, char *s2, size_t len)[m
[31m-{[m
[31m-    u_char  c1, c2;[m
[31m-    size_t  n;[m
[31m-[m
[31m-    c2 = *(u_char *) s2++;[m
[31m-[m
[31m-    n = ngx_strlen(s2);[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (len-- == 0) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = *s1++;[m
[31m-[m
[31m-            if (c1 == 0) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-        if (n > len) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, (u_char *) s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_strstrn() and ngx_strcasestrn() are intended to search for static[m
[31m- * substring with known length in null-terminated string. The argument n[m
[31m- * must be length of the second substring - 1.[m
[31m- */[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strstrn(u_char *s1, char *s2, size_t n)[m
[31m-{[m
[31m-    u_char  c1, c2;[m
[31m-[m
[31m-    c2 = *(u_char *) s2++;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            c1 = *s1++;[m
[31m-[m
[31m-            if (c1 == 0) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, (u_char *) s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strcasestrn(u_char *s1, char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-            if (c1 == 0) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncasecmp(s1, (u_char *) s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_strlcasestrn() is intended to search for static substring[m
[31m- * with known length in string until the argument last. The argument n[m
[31m- * must be length of the second substring - 1.[m
[31m- */[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-    last -= n;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (s1 >= last) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-            c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-    } while (ngx_strncasecmp(s1, s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_rstrncmp(u_char *s1, u_char *s2, size_t n)[m
[31m-{[m
[31m-    if (n == 0) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    n--;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (s1[n] != s2[n]) {[m
[31m-            return s1[n] - s2[n];[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        n--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n)[m
[31m-{[m
[31m-    u_char  c1, c2;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    n--;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        c1 = s1[n];[m
[31m-        if (c1 >= 'a' && c1 <= 'z') {[m
[31m-            c1 -= 'a' - 'A';[m
[31m-        }[m
[31m-[m
[31m-        c2 = s2[n];[m
[31m-        if (c2 >= 'a' && c2 <= 'z') {[m
[31m-            c2 -= 'a' - 'A';[m
[31m-        }[m
[31m-[m
[31m-        if (c1 != c2) {[m
[31m-            return c1 - c2;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        n--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_memn2cmp(u_char *s1, u_char *s2, size_t n1, size_t n2)[m
[31m-{[m
[31m-    size_t     n;[m
[31m-    ngx_int_t  m, z;[m
[31m-[m
[31m-    if (n1 <= n2) {[m
[31m-        n = n1;[m
[31m-        z = -1;[m
[31m-[m
[31m-    } else {[m
[31m-        n = n2;[m
[31m-        z = 1;[m
[31m-    }[m
[31m-[m
[31m-    m = ngx_memcmp(s1, s2, n);[m
[31m-[m
[31m-    if (m || n1 == n2) {[m
[31m-        return m;[m
[31m-    }[m
[31m-[m
[31m-    return z;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_dns_strcmp(u_char *s1, u_char *s2)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        c1 = (ngx_uint_t) *s1++;[m
[31m-        c2 = (ngx_uint_t) *s2++;[m
[31m-[m
[31m-        c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;[m
[31m-        c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;[m
[31m-[m
[31m-        if (c1 == c2) {[m
[31m-[m
[31m-            if (c1) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        /* in ASCII '.' > '-', but we need '.' to be the lowest character */[m
[31m-[m
[31m-        c1 = (c1 == '.') ? ' ' : c1;[m
[31m-        c2 = (c2 == '.') ? ' ' : c2;[m
[31m-[m
[31m-        return c1 - c2;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_filename_cmp(u_char *s1, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    while (n) {[m
[31m-        c1 = (ngx_uint_t) *s1++;[m
[31m-        c2 = (ngx_uint_t) *s2++;[m
[31m-[m
[31m-#if (NGX_HAVE_CASELESS_FILESYSTEM)[m
[31m-        c1 = tolower(c1);[m
[31m-        c2 = tolower(c2);[m
[31m-#endif[m
[31m-[m
[31m-        if (c1 == c2) {[m
[31m-[m
[31m-            if (c1) {[m
[31m-                n--;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        /* we need '/' to be the lowest character */[m
[31m-[m
[31m-        if (c1 == 0 || c2 == 0) {[m
[31m-            return c1 - c2;[m
[31m-        }[m
[31m-[m
[31m-        c1 = (c1 == '/') ? 0 : c1;[m
[31m-        c2 = (c2 == '/') ? 0 : c2;[m
[31m-[m
[31m-        return c1 - c2;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_atoi(u_char *line, size_t n)[m
[31m-{[m
[31m-    ngx_int_t  value, cutoff, cutlim;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_INT_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_INT_T_VALUE % 10;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* parse a fixed point number, e.g., ngx_atofp("10.5", 4, 2) returns 1050 */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_atofp(u_char *line, size_t n, size_t point)[m
[31m-{[m
[31m-    ngx_int_t   value, cutoff, cutlim;[m
[31m-    ngx_uint_t  dot;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_INT_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_INT_T_VALUE % 10;[m
[31m-[m
[31m-    dot = 0;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-[m
[31m-        if (point == 0) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (*line == '.') {[m
[31m-            if (dot) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            dot = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-        point -= dot;[m
[31m-    }[m
[31m-[m
[31m-    while (point--) {[m
[31m-        if (value > cutoff) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_atosz(u_char *line, size_t n)[m
[31m-{[m
[31m-    ssize_t  value, cutoff, cutlim;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_SIZE_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_SIZE_T_VALUE % 10;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-off_t[m
[31m-ngx_atoof(u_char *line, size_t n)[m
[31m-{[m
[31m-    off_t  value, cutoff, cutlim;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_OFF_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_OFF_T_VALUE % 10;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-time_t[m
[31m-ngx_atotm(u_char *line, size_t n)[m
[31m-{[m
[31m-    time_t  value, cutoff, cutlim;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_TIME_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_TIME_T_VALUE % 10;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10 + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_hextoi(u_char *line, size_t n)[m
[31m-{[m
[31m-    u_char     c, ch;[m
[31m-    ngx_int_t  value, cutoff;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_INT_T_VALUE / 16;[m
[31m-[m
[31m-    for (value = 0; n--; line++) {[m
[31m-        if (value > cutoff) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ch = *line;[m
[31m-[m
[31m-        if (ch >= '0' && ch <= '9') {[m
[31m-            value = value * 16 + (ch - '0');[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        c = (u_char) (ch | 0x20);[m
[31m-[m
[31m-        if (c >= 'a' && c <= 'f') {[m
[31m-            value = value * 16 + (c - 'a' + 10);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_hex_dump(u_char *dst, u_char *src, size_t len)[m
[31m-{[m
[31m-    static u_char  hex[] = "0123456789abcdef";[m
[31m-[m
[31m-    while (len--) {[m
[31m-        *dst++ = hex[*src >> 4];[m
[31m-        *dst++ = hex[*src++ & 0xf];[m
[31m-    }[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src)[m
[31m-{[m
[31m-    static u_char   basis64[] =[m
[31m-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";[m
[31m-[m
[31m-    ngx_encode_base64_internal(dst, src, basis64, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src)[m
[31m-{[m
[31m-    static u_char   basis64[] =[m
[31m-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";[m
[31m-[m
[31m-    ngx_encode_base64_internal(dst, src, basis64, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis,[m
[31m-    ngx_uint_t padding)[m
[31m-{[m
[31m-    u_char         *d, *s;[m
[31m-    size_t          len;[m
[31m-[m
[31m-    len = src->len;[m
[31m-    s = src->data;[m
[31m-    d = dst->data;[m
[31m-[m
[31m-    while (len > 2) {[m
[31m-        *d++ = basis[(s[0] >> 2) & 0x3f];[m
[31m-        *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];[m
[31m-        *d++ = basis[((s[1] & 0x0f) << 2) | (s[2] >> 6)];[m
[31m-        *d++ = basis[s[2] & 0x3f];[m
[31m-[m
[31m-        s += 3;[m
[31m-        len -= 3;[m
[31m-    }[m
[31m-[m
[31m-    if (len) {[m
[31m-        *d++ = basis[(s[0] >> 2) & 0x3f];[m
[31m-[m
[31m-        if (len == 1) {[m
[31m-            *d++ = basis[(s[0] & 3) << 4];[m
[31m-            if (padding) {[m
[31m-                *d++ = '=';[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];[m
[31m-            *d++ = basis[(s[1] & 0x0f) << 2];[m
[31m-        }[m
[31m-[m
[31m-        if (padding) {[m
[31m-            *d++ = '=';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dst->len = d - dst->data;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src)[m
[31m-{[m
[31m-    static u_char   basis64[] = {[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63,[m
[31m-        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,[m
[31m-        77,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,[m
[31m-        15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 77,[m
[31m-        77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,[m
[31m-        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,[m
[31m-[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77[m
[31m-    };[m
[31m-[m
[31m-    return ngx_decode_base64_internal(dst, src, basis64);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_decode_base64url(ngx_str_t *dst, ngx_str_t *src)[m
[31m-{[m
[31m-    static u_char   basis64[] = {[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77,[m
[31m-        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,[m
[31m-        77,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,[m
[31m-        15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 63,[m
[31m-        77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,[m
[31m-        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,[m
[31m-[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,[m
[31m-        77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77[m
[31m-    };[m
[31m-[m
[31m-    return ngx_decode_base64_internal(dst, src, basis64);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis)[m
[31m-{[m
[31m-    size_t          len;[m
[31m-    u_char         *d, *s;[m
[31m-[m
[31m-    for (len = 0; len < src->len; len++) {[m
[31m-        if (src->data[len] == '=') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (basis[src->data[len]] == 77) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len % 4 == 1) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s = src->data;[m
[31m-    d = dst->data;[m
[31m-[m
[31m-    while (len > 3) {[m
[31m-        *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);[m
[31m-        *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);[m
[31m-        *d++ = (u_char) (basis[s[2]] << 6 | basis[s[3]]);[m
[31m-[m
[31m-        s += 4;[m
[31m-        len -= 4;[m
[31m-    }[m
[31m-[m
[31m-    if (len > 1) {[m
[31m-        *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);[m
[31m-    }[m
[31m-[m
[31m-    if (len > 2) {[m
[31m-        *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);[m
[31m-    }[m
[31m-[m
[31m-    dst->len = d - dst->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_utf8_decode() decodes two and more bytes UTF sequences only[m
[31m- * the return values:[m
[31m- *    0x80 - 0x10ffff         valid character[m
[31m- *    0x110000 - 0xfffffffd   invalid sequence[m
[31m- *    0xfffffffe              incomplete sequence[m
[31m- *    0xffffffff              error[m
[31m- */[m
[31m-[m
[31m-uint32_t[m
[31m-ngx_utf8_decode(u_char **p, size_t n)[m
[31m-{[m
[31m-    size_t    len;[m
[31m-    uint32_t  u, i, valid;[m
[31m-[m
[31m-    u = **p;[m
[31m-[m
[31m-    if (u >= 0xf0) {[m
[31m-[m
[31m-        u &= 0x07;[m
[31m-        valid = 0xffff;[m
[31m-        len = 3;[m
[31m-[m
[31m-    } else if (u >= 0xe0) {[m
[31m-[m
[31m-        u &= 0x0f;[m
[31m-        valid = 0x7ff;[m
[31m-        len = 2;[m
[31m-[m
[31m-    } else if (u >= 0xc2) {[m
[31m-[m
[31m-        u &= 0x1f;[m
[31m-        valid = 0x7f;[m
[31m-        len = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        (*p)++;[m
[31m-        return 0xffffffff;[m
[31m-    }[m
[31m-[m
[31m-    if (n - 1 < len) {[m
[31m-        return 0xfffffffe;[m
[31m-    }[m
[31m-[m
[31m-    (*p)++;[m
[31m-[m
[31m-    while (len) {[m
[31m-        i = *(*p)++;[m
[31m-[m
[31m-        if (i < 0x80) {[m
[31m-            return 0xffffffff;[m
[31m-        }[m
[31m-[m
[31m-        u = (u << 6) | (i & 0x3f);[m
[31m-[m
[31m-        len--;[m
[31m-    }[m
[31m-[m
[31m-    if (u > valid) {[m
[31m-        return u;[m
[31m-    }[m
[31m-[m
[31m-    return 0xffffffff;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_utf8_length(u_char *p, size_t n)[m
[31m-{[m
[31m-    u_char  c, *last;[m
[31m-    size_t  len;[m
[31m-[m
[31m-    last = p + n;[m
[31m-[m
[31m-    for (len = 0; p < last; len++) {[m
[31m-[m
[31m-        c = *p;[m
[31m-[m
[31m-        if (c < 0x80) {[m
[31m-            p++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_utf8_decode(&p, n) > 0x10ffff) {[m
[31m-            /* invalid UTF-8 */[m
[31m-            return n;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len)[m
[31m-{[m
[31m-    u_char  c, *next;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    while (--n) {[m
[31m-[m
[31m-        c = *src;[m
[31m-        *dst = c;[m
[31m-[m
[31m-        if (c < 0x80) {[m
[31m-[m
[31m-            if (c != '\0') {[m
[31m-                dst++;[m
[31m-                src++;[m
[31m-                len--;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return dst;[m
[31m-        }[m
[31m-[m
[31m-        next = src;[m
[31m-[m
[31m-        if (ngx_utf8_decode(&next, len) > 0x10ffff) {[m
[31m-            /* invalid UTF-8 */[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        while (src < next) {[m
[31m-            *dst++ = *src++;[m
[31m-            len--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *dst = '\0';[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t      n;[m
[31m-    uint32_t       *escape;[m
[31m-    static u_char   hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-                    /* " ", "#", "%", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   uri[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x80000029, /* 1000 0000 0000 0000  0000 0000 0010 1001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", "%", "&", "+", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   args[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x88000869, /* 1000 1000 0000 0000  0000 1000 0110 1001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* not ALPHA, DIGIT, "-", ".", "_", "~" */[m
[31m-[m
[31m-    static uint32_t   uri_component[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0xfc009fff, /* 1111 1100 0000 0000  1001 1111 1111 1111 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x78000001, /* 0111 1000 0000 0000  0000 0000 0000 0001 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0xb8000001, /* 1011 1000 0000 0000  0000 0000 0000 0001 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   html[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x000000ad, /* 0000 0000 0000 0000  0000 0000 1010 1101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   refresh[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000085, /* 0000 0000 0000 0000  0000 0000 1000 0101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "%", %00-%1F */[m
[31m-[m
[31m-    static uint32_t   memcached[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000021, /* 0000 0000 0000 0000  0000 0000 0010 0001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-    };[m
[31m-[m
[31m-                    /* mail_auth is the same as memcached */[m
[31m-[m
[31m-    static uint32_t  *map[] =[m
[31m-        { uri, args, uri_component, html, refresh, memcached, memcached };[m
[31m-[m
[31m-[m
[31m-    escape = map[type];[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '%';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type)[m
[31m-{[m
[31m-    u_char  *d, *s, ch, c, decoded;[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_quoted,[m
[31m-        sw_quoted_second[m
[31m-    } state;[m
[31m-[m
[31m-    d = *dst;[m
[31m-    s = *src;[m
[31m-[m
[31m-    state = 0;[m
[31m-    decoded = 0;[m
[31m-[m
[31m-    while (size--) {[m
[31m-[m
[31m-        ch = *s++;[m
[31m-[m
[31m-        switch (state) {[m
[31m-        case sw_usual:[m
[31m-            if (ch == '?'[m
[31m-                && (type & (NGX_UNESCAPE_URI|NGX_UNESCAPE_REDIRECT)))[m
[31m-            {[m
[31m-                *d++ = ch;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '%') {[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted:[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                decoded = (u_char) (ch - '0');[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                decoded = (u_char) (c - 'a' + 10);[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted_second:[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ch = (u_char) ((decoded << 4) + ch - '0');[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ch = (u_char) ((decoded << 4) + c - 'a' + 10);[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_URI) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = ch;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    *dst = d;[m
[31m-    *src = s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_escape_html(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    ngx_uint_t  len;[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        len = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            switch (*src++) {[m
[31m-[m
[31m-            case '<':[m
[31m-                len += sizeof("&lt;") - 2;[m
[31m-                break;[m
[31m-[m
[31m-            case '>':[m
[31m-                len += sizeof("&gt;") - 2;[m
[31m-                break;[m
[31m-[m
[31m-            case '&':[m
[31m-                len += sizeof("&amp;") - 2;[m
[31m-                break;[m
[31m-[m
[31m-            case '"':[m
[31m-                len += sizeof("&quot;") - 2;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) len;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        ch = *src++;[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '<':[m
[31m-            *dst++ = '&'; *dst++ = 'l'; *dst++ = 't'; *dst++ = ';';[m
[31m-            break;[m
[31m-[m
[31m-        case '>':[m
[31m-            *dst++ = '&'; *dst++ = 'g'; *dst++ = 't'; *dst++ = ';';[m
[31m-            break;[m
[31m-[m
[31m-        case '&':[m
[31m-            *dst++ = '&'; *dst++ = 'a'; *dst++ = 'm'; *dst++ = 'p';[m
[31m-            *dst++ = ';';[m
[31m-            break;[m
[31m-[m
[31m-        case '"':[m
[31m-            *dst++ = '&'; *dst++ = 'q'; *dst++ = 'u'; *dst++ = 'o';[m
[31m-            *dst++ = 't'; *dst++ = ';';[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            *dst++ = ch;[m
[31m-            break;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_escape_json(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    ngx_uint_t  len;[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        len = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            ch = *src++;[m
[31m-[m
[31m-            if (ch == '\\' || ch == '"') {[m
[31m-                len++;[m
[31m-[m
[31m-            } else if (ch <= 0x1f) {[m
[31m-                len += sizeof("\\u001F") - 2;[m
[31m-            }[m
[31m-[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) len;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        ch = *src++;[m
[31m-[m
[31m-        if (ch > 0x1f) {[m
[31m-[m
[31m-            if (ch == '\\' || ch == '"') {[m
[31m-                *dst++ = '\\';[m
[31m-            }[m
[31m-[m
[31m-            *dst++ = ch;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = '\\'; *dst++ = 'u'; *dst++ = '0'; *dst++ = '0';[m
[31m-            *dst++ = '0' + (ch >> 4);[m
[31m-[m
[31m-            ch &= 0xf;[m
[31m-[m
[31m-            *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10);[m
[31m-        }[m
[31m-[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_str_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_str_node_t      *n, *t;[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = (ngx_str_node_t *) node;[m
[31m-        t = (ngx_str_node_t *) temp;[m
[31m-[m
[31m-        if (node->key != temp->key) {[m
[31m-[m
[31m-            p = (node->key < temp->key) ? &temp->left : &temp->right;[m
[31m-[m
[31m-        } else if (n->str.len != t->str.len) {[m
[31m-[m
[31m-            p = (n->str.len < t->str.len) ? &temp->left : &temp->right;[m
[31m-[m
[31m-        } else {[m
[31m-            p = (ngx_memcmp(n->str.data, t->str.data, n->str.len) < 0)[m
[31m-                 ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_str_node_t *[m
[31m-ngx_str_rbtree_lookup(ngx_rbtree_t *rbtree, ngx_str_t *val, uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-    ngx_str_node_t     *n;[m
[31m-    ngx_rbtree_node_t  *node, *sentinel;[m
[31m-[m
[31m-    node = rbtree->root;[m
[31m-    sentinel = rbtree->sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        n = (ngx_str_node_t *) node;[m
[31m-[m
[31m-        if (hash != node->key) {[m
[31m-            node = (hash < node->key) ? node->left : node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (val->len != n->str.len) {[m
[31m-            node = (val->len < n->str.len) ? node->left : node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_memcmp(val->data, n->str.data, val->len);[m
[31m-[m
[31m-        if (rc < 0) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc > 0) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* ngx_sort() is implemented as insertion sort because we need stable sort */[m
[31m-[m
[31m-void[m
[31m-ngx_sort(void *base, size_t n, size_t size,[m
[31m-    ngx_int_t (*cmp)(const void *, const void *))[m
[31m-{[m
[31m-    u_char  *p1, *p2, *p;[m
[31m-[m
[31m-    p = ngx_alloc(size, ngx_cycle->log);[m
[31m-    if (p == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    for (p1 = (u_char *) base + size;[m
[31m-         p1 < (u_char *) base + n * size;[m
[31m-         p1 += size)[m
[31m-    {[m
[31m-        ngx_memcpy(p, p1, size);[m
[31m-[m
[31m-        for (p2 = p1;[m
[31m-             p2 > (u_char *) base && cmp(p2 - size, p) > 0;[m
[31m-             p2 -= size)[m
[31m-        {[m
[31m-            ngx_memcpy(p2, p2 - size, size);[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p2, p, size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_MEMCPY_LIMIT)[m
[31m-[m
[31m-void *[m
[31m-ngx_memcpy(void *dst, const void *src, size_t n)[m
[31m-{[m
[31m-    if (n > NGX_MEMCPY_LIMIT) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "memcpy %uz bytes", n);[m
[31m-        ngx_debug_point();[m
[31m-    }[m
[31m-[m
[31m-    return memcpy(dst, src, n);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_string.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_string.h[m
[1mdeleted file mode 100644[m
[1mindex 7363bd2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_string.h[m
[1m+++ /dev/null[m
[36m@@ -1,234 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STRING_H_INCLUDED_[m
[31m-#define _NGX_STRING_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t      len;[m
[31m-    u_char     *data;[m
[31m-} ngx_str_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t   key;[m
[31m-    ngx_str_t   value;[m
[31m-} ngx_keyval_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    unsigned    len:28;[m
[31m-[m
[31m-    unsigned    valid:1;[m
[31m-    unsigned    no_cacheable:1;[m
[31m-    unsigned    not_found:1;[m
[31m-    unsigned    escape:1;[m
[31m-[m
[31m-    u_char     *data;[m
[31m-} ngx_variable_value_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_string(str)     { sizeof(str) - 1, (u_char *) str }[m
[31m-#define ngx_null_string     { 0, NULL }[m
[31m-#define ngx_str_set(str, text)                                               \[m
[31m-    (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text[m
[31m-#define ngx_str_null(str)   (str)->len = 0; (str)->data = NULL[m
[31m-[m
[31m-[m
[31m-#define ngx_tolower(c)      (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)[m
[31m-#define ngx_toupper(c)      (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)[m
[31m-[m
[31m-void ngx_strlow(u_char *dst, u_char *src, size_t n);[m
[31m-[m
[31m-[m
[31m-#define ngx_strncmp(s1, s2, n)  strncmp((const char *) s1, (const char *) s2, n)[m
[31m-[m
[31m-[m
[31m-/* msvc and icc7 compile strcmp() to inline loop */[m
[31m-#define ngx_strcmp(s1, s2)  strcmp((const char *) s1, (const char *) s2)[m
[31m-[m
[31m-[m
[31m-#define ngx_strstr(s1, s2)  strstr((const char *) s1, (const char *) s2)[m
[31m-#define ngx_strlen(s)       strlen((const char *) s)[m
[31m-[m
[31m-#define ngx_strchr(s1, c)   strchr((const char *) s1, (int) c)[m
[31m-[m
[31m-static ngx_inline u_char *[m
[31m-ngx_strlchr(u_char *p, u_char *last, u_char c)[m
[31m-{[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        if (*p == c) {[m
[31m-            return p;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * msvc and icc7 compile memset() to the inline "rep stos"[m
[31m- * while ZeroMemory() and bzero() are the calls.[m
[31m- * icc7 may also inline several mov's of a zeroed register for small blocks.[m
[31m- */[m
[31m-#define ngx_memzero(buf, n)       (void) memset(buf, 0, n)[m
[31m-#define ngx_memset(buf, c, n)     (void) memset(buf, c, n)[m
[31m-[m
[31m-[m
[31m-#if (NGX_MEMCPY_LIMIT)[m
[31m-[m
[31m-void *ngx_memcpy(void *dst, const void *src, size_t n);[m
[31m-#define ngx_cpymem(dst, src, n)   (((u_char *) ngx_memcpy(dst, src, n)) + (n))[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/*[m
[31m- * gcc3, msvc, and icc7 compile memcpy() to the inline "rep movs".[m
[31m- * gcc3 compiles memcpy(d, s, 4) to the inline "mov"es.[m
[31m- * icc8 compile memcpy(d, s, 4) to the inline "mov"es or XMM moves.[m
[31m- */[m
[31m-#define ngx_memcpy(dst, src, n)   (void) memcpy(dst, src, n)[m
[31m-#define ngx_cpymem(dst, src, n)   (((u_char *) memcpy(dst, src, n)) + (n))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if ( __INTEL_COMPILER >= 800 )[m
[31m-[m
[31m-/*[m
[31m- * the simple inline cycle copies the variable length strings up to 16[m
[31m- * bytes faster than icc8 autodetecting _intel_fast_memcpy()[m
[31m- */[m
[31m-[m
[31m-static ngx_inline u_char *[m
[31m-ngx_copy(u_char *dst, u_char *src, size_t len)[m
[31m-{[m
[31m-    if (len < 17) {[m
[31m-[m
[31m-        while (len) {[m
[31m-            *dst++ = *src++;[m
[31m-            len--;[m
[31m-        }[m
[31m-[m
[31m-        return dst;[m
[31m-[m
[31m-    } else {[m
[31m-        return ngx_cpymem(dst, src, len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_copy                  ngx_cpymem[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_memmove(dst, src, n)   (void) memmove(dst, src, n)[m
[31m-#define ngx_movemem(dst, src, n)   (((u_char *) memmove(dst, src, n)) + (n))[m
[31m-[m
[31m-[m
[31m-/* msvc and icc7 compile memcmp() to the inline loop */[m
[31m-#define ngx_memcmp(s1, s2, n)  memcmp((const char *) s1, (const char *) s2, n)[m
[31m-[m
[31m-[m
[31m-u_char *ngx_cpystrn(u_char *dst, u_char *src, size_t n);[m
[31m-u_char *ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src);[m
[31m-u_char * ngx_cdecl ngx_sprintf(u_char *buf, const char *fmt, ...);[m
[31m-u_char * ngx_cdecl ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...);[m
[31m-u_char * ngx_cdecl ngx_slprintf(u_char *buf, u_char *last, const char *fmt,[m
[31m-    ...);[m
[31m-u_char *ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args);[m
[31m-#define ngx_vsnprintf(buf, max, fmt, args)                                   \[m
[31m-    ngx_vslprintf(buf, buf + (max), fmt, args)[m
[31m-[m
[31m-ngx_int_t ngx_strcasecmp(u_char *s1, u_char *s2);[m
[31m-ngx_int_t ngx_strncasecmp(u_char *s1, u_char *s2, size_t n);[m
[31m-[m
[31m-u_char *ngx_strnstr(u_char *s1, char *s2, size_t n);[m
[31m-[m
[31m-u_char *ngx_strstrn(u_char *s1, char *s2, size_t n);[m
[31m-u_char *ngx_strcasestrn(u_char *s1, char *s2, size_t n);[m
[31m-u_char *ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n);[m
[31m-[m
[31m-ngx_int_t ngx_rstrncmp(u_char *s1, u_char *s2, size_t n);[m
[31m-ngx_int_t ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n);[m
[31m-ngx_int_t ngx_memn2cmp(u_char *s1, u_char *s2, size_t n1, size_t n2);[m
[31m-ngx_int_t ngx_dns_strcmp(u_char *s1, u_char *s2);[m
[31m-ngx_int_t ngx_filename_cmp(u_char *s1, u_char *s2, size_t n);[m
[31m-[m
[31m-ngx_int_t ngx_atoi(u_char *line, size_t n);[m
[31m-ngx_int_t ngx_atofp(u_char *line, size_t n, size_t point);[m
[31m-ssize_t ngx_atosz(u_char *line, size_t n);[m
[31m-off_t ngx_atoof(u_char *line, size_t n);[m
[31m-time_t ngx_atotm(u_char *line, size_t n);[m
[31m-ngx_int_t ngx_hextoi(u_char *line, size_t n);[m
[31m-[m
[31m-u_char *ngx_hex_dump(u_char *dst, u_char *src, size_t len);[m
[31m-[m
[31m-[m
[31m-#define ngx_base64_encoded_length(len)  (((len + 2) / 3) * 4)[m
[31m-#define ngx_base64_decoded_length(len)  (((len + 3) / 4) * 3)[m
[31m-[m
[31m-void ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src);[m
[31m-void ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src);[m
[31m-ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src);[m
[31m-ngx_int_t ngx_decode_base64url(ngx_str_t *dst, ngx_str_t *src);[m
[31m-[m
[31m-uint32_t ngx_utf8_decode(u_char **p, size_t n);[m
[31m-size_t ngx_utf8_length(u_char *p, size_t n);[m
[31m-u_char *ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len);[m
[31m-[m
[31m-[m
[31m-#define NGX_ESCAPE_URI            0[m
[31m-#define NGX_ESCAPE_ARGS           1[m
[31m-#define NGX_ESCAPE_URI_COMPONENT  2[m
[31m-#define NGX_ESCAPE_HTML           3[m
[31m-#define NGX_ESCAPE_REFRESH        4[m
[31m-#define NGX_ESCAPE_MEMCACHED      5[m
[31m-#define NGX_ESCAPE_MAIL_AUTH      6[m
[31m-[m
[31m-#define NGX_UNESCAPE_URI       1[m
[31m-#define NGX_UNESCAPE_REDIRECT  2[m
[31m-[m
[31m-uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,[m
[31m-    ngx_uint_t type);[m
[31m-void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);[m
[31m-uintptr_t ngx_escape_html(u_char *dst, u_char *src, size_t size);[m
[31m-uintptr_t ngx_escape_json(u_char *dst, u_char *src, size_t size);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_node_t         node;[m
[31m-    ngx_str_t                 str;[m
[31m-} ngx_str_node_t;[m
[31m-[m
[31m-[m
[31m-void ngx_str_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-ngx_str_node_t *ngx_str_rbtree_lookup(ngx_rbtree_t *rbtree, ngx_str_t *name,[m
[31m-    uint32_t hash);[m
[31m-[m
[31m-[m
[31m-void ngx_sort(void *base, size_t n, size_t size,[m
[31m-    ngx_int_t (*cmp)(const void *, const void *));[m
[31m-#define ngx_qsort             qsort[m
[31m-[m
[31m-[m
[31m-#define ngx_value_helper(n)   #n[m
[31m-#define ngx_value(n)          ngx_value_helper(n)[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STRING_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_syslog.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_syslog.c[m
[1mdeleted file mode 100644[m
[1mindex 0a67928..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_syslog.c[m
[1m+++ /dev/null[m
[36m@@ -1,382 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_SYSLOG_MAX_STR                                                    \[m
[31m-    NGX_MAX_ERROR_STR + sizeof("<255>Jan 01 00:00:00 ") - 1                   \[m
[31m-    + (NGX_MAXHOSTNAMELEN - 1) + 1 /* space */                                \[m
[31m-    + 32 /* tag */ + 2 /* colon, space */[m
[31m-[m
[31m-[m
[31m-static char *ngx_syslog_parse_args(ngx_conf_t *cf, ngx_syslog_peer_t *peer);[m
[31m-static ngx_int_t ngx_syslog_init_peer(ngx_syslog_peer_t *peer);[m
[31m-static void ngx_syslog_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-static char  *facilities[] = {[m
[31m-    "kern", "user", "mail", "daemon", "auth", "intern", "lpr", "news", "uucp",[m
[31m-    "clock", "authpriv", "ftp", "ntp", "audit", "alert", "cron", "local0",[m
[31m-    "local1", "local2", "local3", "local4", "local5", "local6", "local7",[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-/* note 'error/warn' like in nginx.conf, not 'err/warning' */[m
[31m-static char  *severities[] = {[m
[31m-    "emerg", "alert", "crit", "error", "warn", "notice", "info", "debug", NULL[m
[31m-};[m
[31m-[m
[31m-static ngx_log_t    ngx_syslog_dummy_log;[m
[31m-static ngx_event_t  ngx_syslog_dummy_event;[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_syslog_process_conf(ngx_conf_t *cf, ngx_syslog_peer_t *peer)[m
[31m-{[m
[31m-    peer->pool = cf->pool;[m
[31m-    peer->facility = NGX_CONF_UNSET_UINT;[m
[31m-    peer->severity = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    if (ngx_syslog_parse_args(cf, peer) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (peer->server.sockaddr == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no syslog server specified");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (peer->facility == NGX_CONF_UNSET_UINT) {[m
[31m-        peer->facility = 23; /* local7 */[m
[31m-    }[m
[31m-[m
[31m-    if (peer->severity == NGX_CONF_UNSET_UINT) {[m
[31m-        peer->severity = 6; /* info */[m
[31m-    }[m
[31m-[m
[31m-    if (peer->tag.data == NULL) {[m
[31m-        ngx_str_set(&peer->tag, "nginx");[m
[31m-    }[m
[31m-[m
[31m-    peer->conn.fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_syslog_parse_args(ngx_conf_t *cf, ngx_syslog_peer_t *peer)[m
[31m-{[m
[31m-    u_char      *p, *comma, c;[m
[31m-    size_t       len;[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_url_t    u;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    p = value[1].data + sizeof("syslog:") - 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        comma = (u_char *) ngx_strchr(p, ',');[m
[31m-[m
[31m-        if (comma != NULL) {[m
[31m-            len = comma - p;[m
[31m-            *comma = '\0';[m
[31m-[m
[31m-        } else {[m
[31m-            len = value[1].data + value[1].len - p;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(p, "server=", 7) == 0) {[m
[31m-[m
[31m-            if (peer->server.sockaddr != NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "duplicate syslog \"server\"");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-            u.url.data = p + 7;[m
[31m-            u.url.len = len - 7;[m
[31m-            u.default_port = 514;[m
[31m-[m
[31m-            if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-                if (u.err) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "%s in syslog server \"%V\"",[m
[31m-                                       u.err, &u.url);[m
[31m-                }[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            peer->server = u.addrs[0];[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "facility=", 9) == 0) {[m
[31m-[m
[31m-            if (peer->facility != NGX_CONF_UNSET_UINT) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "duplicate syslog \"facility\"");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; facilities[i] != NULL; i++) {[m
[31m-[m
[31m-                if (ngx_strcmp(p + 9, facilities[i]) == 0) {[m
[31m-                    peer->facility = i;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "unknown syslog facility \"%s\"", p + 9);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "severity=", 9) == 0) {[m
[31m-[m
[31m-            if (peer->severity != NGX_CONF_UNSET_UINT) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "duplicate syslog \"severity\"");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; severities[i] != NULL; i++) {[m
[31m-[m
[31m-                if (ngx_strcmp(p + 9, severities[i]) == 0) {[m
[31m-                    peer->severity = i;[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "unknown syslog severity \"%s\"", p + 9);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-[m
[31m-        } else if (ngx_strncmp(p, "tag=", 4) == 0) {[m
[31m-[m
[31m-            if (peer->tag.data != NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "duplicate syslog \"tag\"");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * RFC 3164: the TAG is a string of ABNF alphanumeric characters[m
[31m-             * that MUST NOT exceed 32 characters.[m
[31m-             */[m
[31m-            if (len - 4 > 32) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "syslog tag length exceeds 32");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            for (i = 4; i < len; i++) {[m
[31m-                c = ngx_tolower(p[i]);[m
[31m-[m
[31m-                if (c < '0' || (c > '9' && c < 'a' && c != '_') || c > 'z') {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "syslog \"tag\" only allows "[m
[31m-                                       "alphanumeric characters "[m
[31m-                                       "and underscore");[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            peer->tag.data = p + 4;[m
[31m-            peer->tag.len = len - 4;[m
[31m-[m
[31m-        } else if (len == 10 && ngx_strncmp(p, "nohostname", 10) == 0) {[m
[31m-            peer->nohostname = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "unknown syslog parameter \"%s\"", p);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        if (comma == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        p = comma + 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_syslog_add_header(ngx_syslog_peer_t *peer, u_char *buf)[m
[31m-{[m
[31m-    ngx_uint_t  pri;[m
[31m-[m
[31m-    pri = peer->facility * 8 + peer->severity;[m
[31m-[m
[31m-    if (peer->nohostname) {[m
[31m-        return ngx_sprintf(buf, "<%ui>%V %V: ", pri, &ngx_cached_syslog_time,[m
[31m-                           &peer->tag);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_sprintf(buf, "<%ui>%V %V %V: ", pri, &ngx_cached_syslog_time,[m
[31m-                       &ngx_cycle->hostname, &peer->tag);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_syslog_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    u_char             *p, msg[NGX_SYSLOG_MAX_STR];[m
[31m-    ngx_uint_t          head_len;[m
[31m-    ngx_syslog_peer_t  *peer;[m
[31m-[m
[31m-    peer = log->wdata;[m
[31m-[m
[31m-    if (peer->busy) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    peer->busy = 1;[m
[31m-    peer->severity = level - 1;[m
[31m-[m
[31m-    p = ngx_syslog_add_header(peer, msg);[m
[31m-    head_len = p - msg;[m
[31m-[m
[31m-    len -= NGX_LINEFEED_SIZE;[m
[31m-[m
[31m-    if (len > NGX_SYSLOG_MAX_STR - head_len) {[m
[31m-        len = NGX_SYSLOG_MAX_STR - head_len;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(p, len, "%s", buf);[m
[31m-[m
[31m-    (void) ngx_syslog_send(peer, msg, p - msg);[m
[31m-[m
[31m-    peer->busy = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len)[m
[31m-{[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    if (peer->conn.fd == (ngx_socket_t) -1) {[m
[31m-        if (ngx_syslog_init_peer(peer) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* log syslog socket events with valid log */[m
[31m-    peer->conn.log = ngx_cycle->log;[m
[31m-[m
[31m-    if (ngx_send) {[m
[31m-        n = ngx_send(&peer->conn, buf, len);[m
[31m-[m
[31m-    } else {[m
[31m-        /* event module has not yet set ngx_io */[m
[31m-        n = ngx_os_io.send(&peer->conn, buf, len);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    if (n == NGX_ERROR && peer->server.sockaddr->sa_family == AF_UNIX) {[m
[31m-[m
[31m-        if (ngx_close_socket(peer->conn.fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " failed");[m
[31m-        }[m
[31m-[m
[31m-        peer->conn.fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_syslog_init_peer(ngx_syslog_peer_t *peer)[m
[31m-{[m
[31m-    ngx_socket_t         fd;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    peer->conn.read = &ngx_syslog_dummy_event;[m
[31m-    peer->conn.write = &ngx_syslog_dummy_event;[m
[31m-[m
[31m-    ngx_syslog_dummy_event.log = &ngx_syslog_dummy_log;[m
[31m-[m
[31m-    fd = ngx_socket(peer->server.sockaddr->sa_family, SOCK_DGRAM, 0);[m
[31m-    if (fd == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (connect(fd, peer->server.sockaddr, peer->server.socklen) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      "connect() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(peer->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln->data = peer;[m
[31m-    cln->handler = ngx_syslog_cleanup;[m
[31m-[m
[31m-    peer->conn.fd = fd;[m
[31m-[m
[31m-    /* UDP sockets are always ready to write */[m
[31m-    peer->conn.write->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_socket(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_syslog_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_syslog_peer_t  *peer = data;[m
[31m-[m
[31m-    /* prevents further use of this peer */[m
[31m-    peer->busy = 1;[m
[31m-[m
[31m-    if (peer->conn.fd == (ngx_socket_t) -1) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_socket(peer->conn.fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_syslog.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_syslog.h[m
[1mdeleted file mode 100644[m
[1mindex cc4c842..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_syslog.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SYSLOG_H_INCLUDED_[m
[31m-#define _NGX_SYSLOG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_pool_t       *pool;[m
[31m-    ngx_uint_t        facility;[m
[31m-    ngx_uint_t        severity;[m
[31m-    ngx_str_t         tag;[m
[31m-[m
[31m-    ngx_addr_t        server;[m
[31m-    ngx_connection_t  conn;[m
[31m-    unsigned          busy:1;[m
[31m-    unsigned          nohostname:1;[m
[31m-} ngx_syslog_peer_t;[m
[31m-[m
[31m-[m
[31m-char *ngx_syslog_process_conf(ngx_conf_t *cf, ngx_syslog_peer_t *peer);[m
[31m-u_char *ngx_syslog_add_header(ngx_syslog_peer_t *peer, u_char *buf);[m
[31m-void ngx_syslog_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf,[m
[31m-    size_t len);[m
[31m-ssize_t ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SYSLOG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_thread_pool.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_thread_pool.c[m
[1mdeleted file mode 100644[m
[1mindex f3655aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_thread_pool.c[m
[1m+++ /dev/null[m
[36m@@ -1,634 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_thread_pool.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t               pools;[m
[31m-} ngx_thread_pool_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_thread_task_t        *first;[m
[31m-    ngx_thread_task_t       **last;[m
[31m-} ngx_thread_pool_queue_t;[m
[31m-[m
[31m-#define ngx_thread_pool_queue_init(q)                                         \[m
[31m-    (q)->first = NULL;                                                        \[m
[31m-    (q)->last = &(q)->first[m
[31m-[m
[31m-[m
[31m-struct ngx_thread_pool_s {[m
[31m-    ngx_thread_mutex_t        mtx;[m
[31m-    ngx_thread_pool_queue_t   queue;[m
[31m-    ngx_int_t                 waiting;[m
[31m-    ngx_thread_cond_t         cond;[m
[31m-[m
[31m-    ngx_log_t                *log;[m
[31m-[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_uint_t                threads;[m
[31m-    ngx_int_t                 max_queue;[m
[31m-[m
[31m-    u_char                   *file;[m
[31m-    ngx_uint_t                line;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log,[m
[31m-    ngx_pool_t *pool);[m
[31m-static void ngx_thread_pool_destroy(ngx_thread_pool_t *tp);[m
[31m-static void ngx_thread_pool_exit_handler(void *data, ngx_log_t *log);[m
[31m-[m
[31m-static void *ngx_thread_pool_cycle(void *data);[m
[31m-static void ngx_thread_pool_handler(ngx_event_t *ev);[m
[31m-[m
[31m-static char *ngx_thread_pool(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-static void *ngx_thread_pool_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_thread_pool_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static ngx_int_t ngx_thread_pool_init_worker(ngx_cycle_t *cycle);[m
[31m-static void ngx_thread_pool_exit_worker(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_thread_pool_commands[] = {[m
[31m-[m
[31m-    { ngx_string("thread_pool"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE23,[m
[31m-      ngx_thread_pool,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_thread_pool_module_ctx = {[m
[31m-    ngx_string("thread_pool"),[m
[31m-    ngx_thread_pool_create_conf,[m
[31m-    ngx_thread_pool_init_conf[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_thread_pool_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_thread_pool_module_ctx,           /* module context */[m
[31m-    ngx_thread_pool_commands,              /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    ngx_thread_pool_init_worker,           /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    ngx_thread_pool_exit_worker,           /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_thread_pool_default = ngx_string("default");[m
[31m-[m
[31m-static ngx_uint_t               ngx_thread_pool_task_id;[m
[31m-static ngx_atomic_t             ngx_thread_pool_done_lock;[m
[31m-static ngx_thread_pool_queue_t  ngx_thread_pool_done;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log, ngx_pool_t *pool)[m
[31m-{[m
[31m-    int             err;[m
[31m-    pthread_t       tid;[m
[31m-    ngx_uint_t      n;[m
[31m-    pthread_attr_t  attr;[m
[31m-[m
[31m-    if (ngx_notify == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-               "the configured event method cannot be used with thread pools");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_thread_pool_queue_init(&tp->queue);[m
[31m-[m
[31m-    if (ngx_thread_mutex_create(&tp->mtx, log) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_thread_cond_create(&tp->cond, log) != NGX_OK) {[m
[31m-        (void) ngx_thread_mutex_destroy(&tp->mtx, log);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tp->log = log;[m
[31m-[m
[31m-    err = pthread_attr_init(&attr);[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "pthread_attr_init() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    err = pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "pthread_attr_setstacksize() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    for (n = 0; n < tp->threads; n++) {[m
[31m-        err = pthread_create(&tid, &attr, ngx_thread_pool_cycle, tp);[m
[31m-        if (err) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "pthread_create() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    (void) pthread_attr_destroy(&attr);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_pool_destroy(ngx_thread_pool_t *tp)[m
[31m-{[m
[31m-    ngx_uint_t           n;[m
[31m-    ngx_thread_task_t    task;[m
[31m-    volatile ngx_uint_t  lock;[m
[31m-[m
[31m-    ngx_memzero(&task, sizeof(ngx_thread_task_t));[m
[31m-[m
[31m-    task.handler = ngx_thread_pool_exit_handler;[m
[31m-    task.ctx = (void *) &lock;[m
[31m-[m
[31m-    for (n = 0; n < tp->threads; n++) {[m
[31m-        lock = 1;[m
[31m-[m
[31m-        if (ngx_thread_task_post(tp, &task) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        while (lock) {[m
[31m-            ngx_sched_yield();[m
[31m-        }[m
[31m-[m
[31m-        task.event.active = 0;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_thread_cond_destroy(&tp->cond, tp->log);[m
[31m-[m
[31m-    (void) ngx_thread_mutex_destroy(&tp->mtx, tp->log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_pool_exit_handler(void *data, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t *lock = data;[m
[31m-[m
[31m-    *lock = 0;[m
[31m-[m
[31m-    pthread_exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_thread_task_t *[m
[31m-ngx_thread_task_alloc(ngx_pool_t *pool, size_t size)[m
[31m-{[m
[31m-    ngx_thread_task_t  *task;[m
[31m-[m
[31m-    task = ngx_pcalloc(pool, sizeof(ngx_thread_task_t) + size);[m
[31m-    if (task == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    task->ctx = task + 1;[m
[31m-[m
[31m-    return task;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_task_post(ngx_thread_pool_t *tp, ngx_thread_task_t *task)[m
[31m-{[m
[31m-    if (task->event.active) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, tp->log, 0,[m
[31m-                      "task #%ui already active", task->id);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_thread_mutex_lock(&tp->mtx, tp->log) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (tp->waiting >= tp->max_queue) {[m
[31m-        (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, tp->log, 0,[m
[31m-                      "thread pool \"%V\" queue overflow: %i tasks waiting",[m
[31m-                      &tp->name, tp->waiting);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    task->event.active = 1;[m
[31m-[m
[31m-    task->id = ngx_thread_pool_task_id++;[m
[31m-    task->next = NULL;[m
[31m-[m
[31m-    if (ngx_thread_cond_signal(&tp->cond, tp->log) != NGX_OK) {[m
[31m-        (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *tp->queue.last = task;[m
[31m-    tp->queue.last = &task->next;[m
[31m-[m
[31m-    tp->waiting++;[m
[31m-[m
[31m-    (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0,[m
[31m-                   "task #%ui added to thread pool \"%V\"",[m
[31m-                   task->id, &tp->name);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_thread_pool_cycle(void *data)[m
[31m-{[m
[31m-    ngx_thread_pool_t *tp = data;[m
[31m-[m
[31m-    int                 err;[m
[31m-    sigset_t            set;[m
[31m-    ngx_thread_task_t  *task;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, tp->log, 0,[m
[31m-                   "thread in pool \"%V\" started", &tp->name);[m
[31m-[m
[31m-    sigfillset(&set);[m
[31m-[m
[31m-    sigdelset(&set, SIGILL);[m
[31m-    sigdelset(&set, SIGFPE);[m
[31m-    sigdelset(&set, SIGSEGV);[m
[31m-    sigdelset(&set, SIGBUS);[m
[31m-[m
[31m-    err = pthread_sigmask(SIG_BLOCK, &set, NULL);[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, tp->log, err, "pthread_sigmask() failed");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (ngx_thread_mutex_lock(&tp->mtx, tp->log) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        /* the number may become negative */[m
[31m-        tp->waiting--;[m
[31m-[m
[31m-        while (tp->queue.first == NULL) {[m
[31m-            if (ngx_thread_cond_wait(&tp->cond, &tp->mtx, tp->log)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        task = tp->queue.first;[m
[31m-        tp->queue.first = task->next;[m
[31m-[m
[31m-        if (tp->queue.first == NULL) {[m
[31m-            tp->queue.last = &tp->queue.first;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_thread_mutex_unlock(&tp->mtx, tp->log) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0,[m
[31m-                       "run task #%ui in thread pool \"%V\"",[m
[31m-                       task->id, &tp->name);[m
[31m-[m
[31m-        task->handler(task->ctx, tp->log);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0,[m
[31m-                       "complete task #%ui in thread pool \"%V\"",[m
[31m-                       task->id, &tp->name);[m
[31m-[m
[31m-        task->next = NULL;[m
[31m-[m
[31m-        ngx_spinlock(&ngx_thread_pool_done_lock, 1, 2048);[m
[31m-[m
[31m-        *ngx_thread_pool_done.last = task;[m
[31m-        ngx_thread_pool_done.last = &task->next;[m
[31m-[m
[31m-        ngx_memory_barrier();[m
[31m-[m
[31m-        ngx_unlock(&ngx_thread_pool_done_lock);[m
[31m-[m
[31m-        (void) ngx_notify(ngx_thread_pool_handler);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_pool_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_t        *event;[m
[31m-    ngx_thread_task_t  *task;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "thread pool handler");[m
[31m-[m
[31m-    ngx_spinlock(&ngx_thread_pool_done_lock, 1, 2048);[m
[31m-[m
[31m-    task = ngx_thread_pool_done.first;[m
[31m-    ngx_thread_pool_done.first = NULL;[m
[31m-    ngx_thread_pool_done.last = &ngx_thread_pool_done.first;[m
[31m-[m
[31m-    ngx_memory_barrier();[m
[31m-[m
[31m-    ngx_unlock(&ngx_thread_pool_done_lock);[m
[31m-[m
[31m-    while (task) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                       "run completion handler for task #%ui", task->id);[m
[31m-[m
[31m-        event = &task->event;[m
[31m-        task = task->next;[m
[31m-[m
[31m-        event->complete = 1;[m
[31m-        event->active = 0;[m
[31m-[m
[31m-        event->handler(event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_thread_pool_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_thread_pool_conf_t  *tcf;[m
[31m-[m
[31m-    tcf = ngx_pcalloc(cycle->pool, sizeof(ngx_thread_pool_conf_t));[m
[31m-    if (tcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&tcf->pools, cycle->pool, 4,[m
[31m-                       sizeof(ngx_thread_pool_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return tcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_thread_pool_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_thread_pool_conf_t *tcf = conf;[m
[31m-[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_thread_pool_t  **tpp;[m
[31m-[m
[31m-    tpp = tcf->pools.elts;[m
[31m-[m
[31m-    for (i = 0; i < tcf->pools.nelts; i++) {[m
[31m-[m
[31m-        if (tpp[i]->threads) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (tpp[i]->name.len == ngx_thread_pool_default.len[m
[31m-            && ngx_strncmp(tpp[i]->name.data, ngx_thread_pool_default.data,[m
[31m-                           ngx_thread_pool_default.len)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            tpp[i]->threads = 32;[m
[31m-            tpp[i]->max_queue = 65536;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "unknown thread pool \"%V\" in %s:%ui",[m
[31m-                      &tpp[i]->name, tpp[i]->file, tpp[i]->line);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_thread_pool(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t          *value;[m
[31m-    ngx_uint_t          i;[m
[31m-    ngx_thread_pool_t  *tp;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    tp = ngx_thread_pool_add(cf, &value[1]);[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (tp->threads) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate thread pool \"%V\"", &tp->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tp->max_queue = 65536;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "threads=", 8) == 0) {[m
[31m-[m
[31m-            tp->threads = ngx_atoi(value[i].data + 8, value[i].len - 8);[m
[31m-[m
[31m-            if (tp->threads == (ngx_uint_t) NGX_ERROR || tp->threads == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid threads value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_queue=", 10) == 0) {[m
[31m-[m
[31m-            tp->max_queue = ngx_atoi(value[i].data + 10, value[i].len - 10);[m
[31m-[m
[31m-            if (tp->max_queue == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid max_queue value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (tp->threads == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"threads\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_thread_pool_t *[m
[31m-ngx_thread_pool_add(ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_thread_pool_t       *tp, **tpp;[m
[31m-    ngx_thread_pool_conf_t  *tcf;[m
[31m-[m
[31m-    if (name == NULL) {[m
[31m-        name = &ngx_thread_pool_default;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_thread_pool_get(cf->cycle, name);[m
[31m-[m
[31m-    if (tp) {[m
[31m-        return tp;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_pcalloc(cf->pool, sizeof(ngx_thread_pool_t));[m
[31m-    if (tp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    tp->name = *name;[m
[31m-    tp->file = cf->conf_file->file.name.data;[m
[31m-    tp->line = cf->conf_file->line;[m
[31m-[m
[31m-    tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cf->cycle->conf_ctx,[m
[31m-                                                  ngx_thread_pool_module);[m
[31m-[m
[31m-    tpp = ngx_array_push(&tcf->pools);[m
[31m-    if (tpp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *tpp = tp;[m
[31m-[m
[31m-    return tp;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_thread_pool_t *[m
[31m-ngx_thread_pool_get(ngx_cycle_t *cycle, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_thread_pool_t       **tpp;[m
[31m-    ngx_thread_pool_conf_t   *tcf;[m
[31m-[m
[31m-    tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                  ngx_thread_pool_module);[m
[31m-[m
[31m-    tpp = tcf->pools.elts;[m
[31m-[m
[31m-    for (i = 0; i < tcf->pools.nelts; i++) {[m
[31m-[m
[31m-        if (tpp[i]->name.len == name->len[m
[31m-            && ngx_strncmp(tpp[i]->name.data, name->data, name->len) == 0)[m
[31m-        {[m
[31m-            return tpp[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_thread_pool_init_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_thread_pool_t       **tpp;[m
[31m-    ngx_thread_pool_conf_t   *tcf;[m
[31m-[m
[31m-    if (ngx_process != NGX_PROCESS_WORKER[m
[31m-        && ngx_process != NGX_PROCESS_SINGLE)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                  ngx_thread_pool_module);[m
[31m-[m
[31m-    if (tcf == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_thread_pool_queue_init(&ngx_thread_pool_done);[m
[31m-[m
[31m-    tpp = tcf->pools.elts;[m
[31m-[m
[31m-    for (i = 0; i < tcf->pools.nelts; i++) {[m
[31m-        if (ngx_thread_pool_init(tpp[i], cycle->log, cycle->pool) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_pool_exit_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_thread_pool_t       **tpp;[m
[31m-    ngx_thread_pool_conf_t   *tcf;[m
[31m-[m
[31m-    if (ngx_process != NGX_PROCESS_WORKER[m
[31m-        && ngx_process != NGX_PROCESS_SINGLE)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                  ngx_thread_pool_module);[m
[31m-[m
[31m-    if (tcf == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    tpp = tcf->pools.elts;[m
[31m-[m
[31m-    for (i = 0; i < tcf->pools.nelts; i++) {[m
[31m-        ngx_thread_pool_destroy(tpp[i]);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_thread_pool.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_thread_pool.h[m
[1mdeleted file mode 100644[m
[1mindex 5e5adf6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_thread_pool.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_THREAD_POOL_H_INCLUDED_[m
[31m-#define _NGX_THREAD_POOL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-struct ngx_thread_task_s {[m
[31m-    ngx_thread_task_t   *next;[m
[31m-    ngx_uint_t           id;[m
[31m-    void                *ctx;[m
[31m-    void               (*handler)(void *data, ngx_log_t *log);[m
[31m-    ngx_event_t          event;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_thread_pool_s  ngx_thread_pool_t;[m
[31m-[m
[31m-[m
[31m-ngx_thread_pool_t *ngx_thread_pool_add(ngx_conf_t *cf, ngx_str_t *name);[m
[31m-ngx_thread_pool_t *ngx_thread_pool_get(ngx_cycle_t *cycle, ngx_str_t *name);[m
[31m-[m
[31m-ngx_thread_task_t *ngx_thread_task_alloc(ngx_pool_t *pool, size_t size);[m
[31m-ngx_int_t ngx_thread_task_post(ngx_thread_pool_t *tp, ngx_thread_task_t *task);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_THREAD_POOL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_times.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_times.c[m
[1mdeleted file mode 100644[m
[1mindex 843314a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_times.c[m
[1m+++ /dev/null[m
[36m@@ -1,428 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The time may be updated by signal handler or by several threads.[m
[31m- * The time update operations are rare and require to hold the ngx_time_lock.[m
[31m- * The time read operations are frequent, so they are lock-free and get time[m
[31m- * values and strings from the current slot.  Thus thread may get the corrupted[m
[31m- * values only if it is preempted while copying and then it is not scheduled[m
[31m- * to run more than NGX_TIME_SLOTS seconds.[m
[31m- */[m
[31m-[m
[31m-#define NGX_TIME_SLOTS   64[m
[31m-[m
[31m-static ngx_uint_t        slot;[m
[31m-static ngx_atomic_t      ngx_time_lock;[m
[31m-[m
[31m-volatile ngx_msec_t      ngx_current_msec;[m
[31m-volatile ngx_time_t     *ngx_cached_time;[m
[31m-volatile ngx_str_t       ngx_cached_err_log_time;[m
[31m-volatile ngx_str_t       ngx_cached_http_time;[m
[31m-volatile ngx_str_t       ngx_cached_http_log_time;[m
[31m-volatile ngx_str_t       ngx_cached_http_log_iso8601;[m
[31m-volatile ngx_str_t       ngx_cached_syslog_time;[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-/*[m
[31m- * localtime() and localtime_r() are not Async-Signal-Safe functions, therefore,[m
[31m- * they must not be called by a signal handler, so we use the cached[m
[31m- * GMT offset value. Fortunately the value is changed only two times a year.[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t         cached_gmtoff;[m
[31m-#endif[m
[31m-[m
[31m-static ngx_time_t        cached_time[NGX_TIME_SLOTS];[m
[31m-static u_char            cached_err_log_time[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("1970/09/28 12:00:00")];[m
[31m-static u_char            cached_http_time[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("Mon, 28 Sep 1970 06:00:00 GMT")];[m
[31m-static u_char            cached_http_log_time[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("28/Sep/1970:12:00:00 +0600")];[m
[31m-static u_char            cached_http_log_iso8601[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("1970-09-28T12:00:00+06:00")];[m
[31m-static u_char            cached_syslog_time[NGX_TIME_SLOTS][m
[31m-                                    [sizeof("Sep 28 12:00:00")];[m
[31m-[m
[31m-[m
[31m-static char  *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };[m
[31m-static char  *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",[m
[31m-                           "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };[m
[31m-[m
[31m-void[m
[31m-ngx_time_init(void)[m
[31m-{[m
[31m-    ngx_cached_err_log_time.len = sizeof("1970/09/28 12:00:00") - 1;[m
[31m-    ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1;[m
[31m-    ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1;[m
[31m-    ngx_cached_http_log_iso8601.len = sizeof("1970-09-28T12:00:00+06:00") - 1;[m
[31m-    ngx_cached_syslog_time.len = sizeof("Sep 28 12:00:00") - 1;[m
[31m-[m
[31m-    ngx_cached_time = &cached_time[0];[m
[31m-[m
[31m-    ngx_time_update();[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_time_update(void)[m
[31m-{[m
[31m-    u_char          *p0, *p1, *p2, *p3, *p4;[m
[31m-    ngx_tm_t         tm, gmt;[m
[31m-    time_t           sec;[m
[31m-    ngx_uint_t       msec;[m
[31m-    ngx_time_t      *tp;[m
[31m-    struct timeval   tv;[m
[31m-[m
[31m-    if (!ngx_trylock(&ngx_time_lock)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_gettimeofday(&tv);[m
[31m-[m
[31m-    sec = tv.tv_sec;[m
[31m-    msec = tv.tv_usec / 1000;[m
[31m-[m
[31m-    ngx_current_msec = (ngx_msec_t) sec * 1000 + msec;[m
[31m-[m
[31m-    tp = &cached_time[slot];[m
[31m-[m
[31m-    if (tp->sec == sec) {[m
[31m-        tp->msec = msec;[m
[31m-        ngx_unlock(&ngx_time_lock);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (slot == NGX_TIME_SLOTS - 1) {[m
[31m-        slot = 0;[m
[31m-    } else {[m
[31m-        slot++;[m
[31m-    }[m
[31m-[m
[31m-    tp = &cached_time[slot];[m
[31m-[m
[31m-    tp->sec = sec;[m
[31m-    tp->msec = msec;[m
[31m-[m
[31m-    ngx_gmtime(sec, &gmt);[m
[31m-[m
[31m-[m
[31m-    p0 = &cached_http_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p0, "%s, %02d %s %4d %02d:%02d:%02d GMT",[m
[31m-                       week[gmt.ngx_tm_wday], gmt.ngx_tm_mday,[m
[31m-                       months[gmt.ngx_tm_mon - 1], gmt.ngx_tm_year,[m
[31m-                       gmt.ngx_tm_hour, gmt.ngx_tm_min, gmt.ngx_tm_sec);[m
[31m-[m
[31m-#if (NGX_HAVE_GETTIMEZONE)[m
[31m-[m
[31m-    tp->gmtoff = ngx_gettimezone();[m
[31m-    ngx_gmtime(sec + tp->gmtoff * 60, &tm);[m
[31m-[m
[31m-#elif (NGX_HAVE_GMTOFF)[m
[31m-[m
[31m-    ngx_localtime(sec, &tm);[m
[31m-    cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60);[m
[31m-    tp->gmtoff = cached_gmtoff;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_localtime(sec, &tm);[m
[31m-    cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst);[m
[31m-    tp->gmtoff = cached_gmtoff;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-    p1 = &cached_err_log_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p1, "%4d/%02d/%02d %02d:%02d:%02d",[m
[31m-                       tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                       tm.ngx_tm_mday, tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-[m
[31m-    p2 = &cached_http_log_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p2, "%02d/%s/%d:%02d:%02d:%02d %c%02i%02i",[m
[31m-                       tm.ngx_tm_mday, months[tm.ngx_tm_mon - 1],[m
[31m-                       tm.ngx_tm_year, tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min, tm.ngx_tm_sec,[m
[31m-                       tp->gmtoff < 0 ? '-' : '+',[m
[31m-                       ngx_abs(tp->gmtoff / 60), ngx_abs(tp->gmtoff % 60));[m
[31m-[m
[31m-    p3 = &cached_http_log_iso8601[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p3, "%4d-%02d-%02dT%02d:%02d:%02d%c%02i:%02i",[m
[31m-                       tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                       tm.ngx_tm_mday, tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min, tm.ngx_tm_sec,[m
[31m-                       tp->gmtoff < 0 ? '-' : '+',[m
[31m-                       ngx_abs(tp->gmtoff / 60), ngx_abs(tp->gmtoff % 60));[m
[31m-[m
[31m-    p4 = &cached_syslog_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p4, "%s %2d %02d:%02d:%02d",[m
[31m-                       months[tm.ngx_tm_mon - 1], tm.ngx_tm_mday,[m
[31m-                       tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-    ngx_memory_barrier();[m
[31m-[m
[31m-    ngx_cached_time = tp;[m
[31m-    ngx_cached_http_time.data = p0;[m
[31m-    ngx_cached_err_log_time.data = p1;[m
[31m-    ngx_cached_http_log_time.data = p2;[m
[31m-    ngx_cached_http_log_iso8601.data = p3;[m
[31m-    ngx_cached_syslog_time.data = p4;[m
[31m-[m
[31m-    ngx_unlock(&ngx_time_lock);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-void[m
[31m-ngx_time_sigsafe_update(void)[m
[31m-{[m
[31m-    u_char          *p, *p2;[m
[31m-    ngx_tm_t         tm;[m
[31m-    time_t           sec;[m
[31m-    ngx_time_t      *tp;[m
[31m-    struct timeval   tv;[m
[31m-[m
[31m-    if (!ngx_trylock(&ngx_time_lock)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_gettimeofday(&tv);[m
[31m-[m
[31m-    sec = tv.tv_sec;[m
[31m-[m
[31m-    tp = &cached_time[slot];[m
[31m-[m
[31m-    if (tp->sec == sec) {[m
[31m-        ngx_unlock(&ngx_time_lock);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (slot == NGX_TIME_SLOTS - 1) {[m
[31m-        slot = 0;[m
[31m-    } else {[m
[31m-        slot++;[m
[31m-    }[m
[31m-[m
[31m-    tp = &cached_time[slot];[m
[31m-[m
[31m-    tp->sec = 0;[m
[31m-[m
[31m-    ngx_gmtime(sec + cached_gmtoff * 60, &tm);[m
[31m-[m
[31m-    p = &cached_err_log_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p, "%4d/%02d/%02d %02d:%02d:%02d",[m
[31m-                       tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                       tm.ngx_tm_mday, tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-    p2 = &cached_syslog_time[slot][0];[m
[31m-[m
[31m-    (void) ngx_sprintf(p2, "%s %2d %02d:%02d:%02d",[m
[31m-                       months[tm.ngx_tm_mon - 1], tm.ngx_tm_mday,[m
[31m-                       tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-    ngx_memory_barrier();[m
[31m-[m
[31m-    ngx_cached_err_log_time.data = p;[m
[31m-    ngx_cached_syslog_time.data = p2;[m
[31m-[m
[31m-    ngx_unlock(&ngx_time_lock);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_time(u_char *buf, time_t t)[m
[31m-{[m
[31m-    ngx_tm_t  tm;[m
[31m-[m
[31m-    ngx_gmtime(t, &tm);[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%s, %02d %s %4d %02d:%02d:%02d GMT",[m
[31m-                       week[tm.ngx_tm_wday],[m
[31m-                       tm.ngx_tm_mday,[m
[31m-                       months[tm.ngx_tm_mon - 1],[m
[31m-                       tm.ngx_tm_year,[m
[31m-                       tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min,[m
[31m-                       tm.ngx_tm_sec);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_cookie_time(u_char *buf, time_t t)[m
[31m-{[m
[31m-    ngx_tm_t  tm;[m
[31m-[m
[31m-    ngx_gmtime(t, &tm);[m
[31m-[m
[31m-    /*[m
[31m-     * Netscape 3.x does not understand 4-digit years at all and[m
[31m-     * 2-digit years more than "37"[m
[31m-     */[m
[31m-[m
[31m-    return ngx_sprintf(buf,[m
[31m-                       (tm.ngx_tm_year > 2037) ?[m
[31m-                                         "%s, %02d-%s-%d %02d:%02d:%02d GMT":[m
[31m-                                         "%s, %02d-%s-%02d %02d:%02d:%02d GMT",[m
[31m-                       week[tm.ngx_tm_wday],[m
[31m-                       tm.ngx_tm_mday,[m
[31m-                       months[tm.ngx_tm_mon - 1],[m
[31m-                       (tm.ngx_tm_year > 2037) ? tm.ngx_tm_year:[m
[31m-                                                 tm.ngx_tm_year % 100,[m
[31m-                       tm.ngx_tm_hour,[m
[31m-                       tm.ngx_tm_min,[m
[31m-                       tm.ngx_tm_sec);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_gmtime(time_t t, ngx_tm_t *tp)[m
[31m-{[m
[31m-    ngx_int_t   yday;[m
[31m-    ngx_uint_t  n, sec, min, hour, mday, mon, year, wday, days, leap;[m
[31m-[m
[31m-    /* the calculation is valid for positive time_t only */[m
[31m-[m
[31m-    n = (ngx_uint_t) t;[m
[31m-[m
[31m-    days = n / 86400;[m
[31m-[m
[31m-    /* January 1, 1970 was Thursday */[m
[31m-[m
[31m-    wday = (4 + days) % 7;[m
[31m-[m
[31m-    n %= 86400;[m
[31m-    hour = n / 3600;[m
[31m-    n %= 3600;[m
[31m-    min = n / 60;[m
[31m-    sec = n % 60;[m
[31m-[m
[31m-    /*[m
[31m-     * the algorithm based on Gauss' formula,[m
[31m-     * see src/http/ngx_http_parse_time.c[m
[31m-     */[m
[31m-[m
[31m-    /* days since March 1, 1 BC */[m
[31m-    days = days - (31 + 28) + 719527;[m
[31m-[m
[31m-    /*[m
[31m-     * The "days" should be adjusted to 1 only, however, some March 1st's go[m
[31m-     * to previous year, so we adjust them to 2.  This causes also shift of the[m
[31m-     * last February days to next year, but we catch the case when "yday"[m
[31m-     * becomes negative.[m
[31m-     */[m
[31m-[m
[31m-    year = (days + 2) * 400 / (365 * 400 + 100 - 4 + 1);[m
[31m-[m
[31m-    yday = days - (365 * year + year / 4 - year / 100 + year / 400);[m
[31m-[m
[31m-    if (yday < 0) {[m
[31m-        leap = (year % 4 == 0) && (year % 100 || (year % 400 == 0));[m
[31m-        yday = 365 + leap + yday;[m
[31m-        year--;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * The empirical formula that maps "yday" to month.[m
[31m-     * There are at least 10 variants, some of them are:[m
[31m-     *     mon = (yday + 31) * 15 / 459[m
[31m-     *     mon = (yday + 31) * 17 / 520[m
[31m-     *     mon = (yday + 31) * 20 / 612[m
[31m-     */[m
[31m-[m
[31m-    mon = (yday + 31) * 10 / 306;[m
[31m-[m
[31m-    /* the Gauss' formula that evaluates days before the month */[m
[31m-[m
[31m-    mday = yday - (367 * mon / 12 - 30) + 1;[m
[31m-[m
[31m-    if (yday >= 306) {[m
[31m-[m
[31m-        year++;[m
[31m-        mon -= 10;[m
[31m-[m
[31m-        /*[m
[31m-         * there is no "yday" in Win32 SYSTEMTIME[m
[31m-         *[m
[31m-         * yday -= 306;[m
[31m-         */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        mon += 2;[m
[31m-[m
[31m-        /*[m
[31m-         * there is no "yday" in Win32 SYSTEMTIME[m
[31m-         *[m
[31m-         * yday += 31 + 28 + leap;[m
[31m-         */[m
[31m-    }[m
[31m-[m
[31m-    tp->ngx_tm_sec = (ngx_tm_sec_t) sec;[m
[31m-    tp->ngx_tm_min = (ngx_tm_min_t) min;[m
[31m-    tp->ngx_tm_hour = (ngx_tm_hour_t) hour;[m
[31m-    tp->ngx_tm_mday = (ngx_tm_mday_t) mday;[m
[31m-    tp->ngx_tm_mon = (ngx_tm_mon_t) mon;[m
[31m-    tp->ngx_tm_year = (ngx_tm_year_t) year;[m
[31m-    tp->ngx_tm_wday = (ngx_tm_wday_t) wday;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-time_t[m
[31m-ngx_next_time(time_t when)[m
[31m-{[m
[31m-    time_t     now, next;[m
[31m-    struct tm  tm;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    ngx_libc_localtime(now, &tm);[m
[31m-[m
[31m-    tm.tm_hour = (int) (when / 3600);[m
[31m-    when %= 3600;[m
[31m-    tm.tm_min = (int) (when / 60);[m
[31m-    tm.tm_sec = (int) (when % 60);[m
[31m-[m
[31m-    next = mktime(&tm);[m
[31m-[m
[31m-    if (next == -1) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (next - now > 0) {[m
[31m-        return next;[m
[31m-    }[m
[31m-[m
[31m-    tm.tm_mday++;[m
[31m-[m
[31m-    /* mktime() should normalize a date (Jan 32, etc) */[m
[31m-[m
[31m-    next = mktime(&tm);[m
[31m-[m
[31m-    if (next != -1) {[m
[31m-        return next;[m
[31m-    }[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_times.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_times.h[m
[1mdeleted file mode 100644[m
[1mindex 94aedcd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/core/ngx_times.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_TIMES_H_INCLUDED_[m
[31m-#define _NGX_TIMES_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    time_t      sec;[m
[31m-    ngx_uint_t  msec;[m
[31m-    ngx_int_t   gmtoff;[m
[31m-} ngx_time_t;[m
[31m-[m
[31m-[m
[31m-void ngx_time_init(void);[m
[31m-void ngx_time_update(void);[m
[31m-void ngx_time_sigsafe_update(void);[m
[31m-u_char *ngx_http_time(u_char *buf, time_t t);[m
[31m-u_char *ngx_http_cookie_time(u_char *buf, time_t t);[m
[31m-void ngx_gmtime(time_t t, ngx_tm_t *tp);[m
[31m-[m
[31m-time_t ngx_next_time(time_t when);[m
[31m-#define ngx_next_time_n      "mktime()"[m
[31m-[m
[31m-[m
[31m-extern volatile ngx_time_t  *ngx_cached_time;[m
[31m-[m
[31m-#define ngx_time()           ngx_cached_time->sec[m
[31m-#define ngx_timeofday()      (ngx_time_t *) ngx_cached_time[m
[31m-[m
[31m-extern volatile ngx_str_t    ngx_cached_err_log_time;[m
[31m-extern volatile ngx_str_t    ngx_cached_http_time;[m
[31m-extern volatile ngx_str_t    ngx_cached_http_log_time;[m
[31m-extern volatile ngx_str_t    ngx_cached_http_log_iso8601;[m
[31m-extern volatile ngx_str_t    ngx_cached_syslog_time;[m
[31m-[m
[31m-/*[m
[31m- * milliseconds elapsed since epoch and truncated to ngx_msec_t,[m
[31m- * used in event timers[m
[31m- */[m
[31m-extern volatile ngx_msec_t  ngx_current_msec;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_TIMES_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/nginx.stp b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/nginx.stp[m
[1mdeleted file mode 100644[m
[1mindex e824daf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/nginx.stp[m
[1m+++ /dev/null[m
[36m@@ -1,299 +0,0 @@[m
[31m-/* tapset for nginx */[m
[31m-[m
[31m-[m
[31m-function ngx_indent(n, delta)[m
[31m-{[m
[31m-    s = ""[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        s .= delta[m
[31m-    }[m
[31m-[m
[31m-    return s[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_http_subreq_depth(r)[m
[31m-{[m
[31m-    depth = 0[m
[31m-[m
[31m-    for (pr = @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->parent;[m
[31m-         pr != 0;[m
[31m-         pr = @cast(pr, "ngx_http_request_t", "NGX_SBIN_PATH")->parent)[m
[31m-    {[m
[31m-        depth++[m
[31m-    }[m
[31m-[m
[31m-    return depth[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_http_req_parent(r)[m
[31m-{[m
[31m-    return @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->parent[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* retrieve the request uri string from the ngx_http_request_t pointer */[m
[31m-function ngx_http_req_uri(r)[m
[31m-{[m
[31m-    len = @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->uri->len[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    return user_string_n(@cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->uri->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* retrieve the request query string from the ngx_http_request_t pointer */[m
[31m-function ngx_http_req_args(r)[m
[31m-{[m
[31m-    len = @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->args->len[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    return user_string_n(@cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->args->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* retrieve the first command name (or directive name) from[m
[31m- * the ngx_module_t pointer */[m
[31m-function ngx_http_module_cmd(m)[m
[31m-{[m
[31m-    cmds = @cast(m, "ngx_module_t", "NGX_SBIN_PATH")->commands[m
[31m-    if (cmds == 0) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    len = @cast(cmds, "ngx_command_t", "NGX_SBIN_PATH")->name->len[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    return user_string_n(@cast(cmds, "ngx_command_t", "NGX_SBIN_PATH")->name->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_chain_buf(cl)[m
[31m-{[m
[31m-    return @cast(cl, "ngx_chain_t", "NGX_SBIN_PATH")->buf[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_chain_next(cl)[m
[31m-{[m
[31m-    return @cast(cl, "ngx_chain_t", "NGX_SBIN_PATH")->next[m
[31m-}[m
[31m-[m
[31m-function ngx_buf_tag(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->tag[m
[31m-}[m
[31m-[m
[31m-function ngx_buf_in_memory(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->temporary[m
[31m-        || @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->memory[m
[31m-        || @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->mmap[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_pos(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->pos[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_file_pos(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->file_pos[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_last(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->last[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_file_last(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->file_last[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_end(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->end[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_in_file(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->in_file[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_last_buf(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->last_buf[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_last_in_chain(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->last_in_chain[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_sync(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->sync[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_flush(b)[m
[31m-{[m
[31m-    return @cast(b, "ngx_buf_t", "/home/agentzh/git/lua-nginx-module/work/nginx/sbin/nginx")->flush[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_size(b)[m
[31m-{[m
[31m-    if (ngx_buf_in_memory(b)) {[m
[31m-        return ngx_buf_last(b) - ngx_buf_pos(b)[m
[31m-    }[m
[31m-[m
[31m-    return ngx_buf_file_last(b) - ngx_buf_file_pos(b)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_buf_data(b)[m
[31m-{[m
[31m-    return user_string_n(ngx_buf_pos(b), ngx_buf_last(b) - ngx_buf_pos(b))[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_chain_writer_ctx_out(ctx)[m
[31m-{[m
[31m-    return @cast(c, "ngx_chain_writer_ctx_t", "NGX_SBIN_PATH")->out[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_chain_dump:string (input)[m
[31m-{[m
[31m-    if (input == 0) {[m
[31m-        return "NULL"[m
[31m-    }[m
[31m-[m
[31m-    out = ""[m
[31m-    cl = input[m
[31m-    while (cl) {[m
[31m-        buf = ngx_chain_buf(cl)[m
[31m-[m
[31m-        if (ngx_buf_in_memory(buf)) {[m
[31m-            out .= sprintf("[%s]", text_str(ngx_buf_data(buf)))[m
[31m-[m
[31m-        } else {[m
[31m-            out .= "\"\""[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_in_file(buf)) {[m
[31m-            out .= sprintf("<in_file:%d-%d>", ngx_buf_file_pos(buf),[m
[31m-                           ngx_buf_file_last(buf))[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_last_buf(buf)) {[m
[31m-            out .= "<last_buf>"[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_last_in_chain(buf)) {[m
[31m-            out .= "<last_in_chain>"[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_sync(buf)) {[m
[31m-            out .= "<sync>"[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_flush(buf)) {[m
[31m-            out .= "<flush>"[m
[31m-        }[m
[31m-[m
[31m-        tag = ngx_buf_tag(buf)[m
[31m-        if (tag) {[m
[31m-            out .= sprintf("<tag:%p>", tag)[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_chain_next(cl)[m
[31m-        if (cl) {[m
[31m-            out .= " "[m
[31m-        }[m
[31m-    }[m
[31m-    return out[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_pool_cleanup_file_name(c)[m
[31m-{[m
[31m-    return user_string(@cast(c, "ngx_pool_cleanup_file_t", "NGX_SBIN_PATH")->name)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_http_req_content_length(r)[m
[31m-{[m
[31m-    return @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->headers_in->content_length_n[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_http_req_body_temp_file_name(r)[m
[31m-{[m
[31m-    rb = @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->request_body[m
[31m-    if (!rb) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    tf = @cast(rb, "ngx_http_request_body_t", "NGX_SBIN_PATH")->temp_file[m
[31m-    if (!tf) {[m
[31m-        return ""[m
[31m-    }[m
[31m-[m
[31m-    len = @cast(tf, "ngx_temp_file_t", "NGX_SBIN_PATH")->file->name->len[m
[31m-[m
[31m-    return user_string_n(@cast(tf, "ngx_temp_file_t", "NGX_SBIN_PATH")->file->name->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_table_elt_key(e)[m
[31m-{[m
[31m-    len = @cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->key->len[m
[31m-[m
[31m-    return user_string_n(@cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->key->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_table_elt_value(e)[m
[31m-{[m
[31m-    len = @cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->value->len[m
[31m-[m
[31m-    return user_string_n(@cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->value->data, len)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function ngx_iovec_dump:string (iov, iovcnt) {[m
[31m-    out = ""[m
[31m-    for (i = 0; i < iovcnt; i++) {[m
[31m-        out .= sprintf("\"%s\"(%p)", text_str(user_string_n([m
[31m-                @cast(iov, "struct iovec")[i]->iov_base,[m
[31m-                @cast(iov, "struct iovec")[i]->iov_len)[m
[31m-            ), @cast(iov, "struct iovec")[i]->iov_base)[m
[31m-        if (i != iovcnt - 1) {[m
[31m-            out .= " "[m
[31m-        }[m
[31m-    }[m
[31m-    return out[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/nginx_provider.d b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/nginx_provider.d[m
[1mdeleted file mode 100644[m
[1mindex 435adf4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/nginx_provider.d[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-typedef struct { int dummy; } ngx_str_t;[m
[31m-typedef int64_t ngx_int_t;[m
[31m-typedef uint64_t ngx_uint_t;[m
[31m-typedef ngx_uint_t ngx_msec_t;[m
[31m-typedef struct { int dummy; } ngx_module_t;[m
[31m-typedef struct { int dummy; } ngx_http_module_t;[m
[31m-typedef struct { int dummy; } ngx_table_elt_t;[m
[31m-typedef struct { int dummy; } ngx_event_t;[m
[31m-typedef struct { int dummy; } ngx_pool_t;[m
[31m-typedef char unsigned u_char;[m
[31m-[m
[31m-[m
[31m-provider nginx {[m
[31m-    /* probes for subrequests */[m
[31m-    probe http__subrequest__cycle(void *pr, ngx_str_t *uri, ngx_str_t *args);[m
[31m-    probe http__subrequest__start(void *r);[m
[31m-    probe http__subrequest__finalize_writing(void *r);[m
[31m-    probe http__subrequest__finalize_nonactive(void *r);[m
[31m-    probe http__subrequest__wake__parent(void *r);[m
[31m-    probe http__subrequest__done(void *r);[m
[31m-    probe http__subrequest__post__start(void *r, ngx_int_t rc);[m
[31m-    probe http__subrequest__post__done(void *r, ngx_int_t rc);[m
[31m-    probe http__module__post__config(ngx_module_t *m);[m
[31m-    probe http__read__body__done(void *r);[m
[31m-    probe http__read__req__line__done(void *r);[m
[31m-    probe http__read__req__header__done(void *r, ngx_table_elt_t *h);[m
[31m-    probe timer__add(ngx_event_t *ev, ngx_msec_t timer);[m
[31m-    probe timer__del(ngx_event_t *ev);[m
[31m-    probe timer__expire(ngx_event_t *ev);[m
[31m-    probe create__pool__done(ngx_pool_t *pool, size_t size);[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#pragma D attributes Evolving/Evolving/Common      provider nginx provider[m
[31m-#pragma D attributes Private/Private/Unknown       provider nginx module[m
[31m-#pragma D attributes Private/Private/Unknown       provider nginx function[m
[31m-#pragma D attributes Private/Private/Common        provider nginx name[m
[31m-#pragma D attributes Evolving/Evolving/Common      provider nginx args[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/stap-nginx b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/stap-nginx[m
[1mdeleted file mode 100644[m
[1mindex 1bca4cf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/dtrace/stap-nginx[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-#!/bin/sh[m
[31m-[m
[31m-PATH="NGX_SBIN_DIR:$PATH"[m
[31m-export PATH[m
[31m-exec stap -d "NGX_SBIN_PATH" -I "NGX_TAPSET_PREFIX" "$@"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_devpoll_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_devpoll_module.c[m
[1mdeleted file mode 100644[m
[1mindex f985fbd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_devpoll_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,562 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_TEST_BUILD_DEVPOLL)[m
[31m-[m
[31m-/* Solaris declarations */[m
[31m-[m
[31m-#ifndef POLLREMOVE[m
[31m-#define POLLREMOVE   0x0800[m
[31m-#endif[m
[31m-#define DP_POLL      0xD001[m
[31m-#define DP_ISPOLLED  0xD002[m
[31m-[m
[31m-struct dvpoll {[m
[31m-    struct pollfd  *dp_fds;[m
[31m-    int             dp_nfds;[m
[31m-    int             dp_timeout;[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t      changes;[m
[31m-    ngx_uint_t      events;[m
[31m-} ngx_devpoll_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_devpoll_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_devpoll_process_events(ngx_cycle_t *cycle,[m
[31m-    ngx_msec_t timer, ngx_uint_t flags);[m
[31m-[m
[31m-static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static int              dp = -1;[m
[31m-static struct pollfd   *change_list, *event_list;[m
[31m-static ngx_uint_t       nchanges, max_changes, nevents;[m
[31m-[m
[31m-static ngx_event_t    **change_index;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t      devpoll_name = ngx_string("/dev/poll");[m
[31m-[m
[31m-static ngx_command_t  ngx_devpoll_commands[] = {[m
[31m-[m
[31m-    { ngx_string("devpoll_changes"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_devpoll_conf_t, changes),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("devpoll_events"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_devpoll_conf_t, events),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_devpoll_module_ctx = {[m
[31m-    &devpoll_name,[m
[31m-    ngx_devpoll_create_conf,               /* create configuration */[m
[31m-    ngx_devpoll_init_conf,                 /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_devpoll_add_event,             /* add an event */[m
[31m-        ngx_devpoll_del_event,             /* delete an event */[m
[31m-        ngx_devpoll_add_event,             /* enable an event */[m
[31m-        ngx_devpoll_del_event,             /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_devpoll_process_events,        /* process the events */[m
[31m-        ngx_devpoll_init,                  /* init the events */[m
[31m-        ngx_devpoll_done,                  /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_devpoll_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_devpoll_module_ctx,               /* module context */[m
[31m-    ngx_devpoll_commands,                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    size_t               n;[m
[31m-    ngx_devpoll_conf_t  *dpcf;[m
[31m-[m
[31m-    dpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_devpoll_module);[m
[31m-[m
[31m-    if (dp == -1) {[m
[31m-        dp = open("/dev/poll", O_RDWR);[m
[31m-[m
[31m-        if (dp == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "open(/dev/poll) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (max_changes < dpcf->changes) {[m
[31m-        if (nchanges) {[m
[31m-            n = nchanges * sizeof(struct pollfd);[m
[31m-            if (write(dp, change_list, n) != (ssize_t) n) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                              "write(/dev/poll) failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            nchanges = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (change_list) {[m
[31m-            ngx_free(change_list);[m
[31m-        }[m
[31m-[m
[31m-        change_list = ngx_alloc(sizeof(struct pollfd) * dpcf->changes,[m
[31m-                                cycle->log);[m
[31m-        if (change_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (change_index) {[m
[31m-            ngx_free(change_index);[m
[31m-        }[m
[31m-[m
[31m-        change_index = ngx_alloc(sizeof(ngx_event_t *) * dpcf->changes,[m
[31m-                                 cycle->log);[m
[31m-        if (change_index == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    max_changes = dpcf->changes;[m
[31m-[m
[31m-    if (nevents < dpcf->events) {[m
[31m-        if (event_list) {[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = ngx_alloc(sizeof(struct pollfd) * dpcf->events,[m
[31m-                               cycle->log);[m
[31m-        if (event_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    nevents = dpcf->events;[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_devpoll_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_FD_EVENT;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_devpoll_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (close(dp) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "close(/dev/poll) failed");[m
[31m-    }[m
[31m-[m
[31m-    dp = -1;[m
[31m-[m
[31m-    ngx_free(change_list);[m
[31m-    ngx_free(event_list);[m
[31m-    ngx_free(change_index);[m
[31m-[m
[31m-    change_list = NULL;[m
[31m-    event_list = NULL;[m
[31m-    change_index = NULL;[m
[31m-    max_changes = 0;[m
[31m-    nchanges = 0;[m
[31m-    nevents = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_connection_t *c;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-    event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    c = ev->data;[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "devpoll add event: fd:%d ev:%04Xi", c->fd, event);[m
[31m-#endif[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-[m
[31m-    return ngx_devpoll_set_event(ev, event, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-    event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "devpoll del event: fd:%d ev:%04Xi", c->fd, event);[m
[31m-[m
[31m-    if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        e = (event == POLLIN) ? c->write : c->read;[m
[31m-[m
[31m-        if (e) {[m
[31m-            e->active = 0;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* restore the pair event if it exists */[m
[31m-[m
[31m-    if (event == POLLIN) {[m
[31m-        e = c->write;[m
[31m-        event = POLLOUT;[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        event = POLLIN;[m
[31m-    }[m
[31m-[m
[31m-    if (e && e->active) {[m
[31m-        return ngx_devpoll_set_event(e, event, 0);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    size_t             n;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "devpoll fd:%d ev:%04Xi fl:%04Xi", c->fd, event, flags);[m
[31m-[m
[31m-    if (nchanges >= max_changes) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ev->log, 0,[m
[31m-                      "/dev/pool change list is filled up");[m
[31m-[m
[31m-        n = nchanges * sizeof(struct pollfd);[m
[31m-        if (write(dp, change_list, n) != (ssize_t) n) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                          "write(/dev/poll) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    change_list[nchanges].fd = c->fd;[m
[31m-    change_list[nchanges].events = (short) event;[m
[31m-    change_list[nchanges].revents = 0;[m
[31m-[m
[31m-    change_index[nchanges] = ev;[m
[31m-    ev->index = nchanges;[m
[31m-[m
[31m-    nchanges++;[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        n = nchanges * sizeof(struct pollfd);[m
[31m-        if (write(dp, change_list, n) != (ssize_t) n) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                          "write(/dev/poll) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                 events, revents, rc;[m
[31m-    size_t              n;[m
[31m-    ngx_fd_t            fd;[m
[31m-    ngx_err_t           err;[m
[31m-    ngx_int_t           i;[m
[31m-    ngx_uint_t          level, instance;[m
[31m-    ngx_event_t        *rev, *wev;[m
[31m-    ngx_queue_t        *queue;[m
[31m-    ngx_connection_t   *c;[m
[31m-    struct pollfd       pfd;[m
[31m-    struct dvpoll       dvp;[m
[31m-[m
[31m-    /* NGX_TIMER_INFINITE == INFTIM */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "devpoll timer: %M", timer);[m
[31m-[m
[31m-    if (nchanges) {[m
[31m-        n = nchanges * sizeof(struct pollfd);[m
[31m-        if (write(dp, change_list, n) != (ssize_t) n) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "write(/dev/poll) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    dvp.dp_fds = event_list;[m
[31m-    dvp.dp_nfds = (int) nevents;[m
[31m-    dvp.dp_timeout = timer;[m
[31m-    events = ioctl(dp, DP_POLL, &dvp);[m
[31m-[m
[31m-    err = (events == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "ioctl(DP_POLL) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (events == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "ioctl(DP_POLL) returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < events; i++) {[m
[31m-[m
[31m-        fd = event_list[i].fd;[m
[31m-        revents = event_list[i].revents;[m
[31m-[m
[31m-        c = ngx_cycle->files[fd];[m
[31m-[m
[31m-        if (c == NULL || c->fd == -1) {[m
[31m-[m
[31m-            pfd.fd = fd;[m
[31m-            pfd.events = 0;[m
[31m-            pfd.revents = 0;[m
[31m-[m
[31m-            rc = ioctl(dp, DP_ISPOLLED, &pfd);[m
[31m-[m
[31m-            switch (rc) {[m
[31m-[m
[31m-            case -1:[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                    "ioctl(DP_ISPOLLED) failed for socket %d, event %04Xd",[m
[31m-                    fd, revents);[m
[31m-                break;[m
[31m-[m
[31m-            case 0:[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                    "phantom event %04Xd for closed and removed socket %d",[m
[31m-                    revents, fd);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                    "unexpected event %04Xd for closed and removed socket %d, "[m
[31m-                    "ioctl(DP_ISPOLLED) returned rc:%d, fd:%d, event %04Xd",[m
[31m-                    revents, fd, rc, pfd.fd, pfd.revents);[m
[31m-[m
[31m-                pfd.fd = fd;[m
[31m-                pfd.events = POLLREMOVE;[m
[31m-                pfd.revents = 0;[m
[31m-[m
[31m-                if (write(dp, &pfd, sizeof(struct pollfd))[m
[31m-                    != (ssize_t) sizeof(struct pollfd))[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                                  "write(/dev/poll) for %d failed", fd);[m
[31m-                }[m
[31m-[m
[31m-                if (close(fd) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                                  "close(%d) failed", fd);[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "devpoll: fd:%d, ev:%04Xd, rev:%04Xd",[m
[31m-                       fd, event_list[i].events, revents);[m
[31m-[m
[31m-        if (revents & (POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                          "ioctl(DP_POLL) error fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                          fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-[m
[31m-        if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "strange ioctl(DP_POLL) events "[m
[31m-                          "fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                          fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-[m
[31m-        if ((revents & (POLLERR|POLLHUP|POLLNVAL))[m
[31m-             && (revents & (POLLIN|POLLOUT)) == 0)[m
[31m-        {[m
[31m-            /*[m
[31m-             * if the error events were returned without POLLIN or POLLOUT,[m
[31m-             * then add these flags to handle the events at least in one[m
[31m-             * active handler[m
[31m-             */[m
[31m-[m
[31m-            revents |= POLLIN|POLLOUT;[m
[31m-        }[m
[31m-[m
[31m-        rev = c->read;[m
[31m-[m
[31m-        if ((revents & POLLIN) && rev->active) {[m
[31m-            rev->ready = 1;[m
[31m-[m
[31m-            if (flags & NGX_POST_EVENTS) {[m
[31m-                queue = rev->accept ? &ngx_posted_accept_events[m
[31m-                                    : &ngx_posted_events;[m
[31m-[m
[31m-                ngx_post_event(rev, queue);[m
[31m-[m
[31m-            } else {[m
[31m-                instance = rev->instance;[m
[31m-[m
[31m-                rev->handler(rev);[m
[31m-[m
[31m-                if (c->fd == -1 || rev->instance != instance) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        if ((revents & POLLOUT) && wev->active) {[m
[31m-            wev->ready = 1;[m
[31m-[m
[31m-            if (flags & NGX_POST_EVENTS) {[m
[31m-                ngx_post_event(wev, &ngx_posted_events);[m
[31m-[m
[31m-            } else {[m
[31m-                wev->handler(wev);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_devpoll_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_devpoll_conf_t  *dpcf;[m
[31m-[m
[31m-    dpcf = ngx_palloc(cycle->pool, sizeof(ngx_devpoll_conf_t));[m
[31m-    if (dpcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dpcf->changes = NGX_CONF_UNSET;[m
[31m-    dpcf->events = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return dpcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_devpoll_conf_t *dpcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(dpcf->changes, 32);[m
[31m-    ngx_conf_init_uint_value(dpcf->events, 32);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_epoll_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_epoll_module.c[m
[1mdeleted file mode 100644[m
[1mindex 166c461..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_epoll_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,972 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_TEST_BUILD_EPOLL)[m
[31m-[m
[31m-/* epoll declarations */[m
[31m-[m
[31m-#define EPOLLIN        0x001[m
[31m-#define EPOLLPRI       0x002[m
[31m-#define EPOLLOUT       0x004[m
[31m-#define EPOLLRDNORM    0x040[m
[31m-#define EPOLLRDBAND    0x080[m
[31m-#define EPOLLWRNORM    0x100[m
[31m-#define EPOLLWRBAND    0x200[m
[31m-#define EPOLLMSG       0x400[m
[31m-#define EPOLLERR       0x008[m
[31m-#define EPOLLHUP       0x010[m
[31m-[m
[31m-#define EPOLLRDHUP     0x2000[m
[31m-[m
[31m-#define EPOLLET        0x80000000[m
[31m-#define EPOLLONESHOT   0x40000000[m
[31m-[m
[31m-#define EPOLL_CTL_ADD  1[m
[31m-#define EPOLL_CTL_DEL  2[m
[31m-#define EPOLL_CTL_MOD  3[m
[31m-[m
[31m-typedef union epoll_data {[m
[31m-    void         *ptr;[m
[31m-    int           fd;[m
[31m-    uint32_t      u32;[m
[31m-    uint64_t      u64;[m
[31m-} epoll_data_t;[m
[31m-[m
[31m-struct epoll_event {[m
[31m-    uint32_t      events;[m
[31m-    epoll_data_t  data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int epoll_create(int size);[m
[31m-[m
[31m-int epoll_create(int size)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);[m
[31m-[m
[31m-int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout);[m
[31m-[m
[31m-int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-#define SYS_eventfd       323[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-#define SYS_io_setup      245[m
[31m-#define SYS_io_destroy    246[m
[31m-#define SYS_io_getevents  247[m
[31m-[m
[31m-typedef u_int  aio_context_t;[m
[31m-[m
[31m-struct io_event {[m
[31m-    uint64_t  data;  /* the data field from the iocb */[m
[31m-    uint64_t  obj;   /* what iocb this event came from */[m
[31m-    int64_t   res;   /* result code for this event */[m
[31m-    int64_t   res2;  /* secondary result */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#endif[m
[31m-#endif /* NGX_TEST_BUILD_EPOLL */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  events;[m
[31m-    ngx_uint_t  aio_requests;[m
[31m-} ngx_epoll_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-static ngx_int_t ngx_epoll_notify_init(ngx_log_t *log);[m
[31m-static void ngx_epoll_notify_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-static void ngx_epoll_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_epoll_add_connection(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_epoll_del_connection(ngx_connection_t *c,[m
[31m-    ngx_uint_t flags);[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-static ngx_int_t ngx_epoll_notify(ngx_event_handler_pt handler);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-static void ngx_epoll_eventfd_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_epoll_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static int                  ep = -1;[m
[31m-static struct epoll_event  *event_list;[m
[31m-static ngx_uint_t           nevents;[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-static int                  notify_fd = -1;[m
[31m-static ngx_event_t          notify_event;[m
[31m-static ngx_connection_t     notify_conn;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-int                         ngx_eventfd = -1;[m
[31m-aio_context_t               ngx_aio_ctx = 0;[m
[31m-[m
[31m-static ngx_event_t          ngx_eventfd_event;[m
[31m-static ngx_connection_t     ngx_eventfd_conn;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-static ngx_str_t      epoll_name = ngx_string("epoll");[m
[31m-[m
[31m-static ngx_command_t  ngx_epoll_commands[] = {[m
[31m-[m
[31m-    { ngx_string("epoll_events"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_epoll_conf_t, events),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("worker_aio_requests"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_epoll_conf_t, aio_requests),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_epoll_module_ctx = {[m
[31m-    &epoll_name,[m
[31m-    ngx_epoll_create_conf,               /* create configuration */[m
[31m-    ngx_epoll_init_conf,                 /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_epoll_add_event,             /* add an event */[m
[31m-        ngx_epoll_del_event,             /* delete an event */[m
[31m-        ngx_epoll_add_event,             /* enable an event */[m
[31m-        ngx_epoll_del_event,             /* disable an event */[m
[31m-        ngx_epoll_add_connection,        /* add an connection */[m
[31m-        ngx_epoll_del_connection,        /* delete an connection */[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-        ngx_epoll_notify,                /* trigger a notify */[m
[31m-#else[m
[31m-        NULL,                            /* trigger a notify */[m
[31m-#endif[m
[31m-        ngx_epoll_process_events,        /* process the events */[m
[31m-        ngx_epoll_init,                  /* init the events */[m
[31m-        ngx_epoll_done,                  /* done the events */[m
[31m-    }[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_epoll_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_epoll_module_ctx,               /* module context */[m
[31m-    ngx_epoll_commands,                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                    /* module type */[m
[31m-    NULL,                                /* init master */[m
[31m-    NULL,                                /* init module */[m
[31m-    NULL,                                /* init process */[m
[31m-    NULL,                                /* init thread */[m
[31m-    NULL,                                /* exit thread */[m
[31m-    NULL,                                /* exit process */[m
[31m-    NULL,                                /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-/*[m
[31m- * We call io_setup(), io_destroy() io_submit(), and io_getevents() directly[m
[31m- * as syscalls instead of libaio usage, because the library header file[m
[31m- * supports eventfd() since 0.3.107 version only.[m
[31m- */[m
[31m-[m
[31m-static int[m
[31m-io_setup(u_int nr_reqs, aio_context_t *ctx)[m
[31m-{[m
[31m-    return syscall(SYS_io_setup, nr_reqs, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-io_destroy(aio_context_t ctx)[m
[31m-{[m
[31m-    return syscall(SYS_io_destroy, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-io_getevents(aio_context_t ctx, long min_nr, long nr, struct io_event *events,[m
[31m-    struct timespec *tmo)[m
[31m-{[m
[31m-    return syscall(SYS_io_getevents, ctx, min_nr, nr, events, tmo);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_epoll_aio_init(ngx_cycle_t *cycle, ngx_epoll_conf_t *epcf)[m
[31m-{[m
[31m-    int                 n;[m
[31m-    struct epoll_event  ee;[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_EVENTFD_H)[m
[31m-    ngx_eventfd = eventfd(0, 0);[m
[31m-#else[m
[31m-    ngx_eventfd = syscall(SYS_eventfd, 0);[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_eventfd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                      "eventfd() failed");[m
[31m-        ngx_file_aio = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "eventfd: %d", ngx_eventfd);[m
[31m-[m
[31m-    n = 1;[m
[31m-[m
[31m-    if (ioctl(ngx_eventfd, FIONBIO, &n) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                      "ioctl(eventfd, FIONBIO) failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (io_setup(epcf->aio_requests, &ngx_aio_ctx) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                      "io_setup() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_eventfd_event.data = &ngx_eventfd_conn;[m
[31m-    ngx_eventfd_event.handler = ngx_epoll_eventfd_handler;[m
[31m-    ngx_eventfd_event.log = cycle->log;[m
[31m-    ngx_eventfd_event.active = 1;[m
[31m-    ngx_eventfd_conn.fd = ngx_eventfd;[m
[31m-    ngx_eventfd_conn.read = &ngx_eventfd_event;[m
[31m-    ngx_eventfd_conn.log = cycle->log;[m
[31m-[m
[31m-    ee.events = EPOLLIN|EPOLLET;[m
[31m-    ee.data.ptr = &ngx_eventfd_conn;[m
[31m-[m
[31m-    if (epoll_ctl(ep, EPOLL_CTL_ADD, ngx_eventfd, &ee) != -1) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                  "epoll_ctl(EPOLL_CTL_ADD, eventfd) failed");[m
[31m-[m
[31m-    if (io_destroy(ngx_aio_ctx) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "io_destroy() failed");[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (close(ngx_eventfd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "eventfd close() failed");[m
[31m-    }[m
[31m-[m
[31m-    ngx_eventfd = -1;[m
[31m-    ngx_aio_ctx = 0;[m
[31m-    ngx_file_aio = 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_epoll_conf_t  *epcf;[m
[31m-[m
[31m-    epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);[m
[31m-[m
[31m-    if (ep == -1) {[m
[31m-        ep = epoll_create(cycle->connection_n / 2);[m
[31m-[m
[31m-        if (ep == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "epoll_create() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-        if (ngx_epoll_notify_init(cycle->log) != NGX_OK) {[m
[31m-            ngx_epoll_module_ctx.actions.notify = NULL;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-        ngx_epoll_aio_init(cycle, epcf);[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (nevents < epcf->events) {[m
[31m-        if (event_list) {[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = ngx_alloc(sizeof(struct epoll_event) * epcf->events,[m
[31m-                               cycle->log);[m
[31m-        if (event_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    nevents = epcf->events;[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_epoll_module_ctx.actions;[m
[31m-[m
[31m-#if (NGX_HAVE_CLEAR_EVENT)[m
[31m-    ngx_event_flags = NGX_USE_CLEAR_EVENT[m
[31m-#else[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT[m
[31m-#endif[m
[31m-                      |NGX_USE_GREEDY_EVENT[m
[31m-                      |NGX_USE_EPOLL_EVENT;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_notify_init(ngx_log_t *log)[m
[31m-{[m
[31m-    struct epoll_event  ee;[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_EVENTFD_H)[m
[31m-    notify_fd = eventfd(0, 0);[m
[31m-#else[m
[31m-    notify_fd = syscall(SYS_eventfd, 0);[m
[31m-#endif[m
[31m-[m
[31m-    if (notify_fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "eventfd() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                   "notify eventfd: %d", notify_fd);[m
[31m-[m
[31m-    notify_event.handler = ngx_epoll_notify_handler;[m
[31m-    notify_event.log = log;[m
[31m-    notify_event.active = 1;[m
[31m-[m
[31m-    notify_conn.fd = notify_fd;[m
[31m-    notify_conn.read = &notify_event;[m
[31m-    notify_conn.log = log;[m
[31m-[m
[31m-    ee.events = EPOLLIN|EPOLLET;[m
[31m-    ee.data.ptr = &notify_conn;[m
[31m-[m
[31m-    if (epoll_ctl(ep, EPOLL_CTL_ADD, notify_fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "epoll_ctl(EPOLL_CTL_ADD, eventfd) failed");[m
[31m-[m
[31m-        if (close(notify_fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                            "eventfd close() failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_epoll_notify_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ssize_t               n;[m
[31m-    uint64_t              count;[m
[31m-    ngx_err_t             err;[m
[31m-    ngx_event_handler_pt  handler;[m
[31m-[m
[31m-    if (++ev->index == NGX_MAX_UINT32_VALUE) {[m
[31m-        ev->index = 0;[m
[31m-[m
[31m-        n = read(notify_fd, &count, sizeof(uint64_t));[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "read() eventfd %d: %z count:%uL", notify_fd, n, count);[m
[31m-[m
[31m-        if ((size_t) n != sizeof(uint64_t)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, err,[m
[31m-                          "read() eventfd %d failed", notify_fd);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    handler = ev->data;[m
[31m-    handler(ev);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_epoll_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (close(ep) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "epoll close() failed");[m
[31m-    }[m
[31m-[m
[31m-    ep = -1;[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-[m
[31m-    if (close(notify_fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "eventfd close() failed");[m
[31m-    }[m
[31m-[m
[31m-    notify_fd = -1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-    if (ngx_eventfd != -1) {[m
[31m-[m
[31m-        if (io_destroy(ngx_aio_ctx) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "io_destroy() failed");[m
[31m-        }[m
[31m-[m
[31m-        if (close(ngx_eventfd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "eventfd close() failed");[m
[31m-        }[m
[31m-[m
[31m-        ngx_eventfd = -1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_aio_ctx = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_free(event_list);[m
[31m-[m
[31m-    event_list = NULL;[m
[31m-    nevents = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                  op;[m
[31m-    uint32_t             events, prev;[m
[31m-    ngx_event_t         *e;[m
[31m-    ngx_connection_t    *c;[m
[31m-    struct epoll_event   ee;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    events = (uint32_t) event;[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-        prev = EPOLLOUT;[m
[31m-#if (NGX_READ_EVENT != EPOLLIN|EPOLLRDHUP)[m
[31m-        events = EPOLLIN|EPOLLRDHUP;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        prev = EPOLLIN|EPOLLRDHUP;[m
[31m-#if (NGX_WRITE_EVENT != EPOLLOUT)[m
[31m-        events = EPOLLOUT;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (e->active) {[m
[31m-        op = EPOLL_CTL_MOD;[m
[31m-        events |= prev;[m
[31m-[m
[31m-    } else {[m
[31m-        op = EPOLL_CTL_ADD;[m
[31m-    }[m
[31m-[m
[31m-    ee.events = events | (uint32_t) flags;[m
[31m-    ee.data.ptr = (void *) ((uintptr_t) c | ev->instance);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "epoll add event: fd:%d op:%d ev:%08XD",[m
[31m-                   c->fd, op, ee.events);[m
[31m-[m
[31m-    if (epoll_ctl(ep, op, c->fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                      "epoll_ctl(%d, %d) failed", op, c->fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-#if 0[m
[31m-    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                  op;[m
[31m-    uint32_t             prev;[m
[31m-    ngx_event_t         *e;[m
[31m-    ngx_connection_t    *c;[m
[31m-    struct epoll_event   ee;[m
[31m-[m
[31m-    /*[m
[31m-     * when the file descriptor is closed, the epoll automatically deletes[m
[31m-     * it from its queue, so we do not need to delete explicitly the event[m
[31m-     * before the closing the file descriptor[m
[31m-     */[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        ev->active = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-        prev = EPOLLOUT;[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        prev = EPOLLIN|EPOLLRDHUP;[m
[31m-    }[m
[31m-[m
[31m-    if (e->active) {[m
[31m-        op = EPOLL_CTL_MOD;[m
[31m-        ee.events = prev | (uint32_t) flags;[m
[31m-        ee.data.ptr = (void *) ((uintptr_t) c | ev->instance);[m
[31m-[m
[31m-    } else {[m
[31m-        op = EPOLL_CTL_DEL;[m
[31m-        ee.events = 0;[m
[31m-        ee.data.ptr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "epoll del event: fd:%d op:%d ev:%08XD",[m
[31m-                   c->fd, op, ee.events);[m
[31m-[m
[31m-    if (epoll_ctl(ep, op, c->fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                      "epoll_ctl(%d, %d) failed", op, c->fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_add_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    struct epoll_event  ee;[m
[31m-[m
[31m-    ee.events = EPOLLIN|EPOLLOUT|EPOLLET|EPOLLRDHUP;[m
[31m-    ee.data.ptr = (void *) ((uintptr_t) c | c->read->instance);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "epoll add connection: fd:%d ev:%08XD", c->fd, ee.events);[m
[31m-[m
[31m-    if (epoll_ctl(ep, EPOLL_CTL_ADD, c->fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "epoll_ctl(EPOLL_CTL_ADD, %d) failed", c->fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->read->active = 1;[m
[31m-    c->write->active = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_del_connection(ngx_connection_t *c, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                 op;[m
[31m-    struct epoll_event  ee;[m
[31m-[m
[31m-    /*[m
[31m-     * when the file descriptor is closed the epoll automatically deletes[m
[31m-     * it from its queue so we do not need to delete explicitly the event[m
[31m-     * before the closing the file descriptor[m
[31m-     */[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        c->read->active = 0;[m
[31m-        c->write->active = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "epoll del connection: fd:%d", c->fd);[m
[31m-[m
[31m-    op = EPOLL_CTL_DEL;[m
[31m-    ee.events = 0;[m
[31m-    ee.data.ptr = NULL;[m
[31m-[m
[31m-    if (epoll_ctl(ep, op, c->fd, &ee) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "epoll_ctl(%d, %d) failed", op, c->fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->read->active = 0;[m
[31m-    c->write->active = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_notify(ngx_event_handler_pt handler)[m
[31m-{[m
[31m-    static uint64_t inc = 1;[m
[31m-[m
[31m-    notify_event.data = handler;[m
[31m-[m
[31m-    if ((size_t) write(notify_fd, &inc, sizeof(uint64_t)) != sizeof(uint64_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno,[m
[31m-                      "write() to eventfd %d failed", notify_fd);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                events;[m
[31m-    uint32_t           revents;[m
[31m-    ngx_int_t          instance, i;[m
[31m-    ngx_uint_t         level;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_queue_t       *queue;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    /* NGX_TIMER_INFINITE == INFTIM */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "epoll timer: %M", timer);[m
[31m-[m
[31m-    events = epoll_wait(ep, event_list, (int) nevents, timer);[m
[31m-[m
[31m-    err = (events == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "epoll_wait() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (events == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "epoll_wait() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < events; i++) {[m
[31m-        c = event_list[i].data.ptr;[m
[31m-[m
[31m-        instance = (uintptr_t) c & 1;[m
[31m-        c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1);[m
[31m-[m
[31m-        rev = c->read;[m
[31m-[m
[31m-        if (c->fd == -1 || rev->instance != instance) {[m
[31m-[m
[31m-            /*[m
[31m-             * the stale event from a file descriptor[m
[31m-             * that was just closed in this iteration[m
[31m-             */[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "epoll: stale event %p", c);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        revents = event_list[i].events;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "epoll: fd:%d ev:%04XD d:%p",[m
[31m-                       c->fd, revents, event_list[i].data.ptr);[m
[31m-[m
[31m-        if (revents & (EPOLLERR|EPOLLHUP)) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "epoll_wait() error on fd:%d ev:%04XD",[m
[31m-                           c->fd, revents);[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        if (revents & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "strange epoll_wait() events fd:%d ev:%04XD",[m
[31m-                          c->fd, revents);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if ((revents & (EPOLLERR|EPOLLHUP))[m
[31m-             && (revents & (EPOLLIN|EPOLLOUT)) == 0)[m
[31m-        {[m
[31m-            /*[m
[31m-             * if the error events were returned without EPOLLIN or EPOLLOUT,[m
[31m-             * then add these flags to handle the events at least in one[m
[31m-             * active handler[m
[31m-             */[m
[31m-[m
[31m-            revents |= EPOLLIN|EPOLLOUT;[m
[31m-        }[m
[31m-[m
[31m-        if ((revents & EPOLLIN) && rev->active) {[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-            if (revents & EPOLLRDHUP) {[m
[31m-                rev->pending_eof = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            rev->ready = 1;[m
[31m-[m
[31m-            if (flags & NGX_POST_EVENTS) {[m
[31m-                queue = rev->accept ? &ngx_posted_accept_events[m
[31m-                                    : &ngx_posted_events;[m
[31m-[m
[31m-                ngx_post_event(rev, queue);[m
[31m-[m
[31m-            } else {[m
[31m-                rev->handler(rev);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        if ((revents & EPOLLOUT) && wev->active) {[m
[31m-[m
[31m-            if (c->fd == -1 || wev->instance != instance) {[m
[31m-[m
[31m-                /*[m
[31m-                 * the stale event from a file descriptor[m
[31m-                 * that was just closed in this iteration[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "epoll: stale event %p", c);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            wev->ready = 1;[m
[31m-#if (NGX_THREADS)[m
[31m-            wev->complete = 1;[m
[31m-#endif[m
[31m-[m
[31m-            if (flags & NGX_POST_EVENTS) {[m
[31m-                ngx_post_event(wev, &ngx_posted_events);[m
[31m-[m
[31m-            } else {[m
[31m-                wev->handler(wev);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-static void[m
[31m-ngx_epoll_eventfd_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    int               n, events;[m
[31m-    long              i;[m
[31m-    uint64_t          ready;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *e;[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-    struct io_event   event[64];[m
[31m-    struct timespec   ts;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd handler");[m
[31m-[m
[31m-    n = read(ngx_eventfd, &ready, 8);[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd: %d", n);[m
[31m-[m
[31m-    if (n != 8) {[m
[31m-        if (n == -1) {[m
[31m-            if (err == NGX_EAGAIN) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, err, "read(eventfd) failed");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "read(eventfd) returned only %d bytes", n);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ts.tv_sec = 0;[m
[31m-    ts.tv_nsec = 0;[m
[31m-[m
[31m-    while (ready) {[m
[31m-[m
[31m-        events = io_getevents(ngx_aio_ctx, 1, 64, event, &ts);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "io_getevents: %d", events);[m
[31m-[m
[31m-        if (events > 0) {[m
[31m-            ready -= events;[m
[31m-[m
[31m-            for (i = 0; i < events; i++) {[m
[31m-[m
[31m-                ngx_log_debug4(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                               "io_event: %XL %XL %L %L",[m
[31m-                                event[i].data, event[i].obj,[m
[31m-                                event[i].res, event[i].res2);[m
[31m-[m
[31m-                e = (ngx_event_t *) (uintptr_t) event[i].data;[m
[31m-[m
[31m-                e->complete = 1;[m
[31m-                e->active = 0;[m
[31m-                e->ready = 1;[m
[31m-[m
[31m-                aio = e->data;[m
[31m-                aio->res = event[i].res;[m
[31m-[m
[31m-                ngx_post_event(e, &ngx_posted_events);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (events == 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* events == -1 */[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                      "io_getevents() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_epoll_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_epoll_conf_t  *epcf;[m
[31m-[m
[31m-    epcf = ngx_palloc(cycle->pool, sizeof(ngx_epoll_conf_t));[m
[31m-    if (epcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    epcf->events = NGX_CONF_UNSET;[m
[31m-    epcf->aio_requests = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return epcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_epoll_conf_t *epcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(epcf->events, 512);[m
[31m-    ngx_conf_init_uint_value(epcf->aio_requests, 32);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_eventport_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_eventport_module.c[m
[1mdeleted file mode 100644[m
[1mindex dafa27f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_eventport_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,651 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_TEST_BUILD_EVENTPORT)[m
[31m-[m
[31m-#define ushort_t  u_short[m
[31m-#define uint_t    u_int[m
[31m-[m
[31m-#ifndef CLOCK_REALTIME[m
[31m-#define CLOCK_REALTIME          0[m
[31m-typedef int     clockid_t;[m
[31m-typedef void *  timer_t;[m
[31m-#endif[m
[31m-[m
[31m-/* Solaris declarations */[m
[31m-[m
[31m-#define PORT_SOURCE_AIO         1[m
[31m-#define PORT_SOURCE_TIMER       2[m
[31m-#define PORT_SOURCE_USER        3[m
[31m-#define PORT_SOURCE_FD          4[m
[31m-#define PORT_SOURCE_ALERT       5[m
[31m-#define PORT_SOURCE_MQ          6[m
[31m-[m
[31m-#ifndef ETIME[m
[31m-#define ETIME                   64[m
[31m-#endif[m
[31m-[m
[31m-#define SIGEV_PORT              4[m
[31m-[m
[31m-typedef struct {[m
[31m-    int         portev_events;  /* event data is source specific */[m
[31m-    ushort_t    portev_source;  /* event source */[m
[31m-    ushort_t    portev_pad;     /* port internal use */[m
[31m-    uintptr_t   portev_object;  /* source specific object */[m
[31m-    void       *portev_user;    /* user cookie */[m
[31m-} port_event_t;[m
[31m-[m
[31m-typedef struct  port_notify {[m
[31m-    int         portnfy_port;   /* bind request(s) to port */[m
[31m-    void       *portnfy_user;   /* user defined */[m
[31m-} port_notify_t;[m
[31m-[m
[31m-#if (__FreeBSD__ && __FreeBSD_version < 700005) || (NGX_DARWIN)[m
[31m-[m
[31m-typedef struct itimerspec {     /* definition per POSIX.4 */[m
[31m-    struct timespec it_interval;/* timer period */[m
[31m-    struct timespec it_value;   /* timer expiration */[m
[31m-} itimerspec_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-int port_create(void);[m
[31m-[m
[31m-int port_create(void)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int port_associate(int port, int source, uintptr_t object, int events,[m
[31m-    void *user);[m
[31m-[m
[31m-int port_associate(int port, int source, uintptr_t object, int events,[m
[31m-    void *user)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int port_dissociate(int port, int source, uintptr_t object);[m
[31m-[m
[31m-int port_dissociate(int port, int source, uintptr_t object)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget,[m
[31m-    struct timespec *timeout);[m
[31m-[m
[31m-int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget,[m
[31m-    struct timespec *timeout)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-int port_send(int port, int events, void *user);[m
[31m-[m
[31m-int port_send(int port, int events, void *user)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid);[m
[31m-[m
[31m-int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,[m
[31m-    struct itimerspec *ovalue);[m
[31m-[m
[31m-int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,[m
[31m-    struct itimerspec *ovalue)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int timer_delete(timer_t timerid);[m
[31m-[m
[31m-int timer_delete(timer_t timerid)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  events;[m
[31m-} ngx_eventport_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_eventport_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_eventport_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_eventport_notify(ngx_event_handler_pt handler);[m
[31m-static ngx_int_t ngx_eventport_process_events(ngx_cycle_t *cycle,[m
[31m-    ngx_msec_t timer, ngx_uint_t flags);[m
[31m-[m
[31m-static void *ngx_eventport_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_eventport_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-static int            ep = -1;[m
[31m-static port_event_t  *event_list;[m
[31m-static ngx_uint_t     nevents;[m
[31m-static timer_t        event_timer = (timer_t) -1;[m
[31m-static ngx_event_t    notify_event;[m
[31m-[m
[31m-static ngx_str_t      eventport_name = ngx_string("eventport");[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_eventport_commands[] = {[m
[31m-[m
[31m-    { ngx_string("eventport_events"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_eventport_conf_t, events),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_eventport_module_ctx = {[m
[31m-    &eventport_name,[m
[31m-    ngx_eventport_create_conf,             /* create configuration */[m
[31m-    ngx_eventport_init_conf,               /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_eventport_add_event,           /* add an event */[m
[31m-        ngx_eventport_del_event,           /* delete an event */[m
[31m-        ngx_eventport_add_event,           /* enable an event */[m
[31m-        ngx_eventport_del_event,           /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        ngx_eventport_notify,              /* trigger a notify */[m
[31m-        ngx_eventport_process_events,      /* process the events */[m
[31m-        ngx_eventport_init,                /* init the events */[m
[31m-        ngx_eventport_done,                /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_eventport_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_eventport_module_ctx,             /* module context */[m
[31m-    ngx_eventport_commands,                /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_eventport_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    port_notify_t          pn;[m
[31m-    struct itimerspec      its;[m
[31m-    struct sigevent        sev;[m
[31m-    ngx_eventport_conf_t  *epcf;[m
[31m-[m
[31m-    epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_eventport_module);[m
[31m-[m
[31m-    if (ep == -1) {[m
[31m-        ep = port_create();[m
[31m-[m
[31m-        if (ep == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "port_create() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        notify_event.active = 1;[m
[31m-        notify_event.log = cycle->log;[m
[31m-    }[m
[31m-[m
[31m-    if (nevents < epcf->events) {[m
[31m-        if (event_list) {[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = ngx_alloc(sizeof(port_event_t) * epcf->events,[m
[31m-                               cycle->log);[m
[31m-        if (event_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_EVENTPORT_EVENT;[m
[31m-[m
[31m-    if (timer) {[m
[31m-        ngx_memzero(&pn, sizeof(port_notify_t));[m
[31m-        pn.portnfy_port = ep;[m
[31m-[m
[31m-        ngx_memzero(&sev, sizeof(struct sigevent));[m
[31m-        sev.sigev_notify = SIGEV_PORT;[m
[31m-#if !(NGX_TEST_BUILD_EVENTPORT)[m
[31m-        sev.sigev_value.sival_ptr = &pn;[m
[31m-#endif[m
[31m-[m
[31m-        if (timer_create(CLOCK_REALTIME, &sev, &event_timer) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "timer_create() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        its.it_interval.tv_sec = timer / 1000;[m
[31m-        its.it_interval.tv_nsec = (timer % 1000) * 1000000;[m
[31m-        its.it_value.tv_sec = timer / 1000;[m
[31m-        its.it_value.tv_nsec = (timer % 1000) * 1000000;[m
[31m-[m
[31m-        if (timer_settime(event_timer, 0, &its, NULL) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "timer_settime() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_event_flags |= NGX_USE_TIMER_EVENT;[m
[31m-    }[m
[31m-[m
[31m-    nevents = epcf->events;[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_eventport_module_ctx.actions;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_eventport_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (event_timer != (timer_t) -1) {[m
[31m-        if (timer_delete(event_timer) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "timer_delete() failed");[m
[31m-        }[m
[31m-[m
[31m-        event_timer = (timer_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    if (close(ep) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "close() event port failed");[m
[31m-    }[m
[31m-[m
[31m-    ep = -1;[m
[31m-[m
[31m-    ngx_free(event_list);[m
[31m-[m
[31m-    event_list = NULL;[m
[31m-    nevents = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t          events, prev;[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    events = event;[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-        prev = POLLOUT;[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-        events = POLLIN;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        prev = POLLIN;[m
[31m-#if (NGX_WRITE_EVENT != POLLOUT)[m
[31m-        events = POLLOUT;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (e->oneshot) {[m
[31m-        events |= prev;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "eventport add event: fd:%d ev:%04Xi", c->fd, events);[m
[31m-[m
[31m-    if (port_associate(ep, PORT_SOURCE_FD, c->fd, events,[m
[31m-                       (void *) ((uintptr_t) ev | ev->instance))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                      "port_associate() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-    ev->oneshot = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    /*[m
[31m-     * when the file descriptor is closed, the event port automatically[m
[31m-     * dissociates it from the port, so we do not need to dissociate explicitly[m
[31m-     * the event before the closing the file descriptor[m
[31m-     */[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        ev->active = 0;[m
[31m-        ev->oneshot = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-        event = POLLOUT;[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-        event = POLLIN;[m
[31m-    }[m
[31m-[m
[31m-    if (e->oneshot) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "eventport change event: fd:%d ev:%04Xi", c->fd, event);[m
[31m-[m
[31m-        if (port_associate(ep, PORT_SOURCE_FD, c->fd, event,[m
[31m-                           (void *) ((uintptr_t) ev | ev->instance))[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                          "port_associate() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "eventport del event: fd:%d", c->fd);[m
[31m-[m
[31m-        if (port_dissociate(ep, PORT_SOURCE_FD, c->fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                          "port_dissociate() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-    ev->oneshot = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_eventport_notify(ngx_event_handler_pt handler)[m
[31m-{[m
[31m-    notify_event.handler = handler;[m
[31m-[m
[31m-    if (port_send(ep, 0, &notify_event) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno,[m
[31m-                      "port_send() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                 n, revents;[m
[31m-    u_int               events;[m
[31m-    ngx_err_t           err;[m
[31m-    ngx_int_t           instance;[m
[31m-    ngx_uint_t          i, level;[m
[31m-    ngx_event_t        *ev, *rev, *wev;[m
[31m-    ngx_queue_t        *queue;[m
[31m-    ngx_connection_t   *c;[m
[31m-    struct timespec     ts, *tp;[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        tp = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        ts.tv_sec = timer / 1000;[m
[31m-        ts.tv_nsec = (timer % 1000) * 1000000;[m
[31m-        tp = &ts;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "eventport timer: %M", timer);[m
[31m-[m
[31m-    events = 1;[m
[31m-[m
[31m-    n = port_getn(ep, event_list, (u_int) nevents, &events, tp);[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == ETIME) {[m
[31m-            if (timer != NGX_TIMER_INFINITE) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "port_getn() returned no events without timeout");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        level = (err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT;[m
[31m-        ngx_log_error(level, cycle->log, err, "port_getn() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (events == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "port_getn() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < events; i++) {[m
[31m-[m
[31m-        if (event_list[i].portev_source == PORT_SOURCE_TIMER) {[m
[31m-            ngx_time_update();[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ev = event_list[i].portev_user;[m
[31m-[m
[31m-        switch (event_list[i].portev_source) {[m
[31m-[m
[31m-        case PORT_SOURCE_FD:[m
[31m-[m
[31m-            instance = (uintptr_t) ev & 1;[m
[31m-            ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);[m
[31m-[m
[31m-            if (ev->closed || ev->instance != instance) {[m
[31m-[m
[31m-                /*[m
[31m-                 * the stale event from a file descriptor[m
[31m-                 * that was just closed in this iteration[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "eventport: stale event %p", ev);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            revents = event_list[i].portev_events;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "eventport: fd:%d, ev:%04Xd",[m
[31m-                           (int) event_list[i].portev_object, revents);[m
[31m-[m
[31m-            if (revents & (POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "port_getn() error fd:%d ev:%04Xd",[m
[31m-                               (int) event_list[i].portev_object, revents);[m
[31m-            }[m
[31m-[m
[31m-            if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "strange port_getn() events fd:%d ev:%04Xd",[m
[31m-                              (int) event_list[i].portev_object, revents);[m
[31m-            }[m
[31m-[m
[31m-            if ((revents & (POLLERR|POLLHUP|POLLNVAL))[m
[31m-                 && (revents & (POLLIN|POLLOUT)) == 0)[m
[31m-            {[m
[31m-                /*[m
[31m-                 * if the error events were returned without POLLIN or POLLOUT,[m
[31m-                 * then add these flags to handle the events at least in one[m
[31m-                 * active handler[m
[31m-                 */[m
[31m-[m
[31m-                revents |= POLLIN|POLLOUT;[m
[31m-            }[m
[31m-[m
[31m-            c = ev->data;[m
[31m-            rev = c->read;[m
[31m-            wev = c->write;[m
[31m-[m
[31m-            rev->active = 0;[m
[31m-            wev->active = 0;[m
[31m-[m
[31m-            if (revents & POLLIN) {[m
[31m-                rev->ready = 1;[m
[31m-[m
[31m-                if (flags & NGX_POST_EVENTS) {[m
[31m-                    queue = rev->accept ? &ngx_posted_accept_events[m
[31m-                                        : &ngx_posted_events;[m
[31m-[m
[31m-                    ngx_post_event(rev, queue);[m
[31m-[m
[31m-                } else {[m
[31m-                    rev->handler(rev);[m
[31m-[m
[31m-                    if (ev->closed || ev->instance != instance) {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (rev->accept) {[m
[31m-                    if (ngx_use_accept_mutex) {[m
[31m-                        ngx_accept_events = 1;[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    if (port_associate(ep, PORT_SOURCE_FD, c->fd, POLLIN,[m
[31m-                                       (void *) ((uintptr_t) ev | ev->instance))[m
[31m-                        == -1)[m
[31m-                    {[m
[31m-                        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                                      "port_associate() failed");[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (revents & POLLOUT) {[m
[31m-                wev->ready = 1;[m
[31m-[m
[31m-                if (flags & NGX_POST_EVENTS) {[m
[31m-                    ngx_post_event(wev, &ngx_posted_events);[m
[31m-[m
[31m-                } else {[m
[31m-                    wev->handler(wev);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case PORT_SOURCE_USER:[m
[31m-[m
[31m-            ev->handler(ev);[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "unexpected eventport object %d",[m
[31m-                          (int) event_list[i].portev_object);[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_eventport_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_eventport_conf_t  *epcf;[m
[31m-[m
[31m-    epcf = ngx_palloc(cycle->pool, sizeof(ngx_eventport_conf_t));[m
[31m-    if (epcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    epcf->events = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return epcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_eventport_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_eventport_conf_t *epcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(epcf->events, 32);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_iocp_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_iocp_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8f163e3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_iocp_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,378 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_iocp_module.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static ngx_thread_value_t __stdcall ngx_iocp_timer(void *data);[m
[31m-static void ngx_iocp_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t key);[m
[31m-static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static void *ngx_iocp_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t      iocp_name = ngx_string("iocp");[m
[31m-[m
[31m-static ngx_command_t  ngx_iocp_commands[] = {[m
[31m-[m
[31m-    { ngx_string("iocp_threads"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_iocp_conf_t, threads),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("post_acceptex"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_iocp_conf_t, post_acceptex),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("acceptex_read"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_iocp_conf_t, acceptex_read),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_iocp_module_ctx = {[m
[31m-    &iocp_name,[m
[31m-    ngx_iocp_create_conf,                  /* create configuration */[m
[31m-    ngx_iocp_init_conf,                    /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_iocp_add_event,                /* add an event */[m
[31m-        NULL,                              /* delete an event */[m
[31m-        NULL,                              /* enable an event */[m
[31m-        NULL,                              /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        ngx_iocp_del_connection,           /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_iocp_process_events,           /* process the events */[m
[31m-        ngx_iocp_init,                     /* init the events */[m
[31m-        ngx_iocp_done                      /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_iocp_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_iocp_module_ctx,                  /* module context */[m
[31m-    ngx_iocp_commands,                     /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_os_io_t ngx_iocp_io = {[m
[31m-    ngx_overlapped_wsarecv,[m
[31m-    NULL,[m
[31m-    ngx_udp_overlapped_wsarecv,[m
[31m-    NULL,[m
[31m-    ngx_overlapped_wsasend_chain,[m
[31m-    0[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static HANDLE      iocp;[m
[31m-static ngx_tid_t   timer_thread;[m
[31m-static ngx_msec_t  msec;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_iocp_conf_t  *cf;[m
[31m-[m
[31m-    cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);[m
[31m-[m
[31m-    if (iocp == NULL) {[m
[31m-        iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0,[m
[31m-                                      cf->threads);[m
[31m-    }[m
[31m-[m
[31m-    if (iocp == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateIoCompletionPort() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_io = ngx_iocp_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_iocp_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_IOCP_EVENT;[m
[31m-[m
[31m-    if (timer == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * The waitable timer could not be used, because[m
[31m-     * GetQueuedCompletionStatus() does not set a thread to alertable state[m
[31m-     */[m
[31m-[m
[31m-    if (timer_thread == NULL) {[m
[31m-[m
[31m-        msec = timer;[m
[31m-[m
[31m-        if (ngx_create_thread(&timer_thread, ngx_iocp_timer, &msec, cycle->log)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_flags |= NGX_USE_TIMER_EVENT;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_thread_value_t __stdcall[m
[31m-ngx_iocp_timer(void *data)[m
[31m-{[m
[31m-    ngx_msec_t  timer = *(ngx_msec_t *) data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                   "THREAD %p %p", &msec, data);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        Sleep(timer);[m
[31m-[m
[31m-        ngx_time_update();[m
[31m-#if 1[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer");[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if defined(__WATCOMC__) || defined(__GNUC__)[m
[31m-    return 0;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_iocp_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (CloseHandle(iocp) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "iocp CloseHandle() failed");[m
[31m-    }[m
[31m-[m
[31m-    iocp = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_iocp_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t key)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = (ngx_connection_t *) ev->data;[m
[31m-[m
[31m-    c->read->active = 1;[m
[31m-    c->write->active = 1;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "iocp add: fd:%d k:%ui ov:%p", c->fd, key, &ev->ovlp);[m
[31m-[m
[31m-    if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "CreateIoCompletionPort() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_iocp_del_connection(ngx_connection_t *c, ngx_uint_t flags)[m
[31m-{[m
[31m-#if 0[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (CancelIo((HANDLE) c->fd) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static[m
[31m-ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    u_int              key;[m
[31m-    u_long             bytes;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_msec_t         delta;[m
[31m-    ngx_event_t       *ev;[m
[31m-    ngx_event_ovlp_t  *ovlp;[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        timer = INFINITE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "iocp timer: %M", timer);[m
[31m-[m
[31m-    rc = GetQueuedCompletionStatus(iocp, &bytes, (PULONG_PTR) &key,[m
[31m-                                   (LPOVERLAPPED *) &ovlp, (u_long) timer);[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        err = ngx_errno;[m
[31m-    } else {[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    delta = ngx_current_msec;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "iocp: %d b:%d k:%d ov:%p", rc, bytes, key, ovlp);[m
[31m-[m
[31m-    if (timer != INFINITE) {[m
[31m-        delta = ngx_current_msec - delta;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "iocp timer: %M, delta: %M", timer, delta);[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (ovlp == NULL) {[m
[31m-            if (err != WAIT_TIMEOUT) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                              "GetQueuedCompletionStatus() failed");[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ovlp->error = err;[m
[31m-    }[m
[31m-[m
[31m-    if (ovlp == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "GetQueuedCompletionStatus() returned no operation");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ev = ovlp->event;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, "iocp event:%p", ev);[m
[31m-[m
[31m-[m
[31m-    if (err == ERROR_NETNAME_DELETED /* the socket was closed */[m
[31m-        || err == ERROR_OPERATION_ABORTED /* the operation was canceled */)[m
[31m-    {[m
[31m-[m
[31m-        /*[m
[31m-         * the WSA_OPERATION_ABORTED completion notification[m
[31m-         * for a file descriptor that was closed[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err,[m
[31m-                       "iocp: aborted event %p", ev);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                      "GetQueuedCompletionStatus() returned operation error");[m
[31m-    }[m
[31m-[m
[31m-    switch (key) {[m
[31m-[m
[31m-    case NGX_IOCP_ACCEPT:[m
[31m-        if (bytes) {[m
[31m-            ev->ready = 1;[m
[31m-        }[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_IOCP_IO:[m
[31m-        ev->complete = 1;[m
[31m-        ev->ready = 1;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_IOCP_CONNECT:[m
[31m-        ev->ready = 1;[m
[31m-    }[m
[31m-[m
[31m-    ev->available = bytes;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "iocp event handler: %p", ev->handler);[m
[31m-[m
[31m-    ev->handler(ev);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_iocp_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_iocp_conf_t  *cf;[m
[31m-[m
[31m-    cf = ngx_palloc(cycle->pool, sizeof(ngx_iocp_conf_t));[m
[31m-    if (cf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cf->threads = NGX_CONF_UNSET;[m
[31m-    cf->post_acceptex = NGX_CONF_UNSET;[m
[31m-    cf->acceptex_read = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return cf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_iocp_conf_t *cf = conf;[m
[31m-[m
[31m-    ngx_conf_init_value(cf->threads, 0);[m
[31m-    ngx_conf_init_value(cf->post_acceptex, 10);[m
[31m-    ngx_conf_init_value(cf->acceptex_read, 1);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_iocp_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_iocp_module.h[m
[1mdeleted file mode 100644[m
[1mindex dc73983..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_iocp_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_IOCP_MODULE_H_INCLUDED_[m
[31m-#define _NGX_IOCP_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int  threads;[m
[31m-    int  post_acceptex;[m
[31m-    int  acceptex_read;[m
[31m-} ngx_iocp_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_iocp_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_IOCP_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_kqueue_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_kqueue_module.c[m
[1mdeleted file mode 100644[m
[1mindex ca3bfe4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_kqueue_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,722 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  changes;[m
[31m-    ngx_uint_t  events;[m
[31m-} ngx_kqueue_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-#ifdef EVFILT_USER[m
[31m-static ngx_int_t ngx_kqueue_notify_init(ngx_log_t *log);[m
[31m-#endif[m
[31m-static void ngx_kqueue_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter,[m
[31m-    ngx_uint_t flags);[m
[31m-#ifdef EVFILT_USER[m
[31m-static ngx_int_t ngx_kqueue_notify(ngx_event_handler_pt handler);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_inline void ngx_kqueue_dump_event(ngx_log_t *log,[m
[31m-    struct kevent *kev);[m
[31m-[m
[31m-static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-int                    ngx_kqueue = -1;[m
[31m-[m
[31m-static struct kevent  *change_list;[m
[31m-static struct kevent  *event_list;[m
[31m-static ngx_uint_t      max_changes, nchanges, nevents;[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-static ngx_event_t     notify_event;[m
[31m-static struct kevent   notify_kev;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_str_t      kqueue_name = ngx_string("kqueue");[m
[31m-[m
[31m-static ngx_command_t  ngx_kqueue_commands[] = {[m
[31m-[m
[31m-    { ngx_string("kqueue_changes"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_kqueue_conf_t, changes),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("kqueue_events"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_kqueue_conf_t, events),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_kqueue_module_ctx = {[m
[31m-    &kqueue_name,[m
[31m-    ngx_kqueue_create_conf,                /* create configuration */[m
[31m-    ngx_kqueue_init_conf,                  /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_kqueue_add_event,              /* add an event */[m
[31m-        ngx_kqueue_del_event,              /* delete an event */[m
[31m-        ngx_kqueue_add_event,              /* enable an event */[m
[31m-        ngx_kqueue_del_event,              /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-#ifdef EVFILT_USER[m
[31m-        ngx_kqueue_notify,                 /* trigger a notify */[m
[31m-#else[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-#endif[m
[31m-        ngx_kqueue_process_events,         /* process the events */[m
[31m-        ngx_kqueue_init,                   /* init the events */[m
[31m-        ngx_kqueue_done                    /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_kqueue_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_kqueue_module_ctx,                /* module context */[m
[31m-    ngx_kqueue_commands,                   /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_kqueue_conf_t  *kcf;[m
[31m-    struct timespec     ts;[m
[31m-#if (NGX_HAVE_TIMER_EVENT)[m
[31m-    struct kevent       kev;[m
[31m-#endif[m
[31m-[m
[31m-    kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);[m
[31m-[m
[31m-    if (ngx_kqueue == -1) {[m
[31m-        ngx_kqueue = kqueue();[m
[31m-[m
[31m-        if (ngx_kqueue == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "kqueue() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-        if (ngx_kqueue_notify_init(cycle->log) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (max_changes < kcf->changes) {[m
[31m-        if (nchanges) {[m
[31m-            ts.tv_sec = 0;[m
[31m-            ts.tv_nsec = 0;[m
[31m-[m
[31m-            if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts)[m
[31m-                == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                              "kevent() failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            nchanges = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (change_list) {[m
[31m-            ngx_free(change_list);[m
[31m-        }[m
[31m-[m
[31m-        change_list = ngx_alloc(kcf->changes * sizeof(struct kevent),[m
[31m-                                cycle->log);[m
[31m-        if (change_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    max_changes = kcf->changes;[m
[31m-[m
[31m-    if (nevents < kcf->events) {[m
[31m-        if (event_list) {[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = ngx_alloc(kcf->events * sizeof(struct kevent), cycle->log);[m
[31m-        if (event_list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_ONESHOT_EVENT[m
[31m-                      |NGX_USE_KQUEUE_EVENT[m
[31m-                      |NGX_USE_VNODE_EVENT;[m
[31m-[m
[31m-#if (NGX_HAVE_TIMER_EVENT)[m
[31m-[m
[31m-    if (timer) {[m
[31m-        kev.ident = 0;[m
[31m-        kev.filter = EVFILT_TIMER;[m
[31m-        kev.flags = EV_ADD|EV_ENABLE;[m
[31m-        kev.fflags = 0;[m
[31m-        kev.data = timer;[m
[31m-        kev.udata = 0;[m
[31m-[m
[31m-        ts.tv_sec = 0;[m
[31m-        ts.tv_nsec = 0;[m
[31m-[m
[31m-        if (kevent(ngx_kqueue, &kev, 1, NULL, 0, &ts) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "kevent(EVFILT_TIMER) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_event_flags |= NGX_USE_TIMER_EVENT;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_CLEAR_EVENT)[m
[31m-    ngx_event_flags |= NGX_USE_CLEAR_EVENT;[m
[31m-#else[m
[31m-    ngx_event_flags |= NGX_USE_LEVEL_EVENT;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_LOWAT_EVENT)[m
[31m-    ngx_event_flags |= NGX_USE_LOWAT_EVENT;[m
[31m-#endif[m
[31m-[m
[31m-    nevents = kcf->events;[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_kqueue_module_ctx.actions;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_notify_init(ngx_log_t *log)[m
[31m-{[m
[31m-    notify_kev.ident = 0;[m
[31m-    notify_kev.filter = EVFILT_USER;[m
[31m-    notify_kev.data = 0;[m
[31m-    notify_kev.flags = EV_ADD|EV_CLEAR;[m
[31m-    notify_kev.fflags = 0;[m
[31m-    notify_kev.udata = 0;[m
[31m-[m
[31m-    if (kevent(ngx_kqueue, &notify_kev, 1, NULL, 0, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "kevent(EVFILT_USER, EV_ADD) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    notify_event.active = 1;[m
[31m-    notify_event.log = log;[m
[31m-[m
[31m-    notify_kev.flags = 0;[m
[31m-    notify_kev.fflags = NOTE_TRIGGER;[m
[31m-    notify_kev.udata = NGX_KQUEUE_UDATA_T ((uintptr_t) &notify_event);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_kqueue_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (close(ngx_kqueue) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "kqueue close() failed");[m
[31m-    }[m
[31m-[m
[31m-    ngx_kqueue = -1;[m
[31m-[m
[31m-    ngx_free(change_list);[m
[31m-    ngx_free(event_list);[m
[31m-[m
[31m-    change_list = NULL;[m
[31m-    event_list = NULL;[m
[31m-    max_changes = 0;[m
[31m-    nchanges = 0;[m
[31m-    nevents = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-#if 0[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-#endif[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-    ev->disabled = 0;[m
[31m-    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-    if (ev->index < nchanges[m
[31m-        && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)[m
[31m-            == (uintptr_t) ev)[m
[31m-    {[m
[31m-        if (change_list[ev->index].flags == EV_DISABLE) {[m
[31m-[m
[31m-            /*[m
[31m-             * if the EV_DISABLE is still not passed to a kernel[m
[31m-             * we will not pass it[m
[31m-             */[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                           "kevent activated: %d: ft:%i",[m
[31m-                           ngx_event_ident(ev->data), event);[m
[31m-[m
[31m-            if (ev->index < --nchanges) {[m
[31m-                e = (ngx_event_t *)[m
[31m-                    ((uintptr_t) change_list[nchanges].udata & (uintptr_t) ~1);[m
[31m-                change_list[ev->index] = change_list[nchanges];[m
[31m-                e->index = ev->index;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        c = ev->data;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "previous event on #%d were not passed in kernel", c->fd);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_event_t  *e;[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-    ev->disabled = 0;[m
[31m-[m
[31m-    if (ev->index < nchanges[m
[31m-        && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)[m
[31m-            == (uintptr_t) ev)[m
[31m-    {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "kevent deleted: %d: ft:%i",[m
[31m-                       ngx_event_ident(ev->data), event);[m
[31m-[m
[31m-        /* if the event is still not passed to a kernel we will not pass it */[m
[31m-[m
[31m-        nchanges--;[m
[31m-[m
[31m-        if (ev->index < nchanges) {[m
[31m-            e = (ngx_event_t *)[m
[31m-                    ((uintptr_t) change_list[nchanges].udata & (uintptr_t) ~1);[m
[31m-            change_list[ev->index] = change_list[nchanges];[m
[31m-            e->index = ev->index;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * when the file descriptor is closed the kqueue automatically deletes[m
[31m-     * its filters so we do not need to delete explicitly the event[m
[31m-     * before the closing the file descriptor.[m
[31m-     */[m
[31m-[m
[31m-    if (flags & NGX_CLOSE_EVENT) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_DISABLE_EVENT) {[m
[31m-        ev->disabled = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        flags |= EV_DELETE;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_kqueue_set_event(ev, event, flags);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, ngx_uint_t flags)[m
[31m-{[m
[31m-    struct kevent     *kev;[m
[31m-    struct timespec    ts;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "kevent set event: %d: ft:%i fl:%04Xi",[m
[31m-                   c->fd, filter, flags);[m
[31m-[m
[31m-    if (nchanges >= max_changes) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ev->log, 0,[m
[31m-                      "kqueue change list is filled up");[m
[31m-[m
[31m-        ts.tv_sec = 0;[m
[31m-        ts.tv_nsec = 0;[m
[31m-[m
[31m-        if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    kev = &change_list[nchanges];[m
[31m-[m
[31m-    kev->ident = c->fd;[m
[31m-    kev->filter = (short) filter;[m
[31m-    kev->flags = (u_short) flags;[m
[31m-    kev->udata = NGX_KQUEUE_UDATA_T ((uintptr_t) ev | ev->instance);[m
[31m-[m
[31m-    if (filter == EVFILT_VNODE) {[m
[31m-        kev->fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND[m
[31m-                                 |NOTE_ATTRIB|NOTE_RENAME[m
[31m-#if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \[m
[31m-    || __FreeBSD_version >= 500018[m
[31m-                                 |NOTE_REVOKE[m
[31m-#endif[m
[31m-                      ;[m
[31m-        kev->data = 0;[m
[31m-[m
[31m-    } else {[m
[31m-#if (NGX_HAVE_LOWAT_EVENT)[m
[31m-        if (flags & NGX_LOWAT_EVENT) {[m
[31m-            kev->fflags = NOTE_LOWAT;[m
[31m-            kev->data = ev->available;[m
[31m-[m
[31m-        } else {[m
[31m-            kev->fflags = 0;[m
[31m-            kev->data = 0;[m
[31m-        }[m
[31m-#else[m
[31m-        kev->fflags = 0;[m
[31m-        kev->data = 0;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ev->index = nchanges;[m
[31m-    nchanges++;[m
[31m-[m
[31m-    if (flags & NGX_FLUSH_EVENT) {[m
[31m-        ts.tv_sec = 0;[m
[31m-        ts.tv_nsec = 0;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "kevent flush");[m
[31m-[m
[31m-        if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        nchanges = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_notify(ngx_event_handler_pt handler)[m
[31m-{[m
[31m-    notify_event.handler = handler;[m
[31m-[m
[31m-    if (kevent(ngx_kqueue, &notify_kev, 1, NULL, 0, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno,[m
[31m-                      "kevent(EVFILT_USER, NOTE_TRIGGER) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int               events, n;[m
[31m-    ngx_int_t         i, instance;[m
[31m-    ngx_uint_t        level;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *ev;[m
[31m-    ngx_queue_t      *queue;[m
[31m-    struct timespec   ts, *tp;[m
[31m-[m
[31m-    n = (int) nchanges;[m
[31m-    nchanges = 0;[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        tp = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ts.tv_sec = timer / 1000;[m
[31m-        ts.tv_nsec = (timer % 1000) * 1000000;[m
[31m-[m
[31m-        /*[m
[31m-         * 64-bit Darwin kernel has the bug: kernel level ts.tv_nsec is[m
[31m-         * the int32_t while user level ts.tv_nsec is the long (64-bit),[m
[31m-         * so on the big endian PowerPC all nanoseconds are lost.[m
[31m-         */[m
[31m-[m
[31m-#if (NGX_DARWIN_KEVENT_BUG)[m
[31m-        ts.tv_nsec <<= 32;[m
[31m-#endif[m
[31m-[m
[31m-        tp = &ts;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "kevent timer: %M, changes: %d", timer, n);[m
[31m-[m
[31m-    events = kevent(ngx_kqueue, change_list, n, event_list, (int) nevents, tp);[m
[31m-[m
[31m-    err = (events == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "kevent events: %d", events);[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "kevent() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (events == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "kevent() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < events; i++) {[m
[31m-[m
[31m-        ngx_kqueue_dump_event(cycle->log, &event_list[i]);[m
[31m-[m
[31m-        if (event_list[i].flags & EV_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, event_list[i].data,[m
[31m-                          "kevent() error on %d filter:%d flags:%04Xd",[m
[31m-                          (int) event_list[i].ident, event_list[i].filter,[m
[31m-                          event_list[i].flags);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_TIMER_EVENT)[m
[31m-[m
[31m-        if (event_list[i].filter == EVFILT_TIMER) {[m
[31m-            ngx_time_update();[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ev = (ngx_event_t *) event_list[i].udata;[m
[31m-[m
[31m-        switch (event_list[i].filter) {[m
[31m-[m
[31m-        case EVFILT_READ:[m
[31m-        case EVFILT_WRITE:[m
[31m-[m
[31m-            instance = (uintptr_t) ev & 1;[m
[31m-            ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);[m
[31m-[m
[31m-            if (ev->closed || ev->instance != instance) {[m
[31m-[m
[31m-                /*[m
[31m-                 * the stale event from a file descriptor[m
[31m-                 * that was just closed in this iteration[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "kevent: stale event %p", ev);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ev->log && (ev->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {[m
[31m-                ngx_kqueue_dump_event(ev->log, &event_list[i]);[m
[31m-            }[m
[31m-[m
[31m-            if (ev->oneshot) {[m
[31m-                ev->active = 0;[m
[31m-            }[m
[31m-[m
[31m-            ev->available = event_list[i].data;[m
[31m-[m
[31m-            if (event_list[i].flags & EV_EOF) {[m
[31m-                ev->pending_eof = 1;[m
[31m-                ev->kq_errno = event_list[i].fflags;[m
[31m-            }[m
[31m-[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case EVFILT_VNODE:[m
[31m-            ev->kq_vnode = 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case EVFILT_AIO:[m
[31m-            ev->complete = 1;[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-#ifdef EVFILT_USER[m
[31m-        case EVFILT_USER:[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "unexpected kevent() filter %d",[m
[31m-                          event_list[i].filter);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_POST_EVENTS) {[m
[31m-            queue = ev->accept ? &ngx_posted_accept_events[m
[31m-                               : &ngx_posted_events;[m
[31m-[m
[31m-            ngx_post_event(ev, queue);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_kqueue_dump_event(ngx_log_t *log, struct kevent *kev)[m
[31m-{[m
[31m-    if (kev->ident > 0x8000000 && kev->ident != (unsigned) -1) {[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                       "kevent: %p: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p",[m
[31m-                       (void *) kev->ident, kev->filter,[m
[31m-                       kev->flags, kev->fflags,[m
[31m-                       (int) kev->data, kev->udata);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                       "kevent: %d: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p",[m
[31m-                       (int) kev->ident, kev->filter,[m
[31m-                       kev->flags, kev->fflags,[m
[31m-                       (int) kev->data, kev->udata);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_kqueue_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_kqueue_conf_t  *kcf;[m
[31m-[m
[31m-    kcf = ngx_palloc(cycle->pool, sizeof(ngx_kqueue_conf_t));[m
[31m-    if (kcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    kcf->changes = NGX_CONF_UNSET;[m
[31m-    kcf->events = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return kcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_kqueue_conf_t *kcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(kcf->changes, 512);[m
[31m-    ngx_conf_init_uint_value(kcf->events, 512);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_poll_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_poll_module.c[m
[1mdeleted file mode 100644[m
[1mindex 4370950..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_poll_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,417 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_poll_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static char *ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static struct pollfd  *event_list;[m
[31m-static ngx_uint_t      nevents;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t    poll_name = ngx_string("poll");[m
[31m-[m
[31m-ngx_event_module_t  ngx_poll_module_ctx = {[m
[31m-    &poll_name,[m
[31m-    NULL,                                  /* create configuration */[m
[31m-    ngx_poll_init_conf,                    /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_poll_add_event,                /* add an event */[m
[31m-        ngx_poll_del_event,                /* delete an event */[m
[31m-        ngx_poll_add_event,                /* enable an event */[m
[31m-        ngx_poll_del_event,                /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_poll_process_events,           /* process the events */[m
[31m-        ngx_poll_init,                     /* init the events */[m
[31m-        ngx_poll_done                      /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_poll_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_poll_module_ctx,                  /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    struct pollfd   *list;[m
[31m-[m
[31m-    if (event_list == NULL) {[m
[31m-        nevents = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process >= NGX_PROCESS_WORKER[m
[31m-        || cycle->old_cycle == NULL[m
[31m-        || cycle->old_cycle->connection_n < cycle->connection_n)[m
[31m-    {[m
[31m-        list = ngx_alloc(sizeof(struct pollfd) * cycle->connection_n,[m
[31m-                         cycle->log);[m
[31m-        if (list == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (event_list) {[m
[31m-            ngx_memcpy(list, event_list, sizeof(ngx_event_t *) * nevents);[m
[31m-            ngx_free(event_list);[m
[31m-        }[m
[31m-[m
[31m-        event_list = list;[m
[31m-    }[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_poll_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_FD_EVENT;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_poll_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_free(event_list);[m
[31m-[m
[31m-    event_list = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-[m
[31m-    if (ev->index != NGX_INVALID_INDEX) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "poll event fd:%d ev:%i is already set", c->fd, event);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-        event = POLLIN;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-#if (NGX_WRITE_EVENT != POLLOUT)[m
[31m-        event = POLLOUT;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "poll add event: fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (e == NULL || e->index == NGX_INVALID_INDEX) {[m
[31m-        event_list[nevents].fd = c->fd;[m
[31m-        event_list[nevents].events = (short) event;[m
[31m-        event_list[nevents].revents = 0;[m
[31m-[m
[31m-        ev->index = nevents;[m
[31m-        nevents++;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "poll add index: %i", e->index);[m
[31m-[m
[31m-        event_list[e->index].events |= (short) event;[m
[31m-        ev->index = e->index;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    if (ev->index == NGX_INVALID_INDEX) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "poll event fd:%d ev:%i is already deleted",[m
[31m-                      c->fd, event);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        e = c->write;[m
[31m-#if (NGX_READ_EVENT != POLLIN)[m
[31m-        event = POLLIN;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        e = c->read;[m
[31m-#if (NGX_WRITE_EVENT != POLLOUT)[m
[31m-        event = POLLOUT;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "poll del event: fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (e == NULL || e->index == NGX_INVALID_INDEX) {[m
[31m-        nevents--;[m
[31m-[m
[31m-        if (ev->index < nevents) {[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                           "index: copy event %ui to %i", nevents, ev->index);[m
[31m-[m
[31m-            event_list[ev->index] = event_list[nevents];[m
[31m-[m
[31m-            c = ngx_cycle->files[event_list[nevents].fd];[m
[31m-[m
[31m-            if (c->fd == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                              "unexpected last event");[m
[31m-[m
[31m-            } else {[m
[31m-                if (c->read->index == nevents) {[m
[31m-                    c->read->index = ev->index;[m
[31m-                }[m
[31m-[m
[31m-                if (c->write->index == nevents) {[m
[31m-                    c->write->index = ev->index;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "poll del index: %i", e->index);[m
[31m-[m
[31m-        event_list[e->index].events &= (short) ~event;[m
[31m-    }[m
[31m-[m
[31m-    ev->index = NGX_INVALID_INDEX;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)[m
[31m-{[m
[31m-    int                 ready, revents;[m
[31m-    ngx_err_t           err;[m
[31m-    ngx_uint_t          i, found, level;[m
[31m-    ngx_event_t        *ev;[m
[31m-    ngx_queue_t        *queue;[m
[31m-    ngx_connection_t   *c;[m
[31m-[m
[31m-    /* NGX_TIMER_INFINITE == INFTIM */[m
[31m-[m
[31m-#if (NGX_DEBUG0)[m
[31m-    if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) {[m
[31m-        for (i = 0; i < nevents; i++) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "poll: %ui: fd:%d ev:%04Xd",[m
[31m-                           i, event_list[i].fd, event_list[i].events);[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "poll timer: %M", timer);[m
[31m-[m
[31m-    ready = poll(event_list, (u_int) nevents, (int) timer);[m
[31m-[m
[31m-    err = (ready == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "poll ready %d of %ui", ready, nevents);[m
[31m-[m
[31m-    if (err) {[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "poll() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ready == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "poll() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < nevents && ready; i++) {[m
[31m-[m
[31m-        revents = event_list[i].revents;[m
[31m-[m
[31m-#if 1[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "poll: %ui: fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                       i, event_list[i].fd, event_list[i].events, revents);[m
[31m-#else[m
[31m-        if (revents) {[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "poll: %ui: fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                           i, event_list[i].fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (revents & POLLNVAL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "poll() error fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                          event_list[i].fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-[m
[31m-        if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "strange poll() events fd:%d ev:%04Xd rev:%04Xd",[m
[31m-                          event_list[i].fd, event_list[i].events, revents);[m
[31m-        }[m
[31m-[m
[31m-        if (event_list[i].fd == -1) {[m
[31m-            /*[m
[31m-             * the disabled event, a workaround for our possible bug,[m
[31m-             * see the comment below[m
[31m-             */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        c = ngx_cycle->files[event_list[i].fd];[m
[31m-[m
[31m-        if (c->fd == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unexpected event");[m
[31m-[m
[31m-            /*[m
[31m-             * it is certainly our fault and it should be investigated,[m
[31m-             * in the meantime we disable this event to avoid a CPU spinning[m
[31m-             */[m
[31m-[m
[31m-            if (i == nevents - 1) {[m
[31m-                nevents--;[m
[31m-            } else {[m
[31m-                event_list[i].fd = -1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((revents & (POLLERR|POLLHUP|POLLNVAL))[m
[31m-             && (revents & (POLLIN|POLLOUT)) == 0)[m
[31m-        {[m
[31m-            /*[m
[31m-             * if the error events were returned without POLLIN or POLLOUT,[m
[31m-             * then add these flags to handle the events at least in one[m
[31m-             * active handler[m
[31m-             */[m
[31m-[m
[31m-            revents |= POLLIN|POLLOUT;[m
[31m-        }[m
[31m-[m
[31m-        found = 0;[m
[31m-[m
[31m-        if ((revents & POLLIN) && c->read->active) {[m
[31m-            found = 1;[m
[31m-[m
[31m-            ev = c->read;[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            queue = ev->accept ? &ngx_posted_accept_events[m
[31m-                               : &ngx_posted_events;[m
[31m-[m
[31m-            ngx_post_event(ev, queue);[m
[31m-        }[m
[31m-[m
[31m-        if ((revents & POLLOUT) && c->write->active) {[m
[31m-            found = 1;[m
[31m-[m
[31m-            ev = c->write;[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            ngx_post_event(ev, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        if (found) {[m
[31m-            ready--;[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ready != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll ready != events");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (ecf->use != ngx_poll_module.ctx_index) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_select_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_select_module.c[m
[1mdeleted file mode 100644[m
[1mindex 5a976bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_select_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,423 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_select_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static void ngx_select_repair_fd_sets(ngx_cycle_t *cycle);[m
[31m-static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static fd_set         master_read_fd_set;[m
[31m-static fd_set         master_write_fd_set;[m
[31m-static fd_set         work_read_fd_set;[m
[31m-static fd_set         work_write_fd_set;[m
[31m-[m
[31m-static ngx_int_t      max_fd;[m
[31m-static ngx_uint_t     nevents;[m
[31m-[m
[31m-static ngx_event_t  **event_index;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t    select_name = ngx_string("select");[m
[31m-[m
[31m-ngx_event_module_t  ngx_select_module_ctx = {[m
[31m-    &select_name,[m
[31m-    NULL,                                  /* create configuration */[m
[31m-    ngx_select_init_conf,                  /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_select_add_event,              /* add an event */[m
[31m-        ngx_select_del_event,              /* delete an event */[m
[31m-        ngx_select_add_event,              /* enable an event */[m
[31m-        ngx_select_del_event,              /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_select_process_events,         /* process the events */[m
[31m-        ngx_select_init,                   /* init the events */[m
[31m-        ngx_select_done                    /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_select_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_select_module_ctx,                /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_event_t  **index;[m
[31m-[m
[31m-    if (event_index == NULL) {[m
[31m-        FD_ZERO(&master_read_fd_set);[m
[31m-        FD_ZERO(&master_write_fd_set);[m
[31m-        nevents = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process >= NGX_PROCESS_WORKER[m
[31m-        || cycle->old_cycle == NULL[m
[31m-        || cycle->old_cycle->connection_n < cycle->connection_n)[m
[31m-    {[m
[31m-        index = ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n,[m
[31m-                          cycle->log);[m
[31m-        if (index == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (event_index) {[m
[31m-            ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents);[m
[31m-            ngx_free(event_index);[m
[31m-        }[m
[31m-[m
[31m-        event_index = index;[m
[31m-    }[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_select_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT;[m
[31m-[m
[31m-    max_fd = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_select_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_free(event_index);[m
[31m-[m
[31m-    event_index = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "select add event fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (ev->index != NGX_INVALID_INDEX) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "select event fd:%d ev:%i is already set", c->fd, event);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if ((event == NGX_READ_EVENT && ev->write)[m
[31m-        || (event == NGX_WRITE_EVENT && !ev->write))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "invalid select %s event fd:%d ev:%i",[m
[31m-                      ev->write ? "write" : "read", c->fd, event);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        FD_SET(c->fd, &master_read_fd_set);[m
[31m-[m
[31m-    } else if (event == NGX_WRITE_EVENT) {[m
[31m-        FD_SET(c->fd, &master_write_fd_set);[m
[31m-    }[m
[31m-[m
[31m-    if (max_fd != -1 && max_fd < c->fd) {[m
[31m-        max_fd = c->fd;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-[m
[31m-    event_index[nevents] = ev;[m
[31m-    ev->index = nevents;[m
[31m-    nevents++;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    if (ev->index == NGX_INVALID_INDEX) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "select del event fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        FD_CLR(c->fd, &master_read_fd_set);[m
[31m-[m
[31m-    } else if (event == NGX_WRITE_EVENT) {[m
[31m-        FD_CLR(c->fd, &master_write_fd_set);[m
[31m-    }[m
[31m-[m
[31m-    if (max_fd == c->fd) {[m
[31m-        max_fd = -1;[m
[31m-    }[m
[31m-[m
[31m-    if (ev->index < --nevents) {[m
[31m-        e = event_index[nevents];[m
[31m-        event_index[ev->index] = e;[m
[31m-        e->index = ev->index;[m
[31m-    }[m
[31m-[m
[31m-    ev->index = NGX_INVALID_INDEX;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                ready, nready;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_uint_t         i, found;[m
[31m-    ngx_event_t       *ev;[m
[31m-    ngx_queue_t       *queue;[m
[31m-    struct timeval     tv, *tp;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (max_fd == -1) {[m
[31m-        for (i = 0; i < nevents; i++) {[m
[31m-            c = event_index[i]->data;[m
[31m-            if (max_fd < c->fd) {[m
[31m-                max_fd = c->fd;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "change max_fd: %i", max_fd);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) {[m
[31m-        for (i = 0; i < nevents; i++) {[m
[31m-            ev = event_index[i];[m
[31m-            c = ev->data;[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "select event: fd:%d wr:%d", c->fd, ev->write);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "max_fd: %i", max_fd);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        tp = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        tv.tv_sec = (long) (timer / 1000);[m
[31m-        tv.tv_usec = (long) ((timer % 1000) * 1000);[m
[31m-        tp = &tv;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "select timer: %M", timer);[m
[31m-[m
[31m-    work_read_fd_set = master_read_fd_set;[m
[31m-    work_write_fd_set = master_write_fd_set;[m
[31m-[m
[31m-    ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, NULL, tp);[m
[31m-[m
[31m-    err = (ready == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "select ready %d", ready);[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_uint_t  level;[m
[31m-[m
[31m-        if (err == NGX_EINTR) {[m
[31m-[m
[31m-            if (ngx_event_timer_alarm) {[m
[31m-                ngx_event_timer_alarm = 0;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_INFO;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, cycle->log, err, "select() failed");[m
[31m-[m
[31m-        if (err == NGX_EBADF) {[m
[31m-            ngx_select_repair_fd_sets(cycle);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ready == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "select() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    nready = 0;[m
[31m-[m
[31m-    for (i = 0; i < nevents; i++) {[m
[31m-        ev = event_index[i];[m
[31m-        c = ev->data;[m
[31m-        found = 0;[m
[31m-[m
[31m-        if (ev->write) {[m
[31m-            if (FD_ISSET(c->fd, &work_write_fd_set)) {[m
[31m-                found = 1;[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "select write %d", c->fd);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (FD_ISSET(c->fd, &work_read_fd_set)) {[m
[31m-                found = 1;[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "select read %d", c->fd);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (found) {[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            queue = ev->accept ? &ngx_posted_accept_events[m
[31m-                               : &ngx_posted_events;[m
[31m-[m
[31m-            ngx_post_event(ev, queue);[m
[31m-[m
[31m-            nready++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ready != nready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "select ready != events: %d:%d", ready, nready);[m
[31m-[m
[31m-        ngx_select_repair_fd_sets(cycle);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_select_repair_fd_sets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int           n;[m
[31m-    socklen_t     len;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_socket_t  s;[m
[31m-[m
[31m-    for (s = 0; s <= max_fd; s++) {[m
[31m-[m
[31m-        if (FD_ISSET(s, &master_read_fd_set) == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "invalid descriptor #%d in read fd_set", s);[m
[31m-[m
[31m-            FD_CLR(s, &master_read_fd_set);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (s = 0; s <= max_fd; s++) {[m
[31m-[m
[31m-        if (FD_ISSET(s, &master_write_fd_set) == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "invalid descriptor #%d in write fd_set", s);[m
[31m-[m
[31m-            FD_CLR(s, &master_write_fd_set);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    max_fd = -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_select_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (ecf->use != ngx_select_module.ctx_index) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */[m
[31m-[m
[31m-    if (cycle->connection_n > FD_SETSIZE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "the maximum number of files "[m
[31m-                      "supported by select() is %ud", FD_SETSIZE);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_win32_select_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_win32_select_module.c[m
[1mdeleted file mode 100644[m
[1mindex c671f83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/modules/ngx_win32_select_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,398 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-static void ngx_select_done(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event,[m
[31m-    ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags);[m
[31m-static void ngx_select_repair_fd_sets(ngx_cycle_t *cycle);[m
[31m-static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static fd_set         master_read_fd_set;[m
[31m-static fd_set         master_write_fd_set;[m
[31m-static fd_set         work_read_fd_set;[m
[31m-static fd_set         work_write_fd_set;[m
[31m-[m
[31m-static ngx_uint_t     max_read;[m
[31m-static ngx_uint_t     max_write;[m
[31m-static ngx_uint_t     nevents;[m
[31m-[m
[31m-static ngx_event_t  **event_index;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t    select_name = ngx_string("select");[m
[31m-[m
[31m-ngx_event_module_t  ngx_select_module_ctx = {[m
[31m-    &select_name,[m
[31m-    NULL,                                  /* create configuration */[m
[31m-    ngx_select_init_conf,                  /* init configuration */[m
[31m-[m
[31m-    {[m
[31m-        ngx_select_add_event,              /* add an event */[m
[31m-        ngx_select_del_event,              /* delete an event */[m
[31m-        ngx_select_add_event,              /* enable an event */[m
[31m-        ngx_select_del_event,              /* disable an event */[m
[31m-        NULL,                              /* add an connection */[m
[31m-        NULL,                              /* delete an connection */[m
[31m-        NULL,                              /* trigger a notify */[m
[31m-        ngx_select_process_events,         /* process the events */[m
[31m-        ngx_select_init,                   /* init the events */[m
[31m-        ngx_select_done                    /* done the events */[m
[31m-    }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t  ngx_select_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_select_module_ctx,                /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_event_t  **index;[m
[31m-[m
[31m-    if (event_index == NULL) {[m
[31m-        FD_ZERO(&master_read_fd_set);[m
[31m-        FD_ZERO(&master_write_fd_set);[m
[31m-        nevents = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_process >= NGX_PROCESS_WORKER[m
[31m-        || cycle->old_cycle == NULL[m
[31m-        || cycle->old_cycle->connection_n < cycle->connection_n)[m
[31m-    {[m
[31m-        index = ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n,[m
[31m-                          cycle->log);[m
[31m-        if (index == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (event_index) {[m
[31m-            ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents);[m
[31m-            ngx_free(event_index);[m
[31m-        }[m
[31m-[m
[31m-        event_index = index;[m
[31m-    }[m
[31m-[m
[31m-    ngx_io = ngx_os_io;[m
[31m-[m
[31m-    ngx_event_actions = ngx_select_module_ctx.actions;[m
[31m-[m
[31m-    ngx_event_flags = NGX_USE_LEVEL_EVENT;[m
[31m-[m
[31m-    max_read = 0;[m
[31m-    max_write = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_select_done(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_free(event_index);[m
[31m-[m
[31m-    event_index = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "select add event fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (ev->index != NGX_INVALID_INDEX) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "select event fd:%d ev:%i is already set", c->fd, event);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if ((event == NGX_READ_EVENT && ev->write)[m
[31m-        || (event == NGX_WRITE_EVENT && !ev->write))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                      "invalid select %s event fd:%d ev:%i",[m
[31m-                      ev->write ? "write" : "read", c->fd, event);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((event == NGX_READ_EVENT && max_read >= FD_SETSIZE)[m
[31m-        || (event == NGX_WRITE_EVENT && max_write >= FD_SETSIZE))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ev->log, 0,[m
[31m-                      "maximum number of descriptors "[m
[31m-                      "supported by select() is %d", FD_SETSIZE);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        FD_SET(c->fd, &master_read_fd_set);[m
[31m-        max_read++;[m
[31m-[m
[31m-    } else if (event == NGX_WRITE_EVENT) {[m
[31m-        FD_SET(c->fd, &master_write_fd_set);[m
[31m-        max_write++;[m
[31m-    }[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-[m
[31m-    event_index[nevents] = ev;[m
[31m-    ev->index = nevents;[m
[31m-    nevents++;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_event_t       *e;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    if (ev->index == NGX_INVALID_INDEX) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "select del event fd:%d ev:%i", c->fd, event);[m
[31m-[m
[31m-    if (event == NGX_READ_EVENT) {[m
[31m-        FD_CLR(c->fd, &master_read_fd_set);[m
[31m-        max_read--;[m
[31m-[m
[31m-    } else if (event == NGX_WRITE_EVENT) {[m
[31m-        FD_CLR(c->fd, &master_write_fd_set);[m
[31m-        max_write--;[m
[31m-    }[m
[31m-[m
[31m-    if (ev->index < --nevents) {[m
[31m-        e = event_index[nevents];[m
[31m-        event_index[ev->index] = e;[m
[31m-        e->index = ev->index;[m
[31m-    }[m
[31m-[m
[31m-    ev->index = NGX_INVALID_INDEX;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-    ngx_uint_t flags)[m
[31m-{[m
[31m-    int                ready, nready;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_uint_t         i, found;[m
[31m-    ngx_event_t       *ev;[m
[31m-    ngx_queue_t       *queue;[m
[31m-    struct timeval     tv, *tp;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) {[m
[31m-        for (i = 0; i < nevents; i++) {[m
[31m-            ev = event_index[i];[m
[31m-            c = ev->data;[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "select event: fd:%d wr:%d", c->fd, ev->write);[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (timer == NGX_TIMER_INFINITE) {[m
[31m-        tp = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        tv.tv_sec = (long) (timer / 1000);[m
[31m-        tv.tv_usec = (long) ((timer % 1000) * 1000);[m
[31m-        tp = &tv;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "select timer: %M", timer);[m
[31m-[m
[31m-    work_read_fd_set = master_read_fd_set;[m
[31m-    work_write_fd_set = master_write_fd_set;[m
[31m-[m
[31m-    if (max_read || max_write) {[m
[31m-        ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /*[m
[31m-         * Winsock select() requires that at least one descriptor set must be[m
[31m-         * be non-null, and any non-null descriptor set must contain at least[m
[31m-         * one handle to a socket.  Otherwise select() returns WSAEINVAL.[m
[31m-         */[m
[31m-[m
[31m-        ngx_msleep(timer);[m
[31m-[m
[31m-        ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    err = (ready == -1) ? ngx_socket_errno : 0;[m
[31m-[m
[31m-    if (flags & NGX_UPDATE_TIME) {[m
[31m-        ngx_time_update();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "select ready %d", ready);[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed");[m
[31m-[m
[31m-        if (err == WSAENOTSOCK) {[m
[31m-            ngx_select_repair_fd_sets(cycle);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ready == 0) {[m
[31m-        if (timer != NGX_TIMER_INFINITE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "select() returned no events without timeout");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    nready = 0;[m
[31m-[m
[31m-    for (i = 0; i < nevents; i++) {[m
[31m-        ev = event_index[i];[m
[31m-        c = ev->data;[m
[31m-        found = 0;[m
[31m-[m
[31m-        if (ev->write) {[m
[31m-            if (FD_ISSET(c->fd, &work_write_fd_set)) {[m
[31m-                found = 1;[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "select write %d", c->fd);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (FD_ISSET(c->fd, &work_read_fd_set)) {[m
[31m-                found = 1;[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                               "select read %d", c->fd);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (found) {[m
[31m-            ev->ready = 1;[m
[31m-[m
[31m-            queue = ev->accept ? &ngx_posted_accept_events[m
[31m-                               : &ngx_posted_events;[m
[31m-[m
[31m-            ngx_post_event(ev, queue);[m
[31m-[m
[31m-            nready++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ready != nready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "select ready != events: %d:%d", ready, nready);[m
[31m-[m
[31m-        ngx_select_repair_fd_sets(cycle);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_select_repair_fd_sets(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    int           n;[m
[31m-    u_int         i;[m
[31m-    socklen_t     len;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_socket_t  s;[m
[31m-[m
[31m-    for (i = 0; i < master_read_fd_set.fd_count; i++) {[m
[31m-[m
[31m-        s = master_read_fd_set.fd_array[i];[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "invalid descriptor #%d in read fd_set", s);[m
[31m-[m
[31m-            FD_CLR(s, &master_read_fd_set);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < master_write_fd_set.fd_count; i++) {[m
[31m-[m
[31m-        s = master_write_fd_set.fd_array[i];[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "invalid descriptor #%d in write fd_set", s);[m
[31m-[m
[31m-            FD_CLR(s, &master_write_fd_set);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_select_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (ecf->use != ngx_select_module.ctx_index) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event.c[m
[1mdeleted file mode 100644[m
[1mindex c8ae5b2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event.c[m
[1m+++ /dev/null[m
[36m@@ -1,1268 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define DEFAULT_CONNECTIONS  512[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t ngx_kqueue_module;[m
[31m-extern ngx_module_t ngx_eventport_module;[m
[31m-extern ngx_module_t ngx_devpoll_module;[m
[31m-extern ngx_module_t ngx_epoll_module;[m
[31m-extern ngx_module_t ngx_select_module;[m
[31m-[m
[31m-[m
[31m-static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-static ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle);[m
[31m-static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-static char *ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static void *ngx_event_core_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t     ngx_timer_resolution;[m
[31m-sig_atomic_t          ngx_event_timer_alarm;[m
[31m-[m
[31m-static ngx_uint_t     ngx_event_max_module;[m
[31m-[m
[31m-ngx_uint_t            ngx_event_flags;[m
[31m-ngx_event_actions_t   ngx_event_actions;[m
[31m-[m
[31m-[m
[31m-static ngx_atomic_t   connection_counter = 1;[m
[31m-ngx_atomic_t         *ngx_connection_counter = &connection_counter;[m
[31m-[m
[31m-[m
[31m-ngx_atomic_t         *ngx_accept_mutex_ptr;[m
[31m-ngx_shmtx_t           ngx_accept_mutex;[m
[31m-ngx_uint_t            ngx_use_accept_mutex;[m
[31m-ngx_uint_t            ngx_accept_events;[m
[31m-ngx_uint_t            ngx_accept_mutex_held;[m
[31m-ngx_msec_t            ngx_accept_mutex_delay;[m
[31m-ngx_int_t             ngx_accept_disabled;[m
[31m-[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-ngx_atomic_t   ngx_stat_accepted0;[m
[31m-ngx_atomic_t  *ngx_stat_accepted = &ngx_stat_accepted0;[m
[31m-ngx_atomic_t   ngx_stat_handled0;[m
[31m-ngx_atomic_t  *ngx_stat_handled = &ngx_stat_handled0;[m
[31m-ngx_atomic_t   ngx_stat_requests0;[m
[31m-ngx_atomic_t  *ngx_stat_requests = &ngx_stat_requests0;[m
[31m-ngx_atomic_t   ngx_stat_active0;[m
[31m-ngx_atomic_t  *ngx_stat_active = &ngx_stat_active0;[m
[31m-ngx_atomic_t   ngx_stat_reading0;[m
[31m-ngx_atomic_t  *ngx_stat_reading = &ngx_stat_reading0;[m
[31m-ngx_atomic_t   ngx_stat_writing0;[m
[31m-ngx_atomic_t  *ngx_stat_writing = &ngx_stat_writing0;[m
[31m-ngx_atomic_t   ngx_stat_waiting0;[m
[31m-ngx_atomic_t  *ngx_stat_waiting = &ngx_stat_waiting0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_events_commands[] = {[m
[31m-[m
[31m-    { ngx_string("events"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_events_block,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_events_module_ctx = {[m
[31m-    ngx_string("events"),[m
[31m-    NULL,[m
[31m-    ngx_event_init_conf[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_events_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_events_module_ctx,                /* module context */[m
[31m-    ngx_events_commands,                   /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  event_core_name = ngx_string("event_core");[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_event_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("worker_connections"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_event_connections,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("use"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_event_use,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("multi_accept"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_event_conf_t, multi_accept),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("accept_mutex"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_event_conf_t, accept_mutex),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("accept_mutex_delay"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_event_conf_t, accept_mutex_delay),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("debug_connection"),[m
[31m-      NGX_EVENT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_event_debug_connection,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_event_module_t  ngx_event_core_module_ctx = {[m
[31m-    &event_core_name,[m
[31m-    ngx_event_core_create_conf,            /* create configuration */[m
[31m-    ngx_event_core_init_conf,              /* init configuration */[m
[31m-[m
[31m-    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_event_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_event_core_module_ctx,            /* module context */[m
[31m-    ngx_event_core_commands,               /* module directives */[m
[31m-    NGX_EVENT_MODULE,                      /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    ngx_event_module_init,                 /* init module */[m
[31m-    ngx_event_process_init,                /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_process_events_and_timers(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  flags;[m
[31m-    ngx_msec_t  timer, delta;[m
[31m-[m
[31m-    if (ngx_timer_resolution) {[m
[31m-        timer = NGX_TIMER_INFINITE;[m
[31m-        flags = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        timer = ngx_event_find_timer();[m
[31m-        flags = NGX_UPDATE_TIME;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-        /* handle signals from master in case of network inactivity */[m
[31m-[m
[31m-        if (timer == NGX_TIMER_INFINITE || timer > 500) {[m
[31m-            timer = 500;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_use_accept_mutex) {[m
[31m-        if (ngx_accept_disabled > 0) {[m
[31m-            ngx_accept_disabled--;[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_accept_mutex_held) {[m
[31m-                flags |= NGX_POST_EVENTS;[m
[31m-[m
[31m-            } else {[m
[31m-                if (timer == NGX_TIMER_INFINITE[m
[31m-                    || timer > ngx_accept_mutex_delay)[m
[31m-                {[m
[31m-                    timer = ngx_accept_mutex_delay;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    delta = ngx_current_msec;[m
[31m-[m
[31m-    (void) ngx_process_events(cycle, timer, flags);[m
[31m-[m
[31m-    delta = ngx_current_msec - delta;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "timer delta: %M", delta);[m
[31m-[m
[31m-    ngx_event_process_posted(cycle, &ngx_posted_accept_events);[m
[31m-[m
[31m-    if (ngx_accept_mutex_held) {[m
[31m-        ngx_shmtx_unlock(&ngx_accept_mutex);[m
[31m-    }[m
[31m-[m
[31m-    if (delta) {[m
[31m-        ngx_event_expire_timers();[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_process_posted(cycle, &ngx_posted_events);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)[m
[31m-{[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue, epoll */[m
[31m-[m
[31m-        if (!rev->active && !rev->ready) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_LEVEL_EVENT) {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        if (!rev->active && !rev->ready) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rev->active && (rev->ready || (flags & NGX_CLOSE_EVENT))) {[m
[31m-            if (ngx_del_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT | flags)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {[m
[31m-[m
[31m-        /* event ports */[m
[31m-[m
[31m-        if (!rev->active && !rev->ready) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rev->oneshot && !rev->ready) {[m
[31m-            if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* iocp */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_handle_write_event(ngx_event_t *wev, size_t lowat)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (lowat) {[m
[31m-        c = wev->data;[m
[31m-[m
[31m-        if (ngx_send_lowat(c, lowat) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue, epoll */[m
[31m-[m
[31m-        if (!wev->active && !wev->ready) {[m
[31m-            if (ngx_add_event(wev, NGX_WRITE_EVENT,[m
[31m-                              NGX_CLEAR_EVENT | (lowat ? NGX_LOWAT_EVENT : 0))[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_LEVEL_EVENT) {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        if (!wev->active && !wev->ready) {[m
[31m-            if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (wev->active && wev->ready) {[m
[31m-            if (ngx_del_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {[m
[31m-[m
[31m-        /* event ports */[m
[31m-[m
[31m-        if (!wev->active && !wev->ready) {[m
[31m-            if (ngx_add_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (wev->oneshot && wev->ready) {[m
[31m-            if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* iocp */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    if (ngx_get_conf(cycle->conf_ctx, ngx_events_module) == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,[m
[31m-                      "no \"events\" section in configuration");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_module_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    void              ***cf;[m
[31m-    u_char              *shared;[m
[31m-    size_t               size, cl;[m
[31m-    ngx_shm_t            shm;[m
[31m-    ngx_time_t          *tp;[m
[31m-    ngx_core_conf_t     *ccf;[m
[31m-    ngx_event_conf_t    *ecf;[m
[31m-[m
[31m-    cf = ngx_get_conf(cycle->conf_ctx, ngx_events_module);[m
[31m-    ecf = (*cf)[ngx_event_core_module.ctx_index];[m
[31m-[m
[31m-    if (!ngx_test_config && ngx_process <= NGX_PROCESS_MASTER) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                      "using the \"%s\" event method", ecf->name);[m
[31m-    }[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    ngx_timer_resolution = ccf->timer_resolution;[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-    {[m
[31m-    ngx_int_t      limit;[m
[31m-    struct rlimit  rlmt;[m
[31m-[m
[31m-    if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "getrlimit(RLIMIT_NOFILE) failed, ignored");[m
[31m-[m
[31m-    } else {[m
[31m-        if (ecf->connections > (ngx_uint_t) rlmt.rlim_cur[m
[31m-            && (ccf->rlimit_nofile == NGX_CONF_UNSET[m
[31m-                || ecf->connections > (ngx_uint_t) ccf->rlimit_nofile))[m
[31m-        {[m
[31m-            limit = (ccf->rlimit_nofile == NGX_CONF_UNSET) ?[m
[31m-                         (ngx_int_t) rlmt.rlim_cur : ccf->rlimit_nofile;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_WARN, cycle->log, 0,[m
[31m-                          "%ui worker_connections exceed "[m
[31m-                          "open file resource limit: %i",[m
[31m-                          ecf->connections, limit);[m
[31m-        }[m
[31m-    }[m
[31m-    }[m
[31m-#endif /* !(NGX_WIN32) */[m
[31m-[m
[31m-[m
[31m-    if (ccf->master == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_accept_mutex_ptr) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* cl should be equal to or greater than cache line size */[m
[31m-[m
[31m-    cl = 128;[m
[31m-[m
[31m-    size = cl            /* ngx_accept_mutex */[m
[31m-           + cl          /* ngx_connection_counter */[m
[31m-           + cl;         /* ngx_temp_number */[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-    size += cl           /* ngx_stat_accepted */[m
[31m-           + cl          /* ngx_stat_handled */[m
[31m-           + cl          /* ngx_stat_requests */[m
[31m-           + cl          /* ngx_stat_active */[m
[31m-           + cl          /* ngx_stat_reading */[m
[31m-           + cl          /* ngx_stat_writing */[m
[31m-           + cl;         /* ngx_stat_waiting */[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    shm.size = size;[m
[31m-    shm.name.len = sizeof("nginx_shared_zone") - 1;[m
[31m-    shm.name.data = (u_char *) "nginx_shared_zone";[m
[31m-    shm.log = cycle->log;[m
[31m-[m
[31m-    if (ngx_shm_alloc(&shm) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shared = shm.addr;[m
[31m-[m
[31m-    ngx_accept_mutex_ptr = (ngx_atomic_t *) shared;[m
[31m-    ngx_accept_mutex.spin = (ngx_uint_t) -1;[m
[31m-[m
[31m-    if (ngx_shmtx_create(&ngx_accept_mutex, (ngx_shmtx_sh_t *) shared,[m
[31m-                         cycle->lock_file.data)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_connection_counter = (ngx_atomic_t *) (shared + 1 * cl);[m
[31m-[m
[31m-    (void) ngx_atomic_cmp_set(ngx_connection_counter, 0, 1);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "counter: %p, %uA",[m
[31m-                   ngx_connection_counter, *ngx_connection_counter);[m
[31m-[m
[31m-    ngx_temp_number = (ngx_atomic_t *) (shared + 2 * cl);[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ngx_random_number = (tp->msec << 16) + ngx_pid;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-    ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * cl);[m
[31m-    ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * cl);[m
[31m-    ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * cl);[m
[31m-    ngx_stat_active = (ngx_atomic_t *) (shared + 6 * cl);[m
[31m-    ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * cl);[m
[31m-    ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * cl);[m
[31m-    ngx_stat_waiting = (ngx_atomic_t *) (shared + 9 * cl);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-static void[m
[31m-ngx_timer_signal_handler(int signo)[m
[31m-{[m
[31m-    ngx_event_timer_alarm = 1;[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer signal");[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_process_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t           m, i;[m
[31m-    ngx_event_t         *rev, *wev;[m
[31m-    ngx_listening_t     *ls;[m
[31m-    ngx_connection_t    *c, *next, *old;[m
[31m-    ngx_core_conf_t     *ccf;[m
[31m-    ngx_event_conf_t    *ecf;[m
[31m-    ngx_event_module_t  *module;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (ccf->master && ccf->worker_processes > 1 && ecf->accept_mutex) {[m
[31m-        ngx_use_accept_mutex = 1;[m
[31m-        ngx_accept_mutex_held = 0;[m
[31m-        ngx_accept_mutex_delay = ecf->accept_mutex_delay;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_use_accept_mutex = 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-    /*[m
[31m-     * disable accept mutex on win32 as it may cause deadlock if[m
[31m-     * grabbed by a process which can't accept connections[m
[31m-     */[m
[31m-[m
[31m-    ngx_use_accept_mutex = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_queue_init(&ngx_posted_accept_events);[m
[31m-    ngx_queue_init(&ngx_posted_events);[m
[31m-[m
[31m-    if (ngx_event_timer_init(cycle->log) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cycle->modules[m]; m++) {[m
[31m-        if (cycle->modules[m]->type != NGX_EVENT_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (cycle->modules[m]->ctx_index != ecf->use) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->actions.init(cycle, ngx_timer_resolution) != NGX_OK) {[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-    if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) {[m
[31m-        struct sigaction  sa;[m
[31m-        struct itimerval  itv;[m
[31m-[m
[31m-        ngx_memzero(&sa, sizeof(struct sigaction));[m
[31m-        sa.sa_handler = ngx_timer_signal_handler;[m
[31m-        sigemptyset(&sa.sa_mask);[m
[31m-[m
[31m-        if (sigaction(SIGALRM, &sa, NULL) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "sigaction(SIGALRM) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        itv.it_interval.tv_sec = ngx_timer_resolution / 1000;[m
[31m-        itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000;[m
[31m-        itv.it_value.tv_sec = ngx_timer_resolution / 1000;[m
[31m-        itv.it_value.tv_usec = (ngx_timer_resolution % 1000 ) * 1000;[m
[31m-[m
[31m-        if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setitimer() failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_FD_EVENT) {[m
[31m-        struct rlimit  rlmt;[m
[31m-[m
[31m-        if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "getrlimit(RLIMIT_NOFILE) failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cycle->files_n = (ngx_uint_t) rlmt.rlim_cur;[m
[31m-[m
[31m-        cycle->files = ngx_calloc(sizeof(ngx_connection_t *) * cycle->files_n,[m
[31m-                                  cycle->log);[m
[31m-        if (cycle->files == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cycle->log, 0,[m
[31m-                      "the \"timer_resolution\" directive is not supported "[m
[31m-                      "with the configured event method, ignored");[m
[31m-        ngx_timer_resolution = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    cycle->connections =[m
[31m-        ngx_alloc(sizeof(ngx_connection_t) * cycle->connection_n, cycle->log);[m
[31m-    if (cycle->connections == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = cycle->connections;[m
[31m-[m
[31m-    cycle->read_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n,[m
[31m-                                   cycle->log);[m
[31m-    if (cycle->read_events == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rev = cycle->read_events;[m
[31m-    for (i = 0; i < cycle->connection_n; i++) {[m
[31m-        rev[i].closed = 1;[m
[31m-        rev[i].instance = 1;[m
[31m-    }[m
[31m-[m
[31m-    cycle->write_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n,[m
[31m-                                    cycle->log);[m
[31m-    if (cycle->write_events == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    wev = cycle->write_events;[m
[31m-    for (i = 0; i < cycle->connection_n; i++) {[m
[31m-        wev[i].closed = 1;[m
[31m-    }[m
[31m-[m
[31m-    i = cycle->connection_n;[m
[31m-    next = NULL;[m
[31m-[m
[31m-    do {[m
[31m-        i--;[m
[31m-[m
[31m-        c[i].data = next;[m
[31m-        c[i].read = &cycle->read_events[i];[m
[31m-        c[i].write = &cycle->write_events[i];[m
[31m-        c[i].fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-        next = &c[i];[m
[31m-    } while (i);[m
[31m-[m
[31m-    cycle->free_connections = next;[m
[31m-    cycle->free_connection_n = cycle->connection_n;[m
[31m-[m
[31m-    /* for each listening socket */[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-        if (ls[i].reuseport && ls[i].worker != ngx_worker) {[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c = ngx_get_connection(ls[i].fd, cycle->log);[m
[31m-[m
[31m-        if (c == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->type = ls[i].type;[m
[31m-        c->log = &ls[i].log;[m
[31m-[m
[31m-        c->listening = &ls[i];[m
[31m-        ls[i].connection = c;[m
[31m-[m
[31m-        rev = c->read;[m
[31m-[m
[31m-        rev->log = c->log;[m
[31m-        rev->accept = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT)[m
[31m-        rev->deferred_accept = ls[i].deferred_accept;[m
[31m-#endif[m
[31m-[m
[31m-        if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {[m
[31m-            if (ls[i].previous) {[m
[31m-[m
[31m-                /*[m
[31m-                 * delete the old accept events that were bound to[m
[31m-                 * the old cycle read events array[m
[31m-                 */[m
[31m-[m
[31m-                old = ls[i].previous->connection;[m
[31m-[m
[31m-                if (ngx_del_event(old->read, NGX_READ_EVENT, NGX_CLOSE_EVENT)[m
[31m-                    == NGX_ERROR)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                old->fd = (ngx_socket_t) -1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            ngx_iocp_conf_t  *iocpcf;[m
[31m-[m
[31m-            rev->handler = ngx_event_acceptex;[m
[31m-[m
[31m-            if (ngx_use_accept_mutex) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls[i].log.handler = ngx_acceptex_log_error;[m
[31m-[m
[31m-            iocpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);[m
[31m-            if (ngx_event_post_acceptex(&ls[i], iocpcf->post_acceptex)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            rev->handler = ngx_event_accept;[m
[31m-[m
[31m-            if (ngx_use_accept_mutex) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        rev->handler = (c->type == SOCK_STREAM) ? ngx_event_accept[m
[31m-                                                : ngx_event_recvmsg;[m
[31m-[m
[31m-        if (ngx_use_accept_mutex[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            && !ls[i].reuseport[m
[31m-#endif[m
[31m-           )[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_send_lowat(ngx_connection_t *c, size_t lowat)[m
[31m-{[m
[31m-    int  sndlowat;[m
[31m-[m
[31m-#if (NGX_HAVE_LOWAT_EVENT)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        c->write->available = lowat;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (lowat == 0 || c->sndlowat) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sndlowat = (int) lowat;[m
[31m-[m
[31m-    if (setsockopt(c->fd, SOL_SOCKET, SO_SNDLOWAT,[m
[31m-                   (const void *) &sndlowat, sizeof(int))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_connection_error(c, ngx_socket_errno,[m
[31m-                             "setsockopt(SO_SNDLOWAT) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->sndlowat = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                 *rv;[m
[31m-    void               ***ctx;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_conf_t            pcf;[m
[31m-    ngx_event_module_t   *m;[m
[31m-[m
[31m-    if (*(void **) conf) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* count the number of the event modules and set up their indices */[m
[31m-[m
[31m-    ngx_event_max_module = ngx_count_modules(cf->cycle, NGX_EVENT_MODULE);[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(void *));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));[m
[31m-    if (*ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(void **) conf = ctx;[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        m = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (m->create_conf) {[m
[31m-            (*ctx)[cf->cycle->modules[i]->ctx_index] =[m
[31m-                                                     m->create_conf(cf->cycle);[m
[31m-            if ((*ctx)[cf->cycle->modules[i]->ctx_index] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->module_type = NGX_EVENT_MODULE;[m
[31m-    cf->cmd_type = NGX_EVENT_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        m = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (m->init_conf) {[m
[31m-            rv = m->init_conf(cf->cycle,[m
[31m-                              (*ctx)[cf->cycle->modules[i]->ctx_index]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                return rv;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (ecf->connections != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    ecf->connections = ngx_atoi(value[1].data, value[1].len);[m
[31m-    if (ecf->connections == (ngx_uint_t) NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number \"%V\"", &value[1]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cf->cycle->connection_n = ecf->connections;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf = conf;[m
[31m-[m
[31m-    ngx_int_t             m;[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_event_conf_t     *old_ecf;[m
[31m-    ngx_event_module_t   *module;[m
[31m-[m
[31m-    if (ecf->use != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->cycle->old_cycle->conf_ctx) {[m
[31m-        old_ecf = ngx_event_get_conf(cf->cycle->old_cycle->conf_ctx,[m
[31m-                                     ngx_event_core_module);[m
[31m-    } else {[m
[31m-        old_ecf = NULL;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_EVENT_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        if (module->name->len == value[1].len) {[m
[31m-            if (ngx_strcmp(module->name->data, value[1].data) == 0) {[m
[31m-                ecf->use = cf->cycle->modules[m]->ctx_index;[m
[31m-                ecf->name = module->name->data;[m
[31m-[m
[31m-                if (ngx_process == NGX_PROCESS_SINGLE[m
[31m-                    && old_ecf[m
[31m-                    && old_ecf->use != ecf->use)[m
[31m-                {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "when the server runs without a master process "[m
[31m-                               "the \"%V\" event type must be the same as "[m
[31m-                               "in previous configuration - \"%s\" "[m
[31m-                               "and it cannot be changed on the fly, "[m
[31m-                               "to change it you need to stop server "[m
[31m-                               "and start it again",[m
[31m-                               &value[1], old_ecf->name);[m
[31m-[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid event type \"%V\"", &value[1]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_event_conf_t  *ecf = conf;[m
[31m-[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_url_t             u;[m
[31m-    ngx_cidr_t            c, *cidr;[m
[31m-    ngx_uint_t            i;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "unix:") == 0) {[m
[31m-        cidr = ngx_array_push(&ecf->debug_connection);[m
[31m-        if (cidr == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cidr->family = AF_UNIX;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_ptocidr(&value[1], &c);[m
[31m-[m
[31m-    if (rc != NGX_ERROR) {[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "low address bits of %V are meaningless",[m
[31m-                               &value[1]);[m
[31m-        }[m
[31m-[m
[31m-        cidr = ngx_array_push(&ecf->debug_connection);[m
[31m-        if (cidr == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *cidr = c;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-    u.host = value[1];[m
[31m-[m
[31m-    if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in debug_connection \"%V\"",[m
[31m-                               u.err, &u.host);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cidr = ngx_array_push_n(&ecf->debug_connection, u.naddrs);[m
[31m-    if (cidr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(cidr, u.naddrs * sizeof(ngx_cidr_t));[m
[31m-[m
[31m-    for (i = 0; i < u.naddrs; i++) {[m
[31m-        cidr[i].family = u.addrs[i].sockaddr->sa_family;[m
[31m-[m
[31m-        switch (cidr[i].family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) u.addrs[i].sockaddr;[m
[31m-            cidr[i].u.in6.addr = sin6->sin6_addr;[m
[31m-            ngx_memset(cidr[i].u.in6.mask.s6_addr, 0xff, 16);[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) u.addrs[i].sockaddr;[m
[31m-            cidr[i].u.in.addr = sin->sin_addr.s_addr;[m
[31m-            cidr[i].u.in.mask = 0xffffffff;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"debug_connection\" is ignored, you need to rebuild "[m
[31m-                       "nginx using --with-debug option to enable it");[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_event_core_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-[m
[31m-    ecf = ngx_palloc(cycle->pool, sizeof(ngx_event_conf_t));[m
[31m-    if (ecf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ecf->connections = NGX_CONF_UNSET_UINT;[m
[31m-    ecf->use = NGX_CONF_UNSET_UINT;[m
[31m-    ecf->multi_accept = NGX_CONF_UNSET;[m
[31m-    ecf->accept_mutex = NGX_CONF_UNSET;[m
[31m-    ecf->accept_mutex_delay = NGX_CONF_UNSET_MSEC;[m
[31m-    ecf->name = (void *) NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    if (ngx_array_init(&ecf->debug_connection, cycle->pool, 4,[m
[31m-                       sizeof(ngx_cidr_t)) == NGX_ERROR)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return ecf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf)[m
[31m-{[m
[31m-    ngx_event_conf_t  *ecf = conf;[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)[m
[31m-    int                  fd;[m
[31m-#endif[m
[31m-    ngx_int_t            i;[m
[31m-    ngx_module_t        *module;[m
[31m-    ngx_event_module_t  *event_module;[m
[31m-[m
[31m-    module = NULL;[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)[m
[31m-[m
[31m-    fd = epoll_create(100);[m
[31m-[m
[31m-    if (fd != -1) {[m
[31m-        (void) close(fd);[m
[31m-        module = &ngx_epoll_module;[m
[31m-[m
[31m-    } else if (ngx_errno != NGX_ENOSYS) {[m
[31m-        module = &ngx_epoll_module;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEVPOLL) && !(NGX_TEST_BUILD_DEVPOLL)[m
[31m-[m
[31m-    module = &ngx_devpoll_module;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    module = &ngx_kqueue_module;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SELECT)[m
[31m-[m
[31m-    if (module == NULL) {[m
[31m-        module = &ngx_select_module;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (module == NULL) {[m
[31m-        for (i = 0; cycle->modules[i]; i++) {[m
[31m-[m
[31m-            if (cycle->modules[i]->type != NGX_EVENT_MODULE) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            event_module = cycle->modules[i]->ctx;[m
[31m-[m
[31m-            if (ngx_strcmp(event_module->name->data, event_core_name.data) == 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            module = cycle->modules[i];[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (module == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no events module found");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_init_uint_value(ecf->connections, DEFAULT_CONNECTIONS);[m
[31m-    cycle->connection_n = ecf->connections;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(ecf->use, module->ctx_index);[m
[31m-[m
[31m-    event_module = module->ctx;[m
[31m-    ngx_conf_init_ptr_value(ecf->name, event_module->name->data);[m
[31m-[m
[31m-    ngx_conf_init_value(ecf->multi_accept, 0);[m
[31m-    ngx_conf_init_value(ecf->accept_mutex, 1);[m
[31m-    ngx_conf_init_msec_value(ecf->accept_mutex_delay, 500);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event.h[m
[1mdeleted file mode 100644[m
[1mindex ed0682c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event.h[m
[1m+++ /dev/null[m
[36m@@ -1,530 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_H_INCLUDED_[m
[31m-#define _NGX_EVENT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_INVALID_INDEX  0xd0d0d0d0[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-[m
[31m-typedef struct {[m
[31m-    WSAOVERLAPPED    ovlp;[m
[31m-    ngx_event_t     *event;[m
[31m-    int              error;[m
[31m-} ngx_event_ovlp_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-struct ngx_event_s {[m
[31m-    void            *data;[m
[31m-[m
[31m-    unsigned         write:1;[m
[31m-[m
[31m-    unsigned         accept:1;[m
[31m-[m
[31m-    /* used to detect the stale events in kqueue and epoll */[m
[31m-    unsigned         instance:1;[m
[31m-[m
[31m-    /*[m
[31m-     * the event was passed or would be passed to a kernel;[m
[31m-     * in aio mode - operation was posted.[m
[31m-     */[m
[31m-    unsigned         active:1;[m
[31m-[m
[31m-    unsigned         disabled:1;[m
[31m-[m
[31m-    /* the ready event; in aio mode 0 means that no operation can be posted */[m
[31m-    unsigned         ready:1;[m
[31m-[m
[31m-    unsigned         oneshot:1;[m
[31m-[m
[31m-    /* aio operation is complete */[m
[31m-    unsigned         complete:1;[m
[31m-[m
[31m-    unsigned         eof:1;[m
[31m-    unsigned         error:1;[m
[31m-[m
[31m-    unsigned         timedout:1;[m
[31m-    unsigned         timer_set:1;[m
[31m-[m
[31m-    unsigned         delayed:1;[m
[31m-[m
[31m-    unsigned         deferred_accept:1;[m
[31m-[m
[31m-    /* the pending eof reported by kqueue, epoll or in aio chain operation */[m
[31m-    unsigned         pending_eof:1;[m
[31m-[m
[31m-    unsigned         posted:1;[m
[31m-[m
[31m-    unsigned         closed:1;[m
[31m-[m
[31m-    /* to test on worker exit */[m
[31m-    unsigned         channel:1;[m
[31m-    unsigned         resolver:1;[m
[31m-[m
[31m-    unsigned         cancelable:1;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    /* setsockopt(SO_UPDATE_ACCEPT_CONTEXT) was successful */[m
[31m-    unsigned         accept_context_updated:1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-    unsigned         kq_vnode:1;[m
[31m-[m
[31m-    /* the pending errno reported by kqueue */[m
[31m-    int              kq_errno;[m
[31m-#endif[m
[31m-[m
[31m-    /*[m
[31m-     * kqueue only:[m
[31m-     *   accept:     number of sockets that wait to be accepted[m
[31m-     *   read:       bytes to read when event is ready[m
[31m-     *               or lowat when event is set with NGX_LOWAT_EVENT flag[m
[31m-     *   write:      available space in buffer when event is ready[m
[31m-     *               or lowat when event is set with NGX_LOWAT_EVENT flag[m
[31m-     *[m
[31m-     * iocp: TODO[m
[31m-     *[m
[31m-     * otherwise:[m
[31m-     *   accept:     1 if accept many, 0 otherwise[m
[31m-     */[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE) || (NGX_HAVE_IOCP)[m
[31m-    int              available;[m
[31m-#else[m
[31m-    unsigned         available:1;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_event_handler_pt  handler;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-    ngx_event_ovlp_t ovlp;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t       index;[m
[31m-[m
[31m-    ngx_log_t       *log;[m
[31m-[m
[31m-    ngx_rbtree_node_t   timer;[m
[31m-[m
[31m-    /* the posted queue */[m
[31m-    ngx_queue_t      queue;[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-    /* the threads support */[m
[31m-[m
[31m-    /*[m
[31m-     * the event thread context, we store it here[m
[31m-     * if $(CC) does not understand __thread declaration[m
[31m-     * and pthread_getspecific() is too costly[m
[31m-     */[m
[31m-[m
[31m-    void            *thr_ctx;[m
[31m-[m
[31m-#if (NGX_EVENT_T_PADDING)[m
[31m-[m
[31m-    /* event should not cross cache line in SMP */[m
[31m-[m
[31m-    uint32_t         padding[NGX_EVENT_T_PADDING];[m
[31m-#endif[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-struct ngx_event_aio_s {[m
[31m-    void                      *data;[m
[31m-    ngx_event_handler_pt       handler;[m
[31m-    ngx_file_t                *file;[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    ssize_t                  (*preload_handler)(ngx_buf_t *file);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_fd_t                   fd;[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTFD)[m
[31m-    int64_t                    res;[m
[31m-#endif[m
[31m-[m
[31m-#if !(NGX_HAVE_EVENTFD) || (NGX_TEST_BUILD_EPOLL)[m
[31m-    ngx_err_t                  err;[m
[31m-    size_t                     nbytes;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_aiocb_t                aiocb;[m
[31m-    ngx_event_t                event;[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);[m
[31m-    ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);[m
[31m-[m
[31m-    ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);[m
[31m-    ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);[m
[31m-[m
[31m-    ngx_int_t  (*add_conn)(ngx_connection_t *c);[m
[31m-    ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);[m
[31m-[m
[31m-    ngx_int_t  (*notify)(ngx_event_handler_pt handler);[m
[31m-[m
[31m-    ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,[m
[31m-                                 ngx_uint_t flags);[m
[31m-[m
[31m-    ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);[m
[31m-    void       (*done)(ngx_cycle_t *cycle);[m
[31m-} ngx_event_actions_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_event_actions_t   ngx_event_actions;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The event filter requires to read/write the whole data:[m
[31m- * select, poll, /dev/poll, kqueue, epoll.[m
[31m- */[m
[31m-#define NGX_USE_LEVEL_EVENT      0x00000001[m
[31m-[m
[31m-/*[m
[31m- * The event filter is deleted after a notification without an additional[m
[31m- * syscall: kqueue, epoll.[m
[31m- */[m
[31m-#define NGX_USE_ONESHOT_EVENT    0x00000002[m
[31m-[m
[31m-/*[m
[31m- * The event filter notifies only the changes and an initial level:[m
[31m- * kqueue, epoll.[m
[31m- */[m
[31m-#define NGX_USE_CLEAR_EVENT      0x00000004[m
[31m-[m
[31m-/*[m
[31m- * The event filter has kqueue features: the eof flag, errno,[m
[31m- * available data, etc.[m
[31m- */[m
[31m-#define NGX_USE_KQUEUE_EVENT     0x00000008[m
[31m-[m
[31m-/*[m
[31m- * The event filter supports low water mark: kqueue's NOTE_LOWAT.[m
[31m- * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag.[m
[31m- */[m
[31m-#define NGX_USE_LOWAT_EVENT      0x00000010[m
[31m-[m
[31m-/*[m
[31m- * The event filter requires to do i/o operation until EAGAIN: epoll.[m
[31m- */[m
[31m-#define NGX_USE_GREEDY_EVENT     0x00000020[m
[31m-[m
[31m-/*[m
[31m- * The event filter is epoll.[m
[31m- */[m
[31m-#define NGX_USE_EPOLL_EVENT      0x00000040[m
[31m-[m
[31m-/*[m
[31m- * Obsolete.[m
[31m- */[m
[31m-#define NGX_USE_RTSIG_EVENT      0x00000080[m
[31m-[m
[31m-/*[m
[31m- * Obsolete.[m
[31m- */[m
[31m-#define NGX_USE_AIO_EVENT        0x00000100[m
[31m-[m
[31m-/*[m
[31m- * Need to add socket or handle only once: i/o completion port.[m
[31m- */[m
[31m-#define NGX_USE_IOCP_EVENT       0x00000200[m
[31m-[m
[31m-/*[m
[31m- * The event filter has no opaque data and requires file descriptors table:[m
[31m- * poll, /dev/poll.[m
[31m- */[m
[31m-#define NGX_USE_FD_EVENT         0x00000400[m
[31m-[m
[31m-/*[m
[31m- * The event module handles periodic or absolute timer event by itself:[m
[31m- * kqueue in FreeBSD 4.4, NetBSD 2.0, and MacOSX 10.4, Solaris 10's event ports.[m
[31m- */[m
[31m-#define NGX_USE_TIMER_EVENT      0x00000800[m
[31m-[m
[31m-/*[m
[31m- * All event filters on file descriptor are deleted after a notification:[m
[31m- * Solaris 10's event ports.[m
[31m- */[m
[31m-#define NGX_USE_EVENTPORT_EVENT  0x00001000[m
[31m-[m
[31m-/*[m
[31m- * The event filter support vnode notifications: kqueue.[m
[31m- */[m
[31m-#define NGX_USE_VNODE_EVENT      0x00002000[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The event filter is deleted just before the closing file.[m
[31m- * Has no meaning for select and poll.[m
[31m- * kqueue, epoll, eventport:         allows to avoid explicit delete,[m
[31m- *                                   because filter automatically is deleted[m
[31m- *                                   on file close,[m
[31m- *[m
[31m- * /dev/poll:                        we need to flush POLLREMOVE event[m
[31m- *                                   before closing file.[m
[31m- */[m
[31m-#define NGX_CLOSE_EVENT    1[m
[31m-[m
[31m-/*[m
[31m- * disable temporarily event filter, this may avoid locks[m
[31m- * in kernel malloc()/free(): kqueue.[m
[31m- */[m
[31m-#define NGX_DISABLE_EVENT  2[m
[31m-[m
[31m-/*[m
[31m- * event must be passed to kernel right now, do not wait until batch processing.[m
[31m- */[m
[31m-#define NGX_FLUSH_EVENT    4[m
[31m-[m
[31m-[m
[31m-/* these flags have a meaning only for kqueue */[m
[31m-#define NGX_LOWAT_EVENT    0[m
[31m-#define NGX_VNODE_EVENT    0[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL) && !(NGX_HAVE_EPOLLRDHUP)[m
[31m-#define EPOLLRDHUP         0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-#define NGX_READ_EVENT     EVFILT_READ[m
[31m-#define NGX_WRITE_EVENT    EVFILT_WRITE[m
[31m-[m
[31m-#undef  NGX_VNODE_EVENT[m
[31m-#define NGX_VNODE_EVENT    EVFILT_VNODE[m
[31m-[m
[31m-/*[m
[31m- * NGX_CLOSE_EVENT, NGX_LOWAT_EVENT, and NGX_FLUSH_EVENT are the module flags[m
[31m- * and they must not go into a kernel so we need to choose the value[m
[31m- * that must not interfere with any existent and future kqueue flags.[m
[31m- * kqueue has such values - EV_FLAG1, EV_EOF, and EV_ERROR:[m
[31m- * they are reserved and cleared on a kernel entrance.[m
[31m- */[m
[31m-#undef  NGX_CLOSE_EVENT[m
[31m-#define NGX_CLOSE_EVENT    EV_EOF[m
[31m-[m
[31m-#undef  NGX_LOWAT_EVENT[m
[31m-#define NGX_LOWAT_EVENT    EV_FLAG1[m
[31m-[m
[31m-#undef  NGX_FLUSH_EVENT[m
[31m-#define NGX_FLUSH_EVENT    EV_ERROR[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_ONESHOT_EVENT  EV_ONESHOT[m
[31m-#define NGX_CLEAR_EVENT    EV_CLEAR[m
[31m-[m
[31m-#undef  NGX_DISABLE_EVENT[m
[31m-#define NGX_DISABLE_EVENT  EV_DISABLE[m
[31m-[m
[31m-[m
[31m-#elif (NGX_HAVE_DEVPOLL && !(NGX_TEST_BUILD_DEVPOLL)) \[m
[31m-      || (NGX_HAVE_EVENTPORT && !(NGX_TEST_BUILD_EVENTPORT))[m
[31m-[m
[31m-#define NGX_READ_EVENT     POLLIN[m
[31m-#define NGX_WRITE_EVENT    POLLOUT[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_ONESHOT_EVENT  1[m
[31m-[m
[31m-[m
[31m-#elif (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)[m
[31m-[m
[31m-#define NGX_READ_EVENT     (EPOLLIN|EPOLLRDHUP)[m
[31m-#define NGX_WRITE_EVENT    EPOLLOUT[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_CLEAR_EVENT    EPOLLET[m
[31m-#define NGX_ONESHOT_EVENT  0x70000000[m
[31m-#if 0[m
[31m-#define NGX_ONESHOT_EVENT  EPOLLONESHOT[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif (NGX_HAVE_POLL)[m
[31m-[m
[31m-#define NGX_READ_EVENT     POLLIN[m
[31m-#define NGX_WRITE_EVENT    POLLOUT[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_ONESHOT_EVENT  1[m
[31m-[m
[31m-[m
[31m-#else /* select */[m
[31m-[m
[31m-#define NGX_READ_EVENT     0[m
[31m-#define NGX_WRITE_EVENT    1[m
[31m-[m
[31m-#define NGX_LEVEL_EVENT    0[m
[31m-#define NGX_ONESHOT_EVENT  1[m
[31m-[m
[31m-#endif /* NGX_HAVE_KQUEUE */[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_IOCP)[m
[31m-#define NGX_IOCP_ACCEPT      0[m
[31m-#define NGX_IOCP_IO          1[m
[31m-#define NGX_IOCP_CONNECT     2[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_CLEAR_EVENT[m
[31m-#define NGX_CLEAR_EVENT    0    /* dummy declaration */[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_process_events   ngx_event_actions.process_events[m
[31m-#define ngx_done_events      ngx_event_actions.done[m
[31m-[m
[31m-#define ngx_add_event        ngx_event_actions.add[m
[31m-#define ngx_del_event        ngx_event_actions.del[m
[31m-#define ngx_add_conn         ngx_event_actions.add_conn[m
[31m-#define ngx_del_conn         ngx_event_actions.del_conn[m
[31m-[m
[31m-#define ngx_notify           ngx_event_actions.notify[m
[31m-[m
[31m-#define ngx_add_timer        ngx_event_add_timer[m
[31m-#define ngx_del_timer        ngx_event_del_timer[m
[31m-[m
[31m-[m
[31m-extern ngx_os_io_t  ngx_io;[m
[31m-[m
[31m-#define ngx_recv             ngx_io.recv[m
[31m-#define ngx_recv_chain       ngx_io.recv_chain[m
[31m-#define ngx_udp_recv         ngx_io.udp_recv[m
[31m-#define ngx_send             ngx_io.send[m
[31m-#define ngx_send_chain       ngx_io.send_chain[m
[31m-#define ngx_udp_send         ngx_io.udp_send[m
[31m-[m
[31m-[m
[31m-#define NGX_EVENT_MODULE      0x544E5645  /* "EVNT" */[m
[31m-#define NGX_EVENT_CONF        0x02000000[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t    connections;[m
[31m-    ngx_uint_t    use;[m
[31m-[m
[31m-    ngx_flag_t    multi_accept;[m
[31m-    ngx_flag_t    accept_mutex;[m
[31m-[m
[31m-    ngx_msec_t    accept_mutex_delay;[m
[31m-[m
[31m-    u_char       *name;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_array_t   debug_connection;[m
[31m-#endif[m
[31m-} ngx_event_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t              *name;[m
[31m-[m
[31m-    void                 *(*create_conf)(ngx_cycle_t *cycle);[m
[31m-    char                 *(*init_conf)(ngx_cycle_t *cycle, void *conf);[m
[31m-[m
[31m-    ngx_event_actions_t     actions;[m
[31m-} ngx_event_module_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_atomic_t          *ngx_connection_counter;[m
[31m-[m
[31m-extern ngx_atomic_t          *ngx_accept_mutex_ptr;[m
[31m-extern ngx_shmtx_t            ngx_accept_mutex;[m
[31m-extern ngx_uint_t             ngx_use_accept_mutex;[m
[31m-extern ngx_uint_t             ngx_accept_events;[m
[31m-extern ngx_uint_t             ngx_accept_mutex_held;[m
[31m-extern ngx_msec_t             ngx_accept_mutex_delay;[m
[31m-extern ngx_int_t              ngx_accept_disabled;[m
[31m-[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-extern ngx_atomic_t  *ngx_stat_accepted;[m
[31m-extern ngx_atomic_t  *ngx_stat_handled;[m
[31m-extern ngx_atomic_t  *ngx_stat_requests;[m
[31m-extern ngx_atomic_t  *ngx_stat_active;[m
[31m-extern ngx_atomic_t  *ngx_stat_reading;[m
[31m-extern ngx_atomic_t  *ngx_stat_writing;[m
[31m-extern ngx_atomic_t  *ngx_stat_waiting;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_UPDATE_TIME         1[m
[31m-#define NGX_POST_EVENTS         2[m
[31m-[m
[31m-[m
[31m-extern sig_atomic_t           ngx_event_timer_alarm;[m
[31m-extern ngx_uint_t             ngx_event_flags;[m
[31m-extern ngx_module_t           ngx_events_module;[m
[31m-extern ngx_module_t           ngx_event_core_module;[m
[31m-[m
[31m-[m
[31m-#define ngx_event_get_conf(conf_ctx, module)                                  \[m
[31m-             (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];[m
[31m-[m
[31m-[m
[31m-[m
[31m-void ngx_event_accept(ngx_event_t *ev);[m
[31m-#if !(NGX_WIN32)[m
[31m-void ngx_event_recvmsg(ngx_event_t *ev);[m
[31m-#endif[m
[31m-ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle);[m
[31m-u_char *ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-void ngx_process_events_and_timers(ngx_cycle_t *cycle);[m
[31m-ngx_int_t ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags);[m
[31m-ngx_int_t ngx_handle_write_event(ngx_event_t *wev, size_t lowat);[m
[31m-[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-void ngx_event_acceptex(ngx_event_t *ev);[m
[31m-ngx_int_t ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n);[m
[31m-u_char *ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat);[m
[31m-[m
[31m-[m
[31m-/* used in ngx_log_debugX() */[m
[31m-#define ngx_event_ident(p)  ((ngx_connection_t *) (p))->fd[m
[31m-[m
[31m-[m
[31m-#include <ngx_event_timer.h>[m
[31m-#include <ngx_event_posted.h>[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-#include <ngx_iocp_module.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_accept.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_accept.c[m
[1mdeleted file mode 100644[m
[1mindex 1c87a34..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_accept.c[m
[1m+++ /dev/null[m
[36m@@ -1,834 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all);[m
[31m-static void ngx_close_accepted_connection(ngx_connection_t *c);[m
[31m-#if (NGX_DEBUG)[m
[31m-static void ngx_debug_accepted_connection(ngx_event_conf_t *ecf,[m
[31m-    ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_accept(ngx_event_t *ev)[m
[31m-{[m
[31m-    socklen_t          socklen;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_log_t         *log;[m
[31m-    ngx_uint_t         level;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c, *lc;[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-    u_char             sa[NGX_SOCKADDRLEN];[m
[31m-#if (NGX_HAVE_ACCEPT4)[m
[31m-    static ngx_uint_t  use_accept4 = 1;[m
[31m-#endif[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->timedout = 0;[m
[31m-    }[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {[m
[31m-        ev->available = ecf->multi_accept;[m
[31m-    }[m
[31m-[m
[31m-    lc = ev->data;[m
[31m-    ls = lc->listening;[m
[31m-    ev->ready = 0;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "accept on %V, ready: %d", &ls->addr_text, ev->available);[m
[31m-[m
[31m-    do {[m
[31m-        socklen = NGX_SOCKADDRLEN;[m
[31m-[m
[31m-#if (NGX_HAVE_ACCEPT4)[m
[31m-        if (use_accept4) {[m
[31m-            s = accept4(lc->fd, (struct sockaddr *) sa, &socklen,[m
[31m-                        SOCK_NONBLOCK);[m
[31m-        } else {[m
[31m-            s = accept(lc->fd, (struct sockaddr *) sa, &socklen);[m
[31m-        }[m
[31m-#else[m
[31m-        s = accept(lc->fd, (struct sockaddr *) sa, &socklen);[m
[31m-#endif[m
[31m-[m
[31m-        if (s == (ngx_socket_t) -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err == NGX_EAGAIN) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err,[m
[31m-                               "accept() not ready");[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            level = NGX_LOG_ALERT;[m
[31m-[m
[31m-            if (err == NGX_ECONNABORTED) {[m
[31m-                level = NGX_LOG_ERR;[m
[31m-[m
[31m-            } else if (err == NGX_EMFILE || err == NGX_ENFILE) {[m
[31m-                level = NGX_LOG_CRIT;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_ACCEPT4)[m
[31m-            ngx_log_error(level, ev->log, err,[m
[31m-                          use_accept4 ? "accept4() failed" : "accept() failed");[m
[31m-[m
[31m-            if (use_accept4 && err == NGX_ENOSYS) {[m
[31m-                use_accept4 = 0;[m
[31m-                ngx_inherited_nonblocking = 0;[m
[31m-                continue;[m
[31m-            }[m
[31m-#else[m
[31m-            ngx_log_error(level, ev->log, err, "accept() failed");[m
[31m-#endif[m
[31m-[m
[31m-            if (err == NGX_ECONNABORTED) {[m
[31m-                if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                    ev->available--;[m
[31m-                }[m
[31m-[m
[31m-                if (ev->available) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (err == NGX_EMFILE || err == NGX_ENFILE) {[m
[31m-                if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle, 1)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_use_accept_mutex) {[m
[31m-                    if (ngx_accept_mutex_held) {[m
[31m-                        ngx_shmtx_unlock(&ngx_accept_mutex);[m
[31m-                        ngx_accept_mutex_held = 0;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_accept_disabled = 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_add_timer(ev, ecf->accept_mutex_delay);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1);[m
[31m-#endif[m
[31m-[m
[31m-        ngx_accept_disabled = ngx_cycle->connection_n / 8[m
[31m-                              - ngx_cycle->free_connection_n;[m
[31m-[m
[31m-        c = ngx_get_connection(s, ev->log);[m
[31m-[m
[31m-        if (c == NULL) {[m
[31m-            if (ngx_close_socket(s) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,[m
[31m-                              ngx_close_socket_n " failed");[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->type = SOCK_STREAM;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_active, 1);[m
[31m-#endif[m
[31m-[m
[31m-        c->pool = ngx_create_pool(ls->pool_size, ev->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->sockaddr = ngx_palloc(c->pool, socklen);[m
[31m-        if (c->sockaddr == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(c->sockaddr, sa, socklen);[m
[31m-[m
[31m-        log = ngx_palloc(c->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* set a blocking mode for iocp and non-blocking mode for others */[m
[31m-[m
[31m-        if (ngx_inherited_nonblocking) {[m
[31m-            if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-                if (ngx_blocking(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,[m
[31m-                                  ngx_blocking_n " failed");[m
[31m-                    ngx_close_accepted_connection(c);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {[m
[31m-                if (ngx_nonblocking(s) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,[m
[31m-                                  ngx_nonblocking_n " failed");[m
[31m-                    ngx_close_accepted_connection(c);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *log = ls->log;[m
[31m-[m
[31m-        c->recv = ngx_recv;[m
[31m-        c->send = ngx_send;[m
[31m-        c->recv_chain = ngx_recv_chain;[m
[31m-        c->send_chain = ngx_send_chain;[m
[31m-[m
[31m-        c->log = log;[m
[31m-        c->pool->log = log;[m
[31m-[m
[31m-        c->socklen = socklen;[m
[31m-        c->listening = ls;[m
[31m-        c->local_sockaddr = ls->sockaddr;[m
[31m-        c->local_socklen = ls->socklen;[m
[31m-[m
[31m-        c->unexpected_eof = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        if (c->sockaddr->sa_family == AF_UNIX) {[m
[31m-            c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */[m
[31m-            c->sendfile = 0;[m
[31m-#endif[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            rev->ready = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ev->deferred_accept) {[m
[31m-            rev->ready = 1;[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-            rev->available = 1;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        rev->log = log;[m
[31m-        wev->log = log;[m
[31m-[m
[31m-        /*[m
[31m-         * TODO: MT: - ngx_atomic_fetch_add()[m
[31m-         *             or protection by critical section or light mutex[m
[31m-         *[m
[31m-         * TODO: MP: - allocated in a shared memory[m
[31m-         *           - ngx_atomic_fetch_add()[m
[31m-         *             or protection by critical section or light mutex[m
[31m-         */[m
[31m-[m
[31m-        c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_handled, 1);[m
[31m-#endif[m
[31m-[m
[31m-        if (ls->addr_ntop) {[m
[31m-            c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);[m
[31m-            if (c->addr_text.data == NULL) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,[m
[31m-                                             c->addr_text.data,[m
[31m-                                             ls->addr_text_max_len, 0);[m
[31m-            if (c->addr_text.len == 0) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        ngx_str_t  addr;[m
[31m-        u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-        ngx_debug_accepted_connection(ecf, c);[m
[31m-[m
[31m-        if (log->log_level & NGX_LOG_DEBUG_EVENT) {[m
[31m-            addr.data = text;[m
[31m-            addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text,[m
[31m-                                     NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                           "*%uA accept: %V fd:%d", c->number, &addr, s);[m
[31m-        }[m
[31m-[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {[m
[31m-            if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        log->data = NULL;[m
[31m-        log->handler = NULL;[m
[31m-[m
[31m-        ls->handler(c);[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-            ev->available--;[m
[31m-        }[m
[31m-[m
[31m-    } while (ev->available);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-[m
[31m-void[m
[31m-ngx_event_recvmsg(ngx_event_t *ev)[m
[31m-{[m
[31m-    ssize_t            n;[m
[31m-    ngx_log_t         *log;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    struct iovec       iov[1];[m
[31m-    struct msghdr      msg;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_event_conf_t  *ecf;[m
[31m-    ngx_connection_t  *c, *lc;[m
[31m-    u_char             sa[NGX_SOCKADDRLEN];[m
[31m-    static u_char      buffer[65535];[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-#if (NGX_HAVE_IP_RECVDSTADDR)[m
[31m-    u_char             msg_control[CMSG_SPACE(sizeof(struct in_addr))];[m
[31m-#elif (NGX_HAVE_IP_PKTINFO)[m
[31m-    u_char             msg_control[CMSG_SPACE(sizeof(struct in_pktinfo))];[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)[m
[31m-    u_char             msg_control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->timedout = 0;[m
[31m-    }[m
[31m-[m
[31m-    ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);[m
[31m-[m
[31m-    if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {[m
[31m-        ev->available = ecf->multi_accept;[m
[31m-    }[m
[31m-[m
[31m-    lc = ev->data;[m
[31m-    ls = lc->listening;[m
[31m-    ev->ready = 0;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "recvmsg on %V, ready: %d", &ls->addr_text, ev->available);[m
[31m-[m
[31m-    do {[m
[31m-        ngx_memzero(&msg, sizeof(struct msghdr));[m
[31m-[m
[31m-        iov[0].iov_base = (void *) buffer;[m
[31m-        iov[0].iov_len = sizeof(buffer);[m
[31m-[m
[31m-        msg.msg_name = &sa;[m
[31m-        msg.msg_namelen = sizeof(sa);[m
[31m-        msg.msg_iov = iov;[m
[31m-        msg.msg_iovlen = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-        if (ls->wildcard) {[m
[31m-[m
[31m-#if (NGX_HAVE_IP_RECVDSTADDR || NGX_HAVE_IP_PKTINFO)[m
[31m-            if (ls->sockaddr->sa_family == AF_INET) {[m
[31m-                msg.msg_control = &msg_control;[m
[31m-                msg.msg_controllen = sizeof(msg_control);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)[m
[31m-            if (ls->sockaddr->sa_family == AF_INET6) {[m
[31m-                msg.msg_control = &msg_control6;[m
[31m-                msg.msg_controllen = sizeof(msg_control6);[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        n = recvmsg(lc->fd, &msg, 0);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_socket_errno;[m
[31m-[m
[31m-            if (err == NGX_EAGAIN) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err,[m
[31m-                               "recvmsg() not ready");[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, err, "recvmsg() failed");[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-        if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ev->log, 0,[m
[31m-                          "recvmsg() truncated data");[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_accept_disabled = ngx_cycle->connection_n / 8[m
[31m-                              - ngx_cycle->free_connection_n;[m
[31m-[m
[31m-        c = ngx_get_connection(lc->fd, ev->log);[m
[31m-        if (c == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->shared = 1;[m
[31m-        c->type = SOCK_DGRAM;[m
[31m-        c->socklen = msg.msg_namelen;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_active, 1);[m
[31m-#endif[m
[31m-[m
[31m-        c->pool = ngx_create_pool(ls->pool_size, ev->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->sockaddr = ngx_palloc(c->pool, c->socklen);[m
[31m-        if (c->sockaddr == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(c->sockaddr, msg.msg_name, c->socklen);[m
[31m-[m
[31m-        log = ngx_palloc(c->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        *log = ls->log;[m
[31m-[m
[31m-        c->send = ngx_udp_send;[m
[31m-[m
[31m-        c->log = log;[m
[31m-        c->pool->log = log;[m
[31m-[m
[31m-        c->listening = ls;[m
[31m-        c->local_sockaddr = ls->sockaddr;[m
[31m-        c->local_socklen = ls->socklen;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-        if (ls->wildcard) {[m
[31m-            struct cmsghdr   *cmsg;[m
[31m-            struct sockaddr  *sockaddr;[m
[31m-[m
[31m-            sockaddr = ngx_palloc(c->pool, c->local_socklen);[m
[31m-            if (sockaddr == NULL) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(sockaddr, c->local_sockaddr, c->local_socklen);[m
[31m-            c->local_sockaddr = sockaddr;[m
[31m-[m
[31m-            for (cmsg = CMSG_FIRSTHDR(&msg);[m
[31m-                 cmsg != NULL;[m
[31m-                 cmsg = CMSG_NXTHDR(&msg, cmsg))[m
[31m-            {[m
[31m-[m
[31m-#if (NGX_HAVE_IP_RECVDSTADDR)[m
[31m-[m
[31m-                if (cmsg->cmsg_level == IPPROTO_IP[m
[31m-                    && cmsg->cmsg_type == IP_RECVDSTADDR[m
[31m-                    && sockaddr->sa_family == AF_INET)[m
[31m-                {[m
[31m-                    struct in_addr      *addr;[m
[31m-                    struct sockaddr_in  *sin;[m
[31m-[m
[31m-                    addr = (struct in_addr *) CMSG_DATA(cmsg);[m
[31m-                    sin = (struct sockaddr_in *) sockaddr;[m
[31m-                    sin->sin_addr = *addr;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-#elif (NGX_HAVE_IP_PKTINFO)[m
[31m-[m
[31m-                if (cmsg->cmsg_level == IPPROTO_IP[m
[31m-                    && cmsg->cmsg_type == IP_PKTINFO[m
[31m-                    && sockaddr->sa_family == AF_INET)[m
[31m-                {[m
[31m-                    struct in_pktinfo   *pkt;[m
[31m-                    struct sockaddr_in  *sin;[m
[31m-[m
[31m-                    pkt = (struct in_pktinfo *) CMSG_DATA(cmsg);[m
[31m-                    sin = (struct sockaddr_in *) sockaddr;[m
[31m-                    sin->sin_addr = pkt->ipi_addr;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)[m
[31m-[m
[31m-                if (cmsg->cmsg_level == IPPROTO_IPV6[m
[31m-                    && cmsg->cmsg_type == IPV6_PKTINFO[m
[31m-                    && sockaddr->sa_family == AF_INET6)[m
[31m-                {[m
[31m-                    struct in6_pktinfo   *pkt6;[m
[31m-                    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-                    pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg);[m
[31m-                    sin6 = (struct sockaddr_in6 *) sockaddr;[m
[31m-                    sin6->sin6_addr = pkt6->ipi6_addr;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        c->buffer = ngx_create_temp_buf(c->pool, n);[m
[31m-        if (c->buffer == NULL) {[m
[31m-            ngx_close_accepted_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->buffer->last = ngx_cpymem(c->buffer->last, buffer, n);[m
[31m-[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        rev->log = log;[m
[31m-        wev->log = log;[m
[31m-[m
[31m-        /*[m
[31m-         * TODO: MT: - ngx_atomic_fetch_add()[m
[31m-         *             or protection by critical section or light mutex[m
[31m-         *[m
[31m-         * TODO: MP: - allocated in a shared memory[m
[31m-         *           - ngx_atomic_fetch_add()[m
[31m-         *             or protection by critical section or light mutex[m
[31m-         */[m
[31m-[m
[31m-        c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_handled, 1);[m
[31m-#endif[m
[31m-[m
[31m-        if (ls->addr_ntop) {[m
[31m-            c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);[m
[31m-            if (c->addr_text.data == NULL) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,[m
[31m-                                             c->addr_text.data,[m
[31m-                                             ls->addr_text_max_len, 0);[m
[31m-            if (c->addr_text.len == 0) {[m
[31m-                ngx_close_accepted_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        ngx_str_t  addr;[m
[31m-        u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-        ngx_debug_accepted_connection(ecf, c);[m
[31m-[m
[31m-        if (log->log_level & NGX_LOG_DEBUG_EVENT) {[m
[31m-            addr.data = text;[m
[31m-            addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text,[m
[31m-                                     NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                           "*%uA recvmsg: %V fd:%d n:%z",[m
[31m-                           c->number, &addr, c->fd, n);[m
[31m-        }[m
[31m-[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        log->data = NULL;[m
[31m-        log->handler = NULL;[m
[31m-[m
[31m-        ls->handler(c);[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-            ev->available -= n;[m
[31m-        }[m
[31m-[m
[31m-    } while (ev->available);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_trylock_accept_mutex(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    if (ngx_shmtx_trylock(&ngx_accept_mutex)) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "accept mutex locked");[m
[31m-[m
[31m-        if (ngx_accept_mutex_held && ngx_accept_events == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_enable_accept_events(cycle) == NGX_ERROR) {[m
[31m-            ngx_shmtx_unlock(&ngx_accept_mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_accept_events = 0;[m
[31m-        ngx_accept_mutex_held = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                   "accept mutex lock failed: %ui", ngx_accept_mutex_held);[m
[31m-[m
[31m-    if (ngx_accept_mutex_held) {[m
[31m-        if (ngx_disable_accept_events(cycle, 0) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_accept_mutex_held = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_enable_accept_events(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        c = ls[i].connection;[m
[31m-[m
[31m-        if (c == NULL || c->read->active) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-[m
[31m-        c = ls[i].connection;[m
[31m-[m
[31m-        if (c == NULL || !c->read->active) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-[m
[31m-        /*[m
[31m-         * do not disable accept on worker's own sockets[m
[31m-         * when disabling accept events due to accept mutex[m
[31m-         */[m
[31m-[m
[31m-        if (ls[i].reuseport && !all) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_del_event(c->read, NGX_READ_EVENT, NGX_DISABLE_EVENT)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_close_accepted_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_socket_t  fd;[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    fd = c->fd;[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (!c->shared && ngx_close_socket(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-[m
[31m-    if (c->pool) {[m
[31m-        ngx_destroy_pool(c->pool);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    return ngx_snprintf(buf, len, " while accepting new connection on %V",[m
[31m-                        log->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-static void[m
[31m-ngx_debug_accepted_connection(ngx_event_conf_t *ecf, ngx_connection_t *c)[m
[31m-{[m
[31m-    struct sockaddr_in   *sin;[m
[31m-    ngx_cidr_t           *cidr;[m
[31m-    ngx_uint_t            i;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-    ngx_uint_t            n;[m
[31m-#endif[m
[31m-[m
[31m-    cidr = ecf->debug_connection.elts;[m
[31m-    for (i = 0; i < ecf->debug_connection.nelts; i++) {[m
[31m-        if (cidr[i].family != (ngx_uint_t) c->sockaddr->sa_family) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        switch (cidr[i].family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->sockaddr;[m
[31m-            for (n = 0; n < 16; n++) {[m
[31m-                if ((sin6->sin6_addr.s6_addr[n][m
[31m-                    & cidr[i].u.in6.mask.s6_addr[n])[m
[31m-                    != cidr[i].u.in6.addr.s6_addr[n])[m
[31m-                {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->sockaddr;[m
[31m-            if ((sin->sin_addr.s_addr & cidr[i].u.in.mask)[m
[31m-                != cidr[i].u.in.addr)[m
[31m-            {[m
[31m-                goto next;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        c->log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;[m
[31m-        break;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_acceptex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_acceptex.c[m
[1mdeleted file mode 100644[m
[1mindex 1dbfd6c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_acceptex.c[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_close_posted_connection(ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_acceptex(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    ls = c->listening;[m
[31m-[m
[31m-    c->log->handler = ngx_accept_log_error;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "AcceptEx: %d", c->fd);[m
[31m-[m
[31m-    if (rev->ovlp.error) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error,[m
[31m-                      "AcceptEx() %V failed", &ls->addr_text);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */[m
[31m-[m
[31m-    if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,[m
[31m-                   (char *) &ls->fd, sizeof(ngx_socket_t))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,[m
[31m-                      "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %V",[m
[31m-                      &c->addr_text);[m
[31m-    } else {[m
[31m-        c->accept_context_updated = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_getacceptexsockaddrs(c->buffer->pos,[m
[31m-                             ls->post_accept_buffer_size,[m
[31m-                             ls->socklen + 16,[m
[31m-                             ls->socklen + 16,[m
[31m-                             &c->local_sockaddr, &c->local_socklen,[m
[31m-                             &c->sockaddr, &c->socklen);[m
[31m-[m
[31m-    if (ls->post_accept_buffer_size) {[m
[31m-        c->buffer->last += rev->available;[m
[31m-        c->buffer->end = c->buffer->start + ls->post_accept_buffer_size;[m
[31m-[m
[31m-    } else {[m
[31m-        c->buffer = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ls->addr_ntop) {[m
[31m-        c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);[m
[31m-        if (c->addr_text.data == NULL) {[m
[31m-            /* TODO: close socket */[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,[m
[31m-                                         c->addr_text.data,[m
[31m-                                         ls->addr_text_max_len, 0);[m
[31m-        if (c->addr_text.len == 0) {[m
[31m-            /* TODO: close socket */[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_event_post_acceptex(ls, 1);[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    ls->handler(c);[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n)[m
[31m-{[m
[31m-    u_long             rcvd;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_log_t         *log;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        /* TODO: look up reused sockets */[m
[31m-[m
[31m-        s = ngx_socket(ls->sockaddr->sa_family, ls->type, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &ls->log, 0,[m
[31m-                       ngx_socket_n " s:%d", s);[m
[31m-[m
[31m-        if (s == (ngx_socket_t) -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &ls->log, ngx_socket_errno,[m
[31m-                          ngx_socket_n " failed");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c = ngx_get_connection(s, &ls->log);[m
[31m-[m
[31m-        if (c == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->pool = ngx_create_pool(ls->pool_size, &ls->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log = ngx_palloc(c->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->buffer = ngx_create_temp_buf(c->pool, ls->post_accept_buffer_size[m
[31m-                                                 + 2 * (ls->socklen + 16));[m
[31m-        if (c->buffer == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->local_sockaddr = ngx_palloc(c->pool, ls->socklen);[m
[31m-        if (c->local_sockaddr == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->sockaddr = ngx_palloc(c->pool, ls->socklen);[m
[31m-        if (c->sockaddr == NULL) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *log = ls->log;[m
[31m-        c->log = log;[m
[31m-[m
[31m-        c->recv = ngx_recv;[m
[31m-        c->send = ngx_send;[m
[31m-        c->recv_chain = ngx_recv_chain;[m
[31m-        c->send_chain = ngx_send_chain;[m
[31m-[m
[31m-        c->unexpected_eof = 1;[m
[31m-[m
[31m-        c->listening = ls;[m
[31m-[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        rev->ovlp.event = rev;[m
[31m-        wev->ovlp.event = wev;[m
[31m-        rev->handler = ngx_event_acceptex;[m
[31m-[m
[31m-        rev->ready = 1;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        rev->log = c->log;[m
[31m-        wev->log = c->log;[m
[31m-[m
[31m-        if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) {[m
[31m-            ngx_close_posted_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_acceptex(ls->fd, s, c->buffer->pos, ls->post_accept_buffer_size,[m
[31m-                         ls->socklen + 16, ls->socklen + 16,[m
[31m-                         &rcvd, (LPOVERLAPPED) &rev->ovlp)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-            if (err != WSA_IO_PENDING) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, &ls->log, err,[m
[31m-                              "AcceptEx() %V failed", &ls->addr_text);[m
[31m-[m
[31m-                ngx_close_posted_connection(c);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_close_posted_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_socket_t  fd;[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    fd = c->fd;[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (ngx_close_socket(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-[m
[31m-    if (c->pool) {[m
[31m-        ngx_destroy_pool(c->pool);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    return ngx_snprintf(buf, len, " while posting AcceptEx() on %V", log->data);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connect.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connect.c[m
[1mdeleted file mode 100644[m
[1mindex 8aca862..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connect.c[m
[1m+++ /dev/null[m
[36m@@ -1,256 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_connect_peer(ngx_peer_connection_t *pc)[m
[31m-{[m
[31m-    int                rc, type;[m
[31m-    ngx_int_t          event;[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_uint_t         level;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    rc = pc->get(pc, pc->data);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    type = (pc->type ? pc->type : SOCK_STREAM);[m
[31m-[m
[31m-    s = ngx_socket(pc->sockaddr->sa_family, type, 0);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, "%s socket %d",[m
[31m-                   (type == SOCK_STREAM) ? "stream" : "dgram", s);[m
[31m-[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    c = ngx_get_connection(s, pc->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n "failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->type = type;[m
[31m-[m
[31m-    if (pc->rcvbuf) {[m
[31m-        if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,[m
[31m-                       (const void *) &pc->rcvbuf, sizeof(int)) == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                          "setsockopt(SO_RCVBUF) failed");[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (pc->local) {[m
[31m-        if (bind(s, pc->local->sockaddr, pc->local->socklen) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, pc->log, ngx_socket_errno,[m
[31m-                          "bind(%V) failed", &pc->local->name);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (type == SOCK_STREAM) {[m
[31m-        c->recv = ngx_recv;[m
[31m-        c->send = ngx_send;[m
[31m-        c->recv_chain = ngx_recv_chain;[m
[31m-        c->send_chain = ngx_send_chain;[m
[31m-[m
[31m-        c->sendfile = 1;[m
[31m-[m
[31m-        if (pc->sockaddr->sa_family == AF_UNIX) {[m
[31m-            c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */[m
[31m-            c->sendfile = 0;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-    } else { /* type == SOCK_DGRAM */[m
[31m-        c->recv = ngx_udp_recv;[m
[31m-        c->send = ngx_send;[m
[31m-    }[m
[31m-[m
[31m-    c->log_error = pc->log_error;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = pc->log;[m
[31m-    wev->log = pc->log;[m
[31m-[m
[31m-    pc->connection = c;[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0,[m
[31m-                   "connect to %V, fd:%d #%uA", pc->name, s, c->number);[m
[31m-[m
[31m-    rc = connect(s, pc->sockaddr, pc->socklen);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-[m
[31m-        if (err != NGX_EINPROGRESS[m
[31m-#if (NGX_WIN32)[m
[31m-            /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */[m
[31m-            && err != NGX_EAGAIN[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            if (err == NGX_ECONNREFUSED[m
[31m-#if (NGX_LINUX)[m
[31m-                /*[m
[31m-                 * Linux returns EAGAIN instead of ECONNREFUSED[m
[31m-                 * for unix sockets if listen queue is full[m
[31m-                 */[m
[31m-                || err == NGX_EAGAIN[m
[31m-#endif[m
[31m-                || err == NGX_ECONNRESET[m
[31m-                || err == NGX_ENETDOWN[m
[31m-                || err == NGX_ENETUNREACH[m
[31m-                || err == NGX_EHOSTDOWN[m
[31m-                || err == NGX_EHOSTUNREACH)[m
[31m-            {[m
[31m-                level = NGX_LOG_ERR;[m
[31m-[m
[31m-            } else {[m
[31m-                level = NGX_LOG_CRIT;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(level, c->log, err, "connect() to %V failed",[m
[31m-                          pc->name);[m
[31m-[m
[31m-            ngx_close_connection(c);[m
[31m-            pc->connection = NULL;[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_conn) {[m
[31m-        if (rc == -1) {[m
[31m-[m
[31m-            /* NGX_EINPROGRESS */[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");[m
[31m-[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, ngx_socket_errno,[m
[31m-                       "connect(): %d", rc);[m
[31m-[m
[31m-        if (ngx_blocking(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,[m
[31m-                          ngx_blocking_n " failed");[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * FreeBSD's aio allows to post an operation on non-connected socket.[m
[31m-         * NT does not support it.[m
[31m-         *[m
[31m-         * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT[m
[31m-         */[m
[31m-[m
[31m-        rev->ready = 1;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        /* kqueue */[m
[31m-[m
[31m-        event = NGX_CLEAR_EVENT;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* select, poll, /dev/poll */[m
[31m-[m
[31m-        event = NGX_LEVEL_EVENT;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-[m
[31m-        /* NGX_EINPROGRESS */[m
[31m-[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");[m
[31m-[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connect.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connect.h[m
[1mdeleted file mode 100644[m
[1mindex 1bacf82..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connect.h[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_CONNECT_H_INCLUDED_[m
[31m-#define _NGX_EVENT_CONNECT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_PEER_KEEPALIVE           1[m
[31m-#define NGX_PEER_NEXT                2[m
[31m-#define NGX_PEER_FAILED              4[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_peer_connection_s  ngx_peer_connection_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_event_get_peer_pt)(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-typedef void (*ngx_event_free_peer_pt)(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state);[m
[31m-#if (NGX_SSL)[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_event_set_peer_session_pt)(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-typedef void (*ngx_event_save_peer_session_pt)(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-struct ngx_peer_connection_s {[m
[31m-    ngx_connection_t                *connection;[m
[31m-[m
[31m-    struct sockaddr                 *sockaddr;[m
[31m-    socklen_t                        socklen;[m
[31m-    ngx_str_t                       *name;[m
[31m-[m
[31m-    ngx_uint_t                       tries;[m
[31m-    ngx_msec_t                       start_time;[m
[31m-[m
[31m-    ngx_event_get_peer_pt            get;[m
[31m-    ngx_event_free_peer_pt           free;[m
[31m-    void                            *data;[m
[31m-[m
[31m-#if (NGX_SSL)[m
[31m-    ngx_event_set_peer_session_pt    set_session;[m
[31m-    ngx_event_save_peer_session_pt   save_session;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_addr_t                      *local;[m
[31m-[m
[31m-    int                              type;[m
[31m-    int                              rcvbuf;[m
[31m-[m
[31m-    ngx_log_t                       *log;[m
[31m-[m
[31m-    unsigned                         cached:1;[m
[31m-[m
[31m-                                     /* ngx_connection_log_error_e */[m
[31m-    unsigned                         log_error:2;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_event_connect_peer(ngx_peer_connection_t *pc);[m
[31m-ngx_int_t ngx_event_get_peer(ngx_peer_connection_t *pc, void *data);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_CONNECT_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connectex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connectex.c[m
[1mdeleted file mode 100644[m
[1mindex 59ada74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_connectex.c[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_PENDING_CONN  10[m
[31m-[m
[31m-[m
[31m-static CRITICAL_SECTION  connect_lock;[m
[31m-static int               nconnects;[m
[31m-static ngx_connection_t  pending_connects[NGX_MAX_PENDING_CONN];[m
[31m-[m
[31m-static HANDLE            pending_connect_event;[m
[31m-[m
[31m-__declspec(thread) int                nevents = 0;[m
[31m-__declspec(thread) WSAEVENT           events[WSA_MAXIMUM_WAIT_EVENTS + 1];[m
[31m-__declspec(thread) ngx_connection_t  *conn[WSA_MAXIMUM_WAIT_EVENTS + 1];[m
[31m-[m
[31m-[m
[31m-[m
[31m-int ngx_iocp_wait_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    for ( ;; ) {[m
[31m-        EnterCriticalSection(&connect_lock);[m
[31m-[m
[31m-        if (nconnects < NGX_MAX_PENDING_CONN) {[m
[31m-            pending_connects[--nconnects] = c;[m
[31m-            LeaveCriticalSection(&connect_lock);[m
[31m-[m
[31m-            if (SetEvent(pending_connect_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                              "SetEvent() failed");[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        LeaveCriticalSection(&connect_lock);[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, c->log, 0,[m
[31m-                      "max number of pending connect()s is %d",[m
[31m-                      NGX_MAX_PENDING_CONN);[m
[31m-        msleep(100);[m
[31m-    }[m
[31m-[m
[31m-    if (!started) {[m
[31m-        if (ngx_iocp_new_thread(1) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        started = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int ngx_iocp_new_thread(int main)[m
[31m-{[m
[31m-    u_int  id;[m
[31m-[m
[31m-    if (main) {[m
[31m-        pending_connect_event = CreateEvent(NULL, 0, 1, NULL);[m
[31m-        if (pending_connect_event == INVALID_HANDLE_VALUE) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                          "CreateThread() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (CreateThread(NULL, 0, ngx_iocp_wait_events, main, 0, &id)[m
[31m-                                                       == INVALID_HANDLE_VALUE)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "CreateThread() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SetEvent(event) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,[m
[31m-                      "SetEvent() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int ngx_iocp_new_connect()[m
[31m-{[m
[31m-    EnterCriticalSection(&connect_lock);[m
[31m-    c = pending_connects[--nconnects];[m
[31m-    LeaveCriticalSection(&connect_lock);[m
[31m-[m
[31m-    conn[nevents] = c;[m
[31m-[m
[31m-    events[nevents] = WSACreateEvent();[m
[31m-    if (events[nevents] == INVALID_HANDLE_VALUE) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,[m
[31m-                      "WSACreateEvent() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (WSAEventSelect(c->fd, events[nevents], FD_CONNECT) == -1)[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,[m
[31m-                      "WSAEventSelect() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    nevents++;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_iocp_wait_events(int main)[m
[31m-{[m
[31m-    WSANETWORKEVENTS  ne;[m
[31m-[m
[31m-    nevents = 1;[m
[31m-    events[0] = pending_connect_event;[m
[31m-    conn[0] = NULL;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        offset = (nevents == WSA_MAXIMUM_WAIT_EVENTS + 1) ? 1: 0;[m
[31m-        timeout = (nevents == 1 && !first) ? 60000: INFINITE;[m
[31m-[m
[31m-        n = WSAWaitForMultipleEvents(nevents - offset, events[offset],[m
[31m-                                     0, timeout, 0);[m
[31m-        if (n == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                          "WSAWaitForMultipleEvents() failed");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == WAIT_TIMEOUT) {[m
[31m-            if (nevents == 2 && !main) {[m
[31m-                ExitThread(0);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "WSAWaitForMultipleEvents() "[m
[31m-                          "returned unexpected WAIT_TIMEOUT");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        n -= WSA_WAIT_EVENT_0;[m
[31m-[m
[31m-        if (events[n] == NULL) {[m
[31m-[m
[31m-            /* the pending_connect_event */[m
[31m-[m
[31m-            if (nevents == WSA_MAXIMUM_WAIT_EVENTS) {[m
[31m-                ngx_iocp_new_thread(0);[m
[31m-            } else {[m
[31m-                ngx_iocp_new_connect();[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (WSAEnumNetworkEvents(c[n].fd, events[n], &ne) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                          "WSAEnumNetworkEvents() failed");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ne.lNetworkEvents & FD_CONNECT) {[m
[31m-            conn[n].write->ovlp.error = ne.iErrorCode[FD_CONNECT_BIT];[m
[31m-[m
[31m-            if (PostQueuedCompletionStatus(iocp, 0, NGX_IOCP_CONNECT,[m
[31m-                                           &conn[n].write->ovlp) == 0)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                              "PostQueuedCompletionStatus() failed");[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n < nevents) {[m
[31m-                conn[n] = conn[nevents];[m
[31m-                events[n] = events[nevents];[m
[31m-            }[m
[31m-[m
[31m-            nevents--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ne.lNetworkEvents & FD_ACCEPT) {[m
[31m-[m
[31m-            /* CHECK ERROR ??? */[m
[31m-[m
[31m-            ngx_event_post_acceptex(conn[n].listening, 1);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c[n].log, 0,[m
[31m-                      "WSAWaitForMultipleEvents() "[m
[31m-                      "returned unexpected network event %ul",[m
[31m-                      ne.lNetworkEvents);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.c[m
[1mdeleted file mode 100644[m
[1mindex a570383..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.c[m
[1m+++ /dev/null[m
[36m@@ -1,3587 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_PASSWORD_BUFFER_SIZE  4096[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  engine;   /* unsigned  engine:1; */[m
[31m-} ngx_openssl_conf_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_ssl_password_callback(char *buf, int size, int rwflag,[m
[31m-    void *userdata);[m
[31m-static int ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store);[m
[31m-static void ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where,[m
[31m-    int ret);[m
[31m-static void ngx_ssl_passwords_cleanup(void *data);[m
[31m-static void ngx_ssl_handshake_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n);[m
[31m-static void ngx_ssl_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_ssl_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_ssl_shutdown_handler(ngx_event_t *ev);[m
[31m-static void ngx_ssl_connection_error(ngx_connection_t *c, int sslerr,[m
[31m-    ngx_err_t err, char *text);[m
[31m-static void ngx_ssl_clear_error(ngx_log_t *log);[m
[31m-[m
[31m-static ngx_int_t ngx_ssl_session_id_context(ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *sess_ctx);[m
[31m-ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data);[m
[31m-static int ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-    ngx_ssl_session_t *sess);[m
[31m-static ngx_ssl_session_t *ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char *id, int len, int *copy);[m
[31m-static void ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess);[m
[31m-static void ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache,[m
[31m-    ngx_slab_pool_t *shpool, ngx_uint_t n);[m
[31m-static void ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-static int ngx_ssl_session_ticket_key_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx,[m
[31m-    HMAC_CTX *hctx, int enc);[m
[31m-#endif[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10002002L[m
[31m-static ngx_int_t ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *str);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_openssl_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void ngx_openssl_exit(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_openssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl_engine"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_openssl_engine,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_openssl_module_ctx = {[m
[31m-    ngx_string("openssl"),[m
[31m-    ngx_openssl_create_conf,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_openssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_openssl_module_ctx,               /* module context */[m
[31m-    ngx_openssl_commands,                  /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    ngx_openssl_exit,                      /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int  ngx_ssl_connection_index;[m
[31m-int  ngx_ssl_server_conf_index;[m
[31m-int  ngx_ssl_session_cache_index;[m
[31m-int  ngx_ssl_session_ticket_keys_index;[m
[31m-int  ngx_ssl_certificate_index;[m
[31m-int  ngx_ssl_stapling_index;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_init(ngx_log_t *log)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-[m
[31m-    OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG, NULL);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#ifndef OPENSSL_IS_BORINGSSL[m
[31m-    OPENSSL_config(NULL);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_library_init();[m
[31m-    SSL_load_error_strings();[m
[31m-[m
[31m-    OpenSSL_add_all_algorithms();[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-#ifndef SSL_OP_NO_COMPRESSION[m
[31m-    {[m
[31m-    /*[m
[31m-     * Disable gzip compression in OpenSSL prior to 1.0.0 version,[m
[31m-     * this saves about 522K per connection.[m
[31m-     */[m
[31m-    int                  n;[m
[31m-    STACK_OF(SSL_COMP)  *ssl_comp_methods;[m
[31m-[m
[31m-    ssl_comp_methods = SSL_COMP_get_compression_methods();[m
[31m-    n = sk_SSL_COMP_num(ssl_comp_methods);[m
[31m-[m
[31m-    while (n--) {[m
[31m-        (void) sk_SSL_COMP_pop(ssl_comp_methods);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    ngx_ssl_connection_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_connection_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0, "SSL_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_server_conf_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                         NULL);[m
[31m-    if (ngx_ssl_server_conf_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_session_cache_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                           NULL);[m
[31m-    if (ngx_ssl_session_cache_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_session_ticket_keys_index = SSL_CTX_get_ex_new_index(0, NULL, NULL,[m
[31m-                                                                 NULL, NULL);[m
[31m-    if (ngx_ssl_session_ticket_keys_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_certificate_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                         NULL);[m
[31m-    if (ngx_ssl_certificate_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_stapling_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                      NULL);[m
[31m-    if (ngx_ssl_stapling_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data)[m
[31m-{[m
[31m-    ssl->ctx = SSL_CTX_new(SSLv23_method());[m
[31m-[m
[31m-    if (ssl->ctx == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "SSL_CTX_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_server_conf_index, data) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl->buffer_size = NGX_SSL_BUFSIZE;[m
[31m-[m
[31m-    /* client side options */[m
[31m-[m
[31m-#ifdef SSL_OP_MICROSOFT_SESS_ID_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_SESS_ID_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_NETSCAPE_CHALLENGE_BUG);[m
[31m-#endif[m
[31m-[m
[31m-    /* server side options */[m
[31m-[m
[31m-#ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING[m
[31m-    /* this option allow a potential SSL 2.0 rollback (CAN-2005-2969) */[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MSIE_SSLV2_RSA_PADDING);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLEAY_080_CLIENT_DH_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_TLS_D5_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_D5_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_TLS_BLOCK_PADDING_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_BLOCK_PADDING_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_DH_USE);[m
[31m-[m
[31m-#ifdef SSL_CTRL_CLEAR_OPTIONS[m
[31m-    /* only in 0.9.8m+ */[m
[31m-    SSL_CTX_clear_options(ssl->ctx,[m
[31m-                          SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1);[m
[31m-#endif[m
[31m-[m
[31m-    if (!(protocols & NGX_SSL_SSLv2)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv2);[m
[31m-    }[m
[31m-    if (!(protocols & NGX_SSL_SSLv3)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv3);[m
[31m-    }[m
[31m-    if (!(protocols & NGX_SSL_TLSv1)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1);[m
[31m-    }[m
[31m-#ifdef SSL_OP_NO_TLSv1_1[m
[31m-    SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_1);[m
[31m-    if (!(protocols & NGX_SSL_TLSv1_1)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_1);[m
[31m-    }[m
[31m-#endif[m
[31m-#ifdef SSL_OP_NO_TLSv1_2[m
[31m-    SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_2);[m
[31m-    if (!(protocols & NGX_SSL_TLSv1_2)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_2);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_NO_COMPRESSION[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_COMPRESSION);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_MODE_RELEASE_BUFFERS[m
[31m-    SSL_CTX_set_mode(ssl->ctx, SSL_MODE_RELEASE_BUFFERS);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_MODE_NO_AUTO_CHAIN[m
[31m-    SSL_CTX_set_mode(ssl->ctx, SSL_MODE_NO_AUTO_CHAIN);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_CTX_set_read_ahead(ssl->ctx, 1);[m
[31m-[m
[31m-    SSL_CTX_set_info_callback(ssl->ctx, ngx_ssl_info_callback);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_str_t *key, ngx_array_t *passwords)[m
[31m-{[m
[31m-    BIO         *bio;[m
[31m-    X509        *x509;[m
[31m-    u_long       n;[m
[31m-    ngx_str_t   *pwd;[m
[31m-    ngx_uint_t   tries;[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we can't use SSL_CTX_use_certificate_chain_file() as it doesn't[m
[31m-     * allow to access certificate later from SSL_CTX, so we reimplement[m
[31m-     * it here[m
[31m-     */[m
[31m-[m
[31m-    bio = BIO_new_file((char *) cert->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL);[m
[31m-    if (x509 == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "PEM_read_bio_X509_AUX(\"%s\") failed", cert->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_use_certificate(ssl->ctx, x509) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_use_certificate(\"%s\") failed", cert->data);[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_certificate_index, x509)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_free(x509);[m
[31m-[m
[31m-    /* read rest of the chain */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);[m
[31m-        if (x509 == NULL) {[m
[31m-            n = ERR_peek_last_error();[m
[31m-[m
[31m-            if (ERR_GET_LIB(n) == ERR_LIB_PEM[m
[31m-                && ERR_GET_REASON(n) == PEM_R_NO_START_LINE)[m
[31m-            {[m
[31m-                /* end of file */[m
[31m-                ERR_clear_error();[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* some real error */[m
[31m-[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "PEM_read_bio_X509(\"%s\") failed", cert->data);[m
[31m-            BIO_free(bio);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (SSL_CTX_add_extra_chain_cert(ssl->ctx, x509) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_add_extra_chain_cert(\"%s\") failed",[m
[31m-                          cert->data);[m
[31m-            X509_free(x509);[m
[31m-            BIO_free(bio);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    if (ngx_strncmp(key->data, "engine:", sizeof("engine:") - 1) == 0) {[m
[31m-[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-[m
[31m-        u_char      *p, *last;[m
[31m-        ENGINE      *engine;[m
[31m-        EVP_PKEY    *pkey;[m
[31m-[m
[31m-        p = key->data + sizeof("engine:") - 1;[m
[31m-        last = (u_char *) ngx_strchr(p, ':');[m
[31m-[m
[31m-        if (last == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid syntax in \"%V\"", key);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *last = '\0';[m
[31m-[m
[31m-        engine = ENGINE_by_id((char *) p);[m
[31m-[m
[31m-        if (engine == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "ENGINE_by_id(\"%s\") failed", p);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *last++ = ':';[m
[31m-[m
[31m-        pkey = ENGINE_load_private_key(engine, (char *) last, 0, 0);[m
[31m-[m
[31m-        if (pkey == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "ENGINE_load_private_key(\"%s\") failed", last);[m
[31m-            ENGINE_free(engine);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ENGINE_free(engine);[m
[31m-[m
[31m-        if (SSL_CTX_use_PrivateKey(ssl->ctx, pkey) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_use_PrivateKey(\"%s\") failed", last);[m
[31m-            EVP_PKEY_free(pkey);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        EVP_PKEY_free(pkey);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "loading \"engine:...\" certificate keys "[m
[31m-                           "is not supported");[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, key, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (passwords) {[m
[31m-        tries = passwords->nelts;[m
[31m-        pwd = passwords->elts;[m
[31m-[m
[31m-        SSL_CTX_set_default_passwd_cb(ssl->ctx, ngx_ssl_password_callback);[m
[31m-        SSL_CTX_set_default_passwd_cb_userdata(ssl->ctx, pwd);[m
[31m-[m
[31m-    } else {[m
[31m-        tries = 1;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        pwd = NULL;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (SSL_CTX_use_PrivateKey_file(ssl->ctx, (char *) key->data,[m
[31m-                                        SSL_FILETYPE_PEM)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (--tries) {[m
[31m-            ERR_clear_error();[m
[31m-            SSL_CTX_set_default_passwd_cb_userdata(ssl->ctx, ++pwd);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_use_PrivateKey_file(\"%s\") failed", key->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_default_passwd_cb(ssl->ctx, NULL);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_password_callback(char *buf, int size, int rwflag, void *userdata)[m
[31m-{[m
[31m-    ngx_str_t *pwd = userdata;[m
[31m-[m
[31m-    if (rwflag) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "ngx_ssl_password_callback() is called for encryption");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (pwd->len > (size_t) size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                      "password is truncated to %d bytes", size);[m
[31m-    } else {[m
[31m-        size = pwd->len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(buf, pwd->data, size);[m
[31m-[m
[31m-    return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_int_t depth)[m
[31m-{[m
[31m-    STACK_OF(X509_NAME)  *list;[m
[31m-[m
[31m-    SSL_CTX_set_verify(ssl->ctx, SSL_VERIFY_PEER, ngx_ssl_verify_callback);[m
[31m-[m
[31m-    SSL_CTX_set_verify_depth(ssl->ctx, depth);[m
[31m-[m
[31m-    if (cert->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_load_verify_locations(\"%s\") failed",[m
[31m-                      cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_CTX_load_verify_locations() may leave errors in the error queue[m
[31m-     * while returning success[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    list = SSL_load_client_CA_file((char *) cert->data);[m
[31m-[m
[31m-    if (list == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_load_client_CA_file(\"%s\") failed", cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * before 0.9.7h and 0.9.8 SSL_load_client_CA_file()[m
[31m-     * always leaved an error in the error queue[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    SSL_CTX_set_client_CA_list(ssl->ctx, list);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_trusted_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_int_t depth)[m
[31m-{[m
[31m-    SSL_CTX_set_verify_depth(ssl->ctx, depth);[m
[31m-[m
[31m-    if (cert->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_load_verify_locations(\"%s\") failed",[m
[31m-                      cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_CTX_load_verify_locations() may leave errors in the error queue[m
[31m-     * while returning success[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl)[m
[31m-{[m
[31m-    X509_STORE   *store;[m
[31m-    X509_LOOKUP  *lookup;[m
[31m-[m
[31m-    if (crl->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, crl, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    store = SSL_CTX_get_cert_store(ssl->ctx);[m
[31m-[m
[31m-    if (store == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_get_cert_store() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());[m
[31m-[m
[31m-    if (lookup == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_add_lookup() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_LOOKUP_load_file(lookup, (char *) crl->data, X509_FILETYPE_PEM)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_LOOKUP_load_file(\"%s\") failed", crl->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_STORE_set_flags(store,[m
[31m-                         X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    char              *subject, *issuer;[m
[31m-    int                err, depth;[m
[31m-    X509              *cert;[m
[31m-    X509_NAME         *sname, *iname;[m
[31m-    ngx_connection_t  *c;[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    ssl_conn = X509_STORE_CTX_get_ex_data(x509_store,[m
[31m-                                          SSL_get_ex_data_X509_STORE_CTX_idx());[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    cert = X509_STORE_CTX_get_current_cert(x509_store);[m
[31m-    err = X509_STORE_CTX_get_error(x509_store);[m
[31m-    depth = X509_STORE_CTX_get_error_depth(x509_store);[m
[31m-[m
[31m-    sname = X509_get_subject_name(cert);[m
[31m-    subject = sname ? X509_NAME_oneline(sname, NULL, 0) : "(none)";[m
[31m-[m
[31m-    iname = X509_get_issuer_name(cert);[m
[31m-    issuer = iname ? X509_NAME_oneline(iname, NULL, 0) : "(none)";[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "verify:%d, error:%d, depth:%d, "[m
[31m-                   "subject:\"%s\", issuer:\"%s\"",[m
[31m-                   ok, err, depth, subject, issuer);[m
[31m-[m
[31m-    if (sname) {[m
[31m-        OPENSSL_free(subject);[m
[31m-    }[m
[31m-[m
[31m-    if (iname) {[m
[31m-        OPENSSL_free(issuer);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where, int ret)[m
[31m-{[m
[31m-    BIO               *rbio, *wbio;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (where & SSL_CB_HANDSHAKE_START) {[m
[31m-        c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-        if (c->ssl->handshaked) {[m
[31m-            c->ssl->renegotiation = 1;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL renegotiation");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((where & SSL_CB_ACCEPT_LOOP) == SSL_CB_ACCEPT_LOOP) {[m
[31m-        c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-        if (!c->ssl->handshake_buffer_set) {[m
[31m-            /*[m
[31m-             * By default OpenSSL uses 4k buffer during a handshake,[m
[31m-             * which is too low for long certificate chains and might[m
[31m-             * result in extra round-trips.[m
[31m-             *[m
[31m-             * To adjust a buffer size we detect that buffering was added[m
[31m-             * to write side of the connection by comparing rbio and wbio.[m
[31m-             * If they are different, we assume that it's due to buffering[m
[31m-             * added to wbio, and set buffer size.[m
[31m-             */[m
[31m-[m
[31m-            rbio = SSL_get_rbio((ngx_ssl_conn_t *) ssl_conn);[m
[31m-            wbio = SSL_get_wbio((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-            if (rbio != wbio) {[m
[31m-                (void) BIO_set_write_buffer_size(wbio, NGX_SSL_BUFSIZE);[m
[31m-                c->ssl->handshake_buffer_set = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-RSA *[m
[31m-ngx_ssl_rsa512_key_callback(ngx_ssl_conn_t *ssl_conn, int is_export,[m
[31m-    int key_length)[m
[31m-{[m
[31m-    static RSA  *key;[m
[31m-[m
[31m-    if (key_length != 512) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100003L && !defined OPENSSL_NO_DEPRECATED)[m
[31m-[m
[31m-    if (key == NULL) {[m
[31m-        key = RSA_generate_key(512, RSA_F4, NULL, NULL);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file)[m
[31m-{[m
[31m-    u_char              *p, *last, *end;[m
[31m-    size_t               len;[m
[31m-    ssize_t              n;[m
[31m-    ngx_fd_t             fd;[m
[31m-    ngx_str_t           *pwd;[m
[31m-    ngx_array_t         *passwords;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-    u_char               buf[NGX_SSL_PASSWORD_BUFFER_SIZE];[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->temp_pool, 0);[m
[31m-    passwords = ngx_array_create(cf->temp_pool, 4, sizeof(ngx_str_t));[m
[31m-[m
[31m-    if (cln == NULL || passwords == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_passwords_cleanup;[m
[31m-    cln->data = passwords;[m
[31m-[m
[31m-    fd = ngx_open_file(file->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           ngx_open_file_n " \"%s\" failed", file->data);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    last = buf;[m
[31m-[m
[31m-    do {[m
[31m-        n = ngx_read_fd(fd, last, NGX_SSL_PASSWORD_BUFFER_SIZE - len);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_read_fd_n " \"%s\" failed", file->data);[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        end = last + n;[m
[31m-[m
[31m-        if (len && n == 0) {[m
[31m-            *end++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            last = ngx_strlchr(last, end, LF);[m
[31m-[m
[31m-            if (last == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            len = last++ - p;[m
[31m-[m
[31m-            if (len && p[len - 1] == CR) {[m
[31m-                len--;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                pwd = ngx_array_push(passwords);[m
[31m-                if (pwd == NULL) {[m
[31m-                    passwords = NULL;[m
[31m-                    goto cleanup;[m
[31m-                }[m
[31m-[m
[31m-                pwd->len = len;[m
[31m-                pwd->data = ngx_pnalloc(cf->temp_pool, len);[m
[31m-[m
[31m-                if (pwd->data == NULL) {[m
[31m-                    passwords->nelts--;[m
[31m-                    passwords = NULL;[m
[31m-                    goto cleanup;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(pwd->data, p, len);[m
[31m-            }[m
[31m-[m
[31m-            p = last;[m
[31m-        }[m
[31m-[m
[31m-        len = end - p;[m
[31m-[m
[31m-        if (len == NGX_SSL_PASSWORD_BUFFER_SIZE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "too long line in \"%s\"", file->data);[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memmove(buf, p, len);[m
[31m-        last = buf + len;[m
[31m-[m
[31m-    } while (n != 0);[m
[31m-[m
[31m-    if (passwords->nelts == 0) {[m
[31m-        pwd = ngx_array_push(passwords);[m
[31m-        if (pwd == NULL) {[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(pwd, sizeof(ngx_str_t));[m
[31m-    }[m
[31m-[m
[31m-cleanup:[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, ngx_errno,[m
[31m-                           ngx_close_file_n " \"%s\" failed", file->data);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(buf, NGX_SSL_PASSWORD_BUFFER_SIZE);[m
[31m-[m
[31m-    return passwords;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_passwords_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_array_t *passwords = data;[m
[31m-[m
[31m-    ngx_str_t   *pwd;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    pwd = passwords->elts;[m
[31m-[m
[31m-    for (i = 0; i < passwords->nelts; i++) {[m
[31m-        ngx_memzero(pwd[i].data, pwd[i].len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_dhparam(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file)[m
[31m-{[m
[31m-    DH   *dh;[m
[31m-    BIO  *bio;[m
[31m-[m
[31m-    /*[m
[31m-     * -----BEGIN DH PARAMETERS-----[m
[31m-     * MIGHAoGBALu8LcrYRnSQfEP89YDpz9vZWKP1aLQtSwju1OsPs1BMbAMCducQgAxc[m
[31m-     * y7qokiYUxb7spWWl/fHSh6K8BJvmd4Bg6RqSp1fjBI9osHb302zI8pul34HcLKcl[m
[31m-     * 7OZicMyaUDXYzs7vnqAnSmOrHlj6/UmI0PZdFGdX2gcd8EXP4WubAgEC[m
[31m-     * -----END DH PARAMETERS-----[m
[31m-     */[m
[31m-[m
[31m-    static unsigned char dh1024_p[] = {[m
[31m-        0xBB, 0xBC, 0x2D, 0xCA, 0xD8, 0x46, 0x74, 0x90, 0x7C, 0x43, 0xFC, 0xF5,[m
[31m-        0x80, 0xE9, 0xCF, 0xDB, 0xD9, 0x58, 0xA3, 0xF5, 0x68, 0xB4, 0x2D, 0x4B,[m
[31m-        0x08, 0xEE, 0xD4, 0xEB, 0x0F, 0xB3, 0x50, 0x4C, 0x6C, 0x03, 0x02, 0x76,[m
[31m-        0xE7, 0x10, 0x80, 0x0C, 0x5C, 0xCB, 0xBA, 0xA8, 0x92, 0x26, 0x14, 0xC5,[m
[31m-        0xBE, 0xEC, 0xA5, 0x65, 0xA5, 0xFD, 0xF1, 0xD2, 0x87, 0xA2, 0xBC, 0x04,[m
[31m-        0x9B, 0xE6, 0x77, 0x80, 0x60, 0xE9, 0x1A, 0x92, 0xA7, 0x57, 0xE3, 0x04,[m
[31m-        0x8F, 0x68, 0xB0, 0x76, 0xF7, 0xD3, 0x6C, 0xC8, 0xF2, 0x9B, 0xA5, 0xDF,[m
[31m-        0x81, 0xDC, 0x2C, 0xA7, 0x25, 0xEC, 0xE6, 0x62, 0x70, 0xCC, 0x9A, 0x50,[m
[31m-        0x35, 0xD8, 0xCE, 0xCE, 0xEF, 0x9E, 0xA0, 0x27, 0x4A, 0x63, 0xAB, 0x1E,[m
[31m-        0x58, 0xFA, 0xFD, 0x49, 0x88, 0xD0, 0xF6, 0x5D, 0x14, 0x67, 0x57, 0xDA,[m
[31m-        0x07, 0x1D, 0xF0, 0x45, 0xCF, 0xE1, 0x6B, 0x9B[m
[31m-    };[m
[31m-[m
[31m-    static unsigned char dh1024_g[] = { 0x02 };[m
[31m-[m
[31m-[m
[31m-    if (file->len == 0) {[m
[31m-[m
[31m-        dh = DH_new();[m
[31m-        if (dh == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "DH_new() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);[m
[31m-        dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);[m
[31m-[m
[31m-        if (dh->p == NULL || dh->g == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "BN_bin2bn() failed");[m
[31m-            DH_free(dh);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        SSL_CTX_set_tmp_dh(ssl->ctx, dh);[m
[31m-[m
[31m-        DH_free(dh);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_file((char *) file->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", file->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);[m
[31m-    if (dh == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "PEM_read_bio_DHparams(\"%s\") failed", file->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_tmp_dh(ssl->ctx, dh);[m
[31m-[m
[31m-    DH_free(dh);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_ecdh_curve(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *name)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-#ifndef OPENSSL_NO_ECDH[m
[31m-    int      nid;[m
[31m-    EC_KEY  *ecdh;[m
[31m-[m
[31m-    /*[m
[31m-     * Elliptic-Curve Diffie-Hellman parameters are either "named curves"[m
[31m-     * from RFC 4492 section 5.1.1, or explicitly described curves over[m
[31m-     * binary fields. OpenSSL only supports the "named curves", which provide[m
[31m-     * maximum interoperability.[m
[31m-     */[m
[31m-[m
[31m-    nid = OBJ_sn2nid((const char *) name->data);[m
[31m-    if (nid == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "Unknown curve name \"%s\"", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ecdh = EC_KEY_new_by_curve_name(nid);[m
[31m-    if (ecdh == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "Unable to create curve \"%s\"", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_ECDH_USE);[m
[31m-[m
[31m-    SSL_CTX_set_tmp_ecdh(ssl->ctx, ecdh);[m
[31m-[m
[31m-    EC_KEY_free(ecdh);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_ssl_connection_t  *sc;[m
[31m-[m
[31m-    sc = ngx_pcalloc(c->pool, sizeof(ngx_ssl_connection_t));[m
[31m-    if (sc == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sc->buffer = ((flags & NGX_SSL_BUFFER) != 0);[m
[31m-    sc->buffer_size = ssl->buffer_size;[m
[31m-[m
[31m-    sc->session_ctx = ssl->ctx;[m
[31m-[m
[31m-    sc->connection = SSL_new(ssl->ctx);[m
[31m-[m
[31m-    if (sc->connection == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_set_fd(sc->connection, c->fd) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_fd() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_SSL_CLIENT) {[m
[31m-        SSL_set_connect_state(sc->connection);[m
[31m-[m
[31m-    } else {[m
[31m-        SSL_set_accept_state(sc->connection);[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_set_ex_data(sc->connection, ngx_ssl_connection_index, c) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl = sc;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session)[m
[31m-{[m
[31m-    if (session) {[m
[31m-        if (SSL_set_session(c->ssl->connection, session) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_session() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_handshake(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        n, sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    n = SSL_do_handshake(c->ssl->connection);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        char         buf[129], *s, *d;[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10000000L[m
[31m-        const[m
[31m-#endif[m
[31m-        SSL_CIPHER  *cipher;[m
[31m-[m
[31m-        cipher = SSL_get_current_cipher(c->ssl->connection);[m
[31m-[m
[31m-        if (cipher) {[m
[31m-            SSL_CIPHER_description(cipher, &buf[1], 128);[m
[31m-[m
[31m-            for (s = &buf[1], d = buf; *s; s++) {[m
[31m-                if (*s == ' ' && *d == ' ') {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (*s == LF || *s == CR) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                *++d = *s;[m
[31m-            }[m
[31m-[m
[31m-            if (*d != ' ') {[m
[31m-                d++;[m
[31m-            }[m
[31m-[m
[31m-            *d = '\0';[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL: %s, cipher: \"%s\"",[m
[31m-                           SSL_get_version(c->ssl->connection), &buf[1]);[m
[31m-[m
[31m-            if (SSL_session_reused(c->ssl->connection)) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                               "SSL reused session");[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL no shared ciphers");[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c->ssl->handshaked = 1;[m
[31m-[m
[31m-        c->recv = ngx_ssl_recv;[m
[31m-        c->send = ngx_ssl_write;[m
[31m-        c->recv_chain = ngx_ssl_recv_chain;[m
[31m-        c->send_chain = ngx_ssl_send_chain;[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10100000L[m
[31m-#ifdef SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS[m
[31m-[m
[31m-        /* initial handshake done, disable renegotiation (CVE-2009-3555) */[m
[31m-        if (c->ssl->connection->s3) {[m
[31m-            c->ssl->connection->s3->flags |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-        c->read->ready = 0;[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->write->ready = 0;[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10002000L[m
[31m-    if (sslerr == SSL_ERROR_WANT_X509_LOOKUP) {[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-    c->read->eof = 1;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {[m
[31m-        ngx_connection_error(c, err,[m
[31m-                             "peer closed connection in SSL handshake");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->read->error = 1;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_do_handshake() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_handshake_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL handshake handler: %d", ev->write);[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->ssl->handler(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_handshake(c) == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit)[m
[31m-{[m
[31m-    u_char     *last;[m
[31m-    ssize_t     n, bytes, size;[m
[31m-    ngx_buf_t  *b;[m
[31m-[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-    last = b->last;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        size = b->end - last;[m
[31m-[m
[31m-        if (limit) {[m
[31m-            if (bytes >= limit) {[m
[31m-                return bytes;[m
[31m-            }[m
[31m-[m
[31m-            if (bytes + size > limit) {[m
[31m-                size = (ssize_t) (limit - bytes);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_ssl_recv(c, last, size);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            last += n;[m
[31m-            bytes += n;[m
[31m-[m
[31m-            if (last == b->end) {[m
[31m-                cl = cl->next;[m
[31m-[m
[31m-                if (cl == NULL) {[m
[31m-                    return bytes;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-                last = b->last;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bytes) {[m
[31m-[m
[31m-            if (n == 0 || n == NGX_ERROR) {[m
[31m-                c->read->ready = 1;[m
[31m-            }[m
[31m-[m
[31m-            return bytes;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int  n, bytes;[m
[31m-[m
[31m-    if (c->ssl->last == NGX_ERROR) {[m
[31m-        c->read->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (c->ssl->last == NGX_DONE) {[m
[31m-        c->read->ready = 0;[m
[31m-        c->read->eof = 1;[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_read() may return data in parts, so try to read[m
[31m-     * until SSL_read() would return no data[m
[31m-     */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = SSL_read(c->ssl->connection, buf, size);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_read: %d", n);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            bytes += n;[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->last = ngx_ssl_handle_recv(c, n);[m
[31m-[m
[31m-        if (c->ssl->last == NGX_OK) {[m
[31m-[m
[31m-            size -= n;[m
[31m-[m
[31m-            if (size == 0) {[m
[31m-                c->read->ready = 1;[m
[31m-                return bytes;[m
[31m-            }[m
[31m-[m
[31m-            buf += n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bytes) {[m
[31m-            if (c->ssl->last != NGX_AGAIN) {[m
[31m-                c->read->ready = 1;[m
[31m-            }[m
[31m-[m
[31m-            return bytes;[m
[31m-        }[m
[31m-[m
[31m-        switch (c->ssl->last) {[m
[31m-[m
[31m-        case NGX_DONE:[m
[31m-            c->read->ready = 0;[m
[31m-            c->read->eof = 1;[m
[31m-            return 0;[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            c->read->error = 1;[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case NGX_AGAIN:[m
[31m-            return c->ssl->last;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_handle_recv(ngx_connection_t *c, int n)[m
[31m-{[m
[31m-    int        sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (c->ssl->renegotiation) {[m
[31m-        /*[m
[31m-         * disable renegotiation (CVE-2009-3555):[m
[31m-         * OpenSSL (at least up to 0.9.8l) does not handle disabled[m
[31m-         * renegotiation gracefully, so drop connection here[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, c->log, 0, "SSL renegotiation disabled");[m
[31m-[m
[31m-        while (ERR_peek_error()) {[m
[31m-            ngx_ssl_error(NGX_LOG_DEBUG, c->log, 0,[m
[31m-                          "ignoring stale global SSL error");[m
[31m-        }[m
[31m-[m
[31m-        ERR_clear_error();[m
[31m-[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-        c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-[m
[31m-        if (c->ssl->saved_write_handler) {[m
[31m-[m
[31m-            c->write->handler = c->ssl->saved_write_handler;[m
[31m-            c->ssl->saved_write_handler = NULL;[m
[31m-            c->write->ready = 1;[m
[31m-[m
[31m-            if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_post_event(c->write, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-        c->read->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "peer started SSL renegotiation");[m
[31m-[m
[31m-        c->write->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not set the timer because there is already the read event timer[m
[31m-         */[m
[31m-[m
[31m-        if (c->ssl->saved_write_handler == NULL) {[m
[31m-            c->ssl->saved_write_handler = c->write->handler;[m
[31m-            c->write->handler = ngx_ssl_write_handler;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "peer shutdown SSL cleanly");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-[m
[31m-    c->read->handler(c->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * OpenSSL has no SSL_writev() so we copy several bufs into our 16K buffer[m
[31m- * before the SSL_write() call to decrease a SSL overhead.[m
[31m- *[m
[31m- * Besides for protocols such as HTTP it is possible to always buffer[m
[31m- * the output to decrease a SSL overhead some more.[m
[31m- */[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int          n;[m
[31m-    ngx_uint_t   flush;[m
[31m-    ssize_t      send, size;[m
[31m-    ngx_buf_t   *buf;[m
[31m-[m
[31m-    if (!c->ssl->buffer) {[m
[31m-[m
[31m-        while (in) {[m
[31m-            if (ngx_buf_special(in->buf)) {[m
[31m-                in = in->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_ssl_write(c, in->buf->pos, in->buf->last - in->buf->pos);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                return in;[m
[31m-            }[m
[31m-[m
[31m-            in->buf->pos += n;[m
[31m-[m
[31m-            if (in->buf->pos == in->buf->last) {[m
[31m-                in = in->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the maximum limit size is the maximum int32_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_INT32_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_INT32_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    buf = c->ssl->buf;[m
[31m-[m
[31m-    if (buf == NULL) {[m
[31m-        buf = ngx_create_temp_buf(c->pool, c->ssl->buffer_size);[m
[31m-        if (buf == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->buf = buf;[m
[31m-    }[m
[31m-[m
[31m-    if (buf->start == NULL) {[m
[31m-        buf->start = ngx_palloc(c->pool, c->ssl->buffer_size);[m
[31m-        if (buf->start == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf->pos = buf->start;[m
[31m-        buf->last = buf->start;[m
[31m-        buf->end = buf->start + c->ssl->buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    send = buf->last - buf->pos;[m
[31m-    flush = (in == NULL) ? 1 : buf->flush;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        while (in && buf->last < buf->end && send < limit) {[m
[31m-            if (in->buf->last_buf || in->buf->flush) {[m
[31m-                flush = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_special(in->buf)) {[m
[31m-                in = in->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            size = in->buf->last - in->buf->pos;[m
[31m-[m
[31m-            if (size > buf->end - buf->last) {[m
[31m-                size = buf->end - buf->last;[m
[31m-            }[m
[31m-[m
[31m-            if (send + size > limit) {[m
[31m-                size = (ssize_t) (limit - send);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL buf copy: %z", size);[m
[31m-[m
[31m-            ngx_memcpy(buf->last, in->buf->pos, size);[m
[31m-[m
[31m-            buf->last += size;[m
[31m-            in->buf->pos += size;[m
[31m-            send += size;[m
[31m-[m
[31m-            if (in->buf->pos == in->buf->last) {[m
[31m-                in = in->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!flush && send < limit && buf->last < buf->end) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        size = buf->last - buf->pos;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            buf->flush = 0;[m
[31m-            c->buffered &= ~NGX_SSL_BUFFERED;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_ssl_write(c, buf->pos, size);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        buf->pos += n;[m
[31m-[m
[31m-        if (n < size) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        flush = 0;[m
[31m-[m
[31m-        buf->pos = buf->start;[m
[31m-        buf->last = buf->start;[m
[31m-[m
[31m-        if (in == NULL || send == limit) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    buf->flush = flush;[m
[31m-[m
[31m-    if (buf->pos < buf->last) {[m
[31m-        c->buffered |= NGX_SSL_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        c->buffered &= ~NGX_SSL_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size)[m
[31m-{[m
[31m-    int        n, sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL to write: %uz", size);[m
[31m-[m
[31m-    n = SSL_write(c->ssl->connection, data, size);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_write: %d", n);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-[m
[31m-        if (c->ssl->saved_read_handler) {[m
[31m-[m
[31m-            c->read->handler = c->ssl->saved_read_handler;[m
[31m-            c->ssl->saved_read_handler = NULL;[m
[31m-            c->read->ready = 1;[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_post_event(c->read, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        c->sent += n;[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->write->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "peer started SSL renegotiation");[m
[31m-[m
[31m-        c->read->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not set the timer because there is already[m
[31m-         * the write event timer[m
[31m-         */[m
[31m-[m
[31m-        if (c->ssl->saved_read_handler == NULL) {[m
[31m-            c->ssl->saved_read_handler = c->read->handler;[m
[31m-            c->read->handler = ngx_ssl_read_handler;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-    c->write->error = 1;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_write() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->write->handler(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_free_buffer(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (c->ssl->buf && c->ssl->buf->start) {[m
[31m-        if (ngx_pfree(c->pool, c->ssl->buf->start) == NGX_OK) {[m
[31m-            c->ssl->buf->start = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_shutdown(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        n, sslerr, mode;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (SSL_in_init(c->ssl->connection)) {[m
[31m-        /*[m
[31m-         * OpenSSL 1.0.2f complains if SSL_shutdown() is called during[m
[31m-         * an SSL handshake, while previous versions always return 0.[m
[31m-         * Avoid calling SSL_shutdown() if handshake wasn't completed.[m
[31m-         */[m
[31m-[m
[31m-        SSL_free(c->ssl->connection);[m
[31m-        c->ssl = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c->timedout) {[m
[31m-        mode = SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN;[m
[31m-        SSL_set_quiet_shutdown(c->ssl->connection, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        mode = SSL_get_shutdown(c->ssl->connection);[m
[31m-[m
[31m-        if (c->ssl->no_wait_shutdown) {[m
[31m-            mode |= SSL_RECEIVED_SHUTDOWN;[m
[31m-        }[m
[31m-[m
[31m-        if (c->ssl->no_send_shutdown) {[m
[31m-            mode |= SSL_SENT_SHUTDOWN;[m
[31m-        }[m
[31m-[m
[31m-        if (c->ssl->no_wait_shutdown && c->ssl->no_send_shutdown) {[m
[31m-            SSL_set_quiet_shutdown(c->ssl->connection, 1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    SSL_set_shutdown(c->ssl->connection, mode);[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    n = SSL_shutdown(c->ssl->connection);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_shutdown: %d", n);[m
[31m-[m
[31m-    sslerr = 0;[m
[31m-[m
[31m-    /* before 0.9.8m SSL_shutdown() returned 0 instead of -1 on errors */[m
[31m-[m
[31m-    if (n != 1 && ERR_peek_error()) {[m
[31m-        sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL_get_error: %d", sslerr);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1 || sslerr == 0 || sslerr == SSL_ERROR_ZERO_RETURN) {[m
[31m-        SSL_free(c->ssl->connection);[m
[31m-        c->ssl = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ || sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->read->handler = ngx_ssl_shutdown_handler;[m
[31m-        c->write->handler = ngx_ssl_shutdown_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-            ngx_add_timer(c->read, 30000);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_shutdown() failed");[m
[31m-[m
[31m-    SSL_free(c->ssl->connection);[m
[31m-    c->ssl = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_shutdown_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_connection_handler_pt   handler;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    handler = c->ssl->handler;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "SSL shutdown handler");[m
[31m-[m
[31m-    if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_connection_error(ngx_connection_t *c, int sslerr, ngx_err_t err,[m
[31m-    char *text)[m
[31m-{[m
[31m-    int         n;[m
[31m-    ngx_uint_t  level;[m
[31m-[m
[31m-    level = NGX_LOG_CRIT;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_SYSCALL) {[m
[31m-[m
[31m-        if (err == NGX_ECONNRESET[m
[31m-            || err == NGX_EPIPE[m
[31m-            || err == NGX_ENOTCONN[m
[31m-            || err == NGX_ETIMEDOUT[m
[31m-            || err == NGX_ECONNREFUSED[m
[31m-            || err == NGX_ENETDOWN[m
[31m-            || err == NGX_ENETUNREACH[m
[31m-            || err == NGX_EHOSTDOWN[m
[31m-            || err == NGX_EHOSTUNREACH)[m
[31m-        {[m
[31m-            switch (c->log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else if (sslerr == SSL_ERROR_SSL) {[m
[31m-[m
[31m-        n = ERR_GET_REASON(ERR_peek_error());[m
[31m-[m
[31m-            /* handshake failures */[m
[31m-        if (n == SSL_R_BAD_CHANGE_CIPHER_SPEC                        /*  103 */[m
[31m-            || n == SSL_R_BLOCK_CIPHER_PAD_IS_WRONG                  /*  129 */[m
[31m-            || n == SSL_R_DIGEST_CHECK_FAILED                        /*  149 */[m
[31m-            || n == SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST              /*  151 */[m
[31m-            || n == SSL_R_EXCESSIVE_MESSAGE_SIZE                     /*  152 */[m
[31m-            || n == SSL_R_LENGTH_MISMATCH                            /*  159 */[m
[31m-            || n == SSL_R_NO_CIPHERS_PASSED                          /*  182 */[m
[31m-            || n == SSL_R_NO_CIPHERS_SPECIFIED                       /*  183 */[m
[31m-            || n == SSL_R_NO_COMPRESSION_SPECIFIED                   /*  187 */[m
[31m-            || n == SSL_R_NO_SHARED_CIPHER                           /*  193 */[m
[31m-            || n == SSL_R_RECORD_LENGTH_MISMATCH                     /*  213 */[m
[31m-#ifdef SSL_R_PARSE_TLSEXT[m
[31m-            || n == SSL_R_PARSE_TLSEXT                               /*  227 */[m
[31m-#endif[m
[31m-            || n == SSL_R_UNEXPECTED_MESSAGE                         /*  244 */[m
[31m-            || n == SSL_R_UNEXPECTED_RECORD                          /*  245 */[m
[31m-            || n == SSL_R_UNKNOWN_ALERT_TYPE                         /*  246 */[m
[31m-            || n == SSL_R_UNKNOWN_PROTOCOL                           /*  252 */[m
[31m-            || n == SSL_R_WRONG_VERSION_NUMBER                       /*  267 */[m
[31m-            || n == SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC        /*  281 */[m
[31m-#ifdef SSL_R_RENEGOTIATE_EXT_TOO_LONG[m
[31m-            || n == SSL_R_RENEGOTIATE_EXT_TOO_LONG                   /*  335 */[m
[31m-            || n == SSL_R_RENEGOTIATION_ENCODING_ERR                 /*  336 */[m
[31m-            || n == SSL_R_RENEGOTIATION_MISMATCH                     /*  337 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED[m
[31m-            || n == SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED       /*  338 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING[m
[31m-            || n == SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING           /*  345 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_INAPPROPRIATE_FALLBACK[m
[31m-            || n == SSL_R_INAPPROPRIATE_FALLBACK                     /*  373 */[m
[31m-#endif[m
[31m-            || n == 1000 /* SSL_R_SSLV3_ALERT_CLOSE_NOTIFY */[m
[31m-#ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE[m
[31m-            || n == SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE             /* 1010 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_BAD_RECORD_MAC                 /* 1020 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECRYPTION_FAILED              /* 1021 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_RECORD_OVERFLOW                /* 1022 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE          /* 1030 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE              /* 1040 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_NO_CERTIFICATE                 /* 1041 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_BAD_CERTIFICATE                /* 1042 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE        /* 1043 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED            /* 1044 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED            /* 1045 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN            /* 1046 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER              /* 1047 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_UNKNOWN_CA                     /* 1048 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_ACCESS_DENIED                  /* 1049 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECODE_ERROR                   /* 1050 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECRYPT_ERROR                  /* 1051 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION             /* 1060 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_PROTOCOL_VERSION               /* 1070 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY          /* 1071 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_INTERNAL_ERROR                 /* 1080 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_USER_CANCELLED                 /* 1090 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_NO_RENEGOTIATION               /* 1100 */[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            switch (c->log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_error(level, c->log, err, text);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_clear_error(ngx_log_t *log)[m
[31m-{[m
[31m-    while (ERR_peek_error()) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0, "ignoring stale global SSL error");[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_ssl_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, char *fmt, ...)[m
[31m-{[m
[31m-    int          flags;[m
[31m-    u_long       n;[m
[31m-    va_list      args;[m
[31m-    u_char      *p, *last;[m
[31m-    u_char       errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    const char  *data;[m
[31m-[m
[31m-    last = errstr + NGX_MAX_CONF_ERRSTR;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(errstr, last - 1, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    p = ngx_cpystrn(p, (u_char *) " (SSL:", last - p);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = ERR_peek_error_line_data(NULL, NULL, &data, &flags);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (p >= last) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        *p++ = ' ';[m
[31m-[m
[31m-        ERR_error_string_n(n, (char *) p, last - p);[m
[31m-[m
[31m-        while (p < last && *p) {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (p < last && *data && (flags & ERR_TXT_STRING)) {[m
[31m-            *p++ = ':';[m
[31m-            p = ngx_cpystrn(p, (u_char *) data, last - p);[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        (void) ERR_get_error();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, log, err, "%*s)", p - errstr, errstr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx,[m
[31m-    ssize_t builtin_session_cache, ngx_shm_zone_t *shm_zone, time_t timeout)[m
[31m-{[m
[31m-    long  cache_mode;[m
[31m-[m
[31m-    SSL_CTX_set_timeout(ssl->ctx, (long) timeout);[m
[31m-[m
[31m-    if (ngx_ssl_session_id_context(ssl, sess_ctx) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (builtin_session_cache == NGX_SSL_NO_SCACHE) {[m
[31m-        SSL_CTX_set_session_cache_mode(ssl->ctx, SSL_SESS_CACHE_OFF);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (builtin_session_cache == NGX_SSL_NONE_SCACHE) {[m
[31m-[m
[31m-        /*[m
[31m-         * If the server explicitly says that it does not support[m
[31m-         * session reuse (see SSL_SESS_CACHE_OFF above), then[m
[31m-         * Outlook Express fails to upload a sent email to[m
[31m-         * the Sent Items folder on the IMAP server via a separate IMAP[m
[31m-         * connection in the background. Therefore we have a special[m
[31m-         * mode (SSL_SESS_CACHE_SERVER|SSL_SESS_CACHE_NO_INTERNAL_STORE)[m
[31m-         * where the server pretends that it supports session reuse,[m
[31m-         * but it does not actually store any session.[m
[31m-         */[m
[31m-[m
[31m-        SSL_CTX_set_session_cache_mode(ssl->ctx,[m
[31m-                                       SSL_SESS_CACHE_SERVER[m
[31m-                                       |SSL_SESS_CACHE_NO_AUTO_CLEAR[m
[31m-                                       |SSL_SESS_CACHE_NO_INTERNAL_STORE);[m
[31m-[m
[31m-        SSL_CTX_sess_set_cache_size(ssl->ctx, 1);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache_mode = SSL_SESS_CACHE_SERVER;[m
[31m-[m
[31m-    if (shm_zone && builtin_session_cache == NGX_SSL_NO_BUILTIN_SCACHE) {[m
[31m-        cache_mode |= SSL_SESS_CACHE_NO_INTERNAL;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_session_cache_mode(ssl->ctx, cache_mode);[m
[31m-[m
[31m-    if (builtin_session_cache != NGX_SSL_NO_BUILTIN_SCACHE) {[m
[31m-[m
[31m-        if (builtin_session_cache != NGX_SSL_DFLT_BUILTIN_SCACHE) {[m
[31m-            SSL_CTX_sess_set_cache_size(ssl->ctx, builtin_session_cache);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone) {[m
[31m-        SSL_CTX_sess_set_new_cb(ssl->ctx, ngx_ssl_new_session);[m
[31m-        SSL_CTX_sess_set_get_cb(ssl->ctx, ngx_ssl_get_cached_session);[m
[31m-        SSL_CTX_sess_set_remove_cb(ssl->ctx, ngx_ssl_remove_session);[m
[31m-[m
[31m-        if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_cache_index, shm_zone)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_set_ex_data() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_session_id_context(ngx_ssl_t *ssl, ngx_str_t *sess_ctx)[m
[31m-{[m
[31m-    int                   n, i;[m
[31m-    X509                 *cert;[m
[31m-    X509_NAME            *name;[m
[31m-    EVP_MD_CTX           *md;[m
[31m-    unsigned int          len;[m
[31m-    STACK_OF(X509_NAME)  *list;[m
[31m-    u_char                buf[EVP_MAX_MD_SIZE];[m
[31m-[m
[31m-    /*[m
[31m-     * Session ID context is set based on the string provided,[m
[31m-     * the server certificate, and the client CA list.[m
[31m-     */[m
[31m-[m
[31m-    md = EVP_MD_CTX_create();[m
[31m-    if (md == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestInit_ex(md, EVP_sha1(), NULL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestInit_ex() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestUpdate(md, sess_ctx->data, sess_ctx->len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cert = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_certificate_index);[m
[31m-[m
[31m-    if (X509_digest(cert, EVP_sha1(), buf, &len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_digest() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestUpdate(md, buf, len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    list = SSL_CTX_get_client_CA_list(ssl->ctx);[m
[31m-[m
[31m-    if (list != NULL) {[m
[31m-        n = sk_X509_NAME_num(list);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            name = sk_X509_NAME_value(list, i);[m
[31m-[m
[31m-            if (X509_NAME_digest(name, EVP_sha1(), buf, &len) == 0) {[m
[31m-                ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                              "X509_NAME_digest() failed");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (EVP_DigestUpdate(md, buf, len) == 0) {[m
[31m-                ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                              "EVP_DigestUpdate() failed");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestFinal_ex(md, buf, &len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    EVP_MD_CTX_destroy(md);[m
[31m-[m
[31m-    if (SSL_CTX_set_session_id_context(ssl->ctx, buf, len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_session_id_context() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    EVP_MD_CTX_destroy(md);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    size_t                    len;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-[m
[31m-    if (data) {[m
[31m-        shm_zone->data = data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        shm_zone->data = shpool->data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache = ngx_slab_alloc(shpool, sizeof(ngx_ssl_session_cache_t));[m
[31m-    if (cache == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shpool->data = cache;[m
[31m-    shm_zone->data = cache;[m
[31m-[m
[31m-    ngx_rbtree_init(&cache->session_rbtree, &cache->sentinel,[m
[31m-                    ngx_ssl_session_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&cache->expire_queue);[m
[31m-[m
[31m-    len = sizeof(" in SSL session shared cache \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in SSL session shared cache \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    shpool->log_nomem = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The length of the session id is 16 bytes for SSLv2 sessions and[m
[31m- * between 1 and 32 bytes for SSLv3/TLSv1, typically 32 bytes.[m
[31m- * It seems that the typical length of the external ASN1 representation[m
[31m- * of a session is 118 or 119 bytes for SSLv3/TSLv1.[m
[31m- *[m
[31m- * Thus on 32-bit platforms we allocate separately an rbtree node,[m
[31m- * a session id, and an ASN1 representation, they take accordingly[m
[31m- * 64, 32, and 128 bytes.[m
[31m- *[m
[31m- * On 64-bit platforms we allocate separately an rbtree node + session_id,[m
[31m- * and an ASN1 representation, they take accordingly 128 and 128 bytes.[m
[31m- *[m
[31m- * OpenSSL's i2d_SSL_SESSION() and d2i_SSL_SESSION are slow,[m
[31m- * so they are outside the code locked by shared pool mutex[m
[31m- */[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    int                       len;[m
[31m-    u_char                   *p, *id, *cached_sess, *session_id;[m
[31m-    uint32_t                  hash;[m
[31m-    SSL_CTX                  *ssl_ctx;[m
[31m-    unsigned int              session_id_length;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_connection_t         *c;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-    u_char                    buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-[m
[31m-    len = i2d_SSL_SESSION(sess, NULL);[m
[31m-[m
[31m-    /* do not cache too big session */[m
[31m-[m
[31m-    if (len > (int) NGX_SSL_MAX_SESSION_SIZE) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    p = buf;[m
[31m-    i2d_SSL_SESSION(sess, &p);[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ssl_ctx = c->ssl->session_ctx;[m
[31m-    shm_zone = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    /* drop one or two expired sessions */[m
[31m-    ngx_ssl_expire_sessions(cache, shpool, 1);[m
[31m-[m
[31m-    cached_sess = ngx_slab_alloc_locked(shpool, len);[m
[31m-[m
[31m-    if (cached_sess == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        cached_sess = ngx_slab_alloc_locked(shpool, len);[m
[31m-[m
[31m-        if (cached_sess == NULL) {[m
[31m-            sess_id = NULL;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));[m
[31m-[m
[31m-    if (sess_id == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));[m
[31m-[m
[31m-        if (sess_id == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    session_id = (u_char *) SSL_SESSION_get_id(sess, &session_id_length);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    session_id = sess->session_id;[m
[31m-    session_id_length = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-    id = sess_id->sess_id;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    id = ngx_slab_alloc_locked(shpool, session_id_length);[m
[31m-[m
[31m-    if (id == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        id = ngx_slab_alloc_locked(shpool, session_id_length);[m
[31m-[m
[31m-        if (id == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memcpy(cached_sess, buf, len);[m
[31m-[m
[31m-    ngx_memcpy(id, session_id, session_id_length);[m
[31m-[m
[31m-    hash = ngx_crc32_short(session_id, session_id_length);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "ssl new session: %08XD:%ud:%d",[m
[31m-                   hash, session_id_length, len);[m
[31m-[m
[31m-    sess_id->node.key = hash;[m
[31m-    sess_id->node.data = (u_char) session_id_length;[m
[31m-    sess_id->id = id;[m
[31m-    sess_id->len = len;[m
[31m-    sess_id->session = cached_sess;[m
[31m-[m
[31m-    sess_id->expire = ngx_time() + SSL_CTX_get_timeout(ssl_ctx);[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->expire_queue, &sess_id->queue);[m
[31m-[m
[31m-    ngx_rbtree_insert(&cache->session_rbtree, &sess_id->node);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (cached_sess) {[m
[31m-        ngx_slab_free_locked(shpool, cached_sess);[m
[31m-    }[m
[31m-[m
[31m-    if (sess_id) {[m
[31m-        ngx_slab_free_locked(shpool, sess_id);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                  "could not allocate new session%s", shpool->log_ctx);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_ssl_session_t *[m
[31m-ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char *id, int len, int *copy)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                   *p;[m
[31m-    uint32_t                  hash;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_rbtree_node_t        *node, *sentinel;[m
[31m-    ngx_ssl_session_t        *sess;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-    u_char                    buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-    ngx_connection_t         *c;[m
[31m-[m
[31m-    hash = ngx_crc32_short((u_char *) (uintptr_t) id, (size_t) len);[m
[31m-    *copy = 0;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "ssl get session: %08XD:%d", hash, len);[m
[31m-[m
[31m-    shm_zone = SSL_CTX_get_ex_data(c->ssl->session_ctx,[m
[31m-                                   ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-    sess = NULL;[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    node = cache->session_rbtree.root;[m
[31m-    sentinel = cache->session_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-[m
[31m-        rc = ngx_memn2cmp((u_char *) (uintptr_t) id, sess_id->id,[m
[31m-                          (size_t) len, (size_t) node->data);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-[m
[31m-            if (sess_id->expire > ngx_time()) {[m
[31m-                ngx_memcpy(buf, sess_id->session, sess_id->len);[m
[31m-[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-                p = buf;[m
[31m-                sess = d2i_SSL_SESSION(NULL, &p, sess_id->len);[m
[31m-[m
[31m-                return sess;[m
[31m-            }[m
[31m-[m
[31m-            ngx_queue_remove(&sess_id->queue);[m
[31m-[m
[31m-            ngx_rbtree_delete(&cache->session_rbtree, node);[m
[31m-[m
[31m-            ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-            ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-            ngx_slab_free_locked(shpool, sess_id);[m
[31m-[m
[31m-            sess = NULL;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    return sess;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_remove_cached_session(SSL_CTX *ssl, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    SSL_CTX_remove_session(ssl, sess);[m
[31m-[m
[31m-    ngx_ssl_remove_session(ssl, sess);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    u_char                   *id;[m
[31m-    uint32_t                  hash;[m
[31m-    ngx_int_t                 rc;[m
[31m-    unsigned int              len;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_rbtree_node_t        *node, *sentinel;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-[m
[31m-    shm_zone = SSL_CTX_get_ex_data(ssl, ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    id = (u_char *) SSL_SESSION_get_id(sess, &len);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    id = sess->session_id;[m
[31m-    len = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    hash = ngx_crc32_short(id, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                   "ssl remove session: %08XD:%ud", hash, len);[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    node = cache->session_rbtree.root;[m
[31m-    sentinel = cache->session_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(id, sess_id->id, len, (size_t) node->data);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-[m
[31m-            ngx_queue_remove(&sess_id->queue);[m
[31m-[m
[31m-            ngx_rbtree_delete(&cache->session_rbtree, node);[m
[31m-[m
[31m-            ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-            ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-            ngx_slab_free_locked(shpool, sess_id);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache,[m
[31m-    ngx_slab_pool_t *shpool, ngx_uint_t n)[m
[31m-{[m
[31m-    time_t              now;[m
[31m-    ngx_queue_t        *q;[m
[31m-    ngx_ssl_sess_id_t  *sess_id;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->expire_queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->expire_queue);[m
[31m-[m
[31m-        sess_id = ngx_queue_data(q, ngx_ssl_sess_id_t, queue);[m
[31m-[m
[31m-        if (n++ != 0 && sess_id->expire > now) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                       "expire session: %08Xi", sess_id->node.key);[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->session_rbtree, &sess_id->node);[m
[31m-[m
[31m-        ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-        ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-        ngx_slab_free_locked(shpool, sess_id);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-    ngx_ssl_sess_id_t   *sess_id, *sess_id_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-            sess_id_temp = (ngx_ssl_sess_id_t *) temp;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(sess_id->id, sess_id_temp->id,[m
[31m-                              (size_t) node->data, (size_t) temp->data)[m
[31m-                 < 0) ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths)[m
[31m-{[m
[31m-    u_char                         buf[48];[m
[31m-    ssize_t                        n;[m
[31m-    ngx_str_t                     *path;[m
[31m-    ngx_file_t                     file;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_array_t                   *keys;[m
[31m-    ngx_file_info_t                fi;[m
[31m-    ngx_ssl_session_ticket_key_t  *key;[m
[31m-[m
[31m-    if (paths == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    keys = ngx_array_create(cf->pool, paths->nelts,[m
[31m-                            sizeof(ngx_ssl_session_ticket_key_t));[m
[31m-    if (keys == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    path = paths->elts;[m
[31m-    for (i = 0; i < paths->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_conf_full_name(cf->cycle, &path[i], 1) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-        file.name = path[i];[m
[31m-        file.log = cf->log;[m
[31m-[m
[31m-        file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, 0, 0);[m
[31m-        if (file.fd == NGX_INVALID_FILE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_open_file_n " \"%V\" failed", &file.name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                               ngx_fd_info_n " \"%V\" failed", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_file_size(&fi) != 48) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" must be 48 bytes", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_read_file(&file, buf, 48, 0);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                               ngx_read_file_n " \"%V\" failed", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (n != 48) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, 0,[m
[31m-                               ngx_read_file_n " \"%V\" returned only "[m
[31m-                               "%z bytes instead of 48", &file.name, n);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        key = ngx_array_push(keys);[m
[31m-        if (key == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(key->name, buf, 16);[m
[31m-        ngx_memcpy(key->aes_key, buf + 16, 16);[m
[31m-        ngx_memcpy(key->hmac_key, buf + 32, 16);[m
[31m-[m
[31m-        if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", &file.name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_ticket_keys_index, keys)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_tlsext_ticket_key_cb(ssl->ctx,[m
[31m-                                         ngx_ssl_session_ticket_key_callback)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "nginx was built with Session Tickets support, however, "[m
[31m-                      "now it is linked dynamically to an OpenSSL library "[m
[31m-                      "which has no tlsext support, therefore Session Tickets "[m
[31m-                      "are not available");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%V\" failed", &file.name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef OPENSSL_NO_SHA256[m
[31m-#define ngx_ssl_session_ticket_md  EVP_sha1[m
[31m-#else[m
[31m-#define ngx_ssl_session_ticket_md  EVP_sha256[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_session_ticket_key_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx,[m
[31m-    HMAC_CTX *hctx, int enc)[m
[31m-{[m
[31m-    SSL_CTX                       *ssl_ctx;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_array_t                   *keys;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_ssl_session_ticket_key_t  *key;[m
[31m-#if (NGX_DEBUG)[m
[31m-    u_char                         buf[32];[m
[31m-#endif[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-    ssl_ctx = c->ssl->session_ctx;[m
[31m-[m
[31m-    keys = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_ticket_keys_index);[m
[31m-    if (keys == NULL) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    key = keys->elts;[m
[31m-[m
[31m-    if (enc == 1) {[m
[31m-        /* encrypt session ticket */[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket encrypt, key: \"%*s\" (%s session)",[m
[31m-                       ngx_hex_dump(buf, key[0].name, 16) - buf, buf,[m
[31m-                       SSL_session_reused(ssl_conn) ? "reused" : "new");[m
[31m-[m
[31m-        RAND_bytes(iv, 16);[m
[31m-        EVP_EncryptInit_ex(ectx, EVP_aes_128_cbc(), NULL, key[0].aes_key, iv);[m
[31m-        HMAC_Init_ex(hctx, key[0].hmac_key, 16,[m
[31m-                     ngx_ssl_session_ticket_md(), NULL);[m
[31m-        ngx_memcpy(name, key[0].name, 16);[m
[31m-[m
[31m-        return 0;[m
[31m-[m
[31m-    } else {[m
[31m-        /* decrypt session ticket */[m
[31m-[m
[31m-        for (i = 0; i < keys->nelts; i++) {[m
[31m-            if (ngx_memcmp(name, key[i].name, 16) == 0) {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket decrypt, key: \"%*s\" not found",[m
[31m-                       ngx_hex_dump(buf, name, 16) - buf, buf);[m
[31m-[m
[31m-        return 0;[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket decrypt, key: \"%*s\"%s",[m
[31m-                       ngx_hex_dump(buf, key[i].name, 16) - buf, buf,[m
[31m-                       (i == 0) ? " (default)" : "");[m
[31m-[m
[31m-        HMAC_Init_ex(hctx, key[i].hmac_key, 16,[m
[31m-                     ngx_ssl_session_ticket_md(), NULL);[m
[31m-        EVP_DecryptInit_ex(ectx, EVP_aes_128_cbc(), NULL, key[i].aes_key, iv);[m
[31m-[m
[31m-        return (i == 0) ? 1 : 2 /* renew */;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths)[m
[31m-{[m
[31m-    if (paths) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                      "\"ssl_session_ticket_keys\" ignored, not supported");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_cleanup_ctx(void *data)[m
[31m-{[m
[31m-    ngx_ssl_t  *ssl = data;[m
[31m-[m
[31m-    SSL_CTX_free(ssl->ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_check_host(ngx_connection_t *c, ngx_str_t *name)[m
[31m-{[m
[31m-    X509   *cert;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10002002L[m
[31m-[m
[31m-    /* X509_check_host() is only available in OpenSSL 1.0.2+ */[m
[31m-[m
[31m-    if (name->len == 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_check_host(cert, (char *) name->data, name->len, 0, NULL) != 1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "X509_check_host(): no match");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "X509_check_host(): match");[m
[31m-[m
[31m-    goto found;[m
[31m-[m
[31m-#else[m
[31m-    {[m
[31m-    int                      n, i;[m
[31m-    X509_NAME               *sname;[m
[31m-    ASN1_STRING             *str;[m
[31m-    X509_NAME_ENTRY         *entry;[m
[31m-    GENERAL_NAME            *altname;[m
[31m-    STACK_OF(GENERAL_NAME)  *altnames;[m
[31m-[m
[31m-    /*[m
[31m-     * As per RFC6125 and RFC2818, we check subjectAltName extension,[m
[31m-     * and if it's not present - commonName in Subject is checked.[m
[31m-     */[m
[31m-[m
[31m-    altnames = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);[m
[31m-[m
[31m-    if (altnames) {[m
[31m-        n = sk_GENERAL_NAME_num(altnames);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            altname = sk_GENERAL_NAME_value(altnames, i);[m
[31m-[m
[31m-            if (altname->type != GEN_DNS) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            str = altname->d.dNSName;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL subjectAltName: \"%*s\"",[m
[31m-                           ASN1_STRING_length(str), ASN1_STRING_data(str));[m
[31m-[m
[31m-            if (ngx_ssl_check_name(name, str) == NGX_OK) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                               "SSL subjectAltName: match");[m
[31m-                GENERAL_NAMES_free(altnames);[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL subjectAltName: no match");[m
[31m-[m
[31m-        GENERAL_NAMES_free(altnames);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * If there is no subjectAltName extension, check commonName[m
[31m-     * in Subject.  While RFC2818 requires to only check "most specific"[m
[31m-     * CN, both Apache and OpenSSL check all CNs, and so do we.[m
[31m-     */[m
[31m-[m
[31m-    sname = X509_get_subject_name(cert);[m
[31m-[m
[31m-    if (sname == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    i = -1;[m
[31m-    for ( ;; ) {[m
[31m-        i = X509_NAME_get_index_by_NID(sname, NID_commonName, i);[m
[31m-[m
[31m-        if (i < 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        entry = X509_NAME_get_entry(sname, i);[m
[31m-        str = X509_NAME_ENTRY_get_data(entry);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL commonName: \"%*s\"",[m
[31m-                       ASN1_STRING_length(str), ASN1_STRING_data(str));[m
[31m-[m
[31m-        if (ngx_ssl_check_name(name, str) == NGX_OK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL commonName: match");[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL commonName: no match");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10002002L[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *pattern)[m
[31m-{[m
[31m-    u_char  *s, *p, *end;[m
[31m-    size_t   slen, plen;[m
[31m-[m
[31m-    s = name->data;[m
[31m-    slen = name->len;[m
[31m-[m
[31m-    p = ASN1_STRING_data(pattern);[m
[31m-    plen = ASN1_STRING_length(pattern);[m
[31m-[m
[31m-    if (slen == plen && ngx_strncasecmp(s, p, plen) == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (plen > 2 && p[0] == '*' && p[1] == '.') {[m
[31m-        plen -= 1;[m
[31m-        p += 1;[m
[31m-[m
[31m-        end = s + slen;[m
[31m-        s = ngx_strlchr(s, end, '.');[m
[31m-[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        slen = end - s;[m
[31m-[m
[31m-        if (plen == slen && ngx_strncasecmp(s, p, plen) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_protocol(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    s->data = (u_char *) SSL_get_version(c->ssl->connection);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_cipher_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    s->data = (u_char *) SSL_get_cipher_name(c->ssl->connection);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_session_id(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    u_char        *buf;[m
[31m-    SSL_SESSION   *sess;[m
[31m-    unsigned int   len;[m
[31m-[m
[31m-    sess = SSL_get0_session(c->ssl->connection);[m
[31m-    if (sess == NULL) {[m
[31m-        s->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    buf = (u_char *) SSL_SESSION_get_id(sess, &len);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    buf = sess->session_id;[m
[31m-    len = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->len = 2 * len;[m
[31m-    s->data = ngx_pnalloc(pool, 2 * len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(s->data, buf, len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_session_reused(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    if (SSL_session_reused(c->ssl->connection)) {[m
[31m-        ngx_str_set(s, "r");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(s, ".");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    const char  *servername;[m
[31m-[m
[31m-    servername = SSL_get_servername(c->ssl->connection,[m
[31m-                                    TLSEXT_NAMETYPE_host_name);[m
[31m-    if (servername) {[m
[31m-        s->data = (u_char *) servername;[m
[31m-        s->len = ngx_strlen(servername);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->len = 0;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_raw_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    BIO     *bio;[m
[31m-    X509    *cert;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed");[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PEM_write_bio_X509(bio, cert) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "PEM_write_bio_X509() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = BIO_pending(bio);[m
[31m-    s->len = len;[m
[31m-[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    BIO_read(bio, s->data, len);[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    size_t       len;[m
[31m-    ngx_uint_t   i;[m
[31m-    ngx_str_t    cert;[m
[31m-[m
[31m-    if (ngx_ssl_get_raw_certificate(c, pool, &cert) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cert.len == 0) {[m
[31m-        s->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = cert.len - 1;[m
[31m-[m
[31m-    for (i = 0; i < cert.len - 1; i++) {[m
[31m-        if (cert.data[i] == LF) {[m
[31m-            len++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = s->data;[m
[31m-[m
[31m-    for (i = 0; i < cert.len - 1; i++) {[m
[31m-        *p++ = cert.data[i];[m
[31m-        if (cert.data[i] == LF) {[m
[31m-            *p++ = '\t';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    char       *p;[m
[31m-    size_t      len;[m
[31m-    X509       *cert;[m
[31m-    X509_NAME  *name;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    name = X509_get_subject_name(cert);[m
[31m-    if (name == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = X509_NAME_oneline(name, NULL, 0);[m
[31m-[m
[31m-    for (len = 0; p[len]; len++) { /* void */ }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        OPENSSL_free(p);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    OPENSSL_free(p);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    char       *p;[m
[31m-    size_t      len;[m
[31m-    X509       *cert;[m
[31m-    X509_NAME  *name;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    name = X509_get_issuer_name(cert);[m
[31m-    if (name == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = X509_NAME_oneline(name, NULL, 0);[m
[31m-[m
[31m-    for (len = 0; p[len]; len++) { /* void */ }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        OPENSSL_free(p);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    OPENSSL_free(p);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    X509    *cert;[m
[31m-    BIO     *bio;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    i2a_ASN1_INTEGER(bio, X509_get_serialNumber(cert));[m
[31m-    len = BIO_pending(bio);[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        BIO_free(bio);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    BIO_read(bio, s->data, len);[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    X509          *cert;[m
[31m-    unsigned int   len;[m
[31m-    u_char         buf[EVP_MAX_MD_SIZE];[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!X509_digest(cert, EVP_sha1(), buf, &len)) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->len = 2 * len;[m
[31m-    s->data = ngx_pnalloc(pool, 2 * len);[m
[31m-    if (s->data == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(s->data, buf, len);[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    X509  *cert;[m
[31m-[m
[31m-    if (SSL_get_verify_result(c->ssl->connection) != X509_V_OK) {[m
[31m-        ngx_str_set(s, "FAILED");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-    if (cert) {[m
[31m-        ngx_str_set(s, "SUCCESS");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(s, "NONE");[m
[31m-    }[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_openssl_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_openssl_conf_t  *oscf;[m
[31m-[m
[31m-    oscf = ngx_pcalloc(cycle->pool, sizeof(ngx_openssl_conf_t));[m
[31m-    if (oscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     oscf->engine = 0;[m
[31m-     */[m
[31m-[m
[31m-    return oscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-[m
[31m-    ngx_openssl_conf_t *oscf = conf;[m
[31m-[m
[31m-    ENGINE     *engine;[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (oscf->engine) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    oscf->engine = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    engine = ENGINE_by_id((const char *) value[1].data);[m
[31m-[m
[31m-    if (engine == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "ENGINE_by_id(\"%V\") failed", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ENGINE_set_default(engine, ENGINE_METHOD_ALL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "ENGINE_set_default(\"%V\", ENGINE_METHOD_ALL) failed",[m
[31m-                      &value[1]);[m
[31m-[m
[31m-        ENGINE_free(engine);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ENGINE_free(engine);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    return "is not supported";[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_openssl_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10100003L[m
[31m-[m
[31m-    EVP_cleanup();[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-    ENGINE_cleanup();[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.c.orig[m
[1mdeleted file mode 100644[m
[1mindex de10296..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,3570 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_PASSWORD_BUFFER_SIZE  4096[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  engine;   /* unsigned  engine:1; */[m
[31m-} ngx_openssl_conf_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_ssl_password_callback(char *buf, int size, int rwflag,[m
[31m-    void *userdata);[m
[31m-static int ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store);[m
[31m-static void ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where,[m
[31m-    int ret);[m
[31m-static void ngx_ssl_passwords_cleanup(void *data);[m
[31m-static void ngx_ssl_handshake_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n);[m
[31m-static void ngx_ssl_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_ssl_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_ssl_shutdown_handler(ngx_event_t *ev);[m
[31m-static void ngx_ssl_connection_error(ngx_connection_t *c, int sslerr,[m
[31m-    ngx_err_t err, char *text);[m
[31m-static void ngx_ssl_clear_error(ngx_log_t *log);[m
[31m-[m
[31m-static ngx_int_t ngx_ssl_session_id_context(ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *sess_ctx);[m
[31m-ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data);[m
[31m-static int ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-    ngx_ssl_session_t *sess);[m
[31m-static ngx_ssl_session_t *ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char *id, int len, int *copy);[m
[31m-static void ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess);[m
[31m-static void ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache,[m
[31m-    ngx_slab_pool_t *shpool, ngx_uint_t n);[m
[31m-static void ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-static int ngx_ssl_session_ticket_key_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx,[m
[31m-    HMAC_CTX *hctx, int enc);[m
[31m-#endif[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10002002L[m
[31m-static ngx_int_t ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *str);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_openssl_create_conf(ngx_cycle_t *cycle);[m
[31m-static char *ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void ngx_openssl_exit(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_openssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl_engine"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_openssl_engine,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_openssl_module_ctx = {[m
[31m-    ngx_string("openssl"),[m
[31m-    ngx_openssl_create_conf,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_openssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_openssl_module_ctx,               /* module context */[m
[31m-    ngx_openssl_commands,                  /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    ngx_openssl_exit,                      /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-int  ngx_ssl_connection_index;[m
[31m-int  ngx_ssl_server_conf_index;[m
[31m-int  ngx_ssl_session_cache_index;[m
[31m-int  ngx_ssl_session_ticket_keys_index;[m
[31m-int  ngx_ssl_certificate_index;[m
[31m-int  ngx_ssl_stapling_index;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_init(ngx_log_t *log)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-[m
[31m-    OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG, NULL);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#ifndef OPENSSL_IS_BORINGSSL[m
[31m-    OPENSSL_config(NULL);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_library_init();[m
[31m-    SSL_load_error_strings();[m
[31m-[m
[31m-    OpenSSL_add_all_algorithms();[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-#ifndef SSL_OP_NO_COMPRESSION[m
[31m-    {[m
[31m-    /*[m
[31m-     * Disable gzip compression in OpenSSL prior to 1.0.0 version,[m
[31m-     * this saves about 522K per connection.[m
[31m-     */[m
[31m-    int                  n;[m
[31m-    STACK_OF(SSL_COMP)  *ssl_comp_methods;[m
[31m-[m
[31m-    ssl_comp_methods = SSL_COMP_get_compression_methods();[m
[31m-    n = sk_SSL_COMP_num(ssl_comp_methods);[m
[31m-[m
[31m-    while (n--) {[m
[31m-        (void) sk_SSL_COMP_pop(ssl_comp_methods);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    ngx_ssl_connection_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_connection_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0, "SSL_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_server_conf_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                         NULL);[m
[31m-    if (ngx_ssl_server_conf_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_session_cache_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                           NULL);[m
[31m-    if (ngx_ssl_session_cache_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_session_ticket_keys_index = SSL_CTX_get_ex_new_index(0, NULL, NULL,[m
[31m-                                                                 NULL, NULL);[m
[31m-    if (ngx_ssl_session_ticket_keys_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_certificate_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                         NULL);[m
[31m-    if (ngx_ssl_certificate_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_stapling_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,[m
[31m-                                                      NULL);[m
[31m-    if (ngx_ssl_stapling_index == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "SSL_CTX_get_ex_new_index() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data)[m
[31m-{[m
[31m-    ssl->ctx = SSL_CTX_new(SSLv23_method());[m
[31m-[m
[31m-    if (ssl->ctx == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "SSL_CTX_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_server_conf_index, data) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl->buffer_size = NGX_SSL_BUFSIZE;[m
[31m-[m
[31m-    /* client side options */[m
[31m-[m
[31m-#ifdef SSL_OP_MICROSOFT_SESS_ID_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_SESS_ID_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_NETSCAPE_CHALLENGE_BUG);[m
[31m-#endif[m
[31m-[m
[31m-    /* server side options */[m
[31m-[m
[31m-#ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING[m
[31m-    /* this option allow a potential SSL 2.0 rollback (CAN-2005-2969) */[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_MSIE_SSLV2_RSA_PADDING);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLEAY_080_CLIENT_DH_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_TLS_D5_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_D5_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_TLS_BLOCK_PADDING_BUG[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_BLOCK_PADDING_BUG);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_DH_USE);[m
[31m-[m
[31m-#ifdef SSL_CTRL_CLEAR_OPTIONS[m
[31m-    /* only in 0.9.8m+ */[m
[31m-    SSL_CTX_clear_options(ssl->ctx,[m
[31m-                          SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1);[m
[31m-#endif[m
[31m-[m
[31m-    if (!(protocols & NGX_SSL_SSLv2)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv2);[m
[31m-    }[m
[31m-    if (!(protocols & NGX_SSL_SSLv3)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv3);[m
[31m-    }[m
[31m-    if (!(protocols & NGX_SSL_TLSv1)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1);[m
[31m-    }[m
[31m-#ifdef SSL_OP_NO_TLSv1_1[m
[31m-    SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_1);[m
[31m-    if (!(protocols & NGX_SSL_TLSv1_1)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_1);[m
[31m-    }[m
[31m-#endif[m
[31m-#ifdef SSL_OP_NO_TLSv1_2[m
[31m-    SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_2);[m
[31m-    if (!(protocols & NGX_SSL_TLSv1_2)) {[m
[31m-        SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_2);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_OP_NO_COMPRESSION[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_COMPRESSION);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_MODE_RELEASE_BUFFERS[m
[31m-    SSL_CTX_set_mode(ssl->ctx, SSL_MODE_RELEASE_BUFFERS);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef SSL_MODE_NO_AUTO_CHAIN[m
[31m-    SSL_CTX_set_mode(ssl->ctx, SSL_MODE_NO_AUTO_CHAIN);[m
[31m-#endif[m
[31m-[m
[31m-    SSL_CTX_set_read_ahead(ssl->ctx, 1);[m
[31m-[m
[31m-    SSL_CTX_set_info_callback(ssl->ctx, ngx_ssl_info_callback);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_str_t *key, ngx_array_t *passwords)[m
[31m-{[m
[31m-    BIO         *bio;[m
[31m-    X509        *x509;[m
[31m-    u_long       n;[m
[31m-    ngx_str_t   *pwd;[m
[31m-    ngx_uint_t   tries;[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we can't use SSL_CTX_use_certificate_chain_file() as it doesn't[m
[31m-     * allow to access certificate later from SSL_CTX, so we reimplement[m
[31m-     * it here[m
[31m-     */[m
[31m-[m
[31m-    bio = BIO_new_file((char *) cert->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL);[m
[31m-    if (x509 == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "PEM_read_bio_X509_AUX(\"%s\") failed", cert->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_use_certificate(ssl->ctx, x509) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_use_certificate(\"%s\") failed", cert->data);[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_certificate_index, x509)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_free(x509);[m
[31m-[m
[31m-    /* read rest of the chain */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);[m
[31m-        if (x509 == NULL) {[m
[31m-            n = ERR_peek_last_error();[m
[31m-[m
[31m-            if (ERR_GET_LIB(n) == ERR_LIB_PEM[m
[31m-                && ERR_GET_REASON(n) == PEM_R_NO_START_LINE)[m
[31m-            {[m
[31m-                /* end of file */[m
[31m-                ERR_clear_error();[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* some real error */[m
[31m-[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "PEM_read_bio_X509(\"%s\") failed", cert->data);[m
[31m-            BIO_free(bio);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (SSL_CTX_add_extra_chain_cert(ssl->ctx, x509) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_add_extra_chain_cert(\"%s\") failed",[m
[31m-                          cert->data);[m
[31m-            X509_free(x509);[m
[31m-            BIO_free(bio);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    if (ngx_strncmp(key->data, "engine:", sizeof("engine:") - 1) == 0) {[m
[31m-[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-[m
[31m-        u_char      *p, *last;[m
[31m-        ENGINE      *engine;[m
[31m-        EVP_PKEY    *pkey;[m
[31m-[m
[31m-        p = key->data + sizeof("engine:") - 1;[m
[31m-        last = (u_char *) ngx_strchr(p, ':');[m
[31m-[m
[31m-        if (last == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid syntax in \"%V\"", key);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *last = '\0';[m
[31m-[m
[31m-        engine = ENGINE_by_id((char *) p);[m
[31m-[m
[31m-        if (engine == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "ENGINE_by_id(\"%s\") failed", p);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *last++ = ':';[m
[31m-[m
[31m-        pkey = ENGINE_load_private_key(engine, (char *) last, 0, 0);[m
[31m-[m
[31m-        if (pkey == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "ENGINE_load_private_key(\"%s\") failed", last);[m
[31m-            ENGINE_free(engine);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ENGINE_free(engine);[m
[31m-[m
[31m-        if (SSL_CTX_use_PrivateKey(ssl->ctx, pkey) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_use_PrivateKey(\"%s\") failed", last);[m
[31m-            EVP_PKEY_free(pkey);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        EVP_PKEY_free(pkey);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "loading \"engine:...\" certificate keys "[m
[31m-                           "is not supported");[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, key, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (passwords) {[m
[31m-        tries = passwords->nelts;[m
[31m-        pwd = passwords->elts;[m
[31m-[m
[31m-        SSL_CTX_set_default_passwd_cb(ssl->ctx, ngx_ssl_password_callback);[m
[31m-        SSL_CTX_set_default_passwd_cb_userdata(ssl->ctx, pwd);[m
[31m-[m
[31m-    } else {[m
[31m-        tries = 1;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        pwd = NULL;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (SSL_CTX_use_PrivateKey_file(ssl->ctx, (char *) key->data,[m
[31m-                                        SSL_FILETYPE_PEM)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (--tries) {[m
[31m-            ERR_clear_error();[m
[31m-            SSL_CTX_set_default_passwd_cb_userdata(ssl->ctx, ++pwd);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_use_PrivateKey_file(\"%s\") failed", key->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_default_passwd_cb(ssl->ctx, NULL);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_password_callback(char *buf, int size, int rwflag, void *userdata)[m
[31m-{[m
[31m-    ngx_str_t *pwd = userdata;[m
[31m-[m
[31m-    if (rwflag) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "ngx_ssl_password_callback() is called for encryption");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (pwd->len > (size_t) size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                      "password is truncated to %d bytes", size);[m
[31m-    } else {[m
[31m-        size = pwd->len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(buf, pwd->data, size);[m
[31m-[m
[31m-    return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_int_t depth)[m
[31m-{[m
[31m-    STACK_OF(X509_NAME)  *list;[m
[31m-[m
[31m-    SSL_CTX_set_verify(ssl->ctx, SSL_VERIFY_PEER, ngx_ssl_verify_callback);[m
[31m-[m
[31m-    SSL_CTX_set_verify_depth(ssl->ctx, depth);[m
[31m-[m
[31m-    if (cert->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_load_verify_locations(\"%s\") failed",[m
[31m-                      cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_CTX_load_verify_locations() may leave errors in the error queue[m
[31m-     * while returning success[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    list = SSL_load_client_CA_file((char *) cert->data);[m
[31m-[m
[31m-    if (list == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_load_client_CA_file(\"%s\") failed", cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * before 0.9.7h and 0.9.8 SSL_load_client_CA_file()[m
[31m-     * always leaved an error in the error queue[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    SSL_CTX_set_client_CA_list(ssl->ctx, list);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_trusted_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,[m
[31m-    ngx_int_t depth)[m
[31m-{[m
[31m-    SSL_CTX_set_verify_depth(ssl->ctx, depth);[m
[31m-[m
[31m-    if (cert->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_load_verify_locations(\"%s\") failed",[m
[31m-                      cert->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_CTX_load_verify_locations() may leave errors in the error queue[m
[31m-     * while returning success[m
[31m-     */[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl)[m
[31m-{[m
[31m-    X509_STORE   *store;[m
[31m-    X509_LOOKUP  *lookup;[m
[31m-[m
[31m-    if (crl->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, crl, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    store = SSL_CTX_get_cert_store(ssl->ctx);[m
[31m-[m
[31m-    if (store == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_get_cert_store() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());[m
[31m-[m
[31m-    if (lookup == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_add_lookup() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_LOOKUP_load_file(lookup, (char *) crl->data, X509_FILETYPE_PEM)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_LOOKUP_load_file(\"%s\") failed", crl->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_STORE_set_flags(store,[m
[31m-                         X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    char              *subject, *issuer;[m
[31m-    int                err, depth;[m
[31m-    X509              *cert;[m
[31m-    X509_NAME         *sname, *iname;[m
[31m-    ngx_connection_t  *c;[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    ssl_conn = X509_STORE_CTX_get_ex_data(x509_store,[m
[31m-                                          SSL_get_ex_data_X509_STORE_CTX_idx());[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    cert = X509_STORE_CTX_get_current_cert(x509_store);[m
[31m-    err = X509_STORE_CTX_get_error(x509_store);[m
[31m-    depth = X509_STORE_CTX_get_error_depth(x509_store);[m
[31m-[m
[31m-    sname = X509_get_subject_name(cert);[m
[31m-    subject = sname ? X509_NAME_oneline(sname, NULL, 0) : "(none)";[m
[31m-[m
[31m-    iname = X509_get_issuer_name(cert);[m
[31m-    issuer = iname ? X509_NAME_oneline(iname, NULL, 0) : "(none)";[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "verify:%d, error:%d, depth:%d, "[m
[31m-                   "subject:\"%s\", issuer:\"%s\"",[m
[31m-                   ok, err, depth, subject, issuer);[m
[31m-[m
[31m-    if (sname) {[m
[31m-        OPENSSL_free(subject);[m
[31m-    }[m
[31m-[m
[31m-    if (iname) {[m
[31m-        OPENSSL_free(issuer);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where, int ret)[m
[31m-{[m
[31m-    BIO               *rbio, *wbio;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (where & SSL_CB_HANDSHAKE_START) {[m
[31m-        c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-        if (c->ssl->handshaked) {[m
[31m-            c->ssl->renegotiation = 1;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL renegotiation");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((where & SSL_CB_ACCEPT_LOOP) == SSL_CB_ACCEPT_LOOP) {[m
[31m-        c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-        if (!c->ssl->handshake_buffer_set) {[m
[31m-            /*[m
[31m-             * By default OpenSSL uses 4k buffer during a handshake,[m
[31m-             * which is too low for long certificate chains and might[m
[31m-             * result in extra round-trips.[m
[31m-             *[m
[31m-             * To adjust a buffer size we detect that buffering was added[m
[31m-             * to write side of the connection by comparing rbio and wbio.[m
[31m-             * If they are different, we assume that it's due to buffering[m
[31m-             * added to wbio, and set buffer size.[m
[31m-             */[m
[31m-[m
[31m-            rbio = SSL_get_rbio((ngx_ssl_conn_t *) ssl_conn);[m
[31m-            wbio = SSL_get_wbio((ngx_ssl_conn_t *) ssl_conn);[m
[31m-[m
[31m-            if (rbio != wbio) {[m
[31m-                (void) BIO_set_write_buffer_size(wbio, NGX_SSL_BUFSIZE);[m
[31m-                c->ssl->handshake_buffer_set = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-RSA *[m
[31m-ngx_ssl_rsa512_key_callback(ngx_ssl_conn_t *ssl_conn, int is_export,[m
[31m-    int key_length)[m
[31m-{[m
[31m-    static RSA  *key;[m
[31m-[m
[31m-    if (key_length != 512) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100003L && !defined OPENSSL_NO_DEPRECATED)[m
[31m-[m
[31m-    if (key == NULL) {[m
[31m-        key = RSA_generate_key(512, RSA_F4, NULL, NULL);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file)[m
[31m-{[m
[31m-    u_char              *p, *last, *end;[m
[31m-    size_t               len;[m
[31m-    ssize_t              n;[m
[31m-    ngx_fd_t             fd;[m
[31m-    ngx_str_t           *pwd;[m
[31m-    ngx_array_t         *passwords;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-    u_char               buf[NGX_SSL_PASSWORD_BUFFER_SIZE];[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->temp_pool, 0);[m
[31m-    passwords = ngx_array_create(cf->temp_pool, 4, sizeof(ngx_str_t));[m
[31m-[m
[31m-    if (cln == NULL || passwords == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_passwords_cleanup;[m
[31m-    cln->data = passwords;[m
[31m-[m
[31m-    fd = ngx_open_file(file->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                           ngx_open_file_n " \"%s\" failed", file->data);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    last = buf;[m
[31m-[m
[31m-    do {[m
[31m-        n = ngx_read_fd(fd, last, NGX_SSL_PASSWORD_BUFFER_SIZE - len);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_read_fd_n " \"%s\" failed", file->data);[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        end = last + n;[m
[31m-[m
[31m-        if (len && n == 0) {[m
[31m-            *end++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            last = ngx_strlchr(last, end, LF);[m
[31m-[m
[31m-            if (last == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            len = last++ - p;[m
[31m-[m
[31m-            if (len && p[len - 1] == CR) {[m
[31m-                len--;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                pwd = ngx_array_push(passwords);[m
[31m-                if (pwd == NULL) {[m
[31m-                    passwords = NULL;[m
[31m-                    goto cleanup;[m
[31m-                }[m
[31m-[m
[31m-                pwd->len = len;[m
[31m-                pwd->data = ngx_pnalloc(cf->temp_pool, len);[m
[31m-[m
[31m-                if (pwd->data == NULL) {[m
[31m-                    passwords->nelts--;[m
[31m-                    passwords = NULL;[m
[31m-                    goto cleanup;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(pwd->data, p, len);[m
[31m-            }[m
[31m-[m
[31m-            p = last;[m
[31m-        }[m
[31m-[m
[31m-        len = end - p;[m
[31m-[m
[31m-        if (len == NGX_SSL_PASSWORD_BUFFER_SIZE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "too long line in \"%s\"", file->data);[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memmove(buf, p, len);[m
[31m-        last = buf + len;[m
[31m-[m
[31m-    } while (n != 0);[m
[31m-[m
[31m-    if (passwords->nelts == 0) {[m
[31m-        pwd = ngx_array_push(passwords);[m
[31m-        if (pwd == NULL) {[m
[31m-            passwords = NULL;[m
[31m-            goto cleanup;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(pwd, sizeof(ngx_str_t));[m
[31m-    }[m
[31m-[m
[31m-cleanup:[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, ngx_errno,[m
[31m-                           ngx_close_file_n " \"%s\" failed", file->data);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(buf, NGX_SSL_PASSWORD_BUFFER_SIZE);[m
[31m-[m
[31m-    return passwords;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_passwords_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_array_t *passwords = data;[m
[31m-[m
[31m-    ngx_str_t   *pwd;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    pwd = passwords->elts;[m
[31m-[m
[31m-    for (i = 0; i < passwords->nelts; i++) {[m
[31m-        ngx_memzero(pwd[i].data, pwd[i].len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_dhparam(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file)[m
[31m-{[m
[31m-    DH   *dh;[m
[31m-    BIO  *bio;[m
[31m-[m
[31m-    /*[m
[31m-     * -----BEGIN DH PARAMETERS-----[m
[31m-     * MIGHAoGBALu8LcrYRnSQfEP89YDpz9vZWKP1aLQtSwju1OsPs1BMbAMCducQgAxc[m
[31m-     * y7qokiYUxb7spWWl/fHSh6K8BJvmd4Bg6RqSp1fjBI9osHb302zI8pul34HcLKcl[m
[31m-     * 7OZicMyaUDXYzs7vnqAnSmOrHlj6/UmI0PZdFGdX2gcd8EXP4WubAgEC[m
[31m-     * -----END DH PARAMETERS-----[m
[31m-     */[m
[31m-[m
[31m-    static unsigned char dh1024_p[] = {[m
[31m-        0xBB, 0xBC, 0x2D, 0xCA, 0xD8, 0x46, 0x74, 0x90, 0x7C, 0x43, 0xFC, 0xF5,[m
[31m-        0x80, 0xE9, 0xCF, 0xDB, 0xD9, 0x58, 0xA3, 0xF5, 0x68, 0xB4, 0x2D, 0x4B,[m
[31m-        0x08, 0xEE, 0xD4, 0xEB, 0x0F, 0xB3, 0x50, 0x4C, 0x6C, 0x03, 0x02, 0x76,[m
[31m-        0xE7, 0x10, 0x80, 0x0C, 0x5C, 0xCB, 0xBA, 0xA8, 0x92, 0x26, 0x14, 0xC5,[m
[31m-        0xBE, 0xEC, 0xA5, 0x65, 0xA5, 0xFD, 0xF1, 0xD2, 0x87, 0xA2, 0xBC, 0x04,[m
[31m-        0x9B, 0xE6, 0x77, 0x80, 0x60, 0xE9, 0x1A, 0x92, 0xA7, 0x57, 0xE3, 0x04,[m
[31m-        0x8F, 0x68, 0xB0, 0x76, 0xF7, 0xD3, 0x6C, 0xC8, 0xF2, 0x9B, 0xA5, 0xDF,[m
[31m-        0x81, 0xDC, 0x2C, 0xA7, 0x25, 0xEC, 0xE6, 0x62, 0x70, 0xCC, 0x9A, 0x50,[m
[31m-        0x35, 0xD8, 0xCE, 0xCE, 0xEF, 0x9E, 0xA0, 0x27, 0x4A, 0x63, 0xAB, 0x1E,[m
[31m-        0x58, 0xFA, 0xFD, 0x49, 0x88, 0xD0, 0xF6, 0x5D, 0x14, 0x67, 0x57, 0xDA,[m
[31m-        0x07, 0x1D, 0xF0, 0x45, 0xCF, 0xE1, 0x6B, 0x9B[m
[31m-    };[m
[31m-[m
[31m-    static unsigned char dh1024_g[] = { 0x02 };[m
[31m-[m
[31m-[m
[31m-    if (file->len == 0) {[m
[31m-[m
[31m-        dh = DH_new();[m
[31m-        if (dh == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "DH_new() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);[m
[31m-        dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);[m
[31m-[m
[31m-        if (dh->p == NULL || dh->g == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "BN_bin2bn() failed");[m
[31m-            DH_free(dh);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        SSL_CTX_set_tmp_dh(ssl->ctx, dh);[m
[31m-[m
[31m-        DH_free(dh);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_file((char *) file->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", file->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);[m
[31m-    if (dh == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "PEM_read_bio_DHparams(\"%s\") failed", file->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_tmp_dh(ssl->ctx, dh);[m
[31m-[m
[31m-    DH_free(dh);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_ecdh_curve(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *name)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-#ifndef OPENSSL_NO_ECDH[m
[31m-    int      nid;[m
[31m-    EC_KEY  *ecdh;[m
[31m-[m
[31m-    /*[m
[31m-     * Elliptic-Curve Diffie-Hellman parameters are either "named curves"[m
[31m-     * from RFC 4492 section 5.1.1, or explicitly described curves over[m
[31m-     * binary fields. OpenSSL only supports the "named curves", which provide[m
[31m-     * maximum interoperability.[m
[31m-     */[m
[31m-[m
[31m-    nid = OBJ_sn2nid((const char *) name->data);[m
[31m-    if (nid == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "Unknown curve name \"%s\"", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ecdh = EC_KEY_new_by_curve_name(nid);[m
[31m-    if (ecdh == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "Unable to create curve \"%s\"", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_ECDH_USE);[m
[31m-[m
[31m-    SSL_CTX_set_tmp_ecdh(ssl->ctx, ecdh);[m
[31m-[m
[31m-    EC_KEY_free(ecdh);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_ssl_connection_t  *sc;[m
[31m-[m
[31m-    sc = ngx_pcalloc(c->pool, sizeof(ngx_ssl_connection_t));[m
[31m-    if (sc == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sc->buffer = ((flags & NGX_SSL_BUFFER) != 0);[m
[31m-    sc->buffer_size = ssl->buffer_size;[m
[31m-[m
[31m-    sc->session_ctx = ssl->ctx;[m
[31m-[m
[31m-    sc->connection = SSL_new(ssl->ctx);[m
[31m-[m
[31m-    if (sc->connection == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_set_fd(sc->connection, c->fd) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_fd() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_SSL_CLIENT) {[m
[31m-        SSL_set_connect_state(sc->connection);[m
[31m-[m
[31m-    } else {[m
[31m-        SSL_set_accept_state(sc->connection);[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_set_ex_data(sc->connection, ngx_ssl_connection_index, c) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl = sc;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session)[m
[31m-{[m
[31m-    if (session) {[m
[31m-        if (SSL_set_session(c->ssl->connection, session) == 0) {[m
[31m-            ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_session() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_handshake(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        n, sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    n = SSL_do_handshake(c->ssl->connection);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        char         buf[129], *s, *d;[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10000000L[m
[31m-        const[m
[31m-#endif[m
[31m-        SSL_CIPHER  *cipher;[m
[31m-[m
[31m-        cipher = SSL_get_current_cipher(c->ssl->connection);[m
[31m-[m
[31m-        if (cipher) {[m
[31m-            SSL_CIPHER_description(cipher, &buf[1], 128);[m
[31m-[m
[31m-            for (s = &buf[1], d = buf; *s; s++) {[m
[31m-                if (*s == ' ' && *d == ' ') {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (*s == LF || *s == CR) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                *++d = *s;[m
[31m-            }[m
[31m-[m
[31m-            if (*d != ' ') {[m
[31m-                d++;[m
[31m-            }[m
[31m-[m
[31m-            *d = '\0';[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL: %s, cipher: \"%s\"",[m
[31m-                           SSL_get_version(c->ssl->connection), &buf[1]);[m
[31m-[m
[31m-            if (SSL_session_reused(c->ssl->connection)) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                               "SSL reused session");[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL no shared ciphers");[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c->ssl->handshaked = 1;[m
[31m-[m
[31m-        c->recv = ngx_ssl_recv;[m
[31m-        c->send = ngx_ssl_write;[m
[31m-        c->recv_chain = ngx_ssl_recv_chain;[m
[31m-        c->send_chain = ngx_ssl_send_chain;[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10100000L[m
[31m-#ifdef SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS[m
[31m-[m
[31m-        /* initial handshake done, disable renegotiation (CVE-2009-3555) */[m
[31m-        if (c->ssl->connection->s3) {[m
[31m-            c->ssl->connection->s3->flags |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-        c->read->ready = 0;[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->write->ready = 0;[m
[31m-        c->read->handler = ngx_ssl_handshake_handler;[m
[31m-        c->write->handler = ngx_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-    c->read->eof = 1;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {[m
[31m-        ngx_connection_error(c, err,[m
[31m-                             "peer closed connection in SSL handshake");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->read->error = 1;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_do_handshake() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_handshake_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL handshake handler: %d", ev->write);[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->ssl->handler(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_handshake(c) == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit)[m
[31m-{[m
[31m-    u_char     *last;[m
[31m-    ssize_t     n, bytes, size;[m
[31m-    ngx_buf_t  *b;[m
[31m-[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-    last = b->last;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        size = b->end - last;[m
[31m-[m
[31m-        if (limit) {[m
[31m-            if (bytes >= limit) {[m
[31m-                return bytes;[m
[31m-            }[m
[31m-[m
[31m-            if (bytes + size > limit) {[m
[31m-                size = (ssize_t) (limit - bytes);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_ssl_recv(c, last, size);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            last += n;[m
[31m-            bytes += n;[m
[31m-[m
[31m-            if (last == b->end) {[m
[31m-                cl = cl->next;[m
[31m-[m
[31m-                if (cl == NULL) {[m
[31m-                    return bytes;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-                last = b->last;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bytes) {[m
[31m-[m
[31m-            if (n == 0 || n == NGX_ERROR) {[m
[31m-                c->read->ready = 1;[m
[31m-            }[m
[31m-[m
[31m-            return bytes;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int  n, bytes;[m
[31m-[m
[31m-    if (c->ssl->last == NGX_ERROR) {[m
[31m-        c->read->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (c->ssl->last == NGX_DONE) {[m
[31m-        c->read->ready = 0;[m
[31m-        c->read->eof = 1;[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_read() may return data in parts, so try to read[m
[31m-     * until SSL_read() would return no data[m
[31m-     */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = SSL_read(c->ssl->connection, buf, size);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_read: %d", n);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            bytes += n;[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->last = ngx_ssl_handle_recv(c, n);[m
[31m-[m
[31m-        if (c->ssl->last == NGX_OK) {[m
[31m-[m
[31m-            size -= n;[m
[31m-[m
[31m-            if (size == 0) {[m
[31m-                c->read->ready = 1;[m
[31m-                return bytes;[m
[31m-            }[m
[31m-[m
[31m-            buf += n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bytes) {[m
[31m-            if (c->ssl->last != NGX_AGAIN) {[m
[31m-                c->read->ready = 1;[m
[31m-            }[m
[31m-[m
[31m-            return bytes;[m
[31m-        }[m
[31m-[m
[31m-        switch (c->ssl->last) {[m
[31m-[m
[31m-        case NGX_DONE:[m
[31m-            c->read->ready = 0;[m
[31m-            c->read->eof = 1;[m
[31m-            return 0;[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            c->read->error = 1;[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case NGX_AGAIN:[m
[31m-            return c->ssl->last;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_handle_recv(ngx_connection_t *c, int n)[m
[31m-{[m
[31m-    int        sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (c->ssl->renegotiation) {[m
[31m-        /*[m
[31m-         * disable renegotiation (CVE-2009-3555):[m
[31m-         * OpenSSL (at least up to 0.9.8l) does not handle disabled[m
[31m-         * renegotiation gracefully, so drop connection here[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, c->log, 0, "SSL renegotiation disabled");[m
[31m-[m
[31m-        while (ERR_peek_error()) {[m
[31m-            ngx_ssl_error(NGX_LOG_DEBUG, c->log, 0,[m
[31m-                          "ignoring stale global SSL error");[m
[31m-        }[m
[31m-[m
[31m-        ERR_clear_error();[m
[31m-[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-        c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-[m
[31m-        if (c->ssl->saved_write_handler) {[m
[31m-[m
[31m-            c->write->handler = c->ssl->saved_write_handler;[m
[31m-            c->ssl->saved_write_handler = NULL;[m
[31m-            c->write->ready = 1;[m
[31m-[m
[31m-            if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_post_event(c->write, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-        c->read->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "peer started SSL renegotiation");[m
[31m-[m
[31m-        c->write->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not set the timer because there is already the read event timer[m
[31m-         */[m
[31m-[m
[31m-        if (c->ssl->saved_write_handler == NULL) {[m
[31m-            c->ssl->saved_write_handler = c->write->handler;[m
[31m-            c->write->handler = ngx_ssl_write_handler;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "peer shutdown SSL cleanly");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-[m
[31m-    c->read->handler(c->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * OpenSSL has no SSL_writev() so we copy several bufs into our 16K buffer[m
[31m- * before the SSL_write() call to decrease a SSL overhead.[m
[31m- *[m
[31m- * Besides for protocols such as HTTP it is possible to always buffer[m
[31m- * the output to decrease a SSL overhead some more.[m
[31m- */[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int          n;[m
[31m-    ngx_uint_t   flush;[m
[31m-    ssize_t      send, size;[m
[31m-    ngx_buf_t   *buf;[m
[31m-[m
[31m-    if (!c->ssl->buffer) {[m
[31m-[m
[31m-        while (in) {[m
[31m-            if (ngx_buf_special(in->buf)) {[m
[31m-                in = in->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_ssl_write(c, in->buf->pos, in->buf->last - in->buf->pos);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                return in;[m
[31m-            }[m
[31m-[m
[31m-            in->buf->pos += n;[m
[31m-[m
[31m-            if (in->buf->pos == in->buf->last) {[m
[31m-                in = in->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the maximum limit size is the maximum int32_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_INT32_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_INT32_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    buf = c->ssl->buf;[m
[31m-[m
[31m-    if (buf == NULL) {[m
[31m-        buf = ngx_create_temp_buf(c->pool, c->ssl->buffer_size);[m
[31m-        if (buf == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->buf = buf;[m
[31m-    }[m
[31m-[m
[31m-    if (buf->start == NULL) {[m
[31m-        buf->start = ngx_palloc(c->pool, c->ssl->buffer_size);[m
[31m-        if (buf->start == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buf->pos = buf->start;[m
[31m-        buf->last = buf->start;[m
[31m-        buf->end = buf->start + c->ssl->buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    send = buf->last - buf->pos;[m
[31m-    flush = (in == NULL) ? 1 : buf->flush;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        while (in && buf->last < buf->end && send < limit) {[m
[31m-            if (in->buf->last_buf || in->buf->flush) {[m
[31m-                flush = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_special(in->buf)) {[m
[31m-                in = in->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            size = in->buf->last - in->buf->pos;[m
[31m-[m
[31m-            if (size > buf->end - buf->last) {[m
[31m-                size = buf->end - buf->last;[m
[31m-            }[m
[31m-[m
[31m-            if (send + size > limit) {[m
[31m-                size = (ssize_t) (limit - send);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL buf copy: %z", size);[m
[31m-[m
[31m-            ngx_memcpy(buf->last, in->buf->pos, size);[m
[31m-[m
[31m-            buf->last += size;[m
[31m-            in->buf->pos += size;[m
[31m-            send += size;[m
[31m-[m
[31m-            if (in->buf->pos == in->buf->last) {[m
[31m-                in = in->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!flush && send < limit && buf->last < buf->end) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        size = buf->last - buf->pos;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            buf->flush = 0;[m
[31m-            c->buffered &= ~NGX_SSL_BUFFERED;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_ssl_write(c, buf->pos, size);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        buf->pos += n;[m
[31m-[m
[31m-        if (n < size) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        flush = 0;[m
[31m-[m
[31m-        buf->pos = buf->start;[m
[31m-        buf->last = buf->start;[m
[31m-[m
[31m-        if (in == NULL || send == limit) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    buf->flush = flush;[m
[31m-[m
[31m-    if (buf->pos < buf->last) {[m
[31m-        c->buffered |= NGX_SSL_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        c->buffered &= ~NGX_SSL_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size)[m
[31m-{[m
[31m-    int        n, sslerr;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL to write: %uz", size);[m
[31m-[m
[31m-    n = SSL_write(c->ssl->connection, data, size);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_write: %d", n);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-[m
[31m-        if (c->ssl->saved_read_handler) {[m
[31m-[m
[31m-            c->read->handler = c->ssl->saved_read_handler;[m
[31m-            c->ssl->saved_read_handler = NULL;[m
[31m-            c->read->ready = 1;[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_post_event(c->read, &ngx_posted_events);[m
[31m-        }[m
[31m-[m
[31m-        c->sent += n;[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr);[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->write->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "peer started SSL renegotiation");[m
[31m-[m
[31m-        c->read->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not set the timer because there is already[m
[31m-         * the write event timer[m
[31m-         */[m
[31m-[m
[31m-        if (c->ssl->saved_read_handler == NULL) {[m
[31m-            c->ssl->saved_read_handler = c->read->handler;[m
[31m-            c->read->handler = ngx_ssl_read_handler;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->ssl->no_wait_shutdown = 1;[m
[31m-    c->ssl->no_send_shutdown = 1;[m
[31m-    c->write->error = 1;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_write() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->write->handler(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_free_buffer(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (c->ssl->buf && c->ssl->buf->start) {[m
[31m-        if (ngx_pfree(c->pool, c->ssl->buf->start) == NGX_OK) {[m
[31m-            c->ssl->buf->start = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_shutdown(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        n, sslerr, mode;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (SSL_in_init(c->ssl->connection)) {[m
[31m-        /*[m
[31m-         * OpenSSL 1.0.2f complains if SSL_shutdown() is called during[m
[31m-         * an SSL handshake, while previous versions always return 0.[m
[31m-         * Avoid calling SSL_shutdown() if handshake wasn't completed.[m
[31m-         */[m
[31m-[m
[31m-        SSL_free(c->ssl->connection);[m
[31m-        c->ssl = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c->timedout) {[m
[31m-        mode = SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN;[m
[31m-        SSL_set_quiet_shutdown(c->ssl->connection, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        mode = SSL_get_shutdown(c->ssl->connection);[m
[31m-[m
[31m-        if (c->ssl->no_wait_shutdown) {[m
[31m-            mode |= SSL_RECEIVED_SHUTDOWN;[m
[31m-        }[m
[31m-[m
[31m-        if (c->ssl->no_send_shutdown) {[m
[31m-            mode |= SSL_SENT_SHUTDOWN;[m
[31m-        }[m
[31m-[m
[31m-        if (c->ssl->no_wait_shutdown && c->ssl->no_send_shutdown) {[m
[31m-            SSL_set_quiet_shutdown(c->ssl->connection, 1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    SSL_set_shutdown(c->ssl->connection, mode);[m
[31m-[m
[31m-    ngx_ssl_clear_error(c->log);[m
[31m-[m
[31m-    n = SSL_shutdown(c->ssl->connection);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_shutdown: %d", n);[m
[31m-[m
[31m-    sslerr = 0;[m
[31m-[m
[31m-    /* before 0.9.8m SSL_shutdown() returned 0 instead of -1 on errors */[m
[31m-[m
[31m-    if (n != 1 && ERR_peek_error()) {[m
[31m-        sslerr = SSL_get_error(c->ssl->connection, n);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL_get_error: %d", sslerr);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1 || sslerr == 0 || sslerr == SSL_ERROR_ZERO_RETURN) {[m
[31m-        SSL_free(c->ssl->connection);[m
[31m-        c->ssl = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_WANT_READ || sslerr == SSL_ERROR_WANT_WRITE) {[m
[31m-        c->read->handler = ngx_ssl_shutdown_handler;[m
[31m-        c->write->handler = ngx_ssl_shutdown_handler;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (sslerr == SSL_ERROR_WANT_READ) {[m
[31m-            ngx_add_timer(c->read, 30000);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0;[m
[31m-[m
[31m-    ngx_ssl_connection_error(c, sslerr, err, "SSL_shutdown() failed");[m
[31m-[m
[31m-    SSL_free(c->ssl->connection);[m
[31m-    c->ssl = NULL;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_shutdown_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_connection_handler_pt   handler;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    handler = c->ssl->handler;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "SSL shutdown handler");[m
[31m-[m
[31m-    if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_connection_error(ngx_connection_t *c, int sslerr, ngx_err_t err,[m
[31m-    char *text)[m
[31m-{[m
[31m-    int         n;[m
[31m-    ngx_uint_t  level;[m
[31m-[m
[31m-    level = NGX_LOG_CRIT;[m
[31m-[m
[31m-    if (sslerr == SSL_ERROR_SYSCALL) {[m
[31m-[m
[31m-        if (err == NGX_ECONNRESET[m
[31m-            || err == NGX_EPIPE[m
[31m-            || err == NGX_ENOTCONN[m
[31m-            || err == NGX_ETIMEDOUT[m
[31m-            || err == NGX_ECONNREFUSED[m
[31m-            || err == NGX_ENETDOWN[m
[31m-            || err == NGX_ENETUNREACH[m
[31m-            || err == NGX_EHOSTDOWN[m
[31m-            || err == NGX_EHOSTUNREACH)[m
[31m-        {[m
[31m-            switch (c->log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else if (sslerr == SSL_ERROR_SSL) {[m
[31m-[m
[31m-        n = ERR_GET_REASON(ERR_peek_error());[m
[31m-[m
[31m-            /* handshake failures */[m
[31m-        if (n == SSL_R_BAD_CHANGE_CIPHER_SPEC                        /*  103 */[m
[31m-            || n == SSL_R_BLOCK_CIPHER_PAD_IS_WRONG                  /*  129 */[m
[31m-            || n == SSL_R_DIGEST_CHECK_FAILED                        /*  149 */[m
[31m-            || n == SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST              /*  151 */[m
[31m-            || n == SSL_R_EXCESSIVE_MESSAGE_SIZE                     /*  152 */[m
[31m-            || n == SSL_R_LENGTH_MISMATCH                            /*  159 */[m
[31m-            || n == SSL_R_NO_CIPHERS_PASSED                          /*  182 */[m
[31m-            || n == SSL_R_NO_CIPHERS_SPECIFIED                       /*  183 */[m
[31m-            || n == SSL_R_NO_COMPRESSION_SPECIFIED                   /*  187 */[m
[31m-            || n == SSL_R_NO_SHARED_CIPHER                           /*  193 */[m
[31m-            || n == SSL_R_RECORD_LENGTH_MISMATCH                     /*  213 */[m
[31m-#ifdef SSL_R_PARSE_TLSEXT[m
[31m-            || n == SSL_R_PARSE_TLSEXT                               /*  227 */[m
[31m-#endif[m
[31m-            || n == SSL_R_UNEXPECTED_MESSAGE                         /*  244 */[m
[31m-            || n == SSL_R_UNEXPECTED_RECORD                          /*  245 */[m
[31m-            || n == SSL_R_UNKNOWN_ALERT_TYPE                         /*  246 */[m
[31m-            || n == SSL_R_UNKNOWN_PROTOCOL                           /*  252 */[m
[31m-            || n == SSL_R_WRONG_VERSION_NUMBER                       /*  267 */[m
[31m-            || n == SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC        /*  281 */[m
[31m-#ifdef SSL_R_RENEGOTIATE_EXT_TOO_LONG[m
[31m-            || n == SSL_R_RENEGOTIATE_EXT_TOO_LONG                   /*  335 */[m
[31m-            || n == SSL_R_RENEGOTIATION_ENCODING_ERR                 /*  336 */[m
[31m-            || n == SSL_R_RENEGOTIATION_MISMATCH                     /*  337 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED[m
[31m-            || n == SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED       /*  338 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING[m
[31m-            || n == SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING           /*  345 */[m
[31m-#endif[m
[31m-#ifdef SSL_R_INAPPROPRIATE_FALLBACK[m
[31m-            || n == SSL_R_INAPPROPRIATE_FALLBACK                     /*  373 */[m
[31m-#endif[m
[31m-            || n == 1000 /* SSL_R_SSLV3_ALERT_CLOSE_NOTIFY */[m
[31m-#ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE[m
[31m-            || n == SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE             /* 1010 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_BAD_RECORD_MAC                 /* 1020 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECRYPTION_FAILED              /* 1021 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_RECORD_OVERFLOW                /* 1022 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE          /* 1030 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE              /* 1040 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_NO_CERTIFICATE                 /* 1041 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_BAD_CERTIFICATE                /* 1042 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE        /* 1043 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED            /* 1044 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED            /* 1045 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN            /* 1046 */[m
[31m-            || n == SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER              /* 1047 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_UNKNOWN_CA                     /* 1048 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_ACCESS_DENIED                  /* 1049 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECODE_ERROR                   /* 1050 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_DECRYPT_ERROR                  /* 1051 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION             /* 1060 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_PROTOCOL_VERSION               /* 1070 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY          /* 1071 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_INTERNAL_ERROR                 /* 1080 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_USER_CANCELLED                 /* 1090 */[m
[31m-            || n == SSL_R_TLSV1_ALERT_NO_RENEGOTIATION               /* 1100 */[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            switch (c->log_error) {[m
[31m-[m
[31m-            case NGX_ERROR_IGNORE_ECONNRESET:[m
[31m-            case NGX_ERROR_INFO:[m
[31m-                level = NGX_LOG_INFO;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_ERROR_ERR:[m
[31m-                level = NGX_LOG_ERR;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_error(level, c->log, err, text);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_clear_error(ngx_log_t *log)[m
[31m-{[m
[31m-    while (ERR_peek_error()) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, log, 0, "ignoring stale global SSL error");[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_ssl_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, char *fmt, ...)[m
[31m-{[m
[31m-    int          flags;[m
[31m-    u_long       n;[m
[31m-    va_list      args;[m
[31m-    u_char      *p, *last;[m
[31m-    u_char       errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    const char  *data;[m
[31m-[m
[31m-    last = errstr + NGX_MAX_CONF_ERRSTR;[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(errstr, last - 1, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    p = ngx_cpystrn(p, (u_char *) " (SSL:", last - p);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = ERR_peek_error_line_data(NULL, NULL, &data, &flags);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (p >= last) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        *p++ = ' ';[m
[31m-[m
[31m-        ERR_error_string_n(n, (char *) p, last - p);[m
[31m-[m
[31m-        while (p < last && *p) {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (p < last && *data && (flags & ERR_TXT_STRING)) {[m
[31m-            *p++ = ':';[m
[31m-            p = ngx_cpystrn(p, (u_char *) data, last - p);[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        (void) ERR_get_error();[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, log, err, "%*s)", p - errstr, errstr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx,[m
[31m-    ssize_t builtin_session_cache, ngx_shm_zone_t *shm_zone, time_t timeout)[m
[31m-{[m
[31m-    long  cache_mode;[m
[31m-[m
[31m-    SSL_CTX_set_timeout(ssl->ctx, (long) timeout);[m
[31m-[m
[31m-    if (ngx_ssl_session_id_context(ssl, sess_ctx) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (builtin_session_cache == NGX_SSL_NO_SCACHE) {[m
[31m-        SSL_CTX_set_session_cache_mode(ssl->ctx, SSL_SESS_CACHE_OFF);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (builtin_session_cache == NGX_SSL_NONE_SCACHE) {[m
[31m-[m
[31m-        /*[m
[31m-         * If the server explicitly says that it does not support[m
[31m-         * session reuse (see SSL_SESS_CACHE_OFF above), then[m
[31m-         * Outlook Express fails to upload a sent email to[m
[31m-         * the Sent Items folder on the IMAP server via a separate IMAP[m
[31m-         * connection in the background. Therefore we have a special[m
[31m-         * mode (SSL_SESS_CACHE_SERVER|SSL_SESS_CACHE_NO_INTERNAL_STORE)[m
[31m-         * where the server pretends that it supports session reuse,[m
[31m-         * but it does not actually store any session.[m
[31m-         */[m
[31m-[m
[31m-        SSL_CTX_set_session_cache_mode(ssl->ctx,[m
[31m-                                       SSL_SESS_CACHE_SERVER[m
[31m-                                       |SSL_SESS_CACHE_NO_AUTO_CLEAR[m
[31m-                                       |SSL_SESS_CACHE_NO_INTERNAL_STORE);[m
[31m-[m
[31m-        SSL_CTX_sess_set_cache_size(ssl->ctx, 1);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache_mode = SSL_SESS_CACHE_SERVER;[m
[31m-[m
[31m-    if (shm_zone && builtin_session_cache == NGX_SSL_NO_BUILTIN_SCACHE) {[m
[31m-        cache_mode |= SSL_SESS_CACHE_NO_INTERNAL;[m
[31m-    }[m
[31m-[m
[31m-    SSL_CTX_set_session_cache_mode(ssl->ctx, cache_mode);[m
[31m-[m
[31m-    if (builtin_session_cache != NGX_SSL_NO_BUILTIN_SCACHE) {[m
[31m-[m
[31m-        if (builtin_session_cache != NGX_SSL_DFLT_BUILTIN_SCACHE) {[m
[31m-            SSL_CTX_sess_set_cache_size(ssl->ctx, builtin_session_cache);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone) {[m
[31m-        SSL_CTX_sess_set_new_cb(ssl->ctx, ngx_ssl_new_session);[m
[31m-        SSL_CTX_sess_set_get_cb(ssl->ctx, ngx_ssl_get_cached_session);[m
[31m-        SSL_CTX_sess_set_remove_cb(ssl->ctx, ngx_ssl_remove_session);[m
[31m-[m
[31m-        if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_cache_index, shm_zone)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                          "SSL_CTX_set_ex_data() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_session_id_context(ngx_ssl_t *ssl, ngx_str_t *sess_ctx)[m
[31m-{[m
[31m-    int                   n, i;[m
[31m-    X509                 *cert;[m
[31m-    X509_NAME            *name;[m
[31m-    EVP_MD_CTX           *md;[m
[31m-    unsigned int          len;[m
[31m-    STACK_OF(X509_NAME)  *list;[m
[31m-    u_char                buf[EVP_MAX_MD_SIZE];[m
[31m-[m
[31m-    /*[m
[31m-     * Session ID context is set based on the string provided,[m
[31m-     * the server certificate, and the client CA list.[m
[31m-     */[m
[31m-[m
[31m-    md = EVP_MD_CTX_create();[m
[31m-    if (md == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestInit_ex(md, EVP_sha1(), NULL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestInit_ex() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestUpdate(md, sess_ctx->data, sess_ctx->len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cert = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_certificate_index);[m
[31m-[m
[31m-    if (X509_digest(cert, EVP_sha1(), buf, &len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_digest() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestUpdate(md, buf, len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    list = SSL_CTX_get_client_CA_list(ssl->ctx);[m
[31m-[m
[31m-    if (list != NULL) {[m
[31m-        n = sk_X509_NAME_num(list);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            name = sk_X509_NAME_value(list, i);[m
[31m-[m
[31m-            if (X509_NAME_digest(name, EVP_sha1(), buf, &len) == 0) {[m
[31m-                ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                              "X509_NAME_digest() failed");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (EVP_DigestUpdate(md, buf, len) == 0) {[m
[31m-                ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                              "EVP_DigestUpdate() failed");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (EVP_DigestFinal_ex(md, buf, &len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "EVP_DigestUpdate() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    EVP_MD_CTX_destroy(md);[m
[31m-[m
[31m-    if (SSL_CTX_set_session_id_context(ssl->ctx, buf, len) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_session_id_context() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    EVP_MD_CTX_destroy(md);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    size_t                    len;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-[m
[31m-    if (data) {[m
[31m-        shm_zone->data = data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        shm_zone->data = shpool->data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache = ngx_slab_alloc(shpool, sizeof(ngx_ssl_session_cache_t));[m
[31m-    if (cache == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shpool->data = cache;[m
[31m-    shm_zone->data = cache;[m
[31m-[m
[31m-    ngx_rbtree_init(&cache->session_rbtree, &cache->sentinel,[m
[31m-                    ngx_ssl_session_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&cache->expire_queue);[m
[31m-[m
[31m-    len = sizeof(" in SSL session shared cache \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in SSL session shared cache \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    shpool->log_nomem = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The length of the session id is 16 bytes for SSLv2 sessions and[m
[31m- * between 1 and 32 bytes for SSLv3/TLSv1, typically 32 bytes.[m
[31m- * It seems that the typical length of the external ASN1 representation[m
[31m- * of a session is 118 or 119 bytes for SSLv3/TSLv1.[m
[31m- *[m
[31m- * Thus on 32-bit platforms we allocate separately an rbtree node,[m
[31m- * a session id, and an ASN1 representation, they take accordingly[m
[31m- * 64, 32, and 128 bytes.[m
[31m- *[m
[31m- * On 64-bit platforms we allocate separately an rbtree node + session_id,[m
[31m- * and an ASN1 representation, they take accordingly 128 and 128 bytes.[m
[31m- *[m
[31m- * OpenSSL's i2d_SSL_SESSION() and d2i_SSL_SESSION are slow,[m
[31m- * so they are outside the code locked by shared pool mutex[m
[31m- */[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    int                       len;[m
[31m-    u_char                   *p, *id, *cached_sess, *session_id;[m
[31m-    uint32_t                  hash;[m
[31m-    SSL_CTX                  *ssl_ctx;[m
[31m-    unsigned int              session_id_length;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_connection_t         *c;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-    u_char                    buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-[m
[31m-    len = i2d_SSL_SESSION(sess, NULL);[m
[31m-[m
[31m-    /* do not cache too big session */[m
[31m-[m
[31m-    if (len > (int) NGX_SSL_MAX_SESSION_SIZE) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    p = buf;[m
[31m-    i2d_SSL_SESSION(sess, &p);[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ssl_ctx = c->ssl->session_ctx;[m
[31m-    shm_zone = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    /* drop one or two expired sessions */[m
[31m-    ngx_ssl_expire_sessions(cache, shpool, 1);[m
[31m-[m
[31m-    cached_sess = ngx_slab_alloc_locked(shpool, len);[m
[31m-[m
[31m-    if (cached_sess == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        cached_sess = ngx_slab_alloc_locked(shpool, len);[m
[31m-[m
[31m-        if (cached_sess == NULL) {[m
[31m-            sess_id = NULL;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));[m
[31m-[m
[31m-    if (sess_id == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));[m
[31m-[m
[31m-        if (sess_id == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    session_id = (u_char *) SSL_SESSION_get_id(sess, &session_id_length);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    session_id = sess->session_id;[m
[31m-    session_id_length = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-    id = sess_id->sess_id;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    id = ngx_slab_alloc_locked(shpool, session_id_length);[m
[31m-[m
[31m-    if (id == NULL) {[m
[31m-[m
[31m-        /* drop the oldest non-expired session and try once more */[m
[31m-[m
[31m-        ngx_ssl_expire_sessions(cache, shpool, 0);[m
[31m-[m
[31m-        id = ngx_slab_alloc_locked(shpool, session_id_length);[m
[31m-[m
[31m-        if (id == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memcpy(cached_sess, buf, len);[m
[31m-[m
[31m-    ngx_memcpy(id, session_id, session_id_length);[m
[31m-[m
[31m-    hash = ngx_crc32_short(session_id, session_id_length);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "ssl new session: %08XD:%ud:%d",[m
[31m-                   hash, session_id_length, len);[m
[31m-[m
[31m-    sess_id->node.key = hash;[m
[31m-    sess_id->node.data = (u_char) session_id_length;[m
[31m-    sess_id->id = id;[m
[31m-    sess_id->len = len;[m
[31m-    sess_id->session = cached_sess;[m
[31m-[m
[31m-    sess_id->expire = ngx_time() + SSL_CTX_get_timeout(ssl_ctx);[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->expire_queue, &sess_id->queue);[m
[31m-[m
[31m-    ngx_rbtree_insert(&cache->session_rbtree, &sess_id->node);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (cached_sess) {[m
[31m-        ngx_slab_free_locked(shpool, cached_sess);[m
[31m-    }[m
[31m-[m
[31m-    if (sess_id) {[m
[31m-        ngx_slab_free_locked(shpool, sess_id);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                  "could not allocate new session%s", shpool->log_ctx);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_ssl_session_t *[m
[31m-ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100003L[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char *id, int len, int *copy)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                   *p;[m
[31m-    uint32_t                  hash;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_rbtree_node_t        *node, *sentinel;[m
[31m-    ngx_ssl_session_t        *sess;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-    u_char                    buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-    ngx_connection_t         *c;[m
[31m-[m
[31m-    hash = ngx_crc32_short((u_char *) (uintptr_t) id, (size_t) len);[m
[31m-    *copy = 0;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "ssl get session: %08XD:%d", hash, len);[m
[31m-[m
[31m-    shm_zone = SSL_CTX_get_ex_data(c->ssl->session_ctx,[m
[31m-                                   ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-    sess = NULL;[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    node = cache->session_rbtree.root;[m
[31m-    sentinel = cache->session_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-[m
[31m-        rc = ngx_memn2cmp((u_char *) (uintptr_t) id, sess_id->id,[m
[31m-                          (size_t) len, (size_t) node->data);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-[m
[31m-            if (sess_id->expire > ngx_time()) {[m
[31m-                ngx_memcpy(buf, sess_id->session, sess_id->len);[m
[31m-[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-                p = buf;[m
[31m-                sess = d2i_SSL_SESSION(NULL, &p, sess_id->len);[m
[31m-[m
[31m-                return sess;[m
[31m-            }[m
[31m-[m
[31m-            ngx_queue_remove(&sess_id->queue);[m
[31m-[m
[31m-            ngx_rbtree_delete(&cache->session_rbtree, node);[m
[31m-[m
[31m-            ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-            ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-            ngx_slab_free_locked(shpool, sess_id);[m
[31m-[m
[31m-            sess = NULL;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-    return sess;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_remove_cached_session(SSL_CTX *ssl, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    SSL_CTX_remove_session(ssl, sess);[m
[31m-[m
[31m-    ngx_ssl_remove_session(ssl, sess);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess)[m
[31m-{[m
[31m-    u_char                   *id;[m
[31m-    uint32_t                  hash;[m
[31m-    ngx_int_t                 rc;[m
[31m-    unsigned int              len;[m
[31m-    ngx_shm_zone_t           *shm_zone;[m
[31m-    ngx_slab_pool_t          *shpool;[m
[31m-    ngx_rbtree_node_t        *node, *sentinel;[m
[31m-    ngx_ssl_sess_id_t        *sess_id;[m
[31m-    ngx_ssl_session_cache_t  *cache;[m
[31m-[m
[31m-    shm_zone = SSL_CTX_get_ex_data(ssl, ngx_ssl_session_cache_index);[m
[31m-[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    id = (u_char *) SSL_SESSION_get_id(sess, &len);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    id = sess->session_id;[m
[31m-    len = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    hash = ngx_crc32_short(id, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                   "ssl remove session: %08XD:%ud", hash, len);[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    node = cache->session_rbtree.root;[m
[31m-    sentinel = cache->session_rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(id, sess_id->id, len, (size_t) node->data);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-[m
[31m-            ngx_queue_remove(&sess_id->queue);[m
[31m-[m
[31m-            ngx_rbtree_delete(&cache->session_rbtree, node);[m
[31m-[m
[31m-            ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-            ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-            ngx_slab_free_locked(shpool, sess_id);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache,[m
[31m-    ngx_slab_pool_t *shpool, ngx_uint_t n)[m
[31m-{[m
[31m-    time_t              now;[m
[31m-    ngx_queue_t        *q;[m
[31m-    ngx_ssl_sess_id_t  *sess_id;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->expire_queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->expire_queue);[m
[31m-[m
[31m-        sess_id = ngx_queue_data(q, ngx_ssl_sess_id_t, queue);[m
[31m-[m
[31m-        if (n++ != 0 && sess_id->expire > now) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,[m
[31m-                       "expire session: %08Xi", sess_id->node.key);[m
[31m-[m
[31m-        ngx_rbtree_delete(&cache->session_rbtree, &sess_id->node);[m
[31m-[m
[31m-        ngx_slab_free_locked(shpool, sess_id->session);[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-        ngx_slab_free_locked(shpool, sess_id->id);[m
[31m-#endif[m
[31m-        ngx_slab_free_locked(shpool, sess_id);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t  **p;[m
[31m-    ngx_ssl_sess_id_t   *sess_id, *sess_id_temp;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            sess_id = (ngx_ssl_sess_id_t *) node;[m
[31m-            sess_id_temp = (ngx_ssl_sess_id_t *) temp;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(sess_id->id, sess_id_temp->id,[m
[31m-                              (size_t) node->data, (size_t) temp->data)[m
[31m-                 < 0) ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths)[m
[31m-{[m
[31m-    u_char                         buf[48];[m
[31m-    ssize_t                        n;[m
[31m-    ngx_str_t                     *path;[m
[31m-    ngx_file_t                     file;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_array_t                   *keys;[m
[31m-    ngx_file_info_t                fi;[m
[31m-    ngx_ssl_session_ticket_key_t  *key;[m
[31m-[m
[31m-    if (paths == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    keys = ngx_array_create(cf->pool, paths->nelts,[m
[31m-                            sizeof(ngx_ssl_session_ticket_key_t));[m
[31m-    if (keys == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    path = paths->elts;[m
[31m-    for (i = 0; i < paths->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_conf_full_name(cf->cycle, &path[i], 1) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-        file.name = path[i];[m
[31m-        file.log = cf->log;[m
[31m-[m
[31m-        file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, 0, 0);[m
[31m-        if (file.fd == NGX_INVALID_FILE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,[m
[31m-                               ngx_open_file_n " \"%V\" failed", &file.name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                               ngx_fd_info_n " \"%V\" failed", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_file_size(&fi) != 48) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" must be 48 bytes", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_read_file(&file, buf, 48, 0);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                               ngx_read_file_n " \"%V\" failed", &file.name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (n != 48) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, 0,[m
[31m-                               ngx_read_file_n " \"%V\" returned only "[m
[31m-                               "%z bytes instead of 48", &file.name, n);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        key = ngx_array_push(keys);[m
[31m-        if (key == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(key->name, buf, 16);[m
[31m-        ngx_memcpy(key->aes_key, buf + 16, 16);[m
[31m-        ngx_memcpy(key->hmac_key, buf + 32, 16);[m
[31m-[m
[31m-        if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%V\" failed", &file.name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_ticket_keys_index, keys)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_tlsext_ticket_key_cb(ssl->ctx,[m
[31m-                                         ngx_ssl_session_ticket_key_callback)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "nginx was built with Session Tickets support, however, "[m
[31m-                      "now it is linked dynamically to an OpenSSL library "[m
[31m-                      "which has no tlsext support, therefore Session Tickets "[m
[31m-                      "are not available");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%V\" failed", &file.name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef OPENSSL_NO_SHA256[m
[31m-#define ngx_ssl_session_ticket_md  EVP_sha1[m
[31m-#else[m
[31m-#define ngx_ssl_session_ticket_md  EVP_sha256[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_session_ticket_key_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx,[m
[31m-    HMAC_CTX *hctx, int enc)[m
[31m-{[m
[31m-    SSL_CTX                       *ssl_ctx;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_array_t                   *keys;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_ssl_session_ticket_key_t  *key;[m
[31m-#if (NGX_DEBUG)[m
[31m-    u_char                         buf[32];[m
[31m-#endif[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-    ssl_ctx = c->ssl->session_ctx;[m
[31m-[m
[31m-    keys = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_ticket_keys_index);[m
[31m-    if (keys == NULL) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    key = keys->elts;[m
[31m-[m
[31m-    if (enc == 1) {[m
[31m-        /* encrypt session ticket */[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket encrypt, key: \"%*s\" (%s session)",[m
[31m-                       ngx_hex_dump(buf, key[0].name, 16) - buf, buf,[m
[31m-                       SSL_session_reused(ssl_conn) ? "reused" : "new");[m
[31m-[m
[31m-        RAND_bytes(iv, 16);[m
[31m-        EVP_EncryptInit_ex(ectx, EVP_aes_128_cbc(), NULL, key[0].aes_key, iv);[m
[31m-        HMAC_Init_ex(hctx, key[0].hmac_key, 16,[m
[31m-                     ngx_ssl_session_ticket_md(), NULL);[m
[31m-        ngx_memcpy(name, key[0].name, 16);[m
[31m-[m
[31m-        return 0;[m
[31m-[m
[31m-    } else {[m
[31m-        /* decrypt session ticket */[m
[31m-[m
[31m-        for (i = 0; i < keys->nelts; i++) {[m
[31m-            if (ngx_memcmp(name, key[i].name, 16) == 0) {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket decrypt, key: \"%*s\" not found",[m
[31m-                       ngx_hex_dump(buf, name, 16) - buf, buf);[m
[31m-[m
[31m-        return 0;[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "ssl session ticket decrypt, key: \"%*s\"%s",[m
[31m-                       ngx_hex_dump(buf, key[i].name, 16) - buf, buf,[m
[31m-                       (i == 0) ? " (default)" : "");[m
[31m-[m
[31m-        HMAC_Init_ex(hctx, key[i].hmac_key, 16,[m
[31m-                     ngx_ssl_session_ticket_md(), NULL);[m
[31m-        EVP_DecryptInit_ex(ectx, EVP_aes_128_cbc(), NULL, key[i].aes_key, iv);[m
[31m-[m
[31m-        return (i == 0) ? 1 : 2 /* renew */;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths)[m
[31m-{[m
[31m-    if (paths) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                      "\"ssl_session_ticket_keys\" ignored, not supported");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_ssl_cleanup_ctx(void *data)[m
[31m-{[m
[31m-    ngx_ssl_t  *ssl = data;[m
[31m-[m
[31m-    SSL_CTX_free(ssl->ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_check_host(ngx_connection_t *c, ngx_str_t *name)[m
[31m-{[m
[31m-    X509   *cert;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10002002L[m
[31m-[m
[31m-    /* X509_check_host() is only available in OpenSSL 1.0.2+ */[m
[31m-[m
[31m-    if (name->len == 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_check_host(cert, (char *) name->data, name->len, 0, NULL) != 1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "X509_check_host(): no match");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "X509_check_host(): match");[m
[31m-[m
[31m-    goto found;[m
[31m-[m
[31m-#else[m
[31m-    {[m
[31m-    int                      n, i;[m
[31m-    X509_NAME               *sname;[m
[31m-    ASN1_STRING             *str;[m
[31m-    X509_NAME_ENTRY         *entry;[m
[31m-    GENERAL_NAME            *altname;[m
[31m-    STACK_OF(GENERAL_NAME)  *altnames;[m
[31m-[m
[31m-    /*[m
[31m-     * As per RFC6125 and RFC2818, we check subjectAltName extension,[m
[31m-     * and if it's not present - commonName in Subject is checked.[m
[31m-     */[m
[31m-[m
[31m-    altnames = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);[m
[31m-[m
[31m-    if (altnames) {[m
[31m-        n = sk_GENERAL_NAME_num(altnames);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            altname = sk_GENERAL_NAME_value(altnames, i);[m
[31m-[m
[31m-            if (altname->type != GEN_DNS) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            str = altname->d.dNSName;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL subjectAltName: \"%*s\"",[m
[31m-                           ASN1_STRING_length(str), ASN1_STRING_data(str));[m
[31m-[m
[31m-            if (ngx_ssl_check_name(name, str) == NGX_OK) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                               "SSL subjectAltName: match");[m
[31m-                GENERAL_NAMES_free(altnames);[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL subjectAltName: no match");[m
[31m-[m
[31m-        GENERAL_NAMES_free(altnames);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * If there is no subjectAltName extension, check commonName[m
[31m-     * in Subject.  While RFC2818 requires to only check "most specific"[m
[31m-     * CN, both Apache and OpenSSL check all CNs, and so do we.[m
[31m-     */[m
[31m-[m
[31m-    sname = X509_get_subject_name(cert);[m
[31m-[m
[31m-    if (sname == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    i = -1;[m
[31m-    for ( ;; ) {[m
[31m-        i = X509_NAME_get_index_by_NID(sname, NID_commonName, i);[m
[31m-[m
[31m-        if (i < 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        entry = X509_NAME_get_entry(sname, i);[m
[31m-        str = X509_NAME_ENTRY_get_data(entry);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "SSL commonName: \"%*s\"",[m
[31m-                       ASN1_STRING_length(str), ASN1_STRING_data(str));[m
[31m-[m
[31m-        if (ngx_ssl_check_name(name, str) == NGX_OK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "SSL commonName: match");[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL commonName: no match");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10002002L[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *pattern)[m
[31m-{[m
[31m-    u_char  *s, *p, *end;[m
[31m-    size_t   slen, plen;[m
[31m-[m
[31m-    s = name->data;[m
[31m-    slen = name->len;[m
[31m-[m
[31m-    p = ASN1_STRING_data(pattern);[m
[31m-    plen = ASN1_STRING_length(pattern);[m
[31m-[m
[31m-    if (slen == plen && ngx_strncasecmp(s, p, plen) == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (plen > 2 && p[0] == '*' && p[1] == '.') {[m
[31m-        plen -= 1;[m
[31m-        p += 1;[m
[31m-[m
[31m-        end = s + slen;[m
[31m-        s = ngx_strlchr(s, end, '.');[m
[31m-[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        slen = end - s;[m
[31m-[m
[31m-        if (plen == slen && ngx_strncasecmp(s, p, plen) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_protocol(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    s->data = (u_char *) SSL_get_version(c->ssl->connection);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_cipher_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    s->data = (u_char *) SSL_get_cipher_name(c->ssl->connection);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_session_id(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    u_char        *buf;[m
[31m-    SSL_SESSION   *sess;[m
[31m-    unsigned int   len;[m
[31m-[m
[31m-    sess = SSL_get0_session(c->ssl->connection);[m
[31m-    if (sess == NULL) {[m
[31m-        s->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090800fL[m
[31m-[m
[31m-    buf = (u_char *) SSL_SESSION_get_id(sess, &len);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    buf = sess->session_id;[m
[31m-    len = sess->session_id_length;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->len = 2 * len;[m
[31m-    s->data = ngx_pnalloc(pool, 2 * len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(s->data, buf, len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_session_reused(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    if (SSL_session_reused(c->ssl->connection)) {[m
[31m-        ngx_str_set(s, "r");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(s, ".");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    const char  *servername;[m
[31m-[m
[31m-    servername = SSL_get_servername(c->ssl->connection,[m
[31m-                                    TLSEXT_NAMETYPE_host_name);[m
[31m-    if (servername) {[m
[31m-        s->data = (u_char *) servername;[m
[31m-        s->len = ngx_strlen(servername);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->len = 0;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_raw_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    BIO     *bio;[m
[31m-    X509    *cert;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed");[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PEM_write_bio_X509(bio, cert) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "PEM_write_bio_X509() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = BIO_pending(bio);[m
[31m-    s->len = len;[m
[31m-[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    BIO_read(bio, s->data, len);[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    size_t       len;[m
[31m-    ngx_uint_t   i;[m
[31m-    ngx_str_t    cert;[m
[31m-[m
[31m-    if (ngx_ssl_get_raw_certificate(c, pool, &cert) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cert.len == 0) {[m
[31m-        s->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = cert.len - 1;[m
[31m-[m
[31m-    for (i = 0; i < cert.len - 1; i++) {[m
[31m-        if (cert.data[i] == LF) {[m
[31m-            len++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = s->data;[m
[31m-[m
[31m-    for (i = 0; i < cert.len - 1; i++) {[m
[31m-        *p++ = cert.data[i];[m
[31m-        if (cert.data[i] == LF) {[m
[31m-            *p++ = '\t';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    char       *p;[m
[31m-    size_t      len;[m
[31m-    X509       *cert;[m
[31m-    X509_NAME  *name;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    name = X509_get_subject_name(cert);[m
[31m-    if (name == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = X509_NAME_oneline(name, NULL, 0);[m
[31m-[m
[31m-    for (len = 0; p[len]; len++) { /* void */ }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        OPENSSL_free(p);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    OPENSSL_free(p);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    char       *p;[m
[31m-    size_t      len;[m
[31m-    X509       *cert;[m
[31m-    X509_NAME  *name;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    name = X509_get_issuer_name(cert);[m
[31m-    if (name == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = X509_NAME_oneline(name, NULL, 0);[m
[31m-[m
[31m-    for (len = 0; p[len]; len++) { /* void */ }[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        OPENSSL_free(p);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    OPENSSL_free(p);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    X509    *cert;[m
[31m-    BIO     *bio;[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    i2a_ASN1_INTEGER(bio, X509_get_serialNumber(cert));[m
[31m-    len = BIO_pending(bio);[m
[31m-[m
[31m-    s->len = len;[m
[31m-    s->data = ngx_pnalloc(pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        BIO_free(bio);[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    BIO_read(bio, s->data, len);[m
[31m-    BIO_free(bio);[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    X509          *cert;[m
[31m-    unsigned int   len;[m
[31m-    u_char         buf[EVP_MAX_MD_SIZE];[m
[31m-[m
[31m-    s->len = 0;[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-    if (cert == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!X509_digest(cert, EVP_sha1(), buf, &len)) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->len = 2 * len;[m
[31m-    s->data = ngx_pnalloc(pool, 2 * len);[m
[31m-    if (s->data == NULL) {[m
[31m-        X509_free(cert);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_hex_dump(s->data, buf, len);[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)[m
[31m-{[m
[31m-    X509  *cert;[m
[31m-[m
[31m-    if (SSL_get_verify_result(c->ssl->connection) != X509_V_OK) {[m
[31m-        ngx_str_set(s, "FAILED");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-    if (cert) {[m
[31m-        ngx_str_set(s, "SUCCESS");[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(s, "NONE");[m
[31m-    }[m
[31m-[m
[31m-    X509_free(cert);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_openssl_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_openssl_conf_t  *oscf;[m
[31m-[m
[31m-    oscf = ngx_pcalloc(cycle->pool, sizeof(ngx_openssl_conf_t));[m
[31m-    if (oscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     oscf->engine = 0;[m
[31m-     */[m
[31m-[m
[31m-    return oscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-[m
[31m-    ngx_openssl_conf_t *oscf = conf;[m
[31m-[m
[31m-    ENGINE     *engine;[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (oscf->engine) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    oscf->engine = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    engine = ENGINE_by_id((const char *) value[1].data);[m
[31m-[m
[31m-    if (engine == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "ENGINE_by_id(\"%V\") failed", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ENGINE_set_default(engine, ENGINE_METHOD_ALL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                      "ENGINE_set_default(\"%V\", ENGINE_METHOD_ALL) failed",[m
[31m-                      &value[1]);[m
[31m-[m
[31m-        ENGINE_free(engine);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ENGINE_free(engine);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    return "is not supported";[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_openssl_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x10100003L[m
[31m-[m
[31m-    EVP_cleanup();[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-    ENGINE_cleanup();[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.h[m
[1mdeleted file mode 100644[m
[1mindex 09654db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl.h[m
[1m+++ /dev/null[m
[36m@@ -1,233 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_OPENSSL_H_INCLUDED_[m
[31m-#define _NGX_EVENT_OPENSSL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#include <openssl/ssl.h>[m
[31m-#include <openssl/err.h>[m
[31m-#include <openssl/bn.h>[m
[31m-#include <openssl/conf.h>[m
[31m-#include <openssl/crypto.h>[m
[31m-#include <openssl/dh.h>[m
[31m-#ifndef OPENSSL_NO_ENGINE[m
[31m-#include <openssl/engine.h>[m
[31m-#endif[m
[31m-#include <openssl/evp.h>[m
[31m-#ifndef OPENSSL_NO_OCSP[m
[31m-#include <openssl/ocsp.h>[m
[31m-#endif[m
[31m-#include <openssl/rand.h>[m
[31m-#include <openssl/rsa.h>[m
[31m-#include <openssl/x509.h>[m
[31m-#include <openssl/x509v3.h>[m
[31m-[m
[31m-#define NGX_SSL_NAME     "OpenSSL"[m
[31m-[m
[31m-[m
[31m-#if (defined LIBRESSL_VERSION_NUMBER && OPENSSL_VERSION_NUMBER == 0x20000000L)[m
[31m-#undef OPENSSL_VERSION_NUMBER[m
[31m-#define OPENSSL_VERSION_NUMBER  0x1000107fL[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER >= 0x10100001L)[m
[31m-[m
[31m-#define ngx_ssl_version()       OpenSSL_version(OPENSSL_VERSION)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_ssl_version()       SSLeay_version(SSLEAY_VERSION)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_ssl_session_t       SSL_SESSION[m
[31m-#define ngx_ssl_conn_t          SSL[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    SSL_CTX                    *ctx;[m
[31m-    ngx_log_t                  *log;[m
[31m-    size_t                      buffer_size;[m
[31m-} ngx_ssl_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_ssl_conn_t             *connection;[m
[31m-    SSL_CTX                    *session_ctx;[m
[31m-[m
[31m-    ngx_int_t                   last;[m
[31m-    ngx_buf_t                  *buf;[m
[31m-    size_t                      buffer_size;[m
[31m-[m
[31m-    ngx_connection_handler_pt   handler;[m
[31m-[m
[31m-    ngx_event_handler_pt        saved_read_handler;[m
[31m-    ngx_event_handler_pt        saved_write_handler;[m
[31m-[m
[31m-    unsigned                    handshaked:1;[m
[31m-    unsigned                    renegotiation:1;[m
[31m-    unsigned                    buffer:1;[m
[31m-    unsigned                    no_wait_shutdown:1;[m
[31m-    unsigned                    no_send_shutdown:1;[m
[31m-    unsigned                    handshake_buffer_set:1;[m
[31m-} ngx_ssl_connection_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_NO_SCACHE            -2[m
[31m-#define NGX_SSL_NONE_SCACHE          -3[m
[31m-#define NGX_SSL_NO_BUILTIN_SCACHE    -4[m
[31m-#define NGX_SSL_DFLT_BUILTIN_SCACHE  -5[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_MAX_SESSION_SIZE  4096[m
[31m-[m
[31m-typedef struct ngx_ssl_sess_id_s  ngx_ssl_sess_id_t;[m
[31m-[m
[31m-struct ngx_ssl_sess_id_s {[m
[31m-    ngx_rbtree_node_t           node;[m
[31m-    u_char                     *id;[m
[31m-    size_t                      len;[m
[31m-    u_char                     *session;[m
[31m-    ngx_queue_t                 queue;[m
[31m-    time_t                      expire;[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-    void                       *stub;[m
[31m-    u_char                      sess_id[32];[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t                session_rbtree;[m
[31m-    ngx_rbtree_node_t           sentinel;[m
[31m-    ngx_queue_t                 expire_queue;[m
[31m-} ngx_ssl_session_cache_t;[m
[31m-[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                      name[16];[m
[31m-    u_char                      aes_key[16];[m
[31m-    u_char                      hmac_key[16];[m
[31m-} ngx_ssl_session_ticket_key_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_SSLv2    0x0002[m
[31m-#define NGX_SSL_SSLv3    0x0004[m
[31m-#define NGX_SSL_TLSv1    0x0008[m
[31m-#define NGX_SSL_TLSv1_1  0x0010[m
[31m-#define NGX_SSL_TLSv1_2  0x0020[m
[31m-[m
[31m-[m
[31m-#define NGX_SSL_BUFFER   1[m
[31m-#define NGX_SSL_CLIENT   2[m
[31m-[m
[31m-#define NGX_SSL_BUFSIZE  16384[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_ssl_init(ngx_log_t *log);[m
[31m-ngx_int_t ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data);[m
[31m-ngx_int_t ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *cert, ngx_str_t *key, ngx_array_t *passwords);[m
[31m-ngx_int_t ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *cert, ngx_int_t depth);[m
[31m-ngx_int_t ngx_ssl_trusted_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *cert, ngx_int_t depth);[m
[31m-ngx_int_t ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl);[m
[31m-ngx_int_t ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *file, ngx_str_t *responder, ngx_uint_t verify);[m
[31m-ngx_int_t ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_resolver_t *resolver, ngx_msec_t resolver_timeout);[m
[31m-RSA *ngx_ssl_rsa512_key_callback(ngx_ssl_conn_t *ssl_conn, int is_export,[m
[31m-    int key_length);[m
[31m-ngx_array_t *ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file);[m
[31m-ngx_int_t ngx_ssl_dhparam(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file);[m
[31m-ngx_int_t ngx_ssl_ecdh_curve(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *name);[m
[31m-ngx_int_t ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx,[m
[31m-    ssize_t builtin_session_cache, ngx_shm_zone_t *shm_zone, time_t timeout);[m
[31m-ngx_int_t ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_array_t *paths);[m
[31m-ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data);[m
[31m-ngx_int_t ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c,[m
[31m-    ngx_uint_t flags);[m
[31m-[m
[31m-void ngx_ssl_remove_cached_session(SSL_CTX *ssl, ngx_ssl_session_t *sess);[m
[31m-ngx_int_t ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session);[m
[31m-#define ngx_ssl_get_session(c)      SSL_get1_session(c->ssl->connection)[m
[31m-#define ngx_ssl_free_session        SSL_SESSION_free[m
[31m-#define ngx_ssl_get_connection(ssl_conn)                                      \[m
[31m-    SSL_get_ex_data(ssl_conn, ngx_ssl_connection_index)[m
[31m-#define ngx_ssl_get_server_conf(ssl_ctx)                                      \[m
[31m-    SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_server_conf_index)[m
[31m-[m
[31m-#define ngx_ssl_verify_error_optional(n)                                      \[m
[31m-    (n == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT                              \[m
[31m-     || n == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN                             \[m
[31m-     || n == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY                     \[m
[31m-     || n == X509_V_ERR_CERT_UNTRUSTED                                        \[m
[31m-     || n == X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE)[m
[31m-[m
[31m-ngx_int_t ngx_ssl_check_host(ngx_connection_t *c, ngx_str_t *name);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_ssl_get_protocol(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_cipher_name(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_session_id(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_session_reused(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_raw_certificate(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_certificate(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-ngx_int_t ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool,[m
[31m-    ngx_str_t *s);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_ssl_handshake(ngx_connection_t *c);[m
[31m-ssize_t ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size);[m
[31m-ssize_t ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit);[m
[31m-ngx_chain_t *ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-void ngx_ssl_free_buffer(ngx_connection_t *c);[m
[31m-ngx_int_t ngx_ssl_shutdown(ngx_connection_t *c);[m
[31m-void ngx_cdecl ngx_ssl_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,[m
[31m-    char *fmt, ...);[m
[31m-void ngx_ssl_cleanup_ctx(void *data);[m
[31m-[m
[31m-[m
[31m-extern int  ngx_ssl_connection_index;[m
[31m-extern int  ngx_ssl_server_conf_index;[m
[31m-extern int  ngx_ssl_session_cache_index;[m
[31m-extern int  ngx_ssl_session_ticket_keys_index;[m
[31m-extern int  ngx_ssl_certificate_index;[m
[31m-extern int  ngx_ssl_stapling_index;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_OPENSSL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl_stapling.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl_stapling.c[m
[1mdeleted file mode 100644[m
[1mindex 5322b1b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_openssl_stapling.c[m
[1m+++ /dev/null[m
[36m@@ -1,1830 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-[m
[31m-[m
[31m-#if (!defined OPENSSL_NO_OCSP && defined SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                    staple;[m
[31m-    ngx_msec_t                   timeout;[m
[31m-[m
[31m-    ngx_resolver_t              *resolver;[m
[31m-    ngx_msec_t                   resolver_timeout;[m
[31m-[m
[31m-    ngx_addr_t                  *addrs;[m
[31m-    ngx_str_t                    host;[m
[31m-    ngx_str_t                    uri;[m
[31m-    in_port_t                    port;[m
[31m-[m
[31m-    SSL_CTX                     *ssl_ctx;[m
[31m-[m
[31m-    X509                        *cert;[m
[31m-    X509                        *issuer;[m
[31m-[m
[31m-    time_t                       valid;[m
[31m-    time_t                       refresh;[m
[31m-[m
[31m-    unsigned                     verify:1;[m
[31m-    unsigned                     loading:1;[m
[31m-} ngx_ssl_stapling_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_ssl_ocsp_ctx_s  ngx_ssl_ocsp_ctx_t;[m
[31m-[m
[31m-struct ngx_ssl_ocsp_ctx_s {[m
[31m-    X509                        *cert;[m
[31m-    X509                        *issuer;[m
[31m-[m
[31m-    ngx_uint_t                   naddrs;[m
[31m-[m
[31m-    ngx_addr_t                  *addrs;[m
[31m-    ngx_str_t                    host;[m
[31m-    ngx_str_t                    uri;[m
[31m-    in_port_t                    port;[m
[31m-[m
[31m-    ngx_resolver_t              *resolver;[m
[31m-    ngx_msec_t                   resolver_timeout;[m
[31m-[m
[31m-    ngx_msec_t                   timeout;[m
[31m-[m
[31m-    void                       (*handler)(ngx_ssl_ocsp_ctx_t *r);[m
[31m-    void                        *data;[m
[31m-[m
[31m-    ngx_buf_t                   *request;[m
[31m-    ngx_buf_t                   *response;[m
[31m-    ngx_peer_connection_t        peer;[m
[31m-[m
[31m-    ngx_int_t                  (*process)(ngx_ssl_ocsp_ctx_t *r);[m
[31m-[m
[31m-    ngx_uint_t                   state;[m
[31m-[m
[31m-    ngx_uint_t                   code;[m
[31m-    ngx_uint_t                   count;[m
[31m-[m
[31m-    ngx_uint_t                   done;[m
[31m-[m
[31m-    u_char                      *header_name_start;[m
[31m-    u_char                      *header_name_end;[m
[31m-    u_char                      *header_start;[m
[31m-    u_char                      *header_end;[m
[31m-[m
[31m-    ngx_pool_t                  *pool;[m
[31m-    ngx_log_t                   *log;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_ssl_stapling_file(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *file);[m
[31m-static ngx_int_t ngx_ssl_stapling_issuer(ngx_conf_t *cf, ngx_ssl_t *ssl);[m
[31m-static ngx_int_t ngx_ssl_stapling_responder(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_str_t *responder);[m
[31m-[m
[31m-static int ngx_ssl_certificate_status_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    void *data);[m
[31m-static void ngx_ssl_stapling_update(ngx_ssl_stapling_t *staple);[m
[31m-static void ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-[m
[31m-static time_t ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time);[m
[31m-[m
[31m-static void ngx_ssl_stapling_cleanup(void *data);[m
[31m-[m
[31m-static ngx_ssl_ocsp_ctx_t *ngx_ssl_ocsp_start(void);[m
[31m-static void ngx_ssl_ocsp_done(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static void ngx_ssl_ocsp_request(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static void ngx_ssl_ocsp_resolve_handler(ngx_resolver_ctx_t *resolve);[m
[31m-static void ngx_ssl_ocsp_connect(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static void ngx_ssl_ocsp_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_ssl_ocsp_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_ssl_ocsp_dummy_handler(ngx_event_t *ev);[m
[31m-[m
[31m-static ngx_int_t ngx_ssl_ocsp_create_request(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_process_status_line(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_parse_status_line(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_process_headers(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_parse_header_line(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_ssl_ocsp_process_body(ngx_ssl_ocsp_ctx_t *ctx);[m
[31m-[m
[31m-static u_char *ngx_ssl_ocsp_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file,[m
[31m-    ngx_str_t *responder, ngx_uint_t verify)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_pool_cleanup_t        *cln;[m
[31m-    ngx_ssl_stapling_t        *staple;[m
[31m-[m
[31m-    staple = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_stapling_t));[m
[31m-    if (staple == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_stapling_cleanup;[m
[31m-    cln->data = staple;[m
[31m-[m
[31m-    if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_stapling_index, staple)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_set_ex_data() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    staple->ssl_ctx = ssl->ctx;[m
[31m-    staple->timeout = 60000;[m
[31m-    staple->verify = verify;[m
[31m-[m
[31m-    if (file->len) {[m
[31m-        /* use OCSP response from the file */[m
[31m-[m
[31m-        if (ngx_ssl_stapling_file(cf, ssl, file) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_ssl_stapling_issuer(cf, ssl);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_ssl_stapling_responder(cf, ssl, responder);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    SSL_CTX_set_tlsext_status_cb(ssl->ctx, ngx_ssl_certificate_status_callback);[m
[31m-    SSL_CTX_set_tlsext_status_arg(ssl->ctx, staple);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_stapling_file(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file)[m
[31m-{[m
[31m-    BIO                 *bio;[m
[31m-    int                  len;[m
[31m-    u_char              *p, *buf;[m
[31m-    OCSP_RESPONSE       *response;[m
[31m-    ngx_ssl_stapling_t  *staple;[m
[31m-[m
[31m-    staple = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_stapling_index);[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_file((char *) file->data, "r");[m
[31m-    if (bio == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "BIO_new_file(\"%s\") failed", file->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    response = d2i_OCSP_RESPONSE_bio(bio, NULL);[m
[31m-    if (response == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "d2i_OCSP_RESPONSE_bio(\"%s\") failed", file->data);[m
[31m-        BIO_free(bio);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = i2d_OCSP_RESPONSE(response, NULL);[m
[31m-    if (len <= 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "i2d_OCSP_RESPONSE(\"%s\") failed", file->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_alloc(len, ssl->log);[m
[31m-    if (buf == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    p = buf;[m
[31m-    len = i2d_OCSP_RESPONSE(response, &p);[m
[31m-    if (len <= 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "i2d_OCSP_RESPONSE(\"%s\") failed", file->data);[m
[31m-        ngx_free(buf);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    OCSP_RESPONSE_free(response);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    staple->staple.data = buf;[m
[31m-    staple->staple.len = len;[m
[31m-    staple->valid = NGX_MAX_TIME_T_VALUE;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    OCSP_RESPONSE_free(response);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_stapling_issuer(ngx_conf_t *cf, ngx_ssl_t *ssl)[m
[31m-{[m
[31m-    int                  i, n, rc;[m
[31m-    X509                *cert, *issuer;[m
[31m-    X509_STORE          *store;[m
[31m-    X509_STORE_CTX      *store_ctx;[m
[31m-    STACK_OF(X509)      *chain;[m
[31m-    ngx_ssl_stapling_t  *staple;[m
[31m-[m
[31m-    staple = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_stapling_index);[m
[31m-    cert = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_certificate_index);[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10001000L[m
[31m-    SSL_CTX_get_extra_chain_certs(ssl->ctx, &chain);[m
[31m-#else[m
[31m-    chain = ssl->ctx->extra_certs;[m
[31m-#endif[m
[31m-[m
[31m-    n = sk_X509_num(chain);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0,[m
[31m-                   "SSL get issuer: %d extra certs", n);[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        issuer = sk_X509_value(chain, i);[m
[31m-        if (X509_check_issued(issuer, cert) == X509_V_OK) {[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10100001L[m
[31m-            X509_up_ref(issuer);[m
[31m-#else[m
[31m-            CRYPTO_add(&issuer->references, 1, CRYPTO_LOCK_X509);[m
[31m-#endif[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0,[m
[31m-                           "SSL get issuer: found %p in extra certs", issuer);[m
[31m-[m
[31m-            staple->cert = cert;[m
[31m-            staple->issuer = issuer;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    store = SSL_CTX_get_cert_store(ssl->ctx);[m
[31m-    if (store == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "SSL_CTX_get_cert_store() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    store_ctx = X509_STORE_CTX_new();[m
[31m-    if (store_ctx == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_CTX_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_STORE_CTX_init(store_ctx, store, NULL, NULL) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_CTX_init() failed");[m
[31m-        X509_STORE_CTX_free(store_ctx);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = X509_STORE_CTX_get1_issuer(&issuer, store_ctx, cert);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,[m
[31m-                      "X509_STORE_CTX_get1_issuer() failed");[m
[31m-        X509_STORE_CTX_free(store_ctx);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                      "\"ssl_stapling\" ignored, issuer certificate not found");[m
[31m-        X509_STORE_CTX_free(store_ctx);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    X509_STORE_CTX_free(store_ctx);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0,[m
[31m-                   "SSL get issuer: found %p in cert store", issuer);[m
[31m-[m
[31m-    staple->cert = cert;[m
[31m-    staple->issuer = issuer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_stapling_responder(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *responder)[m
[31m-{[m
[31m-    ngx_url_t                  u;[m
[31m-    char                      *s;[m
[31m-    ngx_ssl_stapling_t        *staple;[m
[31m-    STACK_OF(OPENSSL_STRING)  *aia;[m
[31m-[m
[31m-    staple = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_stapling_index);[m
[31m-[m
[31m-    if (responder->len == 0) {[m
[31m-[m
[31m-        /* extract OCSP responder URL from certificate */[m
[31m-[m
[31m-        aia = X509_get1_ocsp(staple->cert);[m
[31m-        if (aia == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                          "\"ssl_stapling\" ignored, "[m
[31m-                          "no OCSP responder URL in the certificate");[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10000000L[m
[31m-        s = sk_OPENSSL_STRING_value(aia, 0);[m
[31m-#else[m
[31m-        s = sk_value(aia, 0);[m
[31m-#endif[m
[31m-        if (s == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                          "\"ssl_stapling\" ignored, "[m
[31m-                          "no OCSP responder URL in the certificate");[m
[31m-            X509_email_free(aia);[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        responder->len = ngx_strlen(s);[m
[31m-        responder->data = ngx_palloc(cf->pool, responder->len);[m
[31m-        if (responder->data == NULL) {[m
[31m-            X509_email_free(aia);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(responder->data, s, responder->len);[m
[31m-        X509_email_free(aia);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = *responder;[m
[31m-    u.default_port = 80;[m
[31m-    u.uri_part = 1;[m
[31m-[m
[31m-    if (u.url.len > 7[m
[31m-        && ngx_strncasecmp(u.url.data, (u_char *) "http://", 7) == 0)[m
[31m-    {[m
[31m-        u.url.len -= 7;[m
[31m-        u.url.data += 7;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                      "\"ssl_stapling\" ignored, "[m
[31m-                      "invalid URL prefix in OCSP responder \"%V\"", &u.url);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                          "\"ssl_stapling\" ignored, "[m
[31m-                          "%s in OCSP responder \"%V\"", u.err, &u.url);[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    staple->addrs = u.addrs;[m
[31m-    staple->host = u.host;[m
[31m-    staple->uri = u.uri;[m
[31m-    staple->port = u.port;[m
[31m-[m
[31m-    if (staple->uri.len == 0) {[m
[31m-        ngx_str_set(&staple->uri, "/");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_resolver_t *resolver, ngx_msec_t resolver_timeout)[m
[31m-{[m
[31m-    ngx_ssl_stapling_t  *staple;[m
[31m-[m
[31m-    staple = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_stapling_index);[m
[31m-[m
[31m-    staple->resolver = resolver;[m
[31m-    staple->resolver_timeout = resolver_timeout;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_ssl_certificate_status_callback(ngx_ssl_conn_t *ssl_conn, void *data)[m
[31m-{[m
[31m-    int                  rc;[m
[31m-    u_char              *p;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_ssl_stapling_t  *staple;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "SSL certificate status callback");[m
[31m-[m
[31m-    staple = data;[m
[31m-    rc = SSL_TLSEXT_ERR_NOACK;[m
[31m-[m
[31m-    if (staple->staple.len[m
[31m-        && staple->valid >= ngx_time())[m
[31m-    {[m
[31m-        /* we have to copy ocsp response as OpenSSL will free it by itself */[m
[31m-[m
[31m-        p = OPENSSL_malloc(staple->staple.len);[m
[31m-        if (p == NULL) {[m
[31m-            ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "OPENSSL_malloc() failed");[m
[31m-            return SSL_TLSEXT_ERR_NOACK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, staple->staple.data, staple->staple.len);[m
[31m-[m
[31m-        SSL_set_tlsext_status_ocsp_resp(ssl_conn, p, staple->staple.len);[m
[31m-[m
[31m-        rc = SSL_TLSEXT_ERR_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_stapling_update(staple);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_stapling_update(ngx_ssl_stapling_t *staple)[m
[31m-{[m
[31m-    ngx_ssl_ocsp_ctx_t  *ctx;[m
[31m-[m
[31m-    if (staple->host.len == 0[m
[31m-        || staple->loading || staple->refresh >= ngx_time())[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    staple->loading = 1;[m
[31m-[m
[31m-    ctx = ngx_ssl_ocsp_start();[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cert = staple->cert;[m
[31m-    ctx->issuer = staple->issuer;[m
[31m-[m
[31m-    ctx->addrs = staple->addrs;[m
[31m-    ctx->host = staple->host;[m
[31m-    ctx->uri = staple->uri;[m
[31m-    ctx->port = staple->port;[m
[31m-    ctx->timeout = staple->timeout;[m
[31m-[m
[31m-    ctx->resolver = staple->resolver;[m
[31m-    ctx->resolver_timeout = staple->resolver_timeout;[m
[31m-[m
[31m-    ctx->handler = ngx_ssl_stapling_ocsp_handler;[m
[31m-    ctx->data = staple;[m
[31m-[m
[31m-    ngx_ssl_ocsp_request(ctx);[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                *p;[m
[31m-    int                    n;[m
[31m-    size_t                 len;[m
[31m-    time_t                 now, valid;[m
[31m-    ngx_str_t              response;[m
[31m-    X509_STORE            *store;[m
[31m-    STACK_OF(X509)        *chain;[m
[31m-    OCSP_CERTID           *id;[m
[31m-    OCSP_RESPONSE         *ocsp;[m
[31m-    OCSP_BASICRESP        *basic;[m
[31m-    ngx_ssl_stapling_t    *staple;[m
[31m-    ASN1_GENERALIZEDTIME  *thisupdate, *nextupdate;[m
[31m-[m
[31m-    staple = ctx->data;[m
[31m-    now = ngx_time();[m
[31m-    ocsp = NULL;[m
[31m-    basic = NULL;[m
[31m-    id = NULL;[m
[31m-[m
[31m-    if (ctx->code != 200) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    /* check the response */[m
[31m-[m
[31m-    len = ctx->response->last - ctx->response->pos;[m
[31m-    p = ctx->response->pos;[m
[31m-[m
[31m-    ocsp = d2i_OCSP_RESPONSE(NULL, &p, len);[m
[31m-    if (ocsp == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "d2i_OCSP_RESPONSE() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    n = OCSP_response_status(ocsp);[m
[31m-[m
[31m-    if (n != OCSP_RESPONSE_STATUS_SUCCESSFUL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP response not successful (%d: %s)",[m
[31m-                      n, OCSP_response_status_str(n));[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    basic = OCSP_response_get1_basic(ocsp);[m
[31m-    if (basic == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP_response_get1_basic() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    store = SSL_CTX_get_cert_store(staple->ssl_ctx);[m
[31m-    if (store == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "SSL_CTX_get_cert_store() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10001000L[m
[31m-    SSL_CTX_get_extra_chain_certs(staple->ssl_ctx, &chain);[m
[31m-#else[m
[31m-    chain = staple->ssl_ctx->extra_certs;[m
[31m-#endif[m
[31m-[m
[31m-    if (OCSP_basic_verify(basic, chain, store,[m
[31m-                          staple->verify ? OCSP_TRUSTOTHER : OCSP_NOVERIFY)[m
[31m-        != 1)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP_basic_verify() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    id = OCSP_cert_to_id(NULL, ctx->cert, ctx->issuer);[m
[31m-    if (id == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "OCSP_cert_to_id() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_resp_find_status(basic, id, &n, NULL, NULL,[m
[31m-                              &thisupdate, &nextupdate)[m
[31m-        != 1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "certificate status not found in the OCSP response");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (n != V_OCSP_CERTSTATUS_GOOD) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "certificate status \"%s\" in the OCSP response",[m
[31m-                      OCSP_cert_status_str(n));[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_check_validity(thisupdate, nextupdate, 300, -1) != 1) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP_check_validity() failed");[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (nextupdate) {[m
[31m-        valid = ngx_ssl_stapling_time(nextupdate);[m
[31m-        if (valid == (time_t) NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                          "invalid nextUpdate time in certificate status");[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        valid = NGX_MAX_TIME_T_VALUE;[m
[31m-    }[m
[31m-[m
[31m-    OCSP_CERTID_free(id);[m
[31m-    OCSP_BASICRESP_free(basic);[m
[31m-    OCSP_RESPONSE_free(ocsp);[m
[31m-[m
[31m-    id = NULL;[m
[31m-    basic = NULL;[m
[31m-    ocsp = NULL;[m
[31m-[m
[31m-    /* copy the response to memory not in ctx->pool */[m
[31m-[m
[31m-    response.len = len;[m
[31m-    response.data = ngx_alloc(response.len, ctx->log);[m
[31m-[m
[31m-    if (response.data == NULL) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(response.data, ctx->response->pos, response.len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp response, %s, %uz",[m
[31m-                   OCSP_cert_status_str(n), response.len);[m
[31m-[m
[31m-    if (staple->staple.data) {[m
[31m-        ngx_free(staple->staple.data);[m
[31m-    }[m
[31m-[m
[31m-    staple->staple = response;[m
[31m-    staple->valid = valid;[m
[31m-[m
[31m-    /*[m
[31m-     * refresh before the response expires,[m
[31m-     * but not earlier than in 5 minutes, and at least in an hour[m
[31m-     */[m
[31m-[m
[31m-    staple->loading = 0;[m
[31m-    staple->refresh = ngx_max(ngx_min(valid - 300, now + 3600), now + 300);[m
[31m-[m
[31m-    ngx_ssl_ocsp_done(ctx);[m
[31m-    return;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    staple->loading = 0;[m
[31m-    staple->refresh = now + 300;[m
[31m-[m
[31m-    if (id) {[m
[31m-        OCSP_CERTID_free(id);[m
[31m-    }[m
[31m-[m
[31m-    if (basic) {[m
[31m-        OCSP_BASICRESP_free(basic);[m
[31m-    }[m
[31m-[m
[31m-    if (ocsp) {[m
[31m-        OCSP_RESPONSE_free(ocsp);[m
[31m-    }[m
[31m-[m
[31m-    ngx_ssl_ocsp_done(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time)[m
[31m-{[m
[31m-    u_char  *value;[m
[31m-    size_t   len;[m
[31m-    time_t   time;[m
[31m-    BIO     *bio;[m
[31m-[m
[31m-    /*[m
[31m-     * OpenSSL doesn't provide a way to convert ASN1_GENERALIZEDTIME[m
[31m-     * into time_t.  To do this, we use ASN1_GENERALIZEDTIME_print(),[m
[31m-     * which uses the "MMM DD HH:MM:SS YYYY [GMT]" format (e.g.,[m
[31m-     * "Feb  3 00:55:52 2015 GMT"), and parse the result.[m
[31m-     */[m
[31m-[m
[31m-    bio = BIO_new(BIO_s_mem());[m
[31m-    if (bio == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* fake weekday prepended to match C asctime() format */[m
[31m-[m
[31m-    BIO_write(bio, "Tue ", sizeof("Tue ") - 1);[m
[31m-    ASN1_GENERALIZEDTIME_print(bio, asn1time);[m
[31m-    len = BIO_get_mem_data(bio, &value);[m
[31m-[m
[31m-    time = ngx_parse_http_time(value, len);[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return time;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_stapling_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_ssl_stapling_t  *staple = data;[m
[31m-[m
[31m-    if (staple->issuer) {[m
[31m-        X509_free(staple->issuer);[m
[31m-    }[m
[31m-[m
[31m-    if (staple->staple.data) {[m
[31m-        ngx_free(staple->staple.data);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_ssl_ocsp_ctx_t *[m
[31m-ngx_ssl_ocsp_start(void)[m
[31m-{[m
[31m-    ngx_log_t           *log;[m
[31m-    ngx_pool_t          *pool;[m
[31m-    ngx_ssl_ocsp_ctx_t  *ctx;[m
[31m-[m
[31m-    pool = ngx_create_pool(2048, ngx_cycle->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(pool, sizeof(ngx_ssl_ocsp_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    log = ngx_palloc(pool, sizeof(ngx_log_t));[m
[31m-    if (log == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->pool = pool;[m
[31m-[m
[31m-    *log = *ctx->pool->log;[m
[31m-[m
[31m-    ctx->pool->log = log;[m
[31m-    ctx->log = log;[m
[31m-[m
[31m-    log->handler = ngx_ssl_ocsp_log_error;[m
[31m-    log->data = ctx;[m
[31m-    log->action = "requesting certificate status";[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_done(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp done");[m
[31m-[m
[31m-    if (ctx->peer.connection) {[m
[31m-        ngx_close_connection(ctx->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(ctx->pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_error(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp error");[m
[31m-[m
[31m-    ctx->code = 0;[m
[31m-    ctx->handler(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_request(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t  *resolve, temp;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp request");[m
[31m-[m
[31m-    if (ngx_ssl_ocsp_create_request(ctx) != NGX_OK) {[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->resolver) {[m
[31m-        /* resolve OCSP responder hostname */[m
[31m-[m
[31m-        temp.name = ctx->host;[m
[31m-[m
[31m-        resolve = ngx_resolve_start(ctx->resolver, &temp);[m
[31m-        if (resolve == NULL) {[m
[31m-            ngx_ssl_ocsp_error(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (resolve == NGX_NO_RESOLVER) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, ctx->log, 0,[m
[31m-                          "no resolver defined to resolve %V", &ctx->host);[m
[31m-            goto connect;[m
[31m-        }[m
[31m-[m
[31m-        resolve->name = ctx->host;[m
[31m-        resolve->handler = ngx_ssl_ocsp_resolve_handler;[m
[31m-        resolve->data = ctx;[m
[31m-        resolve->timeout = ctx->resolver_timeout;[m
[31m-[m
[31m-        if (ngx_resolve_name(resolve) != NGX_OK) {[m
[31m-            ngx_ssl_ocsp_error(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-connect:[m
[31m-[m
[31m-    ngx_ssl_ocsp_connect(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_resolve_handler(ngx_resolver_ctx_t *resolve)[m
[31m-{[m
[31m-    ngx_ssl_ocsp_ctx_t *ctx = resolve->data;[m
[31m-[m
[31m-    u_char           *p;[m
[31m-    size_t            len;[m
[31m-    in_port_t         port;[m
[31m-    socklen_t         socklen;[m
[31m-    ngx_uint_t        i;[m
[31m-    struct sockaddr  *sockaddr;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp resolve handler");[m
[31m-[m
[31m-    if (resolve->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "%V could not be resolved (%i: %s)",[m
[31m-                      &resolve->name, resolve->state,[m
[31m-                      ngx_resolver_strerror(resolve->state));[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t  addr;[m
[31m-[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < resolve->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(resolve->addrs[i].sockaddr,[m
[31m-                                 resolve->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx->naddrs = resolve->naddrs;[m
[31m-    ctx->addrs = ngx_pcalloc(ctx->pool, ctx->naddrs * sizeof(ngx_addr_t));[m
[31m-[m
[31m-    if (ctx->addrs == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    port = htons(ctx->port);[m
[31m-[m
[31m-    for (i = 0; i < resolve->naddrs; i++) {[m
[31m-[m
[31m-        socklen = resolve->addrs[i].socklen;[m
[31m-[m
[31m-        sockaddr = ngx_palloc(ctx->pool, socklen);[m
[31m-        if (sockaddr == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(sockaddr, resolve->addrs[i].sockaddr, socklen);[m
[31m-[m
[31m-        switch (sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            ((struct sockaddr_in6 *) sockaddr)->sin6_port = port;[m
[31m-            break;[m
[31m-#endif[m
[31m-        default: /* AF_INET */[m
[31m-            ((struct sockaddr_in *) sockaddr)->sin_port = port;[m
[31m-        }[m
[31m-[m
[31m-        ctx->addrs[i].sockaddr = sockaddr;[m
[31m-        ctx->addrs[i].socklen = socklen;[m
[31m-[m
[31m-        p = ngx_pnalloc(ctx->pool, NGX_SOCKADDR_STRLEN);[m
[31m-        if (p == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        ctx->addrs[i].name.len = len;[m
[31m-        ctx->addrs[i].name.data = p;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(resolve);[m
[31m-[m
[31m-    ngx_ssl_ocsp_connect(ctx);[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_resolve_name_done(resolve);[m
[31m-    ngx_ssl_ocsp_error(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_connect(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t    rc;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp connect");[m
[31m-[m
[31m-    /* TODO: use all ip addresses */[m
[31m-[m
[31m-    ctx->peer.sockaddr = ctx->addrs[0].sockaddr;[m
[31m-    ctx->peer.socklen = ctx->addrs[0].socklen;[m
[31m-    ctx->peer.name = &ctx->addrs[0].name;[m
[31m-    ctx->peer.get = ngx_event_get_peer;[m
[31m-    ctx->peer.log = ctx->log;[m
[31m-    ctx->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&ctx->peer);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp connect peer done");[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->peer.connection->data = ctx;[m
[31m-    ctx->peer.connection->pool = ctx->pool;[m
[31m-[m
[31m-    ctx->peer.connection->read->handler = ngx_ssl_ocsp_read_handler;[m
[31m-    ctx->peer.connection->write->handler = ngx_ssl_ocsp_write_handler;[m
[31m-[m
[31m-    ctx->process = ngx_ssl_ocsp_process_status_line;[m
[31m-[m
[31m-    ngx_add_timer(ctx->peer.connection->read, ctx->timeout);[m
[31m-    ngx_add_timer(ctx->peer.connection->write, ctx->timeout);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        ngx_ssl_ocsp_write_handler(ctx->peer.connection->write);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ssize_t              n, size;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_ssl_ocsp_ctx_t  *ctx;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    ctx = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0,[m
[31m-                   "ssl ocsp write handler");[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT,[m
[31m-                      "OCSP responder timed out");[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    size = ctx->request->last - ctx->request->pos;[m
[31m-[m
[31m-    n = ngx_send(c, ctx->request->pos, size);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        ctx->request->pos += n;[m
[31m-[m
[31m-        if (n == size) {[m
[31m-            wev->handler = ngx_ssl_ocsp_dummy_handler;[m
[31m-[m
[31m-            if (wev->timer_set) {[m
[31m-                ngx_del_timer(wev);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-                ngx_ssl_ocsp_error(ctx);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!wev->timer_set) {[m
[31m-        ngx_add_timer(wev, ctx->timeout);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t            n, size;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_ssl_ocsp_ctx_t    *ctx;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    ctx = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0,[m
[31m-                   "ssl ocsp read handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT,[m
[31m-                      "OCSP responder timed out");[m
[31m-        ngx_ssl_ocsp_error(ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->response == NULL) {[m
[31m-        ctx->response = ngx_create_temp_buf(ctx->pool, 16384);[m
[31m-        if (ctx->response == NULL) {[m
[31m-            ngx_ssl_ocsp_error(ctx);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        size = ctx->response->end - ctx->response->last;[m
[31m-[m
[31m-        n = ngx_recv(c, ctx->response->last, size);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            ctx->response->last += n;[m
[31m-[m
[31m-            rc = ctx->process(ctx);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                ngx_ssl_ocsp_error(ctx);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_ssl_ocsp_error(ctx);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    rc = ctx->process(ctx);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        /* ctx->handler() was called */[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                  "OCSP responder prematurely closed connection");[m
[31m-[m
[31m-    ngx_ssl_ocsp_error(ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_ssl_ocsp_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "ssl ocsp dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_create_request(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    int            len;[m
[31m-    u_char        *p;[m
[31m-    uintptr_t      escape;[m
[31m-    ngx_str_t      binary, base64;[m
[31m-    ngx_buf_t     *b;[m
[31m-    OCSP_CERTID   *id;[m
[31m-    OCSP_REQUEST  *ocsp;[m
[31m-[m
[31m-    ocsp = OCSP_REQUEST_new();[m
[31m-    if (ocsp == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "OCSP_REQUEST_new() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    id = OCSP_cert_to_id(NULL, ctx->cert, ctx->issuer);[m
[31m-    if (id == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "OCSP_cert_to_id() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_request_add0_id(ocsp, id) == NULL) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "OCSP_request_add0_id() failed");[m
[31m-        OCSP_CERTID_free(id);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = i2d_OCSP_REQUEST(ocsp, NULL);[m
[31m-    if (len <= 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "i2d_OCSP_REQUEST() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    binary.len = len;[m
[31m-    binary.data = ngx_palloc(ctx->pool, len);[m
[31m-    if (binary.data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    p = binary.data;[m
[31m-    len = i2d_OCSP_REQUEST(ocsp, &p);[m
[31m-    if (len <= 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, ctx->log, 0,[m
[31m-                      "i2d_OCSP_REQUEST() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    base64.len = ngx_base64_encoded_length(binary.len);[m
[31m-    base64.data = ngx_palloc(ctx->pool, base64.len);[m
[31m-    if (base64.data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_encode_base64(&base64, &binary);[m
[31m-[m
[31m-    escape = ngx_escape_uri(NULL, base64.data, base64.len,[m
[31m-                            NGX_ESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp request length %z, escape %d",[m
[31m-                   base64.len, (int) escape);[m
[31m-[m
[31m-    len = sizeof("GET ") - 1 + ctx->uri.len + sizeof("/") - 1[m
[31m-          + base64.len + 2 * escape + sizeof(" HTTP/1.0" CRLF) - 1[m
[31m-          + sizeof("Host: ") - 1 + ctx->host.len + sizeof(CRLF) - 1[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(ctx->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    p = b->last;[m
[31m-[m
[31m-    p = ngx_cpymem(p, "GET ", sizeof("GET ") - 1);[m
[31m-    p = ngx_cpymem(p, ctx->uri.data, ctx->uri.len);[m
[31m-[m
[31m-    if (ctx->uri.data[ctx->uri.len - 1] != '/') {[m
[31m-        *p++ = '/';[m
[31m-    }[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_cpymem(p, base64.data, base64.len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_escape_uri(p, base64.data, base64.len,[m
[31m-                                      NGX_ESCAPE_URI_COMPONENT);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(p, " HTTP/1.0" CRLF, sizeof(" HTTP/1.0" CRLF) - 1);[m
[31m-    p = ngx_cpymem(p, "Host: ", sizeof("Host: ") - 1);[m
[31m-    p = ngx_cpymem(p, ctx->host.data, ctx->host.len);[m
[31m-    *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-    /* add "\r\n" at the header end */[m
[31m-    *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-    b->last = p;[m
[31m-    ctx->request = b;[m
[31m-[m
[31m-    OCSP_REQUEST_free(ocsp);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    OCSP_REQUEST_free(ocsp);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_process_status_line(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    rc = ngx_ssl_ocsp_parse_status_line(ctx);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-#if 0[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                       "ssl ocsp status line \"%*s\"",[m
[31m-                       ctx->response->pos - ctx->response->start,[m
[31m-                       ctx->response->start);[m
[31m-#endif[m
[31m-[m
[31m-        ctx->process = ngx_ssl_ocsp_process_headers;[m
[31m-        return ctx->process(ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR */[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                  "OCSP responder sent invalid response");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_parse_status_line(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    u_char     *p;[m
[31m-    ngx_buf_t  *b;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_H,[m
[31m-        sw_HT,[m
[31m-        sw_HTT,[m
[31m-        sw_HTTP,[m
[31m-        sw_first_major_digit,[m
[31m-        sw_major_digit,[m
[31m-        sw_first_minor_digit,[m
[31m-        sw_minor_digit,[m
[31m-        sw_status,[m
[31m-        sw_space_after_status,[m
[31m-        sw_status_text,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp process status line");[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-    b = ctx->response;[m
[31m-[m
[31m-    for (p = b->pos; p < b->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* "HTTP/" */[m
[31m-        case sw_start:[m
[31m-            switch (ch) {[m
[31m-            case 'H':[m
[31m-                state = sw_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_H:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_HT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HT:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_HTT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HTT:[m
[31m-            switch (ch) {[m
[31m-            case 'P':[m
[31m-                state = sw_HTTP;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HTTP:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_first_major_digit;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* the first digit of major HTTP version */[m
[31m-        case sw_first_major_digit:[m
[31m-            if (ch < '1' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_major_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* the major HTTP version or dot */[m
[31m-        case sw_major_digit:[m
[31m-            if (ch == '.') {[m
[31m-                state = sw_first_minor_digit;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* the first digit of minor HTTP version */[m
[31m-        case sw_first_minor_digit:[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_minor_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* the minor HTTP version or the end of the request line */[m
[31m-        case sw_minor_digit:[m
[31m-            if (ch == ' ') {[m
[31m-                state = sw_status;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* HTTP status code */[m
[31m-        case sw_status:[m
[31m-            if (ch == ' ') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->code = ctx->code * 10 + ch - '0';[m
[31m-[m
[31m-            if (++ctx->count == 3) {[m
[31m-                state = sw_space_after_status;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* space or end of line */[m
[31m-        case sw_space_after_status:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                state = sw_status_text;[m
[31m-                break;[m
[31m-            case '.':                    /* IIS may send 403.1, 403.2, etc */[m
[31m-                state = sw_status_text;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* any text until end of line */[m
[31m-        case sw_status_text:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of status line */[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = p;[m
[31m-    ctx->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_process_headers(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t     len;[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp process headers");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        rc = ngx_ssl_ocsp_parse_header_line(ctx);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                           "ssl ocsp header \"%*s: %*s\"",[m
[31m-                           ctx->header_name_end - ctx->header_name_start,[m
[31m-                           ctx->header_name_start,[m
[31m-                           ctx->header_end - ctx->header_start,[m
[31m-                           ctx->header_start);[m
[31m-[m
[31m-            len = ctx->header_name_end - ctx->header_name_start;[m
[31m-[m
[31m-            if (len == sizeof("Content-Type") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Content-Type",[m
[31m-                                   sizeof("Content-Type") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                if (len != sizeof("application/ocsp-response") - 1[m
[31m-                    || ngx_strncasecmp(ctx->header_start,[m
[31m-                                       (u_char *) "application/ocsp-response",[m
[31m-                                       sizeof("application/ocsp-response") - 1)[m
[31m-                       != 0)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                                  "OCSP responder sent invalid "[m
[31m-                                  "\"Content-Type\" header: \"%*s\"",[m
[31m-                                  ctx->header_end - ctx->header_start,[m
[31m-                                  ctx->header_start);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* TODO: honor Content-Length */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_ERROR */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->log, 0,[m
[31m-                      "OCSP responder sent invalid response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->process = ngx_ssl_ocsp_process_body;[m
[31m-    return ctx->process(ctx);[m
[31m-}[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_parse_header_line(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char      c, ch, *p;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_name,[m
[31m-        sw_space_before_value,[m
[31m-        sw_value,[m
[31m-        sw_space_after_value,[m
[31m-        sw_almost_done,[m
[31m-        sw_header_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-[m
[31m-    for (p = ctx->response->pos; p < ctx->response->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-#if 0[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                       "s:%d in:'%02Xd:%c'", state, ch, ch);[m
[31m-#endif[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* first char */[m
[31m-        case sw_start:[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_header_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_end = p;[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                state = sw_name;[m
[31m-                ctx->header_name_start = p;[m
[31m-[m
[31m-                c = (u_char) (ch | 0x20);[m
[31m-                if (c >= 'a' && c <= 'z') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (ch >= '0' && ch <= '9') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header name */[m
[31m-        case sw_name:[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                ctx->header_name_end = p;[m
[31m-                state = sw_space_before_value;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '-') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == CR) {[m
[31m-                ctx->header_name_end = p;[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == LF) {[m
[31m-                ctx->header_name_end = p;[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        /* space* before header value */[m
[31m-        case sw_space_before_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                ctx->header_start = p;[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header value */[m
[31m-        case sw_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_space_after_value;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before end of header line */[m
[31m-        case sw_space_after_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of header line */[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        /* end of header */[m
[31m-        case sw_header_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->response->pos = p;[m
[31m-    ctx->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-header_done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_ssl_ocsp_process_body(ngx_ssl_ocsp_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0,[m
[31m-                   "ssl ocsp process body");[m
[31m-[m
[31m-    if (ctx->done) {[m
[31m-        ctx->handler(ctx);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_ssl_ocsp_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_ssl_ocsp_ctx_t  *ctx;[m
[31m-[m
[31m-    p = buf;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-    }[m
[31m-[m
[31m-    ctx = log->data;[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        p = ngx_snprintf(p, len, ", responder: %V", &ctx->host);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file,[m
[31m-    ngx_str_t *responder, ngx_uint_t verify)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_WARN, ssl->log, 0,[m
[31m-                  "\"ssl_stapling\" ignored, not supported");[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,[m
[31m-    ngx_resolver_t *resolver, ngx_msec_t resolver_timeout)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_pipe.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_pipe.c[m
[1mdeleted file mode 100644[m
[1mindex 5ce59ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_pipe.c[m
[1m+++ /dev/null[m
[36m@@ -1,1095 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_pipe.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_event_pipe_read_upstream(ngx_event_pipe_t *p);[m
[31m-static ngx_int_t ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p);[m
[31m-[m
[31m-static ngx_int_t ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p);[m
[31m-static ngx_inline void ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_event_pipe_drain_chains(ngx_event_pipe_t *p);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_uint_t    flags;[m
[31m-    ngx_event_t  *rev, *wev;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (do_write) {[m
[31m-            p->log->action = "sending to client";[m
[31m-[m
[31m-            rc = ngx_event_pipe_write_to_downstream(p);[m
[31m-[m
[31m-            if (rc == NGX_ABORT) {[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_BUSY) {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        p->read = 0;[m
[31m-        p->upstream_blocked = 0;[m
[31m-[m
[31m-        p->log->action = "reading upstream";[m
[31m-[m
[31m-        if (ngx_event_pipe_read_upstream(p) == NGX_ABORT) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        if (!p->read && !p->upstream_blocked) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        do_write = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (p->upstream->fd != (ngx_socket_t) -1) {[m
[31m-        rev = p->upstream->read;[m
[31m-[m
[31m-        flags = (rev->eof || rev->error) ? NGX_CLOSE_EVENT : 0;[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, flags) != NGX_OK) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        if (!rev->delayed) {[m
[31m-            if (rev->active && !rev->ready) {[m
[31m-                ngx_add_timer(rev, p->read_timeout);[m
[31m-[m
[31m-            } else if (rev->timer_set) {[m
[31m-                ngx_del_timer(rev);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->downstream->fd != (ngx_socket_t) -1[m
[31m-        && p->downstream->data == p->output_ctx)[m
[31m-    {[m
[31m-        wev = p->downstream->write;[m
[31m-        if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            if (wev->active && !wev->ready) {[m
[31m-                ngx_add_timer(wev, p->send_timeout);[m
[31m-[m
[31m-            } else if (wev->timer_set) {[m
[31m-                ngx_del_timer(wev);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_pipe_read_upstream(ngx_event_pipe_t *p)[m
[31m-{[m
[31m-    off_t         limit;[m
[31m-    ssize_t       n, size;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_msec_t    delay;[m
[31m-    ngx_chain_t  *chain, *cl, *ln;[m
[31m-[m
[31m-    if (p->upstream_eof || p->upstream_error || p->upstream_done) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (p->aio) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe read upstream: aio");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                   "pipe read upstream: %d", p->upstream->read->ready);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (p->upstream_eof || p->upstream_error || p->upstream_done) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (p->preread_bufs == NULL && !p->upstream->read->ready) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (p->preread_bufs) {[m
[31m-[m
[31m-            /* use the pre-read bufs if they exist */[m
[31m-[m
[31m-            chain = p->preread_bufs;[m
[31m-            p->preread_bufs = NULL;[m
[31m-            n = p->preread_size;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "pipe preread: %z", n);[m
[31m-[m
[31m-            if (n) {[m
[31m-                p->read = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            /*[m
[31m-             * kqueue notifies about the end of file or a pending error.[m
[31m-             * This test allows not to allocate a buf on these conditions[m
[31m-             * and not to call c->recv_chain().[m
[31m-             */[m
[31m-[m
[31m-            if (p->upstream->read->available == 0[m
[31m-                && p->upstream->read->pending_eof)[m
[31m-            {[m
[31m-                p->upstream->read->ready = 0;[m
[31m-                p->upstream->read->eof = 1;[m
[31m-                p->upstream_eof = 1;[m
[31m-                p->read = 1;[m
[31m-[m
[31m-                if (p->upstream->read->kq_errno) {[m
[31m-                    p->upstream->read->error = 1;[m
[31m-                    p->upstream_error = 1;[m
[31m-                    p->upstream_eof = 0;[m
[31m-[m
[31m-                    ngx_log_error(NGX_LOG_ERR, p->log,[m
[31m-                                  p->upstream->read->kq_errno,[m
[31m-                                  "kevent() reported that upstream "[m
[31m-                                  "closed connection");[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (p->limit_rate) {[m
[31m-                if (p->upstream->read->delayed) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                limit = (off_t) p->limit_rate * (ngx_time() - p->start_sec + 1)[m
[31m-                        - p->read_length;[m
[31m-[m
[31m-                if (limit <= 0) {[m
[31m-                    p->upstream->read->delayed = 1;[m
[31m-                    delay = (ngx_msec_t) (- limit * 1000 / p->limit_rate + 1);[m
[31m-                    ngx_add_timer(p->upstream->read, delay);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                limit = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (p->free_raw_bufs) {[m
[31m-[m
[31m-                /* use the free bufs if they exist */[m
[31m-[m
[31m-                chain = p->free_raw_bufs;[m
[31m-                if (p->single_buf) {[m
[31m-                    p->free_raw_bufs = p->free_raw_bufs->next;[m
[31m-                    chain->next = NULL;[m
[31m-                } else {[m
[31m-                    p->free_raw_bufs = NULL;[m
[31m-                }[m
[31m-[m
[31m-            } else if (p->allocated < p->bufs.num) {[m
[31m-[m
[31m-                /* allocate a new buf if it's still allowed */[m
[31m-[m
[31m-                b = ngx_create_temp_buf(p->pool, p->bufs.size);[m
[31m-                if (b == NULL) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                p->allocated++;[m
[31m-[m
[31m-                chain = ngx_alloc_chain_link(p->pool);[m
[31m-                if (chain == NULL) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                chain->buf = b;[m
[31m-                chain->next = NULL;[m
[31m-[m
[31m-            } else if (!p->cacheable[m
[31m-                       && p->downstream->data == p->output_ctx[m
[31m-                       && p->downstream->write->ready[m
[31m-                       && !p->downstream->write->delayed)[m
[31m-            {[m
[31m-                /*[m
[31m-                 * if the bufs are not needed to be saved in a cache and[m
[31m-                 * a downstream is ready then write the bufs to a downstream[m
[31m-                 */[m
[31m-[m
[31m-                p->upstream_blocked = 1;[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe downstream ready");[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            } else if (p->cacheable[m
[31m-                       || p->temp_file->offset < p->max_temp_file_size)[m
[31m-            {[m
[31m-[m
[31m-                /*[m
[31m-                 * if it is allowed, then save some bufs from p->in[m
[31m-                 * to a temporary file, and add them to a p->out chain[m
[31m-                 */[m
[31m-[m
[31m-                rc = ngx_event_pipe_write_chain_to_temp_file(p);[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe temp offset: %O", p->temp_file->offset);[m
[31m-[m
[31m-                if (rc == NGX_BUSY) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                chain = p->free_raw_bufs;[m
[31m-                if (p->single_buf) {[m
[31m-                    p->free_raw_bufs = p->free_raw_bufs->next;[m
[31m-                    chain->next = NULL;[m
[31m-                } else {[m
[31m-                    p->free_raw_bufs = NULL;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                /* there are no bufs to read in */[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "no pipe bufs to read in");[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            n = p->upstream->recv_chain(p->upstream, chain, limit);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "pipe recv chain: %z", n);[m
[31m-[m
[31m-            if (p->free_raw_bufs) {[m
[31m-                chain->next = p->free_raw_bufs;[m
[31m-            }[m
[31m-            p->free_raw_bufs = chain;[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                p->upstream_error = 1;[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                if (p->single_buf) {[m
[31m-                    ngx_event_pipe_remove_shadow_links(chain->buf);[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            p->read = 1;[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                p->upstream_eof = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        delay = p->limit_rate ? (ngx_msec_t) n * 1000 / p->limit_rate : 0;[m
[31m-[m
[31m-        p->read_length += n;[m
[31m-        cl = chain;[m
[31m-        p->free_raw_bufs = NULL;[m
[31m-[m
[31m-        while (cl && n > 0) {[m
[31m-[m
[31m-            ngx_event_pipe_remove_shadow_links(cl->buf);[m
[31m-[m
[31m-            size = cl->buf->end - cl->buf->last;[m
[31m-[m
[31m-            if (n >= size) {[m
[31m-                cl->buf->last = cl->buf->end;[m
[31m-[m
[31m-                /* STUB */ cl->buf->num = p->num++;[m
[31m-[m
[31m-                if (p->input_filter(p, cl->buf) == NGX_ERROR) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                n -= size;[m
[31m-                ln = cl;[m
[31m-                cl = cl->next;[m
[31m-                ngx_free_chain(p->pool, ln);[m
[31m-[m
[31m-            } else {[m
[31m-                cl->buf->last += n;[m
[31m-                n = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (cl) {[m
[31m-            for (ln = cl; ln->next; ln = ln->next) { /* void */ }[m
[31m-[m
[31m-            ln->next = p->free_raw_bufs;[m
[31m-            p->free_raw_bufs = cl;[m
[31m-        }[m
[31m-[m
[31m-        if (delay > 0) {[m
[31m-            p->upstream->read->delayed = 1;[m
[31m-            ngx_add_timer(p->upstream->read, delay);[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    for (cl = p->busy; cl; cl = cl->next) {[m
[31m-        ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe buf busy s:%d t:%d f:%d "[m
[31m-                       "%p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       (cl->buf->shadow ? 1 : 0),[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = p->out; cl; cl = cl->next) {[m
[31m-        ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe buf out  s:%d t:%d f:%d "[m
[31m-                       "%p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       (cl->buf->shadow ? 1 : 0),[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = p->in; cl; cl = cl->next) {[m
[31m-        ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe buf in   s:%d t:%d f:%d "[m
[31m-                       "%p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       (cl->buf->shadow ? 1 : 0),[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = p->free_raw_bufs; cl; cl = cl->next) {[m
[31m-        ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe buf free s:%d t:%d f:%d "[m
[31m-                       "%p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       (cl->buf->shadow ? 1 : 0),[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                   "pipe length: %O", p->length);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (p->free_raw_bufs && p->length != -1) {[m
[31m-        cl = p->free_raw_bufs;[m
[31m-[m
[31m-        if (cl->buf->last - cl->buf->pos >= p->length) {[m
[31m-[m
[31m-            p->free_raw_bufs = cl->next;[m
[31m-[m
[31m-            /* STUB */ cl->buf->num = p->num++;[m
[31m-[m
[31m-            if (p->input_filter(p, cl->buf) == NGX_ERROR) {[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            ngx_free_chain(p->pool, cl);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->length == 0) {[m
[31m-        p->upstream_done = 1;[m
[31m-        p->read = 1;[m
[31m-    }[m
[31m-[m
[31m-    if ((p->upstream_eof || p->upstream_error) && p->free_raw_bufs) {[m
[31m-[m
[31m-        /* STUB */ p->free_raw_bufs->buf->num = p->num++;[m
[31m-[m
[31m-        if (p->input_filter(p, p->free_raw_bufs->buf) == NGX_ERROR) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        p->free_raw_bufs = p->free_raw_bufs->next;[m
[31m-[m
[31m-        if (p->free_bufs && p->buf_to_file == NULL) {[m
[31m-            for (cl = p->free_raw_bufs; cl; cl = cl->next) {[m
[31m-                if (cl->buf->shadow == NULL) {[m
[31m-                    ngx_pfree(p->pool, cl->buf->start);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->cacheable && (p->in || p->buf_to_file)) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe write chain");[m
[31m-[m
[31m-        rc = ngx_event_pipe_write_chain_to_temp_file(p);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p)[m
[31m-{[m
[31m-    u_char            *prev;[m
[31m-    size_t             bsize;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_uint_t         flush, flushed, prev_last_shadow;[m
[31m-    ngx_chain_t       *out, **ll, *cl;[m
[31m-    ngx_connection_t  *downstream;[m
[31m-[m
[31m-    downstream = p->downstream;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                   "pipe write downstream: %d", downstream->write->ready);[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-    if (p->writing) {[m
[31m-        rc = ngx_event_pipe_write_chain_to_temp_file(p);[m
[31m-[m
[31m-        if (rc == NGX_ABORT) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    flushed = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (p->downstream_error) {[m
[31m-            return ngx_event_pipe_drain_chains(p);[m
[31m-        }[m
[31m-[m
[31m-        if (p->upstream_eof || p->upstream_error || p->upstream_done) {[m
[31m-[m
[31m-            /* pass the p->out and p->in chains to the output filter */[m
[31m-[m
[31m-            for (cl = p->busy; cl; cl = cl->next) {[m
[31m-                cl->buf->recycled = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (p->out) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe write downstream flush out");[m
[31m-[m
[31m-                for (cl = p->out; cl; cl = cl->next) {[m
[31m-                    cl->buf->recycled = 0;[m
[31m-                }[m
[31m-[m
[31m-                rc = p->output_filter(p->output_ctx, p->out);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    p->downstream_error = 1;[m
[31m-                    return ngx_event_pipe_drain_chains(p);[m
[31m-                }[m
[31m-[m
[31m-                p->out = NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (p->writing) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (p->in) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe write downstream flush in");[m
[31m-[m
[31m-                for (cl = p->in; cl; cl = cl->next) {[m
[31m-                    cl->buf->recycled = 0;[m
[31m-                }[m
[31m-[m
[31m-                rc = p->output_filter(p->output_ctx, p->in);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    p->downstream_error = 1;[m
[31m-                    return ngx_event_pipe_drain_chains(p);[m
[31m-                }[m
[31m-[m
[31m-                p->in = NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "pipe write downstream done");[m
[31m-[m
[31m-            /* TODO: free unused bufs */[m
[31m-[m
[31m-            p->downstream_done = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (downstream->data != p->output_ctx[m
[31m-            || !downstream->write->ready[m
[31m-            || downstream->write->delayed)[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* bsize is the size of the busy recycled bufs */[m
[31m-[m
[31m-        prev = NULL;[m
[31m-        bsize = 0;[m
[31m-[m
[31m-        for (cl = p->busy; cl; cl = cl->next) {[m
[31m-[m
[31m-            if (cl->buf->recycled) {[m
[31m-                if (prev == cl->buf->start) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                bsize += cl->buf->end - cl->buf->start;[m
[31m-                prev = cl->buf->start;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe write busy: %uz", bsize);[m
[31m-[m
[31m-        out = NULL;[m
[31m-[m
[31m-        if (bsize >= (size_t) p->busy_size) {[m
[31m-            flush = 1;[m
[31m-            goto flush;[m
[31m-        }[m
[31m-[m
[31m-        flush = 0;[m
[31m-        ll = NULL;[m
[31m-        prev_last_shadow = 1;[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-            if (p->out) {[m
[31m-                cl = p->out;[m
[31m-[m
[31m-                if (cl->buf->recycled) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, p->log, 0,[m
[31m-                                  "recycled buffer in pipe out chain");[m
[31m-                }[m
[31m-[m
[31m-                p->out = p->out->next;[m
[31m-[m
[31m-            } else if (!p->cacheable && !p->writing && p->in) {[m
[31m-                cl = p->in;[m
[31m-[m
[31m-                ngx_log_debug3(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                               "pipe write buf ls:%d %p %z",[m
[31m-                               cl->buf->last_shadow,[m
[31m-                               cl->buf->pos,[m
[31m-                               cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-                if (cl->buf->recycled && prev_last_shadow) {[m
[31m-                    if (bsize + cl->buf->end - cl->buf->start > p->busy_size) {[m
[31m-                        flush = 1;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    bsize += cl->buf->end - cl->buf->start;[m
[31m-                }[m
[31m-[m
[31m-                prev_last_shadow = cl->buf->last_shadow;[m
[31m-[m
[31m-                p->in = p->in->next;[m
[31m-[m
[31m-            } else {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            cl->next = NULL;[m
[31m-[m
[31m-            if (out) {[m
[31m-                *ll = cl;[m
[31m-            } else {[m
[31m-                out = cl;[m
[31m-            }[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-    flush:[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe write: out:%p, f:%ui", out, flush);[m
[31m-[m
[31m-        if (out == NULL) {[m
[31m-[m
[31m-            if (!flush) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* a workaround for AIO */[m
[31m-            if (flushed++ > 10) {[m
[31m-                return NGX_BUSY;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = p->output_filter(p->output_ctx, out);[m
[31m-[m
[31m-        ngx_chain_update_chains(p->pool, &p->free, &p->busy, &out, p->tag);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            p->downstream_error = 1;[m
[31m-            return ngx_event_pipe_drain_chains(p);[m
[31m-        }[m
[31m-[m
[31m-        for (cl = p->free; cl; cl = cl->next) {[m
[31m-[m
[31m-            if (cl->buf->temp_file) {[m
[31m-                if (p->cacheable || !p->cyclic_temp_file) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                /* reset p->temp_offset if all bufs had been sent */[m
[31m-[m
[31m-                if (cl->buf->file_last == p->temp_file->offset) {[m
[31m-                    p->temp_file->offset = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            /* TODO: free buf if p->free_bufs && upstream done */[m
[31m-[m
[31m-            /* add the free shadow raw buf to p->free_raw_bufs */[m
[31m-[m
[31m-            if (cl->buf->last_shadow) {[m
[31m-                if (ngx_event_pipe_add_free_buf(p, cl->buf->shadow) != NGX_OK) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf->last_shadow = 0;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->shadow = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p)[m
[31m-{[m
[31m-    ssize_t       size, bsize, n;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_uint_t    prev_last_shadow;[m
[31m-    ngx_chain_t  *cl, *tl, *next, *out, **ll, **last_out, **last_free;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-    if (p->writing) {[m
[31m-[m
[31m-        if (p->aio) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        out = p->writing;[m
[31m-        p->writing = NULL;[m
[31m-[m
[31m-        n = ngx_write_chain_to_temp_file(p->temp_file, NULL);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (p->buf_to_file) {[m
[31m-        out = ngx_alloc_chain_link(p->pool);[m
[31m-        if (out == NULL) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        out->buf = p->buf_to_file;[m
[31m-        out->next = p->in;[m
[31m-[m
[31m-    } else {[m
[31m-        out = p->in;[m
[31m-    }[m
[31m-[m
[31m-    if (!p->cacheable) {[m
[31m-[m
[31m-        size = 0;[m
[31m-        cl = out;[m
[31m-        ll = NULL;[m
[31m-        prev_last_shadow = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "pipe offset: %O", p->temp_file->offset);[m
[31m-[m
[31m-        do {[m
[31m-            bsize = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "pipe buf ls:%d %p, pos %p, size: %z",[m
[31m-                           cl->buf->last_shadow, cl->buf->start,[m
[31m-                           cl->buf->pos, bsize);[m
[31m-[m
[31m-            if (prev_last_shadow[m
[31m-                && ((size + bsize > p->temp_file_write_size)[m
[31m-                    || (p->temp_file->offset + size + bsize[m
[31m-                        > p->max_temp_file_size)))[m
[31m-            {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            prev_last_shadow = cl->buf->last_shadow;[m
[31m-[m
[31m-            size += bsize;[m
[31m-            ll = &cl->next;[m
[31m-            cl = cl->next;[m
[31m-[m
[31m-        } while (cl);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "size: %z", size);[m
[31m-[m
[31m-        if (ll == NULL) {[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-[m
[31m-        if (cl) {[m
[31m-            p->in = cl;[m
[31m-            *ll = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            p->in = NULL;[m
[31m-            p->last_in = &p->in;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p->in = NULL;[m
[31m-        p->last_in = &p->in;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    p->temp_file->thread_write = p->thread_handler ? 1 : 0;[m
[31m-    p->temp_file->file.thread_task = p->thread_task;[m
[31m-    p->temp_file->file.thread_handler = p->thread_handler;[m
[31m-    p->temp_file->file.thread_ctx = p->thread_ctx;[m
[31m-#endif[m
[31m-[m
[31m-    n = ngx_write_chain_to_temp_file(p->temp_file, out);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        p->writing = out;[m
[31m-        p->thread_task = p->temp_file->file.thread_task;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (p->buf_to_file) {[m
[31m-        p->temp_file->offset = p->buf_to_file->last - p->buf_to_file->pos;[m
[31m-        n -= p->buf_to_file->last - p->buf_to_file->pos;[m
[31m-        p->buf_to_file = NULL;[m
[31m-        out = out->next;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        /* update previous buffer or add new buffer */[m
[31m-[m
[31m-        if (p->out) {[m
[31m-            for (cl = p->out; cl->next; cl = cl->next) { /* void */ }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (b->file_last == p->temp_file->offset) {[m
[31m-                p->temp_file->offset += n;[m
[31m-                b->file_last = p->temp_file->offset;[m
[31m-                goto free;[m
[31m-            }[m
[31m-[m
[31m-            last_out = &cl->next;[m
[31m-[m
[31m-        } else {[m
[31m-            last_out = &p->out;[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ABORT;[m
[31m-        }[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->tag = p->tag;[m
[31m-[m
[31m-        b->file = &p->temp_file->file;[m
[31m-        b->file_pos = p->temp_file->offset;[m
[31m-        p->temp_file->offset += n;[m
[31m-        b->file_last = p->temp_file->offset;[m
[31m-[m
[31m-        b->in_file = 1;[m
[31m-        b->temp_file = 1;[m
[31m-[m
[31m-        *last_out = cl;[m
[31m-    }[m
[31m-[m
[31m-free:[m
[31m-[m
[31m-    for (last_free = &p->free_raw_bufs;[m
[31m-         *last_free != NULL;[m
[31m-         last_free = &(*last_free)->next)[m
[31m-    {[m
[31m-        /* void */[m
[31m-    }[m
[31m-[m
[31m-    for (cl = out; cl; cl = next) {[m
[31m-        next = cl->next;[m
[31m-[m
[31m-        cl->next = p->free;[m
[31m-        p->free = cl;[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (b->last_shadow) {[m
[31m-[m
[31m-            tl = ngx_alloc_chain_link(p->pool);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            tl->buf = b->shadow;[m
[31m-            tl->next = NULL;[m
[31m-[m
[31m-            *last_free = tl;[m
[31m-            last_free = &tl->next;[m
[31m-[m
[31m-            b->shadow->pos = b->shadow->start;[m
[31m-            b->shadow->last = b->shadow->start;[m
[31m-[m
[31m-            ngx_event_pipe_remove_shadow_links(b->shadow);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* the copy input filter */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    ngx_memcpy(b, buf, sizeof(ngx_buf_t));[m
[31m-    b->shadow = buf;[m
[31m-    b->tag = p->tag;[m
[31m-    b->last_shadow = 1;[m
[31m-    b->recycled = 1;[m
[31m-    buf->shadow = b;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num);[m
[31m-[m
[31m-    if (p->in) {[m
[31m-        *p->last_in = cl;[m
[31m-    } else {[m
[31m-        p->in = cl;[m
[31m-    }[m
[31m-    p->last_in = &cl->next;[m
[31m-[m
[31m-    if (p->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p->length -= b->last - b->pos;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_buf_t  *b, *next;[m
[31m-[m
[31m-    b = buf->shadow;[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    while (!b->last_shadow) {[m
[31m-        next = b->shadow;[m
[31m-[m
[31m-        b->temporary = 0;[m
[31m-        b->recycled = 0;[m
[31m-[m
[31m-        b->shadow = NULL;[m
[31m-        b = next;[m
[31m-    }[m
[31m-[m
[31m-    b->temporary = 0;[m
[31m-    b->recycled = 0;[m
[31m-    b->last_shadow = 0;[m
[31m-[m
[31m-    b->shadow = NULL;[m
[31m-[m
[31m-    buf->shadow = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(p->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (p->buf_to_file && b->start == p->buf_to_file->start) {[m
[31m-        b->pos = p->buf_to_file->last;[m
[31m-        b->last = p->buf_to_file->last;[m
[31m-[m
[31m-    } else {[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-    }[m
[31m-[m
[31m-    b->shadow = NULL;[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    if (p->free_raw_bufs == NULL) {[m
[31m-        p->free_raw_bufs = cl;[m
[31m-        cl->next = NULL;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (p->free_raw_bufs->buf->pos == p->free_raw_bufs->buf->last) {[m
[31m-[m
[31m-        /* add the free buf to the list start */[m
[31m-[m
[31m-        cl->next = p->free_raw_bufs;[m
[31m-        p->free_raw_bufs = cl;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* the first free buf is partially filled, thus add the free buf after it */[m
[31m-[m
[31m-    cl->next = p->free_raw_bufs->next;[m
[31m-    p->free_raw_bufs->next = cl;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_event_pipe_drain_chains(ngx_event_pipe_t *p)[m
[31m-{[m
[31m-    ngx_chain_t  *cl, *tl;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (p->busy) {[m
[31m-            cl = p->busy;[m
[31m-            p->busy = NULL;[m
[31m-[m
[31m-        } else if (p->out) {[m
[31m-            cl = p->out;[m
[31m-            p->out = NULL;[m
[31m-[m
[31m-        } else if (p->in) {[m
[31m-            cl = p->in;[m
[31m-            p->in = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        while (cl) {[m
[31m-            if (cl->buf->last_shadow) {[m
[31m-                if (ngx_event_pipe_add_free_buf(p, cl->buf->shadow) != NGX_OK) {[m
[31m-                    return NGX_ABORT;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf->last_shadow = 0;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->shadow = NULL;[m
[31m-            tl = cl->next;[m
[31m-            cl->next = p->free;[m
[31m-            p->free = cl;[m
[31m-            cl = tl;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_pipe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_pipe.h[m
[1mdeleted file mode 100644[m
[1mindex ef2e7a0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_pipe.h[m
[1m+++ /dev/null[m
[36m@@ -1,107 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_PIPE_H_INCLUDED_[m
[31m-#define _NGX_EVENT_PIPE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_event_pipe_s  ngx_event_pipe_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_event_pipe_input_filter_pt)(ngx_event_pipe_t *p,[m
[31m-                                                    ngx_buf_t *buf);[m
[31m-typedef ngx_int_t (*ngx_event_pipe_output_filter_pt)(void *data,[m
[31m-                                                     ngx_chain_t *chain);[m
[31m-[m
[31m-[m
[31m-struct ngx_event_pipe_s {[m
[31m-    ngx_connection_t  *upstream;[m
[31m-    ngx_connection_t  *downstream;[m
[31m-[m
[31m-    ngx_chain_t       *free_raw_bufs;[m
[31m-    ngx_chain_t       *in;[m
[31m-    ngx_chain_t      **last_in;[m
[31m-[m
[31m-    ngx_chain_t       *writing;[m
[31m-[m
[31m-    ngx_chain_t       *out;[m
[31m-    ngx_chain_t       *free;[m
[31m-    ngx_chain_t       *busy;[m
[31m-[m
[31m-    /*[m
[31m-     * the input filter i.e. that moves HTTP/1.1 chunks[m
[31m-     * from the raw bufs to an incoming chain[m
[31m-     */[m
[31m-[m
[31m-    ngx_event_pipe_input_filter_pt    input_filter;[m
[31m-    void                             *input_ctx;[m
[31m-[m
[31m-    ngx_event_pipe_output_filter_pt   output_filter;[m
[31m-    void                             *output_ctx;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_int_t                       (*thread_handler)(ngx_thread_task_t *task,[m
[31m-                                                      ngx_file_t *file);[m
[31m-    void                             *thread_ctx;[m
[31m-    ngx_thread_task_t                *thread_task;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned           read:1;[m
[31m-    unsigned           cacheable:1;[m
[31m-    unsigned           single_buf:1;[m
[31m-    unsigned           free_bufs:1;[m
[31m-    unsigned           upstream_done:1;[m
[31m-    unsigned           upstream_error:1;[m
[31m-    unsigned           upstream_eof:1;[m
[31m-    unsigned           upstream_blocked:1;[m
[31m-    unsigned           downstream_done:1;[m
[31m-    unsigned           downstream_error:1;[m
[31m-    unsigned           cyclic_temp_file:1;[m
[31m-    unsigned           aio:1;[m
[31m-[m
[31m-    ngx_int_t          allocated;[m
[31m-    ngx_bufs_t         bufs;[m
[31m-    ngx_buf_tag_t      tag;[m
[31m-[m
[31m-    ssize_t            busy_size;[m
[31m-[m
[31m-    off_t              read_length;[m
[31m-    off_t              length;[m
[31m-[m
[31m-    off_t              max_temp_file_size;[m
[31m-    ssize_t            temp_file_write_size;[m
[31m-[m
[31m-    ngx_msec_t         read_timeout;[m
[31m-    ngx_msec_t         send_timeout;[m
[31m-    ssize_t            send_lowat;[m
[31m-[m
[31m-    ngx_pool_t        *pool;[m
[31m-    ngx_log_t         *log;[m
[31m-[m
[31m-    ngx_chain_t       *preread_bufs;[m
[31m-    size_t             preread_size;[m
[31m-    ngx_buf_t         *buf_to_file;[m
[31m-[m
[31m-    size_t             limit_rate;[m
[31m-    time_t             start_sec;[m
[31m-[m
[31m-    ngx_temp_file_t   *temp_file;[m
[31m-[m
[31m-    /* STUB */ int     num;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write);[m
[31m-ngx_int_t ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf);[m
[31m-ngx_int_t ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_PIPE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_posted.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_posted.c[m
[1mdeleted file mode 100644[m
[1mindex d851f3d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_posted.c[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ngx_queue_t  ngx_posted_accept_events;[m
[31m-ngx_queue_t  ngx_posted_events;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted)[m
[31m-{[m
[31m-    ngx_queue_t  *q;[m
[31m-    ngx_event_t  *ev;[m
[31m-[m
[31m-    while (!ngx_queue_empty(posted)) {[m
[31m-[m
[31m-        q = ngx_queue_head(posted);[m
[31m-        ev = ngx_queue_data(q, ngx_event_t, queue);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                      "posted event %p", ev);[m
[31m-[m
[31m-        ngx_delete_posted_event(ev);[m
[31m-[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_posted.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_posted.h[m
[1mdeleted file mode 100644[m
[1mindex 145d30f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_posted.h[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_POSTED_H_INCLUDED_[m
[31m-#define _NGX_EVENT_POSTED_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_post_event(ev, q)                                                 \[m
[31m-                                                                              \[m
[31m-    if (!(ev)->posted) {                                                      \[m
[31m-        (ev)->posted = 1;                                                     \[m
[31m-        ngx_queue_insert_tail(q, &(ev)->queue);                               \[m
[31m-                                                                              \[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0, "post event %p", ev);\[m
[31m-                                                                              \[m
[31m-    } else  {                                                                 \[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0,                      \[m
[31m-                       "update posted event %p", ev);                         \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_posted_event(ev)                                           \[m
[31m-                                                                              \[m
[31m-    (ev)->posted = 0;                                                         \[m
[31m-    ngx_queue_remove(&(ev)->queue);                                           \[m
[31m-                                                                              \[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0,                          \[m
[31m-                   "delete posted event %p", ev);[m
[31m-[m
[31m-[m
[31m-[m
[31m-void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted);[m
[31m-[m
[31m-[m
[31m-extern ngx_queue_t  ngx_posted_accept_events;[m
[31m-extern ngx_queue_t  ngx_posted_events;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_POSTED_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_probe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_probe.h[m
[1mdeleted file mode 100644[m
[1mindex b7b2749..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_probe.h[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-#ifndef _NGX_EVENT_PROBE_H_INCLUDED_[m
[31m-#define _NGX_EVENT_PROBE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-[m
[31m-#include <ngx_dtrace_provider.h>[m
[31m-[m
[31m-#define ngx_event_probe_timer_add(ev, timer)                                 \[m
[31m-    NGINX_TIMER_ADD(ev, timer)[m
[31m-[m
[31m-#define ngx_event_probe_timer_del(ev)                                        \[m
[31m-    NGINX_TIMER_DEL(ev)[m
[31m-[m
[31m-#define ngx_event_probe_timer_expire(ev)                                     \[m
[31m-    NGINX_TIMER_EXPIRE(ev)[m
[31m-[m
[31m-#else /* !(NGX_DTRACE) */[m
[31m-[m
[31m-#define ngx_event_probe_timer_add(ev, timer)[m
[31m-#define ngx_event_probe_timer_del(ev)[m
[31m-#define ngx_event_probe_timer_expire(ev)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_PROBE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_timer.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_timer.c[m
[1mdeleted file mode 100644[m
[1mindex 6e77465..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_timer.c[m
[1m+++ /dev/null[m
[36m@@ -1,157 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_probe.h>[m
[31m-[m
[31m-[m
[31m-ngx_rbtree_t              ngx_event_timer_rbtree;[m
[31m-static ngx_rbtree_node_t  ngx_event_timer_sentinel;[m
[31m-[m
[31m-/*[m
[31m- * the event timer rbtree may contain the duplicate keys, however,[m
[31m- * it should not be a problem, because we use the rbtree to find[m
[31m- * a minimum timer value only[m
[31m- */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_event_timer_init(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_rbtree_init(&ngx_event_timer_rbtree, &ngx_event_timer_sentinel,[m
[31m-                    ngx_rbtree_insert_timer_value);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_msec_t[m
[31m-ngx_event_find_timer(void)[m
[31m-{[m
[31m-    ngx_msec_int_t      timer;[m
[31m-    ngx_rbtree_node_t  *node, *root, *sentinel;[m
[31m-[m
[31m-    if (ngx_event_timer_rbtree.root == &ngx_event_timer_sentinel) {[m
[31m-        return NGX_TIMER_INFINITE;[m
[31m-    }[m
[31m-[m
[31m-    root = ngx_event_timer_rbtree.root;[m
[31m-    sentinel = ngx_event_timer_rbtree.sentinel;[m
[31m-[m
[31m-    node = ngx_rbtree_min(root, sentinel);[m
[31m-[m
[31m-    timer = (ngx_msec_int_t) (node->key - ngx_current_msec);[m
[31m-[m
[31m-    return (ngx_msec_t) (timer > 0 ? timer : 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_expire_timers(void)[m
[31m-{[m
[31m-    ngx_event_t        *ev;[m
[31m-    ngx_rbtree_node_t  *node, *root, *sentinel;[m
[31m-[m
[31m-    sentinel = ngx_event_timer_rbtree.sentinel;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        root = ngx_event_timer_rbtree.root;[m
[31m-[m
[31m-        if (root == sentinel) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        node = ngx_rbtree_min(root, sentinel);[m
[31m-[m
[31m-        /* node->key > ngx_current_time */[m
[31m-[m
[31m-        if ((ngx_msec_int_t) (node->key - ngx_current_msec) > 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer));[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "event timer del: %d: %M",[m
[31m-                       ngx_event_ident(ev->data), ev->timer.key);[m
[31m-[m
[31m-        ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        ev->timer.left = NULL;[m
[31m-        ev->timer.right = NULL;[m
[31m-        ev->timer.parent = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ev->timer_set = 0;[m
[31m-[m
[31m-        ev->timedout = 1;[m
[31m-[m
[31m-        ngx_event_probe_timer_expire(ev);[m
[31m-[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_cancel_timers(void)[m
[31m-{[m
[31m-    ngx_event_t        *ev;[m
[31m-    ngx_rbtree_node_t  *node, *root, *sentinel;[m
[31m-[m
[31m-    sentinel = ngx_event_timer_rbtree.sentinel;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        root = ngx_event_timer_rbtree.root;[m
[31m-[m
[31m-        if (root == sentinel) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        node = ngx_rbtree_min(root, sentinel);[m
[31m-[m
[31m-        ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer));[m
[31m-[m
[31m-        if (!ev->cancelable) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                       "event timer cancel: %d: %M",[m
[31m-                       ngx_event_ident(ev->data), ev->timer.key);[m
[31m-[m
[31m-        ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        ev->timer.left = NULL;[m
[31m-        ev->timer.right = NULL;[m
[31m-        ev->timer.parent = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ev->timer_set = 0;[m
[31m-[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-void[m
[31m-ngx_event_probe_timer_add_helper(ngx_event_t *ev, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_event_probe_timer_add(ev, timer);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_event_probe_timer_del_helper(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_probe_timer_del(ev);[m
[31m-}[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_timer.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_timer.h[m
[1mdeleted file mode 100644[m
[1mindex 8bc619a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/event/ngx_event_timer.h[m
[1m+++ /dev/null[m
[36m@@ -1,105 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_EVENT_TIMER_H_INCLUDED_[m
[31m-#define _NGX_EVENT_TIMER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_TIMER_INFINITE  (ngx_msec_t) -1[m
[31m-[m
[31m-#define NGX_TIMER_LAZY_DELAY  300[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_event_timer_init(ngx_log_t *log);[m
[31m-ngx_msec_t ngx_event_find_timer(void);[m
[31m-void ngx_event_expire_timers(void);[m
[31m-void ngx_event_cancel_timers(void);[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-void ngx_event_probe_timer_add_helper(ngx_event_t *ev,[m
[31m-    ngx_msec_t timer);[m
[31m-void ngx_event_probe_timer_del_helper(ngx_event_t *ev);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern ngx_rbtree_t  ngx_event_timer_rbtree;[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_event_del_timer(ngx_event_t *ev)[m
[31m-{[m
[31m-#if (NGX_DTRACE)[m
[31m-    ngx_event_probe_timer_del_helper(ev);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "event timer del: %d: %M",[m
[31m-                    ngx_event_ident(ev->data), ev->timer.key);[m
[31m-[m
[31m-    ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ev->timer.left = NULL;[m
[31m-    ev->timer.right = NULL;[m
[31m-    ev->timer.parent = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    ev->timer_set = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)[m
[31m-{[m
[31m-    ngx_msec_t      key;[m
[31m-    ngx_msec_int_t  diff;[m
[31m-[m
[31m-    key = ngx_current_msec + timer;[m
[31m-[m
[31m-    if (ev->timer_set) {[m
[31m-[m
[31m-        /*[m
[31m-         * Use a previous timer value if difference between it and a new[m
[31m-         * value is less than NGX_TIMER_LAZY_DELAY milliseconds: this allows[m
[31m-         * to minimize the rbtree operations for fast connections.[m
[31m-         */[m
[31m-[m
[31m-        diff = (ngx_msec_int_t) (key - ev->timer.key);[m
[31m-[m
[31m-        if (ngx_abs(diff) < NGX_TIMER_LAZY_DELAY) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                           "event timer: %d, old: %M, new: %M",[m
[31m-                            ngx_event_ident(ev->data), ev->timer.key, key);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_del_timer(ev);[m
[31m-    }[m
[31m-[m
[31m-    ev->timer.key = key;[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-    ngx_event_probe_timer_add_helper(ev, timer);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "event timer add: %d: %M:%M",[m
[31m-                    ngx_event_ident(ev->data), timer, ev->timer.key);[m
[31m-[m
[31m-    ngx_rbtree_insert(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-    ev->timer_set = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_EVENT_TIMER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_access_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_access_module.c[m
[1mdeleted file mode 100644[m
[1mindex c553e46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_access_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,469 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t         mask;[m
[31m-    in_addr_t         addr;[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_http_access_rule_t;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr   addr;[m
[31m-    struct in6_addr   mask;[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_http_access_rule6_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_http_access_rule_un_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t      *rules;     /* array of ngx_http_access_rule_t */[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_array_t      *rules6;    /* array of ngx_http_access_rule6_t */[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    ngx_array_t      *rules_un;  /* array of ngx_http_access_rule_un_t */[m
[31m-#endif[m
[31m-} ngx_http_access_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_access_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_access_inet(ngx_http_request_t *r,[m
[31m-    ngx_http_access_loc_conf_t *alcf, in_addr_t addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_http_access_inet6(ngx_http_request_t *r,[m
[31m-    ngx_http_access_loc_conf_t *alcf, u_char *p);[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-static ngx_int_t ngx_http_access_unix(ngx_http_request_t *r,[m
[31m-    ngx_http_access_loc_conf_t *alcf);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny);[m
[31m-static char *ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_http_access_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_access_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_access_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_access_commands[] = {[m
[31m-[m
[31m-    { ngx_string("allow"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_access_rule,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("deny"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_access_rule,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_access_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_access_init,                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_access_create_loc_conf,       /* create location configuration */[m
[31m-    ngx_http_access_merge_loc_conf         /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_access_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_access_module_ctx,           /* module context */[m
[31m-    ngx_http_access_commands,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    struct sockaddr_in          *sin;[m
[31m-    ngx_http_access_loc_conf_t  *alcf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                      *p;[m
[31m-    in_addr_t                    addr;[m
[31m-    struct sockaddr_in6         *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_access_module);[m
[31m-[m
[31m-    switch (r->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        if (alcf->rules) {[m
[31m-            sin = (struct sockaddr_in *) r->connection->sockaddr;[m
[31m-            return ngx_http_access_inet(r, alcf, sin->sin_addr.s_addr);[m
[31m-        }[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;[m
[31m-        p = sin6->sin6_addr.s6_addr;[m
[31m-[m
[31m-        if (alcf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {[m
[31m-            addr = p[12] << 24;[m
[31m-            addr += p[13] << 16;[m
[31m-            addr += p[14] << 8;[m
[31m-            addr += p[15];[m
[31m-            return ngx_http_access_inet(r, alcf, htonl(addr));[m
[31m-        }[m
[31m-[m
[31m-        if (alcf->rules6) {[m
[31m-            return ngx_http_access_inet6(r, alcf, p);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    case AF_UNIX:[m
[31m-        if (alcf->rules_un) {[m
[31m-            return ngx_http_access_unix(r, alcf);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_inet(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf,[m
[31m-    in_addr_t addr)[m
[31m-{[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_access_rule_t  *rule;[m
[31m-[m
[31m-    rule = alcf->rules->elts;[m
[31m-    for (i = 0; i < alcf->rules->nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "access: %08XD %08XD %08XD",[m
[31m-                       addr, rule[i].mask, rule[i].addr);[m
[31m-[m
[31m-        if ((addr & rule[i].mask) == rule[i].addr) {[m
[31m-            return ngx_http_access_found(r, rule[i].deny);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_inet6(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf,[m
[31m-    u_char *p)[m
[31m-{[m
[31m-    ngx_uint_t                n;[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_http_access_rule6_t  *rule6;[m
[31m-[m
[31m-    rule6 = alcf->rules6->elts;[m
[31m-    for (i = 0; i < alcf->rules6->nelts; i++) {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        size_t  cl, ml, al;[m
[31m-        u_char  ct[NGX_INET6_ADDRSTRLEN];[m
[31m-        u_char  mt[NGX_INET6_ADDRSTRLEN];[m
[31m-        u_char  at[NGX_INET6_ADDRSTRLEN];[m
[31m-[m
[31m-        cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN);[m
[31m-        ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN);[m
[31m-        al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN);[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "access: %*s %*s %*s", cl, ct, ml, mt, al, at);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        for (n = 0; n < 16; n++) {[m
[31m-            if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_access_found(r, rule6[i].deny);[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_unix(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_access_rule_un_t  *rule_un;[m
[31m-[m
[31m-    rule_un = alcf->rules_un->elts;[m
[31m-    for (i = 0; i < alcf->rules_un->nelts; i++) {[m
[31m-[m
[31m-        /* TODO: check path */[m
[31m-        if (1) {[m
[31m-            return ngx_http_access_found(r, rule_un[i].deny);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (deny) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "access forbidden by rule");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_FORBIDDEN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_access_loc_conf_t *alcf = conf;[m
[31m-[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  all;[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_cidr_t                  cidr;[m
[31m-    ngx_http_access_rule_t     *rule;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_http_access_rule6_t    *rule6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    ngx_http_access_rule_un_t  *rule_un;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memzero(&cidr, sizeof(ngx_cidr_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    all = (value[1].len == 3 && ngx_strcmp(value[1].data, "all") == 0);[m
[31m-[m
[31m-    if (!all) {[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-        if (value[1].len == 5 && ngx_strcmp(value[1].data, "unix:") == 0) {[m
[31m-            cidr.family = AF_UNIX;[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_ptocidr(&value[1], &cidr);[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-        rc = ngx_ptocidr(&value[1], &cidr);[m
[31m-#endif[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                         "invalid parameter \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                         "low address bits of %V are meaningless", &value[1]);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cidr.family == AF_INET || all) {[m
[31m-[m
[31m-        if (alcf->rules == NULL) {[m
[31m-            alcf->rules = ngx_array_create(cf->pool, 4,[m
[31m-                                           sizeof(ngx_http_access_rule_t));[m
[31m-            if (alcf->rules == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule = ngx_array_push(alcf->rules);[m
[31m-        if (rule == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule->mask = cidr.u.in.mask;[m
[31m-        rule->addr = cidr.u.in.addr;[m
[31m-        rule->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (cidr.family == AF_INET6 || all) {[m
[31m-[m
[31m-        if (alcf->rules6 == NULL) {[m
[31m-            alcf->rules6 = ngx_array_create(cf->pool, 4,[m
[31m-                                            sizeof(ngx_http_access_rule6_t));[m
[31m-            if (alcf->rules6 == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule6 = ngx_array_push(alcf->rules6);[m
[31m-        if (rule6 == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule6->mask = cidr.u.in6.mask;[m
[31m-        rule6->addr = cidr.u.in6.addr;[m
[31m-        rule6->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    if (cidr.family == AF_UNIX || all) {[m
[31m-[m
[31m-        if (alcf->rules_un == NULL) {[m
[31m-            alcf->rules_un = ngx_array_create(cf->pool, 1,[m
[31m-                                            sizeof(ngx_http_access_rule_un_t));[m
[31m-            if (alcf->rules_un == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule_un = ngx_array_push(alcf->rules_un);[m
[31m-        if (rule_un == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule_un->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_access_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_access_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_access_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_access_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_access_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_access_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->rules == NULL[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        && conf->rules6 == NULL[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        && conf->rules_un == NULL[m
[31m-#endif[m
[31m-    ) {[m
[31m-        conf->rules = prev->rules;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        conf->rules6 = prev->rules6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        conf->rules_un = prev->rules_un;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_access_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_access_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_addition_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_addition_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex db4970b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_addition_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,251 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     before_body;[m
[31m-    ngx_str_t     after_body;[m
[31m-[m
[31m-    ngx_hash_t    types;[m
[31m-    ngx_array_t  *types_keys;[m
[31m-} ngx_http_addition_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t    before_body_sent;[m
[31m-} ngx_http_addition_ctx_t;[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_addition_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_addition_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_addition_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_addition_commands[] = {[m
[31m-[m
[31m-    { ngx_string("add_before_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_addition_conf_t, before_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("add_after_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_addition_conf_t, after_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("addition_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_addition_conf_t, types_keys),[m
[31m-      &ngx_http_html_default_types[0] },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_addition_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_addition_filter_init,         /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_addition_create_conf,         /* create location configuration */[m
[31m-    ngx_http_addition_merge_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_addition_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_addition_filter_module_ctx,  /* module context */[m
[31m-    ngx_http_addition_commands,            /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_addition_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_addition_ctx_t   *ctx;[m
[31m-    ngx_http_addition_conf_t  *conf;[m
[31m-[m
[31m-    if (r->headers_out.status != NGX_HTTP_OK || r != r->main) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    if (conf->before_body.len == 0 && conf->after_body.len == 0) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_test_content_type(r, &conf->types) == NULL) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_addition_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_weak_etag(r);[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_addition_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 last;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_request_t        *sr;[m
[31m-    ngx_http_addition_ctx_t   *ctx;[m
[31m-    ngx_http_addition_conf_t  *conf;[m
[31m-[m
[31m-    if (in == NULL || r->header_only) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    if (!ctx->before_body_sent) {[m
[31m-        ctx->before_body_sent = 1;[m
[31m-[m
[31m-        if (conf->before_body.len) {[m
[31m-            if (ngx_http_subrequest(r, &conf->before_body, NULL, &sr, NULL, 0)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->after_body.len == 0) {[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_addition_filter_module);[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            cl->buf->last_buf = 0;[m
[31m-            cl->buf->sync = 1;[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || !last || conf->after_body.len == 0) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_subrequest(r, &conf->after_body, NULL, &sr, NULL, 0)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, NULL, ngx_http_addition_filter_module);[m
[31m-[m
[31m-    return ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_addition_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_addition_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_addition_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_addition_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_addition_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_addition_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->before_body = { 0, NULL };[m
[31m-     *     conf->after_body = { 0, NULL };[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_addition_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_addition_conf_t *prev = parent;[m
[31m-    ngx_http_addition_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->before_body, prev->before_body, "");[m
[31m-    ngx_conf_merge_str_value(conf->after_body, prev->after_body, "");[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_html_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_auth_basic_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_auth_basic_module.c[m
[1mdeleted file mode 100644[m
[1mindex 1e7a0c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_auth_basic_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,467 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_crypt.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_AUTH_BUF_SIZE  2048[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 passwd;[m
[31m-} ngx_http_auth_basic_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t  *realm;[m
[31m-    ngx_http_complex_value_t   user_file;[m
[31m-} ngx_http_auth_basic_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_auth_basic_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm);[m
[31m-static ngx_int_t ngx_http_auth_basic_set_realm(ngx_http_request_t *r,[m
[31m-    ngx_str_t *realm);[m
[31m-static void ngx_http_auth_basic_close(ngx_file_t *file);[m
[31m-static void *ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_auth_basic_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_auth_basic_user_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_auth_basic_commands[] = {[m
[31m-[m
[31m-    { ngx_string("auth_basic"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_auth_basic_loc_conf_t, realm),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_basic_user_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_auth_basic_user_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_auth_basic_loc_conf_t, user_file),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_auth_basic_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_auth_basic_init,              /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_auth_basic_create_loc_conf,   /* create location configuration */[m
[31m-    ngx_http_auth_basic_merge_loc_conf     /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_auth_basic_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_auth_basic_module_ctx,       /* module context */[m
[31m-    ngx_http_auth_basic_commands,          /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_basic_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                            offset;[m
[31m-    ssize_t                          n;[m
[31m-    ngx_fd_t                         fd;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_err_t                        err;[m
[31m-    ngx_str_t                        pwd, realm, user_file;[m
[31m-    ngx_uint_t                       i, level, login, left, passwd;[m
[31m-    ngx_file_t                       file;[m
[31m-    ngx_http_auth_basic_ctx_t       *ctx;[m
[31m-    ngx_http_auth_basic_loc_conf_t  *alcf;[m
[31m-    u_char                           buf[NGX_HTTP_AUTH_BUF_SIZE];[m
[31m-    enum {[m
[31m-        sw_login,[m
[31m-        sw_passwd,[m
[31m-        sw_skip[m
[31m-    } state;[m
[31m-[m
[31m-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_basic_module);[m
[31m-[m
[31m-    if (alcf->realm == NULL || alcf->user_file.value.data == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, alcf->realm, &realm) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (realm.len == 3 && ngx_strncmp(realm.data, "off", 3) == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_auth_basic_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        return ngx_http_auth_basic_crypt_handler(r, ctx, &ctx->passwd,[m
[31m-                                                 &realm);[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_auth_basic_user(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "no user/password was provided for basic authentication");[m
[31m-[m
[31m-        return ngx_http_auth_basic_set_realm(r, &realm);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &alcf->user_file, &user_file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fd = ngx_open_file(user_file.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT) {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, r->connection->log, err,[m
[31m-                      ngx_open_file_n " \"%s\" failed", user_file.data);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-[m
[31m-    file.fd = fd;[m
[31m-    file.name = user_file;[m
[31m-    file.log = r->connection->log;[m
[31m-[m
[31m-    state = sw_login;[m
[31m-    passwd = 0;[m
[31m-    login = 0;[m
[31m-    left = 0;[m
[31m-    offset = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        i = left;[m
[31m-[m
[31m-        n = ngx_read_file(&file, buf + left, NGX_HTTP_AUTH_BUF_SIZE - left,[m
[31m-                          offset);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            ngx_http_auth_basic_close(&file);[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        for (i = left; i < left + n; i++) {[m
[31m-            switch (state) {[m
[31m-[m
[31m-            case sw_login:[m
[31m-                if (login == 0) {[m
[31m-[m
[31m-                    if (buf[i] == '#' || buf[i] == CR) {[m
[31m-                        state = sw_skip;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (buf[i] == LF) {[m
[31m-                        break;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (buf[i] != r->headers_in.user.data[login]) {[m
[31m-                    state = sw_skip;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (login == r->headers_in.user.len) {[m
[31m-                    state = sw_passwd;[m
[31m-                    passwd = i + 1;[m
[31m-                }[m
[31m-[m
[31m-                login++;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case sw_passwd:[m
[31m-                if (buf[i] == LF || buf[i] == CR || buf[i] == ':') {[m
[31m-                    buf[i] = '\0';[m
[31m-[m
[31m-                    ngx_http_auth_basic_close(&file);[m
[31m-[m
[31m-                    pwd.len = i - passwd;[m
[31m-                    pwd.data = &buf[passwd];[m
[31m-[m
[31m-                    return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd,[m
[31m-                                                             &realm);[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case sw_skip:[m
[31m-                if (buf[i] == LF) {[m
[31m-                    state = sw_login;[m
[31m-                    login = 0;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (state == sw_passwd) {[m
[31m-            left = left + n - passwd;[m
[31m-            ngx_memmove(buf, &buf[passwd], left);[m
[31m-            passwd = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            left = 0;[m
[31m-        }[m
[31m-[m
[31m-        offset += n;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_auth_basic_close(&file);[m
[31m-[m
[31m-    if (state == sw_passwd) {[m
[31m-        pwd.len = i - passwd;[m
[31m-        pwd.data = ngx_pnalloc(r->pool, pwd.len + 1);[m
[31m-        if (pwd.data == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_cpystrn(pwd.data, &buf[passwd], pwd.len + 1);[m
[31m-[m
[31m-        return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd, &realm);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "user \"%V\" was not found in \"%V\"",[m
[31m-                  &r->headers_in.user, &user_file);[m
[31m-[m
[31m-    return ngx_http_auth_basic_set_realm(r, &realm);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm)[m
[31m-{[m
[31m-    ngx_int_t   rc;[m
[31m-    u_char     *encrypted;[m
[31m-[m
[31m-    rc = ngx_crypt(r->pool, r->headers_in.passwd.data, passwd->data,[m
[31m-                   &encrypted);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rc: %i user: \"%V\" salt: \"%s\"",[m
[31m-                   rc, &r->headers_in.user, passwd->data);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        if (ngx_strcmp(encrypted, passwd->data) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "encrypted: \"%s\"", encrypted);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "user \"%V\": password mismatch",[m
[31m-                      &r->headers_in.user);[m
[31m-[m
[31m-        return ngx_http_auth_basic_set_realm(r, realm);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_palloc(r->pool, sizeof(ngx_http_auth_basic_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_auth_basic_module);[m
[31m-[m
[31m-        ctx->passwd.len = passwd->len;[m
[31m-        passwd->len++;[m
[31m-[m
[31m-        ctx->passwd.data = ngx_pstrdup(r->pool, passwd);[m
[31m-        if (ctx->passwd.data == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: add mutex event */[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_basic_set_realm(ngx_http_request_t *r, ngx_str_t *realm)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    u_char  *basic, *p;[m
[31m-[m
[31m-    r->headers_out.www_authenticate = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (r->headers_out.www_authenticate == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("Basic realm=\"\"") - 1 + realm->len;[m
[31m-[m
[31m-    basic = ngx_pnalloc(r->pool, len);[m
[31m-    if (basic == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(basic, "Basic realm=\"", sizeof("Basic realm=\"") - 1);[m
[31m-    p = ngx_cpymem(p, realm->data, realm->len);[m
[31m-    *p = '"';[m
[31m-[m
[31m-    r->headers_out.www_authenticate->hash = 1;[m
[31m-    ngx_str_set(&r->headers_out.www_authenticate->key, "WWW-Authenticate");[m
[31m-    r->headers_out.www_authenticate->value.data = basic;[m
[31m-    r->headers_out.www_authenticate->value.len = len;[m
[31m-[m
[31m-    return NGX_HTTP_UNAUTHORIZED;[m
[31m-}[m
[31m-[m
[31m-static void[m
[31m-ngx_http_auth_basic_close(ngx_file_t *file)[m
[31m-{[m
[31m-    if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, file->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file->name.data);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_auth_basic_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_basic_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_auth_basic_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_auth_basic_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->realm == NULL) {[m
[31m-        conf->realm = prev->realm;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->user_file.value.data == NULL) {[m
[31m-        conf->user_file = prev->user_file;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_basic_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_auth_basic_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_basic_user_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_auth_basic_loc_conf_t *alcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (alcf->user_file.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &alcf->user_file;[m
[31m-    ccv.zero = 1;[m
[31m-    ccv.conf_prefix = 1;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_auth_request_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_auth_request_module.c[m
[1mdeleted file mode 100644[m
[1mindex bab79e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_auth_request_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,444 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 uri;[m
[31m-    ngx_array_t              *vars;[m
[31m-} ngx_http_auth_request_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                done;[m
[31m-    ngx_uint_t                status;[m
[31m-    ngx_http_request_t       *subrequest;[m
[31m-} ngx_http_auth_request_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                 index;[m
[31m-    ngx_http_complex_value_t  value;[m
[31m-    ngx_http_set_variable_pt  set_handler;[m
[31m-} ngx_http_auth_request_variable_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_auth_request_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_auth_request_done(ngx_http_request_t *r,[m
[31m-    void *data, ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_auth_request_set_variables(ngx_http_request_t *r,[m
[31m-    ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_auth_request_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static void *ngx_http_auth_request_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_auth_request_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_auth_request_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_auth_request_commands[] = {[m
[31m-[m
[31m-    { ngx_string("auth_request"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_auth_request,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_request_set"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_auth_request_set,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_auth_request_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_auth_request_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_auth_request_create_conf,     /* create location configuration */[m
[31m-    ngx_http_auth_request_merge_conf       /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_auth_request_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_auth_request_module_ctx,     /* module context */[m
[31m-    ngx_http_auth_request_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t               *h, *ho;[m
[31m-    ngx_http_request_t            *sr;[m
[31m-    ngx_http_post_subrequest_t    *ps;[m
[31m-    ngx_http_auth_request_ctx_t   *ctx;[m
[31m-    ngx_http_auth_request_conf_t  *arcf;[m
[31m-[m
[31m-    arcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_request_module);[m
[31m-[m
[31m-    if (arcf->uri.len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "auth request handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_auth_request_module);[m
[31m-[m
[31m-    if (ctx != NULL) {[m
[31m-        if (!ctx->done) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * as soon as we are done - explicitly set variables to make[m
[31m-         * sure they will be available after internal redirects[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_http_auth_request_set_variables(r, arcf, ctx) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* return appropriate status */[m
[31m-[m
[31m-        if (ctx->status == NGX_HTTP_FORBIDDEN) {[m
[31m-            return ctx->status;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->status == NGX_HTTP_UNAUTHORIZED) {[m
[31m-            sr = ctx->subrequest;[m
[31m-[m
[31m-            h = sr->headers_out.www_authenticate;[m
[31m-[m
[31m-            if (!h && sr->upstream) {[m
[31m-                h = sr->upstream->headers_in.www_authenticate;[m
[31m-            }[m
[31m-[m
[31m-            if (h) {[m
[31m-                ho = ngx_list_push(&r->headers_out.headers);[m
[31m-                if (ho == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                *ho = *h;[m
[31m-[m
[31m-                r->headers_out.www_authenticate = ho;[m
[31m-            }[m
[31m-[m
[31m-            return ctx->status;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->status >= NGX_HTTP_OK[m
[31m-            && ctx->status < NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "auth request unexpected status: %ui", ctx->status);[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_auth_request_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ps = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-    if (ps == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ps->handler = ngx_http_auth_request_done;[m
[31m-    ps->data = ctx;[m
[31m-[m
[31m-    if (ngx_http_subrequest(r, &arcf->uri, NULL, &sr, ps,[m
[31m-                            NGX_HTTP_SUBREQUEST_WAITED)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * allocate fake request body to avoid attempts to read it and to make[m
[31m-     * sure real body file (if already read) won't be closed by upstream[m
[31m-     */[m
[31m-[m
[31m-    sr->request_body = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (sr->request_body == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr->header_only = 1;[m
[31m-[m
[31m-    ctx->subrequest = sr;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_auth_request_module);[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_done(ngx_http_request_t *r, void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_auth_request_ctx_t   *ctx = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "auth request done s:%ui", r->headers_out.status);[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-    ctx->status = r->headers_out.status;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_set_variables(ngx_http_request_t *r,[m
[31m-    ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_str_t                          val;[m
[31m-    ngx_http_variable_t               *v;[m
[31m-    ngx_http_variable_value_t         *vv;[m
[31m-    ngx_http_auth_request_variable_t  *av, *last;[m
[31m-    ngx_http_core_main_conf_t         *cmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "auth request set variables");[m
[31m-[m
[31m-    if (arcf->vars == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-    v = cmcf->variables.elts;[m
[31m-[m
[31m-    av = arcf->vars->elts;[m
[31m-    last = av + arcf->vars->nelts;[m
[31m-[m
[31m-    while (av < last) {[m
[31m-        /*[m
[31m-         * explicitly set new value to make sure it will be available after[m
[31m-         * internal redirects[m
[31m-         */[m
[31m-[m
[31m-        vv = &r->variables[av->index];[m
[31m-[m
[31m-        if (ngx_http_complex_value(ctx->subrequest, &av->value, &val)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        vv->valid = 1;[m
[31m-        vv->not_found = 0;[m
[31m-        vv->data = val.data;[m
[31m-        vv->len = val.len;[m
[31m-[m
[31m-        if (av->set_handler) {[m
[31m-            /*[m
[31m-             * set_handler only available in cmcf->variables_keys, so we store[m
[31m-             * it explicitly[m
[31m-             */[m
[31m-[m
[31m-            av->set_handler(r, vv, v[av->index].data);[m
[31m-        }[m
[31m-[m
[31m-        av++;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "auth request variable");[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_auth_request_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_auth_request_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_request_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->uri = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->vars = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_request_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_auth_request_conf_t *prev = parent;[m
[31m-    ngx_http_auth_request_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->uri, prev->uri, "");[m
[31m-    ngx_conf_merge_ptr_value(conf->vars, prev->vars, NULL);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_auth_request_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_auth_request_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_auth_request_conf_t *arcf = conf;[m
[31m-[m
[31m-    ngx_str_t        *value;[m
[31m-[m
[31m-    if (arcf->uri.data != NULL) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        arcf->uri.len = 0;[m
[31m-        arcf->uri.data = (u_char *) "";[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    arcf->uri = value[1];[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_auth_request_conf_t *arcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_variable_t               *v;[m
[31m-    ngx_http_auth_request_variable_t  *av;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value[1].len--;[m
[31m-    value[1].data++;[m
[31m-[m
[31m-    if (arcf->vars == NGX_CONF_UNSET_PTR) {[m
[31m-        arcf->vars = ngx_array_create(cf->pool, 1,[m
[31m-                                      sizeof(ngx_http_auth_request_variable_t));[m
[31m-        if (arcf->vars == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    av = ngx_array_push(arcf->vars);[m
[31m-    if (av == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    av->index = ngx_http_get_variable_index(cf, &value[1]);[m
[31m-    if (av->index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->get_handler == NULL) {[m
[31m-        v->get_handler = ngx_http_auth_request_variable;[m
[31m-        v->data = (uintptr_t) av;[m
[31m-    }[m
[31m-[m
[31m-    av->set_handler = v->set_handler;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &av->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_autoindex_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_autoindex_module.c[m
[1mdeleted file mode 100644[m
[1mindex b3bf652..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_autoindex_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1050 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_buf_t     *buf;[m
[31m-    size_t         size;[m
[31m-    ngx_pool_t    *pool;[m
[31m-    size_t         alloc_size;[m
[31m-    ngx_chain_t  **last_out;[m
[31m-} ngx_http_autoindex_ctx_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t      name;[m
[31m-    size_t         utf_len;[m
[31m-    size_t         escape;[m
[31m-    size_t         escape_html;[m
[31m-[m
[31m-    unsigned       dir:1;[m
[31m-    unsigned       file:1;[m
[31m-[m
[31m-    time_t         mtime;[m
[31m-    off_t          size;[m
[31m-} ngx_http_autoindex_entry_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t     enable;[m
[31m-    ngx_uint_t     format;[m
[31m-    ngx_flag_t     localtime;[m
[31m-    ngx_flag_t     exact_size;[m
[31m-} ngx_http_autoindex_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_AUTOINDEX_HTML         0[m
[31m-#define NGX_HTTP_AUTOINDEX_JSON         1[m
[31m-#define NGX_HTTP_AUTOINDEX_JSONP        2[m
[31m-#define NGX_HTTP_AUTOINDEX_XML          3[m
[31m-[m
[31m-#define NGX_HTTP_AUTOINDEX_PREALLOCATE  50[m
[31m-[m
[31m-#define NGX_HTTP_AUTOINDEX_NAME_LEN     50[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *ngx_http_autoindex_html(ngx_http_request_t *r,[m
[31m-    ngx_array_t *entries);[m
[31m-static ngx_buf_t *ngx_http_autoindex_json(ngx_http_request_t *r,[m
[31m-    ngx_array_t *entries, ngx_str_t *callback);[m
[31m-static ngx_int_t ngx_http_autoindex_jsonp_callback(ngx_http_request_t *r,[m
[31m-    ngx_str_t *callback);[m
[31m-static ngx_buf_t *ngx_http_autoindex_xml(ngx_http_request_t *r,[m
[31m-    ngx_array_t *entries);[m
[31m-[m
[31m-static int ngx_libc_cdecl ngx_http_autoindex_cmp_entries(const void *one,[m
[31m-    const void *two);[m
[31m-static ngx_int_t ngx_http_autoindex_error(ngx_http_request_t *r,[m
[31m-    ngx_dir_t *dir, ngx_str_t *name);[m
[31m-[m
[31m-static ngx_int_t ngx_http_autoindex_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_autoindex_format[] = {[m
[31m-    { ngx_string("html"), NGX_HTTP_AUTOINDEX_HTML },[m
[31m-    { ngx_string("json"), NGX_HTTP_AUTOINDEX_JSON },[m
[31m-    { ngx_string("jsonp"), NGX_HTTP_AUTOINDEX_JSONP },[m
[31m-    { ngx_string("xml"), NGX_HTTP_AUTOINDEX_XML },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_autoindex_commands[] = {[m
[31m-[m
[31m-    { ngx_string("autoindex"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_autoindex_loc_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("autoindex_format"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_autoindex_loc_conf_t, format),[m
[31m-      &ngx_http_autoindex_format },[m
[31m-[m
[31m-    { ngx_string("autoindex_localtime"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_autoindex_loc_conf_t, localtime),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("autoindex_exact_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_autoindex_loc_conf_t, exact_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_autoindex_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_autoindex_init,               /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_autoindex_create_loc_conf,    /* create location configuration */[m
[31m-    ngx_http_autoindex_merge_loc_conf      /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_autoindex_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_autoindex_module_ctx,        /* module context */[m
[31m-    ngx_http_autoindex_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_autoindex_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                         *last, *filename;[m
[31m-    size_t                          len, allocated, root;[m
[31m-    ngx_err_t                       err;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_str_t                       path, callback;[m
[31m-    ngx_dir_t                       dir;[m
[31m-    ngx_uint_t                      level, format;[m
[31m-    ngx_pool_t                     *pool;[m
[31m-    ngx_chain_t                     out;[m
[31m-    ngx_array_t                     entries;[m
[31m-    ngx_http_autoindex_entry_t     *entry;[m
[31m-    ngx_http_autoindex_loc_conf_t  *alcf;[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);[m
[31m-[m
[31m-    if (!alcf->enable) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    /* NGX_DIR_MASK_LEN is lesser than NGX_HTTP_AUTOINDEX_PREALLOCATE */[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root,[m
[31m-                                    NGX_HTTP_AUTOINDEX_PREALLOCATE);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    allocated = path.len;[m
[31m-    path.len = last - path.data;[m
[31m-    if (path.len > 1) {[m
[31m-        path.len--;[m
[31m-    }[m
[31m-    path.data[path.len] = '\0';[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http autoindex: \"%s\"", path.data);[m
[31m-[m
[31m-    format = alcf->format;[m
[31m-[m
[31m-    if (format == NGX_HTTP_AUTOINDEX_JSONP) {[m
[31m-        if (ngx_http_autoindex_jsonp_callback(r, &callback) != NGX_OK) {[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        if (callback.len == 0) {[m
[31m-            format = NGX_HTTP_AUTOINDEX_JSON;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_dir(&path, &dir) == NGX_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT[m
[31m-            || err == NGX_ENOTDIR[m
[31m-            || err == NGX_ENAMETOOLONG)[m
[31m-        {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-        } else if (err == NGX_EACCES) {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, r->connection->log, err,[m
[31m-                      ngx_open_dir_n " \"%s\" failed", path.data);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-[m
[31m-    /* MSVC thinks 'entries' may be used without having been initialized */[m
[31m-    ngx_memzero(&entries, sizeof(ngx_array_t));[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: pool should be temporary pool */[m
[31m-    pool = r->pool;[m
[31m-[m
[31m-    if (ngx_array_init(&entries, pool, 40, sizeof(ngx_http_autoindex_entry_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-[m
[31m-    switch (format) {[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_JSON:[m
[31m-        ngx_str_set(&r->headers_out.content_type, "application/json");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_JSONP:[m
[31m-        ngx_str_set(&r->headers_out.content_type, "application/javascript");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_XML:[m
[31m-        ngx_str_set(&r->headers_out.content_type, "text/xml");[m
[31m-        ngx_str_set(&r->headers_out.charset, "utf-8");[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_HTTP_AUTOINDEX_HTML */[m
[31m-        ngx_str_set(&r->headers_out.content_type, "text/html");[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_len = r->headers_out.content_type.len;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        if (ngx_close_dir(&dir) == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                          ngx_close_dir_n " \"%V\" failed", &path);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    filename = path.data;[m
[31m-    filename[path.len] = '/';[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_set_errno(0);[m
[31m-[m
[31m-        if (ngx_read_dir(&dir) == NGX_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err != NGX_ENOMOREFILES) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                              ngx_read_dir_n " \"%V\" failed", &path);[m
[31m-                return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http autoindex file: \"%s\"", ngx_de_name(&dir));[m
[31m-[m
[31m-        len = ngx_de_namelen(&dir);[m
[31m-[m
[31m-        if (ngx_de_name(&dir)[0] == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (!dir.valid_info) {[m
[31m-[m
[31m-            /* 1 byte for '/' and 1 byte for terminating '\0' */[m
[31m-[m
[31m-            if (path.len + 1 + len + 1 > allocated) {[m
[31m-                allocated = path.len + 1 + len + 1[m
[31m-                                     + NGX_HTTP_AUTOINDEX_PREALLOCATE;[m
[31m-[m
[31m-                filename = ngx_pnalloc(pool, allocated);[m
[31m-                if (filename == NULL) {[m
[31m-                    return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-                }[m
[31m-[m
[31m-                last = ngx_cpystrn(filename, path.data, path.len + 1);[m
[31m-                *last++ = '/';[m
[31m-            }[m
[31m-[m
[31m-            ngx_cpystrn(last, ngx_de_name(&dir), len + 1);[m
[31m-[m
[31m-            if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                if (err != NGX_ENOENT && err != NGX_ELOOP) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                                  ngx_de_info_n " \"%s\" failed", filename);[m
[31m-[m
[31m-                    if (err == NGX_EACCES) {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                                  ngx_de_link_info_n " \"%s\" failed",[m
[31m-                                  filename);[m
[31m-                    return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        entry = ngx_array_push(&entries);[m
[31m-        if (entry == NULL) {[m
[31m-            return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-        }[m
[31m-[m
[31m-        entry->name.len = len;[m
[31m-[m
[31m-        entry->name.data = ngx_pnalloc(pool, len + 1);[m
[31m-        if (entry->name.data == NULL) {[m
[31m-            return ngx_http_autoindex_error(r, &dir, &path);[m
[31m-        }[m
[31m-[m
[31m-        ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1);[m
[31m-[m
[31m-        entry->dir = ngx_de_is_dir(&dir);[m
[31m-        entry->file = ngx_de_is_file(&dir);[m
[31m-        entry->mtime = ngx_de_mtime(&dir);[m
[31m-        entry->size = ngx_de_size(&dir);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_dir(&dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%V\" failed", &path);[m
[31m-    }[m
[31m-[m
[31m-    if (entries.nelts > 1) {[m
[31m-        ngx_qsort(entries.elts, (size_t) entries.nelts,[m
[31m-                  sizeof(ngx_http_autoindex_entry_t),[m
[31m-                  ngx_http_autoindex_cmp_entries);[m
[31m-    }[m
[31m-[m
[31m-    switch (format) {[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_JSON:[m
[31m-        b = ngx_http_autoindex_json(r, &entries, NULL);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_JSONP:[m
[31m-        b = ngx_http_autoindex_json(r, &entries, &callback);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_AUTOINDEX_XML:[m
[31m-        b = ngx_http_autoindex_xml(r, &entries);[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_HTTP_AUTOINDEX_HTML */[m
[31m-        b = ngx_http_autoindex_html(r, &entries);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: free temporary pool */[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_autoindex_html(ngx_http_request_t *r, ngx_array_t *entries)[m
[31m-{[m
[31m-    u_char                         *last, scale;[m
[31m-    off_t                           length;[m
[31m-    size_t                          len, char_len, escape_html;[m
[31m-    ngx_tm_t                        tm;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_int_t                       size;[m
[31m-    ngx_uint_t                      i, utf8;[m
[31m-    ngx_time_t                     *tp;[m
[31m-    ngx_http_autoindex_entry_t     *entry;[m
[31m-    ngx_http_autoindex_loc_conf_t  *alcf;[m
[31m-[m
[31m-    static u_char  title[] =[m
[31m-        "<html>" CRLF[m
[31m-        "<head><title>Index of "[m
[31m-    ;[m
[31m-[m
[31m-    static u_char  header[] =[m
[31m-        "</title></head>" CRLF[m
[31m-        "<body bgcolor=\"white\">" CRLF[m
[31m-        "<h1>Index of "[m
[31m-    ;[m
[31m-[m
[31m-    static u_char  tail[] =[m
[31m-        "</body>" CRLF[m
[31m-        "</html>" CRLF[m
[31m-    ;[m
[31m-[m
[31m-    static char  *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",[m
[31m-                               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };[m
[31m-[m
[31m-    if (r->headers_out.charset.len == 5[m
[31m-        && ngx_strncasecmp(r->headers_out.charset.data, (u_char *) "utf-8", 5)[m
[31m-           == 0)[m
[31m-    {[m
[31m-        utf8 = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        utf8 = 0;[m
[31m-    }[m
[31m-[m
[31m-    escape_html = ngx_escape_html(NULL, r->uri.data, r->uri.len);[m
[31m-[m
[31m-    len = sizeof(title) - 1[m
[31m-          + r->uri.len + escape_html[m
[31m-          + sizeof(header) - 1[m
[31m-          + r->uri.len + escape_html[m
[31m-          + sizeof("</h1>") - 1[m
[31m-          + sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1[m
[31m-          + sizeof("</pre><hr>") - 1[m
[31m-          + sizeof(tail) - 1;[m
[31m-[m
[31m-    entry = entries->elts;[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        entry[i].escape = 2 * ngx_escape_uri(NULL, entry[i].name.data,[m
[31m-                                             entry[i].name.len,[m
[31m-                                             NGX_ESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-        entry[i].escape_html = ngx_escape_html(NULL, entry[i].name.data,[m
[31m-                                               entry[i].name.len);[m
[31m-[m
[31m-        if (utf8) {[m
[31m-            entry[i].utf_len = ngx_utf8_length(entry[i].name.data,[m
[31m-                                               entry[i].name.len);[m
[31m-        } else {[m
[31m-            entry[i].utf_len = entry[i].name.len;[m
[31m-        }[m
[31m-[m
[31m-        len += sizeof("<a href=\"") - 1[m
[31m-            + entry[i].name.len + entry[i].escape[m
[31m-            + 1                                          /* 1 is for "/" */[m
[31m-            + sizeof("\">") - 1[m
[31m-            + entry[i].name.len - entry[i].utf_len[m
[31m-            + entry[i].escape_html[m
[31m-            + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof("&gt;") - 2[m
[31m-            + sizeof("</a>") - 1[m
[31m-            + sizeof(" 28-Sep-1970 12:00 ") - 1[m
[31m-            + 20                                         /* the file size */[m
[31m-            + 2;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, title, sizeof(title) - 1);[m
[31m-[m
[31m-    if (escape_html) {[m
[31m-        b->last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len);[m
[31m-        b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);[m
[31m-        b->last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);[m
[31m-        b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);[m
[31m-        b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "</h1>", sizeof("</h1>") - 1);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "<hr><pre><a href=\"../\">../</a>" CRLF,[m
[31m-                         sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1);[m
[31m-[m
[31m-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        b->last = ngx_cpymem(b->last, "<a href=\"", sizeof("<a href=\"") - 1);[m
[31m-[m
[31m-        if (entry[i].escape) {[m
[31m-            ngx_escape_uri(b->last, entry[i].name.data, entry[i].name.len,[m
[31m-                           NGX_ESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            b->last += entry[i].name.len + entry[i].escape;[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_cpymem(b->last, entry[i].name.data,[m
[31m-                                 entry[i].name.len);[m
[31m-        }[m
[31m-[m
[31m-        if (entry[i].dir) {[m
[31m-            *b->last++ = '/';[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = '"';[m
[31m-        *b->last++ = '>';[m
[31m-[m
[31m-        len = entry[i].utf_len;[m
[31m-[m
[31m-        if (entry[i].name.len != len) {[m
[31m-            if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {[m
[31m-                char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3 + 1;[m
[31m-[m
[31m-            } else {[m
[31m-                char_len = NGX_HTTP_AUTOINDEX_NAME_LEN + 1;[m
[31m-            }[m
[31m-[m
[31m-            last = b->last;[m
[31m-            b->last = ngx_utf8_cpystrn(b->last, entry[i].name.data,[m
[31m-                                       char_len, entry[i].name.len + 1);[m
[31m-[m
[31m-            if (entry[i].escape_html) {[m
[31m-                b->last = (u_char *) ngx_escape_html(last, entry[i].name.data,[m
[31m-                                                     b->last - last);[m
[31m-            }[m
[31m-[m
[31m-            last = b->last;[m
[31m-[m
[31m-        } else {[m
[31m-            if (entry[i].escape_html) {[m
[31m-                if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {[m
[31m-                    char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3;[m
[31m-[m
[31m-                } else {[m
[31m-                    char_len = len;[m
[31m-                }[m
[31m-[m
[31m-                b->last = (u_char *) ngx_escape_html(b->last,[m
[31m-                                                  entry[i].name.data, char_len);[m
[31m-                last = b->last;[m
[31m-[m
[31m-            } else {[m
[31m-                b->last = ngx_cpystrn(b->last, entry[i].name.data,[m
[31m-                                      NGX_HTTP_AUTOINDEX_NAME_LEN + 1);[m
[31m-                last = b->last - 3;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {[m
[31m-            b->last = ngx_cpymem(last, "..&gt;</a>", sizeof("..&gt;</a>") - 1);[m
[31m-[m
[31m-        } else {[m
[31m-            if (entry[i].dir && NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {[m
[31m-                *b->last++ = '/';[m
[31m-                len++;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_cpymem(b->last, "</a>", sizeof("</a>") - 1);[m
[31m-[m
[31m-            if (NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {[m
[31m-                ngx_memset(b->last, ' ', NGX_HTTP_AUTOINDEX_NAME_LEN - len);[m
[31m-                b->last += NGX_HTTP_AUTOINDEX_NAME_LEN - len;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = ' ';[m
[31m-[m
[31m-        ngx_gmtime(entry[i].mtime + tp->gmtoff * 60 * alcf->localtime, &tm);[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "%02d-%s-%d %02d:%02d ",[m
[31m-                              tm.ngx_tm_mday,[m
[31m-                              months[tm.ngx_tm_mon - 1],[m
[31m-                              tm.ngx_tm_year,[m
[31m-                              tm.ngx_tm_hour,[m
[31m-                              tm.ngx_tm_min);[m
[31m-[m
[31m-        if (alcf->exact_size) {[m
[31m-            if (entry[i].dir) {[m
[31m-                b->last = ngx_cpymem(b->last,  "                  -",[m
[31m-                                     sizeof("                  -") - 1);[m
[31m-            } else {[m
[31m-                b->last = ngx_sprintf(b->last, "%19O", entry[i].size);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (entry[i].dir) {[m
[31m-                b->last = ngx_cpymem(b->last,  "      -",[m
[31m-                                     sizeof("      -") - 1);[m
[31m-[m
[31m-            } else {[m
[31m-                length = entry[i].size;[m
[31m-[m
[31m-                if (length > 1024 * 1024 * 1024 - 1) {[m
[31m-                    size = (ngx_int_t) (length / (1024 * 1024 * 1024));[m
[31m-                    if ((length % (1024 * 1024 * 1024))[m
[31m-                                                > (1024 * 1024 * 1024 / 2 - 1))[m
[31m-                    {[m
[31m-                        size++;[m
[31m-                    }[m
[31m-                    scale = 'G';[m
[31m-[m
[31m-                } else if (length > 1024 * 1024 - 1) {[m
[31m-                    size = (ngx_int_t) (length / (1024 * 1024));[m
[31m-                    if ((length % (1024 * 1024)) > (1024 * 1024 / 2 - 1)) {[m
[31m-                        size++;[m
[31m-                    }[m
[31m-                    scale = 'M';[m
[31m-[m
[31m-                } else if (length > 9999) {[m
[31m-                    size = (ngx_int_t) (length / 1024);[m
[31m-                    if (length % 1024 > 511) {[m
[31m-                        size++;[m
[31m-                    }[m
[31m-                    scale = 'K';[m
[31m-[m
[31m-                } else {[m
[31m-                    size = (ngx_int_t) length;[m
[31m-                    scale = '\0';[m
[31m-                }[m
[31m-[m
[31m-                if (scale) {[m
[31m-                    b->last = ngx_sprintf(b->last, "%6i%c", size, scale);[m
[31m-[m
[31m-                } else {[m
[31m-                    b->last = ngx_sprintf(b->last, " %6i", size);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = CR;[m
[31m-        *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "</pre><hr>", sizeof("</pre><hr>") - 1);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_autoindex_json(ngx_http_request_t *r, ngx_array_t *entries,[m
[31m-    ngx_str_t *callback)[m
[31m-{[m
[31m-    size_t                       len;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_http_autoindex_entry_t  *entry;[m
[31m-[m
[31m-    len = sizeof("[" CRLF CRLF "]") - 1;[m
[31m-[m
[31m-    if (callback) {[m
[31m-        len += sizeof("/* callback */" CRLF "();") - 1 + callback->len;[m
[31m-    }[m
[31m-[m
[31m-    entry = entries->elts;[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        entry[i].escape = ngx_escape_json(NULL, entry[i].name.data,[m
[31m-                                          entry[i].name.len);[m
[31m-[m
[31m-        len += sizeof("{  }," CRLF) - 1[m
[31m-            + sizeof("\"name\":\"\"") - 1[m
[31m-            + entry[i].name.len + entry[i].escape[m
[31m-            + sizeof(", \"type\":\"directory\"") - 1[m
[31m-            + sizeof(", \"mtime\":\"Wed, 31 Dec 1986 10:00:00 GMT\"") - 1;[m
[31m-[m
[31m-        if (entry[i].file) {[m
[31m-            len += sizeof(", \"size\":") - 1 + NGX_OFF_T_LEN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (callback) {[m
[31m-        b->last = ngx_cpymem(b->last, "/* callback */" CRLF,[m
[31m-                             sizeof("/* callback */" CRLF) - 1);[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, callback->data, callback->len);[m
[31m-[m
[31m-        *b->last++ = '(';[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = '[';[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        b->last = ngx_cpymem(b->last, CRLF "{ \"name\":\"",[m
[31m-                             sizeof(CRLF "{ \"name\":\"") - 1);[m
[31m-[m
[31m-        if (entry[i].escape) {[m
[31m-            b->last = (u_char *) ngx_escape_json(b->last, entry[i].name.data,[m
[31m-                                                 entry[i].name.len);[m
[31m-        } else {[m
[31m-            b->last = ngx_cpymem(b->last, entry[i].name.data,[m
[31m-                                 entry[i].name.len);[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "\", \"type\":\"",[m
[31m-                             sizeof("\", \"type\":\"") - 1);[m
[31m-[m
[31m-        if (entry[i].dir) {[m
[31m-            b->last = ngx_cpymem(b->last, "directory", sizeof("directory") - 1);[m
[31m-[m
[31m-        } else if (entry[i].file) {[m
[31m-            b->last = ngx_cpymem(b->last, "file", sizeof("file") - 1);[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_cpymem(b->last, "other", sizeof("other") - 1);[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "\", \"mtime\":\"",[m
[31m-                             sizeof("\", \"mtime\":\"") - 1);[m
[31m-[m
[31m-        b->last = ngx_http_time(b->last, entry[i].mtime);[m
[31m-[m
[31m-        if (entry[i].file) {[m
[31m-            b->last = ngx_cpymem(b->last, "\", \"size\":",[m
[31m-                                 sizeof("\", \"size\":") - 1);[m
[31m-            b->last = ngx_sprintf(b->last, "%O", entry[i].size);[m
[31m-[m
[31m-        } else {[m
[31m-            *b->last++ = '"';[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, " },", sizeof(" },") - 1);[m
[31m-    }[m
[31m-[m
[31m-    if (i > 0) {[m
[31m-        b->last--;  /* strip last comma */[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, CRLF "]", sizeof(CRLF "]") - 1);[m
[31m-[m
[31m-    if (callback) {[m
[31m-        *b->last++ = ')'; *b->last++ = ';';[m
[31m-    }[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_autoindex_jsonp_callback(ngx_http_request_t *r, ngx_str_t *callback)[m
[31m-{[m
[31m-    u_char      *p, c, ch;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (ngx_http_arg(r, (u_char *) "callback", 8, callback) != NGX_OK) {[m
[31m-        callback->len = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (callback->len > 128) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent too long callback name: \"%V\"", callback);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    p = callback->data;[m
[31m-[m
[31m-    for (i = 0; i < callback->len; i++) {[m
[31m-        ch = p[i];[m
[31m-[m
[31m-        c = (u_char) (ch | 0x20);[m
[31m-        if (c >= 'a' && c <= 'z') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((ch >= '0' && ch <= '9') || ch == '_' || ch == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent invalid callback name: \"%V\"", callback);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_autoindex_xml(ngx_http_request_t *r, ngx_array_t *entries)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_tm_t                        tm;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_str_t                       type;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_http_autoindex_entry_t     *entry;[m
[31m-[m
[31m-    static u_char  head[] = "<?xml version=\"1.0\"?>" CRLF "<list>" CRLF;[m
[31m-    static u_char  tail[] = "</list>" CRLF;[m
[31m-[m
[31m-    len = sizeof(head) - 1 + sizeof(tail) - 1;[m
[31m-[m
[31m-    entry = entries->elts;[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        entry[i].escape = ngx_escape_html(NULL, entry[i].name.data,[m
[31m-                                          entry[i].name.len);[m
[31m-[m
[31m-        len += sizeof("<directory></directory>" CRLF) - 1[m
[31m-            + entry[i].name.len + entry[i].escape[m
[31m-            + sizeof(" mtime=\"1986-12-31T10:00:00Z\"") - 1;[m
[31m-[m
[31m-        if (entry[i].file) {[m
[31m-            len += sizeof(" size=\"\"") - 1 + NGX_OFF_T_LEN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, head, sizeof(head) - 1);[m
[31m-[m
[31m-    for (i = 0; i < entries->nelts; i++) {[m
[31m-        *b->last++ = '<';[m
[31m-[m
[31m-        if (entry[i].dir) {[m
[31m-            ngx_str_set(&type, "directory");[m
[31m-[m
[31m-        } else if (entry[i].file) {[m
[31m-            ngx_str_set(&type, "file");[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_set(&type, "other");[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, type.data, type.len);[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, " mtime=\"", sizeof(" mtime=\"") - 1);[m
[31m-[m
[31m-        ngx_gmtime(entry[i].mtime, &tm);[m
[31m-[m
[31m-        b->last = ngx_sprintf(b->last, "%4d-%02d-%02dT%02d:%02d:%02dZ",[m
[31m-                              tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                              tm.ngx_tm_mday, tm.ngx_tm_hour,[m
[31m-                              tm.ngx_tm_min, tm.ngx_tm_sec);[m
[31m-[m
[31m-        if (entry[i].file) {[m
[31m-            b->last = ngx_cpymem(b->last, "\" size=\"",[m
[31m-                                 sizeof("\" size=\"") - 1);[m
[31m-            b->last = ngx_sprintf(b->last, "%O", entry[i].size);[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = '"'; *b->last++ = '>';[m
[31m-[m
[31m-        if (entry[i].escape) {[m
[31m-            b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data,[m
[31m-                                                 entry[i].name.len);[m
[31m-        } else {[m
[31m-            b->last = ngx_cpymem(b->last, entry[i].name.data,[m
[31m-                                 entry[i].name.len);[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = '<'; *b->last++ = '/';[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, type.data, type.len);[m
[31m-[m
[31m-        *b->last++ = '>';[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_autoindex_cmp_entries(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_http_autoindex_entry_t *first = (ngx_http_autoindex_entry_t *) one;[m
[31m-    ngx_http_autoindex_entry_t *second = (ngx_http_autoindex_entry_t *) two;[m
[31m-[m
[31m-    if (first->dir && !second->dir) {[m
[31m-        /* move the directories to the start */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->dir && second->dir) {[m
[31m-        /* move the directories to the start */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return (int) ngx_strcmp(first->name.data, second->name.data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_autoindex_alloc(ngx_http_autoindex_ctx_t *ctx, size_t size)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (ctx->buf) {[m
[31m-[m
[31m-        if ((size_t) (ctx->buf->end - ctx->buf->last) >= size) {[m
[31m-            return ctx->buf;[m
[31m-        }[m
[31m-[m
[31m-        ctx->size += ctx->buf->last - ctx->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    ctx->buf = ngx_create_temp_buf(ctx->pool, ctx->alloc_size);[m
[31m-    if (ctx->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(ctx->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ctx->buf;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    *ctx->last_out = cl;[m
[31m-    ctx->last_out = &cl->next;[m
[31m-[m
[31m-    return ctx->buf;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir, ngx_str_t *name)[m
[31m-{[m
[31m-    if (ngx_close_dir(dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%V\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    return r->header_sent ? NGX_ERROR : NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_autoindex_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_autoindex_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET;[m
[31m-    conf->format = NGX_CONF_UNSET_UINT;[m
[31m-    conf->localtime = NGX_CONF_UNSET;[m
[31m-    conf->exact_size = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_autoindex_loc_conf_t *prev = parent;[m
[31m-    ngx_http_autoindex_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->format, prev->format,[m
[31m-                              NGX_HTTP_AUTOINDEX_HTML);[m
[31m-    ngx_conf_merge_value(conf->localtime, prev->localtime, 0);[m
[31m-    ngx_conf_merge_value(conf->exact_size, prev->exact_size, 1);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_autoindex_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_autoindex_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_browser_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_browser_module.c[m
[1mdeleted file mode 100644[m
[1mindex 80da0d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_browser_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,715 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The module can check browser versions conforming to the following formats:[m
[31m- * X, X.X, X.X.X, and X.X.X.X.  The maximum values of each format may be[m
[31m- * 4000, 4000.99, 4000.99.99, and 4000.99.99.99.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#define  NGX_HTTP_MODERN_BROWSER   0[m
[31m-#define  NGX_HTTP_ANCIENT_BROWSER  1[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                      browser[12];[m
[31m-    size_t                      skip;[m
[31m-    size_t                      add;[m
[31m-    u_char                      name[12];[m
[31m-} ngx_http_modern_browser_mask_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                  version;[m
[31m-    size_t                      skip;[m
[31m-    size_t                      add;[m
[31m-    u_char                      name[12];[m
[31m-} ngx_http_modern_browser_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_http_get_variable_pt    handler;[m
[31m-    uintptr_t                   data;[m
[31m-} ngx_http_browser_variable_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *modern_browsers;[m
[31m-    ngx_array_t                *ancient_browsers;[m
[31m-    ngx_http_variable_value_t  *modern_browser_value;[m
[31m-    ngx_http_variable_value_t  *ancient_browser_value;[m
[31m-[m
[31m-    unsigned                    modern_unlisted_browsers:1;[m
[31m-    unsigned                    netscape4:1;[m
[31m-} ngx_http_browser_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_msie_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_browser_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_uint_t ngx_http_browser(ngx_http_request_t *r,[m
[31m-    ngx_http_browser_conf_t *cf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_browser_add_variable(ngx_conf_t *cf);[m
[31m-static void *ngx_http_browser_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_browser_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static int ngx_libc_cdecl ngx_http_modern_browser_sort(const void *one,[m
[31m-    const void *two);[m
[31m-static char *ngx_http_modern_browser(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_ancient_browser(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_modern_browser_value(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_ancient_browser_value(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_browser_commands[] = {[m
[31m-[m
[31m-    { ngx_string("modern_browser"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_modern_browser,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ancient_browser"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_ancient_browser,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("modern_browser_value"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_modern_browser_value,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ancient_browser_value"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_ancient_browser_value,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_browser_module_ctx = {[m
[31m-    ngx_http_browser_add_variable,         /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_browser_create_conf,          /* create location configuration */[m
[31m-    ngx_http_browser_merge_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_browser_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_browser_module_ctx,          /* module context */[m
[31m-    ngx_http_browser_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_modern_browser_mask_t  ngx_http_modern_browser_masks[] = {[m
[31m-[m
[31m-    /* Opera must be the first browser to check */[m
[31m-[m
[31m-    /*[m
[31m-     * "Opera/7.50 (X11; FreeBSD i386; U)  [en]"[m
[31m-     * "Mozilla/5.0 (X11; FreeBSD i386; U) Opera 7.50  [en]"[m
[31m-     * "Mozilla/4.0 (compatible; MSIE 6.0; X11; FreeBSD i386) Opera 7.50  [en]"[m
[31m-     * "Opera/8.0 (Windows NT 5.1; U; ru)"[m
[31m-     * "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.0"[m
[31m-     * "Opera/9.01 (X11; FreeBSD 6 i386; U; en)"[m
[31m-     */[m
[31m-[m
[31m-    { "opera",[m
[31m-      0,[m
[31m-      sizeof("Opera ") - 1,[m
[31m-      "Opera"},[m
[31m-[m
[31m-    /* "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" */[m
[31m-[m
[31m-    { "msie",[m
[31m-      sizeof("Mozilla/4.0 (compatible; ") - 1,[m
[31m-      sizeof("MSIE ") - 1,[m
[31m-      "MSIE "},[m
[31m-[m
[31m-    /*[m
[31m-     * "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020610"[m
[31m-     * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.5) Gecko/20031006"[m
[31m-     * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.6) Gecko/20040206[m
[31m-     *              Firefox/0.8"[m
[31m-     * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.8)[m
[31m-     *              Gecko/20050511 Firefox/1.0.4"[m
[31m-     * "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.5) Gecko/20060729[m
[31m-     *              Firefox/1.5.0.5"[m
[31m-     */[m
[31m-[m
[31m-    { "gecko",[m
[31m-      sizeof("Mozilla/5.0 (") - 1,[m
[31m-      sizeof("rv:") - 1,[m
[31m-      "rv:"},[m
[31m-[m
[31m-    /*[m
[31m-     * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ru-ru) AppleWebKit/125.2[m
[31m-     *              (KHTML, like Gecko) Safari/125.7"[m
[31m-     * "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413[m
[31m-     *              (KHTML, like Gecko) Safari/413"[m
[31m-     * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418[m
[31m-     *              (KHTML, like Gecko) Safari/417.9.3"[m
[31m-     * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ru-ru) AppleWebKit/418.8[m
[31m-     *              (KHTML, like Gecko) Safari/419.3"[m
[31m-     */[m
[31m-[m
[31m-    { "safari",[m
[31m-      sizeof("Mozilla/5.0 (") - 1,[m
[31m-      sizeof("Safari/") - 1,[m
[31m-      "Safari/"},[m
[31m-[m
[31m-    /*[m
[31m-     * "Mozilla/5.0 (compatible; Konqueror/3.1; Linux)"[m
[31m-     * "Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.2 (like Gecko)"[m
[31m-     * "Mozilla/5.0 (compatible; Konqueror/3.5; FreeBSD) KHTML/3.5.1[m
[31m-     *              (like Gecko)"[m
[31m-     */[m
[31m-[m
[31m-    { "konqueror",[m
[31m-      sizeof("Mozilla/5.0 (compatible; ") - 1,[m
[31m-      sizeof("Konqueror/") - 1,[m
[31m-      "Konqueror/"},[m
[31m-[m
[31m-    { "", 0, 0, "" }[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_browser_variable_t  ngx_http_browsers[] = {[m
[31m-    { ngx_string("msie"), ngx_http_msie_variable, 0 },[m
[31m-    { ngx_string("modern_browser"), ngx_http_browser_variable,[m
[31m-          NGX_HTTP_MODERN_BROWSER },[m
[31m-    { ngx_string("ancient_browser"), ngx_http_browser_variable,[m
[31m-          NGX_HTTP_ANCIENT_BROWSER },[m
[31m-    { ngx_null_string, NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_browser_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t                rc;[m
[31m-    ngx_http_browser_conf_t  *cf;[m
[31m-[m
[31m-    cf = ngx_http_get_module_loc_conf(r, ngx_http_browser_module);[m
[31m-[m
[31m-    rc = ngx_http_browser(r, cf);[m
[31m-[m
[31m-    if (data == NGX_HTTP_MODERN_BROWSER && rc == NGX_HTTP_MODERN_BROWSER) {[m
[31m-        *v = *cf->modern_browser_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (data == NGX_HTTP_ANCIENT_BROWSER && rc == NGX_HTTP_ANCIENT_BROWSER) {[m
[31m-        *v = *cf->ancient_browser_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_browser(ngx_http_request_t *r, ngx_http_browser_conf_t *cf)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    u_char                     *name, *ua, *last, c;[m
[31m-    ngx_str_t                  *ancient;[m
[31m-    ngx_uint_t                  i, version, ver, scale;[m
[31m-    ngx_http_modern_browser_t  *modern;[m
[31m-[m
[31m-    if (r->headers_in.user_agent == NULL) {[m
[31m-        if (cf->modern_unlisted_browsers) {[m
[31m-            return NGX_HTTP_MODERN_BROWSER;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-    }[m
[31m-[m
[31m-    ua = r->headers_in.user_agent->value.data;[m
[31m-    len = r->headers_in.user_agent->value.len;[m
[31m-    last = ua + len;[m
[31m-[m
[31m-    if (cf->modern_browsers) {[m
[31m-        modern = cf->modern_browsers->elts;[m
[31m-[m
[31m-        for (i = 0; i < cf->modern_browsers->nelts; i++) {[m
[31m-            name = ua + modern[i].skip;[m
[31m-[m
[31m-            if (name >= last) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            name = (u_char *) ngx_strstr(name, modern[i].name);[m
[31m-[m
[31m-            if (name == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "browser: \"%s\"", name);[m
[31m-[m
[31m-            name += modern[i].add;[m
[31m-[m
[31m-            if (name >= last) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "version: \"%ui\" \"%s\"", modern[i].version, name);[m
[31m-[m
[31m-            version = 0;[m
[31m-            ver = 0;[m
[31m-            scale = 1000000;[m
[31m-[m
[31m-            while (name < last) {[m
[31m-[m
[31m-                c = *name++;[m
[31m-[m
[31m-                if (c >= '0' && c <= '9') {[m
[31m-                    ver = ver * 10 + (c - '0');[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (c == '.') {[m
[31m-                    version += ver * scale;[m
[31m-[m
[31m-                    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "version: \"%ui\" \"%ui\"",[m
[31m-                                   modern[i].version, version);[m
[31m-[m
[31m-                    if (version > modern[i].version) {[m
[31m-                        return NGX_HTTP_MODERN_BROWSER;[m
[31m-                    }[m
[31m-[m
[31m-                    ver = 0;[m
[31m-                    scale /= 100;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            version += ver * scale;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "version: \"%ui\" \"%ui\"",[m
[31m-                           modern[i].version, version);[m
[31m-[m
[31m-            if (version >= modern[i].version) {[m
[31m-                return NGX_HTTP_MODERN_BROWSER;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-        }[m
[31m-[m
[31m-        if (!cf->modern_unlisted_browsers) {[m
[31m-            return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->netscape4) {[m
[31m-        if (len > sizeof("Mozilla/4.72 ") - 1[m
[31m-            && ngx_strncmp(ua, "Mozilla/", sizeof("Mozilla/") - 1) == 0[m
[31m-            && ua[8] > '0' && ua[8] < '5')[m
[31m-        {[m
[31m-            return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->ancient_browsers) {[m
[31m-        ancient = cf->ancient_browsers->elts;[m
[31m-[m
[31m-        for (i = 0; i < cf->ancient_browsers->nelts; i++) {[m
[31m-            if (len >= ancient[i].len[m
[31m-                && ngx_strstr(ua, ancient[i].data) != NULL)[m
[31m-            {[m
[31m-                return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->modern_unlisted_browsers) {[m
[31m-        return NGX_HTTP_MODERN_BROWSER;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_ANCIENT_BROWSER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_msie_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    if (r->headers_in.msie) {[m
[31m-        *v = ngx_http_variable_true_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_browser_add_variable(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_browser_variable_t   *var;[m
[31m-    ngx_http_variable_t           *v;[m
[31m-[m
[31m-    for (var = ngx_http_browsers; var->name.len; var++) {[m
[31m-[m
[31m-        v = ngx_http_add_variable(cf, &var->name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-        if (v == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->get_handler = var->handler;[m
[31m-        v->data = var->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_browser_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_browser_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->modern_browsers = NULL;[m
[31m-     *     conf->ancient_browsers = NULL;[m
[31m-     *     conf->modern_browser_value = NULL;[m
[31m-     *     conf->ancient_browser_value = NULL;[m
[31m-     *[m
[31m-     *     conf->modern_unlisted_browsers = 0;[m
[31m-     *     conf->netscape4 = 0;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_browser_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *prev = parent;[m
[31m-    ngx_http_browser_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_modern_browser_t  *browsers, *opera;[m
[31m-[m
[31m-    /*[m
[31m-     * At the merge the skip field is used to store the browser slot,[m
[31m-     * it will be used in sorting and then will overwritten[m
[31m-     * with a real skip value.  The zero value means Opera.[m
[31m-     */[m
[31m-[m
[31m-    if (conf->modern_browsers == NULL && conf->modern_unlisted_browsers == 0) {[m
[31m-        conf->modern_browsers = prev->modern_browsers;[m
[31m-        conf->modern_unlisted_browsers = prev->modern_unlisted_browsers;[m
[31m-[m
[31m-    } else if (conf->modern_browsers != NULL) {[m
[31m-        browsers = conf->modern_browsers->elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->modern_browsers->nelts; i++) {[m
[31m-            if (browsers[i].skip == 0) {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * Opera may contain MSIE string, so if Opera was not enumerated[m
[31m-         * as modern browsers, then add it and set a unreachable version[m
[31m-         */[m
[31m-[m
[31m-        opera = ngx_array_push(conf->modern_browsers);[m
[31m-        if (opera == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        opera->skip = 0;[m
[31m-        opera->version = 4001000000U;[m
[31m-[m
[31m-        browsers = conf->modern_browsers->elts;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-        ngx_qsort(browsers, (size_t) conf->modern_browsers->nelts,[m
[31m-                  sizeof(ngx_http_modern_browser_t),[m
[31m-                  ngx_http_modern_browser_sort);[m
[31m-[m
[31m-        for (i = 0; i < conf->modern_browsers->nelts; i++) {[m
[31m-             n = browsers[i].skip;[m
[31m-[m
[31m-             browsers[i].skip = ngx_http_modern_browser_masks[n].skip;[m
[31m-             browsers[i].add = ngx_http_modern_browser_masks[n].add;[m
[31m-             (void) ngx_cpystrn(browsers[i].name,[m
[31m-                                ngx_http_modern_browser_masks[n].name, 12);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->ancient_browsers == NULL && conf->netscape4 == 0) {[m
[31m-        conf->ancient_browsers = prev->ancient_browsers;[m
[31m-        conf->netscape4 = prev->netscape4;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->modern_browser_value == NULL) {[m
[31m-        conf->modern_browser_value = prev->modern_browser_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->modern_browser_value == NULL) {[m
[31m-        conf->modern_browser_value = &ngx_http_variable_true_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->ancient_browser_value == NULL) {[m
[31m-        conf->ancient_browser_value = prev->ancient_browser_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->ancient_browser_value == NULL) {[m
[31m-        conf->ancient_browser_value = &ngx_http_variable_true_value;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_modern_browser_sort(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_http_modern_browser_t *first = (ngx_http_modern_browser_t *) one;[m
[31m-    ngx_http_modern_browser_t *second = (ngx_http_modern_browser_t *) two;[m
[31m-[m
[31m-    return (first->skip - second->skip);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_modern_browser(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *bcf = conf;[m
[31m-[m
[31m-    u_char                           c;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_uint_t                       i, n, version, ver, scale;[m
[31m-    ngx_http_modern_browser_t       *browser;[m
[31m-    ngx_http_modern_browser_mask_t  *mask;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        if (ngx_strcmp(value[1].data, "unlisted") == 0) {[m
[31m-            bcf->modern_unlisted_browsers = 1;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (bcf->modern_browsers == NULL) {[m
[31m-        bcf->modern_browsers = ngx_array_create(cf->pool, 5,[m
[31m-                                            sizeof(ngx_http_modern_browser_t));[m
[31m-        if (bcf->modern_browsers == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    browser = ngx_array_push(bcf->modern_browsers);[m
[31m-    if (browser == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mask = ngx_http_modern_browser_masks;[m
[31m-[m
[31m-    for (n = 0; mask[n].browser[0] != '\0'; n++) {[m
[31m-        if (ngx_strcasecmp(mask[n].browser, value[1].data) == 0) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "unknown browser name \"%V\"", &value[1]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    /*[m
[31m-     * at this stage the skip field is used to store the browser slot,[m
[31m-     * it will be used in sorting in merge stage and then will overwritten[m
[31m-     * with a real value[m
[31m-     */[m
[31m-[m
[31m-    browser->skip = n;[m
[31m-[m
[31m-    version = 0;[m
[31m-    ver = 0;[m
[31m-    scale = 1000000;[m
[31m-[m
[31m-    for (i = 0; i < value[2].len; i++) {[m
[31m-[m
[31m-        c = value[2].data[i];[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            ver = ver * 10 + (c - '0');[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (c == '.') {[m
[31m-            version += ver * scale;[m
[31m-            ver = 0;[m
[31m-            scale /= 100;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid browser version \"%V\"", &value[2]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    version += ver * scale;[m
[31m-[m
[31m-    browser->version = version;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ancient_browser(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *bcf = conf;[m
[31m-[m
[31m-    ngx_str_t   *value, *browser;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (ngx_strcmp(value[i].data, "netscape4") == 0) {[m
[31m-            bcf->netscape4 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (bcf->ancient_browsers == NULL) {[m
[31m-            bcf->ancient_browsers = ngx_array_create(cf->pool, 4,[m
[31m-                                                     sizeof(ngx_str_t));[m
[31m-            if (bcf->ancient_browsers == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        browser = ngx_array_push(bcf->ancient_browsers);[m
[31m-        if (browser == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *browser = value[i];[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_modern_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *bcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    bcf->modern_browser_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_variable_value_t));[m
[31m-    if (bcf->modern_browser_value == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    bcf->modern_browser_value->len = value[1].len;[m
[31m-    bcf->modern_browser_value->valid = 1;[m
[31m-    bcf->modern_browser_value->no_cacheable = 0;[m
[31m-    bcf->modern_browser_value->not_found = 0;[m
[31m-    bcf->modern_browser_value->data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ancient_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_browser_conf_t *bcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    bcf->ancient_browser_value = ngx_palloc(cf->pool,[m
[31m-                                            sizeof(ngx_http_variable_value_t));[m
[31m-    if (bcf->ancient_browser_value == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    bcf->ancient_browser_value->len = value[1].len;[m
[31m-    bcf->ancient_browser_value->valid = 1;[m
[31m-    bcf->ancient_browser_value->no_cacheable = 0;[m
[31m-    bcf->ancient_browser_value->not_found = 0;[m
[31m-    bcf->ancient_browser_value->data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_charset_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_charset_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 4ea9818..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_charset_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1685 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_CHARSET_OFF    -2[m
[31m-#define NGX_HTTP_NO_CHARSET     -3[m
[31m-#define NGX_HTTP_CHARSET_VAR    0x10000[m
[31m-[m
[31m-/* 1 byte length and up to 3 bytes for the UTF-8 encoding of the UCS-2 */[m
[31m-#define NGX_UTF_LEN             4[m
[31m-[m
[31m-#define NGX_HTML_ENTITY_LEN     (sizeof("&#1114111;") - 1)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                    **tables;[m
[31m-    ngx_str_t                   name;[m
[31m-[m
[31m-    unsigned                    length:16;[m
[31m-    unsigned                    utf8:1;[m
[31m-} ngx_http_charset_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                   src;[m
[31m-    ngx_int_t                   dst;[m
[31m-} ngx_http_charset_recode_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                   src;[m
[31m-    ngx_int_t                   dst;[m
[31m-    u_char                     *src2dst;[m
[31m-    u_char                     *dst2src;[m
[31m-} ngx_http_charset_tables_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                 charsets;       /* ngx_http_charset_t */[m
[31m-    ngx_array_t                 tables;         /* ngx_http_charset_tables_t */[m
[31m-    ngx_array_t                 recodes;        /* ngx_http_charset_recode_t */[m
[31m-} ngx_http_charset_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                   charset;[m
[31m-    ngx_int_t                   source_charset;[m
[31m-    ngx_flag_t                  override_charset;[m
[31m-[m
[31m-    ngx_hash_t                  types;[m
[31m-    ngx_array_t                *types_keys;[m
[31m-} ngx_http_charset_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *table;[m
[31m-    ngx_int_t                   charset;[m
[31m-    ngx_str_t                   charset_name;[m
[31m-[m
[31m-    ngx_chain_t                *busy;[m
[31m-    ngx_chain_t                *free_bufs;[m
[31m-    ngx_chain_t                *free_buffers;[m
[31m-[m
[31m-    size_t                      saved_len;[m
[31m-    u_char                      saved[NGX_UTF_LEN];[m
[31m-[m
[31m-    unsigned                    length:16;[m
[31m-    unsigned                    from_utf8:1;[m
[31m-    unsigned                    to_utf8:1;[m
[31m-} ngx_http_charset_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_charset_tables_t  *table;[m
[31m-    ngx_http_charset_t         *charset;[m
[31m-    ngx_uint_t                  characters;[m
[31m-} ngx_http_charset_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_destination_charset(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_main_request_charset(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_source_charset(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_get_charset(ngx_http_request_t *r, ngx_str_t *name);[m
[31m-static ngx_inline void ngx_http_set_charset(ngx_http_request_t *r,[m
[31m-    ngx_str_t *charset);[m
[31m-static ngx_int_t ngx_http_charset_ctx(ngx_http_request_t *r,[m
[31m-    ngx_http_charset_t *charsets, ngx_int_t charset, ngx_int_t source_charset);[m
[31m-static ngx_uint_t ngx_http_charset_recode(ngx_buf_t *b, u_char *table);[m
[31m-static ngx_chain_t *ngx_http_charset_recode_from_utf8(ngx_pool_t *pool,[m
[31m-    ngx_buf_t *buf, ngx_http_charset_ctx_t *ctx);[m
[31m-static ngx_chain_t *ngx_http_charset_recode_to_utf8(ngx_pool_t *pool,[m
[31m-    ngx_buf_t *buf, ngx_http_charset_ctx_t *ctx);[m
[31m-[m
[31m-static ngx_chain_t *ngx_http_charset_get_buf(ngx_pool_t *pool,[m
[31m-    ngx_http_charset_ctx_t *ctx);[m
[31m-static ngx_chain_t *ngx_http_charset_get_buffer(ngx_pool_t *pool,[m
[31m-    ngx_http_charset_ctx_t *ctx, size_t size);[m
[31m-[m
[31m-static char *ngx_http_charset_map_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_charset_map(ngx_conf_t *cf, ngx_command_t *dummy,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_set_charset_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_add_charset(ngx_array_t *charsets, ngx_str_t *name);[m
[31m-[m
[31m-static void *ngx_http_charset_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_charset_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_charset_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_charset_postconfiguration(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_charset_default_types[] = {[m
[31m-    ngx_string("text/html"),[m
[31m-    ngx_string("text/xml"),[m
[31m-    ngx_string("text/plain"),[m
[31m-    ngx_string("text/vnd.wap.wml"),[m
[31m-    ngx_string("application/javascript"),[m
[31m-    ngx_string("application/rss+xml"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_charset_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("charset"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_charset_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_charset_loc_conf_t, charset),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("source_charset"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_charset_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_charset_loc_conf_t, source_charset),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("override_charset"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_charset_loc_conf_t, override_charset),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("charset_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_charset_loc_conf_t, types_keys),[m
[31m-      &ngx_http_charset_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("charset_map"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,[m
[31m-      ngx_http_charset_map_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_charset_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_charset_postconfiguration,    /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_charset_create_main_conf,     /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_charset_create_loc_conf,      /* create location configuration */[m
[31m-    ngx_http_charset_merge_loc_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_charset_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_charset_filter_module_ctx,   /* module context */[m
[31m-    ngx_http_charset_filter_commands,      /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_charset_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                      charset, source_charset;[m
[31m-    ngx_str_t                      dst, src;[m
[31m-    ngx_http_charset_t            *charsets;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        charset = ngx_http_destination_charset(r, &dst);[m
[31m-[m
[31m-    } else {[m
[31m-        charset = ngx_http_main_request_charset(r, &dst);[m
[31m-    }[m
[31m-[m
[31m-    if (charset == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (charset == NGX_DECLINED) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    /* charset: charset index or NGX_HTTP_NO_CHARSET */[m
[31m-[m
[31m-    source_charset = ngx_http_source_charset(r, &src);[m
[31m-[m
[31m-    if (source_charset == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * source_charset: charset index, NGX_HTTP_NO_CHARSET,[m
[31m-     *                 or NGX_HTTP_CHARSET_OFF[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "charset: \"%V\" > \"%V\"", &src, &dst);[m
[31m-[m
[31m-    if (source_charset == NGX_HTTP_CHARSET_OFF) {[m
[31m-        ngx_http_set_charset(r, &dst);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (charset == NGX_HTTP_NO_CHARSET[m
[31m-        || source_charset == NGX_HTTP_NO_CHARSET)[m
[31m-    {[m
[31m-        if (source_charset != charset[m
[31m-            || ngx_strncasecmp(dst.data, src.data, dst.len) != 0)[m
[31m-        {[m
[31m-            goto no_charset_map;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_charset(r, &dst);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (source_charset == charset) {[m
[31m-        r->headers_out.content_type.len = r->headers_out.content_type_len;[m
[31m-[m
[31m-        ngx_http_set_charset(r, &dst);[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    /* source_charset != charset */[m
[31m-[m
[31m-    if (r->headers_out.content_encoding[m
[31m-        && r->headers_out.content_encoding->value.len)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);[m
[31m-    charsets = mcf->charsets.elts;[m
[31m-[m
[31m-    if (charsets[source_charset].tables == NULL[m
[31m-        || charsets[source_charset].tables[charset] == NULL)[m
[31m-    {[m
[31m-        goto no_charset_map;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type.len = r->headers_out.content_type_len;[m
[31m-[m
[31m-    ngx_http_set_charset(r, &dst);[m
[31m-[m
[31m-    return ngx_http_charset_ctx(r, charsets, charset, source_charset);[m
[31m-[m
[31m-no_charset_map:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "no \"charset_map\" between the charsets \"%V\" and \"%V\"",[m
[31m-                  &src, &dst);[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_destination_charset(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_int_t                      charset;[m
[31m-    ngx_http_charset_t            *charsets;[m
[31m-    ngx_http_variable_value_t     *vv;[m
[31m-    ngx_http_charset_loc_conf_t   *mlcf;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    if (r->headers_out.content_type.len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.override_charset[m
[31m-        && r->headers_out.override_charset->len)[m
[31m-    {[m
[31m-        *name = *r->headers_out.override_charset;[m
[31m-[m
[31m-        charset = ngx_http_get_charset(r, name);[m
[31m-[m
[31m-        if (charset != NGX_HTTP_NO_CHARSET) {[m
[31m-            return charset;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unknown charset \"%V\" to override", name);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_charset_filter_module);[m
[31m-    charset = mlcf->charset;[m
[31m-[m
[31m-    if (charset == NGX_HTTP_CHARSET_OFF) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.charset.len) {[m
[31m-        if (mlcf->override_charset == 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_test_content_type(r, &mlcf->types) == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (charset < NGX_HTTP_CHARSET_VAR) {[m
[31m-        mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);[m
[31m-        charsets = mcf->charsets.elts;[m
[31m-        *name = charsets[charset].name;[m
[31m-        return charset;[m
[31m-    }[m
[31m-[m
[31m-    vv = ngx_http_get_indexed_variable(r, charset - NGX_HTTP_CHARSET_VAR);[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->len = vv->len;[m
[31m-    name->data = vv->data;[m
[31m-[m
[31m-    return ngx_http_get_charset(r, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_main_request_charset(ngx_http_request_t *r, ngx_str_t *src)[m
[31m-{[m
[31m-    ngx_int_t                charset;[m
[31m-    ngx_str_t               *main_charset;[m
[31m-    ngx_http_charset_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r->main, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        *src = ctx->charset_name;[m
[31m-        return ctx->charset;[m
[31m-    }[m
[31m-[m
[31m-    main_charset = &r->main->headers_out.charset;[m
[31m-[m
[31m-    if (main_charset->len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_charset_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r->main, ctx, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    charset = ngx_http_get_charset(r, main_charset);[m
[31m-[m
[31m-    ctx->charset = charset;[m
[31m-    ctx->charset_name = *main_charset;[m
[31m-    *src = *main_charset;[m
[31m-[m
[31m-    return charset;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_source_charset(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_int_t                      charset;[m
[31m-    ngx_http_charset_t            *charsets;[m
[31m-    ngx_http_variable_value_t     *vv;[m
[31m-    ngx_http_charset_loc_conf_t   *lcf;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    if (r->headers_out.charset.len) {[m
[31m-        *name = r->headers_out.charset;[m
[31m-        return ngx_http_get_charset(r, name);[m
[31m-    }[m
[31m-[m
[31m-    lcf = ngx_http_get_module_loc_conf(r, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    charset = lcf->source_charset;[m
[31m-[m
[31m-    if (charset == NGX_HTTP_CHARSET_OFF) {[m
[31m-        name->len = 0;[m
[31m-        return charset;[m
[31m-    }[m
[31m-[m
[31m-    if (charset < NGX_HTTP_CHARSET_VAR) {[m
[31m-        mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);[m
[31m-        charsets = mcf->charsets.elts;[m
[31m-        *name = charsets[charset].name;[m
[31m-        return charset;[m
[31m-    }[m
[31m-[m
[31m-    vv = ngx_http_get_indexed_variable(r, charset - NGX_HTTP_CHARSET_VAR);[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->len = vv->len;[m
[31m-    name->data = vv->data;[m
[31m-[m
[31m-    return ngx_http_get_charset(r, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_get_charset(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_uint_t                     i, n;[m
[31m-    ngx_http_charset_t            *charset;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    charset = mcf->charsets.elts;[m
[31m-    n = mcf->charsets.nelts;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        if (charset[i].name.len != name->len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(charset[i].name.data, name->data, name->len) == 0) {[m
[31m-            return i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_NO_CHARSET;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_set_charset(ngx_http_request_t *r, ngx_str_t *charset)[m
[31m-{[m
[31m-    if (r != r->main) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_MOVED_PERMANENTLY[m
[31m-        || r->headers_out.status == NGX_HTTP_MOVED_TEMPORARILY)[m
[31m-    {[m
[31m-        /*[m
[31m-         * do not set charset for the redirect because NN 4.x[m
[31m-         * use this charset instead of the next page charset[m
[31m-         */[m
[31m-[m
[31m-        r->headers_out.charset.len = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.charset = *charset;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_charset_ctx(ngx_http_request_t *r, ngx_http_charset_t *charsets,[m
[31m-    ngx_int_t charset, ngx_int_t source_charset)[m
[31m-{[m
[31m-    ngx_http_charset_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_charset_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    ctx->table = charsets[source_charset].tables[charset];[m
[31m-    ctx->charset = charset;[m
[31m-    ctx->charset_name = charsets[charset].name;[m
[31m-    ctx->length = charsets[charset].length;[m
[31m-    ctx->from_utf8 = charsets[source_charset].utf8;[m
[31m-    ctx->to_utf8 = charsets[charset].utf8;[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    if ((ctx->to_utf8 || ctx->from_utf8) && r == r->main) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-[m
[31m-    } else {[m
[31m-        r->filter_need_temporary = 1;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_charset_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_buf_t               *b;[m
[31m-    ngx_chain_t             *cl, *out, **ll;[m
[31m-    ngx_http_charset_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_charset_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->table == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->to_utf8 || ctx->from_utf8) || ctx->busy) {[m
[31m-[m
[31m-        out = NULL;[m
[31m-        ll = &out;[m
[31m-[m
[31m-        for (cl = in; cl; cl = cl->next) {[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (ngx_buf_size(b) == 0) {[m
[31m-[m
[31m-                *ll = ngx_alloc_chain_link(r->pool);[m
[31m-                if (*ll == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                (*ll)->buf = b;[m
[31m-                (*ll)->next = NULL;[m
[31m-[m
[31m-                ll = &(*ll)->next;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->to_utf8) {[m
[31m-                *ll = ngx_http_charset_recode_to_utf8(r->pool, b, ctx);[m
[31m-[m
[31m-            } else {[m
[31m-                *ll = ngx_http_charset_recode_from_utf8(r->pool, b, ctx);[m
[31m-            }[m
[31m-[m
[31m-            if (*ll == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            while (*ll) {[m
[31m-                ll = &(*ll)->next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_next_body_filter(r, out);[m
[31m-[m
[31m-        if (out) {[m
[31m-            if (ctx->busy == NULL) {[m
[31m-                ctx->busy = out;[m
[31m-[m
[31m-            } else {[m
[31m-                for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }[m
[31m-                cl->next = out;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        while (ctx->busy) {[m
[31m-[m
[31m-            cl = ctx->busy;[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (ngx_buf_size(b) != 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ctx->busy = cl->next;[m
[31m-[m
[31m-            if (b->tag != (ngx_buf_tag_t) &ngx_http_charset_filter_module) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (b->shadow) {[m
[31m-                b->shadow->pos = b->shadow->last;[m
[31m-            }[m
[31m-[m
[31m-            if (b->pos) {[m
[31m-                cl->next = ctx->free_buffers;[m
[31m-                ctx->free_buffers = cl;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            cl->next = ctx->free_bufs;[m
[31m-            ctx->free_bufs = cl;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        (void) ngx_http_charset_recode(cl->buf, ctx->table);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_charset_recode(ngx_buf_t *b, u_char *table)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    last = b->last;[m
[31m-[m
[31m-    for (p = b->pos; p < last; p++) {[m
[31m-[m
[31m-        if (*p != table[*p]) {[m
[31m-            goto recode;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-recode:[m
[31m-[m
[31m-    do {[m
[31m-        if (*p != table[*p]) {[m
[31m-            *p = table[*p];[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-[m
[31m-    } while (p < last);[m
[31m-[m
[31m-    b->in_file = 0;[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_charset_recode_from_utf8(ngx_pool_t *pool, ngx_buf_t *buf,[m
[31m-    ngx_http_charset_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t        len, size;[m
[31m-    u_char        c, *p, *src, *dst, *saved, **table;[m
[31m-    uint32_t      n;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_chain_t  *out, *cl, **ll;[m
[31m-[m
[31m-    src = buf->pos;[m
[31m-[m
[31m-    if (ctx->saved_len == 0) {[m
[31m-[m
[31m-        for ( /* void */ ; src < buf->last; src++) {[m
[31m-[m
[31m-            if (*src < 0x80) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len = src - buf->pos;[m
[31m-[m
[31m-            if (len > 512) {[m
[31m-                out = ngx_http_charset_get_buf(pool, ctx);[m
[31m-                if (out == NULL) {[m
[31m-                    return NULL;[m
[31m-                }[m
[31m-[m
[31m-                b = out->buf;[m
[31m-[m
[31m-                b->temporary = buf->temporary;[m
[31m-                b->memory = buf->memory;[m
[31m-                b->mmap = buf->mmap;[m
[31m-                b->flush = buf->flush;[m
[31m-[m
[31m-                b->pos = buf->pos;[m
[31m-                b->last = src;[m
[31m-[m
[31m-                out->buf = b;[m
[31m-                out->next = NULL;[m
[31m-[m
[31m-                size = buf->last - src;[m
[31m-[m
[31m-                saved = src;[m
[31m-                n = ngx_utf8_decode(&saved, size);[m
[31m-[m
[31m-                if (n == 0xfffffffe) {[m
[31m-                    /* incomplete UTF-8 symbol */[m
[31m-[m
[31m-                    ngx_memcpy(ctx->saved, src, size);[m
[31m-                    ctx->saved_len = size;[m
[31m-[m
[31m-                    b->shadow = buf;[m
[31m-[m
[31m-                    return out;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                out = NULL;[m
[31m-                size = len + buf->last - src;[m
[31m-                src = buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            if (size < NGX_HTML_ENTITY_LEN) {[m
[31m-                size += NGX_HTML_ENTITY_LEN;[m
[31m-            }[m
[31m-[m
[31m-            cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-            if (cl == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (out) {[m
[31m-                out->next = cl;[m
[31m-[m
[31m-            } else {[m
[31m-                out = cl;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-            dst = b->pos;[m
[31m-[m
[31m-            goto recode;[m
[31m-        }[m
[31m-[m
[31m-        out = ngx_alloc_chain_link(pool);[m
[31m-        if (out == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        out->buf = buf;[m
[31m-        out->next = NULL;[m
[31m-[m
[31m-        return out;[m
[31m-    }[m
[31m-[m
[31m-    /* process incomplete UTF sequence from previous buffer */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                   "http charset utf saved: %z", ctx->saved_len);[m
[31m-[m
[31m-    p = src;[m
[31m-[m
[31m-    for (i = ctx->saved_len; i < NGX_UTF_LEN; i++) {[m
[31m-        ctx->saved[i] = *p++;[m
[31m-[m
[31m-        if (p == buf->last) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    saved = ctx->saved;[m
[31m-    n = ngx_utf8_decode(&saved, i);[m
[31m-[m
[31m-    c = '\0';[m
[31m-[m
[31m-    if (n < 0x10000) {[m
[31m-        table = (u_char **) ctx->table;[m
[31m-        p = table[n >> 8];[m
[31m-[m
[31m-        if (p) {[m
[31m-            c = p[n & 0xff];[m
[31m-        }[m
[31m-[m
[31m-    } else if (n == 0xfffffffe) {[m
[31m-[m
[31m-        /* incomplete UTF-8 symbol */[m
[31m-[m
[31m-        if (i < NGX_UTF_LEN) {[m
[31m-            out = ngx_http_charset_get_buf(pool, ctx);[m
[31m-            if (out == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            b = out->buf;[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->last = buf->last;[m
[31m-            b->sync = 1;[m
[31m-            b->shadow = buf;[m
[31m-[m
[31m-            ngx_memcpy(&ctx->saved[ctx->saved_len], src, i);[m
[31m-            ctx->saved_len += i;[m
[31m-[m
[31m-            return out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = buf->last - buf->pos;[m
[31m-[m
[31m-    if (size < NGX_HTML_ENTITY_LEN) {[m
[31m-        size += NGX_HTML_ENTITY_LEN;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    out = cl;[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-    dst = b->pos;[m
[31m-[m
[31m-    if (c) {[m
[31m-        *dst++ = c;[m
[31m-[m
[31m-    } else if (n == 0xfffffffe) {[m
[31m-        *dst++ = '?';[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                       "http charset invalid utf 0");[m
[31m-[m
[31m-        saved = &ctx->saved[NGX_UTF_LEN];[m
[31m-[m
[31m-    } else if (n > 0x10ffff) {[m
[31m-        *dst++ = '?';[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                       "http charset invalid utf 1");[m
[31m-[m
[31m-    } else {[m
[31m-        dst = ngx_sprintf(dst, "&#%uD;", n);[m
[31m-    }[m
[31m-[m
[31m-    src += (saved - ctx->saved) - ctx->saved_len;[m
[31m-    ctx->saved_len = 0;[m
[31m-[m
[31m-recode:[m
[31m-[m
[31m-    ll = &cl->next;[m
[31m-[m
[31m-    table = (u_char **) ctx->table;[m
[31m-[m
[31m-    while (src < buf->last) {[m
[31m-[m
[31m-        if ((size_t) (b->end - dst) < NGX_HTML_ENTITY_LEN) {[m
[31m-            b->last = dst;[m
[31m-[m
[31m-            size = buf->last - src + NGX_HTML_ENTITY_LEN;[m
[31m-[m
[31m-            cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-            if (cl == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-            dst = b->pos;[m
[31m-        }[m
[31m-[m
[31m-        if (*src < 0x80) {[m
[31m-            *dst++ = *src++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len = buf->last - src;[m
[31m-[m
[31m-        n = ngx_utf8_decode(&src, len);[m
[31m-[m
[31m-        if (n < 0x10000) {[m
[31m-[m
[31m-            p = table[n >> 8];[m
[31m-[m
[31m-            if (p) {[m
[31m-                c = p[n & 0xff];[m
[31m-[m
[31m-                if (c) {[m
[31m-                    *dst++ = c;[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            dst = ngx_sprintf(dst, "&#%uD;", n);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0xfffffffe) {[m
[31m-            /* incomplete UTF-8 symbol */[m
[31m-[m
[31m-            ngx_memcpy(ctx->saved, src, len);[m
[31m-            ctx->saved_len = len;[m
[31m-[m
[31m-            if (b->pos == dst) {[m
[31m-                b->sync = 1;[m
[31m-                b->temporary = 0;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0x10ffff) {[m
[31m-            *dst++ = '?';[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                           "http charset invalid utf 2");[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* n > 0xffff */[m
[31m-[m
[31m-        dst = ngx_sprintf(dst, "&#%uD;", n);[m
[31m-    }[m
[31m-[m
[31m-    b->last = dst;[m
[31m-[m
[31m-    b->last_buf = buf->last_buf;[m
[31m-    b->last_in_chain = buf->last_in_chain;[m
[31m-    b->flush = buf->flush;[m
[31m-[m
[31m-    b->shadow = buf;[m
[31m-[m
[31m-    return out;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_charset_recode_to_utf8(ngx_pool_t *pool, ngx_buf_t *buf,[m
[31m-    ngx_http_charset_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t        len, size;[m
[31m-    u_char       *p, *src, *dst, *table;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *out, *cl, **ll;[m
[31m-[m
[31m-    table = ctx->table;[m
[31m-[m
[31m-    for (src = buf->pos; src < buf->last; src++) {[m
[31m-        if (table[*src * NGX_UTF_LEN] == '\1') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto recode;[m
[31m-    }[m
[31m-[m
[31m-    out = ngx_alloc_chain_link(pool);[m
[31m-    if (out == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    out->buf = buf;[m
[31m-    out->next = NULL;[m
[31m-[m
[31m-    return out;[m
[31m-[m
[31m-recode:[m
[31m-[m
[31m-    /*[m
[31m-     * we assume that there are about half of characters to be recoded,[m
[31m-     * so we preallocate "size / 2 + size / 2 * ctx->length"[m
[31m-     */[m
[31m-[m
[31m-    len = src - buf->pos;[m
[31m-[m
[31m-    if (len > 512) {[m
[31m-        out = ngx_http_charset_get_buf(pool, ctx);[m
[31m-        if (out == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        b = out->buf;[m
[31m-[m
[31m-        b->temporary = buf->temporary;[m
[31m-        b->memory = buf->memory;[m
[31m-        b->mmap = buf->mmap;[m
[31m-        b->flush = buf->flush;[m
[31m-[m
[31m-        b->pos = buf->pos;[m
[31m-        b->last = src;[m
[31m-[m
[31m-        out->buf = b;[m
[31m-        out->next = NULL;[m
[31m-[m
[31m-        size = buf->last - src;[m
[31m-        size = size / 2 + size / 2 * ctx->length;[m
[31m-[m
[31m-    } else {[m
[31m-        out = NULL;[m
[31m-[m
[31m-        size = buf->last - src;[m
[31m-        size = len + size / 2 + size / 2 * ctx->length;[m
[31m-[m
[31m-        src = buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (out) {[m
[31m-        out->next = cl;[m
[31m-[m
[31m-    } else {[m
[31m-        out = cl;[m
[31m-    }[m
[31m-[m
[31m-    ll = &cl->next;[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-    dst = b->pos;[m
[31m-[m
[31m-    while (src < buf->last) {[m
[31m-[m
[31m-        p = &table[*src++ * NGX_UTF_LEN];[m
[31m-        len = *p++;[m
[31m-[m
[31m-        if ((size_t) (b->end - dst) < len) {[m
[31m-            b->last = dst;[m
[31m-[m
[31m-            size = buf->last - src;[m
[31m-            size = len + size / 2 + size / 2 * ctx->length;[m
[31m-[m
[31m-            cl = ngx_http_charset_get_buffer(pool, ctx, size);[m
[31m-            if (cl == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-            dst = b->pos;[m
[31m-        }[m
[31m-[m
[31m-        while (len) {[m
[31m-            *dst++ = *p++;[m
[31m-            len--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->last = dst;[m
[31m-[m
[31m-    b->last_buf = buf->last_buf;[m
[31m-    b->last_in_chain = buf->last_in_chain;[m
[31m-    b->flush = buf->flush;[m
[31m-[m
[31m-    b->shadow = buf;[m
[31m-[m
[31m-    return out;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_charset_get_buf(ngx_pool_t *pool, ngx_http_charset_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = ctx->free_bufs;[m
[31m-[m
[31m-    if (cl) {[m
[31m-        ctx->free_bufs = cl->next;[m
[31m-[m
[31m-        cl->buf->shadow = NULL;[m
[31m-        cl->next = NULL;[m
[31m-[m
[31m-        return cl;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ngx_calloc_buf(pool);[m
[31m-    if (cl->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    cl->buf->tag = (ngx_buf_tag_t) &ngx_http_charset_filter_module;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_charset_get_buffer(ngx_pool_t *pool, ngx_http_charset_ctx_t *ctx,[m
[31m-    size_t size)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl, **ll;[m
[31m-[m
[31m-    for (ll = &ctx->free_buffers, cl = ctx->free_buffers;[m
[31m-         cl;[m
[31m-         ll = &cl->next, cl = cl->next)[m
[31m-    {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if ((size_t) (b->end - b->start) >= size) {[m
[31m-            *ll = cl->next;[m
[31m-            cl->next = NULL;[m
[31m-[m
[31m-            b->pos = b->start;[m
[31m-            b->temporary = 1;[m
[31m-            b->shadow = NULL;[m
[31m-[m
[31m-            return cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ngx_create_temp_buf(pool, size);[m
[31m-    if (cl->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    cl->buf->temporary = 1;[m
[31m-    cl->buf->tag = (ngx_buf_tag_t) &ngx_http_charset_filter_module;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_charset_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_charset_main_conf_t  *mcf = conf;[m
[31m-[m
[31m-    char                         *rv;[m
[31m-    u_char                       *p, *dst2src, **pp;[m
[31m-    ngx_int_t                     src, dst;[m
[31m-    ngx_uint_t                    i, n;[m
[31m-    ngx_str_t                    *value;[m
[31m-    ngx_conf_t                    pvcf;[m
[31m-    ngx_http_charset_t           *charset;[m
[31m-    ngx_http_charset_tables_t    *table;[m
[31m-    ngx_http_charset_conf_ctx_t   ctx;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    src = ngx_http_add_charset(&mcf->charsets, &value[1]);[m
[31m-    if (src == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dst = ngx_http_add_charset(&mcf->charsets, &value[2]);[m
[31m-    if (dst == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (src == dst) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"charset_map\" between the same charsets "[m
[31m-                           "\"%V\" and \"%V\"", &value[1], &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    table = mcf->tables.elts;[m
[31m-    for (i = 0; i < mcf->tables.nelts; i++) {[m
[31m-        if ((src == table->src && dst == table->dst)[m
[31m-             || (src == table->dst && dst == table->src))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate \"charset_map\" between "[m
[31m-                               "\"%V\" and \"%V\"", &value[1], &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    table = ngx_array_push(&mcf->tables);[m
[31m-    if (table == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    table->src = src;[m
[31m-    table->dst = dst;[m
[31m-[m
[31m-    if (ngx_strcasecmp(value[2].data, (u_char *) "utf-8") == 0) {[m
[31m-        table->src2dst = ngx_pcalloc(cf->pool, 256 * NGX_UTF_LEN);[m
[31m-        if (table->src2dst == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        table->dst2src = ngx_pcalloc(cf->pool, 256 * sizeof(void *));[m
[31m-        if (table->dst2src == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dst2src = ngx_pcalloc(cf->pool, 256);[m
[31m-        if (dst2src == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pp = (u_char **) &table->dst2src[0];[m
[31m-        pp[0] = dst2src;[m
[31m-[m
[31m-        for (i = 0; i < 128; i++) {[m
[31m-            p = &table->src2dst[i * NGX_UTF_LEN];[m
[31m-            p[0] = '\1';[m
[31m-            p[1] = (u_char) i;[m
[31m-            dst2src[i] = (u_char) i;[m
[31m-        }[m
[31m-[m
[31m-        for (/* void */; i < 256; i++) {[m
[31m-            p = &table->src2dst[i * NGX_UTF_LEN];[m
[31m-            p[0] = '\1';[m
[31m-            p[1] = '?';[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        table->src2dst = ngx_palloc(cf->pool, 256);[m
[31m-        if (table->src2dst == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        table->dst2src = ngx_palloc(cf->pool, 256);[m
[31m-        if (table->dst2src == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < 128; i++) {[m
[31m-            table->src2dst[i] = (u_char) i;[m
[31m-            table->dst2src[i] = (u_char) i;[m
[31m-        }[m
[31m-[m
[31m-        for (/* void */; i < 256; i++) {[m
[31m-            table->src2dst[i] = '?';[m
[31m-            table->dst2src[i] = '?';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    charset = mcf->charsets.elts;[m
[31m-[m
[31m-    ctx.table = table;[m
[31m-    ctx.charset = &charset[dst];[m
[31m-    ctx.characters = 0;[m
[31m-[m
[31m-    pvcf = *cf;[m
[31m-    cf->ctx = &ctx;[m
[31m-    cf->handler = ngx_http_charset_map;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pvcf;[m
[31m-[m
[31m-    if (ctx.characters) {[m
[31m-        n = ctx.charset->length;[m
[31m-        ctx.charset->length /= ctx.characters;[m
[31m-[m
[31m-        if (((n * 10) / ctx.characters) % 10 > 4) {[m
[31m-            ctx.charset->length++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_charset_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    u_char                       *p, *dst2src, **pp;[m
[31m-    uint32_t                      n;[m
[31m-    ngx_int_t                     src, dst;[m
[31m-    ngx_str_t                    *value;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_http_charset_tables_t    *table;[m
[31m-    ngx_http_charset_conf_ctx_t  *ctx;[m
[31m-[m
[31m-    if (cf->args->nelts != 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameters number");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    src = ngx_hextoi(value[0].data, value[0].len);[m
[31m-    if (src == NGX_ERROR || src > 255) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid value \"%V\"", &value[0]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = cf->ctx;[m
[31m-    table = ctx->table;[m
[31m-[m
[31m-    if (ctx->charset->utf8) {[m
[31m-        p = &table->src2dst[src * NGX_UTF_LEN];[m
[31m-[m
[31m-        *p++ = (u_char) (value[1].len / 2);[m
[31m-[m
[31m-        for (i = 0; i < value[1].len; i += 2) {[m
[31m-            dst = ngx_hextoi(&value[1].data[i], 2);[m
[31m-            if (dst == NGX_ERROR || dst > 255) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid value \"%V\"", &value[1]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *p++ = (u_char) dst;[m
[31m-        }[m
[31m-[m
[31m-        i /= 2;[m
[31m-[m
[31m-        ctx->charset->length += i;[m
[31m-        ctx->characters++;[m
[31m-[m
[31m-        p = &table->src2dst[src * NGX_UTF_LEN] + 1;[m
[31m-[m
[31m-        n = ngx_utf8_decode(&p, i);[m
[31m-[m
[31m-        if (n > 0xffff) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pp = (u_char **) &table->dst2src[0];[m
[31m-[m
[31m-        dst2src = pp[n >> 8];[m
[31m-[m
[31m-        if (dst2src == NULL) {[m
[31m-            dst2src = ngx_pcalloc(cf->pool, 256);[m
[31m-            if (dst2src == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pp[n >> 8] = dst2src;[m
[31m-        }[m
[31m-[m
[31m-        dst2src[n & 0xff] = (u_char) src;[m
[31m-[m
[31m-    } else {[m
[31m-        dst = ngx_hextoi(value[1].data, value[1].len);[m
[31m-        if (dst == NGX_ERROR || dst > 255) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        table->src2dst[src] = (u_char) dst;[m
[31m-        table->dst2src[dst] = (u_char) src;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_charset_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t                     *cp;[m
[31m-    ngx_str_t                     *value, var;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    cp = (ngx_int_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*cp != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cmd->offset == offsetof(ngx_http_charset_loc_conf_t, charset)[m
[31m-        && ngx_strcmp(value[1].data, "off") == 0)[m
[31m-    {[m
[31m-        *cp = NGX_HTTP_CHARSET_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (value[1].data[0] == '$') {[m
[31m-        var.len = value[1].len - 1;[m
[31m-        var.data = value[1].data + 1;[m
[31m-[m
[31m-        *cp = ngx_http_get_variable_index(cf, &var);[m
[31m-[m
[31m-        if (*cp == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *cp += NGX_HTTP_CHARSET_VAR;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    mcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                             ngx_http_charset_filter_module);[m
[31m-[m
[31m-    *cp = ngx_http_add_charset(&mcf->charsets, &value[1]);[m
[31m-    if (*cp == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_charset(ngx_array_t *charsets, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_http_charset_t  *c;[m
[31m-[m
[31m-    c = charsets->elts;[m
[31m-    for (i = 0; i < charsets->nelts; i++) {[m
[31m-        if (name->len != c[i].name.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcasecmp(name->data, c[i].name.data) == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (i < charsets->nelts) {[m
[31m-        return i;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_array_push(charsets);[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->tables = NULL;[m
[31m-    c->name = *name;[m
[31m-    c->length = 0;[m
[31m-[m
[31m-    if (ngx_strcasecmp(name->data, (u_char *) "utf-8") == 0) {[m
[31m-        c->utf8 = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        c->utf8 = 0;[m
[31m-    }[m
[31m-[m
[31m-    return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_charset_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_charset_main_conf_t));[m
[31m-    if (mcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&mcf->charsets, cf->pool, 2, sizeof(ngx_http_charset_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&mcf->tables, cf->pool, 1,[m
[31m-                       sizeof(ngx_http_charset_tables_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&mcf->recodes, cf->pool, 2,[m
[31m-                       sizeof(ngx_http_charset_recode_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return mcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_charset_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_charset_loc_conf_t  *lcf;[m
[31m-[m
[31m-    lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_charset_loc_conf_t));[m
[31m-    if (lcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     lcf->types = { NULL };[m
[31m-     *     lcf->types_keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-    lcf->charset = NGX_CONF_UNSET;[m
[31m-    lcf->source_charset = NGX_CONF_UNSET;[m
[31m-    lcf->override_charset = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return lcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_charset_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_charset_loc_conf_t *prev = parent;[m
[31m-    ngx_http_charset_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_http_charset_recode_t     *recode;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_charset_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->override_charset, prev->override_charset, 0);[m
[31m-    ngx_conf_merge_value(conf->charset, prev->charset, NGX_HTTP_CHARSET_OFF);[m
[31m-    ngx_conf_merge_value(conf->source_charset, prev->source_charset,[m
[31m-                         NGX_HTTP_CHARSET_OFF);[m
[31m-[m
[31m-    if (conf->charset == NGX_HTTP_CHARSET_OFF[m
[31m-        || conf->source_charset == NGX_HTTP_CHARSET_OFF[m
[31m-        || conf->charset == conf->source_charset)[m
[31m-    {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->source_charset >= NGX_HTTP_CHARSET_VAR[m
[31m-        || conf->charset >= NGX_HTTP_CHARSET_VAR)[m
[31m-    {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    mcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                             ngx_http_charset_filter_module);[m
[31m-    recode = mcf->recodes.elts;[m
[31m-    for (i = 0; i < mcf->recodes.nelts; i++) {[m
[31m-        if (conf->source_charset == recode[i].src[m
[31m-            && conf->charset == recode[i].dst)[m
[31m-        {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    recode = ngx_array_push(&mcf->recodes);[m
[31m-    if (recode == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    recode->src = conf->source_charset;[m
[31m-    recode->dst = conf->charset;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_charset_postconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    u_char                       **src, **dst;[m
[31m-    ngx_int_t                      c;[m
[31m-    ngx_uint_t                     i, t;[m
[31m-    ngx_http_charset_t            *charset;[m
[31m-    ngx_http_charset_recode_t     *recode;[m
[31m-    ngx_http_charset_tables_t     *tables;[m
[31m-    ngx_http_charset_main_conf_t  *mcf;[m
[31m-[m
[31m-    mcf = ngx_http_conf_get_module_main_conf(cf,[m
[31m-                                             ngx_http_charset_filter_module);[m
[31m-[m
[31m-    recode = mcf->recodes.elts;[m
[31m-    tables = mcf->tables.elts;[m
[31m-    charset = mcf->charsets.elts;[m
[31m-[m
[31m-    for (i = 0; i < mcf->recodes.nelts; i++) {[m
[31m-[m
[31m-        c = recode[i].src;[m
[31m-[m
[31m-        for (t = 0; t < mcf->tables.nelts; t++) {[m
[31m-[m
[31m-            if (c == tables[t].src && recode[i].dst == tables[t].dst) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (c == tables[t].dst && recode[i].dst == tables[t].src) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                   "no \"charset_map\" between the charsets \"%V\" and \"%V\"",[m
[31m-                   &charset[c].name, &charset[recode[i].dst].name);[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (t = 0; t < mcf->tables.nelts; t++) {[m
[31m-[m
[31m-        src = charset[tables[t].src].tables;[m
[31m-[m
[31m-        if (src == NULL) {[m
[31m-            src = ngx_pcalloc(cf->pool, sizeof(u_char *) * mcf->charsets.nelts);[m
[31m-            if (src == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            charset[tables[t].src].tables = src;[m
[31m-        }[m
[31m-[m
[31m-        dst = charset[tables[t].dst].tables;[m
[31m-[m
[31m-        if (dst == NULL) {[m
[31m-            dst = ngx_pcalloc(cf->pool, sizeof(u_char *) * mcf->charsets.nelts);[m
[31m-            if (dst == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            charset[tables[t].dst].tables = dst;[m
[31m-        }[m
[31m-[m
[31m-        src[tables[t].dst] = tables[t].src2dst;[m
[31m-        dst[tables[t].src] = tables[t].dst2src;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_charset_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_charset_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_chunked_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_chunked_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex ac2e3e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_chunked_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,243 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t         *free;[m
[31m-    ngx_chain_t         *busy;[m
[31m-} ngx_http_chunked_filter_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_chunked_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_chunked_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_chunked_filter_init,          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_chunked_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_chunked_filter_module_ctx,   /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_chunked_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_http_chunked_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED[m
[31m-        || r->headers_out.status == NGX_HTTP_NO_CONTENT[m
[31m-        || r->headers_out.status < NGX_HTTP_OK[m
[31m-        || r != r->main[m
[31m-        || r->method == NGX_HTTP_HEAD)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length_n == -1) {[m
[31m-        if (r->http_version < NGX_HTTP_VERSION_11) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            if (clcf->chunked_transfer_encoding) {[m
[31m-                r->chunked = 1;[m
[31m-[m
[31m-                ctx = ngx_pcalloc(r->pool,[m
[31m-                                  sizeof(ngx_http_chunked_filter_ctx_t));[m
[31m-                if (ctx == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_set_ctx(r, ctx, ngx_http_chunked_filter_module);[m
[31m-[m
[31m-            } else {[m
[31m-                r->keepalive = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_chunked_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    u_char                         *chunk;[m
[31m-    off_t                           size;[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *out, *cl, *tl, **ll;[m
[31m-    ngx_http_chunked_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    if (in == NULL || !r->chunked || r->header_only) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_chunked_filter_module);[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    size = 0;[m
[31m-    cl = in;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http chunk: %O", ngx_buf_size(cl->buf));[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush[m
[31m-            || cl->buf->sync[m
[31m-            || ngx_buf_in_memory(cl->buf)[m
[31m-            || cl->buf->in_file)[m
[31m-        {[m
[31m-            tl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            tl->buf = cl->buf;[m
[31m-            *ll = tl;[m
[31m-            ll = &tl->next;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-        chunk = b->start;[m
[31m-[m
[31m-        if (chunk == NULL) {[m
[31m-            /* the "0000000000000000" is 64-bit hexadecimal string */[m
[31m-[m
[31m-            chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1);[m
[31m-            if (chunk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = chunk;[m
[31m-            b->end = chunk + sizeof("0000000000000000" CRLF) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;[m
[31m-        b->memory = 0;[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = chunk;[m
[31m-        b->last = ngx_sprintf(chunk, "%xO" CRLF, size);[m
[31m-[m
[31m-        tl->next = out;[m
[31m-        out = tl;[m
[31m-    }[m
[31m-[m
[31m-    if (cl->buf->last_buf) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->last_buf = 1;[m
[31m-        b->pos = (u_char *) CRLF "0" CRLF CRLF;[m
[31m-        b->last = b->pos + 7;[m
[31m-[m
[31m-        cl->buf->last_buf = 0;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            b->pos += 2;[m
[31m-        }[m
[31m-[m
[31m-    } else if (size > 0) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->pos = (u_char *) CRLF;[m
[31m-        b->last = b->pos + 2;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-    } else {[m
[31m-        *ll = NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_chunked_filter_module);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_chunked_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_chunked_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_chunked_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_dav_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_dav_module.c[m
[1mdeleted file mode 100644[m
[1mindex 3600265..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_dav_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1156 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_DAV_OFF             2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_DAV_NO_DEPTH        -3[m
[31m-#define NGX_HTTP_DAV_INVALID_DEPTH   -2[m
[31m-#define NGX_HTTP_DAV_INFINITY_DEPTH  -1[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  methods;[m
[31m-    ngx_uint_t  access;[m
[31m-    ngx_uint_t  min_delete_depth;[m
[31m-    ngx_flag_t  create_full_put_path;[m
[31m-} ngx_http_dav_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t   path;[m
[31m-    size_t      len;[m
[31m-} ngx_http_dav_copy_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-static void ngx_http_dav_put_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_delete_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_dav_delete_path(ngx_http_request_t *r,[m
[31m-    ngx_str_t *path, ngx_uint_t dir);[m
[31m-static ngx_int_t ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_dav_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_dav_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path);[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_mkcol_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_dav_loc_conf_t *dlcf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_copy_move_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-[m
[31m-static ngx_int_t ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt);[m
[31m-static ngx_int_t ngx_http_dav_error(ngx_log_t *log, ngx_err_t err,[m
[31m-    ngx_int_t not_found, char *failed, u_char *path);[m
[31m-static ngx_int_t ngx_http_dav_location(ngx_http_request_t *r, u_char *path);[m
[31m-static void *ngx_http_dav_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_dav_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_dav_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_dav_methods_mask[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_DAV_OFF },[m
[31m-    { ngx_string("put"), NGX_HTTP_PUT },[m
[31m-    { ngx_string("delete"), NGX_HTTP_DELETE },[m
[31m-    { ngx_string("mkcol"), NGX_HTTP_MKCOL },[m
[31m-    { ngx_string("copy"), NGX_HTTP_COPY },[m
[31m-    { ngx_string("move"), NGX_HTTP_MOVE },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_dav_commands[] = {[m
[31m-[m
[31m-    { ngx_string("dav_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_dav_loc_conf_t, methods),[m
[31m-      &ngx_http_dav_methods_mask },[m
[31m-[m
[31m-    { ngx_string("create_full_put_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_dav_loc_conf_t, create_full_put_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("min_delete_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_dav_loc_conf_t, min_delete_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("dav_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_dav_loc_conf_t, access),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_dav_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_dav_init,                     /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_dav_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_dav_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_dav_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_dav_module_ctx,              /* module context */[m
[31m-    ngx_http_dav_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_http_dav_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-    if (!(r->method & dlcf->methods)) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    switch (r->method) {[m
[31m-[m
[31m-    case NGX_HTTP_PUT:[m
[31m-[m
[31m-        if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "cannot PUT to a collection");[m
[31m-            return NGX_HTTP_CONFLICT;[m
[31m-        }[m
[31m-[m
[31m-        r->request_body_in_file_only = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file = 1;[m
[31m-        r->request_body_file_group_access = 1;[m
[31m-        r->request_body_file_log_level = 0;[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r, ngx_http_dav_put_handler);[m
[31m-[m
[31m-        if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-[m
[31m-    case NGX_HTTP_DELETE:[m
[31m-[m
[31m-        return ngx_http_dav_delete_handler(r);[m
[31m-[m
[31m-    case NGX_HTTP_MKCOL:[m
[31m-[m
[31m-        return ngx_http_dav_mkcol_handler(r, dlcf);[m
[31m-[m
[31m-    case NGX_HTTP_COPY:[m
[31m-[m
[31m-        return ngx_http_dav_copy_move_handler(r);[m
[31m-[m
[31m-    case NGX_HTTP_MOVE:[m
[31m-[m
[31m-        return ngx_http_dav_copy_move_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_dav_put_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                    root;[m
[31m-    time_t                    date;[m
[31m-    ngx_str_t                *temp, path;[m
[31m-    ngx_uint_t                status;[m
[31m-    ngx_file_info_t           fi;[m
[31m-    ngx_ext_rename_file_t     ext;[m
[31m-    ngx_http_dav_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    if (r->request_body == NULL || r->request_body->temp_file == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    path.len--;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http put filename: \"%s\"", path.data);[m
[31m-[m
[31m-    temp = &r->request_body->temp_file->file.name;[m
[31m-[m
[31m-    if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) {[m
[31m-        status = NGX_HTTP_CREATED;[m
[31m-[m
[31m-    } else {[m
[31m-        status = NGX_HTTP_NO_CONTENT;[m
[31m-[m
[31m-        if (ngx_is_dir(&fi)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR,[m
[31m-                          "\"%s\" could not be created", path.data);[m
[31m-[m
[31m-            if (ngx_delete_file(temp->data) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                              ngx_delete_file_n " \"%s\" failed",[m
[31m-                              temp->data);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_CONFLICT);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-    ext.access = dlcf->access;[m
[31m-    ext.path_access = dlcf->access;[m
[31m-    ext.time = -1;[m
[31m-    ext.create_path = dlcf->create_full_put_path;[m
[31m-    ext.delete_file = 1;[m
[31m-    ext.log = r->connection->log;[m
[31m-[m
[31m-    if (r->headers_in.date) {[m
[31m-        date = ngx_parse_http_time(r->headers_in.date->value.data,[m
[31m-                                   r->headers_in.date->value.len);[m
[31m-[m
[31m-        if (date != NGX_ERROR) {[m
[31m-            ext.time = date;[m
[31m-            ext.fd = r->request_body->temp_file->file.fd;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ext_rename_file(temp, &path, &ext) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (status == NGX_HTTP_CREATED) {[m
[31m-        if (ngx_http_dav_location(r, path.data) != NGX_OK) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_length_n = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = status;[m
[31m-    r->header_only = 1;[m
[31m-[m
[31m-    ngx_http_finalize_request(r, ngx_http_send_header(r));[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_delete_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                    root;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_int_t                 rc, depth;[m
[31m-    ngx_uint_t                i, d, dir;[m
[31m-    ngx_str_t                 path;[m
[31m-    ngx_file_info_t           fi;[m
[31m-    ngx_http_dav_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n > 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "DELETE with body is unsupported");[m
[31m-        return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;[m
[31m-    }[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-    if (dlcf->min_delete_depth) {[m
[31m-        d = 0;[m
[31m-[m
[31m-        for (i = 0; i < r->uri.len; /* void */) {[m
[31m-            if (r->uri.data[i++] == '/') {[m
[31m-                if (++d >= dlcf->min_delete_depth && i < r->uri.len) {[m
[31m-                    goto ok;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "insufficient URI depth:%i to DELETE", d);[m
[31m-        return NGX_HTTP_CONFLICT;[m
[31m-    }[m
[31m-[m
[31m-ok:[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http delete filename: \"%s\"", path.data);[m
[31m-[m
[31m-    if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        rc = (err == NGX_ENOTDIR) ? NGX_HTTP_CONFLICT : NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-        return ngx_http_dav_error(r->connection->log, err,[m
[31m-                                  rc, ngx_link_info_n, path.data);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-[m
[31m-        if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR,[m
[31m-                          "DELETE \"%s\" failed", path.data);[m
[31m-            return NGX_HTTP_CONFLICT;[m
[31m-        }[m
[31m-[m
[31m-        depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH);[m
[31m-[m
[31m-        if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"Depth\" header must be infinity");[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        path.len -= 2;  /* omit "/\0" */[m
[31m-[m
[31m-        dir = 1;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /*[m
[31m-         * we do not need to test (r->uri.data[r->uri.len - 1] == '/')[m
[31m-         * because ngx_link_info("/file/") returned NGX_ENOTDIR above[m
[31m-         */[m
[31m-[m
[31m-        depth = ngx_http_dav_depth(r, 0);[m
[31m-[m
[31m-        if (depth != 0 && depth != NGX_HTTP_DAV_INFINITY_DEPTH) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"Depth\" header must be 0 or infinity");[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        dir = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_dav_delete_path(r, &path, dir);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return NGX_HTTP_NO_CONTENT;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_delete_path(ngx_http_request_t *r, ngx_str_t *path, ngx_uint_t dir)[m
[31m-{[m
[31m-    char            *failed;[m
[31m-    ngx_tree_ctx_t   tree;[m
[31m-[m
[31m-    if (dir) {[m
[31m-[m
[31m-        tree.init_handler = NULL;[m
[31m-        tree.file_handler = ngx_http_dav_delete_file;[m
[31m-        tree.pre_tree_handler = ngx_http_dav_noop;[m
[31m-        tree.post_tree_handler = ngx_http_dav_delete_dir;[m
[31m-        tree.spec_handler = ngx_http_dav_delete_file;[m
[31m-        tree.data = NULL;[m
[31m-        tree.alloc = 0;[m
[31m-        tree.log = r->connection->log;[m
[31m-[m
[31m-        /* TODO: 207 */[m
[31m-[m
[31m-        if (ngx_walk_tree(&tree, path) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_delete_dir(path->data) != NGX_FILE_ERROR) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        failed = ngx_delete_dir_n;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (ngx_delete_file(path->data) != NGX_FILE_ERROR) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        failed = ngx_delete_file_n;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_dav_error(r->connection->log, ngx_errno,[m
[31m-                              NGX_HTTP_NOT_FOUND, failed, path->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http delete dir: \"%s\"", path->data);[m
[31m-[m
[31m-    if (ngx_delete_dir(path->data) == NGX_FILE_ERROR) {[m
[31m-[m
[31m-        /* TODO: add to 207 */[m
[31m-[m
[31m-        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_dir_n,[m
[31m-                                  path->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http delete file: \"%s\"", path->data);[m
[31m-[m
[31m-    if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {[m
[31m-[m
[31m-        /* TODO: add to 207 */[m
[31m-[m
[31m-        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_file_n,[m
[31m-                                  path->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_mkcol_handler(ngx_http_request_t *r, ngx_http_dav_loc_conf_t *dlcf)[m
[31m-{[m
[31m-    u_char    *p;[m
[31m-    size_t     root;[m
[31m-    ngx_str_t  path;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n > 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "MKCOL with body is unsupported");[m
[31m-        return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "MKCOL can create a collection only");[m
[31m-        return NGX_HTTP_CONFLICT;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_http_map_uri_to_path(r, &path, &root, 0);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(p - 1) = '\0';[m
[31m-    r->uri.len--;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http mkcol path: \"%s\"", path.data);[m
[31m-[m
[31m-    if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access))[m
[31m-        != NGX_FILE_ERROR)[m
[31m-    {[m
[31m-        if (ngx_http_dav_location(r, path.data) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_CREATED;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_dav_error(r->connection->log, ngx_errno,[m
[31m-                              NGX_HTTP_CONFLICT, ngx_create_dir_n, path.data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_copy_move_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                   *p, *host, *last, ch;[m
[31m-    size_t                    len, root;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_int_t                 rc, depth;[m
[31m-    ngx_uint_t                overwrite, slash, dir, flags;[m
[31m-    ngx_str_t                 path, uri, duri, args;[m
[31m-    ngx_tree_ctx_t            tree;[m
[31m-    ngx_copy_file_t           cf;[m
[31m-    ngx_file_info_t           fi;[m
[31m-    ngx_table_elt_t          *dest, *over;[m
[31m-    ngx_ext_rename_file_t     ext;[m
[31m-    ngx_http_dav_copy_ctx_t   copy;[m
[31m-    ngx_http_dav_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n > 0) {[m
[31m-        return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;[m
[31m-    }[m
[31m-[m
[31m-    dest = r->headers_in.destination;[m
[31m-[m
[31m-    if (dest == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent no \"Destination\" header");[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    p = dest->value.data;[m
[31m-    /* there is always '\0' even after empty header value */[m
[31m-    if (p[0] == '/') {[m
[31m-        last = p + dest->value.len;[m
[31m-        goto destination_done;[m
[31m-    }[m
[31m-[m
[31m-    len = r->headers_in.server.len;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent no \"Host\" header");[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-        if (ngx_strncmp(dest->value.data, "https://", sizeof("https://") - 1)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            goto invalid_destination;[m
[31m-        }[m
[31m-[m
[31m-        host = dest->value.data + sizeof("https://") - 1;[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        if (ngx_strncmp(dest->value.data, "http://", sizeof("http://") - 1)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            goto invalid_destination;[m
[31m-        }[m
[31m-[m
[31m-        host = dest->value.data + sizeof("http://") - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncmp(host, r->headers_in.server.data, len) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "\"Destination\" URI \"%V\" is handled by "[m
[31m-                      "different repository than the source URI",[m
[31m-                      &dest->value);[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    last = dest->value.data + dest->value.len;[m
[31m-[m
[31m-    for (p = host + len; p < last; p++) {[m
[31m-        if (*p == '/') {[m
[31m-            goto destination_done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-invalid_destination:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "client sent invalid \"Destination\" header: \"%V\"",[m
[31m-                  &dest->value);[m
[31m-    return NGX_HTTP_BAD_REQUEST;[m
[31m-[m
[31m-destination_done:[m
[31m-[m
[31m-    duri.len = last - p;[m
[31m-    duri.data = p;[m
[31m-    flags = NGX_HTTP_LOG_UNSAFE;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &duri, &args, &flags) != NGX_OK) {[m
[31m-        goto invalid_destination;[m
[31m-    }[m
[31m-[m
[31m-    if ((r->uri.data[r->uri.len - 1] == '/' && *(last - 1) != '/')[m
[31m-        || (r->uri.data[r->uri.len - 1] != '/' && *(last - 1) == '/'))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "both URI \"%V\" and \"Destination\" URI \"%V\" "[m
[31m-                      "should be either collections or non-collections",[m
[31m-                      &r->uri, &dest->value);[m
[31m-        return NGX_HTTP_CONFLICT;[m
[31m-    }[m
[31m-[m
[31m-    depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH);[m
[31m-[m
[31m-    if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) {[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_COPY) {[m
[31m-            if (depth != 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "\"Depth\" header must be 0 or infinity");[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"Depth\" header must be infinity");[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    over = r->headers_in.overwrite;[m
[31m-[m
[31m-    if (over) {[m
[31m-        if (over->value.len == 1) {[m
[31m-            ch = over->value.data[0];[m
[31m-[m
[31m-            if (ch == 'T' || ch == 't') {[m
[31m-                overwrite = 1;[m
[31m-                goto overwrite_done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == 'F' || ch == 'f') {[m
[31m-                overwrite = 0;[m
[31m-                goto overwrite_done;[m
[31m-            }[m
[31m-[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent invalid \"Overwrite\" header: \"%V\"",[m
[31m-                      &over->value);[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    overwrite = 1;[m
[31m-[m
[31m-overwrite_done:[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http copy from: \"%s\"", path.data);[m
[31m-[m
[31m-    uri = r->uri;[m
[31m-    r->uri = duri;[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &copy.path, &root, 0) == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->uri = uri;[m
[31m-[m
[31m-    copy.path.len--;  /* omit "\0" */[m
[31m-[m
[31m-    if (copy.path.data[copy.path.len - 1] == '/') {[m
[31m-        slash = 1;[m
[31m-        copy.path.len--;[m
[31m-        copy.path.data[copy.path.len] = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        slash = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http copy to: \"%s\"", copy.path.data);[m
[31m-[m
[31m-    if (ngx_link_info(copy.path.data, &fi) == NGX_FILE_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-            return ngx_http_dav_error(r->connection->log, err,[m
[31m-                                      NGX_HTTP_NOT_FOUND, ngx_link_info_n,[m
[31m-                                      copy.path.data);[m
[31m-        }[m
[31m-[m
[31m-        /* destination does not exist */[m
[31m-[m
[31m-        overwrite = 0;[m
[31m-        dir = 0;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* destination exists */[m
[31m-[m
[31m-        if (ngx_is_dir(&fi) && !slash) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"%V\" could not be %Ved to collection \"%V\"",[m
[31m-                          &r->uri, &r->method_name, &dest->value);[m
[31m-            return NGX_HTTP_CONFLICT;[m
[31m-        }[m
[31m-[m
[31m-        if (!overwrite) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EEXIST,[m
[31m-                          "\"%s\" could not be created", copy.path.data);[m
[31m-            return NGX_HTTP_PRECONDITION_FAILED;[m
[31m-        }[m
[31m-[m
[31m-        dir = ngx_is_dir(&fi);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {[m
[31m-        return ngx_http_dav_error(r->connection->log, ngx_errno,[m
[31m-                                  NGX_HTTP_NOT_FOUND, ngx_link_info_n,[m
[31m-                                  path.data);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-[m
[31m-        if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"%V\" is collection", &r->uri);[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        if (overwrite) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http delete: \"%s\"", copy.path.data);[m
[31m-[m
[31m-            rc = ngx_http_dav_delete_path(r, &copy.path, dir);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-[m
[31m-        path.len -= 2;  /* omit "/\0" */[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_MOVE) {[m
[31m-            if (ngx_rename_file(path.data, copy.path.data) != NGX_FILE_ERROR) {[m
[31m-                return NGX_HTTP_CREATED;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_create_dir(copy.path.data, ngx_file_access(&fi))[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_dav_error(r->connection->log, ngx_errno,[m
[31m-                                      NGX_HTTP_NOT_FOUND,[m
[31m-                                      ngx_create_dir_n, copy.path.data);[m
[31m-        }[m
[31m-[m
[31m-        copy.len = path.len;[m
[31m-[m
[31m-        tree.init_handler = NULL;[m
[31m-        tree.file_handler = ngx_http_dav_copy_tree_file;[m
[31m-        tree.pre_tree_handler = ngx_http_dav_copy_dir;[m
[31m-        tree.post_tree_handler = ngx_http_dav_copy_dir_time;[m
[31m-        tree.spec_handler = ngx_http_dav_noop;[m
[31m-        tree.data = &copy;[m
[31m-        tree.alloc = 0;[m
[31m-        tree.log = r->connection->log;[m
[31m-[m
[31m-        if (ngx_walk_tree(&tree, &path) == NGX_OK) {[m
[31m-[m
[31m-            if (r->method == NGX_HTTP_MOVE) {[m
[31m-                rc = ngx_http_dav_delete_path(r, &path, 1);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_CREATED;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_MOVE) {[m
[31m-[m
[31m-            dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-            ext.access = 0;[m
[31m-            ext.path_access = dlcf->access;[m
[31m-            ext.time = -1;[m
[31m-            ext.create_path = 1;[m
[31m-            ext.delete_file = 0;[m
[31m-            ext.log = r->connection->log;[m
[31m-[m
[31m-            if (ngx_ext_rename_file(&path, &copy.path, &ext) == NGX_OK) {[m
[31m-                return NGX_HTTP_NO_CONTENT;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);[m
[31m-[m
[31m-        cf.size = ngx_file_size(&fi);[m
[31m-        cf.buf_size = 0;[m
[31m-        cf.access = dlcf->access;[m
[31m-        cf.time = ngx_file_mtime(&fi);[m
[31m-        cf.log = r->connection->log;[m
[31m-[m
[31m-        if (ngx_copy_file(path.data, copy.path.data, &cf) == NGX_OK) {[m
[31m-            return NGX_HTTP_NO_CONTENT;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    u_char                   *p, *dir;[m
[31m-    size_t                    len;[m
[31m-    ngx_http_dav_copy_ctx_t  *copy;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy dir: \"%s\"", path->data);[m
[31m-[m
[31m-    copy = ctx->data;[m
[31m-[m
[31m-    len = copy->path.len + path->len;[m
[31m-[m
[31m-    dir = ngx_alloc(len + 1, ctx->log);[m
[31m-    if (dir == NULL) {[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(dir, copy->path.data, copy->path.len);[m
[31m-    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy dir to: \"%s\"", dir);[m
[31m-[m
[31m-    if (ngx_create_dir(dir, ngx_dir_access(ctx->access)) == NGX_FILE_ERROR) {[m
[31m-        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_create_dir_n,[m
[31m-                                  dir);[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(dir);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    u_char                   *p, *dir;[m
[31m-    size_t                    len;[m
[31m-    ngx_http_dav_copy_ctx_t  *copy;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy dir time: \"%s\"", path->data);[m
[31m-[m
[31m-    copy = ctx->data;[m
[31m-[m
[31m-    len = copy->path.len + path->len;[m
[31m-[m
[31m-    dir = ngx_alloc(len + 1, ctx->log);[m
[31m-    if (dir == NULL) {[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(dir, copy->path.data, copy->path.len);[m
[31m-    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy dir time to: \"%s\"", dir);[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    {[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    fd = ngx_open_file(dir, NGX_FILE_RDWR, NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_open_file_n, dir);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_set_file_time(NULL, fd, ctx->mtime) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,[m
[31m-                      ngx_set_file_time_n " \"%s\" failed", dir);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", dir);[m
[31m-    }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (ngx_set_file_time(dir, 0, ctx->mtime) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,[m
[31m-                      ngx_set_file_time_n " \"%s\" failed", dir);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_free(dir);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    u_char                   *p, *file;[m
[31m-    size_t                    len;[m
[31m-    ngx_copy_file_t           cf;[m
[31m-    ngx_http_dav_copy_ctx_t  *copy;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy file: \"%s\"", path->data);[m
[31m-[m
[31m-    copy = ctx->data;[m
[31m-[m
[31m-    len = copy->path.len + path->len;[m
[31m-[m
[31m-    file = ngx_alloc(len + 1, ctx->log);[m
[31m-    if (file == NULL) {[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(file, copy->path.data, copy->path.len);[m
[31m-    (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http copy file to: \"%s\"", file);[m
[31m-[m
[31m-    cf.size = ctx->size;[m
[31m-    cf.buf_size = 0;[m
[31m-    cf.access = ctx->access;[m
[31m-    cf.time = ctx->mtime;[m
[31m-    cf.log = ctx->log;[m
[31m-[m
[31m-    (void) ngx_copy_file(path->data, file, &cf);[m
[31m-[m
[31m-    ngx_free(file);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt)[m
[31m-{[m
[31m-    ngx_table_elt_t  *depth;[m
[31m-[m
[31m-    depth = r->headers_in.depth;[m
[31m-[m
[31m-    if (depth == NULL) {[m
[31m-        return dflt;[m
[31m-    }[m
[31m-[m
[31m-    if (depth->value.len == 1) {[m
[31m-[m
[31m-        if (depth->value.data[0] == '0') {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (depth->value.data[0] == '1') {[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (depth->value.len == sizeof("infinity") - 1[m
[31m-            && ngx_strcmp(depth->value.data, "infinity") == 0)[m
[31m-        {[m
[31m-            return NGX_HTTP_DAV_INFINITY_DEPTH;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "client sent invalid \"Depth\" header: \"%V\"",[m
[31m-                  &depth->value);[m
[31m-[m
[31m-    return NGX_HTTP_DAV_INVALID_DEPTH;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_error(ngx_log_t *log, ngx_err_t err, ngx_int_t not_found,[m
[31m-    char *failed, u_char *path)[m
[31m-{[m
[31m-    ngx_int_t   rc;[m
[31m-    ngx_uint_t  level;[m
[31m-[m
[31m-    if (err == NGX_ENOENT || err == NGX_ENOTDIR || err == NGX_ENAMETOOLONG) {[m
[31m-        level = NGX_LOG_ERR;[m
[31m-        rc = not_found;[m
[31m-[m
[31m-    } else if (err == NGX_EACCES || err == NGX_EPERM) {[m
[31m-        level = NGX_LOG_ERR;[m
[31m-        rc = NGX_HTTP_FORBIDDEN;[m
[31m-[m
[31m-    } else if (err == NGX_EEXIST) {[m
[31m-        level = NGX_LOG_ERR;[m
[31m-        rc = NGX_HTTP_NOT_ALLOWED;[m
[31m-[m
[31m-    } else if (err == NGX_ENOSPC) {[m
[31m-        level = NGX_LOG_CRIT;[m
[31m-        rc = NGX_HTTP_INSUFFICIENT_STORAGE;[m
[31m-[m
[31m-    } else {[m
[31m-        level = NGX_LOG_CRIT;[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, log, err, "%s \"%s\" failed", failed, path);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_location(ngx_http_request_t *r, u_char *path)[m
[31m-{[m
[31m-    u_char                    *location;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));[m
[31m-    if (r->headers_out.location == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!clcf->alias && clcf->root_lengths == NULL) {[m
[31m-        location = path + clcf->root.len;[m
[31m-[m
[31m-    } else {[m
[31m-        location = ngx_pnalloc(r->pool, r->uri.len);[m
[31m-        if (location == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(location, r->uri.data, r->uri.len);[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not need to set the r->headers_out.location->hash and[m
[31m-     * r->headers_out.location->key fields[m
[31m-     */[m
[31m-[m
[31m-    r->headers_out.location->value.len = r->uri.len;[m
[31m-    r->headers_out.location->value.data = location;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_dav_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_dav_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->methods = 0;[m
[31m-     */[m
[31m-[m
[31m-    conf->min_delete_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->create_full_put_path = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_dav_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_dav_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_dav_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->methods, prev->methods,[m
[31m-                         (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_OFF));[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->min_delete_depth,[m
[31m-                         prev->min_delete_depth, 0);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->access, prev->access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->create_full_put_path,[m
[31m-                         prev->create_full_put_path, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_dav_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_dav_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_degradation_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_degradation_module.c[m
[1mdeleted file mode 100644[m
[1mindex b9c65cd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_degradation_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,243 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t      sbrk_size;[m
[31m-} ngx_http_degradation_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  degrade;[m
[31m-} ngx_http_degradation_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_degrade[] = {[m
[31m-    { ngx_string("204"), 204 },[m
[31m-    { ngx_string("444"), 444 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_degradation_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_degradation_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_degradation_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_degradation(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_degradation_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_degradation_commands[] = {[m
[31m-[m
[31m-    { ngx_string("degradation"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_degradation,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("degrade"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_degradation_loc_conf_t, degrade),[m
[31m-      &ngx_http_degrade },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_degradation_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_degradation_init,             /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_degradation_create_main_conf, /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_degradation_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_http_degradation_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_degradation_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_degradation_module_ctx,      /* module context */[m
[31m-    ngx_http_degradation_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_degradation_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_degradation_loc_conf_t  *dlcf;[m
[31m-[m
[31m-    dlcf = ngx_http_get_module_loc_conf(r, ngx_http_degradation_module);[m
[31m-[m
[31m-    if (dlcf->degrade && ngx_http_degraded(r)) {[m
[31m-        return dlcf->degrade;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_http_degraded(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                             now;[m
[31m-    ngx_uint_t                         log;[m
[31m-    static size_t                      sbrk_size;[m
[31m-    static time_t                      sbrk_time;[m
[31m-    ngx_http_degradation_main_conf_t  *dmcf;[m
[31m-[m
[31m-    dmcf = ngx_http_get_module_main_conf(r, ngx_http_degradation_module);[m
[31m-[m
[31m-    if (dmcf->sbrk_size) {[m
[31m-[m
[31m-        log = 0;[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        /* lock mutex */[m
[31m-[m
[31m-        if (now != sbrk_time) {[m
[31m-[m
[31m-            /*[m
[31m-             * ELF/i386 is loaded at 0x08000000, 128M[m
[31m-             * ELF/amd64 is loaded at 0x00400000, 4M[m
[31m-             *[m
[31m-             * use a function address to subtract the loading address[m
[31m-             */[m
[31m-[m
[31m-            sbrk_size = (size_t) sbrk(0) - ((uintptr_t) ngx_palloc & ~0x3FFFFF);[m
[31m-            sbrk_time = now;[m
[31m-            log = 1;[m
[31m-        }[m
[31m-[m
[31m-        /* unlock mutex */[m
[31m-[m
[31m-        if (sbrk_size >= dmcf->sbrk_size) {[m
[31m-            if (log) {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                              "degradation sbrk:%uzM",[m
[31m-                              sbrk_size / (1024 * 1024));[m
[31m-            }[m
[31m-[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_degradation_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_degradation_main_conf_t  *dmcf;[m
[31m-[m
[31m-    dmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_degradation_main_conf_t));[m
[31m-    if (dmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return dmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_degradation_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_degradation_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_degradation_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->degrade = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_degradation_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_degradation_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_degradation_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->degrade, prev->degrade, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_degradation(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_degradation_main_conf_t  *dmcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value, s;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "sbrk=", 5) == 0) {[m
[31m-[m
[31m-        s.len = value[1].len - 5;[m
[31m-        s.data = value[1].data + 5;[m
[31m-[m
[31m-        dmcf->sbrk_size = ngx_parse_size(&s);[m
[31m-        if (dmcf->sbrk_size == (size_t) NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid sbrk size \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid parameter \"%V\"", &value[1]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_degradation_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_degradation_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_empty_gif_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_empty_gif_module.c[m
[1mdeleted file mode 100644[m
[1mindex 04114dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_empty_gif_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_empty_gif(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_command_t  ngx_http_empty_gif_commands[] = {[m
[31m-[m
[31m-    { ngx_string("empty_gif"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_empty_gif,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* the minimal single pixel transparent GIF, 43 bytes */[m
[31m-[m
[31m-static u_char  ngx_empty_gif[] = {[m
[31m-[m
[31m-    'G', 'I', 'F', '8', '9', 'a',  /* header                                 */[m
[31m-[m
[31m-                                   /* logical screen descriptor              */[m
[31m-    0x01, 0x00,                    /* logical screen width                   */[m
[31m-    0x01, 0x00,                    /* logical screen height                  */[m
[31m-    0x80,                          /* global 1-bit color table               */[m
[31m-    0x01,                          /* background color #1                    */[m
[31m-    0x00,                          /* no aspect ratio                        */[m
[31m-[m
[31m-                                   /* global color table                     */[m
[31m-    0x00, 0x00, 0x00,              /* #0: black                              */[m
[31m-    0xff, 0xff, 0xff,              /* #1: white                              */[m
[31m-[m
[31m-                                   /* graphic control extension              */[m
[31m-    0x21,                          /* extension introducer                   */[m
[31m-    0xf9,                          /* graphic control label                  */[m
[31m-    0x04,                          /* block size                             */[m
[31m-    0x01,                          /* transparent color is given,            */[m
[31m-                                   /*     no disposal specified,             */[m
[31m-                                   /*     user input is not expected         */[m
[31m-    0x00, 0x00,                    /* delay time                             */[m
[31m-    0x01,                          /* transparent color #1                   */[m
[31m-    0x00,                          /* block terminator                       */[m
[31m-[m
[31m-                                   /* image descriptor                       */[m
[31m-    0x2c,                          /* image separator                        */[m
[31m-    0x00, 0x00,                    /* image left position                    */[m
[31m-    0x00, 0x00,                    /* image top position                     */[m
[31m-    0x01, 0x00,                    /* image width                            */[m
[31m-    0x01, 0x00,                    /* image height                           */[m
[31m-    0x00,                          /* no local color table, no interlaced    */[m
[31m-[m
[31m-                                   /* table based image data                 */[m
[31m-    0x02,                          /* LZW minimum code size,                 */[m
[31m-                                   /*     must be at least 2-bit             */[m
[31m-    0x02,                          /* block size                             */[m
[31m-    0x4c, 0x01,                    /* compressed bytes 01_001_100, 0000000_1 */[m
[31m-                                   /* 100: clear code                        */[m
[31m-                                   /* 001: 1                                 */[m
[31m-                                   /* 101: end of information code           */[m
[31m-    0x00,                          /* block terminator                       */[m
[31m-[m
[31m-    0x3B                           /* trailer                                */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_empty_gif_module_ctx = {[m
[31m-    NULL,                          /* preconfiguration */[m
[31m-    NULL,                          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                          /* create main configuration */[m
[31m-    NULL,                          /* init main configuration */[m
[31m-[m
[31m-    NULL,                          /* create server configuration */[m
[31m-    NULL,                          /* merge server configuration */[m
[31m-[m
[31m-    NULL,                          /* create location configuration */[m
[31m-    NULL                           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_empty_gif_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_empty_gif_module_ctx, /* module context */[m
[31m-    ngx_http_empty_gif_commands,   /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_gif_type = ngx_string("image/gif");[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_empty_gif_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_complex_value_t  cv;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&cv, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    cv.value.len = sizeof(ngx_empty_gif);[m
[31m-    cv.value.data = ngx_empty_gif;[m
[31m-    r->headers_out.last_modified_time = 23349600;[m
[31m-[m
[31m-    return ngx_http_send_response(r, NGX_HTTP_OK, &ngx_http_gif_type, &cv);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_empty_gif(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_empty_gif_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_fastcgi_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_fastcgi_module.c[m
[1mdeleted file mode 100644[m
[1mindex 2d288ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_fastcgi_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,3752 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_fastcgi_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                   *flushes;[m
[31m-    ngx_array_t                   *lengths;[m
[31m-    ngx_array_t                   *values;[m
[31m-    ngx_uint_t                     number;[m
[31m-    ngx_hash_t                     hash;[m
[31m-} ngx_http_fastcgi_params_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t       upstream;[m
[31m-[m
[31m-    ngx_str_t                      index;[m
[31m-[m
[31m-    ngx_http_fastcgi_params_t      params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_fastcgi_params_t      params_cache;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t                   *params_source;[m
[31m-    ngx_array_t                   *catch_stderr;[m
[31m-[m
[31m-    ngx_array_t                   *fastcgi_lengths;[m
[31m-    ngx_array_t                   *fastcgi_values;[m
[31m-[m
[31m-    ngx_flag_t                     keep_conn;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t       cache_key;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_t                   *split_regex;[m
[31m-    ngx_str_t                      split_name;[m
[31m-#endif[m
[31m-} ngx_http_fastcgi_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_fastcgi_st_version = 0,[m
[31m-    ngx_http_fastcgi_st_type,[m
[31m-    ngx_http_fastcgi_st_request_id_hi,[m
[31m-    ngx_http_fastcgi_st_request_id_lo,[m
[31m-    ngx_http_fastcgi_st_content_length_hi,[m
[31m-    ngx_http_fastcgi_st_content_length_lo,[m
[31m-    ngx_http_fastcgi_st_padding_length,[m
[31m-    ngx_http_fastcgi_st_reserved,[m
[31m-    ngx_http_fastcgi_st_data,[m
[31m-    ngx_http_fastcgi_st_padding[m
[31m-} ngx_http_fastcgi_state_e;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                        *start;[m
[31m-    u_char                        *end;[m
[31m-} ngx_http_fastcgi_split_part_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_fastcgi_state_e       state;[m
[31m-    u_char                        *pos;[m
[31m-    u_char                        *last;[m
[31m-    ngx_uint_t                     type;[m
[31m-    size_t                         length;[m
[31m-    size_t                         padding;[m
[31m-[m
[31m-    ngx_chain_t                   *free;[m
[31m-    ngx_chain_t                   *busy;[m
[31m-[m
[31m-    unsigned                       fastcgi_stdout:1;[m
[31m-    unsigned                       large_stderr:1;[m
[31m-    unsigned                       header_sent:1;[m
[31m-[m
[31m-    ngx_array_t                   *split_parts;[m
[31m-[m
[31m-    ngx_str_t                      script_name;[m
[31m-    ngx_str_t                      path_info;[m
[31m-} ngx_http_fastcgi_ctx_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_FASTCGI_RESPONDER      1[m
[31m-[m
[31m-#define NGX_HTTP_FASTCGI_KEEP_CONN      1[m
[31m-[m
[31m-#define NGX_HTTP_FASTCGI_BEGIN_REQUEST  1[m
[31m-#define NGX_HTTP_FASTCGI_ABORT_REQUEST  2[m
[31m-#define NGX_HTTP_FASTCGI_END_REQUEST    3[m
[31m-#define NGX_HTTP_FASTCGI_PARAMS         4[m
[31m-#define NGX_HTTP_FASTCGI_STDIN          5[m
[31m-#define NGX_HTTP_FASTCGI_STDOUT         6[m
[31m-#define NGX_HTTP_FASTCGI_STDERR         7[m
[31m-#define NGX_HTTP_FASTCGI_DATA           8[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  version;[m
[31m-    u_char  type;[m
[31m-    u_char  request_id_hi;[m
[31m-    u_char  request_id_lo;[m
[31m-    u_char  content_length_hi;[m
[31m-    u_char  content_length_lo;[m
[31m-    u_char  padding_length;[m
[31m-    u_char  reserved;[m
[31m-} ngx_http_fastcgi_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  role_hi;[m
[31m-    u_char  role_lo;[m
[31m-    u_char  flags;[m
[31m-    u_char  reserved[5];[m
[31m-} ngx_http_fastcgi_begin_request_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  version;[m
[31m-    u_char  type;[m
[31m-    u_char  request_id_hi;[m
[31m-    u_char  request_id_lo;[m
[31m-} ngx_http_fastcgi_header_small_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_fastcgi_header_t         h0;[m
[31m-    ngx_http_fastcgi_begin_request_t  br;[m
[31m-    ngx_http_fastcgi_header_small_t   h1;[m
[31m-} ngx_http_fastcgi_request_start_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_fastcgi_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_fastcgi_create_key(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_fastcgi_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_fastcgi_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_fastcgi_body_output_filter(void *data,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_fastcgi_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_fastcgi_input_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_fastcgi_non_buffered_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_fastcgi_process_record(ngx_http_request_t *r,[m
[31m-    ngx_http_fastcgi_ctx_t *f);[m
[31m-static void ngx_http_fastcgi_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_fastcgi_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_fastcgi_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_fastcgi_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_fastcgi_init_params(ngx_conf_t *cf,[m
[31m-    ngx_http_fastcgi_loc_conf_t *conf, ngx_http_fastcgi_params_t *params,[m
[31m-    ngx_keyval_t *default_params);[m
[31m-[m
[31m-static ngx_int_t ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_http_fastcgi_ctx_t *ngx_http_fastcgi_split(ngx_http_request_t *r,[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf);[m
[31m-[m
[31m-static char *ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_fastcgi_split_path_info(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static char *ngx_http_fastcgi_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_fastcgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post,[m
[31m-    void *data);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_fastcgi_lowat_post =[m
[31m-    { ngx_http_fastcgi_lowat_check };[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_fastcgi_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_fastcgi_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_fastcgi_commands[] = {[m
[31m-[m
[31m-    { ngx_string("fastcgi_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_index"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, index),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_split_path_info"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_split_path_info,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.send_lowat),[m
[31m-      &ngx_http_fastcgi_lowat_post },[m
[31m-[m
[31m-    { ngx_string("fastcgi_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_fastcgi_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_main_conf_t, caches),[m
[31m-      &ngx_http_fastcgi_module },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_fastcgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("fastcgi_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_fastcgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("fastcgi_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23,[m
[31m-      ngx_http_upstream_param_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, params_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-    { ngx_string("fastcgi_catch_stderr"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, catch_stderr),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("fastcgi_keep_conn"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_fastcgi_loc_conf_t, keep_conn),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_fastcgi_module_ctx = {[m
[31m-    ngx_http_fastcgi_add_variables,        /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_fastcgi_create_main_conf,     /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_fastcgi_create_loc_conf,      /* create location configuration */[m
[31m-    ngx_http_fastcgi_merge_loc_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_fastcgi_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_fastcgi_module_ctx,          /* module context */[m
[31m-    ngx_http_fastcgi_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_fastcgi_request_start_t  ngx_http_fastcgi_request_start = {[m
[31m-    { 1,                                               /* version */[m
[31m-      NGX_HTTP_FASTCGI_BEGIN_REQUEST,                  /* type */[m
[31m-      0,                                               /* request_id_hi */[m
[31m-      1,                                               /* request_id_lo */[m
[31m-      0,                                               /* content_length_hi */[m
[31m-      sizeof(ngx_http_fastcgi_begin_request_t),        /* content_length_lo */[m
[31m-      0,                                               /* padding_length */[m
[31m-      0 },                                             /* reserved */[m
[31m-[m
[31m-    { 0,                                               /* role_hi */[m
[31m-      NGX_HTTP_FASTCGI_RESPONDER,                      /* role_lo */[m
[31m-      0, /* NGX_HTTP_FASTCGI_KEEP_CONN */              /* flags */[m
[31m-      { 0, 0, 0, 0, 0 } },                             /* reserved[5] */[m
[31m-[m
[31m-    { 1,                                               /* version */[m
[31m-      NGX_HTTP_FASTCGI_PARAMS,                         /* type */[m
[31m-      0,                                               /* request_id_hi */[m
[31m-      1 },                                             /* request_id_lo */[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_fastcgi_vars[] = {[m
[31m-[m
[31m-    { ngx_string("fastcgi_script_name"), NULL,[m
[31m-      ngx_http_fastcgi_script_name_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("fastcgi_path_info"), NULL,[m
[31m-      ngx_http_fastcgi_path_info_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_fastcgi_hide_headers[] = {[m
[31m-    ngx_string("Status"),[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_fastcgi_cache_headers[] = {[m
[31m-    { ngx_string("HTTP_IF_MODIFIED_SINCE"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("HTTP_IF_MATCH"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_RANGE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_RANGE"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_fastcgi_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_FASTCGI_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_http_upstream_t           *u;[m
[31m-    ngx_http_fastcgi_ctx_t        *f;[m
[31m-    ngx_http_fastcgi_loc_conf_t   *flcf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_fastcgi_main_conf_t  *fmcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t));[m
[31m-    if (f == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, f, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (flcf->fastcgi_lengths) {[m
[31m-        if (ngx_http_fastcgi_eval(r, flcf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_str_set(&u->schema, "fastcgi://");[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_fastcgi_module;[m
[31m-[m
[31m-    u->conf = &flcf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    fmcf = ngx_http_get_module_main_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    u->caches = &fmcf->caches;[m
[31m-    u->create_key = ngx_http_fastcgi_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_fastcgi_create_request;[m
[31m-    u->reinit_request = ngx_http_fastcgi_reinit_request;[m
[31m-    u->process_header = ngx_http_fastcgi_process_header;[m
[31m-    u->abort_request = ngx_http_fastcgi_abort_request;[m
[31m-    u->finalize_request = ngx_http_fastcgi_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    u->buffering = flcf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_http_fastcgi_input_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_fastcgi_input_filter_init;[m
[31m-    u->input_filter = ngx_http_fastcgi_non_buffered_filter;[m
[31m-    u->input_filter_ctx = r;[m
[31m-[m
[31m-    if (!flcf->upstream.request_buffering[m
[31m-        && flcf->upstream.pass_request_body)[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_eval(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf)[m
[31m-{[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &url.url, flcf->fastcgi_lengths->elts, 0,[m
[31m-                            flcf->fastcgi_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = url.port;[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                    *key;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &flcf->cache_key, key) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                         file_pos;[m
[31m-    u_char                        ch, *pos, *lowcase_key;[m
[31m-    size_t                        size, len, key_len, val_len, padding,[m
[31m-                                  allocated;[m
[31m-    ngx_uint_t                    i, n, next, hash, skip_empty, header_params;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header, **ignored;[m
[31m-    ngx_http_upstream_t          *u;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_fastcgi_header_t    *h;[m
[31m-    ngx_http_fastcgi_params_t    *params;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    len = 0;[m
[31m-    header_params = 0;[m
[31m-    ignored = NULL;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    params = u->cacheable ? &flcf->params_cache : &flcf->params;[m
[31m-#else[m
[31m-    params = &flcf->params;[m
[31m-#endif[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, params->flushes);[m
[31m-        le.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-        le.request = r;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = lcode(&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += 1 + key_len + ((val_len > 127) ? 4 : 1) + val_len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flcf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        allocated = 0;[m
[31m-        lowcase_key = NULL;[m
[31m-[m
[31m-        if (params->number) {[m
[31m-            n = 0;[m
[31m-            part = &r->headers_in.headers.part;[m
[31m-[m
[31m-            while (part) {[m
[31m-                n += part->nelts;[m
[31m-                part = part->next;[m
[31m-            }[m
[31m-[m
[31m-            ignored = ngx_palloc(r->pool, n * sizeof(void *));[m
[31m-            if (ignored == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (params->number) {[m
[31m-                if (allocated < header[i].key.len) {[m
[31m-                    allocated = header[i].key.len + 16;[m
[31m-                    lowcase_key = ngx_pnalloc(r->pool, allocated);[m
[31m-                    if (lowcase_key == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                hash = 0;[m
[31m-[m
[31m-                for (n = 0; n < header[i].key.len; n++) {[m
[31m-                    ch = header[i].key.data[n];[m
[31m-[m
[31m-                    if (ch >= 'A' && ch <= 'Z') {[m
[31m-                        ch |= 0x20;[m
[31m-[m
[31m-                    } else if (ch == '-') {[m
[31m-                        ch = '_';[m
[31m-                    }[m
[31m-[m
[31m-                    hash = ngx_hash(hash, ch);[m
[31m-                    lowcase_key[n] = ch;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_hash_find(&params->hash, hash, lowcase_key, n)) {[m
[31m-                    ignored[header_params++] = &header[i];[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                n += sizeof("HTTP_") - 1;[m
[31m-[m
[31m-            } else {[m
[31m-                n = sizeof("HTTP_") - 1 + header[i].key.len;[m
[31m-            }[m
[31m-[m
[31m-            len += ((n > 127) ? 4 : 1) + ((header[i].value.len > 127) ? 4 : 1)[m
[31m-                + n + header[i].value.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (len > 65535) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "fastcgi request record is too big: %uz", len);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    padding = 8 - len % 8;[m
[31m-    padding = (padding == 8) ? 0 : padding;[m
[31m-[m
[31m-[m
[31m-    size = sizeof(ngx_http_fastcgi_header_t)[m
[31m-           + sizeof(ngx_http_fastcgi_begin_request_t)[m
[31m-[m
[31m-           + sizeof(ngx_http_fastcgi_header_t)  /* NGX_HTTP_FASTCGI_PARAMS */[m
[31m-           + len + padding[m
[31m-           + sizeof(ngx_http_fastcgi_header_t)  /* NGX_HTTP_FASTCGI_PARAMS */[m
[31m-[m
[31m-           + sizeof(ngx_http_fastcgi_header_t); /* NGX_HTTP_FASTCGI_STDIN */[m
[31m-[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    ngx_http_fastcgi_request_start.br.flags =[m
[31m-        flcf->keep_conn ? NGX_HTTP_FASTCGI_KEEP_CONN : 0;[m
[31m-[m
[31m-    ngx_memcpy(b->pos, &ngx_http_fastcgi_request_start,[m
[31m-               sizeof(ngx_http_fastcgi_request_start_t));[m
[31m-[m
[31m-    h = (ngx_http_fastcgi_header_t *)[m
[31m-             (b->pos + sizeof(ngx_http_fastcgi_header_t)[m
[31m-                     + sizeof(ngx_http_fastcgi_begin_request_t));[m
[31m-[m
[31m-    h->content_length_hi = (u_char) ((len >> 8) & 0xff);[m
[31m-    h->content_length_lo = (u_char) (len & 0xff);[m
[31m-    h->padding_length = (u_char) padding;[m
[31m-    h->reserved = 0;[m
[31m-[m
[31m-    b->last = b->pos + sizeof(ngx_http_fastcgi_header_t)[m
[31m-                     + sizeof(ngx_http_fastcgi_begin_request_t)[m
[31m-                     + sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        e.ip = params->values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.request = r;[m
[31m-        e.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = (u_char) lcode(&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                e.skip = 1;[m
[31m-[m
[31m-                while (*(uintptr_t *) e.ip) {[m
[31m-                    code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                    code((ngx_http_script_engine_t *) &e);[m
[31m-                }[m
[31m-                e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-                e.skip = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            *e.pos++ = (u_char) key_len;[m
[31m-[m
[31m-            if (val_len > 127) {[m
[31m-                *e.pos++ = (u_char) (((val_len >> 24) & 0x7f) | 0x80);[m
[31m-                *e.pos++ = (u_char) ((val_len >> 16) & 0xff);[m
[31m-                *e.pos++ = (u_char) ((val_len >> 8) & 0xff);[m
[31m-                *e.pos++ = (u_char) (val_len & 0xff);[m
[31m-[m
[31m-            } else {[m
[31m-                *e.pos++ = (u_char) val_len;[m
[31m-            }[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-            e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "fastcgi param: \"%*s: %*s\"",[m
[31m-                           key_len, e.pos - (key_len + val_len),[m
[31m-                           val_len, e.pos - val_len);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (flcf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            for (n = 0; n < header_params; n++) {[m
[31m-                if (&header[i] == ignored[n]) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            key_len = sizeof("HTTP_") - 1 + header[i].key.len;[m
[31m-            if (key_len > 127) {[m
[31m-                *b->last++ = (u_char) (((key_len >> 24) & 0x7f) | 0x80);[m
[31m-                *b->last++ = (u_char) ((key_len >> 16) & 0xff);[m
[31m-                *b->last++ = (u_char) ((key_len >> 8) & 0xff);[m
[31m-                *b->last++ = (u_char) (key_len & 0xff);[m
[31m-[m
[31m-            } else {[m
[31m-                *b->last++ = (u_char) key_len;[m
[31m-            }[m
[31m-[m
[31m-            val_len = header[i].value.len;[m
[31m-            if (val_len > 127) {[m
[31m-                *b->last++ = (u_char) (((val_len >> 24) & 0x7f) | 0x80);[m
[31m-                *b->last++ = (u_char) ((val_len >> 16) & 0xff);[m
[31m-                *b->last++ = (u_char) ((val_len >> 8) & 0xff);[m
[31m-                *b->last++ = (u_char) (val_len & 0xff);[m
[31m-[m
[31m-            } else {[m
[31m-                *b->last++ = (u_char) val_len;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_cpymem(b->last, "HTTP_", sizeof("HTTP_") - 1);[m
[31m-[m
[31m-            for (n = 0; n < header[i].key.len; n++) {[m
[31m-                ch = header[i].key.data[n];[m
[31m-[m
[31m-                if (ch >= 'a' && ch <= 'z') {[m
[31m-                    ch &= ~0x20;[m
[31m-[m
[31m-                } else if (ch == '-') {[m
[31m-                    ch = '_';[m
[31m-                }[m
[31m-[m
[31m-                *b->last++ = ch;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].value.data, val_len);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "fastcgi param: \"%*s: %*s\"",[m
[31m-                           key_len, b->last - (key_len + val_len),[m
[31m-                           val_len, b->last - val_len);[m
[31m-        next:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (padding) {[m
[31m-        ngx_memzero(b->last, padding);[m
[31m-        b->last += padding;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    h = (ngx_http_fastcgi_header_t *) b->last;[m
[31m-    b->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-    h->version = 1;[m
[31m-    h->type = NGX_HTTP_FASTCGI_PARAMS;[m
[31m-    h->request_id_hi = 0;[m
[31m-    h->request_id_lo = 1;[m
[31m-    h->content_length_hi = 0;[m
[31m-    h->content_length_lo = 0;[m
[31m-    h->padding_length = 0;[m
[31m-    h->reserved = 0;[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        u->output.output_filter = ngx_http_fastcgi_body_output_filter;[m
[31m-        u->output.filter_ctx = r;[m
[31m-[m
[31m-    } else if (flcf->upstream.pass_request_body) {[m
[31m-[m
[31m-        body = u->request_bufs;[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        file_pos = 0;[m
[31m-        pos = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        while (body) {[m
[31m-[m
[31m-            if (ngx_buf_special(body->buf)) {[m
[31m-                body = body->next;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (body->buf->in_file) {[m
[31m-                file_pos = body->buf->file_pos;[m
[31m-[m
[31m-            } else {[m
[31m-                pos = body->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            next = 0;[m
[31m-[m
[31m-            do {[m
[31m-                b = ngx_alloc_buf(r->pool);[m
[31m-                if (b == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                if (body->buf->in_file) {[m
[31m-                    b->file_pos = file_pos;[m
[31m-                    file_pos += 32 * 1024;[m
[31m-[m
[31m-                    if (file_pos >= body->buf->file_last) {[m
[31m-                        file_pos = body->buf->file_last;[m
[31m-                        next = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    b->file_last = file_pos;[m
[31m-                    len = (ngx_uint_t) (file_pos - b->file_pos);[m
[31m-[m
[31m-                } else {[m
[31m-                    b->pos = pos;[m
[31m-                    b->start = pos;[m
[31m-                    pos += 32 * 1024;[m
[31m-[m
[31m-                    if (pos >= body->buf->last) {[m
[31m-                        pos = body->buf->last;[m
[31m-                        next = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    b->last = pos;[m
[31m-                    len = (ngx_uint_t) (pos - b->pos);[m
[31m-                }[m
[31m-[m
[31m-                padding = 8 - len % 8;[m
[31m-                padding = (padding == 8) ? 0 : padding;[m
[31m-[m
[31m-                h = (ngx_http_fastcgi_header_t *) cl->buf->last;[m
[31m-                cl->buf->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-                h->version = 1;[m
[31m-                h->type = NGX_HTTP_FASTCGI_STDIN;[m
[31m-                h->request_id_hi = 0;[m
[31m-                h->request_id_lo = 1;[m
[31m-                h->content_length_hi = (u_char) ((len >> 8) & 0xff);[m
[31m-                h->content_length_lo = (u_char) (len & 0xff);[m
[31m-                h->padding_length = (u_char) padding;[m
[31m-                h->reserved = 0;[m
[31m-[m
[31m-                cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl->next == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl = cl->next;[m
[31m-                cl->buf = b;[m
[31m-[m
[31m-                b = ngx_create_temp_buf(r->pool,[m
[31m-                                        sizeof(ngx_http_fastcgi_header_t)[m
[31m-                                        + padding);[m
[31m-                if (b == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (padding) {[m
[31m-                    ngx_memzero(b->last, padding);[m
[31m-                    b->last += padding;[m
[31m-                }[m
[31m-[m
[31m-                cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl->next == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl = cl->next;[m
[31m-                cl->buf = b;[m
[31m-[m
[31m-            } while (!next);[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        u->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-        h = (ngx_http_fastcgi_header_t *) cl->buf->last;[m
[31m-        cl->buf->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-        h->version = 1;[m
[31m-        h->type = NGX_HTTP_FASTCGI_STDIN;[m
[31m-        h->request_id_hi = 0;[m
[31m-        h->request_id_lo = 1;[m
[31m-        h->content_length_hi = 0;[m
[31m-        h->content_length_lo = 0;[m
[31m-        h->padding_length = 0;[m
[31m-        h->reserved = 0;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_fastcgi_ctx_t  *f;[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    f->state = ngx_http_fastcgi_st_version;[m
[31m-    f->fastcgi_stdout = 0;[m
[31m-    f->large_stderr = 0;[m
[31m-[m
[31m-    if (f->split_parts) {[m
[31m-        f->split_parts->nelts = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_body_output_filter(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    off_t                       file_pos;[m
[31m-    u_char                     *pos, *start;[m
[31m-    size_t                      len, padding;[m
[31m-    ngx_buf_t                  *b;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  next, last;[m
[31m-    ngx_chain_t                *cl, *tl, *out, **ll;[m
[31m-    ngx_http_fastcgi_ctx_t     *f;[m
[31m-    ngx_http_fastcgi_header_t  *h;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "fastcgi output filter");[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        out = in;[m
[31m-        goto out;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    if (!f->header_sent) {[m
[31m-        /* first buffer contains headers, pass it unmodified */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "fastcgi output header");[m
[31m-[m
[31m-        f->header_sent = 1;[m
[31m-[m
[31m-        tl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tl->buf = in->buf;[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            tl->next = NULL;[m
[31m-            goto out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &f->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter;[m
[31m-    b->temporary = 1;[m
[31m-[m
[31m-    if (b->start == NULL) {[m
[31m-        /* reserve space for maximum possible padding, 7 bytes */[m
[31m-[m
[31m-        b->start = ngx_palloc(r->pool,[m
[31m-                              sizeof(ngx_http_fastcgi_header_t) + 7);[m
[31m-        if (b->start == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-[m
[31m-        b->end = b->start + sizeof(ngx_http_fastcgi_header_t) + 7;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = 0;[m
[31m-    padding = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    file_pos = 0;[m
[31m-    pos = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    while (in) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "fastcgi output in  l:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       in->buf->last_buf,[m
[31m-                       in->buf->in_file,[m
[31m-                       in->buf->start, in->buf->pos,[m
[31m-                       in->buf->last - in->buf->pos,[m
[31m-                       in->buf->file_pos,[m
[31m-                       in->buf->file_last - in->buf->file_pos);[m
[31m-[m
[31m-        if (in->buf->last_buf) {[m
[31m-            last = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_special(in->buf)) {[m
[31m-            in = in->next;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->in_file) {[m
[31m-            file_pos = in->buf->file_pos;[m
[31m-[m
[31m-        } else {[m
[31m-            pos = in->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        next = 0;[m
[31m-[m
[31m-        do {[m
[31m-            tl = ngx_chain_get_free_buf(r->pool, &f->free);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = tl->buf;[m
[31m-            start = b->start;[m
[31m-[m
[31m-            ngx_memcpy(b, in->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            /*[m
[31m-             * restore b->start to preserve memory allocated in the buffer,[m
[31m-             * to reuse it later for headers and padding[m
[31m-             */[m
[31m-[m
[31m-            b->start = start;[m
[31m-[m
[31m-            if (in->buf->in_file) {[m
[31m-                b->file_pos = file_pos;[m
[31m-                file_pos += 32 * 1024;[m
[31m-[m
[31m-                if (file_pos >= in->buf->file_last) {[m
[31m-                    file_pos = in->buf->file_last;[m
[31m-                    next = 1;[m
[31m-                }[m
[31m-[m
[31m-                b->file_last = file_pos;[m
[31m-                len = (ngx_uint_t) (file_pos - b->file_pos);[m
[31m-[m
[31m-            } else {[m
[31m-                b->pos = pos;[m
[31m-                pos += 32 * 1024;[m
[31m-[m
[31m-                if (pos >= in->buf->last) {[m
[31m-                    pos = in->buf->last;[m
[31m-                    next = 1;[m
[31m-                }[m
[31m-[m
[31m-                b->last = pos;[m
[31m-                len = (ngx_uint_t) (pos - b->pos);[m
[31m-            }[m
[31m-[m
[31m-            b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter;[m
[31m-            b->shadow = in->buf;[m
[31m-            b->last_shadow = next;[m
[31m-[m
[31m-            b->last_buf = 0;[m
[31m-            b->last_in_chain = 0;[m
[31m-[m
[31m-            padding = 8 - len % 8;[m
[31m-            padding = (padding == 8) ? 0 : padding;[m
[31m-[m
[31m-            h = (ngx_http_fastcgi_header_t *) cl->buf->last;[m
[31m-            cl->buf->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-            h->version = 1;[m
[31m-            h->type = NGX_HTTP_FASTCGI_STDIN;[m
[31m-            h->request_id_hi = 0;[m
[31m-            h->request_id_lo = 1;[m
[31m-            h->content_length_hi = (u_char) ((len >> 8) & 0xff);[m
[31m-            h->content_length_lo = (u_char) (len & 0xff);[m
[31m-            h->padding_length = (u_char) padding;[m
[31m-            h->reserved = 0;[m
[31m-[m
[31m-            cl->next = tl;[m
[31m-            cl = tl;[m
[31m-[m
[31m-            tl = ngx_chain_get_free_buf(r->pool, &f->free);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = tl->buf;[m
[31m-[m
[31m-            b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter;[m
[31m-            b->temporary = 1;[m
[31m-[m
[31m-            if (b->start == NULL) {[m
[31m-                /* reserve space for maximum possible padding, 7 bytes */[m
[31m-[m
[31m-                b->start = ngx_palloc(r->pool,[m
[31m-                                      sizeof(ngx_http_fastcgi_header_t) + 7);[m
[31m-                if (b->start == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b->pos = b->start;[m
[31m-                b->last = b->start;[m
[31m-[m
[31m-                b->end = b->start + sizeof(ngx_http_fastcgi_header_t) + 7;[m
[31m-            }[m
[31m-[m
[31m-            if (padding) {[m
[31m-                ngx_memzero(b->last, padding);[m
[31m-                b->last += padding;[m
[31m-            }[m
[31m-[m
[31m-            cl->next = tl;[m
[31m-            cl = tl;[m
[31m-[m
[31m-        } while (!next);[m
[31m-[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        h = (ngx_http_fastcgi_header_t *) cl->buf->last;[m
[31m-        cl->buf->last += sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-        h->version = 1;[m
[31m-        h->type = NGX_HTTP_FASTCGI_STDIN;[m
[31m-        h->request_id_hi = 0;[m
[31m-        h->request_id_lo = 1;[m
[31m-        h->content_length_hi = 0;[m
[31m-        h->content_length_lo = 0;[m
[31m-        h->padding_length = 0;[m
[31m-        h->reserved = 0;[m
[31m-[m
[31m-        cl->buf->last_buf = 1;[m
[31m-[m
[31m-    } else if (padding == 0) {[m
[31m-        /* TODO: do not allocate buffers instead */[m
[31m-        cl->buf->temporary = 0;[m
[31m-        cl->buf->sync = 1;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-out:[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    for (cl = out; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "fastcgi output out l:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->last_buf,[m
[31m-                       cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_chain_writer(&r->upstream->writer, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &f->free, &f->busy, &out,[m
[31m-                         (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter);[m
[31m-[m
[31m-    for (cl = f->free; cl; cl = cl->next) {[m
[31m-[m
[31m-        /* mark original buffers as sent */[m
[31m-[m
[31m-        if (cl->buf->shadow) {[m
[31m-            if (cl->buf->last_shadow) {[m
[31m-                b = cl->buf->shadow;[m
[31m-                b->pos = b->last;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->shadow = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                         *p, *msg, *start, *last,[m
[31m-                                   *part_start, *part_end;[m
[31m-    size_t                          size;[m
[31m-    ngx_str_t                      *status_line, *pattern;[m
[31m-    ngx_int_t                       rc, status;[m
[31m-    ngx_buf_t                       buf;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_fastcgi_ctx_t         *f;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_fastcgi_loc_conf_t    *flcf;[m
[31m-    ngx_http_fastcgi_split_part_t  *part;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (f->state < ngx_http_fastcgi_st_data) {[m
[31m-[m
[31m-            f->pos = u->buffer.pos;[m
[31m-            f->last = u->buffer.last;[m
[31m-[m
[31m-            rc = ngx_http_fastcgi_process_record(r, f);[m
[31m-[m
[31m-            u->buffer.pos = f->pos;[m
[31m-            u->buffer.last = f->last;[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type != NGX_HTTP_FASTCGI_STDOUT[m
[31m-                && f->type != NGX_HTTP_FASTCGI_STDERR)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent unexpected FastCGI record: %ui",[m
[31m-                              f->type);[m
[31m-[m
[31m-                return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream prematurely closed FastCGI stdout");[m
[31m-[m
[31m-                return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (f->state == ngx_http_fastcgi_st_padding) {[m
[31m-[m
[31m-            if (u->buffer.pos + f->padding < u->buffer.last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-                u->buffer.pos += f->padding;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (u->buffer.pos + f->padding == u->buffer.last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-                u->buffer.pos = u->buffer.last;[m
[31m-[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            f->padding -= u->buffer.last - u->buffer.pos;[m
[31m-            u->buffer.pos = u->buffer.last;[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->state == ngx_http_fastcgi_st_data */[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_STDERR) {[m
[31m-[m
[31m-            if (f->length) {[m
[31m-                msg = u->buffer.pos;[m
[31m-[m
[31m-                if (u->buffer.pos + f->length <= u->buffer.last) {[m
[31m-                    u->buffer.pos += f->length;[m
[31m-                    f->length = 0;[m
[31m-                    f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                } else {[m
[31m-                    f->length -= u->buffer.last - u->buffer.pos;[m
[31m-                    u->buffer.pos = u->buffer.last;[m
[31m-                }[m
[31m-[m
[31m-                for (p = u->buffer.pos - 1; msg < p; p--) {[m
[31m-                    if (*p != LF && *p != CR && *p != '.' && *p != ' ') {[m
[31m-                        break;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                p++;[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "FastCGI sent in stderr: \"%*s\"", p - msg, msg);[m
[31m-[m
[31m-                flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-                if (flcf->catch_stderr) {[m
[31m-                    pattern = flcf->catch_stderr->elts;[m
[31m-[m
[31m-                    for (i = 0; i < flcf->catch_stderr->nelts; i++) {[m
[31m-                        if (ngx_strnstr(msg, (char *) pattern[i].data,[m
[31m-                                        p - msg)[m
[31m-                            != NULL)[m
[31m-                        {[m
[31m-                            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (u->buffer.pos == u->buffer.last) {[m
[31m-[m
[31m-                    if (!f->fastcgi_stdout) {[m
[31m-[m
[31m-                        /*[m
[31m-                         * the special handling the large number[m
[31m-                         * of the PHP warnings to not allocate memory[m
[31m-                         */[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-                        if (r->cache) {[m
[31m-                            u->buffer.pos = u->buffer.start[m
[31m-                                                     + r->cache->header_start;[m
[31m-                        } else {[m
[31m-                            u->buffer.pos = u->buffer.start;[m
[31m-                        }[m
[31m-#else[m
[31m-                        u->buffer.pos = u->buffer.start;[m
[31m-#endif[m
[31m-                        u->buffer.last = u->buffer.pos;[m
[31m-                        f->large_stderr = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_AGAIN;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->type == NGX_HTTP_FASTCGI_STDOUT */[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (f->large_stderr && r->cache) {[m
[31m-            ssize_t                     len;[m
[31m-            ngx_http_fastcgi_header_t  *fh;[m
[31m-[m
[31m-            start = u->buffer.start + r->cache->header_start;[m
[31m-[m
[31m-            len = u->buffer.pos - start - 2 * sizeof(ngx_http_fastcgi_header_t);[m
[31m-[m
[31m-            /*[m
[31m-             * A tail of large stderr output before HTTP header is placed[m
[31m-             * in a cache file without a FastCGI record header.[m
[31m-             * To workaround it we put a dummy FastCGI record header at the[m
[31m-             * start of the stderr output or update r->cache_header_start,[m
[31m-             * if there is no enough place for the record header.[m
[31m-             */[m
[31m-[m
[31m-            if (len >= 0) {[m
[31m-                fh = (ngx_http_fastcgi_header_t *) start;[m
[31m-                fh->version = 1;[m
[31m-                fh->type = NGX_HTTP_FASTCGI_STDERR;[m
[31m-                fh->request_id_hi = 0;[m
[31m-                fh->request_id_lo = 1;[m
[31m-                fh->content_length_hi = (u_char) ((len >> 8) & 0xff);[m
[31m-                fh->content_length_lo = (u_char) (len & 0xff);[m
[31m-                fh->padding_length = 0;[m
[31m-                fh->reserved = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                r->cache->header_start += u->buffer.pos - start[m
[31m-                                          - sizeof(ngx_http_fastcgi_header_t);[m
[31m-            }[m
[31m-[m
[31m-            f->large_stderr = 0;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        f->fastcgi_stdout = 1;[m
[31m-[m
[31m-        start = u->buffer.pos;[m
[31m-[m
[31m-        if (u->buffer.pos + f->length < u->buffer.last) {[m
[31m-[m
[31m-            /*[m
[31m-             * set u->buffer.last to the end of the FastCGI record data[m
[31m-             * for ngx_http_parse_header_line()[m
[31m-             */[m
[31m-[m
[31m-            last = u->buffer.last;[m
[31m-            u->buffer.last = u->buffer.pos + f->length;[m
[31m-[m
[31m-        } else {[m
[31m-            last = NULL;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            part_start = u->buffer.pos;[m
[31m-            part_end = u->buffer.last;[m
[31m-[m
[31m-            rc = ngx_http_parse_header_line(r, &u->buffer, 1);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http fastcgi parser: %i", rc);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a header line has been parsed successfully */[m
[31m-[m
[31m-                h = ngx_list_push(&u->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (f->split_parts && f->split_parts->nelts) {[m
[31m-[m
[31m-                    part = f->split_parts->elts;[m
[31m-                    size = u->buffer.pos - part_start;[m
[31m-[m
[31m-                    for (i = 0; i < f->split_parts->nelts; i++) {[m
[31m-                        size += part[i].end - part[i].start;[m
[31m-                    }[m
[31m-[m
[31m-                    p = ngx_pnalloc(r->pool, size);[m
[31m-                    if (p == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    buf.pos = p;[m
[31m-[m
[31m-                    for (i = 0; i < f->split_parts->nelts; i++) {[m
[31m-                        p = ngx_cpymem(p, part[i].start,[m
[31m-                                       part[i].end - part[i].start);[m
[31m-                    }[m
[31m-[m
[31m-                    p = ngx_cpymem(p, part_start, u->buffer.pos - part_start);[m
[31m-[m
[31m-                    buf.last = p;[m
[31m-[m
[31m-                    f->split_parts->nelts = 0;[m
[31m-[m
[31m-                    rc = ngx_http_parse_header_line(r, &buf, 1);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                                      "invalid header after joining "[m
[31m-                                      "FastCGI records");[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    h->key.len = r->header_name_end - r->header_name_start;[m
[31m-                    h->key.data = r->header_name_start;[m
[31m-                    h->key.data[h->key.len] = '\0';[m
[31m-[m
[31m-                    h->value.len = r->header_end - r->header_start;[m
[31m-                    h->value.data = r->header_start;[m
[31m-                    h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-                    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-                    if (h->lowcase_key == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    h->key.len = r->header_name_end - r->header_name_start;[m
[31m-                    h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-                    h->key.data = ngx_pnalloc(r->pool,[m
[31m-                                              h->key.len + 1 + h->value.len + 1[m
[31m-                                              + h->key.len);[m
[31m-                    if (h->key.data == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    h->value.data = h->key.data + h->key.len + 1;[m
[31m-                    h->lowcase_key = h->key.data + h->key.len + 1[m
[31m-                                     + h->value.len + 1;[m
[31m-[m
[31m-                    ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-                    h->key.data[h->key.len] = '\0';[m
[31m-                    ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-                    h->value.data[h->value.len] = '\0';[m
[31m-                }[m
[31m-[m
[31m-                h->hash = r->header_hash;[m
[31m-[m
[31m-                if (h->key.len == r->lowcase_index) {[m
[31m-                    ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-                }[m
[31m-[m
[31m-                hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                                   h->lowcase_key, h->key.len);[m
[31m-[m
[31m-                if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "http fastcgi header: \"%V: %V\"",[m
[31m-                               &h->key, &h->value);[m
[31m-[m
[31m-                if (u->buffer.pos < u->buffer.last) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                /* the end of the FastCGI record */[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-                /* a whole header has been parsed successfully */[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "http fastcgi header done");[m
[31m-[m
[31m-                if (u->headers_in.status) {[m
[31m-                    status_line = &u->headers_in.status->value;[m
[31m-[m
[31m-                    status = ngx_atoi(status_line->data, 3);[m
[31m-[m
[31m-                    if (status == NGX_ERROR) {[m
[31m-                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                      "upstream sent invalid status \"%V\"",[m
[31m-                                      status_line);[m
[31m-                        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-                    }[m
[31m-[m
[31m-                    u->headers_in.status_n = status;[m
[31m-                    u->headers_in.status_line = *status_line;[m
[31m-[m
[31m-                } else if (u->headers_in.location) {[m
[31m-                    u->headers_in.status_n = 302;[m
[31m-                    ngx_str_set(&u->headers_in.status_line,[m
[31m-                                "302 Moved Temporarily");[m
[31m-[m
[31m-                } else {[m
[31m-                    u->headers_in.status_n = 200;[m
[31m-                    ngx_str_set(&u->headers_in.status_line, "200 OK");[m
[31m-                }[m
[31m-[m
[31m-                if (u->state && u->state->status == 0) {[m
[31m-                    u->state->status = u->headers_in.status_n;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* there was error while a header line parsing */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "upstream sent invalid header");[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        if (last) {[m
[31m-            u->buffer.last = last;[m
[31m-        }[m
[31m-[m
[31m-        f->length -= u->buffer.pos - start;[m
[31m-[m
[31m-        if (f->length == 0) {[m
[31m-            f->state = ngx_http_fastcgi_st_padding;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_AGAIN */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "upstream split a header line in FastCGI records");[m
[31m-[m
[31m-        if (f->split_parts == NULL) {[m
[31m-            f->split_parts = ngx_array_create(r->pool, 1,[m
[31m-                                        sizeof(ngx_http_fastcgi_split_part_t));[m
[31m-            if (f->split_parts == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        part = ngx_array_push(f->split_parts);[m
[31m-        if (part == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        part->start = part_start;[m
[31m-        part->end = part_end;[m
[31m-[m
[31m-        if (u->buffer.pos < u->buffer.last) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t           *r = data;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    r->upstream->pipe->length = flcf->keep_conn ?[m
[31m-                                (off_t) sizeof(ngx_http_fastcgi_header_t) : -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    u_char                       *m, *msg;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_buf_t                    *b, **prev;[m
[31m-    ngx_chain_t                  *cl;[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_http_fastcgi_ctx_t       *f;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r = p->input_ctx;[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    b = NULL;[m
[31m-    prev = &buf->shadow;[m
[31m-[m
[31m-    f->pos = buf->pos;[m
[31m-    f->last = buf->last;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (f->state < ngx_http_fastcgi_st_data) {[m
[31m-[m
[31m-            rc = ngx_http_fastcgi_process_record(r, f);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                if (!flcf->keep_conn) {[m
[31m-                    p->upstream_done = 1;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0,[m
[31m-                               "http fastcgi closed stdout");[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0,[m
[31m-                               "http fastcgi sent end request");[m
[31m-[m
[31m-                if (!flcf->keep_conn) {[m
[31m-                    p->upstream_done = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        if (f->state == ngx_http_fastcgi_st_padding) {[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-                if (f->pos + f->padding < f->last) {[m
[31m-                    p->upstream_done = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (f->pos + f->padding == f->last) {[m
[31m-                    p->upstream_done = 1;[m
[31m-                    r->upstream->keepalive = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                f->padding -= f->last - f->pos;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (f->pos + f->padding < f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-                f->pos += f->padding;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (f->pos + f->padding == f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            f->padding -= f->last - f->pos;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->state == ngx_http_fastcgi_st_data */[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_STDERR) {[m
[31m-[m
[31m-            if (f->length) {[m
[31m-[m
[31m-                if (f->pos == f->last) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                msg = f->pos;[m
[31m-[m
[31m-                if (f->pos + f->length <= f->last) {[m
[31m-                    f->pos += f->length;[m
[31m-                    f->length = 0;[m
[31m-                    f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                } else {[m
[31m-                    f->length -= f->last - f->pos;[m
[31m-                    f->pos = f->last;[m
[31m-                }[m
[31m-[m
[31m-                for (m = f->pos - 1; msg < m; m--) {[m
[31m-                    if (*m != LF && *m != CR && *m != '.' && *m != ' ') {[m
[31m-                        break;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, p->log, 0,[m
[31m-                              "FastCGI sent in stderr: \"%*s\"",[m
[31m-                              m + 1 - msg, msg);[m
[31m-[m
[31m-            } else {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-            if (f->pos + f->length <= f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-                f->pos += f->length;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            f->length -= f->last - f->pos;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->type == NGX_HTTP_FASTCGI_STDOUT */[m
[31m-[m
[31m-        if (f->pos == f->last) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->pos = f->pos;[m
[31m-        b->start = buf->start;[m
[31m-        b->end = buf->end;[m
[31m-        b->tag = p->tag;[m
[31m-        b->temporary = 1;[m
[31m-        b->recycled = 1;[m
[31m-[m
[31m-        *prev = b;[m
[31m-        prev = &b->shadow;[m
[31m-[m
[31m-        if (p->in) {[m
[31m-            *p->last_in = cl;[m
[31m-        } else {[m
[31m-            p->in = cl;[m
[31m-        }[m
[31m-        p->last_in = &cl->next;[m
[31m-[m
[31m-[m
[31m-        /* STUB */ b->num = buf->num;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "input buf #%d %p", b->num, b->pos);[m
[31m-[m
[31m-        if (f->pos + f->length <= f->last) {[m
[31m-            f->state = ngx_http_fastcgi_st_padding;[m
[31m-            f->pos += f->length;[m
[31m-            b->last = f->pos;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        f->length -= f->last - f->pos;[m
[31m-[m
[31m-        b->last = f->last;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    if (flcf->keep_conn) {[m
[31m-[m
[31m-        /* set p->length, minimal amount of data we want to see */[m
[31m-[m
[31m-        if (f->state < ngx_http_fastcgi_st_data) {[m
[31m-            p->length = 1;[m
[31m-[m
[31m-        } else if (f->state == ngx_http_fastcgi_st_padding) {[m
[31m-            p->length = f->padding;[m
[31m-[m
[31m-        } else {[m
[31m-            /* ngx_http_fastcgi_st_data */[m
[31m-[m
[31m-            p->length = f->length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (b) {[m
[31m-        b->shadow = buf;[m
[31m-        b->last_shadow = 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "input buf %p %z", b->pos, b->last - b->pos);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* there is no data record in the buf, add it to free chain */[m
[31m-[m
[31m-    if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_non_buffered_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    u_char                  *m, *msg;[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_buf_t               *b, *buf;[m
[31m-    ngx_chain_t             *cl, **ll;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_upstream_t     *u;[m
[31m-    ngx_http_fastcgi_ctx_t  *f;[m
[31m-[m
[31m-    r = data;[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    buf = &u->buffer;[m
[31m-[m
[31m-    buf->pos = buf->last;[m
[31m-    buf->last += bytes;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    f->pos = buf->pos;[m
[31m-    f->last = buf->last;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (f->state < ngx_http_fastcgi_st_data) {[m
[31m-[m
[31m-            rc = ngx_http_fastcgi_process_record(r, f);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "http fastcgi closed stdout");[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (f->state == ngx_http_fastcgi_st_padding) {[m
[31m-[m
[31m-            if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-                if (f->pos + f->padding < f->last) {[m
[31m-                    u->length = 0;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (f->pos + f->padding == f->last) {[m
[31m-                    u->length = 0;[m
[31m-                    u->keepalive = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                f->padding -= f->last - f->pos;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (f->pos + f->padding < f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-                f->pos += f->padding;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (f->pos + f->padding == f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_version;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            f->padding -= f->last - f->pos;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->state == ngx_http_fastcgi_st_data */[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_STDERR) {[m
[31m-[m
[31m-            if (f->length) {[m
[31m-[m
[31m-                if (f->pos == f->last) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                msg = f->pos;[m
[31m-[m
[31m-                if (f->pos + f->length <= f->last) {[m
[31m-                    f->pos += f->length;[m
[31m-                    f->length = 0;[m
[31m-                    f->state = ngx_http_fastcgi_st_padding;[m
[31m-[m
[31m-                } else {[m
[31m-                    f->length -= f->last - f->pos;[m
[31m-                    f->pos = f->last;[m
[31m-                }[m
[31m-[m
[31m-                for (m = f->pos - 1; msg < m; m--) {[m
[31m-                    if (*m != LF && *m != CR && *m != '.' && *m != ' ') {[m
[31m-                        break;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "FastCGI sent in stderr: \"%*s\"",[m
[31m-                              m + 1 - msg, msg);[m
[31m-[m
[31m-            } else {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) {[m
[31m-[m
[31m-            if (f->pos + f->length <= f->last) {[m
[31m-                f->state = ngx_http_fastcgi_st_padding;[m
[31m-                f->pos += f->length;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            f->length -= f->last - f->pos;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        /* f->type == NGX_HTTP_FASTCGI_STDOUT */[m
[31m-[m
[31m-        if (f->pos == f->last) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        b->flush = 1;[m
[31m-        b->memory = 1;[m
[31m-[m
[31m-        b->pos = f->pos;[m
[31m-        b->tag = u->output.tag;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http fastcgi output buf %p", b->pos);[m
[31m-[m
[31m-        if (f->pos + f->length <= f->last) {[m
[31m-            f->state = ngx_http_fastcgi_st_padding;[m
[31m-            f->pos += f->length;[m
[31m-            b->last = f->pos;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        f->length -= f->last - f->pos;[m
[31m-        b->last = f->last;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    /* provide continuous buffer for subrequests in memory */[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-[m
[31m-        cl = u->out_bufs;[m
[31m-[m
[31m-        if (cl) {[m
[31m-            buf->pos = cl->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        buf->last = buf->pos;[m
[31m-[m
[31m-        for (cl = u->out_bufs; cl; cl = cl->next) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http fastcgi in memory %p-%p %O",[m
[31m-                           cl->buf->pos, cl->buf->last, ngx_buf_size(cl->buf));[m
[31m-[m
[31m-            if (buf->last == cl->buf->pos) {[m
[31m-                buf->last = cl->buf->last;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_movemem(buf->last, cl->buf->pos,[m
[31m-                                    cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-            cl->buf->pos = buf->last - (cl->buf->last - cl->buf->pos);[m
[31m-            cl->buf->last = buf->last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_process_record(ngx_http_request_t *r,[m
[31m-    ngx_http_fastcgi_ctx_t *f)[m
[31m-{[m
[31m-    u_char                     ch, *p;[m
[31m-    ngx_http_fastcgi_state_e   state;[m
[31m-[m
[31m-    state = f->state;[m
[31m-[m
[31m-    for (p = f->pos; p < f->last; p++) {[m
[31m-[m
[31m-        ch = *p;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http fastcgi record byte: %02Xd", ch);[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_version:[m
[31m-            if (ch != 1) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent unsupported FastCGI "[m
[31m-                              "protocol version: %d", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            state = ngx_http_fastcgi_st_type;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_type:[m
[31m-            switch (ch) {[m
[31m-            case NGX_HTTP_FASTCGI_STDOUT:[m
[31m-            case NGX_HTTP_FASTCGI_STDERR:[m
[31m-            case NGX_HTTP_FASTCGI_END_REQUEST:[m
[31m-                f->type = (ngx_uint_t) ch;[m
[31m-                break;[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent invalid FastCGI "[m
[31m-                              "record type: %d", ch);[m
[31m-                return NGX_ERROR;[m
[31m-[m
[31m-            }[m
[31m-            state = ngx_http_fastcgi_st_request_id_hi;[m
[31m-            break;[m
[31m-[m
[31m-        /* we support the single request per connection */[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_request_id_hi:[m
[31m-            if (ch != 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent unexpected FastCGI "[m
[31m-                              "request id high byte: %d", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            state = ngx_http_fastcgi_st_request_id_lo;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_request_id_lo:[m
[31m-            if (ch != 1) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream sent unexpected FastCGI "[m
[31m-                              "request id low byte: %d", ch);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            state = ngx_http_fastcgi_st_content_length_hi;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_content_length_hi:[m
[31m-            f->length = ch << 8;[m
[31m-            state = ngx_http_fastcgi_st_content_length_lo;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_content_length_lo:[m
[31m-            f->length |= (size_t) ch;[m
[31m-            state = ngx_http_fastcgi_st_padding_length;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_padding_length:[m
[31m-            f->padding = (size_t) ch;[m
[31m-            state = ngx_http_fastcgi_st_reserved;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_http_fastcgi_st_reserved:[m
[31m-            state = ngx_http_fastcgi_st_data;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http fastcgi record length: %z", f->length);[m
[31m-[m
[31m-            f->pos = p + 1;[m
[31m-            f->state = state;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        /* suppress warning */[m
[31m-        case ngx_http_fastcgi_st_data:[m
[31m-        case ngx_http_fastcgi_st_padding:[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    f->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_fastcgi_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http fastcgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_fastcgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http fastcgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_fastcgi_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_fastcgi_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fastcgi_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fastcgi_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.ignore_headers = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.cache_zone = NULL;[m
[31m-     *     conf->upstream.cache_use_stale = 0;[m
[31m-     *     conf->upstream.cache_methods = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.hide_headers_hash = { NULL, 0 };[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     *     conf->upstream.store_lengths = NULL;[m
[31m-     *     conf->upstream.store_values = NULL;[m
[31m-     *[m
[31m-     *     conf->index.len = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-    /* "fastcgi_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    conf->catch_stderr = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->keep_conn = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "fastcgi");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *prev = parent;[m
[31m-    ngx_http_fastcgi_loc_conf_t *conf = child;[m
[31m-[m
[31m-    size_t                        size;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store,[m
[31m-                              prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"fastcgi_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-                                         conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"fastcgi_busy_buffers_size\" must be equal to or greater than "[m
[31m-             "the maximum of the value of \"fastcgi_buffer_size\" and "[m
[31m-             "one of the \"fastcgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"fastcgi_busy_buffers_size\" must be less than "[m
[31m-             "the size of all \"fastcgi_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-                                      conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"fastcgi_temp_file_write_size\" must be equal to or greater "[m
[31m-             "than the maximum of the value of \"fastcgi_buffer_size\" and "[m
[31m-             "one of the \"fastcgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-                                        conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"fastcgi_max_temp_file_size\" must be equal to zero to disable "[m
[31m-             "temporary files usage or must be equal to or greater than "[m
[31m-             "the maximum of the value of \"fastcgi_buffer_size\" and "[m
[31m-             "one of the \"fastcgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                              prev->upstream.ignore_headers,[m
[31m-                              NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                              prev->upstream.temp_path,[m
[31m-                              &ngx_http_fastcgi_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"fastcgi_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache && conf->cache_key.value.data == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "no \"fastcgi_cache_key\" for \"fastcgi_cache\"");[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                              prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                              prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                              prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->catch_stderr, prev->catch_stderr, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->keep_conn, prev->keep_conn, 0);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->index, prev->index, "");[m
[31m-[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "fastcgi_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-             &prev->upstream, ngx_http_fastcgi_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->fastcgi_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->fastcgi_lengths = prev->fastcgi_lengths;[m
[31m-        conf->fastcgi_values = prev->fastcgi_values;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->fastcgi_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_fastcgi_handler;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (conf->split_regex == NULL) {[m
[31m-        conf->split_regex = prev->split_regex;[m
[31m-        conf->split_name = prev->split_name;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->params_source == NULL) {[m
[31m-        conf->params = prev->params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->params_cache = prev->params_cache;[m
[31m-#endif[m
[31m-        conf->params_source = prev->params_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_fastcgi_init_params(cf, conf, &conf->params, NULL);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_fastcgi_init_params(cf, conf, &conf->params_cache,[m
[31m-                                          ngx_http_fastcgi_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_init_params(ngx_conf_t *cf, ngx_http_fastcgi_loc_conf_t *conf,[m
[31m-    ngx_http_fastcgi_params_t *params, ngx_keyval_t *default_params)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i, nsrc;[m
[31m-    ngx_array_t                   headers_names, params_merged;[m
[31m-    ngx_keyval_t                 *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_upstream_param_t    *src, *s;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (params->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source == NULL && default_params == NULL) {[m
[31m-        params->hash.buckets = (void *) 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    params->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (params->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    params->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (params->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source) {[m
[31m-        src = conf->params_source->elts;[m
[31m-        nsrc = conf->params_source->nelts;[m
[31m-[m
[31m-    } else {[m
[31m-        src = NULL;[m
[31m-        nsrc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (default_params) {[m
[31m-        if (ngx_array_init(&params_merged, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_upstream_param_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = src[i];[m
[31m-        }[m
[31m-[m
[31m-        h = default_params;[m
[31m-[m
[31m-        while (h->key.len) {[m
[31m-[m
[31m-            src = params_merged.elts;[m
[31m-            nsrc = params_merged.nelts;[m
[31m-[m
[31m-            for (i = 0; i < nsrc; i++) {[m
[31m-                if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            s->key = h->key;[m
[31m-            s->value = h->value;[m
[31m-            s->skip_empty = 1;[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            h++;[m
[31m-        }[m
[31m-[m
[31m-        src = params_merged.elts;[m
[31m-        nsrc = params_merged.nelts;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-        if (src[i].key.len > sizeof("HTTP_") - 1[m
[31m-            && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0)[m
[31m-        {[m
[31m-            hk = ngx_array_push(&headers_names);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key.len = src[i].key.len - 5;[m
[31m-            hk->key.data = src[i].key.data + 5;[m
[31m-            hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-            if (src[i].value.len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].key.len;[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].skip_empty;[m
[31m-[m
[31m-[m
[31m-        size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                + src[i].key.len + sizeof(uintptr_t) - 1)[m
[31m-               & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->values, size);[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = ngx_http_script_copy_code;[m
[31m-        copy->len = src[i].key.len;[m
[31m-[m
[31m-        p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-        ngx_memcpy(p, src[i].key.data, src[i].key.len);[m
[31m-[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &src[i].value;[m
[31m-        sc.flushes = &params->flushes;[m
[31m-        sc.lengths = &params->lengths;[m
[31m-        sc.values = &params->values;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-        code = ngx_array_push_n(params->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-    params->number = headers_names.nelts;[m
[31m-[m
[31m-    hash.hash = &params->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = 64;[m
[31m-    hash.name = "fastcgi_params_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    ngx_http_fastcgi_ctx_t       *f;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    f = ngx_http_fastcgi_split(r, flcf);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (f->script_name.len == 0[m
[31m-        || f->script_name.data[f->script_name.len - 1] != '/')[m
[31m-    {[m
[31m-        v->len = f->script_name.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = f->script_name.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = f->script_name.len + flcf->index.len;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, v->len);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(v->data, f->script_name.data, f->script_name.len);[m
[31m-    ngx_memcpy(p, flcf->index.data, flcf->index.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_fastcgi_ctx_t       *f;[m
[31m-    ngx_http_fastcgi_loc_conf_t  *flcf;[m
[31m-[m
[31m-    flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    f = ngx_http_fastcgi_split(r, flcf);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = f->path_info.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = f->path_info.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_fastcgi_ctx_t *[m
[31m-ngx_http_fastcgi_split(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_ctx_t       *f;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                     n;[m
[31m-    int                           captures[(1 + 2) * 3];[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t));[m
[31m-        if (f == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, f, ngx_http_fastcgi_module);[m
[31m-    }[m
[31m-[m
[31m-    if (f->script_name.len) {[m
[31m-        return f;[m
[31m-    }[m
[31m-[m
[31m-    if (flcf->split_regex == NULL) {[m
[31m-        f->script_name = r->uri;[m
[31m-        return f;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_regex_exec(flcf->split_regex, &r->uri, captures, (1 + 2) * 3);[m
[31m-[m
[31m-    if (n >= 0) { /* match */[m
[31m-        f->script_name.len = captures[3] - captures[2];[m
[31m-        f->script_name.data = r->uri.data + captures[2];[m
[31m-[m
[31m-        f->path_info.len = captures[5] - captures[4];[m
[31m-        f->path_info.data = r->uri.data + captures[4];[m
[31m-[m
[31m-        return f;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_REGEX_NO_MATCHED) {[m
[31m-        f->script_name = r->uri;[m
[31m-        return f;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                  ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"",[m
[31m-                  n, &r->uri, &flcf->split_name);[m
[31m-    return NULL;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module);[m
[31m-[m
[31m-    if (f == NULL) {[m
[31m-        f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t));[m
[31m-        if (f == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, f, ngx_http_fastcgi_module);[m
[31m-    }[m
[31m-[m
[31m-    f->script_name = r->uri;[m
[31m-[m
[31m-    return f;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (flcf->upstream.upstream || flcf->fastcgi_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_fastcgi_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &flcf->fastcgi_lengths;[m
[31m-        sc.values = &flcf->fastcgi_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    flcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (flcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_split_path_info(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_regex_compile_t   rc;[m
[31m-    u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    flcf->split_name = value[1];[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = value[1];[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc.captures != 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "pattern \"%V\" must have 2 captures", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    flcf->split_regex = rc.regex;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "\"%V\" requires PCRE library", &cmd->name);[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (flcf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        flcf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (flcf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"fastcgi_cache\"";[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    flcf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &flcf->upstream.store_lengths;[m
[31m-    sc.values = &flcf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (flcf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        flcf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (flcf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"fastcgi_store\"";[m
[31m-    }[m
[31m-[m
[31m-    flcf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        flcf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (flcf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *flcf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    flcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                      &ngx_http_fastcgi_module);[m
[31m-    if (flcf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_fastcgi_loc_conf_t *flcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (flcf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &flcf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"fastcgi_send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"fastcgi_send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_flv_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_flv_module.c[m
[1mdeleted file mode 100644[m
[1mindex cc25320..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_flv_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,266 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_flv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-static ngx_command_t  ngx_http_flv_commands[] = {[m
[31m-[m
[31m-    { ngx_string("flv"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_flv,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_char  ngx_flv_header[] = "FLV\x1\x5\0\0\0\x9\0\0\0\0";[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_flv_module_ctx = {[m
[31m-    NULL,                          /* preconfiguration */[m
[31m-    NULL,                          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                          /* create main configuration */[m
[31m-    NULL,                          /* init main configuration */[m
[31m-[m
[31m-    NULL,                          /* create server configuration */[m
[31m-    NULL,                          /* merge server configuration */[m
[31m-[m
[31m-    NULL,                          /* create location configuration */[m
[31m-    NULL                           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_flv_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_flv_module_ctx,      /* module context */[m
[31m-    ngx_http_flv_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_flv_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *last;[m
[31m-    off_t                      start, len;[m
[31m-    size_t                     root;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 level, i;[m
[31m-    ngx_str_t                  path, value;[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out[2];[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root, 0);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    path.len = last - path.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "http flv filename: \"%V\"", &path);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-        case NGX_ENAMETOOLONG:[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_EACCES:[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-        case NGX_EMLINK:[m
[31m-        case NGX_ELOOP:[m
[31m-#endif[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {[m
[31m-            ngx_log_error(level, log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, path.data);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (!of.is_file) {[m
[31m-[m
[31m-        if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", path.data);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->root_tested = !r->error_page;[m
[31m-[m
[31m-    start = 0;[m
[31m-    len = of.size;[m
[31m-    i = 1;[m
[31m-[m
[31m-    if (r->args.len) {[m
[31m-[m
[31m-        if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) {[m
[31m-[m
[31m-            start = ngx_atoof(value.data, value.len);[m
[31m-[m
[31m-            if (start == NGX_ERROR || start >= len) {[m
[31m-                start = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (start) {[m
[31m-                len = sizeof(ngx_flv_header) - 1 + len - start;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    log->action = "sending flv to client";[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_length_n = len;[m
[31m-    r->headers_out.last_modified_time = of.mtime;[m
[31m-[m
[31m-    if (ngx_http_set_etag(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (i == 0) {[m
[31m-        b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = ngx_flv_header;[m
[31m-        b->last = ngx_flv_header + sizeof(ngx_flv_header) - 1;[m
[31m-        b->memory = 1;[m
[31m-[m
[31m-        out[0].buf = b;[m
[31m-        out[0].next = &out[1];[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = start;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = b->file_last ? 1: 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->name = path;[m
[31m-    b->file->log = log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    out[1].buf = b;[m
[31m-    out[1].next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out[i]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_flv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_flv_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_geo_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_geo_module.c[m
[1mdeleted file mode 100644[m
[1mindex 9b3c6cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_geo_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1644 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_variable_value_t       *value;[m
[31m-    u_short                          start;[m
[31m-    u_short                          end;[m
[31m-} ngx_http_geo_range_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_radix_tree_t                *tree;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_radix_tree_t                *tree6;[m
[31m-#endif[m
[31m-} ngx_http_geo_trees_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_geo_range_t           **low;[m
[31m-    ngx_http_variable_value_t       *default_value;[m
[31m-} ngx_http_geo_high_ranges_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_node_t                   sn;[m
[31m-    ngx_http_variable_value_t       *value;[m
[31m-    size_t                           offset;[m
[31m-} ngx_http_geo_variable_value_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_variable_value_t       *value;[m
[31m-    ngx_str_t                       *net;[m
[31m-    ngx_http_geo_high_ranges_t       high;[m
[31m-    ngx_radix_tree_t                *tree;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_radix_tree_t                *tree6;[m
[31m-#endif[m
[31m-    ngx_rbtree_t                     rbtree;[m
[31m-    ngx_rbtree_node_t                sentinel;[m
[31m-    ngx_array_t                     *proxies;[m
[31m-    ngx_pool_t                      *pool;[m
[31m-    ngx_pool_t                      *temp_pool;[m
[31m-[m
[31m-    size_t                           data_size;[m
[31m-[m
[31m-    ngx_str_t                        include_name;[m
[31m-    ngx_uint_t                       includes;[m
[31m-    ngx_uint_t                       entries;[m
[31m-[m
[31m-    unsigned                         ranges:1;[m
[31m-    unsigned                         outside_entries:1;[m
[31m-    unsigned                         allow_binary_include:1;[m
[31m-    unsigned                         binary_include:1;[m
[31m-    unsigned                         proxy_recursive:1;[m
[31m-} ngx_http_geo_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    union {[m
[31m-        ngx_http_geo_trees_t         trees;[m
[31m-        ngx_http_geo_high_ranges_t   high;[m
[31m-    } u;[m
[31m-[m
[31m-    ngx_array_t                     *proxies;[m
[31m-    unsigned                         proxy_recursive:1;[m
[31m-[m
[31m-    ngx_int_t                        index;[m
[31m-} ngx_http_geo_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_geo_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr);[m
[31m-static ngx_int_t ngx_http_geo_real_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr);[m
[31m-static char *ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);[m
[31m-static char *ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value);[m
[31m-static char *ngx_http_geo_add_range(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end);[m
[31m-static ngx_uint_t ngx_http_geo_delete_range(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end);[m
[31m-static char *ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value);[m
[31m-static char *ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net);[m
[31m-static ngx_http_variable_value_t *ngx_http_geo_value(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *value);[m
[31m-static char *ngx_http_geo_add_proxy(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, ngx_cidr_t *cidr);[m
[31m-static ngx_int_t ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net,[m
[31m-    ngx_cidr_t *cidr);[m
[31m-static char *ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_geo_include_binary_base(ngx_conf_t *cf,[m
[31m-    ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *name);[m
[31m-static void ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx);[m
[31m-static u_char *ngx_http_geo_copy_values(u_char *base, u_char *p,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_geo_commands[] = {[m
[31m-[m
[31m-    { ngx_string("geo"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,[m
[31m-      ngx_http_geo_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_geo_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_geo_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_geo_module_ctx,              /* module context */[m
[31m-    ngx_http_geo_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    GEORNG[6];[m
[31m-    u_char    version;[m
[31m-    u_char    ptr_size;[m
[31m-    uint32_t  endianness;[m
[31m-    uint32_t  crc32;[m
[31m-} ngx_http_geo_header_t;[m
[31m-[m
[31m-[m
[31m-static ngx_http_geo_header_t  ngx_http_geo_header = {[m
[31m-    { 'G', 'E', 'O', 'R', 'N', 'G' }, 0, sizeof(void *), 0x12345678, 0[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* geo range is AF_INET only */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_cidr_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data;[m
[31m-[m
[31m-    in_addr_t                   inaddr;[m
[31m-    ngx_addr_t                  addr;[m
[31m-    struct sockaddr_in         *sin;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                     *p;[m
[31m-    struct in6_addr            *inaddr6;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_geo_addr(r, ctx, &addr) != NGX_OK) {[m
[31m-        vv = (ngx_http_variable_value_t *)[m
[31m-                  ngx_radix32tree_find(ctx->u.trees.tree, INADDR_NONE);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    switch (addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;[m
[31m-        p = inaddr6->s6_addr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-            inaddr = p[12] << 24;[m
[31m-            inaddr += p[13] << 16;[m
[31m-            inaddr += p[14] << 8;[m
[31m-            inaddr += p[15];[m
[31m-[m
[31m-            vv = (ngx_http_variable_value_t *)[m
[31m-                      ngx_radix32tree_find(ctx->u.trees.tree, inaddr);[m
[31m-[m
[31m-        } else {[m
[31m-            vv = (ngx_http_variable_value_t *)[m
[31m-                      ngx_radix128tree_find(ctx->u.trees.tree6, p);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) addr.sockaddr;[m
[31m-        inaddr = ntohl(sin->sin_addr.s_addr);[m
[31m-[m
[31m-        vv = (ngx_http_variable_value_t *)[m
[31m-                  ngx_radix32tree_find(ctx->u.trees.tree, inaddr);[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    *v = *vv;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http geo: %v", v);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_range_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data;[m
[31m-[m
[31m-    in_addr_t              inaddr;[m
[31m-    ngx_addr_t             addr;[m
[31m-    ngx_uint_t             n;[m
[31m-    struct sockaddr_in    *sin;[m
[31m-    ngx_http_geo_range_t  *range;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                *p;[m
[31m-    struct in6_addr       *inaddr6;[m
[31m-#endif[m
[31m-[m
[31m-    *v = *ctx->u.high.default_value;[m
[31m-[m
[31m-    if (ngx_http_geo_addr(r, ctx, &addr) == NGX_OK) {[m
[31m-[m
[31m-        switch (addr.sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;[m
[31m-[m
[31m-            if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-                p = inaddr6->s6_addr;[m
[31m-[m
[31m-                inaddr = p[12] << 24;[m
[31m-                inaddr += p[13] << 16;[m
[31m-                inaddr += p[14] << 8;[m
[31m-                inaddr += p[15];[m
[31m-[m
[31m-            } else {[m
[31m-                inaddr = INADDR_NONE;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) addr.sockaddr;[m
[31m-            inaddr = ntohl(sin->sin_addr.s_addr);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        inaddr = INADDR_NONE;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->u.high.low) {[m
[31m-        range = ctx->u.high.low[inaddr >> 16];[m
[31m-[m
[31m-        if (range) {[m
[31m-            n = inaddr & 0xffff;[m
[31m-            do {[m
[31m-                if (n >= (ngx_uint_t) range->start[m
[31m-                    && n <= (ngx_uint_t) range->end)[m
[31m-                {[m
[31m-                    *v = *range->value;[m
[31m-                    break;[m
[31m-                }[m
[31m-            } while ((++range)->value);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http geo: %v", v);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx,[m
[31m-    ngx_addr_t *addr)[m
[31m-{[m
[31m-    ngx_array_t  *xfwd;[m
[31m-[m
[31m-    if (ngx_http_geo_real_addr(r, ctx, addr) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    xfwd = &r->headers_in.x_forwarded_for;[m
[31m-[m
[31m-    if (xfwd->nelts > 0 && ctx->proxies != NULL) {[m
[31m-        (void) ngx_http_get_forwarded_addr(r, addr, xfwd, NULL,[m
[31m-                                           ctx->proxies, ctx->proxy_recursive);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_real_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx,[m
[31m-    ngx_addr_t *addr)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *v;[m
[31m-[m
[31m-    if (ctx->index == -1) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http geo started: %V", &r->connection->addr_text);[m
[31m-[m
[31m-        addr->sockaddr = r->connection->sockaddr;[m
[31m-        addr->socklen = r->connection->socklen;[m
[31m-        /* addr->name = r->connection->addr_text; */[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v = ngx_http_get_flushed_variable(r, ctx->index);[m
[31m-[m
[31m-    if (v == NULL || v->not_found) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http geo not found");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http geo started: %v", v);[m
[31m-[m
[31m-    if (ngx_parse_addr(r->pool, addr, v->data, v->len) == NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                     *rv;[m
[31m-    size_t                    len;[m
[31m-    ngx_str_t                *value, name;[m
[31m-    ngx_uint_t                i;[m
[31m-    ngx_conf_t                save;[m
[31m-    ngx_pool_t               *pool;[m
[31m-    ngx_array_t              *a;[m
[31m-    ngx_http_variable_t      *var;[m
[31m-    ngx_http_geo_ctx_t       *geo;[m
[31m-    ngx_http_geo_conf_ctx_t   ctx;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    static struct in6_addr    zero;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    geo = ngx_palloc(cf->pool, sizeof(ngx_http_geo_ctx_t));[m
[31m-    if (geo == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name = value[1];[m
[31m-[m
[31m-    if (name.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name.len--;[m
[31m-    name.data++;[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-[m
[31m-        geo->index = ngx_http_get_variable_index(cf, &name);[m
[31m-        if (geo->index == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name = value[2];[m
[31m-[m
[31m-        if (name.data[0] != '$') {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid variable name \"%V\"", &name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name.len--;[m
[31m-        name.data++;[m
[31m-[m
[31m-    } else {[m
[31m-        geo->index = -1;[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ctx, sizeof(ngx_http_geo_conf_ctx_t));[m
[31m-[m
[31m-    ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);[m
[31m-    if (ctx.temp_pool == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(&ctx.rbtree, &ctx.sentinel, ngx_str_rbtree_insert_value);[m
[31m-[m
[31m-    ctx.pool = cf->pool;[m
[31m-    ctx.data_size = sizeof(ngx_http_geo_header_t)[m
[31m-                  + sizeof(ngx_http_variable_value_t)[m
[31m-                  + 0x10000 * sizeof(ngx_http_geo_range_t *);[m
[31m-    ctx.allow_binary_include = 1;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->pool = pool;[m
[31m-    cf->ctx = &ctx;[m
[31m-    cf->handler = ngx_http_geo;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    geo->proxies = ctx.proxies;[m
[31m-    geo->proxy_recursive = ctx.proxy_recursive;[m
[31m-[m
[31m-    if (ctx.ranges) {[m
[31m-[m
[31m-        if (ctx.high.low && !ctx.binary_include) {[m
[31m-            for (i = 0; i < 0x10000; i++) {[m
[31m-                a = (ngx_array_t *) ctx.high.low[i];[m
[31m-[m
[31m-                if (a == NULL || a->nelts == 0) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                len = a->nelts * sizeof(ngx_http_geo_range_t);[m
[31m-[m
[31m-                ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *));[m
[31m-                if (ctx.high.low[i] == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(ctx.high.low[i], a->elts, len);[m
[31m-                ctx.high.low[i][a->nelts].value = NULL;[m
[31m-                ctx.data_size += len + sizeof(void *);[m
[31m-            }[m
[31m-[m
[31m-            if (ctx.allow_binary_include[m
[31m-                && !ctx.outside_entries[m
[31m-                && ctx.entries > 100000[m
[31m-                && ctx.includes == 1)[m
[31m-            {[m
[31m-                ngx_http_geo_create_binary_base(&ctx);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ctx.high.default_value == NULL) {[m
[31m-            ctx.high.default_value = &ngx_http_variable_null_value;[m
[31m-        }[m
[31m-[m
[31m-        geo->u.high = ctx.high;[m
[31m-[m
[31m-        var->get_handler = ngx_http_geo_range_variable;[m
[31m-        var->data = (uintptr_t) geo;[m
[31m-[m
[31m-        ngx_destroy_pool(ctx.temp_pool);[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-    } else {[m
[31m-        if (ctx.tree == NULL) {[m
[31m-            ctx.tree = ngx_radix_tree_create(cf->pool, -1);[m
[31m-            if (ctx.tree == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        geo->u.trees.tree = ctx.tree;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (ctx.tree6 == NULL) {[m
[31m-            ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);[m
[31m-            if (ctx.tree6 == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        geo->u.trees.tree6 = ctx.tree6;[m
[31m-#endif[m
[31m-[m
[31m-        var->get_handler = ngx_http_geo_cidr_variable;[m
[31m-        var->data = (uintptr_t) geo;[m
[31m-[m
[31m-        ngx_destroy_pool(ctx.temp_pool);[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-        if (ngx_radix32tree_insert(ctx.tree, 0, 0,[m
[31m-                                   (uintptr_t) &ngx_http_variable_null_value)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_BUSY is okay (default was set explicitly) */[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (ngx_radix128tree_insert(ctx.tree6, zero.s6_addr, zero.s6_addr,[m
[31m-                                    (uintptr_t) &ngx_http_variable_null_value)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    char                     *rv;[m
[31m-    ngx_str_t                *value;[m
[31m-    ngx_cidr_t                cidr;[m
[31m-    ngx_http_geo_conf_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = cf->ctx;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 1) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[0].data, "ranges") == 0) {[m
[31m-[m
[31m-            if (ctx->tree[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-                || ctx->tree6[m
[31m-#endif[m
[31m-               )[m
[31m-            {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"ranges\" directive must be "[m
[31m-                                   "the first directive inside \"geo\" block");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            ctx->ranges = 1;[m
[31m-[m
[31m-            rv = NGX_CONF_OK;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        else if (ngx_strcmp(value[0].data, "proxy_recursive") == 0) {[m
[31m-            ctx->proxy_recursive = 1;[m
[31m-            rv = NGX_CONF_OK;[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts != 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number of the geo parameters");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "include") == 0) {[m
[31m-[m
[31m-        rv = ngx_http_geo_include(cf, ctx, &value[1]);[m
[31m-[m
[31m-        goto done;[m
[31m-[m
[31m-    } else if (ngx_strcmp(value[0].data, "proxy") == 0) {[m
[31m-[m
[31m-        if (ngx_http_geo_cidr_value(cf, &value[1], &cidr) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        rv = ngx_http_geo_add_proxy(cf, ctx, &cidr);[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ranges) {[m
[31m-        rv = ngx_http_geo_range(cf, ctx, value);[m
[31m-[m
[31m-    } else {[m
[31m-        rv = ngx_http_geo_cidr(cf, ctx, value);[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_reset_pool(cf->pool);[m
[31m-[m
[31m-    return rv;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_reset_pool(cf->pool);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    u_char      *p, *last;[m
[31m-    in_addr_t    start, end;[m
[31m-    ngx_str_t   *net;[m
[31m-    ngx_uint_t   del;[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "default") == 0) {[m
[31m-[m
[31m-        if (ctx->high.default_value) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                "duplicate default geo range value: \"%V\", old value: \"%v\"",[m
[31m-                &value[1], ctx->high.default_value);[m
[31m-        }[m
[31m-[m
[31m-        ctx->high.default_value = ngx_http_geo_value(cf, ctx, &value[1]);[m
[31m-        if (ctx->high.default_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->binary_include) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "binary geo range base \"%s\" cannot be mixed with usual entries",[m
[31m-            ctx->include_name.data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->high.low == NULL) {[m
[31m-        ctx->high.low = ngx_pcalloc(ctx->pool,[m
[31m-                                    0x10000 * sizeof(ngx_http_geo_range_t *));[m
[31m-        if (ctx->high.low == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->entries++;[m
[31m-    ctx->outside_entries = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "delete") == 0) {[m
[31m-        net = &value[1];[m
[31m-        del = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        net = &value[0];[m
[31m-        del = 0;[m
[31m-    }[m
[31m-[m
[31m-    last = net->data + net->len;[m
[31m-[m
[31m-    p = ngx_strlchr(net->data, last, '-');[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    start = ngx_inet_addr(net->data, p - net->data);[m
[31m-[m
[31m-    if (start == INADDR_NONE) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    start = ntohl(start);[m
[31m-[m
[31m-    p++;[m
[31m-[m
[31m-    end = ngx_inet_addr(p, last - p);[m
[31m-[m
[31m-    if (end == INADDR_NONE) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    end = ntohl(end);[m
[31m-[m
[31m-    if (start > end) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (del) {[m
[31m-        if (ngx_http_geo_delete_range(cf, ctx, start, end)) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "no address range \"%V\" to delete", net);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->value = ngx_http_geo_value(cf, ctx, &value[1]);[m
[31m-[m
[31m-    if (ctx->value == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->net = net;[m
[31m-[m
[31m-    return ngx_http_geo_add_range(cf, ctx, start, end);[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid range \"%V\"", net);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* the add procedure is optimized to add a growing up sequence */[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_add_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    in_addr_t start, in_addr_t end)[m
[31m-{[m
[31m-    in_addr_t              n;[m
[31m-    ngx_uint_t             h, i, s, e;[m
[31m-    ngx_array_t           *a;[m
[31m-    ngx_http_geo_range_t  *range;[m
[31m-[m
[31m-    for (n = start; n <= end; n = (n + 0x10000) & 0xffff0000) {[m
[31m-[m
[31m-        h = n >> 16;[m
[31m-[m
[31m-        if (n == start) {[m
[31m-            s = n & 0xffff;[m
[31m-        } else {[m
[31m-            s = 0;[m
[31m-        }[m
[31m-[m
[31m-        if ((n | 0xffff) > end) {[m
[31m-            e = end & 0xffff;[m
[31m-[m
[31m-        } else {[m
[31m-            e = 0xffff;[m
[31m-        }[m
[31m-[m
[31m-        a = (ngx_array_t *) ctx->high.low[h];[m
[31m-[m
[31m-        if (a == NULL) {[m
[31m-            a = ngx_array_create(ctx->temp_pool, 64,[m
[31m-                                 sizeof(ngx_http_geo_range_t));[m
[31m-            if (a == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->high.low[h] = (ngx_http_geo_range_t *) a;[m
[31m-        }[m
[31m-[m
[31m-        i = a->nelts;[m
[31m-        range = a->elts;[m
[31m-[m
[31m-        while (i) {[m
[31m-[m
[31m-            i--;[m
[31m-[m
[31m-            if (e < (ngx_uint_t) range[i].start) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (s > (ngx_uint_t) range[i].end) {[m
[31m-[m
[31m-                /* add after the range */[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = a->elts;[m
[31m-[m
[31m-                ngx_memmove(&range[i + 2], &range[i + 1],[m
[31m-                           (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                range[i + 1].start = (u_short) s;[m
[31m-                range[i + 1].end = (u_short) e;[m
[31m-                range[i + 1].value = ctx->value;[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (s == (ngx_uint_t) range[i].start[m
[31m-                && e == (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                    "duplicate range \"%V\", value: \"%v\", old value: \"%v\"",[m
[31m-                    ctx->net, ctx->value, range[i].value);[m
[31m-[m
[31m-                range[i].value = ctx->value;[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (s > (ngx_uint_t) range[i].start[m
[31m-                && e < (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                /* split the range and insert the new one */[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = a->elts;[m
[31m-[m
[31m-                ngx_memmove(&range[i + 3], &range[i + 1],[m
[31m-                           (a->nelts - 3 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                range[i + 2].start = (u_short) (e + 1);[m
[31m-                range[i + 2].end = range[i].end;[m
[31m-                range[i + 2].value = range[i].value;[m
[31m-[m
[31m-                range[i + 1].start = (u_short) s;[m
[31m-                range[i + 1].end = (u_short) e;[m
[31m-                range[i + 1].value = ctx->value;[m
[31m-[m
[31m-                range[i].end = (u_short) (s - 1);[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (s == (ngx_uint_t) range[i].start[m
[31m-                && e < (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                /* shift the range start and insert the new range */[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = a->elts;[m
[31m-[m
[31m-                ngx_memmove(&range[i + 1], &range[i],[m
[31m-                           (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                range[i + 1].start = (u_short) (e + 1);[m
[31m-[m
[31m-                range[i].start = (u_short) s;[m
[31m-                range[i].end = (u_short) e;[m
[31m-                range[i].value = ctx->value;[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            if (s > (ngx_uint_t) range[i].start[m
[31m-                && e == (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                /* shift the range end and insert the new range */[m
[31m-[m
[31m-                range = ngx_array_push(a);[m
[31m-                if (range == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                range = a->elts;[m
[31m-[m
[31m-                ngx_memmove(&range[i + 2], &range[i + 1],[m
[31m-                           (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                range[i + 1].start = (u_short) s;[m
[31m-                range[i + 1].end = (u_short) e;[m
[31m-                range[i + 1].value = ctx->value;[m
[31m-[m
[31m-                range[i].end = (u_short) (s - 1);[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            s = (ngx_uint_t) range[i].start;[m
[31m-            e = (ngx_uint_t) range[i].end;[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                         "range \"%V\" overlaps \"%d.%d.%d.%d-%d.%d.%d.%d\"",[m
[31m-                         ctx->net,[m
[31m-                         h >> 8, h & 0xff, s >> 8, s & 0xff,[m
[31m-                         h >> 8, h & 0xff, e >> 8, e & 0xff);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* add the first range */[m
[31m-[m
[31m-        range = ngx_array_push(a);[m
[31m-        if (range == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        range->start = (u_short) s;[m
[31m-        range->end = (u_short) e;[m
[31m-        range->value = ctx->value;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_geo_delete_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    in_addr_t start, in_addr_t end)[m
[31m-{[m
[31m-    in_addr_t              n;[m
[31m-    ngx_uint_t             h, i, s, e, warn;[m
[31m-    ngx_array_t           *a;[m
[31m-    ngx_http_geo_range_t  *range;[m
[31m-[m
[31m-    warn = 0;[m
[31m-[m
[31m-    for (n = start; n <= end; n += 0x10000) {[m
[31m-[m
[31m-        h = n >> 16;[m
[31m-[m
[31m-        if (n == start) {[m
[31m-            s = n & 0xffff;[m
[31m-        } else {[m
[31m-            s = 0;[m
[31m-        }[m
[31m-[m
[31m-        if ((n | 0xffff) > end) {[m
[31m-            e = end & 0xffff;[m
[31m-[m
[31m-        } else {[m
[31m-            e = 0xffff;[m
[31m-        }[m
[31m-[m
[31m-        a = (ngx_array_t *) ctx->high.low[h];[m
[31m-[m
[31m-        if (a == NULL) {[m
[31m-            warn = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        range = a->elts;[m
[31m-        for (i = 0; i < a->nelts; i++) {[m
[31m-[m
[31m-            if (s == (ngx_uint_t) range[i].start[m
[31m-                && e == (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                ngx_memmove(&range[i], &range[i + 1],[m
[31m-                           (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t));[m
[31m-[m
[31m-                a->nelts--;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (s != (ngx_uint_t) range[i].start[m
[31m-                && e != (ngx_uint_t) range[i].end)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            warn = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return warn;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_int_t    rc, del;[m
[31m-    ngx_str_t   *net;[m
[31m-    ngx_cidr_t   cidr;[m
[31m-[m
[31m-    if (ctx->tree == NULL) {[m
[31m-        ctx->tree = ngx_radix_tree_create(ctx->pool, -1);[m
[31m-        if (ctx->tree == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (ctx->tree6 == NULL) {[m
[31m-        ctx->tree6 = ngx_radix_tree_create(ctx->pool, -1);[m
[31m-        if (ctx->tree6 == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "default") == 0) {[m
[31m-        cidr.family = AF_INET;[m
[31m-        cidr.u.in.addr = 0;[m
[31m-        cidr.u.in.mask = 0;[m
[31m-[m
[31m-        rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]);[m
[31m-[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        cidr.family = AF_INET6;[m
[31m-        ngx_memzero(&cidr.u.in6, sizeof(ngx_in6_cidr_t));[m
[31m-[m
[31m-        rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]);[m
[31m-[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "delete") == 0) {[m
[31m-        net = &value[1];[m
[31m-        del = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        net = &value[0];[m
[31m-        del = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_geo_cidr_value(cf, net, &cidr) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cidr.family == AF_INET) {[m
[31m-        cidr.u.in.addr = ntohl(cidr.u.in.addr);[m
[31m-        cidr.u.in.mask = ntohl(cidr.u.in.mask);[m
[31m-    }[m
[31m-[m
[31m-    if (del) {[m
[31m-        switch (cidr.family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            rc = ngx_radix128tree_delete(ctx->tree6,[m
[31m-                                         cidr.u.in6.addr.s6_addr,[m
[31m-                                         cidr.u.in6.mask.s6_addr);[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            rc = ngx_radix32tree_delete(ctx->tree, cidr.u.in.addr,[m
[31m-                                        cidr.u.in.mask);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "no network \"%V\" to delete", net);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], net);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_variable_value_t  *val, *old;[m
[31m-[m
[31m-    val = ngx_http_geo_value(cf, ctx, value);[m
[31m-[m
[31m-    if (val == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (cidr->family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr,[m
[31m-                                     cidr->u.in6.mask.s6_addr,[m
[31m-                                     (uintptr_t) val);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_BUSY */[m
[31m-[m
[31m-        old = (ngx_http_variable_value_t *)[m
[31m-                   ngx_radix128tree_find(ctx->tree6,[m
[31m-                                         cidr->u.in6.addr.s6_addr);[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-              "duplicate network \"%V\", value: \"%v\", old value: \"%v\"",[m
[31m-              net, val, old);[m
[31m-[m
[31m-        rc = ngx_radix128tree_delete(ctx->tree6,[m
[31m-                                     cidr->u.in6.addr.s6_addr,[m
[31m-                                     cidr->u.in6.mask.s6_addr);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr,[m
[31m-                                     cidr->u.in6.mask.s6_addr,[m
[31m-                                     (uintptr_t) val);[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr,[m
[31m-                                    cidr->u.in.mask, (uintptr_t) val);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_BUSY */[m
[31m-[m
[31m-        old = (ngx_http_variable_value_t *)[m
[31m-                   ngx_radix32tree_find(ctx->tree, cidr->u.in.addr);[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-              "duplicate network \"%V\", value: \"%v\", old value: \"%v\"",[m
[31m-              net, val, old);[m
[31m-[m
[31m-        rc = ngx_radix32tree_delete(ctx->tree,[m
[31m-                                    cidr->u.in.addr, cidr->u.in.mask);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr,[m
[31m-                                    cidr->u.in.mask, (uintptr_t) val);[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_value_t *[m
[31m-ngx_http_geo_value(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    uint32_t                             hash;[m
[31m-    ngx_http_variable_value_t           *val;[m
[31m-    ngx_http_geo_variable_value_node_t  *gvvn;[m
[31m-[m
[31m-    hash = ngx_crc32_long(value->data, value->len);[m
[31m-[m
[31m-    gvvn = (ngx_http_geo_variable_value_node_t *)[m
[31m-               ngx_str_rbtree_lookup(&ctx->rbtree, value, hash);[m
[31m-[m
[31m-    if (gvvn) {[m
[31m-        return gvvn->value;[m
[31m-    }[m
[31m-[m
[31m-    val = ngx_palloc(ctx->pool, sizeof(ngx_http_variable_value_t));[m
[31m-    if (val == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    val->len = value->len;[m
[31m-    val->data = ngx_pstrdup(ctx->pool, value);[m
[31m-    if (val->data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    val->valid = 1;[m
[31m-    val->no_cacheable = 0;[m
[31m-    val->not_found = 0;[m
[31m-[m
[31m-    gvvn = ngx_palloc(ctx->temp_pool,[m
[31m-                      sizeof(ngx_http_geo_variable_value_node_t));[m
[31m-    if (gvvn == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    gvvn->sn.node.key = hash;[m
[31m-    gvvn->sn.str.len = val->len;[m
[31m-    gvvn->sn.str.data = val->data;[m
[31m-    gvvn->value = val;[m
[31m-    gvvn->offset = 0;[m
[31m-[m
[31m-    ngx_rbtree_insert(&ctx->rbtree, &gvvn->sn.node);[m
[31m-[m
[31m-    ctx->data_size += ngx_align(sizeof(ngx_http_variable_value_t) + value->len,[m
[31m-                                sizeof(void *));[m
[31m-[m
[31m-    return val;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_add_proxy(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_cidr_t *cidr)[m
[31m-{[m
[31m-    ngx_cidr_t  *c;[m
[31m-[m
[31m-    if (ctx->proxies == NULL) {[m
[31m-        ctx->proxies = ngx_array_create(ctx->pool, 4, sizeof(ngx_cidr_t));[m
[31m-        if (ctx->proxies == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_array_push(ctx->proxies);[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *c = *cidr;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (ngx_strcmp(net->data, "255.255.255.255") == 0) {[m
[31m-        cidr->family = AF_INET;[m
[31m-        cidr->u.in.addr = 0xffffffff;[m
[31m-        cidr->u.in.mask = 0xffffffff;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_ptocidr(net, cidr);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "low address bits of %V are meaningless", net);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    char       *rv;[m
[31m-    ngx_str_t   file;[m
[31m-[m
[31m-    file.len = name->len + 4;[m
[31m-    file.data = ngx_pnalloc(ctx->temp_pool, name->len + 5);[m
[31m-    if (file.data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(file.data, "%V.bin%Z", name);[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ranges) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-        switch (ngx_http_geo_include_binary_base(cf, ctx, &file)) {[m
[31m-        case NGX_OK:[m
[31m-            return NGX_CONF_OK;[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        default:[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    file.len -= 4;[m
[31m-    file.data[file.len] = '\0';[m
[31m-[m
[31m-    ctx->include_name = file;[m
[31m-[m
[31m-    if (ctx->outside_entries) {[m
[31m-        ctx->allow_binary_include = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, &file);[m
[31m-[m
[31m-    ctx->includes++;[m
[31m-    ctx->outside_entries = 0;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geo_include_binary_base(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    u_char                     *base, ch;[m
[31m-    time_t                      mtime;[m
[31m-    size_t                      size, len;[m
[31m-    ssize_t                     n;[m
[31m-    uint32_t                    crc32;[m
[31m-    ngx_err_t                   err;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_file_t                  file;[m
[31m-    ngx_file_info_t             fi;[m
[31m-    ngx_http_geo_range_t       *range, **ranges;[m
[31m-    ngx_http_geo_header_t      *header;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-    file.name = *name;[m
[31m-    file.log = cf->log;[m
[31m-[m
[31m-    file.fd = ngx_open_file(name->data, NGX_FILE_RDONLY, 0, 0);[m
[31m-    if (file.fd == NGX_INVALID_FILE) {[m
[31m-        err = ngx_errno;[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-            ngx_conf_log_error(NGX_LOG_CRIT, cf, err,[m
[31m-                               ngx_open_file_n " \"%s\" failed", name->data);[m
[31m-        }[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->outside_entries) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "binary geo range base \"%s\" cannot be mixed with usual entries",[m
[31m-            name->data);[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->binary_include) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "second binary geo range base \"%s\" cannot be mixed with \"%s\"",[m
[31m-            name->data, ctx->include_name.data);[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                           ngx_fd_info_n " \"%s\" failed", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    size = (size_t) ngx_file_size(&fi);[m
[31m-    mtime = ngx_file_mtime(&fi);[m
[31m-[m
[31m-    ch = name->data[name->len - 4];[m
[31m-    name->data[name->len - 4] = '\0';[m
[31m-[m
[31m-    if (ngx_file_info(name->data, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                           ngx_file_info_n " \"%s\" failed", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    name->data[name->len - 4] = ch;[m
[31m-[m
[31m-    if (mtime < ngx_file_mtime(&fi)) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "stale binary geo range base \"%s\"", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    base = ngx_palloc(ctx->pool, size);[m
[31m-    if (base == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_file(&file, base, size, 0);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,[m
[31m-                           ngx_read_file_n " \"%s\" failed", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_CRIT, cf, 0,[m
[31m-            ngx_read_file_n " \"%s\" returned only %z bytes instead of %z",[m
[31m-            name->data, n, size);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    header = (ngx_http_geo_header_t *) base;[m
[31m-[m
[31m-    if (size < 16 || ngx_memcmp(&ngx_http_geo_header, header, 12) != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-             "incompatible binary geo range base \"%s\"", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_crc32_init(crc32);[m
[31m-[m
[31m-    vv = (ngx_http_variable_value_t *) (base + sizeof(ngx_http_geo_header_t));[m
[31m-[m
[31m-    while (vv->data) {[m
[31m-        len = ngx_align(sizeof(ngx_http_variable_value_t) + vv->len,[m
[31m-                        sizeof(void *));[m
[31m-        ngx_crc32_update(&crc32, (u_char *) vv, len);[m
[31m-        vv->data += (size_t) base;[m
[31m-        vv = (ngx_http_variable_value_t *) ((u_char *) vv + len);[m
[31m-    }[m
[31m-    ngx_crc32_update(&crc32, (u_char *) vv, sizeof(ngx_http_variable_value_t));[m
[31m-    vv++;[m
[31m-[m
[31m-    ranges = (ngx_http_geo_range_t **) vv;[m
[31m-[m
[31m-    for (i = 0; i < 0x10000; i++) {[m
[31m-        ngx_crc32_update(&crc32, (u_char *) &ranges[i], sizeof(void *));[m
[31m-        if (ranges[i]) {[m
[31m-            ranges[i] = (ngx_http_geo_range_t *)[m
[31m-                            ((u_char *) ranges[i] + (size_t) base);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    range = (ngx_http_geo_range_t *) &ranges[0x10000];[m
[31m-[m
[31m-    while ((u_char *) range < base + size) {[m
[31m-        while (range->value) {[m
[31m-            ngx_crc32_update(&crc32, (u_char *) range,[m
[31m-                             sizeof(ngx_http_geo_range_t));[m
[31m-            range->value = (ngx_http_variable_value_t *)[m
[31m-                               ((u_char *) range->value + (size_t) base);[m
[31m-            range++;[m
[31m-        }[m
[31m-        ngx_crc32_update(&crc32, (u_char *) range, sizeof(void *));[m
[31m-        range = (ngx_http_geo_range_t *) ((u_char *) range + sizeof(void *));[m
[31m-    }[m
[31m-[m
[31m-    ngx_crc32_final(crc32);[m
[31m-[m
[31m-    if (crc32 != header->crc32) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                  "CRC32 mismatch in binary geo range base \"%s\"", name->data);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_NOTICE, cf, 0,[m
[31m-                       "using binary geo range base \"%s\"", name->data);[m
[31m-[m
[31m-    ctx->include_name = *name;[m
[31m-    ctx->binary_include = 1;[m
[31m-    ctx->high.low = ranges;[m
[31m-    rc = NGX_OK;[m
[31m-[m
[31m-    goto done;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", name->data);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char                              *p;[m
[31m-    uint32_t                             hash;[m
[31m-    ngx_str_t                            s;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_file_mapping_t                   fm;[m
[31m-    ngx_http_geo_range_t                *r, *range, **ranges;[m
[31m-    ngx_http_geo_header_t               *header;[m
[31m-    ngx_http_geo_variable_value_node_t  *gvvn;[m
[31m-[m
[31m-    fm.name = ngx_pnalloc(ctx->temp_pool, ctx->include_name.len + 5);[m
[31m-    if (fm.name == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(fm.name, "%V.bin%Z", &ctx->include_name);[m
[31m-[m
[31m-    fm.size = ctx->data_size;[m
[31m-    fm.log = ctx->pool->log;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, fm.log, 0,[m
[31m-                  "creating binary geo range base \"%s\"", fm.name);[m
[31m-[m
[31m-    if (ngx_create_file_mapping(&fm) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(fm.addr, &ngx_http_geo_header,[m
[31m-                   sizeof(ngx_http_geo_header_t));[m
[31m-[m
[31m-    p = ngx_http_geo_copy_values(fm.addr, p, ctx->rbtree.root,[m
[31m-                                 ctx->rbtree.sentinel);[m
[31m-[m
[31m-    p += sizeof(ngx_http_variable_value_t);[m
[31m-[m
[31m-    ranges = (ngx_http_geo_range_t **) p;[m
[31m-[m
[31m-    p += 0x10000 * sizeof(ngx_http_geo_range_t *);[m
[31m-[m
[31m-    for (i = 0; i < 0x10000; i++) {[m
[31m-        r = ctx->high.low[i];[m
[31m-        if (r == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        range = (ngx_http_geo_range_t *) p;[m
[31m-        ranges[i] = (ngx_http_geo_range_t *) (p - (u_char *) fm.addr);[m
[31m-[m
[31m-        do {[m
[31m-            s.len = r->value->len;[m
[31m-            s.data = r->value->data;[m
[31m-            hash = ngx_crc32_long(s.data, s.len);[m
[31m-            gvvn = (ngx_http_geo_variable_value_node_t *)[m
[31m-                        ngx_str_rbtree_lookup(&ctx->rbtree, &s, hash);[m
[31m-[m
[31m-            range->value = (ngx_http_variable_value_t *) gvvn->offset;[m
[31m-            range->start = r->start;[m
[31m-            range->end = r->end;[m
[31m-            range++;[m
[31m-[m
[31m-        } while ((++r)->value);[m
[31m-[m
[31m-        range->value = NULL;[m
[31m-[m
[31m-        p = (u_char *) range + sizeof(void *);[m
[31m-    }[m
[31m-[m
[31m-    header = fm.addr;[m
[31m-    header->crc32 = ngx_crc32_long((u_char *) fm.addr[m
[31m-                                       + sizeof(ngx_http_geo_header_t),[m
[31m-                                   fm.size - sizeof(ngx_http_geo_header_t));[m
[31m-[m
[31m-    ngx_close_file_mapping(&fm);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_geo_copy_values(u_char *base, u_char *p, ngx_rbtree_node_t *node,[m
[31m-    ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_http_variable_value_t           *vv;[m
[31m-    ngx_http_geo_variable_value_node_t  *gvvn;[m
[31m-[m
[31m-    if (node == sentinel) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    gvvn = (ngx_http_geo_variable_value_node_t *) node;[m
[31m-    gvvn->offset = p - base;[m
[31m-[m
[31m-    vv = (ngx_http_variable_value_t *) p;[m
[31m-    *vv = *gvvn->value;[m
[31m-    p += sizeof(ngx_http_variable_value_t);[m
[31m-    vv->data = (u_char *) (p - base);[m
[31m-[m
[31m-    p = ngx_cpymem(p, gvvn->sn.str.data, gvvn->sn.str.len);[m
[31m-[m
[31m-    p = ngx_align_ptr(p, sizeof(void *));[m
[31m-[m
[31m-    p = ngx_http_geo_copy_values(base, p, node->left, sentinel);[m
[31m-[m
[31m-    return ngx_http_geo_copy_values(base, p, node->right, sentinel);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_geoip_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_geoip_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8e151aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_geoip_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,925 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <GeoIP.h>[m
[31m-#include <GeoIPCity.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_GEOIP_COUNTRY_CODE   0[m
[31m-#define NGX_GEOIP_COUNTRY_CODE3  1[m
[31m-#define NGX_GEOIP_COUNTRY_NAME   2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    GeoIP        *country;[m
[31m-    GeoIP        *org;[m
[31m-    GeoIP        *city;[m
[31m-    ngx_array_t  *proxies;    /* array of ngx_cidr_t */[m
[31m-    ngx_flag_t    proxy_recursive;[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    unsigned      country_v6:1;[m
[31m-    unsigned      org_v6:1;[m
[31m-    unsigned      city_v6:1;[m
[31m-#endif[m
[31m-} ngx_http_geoip_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t    *name;[m
[31m-    uintptr_t     data;[m
[31m-} ngx_http_geoip_var_t;[m
[31m-[m
[31m-[m
[31m-typedef const char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *,[m
[31m-    u_long addr);[m
[31m-[m
[31m-[m
[31m-ngx_http_geoip_variable_handler_pt ngx_http_geoip_country_functions[] = {[m
[31m-    GeoIP_country_code_by_ipnum,[m
[31m-    GeoIP_country_code3_by_ipnum,[m
[31m-    GeoIP_country_name_by_ipnum,[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-[m
[31m-typedef const char *(*ngx_http_geoip_variable_handler_v6_pt)(GeoIP *,[m
[31m-    geoipv6_t addr);[m
[31m-[m
[31m-[m
[31m-ngx_http_geoip_variable_handler_v6_pt ngx_http_geoip_country_v6_functions[] = {[m
[31m-    GeoIP_country_code_by_ipnum_v6,[m
[31m-    GeoIP_country_code3_by_ipnum_v6,[m
[31m-    GeoIP_country_name_by_ipnum_v6,[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_org_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_region_name_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_city_float_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_geoip_city_int_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf);[m
[31m-static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net,[m
[31m-    ngx_cidr_t *cidr);[m
[31m-static void ngx_http_geoip_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_geoip_commands[] = {[m
[31m-[m
[31m-    { ngx_string("geoip_country"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_geoip_country,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("geoip_org"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_geoip_org,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("geoip_city"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_geoip_city,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("geoip_proxy"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_geoip_proxy,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("geoip_proxy_recursive"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_geoip_conf_t, proxy_recursive),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_geoip_module_ctx = {[m
[31m-    ngx_http_geoip_add_variables,          /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_geoip_create_conf,            /* create main configuration */[m
[31m-    ngx_http_geoip_init_conf,              /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_geoip_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_geoip_module_ctx,            /* module context */[m
[31m-    ngx_http_geoip_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_geoip_vars[] = {[m
[31m-[m
[31m-    { ngx_string("geoip_country_code"), NULL,[m
[31m-      ngx_http_geoip_country_variable,[m
[31m-      NGX_GEOIP_COUNTRY_CODE, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_country_code3"), NULL,[m
[31m-      ngx_http_geoip_country_variable,[m
[31m-      NGX_GEOIP_COUNTRY_CODE3, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_country_name"), NULL,[m
[31m-      ngx_http_geoip_country_variable,[m
[31m-      NGX_GEOIP_COUNTRY_NAME, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_org"), NULL,[m
[31m-      ngx_http_geoip_org_variable,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city_continent_code"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, continent_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city_country_code"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, country_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city_country_code3"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, country_code3), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city_country_name"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, country_name), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_region"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, region), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_region_name"), NULL,[m
[31m-      ngx_http_geoip_region_name_variable,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_city"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, city), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_postal_code"), NULL,[m
[31m-      ngx_http_geoip_city_variable,[m
[31m-      offsetof(GeoIPRecord, postal_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_latitude"), NULL,[m
[31m-      ngx_http_geoip_city_float_variable,[m
[31m-      offsetof(GeoIPRecord, latitude), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_longitude"), NULL,[m
[31m-      ngx_http_geoip_city_float_variable,[m
[31m-      offsetof(GeoIPRecord, longitude), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_dma_code"), NULL,[m
[31m-      ngx_http_geoip_city_int_variable,[m
[31m-      offsetof(GeoIPRecord, dma_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("geoip_area_code"), NULL,[m
[31m-      ngx_http_geoip_city_int_variable,[m
[31m-      offsetof(GeoIPRecord, area_code), 0, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_long[m
[31m-ngx_http_geoip_addr(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf)[m
[31m-{[m
[31m-    ngx_addr_t           addr;[m
[31m-    ngx_array_t         *xfwd;[m
[31m-    struct sockaddr_in  *sin;[m
[31m-[m
[31m-    addr.sockaddr = r->connection->sockaddr;[m
[31m-    addr.socklen = r->connection->socklen;[m
[31m-    /* addr.name = r->connection->addr_text; */[m
[31m-[m
[31m-    xfwd = &r->headers_in.x_forwarded_for;[m
[31m-[m
[31m-    if (xfwd->nelts > 0 && gcf->proxies != NULL) {[m
[31m-        (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL,[m
[31m-                                           gcf->proxies, gcf->proxy_recursive);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    if (addr.sockaddr->sa_family == AF_INET6) {[m
[31m-        u_char           *p;[m
[31m-        in_addr_t         inaddr;[m
[31m-        struct in6_addr  *inaddr6;[m
[31m-[m
[31m-        inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-            p = inaddr6->s6_addr;[m
[31m-[m
[31m-            inaddr = p[12] << 24;[m
[31m-            inaddr += p[13] << 16;[m
[31m-            inaddr += p[14] << 8;[m
[31m-            inaddr += p[15];[m
[31m-[m
[31m-            return inaddr;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (addr.sockaddr->sa_family != AF_INET) {[m
[31m-        return INADDR_NONE;[m
[31m-    }[m
[31m-[m
[31m-    sin = (struct sockaddr_in *) addr.sockaddr;[m
[31m-    return ntohl(sin->sin_addr.s_addr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-[m
[31m-static geoipv6_t[m
[31m-ngx_http_geoip_addr_v6(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf)[m
[31m-{[m
[31m-    ngx_addr_t            addr;[m
[31m-    ngx_array_t          *xfwd;[m
[31m-    in_addr_t             addr4;[m
[31m-    struct in6_addr       addr6;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-[m
[31m-    addr.sockaddr = r->connection->sockaddr;[m
[31m-    addr.socklen = r->connection->socklen;[m
[31m-    /* addr.name = r->connection->addr_text; */[m
[31m-[m
[31m-    xfwd = &r->headers_in.x_forwarded_for;[m
[31m-[m
[31m-    if (xfwd->nelts > 0 && gcf->proxies != NULL) {[m
[31m-        (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL,[m
[31m-                                           gcf->proxies, gcf->proxy_recursive);[m
[31m-    }[m
[31m-[m
[31m-    switch (addr.sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        /* Produce IPv4-mapped IPv6 address. */[m
[31m-        sin = (struct sockaddr_in *) addr.sockaddr;[m
[31m-        addr4 = ntohl(sin->sin_addr.s_addr);[m
[31m-[m
[31m-        ngx_memzero(&addr6, sizeof(struct in6_addr));[m
[31m-        addr6.s6_addr[10] = 0xff;[m
[31m-        addr6.s6_addr[11] = 0xff;[m
[31m-        addr6.s6_addr[12] = addr4 >> 24;[m
[31m-        addr6.s6_addr[13] = addr4 >> 16;[m
[31m-        addr6.s6_addr[14] = addr4 >> 8;[m
[31m-        addr6.s6_addr[15] = addr4;[m
[31m-        return addr6;[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) addr.sockaddr;[m
[31m-        return sin6->sin6_addr;[m
[31m-[m
[31m-    default:[m
[31m-        return in6addr_any;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_country_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_geoip_variable_handler_pt     handler =[m
[31m-        ngx_http_geoip_country_functions[data];[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    ngx_http_geoip_variable_handler_v6_pt  handler_v6 =[m
[31m-        ngx_http_geoip_country_v6_functions[data];[m
[31m-#endif[m
[31m-[m
[31m-    const char             *val;[m
[31m-    ngx_http_geoip_conf_t  *gcf;[m
[31m-[m
[31m-    gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);[m
[31m-[m
[31m-    if (gcf->country == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    val = gcf->country_v6[m
[31m-              ? handler_v6(gcf->country, ngx_http_geoip_addr_v6(r, gcf))[m
[31m-              : handler(gcf->country, ngx_http_geoip_addr(r, gcf));[m
[31m-#else[m
[31m-    val = handler(gcf->country, ngx_http_geoip_addr(r, gcf));[m
[31m-#endif[m
[31m-[m
[31m-    if (val == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_strlen(val);[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) val;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_org_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t                  len;[m
[31m-    char                   *val;[m
[31m-    ngx_http_geoip_conf_t  *gcf;[m
[31m-[m
[31m-    gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);[m
[31m-[m
[31m-    if (gcf->org == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    val = gcf->org_v6[m
[31m-              ? GeoIP_name_by_ipnum_v6(gcf->org,[m
[31m-                                       ngx_http_geoip_addr_v6(r, gcf))[m
[31m-              : GeoIP_name_by_ipnum(gcf->org,[m
[31m-                                    ngx_http_geoip_addr(r, gcf));[m
[31m-#else[m
[31m-    val = GeoIP_name_by_ipnum(gcf->org, ngx_http_geoip_addr(r, gcf));[m
[31m-#endif[m
[31m-[m
[31m-    if (val == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(val);[m
[31m-    v->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (v->data == NULL) {[m
[31m-        ngx_free(val);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(v->data, val, len);[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ngx_free(val);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_city_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    char         *val;[m
[31m-    size_t        len;[m
[31m-    GeoIPRecord  *gr;[m
[31m-[m
[31m-    gr = ngx_http_geoip_get_city_record(r);[m
[31m-    if (gr == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    val = *(char **) ((char *) gr + data);[m
[31m-    if (val == NULL) {[m
[31m-        goto no_value;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(val);[m
[31m-    v->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (v->data == NULL) {[m
[31m-        GeoIPRecord_delete(gr);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(v->data, val, len);[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-no_value:[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_region_name_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t        len;[m
[31m-    const char   *val;[m
[31m-    GeoIPRecord  *gr;[m
[31m-[m
[31m-    gr = ngx_http_geoip_get_city_record(r);[m
[31m-    if (gr == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    val = GeoIP_region_name_by_code(gr->country_code, gr->region);[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-    if (val == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(val);[m
[31m-    v->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(v->data, val, len);[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_city_float_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    float         val;[m
[31m-    GeoIPRecord  *gr;[m
[31m-[m
[31m-    gr = ngx_http_geoip_get_city_record(r);[m
[31m-    if (gr == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN + 5);[m
[31m-    if (v->data == NULL) {[m
[31m-        GeoIPRecord_delete(gr);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    val = *(float *) ((char *) gr + data);[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%.4f", val) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_city_int_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    int           val;[m
[31m-    GeoIPRecord  *gr;[m
[31m-[m
[31m-    gr = ngx_http_geoip_get_city_record(r);[m
[31m-    if (gr == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        GeoIPRecord_delete(gr);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    val = *(int *) ((char *) gr + data);[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%d", val) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    GeoIPRecord_delete(gr);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static GeoIPRecord *[m
[31m-ngx_http_geoip_get_city_record(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf;[m
[31m-[m
[31m-    gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);[m
[31m-[m
[31m-    if (gcf->city) {[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-        return gcf->city_v6[m
[31m-                   ? GeoIP_record_by_ipnum_v6(gcf->city,[m
[31m-                                              ngx_http_geoip_addr_v6(r, gcf))[m
[31m-                   : GeoIP_record_by_ipnum(gcf->city,[m
[31m-                                           ngx_http_geoip_addr(r, gcf));[m
[31m-#else[m
[31m-        return GeoIP_record_by_ipnum(gcf->city, ngx_http_geoip_addr(r, gcf));[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_geoip_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_geoip_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_http_geoip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->proxy_recursive = NGX_CONF_UNSET;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_geoip_cleanup;[m
[31m-    cln->data = conf;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_value(gcf->proxy_recursive, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (gcf->country) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    gcf->country = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);[m
[31m-[m
[31m-    if (gcf->country == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "GeoIP_open(\"%V\") failed", &value[1]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        if (ngx_strcmp(value[2].data, "utf8") == 0) {[m
[31m-            GeoIP_set_charset(gcf->country, GEOIP_CHARSET_UTF8);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (gcf->country->databaseType) {[m
[31m-[m
[31m-    case GEOIP_COUNTRY_EDITION:[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    case GEOIP_COUNTRY_EDITION_V6:[m
[31m-[m
[31m-        gcf->country_v6 = 1;[m
[31m-        return NGX_CONF_OK;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid GeoIP database \"%V\" type:%d",[m
[31m-                           &value[1], gcf->country->databaseType);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (gcf->org) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    gcf->org = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);[m
[31m-[m
[31m-    if (gcf->org == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "GeoIP_open(\"%V\") failed", &value[1]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        if (ngx_strcmp(value[2].data, "utf8") == 0) {[m
[31m-            GeoIP_set_charset(gcf->org, GEOIP_CHARSET_UTF8);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (gcf->org->databaseType) {[m
[31m-[m
[31m-    case GEOIP_ISP_EDITION:[m
[31m-    case GEOIP_ORG_EDITION:[m
[31m-    case GEOIP_DOMAIN_EDITION:[m
[31m-    case GEOIP_ASNUM_EDITION:[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    case GEOIP_ISP_EDITION_V6:[m
[31m-    case GEOIP_ORG_EDITION_V6:[m
[31m-    case GEOIP_DOMAIN_EDITION_V6:[m
[31m-    case GEOIP_ASNUM_EDITION_V6:[m
[31m-[m
[31m-        gcf->org_v6 = 1;[m
[31m-        return NGX_CONF_OK;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid GeoIP database \"%V\" type:%d",[m
[31m-                           &value[1], gcf->org->databaseType);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (gcf->city) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    gcf->city = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);[m
[31m-[m
[31m-    if (gcf->city == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "GeoIP_open(\"%V\") failed", &value[1]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        if (ngx_strcmp(value[2].data, "utf8") == 0) {[m
[31m-            GeoIP_set_charset(gcf->city, GEOIP_CHARSET_UTF8);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (gcf->city->databaseType) {[m
[31m-[m
[31m-    case GEOIP_CITY_EDITION_REV0:[m
[31m-    case GEOIP_CITY_EDITION_REV1:[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-#if (NGX_HAVE_GEOIP_V6)[m
[31m-    case GEOIP_CITY_EDITION_REV0_V6:[m
[31m-    case GEOIP_CITY_EDITION_REV1_V6:[m
[31m-[m
[31m-        gcf->city_v6 = 1;[m
[31m-        return NGX_CONF_OK;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid GeoIP City database \"%V\" type:%d",[m
[31m-                           &value[1], gcf->city->databaseType);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = conf;[m
[31m-[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_cidr_t  cidr, *c;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_http_geoip_cidr_value(cf, &value[1], &cidr) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (gcf->proxies == NULL) {[m
[31m-        gcf->proxies = ngx_array_create(cf->pool, 4, sizeof(ngx_cidr_t));[m
[31m-        if (gcf->proxies == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_array_push(gcf->proxies);[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *c = cidr;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (ngx_strcmp(net->data, "255.255.255.255") == 0) {[m
[31m-        cidr->family = AF_INET;[m
[31m-        cidr->u.in.addr = 0xffffffff;[m
[31m-        cidr->u.in.mask = 0xffffffff;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_ptocidr(net, cidr);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "low address bits of %V are meaningless", net);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_geoip_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_geoip_conf_t  *gcf = data;[m
[31m-[m
[31m-    if (gcf->country) {[m
[31m-        GeoIP_delete(gcf->country);[m
[31m-    }[m
[31m-[m
[31m-    if (gcf->org) {[m
[31m-        GeoIP_delete(gcf->org);[m
[31m-    }[m
[31m-[m
[31m-    if (gcf->city) {[m
[31m-        GeoIP_delete(gcf->city);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gunzip_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gunzip_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex c1341f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gunzip_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,687 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <zlib.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t           enable;[m
[31m-    ngx_bufs_t           bufs;[m
[31m-} ngx_http_gunzip_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t         *in;[m
[31m-    ngx_chain_t         *free;[m
[31m-    ngx_chain_t         *busy;[m
[31m-    ngx_chain_t         *out;[m
[31m-    ngx_chain_t        **last_out;[m
[31m-[m
[31m-    ngx_buf_t           *in_buf;[m
[31m-    ngx_buf_t           *out_buf;[m
[31m-    ngx_int_t            bufs;[m
[31m-[m
[31m-    unsigned             started:1;[m
[31m-    unsigned             flush:4;[m
[31m-    unsigned             redo:1;[m
[31m-    unsigned             done:1;[m
[31m-    unsigned             nomem:1;[m
[31m-[m
[31m-    z_stream             zstream;[m
[31m-    ngx_http_request_t  *request;[m
[31m-} ngx_http_gunzip_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gunzip_filter_inflate(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx);[m
[31m-[m
[31m-static void *ngx_http_gunzip_filter_alloc(void *opaque, u_int items,[m
[31m-    u_int size);[m
[31m-static void ngx_http_gunzip_filter_free(void *opaque, void *address);[m
[31m-[m
[31m-static ngx_int_t ngx_http_gunzip_filter_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_gunzip_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_gunzip_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_gunzip_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("gunzip"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gunzip_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gunzip_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gunzip_conf_t, bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_gunzip_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_gunzip_filter_init,           /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_gunzip_create_conf,           /* create location configuration */[m
[31m-    ngx_http_gunzip_merge_conf             /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_gunzip_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_gunzip_filter_module_ctx,    /* module context */[m
[31m-    ngx_http_gunzip_filter_commands,       /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_gunzip_ctx_t   *ctx;[m
[31m-    ngx_http_gunzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module);[m
[31m-[m
[31m-    /* TODO support multiple content-codings */[m
[31m-    /* TODO always gunzip - due to configuration or module request */[m
[31m-    /* TODO ignore content encoding? */[m
[31m-[m
[31m-    if (!conf->enable[m
[31m-        || r->headers_out.content_encoding == NULL[m
[31m-        || r->headers_out.content_encoding->value.len != 4[m
[31m-        || ngx_strncasecmp(r->headers_out.content_encoding->value.data,[m
[31m-                           (u_char *) "gzip", 4) != 0)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    r->gzip_vary = 1;[m
[31m-[m
[31m-    if (!r->gzip_tested) {[m
[31m-        if (ngx_http_gzip_ok(r) == NGX_OK) {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-    } else if (r->gzip_ok) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gunzip_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_gunzip_filter_module);[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    r->headers_out.content_encoding->hash = 0;[m
[31m-    r->headers_out.content_encoding = NULL;[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_weak_etag(r);[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    int                     rc;[m
[31m-    ngx_uint_t              flush;[m
[31m-    ngx_chain_t            *cl;[m
[31m-    ngx_http_gunzip_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_gunzip_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->done) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http gunzip filter");[m
[31m-[m
[31m-    if (!ctx->started) {[m
[31m-        if (ngx_http_gunzip_filter_inflate_start(r, ctx) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->nomem) {[m
[31m-[m
[31m-        /* flush busy buffers */[m
[31m-[m
[31m-        if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        cl = NULL;[m
[31m-[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_gunzip_filter_module);[m
[31m-        ctx->nomem = 0;[m
[31m-        flush = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        flush = ctx->busy ? 1 : 0;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /* cycle while we can write to a client */[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            /* cycle while there is data to feed zlib and ... */[m
[31m-[m
[31m-            rc = ngx_http_gunzip_filter_add_data(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            /* ... there are buffers to write zlib output */[m
[31m-[m
[31m-            rc = ngx_http_gunzip_filter_get_buf(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_http_gunzip_filter_inflate(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->out == NULL && !flush) {[m
[31m-            return ctx->busy ? NGX_AGAIN : NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_gunzip_filter_module);[m
[31m-        ctx->last_out = &ctx->out;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "gunzip out: %p", ctx->out);[m
[31m-[m
[31m-        ctx->nomem = 0;[m
[31m-        flush = 0;[m
[31m-[m
[31m-        if (ctx->done) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* unreachable */[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int  rc;[m
[31m-[m
[31m-    ctx->zstream.next_in = Z_NULL;[m
[31m-    ctx->zstream.avail_in = 0;[m
[31m-[m
[31m-    ctx->zstream.zalloc = ngx_http_gunzip_filter_alloc;[m
[31m-    ctx->zstream.zfree = ngx_http_gunzip_filter_free;[m
[31m-    ctx->zstream.opaque = ctx;[m
[31m-[m
[31m-    /* windowBits +16 to decode gzip, zlib 1.2.0.4+ */[m
[31m-    rc = inflateInit2(&ctx->zstream, MAX_WBITS + 16);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "inflateInit2() failed: %d", rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->started = 1;[m
[31m-[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-    ctx->flush = Z_NO_FLUSH;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gunzip in: %p", ctx->in);[m
[31m-[m
[31m-    if (ctx->in == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx->in_buf = ctx->in->buf;[m
[31m-    ctx->in = ctx->in->next;[m
[31m-[m
[31m-    ctx->zstream.next_in = ctx->in_buf->pos;[m
[31m-    ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gunzip in_buf:%p ni:%p ai:%ud",[m
[31m-                   ctx->in_buf,[m
[31m-                   ctx->zstream.next_in, ctx->zstream.avail_in);[m
[31m-[m
[31m-    if (ctx->in_buf->last_buf || ctx->in_buf->last_in_chain) {[m
[31m-        ctx->flush = Z_FINISH;[m
[31m-[m
[31m-    } else if (ctx->in_buf->flush) {[m
[31m-        ctx->flush = Z_SYNC_FLUSH;[m
[31m-[m
[31m-    } else if (ctx->zstream.avail_in == 0) {[m
[31m-        /* ctx->flush == Z_NO_FLUSH */[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_gunzip_conf_t  *conf;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module);[m
[31m-[m
[31m-    if (ctx->free) {[m
[31m-        ctx->out_buf = ctx->free->buf;[m
[31m-        ctx->free = ctx->free->next;[m
[31m-[m
[31m-        ctx->out_buf->flush = 0;[m
[31m-[m
[31m-    } else if (ctx->bufs < conf->bufs.num) {[m
[31m-[m
[31m-        ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size);[m
[31m-        if (ctx->out_buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_gunzip_filter_module;[m
[31m-        ctx->out_buf->recycled = 1;[m
[31m-        ctx->bufs++;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->nomem = 1;[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx->zstream.next_out = ctx->out_buf->pos;[m
[31m-    ctx->zstream.avail_out = conf->bufs.size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_inflate(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "inflate in: ni:%p no:%p ai:%ud ao:%ud fl:%d redo:%d",[m
[31m-                   ctx->zstream.next_in, ctx->zstream.next_out,[m
[31m-                   ctx->zstream.avail_in, ctx->zstream.avail_out,[m
[31m-                   ctx->flush, ctx->redo);[m
[31m-[m
[31m-    rc = inflate(&ctx->zstream, ctx->flush);[m
[31m-[m
[31m-    if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "inflate() failed: %d, %d", ctx->flush, rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",[m
[31m-                   ctx->zstream.next_in, ctx->zstream.next_out,[m
[31m-                   ctx->zstream.avail_in, ctx->zstream.avail_out,[m
[31m-                   rc);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gunzip in_buf:%p pos:%p",[m
[31m-                   ctx->in_buf, ctx->in_buf->pos);[m
[31m-[m
[31m-    if (ctx->zstream.next_in) {[m
[31m-        ctx->in_buf->pos = ctx->zstream.next_in;[m
[31m-[m
[31m-        if (ctx->zstream.avail_in == 0) {[m
[31m-            ctx->zstream.next_in = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->out_buf->last = ctx->zstream.next_out;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out == 0) {[m
[31m-[m
[31m-        /* zlib wants to output some more data */[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ctx->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        ctx->redo = 1;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ctx->redo = 0;[m
[31m-[m
[31m-    if (ctx->flush == Z_SYNC_FLUSH) {[m
[31m-[m
[31m-        ctx->flush = Z_NO_FLUSH;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = ctx->out_buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) == 0) {[m
[31m-[m
[31m-            b = ngx_calloc_buf(ctx->request->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->zstream.avail_out = 0;[m
[31m-        }[m
[31m-[m
[31m-        b->flush = 1;[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->flush == Z_FINISH && ctx->zstream.avail_in == 0) {[m
[31m-[m
[31m-        if (rc != Z_STREAM_END) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "inflate() returned %d on response end", rc);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_gunzip_filter_inflate_end(r, ctx) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == Z_STREAM_END && ctx->zstream.avail_in > 0) {[m
[31m-[m
[31m-        rc = inflateReset(&ctx->zstream);[m
[31m-[m
[31m-        if (rc != Z_OK) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                          "inflateReset() failed: %d", rc);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->redo = 1;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->in == NULL) {[m
[31m-[m
[31m-        b = ctx->out_buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->zstream.avail_out = 0;[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r,[m
[31m-    ngx_http_gunzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gunzip inflate end");[m
[31m-[m
[31m-    rc = inflateEnd(&ctx->zstream);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "inflateEnd() failed: %d", rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = ctx->out_buf;[m
[31m-[m
[31m-    if (ngx_buf_size(b) == 0) {[m
[31m-[m
[31m-        b = ngx_calloc_buf(ctx->request->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-    *ctx->last_out = cl;[m
[31m-    ctx->last_out = &cl->next;[m
[31m-[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-    b->sync = 1;[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gunzip_filter_alloc(void *opaque, u_int items, u_int size)[m
[31m-{[m
[31m-    ngx_http_gunzip_ctx_t *ctx = opaque;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "gunzip alloc: n:%ud s:%ud",[m
[31m-                   items, size);[m
[31m-[m
[31m-    return ngx_palloc(ctx->request->pool, items * size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_gunzip_filter_free(void *opaque, void *address)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_http_gunzip_ctx_t *ctx = opaque;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "gunzip free: %p", address);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gunzip_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_gunzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gunzip_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->bufs.num = 0;[m
[31m-     */[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gunzip_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_gunzip_conf_t *prev = parent;[m
[31m-    ngx_http_gunzip_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->bufs, prev->bufs,[m
[31m-                              (128 * 1024) / ngx_pagesize, ngx_pagesize);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gunzip_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_gunzip_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_gunzip_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gzip_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gzip_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 536fdf8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gzip_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1235 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <zlib.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t           enable;[m
[31m-    ngx_flag_t           no_buffer;[m
[31m-[m
[31m-    ngx_hash_t           types;[m
[31m-[m
[31m-    ngx_bufs_t           bufs;[m
[31m-[m
[31m-    size_t               postpone_gzipping;[m
[31m-    ngx_int_t            level;[m
[31m-    size_t               wbits;[m
[31m-    size_t               memlevel;[m
[31m-    ssize_t              min_length;[m
[31m-[m
[31m-    ngx_array_t         *types_keys;[m
[31m-} ngx_http_gzip_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t         *in;[m
[31m-    ngx_chain_t         *free;[m
[31m-    ngx_chain_t         *busy;[m
[31m-    ngx_chain_t         *out;[m
[31m-    ngx_chain_t        **last_out;[m
[31m-[m
[31m-    ngx_chain_t         *copied;[m
[31m-    ngx_chain_t         *copy_buf;[m
[31m-[m
[31m-    ngx_buf_t           *in_buf;[m
[31m-    ngx_buf_t           *out_buf;[m
[31m-    ngx_int_t            bufs;[m
[31m-[m
[31m-    void                *preallocated;[m
[31m-    char                *free_mem;[m
[31m-    ngx_uint_t           allocated;[m
[31m-[m
[31m-    int                  wbits;[m
[31m-    int                  memlevel;[m
[31m-[m
[31m-    unsigned             flush:4;[m
[31m-    unsigned             redo:1;[m
[31m-    unsigned             done:1;[m
[31m-    unsigned             nomem:1;[m
[31m-    unsigned             gzheader:1;[m
[31m-    unsigned             buffering:1;[m
[31m-[m
[31m-    size_t               zin;[m
[31m-    size_t               zout;[m
[31m-[m
[31m-    uint32_t             crc32;[m
[31m-    z_stream             zstream;[m
[31m-    ngx_http_request_t  *request;[m
[31m-} ngx_http_gzip_ctx_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-struct gztrailer {[m
[31m-    uint32_t  crc32;[m
[31m-    uint32_t  zlen;[m
[31m-};[m
[31m-[m
[31m-#else /* NGX_HAVE_BIG_ENDIAN || !NGX_HAVE_NONALIGNED */[m
[31m-[m
[31m-struct gztrailer {[m
[31m-    u_char  crc32[4];[m
[31m-    u_char  zlen[4];[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void ngx_http_gzip_filter_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_buffer(ngx_http_gzip_ctx_t *ctx,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_gzip_filter_deflate_start(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_gzheader(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_add_data(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_get_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_deflate(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_gzip_filter_deflate_end(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-[m
[31m-static void *ngx_http_gzip_filter_alloc(void *opaque, u_int items,[m
[31m-    u_int size);[m
[31m-static void ngx_http_gzip_filter_free(void *opaque, void *address);[m
[31m-static void ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx);[m
[31m-[m
[31m-static ngx_int_t ngx_http_gzip_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_gzip_ratio_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_gzip_filter_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_gzip_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_gzip_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static char *ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_gzip_hash(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_num_bounds_t  ngx_http_gzip_comp_level_bounds = {[m
[31m-    ngx_conf_check_num_bounds, 1, 9[m
[31m-};[m
[31m-[m
[31m-static ngx_conf_post_handler_pt  ngx_http_gzip_window_p = ngx_http_gzip_window;[m
[31m-static ngx_conf_post_handler_pt  ngx_http_gzip_hash_p = ngx_http_gzip_hash;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_gzip_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("gzip"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, types_keys),[m
[31m-      &ngx_http_html_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("gzip_comp_level"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, level),[m
[31m-      &ngx_http_gzip_comp_level_bounds },[m
[31m-[m
[31m-    { ngx_string("gzip_window"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, wbits),[m
[31m-      &ngx_http_gzip_window_p },[m
[31m-[m
[31m-    { ngx_string("gzip_hash"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, memlevel),[m
[31m-      &ngx_http_gzip_hash_p },[m
[31m-[m
[31m-    { ngx_string("postpone_gzipping"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, postpone_gzipping),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_no_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, no_buffer),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_min_length"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_conf_t, min_length),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_gzip_filter_module_ctx = {[m
[31m-    ngx_http_gzip_add_variables,           /* preconfiguration */[m
[31m-    ngx_http_gzip_filter_init,             /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_gzip_create_conf,             /* create location configuration */[m
[31m-    ngx_http_gzip_merge_conf               /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_gzip_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_gzip_filter_module_ctx,      /* module context */[m
[31m-    ngx_http_gzip_filter_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_gzip_ratio = ngx_string("gzip_ratio");[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t       *h;[m
[31m-    ngx_http_gzip_ctx_t   *ctx;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (!conf->enable[m
[31m-        || (r->headers_out.status != NGX_HTTP_OK[m
[31m-            && r->headers_out.status != NGX_HTTP_FORBIDDEN[m
[31m-            && r->headers_out.status != NGX_HTTP_NOT_FOUND)[m
[31m-        || (r->headers_out.content_encoding[m
[31m-            && r->headers_out.content_encoding->value.len)[m
[31m-        || (r->headers_out.content_length_n != -1[m
[31m-            && r->headers_out.content_length_n < conf->min_length)[m
[31m-        || ngx_http_test_content_type(r, &conf->types) == NULL[m
[31m-        || r->header_only)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    r->gzip_vary = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-    {[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->gzip_disable_degradation && ngx_http_degraded(r)) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (!r->gzip_tested) {[m
[31m-        if (ngx_http_gzip_ok(r) != NGX_OK) {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-    } else if (!r->gzip_ok) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gzip_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-    ctx->buffering = (conf->postpone_gzipping != 0);[m
[31m-[m
[31m-    ngx_http_gzip_filter_memory(r, ctx);[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = 1;[m
[31m-    ngx_str_set(&h->key, "Content-Encoding");[m
[31m-    ngx_str_set(&h->value, "gzip");[m
[31m-    r->headers_out.content_encoding = h;[m
[31m-[m
[31m-    r->main_filter_need_in_memory = 1;[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_weak_etag(r);[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    int                   rc;[m
[31m-    ngx_uint_t            flush;[m
[31m-    ngx_chain_t          *cl;[m
[31m-    ngx_http_gzip_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->done || r->header_only) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http gzip filter");[m
[31m-[m
[31m-    if (ctx->buffering) {[m
[31m-[m
[31m-        /*[m
[31m-         * With default memory settings zlib starts to output gzipped data[m
[31m-         * only after it has got about 90K, so it makes sense to allocate[m
[31m-         * zlib memory (200-400K) only after we have enough data to compress.[m
[31m-         * Although we copy buffers, nevertheless for not big responses[m
[31m-         * this allows to allocate zlib memory, to compress and to output[m
[31m-         * the response in one step using hot CPU cache.[m
[31m-         */[m
[31m-[m
[31m-        if (in) {[m
[31m-            switch (ngx_http_gzip_filter_buffer(ctx, in)) {[m
[31m-[m
[31m-            case NGX_OK:[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            case NGX_DONE:[m
[31m-                in = NULL;[m
[31m-                break;[m
[31m-[m
[31m-            default:  /* NGX_ERROR */[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->buffering = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->preallocated == NULL) {[m
[31m-        if (ngx_http_gzip_filter_deflate_start(r, ctx) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->nomem) {[m
[31m-[m
[31m-        /* flush busy buffers */[m
[31m-[m
[31m-        if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        cl = NULL;[m
[31m-[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_gzip_filter_module);[m
[31m-        ctx->nomem = 0;[m
[31m-        flush = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        flush = ctx->busy ? 1 : 0;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /* cycle while we can write to a client */[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            /* cycle while there is data to feed zlib and ... */[m
[31m-[m
[31m-            rc = ngx_http_gzip_filter_add_data(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            /* ... there are buffers to write zlib output */[m
[31m-[m
[31m-            rc = ngx_http_gzip_filter_get_buf(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            rc = ngx_http_gzip_filter_deflate(r, ctx);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->out == NULL && !flush) {[m
[31m-            ngx_http_gzip_filter_free_copy_buf(r, ctx);[m
[31m-[m
[31m-            return ctx->busy ? NGX_AGAIN : NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!ctx->gzheader) {[m
[31m-            if (ngx_http_gzip_filter_gzheader(r, ctx) != NGX_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_gzip_filter_free_copy_buf(r, ctx);[m
[31m-[m
[31m-        ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_gzip_filter_module);[m
[31m-        ctx->last_out = &ctx->out;[m
[31m-[m
[31m-        ctx->nomem = 0;[m
[31m-        flush = 0;[m
[31m-[m
[31m-        if (ctx->done) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* unreachable */[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    if (ctx->preallocated) {[m
[31m-        deflateEnd(&ctx->zstream);[m
[31m-[m
[31m-        ngx_pfree(r->pool, ctx->preallocated);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_gzip_filter_free_copy_buf(r, ctx);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_gzip_filter_memory(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int                    wbits, memlevel;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    wbits = conf->wbits;[m
[31m-    memlevel = conf->memlevel;[m
[31m-[m
[31m-    if (r->headers_out.content_length_n > 0) {[m
[31m-[m
[31m-        /* the actual zlib window size is smaller by 262 bytes */[m
[31m-[m
[31m-        while (r->headers_out.content_length_n < ((1 << (wbits - 1)) - 262)) {[m
[31m-            wbits--;[m
[31m-            memlevel--;[m
[31m-        }[m
[31m-[m
[31m-        if (memlevel < 1) {[m
[31m-            memlevel = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->wbits = wbits;[m
[31m-    ctx->memlevel = memlevel;[m
[31m-[m
[31m-    /*[m
[31m-     * We preallocate a memory for zlib in one buffer (200K-400K), this[m
[31m-     * decreases a number of malloc() and free() calls and also probably[m
[31m-     * decreases a number of syscalls (sbrk()/mmap() and so on).[m
[31m-     * Besides we free the memory as soon as a gzipping will complete[m
[31m-     * and do not wait while a whole response will be sent to a client.[m
[31m-     *[m
[31m-     * 8K is for zlib deflate_state, it takes[m
[31m-     *  *) 5816 bytes on i386 and sparc64 (32-bit mode)[m
[31m-     *  *) 5920 bytes on amd64 and sparc64[m
[31m-     */[m
[31m-[m
[31m-    ctx->allocated = 8192 + (1 << (wbits + 2)) + (1 << (memlevel + 9));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_buffer(ngx_http_gzip_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                 size, buffered;[m
[31m-    ngx_buf_t             *b, *buf;[m
[31m-    ngx_chain_t           *cl, **ll;[m
[31m-    ngx_http_request_t    *r;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED;[m
[31m-[m
[31m-    buffered = 0;[m
[31m-    ll = &ctx->in;[m
[31m-[m
[31m-    for (cl = ctx->in; cl; cl = cl->next) {[m
[31m-        buffered += cl->buf->last - cl->buf->pos;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    while (in) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = in->buf;[m
[31m-[m
[31m-        size = b->last - b->pos;[m
[31m-        buffered += size;[m
[31m-[m
[31m-        if (b->flush || b->last_buf || buffered > conf->postpone_gzipping) {[m
[31m-            ctx->buffering = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->buffering && size) {[m
[31m-[m
[31m-            buf = ngx_create_temp_buf(r->pool, size);[m
[31m-            if (buf == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_cpymem(buf->pos, b->pos, size);[m
[31m-            b->pos = b->last;[m
[31m-[m
[31m-            buf->last_buf = b->last_buf;[m
[31m-            buf->tag = (ngx_buf_tag_t) &ngx_http_gzip_filter_module;[m
[31m-[m
[31m-            cl->buf = buf;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf = b;[m
[31m-        }[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    return ctx->buffering ? NGX_OK : NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_deflate_start(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int                    rc;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    ctx->preallocated = ngx_palloc(r->pool, ctx->allocated);[m
[31m-    if (ctx->preallocated == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->free_mem = ctx->preallocated;[m
[31m-[m
[31m-    ctx->zstream.zalloc = ngx_http_gzip_filter_alloc;[m
[31m-    ctx->zstream.zfree = ngx_http_gzip_filter_free;[m
[31m-    ctx->zstream.opaque = ctx;[m
[31m-[m
[31m-    rc = deflateInit2(&ctx->zstream, (int) conf->level, Z_DEFLATED,[m
[31m-                      - ctx->wbits, ctx->memlevel, Z_DEFAULT_STRATEGY);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "deflateInit2() failed: %d", rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-    ctx->crc32 = crc32(0L, Z_NULL, 0);[m
[31m-    ctx->flush = Z_NO_FLUSH;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_gzheader(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t      *b;[m
[31m-    ngx_chain_t    *cl;[m
[31m-    static u_char  gzheader[10] =[m
[31m-                               { 0x1f, 0x8b, Z_DEFLATED, 0, 0, 0, 0, 0, 0, 3 };[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-    b->pos = gzheader;[m
[31m-    b->last = b->pos + 10;[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = ctx->out;[m
[31m-    ctx->out = cl;[m
[31m-[m
[31m-    ctx->gzheader = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_add_data(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gzip in: %p", ctx->in);[m
[31m-[m
[31m-    if (ctx->in == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->copy_buf) {[m
[31m-[m
[31m-        /*[m
[31m-         * to avoid CPU cache trashing we do not free() just quit buf,[m
[31m-         * but postpone free()ing after zlib compressing and data output[m
[31m-         */[m
[31m-[m
[31m-        ctx->copy_buf->next = ctx->copied;[m
[31m-        ctx->copied = ctx->copy_buf;[m
[31m-        ctx->copy_buf = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->in_buf = ctx->in->buf;[m
[31m-[m
[31m-    if (ctx->in_buf->tag == (ngx_buf_tag_t) &ngx_http_gzip_filter_module) {[m
[31m-        ctx->copy_buf = ctx->in;[m
[31m-    }[m
[31m-[m
[31m-    ctx->in = ctx->in->next;[m
[31m-[m
[31m-    ctx->zstream.next_in = ctx->in_buf->pos;[m
[31m-    ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gzip in_buf:%p ni:%p ai:%ud",[m
[31m-                   ctx->in_buf,[m
[31m-                   ctx->zstream.next_in, ctx->zstream.avail_in);[m
[31m-[m
[31m-    if (ctx->in_buf->last_buf) {[m
[31m-        ctx->flush = Z_FINISH;[m
[31m-[m
[31m-    } else if (ctx->in_buf->flush) {[m
[31m-        ctx->flush = Z_SYNC_FLUSH;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->zstream.avail_in) {[m
[31m-[m
[31m-        ctx->crc32 = crc32(ctx->crc32, ctx->zstream.next_in,[m
[31m-                           ctx->zstream.avail_in);[m
[31m-[m
[31m-    } else if (ctx->flush == Z_NO_FLUSH) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_get_buf(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (ctx->free) {[m
[31m-        ctx->out_buf = ctx->free->buf;[m
[31m-        ctx->free = ctx->free->next;[m
[31m-[m
[31m-    } else if (ctx->bufs < conf->bufs.num) {[m
[31m-[m
[31m-        ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size);[m
[31m-        if (ctx->out_buf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_gzip_filter_module;[m
[31m-        ctx->out_buf->recycled = 1;[m
[31m-        ctx->bufs++;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->nomem = 1;[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx->zstream.next_out = ctx->out_buf->pos;[m
[31m-    ctx->zstream.avail_out = conf->bufs.size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int                    rc;[m
[31m-    ngx_buf_t             *b;[m
[31m-    ngx_chain_t           *cl;[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                 "deflate in: ni:%p no:%p ai:%ud ao:%ud fl:%d redo:%d",[m
[31m-                 ctx->zstream.next_in, ctx->zstream.next_out,[m
[31m-                 ctx->zstream.avail_in, ctx->zstream.avail_out,[m
[31m-                 ctx->flush, ctx->redo);[m
[31m-[m
[31m-    rc = deflate(&ctx->zstream, ctx->flush);[m
[31m-[m
[31m-    if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "deflate() failed: %d, %d", ctx->flush, rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",[m
[31m-                   ctx->zstream.next_in, ctx->zstream.next_out,[m
[31m-                   ctx->zstream.avail_in, ctx->zstream.avail_out,[m
[31m-                   rc);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "gzip in_buf:%p pos:%p",[m
[31m-                   ctx->in_buf, ctx->in_buf->pos);[m
[31m-[m
[31m-    if (ctx->zstream.next_in) {[m
[31m-        ctx->in_buf->pos = ctx->zstream.next_in;[m
[31m-[m
[31m-        if (ctx->zstream.avail_in == 0) {[m
[31m-            ctx->zstream.next_in = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->out_buf->last = ctx->zstream.next_out;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out == 0) {[m
[31m-[m
[31m-        /* zlib wants to output some more gzipped data */[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ctx->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        ctx->redo = 1;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ctx->redo = 0;[m
[31m-[m
[31m-    if (ctx->flush == Z_SYNC_FLUSH) {[m
[31m-[m
[31m-        ctx->flush = Z_NO_FLUSH;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = ctx->out_buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) == 0) {[m
[31m-[m
[31m-            b = ngx_calloc_buf(ctx->request->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->zstream.avail_out = 0;[m
[31m-        }[m
[31m-[m
[31m-        b->flush = 1;[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == Z_STREAM_END) {[m
[31m-[m
[31m-        if (ngx_http_gzip_filter_deflate_end(r, ctx) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (conf->no_buffer && ctx->in == NULL) {[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ctx->out_buf;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_deflate_end(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_chain_t       *cl;[m
[31m-    struct gztrailer  *trailer;[m
[31m-[m
[31m-    ctx->zin = ctx->zstream.total_in;[m
[31m-    ctx->zout = 10 + ctx->zstream.total_out + 8;[m
[31m-[m
[31m-    rc = deflateEnd(&ctx->zstream);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "deflateEnd() failed: %d", rc);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_pfree(r->pool, ctx->preallocated);[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = ctx->out_buf;[m
[31m-    cl->next = NULL;[m
[31m-    *ctx->last_out = cl;[m
[31m-    ctx->last_out = &cl->next;[m
[31m-[m
[31m-    if (ctx->zstream.avail_out >= 8) {[m
[31m-        trailer = (struct gztrailer *) ctx->out_buf->last;[m
[31m-        ctx->out_buf->last += 8;[m
[31m-        ctx->out_buf->last_buf = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        b = ngx_create_temp_buf(r->pool, 8);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->last_buf = 1;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->last_out = cl;[m
[31m-        ctx->last_out = &cl->next;[m
[31m-        trailer = (struct gztrailer *) b->pos;[m
[31m-        b->last += 8;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-    trailer->crc32 = ctx->crc32;[m
[31m-    trailer->zlen = ctx->zin;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    trailer->crc32[0] = (u_char) (ctx->crc32 & 0xff);[m
[31m-    trailer->crc32[1] = (u_char) ((ctx->crc32 >> 8) & 0xff);[m
[31m-    trailer->crc32[2] = (u_char) ((ctx->crc32 >> 16) & 0xff);[m
[31m-    trailer->crc32[3] = (u_char) ((ctx->crc32 >> 24) & 0xff);[m
[31m-[m
[31m-    trailer->zlen[0] = (u_char) (ctx->zin & 0xff);[m
[31m-    trailer->zlen[1] = (u_char) ((ctx->zin >> 8) & 0xff);[m
[31m-    trailer->zlen[2] = (u_char) ((ctx->zin >> 16) & 0xff);[m
[31m-    trailer->zlen[3] = (u_char) ((ctx->zin >> 24) & 0xff);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ctx->zstream.avail_in = 0;[m
[31m-    ctx->zstream.avail_out = 0;[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gzip_filter_alloc(void *opaque, u_int items, u_int size)[m
[31m-{[m
[31m-    ngx_http_gzip_ctx_t *ctx = opaque;[m
[31m-[m
[31m-    void        *p;[m
[31m-    ngx_uint_t   alloc;[m
[31m-[m
[31m-    alloc = items * size;[m
[31m-[m
[31m-    if (alloc % 512 != 0 && alloc < 8192) {[m
[31m-[m
[31m-        /*[m
[31m-         * The zlib deflate_state allocation, it takes about 6K,[m
[31m-         * we allocate 8K.  Other allocations are divisible by 512.[m
[31m-         */[m
[31m-[m
[31m-        alloc = 8192;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc <= ctx->allocated) {[m
[31m-        p = ctx->free_mem;[m
[31m-        ctx->free_mem += alloc;[m
[31m-        ctx->allocated -= alloc;[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                       "gzip alloc: n:%ud s:%ud a:%ui p:%p",[m
[31m-                       items, size, alloc, p);[m
[31m-[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, ctx->request->connection->log, 0,[m
[31m-                  "gzip filter failed to use preallocated memory: %ud of %ui",[m
[31m-                  items * size, ctx->allocated);[m
[31m-[m
[31m-    p = ngx_palloc(ctx->request->pool, items * size);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_gzip_filter_free(void *opaque, void *address)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_http_gzip_ctx_t *ctx = opaque;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "gzip free: %p", address);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r,[m
[31m-    ngx_http_gzip_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    for (cl = ctx->copied; cl; cl = cl->next) {[m
[31m-        ngx_pfree(r->pool, cl->buf->start);[m
[31m-    }[m
[31m-[m
[31m-    ctx->copied = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_gzip_ratio, NGX_HTTP_VAR_NOHASH);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_gzip_ratio_variable;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_ratio_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t            zint, zfrac;[m
[31m-    ngx_http_gzip_ctx_t  *ctx;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->zout == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN + 3);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    zint = (ngx_uint_t) (ctx->zin / ctx->zout);[m
[31m-    zfrac = (ngx_uint_t) ((ctx->zin * 100 / ctx->zout) % 100);[m
[31m-[m
[31m-    if ((ctx->zin * 1000 / ctx->zout) % 10 > 4) {[m
[31m-[m
[31m-        /* the rounding, e.g., 2.125 to 2.13 */[m
[31m-[m
[31m-        zfrac++;[m
[31m-[m
[31m-        if (zfrac > 99) {[m
[31m-            zint++;[m
[31m-            zfrac = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%ui.%02ui", zint, zfrac) - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gzip_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_gzip_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gzip_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->bufs.num = 0;[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET;[m
[31m-    conf->no_buffer = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->postpone_gzipping = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->level = NGX_CONF_UNSET;[m
[31m-    conf->wbits = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->memlevel = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->min_length = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_gzip_conf_t *prev = parent;[m
[31m-    ngx_http_gzip_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_value(conf->no_buffer, prev->no_buffer, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->bufs, prev->bufs,[m
[31m-                              (128 * 1024) / ngx_pagesize, ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->postpone_gzipping, prev->postpone_gzipping,[m
[31m-                              0);[m
[31m-    ngx_conf_merge_value(conf->level, prev->level, 1);[m
[31m-    ngx_conf_merge_size_value(conf->wbits, prev->wbits, MAX_WBITS);[m
[31m-    ngx_conf_merge_size_value(conf->memlevel, prev->memlevel,[m
[31m-                              MAX_MEM_LEVEL - 1);[m
[31m-    ngx_conf_merge_value(conf->min_length, prev->min_length, 20);[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_html_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_gzip_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_gzip_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *np = data;[m
[31m-[m
[31m-    size_t  wbits, wsize;[m
[31m-[m
[31m-    wbits = 15;[m
[31m-[m
[31m-    for (wsize = 32 * 1024; wsize > 256; wsize >>= 1) {[m
[31m-[m
[31m-        if (wsize == *np) {[m
[31m-            *np = wbits;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        wbits--;[m
[31m-    }[m
[31m-[m
[31m-    return "must be 512, 1k, 2k, 4k, 8k, 16k, or 32k";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_hash(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *np = data;[m
[31m-[m
[31m-    size_t  memlevel, hsize;[m
[31m-[m
[31m-    memlevel = 9;[m
[31m-[m
[31m-    for (hsize = 128 * 1024; hsize > 256; hsize >>= 1) {[m
[31m-[m
[31m-        if (hsize == *np) {[m
[31m-            *np = memlevel;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        memlevel--;[m
[31m-    }[m
[31m-[m
[31m-    return "must be 512, 1k, 2k, 4k, 8k, 16k, 32k, 64k, or 128k";[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gzip_static_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gzip_static_module.c[m
[1mdeleted file mode 100644[m
[1mindex 4d54090..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_gzip_static_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,331 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_GZIP_STATIC_OFF     0[m
[31m-#define NGX_HTTP_GZIP_STATIC_ON      1[m
[31m-#define NGX_HTTP_GZIP_STATIC_ALWAYS  2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  enable;[m
[31m-} ngx_http_gzip_static_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_gzip_static_handler(ngx_http_request_t *r);[m
[31m-static void *ngx_http_gzip_static_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_gzip_static_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_gzip_static[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_GZIP_STATIC_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_GZIP_STATIC_ON },[m
[31m-    { ngx_string("always"), NGX_HTTP_GZIP_STATIC_ALWAYS },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_gzip_static_commands[] = {[m
[31m-[m
[31m-    { ngx_string("gzip_static"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_gzip_static_conf_t, enable),[m
[31m-      &ngx_http_gzip_static },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t  ngx_http_gzip_static_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_gzip_static_init,             /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_gzip_static_create_conf,      /* create location configuration */[m
[31m-    ngx_http_gzip_static_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_gzip_static_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_gzip_static_module_ctx,      /* module context */[m
[31m-    ngx_http_gzip_static_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_static_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        root;[m
[31m-    ngx_str_t                     path;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_uint_t                    level;[m
[31m-    ngx_log_t                    *log;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_chain_t                   out;[m
[31m-    ngx_table_elt_t              *h;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_gzip_static_conf_t  *gzcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    gzcf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_static_module);[m
[31m-[m
[31m-    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_OFF) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) {[m
[31m-        rc = ngx_http_gzip_ok(r);[m
[31m-[m
[31m-    } else {[m
[31m-        /* always */[m
[31m-        rc = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!clcf->gzip_vary && rc != NGX_OK) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    p = ngx_http_map_uri_to_path(r, &path, &root, sizeof(".gz") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '.';[m
[31m-    *p++ = 'g';[m
[31m-    *p++ = 'z';[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    path.len = p - path.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "http filename: \"%s\"", path.data);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-        case NGX_ENAMETOOLONG:[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        case NGX_EACCES:[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-        case NGX_EMLINK:[m
[31m-        case NGX_ELOOP:[m
[31m-#endif[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, log, of.err,[m
[31m-                      "%s \"%s\" failed", of.failed, path.data);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) {[m
[31m-        r->gzip_vary = 1;[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "http static fd: %d", of.fd);[m
[31m-[m
[31m-    if (of.is_dir) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http dir");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_WIN32) /* the not regular files are probably Unix specific */[m
[31m-[m
[31m-    if (!of.is_file) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, 0,[m
[31m-                      "\"%s\" is not a regular file", path.data);[m
[31m-[m
[31m-        return NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    r->root_tested = !r->error_page;[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    log->action = "sending response to client";[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_length_n = of.size;[m
[31m-    r->headers_out.last_modified_time = of.mtime;[m
[31m-[m
[31m-    if (ngx_http_set_etag(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = 1;[m
[31m-    ngx_str_set(&h->key, "Content-Encoding");[m
[31m-    ngx_str_set(&h->value, "gzip");[m
[31m-    r->headers_out.content_encoding = h;[m
[31m-[m
[31m-    /* we need to allocate all before the header would be sent */[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = 0;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = b->file_last ? 1 : 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->name = path;[m
[31m-    b->file->log = log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_gzip_static_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_gzip_static_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_gzip_static_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_gzip_static_conf_t *prev = parent;[m
[31m-    ngx_http_gzip_static_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->enable, prev->enable,[m
[31m-                              NGX_HTTP_GZIP_STATIC_OFF);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_static_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_gzip_static_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_headers_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_headers_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6738afe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_headers_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,741 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_header_val_s  ngx_http_header_val_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_set_header_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_uint_t                 offset;[m
[31m-    ngx_http_set_header_pt     handler;[m
[31m-} ngx_http_set_header_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_header_val_s {[m
[31m-    ngx_http_complex_value_t   value;[m
[31m-    ngx_str_t                  key;[m
[31m-    ngx_http_set_header_pt     handler;[m
[31m-    ngx_uint_t                 offset;[m
[31m-    ngx_uint_t                 always;  /* unsigned  always:1 */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_EXPIRES_OFF,[m
[31m-    NGX_HTTP_EXPIRES_EPOCH,[m
[31m-    NGX_HTTP_EXPIRES_MAX,[m
[31m-    NGX_HTTP_EXPIRES_ACCESS,[m
[31m-    NGX_HTTP_EXPIRES_MODIFIED,[m
[31m-    NGX_HTTP_EXPIRES_DAILY,[m
[31m-    NGX_HTTP_EXPIRES_UNSET[m
[31m-} ngx_http_expires_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_expires_t         expires;[m
[31m-    time_t                     expires_time;[m
[31m-    ngx_http_complex_value_t  *expires_value;[m
[31m-    ngx_array_t               *headers;[m
[31m-} ngx_http_headers_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_expires(ngx_http_request_t *r,[m
[31m-    ngx_http_headers_conf_t *conf);[m
[31m-static ngx_int_t ngx_http_parse_expires(ngx_str_t *value,[m
[31m-    ngx_http_expires_t *expires, time_t *expires_time, char **err);[m
[31m-static ngx_int_t ngx_http_add_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_add_header(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_response_header(ngx_http_request_t *r,[m
[31m-    ngx_http_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-static void *ngx_http_headers_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_headers_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_headers_filter_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_headers_add(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_set_header_t  ngx_http_set_headers[] = {[m
[31m-[m
[31m-    { ngx_string("Cache-Control"), 0, ngx_http_add_cache_control },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified),[m
[31m-                 ngx_http_set_last_modified },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 offsetof(ngx_http_headers_out_t, etag),[m
[31m-                 ngx_http_set_response_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_headers_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("expires"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE12,[m
[31m-      ngx_http_headers_expires,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-    { ngx_string("add_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE23,[m
[31m-      ngx_http_headers_add,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL},[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_headers_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_headers_filter_init,          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_headers_create_conf,          /* create location configuration */[m
[31m-    ngx_http_headers_merge_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_headers_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_headers_filter_module_ctx,   /* module context */[m
[31m-    ngx_http_headers_filter_commands,      /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                 value;[m
[31m-    ngx_uint_t                i, safe_status;[m
[31m-    ngx_http_header_val_t    *h;[m
[31m-    ngx_http_headers_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_filter_module);[m
[31m-[m
[31m-    if ((conf->expires == NGX_HTTP_EXPIRES_OFF && conf->headers == NULL)[m
[31m-        || r != r->main)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    switch (r->headers_out.status) {[m
[31m-[m
[31m-    case NGX_HTTP_OK:[m
[31m-    case NGX_HTTP_CREATED:[m
[31m-    case NGX_HTTP_NO_CONTENT:[m
[31m-    case NGX_HTTP_PARTIAL_CONTENT:[m
[31m-    case NGX_HTTP_MOVED_PERMANENTLY:[m
[31m-    case NGX_HTTP_MOVED_TEMPORARILY:[m
[31m-    case NGX_HTTP_SEE_OTHER:[m
[31m-    case NGX_HTTP_NOT_MODIFIED:[m
[31m-    case NGX_HTTP_TEMPORARY_REDIRECT:[m
[31m-        safe_status = 1;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        safe_status = 0;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->expires != NGX_HTTP_EXPIRES_OFF && safe_status) {[m
[31m-        if (ngx_http_set_expires(r, conf) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers) {[m
[31m-        h = conf->headers->elts;[m
[31m-        for (i = 0; i < conf->headers->nelts; i++) {[m
[31m-[m
[31m-            if (!safe_status && !h[i].always) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (h[i].handler(r, &h[i], &value) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_expires(ngx_http_request_t *r, ngx_http_headers_conf_t *conf)[m
[31m-{[m
[31m-    char                *err;[m
[31m-    size_t               len;[m
[31m-    time_t               now, expires_time, max_age;[m
[31m-    ngx_str_t            value;[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_table_elt_t     *e, *cc, **ccp;[m
[31m-    ngx_http_expires_t   expires;[m
[31m-[m
[31m-    expires = conf->expires;[m
[31m-    expires_time = conf->expires_time;[m
[31m-[m
[31m-    if (conf->expires_value != NULL) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, conf->expires_value, &value) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_parse_expires(&value, &expires, &expires_time, &err);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (expires == NGX_HTTP_EXPIRES_OFF) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    e = r->headers_out.expires;[m
[31m-[m
[31m-    if (e == NULL) {[m
[31m-[m
[31m-        e = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (e == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.expires = e;[m
[31m-[m
[31m-        e->hash = 1;[m
[31m-        ngx_str_set(&e->key, "Expires");[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT");[m
[31m-    e->value.len = len - 1;[m
[31m-[m
[31m-    ccp = r->headers_out.cache_control.elts;[m
[31m-[m
[31m-    if (ccp == NULL) {[m
[31m-[m
[31m-        if (ngx_array_init(&r->headers_out.cache_control, r->pool,[m
[31m-                           1, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccp = ngx_array_push(&r->headers_out.cache_control);[m
[31m-        if (ccp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cc = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (cc == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cc->hash = 1;[m
[31m-        ngx_str_set(&cc->key, "Cache-Control");[m
[31m-        *ccp = cc;[m
[31m-[m
[31m-    } else {[m
[31m-        for (i = 1; i < r->headers_out.cache_control.nelts; i++) {[m
[31m-            ccp[i]->hash = 0;[m
[31m-        }[m
[31m-[m
[31m-        cc = ccp[0];[m
[31m-    }[m
[31m-[m
[31m-    if (expires == NGX_HTTP_EXPIRES_EPOCH) {[m
[31m-        e->value.data = (u_char *) "Thu, 01 Jan 1970 00:00:01 GMT";[m
[31m-        ngx_str_set(&cc->value, "no-cache");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (expires == NGX_HTTP_EXPIRES_MAX) {[m
[31m-        e->value.data = (u_char *) "Thu, 31 Dec 2037 23:55:55 GMT";[m
[31m-        /* 10 years */[m
[31m-        ngx_str_set(&cc->value, "max-age=315360000");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    e->value.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (e->value.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (expires_time == 0 && expires != NGX_HTTP_EXPIRES_DAILY) {[m
[31m-        ngx_memcpy(e->value.data, ngx_cached_http_time.data,[m
[31m-                   ngx_cached_http_time.len + 1);[m
[31m-        ngx_str_set(&cc->value, "max-age=0");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    if (expires == NGX_HTTP_EXPIRES_DAILY) {[m
[31m-        expires_time = ngx_next_time(expires_time);[m
[31m-        max_age = expires_time - now;[m
[31m-[m
[31m-    } else if (expires == NGX_HTTP_EXPIRES_ACCESS[m
[31m-               || r->headers_out.last_modified_time == -1)[m
[31m-    {[m
[31m-        max_age = expires_time;[m
[31m-        expires_time += now;[m
[31m-[m
[31m-    } else {[m
[31m-        expires_time += r->headers_out.last_modified_time;[m
[31m-        max_age = expires_time - now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_time(e->value.data, expires_time);[m
[31m-[m
[31m-    if (conf->expires_time < 0 || max_age < 0) {[m
[31m-        ngx_str_set(&cc->value, "no-cache");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cc->value.data = ngx_pnalloc(r->pool,[m
[31m-                                 sizeof("max-age=") + NGX_TIME_T_LEN + 1);[m
[31m-    if (cc->value.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cc->value.len = ngx_sprintf(cc->value.data, "max-age=%T", max_age)[m
[31m-                    - cc->value.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_parse_expires(ngx_str_t *value, ngx_http_expires_t *expires,[m
[31m-    time_t *expires_time, char **err)[m
[31m-{[m
[31m-    ngx_uint_t  minus;[m
[31m-[m
[31m-    if (*expires != NGX_HTTP_EXPIRES_MODIFIED) {[m
[31m-[m
[31m-        if (value->len == 5 && ngx_strncmp(value->data, "epoch", 5) == 0) {[m
[31m-            *expires = NGX_HTTP_EXPIRES_EPOCH;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (value->len == 3 && ngx_strncmp(value->data, "max", 3) == 0) {[m
[31m-            *expires = NGX_HTTP_EXPIRES_MAX;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (value->len == 3 && ngx_strncmp(value->data, "off", 3) == 0) {[m
[31m-            *expires = NGX_HTTP_EXPIRES_OFF;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (value->len && value->data[0] == '@') {[m
[31m-        value->data++;[m
[31m-        value->len--;[m
[31m-        minus = 0;[m
[31m-[m
[31m-        if (*expires == NGX_HTTP_EXPIRES_MODIFIED) {[m
[31m-            *err = "daily time cannot be used with \"modified\" parameter";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *expires = NGX_HTTP_EXPIRES_DAILY;[m
[31m-[m
[31m-    } else if (value->len && value->data[0] == '+') {[m
[31m-        value->data++;[m
[31m-        value->len--;[m
[31m-        minus = 0;[m
[31m-[m
[31m-    } else if (value->len && value->data[0] == '-') {[m
[31m-        value->data++;[m
[31m-        value->len--;[m
[31m-        minus = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        minus = 0;[m
[31m-    }[m
[31m-[m
[31m-    *expires_time = ngx_parse_time(value, 1);[m
[31m-[m
[31m-    if (*expires_time == (time_t) NGX_ERROR) {[m
[31m-        *err = "invalid value";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*expires == NGX_HTTP_EXPIRES_DAILY[m
[31m-        && *expires_time > 24 * 60 * 60)[m
[31m-    {[m
[31m-        *err = "daily time value must be less than 24 hours";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (minus) {[m
[31m-        *expires_time = - *expires_time;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_header(ngx_http_request_t *r, ngx_http_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    if (value->len) {[m
[31m-        h = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h->hash = 1;[m
[31m-        h->key = hv->key;[m
[31m-        h->value = *value;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_cache_control(ngx_http_request_t *r, ngx_http_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *cc, **ccp;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ccp = r->headers_out.cache_control.elts;[m
[31m-[m
[31m-    if (ccp == NULL) {[m
[31m-[m
[31m-        if (ngx_array_init(&r->headers_out.cache_control, r->pool,[m
[31m-                           1, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ccp = ngx_array_push(&r->headers_out.cache_control);[m
[31m-    if (ccp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cc = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (cc == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cc->hash = 1;[m
[31m-    ngx_str_set(&cc->key, "Cache-Control");[m
[31m-    cc->value = *value;[m
[31m-[m
[31m-    *ccp = cc;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_last_modified(ngx_http_request_t *r, ngx_http_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    if (ngx_http_set_response_header(r, hv, value) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.last_modified_time =[m
[31m-        (value->len) ? ngx_parse_http_time(value->data, value->len) : -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_response_header(ngx_http_request_t *r, ngx_http_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h, **old;[m
[31m-[m
[31m-    old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        if (*old) {[m
[31m-            (*old)->hash = 0;[m
[31m-            *old = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (*old) {[m
[31m-        h = *old;[m
[31m-[m
[31m-    } else {[m
[31m-        h = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *old = h;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = 1;[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_headers_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_headers_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_headers_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->headers = NULL;[m
[31m-     *     conf->expires_time = 0;[m
[31m-     *     conf->expires_value = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->expires = NGX_HTTP_EXPIRES_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_headers_conf_t *prev = parent;[m
[31m-    ngx_http_headers_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->expires == NGX_HTTP_EXPIRES_UNSET) {[m
[31m-        conf->expires = prev->expires;[m
[31m-        conf->expires_time = prev->expires_time;[m
[31m-        conf->expires_value = prev->expires_value;[m
[31m-[m
[31m-        if (conf->expires == NGX_HTTP_EXPIRES_UNSET) {[m
[31m-            conf->expires = NGX_HTTP_EXPIRES_OFF;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers == NULL) {[m
[31m-        conf->headers = prev->headers;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_headers_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_headers_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_headers_conf_t *hcf = conf;[m
[31m-[m
[31m-    char                              *err;[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_int_t                          rc;[m
[31m-    ngx_uint_t                         n;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (hcf->expires != NGX_HTTP_EXPIRES_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        hcf->expires = NGX_HTTP_EXPIRES_ACCESS;[m
[31m-[m
[31m-        n = 1;[m
[31m-[m
[31m-    } else { /* cf->args->nelts == 3 */[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "modified") != 0) {[m
[31m-            return "invalid value";[m
[31m-        }[m
[31m-[m
[31m-        hcf->expires = NGX_HTTP_EXPIRES_MODIFIED;[m
[31m-[m
[31m-        n = 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[n];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        hcf->expires_value = ngx_palloc(cf->pool,[m
[31m-                                        sizeof(ngx_http_complex_value_t));[m
[31m-        if (hcf->expires_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *hcf->expires_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_parse_expires(&value[n], &hcf->expires, &hcf->expires_time,[m
[31m-                                &err);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return err;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_headers_add(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_headers_conf_t *hcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_header_val_t             *hv;[m
[31m-    ngx_http_set_header_t             *set;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (hcf->headers == NULL) {[m
[31m-        hcf->headers = ngx_array_create(cf->pool, 1,[m
[31m-                                        sizeof(ngx_http_header_val_t));[m
[31m-        if (hcf->headers == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hv = ngx_array_push(hcf->headers);[m
[31m-    if (hv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hv->key = value[1];[m
[31m-    hv->handler = ngx_http_add_header;[m
[31m-    hv->offset = 0;[m
[31m-    hv->always = 0;[m
[31m-[m
[31m-    set = ngx_http_set_headers;[m
[31m-    for (i = 0; set[i].name.len; i++) {[m
[31m-        if (ngx_strcasecmp(value[1].data, set[i].name.data) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hv->offset = set[i].offset;[m
[31m-        hv->handler = set[i].handler;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (value[2].len == 0) {[m
[31m-        ngx_memzero(&hv->value, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[2];[m
[31m-        ccv.complex_value = &hv->value;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[3].data, "always") != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[3]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hv->always = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_image_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_image_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex b608de1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_image_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1521 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <gd.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMAGE_OFF       0[m
[31m-#define NGX_HTTP_IMAGE_TEST      1[m
[31m-#define NGX_HTTP_IMAGE_SIZE      2[m
[31m-#define NGX_HTTP_IMAGE_RESIZE    3[m
[31m-#define NGX_HTTP_IMAGE_CROP      4[m
[31m-#define NGX_HTTP_IMAGE_ROTATE    5[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMAGE_START     0[m
[31m-#define NGX_HTTP_IMAGE_READ      1[m
[31m-#define NGX_HTTP_IMAGE_PROCESS   2[m
[31m-#define NGX_HTTP_IMAGE_PASS      3[m
[31m-#define NGX_HTTP_IMAGE_DONE      4[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMAGE_NONE      0[m
[31m-#define NGX_HTTP_IMAGE_JPEG      1[m
[31m-#define NGX_HTTP_IMAGE_GIF       2[m
[31m-#define NGX_HTTP_IMAGE_PNG       3[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMAGE_BUFFERED  0x08[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                   filter;[m
[31m-    ngx_uint_t                   width;[m
[31m-    ngx_uint_t                   height;[m
[31m-    ngx_uint_t                   angle;[m
[31m-    ngx_uint_t                   jpeg_quality;[m
[31m-    ngx_uint_t                   sharpen;[m
[31m-[m
[31m-    ngx_flag_t                   transparency;[m
[31m-    ngx_flag_t                   interlace;[m
[31m-[m
[31m-    ngx_http_complex_value_t    *wcv;[m
[31m-    ngx_http_complex_value_t    *hcv;[m
[31m-    ngx_http_complex_value_t    *acv;[m
[31m-    ngx_http_complex_value_t    *jqcv;[m
[31m-    ngx_http_complex_value_t    *shcv;[m
[31m-[m
[31m-    size_t                       buffer_size;[m
[31m-} ngx_http_image_filter_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                      *image;[m
[31m-    u_char                      *last;[m
[31m-[m
[31m-    size_t                       length;[m
[31m-[m
[31m-    ngx_uint_t                   width;[m
[31m-    ngx_uint_t                   height;[m
[31m-    ngx_uint_t                   max_width;[m
[31m-    ngx_uint_t                   max_height;[m
[31m-    ngx_uint_t                   angle;[m
[31m-[m
[31m-    ngx_uint_t                   phase;[m
[31m-    ngx_uint_t                   type;[m
[31m-    ngx_uint_t                   force;[m
[31m-} ngx_http_image_filter_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_image_send(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx, ngx_chain_t *in);[m
[31m-static ngx_uint_t ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_image_read(ngx_http_request_t *r, ngx_chain_t *in);[m
[31m-static ngx_buf_t *ngx_http_image_process(ngx_http_request_t *r);[m
[31m-static ngx_buf_t *ngx_http_image_json(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-static ngx_buf_t *ngx_http_image_asis(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-static void ngx_http_image_length(ngx_http_request_t *r, ngx_buf_t *b);[m
[31m-static ngx_int_t ngx_http_image_size(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-[m
[31m-static ngx_buf_t *ngx_http_image_resize(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-static gdImagePtr ngx_http_image_source(ngx_http_request_t *r,[m
[31m-    ngx_http_image_filter_ctx_t *ctx);[m
[31m-static gdImagePtr ngx_http_image_new(ngx_http_request_t *r, int w, int h,[m
[31m-    int colors);[m
[31m-static u_char *ngx_http_image_out(ngx_http_request_t *r, ngx_uint_t type,[m
[31m-    gdImagePtr img, int *size);[m
[31m-static void ngx_http_image_cleanup(void *data);[m
[31m-static ngx_uint_t ngx_http_image_filter_get_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *cv, ngx_uint_t v);[m
[31m-static ngx_uint_t ngx_http_image_filter_value(ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_image_filter_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_image_filter_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_image_filter(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_image_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_image_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("image_filter"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_http_image_filter,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_jpeg_quality"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_image_filter_jpeg_quality,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_sharpen"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_image_filter_sharpen,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_transparency"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_image_filter_conf_t, transparency),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_interlace"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_image_filter_conf_t, interlace),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("image_filter_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_image_filter_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_image_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_image_filter_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_image_filter_create_conf,     /* create location configuration */[m
[31m-    ngx_http_image_filter_merge_conf       /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_image_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_image_filter_module_ctx,     /* module context */[m
[31m-    ngx_http_image_filter_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_image_types[] = {[m
[31m-    ngx_string("image/jpeg"),[m
[31m-    ngx_string("image/gif"),[m
[31m-    ngx_string("image/png")[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                          len;[m
[31m-    ngx_http_image_filter_ctx_t   *ctx;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_image_filter_module);[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_OFF) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len[m
[31m-            >= sizeof("multipart/x-mixed-replace") - 1[m
[31m-        && ngx_strncasecmp(r->headers_out.content_type.data,[m
[31m-                           (u_char *) "multipart/x-mixed-replace",[m
[31m-                           sizeof("multipart/x-mixed-replace") - 1)[m
[31m-           == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "image filter: multipart/x-mixed-replace response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_image_filter_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_image_filter_module);[m
[31m-[m
[31m-    len = r->headers_out.content_length_n;[m
[31m-[m
[31m-    if (len != -1 && len > (off_t) conf->buffer_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "image filter: too big response: %O", len);[m
[31m-[m
[31m-        return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;[m
[31m-    }[m
[31m-[m
[31m-    if (len == -1) {[m
[31m-        ctx->length = conf->buffer_size;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->length = (size_t) len;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.refresh) {[m
[31m-        r->headers_out.refresh->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->main_filter_need_in_memory = 1;[m
[31m-    r->allow_ranges = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_str_t                     *ct;[m
[31m-    ngx_chain_t                    out;[m
[31m-    ngx_http_image_filter_ctx_t   *ctx;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "image filter");[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    switch (ctx->phase) {[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_START:[m
[31m-[m
[31m-        ctx->type = ngx_http_image_test(r, in);[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-        if (ctx->type == NGX_HTTP_IMAGE_NONE) {[m
[31m-[m
[31m-            if (conf->filter == NGX_HTTP_IMAGE_SIZE) {[m
[31m-                out.buf = ngx_http_image_json(r, NULL);[m
[31m-[m
[31m-                if (out.buf) {[m
[31m-                    out.next = NULL;[m
[31m-                    ctx->phase = NGX_HTTP_IMAGE_DONE;[m
[31m-[m
[31m-                    return ngx_http_image_send(r, ctx, &out);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return ngx_http_filter_finalize_request(r,[m
[31m-                                              &ngx_http_image_filter_module,[m
[31m-                                              NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);[m
[31m-        }[m
[31m-[m
[31m-        /* override content type */[m
[31m-[m
[31m-        ct = &ngx_http_image_types[ctx->type - 1];[m
[31m-        r->headers_out.content_type_len = ct->len;[m
[31m-        r->headers_out.content_type = *ct;[m
[31m-        r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-        if (conf->filter == NGX_HTTP_IMAGE_TEST) {[m
[31m-            ctx->phase = NGX_HTTP_IMAGE_PASS;[m
[31m-[m
[31m-            return ngx_http_image_send(r, ctx, in);[m
[31m-        }[m
[31m-[m
[31m-        ctx->phase = NGX_HTTP_IMAGE_READ;[m
[31m-[m
[31m-        /* fall through */[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_READ:[m
[31m-[m
[31m-        rc = ngx_http_image_read(r, in);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return ngx_http_filter_finalize_request(r,[m
[31m-                                              &ngx_http_image_filter_module,[m
[31m-                                              NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);[m
[31m-        }[m
[31m-[m
[31m-        /* fall through */[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PROCESS:[m
[31m-[m
[31m-        out.buf = ngx_http_image_process(r);[m
[31m-[m
[31m-        if (out.buf == NULL) {[m
[31m-            return ngx_http_filter_finalize_request(r,[m
[31m-                                              &ngx_http_image_filter_module,[m
[31m-                                              NGX_HTTP_UNSUPPORTED_MEDIA_TYPE);[m
[31m-        }[m
[31m-[m
[31m-        out.next = NULL;[m
[31m-        ctx->phase = NGX_HTTP_IMAGE_PASS;[m
[31m-[m
[31m-        return ngx_http_image_send(r, ctx, &out);[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PASS:[m
[31m-[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-[m
[31m-    default: /* NGX_HTTP_IMAGE_DONE */[m
[31m-[m
[31m-        rc = ngx_http_next_body_filter(r, NULL);[m
[31m-[m
[31m-        /* NGX_ERROR resets any pending data */[m
[31m-        return (rc == NGX_OK) ? NGX_ERROR : rc;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_send(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    rc = ngx_http_next_header_filter(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, in);[m
[31m-[m
[31m-    if (ctx->phase == NGX_HTTP_IMAGE_DONE) {[m
[31m-        /* NGX_ERROR resets any pending data */[m
[31m-        return (rc == NGX_OK) ? NGX_ERROR : rc;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = in->buf->pos;[m
[31m-[m
[31m-    if (in->buf->last - p < 16) {[m
[31m-        return NGX_HTTP_IMAGE_NONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "image filter: \"%c%c\"", p[0], p[1]);[m
[31m-[m
[31m-    if (p[0] == 0xff && p[1] == 0xd8) {[m
[31m-[m
[31m-        /* JPEG */[m
[31m-[m
[31m-        return NGX_HTTP_IMAGE_JPEG;[m
[31m-[m
[31m-    } else if (p[0] == 'G' && p[1] == 'I' && p[2] == 'F' && p[3] == '8'[m
[31m-               && p[5] == 'a')[m
[31m-    {[m
[31m-        if (p[4] == '9' || p[4] == '7') {[m
[31m-            /* GIF */[m
[31m-            return NGX_HTTP_IMAGE_GIF;[m
[31m-        }[m
[31m-[m
[31m-    } else if (p[0] == 0x89 && p[1] == 'P' && p[2] == 'N' && p[3] == 'G'[m
[31m-               && p[4] == 0x0d && p[5] == 0x0a && p[6] == 0x1a && p[7] == 0x0a)[m
[31m-    {[m
[31m-        /* PNG */[m
[31m-[m
[31m-        return NGX_HTTP_IMAGE_PNG;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_IMAGE_NONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_read(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size, rest;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_chain_t                  *cl;[m
[31m-    ngx_http_image_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (ctx->image == NULL) {[m
[31m-        ctx->image = ngx_palloc(r->pool, ctx->length);[m
[31m-        if (ctx->image == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->last = ctx->image;[m
[31m-    }[m
[31m-[m
[31m-    p = ctx->last;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-        size = b->last - b->pos;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "image buf: %uz", size);[m
[31m-[m
[31m-        rest = ctx->image + ctx->length - p;[m
[31m-[m
[31m-        if (size > rest) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "image filter: too big response");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, b->pos, size);[m
[31m-        b->pos += size;[m
[31m-[m
[31m-        if (b->last_buf) {[m
[31m-            ctx->last = p;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->last = p;[m
[31m-    r->connection->buffered |= NGX_HTTP_IMAGE_BUFFERED;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_image_process(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_http_image_filter_ctx_t   *ctx;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    r->connection->buffered &= ~NGX_HTTP_IMAGE_BUFFERED;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    rc = ngx_http_image_size(r, ctx);[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_SIZE) {[m
[31m-        return ngx_http_image_json(r, rc == NGX_OK ? ctx : NULL);[m
[31m-    }[m
[31m-[m
[31m-    ctx->angle = ngx_http_image_filter_get_value(r, conf->acv, conf->angle);[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_ROTATE) {[m
[31m-[m
[31m-        if (ctx->angle != 90 && ctx->angle != 180 && ctx->angle != 270) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_image_resize(r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    ctx->max_width = ngx_http_image_filter_get_value(r, conf->wcv, conf->width);[m
[31m-    if (ctx->max_width == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ctx->max_height = ngx_http_image_filter_get_value(r, conf->hcv,[m
[31m-                                                      conf->height);[m
[31m-    if (ctx->max_height == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK[m
[31m-        && ctx->width <= ctx->max_width[m
[31m-        && ctx->height <= ctx->max_height[m
[31m-        && ctx->angle == 0[m
[31m-        && !ctx->force)[m
[31m-    {[m
[31m-        return ngx_http_image_asis(r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_image_resize(r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_image_json(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    ngx_buf_t  *b;[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    ngx_http_clean_header(r);[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_type_len = sizeof("application/json") - 1;[m
[31m-    ngx_str_set(&r->headers_out.content_type, "application/json");[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        b->pos = (u_char *) "{}" CRLF;[m
[31m-        b->last = b->pos + sizeof("{}" CRLF) - 1;[m
[31m-[m
[31m-        ngx_http_image_length(r, b);[m
[31m-[m
[31m-        return b;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("{ \"img\" : "[m
[31m-                 "{ \"width\": , \"height\": , \"type\": \"jpeg\" } }" CRLF) - 1[m
[31m-          + 2 * NGX_SIZE_T_LEN;[m
[31m-[m
[31m-    b->pos = ngx_pnalloc(r->pool, len);[m
[31m-    if (b->pos == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->pos,[m
[31m-                          "{ \"img\" : "[m
[31m-                                       "{ \"width\": %uz,"[m
[31m-                                        " \"height\": %uz,"[m
[31m-                                        " \"type\": \"%s\" } }" CRLF,[m
[31m-                          ctx->width, ctx->height,[m
[31m-                          ngx_http_image_types[ctx->type - 1].data + 6);[m
[31m-[m
[31m-    ngx_http_image_length(r, b);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_image_asis(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_buf_t  *b;[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = ctx->image;[m
[31m-    b->last = ctx->last;[m
[31m-    b->memory = 1;[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    ngx_http_image_length(r, b);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_image_length(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    r->headers_out.content_length_n = b->last - b->pos;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char      *p, *last;[m
[31m-    size_t       len, app;[m
[31m-    ngx_uint_t   width, height;[m
[31m-[m
[31m-    p = ctx->image;[m
[31m-[m
[31m-    switch (ctx->type) {[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_JPEG:[m
[31m-[m
[31m-        p += 2;[m
[31m-        last = ctx->image + ctx->length - 10;[m
[31m-        width = 0;[m
[31m-        height = 0;[m
[31m-        app = 0;[m
[31m-[m
[31m-        while (p < last) {[m
[31m-[m
[31m-            if (p[0] == 0xff && p[1] != 0xff) {[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "JPEG: %02xd %02xd", p[0], p[1]);[m
[31m-[m
[31m-                p++;[m
[31m-[m
[31m-                if ((*p == 0xc0 || *p == 0xc1 || *p == 0xc2 || *p == 0xc3[m
[31m-                     || *p == 0xc9 || *p == 0xca || *p == 0xcb)[m
[31m-                    && (width == 0 || height == 0))[m
[31m-                {[m
[31m-                    width = p[6] * 256 + p[7];[m
[31m-                    height = p[4] * 256 + p[5];[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "JPEG: %02xd %02xd", p[1], p[2]);[m
[31m-[m
[31m-                len = p[1] * 256 + p[2];[m
[31m-[m
[31m-                if (*p >= 0xe1 && *p <= 0xef) {[m
[31m-                    /* application data, e.g., EXIF, Adobe XMP, etc. */[m
[31m-                    app += len;[m
[31m-                }[m
[31m-[m
[31m-                p += len;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (width == 0 || height == 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->length / 20 < app) {[m
[31m-            /* force conversion if application data consume more than 5% */[m
[31m-            ctx->force = 1;[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "app data size: %uz", app);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_GIF:[m
[31m-[m
[31m-        if (ctx->length < 10) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        width = p[7] * 256 + p[6];[m
[31m-        height = p[9] * 256 + p[8];[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PNG:[m
[31m-[m
[31m-        if (ctx->length < 24) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        width = p[18] * 256 + p[19];[m
[31m-        height = p[22] * 256 + p[23];[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "image size: %d x %d", (int) width, (int) height);[m
[31m-[m
[31m-    ctx->width = width;[m
[31m-    ctx->height = height;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_image_resize(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    int                            sx, sy, dx, dy, ox, oy, ax, ay, size,[m
[31m-                                   colors, palette, transparent, sharpen,[m
[31m-                                   red, green, blue, t;[m
[31m-    u_char                        *out;[m
[31m-    ngx_buf_t                     *b;[m
[31m-    ngx_uint_t                     resize;[m
[31m-    gdImagePtr                     src, dst;[m
[31m-    ngx_pool_cleanup_t            *cln;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    src = ngx_http_image_source(r, ctx);[m
[31m-[m
[31m-    if (src == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    sx = gdImageSX(src);[m
[31m-    sy = gdImageSY(src);[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-    if (!ctx->force[m
[31m-        && ctx->angle == 0[m
[31m-        && (ngx_uint_t) sx <= ctx->max_width[m
[31m-        && (ngx_uint_t) sy <= ctx->max_height)[m
[31m-    {[m
[31m-        gdImageDestroy(src);[m
[31m-        return ngx_http_image_asis(r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    colors = gdImageColorsTotal(src);[m
[31m-[m
[31m-    if (colors && conf->transparency) {[m
[31m-        transparent = gdImageGetTransparent(src);[m
[31m-[m
[31m-        if (transparent != -1) {[m
[31m-            palette = colors;[m
[31m-            red = gdImageRed(src, transparent);[m
[31m-            green = gdImageGreen(src, transparent);[m
[31m-            blue = gdImageBlue(src, transparent);[m
[31m-[m
[31m-            goto transparent;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    palette = 0;[m
[31m-    transparent = -1;[m
[31m-    red = 0;[m
[31m-    green = 0;[m
[31m-    blue = 0;[m
[31m-[m
[31m-transparent:[m
[31m-[m
[31m-    gdImageColorTransparent(src, -1);[m
[31m-[m
[31m-    dx = sx;[m
[31m-    dy = sy;[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_RESIZE) {[m
[31m-[m
[31m-        if ((ngx_uint_t) dx > ctx->max_width) {[m
[31m-            dy = dy * ctx->max_width / dx;[m
[31m-            dy = dy ? dy : 1;[m
[31m-            dx = ctx->max_width;[m
[31m-        }[m
[31m-[m
[31m-        if ((ngx_uint_t) dy > ctx->max_height) {[m
[31m-            dx = dx * ctx->max_height / dy;[m
[31m-            dx = dx ? dx : 1;[m
[31m-            dy = ctx->max_height;[m
[31m-        }[m
[31m-[m
[31m-        resize = 1;[m
[31m-[m
[31m-    } else if (conf->filter == NGX_HTTP_IMAGE_ROTATE) {[m
[31m-[m
[31m-        resize = 0;[m
[31m-[m
[31m-    } else { /* NGX_HTTP_IMAGE_CROP */[m
[31m-[m
[31m-        resize = 0;[m
[31m-[m
[31m-        if ((double) dx / dy < (double) ctx->max_width / ctx->max_height) {[m
[31m-            if ((ngx_uint_t) dx > ctx->max_width) {[m
[31m-                dy = dy * ctx->max_width / dx;[m
[31m-                dy = dy ? dy : 1;[m
[31m-                dx = ctx->max_width;[m
[31m-                resize = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if ((ngx_uint_t) dy > ctx->max_height) {[m
[31m-                dx = dx * ctx->max_height / dy;[m
[31m-                dx = dx ? dx : 1;[m
[31m-                dy = ctx->max_height;[m
[31m-                resize = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (resize) {[m
[31m-        dst = ngx_http_image_new(r, dx, dy, palette);[m
[31m-        if (dst == NULL) {[m
[31m-            gdImageDestroy(src);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (colors == 0) {[m
[31m-            gdImageSaveAlpha(dst, 1);[m
[31m-            gdImageAlphaBlending(dst, 0);[m
[31m-        }[m
[31m-[m
[31m-        gdImageCopyResampled(dst, src, 0, 0, 0, 0, dx, dy, sx, sy);[m
[31m-[m
[31m-        if (colors) {[m
[31m-            gdImageTrueColorToPalette(dst, 1, 256);[m
[31m-        }[m
[31m-[m
[31m-        gdImageDestroy(src);[m
[31m-[m
[31m-    } else {[m
[31m-        dst = src;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->angle) {[m
[31m-        src = dst;[m
[31m-[m
[31m-        ax = (dx % 2 == 0) ? 1 : 0;[m
[31m-        ay = (dy % 2 == 0) ? 1 : 0;[m
[31m-[m
[31m-        switch (ctx->angle) {[m
[31m-[m
[31m-        case 90:[m
[31m-        case 270:[m
[31m-            dst = ngx_http_image_new(r, dy, dx, palette);[m
[31m-            if (dst == NULL) {[m
[31m-                gdImageDestroy(src);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-            if (ctx->angle == 90) {[m
[31m-                ox = dy / 2 + ay;[m
[31m-                oy = dx / 2 - ax;[m
[31m-[m
[31m-            } else {[m
[31m-                ox = dy / 2 - ay;[m
[31m-                oy = dx / 2 + ax;[m
[31m-            }[m
[31m-[m
[31m-            gdImageCopyRotated(dst, src, ox, oy, 0, 0,[m
[31m-                               dx + ax, dy + ay, ctx->angle);[m
[31m-            gdImageDestroy(src);[m
[31m-[m
[31m-            t = dx;[m
[31m-            dx = dy;[m
[31m-            dy = t;[m
[31m-            break;[m
[31m-[m
[31m-        case 180:[m
[31m-            dst = ngx_http_image_new(r, dx, dy, palette);[m
[31m-            if (dst == NULL) {[m
[31m-                gdImageDestroy(src);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-            gdImageCopyRotated(dst, src, dx / 2 - ax, dy / 2 - ay, 0, 0,[m
[31m-                               dx + ax, dy + ay, ctx->angle);[m
[31m-            gdImageDestroy(src);[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->filter == NGX_HTTP_IMAGE_CROP) {[m
[31m-[m
[31m-        src = dst;[m
[31m-[m
[31m-        if ((ngx_uint_t) dx > ctx->max_width) {[m
[31m-            ox = dx - ctx->max_width;[m
[31m-[m
[31m-        } else {[m
[31m-            ox = 0;[m
[31m-        }[m
[31m-[m
[31m-        if ((ngx_uint_t) dy > ctx->max_height) {[m
[31m-            oy = dy - ctx->max_height;[m
[31m-[m
[31m-        } else {[m
[31m-            oy = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ox || oy) {[m
[31m-[m
[31m-            dst = ngx_http_image_new(r, dx - ox, dy - oy, colors);[m
[31m-[m
[31m-            if (dst == NULL) {[m
[31m-                gdImageDestroy(src);[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            ox /= 2;[m
[31m-            oy /= 2;[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "image crop: %d x %d @ %d x %d",[m
[31m-                           dx, dy, ox, oy);[m
[31m-[m
[31m-            if (colors == 0) {[m
[31m-                gdImageSaveAlpha(dst, 1);[m
[31m-                gdImageAlphaBlending(dst, 0);[m
[31m-            }[m
[31m-[m
[31m-            gdImageCopy(dst, src, 0, 0, ox, oy, dx - ox, dy - oy);[m
[31m-[m
[31m-            if (colors) {[m
[31m-                gdImageTrueColorToPalette(dst, 1, 256);[m
[31m-            }[m
[31m-[m
[31m-            gdImageDestroy(src);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (transparent != -1 && colors) {[m
[31m-        gdImageColorTransparent(dst, gdImageColorExact(dst, red, green, blue));[m
[31m-    }[m
[31m-[m
[31m-    sharpen = ngx_http_image_filter_get_value(r, conf->shcv, conf->sharpen);[m
[31m-    if (sharpen > 0) {[m
[31m-        gdImageSharpen(dst, sharpen);[m
[31m-    }[m
[31m-[m
[31m-    gdImageInterlace(dst, (int) conf->interlace);[m
[31m-[m
[31m-    out = ngx_http_image_out(r, ctx->type, dst, &size);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "image: %d x %d %d", sx, sy, colors);[m
[31m-[m
[31m-    gdImageDestroy(dst);[m
[31m-    ngx_pfree(r->pool, ctx->image);[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        gdFree(out);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        gdFree(out);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_image_cleanup;[m
[31m-    cln->data = out;[m
[31m-[m
[31m-    b->pos = out;[m
[31m-    b->last = out + size;[m
[31m-    b->memory = 1;[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    ngx_http_image_length(r, b);[m
[31m-    ngx_http_weak_etag(r);[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static gdImagePtr[m
[31m-ngx_http_image_source(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    char        *failed;[m
[31m-    gdImagePtr   img;[m
[31m-[m
[31m-    img = NULL;[m
[31m-[m
[31m-    switch (ctx->type) {[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_JPEG:[m
[31m-        img = gdImageCreateFromJpegPtr(ctx->length, ctx->image);[m
[31m-        failed = "gdImageCreateFromJpegPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_GIF:[m
[31m-        img = gdImageCreateFromGifPtr(ctx->length, ctx->image);[m
[31m-        failed = "gdImageCreateFromGifPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PNG:[m
[31m-        img = gdImageCreateFromPngPtr(ctx->length, ctx->image);[m
[31m-        failed = "gdImageCreateFromPngPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        failed = "unknown image type";[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (img == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, failed);[m
[31m-    }[m
[31m-[m
[31m-    return img;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static gdImagePtr[m
[31m-ngx_http_image_new(ngx_http_request_t *r, int w, int h, int colors)[m
[31m-{[m
[31m-    gdImagePtr  img;[m
[31m-[m
[31m-    if (colors == 0) {[m
[31m-        img = gdImageCreateTrueColor(w, h);[m
[31m-[m
[31m-        if (img == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "gdImageCreateTrueColor() failed");[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        img = gdImageCreate(w, h);[m
[31m-[m
[31m-        if (img == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "gdImageCreate() failed");[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return img;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_image_out(ngx_http_request_t *r, ngx_uint_t type, gdImagePtr img,[m
[31m-    int *size)[m
[31m-{[m
[31m-    char                          *failed;[m
[31m-    u_char                        *out;[m
[31m-    ngx_int_t                      jq;[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    out = NULL;[m
[31m-[m
[31m-    switch (type) {[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_JPEG:[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);[m
[31m-[m
[31m-        jq = ngx_http_image_filter_get_value(r, conf->jqcv, conf->jpeg_quality);[m
[31m-        if (jq <= 0) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        out = gdImageJpegPtr(img, size, jq);[m
[31m-        failed = "gdImageJpegPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_GIF:[m
[31m-        out = gdImageGifPtr(img, size);[m
[31m-        failed = "gdImageGifPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_IMAGE_PNG:[m
[31m-        out = gdImagePngPtr(img, size);[m
[31m-        failed = "gdImagePngPtr() failed";[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        failed = "unknown image type";[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, failed);[m
[31m-    }[m
[31m-[m
[31m-    return out;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_image_cleanup(void *data)[m
[31m-{[m
[31m-    gdFree(data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_image_filter_get_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *cv, ngx_uint_t v)[m
[31m-{[m
[31m-    ngx_str_t  val;[m
[31m-[m
[31m-    if (cv == NULL) {[m
[31m-        return v;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, cv, &val) != NGX_OK) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_image_filter_value(&val);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_image_filter_value(ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    if (value->len == 1 && value->data[0] == '-') {[m
[31m-        return (ngx_uint_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(value->data, value->len);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return (ngx_uint_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_image_filter_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_image_filter_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->width = 0;[m
[31m-     *     conf->height = 0;[m
[31m-     *     conf->angle = 0;[m
[31m-     *     conf->wcv = NULL;[m
[31m-     *     conf->hcv = NULL;[m
[31m-     *     conf->acv = NULL;[m
[31m-     *     conf->jqcv = NULL;[m
[31m-     *     conf->shcv = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->filter = NGX_CONF_UNSET_UINT;[m
[31m-    conf->jpeg_quality = NGX_CONF_UNSET_UINT;[m
[31m-    conf->sharpen = NGX_CONF_UNSET_UINT;[m
[31m-    conf->transparency = NGX_CONF_UNSET;[m
[31m-    conf->interlace = NGX_CONF_UNSET;[m
[31m-    conf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_image_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t *prev = parent;[m
[31m-    ngx_http_image_filter_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->filter == NGX_CONF_UNSET_UINT) {[m
[31m-[m
[31m-        if (prev->filter == NGX_CONF_UNSET_UINT) {[m
[31m-            conf->filter = NGX_HTTP_IMAGE_OFF;[m
[31m-[m
[31m-        } else {[m
[31m-            conf->filter = prev->filter;[m
[31m-            conf->width = prev->width;[m
[31m-            conf->height = prev->height;[m
[31m-            conf->angle = prev->angle;[m
[31m-            conf->wcv = prev->wcv;[m
[31m-            conf->hcv = prev->hcv;[m
[31m-            conf->acv = prev->acv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->jpeg_quality == NGX_CONF_UNSET_UINT) {[m
[31m-[m
[31m-        /* 75 is libjpeg default quality */[m
[31m-        ngx_conf_merge_uint_value(conf->jpeg_quality, prev->jpeg_quality, 75);[m
[31m-[m
[31m-        if (conf->jqcv == NULL) {[m
[31m-            conf->jqcv = prev->jqcv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->sharpen == NGX_CONF_UNSET_UINT) {[m
[31m-        ngx_conf_merge_uint_value(conf->sharpen, prev->sharpen, 0);[m
[31m-[m
[31m-        if (conf->shcv == NULL) {[m
[31m-            conf->shcv = prev->shcv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->transparency, prev->transparency, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->interlace, prev->interlace, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,[m
[31m-                              1 * 1024 * 1024);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_image_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t *imcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_int_t                          n;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    i = 1;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            imcf->filter = NGX_HTTP_IMAGE_OFF;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[i].data, "test") == 0) {[m
[31m-            imcf->filter = NGX_HTTP_IMAGE_TEST;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[i].data, "size") == 0) {[m
[31m-            imcf->filter = NGX_HTTP_IMAGE_SIZE;[m
[31m-[m
[31m-        } else {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    } else if (cf->args->nelts == 3) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "rotate") == 0) {[m
[31m-            if (imcf->filter != NGX_HTTP_IMAGE_RESIZE[m
[31m-                && imcf->filter != NGX_HTTP_IMAGE_CROP)[m
[31m-            {[m
[31m-                imcf->filter = NGX_HTTP_IMAGE_ROTATE;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &value[++i];[m
[31m-            ccv.complex_value = &cv;[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (cv.lengths == NULL) {[m
[31m-                n = ngx_http_image_filter_value(&value[i]);[m
[31m-[m
[31m-                if (n != 90 && n != 180 && n != 270) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                imcf->angle = (ngx_uint_t) n;[m
[31m-[m
[31m-            } else {[m
[31m-                imcf->acv = ngx_palloc(cf->pool,[m
[31m-                                       sizeof(ngx_http_complex_value_t));[m
[31m-                if (imcf->acv == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                *imcf->acv = cv;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[i].data, "resize") == 0) {[m
[31m-        imcf->filter = NGX_HTTP_IMAGE_RESIZE;[m
[31m-[m
[31m-    } else if (ngx_strcmp(value[i].data, "crop") == 0) {[m
[31m-        imcf->filter = NGX_HTTP_IMAGE_CROP;[m
[31m-[m
[31m-    } else {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[++i];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths == NULL) {[m
[31m-        n = ngx_http_image_filter_value(&value[i]);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        imcf->width = (ngx_uint_t) n;[m
[31m-[m
[31m-    } else {[m
[31m-        imcf->wcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (imcf->wcv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *imcf->wcv = cv;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[++i];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths == NULL) {[m
[31m-        n = ngx_http_image_filter_value(&value[i]);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        imcf->height = (ngx_uint_t) n;[m
[31m-[m
[31m-    } else {[m
[31m-        imcf->hcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (imcf->hcv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *imcf->hcv = cv;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%V\"",[m
[31m-                       &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t *imcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_int_t                          n;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths == NULL) {[m
[31m-        n = ngx_http_image_filter_value(&value[1]);[m
[31m-[m
[31m-        if (n <= 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        imcf->jpeg_quality = (ngx_uint_t) n;[m
[31m-[m
[31m-    } else {[m
[31m-        imcf->jqcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (imcf->jqcv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *imcf->jqcv = cv;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_http_image_filter_conf_t *imcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_int_t                          n;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths == NULL) {[m
[31m-        n = ngx_http_image_filter_value(&value[1]);[m
[31m-[m
[31m-        if (n < 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        imcf->sharpen = (ngx_uint_t) n;[m
[31m-[m
[31m-    } else {[m
[31m-        imcf->shcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (imcf->shcv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *imcf->shcv = cv;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_image_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_image_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_image_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_index_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_index_module.c[m
[1mdeleted file mode 100644[m
[1mindex d3544db..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_index_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,540 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                name;[m
[31m-    ngx_array_t             *lengths;[m
[31m-    ngx_array_t             *values;[m
[31m-} ngx_http_index_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t             *indices;    /* array of ngx_http_index_t */[m
[31m-    size_t                   max_index_len;[m
[31m-} ngx_http_index_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_DEFAULT_INDEX   "index.html"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_index_test_dir(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, u_char *path, u_char *last);[m
[31m-static ngx_int_t ngx_http_index_error(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, u_char *file, ngx_err_t err);[m
[31m-[m
[31m-static ngx_int_t ngx_http_index_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_index_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_index_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static char *ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_index_commands[] = {[m
[31m-[m
[31m-    { ngx_string("index"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_index_set_index,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_index_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_index_init,                   /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_index_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_index_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_index_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_index_module_ctx,            /* module context */[m
[31m-    ngx_http_index_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Try to open/test the first index file before the test of directory[m
[31m- * existence because valid requests should prevail over invalid ones.[m
[31m- * If open()/stat() of a file will fail then stat() of a directory[m
[31m- * should be faster because kernel may have already cached some data.[m
[31m- * Besides, Win32 may return ERROR_PATH_NOT_FOUND (NGX_ENOTDIR) at once.[m
[31m- * Unix has ENOTDIR error; however, it's less helpful than Win32's one:[m
[31m- * it only indicates that path points to a regular file, not a directory.[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_index_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                       *p, *name;[m
[31m-    size_t                        len, root, reserve, allocated;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_str_t                     path, uri;[m
[31m-    ngx_uint_t                    i, dir_tested;[m
[31m-    ngx_http_index_t             *index;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_index_loc_conf_t    *ilcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ilcf = ngx_http_get_module_loc_conf(r, ngx_http_index_module);[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    allocated = 0;[m
[31m-    root = 0;[m
[31m-    dir_tested = 0;[m
[31m-    name = NULL;[m
[31m-    /* suppress MSVC warning */[m
[31m-    path.data = NULL;[m
[31m-[m
[31m-    index = ilcf->indices->elts;[m
[31m-    for (i = 0; i < ilcf->indices->nelts; i++) {[m
[31m-[m
[31m-        if (index[i].lengths == NULL) {[m
[31m-[m
[31m-            if (index[i].name.data[0] == '/') {[m
[31m-                return ngx_http_internal_redirect(r, &index[i].name, &r->args);[m
[31m-            }[m
[31m-[m
[31m-            reserve = ilcf->max_index_len;[m
[31m-            len = index[i].name.len;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-            e.ip = index[i].lengths->elts;[m
[31m-            e.request = r;[m
[31m-            e.flushed = 1;[m
[31m-[m
[31m-            /* 1 is for terminating '\0' as in static names */[m
[31m-            len = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-                len += lcode(&e);[m
[31m-            }[m
[31m-[m
[31m-            /* 16 bytes are preallocation */[m
[31m-[m
[31m-            reserve = len + 16;[m
[31m-        }[m
[31m-[m
[31m-        if (reserve > allocated) {[m
[31m-[m
[31m-            name = ngx_http_map_uri_to_path(r, &path, &root, reserve);[m
[31m-            if (name == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            allocated = path.data + path.len - name;[m
[31m-        }[m
[31m-[m
[31m-        if (index[i].values == NULL) {[m
[31m-[m
[31m-            /* index[i].name.len includes the terminating '\0' */[m
[31m-[m
[31m-            ngx_memcpy(name, index[i].name.data, index[i].name.len);[m
[31m-[m
[31m-            path.len = (name + index[i].name.len - 1) - path.data;[m
[31m-[m
[31m-        } else {[m
[31m-            e.ip = index[i].values->elts;[m
[31m-            e.pos = name;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-[m
[31m-            if (*name == '/') {[m
[31m-                uri.len = len - 1;[m
[31m-                uri.data = name;[m
[31m-                return ngx_http_internal_redirect(r, &uri, &r->args);[m
[31m-            }[m
[31m-[m
[31m-            path.len = e.pos - path.data;[m
[31m-[m
[31m-            *e.pos = '\0';[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "open index \"%V\"", &path);[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.read_ahead = clcf->read_ahead;[m
[31m-        of.directio = clcf->directio;[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, of.err,[m
[31m-                           "%s \"%s\" failed", of.failed, path.data);[m
[31m-[m
[31m-            if (of.err == 0) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-            if (of.err == NGX_EMLINK[m
[31m-                || of.err == NGX_ELOOP)[m
[31m-            {[m
[31m-                return NGX_HTTP_FORBIDDEN;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (of.err == NGX_ENOTDIR[m
[31m-                || of.err == NGX_ENAMETOOLONG[m
[31m-                || of.err == NGX_EACCES)[m
[31m-            {[m
[31m-                return ngx_http_index_error(r, clcf, path.data, of.err);[m
[31m-            }[m
[31m-[m
[31m-            if (!dir_tested) {[m
[31m-                rc = ngx_http_index_test_dir(r, clcf, path.data, name - 1);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                dir_tested = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (of.err == NGX_ENOENT) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, path.data);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        uri.len = r->uri.len + len - 1;[m
[31m-[m
[31m-        if (!clcf->alias) {[m
[31m-            uri.data = path.data + root;[m
[31m-[m
[31m-        } else {[m
[31m-            uri.data = ngx_pnalloc(r->pool, uri.len);[m
[31m-            if (uri.data == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_copy(uri.data, r->uri.data, r->uri.len);[m
[31m-            ngx_memcpy(p, name, len - 1);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_internal_redirect(r, &uri, &r->args);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_index_test_dir(ngx_http_request_t *r, ngx_http_core_loc_conf_t *clcf,[m
[31m-    u_char *path, u_char *last)[m
[31m-{[m
[31m-    u_char                c;[m
[31m-    ngx_str_t             dir;[m
[31m-    ngx_open_file_info_t  of;[m
[31m-[m
[31m-    c = *last;[m
[31m-    if (c != '/' || path == last) {[m
[31m-        /* "alias" without trailing slash */[m
[31m-        c = *(++last);[m
[31m-    }[m
[31m-    *last = '\0';[m
[31m-[m
[31m-    dir.len = last - path;[m
[31m-    dir.data = path;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http index check dir: \"%V\"", &dir);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.test_dir = 1;[m
[31m-    of.test_only = 1;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &dir, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &dir, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        if (of.err) {[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-            if (of.err == NGX_EMLINK[m
[31m-                || of.err == NGX_ELOOP)[m
[31m-            {[m
[31m-                return NGX_HTTP_FORBIDDEN;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (of.err == NGX_ENOENT) {[m
[31m-                *last = c;[m
[31m-                return ngx_http_index_error(r, clcf, dir.data, NGX_ENOENT);[m
[31m-            }[m
[31m-[m
[31m-            if (of.err == NGX_EACCES) {[m
[31m-[m
[31m-                *last = c;[m
[31m-[m
[31m-                /*[m
[31m-                 * ngx_http_index_test_dir() is called after the first index[m
[31m-                 * file testing has returned an error distinct from NGX_EACCES.[m
[31m-                 * This means that directory searching is allowed.[m
[31m-                 */[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, dir.data);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *last = c;[m
[31m-[m
[31m-    if (of.is_dir) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                  "\"%s\" is not a directory", dir.data);[m
[31m-[m
[31m-    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_index_error(ngx_http_request_t *r, ngx_http_core_loc_conf_t  *clcf,[m
[31m-    u_char *file, ngx_err_t err)[m
[31m-{[m
[31m-    if (err == NGX_EACCES) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, err,[m
[31m-                      "\"%s\" is forbidden", file);[m
[31m-[m
[31m-        return NGX_HTTP_FORBIDDEN;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->log_not_found) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, err,[m
[31m-                      "\"%s\" is not found", file);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_NOT_FOUND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_index_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_index_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_index_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->indices = NULL;[m
[31m-    conf->max_index_len = 0;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_index_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_index_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    ngx_http_index_t  *index;[m
[31m-[m
[31m-    if (conf->indices == NULL) {[m
[31m-        conf->indices = prev->indices;[m
[31m-        conf->max_index_len = prev->max_index_len;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->indices == NULL) {[m
[31m-        conf->indices = ngx_array_create(cf->pool, 1, sizeof(ngx_http_index_t));[m
[31m-        if (conf->indices == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index = ngx_array_push(conf->indices);[m
[31m-        if (index == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index->name.len = sizeof(NGX_HTTP_DEFAULT_INDEX);[m
[31m-        index->name.data = (u_char *) NGX_HTTP_DEFAULT_INDEX;[m
[31m-        index->lengths = NULL;[m
[31m-        index->values = NULL;[m
[31m-[m
[31m-        conf->max_index_len = sizeof(NGX_HTTP_DEFAULT_INDEX);[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_index_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_index_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* TODO: warn about duplicate indices */[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_index_loc_conf_t *ilcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_index_t           *index;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (ilcf->indices == NULL) {[m
[31m-        ilcf->indices = ngx_array_create(cf->pool, 2, sizeof(ngx_http_index_t));[m
[31m-        if (ilcf->indices == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (value[i].data[0] == '/' && i != cf->args->nelts - 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "only the last index in \"index\" directive "[m
[31m-                               "should be absolute");[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "index \"%V\" in \"index\" directive is invalid",[m
[31m-                               &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index = ngx_array_push(ilcf->indices);[m
[31m-        if (index == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index->name.len = value[i].len;[m
[31m-        index->name.data = value[i].data;[m
[31m-        index->lengths = NULL;[m
[31m-        index->values = NULL;[m
[31m-[m
[31m-        n = ngx_http_script_variables_count(&value[i]);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            if (ilcf->max_index_len < index->name.len) {[m
[31m-                ilcf->max_index_len = index->name.len;[m
[31m-            }[m
[31m-[m
[31m-            if (index->name.data[0] == '/') {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* include the terminating '\0' to the length to use ngx_memcpy() */[m
[31m-            index->name.len++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &value[i];[m
[31m-        sc.lengths = &index->lengths;[m
[31m-        sc.values = &index->values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_limit_conn_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_limit_conn_module.c[m
[1mdeleted file mode 100644[m
[1mindex 913d599..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_limit_conn_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,670 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     color;[m
[31m-    u_char                     len;[m
[31m-    u_short                    conn;[m
[31m-    u_char                     data[1];[m
[31m-} ngx_http_limit_conn_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t            *shm_zone;[m
[31m-    ngx_rbtree_node_t         *node;[m
[31m-} ngx_http_limit_conn_cleanup_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t              *rbtree;[m
[31m-    ngx_http_complex_value_t   key;[m
[31m-} ngx_http_limit_conn_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t            *shm_zone;[m
[31m-    ngx_uint_t                 conn;[m
[31m-} ngx_http_limit_conn_limit_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                limits;[m
[31m-    ngx_uint_t                 log_level;[m
[31m-    ngx_uint_t                 status_code;[m
[31m-} ngx_http_limit_conn_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_rbtree_node_t *ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree,[m
[31m-    ngx_str_t *key, uint32_t hash);[m
[31m-static void ngx_http_limit_conn_cleanup(void *data);[m
[31m-static ngx_inline void ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool);[m
[31m-[m
[31m-static void *ngx_http_limit_conn_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_limit_conn_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_limit_conn_log_levels[] = {[m
[31m-    { ngx_string("info"), NGX_LOG_INFO },[m
[31m-    { ngx_string("notice"), NGX_LOG_NOTICE },[m
[31m-    { ngx_string("warn"), NGX_LOG_WARN },[m
[31m-    { ngx_string("error"), NGX_LOG_ERR },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_num_bounds_t  ngx_http_limit_conn_status_bounds = {[m
[31m-    ngx_conf_check_num_bounds, 400, 599[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_limit_conn_commands[] = {[m
[31m-[m
[31m-    { ngx_string("limit_conn_zone"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_limit_conn_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_conn"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_limit_conn,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_conn_log_level"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_limit_conn_conf_t, log_level),[m
[31m-      &ngx_http_limit_conn_log_levels },[m
[31m-[m
[31m-    { ngx_string("limit_conn_status"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_limit_conn_conf_t, status_code),[m
[31m-      &ngx_http_limit_conn_status_bounds },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_limit_conn_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_limit_conn_init,              /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_limit_conn_create_conf,       /* create location configuration */[m
[31m-    ngx_http_limit_conn_merge_conf         /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_limit_conn_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_limit_conn_module_ctx,       /* module context */[m
[31m-    ngx_http_limit_conn_commands,          /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_conn_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          n;[m
[31m-    uint32_t                        hash;[m
[31m-    ngx_str_t                       key;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_slab_pool_t                *shpool;[m
[31m-    ngx_rbtree_node_t              *node;[m
[31m-    ngx_pool_cleanup_t             *cln;[m
[31m-    ngx_http_limit_conn_ctx_t      *ctx;[m
[31m-    ngx_http_limit_conn_node_t     *lc;[m
[31m-    ngx_http_limit_conn_conf_t     *lccf;[m
[31m-    ngx_http_limit_conn_limit_t    *limits;[m
[31m-    ngx_http_limit_conn_cleanup_t  *lccln;[m
[31m-[m
[31m-    if (r->main->limit_conn_set) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    lccf = ngx_http_get_module_loc_conf(r, ngx_http_limit_conn_module);[m
[31m-    limits = lccf->limits.elts;[m
[31m-[m
[31m-    for (i = 0; i < lccf->limits.nelts; i++) {[m
[31m-        ctx = limits[i].shm_zone->data;[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &ctx->key, &key) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (key.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (key.len > 255) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "the value of the \"%V\" key "[m
[31m-                          "is more than 255 bytes: \"%V\"",[m
[31m-                          &ctx->key.value, &key);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        r->main->limit_conn_set = 1;[m
[31m-[m
[31m-        hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-        shpool = (ngx_slab_pool_t *) limits[i].shm_zone->shm.addr;[m
[31m-[m
[31m-        ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-        node = ngx_http_limit_conn_lookup(ctx->rbtree, &key, hash);[m
[31m-[m
[31m-        if (node == NULL) {[m
[31m-[m
[31m-            n = offsetof(ngx_rbtree_node_t, color)[m
[31m-                + offsetof(ngx_http_limit_conn_node_t, data)[m
[31m-                + key.len;[m
[31m-[m
[31m-            node = ngx_slab_alloc_locked(shpool, n);[m
[31m-[m
[31m-            if (node == NULL) {[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-                ngx_http_limit_conn_cleanup_all(r->pool);[m
[31m-                return lccf->status_code;[m
[31m-            }[m
[31m-[m
[31m-            lc = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-            node->key = hash;[m
[31m-            lc->len = (u_char) key.len;[m
[31m-            lc->conn = 1;[m
[31m-            ngx_memcpy(lc->data, key.data, key.len);[m
[31m-[m
[31m-            ngx_rbtree_insert(ctx->rbtree, node);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            lc = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-            if ((ngx_uint_t) lc->conn >= limits[i].conn) {[m
[31m-[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-                ngx_log_error(lccf->log_level, r->connection->log, 0,[m
[31m-                              "limiting connections by zone \"%V\"",[m
[31m-                              &limits[i].shm_zone->shm.name);[m
[31m-[m
[31m-                ngx_http_limit_conn_cleanup_all(r->pool);[m
[31m-                return lccf->status_code;[m
[31m-            }[m
[31m-[m
[31m-            lc->conn++;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "limit conn: %08Xi %d", node->key, lc->conn);[m
[31m-[m
[31m-        ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(r->pool,[m
[31m-                                   sizeof(ngx_http_limit_conn_cleanup_t));[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_limit_conn_cleanup;[m
[31m-        lccln = cln->data;[m
[31m-[m
[31m-        lccln->shm_zone = limits[i].shm_zone;[m
[31m-        lccln->node = node;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t           **p;[m
[31m-    ngx_http_limit_conn_node_t   *lcn, *lcnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            lcn = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-            lcnt = (ngx_http_limit_conn_node_t *) &temp->color;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0)[m
[31m-                ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_rbtree_node_t *[m
[31m-ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_rbtree_node_t           *node, *sentinel;[m
[31m-    ngx_http_limit_conn_node_t  *lcn;[m
[31m-[m
[31m-    node = rbtree->root;[m
[31m-    sentinel = rbtree->sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        lcn = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return node;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_conn_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_limit_conn_cleanup_t  *lccln = data;[m
[31m-[m
[31m-    ngx_slab_pool_t             *shpool;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    ngx_http_limit_conn_ctx_t   *ctx;[m
[31m-    ngx_http_limit_conn_node_t  *lc;[m
[31m-[m
[31m-    ctx = lccln->shm_zone->data;[m
[31m-    shpool = (ngx_slab_pool_t *) lccln->shm_zone->shm.addr;[m
[31m-    node = lccln->node;[m
[31m-    lc = (ngx_http_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, lccln->shm_zone->shm.log, 0,[m
[31m-                   "limit conn cleanup: %08Xi %d", node->key, lc->conn);[m
[31m-[m
[31m-    lc->conn--;[m
[31m-[m
[31m-    if (lc->conn == 0) {[m
[31m-        ngx_rbtree_delete(ctx->rbtree, node);[m
[31m-        ngx_slab_free_locked(shpool, node);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    cln = pool->cleanup;[m
[31m-[m
[31m-    while (cln && cln->handler == ngx_http_limit_conn_cleanup) {[m
[31m-        ngx_http_limit_conn_cleanup(cln->data);[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    pool->cleanup = cln;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_http_limit_conn_ctx_t  *octx = data;[m
[31m-[m
[31m-    size_t                      len;[m
[31m-    ngx_slab_pool_t            *shpool;[m
[31m-    ngx_rbtree_node_t          *sentinel;[m
[31m-    ngx_http_limit_conn_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    if (octx) {[m
[31m-        if (ctx->key.value.len != octx->key.value.len[m
[31m-            || ngx_strncmp(ctx->key.value.data, octx->key.value.data,[m
[31m-                           ctx->key.value.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,[m
[31m-                          "limit_conn_zone \"%V\" uses the \"%V\" key "[m
[31m-                          "while previously it used the \"%V\" key",[m
[31m-                          &shm_zone->shm.name, &ctx->key.value,[m
[31m-                          &octx->key.value);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->rbtree = octx->rbtree;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        ctx->rbtree = shpool->data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rbtree = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_t));[m
[31m-    if (ctx->rbtree == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shpool->data = ctx->rbtree;[m
[31m-[m
[31m-    sentinel = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_node_t));[m
[31m-    if (sentinel == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(ctx->rbtree, sentinel,[m
[31m-                    ngx_http_limit_conn_rbtree_insert_value);[m
[31m-[m
[31m-    len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in limit_conn_zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_limit_conn_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_limit_conn_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->limits.elts = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->log_level = NGX_CONF_UNSET_UINT;[m
[31m-    conf->status_code = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_limit_conn_conf_t *prev = parent;[m
[31m-    ngx_http_limit_conn_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->limits.elts == NULL) {[m
[31m-        conf->limits = prev->limits;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR);[m
[31m-    ngx_conf_merge_uint_value(conf->status_code, prev->status_code,[m
[31m-                              NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                            *p;[m
[31m-    ssize_t                            size;[m
[31m-    ngx_str_t                         *value, name, s;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_shm_zone_t                    *shm_zone;[m
[31m-    ngx_http_limit_conn_ctx_t         *ctx;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &ctx->key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    name.len = 0;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {[m
[31m-[m
[31m-            name.data = value[i].data + 5;[m
[31m-[m
[31m-            p = (u_char *) ngx_strchr(name.data, ':');[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            name.len = p - name.data;[m
[31m-[m
[31m-            s.data = p + 1;[m
[31m-            s.len = value[i].data + value[i].len - s.data;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "zone \"%V\" is too small", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &name, size,[m
[31m-                                     &ngx_http_limit_conn_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone->data) {[m
[31m-        ctx = shm_zone->data;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "%V \"%V\" is already bound to key \"%V\"",[m
[31m-                           &cmd->name, &name, &ctx->key.value);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone->init = ngx_http_limit_conn_init_zone;[m
[31m-    shm_zone->data = ctx;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_shm_zone_t               *shm_zone;[m
[31m-    ngx_http_limit_conn_conf_t   *lccf = conf;[m
[31m-    ngx_http_limit_conn_limit_t  *limit, *limits;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                     &ngx_http_limit_conn_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limits = lccf->limits.elts;[m
[31m-[m
[31m-    if (limits == NULL) {[m
[31m-        if (ngx_array_init(&lccf->limits, cf->pool, 1,[m
[31m-                           sizeof(ngx_http_limit_conn_limit_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < lccf->limits.nelts; i++) {[m
[31m-        if (shm_zone == limits[i].shm_zone) {[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(value[2].data, value[2].len);[m
[31m-    if (n <= 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number of connections \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 65535) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "connection limit must be less 65536");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit = ngx_array_push(&lccf->limits);[m
[31m-    if (limit == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit->conn = n;[m
[31m-    limit->shm_zone = shm_zone;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_conn_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_limit_conn_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_limit_req_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_limit_req_module.c[m
[1mdeleted file mode 100644[m
[1mindex 9059ac3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_limit_req_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,968 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                       color;[m
[31m-    u_char                       dummy;[m
[31m-    u_short                      len;[m
[31m-    ngx_queue_t                  queue;[m
[31m-    ngx_msec_t                   last;[m
[31m-    /* integer value, 1 corresponds to 0.001 r/s */[m
[31m-    ngx_uint_t                   excess;[m
[31m-    ngx_uint_t                   count;[m
[31m-    u_char                       data[1];[m
[31m-} ngx_http_limit_req_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t                  rbtree;[m
[31m-    ngx_rbtree_node_t             sentinel;[m
[31m-    ngx_queue_t                   queue;[m
[31m-} ngx_http_limit_req_shctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_limit_req_shctx_t  *sh;[m
[31m-    ngx_slab_pool_t             *shpool;[m
[31m-    /* integer value, 1 corresponds to 0.001 r/s */[m
[31m-    ngx_uint_t                   rate;[m
[31m-    ngx_http_complex_value_t     key;[m
[31m-    ngx_http_limit_req_node_t   *node;[m
[31m-} ngx_http_limit_req_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t              *shm_zone;[m
[31m-    /* integer value, 1 corresponds to 0.001 r/s */[m
[31m-    ngx_uint_t                   burst;[m
[31m-    ngx_uint_t                   nodelay; /* unsigned  nodelay:1 */[m
[31m-} ngx_http_limit_req_limit_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                  limits;[m
[31m-    ngx_uint_t                   limit_log_level;[m
[31m-    ngx_uint_t                   delay_log_level;[m
[31m-    ngx_uint_t                   status_code;[m
[31m-} ngx_http_limit_req_conf_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_http_limit_req_delay(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit,[m
[31m-    ngx_uint_t hash, ngx_str_t *key, ngx_uint_t *ep, ngx_uint_t account);[m
[31m-static ngx_msec_t ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits,[m
[31m-    ngx_uint_t n, ngx_uint_t *ep, ngx_http_limit_req_limit_t **limit);[m
[31m-static void ngx_http_limit_req_expire(ngx_http_limit_req_ctx_t *ctx,[m
[31m-    ngx_uint_t n);[m
[31m-[m
[31m-static void *ngx_http_limit_req_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_limit_req_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_limit_req_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_limit_req_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_limit_req_log_levels[] = {[m
[31m-    { ngx_string("info"), NGX_LOG_INFO },[m
[31m-    { ngx_string("notice"), NGX_LOG_NOTICE },[m
[31m-    { ngx_string("warn"), NGX_LOG_WARN },[m
[31m-    { ngx_string("error"), NGX_LOG_ERR },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_num_bounds_t  ngx_http_limit_req_status_bounds = {[m
[31m-    ngx_conf_check_num_bounds, 400, 599[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_limit_req_commands[] = {[m
[31m-[m
[31m-    { ngx_string("limit_req_zone"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE3,[m
[31m-      ngx_http_limit_req_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_req"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_http_limit_req,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_req_log_level"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_limit_req_conf_t, limit_log_level),[m
[31m-      &ngx_http_limit_req_log_levels },[m
[31m-[m
[31m-    { ngx_string("limit_req_status"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_limit_req_conf_t, status_code),[m
[31m-      &ngx_http_limit_req_status_bounds },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_limit_req_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_limit_req_init,               /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_limit_req_create_conf,        /* create location configuration */[m
[31m-    ngx_http_limit_req_merge_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_limit_req_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_limit_req_module_ctx,        /* module context */[m
[31m-    ngx_http_limit_req_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_req_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n, excess;[m
[31m-    ngx_msec_t                   delay;[m
[31m-    ngx_http_limit_req_ctx_t    *ctx;[m
[31m-    ngx_http_limit_req_conf_t   *lrcf;[m
[31m-    ngx_http_limit_req_limit_t  *limit, *limits;[m
[31m-[m
[31m-    if (r->main->limit_req_set) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    lrcf = ngx_http_get_module_loc_conf(r, ngx_http_limit_req_module);[m
[31m-    limits = lrcf->limits.elts;[m
[31m-[m
[31m-    excess = 0;[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    limit = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    for (n = 0; n < lrcf->limits.nelts; n++) {[m
[31m-[m
[31m-        limit = &limits[n];[m
[31m-[m
[31m-        ctx = limit->shm_zone->data;[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &ctx->key, &key) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (key.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (key.len > 65535) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "the value of the \"%V\" key "[m
[31m-                          "is more than 65535 bytes: \"%V\"",[m
[31m-                          &ctx->key.value, &key);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-        ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        rc = ngx_http_limit_req_lookup(limit, hash, &key, &excess,[m
[31m-                                       (n == lrcf->limits.nelts - 1));[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "limit_req[%ui]: %i %ui.%03ui",[m
[31m-                       n, rc, excess / 1000, excess % 1000);[m
[31m-[m
[31m-        if (rc != NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->main->limit_req_set = 1;[m
[31m-[m
[31m-    if (rc == NGX_BUSY || rc == NGX_ERROR) {[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            ngx_log_error(lrcf->limit_log_level, r->connection->log, 0,[m
[31m-                          "limiting requests, excess: %ui.%03ui by zone \"%V\"",[m
[31m-                          excess / 1000, excess % 1000,[m
[31m-                          &limit->shm_zone->shm.name);[m
[31m-        }[m
[31m-[m
[31m-        while (n--) {[m
[31m-            ctx = limits[n].shm_zone->data;[m
[31m-[m
[31m-            if (ctx->node == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            ctx->node->count--;[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            ctx->node = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return lrcf->status_code;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN || rc == NGX_OK */[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        excess = 0;[m
[31m-    }[m
[31m-[m
[31m-    delay = ngx_http_limit_req_account(limits, n, &excess, &limit);[m
[31m-[m
[31m-    if (!delay) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(lrcf->delay_log_level, r->connection->log, 0,[m
[31m-                  "delaying request, excess: %ui.%03ui, by zone \"%V\"",[m
[31m-                  excess / 1000, excess % 1000, &limit->shm_zone->shm.name);[m
[31m-[m
[31m-    if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_test_reading;[m
[31m-    r->write_event_handler = ngx_http_limit_req_delay;[m
[31m-    ngx_add_timer(r->connection->write, delay);[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_req_delay(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "limit_req delay");[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (!wev->timedout) {[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev->timedout = 0;[m
[31m-[m
[31m-    if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-    r->write_event_handler = ngx_http_core_run_phases;[m
[31m-[m
[31m-    ngx_http_core_run_phases(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_req_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t          **p;[m
[31m-    ngx_http_limit_req_node_t   *lrn, *lrnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            lrn = (ngx_http_limit_req_node_t *) &node->color;[m
[31m-            lrnt = (ngx_http_limit_req_node_t *) &temp->color;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(lrn->data, lrnt->data, lrn->len, lrnt->len) < 0)[m
[31m-                ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, ngx_uint_t hash,[m
[31m-    ngx_str_t *key, ngx_uint_t *ep, ngx_uint_t account)[m
[31m-{[m
[31m-    size_t                      size;[m
[31m-    ngx_int_t                   rc, excess;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_msec_t                  now;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_rbtree_node_t          *node, *sentinel;[m
[31m-    ngx_http_limit_req_ctx_t   *ctx;[m
[31m-    ngx_http_limit_req_node_t  *lr;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);[m
[31m-[m
[31m-    ctx = limit->shm_zone->data;[m
[31m-[m
[31m-    node = ctx->sh->rbtree.root;[m
[31m-    sentinel = ctx->sh->rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        lr = (ngx_http_limit_req_node_t *) &node->color;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(key->data, lr->data, key->len, (size_t) lr->len);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            ngx_queue_remove(&lr->queue);[m
[31m-            ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);[m
[31m-[m
[31m-            ms = (ngx_msec_int_t) (now - lr->last);[m
[31m-[m
[31m-            excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;[m
[31m-[m
[31m-            if (excess < 0) {[m
[31m-                excess = 0;[m
[31m-            }[m
[31m-[m
[31m-            *ep = excess;[m
[31m-[m
[31m-            if ((ngx_uint_t) excess > limit->burst) {[m
[31m-                return NGX_BUSY;[m
[31m-            }[m
[31m-[m
[31m-            if (account) {[m
[31m-                lr->excess = excess;[m
[31m-                lr->last = now;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            lr->count++;[m
[31m-[m
[31m-            ctx->node = lr;[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    *ep = 0;[m
[31m-[m
[31m-    size = offsetof(ngx_rbtree_node_t, color)[m
[31m-           + offsetof(ngx_http_limit_req_node_t, data)[m
[31m-           + key->len;[m
[31m-[m
[31m-    ngx_http_limit_req_expire(ctx, 1);[m
[31m-[m
[31m-    node = ngx_slab_alloc_locked(ctx->shpool, size);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        ngx_http_limit_req_expire(ctx, 0);[m
[31m-[m
[31m-        node = ngx_slab_alloc_locked(ctx->shpool, size);[m
[31m-        if (node == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "could not allocate node%s", ctx->shpool->log_ctx);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    node->key = hash;[m
[31m-[m
[31m-    lr = (ngx_http_limit_req_node_t *) &node->color;[m
[31m-[m
[31m-    lr->len = (u_short) key->len;[m
[31m-    lr->excess = 0;[m
[31m-[m
[31m-    ngx_memcpy(lr->data, key->data, key->len);[m
[31m-[m
[31m-    ngx_rbtree_insert(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);[m
[31m-[m
[31m-    if (account) {[m
[31m-        lr->last = now;[m
[31m-        lr->count = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    lr->last = 0;[m
[31m-    lr->count = 1;[m
[31m-[m
[31m-    ctx->node = lr;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_msec_t[m
[31m-ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits, ngx_uint_t n,[m
[31m-    ngx_uint_t *ep, ngx_http_limit_req_limit_t **limit)[m
[31m-{[m
[31m-    ngx_int_t                   excess;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_msec_t                  now, delay, max_delay;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_http_limit_req_ctx_t   *ctx;[m
[31m-    ngx_http_limit_req_node_t  *lr;[m
[31m-[m
[31m-    excess = *ep;[m
[31m-[m
[31m-    if (excess == 0 || (*limit)->nodelay) {[m
[31m-        max_delay = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx = (*limit)->shm_zone->data;[m
[31m-        max_delay = excess * 1000 / ctx->rate;[m
[31m-    }[m
[31m-[m
[31m-    while (n--) {[m
[31m-        ctx = limits[n].shm_zone->data;[m
[31m-        lr = ctx->node;[m
[31m-[m
[31m-        if (lr == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        tp = ngx_timeofday();[m
[31m-[m
[31m-        now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);[m
[31m-        ms = (ngx_msec_int_t) (now - lr->last);[m
[31m-[m
[31m-        excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;[m
[31m-[m
[31m-        if (excess < 0) {[m
[31m-            excess = 0;[m
[31m-        }[m
[31m-[m
[31m-        lr->last = now;[m
[31m-        lr->excess = excess;[m
[31m-        lr->count--;[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        ctx->node = NULL;[m
[31m-[m
[31m-        if (limits[n].nodelay) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        delay = excess * 1000 / ctx->rate;[m
[31m-[m
[31m-        if (delay > max_delay) {[m
[31m-            max_delay = delay;[m
[31m-            *ep = excess;[m
[31m-            *limit = &limits[n];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return max_delay;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_limit_req_expire(ngx_http_limit_req_ctx_t *ctx, ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_int_t                   excess;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_msec_t                  now;[m
[31m-    ngx_queue_t                *q;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_rbtree_node_t          *node;[m
[31m-    ngx_http_limit_req_node_t  *lr;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);[m
[31m-[m
[31m-    /*[m
[31m-     * n == 1 deletes one or two zero rate entries[m
[31m-     * n == 0 deletes oldest entry by force[m
[31m-     *        and one or two zero rate entries[m
[31m-     */[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&ctx->sh->queue)) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-        lr = ngx_queue_data(q, ngx_http_limit_req_node_t, queue);[m
[31m-[m
[31m-        if (lr->count) {[m
[31m-[m
[31m-            /*[m
[31m-             * There is not much sense in looking further,[m
[31m-             * because we bump nodes on the lookup stage.[m
[31m-             */[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (n++ != 0) {[m
[31m-[m
[31m-            ms = (ngx_msec_int_t) (now - lr->last);[m
[31m-            ms = ngx_abs(ms);[m
[31m-[m
[31m-            if (ms < 60000) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            excess = lr->excess - ctx->rate * ms / 1000;[m
[31m-[m
[31m-            if (excess > 0) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        node = (ngx_rbtree_node_t *)[m
[31m-                   ((u_char *) lr - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-        ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-        ngx_slab_free_locked(ctx->shpool, node);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_req_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_http_limit_req_ctx_t  *octx = data;[m
[31m-[m
[31m-    size_t                     len;[m
[31m-    ngx_http_limit_req_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    if (octx) {[m
[31m-        if (ctx->key.value.len != octx->key.value.len[m
[31m-            || ngx_strncmp(ctx->key.value.data, octx->key.value.data,[m
[31m-                           ctx->key.value.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,[m
[31m-                          "limit_req \"%V\" uses the \"%V\" key "[m
[31m-                          "while previously it used the \"%V\" key",[m
[31m-                          &shm_zone->shm.name, &ctx->key.value,[m
[31m-                          &octx->key.value);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->sh = octx->sh;[m
[31m-        ctx->shpool = octx->shpool;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        ctx->sh = ctx->shpool->data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_limit_req_shctx_t));[m
[31m-    if (ctx->sh == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->shpool->data = ctx->sh;[m
[31m-[m
[31m-    ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel,[m
[31m-                    ngx_http_limit_req_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&ctx->sh->queue);[m
[31m-[m
[31m-    len = sizeof(" in limit_req zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len);[m
[31m-    if (ctx->shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(ctx->shpool->log_ctx, " in limit_req zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    ctx->shpool->log_nomem = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_limit_req_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_limit_req_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->limits.elts = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->limit_log_level = NGX_CONF_UNSET_UINT;[m
[31m-    conf->status_code = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_req_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_limit_req_conf_t *prev = parent;[m
[31m-    ngx_http_limit_req_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->limits.elts == NULL) {[m
[31m-        conf->limits = prev->limits;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->limit_log_level, prev->limit_log_level,[m
[31m-                              NGX_LOG_ERR);[m
[31m-[m
[31m-    conf->delay_log_level = (conf->limit_log_level == NGX_LOG_INFO) ?[m
[31m-                                NGX_LOG_INFO : conf->limit_log_level + 1;[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->status_code, prev->status_code,[m
[31m-                              NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_req_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                            *p;[m
[31m-    size_t                             len;[m
[31m-    ssize_t                            size;[m
[31m-    ngx_str_t                         *value, name, s;[m
[31m-    ngx_int_t                          rate, scale;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_shm_zone_t                    *shm_zone;[m
[31m-    ngx_http_limit_req_ctx_t          *ctx;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &ctx->key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    rate = 1;[m
[31m-    scale = 1;[m
[31m-    name.len = 0;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {[m
[31m-[m
[31m-            name.data = value[i].data + 5;[m
[31m-[m
[31m-            p = (u_char *) ngx_strchr(name.data, ':');[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            name.len = p - name.data;[m
[31m-[m
[31m-            s.data = p + 1;[m
[31m-            s.len = value[i].data + value[i].len - s.data;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "zone \"%V\" is too small", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "rate=", 5) == 0) {[m
[31m-[m
[31m-            len = value[i].len;[m
[31m-            p = value[i].data + len - 3;[m
[31m-[m
[31m-            if (ngx_strncmp(p, "r/s", 3) == 0) {[m
[31m-                scale = 1;[m
[31m-                len -= 3;[m
[31m-[m
[31m-            } else if (ngx_strncmp(p, "r/m", 3) == 0) {[m
[31m-                scale = 60;[m
[31m-                len -= 3;[m
[31m-            }[m
[31m-[m
[31m-            rate = ngx_atoi(value[i].data + 5, len - 5);[m
[31m-            if (rate <= 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid rate \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rate = rate * 1000 / scale;[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &name, size,[m
[31m-                                     &ngx_http_limit_req_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone->data) {[m
[31m-        ctx = shm_zone->data;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "%V \"%V\" is already bound to key \"%V\"",[m
[31m-                           &cmd->name, &name, &ctx->key.value);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone->init = ngx_http_limit_req_init_zone;[m
[31m-    shm_zone->data = ctx;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_limit_req_conf_t  *lrcf = conf;[m
[31m-[m
[31m-    ngx_int_t                    burst;[m
[31m-    ngx_str_t                   *value, s;[m
[31m-    ngx_uint_t                   i, nodelay;[m
[31m-    ngx_shm_zone_t              *shm_zone;[m
[31m-    ngx_http_limit_req_limit_t  *limit, *limits;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    shm_zone = NULL;[m
[31m-    burst = 0;[m
[31m-    nodelay = 0;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 5;[m
[31m-            s.data = value[i].data + 5;[m
[31m-[m
[31m-            shm_zone = ngx_shared_memory_add(cf, &s, 0,[m
[31m-                                             &ngx_http_limit_req_module);[m
[31m-            if (shm_zone == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "burst=", 6) == 0) {[m
[31m-[m
[31m-            burst = ngx_atoi(value[i].data + 6, value[i].len - 6);[m
[31m-            if (burst <= 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid burst rate \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "nodelay") == 0) {[m
[31m-            nodelay = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limits = lrcf->limits.elts;[m
[31m-[m
[31m-    if (limits == NULL) {[m
[31m-        if (ngx_array_init(&lrcf->limits, cf->pool, 1,[m
[31m-                           sizeof(ngx_http_limit_req_limit_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < lrcf->limits.nelts; i++) {[m
[31m-        if (shm_zone == limits[i].shm_zone) {[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    limit = ngx_array_push(&lrcf->limits);[m
[31m-    if (limit == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit->shm_zone = shm_zone;[m
[31m-    limit->burst = burst * 1000;[m
[31m-    limit->nodelay = nodelay;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_limit_req_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_limit_req_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_log_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_log_module.c[m
[1mdeleted file mode 100644[m
[1mindex 0978e51..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_log_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1819 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-#include <zlib.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_log_op_s  ngx_http_log_op_t;[m
[31m-[m
[31m-typedef u_char *(*ngx_http_log_op_run_pt) (ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-[m
[31m-typedef size_t (*ngx_http_log_op_getlen_pt) (ngx_http_request_t *r,[m
[31m-    uintptr_t data);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_log_op_s {[m
[31m-    size_t                      len;[m
[31m-    ngx_http_log_op_getlen_pt   getlen;[m
[31m-    ngx_http_log_op_run_pt      run;[m
[31m-    uintptr_t                   data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_array_t                *flushes;[m
[31m-    ngx_array_t                *ops;        /* array of ngx_http_log_op_t */[m
[31m-} ngx_http_log_fmt_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                 formats;    /* array of ngx_http_log_fmt_t */[m
[31m-    ngx_uint_t                  combined_used; /* unsigned  combined_used:1 */[m
[31m-} ngx_http_log_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *start;[m
[31m-    u_char                     *pos;[m
[31m-    u_char                     *last;[m
[31m-[m
[31m-    ngx_event_t                *event;[m
[31m-    ngx_msec_t                  flush;[m
[31m-    ngx_int_t                   gzip;[m
[31m-} ngx_http_log_buf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *lengths;[m
[31m-    ngx_array_t                *values;[m
[31m-} ngx_http_log_script_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_open_file_t            *file;[m
[31m-    ngx_http_log_script_t      *script;[m
[31m-    time_t                      disk_full_time;[m
[31m-    time_t                      error_log_time;[m
[31m-    ngx_syslog_peer_t          *syslog_peer;[m
[31m-    ngx_http_log_fmt_t         *format;[m
[31m-    ngx_http_complex_value_t   *filter;[m
[31m-} ngx_http_log_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *logs;       /* array of ngx_http_log_t */[m
[31m-[m
[31m-    ngx_open_file_cache_t      *open_file_cache;[m
[31m-    time_t                      open_file_cache_valid;[m
[31m-    ngx_uint_t                  open_file_cache_min_uses;[m
[31m-[m
[31m-    ngx_flag_t                  escape_non_ascii;[m
[31m-[m
[31m-    ngx_uint_t                  off;        /* unsigned  off:1 */[m
[31m-} ngx_http_log_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    size_t                      len;[m
[31m-    ngx_http_log_op_run_pt      run;[m
[31m-} ngx_http_log_var_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log,[m
[31m-    u_char *buf, size_t len);[m
[31m-static ssize_t ngx_http_log_script_write(ngx_http_request_t *r,[m
[31m-    ngx_http_log_script_t *script, u_char **name, u_char *buf, size_t len);[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-static ssize_t ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len,[m
[31m-    ngx_int_t level, ngx_log_t *log);[m
[31m-[m
[31m-static void *ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size);[m
[31m-static void ngx_http_log_gzip_free(void *opaque, void *address);[m
[31m-#endif[m
[31m-[m
[31m-static void ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log);[m
[31m-static void ngx_http_log_flush_handler(ngx_event_t *ev);[m
[31m-[m
[31m-static u_char *ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_msec(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_status(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_body_bytes_sent(ngx_http_request_t *r,[m
[31m-    u_char *buf, ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-[m
[31m-static ngx_int_t ngx_http_log_variable_compile(ngx_conf_t *cf,[m
[31m-    ngx_http_log_op_t *op, ngx_str_t *value);[m
[31m-static size_t ngx_http_log_variable_getlen(ngx_http_request_t *r,[m
[31m-    uintptr_t data);[m
[31m-static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,[m
[31m-    u_char *src, size_t size);[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_log_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_log_compile_format(ngx_conf_t *cf,[m
[31m-    ngx_array_t *flushes, ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s);[m
[31m-static char *ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_log_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_log_commands[] = {[m
[31m-[m
[31m-    { ngx_string("log_format"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_log_set_format,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("access_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_HTTP_LMT_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_log_set_log,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_log_file_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_http_log_open_file_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_escape_non_ascii"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_log_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_log_init,                     /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_log_create_main_conf,         /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_log_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_log_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_log_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_log_module_ctx,              /* module context */[m
[31m-    ngx_http_log_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_access_log = ngx_string(NGX_HTTP_LOG_PATH);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_combined_fmt =[m
[31m-    ngx_string("$remote_addr - $remote_user [$time_local] "[m
[31m-               "\"$request\" $status $body_bytes_sent "[m
[31m-               "\"$http_referer\" \"$http_user_agent\"");[m
[31m-[m
[31m-[m
[31m-static ngx_http_log_var_t  ngx_http_log_vars[] = {[m
[31m-    { ngx_string("pipe"), 1, ngx_http_log_pipe },[m
[31m-    { ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1,[m
[31m-                          ngx_http_log_time },[m
[31m-    { ngx_string("time_iso8601"), sizeof("1970-09-28T12:00:00+06:00") - 1,[m
[31m-                          ngx_http_log_iso8601 },[m
[31m-    { ngx_string("msec"), NGX_TIME_T_LEN + 4, ngx_http_log_msec },[m
[31m-    { ngx_string("request_time"), NGX_TIME_T_LEN + 4,[m
[31m-                          ngx_http_log_request_time },[m
[31m-    { ngx_string("status"), NGX_INT_T_LEN, ngx_http_log_status },[m
[31m-    { ngx_string("bytes_sent"), NGX_OFF_T_LEN, ngx_http_log_bytes_sent },[m
[31m-    { ngx_string("body_bytes_sent"), NGX_OFF_T_LEN,[m
[31m-                          ngx_http_log_body_bytes_sent },[m
[31m-    { ngx_string("request_length"), NGX_SIZE_T_LEN,[m
[31m-                          ngx_http_log_request_length },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                   *line, *p;[m
[31m-    size_t                    len, size;[m
[31m-    ssize_t                   n;[m
[31m-    ngx_str_t                 val;[m
[31m-    ngx_uint_t                i, l;[m
[31m-    ngx_http_log_t           *log;[m
[31m-    ngx_http_log_op_t        *op;[m
[31m-    ngx_http_log_buf_t       *buffer;[m
[31m-    ngx_http_log_loc_conf_t  *lcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log handler");[m
[31m-[m
[31m-    lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    if (lcf->off) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    log = lcf->logs->elts;[m
[31m-    for (l = 0; l < lcf->logs->nelts; l++) {[m
[31m-[m
[31m-        if (log[l].filter) {[m
[31m-            if (ngx_http_complex_value(r, log[l].filter, &val) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (val.len == 0 || (val.len == 1 && val.data[0] == '0')) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_time() == log[l].disk_full_time) {[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD writing to a full filesystem with enabled softupdates[m
[31m-             * may block process for much longer time than writing to non-full[m
[31m-             * filesystem, so we skip writing to a log for one second[m
[31m-             */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, log[l].format->flushes);[m
[31m-[m
[31m-        len = 0;[m
[31m-        op = log[l].format->ops->elts;[m
[31m-        for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-            if (op[i].len == 0) {[m
[31m-                len += op[i].getlen(r, op[i].data);[m
[31m-[m
[31m-            } else {[m
[31m-                len += op[i].len;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-[m
[31m-            /* length of syslog's PRI and HEADER message parts */[m
[31m-            len += sizeof("<255>Jan 01 00:00:00 ") - 1[m
[31m-                   + ngx_cycle->hostname.len + 1[m
[31m-                   + log[l].syslog_peer->tag.len + 2;[m
[31m-[m
[31m-            goto alloc_line;[m
[31m-        }[m
[31m-[m
[31m-        len += NGX_LINEFEED_SIZE;[m
[31m-[m
[31m-        buffer = log[l].file ? log[l].file->data : NULL;[m
[31m-[m
[31m-        if (buffer) {[m
[31m-[m
[31m-            if (len > (size_t) (buffer->last - buffer->pos)) {[m
[31m-[m
[31m-                ngx_http_log_write(r, &log[l], buffer->start,[m
[31m-                                   buffer->pos - buffer->start);[m
[31m-[m
[31m-                buffer->pos = buffer->start;[m
[31m-            }[m
[31m-[m
[31m-            if (len <= (size_t) (buffer->last - buffer->pos)) {[m
[31m-[m
[31m-                p = buffer->pos;[m
[31m-[m
[31m-                if (buffer->event && p == buffer->start) {[m
[31m-                    ngx_add_timer(buffer->event, buffer->flush);[m
[31m-                }[m
[31m-[m
[31m-                for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-                    p = op[i].run(r, p, &op[i]);[m
[31m-                }[m
[31m-[m
[31m-                ngx_linefeed(p);[m
[31m-[m
[31m-                buffer->pos = p;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (buffer->event && buffer->event->timer_set) {[m
[31m-                ngx_del_timer(buffer->event);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    alloc_line:[m
[31m-[m
[31m-        line = ngx_pnalloc(r->pool, len);[m
[31m-        if (line == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = line;[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-            p = ngx_syslog_add_header(log[l].syslog_peer, line);[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-            p = op[i].run(r, p, &op[i]);[m
[31m-        }[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-[m
[31m-            size = p - line;[m
[31m-[m
[31m-            n = ngx_syslog_send(log[l].syslog_peer, line, size);[m
[31m-[m
[31m-            if (n < 0) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "send() to syslog failed");[m
[31m-[m
[31m-            } else if ((size_t) n != size) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "send() to syslog has written only %z of %uz",[m
[31m-                              n, size);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_linefeed(p);[m
[31m-[m
[31m-        ngx_http_log_write(r, &log[l], line, p - line);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log, u_char *buf,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    u_char              *name;[m
[31m-    time_t               now;[m
[31m-    ssize_t              n;[m
[31m-    ngx_err_t            err;[m
[31m-#if (NGX_ZLIB)[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-#endif[m
[31m-[m
[31m-    if (log->script == NULL) {[m
[31m-        name = log->file->name.data;[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-        buffer = log->file->data;[m
[31m-[m
[31m-        if (buffer && buffer->gzip) {[m
[31m-            n = ngx_http_log_gzip(log->file->fd, buf, len, buffer->gzip,[m
[31m-                                  r->connection->log);[m
[31m-        } else {[m
[31m-            n = ngx_write_fd(log->file->fd, buf, len);[m
[31m-        }[m
[31m-#else[m
[31m-        n = ngx_write_fd(log->file->fd, buf, len);[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        name = NULL;[m
[31m-        n = ngx_http_log_script_write(r, log->script, &name, buf, len);[m
[31m-    }[m
[31m-[m
[31m-    if (n == (ssize_t) len) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOSPC) {[m
[31m-            log->disk_full_time = now;[m
[31m-        }[m
[31m-[m
[31m-        if (now - log->error_log_time > 59) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, err,[m
[31m-                          ngx_write_fd_n " to \"%s\" failed", name);[m
[31m-[m
[31m-            log->error_log_time = now;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (now - log->error_log_time > 59) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",[m
[31m-                      name, n, len);[m
[31m-[m
[31m-        log->error_log_time = now;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_log_script_write(ngx_http_request_t *r, ngx_http_log_script_t *script,[m
[31m-    u_char **name, u_char *buf, size_t len)[m
[31m-{[m
[31m-    size_t                     root;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_str_t                  log, path;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_log_loc_conf_t   *llcf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->root_tested) {[m
[31m-[m
[31m-        /* test root directory existence */[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        path.data[root] = '\0';[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_dir = 1;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            if (of.err == 0) {[m
[31m-                /* simulate successful logging */[m
[31m-                return len;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, of.err,[m
[31m-                          "testing \"%s\" existence failed", path.data);[m
[31m-[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        if (!of.is_dir) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ENOTDIR,[m
[31m-                          "testing \"%s\" existence failed", path.data);[m
[31m-[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &log, script->lengths->elts, 1,[m
[31m-                            script->values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    log.data[log.len - 1] = '\0';[m
[31m-    *name = log.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log \"%s\"", log.data);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.log = 1;[m
[31m-    of.valid = llcf->open_file_cache_valid;[m
[31m-    of.min_uses = llcf->open_file_cache_min_uses;[m
[31m-    of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &log, &of) != NGX_OK) {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(llcf->open_file_cache, &log, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      "%s \"%s\" failed", of.failed, log.data);[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log #%d", of.fd);[m
[31m-[m
[31m-    n = ngx_write_fd(of.fd, buf, len);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len, ngx_int_t level,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    int          rc, wbits, memlevel;[m
[31m-    u_char      *out;[m
[31m-    size_t       size;[m
[31m-    ssize_t      n;[m
[31m-    z_stream     zstream;[m
[31m-    ngx_err_t    err;[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    wbits = MAX_WBITS;[m
[31m-    memlevel = MAX_MEM_LEVEL - 1;[m
[31m-[m
[31m-    while ((ssize_t) len < ((1 << (wbits - 1)) - 262)) {[m
[31m-        wbits--;[m
[31m-        memlevel--;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * This is a formula from deflateBound() for conservative upper bound of[m
[31m-     * compressed data plus 18 bytes of gzip wrapper.[m
[31m-     */[m
[31m-[m
[31m-    size = len + ((len + 7) >> 3) + ((len + 63) >> 6) + 5 + 18;[m
[31m-[m
[31m-    ngx_memzero(&zstream, sizeof(z_stream));[m
[31m-[m
[31m-    pool = ngx_create_pool(256, log);[m
[31m-    if (pool == NULL) {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    pool->log = log;[m
[31m-[m
[31m-    zstream.zalloc = ngx_http_log_gzip_alloc;[m
[31m-    zstream.zfree = ngx_http_log_gzip_free;[m
[31m-    zstream.opaque = pool;[m
[31m-[m
[31m-    out = ngx_pnalloc(pool, size);[m
[31m-    if (out == NULL) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    zstream.next_in = buf;[m
[31m-    zstream.avail_in = len;[m
[31m-    zstream.next_out = out;[m
[31m-    zstream.avail_out = size;[m
[31m-[m
[31m-    rc = deflateInit2(&zstream, (int) level, Z_DEFLATED, wbits + 16, memlevel,[m
[31m-                      Z_DEFAULT_STRATEGY);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateInit2() failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "deflate in: ni:%p no:%p ai:%ud ao:%ud",[m
[31m-                   zstream.next_in, zstream.next_out,[m
[31m-                   zstream.avail_in, zstream.avail_out);[m
[31m-[m
[31m-    rc = deflate(&zstream, Z_FINISH);[m
[31m-[m
[31m-    if (rc != Z_STREAM_END) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "deflate(Z_FINISH) failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",[m
[31m-                   zstream.next_in, zstream.next_out,[m
[31m-                   zstream.avail_in, zstream.avail_out,[m
[31m-                   rc);[m
[31m-[m
[31m-    size -= zstream.avail_out;[m
[31m-[m
[31m-    rc = deflateEnd(&zstream);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateEnd() failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_fd(fd, out, size);[m
[31m-[m
[31m-    if (n != (ssize_t) size) {[m
[31m-        err = (n == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-        ngx_set_errno(err);[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-[m
[31m-    /* simulate successful logging */[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size)[m
[31m-{[m
[31m-    ngx_pool_t *pool = opaque;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                   "gzip alloc: n:%ud s:%ud", items, size);[m
[31m-[m
[31m-    return ngx_palloc(pool, items * size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_gzip_free(void *opaque, void *address)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_pool_t *pool = opaque;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0, "gzip free: %p", address);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log)[m
[31m-{[m
[31m-    size_t               len;[m
[31m-    ssize_t              n;[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-[m
[31m-    buffer = file->data;[m
[31m-[m
[31m-    len = buffer->pos - buffer->start;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-    if (buffer->gzip) {[m
[31m-        n = ngx_http_log_gzip(file->fd, buffer->start, len, buffer->gzip, log);[m
[31m-    } else {[m
[31m-        n = ngx_write_fd(file->fd, buffer->start, len);[m
[31m-    }[m
[31m-#else[m
[31m-    n = ngx_write_fd(file->fd, buffer->start, len);[m
[31m-#endif[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_write_fd_n " to \"%s\" failed",[m
[31m-                      file->name.data);[m
[31m-[m
[31m-    } else if ((size_t) n != len) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",[m
[31m-                      file->name.data, n, len);[m
[31m-    }[m
[31m-[m
[31m-    buffer->pos = buffer->start;[m
[31m-[m
[31m-    if (buffer->event && buffer->event->timer_set) {[m
[31m-        ngx_del_timer(buffer->event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_flush_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_open_file_t     *file;[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "http log buffer flush handler");[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ngx_http_log_flush(ev->data, ev->log);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* cancel the flush timer for graceful shutdown */[m
[31m-[m
[31m-    file = ev->data;[m
[31m-    buffer = file->data;[m
[31m-[m
[31m-    buffer->event = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_copy_short(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    size_t     len;[m
[31m-    uintptr_t  data;[m
[31m-[m
[31m-    len = op->len;[m
[31m-    data = op->data;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        *buf++ = (u_char) (data & 0xff);[m
[31m-        data >>= 8;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_copy_long(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, (u_char *) op->data, op->len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    if (r->pipeline) {[m
[31m-        *buf = 'p';[m
[31m-    } else {[m
[31m-        *buf = '.';[m
[31m-    }[m
[31m-[m
[31m-    return buf + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_time(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, ngx_cached_http_log_time.data,[m
[31m-                      ngx_cached_http_log_time.len);[m
[31m-}[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, ngx_cached_http_log_iso8601.data,[m
[31m-                      ngx_cached_http_log_iso8601.len);[m
[31m-}[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_msec(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_time_t  *tp;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%T.%03M", tp->sec, tp->msec);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_time_t      *tp;[m
[31m-    ngx_msec_int_t   ms;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ms = (ngx_msec_int_t)[m
[31m-             ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec));[m
[31m-    ms = ngx_max(ms, 0);[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%T.%03M", (time_t) ms / 1000, ms % 1000);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_status(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_uint_t  status;[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        status = r->err_status;[m
[31m-[m
[31m-    } else if (r->headers_out.status) {[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-    } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-        status = 9;[m
[31m-[m
[31m-    } else {[m
[31m-        status = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%03ui", status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_sprintf(buf, "%O", r->connection->sent);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * although there is a real $body_bytes_sent variable,[m
[31m- * this log operation code function is more optimized for logging[m
[31m- */[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_body_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    off_t  length;[m
[31m-[m
[31m-    length = r->connection->sent - r->header_size;[m
[31m-[m
[31m-    if (length > 0) {[m
[31m-        return ngx_sprintf(buf, "%O", length);[m
[31m-    }[m
[31m-[m
[31m-    *buf = '0';[m
[31m-[m
[31m-    return buf + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_sprintf(buf, "%O", r->request_length);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_variable_compile(ngx_conf_t *cf, ngx_http_log_op_t *op,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t  index;[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, value);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    op->len = 0;[m
[31m-    op->getlen = ngx_http_log_variable_getlen;[m
[31m-    op->run = ngx_http_log_variable;[m
[31m-    op->data = index;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)[m
[31m-{[m
[31m-    uintptr_t                   len;[m
[31m-    ngx_http_log_loc_conf_t    *lcf;[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    value = ngx_http_get_indexed_variable(r, data);[m
[31m-[m
[31m-    if (value == NULL || value->not_found) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    len = ngx_http_log_escape(lcf, NULL, value->data, value->len);[m
[31m-[m
[31m-    value->escape = len ? 1 : 0;[m
[31m-[m
[31m-    return value->len + len * 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t    *lcf;[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    value = ngx_http_get_indexed_variable(r, op->data);[m
[31m-[m
[31m-    if (value == NULL || value->not_found) {[m
[31m-        *buf = '-';[m
[31m-        return buf + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (value->escape == 0) {[m
[31m-        return ngx_cpymem(buf, value->data, value->len);[m
[31m-[m
[31m-    } else {[m
[31m-        lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-        return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uintptr_t[m
[31m-ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,[m
[31m-    size_t size)[m
[31m-{[m
[31m-    ngx_uint_t                   n;[m
[31m-    static u_char                hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-    static uint32_t   escape[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000004, /* 0000 0000 0000 0000  0000 0000 0000 0100 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x10000000, /* 0001 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-    if (lcf->escape_non_ascii) {[m
[31m-        ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&escape[4], sizeof(uint32_t) * 4);[m
[31m-    }[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '\\';[m
[31m-            *dst++ = 'x';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_log_main_conf_t  *conf;[m
[31m-[m
[31m-    ngx_http_log_fmt_t  *fmt;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&conf->formats, cf->pool, 4, sizeof(ngx_http_log_fmt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    fmt = ngx_array_push(&conf->formats);[m
[31m-    if (fmt == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&fmt->name, "combined");[m
[31m-[m
[31m-    fmt->flushes = NULL;[m
[31m-[m
[31m-    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t));[m
[31m-    if (fmt->ops == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->open_file_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->escape_non_ascii = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *prev = parent;[m
[31m-    ngx_http_log_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_http_log_t            *log;[m
[31m-    ngx_http_log_fmt_t        *fmt;[m
[31m-    ngx_http_log_main_conf_t  *lmcf;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);[m
[31m-[m
[31m-    if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        conf->open_file_cache = prev->open_file_cache;[m
[31m-        conf->open_file_cache_valid = prev->open_file_cache_valid;[m
[31m-        conf->open_file_cache_min_uses = prev->open_file_cache_min_uses;[m
[31m-[m
[31m-        if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->open_file_cache = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->logs || conf->off) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf->logs = prev->logs;[m
[31m-    conf->off = prev->off;[m
[31m-[m
[31m-    if (conf->logs || conf->off) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t));[m
[31m-    if (conf->logs == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    log = ngx_array_push(conf->logs);[m
[31m-    if (log == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(log, sizeof(ngx_http_log_t));[m
[31m-[m
[31m-    log->file = ngx_conf_open_file(cf->cycle, &ngx_http_access_log);[m
[31m-    if (log->file == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-[m
[31m-    /* the default "combined" format */[m
[31m-    log->format = &fmt[0];[m
[31m-    lmcf->combined_used = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *llcf = conf;[m
[31m-[m
[31m-    ssize_t                            size;[m
[31m-    ngx_int_t                          gzip;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_msec_t                         flush;[m
[31m-    ngx_str_t                         *value, name, s;[m
[31m-    ngx_http_log_t                    *log;[m
[31m-    ngx_syslog_peer_t                 *peer;[m
[31m-    ngx_http_log_buf_t                *buffer;[m
[31m-    ngx_http_log_fmt_t                *fmt;[m
[31m-    ngx_http_log_main_conf_t          *lmcf;[m
[31m-    ngx_http_script_compile_t          sc;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        llcf->off = 1;[m
[31m-        if (cf->args->nelts == 2) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->logs == NULL) {[m
[31m-        llcf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t));[m
[31m-        if (llcf->logs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-[m
[31m-    log = ngx_array_push(llcf->logs);[m
[31m-    if (log == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(log, sizeof(ngx_http_log_t));[m
[31m-[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) {[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log->syslog_peer = peer;[m
[31m-[m
[31m-        goto process_formats;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        log->file = ngx_conf_open_file(cf->cycle, &value[1]);[m
[31m-        if (log->file == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log->script = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_script_t));[m
[31m-        if (log->script == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &value[1];[m
[31m-        sc.lengths = &log->script->lengths;[m
[31m-        sc.values = &log->script->values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-process_formats:[m
[31m-[m
[31m-    if (cf->args->nelts >= 3) {[m
[31m-        name = value[2];[m
[31m-[m
[31m-        if (ngx_strcmp(name.data, "combined") == 0) {[m
[31m-            lmcf->combined_used = 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&name, "combined");[m
[31m-        lmcf->combined_used = 1;[m
[31m-    }[m
[31m-[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-    for (i = 0; i < lmcf->formats.nelts; i++) {[m
[31m-        if (fmt[i].name.len == name.len[m
[31m-            && ngx_strcasecmp(fmt[i].name.data, name.data) == 0)[m
[31m-        {[m
[31m-            log->format = &fmt[i];[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (log->format == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unknown log format \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    flush = 0;[m
[31m-    gzip = 0;[m
[31m-[m
[31m-    for (i = 3; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "buffer=", 7) == 0) {[m
[31m-            s.len = value[i].len - 7;[m
[31m-            s.data = value[i].data + 7;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR || size == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid buffer size \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "flush=", 6) == 0) {[m
[31m-            s.len = value[i].len - 6;[m
[31m-            s.data = value[i].data + 6;[m
[31m-[m
[31m-            flush = ngx_parse_time(&s, 0);[m
[31m-[m
[31m-            if (flush == (ngx_msec_t) NGX_ERROR || flush == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid flush time \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "gzip", 4) == 0[m
[31m-            && (value[i].len == 4 || value[i].data[4] == '='))[m
[31m-        {[m
[31m-#if (NGX_ZLIB)[m
[31m-            if (size == 0) {[m
[31m-                size = 64 * 1024;[m
[31m-            }[m
[31m-[m
[31m-            if (value[i].len == 4) {[m
[31m-                gzip = Z_BEST_SPEED;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 5;[m
[31m-            s.data = value[i].data + 5;[m
[31m-[m
[31m-            gzip = ngx_atoi(s.data, s.len);[m
[31m-[m
[31m-            if (gzip < 1 || gzip > 9) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid compression level \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "nginx was built without zlib support");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "if=", 3) == 0) {[m
[31m-            s.len = value[i].len - 3;[m
[31m-            s.data = value[i].data + 3;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &s;[m
[31m-            ccv.complex_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_complex_value_t));[m
[31m-            if (ccv.complex_value == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            log->filter = ccv.complex_value;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flush && size == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no buffer is defined for access_log \"%V\"",[m
[31m-                           &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-[m
[31m-        if (log->script) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "buffered logs cannot have variables in name");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (log->syslog_peer) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "logs to syslog cannot be buffered");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (log->file->data) {[m
[31m-            buffer = log->file->data;[m
[31m-[m
[31m-            if (buffer->last - buffer->start != size[m
[31m-                || buffer->flush != flush[m
[31m-                || buffer->gzip != gzip)[m
[31m-            {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "access_log \"%V\" already defined "[m
[31m-                                   "with conflicting parameters",[m
[31m-                                   &value[1]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        buffer = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_buf_t));[m
[31m-        if (buffer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buffer->start = ngx_pnalloc(cf->pool, size);[m
[31m-        if (buffer->start == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buffer->pos = buffer->start;[m
[31m-        buffer->last = buffer->start + size;[m
[31m-[m
[31m-        if (flush) {[m
[31m-            buffer->event = ngx_pcalloc(cf->pool, sizeof(ngx_event_t));[m
[31m-            if (buffer->event == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            buffer->event->data = log->file;[m
[31m-            buffer->event->handler = ngx_http_log_flush_handler;[m
[31m-            buffer->event->log = &cf->cycle->new_log;[m
[31m-            buffer->event->cancelable = 1;[m
[31m-[m
[31m-            buffer->flush = flush;[m
[31m-        }[m
[31m-[m
[31m-        buffer->gzip = gzip;[m
[31m-[m
[31m-        log->file->flush = ngx_http_log_flush;[m
[31m-        log->file->data = buffer;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_main_conf_t *lmcf = conf;[m
[31m-[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_http_log_fmt_t  *fmt;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-    for (i = 0; i < lmcf->formats.nelts; i++) {[m
[31m-        if (fmt[i].name.len == value[1].len[m
[31m-            && ngx_strcmp(fmt[i].name.data, value[1].data) == 0)[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate \"log_format\" name \"%V\"",[m
[31m-                               &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fmt = ngx_array_push(&lmcf->formats);[m
[31m-    if (fmt == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fmt->name = value[1];[m
[31m-[m
[31m-    fmt->flushes = ngx_array_create(cf->pool, 4, sizeof(ngx_int_t));[m
[31m-    if (fmt->flushes == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t));[m
[31m-    if (fmt->ops == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_log_compile_format(cf, fmt->flushes, fmt->ops, cf->args, 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_compile_format(ngx_conf_t *cf, ngx_array_t *flushes,[m
[31m-    ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s)[m
[31m-{[m
[31m-    u_char              *data, *p, ch;[m
[31m-    size_t               i, len;[m
[31m-    ngx_str_t           *value, var;[m
[31m-    ngx_int_t           *flush;[m
[31m-    ngx_uint_t           bracket;[m
[31m-    ngx_http_log_op_t   *op;[m
[31m-    ngx_http_log_var_t  *v;[m
[31m-[m
[31m-    value = args->elts;[m
[31m-[m
[31m-    for ( /* void */ ; s < args->nelts; s++) {[m
[31m-[m
[31m-        i = 0;[m
[31m-[m
[31m-        while (i < value[s].len) {[m
[31m-[m
[31m-            op = ngx_array_push(ops);[m
[31m-            if (op == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            data = &value[s].data[i];[m
[31m-[m
[31m-            if (value[s].data[i] == '$') {[m
[31m-[m
[31m-                if (++i == value[s].len) {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                if (value[s].data[i] == '{') {[m
[31m-                    bracket = 1;[m
[31m-[m
[31m-                    if (++i == value[s].len) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                    var.data = &value[s].data[i];[m
[31m-[m
[31m-                } else {[m
[31m-                    bracket = 0;[m
[31m-                    var.data = &value[s].data[i];[m
[31m-                }[m
[31m-[m
[31m-                for (var.len = 0; i < value[s].len; i++, var.len++) {[m
[31m-                    ch = value[s].data[i];[m
[31m-[m
[31m-                    if (ch == '}' && bracket) {[m
[31m-                        i++;[m
[31m-                        bracket = 0;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if ((ch >= 'A' && ch <= 'Z')[m
[31m-                        || (ch >= 'a' && ch <= 'z')[m
[31m-                        || (ch >= '0' && ch <= '9')[m
[31m-                        || ch == '_')[m
[31m-                    {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (bracket) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "the closing bracket in \"%V\" "[m
[31m-                                       "variable is missing", &var);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (var.len == 0) {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                for (v = ngx_http_log_vars; v->name.len; v++) {[m
[31m-[m
[31m-                    if (v->name.len == var.len[m
[31m-                        && ngx_strncmp(v->name.data, var.data, var.len) == 0)[m
[31m-                    {[m
[31m-                        op->len = v->len;[m
[31m-                        op->getlen = NULL;[m
[31m-                        op->run = v->run;[m
[31m-                        op->data = 0;[m
[31m-[m
[31m-                        goto found;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_http_log_variable_compile(cf, op, &var) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (flushes) {[m
[31m-[m
[31m-                    flush = ngx_array_push(flushes);[m
[31m-                    if (flush == NULL) {[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    *flush = op->data; /* variable index */[m
[31m-                }[m
[31m-[m
[31m-            found:[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            while (i < value[s].len && value[s].data[i] != '$') {[m
[31m-                i++;[m
[31m-            }[m
[31m-[m
[31m-            len = &value[s].data[i] - data;[m
[31m-[m
[31m-            if (len) {[m
[31m-[m
[31m-                op->len = len;[m
[31m-                op->getlen = NULL;[m
[31m-[m
[31m-                if (len <= sizeof(uintptr_t)) {[m
[31m-                    op->run = ngx_http_log_copy_short;[m
[31m-                    op->data = 0;[m
[31m-[m
[31m-                    while (len--) {[m
[31m-                        op->data <<= 8;[m
[31m-                        op->data |= data[len];[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    op->run = ngx_http_log_copy_long;[m
[31m-[m
[31m-                    p = ngx_pnalloc(cf->pool, len);[m
[31m-                    if (p == NULL) {[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_memcpy(p, data, len);[m
[31m-                    op->data = (uintptr_t) p;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%s\"", data);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *llcf = conf;[m
[31m-[m
[31m-    time_t       inactive, valid;[m
[31m-    ngx_str_t   *value, s;[m
[31m-    ngx_int_t    max, min_uses;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (llcf->open_file_cache != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    max = 0;[m
[31m-    inactive = 10;[m
[31m-    valid = 60;[m
[31m-    min_uses = 1;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", 4) == 0) {[m
[31m-[m
[31m-            max = ngx_atoi(value[i].data + 4, value[i].len - 4);[m
[31m-            if (max == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "min_uses=", 9) == 0) {[m
[31m-[m
[31m-            min_uses = ngx_atoi(value[i].data + 9, value[i].len - 9);[m
[31m-            if (min_uses == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "valid=", 6) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 6;[m
[31m-            s.data = value[i].data + 6;[m
[31m-[m
[31m-            valid = ngx_parse_time(&s, 1);[m
[31m-            if (valid == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-[m
[31m-            llcf->open_file_cache = NULL;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    failed:[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid \"open_log_file_cache\" parameter \"%V\"",[m
[31m-                           &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->open_file_cache == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (max == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "\"open_log_file_cache\" must have \"max\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive);[m
[31m-[m
[31m-    if (llcf->open_file_cache) {[m
[31m-[m
[31m-        llcf->open_file_cache_valid = valid;[m
[31m-        llcf->open_file_cache_min_uses = min_uses;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_array_t                 a;[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_log_fmt_t         *fmt;[m
[31m-    ngx_http_log_main_conf_t   *lmcf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-[m
[31m-    if (lmcf->combined_used) {[m
[31m-        if (ngx_array_init(&a, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = ngx_array_push(&a);[m
[31m-        if (value == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *value = ngx_http_combined_fmt;[m
[31m-        fmt = lmcf->formats.elts;[m
[31m-[m
[31m-        if (ngx_http_log_compile_format(cf, NULL, fmt->ops, &a, 0)[m
[31m-            != NGX_CONF_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_log_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_log_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_log_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex df9424f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_log_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,1794 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-#include <zlib.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_log_op_s  ngx_http_log_op_t;[m
[31m-[m
[31m-typedef u_char *(*ngx_http_log_op_run_pt) (ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-[m
[31m-typedef size_t (*ngx_http_log_op_getlen_pt) (ngx_http_request_t *r,[m
[31m-    uintptr_t data);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_log_op_s {[m
[31m-    size_t                      len;[m
[31m-    ngx_http_log_op_getlen_pt   getlen;[m
[31m-    ngx_http_log_op_run_pt      run;[m
[31m-    uintptr_t                   data;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_array_t                *flushes;[m
[31m-    ngx_array_t                *ops;        /* array of ngx_http_log_op_t */[m
[31m-} ngx_http_log_fmt_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                 formats;    /* array of ngx_http_log_fmt_t */[m
[31m-    ngx_uint_t                  combined_used; /* unsigned  combined_used:1 */[m
[31m-} ngx_http_log_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *start;[m
[31m-    u_char                     *pos;[m
[31m-    u_char                     *last;[m
[31m-[m
[31m-    ngx_event_t                *event;[m
[31m-    ngx_msec_t                  flush;[m
[31m-    ngx_int_t                   gzip;[m
[31m-} ngx_http_log_buf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *lengths;[m
[31m-    ngx_array_t                *values;[m
[31m-} ngx_http_log_script_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_open_file_t            *file;[m
[31m-    ngx_http_log_script_t      *script;[m
[31m-    time_t                      disk_full_time;[m
[31m-    time_t                      error_log_time;[m
[31m-    ngx_syslog_peer_t          *syslog_peer;[m
[31m-    ngx_http_log_fmt_t         *format;[m
[31m-    ngx_http_complex_value_t   *filter;[m
[31m-} ngx_http_log_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                *logs;       /* array of ngx_http_log_t */[m
[31m-[m
[31m-    ngx_open_file_cache_t      *open_file_cache;[m
[31m-    time_t                      open_file_cache_valid;[m
[31m-    ngx_uint_t                  open_file_cache_min_uses;[m
[31m-[m
[31m-    ngx_uint_t                  off;        /* unsigned  off:1 */[m
[31m-} ngx_http_log_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   name;[m
[31m-    size_t                      len;[m
[31m-    ngx_http_log_op_run_pt      run;[m
[31m-} ngx_http_log_var_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log,[m
[31m-    u_char *buf, size_t len);[m
[31m-static ssize_t ngx_http_log_script_write(ngx_http_request_t *r,[m
[31m-    ngx_http_log_script_t *script, u_char **name, u_char *buf, size_t len);[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-static ssize_t ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len,[m
[31m-    ngx_int_t level, ngx_log_t *log);[m
[31m-[m
[31m-static void *ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size);[m
[31m-static void ngx_http_log_gzip_free(void *opaque, void *address);[m
[31m-#endif[m
[31m-[m
[31m-static void ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log);[m
[31m-static void ngx_http_log_flush_handler(ngx_event_t *ev);[m
[31m-[m
[31m-static u_char *ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_msec(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_status(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_body_bytes_sent(ngx_http_request_t *r,[m
[31m-    u_char *buf, ngx_http_log_op_t *op);[m
[31m-static u_char *ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-[m
[31m-static ngx_int_t ngx_http_log_variable_compile(ngx_conf_t *cf,[m
[31m-    ngx_http_log_op_t *op, ngx_str_t *value);[m
[31m-static size_t ngx_http_log_variable_getlen(ngx_http_request_t *r,[m
[31m-    uintptr_t data);[m
[31m-static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op);[m
[31m-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_log_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_log_compile_format(ngx_conf_t *cf,[m
[31m-    ngx_array_t *flushes, ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s);[m
[31m-static char *ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_log_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_log_commands[] = {[m
[31m-[m
[31m-    { ngx_string("log_format"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_log_set_format,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("access_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_HTTP_LMT_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_log_set_log,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_log_file_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_http_log_open_file_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_log_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_log_init,                     /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_log_create_main_conf,         /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_log_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_log_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_log_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_log_module_ctx,              /* module context */[m
[31m-    ngx_http_log_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_access_log = ngx_string(NGX_HTTP_LOG_PATH);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_combined_fmt =[m
[31m-    ngx_string("$remote_addr - $remote_user [$time_local] "[m
[31m-               "\"$request\" $status $body_bytes_sent "[m
[31m-               "\"$http_referer\" \"$http_user_agent\"");[m
[31m-[m
[31m-[m
[31m-static ngx_http_log_var_t  ngx_http_log_vars[] = {[m
[31m-    { ngx_string("pipe"), 1, ngx_http_log_pipe },[m
[31m-    { ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1,[m
[31m-                          ngx_http_log_time },[m
[31m-    { ngx_string("time_iso8601"), sizeof("1970-09-28T12:00:00+06:00") - 1,[m
[31m-                          ngx_http_log_iso8601 },[m
[31m-    { ngx_string("msec"), NGX_TIME_T_LEN + 4, ngx_http_log_msec },[m
[31m-    { ngx_string("request_time"), NGX_TIME_T_LEN + 4,[m
[31m-                          ngx_http_log_request_time },[m
[31m-    { ngx_string("status"), NGX_INT_T_LEN, ngx_http_log_status },[m
[31m-    { ngx_string("bytes_sent"), NGX_OFF_T_LEN, ngx_http_log_bytes_sent },[m
[31m-    { ngx_string("body_bytes_sent"), NGX_OFF_T_LEN,[m
[31m-                          ngx_http_log_body_bytes_sent },[m
[31m-    { ngx_string("request_length"), NGX_SIZE_T_LEN,[m
[31m-                          ngx_http_log_request_length },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                   *line, *p;[m
[31m-    size_t                    len, size;[m
[31m-    ssize_t                   n;[m
[31m-    ngx_str_t                 val;[m
[31m-    ngx_uint_t                i, l;[m
[31m-    ngx_http_log_t           *log;[m
[31m-    ngx_http_log_op_t        *op;[m
[31m-    ngx_http_log_buf_t       *buffer;[m
[31m-    ngx_http_log_loc_conf_t  *lcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log handler");[m
[31m-[m
[31m-    lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    if (lcf->off) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    log = lcf->logs->elts;[m
[31m-    for (l = 0; l < lcf->logs->nelts; l++) {[m
[31m-[m
[31m-        if (log[l].filter) {[m
[31m-            if (ngx_http_complex_value(r, log[l].filter, &val) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (val.len == 0 || (val.len == 1 && val.data[0] == '0')) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_time() == log[l].disk_full_time) {[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD writing to a full filesystem with enabled softupdates[m
[31m-             * may block process for much longer time than writing to non-full[m
[31m-             * filesystem, so we skip writing to a log for one second[m
[31m-             */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, log[l].format->flushes);[m
[31m-[m
[31m-        len = 0;[m
[31m-        op = log[l].format->ops->elts;[m
[31m-        for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-            if (op[i].len == 0) {[m
[31m-                len += op[i].getlen(r, op[i].data);[m
[31m-[m
[31m-            } else {[m
[31m-                len += op[i].len;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-[m
[31m-            /* length of syslog's PRI and HEADER message parts */[m
[31m-            len += sizeof("<255>Jan 01 00:00:00 ") - 1[m
[31m-                   + ngx_cycle->hostname.len + 1[m
[31m-                   + log[l].syslog_peer->tag.len + 2;[m
[31m-[m
[31m-            goto alloc_line;[m
[31m-        }[m
[31m-[m
[31m-        len += NGX_LINEFEED_SIZE;[m
[31m-[m
[31m-        buffer = log[l].file ? log[l].file->data : NULL;[m
[31m-[m
[31m-        if (buffer) {[m
[31m-[m
[31m-            if (len > (size_t) (buffer->last - buffer->pos)) {[m
[31m-[m
[31m-                ngx_http_log_write(r, &log[l], buffer->start,[m
[31m-                                   buffer->pos - buffer->start);[m
[31m-[m
[31m-                buffer->pos = buffer->start;[m
[31m-            }[m
[31m-[m
[31m-            if (len <= (size_t) (buffer->last - buffer->pos)) {[m
[31m-[m
[31m-                p = buffer->pos;[m
[31m-[m
[31m-                if (buffer->event && p == buffer->start) {[m
[31m-                    ngx_add_timer(buffer->event, buffer->flush);[m
[31m-                }[m
[31m-[m
[31m-                for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-                    p = op[i].run(r, p, &op[i]);[m
[31m-                }[m
[31m-[m
[31m-                ngx_linefeed(p);[m
[31m-[m
[31m-                buffer->pos = p;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (buffer->event && buffer->event->timer_set) {[m
[31m-                ngx_del_timer(buffer->event);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    alloc_line:[m
[31m-[m
[31m-        line = ngx_pnalloc(r->pool, len);[m
[31m-        if (line == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = line;[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-            p = ngx_syslog_add_header(log[l].syslog_peer, line);[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < log[l].format->ops->nelts; i++) {[m
[31m-            p = op[i].run(r, p, &op[i]);[m
[31m-        }[m
[31m-[m
[31m-        if (log[l].syslog_peer) {[m
[31m-[m
[31m-            size = p - line;[m
[31m-[m
[31m-            n = ngx_syslog_send(log[l].syslog_peer, line, size);[m
[31m-[m
[31m-            if (n < 0) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "send() to syslog failed");[m
[31m-[m
[31m-            } else if ((size_t) n != size) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "send() to syslog has written only %z of %uz",[m
[31m-                              n, size);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_linefeed(p);[m
[31m-[m
[31m-        ngx_http_log_write(r, &log[l], line, p - line);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log, u_char *buf,[m
[31m-    size_t len)[m
[31m-{[m
[31m-    u_char              *name;[m
[31m-    time_t               now;[m
[31m-    ssize_t              n;[m
[31m-    ngx_err_t            err;[m
[31m-#if (NGX_ZLIB)[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-#endif[m
[31m-[m
[31m-    if (log->script == NULL) {[m
[31m-        name = log->file->name.data;[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-        buffer = log->file->data;[m
[31m-[m
[31m-        if (buffer && buffer->gzip) {[m
[31m-            n = ngx_http_log_gzip(log->file->fd, buf, len, buffer->gzip,[m
[31m-                                  r->connection->log);[m
[31m-        } else {[m
[31m-            n = ngx_write_fd(log->file->fd, buf, len);[m
[31m-        }[m
[31m-#else[m
[31m-        n = ngx_write_fd(log->file->fd, buf, len);[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        name = NULL;[m
[31m-        n = ngx_http_log_script_write(r, log->script, &name, buf, len);[m
[31m-    }[m
[31m-[m
[31m-    if (n == (ssize_t) len) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOSPC) {[m
[31m-            log->disk_full_time = now;[m
[31m-        }[m
[31m-[m
[31m-        if (now - log->error_log_time > 59) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, err,[m
[31m-                          ngx_write_fd_n " to \"%s\" failed", name);[m
[31m-[m
[31m-            log->error_log_time = now;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (now - log->error_log_time > 59) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",[m
[31m-                      name, n, len);[m
[31m-[m
[31m-        log->error_log_time = now;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_log_script_write(ngx_http_request_t *r, ngx_http_log_script_t *script,[m
[31m-    u_char **name, u_char *buf, size_t len)[m
[31m-{[m
[31m-    size_t                     root;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_str_t                  log, path;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_log_loc_conf_t   *llcf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->root_tested) {[m
[31m-[m
[31m-        /* test root directory existence */[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        path.data[root] = '\0';[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_dir = 1;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            if (of.err == 0) {[m
[31m-                /* simulate successful logging */[m
[31m-                return len;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, of.err,[m
[31m-                          "testing \"%s\" existence failed", path.data);[m
[31m-[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-[m
[31m-        if (!of.is_dir) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ENOTDIR,[m
[31m-                          "testing \"%s\" existence failed", path.data);[m
[31m-[m
[31m-            /* simulate successful logging */[m
[31m-            return len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &log, script->lengths->elts, 1,[m
[31m-                            script->values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    log.data[log.len - 1] = '\0';[m
[31m-    *name = log.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log \"%s\"", log.data);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.log = 1;[m
[31m-    of.valid = llcf->open_file_cache_valid;[m
[31m-    of.min_uses = llcf->open_file_cache_min_uses;[m
[31m-    of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &log, &of) != NGX_OK) {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(llcf->open_file_cache, &log, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      "%s \"%s\" failed", of.failed, log.data);[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http log #%d", of.fd);[m
[31m-[m
[31m-    n = ngx_write_fd(of.fd, buf, len);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len, ngx_int_t level,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    int          rc, wbits, memlevel;[m
[31m-    u_char      *out;[m
[31m-    size_t       size;[m
[31m-    ssize_t      n;[m
[31m-    z_stream     zstream;[m
[31m-    ngx_err_t    err;[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    wbits = MAX_WBITS;[m
[31m-    memlevel = MAX_MEM_LEVEL - 1;[m
[31m-[m
[31m-    while ((ssize_t) len < ((1 << (wbits - 1)) - 262)) {[m
[31m-        wbits--;[m
[31m-        memlevel--;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * This is a formula from deflateBound() for conservative upper bound of[m
[31m-     * compressed data plus 18 bytes of gzip wrapper.[m
[31m-     */[m
[31m-[m
[31m-    size = len + ((len + 7) >> 3) + ((len + 63) >> 6) + 5 + 18;[m
[31m-[m
[31m-    ngx_memzero(&zstream, sizeof(z_stream));[m
[31m-[m
[31m-    pool = ngx_create_pool(256, log);[m
[31m-    if (pool == NULL) {[m
[31m-        /* simulate successful logging */[m
[31m-        return len;[m
[31m-    }[m
[31m-[m
[31m-    pool->log = log;[m
[31m-[m
[31m-    zstream.zalloc = ngx_http_log_gzip_alloc;[m
[31m-    zstream.zfree = ngx_http_log_gzip_free;[m
[31m-    zstream.opaque = pool;[m
[31m-[m
[31m-    out = ngx_pnalloc(pool, size);[m
[31m-    if (out == NULL) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    zstream.next_in = buf;[m
[31m-    zstream.avail_in = len;[m
[31m-    zstream.next_out = out;[m
[31m-    zstream.avail_out = size;[m
[31m-[m
[31m-    rc = deflateInit2(&zstream, (int) level, Z_DEFLATED, wbits + 16, memlevel,[m
[31m-                      Z_DEFAULT_STRATEGY);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateInit2() failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "deflate in: ni:%p no:%p ai:%ud ao:%ud",[m
[31m-                   zstream.next_in, zstream.next_out,[m
[31m-                   zstream.avail_in, zstream.avail_out);[m
[31m-[m
[31m-    rc = deflate(&zstream, Z_FINISH);[m
[31m-[m
[31m-    if (rc != Z_STREAM_END) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "deflate(Z_FINISH) failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",[m
[31m-                   zstream.next_in, zstream.next_out,[m
[31m-                   zstream.avail_in, zstream.avail_out,[m
[31m-                   rc);[m
[31m-[m
[31m-    size -= zstream.avail_out;[m
[31m-[m
[31m-    rc = deflateEnd(&zstream);[m
[31m-[m
[31m-    if (rc != Z_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateEnd() failed: %d", rc);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_fd(fd, out, size);[m
[31m-[m
[31m-    if (n != (ssize_t) size) {[m
[31m-        err = (n == -1) ? ngx_errno : 0;[m
[31m-[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-        ngx_set_errno(err);[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-[m
[31m-    /* simulate successful logging */[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size)[m
[31m-{[m
[31m-    ngx_pool_t *pool = opaque;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pool->log, 0,[m
[31m-                   "gzip alloc: n:%ud s:%ud", items, size);[m
[31m-[m
[31m-    return ngx_palloc(pool, items * size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_gzip_free(void *opaque, void *address)[m
[31m-{[m
[31m-#if 0[m
[31m-    ngx_pool_t *pool = opaque;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0, "gzip free: %p", address);[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log)[m
[31m-{[m
[31m-    size_t               len;[m
[31m-    ssize_t              n;[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-[m
[31m-    buffer = file->data;[m
[31m-[m
[31m-    len = buffer->pos - buffer->start;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_ZLIB)[m
[31m-    if (buffer->gzip) {[m
[31m-        n = ngx_http_log_gzip(file->fd, buffer->start, len, buffer->gzip, log);[m
[31m-    } else {[m
[31m-        n = ngx_write_fd(file->fd, buffer->start, len);[m
[31m-    }[m
[31m-#else[m
[31m-    n = ngx_write_fd(file->fd, buffer->start, len);[m
[31m-#endif[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      ngx_write_fd_n " to \"%s\" failed",[m
[31m-                      file->name.data);[m
[31m-[m
[31m-    } else if ((size_t) n != len) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",[m
[31m-                      file->name.data, n, len);[m
[31m-    }[m
[31m-[m
[31m-    buffer->pos = buffer->start;[m
[31m-[m
[31m-    if (buffer->event && buffer->event->timer_set) {[m
[31m-        ngx_del_timer(buffer->event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_flush_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_open_file_t     *file;[m
[31m-    ngx_http_log_buf_t  *buffer;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0,[m
[31m-                   "http log buffer flush handler");[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ngx_http_log_flush(ev->data, ev->log);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* cancel the flush timer for graceful shutdown */[m
[31m-[m
[31m-    file = ev->data;[m
[31m-    buffer = file->data;[m
[31m-[m
[31m-    buffer->event = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_copy_short(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    size_t     len;[m
[31m-    uintptr_t  data;[m
[31m-[m
[31m-    len = op->len;[m
[31m-    data = op->data;[m
[31m-[m
[31m-    while (len--) {[m
[31m-        *buf++ = (u_char) (data & 0xff);[m
[31m-        data >>= 8;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_copy_long(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, (u_char *) op->data, op->len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    if (r->pipeline) {[m
[31m-        *buf = 'p';[m
[31m-    } else {[m
[31m-        *buf = '.';[m
[31m-    }[m
[31m-[m
[31m-    return buf + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_time(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, ngx_cached_http_log_time.data,[m
[31m-                      ngx_cached_http_log_time.len);[m
[31m-}[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_cpymem(buf, ngx_cached_http_log_iso8601.data,[m
[31m-                      ngx_cached_http_log_iso8601.len);[m
[31m-}[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_msec(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_time_t  *tp;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%T.%03M", tp->sec, tp->msec);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_time_t      *tp;[m
[31m-    ngx_msec_int_t   ms;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ms = (ngx_msec_int_t)[m
[31m-             ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec));[m
[31m-    ms = ngx_max(ms, 0);[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%T.%03M", (time_t) ms / 1000, ms % 1000);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_status(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_uint_t  status;[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        status = r->err_status;[m
[31m-[m
[31m-    } else if (r->headers_out.status) {[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-    } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-        status = 9;[m
[31m-[m
[31m-    } else {[m
[31m-        status = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_sprintf(buf, "%03ui", status);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_sprintf(buf, "%O", r->connection->sent);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * although there is a real $body_bytes_sent variable,[m
[31m- * this log operation code function is more optimized for logging[m
[31m- */[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_body_bytes_sent(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    off_t  length;[m
[31m-[m
[31m-    length = r->connection->sent - r->header_size;[m
[31m-[m
[31m-    if (length > 0) {[m
[31m-        return ngx_sprintf(buf, "%O", length);[m
[31m-    }[m
[31m-[m
[31m-    *buf = '0';[m
[31m-[m
[31m-    return buf + 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    return ngx_sprintf(buf, "%O", r->request_length);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_variable_compile(ngx_conf_t *cf, ngx_http_log_op_t *op,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t  index;[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, value);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    op->len = 0;[m
[31m-    op->getlen = ngx_http_log_variable_getlen;[m
[31m-    op->run = ngx_http_log_variable;[m
[31m-    op->data = index;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)[m
[31m-{[m
[31m-    uintptr_t                   len;[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    value = ngx_http_get_indexed_variable(r, data);[m
[31m-[m
[31m-    if (value == NULL || value->not_found) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_http_log_escape(NULL, value->data, value->len);[m
[31m-[m
[31m-    value->escape = len ? 1 : 0;[m
[31m-[m
[31m-    return value->len + len * 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    value = ngx_http_get_indexed_variable(r, op->data);[m
[31m-[m
[31m-    if (value == NULL || value->not_found) {[m
[31m-        *buf = '-';[m
[31m-        return buf + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (value->escape == 0) {[m
[31m-        return ngx_cpymem(buf, value->data, value->len);[m
[31m-[m
[31m-    } else {[m
[31m-        return (u_char *) ngx_http_log_escape(buf, value->data, value->len);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uintptr_t[m
[31m-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    ngx_uint_t      n;[m
[31m-    static u_char   hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-    static uint32_t   escape[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000004, /* 0000 0000 0000 0000  0000 0000 0000 0100 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x10000000, /* 0001 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '\\';[m
[31m-            *dst++ = 'x';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_log_main_conf_t  *conf;[m
[31m-[m
[31m-    ngx_http_log_fmt_t  *fmt;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&conf->formats, cf->pool, 4, sizeof(ngx_http_log_fmt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    fmt = ngx_array_push(&conf->formats);[m
[31m-    if (fmt == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&fmt->name, "combined");[m
[31m-[m
[31m-    fmt->flushes = NULL;[m
[31m-[m
[31m-    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t));[m
[31m-    if (fmt->ops == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_log_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->open_file_cache = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *prev = parent;[m
[31m-    ngx_http_log_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_http_log_t            *log;[m
[31m-    ngx_http_log_fmt_t        *fmt;[m
[31m-    ngx_http_log_main_conf_t  *lmcf;[m
[31m-[m
[31m-    if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        conf->open_file_cache = prev->open_file_cache;[m
[31m-        conf->open_file_cache_valid = prev->open_file_cache_valid;[m
[31m-        conf->open_file_cache_min_uses = prev->open_file_cache_min_uses;[m
[31m-[m
[31m-        if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->open_file_cache = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->logs || conf->off) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf->logs = prev->logs;[m
[31m-    conf->off = prev->off;[m
[31m-[m
[31m-    if (conf->logs || conf->off) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t));[m
[31m-    if (conf->logs == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    log = ngx_array_push(conf->logs);[m
[31m-    if (log == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(log, sizeof(ngx_http_log_t));[m
[31m-[m
[31m-    log->file = ngx_conf_open_file(cf->cycle, &ngx_http_access_log);[m
[31m-    if (log->file == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-[m
[31m-    /* the default "combined" format */[m
[31m-    log->format = &fmt[0];[m
[31m-    lmcf->combined_used = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *llcf = conf;[m
[31m-[m
[31m-    ssize_t                            size;[m
[31m-    ngx_int_t                          gzip;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_msec_t                         flush;[m
[31m-    ngx_str_t                         *value, name, s;[m
[31m-    ngx_http_log_t                    *log;[m
[31m-    ngx_syslog_peer_t                 *peer;[m
[31m-    ngx_http_log_buf_t                *buffer;[m
[31m-    ngx_http_log_fmt_t                *fmt;[m
[31m-    ngx_http_log_main_conf_t          *lmcf;[m
[31m-    ngx_http_script_compile_t          sc;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        llcf->off = 1;[m
[31m-        if (cf->args->nelts == 2) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->logs == NULL) {[m
[31m-        llcf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t));[m
[31m-        if (llcf->logs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-[m
[31m-    log = ngx_array_push(llcf->logs);[m
[31m-    if (log == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(log, sizeof(ngx_http_log_t));[m
[31m-[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) {[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log->syslog_peer = peer;[m
[31m-[m
[31m-        goto process_formats;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&value[1]);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        log->file = ngx_conf_open_file(cf->cycle, &value[1]);[m
[31m-        if (log->file == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        log->script = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_script_t));[m
[31m-        if (log->script == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &value[1];[m
[31m-        sc.lengths = &log->script->lengths;[m
[31m-        sc.values = &log->script->values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-process_formats:[m
[31m-[m
[31m-    if (cf->args->nelts >= 3) {[m
[31m-        name = value[2];[m
[31m-[m
[31m-        if (ngx_strcmp(name.data, "combined") == 0) {[m
[31m-            lmcf->combined_used = 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&name, "combined");[m
[31m-        lmcf->combined_used = 1;[m
[31m-    }[m
[31m-[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-    for (i = 0; i < lmcf->formats.nelts; i++) {[m
[31m-        if (fmt[i].name.len == name.len[m
[31m-            && ngx_strcasecmp(fmt[i].name.data, name.data) == 0)[m
[31m-        {[m
[31m-            log->format = &fmt[i];[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (log->format == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unknown log format \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    flush = 0;[m
[31m-    gzip = 0;[m
[31m-[m
[31m-    for (i = 3; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "buffer=", 7) == 0) {[m
[31m-            s.len = value[i].len - 7;[m
[31m-            s.data = value[i].data + 7;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR || size == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid buffer size \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "flush=", 6) == 0) {[m
[31m-            s.len = value[i].len - 6;[m
[31m-            s.data = value[i].data + 6;[m
[31m-[m
[31m-            flush = ngx_parse_time(&s, 0);[m
[31m-[m
[31m-            if (flush == (ngx_msec_t) NGX_ERROR || flush == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid flush time \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "gzip", 4) == 0[m
[31m-            && (value[i].len == 4 || value[i].data[4] == '='))[m
[31m-        {[m
[31m-#if (NGX_ZLIB)[m
[31m-            if (size == 0) {[m
[31m-                size = 64 * 1024;[m
[31m-            }[m
[31m-[m
[31m-            if (value[i].len == 4) {[m
[31m-                gzip = Z_BEST_SPEED;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 5;[m
[31m-            s.data = value[i].data + 5;[m
[31m-[m
[31m-            gzip = ngx_atoi(s.data, s.len);[m
[31m-[m
[31m-            if (gzip < 1 || gzip > 9) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid compression level \"%V\"", &s);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "nginx was built without zlib support");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "if=", 3) == 0) {[m
[31m-            s.len = value[i].len - 3;[m
[31m-            s.data = value[i].data + 3;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &s;[m
[31m-            ccv.complex_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_complex_value_t));[m
[31m-            if (ccv.complex_value == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            log->filter = ccv.complex_value;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flush && size == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no buffer is defined for access_log \"%V\"",[m
[31m-                           &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-[m
[31m-        if (log->script) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "buffered logs cannot have variables in name");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (log->syslog_peer) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "logs to syslog cannot be buffered");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (log->file->data) {[m
[31m-            buffer = log->file->data;[m
[31m-[m
[31m-            if (buffer->last - buffer->start != size[m
[31m-                || buffer->flush != flush[m
[31m-                || buffer->gzip != gzip)[m
[31m-            {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "access_log \"%V\" already defined "[m
[31m-                                   "with conflicting parameters",[m
[31m-                                   &value[1]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        buffer = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_buf_t));[m
[31m-        if (buffer == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buffer->start = ngx_pnalloc(cf->pool, size);[m
[31m-        if (buffer->start == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        buffer->pos = buffer->start;[m
[31m-        buffer->last = buffer->start + size;[m
[31m-[m
[31m-        if (flush) {[m
[31m-            buffer->event = ngx_pcalloc(cf->pool, sizeof(ngx_event_t));[m
[31m-            if (buffer->event == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            buffer->event->data = log->file;[m
[31m-            buffer->event->handler = ngx_http_log_flush_handler;[m
[31m-            buffer->event->log = &cf->cycle->new_log;[m
[31m-            buffer->event->cancelable = 1;[m
[31m-[m
[31m-            buffer->flush = flush;[m
[31m-        }[m
[31m-[m
[31m-        buffer->gzip = gzip;[m
[31m-[m
[31m-        log->file->flush = ngx_http_log_flush;[m
[31m-        log->file->data = buffer;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_main_conf_t *lmcf = conf;[m
[31m-[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_http_log_fmt_t  *fmt;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    fmt = lmcf->formats.elts;[m
[31m-    for (i = 0; i < lmcf->formats.nelts; i++) {[m
[31m-        if (fmt[i].name.len == value[1].len[m
[31m-            && ngx_strcmp(fmt[i].name.data, value[1].data) == 0)[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate \"log_format\" name \"%V\"",[m
[31m-                               &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fmt = ngx_array_push(&lmcf->formats);[m
[31m-    if (fmt == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fmt->name = value[1];[m
[31m-[m
[31m-    fmt->flushes = ngx_array_create(cf->pool, 4, sizeof(ngx_int_t));[m
[31m-    if (fmt->flushes == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t));[m
[31m-    if (fmt->ops == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_log_compile_format(cf, fmt->flushes, fmt->ops, cf->args, 2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_compile_format(ngx_conf_t *cf, ngx_array_t *flushes,[m
[31m-    ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s)[m
[31m-{[m
[31m-    u_char              *data, *p, ch;[m
[31m-    size_t               i, len;[m
[31m-    ngx_str_t           *value, var;[m
[31m-    ngx_int_t           *flush;[m
[31m-    ngx_uint_t           bracket;[m
[31m-    ngx_http_log_op_t   *op;[m
[31m-    ngx_http_log_var_t  *v;[m
[31m-[m
[31m-    value = args->elts;[m
[31m-[m
[31m-    for ( /* void */ ; s < args->nelts; s++) {[m
[31m-[m
[31m-        i = 0;[m
[31m-[m
[31m-        while (i < value[s].len) {[m
[31m-[m
[31m-            op = ngx_array_push(ops);[m
[31m-            if (op == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            data = &value[s].data[i];[m
[31m-[m
[31m-            if (value[s].data[i] == '$') {[m
[31m-[m
[31m-                if (++i == value[s].len) {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                if (value[s].data[i] == '{') {[m
[31m-                    bracket = 1;[m
[31m-[m
[31m-                    if (++i == value[s].len) {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                    var.data = &value[s].data[i];[m
[31m-[m
[31m-                } else {[m
[31m-                    bracket = 0;[m
[31m-                    var.data = &value[s].data[i];[m
[31m-                }[m
[31m-[m
[31m-                for (var.len = 0; i < value[s].len; i++, var.len++) {[m
[31m-                    ch = value[s].data[i];[m
[31m-[m
[31m-                    if (ch == '}' && bracket) {[m
[31m-                        i++;[m
[31m-                        bracket = 0;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if ((ch >= 'A' && ch <= 'Z')[m
[31m-                        || (ch >= 'a' && ch <= 'z')[m
[31m-                        || (ch >= '0' && ch <= '9')[m
[31m-                        || ch == '_')[m
[31m-                    {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (bracket) {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "the closing bracket in \"%V\" "[m
[31m-                                       "variable is missing", &var);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (var.len == 0) {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                for (v = ngx_http_log_vars; v->name.len; v++) {[m
[31m-[m
[31m-                    if (v->name.len == var.len[m
[31m-                        && ngx_strncmp(v->name.data, var.data, var.len) == 0)[m
[31m-                    {[m
[31m-                        op->len = v->len;[m
[31m-                        op->getlen = NULL;[m
[31m-                        op->run = v->run;[m
[31m-                        op->data = 0;[m
[31m-[m
[31m-                        goto found;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_http_log_variable_compile(cf, op, &var) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (flushes) {[m
[31m-[m
[31m-                    flush = ngx_array_push(flushes);[m
[31m-                    if (flush == NULL) {[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    *flush = op->data; /* variable index */[m
[31m-                }[m
[31m-[m
[31m-            found:[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            while (i < value[s].len && value[s].data[i] != '$') {[m
[31m-                i++;[m
[31m-            }[m
[31m-[m
[31m-            len = &value[s].data[i] - data;[m
[31m-[m
[31m-            if (len) {[m
[31m-[m
[31m-                op->len = len;[m
[31m-                op->getlen = NULL;[m
[31m-[m
[31m-                if (len <= sizeof(uintptr_t)) {[m
[31m-                    op->run = ngx_http_log_copy_short;[m
[31m-                    op->data = 0;[m
[31m-[m
[31m-                    while (len--) {[m
[31m-                        op->data <<= 8;[m
[31m-                        op->data |= data[len];[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    op->run = ngx_http_log_copy_long;[m
[31m-[m
[31m-                    p = ngx_pnalloc(cf->pool, len);[m
[31m-                    if (p == NULL) {[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_memcpy(p, data, len);[m
[31m-                    op->data = (uintptr_t) p;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%s\"", data);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_log_loc_conf_t *llcf = conf;[m
[31m-[m
[31m-    time_t       inactive, valid;[m
[31m-    ngx_str_t   *value, s;[m
[31m-    ngx_int_t    max, min_uses;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (llcf->open_file_cache != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    max = 0;[m
[31m-    inactive = 10;[m
[31m-    valid = 60;[m
[31m-    min_uses = 1;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", 4) == 0) {[m
[31m-[m
[31m-            max = ngx_atoi(value[i].data + 4, value[i].len - 4);[m
[31m-            if (max == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "min_uses=", 9) == 0) {[m
[31m-[m
[31m-            min_uses = ngx_atoi(value[i].data + 9, value[i].len - 9);[m
[31m-            if (min_uses == NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "valid=", 6) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 6;[m
[31m-            s.data = value[i].data + 6;[m
[31m-[m
[31m-            valid = ngx_parse_time(&s, 1);[m
[31m-            if (valid == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-[m
[31m-            llcf->open_file_cache = NULL;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    failed:[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid \"open_log_file_cache\" parameter \"%V\"",[m
[31m-                           &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->open_file_cache == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (max == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "\"open_log_file_cache\" must have \"max\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive);[m
[31m-[m
[31m-    if (llcf->open_file_cache) {[m
[31m-[m
[31m-        llcf->open_file_cache_valid = valid;[m
[31m-        llcf->open_file_cache_min_uses = min_uses;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_log_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_array_t                 a;[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_log_fmt_t         *fmt;[m
[31m-    ngx_http_log_main_conf_t   *lmcf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);[m
[31m-[m
[31m-    if (lmcf->combined_used) {[m
[31m-        if (ngx_array_init(&a, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = ngx_array_push(&a);[m
[31m-        if (value == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *value = ngx_http_combined_fmt;[m
[31m-        fmt = lmcf->formats.elts;[m
[31m-[m
[31m-        if (ngx_http_log_compile_format(cf, NULL, fmt->ops, &a, 0)[m
[31m-            != NGX_CONF_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_log_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_map_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_map_module.c[m
[1mdeleted file mode 100644[m
[1mindex 091ff09..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_map_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,567 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                  hash_max_size;[m
[31m-    ngx_uint_t                  hash_bucket_size;[m
[31m-} ngx_http_map_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_keys_arrays_t      keys;[m
[31m-[m
[31m-    ngx_array_t                *values_hash;[m
[31m-    ngx_array_t                 var_values;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_array_t                 regexes;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_variable_value_t  *default_value;[m
[31m-    ngx_conf_t                 *cf;[m
[31m-    ngx_uint_t                  hostnames;      /* unsigned  hostnames:1 */[m
[31m-} ngx_http_map_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_map_t              map;[m
[31m-    ngx_http_complex_value_t    value;[m
[31m-    ngx_http_variable_value_t  *default_value;[m
[31m-    ngx_uint_t                  hostnames;      /* unsigned  hostnames:1 */[m
[31m-} ngx_http_map_ctx_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl ngx_http_map_cmp_dns_wildcards(const void *one,[m
[31m-    const void *two);[m
[31m-static void *ngx_http_map_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_map_commands[] = {[m
[31m-[m
[31m-    { ngx_string("map"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,[m
[31m-      ngx_http_map_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("map_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_map_conf_t, hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("map_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_map_conf_t, hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_map_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_map_create_conf,              /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_map_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_map_module_ctx,              /* module context */[m
[31m-    ngx_http_map_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_map_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_map_ctx_t  *map = (ngx_http_map_ctx_t *) data;[m
[31m-[m
[31m-    ngx_str_t                   val;[m
[31m-    ngx_http_variable_value_t  *value;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http map started");[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &map->value, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (map->hostnames && val.len > 0 && val.data[val.len - 1] == '.') {[m
[31m-        val.len--;[m
[31m-    }[m
[31m-[m
[31m-    value = ngx_http_map_find(r, &map->map, &val);[m
[31m-[m
[31m-    if (value == NULL) {[m
[31m-        value = map->default_value;[m
[31m-    }[m
[31m-[m
[31m-    if (!value->valid) {[m
[31m-        value = ngx_http_get_flushed_variable(r, (uintptr_t) value->data);[m
[31m-[m
[31m-        if (value == NULL || value->not_found) {[m
[31m-            value = &ngx_http_variable_null_value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *v = *value;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http map: \"%V\" \"%v\"", &val, v);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_map_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_map_conf_t  *mcf;[m
[31m-[m
[31m-    mcf = ngx_palloc(cf->pool, sizeof(ngx_http_map_conf_t));[m
[31m-    if (mcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    mcf->hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    mcf->hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return mcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_map_conf_t  *mcf = conf;[m
[31m-[m
[31m-    char                              *rv;[m
[31m-    ngx_str_t                         *value, name;[m
[31m-    ngx_conf_t                         save;[m
[31m-    ngx_pool_t                        *pool;[m
[31m-    ngx_hash_init_t                    hash;[m
[31m-    ngx_http_map_ctx_t                *map;[m
[31m-    ngx_http_variable_t               *var;[m
[31m-    ngx_http_map_conf_ctx_t            ctx;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (mcf->hash_max_size == NGX_CONF_UNSET_UINT) {[m
[31m-        mcf->hash_max_size = 2048;[m
[31m-    }[m
[31m-[m
[31m-    if (mcf->hash_bucket_size == NGX_CONF_UNSET_UINT) {[m
[31m-        mcf->hash_bucket_size = ngx_cacheline_size;[m
[31m-[m
[31m-    } else {[m
[31m-        mcf->hash_bucket_size = ngx_align(mcf->hash_bucket_size,[m
[31m-                                          ngx_cacheline_size);[m
[31m-    }[m
[31m-[m
[31m-    map = ngx_pcalloc(cf->pool, sizeof(ngx_http_map_ctx_t));[m
[31m-    if (map == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &map->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name = value[2];[m
[31m-[m
[31m-    if (name.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name.len--;[m
[31m-    name.data++;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_map_variable;[m
[31m-    var->data = (uintptr_t) map;[m
[31m-[m
[31m-    pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx.keys.pool = cf->pool;[m
[31m-    ctx.keys.temp_pool = pool;[m
[31m-[m
[31m-    if (ngx_hash_keys_array_init(&ctx.keys, NGX_HASH_LARGE) != NGX_OK) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx.values_hash = ngx_pcalloc(pool, sizeof(ngx_array_t) * ctx.keys.hsize);[m
[31m-    if (ctx.values_hash == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&ctx.var_values, cf->pool, 2,[m
[31m-                       sizeof(ngx_http_variable_value_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (ngx_array_init(&ctx.regexes, cf->pool, 2, sizeof(ngx_http_map_regex_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx.default_value = NULL;[m
[31m-    ctx.cf = &save;[m
[31m-    ctx.hostnames = 0;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->pool = pool;[m
[31m-    cf->ctx = &ctx;[m
[31m-    cf->handler = ngx_http_map;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    map->default_value = ctx.default_value ? ctx.default_value:[m
[31m-                                             &ngx_http_variable_null_value;[m
[31m-[m
[31m-    map->hostnames = ctx.hostnames;[m
[31m-[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = mcf->hash_max_size;[m
[31m-    hash.bucket_size = mcf->hash_bucket_size;[m
[31m-    hash.name = "map_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-[m
[31m-    if (ctx.keys.keys.nelts) {[m
[31m-        hash.hash = &map->map.hash.hash;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, ctx.keys.keys.elts, ctx.keys.keys.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_destroy_pool(pool);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx.keys.dns_wc_head.nelts) {[m
[31m-[m
[31m-        ngx_qsort(ctx.keys.dns_wc_head.elts,[m
[31m-                  (size_t) ctx.keys.dns_wc_head.nelts,[m
[31m-                  sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_head.elts,[m
[31m-                                   ctx.keys.dns_wc_head.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_destroy_pool(pool);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        map->map.hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx.keys.dns_wc_tail.nelts) {[m
[31m-[m
[31m-        ngx_qsort(ctx.keys.dns_wc_tail.elts,[m
[31m-                  (size_t) ctx.keys.dns_wc_tail.nelts,[m
[31m-                  sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_tail.elts,[m
[31m-                                   ctx.keys.dns_wc_tail.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_destroy_pool(pool);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        map->map.hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (ctx.regexes.nelts) {[m
[31m-        map->map.regex = ctx.regexes.elts;[m
[31m-        map->map.nregex = ctx.regexes.nelts;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_map_cmp_dns_wildcards(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_hash_key_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_hash_key_t *) one;[m
[31m-    second = (ngx_hash_key_t *) two;[m
[31m-[m
[31m-    return ngx_dns_strcmp(first->key.data, second->key.data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    ngx_int_t                   rv, index;[m
[31m-    ngx_str_t                  *value, name;[m
[31m-    ngx_uint_t                  i, key;[m
[31m-    ngx_http_map_conf_ctx_t    *ctx;[m
[31m-    ngx_http_variable_value_t  *var, **vp;[m
[31m-[m
[31m-    ctx = cf->ctx;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 1[m
[31m-        && ngx_strcmp(value[0].data, "hostnames") == 0)[m
[31m-    {[m
[31m-        ctx->hostnames = 1;[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    } else if (cf->args->nelts != 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number of the map parameters");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "include") == 0) {[m
[31m-        return ngx_conf_include(cf, dummy, conf);[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '$') {[m
[31m-        name = value[1];[m
[31m-        name.len--;[m
[31m-        name.data++;[m
[31m-[m
[31m-        index = ngx_http_get_variable_index(ctx->cf, &name);[m
[31m-        if (index == NGX_ERROR) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var = ctx->var_values.elts;[m
[31m-[m
[31m-        for (i = 0; i < ctx->var_values.nelts; i++) {[m
[31m-            if (index == (intptr_t) var[i].data) {[m
[31m-                var = &var[i];[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        var = ngx_array_push(&ctx->var_values);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->valid = 0;[m
[31m-        var->no_cacheable = 0;[m
[31m-        var->not_found = 0;[m
[31m-        var->len = 0;[m
[31m-        var->data = (u_char *) (intptr_t) index;[m
[31m-[m
[31m-        goto found;[m
[31m-    }[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (i = 0; i < value[1].len; i++) {[m
[31m-        key = ngx_hash(key, value[1].data[i]);[m
[31m-    }[m
[31m-[m
[31m-    key %= ctx->keys.hsize;[m
[31m-[m
[31m-    vp = ctx->values_hash[key].elts;[m
[31m-[m
[31m-    if (vp) {[m
[31m-        for (i = 0; i < ctx->values_hash[key].nelts; i++) {[m
[31m-            if (value[1].len != (size_t) vp[i]->len) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_strncmp(value[1].data, vp[i]->data, value[1].len) == 0) {[m
[31m-                var = vp[i];[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_array_init(&ctx->values_hash[key], cf->pool, 4,[m
[31m-                           sizeof(ngx_http_variable_value_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_palloc(ctx->keys.pool, sizeof(ngx_http_variable_value_t));[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->len = value[1].len;[m
[31m-    var->data = ngx_pstrdup(ctx->keys.pool, &value[1]);[m
[31m-    if (var->data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->valid = 1;[m
[31m-    var->no_cacheable = 0;[m
[31m-    var->not_found = 0;[m
[31m-[m
[31m-    vp = ngx_array_push(&ctx->values_hash[key]);[m
[31m-    if (vp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *vp = var;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "default") == 0) {[m
[31m-[m
[31m-        if (ctx->default_value) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate default map parameter");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->default_value = var;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (value[0].len && value[0].data[0] == '~') {[m
[31m-        ngx_regex_compile_t    rc;[m
[31m-        ngx_http_map_regex_t  *regex;[m
[31m-        u_char                 errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-        regex = ngx_array_push(&ctx->regexes);[m
[31m-        if (regex == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value[0].len--;[m
[31m-        value[0].data++;[m
[31m-[m
[31m-        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-        if (value[0].data[0] == '*') {[m
[31m-            value[0].len--;[m
[31m-            value[0].data++;[m
[31m-            rc.options = NGX_REGEX_CASELESS;[m
[31m-        }[m
[31m-[m
[31m-        rc.pattern = value[0];[m
[31m-        rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-        rc.err.data = errstr;[m
[31m-[m
[31m-        regex->regex = ngx_http_regex_compile(ctx->cf, &rc);[m
[31m-        if (regex->regex == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        regex->value = var;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (value[0].len && value[0].data[0] == '\\') {[m
[31m-        value[0].len--;[m
[31m-        value[0].data++;[m
[31m-    }[m
[31m-[m
[31m-    rv = ngx_hash_add_key(&ctx->keys, &value[0], var,[m
[31m-                          (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0);[m
[31m-[m
[31m-    if (rv == NGX_OK) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rv == NGX_DECLINED) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid hostname or wildcard \"%V\"", &value[0]);[m
[31m-    }[m
[31m-[m
[31m-    if (rv == NGX_BUSY) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "conflicting parameter \"%V\"", &value[0]);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_memcached_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_memcached_module.c[m
[1mdeleted file mode 100644[m
[1mindex d31996a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_memcached_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,723 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-    ngx_int_t                  index;[m
[31m-    ngx_uint_t                 gzip_flag;[m
[31m-} ngx_http_memcached_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                     rest;[m
[31m-    ngx_http_request_t        *request;[m
[31m-    ngx_str_t                  key;[m
[31m-} ngx_http_memcached_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_memcached_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_memcached_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_memcached_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_memcached_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_memcached_filter(void *data, ssize_t bytes);[m
[31m-static void ngx_http_memcached_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_memcached_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static void *ngx_http_memcached_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_memcached_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_memcached_commands[] = {[m
[31m-[m
[31m-    { ngx_string("memcached_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_memcached_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_memcached_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("memcached_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("memcached_gzip_flag"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_memcached_loc_conf_t, gzip_flag),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_memcached_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_memcached_create_loc_conf,    /* create location configuration */[m
[31m-    ngx_http_memcached_merge_loc_conf      /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_memcached_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_memcached_module_ctx,        /* module context */[m
[31m-    ngx_http_memcached_commands,           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_memcached_key = ngx_string("memcached_key");[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MEMCACHED_END   (sizeof(ngx_http_memcached_end) - 1)[m
[31m-static u_char  ngx_http_memcached_end[] = CRLF "END" CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_memcached_ctx_t       *ctx;[m
[31m-    ngx_http_memcached_loc_conf_t  *mlcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_str_set(&u->schema, "memcached://");[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module;[m
[31m-[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);[m
[31m-[m
[31m-    u->conf = &mlcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_http_memcached_create_request;[m
[31m-    u->reinit_request = ngx_http_memcached_reinit_request;[m
[31m-    u->process_header = ngx_http_memcached_process_header;[m
[31m-    u->abort_request = ngx_http_memcached_abort_request;[m
[31m-    u->finalize_request = ngx_http_memcached_finalize_request;[m
[31m-[m
[31m-    ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_memcached_module);[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_memcached_filter_init;[m
[31m-    u->input_filter = ngx_http_memcached_filter;[m
[31m-    u->input_filter_ctx = ctx;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    ngx_http_upstream_init(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    uintptr_t                       escape;[m
[31m-    ngx_buf_t                      *b;[m
[31m-    ngx_chain_t                    *cl;[m
[31m-    ngx_http_memcached_ctx_t       *ctx;[m
[31m-    ngx_http_variable_value_t      *vv;[m
[31m-    ngx_http_memcached_loc_conf_t  *mlcf;[m
[31m-[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);[m
[31m-[m
[31m-    vv = ngx_http_get_indexed_variable(r, mlcf->index);[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found || vv->len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the \"$memcached_key\" variable is not set");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, vv->data, vv->len, NGX_ESCAPE_MEMCACHED);[m
[31m-[m
[31m-    len = sizeof("get ") - 1 + vv->len + escape + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' ';[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module);[m
[31m-[m
[31m-    ctx->key.data = b->last;[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        b->last = ngx_copy(b->last, vv->data, vv->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = (u_char *) ngx_escape_uri(b->last, vv->data, vv->len,[m
[31m-                                            NGX_ESCAPE_MEMCACHED);[m
[31m-    }[m
[31m-[m
[31m-    ctx->key.len = b->last - ctx->key.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http memcached request: \"%V\"", &ctx->key);[m
[31m-[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                         *p, *start;[m
[31m-    ngx_str_t                       line;[m
[31m-    ngx_uint_t                      flags;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_memcached_ctx_t       *ctx;[m
[31m-    ngx_http_memcached_loc_conf_t  *mlcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (p = u->buffer.pos; p < u->buffer.last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    line.data = u->buffer.pos;[m
[31m-    line.len = p - u->buffer.pos;[m
[31m-[m
[31m-    if (line.len == 0 || *(p - 1) != CR) {[m
[31m-        goto no_valid;[m
[31m-    }[m
[31m-[m
[31m-    *p = '\0';[m
[31m-    line.len--;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "memcached: \"%V\"", &line);[m
[31m-[m
[31m-    p = u->buffer.pos;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module);[m
[31m-    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);[m
[31m-[m
[31m-    if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) {[m
[31m-[m
[31m-        p += sizeof("VALUE ") - 1;[m
[31m-[m
[31m-        if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid key in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        p += ctx->key.len;[m
[31m-[m
[31m-        if (*p++ != ' ') {[m
[31m-            goto no_valid;[m
[31m-        }[m
[31m-[m
[31m-        /* flags */[m
[31m-[m
[31m-        start = p;[m
[31m-[m
[31m-        while (*p) {[m
[31m-            if (*p++ == ' ') {[m
[31m-                if (mlcf->gzip_flag) {[m
[31m-                    goto flags;[m
[31m-                } else {[m
[31m-                    goto length;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto no_valid;[m
[31m-[m
[31m-    flags:[m
[31m-[m
[31m-        flags = ngx_atoi(start, p - start - 1);[m
[31m-[m
[31m-        if (flags == (ngx_uint_t) NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid flags in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & mlcf->gzip_flag) {[m
[31m-            h = ngx_list_push(&r->headers_out.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = 1;[m
[31m-            ngx_str_set(&h->key, "Content-Encoding");[m
[31m-            ngx_str_set(&h->value, "gzip");[m
[31m-            r->headers_out.content_encoding = h;[m
[31m-        }[m
[31m-[m
[31m-    length:[m
[31m-[m
[31m-        start = p;[m
[31m-        p = line.data + line.len;[m
[31m-[m
[31m-        u->headers_in.content_length_n = ngx_atoof(start, p - start);[m
[31m-        if (u->headers_in.content_length_n == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "memcached sent invalid length in response \"%V\" "[m
[31m-                          "for key \"%V\"",[m
[31m-                          &line, &ctx->key);[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-[m
[31m-        u->headers_in.status_n = 200;[m
[31m-        u->state->status = 200;[m
[31m-        u->buffer.pos = p + sizeof(CRLF) - 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(p, "END\x0d") == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "key: \"%V\" was not found by memcached", &ctx->key);[m
[31m-[m
[31m-        u->headers_in.content_length_n = 0;[m
[31m-        u->headers_in.status_n = 404;[m
[31m-        u->state->status = 404;[m
[31m-        u->buffer.pos = p + sizeof("END" CRLF) - 1;[m
[31m-        u->keepalive = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-no_valid:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "memcached sent invalid response: \"%V\"", &line);[m
[31m-[m
[31m-    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_memcached_ctx_t  *ctx = data;[m
[31m-[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-[m
[31m-    if (u->headers_in.status_n != 404) {[m
[31m-        u->length = u->headers_in.content_length_n + NGX_HTTP_MEMCACHED_END;[m
[31m-        ctx->rest = NGX_HTTP_MEMCACHED_END;[m
[31m-[m
[31m-    } else {[m
[31m-        u->length = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_memcached_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_memcached_ctx_t  *ctx = data;[m
[31m-[m
[31m-    u_char               *last;[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = ctx->request->upstream;[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (u->length == (ssize_t) ctx->rest) {[m
[31m-[m
[31m-        if (ngx_strncmp(b->last,[m
[31m-                   ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest,[m
[31m-                   bytes)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                          "memcached sent invalid trailer");[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            ctx->rest = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->length -= bytes;[m
[31m-        ctx->rest -= bytes;[m
[31m-[m
[31m-        if (u->length == 0) {[m
[31m-            u->keepalive = 1;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    last = b->last;[m
[31m-    cl->buf->pos = last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,[m
[31m-                   "memcached filter bytes:%z size:%z length:%O rest:%z",[m
[31m-                   bytes, b->last - b->pos, u->length, ctx->rest);[m
[31m-[m
[31m-    if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMCACHED_END)) {[m
[31m-        u->length -= bytes;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    last += (size_t) (u->length - NGX_HTTP_MEMCACHED_END);[m
[31m-[m
[31m-    if (ngx_strncmp(last, ngx_http_memcached_end, b->last - last) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                      "memcached sent invalid trailer");[m
[31m-[m
[31m-        b->last = last;[m
[31m-        cl->buf->last = last;[m
[31m-        u->length = 0;[m
[31m-        ctx->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rest -= b->last - last;[m
[31m-    b->last = last;[m
[31m-    cl->buf->last = last;[m
[31m-    u->length = ctx->rest;[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_memcached_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http memcached request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_memcached_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http memcached request");[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_memcached_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_memcached_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memcached_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 0;[m
[31m-    conf->upstream.ignore_client_abort = 0;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-    conf->upstream.force_ranges = 1;[m
[31m-[m
[31m-    conf->index = NGX_CONF_UNSET;[m
[31m-    conf->gzip_flag = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_memcached_loc_conf_t *prev = parent;[m
[31m-    ngx_http_memcached_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.upstream == NULL) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->index == NGX_CONF_UNSET) {[m
[31m-        conf->index = prev->index;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->gzip_flag, prev->gzip_flag, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_memcached_loc_conf_t *mlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_url_t                  u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (mlcf->upstream.upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    mlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (mlcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_memcached_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    mlcf->index = ngx_http_get_variable_index(cf, &ngx_http_memcached_key);[m
[31m-[m
[31m-    if (mlcf->index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_mp4_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_mp4_module.c[m
[1mdeleted file mode 100644[m
[1mindex 16ef83c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_mp4_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,3500 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MP4_TRAK_ATOM     0[m
[31m-#define NGX_HTTP_MP4_TKHD_ATOM     1[m
[31m-#define NGX_HTTP_MP4_MDIA_ATOM     2[m
[31m-#define NGX_HTTP_MP4_MDHD_ATOM     3[m
[31m-#define NGX_HTTP_MP4_HDLR_ATOM     4[m
[31m-#define NGX_HTTP_MP4_MINF_ATOM     5[m
[31m-#define NGX_HTTP_MP4_VMHD_ATOM     6[m
[31m-#define NGX_HTTP_MP4_SMHD_ATOM     7[m
[31m-#define NGX_HTTP_MP4_DINF_ATOM     8[m
[31m-#define NGX_HTTP_MP4_STBL_ATOM     9[m
[31m-#define NGX_HTTP_MP4_STSD_ATOM    10[m
[31m-#define NGX_HTTP_MP4_STTS_ATOM    11[m
[31m-#define NGX_HTTP_MP4_STTS_DATA    12[m
[31m-#define NGX_HTTP_MP4_STSS_ATOM    13[m
[31m-#define NGX_HTTP_MP4_STSS_DATA    14[m
[31m-#define NGX_HTTP_MP4_CTTS_ATOM    15[m
[31m-#define NGX_HTTP_MP4_CTTS_DATA    16[m
[31m-#define NGX_HTTP_MP4_STSC_ATOM    17[m
[31m-#define NGX_HTTP_MP4_STSC_START   18[m
[31m-#define NGX_HTTP_MP4_STSC_DATA    19[m
[31m-#define NGX_HTTP_MP4_STSC_END     20[m
[31m-#define NGX_HTTP_MP4_STSZ_ATOM    21[m
[31m-#define NGX_HTTP_MP4_STSZ_DATA    22[m
[31m-#define NGX_HTTP_MP4_STCO_ATOM    23[m
[31m-#define NGX_HTTP_MP4_STCO_DATA    24[m
[31m-#define NGX_HTTP_MP4_CO64_ATOM    25[m
[31m-#define NGX_HTTP_MP4_CO64_DATA    26[m
[31m-[m
[31m-#define NGX_HTTP_MP4_LAST_ATOM    NGX_HTTP_MP4_CO64_DATA[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                buffer_size;[m
[31m-    size_t                max_buffer_size;[m
[31m-} ngx_http_mp4_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                chunk[4];[m
[31m-    u_char                samples[4];[m
[31m-    u_char                id[4];[m
[31m-} ngx_mp4_stsc_entry_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t              timescale;[m
[31m-    uint32_t              time_to_sample_entries;[m
[31m-    uint32_t              sample_to_chunk_entries;[m
[31m-    uint32_t              sync_samples_entries;[m
[31m-    uint32_t              composition_offset_entries;[m
[31m-    uint32_t              sample_sizes_entries;[m
[31m-    uint32_t              chunks;[m
[31m-[m
[31m-    ngx_uint_t            start_sample;[m
[31m-    ngx_uint_t            end_sample;[m
[31m-    ngx_uint_t            start_chunk;[m
[31m-    ngx_uint_t            end_chunk;[m
[31m-    ngx_uint_t            start_chunk_samples;[m
[31m-    ngx_uint_t            end_chunk_samples;[m
[31m-    uint64_t              start_chunk_samples_size;[m
[31m-    uint64_t              end_chunk_samples_size;[m
[31m-    off_t                 start_offset;[m
[31m-    off_t                 end_offset;[m
[31m-[m
[31m-    size_t                tkhd_size;[m
[31m-    size_t                mdhd_size;[m
[31m-    size_t                hdlr_size;[m
[31m-    size_t                vmhd_size;[m
[31m-    size_t                smhd_size;[m
[31m-    size_t                dinf_size;[m
[31m-    size_t                size;[m
[31m-[m
[31m-    ngx_chain_t           out[NGX_HTTP_MP4_LAST_ATOM + 1];[m
[31m-[m
[31m-    ngx_buf_t             trak_atom_buf;[m
[31m-    ngx_buf_t             tkhd_atom_buf;[m
[31m-    ngx_buf_t             mdia_atom_buf;[m
[31m-    ngx_buf_t             mdhd_atom_buf;[m
[31m-    ngx_buf_t             hdlr_atom_buf;[m
[31m-    ngx_buf_t             minf_atom_buf;[m
[31m-    ngx_buf_t             vmhd_atom_buf;[m
[31m-    ngx_buf_t             smhd_atom_buf;[m
[31m-    ngx_buf_t             dinf_atom_buf;[m
[31m-    ngx_buf_t             stbl_atom_buf;[m
[31m-    ngx_buf_t             stsd_atom_buf;[m
[31m-    ngx_buf_t             stts_atom_buf;[m
[31m-    ngx_buf_t             stts_data_buf;[m
[31m-    ngx_buf_t             stss_atom_buf;[m
[31m-    ngx_buf_t             stss_data_buf;[m
[31m-    ngx_buf_t             ctts_atom_buf;[m
[31m-    ngx_buf_t             ctts_data_buf;[m
[31m-    ngx_buf_t             stsc_atom_buf;[m
[31m-    ngx_buf_t             stsc_start_chunk_buf;[m
[31m-    ngx_buf_t             stsc_end_chunk_buf;[m
[31m-    ngx_buf_t             stsc_data_buf;[m
[31m-    ngx_buf_t             stsz_atom_buf;[m
[31m-    ngx_buf_t             stsz_data_buf;[m
[31m-    ngx_buf_t             stco_atom_buf;[m
[31m-    ngx_buf_t             stco_data_buf;[m
[31m-    ngx_buf_t             co64_atom_buf;[m
[31m-    ngx_buf_t             co64_data_buf;[m
[31m-[m
[31m-    ngx_mp4_stsc_entry_t  stsc_start_chunk_entry;[m
[31m-    ngx_mp4_stsc_entry_t  stsc_end_chunk_entry;[m
[31m-} ngx_http_mp4_trak_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_file_t            file;[m
[31m-[m
[31m-    u_char               *buffer;[m
[31m-    u_char               *buffer_start;[m
[31m-    u_char               *buffer_pos;[m
[31m-    u_char               *buffer_end;[m
[31m-    size_t                buffer_size;[m
[31m-[m
[31m-    off_t                 offset;[m
[31m-    off_t                 end;[m
[31m-    off_t                 content_length;[m
[31m-    ngx_uint_t            start;[m
[31m-    ngx_uint_t            length;[m
[31m-    uint32_t              timescale;[m
[31m-    ngx_http_request_t   *request;[m
[31m-    ngx_array_t           trak;[m
[31m-    ngx_http_mp4_trak_t   traks[2];[m
[31m-[m
[31m-    size_t                ftyp_size;[m
[31m-    size_t                moov_size;[m
[31m-[m
[31m-    ngx_chain_t          *out;[m
[31m-    ngx_chain_t           ftyp_atom;[m
[31m-    ngx_chain_t           moov_atom;[m
[31m-    ngx_chain_t           mvhd_atom;[m
[31m-    ngx_chain_t           mdat_atom;[m
[31m-    ngx_chain_t           mdat_data;[m
[31m-[m
[31m-    ngx_buf_t             ftyp_atom_buf;[m
[31m-    ngx_buf_t             moov_atom_buf;[m
[31m-    ngx_buf_t             mvhd_atom_buf;[m
[31m-    ngx_buf_t             mdat_atom_buf;[m
[31m-    ngx_buf_t             mdat_data_buf;[m
[31m-[m
[31m-    u_char                moov_atom_header[8];[m
[31m-    u_char                mdat_atom_header[16];[m
[31m-} ngx_http_mp4_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char                 *name;[m
[31m-    ngx_int_t           (*handler)(ngx_http_mp4_file_t *mp4,[m
[31m-                                   uint64_t atom_data_size);[m
[31m-} ngx_http_mp4_atom_handler_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_mp4_atom_header(mp4)   (mp4->buffer_pos - 8)[m
[31m-#define ngx_mp4_atom_data(mp4)     mp4->buffer_pos[m
[31m-#define ngx_mp4_atom_data_size(t)  (uint64_t) (sizeof(t) - 8)[m
[31m-[m
[31m-[m
[31m-#define ngx_mp4_atom_next(mp4, n)                                             \[m
[31m-    mp4->buffer_pos += (size_t) n;                                            \[m
[31m-    mp4->offset += n[m
[31m-[m
[31m-[m
[31m-#define ngx_mp4_set_atom_name(p, n1, n2, n3, n4)                              \[m
[31m-    ((u_char *) (p))[4] = n1;                                                 \[m
[31m-    ((u_char *) (p))[5] = n2;                                                 \[m
[31m-    ((u_char *) (p))[6] = n3;                                                 \[m
[31m-    ((u_char *) (p))[7] = n4[m
[31m-[m
[31m-#define ngx_mp4_get_32value(p)                                                \[m
[31m-    ( ((uint32_t) ((u_char *) (p))[0] << 24)                                  \[m
[31m-    + (           ((u_char *) (p))[1] << 16)                                  \[m
[31m-    + (           ((u_char *) (p))[2] << 8)                                   \[m
[31m-    + (           ((u_char *) (p))[3]) )[m
[31m-[m
[31m-#define ngx_mp4_set_32value(p, n)                                             \[m
[31m-    ((u_char *) (p))[0] = (u_char) ((n) >> 24);                               \[m
[31m-    ((u_char *) (p))[1] = (u_char) ((n) >> 16);                               \[m
[31m-    ((u_char *) (p))[2] = (u_char) ((n) >> 8);                                \[m
[31m-    ((u_char *) (p))[3] = (u_char)  (n)[m
[31m-[m
[31m-#define ngx_mp4_get_64value(p)                                                \[m
[31m-    ( ((uint64_t) ((u_char *) (p))[0] << 56)                                  \[m
[31m-    + ((uint64_t) ((u_char *) (p))[1] << 48)                                  \[m
[31m-    + ((uint64_t) ((u_char *) (p))[2] << 40)                                  \[m
[31m-    + ((uint64_t) ((u_char *) (p))[3] << 32)                                  \[m
[31m-    + ((uint64_t) ((u_char *) (p))[4] << 24)                                  \[m
[31m-    + (           ((u_char *) (p))[5] << 16)                                  \[m
[31m-    + (           ((u_char *) (p))[6] << 8)                                   \[m
[31m-    + (           ((u_char *) (p))[7]) )[m
[31m-[m
[31m-#define ngx_mp4_set_64value(p, n)                                             \[m
[31m-    ((u_char *) (p))[0] = (u_char) ((uint64_t) (n) >> 56);                    \[m
[31m-    ((u_char *) (p))[1] = (u_char) ((uint64_t) (n) >> 48);                    \[m
[31m-    ((u_char *) (p))[2] = (u_char) ((uint64_t) (n) >> 40);                    \[m
[31m-    ((u_char *) (p))[3] = (u_char) ((uint64_t) (n) >> 32);                    \[m
[31m-    ((u_char *) (p))[4] = (u_char) (           (n) >> 24);                    \[m
[31m-    ((u_char *) (p))[5] = (u_char) (           (n) >> 16);                    \[m
[31m-    ((u_char *) (p))[6] = (u_char) (           (n) >> 8);                     \[m
[31m-    ((u_char *) (p))[7] = (u_char)             (n)[m
[31m-[m
[31m-#define ngx_mp4_last_trak(mp4)                                                \[m
[31m-    &((ngx_http_mp4_trak_t *) mp4->trak.elts)[mp4->trak.nelts - 1][m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_mp4_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_mp4_process(ngx_http_mp4_file_t *mp4);[m
[31m-static ngx_int_t ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_atom_handler_t *atom, uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read(ngx_http_mp4_file_t *mp4, size_t size);[m
[31m-static ngx_int_t ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static size_t ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    off_t start_offset, off_t end_offset);[m
[31m-static ngx_int_t ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_trak_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_trak_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_cmov_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_mdia_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_minf_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_stbl_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_crop_stts_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start);[m
[31m-static ngx_int_t ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stss_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static void ngx_http_mp4_crop_stss_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start);[m
[31m-static ngx_int_t ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static void ngx_http_mp4_update_ctts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static void ngx_http_mp4_crop_ctts_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start);[m
[31m-static ngx_int_t ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stsc_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start);[m
[31m-static ngx_int_t ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stsz_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static ngx_int_t ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static void ngx_http_mp4_adjust_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, int32_t adjustment);[m
[31m-static ngx_int_t ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    uint64_t atom_data_size);[m
[31m-static ngx_int_t ngx_http_mp4_update_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak);[m
[31m-static void ngx_http_mp4_adjust_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, off_t adjustment);[m
[31m-[m
[31m-static char *ngx_http_mp4(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_mp4_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_mp4_merge_conf(ngx_conf_t *cf, void *parent, void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_mp4_commands[] = {[m
[31m-[m
[31m-    { ngx_string("mp4"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_mp4,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("mp4_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_mp4_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("mp4_max_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_mp4_conf_t, max_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_mp4_module_ctx = {[m
[31m-    NULL,                          /* preconfiguration */[m
[31m-    NULL,                          /* postconfiguration */[m
[31m-[m
[31m-    NULL,                          /* create main configuration */[m
[31m-    NULL,                          /* init main configuration */[m
[31m-[m
[31m-    NULL,                          /* create server configuration */[m
[31m-    NULL,                          /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_mp4_create_conf,      /* create location configuration */[m
[31m-    ngx_http_mp4_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_mp4_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_mp4_module_ctx,      /* module context */[m
[31m-    ngx_http_mp4_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_atoms[] = {[m
[31m-    { "ftyp", ngx_http_mp4_read_ftyp_atom },[m
[31m-    { "moov", ngx_http_mp4_read_moov_atom },[m
[31m-    { "mdat", ngx_http_mp4_read_mdat_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_moov_atoms[] = {[m
[31m-    { "mvhd", ngx_http_mp4_read_mvhd_atom },[m
[31m-    { "trak", ngx_http_mp4_read_trak_atom },[m
[31m-    { "cmov", ngx_http_mp4_read_cmov_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_trak_atoms[] = {[m
[31m-    { "tkhd", ngx_http_mp4_read_tkhd_atom },[m
[31m-    { "mdia", ngx_http_mp4_read_mdia_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_mdia_atoms[] = {[m
[31m-    { "mdhd", ngx_http_mp4_read_mdhd_atom },[m
[31m-    { "hdlr", ngx_http_mp4_read_hdlr_atom },[m
[31m-    { "minf", ngx_http_mp4_read_minf_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_minf_atoms[] = {[m
[31m-    { "vmhd", ngx_http_mp4_read_vmhd_atom },[m
[31m-    { "smhd", ngx_http_mp4_read_smhd_atom },[m
[31m-    { "dinf", ngx_http_mp4_read_dinf_atom },[m
[31m-    { "stbl", ngx_http_mp4_read_stbl_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_mp4_atom_handler_t  ngx_http_mp4_stbl_atoms[] = {[m
[31m-    { "stsd", ngx_http_mp4_read_stsd_atom },[m
[31m-    { "stts", ngx_http_mp4_read_stts_atom },[m
[31m-    { "stss", ngx_http_mp4_read_stss_atom },[m
[31m-    { "ctts", ngx_http_mp4_read_ctts_atom },[m
[31m-    { "stsc", ngx_http_mp4_read_stsc_atom },[m
[31m-    { "stsz", ngx_http_mp4_read_stsz_atom },[m
[31m-    { "stco", ngx_http_mp4_read_stco_atom },[m
[31m-    { "co64", ngx_http_mp4_read_co64_atom },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *last;[m
[31m-    size_t                     root;[m
[31m-    ngx_int_t                  rc, start, end;[m
[31m-    ngx_uint_t                 level, length;[m
[31m-    ngx_str_t                  path, value;[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_http_mp4_file_t       *mp4;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root, 0);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    path.len = last - path.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "http mp4 filename: \"%V\"", &path);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = NGX_MAX_OFF_T_VALUE;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-        case NGX_ENAMETOOLONG:[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_EACCES:[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-        case NGX_EMLINK:[m
[31m-        case NGX_ELOOP:[m
[31m-#endif[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {[m
[31m-            ngx_log_error(level, log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, path.data);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (!of.is_file) {[m
[31m-[m
[31m-        if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", path.data);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->root_tested = !r->error_page;[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-    start = -1;[m
[31m-    length = 0;[m
[31m-    r->headers_out.content_length_n = of.size;[m
[31m-    mp4 = NULL;[m
[31m-    b = NULL;[m
[31m-[m
[31m-    if (r->args.len) {[m
[31m-[m
[31m-        if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) {[m
[31m-[m
[31m-            /*[m
[31m-             * A Flash player may send start value with a lot of digits[m
[31m-             * after dot so strtod() is used instead of atofp().  NaNs and[m
[31m-             * infinities become negative numbers after (int) conversion.[m
[31m-             */[m
[31m-[m
[31m-            ngx_set_errno(0);[m
[31m-            start = (int) (strtod((char *) value.data, NULL) * 1000);[m
[31m-[m
[31m-            if (ngx_errno != 0) {[m
[31m-                start = -1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_arg(r, (u_char *) "end", 3, &value) == NGX_OK) {[m
[31m-[m
[31m-            ngx_set_errno(0);[m
[31m-            end = (int) (strtod((char *) value.data, NULL) * 1000);[m
[31m-[m
[31m-            if (ngx_errno != 0) {[m
[31m-                end = -1;[m
[31m-            }[m
[31m-[m
[31m-            if (end > 0) {[m
[31m-                if (start < 0) {[m
[31m-                    start = 0;[m
[31m-                }[m
[31m-[m
[31m-                if (end > start) {[m
[31m-                    length = end - start;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (start >= 0) {[m
[31m-        r->single_range = 1;[m
[31m-[m
[31m-        mp4 = ngx_pcalloc(r->pool, sizeof(ngx_http_mp4_file_t));[m
[31m-        if (mp4 == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        mp4->file.fd = of.fd;[m
[31m-        mp4->file.name = path;[m
[31m-        mp4->file.log = r->connection->log;[m
[31m-        mp4->end = of.size;[m
[31m-        mp4->start = (ngx_uint_t) start;[m
[31m-        mp4->length = length;[m
[31m-        mp4->request = r;[m
[31m-[m
[31m-        switch (ngx_http_mp4_process(mp4)) {[m
[31m-[m
[31m-        case NGX_DECLINED:[m
[31m-            if (mp4->buffer) {[m
[31m-                ngx_pfree(r->pool, mp4->buffer);[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(r->pool, mp4);[m
[31m-            mp4 = NULL;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_OK:[m
[31m-            r->headers_out.content_length_n = mp4->content_length;[m
[31m-            break;[m
[31m-[m
[31m-        default: /* NGX_ERROR */[m
[31m-            if (mp4->buffer) {[m
[31m-                ngx_pfree(r->pool, mp4->buffer);[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(r->pool, mp4);[m
[31m-[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    log->action = "sending mp4 to client";[m
[31m-[m
[31m-    if (clcf->directio <= of.size) {[m
[31m-[m
[31m-        /*[m
[31m-         * DIRECTIO is set on transfer only[m
[31m-         * to allow kernel to cache "moov" atom[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_directio_on(of.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_directio_on_n " \"%s\" failed", path.data);[m
[31m-        }[m
[31m-[m
[31m-        of.is_directio = 1;[m
[31m-[m
[31m-        if (mp4) {[m
[31m-            mp4->file.directio = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.last_modified_time = of.mtime;[m
[31m-[m
[31m-    if (ngx_http_set_etag(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4 == NULL) {[m
[31m-        b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-        if (b->file == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4) {[m
[31m-        return ngx_http_output_filter(r, mp4->out);[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = 0;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = b->file_last ? 1 : 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->name = path;[m
[31m-    b->file->log = log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_process(ngx_http_mp4_file_t *mp4)[m
[31m-{[m
[31m-    off_t                  start_offset, end_offset, adjustment;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_uint_t             i, j;[m
[31m-    ngx_chain_t          **prev;[m
[31m-    ngx_http_mp4_trak_t   *trak;[m
[31m-    ngx_http_mp4_conf_t   *conf;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 start:%ui, length:%ui", mp4->start, mp4->length);[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module);[m
[31m-[m
[31m-    mp4->buffer_size = conf->buffer_size;[m
[31m-[m
[31m-    rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_atoms, mp4->end);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->trak.nelts == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 trak atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->mdat_atom.buf == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 mdat atom was found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    prev = &mp4->out;[m
[31m-[m
[31m-    if (mp4->ftyp_atom.buf) {[m
[31m-        *prev = &mp4->ftyp_atom;[m
[31m-        prev = &mp4->ftyp_atom.next;[m
[31m-    }[m
[31m-[m
[31m-    *prev = &mp4->moov_atom;[m
[31m-    prev = &mp4->moov_atom.next;[m
[31m-[m
[31m-    if (mp4->mvhd_atom.buf) {[m
[31m-        mp4->moov_size += mp4->mvhd_atom_buf.last - mp4->mvhd_atom_buf.pos;[m
[31m-        *prev = &mp4->mvhd_atom;[m
[31m-        prev = &mp4->mvhd_atom.next;[m
[31m-    }[m
[31m-[m
[31m-    start_offset = mp4->end;[m
[31m-    end_offset = 0;[m
[31m-    trak = mp4->trak.elts;[m
[31m-[m
[31m-    for (i = 0; i < mp4->trak.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_mp4_update_stts_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_mp4_update_stss_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_mp4_update_ctts_atom(mp4, &trak[i]);[m
[31m-[m
[31m-        if (ngx_http_mp4_update_stsc_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_mp4_update_stsz_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (trak[i].out[NGX_HTTP_MP4_CO64_DATA].buf) {[m
[31m-            if (ngx_http_mp4_update_co64_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_mp4_update_stco_atom(mp4, &trak[i]) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_mp4_update_stbl_atom(mp4, &trak[i]);[m
[31m-        ngx_http_mp4_update_minf_atom(mp4, &trak[i]);[m
[31m-        trak[i].size += trak[i].mdhd_size;[m
[31m-        trak[i].size += trak[i].hdlr_size;[m
[31m-        ngx_http_mp4_update_mdia_atom(mp4, &trak[i]);[m
[31m-        trak[i].size += trak[i].tkhd_size;[m
[31m-        ngx_http_mp4_update_trak_atom(mp4, &trak[i]);[m
[31m-[m
[31m-        mp4->moov_size += trak[i].size;[m
[31m-[m
[31m-        if (start_offset > trak[i].start_offset) {[m
[31m-            start_offset = trak[i].start_offset;[m
[31m-        }[m
[31m-[m
[31m-        if (end_offset < trak[i].end_offset) {[m
[31m-            end_offset = trak[i].end_offset;[m
[31m-        }[m
[31m-[m
[31m-        *prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM];[m
[31m-        prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM].next;[m
[31m-[m
[31m-        for (j = 0; j < NGX_HTTP_MP4_LAST_ATOM + 1; j++) {[m
[31m-            if (trak[i].out[j].buf) {[m
[31m-                *prev = &trak[i].out[j];[m
[31m-                prev = &trak[i].out[j].next;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (end_offset < start_offset) {[m
[31m-        end_offset = start_offset;[m
[31m-    }[m
[31m-[m
[31m-    mp4->moov_size += 8;[m
[31m-[m
[31m-    ngx_mp4_set_32value(mp4->moov_atom_header, mp4->moov_size);[m
[31m-    ngx_mp4_set_atom_name(mp4->moov_atom_header, 'm', 'o', 'o', 'v');[m
[31m-    mp4->content_length += mp4->moov_size;[m
[31m-[m
[31m-    *prev = &mp4->mdat_atom;[m
[31m-[m
[31m-    if (start_offset > mp4->mdat_data.buf->file_last) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "start time is out mp4 mdat atom in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    adjustment = mp4->ftyp_size + mp4->moov_size[m
[31m-                 + ngx_http_mp4_update_mdat_atom(mp4, start_offset, end_offset)[m
[31m-                 - start_offset;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 adjustment:%O", adjustment);[m
[31m-[m
[31m-    for (i = 0; i < mp4->trak.nelts; i++) {[m
[31m-        if (trak[i].out[NGX_HTTP_MP4_CO64_DATA].buf) {[m
[31m-            ngx_http_mp4_adjust_co64_atom(mp4, &trak[i], adjustment);[m
[31m-        } else {[m
[31m-            ngx_http_mp4_adjust_stco_atom(mp4, &trak[i], (int32_t) adjustment);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-} ngx_mp4_atom_header_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    size64[8];[m
[31m-} ngx_mp4_atom_header64_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_atom_handler_t *atom, uint64_t atom_data_size)[m
[31m-{[m
[31m-    off_t        end;[m
[31m-    size_t       atom_header_size;[m
[31m-    u_char      *atom_header, *atom_name;[m
[31m-    uint64_t     atom_size;[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_uint_t   n;[m
[31m-[m
[31m-    end = mp4->offset + atom_data_size;[m
[31m-[m
[31m-    while (mp4->offset < end) {[m
[31m-[m
[31m-        if (ngx_http_mp4_read(mp4, sizeof(uint32_t)) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        atom_header = mp4->buffer_pos;[m
[31m-        atom_size = ngx_mp4_get_32value(atom_header);[m
[31m-        atom_header_size = sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-        if (atom_size == 0) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                           "mp4 atom end");[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (atom_size < sizeof(ngx_mp4_atom_header_t)) {[m
[31m-[m
[31m-            if (atom_size == 1) {[m
[31m-[m
[31m-                if (ngx_http_mp4_read(mp4, sizeof(ngx_mp4_atom_header64_t))[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                /* 64-bit atom size */[m
[31m-                atom_header = mp4->buffer_pos;[m
[31m-                atom_size = ngx_mp4_get_64value(atom_header + 8);[m
[31m-                atom_header_size = sizeof(ngx_mp4_atom_header64_t);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                              "\"%s\" mp4 atom is too small:%uL",[m
[31m-                              mp4->file.name.data, atom_size);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_mp4_read(mp4, sizeof(ngx_mp4_atom_header_t)) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        atom_header = mp4->buffer_pos;[m
[31m-        atom_name = atom_header + sizeof(uint32_t);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 atom: %*s @%O:%uL",[m
[31m-                       (size_t) 4, atom_name, mp4->offset, atom_size);[m
[31m-[m
[31m-        if (atom_size > (uint64_t) (NGX_MAX_OFF_T_VALUE - mp4->offset)[m
[31m-            || mp4->offset + (off_t) atom_size > end)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 atom too large:%uL",[m
[31m-                          mp4->file.name.data, atom_size);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (n = 0; atom[n].name; n++) {[m
[31m-[m
[31m-            if (ngx_strncmp(atom_name, atom[n].name, 4) == 0) {[m
[31m-[m
[31m-                ngx_mp4_atom_next(mp4, atom_header_size);[m
[31m-[m
[31m-                rc = atom[n].handler(mp4, atom_size - atom_header_size);[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_mp4_atom_next(mp4, atom_size);[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read(ngx_http_mp4_file_t *mp4, size_t size)[m
[31m-{[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    if (mp4->buffer_pos + size <= mp4->buffer_end) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->offset + (off_t) mp4->buffer_size > mp4->end) {[m
[31m-        mp4->buffer_size = (size_t) (mp4->end - mp4->offset);[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->buffer_size < size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 file truncated", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mp4->buffer == NULL) {[m
[31m-        mp4->buffer = ngx_palloc(mp4->request->pool, mp4->buffer_size);[m
[31m-        if (mp4->buffer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        mp4->buffer_start = mp4->buffer;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_file(&mp4->file, mp4->buffer_start, mp4->buffer_size,[m
[31m-                      mp4->offset);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != mp4->buffer_size) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, mp4->file.log, 0,[m
[31m-                      ngx_read_file_n " read only %z of %z from \"%s\"",[m
[31m-                      n, mp4->buffer_size, mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mp4->buffer_pos = mp4->buffer_start;[m
[31m-    mp4->buffer_end = mp4->buffer_start + mp4->buffer_size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char     *ftyp_atom;[m
[31m-    size_t      atom_size;[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 ftyp atom");[m
[31m-[m
[31m-    if (atom_data_size > 1024[m
[31m-        || ngx_mp4_atom_data(mp4) + (size_t) atom_data_size > mp4->buffer_end)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 ftyp atom is too large:%uL",[m
[31m-                      mp4->file.name.data, atom_data_size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-[m
[31m-    ftyp_atom = ngx_palloc(mp4->request->pool, atom_size);[m
[31m-    if (ftyp_atom == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mp4_set_32value(ftyp_atom, atom_size);[m
[31m-    ngx_mp4_set_atom_name(ftyp_atom, 'f', 't', 'y', 'p');[m
[31m-[m
[31m-    /*[m
[31m-     * only moov atom content is guaranteed to be in mp4->buffer[m
[31m-     * during sending response, so ftyp atom content should be copied[m
[31m-     */[m
[31m-    ngx_memcpy(ftyp_atom + sizeof(ngx_mp4_atom_header_t),[m
[31m-               ngx_mp4_atom_data(mp4), (size_t) atom_data_size);[m
[31m-[m
[31m-    atom = &mp4->ftyp_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = ftyp_atom;[m
[31m-    atom->last = ftyp_atom + atom_size;[m
[31m-[m
[31m-    mp4->ftyp_atom.buf = atom;[m
[31m-    mp4->ftyp_size = atom_size;[m
[31m-    mp4->content_length = atom_size;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Small excess buffer to process atoms after moov atom, mp4->buffer_start[m
[31m- * will be set to this buffer part after moov atom processing.[m
[31m- */[m
[31m-#define NGX_HTTP_MP4_MOOV_BUFFER_EXCESS  (4 * 1024)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_uint_t            no_mdat;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_conf_t  *conf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 moov atom");[m
[31m-[m
[31m-    no_mdat = (mp4->mdat_atom.buf == NULL);[m
[31m-[m
[31m-    if (no_mdat && mp4->start == 0 && mp4->length == 0) {[m
[31m-        /*[m
[31m-         * send original file if moov atom resides before[m
[31m-         * mdat atom and client requests integral file[m
[31m-         */[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module);[m
[31m-[m
[31m-    if (atom_data_size > mp4->buffer_size) {[m
[31m-[m
[31m-        if (atom_data_size > conf->max_buffer_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 moov atom is too large:%uL, "[m
[31m-                          "you may want to increase mp4_max_buffer_size",[m
[31m-                          mp4->file.name.data, atom_data_size);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_pfree(mp4->request->pool, mp4->buffer);[m
[31m-        mp4->buffer = NULL;[m
[31m-        mp4->buffer_pos = NULL;[m
[31m-        mp4->buffer_end = NULL;[m
[31m-[m
[31m-        mp4->buffer_size = (size_t) atom_data_size[m
[31m-                         + NGX_HTTP_MP4_MOOV_BUFFER_EXCESS * no_mdat;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_read(mp4, (size_t) atom_data_size) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mp4->trak.elts = &mp4->traks;[m
[31m-    mp4->trak.size = sizeof(ngx_http_mp4_trak_t);[m
[31m-    mp4->trak.nalloc = 2;[m
[31m-    mp4->trak.pool = mp4->request->pool;[m
[31m-[m
[31m-    atom = &mp4->moov_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = mp4->moov_atom_header;[m
[31m-    atom->last = mp4->moov_atom_header + 8;[m
[31m-[m
[31m-    mp4->moov_atom.buf = &mp4->moov_atom_buf;[m
[31m-[m
[31m-    rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_moov_atoms, atom_data_size);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 moov atom done");[m
[31m-[m
[31m-    if (no_mdat) {[m
[31m-        mp4->buffer_start = mp4->buffer_pos;[m
[31m-        mp4->buffer_size = NGX_HTTP_MP4_MOOV_BUFFER_EXCESS;[m
[31m-[m
[31m-        if (mp4->buffer_start + mp4->buffer_size > mp4->buffer_end) {[m
[31m-            mp4->buffer = NULL;[m
[31m-            mp4->buffer_pos = NULL;[m
[31m-            mp4->buffer_end = NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* skip atoms after moov atom */[m
[31m-        mp4->offset = mp4->end;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    ngx_buf_t  *data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdat atom");[m
[31m-[m
[31m-    data = &mp4->mdat_data_buf;[m
[31m-    data->file = &mp4->file;[m
[31m-    data->in_file = 1;[m
[31m-    data->last_buf = 1;[m
[31m-    data->last_in_chain = 1;[m
[31m-    data->file_last = mp4->offset + atom_data_size;[m
[31m-[m
[31m-    mp4->mdat_atom.buf = &mp4->mdat_atom_buf;[m
[31m-    mp4->mdat_atom.next = &mp4->mdat_data;[m
[31m-    mp4->mdat_data.buf = data;[m
[31m-[m
[31m-    if (mp4->trak.nelts) {[m
[31m-        /* skip atoms after mdat atom */[m
[31m-        mp4->offset = mp4->end;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4, off_t start_offset,[m
[31m-    off_t end_offset)[m
[31m-{[m
[31m-    off_t       atom_data_size;[m
[31m-    u_char     *atom_header;[m
[31m-    uint32_t    atom_header_size;[m
[31m-    uint64_t    atom_size;[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    atom_data_size = end_offset - start_offset;[m
[31m-    mp4->mdat_data.buf->file_pos = start_offset;[m
[31m-    mp4->mdat_data.buf->file_last = end_offset;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mdat new offset @%O:%O", start_offset, atom_data_size);[m
[31m-[m
[31m-    atom_header = mp4->mdat_atom_header;[m
[31m-[m
[31m-    if ((uint64_t) atom_data_size > (uint64_t) 0xffffffff) {[m
[31m-        atom_size = 1;[m
[31m-        atom_header_size = sizeof(ngx_mp4_atom_header64_t);[m
[31m-        ngx_mp4_set_64value(atom_header + sizeof(ngx_mp4_atom_header_t),[m
[31m-                            sizeof(ngx_mp4_atom_header64_t) + atom_data_size);[m
[31m-    } else {[m
[31m-        atom_size = sizeof(ngx_mp4_atom_header_t) + atom_data_size;[m
[31m-        atom_header_size = sizeof(ngx_mp4_atom_header_t);[m
[31m-    }[m
[31m-[m
[31m-    mp4->content_length += atom_header_size + atom_data_size;[m
[31m-[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'a', 't');[m
[31m-[m
[31m-    atom = &mp4->mdat_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_header_size;[m
[31m-[m
[31m-    return atom_header_size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[4];[m
[31m-    u_char    modification_time[4];[m
[31m-    u_char    timescale[4];[m
[31m-    u_char    duration[4];[m
[31m-    u_char    rate[4];[m
[31m-    u_char    volume[2];[m
[31m-    u_char    reserved[10];[m
[31m-    u_char    matrix[36];[m
[31m-    u_char    preview_time[4];[m
[31m-    u_char    preview_duration[4];[m
[31m-    u_char    poster_time[4];[m
[31m-    u_char    selection_time[4];[m
[31m-    u_char    selection_duration[4];[m
[31m-    u_char    current_time[4];[m
[31m-    u_char    next_track_id[4];[m
[31m-} ngx_mp4_mvhd_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[8];[m
[31m-    u_char    modification_time[8];[m
[31m-    u_char    timescale[4];[m
[31m-    u_char    duration[8];[m
[31m-    u_char    rate[4];[m
[31m-    u_char    volume[2];[m
[31m-    u_char    reserved[10];[m
[31m-    u_char    matrix[36];[m
[31m-    u_char    preview_time[4];[m
[31m-    u_char    preview_duration[4];[m
[31m-    u_char    poster_time[4];[m
[31m-    u_char    selection_time[4];[m
[31m-    u_char    selection_duration[4];[m
[31m-    u_char    current_time[4];[m
[31m-    u_char    next_track_id[4];[m
[31m-} ngx_mp4_mvhd64_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char                 *atom_header;[m
[31m-    size_t                  atom_size;[m
[31m-    uint32_t                timescale;[m
[31m-    uint64_t                duration, start_time, length_time;[m
[31m-    ngx_buf_t              *atom;[m
[31m-    ngx_mp4_mvhd_atom_t    *mvhd_atom;[m
[31m-    ngx_mp4_mvhd64_atom_t  *mvhd64_atom;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mvhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    mvhd_atom = (ngx_mp4_mvhd_atom_t *) atom_header;[m
[31m-    mvhd64_atom = (ngx_mp4_mvhd64_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'm', 'v', 'h', 'd');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_mvhd_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 mvhd atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mvhd_atom->version[0] == 0) {[m
[31m-        /* version 0: 32-bit duration */[m
[31m-        timescale = ngx_mp4_get_32value(mvhd_atom->timescale);[m
[31m-        duration = ngx_mp4_get_32value(mvhd_atom->duration);[m
[31m-[m
[31m-    } else {[m
[31m-        /* version 1: 64-bit duration */[m
[31m-[m
[31m-        if (ngx_mp4_atom_data_size(ngx_mp4_mvhd64_atom_t) > atom_data_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 mvhd atom too small",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        timescale = ngx_mp4_get_32value(mvhd64_atom->timescale);[m
[31m-        duration = ngx_mp4_get_64value(mvhd64_atom->duration);[m
[31m-    }[m
[31m-[m
[31m-    mp4->timescale = timescale;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mvhd timescale:%uD, duration:%uL, time:%.3fs",[m
[31m-                   timescale, duration, (double) duration / timescale);[m
[31m-[m
[31m-    start_time = (uint64_t) mp4->start * timescale / 1000;[m
[31m-[m
[31m-    if (duration < start_time) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 start time exceeds file duration",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    duration -= start_time;[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-        length_time = (uint64_t) mp4->length * timescale / 1000;[m
[31m-[m
[31m-        if (duration > length_time) {[m
[31m-            duration = length_time;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mvhd new duration:%uL, time:%.3fs",[m
[31m-                   duration, (double) duration / timescale);[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(mvhd_atom->size, atom_size);[m
[31m-[m
[31m-    if (mvhd_atom->version[0] == 0) {[m
[31m-        ngx_mp4_set_32value(mvhd_atom->duration, duration);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_64value(mvhd64_atom->duration, duration);[m
[31m-    }[m
[31m-[m
[31m-    atom = &mp4->mvhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    mp4->mvhd_atom.buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_trak_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_end;[m
[31m-    off_t                 atom_file_end;[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 trak atom");[m
[31m-[m
[31m-    trak = ngx_array_push(&mp4->trak);[m
[31m-    if (trak == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t));[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 't', 'r', 'a', 'k');[m
[31m-[m
[31m-    atom = &trak->trak_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_TRAK_ATOM].buf = atom;[m
[31m-[m
[31m-    atom_end = mp4->buffer_pos + (size_t) atom_data_size;[m
[31m-    atom_file_end = mp4->offset + atom_data_size;[m
[31m-[m
[31m-    rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_trak_atoms, atom_data_size);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 trak atom: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        /* skip this trak */[m
[31m-        ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t));[m
[31m-        mp4->trak.nelts--;[m
[31m-        mp4->buffer_pos = atom_end;[m
[31m-        mp4->offset = atom_file_end;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_trak_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    trak->size += sizeof(ngx_mp4_atom_header_t);[m
[31m-    atom = &trak->trak_atom_buf;[m
[31m-    ngx_mp4_set_32value(atom->pos, trak->size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_cmov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                  "\"%s\" mp4 compressed moov atom (cmov) is not supported",[m
[31m-                  mp4->file.name.data);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[4];[m
[31m-    u_char    modification_time[4];[m
[31m-    u_char    track_id[4];[m
[31m-    u_char    reserved1[4];[m
[31m-    u_char    duration[4];[m
[31m-    u_char    reserved2[8];[m
[31m-    u_char    layer[2];[m
[31m-    u_char    group[2];[m
[31m-    u_char    volume[2];[m
[31m-    u_char    reserved3[2];[m
[31m-    u_char    matrix[36];[m
[31m-    u_char    width[4];[m
[31m-    u_char    height[4];[m
[31m-} ngx_mp4_tkhd_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[8];[m
[31m-    u_char    modification_time[8];[m
[31m-    u_char    track_id[4];[m
[31m-    u_char    reserved1[4];[m
[31m-    u_char    duration[8];[m
[31m-    u_char    reserved2[8];[m
[31m-    u_char    layer[2];[m
[31m-    u_char    group[2];[m
[31m-    u_char    volume[2];[m
[31m-    u_char    reserved3[2];[m
[31m-    u_char    matrix[36];[m
[31m-    u_char    width[4];[m
[31m-    u_char    height[4];[m
[31m-} ngx_mp4_tkhd64_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char                 *atom_header;[m
[31m-    size_t                  atom_size;[m
[31m-    uint64_t                duration, start_time, length_time;[m
[31m-    ngx_buf_t              *atom;[m
[31m-    ngx_http_mp4_trak_t    *trak;[m
[31m-    ngx_mp4_tkhd_atom_t    *tkhd_atom;[m
[31m-    ngx_mp4_tkhd64_atom_t  *tkhd64_atom;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 tkhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    tkhd_atom = (ngx_mp4_tkhd_atom_t *) atom_header;[m
[31m-    tkhd64_atom = (ngx_mp4_tkhd64_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(tkhd_atom, 't', 'k', 'h', 'd');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_tkhd_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 tkhd atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (tkhd_atom->version[0] == 0) {[m
[31m-        /* version 0: 32-bit duration */[m
[31m-        duration = ngx_mp4_get_32value(tkhd_atom->duration);[m
[31m-[m
[31m-    } else {[m
[31m-        /* version 1: 64-bit duration */[m
[31m-[m
[31m-        if (ngx_mp4_atom_data_size(ngx_mp4_tkhd64_atom_t) > atom_data_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 tkhd atom too small",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        duration = ngx_mp4_get_64value(tkhd64_atom->duration);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "tkhd duration:%uL, time:%.3fs",[m
[31m-                   duration, (double) duration / mp4->timescale);[m
[31m-[m
[31m-    start_time = (uint64_t) mp4->start * mp4->timescale / 1000;[m
[31m-[m
[31m-    if (duration <= start_time) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "tkhd duration is less than start time");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    duration -= start_time;[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-        length_time = (uint64_t) mp4->length * mp4->timescale / 1000;[m
[31m-[m
[31m-        if (duration > length_time) {[m
[31m-            duration = length_time;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "tkhd new duration:%uL, time:%.3fs",[m
[31m-                   duration, (double) duration / mp4->timescale);[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->tkhd_size = atom_size;[m
[31m-[m
[31m-    ngx_mp4_set_32value(tkhd_atom->size, atom_size);[m
[31m-[m
[31m-    if (tkhd_atom->version[0] == 0) {[m
[31m-        ngx_mp4_set_32value(tkhd_atom->duration, duration);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_64value(tkhd64_atom->duration, duration);[m
[31m-    }[m
[31m-[m
[31m-    atom = &trak->tkhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_TKHD_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process mdia atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'i', 'a');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->mdia_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_MDIA_ATOM].buf = atom;[m
[31m-[m
[31m-    return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_mdia_atoms, atom_data_size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_mdia_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    trak->size += sizeof(ngx_mp4_atom_header_t);[m
[31m-    atom = &trak->mdia_atom_buf;[m
[31m-    ngx_mp4_set_32value(atom->pos, trak->size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[4];[m
[31m-    u_char    modification_time[4];[m
[31m-    u_char    timescale[4];[m
[31m-    u_char    duration[4];[m
[31m-    u_char    language[2];[m
[31m-    u_char    quality[2];[m
[31m-} ngx_mp4_mdhd_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    creation_time[8];[m
[31m-    u_char    modification_time[8];[m
[31m-    u_char    timescale[4];[m
[31m-    u_char    duration[8];[m
[31m-    u_char    language[2];[m
[31m-    u_char    quality[2];[m
[31m-} ngx_mp4_mdhd64_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char                 *atom_header;[m
[31m-    size_t                  atom_size;[m
[31m-    uint32_t                timescale;[m
[31m-    uint64_t                duration, start_time, length_time;[m
[31m-    ngx_buf_t              *atom;[m
[31m-    ngx_http_mp4_trak_t    *trak;[m
[31m-    ngx_mp4_mdhd_atom_t    *mdhd_atom;[m
[31m-    ngx_mp4_mdhd64_atom_t  *mdhd64_atom;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    mdhd_atom = (ngx_mp4_mdhd_atom_t *) atom_header;[m
[31m-    mdhd64_atom = (ngx_mp4_mdhd64_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(mdhd_atom, 'm', 'd', 'h', 'd');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_mdhd_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 mdhd atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (mdhd_atom->version[0] == 0) {[m
[31m-        /* version 0: everything is 32-bit */[m
[31m-        timescale = ngx_mp4_get_32value(mdhd_atom->timescale);[m
[31m-        duration = ngx_mp4_get_32value(mdhd_atom->duration);[m
[31m-[m
[31m-    } else {[m
[31m-        /* version 1: 64-bit duration and 32-bit timescale */[m
[31m-[m
[31m-        if (ngx_mp4_atom_data_size(ngx_mp4_mdhd64_atom_t) > atom_data_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 mdhd atom too small",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        timescale = ngx_mp4_get_32value(mdhd64_atom->timescale);[m
[31m-        duration = ngx_mp4_get_64value(mdhd64_atom->duration);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mdhd timescale:%uD, duration:%uL, time:%.3fs",[m
[31m-                   timescale, duration, (double) duration / timescale);[m
[31m-[m
[31m-    start_time = (uint64_t) mp4->start * timescale / 1000;[m
[31m-[m
[31m-    if (duration <= start_time) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mdhd duration is less than start time");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    duration -= start_time;[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-        length_time = (uint64_t) mp4->length * timescale / 1000;[m
[31m-[m
[31m-        if (duration > length_time) {[m
[31m-            duration = length_time;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mdhd new duration:%uL, time:%.3fs",[m
[31m-                   duration, (double) duration / timescale);[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->mdhd_size = atom_size;[m
[31m-    trak->timescale = timescale;[m
[31m-[m
[31m-    ngx_mp4_set_32value(mdhd_atom->size, atom_size);[m
[31m-[m
[31m-    if (mdhd_atom->version[0] == 0) {[m
[31m-        ngx_mp4_set_32value(mdhd_atom->duration, duration);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_64value(mdhd64_atom->duration, duration);[m
[31m-    }[m
[31m-[m
[31m-    atom = &trak->mdhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char              *atom_header;[m
[31m-    size_t               atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 hdlr atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'h', 'd', 'l', 'r');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->hdlr_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->hdlr_size = atom_size;[m
[31m-    trak->out[NGX_HTTP_MP4_HDLR_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process minf atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'm', 'i', 'n', 'f');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->minf_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_MINF_ATOM].buf = atom;[m
[31m-[m
[31m-    return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_minf_atoms, atom_data_size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_minf_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    trak->size += sizeof(ngx_mp4_atom_header_t)[m
[31m-               + trak->vmhd_size[m
[31m-               + trak->smhd_size[m
[31m-               + trak->dinf_size;[m
[31m-    atom = &trak->minf_atom_buf;[m
[31m-    ngx_mp4_set_32value(atom->pos, trak->size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char              *atom_header;[m
[31m-    size_t               atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 vmhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'v', 'm', 'h', 'd');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->vmhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->vmhd_size += atom_size;[m
[31m-    trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char              *atom_header;[m
[31m-    size_t               atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 smhd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 's', 'm', 'h', 'd');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->smhd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->smhd_size += atom_size;[m
[31m-    trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char              *atom_header;[m
[31m-    size_t               atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 dinf atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 'd', 'i', 'n', 'f');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->dinf_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + atom_size;[m
[31m-[m
[31m-    trak->dinf_size += atom_size;[m
[31m-    trak->out[NGX_HTTP_MP4_DINF_ATOM].buf = atom;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process stbl atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ngx_mp4_set_atom_name(atom_header, 's', 't', 'b', 'l');[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->stbl_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STBL_ATOM].buf = atom;[m
[31m-[m
[31m-    return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_stbl_atoms, atom_data_size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_stbl_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    ngx_buf_t  *atom;[m
[31m-[m
[31m-    trak->size += sizeof(ngx_mp4_atom_header_t);[m
[31m-    atom = &trak->stbl_atom_buf;[m
[31m-    ngx_mp4_set_32value(atom->pos, trak->size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-[m
[31m-    u_char    media_size[4];[m
[31m-    u_char    media_name[4];[m
[31m-} ngx_mp4_stsd_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table;[m
[31m-    size_t                atom_size;[m
[31m-    ngx_buf_t            *atom;[m
[31m-    ngx_mp4_stsd_atom_t  *stsd_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* sample description atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsd atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stsd_atom = (ngx_mp4_stsd_atom_t *) atom_header;[m
[31m-    atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-    atom_table = atom_header + atom_size;[m
[31m-    ngx_mp4_set_32value(stsd_atom->size, atom_size);[m
[31m-    ngx_mp4_set_atom_name(stsd_atom, 's', 't', 's', 'd');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stsd_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stsd atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "stsd entries:%uD, media:%*s",[m
[31m-                   ngx_mp4_get_32value(stsd_atom->entries),[m
[31m-                   (size_t) 4, stsd_atom->media_name);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-[m
[31m-    atom = &trak->stsd_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STSD_ATOM].buf = atom;[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_stts_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    count[4];[m
[31m-    u_char    duration[4];[m
[31m-} ngx_mp4_stts_entry_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stts_atom_t  *stts_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* time-to-sample atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stts atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stts_atom = (ngx_mp4_stts_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stts_atom, 's', 't', 't', 's');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stts_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stts atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(stts_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 time-to-sample entries:%uD", entries);[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stts_atom_t)[m
[31m-        + entries * sizeof(ngx_mp4_stts_entry_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stts atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_stts_atom_t);[m
[31m-    atom_end = atom_table + entries * sizeof(ngx_mp4_stts_entry_t);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->time_to_sample_entries = entries;[m
[31m-[m
[31m-    atom = &trak->stts_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    data = &trak->stts_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STTS_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_STTS_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stts_atom_t  *stts_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stts updating requires trak->timescale[m
[31m-     * from mdia.mdhd atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stts atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 stts atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_crop_stts_data(mp4, trak, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_crop_stts_data(mp4, trak, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "time-to-sample entries:%uD", trak->time_to_sample_entries);[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_stts_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_STTS_ATOM].buf;[m
[31m-    stts_atom = (ngx_mp4_stts_atom_t *) atom->pos;[m
[31m-    ngx_mp4_set_32value(stts_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(stts_atom->entries, trak->time_to_sample_entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_crop_stts_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start)[m
[31m-{[m
[31m-    uint32_t               count, duration, rest;[m
[31m-    uint64_t               start_time;[m
[31m-    ngx_buf_t             *data;[m
[31m-    ngx_uint_t             start_sample, entries, start_sec;[m
[31m-    ngx_mp4_stts_entry_t  *entry, *end;[m
[31m-[m
[31m-    if (start) {[m
[31m-        start_sec = mp4->start;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stts crop start_time:%ui", start_sec);[m
[31m-[m
[31m-    } else if (mp4->length) {[m
[31m-        start_sec = mp4->length;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stts crop end_time:%ui", start_sec);[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf;[m
[31m-[m
[31m-    start_time = (uint64_t) start_sec * trak->timescale / 1000;[m
[31m-[m
[31m-    entries = trak->time_to_sample_entries;[m
[31m-    start_sample = 0;[m
[31m-    entry = (ngx_mp4_stts_entry_t *) data->pos;[m
[31m-    end = (ngx_mp4_stts_entry_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        count = ngx_mp4_get_32value(entry->count);[m
[31m-        duration = ngx_mp4_get_32value(entry->duration);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "time:%uL, count:%uD, duration:%uD",[m
[31m-                       start_time, count, duration);[m
[31m-[m
[31m-        if (start_time < (uint64_t) count * duration) {[m
[31m-            start_sample += (ngx_uint_t) (start_time / duration);[m
[31m-            rest = (uint32_t) (start_time / duration);[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        start_sample += count;[m
[31m-        start_time -= count * duration;[m
[31m-        entries--;[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    if (start) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "start time is out mp4 stts samples in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    } else {[m
[31m-        trak->end_sample = trak->start_sample + start_sample;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "end_sample:%ui", trak->end_sample);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (start) {[m
[31m-        ngx_mp4_set_32value(entry->count, count - rest);[m
[31m-        data->pos = (u_char *) entry;[m
[31m-        trak->time_to_sample_entries = entries;[m
[31m-        trak->start_sample = start_sample;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "start_sample:%ui, new count:%uD",[m
[31m-                       trak->start_sample, count - rest);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_32value(entry->count, rest);[m
[31m-        data->last = (u_char *) (entry + 1);[m
[31m-        trak->time_to_sample_entries -= entries - 1;[m
[31m-        trak->end_sample = trak->start_sample + start_sample;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "end_sample:%ui, new count:%uD",[m
[31m-                       trak->end_sample, rest);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_http_mp4_stss_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char                    *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t                   entries;[m
[31m-    ngx_buf_t                 *atom, *data;[m
[31m-    ngx_http_mp4_trak_t       *trak;[m
[31m-    ngx_http_mp4_stss_atom_t  *stss_atom;[m
[31m-[m
[31m-    /* sync samples atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stss atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stss_atom = (ngx_http_mp4_stss_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stss_atom, 's', 't', 's', 's');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_http_mp4_stss_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stss atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(stss_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sync sample entries:%uD", entries);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->sync_samples_entries = entries;[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_http_mp4_stss_atom_t);[m
[31m-[m
[31m-    atom = &trak->stss_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_http_mp4_stss_atom_t)[m
[31m-        + entries * sizeof(uint32_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stss atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_end = atom_table + entries * sizeof(uint32_t);[m
[31m-[m
[31m-    data = &trak->stss_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STSS_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_STSS_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stss_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                     atom_size;[m
[31m-    uint32_t                   sample, start_sample, *entry, *end;[m
[31m-    ngx_buf_t                 *atom, *data;[m
[31m-    ngx_http_mp4_stss_atom_t  *stss_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stss updating requires trak->start_sample[m
[31m-     * from mdia.minf.stbl.stts which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stss atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_mp4_crop_stss_data(mp4, trak, 1);[m
[31m-    ngx_http_mp4_crop_stss_data(mp4, trak, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sync sample entries:%uD", trak->sync_samples_entries);[m
[31m-[m
[31m-    if (trak->sync_samples_entries) {[m
[31m-        entry = (uint32_t *) data->pos;[m
[31m-        end = (uint32_t *) data->last;[m
[31m-[m
[31m-        start_sample = trak->start_sample;[m
[31m-[m
[31m-        while (entry < end) {[m
[31m-            sample = ngx_mp4_get_32value(entry);[m
[31m-            sample -= start_sample;[m
[31m-            ngx_mp4_set_32value(entry, sample);[m
[31m-            entry++;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        trak->out[NGX_HTTP_MP4_STSS_DATA].buf = NULL;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_http_mp4_stss_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_STSS_ATOM].buf;[m
[31m-    stss_atom = (ngx_http_mp4_stss_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(stss_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(stss_atom->entries, trak->sync_samples_entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_crop_stss_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start)[m
[31m-{[m
[31m-    uint32_t     sample, start_sample, *entry, *end;[m
[31m-    ngx_buf_t   *data;[m
[31m-    ngx_uint_t   entries;[m
[31m-[m
[31m-    /* sync samples starts from 1 */[m
[31m-[m
[31m-    if (start) {[m
[31m-        start_sample = trak->start_sample + 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stss crop start_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else if (mp4->length) {[m
[31m-        start_sample = trak->end_sample + 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stss crop end_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf;[m
[31m-[m
[31m-    entries = trak->sync_samples_entries;[m
[31m-    entry = (uint32_t *) data->pos;[m
[31m-    end = (uint32_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        sample = ngx_mp4_get_32value(entry);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "sync:%uD", sample);[m
[31m-[m
[31m-        if (sample >= start_sample) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        entries--;[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample is out of mp4 stss atom");[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (start) {[m
[31m-        data->pos = (u_char *) entry;[m
[31m-        trak->sync_samples_entries = entries;[m
[31m-[m
[31m-    } else {[m
[31m-        data->last = (u_char *) entry;[m
[31m-        trak->sync_samples_entries -= entries;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_ctts_atom_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    count[4];[m
[31m-    u_char    offset[4];[m
[31m-} ngx_mp4_ctts_entry_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_ctts_atom_t  *ctts_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* composition offsets atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 ctts atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    ctts_atom = (ngx_mp4_ctts_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(ctts_atom, 'c', 't', 't', 's');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_ctts_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 ctts atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(ctts_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "composition offset entries:%uD", entries);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->composition_offset_entries = entries;[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_ctts_atom_t);[m
[31m-[m
[31m-    atom = &trak->ctts_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_ctts_atom_t)[m
[31m-        + entries * sizeof(ngx_mp4_ctts_entry_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 ctts atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_end = atom_table + entries * sizeof(ngx_mp4_ctts_entry_t);[m
[31m-[m
[31m-    data = &trak->ctts_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_update_ctts_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_ctts_atom_t  *ctts_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.ctts updating requires trak->start_sample[m
[31m-     * from mdia.minf.stbl.stts which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 ctts atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_mp4_crop_ctts_data(mp4, trak, 1);[m
[31m-    ngx_http_mp4_crop_ctts_data(mp4, trak, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "composition offset entries:%uD",[m
[31m-                   trak->composition_offset_entries);[m
[31m-[m
[31m-    if (trak->composition_offset_entries == 0) {[m
[31m-        trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = NULL;[m
[31m-        trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_ctts_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf;[m
[31m-    ctts_atom = (ngx_mp4_ctts_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(ctts_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(ctts_atom->entries, trak->composition_offset_entries);[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_crop_ctts_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start)[m
[31m-{[m
[31m-    uint32_t               count, start_sample, rest;[m
[31m-    ngx_buf_t             *data;[m
[31m-    ngx_uint_t             entries;[m
[31m-    ngx_mp4_ctts_entry_t  *entry, *end;[m
[31m-[m
[31m-    /* sync samples starts from 1 */[m
[31m-[m
[31m-    if (start) {[m
[31m-        start_sample = trak->start_sample + 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 ctts crop start_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else if (mp4->length) {[m
[31m-        start_sample = trak->end_sample - trak->start_sample + 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 ctts crop end_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf;[m
[31m-[m
[31m-    entries = trak->composition_offset_entries;[m
[31m-    entry = (ngx_mp4_ctts_entry_t *) data->pos;[m
[31m-    end = (ngx_mp4_ctts_entry_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        count = ngx_mp4_get_32value(entry->count);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "sample:%uD, count:%uD, offset:%uD",[m
[31m-                       start_sample, count, ngx_mp4_get_32value(entry->offset));[m
[31m-[m
[31m-        if (start_sample <= count) {[m
[31m-            rest = start_sample - 1;[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        start_sample -= count;[m
[31m-        entries--;[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    if (start) {[m
[31m-        data->pos = (u_char *) end;[m
[31m-        trak->composition_offset_entries = 0;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (start) {[m
[31m-        ngx_mp4_set_32value(entry->count, count - rest);[m
[31m-        data->pos = (u_char *) entry;[m
[31m-        trak->composition_offset_entries = entries;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_mp4_set_32value(entry->count, rest);[m
[31m-        data->last = (u_char *) (entry + 1);[m
[31m-        trak->composition_offset_entries -= entries - 1;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_stsc_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stsc_atom_t  *stsc_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* sample-to-chunk atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsc atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stsc_atom = (ngx_mp4_stsc_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stsc_atom, 's', 't', 's', 'c');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stsc_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stsc atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(stsc_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample-to-chunk entries:%uD", entries);[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stsc_atom_t)[m
[31m-        + entries * sizeof(ngx_mp4_stsc_entry_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stsc atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_stsc_atom_t);[m
[31m-    atom_end = atom_table + entries * sizeof(ngx_mp4_stsc_entry_t);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->sample_to_chunk_entries = entries;[m
[31m-[m
[31m-    atom = &trak->stsc_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    data = &trak->stsc_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STSC_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_STSC_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stsc_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                 atom_size;[m
[31m-    uint32_t               chunk;[m
[31m-    ngx_buf_t             *atom, *data;[m
[31m-    ngx_mp4_stsc_atom_t   *stsc_atom;[m
[31m-    ngx_mp4_stsc_entry_t  *entry, *end;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stsc updating requires trak->start_sample[m
[31m-     * from mdia.minf.stbl.stts which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stsc atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 stsc atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (trak->sample_to_chunk_entries == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "zero number of entries in stsc atom in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_crop_stsc_data(mp4, trak, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_mp4_crop_stsc_data(mp4, trak, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample-to-chunk entries:%uD",[m
[31m-                   trak->sample_to_chunk_entries);[m
[31m-[m
[31m-    entry = (ngx_mp4_stsc_entry_t *) data->pos;[m
[31m-    end = (ngx_mp4_stsc_entry_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        chunk = ngx_mp4_get_32value(entry->chunk);[m
[31m-        chunk -= trak->start_chunk;[m
[31m-        ngx_mp4_set_32value(entry->chunk, chunk);[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_stsc_atom_t)[m
[31m-                + trak->sample_to_chunk_entries * sizeof(ngx_mp4_stsc_entry_t);[m
[31m-[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_STSC_ATOM].buf;[m
[31m-    stsc_atom = (ngx_mp4_stsc_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(stsc_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(stsc_atom->entries, trak->sample_to_chunk_entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, ngx_uint_t start)[m
[31m-{[m
[31m-    uint32_t               start_sample, chunk, samples, id, next_chunk, n,[m
[31m-                           prev_samples;[m
[31m-    ngx_buf_t             *data, *buf;[m
[31m-    ngx_uint_t             entries, target_chunk, chunk_samples;[m
[31m-    ngx_mp4_stsc_entry_t  *entry, *end, *first;[m
[31m-[m
[31m-    entries = trak->sample_to_chunk_entries - 1;[m
[31m-[m
[31m-    if (start) {[m
[31m-        start_sample = (uint32_t) trak->start_sample;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stsc crop start_sample:%uD", start_sample);[m
[31m-[m
[31m-    } else if (mp4->length) {[m
[31m-        start_sample = (uint32_t) (trak->end_sample - trak->start_sample);[m
[31m-        samples = 0;[m
[31m-[m
[31m-        data = trak->out[NGX_HTTP_MP4_STSC_START].buf;[m
[31m-[m
[31m-        if (data) {[m
[31m-            entry = (ngx_mp4_stsc_entry_t *) data->pos;[m
[31m-            samples = ngx_mp4_get_32value(entry->samples);[m
[31m-            entries--;[m
[31m-[m
[31m-            if (samples > start_sample) {[m
[31m-                samples = start_sample;[m
[31m-                ngx_mp4_set_32value(entry->samples, samples);[m
[31m-            }[m
[31m-[m
[31m-            start_sample -= samples;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "mp4 stsc crop end_sample:%uD, ext_samples:%uD",[m
[31m-                       start_sample, samples);[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf;[m
[31m-[m
[31m-    entry = (ngx_mp4_stsc_entry_t *) data->pos;[m
[31m-    end = (ngx_mp4_stsc_entry_t *) data->last;[m
[31m-[m
[31m-    chunk = ngx_mp4_get_32value(entry->chunk);[m
[31m-    samples = ngx_mp4_get_32value(entry->samples);[m
[31m-    id = ngx_mp4_get_32value(entry->id);[m
[31m-    prev_samples = 0;[m
[31m-    entry++;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-[m
[31m-        next_chunk = ngx_mp4_get_32value(entry->chunk);[m
[31m-[m
[31m-        ngx_log_debug5(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "sample:%uD, chunk:%uD, chunks:%uD, "[m
[31m-                       "samples:%uD, id:%uD",[m
[31m-                       start_sample, chunk, next_chunk - chunk, samples, id);[m
[31m-[m
[31m-        n = (next_chunk - chunk) * samples;[m
[31m-[m
[31m-        if (start_sample < n) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        start_sample -= n;[m
[31m-[m
[31m-        prev_samples = samples;[m
[31m-        chunk = next_chunk;[m
[31m-        samples = ngx_mp4_get_32value(entry->samples);[m
[31m-        id = ngx_mp4_get_32value(entry->id);[m
[31m-        entries--;[m
[31m-        entry++;[m
[31m-    }[m
[31m-[m
[31m-    next_chunk = trak->chunks + 1;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample:%uD, chunk:%uD, chunks:%uD, samples:%uD",[m
[31m-                   start_sample, chunk, next_chunk - chunk, samples);[m
[31m-[m
[31m-    n = (next_chunk - chunk) * samples;[m
[31m-[m
[31m-    if (start_sample > n) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "%s time is out mp4 stsc chunks in \"%s\"",[m
[31m-                      start ? "start" : "end", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    entries++;[m
[31m-    entry--;[m
[31m-[m
[31m-    if (samples == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "zero number of samples in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    target_chunk = chunk - 1;[m
[31m-    target_chunk += start_sample / samples;[m
[31m-    chunk_samples = start_sample % samples;[m
[31m-[m
[31m-    if (start) {[m
[31m-        data->pos = (u_char *) entry;[m
[31m-[m
[31m-        trak->sample_to_chunk_entries = entries;[m
[31m-        trak->start_chunk = target_chunk;[m
[31m-        trak->start_chunk_samples = chunk_samples;[m
[31m-[m
[31m-        ngx_mp4_set_32value(entry->chunk, trak->start_chunk + 1);[m
[31m-[m
[31m-        samples -= chunk_samples;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "start_chunk:%ui, start_chunk_samples:%ui",[m
[31m-                       trak->start_chunk, trak->start_chunk_samples);[m
[31m-[m
[31m-    } else {[m
[31m-        if (start_sample) {[m
[31m-            data->last = (u_char *) (entry + 1);[m
[31m-            trak->sample_to_chunk_entries -= entries - 1;[m
[31m-            trak->end_chunk_samples = samples;[m
[31m-[m
[31m-        } else {[m
[31m-            data->last = (u_char *) entry;[m
[31m-            trak->sample_to_chunk_entries -= entries;[m
[31m-            trak->end_chunk_samples = prev_samples;[m
[31m-        }[m
[31m-[m
[31m-        if (chunk_samples) {[m
[31m-            trak->end_chunk = target_chunk + 1;[m
[31m-            trak->end_chunk_samples = chunk_samples;[m
[31m-[m
[31m-        } else {[m
[31m-            trak->end_chunk = target_chunk;[m
[31m-        }[m
[31m-[m
[31m-        samples = chunk_samples;[m
[31m-        next_chunk = chunk + 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "end_chunk:%ui, end_chunk_samples:%ui",[m
[31m-                       trak->end_chunk, trak->end_chunk_samples);[m
[31m-    }[m
[31m-[m
[31m-    if (chunk_samples && next_chunk - target_chunk == 2) {[m
[31m-[m
[31m-        ngx_mp4_set_32value(entry->samples, samples);[m
[31m-[m
[31m-    } else if (chunk_samples && start) {[m
[31m-[m
[31m-        first = &trak->stsc_start_chunk_entry;[m
[31m-        ngx_mp4_set_32value(first->chunk, 1);[m
[31m-        ngx_mp4_set_32value(first->samples, samples);[m
[31m-        ngx_mp4_set_32value(first->id, id);[m
[31m-[m
[31m-        buf = &trak->stsc_start_chunk_buf;[m
[31m-        buf->temporary = 1;[m
[31m-        buf->pos = (u_char *) first;[m
[31m-        buf->last = (u_char *) first + sizeof(ngx_mp4_stsc_entry_t);[m
[31m-[m
[31m-        trak->out[NGX_HTTP_MP4_STSC_START].buf = buf;[m
[31m-[m
[31m-        ngx_mp4_set_32value(entry->chunk, trak->start_chunk + 2);[m
[31m-[m
[31m-        trak->sample_to_chunk_entries++;[m
[31m-[m
[31m-    } else if (chunk_samples) {[m
[31m-[m
[31m-        first = &trak->stsc_end_chunk_entry;[m
[31m-        ngx_mp4_set_32value(first->chunk, trak->end_chunk - trak->start_chunk);[m
[31m-        ngx_mp4_set_32value(first->samples, samples);[m
[31m-        ngx_mp4_set_32value(first->id, id);[m
[31m-[m
[31m-        buf = &trak->stsc_end_chunk_buf;[m
[31m-        buf->temporary = 1;[m
[31m-        buf->pos = (u_char *) first;[m
[31m-        buf->last = (u_char *) first + sizeof(ngx_mp4_stsc_entry_t);[m
[31m-[m
[31m-        trak->out[NGX_HTTP_MP4_STSC_END].buf = buf;[m
[31m-[m
[31m-        trak->sample_to_chunk_entries++;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    uniform_size[4];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_stsz_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    size_t                atom_size;[m
[31m-    uint32_t              entries, size;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stsz_atom_t  *stsz_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* sample sizes atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsz atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stsz_atom = (ngx_mp4_stsz_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stsz_atom, 's', 't', 's', 'z');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stsz_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stsz atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = ngx_mp4_get_32value(stsz_atom->uniform_size);[m
[31m-    entries = ngx_mp4_get_32value(stsz_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "sample uniform size:%uD, entries:%uD", size, entries);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->sample_sizes_entries = entries;[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_stsz_atom_t);[m
[31m-[m
[31m-    atom = &trak->stsz_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf = atom;[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        if (ngx_mp4_atom_data_size(ngx_mp4_stsz_atom_t)[m
[31m-            + entries * sizeof(uint32_t) > atom_data_size)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "\"%s\" mp4 stsz atom too small",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        atom_end = atom_table + entries * sizeof(uint32_t);[m
[31m-[m
[31m-        data = &trak->stsz_data_buf;[m
[31m-        data->temporary = 1;[m
[31m-        data->pos = atom_table;[m
[31m-        data->last = atom_end;[m
[31m-[m
[31m-        trak->out[NGX_HTTP_MP4_STSZ_DATA].buf = data;[m
[31m-[m
[31m-    } else {[m
[31m-        /* if size != 0 then all samples are the same size */[m
[31m-        /* TODO : chunk samples */[m
[31m-        atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;[m
[31m-        ngx_mp4_set_32value(atom_header, atom_size);[m
[31m-        trak->size += atom_size;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stsz_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    uint32_t             *pos, *end, entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stsz_atom_t  *stsz_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stsz updating requires trak->start_sample[m
[31m-     * from mdia.minf.stbl.stts which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stsz atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STSZ_DATA].buf;[m
[31m-[m
[31m-    if (data) {[m
[31m-        entries = trak->sample_sizes_entries;[m
[31m-[m
[31m-        if (trak->start_sample > entries) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "start time is out mp4 stsz samples in \"%s\"",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        entries -= trak->start_sample;[m
[31m-        data->pos += trak->start_sample * sizeof(uint32_t);[m
[31m-        end = (uint32_t *) data->pos;[m
[31m-[m
[31m-        for (pos = end - trak->start_chunk_samples; pos < end; pos++) {[m
[31m-            trak->start_chunk_samples_size += ngx_mp4_get_32value(pos);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                       "chunk samples sizes:%uL",[m
[31m-                       trak->start_chunk_samples_size);[m
[31m-[m
[31m-        if (mp4->length) {[m
[31m-            if (trak->end_sample - trak->start_sample > entries) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                              "end time is out mp4 stsz samples in \"%s\"",[m
[31m-                              mp4->file.name.data);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            entries = trak->end_sample - trak->start_sample;[m
[31m-            data->last = data->pos + entries * sizeof(uint32_t);[m
[31m-            end = (uint32_t *) data->last;[m
[31m-[m
[31m-            for (pos = end - trak->end_chunk_samples; pos < end; pos++) {[m
[31m-                trak->end_chunk_samples_size += ngx_mp4_get_32value(pos);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                           "mp4 stsz end_chunk_samples_size:%uL",[m
[31m-                           trak->end_chunk_samples_size);[m
[31m-        }[m
[31m-[m
[31m-        atom_size = sizeof(ngx_mp4_stsz_atom_t) + (data->last - data->pos);[m
[31m-        trak->size += atom_size;[m
[31m-[m
[31m-        atom = trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf;[m
[31m-        stsz_atom = (ngx_mp4_stsz_atom_t *) atom->pos;[m
[31m-[m
[31m-        ngx_mp4_set_32value(stsz_atom->size, atom_size);[m
[31m-        ngx_mp4_set_32value(stsz_atom->entries, entries);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_stco_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stco_atom_t  *stco_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* chunk offsets atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stco atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    stco_atom = (ngx_mp4_stco_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(stco_atom, 's', 't', 'c', 'o');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stco_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stco atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(stco_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "chunks:%uD", entries);[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_stco_atom_t)[m
[31m-        + entries * sizeof(uint32_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 stco atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_stco_atom_t);[m
[31m-    atom_end = atom_table + entries * sizeof(uint32_t);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->chunks = entries;[m
[31m-[m
[31m-    atom = &trak->stco_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    data = &trak->stco_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_STCO_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_STCO_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_stco_atom_t  *stco_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.stco updating requires trak->start_chunk[m
[31m-     * from mdia.minf.stbl.stsc which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stco atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 stco atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (trak->start_chunk > trak->chunks) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "start time is out mp4 stco chunks in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    data->pos += trak->start_chunk * sizeof(uint32_t);[m
[31m-[m
[31m-    trak->start_offset = ngx_mp4_get_32value(data->pos);[m
[31m-    trak->start_offset += trak->start_chunk_samples_size;[m
[31m-    ngx_mp4_set_32value(data->pos, trak->start_offset);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "start chunk offset:%O", trak->start_offset);[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-[m
[31m-        if (trak->end_chunk > trak->chunks) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "end time is out mp4 stco chunks in \"%s\"",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        entries = trak->end_chunk - trak->start_chunk;[m
[31m-        data->last = data->pos + entries * sizeof(uint32_t);[m
[31m-[m
[31m-        if (entries) {[m
[31m-            trak->end_offset =[m
[31m-                            ngx_mp4_get_32value(data->last - sizeof(uint32_t));[m
[31m-            trak->end_offset += trak->end_chunk_samples_size;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                           "end chunk offset:%O", trak->end_offset);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        entries = trak->chunks - trak->start_chunk;[m
[31m-        trak->end_offset = mp4->mdat_data.buf->file_last;[m
[31m-    }[m
[31m-[m
[31m-    if (entries == 0) {[m
[31m-        trak->start_offset = mp4->end;[m
[31m-        trak->end_offset = 0;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_stco_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_STCO_ATOM].buf;[m
[31m-    stco_atom = (ngx_mp4_stco_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(stco_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(stco_atom->entries, entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_adjust_stco_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, int32_t adjustment)[m
[31m-{[m
[31m-    uint32_t    offset, *entry, *end;[m
[31m-    ngx_buf_t  *data;[m
[31m-[m
[31m-    /*[m
[31m-     * moov.trak.mdia.minf.stbl.stco adjustment requires[m
[31m-     * minimal start offset of all traks and new moov atom size[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 stco atom adjustment");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf;[m
[31m-    entry = (uint32_t *) data->pos;[m
[31m-    end = (uint32_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        offset = ngx_mp4_get_32value(entry);[m
[31m-        offset += adjustment;[m
[31m-        ngx_mp4_set_32value(entry, offset);[m
[31m-        entry++;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    size[4];[m
[31m-    u_char    name[4];[m
[31m-    u_char    version[1];[m
[31m-    u_char    flags[3];[m
[31m-    u_char    entries[4];[m
[31m-} ngx_mp4_co64_atom_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)[m
[31m-{[m
[31m-    u_char               *atom_header, *atom_table, *atom_end;[m
[31m-    uint32_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_co64_atom_t  *co64_atom;[m
[31m-    ngx_http_mp4_trak_t  *trak;[m
[31m-[m
[31m-    /* chunk offsets atom */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 co64 atom");[m
[31m-[m
[31m-    atom_header = ngx_mp4_atom_header(mp4);[m
[31m-    co64_atom = (ngx_mp4_co64_atom_t *) atom_header;[m
[31m-    ngx_mp4_set_atom_name(co64_atom, 'c', 'o', '6', '4');[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_co64_atom_t) > atom_data_size) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 co64 atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    entries = ngx_mp4_get_32value(co64_atom->entries);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "chunks:%uD", entries);[m
[31m-[m
[31m-    if (ngx_mp4_atom_data_size(ngx_mp4_co64_atom_t)[m
[31m-        + entries * sizeof(uint64_t) > atom_data_size)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "\"%s\" mp4 co64 atom too small", mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    atom_table = atom_header + sizeof(ngx_mp4_co64_atom_t);[m
[31m-    atom_end = atom_table + entries * sizeof(uint64_t);[m
[31m-[m
[31m-    trak = ngx_mp4_last_trak(mp4);[m
[31m-    trak->chunks = entries;[m
[31m-[m
[31m-    atom = &trak->co64_atom_buf;[m
[31m-    atom->temporary = 1;[m
[31m-    atom->pos = atom_header;[m
[31m-    atom->last = atom_table;[m
[31m-[m
[31m-    data = &trak->co64_data_buf;[m
[31m-    data->temporary = 1;[m
[31m-    data->pos = atom_table;[m
[31m-    data->last = atom_end;[m
[31m-[m
[31m-    trak->out[NGX_HTTP_MP4_CO64_ATOM].buf = atom;[m
[31m-    trak->out[NGX_HTTP_MP4_CO64_DATA].buf = data;[m
[31m-[m
[31m-    ngx_mp4_atom_next(mp4, atom_data_size);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_mp4_update_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak)[m
[31m-{[m
[31m-    size_t                atom_size;[m
[31m-    uint64_t              entries;[m
[31m-    ngx_buf_t            *atom, *data;[m
[31m-    ngx_mp4_co64_atom_t  *co64_atom;[m
[31m-[m
[31m-    /*[m
[31m-     * mdia.minf.stbl.co64 updating requires trak->start_chunk[m
[31m-     * from mdia.minf.stbl.stsc which depends on value from mdia.mdhd[m
[31m-     * atom which may reside after mdia.minf[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 co64 atom update");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf;[m
[31m-[m
[31m-    if (data == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "no mp4 co64 atoms were found in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (trak->start_chunk > trak->chunks) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                      "start time is out mp4 co64 chunks in \"%s\"",[m
[31m-                      mp4->file.name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    data->pos += trak->start_chunk * sizeof(uint64_t);[m
[31m-[m
[31m-    trak->start_offset = ngx_mp4_get_64value(data->pos);[m
[31m-    trak->start_offset += trak->start_chunk_samples_size;[m
[31m-    ngx_mp4_set_64value(data->pos, trak->start_offset);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "start chunk offset:%O", trak->start_offset);[m
[31m-[m
[31m-    if (mp4->length) {[m
[31m-[m
[31m-        if (trak->end_chunk > trak->chunks) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,[m
[31m-                          "end time is out mp4 co64 chunks in \"%s\"",[m
[31m-                          mp4->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        entries = trak->end_chunk - trak->start_chunk;[m
[31m-        data->last = data->pos + entries * sizeof(uint64_t);[m
[31m-[m
[31m-        if (entries) {[m
[31m-            trak->end_offset =[m
[31m-                            ngx_mp4_get_64value(data->last - sizeof(uint64_t));[m
[31m-            trak->end_offset += trak->end_chunk_samples_size;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                           "end chunk offset:%O", trak->end_offset);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        entries = trak->chunks - trak->start_chunk;[m
[31m-        trak->end_offset = mp4->mdat_data.buf->file_last;[m
[31m-    }[m
[31m-[m
[31m-    if (entries == 0) {[m
[31m-        trak->start_offset = mp4->end;[m
[31m-        trak->end_offset = 0;[m
[31m-    }[m
[31m-[m
[31m-    atom_size = sizeof(ngx_mp4_co64_atom_t) + (data->last - data->pos);[m
[31m-    trak->size += atom_size;[m
[31m-[m
[31m-    atom = trak->out[NGX_HTTP_MP4_CO64_ATOM].buf;[m
[31m-    co64_atom = (ngx_mp4_co64_atom_t *) atom->pos;[m
[31m-[m
[31m-    ngx_mp4_set_32value(co64_atom->size, atom_size);[m
[31m-    ngx_mp4_set_32value(co64_atom->entries, entries);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_mp4_adjust_co64_atom(ngx_http_mp4_file_t *mp4,[m
[31m-    ngx_http_mp4_trak_t *trak, off_t adjustment)[m
[31m-{[m
[31m-    uint64_t    offset, *entry, *end;[m
[31m-    ngx_buf_t  *data;[m
[31m-[m
[31m-    /*[m
[31m-     * moov.trak.mdia.minf.stbl.co64 adjustment requires[m
[31m-     * minimal start offset of all traks and new moov atom size[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,[m
[31m-                   "mp4 co64 atom adjustment");[m
[31m-[m
[31m-    data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf;[m
[31m-    entry = (uint64_t *) data->pos;[m
[31m-    end = (uint64_t *) data->last;[m
[31m-[m
[31m-    while (entry < end) {[m
[31m-        offset = ngx_mp4_get_64value(entry);[m
[31m-        offset += adjustment;[m
[31m-        ngx_mp4_set_64value(entry, offset);[m
[31m-        entry++;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_mp4(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_mp4_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_mp4_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_mp4_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_mp4_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->max_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_mp4_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_mp4_conf_t *prev = parent;[m
[31m-    ngx_http_mp4_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size, 512 * 1024);[m
[31m-    ngx_conf_merge_size_value(conf->max_buffer_size, prev->max_buffer_size,[m
[31m-                              10 * 1024 * 1024);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_not_modified_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_not_modified_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 032ba96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_not_modified_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,266 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t ngx_http_test_if_unmodified(ngx_http_request_t *r);[m
[31m-static ngx_uint_t ngx_http_test_if_modified(ngx_http_request_t *r);[m
[31m-static ngx_uint_t ngx_http_test_if_match(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *header, ngx_uint_t weak);[m
[31m-static ngx_int_t ngx_http_not_modified_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_not_modified_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_not_modified_filter_init,     /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_not_modified_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_not_modified_filter_module_ctx, /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_not_modified_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->headers_out.status != NGX_HTTP_OK[m
[31m-        || r != r->main[m
[31m-        || r->disable_not_modified)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.if_unmodified_since[m
[31m-        && !ngx_http_test_if_unmodified(r))[m
[31m-    {[m
[31m-        return ngx_http_filter_finalize_request(r, NULL,[m
[31m-                                                NGX_HTTP_PRECONDITION_FAILED);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.if_match[m
[31m-        && !ngx_http_test_if_match(r, r->headers_in.if_match, 0))[m
[31m-    {[m
[31m-        return ngx_http_filter_finalize_request(r, NULL,[m
[31m-                                                NGX_HTTP_PRECONDITION_FAILED);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.if_modified_since || r->headers_in.if_none_match) {[m
[31m-[m
[31m-        if (r->headers_in.if_modified_since[m
[31m-            && ngx_http_test_if_modified(r))[m
[31m-        {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_in.if_none_match[m
[31m-            && !ngx_http_test_if_match(r, r->headers_in.if_none_match, 1))[m
[31m-        {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        /* not modified */[m
[31m-[m
[31m-        r->headers_out.status = NGX_HTTP_NOT_MODIFIED;[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-        r->headers_out.content_type.len = 0;[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-        ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-        if (r->headers_out.content_encoding) {[m
[31m-            r->headers_out.content_encoding->hash = 0;[m
[31m-            r->headers_out.content_encoding = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_test_if_unmodified(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t  iums;[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time == (time_t) -1) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    iums = ngx_parse_http_time(r->headers_in.if_unmodified_since->value.data,[m
[31m-                               r->headers_in.if_unmodified_since->value.len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                 "http iums:%T lm:%T", iums, r->headers_out.last_modified_time);[m
[31m-[m
[31m-    if (iums >= r->headers_out.last_modified_time) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_test_if_modified(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                     ims;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time == (time_t) -1) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->if_modified_since == NGX_HTTP_IMS_OFF) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ims = ngx_parse_http_time(r->headers_in.if_modified_since->value.data,[m
[31m-                              r->headers_in.if_modified_since->value.len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http ims:%T lm:%T", ims, r->headers_out.last_modified_time);[m
[31m-[m
[31m-    if (ims == r->headers_out.last_modified_time) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->if_modified_since == NGX_HTTP_IMS_EXACT[m
[31m-        || ims < r->headers_out.last_modified_time)[m
[31m-    {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_test_if_match(ngx_http_request_t *r, ngx_table_elt_t *header,[m
[31m-    ngx_uint_t weak)[m
[31m-{[m
[31m-    u_char     *start, *end, ch;[m
[31m-    ngx_str_t   etag, *list;[m
[31m-[m
[31m-    list = &header->value;[m
[31m-[m
[31m-    if (list->len == 1 && list->data[0] == '*') {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.etag == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    etag = r->headers_out.etag->value;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http im:\"%V\" etag:%V", list, &etag);[m
[31m-[m
[31m-    if (weak[m
[31m-        && etag.len > 2[m
[31m-        && etag.data[0] == 'W'[m
[31m-        && etag.data[1] == '/')[m
[31m-    {[m
[31m-        etag.len -= 2;[m
[31m-        etag.data += 2;[m
[31m-    }[m
[31m-[m
[31m-    start = list->data;[m
[31m-    end = list->data + list->len;[m
[31m-[m
[31m-    while (start < end) {[m
[31m-[m
[31m-        if (weak[m
[31m-            && end - start > 2[m
[31m-            && start[0] == 'W'[m
[31m-            && start[1] == '/')[m
[31m-        {[m
[31m-            start += 2;[m
[31m-        }[m
[31m-[m
[31m-        if (etag.len > (size_t) (end - start)) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(start, etag.data, etag.len) != 0) {[m
[31m-            goto skip;[m
[31m-        }[m
[31m-[m
[31m-        start += etag.len;[m
[31m-[m
[31m-        while (start < end) {[m
[31m-            ch = *start;[m
[31m-[m
[31m-            if (ch == ' ' || ch == '\t') {[m
[31m-                start++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (start == end || *start == ',') {[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-    skip:[m
[31m-[m
[31m-        while (start < end && *start != ',') { start++; }[m
[31m-        while (start < end) {[m
[31m-            ch = *start;[m
[31m-[m
[31m-            if (ch == ' ' || ch == '\t' || ch == ',') {[m
[31m-                start++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_not_modified_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_not_modified_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c[m
[1mdeleted file mode 100644[m
[1mindex 826f54d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,4393 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_proxy_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_proxy_rewrite_s  ngx_http_proxy_rewrite_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len,[m
[31m-    ngx_http_proxy_rewrite_t *pr);[m
[31m-[m
[31m-struct ngx_http_proxy_rewrite_s {[m
[31m-    ngx_http_proxy_rewrite_pt      handler;[m
[31m-[m
[31m-    union {[m
[31m-        ngx_http_complex_value_t   complex;[m
[31m-#if (NGX_PCRE)[m
[31m-        ngx_http_regex_t          *regex;[m
[31m-#endif[m
[31m-    } pattern;[m
[31m-[m
[31m-    ngx_http_complex_value_t       replacement;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                      key_start;[m
[31m-    ngx_str_t                      schema;[m
[31m-    ngx_str_t                      host_header;[m
[31m-    ngx_str_t                      port;[m
[31m-    ngx_str_t                      uri;[m
[31m-} ngx_http_proxy_vars_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                   *flushes;[m
[31m-    ngx_array_t                   *lengths;[m
[31m-    ngx_array_t                   *values;[m
[31m-    ngx_hash_t                     hash;[m
[31m-} ngx_http_proxy_headers_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t       upstream;[m
[31m-[m
[31m-    ngx_array_t                   *body_flushes;[m
[31m-    ngx_array_t                   *body_lengths;[m
[31m-    ngx_array_t                   *body_values;[m
[31m-    ngx_str_t                      body_source;[m
[31m-[m
[31m-    ngx_http_proxy_headers_t       headers;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_proxy_headers_t       headers_cache;[m
[31m-#endif[m
[31m-    ngx_array_t                   *headers_source;[m
[31m-[m
[31m-    ngx_array_t                   *proxy_lengths;[m
[31m-    ngx_array_t                   *proxy_values;[m
[31m-[m
[31m-    ngx_array_t                   *redirects;[m
[31m-    ngx_array_t                   *cookie_domains;[m
[31m-    ngx_array_t                   *cookie_paths;[m
[31m-[m
[31m-    ngx_str_t                      method;[m
[31m-    ngx_str_t                      location;[m
[31m-    ngx_str_t                      url;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t       cache_key;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_proxy_vars_t          vars;[m
[31m-[m
[31m-    ngx_flag_t                     redirect;[m
[31m-[m
[31m-    ngx_uint_t                     http_version;[m
[31m-[m
[31m-    ngx_uint_t                     headers_hash_max_size;[m
[31m-    ngx_uint_t                     headers_hash_bucket_size;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_uint_t                     ssl;[m
[31m-    ngx_uint_t                     ssl_protocols;[m
[31m-    ngx_str_t                      ssl_ciphers;[m
[31m-    ngx_uint_t                     ssl_verify_depth;[m
[31m-    ngx_str_t                      ssl_trusted_certificate;[m
[31m-    ngx_str_t                      ssl_crl;[m
[31m-    ngx_str_t                      ssl_certificate;[m
[31m-    ngx_str_t                      ssl_certificate_key;[m
[31m-    ngx_array_t                   *ssl_passwords;[m
[31m-#endif[m
[31m-} ngx_http_proxy_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_status_t              status;[m
[31m-    ngx_http_chunked_t             chunked;[m
[31m-    ngx_http_proxy_vars_t          vars;[m
[31m-    off_t                          internal_body_length;[m
[31m-[m
[31m-    ngx_chain_t                   *free;[m
[31m-    ngx_chain_t                   *busy;[m
[31m-[m
[31m-    unsigned                       head:1;[m
[31m-    unsigned                       internal_chunked:1;[m
[31m-    unsigned                       header_sent:1;[m
[31m-} ngx_http_proxy_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_proxy_ctx_t *ctx, ngx_http_proxy_loc_conf_t *plcf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_proxy_create_key(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_proxy_process_status_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_input_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_proxy_copy_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_proxy_non_buffered_copy_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_proxy_non_buffered_chunked_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static void ngx_http_proxy_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_proxy_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, u_char *value, ngx_array_t *rewrites);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_str_t *replacement);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers,[m
[31m-    ngx_keyval_t *default_headers);[m
[31m-[m
[31m-static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static char *ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static char *ngx_http_proxy_ssl_password_file(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_regex(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_rewrite_t *pr, ngx_str_t *regex, ngx_uint_t caseless);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_proxy_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_loc_conf_t *plcf);[m
[31m-#endif[m
[31m-static void ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_proxy_lowat_post =[m
[31m-    { ngx_http_proxy_lowat_check };[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_proxy_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_proxy_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_proxy_http_version[] = {[m
[31m-    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },[m
[31m-    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_proxy_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_proxy_commands[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_redirect,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cookie_domain"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_cookie_domain,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cookie_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_cookie_path,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_lowat),[m
[31m-      &ngx_http_proxy_lowat_post },[m
[31m-[m
[31m-    { ngx_string("proxy_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_set_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_keyval_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_headers_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_headers_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_set_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, body_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_method"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, method),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("proxy_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_main_conf_t, caches),[m
[31m-      &ngx_http_proxy_module },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_proxy_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_convert_head"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_convert_head),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("proxy_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_proxy_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_http_version"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, http_version),[m
[31m-      &ngx_http_proxy_http_version },[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_session_reuse"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_session_reuse),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_protocols),[m
[31m-      &ngx_http_proxy_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_server_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_password_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_ssl_password_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_proxy_module_ctx = {[m
[31m-    ngx_http_proxy_add_variables,          /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_proxy_create_main_conf,       /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_proxy_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_proxy_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_proxy_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_proxy_module_ctx,            /* module context */[m
[31m-    ngx_http_proxy_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char  ngx_http_proxy_version[] = " HTTP/1.0" CRLF;[m
[31m-static char  ngx_http_proxy_version_11[] = " HTTP/1.1" CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_proxy_headers[] = {[m
[31m-    { ngx_string("Host"), ngx_string("$proxy_host") },[m
[31m-    { ngx_string("Connection"), ngx_string("close") },[m
[31m-    { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },[m
[31m-    { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },[m
[31m-    { ngx_string("TE"), ngx_string("") },[m
[31m-    { ngx_string("Keep-Alive"), ngx_string("") },[m
[31m-    { ngx_string("Expect"), ngx_string("") },[m
[31m-    { ngx_string("Upgrade"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_proxy_hide_headers[] = {[m
[31m-    ngx_string("Date"),[m
[31m-    ngx_string("Server"),[m
[31m-    ngx_string("X-Pad"),[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_proxy_cache_headers[] = {[m
[31m-    { ngx_string("Host"), ngx_string("$proxy_host") },[m
[31m-    { ngx_string("Connection"), ngx_string("close") },[m
[31m-    { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },[m
[31m-    { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },[m
[31m-    { ngx_string("TE"), ngx_string("") },[m
[31m-    { ngx_string("Keep-Alive"), ngx_string("") },[m
[31m-    { ngx_string("Expect"), ngx_string("") },[m
[31m-    { ngx_string("Upgrade"), ngx_string("") },[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("If-Unmodified-Since"), ngx_string("") },[m
[31m-    { ngx_string("If-None-Match"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("If-Match"), ngx_string("") },[m
[31m-    { ngx_string("Range"), ngx_string("") },[m
[31m-    { ngx_string("If-Range"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_proxy_vars[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_host"), NULL, ngx_http_proxy_host_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_port"), NULL, ngx_http_proxy_port_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_add_x_forwarded_for"), NULL,[m
[31m-      ngx_http_proxy_add_x_forwarded_for_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-#if 0[m
[31m-    { ngx_string("proxy_add_via"), NULL, NULL, 0, NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("proxy_internal_body_length"), NULL,[m
[31m-      ngx_http_proxy_internal_body_length_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_internal_chunked"), NULL,[m
[31m-      ngx_http_proxy_internal_chunked_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_proxy_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_PROXY_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-    ngx_http_proxy_ctx_t        *ctx;[m
[31m-    ngx_http_proxy_loc_conf_t   *plcf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_proxy_main_conf_t  *pmcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_proxy_module);[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (plcf->proxy_lengths == NULL) {[m
[31m-        ctx->vars = plcf->vars;[m
[31m-        u->schema = plcf->vars.schema;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl = (plcf->upstream.ssl != NULL);[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_proxy_eval(r, ctx, plcf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_proxy_module;[m
[31m-[m
[31m-    u->conf = &plcf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    u->caches = &pmcf->caches;[m
[31m-    u->create_key = ngx_http_proxy_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_proxy_create_request;[m
[31m-    u->reinit_request = ngx_http_proxy_reinit_request;[m
[31m-    u->process_header = ngx_http_proxy_process_status_line;[m
[31m-    u->abort_request = ngx_http_proxy_abort_request;[m
[31m-    u->finalize_request = ngx_http_proxy_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    if (plcf->redirects) {[m
[31m-        u->rewrite_redirect = ngx_http_proxy_rewrite_redirect;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_domains || plcf->cookie_paths) {[m
[31m-        u->rewrite_cookie = ngx_http_proxy_rewrite_cookie;[m
[31m-    }[m
[31m-[m
[31m-    u->buffering = plcf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_http_proxy_copy_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_proxy_input_filter_init;[m
[31m-    u->input_filter = ngx_http_proxy_non_buffered_copy_filter;[m
[31m-    u->input_filter_ctx = r;[m
[31m-[m
[31m-    u->accel = 1;[m
[31m-[m
[31m-    if (!plcf->upstream.request_buffering[m
[31m-        && plcf->body_values == NULL && plcf->upstream.pass_request_body[m
[31m-        && (!r->headers_in.chunked[m
[31m-            || plcf->http_version == NGX_HTTP_VERSION_11))[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx,[m
[31m-    ngx_http_proxy_loc_conf_t *plcf)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    size_t                add;[m
[31m-    u_short               port;[m
[31m-    ngx_str_t             proxy;[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &proxy, plcf->proxy_lengths->elts, 0,[m
[31m-                            plcf->proxy_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (proxy.len > 7[m
[31m-        && ngx_strncasecmp(proxy.data, (u_char *) "http://", 7) == 0)[m
[31m-    {[m
[31m-        add = 7;[m
[31m-        port = 80;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    } else if (proxy.len > 8[m
[31m-               && ngx_strncasecmp(proxy.data, (u_char *) "https://", 8) == 0)[m
[31m-    {[m
[31m-        add = 8;[m
[31m-        port = 443;[m
[31m-        r->upstream->ssl = 1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid URL prefix in \"%V\"", &proxy);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->schema.len = add;[m
[31m-    u->schema.data = proxy.data;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.len = proxy.len - add;[m
[31m-    url.url.data = proxy.data + add;[m
[31m-    url.default_port = port;[m
[31m-    url.uri_part = 1;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.uri.len) {[m
[31m-        if (url.uri.data[0] == '?') {[m
[31m-            p = ngx_pnalloc(r->pool, url.uri.len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *p++ = '/';[m
[31m-            ngx_memcpy(p, url.uri.data, url.uri.len);[m
[31m-[m
[31m-            url.uri.len++;[m
[31m-            url.uri.data = p - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->vars.key_start = u->schema;[m
[31m-[m
[31m-    ngx_http_proxy_set_vars(&url, &ctx->vars);[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = (in_port_t) (url.no_port ? port : url.port);[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                      len, loc_len;[m
[31m-    u_char                     *p;[m
[31m-    uintptr_t                   escape;[m
[31m-    ngx_str_t                  *key;[m
[31m-    ngx_http_upstream_t        *u;[m
[31m-    ngx_http_proxy_ctx_t       *ctx;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cache_key.value.data) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &plcf->cache_key, key) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *key = ctx->vars.key_start;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-[m
[31m-        *key = ctx->vars.uri;[m
[31m-        u->uri = ctx->vars.uri;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)[m
[31m-    {[m
[31m-        *key = r->unparsed_uri;[m
[31m-        u->uri = r->unparsed_uri;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    loc_len = (r->valid_location && ctx->vars.uri.len) ? plcf->location.len : 0;[m
[31m-[m
[31m-    if (r->quoted_uri || r->internal) {[m
[31m-        escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,[m
[31m-                                    r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-    } else {[m
[31m-        escape = 0;[m
[31m-    }[m
[31m-[m
[31m-    len = ctx->vars.uri.len + r->uri.len - loc_len + escape[m
[31m-          + sizeof("?") - 1 + r->args.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    key->data = p;[m
[31m-[m
[31m-    if (r->valid_location) {[m
[31m-        p = ngx_copy(p, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-    }[m
[31m-[m
[31m-    if (escape) {[m
[31m-        ngx_escape_uri(p, r->uri.data + loc_len,[m
[31m-                       r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-        p += r->uri.len - loc_len + escape;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_copy(p, r->uri.data + loc_len, r->uri.len - loc_len);[m
[31m-    }[m
[31m-[m
[31m-    if (r->args.len > 0) {[m
[31m-        *p++ = '?';[m
[31m-        p = ngx_copy(p, r->args.data, r->args.len);[m
[31m-    }[m
[31m-[m
[31m-    key->len = p - key->data;[m
[31m-    u->uri = *key;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                        len, uri_len, loc_len, body_len;[m
[31m-    uintptr_t                     escape;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_str_t                     method;[m
[31m-    ngx_uint_t                    i, unparsed_uri;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header;[m
[31m-    ngx_http_upstream_t          *u;[m
[31m-    ngx_http_proxy_ctx_t         *ctx;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_proxy_headers_t     *headers;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_proxy_loc_conf_t    *plcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    headers = u->cacheable ? &plcf->headers_cache : &plcf->headers;[m
[31m-#else[m
[31m-    headers = &plcf->headers;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->method.len) {[m
[31m-        /* HEAD was changed to GET to cache response */[m
[31m-        method = u->method;[m
[31m-[m
[31m-    } else if (plcf->method.len) {[m
[31m-        method = plcf->method;[m
[31m-[m
[31m-    } else {[m
[31m-        method = r->method_name;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (method.len == 4[m
[31m-        && ngx_strncasecmp(method.data, (u_char *) "HEAD", 4) == 0)[m
[31m-    {[m
[31m-        ctx->head = 1;[m
[31m-    }[m
[31m-[m
[31m-    len = method.len + 1 + sizeof(ngx_http_proxy_version) - 1[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    escape = 0;[m
[31m-    loc_len = 0;[m
[31m-    unparsed_uri = 0;[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-        uri_len = ctx->vars.uri.len;[m
[31m-[m
[31m-    } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)[m
[31m-    {[m
[31m-        unparsed_uri = 1;[m
[31m-        uri_len = r->unparsed_uri.len;[m
[31m-[m
[31m-    } else {[m
[31m-        loc_len = (r->valid_location && ctx->vars.uri.len) ?[m
[31m-                      plcf->location.len : 0;[m
[31m-[m
[31m-        if (r->quoted_uri || r->space_in_uri || r->internal) {[m
[31m-            escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,[m
[31m-                                        r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-        }[m
[31m-[m
[31m-        uri_len = ctx->vars.uri.len + r->uri.len - loc_len + escape[m
[31m-                  + sizeof("?") - 1 + r->args.len;[m
[31m-    }[m
[31m-[m
[31m-    if (uri_len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "zero length URI to proxy");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len += uri_len;[m
[31m-[m
[31m-    ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    ngx_http_script_flush_no_cacheable_variables(r, plcf->body_flushes);[m
[31m-    ngx_http_script_flush_no_cacheable_variables(r, headers->flushes);[m
[31m-[m
[31m-    if (plcf->body_lengths) {[m
[31m-        le.ip = plcf->body_lengths->elts;[m
[31m-        le.request = r;[m
[31m-        le.flushed = 1;[m
[31m-        body_len = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            body_len += lcode(&le);[m
[31m-        }[m
[31m-[m
[31m-        ctx->internal_body_length = body_len;[m
[31m-        len += body_len;[m
[31m-[m
[31m-    } else if (r->headers_in.chunked && r->reading_body) {[m
[31m-        ctx->internal_body_length = -1;[m
[31m-        ctx->internal_chunked = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->internal_body_length = r->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    le.ip = headers->lengths->elts;[m
[31m-    le.request = r;[m
[31m-    le.flushed = 1;[m
[31m-[m
[31m-    while (*(uintptr_t *) le.ip) {[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            len += lcode(&le);[m
[31m-        }[m
[31m-        le.ip += sizeof(uintptr_t);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (plcf->upstream.pass_request_headers) {[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_hash_find(&headers->hash, header[i].hash,[m
[31m-                              header[i].lowcase_key, header[i].key.len))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += header[i].key.len + sizeof(": ") - 1[m
[31m-                + header[i].value.len + sizeof(CRLF) - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-[m
[31m-    /* the request line */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, method.data, method.len);[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    u->uri.data = b->last;[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-        b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-[m
[31m-    } else if (unparsed_uri) {[m
[31m-        b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len);[m
[31m-[m
[31m-    } else {[m
[31m-        if (r->valid_location) {[m
[31m-            b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-        }[m
[31m-[m
[31m-        if (escape) {[m
[31m-            ngx_escape_uri(b->last, r->uri.data + loc_len,[m
[31m-                           r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-            b->last += r->uri.len - loc_len + escape;[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_copy(b->last, r->uri.data + loc_len,[m
[31m-                               r->uri.len - loc_len);[m
[31m-        }[m
[31m-[m
[31m-        if (r->args.len > 0) {[m
[31m-            *b->last++ = '?';[m
[31m-            b->last = ngx_copy(b->last, r->args.data, r->args.len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->uri.len = b->last - u->uri.data;[m
[31m-[m
[31m-    if (plcf->http_version == NGX_HTTP_VERSION_11) {[m
[31m-        b->last = ngx_cpymem(b->last, ngx_http_proxy_version_11,[m
[31m-                             sizeof(ngx_http_proxy_version_11) - 1);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, ngx_http_proxy_version,[m
[31m-                             sizeof(ngx_http_proxy_version) - 1);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    e.ip = headers->values->elts;[m
[31m-    e.pos = b->last;[m
[31m-    e.request = r;[m
[31m-    e.flushed = 1;[m
[31m-[m
[31m-    le.ip = headers->lengths->elts;[m
[31m-[m
[31m-    while (*(uintptr_t *) le.ip) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-[m
[31m-        /* skip the header line name length */[m
[31m-        (void) lcode(&le);[m
[31m-[m
[31m-        if (*(ngx_http_script_len_code_pt *) le.ip) {[m
[31m-[m
[31m-            for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-[m
[31m-            e.skip = (len == sizeof(CRLF) - 1) ? 1 : 0;[m
[31m-[m
[31m-        } else {[m
[31m-            e.skip = 0;[m
[31m-        }[m
[31m-[m
[31m-        le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-        while (*(uintptr_t *) e.ip) {[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) &e);[m
[31m-        }[m
[31m-        e.ip += sizeof(uintptr_t);[m
[31m-    }[m
[31m-[m
[31m-    b->last = e.pos;[m
[31m-[m
[31m-[m
[31m-    if (plcf->upstream.pass_request_headers) {[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_hash_find(&headers->hash, header[i].hash,[m
[31m-                              header[i].lowcase_key, header[i].key.len))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-            *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].value.data,[m
[31m-                               header[i].value.len);[m
[31m-[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header: \"%V: %V\"",[m
[31m-                           &header[i].key, &header[i].value);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* add "\r\n" at the header end */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (plcf->body_values) {[m
[31m-        e.ip = plcf->body_values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.skip = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) e.ip) {[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) &e);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy header:%N\"%*s\"",[m
[31m-                   (size_t) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        if (ctx->internal_chunked) {[m
[31m-            u->output.output_filter = ngx_http_proxy_body_output_filter;[m
[31m-            u->output.filter_ctx = r;[m
[31m-        }[m
[31m-[m
[31m-    } else if (plcf->body_values == NULL && plcf->upstream.pass_request_body) {[m
[31m-[m
[31m-        body = u->request_bufs;[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        while (body) {[m
[31m-            b = ngx_alloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl->next == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl = cl->next;[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        u->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    b->flush = 1;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->status.code = 0;[m
[31m-    ctx->status.count = 0;[m
[31m-    ctx->status.start = NULL;[m
[31m-    ctx->status.end = NULL;[m
[31m-    ctx->chunked.state = 0;[m
[31m-[m
[31m-    r->upstream->process_header = ngx_http_proxy_process_status_line;[m
[31m-    r->upstream->pipe->input_filter = ngx_http_proxy_copy_filter;[m
[31m-    r->upstream->input_filter = ngx_http_proxy_non_buffered_copy_filter;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    off_t                  size;[m
[31m-    u_char                *chunk;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b;[m
[31m-    ngx_chain_t           *out, *cl, *tl, **ll, **fl;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "proxy output filter");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        out = in;[m
[31m-        goto out;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    if (!ctx->header_sent) {[m
[31m-        /* first buffer contains headers, pass it unmodified */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "proxy output header");[m
[31m-[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        tl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tl->buf = in->buf;[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            tl->next = NULL;[m
[31m-            goto out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    cl = in;[m
[31m-    fl = ll;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "proxy output chunk: %O", ngx_buf_size(cl->buf));[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush[m
[31m-            || cl->buf->sync[m
[31m-            || ngx_buf_in_memory(cl->buf)[m
[31m-            || cl->buf->in_file)[m
[31m-        {[m
[31m-            tl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            tl->buf = cl->buf;[m
[31m-            *ll = tl;[m
[31m-            ll = &tl->next;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-        chunk = b->start;[m
[31m-[m
[31m-        if (chunk == NULL) {[m
[31m-            /* the "0000000000000000" is 64-bit hexadecimal string */[m
[31m-[m
[31m-            chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1);[m
[31m-            if (chunk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = chunk;[m
[31m-            b->end = chunk + sizeof("0000000000000000" CRLF) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->memory = 0;[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = chunk;[m
[31m-        b->last = ngx_sprintf(chunk, "%xO" CRLF, size);[m
[31m-[m
[31m-        tl->next = *fl;[m
[31m-        *fl = tl;[m
[31m-    }[m
[31m-[m
[31m-    if (cl->buf->last_buf) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->last_buf = 1;[m
[31m-        b->pos = (u_char *) CRLF "0" CRLF CRLF;[m
[31m-        b->last = b->pos + 7;[m
[31m-[m
[31m-        cl->buf->last_buf = 0;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            b->pos += 2;[m
[31m-        }[m
[31m-[m
[31m-    } else if (size > 0) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->pos = (u_char *) CRLF;[m
[31m-        b->last = b->pos + 2;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-    } else {[m
[31m-        *ll = NULL;[m
[31m-    }[m
[31m-[m
[31m-out:[m
[31m-[m
[31m-    rc = ngx_chain_writer(&r->upstream->writer, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_process_status_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                 len;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, &u->buffer, &ctx->status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (r->cache) {[m
[31m-            r->http_version = NGX_HTTP_VERSION_9;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent no valid HTTP/1.0 header");[m
[31m-[m
[31m-#if 0[m
[31m-        if (u->accel) {[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        r->http_version = NGX_HTTP_VERSION_9;[m
[31m-        u->state->status = NGX_HTTP_OK;[m
[31m-        u->headers_in.connection_close = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->status == 0) {[m
[31m-        u->state->status = ctx->status.code;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = ctx->status.code;[m
[31m-[m
[31m-    len = ctx->status.end - ctx->status.start;[m
[31m-    u->headers_in.status_line.len = len;[m
[31m-[m
[31m-    u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (u->headers_in.status_line.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u->headers_in.status_line.data, ctx->status.start, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy status %ui \"%V\"",[m
[31m-                   u->headers_in.status_n, &u->headers_in.status_line);[m
[31m-[m
[31m-    if (ctx->status.http_version < NGX_HTTP_VERSION_11) {[m
[31m-        u->headers_in.connection_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    u->process_header = ngx_http_proxy_process_header;[m
[31m-[m
[31m-    return ngx_http_proxy_process_header(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_proxy_ctx_t           *ctx;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            h->key.data = ngx_pnalloc(r->pool,[m
[31m-                               h->key.len + 1 + h->value.len + 1 + h->key.len);[m
[31m-            if (h->key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->value.data = h->key.data + h->key.len + 1;[m
[31m-            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;[m
[31m-[m
[31m-            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-            ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header: \"%V: %V\"",[m
[31m-                           &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header done");[m
[31m-[m
[31m-            /*[m
[31m-             * if no "Server" and "Date" in header line,[m
[31m-             * then add the special empty headers[m
[31m-             */[m
[31m-[m
[31m-            if (r->upstream->headers_in.server == NULL) {[m
[31m-                h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash([m
[31m-                                    ngx_hash('s', 'e'), 'r'), 'v'), 'e'), 'r');[m
[31m-[m
[31m-                ngx_str_set(&h->key, "Server");[m
[31m-                ngx_str_null(&h->value);[m
[31m-                h->lowcase_key = (u_char *) "server";[m
[31m-            }[m
[31m-[m
[31m-            if (r->upstream->headers_in.date == NULL) {[m
[31m-                h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                h->hash = ngx_hash(ngx_hash(ngx_hash('d', 'a'), 't'), 'e');[m
[31m-[m
[31m-                ngx_str_set(&h->key, "Date");[m
[31m-                ngx_str_null(&h->value);[m
[31m-                h->lowcase_key = (u_char *) "date";[m
[31m-            }[m
[31m-[m
[31m-            /* clear content length if response is chunked */[m
[31m-[m
[31m-            u = r->upstream;[m
[31m-[m
[31m-            if (u->headers_in.chunked) {[m
[31m-                u->headers_in.content_length_n = -1;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * set u->keepalive if response has no body; this allows to keep[m
[31m-             * connections alive in case of r->header_only or X-Accel-Redirect[m
[31m-             */[m
[31m-[m
[31m-            ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT[m
[31m-                || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED[m
[31m-                || ctx->head[m
[31m-                || (!u->headers_in.chunked[m
[31m-                    && u->headers_in.content_length_n == 0))[m
[31m-            {[m
[31m-                u->keepalive = !u->headers_in.connection_close;[m
[31m-            }[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-                u->keepalive = 0;[m
[31m-[m
[31m-                if (r->headers_in.upgrade) {[m
[31m-                    u->upgrade = 1;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid header");[m
[31m-[m
[31m-        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t    *r = data;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy filter init s:%ui h:%d c:%d l:%O",[m
[31m-                   u->headers_in.status_n, ctx->head, u->headers_in.chunked,[m
[31m-                   u->headers_in.content_length_n);[m
[31m-[m
[31m-    /* as per RFC2616, 4.4 Message Length */[m
[31m-[m
[31m-    if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT[m
[31m-        || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED[m
[31m-        || ctx->head)[m
[31m-    {[m
[31m-        /* 1xx, 204, and 304 and replies to HEAD requests */[m
[31m-        /* no 1xx since we don't send Expect and Upgrade */[m
[31m-[m
[31m-        u->pipe->length = 0;[m
[31m-        u->length = 0;[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-[m
[31m-    } else if (u->headers_in.chunked) {[m
[31m-        /* chunked */[m
[31m-[m
[31m-        u->pipe->input_filter = ngx_http_proxy_chunked_filter;[m
[31m-        u->pipe->length = 3; /* "0" LF LF */[m
[31m-[m
[31m-        u->input_filter = ngx_http_proxy_non_buffered_chunked_filter;[m
[31m-        u->length = 1;[m
[31m-[m
[31m-    } else if (u->headers_in.content_length_n == 0) {[m
[31m-        /* empty body: special case as filter won't be called */[m
[31m-[m
[31m-        u->pipe->length = 0;[m
[31m-        u->length = 0;[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-[m
[31m-    } else {[m
[31m-        /* content length or connection close */[m
[31m-[m
[31m-        u->pipe->length = u->headers_in.content_length_n;[m
[31m-        u->length = u->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_buf_t           *b;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    ngx_memcpy(b, buf, sizeof(ngx_buf_t));[m
[31m-    b->shadow = buf;[m
[31m-    b->tag = p->tag;[m
[31m-    b->last_shadow = 1;[m
[31m-    b->recycled = 1;[m
[31m-    buf->shadow = b;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num);[m
[31m-[m
[31m-    if (p->in) {[m
[31m-        *p->last_in = cl;[m
[31m-    } else {[m
[31m-        p->in = cl;[m
[31m-    }[m
[31m-    p->last_in = &cl->next;[m
[31m-[m
[31m-    if (p->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p->length -= b->last - b->pos;[m
[31m-[m
[31m-    if (p->length == 0) {[m
[31m-        r = p->input_ctx;[m
[31m-        p->upstream_done = 1;[m
[31m-        r->upstream->keepalive = !r->upstream->headers_in.connection_close;[m
[31m-[m
[31m-    } else if (p->length < 0) {[m
[31m-        r = p->input_ctx;[m
[31m-        p->upstream_done = 1;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                      "upstream sent more data than specified in "[m
[31m-                      "\"Content-Length\" header");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b, **prev;[m
[31m-    ngx_chain_t           *cl;[m
[31m-    ngx_http_request_t    *r;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r = p->input_ctx;[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = NULL;[m
[31m-    prev = &buf->shadow;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a chunk has been parsed successfully */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->start = buf->start;[m
[31m-            b->end = buf->end;[m
[31m-            b->tag = p->tag;[m
[31m-            b->temporary = 1;[m
[31m-            b->recycled = 1;[m
[31m-[m
[31m-            *prev = b;[m
[31m-            prev = &b->shadow;[m
[31m-[m
[31m-            if (p->in) {[m
[31m-                *p->last_in = cl;[m
[31m-            } else {[m
[31m-                p->in = cl;[m
[31m-            }[m
[31m-            p->last_in = &cl->next;[m
[31m-[m
[31m-            /* STUB */ b->num = buf->num;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "input buf #%d %p", b->num, b->pos);[m
[31m-[m
[31m-            if (buf->last - buf->pos >= ctx->chunked.size) {[m
[31m-[m
[31m-                buf->pos += (size_t) ctx->chunked.size;[m
[31m-                b->last = buf->pos;[m
[31m-                ctx->chunked.size = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ctx->chunked.size -= buf->last - buf->pos;[m
[31m-            buf->pos = buf->last;[m
[31m-            b->last = buf->last;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-[m
[31m-            /* a whole response has been parsed successfully */[m
[31m-[m
[31m-            p->upstream_done = 1;[m
[31m-            r->upstream->keepalive = !r->upstream->headers_in.connection_close;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            /* set p->length, minimal amount of data we want to see */[m
[31m-[m
[31m-            p->length = ctx->chunked.length;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* invalid response */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid chunked response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy chunked state %ui, length %O",[m
[31m-                   ctx->chunked.state, p->length);[m
[31m-[m
[31m-    if (b) {[m
[31m-        b->shadow = buf;[m
[31m-        b->last_shadow = 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "input buf %p %z", b->pos, b->last - b->pos);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* there is no data record in the buf, add it to free chain */[m
[31m-[m
[31m-    if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_non_buffered_copy_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t   *r = data;[m
[31m-[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    cl->buf->pos = b->last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    if (u->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u->length -= bytes;[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_non_buffered_chunked_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t   *r = data;[m
[31m-[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b, *buf;[m
[31m-    ngx_chain_t           *cl, **ll;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    buf = &u->buffer;[m
[31m-[m
[31m-    buf->pos = buf->last;[m
[31m-    buf->last += bytes;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a chunk has been parsed successfully */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            b->flush = 1;[m
[31m-            b->memory = 1;[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->tag = u->output.tag;[m
[31m-[m
[31m-            if (buf->last - buf->pos >= ctx->chunked.size) {[m
[31m-                buf->pos += (size_t) ctx->chunked.size;[m
[31m-                b->last = buf->pos;[m
[31m-                ctx->chunked.size = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->chunked.size -= buf->last - buf->pos;[m
[31m-                buf->pos = buf->last;[m
[31m-                b->last = buf->last;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy out buf %p %z",[m
[31m-                           b->pos, b->last - b->pos);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-[m
[31m-            /* a whole response has been parsed successfully */[m
[31m-[m
[31m-            u->keepalive = !u->headers_in.connection_close;[m
[31m-            u->length = 0;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* invalid response */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid chunked response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* provide continuous buffer for subrequests in memory */[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-[m
[31m-        cl = u->out_bufs;[m
[31m-[m
[31m-        if (cl) {[m
[31m-            buf->pos = cl->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        buf->last = buf->pos;[m
[31m-[m
[31m-        for (cl = u->out_bufs; cl; cl = cl->next) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy in memory %p-%p %O",[m
[31m-                           cl->buf->pos, cl->buf->last, ngx_buf_size(cl->buf));[m
[31m-[m
[31m-            if (buf->last == cl->buf->pos) {[m
[31m-                buf->last = cl->buf->last;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_movemem(buf->last, cl->buf->pos,[m
[31m-                                    cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-            cl->buf->pos = buf->last - (cl->buf->last - cl->buf->pos);[m
[31m-            cl->buf->last = buf->last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http proxy request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http proxy request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_host_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ctx->vars.host_header.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ctx->vars.host_header.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_port_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ctx->vars.port.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ctx->vars.port.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t             len;[m
[31m-    u_char            *p;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    n = r->headers_in.x_forwarded_for.nelts;[m
[31m-    h = r->headers_in.x_forwarded_for.elts;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        len += h[i]->value.len + sizeof(", ") - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        v->len = r->connection->addr_text.len;[m
[31m-        v->data = r->connection->addr_text.data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len += r->connection->addr_text.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        p = ngx_copy(p, h[i]->value.data, h[i]->value.len);[m
[31m-        *p++ = ','; *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, r->connection->addr_text.data, r->connection->addr_text.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->internal_body_length < 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%O", ctx->internal_body_length) - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL || !ctx->internal_chunked) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = (u_char *) "chunked";[m
[31m-    v->len = sizeof("chunked") - 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    size_t prefix)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_proxy_rewrite_t   *pr;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    pr = plcf->redirects->elts;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    len = h->value.len - prefix;[m
[31m-[m
[31m-    for (i = 0; i < plcf->redirects->nelts; i++) {[m
[31m-        rc = pr[i].handler(r, h, prefix, len, &pr[i]);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r, ngx_table_elt_t *h)[m
[31m-{[m
[31m-    size_t                      prefix;[m
[31m-    u_char                     *p;[m
[31m-    ngx_int_t                   rc, rv;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    p = (u_char *) ngx_strchr(h->value.data, ';');[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    prefix = p + 1 - h->value.data;[m
[31m-[m
[31m-    rv = NGX_DECLINED;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (plcf->cookie_domains) {[m
[31m-        p = ngx_strcasestrn(h->value.data + prefix, "domain=", 7 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 7,[m
[31m-                                                     plcf->cookie_domains);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                rv = rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_paths) {[m
[31m-        p = ngx_strcasestrn(h->value.data + prefix, "path=", 5 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 5,[m
[31m-                                                     plcf->cookie_paths);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                rv = rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    u_char *value, ngx_array_t *rewrites)[m
[31m-{[m
[31m-    size_t                     len, prefix;[m
[31m-    u_char                    *p;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_proxy_rewrite_t  *pr;[m
[31m-[m
[31m-    prefix = value - h->value.data;[m
[31m-[m
[31m-    p = (u_char *) ngx_strchr(value, ';');[m
[31m-[m
[31m-    len = p ? (size_t) (p - value) : (h->value.len - prefix);[m
[31m-[m
[31m-    pr = rewrites->elts;[m
[31m-[m
[31m-    for (i = 0; i < rewrites->nelts; i++) {[m
[31m-        rc = pr[i].handler(r, h, prefix, len, &pr[i]);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    ngx_str_t  pattern, replacement;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pattern.len > len[m
[31m-        || ngx_rstrncmp(h->value.data + prefix, pattern.data,[m
[31m-                        pattern.len) != 0)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, pattern.len, &replacement);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    ngx_str_t  pattern, replacement;[m
[31m-[m
[31m-    pattern.len = len;[m
[31m-    pattern.data = h->value.data + prefix;[m
[31m-[m
[31m-    if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (prefix == 0 && h->value.len == len) {[m
[31m-        h->value = replacement;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    ngx_str_t   pattern, replacement;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = h->value.data + prefix;[m
[31m-[m
[31m-    if (p[0] == '.') {[m
[31m-        p++;[m
[31m-        prefix++;[m
[31m-        len--;[m
[31m-    }[m
[31m-[m
[31m-    if (pattern.len != len || ngx_rstrncasecmp(pattern.data, p, len) != 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite(ngx_http_request_t *r, ngx_table_elt_t *h, size_t prefix,[m
[31m-    size_t len, ngx_str_t *replacement)[m
[31m-{[m
[31m-    u_char  *p, *data;[m
[31m-    size_t   new_len;[m
[31m-[m
[31m-    new_len = replacement->len + h->value.len - len;[m
[31m-[m
[31m-    if (replacement->len > len) {[m
[31m-[m
[31m-        data = ngx_pnalloc(r->pool, new_len + 1);[m
[31m-        if (data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(data, h->value.data, prefix);[m
[31m-        p = ngx_copy(p, replacement->data, replacement->len);[m
[31m-[m
[31m-        ngx_memcpy(p, h->value.data + prefix + len,[m
[31m-                   h->value.len - len - prefix + 1);[m
[31m-[m
[31m-        h->value.data = data;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_copy(h->value.data + prefix, replacement->data,[m
[31m-                     replacement->len);[m
[31m-[m
[31m-        ngx_memmove(p, h->value.data + prefix + len,[m
[31m-                    h->value.len - len - prefix + 1);[m
[31m-    }[m
[31m-[m
[31m-    h->value.len = new_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_proxy_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_proxy_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_proxy_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_proxy_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.ignore_headers = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.cache_zone = NULL;[m
[31m-     *     conf->upstream.cache_use_stale = 0;[m
[31m-     *     conf->upstream.cache_methods = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.hide_headers_hash = { NULL, 0 };[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     *     conf->upstream.store_lengths = NULL;[m
[31m-     *     conf->upstream.store_values = NULL;[m
[31m-     *     conf->upstream.ssl_name = NULL;[m
[31m-     *[m
[31m-     *     conf->method = { 0, NULL };[m
[31m-     *     conf->headers_source = NULL;[m
[31m-     *     conf->headers.lengths = NULL;[m
[31m-     *     conf->headers.values = NULL;[m
[31m-     *     conf->headers.hash = { NULL, 0 };[m
[31m-     *     conf->headers_cache.lengths = NULL;[m
[31m-     *     conf->headers_cache.values = NULL;[m
[31m-     *     conf->headers_cache.hash = { NULL, 0 };[m
[31m-     *     conf->body_lengths = NULL;[m
[31m-     *     conf->body_values = NULL;[m
[31m-     *     conf->body_source = { 0, NULL };[m
[31m-     *     conf->redirects = NULL;[m
[31m-     *     conf->ssl = 0;[m
[31m-     *     conf->ssl_protocols = 0;[m
[31m-     *     conf->ssl_ciphers = { 0, NULL };[m
[31m-     *     conf->ssl_trusted_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_crl = { 0, NULL };[m
[31m-     *     conf->ssl_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_certificate_key = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_convert_head = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_server_name = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_verify = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->ssl_passwords = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    /* "proxy_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->redirect = NGX_CONF_UNSET;[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    conf->cookie_domains = NGX_CONF_UNSET_PTR;[m
[31m-    conf->cookie_paths = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->http_version = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->headers_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    conf->headers_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "proxy");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *prev = parent;[m
[31m-    ngx_http_proxy_loc_conf_t *conf = child;[m
[31m-[m
[31m-    u_char                     *p;[m
[31m-    size_t                      size;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_hash_init_t             hash;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_proxy_rewrite_t   *pr;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store,[m
[31m-                              prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"proxy_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-                                         conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_busy_buffers_size\" must be equal to or greater than "[m
[31m-             "the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_busy_buffers_size\" must be less than "[m
[31m-             "the size of all \"proxy_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-                                      conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_temp_file_write_size\" must be equal to or greater "[m
[31m-             "than the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-                                        conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_max_temp_file_size\" must be equal to zero to disable "[m
[31m-             "temporary files usage or must be equal to or greater than "[m
[31m-             "the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                              prev->upstream.ignore_headers,[m
[31m-                              NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                              prev->upstream.temp_path,[m
[31m-                              &ngx_http_proxy_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"proxy_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_convert_head,[m
[31m-                              prev->upstream.cache_convert_head, 1);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->method, prev->method, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                              prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                              prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                              prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_session_reuse,[m
[31m-                              prev->upstream.ssl_session_reuse, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                                  |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,[m
[31m-                             "DEFAULT");[m
[31m-[m
[31m-    if (conf->upstream.ssl_name == NULL) {[m
[31m-        conf->upstream.ssl_name = prev->upstream.ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_server_name,[m
[31m-                              prev->upstream.ssl_server_name, 0);[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_verify,[m
[31m-                              prev->upstream.ssl_verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                              prev->ssl_trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate,[m
[31m-                              prev->ssl_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate_key,[m
[31m-                              prev->ssl_certificate_key, "");[m
[31m-    ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);[m
[31m-[m
[31m-    if (conf->ssl && ngx_http_proxy_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->redirect, prev->redirect, 1);[m
[31m-[m
[31m-    if (conf->redirect) {[m
[31m-[m
[31m-        if (conf->redirects == NULL) {[m
[31m-            conf->redirects = prev->redirects;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->redirects == NULL && conf->url.data) {[m
[31m-[m
[31m-            conf->redirects = ngx_array_create(cf->pool, 1,[m
[31m-                                             sizeof(ngx_http_proxy_rewrite_t));[m
[31m-            if (conf->redirects == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pr = ngx_array_push(conf->redirects);[m
[31m-            if (pr == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(&pr->pattern.complex,[m
[31m-                        sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-            ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-            pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-[m
[31m-            if (conf->vars.uri.len) {[m
[31m-                pr->pattern.complex.value = conf->url;[m
[31m-                pr->replacement.value = conf->location;[m
[31m-[m
[31m-            } else {[m
[31m-                pr->pattern.complex.value.len = conf->url.len[m
[31m-                                                + sizeof("/") - 1;[m
[31m-[m
[31m-                p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);[m
[31m-                if (p == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                pr->pattern.complex.value.data = p;[m
[31m-[m
[31m-                p = ngx_cpymem(p, conf->url.data, conf->url.len);[m
[31m-                *p = '/';[m
[31m-[m
[31m-                ngx_str_set(&pr->replacement.value, "/");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->cookie_domains, prev->cookie_domains, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->cookie_paths, prev->cookie_paths, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->http_version, prev->http_version,[m
[31m-                              NGX_HTTP_VERSION_10);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->headers_hash_max_size,[m
[31m-                              prev->headers_hash_max_size, 512);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->headers_hash_bucket_size,[m
[31m-                              prev->headers_hash_bucket_size, 64);[m
[31m-[m
[31m-    conf->headers_hash_bucket_size = ngx_align(conf->headers_hash_bucket_size,[m
[31m-                                               ngx_cacheline_size);[m
[31m-[m
[31m-    hash.max_size = conf->headers_hash_max_size;[m
[31m-    hash.bucket_size = conf->headers_hash_bucket_size;[m
[31m-    hash.name = "proxy_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_proxy_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->proxy_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->location = prev->location;[m
[31m-        conf->vars = prev->vars;[m
[31m-[m
[31m-        conf->proxy_lengths = prev->proxy_lengths;[m
[31m-        conf->proxy_values = prev->proxy_values;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        conf->upstream.ssl = prev->upstream.ssl;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->proxy_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_proxy_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_source.data == NULL) {[m
[31m-        conf->body_flushes = prev->body_flushes;[m
[31m-        conf->body_source = prev->body_source;[m
[31m-        conf->body_lengths = prev->body_lengths;[m
[31m-        conf->body_values = prev->body_values;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_source.data && conf->body_lengths == NULL) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &conf->body_source;[m
[31m-        sc.flushes = &conf->body_flushes;[m
[31m-        sc.lengths = &conf->body_lengths;[m
[31m-        sc.values = &conf->body_values;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers_source == NULL) {[m
[31m-        conf->headers = prev->headers;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->headers_cache = prev->headers_cache;[m
[31m-#endif[m
[31m-        conf->headers_source = prev->headers_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers,[m
[31m-                                     ngx_http_proxy_headers);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers_cache,[m
[31m-                                         ngx_http_proxy_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_init_headers(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf,[m
[31m-    ngx_http_proxy_headers_t *headers, ngx_keyval_t *default_headers)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_array_t                   headers_names, headers_merged;[m
[31m-    ngx_keyval_t                 *src, *s, *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (headers->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers_source == NULL) {[m
[31m-        conf->headers_source = ngx_array_create(cf->pool, 4,[m
[31m-                                                sizeof(ngx_keyval_t));[m
[31m-        if (conf->headers_source == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    headers->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (headers->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    headers->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (headers->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    src = conf->headers_source->elts;[m
[31m-    for (i = 0; i < conf->headers_source->nelts; i++) {[m
[31m-[m
[31m-        s = ngx_array_push(&headers_merged);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = src[i];[m
[31m-    }[m
[31m-[m
[31m-    h = default_headers;[m
[31m-[m
[31m-    while (h->key.len) {[m
[31m-[m
[31m-        src = headers_merged.elts;[m
[31m-        for (i = 0; i < headers_merged.nelts; i++) {[m
[31m-            if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        s = ngx_array_push(&headers_merged);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = *h;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        h++;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    src = headers_merged.elts;[m
[31m-    for (i = 0; i < headers_merged.nelts; i++) {[m
[31m-[m
[31m-        hk = ngx_array_push(&headers_names);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = src[i].key;[m
[31m-        hk->key_hash = ngx_hash_key_lc(src[i].key.data, src[i].key.len);[m
[31m-        hk->value = (void *) 1;[m
[31m-[m
[31m-        if (src[i].value.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_script_variables_count(&src[i].value) == 0) {[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1[m
[31m-                        + src[i].value.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                       + src[i].key.len + sizeof(": ") - 1[m
[31m-                       + src[i].value.len + sizeof(CRLF) - 1[m
[31m-                       + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1[m
[31m-                        + src[i].value.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-[m
[31m-            p = ngx_cpymem(p, src[i].key.data, src[i].key.len);[m
[31m-            *p++ = ':'; *p++ = ' ';[m
[31m-            p = ngx_cpymem(p, src[i].value.data, src[i].value.len);[m
[31m-            *p++ = CR; *p = LF;[m
[31m-[m
[31m-        } else {[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                    + src[i].key.len + sizeof(": ") - 1 + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-            p = ngx_cpymem(p, src[i].key.data, src[i].key.len);[m
[31m-            *p++ = ':'; *p = ' ';[m
[31m-[m
[31m-[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &src[i].value;[m
[31m-            sc.flushes = &headers->flushes;[m
[31m-            sc.lengths = &headers->lengths;[m
[31m-            sc.values = &headers->values;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = sizeof(CRLF) - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                    + sizeof(CRLF) - 1 + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = sizeof(CRLF) - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-            *p++ = CR; *p = LF;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-        code = ngx_array_push_n(headers->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-    hash.hash = &headers->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = conf->headers_hash_max_size;[m
[31m-    hash.bucket_size = conf->headers_hash_bucket_size;[m
[31m-    hash.name = "proxy_headers_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    size_t                      add;[m
[31m-    u_short                     port;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (plcf->upstream.upstream || plcf->proxy_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_proxy_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &plcf->proxy_lengths;[m
[31m-        sc.values = &plcf->proxy_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        plcf->ssl = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncasecmp(url->data, (u_char *) "http://", 7) == 0) {[m
[31m-        add = 7;[m
[31m-        port = 80;[m
[31m-[m
[31m-    } else if (ngx_strncasecmp(url->data, (u_char *) "https://", 8) == 0) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        plcf->ssl = 1;[m
[31m-[m
[31m-        add = 8;[m
[31m-        port = 443;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "https protocol requires SSL support");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid URL prefix");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url.len = url->len - add;[m
[31m-    u.url.data = url->data + add;[m
[31m-    u.default_port = port;[m
[31m-    u.uri_part = 1;[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    plcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (plcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    plcf->vars.schema.len = add;[m
[31m-    plcf->vars.schema.data = url->data;[m
[31m-    plcf->vars.key_start = plcf->vars.schema;[m
[31m-[m
[31m-    ngx_http_proxy_set_vars(&u, &plcf->vars);[m
[31m-[m
[31m-    plcf->location = clcf->name;[m
[31m-[m
[31m-    if (clcf->named[m
[31m-#if (NGX_PCRE)[m
[31m-        || clcf->regex[m
[31m-#endif[m
[31m-        || clcf->noname)[m
[31m-    {[m
[31m-        if (plcf->vars.uri.len) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_pass\" cannot have URI part in "[m
[31m-                               "location given by regular expression, "[m
[31m-                               "or inside named location, "[m
[31m-                               "or inside \"if\" statement, "[m
[31m-                               "or inside \"limit_except\" block");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        plcf->location.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    plcf->url = *url;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->redirect == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    plcf->redirect = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->redirect = 0;[m
[31m-            plcf->redirects = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "false") == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid parameter \"false\", use \"off\" instead");[m
[31m-            plcf->redirect = 0;[m
[31m-            plcf->redirects = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "default") != 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->redirects == NULL) {[m
[31m-        plcf->redirects = ngx_array_create(cf->pool, 1,[m
[31m-                                           sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->redirects == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->redirects);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "default") == 0) {[m
[31m-        if (plcf->proxy_lengths) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_redirect default\" cannot be used "[m
[31m-                               "with \"proxy_pass\" directive with variables");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (plcf->url.data == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_redirect default\" should be placed "[m
[31m-                               "after the \"proxy_pass\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-[m
[31m-        ngx_memzero(&pr->pattern.complex, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        if (plcf->vars.uri.len) {[m
[31m-            pr->pattern.complex.value = plcf->url;[m
[31m-            pr->replacement.value = plcf->location;[m
[31m-[m
[31m-        } else {[m
[31m-            pr->pattern.complex.value.len = plcf->url.len + sizeof("/") - 1;[m
[31m-[m
[31m-            p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pr->pattern.complex.value.data = p;[m
[31m-[m
[31m-            p = ngx_cpymem(p, plcf->url.data, plcf->url.len);[m
[31m-            *p = '/';[m
[31m-[m
[31m-            ngx_str_set(&pr->replacement.value, "/");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (value[1].data[0] == '*') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->cookie_domains == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->cookie_domains = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_domains == NGX_CONF_UNSET_PTR) {[m
[31m-        plcf->cookie_domains = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->cookie_domains == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->cookie_domains);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (value[1].data[0] == '.') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_domain_handler;[m
[31m-[m
[31m-        if (value[2].data[0] == '.') {[m
[31m-            value[2].len--;[m
[31m-            value[2].data++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->cookie_paths == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->cookie_paths = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_paths == NGX_CONF_UNSET_PTR) {[m
[31m-        plcf->cookie_paths = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->cookie_paths == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->cookie_paths);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (value[1].data[0] == '*') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_regex(ngx_conf_t *cf, ngx_http_proxy_rewrite_t *pr,[m
[31m-    ngx_str_t *regex, ngx_uint_t caseless)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    u_char               errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    ngx_regex_compile_t  rc;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *regex;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    if (caseless) {[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-    }[m
[31m-[m
[31m-    pr->pattern.regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (pr->pattern.regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->handler = ngx_http_proxy_rewrite_regex_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "using regex \"%V\" requires PCRE library", regex);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (plcf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        plcf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (plcf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"proxy_cache\"";[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    plcf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &plcf->upstream.store_lengths;[m
[31m-    sc.values = &plcf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        plcf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"proxy_store\"";[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        plcf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (plcf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *plcf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                      &ngx_http_proxy_module);[m
[31m-    if (plcf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &plcf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (plcf->ssl_passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    plcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (plcf->ssl_passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"proxy_send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"proxy_send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_set_ssl(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *plcf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    plcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (plcf->upstream.ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(plcf->upstream.ssl, plcf->ssl_protocols, NULL)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = plcf->upstream.ssl;[m
[31m-[m
[31m-    if (plcf->ssl_certificate.len) {[m
[31m-[m
[31m-        if (plcf->ssl_certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"proxy_ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &plcf->ssl_certificate);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_certificate(cf, plcf->upstream.ssl, &plcf->ssl_certificate,[m
[31m-                                &plcf->ssl_certificate_key, plcf->ssl_passwords)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(plcf->upstream.ssl->ctx,[m
[31m-                                (const char *) plcf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &plcf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->upstream.ssl_verify) {[m
[31m-        if (plcf->ssl_trusted_certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no proxy_ssl_trusted_certificate for proxy_ssl_verify");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, plcf->upstream.ssl,[m
[31m-                                        &plcf->ssl_trusted_certificate,[m
[31m-                                        plcf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, plcf->upstream.ssl, &plcf->ssl_crl) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v)[m
[31m-{[m
[31m-    if (u->family != AF_UNIX) {[m
[31m-[m
[31m-        if (u->no_port || u->port == u->default_port) {[m
[31m-[m
[31m-            v->host_header = u->host;[m
[31m-[m
[31m-            if (u->default_port == 80) {[m
[31m-                ngx_str_set(&v->port, "80");[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_str_set(&v->port, "443");[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            v->host_header.len = u->host.len + 1 + u->port_text.len;[m
[31m-            v->host_header.data = u->host.data;[m
[31m-            v->port = u->port_text;[m
[31m-        }[m
[31m-[m
[31m-        v->key_start.len += v->host_header.len;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&v->host_header, "localhost");[m
[31m-        ngx_str_null(&v->port);[m
[31m-        v->key_start.len += sizeof("unix:") - 1 + u->host.len + 1;[m
[31m-    }[m
[31m-[m
[31m-    v->uri = u->uri;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex c24ef17..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_proxy_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,4393 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_proxy_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_proxy_rewrite_s  ngx_http_proxy_rewrite_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len,[m
[31m-    ngx_http_proxy_rewrite_t *pr);[m
[31m-[m
[31m-struct ngx_http_proxy_rewrite_s {[m
[31m-    ngx_http_proxy_rewrite_pt      handler;[m
[31m-[m
[31m-    union {[m
[31m-        ngx_http_complex_value_t   complex;[m
[31m-#if (NGX_PCRE)[m
[31m-        ngx_http_regex_t          *regex;[m
[31m-#endif[m
[31m-    } pattern;[m
[31m-[m
[31m-    ngx_http_complex_value_t       replacement;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                      key_start;[m
[31m-    ngx_str_t                      schema;[m
[31m-    ngx_str_t                      host_header;[m
[31m-    ngx_str_t                      port;[m
[31m-    ngx_str_t                      uri;[m
[31m-} ngx_http_proxy_vars_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                   *flushes;[m
[31m-    ngx_array_t                   *lengths;[m
[31m-    ngx_array_t                   *values;[m
[31m-    ngx_hash_t                     hash;[m
[31m-} ngx_http_proxy_headers_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t       upstream;[m
[31m-[m
[31m-    ngx_array_t                   *body_flushes;[m
[31m-    ngx_array_t                   *body_lengths;[m
[31m-    ngx_array_t                   *body_values;[m
[31m-    ngx_str_t                      body_source;[m
[31m-[m
[31m-    ngx_http_proxy_headers_t       headers;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_proxy_headers_t       headers_cache;[m
[31m-#endif[m
[31m-    ngx_array_t                   *headers_source;[m
[31m-[m
[31m-    ngx_array_t                   *proxy_lengths;[m
[31m-    ngx_array_t                   *proxy_values;[m
[31m-[m
[31m-    ngx_array_t                   *redirects;[m
[31m-    ngx_array_t                   *cookie_domains;[m
[31m-    ngx_array_t                   *cookie_paths;[m
[31m-[m
[31m-    ngx_str_t                      method;[m
[31m-    ngx_str_t                      location;[m
[31m-    ngx_str_t                      url;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t       cache_key;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_proxy_vars_t          vars;[m
[31m-[m
[31m-    ngx_flag_t                     redirect;[m
[31m-[m
[31m-    ngx_uint_t                     http_version;[m
[31m-[m
[31m-    ngx_uint_t                     headers_hash_max_size;[m
[31m-    ngx_uint_t                     headers_hash_bucket_size;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_uint_t                     ssl;[m
[31m-    ngx_uint_t                     ssl_protocols;[m
[31m-    ngx_str_t                      ssl_ciphers;[m
[31m-    ngx_uint_t                     ssl_verify_depth;[m
[31m-    ngx_str_t                      ssl_trusted_certificate;[m
[31m-    ngx_str_t                      ssl_crl;[m
[31m-    ngx_str_t                      ssl_certificate;[m
[31m-    ngx_str_t                      ssl_certificate_key;[m
[31m-    ngx_array_t                   *ssl_passwords;[m
[31m-#endif[m
[31m-} ngx_http_proxy_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_status_t              status;[m
[31m-    ngx_http_chunked_t             chunked;[m
[31m-    ngx_http_proxy_vars_t          vars;[m
[31m-    off_t                          internal_body_length;[m
[31m-[m
[31m-    ngx_chain_t                   *free;[m
[31m-    ngx_chain_t                   *busy;[m
[31m-[m
[31m-    unsigned                       head:1;[m
[31m-    unsigned                       internal_chunked:1;[m
[31m-    unsigned                       header_sent:1;[m
[31m-} ngx_http_proxy_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_proxy_ctx_t *ctx, ngx_http_proxy_loc_conf_t *plcf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_proxy_create_key(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_proxy_process_status_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_process_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_proxy_input_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_proxy_copy_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p,[m
[31m-    ngx_buf_t *buf);[m
[31m-static ngx_int_t ngx_http_proxy_non_buffered_copy_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_proxy_non_buffered_chunked_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-static void ngx_http_proxy_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_proxy_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, u_char *value, ngx_array_t *rewrites);[m
[31m-static ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_str_t *replacement);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers,[m
[31m-    ngx_keyval_t *default_headers);[m
[31m-[m
[31m-static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static char *ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static char *ngx_http_proxy_ssl_password_file(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_proxy_rewrite_regex(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_rewrite_t *pr, ngx_str_t *regex, ngx_uint_t caseless);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_proxy_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_http_proxy_loc_conf_t *plcf);[m
[31m-#endif[m
[31m-static void ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_proxy_lowat_post =[m
[31m-    { ngx_http_proxy_lowat_check };[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_proxy_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_proxy_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_proxy_http_version[] = {[m
[31m-    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },[m
[31m-    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_proxy_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_proxy_commands[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_redirect,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cookie_domain"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_cookie_domain,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cookie_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_proxy_cookie_path,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.send_lowat),[m
[31m-      &ngx_http_proxy_lowat_post },[m
[31m-[m
[31m-    { ngx_string("proxy_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_set_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_keyval_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_headers_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_headers_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, headers_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_set_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, body_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_method"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, method),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("proxy_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_main_conf_t, caches),[m
[31m-      &ngx_http_proxy_module },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_proxy_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_cache_convert_head"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_convert_head),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("proxy_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_proxy_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-    { ngx_string("proxy_http_version"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, http_version),[m
[31m-      &ngx_http_proxy_http_version },[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_session_reuse"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_session_reuse),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_protocols),[m
[31m-      &ngx_http_proxy_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_server_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_proxy_loc_conf_t, ssl_certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_password_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_proxy_ssl_password_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_proxy_module_ctx = {[m
[31m-    ngx_http_proxy_add_variables,          /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_proxy_create_main_conf,       /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_proxy_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_proxy_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_proxy_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_proxy_module_ctx,            /* module context */[m
[31m-    ngx_http_proxy_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char  ngx_http_proxy_version[] = " HTTP/1.0" CRLF;[m
[31m-static char  ngx_http_proxy_version_11[] = " HTTP/1.1" CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_proxy_headers[] = {[m
[31m-    { ngx_string("Host"), ngx_string("$proxy_host") },[m
[31m-    { ngx_string("Connection"), ngx_string("close") },[m
[31m-    { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },[m
[31m-    { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },[m
[31m-    { ngx_string("TE"), ngx_string("") },[m
[31m-    { ngx_string("Keep-Alive"), ngx_string("") },[m
[31m-    { ngx_string("Expect"), ngx_string("") },[m
[31m-    { ngx_string("Upgrade"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_proxy_hide_headers[] = {[m
[31m-    ngx_string("Date"),[m
[31m-    ngx_string("Server"),[m
[31m-    ngx_string("X-Pad"),[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_proxy_cache_headers[] = {[m
[31m-    { ngx_string("Host"), ngx_string("$proxy_host") },[m
[31m-    { ngx_string("Connection"), ngx_string("close") },[m
[31m-    { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") },[m
[31m-    { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") },[m
[31m-    { ngx_string("TE"), ngx_string("") },[m
[31m-    { ngx_string("Keep-Alive"), ngx_string("") },[m
[31m-    { ngx_string("Expect"), ngx_string("") },[m
[31m-    { ngx_string("Upgrade"), ngx_string("") },[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("If-Unmodified-Since"), ngx_string("") },[m
[31m-    { ngx_string("If-None-Match"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("If-Match"), ngx_string("") },[m
[31m-    { ngx_string("Range"), ngx_string("") },[m
[31m-    { ngx_string("If-Range"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_proxy_vars[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_host"), NULL, ngx_http_proxy_host_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_port"), NULL, ngx_http_proxy_port_variable, 0,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_add_x_forwarded_for"), NULL,[m
[31m-      ngx_http_proxy_add_x_forwarded_for_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-#if 0[m
[31m-    { ngx_string("proxy_add_via"), NULL, NULL, 0, NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("proxy_internal_body_length"), NULL,[m
[31m-      ngx_http_proxy_internal_body_length_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_internal_chunked"), NULL,[m
[31m-      ngx_http_proxy_internal_chunked_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_proxy_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_PROXY_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-    ngx_http_proxy_ctx_t        *ctx;[m
[31m-    ngx_http_proxy_loc_conf_t   *plcf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_proxy_main_conf_t  *pmcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_proxy_module);[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (plcf->proxy_lengths == NULL) {[m
[31m-        ctx->vars = plcf->vars;[m
[31m-        u->schema = plcf->vars.schema;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl = (plcf->upstream.ssl != NULL);[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_proxy_eval(r, ctx, plcf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_proxy_module;[m
[31m-[m
[31m-    u->conf = &plcf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    u->caches = &pmcf->caches;[m
[31m-    u->create_key = ngx_http_proxy_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_proxy_create_request;[m
[31m-    u->reinit_request = ngx_http_proxy_reinit_request;[m
[31m-    u->process_header = ngx_http_proxy_process_status_line;[m
[31m-    u->abort_request = ngx_http_proxy_abort_request;[m
[31m-    u->finalize_request = ngx_http_proxy_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    if (plcf->redirects) {[m
[31m-        u->rewrite_redirect = ngx_http_proxy_rewrite_redirect;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_domains || plcf->cookie_paths) {[m
[31m-        u->rewrite_cookie = ngx_http_proxy_rewrite_cookie;[m
[31m-    }[m
[31m-[m
[31m-    u->buffering = plcf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_http_proxy_copy_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    u->input_filter_init = ngx_http_proxy_input_filter_init;[m
[31m-    u->input_filter = ngx_http_proxy_non_buffered_copy_filter;[m
[31m-    u->input_filter_ctx = r;[m
[31m-[m
[31m-    u->accel = 1;[m
[31m-[m
[31m-    if (!plcf->upstream.request_buffering[m
[31m-        && plcf->body_values == NULL && plcf->upstream.pass_request_body[m
[31m-        && (!r->headers_in.chunked[m
[31m-            || plcf->http_version == NGX_HTTP_VERSION_11))[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx,[m
[31m-    ngx_http_proxy_loc_conf_t *plcf)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    size_t                add;[m
[31m-    u_short               port;[m
[31m-    ngx_str_t             proxy;[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &proxy, plcf->proxy_lengths->elts, 0,[m
[31m-                            plcf->proxy_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (proxy.len > 7[m
[31m-        && ngx_strncasecmp(proxy.data, (u_char *) "http://", 7) == 0)[m
[31m-    {[m
[31m-        add = 7;[m
[31m-        port = 80;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    } else if (proxy.len > 8[m
[31m-               && ngx_strncasecmp(proxy.data, (u_char *) "https://", 8) == 0)[m
[31m-    {[m
[31m-        add = 8;[m
[31m-        port = 443;[m
[31m-        r->upstream->ssl = 1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid URL prefix in \"%V\"", &proxy);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->schema.len = add;[m
[31m-    u->schema.data = proxy.data;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.len = proxy.len - add;[m
[31m-    url.url.data = proxy.data + add;[m
[31m-    url.default_port = port;[m
[31m-    url.uri_part = 1;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.uri.len) {[m
[31m-        if (url.uri.data[0] == '?') {[m
[31m-            p = ngx_pnalloc(r->pool, url.uri.len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *p++ = '/';[m
[31m-            ngx_memcpy(p, url.uri.data, url.uri.len);[m
[31m-[m
[31m-            url.uri.len++;[m
[31m-            url.uri.data = p - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->vars.key_start = u->schema;[m
[31m-[m
[31m-    ngx_http_proxy_set_vars(&url, &ctx->vars);[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = (in_port_t) (url.no_port ? port : url.port);[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                      len, loc_len;[m
[31m-    u_char                     *p;[m
[31m-    uintptr_t                   escape;[m
[31m-    ngx_str_t                  *key;[m
[31m-    ngx_http_upstream_t        *u;[m
[31m-    ngx_http_proxy_ctx_t       *ctx;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cache_key.value.data) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &plcf->cache_key, key) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *key = ctx->vars.key_start;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-[m
[31m-        *key = ctx->vars.uri;[m
[31m-        u->uri = ctx->vars.uri;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)[m
[31m-    {[m
[31m-        *key = r->unparsed_uri;[m
[31m-        u->uri = r->unparsed_uri;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    loc_len = (r->valid_location && ctx->vars.uri.len) ? plcf->location.len : 0;[m
[31m-[m
[31m-    if (r->quoted_uri || r->internal) {[m
[31m-        escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,[m
[31m-                                    r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-    } else {[m
[31m-        escape = 0;[m
[31m-    }[m
[31m-[m
[31m-    len = ctx->vars.uri.len + r->uri.len - loc_len + escape[m
[31m-          + sizeof("?") - 1 + r->args.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    key->data = p;[m
[31m-[m
[31m-    if (r->valid_location) {[m
[31m-        p = ngx_copy(p, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-    }[m
[31m-[m
[31m-    if (escape) {[m
[31m-        ngx_escape_uri(p, r->uri.data + loc_len,[m
[31m-                       r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-        p += r->uri.len - loc_len + escape;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_copy(p, r->uri.data + loc_len, r->uri.len - loc_len);[m
[31m-    }[m
[31m-[m
[31m-    if (r->args.len > 0) {[m
[31m-        *p++ = '?';[m
[31m-        p = ngx_copy(p, r->args.data, r->args.len);[m
[31m-    }[m
[31m-[m
[31m-    key->len = p - key->data;[m
[31m-    u->uri = *key;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                        len, uri_len, loc_len, body_len;[m
[31m-    uintptr_t                     escape;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_str_t                     method;[m
[31m-    ngx_uint_t                    i, unparsed_uri;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header;[m
[31m-    ngx_http_upstream_t          *u;[m
[31m-    ngx_http_proxy_ctx_t         *ctx;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_proxy_headers_t     *headers;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_proxy_loc_conf_t    *plcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    headers = u->cacheable ? &plcf->headers_cache : &plcf->headers;[m
[31m-#else[m
[31m-    headers = &plcf->headers;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->method.len) {[m
[31m-        /* HEAD was changed to GET to cache response */[m
[31m-        method = u->method;[m
[31m-[m
[31m-    } else if (plcf->method.len) {[m
[31m-        method = plcf->method;[m
[31m-[m
[31m-    } else {[m
[31m-        method = r->method_name;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (method.len == 4[m
[31m-        && ngx_strncasecmp(method.data, (u_char *) "HEAD", 4) == 0)[m
[31m-    {[m
[31m-        ctx->head = 1;[m
[31m-    }[m
[31m-[m
[31m-    len = method.len + 1 + sizeof(ngx_http_proxy_version) - 1[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    escape = 0;[m
[31m-    loc_len = 0;[m
[31m-    unparsed_uri = 0;[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-        uri_len = ctx->vars.uri.len;[m
[31m-[m
[31m-    } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)[m
[31m-    {[m
[31m-        unparsed_uri = 1;[m
[31m-        uri_len = r->unparsed_uri.len;[m
[31m-[m
[31m-    } else {[m
[31m-        loc_len = (r->valid_location && ctx->vars.uri.len) ?[m
[31m-                      plcf->location.len : 0;[m
[31m-[m
[31m-        if (r->quoted_uri || r->space_in_uri || r->internal) {[m
[31m-            escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len,[m
[31m-                                        r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-        }[m
[31m-[m
[31m-        uri_len = ctx->vars.uri.len + r->uri.len - loc_len + escape[m
[31m-                  + sizeof("?") - 1 + r->args.len;[m
[31m-    }[m
[31m-[m
[31m-    if (uri_len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "zero length URI to proxy");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len += uri_len;[m
[31m-[m
[31m-    ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    ngx_http_script_flush_no_cacheable_variables(r, plcf->body_flushes);[m
[31m-    ngx_http_script_flush_no_cacheable_variables(r, headers->flushes);[m
[31m-[m
[31m-    if (plcf->body_lengths) {[m
[31m-        le.ip = plcf->body_lengths->elts;[m
[31m-        le.request = r;[m
[31m-        le.flushed = 1;[m
[31m-        body_len = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            body_len += lcode(&le);[m
[31m-        }[m
[31m-[m
[31m-        ctx->internal_body_length = body_len;[m
[31m-        len += body_len;[m
[31m-[m
[31m-    } else if (r->headers_in.chunked && r->reading_body) {[m
[31m-        ctx->internal_body_length = -1;[m
[31m-        ctx->internal_chunked = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->internal_body_length = r->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    le.ip = headers->lengths->elts;[m
[31m-    le.request = r;[m
[31m-    le.flushed = 1;[m
[31m-[m
[31m-    while (*(uintptr_t *) le.ip) {[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            len += lcode(&le);[m
[31m-        }[m
[31m-        le.ip += sizeof(uintptr_t);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (plcf->upstream.pass_request_headers) {[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_hash_find(&headers->hash, header[i].hash,[m
[31m-                              header[i].lowcase_key, header[i].key.len))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += header[i].key.len + sizeof(": ") - 1[m
[31m-                + header[i].value.len + sizeof(CRLF) - 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-[m
[31m-    /* the request line */[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, method.data, method.len);[m
[31m-    *b->last++ = ' ';[m
[31m-[m
[31m-    u->uri.data = b->last;[m
[31m-[m
[31m-    if (plcf->proxy_lengths && ctx->vars.uri.len) {[m
[31m-        b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-[m
[31m-    } else if (unparsed_uri) {[m
[31m-        b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len);[m
[31m-[m
[31m-    } else {[m
[31m-        if (r->valid_location) {[m
[31m-            b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);[m
[31m-        }[m
[31m-[m
[31m-        if (escape) {[m
[31m-            ngx_escape_uri(b->last, r->uri.data + loc_len,[m
[31m-                           r->uri.len - loc_len, NGX_ESCAPE_URI);[m
[31m-            b->last += r->uri.len - loc_len + escape;[m
[31m-[m
[31m-        } else {[m
[31m-            b->last = ngx_copy(b->last, r->uri.data + loc_len,[m
[31m-                               r->uri.len - loc_len);[m
[31m-        }[m
[31m-[m
[31m-        if (r->args.len > 0) {[m
[31m-            *b->last++ = '?';[m
[31m-            b->last = ngx_copy(b->last, r->args.data, r->args.len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->uri.len = b->last - u->uri.data;[m
[31m-[m
[31m-    if (plcf->http_version == NGX_HTTP_VERSION_11) {[m
[31m-        b->last = ngx_cpymem(b->last, ngx_http_proxy_version_11,[m
[31m-                             sizeof(ngx_http_proxy_version_11) - 1);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, ngx_http_proxy_version,[m
[31m-                             sizeof(ngx_http_proxy_version) - 1);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    e.ip = headers->values->elts;[m
[31m-    e.pos = b->last;[m
[31m-    e.request = r;[m
[31m-    e.flushed = 1;[m
[31m-[m
[31m-    le.ip = headers->lengths->elts;[m
[31m-[m
[31m-    while (*(uintptr_t *) le.ip) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-[m
[31m-        /* skip the header line name length */[m
[31m-        (void) lcode(&le);[m
[31m-[m
[31m-        if (*(ngx_http_script_len_code_pt *) le.ip) {[m
[31m-[m
[31m-            for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-[m
[31m-            e.skip = (len == sizeof(CRLF) - 1) ? 1 : 0;[m
[31m-[m
[31m-        } else {[m
[31m-            e.skip = 0;[m
[31m-        }[m
[31m-[m
[31m-        le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-        while (*(uintptr_t *) e.ip) {[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) &e);[m
[31m-        }[m
[31m-        e.ip += sizeof(uintptr_t);[m
[31m-    }[m
[31m-[m
[31m-    b->last = e.pos;[m
[31m-[m
[31m-[m
[31m-    if (plcf->upstream.pass_request_headers) {[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_hash_find(&headers->hash, header[i].hash,[m
[31m-                              header[i].lowcase_key, header[i].key.len))[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-            *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-            b->last = ngx_copy(b->last, header[i].value.data,[m
[31m-                               header[i].value.len);[m
[31m-[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header: \"%V: %V\"",[m
[31m-                           &header[i].key, &header[i].value);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* add "\r\n" at the header end */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (plcf->body_values) {[m
[31m-        e.ip = plcf->body_values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.skip = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) e.ip) {[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) &e);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy header:%N\"%*s\"",[m
[31m-                   (size_t) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        if (ctx->internal_chunked) {[m
[31m-            u->output.output_filter = ngx_http_proxy_body_output_filter;[m
[31m-            u->output.filter_ctx = r;[m
[31m-        }[m
[31m-[m
[31m-    } else if (plcf->body_values == NULL && plcf->upstream.pass_request_body) {[m
[31m-[m
[31m-        body = u->request_bufs;[m
[31m-        u->request_bufs = cl;[m
[31m-[m
[31m-        while (body) {[m
[31m-            b = ngx_alloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl->next == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl = cl->next;[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        u->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    b->flush = 1;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->status.code = 0;[m
[31m-    ctx->status.count = 0;[m
[31m-    ctx->status.start = NULL;[m
[31m-    ctx->status.end = NULL;[m
[31m-    ctx->chunked.state = 0;[m
[31m-[m
[31m-    r->upstream->process_header = ngx_http_proxy_process_status_line;[m
[31m-    r->upstream->pipe->input_filter = ngx_http_proxy_copy_filter;[m
[31m-    r->upstream->input_filter = ngx_http_proxy_non_buffered_copy_filter;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    off_t                  size;[m
[31m-    u_char                *chunk;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b;[m
[31m-    ngx_chain_t           *out, *cl, *tl, **ll, **fl;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "proxy output filter");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        out = in;[m
[31m-        goto out;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    if (!ctx->header_sent) {[m
[31m-        /* first buffer contains headers, pass it unmodified */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "proxy output header");[m
[31m-[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        tl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tl->buf = in->buf;[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-[m
[31m-        in = in->next;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            tl->next = NULL;[m
[31m-            goto out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    cl = in;[m
[31m-    fl = ll;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "proxy output chunk: %O", ngx_buf_size(cl->buf));[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush[m
[31m-            || cl->buf->sync[m
[31m-            || ngx_buf_in_memory(cl->buf)[m
[31m-            || cl->buf->in_file)[m
[31m-        {[m
[31m-            tl = ngx_alloc_chain_link(r->pool);[m
[31m-            if (tl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            tl->buf = cl->buf;[m
[31m-            *ll = tl;[m
[31m-            ll = &tl->next;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->next == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-        chunk = b->start;[m
[31m-[m
[31m-        if (chunk == NULL) {[m
[31m-            /* the "0000000000000000" is 64-bit hexadecimal string */[m
[31m-[m
[31m-            chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1);[m
[31m-            if (chunk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->start = chunk;[m
[31m-            b->end = chunk + sizeof("0000000000000000" CRLF) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->memory = 0;[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = chunk;[m
[31m-        b->last = ngx_sprintf(chunk, "%xO" CRLF, size);[m
[31m-[m
[31m-        tl->next = *fl;[m
[31m-        *fl = tl;[m
[31m-    }[m
[31m-[m
[31m-    if (cl->buf->last_buf) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->last_buf = 1;[m
[31m-        b->pos = (u_char *) CRLF "0" CRLF CRLF;[m
[31m-        b->last = b->pos + 7;[m
[31m-[m
[31m-        cl->buf->last_buf = 0;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            b->pos += 2;[m
[31m-        }[m
[31m-[m
[31m-    } else if (size > 0) {[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter;[m
[31m-        b->temporary = 0;[m
[31m-        b->memory = 1;[m
[31m-        b->pos = (u_char *) CRLF;[m
[31m-        b->last = b->pos + 2;[m
[31m-[m
[31m-        *ll = tl;[m
[31m-[m
[31m-    } else {[m
[31m-        *ll = NULL;[m
[31m-    }[m
[31m-[m
[31m-out:[m
[31m-[m
[31m-    rc = ngx_chain_writer(&r->upstream->writer, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_process_status_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                 len;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, &u->buffer, &ctx->status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (r->cache) {[m
[31m-            r->http_version = NGX_HTTP_VERSION_9;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent no valid HTTP/1.0 header");[m
[31m-[m
[31m-#if 0[m
[31m-        if (u->accel) {[m
[31m-            return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        r->http_version = NGX_HTTP_VERSION_9;[m
[31m-        u->state->status = NGX_HTTP_OK;[m
[31m-        u->headers_in.connection_close = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->status == 0) {[m
[31m-        u->state->status = ctx->status.code;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = ctx->status.code;[m
[31m-[m
[31m-    len = ctx->status.end - ctx->status.start;[m
[31m-    u->headers_in.status_line.len = len;[m
[31m-[m
[31m-    u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (u->headers_in.status_line.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u->headers_in.status_line.data, ctx->status.start, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy status %ui \"%V\"",[m
[31m-                   u->headers_in.status_n, &u->headers_in.status_line);[m
[31m-[m
[31m-    if (ctx->status.http_version < NGX_HTTP_VERSION_11) {[m
[31m-        u->headers_in.connection_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    u->process_header = ngx_http_proxy_process_header;[m
[31m-[m
[31m-    return ngx_http_proxy_process_header(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                       rc;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_proxy_ctx_t           *ctx;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            h->key.data = ngx_pnalloc(r->pool,[m
[31m-                               h->key.len + 1 + h->value.len + 1 + h->key.len);[m
[31m-            if (h->key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->value.data = h->key.data + h->key.len + 1;[m
[31m-            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;[m
[31m-[m
[31m-            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-            ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header: \"%V: %V\"",[m
[31m-                           &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy header done");[m
[31m-[m
[31m-            /*[m
[31m-             * if no "Server" and "Date" in header line,[m
[31m-             * then add the special empty headers[m
[31m-             */[m
[31m-[m
[31m-            if (r->upstream->headers_in.server == NULL) {[m
[31m-                h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash([m
[31m-                                    ngx_hash('s', 'e'), 'r'), 'v'), 'e'), 'r');[m
[31m-[m
[31m-                ngx_str_set(&h->key, "Server");[m
[31m-                ngx_str_null(&h->value);[m
[31m-                h->lowcase_key = (u_char *) "server";[m
[31m-            }[m
[31m-[m
[31m-            if (r->upstream->headers_in.date == NULL) {[m
[31m-                h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-                if (h == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                h->hash = ngx_hash(ngx_hash(ngx_hash('d', 'a'), 't'), 'e');[m
[31m-[m
[31m-                ngx_str_set(&h->key, "Date");[m
[31m-                ngx_str_null(&h->value);[m
[31m-                h->lowcase_key = (u_char *) "date";[m
[31m-            }[m
[31m-[m
[31m-            /* clear content length if response is chunked */[m
[31m-[m
[31m-            u = r->upstream;[m
[31m-[m
[31m-            if (u->headers_in.chunked) {[m
[31m-                u->headers_in.content_length_n = -1;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * set u->keepalive if response has no body; this allows to keep[m
[31m-             * connections alive in case of r->header_only or X-Accel-Redirect[m
[31m-             */[m
[31m-[m
[31m-            ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT[m
[31m-                || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED[m
[31m-                || ctx->head[m
[31m-                || (!u->headers_in.chunked[m
[31m-                    && u->headers_in.content_length_n == 0))[m
[31m-            {[m
[31m-                u->keepalive = !u->headers_in.connection_close;[m
[31m-            }[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-                u->keepalive = 0;[m
[31m-[m
[31m-                if (r->headers_in.upgrade) {[m
[31m-                    u->upgrade = 1;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid header");[m
[31m-[m
[31m-        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t    *r = data;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy filter init s:%ui h:%d c:%d l:%O",[m
[31m-                   u->headers_in.status_n, ctx->head, u->headers_in.chunked,[m
[31m-                   u->headers_in.content_length_n);[m
[31m-[m
[31m-    /* as per RFC2616, 4.4 Message Length */[m
[31m-[m
[31m-    if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT[m
[31m-        || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED[m
[31m-        || ctx->head)[m
[31m-    {[m
[31m-        /* 1xx, 204, and 304 and replies to HEAD requests */[m
[31m-        /* no 1xx since we don't send Expect and Upgrade */[m
[31m-[m
[31m-        u->pipe->length = 0;[m
[31m-        u->length = 0;[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-[m
[31m-    } else if (u->headers_in.chunked) {[m
[31m-        /* chunked */[m
[31m-[m
[31m-        u->pipe->input_filter = ngx_http_proxy_chunked_filter;[m
[31m-        u->pipe->length = 3; /* "0" LF LF */[m
[31m-[m
[31m-        u->input_filter = ngx_http_proxy_non_buffered_chunked_filter;[m
[31m-        u->length = 1;[m
[31m-[m
[31m-    } else if (u->headers_in.content_length_n == 0) {[m
[31m-        /* empty body: special case as filter won't be called */[m
[31m-[m
[31m-        u->pipe->length = 0;[m
[31m-        u->length = 0;[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-[m
[31m-    } else {[m
[31m-        /* content length or connection close */[m
[31m-[m
[31m-        u->pipe->length = u->headers_in.content_length_n;[m
[31m-        u->length = u->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_buf_t           *b;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    ngx_memcpy(b, buf, sizeof(ngx_buf_t));[m
[31m-    b->shadow = buf;[m
[31m-    b->tag = p->tag;[m
[31m-    b->last_shadow = 1;[m
[31m-    b->recycled = 1;[m
[31m-    buf->shadow = b;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num);[m
[31m-[m
[31m-    if (p->in) {[m
[31m-        *p->last_in = cl;[m
[31m-    } else {[m
[31m-        p->in = cl;[m
[31m-    }[m
[31m-    p->last_in = &cl->next;[m
[31m-[m
[31m-    if (p->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p->length -= b->last - b->pos;[m
[31m-[m
[31m-    if (p->length == 0) {[m
[31m-        r = p->input_ctx;[m
[31m-        p->upstream_done = 1;[m
[31m-        r->upstream->keepalive = !r->upstream->headers_in.connection_close;[m
[31m-[m
[31m-    } else if (p->length < 0) {[m
[31m-        r = p->input_ctx;[m
[31m-        p->upstream_done = 1;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                      "upstream sent more data than specified in "[m
[31m-                      "\"Content-Length\" header");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)[m
[31m-{[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b, **prev;[m
[31m-    ngx_chain_t           *cl;[m
[31m-    ngx_http_request_t    *r;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    if (buf->pos == buf->last) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r = p->input_ctx;[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = NULL;[m
[31m-    prev = &buf->shadow;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a chunk has been parsed successfully */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(p->pool, &p->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->start = buf->start;[m
[31m-            b->end = buf->end;[m
[31m-            b->tag = p->tag;[m
[31m-            b->temporary = 1;[m
[31m-            b->recycled = 1;[m
[31m-[m
[31m-            *prev = b;[m
[31m-            prev = &b->shadow;[m
[31m-[m
[31m-            if (p->in) {[m
[31m-                *p->last_in = cl;[m
[31m-            } else {[m
[31m-                p->in = cl;[m
[31m-            }[m
[31m-            p->last_in = &cl->next;[m
[31m-[m
[31m-            /* STUB */ b->num = buf->num;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                           "input buf #%d %p", b->num, b->pos);[m
[31m-[m
[31m-            if (buf->last - buf->pos >= ctx->chunked.size) {[m
[31m-[m
[31m-                buf->pos += (size_t) ctx->chunked.size;[m
[31m-                b->last = buf->pos;[m
[31m-                ctx->chunked.size = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ctx->chunked.size -= buf->last - buf->pos;[m
[31m-            buf->pos = buf->last;[m
[31m-            b->last = buf->last;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-[m
[31m-            /* a whole response has been parsed successfully */[m
[31m-[m
[31m-            p->upstream_done = 1;[m
[31m-            r->upstream->keepalive = !r->upstream->headers_in.connection_close;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            /* set p->length, minimal amount of data we want to see */[m
[31m-[m
[31m-            p->length = ctx->chunked.length;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* invalid response */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid chunked response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http proxy chunked state %ui, length %O",[m
[31m-                   ctx->chunked.state, p->length);[m
[31m-[m
[31m-    if (b) {[m
[31m-        b->shadow = buf;[m
[31m-        b->last_shadow = 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0,[m
[31m-                       "input buf %p %z", b->pos, b->last - b->pos);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* there is no data record in the buf, add it to free chain */[m
[31m-[m
[31m-    if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_non_buffered_copy_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t   *r = data;[m
[31m-[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    cl->buf->pos = b->last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    if (u->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u->length -= bytes;[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        u->keepalive = !u->headers_in.connection_close;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_non_buffered_chunked_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t   *r = data;[m
[31m-[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_buf_t             *b, *buf;[m
[31m-    ngx_chain_t           *cl, **ll;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    buf = &u->buffer;[m
[31m-[m
[31m-    buf->pos = buf->last;[m
[31m-    buf->last += bytes;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_chunked(r, buf, &ctx->chunked);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a chunk has been parsed successfully */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            b->flush = 1;[m
[31m-            b->memory = 1;[m
[31m-[m
[31m-            b->pos = buf->pos;[m
[31m-            b->tag = u->output.tag;[m
[31m-[m
[31m-            if (buf->last - buf->pos >= ctx->chunked.size) {[m
[31m-                buf->pos += (size_t) ctx->chunked.size;[m
[31m-                b->last = buf->pos;[m
[31m-                ctx->chunked.size = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->chunked.size -= buf->last - buf->pos;[m
[31m-                buf->pos = buf->last;[m
[31m-                b->last = buf->last;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy out buf %p %z",[m
[31m-                           b->pos, b->last - b->pos);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-[m
[31m-            /* a whole response has been parsed successfully */[m
[31m-[m
[31m-            u->keepalive = !u->headers_in.connection_close;[m
[31m-            u->length = 0;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        /* invalid response */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid chunked response");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* provide continuous buffer for subrequests in memory */[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-[m
[31m-        cl = u->out_bufs;[m
[31m-[m
[31m-        if (cl) {[m
[31m-            buf->pos = cl->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        buf->last = buf->pos;[m
[31m-[m
[31m-        for (cl = u->out_bufs; cl; cl = cl->next) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http proxy in memory %p-%p %O",[m
[31m-                           cl->buf->pos, cl->buf->last, ngx_buf_size(cl->buf));[m
[31m-[m
[31m-            if (buf->last == cl->buf->pos) {[m
[31m-                buf->last = cl->buf->last;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_movemem(buf->last, cl->buf->pos,[m
[31m-                                    cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-            cl->buf->pos = buf->last - (cl->buf->last - cl->buf->pos);[m
[31m-            cl->buf->last = buf->last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http proxy request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http proxy request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_host_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ctx->vars.host_header.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ctx->vars.host_header.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_port_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ctx->vars.port.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ctx->vars.port.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t             len;[m
[31m-    u_char            *p;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    n = r->headers_in.x_forwarded_for.nelts;[m
[31m-    h = r->headers_in.x_forwarded_for.elts;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        len += h[i]->value.len + sizeof(", ") - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        v->len = r->connection->addr_text.len;[m
[31m-        v->data = r->connection->addr_text.data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len += r->connection->addr_text.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        p = ngx_copy(p, h[i]->value.data, h[i]->value.len);[m
[31m-        *p++ = ','; *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, r->connection->addr_text.data, r->connection->addr_text.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->internal_body_length < 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%O", ctx->internal_body_length) - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_proxy_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (ctx == NULL || !ctx->internal_chunked) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = (u_char *) "chunked";[m
[31m-    v->len = sizeof("chunked") - 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    size_t prefix)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_proxy_rewrite_t   *pr;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    pr = plcf->redirects->elts;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    len = h->value.len - prefix;[m
[31m-[m
[31m-    for (i = 0; i < plcf->redirects->nelts; i++) {[m
[31m-        rc = pr[i].handler(r, h, prefix, len, &pr[i]);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r, ngx_table_elt_t *h)[m
[31m-{[m
[31m-    size_t                      prefix;[m
[31m-    u_char                     *p;[m
[31m-    ngx_int_t                   rc, rv;[m
[31m-    ngx_http_proxy_loc_conf_t  *plcf;[m
[31m-[m
[31m-    p = (u_char *) ngx_strchr(h->value.data, ';');[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    prefix = p + 1 - h->value.data;[m
[31m-[m
[31m-    rv = NGX_DECLINED;[m
[31m-[m
[31m-    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);[m
[31m-[m
[31m-    if (plcf->cookie_domains) {[m
[31m-        p = ngx_strcasestrn(h->value.data + prefix, "domain=", 7 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 7,[m
[31m-                                                     plcf->cookie_domains);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                rv = rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_paths) {[m
[31m-        p = ngx_strcasestrn(h->value.data + prefix, "path=", 5 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = ngx_http_proxy_rewrite_cookie_value(r, h, p + 5,[m
[31m-                                                     plcf->cookie_paths);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                rv = rc;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    u_char *value, ngx_array_t *rewrites)[m
[31m-{[m
[31m-    size_t                     len, prefix;[m
[31m-    u_char                    *p;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_proxy_rewrite_t  *pr;[m
[31m-[m
[31m-    prefix = value - h->value.data;[m
[31m-[m
[31m-    p = (u_char *) ngx_strchr(value, ';');[m
[31m-[m
[31m-    len = p ? (size_t) (p - value) : (h->value.len - prefix);[m
[31m-[m
[31m-    pr = rewrites->elts;[m
[31m-[m
[31m-    for (i = 0; i < rewrites->nelts; i++) {[m
[31m-        rc = pr[i].handler(r, h, prefix, len, &pr[i]);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    ngx_str_t  pattern, replacement;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pattern.len > len[m
[31m-        || ngx_rstrncmp(h->value.data + prefix, pattern.data,[m
[31m-                        pattern.len) != 0)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, pattern.len, &replacement);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    ngx_str_t  pattern, replacement;[m
[31m-[m
[31m-    pattern.len = len;[m
[31m-    pattern.data = h->value.data + prefix;[m
[31m-[m
[31m-    if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (prefix == 0 && h->value.len == len) {[m
[31m-        h->value = replacement;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    ngx_str_t   pattern, replacement;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = h->value.data + prefix;[m
[31m-[m
[31m-    if (p[0] == '.') {[m
[31m-        p++;[m
[31m-        prefix++;[m
[31m-        len--;[m
[31m-    }[m
[31m-[m
[31m-    if (pattern.len != len || ngx_rstrncasecmp(pattern.data, p, len) != 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite(ngx_http_request_t *r, ngx_table_elt_t *h, size_t prefix,[m
[31m-    size_t len, ngx_str_t *replacement)[m
[31m-{[m
[31m-    u_char  *p, *data;[m
[31m-    size_t   new_len;[m
[31m-[m
[31m-    new_len = replacement->len + h->value.len - len;[m
[31m-[m
[31m-    if (replacement->len > len) {[m
[31m-[m
[31m-        data = ngx_pnalloc(r->pool, new_len + 1);[m
[31m-        if (data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(data, h->value.data, prefix);[m
[31m-        p = ngx_copy(p, replacement->data, replacement->len);[m
[31m-[m
[31m-        ngx_memcpy(p, h->value.data + prefix + len,[m
[31m-                   h->value.len - len - prefix + 1);[m
[31m-[m
[31m-        h->value.data = data;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_copy(h->value.data + prefix, replacement->data,[m
[31m-                     replacement->len);[m
[31m-[m
[31m-        ngx_memmove(p, h->value.data + prefix + len,[m
[31m-                    h->value.len - len - prefix + 1);[m
[31m-    }[m
[31m-[m
[31m-    h->value.len = new_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_proxy_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_proxy_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_proxy_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_proxy_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.bufs.num = 0;[m
[31m-     *     conf->upstream.ignore_headers = 0;[m
[31m-     *     conf->upstream.next_upstream = 0;[m
[31m-     *     conf->upstream.cache_zone = NULL;[m
[31m-     *     conf->upstream.cache_use_stale = 0;[m
[31m-     *     conf->upstream.cache_methods = 0;[m
[31m-     *     conf->upstream.temp_path = NULL;[m
[31m-     *     conf->upstream.hide_headers_hash = { NULL, 0 };[m
[31m-     *     conf->upstream.uri = { 0, NULL };[m
[31m-     *     conf->upstream.location = NULL;[m
[31m-     *     conf->upstream.store_lengths = NULL;[m
[31m-     *     conf->upstream.store_values = NULL;[m
[31m-     *     conf->upstream.ssl_name = NULL;[m
[31m-     *[m
[31m-     *     conf->method = { 0, NULL };[m
[31m-     *     conf->headers_source = NULL;[m
[31m-     *     conf->headers.lengths = NULL;[m
[31m-     *     conf->headers.values = NULL;[m
[31m-     *     conf->headers.hash = { NULL, 0 };[m
[31m-     *     conf->headers_cache.lengths = NULL;[m
[31m-     *     conf->headers_cache.values = NULL;[m
[31m-     *     conf->headers_cache.hash = { NULL, 0 };[m
[31m-     *     conf->body_lengths = NULL;[m
[31m-     *     conf->body_values = NULL;[m
[31m-     *     conf->body_source = { 0, NULL };[m
[31m-     *     conf->redirects = NULL;[m
[31m-     *     conf->ssl = 0;[m
[31m-     *     conf->ssl_protocols = 0;[m
[31m-     *     conf->ssl_ciphers = { 0, NULL };[m
[31m-     *     conf->ssl_trusted_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_crl = { 0, NULL };[m
[31m-     *     conf->ssl_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_certificate_key = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_convert_head = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_server_name = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_verify = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->ssl_passwords = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    /* "proxy_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->redirect = NGX_CONF_UNSET;[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    conf->cookie_domains = NGX_CONF_UNSET_PTR;[m
[31m-    conf->cookie_paths = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->http_version = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->headers_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    conf->headers_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "proxy");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *prev = parent;[m
[31m-    ngx_http_proxy_loc_conf_t *conf = child;[m
[31m-[m
[31m-    u_char                     *p;[m
[31m-    size_t                      size;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_hash_init_t             hash;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_proxy_rewrite_t   *pr;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store,[m
[31m-                              prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"proxy_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-                                         conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_busy_buffers_size\" must be equal to or greater than "[m
[31m-             "the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_busy_buffers_size\" must be less than "[m
[31m-             "the size of all \"proxy_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-                                      conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_temp_file_write_size\" must be equal to or greater "[m
[31m-             "than the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-                                        conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-             "\"proxy_max_temp_file_size\" must be equal to zero to disable "[m
[31m-             "temporary files usage or must be equal to or greater than "[m
[31m-             "the maximum of the value of \"proxy_buffer_size\" and "[m
[31m-             "one of the \"proxy_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                              prev->upstream.ignore_headers,[m
[31m-                              NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                              prev->upstream.next_upstream,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                              prev->upstream.temp_path,[m
[31m-                              &ngx_http_proxy_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"proxy_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_convert_head,[m
[31m-                              prev->upstream.cache_convert_head, 1);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->method, prev->method, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                              prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                              prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                              prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_session_reuse,[m
[31m-                              prev->upstream.ssl_session_reuse, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                                  |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,[m
[31m-                             "DEFAULT");[m
[31m-[m
[31m-    if (conf->upstream.ssl_name == NULL) {[m
[31m-        conf->upstream.ssl_name = prev->upstream.ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_server_name,[m
[31m-                              prev->upstream.ssl_server_name, 0);[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_verify,[m
[31m-                              prev->upstream.ssl_verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                              prev->ssl_trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate,[m
[31m-                              prev->ssl_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate_key,[m
[31m-                              prev->ssl_certificate_key, "");[m
[31m-    ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);[m
[31m-[m
[31m-    if (conf->ssl && ngx_http_proxy_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->redirect, prev->redirect, 1);[m
[31m-[m
[31m-    if (conf->redirect) {[m
[31m-[m
[31m-        if (conf->redirects == NULL) {[m
[31m-            conf->redirects = prev->redirects;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->redirects == NULL && conf->url.data) {[m
[31m-[m
[31m-            conf->redirects = ngx_array_create(cf->pool, 1,[m
[31m-                                             sizeof(ngx_http_proxy_rewrite_t));[m
[31m-            if (conf->redirects == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pr = ngx_array_push(conf->redirects);[m
[31m-            if (pr == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(&pr->pattern.complex,[m
[31m-                        sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-            ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-            pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-[m
[31m-            if (conf->vars.uri.len) {[m
[31m-                pr->pattern.complex.value = conf->url;[m
[31m-                pr->replacement.value = conf->location;[m
[31m-[m
[31m-            } else {[m
[31m-                pr->pattern.complex.value.len = conf->url.len[m
[31m-                                                + sizeof("/") - 1;[m
[31m-[m
[31m-                p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);[m
[31m-                if (p == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                pr->pattern.complex.value.data = p;[m
[31m-[m
[31m-                p = ngx_cpymem(p, conf->url.data, conf->url.len);[m
[31m-                *p = '/';[m
[31m-[m
[31m-                ngx_str_set(&pr->replacement.value, "/");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->cookie_domains, prev->cookie_domains, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->cookie_paths, prev->cookie_paths, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->http_version, prev->http_version,[m
[31m-                              NGX_HTTP_VERSION_10);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->headers_hash_max_size,[m
[31m-                              prev->headers_hash_max_size, 512);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->headers_hash_bucket_size,[m
[31m-                              prev->headers_hash_bucket_size, 64);[m
[31m-[m
[31m-    conf->headers_hash_bucket_size = ngx_align(conf->headers_hash_bucket_size,[m
[31m-                                               ngx_cacheline_size);[m
[31m-[m
[31m-    hash.max_size = conf->headers_hash_max_size;[m
[31m-    hash.bucket_size = conf->headers_hash_bucket_size;[m
[31m-    hash.name = "proxy_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_proxy_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->proxy_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->location = prev->location;[m
[31m-        conf->vars = prev->vars;[m
[31m-[m
[31m-        conf->proxy_lengths = prev->proxy_lengths;[m
[31m-        conf->proxy_values = prev->proxy_values;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        conf->upstream.ssl = prev->upstream.ssl;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->proxy_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_proxy_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_source.data == NULL) {[m
[31m-        conf->body_flushes = prev->body_flushes;[m
[31m-        conf->body_source = prev->body_source;[m
[31m-        conf->body_lengths = prev->body_lengths;[m
[31m-        conf->body_values = prev->body_values;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_source.data && conf->body_lengths == NULL) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &conf->body_source;[m
[31m-        sc.flushes = &conf->body_flushes;[m
[31m-        sc.lengths = &conf->body_lengths;[m
[31m-        sc.values = &conf->body_values;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers_source == NULL) {[m
[31m-        conf->headers = prev->headers;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->headers_cache = prev->headers_cache;[m
[31m-#endif[m
[31m-        conf->headers_source = prev->headers_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers,[m
[31m-                                     ngx_http_proxy_headers);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers_cache,[m
[31m-                                         ngx_http_proxy_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_init_headers(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf,[m
[31m-    ngx_http_proxy_headers_t *headers, ngx_keyval_t *default_headers)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_array_t                   headers_names, headers_merged;[m
[31m-    ngx_keyval_t                 *src, *s, *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (headers->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers_source == NULL) {[m
[31m-        conf->headers_source = ngx_array_create(cf->pool, 4,[m
[31m-                                                sizeof(ngx_keyval_t));[m
[31m-        if (conf->headers_source == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    headers->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (headers->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    headers->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (headers->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    src = conf->headers_source->elts;[m
[31m-    for (i = 0; i < conf->headers_source->nelts; i++) {[m
[31m-[m
[31m-        s = ngx_array_push(&headers_merged);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = src[i];[m
[31m-    }[m
[31m-[m
[31m-    h = default_headers;[m
[31m-[m
[31m-    while (h->key.len) {[m
[31m-[m
[31m-        src = headers_merged.elts;[m
[31m-        for (i = 0; i < headers_merged.nelts; i++) {[m
[31m-            if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        s = ngx_array_push(&headers_merged);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = *h;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        h++;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    src = headers_merged.elts;[m
[31m-    for (i = 0; i < headers_merged.nelts; i++) {[m
[31m-[m
[31m-        hk = ngx_array_push(&headers_names);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = src[i].key;[m
[31m-        hk->key_hash = ngx_hash_key_lc(src[i].key.data, src[i].key.len);[m
[31m-        hk->value = (void *) 1;[m
[31m-[m
[31m-        if (src[i].value.len == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_script_variables_count(&src[i].value) == 0) {[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1[m
[31m-                        + src[i].value.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                       + src[i].key.len + sizeof(": ") - 1[m
[31m-                       + src[i].value.len + sizeof(CRLF) - 1[m
[31m-                       + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1[m
[31m-                        + src[i].value.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-[m
[31m-            p = ngx_cpymem(p, src[i].key.data, src[i].key.len);[m
[31m-            *p++ = ':'; *p++ = ' ';[m
[31m-            p = ngx_cpymem(p, src[i].value.data, src[i].value.len);[m
[31m-            *p++ = CR; *p = LF;[m
[31m-[m
[31m-        } else {[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                    + src[i].key.len + sizeof(": ") - 1 + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = src[i].key.len + sizeof(": ") - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-            p = ngx_cpymem(p, src[i].key.data, src[i].key.len);[m
[31m-            *p++ = ':'; *p = ' ';[m
[31m-[m
[31m-[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &src[i].value;[m
[31m-            sc.flushes = &headers->flushes;[m
[31m-            sc.lengths = &headers->lengths;[m
[31m-            sc.values = &headers->values;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t));[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = (ngx_http_script_code_pt)[m
[31m-                                                 ngx_http_script_copy_len_code;[m
[31m-            copy->len = sizeof(CRLF) - 1;[m
[31m-[m
[31m-[m
[31m-            size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                    + sizeof(CRLF) - 1 + sizeof(uintptr_t) - 1)[m
[31m-                    & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-            copy = ngx_array_push_n(headers->values, size);[m
[31m-            if (copy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            copy->code = ngx_http_script_copy_code;[m
[31m-            copy->len = sizeof(CRLF) - 1;[m
[31m-[m
[31m-            p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-            *p++ = CR; *p = LF;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-        code = ngx_array_push_n(headers->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-    hash.hash = &headers->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = conf->headers_hash_max_size;[m
[31m-    hash.bucket_size = conf->headers_hash_bucket_size;[m
[31m-    hash.name = "proxy_headers_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    size_t                      add;[m
[31m-    u_short                     port;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (plcf->upstream.upstream || plcf->proxy_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_http_proxy_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &plcf->proxy_lengths;[m
[31m-        sc.values = &plcf->proxy_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        plcf->ssl = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncasecmp(url->data, (u_char *) "http://", 7) == 0) {[m
[31m-        add = 7;[m
[31m-        port = 80;[m
[31m-[m
[31m-    } else if (ngx_strncasecmp(url->data, (u_char *) "https://", 8) == 0) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        plcf->ssl = 1;[m
[31m-[m
[31m-        add = 8;[m
[31m-        port = 443;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "https protocol requires SSL support");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid URL prefix");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url.len = url->len - add;[m
[31m-    u.url.data = url->data + add;[m
[31m-    u.default_port = port;[m
[31m-    u.uri_part = 1;[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    plcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (plcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    plcf->vars.schema.len = add;[m
[31m-    plcf->vars.schema.data = url->data;[m
[31m-    plcf->vars.key_start = plcf->vars.schema;[m
[31m-[m
[31m-    ngx_http_proxy_set_vars(&u, &plcf->vars);[m
[31m-[m
[31m-    plcf->location = clcf->name;[m
[31m-[m
[31m-    if (clcf->named[m
[31m-#if (NGX_PCRE)[m
[31m-        || clcf->regex[m
[31m-#endif[m
[31m-        || clcf->noname)[m
[31m-    {[m
[31m-        if (plcf->vars.uri.len) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_pass\" cannot have URI part in "[m
[31m-                               "location given by regular expression, "[m
[31m-                               "or inside named location, "[m
[31m-                               "or inside \"if\" statement, "[m
[31m-                               "or inside \"limit_except\" block");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        plcf->location.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    plcf->url = *url;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->redirect == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    plcf->redirect = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->redirect = 0;[m
[31m-            plcf->redirects = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "false") == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid parameter \"false\", use \"off\" instead");[m
[31m-            plcf->redirect = 0;[m
[31m-            plcf->redirects = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "default") != 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->redirects == NULL) {[m
[31m-        plcf->redirects = ngx_array_create(cf->pool, 1,[m
[31m-                                           sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->redirects == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->redirects);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "default") == 0) {[m
[31m-        if (plcf->proxy_lengths) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_redirect default\" cannot be used "[m
[31m-                               "with \"proxy_pass\" directive with variables");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (plcf->url.data == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"proxy_redirect default\" should be placed "[m
[31m-                               "after the \"proxy_pass\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-[m
[31m-        ngx_memzero(&pr->pattern.complex, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t));[m
[31m-[m
[31m-        if (plcf->vars.uri.len) {[m
[31m-            pr->pattern.complex.value = plcf->url;[m
[31m-            pr->replacement.value = plcf->location;[m
[31m-[m
[31m-        } else {[m
[31m-            pr->pattern.complex.value.len = plcf->url.len + sizeof("/") - 1;[m
[31m-[m
[31m-            p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pr->pattern.complex.value.data = p;[m
[31m-[m
[31m-            p = ngx_cpymem(p, plcf->url.data, plcf->url.len);[m
[31m-            *p = '/';[m
[31m-[m
[31m-            ngx_str_set(&pr->replacement.value, "/");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (value[1].data[0] == '*') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->cookie_domains == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->cookie_domains = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_domains == NGX_CONF_UNSET_PTR) {[m
[31m-        plcf->cookie_domains = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->cookie_domains == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->cookie_domains);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (value[1].data[0] == '.') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_domain_handler;[m
[31m-[m
[31m-        if (value[2].data[0] == '.') {[m
[31m-            value[2].len--;[m
[31m-            value[2].data++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_proxy_rewrite_t          *pr;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (plcf->cookie_paths == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-            plcf->cookie_paths = NULL;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->cookie_paths == NGX_CONF_UNSET_PTR) {[m
[31m-        plcf->cookie_paths = ngx_array_create(cf->pool, 1,[m
[31m-                                     sizeof(ngx_http_proxy_rewrite_t));[m
[31m-        if (plcf->cookie_paths == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_array_push(plcf->cookie_paths);[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] == '~') {[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-[m
[31m-        if (value[1].data[0] == '*') {[m
[31m-            value[1].len--;[m
[31m-            value[1].data++;[m
[31m-[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &pr->pattern.complex;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pr->handler = ngx_http_proxy_rewrite_complex_handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pr->replacement;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_rewrite_regex(ngx_conf_t *cf, ngx_http_proxy_rewrite_t *pr,[m
[31m-    ngx_str_t *regex, ngx_uint_t caseless)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    u_char               errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    ngx_regex_compile_t  rc;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *regex;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    if (caseless) {[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-    }[m
[31m-[m
[31m-    pr->pattern.regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (pr->pattern.regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->handler = ngx_http_proxy_rewrite_regex_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "using regex \"%V\" requires PCRE library", regex);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (plcf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        plcf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (plcf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"proxy_cache\"";[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    plcf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &plcf->upstream.store_lengths;[m
[31m-    sc.values = &plcf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        plcf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"proxy_store\"";[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        plcf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (plcf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *plcf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                      &ngx_http_proxy_module);[m
[31m-    if (plcf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &plcf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_proxy_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (plcf->ssl_passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    plcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (plcf->ssl_passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"proxy_send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"proxy_send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_proxy_set_ssl(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *plcf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    plcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (plcf->upstream.ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    plcf->upstream.ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(plcf->upstream.ssl, plcf->ssl_protocols, NULL)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = plcf->upstream.ssl;[m
[31m-[m
[31m-    if (plcf->ssl_certificate.len) {[m
[31m-[m
[31m-        if (plcf->ssl_certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"proxy_ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &plcf->ssl_certificate);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_certificate(cf, plcf->upstream.ssl, &plcf->ssl_certificate,[m
[31m-                                &plcf->ssl_certificate_key, plcf->ssl_passwords)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(plcf->upstream.ssl->ctx,[m
[31m-                                (const char *) plcf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &plcf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->upstream.ssl_verify) {[m
[31m-        if (plcf->ssl_trusted_certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no proxy_ssl_trusted_certificate for proxy_ssl_verify");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, plcf->upstream.ssl,[m
[31m-                                        &plcf->ssl_trusted_certificate,[m
[31m-                                        plcf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, plcf->upstream.ssl, &plcf->ssl_crl) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v)[m
[31m-{[m
[31m-    if (u->family != AF_UNIX) {[m
[31m-[m
[31m-        if (u->no_port || u->port == u->default_port) {[m
[31m-[m
[31m-            v->host_header = u->host;[m
[31m-[m
[31m-            if (u->default_port == 80) {[m
[31m-                ngx_str_set(&v->port, "80");[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_str_set(&v->port, "443");[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            v->host_header.len = u->host.len + 1 + u->port_text.len;[m
[31m-            v->host_header.data = u->host.data;[m
[31m-            v->port = u->port_text;[m
[31m-        }[m
[31m-[m
[31m-        v->key_start.len += v->host_header.len;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&v->host_header, "localhost");[m
[31m-        ngx_str_null(&v->port);[m
[31m-        v->key_start.len += sizeof("unix:") - 1 + u->host.len + 1;[m
[31m-    }[m
[31m-[m
[31m-    v->uri = u->uri;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_random_index_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_random_index_module.c[m
[1mdeleted file mode 100644[m
[1mindex b47ee4f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_random_index_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,317 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t  enable;[m
[31m-} ngx_http_random_index_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_RANDOM_INDEX_PREALLOCATE  50[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_random_index_error(ngx_http_request_t *r,[m
[31m-    ngx_dir_t *dir, ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_random_index_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_random_index_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_random_index_commands[] = {[m
[31m-[m
[31m-    { ngx_string("random_index"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_random_index_loc_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_random_index_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_random_index_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_random_index_create_loc_conf, /* create location configuration */[m
[31m-    ngx_http_random_index_merge_loc_conf   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_random_index_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_random_index_module_ctx,     /* module context */[m
[31m-    ngx_http_random_index_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_random_index_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                            *last, *filename;[m
[31m-    size_t                             len, allocated, root;[m
[31m-    ngx_err_t                          err;[m
[31m-    ngx_int_t                          rc;[m
[31m-    ngx_str_t                          path, uri, *name;[m
[31m-    ngx_dir_t                          dir;[m
[31m-    ngx_uint_t                         n, level;[m
[31m-    ngx_array_t                        names;[m
[31m-    ngx_http_random_index_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] != '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_random_index_module);[m
[31m-[m
[31m-    if (!rlcf->enable) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_D_TYPE)[m
[31m-    len = NGX_DIR_MASK_LEN;[m
[31m-#else[m
[31m-    len = NGX_HTTP_RANDOM_INDEX_PREALLOCATE;[m
[31m-#endif[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root, len);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    allocated = path.len;[m
[31m-[m
[31m-    path.len = last - path.data - 1;[m
[31m-    path.data[path.len] = '\0';[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http random index: \"%s\"", path.data);[m
[31m-[m
[31m-    if (ngx_open_dir(&path, &dir) == NGX_ERROR) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT[m
[31m-            || err == NGX_ENOTDIR[m
[31m-            || err == NGX_ENAMETOOLONG)[m
[31m-        {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-[m
[31m-        } else if (err == NGX_EACCES) {[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-[m
[31m-        } else {[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(level, r->connection->log, err,[m
[31m-                      ngx_open_dir_n " \"%s\" failed", path.data);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&names, r->pool, 32, sizeof(ngx_str_t)) != NGX_OK) {[m
[31m-        return ngx_http_random_index_error(r, &dir, &path);[m
[31m-    }[m
[31m-[m
[31m-    filename = path.data;[m
[31m-    filename[path.len] = '/';[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_set_errno(0);[m
[31m-[m
[31m-        if (ngx_read_dir(&dir) == NGX_ERROR) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err != NGX_ENOMOREFILES) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                              ngx_read_dir_n " \"%V\" failed", &path);[m
[31m-                return ngx_http_random_index_error(r, &dir, &path);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http random index file: \"%s\"", ngx_de_name(&dir));[m
[31m-[m
[31m-        if (ngx_de_name(&dir)[0] == '.') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len = ngx_de_namelen(&dir);[m
[31m-[m
[31m-        if (dir.type == 0 || ngx_de_is_link(&dir)) {[m
[31m-[m
[31m-            /* 1 byte for '/' and 1 byte for terminating '\0' */[m
[31m-[m
[31m-            if (path.len + 1 + len + 1 > allocated) {[m
[31m-                allocated = path.len + 1 + len + 1[m
[31m-                                     + NGX_HTTP_RANDOM_INDEX_PREALLOCATE;[m
[31m-[m
[31m-                filename = ngx_pnalloc(r->pool, allocated);[m
[31m-                if (filename == NULL) {[m
[31m-                    return ngx_http_random_index_error(r, &dir, &path);[m
[31m-                }[m
[31m-[m
[31m-                last = ngx_cpystrn(filename, path.data, path.len + 1);[m
[31m-                *last++ = '/';[m
[31m-            }[m
[31m-[m
[31m-            ngx_cpystrn(last, ngx_de_name(&dir), len + 1);[m
[31m-[m
[31m-            if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                if (err != NGX_ENOENT) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                                  ngx_de_info_n " \"%s\" failed", filename);[m
[31m-                    return ngx_http_random_index_error(r, &dir, &path);[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                                  ngx_de_link_info_n " \"%s\" failed",[m
[31m-                                  filename);[m
[31m-                    return ngx_http_random_index_error(r, &dir, &path);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!ngx_de_is_file(&dir)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        name = ngx_array_push(&names);[m
[31m-        if (name == NULL) {[m
[31m-            return ngx_http_random_index_error(r, &dir, &path);[m
[31m-        }[m
[31m-[m
[31m-        name->len = len;[m
[31m-[m
[31m-        name->data = ngx_pnalloc(r->pool, len);[m
[31m-        if (name->data == NULL) {[m
[31m-            return ngx_http_random_index_error(r, &dir, &path);[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(name->data, ngx_de_name(&dir), len);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_dir(&dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%V\" failed", &path);[m
[31m-    }[m
[31m-[m
[31m-    n = names.nelts;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    name = names.elts;[m
[31m-[m
[31m-    n = (ngx_uint_t) (((uint64_t) ngx_random() * n) / 0x80000000);[m
[31m-[m
[31m-    uri.len = r->uri.len + name[n].len;[m
[31m-[m
[31m-    uri.data = ngx_pnalloc(r->pool, uri.len);[m
[31m-    if (uri.data == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_copy(uri.data, r->uri.data, r->uri.len);[m
[31m-    ngx_memcpy(last, name[n].data, name[n].len);[m
[31m-[m
[31m-    return ngx_http_internal_redirect(r, &uri, &r->args);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_random_index_error(ngx_http_request_t *r, ngx_dir_t *dir,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    if (ngx_close_dir(dir) == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_dir_n " \"%V\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_random_index_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_random_index_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_random_index_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_random_index_loc_conf_t *prev = parent;[m
[31m-    ngx_http_random_index_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_random_index_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_random_index_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_range_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_range_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 57065e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_range_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,919 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * the single part format:[m
[31m- *[m
[31m- * "HTTP/1.0 206 Partial Content" CRLF[m
[31m- * ... header ...[m
[31m- * "Content-Type: image/jpeg" CRLF[m
[31m- * "Content-Length: SIZE" CRLF[m
[31m- * "Content-Range: bytes START-END/SIZE" CRLF[m
[31m- * CRLF[m
[31m- * ... data ...[m
[31m- *[m
[31m- *[m
[31m- * the multipart format:[m
[31m- *[m
[31m- * "HTTP/1.0 206 Partial Content" CRLF[m
[31m- * ... header ...[m
[31m- * "Content-Type: multipart/byteranges; boundary=0123456789" CRLF[m
[31m- * CRLF[m
[31m- * CRLF[m
[31m- * "--0123456789" CRLF[m
[31m- * "Content-Type: image/jpeg" CRLF[m
[31m- * "Content-Range: bytes START0-END0/SIZE" CRLF[m
[31m- * CRLF[m
[31m- * ... data ...[m
[31m- * CRLF[m
[31m- * "--0123456789" CRLF[m
[31m- * "Content-Type: image/jpeg" CRLF[m
[31m- * "Content-Range: bytes START1-END1/SIZE" CRLF[m
[31m- * CRLF[m
[31m- * ... data ...[m
[31m- * CRLF[m
[31m- * "--0123456789--" CRLF[m
[31m- */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t        start;[m
[31m-    off_t        end;[m
[31m-    ngx_str_t    content_range;[m
[31m-} ngx_http_range_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t        offset;[m
[31m-    ngx_str_t    boundary_header;[m
[31m-    ngx_array_t  ranges;[m
[31m-} ngx_http_range_filter_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_range_parse(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_uint_t ranges);[m
[31m-static ngx_int_t ngx_http_range_singlepart_header(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_range_multipart_header(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_range_not_satisfiable(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_range_test_overlapped(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_range_singlepart_body(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_range_multipart_body(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in);[m
[31m-[m
[31m-static ngx_int_t ngx_http_range_header_filter_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_range_body_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_range_header_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_range_header_filter_init,     /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_range_header_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_range_header_filter_module_ctx, /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_range_body_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_range_body_filter_init,       /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_range_body_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_range_body_filter_module_ctx, /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                        if_range_time;[m
[31m-    ngx_str_t                    *if_range, *etag;[m
[31m-    ngx_uint_t                    ranges;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_range_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10[m
[31m-        || r->headers_out.status != NGX_HTTP_OK[m
[31m-        || (r != r->main && !r->subrequest_ranges)[m
[31m-        || r->headers_out.content_length_n == -1[m
[31m-        || !r->allow_ranges)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->max_ranges == 0) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.range == NULL[m
[31m-        || r->headers_in.range->value.len < 7[m
[31m-        || ngx_strncasecmp(r->headers_in.range->value.data,[m
[31m-                           (u_char *) "bytes=", 6)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        goto next_filter;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.if_range) {[m
[31m-[m
[31m-        if_range = &r->headers_in.if_range->value;[m
[31m-[m
[31m-        if (if_range->len >= 2 && if_range->data[if_range->len - 1] == '"') {[m
[31m-[m
[31m-            if (r->headers_out.etag == NULL) {[m
[31m-                goto next_filter;[m
[31m-            }[m
[31m-[m
[31m-            etag = &r->headers_out.etag->value;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http ir:%V etag:%V", if_range, etag);[m
[31m-[m
[31m-            if (if_range->len != etag->len[m
[31m-                || ngx_strncmp(if_range->data, etag->data, etag->len) != 0)[m
[31m-            {[m
[31m-                goto next_filter;[m
[31m-            }[m
[31m-[m
[31m-            goto parse;[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_out.last_modified_time == (time_t) -1) {[m
[31m-            goto next_filter;[m
[31m-        }[m
[31m-[m
[31m-        if_range_time = ngx_parse_http_time(if_range->data, if_range->len);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http ir:%T lm:%T",[m
[31m-                       if_range_time, r->headers_out.last_modified_time);[m
[31m-[m
[31m-        if (if_range_time != r->headers_out.last_modified_time) {[m
[31m-            goto next_filter;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-parse:[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->offset = r->headers_out.content_offset;[m
[31m-[m
[31m-    if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_range_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ranges = r->single_range ? 1 : clcf->max_ranges;[m
[31m-[m
[31m-    switch (ngx_http_range_parse(r, ctx, ranges)) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module);[m
[31m-[m
[31m-        r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT;[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-[m
[31m-        if (ctx->ranges.nelts == 1) {[m
[31m-            return ngx_http_range_singlepart_header(r, ctx);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_range_multipart_header(r, ctx);[m
[31m-[m
[31m-    case NGX_HTTP_RANGE_NOT_SATISFIABLE:[m
[31m-        return ngx_http_range_not_satisfiable(r);[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    default: /* NGX_DECLINED */[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-next_filter:[m
[31m-[m
[31m-    r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (r->headers_out.accept_ranges == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.accept_ranges->hash = 1;[m
[31m-    ngx_str_set(&r->headers_out.accept_ranges->key, "Accept-Ranges");[m
[31m-    ngx_str_set(&r->headers_out.accept_ranges->value, "bytes");[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_parse(ngx_http_request_t *r, ngx_http_range_filter_ctx_t *ctx,[m
[31m-    ngx_uint_t ranges)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    off_t                         start, end, size, content_length, cutoff,[m
[31m-                                  cutlim;[m
[31m-    ngx_uint_t                    suffix;[m
[31m-    ngx_http_range_t             *range;[m
[31m-    ngx_http_range_filter_ctx_t  *mctx;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        mctx = ngx_http_get_module_ctx(r->main,[m
[31m-                                       ngx_http_range_body_filter_module);[m
[31m-        if (mctx) {[m
[31m-            ctx->ranges = mctx->ranges;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = r->headers_in.range->value.data + 6;[m
[31m-    size = 0;[m
[31m-    content_length = r->headers_out.content_length_n;[m
[31m-[m
[31m-    cutoff = NGX_MAX_OFF_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_OFF_T_VALUE % 10;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        start = 0;[m
[31m-        end = 0;[m
[31m-        suffix = 0;[m
[31m-[m
[31m-        while (*p == ' ') { p++; }[m
[31m-[m
[31m-        if (*p != '-') {[m
[31m-            if (*p < '0' || *p > '9') {[m
[31m-                return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-            }[m
[31m-[m
[31m-            while (*p >= '0' && *p <= '9') {[m
[31m-                if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {[m
[31m-                    return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-                }[m
[31m-[m
[31m-                start = start * 10 + *p++ - '0';[m
[31m-            }[m
[31m-[m
[31m-            while (*p == ' ') { p++; }[m
[31m-[m
[31m-            if (*p++ != '-') {[m
[31m-                return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-            }[m
[31m-[m
[31m-            while (*p == ' ') { p++; }[m
[31m-[m
[31m-            if (*p == ',' || *p == '\0') {[m
[31m-                end = content_length;[m
[31m-                goto found;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            suffix = 1;[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-        }[m
[31m-[m
[31m-        while (*p >= '0' && *p <= '9') {[m
[31m-            if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) {[m
[31m-                return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-            }[m
[31m-[m
[31m-            end = end * 10 + *p++ - '0';[m
[31m-        }[m
[31m-[m
[31m-        while (*p == ' ') { p++; }[m
[31m-[m
[31m-        if (*p != ',' && *p != '\0') {[m
[31m-            return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-        }[m
[31m-[m
[31m-        if (suffix) {[m
[31m-            start = content_length - end;[m
[31m-            end = content_length - 1;[m
[31m-        }[m
[31m-[m
[31m-        if (end >= content_length) {[m
[31m-            end = content_length;[m
[31m-[m
[31m-        } else {[m
[31m-            end++;[m
[31m-        }[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        if (start < end) {[m
[31m-            range = ngx_array_push(&ctx->ranges);[m
[31m-            if (range == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            range->start = start;[m
[31m-            range->end = end;[m
[31m-[m
[31m-            size += end - start;[m
[31m-[m
[31m-            if (ranges-- == 0) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (*p++ != ',') {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ranges.nelts == 0) {[m
[31m-        return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-    }[m
[31m-[m
[31m-    if (size > content_length) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_singlepart_header(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_table_elt_t   *content_range;[m
[31m-    ngx_http_range_t  *range;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    content_range = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (content_range == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_range = content_range;[m
[31m-[m
[31m-    content_range->hash = 1;[m
[31m-    ngx_str_set(&content_range->key, "Content-Range");[m
[31m-[m
[31m-    content_range->value.data = ngx_pnalloc(r->pool,[m
[31m-                                    sizeof("bytes -/") - 1 + 3 * NGX_OFF_T_LEN);[m
[31m-    if (content_range->value.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* "Content-Range: bytes SSSS-EEEE/TTTT" header */[m
[31m-[m
[31m-    range = ctx->ranges.elts;[m
[31m-[m
[31m-    content_range->value.len = ngx_sprintf(content_range->value.data,[m
[31m-                                           "bytes %O-%O/%O",[m
[31m-                                           range->start, range->end - 1,[m
[31m-                                           r->headers_out.content_length_n)[m
[31m-                               - content_range->value.data;[m
[31m-[m
[31m-    r->headers_out.content_length_n = range->end - range->start;[m
[31m-    r->headers_out.content_offset = range->start;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_multipart_header(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    size_t              len;[m
[31m-    ngx_uint_t          i;[m
[31m-    ngx_http_range_t   *range;[m
[31m-    ngx_atomic_uint_t   boundary;[m
[31m-[m
[31m-    len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN[m
[31m-          + sizeof(CRLF "Content-Type: ") - 1[m
[31m-          + r->headers_out.content_type.len[m
[31m-          + sizeof(CRLF "Content-Range: bytes ") - 1;[m
[31m-[m
[31m-    if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-        && r->headers_out.charset.len)[m
[31m-    {[m
[31m-        len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-    }[m
[31m-[m
[31m-    ctx->boundary_header.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (ctx->boundary_header.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    boundary = ngx_next_temp_number(0);[m
[31m-[m
[31m-    /*[m
[31m-     * The boundary header of the range:[m
[31m-     * CRLF[m
[31m-     * "--0123456789" CRLF[m
[31m-     * "Content-Type: image/jpeg" CRLF[m
[31m-     * "Content-Range: bytes "[m
[31m-     */[m
[31m-[m
[31m-    if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-        && r->headers_out.charset.len)[m
[31m-    {[m
[31m-        ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,[m
[31m-                                           CRLF "--%0muA" CRLF[m
[31m-                                           "Content-Type: %V; charset=%V" CRLF[m
[31m-                                           "Content-Range: bytes ",[m
[31m-                                           boundary,[m
[31m-                                           &r->headers_out.content_type,[m
[31m-                                           &r->headers_out.charset)[m
[31m-                                   - ctx->boundary_header.data;[m
[31m-[m
[31m-    } else if (r->headers_out.content_type.len) {[m
[31m-        ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,[m
[31m-                                           CRLF "--%0muA" CRLF[m
[31m-                                           "Content-Type: %V" CRLF[m
[31m-                                           "Content-Range: bytes ",[m
[31m-                                           boundary,[m
[31m-                                           &r->headers_out.content_type)[m
[31m-                                   - ctx->boundary_header.data;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,[m
[31m-                                           CRLF "--%0muA" CRLF[m
[31m-                                           "Content-Range: bytes ",[m
[31m-                                           boundary)[m
[31m-                                   - ctx->boundary_header.data;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type.data =[m
[31m-        ngx_pnalloc(r->pool,[m
[31m-                    sizeof("Content-Type: multipart/byteranges; boundary=") - 1[m
[31m-                    + NGX_ATOMIC_T_LEN);[m
[31m-[m
[31m-    if (r->headers_out.content_type.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    /* "Content-Type: multipart/byteranges; boundary=0123456789" */[m
[31m-[m
[31m-    r->headers_out.content_type.len =[m
[31m-                           ngx_sprintf(r->headers_out.content_type.data,[m
[31m-                                       "multipart/byteranges; boundary=%0muA",[m
[31m-                                       boundary)[m
[31m-                           - r->headers_out.content_type.data;[m
[31m-[m
[31m-    r->headers_out.content_type_len = r->headers_out.content_type.len;[m
[31m-[m
[31m-    r->headers_out.charset.len = 0;[m
[31m-[m
[31m-    /* the size of the last boundary CRLF "--0123456789--" CRLF */[m
[31m-[m
[31m-    len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN + sizeof("--" CRLF) - 1;[m
[31m-[m
[31m-    range = ctx->ranges.elts;[m
[31m-    for (i = 0; i < ctx->ranges.nelts; i++) {[m
[31m-[m
[31m-        /* the size of the range: "SSSS-EEEE/TTTT" CRLF CRLF */[m
[31m-[m
[31m-        range[i].content_range.data =[m
[31m-                               ngx_pnalloc(r->pool, 3 * NGX_OFF_T_LEN + 2 + 4);[m
[31m-[m
[31m-        if (range[i].content_range.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        range[i].content_range.len = ngx_sprintf(range[i].content_range.data,[m
[31m-                                               "%O-%O/%O" CRLF CRLF,[m
[31m-                                               range[i].start, range[i].end - 1,[m
[31m-                                               r->headers_out.content_length_n)[m
[31m-                                     - range[i].content_range.data;[m
[31m-[m
[31m-        len += ctx->boundary_header.len + range[i].content_range.len[m
[31m-                                    + (size_t) (range[i].end - range[i].start);[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = len;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_not_satisfiable(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t  *content_range;[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-[m
[31m-    content_range = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (content_range == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_range = content_range;[m
[31m-[m
[31m-    content_range->hash = 1;[m
[31m-    ngx_str_set(&content_range->key, "Content-Range");[m
[31m-[m
[31m-    content_range->value.data = ngx_pnalloc(r->pool,[m
[31m-                                       sizeof("bytes */") - 1 + NGX_OFF_T_LEN);[m
[31m-    if (content_range->value.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    content_range->value.len = ngx_sprintf(content_range->value.data,[m
[31m-                                           "bytes */%O",[m
[31m-                                           r->headers_out.content_length_n)[m
[31m-                               - content_range->value.data;[m
[31m-[m
[31m-    ngx_http_clear_content_length(r);[m
[31m-[m
[31m-    return NGX_HTTP_RANGE_NOT_SATISFIABLE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_range_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_range_body_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ranges.nelts == 1) {[m
[31m-        return ngx_http_range_singlepart_body(r, ctx, in);[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * multipart ranges are supported only if whole body is in a single buffer[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_buf_special(in->buf)) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_range_test_overlapped(r, ctx, in) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_range_multipart_body(r, ctx, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_test_overlapped(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    off_t              start, last;[m
[31m-    ngx_buf_t         *buf;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_http_range_t  *range;[m
[31m-[m
[31m-    if (ctx->offset) {[m
[31m-        goto overlapped;[m
[31m-    }[m
[31m-[m
[31m-    buf = in->buf;[m
[31m-[m
[31m-    if (!buf->last_buf) {[m
[31m-        start = ctx->offset;[m
[31m-        last = ctx->offset + ngx_buf_size(buf);[m
[31m-[m
[31m-        range = ctx->ranges.elts;[m
[31m-        for (i = 0; i < ctx->ranges.nelts; i++) {[m
[31m-            if (start > range[i].start || last < range[i].end) {[m
[31m-                goto overlapped;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->offset = ngx_buf_size(buf);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-overlapped:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                  "range in overlapped buffers");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_singlepart_body(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    off_t              start, last;[m
[31m-    ngx_buf_t         *buf;[m
[31m-    ngx_chain_t       *out, *cl, **ll;[m
[31m-    ngx_http_range_t  *range;[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-    range = ctx->ranges.elts;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        buf = cl->buf;[m
[31m-[m
[31m-        start = ctx->offset;[m
[31m-        last = ctx->offset + ngx_buf_size(buf);[m
[31m-[m
[31m-        ctx->offset = last;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http range body buf: %O-%O", start, last);[m
[31m-[m
[31m-        if (ngx_buf_special(buf)) {[m
[31m-            *ll = cl;[m
[31m-            ll = &cl->next;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (range->end <= start || range->start >= last) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http range body skip");[m
[31m-[m
[31m-            if (buf->in_file) {[m
[31m-                buf->file_pos = buf->file_last;[m
[31m-            }[m
[31m-[m
[31m-            buf->pos = buf->last;[m
[31m-            buf->sync = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (range->start > start) {[m
[31m-[m
[31m-            if (buf->in_file) {[m
[31m-                buf->file_pos += range->start - start;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_in_memory(buf)) {[m
[31m-                buf->pos += (size_t) (range->start - start);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (range->end <= last) {[m
[31m-[m
[31m-            if (buf->in_file) {[m
[31m-                buf->file_last -= last - range->end;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_in_memory(buf)) {[m
[31m-                buf->last -= (size_t) (last - range->end);[m
[31m-            }[m
[31m-[m
[31m-            buf->last_buf = 1;[m
[31m-            *ll = cl;[m
[31m-            cl->next = NULL;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_multipart_body(ngx_http_request_t *r,[m
[31m-    ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_buf_t         *b, *buf;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_chain_t       *out, *hcl, *rcl, *dcl, **ll;[m
[31m-    ngx_http_range_t  *range;[m
[31m-[m
[31m-    ll = &out;[m
[31m-    buf = in->buf;[m
[31m-    range = ctx->ranges.elts;[m
[31m-[m
[31m-    for (i = 0; i < ctx->ranges.nelts; i++) {[m
[31m-[m
[31m-        /*[m
[31m-         * The boundary header of the range:[m
[31m-         * CRLF[m
[31m-         * "--0123456789" CRLF[m
[31m-         * "Content-Type: image/jpeg" CRLF[m
[31m-         * "Content-Range: bytes "[m
[31m-         */[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->memory = 1;[m
[31m-        b->pos = ctx->boundary_header.data;[m
[31m-        b->last = ctx->boundary_header.data + ctx->boundary_header.len;[m
[31m-[m
[31m-        hcl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (hcl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hcl->buf = b;[m
[31m-[m
[31m-[m
[31m-        /* "SSSS-EEEE/TTTT" CRLF CRLF */[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = range[i].content_range.data;[m
[31m-        b->last = range[i].content_range.data + range[i].content_range.len;[m
[31m-[m
[31m-        rcl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rcl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rcl->buf = b;[m
[31m-[m
[31m-[m
[31m-        /* the range data */[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->in_file = buf->in_file;[m
[31m-        b->temporary = buf->temporary;[m
[31m-        b->memory = buf->memory;[m
[31m-        b->mmap = buf->mmap;[m
[31m-        b->file = buf->file;[m
[31m-[m
[31m-        if (buf->in_file) {[m
[31m-            b->file_pos = buf->file_pos + range[i].start;[m
[31m-            b->file_last = buf->file_pos + range[i].end;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_in_memory(buf)) {[m
[31m-            b->pos = buf->pos + (size_t) range[i].start;[m
[31m-            b->last = buf->pos + (size_t) range[i].end;[m
[31m-        }[m
[31m-[m
[31m-        dcl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (dcl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dcl->buf = b;[m
[31m-[m
[31m-        *ll = hcl;[m
[31m-        hcl->next = rcl;[m
[31m-        rcl->next = dcl;[m
[31m-        ll = &dcl->next;[m
[31m-    }[m
[31m-[m
[31m-    /* the last boundary CRLF "--0123456789--" CRLF  */[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->temporary = 1;[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    b->pos = ngx_pnalloc(r->pool, sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN[m
[31m-                                  + sizeof("--" CRLF) - 1);[m
[31m-    if (b->pos == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->pos, ctx->boundary_header.data,[m
[31m-                         sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN);[m
[31m-    *b->last++ = '-'; *b->last++ = '-';[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    hcl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (hcl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hcl->buf = b;[m
[31m-    hcl->next = NULL;[m
[31m-[m
[31m-    *ll = hcl;[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_header_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_range_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_range_body_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_range_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_realip_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_realip_module.c[m
[1mdeleted file mode 100644[m
[1mindex b7befe6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_realip_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,512 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REALIP_XREALIP  0[m
[31m-#define NGX_HTTP_REALIP_XFWD     1[m
[31m-#define NGX_HTTP_REALIP_HEADER   2[m
[31m-#define NGX_HTTP_REALIP_PROXY    3[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t       *from;     /* array of ngx_cidr_t */[m
[31m-    ngx_uint_t         type;[m
[31m-    ngx_uint_t         hash;[m
[31m-    ngx_str_t          header;[m
[31m-    ngx_flag_t         recursive;[m
[31m-} ngx_http_realip_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_connection_t  *connection;[m
[31m-    struct sockaddr   *sockaddr;[m
[31m-    socklen_t          socklen;[m
[31m-    ngx_str_t          addr_text;[m
[31m-} ngx_http_realip_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_realip_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_realip_set_addr(ngx_http_request_t *r,[m
[31m-    ngx_addr_t *addr);[m
[31m-static void ngx_http_realip_cleanup(void *data);[m
[31m-static char *ngx_http_realip_from(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_realip(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static void *ngx_http_realip_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_realip_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_realip_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_realip_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_realip_remote_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_realip_commands[] = {[m
[31m-[m
[31m-    { ngx_string("set_real_ip_from"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_realip_from,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("real_ip_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_realip,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("real_ip_recursive"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_realip_loc_conf_t, recursive),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_realip_module_ctx = {[m
[31m-    ngx_http_realip_add_variables,         /* preconfiguration */[m
[31m-    ngx_http_realip_init,                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_realip_create_loc_conf,       /* create location configuration */[m
[31m-    ngx_http_realip_merge_loc_conf         /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_realip_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_realip_module_ctx,           /* module context */[m
[31m-    ngx_http_realip_commands,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_realip_vars[] = {[m
[31m-[m
[31m-    { ngx_string("realip_remote_addr"), NULL,[m
[31m-      ngx_http_realip_remote_addr_variable, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_uint_t                   i, hash;[m
[31m-    ngx_addr_t                   addr;[m
[31m-    ngx_array_t                 *xfwd;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_table_elt_t             *header;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_realip_ctx_t       *ctx;[m
[31m-    ngx_http_realip_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_realip_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_realip_module);[m
[31m-[m
[31m-    if (rlcf->from == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    switch (rlcf->type) {[m
[31m-[m
[31m-    case NGX_HTTP_REALIP_XREALIP:[m
[31m-[m
[31m-        if (r->headers_in.x_real_ip == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        value = &r->headers_in.x_real_ip->value;[m
[31m-        xfwd = NULL;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_REALIP_XFWD:[m
[31m-[m
[31m-        xfwd = &r->headers_in.x_forwarded_for;[m
[31m-[m
[31m-        if (xfwd->elts == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        value = NULL;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_REALIP_PROXY:[m
[31m-[m
[31m-        value = &r->connection->proxy_protocol_addr;[m
[31m-[m
[31m-        if (value->len == 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        xfwd = NULL;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_HTTP_REALIP_HEADER */[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        hash = rlcf->hash;[m
[31m-        len = rlcf->header.len;[m
[31m-        p = rlcf->header.data;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (hash == header[i].hash[m
[31m-                && len == header[i].key.len[m
[31m-                && ngx_strncmp(p, header[i].lowcase_key, len) == 0)[m
[31m-            {[m
[31m-                value = &header[i].value;[m
[31m-                xfwd = NULL;[m
[31m-[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    addr.sockaddr = c->sockaddr;[m
[31m-    addr.socklen = c->socklen;[m
[31m-    /* addr.name = c->addr_text; */[m
[31m-[m
[31m-    if (ngx_http_get_forwarded_addr(r, &addr, xfwd, value, rlcf->from,[m
[31m-                                    rlcf->recursive)[m
[31m-        != NGX_DECLINED)[m
[31m-    {[m
[31m-        return ngx_http_realip_set_addr(r, &addr);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_set_addr(ngx_http_request_t *r, ngx_addr_t *addr)[m
[31m-{[m
[31m-    size_t                  len;[m
[31m-    u_char                 *p;[m
[31m-    u_char                  text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_connection_t       *c;[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_http_realip_ctx_t  *ctx;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool, sizeof(ngx_http_realip_ctx_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = cln->data;[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_realip_module);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    len = ngx_sock_ntop(addr->sockaddr, addr->socklen, text,[m
[31m-                        NGX_SOCKADDR_STRLEN, 0);[m
[31m-    if (len == 0) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(c->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, text, len);[m
[31m-[m
[31m-    cln->handler = ngx_http_realip_cleanup;[m
[31m-[m
[31m-    ctx->connection = c;[m
[31m-    ctx->sockaddr = c->sockaddr;[m
[31m-    ctx->socklen = c->socklen;[m
[31m-    ctx->addr_text = c->addr_text;[m
[31m-[m
[31m-    c->sockaddr = addr->sockaddr;[m
[31m-    c->socklen = addr->socklen;[m
[31m-    c->addr_text.len = len;[m
[31m-    c->addr_text.data = p;[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_realip_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_realip_ctx_t *ctx = data;[m
[31m-[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ctx->connection;[m
[31m-[m
[31m-    c->sockaddr = ctx->sockaddr;[m
[31m-    c->socklen = ctx->socklen;[m
[31m-    c->addr_text = ctx->addr_text;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_realip_loc_conf_t *rlcf = conf;[m
[31m-[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_cidr_t              *cidr;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (rlcf->from == NULL) {[m
[31m-        rlcf->from = ngx_array_create(cf->pool, 2,[m
[31m-                                      sizeof(ngx_cidr_t));[m
[31m-        if (rlcf->from == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cidr = ngx_array_push(rlcf->from);[m
[31m-    if (cidr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "unix:") == 0) {[m
[31m-        cidr->family = AF_UNIX;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_ptocidr(&value[1], cidr);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%V\"",[m
[31m-                           &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "low address bits of %V are meaningless", &value[1]);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_realip(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_realip_loc_conf_t *rlcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "X-Real-IP") == 0) {[m
[31m-        rlcf->type = NGX_HTTP_REALIP_XREALIP;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "X-Forwarded-For") == 0) {[m
[31m-        rlcf->type = NGX_HTTP_REALIP_XFWD;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "proxy_protocol") == 0) {[m
[31m-        rlcf->type = NGX_HTTP_REALIP_PROXY;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    rlcf->type = NGX_HTTP_REALIP_HEADER;[m
[31m-    rlcf->hash = ngx_hash_strlow(value[1].data, value[1].data, value[1].len);[m
[31m-    rlcf->header = value[1];[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_realip_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_realip_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_realip_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->from = NULL;[m
[31m-     *     conf->hash = 0;[m
[31m-     *     conf->header = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->type = NGX_CONF_UNSET_UINT;[m
[31m-    conf->recursive = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_realip_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_realip_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_realip_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->from == NULL) {[m
[31m-        conf->from = prev->from;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->type, prev->type, NGX_HTTP_REALIP_XREALIP);[m
[31m-    ngx_conf_merge_value(conf->recursive, prev->recursive, 0);[m
[31m-[m
[31m-    if (conf->header.len == 0) {[m
[31m-        conf->hash = prev->hash;[m
[31m-        conf->header = prev->header;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_realip_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_realip_handler;[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_realip_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_realip_remote_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t              *addr_text;[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_http_realip_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_realip_module);[m
[31m-[m
[31m-    if (ctx == NULL && (r->internal || r->filter_finalize)) {[m
[31m-[m
[31m-        /*[m
[31m-         * if module context was reset, the original address[m
[31m-         * can still be found in the cleanup handler[m
[31m-         */[m
[31m-[m
[31m-        for (cln = r->pool->cleanup; cln; cln = cln->next) {[m
[31m-            if (cln->handler == ngx_http_realip_cleanup) {[m
[31m-                ctx = cln->data;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    addr_text = ctx ? &ctx->addr_text : &r->connection->addr_text;[m
[31m-[m
[31m-    v->len = addr_text->len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = addr_text->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_referer_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_referer_module.c[m
[1mdeleted file mode 100644[m
[1mindex 3f0f78e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_referer_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,671 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REFERER_NO_URI_PART  ((void *) 4)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_combined_t      hash;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_array_t             *regex;[m
[31m-    ngx_array_t             *server_name_regex;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_flag_t               no_referer;[m
[31m-    ngx_flag_t               blocked_referer;[m
[31m-    ngx_flag_t               server_names;[m
[31m-[m
[31m-    ngx_hash_keys_arrays_t  *keys;[m
[31m-[m
[31m-    ngx_uint_t               referer_hash_max_size;[m
[31m-    ngx_uint_t               referer_hash_bucket_size;[m
[31m-} ngx_http_referer_conf_t;[m
[31m-[m
[31m-[m
[31m-static void * ngx_http_referer_create_conf(ngx_conf_t *cf);[m
[31m-static char * ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_add_referer(ngx_conf_t *cf,[m
[31m-    ngx_hash_keys_arrays_t *keys, ngx_str_t *value, ngx_str_t *uri);[m
[31m-static ngx_int_t ngx_http_add_regex_referer(ngx_conf_t *cf,[m
[31m-    ngx_http_referer_conf_t *rlcf, ngx_str_t *name);[m
[31m-#if (NGX_PCRE)[m
[31m-static ngx_int_t ngx_http_add_regex_server_name(ngx_conf_t *cf,[m
[31m-    ngx_http_referer_conf_t *rlcf, ngx_http_regex_t *regex);[m
[31m-#endif[m
[31m-static int ngx_libc_cdecl ngx_http_cmp_referer_wildcards(const void *one,[m
[31m-    const void *two);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_referer_commands[] = {[m
[31m-[m
[31m-    { ngx_string("valid_referers"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_valid_referers,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("referer_hash_max_size"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_referer_conf_t, referer_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("referer_hash_bucket_size"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_referer_conf_t, referer_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_referer_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_referer_create_conf,          /* create location configuration */[m
[31m-    ngx_http_referer_merge_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_referer_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_referer_module_ctx,          /* module context */[m
[31m-    ngx_http_referer_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    u_char                    *p, *ref, *last;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                 *uri;[m
[31m-    ngx_uint_t                 i, key;[m
[31m-    ngx_http_referer_conf_t   *rlcf;[m
[31m-    u_char                     buf[256];[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_str_t                  referer;[m
[31m-#endif[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module);[m
[31m-[m
[31m-    if (rlcf->hash.hash.buckets == NULL[m
[31m-        && rlcf->hash.wc_head == NULL[m
[31m-        && rlcf->hash.wc_tail == NULL[m
[31m-#if (NGX_PCRE)[m
[31m-        && rlcf->regex == NULL[m
[31m-        && rlcf->server_name_regex == NULL[m
[31m-#endif[m
[31m-       )[m
[31m-    {[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.referer == NULL) {[m
[31m-        if (rlcf->no_referer) {[m
[31m-            goto valid;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    len = r->headers_in.referer->value.len;[m
[31m-    ref = r->headers_in.referer->value.data;[m
[31m-[m
[31m-    if (len >= sizeof("http://i.ru") - 1) {[m
[31m-        last = ref + len;[m
[31m-[m
[31m-        if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) {[m
[31m-            ref += 7;[m
[31m-            len -= 7;[m
[31m-            goto valid_scheme;[m
[31m-[m
[31m-        } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) {[m
[31m-            ref += 8;[m
[31m-            len -= 8;[m
[31m-            goto valid_scheme;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->blocked_referer) {[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-    goto invalid;[m
[31m-[m
[31m-valid_scheme:[m
[31m-[m
[31m-    i = 0;[m
[31m-    key = 0;[m
[31m-[m
[31m-    for (p = ref; p < last; p++) {[m
[31m-        if (*p == '/' || *p == ':') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (i == 256) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        buf[i] = ngx_tolower(*p);[m
[31m-        key = ngx_hash(key, buf[i++]);[m
[31m-    }[m
[31m-[m
[31m-    uri = ngx_hash_find_combined(&rlcf->hash, key, buf, p - ref);[m
[31m-[m
[31m-    if (uri) {[m
[31m-        goto uri;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (rlcf->server_name_regex) {[m
[31m-        referer.len = p - ref;[m
[31m-        referer.data = buf;[m
[31m-[m
[31m-        rc = ngx_regex_exec_array(rlcf->server_name_regex, &referer,[m
[31m-                                  r->connection->log);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            goto valid;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_DECLINED */[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->regex) {[m
[31m-        referer.len = len;[m
[31m-        referer.data = ref;[m
[31m-[m
[31m-        rc = ngx_regex_exec_array(rlcf->regex, &referer, r->connection->log);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            goto valid;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_DECLINED */[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    *v = ngx_http_variable_true_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-uri:[m
[31m-[m
[31m-    for ( /* void */ ; p < last; p++) {[m
[31m-        if (*p == '/') {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = last - p;[m
[31m-[m
[31m-    if (uri == NGX_HTTP_REFERER_NO_URI_PART) {[m
[31m-        goto valid;[m
[31m-    }[m
[31m-[m
[31m-    if (len < uri->len || ngx_strncmp(uri->data, p, uri->len) != 0) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-valid:[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_referer_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_referer_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_referer_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->hash = { NULL };[m
[31m-     *     conf->server_names = 0;[m
[31m-     *     conf->keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    conf->regex = NGX_CONF_UNSET_PTR;[m
[31m-    conf->server_name_regex = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    conf->no_referer = NGX_CONF_UNSET;[m
[31m-    conf->blocked_referer = NGX_CONF_UNSET;[m
[31m-    conf->referer_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    conf->referer_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_referer_conf_t *prev = parent;[m
[31m-    ngx_http_referer_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t                 n;[m
[31m-    ngx_hash_init_t            hash;[m
[31m-    ngx_http_server_name_t    *sn;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (conf->keys == NULL) {[m
[31m-        conf->hash = prev->hash;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL);[m
[31m-        ngx_conf_merge_ptr_value(conf->server_name_regex,[m
[31m-                                 prev->server_name_regex, NULL);[m
[31m-#endif[m
[31m-        ngx_conf_merge_value(conf->no_referer, prev->no_referer, 0);[m
[31m-        ngx_conf_merge_value(conf->blocked_referer, prev->blocked_referer, 0);[m
[31m-        ngx_conf_merge_uint_value(conf->referer_hash_max_size,[m
[31m-                                  prev->referer_hash_max_size, 2048);[m
[31m-        ngx_conf_merge_uint_value(conf->referer_hash_bucket_size,[m
[31m-                                  prev->referer_hash_bucket_size, 64);[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->server_names == 1) {[m
[31m-        cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-        sn = cscf->server_names.elts;[m
[31m-        for (n = 0; n < cscf->server_names.nelts; n++) {[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            if (sn[n].regex) {[m
[31m-[m
[31m-                if (ngx_http_add_regex_server_name(cf, conf, sn[n].regex)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (ngx_http_add_referer(cf, conf->keys, &sn[n].name, NULL)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((conf->no_referer == 1 || conf->blocked_referer == 1)[m
[31m-        && conf->keys->keys.nelts == 0[m
[31m-        && conf->keys->dns_wc_head.nelts == 0[m
[31m-        && conf->keys->dns_wc_tail.nelts == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "the \"none\" or \"blocked\" referers are specified "[m
[31m-                      "in the \"valid_referers\" directive "[m
[31m-                      "without any valid referer");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->referer_hash_max_size,[m
[31m-                              prev->referer_hash_max_size, 2048);[m
[31m-    ngx_conf_merge_uint_value(conf->referer_hash_bucket_size,[m
[31m-                              prev->referer_hash_bucket_size, 64);[m
[31m-    conf->referer_hash_bucket_size = ngx_align(conf->referer_hash_bucket_size,[m
[31m-                                               ngx_cacheline_size);[m
[31m-[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = conf->referer_hash_max_size;[m
[31m-    hash.bucket_size = conf->referer_hash_bucket_size;[m
[31m-    hash.name = "referer_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-[m
[31m-    if (conf->keys->keys.nelts) {[m
[31m-        hash.hash = &conf->hash.hash;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, conf->keys->keys.elts, conf->keys->keys.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->keys->dns_wc_head.nelts) {[m
[31m-[m
[31m-        ngx_qsort(conf->keys->dns_wc_head.elts,[m
[31m-                  (size_t) conf->keys->dns_wc_head.nelts,[m
[31m-                  sizeof(ngx_hash_key_t),[m
[31m-                  ngx_http_cmp_referer_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = cf->temp_pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_head.elts,[m
[31m-                                   conf->keys->dns_wc_head.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf->hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->keys->dns_wc_tail.nelts) {[m
[31m-[m
[31m-        ngx_qsort(conf->keys->dns_wc_tail.elts,[m
[31m-                  (size_t) conf->keys->dns_wc_tail.nelts,[m
[31m-                  sizeof(ngx_hash_key_t),[m
[31m-                  ngx_http_cmp_referer_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = cf->temp_pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_tail.elts,[m
[31m-                                   conf->keys->dns_wc_tail.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf->hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL);[m
[31m-    ngx_conf_merge_ptr_value(conf->server_name_regex, prev->server_name_regex,[m
[31m-                             NULL);[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->no_referer == NGX_CONF_UNSET) {[m
[31m-        conf->no_referer = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->blocked_referer == NGX_CONF_UNSET) {[m
[31m-        conf->blocked_referer = 0;[m
[31m-    }[m
[31m-[m
[31m-    conf->keys = NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_referer_conf_t  *rlcf = conf;[m
[31m-[m
[31m-    u_char                    *p;[m
[31m-    ngx_str_t                 *value, uri, name;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_variable_t       *var;[m
[31m-[m
[31m-    ngx_str_set(&name, "invalid_referer");[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_referer_variable;[m
[31m-[m
[31m-    if (rlcf->keys == NULL) {[m
[31m-        rlcf->keys = ngx_pcalloc(cf->temp_pool, sizeof(ngx_hash_keys_arrays_t));[m
[31m-        if (rlcf->keys == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rlcf->keys->pool = cf->pool;[m
[31m-        rlcf->keys->temp_pool = cf->pool;[m
[31m-[m
[31m-        if (ngx_hash_keys_array_init(rlcf->keys, NGX_HASH_SMALL) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (value[i].len == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid referer \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "none") == 0) {[m
[31m-            rlcf->no_referer = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "blocked") == 0) {[m
[31m-            rlcf->blocked_referer = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "server_names") == 0) {[m
[31m-            rlcf->server_names = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].data[0] == '~') {[m
[31m-            if (ngx_http_add_regex_referer(cf, rlcf, &value[i]) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_str_null(&uri);[m
[31m-[m
[31m-        p = (u_char *) ngx_strchr(value[i].data, '/');[m
[31m-[m
[31m-        if (p) {[m
[31m-            uri.len = (value[i].data + value[i].len) - p;[m
[31m-            uri.data = p;[m
[31m-            value[i].len = p - value[i].data;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_add_referer(cf, rlcf->keys, &value[i], &uri) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_referer(ngx_conf_t *cf, ngx_hash_keys_arrays_t *keys,[m
[31m-    ngx_str_t *value, ngx_str_t *uri)[m
[31m-{[m
[31m-    ngx_int_t   rc;[m
[31m-    ngx_str_t  *u;[m
[31m-[m
[31m-    if (uri == NULL || uri->len == 0) {[m
[31m-        u = NGX_HTTP_REFERER_NO_URI_PART;[m
[31m-[m
[31m-    } else {[m
[31m-        u = ngx_palloc(cf->pool, sizeof(ngx_str_t));[m
[31m-        if (u == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *u = *uri;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_hash_add_key(keys, value, u, NGX_HASH_WILDCARD_KEY);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid hostname or wildcard \"%V\"", value);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "conflicting parameter \"%V\"", value);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_elt_t      *re;[m
[31m-    ngx_regex_compile_t   rc;[m
[31m-    u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    if (name->len == 1) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->regex == NGX_CONF_UNSET_PTR) {[m
[31m-        rlcf->regex = ngx_array_create(cf->pool, 2, sizeof(ngx_regex_elt_t));[m
[31m-        if (rlcf->regex == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    re = ngx_array_push(rlcf->regex);[m
[31m-    if (re == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name->len--;[m
[31m-    name->data++;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *name;[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.options = NGX_REGEX_CASELESS;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = rc.regex;[m
[31m-    re->name = name->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "the using of the regex \"%V\" requires PCRE library",[m
[31m-                       name);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_regex_server_name(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf,[m
[31m-    ngx_http_regex_t *regex)[m
[31m-{[m
[31m-    ngx_regex_elt_t  *re;[m
[31m-[m
[31m-    if (rlcf->server_name_regex == NGX_CONF_UNSET_PTR) {[m
[31m-        rlcf->server_name_regex = ngx_array_create(cf->pool, 2,[m
[31m-                                                   sizeof(ngx_regex_elt_t));[m
[31m-        if (rlcf->server_name_regex == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    re = ngx_array_push(rlcf->server_name_regex);[m
[31m-    if (re == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = regex->regex;[m
[31m-    re->name = regex->name.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_cmp_referer_wildcards(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_hash_key_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_hash_key_t *) one;[m
[31m-    second = (ngx_hash_key_t *) two;[m
[31m-[m
[31m-    return ngx_dns_strcmp(first->key.data, second->key.data);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_rewrite_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_rewrite_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6b2444c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_rewrite_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1029 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t  *codes;        /* uintptr_t */[m
[31m-[m
[31m-    ngx_uint_t    stack_size;[m
[31m-[m
[31m-    ngx_flag_t    log;[m
[31m-    ngx_flag_t    uninitialized_variable_warn;[m
[31m-} ngx_http_rewrite_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_rewrite_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char * ngx_http_rewrite_if_condition(ngx_conf_t *cf,[m
[31m-    ngx_http_rewrite_loc_conf_t *lcf);[m
[31m-static char *ngx_http_rewrite_variable(ngx_conf_t *cf,[m
[31m-    ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-static char *ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char * ngx_http_rewrite_value(ngx_conf_t *cf,[m
[31m-    ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_rewrite_commands[] = {[m
[31m-[m
[31m-    { ngx_string("rewrite"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_TAKE23,[m
[31m-      ngx_http_rewrite,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("return"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_TAKE12,[m
[31m-      ngx_http_rewrite_return,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("break"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_NOARGS,[m
[31m-      ngx_http_rewrite_break,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("if"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_1MORE,[m
[31m-      ngx_http_rewrite_if,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("set"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_TAKE2,[m
[31m-      ngx_http_rewrite_set,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("rewrite_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rewrite_loc_conf_t, log),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uninitialized_variable_warn"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_rewrite_loc_conf_t, uninitialized_variable_warn),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_rewrite_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_rewrite_init,                 /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_rewrite_create_loc_conf,      /* create location configuration */[m
[31m-    ngx_http_rewrite_merge_loc_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_rewrite_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_rewrite_module_ctx,          /* module context */[m
[31m-    ngx_http_rewrite_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rewrite_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                     index;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t     *e;[m
[31m-    ngx_http_core_srv_conf_t     *cscf;[m
[31m-    ngx_http_core_main_conf_t    *cmcf;[m
[31m-    ngx_http_rewrite_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    index = cmcf->phase_engine.location_rewrite_index;[m
[31m-[m
[31m-    if (r->phase_handler == index && r->loc_conf == cscf->ctx->loc_conf) {[m
[31m-        /* skipping location rewrite phase for server null location */[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (rlcf->codes == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    e = ngx_pcalloc(r->pool, sizeof(ngx_http_script_engine_t));[m
[31m-    if (e == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    e->sp = ngx_pcalloc(r->pool,[m
[31m-                        rlcf->stack_size * sizeof(ngx_http_variable_value_t));[m
[31m-    if (e->sp == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    e->ip = rlcf->codes->elts;[m
[31m-    e->request = r;[m
[31m-    e->quote = 1;[m
[31m-    e->log = rlcf->log;[m
[31m-    e->status = NGX_DECLINED;[m
[31m-[m
[31m-    while (*(uintptr_t *) e->ip) {[m
[31m-        code = *(ngx_http_script_code_pt *) e->ip;[m
[31m-        code(e);[m
[31m-    }[m
[31m-[m
[31m-    if (e->status < NGX_HTTP_BAD_REQUEST) {[m
[31m-        return e->status;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status == 0) {[m
[31m-        return e->status;[m
[31m-    }[m
[31m-[m
[31m-    return r->err_status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_variable_t          *var;[m
[31m-    ngx_http_core_main_conf_t    *cmcf;[m
[31m-    ngx_http_rewrite_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (rlcf->uninitialized_variable_warn == 0) {[m
[31m-        *v = ngx_http_variable_null_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    var = cmcf->variables.elts;[m
[31m-[m
[31m-    /*[m
[31m-     * the ngx_http_rewrite_module sets variables directly in r->variables,[m
[31m-     * and they should be handled by ngx_http_get_indexed_variable(),[m
[31m-     * so the handler is called only if the variable is not initialized[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                  "using uninitialized \"%V\" variable", &var[data].name);[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_rewrite_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->stack_size = NGX_CONF_UNSET_UINT;[m
[31m-    conf->log = NGX_CONF_UNSET;[m
[31m-    conf->uninitialized_variable_warn = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t *prev = parent;[m
[31m-    ngx_http_rewrite_loc_conf_t *conf = child;[m
[31m-[m
[31m-    uintptr_t  *code;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->log, prev->log, 0);[m
[31m-    ngx_conf_merge_value(conf->uninitialized_variable_warn,[m
[31m-                         prev->uninitialized_variable_warn, 1);[m
[31m-    ngx_conf_merge_uint_value(conf->stack_size, prev->stack_size, 10);[m
[31m-[m
[31m-    if (conf->codes == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->codes == prev->codes) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(conf->codes, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_rewrite_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_rewrite_handler;[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_rewrite_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         last;[m
[31m-    ngx_regex_compile_t                rc;[m
[31m-    ngx_http_script_code_pt           *code;[m
[31m-    ngx_http_script_compile_t          sc;[m
[31m-    ngx_http_script_regex_code_t      *regex;[m
[31m-    ngx_http_script_regex_end_code_t  *regex_end;[m
[31m-    u_char                             errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    regex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                       sizeof(ngx_http_script_regex_code_t));[m
[31m-    if (regex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = value[1];[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    /* TODO: NGX_REGEX_CASELESS */[m
[31m-[m
[31m-    regex->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (regex->regex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    regex->code = ngx_http_script_regex_start_code;[m
[31m-    regex->uri = 1;[m
[31m-    regex->name = value[1];[m
[31m-[m
[31m-    if (value[2].data[value[2].len - 1] == '?') {[m
[31m-[m
[31m-        /* the last "?" drops the original arguments */[m
[31m-        value[2].len--;[m
[31m-[m
[31m-    } else {[m
[31m-        regex->add_args = 1;[m
[31m-    }[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    if (ngx_strncmp(value[2].data, "http://", sizeof("http://") - 1) == 0[m
[31m-        || ngx_strncmp(value[2].data, "https://", sizeof("https://") - 1) == 0[m
[31m-        || ngx_strncmp(value[2].data, "$scheme", sizeof("$scheme") - 1) == 0)[m
[31m-    {[m
[31m-        regex->status = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-        regex->redirect = 1;[m
[31m-        last = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 4) {[m
[31m-        if (ngx_strcmp(value[3].data, "last") == 0) {[m
[31m-            last = 1;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[3].data, "break") == 0) {[m
[31m-            regex->break_cycle = 1;[m
[31m-            last = 1;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[3].data, "redirect") == 0) {[m
[31m-            regex->status = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-            regex->redirect = 1;[m
[31m-            last = 1;[m
[31m-[m
[31m-        } else if (ngx_strcmp(value[3].data, "permanent") == 0) {[m
[31m-            regex->status = NGX_HTTP_MOVED_PERMANENTLY;[m
[31m-            regex->redirect = 1;[m
[31m-            last = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[3]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[2];[m
[31m-    sc.lengths = &regex->lengths;[m
[31m-    sc.values = &lcf->codes;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[2]);[m
[31m-    sc.main = regex;[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.compile_args = !regex->redirect;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    regex = sc.main;[m
[31m-[m
[31m-    regex->size = sc.size;[m
[31m-    regex->args = sc.args;[m
[31m-[m
[31m-    if (sc.variables == 0 && !sc.dup_capture) {[m
[31m-        regex->lengths = NULL;[m
[31m-    }[m
[31m-[m
[31m-    regex_end = ngx_http_script_add_code(lcf->codes,[m
[31m-                                      sizeof(ngx_http_script_regex_end_code_t),[m
[31m-                                      &regex);[m
[31m-    if (regex_end == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    regex_end->code = ngx_http_script_regex_end_code;[m
[31m-    regex_end->uri = regex->uri;[m
[31m-    regex_end->args = regex->args;[m
[31m-    regex_end->add_args = regex->add_args;[m
[31m-    regex_end->redirect = regex->redirect;[m
[31m-[m
[31m-    if (last) {[m
[31m-        code = ngx_http_script_add_code(lcf->codes, sizeof(uintptr_t), &regex);[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = NULL;[m
[31m-    }[m
[31m-[m
[31m-    regex->next = (u_char *) lcf->codes->elts + lcf->codes->nelts[m
[31m-                                              - (u_char *) regex;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_str_t                         *value, *v;[m
[31m-    ngx_http_script_return_code_t     *ret;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    ret = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                     sizeof(ngx_http_script_return_code_t));[m
[31m-    if (ret == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(ret, sizeof(ngx_http_script_return_code_t));[m
[31m-[m
[31m-    ret->code = ngx_http_script_return_code;[m
[31m-[m
[31m-    p = value[1].data;[m
[31m-[m
[31m-    ret->status = ngx_atoi(p, value[1].len);[m
[31m-[m
[31m-    if (ret->status == (uintptr_t) NGX_ERROR) {[m
[31m-[m
[31m-        if (cf->args->nelts == 2[m
[31m-            && (ngx_strncmp(p, "http://", sizeof("http://") - 1) == 0[m
[31m-                || ngx_strncmp(p, "https://", sizeof("https://") - 1) == 0[m
[31m-                || ngx_strncmp(p, "$scheme", sizeof("$scheme") - 1) == 0))[m
[31m-        {[m
[31m-            ret->status = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-            v = &value[1];[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid return code \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (ret->status > 999) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid return code \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cf->args->nelts == 2) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        v = &value[2];[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = v;[m
[31m-    ccv.complex_value = &ret->text;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t *lcf = conf;[m
[31m-[m
[31m-    ngx_http_script_code_pt  *code;[m
[31m-[m
[31m-    code = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = ngx_http_script_break_code;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-[m
[31m-    void                         *mconf;[m
[31m-    char                         *rv;[m
[31m-    u_char                       *elts;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_conf_t                    save;[m
[31m-    ngx_http_module_t            *module;[m
[31m-    ngx_http_conf_ctx_t          *ctx, *pctx;[m
[31m-    ngx_http_core_loc_conf_t     *clcf, *pclcf;[m
[31m-    ngx_http_script_if_code_t    *if_code;[m
[31m-    ngx_http_rewrite_loc_conf_t  *nlcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-    clcf->name = pclcf->name;[m
[31m-    clcf->noname = 1;[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_rewrite_if_condition(cf, lcf) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if_code = ngx_array_push_n(lcf->codes, sizeof(ngx_http_script_if_code_t));[m
[31m-    if (if_code == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if_code->code = ngx_http_script_if_code;[m
[31m-[m
[31m-    elts = lcf->codes->elts;[m
[31m-[m
[31m-[m
[31m-    /* the inner directives must be compiled to the same code array */[m
[31m-[m
[31m-    nlcf = ctx->loc_conf[ngx_http_rewrite_module.ctx_index];[m
[31m-    nlcf->codes = lcf->codes;[m
[31m-[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-[m
[31m-    if (cf->cmd_type == NGX_HTTP_SRV_CONF) {[m
[31m-        if_code->loc_conf = NULL;[m
[31m-        cf->cmd_type = NGX_HTTP_SIF_CONF;[m
[31m-[m
[31m-    } else {[m
[31m-        if_code->loc_conf = ctx->loc_conf;[m
[31m-        cf->cmd_type = NGX_HTTP_LIF_CONF;[m
[31m-    }[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (elts != lcf->codes->elts) {[m
[31m-        if_code = (ngx_http_script_if_code_t *)[m
[31m-                   ((u_char *) if_code + ((u_char *) lcf->codes->elts - elts));[m
[31m-    }[m
[31m-[m
[31m-    if_code->next = (u_char *) lcf->codes->elts + lcf->codes->nelts[m
[31m-                                                - (u_char *) if_code;[m
[31m-[m
[31m-    /* the code array belong to parent block */[m
[31m-[m
[31m-    nlcf->codes = NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf)[m
[31m-{[m
[31m-    u_char                        *p;[m
[31m-    size_t                         len;[m
[31m-    ngx_str_t                     *value;[m
[31m-    ngx_uint_t                     cur, last;[m
[31m-    ngx_regex_compile_t            rc;[m
[31m-    ngx_http_script_code_pt       *code;[m
[31m-    ngx_http_script_file_code_t   *fop;[m
[31m-    ngx_http_script_regex_code_t  *regex;[m
[31m-    u_char                         errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    last = cf->args->nelts - 1;[m
[31m-[m
[31m-    if (value[1].len < 1 || value[1].data[0] != '(') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid condition \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len == 1) {[m
[31m-        cur = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        cur = 1;[m
[31m-        value[1].len--;[m
[31m-        value[1].data++;[m
[31m-    }[m
[31m-[m
[31m-    if (value[last].len < 1 || value[last].data[value[last].len - 1] != ')') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid condition \"%V\"", &value[last]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[last].len == 1) {[m
[31m-        last--;[m
[31m-[m
[31m-    } else {[m
[31m-        value[last].len--;[m
[31m-        value[last].data[value[last].len] = '\0';[m
[31m-    }[m
[31m-[m
[31m-    len = value[cur].len;[m
[31m-    p = value[cur].data;[m
[31m-[m
[31m-    if (len > 1 && p[0] == '$') {[m
[31m-[m
[31m-        if (cur != last && cur + 2 != last) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid condition \"%V\"", &value[cur]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_rewrite_variable(cf, lcf, &value[cur]) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cur == last) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        cur++;[m
[31m-[m
[31m-        len = value[cur].len;[m
[31m-        p = value[cur].data;[m
[31m-[m
[31m-        if (len == 1 && p[0] == '=') {[m
[31m-[m
[31m-            if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            code = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                              sizeof(uintptr_t));[m
[31m-            if (code == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *code = ngx_http_script_equal_code;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (len == 2 && p[0] == '!' && p[1] == '=') {[m
[31m-[m
[31m-            if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            code = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                              sizeof(uintptr_t));[m
[31m-            if (code == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *code = ngx_http_script_not_equal_code;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if ((len == 1 && p[0] == '~')[m
[31m-            || (len == 2 && p[0] == '~' && p[1] == '*')[m
[31m-            || (len == 2 && p[0] == '!' && p[1] == '~')[m
[31m-            || (len == 3 && p[0] == '!' && p[1] == '~' && p[2] == '*'))[m
[31m-        {[m
[31m-            regex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                         sizeof(ngx_http_script_regex_code_t));[m
[31m-            if (regex == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t));[m
[31m-[m
[31m-            ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-            rc.pattern = value[last];[m
[31m-            rc.options = (p[len - 1] == '*') ? NGX_REGEX_CASELESS : 0;[m
[31m-            rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-            rc.err.data = errstr;[m
[31m-[m
[31m-            regex->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-            if (regex->regex == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            regex->code = ngx_http_script_regex_start_code;[m
[31m-            regex->next = sizeof(ngx_http_script_regex_code_t);[m
[31m-            regex->test = 1;[m
[31m-            if (p[0] == '!') {[m
[31m-                regex->negative_test = 1;[m
[31m-            }[m
[31m-            regex->name = value[last];[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unexpected \"%V\" in condition", &value[cur]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-    } else if ((len == 2 && p[0] == '-')[m
[31m-               || (len == 3 && p[0] == '!' && p[1] == '-'))[m
[31m-    {[m
[31m-        if (cur + 1 != last) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid condition \"%V\"", &value[cur]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value[last].data[value[last].len] = '\0';[m
[31m-        value[last].len++;[m
[31m-[m
[31m-        if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        fop = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                          sizeof(ngx_http_script_file_code_t));[m
[31m-        if (fop == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        fop->code = ngx_http_script_file_code;[m
[31m-[m
[31m-        if (p[1] == 'f') {[m
[31m-            fop->op = ngx_http_script_file_plain;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (p[1] == 'd') {[m
[31m-            fop->op = ngx_http_script_file_dir;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (p[1] == 'e') {[m
[31m-            fop->op = ngx_http_script_file_exists;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (p[1] == 'x') {[m
[31m-            fop->op = ngx_http_script_file_exec;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (p[0] == '!') {[m
[31m-            if (p[2] == 'f') {[m
[31m-                fop->op = ngx_http_script_file_not_plain;[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (p[2] == 'd') {[m
[31m-                fop->op = ngx_http_script_file_not_dir;[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (p[2] == 'e') {[m
[31m-                fop->op = ngx_http_script_file_not_exists;[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (p[2] == 'x') {[m
[31m-                fop->op = ngx_http_script_file_not_exec;[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid condition \"%V\"", &value[cur]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid condition \"%V\"", &value[cur]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t                    index;[m
[31m-    ngx_http_script_var_code_t  *var_code;[m
[31m-[m
[31m-    value->len--;[m
[31m-    value->data++;[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, value);[m
[31m-[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var_code = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                          sizeof(ngx_http_script_var_code_t));[m
[31m-    if (var_code == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var_code->code = ngx_http_script_var_code;[m
[31m-    var_code->index = index;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-[m
[31m-    ngx_int_t                            index;[m
[31m-    ngx_str_t                           *value;[m
[31m-    ngx_http_variable_t                 *v;[m
[31m-    ngx_http_script_var_code_t          *vcode;[m
[31m-    ngx_http_script_var_handler_code_t  *vhcode;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value[1].len--;[m
[31m-    value[1].data++;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, &value[1]);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->get_handler == NULL[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "http_", 5) != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "sent_http_", 10) != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "upstream_http_", 14) != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "cookie_", 7) != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "upstream_cookie_", 16)[m
[31m-           != 0[m
[31m-        && ngx_strncasecmp(value[1].data, (u_char *) "arg_", 4) != 0)[m
[31m-    {[m
[31m-        v->get_handler = ngx_http_rewrite_var;[m
[31m-        v->data = index;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_rewrite_value(cf, lcf, &value[2]) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->set_handler) {[m
[31m-        vhcode = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                   sizeof(ngx_http_script_var_handler_code_t));[m
[31m-        if (vhcode == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        vhcode->code = ngx_http_script_var_set_handler_code;[m
[31m-        vhcode->handler = v->set_handler;[m
[31m-        vhcode->data = v->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    vcode = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                       sizeof(ngx_http_script_var_code_t));[m
[31m-    if (vcode == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vcode->code = ngx_http_script_set_var_code;[m
[31m-    vcode->index = (uintptr_t) index;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t                              n;[m
[31m-    ngx_http_script_compile_t              sc;[m
[31m-    ngx_http_script_value_code_t          *val;[m
[31m-    ngx_http_script_complex_value_code_t  *complex;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(value);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        val = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                         sizeof(ngx_http_script_value_code_t));[m
[31m-        if (val == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_atoi(value->data, value->len);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            n = 0;[m
[31m-        }[m
[31m-[m
[31m-        val->code = ngx_http_script_value_code;[m
[31m-        val->value = (uintptr_t) n;[m
[31m-        val->text_len = (uintptr_t) value->len;[m
[31m-        val->text_data = (uintptr_t) value->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    complex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                 sizeof(ngx_http_script_complex_value_code_t));[m
[31m-    if (complex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    complex->code = ngx_http_script_complex_value_code;[m
[31m-    complex->lengths = NULL;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = value;[m
[31m-    sc.lengths = &complex->lengths;[m
[31m-    sc.values = &lcf->codes;[m
[31m-    sc.variables = n;[m
[31m-    sc.complete_lengths = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_scgi_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_scgi_module.c[m
[1mdeleted file mode 100644[m
[1mindex f09617e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_scgi_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1969 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Manlio Perillo (manlio.perillo@gmail.com)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_scgi_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t               *flushes;[m
[31m-    ngx_array_t               *lengths;[m
[31m-    ngx_array_t               *values;[m
[31m-    ngx_uint_t                 number;[m
[31m-    ngx_hash_t                 hash;[m
[31m-} ngx_http_scgi_params_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-[m
[31m-    ngx_http_scgi_params_t     params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_scgi_params_t     params_cache;[m
[31m-#endif[m
[31m-    ngx_array_t               *params_source;[m
[31m-[m
[31m-    ngx_array_t               *scgi_lengths;[m
[31m-    ngx_array_t               *scgi_values;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t   cache_key;[m
[31m-#endif[m
[31m-} ngx_http_scgi_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_scgi_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_scgi_loc_conf_t *scf);[m
[31m-static ngx_int_t ngx_http_scgi_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_scgi_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_scgi_process_status_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_scgi_process_header(ngx_http_request_t *r);[m
[31m-static void ngx_http_scgi_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-[m
[31m-static void *ngx_http_scgi_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_scgi_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_scgi_init_params(ngx_conf_t *cf,[m
[31m-    ngx_http_scgi_loc_conf_t *conf, ngx_http_scgi_params_t *params,[m
[31m-    ngx_keyval_t *default_params);[m
[31m-[m
[31m-static char *ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_scgi_create_key(ngx_http_request_t *r);[m
[31m-static char *ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t ngx_http_scgi_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_scgi_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_scgi_commands[] = {[m
[31m-[m
[31m-    { ngx_string("scgi_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_scgi_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_scgi_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("scgi_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_scgi_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_scgi_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_main_conf_t, caches),[m
[31m-      &ngx_http_scgi_module },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_scgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("scgi_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_scgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("scgi_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23,[m
[31m-      ngx_http_upstream_param_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, params_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("scgi_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_scgi_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_scgi_create_main_conf,        /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_scgi_create_loc_conf,         /* create location configuration */[m
[31m-    ngx_http_scgi_merge_loc_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_scgi_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_scgi_module_ctx,             /* module context */[m
[31m-    ngx_http_scgi_commands,                /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_scgi_hide_headers[] = {[m
[31m-    ngx_string("Status"),[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_scgi_cache_headers[] = {[m
[31m-    { ngx_string("HTTP_IF_MODIFIED_SINCE"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("HTTP_IF_MATCH"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_RANGE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_RANGE"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t ngx_http_scgi_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_SCGI_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_status_t          *status;[m
[31m-    ngx_http_upstream_t        *u;[m
[31m-    ngx_http_scgi_loc_conf_t   *scf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_scgi_main_conf_t  *smcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    status = ngx_pcalloc(r->pool, sizeof(ngx_http_status_t));[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, status, ngx_http_scgi_module);[m
[31m-[m
[31m-    scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    if (scf->scgi_lengths) {[m
[31m-        if (ngx_http_scgi_eval(r, scf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_str_set(&u->schema, "scgi://");[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_scgi_module;[m
[31m-[m
[31m-    u->conf = &scf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    smcf = ngx_http_get_module_main_conf(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    u->caches = &smcf->caches;[m
[31m-    u->create_key = ngx_http_scgi_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_scgi_create_request;[m
[31m-    u->reinit_request = ngx_http_scgi_reinit_request;[m
[31m-    u->process_header = ngx_http_scgi_process_status_line;[m
[31m-    u->abort_request = ngx_http_scgi_abort_request;[m
[31m-    u->finalize_request = ngx_http_scgi_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    u->buffering = scf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_event_pipe_copy_input_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    if (!scf->upstream.request_buffering[m
[31m-        && scf->upstream.pass_request_body[m
[31m-        && !r->headers_in.chunked)[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_eval(ngx_http_request_t *r, ngx_http_scgi_loc_conf_t * scf)[m
[31m-{[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &url.url, scf->scgi_lengths->elts, 0,[m
[31m-                            scf->scgi_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = url.port;[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                 *key;[m
[31m-    ngx_http_scgi_loc_conf_t  *scf;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &scf->cache_key, key) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                         content_length_n;[m
[31m-    u_char                        ch, *key, *val, *lowcase_key;[m
[31m-    size_t                        len, key_len, val_len, allocated;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_str_t                     content_length;[m
[31m-    ngx_uint_t                    i, n, hash, skip_empty, header_params;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header, **ignored;[m
[31m-    ngx_http_scgi_params_t       *params;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_scgi_loc_conf_t     *scf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-    u_char                        buffer[NGX_OFF_T_LEN];[m
[31m-[m
[31m-    content_length_n = 0;[m
[31m-    body = r->upstream->request_bufs;[m
[31m-[m
[31m-    while (body) {[m
[31m-        content_length_n += ngx_buf_size(body->buf);[m
[31m-        body = body->next;[m
[31m-    }[m
[31m-[m
[31m-    content_length.data = buffer;[m
[31m-    content_length.len = ngx_sprintf(buffer, "%O", content_length_n) - buffer;[m
[31m-[m
[31m-    len = sizeof("CONTENT_LENGTH") + content_length.len + 1;[m
[31m-[m
[31m-    header_params = 0;[m
[31m-    ignored = NULL;[m
[31m-[m
[31m-    scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    params = r->upstream->cacheable ? &scf->params_cache : &scf->params;[m
[31m-#else[m
[31m-    params = &scf->params;[m
[31m-#endif[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, params->flushes);[m
[31m-        le.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-        le.request = r;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = lcode(&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += key_len + val_len + 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (scf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        allocated = 0;[m
[31m-        lowcase_key = NULL;[m
[31m-[m
[31m-        if (params->number) {[m
[31m-            n = 0;[m
[31m-            part = &r->headers_in.headers.part;[m
[31m-[m
[31m-            while (part) {[m
[31m-                n += part->nelts;[m
[31m-                part = part->next;[m
[31m-            }[m
[31m-[m
[31m-            ignored = ngx_palloc(r->pool, n * sizeof(void *));[m
[31m-            if (ignored == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (params->number) {[m
[31m-                if (allocated < header[i].key.len) {[m
[31m-                    allocated = header[i].key.len + 16;[m
[31m-                    lowcase_key = ngx_pnalloc(r->pool, allocated);[m
[31m-                    if (lowcase_key == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                hash = 0;[m
[31m-[m
[31m-                for (n = 0; n < header[i].key.len; n++) {[m
[31m-                    ch = header[i].key.data[n];[m
[31m-[m
[31m-                    if (ch >= 'A' && ch <= 'Z') {[m
[31m-                        ch |= 0x20;[m
[31m-[m
[31m-                    } else if (ch == '-') {[m
[31m-                        ch = '_';[m
[31m-                    }[m
[31m-[m
[31m-                    hash = ngx_hash(hash, ch);[m
[31m-                    lowcase_key[n] = ch;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_hash_find(&params->hash, hash, lowcase_key, n)) {[m
[31m-                    ignored[header_params++] = &header[i];[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            len += sizeof("HTTP_") - 1 + header[i].key.len + 1[m
[31m-                + header[i].value.len + 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* netstring: "length:" + packet + "," */[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, NGX_SIZE_T_LEN + 1 + len + 1);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, "%ui:CONTENT_LENGTH%Z%V%Z",[m
[31m-                          len, &content_length);[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        e.ip = params->values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.request = r;[m
[31m-        e.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            lcode(&le); /* key length */[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                e.skip = 1;[m
[31m-[m
[31m-                while (*(uintptr_t *) e.ip) {[m
[31m-                    code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                    code((ngx_http_script_engine_t *) &e);[m
[31m-                }[m
[31m-                e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-                e.skip = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-            key = e.pos;[m
[31m-#endif[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) & e);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-            val = e.pos;[m
[31m-#endif[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-            *e.pos++ = '\0';[m
[31m-            e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "scgi param: \"%s: %s\"", key, val);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            for (n = 0; n < header_params; n++) {[m
[31m-                if (&header[i] == ignored[n]) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            key = b->last;[m
[31m-            b->last = ngx_cpymem(key, "HTTP_", sizeof("HTTP_") - 1);[m
[31m-[m
[31m-            for (n = 0; n < header[i].key.len; n++) {[m
[31m-                ch = header[i].key.data[n];[m
[31m-[m
[31m-                if (ch >= 'a' && ch <= 'z') {[m
[31m-                    ch &= ~0x20;[m
[31m-[m
[31m-                } else if (ch == '-') {[m
[31m-                    ch = '_';[m
[31m-                }[m
[31m-[m
[31m-                *b->last++ = ch;[m
[31m-            }[m
[31m-[m
[31m-            *b->last++ = (u_char) 0;[m
[31m-[m
[31m-            val = b->last;[m
[31m-            b->last = ngx_copy(val, header[i].value.data, header[i].value.len);[m
[31m-            *b->last++ = (u_char) 0;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "scgi param: \"%s: %s\"", key, val);[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *b->last++ = (u_char) ',';[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    } else if (scf->upstream.pass_request_body) {[m
[31m-        body = r->upstream->request_bufs;[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-[m
[31m-        while (body) {[m
[31m-            b = ngx_alloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl->next == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl = cl->next;[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_status_t  *status;[m
[31m-[m
[31m-    status = ngx_http_get_module_ctx(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    status->code = 0;[m
[31m-    status->count = 0;[m
[31m-    status->start = NULL;[m
[31m-    status->end = NULL;[m
[31m-[m
[31m-    r->upstream->process_header = ngx_http_scgi_process_status_line;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_process_status_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                len;[m
[31m-    ngx_int_t             rc;[m
[31m-    ngx_http_status_t    *status;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    status = ngx_http_get_module_ctx(r, ngx_http_scgi_module);[m
[31m-[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, &u->buffer, status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        u->process_header = ngx_http_scgi_process_header;[m
[31m-        return ngx_http_scgi_process_header(r);[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->status == 0) {[m
[31m-        u->state->status = status->code;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = status->code;[m
[31m-[m
[31m-    len = status->end - status->start;[m
[31m-    u->headers_in.status_line.len = len;[m
[31m-[m
[31m-    u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (u->headers_in.status_line.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u->headers_in.status_line.data, status->start, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http scgi status %ui \"%V\"",[m
[31m-                   u->headers_in.status_n, &u->headers_in.status_line);[m
[31m-[m
[31m-    u->process_header = ngx_http_scgi_process_header;[m
[31m-[m
[31m-    return ngx_http_scgi_process_header(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *status_line;[m
[31m-    ngx_int_t                       rc, status;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            h->key.data = ngx_pnalloc(r->pool,[m
[31m-                                      h->key.len + 1 + h->value.len + 1[m
[31m-                                      + h->key.len);[m
[31m-            if (h->key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->value.data = h->key.data + h->key.len + 1;[m
[31m-            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;[m
[31m-[m
[31m-            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-            ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http scgi header: \"%V: %V\"", &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http scgi header done");[m
[31m-[m
[31m-            u = r->upstream;[m
[31m-[m
[31m-            if (u->headers_in.status_n) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (u->headers_in.status) {[m
[31m-                status_line = &u->headers_in.status->value;[m
[31m-[m
[31m-                status = ngx_atoi(status_line->data, 3);[m
[31m-                if (status == NGX_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "upstream sent invalid status \"%V\"",[m
[31m-                                  status_line);[m
[31m-                    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-                }[m
[31m-[m
[31m-                u->headers_in.status_n = status;[m
[31m-                u->headers_in.status_line = *status_line;[m
[31m-[m
[31m-            } else if (u->headers_in.location) {[m
[31m-                u->headers_in.status_n = 302;[m
[31m-                ngx_str_set(&u->headers_in.status_line,[m
[31m-                            "302 Moved Temporarily");[m
[31m-[m
[31m-            } else {[m
[31m-                u->headers_in.status_n = 200;[m
[31m-                ngx_str_set(&u->headers_in.status_line, "200 OK");[m
[31m-            }[m
[31m-[m
[31m-            if (u->state && u->state->status == 0) {[m
[31m-                u->state->status = u->headers_in.status_n;[m
[31m-            }[m
[31m-[m
[31m-        done:[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS[m
[31m-                && r->headers_in.upgrade)[m
[31m-            {[m
[31m-                u->upgrade = 1;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid header");[m
[31m-[m
[31m-        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_scgi_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http scgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http scgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_scgi_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_scgi_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_scgi_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-    /* "scgi_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "scgi");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *prev = parent;[m
[31m-    ngx_http_scgi_loc_conf_t *conf = child;[m
[31m-[m
[31m-    size_t                        size;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store, prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"scgi_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-            conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"scgi_busy_buffers_size\" must be equal to or greater "[m
[31m-            "than the maximum of the value of \"scgi_buffer_size\" and "[m
[31m-            "one of the \"scgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"scgi_busy_buffers_size\" must be less than "[m
[31m-            "the size of all \"scgi_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-            conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"scgi_temp_file_write_size\" must be equal to or greater than "[m
[31m-            "the maximum of the value of \"scgi_buffer_size\" and "[m
[31m-            "one of the \"scgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-            conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"scgi_max_temp_file_size\" must be equal to zero to disable "[m
[31m-            "temporary files usage or must be equal to or greater than "[m
[31m-            "the maximum of the value of \"scgi_buffer_size\" and "[m
[31m-            "one of the \"scgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                                 prev->upstream.ignore_headers,[m
[31m-                                 NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                                 prev->upstream.next_upstream,[m
[31m-                                 (NGX_CONF_BITMASK_SET[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                                  prev->upstream.temp_path,[m
[31m-                                  &ngx_http_scgi_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"scgi_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache && conf->cache_key.value.data == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "no \"scgi_cache_key\" for \"scgi_cache\"");[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                         prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                         prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                         prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "scgi_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_scgi_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->scgi_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->scgi_lengths = prev->scgi_lengths;[m
[31m-        conf->scgi_values = prev->scgi_values;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->scgi_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_scgi_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source == NULL) {[m
[31m-        conf->params = prev->params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->params_cache = prev->params_cache;[m
[31m-#endif[m
[31m-        conf->params_source = prev->params_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_scgi_init_params(cf, conf, &conf->params, NULL);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_scgi_init_params(cf, conf, &conf->params_cache,[m
[31m-                                       ngx_http_scgi_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_scgi_init_params(ngx_conf_t *cf, ngx_http_scgi_loc_conf_t *conf,[m
[31m-    ngx_http_scgi_params_t *params, ngx_keyval_t *default_params)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i, nsrc;[m
[31m-    ngx_array_t                   headers_names, params_merged;[m
[31m-    ngx_keyval_t                 *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_upstream_param_t    *src, *s;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (params->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source == NULL && default_params == NULL) {[m
[31m-        params->hash.buckets = (void *) 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    params->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (params->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    params->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (params->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source) {[m
[31m-        src = conf->params_source->elts;[m
[31m-        nsrc = conf->params_source->nelts;[m
[31m-[m
[31m-    } else {[m
[31m-        src = NULL;[m
[31m-        nsrc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (default_params) {[m
[31m-        if (ngx_array_init(&params_merged, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_upstream_param_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = src[i];[m
[31m-        }[m
[31m-[m
[31m-        h = default_params;[m
[31m-[m
[31m-        while (h->key.len) {[m
[31m-[m
[31m-            src = params_merged.elts;[m
[31m-            nsrc = params_merged.nelts;[m
[31m-[m
[31m-            for (i = 0; i < nsrc; i++) {[m
[31m-                if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            s->key = h->key;[m
[31m-            s->value = h->value;[m
[31m-            s->skip_empty = 1;[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            h++;[m
[31m-        }[m
[31m-[m
[31m-        src = params_merged.elts;[m
[31m-        nsrc = params_merged.nelts;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-        if (src[i].key.len > sizeof("HTTP_") - 1[m
[31m-            && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0)[m
[31m-        {[m
[31m-            hk = ngx_array_push(&headers_names);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key.len = src[i].key.len - 5;[m
[31m-            hk->key.data = src[i].key.data + 5;[m
[31m-            hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-            if (src[i].value.len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].key.len + 1;[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].skip_empty;[m
[31m-[m
[31m-[m
[31m-        size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                + src[i].key.len + 1 + sizeof(uintptr_t) - 1)[m
[31m-               & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->values, size);[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = ngx_http_script_copy_code;[m
[31m-        copy->len = src[i].key.len + 1;[m
[31m-[m
[31m-        p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-        (void) ngx_cpystrn(p, src[i].key.data, src[i].key.len + 1);[m
[31m-[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &src[i].value;[m
[31m-        sc.flushes = &params->flushes;[m
[31m-        sc.lengths = &params->lengths;[m
[31m-        sc.values = &params->values;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-        code = ngx_array_push_n(params->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-    params->number = headers_names.nelts;[m
[31m-[m
[31m-    hash.hash = &params->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = 64;[m
[31m-    hash.name = "scgi_params_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *scf = conf;[m
[31m-[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (scf->upstream.upstream || scf->scgi_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_scgi_handler;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &scf->scgi_lengths;[m
[31m-        sc.values = &scf->scgi_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    scf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (scf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *scf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (scf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        scf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (scf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"scgi_cache\"";[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    scf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &scf->upstream.store_lengths;[m
[31m-    sc.values = &scf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *scf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (scf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        scf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"scgi_store\"";[m
[31m-    }[m
[31m-[m
[31m-    scf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        scf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (scf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *scf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    scf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                     &ngx_http_scgi_module);[m
[31m-    if (scf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_scgi_loc_conf_t *scf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (scf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &scf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_secure_link_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_secure_link_module.c[m
[1mdeleted file mode 100644[m
[1mindex 907ba6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_secure_link_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,368 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_md5.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t  *variable;[m
[31m-    ngx_http_complex_value_t  *md5;[m
[31m-    ngx_str_t                  secret;[m
[31m-} ngx_http_secure_link_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  expires;[m
[31m-} ngx_http_secure_link_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_secure_link_old_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_secure_link_conf_t *conf, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data);[m
[31m-static ngx_int_t ngx_http_secure_link_expires_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static void *ngx_http_secure_link_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_secure_link_add_variables(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_secure_link_commands[] = {[m
[31m-[m
[31m-    { ngx_string("secure_link"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_secure_link_conf_t, variable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("secure_link_md5"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_secure_link_conf_t, md5),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("secure_link_secret"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_secure_link_conf_t, secret),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_secure_link_module_ctx = {[m
[31m-    ngx_http_secure_link_add_variables,    /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_secure_link_create_conf,      /* create location configuration */[m
[31m-    ngx_http_secure_link_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_secure_link_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_secure_link_module_ctx,      /* module context */[m
[31m-    ngx_http_secure_link_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_secure_link_name = ngx_string("secure_link");[m
[31m-static ngx_str_t  ngx_http_secure_link_expires_name =[m
[31m-    ngx_string("secure_link_expires");[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_secure_link_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                       *p, *last;[m
[31m-    ngx_str_t                     val, hash;[m
[31m-    time_t                        expires;[m
[31m-    ngx_md5_t                     md5;[m
[31m-    ngx_http_secure_link_ctx_t   *ctx;[m
[31m-    ngx_http_secure_link_conf_t  *conf;[m
[31m-    u_char                        hash_buf[16], md5_buf[16];[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_secure_link_module);[m
[31m-[m
[31m-    if (conf->secret.data) {[m
[31m-        return ngx_http_secure_link_old_variable(r, conf, v, data);[m
[31m-    }[m
[31m-[m
[31m-    if (conf->variable == NULL || conf->md5 == NULL) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, conf->variable, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "secure link: \"%V\"", &val);[m
[31m-[m
[31m-    last = val.data + val.len;[m
[31m-[m
[31m-    p = ngx_strlchr(val.data, last, ',');[m
[31m-    expires = 0;[m
[31m-[m
[31m-    if (p) {[m
[31m-        val.len = p++ - val.data;[m
[31m-[m
[31m-        expires = ngx_atotm(p, last - p);[m
[31m-        if (expires <= 0) {[m
[31m-            goto not_found;[m
[31m-        }[m
[31m-[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_secure_link_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_secure_link_module);[m
[31m-[m
[31m-        ctx->expires.len = last - p;[m
[31m-        ctx->expires.data = p;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len > 24) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    hash.len = 16;[m
[31m-    hash.data = hash_buf;[m
[31m-[m
[31m-    if (ngx_decode_base64url(&hash, &val) != NGX_OK) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    if (hash.len != 16) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, conf->md5, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "secure link md5: \"%V\"", &val);[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, val.data, val.len);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    if (ngx_memcmp(hash_buf, md5_buf, 16) != 0) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    v->data = (u_char *) ((expires && expires < ngx_time()) ? "0" : "1");[m
[31m-    v->len = 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_secure_link_old_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_secure_link_conf_t *conf, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    u_char      *p, *start, *end, *last;[m
[31m-    size_t       len;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i;[m
[31m-    ngx_md5_t    md5;[m
[31m-    u_char       hash[16];[m
[31m-[m
[31m-    p = &r->unparsed_uri.data[1];[m
[31m-    last = r->unparsed_uri.data + r->unparsed_uri.len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        if (*p++ == '/') {[m
[31m-            start = p;[m
[31m-            goto md5_start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    goto not_found;[m
[31m-[m
[31m-md5_start:[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        if (*p++ == '/') {[m
[31m-            end = p - 1;[m
[31m-            goto url_start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    goto not_found;[m
[31m-[m
[31m-url_start:[m
[31m-[m
[31m-    len = last - p;[m
[31m-[m
[31m-    if (end - start != 32 || len == 0) {[m
[31m-        goto not_found;[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, p, len);[m
[31m-    ngx_md5_update(&md5, conf->secret.data, conf->secret.len);[m
[31m-    ngx_md5_final(hash, &md5);[m
[31m-[m
[31m-    for (i = 0; i < 16; i++) {[m
[31m-        n = ngx_hextoi(&start[2 * i], 2);[m
[31m-        if (n == NGX_ERROR || n != hash[i]) {[m
[31m-            goto not_found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-not_found:[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_secure_link_expires_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_secure_link_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_secure_link_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        v->len = ctx->expires.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = ctx->expires.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_secure_link_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_secure_link_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_secure_link_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->variable = NULL;[m
[31m-     *     conf->md5 = NULL;[m
[31m-     *     conf->secret = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_secure_link_conf_t *prev = parent;[m
[31m-    ngx_http_secure_link_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->secret.data) {[m
[31m-        if (conf->variable || conf->md5) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"secure_link_secret\" cannot be mixed with "[m
[31m-                               "\"secure_link\" and \"secure_link_md5\"");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->variable == NULL) {[m
[31m-        conf->variable = prev->variable;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->md5 == NULL) {[m
[31m-        conf->md5 = prev->md5;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->variable == NULL && conf->md5 == NULL) {[m
[31m-        conf->secret = prev->secret;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_secure_link_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_secure_link_name, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_secure_link_variable;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_secure_link_expires_name, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_secure_link_expires_variable;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_slice_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_slice_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 5e149b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_slice_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,526 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t      size;[m
[31m-} ngx_http_slice_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t       start;[m
[31m-    off_t       end;[m
[31m-    ngx_str_t   range;[m
[31m-    ngx_str_t   etag;[m
[31m-    ngx_uint_t  last;  /* unsigned  last:1; */[m
[31m-} ngx_http_slice_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    off_t       start;[m
[31m-    off_t       end;[m
[31m-    off_t       complete_length;[m
[31m-} ngx_http_slice_content_range_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_slice_header_filter(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_slice_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_slice_parse_content_range(ngx_http_request_t *r,[m
[31m-    ngx_http_slice_content_range_t *cr);[m
[31m-static ngx_int_t ngx_http_slice_range_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static off_t ngx_http_slice_get_start(ngx_http_request_t *r);[m
[31m-static void *ngx_http_slice_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_slice_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_slice_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_slice_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_slice_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("slice"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_slice_loc_conf_t, size),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_slice_filter_module_ctx = {[m
[31m-    ngx_http_slice_add_variables,          /* preconfiguration */[m
[31m-    ngx_http_slice_init,                   /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_slice_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_slice_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_slice_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_slice_filter_module_ctx,     /* module context */[m
[31m-    ngx_http_slice_filter_commands,        /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_slice_range_name = ngx_string("slice_range");[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                            end;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_table_elt_t                 *h;[m
[31m-    ngx_http_slice_ctx_t            *ctx;[m
[31m-    ngx_http_slice_loc_conf_t       *slcf;[m
[31m-    ngx_http_slice_content_range_t   cr;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT) {[m
[31m-        if (r == r->main) {[m
[31m-            ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unexpected status code %ui in slice response",[m
[31m-                      r->headers_out.status);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = r->headers_out.etag;[m
[31m-[m
[31m-    if (ctx->etag.len) {[m
[31m-        if (h == NULL[m
[31m-            || h->value.len != ctx->etag.len[m
[31m-            || ngx_strncmp(h->value.data, ctx->etag.data, ctx->etag.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "etag mismatch in slice response");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (h) {[m
[31m-        ctx->etag = h->value;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_slice_parse_content_range(r, &cr) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid range in slice response");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cr.complete_length == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "no complete length in slice response");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http slice response range: %O-%O/%O",[m
[31m-                   cr.start, cr.end, cr.complete_length);[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    end = ngx_min(cr.start + (off_t) slcf->size, cr.complete_length);[m
[31m-[m
[31m-    if (cr.start != ctx->start || cr.end != end) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unexpected range in slice response: %O-%O",[m
[31m-                      cr.start, cr.end);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->start = end;[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.status_line.len = 0;[m
[31m-    r->headers_out.content_length_n = cr.complete_length;[m
[31m-    r->headers_out.content_offset = cr.start;[m
[31m-    r->headers_out.content_range->hash = 0;[m
[31m-    r->headers_out.content_range = NULL;[m
[31m-[m
[31m-    r->allow_ranges = 1;[m
[31m-    r->subrequest_ranges = 1;[m
[31m-    r->single_range = 1;[m
[31m-[m
[31m-    rc = ngx_http_next_header_filter(r);[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {[m
[31m-        if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) {[m
[31m-            ctx->start = slcf->size[m
[31m-                         * (r->headers_out.content_offset / slcf->size);[m
[31m-        }[m
[31m-[m
[31m-        ctx->end = r->headers_out.content_offset[m
[31m-                   + r->headers_out.content_length_n;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->end = cr.complete_length;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_chain_t                *cl;[m
[31m-    ngx_http_request_t         *sr;[m
[31m-    ngx_http_slice_ctx_t       *ctx;[m
[31m-    ngx_http_slice_loc_conf_t  *slcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || r != r->main) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            cl->buf->last_buf = 0;[m
[31m-            cl->buf->last_in_chain = 1;[m
[31m-            cl->buf->sync = 1;[m
[31m-            ctx->last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || !ctx->last) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->start >= ctx->end) {[m
[31m-        ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);[m
[31m-        ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_subrequest(r, &r->uri, &r->args, &sr, NULL, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(sr, ctx, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    ctx->range.len = ngx_sprintf(ctx->range.data, "bytes=%O-%O", ctx->start,[m
[31m-                                 ctx->start + (off_t) slcf->size - 1)[m
[31m-                     - ctx->range.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http slice subrequest: \"%V\"", &ctx->range);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_parse_content_range(ngx_http_request_t *r,[m
[31m-    ngx_http_slice_content_range_t *cr)[m
[31m-{[m
[31m-    off_t             start, end, complete_length, cutoff, cutlim;[m
[31m-    u_char           *p;[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    h = r->headers_out.content_range;[m
[31m-[m
[31m-    if (h == NULL[m
[31m-        || h->value.len < 7[m
[31m-        || ngx_strncmp(h->value.data, "bytes ", 6) != 0)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = h->value.data + 6;[m
[31m-[m
[31m-    cutoff = NGX_MAX_OFF_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_OFF_T_VALUE % 10;[m
[31m-[m
[31m-    start = 0;[m
[31m-    end = 0;[m
[31m-    complete_length = 0;[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (*p >= '0' && *p <= '9') {[m
[31m-        if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        start = start * 10 + *p++ - '0';[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p++ != '-') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p < '0' || *p > '9') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (*p >= '0' && *p <= '9') {[m
[31m-        if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        end = end * 10 + *p++ - '0';[m
[31m-    }[m
[31m-[m
[31m-    end++;[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p++ != '/') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p != '*') {[m
[31m-        if (*p < '0' || *p > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        while (*p >= '0' && *p <= '9') {[m
[31m-            if (complete_length >= cutoff[m
[31m-                && (complete_length > cutoff || *p - '0' > cutlim))[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            complete_length = complete_length * 10 + *p++ - '0';[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        complete_length = -1;[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p != '\0') {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cr->start = start;[m
[31m-    cr->end = end;[m
[31m-    cr->complete_length = complete_length;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_range_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    ngx_http_slice_ctx_t       *ctx;[m
[31m-    ngx_http_slice_loc_conf_t  *slcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        if (r != r->main || r->headers_out.status) {[m
[31m-            v->not_found = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);[m
[31m-[m
[31m-        if (slcf->size == 0) {[m
[31m-            v->not_found = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_slice_filter_module);[m
[31m-[m
[31m-        p = ngx_pnalloc(r->pool, sizeof("bytes=-") - 1 + 2 * NGX_OFF_T_LEN);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->start = slcf->size * (ngx_http_slice_get_start(r) / slcf->size);[m
[31m-[m
[31m-        ctx->range.data = p;[m
[31m-        ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,[m
[31m-                                     ctx->start + (off_t) slcf->size - 1)[m
[31m-                         - p;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ctx->range.data;[m
[31m-    v->valid = 1;[m
[31m-    v->not_found = 0;[m
[31m-    v->no_cacheable = 1;[m
[31m-    v->len = ctx->range.len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static off_t[m
[31m-ngx_http_slice_get_start(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t             start, cutoff, cutlim;[m
[31m-    u_char           *p;[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    if (r->headers_in.if_range) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    h = r->headers_in.range;[m
[31m-[m
[31m-    if (h == NULL[m
[31m-        || h->value.len < 7[m
[31m-        || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0)[m
[31m-    {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    p = h->value.data + 6;[m
[31m-[m
[31m-    if (ngx_strchr(p, ',')) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    while (*p == ' ') { p++; }[m
[31m-[m
[31m-    if (*p == '-') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    cutoff = NGX_MAX_OFF_T_VALUE / 10;[m
[31m-    cutlim = NGX_MAX_OFF_T_VALUE % 10;[m
[31m-[m
[31m-    start = 0;[m
[31m-[m
[31m-    while (*p >= '0' && *p <= '9') {[m
[31m-        if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        start = start * 10 + *p++ - '0';[m
[31m-    }[m
[31m-[m
[31m-    return start;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_slice_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_slice_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_palloc(cf->pool, sizeof(ngx_http_slice_loc_conf_t));[m
[31m-    if (slcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    slcf->size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return slcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_slice_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_slice_loc_conf_t *prev = parent;[m
[31m-    ngx_http_slice_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->size, prev->size, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_slice_range_name, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_slice_range_variable;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_slice_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_slice_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_slice_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_split_clients_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_split_clients_module.c[m
[1mdeleted file mode 100644[m
[1mindex 2f92c9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_split_clients_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,246 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t                    percent;[m
[31m-    ngx_http_variable_value_t   value;[m
[31m-} ngx_http_split_clients_part_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t    value;[m
[31m-    ngx_array_t                 parts;[m
[31m-} ngx_http_split_clients_ctx_t;[m
[31m-[m
[31m-[m
[31m-static char *ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_split_clients(ngx_conf_t *cf, ngx_command_t *dummy,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_command_t  ngx_http_split_clients_commands[] = {[m
[31m-[m
[31m-    { ngx_string("split_clients"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_split_clients_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_split_clients_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_split_clients_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_split_clients_module_ctx,    /* module context */[m
[31m-    ngx_http_split_clients_commands,       /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_split_clients_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_split_clients_ctx_t *ctx = (ngx_http_split_clients_ctx_t *) data;[m
[31m-[m
[31m-    uint32_t                        hash;[m
[31m-    ngx_str_t                       val;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_http_split_clients_part_t  *part;[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &ctx->value, &val) != NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_murmur_hash2(val.data, val.len);[m
[31m-[m
[31m-    part = ctx->parts.elts;[m
[31m-[m
[31m-    for (i = 0; i < ctx->parts.nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http split: %uD %uD", hash, part[i].percent);[m
[31m-[m
[31m-        if (hash < part[i].percent || part[i].percent == 0) {[m
[31m-            *v = part[i].value;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                                *rv;[m
[31m-    uint32_t                             sum, last;[m
[31m-    ngx_str_t                           *value, name;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_conf_t                           save;[m
[31m-    ngx_http_variable_t                 *var;[m
[31m-    ngx_http_split_clients_ctx_t        *ctx;[m
[31m-    ngx_http_split_clients_part_t       *part;[m
[31m-    ngx_http_compile_complex_value_t     ccv;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_split_clients_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &ctx->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name = value[2];[m
[31m-[m
[31m-    if (name.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name.len--;[m
[31m-    name.data++;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_split_clients_variable;[m
[31m-    var->data = (uintptr_t) ctx;[m
[31m-[m
[31m-    if (ngx_array_init(&ctx->parts, cf->pool, 2,[m
[31m-                       sizeof(ngx_http_split_clients_part_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->handler = ngx_http_split_clients;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    sum = 0;[m
[31m-    last = 0;[m
[31m-    part = ctx->parts.elts;[m
[31m-[m
[31m-    for (i = 0; i < ctx->parts.nelts; i++) {[m
[31m-        sum = part[i].percent ? sum + part[i].percent : 10000;[m
[31m-        if (sum > 10000) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "percent total is greater than 100%%");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (part[i].percent) {[m
[31m-            last += part[i].percent * (uint64_t) 0xffffffff / 10000;[m
[31m-            part[i].percent = last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_split_clients(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    ngx_int_t                       n;[m
[31m-    ngx_str_t                      *value;[m
[31m-    ngx_http_split_clients_ctx_t   *ctx;[m
[31m-    ngx_http_split_clients_part_t  *part;[m
[31m-[m
[31m-    ctx = cf->ctx;[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    part = ngx_array_push(&ctx->parts);[m
[31m-    if (part == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[0].len == 1 && value[0].data[0] == '*') {[m
[31m-        part->percent = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        if (value[0].len == 0 || value[0].data[value[0].len - 1] != '%') {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_atofp(value[0].data, value[0].len - 1, 2);[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            goto invalid;[m
[31m-        }[m
[31m-[m
[31m-        part->percent = (uint32_t) n;[m
[31m-    }[m
[31m-[m
[31m-    part->value.len = value[1].len;[m
[31m-    part->value.valid = 1;[m
[31m-    part->value.no_cacheable = 0;[m
[31m-    part->value.not_found = 0;[m
[31m-    part->value.data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid percent value \"%V\"", &value[0]);[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex fc6e65b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,2930 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#define NGX_HTTP_SSI_ERROR          1[m
[31m-[m
[31m-#define NGX_HTTP_SSI_DATE_LEN       2048[m
[31m-[m
[31m-#define NGX_HTTP_SSI_ADD_PREFIX     1[m
[31m-#define NGX_HTTP_SSI_ADD_ZERO       2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t    enable;[m
[31m-    ngx_flag_t    silent_errors;[m
[31m-    ngx_flag_t    ignore_recycled_buffers;[m
[31m-    ngx_flag_t    last_modified;[m
[31m-[m
[31m-    ngx_hash_t    types;[m
[31m-[m
[31m-    size_t        min_file_chunk;[m
[31m-    size_t        value_len;[m
[31m-[m
[31m-    ngx_array_t  *types_keys;[m
[31m-} ngx_http_ssi_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     name;[m
[31m-    ngx_uint_t    key;[m
[31m-    ngx_str_t     value;[m
[31m-} ngx_http_ssi_var_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     name;[m
[31m-    ngx_chain_t  *bufs;[m
[31m-    ngx_uint_t    count;[m
[31m-} ngx_http_ssi_block_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ssi_start_state = 0,[m
[31m-    ssi_tag_state,[m
[31m-    ssi_comment0_state,[m
[31m-    ssi_comment1_state,[m
[31m-    ssi_sharp_state,[m
[31m-    ssi_precommand_state,[m
[31m-    ssi_command_state,[m
[31m-    ssi_preparam_state,[m
[31m-    ssi_param_state,[m
[31m-    ssi_preequal_state,[m
[31m-    ssi_prevalue_state,[m
[31m-    ssi_double_quoted_value_state,[m
[31m-    ssi_quoted_value_state,[m
[31m-    ssi_quoted_symbol_state,[m
[31m-    ssi_postparam_state,[m
[31m-    ssi_comment_end0_state,[m
[31m-    ssi_comment_end1_state,[m
[31m-    ssi_error_state,[m
[31m-    ssi_error_end0_state,[m
[31m-    ssi_error_end1_state[m
[31m-} ngx_http_ssi_state_e;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssi_output(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx);[m
[31m-static void ngx_http_ssi_buffered(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx);[m
[31m-static ngx_str_t *ngx_http_ssi_get_variable(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name, ngx_uint_t key);[m
[31m-static ngx_int_t ngx_http_ssi_evaluate_string(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t *text, ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_http_ssi_regex_match(ngx_http_request_t *r,[m
[31m-    ngx_str_t *pattern, ngx_str_t *str);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssi_include(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_stub_output(ngx_http_request_t *r, void *data,[m
[31m-    ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_ssi_set_variable(ngx_http_request_t *r, void *data,[m
[31m-    ngx_int_t rc);[m
[31m-static ngx_int_t ngx_http_ssi_echo(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_config(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_set(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_if(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_else(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_endif(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_block(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-static ngx_int_t ngx_http_ssi_endblock(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **params);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssi_date_gmt_local_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t gmt);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssi_preconfiguration(ngx_conf_t *cf);[m
[31m-static void *ngx_http_ssi_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_ssi_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_ssi_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_ssi_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_ssi_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_ssi_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssi"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_silent_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, silent_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_ignore_recycled_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, ignore_recycled_buffers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_min_file_chunk"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, min_file_chunk),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_value_length"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, value_len),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssi_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, types_keys),[m
[31m-      &ngx_http_html_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("ssi_last_modified"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssi_loc_conf_t, last_modified),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_ssi_filter_module_ctx = {[m
[31m-    ngx_http_ssi_preconfiguration,         /* preconfiguration */[m
[31m-    ngx_http_ssi_filter_init,              /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_ssi_create_main_conf,         /* create main configuration */[m
[31m-    ngx_http_ssi_init_main_conf,           /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_ssi_create_loc_conf,          /* create location configuration */[m
[31m-    ngx_http_ssi_merge_loc_conf            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_ssi_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_ssi_filter_module_ctx,       /* module context */[m
[31m-    ngx_http_ssi_filter_commands,          /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_ssi_string[] = "<!--";[m
[31m-[m
[31m-static ngx_str_t ngx_http_ssi_none = ngx_string("(none)");[m
[31m-static ngx_str_t ngx_http_ssi_timefmt = ngx_string("%A, %d-%b-%Y %H:%M:%S %Z");[m
[31m-static ngx_str_t ngx_http_ssi_null_string = ngx_null_string;[m
[31m-[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_VIRTUAL  0[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_FILE     1[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_WAIT     2[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_SET      3[m
[31m-#define  NGX_HTTP_SSI_INCLUDE_STUB     4[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_ECHO_VAR         0[m
[31m-#define  NGX_HTTP_SSI_ECHO_DEFAULT     1[m
[31m-#define  NGX_HTTP_SSI_ECHO_ENCODING    2[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_CONFIG_ERRMSG    0[m
[31m-#define  NGX_HTTP_SSI_CONFIG_TIMEFMT   1[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_SET_VAR          0[m
[31m-#define  NGX_HTTP_SSI_SET_VALUE        1[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_IF_EXPR          0[m
[31m-[m
[31m-#define  NGX_HTTP_SSI_BLOCK_NAME       0[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_include_params[] = {[m
[31m-    { ngx_string("virtual"), NGX_HTTP_SSI_INCLUDE_VIRTUAL, 0, 0 },[m
[31m-    { ngx_string("file"), NGX_HTTP_SSI_INCLUDE_FILE, 0, 0 },[m
[31m-    { ngx_string("wait"), NGX_HTTP_SSI_INCLUDE_WAIT, 0, 0 },[m
[31m-    { ngx_string("set"), NGX_HTTP_SSI_INCLUDE_SET, 0, 0 },[m
[31m-    { ngx_string("stub"), NGX_HTTP_SSI_INCLUDE_STUB, 0, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_echo_params[] = {[m
[31m-    { ngx_string("var"), NGX_HTTP_SSI_ECHO_VAR, 1, 0 },[m
[31m-    { ngx_string("default"), NGX_HTTP_SSI_ECHO_DEFAULT, 0, 0 },[m
[31m-    { ngx_string("encoding"), NGX_HTTP_SSI_ECHO_ENCODING, 0, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_config_params[] = {[m
[31m-    { ngx_string("errmsg"), NGX_HTTP_SSI_CONFIG_ERRMSG, 0, 0 },[m
[31m-    { ngx_string("timefmt"), NGX_HTTP_SSI_CONFIG_TIMEFMT, 0, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_set_params[] = {[m
[31m-    { ngx_string("var"), NGX_HTTP_SSI_SET_VAR, 1, 0 },[m
[31m-    { ngx_string("value"), NGX_HTTP_SSI_SET_VALUE, 1, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_if_params[] = {[m
[31m-    { ngx_string("expr"), NGX_HTTP_SSI_IF_EXPR, 1, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_block_params[] = {[m
[31m-    { ngx_string("name"), NGX_HTTP_SSI_BLOCK_NAME, 1, 0 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_ssi_no_params[] = {[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_command_t  ngx_http_ssi_commands[] = {[m
[31m-    { ngx_string("include"), ngx_http_ssi_include,[m
[31m-                       ngx_http_ssi_include_params, 0, 0, 1 },[m
[31m-    { ngx_string("echo"), ngx_http_ssi_echo,[m
[31m-                       ngx_http_ssi_echo_params, 0, 0, 0 },[m
[31m-    { ngx_string("config"), ngx_http_ssi_config,[m
[31m-                       ngx_http_ssi_config_params, 0, 0, 0 },[m
[31m-    { ngx_string("set"), ngx_http_ssi_set, ngx_http_ssi_set_params, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("if"), ngx_http_ssi_if, ngx_http_ssi_if_params, 0, 0, 0 },[m
[31m-    { ngx_string("elif"), ngx_http_ssi_if, ngx_http_ssi_if_params,[m
[31m-                       NGX_HTTP_SSI_COND_IF, 0, 0 },[m
[31m-    { ngx_string("else"), ngx_http_ssi_else, ngx_http_ssi_no_params,[m
[31m-                       NGX_HTTP_SSI_COND_IF, 0, 0 },[m
[31m-    { ngx_string("endif"), ngx_http_ssi_endif, ngx_http_ssi_no_params,[m
[31m-                       NGX_HTTP_SSI_COND_ELSE, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("block"), ngx_http_ssi_block,[m
[31m-                       ngx_http_ssi_block_params, 0, 0, 0 },[m
[31m-    { ngx_string("endblock"), ngx_http_ssi_endblock,[m
[31m-                       ngx_http_ssi_no_params, 0, 1, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_ssi_vars[] = {[m
[31m-[m
[31m-    { ngx_string("date_local"), NULL, ngx_http_ssi_date_gmt_local_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("date_gmt"), NULL, ngx_http_ssi_date_gmt_local_variable, 1,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_ssi_ctx_t       *ctx;[m
[31m-    ngx_http_ssi_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (!slcf->enable[m
[31m-        || r->headers_out.content_length_n == 0[m
[31m-        || ngx_http_test_content_type(r, &slcf->types) == NULL)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_ssi_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-[m
[31m-    ctx->value_len = slcf->value_len;[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    ctx->encoding = NGX_HTTP_SSI_ENTITY_ENCODING;[m
[31m-    ctx->output = 1;[m
[31m-[m
[31m-    ctx->params.elts = ctx->params_array;[m
[31m-    ctx->params.size = sizeof(ngx_table_elt_t);[m
[31m-    ctx->params.nalloc = NGX_HTTP_SSI_PARAMS_N;[m
[31m-    ctx->params.pool = r->pool;[m
[31m-[m
[31m-    ctx->timefmt = ngx_http_ssi_timefmt;[m
[31m-    ngx_str_set(&ctx->errmsg,[m
[31m-                "[an error occurred while processing the directive]");[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-        ngx_http_clear_accept_ranges(r);[m
[31m-[m
[31m-        if (!slcf->last_modified) {[m
[31m-            ngx_http_clear_last_modified(r);[m
[31m-            ngx_http_clear_etag(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_http_weak_etag(r);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     len;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_uint_t                 i, index;[m
[31m-    ngx_chain_t               *cl, **ll;[m
[31m-    ngx_table_elt_t           *param;[m
[31m-    ngx_http_ssi_ctx_t        *ctx, *mctx;[m
[31m-    ngx_http_ssi_block_t      *bl;[m
[31m-    ngx_http_ssi_param_t      *prm;[m
[31m-    ngx_http_ssi_command_t    *cmd;[m
[31m-    ngx_http_ssi_loc_conf_t   *slcf;[m
[31m-    ngx_http_ssi_main_conf_t  *smcf;[m
[31m-    ngx_str_t                 *params[NGX_HTTP_SSI_MAX_PARAMS + 1];[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL[m
[31m-        || (in == NULL[m
[31m-            && ctx->buf == NULL[m
[31m-            && ctx->in == NULL[m
[31m-            && ctx->busy == NULL))[m
[31m-    {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    /* add the incoming chain to the chain ctx->in */[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http ssi filter \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ctx->wait) {[m
[31m-[m
[31m-        if (r != r->connection->data) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http ssi filter wait \"%V?%V\" non-active",[m
[31m-                           &ctx->wait->uri, &ctx->wait->args);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->wait->done) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http ssi filter wait \"%V?%V\" done",[m
[31m-                           &ctx->wait->uri, &ctx->wait->args);[m
[31m-[m
[31m-            ctx->wait = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http ssi filter wait \"%V?%V\"",[m
[31m-                           &ctx->wait->uri, &ctx->wait->args);[m
[31m-[m
[31m-            return ngx_http_next_body_filter(r, NULL);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    while (ctx->in || ctx->buf) {[m
[31m-[m
[31m-        if (ctx->buf == NULL) {[m
[31m-            ctx->buf = ctx->in->buf;[m
[31m-            ctx->in = ctx->in->next;[m
[31m-            ctx->pos = ctx->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->state == ssi_start_state) {[m
[31m-            ctx->copy_start = ctx->pos;[m
[31m-            ctx->copy_end = ctx->pos;[m
[31m-        }[m
[31m-[m
[31m-        b = NULL;[m
[31m-[m
[31m-        while (ctx->pos < ctx->buf->last) {[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "saved: %uz state: %ui", ctx->saved, ctx->state);[m
[31m-[m
[31m-            rc = ngx_http_ssi_parse(r, ctx);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "parse: %i, looked: %uz %p-%p",[m
[31m-                           rc, ctx->looked, ctx->copy_start, ctx->copy_end);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->copy_start != ctx->copy_end) {[m
[31m-[m
[31m-                if (ctx->output) {[m
[31m-[m
[31m-                    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "saved: %uz", ctx->saved);[m
[31m-[m
[31m-                    if (ctx->saved) {[m
[31m-[m
[31m-                        if (ctx->free) {[m
[31m-                            cl = ctx->free;[m
[31m-                            ctx->free = ctx->free->next;[m
[31m-                            b = cl->buf;[m
[31m-                            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                        } else {[m
[31m-                            b = ngx_calloc_buf(r->pool);[m
[31m-                            if (b == NULL) {[m
[31m-                                return NGX_ERROR;[m
[31m-                            }[m
[31m-[m
[31m-                            cl = ngx_alloc_chain_link(r->pool);[m
[31m-                            if (cl == NULL) {[m
[31m-                                return NGX_ERROR;[m
[31m-                            }[m
[31m-[m
[31m-                            cl->buf = b;[m
[31m-                        }[m
[31m-[m
[31m-                        b->memory = 1;[m
[31m-                        b->pos = ngx_http_ssi_string;[m
[31m-                        b->last = ngx_http_ssi_string + ctx->saved;[m
[31m-[m
[31m-                        *ctx->last_out = cl;[m
[31m-                        ctx->last_out = &cl->next;[m
[31m-[m
[31m-                        ctx->saved = 0;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ctx->free) {[m
[31m-                        cl = ctx->free;[m
[31m-                        ctx->free = ctx->free->next;[m
[31m-                        b = cl->buf;[m
[31m-[m
[31m-                    } else {[m
[31m-                        b = ngx_alloc_buf(r->pool);[m
[31m-                        if (b == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl = ngx_alloc_chain_link(r->pool);[m
[31m-                        if (cl == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl->buf = b;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                    b->pos = ctx->copy_start;[m
[31m-                    b->last = ctx->copy_end;[m
[31m-                    b->shadow = NULL;[m
[31m-                    b->last_buf = 0;[m
[31m-                    b->recycled = 0;[m
[31m-[m
[31m-                    if (b->in_file) {[m
[31m-                        if (slcf->min_file_chunk < (size_t) (b->last - b->pos))[m
[31m-                        {[m
[31m-                            b->file_last = b->file_pos[m
[31m-                                                   + (b->last - ctx->buf->pos);[m
[31m-                            b->file_pos += b->pos - ctx->buf->pos;[m
[31m-[m
[31m-                        } else {[m
[31m-                            b->in_file = 0;[m
[31m-                        }[m
[31m-                    }[m
[31m-[m
[31m-                    cl->next = NULL;[m
[31m-                    *ctx->last_out = cl;[m
[31m-                    ctx->last_out = &cl->next;[m
[31m-[m
[31m-                } else {[m
[31m-                    if (ctx->block[m
[31m-                        && ctx->saved + (ctx->copy_end - ctx->copy_start))[m
[31m-                    {[m
[31m-                        b = ngx_create_temp_buf(r->pool,[m
[31m-                               ctx->saved + (ctx->copy_end - ctx->copy_start));[m
[31m-[m
[31m-                        if (b == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        if (ctx->saved) {[m
[31m-                            b->last = ngx_cpymem(b->pos, ngx_http_ssi_string,[m
[31m-                                                 ctx->saved);[m
[31m-                        }[m
[31m-[m
[31m-                        b->last = ngx_cpymem(b->last, ctx->copy_start,[m
[31m-                                             ctx->copy_end - ctx->copy_start);[m
[31m-[m
[31m-                        cl = ngx_alloc_chain_link(r->pool);[m
[31m-                        if (cl == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl->buf = b;[m
[31m-                        cl->next = NULL;[m
[31m-[m
[31m-                        b = NULL;[m
[31m-[m
[31m-                        mctx = ngx_http_get_module_ctx(r->main,[m
[31m-                                                   ngx_http_ssi_filter_module);[m
[31m-                        bl = mctx->blocks->elts;[m
[31m-                        for (ll = &bl[mctx->blocks->nelts - 1].bufs;[m
[31m-                             *ll;[m
[31m-                             ll = &(*ll)->next)[m
[31m-                        {[m
[31m-                            /* void */[m
[31m-                        }[m
[31m-[m
[31m-                        *ll = cl;[m
[31m-                    }[m
[31m-[m
[31m-                    ctx->saved = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->state == ssi_start_state) {[m
[31m-                ctx->copy_start = ctx->pos;[m
[31m-                ctx->copy_end = ctx->pos;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->copy_start = NULL;[m
[31m-                ctx->copy_end = NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            b = NULL;[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                smcf = ngx_http_get_module_main_conf(r,[m
[31m-                                                   ngx_http_ssi_filter_module);[m
[31m-[m
[31m-                cmd = ngx_hash_find(&smcf->hash, ctx->key, ctx->command.data,[m
[31m-                                    ctx->command.len);[m
[31m-[m
[31m-                if (cmd == NULL) {[m
[31m-                    if (ctx->output) {[m
[31m-                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                      "invalid SSI command: \"%V\"",[m
[31m-                                      &ctx->command);[m
[31m-                        goto ssi_error;[m
[31m-                    }[m
[31m-[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (!ctx->output && !cmd->block) {[m
[31m-[m
[31m-                    if (ctx->block) {[m
[31m-[m
[31m-                        /* reconstruct the SSI command text */[m
[31m-[m
[31m-                        len = 5 + ctx->command.len + 4;[m
[31m-[m
[31m-                        param = ctx->params.elts;[m
[31m-                        for (i = 0; i < ctx->params.nelts; i++) {[m
[31m-                            len += 1 + param[i].key.len + 2[m
[31m-                                + param[i].value.len + 1;[m
[31m-                        }[m
[31m-[m
[31m-                        b = ngx_create_temp_buf(r->pool, len);[m
[31m-[m
[31m-                        if (b == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl = ngx_alloc_chain_link(r->pool);[m
[31m-                        if (cl == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        cl->buf = b;[m
[31m-                        cl->next = NULL;[m
[31m-[m
[31m-                        *b->last++ = '<';[m
[31m-                        *b->last++ = '!';[m
[31m-                        *b->last++ = '-';[m
[31m-                        *b->last++ = '-';[m
[31m-                        *b->last++ = '#';[m
[31m-[m
[31m-                        b->last = ngx_cpymem(b->last, ctx->command.data,[m
[31m-                                             ctx->command.len);[m
[31m-[m
[31m-                        for (i = 0; i < ctx->params.nelts; i++) {[m
[31m-                            *b->last++ = ' ';[m
[31m-                            b->last = ngx_cpymem(b->last, param[i].key.data,[m
[31m-                                                 param[i].key.len);[m
[31m-                            *b->last++ = '=';[m
[31m-                            *b->last++ = '"';[m
[31m-                            b->last = ngx_cpymem(b->last, param[i].value.data,[m
[31m-                                                 param[i].value.len);[m
[31m-                            *b->last++ = '"';[m
[31m-                        }[m
[31m-[m
[31m-                        *b->last++ = ' ';[m
[31m-                        *b->last++ = '-';[m
[31m-                        *b->last++ = '-';[m
[31m-                        *b->last++ = '>';[m
[31m-[m
[31m-                        mctx = ngx_http_get_module_ctx(r->main,[m
[31m-                                                   ngx_http_ssi_filter_module);[m
[31m-                        bl = mctx->blocks->elts;[m
[31m-                        for (ll = &bl[mctx->blocks->nelts - 1].bufs;[m
[31m-                             *ll;[m
[31m-                             ll = &(*ll)->next)[m
[31m-                        {[m
[31m-                            /* void */[m
[31m-                        }[m
[31m-[m
[31m-                        *ll = cl;[m
[31m-[m
[31m-                        b = NULL;[m
[31m-[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    if (cmd->conditional == 0) {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (cmd->conditional[m
[31m-                    && (ctx->conditional == 0[m
[31m-                        || ctx->conditional > cmd->conditional))[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "invalid context of SSI command: \"%V\"",[m
[31m-                                  &ctx->command);[m
[31m-                    goto ssi_error;[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->params.nelts > NGX_HTTP_SSI_MAX_PARAMS) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "too many SSI command parameters: \"%V\"",[m
[31m-                                  &ctx->command);[m
[31m-                    goto ssi_error;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memzero(params,[m
[31m-                           (NGX_HTTP_SSI_MAX_PARAMS + 1) * sizeof(ngx_str_t *));[m
[31m-[m
[31m-                param = ctx->params.elts;[m
[31m-[m
[31m-                for (i = 0; i < ctx->params.nelts; i++) {[m
[31m-[m
[31m-                    for (prm = cmd->params; prm->name.len; prm++) {[m
[31m-[m
[31m-                        if (param[i].key.len != prm->name.len[m
[31m-                            || ngx_strncmp(param[i].key.data, prm->name.data,[m
[31m-                                           prm->name.len) != 0)[m
[31m-                        {[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                        if (!prm->multiple) {[m
[31m-                            if (params[prm->index]) {[m
[31m-                                ngx_log_error(NGX_LOG_ERR,[m
[31m-                                              r->connection->log, 0,[m
[31m-                                              "duplicate \"%V\" parameter "[m
[31m-                                              "in \"%V\" SSI command",[m
[31m-                                              &param[i].key, &ctx->command);[m
[31m-[m
[31m-                                goto ssi_error;[m
[31m-                            }[m
[31m-[m
[31m-                            params[prm->index] = &param[i].value;[m
[31m-[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        for (index = prm->index; params[index]; index++) {[m
[31m-                            /* void */[m
[31m-                        }[m
[31m-[m
[31m-                        params[index] = &param[i].value;[m
[31m-[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (prm->name.len == 0) {[m
[31m-                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                      "invalid parameter name: \"%V\" "[m
[31m-                                      "in \"%V\" SSI command",[m
[31m-                                      &param[i].key, &ctx->command);[m
[31m-[m
[31m-                        goto ssi_error;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                for (prm = cmd->params; prm->name.len; prm++) {[m
[31m-                    if (prm->mandatory && params[prm->index] == 0) {[m
[31m-                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                      "mandatory \"%V\" parameter is absent "[m
[31m-                                      "in \"%V\" SSI command",[m
[31m-                                      &prm->name, &ctx->command);[m
[31m-[m
[31m-                        goto ssi_error;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (cmd->flush && ctx->out) {[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "ssi flush");[m
[31m-[m
[31m-                    if (ngx_http_ssi_output(r, ctx) == NGX_ERROR) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                rc = cmd->handler(r, ctx, params);[m
[31m-[m
[31m-                if (rc == NGX_OK) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (rc == NGX_DONE || rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-                    ngx_http_ssi_buffered(r, ctx);[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            /* rc == NGX_HTTP_SSI_ERROR */[m
[31m-[m
[31m-    ssi_error:[m
[31m-[m
[31m-            if (slcf->silent_errors) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->free) {[m
[31m-                cl = ctx->free;[m
[31m-                ctx->free = ctx->free->next;[m
[31m-                b = cl->buf;[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            } else {[m
[31m-                b = ngx_calloc_buf(r->pool);[m
[31m-                if (b == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf = b;[m
[31m-            }[m
[31m-[m
[31m-            b->memory = 1;[m
[31m-            b->pos = ctx->errmsg.data;[m
[31m-            b->last = ctx->errmsg.data + ctx->errmsg.len;[m
[31m-[m
[31m-            cl->next = NULL;[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->buf->last_buf || ngx_buf_in_memory(ctx->buf)) {[m
[31m-            if (b == NULL) {[m
[31m-                if (ctx->free) {[m
[31m-                    cl = ctx->free;[m
[31m-                    ctx->free = ctx->free->next;[m
[31m-                    b = cl->buf;[m
[31m-                    ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                } else {[m
[31m-                    b = ngx_calloc_buf(r->pool);[m
[31m-                    if (b == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    cl = ngx_alloc_chain_link(r->pool);[m
[31m-                    if (cl == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    cl->buf = b;[m
[31m-                }[m
[31m-[m
[31m-                b->sync = 1;[m
[31m-[m
[31m-                cl->next = NULL;[m
[31m-                *ctx->last_out = cl;[m
[31m-                ctx->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            b->last_buf = ctx->buf->last_buf;[m
[31m-            b->shadow = ctx->buf;[m
[31m-[m
[31m-            if (slcf->ignore_recycled_buffers == 0)  {[m
[31m-                b->recycled = ctx->buf->recycled;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ctx->buf = NULL;[m
[31m-[m
[31m-        ctx->saved = ctx->looked;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->out == NULL && ctx->busy == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_ssi_output(r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_output(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-#if 1[m
[31m-    b = NULL;[m
[31m-    for (cl = ctx->out; cl; cl = cl->next) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "ssi out: %p %p", cl->buf, cl->buf->pos);[m
[31m-        if (cl->buf == b) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                          "the same buf was used in ssi");[m
[31m-            ngx_debug_point();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        b = cl->buf;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-    if (ctx->busy == NULL) {[m
[31m-        ctx->busy = ctx->out;[m
[31m-[m
[31m-    } else {[m
[31m-        for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }[m
[31m-        cl->next = ctx->out;[m
[31m-    }[m
[31m-[m
[31m-    ctx->out = NULL;[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    while (ctx->busy) {[m
[31m-[m
[31m-        cl = ctx->busy;[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) != 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (b->shadow) {[m
[31m-            b->shadow->pos = b->shadow->last;[m
[31m-        }[m
[31m-[m
[31m-        ctx->busy = cl->next;[m
[31m-[m
[31m-        if (ngx_buf_in_memory(b) || b->in_file) {[m
[31m-            /* add data bufs only to the free buf chain */[m
[31m-[m
[31m-            cl->next = ctx->free;[m
[31m-            ctx->free = cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_ssi_buffered(r, ctx);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssi_buffered(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)[m
[31m-{[m
[31m-    if (ctx->in || ctx->buf) {[m
[31m-        r->buffered |= NGX_HTTP_SSI_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        r->buffered &= ~NGX_HTTP_SSI_BUFFERED;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char                *p, *value, *last, *copy_end, ch;[m
[31m-    size_t                 looked;[m
[31m-    ngx_http_ssi_state_e   state;[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-    looked = ctx->looked;[m
[31m-    last = ctx->buf->last;[m
[31m-    copy_end = ctx->copy_end;[m
[31m-[m
[31m-    for (p = ctx->pos; p < last; p++) {[m
[31m-[m
[31m-        ch = *p;[m
[31m-[m
[31m-        if (state == ssi_start_state) {[m
[31m-[m
[31m-            /* the tight loop */[m
[31m-[m
[31m-            for ( ;; ) {[m
[31m-                if (ch == '<') {[m
[31m-                    copy_end = p;[m
[31m-                    looked = 1;[m
[31m-                    state = ssi_tag_state;[m
[31m-[m
[31m-                    goto tag_started;[m
[31m-                }[m
[31m-[m
[31m-                if (++p == last) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ch = *p;[m
[31m-            }[m
[31m-[m
[31m-            ctx->state = state;[m
[31m-            ctx->pos = p;[m
[31m-            ctx->looked = looked;[m
[31m-            ctx->copy_end = p;[m
[31m-[m
[31m-            if (ctx->copy_start == NULL) {[m
[31m-                ctx->copy_start = ctx->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-[m
[31m-        tag_started:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case ssi_start_state:[m
[31m-            /* not reached */[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_tag_state:[m
[31m-            switch (ch) {[m
[31m-            case '!':[m
[31m-                looked = 2;[m
[31m-                state = ssi_comment0_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '<':[m
[31m-                copy_end = p;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                copy_end = p;[m
[31m-                looked = 0;[m
[31m-                state = ssi_start_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_comment0_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                looked = 3;[m
[31m-                state = ssi_comment1_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '<':[m
[31m-                copy_end = p;[m
[31m-                looked = 1;[m
[31m-                state = ssi_tag_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                copy_end = p;[m
[31m-                looked = 0;[m
[31m-                state = ssi_start_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_comment1_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                looked = 4;[m
[31m-                state = ssi_sharp_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '<':[m
[31m-                copy_end = p;[m
[31m-                looked = 1;[m
[31m-                state = ssi_tag_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                copy_end = p;[m
[31m-                looked = 0;[m
[31m-                state = ssi_start_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_sharp_state:[m
[31m-            switch (ch) {[m
[31m-            case '#':[m
[31m-                if (p - ctx->pos < 4) {[m
[31m-                    ctx->saved = 0;[m
[31m-                }[m
[31m-                looked = 0;[m
[31m-                state = ssi_precommand_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '<':[m
[31m-                copy_end = p;[m
[31m-                looked = 1;[m
[31m-                state = ssi_tag_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                copy_end = p;[m
[31m-                looked = 0;[m
[31m-                state = ssi_start_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_precommand_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ctx->command.len = 1;[m
[31m-                ctx->command.data = ngx_pnalloc(r->pool,[m
[31m-                                                NGX_HTTP_SSI_COMMAND_LEN);[m
[31m-                if (ctx->command.data == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->command.data[0] = ch;[m
[31m-[m
[31m-                ctx->key = 0;[m
[31m-                ctx->key = ngx_hash(ctx->key, ch);[m
[31m-[m
[31m-                ctx->params.nelts = 0;[m
[31m-[m
[31m-                state = ssi_command_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_command_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                state = ssi_preparam_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '-':[m
[31m-                state = ssi_comment_end0_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (ctx->command.len == NGX_HTTP_SSI_COMMAND_LEN) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "the \"%V%c...\" SSI command is too long",[m
[31m-                                  &ctx->command, ch);[m
[31m-[m
[31m-                    state = ssi_error_state;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ctx->command.data[ctx->command.len++] = ch;[m
[31m-                ctx->key = ngx_hash(ctx->key, ch);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_preparam_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                break;[m
[31m-[m
[31m-            case '-':[m
[31m-                state = ssi_comment_end0_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ctx->param = ngx_array_push(&ctx->params);[m
[31m-                if (ctx->param == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->key.len = 1;[m
[31m-                ctx->param->key.data = ngx_pnalloc(r->pool,[m
[31m-                                                   NGX_HTTP_SSI_PARAM_LEN);[m
[31m-                if (ctx->param->key.data == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->key.data[0] = ch;[m
[31m-[m
[31m-                ctx->param->value.len = 0;[m
[31m-[m
[31m-                if (ctx->value_buf == NULL) {[m
[31m-                    ctx->param->value.data = ngx_pnalloc(r->pool,[m
[31m-                                                         ctx->value_len + 1);[m
[31m-                    if (ctx->param->value.data == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    ctx->param->value.data = ctx->value_buf;[m
[31m-                }[m
[31m-[m
[31m-                state = ssi_param_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_param_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                state = ssi_preequal_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '=':[m
[31m-                state = ssi_prevalue_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '-':[m
[31m-                state = ssi_error_end0_state;[m
[31m-[m
[31m-                ctx->param->key.data[ctx->param->key.len++] = ch;[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "invalid \"%V\" parameter in \"%V\" SSI command",[m
[31m-                              &ctx->param->key, &ctx->command);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (ctx->param->key.len == NGX_HTTP_SSI_PARAM_LEN) {[m
[31m-                    state = ssi_error_state;[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "too long \"%V%c...\" parameter in "[m
[31m-                                  "\"%V\" SSI command",[m
[31m-                                  &ctx->param->key, ch, &ctx->command);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->key.data[ctx->param->key.len++] = ch;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_preequal_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                break;[m
[31m-[m
[31m-            case '=':[m
[31m-                state = ssi_prevalue_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (ch == '-') {[m
[31m-                    state = ssi_error_end0_state;[m
[31m-                } else {[m
[31m-                    state = ssi_error_state;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol after \"%V\" "[m
[31m-                              "parameter in \"%V\" SSI command",[m
[31m-                              ch, &ctx->param->key, &ctx->command);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_prevalue_state:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                break;[m
[31m-[m
[31m-            case '"':[m
[31m-                state = ssi_double_quoted_value_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '\'':[m
[31m-                state = ssi_quoted_value_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                if (ch == '-') {[m
[31m-                    state = ssi_error_end0_state;[m
[31m-                } else {[m
[31m-                    state = ssi_error_state;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol before value of "[m
[31m-                              "\"%V\" parameter in \"%V\" SSI command",[m
[31m-                              ch, &ctx->param->key, &ctx->command);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_double_quoted_value_state:[m
[31m-            switch (ch) {[m
[31m-            case '"':[m
[31m-                state = ssi_postparam_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '\\':[m
[31m-                ctx->saved_state = ssi_double_quoted_value_state;[m
[31m-                state = ssi_quoted_symbol_state;[m
[31m-[m
[31m-                /* fall through */[m
[31m-[m
[31m-            default:[m
[31m-                if (ctx->param->value.len == ctx->value_len) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "too long \"%V%c...\" value of \"%V\" "[m
[31m-                                  "parameter in \"%V\" SSI command",[m
[31m-                                  &ctx->param->value, ch, &ctx->param->key,[m
[31m-                                  &ctx->command);[m
[31m-                    state = ssi_error_state;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->value.data[ctx->param->value.len++] = ch;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_quoted_value_state:[m
[31m-            switch (ch) {[m
[31m-            case '\'':[m
[31m-                state = ssi_postparam_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '\\':[m
[31m-                ctx->saved_state = ssi_quoted_value_state;[m
[31m-                state = ssi_quoted_symbol_state;[m
[31m-[m
[31m-                /* fall through */[m
[31m-[m
[31m-            default:[m
[31m-                if (ctx->param->value.len == ctx->value_len) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "too long \"%V%c...\" value of \"%V\" "[m
[31m-                                  "parameter in \"%V\" SSI command",[m
[31m-                                  &ctx->param->value, ch, &ctx->param->key,[m
[31m-                                  &ctx->command);[m
[31m-                    state = ssi_error_state;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                ctx->param->value.data[ctx->param->value.len++] = ch;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_quoted_symbol_state:[m
[31m-            state = ctx->saved_state;[m
[31m-[m
[31m-            if (ctx->param->value.len == ctx->value_len) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "too long \"%V%c...\" value of \"%V\" "[m
[31m-                              "parameter in \"%V\" SSI command",[m
[31m-                              &ctx->param->value, ch, &ctx->param->key,[m
[31m-                              &ctx->command);[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ctx->param->value.data[ctx->param->value.len++] = ch;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_postparam_state:[m
[31m-[m
[31m-            if (ctx->param->value.len + 1 < ctx->value_len / 2) {[m
[31m-                value = ngx_pnalloc(r->pool, ctx->param->value.len + 1);[m
[31m-                if (value == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(value, ctx->param->value.data,[m
[31m-                           ctx->param->value.len);[m
[31m-[m
[31m-                ctx->value_buf = ctx->param->value.data;[m
[31m-                ctx->param->value.data = value;[m
[31m-[m
[31m-            } else {[m
[31m-                ctx->value_buf = NULL;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-            case '\t':[m
[31m-                state = ssi_preparam_state;[m
[31m-                break;[m
[31m-[m
[31m-            case '-':[m
[31m-                state = ssi_comment_end0_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol after \"%V\" value "[m
[31m-                              "of \"%V\" parameter in \"%V\" SSI command",[m
[31m-                              ch, &ctx->param->value, &ctx->param->key,[m
[31m-                              &ctx->command);[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_comment_end0_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                state = ssi_comment_end1_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol in \"%V\" SSI command",[m
[31m-                              ch, &ctx->command);[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_comment_end1_state:[m
[31m-            switch (ch) {[m
[31m-            case '>':[m
[31m-                ctx->state = ssi_start_state;[m
[31m-                ctx->pos = p + 1;[m
[31m-                ctx->looked = looked;[m
[31m-                ctx->copy_end = copy_end;[m
[31m-[m
[31m-                if (ctx->copy_start == NULL && copy_end) {[m
[31m-                    ctx->copy_start = ctx->buf->pos;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            default:[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "unexpected \"%c\" symbol in \"%V\" SSI command",[m
[31m-                              ch, &ctx->command);[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_error_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                state = ssi_error_end0_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_error_end0_state:[m
[31m-            switch (ch) {[m
[31m-            case '-':[m
[31m-                state = ssi_error_end1_state;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ssi_error_end1_state:[m
[31m-            switch (ch) {[m
[31m-            case '>':[m
[31m-                ctx->state = ssi_start_state;[m
[31m-                ctx->pos = p + 1;[m
[31m-                ctx->looked = looked;[m
[31m-                ctx->copy_end = copy_end;[m
[31m-[m
[31m-                if (ctx->copy_start == NULL && copy_end) {[m
[31m-                    ctx->copy_start = ctx->buf->pos;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_HTTP_SSI_ERROR;[m
[31m-[m
[31m-            default:[m
[31m-                state = ssi_error_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->state = state;[m
[31m-    ctx->pos = p;[m
[31m-    ctx->looked = looked;[m
[31m-[m
[31m-    ctx->copy_end = (state == ssi_start_state) ? p : copy_end;[m
[31m-[m
[31m-    if (ctx->copy_start == NULL && ctx->copy_end) {[m
[31m-        ctx->copy_start = ctx->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_str_t *[m
[31m-ngx_http_ssi_get_variable(ngx_http_request_t *r, ngx_str_t *name,[m
[31m-    ngx_uint_t key)[m
[31m-{[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_list_part_t     *part;[m
[31m-    ngx_http_ssi_var_t  *var;[m
[31m-    ngx_http_ssi_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    {[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (key >= '0' && key <= '9') {[m
[31m-        i = key - '0';[m
[31m-[m
[31m-        if (i < ctx->ncaptures) {[m
[31m-            value = ngx_palloc(r->pool, sizeof(ngx_str_t));[m
[31m-            if (value == NULL) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            i *= 2;[m
[31m-[m
[31m-            value->data = ctx->captures_data + ctx->captures[i];[m
[31m-            value->len = ctx->captures[i + 1] - ctx->captures[i];[m
[31m-[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->variables == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    part = &ctx->variables->part;[m
[31m-    var = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            var = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (name->len != var[i].name.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (key != var[i].key) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(name->data, var[i].name.data, name->len) == 0) {[m
[31m-            return &var[i].value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_evaluate_string(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t *text, ngx_uint_t flags)[m
[31m-{[m
[31m-    u_char                      ch, *p, **value, *data, *part_data;[m
[31m-    size_t                     *size, len, prefix, part_len;[m
[31m-    ngx_str_t                   var, *val;[m
[31m-    ngx_int_t                   key;[m
[31m-    ngx_uint_t                  i, n, bracket, quoted;[m
[31m-    ngx_array_t                 lengths, values;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(text);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-[m
[31m-        data = text->data;[m
[31m-        p = data;[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_SSI_ADD_PREFIX) && text->data[0] != '/') {[m
[31m-[m
[31m-            for (prefix = r->uri.len; prefix; prefix--) {[m
[31m-                if (r->uri.data[prefix - 1] == '/') {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (prefix) {[m
[31m-                len = prefix + text->len;[m
[31m-[m
[31m-                data = ngx_pnalloc(r->pool, len);[m
[31m-                if (data == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                p = ngx_copy(data, r->uri.data, prefix);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        quoted = 0;[m
[31m-[m
[31m-        for (i = 0; i < text->len; i++) {[m
[31m-            ch = text->data[i];[m
[31m-[m
[31m-            if (!quoted) {[m
[31m-[m
[31m-                if (ch == '\\') {[m
[31m-                    quoted = 1;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                quoted = 0;[m
[31m-[m
[31m-                if (ch != '\\' && ch != '\'' && ch != '"' && ch != '$') {[m
[31m-                    *p++ = '\\';[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            *p++ = ch;[m
[31m-        }[m
[31m-[m
[31m-        text->len = p - data;[m
[31m-        text->data = data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&lengths, r->pool, 8, sizeof(size_t *)) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&values, r->pool, 8, sizeof(u_char *)) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    i = 0;[m
[31m-[m
[31m-    while (i < text->len) {[m
[31m-[m
[31m-        if (text->data[i] == '$') {[m
[31m-[m
[31m-            var.len = 0;[m
[31m-[m
[31m-            if (++i == text->len) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            if (text->data[i] == '{') {[m
[31m-                bracket = 1;[m
[31m-[m
[31m-                if (++i == text->len) {[m
[31m-                    goto invalid_variable;[m
[31m-                }[m
[31m-[m
[31m-                var.data = &text->data[i];[m
[31m-[m
[31m-            } else {[m
[31m-                bracket = 0;[m
[31m-                var.data = &text->data[i];[m
[31m-            }[m
[31m-[m
[31m-            for ( /* void */ ; i < text->len; i++, var.len++) {[m
[31m-                ch = text->data[i];[m
[31m-[m
[31m-                if (ch == '}' && bracket) {[m
[31m-                    i++;[m
[31m-                    bracket = 0;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if ((ch >= 'A' && ch <= 'Z')[m
[31m-                    || (ch >= 'a' && ch <= 'z')[m
[31m-                    || (ch >= '0' && ch <= '9')[m
[31m-                    || ch == '_')[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (bracket) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "the closing bracket in \"%V\" "[m
[31m-                              "variable is missing", &var);[m
[31m-                return NGX_HTTP_SSI_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (var.len == 0) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            key = ngx_hash_strlow(var.data, var.data, var.len);[m
[31m-[m
[31m-            val = ngx_http_ssi_get_variable(r, &var, key);[m
[31m-[m
[31m-            if (val == NULL) {[m
[31m-                vv = ngx_http_get_variable(r, &var, key);[m
[31m-                if (vv == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (vv->not_found) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                part_data = vv->data;[m
[31m-                part_len = vv->len;[m
[31m-[m
[31m-            } else {[m
[31m-                part_data = val->data;[m
[31m-                part_len = val->len;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            part_data = &text->data[i];[m
[31m-            quoted = 0;[m
[31m-[m
[31m-            for (p = part_data; i < text->len; i++) {[m
[31m-                ch = text->data[i];[m
[31m-[m
[31m-                if (!quoted) {[m
[31m-[m
[31m-                    if (ch == '\\') {[m
[31m-                        quoted = 1;[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ch == '$') {[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    quoted = 0;[m
[31m-[m
[31m-                    if (ch != '\\' && ch != '\'' && ch != '"' && ch != '$') {[m
[31m-                        *p++ = '\\';[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                *p++ = ch;[m
[31m-            }[m
[31m-[m
[31m-            part_len = p - part_data;[m
[31m-        }[m
[31m-[m
[31m-        len += part_len;[m
[31m-[m
[31m-        size = ngx_array_push(&lengths);[m
[31m-        if (size == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *size = part_len;[m
[31m-[m
[31m-        value = ngx_array_push(&values);[m
[31m-        if (value == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *value = part_data;[m
[31m-    }[m
[31m-[m
[31m-    prefix = 0;[m
[31m-[m
[31m-    size = lengths.elts;[m
[31m-    value = values.elts;[m
[31m-[m
[31m-    if (flags & NGX_HTTP_SSI_ADD_PREFIX) {[m
[31m-        for (i = 0; i < values.nelts; i++) {[m
[31m-            if (size[i] != 0) {[m
[31m-                if (*value[i] != '/') {[m
[31m-                    for (prefix = r->uri.len; prefix; prefix--) {[m
[31m-                        if (r->uri.data[prefix - 1] == '/') {[m
[31m-                            len += prefix;[m
[31m-                            break;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len + ((flags & NGX_HTTP_SSI_ADD_ZERO) ? 1 : 0));[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    text->len = len;[m
[31m-    text->data = p;[m
[31m-[m
[31m-    p = ngx_copy(p, r->uri.data, prefix);[m
[31m-[m
[31m-    for (i = 0; i < values.nelts; i++) {[m
[31m-        p = ngx_copy(p, value[i], size[i]);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid_variable:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "invalid variable name in \"%V\"", text);[m
[31m-[m
[31m-    return NGX_HTTP_SSI_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_regex_match(ngx_http_request_t *r, ngx_str_t *pattern,[m
[31m-    ngx_str_t *str)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    int                   rc, *captures;[m
[31m-    u_char               *p, errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-    size_t                size;[m
[31m-    ngx_int_t             key;[m
[31m-    ngx_str_t            *vv, name, value;[m
[31m-    ngx_uint_t            i, n;[m
[31m-    ngx_http_ssi_ctx_t   *ctx;[m
[31m-    ngx_http_ssi_var_t   *var;[m
[31m-    ngx_regex_compile_t   rgc;[m
[31m-[m
[31m-    ngx_memzero(&rgc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rgc.pattern = *pattern;[m
[31m-    rgc.pool = r->pool;[m
[31m-    rgc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rgc.err.data = errstr;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rgc) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "%V", &rgc.err);[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = (rgc.captures + 1) * 3;[m
[31m-[m
[31m-    captures = ngx_palloc(r->pool, n * sizeof(int));[m
[31m-    if (captures == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_regex_exec(rgc.regex, str, captures, n);[m
[31m-[m
[31m-    if (rc < NGX_REGEX_NO_MATCHED) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      ngx_regex_exec_n " failed: %d on \"%V\" using \"%V\"",[m
[31m-                      rc, str, pattern);[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    ctx->ncaptures = rc;[m
[31m-    ctx->captures = captures;[m
[31m-    ctx->captures_data = str->data;[m
[31m-[m
[31m-    if (rgc.named_captures > 0) {[m
[31m-[m
[31m-        if (ctx->variables == NULL) {[m
[31m-            ctx->variables = ngx_list_create(r->pool, 4,[m
[31m-                                             sizeof(ngx_http_ssi_var_t));[m
[31m-            if (ctx->variables == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = rgc.name_size;[m
[31m-        p = rgc.names;[m
[31m-[m
[31m-        for (i = 0; i < (ngx_uint_t) rgc.named_captures; i++, p += size) {[m
[31m-[m
[31m-            name.data = &p[2];[m
[31m-            name.len = ngx_strlen(name.data);[m
[31m-[m
[31m-            n = 2 * ((p[0] << 8) + p[1]);[m
[31m-[m
[31m-            value.data = &str->data[captures[n]];[m
[31m-            value.len = captures[n + 1] - captures[n];[m
[31m-[m
[31m-            key = ngx_hash_strlow(name.data, name.data, name.len);[m
[31m-[m
[31m-            vv = ngx_http_ssi_get_variable(r, &name, key);[m
[31m-[m
[31m-            if (vv) {[m
[31m-                *vv = value;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            var = ngx_list_push(ctx->variables);[m
[31m-            if (var == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            var->name = name;[m
[31m-            var->key = key;[m
[31m-            var->value = value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                  "the using of the regex \"%V\" in SSI requires PCRE library",[m
[31m-                  pattern);[m
[31m-    return NGX_HTTP_SSI_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_include(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_int_t                    rc, key;[m
[31m-    ngx_str_t                   *uri, *file, *wait, *set, *stub, args;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_uint_t                   flags, i;[m
[31m-    ngx_chain_t                 *cl, *tl, **ll, *out;[m
[31m-    ngx_http_request_t          *sr;[m
[31m-    ngx_http_ssi_var_t          *var;[m
[31m-    ngx_http_ssi_ctx_t          *mctx;[m
[31m-    ngx_http_ssi_block_t        *bl;[m
[31m-    ngx_http_post_subrequest_t  *psr;[m
[31m-[m
[31m-    uri = params[NGX_HTTP_SSI_INCLUDE_VIRTUAL];[m
[31m-    file = params[NGX_HTTP_SSI_INCLUDE_FILE];[m
[31m-    wait = params[NGX_HTTP_SSI_INCLUDE_WAIT];[m
[31m-    set = params[NGX_HTTP_SSI_INCLUDE_SET];[m
[31m-    stub = params[NGX_HTTP_SSI_INCLUDE_STUB];[m
[31m-[m
[31m-    if (uri && file) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "inclusion may be either virtual=\"%V\" or file=\"%V\"",[m
[31m-                      uri, file);[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (uri == NULL && file == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "no parameter in \"include\" SSI command");[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (set && stub) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "\"set\" and \"stub\" cannot be used together "[m
[31m-                      "in \"include\" SSI command");[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (wait) {[m
[31m-        if (uri == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "\"wait\" cannot be used with file=\"%V\"", file);[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (wait->len == 2[m
[31m-            && ngx_strncasecmp(wait->data, (u_char *) "no", 2) == 0)[m
[31m-        {[m
[31m-            wait = NULL;[m
[31m-[m
[31m-        } else if (wait->len != 3[m
[31m-                   || ngx_strncasecmp(wait->data, (u_char *) "yes", 3) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "invalid value \"%V\" in the \"wait\" parameter",[m
[31m-                          wait);[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (uri == NULL) {[m
[31m-        uri = file;[m
[31m-        wait = (ngx_str_t *) -1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_ssi_evaluate_string(r, ctx, uri, NGX_HTTP_SSI_ADD_PREFIX);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi include: \"%V\"", uri);[m
[31m-[m
[31m-    ngx_str_null(&args);[m
[31m-    flags = NGX_HTTP_LOG_UNSAFE;[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    psr = NULL;[m
[31m-[m
[31m-    mctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (stub) {[m
[31m-        if (mctx->blocks) {[m
[31m-            bl = mctx->blocks->elts;[m
[31m-            for (i = 0; i < mctx->blocks->nelts; i++) {[m
[31m-                if (stub->len == bl[i].name.len[m
[31m-                    && ngx_strncmp(stub->data, bl[i].name.data, stub->len) == 0)[m
[31m-                {[m
[31m-                    goto found;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "\"stub\"=\"%V\" for \"include\" not found", stub);[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-[m
[31m-    found:[m
[31m-[m
[31m-        psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-        if (psr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        psr->handler = ngx_http_ssi_stub_output;[m
[31m-[m
[31m-        if (bl[i].count++) {[m
[31m-[m
[31m-            out = NULL;[m
[31m-            ll = &out;[m
[31m-[m
[31m-            for (tl = bl[i].bufs; tl; tl = tl->next) {[m
[31m-[m
[31m-                if (ctx->free) {[m
[31m-                    cl = ctx->free;[m
[31m-                    ctx->free = ctx->free->next;[m
[31m-                    b = cl->buf;[m
[31m-[m
[31m-                } else {[m
[31m-                    b = ngx_alloc_buf(r->pool);[m
[31m-                    if (b == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    cl = ngx_alloc_chain_link(r->pool);[m
[31m-                    if (cl == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    cl->buf = b;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(b, tl->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->pos = b->start;[m
[31m-[m
[31m-                *ll = cl;[m
[31m-                cl->next = NULL;[m
[31m-                ll = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            psr->data = out;[m
[31m-[m
[31m-        } else {[m
[31m-            psr->data = bl[i].bufs;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (wait) {[m
[31m-        flags |= NGX_HTTP_SUBREQUEST_WAITED;[m
[31m-    }[m
[31m-[m
[31m-    if (set) {[m
[31m-        key = ngx_hash_strlow(set->data, set->data, set->len);[m
[31m-[m
[31m-        psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));[m
[31m-        if (psr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        psr->handler = ngx_http_ssi_set_variable;[m
[31m-        psr->data = ngx_http_ssi_get_variable(r, set, key);[m
[31m-[m
[31m-        if (psr->data == NULL) {[m
[31m-[m
[31m-            if (mctx->variables == NULL) {[m
[31m-                mctx->variables = ngx_list_create(r->pool, 4,[m
[31m-                                                  sizeof(ngx_http_ssi_var_t));[m
[31m-                if (mctx->variables == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            var = ngx_list_push(mctx->variables);[m
[31m-            if (var == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            var->name = *set;[m
[31m-            var->key = key;[m
[31m-            var->value = ngx_http_ssi_null_string;[m
[31m-            psr->data = &var->value;[m
[31m-        }[m
[31m-[m
[31m-        flags |= NGX_HTTP_SUBREQUEST_IN_MEMORY|NGX_HTTP_SUBREQUEST_WAITED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_subrequest(r, uri, &args, &sr, psr, flags) != NGX_OK) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (wait == NULL && set == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->wait == NULL) {[m
[31m-        ctx->wait = sr;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "can only wait for one subrequest at a time");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_stub_output(ngx_http_request_t *r, void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_chain_t  *out;[m
[31m-[m
[31m-    if (rc == NGX_ERROR || r->connection->error || r->request_output) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi stub output: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    out = data;[m
[31m-[m
[31m-    if (!r->header_sent) {[m
[31m-        r->headers_out.content_type_len =[m
[31m-                                      r->parent->headers_out.content_type_len;[m
[31m-        r->headers_out.content_type = r->parent->headers_out.content_type;[m
[31m-[m
[31m-        if (ngx_http_send_header(r) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_set_variable(ngx_http_request_t *r, void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_str_t  *value = data;[m
[31m-[m
[31m-    if (r->upstream) {[m
[31m-        value->len = r->upstream->buffer.last - r->upstream->buffer.pos;[m
[31m-        value->data = r->upstream->buffer.pos;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_echo(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    uintptr_t                   len;[m
[31m-    ngx_int_t                   key;[m
[31m-    ngx_buf_t                  *b;[m
[31m-    ngx_str_t                  *var, *value, *enc, text;[m
[31m-    ngx_chain_t                *cl;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-[m
[31m-    var = params[NGX_HTTP_SSI_ECHO_VAR];[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi echo \"%V\"", var);[m
[31m-[m
[31m-    key = ngx_hash_strlow(var->data, var->data, var->len);[m
[31m-[m
[31m-    value = ngx_http_ssi_get_variable(r, var, key);[m
[31m-[m
[31m-    if (value == NULL) {[m
[31m-        vv = ngx_http_get_variable(r, var, key);[m
[31m-[m
[31m-        if (vv == NULL) {[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (!vv->not_found) {[m
[31m-            text.data = vv->data;[m
[31m-            text.len = vv->len;[m
[31m-            value = &text;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (value == NULL) {[m
[31m-        value = params[NGX_HTTP_SSI_ECHO_DEFAULT];[m
[31m-[m
[31m-        if (value == NULL) {[m
[31m-            value = &ngx_http_ssi_none;[m
[31m-[m
[31m-        } else if (value->len == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (value->len == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    enc = params[NGX_HTTP_SSI_ECHO_ENCODING];[m
[31m-[m
[31m-    if (enc) {[m
[31m-        if (enc->len == 4 && ngx_strncmp(enc->data, "none", 4) == 0) {[m
[31m-[m
[31m-            ctx->encoding = NGX_HTTP_SSI_NO_ENCODING;[m
[31m-[m
[31m-        } else if (enc->len == 3 && ngx_strncmp(enc->data, "url", 3) == 0) {[m
[31m-[m
[31m-            ctx->encoding = NGX_HTTP_SSI_URL_ENCODING;[m
[31m-[m
[31m-        } else if (enc->len == 6 && ngx_strncmp(enc->data, "entity", 6) == 0) {[m
[31m-[m
[31m-            ctx->encoding = NGX_HTTP_SSI_ENTITY_ENCODING;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "unknown encoding \"%V\" in the \"echo\" command",[m
[31m-                          enc);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = value->data;[m
[31m-[m
[31m-    switch (ctx->encoding) {[m
[31m-[m
[31m-    case NGX_HTTP_SSI_URL_ENCODING:[m
[31m-        len = 2 * ngx_escape_uri(NULL, value->data, value->len,[m
[31m-                                 NGX_ESCAPE_HTML);[m
[31m-[m
[31m-        if (len) {[m
[31m-            p = ngx_pnalloc(r->pool, value->len + len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_HTTP_SSI_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_escape_uri(p, value->data, value->len, NGX_ESCAPE_HTML);[m
[31m-        }[m
[31m-[m
[31m-        len += value->len;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_SSI_ENTITY_ENCODING:[m
[31m-        len = ngx_escape_html(NULL, value->data, value->len);[m
[31m-[m
[31m-        if (len) {[m
[31m-            p = ngx_pnalloc(r->pool, value->len + len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_HTTP_SSI_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_escape_html(p, value->data, value->len);[m
[31m-        }[m
[31m-[m
[31m-        len += value->len;[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_HTTP_SSI_NO_ENCODING */[m
[31m-        len = value->len;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-    b->pos = p;[m
[31m-    b->last = p + len;[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    cl->next = NULL;[m
[31m-    *ctx->last_out = cl;[m
[31m-    ctx->last_out = &cl->next;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_config(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    value = params[NGX_HTTP_SSI_CONFIG_TIMEFMT];[m
[31m-[m
[31m-    if (value) {[m
[31m-        ctx->timefmt.len = value->len;[m
[31m-        ctx->timefmt.data = ngx_pnalloc(r->pool, value->len + 1);[m
[31m-        if (ctx->timefmt.data == NULL) {[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_cpystrn(ctx->timefmt.data, value->data, value->len + 1);[m
[31m-    }[m
[31m-[m
[31m-    value = params[NGX_HTTP_SSI_CONFIG_ERRMSG];[m
[31m-[m
[31m-    if (value) {[m
[31m-        ctx->errmsg = *value;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_set(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_int_t            key, rc;[m
[31m-    ngx_str_t           *name, *value, *vv;[m
[31m-    ngx_http_ssi_var_t  *var;[m
[31m-    ngx_http_ssi_ctx_t  *mctx;[m
[31m-[m
[31m-    mctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (mctx->variables == NULL) {[m
[31m-        mctx->variables = ngx_list_create(r->pool, 4,[m
[31m-                                          sizeof(ngx_http_ssi_var_t));[m
[31m-        if (mctx->variables == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    name = params[NGX_HTTP_SSI_SET_VAR];[m
[31m-    value = params[NGX_HTTP_SSI_SET_VALUE];[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi set \"%V\" \"%V\"", name, value);[m
[31m-[m
[31m-    rc = ngx_http_ssi_evaluate_string(r, ctx, value, 0);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    key = ngx_hash_strlow(name->data, name->data, name->len);[m
[31m-[m
[31m-    vv = ngx_http_ssi_get_variable(r, name, key);[m
[31m-[m
[31m-    if (vv) {[m
[31m-        *vv = *value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    var = ngx_list_push(mctx->variables);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->name = *name;[m
[31m-    var->key = key;[m
[31m-    var->value = *value;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "set: \"%V\"=\"%V\"", name, value);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_if(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    u_char       *p, *last;[m
[31m-    ngx_str_t    *expr, left, right;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_uint_t    negative, noregex, flags;[m
[31m-[m
[31m-    if (ctx->command.len == 2) {[m
[31m-        if (ctx->conditional) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "the \"if\" command inside the \"if\" command");[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->output_chosen) {[m
[31m-        ctx->output = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    expr = params[NGX_HTTP_SSI_IF_EXPR];[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi if expr=\"%V\"", expr);[m
[31m-[m
[31m-    left.data = expr->data;[m
[31m-    last = expr->data + expr->len;[m
[31m-[m
[31m-    for (p = left.data; p < last; p++) {[m
[31m-        if (*p >= 'A' && *p <= 'Z') {[m
[31m-            *p |= 0x20;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((*p >= 'a' && *p <= 'z')[m
[31m-             || (*p >= '0' && *p <= '9')[m
[31m-             || *p == '$' || *p == '{' || *p == '}' || *p == '_'[m
[31m-             || *p == '"' || *p == '\'')[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    left.len = p - left.data;[m
[31m-[m
[31m-    while (p < last && *p == ' ') {[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    flags = 0;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "left: \"%V\"", &left);[m
[31m-[m
[31m-    rc = ngx_http_ssi_evaluate_string(r, ctx, &left, flags);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "evaluated left: \"%V\"", &left);[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        if (left.len) {[m
[31m-            ctx->output = 1;[m
[31m-            ctx->output_chosen = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->output = 0;[m
[31m-        }[m
[31m-[m
[31m-        ctx->conditional = NGX_HTTP_SSI_COND_IF;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (p < last && *p == '=') {[m
[31m-        negative = 0;[m
[31m-        p++;[m
[31m-[m
[31m-    } else if (p + 1 < last && *p == '!' && *(p + 1) == '=') {[m
[31m-        negative = 1;[m
[31m-        p += 2;[m
[31m-[m
[31m-    } else {[m
[31m-        goto invalid_expression;[m
[31m-    }[m
[31m-[m
[31m-    while (p < last && *p == ' ') {[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    if (p < last - 1 && *p == '/') {[m
[31m-        if (*(last - 1) != '/') {[m
[31m-            goto invalid_expression;[m
[31m-        }[m
[31m-[m
[31m-        noregex = 0;[m
[31m-        flags = NGX_HTTP_SSI_ADD_ZERO;[m
[31m-        last--;[m
[31m-        p++;[m
[31m-[m
[31m-    } else {[m
[31m-        noregex = 1;[m
[31m-        flags = 0;[m
[31m-[m
[31m-        if (p < last - 1 && p[0] == '\\' && p[1] == '/') {[m
[31m-            p++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    right.len = last - p;[m
[31m-    right.data = p;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "right: \"%V\"", &right);[m
[31m-[m
[31m-    rc = ngx_http_ssi_evaluate_string(r, ctx, &right, flags);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "evaluated right: \"%V\"", &right);[m
[31m-[m
[31m-    if (noregex) {[m
[31m-        if (left.len != right.len) {[m
[31m-            rc = -1;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_strncmp(left.data, right.data, right.len);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        right.data[right.len] = '\0';[m
[31m-[m
[31m-        rc = ngx_http_ssi_regex_match(r, &right, &left);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = 0;[m
[31m-        } else if (rc == NGX_DECLINED) {[m
[31m-            rc = -1;[m
[31m-        } else {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((rc == 0 && !negative) || (rc != 0 && negative)) {[m
[31m-        ctx->output = 1;[m
[31m-        ctx->output_chosen = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->output = 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx->conditional = NGX_HTTP_SSI_COND_IF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid_expression:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "invalid expression in \"%V\"", expr);[m
[31m-[m
[31m-    return NGX_HTTP_SSI_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_else(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi else");[m
[31m-[m
[31m-    if (ctx->output_chosen) {[m
[31m-        ctx->output = 0;[m
[31m-    } else {[m
[31m-        ctx->output = 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->conditional = NGX_HTTP_SSI_COND_ELSE;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_endif(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi endif");[m
[31m-[m
[31m-    ctx->output = 1;[m
[31m-    ctx->output_chosen = 0;[m
[31m-    ctx->conditional = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_block(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_http_ssi_ctx_t    *mctx;[m
[31m-    ngx_http_ssi_block_t  *bl;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi block");[m
[31m-[m
[31m-    mctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    if (mctx->blocks == NULL) {[m
[31m-        mctx->blocks = ngx_array_create(r->pool, 4,[m
[31m-                                        sizeof(ngx_http_ssi_block_t));[m
[31m-        if (mctx->blocks == NULL) {[m
[31m-            return NGX_HTTP_SSI_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    bl = ngx_array_push(mctx->blocks);[m
[31m-    if (bl == NULL) {[m
[31m-        return NGX_HTTP_SSI_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bl->name = *params[NGX_HTTP_SSI_BLOCK_NAME];[m
[31m-    bl->bufs = NULL;[m
[31m-    bl->count = 0;[m
[31m-[m
[31m-    ctx->output = 0;[m
[31m-    ctx->block = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_endblock(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "ssi endblock");[m
[31m-[m
[31m-    ctx->output = 1;[m
[31m-    ctx->block = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_date_gmt_local_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t gmt)[m
[31m-{[m
[31m-    ngx_http_ssi_ctx_t  *ctx;[m
[31m-    ngx_time_t          *tp;[m
[31m-    ngx_str_t           *timefmt;[m
[31m-    struct tm            tm;[m
[31m-    char                 buf[NGX_HTTP_SSI_DATE_LEN];[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    timefmt = ctx ? &ctx->timefmt : &ngx_http_ssi_timefmt;[m
[31m-[m
[31m-    if (timefmt->len == sizeof("%s") - 1[m
[31m-        && timefmt->data[0] == '%' && timefmt->data[1] == 's')[m
[31m-    {[m
[31m-        v->data = ngx_pnalloc(r->pool, NGX_TIME_T_LEN);[m
[31m-        if (v->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_sprintf(v->data, "%T", tp->sec) - v->data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (gmt) {[m
[31m-        ngx_libc_gmtime(tp->sec, &tm);[m
[31m-    } else {[m
[31m-        ngx_libc_localtime(tp->sec, &tm);[m
[31m-    }[m
[31m-[m
[31m-    v->len = strftime(buf, NGX_HTTP_SSI_DATE_LEN,[m
[31m-                      (char *) timefmt->data, &tm);[m
[31m-    if (v->len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, v->len);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(v->data, buf, v->len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_variable_t       *var, *v;[m
[31m-    ngx_http_ssi_command_t    *cmd;[m
[31m-    ngx_http_ssi_main_conf_t  *smcf;[m
[31m-[m
[31m-    for (v = ngx_http_ssi_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    smcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    for (cmd = ngx_http_ssi_commands; cmd->name.len; cmd++) {[m
[31m-        rc = ngx_hash_add_key(&smcf->commands, &cmd->name, cmd,[m
[31m-                              NGX_HASH_READONLY_KEY);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "conflicting SSI command \"%V\"", &cmd->name);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_ssi_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_ssi_main_conf_t  *smcf;[m
[31m-[m
[31m-    smcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ssi_main_conf_t));[m
[31m-    if (smcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    smcf->commands.pool = cf->pool;[m
[31m-    smcf->commands.temp_pool = cf->temp_pool;[m
[31m-[m
[31m-    if (ngx_hash_keys_array_init(&smcf->commands, NGX_HASH_SMALL) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return smcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssi_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_ssi_main_conf_t *smcf = conf;[m
[31m-[m
[31m-    ngx_hash_init_t  hash;[m
[31m-[m
[31m-    hash.hash = &smcf->hash;[m
[31m-    hash.key = ngx_hash_key;[m
[31m-    hash.max_size = 1024;[m
[31m-    hash.bucket_size = ngx_cacheline_size;[m
[31m-    hash.name = "ssi_command_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, smcf->commands.keys.elts,[m
[31m-                      smcf->commands.keys.nelts)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_ssi_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_ssi_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ssi_loc_conf_t));[m
[31m-    if (slcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     */[m
[31m-[m
[31m-    slcf->enable = NGX_CONF_UNSET;[m
[31m-    slcf->silent_errors = NGX_CONF_UNSET;[m
[31m-    slcf->ignore_recycled_buffers = NGX_CONF_UNSET;[m
[31m-    slcf->last_modified = NGX_CONF_UNSET;[m
[31m-[m
[31m-    slcf->min_file_chunk = NGX_CONF_UNSET_SIZE;[m
[31m-    slcf->value_len = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return slcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_ssi_loc_conf_t *prev = parent;[m
[31m-    ngx_http_ssi_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_value(conf->silent_errors, prev->silent_errors, 0);[m
[31m-    ngx_conf_merge_value(conf->ignore_recycled_buffers,[m
[31m-                         prev->ignore_recycled_buffers, 0);[m
[31m-    ngx_conf_merge_value(conf->last_modified, prev->last_modified, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->min_file_chunk, prev->min_file_chunk, 1024);[m
[31m-    ngx_conf_merge_size_value(conf->value_len, prev->value_len, 255);[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_html_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssi_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_ssi_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_ssi_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.h[m
[1mdeleted file mode 100644[m
[1mindex 0bd01a0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssi_filter_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SSI_FILTER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SSI_FILTER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_SSI_MAX_PARAMS       16[m
[31m-[m
[31m-#define NGX_HTTP_SSI_COMMAND_LEN      32[m
[31m-#define NGX_HTTP_SSI_PARAM_LEN        32[m
[31m-#define NGX_HTTP_SSI_PARAMS_N         4[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_SSI_COND_IF          1[m
[31m-#define NGX_HTTP_SSI_COND_ELSE        2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_SSI_NO_ENCODING      0[m
[31m-#define NGX_HTTP_SSI_URL_ENCODING     1[m
[31m-#define NGX_HTTP_SSI_ENTITY_ENCODING  2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t                hash;[m
[31m-    ngx_hash_keys_arrays_t    commands;[m
[31m-} ngx_http_ssi_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_buf_t                *buf;[m
[31m-[m
[31m-    u_char                   *pos;[m
[31m-    u_char                   *copy_start;[m
[31m-    u_char                   *copy_end;[m
[31m-[m
[31m-    ngx_uint_t                key;[m
[31m-    ngx_str_t                 command;[m
[31m-    ngx_array_t               params;[m
[31m-    ngx_table_elt_t          *param;[m
[31m-    ngx_table_elt_t           params_array[NGX_HTTP_SSI_PARAMS_N];[m
[31m-[m
[31m-    ngx_chain_t              *in;[m
[31m-    ngx_chain_t              *out;[m
[31m-    ngx_chain_t             **last_out;[m
[31m-    ngx_chain_t              *busy;[m
[31m-    ngx_chain_t              *free;[m
[31m-[m
[31m-    ngx_uint_t                state;[m
[31m-    ngx_uint_t                saved_state;[m
[31m-    size_t                    saved;[m
[31m-    size_t                    looked;[m
[31m-[m
[31m-    size_t                    value_len;[m
[31m-[m
[31m-    ngx_list_t               *variables;[m
[31m-    ngx_array_t              *blocks;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                ncaptures;[m
[31m-    int                      *captures;[m
[31m-    u_char                   *captures_data;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                  conditional:2;[m
[31m-    unsigned                  encoding:2;[m
[31m-    unsigned                  block:1;[m
[31m-    unsigned                  output:1;[m
[31m-    unsigned                  output_chosen:1;[m
[31m-[m
[31m-    ngx_http_request_t       *wait;[m
[31m-    void                     *value_buf;[m
[31m-    ngx_str_t                 timefmt;[m
[31m-    ngx_str_t                 errmsg;[m
[31m-} ngx_http_ssi_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_ssi_command_pt) (ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ctx, ngx_str_t **);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_uint_t                index;[m
[31m-[m
[31m-    unsigned                  mandatory:1;[m
[31m-    unsigned                  multiple:1;[m
[31m-} ngx_http_ssi_param_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 name;[m
[31m-    ngx_http_ssi_command_pt   handler;[m
[31m-    ngx_http_ssi_param_t     *params;[m
[31m-[m
[31m-    unsigned                  conditional:2;[m
[31m-    unsigned                  block:1;[m
[31m-    unsigned                  flush:1;[m
[31m-} ngx_http_ssi_command_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_ssi_filter_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SSI_FILTER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6a4108c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,967 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_ssl_variable_handler_pt)(ngx_connection_t *c,[m
[31m-    ngx_pool_t *pool, ngx_str_t *s);[m
[31m-[m
[31m-[m
[31m-#define NGX_DEFAULT_CIPHERS     "HIGH:!aNULL:!MD5"[m
[31m-#define NGX_DEFAULT_ECDH_CURVE  "prime256v1"[m
[31m-[m
[31m-#define NGX_HTTP_NPN_ADVERTISE  "\x08http/1.1"[m
[31m-[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-static int ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn,[m
[31m-    const unsigned char **out, unsigned char *outlen,[m
[31m-    const unsigned char *in, unsigned int inlen, void *arg);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-static int ngx_http_ssl_npn_advertised(ngx_ssl_conn_t *ssl_conn,[m
[31m-    const unsigned char **out, unsigned int *outlen, void *arg);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssl_static_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_ssl_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssl_add_variables(ngx_conf_t *cf);[m
[31m-static void *ngx_http_ssl_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_ssl_merge_srv_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_ssl_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_ssl_verify[] = {[m
[31m-    { ngx_string("off"), 0 },[m
[31m-    { ngx_string("on"), 1 },[m
[31m-    { ngx_string("optional"), 2 },[m
[31m-    { ngx_string("optional_no_ca"), 3 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_ssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_http_ssl_enable,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_password_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_ssl_password_file,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_dhparam"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, dhparam),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_ecdh_curve"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, ecdh_curve),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, protocols),[m
[31m-      &ngx_http_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_verify_client"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, verify),[m
[31m-      &ngx_http_ssl_verify },[m
[31m-[m
[31m-    { ngx_string("ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_client_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, client_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_prefer_server_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, prefer_server_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_ssl_session_cache,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_tickets"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, session_tickets),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_ticket_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, session_ticket_keys),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, session_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_stapling"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, stapling),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_stapling_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, stapling_file),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_stapling_responder"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, stapling_responder),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_stapling_verify"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_ssl_srv_conf_t, stapling_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_ssl_module_ctx = {[m
[31m-    ngx_http_ssl_add_variables,            /* preconfiguration */[m
[31m-    ngx_http_ssl_init,                     /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_http_ssl_create_srv_conf,          /* create server configuration */[m
[31m-    ngx_http_ssl_merge_srv_conf,           /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_ssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_ssl_module_ctx,              /* module context */[m
[31m-    ngx_http_ssl_commands,                 /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_ssl_vars[] = {[m
[31m-[m
[31m-    { ngx_string("ssl_protocol"), NULL, ngx_http_ssl_static_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_protocol, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_cipher"), NULL, ngx_http_ssl_static_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_cipher_name, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_session_id"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_session_id, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_session_reused"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_session_reused, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_server_name"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_server_name, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_cert"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_certificate, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_raw_cert"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_raw_certificate,[m
[31m-      NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_s_dn"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_subject_dn, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_i_dn"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_issuer_dn, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_serial"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_serial_number, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_fingerprint"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_fingerprint, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("ssl_client_verify"), NULL, ngx_http_ssl_variable,[m
[31m-      (uintptr_t) ngx_ssl_get_client_verify, NGX_HTTP_VAR_CHANGEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_ssl_sess_id_ctx = ngx_string("HTTP");[m
[31m-[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-[m
[31m-static int[m
[31m-ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,[m
[31m-    unsigned char *outlen, const unsigned char *in, unsigned int inlen,[m
[31m-    void *arg)[m
[31m-{[m
[31m-    unsigned int            srvlen;[m
[31m-    unsigned char          *srv;[m
[31m-#if (NGX_DEBUG)[m
[31m-    unsigned int            i;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    ngx_http_connection_t  *hc;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2 || NGX_DEBUG)[m
[31m-    ngx_connection_t       *c;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    for (i = 0; i < inlen; i += in[i] + 1) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "SSL ALPN supported by client: %*s",[m
[31m-                       (size_t) in[i], &in[i + 1]);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    if (hc->addr_conf->http2) {[m
[31m-        srv =[m
[31m-           (unsigned char *) NGX_HTTP_V2_ALPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;[m
[31m-        srvlen = sizeof(NGX_HTTP_V2_ALPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE) - 1;[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        srv = (unsigned char *) NGX_HTTP_NPN_ADVERTISE;[m
[31m-        srvlen = sizeof(NGX_HTTP_NPN_ADVERTISE) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_select_next_proto((unsigned char **) out, outlen, srv, srvlen,[m
[31m-                              in, inlen)[m
[31m-        != OPENSSL_NPN_NEGOTIATED)[m
[31m-    {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "SSL ALPN selected: %*s", (size_t) *outlen, *out);[m
[31m-[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-[m
[31m-static int[m
[31m-ngx_http_ssl_npn_advertised(ngx_ssl_conn_t *ssl_conn,[m
[31m-    const unsigned char **out, unsigned int *outlen, void *arg)[m
[31m-{[m
[31m-#if (NGX_HTTP_V2 || NGX_DEBUG)[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "SSL NPN advertised");[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    {[m
[31m-    ngx_http_connection_t  *hc;[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    if (hc->addr_conf->http2) {[m
[31m-        *out =[m
[31m-            (unsigned char *) NGX_HTTP_V2_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;[m
[31m-        *outlen = sizeof(NGX_HTTP_V2_NPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE) - 1;[m
[31m-[m
[31m-        return SSL_TLSEXT_ERR_OK;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    *out = (unsigned char *) NGX_HTTP_NPN_ADVERTISE;[m
[31m-    *outlen = sizeof(NGX_HTTP_NPN_ADVERTISE) - 1;[m
[31m-[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssl_static_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_ssl_variable_handler_pt  handler = (ngx_ssl_variable_handler_pt) data;[m
[31m-[m
[31m-    size_t     len;[m
[31m-    ngx_str_t  s;[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-[m
[31m-        (void) handler(r->connection, NULL, &s);[m
[31m-[m
[31m-        v->data = s.data;[m
[31m-[m
[31m-        for (len = 0; v->data[len]; len++) { /* void */ }[m
[31m-[m
[31m-        v->len = len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_ssl_variable_handler_pt  handler = (ngx_ssl_variable_handler_pt) data;[m
[31m-[m
[31m-    ngx_str_t  s;[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-[m
[31m-        if (handler(r->connection, r->pool, &s) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = s.len;[m
[31m-        v->data = s.data;[m
[31m-[m
[31m-        if (v->len) {[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 0;[m
[31m-            v->not_found = 0;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssl_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_ssl_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_ssl_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ssl_srv_conf_t));[m
[31m-    if (sscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     sscf->protocols = 0;[m
[31m-     *     sscf->certificate = { 0, NULL };[m
[31m-     *     sscf->certificate_key = { 0, NULL };[m
[31m-     *     sscf->dhparam = { 0, NULL };[m
[31m-     *     sscf->ecdh_curve = { 0, NULL };[m
[31m-     *     sscf->client_certificate = { 0, NULL };[m
[31m-     *     sscf->trusted_certificate = { 0, NULL };[m
[31m-     *     sscf->crl = { 0, NULL };[m
[31m-     *     sscf->ciphers = { 0, NULL };[m
[31m-     *     sscf->shm_zone = NULL;[m
[31m-     *     sscf->stapling_file = { 0, NULL };[m
[31m-     *     sscf->stapling_responder = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    sscf->enable = NGX_CONF_UNSET;[m
[31m-    sscf->prefer_server_ciphers = NGX_CONF_UNSET;[m
[31m-    sscf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    sscf->verify = NGX_CONF_UNSET_UINT;[m
[31m-    sscf->verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    sscf->passwords = NGX_CONF_UNSET_PTR;[m
[31m-    sscf->builtin_session_cache = NGX_CONF_UNSET;[m
[31m-    sscf->session_timeout = NGX_CONF_UNSET;[m
[31m-    sscf->session_tickets = NGX_CONF_UNSET;[m
[31m-    sscf->session_ticket_keys = NGX_CONF_UNSET_PTR;[m
[31m-    sscf->stapling = NGX_CONF_UNSET;[m
[31m-    sscf->stapling_verify = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return sscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t *prev = parent;[m
[31m-    ngx_http_ssl_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    if (conf->enable == NGX_CONF_UNSET) {[m
[31m-        if (prev->enable == NGX_CONF_UNSET) {[m
[31m-            conf->enable = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            conf->enable = prev->enable;[m
[31m-            conf->file = prev->file;[m
[31m-            conf->line = prev->line;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_timeout,[m
[31m-                         prev->session_timeout, 300);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->prefer_server_ciphers,[m
[31m-                         prev->prefer_server_ciphers, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,[m
[31m-                         (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                          |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,[m
[31m-                         NGX_SSL_BUFSIZE);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->verify, prev->verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->verify_depth, prev->verify_depth, 1);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->certificate, prev->certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->certificate_key, prev->certificate_key, "");[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->client_certificate, prev->client_certificate,[m
[31m-                         "");[m
[31m-    ngx_conf_merge_str_value(conf->trusted_certificate,[m
[31m-                         prev->trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->crl, prev->crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve,[m
[31m-                         NGX_DEFAULT_ECDH_CURVE);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->stapling, prev->stapling, 0);[m
[31m-    ngx_conf_merge_value(conf->stapling_verify, prev->stapling_verify, 0);[m
[31m-    ngx_conf_merge_str_value(conf->stapling_file, prev->stapling_file, "");[m
[31m-    ngx_conf_merge_str_value(conf->stapling_responder,[m
[31m-                         prev->stapling_responder, "");[m
[31m-[m
[31m-    conf->ssl.log = cf->log;[m
[31m-[m
[31m-    if (conf->enable) {[m
[31m-[m
[31m-        if (conf->certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined for "[m
[31m-                          "the \"ssl\" directive in %s:%ui",[m
[31m-                          conf->file, conf->line);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate_key\" is defined for "[m
[31m-                          "the \"ssl\" directive in %s:%ui",[m
[31m-                          conf->file, conf->line);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (conf->certificate.len == 0) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &conf->certificate);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create(&conf->ssl, conf->protocols, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    if (SSL_CTX_set_tlsext_servername_callback(conf->ssl.ctx,[m
[31m-                                               ngx_http_ssl_servername)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-            "nginx was built with SNI support, however, now it is linked "[m
[31m-            "dynamically to an OpenSSL library which has no tlsext support, "[m
[31m-            "therefore SNI is not available");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-    SSL_CTX_set_alpn_select_cb(conf->ssl.ctx, ngx_http_ssl_alpn_select, NULL);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-    SSL_CTX_set_next_protos_advertised_cb(conf->ssl.ctx,[m
[31m-                                          ngx_http_ssl_npn_advertised, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = &conf->ssl;[m
[31m-[m
[31m-    if (ngx_ssl_certificate(cf, &conf->ssl, &conf->certificate,[m
[31m-                            &conf->certificate_key, conf->passwords)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(conf->ssl.ctx,[m
[31m-                                (const char *) conf->ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &conf->ciphers);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->ssl.buffer_size = conf->buffer_size;[m
[31m-[m
[31m-    if (conf->verify) {[m
[31m-[m
[31m-        if (conf->client_certificate.len == 0 && conf->verify != 3) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no ssl_client_certificate for ssl_client_verify");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_client_certificate(cf, &conf->ssl,[m
[31m-                                       &conf->client_certificate,[m
[31m-                                       conf->verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_trusted_certificate(cf, &conf->ssl,[m
[31m-                                    &conf->trusted_certificate,[m
[31m-                                    conf->verify_depth)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_crl(cf, &conf->ssl, &conf->crl) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->prefer_server_ciphers) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100001L && !defined LIBRESSL_VERSION_NUMBER)[m
[31m-    /* a temporary 512-bit RSA key is required for export versions of MSIE */[m
[31m-    SSL_CTX_set_tmp_rsa_callback(conf->ssl.ctx, ngx_ssl_rsa512_key_callback);[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->builtin_session_cache,[m
[31m-                         prev->builtin_session_cache, NGX_SSL_NONE_SCACHE);[m
[31m-[m
[31m-    if (conf->shm_zone == NULL) {[m
[31m-        conf->shm_zone = prev->shm_zone;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_session_cache(&conf->ssl, &ngx_http_ssl_sess_id_ctx,[m
[31m-                              conf->builtin_session_cache,[m
[31m-                              conf->shm_zone, conf->session_timeout)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_tickets, prev->session_tickets, 1);[m
[31m-[m
[31m-#ifdef SSL_OP_NO_TICKET[m
[31m-    if (!conf->session_tickets) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->session_ticket_keys,[m
[31m-                         prev->session_ticket_keys, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->stapling) {[m
[31m-[m
[31m-        if (ngx_ssl_stapling(cf, &conf->ssl, &conf->stapling_file,[m
[31m-                             &conf->stapling_responder, conf->stapling_verify)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t *sscf = conf;[m
[31m-[m
[31m-    char  *rv;[m
[31m-[m
[31m-    rv = ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    sscf->file = cf->conf_file->file.name.data;[m
[31m-    sscf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t *sscf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (sscf->passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    sscf->passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (sscf->passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_ssl_srv_conf_t *sscf = conf;[m
[31m-[m
[31m-    size_t       len;[m
[31m-    ngx_str_t   *value, name, size;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i, j;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            sscf->builtin_session_cache = NGX_SSL_NO_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "none") == 0) {[m
[31m-            sscf->builtin_session_cache = NGX_SSL_NONE_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "builtin") == 0) {[m
[31m-            sscf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("builtin:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            n = ngx_atoi(value[i].data + sizeof("builtin:") - 1,[m
[31m-                         value[i].len - (sizeof("builtin:") - 1));[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            sscf->builtin_session_cache = n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("shared:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            len = 0;[m
[31m-[m
[31m-            for (j = sizeof("shared:") - 1; j < value[i].len; j++) {[m
[31m-                if (value[i].data[j] == ':') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                len++;[m
[31m-            }[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            name.len = len;[m
[31m-            name.data = value[i].data + sizeof("shared:") - 1;[m
[31m-[m
[31m-            size.len = value[i].len - j - 1;[m
[31m-            size.data = name.data + len + 1;[m
[31m-[m
[31m-            n = ngx_parse_size(&size);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (n < (ngx_int_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "session cache \"%V\" is too small",[m
[31m-                                   &value[i]);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sscf->shm_zone = ngx_shared_memory_add(cf, &name, n,[m
[31m-                                                   &ngx_http_ssl_module);[m
[31m-            if (sscf->shm_zone == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sscf->shm_zone->init = ngx_ssl_session_cache_init;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (sscf->shm_zone && sscf->builtin_session_cache == NGX_CONF_UNSET) {[m
[31m-        sscf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid session cache \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_ssl_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_uint_t                   s;[m
[31m-    ngx_http_ssl_srv_conf_t     *sscf;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_core_srv_conf_t   **cscfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-[m
[31m-    for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-        sscf = cscfp[s]->ctx->srv_conf[ngx_http_ssl_module.ctx_index];[m
[31m-[m
[31m-        if (sscf->ssl.ctx == NULL || !sscf->stapling) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-        if (ngx_ssl_stapling_resolver(cf, &sscf->ssl, clcf->resolver,[m
[31m-                                      clcf->resolver_timeout)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.h[m
[1mdeleted file mode 100644[m
[1mindex 8e69e9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_ssl_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SSL_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SSL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t                      enable;[m
[31m-[m
[31m-    ngx_ssl_t                       ssl;[m
[31m-[m
[31m-    ngx_flag_t                      prefer_server_ciphers;[m
[31m-[m
[31m-    ngx_uint_t                      protocols;[m
[31m-[m
[31m-    ngx_uint_t                      verify;[m
[31m-    ngx_uint_t                      verify_depth;[m
[31m-[m
[31m-    size_t                          buffer_size;[m
[31m-[m
[31m-    ssize_t                         builtin_session_cache;[m
[31m-[m
[31m-    time_t                          session_timeout;[m
[31m-[m
[31m-    ngx_str_t                       certificate;[m
[31m-    ngx_str_t                       certificate_key;[m
[31m-    ngx_str_t                       dhparam;[m
[31m-    ngx_str_t                       ecdh_curve;[m
[31m-    ngx_str_t                       client_certificate;[m
[31m-    ngx_str_t                       trusted_certificate;[m
[31m-    ngx_str_t                       crl;[m
[31m-[m
[31m-    ngx_str_t                       ciphers;[m
[31m-[m
[31m-    ngx_array_t                    *passwords;[m
[31m-[m
[31m-    ngx_shm_zone_t                 *shm_zone;[m
[31m-[m
[31m-    ngx_flag_t                      session_tickets;[m
[31m-    ngx_array_t                    *session_ticket_keys;[m
[31m-[m
[31m-    ngx_flag_t                      stapling;[m
[31m-    ngx_flag_t                      stapling_verify;[m
[31m-    ngx_str_t                       stapling_file;[m
[31m-    ngx_str_t                       stapling_responder;[m
[31m-[m
[31m-    u_char                         *file;[m
[31m-    ngx_uint_t                      line;[m
[31m-} ngx_http_ssl_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_ssl_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SSL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_static_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_static_module.c[m
[1mdeleted file mode 100644[m
[1mindex f79c4ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_static_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,290 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_static_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_static_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t  ngx_http_static_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_static_init,                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_static_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_static_module_ctx,           /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_static_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *last, *location;[m
[31m-    size_t                     root, len;[m
[31m-    ngx_str_t                  path;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_uint_t                 level;[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    /*[m
[31m-     * ngx_http_map_uri_to_path() allocates memory for terminating '\0'[m
[31m-     * so we do not need to reserve memory for '/' for possible redirect[m
[31m-     */[m
[31m-[m
[31m-    last = ngx_http_map_uri_to_path(r, &path, &root, 0);[m
[31m-    if (last == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    path.len = last - path.data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "http filename: \"%s\"", path.data);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-        case NGX_ENAMETOOLONG:[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_EACCES:[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-        case NGX_EMLINK:[m
[31m-        case NGX_ELOOP:[m
[31m-#endif[m
[31m-[m
[31m-            level = NGX_LOG_ERR;[m
[31m-            rc = NGX_HTTP_FORBIDDEN;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            level = NGX_LOG_CRIT;[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {[m
[31m-            ngx_log_error(level, log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, path.data);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->root_tested = !r->error_page;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "http static fd: %d", of.fd);[m
[31m-[m
[31m-    if (of.is_dir) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http dir");[m
[31m-[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = r->uri.len + 1;[m
[31m-[m
[31m-        if (!clcf->alias && clcf->root_lengths == NULL && r->args.len == 0) {[m
[31m-            location = path.data + clcf->root.len;[m
[31m-[m
[31m-            *last = '/';[m
[31m-[m
[31m-        } else {[m
[31m-            if (r->args.len) {[m
[31m-                len += r->args.len + 1;[m
[31m-            }[m
[31m-[m
[31m-            location = ngx_pnalloc(r->pool, len);[m
[31m-            if (location == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            last = ngx_copy(location, r->uri.data, r->uri.len);[m
[31m-[m
[31m-            *last = '/';[m
[31m-[m
[31m-            if (r->args.len) {[m
[31m-                *++last = '?';[m
[31m-                ngx_memcpy(++last, r->args.data, r->args.len);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not need to set the r->headers_out.location->hash and[m
[31m-         * r->headers_out.location->key fields[m
[31m-         */[m
[31m-[m
[31m-        r->headers_out.location->value.len = len;[m
[31m-        r->headers_out.location->value.data = location;[m
[31m-[m
[31m-        return NGX_HTTP_MOVED_PERMANENTLY;[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_WIN32) /* the not regular files are probably Unix specific */[m
[31m-[m
[31m-    if (!of.is_file) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, 0,[m
[31m-                      "\"%s\" is not a regular file", path.data);[m
[31m-[m
[31m-        return NGX_HTTP_NOT_FOUND;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_POST) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    log->action = "sending response to client";[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_length_n = of.size;[m
[31m-    r->headers_out.last_modified_time = of.mtime;[m
[31m-[m
[31m-    if (ngx_http_set_etag(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main && of.size == 0) {[m
[31m-        return ngx_http_send_header(r);[m
[31m-    }[m
[31m-[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-    /* we need to allocate all before the header would be sent */[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = 0;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = b->file_last ? 1: 0;[m
[31m-    b->last_buf = (r == r->main) ? 1: 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->name = path;[m
[31m-    b->file->log = log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_static_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_http_static_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_stub_status_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_stub_status_module.c[m
[1mdeleted file mode 100644[m
[1mindex 61199f2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_stub_status_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,236 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_stub_status_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_stub_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_stub_status_add_variables(ngx_conf_t *cf);[m
[31m-static char *ngx_http_set_stub_status(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_status_commands[] = {[m
[31m-[m
[31m-    { ngx_string("stub_status"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_stub_status,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_stub_status_module_ctx = {[m
[31m-    ngx_http_stub_status_add_variables,    /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_stub_status_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_stub_status_module_ctx,      /* module context */[m
[31m-    ngx_http_status_commands,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_stub_status_vars[] = {[m
[31m-[m
[31m-    { ngx_string("connections_active"), NULL, ngx_http_stub_status_variable,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("connections_reading"), NULL, ngx_http_stub_status_variable,[m
[31m-      1, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("connections_writing"), NULL, ngx_http_stub_status_variable,[m
[31m-      2, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("connections_waiting"), NULL, ngx_http_stub_status_variable,[m
[31m-      3, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_stub_status_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_chain_t        out;[m
[31m-    ngx_atomic_int_t   ap, hn, ac, rq, rd, wr, wa;[m
[31m-[m
[31m-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {[m
[31m-        return NGX_HTTP_NOT_ALLOWED;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_len = sizeof("text/plain") - 1;[m
[31m-    ngx_str_set(&r->headers_out.content_type, "text/plain");[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->headers_out.status = NGX_HTTP_OK;[m
[31m-[m
[31m-        rc = ngx_http_send_header(r);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof("Active connections:  \n") + NGX_ATOMIC_T_LEN[m
[31m-           + sizeof("server accepts handled requests\n") - 1[m
[31m-           + 6 + 3 * NGX_ATOMIC_T_LEN[m
[31m-           + sizeof("Reading:  Writing:  Waiting:  \n") + 3 * NGX_ATOMIC_T_LEN;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    ap = *ngx_stat_accepted;[m
[31m-    hn = *ngx_stat_handled;[m
[31m-    ac = *ngx_stat_active;[m
[31m-    rq = *ngx_stat_requests;[m
[31m-    rd = *ngx_stat_reading;[m
[31m-    wr = *ngx_stat_writing;[m
[31m-    wa = *ngx_stat_waiting;[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, "Active connections: %uA \n", ac);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "server accepts handled requests\n",[m
[31m-                         sizeof("server accepts handled requests\n") - 1);[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, " %uA %uA %uA \n", ap, hn, rq);[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, "Reading: %uA Writing: %uA Waiting: %uA \n",[m
[31m-                          rd, wr, wa);[m
[31m-[m
[31m-    r->headers_out.status = NGX_HTTP_OK;[m
[31m-    r->headers_out.content_length_n = b->last - b->pos;[m
[31m-[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_stub_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char            *p;[m
[31m-    ngx_atomic_int_t   value;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_ATOMIC_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (data) {[m
[31m-    case 0:[m
[31m-        value = *ngx_stat_active;[m
[31m-        break;[m
[31m-[m
[31m-    case 1:[m
[31m-        value = *ngx_stat_reading;[m
[31m-        break;[m
[31m-[m
[31m-    case 2:[m
[31m-        value = *ngx_stat_writing;[m
[31m-        break;[m
[31m-[m
[31m-    case 3:[m
[31m-        value = *ngx_stat_waiting;[m
[31m-        break;[m
[31m-[m
[31m-    /* suppress warning */[m
[31m-    default:[m
[31m-        value = 0;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%uA", value) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_stub_status_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_stub_status_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_stub_status(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_stub_status_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_sub_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_sub_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex bb1c50b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_sub_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,964 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t   match;[m
[31m-    ngx_http_complex_value_t   value;[m
[31m-} ngx_http_sub_pair_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  match;[m
[31m-    ngx_http_complex_value_t  *value;[m
[31m-} ngx_http_sub_match_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                 min_match_len;[m
[31m-    ngx_uint_t                 max_match_len;[m
[31m-[m
[31m-    u_char                     index[257];[m
[31m-    u_char                     shift[256];[m
[31m-} ngx_http_sub_tables_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                 dynamic; /* unsigned dynamic:1; */[m
[31m-[m
[31m-    ngx_array_t               *pairs;[m
[31m-[m
[31m-    ngx_http_sub_tables_t     *tables;[m
[31m-[m
[31m-    ngx_hash_t                 types;[m
[31m-[m
[31m-    ngx_flag_t                 once;[m
[31m-    ngx_flag_t                 last_modified;[m
[31m-[m
[31m-    ngx_array_t               *types_keys;[m
[31m-    ngx_array_t               *matches;[m
[31m-} ngx_http_sub_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                  saved;[m
[31m-    ngx_str_t                  looked;[m
[31m-[m
[31m-    ngx_uint_t                 once;   /* unsigned  once:1 */[m
[31m-[m
[31m-    ngx_buf_t                 *buf;[m
[31m-[m
[31m-    u_char                    *pos;[m
[31m-    u_char                    *copy_start;[m
[31m-    u_char                    *copy_end;[m
[31m-[m
[31m-    ngx_chain_t               *in;[m
[31m-    ngx_chain_t               *out;[m
[31m-    ngx_chain_t              **last_out;[m
[31m-    ngx_chain_t               *busy;[m
[31m-    ngx_chain_t               *free;[m
[31m-[m
[31m-    ngx_str_t                 *sub;[m
[31m-    ngx_uint_t                 applied;[m
[31m-[m
[31m-    ngx_int_t                  offset;[m
[31m-    ngx_uint_t                 index;[m
[31m-[m
[31m-    ngx_http_sub_tables_t     *tables;[m
[31m-    ngx_array_t               *matches;[m
[31m-} ngx_http_sub_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t ngx_http_sub_cmp_index;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_sub_output(ngx_http_request_t *r,[m
[31m-    ngx_http_sub_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_sub_parse(ngx_http_request_t *r,[m
[31m-    ngx_http_sub_ctx_t *ctx);[m
[31m-[m
[31m-static char * ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_http_sub_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_sub_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static void ngx_http_sub_init_tables(ngx_http_sub_tables_t *tables,[m
[31m-    ngx_http_sub_match_t *match, ngx_uint_t n);[m
[31m-static ngx_int_t ngx_http_sub_cmp_matches(const void *one, const void *two);[m
[31m-static ngx_int_t ngx_http_sub_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_sub_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("sub_filter"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_sub_filter,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sub_filter_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_sub_loc_conf_t, types_keys),[m
[31m-      &ngx_http_html_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("sub_filter_once"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_sub_loc_conf_t, once),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sub_filter_last_modified"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_sub_loc_conf_t, last_modified),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_sub_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_sub_filter_init,              /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_sub_create_conf,              /* create location configuration */[m
[31m-    ngx_http_sub_merge_conf                /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_sub_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_sub_filter_module_ctx,       /* module context */[m
[31m-    ngx_http_sub_filter_commands,          /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                *m;[m
[31m-    ngx_uint_t                i, j, n;[m
[31m-    ngx_http_sub_ctx_t       *ctx;[m
[31m-    ngx_http_sub_pair_t      *pairs;[m
[31m-    ngx_http_sub_match_t     *matches;[m
[31m-    ngx_http_sub_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);[m
[31m-[m
[31m-    if (slcf->pairs == NULL[m
[31m-        || r->headers_out.content_length_n == 0[m
[31m-        || ngx_http_test_content_type(r, &slcf->types) == NULL)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_sub_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->dynamic == 0) {[m
[31m-        ctx->tables = slcf->tables;[m
[31m-        ctx->matches = slcf->matches;[m
[31m-[m
[31m-    } else {[m
[31m-        pairs = slcf->pairs->elts;[m
[31m-        n = slcf->pairs->nelts;[m
[31m-[m
[31m-        matches = ngx_pcalloc(r->pool, sizeof(ngx_http_sub_match_t) * n);[m
[31m-        if (matches == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        j = 0;[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            matches[j].value = &pairs[i].value;[m
[31m-[m
[31m-            if (pairs[i].match.lengths == NULL) {[m
[31m-                matches[j].match = pairs[i].match.value;[m
[31m-                j++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            m = &matches[j].match;[m
[31m-            if (ngx_http_complex_value(r, &pairs[i].match, m) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (m->len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_strlow(m->data, m->data, m->len);[m
[31m-            j++;[m
[31m-        }[m
[31m-[m
[31m-        if (j == 0) {[m
[31m-            return ngx_http_next_header_filter(r);[m
[31m-        }[m
[31m-[m
[31m-        ctx->matches = ngx_palloc(r->pool, sizeof(ngx_array_t));[m
[31m-        if (ctx->matches == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->matches->elts = matches;[m
[31m-        ctx->matches->nelts = j;[m
[31m-[m
[31m-        ctx->tables = ngx_palloc(r->pool, sizeof(ngx_http_sub_tables_t));[m
[31m-        if (ctx->tables == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_sub_init_tables(ctx->tables, ctx->matches->elts,[m
[31m-                                 ctx->matches->nelts);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);[m
[31m-[m
[31m-    ctx->saved.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);[m
[31m-    if (ctx->saved.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->looked.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);[m
[31m-    if (ctx->looked.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->offset = ctx->tables->min_match_len - 1;[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    r->filter_need_in_memory = 1;[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-[m
[31m-        if (!slcf->last_modified) {[m
[31m-            ngx_http_clear_last_modified(r);[m
[31m-            ngx_http_clear_etag(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_http_weak_etag(r);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_str_t                 *sub;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_sub_ctx_t        *ctx;[m
[31m-    ngx_http_sub_match_t      *match;[m
[31m-    ngx_http_sub_loc_conf_t   *slcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_sub_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if ((in == NULL[m
[31m-         && ctx->buf == NULL[m
[31m-         && ctx->in == NULL[m
[31m-         && ctx->busy == NULL))[m
[31m-    {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {[m
[31m-[m
[31m-        if (ctx->busy) {[m
[31m-            if (ngx_http_sub_output(r, ctx) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    /* add the incoming chain to the chain ctx->in */[m
[31m-[m
[31m-    if (in) {[m
[31m-        if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http sub filter \"%V\"", &r->uri);[m
[31m-[m
[31m-    while (ctx->in || ctx->buf) {[m
[31m-[m
[31m-        if (ctx->buf == NULL) {[m
[31m-            ctx->buf = ctx->in->buf;[m
[31m-            ctx->in = ctx->in->next;[m
[31m-            ctx->pos = ctx->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        b = NULL;[m
[31m-[m
[31m-        while (ctx->pos < ctx->buf->last) {[m
[31m-[m
[31m-            rc = ngx_http_sub_parse(r, ctx);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "parse: %i, looked: \"%V\" %p-%p",[m
[31m-                           rc, &ctx->looked, ctx->copy_start, ctx->copy_end);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->saved.len) {[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "saved: \"%V\"", &ctx->saved);[m
[31m-[m
[31m-                cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->pos = ngx_pnalloc(r->pool, ctx->saved.len);[m
[31m-                if (b->pos == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(b->pos, ctx->saved.data, ctx->saved.len);[m
[31m-                b->last = b->pos + ctx->saved.len;[m
[31m-                b->memory = 1;[m
[31m-[m
[31m-                *ctx->last_out = cl;[m
[31m-                ctx->last_out = &cl->next;[m
[31m-[m
[31m-                ctx->saved.len = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->copy_start != ctx->copy_end) {[m
[31m-[m
[31m-                cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-[m
[31m-                ngx_memcpy(b, ctx->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->pos = ctx->copy_start;[m
[31m-                b->last = ctx->copy_end;[m
[31m-                b->shadow = NULL;[m
[31m-                b->last_buf = 0;[m
[31m-                b->last_in_chain = 0;[m
[31m-                b->recycled = 0;[m
[31m-[m
[31m-                if (b->in_file) {[m
[31m-                    b->file_last = b->file_pos + (b->last - ctx->buf->pos);[m
[31m-                    b->file_pos += b->pos - ctx->buf->pos;[m
[31m-                }[m
[31m-[m
[31m-                *ctx->last_out = cl;[m
[31m-                ctx->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            /* rc == NGX_OK */[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);[m
[31m-[m
[31m-            if (ctx->sub == NULL) {[m
[31m-                ctx->sub = ngx_pcalloc(r->pool, sizeof(ngx_str_t)[m
[31m-                                                * ctx->matches->nelts);[m
[31m-                if (ctx->sub == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            sub = &ctx->sub[ctx->index];[m
[31m-[m
[31m-            if (sub->data == NULL) {[m
[31m-                match = ctx->matches->elts;[m
[31m-[m
[31m-                if (ngx_http_complex_value(r, match[ctx->index].value, sub)[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (sub->len) {[m
[31m-                b->memory = 1;[m
[31m-                b->pos = sub->data;[m
[31m-                b->last = sub->data + sub->len;[m
[31m-[m
[31m-            } else {[m
[31m-                b->sync = 1;[m
[31m-            }[m
[31m-[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            ctx->index = 0;[m
[31m-            ctx->once = slcf->once && (++ctx->applied == ctx->matches->nelts);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->looked.len[m
[31m-            && (ctx->buf->last_buf || ctx->buf->last_in_chain))[m
[31m-        {[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->pos = ctx->looked.data;[m
[31m-            b->last = b->pos + ctx->looked.len;[m
[31m-            b->memory = 1;[m
[31m-[m
[31m-            *ctx->last_out = cl;[m
[31m-            ctx->last_out = &cl->next;[m
[31m-[m
[31m-            ctx->looked.len = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->buf->last_buf || ctx->buf->flush || ctx->buf->sync[m
[31m-            || ngx_buf_in_memory(ctx->buf))[m
[31m-        {[m
[31m-            if (b == NULL) {[m
[31m-                cl = ngx_chain_get_free_buf(r->pool, &ctx->free);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = cl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->sync = 1;[m
[31m-[m
[31m-                *ctx->last_out = cl;[m
[31m-                ctx->last_out = &cl->next;[m
[31m-            }[m
[31m-[m
[31m-            b->last_buf = ctx->buf->last_buf;[m
[31m-            b->last_in_chain = ctx->buf->last_in_chain;[m
[31m-            b->flush = ctx->buf->flush;[m
[31m-            b->shadow = ctx->buf;[m
[31m-[m
[31m-            b->recycled = ctx->buf->recycled;[m
[31m-        }[m
[31m-[m
[31m-        ctx->buf = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->out == NULL && ctx->busy == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_sub_output(r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_output(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-#if 1[m
[31m-    b = NULL;[m
[31m-    for (cl = ctx->out; cl; cl = cl->next) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "sub out: %p %p", cl->buf, cl->buf->pos);[m
[31m-        if (cl->buf == b) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                          "the same buf was used in sub");[m
[31m-            ngx_debug_point();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        b = cl->buf;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_next_body_filter(r, ctx->out);[m
[31m-[m
[31m-    if (ctx->busy == NULL) {[m
[31m-        ctx->busy = ctx->out;[m
[31m-[m
[31m-    } else {[m
[31m-        for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ }[m
[31m-        cl->next = ctx->out;[m
[31m-    }[m
[31m-[m
[31m-    ctx->out = NULL;[m
[31m-    ctx->last_out = &ctx->out;[m
[31m-[m
[31m-    while (ctx->busy) {[m
[31m-[m
[31m-        cl = ctx->busy;[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (ngx_buf_size(b) != 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (b->shadow) {[m
[31m-            b->shadow->pos = b->shadow->last;[m
[31m-        }[m
[31m-[m
[31m-        ctx->busy = cl->next;[m
[31m-[m
[31m-        if (ngx_buf_in_memory(b) || b->in_file) {[m
[31m-            /* add data bufs only to the free buf chain */[m
[31m-[m
[31m-            cl->next = ctx->free;[m
[31m-            ctx->free = cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->in || ctx->buf) {[m
[31m-        r->buffered |= NGX_HTTP_SUB_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        r->buffered &= ~NGX_HTTP_SUB_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_parse(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char                   *p, *last, *pat, *pat_end, c;[m
[31m-    ngx_str_t                *m;[m
[31m-    ngx_int_t                 offset, start, next, end, len, rc;[m
[31m-    ngx_uint_t                shift, i, j;[m
[31m-    ngx_http_sub_match_t     *match;[m
[31m-    ngx_http_sub_tables_t    *tables;[m
[31m-    ngx_http_sub_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);[m
[31m-    tables = ctx->tables;[m
[31m-[m
[31m-    offset = ctx->offset;[m
[31m-    end = ctx->buf->last - ctx->pos;[m
[31m-[m
[31m-    if (ctx->once) {[m
[31m-        /* sets start and next to end */[m
[31m-        offset = end + (ngx_int_t) tables->min_match_len - 1;[m
[31m-        goto again;[m
[31m-    }[m
[31m-[m
[31m-    while (offset < end) {[m
[31m-[m
[31m-        c = offset < 0 ? ctx->looked.data[ctx->looked.len + offset][m
[31m-                       : ctx->pos[offset];[m
[31m-[m
[31m-        c = ngx_tolower(c);[m
[31m-[m
[31m-        shift = tables->shift[c];[m
[31m-        if (shift > 0) {[m
[31m-            offset += shift;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* a potential match */[m
[31m-[m
[31m-        start = offset - (ngx_int_t) tables->min_match_len + 1;[m
[31m-        match = ctx->matches->elts;[m
[31m-[m
[31m-        i = ngx_max(tables->index[c], ctx->index);[m
[31m-        j = tables->index[c + 1];[m
[31m-[m
[31m-        while (i != j) {[m
[31m-[m
[31m-            if (slcf->once && ctx->sub && ctx->sub[i].data) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-[m
[31m-            m = &match[i].match;[m
[31m-[m
[31m-            pat = m->data;[m
[31m-            pat_end = m->data + m->len;[m
[31m-[m
[31m-            if (start >= 0) {[m
[31m-                p = ctx->pos + start;[m
[31m-[m
[31m-            } else {[m
[31m-                last = ctx->looked.data + ctx->looked.len;[m
[31m-                p = last + start;[m
[31m-[m
[31m-                while (p < last && pat < pat_end) {[m
[31m-                    if (ngx_tolower(*p) != *pat) {[m
[31m-                        goto next;[m
[31m-                    }[m
[31m-[m
[31m-                    p++;[m
[31m-                    pat++;[m
[31m-                }[m
[31m-[m
[31m-                p = ctx->pos;[m
[31m-            }[m
[31m-[m
[31m-            while (p < ctx->buf->last && pat < pat_end) {[m
[31m-                if (ngx_tolower(*p) != *pat) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-[m
[31m-                p++;[m
[31m-                pat++;[m
[31m-            }[m
[31m-[m
[31m-            ctx->index = i;[m
[31m-[m
[31m-            if (pat != pat_end) {[m
[31m-                /* partial match */[m
[31m-                goto again;[m
[31m-            }[m
[31m-[m
[31m-            ctx->offset = offset + (ngx_int_t) m->len;[m
[31m-            next = start + (ngx_int_t) m->len;[m
[31m-            end = ngx_max(next, 0);[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-            goto done;[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            i++;[m
[31m-        }[m
[31m-[m
[31m-        offset++;[m
[31m-        ctx->index = 0;[m
[31m-    }[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    ctx->offset = offset;[m
[31m-    start = offset - (ngx_int_t) tables->min_match_len + 1;[m
[31m-    next = start;[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    /* send [ - looked.len, start ] to client */[m
[31m-[m
[31m-    ctx->saved.len = ctx->looked.len + ngx_min(start, 0);[m
[31m-    ngx_memcpy(ctx->saved.data, ctx->looked.data, ctx->saved.len);[m
[31m-[m
[31m-    ctx->copy_start = ctx->pos;[m
[31m-    ctx->copy_end = ctx->pos + ngx_max(start, 0);[m
[31m-[m
[31m-    /* save [ next, end ] in looked */[m
[31m-[m
[31m-    len = ngx_min(next, 0);[m
[31m-    p = ctx->looked.data;[m
[31m-    p = ngx_movemem(p, p + ctx->looked.len + len, - len);[m
[31m-[m
[31m-    len = ngx_max(next, 0);[m
[31m-    p = ngx_cpymem(p, ctx->pos + len, end - len);[m
[31m-    ctx->looked.len = p - ctx->looked.data;[m
[31m-[m
[31m-    /* update position */[m
[31m-[m
[31m-    ctx->pos += end;[m
[31m-    ctx->offset -= end;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_sub_loc_conf_t *slcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_sub_pair_t               *pair;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty search pattern");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->pairs == NULL) {[m
[31m-        slcf->pairs = ngx_array_create(cf->pool, 1,[m
[31m-                                       sizeof(ngx_http_sub_pair_t));[m
[31m-        if (slcf->pairs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (slcf->pairs->nelts == 255) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "number of search patterns exceeds 255");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(value[1].data, value[1].data, value[1].len);[m
[31m-[m
[31m-    pair = ngx_array_push(slcf->pairs);[m
[31m-    if (pair == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &pair->match;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ccv.complex_value->lengths != NULL) {[m
[31m-        slcf->dynamic = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_strlow(pair->match.value.data, pair->match.value.data,[m
[31m-                   pair->match.value.len);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &pair->value;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_sub_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_sub_loc_conf_t  *slcf;[m
[31m-[m
[31m-    slcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_sub_loc_conf_t));[m
[31m-    if (slcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->dynamic = 0;[m
[31m-     *     conf->pairs = NULL;[m
[31m-     *     conf->tables = NULL;[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     *     conf->matches = NULL;[m
[31m-     */[m
[31m-[m
[31m-    slcf->once = NGX_CONF_UNSET;[m
[31m-    slcf->last_modified = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return slcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_sub_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_uint_t                i, n;[m
[31m-    ngx_http_sub_pair_t      *pairs;[m
[31m-    ngx_http_sub_match_t     *matches;[m
[31m-    ngx_http_sub_loc_conf_t  *prev = parent;[m
[31m-    ngx_http_sub_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->once, prev->once, 1);[m
[31m-    ngx_conf_merge_value(conf->last_modified, prev->last_modified, 0);[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_html_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pairs == NULL) {[m
[31m-        conf->dynamic = prev->dynamic;[m
[31m-        conf->pairs = prev->pairs;[m
[31m-        conf->matches = prev->matches;[m
[31m-        conf->tables = prev->tables;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pairs && conf->dynamic == 0 && conf->tables == NULL) {[m
[31m-        pairs = conf->pairs->elts;[m
[31m-        n = conf->pairs->nelts;[m
[31m-[m
[31m-        matches = ngx_palloc(cf->pool, sizeof(ngx_http_sub_match_t) * n);[m
[31m-        if (matches == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            matches[i].match = pairs[i].match.value;[m
[31m-            matches[i].value = &pairs[i].value;[m
[31m-        }[m
[31m-[m
[31m-        conf->matches = ngx_palloc(cf->pool, sizeof(ngx_array_t));[m
[31m-        if (conf->matches == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf->matches->elts = matches;[m
[31m-        conf->matches->nelts = n;[m
[31m-[m
[31m-        conf->tables = ngx_palloc(cf->pool, sizeof(ngx_http_sub_tables_t));[m
[31m-        if (conf->tables == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_sub_init_tables(conf->tables, conf->matches->elts,[m
[31m-                                 conf->matches->nelts);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_sub_init_tables(ngx_http_sub_tables_t *tables,[m
[31m-    ngx_http_sub_match_t *match, ngx_uint_t n)[m
[31m-{[m
[31m-    u_char      c;[m
[31m-    ngx_uint_t  i, j, min, max, ch;[m
[31m-[m
[31m-    min = match[0].match.len;[m
[31m-    max = match[0].match.len;[m
[31m-[m
[31m-    for (i = 1; i < n; i++) {[m
[31m-        min = ngx_min(min, match[i].match.len);[m
[31m-        max = ngx_max(max, match[i].match.len);[m
[31m-    }[m
[31m-[m
[31m-    tables->min_match_len = min;[m
[31m-    tables->max_match_len = max;[m
[31m-[m
[31m-    ngx_http_sub_cmp_index = tables->min_match_len - 1;[m
[31m-    ngx_sort(match, n, sizeof(ngx_http_sub_match_t), ngx_http_sub_cmp_matches);[m
[31m-[m
[31m-    min = ngx_min(min, 255);[m
[31m-    ngx_memset(tables->shift, min, 256);[m
[31m-[m
[31m-    ch = 0;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        for (j = 0; j < min; j++) {[m
[31m-            c = match[i].match.data[tables->min_match_len - 1 - j];[m
[31m-            tables->shift[c] = ngx_min(tables->shift[c], (u_char) j);[m
[31m-        }[m
[31m-[m
[31m-        c = match[i].match.data[tables->min_match_len - 1];[m
[31m-        while (ch <= c) {[m
[31m-            tables->index[ch++] = (u_char) i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    while (ch < 257) {[m
[31m-        tables->index[ch++] = (u_char) n;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_cmp_matches(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_int_t              c1, c2;[m
[31m-    ngx_http_sub_match_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_http_sub_match_t *) one;[m
[31m-    second = (ngx_http_sub_match_t *) two;[m
[31m-[m
[31m-    c1 = first->match.data[ngx_http_sub_cmp_index];[m
[31m-    c2 = second->match.data[ngx_http_sub_cmp_index];[m
[31m-[m
[31m-    return c1 - c2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_sub_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_sub_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_sub_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_hash_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_hash_module.c[m
[1mdeleted file mode 100644[m
[1mindex 1e2e05c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_hash_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,667 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t                            hash;[m
[31m-    ngx_str_t                          *server;[m
[31m-} ngx_http_upstream_chash_point_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          number;[m
[31m-    ngx_http_upstream_chash_point_t     point[1];[m
[31m-} ngx_http_upstream_chash_points_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t            key;[m
[31m-    ngx_http_upstream_chash_points_t   *points;[m
[31m-} ngx_http_upstream_hash_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* the round robin data must be first */[m
[31m-    ngx_http_upstream_rr_peer_data_t    rrp;[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *conf;[m
[31m-    ngx_str_t                           key;[m
[31m-    ngx_uint_t                          tries;[m
[31m-    ngx_uint_t                          rehash;[m
[31m-    uint32_t                            hash;[m
[31m-    ngx_event_get_peer_pt               get_rr_peer;[m
[31m-} ngx_http_upstream_hash_peer_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_init_hash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_chash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static int ngx_libc_cdecl[m
[31m-    ngx_http_upstream_chash_cmp_points(const void *one, const void *two);[m
[31m-static ngx_uint_t ngx_http_upstream_find_chash_point([m
[31m-    ngx_http_upstream_chash_points_t *points, uint32_t hash);[m
[31m-static ngx_int_t ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-static void *ngx_http_upstream_hash_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_hash_commands[] = {[m
[31m-[m
[31m-    { ngx_string("hash"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_upstream_hash,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_hash_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_http_upstream_hash_create_conf,    /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_hash_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_hash_module_ctx,    /* module context */[m
[31m-    ngx_http_upstream_hash_commands,       /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_hash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_hash_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_hash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_srv_conf_t   *hcf;[m
[31m-    ngx_http_upstream_hash_peer_data_t  *hp;[m
[31m-[m
[31m-    hp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_hash_peer_data_t));[m
[31m-    if (hp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.data = &hp->rrp;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_hash_peer;[m
[31m-[m
[31m-    hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &hcf->key, &hp->key) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream hash key:\"%V\"", &hp->key);[m
[31m-[m
[31m-    hp->conf = hcf;[m
[31m-    hp->tries = 0;[m
[31m-    hp->rehash = 0;[m
[31m-    hp->hash = 0;[m
[31m-    hp->get_rr_peer = ngx_http_upstream_get_round_robin_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_peer_data_t  *hp = data;[m
[31m-[m
[31m-    time_t                        now;[m
[31m-    u_char                        buf[NGX_INT_T_LEN];[m
[31m-    size_t                        size;[m
[31m-    uint32_t                      hash;[m
[31m-    ngx_int_t                     w;[m
[31m-    uintptr_t                     m;[m
[31m-    ngx_uint_t                    n, p;[m
[31m-    ngx_http_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);[m
[31m-[m
[31m-    if (hp->tries > 20 || hp->rrp.peers->single) {[m
[31m-        ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-        return hp->get_rr_peer(pc, &hp->rrp);[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /*[m
[31m-         * Hash expression is compatible with Cache::Memcached:[m
[31m-         * ((crc32([REHASH] KEY) >> 16) & 0x7fff) + PREV_HASH[m
[31m-         * with REHASH omitted at the first iteration.[m
[31m-         */[m
[31m-[m
[31m-        ngx_crc32_init(hash);[m
[31m-[m
[31m-        if (hp->rehash > 0) {[m
[31m-            size = ngx_sprintf(buf, "%ui", hp->rehash) - buf;[m
[31m-            ngx_crc32_update(&hash, buf, size);[m
[31m-        }[m
[31m-[m
[31m-        ngx_crc32_update(&hash, hp->key.data, hp->key.len);[m
[31m-        ngx_crc32_final(hash);[m
[31m-[m
[31m-        hash = (hash >> 16) & 0x7fff;[m
[31m-[m
[31m-        hp->hash += hash;[m
[31m-        hp->rehash++;[m
[31m-[m
[31m-        w = hp->hash % hp->rrp.peers->total_weight;[m
[31m-        peer = hp->rrp.peers->peer;[m
[31m-        p = 0;[m
[31m-[m
[31m-        while (w >= peer->weight) {[m
[31m-            w -= peer->weight;[m
[31m-            peer = peer->next;[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        n = p / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (hp->rrp.tried[n] & m) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get hash peer, value:%uD, peer:%ui", hp->hash, p);[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        if (++hp->tries > 20) {[m
[31m-            ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-            return hp->get_rr_peer(pc, &hp->rrp);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hp->rrp.current = peer;[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    if (now - peer->checked > peer->fail_timeout) {[m
[31m-        peer->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    hp->rrp.tried[n] |= m;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_chash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    u_char                             *host, *port, c;[m
[31m-    size_t                              host_len, port_len, size;[m
[31m-    uint32_t                            hash, base_hash;[m
[31m-    ngx_str_t                          *server;[m
[31m-    ngx_uint_t                          npoints, i, j;[m
[31m-    ngx_http_upstream_rr_peer_t        *peer;[m
[31m-    ngx_http_upstream_rr_peers_t       *peers;[m
[31m-    ngx_http_upstream_chash_points_t   *points;[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *hcf;[m
[31m-    union {[m
[31m-        uint32_t                        value;[m
[31m-        u_char                          byte[4];[m
[31m-    } prev_hash;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_chash_peer;[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-    npoints = peers->total_weight * 160;[m
[31m-[m
[31m-    size = sizeof(ngx_http_upstream_chash_points_t)[m
[31m-           + sizeof(ngx_http_upstream_chash_point_t) * (npoints - 1);[m
[31m-[m
[31m-    points = ngx_palloc(cf->pool, size);[m
[31m-    if (points == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    points->number = 0;[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        server = &peer->server;[m
[31m-[m
[31m-        /*[m
[31m-         * Hash expression is compatible with Cache::Memcached::Fast:[m
[31m-         * crc32(HOST \0 PORT PREV_HASH).[m
[31m-         */[m
[31m-[m
[31m-        if (server->len >= 5[m
[31m-            && ngx_strncasecmp(server->data, (u_char *) "unix:", 5) == 0)[m
[31m-        {[m
[31m-            host = server->data + 5;[m
[31m-            host_len = server->len - 5;[m
[31m-            port = NULL;[m
[31m-            port_len = 0;[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        for (j = 0; j < server->len; j++) {[m
[31m-            c = server->data[server->len - j - 1];[m
[31m-[m
[31m-            if (c == ':') {[m
[31m-                host = server->data;[m
[31m-                host_len = server->len - j - 1;[m
[31m-                port = server->data + server->len - j;[m
[31m-                port_len = j;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (c < '0' || c > '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        host = server->data;[m
[31m-        host_len = server->len;[m
[31m-        port = NULL;[m
[31m-        port_len = 0;[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-        ngx_crc32_init(base_hash);[m
[31m-        ngx_crc32_update(&base_hash, host, host_len);[m
[31m-        ngx_crc32_update(&base_hash, (u_char *) "", 1);[m
[31m-        ngx_crc32_update(&base_hash, port, port_len);[m
[31m-[m
[31m-        prev_hash.value = 0;[m
[31m-        npoints = peer->weight * 160;[m
[31m-[m
[31m-        for (j = 0; j < npoints; j++) {[m
[31m-            hash = base_hash;[m
[31m-[m
[31m-            ngx_crc32_update(&hash, prev_hash.byte, 4);[m
[31m-            ngx_crc32_final(hash);[m
[31m-[m
[31m-            points->point[points->number].hash = hash;[m
[31m-            points->point[points->number].server = server;[m
[31m-            points->number++;[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN)[m
[31m-            prev_hash.value = hash;[m
[31m-#else[m
[31m-            prev_hash.byte[0] = (u_char) (hash & 0xff);[m
[31m-            prev_hash.byte[1] = (u_char) ((hash >> 8) & 0xff);[m
[31m-            prev_hash.byte[2] = (u_char) ((hash >> 16) & 0xff);[m
[31m-            prev_hash.byte[3] = (u_char) ((hash >> 24) & 0xff);[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_qsort(points->point,[m
[31m-              points->number,[m
[31m-              sizeof(ngx_http_upstream_chash_point_t),[m
[31m-              ngx_http_upstream_chash_cmp_points);[m
[31m-[m
[31m-    for (i = 0, j = 1; j < points->number; j++) {[m
[31m-        if (points->point[i].hash != points->point[j].hash) {[m
[31m-            points->point[++i] = points->point[j];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    points->number = i + 1;[m
[31m-[m
[31m-    hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);[m
[31m-    hcf->points = points;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_upstream_chash_cmp_points(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_http_upstream_chash_point_t *first =[m
[31m-                                       (ngx_http_upstream_chash_point_t *) one;[m
[31m-    ngx_http_upstream_chash_point_t *second =[m
[31m-                                       (ngx_http_upstream_chash_point_t *) two;[m
[31m-[m
[31m-    if (first->hash < second->hash) {[m
[31m-        return -1;[m
[31m-[m
[31m-    } else if (first->hash > second->hash) {[m
[31m-        return 1;[m
[31m-[m
[31m-    } else {[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_upstream_find_chash_point(ngx_http_upstream_chash_points_t *points,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_uint_t                        i, j, k;[m
[31m-    ngx_http_upstream_chash_point_t  *point;[m
[31m-[m
[31m-    /* find first point >= hash */[m
[31m-[m
[31m-    point = &points->point[0];[m
[31m-[m
[31m-    i = 0;[m
[31m-    j = points->number;[m
[31m-[m
[31m-    while (i < j) {[m
[31m-        k = (i + j) / 2;[m
[31m-[m
[31m-        if (hash > point[k].hash) {[m
[31m-            i = k + 1;[m
[31m-[m
[31m-        } else if (hash < point[k].hash) {[m
[31m-            j = k;[m
[31m-[m
[31m-        } else {[m
[31m-            return k;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    uint32_t                             hash;[m
[31m-    ngx_http_upstream_hash_srv_conf_t   *hcf;[m
[31m-    ngx_http_upstream_hash_peer_data_t  *hp;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_hash_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_chash_peer;[m
[31m-[m
[31m-    hp = r->upstream->peer.data;[m
[31m-    hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);[m
[31m-[m
[31m-    hash = ngx_crc32_long(hp->key.data, hp->key.len);[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_rlock(hp->rrp.peers);[m
[31m-[m
[31m-    hp->hash = ngx_http_upstream_find_chash_point(hcf->points, hash);[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_peer_data_t  *hp = data;[m
[31m-[m
[31m-    time_t                              now;[m
[31m-    intptr_t                            m;[m
[31m-    ngx_str_t                          *server;[m
[31m-    ngx_int_t                           total;[m
[31m-    ngx_uint_t                          i, n, best_i;[m
[31m-    ngx_http_upstream_rr_peer_t        *peer, *best;[m
[31m-    ngx_http_upstream_chash_point_t    *point;[m
[31m-    ngx_http_upstream_chash_points_t   *points;[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *hcf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get consistent hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-    hcf = hp->conf;[m
[31m-[m
[31m-    points = hcf->points;[m
[31m-    point = &points->point[0];[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        server = point[hp->hash % points->number].server;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "consistent hash peer:%uD, server:\"%V\"",[m
[31m-                       hp->hash, server);[m
[31m-[m
[31m-        best = NULL;[m
[31m-        best_i = 0;[m
[31m-        total = 0;[m
[31m-[m
[31m-        for (peer = hp->rrp.peers->peer, i = 0;[m
[31m-             peer;[m
[31m-             peer = peer->next, i++)[m
[31m-        {[m
[31m-[m
[31m-            n = i / (8 * sizeof(uintptr_t));[m
[31m-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-            if (hp->rrp.tried[n] & m) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->down) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->server.len != server->len[m
[31m-                || ngx_strncmp(peer->server.data, server->data, server->len)[m
[31m-                   != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->max_fails[m
[31m-                && peer->fails >= peer->max_fails[m
[31m-                && now - peer->checked <= peer->fail_timeout)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            peer->current_weight += peer->effective_weight;[m
[31m-            total += peer->effective_weight;[m
[31m-[m
[31m-            if (peer->effective_weight < peer->weight) {[m
[31m-                peer->effective_weight++;[m
[31m-            }[m
[31m-[m
[31m-            if (best == NULL || peer->current_weight > best->current_weight) {[m
[31m-                best = peer;[m
[31m-                best_i = i;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (best) {[m
[31m-            best->current_weight -= total;[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        hp->hash++;[m
[31m-        hp->tries++;[m
[31m-[m
[31m-        if (hp->tries >= points->number) {[m
[31m-            ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    hp->rrp.current = best;[m
[31m-[m
[31m-    pc->sockaddr = best->sockaddr;[m
[31m-    pc->socklen = best->socklen;[m
[31m-    pc->name = &best->name;[m
[31m-[m
[31m-    best->conns++;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    n = best_i / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    hp->rrp.tried[n] |= m;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_upstream_hash_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_upstream_hash_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->points = NULL;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_hash_srv_conf_t  *hcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_upstream_srv_conf_t      *uscf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &hcf->key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = NGX_HTTP_UPSTREAM_CREATE[m
[31m-                  |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                  |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_HTTP_UPSTREAM_DOWN;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        uscf->peer.init_upstream = ngx_http_upstream_init_hash;[m
[31m-[m
[31m-    } else if (ngx_strcmp(value[2].data, "consistent") == 0) {[m
[31m-        uscf->peer.init_upstream = ngx_http_upstream_init_chash;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_ip_hash_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_ip_hash_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8a5f0fa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_ip_hash_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,267 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* the round robin data must be first */[m
[31m-    ngx_http_upstream_rr_peer_data_t   rrp;[m
[31m-[m
[31m-    ngx_uint_t                         hash;[m
[31m-[m
[31m-    u_char                             addrlen;[m
[31m-    u_char                            *addr;[m
[31m-[m
[31m-    u_char                             tries;[m
[31m-[m
[31m-    ngx_event_get_peer_pt              get_rr_peer;[m
[31m-} ngx_http_upstream_ip_hash_peer_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static char *ngx_http_upstream_ip_hash(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_ip_hash_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ip_hash"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_upstream_ip_hash,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_ip_hash_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_ip_hash_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_ip_hash_module_ctx, /* module context */[m
[31m-    ngx_http_upstream_ip_hash_commands,    /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_upstream_ip_hash_pseudo_addr[3];[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_ip_hash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_ip_hash_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    struct sockaddr_in                     *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6                    *sin6;[m
[31m-#endif[m
[31m-    ngx_http_upstream_ip_hash_peer_data_t  *iphp;[m
[31m-[m
[31m-    iphp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_ip_hash_peer_data_t));[m
[31m-    if (iphp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.data = &iphp->rrp;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_ip_hash_peer;[m
[31m-[m
[31m-    switch (r->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        sin = (struct sockaddr_in *) r->connection->sockaddr;[m
[31m-        iphp->addr = (u_char *) &sin->sin_addr.s_addr;[m
[31m-        iphp->addrlen = 3;[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;[m
[31m-        iphp->addr = (u_char *) &sin6->sin6_addr.s6_addr;[m
[31m-        iphp->addrlen = 16;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        iphp->addr = ngx_http_upstream_ip_hash_pseudo_addr;[m
[31m-        iphp->addrlen = 3;[m
[31m-    }[m
[31m-[m
[31m-    iphp->hash = 89;[m
[31m-    iphp->tries = 0;[m
[31m-    iphp->get_rr_peer = ngx_http_upstream_get_round_robin_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_ip_hash_peer_data_t  *iphp = data;[m
[31m-[m
[31m-    time_t                        now;[m
[31m-    ngx_int_t                     w;[m
[31m-    uintptr_t                     m;[m
[31m-    ngx_uint_t                    i, n, p, hash;[m
[31m-    ngx_http_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get ip hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    /* TODO: cached */[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_wlock(iphp->rrp.peers);[m
[31m-[m
[31m-    if (iphp->tries > 20 || iphp->rrp.peers->single) {[m
[31m-        ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);[m
[31m-        return iphp->get_rr_peer(pc, &iphp->rrp);[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    hash = iphp->hash;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        for (i = 0; i < (ngx_uint_t) iphp->addrlen; i++) {[m
[31m-            hash = (hash * 113 + iphp->addr[i]) % 6271;[m
[31m-        }[m
[31m-[m
[31m-        w = hash % iphp->rrp.peers->total_weight;[m
[31m-        peer = iphp->rrp.peers->peer;[m
[31m-        p = 0;[m
[31m-[m
[31m-        while (w >= peer->weight) {[m
[31m-            w -= peer->weight;[m
[31m-            peer = peer->next;[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        n = p / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (iphp->rrp.tried[n] & m) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get ip hash peer, hash: %ui %04XL", p, (uint64_t) m);[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        if (++iphp->tries > 20) {[m
[31m-            ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);[m
[31m-            return iphp->get_rr_peer(pc, &iphp->rrp);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    iphp->rrp.current = peer;[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    if (now - peer->checked > peer->fail_timeout) {[m
[31m-        peer->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);[m
[31m-[m
[31m-    iphp->rrp.tried[n] |= m;[m
[31m-    iphp->hash = hash;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_ip_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_upstream_init_ip_hash;[m
[31m-[m
[31m-    uscf->flags = NGX_HTTP_UPSTREAM_CREATE[m
[31m-                  |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                  |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_HTTP_UPSTREAM_DOWN;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_keepalive_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_keepalive_module.c[m
[1mdeleted file mode 100644[m
[1mindex 85bfcdb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_keepalive_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,529 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                         max_cached;[m
[31m-[m
[31m-    ngx_queue_t                        cache;[m
[31m-    ngx_queue_t                        free;[m
[31m-[m
[31m-    ngx_http_upstream_init_pt          original_init_upstream;[m
[31m-    ngx_http_upstream_init_peer_pt     original_init_peer;[m
[31m-[m
[31m-} ngx_http_upstream_keepalive_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *conf;[m
[31m-[m
[31m-    ngx_queue_t                        queue;[m
[31m-    ngx_connection_t                  *connection;[m
[31m-[m
[31m-    socklen_t                          socklen;[m
[31m-    u_char                             sockaddr[NGX_SOCKADDRLEN];[m
[31m-[m
[31m-} ngx_http_upstream_keepalive_cache_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *conf;[m
[31m-[m
[31m-    ngx_http_upstream_t               *upstream;[m
[31m-[m
[31m-    void                              *data;[m
[31m-[m
[31m-    ngx_event_get_peer_pt              original_get_peer;[m
[31m-    ngx_event_free_peer_pt             original_free_peer;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_event_set_peer_session_pt      original_set_session;[m
[31m-    ngx_event_save_peer_session_pt     original_save_session;[m
[31m-#endif[m
[31m-[m
[31m-} ngx_http_upstream_keepalive_peer_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static void ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state);[m
[31m-[m
[31m-static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_keepalive_close(ngx_connection_t *c);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_upstream_keepalive_set_session([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-static void ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_keepalive_commands[] = {[m
[31m-[m
[31m-    { ngx_string("keepalive"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_keepalive,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_keepalive_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_http_upstream_keepalive_create_conf, /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_keepalive_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_keepalive_module_ctx, /* module context */[m
[31m-    ngx_http_upstream_keepalive_commands,    /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_keepalive(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_uint_t                               i;[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *kcf;[m
[31m-    ngx_http_upstream_keepalive_cache_t     *cached;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,[m
[31m-                   "init keepalive");[m
[31m-[m
[31m-    kcf = ngx_http_conf_upstream_srv_conf(us,[m
[31m-                                          ngx_http_upstream_keepalive_module);[m
[31m-[m
[31m-    if (kcf->original_init_upstream(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    kcf->original_init_peer = us->peer.init;[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_keepalive_peer;[m
[31m-[m
[31m-    /* allocate cache items and add to free queue */[m
[31m-[m
[31m-    cached = ngx_pcalloc(cf->pool,[m
[31m-                sizeof(ngx_http_upstream_keepalive_cache_t) * kcf->max_cached);[m
[31m-    if (cached == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_init(&kcf->cache);[m
[31m-    ngx_queue_init(&kcf->free);[m
[31m-[m
[31m-    for (i = 0; i < kcf->max_cached; i++) {[m
[31m-        ngx_queue_insert_head(&kcf->free, &cached[i].queue);[m
[31m-        cached[i].conf = kcf;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_keepalive_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp;[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t   *kcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "init keepalive peer");[m
[31m-[m
[31m-    kcf = ngx_http_conf_upstream_srv_conf(us,[m
[31m-                                          ngx_http_upstream_keepalive_module);[m
[31m-[m
[31m-    kp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_keepalive_peer_data_t));[m
[31m-    if (kp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (kcf->original_init_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    kp->conf = kcf;[m
[31m-    kp->upstream = r->upstream;[m
[31m-    kp->data = r->upstream->peer.data;[m
[31m-    kp->original_get_peer = r->upstream->peer.get;[m
[31m-    kp->original_free_peer = r->upstream->peer.free;[m
[31m-[m
[31m-    r->upstream->peer.data = kp;[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer;[m
[31m-    r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    kp->original_set_session = r->upstream->peer.set_session;[m
[31m-    kp->original_save_session = r->upstream->peer.save_session;[m
[31m-    r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session;[m
[31m-    r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp = data;[m
[31m-    ngx_http_upstream_keepalive_cache_t      *item;[m
[31m-[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_queue_t       *q, *cache;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get keepalive peer");[m
[31m-[m
[31m-    /* ask balancer */[m
[31m-[m
[31m-    rc = kp->original_get_peer(pc, kp->data);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* search cache for suitable connection */[m
[31m-[m
[31m-    cache = &kp->conf->cache;[m
[31m-[m
[31m-    for (q = ngx_queue_head(cache);[m
[31m-         q != ngx_queue_sentinel(cache);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,[m
[31m-                         item->socklen, pc->socklen)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_queue_remove(q);[m
[31m-            ngx_queue_insert_head(&kp->conf->free, q);[m
[31m-[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get keepalive peer: using connection %p", c);[m
[31m-[m
[31m-    c->idle = 0;[m
[31m-    c->sent = 0;[m
[31m-    c->log = pc->log;[m
[31m-    c->read->log = pc->log;[m
[31m-    c->write->log = pc->log;[m
[31m-    c->pool->log = pc->log;[m
[31m-[m
[31m-    pc->connection = c;[m
[31m-    pc->cached = 1;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp = data;[m
[31m-    ngx_http_upstream_keepalive_cache_t      *item;[m
[31m-[m
[31m-    ngx_queue_t          *q;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "free keepalive peer");[m
[31m-[m
[31m-    /* cache valid connections */[m
[31m-[m
[31m-    u = kp->upstream;[m
[31m-    c = pc->connection;[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED[m
[31m-        || c == NULL[m
[31m-        || c->read->eof[m
[31m-        || c->read->error[m
[31m-        || c->read->timedout[m
[31m-        || c->write->error[m
[31m-        || c->write->timedout)[m
[31m-    {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->keepalive) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_body_sent) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_terminate || ngx_exiting) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "free keepalive peer: saving connection %p", c);[m
[31m-[m
[31m-    if (ngx_queue_empty(&kp->conf->free)) {[m
[31m-[m
[31m-        q = ngx_queue_last(&kp->conf->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);[m
[31m-[m
[31m-        ngx_http_upstream_keepalive_close(item->connection);[m
[31m-[m
[31m-    } else {[m
[31m-        q = ngx_queue_head(&kp->conf->free);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue);[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_insert_head(&kp->conf->cache, q);[m
[31m-[m
[31m-    item->connection = c;[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_http_upstream_keepalive_dummy_handler;[m
[31m-    c->read->handler = ngx_http_upstream_keepalive_close_handler;[m
[31m-[m
[31m-    c->data = item;[m
[31m-    c->idle = 1;[m
[31m-    c->log = ngx_cycle->log;[m
[31m-    c->read->log = ngx_cycle->log;[m
[31m-    c->write->log = ngx_cycle->log;[m
[31m-    c->pool->log = ngx_cycle->log;[m
[31m-[m
[31m-    item->socklen = pc->socklen;[m
[31m-    ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        ngx_http_upstream_keepalive_close_handler(c->read);[m
[31m-    }[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    kp->original_free_peer(pc, kp->data, state);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "keepalive dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *conf;[m
[31m-    ngx_http_upstream_keepalive_cache_t     *item;[m
[31m-[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "keepalive close handler");[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {[m
[31m-        ev->ready = 0;[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            goto close;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-close:[m
[31m-[m
[31m-    item = c->data;[m
[31m-    conf = item->conf;[m
[31m-[m
[31m-    ngx_http_upstream_keepalive_close(c);[m
[31m-[m
[31m-    ngx_queue_remove(&item->queue);[m
[31m-    ngx_queue_insert_head(&conf->free, &item->queue);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_keepalive_close(ngx_connection_t *c)[m
[31m-{[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-        c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_http_upstream_keepalive_close;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_destroy_pool(c->pool);[m
[31m-    ngx_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_keepalive_set_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp = data;[m
[31m-[m
[31m-    return kp->original_set_session(pc, kp->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_peer_data_t  *kp = data;[m
[31m-[m
[31m-    kp->original_save_session(pc, kp->data);[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool,[m
[31m-                       sizeof(ngx_http_upstream_keepalive_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->original_init_upstream = NULL;[m
[31m-     *     conf->original_init_peer = NULL;[m
[31m-     *     conf->max_cached = 0;[m
[31m-     */[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t            *uscf;[m
[31m-    ngx_http_upstream_keepalive_srv_conf_t  *kcf = conf;[m
[31m-[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_str_t   *value;[m
[31m-[m
[31m-    if (kcf->max_cached) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* read options */[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    n = ngx_atoi(value[1].data, value[1].len);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid value \"%V\" in \"%V\" directive",[m
[31m-                           &value[1], &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    kcf->max_cached = n;[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    kcf->original_init_upstream = uscf->peer.init_upstream[m
[31m-                                  ? uscf->peer.init_upstream[m
[31m-                                  : ngx_http_upstream_init_round_robin;[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_upstream_init_keepalive;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_least_conn_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_least_conn_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8a300c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_least_conn_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,312 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_init_least_conn_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_upstream_get_least_conn_peer([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-static char *ngx_http_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_least_conn_commands[] = {[m
[31m-[m
[31m-    { ngx_string("least_conn"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_upstream_least_conn,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_least_conn_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_least_conn_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_least_conn_module_ctx, /* module context */[m
[31m-    ngx_http_upstream_least_conn_commands, /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_least_conn(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,[m
[31m-                   "init least conn");[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_least_conn_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_least_conn_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "init least conn peer");[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_least_conn_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    time_t                         now;[m
[31m-    uintptr_t                      m;[m
[31m-    ngx_int_t                      rc, total;[m
[31m-    ngx_uint_t                     i, n, p, many;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer, *best;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get least conn peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    if (rrp->peers->single) {[m
[31m-        return ngx_http_upstream_get_round_robin_peer(pc, rrp);[m
[31m-    }[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_wlock(peers);[m
[31m-[m
[31m-    best = NULL;[m
[31m-    total = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    many = 0;[m
[31m-    p = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (peer = peers->peer, i = 0;[m
[31m-         peer;[m
[31m-         peer = peer->next, i++)[m
[31m-    {[m
[31m-[m
[31m-        n = i / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (rrp->tried[n] & m) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * select peer with least number of connections; if there are[m
[31m-         * multiple peers with the same number of connections, select[m
[31m-         * based on round-robin[m
[31m-         */[m
[31m-[m
[31m-        if (best == NULL[m
[31m-            || peer->conns * best->weight < best->conns * peer->weight)[m
[31m-        {[m
[31m-            best = peer;[m
[31m-            many = 0;[m
[31m-            p = i;[m
[31m-[m
[31m-        } else if (peer->conns * best->weight == best->conns * peer->weight) {[m
[31m-            many = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (best == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get least conn peer, no peer found");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (many) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get least conn peer, many");[m
[31m-[m
[31m-        for (peer = best, i = p;[m
[31m-             peer;[m
[31m-             peer = peer->next, i++)[m
[31m-        {[m
[31m-            n = i / (8 * sizeof(uintptr_t));[m
[31m-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-            if (rrp->tried[n] & m) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->down) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->conns * best->weight != best->conns * peer->weight) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->max_fails[m
[31m-                && peer->fails >= peer->max_fails[m
[31m-                && now - peer->checked <= peer->fail_timeout)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            peer->current_weight += peer->effective_weight;[m
[31m-            total += peer->effective_weight;[m
[31m-[m
[31m-            if (peer->effective_weight < peer->weight) {[m
[31m-                peer->effective_weight++;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->current_weight > best->current_weight) {[m
[31m-                best = peer;[m
[31m-                p = i;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    best->current_weight -= total;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    pc->sockaddr = best->sockaddr;[m
[31m-    pc->socklen = best->socklen;[m
[31m-    pc->name = &best->name;[m
[31m-[m
[31m-    best->conns++;[m
[31m-[m
[31m-    rrp->current = best;[m
[31m-[m
[31m-    n = p / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    rrp->tried[n] |= m;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (peers->next) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get least conn peer, backup servers");[m
[31m-[m
[31m-        rrp->peers = peers->next;[m
[31m-[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            rrp->tried[i] = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        rc = ngx_http_upstream_get_least_conn_peer(pc, rrp);[m
[31m-[m
[31m-        if (rc != NGX_BUSY) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_wlock(peers);[m
[31m-    }[m
[31m-[m
[31m-    /* all peers failed, mark them as live for quick recovery */[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        peer->fails = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    pc->name = peers->name;[m
[31m-[m
[31m-    return NGX_BUSY;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_upstream_init_least_conn;[m
[31m-[m
[31m-    uscf->flags = NGX_HTTP_UPSTREAM_CREATE[m
[31m-                  |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                  |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_HTTP_UPSTREAM_DOWN[m
[31m-                  |NGX_HTTP_UPSTREAM_BACKUP;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_zone_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_zone_module.c[m
[1mdeleted file mode 100644[m
[1mindex 7e5bd74..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_upstream_zone_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,246 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,[m
[31m-    void *data);[m
[31m-static ngx_http_upstream_rr_peers_t *ngx_http_upstream_zone_copy_peers([m
[31m-    ngx_slab_pool_t *shpool, ngx_http_upstream_srv_conf_t *uscf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_zone_commands[] = {[m
[31m-[m
[31m-    { ngx_string("zone"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_upstream_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_zone_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_zone_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_zone_module_ctx,    /* module context */[m
[31m-    ngx_http_upstream_zone_commands,       /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ssize_t                         size;[m
[31m-    ngx_str_t                      *value;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-    umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (!value[1].len) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid zone name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        size = ngx_parse_size(&value[2]);[m
[31m-[m
[31m-        if (size == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid zone size \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "zone \"%V\" is too small", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = 0;[m
[31m-    }[m
[31m-[m
[31m-    uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size,[m
[31m-                                           &ngx_http_upstream_module);[m
[31m-    if (uscf->shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf->shm_zone->init = ngx_http_upstream_init_zone;[m
[31m-    uscf->shm_zone->data = umcf;[m
[31m-[m
[31m-    uscf->shm_zone->noreuse = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_slab_pool_t                *shpool;[m
[31m-    ngx_http_upstream_rr_peers_t   *peers, **peersp;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-    umcf = shm_zone->data;[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        peers = shpool->data;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->shm_zone != shm_zone) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            uscf->peer.data = peers;[m
[31m-            peers = peers->zone_next;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-[m
[31m-    /* copy peers to shared memory */[m
[31m-[m
[31m-    peersp = (ngx_http_upstream_rr_peers_t **) (void *) &shpool->data;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->shm_zone != shm_zone) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        peers = ngx_http_upstream_zone_copy_peers(shpool, uscf);[m
[31m-        if (peers == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *peersp = peers;[m
[31m-        peersp = &peers->zone_next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_rr_peers_t *[m
[31m-ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_t   *peer, **peerp;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers, *backup;[m
[31m-[m
[31m-    peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-[m
[31m-    peers->shpool = shpool;[m
[31m-[m
[31m-    for (peerp = &peers->peer; *peerp; peerp = &peer->next) {[m
[31m-        /* pool is unlocked */[m
[31m-        peer = ngx_slab_calloc_locked(shpool,[m
[31m-                                      sizeof(ngx_http_upstream_rr_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));[m
[31m-[m
[31m-        *peerp = peer;[m
[31m-    }[m
[31m-[m
[31m-    if (peers->next == NULL) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-    if (backup == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-[m
[31m-    backup->shpool = shpool;[m
[31m-[m
[31m-    for (peerp = &backup->peer; *peerp; peerp = &peer->next) {[m
[31m-        /* pool is unlocked */[m
[31m-        peer = ngx_slab_calloc_locked(shpool,[m
[31m-                                      sizeof(ngx_http_upstream_rr_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer, *peerp, sizeof(ngx_http_upstream_rr_peer_t));[m
[31m-[m
[31m-        *peerp = peer;[m
[31m-    }[m
[31m-[m
[31m-    peers->next = backup;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    uscf->peer.data = peers;[m
[31m-[m
[31m-    return peers;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_userid_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_userid_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 1487c09..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_userid_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,842 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_USERID_OFF   0[m
[31m-#define NGX_HTTP_USERID_LOG   1[m
[31m-#define NGX_HTTP_USERID_V1    2[m
[31m-#define NGX_HTTP_USERID_ON    3[m
[31m-[m
[31m-/* 31 Dec 2037 23:55:55 GMT */[m
[31m-#define NGX_HTTP_USERID_MAX_EXPIRES  2145916555[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  enable;[m
[31m-[m
[31m-    ngx_int_t   service;[m
[31m-[m
[31m-    ngx_str_t   name;[m
[31m-    ngx_str_t   domain;[m
[31m-    ngx_str_t   path;[m
[31m-    ngx_str_t   p3p;[m
[31m-[m
[31m-    time_t      expires;[m
[31m-[m
[31m-    u_char      mark;[m
[31m-} ngx_http_userid_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t    uid_got[4];[m
[31m-    uint32_t    uid_set[4];[m
[31m-    ngx_str_t   cookie;[m
[31m-    ngx_uint_t  reset;[m
[31m-} ngx_http_userid_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_http_userid_ctx_t *ngx_http_userid_get_uid(ngx_http_request_t *r,[m
[31m-    ngx_http_userid_conf_t *conf);[m
[31m-static ngx_int_t ngx_http_userid_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, ngx_str_t *name, uint32_t *uid);[m
[31m-static ngx_int_t ngx_http_userid_set_uid(ngx_http_request_t *r,[m
[31m-    ngx_http_userid_ctx_t *ctx, ngx_http_userid_conf_t *conf);[m
[31m-static ngx_int_t ngx_http_userid_create_uid(ngx_http_request_t *r,[m
[31m-    ngx_http_userid_ctx_t *ctx, ngx_http_userid_conf_t *conf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_userid_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_userid_init(ngx_conf_t *cf);[m
[31m-static void *ngx_http_userid_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_userid_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_userid_domain(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_userid_path(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_userid_expires(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_userid_p3p(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_userid_mark(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_http_userid_init_worker(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-[m
[31m-static uint32_t  start_value;[m
[31m-static uint32_t  sequencer_v1 = 1;[m
[31m-static uint32_t  sequencer_v2 = 0x03030302;[m
[31m-[m
[31m-[m
[31m-static u_char expires[] = "; expires=Thu, 31-Dec-37 23:55:55 GMT";[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_userid_state[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_USERID_OFF },[m
[31m-    { ngx_string("log"), NGX_HTTP_USERID_LOG },[m
[31m-    { ngx_string("v1"), NGX_HTTP_USERID_V1 },[m
[31m-    { ngx_string("on"), NGX_HTTP_USERID_ON },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_handler_pt  ngx_http_userid_domain_p =[m
[31m-    ngx_http_userid_domain;[m
[31m-static ngx_conf_post_handler_pt  ngx_http_userid_path_p = ngx_http_userid_path;[m
[31m-static ngx_conf_post_handler_pt  ngx_http_userid_p3p_p = ngx_http_userid_p3p;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_userid_commands[] = {[m
[31m-[m
[31m-    { ngx_string("userid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, enable),[m
[31m-      ngx_http_userid_state },[m
[31m-[m
[31m-    { ngx_string("userid_service"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, service),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("userid_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("userid_domain"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, domain),[m
[31m-      &ngx_http_userid_domain_p },[m
[31m-[m
[31m-    { ngx_string("userid_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, path),[m
[31m-      &ngx_http_userid_path_p },[m
[31m-[m
[31m-    { ngx_string("userid_expires"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_userid_expires,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("userid_p3p"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_userid_conf_t, p3p),[m
[31m-      &ngx_http_userid_p3p_p },[m
[31m-[m
[31m-    { ngx_string("userid_mark"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_userid_mark,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_userid_filter_module_ctx = {[m
[31m-    ngx_http_userid_add_variables,         /* preconfiguration */[m
[31m-    ngx_http_userid_init,                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_userid_create_conf,           /* create location configuration */[m
[31m-    ngx_http_userid_merge_conf             /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_userid_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_userid_filter_module_ctx,    /* module context */[m
[31m-    ngx_http_userid_commands,              /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    ngx_http_userid_init_worker,           /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t   ngx_http_userid_got = ngx_string("uid_got");[m
[31m-static ngx_str_t   ngx_http_userid_set = ngx_string("uid_set");[m
[31m-static ngx_str_t   ngx_http_userid_reset = ngx_string("uid_reset");[m
[31m-static ngx_uint_t  ngx_http_userid_reset_index;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_userid_ctx_t   *ctx;[m
[31m-    ngx_http_userid_conf_t  *conf;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_userid_filter_module);[m
[31m-[m
[31m-    if (conf->enable < NGX_HTTP_USERID_V1) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_userid_get_uid(r, conf);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_userid_set_uid(r, ctx, conf) == NGX_OK) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_got_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_userid_ctx_t   *ctx;[m
[31m-    ngx_http_userid_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r->main, ngx_http_userid_filter_module);[m
[31m-[m
[31m-    if (conf->enable == NGX_HTTP_USERID_OFF) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_userid_get_uid(r->main, conf);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->uid_got[3] != 0) {[m
[31m-        return ngx_http_userid_variable(r->main, v, &conf->name, ctx->uid_got);[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_set_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_userid_ctx_t   *ctx;[m
[31m-    ngx_http_userid_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r->main, ngx_http_userid_filter_module);[m
[31m-[m
[31m-    if (conf->enable < NGX_HTTP_USERID_V1) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_userid_get_uid(r->main, conf);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_userid_create_uid(r->main, ctx, conf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->uid_set[3] == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_userid_variable(r->main, v, &conf->name, ctx->uid_set);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_userid_ctx_t *[m
[31m-ngx_http_userid_get_uid(ngx_http_request_t *r, ngx_http_userid_conf_t *conf)[m
[31m-{[m
[31m-    ngx_int_t                n;[m
[31m-    ngx_str_t                src, dst;[m
[31m-    ngx_table_elt_t        **cookies;[m
[31m-    ngx_http_userid_ctx_t   *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_userid_filter_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        return ctx;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_userid_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_userid_filter_module);[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &conf->name,[m
[31m-                                          &ctx->cookie);[m
[31m-    if (n == NGX_DECLINED) {[m
[31m-        return ctx;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uid cookie: \"%V\"", &ctx->cookie);[m
[31m-[m
[31m-    if (ctx->cookie.len < 22) {[m
[31m-        cookies = r->headers_in.cookies.elts;[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent too short userid cookie \"%V\"",[m
[31m-                      &cookies[n]->value);[m
[31m-        return ctx;[m
[31m-    }[m
[31m-[m
[31m-    src = ctx->cookie;[m
[31m-[m
[31m-    /*[m
[31m-     * we have to limit the encoded string to 22 characters because[m
[31m-     *  1) cookie may be marked by "userid_mark",[m
[31m-     *  2) and there are already the millions cookies with a garbage[m
[31m-     *     instead of the correct base64 trail "=="[m
[31m-     */[m
[31m-[m
[31m-    src.len = 22;[m
[31m-[m
[31m-    dst.data = (u_char *) ctx->uid_got;[m
[31m-[m
[31m-    if (ngx_decode_base64(&dst, &src) == NGX_ERROR) {[m
[31m-        cookies = r->headers_in.cookies.elts;[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client sent invalid userid cookie \"%V\"",[m
[31m-                      &cookies[n]->value);[m
[31m-        return ctx;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uid: %08XD%08XD%08XD%08XD",[m
[31m-                   ctx->uid_got[0], ctx->uid_got[1],[m
[31m-                   ctx->uid_got[2], ctx->uid_got[3]);[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_set_uid(ngx_http_request_t *r, ngx_http_userid_ctx_t *ctx,[m
[31m-    ngx_http_userid_conf_t *conf)[m
[31m-{[m
[31m-    u_char           *cookie, *p;[m
[31m-    size_t            len;[m
[31m-    ngx_str_t         src, dst;[m
[31m-    ngx_table_elt_t  *set_cookie, *p3p;[m
[31m-[m
[31m-    if (ngx_http_userid_create_uid(r, ctx, conf) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->uid_set[3] == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = conf->name.len + 1 + ngx_base64_encoded_length(16) + conf->path.len;[m
[31m-[m
[31m-    if (conf->expires) {[m
[31m-        len += sizeof(expires) - 1 + 2;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->domain.len) {[m
[31m-        len += conf->domain.len;[m
[31m-    }[m
[31m-[m
[31m-    cookie = ngx_pnalloc(r->pool, len);[m
[31m-    if (cookie == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(cookie, conf->name.data, conf->name.len);[m
[31m-    *p++ = '=';[m
[31m-[m
[31m-    if (ctx->uid_got[3] == 0 || ctx->reset) {[m
[31m-        src.len = 16;[m
[31m-        src.data = (u_char *) ctx->uid_set;[m
[31m-        dst.data = p;[m
[31m-[m
[31m-        ngx_encode_base64(&dst, &src);[m
[31m-[m
[31m-        p += dst.len;[m
[31m-[m
[31m-        if (conf->mark) {[m
[31m-            *(p - 2) = conf->mark;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_cpymem(p, ctx->cookie.data, 22);[m
[31m-        *p++ = conf->mark;[m
[31m-        *p++ = '=';[m
[31m-    }[m
[31m-[m
[31m-    if (conf->expires == NGX_HTTP_USERID_MAX_EXPIRES) {[m
[31m-        p = ngx_cpymem(p, expires, sizeof(expires) - 1);[m
[31m-[m
[31m-    } else if (conf->expires) {[m
[31m-        p = ngx_cpymem(p, expires, sizeof("; expires=") - 1);[m
[31m-        p = ngx_http_cookie_time(p, ngx_time() + conf->expires);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(p, conf->domain.data, conf->domain.len);[m
[31m-[m
[31m-    p = ngx_copy(p, conf->path.data, conf->path.len);[m
[31m-[m
[31m-    set_cookie = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (set_cookie == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    set_cookie->hash = 1;[m
[31m-    ngx_str_set(&set_cookie->key, "Set-Cookie");[m
[31m-    set_cookie->value.len = p - cookie;[m
[31m-    set_cookie->value.data = cookie;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uid cookie: \"%V\"", &set_cookie->value);[m
[31m-[m
[31m-    if (conf->p3p.len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p3p = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (p3p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p3p->hash = 1;[m
[31m-    ngx_str_set(&p3p->key, "P3P");[m
[31m-    p3p->value = conf->p3p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_create_uid(ngx_http_request_t *r, ngx_http_userid_ctx_t *ctx,[m
[31m-    ngx_http_userid_conf_t *conf)[m
[31m-{[m
[31m-    ngx_connection_t           *c;[m
[31m-    struct sockaddr_in         *sin;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                     *p;[m
[31m-    struct sockaddr_in6        *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->uid_set[3] != 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->uid_got[3] != 0) {[m
[31m-[m
[31m-        vv = ngx_http_get_indexed_variable(r, ngx_http_userid_reset_index);[m
[31m-[m
[31m-        if (vv->len == 0 || (vv->len == 1 && vv->data[0] == '0')) {[m
[31m-[m
[31m-            if (conf->mark == '\0'[m
[31m-                || (ctx->cookie.len > 23[m
[31m-                    && ctx->cookie.data[22] == conf->mark[m
[31m-                    && ctx->cookie.data[23] == '='))[m
[31m-            {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            ctx->uid_set[0] = ctx->uid_got[0];[m
[31m-            ctx->uid_set[1] = ctx->uid_got[1];[m
[31m-            ctx->uid_set[2] = ctx->uid_got[2];[m
[31m-            ctx->uid_set[3] = ctx->uid_got[3];[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->reset = 1;[m
[31m-[m
[31m-            if (vv->len == 3 && ngx_strncmp(vv->data, "log", 3) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                        "userid cookie \"%V=%08XD%08XD%08XD%08XD\" was reset",[m
[31m-                        &conf->name, ctx->uid_got[0], ctx->uid_got[1],[m
[31m-                        ctx->uid_got[2], ctx->uid_got[3]);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * TODO: in the threaded mode the sequencers should be in TLS and their[m
[31m-     * ranges should be divided between threads[m
[31m-     */[m
[31m-[m
[31m-    if (conf->enable == NGX_HTTP_USERID_V1) {[m
[31m-        if (conf->service == NGX_CONF_UNSET) {[m
[31m-            ctx->uid_set[0] = 0;[m
[31m-        } else {[m
[31m-            ctx->uid_set[0] = conf->service;[m
[31m-        }[m
[31m-        ctx->uid_set[1] = (uint32_t) ngx_time();[m
[31m-        ctx->uid_set[2] = start_value;[m
[31m-        ctx->uid_set[3] = sequencer_v1;[m
[31m-        sequencer_v1 += 0x100;[m
[31m-[m
[31m-    } else {[m
[31m-        if (conf->service == NGX_CONF_UNSET) {[m
[31m-[m
[31m-            c = r->connection;[m
[31m-[m
[31m-            if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-[m
[31m-                p = (u_char *) &ctx->uid_set[0];[m
[31m-[m
[31m-                *p++ = sin6->sin6_addr.s6_addr[12];[m
[31m-                *p++ = sin6->sin6_addr.s6_addr[13];[m
[31m-                *p++ = sin6->sin6_addr.s6_addr[14];[m
[31m-                *p = sin6->sin6_addr.s6_addr[15];[m
[31m-[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-                ctx->uid_set[0] = sin->sin_addr.s_addr;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->uid_set[0] = htonl(conf->service);[m
[31m-        }[m
[31m-[m
[31m-        ctx->uid_set[1] = htonl((uint32_t) ngx_time());[m
[31m-        ctx->uid_set[2] = htonl(start_value);[m
[31m-        ctx->uid_set[3] = htonl(sequencer_v2);[m
[31m-        sequencer_v2 += 0x100;[m
[31m-        if (sequencer_v2 < 0x03030302) {[m
[31m-            sequencer_v2 = 0x03030302;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    ngx_str_t *name, uint32_t *uid)[m
[31m-{[m
[31m-    v->len = name->len + sizeof("=00001111222233334444555566667777") - 1;[m
[31m-    v->data = ngx_pnalloc(r->pool, v->len);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ngx_sprintf(v->data, "%V=%08XD%08XD%08XD%08XD",[m
[31m-                name, uid[0], uid[1], uid[2], uid[3]);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_reset_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_http_variable_t  *var;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_userid_got, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_userid_got_variable;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_userid_set, 0);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_userid_set_variable;[m
[31m-[m
[31m-    var = ngx_http_add_variable(cf, &ngx_http_userid_reset,[m
[31m-                                NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (var == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    var->get_handler = ngx_http_userid_reset_variable;[m
[31m-[m
[31m-    n = ngx_http_get_variable_index(cf, &ngx_http_userid_reset);[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_userid_reset_index = n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_userid_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_userid_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_userid_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->name = { 0, NULL };[m
[31m-     *     conf->domain = { 0, NULL };[m
[31m-     *     conf->path = { 0, NULL };[m
[31m-     *     conf->p3p = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->enable = NGX_CONF_UNSET_UINT;[m
[31m-    conf->service = NGX_CONF_UNSET;[m
[31m-    conf->expires = NGX_CONF_UNSET;[m
[31m-    conf->mark = (u_char) '\xFF';[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_userid_conf_t *prev = parent;[m
[31m-    ngx_http_userid_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->enable, prev->enable,[m
[31m-                              NGX_HTTP_USERID_OFF);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->name, prev->name, "uid");[m
[31m-    ngx_conf_merge_str_value(conf->domain, prev->domain, "");[m
[31m-    ngx_conf_merge_str_value(conf->path, prev->path, "; path=/");[m
[31m-    ngx_conf_merge_str_value(conf->p3p, prev->p3p, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->service, prev->service, NGX_CONF_UNSET);[m
[31m-    ngx_conf_merge_sec_value(conf->expires, prev->expires, 0);[m
[31m-[m
[31m-    if (conf->mark == (u_char) '\xFF') {[m
[31m-        if (prev->mark == (u_char) '\xFF') {[m
[31m-            conf->mark = '\0';[m
[31m-        } else {[m
[31m-            conf->mark = prev->mark;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_userid_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_domain(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_str_t  *domain = data;[m
[31m-[m
[31m-    u_char  *p, *new;[m
[31m-[m
[31m-    if (ngx_strcmp(domain->data, "none") == 0) {[m
[31m-        ngx_str_set(domain, "");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    new = ngx_pnalloc(cf->pool, sizeof("; domain=") - 1 + domain->len);[m
[31m-    if (new == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(new, "; domain=", sizeof("; domain=") - 1);[m
[31m-    ngx_memcpy(p, domain->data, domain->len);[m
[31m-[m
[31m-    domain->len += sizeof("; domain=") - 1;[m
[31m-    domain->data = new;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_path(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_str_t  *path = data;[m
[31m-[m
[31m-    u_char  *p, *new;[m
[31m-[m
[31m-    new = ngx_pnalloc(cf->pool, sizeof("; path=") - 1 + path->len);[m
[31m-    if (new == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(new, "; path=", sizeof("; path=") - 1);[m
[31m-    ngx_memcpy(p, path->data, path->len);[m
[31m-[m
[31m-    path->len += sizeof("; path=") - 1;[m
[31m-    path->data = new;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_expires(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_userid_conf_t *ucf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (ucf->expires != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "max") == 0) {[m
[31m-        ucf->expires = NGX_HTTP_USERID_MAX_EXPIRES;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        ucf->expires = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ucf->expires = ngx_parse_time(&value[1], 1);[m
[31m-    if (ucf->expires == (time_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_p3p(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_str_t  *p3p = data;[m
[31m-[m
[31m-    if (ngx_strcmp(p3p->data, "none") == 0) {[m
[31m-        ngx_str_set(p3p, "");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_userid_mark(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_userid_conf_t *ucf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (ucf->mark != (u_char) '\xFF') {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        ucf->mark = '\0';[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len != 1[m
[31m-        || !((value[1].data[0] >= '0' && value[1].data[0] <= '9')[m
[31m-              || (value[1].data[0] >= 'A' && value[1].data[0] <= 'Z')[m
[31m-              || (value[1].data[0] >= 'a' && value[1].data[0] <= 'z')[m
[31m-              || value[1].data[0] == '='))[m
[31m-    {[m
[31m-        return "value must be \"off\" or a single letter, digit or \"=\"";[m
[31m-    }[m
[31m-[m
[31m-    ucf->mark = value[1].data[0];[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_userid_init_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    struct timeval  tp;[m
[31m-[m
[31m-    ngx_gettimeofday(&tp);[m
[31m-[m
[31m-    /* use the most significant usec part that fits to 16 bits */[m
[31m-    start_value = ((tp.tv_usec / 20) << 16) | ngx_pid;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_uwsgi_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_uwsgi_module.c[m
[1mdeleted file mode 100644[m
[1mindex fef2c46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_uwsgi_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,2361 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Unbit S.a.s. 2009-2010[m
[31m- * Copyright (C) 2008 Manlio Perillo (manlio.perillo@gmail.com)[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                caches;  /* ngx_http_file_cache_t * */[m
[31m-} ngx_http_uwsgi_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t               *flushes;[m
[31m-    ngx_array_t               *lengths;[m
[31m-    ngx_array_t               *values;[m
[31m-    ngx_uint_t                 number;[m
[31m-    ngx_hash_t                 hash;[m
[31m-} ngx_http_uwsgi_params_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_conf_t   upstream;[m
[31m-[m
[31m-    ngx_http_uwsgi_params_t    params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_uwsgi_params_t    params_cache;[m
[31m-#endif[m
[31m-    ngx_array_t               *params_source;[m
[31m-[m
[31m-    ngx_array_t               *uwsgi_lengths;[m
[31m-    ngx_array_t               *uwsgi_values;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_complex_value_t   cache_key;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_str_t                  uwsgi_string;[m
[31m-[m
[31m-    ngx_uint_t                 modifier1;[m
[31m-    ngx_uint_t                 modifier2;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_uint_t                 ssl;[m
[31m-    ngx_uint_t                 ssl_protocols;[m
[31m-    ngx_str_t                  ssl_ciphers;[m
[31m-    ngx_uint_t                 ssl_verify_depth;[m
[31m-    ngx_str_t                  ssl_trusted_certificate;[m
[31m-    ngx_str_t                  ssl_crl;[m
[31m-    ngx_str_t                  ssl_certificate;[m
[31m-    ngx_str_t                  ssl_certificate_key;[m
[31m-    ngx_array_t               *ssl_passwords;[m
[31m-#endif[m
[31m-} ngx_http_uwsgi_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_uwsgi_eval(ngx_http_request_t *r,[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf);[m
[31m-static ngx_int_t ngx_http_uwsgi_create_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_uwsgi_reinit_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_uwsgi_process_status_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_uwsgi_process_header(ngx_http_request_t *r);[m
[31m-static void ngx_http_uwsgi_abort_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_uwsgi_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-static void *ngx_http_uwsgi_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_uwsgi_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_uwsgi_init_params(ngx_conf_t *cf,[m
[31m-    ngx_http_uwsgi_loc_conf_t *conf, ngx_http_uwsgi_params_t *params,[m
[31m-    ngx_keyval_t *default_params);[m
[31m-[m
[31m-static char *ngx_http_uwsgi_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_uwsgi_store(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_uwsgi_create_key(ngx_http_request_t *r);[m
[31m-static char *ngx_http_uwsgi_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_uwsgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static char *ngx_http_uwsgi_ssl_password_file(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_http_uwsgi_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_num_bounds_t  ngx_http_uwsgi_modifier_bounds = {[m
[31m-    ngx_conf_check_num_bounds, 0, 255[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t ngx_http_uwsgi_next_upstream_masks[] = {[m
[31m-    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },[m
[31m-    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },[m
[31m-    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },[m
[31m-    { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },[m
[31m-    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },[m
[31m-    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_uwsgi_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_uwsgi_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_uwsgi_commands[] = {[m
[31m-[m
[31m-    { ngx_string("uwsgi_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_modifier1"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, modifier1),[m
[31m-      &ngx_http_uwsgi_modifier_bounds },[m
[31m-[m
[31m-    { ngx_string("uwsgi_modifier2"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, modifier2),[m
[31m-      &ngx_http_uwsgi_modifier_bounds },[m
[31m-[m
[31m-    { ngx_string("uwsgi_store"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_store,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_store_access"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,[m
[31m-      ngx_conf_set_access_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.store_access),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_request_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.request_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ignore_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ignore_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_bind"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream_bind_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.local),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_pass_request_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.pass_request_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_pass_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.pass_request_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_intercept_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.intercept_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_busy_buffers_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.busy_buffers_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_force_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.force_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_cache_key,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_file_cache_set_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_main_conf_t, caches),[m
[31m-      &ngx_http_uwsgi_module },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_bypass"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_bypass),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_no_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_set_predicate_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.no_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_file_cache_valid_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_use_stale"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_use_stale),[m
[31m-      &ngx_http_uwsgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_methods"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_methods),[m
[31m-      &ngx_http_upstream_cache_method_mask },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_lock"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_lock_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_lock_age"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_lock_age),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_cache_revalidate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.cache_revalidate),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("uwsgi_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_max_temp_file_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.max_temp_file_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_temp_file_write_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.temp_file_write_size_conf),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_next_upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.next_upstream),[m
[31m-      &ngx_http_uwsgi_next_upstream_masks },[m
[31m-[m
[31m-    { ngx_string("uwsgi_next_upstream_tries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_next_upstream_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23,[m
[31m-      ngx_http_upstream_param_set_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, params_source),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_string"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, uwsgi_string),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_pass_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.pass_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_hide_header"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.hide_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ignore_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ignore_headers),[m
[31m-      &ngx_http_upstream_ignore_headers_masks },[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_session_reuse"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ssl_session_reuse),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_protocols),[m
[31m-      &ngx_http_uwsgi_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_set_complex_value_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ssl_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_server_name"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ssl_server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_verify"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.ssl_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_certificate_key"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_uwsgi_loc_conf_t, ssl_certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("uwsgi_ssl_password_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_uwsgi_ssl_password_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_uwsgi_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_uwsgi_create_main_conf,       /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_uwsgi_create_loc_conf,        /* create location configuration */[m
[31m-    ngx_http_uwsgi_merge_loc_conf          /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_uwsgi_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_uwsgi_module_ctx,            /* module context */[m
[31m-    ngx_http_uwsgi_commands,               /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_uwsgi_hide_headers[] = {[m
[31m-    ngx_string("X-Accel-Expires"),[m
[31m-    ngx_string("X-Accel-Redirect"),[m
[31m-    ngx_string("X-Accel-Limit-Rate"),[m
[31m-    ngx_string("X-Accel-Buffering"),[m
[31m-    ngx_string("X-Accel-Charset"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_keyval_t  ngx_http_uwsgi_cache_headers[] = {[m
[31m-    { ngx_string("HTTP_IF_MODIFIED_SINCE"),[m
[31m-      ngx_string("$upstream_cache_last_modified") },[m
[31m-    { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("$upstream_cache_etag") },[m
[31m-    { ngx_string("HTTP_IF_MATCH"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_RANGE"), ngx_string("") },[m
[31m-    { ngx_string("HTTP_IF_RANGE"), ngx_string("") },[m
[31m-    { ngx_null_string, ngx_null_string }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t ngx_http_uwsgi_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_UWSGI_TEMP_PATH), { 1, 2, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_status_t           *status;[m
[31m-    ngx_http_upstream_t         *u;[m
[31m-    ngx_http_uwsgi_loc_conf_t   *uwcf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_uwsgi_main_conf_t  *uwmcf;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    status = ngx_pcalloc(r->pool, sizeof(ngx_http_status_t));[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, status, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    uwcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (uwcf->uwsgi_lengths == NULL) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl = (uwcf->upstream.ssl != NULL);[m
[31m-[m
[31m-        if (u->ssl) {[m
[31m-            ngx_str_set(&u->schema, "suwsgi://");[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_set(&u->schema, "uwsgi://");[m
[31m-        }[m
[31m-#else[m
[31m-        ngx_str_set(&u->schema, "uwsgi://");[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_uwsgi_eval(r, uwcf) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_http_uwsgi_module;[m
[31m-[m
[31m-    u->conf = &uwcf->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    uwmcf = ngx_http_get_module_main_conf(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    u->caches = &uwmcf->caches;[m
[31m-    u->create_key = ngx_http_uwsgi_create_key;[m
[31m-#endif[m
[31m-[m
[31m-    u->create_request = ngx_http_uwsgi_create_request;[m
[31m-    u->reinit_request = ngx_http_uwsgi_reinit_request;[m
[31m-    u->process_header = ngx_http_uwsgi_process_status_line;[m
[31m-    u->abort_request = ngx_http_uwsgi_abort_request;[m
[31m-    u->finalize_request = ngx_http_uwsgi_finalize_request;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    u->buffering = uwcf->upstream.buffering;[m
[31m-[m
[31m-    u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));[m
[31m-    if (u->pipe == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->pipe->input_filter = ngx_event_pipe_copy_input_filter;[m
[31m-    u->pipe->input_ctx = r;[m
[31m-[m
[31m-    if (!uwcf->upstream.request_buffering[m
[31m-        && uwcf->upstream.pass_request_body[m
[31m-        && !r->headers_in.chunked)[m
[31m-    {[m
[31m-        r->request_body_no_buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_eval(ngx_http_request_t *r, ngx_http_uwsgi_loc_conf_t * uwcf)[m
[31m-{[m
[31m-    size_t                add;[m
[31m-    ngx_url_t             url;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    if (ngx_http_script_run(r, &url.url, uwcf->uwsgi_lengths->elts, 0,[m
[31m-                            uwcf->uwsgi_values->elts)[m
[31m-        == NULL)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.url.len > 8[m
[31m-        && ngx_strncasecmp(url.url.data, (u_char *) "uwsgi://", 8) == 0)[m
[31m-    {[m
[31m-        add = 8;[m
[31m-[m
[31m-    } else if (url.url.len > 9[m
[31m-               && ngx_strncasecmp(url.url.data, (u_char *) "suwsgi://", 9) == 0)[m
[31m-    {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        add = 9;[m
[31m-        r->upstream->ssl = 1;[m
[31m-#else[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "suwsgi protocol requires SSL support");[m
[31m-        return NGX_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        add = 0;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (add) {[m
[31m-        u->schema.len = add;[m
[31m-        u->schema.data = url.url.data;[m
[31m-[m
[31m-        url.url.data += add;[m
[31m-        url.url.len -= add;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&u->schema, "uwsgi://");[m
[31m-    }[m
[31m-[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%s in upstream \"%V\"", url.err, &url.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = url.host;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved->port = url.port;[m
[31m-    u->resolved->no_port = url.no_port;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                  *key;[m
[31m-    ngx_http_uwsgi_loc_conf_t  *uwcf;[m
[31m-[m
[31m-    key = ngx_array_push(&r->cache->keys);[m
[31m-    if (key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uwcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &uwcf->cache_key, key) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                        ch, *lowcase_key;[m
[31m-    size_t                        key_len, val_len, len, allocated;[m
[31m-    ngx_uint_t                    i, n, hash, skip_empty, header_params;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_chain_t                  *cl, *body;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header, **ignored;[m
[31m-    ngx_http_uwsgi_params_t      *params;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e, le;[m
[31m-    ngx_http_uwsgi_loc_conf_t    *uwcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    len = 0;[m
[31m-    header_params = 0;[m
[31m-    ignored = NULL;[m
[31m-[m
[31m-    uwcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    params = r->upstream->cacheable ? &uwcf->params_cache : &uwcf->params;[m
[31m-#else[m
[31m-    params = &uwcf->params;[m
[31m-#endif[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        ngx_http_script_flush_no_cacheable_variables(r, params->flushes);[m
[31m-        le.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-        le.request = r;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = lcode(&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode (&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            len += 2 + key_len + 2 + val_len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (uwcf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        allocated = 0;[m
[31m-        lowcase_key = NULL;[m
[31m-[m
[31m-        if (params->number) {[m
[31m-            n = 0;[m
[31m-            part = &r->headers_in.headers.part;[m
[31m-[m
[31m-            while (part) {[m
[31m-                n += part->nelts;[m
[31m-                part = part->next;[m
[31m-            }[m
[31m-[m
[31m-            ignored = ngx_palloc(r->pool, n * sizeof(void *));[m
[31m-            if (ignored == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (params->number) {[m
[31m-                if (allocated < header[i].key.len) {[m
[31m-                    allocated = header[i].key.len + 16;[m
[31m-                    lowcase_key = ngx_pnalloc(r->pool, allocated);[m
[31m-                    if (lowcase_key == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                hash = 0;[m
[31m-[m
[31m-                for (n = 0; n < header[i].key.len; n++) {[m
[31m-                    ch = header[i].key.data[n];[m
[31m-[m
[31m-                    if (ch >= 'A' && ch <= 'Z') {[m
[31m-                        ch |= 0x20;[m
[31m-[m
[31m-                    } else if (ch == '-') {[m
[31m-                        ch = '_';[m
[31m-                    }[m
[31m-[m
[31m-                    hash = ngx_hash(hash, ch);[m
[31m-                    lowcase_key[n] = ch;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_hash_find(&params->hash, hash, lowcase_key, n)) {[m
[31m-                    ignored[header_params++] = &header[i];[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            len += 2 + sizeof("HTTP_") - 1 + header[i].key.len[m
[31m-                 + 2 + header[i].value.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len += uwcf->uwsgi_string.len;[m
[31m-[m
[31m-#if 0[m
[31m-    /* allow custom uwsgi packet */[m
[31m-    if (len > 0 && len < 2) {[m
[31m-        ngx_log_error (NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                       "uwsgi request is too little: %uz", len);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len + 4);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-[m
[31m-    *b->last++ = (u_char) uwcf->modifier1;[m
[31m-    *b->last++ = (u_char) (len & 0xff);[m
[31m-    *b->last++ = (u_char) ((len >> 8) & 0xff);[m
[31m-    *b->last++ = (u_char) uwcf->modifier2;[m
[31m-[m
[31m-    if (params->lengths) {[m
[31m-        ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        e.ip = params->values->elts;[m
[31m-        e.pos = b->last;[m
[31m-        e.request = r;[m
[31m-        e.flushed = 1;[m
[31m-[m
[31m-        le.ip = params->lengths->elts;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            key_len = (u_char) lcode (&le);[m
[31m-[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            skip_empty = lcode(&le);[m
[31m-[m
[31m-            for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            }[m
[31m-            le.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            if (skip_empty && val_len == 0) {[m
[31m-                e.skip = 1;[m
[31m-[m
[31m-                while (*(uintptr_t *) e.ip) {[m
[31m-                    code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                    code((ngx_http_script_engine_t *) &e);[m
[31m-                }[m
[31m-                e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-                e.skip = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            *e.pos++ = (u_char) (key_len & 0xff);[m
[31m-            *e.pos++ = (u_char) ((key_len >> 8) & 0xff);[m
[31m-[m
[31m-            code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-            code((ngx_http_script_engine_t *) & e);[m
[31m-[m
[31m-            *e.pos++ = (u_char) (val_len & 0xff);[m
[31m-            *e.pos++ = (u_char) ((val_len >> 8) & 0xff);[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) & e);[m
[31m-            }[m
[31m-[m
[31m-            e.ip += sizeof(uintptr_t);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "uwsgi param: \"%*s: %*s\"",[m
[31m-                           key_len, e.pos - (key_len + 2 + val_len),[m
[31m-                           val_len, e.pos - val_len);[m
[31m-        }[m
[31m-[m
[31m-        b->last = e.pos;[m
[31m-    }[m
[31m-[m
[31m-    if (uwcf->upstream.pass_request_headers) {[m
[31m-[m
[31m-        part = &r->headers_in.headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            for (n = 0; n < header_params; n++) {[m
[31m-                if (&header[i] == ignored[n]) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            key_len = sizeof("HTTP_") - 1 + header[i].key.len;[m
[31m-            *b->last++ = (u_char) (key_len & 0xff);[m
[31m-            *b->last++ = (u_char) ((key_len >> 8) & 0xff);[m
[31m-[m
[31m-            b->last = ngx_cpymem(b->last, "HTTP_", sizeof("HTTP_") - 1);[m
[31m-            for (n = 0; n < header[i].key.len; n++) {[m
[31m-                ch = header[i].key.data[n];[m
[31m-[m
[31m-                if (ch >= 'a' && ch <= 'z') {[m
[31m-                    ch &= ~0x20;[m
[31m-[m
[31m-                } else if (ch == '-') {[m
[31m-                    ch = '_';[m
[31m-                }[m
[31m-[m
[31m-                *b->last++ = ch;[m
[31m-            }[m
[31m-[m
[31m-            val_len = header[i].value.len;[m
[31m-            *b->last++ = (u_char) (val_len & 0xff);[m
[31m-            *b->last++ = (u_char) ((val_len >> 8) & 0xff);[m
[31m-            b->last = ngx_copy(b->last, header[i].value.data, val_len);[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "uwsgi param: \"%*s: %*s\"",[m
[31m-                           key_len, b->last - (key_len + 2 + val_len),[m
[31m-                           val_len, b->last - val_len);[m
[31m-        next:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, uwcf->uwsgi_string.data,[m
[31m-                       uwcf->uwsgi_string.len);[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-[m
[31m-    } else if (uwcf->upstream.pass_request_body) {[m
[31m-        body = r->upstream->request_bufs;[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-[m
[31m-        while (body) {[m
[31m-            b = ngx_alloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            cl->next = ngx_alloc_chain_link(r->pool);[m
[31m-            if (cl->next == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl = cl->next;[m
[31m-            cl->buf = b;[m
[31m-[m
[31m-            body = body->next;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->upstream->request_bufs = cl;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_status_t  *status;[m
[31m-[m
[31m-    status = ngx_http_get_module_ctx(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    status->code = 0;[m
[31m-    status->count = 0;[m
[31m-    status->start = NULL;[m
[31m-    status->end = NULL;[m
[31m-[m
[31m-    r->upstream->process_header = ngx_http_uwsgi_process_status_line;[m
[31m-    r->state = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_process_status_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                 len;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_http_status_t     *status;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    status = ngx_http_get_module_ctx(r, ngx_http_uwsgi_module);[m
[31m-[m
[31m-    if (status == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    rc = ngx_http_parse_status_line(r, &u->buffer, status);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        u->process_header = ngx_http_uwsgi_process_header;[m
[31m-        return ngx_http_uwsgi_process_header(r);[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->status == 0) {[m
[31m-        u->state->status = status->code;[m
[31m-    }[m
[31m-[m
[31m-    u->headers_in.status_n = status->code;[m
[31m-[m
[31m-    len = status->end - status->start;[m
[31m-    u->headers_in.status_line.len = len;[m
[31m-[m
[31m-    u->headers_in.status_line.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (u->headers_in.status_line.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u->headers_in.status_line.data, status->start, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http uwsgi status %ui \"%V\"",[m
[31m-                   u->headers_in.status_n, &u->headers_in.status_line);[m
[31m-[m
[31m-    u->process_header = ngx_http_uwsgi_process_header;[m
[31m-[m
[31m-    return ngx_http_uwsgi_process_header(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *status_line;[m
[31m-    ngx_int_t                       rc, status;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->upstream->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-[m
[31m-            h->key.data = ngx_pnalloc(r->pool,[m
[31m-                                      h->key.len + 1 + h->value.len + 1[m
[31m-                                      + h->key.len);[m
[31m-            if (h->key.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h->value.data = h->key.data + h->key.len + 1;[m
[31m-            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;[m
[31m-[m
[31m-            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-            ngx_memcpy(h->value.data, r->header_start, h->value.len);[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http uwsgi header: \"%V: %V\"", &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http uwsgi header done");[m
[31m-[m
[31m-            u = r->upstream;[m
[31m-[m
[31m-            if (u->headers_in.status_n) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (u->headers_in.status) {[m
[31m-                status_line = &u->headers_in.status->value;[m
[31m-[m
[31m-                status = ngx_atoi(status_line->data, 3);[m
[31m-                if (status == NGX_ERROR) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "upstream sent invalid status \"%V\"",[m
[31m-                                  status_line);[m
[31m-                    return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-                }[m
[31m-[m
[31m-                u->headers_in.status_n = status;[m
[31m-                u->headers_in.status_line = *status_line;[m
[31m-[m
[31m-            } else if (u->headers_in.location) {[m
[31m-                u->headers_in.status_n = 302;[m
[31m-                ngx_str_set(&u->headers_in.status_line,[m
[31m-                            "302 Moved Temporarily");[m
[31m-[m
[31m-            } else {[m
[31m-                u->headers_in.status_n = 200;[m
[31m-                ngx_str_set(&u->headers_in.status_line, "200 OK");[m
[31m-            }[m
[31m-[m
[31m-            if (u->state && u->state->status == 0) {[m
[31m-                u->state->status = u->headers_in.status_n;[m
[31m-            }[m
[31m-[m
[31m-        done:[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS[m
[31m-                && r->headers_in.upgrade)[m
[31m-            {[m
[31m-                u->upgrade = 1;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        /* there was error while a header line parsing */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "upstream sent invalid header");[m
[31m-[m
[31m-        return NGX_HTTP_UPSTREAM_INVALID_HEADER;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_uwsgi_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "abort http uwsgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_uwsgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http uwsgi request");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_uwsgi_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_uwsgi_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (ngx_array_init(&conf->caches, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_file_cache_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_uwsgi_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_uwsgi_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->modifier1 = NGX_CONF_UNSET_UINT;[m
[31m-    conf->modifier2 = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->upstream.store = NGX_CONF_UNSET;[m
[31m-    conf->upstream.store_access = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.request_buffering = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->upstream.force_ranges = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->upstream.local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    conf->upstream.pass_request_headers = NGX_CONF_UNSET;[m
[31m-    conf->upstream.pass_request_body = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    conf->upstream.cache = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.no_cache = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.cache_lock = NGX_CONF_UNSET;[m
[31m-    conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.cache_revalidate = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-[m
[31m-    conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;[m
[31m-    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    conf->upstream.intercept_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_server_name = NGX_CONF_UNSET;[m
[31m-    conf->upstream.ssl_verify = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->ssl_passwords = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    /* "uwsgi_cyclic_temp_file" is disabled */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-[m
[31m-    conf->upstream.change_buffering = 1;[m
[31m-[m
[31m-    ngx_str_set(&conf->upstream.module, "uwsgi");[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *prev = parent;[m
[31m-    ngx_http_uwsgi_loc_conf_t *conf = child;[m
[31m-[m
[31m-    size_t                        size;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.store > 0) {[m
[31m-        conf->upstream.cache = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache > 0) {[m
[31m-        conf->upstream.store = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->upstream.store == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.store, prev->upstream.store, 0);[m
[31m-[m
[31m-        conf->upstream.store_lengths = prev->upstream.store_lengths;[m
[31m-        conf->upstream.store_values = prev->upstream.store_values;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.store_access,[m
[31m-                              prev->upstream.store_access, 0600);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,[m
[31m-                              prev->upstream.next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.buffering,[m
[31m-                              prev->upstream.buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.request_buffering,[m
[31m-                              prev->upstream.request_buffering, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ignore_client_abort,[m
[31m-                              prev->upstream.ignore_client_abort, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.force_ranges,[m
[31m-                              prev->upstream.force_ranges, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.local,[m
[31m-                              prev->upstream.local, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.send_timeout,[m
[31m-                              prev->upstream.send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,[m
[31m-                              prev->upstream.next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.send_lowat,[m
[31m-                              prev->upstream.send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.buffer_size,[m
[31m-                              prev->upstream.buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.limit_rate,[m
[31m-                              prev->upstream.limit_rate, 0);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,[m
[31m-                              8, ngx_pagesize);[m
[31m-[m
[31m-    if (conf->upstream.bufs.num < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "there must be at least 2 \"uwsgi_buffers\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = conf->upstream.buffer_size;[m
[31m-    if (size < conf->upstream.bufs.size) {[m
[31m-        size = conf->upstream.bufs.size;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,[m
[31m-                              prev->upstream.busy_buffers_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.busy_buffers_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.busy_buffers_size =[m
[31m-            conf->upstream.busy_buffers_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"uwsgi_busy_buffers_size\" must be equal to or greater "[m
[31m-            "than the maximum of the value of \"uwsgi_buffer_size\" and "[m
[31m-            "one of the \"uwsgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.busy_buffers_size[m
[31m-        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"uwsgi_busy_buffers_size\" must be less than "[m
[31m-            "the size of all \"uwsgi_buffers\" minus one buffer");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,[m
[31m-                              prev->upstream.temp_file_write_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.temp_file_write_size = 2 * size;[m
[31m-    } else {[m
[31m-        conf->upstream.temp_file_write_size =[m
[31m-            conf->upstream.temp_file_write_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.temp_file_write_size < size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"uwsgi_temp_file_write_size\" must be equal to or greater than "[m
[31m-            "the maximum of the value of \"uwsgi_buffer_size\" and "[m
[31m-            "one of the \"uwsgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,[m
[31m-                              prev->upstream.max_temp_file_size_conf,[m
[31m-                              NGX_CONF_UNSET_SIZE);[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {[m
[31m-        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;[m
[31m-    } else {[m
[31m-        conf->upstream.max_temp_file_size =[m
[31m-            conf->upstream.max_temp_file_size_conf;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.max_temp_file_size != 0[m
[31m-        && conf->upstream.max_temp_file_size < size)[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-            "\"uwsgi_max_temp_file_size\" must be equal to zero to disable "[m
[31m-            "temporary files usage or must be equal to or greater than "[m
[31m-            "the maximum of the value of \"uwsgi_buffer_size\" and "[m
[31m-            "one of the \"uwsgi_buffers\"");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,[m
[31m-                                 prev->upstream.ignore_headers,[m
[31m-                                 NGX_CONF_BITMASK_SET);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,[m
[31m-                                 prev->upstream.next_upstream,[m
[31m-                                 (NGX_CONF_BITMASK_SET[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_ERROR[m
[31m-                                  |NGX_HTTP_UPSTREAM_FT_TIMEOUT));[m
[31m-[m
[31m-    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET[m
[31m-                                       |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path,[m
[31m-                                  prev->upstream.temp_path,[m
[31m-                                  &ngx_http_uwsgi_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache == NGX_CONF_UNSET) {[m
[31m-        ngx_conf_merge_value(conf->upstream.cache,[m
[31m-                              prev->upstream.cache, 0);[m
[31m-[m
[31m-        conf->upstream.cache_zone = prev->upstream.cache_zone;[m
[31m-        conf->upstream.cache_value = prev->upstream.cache_value;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) {[m
[31m-        ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-        shm_zone = conf->upstream.cache_zone;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"uwsgi_cache\" zone \"%V\" is unknown",[m
[31m-                           &shm_zone->shm.name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->upstream.cache_min_uses,[m
[31m-                              prev->upstream.cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale,[m
[31m-                              prev->upstream.cache_use_stale,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_UPSTREAM_FT_OFF));[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) {[m
[31m-        conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET[m
[31m-                                         |NGX_HTTP_UPSTREAM_FT_OFF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache_methods == 0) {[m
[31m-        conf->upstream.cache_methods = prev->upstream.cache_methods;[m
[31m-    }[m
[31m-[m
[31m-    conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_bypass,[m
[31m-                             prev->upstream.cache_bypass, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.no_cache,[m
[31m-                             prev->upstream.no_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->upstream.cache_valid,[m
[31m-                             prev->upstream.cache_valid, NULL);[m
[31m-[m
[31m-    if (conf->cache_key.value.data == NULL) {[m
[31m-        conf->cache_key = prev->cache_key;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->upstream.cache && conf->cache_key.value.data == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "no \"uwsgi_cache_key\" for \"uwsgi_cache\"");[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_lock,[m
[31m-                              prev->upstream.cache_lock, 0);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout,[m
[31m-                              prev->upstream.cache_lock_timeout, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.cache_lock_age,[m
[31m-                              prev->upstream.cache_lock_age, 5000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.cache_revalidate,[m
[31m-                              prev->upstream.cache_revalidate, 0);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_headers,[m
[31m-                         prev->upstream.pass_request_headers, 1);[m
[31m-    ngx_conf_merge_value(conf->upstream.pass_request_body,[m
[31m-                         prev->upstream.pass_request_body, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.intercept_errors,[m
[31m-                         prev->upstream.intercept_errors, 0);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_session_reuse,[m
[31m-                              prev->upstream.ssl_session_reuse, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                                  |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,[m
[31m-                             "DEFAULT");[m
[31m-[m
[31m-    if (conf->upstream.ssl_name == NULL) {[m
[31m-        conf->upstream.ssl_name = prev->upstream.ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_server_name,[m
[31m-                              prev->upstream.ssl_server_name, 0);[m
[31m-    ngx_conf_merge_value(conf->upstream.ssl_verify,[m
[31m-                              prev->upstream.ssl_verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                              prev->ssl_trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate,[m
[31m-                              prev->ssl_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate_key,[m
[31m-                              prev->ssl_certificate_key, "");[m
[31m-    ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);[m
[31m-[m
[31m-    if (conf->ssl && ngx_http_uwsgi_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->uwsgi_string, prev->uwsgi_string, "");[m
[31m-[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "uwsgi_hide_headers_hash";[m
[31m-[m
[31m-    if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,[m
[31m-            &prev->upstream, ngx_http_uwsgi_hide_headers, &hash)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->noname[m
[31m-        && conf->upstream.upstream == NULL && conf->uwsgi_lengths == NULL)[m
[31m-    {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-[m
[31m-        conf->uwsgi_lengths = prev->uwsgi_lengths;[m
[31m-        conf->uwsgi_values = prev->uwsgi_values;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        conf->upstream.ssl = prev->upstream.ssl;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lmt_excpt && clcf->handler == NULL[m
[31m-        && (conf->upstream.upstream || conf->uwsgi_lengths))[m
[31m-    {[m
[31m-        clcf->handler = ngx_http_uwsgi_handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->modifier1, prev->modifier1, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->modifier2, prev->modifier2, 0);[m
[31m-[m
[31m-    if (conf->params_source == NULL) {[m
[31m-        conf->params = prev->params;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        conf->params_cache = prev->params_cache;[m
[31m-#endif[m
[31m-        conf->params_source = prev->params_source;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_uwsgi_init_params(cf, conf, &conf->params, NULL);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (conf->upstream.cache) {[m
[31m-        rc = ngx_http_uwsgi_init_params(cf, conf, &conf->params_cache,[m
[31m-                                        ngx_http_uwsgi_cache_headers);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_init_params(ngx_conf_t *cf, ngx_http_uwsgi_loc_conf_t *conf,[m
[31m-    ngx_http_uwsgi_params_t *params, ngx_keyval_t *default_params)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size;[m
[31m-    uintptr_t                    *code;[m
[31m-    ngx_uint_t                    i, nsrc;[m
[31m-    ngx_array_t                   headers_names, params_merged;[m
[31m-    ngx_keyval_t                 *h;[m
[31m-    ngx_hash_key_t               *hk;[m
[31m-    ngx_hash_init_t               hash;[m
[31m-    ngx_http_upstream_param_t    *src, *s;[m
[31m-    ngx_http_script_compile_t     sc;[m
[31m-    ngx_http_script_copy_code_t  *copy;[m
[31m-[m
[31m-    if (params->hash.buckets) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source == NULL && default_params == NULL) {[m
[31m-        params->hash.buckets = (void *) 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    params->lengths = ngx_array_create(cf->pool, 64, 1);[m
[31m-    if (params->lengths == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    params->values = ngx_array_create(cf->pool, 512, 1);[m
[31m-    if (params->values == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params_source) {[m
[31m-        src = conf->params_source->elts;[m
[31m-        nsrc = conf->params_source->nelts;[m
[31m-[m
[31m-    } else {[m
[31m-        src = NULL;[m
[31m-        nsrc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (default_params) {[m
[31m-        if (ngx_array_init(&params_merged, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_upstream_param_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = src[i];[m
[31m-        }[m
[31m-[m
[31m-        h = default_params;[m
[31m-[m
[31m-        while (h->key.len) {[m
[31m-[m
[31m-            src = params_merged.elts;[m
[31m-            nsrc = params_merged.nelts;[m
[31m-[m
[31m-            for (i = 0; i < nsrc; i++) {[m
[31m-                if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(&params_merged);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            s->key = h->key;[m
[31m-            s->value = h->value;[m
[31m-            s->skip_empty = 1;[m
[31m-[m
[31m-        next:[m
[31m-[m
[31m-            h++;[m
[31m-        }[m
[31m-[m
[31m-        src = params_merged.elts;[m
[31m-        nsrc = params_merged.nelts;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < nsrc; i++) {[m
[31m-[m
[31m-        if (src[i].key.len > sizeof("HTTP_") - 1[m
[31m-            && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0)[m
[31m-        {[m
[31m-            hk = ngx_array_push(&headers_names);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key.len = src[i].key.len - 5;[m
[31m-            hk->key.data = src[i].key.data + 5;[m
[31m-            hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-            if (src[i].value.len == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].key.len;[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->lengths,[m
[31m-                                sizeof(ngx_http_script_copy_code_t));[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-        copy->len = src[i].skip_empty;[m
[31m-[m
[31m-[m
[31m-        size = (sizeof(ngx_http_script_copy_code_t)[m
[31m-                + src[i].key.len + sizeof(uintptr_t) - 1)[m
[31m-               & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        copy = ngx_array_push_n(params->values, size);[m
[31m-        if (copy == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        copy->code = ngx_http_script_copy_code;[m
[31m-        copy->len = src[i].key.len;[m
[31m-[m
[31m-        p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);[m
[31m-        ngx_memcpy(p, src[i].key.data, src[i].key.len);[m
[31m-[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &src[i].value;[m
[31m-        sc.flushes = &params->flushes;[m
[31m-        sc.lengths = &params->lengths;[m
[31m-        sc.values = &params->values;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-        code = ngx_array_push_n(params->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_array_push_n(params->lengths, sizeof(uintptr_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) NULL;[m
[31m-[m
[31m-    params->number = headers_names.nelts;[m
[31m-[m
[31m-    hash.hash = &params->hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = 64;[m
[31m-    hash.name = "uwsgi_params_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    size_t                      add;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_str_t                  *value, *url;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (uwcf->upstream.upstream || uwcf->uwsgi_lengths) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_uwsgi_handler;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(url);[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = url;[m
[31m-        sc.lengths = &uwcf->uwsgi_lengths;[m
[31m-        sc.values = &uwcf->uwsgi_values;[m
[31m-        sc.variables = n;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        uwcf->ssl = 1;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncasecmp(url->data, (u_char *) "uwsgi://", 8) == 0) {[m
[31m-        add = 8;[m
[31m-[m
[31m-    } else if (ngx_strncasecmp(url->data, (u_char *) "suwsgi://", 9) == 0) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        add = 9;[m
[31m-        uwcf->ssl = 1;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "suwsgi protocol requires SSL support");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        add = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url.len = url->len - add;[m
[31m-    u.url.data = url->data + add;[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    uwcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);[m
[31m-    if (uwcf->upstream.upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    if (uwcf->upstream.store != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        uwcf->upstream.store = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (uwcf->upstream.cache > 0) {[m
[31m-        return "is incompatible with \"uwsgi_cache\"";[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    uwcf->upstream.store = 1;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* include the terminating '\0' into script */[m
[31m-    value[1].len++;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = &value[1];[m
[31m-    sc.lengths = &uwcf->upstream.store_lengths;[m
[31m-    sc.values = &uwcf->upstream.store_values;[m
[31m-    sc.variables = ngx_http_script_variables_count(&value[1]);[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (uwcf->upstream.cache != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        uwcf->upstream.cache = 0;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (uwcf->upstream.store > 0) {[m
[31m-        return "is incompatible with \"uwsgi_store\"";[m
[31m-    }[m
[31m-[m
[31m-    uwcf->upstream.cache = 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cv.lengths != NULL) {[m
[31m-[m
[31m-        uwcf->upstream.cache_value = ngx_palloc(cf->pool,[m
[31m-                                             sizeof(ngx_http_complex_value_t));[m
[31m-        if (uwcf->upstream.cache_value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *uwcf->upstream.cache_value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    uwcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                                      &ngx_http_uwsgi_module);[m
[31m-    if (uwcf->upstream.cache_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (uwcf->cache_key.value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &uwcf->cache_key;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_uwsgi_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_uwsgi_loc_conf_t *uwcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (uwcf->ssl_passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    uwcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (uwcf->ssl_passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_uwsgi_set_ssl(ngx_conf_t *cf, ngx_http_uwsgi_loc_conf_t *uwcf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    uwcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (uwcf->upstream.ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uwcf->upstream.ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(uwcf->upstream.ssl, uwcf->ssl_protocols, NULL)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = uwcf->upstream.ssl;[m
[31m-[m
[31m-    if (uwcf->ssl_certificate.len) {[m
[31m-[m
[31m-        if (uwcf->ssl_certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"uwsgi_ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &uwcf->ssl_certificate);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_certificate(cf, uwcf->upstream.ssl, &uwcf->ssl_certificate,[m
[31m-                                &uwcf->ssl_certificate_key, uwcf->ssl_passwords)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(uwcf->upstream.ssl->ctx,[m
[31m-                                (const char *) uwcf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &uwcf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (uwcf->upstream.ssl_verify) {[m
[31m-        if (uwcf->ssl_trusted_certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no uwsgi_ssl_trusted_certificate for uwsgi_ssl_verify");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, uwcf->upstream.ssl,[m
[31m-                                        &uwcf->ssl_trusted_certificate,[m
[31m-                                        uwcf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, uwcf->upstream.ssl, &uwcf->ssl_crl) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_xslt_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_xslt_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 315081e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/ngx_http_xslt_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1147 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <libxml/parser.h>[m
[31m-#include <libxml/tree.h>[m
[31m-#include <libxslt/xslt.h>[m
[31m-#include <libxslt/xsltInternals.h>[m
[31m-#include <libxslt/transform.h>[m
[31m-#include <libxslt/variables.h>[m
[31m-#include <libxslt/xsltutils.h>[m
[31m-[m
[31m-#if (NGX_HAVE_EXSLT)[m
[31m-#include <libexslt/exslt.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_XSLT_REUSE_DTD[m
[31m-#define NGX_HTTP_XSLT_REUSE_DTD  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                    *name;[m
[31m-    void                      *data;[m
[31m-} ngx_http_xslt_file_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                dtd_files;    /* ngx_http_xslt_file_t */[m
[31m-    ngx_array_t                sheet_files;  /* ngx_http_xslt_file_t */[m
[31m-} ngx_http_xslt_filter_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                    *name;[m
[31m-    ngx_http_complex_value_t   value;[m
[31m-    ngx_uint_t                 quote;        /* unsigned  quote:1; */[m
[31m-} ngx_http_xslt_param_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    xsltStylesheetPtr          stylesheet;[m
[31m-    ngx_array_t                params;       /* ngx_http_xslt_param_t */[m
[31m-} ngx_http_xslt_sheet_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    xmlDtdPtr                  dtd;[m
[31m-    ngx_array_t                sheets;       /* ngx_http_xslt_sheet_t */[m
[31m-    ngx_hash_t                 types;[m
[31m-    ngx_array_t               *types_keys;[m
[31m-    ngx_array_t               *params;       /* ngx_http_xslt_param_t */[m
[31m-    ngx_flag_t                 last_modified;[m
[31m-} ngx_http_xslt_filter_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    xmlDocPtr                  doc;[m
[31m-    xmlParserCtxtPtr           ctxt;[m
[31m-    xsltTransformContextPtr    transform;[m
[31m-    ngx_http_request_t        *request;[m
[31m-    ngx_array_t                params;[m
[31m-[m
[31m-    ngx_uint_t                 done;         /* unsigned  done:1; */[m
[31m-} ngx_http_xslt_filter_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_xslt_send(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx, ngx_buf_t *b);[m
[31m-static ngx_int_t ngx_http_xslt_add_chunk(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx, ngx_buf_t *b);[m
[31m-[m
[31m-[m
[31m-static void ngx_http_xslt_sax_external_subset(void *data, const xmlChar *name,[m
[31m-    const xmlChar *externalId, const xmlChar *systemId);[m
[31m-static void ngx_cdecl ngx_http_xslt_sax_error(void *data, const char *msg, ...);[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *ngx_http_xslt_apply_stylesheet(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_xslt_params(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx, ngx_array_t *params, ngx_uint_t final);[m
[31m-static u_char *ngx_http_xslt_content_type(xsltStylesheetPtr s);[m
[31m-static u_char *ngx_http_xslt_encoding(xsltStylesheetPtr s);[m
[31m-static void ngx_http_xslt_cleanup(void *data);[m
[31m-[m
[31m-static char *ngx_http_xslt_entities(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_xslt_stylesheet(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_xslt_param(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void ngx_http_xslt_cleanup_dtd(void *data);[m
[31m-static void ngx_http_xslt_cleanup_stylesheet(void *data);[m
[31m-static void *ngx_http_xslt_filter_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_http_xslt_filter_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_xslt_filter_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_xslt_filter_preconfiguration(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_xslt_filter_init(ngx_conf_t *cf);[m
[31m-static void ngx_http_xslt_filter_exit(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_xslt_default_types[] = {[m
[31m-    ngx_string("text/xml"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_xslt_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("xml_entities"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_xslt_entities,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xslt_stylesheet"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_xslt_stylesheet,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xslt_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_xslt_param,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xslt_string_param"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_xslt_param,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) 1 },[m
[31m-[m
[31m-    { ngx_string("xslt_types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_types_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xslt_filter_loc_conf_t, types_keys),[m
[31m-      &ngx_http_xslt_default_types[0] },[m
[31m-[m
[31m-    { ngx_string("xslt_last_modified"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_xslt_filter_loc_conf_t, last_modified),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_xslt_filter_module_ctx = {[m
[31m-    ngx_http_xslt_filter_preconfiguration, /* preconfiguration */[m
[31m-    ngx_http_xslt_filter_init,             /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_xslt_filter_create_main_conf, /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_xslt_filter_create_conf,      /* create location configuration */[m
[31m-    ngx_http_xslt_filter_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_xslt_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_xslt_filter_module_ctx,      /* module context */[m
[31m-    ngx_http_xslt_filter_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    ngx_http_xslt_filter_exit,             /* exit process */[m
[31m-    ngx_http_xslt_filter_exit,             /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_ctx_t       *ctx;[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xslt filter header");[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    if (conf->sheets.nelts == 0[m
[31m-        || ngx_http_test_content_type(r, &conf->types) == NULL)[m
[31m-    {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_xslt_filter_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    r->main_filter_need_in_memory = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    int                          wellFormed;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_http_xslt_filter_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xslt filter body");[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL || ctx->done) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        if (ngx_http_xslt_add_chunk(r, ctx, cl->buf) != NGX_OK) {[m
[31m-[m
[31m-            if (ctx->ctxt->myDoc) {[m
[31m-[m
[31m-#if (NGX_HTTP_XSLT_REUSE_DTD)[m
[31m-                ctx->ctxt->myDoc->extSubset = NULL;[m
[31m-#endif[m
[31m-                xmlFreeDoc(ctx->ctxt->myDoc);[m
[31m-            }[m
[31m-[m
[31m-            xmlFreeParserCtxt(ctx->ctxt);[m
[31m-[m
[31m-            return ngx_http_xslt_send(r, ctx, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_buf || cl->buf->last_in_chain) {[m
[31m-[m
[31m-            ctx->doc = ctx->ctxt->myDoc;[m
[31m-[m
[31m-#if (NGX_HTTP_XSLT_REUSE_DTD)[m
[31m-            ctx->doc->extSubset = NULL;[m
[31m-#endif[m
[31m-[m
[31m-            wellFormed = ctx->ctxt->wellFormed;[m
[31m-[m
[31m-            xmlFreeParserCtxt(ctx->ctxt);[m
[31m-[m
[31m-            if (wellFormed) {[m
[31m-                return ngx_http_xslt_send(r, ctx,[m
[31m-                                       ngx_http_xslt_apply_stylesheet(r, ctx));[m
[31m-            }[m
[31m-[m
[31m-            xmlFreeDoc(ctx->doc);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "not well formed XML document");[m
[31m-[m
[31m-            return ngx_http_xslt_send(r, ctx, NULL);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_send(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,[m
[31m-    ngx_buf_t *b)[m
[31m-{[m
[31m-    ngx_int_t                         rc;[m
[31m-    ngx_chain_t                       out;[m
[31m-    ngx_pool_cleanup_t               *cln;[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    ctx->done = 1;[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        return ngx_http_filter_finalize_request(r, &ngx_http_xslt_filter_module,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_free(b->pos);[m
[31m-        return ngx_http_filter_finalize_request(r, &ngx_http_xslt_filter_module,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        r->headers_out.content_length_n = b->last - b->pos;[m
[31m-[m
[31m-        if (r->headers_out.content_length) {[m
[31m-            r->headers_out.content_length->hash = 0;[m
[31m-            r->headers_out.content_length = NULL;[m
[31m-        }[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-        if (!conf->last_modified) {[m
[31m-            ngx_http_clear_last_modified(r);[m
[31m-            ngx_http_clear_etag(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_http_weak_etag(r);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_next_header_filter(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        ngx_free(b->pos);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_xslt_cleanup;[m
[31m-    cln->data = b->pos;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_next_body_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_add_chunk(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,[m
[31m-    ngx_buf_t *b)[m
[31m-{[m
[31m-    int               err;[m
[31m-    xmlParserCtxtPtr  ctxt;[m
[31m-[m
[31m-    if (ctx->ctxt == NULL) {[m
[31m-[m
[31m-        ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL);[m
[31m-        if (ctxt == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "xmlCreatePushParserCtxt() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        xmlCtxtUseOptions(ctxt, XML_PARSE_NOENT|XML_PARSE_DTDLOAD[m
[31m-                                               |XML_PARSE_NOWARNING);[m
[31m-[m
[31m-        ctxt->sax->externalSubset = ngx_http_xslt_sax_external_subset;[m
[31m-        ctxt->sax->setDocumentLocator = NULL;[m
[31m-        ctxt->sax->error = ngx_http_xslt_sax_error;[m
[31m-        ctxt->sax->fatalError = ngx_http_xslt_sax_error;[m
[31m-        ctxt->sax->_private = ctx;[m
[31m-[m
[31m-        ctx->ctxt = ctxt;[m
[31m-        ctx->request = r;[m
[31m-    }[m
[31m-[m
[31m-    err = xmlParseChunk(ctx->ctxt, (char *) b->pos, (int) (b->last - b->pos),[m
[31m-                        (b->last_buf) || (b->last_in_chain));[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        b->pos = b->last;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "xmlParseChunk() failed, error:%d", err);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_sax_external_subset(void *data, const xmlChar *name,[m
[31m-    const xmlChar *externalId, const xmlChar *systemId)[m
[31m-{[m
[31m-    xmlParserCtxtPtr ctxt = data;[m
[31m-[m
[31m-    xmlDocPtr                         doc;[m
[31m-    xmlDtdPtr                         dtd;[m
[31m-    ngx_http_request_t               *r;[m
[31m-    ngx_http_xslt_filter_ctx_t       *ctx;[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    ctx = ctxt->sax->_private;[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xslt filter extSubset: \"%s\" \"%s\" \"%s\"",[m
[31m-                   name ? name : (xmlChar *) "",[m
[31m-                   externalId ? externalId : (xmlChar *) "",[m
[31m-                   systemId ? systemId : (xmlChar *) "");[m
[31m-[m
[31m-    doc = ctxt->myDoc;[m
[31m-[m
[31m-#if (NGX_HTTP_XSLT_REUSE_DTD)[m
[31m-[m
[31m-    dtd = conf->dtd;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    dtd = xmlCopyDtd(conf->dtd);[m
[31m-    if (dtd == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xmlCopyDtd() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (doc->children == NULL) {[m
[31m-        xmlAddChild((xmlNodePtr) doc, (xmlNodePtr) dtd);[m
[31m-[m
[31m-    } else {[m
[31m-        xmlAddPrevSibling(doc->children, (xmlNodePtr) dtd);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    doc->extSubset = dtd;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void ngx_cdecl[m
[31m-ngx_http_xslt_sax_error(void *data, const char *msg, ...)[m
[31m-{[m
[31m-    xmlParserCtxtPtr ctxt = data;[m
[31m-[m
[31m-    size_t                       n;[m
[31m-    va_list                      args;[m
[31m-    ngx_http_xslt_filter_ctx_t  *ctx;[m
[31m-    u_char                       buf[NGX_MAX_ERROR_STR];[m
[31m-[m
[31m-    ctx = ctxt->sax->_private;[m
[31m-[m
[31m-    buf[0] = '\0';[m
[31m-[m
[31m-    va_start(args, msg);[m
[31m-    n = (size_t) vsnprintf((char *) buf, NGX_MAX_ERROR_STR, msg, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    while (--n && (buf[n] == CR || buf[n] == LF)) { /* void */ }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,[m
[31m-                  "libxml2 error: \"%*s\"", n + 1, buf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_http_xslt_apply_stylesheet(ngx_http_request_t *r,[m
[31m-    ngx_http_xslt_filter_ctx_t *ctx)[m
[31m-{[m
[31m-    int                               len, rc, doc_type;[m
[31m-    u_char                           *type, *encoding;[m
[31m-    ngx_buf_t                        *b;[m
[31m-    ngx_uint_t                        i;[m
[31m-    xmlChar                          *buf;[m
[31m-    xmlDocPtr                         doc, res;[m
[31m-    ngx_http_xslt_sheet_t            *sheet;[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);[m
[31m-    sheet = conf->sheets.elts;[m
[31m-    doc = ctx->doc;[m
[31m-[m
[31m-    /* preallocate array for 4 params */[m
[31m-[m
[31m-    if (ngx_array_init(&ctx->params, r->pool, 4 * 2 + 1, sizeof(char *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        xmlFreeDoc(doc);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < conf->sheets.nelts; i++) {[m
[31m-[m
[31m-        ctx->transform = xsltNewTransformContext(sheet[i].stylesheet, doc);[m
[31m-        if (ctx->transform == NULL) {[m
[31m-            xmlFreeDoc(doc);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->params[m
[31m-            && ngx_http_xslt_params(r, ctx, conf->params, 0) != NGX_OK)[m
[31m-        {[m
[31m-            xsltFreeTransformContext(ctx->transform);[m
[31m-            xmlFreeDoc(doc);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_xslt_params(r, ctx, &sheet[i].params, 1) != NGX_OK) {[m
[31m-            xsltFreeTransformContext(ctx->transform);[m
[31m-            xmlFreeDoc(doc);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        res = xsltApplyStylesheetUser(sheet[i].stylesheet, doc,[m
[31m-                                      ctx->params.elts, NULL, NULL,[m
[31m-                                      ctx->transform);[m
[31m-[m
[31m-        xsltFreeTransformContext(ctx->transform);[m
[31m-        xmlFreeDoc(doc);[m
[31m-[m
[31m-        if (res == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "xsltApplyStylesheet() failed");[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        doc = res;[m
[31m-[m
[31m-        /* reset array elements */[m
[31m-        ctx->params.nelts = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* there must be at least one stylesheet */[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        type = ngx_http_xslt_content_type(sheet[i - 1].stylesheet);[m
[31m-[m
[31m-    } else {[m
[31m-        type = NULL;[m
[31m-    }[m
[31m-[m
[31m-    encoding = ngx_http_xslt_encoding(sheet[i - 1].stylesheet);[m
[31m-    doc_type = doc->type;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "xslt filter type: %d t:%s e:%s",[m
[31m-                   doc_type, type ? type : (u_char *) "(null)",[m
[31m-                   encoding ? encoding : (u_char *) "(null)");[m
[31m-[m
[31m-    rc = xsltSaveResultToString(&buf, &len, doc, sheet[i - 1].stylesheet);[m
[31m-[m
[31m-    xmlFreeDoc(doc);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xsltSaveResultToString() failed");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "xsltSaveResultToString() returned zero-length result");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        ngx_free(buf);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = buf;[m
[31m-    b->last = buf + len;[m
[31m-    b->memory = 1;[m
[31m-[m
[31m-    if (encoding) {[m
[31m-        r->headers_out.charset.len = ngx_strlen(encoding);[m
[31m-        r->headers_out.charset.data = encoding;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return b;[m
[31m-    }[m
[31m-[m
[31m-    b->last_buf = 1;[m
[31m-[m
[31m-    if (type) {[m
[31m-        len = ngx_strlen(type);[m
[31m-[m
[31m-        r->headers_out.content_type_len = len;[m
[31m-        r->headers_out.content_type.len = len;[m
[31m-        r->headers_out.content_type.data = type;[m
[31m-[m
[31m-    } else if (doc_type == XML_HTML_DOCUMENT_NODE) {[m
[31m-[m
[31m-        r->headers_out.content_type_len = sizeof("text/html") - 1;[m
[31m-        ngx_str_set(&r->headers_out.content_type, "text/html");[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_params(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,[m
[31m-    ngx_array_t *params, ngx_uint_t final)[m
[31m-{[m
[31m-    u_char                 *p, *last, *value, *dst, *src, **s;[m
[31m-    size_t                  len;[m
[31m-    ngx_uint_t              i;[m
[31m-    ngx_str_t               string;[m
[31m-    ngx_http_xslt_param_t  *param;[m
[31m-[m
[31m-    param = params->elts;[m
[31m-[m
[31m-    for (i = 0; i < params->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, &param[i].value, &string) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "xslt filter param: \"%s\"", string.data);[m
[31m-[m
[31m-        if (param[i].name) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xslt filter param name: \"%s\"", param[i].name);[m
[31m-[m
[31m-            if (param[i].quote) {[m
[31m-                if (xsltQuoteOneUserParam(ctx->transform, param[i].name,[m
[31m-                                          string.data)[m
[31m-                    != 0)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                "xsltQuoteOneUserParam(\"%s\", \"%s\") failed",[m
[31m-                                param[i].name, string.data);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            s = ngx_array_push(&ctx->params);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = param[i].name;[m
[31m-[m
[31m-            s = ngx_array_push(&ctx->params);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = string.data;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * parse param1=value1:param2=value2 syntax as used by parameters[m
[31m-         * specified in xslt_stylesheet directives[m
[31m-         */[m
[31m-[m
[31m-        p = string.data;[m
[31m-        last = string.data + string.len;[m
[31m-[m
[31m-        while (p && *p) {[m
[31m-[m
[31m-            value = p;[m
[31m-            p = (u_char *) ngx_strchr(p, '=');[m
[31m-            if (p == NULL) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                "invalid libxslt parameter \"%s\"", value);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            *p++ = '\0';[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xslt filter param name: \"%s\"", value);[m
[31m-[m
[31m-            s = ngx_array_push(&ctx->params);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = value;[m
[31m-[m
[31m-            value = p;[m
[31m-            p = (u_char *) ngx_strchr(p, ':');[m
[31m-[m
[31m-            if (p) {[m
[31m-                len = p - value;[m
[31m-                *p++ = '\0';[m
[31m-[m
[31m-            } else {[m
[31m-                len = last - value;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xslt filter param value: \"%s\"", value);[m
[31m-[m
[31m-            dst = value;[m
[31m-            src = value;[m
[31m-[m
[31m-            ngx_unescape_uri(&dst, &src, len, 0);[m
[31m-[m
[31m-            *dst = '\0';[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "xslt filter param unescaped: \"%s\"", value);[m
[31m-[m
[31m-            s = ngx_array_push(&ctx->params);[m
[31m-            if (s == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *s = value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (final) {[m
[31m-        s = ngx_array_push(&ctx->params);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *s = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_xslt_content_type(xsltStylesheetPtr s)[m
[31m-{[m
[31m-    u_char  *type;[m
[31m-[m
[31m-    if (s->mediaType) {[m
[31m-        return s->mediaType;[m
[31m-    }[m
[31m-[m
[31m-    for (s = s->imports; s; s = s->next) {[m
[31m-[m
[31m-        type = ngx_http_xslt_content_type(s);[m
[31m-[m
[31m-        if (type) {[m
[31m-            return type;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_xslt_encoding(xsltStylesheetPtr s)[m
[31m-{[m
[31m-    u_char  *encoding;[m
[31m-[m
[31m-    if (s->encoding) {[m
[31m-        return s->encoding;[m
[31m-    }[m
[31m-[m
[31m-    for (s = s->imports; s; s = s->next) {[m
[31m-[m
[31m-        encoding = ngx_http_xslt_encoding(s);[m
[31m-[m
[31m-        if (encoding) {[m
[31m-            return encoding;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_free(data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xslt_entities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t *xlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_pool_cleanup_t                *cln;[m
[31m-    ngx_http_xslt_file_t              *file;[m
[31m-    ngx_http_xslt_filter_main_conf_t  *xmcf;[m
[31m-[m
[31m-    if (xlcf->dtd) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    xmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    file = xmcf->dtd_files.elts;[m
[31m-    for (i = 0; i < xmcf->dtd_files.nelts; i++) {[m
[31m-        if (ngx_strcmp(file[i].name, value[1].data) == 0) {[m
[31m-            xlcf->dtd = file[i].data;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    xlcf->dtd = xmlParseDTD(NULL, (xmlChar *) value[1].data);[m
[31m-[m
[31m-    if (xlcf->dtd == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0, "xmlParseDTD() failed");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_xslt_cleanup_dtd;[m
[31m-    cln->data = xlcf->dtd;[m
[31m-[m
[31m-    file = ngx_array_push(&xmcf->dtd_files);[m
[31m-    if (file == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->name = value[1].data;[m
[31m-    file->data = xlcf->dtd;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xslt_stylesheet(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t *xlcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_pool_cleanup_t                *cln;[m
[31m-    ngx_http_xslt_file_t              *file;[m
[31m-    ngx_http_xslt_sheet_t             *sheet;[m
[31m-    ngx_http_xslt_param_t             *param;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_http_xslt_filter_main_conf_t  *xmcf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (xlcf->sheets.elts == NULL) {[m
[31m-        if (ngx_array_init(&xlcf->sheets, cf->pool, 1,[m
[31m-                           sizeof(ngx_http_xslt_sheet_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sheet = ngx_array_push(&xlcf->sheets);[m
[31m-    if (sheet == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(sheet, sizeof(ngx_http_xslt_sheet_t));[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    xmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_xslt_filter_module);[m
[31m-[m
[31m-    file = xmcf->sheet_files.elts;[m
[31m-    for (i = 0; i < xmcf->sheet_files.nelts; i++) {[m
[31m-        if (ngx_strcmp(file[i].name, value[1].data) == 0) {[m
[31m-            sheet->stylesheet = file[i].data;[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sheet->stylesheet = xsltParseStylesheetFile(value[1].data);[m
[31m-    if (sheet->stylesheet == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "xsltParseStylesheetFile(\"%s\") failed",[m
[31m-                           value[1].data);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_xslt_cleanup_stylesheet;[m
[31m-    cln->data = sheet->stylesheet;[m
[31m-[m
[31m-    file = ngx_array_push(&xmcf->sheet_files);[m
[31m-    if (file == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->name = value[1].data;[m
[31m-    file->data = sheet->stylesheet;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    n = cf->args->nelts;[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&sheet->params, cf->pool, n - 2,[m
[31m-                       sizeof(ngx_http_xslt_param_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 2; i < n; i++) {[m
[31m-[m
[31m-        param = ngx_array_push(&sheet->params);[m
[31m-        if (param == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(param, sizeof(ngx_http_xslt_param_t));[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[i];[m
[31m-        ccv.complex_value = &param->value;[m
[31m-        ccv.zero = 1;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xslt_param(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *xlcf = conf;[m
[31m-[m
[31m-    ngx_http_xslt_param_t            *param;[m
[31m-    ngx_http_compile_complex_value_t  ccv;[m
[31m-    ngx_str_t                        *value;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (xlcf->params == NULL) {[m
[31m-        xlcf->params = ngx_array_create(cf->pool, 2,[m
[31m-                                        sizeof(ngx_http_xslt_param_t));[m
[31m-        if (xlcf->params == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    param = ngx_array_push(xlcf->params);[m
[31m-    if (param == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    param->name = value[1].data;[m
[31m-    param->quote = (cmd->post == NULL) ? 0 : 1;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[2];[m
[31m-    ccv.complex_value = &param->value;[m
[31m-    ccv.zero = 1;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_cleanup_dtd(void *data)[m
[31m-{[m
[31m-    xmlFreeDtd(data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_cleanup_stylesheet(void *data)[m
[31m-{[m
[31m-    xsltFreeStylesheet(data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_xslt_filter_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_main_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_xslt_filter_main_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&conf->dtd_files, cf->pool, 1,[m
[31m-                       sizeof(ngx_http_xslt_file_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&conf->sheet_files, cf->pool, 1,[m
[31m-                       sizeof(ngx_http_xslt_file_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_xslt_filter_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_xslt_filter_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->dtd = NULL;[m
[31m-     *     conf->sheets = { NULL };[m
[31m-     *     conf->types = { NULL };[m
[31m-     *     conf->types_keys = NULL;[m
[31m-     *     conf->params = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->last_modified = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_xslt_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_xslt_filter_loc_conf_t *prev = parent;[m
[31m-    ngx_http_xslt_filter_loc_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->dtd == NULL) {[m
[31m-        conf->dtd = prev->dtd;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->sheets.nelts == 0) {[m
[31m-        conf->sheets = prev->sheets;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->params == NULL) {[m
[31m-        conf->params = prev->params;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,[m
[31m-                             &prev->types_keys, &prev->types,[m
[31m-                             ngx_http_xslt_default_types)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->last_modified, prev->last_modified, 0);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_filter_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    xmlInitParser();[m
[31m-[m
[31m-#if (NGX_HAVE_EXSLT)[m
[31m-    exsltRegisterAll();[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_xslt_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_xslt_header_filter;[m
[31m-[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_xslt_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_xslt_filter_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    xsltCleanupGlobals();[m
[31m-    xmlCleanupParser();[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/Makefile.PL b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/Makefile.PL[m
[1mdeleted file mode 100644[m
[1mindex 03348b5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/Makefile.PL[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-[m
[31m-# Copyright (C) Igor Sysoev[m
[31m-# Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-use 5.006001;[m
[31m-use ExtUtils::MakeMaker;[m
[31m-[m
[31m-WriteMakefile([m
[31m-    NAME              => 'nginx',[m
[31m-    VERSION_FROM      => 'nginx.pm',     # finds $VERSION[m
[31m-    PREREQ_PM         => {},             # e.g., Module::Name => 1.1[m
[31m-[m
[31m-    ABSTRACT_FROM     => 'nginx.pm',     # retrieve abstract from module[m
[31m-    AUTHOR            => 'Igor Sysoev',[m
[31m-[m
[31m-    CCFLAGS           => "$ENV{NGX_PM_CFLAGS}",[m
[31m-    OPTIMIZE          => '-O',[m
[31m-[m
[31m-    INC               => join(" ", map {[m
[31m-                             m#^/# ? "-I $_" : "-I ../../../../../$_"[m
[31m-                         } (split /\s+/, $ENV{NGX_INCS})),[m
[31m-[m
[31m-    depend => {[m
[31m-        'nginx.c'     => join(" ", map {[m
[31m-                             m#^/# ? $_ : "../../../../../$_"[m
[31m-                         } (split(/\s+/, $ENV{NGX_DEPS}),[m
[31m-                            "src/http/modules/perl/ngx_http_perl_module.h"))[m
[31m-    },[m
[31m-[m
[31m-    PM => {[m
[31m-        'nginx.pm'    => '$(INST_LIBDIR)/nginx.pm'[m
[31m-    }[m
[31m-);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/nginx.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/nginx.pm[m
[1mdeleted file mode 100644[m
[1mindex e3f7361..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/nginx.pm[m
[1m+++ /dev/null[m
[36m@@ -1,138 +0,0 @@[m
[31m-package nginx;[m
[31m-[m
[31m-use 5.006001;[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-require Exporter;[m
[31m-[m
[31m-our @ISA = qw(Exporter);[m
[31m-[m
[31m-our @EXPORT = qw([m
[31m-    OK[m
[31m-    DECLINED[m
[31m-[m
[31m-    HTTP_OK[m
[31m-    HTTP_CREATED[m
[31m-    HTTP_ACCEPTED[m
[31m-    HTTP_NO_CONTENT[m
[31m-    HTTP_PARTIAL_CONTENT[m
[31m-[m
[31m-    HTTP_MOVED_PERMANENTLY[m
[31m-    HTTP_MOVED_TEMPORARILY[m
[31m-    HTTP_REDIRECT[m
[31m-    HTTP_SEE_OTHER[m
[31m-    HTTP_NOT_MODIFIED[m
[31m-    HTTP_TEMPORARY_REDIRECT[m
[31m-[m
[31m-    HTTP_BAD_REQUEST[m
[31m-    HTTP_UNAUTHORIZED[m
[31m-    HTTP_PAYMENT_REQUIRED[m
[31m-    HTTP_FORBIDDEN[m
[31m-    HTTP_NOT_FOUND[m
[31m-    HTTP_NOT_ALLOWED[m
[31m-    HTTP_NOT_ACCEPTABLE[m
[31m-    HTTP_REQUEST_TIME_OUT[m
[31m-    HTTP_CONFLICT[m
[31m-    HTTP_GONE[m
[31m-    HTTP_LENGTH_REQUIRED[m
[31m-    HTTP_REQUEST_ENTITY_TOO_LARGE[m
[31m-    HTTP_REQUEST_URI_TOO_LARGE[m
[31m-    HTTP_UNSUPPORTED_MEDIA_TYPE[m
[31m-    HTTP_RANGE_NOT_SATISFIABLE[m
[31m-[m
[31m-    HTTP_INTERNAL_SERVER_ERROR[m
[31m-    HTTP_SERVER_ERROR[m
[31m-    HTTP_NOT_IMPLEMENTED[m
[31m-    HTTP_BAD_GATEWAY[m
[31m-    HTTP_SERVICE_UNAVAILABLE[m
[31m-    HTTP_GATEWAY_TIME_OUT[m
[31m-    HTTP_INSUFFICIENT_STORAGE[m
[31m-);[m
[31m-[m
[31m-our $VERSION = '%%VERSION%%';[m
[31m-[m
[31m-require XSLoader;[m
[31m-XSLoader::load('nginx', $VERSION);[m
[31m-[m
[31m-# Preloaded methods go here.[m
[31m-[m
[31m-use constant OK                             => 0;[m
[31m-use constant DECLINED                       => -5;[m
[31m-[m
[31m-use constant HTTP_OK                        => 200;[m
[31m-use constant HTTP_CREATED                   => 201;[m
[31m-use constant HTTP_ACCEPTED                  => 202;[m
[31m-use constant HTTP_NO_CONTENT                => 204;[m
[31m-use constant HTTP_PARTIAL_CONTENT           => 206;[m
[31m-[m
[31m-use constant HTTP_MOVED_PERMANENTLY         => 301;[m
[31m-use constant HTTP_MOVED_TEMPORARILY         => 302;[m
[31m-use constant HTTP_REDIRECT                  => 302;[m
[31m-use constant HTTP_SEE_OTHER                 => 303;[m
[31m-use constant HTTP_NOT_MODIFIED              => 304;[m
[31m-use constant HTTP_TEMPORARY_REDIRECT        => 307;[m
[31m-[m
[31m-use constant HTTP_BAD_REQUEST               => 400;[m
[31m-use constant HTTP_UNAUTHORIZED              => 401;[m
[31m-use constant HTTP_PAYMENT_REQUIRED          => 402;[m
[31m-use constant HTTP_FORBIDDEN                 => 403;[m
[31m-use constant HTTP_NOT_FOUND                 => 404;[m
[31m-use constant HTTP_NOT_ALLOWED               => 405;[m
[31m-use constant HTTP_NOT_ACCEPTABLE            => 406;[m
[31m-use constant HTTP_REQUEST_TIME_OUT          => 408;[m
[31m-use constant HTTP_CONFLICT                  => 409;[m
[31m-use constant HTTP_GONE                      => 410;[m
[31m-use constant HTTP_LENGTH_REQUIRED           => 411;[m
[31m-use constant HTTP_REQUEST_ENTITY_TOO_LARGE  => 413;[m
[31m-use constant HTTP_REQUEST_URI_TOO_LARGE     => 414;[m
[31m-use constant HTTP_UNSUPPORTED_MEDIA_TYPE    => 415;[m
[31m-use constant HTTP_RANGE_NOT_SATISFIABLE     => 416;[m
[31m-[m
[31m-use constant HTTP_INTERNAL_SERVER_ERROR     => 500;[m
[31m-use constant HTTP_SERVER_ERROR              => 500;[m
[31m-use constant HTTP_NOT_IMPLEMENTED           => 501;[m
[31m-use constant HTTP_BAD_GATEWAY               => 502;[m
[31m-use constant HTTP_SERVICE_UNAVAILABLE       => 503;[m
[31m-use constant HTTP_GATEWAY_TIME_OUT          => 504;[m
[31m-use constant HTTP_INSUFFICIENT_STORAGE      => 507;[m
[31m-[m
[31m-[m
[31m-sub rflush {[m
[31m-    my $r = shift;[m
[31m-[m
[31m-    $r->flush;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-1;[m
[31m-__END__[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-nginx - Perl interface to the nginx HTTP server API[m
[31m-[m
[31m-=head1 SYNOPSIS[m
[31m-[m
[31m-  use nginx;[m
[31m-[m
[31m-=head1 DESCRIPTION[m
[31m-[m
[31m-This module provides a Perl interface to the nginx HTTP server API.[m
[31m-[m
[31m-[m
[31m-=head1 SEE ALSO[m
[31m-[m
[31m-http://nginx.org/en/docs/http/ngx_http_perl_module.html[m
[31m-[m
[31m-=head1 AUTHOR[m
[31m-[m
[31m-Igor Sysoev[m
[31m-[m
[31m-=head1 COPYRIGHT AND LICENSE[m
[31m-[m
[31m-Copyright (C) Igor Sysoev[m
[31m-Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-=cut[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/nginx.xs b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/nginx.xs[m
[1mdeleted file mode 100644[m
[1mindex 6716620..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/nginx.xs[m
[1m+++ /dev/null[m
[36m@@ -1,1038 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#define PERL_NO_GET_CONTEXT[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_perl_module.h>[m
[31m-[m
[31m-#include "XSUB.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_perl_set_request(r)                                          \[m
[31m-    r = INT2PTR(ngx_http_request_t *, SvIV((SV *) SvRV(ST(0))))[m
[31m-[m
[31m-[m
[31m-#define ngx_http_perl_set_targ(p, len)                                        \[m
[31m-                                                                              \[m
[31m-    SvUPGRADE(TARG, SVt_PV);                                                  \[m
[31m-    SvPOK_on(TARG);                                                           \[m
[31m-    sv_setpvn(TARG, (char *) p, len)[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_sv2str(pTHX_ ngx_http_request_t *r, ngx_str_t *s, SV *sv)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-    STRLEN   len;[m
[31m-[m
[31m-    if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {[m
[31m-        sv = SvRV(sv);[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) SvPV(sv, len);[m
[31m-[m
[31m-    s->len = len;[m
[31m-[m
[31m-    if (SvREADONLY(sv) && SvPOK(sv)) {[m
[31m-        s->data = p;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "perl sv2str: %08XD \"%V\"", sv->sv_flags, s);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    s->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (s->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->data, p, len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl sv2str: %08XD \"%V\"", sv->sv_flags, s);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_output(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    ngx_chain_t           out;[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-    ngx_chain_t          *cl;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ctx->ssi) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-        cl->next = NULL;[m
[31m-        *ctx->ssi->last_out = cl;[m
[31m-        ctx->ssi->last_out = &cl->next;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-MODULE = nginx    PACKAGE = nginx[m
[31m-[m
[31m-[m
[31m-PROTOTYPES: DISABLE[m
[31m-[m
[31m-[m
[31m-void[m
[31m-status(r, code)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    r->headers_out.status = SvIV(ST(1));[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl status: %d", r->headers_out.status);[m
[31m-[m
[31m-    XSRETURN_UNDEF;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-send_http_header(r, ...)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *sv;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (r->headers_out.status == 0) {[m
[31m-        r->headers_out.status = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (items != 1) {[m
[31m-        sv = ST(1);[m
[31m-[m
[31m-        if (ngx_http_perl_sv2str(aTHX_ r, &r->headers_out.content_type, sv)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            XSRETURN_EMPTY;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_len = r->headers_out.content_type.len;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-            XSRETURN_EMPTY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_http_send_header(r);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-header_only(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    sv_upgrade(TARG, SVt_IV);[m
[31m-    sv_setiv(TARG, r->header_only);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-uri(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-    ngx_http_perl_set_targ(r->uri.data, r->uri.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-args(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-    ngx_http_perl_set_targ(r->args.data, r->args.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-request_method(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-    ngx_http_perl_set_targ(r->method_name.data, r->method_name.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-remote_addr(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-    ngx_http_perl_set_targ(r->connection->addr_text.data,[m
[31m-                           r->connection->addr_text.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-header_in(r, key)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    SV                         *key;[m
[31m-    u_char                     *p, *lowcase_key, *value, sep;[m
[31m-    STRLEN                      len;[m
[31m-    ssize_t                     size;[m
[31m-    ngx_uint_t                  i, n, hash;[m
[31m-    ngx_array_t                *a;[m
[31m-    ngx_list_part_t            *part;[m
[31m-    ngx_table_elt_t            *h, **ph;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    key = ST(1);[m
[31m-[m
[31m-    if (SvROK(key) && SvTYPE(SvRV(key)) == SVt_PV) {[m
[31m-        key = SvRV(key);[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) SvPV(key, len);[m
[31m-[m
[31m-    /* look up hashed headers */[m
[31m-[m
[31m-    lowcase_key = ngx_pnalloc(r->pool, len);[m
[31m-    if (lowcase_key == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase_key, p, len);[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    hh = ngx_hash_find(&cmcf->headers_in_hash, hash, lowcase_key, len);[m
[31m-[m
[31m-    if (hh) {[m
[31m-[m
[31m-        if (hh->offset == offsetof(ngx_http_headers_in_t, cookies)) {[m
[31m-            sep = ';';[m
[31m-            goto multi;[m
[31m-        }[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-        if (hh->offset == offsetof(ngx_http_headers_in_t, x_forwarded_for)) {[m
[31m-            sep = ',';[m
[31m-            goto multi;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset);[m
[31m-[m
[31m-        if (*ph) {[m
[31m-            ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        XSRETURN_UNDEF;[m
[31m-[m
[31m-    multi:[m
[31m-[m
[31m-        /* Cookie, X-Forwarded-For */[m
[31m-[m
[31m-        a = (ngx_array_t *) ((char *) &r->headers_in + hh->offset);[m
[31m-[m
[31m-        n = a->nelts;[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            XSRETURN_UNDEF;[m
[31m-        }[m
[31m-[m
[31m-        ph = a->elts;[m
[31m-[m
[31m-        if (n == 1) {[m
[31m-            ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        size = - (ssize_t) (sizeof("; ") - 1);[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            size += ph[i]->value.len + sizeof("; ") - 1;[m
[31m-        }[m
[31m-[m
[31m-        value = ngx_pnalloc(r->pool, size);[m
[31m-        if (value == NULL) {[m
[31m-            XSRETURN_UNDEF;[m
[31m-        }[m
[31m-[m
[31m-        p = value;[m
[31m-[m
[31m-        for (i = 0; /* void */ ; i++) {[m
[31m-            p = ngx_copy(p, ph[i]->value.data, ph[i]->value.len);[m
[31m-[m
[31m-            if (i == n - 1) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *p++ = sep; *p++ = ' ';[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_perl_set_targ(value, size);[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /* iterate over all headers */[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (len != h[i].key.len[m
[31m-            || ngx_strcasecmp(p, h[i].key.data) != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_perl_set_targ(h[i].value.data, h[i].value.len);[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    XSRETURN_UNDEF;[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-has_request_body(r, next)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-    ctx->next = SvRV(ST(1));[m
[31m-[m
[31m-    r->request_body_in_single_buf = 1;[m
[31m-    r->request_body_in_persistent_file = 1;[m
[31m-    r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-    if (r->request_body_in_file_only) {[m
[31m-        r->request_body_file_log_level = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_read_client_request_body(r, ngx_http_perl_handle_request);[m
[31m-[m
[31m-    sv_upgrade(TARG, SVt_IV);[m
[31m-    sv_setiv(TARG, 1);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-request_body(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-    u_char              *p, *data;[m
[31m-    size_t               len;[m
[31m-    ngx_buf_t           *buf;[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->temp_file[m
[31m-        || r->request_body->bufs == NULL)[m
[31m-    {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    cl = r->request_body->bufs;[m
[31m-    buf = cl->buf;[m
[31m-[m
[31m-    if (cl->next == NULL) {[m
[31m-        len = buf->last - buf->pos;[m
[31m-        data = buf->pos;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    len = buf->last - buf->pos;[m
[31m-    cl = cl->next;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        len += buf->last - buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    data = p;[m
[31m-    cl = r->request_body->bufs;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_perl_set_targ(data, len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-request_body_file(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (r->request_body == NULL || r->request_body->temp_file == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data,[m
[31m-                           r->request_body->temp_file->file.name.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-discard_request_body(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    ngx_http_discard_request_body(r);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-header_out(r, key, value)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *key;[m
[31m-    SV                  *value;[m
[31m-    ngx_table_elt_t     *header;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    key = ST(1);[m
[31m-    value = ST(2);[m
[31m-[m
[31m-    header = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (header == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    header->hash = 1;[m
[31m-[m
[31m-    if (ngx_http_perl_sv2str(aTHX_ r, &header->key, key) != NGX_OK) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_perl_sv2str(aTHX_ r, &header->value, value) != NGX_OK) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    if (header->key.len == sizeof("Content-Length") - 1[m
[31m-        && ngx_strncasecmp(header->key.data, (u_char *) "Content-Length",[m
[31m-                           sizeof("Content-Length") - 1) == 0)[m
[31m-    {[m
[31m-        r->headers_out.content_length_n = (off_t) SvIV(value);[m
[31m-        r->headers_out.content_length = header;[m
[31m-    }[m
[31m-[m
[31m-    if (header->key.len == sizeof("Content-Encoding") - 1[m
[31m-        && ngx_strncasecmp(header->key.data, (u_char *) "Content-Encoding",[m
[31m-                           sizeof("Content-Encoding") - 1) == 0)[m
[31m-    {[m
[31m-        r->headers_out.content_encoding = header;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-void[m
[31m-filename(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    size_t                root;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-    if (ctx->filename.data) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &ctx->filename, &root, 0) == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ctx->filename.len--;[m
[31m-    sv_setpv(PL_statname, (char *) ctx->filename.data);[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-    ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-print(r, ...)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *sv;[m
[31m-    int                  i;[m
[31m-    u_char              *p;[m
[31m-    size_t               size;[m
[31m-    STRLEN               len;[m
[31m-    ngx_buf_t           *b;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    if (items == 2) {[m
[31m-[m
[31m-        /*[m
[31m-         * do zero copy for prolate single read-only SV:[m
[31m-         *     $r->print("some text\n");[m
[31m-         */[m
[31m-[m
[31m-        sv = ST(1);[m
[31m-[m
[31m-        if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {[m
[31m-            sv = SvRV(sv);[m
[31m-        }[m
[31m-[m
[31m-        if (SvREADONLY(sv) && SvPOK(sv)) {[m
[31m-[m
[31m-            p = (u_char *) SvPV(sv, len);[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                XSRETURN_EMPTY;[m
[31m-            }[m
[31m-[m
[31m-            b = ngx_calloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                XSRETURN_EMPTY;[m
[31m-            }[m
[31m-[m
[31m-            b->memory = 1;[m
[31m-            b->pos = p;[m
[31m-            b->last = p + len;[m
[31m-            b->start = p;[m
[31m-            b->end = b->last;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "$r->print: read-only SV: %z", len);[m
[31m-[m
[31m-            goto out;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 1; i < items; i++) {[m
[31m-[m
[31m-        sv = ST(i);[m
[31m-[m
[31m-        if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {[m
[31m-            sv = SvRV(sv);[m
[31m-        }[m
[31m-[m
[31m-        (void) SvPV(sv, len);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "$r->print: copy SV: %z", len);[m
[31m-[m
[31m-        size += len;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < items; i++) {[m
[31m-        sv = ST(i);[m
[31m-[m
[31m-        if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {[m
[31m-            sv = SvRV(sv);[m
[31m-        }[m
[31m-[m
[31m-        p = (u_char *) SvPV(sv, len);[m
[31m-        b->last = ngx_cpymem(b->last, p, len);[m
[31m-    }[m
[31m-[m
[31m-    out:[m
[31m-[m
[31m-    (void) ngx_http_perl_output(r, b);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-sendfile(r, filename, offset = -1, bytes = 0)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t        *r;[m
[31m-    char                      *filename;[m
[31m-    off_t                      offset;[m
[31m-    size_t                     bytes;[m
[31m-    ngx_str_t                  path;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    filename = SvPV_nolen(ST(1));[m
[31m-[m
[31m-    if (filename == NULL) {[m
[31m-        croak("sendfile(): NULL filename");[m
[31m-    }[m
[31m-[m
[31m-    offset = items < 3 ? -1 : SvIV(ST(2));[m
[31m-    bytes = items < 4 ? 0 : SvIV(ST(3));[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    path.len = ngx_strlen(filename);[m
[31m-[m
[31m-    path.data = ngx_pnalloc(r->pool, path.len + 1);[m
[31m-    if (path.data == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(path.data, (u_char *) filename, path.len + 1);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        if (of.err == 0) {[m
[31m-            XSRETURN_EMPTY;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      "%s \"%s\" failed", of.failed, filename);[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    if (offset == -1) {[m
[31m-        offset = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        bytes = of.size - offset;[m
[31m-    }[m
[31m-[m
[31m-    b->in_file = 1;[m
[31m-[m
[31m-    b->file_pos = offset;[m
[31m-    b->file_last = offset + bytes;[m
[31m-[m
[31m-    b->file->fd = of.fd;[m
[31m-    b->file->log = r->connection->log;[m
[31m-    b->file->directio = of.is_directio;[m
[31m-[m
[31m-    (void) ngx_http_perl_output(r, b);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-flush(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    ngx_buf_t           *b;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    b->flush = 1;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "$r->flush");[m
[31m-[m
[31m-    (void) ngx_http_perl_output(r, b);[m
[31m-[m
[31m-    XSRETURN_EMPTY;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-internal_redirect(r, uri)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t   *r;[m
[31m-    SV                   *uri;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    uri = ST(1);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ngx_http_perl_sv2str(aTHX_ r, &ctx->redirect_uri, uri) != NGX_OK) {[m
[31m-        XSRETURN_EMPTY;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < ctx->redirect_uri.len; i++) {[m
[31m-        if (ctx->redirect_uri.data[i] == '?') {[m
[31m-[m
[31m-            ctx->redirect_args.len = ctx->redirect_uri.len - (i + 1);[m
[31m-            ctx->redirect_args.data = &ctx->redirect_uri.data[i + 1];[m
[31m-            ctx->redirect_uri.len = i;[m
[31m-[m
[31m-            XSRETURN_EMPTY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-void[m
[31m-allow_ranges(r)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    r->allow_ranges = 1;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-unescape(r, text, type = 0)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *text;[m
[31m-    int                  type;[m
[31m-    u_char              *p, *dst, *src;[m
[31m-    STRLEN               len;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    text = ST(1);[m
[31m-[m
[31m-    src = (u_char *) SvPV(text, len);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    dst = p;[m
[31m-[m
[31m-    type = items < 3 ? 0 : SvIV(ST(2));[m
[31m-[m
[31m-    ngx_unescape_uri(&dst, &src, len, (ngx_uint_t) type);[m
[31m-    *dst = '\0';[m
[31m-[m
[31m-    ngx_http_perl_set_targ(p, dst - p);[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-variable(r, name, value = NULL)[m
[31m-    CODE:[m
[31m-[m
[31m-    dXSTARG;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    SV                         *name, *value;[m
[31m-    u_char                     *p, *lowcase;[m
[31m-    STRLEN                      len;[m
[31m-    ngx_str_t                   var, val;[m
[31m-    ngx_uint_t                  i, hash;[m
[31m-    ngx_http_perl_var_t        *v;[m
[31m-    ngx_http_perl_ctx_t        *ctx;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    name = ST(1);[m
[31m-[m
[31m-    if (SvROK(name) && SvTYPE(SvRV(name)) == SVt_PV) {[m
[31m-        name = SvRV(name);[m
[31m-    }[m
[31m-[m
[31m-    if (items == 2) {[m
[31m-        value = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        value = ST(2);[m
[31m-[m
[31m-        if (SvROK(value) && SvTYPE(SvRV(value)) == SVt_PV) {[m
[31m-            value = SvRV(value);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_perl_sv2str(aTHX_ r, &val, value) != NGX_OK) {[m
[31m-            XSRETURN_UNDEF;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) SvPV(name, len);[m
[31m-[m
[31m-    lowcase = ngx_pnalloc(r->pool, len);[m
[31m-    if (lowcase == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase, p, len);[m
[31m-[m
[31m-    var.len = len;[m
[31m-    var.data = lowcase;[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    if (value) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "perl variable: \"%V\"=\"%V\"", &var, &val);[m
[31m-    } else {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "perl variable: \"%V\"", &var);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    vv = ngx_http_get_variable(r, &var, hash);[m
[31m-    if (vv == NULL) {[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    if (vv->not_found) {[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-        if (ctx->variables) {[m
[31m-[m
[31m-            v = ctx->variables->elts;[m
[31m-            for (i = 0; i < ctx->variables->nelts; i++) {[m
[31m-[m
[31m-                if (hash != v[i].hash[m
[31m-                    || len != v[i].name.len[m
[31m-                    || ngx_strncmp(lowcase, v[i].name.data, len) != 0)[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (value) {[m
[31m-                    v[i].value = val;[m
[31m-                    XSRETURN_UNDEF;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_perl_set_targ(v[i].value.data, v[i].value.len);[m
[31m-[m
[31m-                goto done;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (value) {[m
[31m-            if (ctx->variables == NULL) {[m
[31m-                ctx->variables = ngx_array_create(r->pool, 1,[m
[31m-                                                  sizeof(ngx_http_perl_var_t));[m
[31m-                if (ctx->variables == NULL) {[m
[31m-                    XSRETURN_UNDEF;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            v = ngx_array_push(ctx->variables);[m
[31m-            if (v == NULL) {[m
[31m-                XSRETURN_UNDEF;[m
[31m-            }[m
[31m-[m
[31m-            v->hash = hash;[m
[31m-            v->name.len = len;[m
[31m-            v->name.data = lowcase;[m
[31m-            v->value = val;[m
[31m-[m
[31m-            XSRETURN_UNDEF;[m
[31m-        }[m
[31m-[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    if (value) {[m
[31m-        vv->len = val.len;[m
[31m-        vv->valid = 1;[m
[31m-        vv->no_cacheable = 0;[m
[31m-        vv->not_found = 0;[m
[31m-        vv->data = val.data;[m
[31m-[m
[31m-        XSRETURN_UNDEF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_perl_set_targ(vv->data, vv->len);[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-    ST(0) = TARG;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-sleep(r, sleep, next)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_msec_t            sleep;[m
[31m-    ngx_http_perl_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    sleep = (ngx_msec_t) SvIV(ST(1));[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl sleep: %M", sleep);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    ctx->next = SvRV(ST(2));[m
[31m-[m
[31m-    ngx_add_timer(r->connection->write, sleep);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_perl_sleep_handler;[m
[31m-    r->main->count++;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-log_error(r, err, msg)[m
[31m-    CODE:[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-    SV                  *err, *msg;[m
[31m-    u_char              *p;[m
[31m-    STRLEN               len;[m
[31m-    ngx_err_t            e;[m
[31m-[m
[31m-    ngx_http_perl_set_request(r);[m
[31m-[m
[31m-    err = ST(1);[m
[31m-[m
[31m-    if (SvROK(err) && SvTYPE(SvRV(err)) == SVt_PV) {[m
[31m-        err = SvRV(err);[m
[31m-    }[m
[31m-[m
[31m-    e = SvIV(err);[m
[31m-[m
[31m-    msg = ST(2);[m
[31m-[m
[31m-    if (SvROK(msg) && SvTYPE(SvRV(msg)) == SVt_PV) {[m
[31m-        msg = SvRV(msg);[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) SvPV(msg, len);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, e, "perl: %s", p);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6a8894c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1077 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_perl_module.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    PerlInterpreter   *perl;[m
[31m-    HV                *nginx;[m
[31m-    ngx_array_t       *modules;[m
[31m-    ngx_array_t       *requires;[m
[31m-} ngx_http_perl_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    SV                *sub;[m
[31m-    ngx_str_t          handler;[m
[31m-} ngx_http_perl_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    SV                *sub;[m
[31m-    ngx_str_t          handler;[m
[31m-} ngx_http_perl_variable_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-static ngx_int_t ngx_http_perl_ssi(ngx_http_request_t *r,[m
[31m-    ngx_http_ssi_ctx_t *ssi_ctx, ngx_str_t **params);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_perl_init_interpreter(ngx_conf_t *cf,[m
[31m-    ngx_http_perl_main_conf_t *pmcf);[m
[31m-static PerlInterpreter *ngx_http_perl_create_interpreter(ngx_conf_t *cf,[m
[31m-    ngx_http_perl_main_conf_t *pmcf);[m
[31m-static ngx_int_t ngx_http_perl_run_requires(pTHX_ ngx_array_t *requires,[m
[31m-    ngx_log_t *log);[m
[31m-static ngx_int_t ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r,[m
[31m-    HV *nginx, SV *sub, SV **args, ngx_str_t *handler, ngx_str_t *rv);[m
[31m-static void ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv);[m
[31m-[m
[31m-static ngx_int_t ngx_http_perl_preconfiguration(ngx_conf_t *cf);[m
[31m-static void *ngx_http_perl_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_perl_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_perl_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_perl_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_http_perl(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-static void ngx_http_perl_cleanup_perl(void *data);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_perl_init_worker(ngx_cycle_t *cycle);[m
[31m-static void ngx_http_perl_exit(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_perl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("perl_modules"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_perl_main_conf_t, modules),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("perl_require"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_perl_main_conf_t, requires),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("perl"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_perl,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("perl_set"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_perl_set,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_perl_module_ctx = {[m
[31m-    ngx_http_perl_preconfiguration,        /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_perl_create_main_conf,        /* create main configuration */[m
[31m-    ngx_http_perl_init_main_conf,          /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_perl_create_loc_conf,         /* create location configuration */[m
[31m-    ngx_http_perl_merge_loc_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_perl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_perl_module_ctx,             /* module context */[m
[31m-    ngx_http_perl_commands,                /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    ngx_http_perl_init_worker,             /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    ngx_http_perl_exit,                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-[m
[31m-#define NGX_HTTP_PERL_SSI_SUB  0[m
[31m-#define NGX_HTTP_PERL_SSI_ARG  1[m
[31m-[m
[31m-[m
[31m-static ngx_http_ssi_param_t  ngx_http_perl_ssi_params[] = {[m
[31m-    { ngx_string("sub"), NGX_HTTP_PERL_SSI_SUB, 1, 0 },[m
[31m-    { ngx_string("arg"), NGX_HTTP_PERL_SSI_ARG, 0, 1 },[m
[31m-    { ngx_null_string, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_ssi_command_t  ngx_http_perl_ssi_command = {[m
[31m-    ngx_string("perl"), ngx_http_perl_ssi, ngx_http_perl_ssi_params, 0, 0, 1[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_str_t         ngx_null_name = ngx_null_string;[m
[31m-static HV               *nginx_stash;[m
[31m-[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-static ngx_uint_t        ngx_perl_term;[m
[31m-#else[m
[31m-static PerlInterpreter  *perl;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_perl_xs_init(pTHX)[m
[31m-{[m
[31m-    newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);[m
[31m-[m
[31m-    nginx_stash = gv_stashpv("nginx", TRUE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    ngx_http_perl_handle_request(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_perl_handle_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    SV                         *sub;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_str_t                   uri, args, *handler;[m
[31m-    ngx_http_perl_ctx_t        *ctx;[m
[31m-    ngx_http_perl_loc_conf_t   *plcf;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "perl handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-    if (ctx->next == NULL) {[m
[31m-        plcf = ngx_http_get_module_loc_conf(r, ngx_http_perl_module);[m
[31m-        sub = plcf->sub;[m
[31m-        handler = &plcf->handler;[m
[31m-[m
[31m-    } else {[m
[31m-        sub = ctx->next;[m
[31m-        handler = &ngx_null_name;[m
[31m-        ctx->next = NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, sub, NULL, handler,[m
[31m-                                    NULL);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl handler done: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc > 600) {[m
[31m-        rc = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->redirect_uri.len) {[m
[31m-        uri = ctx->redirect_uri;[m
[31m-        args = ctx->redirect_args;[m
[31m-[m
[31m-    } else {[m
[31m-        uri.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx->filename.data = NULL;[m
[31m-    ctx->redirect_uri.len = 0;[m
[31m-[m
[31m-    if (ctx->done || ctx->next) {[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (uri.len) {[m
[31m-        ngx_http_internal_redirect(r, &uri, &args);[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_HTTP_OK) {[m
[31m-        ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-        ctx->done = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_perl_sleep_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl sleep handler");[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        wev->timedout = 0;[m
[31m-        ngx_http_perl_handle_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_perl_variable_t *pv = (ngx_http_perl_variable_t *) data;[m
[31m-[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_str_t                   value;[m
[31m-    ngx_http_perl_ctx_t        *ctx;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl variable handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);[m
[31m-[m
[31m-    value.data = NULL;[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, pv->sub, NULL,[m
[31m-                                    &pv->handler, &value);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    if (value.data) {[m
[31m-        v->len = value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = value.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->filename.data = NULL;[m
[31m-    ctx->redirect_uri.len = 0;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl variable done");[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_ssi(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ssi_ctx,[m
[31m-    ngx_str_t **params)[m
[31m-{[m
[31m-    SV                         *sv, **asv;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_str_t                  *handler, **args;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_perl_ctx_t        *ctx;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "perl ssi handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_perl_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_perl_module);[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module);[m
[31m-[m
[31m-    ctx->ssi = ssi_ctx;[m
[31m-[m
[31m-    handler = params[NGX_HTTP_PERL_SSI_SUB];[m
[31m-    handler->data[handler->len] = '\0';[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-    /* the code is disabled to force the precompiled perl code using only */[m
[31m-[m
[31m-    ngx_http_perl_eval_anon_sub(aTHX_ handler, &sv);[m
[31m-[m
[31m-    if (sv == &PL_sv_undef) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "eval_pv(\"%V\") failed", handler);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sv == NULL) {[m
[31m-        sv = newSVpvn((char *) handler->data, handler->len);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    sv = newSVpvn((char *) handler->data, handler->len);[m
[31m-[m
[31m-    args = &params[NGX_HTTP_PERL_SSI_ARG];[m
[31m-[m
[31m-    if (args) {[m
[31m-[m
[31m-        for (i = 0; args[i]; i++) { /* void */ }[m
[31m-[m
[31m-        asv = ngx_pcalloc(r->pool, (i + 1) * sizeof(SV *));[m
[31m-[m
[31m-        if (asv == NULL) {[m
[31m-            SvREFCNT_dec(sv);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        asv[0] = (SV *) (uintptr_t) i;[m
[31m-[m
[31m-        for (i = 0; args[i]; i++) {[m
[31m-            asv[i + 1] = newSVpvn((char *) args[i]->data, args[i]->len);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        asv = NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_perl_call_handler(aTHX_ r, pmcf->nginx, sv, asv, handler,[m
[31m-                                    NULL);[m
[31m-[m
[31m-    SvREFCNT_dec(sv);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    ctx->filename.data = NULL;[m
[31m-    ctx->redirect_uri.len = 0;[m
[31m-    ctx->ssi = NULL;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "perl ssi done");[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl_init_interpreter(ngx_conf_t *cf, ngx_http_perl_main_conf_t *pmcf)[m
[31m-{[m
[31m-    ngx_str_t           *m;[m
[31m-    ngx_uint_t           i;[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#ifdef NGX_PERL_MODULES[m
[31m-    if (pmcf->modules == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        pmcf->modules = ngx_array_create(cf->pool, 1, sizeof(ngx_str_t));[m
[31m-        if (pmcf->modules == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        m = ngx_array_push(pmcf->modules);[m
[31m-        if (m == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_str_set(m, NGX_PERL_MODULES);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (pmcf->modules != NGX_CONF_UNSET_PTR) {[m
[31m-        m = pmcf->modules->elts;[m
[31m-        for (i = 0; i < pmcf->modules->nelts; i++) {[m
[31m-            if (ngx_conf_full_name(cf->cycle, &m[i], 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if !(NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-[m
[31m-    if (perl) {[m
[31m-[m
[31m-        if (ngx_set_environment(cf->cycle, NULL) == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_perl_run_requires(aTHX_ pmcf->requires, cf->log)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pmcf->perl = perl;[m
[31m-        pmcf->nginx = nginx_stash;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (nginx_stash == NULL) {[m
[31m-        PERL_SYS_INIT(&ngx_argc, &ngx_argv);[m
[31m-    }[m
[31m-[m
[31m-    pmcf->perl = ngx_http_perl_create_interpreter(cf, pmcf);[m
[31m-[m
[31m-    if (pmcf->perl == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pmcf->nginx = nginx_stash;[m
[31m-[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-[m
[31m-    cln->handler = ngx_http_perl_cleanup_perl;[m
[31m-    cln->data = pmcf->perl;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    perl = pmcf->perl;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static PerlInterpreter *[m
[31m-ngx_http_perl_create_interpreter(ngx_conf_t *cf,[m
[31m-    ngx_http_perl_main_conf_t *pmcf)[m
[31m-{[m
[31m-    int                n;[m
[31m-    STRLEN             len;[m
[31m-    SV                *sv;[m
[31m-    char              *ver, **embedding;[m
[31m-    ngx_str_t         *m;[m
[31m-    ngx_uint_t         i;[m
[31m-    PerlInterpreter   *perl;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0, "create perl interpreter");[m
[31m-[m
[31m-    if (ngx_set_environment(cf->cycle, NULL) == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    perl = perl_alloc();[m
[31m-    if (perl == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, 0, "perl_alloc() failed");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(perl);[m
[31m-    PERL_SET_CONTEXT(perl);[m
[31m-[m
[31m-    perl_construct(perl);[m
[31m-[m
[31m-#ifdef PERL_EXIT_DESTRUCT_END[m
[31m-    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;[m
[31m-#endif[m
[31m-[m
[31m-    n = (pmcf->modules != NGX_CONF_UNSET_PTR) ? pmcf->modules->nelts * 2 : 0;[m
[31m-[m
[31m-    embedding = ngx_palloc(cf->pool, (5 + n) * sizeof(char *));[m
[31m-    if (embedding == NULL) {[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    embedding[0] = "";[m
[31m-[m
[31m-    if (n++) {[m
[31m-        m = pmcf->modules->elts;[m
[31m-        for (i = 0; i < pmcf->modules->nelts; i++) {[m
[31m-            embedding[2 * i + 1] = "-I";[m
[31m-            embedding[2 * i + 2] = (char *) m[i].data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    embedding[n++] = "-Mnginx";[m
[31m-    embedding[n++] = "-e";[m
[31m-    embedding[n++] = "0";[m
[31m-    embedding[n] = NULL;[m
[31m-[m
[31m-    n = perl_parse(perl, ngx_http_perl_xs_init, n, embedding, NULL);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, 0, "perl_parse() failed: %d", n);[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    sv = get_sv("nginx::VERSION", FALSE);[m
[31m-    ver = SvPV(sv, len);[m
[31m-[m
[31m-    if (ngx_strcmp(ver, NGINX_VERSION) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cf->log, 0,[m
[31m-                      "version " NGINX_VERSION " of nginx.pm is required, "[m
[31m-                      "but %s was found", ver);[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_perl_run_requires(aTHX_ pmcf->requires, cf->log) != NGX_OK) {[m
[31m-        goto fail;[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return perl;[m
[31m-[m
[31m-fail:[m
[31m-[m
[31m-    (void) perl_destruct(perl);[m
[31m-[m
[31m-    perl_free(perl);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_run_requires(pTHX_ ngx_array_t *requires, ngx_log_t *log)[m
[31m-{[m
[31m-    u_char      *err;[m
[31m-    STRLEN       len;[m
[31m-    ngx_str_t   *script;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (requires == NGX_CONF_UNSET_PTR) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    script = requires->elts;[m
[31m-    for (i = 0; i < requires->nelts; i++) {[m
[31m-[m
[31m-        require_pv((char *) script[i].data);[m
[31m-[m
[31m-        if (SvTRUE(ERRSV)) {[m
[31m-[m
[31m-            err = (u_char *) SvPV(ERRSV, len);[m
[31m-            while (--len && (err[len] == CR || err[len] == LF)) { /* void */ }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, 0,[m
[31m-                          "require_pv(\"%s\") failed: \"%*s\"",[m
[31m-                          script[i].data, len + 1, err);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_call_handler(pTHX_ ngx_http_request_t *r, HV *nginx, SV *sub,[m
[31m-    SV **args, ngx_str_t *handler, ngx_str_t *rv)[m
[31m-{[m
[31m-    SV                *sv;[m
[31m-    int                n, status;[m
[31m-    char              *line;[m
[31m-    u_char            *err;[m
[31m-    STRLEN             len, n_a;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    dSP;[m
[31m-[m
[31m-    status = 0;[m
[31m-[m
[31m-    ENTER;[m
[31m-    SAVETMPS;[m
[31m-[m
[31m-    PUSHMARK(sp);[m
[31m-[m
[31m-    sv = sv_2mortal(sv_bless(newRV_noinc(newSViv(PTR2IV(r))), nginx));[m
[31m-    XPUSHs(sv);[m
[31m-[m
[31m-    if (args) {[m
[31m-        EXTEND(sp, (intptr_t) args[0]);[m
[31m-[m
[31m-        for (i = 1; i <= (uintptr_t) args[0]; i++) {[m
[31m-            PUSHs(sv_2mortal(args[i]));[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    PUTBACK;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    n = call_sv(sub, G_EVAL);[m
[31m-[m
[31m-    SPAGAIN;[m
[31m-[m
[31m-    if (n) {[m
[31m-        if (rv == NULL) {[m
[31m-            status = POPi;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "call_sv: %d", status);[m
[31m-[m
[31m-        } else {[m
[31m-            line = SvPVx(POPs, n_a);[m
[31m-            rv->len = n_a;[m
[31m-[m
[31m-            rv->data = ngx_pnalloc(r->pool, n_a);[m
[31m-            if (rv->data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(rv->data, line, n_a);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    PUTBACK;[m
[31m-[m
[31m-    FREETMPS;[m
[31m-    LEAVE;[m
[31m-[m
[31m-    /* check $@ */[m
[31m-[m
[31m-    if (SvTRUE(ERRSV)) {[m
[31m-[m
[31m-        err = (u_char *) SvPV(ERRSV, len);[m
[31m-        while (--len && (err[len] == CR || err[len] == LF)) { /* void */ }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "call_sv(\"%V\") failed: \"%*s\"", handler, len + 1, err);[m
[31m-[m
[31m-        if (rv) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n != 1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "call_sv(\"%V\") returned %d results", handler, n);[m
[31m-        status = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rv) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return (ngx_int_t) status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    for (p = handler->data; *p; p++) {[m
[31m-        if (*p != ' ' && *p != '\t' && *p != CR && *p != LF) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strncmp(p, "sub ", 4) == 0[m
[31m-        || ngx_strncmp(p, "sub{", 4) == 0[m
[31m-        || ngx_strncmp(p, "use ", 4) == 0)[m
[31m-    {[m
[31m-        *sv = eval_pv((char *) p, FALSE);[m
[31m-[m
[31m-        /* eval_pv() does not set ERRSV on failure */[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *sv = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_perl_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    pmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_perl_main_conf_t));[m
[31m-    if (pmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    pmcf->modules = NGX_CONF_UNSET_PTR;[m
[31m-    pmcf->requires = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return pmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_perl_main_conf_t *pmcf = conf;[m
[31m-[m
[31m-    if (pmcf->perl == NULL) {[m
[31m-        if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_perl_cleanup_perl(void *data)[m
[31m-{[m
[31m-    PerlInterpreter  *perl = data;[m
[31m-[m
[31m-    PERL_SET_CONTEXT(perl);[m
[31m-[m
[31m-    (void) perl_destruct(perl);[m
[31m-[m
[31m-    perl_free(perl);[m
[31m-[m
[31m-    if (ngx_perl_term) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, "perl term");[m
[31m-[m
[31m-        PERL_SYS_TERM();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_ssi_main_conf_t  *smcf;[m
[31m-[m
[31m-    smcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_ssi_filter_module);[m
[31m-[m
[31m-    rc = ngx_hash_add_key(&smcf->commands, &ngx_http_perl_ssi_command.name,[m
[31m-                          &ngx_http_perl_ssi_command, NGX_HASH_READONLY_KEY);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "conflicting SSI command \"%V\"",[m
[31m-                               &ngx_http_perl_ssi_command.name);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_perl_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_perl_loc_conf_t *plcf;[m
[31m-[m
[31m-    plcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_perl_loc_conf_t));[m
[31m-    if (plcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     plcf->handler = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    return plcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_perl_loc_conf_t *prev = parent;[m
[31m-    ngx_http_perl_loc_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->sub == NULL) {[m
[31m-        conf->sub = prev->sub;[m
[31m-        conf->handler = prev->handler;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_perl_loc_conf_t *plcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (plcf->handler.data) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate perl handler \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_perl_module);[m
[31m-[m
[31m-    if (pmcf->perl == NULL) {[m
[31m-        if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    plcf->handler = value[1];[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-    ngx_http_perl_eval_anon_sub(aTHX_ &value[1], &plcf->sub);[m
[31m-[m
[31m-    if (plcf->sub == &PL_sv_undef) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "eval_pv(\"%V\") failed", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (plcf->sub == NULL) {[m
[31m-        plcf->sub = newSVpvn((char *) value[1].data, value[1].len);[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    clcf->handler = ngx_http_perl_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_int_t                   index;[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_perl_variable_t   *pv;[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value[1].len--;[m
[31m-    value[1].data++;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pv = ngx_palloc(cf->pool, sizeof(ngx_http_perl_variable_t));[m
[31m-    if (pv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, &value[1]);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_perl_module);[m
[31m-[m
[31m-    if (pmcf->perl == NULL) {[m
[31m-        if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pv->handler = value[2];[m
[31m-[m
[31m-    {[m
[31m-[m
[31m-    dTHXa(pmcf->perl);[m
[31m-    PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-    ngx_http_perl_eval_anon_sub(aTHX_ &value[2], &pv->sub);[m
[31m-[m
[31m-    if (pv->sub == &PL_sv_undef) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "eval_pv(\"%V\") failed", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pv->sub == NULL) {[m
[31m-        pv->sub = newSVpvn((char *) value[2].data, value[2].len);[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    v->get_handler = ngx_http_perl_variable;[m
[31m-    v->data = (uintptr_t) pv;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_perl_init_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_http_perl_main_conf_t  *pmcf;[m
[31m-[m
[31m-    pmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_perl_module);[m
[31m-[m
[31m-    if (pmcf) {[m
[31m-        dTHXa(pmcf->perl);[m
[31m-        PERL_SET_CONTEXT(pmcf->perl);[m
[31m-[m
[31m-        /* set worker's $$ */[m
[31m-[m
[31m-        sv_setiv(GvSV(gv_fetchpv("$", TRUE, SVt_PV)), (I32) ngx_pid);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_perl_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-#if (NGX_HAVE_PERL_MULTIPLICITY)[m
[31m-[m
[31m-    /*[m
[31m-     * the master exit hook is run before global pool cleanup,[m
[31m-     * therefore just set flag here[m
[31m-     */[m
[31m-[m
[31m-    ngx_perl_term = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (nginx_stash) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cycle->log, 0, "perl term");[m
[31m-[m
[31m-        (void) perl_destruct(perl);[m
[31m-[m
[31m-        perl_free(perl);[m
[31m-[m
[31m-        PERL_SYS_TERM();[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.h[m
[1mdeleted file mode 100644[m
[1mindex 5e60b03..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/ngx_http_perl_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_PERL_MODULE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_PERL_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-#include <EXTERN.h>[m
[31m-#include <perl.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_http_request_t   *nginx;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                 filename;[m
[31m-    ngx_str_t                 redirect_uri;[m
[31m-    ngx_str_t                 redirect_args;[m
[31m-[m
[31m-    SV                       *next;[m
[31m-[m
[31m-    ngx_uint_t                done;       /* unsigned  done:1; */[m
[31m-[m
[31m-    ngx_array_t              *variables;  /* array of ngx_http_perl_var_t */[m
[31m-[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-    ngx_http_ssi_ctx_t       *ssi;[m
[31m-#endif[m
[31m-} ngx_http_perl_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t    hash;[m
[31m-    ngx_str_t     name;[m
[31m-    ngx_str_t     value;[m
[31m-} ngx_http_perl_var_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_perl_module;[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * workaround for "unused variable `Perl___notused'" warning[m
[31m- * when building with perl 5.6.1[m
[31m- */[m
[31m-#ifndef PERL_IMPLICIT_CONTEXT[m
[31m-#undef  dTHXa[m
[31m-#define dTHXa(a)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern void boot_DynaLoader(pTHX_ CV* cv);[m
[31m-[m
[31m-[m
[31m-void ngx_http_perl_handle_request(ngx_http_request_t *r);[m
[31m-void ngx_http_perl_sleep_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_PERL_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/typemap b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/typemap[m
[1mdeleted file mode 100644[m
[1mindex e2f1a4c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/modules/perl/typemap[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-TYPEMAP[m
[31m-[m
[31m-nginx	T_PTROBJ[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http.c[m
[1mdeleted file mode 100644[m
[1mindex 986f717..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http.c[m
[1m+++ /dev/null[m
[36m@@ -1,2133 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_http_init_phases(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf);[m
[31m-static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf);[m
[31m-static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf,[m
[31m-    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,[m
[31m-    ngx_http_listen_opt_t *lsopt);[m
[31m-static ngx_int_t ngx_http_add_address(ngx_conf_t *cf,[m
[31m-    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,[m
[31m-    ngx_http_listen_opt_t *lsopt);[m
[31m-static ngx_int_t ngx_http_add_server(ngx_conf_t *cf,[m
[31m-    ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr);[m
[31m-[m
[31m-static char *ngx_http_merge_servers(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf, ngx_http_module_t *module,[m
[31m-    ngx_uint_t ctx_index);[m
[31m-static char *ngx_http_merge_locations(ngx_conf_t *cf,[m
[31m-    ngx_queue_t *locations, void **loc_conf, ngx_http_module_t *module,[m
[31m-    ngx_uint_t ctx_index);[m
[31m-static ngx_int_t ngx_http_init_locations(ngx_conf_t *cf,[m
[31m-    ngx_http_core_srv_conf_t *cscf, ngx_http_core_loc_conf_t *pclcf);[m
[31m-static ngx_int_t ngx_http_init_static_location_trees(ngx_conf_t *cf,[m
[31m-    ngx_http_core_loc_conf_t *pclcf);[m
[31m-static ngx_int_t ngx_http_cmp_locations(const ngx_queue_t *one,[m
[31m-    const ngx_queue_t *two);[m
[31m-static ngx_int_t ngx_http_join_exact_locations(ngx_conf_t *cf,[m
[31m-    ngx_queue_t *locations);[m
[31m-static void ngx_http_create_locations_list(ngx_queue_t *locations,[m
[31m-    ngx_queue_t *q);[m
[31m-static ngx_http_location_tree_node_t *[m
[31m-    ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,[m
[31m-    size_t prefix);[m
[31m-[m
[31m-static ngx_int_t ngx_http_optimize_servers(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf, ngx_array_t *ports);[m
[31m-static ngx_int_t ngx_http_server_names(ngx_conf_t *cf,[m
[31m-    ngx_http_core_main_conf_t *cmcf, ngx_http_conf_addr_t *addr);[m
[31m-static ngx_int_t ngx_http_cmp_conf_addrs(const void *one, const void *two);[m
[31m-static int ngx_libc_cdecl ngx_http_cmp_dns_wildcards(const void *one,[m
[31m-    const void *two);[m
[31m-[m
[31m-static ngx_int_t ngx_http_init_listening(ngx_conf_t *cf,[m
[31m-    ngx_http_conf_port_t *port);[m
[31m-static ngx_listening_t *ngx_http_add_listening(ngx_conf_t *cf,[m
[31m-    ngx_http_conf_addr_t *addr);[m
[31m-static ngx_int_t ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,[m
[31m-    ngx_http_conf_addr_t *addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,[m
[31m-    ngx_http_conf_addr_t *addr);[m
[31m-#endif[m
[31m-[m
[31m-ngx_uint_t   ngx_http_max_module;[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt  ngx_http_top_header_filter;[m
[31m-ngx_http_output_body_filter_pt    ngx_http_top_body_filter;[m
[31m-ngx_http_request_body_filter_pt   ngx_http_top_request_body_filter;[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_html_default_types[] = {[m
[31m-    ngx_string("text/html"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_commands[] = {[m
[31m-[m
[31m-    { ngx_string("http"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_block,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_http_module_ctx = {[m
[31m-    ngx_string("http"),[m
[31m-    NULL,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_module_ctx,                  /* module context */[m
[31m-    ngx_http_commands,                     /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    ngx_uint_t                   mi, m, s;[m
[31m-    ngx_conf_t                   pcf;[m
[31m-    ngx_http_module_t           *module;[m
[31m-    ngx_http_conf_ctx_t         *ctx;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_core_srv_conf_t   **cscfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    if (*(ngx_http_conf_ctx_t **) conf) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* the main http context */[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(ngx_http_conf_ctx_t **) conf = ctx;[m
[31m-[m
[31m-[m
[31m-    /* count the number of the http modules and set up their indices */[m
[31m-[m
[31m-    ngx_http_max_module = ngx_count_modules(cf->cycle, NGX_HTTP_MODULE);[m
[31m-[m
[31m-[m
[31m-    /* the http main_conf context, it is the same in the all http contexts */[m
[31m-[m
[31m-    ctx->main_conf = ngx_pcalloc(cf->pool,[m
[31m-                                 sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->main_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * the http null srv_conf context, it is used to merge[m
[31m-     * the server{}s' srv_conf's[m
[31m-     */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * the http null loc_conf context, it is used to merge[m
[31m-     * the server{}s' loc_conf's[m
[31m-     */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * create the main_conf's, the null srv_conf's, and the null loc_conf's[m
[31m-     * of the all http modules[m
[31m-     */[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        if (module->create_main_conf) {[m
[31m-            ctx->main_conf[mi] = module->create_main_conf(cf);[m
[31m-            if (ctx->main_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            ctx->srv_conf[mi] = module->create_srv_conf(cf);[m
[31m-            if (ctx->srv_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            ctx->loc_conf[mi] = module->create_loc_conf(cf);[m
[31m-            if (ctx->loc_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->preconfiguration) {[m
[31m-            if (module->preconfiguration(cf) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* parse inside the http{} block */[m
[31m-[m
[31m-    cf->module_type = NGX_HTTP_MODULE;[m
[31m-    cf->cmd_type = NGX_HTTP_MAIN_CONF;[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * init http{} main_conf's, merge the server{}s' srv_conf's[m
[31m-     * and its location{}s' loc_conf's[m
[31m-     */[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        /* init http{} main_conf's */[m
[31m-[m
[31m-        if (module->init_main_conf) {[m
[31m-            rv = module->init_main_conf(cf, ctx->main_conf[mi]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rv = ngx_http_merge_servers(cf, cmcf, module, mi);[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* create location trees */[m
[31m-[m
[31m-    for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-        clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-        if (ngx_http_init_locations(cf, cscfp[s], clcf) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_http_init_phases(cf, cmcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_init_headers_in_hash(cf, cmcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->postconfiguration) {[m
[31m-[m
[31m-            ngx_http_probe_module_post_config(ngx_modules[m]);[m
[31m-[m
[31m-            if (module->postconfiguration(cf) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_variables_init_vars(cf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * http{}'s cf->ctx was needed while the configuration merging[m
[31m-     * and in postconfiguration process[m
[31m-     */[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-[m
[31m-    if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* optimize the lists of ports, addresses and server names */[m
[31m-[m
[31m-    if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)[m
[31m-{[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers,[m
[31m-                       cf->pool, 2, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers,[m
[31m-                       cf->pool, 4, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers,[m
[31m-                       cf->pool, 1, sizeof(ngx_http_handler_pt))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_headers_in_hash(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)[m
[31m-{[m
[31m-    ngx_array_t         headers_in;[m
[31m-    ngx_hash_key_t     *hk;[m
[31m-    ngx_hash_init_t     hash;[m
[31m-    ngx_http_header_t  *header;[m
[31m-[m
[31m-    if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (header = ngx_http_headers_in; header->name.len; header++) {[m
[31m-        hk = ngx_array_push(&headers_in);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = header->name;[m
[31m-        hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);[m
[31m-        hk->value = header;[m
[31m-    }[m
[31m-[m
[31m-    hash.hash = &cmcf->headers_in_hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "headers_in_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)[m
[31m-{[m
[31m-    ngx_int_t                   j;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_uint_t                  find_config_index, use_rewrite, use_access;[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_phase_handler_t   *ph;[m
[31m-    ngx_http_phase_handler_pt   checker;[m
[31m-[m
[31m-    cmcf->phase_engine.server_rewrite_index = (ngx_uint_t) -1;[m
[31m-    cmcf->phase_engine.location_rewrite_index = (ngx_uint_t) -1;[m
[31m-    find_config_index = 0;[m
[31m-    use_rewrite = cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers.nelts ? 1 : 0;[m
[31m-    use_access = cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers.nelts ? 1 : 0;[m
[31m-[m
[31m-    n = use_rewrite + use_access + cmcf->try_files + 1 /* find config phase */;[m
[31m-[m
[31m-    for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {[m
[31m-        n += cmcf->phases[i].handlers.nelts;[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_pcalloc(cf->pool,[m
[31m-                     n * sizeof(ngx_http_phase_handler_t) + sizeof(void *));[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->phase_engine.handlers = ph;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {[m
[31m-        h = cmcf->phases[i].handlers.elts;[m
[31m-[m
[31m-        switch (i) {[m
[31m-[m
[31m-        case NGX_HTTP_SERVER_REWRITE_PHASE:[m
[31m-            if (cmcf->phase_engine.server_rewrite_index == (ngx_uint_t) -1) {[m
[31m-                cmcf->phase_engine.server_rewrite_index = n;[m
[31m-            }[m
[31m-            checker = ngx_http_core_rewrite_phase;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_FIND_CONFIG_PHASE:[m
[31m-            find_config_index = n;[m
[31m-[m
[31m-            ph->checker = ngx_http_core_find_config_phase;[m
[31m-            n++;[m
[31m-            ph++;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case NGX_HTTP_REWRITE_PHASE:[m
[31m-            if (cmcf->phase_engine.location_rewrite_index == (ngx_uint_t) -1) {[m
[31m-                cmcf->phase_engine.location_rewrite_index = n;[m
[31m-            }[m
[31m-            checker = ngx_http_core_rewrite_phase;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST_REWRITE_PHASE:[m
[31m-            if (use_rewrite) {[m
[31m-                ph->checker = ngx_http_core_post_rewrite_phase;[m
[31m-                ph->next = find_config_index;[m
[31m-                n++;[m
[31m-                ph++;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case NGX_HTTP_ACCESS_PHASE:[m
[31m-            checker = ngx_http_core_access_phase;[m
[31m-            n++;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST_ACCESS_PHASE:[m
[31m-            if (use_access) {[m
[31m-                ph->checker = ngx_http_core_post_access_phase;[m
[31m-                ph->next = n;[m
[31m-                ph++;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case NGX_HTTP_TRY_FILES_PHASE:[m
[31m-            if (cmcf->try_files) {[m
[31m-                ph->checker = ngx_http_core_try_files_phase;[m
[31m-                n++;[m
[31m-                ph++;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-        case NGX_HTTP_CONTENT_PHASE:[m
[31m-            checker = ngx_http_core_content_phase;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            checker = ngx_http_core_generic_phase;[m
[31m-        }[m
[31m-[m
[31m-        n += cmcf->phases[i].handlers.nelts;[m
[31m-[m
[31m-        for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--) {[m
[31m-            ph->checker = checker;[m
[31m-            ph->handler = h[j];[m
[31m-            ph->next = n;[m
[31m-            ph++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_merge_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,[m
[31m-    ngx_http_module_t *module, ngx_uint_t ctx_index)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    ngx_uint_t                   s;[m
[31m-    ngx_http_conf_ctx_t         *ctx, saved;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_core_srv_conf_t   **cscfp;[m
[31m-[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-    ctx = (ngx_http_conf_ctx_t *) cf->ctx;[m
[31m-    saved = *ctx;[m
[31m-    rv = NGX_CONF_OK;[m
[31m-[m
[31m-    for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-        /* merge the server{}s' srv_conf's */[m
[31m-[m
[31m-        ctx->srv_conf = cscfp[s]->ctx->srv_conf;[m
[31m-[m
[31m-        if (module->merge_srv_conf) {[m
[31m-            rv = module->merge_srv_conf(cf, saved.srv_conf[ctx_index],[m
[31m-                                        cscfp[s]->ctx->srv_conf[ctx_index]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->merge_loc_conf) {[m
[31m-[m
[31m-            /* merge the server{}'s loc_conf */[m
[31m-[m
[31m-            ctx->loc_conf = cscfp[s]->ctx->loc_conf;[m
[31m-[m
[31m-            rv = module->merge_loc_conf(cf, saved.loc_conf[ctx_index],[m
[31m-                                        cscfp[s]->ctx->loc_conf[ctx_index]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            /* merge the locations{}' loc_conf's */[m
[31m-[m
[31m-            clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-            rv = ngx_http_merge_locations(cf, clcf->locations,[m
[31m-                                          cscfp[s]->ctx->loc_conf,[m
[31m-                                          module, ctx_index);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    *ctx = saved;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,[m
[31m-    void **loc_conf, ngx_http_module_t *module, ngx_uint_t ctx_index)[m
[31m-{[m
[31m-    char                       *rv;[m
[31m-    ngx_queue_t                *q;[m
[31m-    ngx_http_conf_ctx_t        *ctx, saved;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_location_queue_t  *lq;[m
[31m-[m
[31m-    if (locations == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx = (ngx_http_conf_ctx_t *) cf->ctx;[m
[31m-    saved = *ctx;[m
[31m-[m
[31m-    for (q = ngx_queue_head(locations);[m
[31m-         q != ngx_queue_sentinel(locations);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-        clcf = lq->exact ? lq->exact : lq->inclusive;[m
[31m-        ctx->loc_conf = clcf->loc_conf;[m
[31m-[m
[31m-        rv = module->merge_loc_conf(cf, loc_conf[ctx_index],[m
[31m-                                    clcf->loc_conf[ctx_index]);[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-[m
[31m-        rv = ngx_http_merge_locations(cf, clcf->locations, clcf->loc_conf,[m
[31m-                                      module, ctx_index);[m
[31m-        if (rv != NGX_CONF_OK) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *ctx = saved;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_locations(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_core_loc_conf_t *pclcf)[m
[31m-{[m
[31m-    ngx_uint_t                   n;[m
[31m-    ngx_queue_t                 *q, *locations, *named, tail;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_location_queue_t   *lq;[m
[31m-    ngx_http_core_loc_conf_t   **clcfp;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                   r;[m
[31m-    ngx_queue_t                 *regex;[m
[31m-#endif[m
[31m-[m
[31m-    locations = pclcf->locations;[m
[31m-[m
[31m-    if (locations == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_sort(locations, ngx_http_cmp_locations);[m
[31m-[m
[31m-    named = NULL;[m
[31m-    n = 0;[m
[31m-#if (NGX_PCRE)[m
[31m-    regex = NULL;[m
[31m-    r = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (q = ngx_queue_head(locations);[m
[31m-         q != ngx_queue_sentinel(locations);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-        clcf = lq->exact ? lq->exact : lq->inclusive;[m
[31m-[m
[31m-        if (ngx_http_init_locations(cf, NULL, clcf) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-        if (clcf->regex) {[m
[31m-            r++;[m
[31m-[m
[31m-            if (regex == NULL) {[m
[31m-                regex = q;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (clcf->named) {[m
[31m-            n++;[m
[31m-[m
[31m-            if (named == NULL) {[m
[31m-                named = q;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->noname) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (q != ngx_queue_sentinel(locations)) {[m
[31m-        ngx_queue_split(locations, q, &tail);[m
[31m-    }[m
[31m-[m
[31m-    if (named) {[m
[31m-        clcfp = ngx_palloc(cf->pool,[m
[31m-                           (n + 1) * sizeof(ngx_http_core_loc_conf_t *));[m
[31m-        if (clcfp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cscf->named_locations = clcfp;[m
[31m-[m
[31m-        for (q = named;[m
[31m-             q != ngx_queue_sentinel(locations);[m
[31m-             q = ngx_queue_next(q))[m
[31m-        {[m
[31m-            lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-            *(clcfp++) = lq->exact;[m
[31m-        }[m
[31m-[m
[31m-        *clcfp = NULL;[m
[31m-[m
[31m-        ngx_queue_split(locations, named, &tail);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (regex) {[m
[31m-[m
[31m-        clcfp = ngx_palloc(cf->pool,[m
[31m-                           (r + 1) * sizeof(ngx_http_core_loc_conf_t *));[m
[31m-        if (clcfp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pclcf->regex_locations = clcfp;[m
[31m-[m
[31m-        for (q = regex;[m
[31m-             q != ngx_queue_sentinel(locations);[m
[31m-             q = ngx_queue_next(q))[m
[31m-        {[m
[31m-            lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-            *(clcfp++) = lq->exact;[m
[31m-        }[m
[31m-[m
[31m-        *clcfp = NULL;[m
[31m-[m
[31m-        ngx_queue_split(locations, regex, &tail);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_static_location_trees(ngx_conf_t *cf,[m
[31m-    ngx_http_core_loc_conf_t *pclcf)[m
[31m-{[m
[31m-    ngx_queue_t                *q, *locations;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_location_queue_t  *lq;[m
[31m-[m
[31m-    locations = pclcf->locations;[m
[31m-[m
[31m-    if (locations == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_queue_empty(locations)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (q = ngx_queue_head(locations);[m
[31m-         q != ngx_queue_sentinel(locations);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-        clcf = lq->exact ? lq->exact : lq->inclusive;[m
[31m-[m
[31m-        if (ngx_http_init_static_location_trees(cf, clcf) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_join_exact_locations(cf, locations) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_create_locations_list(locations, ngx_queue_head(locations));[m
[31m-[m
[31m-    pclcf->static_locations = ngx_http_create_locations_tree(cf, locations, 0);[m
[31m-    if (pclcf->static_locations == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,[m
[31m-    ngx_http_core_loc_conf_t *clcf)[m
[31m-{[m
[31m-    ngx_http_location_queue_t  *lq;[m
[31m-[m
[31m-    if (*locations == NULL) {[m
[31m-        *locations = ngx_palloc(cf->temp_pool,[m
[31m-                                sizeof(ngx_http_location_queue_t));[m
[31m-        if (*locations == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_init(*locations);[m
[31m-    }[m
[31m-[m
[31m-    lq = ngx_palloc(cf->temp_pool, sizeof(ngx_http_location_queue_t));[m
[31m-    if (lq == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->exact_match[m
[31m-#if (NGX_PCRE)[m
[31m-        || clcf->regex[m
[31m-#endif[m
[31m-        || clcf->named || clcf->noname)[m
[31m-    {[m
[31m-        lq->exact = clcf;[m
[31m-        lq->inclusive = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        lq->exact = NULL;[m
[31m-        lq->inclusive = clcf;[m
[31m-    }[m
[31m-[m
[31m-    lq->name = &clcf->name;[m
[31m-    lq->file_name = cf->conf_file->file.name.data;[m
[31m-    lq->line = cf->conf_file->line;[m
[31m-[m
[31m-    ngx_queue_init(&lq->list);[m
[31m-[m
[31m-    ngx_queue_insert_tail(*locations, &lq->queue);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_cmp_locations(const ngx_queue_t *one, const ngx_queue_t *two)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_core_loc_conf_t   *first, *second;[m
[31m-    ngx_http_location_queue_t  *lq1, *lq2;[m
[31m-[m
[31m-    lq1 = (ngx_http_location_queue_t *) one;[m
[31m-    lq2 = (ngx_http_location_queue_t *) two;[m
[31m-[m
[31m-    first = lq1->exact ? lq1->exact : lq1->inclusive;[m
[31m-    second = lq2->exact ? lq2->exact : lq2->inclusive;[m
[31m-[m
[31m-    if (first->noname && !second->noname) {[m
[31m-        /* shift no named locations to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->noname && second->noname) {[m
[31m-        /* shift no named locations to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->noname || second->noname) {[m
[31m-        /* do not sort no named locations */[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (first->named && !second->named) {[m
[31m-        /* shift named locations to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->named && second->named) {[m
[31m-        /* shift named locations to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->named && second->named) {[m
[31m-        return ngx_strcmp(first->name.data, second->name.data);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (first->regex && !second->regex) {[m
[31m-        /* shift the regex matches to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->regex && second->regex) {[m
[31m-        /* shift the regex matches to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->regex || second->regex) {[m
[31m-        /* do not sort the regex matches */[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_filename_cmp(first->name.data, second->name.data,[m
[31m-                          ngx_min(first->name.len, second->name.len) + 1);[m
[31m-[m
[31m-    if (rc == 0 && !first->exact_match && second->exact_match) {[m
[31m-        /* an exact match must be before the same inclusive one */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_join_exact_locations(ngx_conf_t *cf, ngx_queue_t *locations)[m
[31m-{[m
[31m-    ngx_queue_t                *q, *x;[m
[31m-    ngx_http_location_queue_t  *lq, *lx;[m
[31m-[m
[31m-    q = ngx_queue_head(locations);[m
[31m-[m
[31m-    while (q != ngx_queue_last(locations)) {[m
[31m-[m
[31m-        x = ngx_queue_next(q);[m
[31m-[m
[31m-        lq = (ngx_http_location_queue_t *) q;[m
[31m-        lx = (ngx_http_location_queue_t *) x;[m
[31m-[m
[31m-        if (lq->name->len == lx->name->len[m
[31m-            && ngx_filename_cmp(lq->name->data, lx->name->data, lx->name->len)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            if ((lq->exact && lx->exact) || (lq->inclusive && lx->inclusive)) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                              "duplicate location \"%V\" in %s:%ui",[m
[31m-                              lx->name, lx->file_name, lx->line);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            lq->inclusive = lx->inclusive;[m
[31m-[m
[31m-            ngx_queue_remove(x);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_next(q);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_create_locations_list(ngx_queue_t *locations, ngx_queue_t *q)[m
[31m-{[m
[31m-    u_char                     *name;[m
[31m-    size_t                      len;[m
[31m-    ngx_queue_t                *x, tail;[m
[31m-    ngx_http_location_queue_t  *lq, *lx;[m
[31m-[m
[31m-    if (q == ngx_queue_last(locations)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lq = (ngx_http_location_queue_t *) q;[m
[31m-[m
[31m-    if (lq->inclusive == NULL) {[m
[31m-        ngx_http_create_locations_list(locations, ngx_queue_next(q));[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    len = lq->name->len;[m
[31m-    name = lq->name->data;[m
[31m-[m
[31m-    for (x = ngx_queue_next(q);[m
[31m-         x != ngx_queue_sentinel(locations);[m
[31m-         x = ngx_queue_next(x))[m
[31m-    {[m
[31m-        lx = (ngx_http_location_queue_t *) x;[m
[31m-[m
[31m-        if (len > lx->name->len[m
[31m-            || ngx_filename_cmp(name, lx->name->data, len) != 0)[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    q = ngx_queue_next(q);[m
[31m-[m
[31m-    if (q == x) {[m
[31m-        ngx_http_create_locations_list(locations, x);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_split(locations, q, &tail);[m
[31m-    ngx_queue_add(&lq->list, &tail);[m
[31m-[m
[31m-    if (x == ngx_queue_sentinel(locations)) {[m
[31m-        ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_split(&lq->list, x, &tail);[m
[31m-    ngx_queue_add(locations, &tail);[m
[31m-[m
[31m-    ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list));[m
[31m-[m
[31m-    ngx_http_create_locations_list(locations, x);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * to keep cache locality for left leaf nodes, allocate nodes in following[m
[31m- * order: node, left subtree, right subtree, inclusive subtree[m
[31m- */[m
[31m-[m
[31m-static ngx_http_location_tree_node_t *[m
[31m-ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,[m
[31m-    size_t prefix)[m
[31m-{[m
[31m-    size_t                          len;[m
[31m-    ngx_queue_t                    *q, tail;[m
[31m-    ngx_http_location_queue_t      *lq;[m
[31m-    ngx_http_location_tree_node_t  *node;[m
[31m-[m
[31m-    q = ngx_queue_middle(locations);[m
[31m-[m
[31m-    lq = (ngx_http_location_queue_t *) q;[m
[31m-    len = lq->name->len - prefix;[m
[31m-[m
[31m-    node = ngx_palloc(cf->pool,[m
[31m-                      offsetof(ngx_http_location_tree_node_t, name) + len);[m
[31m-    if (node == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    node->left = NULL;[m
[31m-    node->right = NULL;[m
[31m-    node->tree = NULL;[m
[31m-    node->exact = lq->exact;[m
[31m-    node->inclusive = lq->inclusive;[m
[31m-[m
[31m-    node->auto_redirect = (u_char) ((lq->exact && lq->exact->auto_redirect)[m
[31m-                           || (lq->inclusive && lq->inclusive->auto_redirect));[m
[31m-[m
[31m-    node->len = (u_char) len;[m
[31m-    ngx_memcpy(node->name, &lq->name->data[prefix], len);[m
[31m-[m
[31m-    ngx_queue_split(locations, q, &tail);[m
[31m-[m
[31m-    if (ngx_queue_empty(locations)) {[m
[31m-        /*[m
[31m-         * ngx_queue_split() insures that if left part is empty,[m
[31m-         * then right one is empty too[m
[31m-         */[m
[31m-        goto inclusive;[m
[31m-    }[m
[31m-[m
[31m-    node->left = ngx_http_create_locations_tree(cf, locations, prefix);[m
[31m-    if (node->left == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(q);[m
[31m-[m
[31m-    if (ngx_queue_empty(&tail)) {[m
[31m-        goto inclusive;[m
[31m-    }[m
[31m-[m
[31m-    node->right = ngx_http_create_locations_tree(cf, &tail, prefix);[m
[31m-    if (node->right == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-inclusive:[m
[31m-[m
[31m-    if (ngx_queue_empty(&lq->list)) {[m
[31m-        return node;[m
[31m-    }[m
[31m-[m
[31m-    node->tree = ngx_http_create_locations_tree(cf, &lq->list, prefix + len);[m
[31m-    if (node->tree == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return node;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_listen_opt_t *lsopt)[m
[31m-{[m
[31m-    in_port_t                   p;[m
[31m-    ngx_uint_t                  i;[m
[31m-    struct sockaddr            *sa;[m
[31m-    struct sockaddr_in         *sin;[m
[31m-    ngx_http_conf_port_t       *port;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6        *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (cmcf->ports == NULL) {[m
[31m-        cmcf->ports = ngx_array_create(cf->temp_pool, 2,[m
[31m-                                       sizeof(ngx_http_conf_port_t));[m
[31m-        if (cmcf->ports == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sa = &lsopt->u.sockaddr;[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = &lsopt->u.sockaddr_in6;[m
[31m-        p = sin6->sin6_port;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        p = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = &lsopt->u.sockaddr_in;[m
[31m-        p = sin->sin_port;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    port = cmcf->ports->elts;[m
[31m-    for (i = 0; i < cmcf->ports->nelts; i++) {[m
[31m-[m
[31m-        if (p != port[i].port || sa->sa_family != port[i].family) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* a port is already in the port list */[m
[31m-[m
[31m-        return ngx_http_add_addresses(cf, cscf, &port[i], lsopt);[m
[31m-    }[m
[31m-[m
[31m-    /* add a port to the port list */[m
[31m-[m
[31m-    port = ngx_array_push(cmcf->ports);[m
[31m-    if (port == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    port->family = sa->sa_family;[m
[31m-    port->port = p;[m
[31m-    port->addrs.elts = NULL;[m
[31m-[m
[31m-    return ngx_http_add_address(cf, cscf, port, lsopt);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    size_t                 len, off;[m
[31m-    ngx_uint_t             i, default_server, proxy_protocol;[m
[31m-    struct sockaddr       *sa;[m
[31m-    ngx_http_conf_addr_t  *addr;[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    struct sockaddr_un    *saun;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_uint_t             ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    ngx_uint_t             http2;[m
[31m-#endif[m
[31m-[m
[31m-    /*[m
[31m-     * we cannot compare whole sockaddr struct's as kernel[m
[31m-     * may fill some fields in inherited sockaddr struct's[m
[31m-     */[m
[31m-[m
[31m-    sa = &lsopt->u.sockaddr;[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        off = offsetof(struct sockaddr_in6, sin6_addr);[m
[31m-        len = 16;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        off = offsetof(struct sockaddr_un, sun_path);[m
[31m-        len = sizeof(saun->sun_path);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        off = offsetof(struct sockaddr_in, sin_addr);[m
[31m-        len = 4;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    p = lsopt->u.sockaddr_data + off;[m
[31m-[m
[31m-    addr = port->addrs.elts;[m
[31m-[m
[31m-    for (i = 0; i < port->addrs.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_memcmp(p, addr[i].opt.u.sockaddr_data + off, len) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* the address is already in the address list */[m
[31m-[m
[31m-        if (ngx_http_add_server(cf, cscf, &addr[i]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* preserve default_server bit during listen options overwriting */[m
[31m-        default_server = addr[i].opt.default_server;[m
[31m-[m
[31m-        proxy_protocol = lsopt->proxy_protocol || addr[i].opt.proxy_protocol;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        ssl = lsopt->ssl || addr[i].opt.ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-        http2 = lsopt->http2 || addr[i].opt.http2;[m
[31m-#endif[m
[31m-[m
[31m-        if (lsopt->set) {[m
[31m-[m
[31m-            if (addr[i].opt.set) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "duplicate listen options for %s", addr[i].opt.addr);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            addr[i].opt = *lsopt;[m
[31m-        }[m
[31m-[m
[31m-        /* check the duplicate "default" server for this address:port */[m
[31m-[m
[31m-        if (lsopt->default_server) {[m
[31m-[m
[31m-            if (default_server) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "a duplicate default server for %s", addr[i].opt.addr);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            default_server = 1;[m
[31m-            addr[i].default_server = cscf;[m
[31m-        }[m
[31m-[m
[31m-        addr[i].opt.default_server = default_server;[m
[31m-        addr[i].opt.proxy_protocol = proxy_protocol;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        addr[i].opt.ssl = ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-        addr[i].opt.http2 = http2;[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* add the address to the addresses list that bound to this port */[m
[31m-[m
[31m-    return ngx_http_add_address(cf, cscf, port, lsopt);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * add the server address, the server names and the server core module[m
[31m- * configurations to the port list[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_address(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)[m
[31m-{[m
[31m-    ngx_http_conf_addr_t  *addr;[m
[31m-[m
[31m-    if (port->addrs.elts == NULL) {[m
[31m-        if (ngx_array_init(&port->addrs, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_conf_addr_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2 && NGX_HTTP_SSL                                              \[m
[31m-     && !defined TLSEXT_TYPE_application_layer_protocol_negotiation           \[m
[31m-     && !defined TLSEXT_TYPE_next_proto_neg)[m
[31m-[m
[31m-    if (lsopt->http2 && lsopt->ssl) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "nginx was built with OpenSSL that lacks ALPN "[m
[31m-                           "and NPN support, HTTP/2 is not enabled for %s",[m
[31m-                           lsopt->addr);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    addr = ngx_array_push(&port->addrs);[m
[31m-    if (addr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addr->opt = *lsopt;[m
[31m-    addr->hash.buckets = NULL;[m
[31m-    addr->hash.size = 0;[m
[31m-    addr->wc_head = NULL;[m
[31m-    addr->wc_tail = NULL;[m
[31m-#if (NGX_PCRE)[m
[31m-    addr->nregex = 0;[m
[31m-    addr->regex = NULL;[m
[31m-#endif[m
[31m-    addr->default_server = cscf;[m
[31m-    addr->servers.elts = NULL;[m
[31m-[m
[31m-    return ngx_http_add_server(cf, cscf, addr);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* add the server core module configuration to the address:port */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_server(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_core_srv_conf_t  **server;[m
[31m-[m
[31m-    if (addr->servers.elts == NULL) {[m
[31m-        if (ngx_array_init(&addr->servers, cf->temp_pool, 4,[m
[31m-                           sizeof(ngx_http_core_srv_conf_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        server = addr->servers.elts;[m
[31m-        for (i = 0; i < addr->servers.nelts; i++) {[m
[31m-            if (server[i] == cscf) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "a duplicate listen %s", addr->opt.addr);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    server = ngx_array_push(&addr->servers);[m
[31m-    if (server == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *server = cscf;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_optimize_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,[m
[31m-    ngx_array_t *ports)[m
[31m-{[m
[31m-    ngx_uint_t             p, a;[m
[31m-    ngx_http_conf_port_t  *port;[m
[31m-    ngx_http_conf_addr_t  *addr;[m
[31m-[m
[31m-    if (ports == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (p = 0; p < ports->nelts; p++) {[m
[31m-[m
[31m-        ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,[m
[31m-                 sizeof(ngx_http_conf_addr_t), ngx_http_cmp_conf_addrs);[m
[31m-[m
[31m-        /*[m
[31m-         * check whether all name-based servers have the same[m
[31m-         * configuration as a default server for given address:port[m
[31m-         */[m
[31m-[m
[31m-        addr = port[p].addrs.elts;[m
[31m-        for (a = 0; a < port[p].addrs.nelts; a++) {[m
[31m-[m
[31m-            if (addr[a].servers.nelts > 1[m
[31m-#if (NGX_PCRE)[m
[31m-                || addr[a].default_server->captures[m
[31m-#endif[m
[31m-               )[m
[31m-            {[m
[31m-                if (ngx_http_server_names(cf, cmcf, &addr[a]) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_init_listening(cf, &port[p]) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_server_names(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,[m
[31m-    ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  n, s;[m
[31m-    ngx_hash_init_t             hash;[m
[31m-    ngx_hash_keys_arrays_t      ha;[m
[31m-    ngx_http_server_name_t     *name;[m
[31m-    ngx_http_core_srv_conf_t  **cscfp;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                  regex, i;[m
[31m-[m
[31m-    regex = 0;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t));[m
[31m-[m
[31m-    ha.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);[m
[31m-    if (ha.temp_pool == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ha.pool = cf->pool;[m
[31m-[m
[31m-    if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cscfp = addr->servers.elts;[m
[31m-[m
[31m-    for (s = 0; s < addr->servers.nelts; s++) {[m
[31m-[m
[31m-        name = cscfp[s]->server_names.elts;[m
[31m-[m
[31m-        for (n = 0; n < cscfp[s]->server_names.nelts; n++) {[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            if (name[n].regex) {[m
[31m-                regex++;[m
[31m-                continue;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server,[m
[31m-                                  NGX_HASH_WILDCARD_KEY);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                              "invalid server name or wildcard \"%V\" on %s",[m
[31m-                              &name[n].name, addr->opt.addr);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_BUSY) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                              "conflicting server name \"%V\" on %s, ignored",[m
[31m-                              &name[n].name, addr->opt.addr);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = cmcf->server_names_hash_max_size;[m
[31m-    hash.bucket_size = cmcf->server_names_hash_bucket_size;[m
[31m-    hash.name = "server_names_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-[m
[31m-    if (ha.keys.nelts) {[m
[31m-        hash.hash = &addr->hash;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ha.dns_wc_head.nelts) {[m
[31m-[m
[31m-        ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts,[m
[31m-                  sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = ha.temp_pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts,[m
[31m-                                   ha.dns_wc_head.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        addr->wc_head = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-    if (ha.dns_wc_tail.nelts) {[m
[31m-[m
[31m-        ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts,[m
[31m-                  sizeof(ngx_hash_key_t), ngx_http_cmp_dns_wildcards);[m
[31m-[m
[31m-        hash.hash = NULL;[m
[31m-        hash.temp_pool = ha.temp_pool;[m
[31m-[m
[31m-        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts,[m
[31m-                                   ha.dns_wc_tail.nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        addr->wc_tail = (ngx_hash_wildcard_t *) hash.hash;[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(ha.temp_pool);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (regex == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    addr->nregex = regex;[m
[31m-    addr->regex = ngx_palloc(cf->pool, regex * sizeof(ngx_http_server_name_t));[m
[31m-    if (addr->regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    for (s = 0; s < addr->servers.nelts; s++) {[m
[31m-[m
[31m-        name = cscfp[s]->server_names.elts;[m
[31m-[m
[31m-        for (n = 0; n < cscfp[s]->server_names.nelts; n++) {[m
[31m-            if (name[n].regex) {[m
[31m-                addr->regex[i++] = name[n];[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_destroy_pool(ha.temp_pool);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_cmp_conf_addrs(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_http_conf_addr_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_http_conf_addr_t *) one;[m
[31m-    second = (ngx_http_conf_addr_t *) two;[m
[31m-[m
[31m-    if (first->opt.wildcard) {[m
[31m-        /* a wildcard address must be the last resort, shift it to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (second->opt.wildcard) {[m
[31m-        /* a wildcard address must be the last resort, shift it to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->opt.bind && !second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->opt.bind && second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* do not sort by default */[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_http_cmp_dns_wildcards(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_hash_key_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_hash_key_t *) one;[m
[31m-    second = (ngx_hash_key_t *) two;[m
[31m-[m
[31m-    return ngx_dns_strcmp(first->key.data, second->key.data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_port_t *port)[m
[31m-{[m
[31m-    ngx_uint_t                 i, last, bind_wildcard;[m
[31m-    ngx_listening_t           *ls;[m
[31m-    ngx_http_port_t           *hport;[m
[31m-    ngx_http_conf_addr_t      *addr;[m
[31m-[m
[31m-    addr = port->addrs.elts;[m
[31m-    last = port->addrs.nelts;[m
[31m-[m
[31m-    /*[m
[31m-     * If there is a binding to an "*:port" then we need to bind() to[m
[31m-     * the "*:port" only and ignore other implicit bindings.  The bindings[m
[31m-     * have been already sorted: explicit bindings are on the start, then[m
[31m-     * implicit bindings go, and wildcard binding is in the end.[m
[31m-     */[m
[31m-[m
[31m-    if (addr[last - 1].opt.wildcard) {[m
[31m-        addr[last - 1].opt.bind = 1;[m
[31m-        bind_wildcard = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        bind_wildcard = 0;[m
[31m-    }[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    while (i < last) {[m
[31m-[m
[31m-        if (bind_wildcard && !addr[i].opt.bind) {[m
[31m-            i++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ls = ngx_http_add_listening(cf, &addr[i]);[m
[31m-        if (ls == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hport = ngx_pcalloc(cf->pool, sizeof(ngx_http_port_t));[m
[31m-        if (hport == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ls->servers = hport;[m
[31m-[m
[31m-        hport->naddrs = i + 1;[m
[31m-[m
[31m-        switch (ls->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            if (ngx_http_add_addrs6(cf, hport, addr) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-#endif[m
[31m-        default: /* AF_INET */[m
[31m-            if (ngx_http_add_addrs(cf, hport, addr) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_clone_listening(cf, ls) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        addr++;[m
[31m-        last--;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_listening_t *[m
[31m-ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_listening_t           *ls;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ls = ngx_create_listening(cf, &addr->opt.u.sockaddr, addr->opt.socklen);[m
[31m-    if (ls == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ls->addr_ntop = 1;[m
[31m-[m
[31m-    ls->handler = ngx_http_init_connection;[m
[31m-[m
[31m-    cscf = addr->default_server;[m
[31m-    ls->pool_size = cscf->connection_pool_size;[m
[31m-    ls->post_accept_timeout = cscf->client_header_timeout;[m
[31m-[m
[31m-    clcf = cscf->ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    ls->logp = clcf->error_log;[m
[31m-    ls->log.data = &ls->addr_text;[m
[31m-    ls->log.handler = ngx_accept_log_error;[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    {[m
[31m-    ngx_iocp_conf_t  *iocpcf = NULL;[m
[31m-[m
[31m-    if (ngx_get_conf(cf->cycle->conf_ctx, ngx_events_module)) {[m
[31m-        iocpcf = ngx_event_get_conf(cf->cycle->conf_ctx, ngx_iocp_module);[m
[31m-    }[m
[31m-    if (iocpcf && iocpcf->acceptex_read) {[m
[31m-        ls->post_accept_buffer_size = cscf->client_header_buffer_size;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ls->backlog = addr->opt.backlog;[m
[31m-    ls->rcvbuf = addr->opt.rcvbuf;[m
[31m-    ls->sndbuf = addr->opt.sndbuf;[m
[31m-[m
[31m-    ls->keepalive = addr->opt.so_keepalive;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    ls->keepidle = addr->opt.tcp_keepidle;[m
[31m-    ls->keepintvl = addr->opt.tcp_keepintvl;[m
[31m-    ls->keepcnt = addr->opt.tcp_keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-    ls->accept_filter = addr->opt.accept_filter;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-    ls->deferred_accept = addr->opt.deferred_accept;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    ls->ipv6only = addr->opt.ipv6only;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    ls->setfib = addr->opt.setfib;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    ls->fastopen = addr->opt.fastopen;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    ls->reuseport = addr->opt.reuseport;[m
[31m-#endif[m
[31m-[m
[31m-    return ls;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,[m
[31m-    ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_in_addr_t        *addrs;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-    ngx_http_virtual_names_t  *vn;[m
[31m-[m
[31m-    hport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                               hport->naddrs * sizeof(ngx_http_in_addr_t));[m
[31m-    if (hport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs = hport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < hport->naddrs; i++) {[m
[31m-[m
[31m-        sin = &addr[i].opt.u.sockaddr_in;[m
[31m-        addrs[i].addr = sin->sin_addr.s_addr;[m
[31m-        addrs[i].conf.default_server = addr[i].default_server;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        addrs[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-        addrs[i].conf.http2 = addr[i].opt.http2;[m
[31m-#endif[m
[31m-        addrs[i].conf.proxy_protocol = addr[i].opt.proxy_protocol;[m
[31m-[m
[31m-        if (addr[i].hash.buckets == NULL[m
[31m-            && (addr[i].wc_head == NULL[m
[31m-                || addr[i].wc_head->hash.buckets == NULL)[m
[31m-            && (addr[i].wc_tail == NULL[m
[31m-                || addr[i].wc_tail->hash.buckets == NULL)[m
[31m-#if (NGX_PCRE)[m
[31m-            && addr[i].nregex == 0[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t));[m
[31m-        if (vn == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        addrs[i].conf.virtual_names = vn;[m
[31m-[m
[31m-        vn->names.hash = addr[i].hash;[m
[31m-        vn->names.wc_head = addr[i].wc_head;[m
[31m-        vn->names.wc_tail = addr[i].wc_tail;[m
[31m-#if (NGX_PCRE)[m
[31m-        vn->nregex = addr[i].nregex;[m
[31m-        vn->regex = addr[i].regex;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,[m
[31m-    ngx_http_conf_addr_t *addr)[m
[31m-{[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_in6_addr_t       *addrs6;[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-    ngx_http_virtual_names_t  *vn;[m
[31m-[m
[31m-    hport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                               hport->naddrs * sizeof(ngx_http_in6_addr_t));[m
[31m-    if (hport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs6 = hport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < hport->naddrs; i++) {[m
[31m-[m
[31m-        sin6 = &addr[i].opt.u.sockaddr_in6;[m
[31m-        addrs6[i].addr6 = sin6->sin6_addr;[m
[31m-        addrs6[i].conf.default_server = addr[i].default_server;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        addrs6[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-        addrs6[i].conf.http2 = addr[i].opt.http2;[m
[31m-#endif[m
[31m-        addrs6[i].conf.proxy_protocol = addr[i].opt.proxy_protocol;[m
[31m-[m
[31m-        if (addr[i].hash.buckets == NULL[m
[31m-            && (addr[i].wc_head == NULL[m
[31m-                || addr[i].wc_head->hash.buckets == NULL)[m
[31m-            && (addr[i].wc_tail == NULL[m
[31m-                || addr[i].wc_tail->hash.buckets == NULL)[m
[31m-#if (NGX_PCRE)[m
[31m-            && addr[i].nregex == 0[m
[31m-#endif[m
[31m-            )[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        vn = ngx_palloc(cf->pool, sizeof(ngx_http_virtual_names_t));[m
[31m-        if (vn == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        addrs6[i].conf.virtual_names = vn;[m
[31m-[m
[31m-        vn->names.hash = addr[i].hash;[m
[31m-        vn->names.wc_head = addr[i].wc_head;[m
[31m-        vn->names.wc_tail = addr[i].wc_tail;[m
[31m-#if (NGX_PCRE)[m
[31m-        vn->nregex = addr[i].nregex;[m
[31m-        vn->regex = addr[i].regex;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_types_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_array_t     **types;[m
[31m-    ngx_str_t        *value, *default_type;[m
[31m-    ngx_uint_t        i, n, hash;[m
[31m-    ngx_hash_key_t   *type;[m
[31m-[m
[31m-    types = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*types == (void *) -1) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    default_type = cmd->post;[m
[31m-[m
[31m-    if (*types == NULL) {[m
[31m-        *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t));[m
[31m-        if (*types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (default_type) {[m
[31m-            type = ngx_array_push(*types);[m
[31m-            if (type == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            type->key = *default_type;[m
[31m-            type->key_hash = ngx_hash_key(default_type->data,[m
[31m-                                          default_type->len);[m
[31m-            type->value = (void *) 4;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (value[i].len == 1 && value[i].data[0] == '*') {[m
[31m-            *types = (void *) -1;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len);[m
[31m-        value[i].data[value[i].len] = '\0';[m
[31m-[m
[31m-        type = (*types)->elts;[m
[31m-        for (n = 0; n < (*types)->nelts; n++) {[m
[31m-[m
[31m-            if (ngx_strcmp(value[i].data, type[n].key.data) == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                                   "duplicate MIME type \"%V\"", &value[i]);[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        type = ngx_array_push(*types);[m
[31m-        if (type == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        type->key = value[i];[m
[31m-        type->key_hash = hash;[m
[31m-        type->value = (void *) 4;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_merge_types(ngx_conf_t *cf, ngx_array_t **keys, ngx_hash_t *types_hash,[m
[31m-    ngx_array_t **prev_keys, ngx_hash_t *prev_types_hash,[m
[31m-    ngx_str_t *default_types)[m
[31m-{[m
[31m-    ngx_hash_init_t  hash;[m
[31m-[m
[31m-    if (*keys) {[m
[31m-[m
[31m-        if (*keys == (void *) -1) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        hash.hash = types_hash;[m
[31m-        hash.key = NULL;[m
[31m-        hash.max_size = 2048;[m
[31m-        hash.bucket_size = 64;[m
[31m-        hash.name = "test_types_hash";[m
[31m-        hash.pool = cf->pool;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, (*keys)->elts, (*keys)->nelts) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (prev_types_hash->buckets == NULL) {[m
[31m-[m
[31m-        if (*prev_keys == NULL) {[m
[31m-[m
[31m-            if (ngx_http_set_default_types(cf, prev_keys, default_types)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else if (*prev_keys == (void *) -1) {[m
[31m-            *keys = *prev_keys;[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        hash.hash = prev_types_hash;[m
[31m-        hash.key = NULL;[m
[31m-        hash.max_size = 2048;[m
[31m-        hash.bucket_size = 64;[m
[31m-        hash.name = "test_types_hash";[m
[31m-        hash.pool = cf->pool;[m
[31m-        hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&hash, (*prev_keys)->elts, (*prev_keys)->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *types_hash = *prev_types_hash;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_default_types(ngx_conf_t *cf, ngx_array_t **types,[m
[31m-    ngx_str_t *default_type)[m
[31m-{[m
[31m-    ngx_hash_key_t  *type;[m
[31m-[m
[31m-    *types = ngx_array_create(cf->temp_pool, 1, sizeof(ngx_hash_key_t));[m
[31m-    if (*types == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    while (default_type->len) {[m
[31m-[m
[31m-        type = ngx_array_push(*types);[m
[31m-        if (type == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        type->key = *default_type;[m
[31m-        type->key_hash = ngx_hash_key(default_type->data,[m
[31m-                                      default_type->len);[m
[31m-        type->value = (void *) 4;[m
[31m-[m
[31m-        default_type++;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http.h[m
[1mdeleted file mode 100644[m
[1mindex 19cb680..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http.h[m
[1m+++ /dev/null[m
[36m@@ -1,179 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_H_INCLUDED_[m
[31m-#define _NGX_HTTP_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_request_s     ngx_http_request_t;[m
[31m-typedef struct ngx_http_upstream_s    ngx_http_upstream_t;[m
[31m-typedef struct ngx_http_cache_s       ngx_http_cache_t;[m
[31m-typedef struct ngx_http_file_cache_s  ngx_http_file_cache_t;[m
[31m-typedef struct ngx_http_log_ctx_s     ngx_http_log_ctx_t;[m
[31m-typedef struct ngx_http_chunked_s     ngx_http_chunked_t;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-typedef struct ngx_http_v2_stream_s   ngx_http_v2_stream_t;[m
[31m-#endif[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_header_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-typedef u_char *(*ngx_http_log_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_request_t *sr, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-#include <ngx_http_variables.h>[m
[31m-#include <ngx_http_config.h>[m
[31m-#include <ngx_http_request.h>[m
[31m-#include <ngx_http_script.h>[m
[31m-#include <ngx_http_upstream.h>[m
[31m-#include <ngx_http_upstream_round_robin.h>[m
[31m-#include <ngx_http_core_module.h>[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-#include <ngx_http_v2.h>[m
[31m-#endif[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-#include <ngx_http_cache.h>[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSI)[m
[31m-#include <ngx_http_ssi_filter_module.h>[m
[31m-#endif[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-#include <ngx_http_ssl_module.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-struct ngx_http_log_ctx_s {[m
[31m-    ngx_connection_t    *connection;[m
[31m-    ngx_http_request_t  *request;[m
[31m-    ngx_http_request_t  *current_request;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_chunked_s {[m
[31m-    ngx_uint_t           state;[m
[31m-    off_t                size;[m
[31m-    off_t                length;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t           http_version;[m
[31m-    ngx_uint_t           code;[m
[31m-    ngx_uint_t           count;[m
[31m-    u_char              *start;[m
[31m-    u_char              *end;[m
[31m-} ngx_http_status_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_http_get_module_ctx(r, module)  (r)->ctx[module.ctx_index][m
[31m-#define ngx_http_set_ctx(r, c, module)      r->ctx[module.ctx_index] = c;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,[m
[31m-    ngx_http_core_loc_conf_t *clcf);[m
[31m-ngx_int_t ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,[m
[31m-    ngx_http_listen_opt_t *lsopt);[m
[31m-[m
[31m-[m
[31m-void ngx_http_init_connection(ngx_connection_t *c);[m
[31m-void ngx_http_close_connection(ngx_connection_t *c);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-int ngx_http_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg);[m
[31m-#endif[m
[31m-[m
[31m-ngx_int_t ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b);[m
[31m-ngx_int_t ngx_http_parse_uri(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_parse_complex_uri(ngx_http_request_t *r,[m
[31m-    ngx_uint_t merge_slashes);[m
[31m-ngx_int_t ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_status_t *status);[m
[31m-ngx_int_t ngx_http_parse_unsafe_uri(ngx_http_request_t *r, ngx_str_t *uri,[m
[31m-    ngx_str_t *args, ngx_uint_t *flags);[m
[31m-ngx_int_t ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_uint_t allow_underscores);[m
[31m-ngx_int_t ngx_http_parse_multi_header_lines(ngx_array_t *headers,[m
[31m-    ngx_str_t *name, ngx_str_t *value);[m
[31m-ngx_int_t ngx_http_parse_set_cookie_lines(ngx_array_t *headers,[m
[31m-    ngx_str_t *name, ngx_str_t *value);[m
[31m-ngx_int_t ngx_http_arg(ngx_http_request_t *r, u_char *name, size_t len,[m
[31m-    ngx_str_t *value);[m
[31m-void ngx_http_split_args(ngx_http_request_t *r, ngx_str_t *uri,[m
[31m-    ngx_str_t *args);[m
[31m-ngx_int_t ngx_http_parse_chunked(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_chunked_t *ctx);[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *ngx_http_create_request(ngx_connection_t *c);[m
[31m-ngx_int_t ngx_http_process_request_uri(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_process_request_header(ngx_http_request_t *r);[m
[31m-void ngx_http_process_request(ngx_http_request_t *r);[m
[31m-void ngx_http_update_location_config(ngx_http_request_t *r);[m
[31m-void ngx_http_handler(ngx_http_request_t *r);[m
[31m-void ngx_http_run_posted_requests(ngx_connection_t *c);[m
[31m-ngx_int_t ngx_http_post_request(ngx_http_request_t *r,[m
[31m-    ngx_http_posted_request_t *pr);[m
[31m-void ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-void ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-[m
[31m-void ngx_http_empty_handler(ngx_event_t *wev);[m
[31m-void ngx_http_request_empty_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LAST   1[m
[31m-#define NGX_HTTP_FLUSH  2[m
[31m-[m
[31m-ngx_int_t ngx_http_send_special(ngx_http_request_t *r, ngx_uint_t flags);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_read_client_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler);[m
[31m-ngx_int_t ngx_http_read_unbuffered_request_body(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_send_header(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_special_response_handler(ngx_http_request_t *r,[m
[31m-    ngx_int_t error);[m
[31m-ngx_int_t ngx_http_filter_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_module_t *m, ngx_int_t error);[m
[31m-void ngx_http_clean_header(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_discard_request_body(ngx_http_request_t *r);[m
[31m-void ngx_http_discarded_request_body_handler(ngx_http_request_t *r);[m
[31m-void ngx_http_block_reading(ngx_http_request_t *r);[m
[31m-void ngx_http_test_reading(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-char *ngx_http_types_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_merge_types(ngx_conf_t *cf, ngx_array_t **keys,[m
[31m-    ngx_hash_t *types_hash, ngx_array_t **prev_keys,[m
[31m-    ngx_hash_t *prev_types_hash, ngx_str_t *default_types);[m
[31m-ngx_int_t ngx_http_set_default_types(ngx_conf_t *cf, ngx_array_t **types,[m
[31m-    ngx_str_t *default_type);[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-ngx_uint_t  ngx_http_degraded(ngx_http_request_t *);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_module;[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_html_default_types[];[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt  ngx_http_top_header_filter;[m
[31m-extern ngx_http_output_body_filter_pt    ngx_http_top_body_filter;[m
[31m-extern ngx_http_request_body_filter_pt   ngx_http_top_request_body_filter;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_cache.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_cache.h[m
[1mdeleted file mode 100644[m
[1mindex 2667cbb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_cache.h[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_CACHE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_CACHE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_CACHE_MISS          1[m
[31m-#define NGX_HTTP_CACHE_BYPASS        2[m
[31m-#define NGX_HTTP_CACHE_EXPIRED       3[m
[31m-#define NGX_HTTP_CACHE_STALE         4[m
[31m-#define NGX_HTTP_CACHE_UPDATING      5[m
[31m-#define NGX_HTTP_CACHE_REVALIDATED   6[m
[31m-#define NGX_HTTP_CACHE_HIT           7[m
[31m-#define NGX_HTTP_CACHE_SCARCE        8[m
[31m-[m
[31m-#define NGX_HTTP_CACHE_KEY_LEN       16[m
[31m-#define NGX_HTTP_CACHE_ETAG_LEN      42[m
[31m-#define NGX_HTTP_CACHE_VARY_LEN      42[m
[31m-[m
[31m-#define NGX_HTTP_CACHE_VERSION       3[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                       status;[m
[31m-    time_t                           valid;[m
[31m-} ngx_http_cache_valid_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_node_t                node;[m
[31m-    ngx_queue_t                      queue;[m
[31m-[m
[31m-    u_char                           key[NGX_HTTP_CACHE_KEY_LEN[m
[31m-                                         - sizeof(ngx_rbtree_key_t)];[m
[31m-[m
[31m-    unsigned                         count:20;[m
[31m-    unsigned                         uses:10;[m
[31m-    unsigned                         valid_msec:10;[m
[31m-    unsigned                         error:10;[m
[31m-    unsigned                         exists:1;[m
[31m-    unsigned                         updating:1;[m
[31m-    unsigned                         deleting:1;[m
[31m-                                     /* 11 unused bits */[m
[31m-[m
[31m-    ngx_file_uniq_t                  uniq;[m
[31m-    time_t                           expire;[m
[31m-    time_t                           valid_sec;[m
[31m-    size_t                           body_start;[m
[31m-    off_t                            fs_size;[m
[31m-    ngx_msec_t                       lock_time;[m
[31m-} ngx_http_file_cache_node_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_cache_s {[m
[31m-    ngx_file_t                       file;[m
[31m-    ngx_array_t                      keys;[m
[31m-    uint32_t                         crc32;[m
[31m-    u_char                           key[NGX_HTTP_CACHE_KEY_LEN];[m
[31m-    u_char                           main[NGX_HTTP_CACHE_KEY_LEN];[m
[31m-[m
[31m-    ngx_file_uniq_t                  uniq;[m
[31m-    time_t                           valid_sec;[m
[31m-    time_t                           last_modified;[m
[31m-    time_t                           date;[m
[31m-[m
[31m-    ngx_str_t                        etag;[m
[31m-    ngx_str_t                        vary;[m
[31m-    u_char                           variant[NGX_HTTP_CACHE_KEY_LEN];[m
[31m-[m
[31m-    size_t                           header_start;[m
[31m-    size_t                           body_start;[m
[31m-    off_t                            length;[m
[31m-    off_t                            fs_size;[m
[31m-[m
[31m-    ngx_uint_t                       min_uses;[m
[31m-    ngx_uint_t                       error;[m
[31m-    ngx_uint_t                       valid_msec;[m
[31m-[m
[31m-    ngx_buf_t                       *buf;[m
[31m-[m
[31m-    ngx_http_file_cache_t           *file_cache;[m
[31m-    ngx_http_file_cache_node_t      *node;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_thread_task_t               *thread_task;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_msec_t                       lock_timeout;[m
[31m-    ngx_msec_t                       lock_age;[m
[31m-    ngx_msec_t                       lock_time;[m
[31m-    ngx_msec_t                       wait_time;[m
[31m-[m
[31m-    ngx_event_t                      wait_event;[m
[31m-[m
[31m-    unsigned                         lock:1;[m
[31m-    unsigned                         waiting:1;[m
[31m-[m
[31m-    unsigned                         updated:1;[m
[31m-    unsigned                         updating:1;[m
[31m-    unsigned                         exists:1;[m
[31m-    unsigned                         temp_file:1;[m
[31m-    unsigned                         reading:1;[m
[31m-    unsigned                         secondary:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                       version;[m
[31m-    time_t                           valid_sec;[m
[31m-    time_t                           last_modified;[m
[31m-    time_t                           date;[m
[31m-    uint32_t                         crc32;[m
[31m-    u_short                          valid_msec;[m
[31m-    u_short                          header_start;[m
[31m-    u_short                          body_start;[m
[31m-    u_char                           etag_len;[m
[31m-    u_char                           etag[NGX_HTTP_CACHE_ETAG_LEN];[m
[31m-    u_char                           vary_len;[m
[31m-    u_char                           vary[NGX_HTTP_CACHE_VARY_LEN];[m
[31m-    u_char                           variant[NGX_HTTP_CACHE_KEY_LEN];[m
[31m-} ngx_http_file_cache_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t                     rbtree;[m
[31m-    ngx_rbtree_node_t                sentinel;[m
[31m-    ngx_queue_t                      queue;[m
[31m-    ngx_atomic_t                     cold;[m
[31m-    ngx_atomic_t                     loading;[m
[31m-    off_t                            size;[m
[31m-    ngx_uint_t                       count;[m
[31m-    ngx_uint_t                       watermark;[m
[31m-} ngx_http_file_cache_sh_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_file_cache_s {[m
[31m-    ngx_http_file_cache_sh_t        *sh;[m
[31m-    ngx_slab_pool_t                 *shpool;[m
[31m-[m
[31m-    ngx_path_t                      *path;[m
[31m-    ngx_path_t                      *temp_path;[m
[31m-[m
[31m-    off_t                            max_size;[m
[31m-    size_t                           bsize;[m
[31m-[m
[31m-    time_t                           inactive;[m
[31m-[m
[31m-    time_t                           fail_time;[m
[31m-[m
[31m-    ngx_uint_t                       files;[m
[31m-    ngx_uint_t                       loader_files;[m
[31m-    ngx_msec_t                       last;[m
[31m-    ngx_msec_t                       loader_sleep;[m
[31m-    ngx_msec_t                       loader_threshold;[m
[31m-[m
[31m-    ngx_shm_zone_t                  *shm_zone;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_file_cache_new(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_file_cache_create(ngx_http_request_t *r);[m
[31m-void ngx_http_file_cache_create_key(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_file_cache_open(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf);[m
[31m-void ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf);[m
[31m-void ngx_http_file_cache_update_header(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_cache_send(ngx_http_request_t *);[m
[31m-void ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf);[m
[31m-time_t ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status);[m
[31m-[m
[31m-char *ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_cache_status[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_config.h[m
[1mdeleted file mode 100644[m
[1mindex 2208c60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_HTTP_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void        **main_conf;[m
[31m-    void        **srv_conf;[m
[31m-    void        **loc_conf;[m
[31m-} ngx_http_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t   (*preconfiguration)(ngx_conf_t *cf);[m
[31m-    ngx_int_t   (*postconfiguration)(ngx_conf_t *cf);[m
[31m-[m
[31m-    void       *(*create_main_conf)(ngx_conf_t *cf);[m
[31m-    char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-    void       *(*create_srv_conf)(ngx_conf_t *cf);[m
[31m-    char       *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);[m
[31m-[m
[31m-    void       *(*create_loc_conf)(ngx_conf_t *cf);[m
[31m-    char       *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);[m
[31m-} ngx_http_module_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MODULE           0x50545448   /* "HTTP" */[m
[31m-[m
[31m-#define NGX_HTTP_MAIN_CONF        0x02000000[m
[31m-#define NGX_HTTP_SRV_CONF         0x04000000[m
[31m-#define NGX_HTTP_LOC_CONF         0x08000000[m
[31m-#define NGX_HTTP_UPS_CONF         0x10000000[m
[31m-#define NGX_HTTP_SIF_CONF         0x20000000[m
[31m-#define NGX_HTTP_LIF_CONF         0x40000000[m
[31m-#define NGX_HTTP_LMT_CONF         0x80000000[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MAIN_CONF_OFFSET  offsetof(ngx_http_conf_ctx_t, main_conf)[m
[31m-#define NGX_HTTP_SRV_CONF_OFFSET   offsetof(ngx_http_conf_ctx_t, srv_conf)[m
[31m-#define NGX_HTTP_LOC_CONF_OFFSET   offsetof(ngx_http_conf_ctx_t, loc_conf)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_get_module_main_conf(r, module)                             \[m
[31m-    (r)->main_conf[module.ctx_index][m
[31m-#define ngx_http_get_module_srv_conf(r, module)  (r)->srv_conf[module.ctx_index][m
[31m-#define ngx_http_get_module_loc_conf(r, module)  (r)->loc_conf[module.ctx_index][m
[31m-[m
[31m-[m
[31m-#define ngx_http_conf_get_module_main_conf(cf, module)                        \[m
[31m-    ((ngx_http_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index][m
[31m-#define ngx_http_conf_get_module_srv_conf(cf, module)                         \[m
[31m-    ((ngx_http_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index][m
[31m-#define ngx_http_conf_get_module_loc_conf(cf, module)                         \[m
[31m-    ((ngx_http_conf_ctx_t *) cf->ctx)->loc_conf[module.ctx_index][m
[31m-[m
[31m-#define ngx_http_cycle_get_module_main_conf(cycle, module)                    \[m
[31m-    (cycle->conf_ctx[ngx_http_module.index] ?                                 \[m
[31m-        ((ngx_http_conf_ctx_t *) cycle->conf_ctx[ngx_http_module.index])      \[m
[31m-            ->main_conf[module.ctx_index]:                                    \[m
[31m-        NULL)[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_copy_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_copy_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex c696fb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_copy_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,352 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_bufs_t  bufs;[m
[31m-} ngx_http_copy_filter_conf_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-static void ngx_http_copy_aio_handler(ngx_output_chain_ctx_t *ctx,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_copy_aio_event_handler(ngx_event_t *ev);[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-static ssize_t ngx_http_copy_aio_sendfile_preload(ngx_buf_t *file);[m
[31m-static void ngx_http_copy_aio_sendfile_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-static ngx_int_t ngx_http_copy_thread_handler(ngx_thread_task_t *task,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_copy_thread_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-[m
[31m-static void *ngx_http_copy_filter_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_copy_filter_merge_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_http_copy_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_copy_filter_commands[] = {[m
[31m-[m
[31m-    { ngx_string("output_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_copy_filter_conf_t, bufs),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_copy_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_copy_filter_init,             /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_copy_filter_create_conf,      /* create location configuration */[m
[31m-    ngx_http_copy_filter_merge_conf        /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_copy_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_copy_filter_module_ctx,      /* module context */[m
[31m-    ngx_http_copy_filter_commands,         /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_connection_t             *c;[m
[31m-    ngx_output_chain_ctx_t       *ctx;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_copy_filter_conf_t  *conf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http copy filter: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_copy_filter_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_pcalloc(r->pool, sizeof(ngx_output_chain_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_copy_filter_module);[m
[31m-[m
[31m-        conf = ngx_http_get_module_loc_conf(r, ngx_http_copy_filter_module);[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ctx->sendfile = c->sendfile;[m
[31m-        ctx->need_in_memory = r->main_filter_need_in_memory[m
[31m-                              || r->filter_need_in_memory;[m
[31m-        ctx->need_in_temp = r->filter_need_temporary;[m
[31m-[m
[31m-        ctx->alignment = clcf->directio_alignment;[m
[31m-[m
[31m-        ctx->pool = r->pool;[m
[31m-        ctx->bufs = conf->bufs;[m
[31m-        ctx->tag = (ngx_buf_tag_t) &ngx_http_copy_filter_module;[m
[31m-[m
[31m-        ctx->output_filter = (ngx_output_chain_filter_pt)[m
[31m-                                  ngx_http_next_body_filter;[m
[31m-        ctx->filter_ctx = r;[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-        if (ngx_file_aio && clcf->aio == NGX_HTTP_AIO_ON) {[m
[31m-            ctx->aio_handler = ngx_http_copy_aio_handler;[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-            ctx->aio_preload = ngx_http_copy_aio_sendfile_preload;[m
[31m-#endif[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-        if (clcf->aio == NGX_HTTP_AIO_THREADS) {[m
[31m-            ctx->thread_handler = ngx_http_copy_thread_handler;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (in && in->buf && ngx_buf_size(in->buf)) {[m
[31m-            r->request_output = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    ctx->aio = r->aio;[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_output_chain(ctx, in);[m
[31m-[m
[31m-    if (ctx->in == NULL) {[m
[31m-        r->buffered &= ~NGX_HTTP_COPY_BUFFERED;[m
[31m-[m
[31m-    } else {[m
[31m-        r->buffered |= NGX_HTTP_COPY_BUFFERED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http copy filter: %i \"%V?%V\"", rc, &r->uri, &r->args);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_copy_aio_handler(ngx_output_chain_ctx_t *ctx, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_http_request_t *r;[m
[31m-[m
[31m-    r = ctx->filter_ctx;[m
[31m-[m
[31m-    file->aio->data = r;[m
[31m-    file->aio->handler = ngx_http_copy_aio_event_handler;[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-    ctx->aio = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_copy_aio_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t     *aio;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-    r = aio->data;[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->connection->write->handler(r->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_copy_aio_sendfile_preload(ngx_buf_t *file)[m
[31m-{[m
[31m-    ssize_t                  n;[m
[31m-    static u_char            buf[1];[m
[31m-    ngx_event_aio_t         *aio;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_output_chain_ctx_t  *ctx;[m
[31m-[m
[31m-    n = ngx_file_aio_read(file->file, buf, 1, file->file_pos, NULL);[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        aio = file->file->aio;[m
[31m-        aio->handler = ngx_http_copy_aio_sendfile_event_handler;[m
[31m-[m
[31m-        r = aio->data;[m
[31m-        r->main->blocked++;[m
[31m-        r->aio = 1;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_copy_filter_module);[m
[31m-        ctx->aio = 1;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_copy_aio_sendfile_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t     *aio;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-    r = aio->data;[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-    ev->complete = 0;[m
[31m-[m
[31m-    r->connection->write->handler(r->connection->write);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_copy_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_thread_pool_t         *tp;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_output_chain_ctx_t    *ctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r = file->thread_ctx;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    tp = clcf->thread_pool;[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "thread pool \"%V\" not found", &name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    task->event.data = r;[m
[31m-    task->event.handler = ngx_http_copy_thread_event_handler;[m
[31m-[m
[31m-    if (ngx_thread_task_post(tp, task) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_copy_filter_module);[m
[31m-    ctx->aio = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_copy_thread_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->connection->write->handler(r->connection->write);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_copy_filter_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_copy_filter_conf_t *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_http_copy_filter_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->bufs.num = 0;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_copy_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_copy_filter_conf_t *prev = parent;[m
[31m-    ngx_http_copy_filter_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, 2, 32768);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_copy_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_copy_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.c[m
[1mdeleted file mode 100644[m
[1mindex 649ca40..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,5440 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    *name;[m
[31m-    uint32_t   method;[m
[31m-} ngx_http_method_name_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_OFF    0[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_ON     1[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_CLEAN  2[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_core_find_static_location(ngx_http_request_t *r,[m
[31m-    ngx_http_location_tree_node_t *node);[m
[31m-[m
[31m-static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_core_postconfiguration(ngx_conf_t *cf);[m
[31m-static void *ngx_http_core_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_core_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_merge_srv_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static void *ngx_http_core_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static char *ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static ngx_int_t ngx_http_core_regex_location(ngx_conf_t *cf,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *regex, ngx_uint_t caseless);[m
[31m-[m
[31m-static char *ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_core_limit_except(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_set_aio(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_internal(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae);[m
[31m-static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last);[m
[31m-static char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r,[m
[31m-    ngx_addr_t *addr, u_char *xff, size_t xfflen, ngx_array_t *proxies,[m
[31m-    int recursive);[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-static char *ngx_http_disable_symlinks(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_core_pool_size(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_core_lowat_post =[m
[31m-    { ngx_http_core_lowat_check };[m
[31m-[m
[31m-static ngx_conf_post_handler_pt  ngx_http_core_pool_size_p =[m
[31m-    ngx_http_core_pool_size;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_request_body_in_file[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_REQUEST_BODY_FILE_ON },[m
[31m-    { ngx_string("clean"), NGX_HTTP_REQUEST_BODY_FILE_CLEAN },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_satisfy[] = {[m
[31m-    { ngx_string("all"), NGX_HTTP_SATISFY_ALL },[m
[31m-    { ngx_string("any"), NGX_HTTP_SATISFY_ANY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_lingering_close[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_LINGERING_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_LINGERING_ON },[m
[31m-    { ngx_string("always"), NGX_HTTP_LINGERING_ALWAYS },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_if_modified_since[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_IMS_OFF },[m
[31m-    { ngx_string("exact"), NGX_HTTP_IMS_EXACT },[m
[31m-    { ngx_string("before"), NGX_HTTP_IMS_BEFORE },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_core_keepalive_disable[] = {[m
[31m-    { ngx_string("none"), NGX_HTTP_KEEPALIVE_DISABLE_NONE },[m
[31m-    { ngx_string("msie6"), NGX_HTTP_KEEPALIVE_DISABLE_MSIE6 },[m
[31m-    { ngx_string("safari"), NGX_HTTP_KEEPALIVE_DISABLE_SAFARI },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_client_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_CLIENT_TEMP_PATH), { 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_gzip_http_version[] = {[m
[31m-    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },[m
[31m-    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_gzip_proxied_mask[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_GZIP_PROXIED_OFF },[m
[31m-    { ngx_string("expired"), NGX_HTTP_GZIP_PROXIED_EXPIRED },[m
[31m-    { ngx_string("no-cache"), NGX_HTTP_GZIP_PROXIED_NO_CACHE },[m
[31m-    { ngx_string("no-store"), NGX_HTTP_GZIP_PROXIED_NO_STORE },[m
[31m-    { ngx_string("private"), NGX_HTTP_GZIP_PROXIED_PRIVATE },[m
[31m-    { ngx_string("no_last_modified"), NGX_HTTP_GZIP_PROXIED_NO_LM },[m
[31m-    { ngx_string("no_etag"), NGX_HTTP_GZIP_PROXIED_NO_ETAG },[m
[31m-    { ngx_string("auth"), NGX_HTTP_GZIP_PROXIED_AUTH },[m
[31m-    { ngx_string("any"), NGX_HTTP_GZIP_PROXIED_ANY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_gzip_no_cache = ngx_string("no-cache");[m
[31m-static ngx_str_t  ngx_http_gzip_no_store = ngx_string("no-store");[m
[31m-static ngx_str_t  ngx_http_gzip_private = ngx_string("private");[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("variables_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, variables_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("variables_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, variables_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_names_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, server_names_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_names_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, server_names_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_server,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("connection_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, connection_pool_size),[m
[31m-      &ngx_http_core_pool_size_p },[m
[31m-[m
[31m-    { ngx_string("request_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, request_pool_size),[m
[31m-      &ngx_http_core_pool_size_p },[m
[31m-[m
[31m-    { ngx_string("client_header_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, client_header_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_header_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, client_header_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("large_client_header_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, large_client_header_buffers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ignore_invalid_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, ignore_invalid_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("merge_slashes"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, merge_slashes),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("underscores_in_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, underscores_in_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("location"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_location,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("listen"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_listen,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_server_name,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, types_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, types_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                                          |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_types,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("default_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, default_type),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("root"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("alias"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_except"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_limit_except,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_max_body_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_max_body_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_in_file_only"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_in_file_only),[m
[31m-      &ngx_http_core_request_body_in_file },[m
[31m-[m
[31m-    { ngx_string("client_body_in_single_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_in_single_buffer),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sendfile"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, sendfile),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sendfile_max_chunk"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, sendfile_max_chunk),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("aio"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_set_aio,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("aio_write"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, aio_write),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("read_ahead"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, read_ahead),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("directio"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_directio,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("directio_alignment"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, directio_alignment),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nopush"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, tcp_nopush),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nodelay"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, tcp_nodelay),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, send_lowat),[m
[31m-      &ngx_http_core_lowat_post },[m
[31m-[m
[31m-    { ngx_string("postpone_output"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, postpone_output),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_rate_after"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, limit_rate_after),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_keepalive,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_requests"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, keepalive_requests),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_disable"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, keepalive_disable),[m
[31m-      &ngx_http_core_keepalive_disable },[m
[31m-[m
[31m-    { ngx_string("satisfy"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, satisfy),[m
[31m-      &ngx_http_core_satisfy },[m
[31m-[m
[31m-    { ngx_string("internal"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_internal,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lingering_close"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_close),[m
[31m-      &ngx_http_core_lingering_close },[m
[31m-[m
[31m-    { ngx_string("lingering_time"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_time),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lingering_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("reset_timedout_connection"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, reset_timedout_connection),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name_in_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, server_name_in_redirect),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("port_in_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, port_in_redirect),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("msie_padding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, msie_padding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("msie_refresh"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, msie_refresh),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_not_found"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, log_not_found),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_subrequest"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, log_subrequest),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("recursive_error_pages"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, recursive_error_pages),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_tokens"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, server_tokens),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("if_modified_since"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, if_modified_since),[m
[31m-      &ngx_http_core_if_modified_since },[m
[31m-[m
[31m-    { ngx_string("max_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, max_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("chunked_transfer_encoding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, chunked_transfer_encoding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("etag"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, etag),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_page"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_2MORE,[m
[31m-      ngx_http_core_error_page,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("no_error_pages"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_no_error_pages,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("try_files"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_core_try_files,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("post_action"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, post_action),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_error_log,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_open_file_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_events"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_events),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_resolver,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, resolver_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-    { ngx_string("gzip_vary"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_vary),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_http_version"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_http_version),[m
[31m-      &ngx_http_gzip_http_version },[m
[31m-[m
[31m-    { ngx_string("gzip_proxied"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_proxied),[m
[31m-      &ngx_http_gzip_proxied_mask },[m
[31m-[m
[31m-    { ngx_string("gzip_disable"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_gzip_disable,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-    { ngx_string("disable_symlinks"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_disable_symlinks,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_core_module_ctx = {[m
[31m-    ngx_http_core_preconfiguration,        /* preconfiguration */[m
[31m-    ngx_http_core_postconfiguration,       /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_core_create_main_conf,        /* create main configuration */[m
[31m-    ngx_http_core_init_main_conf,          /* init main configuration */[m
[31m-[m
[31m-    ngx_http_core_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_http_core_merge_srv_conf,          /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_core_create_loc_conf,         /* create location configuration */[m
[31m-    ngx_http_core_merge_loc_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_core_module_ctx,             /* module context */[m
[31m-    ngx_http_core_commands,                /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_core_get_method = { 3, (u_char *) "GET" };[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    r->connection->log->action = NULL;[m
[31m-[m
[31m-    r->connection->unexpected_eof = 0;[m
[31m-[m
[31m-    if (!r->internal) {[m
[31m-        switch (r->headers_in.connection_type) {[m
[31m-        case 0:[m
[31m-            r->keepalive = (r->http_version > NGX_HTTP_VERSION_10);[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_CONNECTION_CLOSE:[m
[31m-            r->keepalive = 0;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_CONNECTION_KEEP_ALIVE:[m
[31m-            r->keepalive = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        r->lingering_close = (r->headers_in.content_length_n > 0[m
[31m-                              || r->headers_in.chunked);[m
[31m-        r->phase_handler = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-        r->phase_handler = cmcf->phase_engine.server_rewrite_index;[m
[31m-    }[m
[31m-[m
[31m-    r->valid_location = 1;[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    r->gzip_tested = 0;[m
[31m-    r->gzip_ok = 0;[m
[31m-    r->gzip_vary = 0;[m
[31m-#endif[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    ngx_http_core_run_phases(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_core_run_phases(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_phase_handler_t   *ph;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ph = cmcf->phase_engine.handlers;[m
[31m-[m
[31m-    while (ph[r->phase_handler].checker) {[m
[31m-[m
[31m-        rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_generic_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    /*[m
[31m-     * generic phase checker,[m
[31m-     * used by the post read and pre-access phases[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "generic phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->phase_handler = ph->next;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_rewrite_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rewrite phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* NGX_OK, NGX_AGAIN, NGX_ERROR, NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_find_config_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     len;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->content_handler = NULL;[m
[31m-    r->uri_changed = 0;[m
[31m-[m
[31m-    rc = ngx_http_core_find_location(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->internal && clcf->internal) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "using configuration \"%s%V\"",[m
[31m-                   (clcf->noname ? "*" : (clcf->exact_match ? "=" : "")),[m
[31m-                   &clcf->name);[m
[31m-[m
[31m-    ngx_http_update_location_config(r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http cl:%O max:%O",[m
[31m-                   r->headers_in.content_length_n, clcf->client_max_body_size);[m
[31m-[m
[31m-    if (r->headers_in.content_length_n != -1[m
[31m-        && !r->discard_body[m
[31m-        && clcf->client_max_body_size[m
[31m-        && clcf->client_max_body_size < r->headers_in.content_length_n)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client intended to send too large body: %O bytes",[m
[31m-                      r->headers_in.content_length_n);[m
[31m-[m
[31m-        r->expect_tested = 1;[m
[31m-        (void) ngx_http_discard_request_body(r);[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_ENTITY_TOO_LARGE);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not need to set the r->headers_out.location->hash and[m
[31m-         * r->headers_out.location->key fields[m
[31m-         */[m
[31m-[m
[31m-        if (r->args.len == 0) {[m
[31m-            r->headers_out.location->value = clcf->name;[m
[31m-[m
[31m-        } else {[m
[31m-            len = clcf->name.len + 1 + r->args.len;[m
[31m-            p = ngx_pnalloc(r->pool, len);[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            r->headers_out.location->value.len = len;[m
[31m-            r->headers_out.location->value.data = p;[m
[31m-[m
[31m-            p = ngx_cpymem(p, clcf->name.data, clcf->name.len);[m
[31m-            *p++ = '?';[m
[31m-            ngx_memcpy(p, r->args.data, r->args.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_MOVED_PERMANENTLY);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler++;[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_post_rewrite_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post rewrite phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    if (!r->uri_changed) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uri changes: %d", r->uri_changes);[m
[31m-[m
[31m-    /*[m
[31m-     * gcc before 3.3 compiles the broken code for[m
[31m-     *     if (r->uri_changes-- == 0)[m
[31m-     * if the r->uri_changes is defined as[m
[31m-     *     unsigned  uri_changes:4[m
[31m-     */[m
[31m-[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while processing \"%V\"", &r->uri);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler = ph->next;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_access_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        r->phase_handler = ph->next;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "access phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) {[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->phase_handler++;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->access_code = 0;[m
[31m-[m
[31m-            if (r->headers_out.www_authenticate) {[m
[31m-                r->headers_out.www_authenticate->hash = 0;[m
[31m-            }[m
[31m-[m
[31m-            r->phase_handler = ph->next;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_FORBIDDEN || rc == NGX_HTTP_UNAUTHORIZED) {[m
[31m-            if (r->access_code != NGX_HTTP_UNAUTHORIZED) {[m
[31m-                r->access_code = rc;[m
[31m-            }[m
[31m-[m
[31m-            r->phase_handler++;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_post_access_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  access_code;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post access phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    access_code = r->access_code;[m
[31m-[m
[31m-    if (access_code) {[m
[31m-        if (access_code == NGX_HTTP_FORBIDDEN) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "access forbidden by rule");[m
[31m-        }[m
[31m-[m
[31m-        r->access_code = 0;[m
[31m-        ngx_http_finalize_request(r, access_code);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler++;[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_try_files_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    size_t                        len, root, alias, reserve, allocated;[m
[31m-    u_char                       *p, *name;[m
[31m-    ngx_str_t                     path, args;[m
[31m-    ngx_uint_t                    test_dir;[m
[31m-    ngx_http_try_file_t          *tf;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "try files phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->try_files == NULL) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    allocated = 0;[m
[31m-    root = 0;[m
[31m-    name = NULL;[m
[31m-    /* suppress MSVC warning */[m
[31m-    path.data = NULL;[m
[31m-[m
[31m-    tf = clcf->try_files;[m
[31m-[m
[31m-    alias = clcf->alias;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (tf->lengths) {[m
[31m-            ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-            e.ip = tf->lengths->elts;[m
[31m-            e.request = r;[m
[31m-[m
[31m-            /* 1 is for terminating '\0' as in static names */[m
[31m-            len = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-                len += lcode(&e);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            len = tf->name.len;[m
[31m-        }[m
[31m-[m
[31m-        if (!alias) {[m
[31m-            reserve = len > r->uri.len ? len - r->uri.len : 0;[m
[31m-[m
[31m-        } else if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            reserve = len;[m
[31m-[m
[31m-        } else {[m
[31m-            reserve = len > r->uri.len - alias ? len - (r->uri.len - alias) : 0;[m
[31m-        }[m
[31m-[m
[31m-        if (reserve > allocated || !allocated) {[m
[31m-[m
[31m-            /* 16 bytes are preallocation */[m
[31m-            allocated = reserve + 16;[m
[31m-[m
[31m-            if (ngx_http_map_uri_to_path(r, &path, &root, allocated) == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            name = path.data + root;[m
[31m-        }[m
[31m-[m
[31m-        if (tf->values == NULL) {[m
[31m-[m
[31m-            /* tf->name.len includes the terminating '\0' */[m
[31m-[m
[31m-            ngx_memcpy(name, tf->name.data, tf->name.len);[m
[31m-[m
[31m-            path.len = (name + tf->name.len - 1) - path.data;[m
[31m-[m
[31m-        } else {[m
[31m-            e.ip = tf->values->elts;[m
[31m-            e.pos = name;[m
[31m-            e.flushed = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-[m
[31m-            path.len = e.pos - path.data;[m
[31m-[m
[31m-            *e.pos = '\0';[m
[31m-[m
[31m-            if (alias && alias != NGX_MAX_SIZE_T_VALUE[m
[31m-                && ngx_strncmp(name, r->uri.data, alias) == 0)[m
[31m-            {[m
[31m-                ngx_memmove(name, name + alias, len - alias);[m
[31m-                path.len -= alias;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        test_dir = tf->test_dir;[m
[31m-[m
[31m-        tf++;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "trying to use %s: \"%s\" \"%s\"",[m
[31m-                       test_dir ? "dir" : "file", name, path.data);[m
[31m-[m
[31m-        if (tf->lengths == NULL && tf->name.len == 0) {[m
[31m-[m
[31m-            if (tf->code) {[m
[31m-                ngx_http_finalize_request(r, tf->code);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            path.len -= root;[m
[31m-            path.data += root;[m
[31m-[m
[31m-            if (path.data[0] == '@') {[m
[31m-                (void) ngx_http_named_location(r, &path);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_http_split_args(r, &path, &args);[m
[31m-[m
[31m-                (void) ngx_http_internal_redirect(r, &path, &args);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_DONE);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.read_ahead = clcf->read_ahead;[m
[31m-        of.directio = clcf->directio;[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            if (of.err != NGX_ENOENT[m
[31m-                && of.err != NGX_ENOTDIR[m
[31m-                && of.err != NGX_ENAMETOOLONG)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                              "%s \"%s\" failed", of.failed, path.data);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (of.is_dir != test_dir) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        path.len -= root;[m
[31m-        path.data += root;[m
[31m-[m
[31m-        if (!alias) {[m
[31m-            r->uri = path;[m
[31m-[m
[31m-        } else if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            if (!test_dir) {[m
[31m-                r->uri = path;[m
[31m-                r->add_uri_to_alias = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            name = r->uri.data;[m
[31m-[m
[31m-            r->uri.len = alias + path.len;[m
[31m-            r->uri.data = ngx_pnalloc(r->pool, r->uri.len);[m
[31m-            if (r->uri.data == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_copy(r->uri.data, name, alias);[m
[31m-            ngx_memcpy(p, path.data, path.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_exten(r);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "try file uri: \"%V\"", &r->uri);[m
[31m-[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* not reached */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_content_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    size_t     root;[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_str_t  path;[m
[31m-[m
[31m-    if (r->content_handler) {[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-        ngx_http_finalize_request(r, r->content_handler(r));[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "content phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc != NGX_DECLINED) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    ph++;[m
[31m-[m
[31m-    if (ph->checker) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* no content handler was found */[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) != NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "directory index of \"%s\" is forbidden", path.data);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_FORBIDDEN);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no handler found");[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_update_location_config(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->method & clcf->limit_except) {[m
[31m-        r->loc_conf = clcf->limit_except_loc_conf;[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_io.flags & NGX_IO_SENDFILE) && clcf->sendfile) {[m
[31m-        r->connection->sendfile = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        r->connection->sendfile = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->client_body_in_file_only) {[m
[31m-        r->request_body_in_file_only = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file =[m
[31m-            clcf->client_body_in_file_only == NGX_HTTP_REQUEST_BODY_FILE_CLEAN;[m
[31m-        r->request_body_file_log_level = NGX_LOG_NOTICE;[m
[31m-[m
[31m-    } else {[m
[31m-        r->request_body_file_log_level = NGX_LOG_WARN;[m
[31m-    }[m
[31m-[m
[31m-    r->request_body_in_single_buf = clcf->client_body_in_single_buffer;[m
[31m-[m
[31m-    if (r->keepalive) {[m
[31m-        if (clcf->keepalive_timeout == 0) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->connection->requests >= clcf->keepalive_requests) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->headers_in.msie6[m
[31m-                   && r->method == NGX_HTTP_POST[m
[31m-                   && (clcf->keepalive_disable[m
[31m-                       & NGX_HTTP_KEEPALIVE_DISABLE_MSIE6))[m
[31m-        {[m
[31m-            /*[m
[31m-             * MSIE may wait for some time if an response for[m
[31m-             * a POST request was sent over a keepalive connection[m
[31m-             */[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->headers_in.safari[m
[31m-                   && (clcf->keepalive_disable[m
[31m-                       & NGX_HTTP_KEEPALIVE_DISABLE_SAFARI))[m
[31m-        {[m
[31m-            /*[m
[31m-             * Safari may send a POST request to a closed keepalive[m
[31m-             * connection and may stall for some time, see[m
[31m-             *     https://bugs.webkit.org/show_bug.cgi?id=5760[m
[31m-             */[m
[31m-            r->keepalive = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!clcf->tcp_nopush) {[m
[31m-        /* disable TCP_NOPUSH/TCP_CORK use */[m
[31m-        r->connection->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->limit_rate == 0) {[m
[31m-        r->limit_rate = clcf->limit_rate;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->handler) {[m
[31m-        r->content_handler = clcf->handler;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_OK       - exact or regex match[m
[31m- * NGX_DONE     - auto redirect[m
[31m- * NGX_AGAIN    - inclusive match[m
[31m- * NGX_ERROR    - regex error[m
[31m- * NGX_DECLINED - no match[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_find_location(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *pclcf;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                  n;[m
[31m-    ngx_uint_t                 noregex;[m
[31m-    ngx_http_core_loc_conf_t  *clcf, **clcfp;[m
[31m-[m
[31m-    noregex = 0;[m
[31m-#endif[m
[31m-[m
[31m-    pclcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rc = ngx_http_core_find_static_location(r, pclcf->static_locations);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        noregex = clcf->noregex;[m
[31m-#endif[m
[31m-[m
[31m-        /* look up nested locations */[m
[31m-[m
[31m-        rc = ngx_http_core_find_location(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DONE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED or rc == NGX_AGAIN in nested location */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (noregex == 0 && pclcf->regex_locations) {[m
[31m-[m
[31m-        for (clcfp = pclcf->regex_locations; *clcfp; clcfp++) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "test location: ~ \"%V\"", &(*clcfp)->name);[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, (*clcfp)->regex, &r->uri);[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                r->loc_conf = (*clcfp)->loc_conf;[m
[31m-[m
[31m-                /* look up nested locations */[m
[31m-[m
[31m-                rc = ngx_http_core_find_location(r);[m
[31m-[m
[31m-                return (rc == NGX_ERROR) ? rc : NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_OK       - exact match[m
[31m- * NGX_DONE     - auto redirect[m
[31m- * NGX_AGAIN    - inclusive match[m
[31m- * NGX_DECLINED - no match[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_find_static_location(ngx_http_request_t *r,[m
[31m-    ngx_http_location_tree_node_t *node)[m
[31m-{[m
[31m-    u_char     *uri;[m
[31m-    size_t      len, n;[m
[31m-    ngx_int_t   rc, rv;[m
[31m-[m
[31m-    len = r->uri.len;[m
[31m-    uri = r->uri.data;[m
[31m-[m
[31m-    rv = NGX_DECLINED;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node == NULL) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "test location: \"%*s\"",[m
[31m-                       (size_t) node->len, node->name);[m
[31m-[m
[31m-        n = (len <= (size_t) node->len) ? len : node->len;[m
[31m-[m
[31m-        rc = ngx_filename_cmp(uri, node->name, n);[m
[31m-[m
[31m-        if (rc != 0) {[m
[31m-            node = (rc < 0) ? node->left : node->right;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len > (size_t) node->len) {[m
[31m-[m
[31m-            if (node->inclusive) {[m
[31m-[m
[31m-                r->loc_conf = node->inclusive->loc_conf;[m
[31m-                rv = NGX_AGAIN;[m
[31m-[m
[31m-                node = node->tree;[m
[31m-                uri += n;[m
[31m-                len -= n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* exact only */[m
[31m-[m
[31m-            node = node->right;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len == (size_t) node->len) {[m
[31m-[m
[31m-            if (node->exact) {[m
[31m-                r->loc_conf = node->exact->loc_conf;[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            } else {[m
[31m-                r->loc_conf = node->inclusive->loc_conf;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* len < node->len */[m
[31m-[m
[31m-        if (len + 1 == (size_t) node->len && node->auto_redirect) {[m
[31m-[m
[31m-            r->loc_conf = (node->exact) ? node->exact->loc_conf:[m
[31m-                                          node->inclusive->loc_conf;[m
[31m-            rv = NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        node = node->left;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash)[m
[31m-{[m
[31m-    u_char      c, *lowcase;[m
[31m-    size_t      len;[m
[31m-    ngx_uint_t  i, hash;[m
[31m-[m
[31m-    if (types_hash->size == 0) {[m
[31m-        return (void *) 4;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    len = r->headers_out.content_type_len;[m
[31m-[m
[31m-    if (r->headers_out.content_type_lowcase == NULL) {[m
[31m-[m
[31m-        lowcase = ngx_pnalloc(r->pool, len);[m
[31m-        if (lowcase == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_lowcase = lowcase;[m
[31m-[m
[31m-        hash = 0;[m
[31m-[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            c = ngx_tolower(r->headers_out.content_type.data[i]);[m
[31m-            hash = ngx_hash(hash, c);[m
[31m-            lowcase[i] = c;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_hash = hash;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_hash_find(types_hash, r->headers_out.content_type_hash,[m
[31m-                         r->headers_out.content_type_lowcase, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_content_type(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                     c, *exten;[m
[31m-    ngx_str_t                 *type;[m
[31m-    ngx_uint_t                 i, hash;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->exten.len) {[m
[31m-[m
[31m-        hash = 0;[m
[31m-[m
[31m-        for (i = 0; i < r->exten.len; i++) {[m
[31m-            c = r->exten.data[i];[m
[31m-[m
[31m-            if (c >= 'A' && c <= 'Z') {[m
[31m-[m
[31m-                exten = ngx_pnalloc(r->pool, r->exten.len);[m
[31m-                if (exten == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                hash = ngx_hash_strlow(exten, r->exten.data, r->exten.len);[m
[31m-[m
[31m-                r->exten.data = exten;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            hash = ngx_hash(hash, c);[m
[31m-        }[m
[31m-[m
[31m-        type = ngx_hash_find(&clcf->types_hash, hash,[m
[31m-                             r->exten.data, r->exten.len);[m
[31m-[m
[31m-        if (type) {[m
[31m-            r->headers_out.content_type_len = type->len;[m
[31m-            r->headers_out.content_type = *type;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_len = clcf->default_type.len;[m
[31m-    r->headers_out.content_type = clcf->default_type;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_set_exten(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    ngx_str_null(&r->exten);[m
[31m-[m
[31m-    for (i = r->uri.len - 1; i > 1; i--) {[m
[31m-        if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {[m
[31m-[m
[31m-            r->exten.len = r->uri.len - i - 1;[m
[31m-            r->exten.data = &r->uri.data[i + 1];[m
[31m-[m
[31m-            return;[m
[31m-[m
[31m-        } else if (r->uri.data[i] == '/') {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_etag(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t           *etag;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!clcf->etag) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    etag = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (etag == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    etag->hash = 1;[m
[31m-    ngx_str_set(&etag->key, "ETag");[m
[31m-[m
[31m-    etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);[m
[31m-    if (etag->value.data == NULL) {[m
[31m-        etag->hash = 0;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",[m
[31m-                                  r->headers_out.last_modified_time,[m
[31m-                                  r->headers_out.content_length_n)[m
[31m-                      - etag->value.data;[m
[31m-[m
[31m-    r->headers_out.etag = etag;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_weak_etag(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t            len;[m
[31m-    u_char           *p;[m
[31m-    ngx_table_elt_t  *etag;[m
[31m-[m
[31m-    etag = r->headers_out.etag;[m
[31m-[m
[31m-    if (etag == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (etag->value.len > 2[m
[31m-        && etag->value.data[0] == 'W'[m
[31m-        && etag->value.data[1] == '/')[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (etag->value.len < 1 || etag->value.data[0] != '"') {[m
[31m-        r->headers_out.etag->hash = 0;[m
[31m-        r->headers_out.etag = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, etag->value.len + 2);[m
[31m-    if (p == NULL) {[m
[31m-        r->headers_out.etag->hash = 0;[m
[31m-        r->headers_out.etag = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_sprintf(p, "W/%V", &etag->value) - p;[m
[31m-[m
[31m-    etag->value.data = p;[m
[31m-    etag->value.len = len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,[m
[31m-    ngx_str_t *ct, ngx_http_complex_value_t *cv)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_str_t     val;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = status;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, cv, &val) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (status == NGX_HTTP_MOVED_PERMANENTLY[m
[31m-        || status == NGX_HTTP_MOVED_TEMPORARILY[m
[31m-        || status == NGX_HTTP_SEE_OTHER[m
[31m-        || status == NGX_HTTP_TEMPORARY_REDIRECT)[m
[31m-    {[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.location->hash = 1;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-        r->headers_out.location->value = val;[m
[31m-[m
[31m-        return status;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = val.len;[m
[31m-[m
[31m-    if (ct) {[m
[31m-        r->headers_out.content_type_len = ct->len;[m
[31m-        r->headers_out.content_type = *ct;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD || (r != r->main && val.len == 0)) {[m
[31m-        return ngx_http_send_header(r);[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = val.data;[m
[31m-    b->last = val.data + val.len;[m
[31m-    b->memory = val.len ? 1 : 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->post_action) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "header already sent");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        r->headers_out.status = r->err_status;[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_top_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http output filter \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    rc = ngx_http_top_body_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        /* NGX_ERROR may be returned by any filter */[m
[31m-        c->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *path,[m
[31m-    size_t *root_length, size_t reserved)[m
[31m-{[m
[31m-    u_char                    *last;[m
[31m-    size_t                     alias;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    alias = clcf->alias;[m
[31m-[m
[31m-    if (alias && !r->valid_location) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "\"alias\" cannot be used in location \"%V\" "[m
[31m-                      "where URI was rewritten", &clcf->name);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->root_lengths == NULL) {[m
[31m-[m
[31m-        *root_length = clcf->root.len;[m
[31m-[m
[31m-        path->len = clcf->root.len + reserved + r->uri.len - alias + 1;[m
[31m-[m
[31m-        path->data = ngx_pnalloc(r->pool, path->len);[m
[31m-        if (path->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        last = ngx_copy(path->data, clcf->root.data, clcf->root.len);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            reserved += r->add_uri_to_alias ? r->uri.len + 1 : 1;[m
[31m-[m
[31m-        } else {[m
[31m-            reserved += r->uri.len - alias + 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_script_run(r, path, clcf->root_lengths->elts, reserved,[m
[31m-                                clcf->root_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, path)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        *root_length = path->len - reserved;[m
[31m-        last = path->data + *root_length;[m
[31m-[m
[31m-        if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            if (!r->add_uri_to_alias) {[m
[31m-                *last = '\0';[m
[31m-                return last;[m
[31m-            }[m
[31m-[m
[31m-            alias = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_cpystrn(last, r->uri.data + alias, r->uri.len - alias + 1);[m
[31m-[m
[31m-    return last;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_auth_basic_user(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t   auth, encoded;[m
[31m-    ngx_uint_t  len;[m
[31m-[m
[31m-    if (r->headers_in.user.len == 0 && r->headers_in.user.data != NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.authorization == NULL) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    encoded = r->headers_in.authorization->value;[m
[31m-[m
[31m-    if (encoded.len < sizeof("Basic ") - 1[m
[31m-        || ngx_strncasecmp(encoded.data, (u_char *) "Basic ",[m
[31m-                           sizeof("Basic ") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    encoded.len -= sizeof("Basic ") - 1;[m
[31m-    encoded.data += sizeof("Basic ") - 1;[m
[31m-[m
[31m-    while (encoded.len && encoded.data[0] == ' ') {[m
[31m-        encoded.len--;[m
[31m-        encoded.data++;[m
[31m-    }[m
[31m-[m
[31m-    if (encoded.len == 0) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    auth.len = ngx_base64_decoded_length(encoded.len);[m
[31m-    auth.data = ngx_pnalloc(r->pool, auth.len + 1);[m
[31m-    if (auth.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&auth, &encoded) != NGX_OK) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    auth.data[auth.len] = '\0';[m
[31m-[m
[31m-    for (len = 0; len < auth.len; len++) {[m
[31m-        if (auth.data[len] == ':') {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 || len == auth.len) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.user.len = len;[m
[31m-    r->headers_in.user.data = auth.data;[m
[31m-    r->headers_in.passwd.len = auth.len - len - 1;[m
[31m-    r->headers_in.passwd.data = &auth.data[len + 1];[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_gzip_ok(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                     date, expires;[m
[31m-    ngx_uint_t                 p;[m
[31m-    ngx_array_t               *cc;[m
[31m-    ngx_table_elt_t           *e, *d, *ae;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->gzip_tested = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ae = r->headers_in.accept_encoding;[m
[31m-    if (ae == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ae->value.len < sizeof("gzip") - 1) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * test first for the most common case "gzip,...":[m
[31m-     *   MSIE:    "gzip, deflate"[m
[31m-     *   Firefox: "gzip,deflate"[m
[31m-     *   Chrome:  "gzip,deflate,sdch"[m
[31m-     *   Safari:  "gzip, deflate"[m
[31m-     *   Opera:   "gzip, deflate"[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_memcmp(ae->value.data, "gzip,", 5) != 0[m
[31m-        && ngx_http_gzip_accept_encoding(&ae->value) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_in.msie6 && clcf->gzip_disable_msie6) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < clcf->gzip_http_version) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.via == NULL) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    p = clcf->gzip_proxied;[m
[31m-[m
[31m-    if (p & NGX_HTTP_GZIP_PROXIED_OFF) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (p & NGX_HTTP_GZIP_PROXIED_ANY) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.authorization && (p & NGX_HTTP_GZIP_PROXIED_AUTH)) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    e = r->headers_out.expires;[m
[31m-[m
[31m-    if (e) {[m
[31m-[m
[31m-        if (!(p & NGX_HTTP_GZIP_PROXIED_EXPIRED)) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        expires = ngx_parse_http_time(e->value.data, e->value.len);[m
[31m-        if (expires == NGX_ERROR) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        d = r->headers_out.date;[m
[31m-[m
[31m-        if (d) {[m
[31m-            date = ngx_parse_http_time(d->value.data, d->value.len);[m
[31m-            if (date == NGX_ERROR) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            date = ngx_time();[m
[31m-        }[m
[31m-[m
[31m-        if (expires < date) {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cc = &r->headers_out.cache_control;[m
[31m-[m
[31m-    if (cc->elts) {[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_NO_CACHE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_cache,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_NO_STORE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_store,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_PRIVATE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_private,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((p & NGX_HTTP_GZIP_PROXIED_NO_LM) && r->headers_out.last_modified) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((p & NGX_HTTP_GZIP_PROXIED_NO_ETAG) && r->headers_out.etag) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-ok:[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (clcf->gzip_disable && r->headers_in.user_agent) {[m
[31m-[m
[31m-        if (ngx_regex_exec_array(clcf->gzip_disable,[m
[31m-                                 &r->headers_in.user_agent->value,[m
[31m-                                 r->connection->log)[m
[31m-            != NGX_DECLINED)[m
[31m-        {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    r->gzip_ok = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * gzip is enabled for the following quantities:[m
[31m- *     "gzip; q=0.001" ... "gzip; q=1.000"[m
[31m- * gzip is disabled for the following quantities:[m
[31m- *     "gzip; q=0" ... "gzip; q=0.000", and for any invalid cases[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_accept_encoding(ngx_str_t *ae)[m
[31m-{[m
[31m-    u_char  *p, *start, *last;[m
[31m-[m
[31m-    start = ae->data;[m
[31m-    last = start + ae->len;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        p = ngx_strcasestrn(start, "gzip", 4 - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (p == start || (*(p - 1) == ',' || *(p - 1) == ' ')) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        start = p + 4;[m
[31m-    }[m
[31m-[m
[31m-    p += 4;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        switch (*p++) {[m
[31m-        case ',':[m
[31m-            return NGX_OK;[m
[31m-        case ';':[m
[31m-            goto quantity;[m
[31m-        case ' ':[m
[31m-            continue;[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-quantity:[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        switch (*p++) {[m
[31m-        case 'q':[m
[31m-        case 'Q':[m
[31m-            goto equal;[m
[31m-        case ' ':[m
[31m-            continue;[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-equal:[m
[31m-[m
[31m-    if (p + 2 > last || *p++ != '=') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_gzip_quantity(p, last) == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_gzip_quantity(u_char *p, u_char *last)[m
[31m-{[m
[31m-    u_char      c;[m
[31m-    ngx_uint_t  n, q;[m
[31m-[m
[31m-    c = *p++;[m
[31m-[m
[31m-    if (c != '0' && c != '1') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    q = (c - '0') * 100;[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        return q;[m
[31m-    }[m
[31m-[m
[31m-    c = *p++;[m
[31m-[m
[31m-    if (c == ',' || c == ' ') {[m
[31m-        return q;[m
[31m-    }[m
[31m-[m
[31m-    if (c != '.') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        c = *p++;[m
[31m-[m
[31m-        if (c == ',' || c == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            q += c - '0';[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (q > 100 || n > 3) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    return q;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,[m
[31m-    ngx_http_post_subrequest_t *ps, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_time_t                    *tp;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *sr;[m
[31m-    ngx_http_core_srv_conf_t      *cscf;[m
[31m-    ngx_http_postponed_request_t  *pr, *p;[m
[31m-[m
[31m-    if (r->subrequests == 0) {[m
[31m-        ngx_http_probe_subrequest_cycle(r, uri, args);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "subrequests cycle while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * 1000 is reserved for other purposes.[m
[31m-     */[m
[31m-    if (r->main->count >= 65535 - 1000) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "request reference counter overflow "[m
[31m-                      "while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr = ngx_pcalloc(r->pool, sizeof(ngx_http_request_t));[m
[31m-    if (sr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr->signature = NGX_HTTP_MODULE;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    sr->connection = c;[m
[31m-[m
[31m-    sr->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (sr->ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&sr->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    sr->main_conf = cscf->ctx->main_conf;[m
[31m-    sr->srv_conf = cscf->ctx->srv_conf;[m
[31m-    sr->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    sr->pool = r->pool;[m
[31m-[m
[31m-    sr->headers_in = r->headers_in;[m
[31m-[m
[31m-    ngx_http_clear_content_length(sr);[m
[31m-    ngx_http_clear_accept_ranges(sr);[m
[31m-    ngx_http_clear_last_modified(sr);[m
[31m-[m
[31m-    sr->request_body = r->request_body;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    sr->stream = r->stream;[m
[31m-#endif[m
[31m-[m
[31m-    sr->method = NGX_HTTP_GET;[m
[31m-    sr->http_version = r->http_version;[m
[31m-[m
[31m-    sr->request_line = r->request_line;[m
[31m-    sr->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        sr->args = *args;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http subrequest \"%V?%V\"", uri, &sr->args);[m
[31m-[m
[31m-    sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;[m
[31m-    sr->waited = (flags & NGX_HTTP_SUBREQUEST_WAITED) != 0;[m
[31m-[m
[31m-    sr->unparsed_uri = r->unparsed_uri;[m
[31m-    sr->method_name = ngx_http_core_get_method;[m
[31m-    sr->http_protocol = r->http_protocol;[m
[31m-[m
[31m-    ngx_http_set_exten(sr);[m
[31m-[m
[31m-    sr->main = r->main;[m
[31m-    sr->parent = r;[m
[31m-    sr->post_subrequest = ps;[m
[31m-    sr->read_event_handler = ngx_http_request_empty_handler;[m
[31m-    sr->write_event_handler = ngx_http_handler;[m
[31m-[m
[31m-    if (c->data == r && r->postponed == NULL) {[m
[31m-        c->data = sr;[m
[31m-    }[m
[31m-[m
[31m-    sr->variables = r->variables;[m
[31m-[m
[31m-    sr->log_handler = r->log_handler;[m
[31m-[m
[31m-    pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->request = sr;[m
[31m-    pr->out = NULL;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-    if (r->postponed) {[m
[31m-        for (p = r->postponed; p->next; p = p->next) { /* void */ }[m
[31m-        p->next = pr;[m
[31m-[m
[31m-    } else {[m
[31m-        r->postponed = pr;[m
[31m-    }[m
[31m-[m
[31m-    sr->internal = 1;[m
[31m-[m
[31m-    sr->discard_body = r->discard_body;[m
[31m-    sr->expect_tested = 1;[m
[31m-    sr->main_filter_need_in_memory = r->main_filter_need_in_memory;[m
[31m-[m
[31m-    sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    sr->subrequests = r->subrequests - 1;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    sr->start_sec = tp->sec;[m
[31m-    sr->start_msec = tp->msec;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    *psr = sr;[m
[31m-[m
[31m-    ngx_http_probe_subrequest_start(sr);[m
[31m-[m
[31m-    return ngx_http_post_request(sr, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_internal_redirect(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while internally redirecting to \"%V\"", uri);[m
[31m-[m
[31m-        r->main->count++;[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    r->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        r->args = *args;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&r->args);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "internal redirect: \"%V?%V\"", uri, &r->args);[m
[31m-[m
[31m-    ngx_http_set_exten(r);[m
[31m-[m
[31m-    /* clear the modules contexts */[m
[31m-    ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    ngx_http_update_location_config(r);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    r->cache = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    r->internal = 1;[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-    r->add_uri_to_alias = 0;[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    ngx_http_handler(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t    *cscf;[m
[31m-    ngx_http_core_loc_conf_t   **clcfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while redirect to named location \"%V\"", name);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "empty URI in redirect to named location \"%V\"", name);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (cscf->named_locations) {[m
[31m-[m
[31m-        for (clcfp = cscf->named_locations; *clcfp; clcfp++) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "test location: \"%V\"", &(*clcfp)->name);[m
[31m-[m
[31m-            if (name->len != (*clcfp)->name.len[m
[31m-                || ngx_strncmp(name->data, (*clcfp)->name.data, name->len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "using location: %V \"%V?%V\"",[m
[31m-                           name, &r->uri, &r->args);[m
[31m-[m
[31m-            r->internal = 1;[m
[31m-            r->content_handler = NULL;[m
[31m-            r->uri_changed = 0;[m
[31m-            r->loc_conf = (*clcfp)->loc_conf;[m
[31m-[m
[31m-            /* clear the modules contexts */[m
[31m-            ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-            ngx_http_update_location_config(r);[m
[31m-[m
[31m-            cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            r->phase_handler = cmcf->phase_engine.location_rewrite_index;[m
[31m-[m
[31m-            r->write_event_handler = ngx_http_core_run_phases;[m
[31m-            ngx_http_core_run_phases(r);[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "could not find named location \"%V\"", name);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_cleanup_t *[m
[31m-ngx_http_cleanup_add(ngx_http_request_t *r, size_t size)[m
[31m-{[m
[31m-    ngx_http_cleanup_t  *cln;[m
[31m-[m
[31m-    r = r->main;[m
[31m-[m
[31m-    cln = ngx_palloc(r->pool, sizeof(ngx_http_cleanup_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        cln->data = ngx_palloc(r->pool, size);[m
[31m-        if (cln->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cln->data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = NULL;[m
[31m-    cln->next = r->cleanup;[m
[31m-[m
[31m-    r->cleanup = cln;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http cleanup add: %p", cln);[m
[31m-[m
[31m-    return cln;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_disable_symlinks(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *path, ngx_open_file_info_t *of)[m
[31m-{[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    u_char     *p;[m
[31m-    ngx_str_t   from;[m
[31m-[m
[31m-    of->disable_symlinks = clcf->disable_symlinks;[m
[31m-[m
[31m-    if (clcf->disable_symlinks_from == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, clcf->disable_symlinks_from, &from)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (from.len == 0[m
[31m-        || from.len > path->len[m
[31m-        || ngx_memcmp(path->data, from.data, from.len) != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (from.len == path->len) {[m
[31m-        of->disable_symlinks = NGX_DISABLE_SYMLINKS_OFF;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = path->data + from.len;[m
[31m-[m
[31m-    if (*p == '/') {[m
[31m-        of->disable_symlinks_from = from.len;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p--;[m
[31m-[m
[31m-    if (*p == '/') {[m
[31m-        of->disable_symlinks_from = from.len - 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    ngx_array_t *headers, ngx_str_t *value, ngx_array_t *proxies,[m
[31m-    int recursive)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_uint_t         i, found;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    if (headers == NULL) {[m
[31m-        return ngx_http_get_forwarded_addr_internal(r, addr, value->data,[m
[31m-                                                    value->len, proxies,[m
[31m-                                                    recursive);[m
[31m-    }[m
[31m-[m
[31m-    i = headers->nelts;[m
[31m-    h = headers->elts;[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-    while (i-- > 0) {[m
[31m-        rc = ngx_http_get_forwarded_addr_internal(r, addr, h[i]->value.data,[m
[31m-                                                  h[i]->value.len, proxies,[m
[31m-                                                  recursive);[m
[31m-[m
[31m-        if (!recursive) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED && found) {[m
[31m-            rc = NGX_DONE;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    u_char *xff, size_t xfflen, ngx_array_t *proxies, int recursive)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    in_addr_t         inaddr;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_addr_t        paddr;[m
[31m-    ngx_cidr_t       *cidr;[m
[31m-    ngx_uint_t        family, i;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t        n;[m
[31m-    struct in6_addr  *inaddr6;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    inaddr = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    inaddr6 = NULL;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    family = addr->sockaddr->sa_family;[m
[31m-[m
[31m-    if (family == AF_INET) {[m
[31m-        inaddr = ((struct sockaddr_in *) addr->sockaddr)->sin_addr.s_addr;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    else if (family == AF_INET6) {[m
[31m-        inaddr6 = &((struct sockaddr_in6 *) addr->sockaddr)->sin6_addr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-            family = AF_INET;[m
[31m-[m
[31m-            p = inaddr6->s6_addr;[m
[31m-[m
[31m-            inaddr = p[12] << 24;[m
[31m-            inaddr += p[13] << 16;[m
[31m-            inaddr += p[14] << 8;[m
[31m-            inaddr += p[15];[m
[31m-[m
[31m-            inaddr = htonl(inaddr);[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    for (cidr = proxies->elts, i = 0; i < proxies->nelts; i++) {[m
[31m-        if (cidr[i].family != family) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        switch (family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            for (n = 0; n < 16; n++) {[m
[31m-                if ((inaddr6->s6_addr[n] & cidr[i].u.in6.mask.s6_addr[n])[m
[31m-                    != cidr[i].u.in6.addr.s6_addr[n])[m
[31m-                {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            if ((inaddr & cidr[i].u.in.mask) != cidr[i].u.in.addr) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        for (p = xff + xfflen - 1; p > xff; p--, xfflen--) {[m
[31m-            if (*p != ' ' && *p != ',') {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; p > xff; p--) {[m
[31m-            if (*p == ' ' || *p == ',') {[m
[31m-                p++;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_parse_addr(r->pool, &paddr, p, xfflen - (p - xff)) != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        *addr = paddr;[m
[31m-[m
[31m-        if (recursive && p > xff) {[m
[31m-            rc = ngx_http_get_forwarded_addr_internal(r, addr, xff, p - 1 - xff,[m
[31m-                                                      proxies, 1);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_OK || rc == NGX_DONE  */[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    void                        *mconf;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_conf_t                   pcf;[m
[31m-    ngx_http_module_t           *module;[m
[31m-    struct sockaddr_in          *sin;[m
[31m-    ngx_http_conf_ctx_t         *ctx, *http_ctx;[m
[31m-    ngx_http_listen_opt_t        lsopt;[m
[31m-    ngx_http_core_srv_conf_t    *cscf, **cscfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx = cf->ctx;[m
[31m-    ctx->main_conf = http_ctx->main_conf;[m
[31m-[m
[31m-    /* the server{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* the server{}'s loc_conf */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the server configuration context */[m
[31m-[m
[31m-    cscf = ctx->srv_conf[ngx_http_core_module.ctx_index];[m
[31m-    cscf->ctx = ctx;[m
[31m-[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    cscfp = ngx_array_push(&cmcf->servers);[m
[31m-    if (cscfp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *cscfp = cscf;[m
[31m-[m
[31m-[m
[31m-    /* parse inside server{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_SRV_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv == NGX_CONF_OK && !cscf->listen) {[m
[31m-        ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));[m
[31m-[m
[31m-        sin = &lsopt.u.sockaddr_in;[m
[31m-[m
[31m-        sin->sin_family = AF_INET;[m
[31m-#if (NGX_WIN32)[m
[31m-        sin->sin_port = htons(80);[m
[31m-#else[m
[31m-        sin->sin_port = htons((getuid() == 0) ? 80 : 8000);[m
[31m-#endif[m
[31m-        sin->sin_addr.s_addr = INADDR_ANY;[m
[31m-[m
[31m-        lsopt.socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-        lsopt.backlog = NGX_LISTEN_BACKLOG;[m
[31m-        lsopt.rcvbuf = -1;[m
[31m-        lsopt.sndbuf = -1;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        lsopt.setfib = -1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        lsopt.fastopen = -1;[m
[31m-#endif[m
[31m-        lsopt.wildcard = 1;[m
[31m-[m
[31m-        (void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.socklen, lsopt.addr,[m
[31m-                             NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                      *rv;[m
[31m-    u_char                    *mod;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                 *value, *name;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_conf_t                 save;[m
[31m-    ngx_http_module_t         *module;[m
[31m-    ngx_http_conf_ctx_t       *ctx, *pctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf, *pclcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] =[m
[31m-                                                   module->create_loc_conf(cf);[m
[31m-            if (ctx->loc_conf[cf->cycle->modules[i]->ctx_index] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-[m
[31m-        len = value[1].len;[m
[31m-        mod = value[1].data;[m
[31m-        name = &value[2];[m
[31m-[m
[31m-        if (len == 1 && mod[0] == '=') {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-            clcf->exact_match = 1;[m
[31m-[m
[31m-        } else if (len == 2 && mod[0] == '^' && mod[1] == '~') {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-            clcf->noregex = 1;[m
[31m-[m
[31m-        } else if (len == 1 && mod[0] == '~') {[m
[31m-[m
[31m-            if (ngx_http_core_regex_location(cf, clcf, name, 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else if (len == 2 && mod[0] == '~' && mod[1] == '*') {[m
[31m-[m
[31m-            if (ngx_http_core_regex_location(cf, clcf, name, 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid location modifier \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        name = &value[1];[m
[31m-[m
[31m-        if (name->data[0] == '=') {[m
[31m-[m
[31m-            clcf->name.len = name->len - 1;[m
[31m-            clcf->name.data = name->data + 1;[m
[31m-            clcf->exact_match = 1;[m
[31m-[m
[31m-        } else if (name->data[0] == '^' && name->data[1] == '~') {[m
[31m-[m
[31m-            clcf->name.len = name->len - 2;[m
[31m-            clcf->name.data = name->data + 2;[m
[31m-            clcf->noregex = 1;[m
[31m-[m
[31m-        } else if (name->data[0] == '~') {[m
[31m-[m
[31m-            name->len--;[m
[31m-            name->data++;[m
[31m-[m
[31m-            if (name->data[0] == '*') {[m
[31m-[m
[31m-                name->len--;[m
[31m-                name->data++;[m
[31m-[m
[31m-                if (ngx_http_core_regex_location(cf, clcf, name, 1) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                if (ngx_http_core_regex_location(cf, clcf, name, 0) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-[m
[31m-            if (name->data[0] == '@') {[m
[31m-                clcf->named = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    if (cf->cmd_type == NGX_HTTP_LOC_CONF) {[m
[31m-[m
[31m-        /* nested location */[m
[31m-[m
[31m-#if 0[m
[31m-        clcf->prev_location = pclcf;[m
[31m-#endif[m
[31m-[m
[31m-        if (pclcf->exact_match) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" cannot be inside "[m
[31m-                               "the exact location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (pclcf->named) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" cannot be inside "[m
[31m-                               "the named location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->named) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "named location \"%V\" can be "[m
[31m-                               "on the server level only",[m
[31m-                               &clcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = pclcf->name.len;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        if (clcf->regex == NULL[m
[31m-            && ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)[m
[31m-#else[m
[31m-        if (ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)[m
[31m-#endif[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" is outside location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_LOC_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_regex_location(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf,[m
[31m-    ngx_str_t *regex, ngx_uint_t caseless)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_compile_t  rc;[m
[31m-    u_char               errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *regex;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-#if (NGX_HAVE_CASELESS_FILESYSTEM)[m
[31m-    rc.options = NGX_REGEX_CASELESS;[m
[31m-#else[m
[31m-    rc.options = caseless ? NGX_REGEX_CASELESS : 0;[m
[31m-#endif[m
[31m-[m
[31m-    clcf->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (clcf->regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->name = *regex;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "using regex \"%V\" requires PCRE library",[m
[31m-                       regex);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    if (clcf->types == NULL) {[m
[31m-        clcf->types = ngx_array_create(cf->pool, 64, sizeof(ngx_hash_key_t));[m
[31m-        if (clcf->types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_core_type;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t       *value, *content_type, *old;[m
[31m-    ngx_uint_t       i, n, hash;[m
[31m-    ngx_hash_key_t  *type;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "include") == 0) {[m
[31m-        if (cf->args->nelts != 2) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid number of arguments"[m
[31m-                               " in \"include\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_conf_include(cf, dummy, conf);[m
[31m-    }[m
[31m-[m
[31m-    content_type = ngx_palloc(cf->pool, sizeof(ngx_str_t));[m
[31m-    if (content_type == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *content_type = value[0];[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len);[m
[31m-[m
[31m-        type = clcf->types->elts;[m
[31m-        for (n = 0; n < clcf->types->nelts; n++) {[m
[31m-            if (ngx_strcmp(value[i].data, type[n].key.data) == 0) {[m
[31m-                old = type[n].value;[m
[31m-                type[n].value = content_type;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                                   "duplicate extension \"%V\", "[m
[31m-                                   "content type: \"%V\", "[m
[31m-                                   "previous content type: \"%V\"",[m
[31m-                                   &value[i], content_type, old);[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        type = ngx_array_push(clcf->types);[m
[31m-        if (type == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        type->key = value[i];[m
[31m-        type->key_hash = hash;[m
[31m-        type->value = content_type;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    return ngx_http_variables_add_core_vars(cf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_postconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_request_body_filter = ngx_http_request_body_save_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_main_conf_t));[m
[31m-    if (cmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->servers, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_core_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    cmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    cmcf->variables_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    cmcf->variables_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return cmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t *cmcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512);[m
[31m-    ngx_conf_init_uint_value(cmcf->server_names_hash_bucket_size,[m
[31m-                             ngx_cacheline_size);[m
[31m-[m
[31m-    cmcf->server_names_hash_bucket_size =[m
[31m-            ngx_align(cmcf->server_names_hash_bucket_size, ngx_cacheline_size);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_init_uint_value(cmcf->variables_hash_max_size, 1024);[m
[31m-    ngx_conf_init_uint_value(cmcf->variables_hash_bucket_size, 64);[m
[31m-[m
[31m-    cmcf->variables_hash_bucket_size =[m
[31m-               ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size);[m
[31m-[m
[31m-    if (cmcf->ncaptures) {[m
[31m-        cmcf->ncaptures = (cmcf->ncaptures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_srv_conf_t));[m
[31m-    if (cscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->client_large_buffers.num = 0;[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_array_init(&cscf->server_names, cf->temp_pool, 4,[m
[31m-                       sizeof(ngx_http_server_name_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cscf->connection_pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->request_pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->client_header_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    cscf->client_header_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->ignore_invalid_headers = NGX_CONF_UNSET;[m
[31m-    cscf->merge_slashes = NGX_CONF_UNSET;[m
[31m-    cscf->underscores_in_headers = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return cscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *prev = parent;[m
[31m-    ngx_http_core_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_str_t                name;[m
[31m-    ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-    /* TODO: it does not merge, it inits only */[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->connection_pool_size,[m
[31m-                              prev->connection_pool_size, 64 * sizeof(void *));[m
[31m-    ngx_conf_merge_size_value(conf->request_pool_size,[m
[31m-                              prev->request_pool_size, 4096);[m
[31m-    ngx_conf_merge_msec_value(conf->client_header_timeout,[m
[31m-                              prev->client_header_timeout, 60000);[m
[31m-    ngx_conf_merge_size_value(conf->client_header_buffer_size,[m
[31m-                              prev->client_header_buffer_size, 1024);[m
[31m-    ngx_conf_merge_bufs_value(conf->large_client_header_buffers,[m
[31m-                              prev->large_client_header_buffers,[m
[31m-                              4, 8192);[m
[31m-[m
[31m-    if (conf->large_client_header_buffers.size < conf->connection_pool_size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the \"large_client_header_buffers\" size must be "[m
[31m-                           "equal to or greater than \"connection_pool_size\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ignore_invalid_headers,[m
[31m-                              prev->ignore_invalid_headers, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->underscores_in_headers,[m
[31m-                              prev->underscores_in_headers, 0);[m
[31m-[m
[31m-    if (conf->server_names.nelts == 0) {[m
[31m-        /* the array has 4 empty preallocated elements, so push cannot fail */[m
[31m-        sn = ngx_array_push(&conf->server_names);[m
[31m-#if (NGX_PCRE)[m
[31m-        sn->regex = NULL;[m
[31m-#endif[m
[31m-        sn->server = conf;[m
[31m-        ngx_str_set(&sn->name, "");[m
[31m-    }[m
[31m-[m
[31m-    sn = conf->server_names.elts;[m
[31m-    name = sn[0].name;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (sn->regex) {[m
[31m-        name.len++;[m
[31m-        name.data--;[m
[31m-    } else[m
[31m-#endif[m
[31m-[m
[31m-    if (name.data[0] == '.') {[m
[31m-        name.len--;[m
[31m-        name.data++;[m
[31m-    }[m
[31m-[m
[31m-    conf->server_name.len = name.len;[m
[31m-    conf->server_name.data = ngx_pstrdup(cf->pool, &name);[m
[31m-    if (conf->server_name.data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_loc_conf_t));[m
[31m-    if (clcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     clcf->root = { 0, NULL };[m
[31m-     *     clcf->limit_except = 0;[m
[31m-     *     clcf->post_action = { 0, NULL };[m
[31m-     *     clcf->types = NULL;[m
[31m-     *     clcf->default_type = { 0, NULL };[m
[31m-     *     clcf->error_log = NULL;[m
[31m-     *     clcf->try_files = NULL;[m
[31m-     *     clcf->client_body_path = NULL;[m
[31m-     *     clcf->regex = NULL;[m
[31m-     *     clcf->exact_match = 0;[m
[31m-     *     clcf->auto_redirect = 0;[m
[31m-     *     clcf->alias = 0;[m
[31m-     *     clcf->gzip_proxied = 0;[m
[31m-     *     clcf->keepalive_disable = 0;[m
[31m-     */[m
[31m-[m
[31m-    clcf->error_pages = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->client_max_body_size = NGX_CONF_UNSET;[m
[31m-    clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->satisfy = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->if_modified_since = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->max_ranges = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->client_body_in_file_only = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->client_body_in_single_buffer = NGX_CONF_UNSET;[m
[31m-    clcf->internal = NGX_CONF_UNSET;[m
[31m-    clcf->sendfile = NGX_CONF_UNSET;[m
[31m-    clcf->sendfile_max_chunk = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->aio = NGX_CONF_UNSET;[m
[31m-    clcf->aio_write = NGX_CONF_UNSET;[m
[31m-#if (NGX_THREADS)[m
[31m-    clcf->thread_pool = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->thread_pool_value = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-    clcf->read_ahead = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->directio = NGX_CONF_UNSET;[m
[31m-    clcf->directio_alignment = NGX_CONF_UNSET;[m
[31m-    clcf->tcp_nopush = NGX_CONF_UNSET;[m
[31m-    clcf->tcp_nodelay = NGX_CONF_UNSET;[m
[31m-    clcf->send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->postpone_output = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->limit_rate_after = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->keepalive_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->keepalive_header = NGX_CONF_UNSET;[m
[31m-    clcf->keepalive_requests = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->lingering_close = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->lingering_time = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->lingering_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->resolver_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->reset_timedout_connection = NGX_CONF_UNSET;[m
[31m-    clcf->server_name_in_redirect = NGX_CONF_UNSET;[m
[31m-    clcf->port_in_redirect = NGX_CONF_UNSET;[m
[31m-    clcf->msie_padding = NGX_CONF_UNSET;[m
[31m-    clcf->msie_refresh = NGX_CONF_UNSET;[m
[31m-    clcf->log_not_found = NGX_CONF_UNSET;[m
[31m-    clcf->log_subrequest = NGX_CONF_UNSET;[m
[31m-    clcf->recursive_error_pages = NGX_CONF_UNSET;[m
[31m-    clcf->server_tokens = NGX_CONF_UNSET;[m
[31m-    clcf->chunked_transfer_encoding = NGX_CONF_UNSET;[m
[31m-    clcf->etag = NGX_CONF_UNSET;[m
[31m-    clcf->types_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->types_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    clcf->open_file_cache = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->open_file_cache_valid = NGX_CONF_UNSET;[m
[31m-    clcf->open_file_cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->open_file_cache_errors = NGX_CONF_UNSET;[m
[31m-    clcf->open_file_cache_events = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    clcf->gzip_vary = NGX_CONF_UNSET;[m
[31m-    clcf->gzip_http_version = NGX_CONF_UNSET_UINT;[m
[31m-#if (NGX_PCRE)[m
[31m-    clcf->gzip_disable = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-    clcf->gzip_disable_msie6 = 3;[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-    clcf->gzip_disable_degradation = 3;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    clcf->disable_symlinks = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->disable_symlinks_from = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    return clcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_core_text_html_type = ngx_string("text/html");[m
[31m-static ngx_str_t  ngx_http_core_image_gif_type = ngx_string("image/gif");[m
[31m-static ngx_str_t  ngx_http_core_image_jpeg_type = ngx_string("image/jpeg");[m
[31m-[m
[31m-static ngx_hash_key_t  ngx_http_core_default_types[] = {[m
[31m-    { ngx_string("html"), 0, &ngx_http_core_text_html_type },[m
[31m-    { ngx_string("gif"), 0, &ngx_http_core_image_gif_type },[m
[31m-    { ngx_string("jpg"), 0, &ngx_http_core_image_jpeg_type },[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *prev = parent;[m
[31m-    ngx_http_core_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_hash_key_t   *type;[m
[31m-    ngx_hash_init_t   types_hash;[m
[31m-[m
[31m-    if (conf->root.data == NULL) {[m
[31m-[m
[31m-        conf->alias = prev->alias;[m
[31m-        conf->root = prev->root;[m
[31m-        conf->root_lengths = prev->root_lengths;[m
[31m-        conf->root_values = prev->root_values;[m
[31m-[m
[31m-        if (prev->root.data == NULL) {[m
[31m-            ngx_str_set(&conf->root, "html");[m
[31m-[m
[31m-            if (ngx_conf_full_name(cf->cycle, &conf->root, 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->post_action.data == NULL) {[m
[31m-        conf->post_action = prev->post_action;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->types_hash_max_size,[m
[31m-                              prev->types_hash_max_size, 1024);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->types_hash_bucket_size,[m
[31m-                              prev->types_hash_bucket_size, 64);[m
[31m-[m
[31m-    conf->types_hash_bucket_size = ngx_align(conf->types_hash_bucket_size,[m
[31m-                                             ngx_cacheline_size);[m
[31m-[m
[31m-    /*[m
[31m-     * the special handling of the "types" directive in the "http" section[m
[31m-     * to inherit the http's conf->types_hash to all servers[m
[31m-     */[m
[31m-[m
[31m-    if (prev->types && prev->types_hash.buckets == NULL) {[m
[31m-[m
[31m-        types_hash.hash = &prev->types_hash;[m
[31m-        types_hash.key = ngx_hash_key_lc;[m
[31m-        types_hash.max_size = conf->types_hash_max_size;[m
[31m-        types_hash.bucket_size = conf->types_hash_bucket_size;[m
[31m-        types_hash.name = "types_hash";[m
[31m-        types_hash.pool = cf->pool;[m
[31m-        types_hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&types_hash, prev->types->elts, prev->types->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types == NULL) {[m
[31m-        conf->types = prev->types;[m
[31m-        conf->types_hash = prev->types_hash;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types == NULL) {[m
[31m-        conf->types = ngx_array_create(cf->pool, 3, sizeof(ngx_hash_key_t));[m
[31m-        if (conf->types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; ngx_http_core_default_types[i].key.len; i++) {[m
[31m-            type = ngx_array_push(conf->types);[m
[31m-            if (type == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            type->key = ngx_http_core_default_types[i].key;[m
[31m-            type->key_hash =[m
[31m-                       ngx_hash_key_lc(ngx_http_core_default_types[i].key.data,[m
[31m-                                       ngx_http_core_default_types[i].key.len);[m
[31m-            type->value = ngx_http_core_default_types[i].value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types_hash.buckets == NULL) {[m
[31m-[m
[31m-        types_hash.hash = &conf->types_hash;[m
[31m-        types_hash.key = ngx_hash_key_lc;[m
[31m-        types_hash.max_size = conf->types_hash_max_size;[m
[31m-        types_hash.bucket_size = conf->types_hash_bucket_size;[m
[31m-        types_hash.name = "types_hash";[m
[31m-        types_hash.pool = cf->pool;[m
[31m-        types_hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&types_hash, conf->types->elts, conf->types->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->error_log == NULL) {[m
[31m-        if (prev->error_log) {[m
[31m-            conf->error_log = prev->error_log;[m
[31m-        } else {[m
[31m-            conf->error_log = &cf->cycle->new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->default_type,[m
[31m-                              prev->default_type, "text/plain");[m
[31m-[m
[31m-    ngx_conf_merge_off_value(conf->client_max_body_size,[m
[31m-                              prev->client_max_body_size, 1 * 1024 * 1024);[m
[31m-    ngx_conf_merge_size_value(conf->client_body_buffer_size,[m
[31m-                              prev->client_body_buffer_size,[m
[31m-                              (size_t) 2 * ngx_pagesize);[m
[31m-    ngx_conf_merge_msec_value(conf->client_body_timeout,[m
[31m-                              prev->client_body_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->keepalive_disable,[m
[31m-                              prev->keepalive_disable,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_KEEPALIVE_DISABLE_MSIE6));[m
[31m-    ngx_conf_merge_uint_value(conf->satisfy, prev->satisfy,[m
[31m-                              NGX_HTTP_SATISFY_ALL);[m
[31m-    ngx_conf_merge_uint_value(conf->if_modified_since, prev->if_modified_since,[m
[31m-                              NGX_HTTP_IMS_EXACT);[m
[31m-    ngx_conf_merge_uint_value(conf->max_ranges, prev->max_ranges,[m
[31m-                              NGX_MAX_INT32_VALUE);[m
[31m-    ngx_conf_merge_uint_value(conf->client_body_in_file_only,[m
[31m-                              prev->client_body_in_file_only,[m
[31m-                              NGX_HTTP_REQUEST_BODY_FILE_OFF);[m
[31m-    ngx_conf_merge_value(conf->client_body_in_single_buffer,[m
[31m-                              prev->client_body_in_single_buffer, 0);[m
[31m-    ngx_conf_merge_value(conf->internal, prev->internal, 0);[m
[31m-    ngx_conf_merge_value(conf->sendfile, prev->sendfile, 0);[m
[31m-    ngx_conf_merge_size_value(conf->sendfile_max_chunk,[m
[31m-                              prev->sendfile_max_chunk, 0);[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    ngx_conf_merge_value(conf->aio, prev->aio, NGX_HTTP_AIO_OFF);[m
[31m-    ngx_conf_merge_value(conf->aio_write, prev->aio_write, 0);[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_conf_merge_ptr_value(conf->thread_pool, prev->thread_pool, NULL);[m
[31m-    ngx_conf_merge_ptr_value(conf->thread_pool_value, prev->thread_pool_value,[m
[31m-                             NULL);[m
[31m-#endif[m
[31m-    ngx_conf_merge_size_value(conf->read_ahead, prev->read_ahead, 0);[m
[31m-    ngx_conf_merge_off_value(conf->directio, prev->directio,[m
[31m-                              NGX_OPEN_FILE_DIRECTIO_OFF);[m
[31m-    ngx_conf_merge_off_value(conf->directio_alignment, prev->directio_alignment,[m
[31m-                              512);[m
[31m-    ngx_conf_merge_value(conf->tcp_nopush, prev->tcp_nopush, 0);[m
[31m-    ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->send_timeout, prev->send_timeout, 60000);[m
[31m-    ngx_conf_merge_size_value(conf->send_lowat, prev->send_lowat, 0);[m
[31m-    ngx_conf_merge_size_value(conf->postpone_output, prev->postpone_output,[m
[31m-                              1460);[m
[31m-    ngx_conf_merge_size_value(conf->limit_rate, prev->limit_rate, 0);[m
[31m-    ngx_conf_merge_size_value(conf->limit_rate_after, prev->limit_rate_after,[m
[31m-                              0);[m
[31m-    ngx_conf_merge_msec_value(conf->keepalive_timeout,[m
[31m-                              prev->keepalive_timeout, 75000);[m
[31m-    ngx_conf_merge_sec_value(conf->keepalive_header,[m
[31m-                              prev->keepalive_header, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->keepalive_requests,[m
[31m-                              prev->keepalive_requests, 100);[m
[31m-    ngx_conf_merge_uint_value(conf->lingering_close,[m
[31m-                              prev->lingering_close, NGX_HTTP_LINGERING_ON);[m
[31m-    ngx_conf_merge_msec_value(conf->lingering_time,[m
[31m-                              prev->lingering_time, 30000);[m
[31m-    ngx_conf_merge_msec_value(conf->lingering_timeout,[m
[31m-                              prev->lingering_timeout, 5000);[m
[31m-    ngx_conf_merge_msec_value(conf->resolver_timeout,[m
[31m-                              prev->resolver_timeout, 30000);[m
[31m-[m
[31m-    if (conf->resolver == NULL) {[m
[31m-[m
[31m-        if (prev->resolver == NULL) {[m
[31m-[m
[31m-            /*[m
[31m-             * create dummy resolver in http {} context[m
[31m-             * to inherit it in all servers[m
[31m-             */[m
[31m-[m
[31m-            prev->resolver = ngx_resolver_create(cf, NULL, 0);[m
[31m-            if (prev->resolver == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        conf->resolver = prev->resolver;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->client_body_temp_path,[m
[31m-                              prev->client_body_temp_path,[m
[31m-                              &ngx_http_client_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->reset_timedout_connection,[m
[31m-                              prev->reset_timedout_connection, 0);[m
[31m-    ngx_conf_merge_value(conf->server_name_in_redirect,[m
[31m-                              prev->server_name_in_redirect, 0);[m
[31m-    ngx_conf_merge_value(conf->port_in_redirect, prev->port_in_redirect, 1);[m
[31m-    ngx_conf_merge_value(conf->msie_padding, prev->msie_padding, 1);[m
[31m-    ngx_conf_merge_value(conf->msie_refresh, prev->msie_refresh, 0);[m
[31m-    ngx_conf_merge_value(conf->log_not_found, prev->log_not_found, 1);[m
[31m-    ngx_conf_merge_value(conf->log_subrequest, prev->log_subrequest, 0);[m
[31m-    ngx_conf_merge_value(conf->recursive_error_pages,[m
[31m-                              prev->recursive_error_pages, 0);[m
[31m-    ngx_conf_merge_value(conf->server_tokens, prev->server_tokens, 1);[m
[31m-    ngx_conf_merge_value(conf->chunked_transfer_encoding,[m
[31m-                              prev->chunked_transfer_encoding, 1);[m
[31m-    ngx_conf_merge_value(conf->etag, prev->etag, 1);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->open_file_cache,[m
[31m-                              prev->open_file_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_valid,[m
[31m-                              prev->open_file_cache_valid, 60);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->open_file_cache_min_uses,[m
[31m-                              prev->open_file_cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_errors,[m
[31m-                              prev->open_file_cache_errors, 0);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_events,[m
[31m-                              prev->open_file_cache_events, 0);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->gzip_vary, prev->gzip_vary, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->gzip_http_version, prev->gzip_http_version,[m
[31m-                              NGX_HTTP_VERSION_11);[m
[31m-    ngx_conf_merge_bitmask_value(conf->gzip_proxied, prev->gzip_proxied,[m
[31m-                              (NGX_CONF_BITMASK_SET|NGX_HTTP_GZIP_PROXIED_OFF));[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_conf_merge_ptr_value(conf->gzip_disable, prev->gzip_disable, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->gzip_disable_msie6 == 3) {[m
[31m-        conf->gzip_disable_msie6 =[m
[31m-            (prev->gzip_disable_msie6 == 3) ? 0 : prev->gzip_disable_msie6;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-    if (conf->gzip_disable_degradation == 3) {[m
[31m-        conf->gzip_disable_degradation =[m
[31m-            (prev->gzip_disable_degradation == 3) ?[m
[31m-                 0 : prev->gzip_disable_degradation;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    ngx_conf_merge_uint_value(conf->disable_symlinks, prev->disable_symlinks,[m
[31m-                              NGX_DISABLE_SYMLINKS_OFF);[m
[31m-    ngx_conf_merge_ptr_value(conf->disable_symlinks_from,[m
[31m-                             prev->disable_symlinks_from, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *cscf = conf;[m
[31m-[m
[31m-    ngx_str_t              *value, size;[m
[31m-    ngx_url_t               u;[m
[31m-    ngx_uint_t              n;[m
[31m-    ngx_http_listen_opt_t   lsopt;[m
[31m-[m
[31m-    cscf->listen = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.listen = 1;[m
[31m-    u.default_port = 80;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in \"%V\" of the \"listen\" directive",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));[m
[31m-[m
[31m-    ngx_memcpy(&lsopt.u.sockaddr, u.sockaddr, u.socklen);[m
[31m-[m
[31m-    lsopt.socklen = u.socklen;[m
[31m-    lsopt.backlog = NGX_LISTEN_BACKLOG;[m
[31m-    lsopt.rcvbuf = -1;[m
[31m-    lsopt.sndbuf = -1;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    lsopt.setfib = -1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    lsopt.fastopen = -1;[m
[31m-#endif[m
[31m-    lsopt.wildcard = u.wildcard;[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    lsopt.ipv6only = 1;[m
[31m-#endif[m
[31m-[m
[31m-    (void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.socklen, lsopt.addr,[m
[31m-                         NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-    for (n = 2; n < cf->args->nelts; n++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "default_server") == 0[m
[31m-            || ngx_strcmp(value[n].data, "default") == 0)[m
[31m-        {[m
[31m-            lsopt.default_server = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "bind") == 0) {[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        if (ngx_strncmp(value[n].data, "setfib=", 7) == 0) {[m
[31m-            lsopt.setfib = ngx_atoi(value[n].data + 7, value[n].len - 7);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.setfib == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid setfib \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        if (ngx_strncmp(value[n].data, "fastopen=", 9) == 0) {[m
[31m-            lsopt.fastopen = ngx_atoi(value[n].data + 9, value[n].len - 9);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.fastopen == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid fastopen \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "backlog=", 8) == 0) {[m
[31m-            lsopt.backlog = ngx_atoi(value[n].data + 8, value[n].len - 8);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.backlog == NGX_ERROR || lsopt.backlog == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid backlog \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "rcvbuf=", 7) == 0) {[m
[31m-            size.len = value[n].len - 7;[m
[31m-            size.data = value[n].data + 7;[m
[31m-[m
[31m-            lsopt.rcvbuf = ngx_parse_size(&size);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.rcvbuf == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid rcvbuf \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "sndbuf=", 7) == 0) {[m
[31m-            size.len = value[n].len - 7;[m
[31m-            size.data = value[n].data + 7;[m
[31m-[m
[31m-            lsopt.sndbuf = ngx_parse_size(&size);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.sndbuf == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid sndbuf \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "accept_filter=", 14) == 0) {[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-            lsopt.accept_filter = (char *) &value[n].data[14];[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "accept filters \"%V\" are not supported "[m
[31m-                               "on this platform, ignored",[m
[31m-                               &value[n]);[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "deferred") == 0) {[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-            lsopt.deferred_accept = 1;[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the deferred accept is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "ipv6only=o", 10) == 0) {[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            struct sockaddr  *sa;[m
[31m-[m
[31m-            sa = &lsopt.u.sockaddr;[m
[31m-[m
[31m-            if (sa->sa_family == AF_INET6) {[m
[31m-[m
[31m-                if (ngx_strcmp(&value[n].data[10], "n") == 0) {[m
[31m-                    lsopt.ipv6only = 1;[m
[31m-[m
[31m-                } else if (ngx_strcmp(&value[n].data[10], "ff") == 0) {[m
[31m-                    lsopt.ipv6only = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid ipv6only flags \"%s\"",[m
[31m-                                       &value[n].data[9]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                lsopt.set = 1;[m
[31m-                lsopt.bind = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "ipv6only is not supported "[m
[31m-                                   "on addr \"%s\", ignored", lsopt.addr);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "ipv6only is not supported "[m
[31m-                               "on this platform");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "reuseport") == 0) {[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            lsopt.reuseport = 1;[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "reuseport is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "ssl") == 0) {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            lsopt.ssl = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"ssl\" parameter requires "[m
[31m-                               "ngx_http_ssl_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "http2") == 0) {[m
[31m-#if (NGX_HTTP_V2)[m
[31m-            lsopt.http2 = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"http2\" parameter requires "[m
[31m-                               "ngx_http_v2_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "spdy") == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "invalid parameter \"spdy\": "[m
[31m-                               "ngx_http_spdy_module was superseded "[m
[31m-                               "by ngx_http_v2_module");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "so_keepalive=", 13) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[n].data[13], "on") == 0) {[m
[31m-                lsopt.so_keepalive = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[n].data[13], "off") == 0) {[m
[31m-                lsopt.so_keepalive = 2;[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-                u_char     *p, *end;[m
[31m-                ngx_str_t   s;[m
[31m-[m
[31m-                end = value[n].data + value[n].len;[m
[31m-                s.data = value[n].data + 13;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepidle = ngx_parse_time(&s, 1);[m
[31m-                    if (lsopt.tcp_keepidle == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepintvl = ngx_parse_time(&s, 1);[m
[31m-                    if (lsopt.tcp_keepintvl == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                if (s.data < end) {[m
[31m-                    s.len = end - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepcnt = ngx_atoi(s.data, s.len);[m
[31m-                    if (lsopt.tcp_keepcnt == NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (lsopt.tcp_keepidle == 0 && lsopt.tcp_keepintvl == 0[m
[31m-                    && lsopt.tcp_keepcnt == 0)[m
[31m-                {[m
[31m-                    goto invalid_so_keepalive;[m
[31m-                }[m
[31m-[m
[31m-                lsopt.so_keepalive = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"so_keepalive\" parameter accepts "[m
[31m-                                   "only \"on\" or \"off\" on this platform");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-        invalid_so_keepalive:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid so_keepalive value: \"%s\"",[m
[31m-                               &value[n].data[13]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "proxy_protocol") == 0) {[m
[31m-            lsopt.proxy_protocol = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[n]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_add_listen(cf, cscf, &lsopt) == NGX_OK) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *cscf = conf;[m
[31m-[m
[31m-    u_char                   ch;[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        ch = value[i].data[0];[m
[31m-[m
[31m-        if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.'))[m
[31m-            || (ch == '.' && value[i].len < 2))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "server name \"%V\" is invalid", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strchr(value[i].data, '/')) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "server name \"%V\" has suspicious symbols",[m
[31m-                               &value[i]);[m
[31m-        }[m
[31m-[m
[31m-        sn = ngx_array_push(&cscf->server_names);[m
[31m-        if (sn == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        sn->regex = NULL;[m
[31m-#endif[m
[31m-        sn->server = cscf;[m
[31m-[m
[31m-        if (ngx_strcasecmp(value[i].data, (u_char *) "$hostname") == 0) {[m
[31m-            sn->name = cf->cycle->hostname;[m
[31m-[m
[31m-        } else {[m
[31m-            sn->name = value[i];[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].data[0] != '~') {[m
[31m-            ngx_strlow(sn->name.data, sn->name.data, sn->name.len);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        {[m
[31m-        u_char               *p;[m
[31m-        ngx_regex_compile_t   rc;[m
[31m-        u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-        if (value[i].len == 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "empty regex in server name \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value[i].len--;[m
[31m-        value[i].data++;[m
[31m-[m
[31m-        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-        rc.pattern = value[i];[m
[31m-        rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-        rc.err.data = errstr;[m
[31m-[m
[31m-        for (p = value[i].data; p < value[i].data + value[i].len; p++) {[m
[31m-            if (*p >= 'A' && *p <= 'Z') {[m
[31m-                rc.options = NGX_REGEX_CASELESS;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        sn->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-        if (sn->regex == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sn->name = value[i];[m
[31m-        cscf->captures = (rc.captures > 0);[m
[31m-        }[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "using regex \"%V\" "[m
[31m-                           "requires PCRE library", &value[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_int_t                   alias;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    alias = (cmd->name.len == sizeof("alias") - 1) ? 1 : 0;[m
[31m-[m
[31m-    if (clcf->root.data) {[m
[31m-[m
[31m-        if ((clcf->alias != 0) == alias) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" directive is duplicate",[m
[31m-                               &cmd->name);[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" directive is duplicate, "[m
[31m-                               "\"%s\" directive was specified earlier",[m
[31m-                               &cmd->name, clcf->alias ? "alias" : "root");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->named && alias) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the \"alias\" directive cannot be used "[m
[31m-                           "inside the named location");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strstr(value[1].data, "$document_root")[m
[31m-        || ngx_strstr(value[1].data, "${document_root}"))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the $document_root variable cannot be used "[m
[31m-                           "in the \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstr(value[1].data, "$realpath_root")[m
[31m-        || ngx_strstr(value[1].data, "${realpath_root}"))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the $realpath_root variable cannot be used "[m
[31m-                           "in the \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->alias = alias ? clcf->name.len : 0;[m
[31m-    clcf->root = value[1];[m
[31m-[m
[31m-    if (!alias && clcf->root.len > 0[m
[31m-        && clcf->root.data[clcf->root.len - 1] == '/')[m
[31m-    {[m
[31m-        clcf->root.len--;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->root.data[0] != '$') {[m
[31m-        if (ngx_conf_full_name(cf->cycle, &clcf->root, 0) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&clcf->root);[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-    sc.variables = n;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (alias && clcf->regex) {[m
[31m-        clcf->alias = NGX_MAX_SIZE_T_VALUE;[m
[31m-        n = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (n) {[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &clcf->root;[m
[31m-        sc.lengths = &clcf->root_lengths;[m
[31m-        sc.values = &clcf->root_values;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_method_name_t  ngx_methods_names[] = {[m
[31m-    { (u_char *) "GET",       (uint32_t) ~NGX_HTTP_GET },[m
[31m-    { (u_char *) "HEAD",      (uint32_t) ~NGX_HTTP_HEAD },[m
[31m-    { (u_char *) "POST",      (uint32_t) ~NGX_HTTP_POST },[m
[31m-    { (u_char *) "PUT",       (uint32_t) ~NGX_HTTP_PUT },[m
[31m-    { (u_char *) "DELETE",    (uint32_t) ~NGX_HTTP_DELETE },[m
[31m-    { (u_char *) "MKCOL",     (uint32_t) ~NGX_HTTP_MKCOL },[m
[31m-    { (u_char *) "COPY",      (uint32_t) ~NGX_HTTP_COPY },[m
[31m-    { (u_char *) "MOVE",      (uint32_t) ~NGX_HTTP_MOVE },[m
[31m-    { (u_char *) "OPTIONS",   (uint32_t) ~NGX_HTTP_OPTIONS },[m
[31m-    { (u_char *) "PROPFIND",  (uint32_t) ~NGX_HTTP_PROPFIND },[m
[31m-    { (u_char *) "PROPPATCH", (uint32_t) ~NGX_HTTP_PROPPATCH },[m
[31m-    { (u_char *) "LOCK",      (uint32_t) ~NGX_HTTP_LOCK },[m
[31m-    { (u_char *) "UNLOCK",    (uint32_t) ~NGX_HTTP_UNLOCK },[m
[31m-    { (u_char *) "PATCH",     (uint32_t) ~NGX_HTTP_PATCH },[m
[31m-    { NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_limit_except(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *pclcf = conf;[m
[31m-[m
[31m-    char                      *rv;[m
[31m-    void                      *mconf;[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_conf_t                 save;[m
[31m-    ngx_http_module_t         *module;[m
[31m-    ngx_http_conf_ctx_t       *ctx, *pctx;[m
[31m-    ngx_http_method_name_t    *name;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (pclcf->limit_except) {[m
[31m-        return "duplicate";[m
[31m-    }[m
[31m-[m
[31m-    pclcf->limit_except = 0xffffffff;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        for (name = ngx_methods_names; name->name; name++) {[m
[31m-[m
[31m-            if (ngx_strcasecmp(value[i].data, name->name) == 0) {[m
[31m-                pclcf->limit_except &= name->method;[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid method \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    if (!(pclcf->limit_except & NGX_HTTP_GET)) {[m
[31m-        pclcf->limit_except &= (uint32_t) ~NGX_HTTP_HEAD;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    pclcf->limit_except_loc_conf = ctx->loc_conf;[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-    clcf->name = pclcf->name;[m
[31m-    clcf->noname = 1;[m
[31m-    clcf->lmt_excpt = 1;[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_LMT_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_set_aio(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->aio != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    clcf->thread_pool = NULL;[m
[31m-    clcf->thread_pool_value = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        clcf->aio = NGX_HTTP_AIO_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-        clcf->aio = NGX_HTTP_AIO_ON;[m
[31m-        return NGX_CONF_OK;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"aio on\" "[m
[31m-                           "is unsupported on this platform");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "sendfile") == 0) {[m
[31m-        clcf->aio = NGX_HTTP_AIO_ON;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "the \"sendfile\" parameter of "[m
[31m-                           "the \"aio\" directive is deprecated");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "threads", 7) == 0[m
[31m-        && (value[1].len == 7 || value[1].data[7] == '='))[m
[31m-    {[m
[31m-#if (NGX_THREADS)[m
[31m-        ngx_str_t                          name;[m
[31m-        ngx_thread_pool_t                 *tp;[m
[31m-        ngx_http_complex_value_t           cv;[m
[31m-        ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-        clcf->aio = NGX_HTTP_AIO_THREADS;[m
[31m-[m
[31m-        if (value[1].len >= 8) {[m
[31m-            name.len = value[1].len - 8;[m
[31m-            name.data = value[1].data + 8;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &name;[m
[31m-            ccv.complex_value = &cv;[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (cv.lengths != NULL) {[m
[31m-                clcf->thread_pool_value = ngx_palloc(cf->pool,[m
[31m-                                    sizeof(ngx_http_complex_value_t));[m
[31m-                if (clcf->thread_pool_value == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                *clcf->thread_pool_value = cv;[m
[31m-[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            tp = ngx_thread_pool_add(cf, &name);[m
[31m-[m
[31m-        } else {[m
[31m-            tp = ngx_thread_pool_add(cf, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf->thread_pool = tp;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"aio threads\" "[m
[31m-                           "is unsupported on this platform");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return "invalid value";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->directio != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        clcf->directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf->directio = ngx_parse_offset(&value[1]);[m
[31m-    if (clcf->directio == (off_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_int_t                          overwrite;[m
[31m-    ngx_str_t                         *value, uri, args;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_http_err_page_t               *err;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return "conflicts with \"no_error_pages\"";[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->error_pages == NGX_CONF_UNSET_PTR) {[m
[31m-        clcf->error_pages = ngx_array_create(cf->pool, 4,[m
[31m-                                             sizeof(ngx_http_err_page_t));[m
[31m-        if (clcf->error_pages == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    i = cf->args->nelts - 2;[m
[31m-[m
[31m-    if (value[i].data[0] == '=') {[m
[31m-        if (i == 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > 1) {[m
[31m-            overwrite = ngx_atoi(&value[i].data[1], value[i].len - 1);[m
[31m-[m
[31m-            if (overwrite == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            overwrite = 0;[m
[31m-        }[m
[31m-[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        overwrite = -1;[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    uri = value[cf->args->nelts - 1];[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &uri;[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_null(&args);[m
[31m-[m
[31m-    if (cv.lengths == NULL && uri.len && uri.data[0] == '/') {[m
[31m-        p = (u_char *) ngx_strchr(uri.data, '?');[m
[31m-[m
[31m-        if (p) {[m
[31m-            cv.value.len = p - uri.data;[m
[31m-            cv.value.data = uri.data;[m
[31m-            p++;[m
[31m-            args.len = (uri.data + uri.len) - p;[m
[31m-            args.data = p;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts - n; i++) {[m
[31m-        err = ngx_array_push(clcf->error_pages);[m
[31m-        if (err == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        err->status = ngx_atoi(value[i].data, value[i].len);[m
[31m-[m
[31m-        if (err->status == NGX_ERROR || err->status == 499) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (err->status < 300 || err->status > 599) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "value \"%V\" must be between 300 and 599",[m
[31m-                               &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        err->overwrite = overwrite;[m
[31m-[m
[31m-        if (overwrite == -1) {[m
[31m-            switch (err->status) {[m
[31m-                case NGX_HTTP_TO_HTTPS:[m
[31m-                case NGX_HTTPS_CERT_ERROR:[m
[31m-                case NGX_HTTPS_NO_CERT:[m
[31m-                    err->overwrite = NGX_HTTP_BAD_REQUEST;[m
[31m-                default:[m
[31m-                    break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        err->value = cv;[m
[31m-        err->args = args;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->error_pages != NGX_CONF_UNSET_PTR) {[m
[31m-        return "conflicts with \"error_page\"";[m
[31m-    }[m
[31m-[m
[31m-    clcf->error_pages = NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_int_t                   code;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_try_file_t        *tf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    if (clcf->try_files) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    cmcf->try_files = 1;[m
[31m-[m
[31m-    tf = ngx_pcalloc(cf->pool, cf->args->nelts * sizeof(ngx_http_try_file_t));[m
[31m-    if (tf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->try_files = tf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 0; i < cf->args->nelts - 1; i++) {[m
[31m-[m
[31m-        tf[i].name = value[i + 1];[m
[31m-[m
[31m-        if (tf[i].name.len > 0[m
[31m-            && tf[i].name.data[tf[i].name.len - 1] == '/'[m
[31m-            && i + 2 < cf->args->nelts)[m
[31m-        {[m
[31m-            tf[i].test_dir = 1;[m
[31m-            tf[i].name.len--;[m
[31m-            tf[i].name.data[tf[i].name.len] = '\0';[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_http_script_variables_count(&tf[i].name);[m
[31m-[m
[31m-        if (n) {[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &tf[i].name;[m
[31m-            sc.lengths = &tf[i].lengths;[m
[31m-            sc.values = &tf[i].values;[m
[31m-            sc.variables = n;[m
[31m-            sc.complete_lengths = 1;[m
[31m-            sc.complete_values = 1;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* add trailing '\0' to length */[m
[31m-            tf[i].name.len++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (tf[i - 1].name.data[0] == '=') {[m
[31m-[m
[31m-        code = ngx_atoi(tf[i - 1].name.data + 1, tf[i - 1].name.len - 2);[m
[31m-[m
[31m-        if (code == NGX_ERROR || code > 999) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid code \"%*s\"",[m
[31m-                               tf[i - 1].name.len - 1, tf[i - 1].name.data);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tf[i].code = code;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    time_t       inactive;[m
[31m-    ngx_str_t   *value, s;[m
[31m-    ngx_int_t    max;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (clcf->open_file_cache != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    max = 0;[m
[31m-    inactive = 60;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", 4) == 0) {[m
[31m-[m
[31m-            max = ngx_atoi(value[i].data + 4, value[i].len - 4);[m
[31m-            if (max <= 0) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-[m
[31m-            clcf->open_file_cache = NULL;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    failed:[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid \"open_file_cache\" parameter \"%V\"",[m
[31m-                           &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->open_file_cache == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (max == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "\"open_file_cache\" must have the \"max\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive);[m
[31m-    if (clcf->open_file_cache) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &clcf->error_log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->keepalive_timeout != NGX_CONF_UNSET_MSEC) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    clcf->keepalive_timeout = ngx_parse_time(&value[1], 0);[m
[31m-[m
[31m-    if (clcf->keepalive_timeout == (ngx_msec_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf->keepalive_header = ngx_parse_time(&value[2], 1);[m
[31m-[m
[31m-    if (clcf->keepalive_header == (time_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_internal(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    if (clcf->internal != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf->internal = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->resolver) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    clcf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);[m
[31m-    if (clcf->resolver == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf = conf;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_regex_elt_t      *re;[m
[31m-    ngx_regex_compile_t   rc;[m
[31m-    u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    if (clcf->gzip_disable == NGX_CONF_UNSET_PTR) {[m
[31m-        clcf->gzip_disable = ngx_array_create(cf->pool, 2,[m
[31m-                                              sizeof(ngx_regex_elt_t));[m
[31m-        if (clcf->gzip_disable == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "msie6") == 0) {[m
[31m-            clcf->gzip_disable_msie6 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "degradation") == 0) {[m
[31m-            clcf->gzip_disable_degradation = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        re = ngx_array_push(clcf->gzip_disable);[m
[31m-        if (re == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc.pattern = value[i];[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-[m
[31m-        if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        re->regex = rc.regex;[m
[31m-        re->name = value[i].data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (ngx_strcmp(value[i].data, "msie6") == 0) {[m
[31m-            clcf->gzip_disable_msie6 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "degradation") == 0) {[m
[31m-            clcf->gzip_disable_degradation = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "without PCRE library \"gzip_disable\" supports "[m
[31m-                           "builtin \"msie6\" and \"degradation\" mask only");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_disable_symlinks(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (clcf->disable_symlinks != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_OFF;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "if_not_owner") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_NOTOWNER;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "on") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_ON;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "from=", 5) == 0) {[m
[31m-            value[i].len -= 5;[m
[31m-            value[i].data += 5;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &value[i];[m
[31m-            ccv.complex_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_complex_value_t));[m
[31m-            if (ccv.complex_value == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            clcf->disable_symlinks_from = ccv.complex_value;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks == NGX_CONF_UNSET_UINT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"off\", \"on\" "[m
[31m-                           "or \"if_not_owner\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        clcf->disable_symlinks_from = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks_from == NGX_CONF_UNSET_PTR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate parameters \"%V %V\"",[m
[31m-                           &value[1], &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"from=\" cannot be used with \"off\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_pool_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp < NGX_MIN_POOL_SIZE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be no less than %uz",[m
[31m-                           NGX_MIN_POOL_SIZE);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*sp % NGX_POOL_ALIGNMENT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be a multiple of %uz",[m
[31m-                           NGX_POOL_ALIGNMENT);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 0e1c34a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,5435 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char    *name;[m
[31m-    uint32_t   method;[m
[31m-} ngx_http_method_name_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_OFF    0[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_ON     1[m
[31m-#define NGX_HTTP_REQUEST_BODY_FILE_CLEAN  2[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_core_find_static_location(ngx_http_request_t *r,[m
[31m-    ngx_http_location_tree_node_t *node);[m
[31m-[m
[31m-static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_core_postconfiguration(ngx_conf_t *cf);[m
[31m-static void *ngx_http_core_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_core_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_merge_srv_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static void *ngx_http_core_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_core_merge_loc_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static char *ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static ngx_int_t ngx_http_core_regex_location(ngx_conf_t *cf,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *regex, ngx_uint_t caseless);[m
[31m-[m
[31m-static char *ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy,[m
[31m-    void *conf);[m
[31m-[m
[31m-static char *ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_http_core_limit_except(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_set_aio(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_internal(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae);[m
[31m-static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last);[m
[31m-static char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r,[m
[31m-    ngx_addr_t *addr, u_char *xff, size_t xfflen, ngx_array_t *proxies,[m
[31m-    int recursive);[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-static char *ngx_http_disable_symlinks(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-#endif[m
[31m-[m
[31m-static char *ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_core_pool_size(ngx_conf_t *cf, void *post, void *data);[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_core_lowat_post =[m
[31m-    { ngx_http_core_lowat_check };[m
[31m-[m
[31m-static ngx_conf_post_handler_pt  ngx_http_core_pool_size_p =[m
[31m-    ngx_http_core_pool_size;[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_request_body_in_file[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_REQUEST_BODY_FILE_ON },[m
[31m-    { ngx_string("clean"), NGX_HTTP_REQUEST_BODY_FILE_CLEAN },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_satisfy[] = {[m
[31m-    { ngx_string("all"), NGX_HTTP_SATISFY_ALL },[m
[31m-    { ngx_string("any"), NGX_HTTP_SATISFY_ANY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_lingering_close[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_LINGERING_OFF },[m
[31m-    { ngx_string("on"), NGX_HTTP_LINGERING_ON },[m
[31m-    { ngx_string("always"), NGX_HTTP_LINGERING_ALWAYS },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_core_if_modified_since[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_IMS_OFF },[m
[31m-    { ngx_string("exact"), NGX_HTTP_IMS_EXACT },[m
[31m-    { ngx_string("before"), NGX_HTTP_IMS_BEFORE },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_core_keepalive_disable[] = {[m
[31m-    { ngx_string("none"), NGX_HTTP_KEEPALIVE_DISABLE_NONE },[m
[31m-    { ngx_string("msie6"), NGX_HTTP_KEEPALIVE_DISABLE_MSIE6 },[m
[31m-    { ngx_string("safari"), NGX_HTTP_KEEPALIVE_DISABLE_SAFARI },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_path_init_t  ngx_http_client_temp_path = {[m
[31m-    ngx_string(NGX_HTTP_CLIENT_TEMP_PATH), { 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_http_gzip_http_version[] = {[m
[31m-    { ngx_string("1.0"), NGX_HTTP_VERSION_10 },[m
[31m-    { ngx_string("1.1"), NGX_HTTP_VERSION_11 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_gzip_proxied_mask[] = {[m
[31m-    { ngx_string("off"), NGX_HTTP_GZIP_PROXIED_OFF },[m
[31m-    { ngx_string("expired"), NGX_HTTP_GZIP_PROXIED_EXPIRED },[m
[31m-    { ngx_string("no-cache"), NGX_HTTP_GZIP_PROXIED_NO_CACHE },[m
[31m-    { ngx_string("no-store"), NGX_HTTP_GZIP_PROXIED_NO_STORE },[m
[31m-    { ngx_string("private"), NGX_HTTP_GZIP_PROXIED_PRIVATE },[m
[31m-    { ngx_string("no_last_modified"), NGX_HTTP_GZIP_PROXIED_NO_LM },[m
[31m-    { ngx_string("no_etag"), NGX_HTTP_GZIP_PROXIED_NO_ETAG },[m
[31m-    { ngx_string("auth"), NGX_HTTP_GZIP_PROXIED_AUTH },[m
[31m-    { ngx_string("any"), NGX_HTTP_GZIP_PROXIED_ANY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_gzip_no_cache = ngx_string("no-cache");[m
[31m-static ngx_str_t  ngx_http_gzip_no_store = ngx_string("no-store");[m
[31m-static ngx_str_t  ngx_http_gzip_private = ngx_string("private");[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("variables_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, variables_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("variables_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, variables_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_names_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, server_names_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_names_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_main_conf_t, server_names_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_server,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("connection_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, connection_pool_size),[m
[31m-      &ngx_http_core_pool_size_p },[m
[31m-[m
[31m-    { ngx_string("request_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, request_pool_size),[m
[31m-      &ngx_http_core_pool_size_p },[m
[31m-[m
[31m-    { ngx_string("client_header_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, client_header_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_header_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, client_header_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("large_client_header_buffers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_conf_set_bufs_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, large_client_header_buffers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ignore_invalid_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, ignore_invalid_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("merge_slashes"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, merge_slashes),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("underscores_in_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_srv_conf_t, underscores_in_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("location"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_location,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("listen"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_listen,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_server_name,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types_hash_max_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, types_hash_max_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types_hash_bucket_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, types_hash_bucket_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("types"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                                          |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_types,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("default_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, default_type),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("root"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("alias"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_root,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_except"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_limit_except,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_max_body_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_max_body_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_temp_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234,[m
[31m-      ngx_conf_set_path_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_temp_path),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("client_body_in_file_only"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_in_file_only),[m
[31m-      &ngx_http_core_request_body_in_file },[m
[31m-[m
[31m-    { ngx_string("client_body_in_single_buffer"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, client_body_in_single_buffer),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sendfile"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, sendfile),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("sendfile_max_chunk"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, sendfile_max_chunk),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("aio"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_set_aio,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("aio_write"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, aio_write),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("read_ahead"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, read_ahead),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("directio"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_core_directio,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("directio_alignment"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_off_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, directio_alignment),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nopush"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, tcp_nopush),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nodelay"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, tcp_nodelay),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, send_lowat),[m
[31m-      &ngx_http_core_lowat_post },[m
[31m-[m
[31m-    { ngx_string("postpone_output"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, postpone_output),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_rate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, limit_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_rate_after"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, limit_rate_after),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_keepalive,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_requests"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, keepalive_requests),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("keepalive_disable"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, keepalive_disable),[m
[31m-      &ngx_http_core_keepalive_disable },[m
[31m-[m
[31m-    { ngx_string("satisfy"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, satisfy),[m
[31m-      &ngx_http_core_satisfy },[m
[31m-[m
[31m-    { ngx_string("internal"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_internal,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lingering_close"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_close),[m
[31m-      &ngx_http_core_lingering_close },[m
[31m-[m
[31m-    { ngx_string("lingering_time"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_time),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lingering_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, lingering_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("reset_timedout_connection"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, reset_timedout_connection),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name_in_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, server_name_in_redirect),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("port_in_redirect"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, port_in_redirect),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("msie_padding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, msie_padding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("msie_refresh"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, msie_refresh),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_not_found"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, log_not_found),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("log_subrequest"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, log_subrequest),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("recursive_error_pages"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, recursive_error_pages),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_tokens"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, server_tokens),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("if_modified_since"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, if_modified_since),[m
[31m-      &ngx_http_core_if_modified_since },[m
[31m-[m
[31m-    { ngx_string("max_ranges"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, max_ranges),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("chunked_transfer_encoding"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, chunked_transfer_encoding),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("etag"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, etag),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_page"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_2MORE,[m
[31m-      ngx_http_core_error_page,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("no_error_pages"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_NOARGS,[m
[31m-      ngx_http_core_no_error_pages,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("try_files"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_http_core_try_files,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("post_action"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, post_action),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_error_log,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_core_open_file_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_valid"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_valid),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_min_uses"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_min_uses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("open_file_cache_events"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, open_file_cache_events),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_core_resolver,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, resolver_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-    { ngx_string("gzip_vary"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_vary),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("gzip_http_version"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_http_version),[m
[31m-      &ngx_http_gzip_http_version },[m
[31m-[m
[31m-    { ngx_string("gzip_proxied"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_core_loc_conf_t, gzip_proxied),[m
[31m-      &ngx_http_gzip_proxied_mask },[m
[31m-[m
[31m-    { ngx_string("gzip_disable"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_gzip_disable,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-    { ngx_string("disable_symlinks"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_http_disable_symlinks,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_core_module_ctx = {[m
[31m-    ngx_http_core_preconfiguration,        /* preconfiguration */[m
[31m-    ngx_http_core_postconfiguration,       /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_core_create_main_conf,        /* create main configuration */[m
[31m-    ngx_http_core_init_main_conf,          /* init main configuration */[m
[31m-[m
[31m-    ngx_http_core_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_http_core_merge_srv_conf,          /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_core_create_loc_conf,         /* create location configuration */[m
[31m-    ngx_http_core_merge_loc_conf           /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_core_module_ctx,             /* module context */[m
[31m-    ngx_http_core_commands,                /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_core_get_method = { 3, (u_char *) "GET" };[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    r->connection->log->action = NULL;[m
[31m-[m
[31m-    r->connection->unexpected_eof = 0;[m
[31m-[m
[31m-    if (!r->internal) {[m
[31m-        switch (r->headers_in.connection_type) {[m
[31m-        case 0:[m
[31m-            r->keepalive = (r->http_version > NGX_HTTP_VERSION_10);[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_CONNECTION_CLOSE:[m
[31m-            r->keepalive = 0;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_CONNECTION_KEEP_ALIVE:[m
[31m-            r->keepalive = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        r->lingering_close = (r->headers_in.content_length_n > 0[m
[31m-                              || r->headers_in.chunked);[m
[31m-        r->phase_handler = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-        r->phase_handler = cmcf->phase_engine.server_rewrite_index;[m
[31m-    }[m
[31m-[m
[31m-    r->valid_location = 1;[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    r->gzip_tested = 0;[m
[31m-    r->gzip_ok = 0;[m
[31m-    r->gzip_vary = 0;[m
[31m-#endif[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    ngx_http_core_run_phases(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_core_run_phases(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_phase_handler_t   *ph;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ph = cmcf->phase_engine.handlers;[m
[31m-[m
[31m-    while (ph[r->phase_handler].checker) {[m
[31m-[m
[31m-        rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_generic_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    /*[m
[31m-     * generic phase checker,[m
[31m-     * used by the post read and pre-access phases[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "generic phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->phase_handler = ph->next;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_rewrite_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "rewrite phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* NGX_OK, NGX_AGAIN, NGX_ERROR, NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_find_config_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     len;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->content_handler = NULL;[m
[31m-    r->uri_changed = 0;[m
[31m-[m
[31m-    rc = ngx_http_core_find_location(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->internal && clcf->internal) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "using configuration \"%s%V\"",[m
[31m-                   (clcf->noname ? "*" : (clcf->exact_match ? "=" : "")),[m
[31m-                   &clcf->name);[m
[31m-[m
[31m-    ngx_http_update_location_config(r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http cl:%O max:%O",[m
[31m-                   r->headers_in.content_length_n, clcf->client_max_body_size);[m
[31m-[m
[31m-    if (r->headers_in.content_length_n != -1[m
[31m-        && !r->discard_body[m
[31m-        && clcf->client_max_body_size[m
[31m-        && clcf->client_max_body_size < r->headers_in.content_length_n)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "client intended to send too large body: %O bytes",[m
[31m-                      r->headers_in.content_length_n);[m
[31m-[m
[31m-        r->expect_tested = 1;[m
[31m-        (void) ngx_http_discard_request_body(r);[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_ENTITY_TOO_LARGE);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * we do not need to set the r->headers_out.location->hash and[m
[31m-         * r->headers_out.location->key fields[m
[31m-         */[m
[31m-[m
[31m-        if (r->args.len == 0) {[m
[31m-            r->headers_out.location->value = clcf->name;[m
[31m-[m
[31m-        } else {[m
[31m-            len = clcf->name.len + 1 + r->args.len;[m
[31m-            p = ngx_pnalloc(r->pool, len);[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            r->headers_out.location->value.len = len;[m
[31m-            r->headers_out.location->value.data = p;[m
[31m-[m
[31m-            p = ngx_cpymem(p, clcf->name.data, clcf->name.len);[m
[31m-            *p++ = '?';[m
[31m-            ngx_memcpy(p, r->args.data, r->args.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_MOVED_PERMANENTLY);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler++;[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_post_rewrite_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post rewrite phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    if (!r->uri_changed) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "uri changes: %d", r->uri_changes);[m
[31m-[m
[31m-    /*[m
[31m-     * gcc before 3.3 compiles the broken code for[m
[31m-     *     if (r->uri_changes-- == 0)[m
[31m-     * if the r->uri_changes is defined as[m
[31m-     *     unsigned  uri_changes:4[m
[31m-     */[m
[31m-[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while processing \"%V\"", &r->uri);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler = ph->next;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_access_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        r->phase_handler = ph->next;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "access phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) {[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->phase_handler++;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->access_code = 0;[m
[31m-[m
[31m-            if (r->headers_out.www_authenticate) {[m
[31m-                r->headers_out.www_authenticate->hash = 0;[m
[31m-            }[m
[31m-[m
[31m-            r->phase_handler = ph->next;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_FORBIDDEN || rc == NGX_HTTP_UNAUTHORIZED) {[m
[31m-            if (r->access_code != NGX_HTTP_UNAUTHORIZED) {[m
[31m-                r->access_code = rc;[m
[31m-            }[m
[31m-[m
[31m-            r->phase_handler++;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_post_access_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    ngx_int_t  access_code;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post access phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    access_code = r->access_code;[m
[31m-[m
[31m-    if (access_code) {[m
[31m-        if (access_code == NGX_HTTP_FORBIDDEN) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "access forbidden by rule");[m
[31m-        }[m
[31m-[m
[31m-        r->access_code = 0;[m
[31m-        ngx_http_finalize_request(r, access_code);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->phase_handler++;[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_try_files_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    size_t                        len, root, alias, reserve, allocated;[m
[31m-    u_char                       *p, *name;[m
[31m-    ngx_str_t                     path, args;[m
[31m-    ngx_uint_t                    test_dir;[m
[31m-    ngx_http_try_file_t          *tf;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "try files phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->try_files == NULL) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    allocated = 0;[m
[31m-    root = 0;[m
[31m-    name = NULL;[m
[31m-    /* suppress MSVC warning */[m
[31m-    path.data = NULL;[m
[31m-[m
[31m-    tf = clcf->try_files;[m
[31m-[m
[31m-    alias = clcf->alias;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (tf->lengths) {[m
[31m-            ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-            e.ip = tf->lengths->elts;[m
[31m-            e.request = r;[m
[31m-[m
[31m-            /* 1 is for terminating '\0' as in static names */[m
[31m-            len = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-                len += lcode(&e);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            len = tf->name.len;[m
[31m-        }[m
[31m-[m
[31m-        if (!alias) {[m
[31m-            reserve = len > r->uri.len ? len - r->uri.len : 0;[m
[31m-[m
[31m-        } else if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            reserve = len;[m
[31m-[m
[31m-        } else {[m
[31m-            reserve = len > r->uri.len - alias ? len - (r->uri.len - alias) : 0;[m
[31m-        }[m
[31m-[m
[31m-        if (reserve > allocated || !allocated) {[m
[31m-[m
[31m-            /* 16 bytes are preallocation */[m
[31m-            allocated = reserve + 16;[m
[31m-[m
[31m-            if (ngx_http_map_uri_to_path(r, &path, &root, allocated) == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            name = path.data + root;[m
[31m-        }[m
[31m-[m
[31m-        if (tf->values == NULL) {[m
[31m-[m
[31m-            /* tf->name.len includes the terminating '\0' */[m
[31m-[m
[31m-            ngx_memcpy(name, tf->name.data, tf->name.len);[m
[31m-[m
[31m-            path.len = (name + tf->name.len - 1) - path.data;[m
[31m-[m
[31m-        } else {[m
[31m-            e.ip = tf->values->elts;[m
[31m-            e.pos = name;[m
[31m-            e.flushed = 1;[m
[31m-[m
[31m-            while (*(uintptr_t *) e.ip) {[m
[31m-                code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-                code((ngx_http_script_engine_t *) &e);[m
[31m-            }[m
[31m-[m
[31m-            path.len = e.pos - path.data;[m
[31m-[m
[31m-            *e.pos = '\0';[m
[31m-[m
[31m-            if (alias && alias != NGX_MAX_SIZE_T_VALUE[m
[31m-                && ngx_strncmp(name, r->uri.data, alias) == 0)[m
[31m-            {[m
[31m-                ngx_memmove(name, name + alias, len - alias);[m
[31m-                path.len -= alias;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        test_dir = tf->test_dir;[m
[31m-[m
[31m-        tf++;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "trying to use %s: \"%s\" \"%s\"",[m
[31m-                       test_dir ? "dir" : "file", name, path.data);[m
[31m-[m
[31m-        if (tf->lengths == NULL && tf->name.len == 0) {[m
[31m-[m
[31m-            if (tf->code) {[m
[31m-                ngx_http_finalize_request(r, tf->code);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            path.len -= root;[m
[31m-            path.data += root;[m
[31m-[m
[31m-            if (path.data[0] == '@') {[m
[31m-                (void) ngx_http_named_location(r, &path);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_http_split_args(r, &path, &args);[m
[31m-[m
[31m-                (void) ngx_http_internal_redirect(r, &path, &args);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_DONE);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-        of.read_ahead = clcf->read_ahead;[m
[31m-        of.directio = clcf->directio;[m
[31m-        of.valid = clcf->open_file_cache_valid;[m
[31m-        of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-        of.test_only = 1;[m
[31m-        of.errors = clcf->open_file_cache_errors;[m
[31m-        of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-        if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            if (of.err != NGX_ENOENT[m
[31m-                && of.err != NGX_ENOTDIR[m
[31m-                && of.err != NGX_ENAMETOOLONG)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                              "%s \"%s\" failed", of.failed, path.data);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (of.is_dir != test_dir) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        path.len -= root;[m
[31m-        path.data += root;[m
[31m-[m
[31m-        if (!alias) {[m
[31m-            r->uri = path;[m
[31m-[m
[31m-        } else if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            if (!test_dir) {[m
[31m-                r->uri = path;[m
[31m-                r->add_uri_to_alias = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            name = r->uri.data;[m
[31m-[m
[31m-            r->uri.len = alias + path.len;[m
[31m-            r->uri.data = ngx_pnalloc(r->pool, r->uri.len);[m
[31m-            if (r->uri.data == NULL) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_copy(r->uri.data, name, alias);[m
[31m-            ngx_memcpy(p, path.data, path.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_exten(r);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "try file uri: \"%V\"", &r->uri);[m
[31m-[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* not reached */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_core_content_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph)[m
[31m-{[m
[31m-    size_t     root;[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_str_t  path;[m
[31m-[m
[31m-    if (r->content_handler) {[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-        ngx_http_finalize_request(r, r->content_handler(r));[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "content phase: %ui", r->phase_handler);[m
[31m-[m
[31m-    rc = ph->handler(r);[m
[31m-[m
[31m-    if (rc != NGX_DECLINED) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    ph++;[m
[31m-[m
[31m-    if (ph->checker) {[m
[31m-        r->phase_handler++;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* no content handler was found */[m
[31m-[m
[31m-    if (r->uri.data[r->uri.len - 1] == '/') {[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) != NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "directory index of \"%s\" is forbidden", path.data);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_FORBIDDEN);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no handler found");[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_update_location_config(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->method & clcf->limit_except) {[m
[31m-        r->loc_conf = clcf->limit_except_loc_conf;[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_io.flags & NGX_IO_SENDFILE) && clcf->sendfile) {[m
[31m-        r->connection->sendfile = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        r->connection->sendfile = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->client_body_in_file_only) {[m
[31m-        r->request_body_in_file_only = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file =[m
[31m-            clcf->client_body_in_file_only == NGX_HTTP_REQUEST_BODY_FILE_CLEAN;[m
[31m-        r->request_body_file_log_level = NGX_LOG_NOTICE;[m
[31m-[m
[31m-    } else {[m
[31m-        r->request_body_file_log_level = NGX_LOG_WARN;[m
[31m-    }[m
[31m-[m
[31m-    r->request_body_in_single_buf = clcf->client_body_in_single_buffer;[m
[31m-[m
[31m-    if (r->keepalive) {[m
[31m-        if (clcf->keepalive_timeout == 0) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->connection->requests >= clcf->keepalive_requests) {[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->headers_in.msie6[m
[31m-                   && r->method == NGX_HTTP_POST[m
[31m-                   && (clcf->keepalive_disable[m
[31m-                       & NGX_HTTP_KEEPALIVE_DISABLE_MSIE6))[m
[31m-        {[m
[31m-            /*[m
[31m-             * MSIE may wait for some time if an response for[m
[31m-             * a POST request was sent over a keepalive connection[m
[31m-             */[m
[31m-            r->keepalive = 0;[m
[31m-[m
[31m-        } else if (r->headers_in.safari[m
[31m-                   && (clcf->keepalive_disable[m
[31m-                       & NGX_HTTP_KEEPALIVE_DISABLE_SAFARI))[m
[31m-        {[m
[31m-            /*[m
[31m-             * Safari may send a POST request to a closed keepalive[m
[31m-             * connection and may stall for some time, see[m
[31m-             *     https://bugs.webkit.org/show_bug.cgi?id=5760[m
[31m-             */[m
[31m-            r->keepalive = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!clcf->tcp_nopush) {[m
[31m-        /* disable TCP_NOPUSH/TCP_CORK use */[m
[31m-        r->connection->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->limit_rate == 0) {[m
[31m-        r->limit_rate = clcf->limit_rate;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->handler) {[m
[31m-        r->content_handler = clcf->handler;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_OK       - exact or regex match[m
[31m- * NGX_DONE     - auto redirect[m
[31m- * NGX_AGAIN    - inclusive match[m
[31m- * NGX_ERROR    - regex error[m
[31m- * NGX_DECLINED - no match[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_find_location(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *pclcf;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                  n;[m
[31m-    ngx_uint_t                 noregex;[m
[31m-    ngx_http_core_loc_conf_t  *clcf, **clcfp;[m
[31m-[m
[31m-    noregex = 0;[m
[31m-#endif[m
[31m-[m
[31m-    pclcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rc = ngx_http_core_find_static_location(r, pclcf->static_locations);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        noregex = clcf->noregex;[m
[31m-#endif[m
[31m-[m
[31m-        /* look up nested locations */[m
[31m-[m
[31m-        rc = ngx_http_core_find_location(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DONE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED or rc == NGX_AGAIN in nested location */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (noregex == 0 && pclcf->regex_locations) {[m
[31m-[m
[31m-        for (clcfp = pclcf->regex_locations; *clcfp; clcfp++) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "test location: ~ \"%V\"", &(*clcfp)->name);[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, (*clcfp)->regex, &r->uri);[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                r->loc_conf = (*clcfp)->loc_conf;[m
[31m-[m
[31m-                /* look up nested locations */[m
[31m-[m
[31m-                rc = ngx_http_core_find_location(r);[m
[31m-[m
[31m-                return (rc == NGX_ERROR) ? rc : NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * NGX_OK       - exact match[m
[31m- * NGX_DONE     - auto redirect[m
[31m- * NGX_AGAIN    - inclusive match[m
[31m- * NGX_DECLINED - no match[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_find_static_location(ngx_http_request_t *r,[m
[31m-    ngx_http_location_tree_node_t *node)[m
[31m-{[m
[31m-    u_char     *uri;[m
[31m-    size_t      len, n;[m
[31m-    ngx_int_t   rc, rv;[m
[31m-[m
[31m-    len = r->uri.len;[m
[31m-    uri = r->uri.data;[m
[31m-[m
[31m-    rv = NGX_DECLINED;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node == NULL) {[m
[31m-            return rv;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "test location: \"%*s\"",[m
[31m-                       (size_t) node->len, node->name);[m
[31m-[m
[31m-        n = (len <= (size_t) node->len) ? len : node->len;[m
[31m-[m
[31m-        rc = ngx_filename_cmp(uri, node->name, n);[m
[31m-[m
[31m-        if (rc != 0) {[m
[31m-            node = (rc < 0) ? node->left : node->right;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len > (size_t) node->len) {[m
[31m-[m
[31m-            if (node->inclusive) {[m
[31m-[m
[31m-                r->loc_conf = node->inclusive->loc_conf;[m
[31m-                rv = NGX_AGAIN;[m
[31m-[m
[31m-                node = node->tree;[m
[31m-                uri += n;[m
[31m-                len -= n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* exact only */[m
[31m-[m
[31m-            node = node->right;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (len == (size_t) node->len) {[m
[31m-[m
[31m-            if (node->exact) {[m
[31m-                r->loc_conf = node->exact->loc_conf;[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            } else {[m
[31m-                r->loc_conf = node->inclusive->loc_conf;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* len < node->len */[m
[31m-[m
[31m-        if (len + 1 == (size_t) node->len && node->auto_redirect) {[m
[31m-[m
[31m-            r->loc_conf = (node->exact) ? node->exact->loc_conf:[m
[31m-                                          node->inclusive->loc_conf;[m
[31m-            rv = NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        node = node->left;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash)[m
[31m-{[m
[31m-    u_char      c, *lowcase;[m
[31m-    size_t      len;[m
[31m-    ngx_uint_t  i, hash;[m
[31m-[m
[31m-    if (types_hash->size == 0) {[m
[31m-        return (void *) 4;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    len = r->headers_out.content_type_len;[m
[31m-[m
[31m-    if (r->headers_out.content_type_lowcase == NULL) {[m
[31m-[m
[31m-        lowcase = ngx_pnalloc(r->pool, len);[m
[31m-        if (lowcase == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_lowcase = lowcase;[m
[31m-[m
[31m-        hash = 0;[m
[31m-[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            c = ngx_tolower(r->headers_out.content_type.data[i]);[m
[31m-            hash = ngx_hash(hash, c);[m
[31m-            lowcase[i] = c;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_hash = hash;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_hash_find(types_hash, r->headers_out.content_type_hash,[m
[31m-                         r->headers_out.content_type_lowcase, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_content_type(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                     c, *exten;[m
[31m-    ngx_str_t                 *type;[m
[31m-    ngx_uint_t                 i, hash;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->exten.len) {[m
[31m-[m
[31m-        hash = 0;[m
[31m-[m
[31m-        for (i = 0; i < r->exten.len; i++) {[m
[31m-            c = r->exten.data[i];[m
[31m-[m
[31m-            if (c >= 'A' && c <= 'Z') {[m
[31m-[m
[31m-                exten = ngx_pnalloc(r->pool, r->exten.len);[m
[31m-                if (exten == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                hash = ngx_hash_strlow(exten, r->exten.data, r->exten.len);[m
[31m-[m
[31m-                r->exten.data = exten;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            hash = ngx_hash(hash, c);[m
[31m-        }[m
[31m-[m
[31m-        type = ngx_hash_find(&clcf->types_hash, hash,[m
[31m-                             r->exten.data, r->exten.len);[m
[31m-[m
[31m-        if (type) {[m
[31m-            r->headers_out.content_type_len = type->len;[m
[31m-            r->headers_out.content_type = *type;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type_len = clcf->default_type.len;[m
[31m-    r->headers_out.content_type = clcf->default_type;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_set_exten(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    ngx_str_null(&r->exten);[m
[31m-[m
[31m-    for (i = r->uri.len - 1; i > 1; i--) {[m
[31m-        if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {[m
[31m-[m
[31m-            r->exten.len = r->uri.len - i - 1;[m
[31m-            r->exten.data = &r->uri.data[i + 1];[m
[31m-[m
[31m-            return;[m
[31m-[m
[31m-        } else if (r->uri.data[i] == '/') {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_etag(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t           *etag;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!clcf->etag) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    etag = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (etag == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    etag->hash = 1;[m
[31m-    ngx_str_set(&etag->key, "ETag");[m
[31m-[m
[31m-    etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);[m
[31m-    if (etag->value.data == NULL) {[m
[31m-        etag->hash = 0;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",[m
[31m-                                  r->headers_out.last_modified_time,[m
[31m-                                  r->headers_out.content_length_n)[m
[31m-                      - etag->value.data;[m
[31m-[m
[31m-    r->headers_out.etag = etag;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_weak_etag(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t            len;[m
[31m-    u_char           *p;[m
[31m-    ngx_table_elt_t  *etag;[m
[31m-[m
[31m-    etag = r->headers_out.etag;[m
[31m-[m
[31m-    if (etag == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (etag->value.len > 2[m
[31m-        && etag->value.data[0] == 'W'[m
[31m-        && etag->value.data[1] == '/')[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (etag->value.len < 1 || etag->value.data[0] != '"') {[m
[31m-        r->headers_out.etag->hash = 0;[m
[31m-        r->headers_out.etag = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, etag->value.len + 2);[m
[31m-    if (p == NULL) {[m
[31m-        r->headers_out.etag->hash = 0;[m
[31m-        r->headers_out.etag = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_sprintf(p, "W/%V", &etag->value) - p;[m
[31m-[m
[31m-    etag->value.data = p;[m
[31m-    etag->value.len = len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,[m
[31m-    ngx_str_t *ct, ngx_http_complex_value_t *cv)[m
[31m-{[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_str_t     val;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = status;[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, cv, &val) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (status == NGX_HTTP_MOVED_PERMANENTLY[m
[31m-        || status == NGX_HTTP_MOVED_TEMPORARILY[m
[31m-        || status == NGX_HTTP_SEE_OTHER[m
[31m-        || status == NGX_HTTP_TEMPORARY_REDIRECT)[m
[31m-    {[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.location->hash = 1;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-        r->headers_out.location->value = val;[m
[31m-[m
[31m-        return status;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = val.len;[m
[31m-[m
[31m-    if (ct) {[m
[31m-        r->headers_out.content_type_len = ct->len;[m
[31m-        r->headers_out.content_type = *ct;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_set_content_type(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD || (r != r->main && val.len == 0)) {[m
[31m-        return ngx_http_send_header(r);[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = val.data;[m
[31m-    b->last = val.data + val.len;[m
[31m-    b->memory = val.len ? 1 : 0;[m
[31m-    b->last_buf = (r == r->main) ? 1 : 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->post_action) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "header already sent");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        r->headers_out.status = r->err_status;[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_top_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http output filter \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    rc = ngx_http_top_body_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        /* NGX_ERROR may be returned by any filter */[m
[31m-        c->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *path,[m
[31m-    size_t *root_length, size_t reserved)[m
[31m-{[m
[31m-    u_char                    *last;[m
[31m-    size_t                     alias;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    alias = clcf->alias;[m
[31m-[m
[31m-    if (alias && !r->valid_location) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "\"alias\" cannot be used in location \"%V\" "[m
[31m-                      "where URI was rewritten", &clcf->name);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->root_lengths == NULL) {[m
[31m-[m
[31m-        *root_length = clcf->root.len;[m
[31m-[m
[31m-        path->len = clcf->root.len + reserved + r->uri.len - alias + 1;[m
[31m-[m
[31m-        path->data = ngx_pnalloc(r->pool, path->len);[m
[31m-        if (path->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        last = ngx_copy(path->data, clcf->root.data, clcf->root.len);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            reserved += r->add_uri_to_alias ? r->uri.len + 1 : 1;[m
[31m-[m
[31m-        } else {[m
[31m-            reserved += r->uri.len - alias + 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_script_run(r, path, clcf->root_lengths->elts, reserved,[m
[31m-                                clcf->root_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, path)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        *root_length = path->len - reserved;[m
[31m-        last = path->data + *root_length;[m
[31m-[m
[31m-        if (alias == NGX_MAX_SIZE_T_VALUE) {[m
[31m-            if (!r->add_uri_to_alias) {[m
[31m-                *last = '\0';[m
[31m-                return last;[m
[31m-            }[m
[31m-[m
[31m-            alias = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    last = ngx_cpystrn(last, r->uri.data + alias, r->uri.len - alias + 1);[m
[31m-[m
[31m-    return last;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_auth_basic_user(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t   auth, encoded;[m
[31m-    ngx_uint_t  len;[m
[31m-[m
[31m-    if (r->headers_in.user.len == 0 && r->headers_in.user.data != NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.authorization == NULL) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    encoded = r->headers_in.authorization->value;[m
[31m-[m
[31m-    if (encoded.len < sizeof("Basic ") - 1[m
[31m-        || ngx_strncasecmp(encoded.data, (u_char *) "Basic ",[m
[31m-                           sizeof("Basic ") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    encoded.len -= sizeof("Basic ") - 1;[m
[31m-    encoded.data += sizeof("Basic ") - 1;[m
[31m-[m
[31m-    while (encoded.len && encoded.data[0] == ' ') {[m
[31m-        encoded.len--;[m
[31m-        encoded.data++;[m
[31m-    }[m
[31m-[m
[31m-    if (encoded.len == 0) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    auth.len = ngx_base64_decoded_length(encoded.len);[m
[31m-    auth.data = ngx_pnalloc(r->pool, auth.len + 1);[m
[31m-    if (auth.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&auth, &encoded) != NGX_OK) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    auth.data[auth.len] = '\0';[m
[31m-[m
[31m-    for (len = 0; len < auth.len; len++) {[m
[31m-        if (auth.data[len] == ':') {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0 || len == auth.len) {[m
[31m-        r->headers_in.user.data = (u_char *) "";[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.user.len = len;[m
[31m-    r->headers_in.user.data = auth.data;[m
[31m-    r->headers_in.passwd.len = auth.len - len - 1;[m
[31m-    r->headers_in.passwd.data = &auth.data[len + 1];[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_gzip_ok(ngx_http_request_t *r)[m
[31m-{[m
[31m-    time_t                     date, expires;[m
[31m-    ngx_uint_t                 p;[m
[31m-    ngx_array_t               *cc;[m
[31m-    ngx_table_elt_t           *e, *d, *ae;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->gzip_tested = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ae = r->headers_in.accept_encoding;[m
[31m-    if (ae == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ae->value.len < sizeof("gzip") - 1) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * test first for the most common case "gzip,...":[m
[31m-     *   MSIE:    "gzip, deflate"[m
[31m-     *   Firefox: "gzip,deflate"[m
[31m-     *   Chrome:  "gzip,deflate,sdch"[m
[31m-     *   Safari:  "gzip, deflate"[m
[31m-     *   Opera:   "gzip, deflate"[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_memcmp(ae->value.data, "gzip,", 5) != 0[m
[31m-        && ngx_http_gzip_accept_encoding(&ae->value) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_in.msie6 && clcf->gzip_disable_msie6) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < clcf->gzip_http_version) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.via == NULL) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    p = clcf->gzip_proxied;[m
[31m-[m
[31m-    if (p & NGX_HTTP_GZIP_PROXIED_OFF) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (p & NGX_HTTP_GZIP_PROXIED_ANY) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.authorization && (p & NGX_HTTP_GZIP_PROXIED_AUTH)) {[m
[31m-        goto ok;[m
[31m-    }[m
[31m-[m
[31m-    e = r->headers_out.expires;[m
[31m-[m
[31m-    if (e) {[m
[31m-[m
[31m-        if (!(p & NGX_HTTP_GZIP_PROXIED_EXPIRED)) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        expires = ngx_parse_http_time(e->value.data, e->value.len);[m
[31m-        if (expires == NGX_ERROR) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        d = r->headers_out.date;[m
[31m-[m
[31m-        if (d) {[m
[31m-            date = ngx_parse_http_time(d->value.data, d->value.len);[m
[31m-            if (date == NGX_ERROR) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            date = ngx_time();[m
[31m-        }[m
[31m-[m
[31m-        if (expires < date) {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cc = &r->headers_out.cache_control;[m
[31m-[m
[31m-    if (cc->elts) {[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_NO_CACHE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_cache,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_NO_STORE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_store,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        if ((p & NGX_HTTP_GZIP_PROXIED_PRIVATE)[m
[31m-            && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_private,[m
[31m-                                                 NULL)[m
[31m-               >= 0)[m
[31m-        {[m
[31m-            goto ok;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((p & NGX_HTTP_GZIP_PROXIED_NO_LM) && r->headers_out.last_modified) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((p & NGX_HTTP_GZIP_PROXIED_NO_ETAG) && r->headers_out.etag) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-ok:[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (clcf->gzip_disable && r->headers_in.user_agent) {[m
[31m-[m
[31m-        if (ngx_regex_exec_array(clcf->gzip_disable,[m
[31m-                                 &r->headers_in.user_agent->value,[m
[31m-                                 r->connection->log)[m
[31m-            != NGX_DECLINED)[m
[31m-        {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    r->gzip_ok = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * gzip is enabled for the following quantities:[m
[31m- *     "gzip; q=0.001" ... "gzip; q=1.000"[m
[31m- * gzip is disabled for the following quantities:[m
[31m- *     "gzip; q=0" ... "gzip; q=0.000", and for any invalid cases[m
[31m- */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_gzip_accept_encoding(ngx_str_t *ae)[m
[31m-{[m
[31m-    u_char  *p, *start, *last;[m
[31m-[m
[31m-    start = ae->data;[m
[31m-    last = start + ae->len;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        p = ngx_strcasestrn(start, "gzip", 4 - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (p == start || (*(p - 1) == ',' || *(p - 1) == ' ')) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        start = p + 4;[m
[31m-    }[m
[31m-[m
[31m-    p += 4;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        switch (*p++) {[m
[31m-        case ',':[m
[31m-            return NGX_OK;[m
[31m-        case ';':[m
[31m-            goto quantity;[m
[31m-        case ' ':[m
[31m-            continue;[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-quantity:[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        switch (*p++) {[m
[31m-        case 'q':[m
[31m-        case 'Q':[m
[31m-            goto equal;[m
[31m-        case ' ':[m
[31m-            continue;[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-equal:[m
[31m-[m
[31m-    if (p + 2 > last || *p++ != '=') {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_gzip_quantity(p, last) == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_gzip_quantity(u_char *p, u_char *last)[m
[31m-{[m
[31m-    u_char      c;[m
[31m-    ngx_uint_t  n, q;[m
[31m-[m
[31m-    c = *p++;[m
[31m-[m
[31m-    if (c != '0' && c != '1') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    q = (c - '0') * 100;[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        return q;[m
[31m-    }[m
[31m-[m
[31m-    c = *p++;[m
[31m-[m
[31m-    if (c == ',' || c == ' ') {[m
[31m-        return q;[m
[31m-    }[m
[31m-[m
[31m-    if (c != '.') {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        c = *p++;[m
[31m-[m
[31m-        if (c == ',' || c == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (c >= '0' && c <= '9') {[m
[31m-            q += c - '0';[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (q > 100 || n > 3) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    return q;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,[m
[31m-    ngx_http_post_subrequest_t *ps, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_time_t                    *tp;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *sr;[m
[31m-    ngx_http_core_srv_conf_t      *cscf;[m
[31m-    ngx_http_postponed_request_t  *pr, *p;[m
[31m-[m
[31m-    if (r->subrequests == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "subrequests cycle while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * 1000 is reserved for other purposes.[m
[31m-     */[m
[31m-    if (r->main->count >= 65535 - 1000) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "request reference counter overflow "[m
[31m-                      "while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr = ngx_pcalloc(r->pool, sizeof(ngx_http_request_t));[m
[31m-    if (sr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr->signature = NGX_HTTP_MODULE;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    sr->connection = c;[m
[31m-[m
[31m-    sr->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (sr->ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&sr->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    sr->main_conf = cscf->ctx->main_conf;[m
[31m-    sr->srv_conf = cscf->ctx->srv_conf;[m
[31m-    sr->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    sr->pool = r->pool;[m
[31m-[m
[31m-    sr->headers_in = r->headers_in;[m
[31m-[m
[31m-    ngx_http_clear_content_length(sr);[m
[31m-    ngx_http_clear_accept_ranges(sr);[m
[31m-    ngx_http_clear_last_modified(sr);[m
[31m-[m
[31m-    sr->request_body = r->request_body;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    sr->stream = r->stream;[m
[31m-#endif[m
[31m-[m
[31m-    sr->method = NGX_HTTP_GET;[m
[31m-    sr->http_version = r->http_version;[m
[31m-[m
[31m-    sr->request_line = r->request_line;[m
[31m-    sr->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        sr->args = *args;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http subrequest \"%V?%V\"", uri, &sr->args);[m
[31m-[m
[31m-    sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;[m
[31m-    sr->waited = (flags & NGX_HTTP_SUBREQUEST_WAITED) != 0;[m
[31m-[m
[31m-    sr->unparsed_uri = r->unparsed_uri;[m
[31m-    sr->method_name = ngx_http_core_get_method;[m
[31m-    sr->http_protocol = r->http_protocol;[m
[31m-[m
[31m-    ngx_http_set_exten(sr);[m
[31m-[m
[31m-    sr->main = r->main;[m
[31m-    sr->parent = r;[m
[31m-    sr->post_subrequest = ps;[m
[31m-    sr->read_event_handler = ngx_http_request_empty_handler;[m
[31m-    sr->write_event_handler = ngx_http_handler;[m
[31m-[m
[31m-    if (c->data == r && r->postponed == NULL) {[m
[31m-        c->data = sr;[m
[31m-    }[m
[31m-[m
[31m-    sr->variables = r->variables;[m
[31m-[m
[31m-    sr->log_handler = r->log_handler;[m
[31m-[m
[31m-    pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->request = sr;[m
[31m-    pr->out = NULL;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-    if (r->postponed) {[m
[31m-        for (p = r->postponed; p->next; p = p->next) { /* void */ }[m
[31m-        p->next = pr;[m
[31m-[m
[31m-    } else {[m
[31m-        r->postponed = pr;[m
[31m-    }[m
[31m-[m
[31m-    sr->internal = 1;[m
[31m-[m
[31m-    sr->discard_body = r->discard_body;[m
[31m-    sr->expect_tested = 1;[m
[31m-    sr->main_filter_need_in_memory = r->main_filter_need_in_memory;[m
[31m-[m
[31m-    sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    sr->subrequests = r->subrequests - 1;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    sr->start_sec = tp->sec;[m
[31m-    sr->start_msec = tp->msec;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    *psr = sr;[m
[31m-[m
[31m-    return ngx_http_post_request(sr, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_internal_redirect(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while internally redirecting to \"%V\"", uri);[m
[31m-[m
[31m-        r->main->count++;[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    r->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        r->args = *args;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&r->args);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "internal redirect: \"%V?%V\"", uri, &r->args);[m
[31m-[m
[31m-    ngx_http_set_exten(r);[m
[31m-[m
[31m-    /* clear the modules contexts */[m
[31m-    ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    ngx_http_update_location_config(r);[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    r->cache = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    r->internal = 1;[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-    r->add_uri_to_alias = 0;[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    ngx_http_handler(r);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t    *cscf;[m
[31m-    ngx_http_core_loc_conf_t   **clcfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-    r->uri_changes--;[m
[31m-[m
[31m-    if (r->uri_changes == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "rewrite or internal redirection cycle "[m
[31m-                      "while redirect to named location \"%V\"", name);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (r->uri.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "empty URI in redirect to named location \"%V\"", name);[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (cscf->named_locations) {[m
[31m-[m
[31m-        for (clcfp = cscf->named_locations; *clcfp; clcfp++) {[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "test location: \"%V\"", &(*clcfp)->name);[m
[31m-[m
[31m-            if (name->len != (*clcfp)->name.len[m
[31m-                || ngx_strncmp(name->data, (*clcfp)->name.data, name->len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "using location: %V \"%V?%V\"",[m
[31m-                           name, &r->uri, &r->args);[m
[31m-[m
[31m-            r->internal = 1;[m
[31m-            r->content_handler = NULL;[m
[31m-            r->uri_changed = 0;[m
[31m-            r->loc_conf = (*clcfp)->loc_conf;[m
[31m-[m
[31m-            /* clear the modules contexts */[m
[31m-            ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-            ngx_http_update_location_config(r);[m
[31m-[m
[31m-            cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            r->phase_handler = cmcf->phase_engine.location_rewrite_index;[m
[31m-[m
[31m-            r->write_event_handler = ngx_http_core_run_phases;[m
[31m-            ngx_http_core_run_phases(r);[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "could not find named location \"%V\"", name);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_cleanup_t *[m
[31m-ngx_http_cleanup_add(ngx_http_request_t *r, size_t size)[m
[31m-{[m
[31m-    ngx_http_cleanup_t  *cln;[m
[31m-[m
[31m-    r = r->main;[m
[31m-[m
[31m-    cln = ngx_palloc(r->pool, sizeof(ngx_http_cleanup_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (size) {[m
[31m-        cln->data = ngx_palloc(r->pool, size);[m
[31m-        if (cln->data == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        cln->data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = NULL;[m
[31m-    cln->next = r->cleanup;[m
[31m-[m
[31m-    r->cleanup = cln;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http cleanup add: %p", cln);[m
[31m-[m
[31m-    return cln;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_set_disable_symlinks(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *path, ngx_open_file_info_t *of)[m
[31m-{[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    u_char     *p;[m
[31m-    ngx_str_t   from;[m
[31m-[m
[31m-    of->disable_symlinks = clcf->disable_symlinks;[m
[31m-[m
[31m-    if (clcf->disable_symlinks_from == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, clcf->disable_symlinks_from, &from)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (from.len == 0[m
[31m-        || from.len > path->len[m
[31m-        || ngx_memcmp(path->data, from.data, from.len) != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (from.len == path->len) {[m
[31m-        of->disable_symlinks = NGX_DISABLE_SYMLINKS_OFF;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = path->data + from.len;[m
[31m-[m
[31m-    if (*p == '/') {[m
[31m-        of->disable_symlinks_from = from.len;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p--;[m
[31m-[m
[31m-    if (*p == '/') {[m
[31m-        of->disable_symlinks_from = from.len - 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    ngx_array_t *headers, ngx_str_t *value, ngx_array_t *proxies,[m
[31m-    int recursive)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_uint_t         i, found;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    if (headers == NULL) {[m
[31m-        return ngx_http_get_forwarded_addr_internal(r, addr, value->data,[m
[31m-                                                    value->len, proxies,[m
[31m-                                                    recursive);[m
[31m-    }[m
[31m-[m
[31m-    i = headers->nelts;[m
[31m-    h = headers->elts;[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-    while (i-- > 0) {[m
[31m-        rc = ngx_http_get_forwarded_addr_internal(r, addr, h[i]->value.data,[m
[31m-                                                  h[i]->value.len, proxies,[m
[31m-                                                  recursive);[m
[31m-[m
[31m-        if (!recursive) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED && found) {[m
[31m-            rc = NGX_DONE;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    u_char *xff, size_t xfflen, ngx_array_t *proxies, int recursive)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    in_addr_t         inaddr;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_addr_t        paddr;[m
[31m-    ngx_cidr_t       *cidr;[m
[31m-    ngx_uint_t        family, i;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_uint_t        n;[m
[31m-    struct in6_addr  *inaddr6;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    inaddr = 0;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    inaddr6 = NULL;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    family = addr->sockaddr->sa_family;[m
[31m-[m
[31m-    if (family == AF_INET) {[m
[31m-        inaddr = ((struct sockaddr_in *) addr->sockaddr)->sin_addr.s_addr;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    else if (family == AF_INET6) {[m
[31m-        inaddr6 = &((struct sockaddr_in6 *) addr->sockaddr)->sin6_addr;[m
[31m-[m
[31m-        if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {[m
[31m-            family = AF_INET;[m
[31m-[m
[31m-            p = inaddr6->s6_addr;[m
[31m-[m
[31m-            inaddr = p[12] << 24;[m
[31m-            inaddr += p[13] << 16;[m
[31m-            inaddr += p[14] << 8;[m
[31m-            inaddr += p[15];[m
[31m-[m
[31m-            inaddr = htonl(inaddr);[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    for (cidr = proxies->elts, i = 0; i < proxies->nelts; i++) {[m
[31m-        if (cidr[i].family != family) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        switch (family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            for (n = 0; n < 16; n++) {[m
[31m-                if ((inaddr6->s6_addr[n] & cidr[i].u.in6.mask.s6_addr[n])[m
[31m-                    != cidr[i].u.in6.addr.s6_addr[n])[m
[31m-                {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            }[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            if ((inaddr & cidr[i].u.in.mask) != cidr[i].u.in.addr) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        for (p = xff + xfflen - 1; p > xff; p--, xfflen--) {[m
[31m-            if (*p != ' ' && *p != ',') {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; p > xff; p--) {[m
[31m-            if (*p == ' ' || *p == ',') {[m
[31m-                p++;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_parse_addr(r->pool, &paddr, p, xfflen - (p - xff)) != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        *addr = paddr;[m
[31m-[m
[31m-        if (recursive && p > xff) {[m
[31m-            rc = ngx_http_get_forwarded_addr_internal(r, addr, xff, p - 1 - xff,[m
[31m-                                                      proxies, 1);[m
[31m-[m
[31m-            if (rc == NGX_DECLINED) {[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_OK || rc == NGX_DONE  */[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    void                        *mconf;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_conf_t                   pcf;[m
[31m-    ngx_http_module_t           *module;[m
[31m-    struct sockaddr_in          *sin;[m
[31m-    ngx_http_conf_ctx_t         *ctx, *http_ctx;[m
[31m-    ngx_http_listen_opt_t        lsopt;[m
[31m-    ngx_http_core_srv_conf_t    *cscf, **cscfp;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx = cf->ctx;[m
[31m-    ctx->main_conf = http_ctx->main_conf;[m
[31m-[m
[31m-    /* the server{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* the server{}'s loc_conf */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the server configuration context */[m
[31m-[m
[31m-    cscf = ctx->srv_conf[ngx_http_core_module.ctx_index];[m
[31m-    cscf->ctx = ctx;[m
[31m-[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    cscfp = ngx_array_push(&cmcf->servers);[m
[31m-    if (cscfp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *cscfp = cscf;[m
[31m-[m
[31m-[m
[31m-    /* parse inside server{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_SRV_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv == NGX_CONF_OK && !cscf->listen) {[m
[31m-        ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));[m
[31m-[m
[31m-        sin = &lsopt.u.sockaddr_in;[m
[31m-[m
[31m-        sin->sin_family = AF_INET;[m
[31m-#if (NGX_WIN32)[m
[31m-        sin->sin_port = htons(80);[m
[31m-#else[m
[31m-        sin->sin_port = htons((getuid() == 0) ? 80 : 8000);[m
[31m-#endif[m
[31m-        sin->sin_addr.s_addr = INADDR_ANY;[m
[31m-[m
[31m-        lsopt.socklen = sizeof(struct sockaddr_in);[m
[31m-[m
[31m-        lsopt.backlog = NGX_LISTEN_BACKLOG;[m
[31m-        lsopt.rcvbuf = -1;[m
[31m-        lsopt.sndbuf = -1;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        lsopt.setfib = -1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        lsopt.fastopen = -1;[m
[31m-#endif[m
[31m-        lsopt.wildcard = 1;[m
[31m-[m
[31m-        (void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.socklen, lsopt.addr,[m
[31m-                             NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                      *rv;[m
[31m-    u_char                    *mod;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                 *value, *name;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_conf_t                 save;[m
[31m-    ngx_http_module_t         *module;[m
[31m-    ngx_http_conf_ctx_t       *ctx, *pctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf, *pclcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] =[m
[31m-                                                   module->create_loc_conf(cf);[m
[31m-            if (ctx->loc_conf[cf->cycle->modules[i]->ctx_index] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-[m
[31m-        len = value[1].len;[m
[31m-        mod = value[1].data;[m
[31m-        name = &value[2];[m
[31m-[m
[31m-        if (len == 1 && mod[0] == '=') {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-            clcf->exact_match = 1;[m
[31m-[m
[31m-        } else if (len == 2 && mod[0] == '^' && mod[1] == '~') {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-            clcf->noregex = 1;[m
[31m-[m
[31m-        } else if (len == 1 && mod[0] == '~') {[m
[31m-[m
[31m-            if (ngx_http_core_regex_location(cf, clcf, name, 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else if (len == 2 && mod[0] == '~' && mod[1] == '*') {[m
[31m-[m
[31m-            if (ngx_http_core_regex_location(cf, clcf, name, 1) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid location modifier \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        name = &value[1];[m
[31m-[m
[31m-        if (name->data[0] == '=') {[m
[31m-[m
[31m-            clcf->name.len = name->len - 1;[m
[31m-            clcf->name.data = name->data + 1;[m
[31m-            clcf->exact_match = 1;[m
[31m-[m
[31m-        } else if (name->data[0] == '^' && name->data[1] == '~') {[m
[31m-[m
[31m-            clcf->name.len = name->len - 2;[m
[31m-            clcf->name.data = name->data + 2;[m
[31m-            clcf->noregex = 1;[m
[31m-[m
[31m-        } else if (name->data[0] == '~') {[m
[31m-[m
[31m-            name->len--;[m
[31m-            name->data++;[m
[31m-[m
[31m-            if (name->data[0] == '*') {[m
[31m-[m
[31m-                name->len--;[m
[31m-                name->data++;[m
[31m-[m
[31m-                if (ngx_http_core_regex_location(cf, clcf, name, 1) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                if (ngx_http_core_regex_location(cf, clcf, name, 0) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            clcf->name = *name;[m
[31m-[m
[31m-            if (name->data[0] == '@') {[m
[31m-                clcf->named = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    if (cf->cmd_type == NGX_HTTP_LOC_CONF) {[m
[31m-[m
[31m-        /* nested location */[m
[31m-[m
[31m-#if 0[m
[31m-        clcf->prev_location = pclcf;[m
[31m-#endif[m
[31m-[m
[31m-        if (pclcf->exact_match) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" cannot be inside "[m
[31m-                               "the exact location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (pclcf->named) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" cannot be inside "[m
[31m-                               "the named location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->named) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "named location \"%V\" can be "[m
[31m-                               "on the server level only",[m
[31m-                               &clcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = pclcf->name.len;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        if (clcf->regex == NULL[m
[31m-            && ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)[m
[31m-#else[m
[31m-        if (ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)[m
[31m-#endif[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "location \"%V\" is outside location \"%V\"",[m
[31m-                               &clcf->name, &pclcf->name);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_LOC_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_regex_location(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf,[m
[31m-    ngx_str_t *regex, ngx_uint_t caseless)[m
[31m-{[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_regex_compile_t  rc;[m
[31m-    u_char               errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pattern = *regex;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-#if (NGX_HAVE_CASELESS_FILESYSTEM)[m
[31m-    rc.options = NGX_REGEX_CASELESS;[m
[31m-#else[m
[31m-    rc.options = caseless ? NGX_REGEX_CASELESS : 0;[m
[31m-#endif[m
[31m-[m
[31m-    clcf->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-    if (clcf->regex == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->name = *regex;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "using regex \"%V\" requires PCRE library",[m
[31m-                       regex);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_types(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    if (clcf->types == NULL) {[m
[31m-        clcf->types = ngx_array_create(cf->pool, 64, sizeof(ngx_hash_key_t));[m
[31m-        if (clcf->types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_core_type;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_type(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t       *value, *content_type, *old;[m
[31m-    ngx_uint_t       i, n, hash;[m
[31m-    ngx_hash_key_t  *type;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[0].data, "include") == 0) {[m
[31m-        if (cf->args->nelts != 2) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid number of arguments"[m
[31m-                               " in \"include\" directive");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_conf_include(cf, dummy, conf);[m
[31m-    }[m
[31m-[m
[31m-    content_type = ngx_palloc(cf->pool, sizeof(ngx_str_t));[m
[31m-    if (content_type == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *content_type = value[0];[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        hash = ngx_hash_strlow(value[i].data, value[i].data, value[i].len);[m
[31m-[m
[31m-        type = clcf->types->elts;[m
[31m-        for (n = 0; n < clcf->types->nelts; n++) {[m
[31m-            if (ngx_strcmp(value[i].data, type[n].key.data) == 0) {[m
[31m-                old = type[n].value;[m
[31m-                type[n].value = content_type;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                                   "duplicate extension \"%V\", "[m
[31m-                                   "content type: \"%V\", "[m
[31m-                                   "previous content type: \"%V\"",[m
[31m-                                   &value[i], content_type, old);[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        type = ngx_array_push(clcf->types);[m
[31m-        if (type == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        type->key = value[i];[m
[31m-        type->key_hash = hash;[m
[31m-        type->value = content_type;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_preconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    return ngx_http_variables_add_core_vars(cf);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_core_postconfiguration(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_request_body_filter = ngx_http_request_body_save_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_main_conf_t));[m
[31m-    if (cmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->servers, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_core_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    cmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    cmcf->variables_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    cmcf->variables_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return cmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t *cmcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512);[m
[31m-    ngx_conf_init_uint_value(cmcf->server_names_hash_bucket_size,[m
[31m-                             ngx_cacheline_size);[m
[31m-[m
[31m-    cmcf->server_names_hash_bucket_size =[m
[31m-            ngx_align(cmcf->server_names_hash_bucket_size, ngx_cacheline_size);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_init_uint_value(cmcf->variables_hash_max_size, 1024);[m
[31m-    ngx_conf_init_uint_value(cmcf->variables_hash_bucket_size, 64);[m
[31m-[m
[31m-    cmcf->variables_hash_bucket_size =[m
[31m-               ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size);[m
[31m-[m
[31m-    if (cmcf->ncaptures) {[m
[31m-        cmcf->ncaptures = (cmcf->ncaptures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_srv_conf_t));[m
[31m-    if (cscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->client_large_buffers.num = 0;[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_array_init(&cscf->server_names, cf->temp_pool, 4,[m
[31m-                       sizeof(ngx_http_server_name_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cscf->connection_pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->request_pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->client_header_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    cscf->client_header_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    cscf->ignore_invalid_headers = NGX_CONF_UNSET;[m
[31m-    cscf->merge_slashes = NGX_CONF_UNSET;[m
[31m-    cscf->underscores_in_headers = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return cscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *prev = parent;[m
[31m-    ngx_http_core_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_str_t                name;[m
[31m-    ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-    /* TODO: it does not merge, it inits only */[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->connection_pool_size,[m
[31m-                              prev->connection_pool_size, 64 * sizeof(void *));[m
[31m-    ngx_conf_merge_size_value(conf->request_pool_size,[m
[31m-                              prev->request_pool_size, 4096);[m
[31m-    ngx_conf_merge_msec_value(conf->client_header_timeout,[m
[31m-                              prev->client_header_timeout, 60000);[m
[31m-    ngx_conf_merge_size_value(conf->client_header_buffer_size,[m
[31m-                              prev->client_header_buffer_size, 1024);[m
[31m-    ngx_conf_merge_bufs_value(conf->large_client_header_buffers,[m
[31m-                              prev->large_client_header_buffers,[m
[31m-                              4, 8192);[m
[31m-[m
[31m-    if (conf->large_client_header_buffers.size < conf->connection_pool_size) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the \"large_client_header_buffers\" size must be "[m
[31m-                           "equal to or greater than \"connection_pool_size\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ignore_invalid_headers,[m
[31m-                              prev->ignore_invalid_headers, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->underscores_in_headers,[m
[31m-                              prev->underscores_in_headers, 0);[m
[31m-[m
[31m-    if (conf->server_names.nelts == 0) {[m
[31m-        /* the array has 4 empty preallocated elements, so push cannot fail */[m
[31m-        sn = ngx_array_push(&conf->server_names);[m
[31m-#if (NGX_PCRE)[m
[31m-        sn->regex = NULL;[m
[31m-#endif[m
[31m-        sn->server = conf;[m
[31m-        ngx_str_set(&sn->name, "");[m
[31m-    }[m
[31m-[m
[31m-    sn = conf->server_names.elts;[m
[31m-    name = sn[0].name;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (sn->regex) {[m
[31m-        name.len++;[m
[31m-        name.data--;[m
[31m-    } else[m
[31m-#endif[m
[31m-[m
[31m-    if (name.data[0] == '.') {[m
[31m-        name.len--;[m
[31m-        name.data++;[m
[31m-    }[m
[31m-[m
[31m-    conf->server_name.len = name.len;[m
[31m-    conf->server_name.data = ngx_pstrdup(cf->pool, &name);[m
[31m-    if (conf->server_name.data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_core_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_core_loc_conf_t));[m
[31m-    if (clcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     clcf->root = { 0, NULL };[m
[31m-     *     clcf->limit_except = 0;[m
[31m-     *     clcf->post_action = { 0, NULL };[m
[31m-     *     clcf->types = NULL;[m
[31m-     *     clcf->default_type = { 0, NULL };[m
[31m-     *     clcf->error_log = NULL;[m
[31m-     *     clcf->try_files = NULL;[m
[31m-     *     clcf->client_body_path = NULL;[m
[31m-     *     clcf->regex = NULL;[m
[31m-     *     clcf->exact_match = 0;[m
[31m-     *     clcf->auto_redirect = 0;[m
[31m-     *     clcf->alias = 0;[m
[31m-     *     clcf->gzip_proxied = 0;[m
[31m-     *     clcf->keepalive_disable = 0;[m
[31m-     */[m
[31m-[m
[31m-    clcf->error_pages = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->client_max_body_size = NGX_CONF_UNSET;[m
[31m-    clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->satisfy = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->if_modified_since = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->max_ranges = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->client_body_in_file_only = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->client_body_in_single_buffer = NGX_CONF_UNSET;[m
[31m-    clcf->internal = NGX_CONF_UNSET;[m
[31m-    clcf->sendfile = NGX_CONF_UNSET;[m
[31m-    clcf->sendfile_max_chunk = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->aio = NGX_CONF_UNSET;[m
[31m-    clcf->aio_write = NGX_CONF_UNSET;[m
[31m-#if (NGX_THREADS)[m
[31m-    clcf->thread_pool = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->thread_pool_value = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-    clcf->read_ahead = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->directio = NGX_CONF_UNSET;[m
[31m-    clcf->directio_alignment = NGX_CONF_UNSET;[m
[31m-    clcf->tcp_nopush = NGX_CONF_UNSET;[m
[31m-    clcf->tcp_nodelay = NGX_CONF_UNSET;[m
[31m-    clcf->send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->postpone_output = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->limit_rate = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->limit_rate_after = NGX_CONF_UNSET_SIZE;[m
[31m-    clcf->keepalive_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->keepalive_header = NGX_CONF_UNSET;[m
[31m-    clcf->keepalive_requests = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->lingering_close = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->lingering_time = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->lingering_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->resolver_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    clcf->reset_timedout_connection = NGX_CONF_UNSET;[m
[31m-    clcf->server_name_in_redirect = NGX_CONF_UNSET;[m
[31m-    clcf->port_in_redirect = NGX_CONF_UNSET;[m
[31m-    clcf->msie_padding = NGX_CONF_UNSET;[m
[31m-    clcf->msie_refresh = NGX_CONF_UNSET;[m
[31m-    clcf->log_not_found = NGX_CONF_UNSET;[m
[31m-    clcf->log_subrequest = NGX_CONF_UNSET;[m
[31m-    clcf->recursive_error_pages = NGX_CONF_UNSET;[m
[31m-    clcf->server_tokens = NGX_CONF_UNSET;[m
[31m-    clcf->chunked_transfer_encoding = NGX_CONF_UNSET;[m
[31m-    clcf->etag = NGX_CONF_UNSET;[m
[31m-    clcf->types_hash_max_size = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->types_hash_bucket_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    clcf->open_file_cache = NGX_CONF_UNSET_PTR;[m
[31m-    clcf->open_file_cache_valid = NGX_CONF_UNSET;[m
[31m-    clcf->open_file_cache_min_uses = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->open_file_cache_errors = NGX_CONF_UNSET;[m
[31m-    clcf->open_file_cache_events = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    clcf->gzip_vary = NGX_CONF_UNSET;[m
[31m-    clcf->gzip_http_version = NGX_CONF_UNSET_UINT;[m
[31m-#if (NGX_PCRE)[m
[31m-    clcf->gzip_disable = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-    clcf->gzip_disable_msie6 = 3;[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-    clcf->gzip_disable_degradation = 3;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    clcf->disable_symlinks = NGX_CONF_UNSET_UINT;[m
[31m-    clcf->disable_symlinks_from = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    return clcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_core_text_html_type = ngx_string("text/html");[m
[31m-static ngx_str_t  ngx_http_core_image_gif_type = ngx_string("image/gif");[m
[31m-static ngx_str_t  ngx_http_core_image_jpeg_type = ngx_string("image/jpeg");[m
[31m-[m
[31m-static ngx_hash_key_t  ngx_http_core_default_types[] = {[m
[31m-    { ngx_string("html"), 0, &ngx_http_core_text_html_type },[m
[31m-    { ngx_string("gif"), 0, &ngx_http_core_image_gif_type },[m
[31m-    { ngx_string("jpg"), 0, &ngx_http_core_image_jpeg_type },[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *prev = parent;[m
[31m-    ngx_http_core_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_hash_key_t   *type;[m
[31m-    ngx_hash_init_t   types_hash;[m
[31m-[m
[31m-    if (conf->root.data == NULL) {[m
[31m-[m
[31m-        conf->alias = prev->alias;[m
[31m-        conf->root = prev->root;[m
[31m-        conf->root_lengths = prev->root_lengths;[m
[31m-        conf->root_values = prev->root_values;[m
[31m-[m
[31m-        if (prev->root.data == NULL) {[m
[31m-            ngx_str_set(&conf->root, "html");[m
[31m-[m
[31m-            if (ngx_conf_full_name(cf->cycle, &conf->root, 0) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->post_action.data == NULL) {[m
[31m-        conf->post_action = prev->post_action;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->types_hash_max_size,[m
[31m-                              prev->types_hash_max_size, 1024);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->types_hash_bucket_size,[m
[31m-                              prev->types_hash_bucket_size, 64);[m
[31m-[m
[31m-    conf->types_hash_bucket_size = ngx_align(conf->types_hash_bucket_size,[m
[31m-                                             ngx_cacheline_size);[m
[31m-[m
[31m-    /*[m
[31m-     * the special handling of the "types" directive in the "http" section[m
[31m-     * to inherit the http's conf->types_hash to all servers[m
[31m-     */[m
[31m-[m
[31m-    if (prev->types && prev->types_hash.buckets == NULL) {[m
[31m-[m
[31m-        types_hash.hash = &prev->types_hash;[m
[31m-        types_hash.key = ngx_hash_key_lc;[m
[31m-        types_hash.max_size = conf->types_hash_max_size;[m
[31m-        types_hash.bucket_size = conf->types_hash_bucket_size;[m
[31m-        types_hash.name = "types_hash";[m
[31m-        types_hash.pool = cf->pool;[m
[31m-        types_hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&types_hash, prev->types->elts, prev->types->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types == NULL) {[m
[31m-        conf->types = prev->types;[m
[31m-        conf->types_hash = prev->types_hash;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types == NULL) {[m
[31m-        conf->types = ngx_array_create(cf->pool, 3, sizeof(ngx_hash_key_t));[m
[31m-        if (conf->types == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; ngx_http_core_default_types[i].key.len; i++) {[m
[31m-            type = ngx_array_push(conf->types);[m
[31m-            if (type == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            type->key = ngx_http_core_default_types[i].key;[m
[31m-            type->key_hash =[m
[31m-                       ngx_hash_key_lc(ngx_http_core_default_types[i].key.data,[m
[31m-                                       ngx_http_core_default_types[i].key.len);[m
[31m-            type->value = ngx_http_core_default_types[i].value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->types_hash.buckets == NULL) {[m
[31m-[m
[31m-        types_hash.hash = &conf->types_hash;[m
[31m-        types_hash.key = ngx_hash_key_lc;[m
[31m-        types_hash.max_size = conf->types_hash_max_size;[m
[31m-        types_hash.bucket_size = conf->types_hash_bucket_size;[m
[31m-        types_hash.name = "types_hash";[m
[31m-        types_hash.pool = cf->pool;[m
[31m-        types_hash.temp_pool = NULL;[m
[31m-[m
[31m-        if (ngx_hash_init(&types_hash, conf->types->elts, conf->types->nelts)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->error_log == NULL) {[m
[31m-        if (prev->error_log) {[m
[31m-            conf->error_log = prev->error_log;[m
[31m-        } else {[m
[31m-            conf->error_log = &cf->cycle->new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->default_type,[m
[31m-                              prev->default_type, "text/plain");[m
[31m-[m
[31m-    ngx_conf_merge_off_value(conf->client_max_body_size,[m
[31m-                              prev->client_max_body_size, 1 * 1024 * 1024);[m
[31m-    ngx_conf_merge_size_value(conf->client_body_buffer_size,[m
[31m-                              prev->client_body_buffer_size,[m
[31m-                              (size_t) 2 * ngx_pagesize);[m
[31m-    ngx_conf_merge_msec_value(conf->client_body_timeout,[m
[31m-                              prev->client_body_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->keepalive_disable,[m
[31m-                              prev->keepalive_disable,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_HTTP_KEEPALIVE_DISABLE_MSIE6));[m
[31m-    ngx_conf_merge_uint_value(conf->satisfy, prev->satisfy,[m
[31m-                              NGX_HTTP_SATISFY_ALL);[m
[31m-    ngx_conf_merge_uint_value(conf->if_modified_since, prev->if_modified_since,[m
[31m-                              NGX_HTTP_IMS_EXACT);[m
[31m-    ngx_conf_merge_uint_value(conf->max_ranges, prev->max_ranges,[m
[31m-                              NGX_MAX_INT32_VALUE);[m
[31m-    ngx_conf_merge_uint_value(conf->client_body_in_file_only,[m
[31m-                              prev->client_body_in_file_only,[m
[31m-                              NGX_HTTP_REQUEST_BODY_FILE_OFF);[m
[31m-    ngx_conf_merge_value(conf->client_body_in_single_buffer,[m
[31m-                              prev->client_body_in_single_buffer, 0);[m
[31m-    ngx_conf_merge_value(conf->internal, prev->internal, 0);[m
[31m-    ngx_conf_merge_value(conf->sendfile, prev->sendfile, 0);[m
[31m-    ngx_conf_merge_size_value(conf->sendfile_max_chunk,[m
[31m-                              prev->sendfile_max_chunk, 0);[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    ngx_conf_merge_value(conf->aio, prev->aio, NGX_HTTP_AIO_OFF);[m
[31m-    ngx_conf_merge_value(conf->aio_write, prev->aio_write, 0);[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_conf_merge_ptr_value(conf->thread_pool, prev->thread_pool, NULL);[m
[31m-    ngx_conf_merge_ptr_value(conf->thread_pool_value, prev->thread_pool_value,[m
[31m-                             NULL);[m
[31m-#endif[m
[31m-    ngx_conf_merge_size_value(conf->read_ahead, prev->read_ahead, 0);[m
[31m-    ngx_conf_merge_off_value(conf->directio, prev->directio,[m
[31m-                              NGX_OPEN_FILE_DIRECTIO_OFF);[m
[31m-    ngx_conf_merge_off_value(conf->directio_alignment, prev->directio_alignment,[m
[31m-                              512);[m
[31m-    ngx_conf_merge_value(conf->tcp_nopush, prev->tcp_nopush, 0);[m
[31m-    ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->send_timeout, prev->send_timeout, 60000);[m
[31m-    ngx_conf_merge_size_value(conf->send_lowat, prev->send_lowat, 0);[m
[31m-    ngx_conf_merge_size_value(conf->postpone_output, prev->postpone_output,[m
[31m-                              1460);[m
[31m-    ngx_conf_merge_size_value(conf->limit_rate, prev->limit_rate, 0);[m
[31m-    ngx_conf_merge_size_value(conf->limit_rate_after, prev->limit_rate_after,[m
[31m-                              0);[m
[31m-    ngx_conf_merge_msec_value(conf->keepalive_timeout,[m
[31m-                              prev->keepalive_timeout, 75000);[m
[31m-    ngx_conf_merge_sec_value(conf->keepalive_header,[m
[31m-                              prev->keepalive_header, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->keepalive_requests,[m
[31m-                              prev->keepalive_requests, 100);[m
[31m-    ngx_conf_merge_uint_value(conf->lingering_close,[m
[31m-                              prev->lingering_close, NGX_HTTP_LINGERING_ON);[m
[31m-    ngx_conf_merge_msec_value(conf->lingering_time,[m
[31m-                              prev->lingering_time, 30000);[m
[31m-    ngx_conf_merge_msec_value(conf->lingering_timeout,[m
[31m-                              prev->lingering_timeout, 5000);[m
[31m-    ngx_conf_merge_msec_value(conf->resolver_timeout,[m
[31m-                              prev->resolver_timeout, 30000);[m
[31m-[m
[31m-    if (conf->resolver == NULL) {[m
[31m-[m
[31m-        if (prev->resolver == NULL) {[m
[31m-[m
[31m-            /*[m
[31m-             * create dummy resolver in http {} context[m
[31m-             * to inherit it in all servers[m
[31m-             */[m
[31m-[m
[31m-            prev->resolver = ngx_resolver_create(cf, NULL, 0);[m
[31m-            if (prev->resolver == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        conf->resolver = prev->resolver;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_merge_path_value(cf, &conf->client_body_temp_path,[m
[31m-                              prev->client_body_temp_path,[m
[31m-                              &ngx_http_client_temp_path)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->reset_timedout_connection,[m
[31m-                              prev->reset_timedout_connection, 0);[m
[31m-    ngx_conf_merge_value(conf->server_name_in_redirect,[m
[31m-                              prev->server_name_in_redirect, 0);[m
[31m-    ngx_conf_merge_value(conf->port_in_redirect, prev->port_in_redirect, 1);[m
[31m-    ngx_conf_merge_value(conf->msie_padding, prev->msie_padding, 1);[m
[31m-    ngx_conf_merge_value(conf->msie_refresh, prev->msie_refresh, 0);[m
[31m-    ngx_conf_merge_value(conf->log_not_found, prev->log_not_found, 1);[m
[31m-    ngx_conf_merge_value(conf->log_subrequest, prev->log_subrequest, 0);[m
[31m-    ngx_conf_merge_value(conf->recursive_error_pages,[m
[31m-                              prev->recursive_error_pages, 0);[m
[31m-    ngx_conf_merge_value(conf->server_tokens, prev->server_tokens, 1);[m
[31m-    ngx_conf_merge_value(conf->chunked_transfer_encoding,[m
[31m-                              prev->chunked_transfer_encoding, 1);[m
[31m-    ngx_conf_merge_value(conf->etag, prev->etag, 1);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->open_file_cache,[m
[31m-                              prev->open_file_cache, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_valid,[m
[31m-                              prev->open_file_cache_valid, 60);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->open_file_cache_min_uses,[m
[31m-                              prev->open_file_cache_min_uses, 1);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_errors,[m
[31m-                              prev->open_file_cache_errors, 0);[m
[31m-[m
[31m-    ngx_conf_merge_sec_value(conf->open_file_cache_events,[m
[31m-                              prev->open_file_cache_events, 0);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->gzip_vary, prev->gzip_vary, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->gzip_http_version, prev->gzip_http_version,[m
[31m-                              NGX_HTTP_VERSION_11);[m
[31m-    ngx_conf_merge_bitmask_value(conf->gzip_proxied, prev->gzip_proxied,[m
[31m-                              (NGX_CONF_BITMASK_SET|NGX_HTTP_GZIP_PROXIED_OFF));[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_conf_merge_ptr_value(conf->gzip_disable, prev->gzip_disable, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    if (conf->gzip_disable_msie6 == 3) {[m
[31m-        conf->gzip_disable_msie6 =[m
[31m-            (prev->gzip_disable_msie6 == 3) ? 0 : prev->gzip_disable_msie6;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-    if (conf->gzip_disable_degradation == 3) {[m
[31m-        conf->gzip_disable_degradation =[m
[31m-            (prev->gzip_disable_degradation == 3) ?[m
[31m-                 0 : prev->gzip_disable_degradation;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    ngx_conf_merge_uint_value(conf->disable_symlinks, prev->disable_symlinks,[m
[31m-                              NGX_DISABLE_SYMLINKS_OFF);[m
[31m-    ngx_conf_merge_ptr_value(conf->disable_symlinks_from,[m
[31m-                             prev->disable_symlinks_from, NULL);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *cscf = conf;[m
[31m-[m
[31m-    ngx_str_t              *value, size;[m
[31m-    ngx_url_t               u;[m
[31m-    ngx_uint_t              n;[m
[31m-    ngx_http_listen_opt_t   lsopt;[m
[31m-[m
[31m-    cscf->listen = 1;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.listen = 1;[m
[31m-    u.default_port = 80;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in \"%V\" of the \"listen\" directive",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));[m
[31m-[m
[31m-    ngx_memcpy(&lsopt.u.sockaddr, u.sockaddr, u.socklen);[m
[31m-[m
[31m-    lsopt.socklen = u.socklen;[m
[31m-    lsopt.backlog = NGX_LISTEN_BACKLOG;[m
[31m-    lsopt.rcvbuf = -1;[m
[31m-    lsopt.sndbuf = -1;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    lsopt.setfib = -1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    lsopt.fastopen = -1;[m
[31m-#endif[m
[31m-    lsopt.wildcard = u.wildcard;[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    lsopt.ipv6only = 1;[m
[31m-#endif[m
[31m-[m
[31m-    (void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.socklen, lsopt.addr,[m
[31m-                         NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-    for (n = 2; n < cf->args->nelts; n++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "default_server") == 0[m
[31m-            || ngx_strcmp(value[n].data, "default") == 0)[m
[31m-        {[m
[31m-            lsopt.default_server = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "bind") == 0) {[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-        if (ngx_strncmp(value[n].data, "setfib=", 7) == 0) {[m
[31m-            lsopt.setfib = ngx_atoi(value[n].data + 7, value[n].len - 7);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.setfib == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid setfib \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-        if (ngx_strncmp(value[n].data, "fastopen=", 9) == 0) {[m
[31m-            lsopt.fastopen = ngx_atoi(value[n].data + 9, value[n].len - 9);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.fastopen == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid fastopen \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "backlog=", 8) == 0) {[m
[31m-            lsopt.backlog = ngx_atoi(value[n].data + 8, value[n].len - 8);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.backlog == NGX_ERROR || lsopt.backlog == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid backlog \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "rcvbuf=", 7) == 0) {[m
[31m-            size.len = value[n].len - 7;[m
[31m-            size.data = value[n].data + 7;[m
[31m-[m
[31m-            lsopt.rcvbuf = ngx_parse_size(&size);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.rcvbuf == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid rcvbuf \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "sndbuf=", 7) == 0) {[m
[31m-            size.len = value[n].len - 7;[m
[31m-            size.data = value[n].data + 7;[m
[31m-[m
[31m-            lsopt.sndbuf = ngx_parse_size(&size);[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            if (lsopt.sndbuf == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid sndbuf \"%V\"", &value[n]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "accept_filter=", 14) == 0) {[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-            lsopt.accept_filter = (char *) &value[n].data[14];[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "accept filters \"%V\" are not supported "[m
[31m-                               "on this platform, ignored",[m
[31m-                               &value[n]);[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "deferred") == 0) {[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-            lsopt.deferred_accept = 1;[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the deferred accept is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "ipv6only=o", 10) == 0) {[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            struct sockaddr  *sa;[m
[31m-[m
[31m-            sa = &lsopt.u.sockaddr;[m
[31m-[m
[31m-            if (sa->sa_family == AF_INET6) {[m
[31m-[m
[31m-                if (ngx_strcmp(&value[n].data[10], "n") == 0) {[m
[31m-                    lsopt.ipv6only = 1;[m
[31m-[m
[31m-                } else if (ngx_strcmp(&value[n].data[10], "ff") == 0) {[m
[31m-                    lsopt.ipv6only = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid ipv6only flags \"%s\"",[m
[31m-                                       &value[n].data[9]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                lsopt.set = 1;[m
[31m-                lsopt.bind = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "ipv6only is not supported "[m
[31m-                                   "on addr \"%s\", ignored", lsopt.addr);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "ipv6only is not supported "[m
[31m-                               "on this platform");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "reuseport") == 0) {[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            lsopt.reuseport = 1;[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "reuseport is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "ssl") == 0) {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            lsopt.ssl = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"ssl\" parameter requires "[m
[31m-                               "ngx_http_ssl_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "http2") == 0) {[m
[31m-#if (NGX_HTTP_V2)[m
[31m-            lsopt.http2 = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"http2\" parameter requires "[m
[31m-                               "ngx_http_v2_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "spdy") == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "invalid parameter \"spdy\": "[m
[31m-                               "ngx_http_spdy_module was superseded "[m
[31m-                               "by ngx_http_v2_module");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[n].data, "so_keepalive=", 13) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[n].data[13], "on") == 0) {[m
[31m-                lsopt.so_keepalive = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[n].data[13], "off") == 0) {[m
[31m-                lsopt.so_keepalive = 2;[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-                u_char     *p, *end;[m
[31m-                ngx_str_t   s;[m
[31m-[m
[31m-                end = value[n].data + value[n].len;[m
[31m-                s.data = value[n].data + 13;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepidle = ngx_parse_time(&s, 1);[m
[31m-                    if (lsopt.tcp_keepidle == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepintvl = ngx_parse_time(&s, 1);[m
[31m-                    if (lsopt.tcp_keepintvl == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                if (s.data < end) {[m
[31m-                    s.len = end - s.data;[m
[31m-[m
[31m-                    lsopt.tcp_keepcnt = ngx_atoi(s.data, s.len);[m
[31m-                    if (lsopt.tcp_keepcnt == NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (lsopt.tcp_keepidle == 0 && lsopt.tcp_keepintvl == 0[m
[31m-                    && lsopt.tcp_keepcnt == 0)[m
[31m-                {[m
[31m-                    goto invalid_so_keepalive;[m
[31m-                }[m
[31m-[m
[31m-                lsopt.so_keepalive = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"so_keepalive\" parameter accepts "[m
[31m-                                   "only \"on\" or \"off\" on this platform");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            lsopt.set = 1;[m
[31m-            lsopt.bind = 1;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-        invalid_so_keepalive:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid so_keepalive value: \"%s\"",[m
[31m-                               &value[n].data[13]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[n].data, "proxy_protocol") == 0) {[m
[31m-            lsopt.proxy_protocol = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[n]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_add_listen(cf, cscf, &lsopt) == NGX_OK) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t *cscf = conf;[m
[31m-[m
[31m-    u_char                   ch;[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        ch = value[i].data[0];[m
[31m-[m
[31m-        if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.'))[m
[31m-            || (ch == '.' && value[i].len < 2))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "server name \"%V\" is invalid", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strchr(value[i].data, '/')) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "server name \"%V\" has suspicious symbols",[m
[31m-                               &value[i]);[m
[31m-        }[m
[31m-[m
[31m-        sn = ngx_array_push(&cscf->server_names);[m
[31m-        if (sn == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        sn->regex = NULL;[m
[31m-#endif[m
[31m-        sn->server = cscf;[m
[31m-[m
[31m-        if (ngx_strcasecmp(value[i].data, (u_char *) "$hostname") == 0) {[m
[31m-            sn->name = cf->cycle->hostname;[m
[31m-[m
[31m-        } else {[m
[31m-            sn->name = value[i];[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].data[0] != '~') {[m
[31m-            ngx_strlow(sn->name.data, sn->name.data, sn->name.len);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        {[m
[31m-        u_char               *p;[m
[31m-        ngx_regex_compile_t   rc;[m
[31m-        u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-        if (value[i].len == 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "empty regex in server name \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value[i].len--;[m
[31m-        value[i].data++;[m
[31m-[m
[31m-        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-        rc.pattern = value[i];[m
[31m-        rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-        rc.err.data = errstr;[m
[31m-[m
[31m-        for (p = value[i].data; p < value[i].data + value[i].len; p++) {[m
[31m-            if (*p >= 'A' && *p <= 'Z') {[m
[31m-                rc.options = NGX_REGEX_CASELESS;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        sn->regex = ngx_http_regex_compile(cf, &rc);[m
[31m-        if (sn->regex == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sn->name = value[i];[m
[31m-        cscf->captures = (rc.captures > 0);[m
[31m-        }[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "using regex \"%V\" "[m
[31m-                           "requires PCRE library", &value[i]);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_int_t                   alias;[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    alias = (cmd->name.len == sizeof("alias") - 1) ? 1 : 0;[m
[31m-[m
[31m-    if (clcf->root.data) {[m
[31m-[m
[31m-        if ((clcf->alias != 0) == alias) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" directive is duplicate",[m
[31m-                               &cmd->name);[m
[31m-        } else {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "\"%V\" directive is duplicate, "[m
[31m-                               "\"%s\" directive was specified earlier",[m
[31m-                               &cmd->name, clcf->alias ? "alias" : "root");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->named && alias) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the \"alias\" directive cannot be used "[m
[31m-                           "inside the named location");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strstr(value[1].data, "$document_root")[m
[31m-        || ngx_strstr(value[1].data, "${document_root}"))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the $document_root variable cannot be used "[m
[31m-                           "in the \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstr(value[1].data, "$realpath_root")[m
[31m-        || ngx_strstr(value[1].data, "${realpath_root}"))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the $realpath_root variable cannot be used "[m
[31m-                           "in the \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->alias = alias ? clcf->name.len : 0;[m
[31m-    clcf->root = value[1];[m
[31m-[m
[31m-    if (!alias && clcf->root.len > 0[m
[31m-        && clcf->root.data[clcf->root.len - 1] == '/')[m
[31m-    {[m
[31m-        clcf->root.len--;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->root.data[0] != '$') {[m
[31m-        if (ngx_conf_full_name(cf->cycle, &clcf->root, 0) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(&clcf->root);[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-    sc.variables = n;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (alias && clcf->regex) {[m
[31m-        clcf->alias = NGX_MAX_SIZE_T_VALUE;[m
[31m-        n = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (n) {[m
[31m-        sc.cf = cf;[m
[31m-        sc.source = &clcf->root;[m
[31m-        sc.lengths = &clcf->root_lengths;[m
[31m-        sc.values = &clcf->root_values;[m
[31m-        sc.complete_lengths = 1;[m
[31m-        sc.complete_values = 1;[m
[31m-[m
[31m-        if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_method_name_t  ngx_methods_names[] = {[m
[31m-    { (u_char *) "GET",       (uint32_t) ~NGX_HTTP_GET },[m
[31m-    { (u_char *) "HEAD",      (uint32_t) ~NGX_HTTP_HEAD },[m
[31m-    { (u_char *) "POST",      (uint32_t) ~NGX_HTTP_POST },[m
[31m-    { (u_char *) "PUT",       (uint32_t) ~NGX_HTTP_PUT },[m
[31m-    { (u_char *) "DELETE",    (uint32_t) ~NGX_HTTP_DELETE },[m
[31m-    { (u_char *) "MKCOL",     (uint32_t) ~NGX_HTTP_MKCOL },[m
[31m-    { (u_char *) "COPY",      (uint32_t) ~NGX_HTTP_COPY },[m
[31m-    { (u_char *) "MOVE",      (uint32_t) ~NGX_HTTP_MOVE },[m
[31m-    { (u_char *) "OPTIONS",   (uint32_t) ~NGX_HTTP_OPTIONS },[m
[31m-    { (u_char *) "PROPFIND",  (uint32_t) ~NGX_HTTP_PROPFIND },[m
[31m-    { (u_char *) "PROPPATCH", (uint32_t) ~NGX_HTTP_PROPPATCH },[m
[31m-    { (u_char *) "LOCK",      (uint32_t) ~NGX_HTTP_LOCK },[m
[31m-    { (u_char *) "UNLOCK",    (uint32_t) ~NGX_HTTP_UNLOCK },[m
[31m-    { (u_char *) "PATCH",     (uint32_t) ~NGX_HTTP_PATCH },[m
[31m-    { NULL, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_limit_except(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *pclcf = conf;[m
[31m-[m
[31m-    char                      *rv;[m
[31m-    void                      *mconf;[m
[31m-    ngx_str_t                 *value;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_conf_t                 save;[m
[31m-    ngx_http_module_t         *module;[m
[31m-    ngx_http_conf_ctx_t       *ctx, *pctx;[m
[31m-    ngx_http_method_name_t    *name;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (pclcf->limit_except) {[m
[31m-        return "duplicate";[m
[31m-    }[m
[31m-[m
[31m-    pclcf->limit_except = 0xffffffff;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        for (name = ngx_methods_names; name->name; name++) {[m
[31m-[m
[31m-            if (ngx_strcasecmp(value[i].data, name->name) == 0) {[m
[31m-                pclcf->limit_except &= name->method;[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid method \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    if (!(pclcf->limit_except & NGX_HTTP_GET)) {[m
[31m-        pclcf->limit_except &= (uint32_t) ~NGX_HTTP_HEAD;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cf->cycle->modules[i]; i++) {[m
[31m-        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    pclcf->limit_except_loc_conf = ctx->loc_conf;[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-    clcf->name = pclcf->name;[m
[31m-    clcf->noname = 1;[m
[31m-    clcf->lmt_excpt = 1;[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_LMT_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_set_aio(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->aio != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    clcf->thread_pool = NULL;[m
[31m-    clcf->thread_pool_value = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        clcf->aio = NGX_HTTP_AIO_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "on") == 0) {[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-        clcf->aio = NGX_HTTP_AIO_ON;[m
[31m-        return NGX_CONF_OK;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"aio on\" "[m
[31m-                           "is unsupported on this platform");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "sendfile") == 0) {[m
[31m-        clcf->aio = NGX_HTTP_AIO_ON;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "the \"sendfile\" parameter of "[m
[31m-                           "the \"aio\" directive is deprecated");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_strncmp(value[1].data, "threads", 7) == 0[m
[31m-        && (value[1].len == 7 || value[1].data[7] == '='))[m
[31m-    {[m
[31m-#if (NGX_THREADS)[m
[31m-        ngx_str_t                          name;[m
[31m-        ngx_thread_pool_t                 *tp;[m
[31m-        ngx_http_complex_value_t           cv;[m
[31m-        ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-        clcf->aio = NGX_HTTP_AIO_THREADS;[m
[31m-[m
[31m-        if (value[1].len >= 8) {[m
[31m-            name.len = value[1].len - 8;[m
[31m-            name.data = value[1].data + 8;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &name;[m
[31m-            ccv.complex_value = &cv;[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (cv.lengths != NULL) {[m
[31m-                clcf->thread_pool_value = ngx_palloc(cf->pool,[m
[31m-                                    sizeof(ngx_http_complex_value_t));[m
[31m-                if (clcf->thread_pool_value == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                *clcf->thread_pool_value = cv;[m
[31m-[m
[31m-                return NGX_CONF_OK;[m
[31m-            }[m
[31m-[m
[31m-            tp = ngx_thread_pool_add(cf, &name);[m
[31m-[m
[31m-        } else {[m
[31m-            tp = ngx_thread_pool_add(cf, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf->thread_pool = tp;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-#else[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"aio threads\" "[m
[31m-                           "is unsupported on this platform");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return "invalid value";[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->directio != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        clcf->directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf->directio = ngx_parse_offset(&value[1]);[m
[31m-    if (clcf->directio == (off_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    u_char                            *p;[m
[31m-    ngx_int_t                          overwrite;[m
[31m-    ngx_str_t                         *value, uri, args;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    ngx_http_err_page_t               *err;[m
[31m-    ngx_http_complex_value_t           cv;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return "conflicts with \"no_error_pages\"";[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->error_pages == NGX_CONF_UNSET_PTR) {[m
[31m-        clcf->error_pages = ngx_array_create(cf->pool, 4,[m
[31m-                                             sizeof(ngx_http_err_page_t));[m
[31m-        if (clcf->error_pages == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    i = cf->args->nelts - 2;[m
[31m-[m
[31m-    if (value[i].data[0] == '=') {[m
[31m-        if (i == 1) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > 1) {[m
[31m-            overwrite = ngx_atoi(&value[i].data[1], value[i].len - 1);[m
[31m-[m
[31m-            if (overwrite == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            overwrite = 0;[m
[31m-        }[m
[31m-[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        overwrite = -1;[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    uri = value[cf->args->nelts - 1];[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &uri;[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_null(&args);[m
[31m-[m
[31m-    if (cv.lengths == NULL && uri.len && uri.data[0] == '/') {[m
[31m-        p = (u_char *) ngx_strchr(uri.data, '?');[m
[31m-[m
[31m-        if (p) {[m
[31m-            cv.value.len = p - uri.data;[m
[31m-            cv.value.data = uri.data;[m
[31m-            p++;[m
[31m-            args.len = (uri.data + uri.len) - p;[m
[31m-            args.data = p;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts - n; i++) {[m
[31m-        err = ngx_array_push(clcf->error_pages);[m
[31m-        if (err == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        err->status = ngx_atoi(value[i].data, value[i].len);[m
[31m-[m
[31m-        if (err->status == NGX_ERROR || err->status == 499) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid value \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (err->status < 300 || err->status > 599) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "value \"%V\" must be between 300 and 599",[m
[31m-                               &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        err->overwrite = overwrite;[m
[31m-[m
[31m-        if (overwrite == -1) {[m
[31m-            switch (err->status) {[m
[31m-                case NGX_HTTP_TO_HTTPS:[m
[31m-                case NGX_HTTPS_CERT_ERROR:[m
[31m-                case NGX_HTTPS_NO_CERT:[m
[31m-                    err->overwrite = NGX_HTTP_BAD_REQUEST;[m
[31m-                default:[m
[31m-                    break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        err->value = cv;[m
[31m-        err->args = args;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->error_pages != NGX_CONF_UNSET_PTR) {[m
[31m-        return "conflicts with \"error_page\"";[m
[31m-    }[m
[31m-[m
[31m-    clcf->error_pages = NULL;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_int_t                   code;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_try_file_t        *tf;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    if (clcf->try_files) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    cmcf->try_files = 1;[m
[31m-[m
[31m-    tf = ngx_pcalloc(cf->pool, cf->args->nelts * sizeof(ngx_http_try_file_t));[m
[31m-    if (tf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->try_files = tf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 0; i < cf->args->nelts - 1; i++) {[m
[31m-[m
[31m-        tf[i].name = value[i + 1];[m
[31m-[m
[31m-        if (tf[i].name.len > 0[m
[31m-            && tf[i].name.data[tf[i].name.len - 1] == '/'[m
[31m-            && i + 2 < cf->args->nelts)[m
[31m-        {[m
[31m-            tf[i].test_dir = 1;[m
[31m-            tf[i].name.len--;[m
[31m-            tf[i].name.data[tf[i].name.len] = '\0';[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_http_script_variables_count(&tf[i].name);[m
[31m-[m
[31m-        if (n) {[m
[31m-            ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-            sc.cf = cf;[m
[31m-            sc.source = &tf[i].name;[m
[31m-            sc.lengths = &tf[i].lengths;[m
[31m-            sc.values = &tf[i].values;[m
[31m-            sc.variables = n;[m
[31m-            sc.complete_lengths = 1;[m
[31m-            sc.complete_values = 1;[m
[31m-[m
[31m-            if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* add trailing '\0' to length */[m
[31m-            tf[i].name.len++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (tf[i - 1].name.data[0] == '=') {[m
[31m-[m
[31m-        code = ngx_atoi(tf[i - 1].name.data + 1, tf[i - 1].name.len - 2);[m
[31m-[m
[31m-        if (code == NGX_ERROR || code > 999) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid code \"%*s\"",[m
[31m-                               tf[i - 1].name.len - 1, tf[i - 1].name.data);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tf[i].code = code;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    time_t       inactive;[m
[31m-    ngx_str_t   *value, s;[m
[31m-    ngx_int_t    max;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    if (clcf->open_file_cache != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    max = 0;[m
[31m-    inactive = 60;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", 4) == 0) {[m
[31m-[m
[31m-            max = ngx_atoi(value[i].data + 4, value[i].len - 4);[m
[31m-            if (max <= 0) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-[m
[31m-            clcf->open_file_cache = NULL;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    failed:[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid \"open_file_cache\" parameter \"%V\"",[m
[31m-                           &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->open_file_cache == NULL) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (max == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                        "\"open_file_cache\" must have the \"max\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive);[m
[31m-    if (clcf->open_file_cache) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &clcf->error_log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->keepalive_timeout != NGX_CONF_UNSET_MSEC) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    clcf->keepalive_timeout = ngx_parse_time(&value[1], 0);[m
[31m-[m
[31m-    if (clcf->keepalive_timeout == (ngx_msec_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf->keepalive_header = ngx_parse_time(&value[2], 1);[m
[31m-[m
[31m-    if (clcf->keepalive_header == (time_t) NGX_ERROR) {[m
[31m-        return "invalid value";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_internal(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    if (clcf->internal != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    clcf->internal = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (clcf->resolver) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    clcf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);[m
[31m-    if (clcf->resolver == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf = conf;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    ngx_str_t            *value;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_regex_elt_t      *re;[m
[31m-    ngx_regex_compile_t   rc;[m
[31m-    u_char                errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    if (clcf->gzip_disable == NGX_CONF_UNSET_PTR) {[m
[31m-        clcf->gzip_disable = ngx_array_create(cf->pool, 2,[m
[31m-                                              sizeof(ngx_regex_elt_t));[m
[31m-        if (clcf->gzip_disable == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "msie6") == 0) {[m
[31m-            clcf->gzip_disable_msie6 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "degradation") == 0) {[m
[31m-            clcf->gzip_disable_degradation = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        re = ngx_array_push(clcf->gzip_disable);[m
[31m-        if (re == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc.pattern = value[i];[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-[m
[31m-        if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        re->regex = rc.regex;[m
[31m-        re->name = value[i].data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#else[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        if (ngx_strcmp(value[i].data, "msie6") == 0) {[m
[31m-            clcf->gzip_disable_msie6 = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "degradation") == 0) {[m
[31m-            clcf->gzip_disable_degradation = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "without PCRE library \"gzip_disable\" supports "[m
[31m-                           "builtin \"msie6\" and \"degradation\" mask only");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_disable_symlinks(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t *clcf = conf;[m
[31m-[m
[31m-    ngx_str_t                         *value;[m
[31m-    ngx_uint_t                         i;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    if (clcf->disable_symlinks != NGX_CONF_UNSET_UINT) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_OFF;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "if_not_owner") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_NOTOWNER;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "on") == 0) {[m
[31m-            clcf->disable_symlinks = NGX_DISABLE_SYMLINKS_ON;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "from=", 5) == 0) {[m
[31m-            value[i].len -= 5;[m
[31m-            value[i].data += 5;[m
[31m-[m
[31m-            ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-            ccv.cf = cf;[m
[31m-            ccv.value = &value[i];[m
[31m-            ccv.complex_value = ngx_palloc(cf->pool,[m
[31m-                                           sizeof(ngx_http_complex_value_t));[m
[31m-            if (ccv.complex_value == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            clcf->disable_symlinks_from = ccv.complex_value;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks == NGX_CONF_UNSET_UINT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"off\", \"on\" "[m
[31m-                           "or \"if_not_owner\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        clcf->disable_symlinks_from = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks_from == NGX_CONF_UNSET_PTR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate parameters \"%V %V\"",[m
[31m-                           &value[1], &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"from=\" cannot be used with \"off\" parameter");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_core_pool_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp < NGX_MIN_POOL_SIZE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be no less than %uz",[m
[31m-                           NGX_MIN_POOL_SIZE);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*sp % NGX_POOL_ALIGNMENT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be a multiple of %uz",[m
[31m-                           NGX_POOL_ALIGNMENT);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.h[m
[1mdeleted file mode 100644[m
[1mindex 6c446a0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_core_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,604 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_CORE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_CORE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-#include <ngx_thread_pool.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_GZIP_PROXIED_OFF       0x0002[m
[31m-#define NGX_HTTP_GZIP_PROXIED_EXPIRED   0x0004[m
[31m-#define NGX_HTTP_GZIP_PROXIED_NO_CACHE  0x0008[m
[31m-#define NGX_HTTP_GZIP_PROXIED_NO_STORE  0x0010[m
[31m-#define NGX_HTTP_GZIP_PROXIED_PRIVATE   0x0020[m
[31m-#define NGX_HTTP_GZIP_PROXIED_NO_LM     0x0040[m
[31m-#define NGX_HTTP_GZIP_PROXIED_NO_ETAG   0x0080[m
[31m-#define NGX_HTTP_GZIP_PROXIED_AUTH      0x0100[m
[31m-#define NGX_HTTP_GZIP_PROXIED_ANY       0x0200[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_AIO_OFF                0[m
[31m-#define NGX_HTTP_AIO_ON                 1[m
[31m-#define NGX_HTTP_AIO_THREADS            2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_SATISFY_ALL            0[m
[31m-#define NGX_HTTP_SATISFY_ANY            1[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LINGERING_OFF          0[m
[31m-#define NGX_HTTP_LINGERING_ON           1[m
[31m-#define NGX_HTTP_LINGERING_ALWAYS       2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_IMS_OFF                0[m
[31m-#define NGX_HTTP_IMS_EXACT              1[m
[31m-#define NGX_HTTP_IMS_BEFORE             2[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_KEEPALIVE_DISABLE_NONE    0x0002[m
[31m-#define NGX_HTTP_KEEPALIVE_DISABLE_MSIE6   0x0004[m
[31m-#define NGX_HTTP_KEEPALIVE_DISABLE_SAFARI  0x0008[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_location_tree_node_s  ngx_http_location_tree_node_t;[m
[31m-typedef struct ngx_http_core_loc_conf_s  ngx_http_core_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    union {[m
[31m-        struct sockaddr        sockaddr;[m
[31m-        struct sockaddr_in     sockaddr_in;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        struct sockaddr_in6    sockaddr_in6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        struct sockaddr_un     sockaddr_un;[m
[31m-#endif[m
[31m-        u_char                 sockaddr_data[NGX_SOCKADDRLEN];[m
[31m-    } u;[m
[31m-[m
[31m-    socklen_t                  socklen;[m
[31m-[m
[31m-    unsigned                   set:1;[m
[31m-    unsigned                   default_server:1;[m
[31m-    unsigned                   bind:1;[m
[31m-    unsigned                   wildcard:1;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    unsigned                   ssl:1;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    unsigned                   http2:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    unsigned                   ipv6only:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    unsigned                   reuseport:1;[m
[31m-#endif[m
[31m-    unsigned                   so_keepalive:2;[m
[31m-    unsigned                   proxy_protocol:1;[m
[31m-[m
[31m-    int                        backlog;[m
[31m-    int                        rcvbuf;[m
[31m-    int                        sndbuf;[m
[31m-#if (NGX_HAVE_SETFIB)[m
[31m-    int                        setfib;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_TCP_FASTOPEN)[m
[31m-    int                        fastopen;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    int                        tcp_keepidle;[m
[31m-    int                        tcp_keepintvl;[m
[31m-    int                        tcp_keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)[m
[31m-    char                      *accept_filter;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)[m
[31m-    ngx_uint_t                 deferred_accept;[m
[31m-#endif[m
[31m-[m
[31m-    u_char                     addr[NGX_SOCKADDR_STRLEN + 1];[m
[31m-} ngx_http_listen_opt_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_POST_READ_PHASE = 0,[m
[31m-[m
[31m-    NGX_HTTP_SERVER_REWRITE_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_FIND_CONFIG_PHASE,[m
[31m-    NGX_HTTP_REWRITE_PHASE,[m
[31m-    NGX_HTTP_POST_REWRITE_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_PREACCESS_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_ACCESS_PHASE,[m
[31m-    NGX_HTTP_POST_ACCESS_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_TRY_FILES_PHASE,[m
[31m-    NGX_HTTP_CONTENT_PHASE,[m
[31m-[m
[31m-    NGX_HTTP_LOG_PHASE[m
[31m-} ngx_http_phases;[m
[31m-[m
[31m-typedef struct ngx_http_phase_handler_s  ngx_http_phase_handler_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_phase_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-[m
[31m-struct ngx_http_phase_handler_s {[m
[31m-    ngx_http_phase_handler_pt  checker;[m
[31m-    ngx_http_handler_pt        handler;[m
[31m-    ngx_uint_t                 next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_phase_handler_t  *handlers;[m
[31m-    ngx_uint_t                 server_rewrite_index;[m
[31m-    ngx_uint_t                 location_rewrite_index;[m
[31m-} ngx_http_phase_engine_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                handlers;[m
[31m-} ngx_http_phase_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                servers;         /* ngx_http_core_srv_conf_t */[m
[31m-[m
[31m-    ngx_http_phase_engine_t    phase_engine;[m
[31m-[m
[31m-    ngx_hash_t                 headers_in_hash;[m
[31m-[m
[31m-    ngx_hash_t                 variables_hash;[m
[31m-[m
[31m-    ngx_array_t                variables;       /* ngx_http_variable_t */[m
[31m-    ngx_uint_t                 ncaptures;[m
[31m-[m
[31m-    ngx_uint_t                 server_names_hash_max_size;[m
[31m-    ngx_uint_t                 server_names_hash_bucket_size;[m
[31m-[m
[31m-    ngx_uint_t                 variables_hash_max_size;[m
[31m-    ngx_uint_t                 variables_hash_bucket_size;[m
[31m-[m
[31m-    ngx_hash_keys_arrays_t    *variables_keys;[m
[31m-[m
[31m-    ngx_array_t               *ports;[m
[31m-[m
[31m-    ngx_uint_t                 try_files;       /* unsigned  try_files:1 */[m
[31m-[m
[31m-    ngx_http_phase_t           phases[NGX_HTTP_LOG_PHASE + 1];[m
[31m-} ngx_http_core_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* array of the ngx_http_server_name_t, "server_name" directive */[m
[31m-    ngx_array_t                 server_names;[m
[31m-[m
[31m-    /* server ctx */[m
[31m-    ngx_http_conf_ctx_t        *ctx;[m
[31m-[m
[31m-    ngx_str_t                   server_name;[m
[31m-[m
[31m-    size_t                      connection_pool_size;[m
[31m-    size_t                      request_pool_size;[m
[31m-    size_t                      client_header_buffer_size;[m
[31m-[m
[31m-    ngx_bufs_t                  large_client_header_buffers;[m
[31m-[m
[31m-    ngx_msec_t                  client_header_timeout;[m
[31m-[m
[31m-    ngx_flag_t                  ignore_invalid_headers;[m
[31m-    ngx_flag_t                  merge_slashes;[m
[31m-    ngx_flag_t                  underscores_in_headers;[m
[31m-[m
[31m-    unsigned                    listen:1;[m
[31m-#if (NGX_PCRE)[m
[31m-    unsigned                    captures:1;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_core_loc_conf_t  **named_locations;[m
[31m-} ngx_http_core_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-/* list of structures to find core_srv_conf quickly at run time */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_regex_t          *regex;[m
[31m-#endif[m
[31m-    ngx_http_core_srv_conf_t  *server;   /* virtual name server conf */[m
[31m-    ngx_str_t                  name;[m
[31m-} ngx_http_server_name_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_combined_t        names;[m
[31m-[m
[31m-    ngx_uint_t                 nregex;[m
[31m-    ngx_http_server_name_t    *regex;[m
[31m-} ngx_http_virtual_names_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_addr_conf_s {[m
[31m-    /* the default server configuration for this address:port */[m
[31m-    ngx_http_core_srv_conf_t  *default_server;[m
[31m-[m
[31m-    ngx_http_virtual_names_t  *virtual_names;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    unsigned                   ssl:1;[m
[31m-#endif[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    unsigned                   http2:1;[m
[31m-#endif[m
[31m-    unsigned                   proxy_protocol:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t                  addr;[m
[31m-    ngx_http_addr_conf_t       conf;[m
[31m-} ngx_http_in_addr_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr            addr6;[m
[31m-    ngx_http_addr_conf_t       conf;[m
[31m-} ngx_http_in6_addr_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* ngx_http_in_addr_t or ngx_http_in6_addr_t */[m
[31m-    void                      *addrs;[m
[31m-    ngx_uint_t                 naddrs;[m
[31m-} ngx_http_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                  family;[m
[31m-    in_port_t                  port;[m
[31m-    ngx_array_t                addrs;     /* array of ngx_http_conf_addr_t */[m
[31m-} ngx_http_conf_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_listen_opt_t      opt;[m
[31m-[m
[31m-    ngx_hash_t                 hash;[m
[31m-    ngx_hash_wildcard_t       *wc_head;[m
[31m-    ngx_hash_wildcard_t       *wc_tail;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                 nregex;[m
[31m-    ngx_http_server_name_t    *regex;[m
[31m-#endif[m
[31m-[m
[31m-    /* the default server configuration for this address:port */[m
[31m-    ngx_http_core_srv_conf_t  *default_server;[m
[31m-    ngx_array_t                servers;  /* array of ngx_http_core_srv_conf_t */[m
[31m-} ngx_http_conf_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                  status;[m
[31m-    ngx_int_t                  overwrite;[m
[31m-    ngx_http_complex_value_t   value;[m
[31m-    ngx_str_t                  args;[m
[31m-} ngx_http_err_page_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t               *lengths;[m
[31m-    ngx_array_t               *values;[m
[31m-    ngx_str_t                  name;[m
[31m-[m
[31m-    unsigned                   code:10;[m
[31m-    unsigned                   test_dir:1;[m
[31m-} ngx_http_try_file_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_core_loc_conf_s {[m
[31m-    ngx_str_t     name;          /* location name */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_regex_t  *regex;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned      noname:1;   /* "if () {}" block or limit_except */[m
[31m-    unsigned      lmt_excpt:1;[m
[31m-    unsigned      named:1;[m
[31m-[m
[31m-    unsigned      exact_match:1;[m
[31m-    unsigned      noregex:1;[m
[31m-[m
[31m-    unsigned      auto_redirect:1;[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    unsigned      gzip_disable_msie6:2;[m
[31m-#if (NGX_HTTP_DEGRADATION)[m
[31m-    unsigned      gzip_disable_degradation:2;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_location_tree_node_t   *static_locations;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_core_loc_conf_t       **regex_locations;[m
[31m-#endif[m
[31m-[m
[31m-    /* pointer to the modules' loc_conf */[m
[31m-    void        **loc_conf;[m
[31m-[m
[31m-    uint32_t      limit_except;[m
[31m-    void        **limit_except_loc_conf;[m
[31m-[m
[31m-    ngx_http_handler_pt  handler;[m
[31m-[m
[31m-    /* location name length for inclusive location with inherited alias */[m
[31m-    size_t        alias;[m
[31m-    ngx_str_t     root;                    /* root, alias */[m
[31m-    ngx_str_t     post_action;[m
[31m-[m
[31m-    ngx_array_t  *root_lengths;[m
[31m-    ngx_array_t  *root_values;[m
[31m-[m
[31m-    ngx_array_t  *types;[m
[31m-    ngx_hash_t    types_hash;[m
[31m-    ngx_str_t     default_type;[m
[31m-[m
[31m-    off_t         client_max_body_size;    /* client_max_body_size */[m
[31m-    off_t         directio;                /* directio */[m
[31m-    off_t         directio_alignment;      /* directio_alignment */[m
[31m-[m
[31m-    size_t        client_body_buffer_size; /* client_body_buffer_size */[m
[31m-    size_t        send_lowat;              /* send_lowat */[m
[31m-    size_t        postpone_output;         /* postpone_output */[m
[31m-    size_t        limit_rate;              /* limit_rate */[m
[31m-    size_t        limit_rate_after;        /* limit_rate_after */[m
[31m-    size_t        sendfile_max_chunk;      /* sendfile_max_chunk */[m
[31m-    size_t        read_ahead;              /* read_ahead */[m
[31m-[m
[31m-    ngx_msec_t    client_body_timeout;     /* client_body_timeout */[m
[31m-    ngx_msec_t    send_timeout;            /* send_timeout */[m
[31m-    ngx_msec_t    keepalive_timeout;       /* keepalive_timeout */[m
[31m-    ngx_msec_t    lingering_time;          /* lingering_time */[m
[31m-    ngx_msec_t    lingering_timeout;       /* lingering_timeout */[m
[31m-    ngx_msec_t    resolver_timeout;        /* resolver_timeout */[m
[31m-[m
[31m-    ngx_resolver_t  *resolver;             /* resolver */[m
[31m-[m
[31m-    time_t        keepalive_header;        /* keepalive_timeout */[m
[31m-[m
[31m-    ngx_uint_t    keepalive_requests;      /* keepalive_requests */[m
[31m-    ngx_uint_t    keepalive_disable;       /* keepalive_disable */[m
[31m-    ngx_uint_t    satisfy;                 /* satisfy */[m
[31m-    ngx_uint_t    lingering_close;         /* lingering_close */[m
[31m-    ngx_uint_t    if_modified_since;       /* if_modified_since */[m
[31m-    ngx_uint_t    max_ranges;              /* max_ranges */[m
[31m-    ngx_uint_t    client_body_in_file_only; /* client_body_in_file_only */[m
[31m-[m
[31m-    ngx_flag_t    client_body_in_single_buffer;[m
[31m-                                           /* client_body_in_singe_buffer */[m
[31m-    ngx_flag_t    internal;                /* internal */[m
[31m-    ngx_flag_t    sendfile;                /* sendfile */[m
[31m-    ngx_flag_t    aio;                     /* aio */[m
[31m-    ngx_flag_t    aio_write;               /* aio_write */[m
[31m-    ngx_flag_t    tcp_nopush;              /* tcp_nopush */[m
[31m-    ngx_flag_t    tcp_nodelay;             /* tcp_nodelay */[m
[31m-    ngx_flag_t    reset_timedout_connection; /* reset_timedout_connection */[m
[31m-    ngx_flag_t    server_name_in_redirect; /* server_name_in_redirect */[m
[31m-    ngx_flag_t    port_in_redirect;        /* port_in_redirect */[m
[31m-    ngx_flag_t    msie_padding;            /* msie_padding */[m
[31m-    ngx_flag_t    msie_refresh;            /* msie_refresh */[m
[31m-    ngx_flag_t    log_not_found;           /* log_not_found */[m
[31m-    ngx_flag_t    log_subrequest;          /* log_subrequest */[m
[31m-    ngx_flag_t    recursive_error_pages;   /* recursive_error_pages */[m
[31m-    ngx_flag_t    server_tokens;           /* server_tokens */[m
[31m-    ngx_flag_t    chunked_transfer_encoding; /* chunked_transfer_encoding */[m
[31m-    ngx_flag_t    etag;                    /* etag */[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    ngx_flag_t    gzip_vary;               /* gzip_vary */[m
[31m-[m
[31m-    ngx_uint_t    gzip_http_version;       /* gzip_http_version */[m
[31m-    ngx_uint_t    gzip_proxied;            /* gzip_proxied */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_array_t  *gzip_disable;            /* gzip_disable */[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_thread_pool_t         *thread_pool;[m
[31m-    ngx_http_complex_value_t  *thread_pool_value;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-    ngx_uint_t    disable_symlinks;        /* disable_symlinks */[m
[31m-    ngx_http_complex_value_t  *disable_symlinks_from;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t  *error_pages;             /* error_page */[m
[31m-    ngx_http_try_file_t    *try_files;     /* try_files */[m
[31m-[m
[31m-    ngx_path_t   *client_body_temp_path;   /* client_body_temp_path */[m
[31m-[m
[31m-    ngx_open_file_cache_t  *open_file_cache;[m
[31m-    time_t        open_file_cache_valid;[m
[31m-    ngx_uint_t    open_file_cache_min_uses;[m
[31m-    ngx_flag_t    open_file_cache_errors;[m
[31m-    ngx_flag_t    open_file_cache_events;[m
[31m-[m
[31m-    ngx_log_t    *error_log;[m
[31m-[m
[31m-    ngx_uint_t    types_hash_max_size;[m
[31m-    ngx_uint_t    types_hash_bucket_size;[m
[31m-[m
[31m-    ngx_queue_t  *locations;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_core_loc_conf_t  *prev_location;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_queue_t                      queue;[m
[31m-    ngx_http_core_loc_conf_t        *exact;[m
[31m-    ngx_http_core_loc_conf_t        *inclusive;[m
[31m-    ngx_str_t                       *name;[m
[31m-    u_char                          *file_name;[m
[31m-    ngx_uint_t                       line;[m
[31m-    ngx_queue_t                      list;[m
[31m-} ngx_http_location_queue_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_location_tree_node_s {[m
[31m-    ngx_http_location_tree_node_t   *left;[m
[31m-    ngx_http_location_tree_node_t   *right;[m
[31m-    ngx_http_location_tree_node_t   *tree;[m
[31m-[m
[31m-    ngx_http_core_loc_conf_t        *exact;[m
[31m-    ngx_http_core_loc_conf_t        *inclusive;[m
[31m-[m
[31m-    u_char                           auto_redirect;[m
[31m-    u_char                           len;[m
[31m-    u_char                           name[1];[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void ngx_http_core_run_phases(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_core_generic_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_rewrite_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_find_config_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_post_rewrite_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_access_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_post_access_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_try_files_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-ngx_int_t ngx_http_core_content_phase(ngx_http_request_t *r,[m
[31m-    ngx_http_phase_handler_t *ph);[m
[31m-[m
[31m-[m
[31m-void *ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash);[m
[31m-ngx_int_t ngx_http_set_content_type(ngx_http_request_t *r);[m
[31m-void ngx_http_set_exten(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_set_etag(ngx_http_request_t *r);[m
[31m-void ngx_http_weak_etag(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,[m
[31m-    ngx_str_t *ct, ngx_http_complex_value_t *cv);[m
[31m-u_char *ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *name,[m
[31m-    size_t *root_length, size_t reserved);[m
[31m-ngx_int_t ngx_http_auth_basic_user(ngx_http_request_t *r);[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-ngx_int_t ngx_http_gzip_ok(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **sr,[m
[31m-    ngx_http_post_subrequest_t *psr, ngx_uint_t flags);[m
[31m-ngx_int_t ngx_http_internal_redirect(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args);[m
[31m-ngx_int_t ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name);[m
[31m-[m
[31m-[m
[31m-ngx_http_cleanup_t *ngx_http_cleanup_add(ngx_http_request_t *r, size_t size);[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_output_header_filter_pt)(ngx_http_request_t *r);[m
[31m-typedef ngx_int_t (*ngx_http_output_body_filter_pt)[m
[31m-    (ngx_http_request_t *r, ngx_chain_t *chain);[m
[31m-typedef ngx_int_t (*ngx_http_request_body_filter_pt)[m
[31m-    (ngx_http_request_t *r, ngx_chain_t *chain);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *chain);[m
[31m-ngx_int_t ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *chain);[m
[31m-ngx_int_t ngx_http_request_body_save_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *chain);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_set_disable_symlinks(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_str_t *path, ngx_open_file_info_t *of);[m
[31m-[m
[31m-ngx_int_t ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,[m
[31m-    ngx_array_t *headers, ngx_str_t *value, ngx_array_t *proxies,[m
[31m-    int recursive);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_core_module;[m
[31m-[m
[31m-extern ngx_uint_t ngx_http_max_module;[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_core_get_method;[m
[31m-[m
[31m-[m
[31m-#define ngx_http_clear_content_length(r)                                      \[m
[31m-                                                                              \[m
[31m-    r->headers_out.content_length_n = -1;                                     \[m
[31m-    if (r->headers_out.content_length) {                                      \[m
[31m-        r->headers_out.content_length->hash = 0;                              \[m
[31m-        r->headers_out.content_length = NULL;                                 \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_clear_accept_ranges(r)                                       \[m
[31m-                                                                              \[m
[31m-    r->allow_ranges = 0;                                                      \[m
[31m-    if (r->headers_out.accept_ranges) {                                       \[m
[31m-        r->headers_out.accept_ranges->hash = 0;                               \[m
[31m-        r->headers_out.accept_ranges = NULL;                                  \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_clear_last_modified(r)                                       \[m
[31m-                                                                              \[m
[31m-    r->headers_out.last_modified_time = -1;                                   \[m
[31m-    if (r->headers_out.last_modified) {                                       \[m
[31m-        r->headers_out.last_modified->hash = 0;                               \[m
[31m-        r->headers_out.last_modified = NULL;                                  \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_clear_location(r)                                            \[m
[31m-                                                                              \[m
[31m-    if (r->headers_out.location) {                                            \[m
[31m-        r->headers_out.location->hash = 0;                                    \[m
[31m-        r->headers_out.location = NULL;                                       \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_clear_etag(r)                                                \[m
[31m-                                                                              \[m
[31m-    if (r->headers_out.etag) {                                                \[m
[31m-        r->headers_out.etag->hash = 0;                                        \[m
[31m-        r->headers_out.etag = NULL;                                           \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_CORE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_file_cache.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_file_cache.c[m
[1mdeleted file mode 100644[m
[1mindex 37cd377..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_file_cache.c[m
[1m+++ /dev/null[m
[36m@@ -1,2567 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_md5.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_file_cache_lock(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static void ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_file_cache_lock_wait(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ngx_int_t ngx_http_file_cache_read(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ssize_t ngx_http_file_cache_aio_read(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-static void ngx_http_cache_aio_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-#if (NGX_THREADS)[m
[31m-static ngx_int_t ngx_http_cache_thread_handler(ngx_thread_task_t *task,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_cache_thread_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_file_cache_exists(ngx_http_file_cache_t *cache,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ngx_int_t ngx_http_file_cache_name(ngx_http_request_t *r,[m
[31m-    ngx_path_t *path);[m
[31m-static ngx_http_file_cache_node_t *[m
[31m-    ngx_http_file_cache_lookup(ngx_http_file_cache_t *cache, u_char *key);[m
[31m-static void ngx_http_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-static void ngx_http_file_cache_vary(ngx_http_request_t *r, u_char *vary,[m
[31m-    size_t len, u_char *hash);[m
[31m-static void ngx_http_file_cache_vary_header(ngx_http_request_t *r,[m
[31m-    ngx_md5_t *md5, ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_file_cache_reopen(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ngx_int_t ngx_http_file_cache_update_variant(ngx_http_request_t *r,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static void ngx_http_file_cache_cleanup(void *data);[m
[31m-static time_t ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache);[m
[31m-static time_t ngx_http_file_cache_expire(ngx_http_file_cache_t *cache);[m
[31m-static void ngx_http_file_cache_delete(ngx_http_file_cache_t *cache,[m
[31m-    ngx_queue_t *q, u_char *name);[m
[31m-static void ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache);[m
[31m-static ngx_int_t ngx_http_file_cache_noop(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_file_cache_manage_file(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_file_cache_manage_directory(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_file_cache_add_file(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static ngx_int_t ngx_http_file_cache_add(ngx_http_file_cache_t *cache,[m
[31m-    ngx_http_cache_t *c);[m
[31m-static ngx_int_t ngx_http_file_cache_delete_file(ngx_tree_ctx_t *ctx,[m
[31m-    ngx_str_t *path);[m
[31m-static void ngx_http_file_cache_set_watermark(ngx_http_file_cache_t *cache);[m
[31m-[m
[31m-[m
[31m-ngx_str_t  ngx_http_cache_status[] = {[m
[31m-    ngx_string("MISS"),[m
[31m-    ngx_string("BYPASS"),[m
[31m-    ngx_string("EXPIRED"),[m
[31m-    ngx_string("STALE"),[m
[31m-    ngx_string("UPDATING"),[m
[31m-    ngx_string("REVALIDATED"),[m
[31m-    ngx_string("HIT")[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_char  ngx_http_file_cache_key[] = { LF, 'K', 'E', 'Y', ':', ' ' };[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *ocache = data;[m
[31m-[m
[31m-    size_t                  len;[m
[31m-    ngx_uint_t              n;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    cache = shm_zone->data;[m
[31m-[m
[31m-    if (ocache) {[m
[31m-        if (ngx_strcmp(cache->path->name.data, ocache->path->name.data) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,[m
[31m-                          "cache \"%V\" uses the \"%V\" cache path "[m
[31m-                          "while previously it used the \"%V\" cache path",[m
[31m-                          &shm_zone->shm.name, &cache->path->name,[m
[31m-                          &ocache->path->name);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        for (n = 0; n < 3; n++) {[m
[31m-            if (cache->path->level[n] != ocache->path->level[n]) {[m
[31m-                ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,[m
[31m-                              "cache \"%V\" had previously different levels",[m
[31m-                              &shm_zone->shm.name);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        cache->sh = ocache->sh;[m
[31m-[m
[31m-        cache->shpool = ocache->shpool;[m
[31m-        cache->bsize = ocache->bsize;[m
[31m-[m
[31m-        cache->max_size /= cache->bsize;[m
[31m-[m
[31m-        if (!cache->sh->cold || cache->sh->loading) {[m
[31m-            cache->path->loader = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        cache->sh = cache->shpool->data;[m
[31m-        cache->bsize = ngx_fs_bsize(cache->path->name.data);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cache->sh = ngx_slab_alloc(cache->shpool, sizeof(ngx_http_file_cache_sh_t));[m
[31m-    if (cache->sh == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cache->shpool->data = cache->sh;[m
[31m-[m
[31m-    ngx_rbtree_init(&cache->sh->rbtree, &cache->sh->sentinel,[m
[31m-                    ngx_http_file_cache_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&cache->sh->queue);[m
[31m-[m
[31m-    cache->sh->cold = 1;[m
[31m-    cache->sh->loading = 0;[m
[31m-    cache->sh->size = 0;[m
[31m-    cache->sh->count = 0;[m
[31m-    cache->sh->watermark = (ngx_uint_t) -1;[m
[31m-[m
[31m-    cache->bsize = ngx_fs_bsize(cache->path->name.data);[m
[31m-[m
[31m-    cache->max_size /= cache->bsize;[m
[31m-[m
[31m-    len = sizeof(" in cache keys zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    cache->shpool->log_ctx = ngx_slab_alloc(cache->shpool, len);[m
[31m-    if (cache->shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(cache->shpool->log_ctx, " in cache keys zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    cache->shpool->log_nomem = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_file_cache_new(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    c = ngx_pcalloc(r->pool, sizeof(ngx_http_cache_t));[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&c->keys, r->pool, 4, sizeof(ngx_str_t)) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->cache = c;[m
[31m-    c->file.log = r->connection->log;[m
[31m-    c->file.fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_file_cache_create(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_cache_t       *c;[m
[31m-    ngx_pool_cleanup_t     *cln;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_file_cache_cleanup;[m
[31m-    cln->data = c;[m
[31m-[m
[31m-    if (ngx_http_file_cache_exists(cache, c) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_file_cache_create_key(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t             len;[m
[31m-    ngx_str_t         *key;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_md5_t          md5;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    ngx_crc32_init(c->crc32);[m
[31m-    ngx_md5_init(&md5);[m
[31m-[m
[31m-    key = c->keys.elts;[m
[31m-    for (i = 0; i < c->keys.nelts; i++) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http cache key: \"%V\"", &key[i]);[m
[31m-[m
[31m-        len += key[i].len;[m
[31m-[m
[31m-        ngx_crc32_update(&c->crc32, key[i].data, key[i].len);[m
[31m-        ngx_md5_update(&md5, key[i].data, key[i].len);[m
[31m-    }[m
[31m-[m
[31m-    c->header_start = sizeof(ngx_http_file_cache_header_t)[m
[31m-                      + sizeof(ngx_http_file_cache_key) + len + 1;[m
[31m-[m
[31m-    ngx_crc32_final(c->crc32);[m
[31m-    ngx_md5_final(c->key, &md5);[m
[31m-[m
[31m-    ngx_memcpy(c->main, c->key, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_file_cache_open(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc, rv;[m
[31m-    ngx_uint_t                 test;[m
[31m-    ngx_http_cache_t          *c;[m
[31m-    ngx_pool_cleanup_t        *cln;[m
[31m-    ngx_open_file_info_t       of;[m
[31m-    ngx_http_file_cache_t     *cache;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->waiting) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (c->reading) {[m
[31m-        return ngx_http_file_cache_read(r, c);[m
[31m-    }[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    if (c->node == NULL) {[m
[31m-        cln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_file_cache_cleanup;[m
[31m-        cln->data = c;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_file_cache_exists(cache, c);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache exists: %i e:%d", rc, c->exists);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return NGX_HTTP_CACHE_SCARCE;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        if (c->error) {[m
[31m-            return c->error;[m
[31m-        }[m
[31m-[m
[31m-        c->temp_file = 1;[m
[31m-        test = c->exists ? 1 : 0;[m
[31m-        rv = NGX_DECLINED;[m
[31m-[m
[31m-    } else { /* rc == NGX_DECLINED */[m
[31m-[m
[31m-        test = cache->sh->cold ? 1 : 0;[m
[31m-[m
[31m-        if (c->min_uses > 1) {[m
[31m-[m
[31m-            if (!test) {[m
[31m-                return NGX_HTTP_CACHE_SCARCE;[m
[31m-            }[m
[31m-[m
[31m-            rv = NGX_HTTP_CACHE_SCARCE;[m
[31m-[m
[31m-        } else {[m
[31m-            c->temp_file = 1;[m
[31m-            rv = NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!test) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.uniq = c->uniq;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-    of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &c->file.name, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        switch (of.err) {[m
[31m-[m
[31m-        case 0:[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        case NGX_ENOENT:[m
[31m-        case NGX_ENOTDIR:[m
[31m-            goto done;[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                          ngx_open_file_n " \"%s\" failed", c->file.name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache fd: %d", of.fd);[m
[31m-[m
[31m-    c->file.fd = of.fd;[m
[31m-    c->file.log = r->connection->log;[m
[31m-    c->uniq = of.uniq;[m
[31m-    c->length = of.size;[m
[31m-    c->fs_size = (of.fs_size + cache->bsize - 1) / cache->bsize;[m
[31m-[m
[31m-    c->buf = ngx_create_temp_buf(r->pool, c->body_start);[m
[31m-    if (c->buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_file_cache_read(r, c);[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (rv == NGX_DECLINED) {[m
[31m-        return ngx_http_file_cache_lock(r, c);[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_lock(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_msec_t                 now, timer;[m
[31m-    ngx_http_file_cache_t     *cache;[m
[31m-[m
[31m-    if (!c->lock) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_current_msec;[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    timer = c->node->lock_time - now;[m
[31m-[m
[31m-    if (!c->node->updating || (ngx_msec_int_t) timer <= 0) {[m
[31m-        c->node->updating = 1;[m
[31m-        c->node->lock_time = now + c->lock_age;[m
[31m-        c->updating = 1;[m
[31m-        c->lock_time = c->node->lock_time;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache lock u:%d wt:%M",[m
[31m-                   c->updating, c->wait_time);[m
[31m-[m
[31m-    if (c->updating) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (c->lock_timeout == 0) {[m
[31m-        return NGX_HTTP_CACHE_SCARCE;[m
[31m-    }[m
[31m-[m
[31m-    c->waiting = 1;[m
[31m-[m
[31m-    if (c->wait_time == 0) {[m
[31m-        c->wait_time = now + c->lock_timeout;[m
[31m-[m
[31m-        c->wait_event.handler = ngx_http_file_cache_lock_wait_handler;[m
[31m-        c->wait_event.data = r;[m
[31m-        c->wait_event.log = r->connection->log;[m
[31m-    }[m
[31m-[m
[31m-    timer = c->wait_time - now;[m
[31m-[m
[31m-    ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer);[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http file cache wait: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ngx_http_file_cache_lock_wait(r, r->cache);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_lock_wait(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_uint_t              wait;[m
[31m-    ngx_msec_t              now, timer;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    now = ngx_current_msec;[m
[31m-[m
[31m-    timer = c->wait_time - now;[m
[31m-[m
[31m-    if ((ngx_msec_int_t) timer <= 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "cache lock timeout");[m
[31m-        c->lock_timeout = 0;[m
[31m-        goto wakeup;[m
[31m-    }[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-    wait = 0;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    timer = c->node->lock_time - now;[m
[31m-[m
[31m-    if (c->node->updating && (ngx_msec_int_t) timer > 0) {[m
[31m-        wait = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    if (wait) {[m
[31m-        ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-wakeup:[m
[31m-[m
[31m-    c->waiting = 0;[m
[31m-    r->main->blocked--;[m
[31m-    r->write_event_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    u_char                        *p;[m
[31m-    time_t                         now;[m
[31m-    ssize_t                        n;[m
[31m-    ngx_str_t                     *key;[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_http_file_cache_t         *cache;[m
[31m-    ngx_http_file_cache_header_t  *h;[m
[31m-[m
[31m-    n = ngx_http_file_cache_aio_read(r, c);[m
[31m-[m
[31m-    if (n < 0) {[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n < c->header_start) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" is too small", c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    h = (ngx_http_file_cache_header_t *) c->buf->pos;[m
[31m-[m
[31m-    if (h->version != NGX_HTTP_CACHE_VERSION) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" version mismatch", c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (h->crc32 != c->crc32 || h->header_start != c->header_start) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" has md5 collision", c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    p = c->buf->pos + sizeof(ngx_http_file_cache_header_t)[m
[31m-        + sizeof(ngx_http_file_cache_key);[m
[31m-[m
[31m-    key = c->keys.elts;[m
[31m-    for (i = 0; i < c->keys.nelts; i++) {[m
[31m-        if (ngx_memcmp(p, key[i].data, key[i].len) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                          "cache file \"%s\" has md5 collision",[m
[31m-                          c->file.name.data);[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        p += key[i].len;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) h->body_start > c->body_start) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" has too long header",[m
[31m-                      c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (h->vary_len > NGX_HTTP_CACHE_VARY_LEN) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" has incorrect vary length",[m
[31m-                      c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (h->vary_len) {[m
[31m-        ngx_http_file_cache_vary(r, h->vary, h->vary_len, c->variant);[m
[31m-[m
[31m-        if (ngx_memcmp(c->variant, h->variant, NGX_HTTP_CACHE_KEY_LEN) != 0) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http file cache vary mismatch");[m
[31m-            return ngx_http_file_cache_reopen(r, c);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->buf->last += n;[m
[31m-[m
[31m-    c->valid_sec = h->valid_sec;[m
[31m-    c->last_modified = h->last_modified;[m
[31m-    c->date = h->date;[m
[31m-    c->valid_msec = h->valid_msec;[m
[31m-    c->body_start = h->body_start;[m
[31m-    c->etag.len = h->etag_len;[m
[31m-    c->etag.data = h->etag;[m
[31m-[m
[31m-    r->cached = 1;[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    if (cache->sh->cold) {[m
[31m-[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-        if (!c->node->exists) {[m
[31m-            c->node->uses = 1;[m
[31m-            c->node->body_start = c->body_start;[m
[31m-            c->node->exists = 1;[m
[31m-            c->node->uniq = c->uniq;[m
[31m-            c->node->fs_size = c->fs_size;[m
[31m-[m
[31m-            cache->sh->size += c->fs_size;[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    if (c->valid_sec < now) {[m
[31m-[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-        if (c->node->updating) {[m
[31m-            rc = NGX_HTTP_CACHE_UPDATING;[m
[31m-[m
[31m-        } else {[m
[31m-            c->node->updating = 1;[m
[31m-            c->updating = 1;[m
[31m-            c->lock_time = c->node->lock_time;[m
[31m-            rc = NGX_HTTP_CACHE_STALE;[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http file cache expired: %i %T %T",[m
[31m-                       rc, c->valid_sec, now);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_file_cache_aio_read(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-#if (NGX_HAVE_FILE_AIO || NGX_THREADS)[m
[31m-    ssize_t                    n;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-    if (clcf->aio == NGX_HTTP_AIO_ON && ngx_file_aio) {[m
[31m-        n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);[m
[31m-[m
[31m-        if (n != NGX_AGAIN) {[m
[31m-            c->reading = 0;[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        c->reading = 1;[m
[31m-[m
[31m-        c->file.aio->data = r;[m
[31m-        c->file.aio->handler = ngx_http_cache_aio_event_handler;[m
[31m-[m
[31m-        r->main->blocked++;[m
[31m-        r->aio = 1;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-    if (clcf->aio == NGX_HTTP_AIO_THREADS) {[m
[31m-        c->file.thread_task = c->thread_task;[m
[31m-        c->file.thread_handler = ngx_http_cache_thread_handler;[m
[31m-        c->file.thread_ctx = r;[m
[31m-[m
[31m-        n = ngx_thread_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);[m
[31m-[m
[31m-        c->thread_task = c->file.thread_task;[m
[31m-        c->reading = (n == NGX_AGAIN);[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_cache_aio_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t     *aio;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-    r = aio->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http file cache aio: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_cache_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_thread_pool_t         *tp;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r = file->thread_ctx;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    tp = clcf->thread_pool;[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "thread pool \"%V\" not found", &name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    task->event.data = r;[m
[31m-    task->event.handler = ngx_http_cache_thread_event_handler;[m
[31m-[m
[31m-    if (ngx_thread_task_post(tp, task) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_cache_thread_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http file cache thread: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_exists(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    fcn = c->node;[m
[31m-[m
[31m-    if (fcn == NULL) {[m
[31m-        fcn = ngx_http_file_cache_lookup(cache, c->key);[m
[31m-    }[m
[31m-[m
[31m-    if (fcn) {[m
[31m-        ngx_queue_remove(&fcn->queue);[m
[31m-[m
[31m-        if (c->node == NULL) {[m
[31m-            fcn->uses++;[m
[31m-            fcn->count++;[m
[31m-        }[m
[31m-[m
[31m-        if (fcn->error) {[m
[31m-[m
[31m-            if (fcn->valid_sec < ngx_time()) {[m
[31m-                goto renew;[m
[31m-            }[m
[31m-[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        if (fcn->exists || fcn->uses >= c->min_uses) {[m
[31m-[m
[31m-            c->exists = fcn->exists;[m
[31m-            if (fcn->body_start) {[m
[31m-                c->body_start = fcn->body_start;[m
[31m-            }[m
[31m-[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        rc = NGX_AGAIN;[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    fcn = ngx_slab_calloc_locked(cache->shpool,[m
[31m-                                 sizeof(ngx_http_file_cache_node_t));[m
[31m-    if (fcn == NULL) {[m
[31m-        ngx_http_file_cache_set_watermark(cache);[m
[31m-[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-        (void) ngx_http_file_cache_forced_expire(cache);[m
[31m-[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-        fcn = ngx_slab_calloc_locked(cache->shpool,[m
[31m-                                     sizeof(ngx_http_file_cache_node_t));[m
[31m-        if (fcn == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "could not allocate node%s", cache->shpool->log_ctx);[m
[31m-            rc = NGX_ERROR;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cache->sh->count++;[m
[31m-[m
[31m-    ngx_memcpy((u_char *) &fcn->node.key, c->key, sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-    ngx_memcpy(fcn->key, &c->key[sizeof(ngx_rbtree_key_t)],[m
[31m-               NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-    ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);[m
[31m-[m
[31m-    fcn->uses = 1;[m
[31m-    fcn->count = 1;[m
[31m-[m
[31m-renew:[m
[31m-[m
[31m-    rc = NGX_DECLINED;[m
[31m-[m
[31m-    fcn->valid_msec = 0;[m
[31m-    fcn->error = 0;[m
[31m-    fcn->exists = 0;[m
[31m-    fcn->valid_sec = 0;[m
[31m-    fcn->uniq = 0;[m
[31m-    fcn->body_start = 0;[m
[31m-    fcn->fs_size = 0;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    fcn->expire = ngx_time() + cache->inactive;[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);[m
[31m-[m
[31m-    c->uniq = fcn->uniq;[m
[31m-    c->error = fcn->error;[m
[31m-    c->node = fcn;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path)[m
[31m-{[m
[31m-    u_char            *p;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->file.name.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    c->file.name.len = path->name.len + 1 + path->len[m
[31m-                       + 2 * NGX_HTTP_CACHE_KEY_LEN;[m
[31m-[m
[31m-    c->file.name.data = ngx_pnalloc(r->pool, c->file.name.len + 1);[m
[31m-    if (c->file.name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(c->file.name.data, path->name.data, path->name.len);[m
[31m-[m
[31m-    p = c->file.name.data + path->name.len + 1 + path->len;[m
[31m-    p = ngx_hex_dump(p, c->key, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    ngx_create_hashed_filename(path, c->file.name.data, c->file.name.len);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cache file: \"%s\"", c->file.name.data);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_file_cache_node_t *[m
[31m-ngx_http_file_cache_lookup(ngx_http_file_cache_t *cache, u_char *key)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_rbtree_key_t             node_key;[m
[31m-    ngx_rbtree_node_t           *node, *sentinel;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    ngx_memcpy((u_char *) &node_key, key, sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-    node = cache->sh->rbtree.root;[m
[31m-    sentinel = cache->sh->rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (node_key < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (node_key > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* node_key == node->key */[m
[31m-[m
[31m-        fcn = (ngx_http_file_cache_node_t *) node;[m
[31m-[m
[31m-        rc = ngx_memcmp(&key[sizeof(ngx_rbtree_key_t)], fcn->key,[m
[31m-                        NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return fcn;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    /* not found */[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t           **p;[m
[31m-    ngx_http_file_cache_node_t   *cn, *cnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            cn = (ngx_http_file_cache_node_t *) node;[m
[31m-            cnt = (ngx_http_file_cache_node_t *) temp;[m
[31m-[m
[31m-            p = (ngx_memcmp(cn->key, cnt->key,[m
[31m-                            NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t))[m
[31m-                 < 0)[m
[31m-                    ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_vary(ngx_http_request_t *r, u_char *vary, size_t len,[m
[31m-    u_char *hash)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t   name;[m
[31m-    ngx_md5_t   md5;[m
[31m-    u_char      buf[NGX_HTTP_CACHE_VARY_LEN];[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache vary: \"%*s\"", len, vary);[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, r->cache->main, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-[m
[31m-    ngx_strlow(buf, vary, len);[m
[31m-[m
[31m-    p = buf;[m
[31m-    last = buf + len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        while (p < last && (*p == ' ' || *p == ',')) { p++; }[m
[31m-[m
[31m-        name.data = p;[m
[31m-[m
[31m-        while (p < last && *p != ',' && *p != ' ') { p++; }[m
[31m-[m
[31m-        name.len = p - name.data;[m
[31m-[m
[31m-        if (name.len == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http file cache vary: %V", &name);[m
[31m-[m
[31m-        ngx_md5_update(&md5, name.data, name.len);[m
[31m-        ngx_md5_update(&md5, (u_char *) ":", sizeof(":") - 1);[m
[31m-[m
[31m-        ngx_http_file_cache_vary_header(r, &md5, &name);[m
[31m-[m
[31m-        ngx_md5_update(&md5, (u_char *) CRLF, sizeof(CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_final(hash, &md5);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_vary_header(ngx_http_request_t *r, ngx_md5_t *md5,[m
[31m-    ngx_str_t *name)[m
[31m-{[m
[31m-    size_t            len;[m
[31m-    u_char           *p, *start, *last;[m
[31m-    ngx_uint_t        i, multiple, normalize;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_table_elt_t  *header;[m
[31m-[m
[31m-    multiple = 0;[m
[31m-    normalize = 0;[m
[31m-[m
[31m-    if (name->len == sizeof("Accept-Charset") - 1[m
[31m-        && ngx_strncasecmp(name->data, (u_char *) "Accept-Charset",[m
[31m-                           sizeof("Accept-Charset") - 1) == 0)[m
[31m-    {[m
[31m-        normalize = 1;[m
[31m-[m
[31m-    } else if (name->len == sizeof("Accept-Encoding") - 1[m
[31m-        && ngx_strncasecmp(name->data, (u_char *) "Accept-Encoding",[m
[31m-                           sizeof("Accept-Encoding") - 1) == 0)[m
[31m-    {[m
[31m-        normalize = 1;[m
[31m-[m
[31m-    } else if (name->len == sizeof("Accept-Language") - 1[m
[31m-        && ngx_strncasecmp(name->data, (u_char *) "Accept-Language",[m
[31m-                           sizeof("Accept-Language") - 1) == 0)[m
[31m-    {[m
[31m-        normalize = 1;[m
[31m-    }[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len != name->len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(header[i].key.data, name->data, name->len) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (!normalize) {[m
[31m-[m
[31m-            if (multiple) {[m
[31m-                ngx_md5_update(md5, (u_char *) ",", sizeof(",") - 1);[m
[31m-            }[m
[31m-[m
[31m-            ngx_md5_update(md5, header[i].value.data, header[i].value.len);[m
[31m-[m
[31m-            multiple = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* normalize spaces */[m
[31m-[m
[31m-        p = header[i].value.data;[m
[31m-        last = p + header[i].value.len;[m
[31m-[m
[31m-        while (p < last) {[m
[31m-[m
[31m-            while (p < last && (*p == ' ' || *p == ',')) { p++; }[m
[31m-[m
[31m-            start = p;[m
[31m-[m
[31m-            while (p < last && *p != ',' && *p != ' ') { p++; }[m
[31m-[m
[31m-            len = p - start;[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (multiple) {[m
[31m-                ngx_md5_update(md5, (u_char *) ",", sizeof(",") - 1);[m
[31m-            }[m
[31m-[m
[31m-            ngx_md5_update(md5, start, len);[m
[31m-[m
[31m-            multiple = 1;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_reopen(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->file.log, 0,[m
[31m-                   "http file cache reopen");[m
[31m-[m
[31m-    if (c->secondary) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      "cache file \"%s\" has incorrect vary hash",[m
[31m-                      c->file.name.data);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->node->count--;[m
[31m-    c->node = NULL;[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->secondary = 1;[m
[31m-    c->file.name.len = 0;[m
[31m-    c->body_start = c->buf->end - c->buf->start;[m
[31m-[m
[31m-    ngx_memcpy(c->key, c->variant, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-[m
[31m-    return ngx_http_file_cache_open(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf)[m
[31m-{[m
[31m-    ngx_http_file_cache_header_t  *h = (ngx_http_file_cache_header_t *) buf;[m
[31m-[m
[31m-    u_char            *p;[m
[31m-    ngx_str_t         *key;[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache set header");[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    ngx_memzero(h, sizeof(ngx_http_file_cache_header_t));[m
[31m-[m
[31m-    h->version = NGX_HTTP_CACHE_VERSION;[m
[31m-    h->valid_sec = c->valid_sec;[m
[31m-    h->last_modified = c->last_modified;[m
[31m-    h->date = c->date;[m
[31m-    h->crc32 = c->crc32;[m
[31m-    h->valid_msec = (u_short) c->valid_msec;[m
[31m-    h->header_start = (u_short) c->header_start;[m
[31m-    h->body_start = (u_short) c->body_start;[m
[31m-[m
[31m-    if (c->etag.len <= NGX_HTTP_CACHE_ETAG_LEN) {[m
[31m-        h->etag_len = (u_char) c->etag.len;[m
[31m-        ngx_memcpy(h->etag, c->etag.data, c->etag.len);[m
[31m-    }[m
[31m-[m
[31m-    if (c->vary.len) {[m
[31m-        if (c->vary.len > NGX_HTTP_CACHE_VARY_LEN) {[m
[31m-            /* should not happen */[m
[31m-            c->vary.len = NGX_HTTP_CACHE_VARY_LEN;[m
[31m-        }[m
[31m-[m
[31m-        h->vary_len = (u_char) c->vary.len;[m
[31m-        ngx_memcpy(h->vary, c->vary.data, c->vary.len);[m
[31m-[m
[31m-        ngx_http_file_cache_vary(r, c->vary.data, c->vary.len, c->variant);[m
[31m-        ngx_memcpy(h->variant, c->variant, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_file_cache_update_variant(r, c) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = buf + sizeof(ngx_http_file_cache_header_t);[m
[31m-[m
[31m-    p = ngx_cpymem(p, ngx_http_file_cache_key, sizeof(ngx_http_file_cache_key));[m
[31m-[m
[31m-    key = c->keys.elts;[m
[31m-    for (i = 0; i < c->keys.nelts; i++) {[m
[31m-        p = ngx_copy(p, key[i].data, key[i].len);[m
[31m-    }[m
[31m-[m
[31m-    *p = LF;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_update_variant(ngx_http_request_t *r, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    if (!c->secondary) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c->vary.len[m
[31m-        && ngx_memcmp(c->variant, c->key, NGX_HTTP_CACHE_KEY_LEN) == 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * if the variant hash doesn't match one we used as a secondary[m
[31m-     * cache key, switch back to the original key[m
[31m-     */[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache main key");[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->node->count--;[m
[31m-    c->node->updating = 0;[m
[31m-    c->node = NULL;[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->file.name.len = 0;[m
[31m-[m
[31m-    ngx_memcpy(c->key, c->main, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-[m
[31m-    if (ngx_http_file_cache_exists(cache, c) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_file_cache_name(r, cache->path) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)[m
[31m-{[m
[31m-    off_t                   fs_size;[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_file_uniq_t         uniq;[m
[31m-    ngx_file_info_t         fi;[m
[31m-    ngx_http_cache_t        *c;[m
[31m-    ngx_ext_rename_file_t   ext;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->updated) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache update");[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    c->updated = 1;[m
[31m-    c->updating = 0;[m
[31m-[m
[31m-    uniq = 0;[m
[31m-    fs_size = 0;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache rename: \"%s\" to \"%s\"",[m
[31m-                   tf->file.name.data, c->file.name.data);[m
[31m-[m
[31m-    ext.access = NGX_FILE_OWNER_ACCESS;[m
[31m-    ext.path_access = NGX_FILE_OWNER_ACCESS;[m
[31m-    ext.time = -1;[m
[31m-    ext.create_path = 1;[m
[31m-    ext.delete_file = 1;[m
[31m-    ext.log = r->connection->log;[m
[31m-[m
[31m-    rc = ngx_ext_rename_file(&tf->file.name, &c->file.name, &ext);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        if (ngx_fd_info(tf->file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                          ngx_fd_info_n " \"%s\" failed", tf->file.name.data);[m
[31m-[m
[31m-            rc = NGX_ERROR;[m
[31m-[m
[31m-        } else {[m
[31m-            uniq = ngx_file_uniq(&fi);[m
[31m-            fs_size = (ngx_file_fs_size(&fi) + cache->bsize - 1) / cache->bsize;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->node->count--;[m
[31m-    c->node->uniq = uniq;[m
[31m-    c->node->body_start = c->body_start;[m
[31m-[m
[31m-    cache->sh->size += fs_size - c->node->fs_size;[m
[31m-    c->node->fs_size = fs_size;[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        c->node->exists = 1;[m
[31m-    }[m
[31m-[m
[31m-    c->node->updating = 0;[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_file_cache_update_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                        n;[m
[31m-    ngx_err_t                      err;[m
[31m-    ngx_file_t                     file;[m
[31m-    ngx_file_info_t                fi;[m
[31m-    ngx_http_cache_t              *c;[m
[31m-    ngx_http_file_cache_header_t   h;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache update header");[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    ngx_memzero(&file, sizeof(ngx_file_t));[m
[31m-[m
[31m-    file.name = c->file.name;[m
[31m-    file.log = r->connection->log;[m
[31m-    file.fd = ngx_open_file(file.name.data, NGX_FILE_RDWR, NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    if (file.fd == NGX_INVALID_FILE) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        /* cache file may have been deleted */[m
[31m-[m
[31m-        if (err == NGX_ENOENT) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http file cache \"%s\" not found",[m
[31m-                           file.name.data);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                      ngx_open_file_n " \"%s\" failed", file.name.data);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * make sure cache file wasn't replaced;[m
[31m-     * if it was, do nothing[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      ngx_fd_info_n " \"%s\" failed", file.name.data);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (c->uniq != ngx_file_uniq(&fi)[m
[31m-        || c->length != ngx_file_size(&fi))[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http file cache \"%s\" changed",[m
[31m-                       file.name.data);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_read_file(&file, (u_char *) &h,[m
[31m-                      sizeof(ngx_http_file_cache_header_t), 0);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != sizeof(ngx_http_file_cache_header_t)) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,[m
[31m-                      ngx_read_file_n " read only %z of %z from \"%s\"",[m
[31m-                      n, sizeof(ngx_http_file_cache_header_t), file.name.data);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (h.version != NGX_HTTP_CACHE_VERSION[m
[31m-        || h.last_modified != c->last_modified[m
[31m-        || h.crc32 != c->crc32[m
[31m-        || h.header_start != c->header_start[m
[31m-        || h.body_start != c->body_start)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http file cache \"%s\" content changed",[m
[31m-                       file.name.data);[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * update cache file header with new data,[m
[31m-     * notably h.valid_sec and h.date[m
[31m-     */[m
[31m-[m
[31m-    ngx_memzero(&h, sizeof(ngx_http_file_cache_header_t));[m
[31m-[m
[31m-    h.version = NGX_HTTP_CACHE_VERSION;[m
[31m-    h.valid_sec = c->valid_sec;[m
[31m-    h.last_modified = c->last_modified;[m
[31m-    h.date = c->date;[m
[31m-    h.crc32 = c->crc32;[m
[31m-    h.valid_msec = (u_short) c->valid_msec;[m
[31m-    h.header_start = (u_short) c->header_start;[m
[31m-    h.body_start = (u_short) c->body_start;[m
[31m-[m
[31m-    if (c->etag.len <= NGX_HTTP_CACHE_ETAG_LEN) {[m
[31m-        h.etag_len = (u_char) c->etag.len;[m
[31m-        ngx_memcpy(h.etag, c->etag.data, c->etag.len);[m
[31m-    }[m
[31m-[m
[31m-    if (c->vary.len) {[m
[31m-        if (c->vary.len > NGX_HTTP_CACHE_VARY_LEN) {[m
[31m-            /* should not happen */[m
[31m-            c->vary.len = NGX_HTTP_CACHE_VARY_LEN;[m
[31m-        }[m
[31m-[m
[31m-        h.vary_len = (u_char) c->vary.len;[m
[31m-        ngx_memcpy(h.vary, c->vary.data, c->vary.len);[m
[31m-[m
[31m-        ngx_http_file_cache_vary(r, c->vary.data, c->vary.len, c->variant);[m
[31m-        ngx_memcpy(h.variant, c->variant, NGX_HTTP_CACHE_KEY_LEN);[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_write_file(&file, (u_char *) &h,[m
[31m-                          sizeof(ngx_http_file_cache_header_t), 0);[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", file.name.data);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_cache_send(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_chain_t        out;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http file cache send: %s", c->file.name.data);[m
[31m-[m
[31m-    if (r != r->main && c->length - c->body_start == 0) {[m
[31m-        return ngx_http_send_header(r);[m
[31m-    }[m
[31m-[m
[31m-    /* we need to allocate all before the header would be sent */[m
[31m-[m
[31m-    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b->file_pos = c->body_start;[m
[31m-    b->file_last = c->length;[m
[31m-[m
[31m-    b->in_file = (c->length - c->body_start) ? 1: 0;[m
[31m-    b->last_buf = (r == r->main) ? 1: 0;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    b->file->fd = c->file.fd;[m
[31m-    b->file->name = c->file.name;[m
[31m-    b->file->log = r->connection->log;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf)[m
[31m-{[m
[31m-    ngx_http_file_cache_t       *cache;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    if (c->updated || c->node == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cache = c->file_cache;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->file.log, 0,[m
[31m-                   "http file cache free, fd: %d", c->file.fd);[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    fcn = c->node;[m
[31m-    fcn->count--;[m
[31m-[m
[31m-    if (c->updating && fcn->lock_time == c->lock_time) {[m
[31m-        fcn->updating = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        fcn->error = c->error;[m
[31m-[m
[31m-        if (c->valid_sec) {[m
[31m-            fcn->valid_sec = c->valid_sec;[m
[31m-            fcn->valid_msec = c->valid_msec;[m
[31m-        }[m
[31m-[m
[31m-    } else if (!fcn->exists && fcn->count == 0 && c->min_uses == 1) {[m
[31m-        ngx_queue_remove(&fcn->queue);[m
[31m-        ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);[m
[31m-        ngx_slab_free_locked(cache->shpool, fcn);[m
[31m-        cache->sh->count--;[m
[31m-        c->node = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    c->updated = 1;[m
[31m-    c->updating = 0;[m
[31m-[m
[31m-    if (c->temp_file) {[m
[31m-        if (tf && tf->file.fd != NGX_INVALID_FILE) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->file.log, 0,[m
[31m-                           "http file cache incomplete: \"%s\"",[m
[31m-                           tf->file.name.data);[m
[31m-[m
[31m-            if (ngx_delete_file(tf->file.name.data) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_CRIT, c->file.log, ngx_errno,[m
[31m-                              ngx_delete_file_n " \"%s\" failed",[m
[31m-                              tf->file.name.data);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->wait_event.timer_set) {[m
[31m-        ngx_del_timer(&c->wait_event);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_cache_t  *c = data;[m
[31m-[m
[31m-    if (c->updated) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->file.log, 0,[m
[31m-                   "http file cache cleanup");[m
[31m-[m
[31m-    if (c->updating) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->file.log, 0,[m
[31m-                      "stalled cache updating, error:%ui", c->error);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_file_cache_free(c, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_http_file_cache_forced_expire(ngx_http_file_cache_t *cache)[m
[31m-{[m
[31m-    u_char                      *name;[m
[31m-    size_t                       len;[m
[31m-    time_t                       wait;[m
[31m-    ngx_uint_t                   tries;[m
[31m-    ngx_path_t                  *path;[m
[31m-    ngx_queue_t                 *q;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http file cache forced expire");[m
[31m-[m
[31m-    path = cache->path;[m
[31m-    len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;[m
[31m-[m
[31m-    name = ngx_alloc(len + 1, ngx_cycle->log);[m
[31m-    if (name == NULL) {[m
[31m-        return 10;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name, path->name.data, path->name.len);[m
[31m-[m
[31m-    wait = 10;[m
[31m-    tries = 20;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    for (q = ngx_queue_last(&cache->sh->queue);[m
[31m-         q != ngx_queue_sentinel(&cache->sh->queue);[m
[31m-         q = ngx_queue_prev(q))[m
[31m-    {[m
[31m-        fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                  "http file cache forced expire: #%d %d %02xd%02xd%02xd%02xd",[m
[31m-                  fcn->count, fcn->exists,[m
[31m-                  fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]);[m
[31m-[m
[31m-        if (fcn->count == 0) {[m
[31m-            ngx_http_file_cache_delete(cache, q, name);[m
[31m-            wait = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            if (--tries) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            wait = 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    ngx_free(name);[m
[31m-[m
[31m-    return wait;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_http_file_cache_expire(ngx_http_file_cache_t *cache)[m
[31m-{[m
[31m-    u_char                      *name, *p;[m
[31m-    size_t                       len;[m
[31m-    time_t                       now, wait;[m
[31m-    ngx_path_t                  *path;[m
[31m-    ngx_queue_t                 *q;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-    u_char                       key[2 * NGX_HTTP_CACHE_KEY_LEN];[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http file cache expire");[m
[31m-[m
[31m-    path = cache->path;[m
[31m-    len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;[m
[31m-[m
[31m-    name = ngx_alloc(len + 1, ngx_cycle->log);[m
[31m-    if (name == NULL) {[m
[31m-        return 10;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name, path->name.data, path->name.len);[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_quit || ngx_terminate) {[m
[31m-            wait = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_queue_empty(&cache->sh->queue)) {[m
[31m-            wait = 10;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&cache->sh->queue);[m
[31m-[m
[31m-        fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);[m
[31m-[m
[31m-        wait = fcn->expire - now;[m
[31m-[m
[31m-        if (wait > 0) {[m
[31m-            wait = wait > 10 ? 10 : wait;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "http file cache expire: #%d %d %02xd%02xd%02xd%02xd",[m
[31m-                       fcn->count, fcn->exists,[m
[31m-                       fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]);[m
[31m-[m
[31m-        if (fcn->count == 0) {[m
[31m-            ngx_http_file_cache_delete(cache, q, name);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (fcn->deleting) {[m
[31m-            wait = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_hex_dump(key, (u_char *) &fcn->node.key,[m
[31m-                         sizeof(ngx_rbtree_key_t));[m
[31m-        len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);[m
[31m-        (void) ngx_hex_dump(p, fcn->key, len);[m
[31m-[m
[31m-        /*[m
[31m-         * abnormally exited workers may leave locked cache entries,[m
[31m-         * and although it may be safe to remove them completely,[m
[31m-         * we prefer to just move them to the top of the inactive queue[m
[31m-         */[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-        fcn->expire = ngx_time() + cache->inactive;[m
[31m-        ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "ignore long locked inactive cache entry %*s, count:%d",[m
[31m-                      (size_t) 2 * NGX_HTTP_CACHE_KEY_LEN, key, fcn->count);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    ngx_free(name);[m
[31m-[m
[31m-    return wait;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_delete(ngx_http_file_cache_t *cache, ngx_queue_t *q,[m
[31m-    u_char *name)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_path_t                  *path;[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);[m
[31m-[m
[31m-    if (fcn->exists) {[m
[31m-        cache->sh->size -= fcn->fs_size;[m
[31m-[m
[31m-        path = cache->path;[m
[31m-        p = name + path->name.len + 1 + path->len;[m
[31m-        p = ngx_hex_dump(p, (u_char *) &fcn->node.key,[m
[31m-                         sizeof(ngx_rbtree_key_t));[m
[31m-        len = NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t);[m
[31m-        p = ngx_hex_dump(p, fcn->key, len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        fcn->count++;[m
[31m-        fcn->deleting = 1;[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-        len = path->name.len + 1 + path->len + 2 * NGX_HTTP_CACHE_KEY_LEN;[m
[31m-        ngx_create_hashed_filename(path, name, len);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "http file cache expire: \"%s\"", name);[m
[31m-[m
[31m-        if (ngx_delete_file(name) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,[m
[31m-                          ngx_delete_file_n " \"%s\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-        fcn->count--;[m
[31m-        fcn->deleting = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (fcn->count == 0) {[m
[31m-        ngx_queue_remove(q);[m
[31m-        ngx_rbtree_delete(&cache->sh->rbtree, &fcn->node);[m
[31m-        ngx_slab_free_locked(cache->shpool, fcn);[m
[31m-        cache->sh->count--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static time_t[m
[31m-ngx_http_file_cache_manager(void *data)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *cache = data;[m
[31m-[m
[31m-    off_t       size;[m
[31m-    time_t      next, wait;[m
[31m-    ngx_uint_t  count, watermark;[m
[31m-[m
[31m-    next = ngx_http_file_cache_expire(cache);[m
[31m-[m
[31m-    cache->last = ngx_current_msec;[m
[31m-    cache->files = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-        size = cache->sh->size;[m
[31m-        count = cache->sh->count;[m
[31m-        watermark = cache->sh->watermark;[m
[31m-[m
[31m-        ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "http file cache size: %O c:%ui w:%i",[m
[31m-                       size, count, (ngx_int_t) watermark);[m
[31m-[m
[31m-        if (size < cache->max_size && count < watermark) {[m
[31m-            return next;[m
[31m-        }[m
[31m-[m
[31m-        wait = ngx_http_file_cache_forced_expire(cache);[m
[31m-[m
[31m-        if (wait > 0) {[m
[31m-            return wait;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit || ngx_terminate) {[m
[31m-            return next;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_loader(void *data)[m
[31m-{[m
[31m-    ngx_http_file_cache_t  *cache = data;[m
[31m-[m
[31m-    ngx_tree_ctx_t  tree;[m
[31m-[m
[31m-    if (!cache->sh->cold || cache->sh->loading) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http file cache loader");[m
[31m-[m
[31m-    tree.init_handler = NULL;[m
[31m-    tree.file_handler = ngx_http_file_cache_manage_file;[m
[31m-    tree.pre_tree_handler = ngx_http_file_cache_manage_directory;[m
[31m-    tree.post_tree_handler = ngx_http_file_cache_noop;[m
[31m-    tree.spec_handler = ngx_http_file_cache_delete_file;[m
[31m-    tree.data = cache;[m
[31m-    tree.alloc = 0;[m
[31m-    tree.log = ngx_cycle->log;[m
[31m-[m
[31m-    cache->last = ngx_current_msec;[m
[31m-    cache->files = 0;[m
[31m-[m
[31m-    if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) {[m
[31m-        cache->sh->loading = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cache->sh->cold = 0;[m
[31m-    cache->sh->loading = 0;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,[m
[31m-                  "http file cache: %V %.3fM, bsize: %uz",[m
[31m-                  &cache->path->name,[m
[31m-                  ((double) cache->sh->size * cache->bsize) / (1024 * 1024),[m
[31m-                  cache->bsize);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_manage_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_msec_t              elapsed;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    cache = ctx->data;[m
[31m-[m
[31m-    if (ngx_http_file_cache_add_file(ctx, path) != NGX_OK) {[m
[31m-        (void) ngx_http_file_cache_delete_file(ctx, path);[m
[31m-    }[m
[31m-[m
[31m-    if (++cache->files >= cache->loader_files) {[m
[31m-        ngx_http_file_cache_loader_sleep(cache);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "http file cache loader time elapsed: %M", elapsed);[m
[31m-[m
[31m-        if (elapsed >= cache->loader_threshold) {[m
[31m-            ngx_http_file_cache_loader_sleep(cache);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return (ngx_quit || ngx_terminate) ? NGX_ABORT : NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_manage_directory(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    if (path->len >= 5[m
[31m-        && ngx_strncmp(path->data + path->len - 5, "/temp", 5) == 0)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_loader_sleep(ngx_http_file_cache_t *cache)[m
[31m-{[m
[31m-    ngx_msleep(cache->loader_sleep);[m
[31m-[m
[31m-    ngx_time_update();[m
[31m-[m
[31m-    cache->last = ngx_current_msec;[m
[31m-    cache->files = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_add_file(ngx_tree_ctx_t *ctx, ngx_str_t *name)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    ngx_int_t               n;[m
[31m-    ngx_uint_t              i;[m
[31m-    ngx_http_cache_t        c;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    if (name->len < 2 * NGX_HTTP_CACHE_KEY_LEN) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->size < (off_t) sizeof(ngx_http_file_cache_header_t)) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ctx->log, 0,[m
[31m-                      "cache file \"%s\" is too small", name->data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&c, sizeof(ngx_http_cache_t));[m
[31m-    cache = ctx->data;[m
[31m-[m
[31m-    c.length = ctx->size;[m
[31m-    c.fs_size = (ctx->fs_size + cache->bsize - 1) / cache->bsize;[m
[31m-[m
[31m-    p = &name->data[name->len - 2 * NGX_HTTP_CACHE_KEY_LEN];[m
[31m-[m
[31m-    for (i = 0; i < NGX_HTTP_CACHE_KEY_LEN; i++) {[m
[31m-        n = ngx_hextoi(p, 2);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        p += 2;[m
[31m-[m
[31m-        c.key[i] = (u_char) n;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_file_cache_add(cache, &c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_add(ngx_http_file_cache_t *cache, ngx_http_cache_t *c)[m
[31m-{[m
[31m-    ngx_http_file_cache_node_t  *fcn;[m
[31m-[m
[31m-    ngx_shmtx_lock(&cache->shpool->mutex);[m
[31m-[m
[31m-    fcn = ngx_http_file_cache_lookup(cache, c->key);[m
[31m-[m
[31m-    if (fcn == NULL) {[m
[31m-[m
[31m-        fcn = ngx_slab_calloc_locked(cache->shpool,[m
[31m-                                     sizeof(ngx_http_file_cache_node_t));[m
[31m-        if (fcn == NULL) {[m
[31m-            ngx_http_file_cache_set_watermark(cache);[m
[31m-[m
[31m-            if (cache->fail_time != ngx_time()) {[m
[31m-                cache->fail_time = ngx_time();[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                           "could not allocate node%s", cache->shpool->log_ctx);[m
[31m-            }[m
[31m-[m
[31m-            ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cache->sh->count++;[m
[31m-[m
[31m-        ngx_memcpy((u_char *) &fcn->node.key, c->key, sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-        ngx_memcpy(fcn->key, &c->key[sizeof(ngx_rbtree_key_t)],[m
[31m-                   NGX_HTTP_CACHE_KEY_LEN - sizeof(ngx_rbtree_key_t));[m
[31m-[m
[31m-        ngx_rbtree_insert(&cache->sh->rbtree, &fcn->node);[m
[31m-[m
[31m-        fcn->uses = 1;[m
[31m-        fcn->exists = 1;[m
[31m-        fcn->fs_size = c->fs_size;[m
[31m-[m
[31m-        cache->sh->size += c->fs_size;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_queue_remove(&fcn->queue);[m
[31m-    }[m
[31m-[m
[31m-    fcn->expire = ngx_time() + cache->inactive;[m
[31m-[m
[31m-    ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&cache->shpool->mutex);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_file_cache_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "http file cache delete: \"%s\"", path->data);[m
[31m-[m
[31m-    if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,[m
[31m-                      ngx_delete_file_n " \"%s\" failed", path->data);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_file_cache_set_watermark(ngx_http_file_cache_t *cache)[m
[31m-{[m
[31m-    cache->sh->watermark = cache->sh->count - cache->sh->count / 8;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http file cache watermark: %ui", cache->sh->watermark);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-time_t[m
[31m-ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_cache_valid_t  *valid;[m
[31m-[m
[31m-    if (cache_valid == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    valid = cache_valid->elts;[m
[31m-    for (i = 0; i < cache_valid->nelts; i++) {[m
[31m-[m
[31m-        if (valid[i].status == 0) {[m
[31m-            return valid[i].valid;[m
[31m-        }[m
[31m-[m
[31m-        if (valid[i].status == status) {[m
[31m-            return valid[i].valid;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *confp = conf;[m
[31m-[m
[31m-    off_t                   max_size;[m
[31m-    u_char                 *last, *p;[m
[31m-    time_t                  inactive;[m
[31m-    size_t                  len;[m
[31m-    ssize_t                 size;[m
[31m-    ngx_str_t               s, name, *value;[m
[31m-    ngx_int_t               loader_files;[m
[31m-    ngx_msec_t              loader_sleep, loader_threshold;[m
[31m-    ngx_uint_t              i, n, use_temp_path;[m
[31m-    ngx_array_t            *caches;[m
[31m-    ngx_http_file_cache_t  *cache, **ce;[m
[31m-[m
[31m-    cache = ngx_pcalloc(cf->pool, sizeof(ngx_http_file_cache_t));[m
[31m-    if (cache == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cache->path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));[m
[31m-    if (cache->path == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    use_temp_path = 1;[m
[31m-[m
[31m-    inactive = 600;[m
[31m-    loader_files = 100;[m
[31m-    loader_sleep = 50;[m
[31m-    loader_threshold = 200;[m
[31m-[m
[31m-    name.len = 0;[m
[31m-    size = 0;[m
[31m-    max_size = NGX_MAX_OFF_T_VALUE;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    cache->path->name = value[1];[m
[31m-[m
[31m-    if (cache->path->name.data[cache->path->name.len - 1] == '/') {[m
[31m-        cache->path->name.len--;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_conf_full_name(cf->cycle, &cache->path->name, 0) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "levels=", 7) == 0) {[m
[31m-[m
[31m-            p = value[i].data + 7;[m
[31m-            last = value[i].data + value[i].len;[m
[31m-[m
[31m-            for (n = 0; n < 3 && p < last; n++) {[m
[31m-[m
[31m-                if (*p > '0' && *p < '3') {[m
[31m-[m
[31m-                    cache->path->level[n] = *p++ - '0';[m
[31m-                    cache->path->len += cache->path->level[n] + 1;[m
[31m-[m
[31m-                    if (p == last) {[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (*p++ == ':' && n < 2 && p != last) {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    goto invalid_levels;[m
[31m-                }[m
[31m-[m
[31m-                goto invalid_levels;[m
[31m-            }[m
[31m-[m
[31m-            if (cache->path->len < 10 + 3) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-        invalid_levels:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid \"levels\" \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "use_temp_path=", 14) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[i].data[14], "on") == 0) {[m
[31m-                use_temp_path = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[i].data[14], "off") == 0) {[m
[31m-                use_temp_path = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid use_temp_path value \"%V\", "[m
[31m-                                   "it must be \"on\" or \"off\"",[m
[31m-                                   &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "keys_zone=", 10) == 0) {[m
[31m-[m
[31m-            name.data = value[i].data + 10;[m
[31m-[m
[31m-            p = (u_char *) ngx_strchr(name.data, ':');[m
[31m-[m
[31m-            if (p) {[m
[31m-                name.len = p - name.data;[m
[31m-[m
[31m-                p++;[m
[31m-[m
[31m-                s.len = value[i].data + value[i].len - p;[m
[31m-                s.data = p;[m
[31m-[m
[31m-                size = ngx_parse_size(&s);[m
[31m-                if (size > 8191) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid keys zone size \"%V\"", &value[i]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            inactive = ngx_parse_time(&s, 1);[m
[31m-            if (inactive == (time_t) NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid inactive value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_size=", 9) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 9;[m
[31m-            s.data = value[i].data + 9;[m
[31m-[m
[31m-            max_size = ngx_parse_offset(&s);[m
[31m-            if (max_size < 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid max_size value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "loader_files=", 13) == 0) {[m
[31m-[m
[31m-            loader_files = ngx_atoi(value[i].data + 13, value[i].len - 13);[m
[31m-            if (loader_files == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid loader_files value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "loader_sleep=", 13) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 13;[m
[31m-            s.data = value[i].data + 13;[m
[31m-[m
[31m-            loader_sleep = ngx_parse_time(&s, 0);[m
[31m-            if (loader_sleep == (ngx_msec_t) NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid loader_sleep value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "loader_threshold=", 17) == 0) {[m
[31m-[m
[31m-            s.len = value[i].len - 17;[m
[31m-            s.data = value[i].data + 17;[m
[31m-[m
[31m-            loader_threshold = ngx_parse_time(&s, 0);[m
[31m-            if (loader_threshold == (ngx_msec_t) NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid loader_threshold value \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0 || size == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"keys_zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cache->path->manager = ngx_http_file_cache_manager;[m
[31m-    cache->path->loader = ngx_http_file_cache_loader;[m
[31m-    cache->path->data = cache;[m
[31m-    cache->path->conf_file = cf->conf_file->file.name.data;[m
[31m-    cache->path->line = cf->conf_file->line;[m
[31m-    cache->loader_files = loader_files;[m
[31m-    cache->loader_sleep = loader_sleep;[m
[31m-    cache->loader_threshold = loader_threshold;[m
[31m-[m
[31m-    if (ngx_add_path(cf, &cache->path) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!use_temp_path) {[m
[31m-        cache->temp_path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));[m
[31m-        if (cache->temp_path == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = cache->path->name.len + sizeof("/temp") - 1;[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cache->temp_path->name.len = len;[m
[31m-        cache->temp_path->name.data = p;[m
[31m-[m
[31m-        p = ngx_cpymem(p, cache->path->name.data, cache->path->name.len);[m
[31m-        ngx_memcpy(p, "/temp", sizeof("/temp"));[m
[31m-[m
[31m-        ngx_memcpy(&cache->temp_path->level, &cache->path->level,[m
[31m-                   3 * sizeof(size_t));[m
[31m-[m
[31m-        cache->temp_path->len = cache->path->len;[m
[31m-        cache->temp_path->conf_file = cf->conf_file->file.name.data;[m
[31m-        cache->temp_path->line = cf->conf_file->line;[m
[31m-[m
[31m-        if (ngx_add_path(cf, &cache->temp_path) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cache->shm_zone = ngx_shared_memory_add(cf, &name, size, cmd->post);[m
[31m-    if (cache->shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cache->shm_zone->data) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate zone \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    cache->shm_zone->init = ngx_http_file_cache_init;[m
[31m-    cache->shm_zone->data = cache;[m
[31m-[m
[31m-    cache->inactive = inactive;[m
[31m-    cache->max_size = max_size;[m
[31m-[m
[31m-    caches = (ngx_array_t *) (confp + cmd->offset);[m
[31m-[m
[31m-    ce = ngx_array_push(caches);[m
[31m-    if (ce == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ce = cache;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    time_t                    valid;[m
[31m-    ngx_str_t                *value;[m
[31m-    ngx_uint_t                i, n, status;[m
[31m-    ngx_array_t             **a;[m
[31m-    ngx_http_cache_valid_t   *v;[m
[31m-    static ngx_uint_t         statuses[] = { 200, 301, 302 };[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NGX_CONF_UNSET_PTR) {[m
[31m-        *a = ngx_array_create(cf->pool, 1, sizeof(ngx_http_cache_valid_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    n = cf->args->nelts - 1;[m
[31m-[m
[31m-    valid = ngx_parse_time(&value[n], 1);[m
[31m-    if (valid == (time_t) NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid time value \"%V\"", &value[n]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-[m
[31m-        for (i = 0; i < 3; i++) {[m
[31m-            v = ngx_array_push(*a);[m
[31m-            if (v == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            v->status = statuses[i];[m
[31m-            v->valid = valid;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < n; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "any") == 0) {[m
[31m-[m
[31m-            status = 0;[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            status = ngx_atoi(value[i].data, value[i].len);[m
[31m-            if (status < 100) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid status \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        v = ngx_array_push(*a);[m
[31m-        if (v == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->status = status;[m
[31m-        v->valid = valid;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_header_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_header_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8107219..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_header_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,633 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_header_filter_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_header_filter(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_header_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_header_filter_init,           /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_header_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_header_filter_module_ctx,    /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char ngx_http_server_string[] = "Server: openresty" CRLF;[m
[31m-static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_status_lines[] = {[m
[31m-[m
[31m-    ngx_string("200 OK"),[m
[31m-    ngx_string("201 Created"),[m
[31m-    ngx_string("202 Accepted"),[m
[31m-    ngx_null_string,  /* "203 Non-Authoritative Information" */[m
[31m-    ngx_string("204 No Content"),[m
[31m-    ngx_null_string,  /* "205 Reset Content" */[m
[31m-    ngx_string("206 Partial Content"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "207 Multi-Status" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_2XX  207[m
[31m-#define NGX_HTTP_OFF_3XX   (NGX_HTTP_LAST_2XX - 200)[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "300 Multiple Choices" */[m
[31m-[m
[31m-    ngx_string("301 Moved Permanently"),[m
[31m-    ngx_string("302 Moved Temporarily"),[m
[31m-    ngx_string("303 See Other"),[m
[31m-    ngx_string("304 Not Modified"),[m
[31m-    ngx_null_string,  /* "305 Use Proxy" */[m
[31m-    ngx_null_string,  /* "306 unused" */[m
[31m-    ngx_string("307 Temporary Redirect"),[m
[31m-[m
[31m-#define NGX_HTTP_LAST_3XX  308[m
[31m-#define NGX_HTTP_OFF_4XX   (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX)[m
[31m-[m
[31m-    ngx_string("400 Bad Request"),[m
[31m-    ngx_string("401 Unauthorized"),[m
[31m-    ngx_string("402 Payment Required"),[m
[31m-    ngx_string("403 Forbidden"),[m
[31m-    ngx_string("404 Not Found"),[m
[31m-    ngx_string("405 Not Allowed"),[m
[31m-    ngx_string("406 Not Acceptable"),[m
[31m-    ngx_null_string,  /* "407 Proxy Authentication Required" */[m
[31m-    ngx_string("408 Request Time-out"),[m
[31m-    ngx_string("409 Conflict"),[m
[31m-    ngx_string("410 Gone"),[m
[31m-    ngx_string("411 Length Required"),[m
[31m-    ngx_string("412 Precondition Failed"),[m
[31m-    ngx_string("413 Request Entity Too Large"),[m
[31m-    ngx_string("414 Request-URI Too Large"),[m
[31m-    ngx_string("415 Unsupported Media Type"),[m
[31m-    ngx_string("416 Requested Range Not Satisfiable"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "417 Expectation Failed" */[m
[31m-    /* ngx_null_string, */  /* "418 unused" */[m
[31m-    /* ngx_null_string, */  /* "419 unused" */[m
[31m-    /* ngx_null_string, */  /* "420 unused" */[m
[31m-    /* ngx_null_string, */  /* "421 unused" */[m
[31m-    /* ngx_null_string, */  /* "422 Unprocessable Entity" */[m
[31m-    /* ngx_null_string, */  /* "423 Locked" */[m
[31m-    /* ngx_null_string, */  /* "424 Failed Dependency" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_4XX  417[m
[31m-#define NGX_HTTP_OFF_5XX   (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)[m
[31m-[m
[31m-    ngx_string("500 Internal Server Error"),[m
[31m-    ngx_string("501 Not Implemented"),[m
[31m-    ngx_string("502 Bad Gateway"),[m
[31m-    ngx_string("503 Service Temporarily Unavailable"),[m
[31m-    ngx_string("504 Gateway Time-out"),[m
[31m-[m
[31m-    ngx_null_string,        /* "505 HTTP Version Not Supported" */[m
[31m-    ngx_null_string,        /* "506 Variant Also Negotiates" */[m
[31m-    ngx_string("507 Insufficient Storage"),[m
[31m-    /* ngx_null_string, */  /* "508 unused" */[m
[31m-    /* ngx_null_string, */  /* "509 unused" */[m
[31m-    /* ngx_null_string, */  /* "510 Not Extended" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_5XX  508[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_header_out_t  ngx_http_headers_out[] = {[m
[31m-    { ngx_string("Server"), offsetof(ngx_http_headers_out_t, server) },[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_out_t, date) },[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_length) },[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding) },[m
[31m-    { ngx_string("Location"), offsetof(ngx_http_headers_out_t, location) },[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified) },[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges) },[m
[31m-    { ngx_string("Expires"), offsetof(ngx_http_headers_out_t, expires) },[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control) },[m
[31m-    { ngx_string("ETag"), offsetof(ngx_http_headers_out_t, etag) },[m
[31m-[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                  host, *status_line;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_uint_t                 status, i, port;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_list_part_t           *part;[m
[31m-    ngx_table_elt_t           *header;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-#endif[m
[31m-    u_char                     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->header_sent = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time != -1) {[m
[31m-        if (r->headers_out.status != NGX_HTTP_OK[m
[31m-            && r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT[m
[31m-            && r->headers_out.status != NGX_HTTP_NOT_MODIFIED)[m
[31m-        {[m
[31m-            r->headers_out.last_modified_time = -1;[m
[31m-            r->headers_out.last_modified = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("HTTP/1.x ") - 1 + sizeof(CRLF) - 1[m
[31m-          /* the end of the header */[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    /* status line */[m
[31m-[m
[31m-    if (r->headers_out.status_line.len) {[m
[31m-        len += r->headers_out.status_line.len;[m
[31m-        status_line = &r->headers_out.status_line;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        status = 0;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-        if (status >= NGX_HTTP_OK[m
[31m-            && status < NGX_HTTP_LAST_2XX)[m
[31m-        {[m
[31m-            /* 2XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NO_CONTENT) {[m
[31m-                r->header_only = 1;[m
[31m-                ngx_str_null(&r->headers_out.content_type);[m
[31m-                r->headers_out.last_modified_time = -1;[m
[31m-                r->headers_out.last_modified = NULL;[m
[31m-                r->headers_out.content_length = NULL;[m
[31m-                r->headers_out.content_length_n = -1;[m
[31m-            }[m
[31m-[m
[31m-            status -= NGX_HTTP_OK;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_MOVED_PERMANENTLY[m
[31m-                   && status < NGX_HTTP_LAST_3XX)[m
[31m-        {[m
[31m-            /* 3XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-                r->header_only = 1;[m
[31m-            }[m
[31m-[m
[31m-            status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_BAD_REQUEST[m
[31m-                   && status < NGX_HTTP_LAST_4XX)[m
[31m-        {[m
[31m-            /* 4XX */[m
[31m-            status = status - NGX_HTTP_BAD_REQUEST[m
[31m-                            + NGX_HTTP_OFF_4XX;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                   && status < NGX_HTTP_LAST_5XX)[m
[31m-        {[m
[31m-            /* 5XX */[m
[31m-            status = status - NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                            + NGX_HTTP_OFF_5XX;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else {[m
[31m-            len += NGX_INT_T_LEN + 1 /* SP */;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (status_line && status_line->len == 0) {[m
[31m-            status = r->headers_out.status;[m
[31m-            len += NGX_INT_T_LEN + 1 /* SP */;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        len += clcf->server_tokens ? sizeof(ngx_http_server_full_string) - 1:[m
[31m-                                     sizeof(ngx_http_server_string) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        len += sizeof("Date: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        len += sizeof("Content-Type: ") - 1[m
[31m-               + r->headers_out.content_type.len + 2;[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        len += sizeof("Content-Length: ") - 1 + NGX_OFF_T_LEN + 2;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        len += sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        r->headers_out.location->hash = 0;[m
[31m-[m
[31m-        if (clcf->server_name_in_redirect) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            host = cscf->server_name;[m
[31m-[m
[31m-        } else if (r->headers_in.server.len) {[m
[31m-            host = r->headers_in.server;[m
[31m-[m
[31m-        } else {[m
[31m-            host.len = NGX_SOCKADDR_STRLEN;[m
[31m-            host.data = addr;[m
[31m-[m
[31m-            if (ngx_connection_local_sockaddr(c, &host, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-            port = ntohs(sin6->sin6_port);[m
[31m-            break;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            port = 0;[m
[31m-            break;[m
[31m-#endif[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-            port = ntohs(sin->sin_port);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        len += sizeof("Location: https://") - 1[m
[31m-               + host.len[m
[31m-               + r->headers_out.location->value.len + 2;[m
[31m-[m
[31m-        if (clcf->port_in_redirect) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl)[m
[31m-                port = (port == 443) ? 0 : port;[m
[31m-            else[m
[31m-#endif[m
[31m-                port = (port == 80) ? 0 : port;[m
[31m-[m
[31m-        } else {[m
[31m-            port = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (port) {[m
[31m-            len += sizeof(":65535") - 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&host);[m
[31m-        port = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        len += sizeof("Transfer-Encoding: chunked" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        len += sizeof("Connection: upgrade" CRLF) - 1;[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        len += sizeof("Connection: keep-alive" CRLF) - 1;[m
[31m-[m
[31m-        /*[m
[31m-         * MSIE and Opera ignore the "Keep-Alive: timeout=<N>" header.[m
[31m-         * MSIE keeps the connection alive for about 60-65 seconds.[m
[31m-         * Opera keeps the connection alive very long.[m
[31m-         * Mozilla keeps the connection alive for N plus about 1-10 seconds.[m
[31m-         * Konqueror keeps the connection alive for about N seconds.[m
[31m-         */[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-            len += sizeof("Keep-Alive: timeout=") - 1 + NGX_TIME_T_LEN + 2;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        len += sizeof("Connection: close" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        if (clcf->gzip_vary) {[m
[31m-            len += sizeof("Vary: Accept-Encoding" CRLF) - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            r->gzip_vary = 0;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len += header[i].key.len + sizeof(": ") - 1 + header[i].value.len[m
[31m-               + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* "HTTP/1.x " */[m
[31m-    b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1);[m
[31m-[m
[31m-    /* status line */[m
[31m-    if (status_line) {[m
[31m-        b->last = ngx_copy(b->last, status_line->data, status_line->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_sprintf(b->last, "%03ui ", status);[m
[31m-    }[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        if (clcf->server_tokens) {[m
[31m-            p = (u_char *) ngx_http_server_full_string;[m
[31m-            len = sizeof(ngx_http_server_full_string) - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            p = (u_char *) ngx_http_server_string;[m
[31m-            len = sizeof(ngx_http_server_string) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, p, len);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        b->last = ngx_cpymem(b->last, "Date: ", sizeof("Date: ") - 1);[m
[31m-        b->last = ngx_cpymem(b->last, ngx_cached_http_time.data,[m
[31m-                             ngx_cached_http_time.len);[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Content-Type: ",[m
[31m-                             sizeof("Content-Type: ") - 1);[m
[31m-        p = b->last;[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.content_type.data,[m
[31m-                           r->headers_out.content_type.len);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            b->last = ngx_cpymem(b->last, "; charset=",[m
[31m-                                 sizeof("; charset=") - 1);[m
[31m-            b->last = ngx_copy(b->last, r->headers_out.charset.data,[m
[31m-                               r->headers_out.charset.len);[m
[31m-[m
[31m-            /* update r->headers_out.content_type for possible logging */[m
[31m-[m
[31m-            r->headers_out.content_type.len = b->last - p;[m
[31m-            r->headers_out.content_type.data = p;[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        b->last = ngx_sprintf(b->last, "Content-Length: %O" CRLF,[m
[31m-                              r->headers_out.content_length_n);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        b->last = ngx_cpymem(b->last, "Last-Modified: ",[m
[31m-                             sizeof("Last-Modified: ") - 1);[m
[31m-        b->last = ngx_http_time(b->last, r->headers_out.last_modified_time);[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (host.data) {[m
[31m-[m
[31m-        p = b->last + sizeof("Location: ") - 1;[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Location: http",[m
[31m-                             sizeof("Location: http") - 1);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        if (c->ssl) {[m
[31m-            *b->last++ ='s';[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        *b->last++ = ':'; *b->last++ = '/'; *b->last++ = '/';[m
[31m-        b->last = ngx_copy(b->last, host.data, host.len);[m
[31m-[m
[31m-        if (port) {[m
[31m-            b->last = ngx_sprintf(b->last, ":%ui", port);[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.location->value.data,[m
[31m-                           r->headers_out.location->value.len);[m
[31m-[m
[31m-        /* update r->headers_out.location->value for possible logging */[m
[31m-[m
[31m-        r->headers_out.location->value.len = b->last - p;[m
[31m-        r->headers_out.location->value.data = p;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        b->last = ngx_cpymem(b->last, "Transfer-Encoding: chunked" CRLF,[m
[31m-                             sizeof("Transfer-Encoding: chunked" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: upgrade" CRLF,[m
[31m-                             sizeof("Connection: upgrade" CRLF) - 1);[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF,[m
[31m-                             sizeof("Connection: keep-alive" CRLF) - 1);[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-            b->last = ngx_sprintf(b->last, "Keep-Alive: timeout=%T" CRLF,[m
[31m-                                  clcf->keepalive_header);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: close" CRLF,[m
[31m-                             sizeof("Connection: close" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        b->last = ngx_cpymem(b->last, "Vary: Accept-Encoding" CRLF,[m
[31m-                             sizeof("Vary: Accept-Encoding" CRLF) - 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-        *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].value.data, header[i].value.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "%*s", (size_t) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    /* the end of HTTP header */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    r->header_size = b->last - b->pos;[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_write_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_header_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_header_filter = ngx_http_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_header_filter_module.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_header_filter_module.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 507dc93..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_header_filter_module.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,633 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_header_filter_init(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_header_filter(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_header_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_header_filter_init,           /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_header_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_header_filter_module_ctx,    /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char ngx_http_server_string[] = "Server: nginx" CRLF;[m
[31m-static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_status_lines[] = {[m
[31m-[m
[31m-    ngx_string("200 OK"),[m
[31m-    ngx_string("201 Created"),[m
[31m-    ngx_string("202 Accepted"),[m
[31m-    ngx_null_string,  /* "203 Non-Authoritative Information" */[m
[31m-    ngx_string("204 No Content"),[m
[31m-    ngx_null_string,  /* "205 Reset Content" */[m
[31m-    ngx_string("206 Partial Content"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "207 Multi-Status" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_2XX  207[m
[31m-#define NGX_HTTP_OFF_3XX   (NGX_HTTP_LAST_2XX - 200)[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "300 Multiple Choices" */[m
[31m-[m
[31m-    ngx_string("301 Moved Permanently"),[m
[31m-    ngx_string("302 Moved Temporarily"),[m
[31m-    ngx_string("303 See Other"),[m
[31m-    ngx_string("304 Not Modified"),[m
[31m-    ngx_null_string,  /* "305 Use Proxy" */[m
[31m-    ngx_null_string,  /* "306 unused" */[m
[31m-    ngx_string("307 Temporary Redirect"),[m
[31m-[m
[31m-#define NGX_HTTP_LAST_3XX  308[m
[31m-#define NGX_HTTP_OFF_4XX   (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX)[m
[31m-[m
[31m-    ngx_string("400 Bad Request"),[m
[31m-    ngx_string("401 Unauthorized"),[m
[31m-    ngx_string("402 Payment Required"),[m
[31m-    ngx_string("403 Forbidden"),[m
[31m-    ngx_string("404 Not Found"),[m
[31m-    ngx_string("405 Not Allowed"),[m
[31m-    ngx_string("406 Not Acceptable"),[m
[31m-    ngx_null_string,  /* "407 Proxy Authentication Required" */[m
[31m-    ngx_string("408 Request Time-out"),[m
[31m-    ngx_string("409 Conflict"),[m
[31m-    ngx_string("410 Gone"),[m
[31m-    ngx_string("411 Length Required"),[m
[31m-    ngx_string("412 Precondition Failed"),[m
[31m-    ngx_string("413 Request Entity Too Large"),[m
[31m-    ngx_string("414 Request-URI Too Large"),[m
[31m-    ngx_string("415 Unsupported Media Type"),[m
[31m-    ngx_string("416 Requested Range Not Satisfiable"),[m
[31m-[m
[31m-    /* ngx_null_string, */  /* "417 Expectation Failed" */[m
[31m-    /* ngx_null_string, */  /* "418 unused" */[m
[31m-    /* ngx_null_string, */  /* "419 unused" */[m
[31m-    /* ngx_null_string, */  /* "420 unused" */[m
[31m-    /* ngx_null_string, */  /* "421 unused" */[m
[31m-    /* ngx_null_string, */  /* "422 Unprocessable Entity" */[m
[31m-    /* ngx_null_string, */  /* "423 Locked" */[m
[31m-    /* ngx_null_string, */  /* "424 Failed Dependency" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_4XX  417[m
[31m-#define NGX_HTTP_OFF_5XX   (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)[m
[31m-[m
[31m-    ngx_string("500 Internal Server Error"),[m
[31m-    ngx_string("501 Not Implemented"),[m
[31m-    ngx_string("502 Bad Gateway"),[m
[31m-    ngx_string("503 Service Temporarily Unavailable"),[m
[31m-    ngx_string("504 Gateway Time-out"),[m
[31m-[m
[31m-    ngx_null_string,        /* "505 HTTP Version Not Supported" */[m
[31m-    ngx_null_string,        /* "506 Variant Also Negotiates" */[m
[31m-    ngx_string("507 Insufficient Storage"),[m
[31m-    /* ngx_null_string, */  /* "508 unused" */[m
[31m-    /* ngx_null_string, */  /* "509 unused" */[m
[31m-    /* ngx_null_string, */  /* "510 Not Extended" */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_5XX  508[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_header_out_t  ngx_http_headers_out[] = {[m
[31m-    { ngx_string("Server"), offsetof(ngx_http_headers_out_t, server) },[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_out_t, date) },[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_length) },[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding) },[m
[31m-    { ngx_string("Location"), offsetof(ngx_http_headers_out_t, location) },[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified) },[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges) },[m
[31m-    { ngx_string("Expires"), offsetof(ngx_http_headers_out_t, expires) },[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control) },[m
[31m-    { ngx_string("ETag"), offsetof(ngx_http_headers_out_t, etag) },[m
[31m-[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                  host, *status_line;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_uint_t                 status, i, port;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_list_part_t           *part;[m
[31m-    ngx_table_elt_t           *header;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-#endif[m
[31m-    u_char                     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->header_sent = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time != -1) {[m
[31m-        if (r->headers_out.status != NGX_HTTP_OK[m
[31m-            && r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT[m
[31m-            && r->headers_out.status != NGX_HTTP_NOT_MODIFIED)[m
[31m-        {[m
[31m-            r->headers_out.last_modified_time = -1;[m
[31m-            r->headers_out.last_modified = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof("HTTP/1.x ") - 1 + sizeof(CRLF) - 1[m
[31m-          /* the end of the header */[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    /* status line */[m
[31m-[m
[31m-    if (r->headers_out.status_line.len) {[m
[31m-        len += r->headers_out.status_line.len;[m
[31m-        status_line = &r->headers_out.status_line;[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        status = 0;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-        if (status >= NGX_HTTP_OK[m
[31m-            && status < NGX_HTTP_LAST_2XX)[m
[31m-        {[m
[31m-            /* 2XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NO_CONTENT) {[m
[31m-                r->header_only = 1;[m
[31m-                ngx_str_null(&r->headers_out.content_type);[m
[31m-                r->headers_out.last_modified_time = -1;[m
[31m-                r->headers_out.last_modified = NULL;[m
[31m-                r->headers_out.content_length = NULL;[m
[31m-                r->headers_out.content_length_n = -1;[m
[31m-            }[m
[31m-[m
[31m-            status -= NGX_HTTP_OK;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_MOVED_PERMANENTLY[m
[31m-                   && status < NGX_HTTP_LAST_3XX)[m
[31m-        {[m
[31m-            /* 3XX */[m
[31m-[m
[31m-            if (status == NGX_HTTP_NOT_MODIFIED) {[m
[31m-                r->header_only = 1;[m
[31m-            }[m
[31m-[m
[31m-            status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_BAD_REQUEST[m
[31m-                   && status < NGX_HTTP_LAST_4XX)[m
[31m-        {[m
[31m-            /* 4XX */[m
[31m-            status = status - NGX_HTTP_BAD_REQUEST[m
[31m-                            + NGX_HTTP_OFF_4XX;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else if (status >= NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                   && status < NGX_HTTP_LAST_5XX)[m
[31m-        {[m
[31m-            /* 5XX */[m
[31m-            status = status - NGX_HTTP_INTERNAL_SERVER_ERROR[m
[31m-                            + NGX_HTTP_OFF_5XX;[m
[31m-[m
[31m-            status_line = &ngx_http_status_lines[status];[m
[31m-            len += ngx_http_status_lines[status].len;[m
[31m-[m
[31m-        } else {[m
[31m-            len += NGX_INT_T_LEN + 1 /* SP */;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (status_line && status_line->len == 0) {[m
[31m-            status = r->headers_out.status;[m
[31m-            len += NGX_INT_T_LEN + 1 /* SP */;[m
[31m-            status_line = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        len += clcf->server_tokens ? sizeof(ngx_http_server_full_string) - 1:[m
[31m-                                     sizeof(ngx_http_server_string) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        len += sizeof("Date: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        len += sizeof("Content-Type: ") - 1[m
[31m-               + r->headers_out.content_type.len + 2;[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        len += sizeof("Content-Length: ") - 1 + NGX_OFF_T_LEN + 2;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        len += sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        r->headers_out.location->hash = 0;[m
[31m-[m
[31m-        if (clcf->server_name_in_redirect) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            host = cscf->server_name;[m
[31m-[m
[31m-        } else if (r->headers_in.server.len) {[m
[31m-            host = r->headers_in.server;[m
[31m-[m
[31m-        } else {[m
[31m-            host.len = NGX_SOCKADDR_STRLEN;[m
[31m-            host.data = addr;[m
[31m-[m
[31m-            if (ngx_connection_local_sockaddr(c, &host, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-            port = ntohs(sin6->sin6_port);[m
[31m-            break;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            port = 0;[m
[31m-            break;[m
[31m-#endif[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-            port = ntohs(sin->sin_port);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        len += sizeof("Location: https://") - 1[m
[31m-               + host.len[m
[31m-               + r->headers_out.location->value.len + 2;[m
[31m-[m
[31m-        if (clcf->port_in_redirect) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl)[m
[31m-                port = (port == 443) ? 0 : port;[m
[31m-            else[m
[31m-#endif[m
[31m-                port = (port == 80) ? 0 : port;[m
[31m-[m
[31m-        } else {[m
[31m-            port = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (port) {[m
[31m-            len += sizeof(":65535") - 1;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&host);[m
[31m-        port = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        len += sizeof("Transfer-Encoding: chunked" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        len += sizeof("Connection: upgrade" CRLF) - 1;[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        len += sizeof("Connection: keep-alive" CRLF) - 1;[m
[31m-[m
[31m-        /*[m
[31m-         * MSIE and Opera ignore the "Keep-Alive: timeout=<N>" header.[m
[31m-         * MSIE keeps the connection alive for about 60-65 seconds.[m
[31m-         * Opera keeps the connection alive very long.[m
[31m-         * Mozilla keeps the connection alive for N plus about 1-10 seconds.[m
[31m-         * Konqueror keeps the connection alive for about N seconds.[m
[31m-         */[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-            len += sizeof("Keep-Alive: timeout=") - 1 + NGX_TIME_T_LEN + 2;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        len += sizeof("Connection: close" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        if (clcf->gzip_vary) {[m
[31m-            len += sizeof("Vary: Accept-Encoding" CRLF) - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            r->gzip_vary = 0;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len += header[i].key.len + sizeof(": ") - 1 + header[i].value.len[m
[31m-               + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* "HTTP/1.x " */[m
[31m-    b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1);[m
[31m-[m
[31m-    /* status line */[m
[31m-    if (status_line) {[m
[31m-        b->last = ngx_copy(b->last, status_line->data, status_line->len);[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_sprintf(b->last, "%03ui ", status);[m
[31m-    }[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        if (clcf->server_tokens) {[m
[31m-            p = (u_char *) ngx_http_server_full_string;[m
[31m-            len = sizeof(ngx_http_server_full_string) - 1;[m
[31m-[m
[31m-        } else {[m
[31m-            p = (u_char *) ngx_http_server_string;[m
[31m-            len = sizeof(ngx_http_server_string) - 1;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, p, len);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        b->last = ngx_cpymem(b->last, "Date: ", sizeof("Date: ") - 1);[m
[31m-        b->last = ngx_cpymem(b->last, ngx_cached_http_time.data,[m
[31m-                             ngx_cached_http_time.len);[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Content-Type: ",[m
[31m-                             sizeof("Content-Type: ") - 1);[m
[31m-        p = b->last;[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.content_type.data,[m
[31m-                           r->headers_out.content_type.len);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            b->last = ngx_cpymem(b->last, "; charset=",[m
[31m-                                 sizeof("; charset=") - 1);[m
[31m-            b->last = ngx_copy(b->last, r->headers_out.charset.data,[m
[31m-                               r->headers_out.charset.len);[m
[31m-[m
[31m-            /* update r->headers_out.content_type for possible logging */[m
[31m-[m
[31m-            r->headers_out.content_type.len = b->last - p;[m
[31m-            r->headers_out.content_type.data = p;[m
[31m-        }[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        b->last = ngx_sprintf(b->last, "Content-Length: %O" CRLF,[m
[31m-                              r->headers_out.content_length_n);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        b->last = ngx_cpymem(b->last, "Last-Modified: ",[m
[31m-                             sizeof("Last-Modified: ") - 1);[m
[31m-        b->last = ngx_http_time(b->last, r->headers_out.last_modified_time);[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (host.data) {[m
[31m-[m
[31m-        p = b->last + sizeof("Location: ") - 1;[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Location: http",[m
[31m-                             sizeof("Location: http") - 1);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        if (c->ssl) {[m
[31m-            *b->last++ ='s';[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        *b->last++ = ':'; *b->last++ = '/'; *b->last++ = '/';[m
[31m-        b->last = ngx_copy(b->last, host.data, host.len);[m
[31m-[m
[31m-        if (port) {[m
[31m-            b->last = ngx_sprintf(b->last, ":%ui", port);[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, r->headers_out.location->value.data,[m
[31m-                           r->headers_out.location->value.len);[m
[31m-[m
[31m-        /* update r->headers_out.location->value for possible logging */[m
[31m-[m
[31m-        r->headers_out.location->value.len = b->last - p;[m
[31m-        r->headers_out.location->value.data = p;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        b->last = ngx_cpymem(b->last, "Transfer-Encoding: chunked" CRLF,[m
[31m-                             sizeof("Transfer-Encoding: chunked" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: upgrade" CRLF,[m
[31m-                             sizeof("Connection: upgrade" CRLF) - 1);[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF,[m
[31m-                             sizeof("Connection: keep-alive" CRLF) - 1);[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-            b->last = ngx_sprintf(b->last, "Keep-Alive: timeout=%T" CRLF,[m
[31m-                                  clcf->keepalive_header);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        b->last = ngx_cpymem(b->last, "Connection: close" CRLF,[m
[31m-                             sizeof("Connection: close" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        b->last = ngx_cpymem(b->last, "Vary: Accept-Encoding" CRLF,[m
[31m-                             sizeof("Vary: Accept-Encoding" CRLF) - 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);[m
[31m-        *b->last++ = ':'; *b->last++ = ' ';[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, header[i].value.data, header[i].value.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "%*s", (size_t) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    /* the end of HTTP header */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    r->header_size = b->last - b->pos;[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_write_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_header_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_header_filter = ngx_http_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_parse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_parse.c[m
[1mdeleted file mode 100644[m
[1mindex 0e0b3a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_parse.c[m
[1m+++ /dev/null[m
[36m@@ -1,2363 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static uint32_t  usual[] = {[m
[31m-    0xffffdbfe, /* 1111 1111 1111 1111  1101 1011 1111 1110 */[m
[31m-[m
[31m-                /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-    0x7fff37d6, /* 0111 1111 1111 1111  0011 0111 1101 0110 */[m
[31m-[m
[31m-                /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-#if (NGX_WIN32)[m
[31m-    0xefffffff, /* 1110 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-#else[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-#endif[m
[31m-[m
[31m-                /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define ngx_str3_cmp(m, c0, c1, c2, c3)                                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ngx_str3Ocmp(m, c0, c1, c2, c3)                                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ngx_str4cmp(m, c0, c1, c2, c3)                                        \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ngx_str5cmp(m, c0, c1, c2, c3, c4)                                    \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && m[4] == c4[m
[31m-[m
[31m-#define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5)                                \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4)[m
[31m-[m
[31m-#define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)[m
[31m-[m
[31m-#define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                        \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)[m
[31m-[m
[31m-#define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8)                    \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)  \[m
[31m-        && m[8] == c8[m
[31m-[m
[31m-#else /* !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) */[m
[31m-[m
[31m-#define ngx_str3_cmp(m, c0, c1, c2, c3)                                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2[m
[31m-[m
[31m-#define ngx_str3Ocmp(m, c0, c1, c2, c3)                                       \[m
[31m-    m[0] == c0 && m[2] == c2 && m[3] == c3[m
[31m-[m
[31m-#define ngx_str4cmp(m, c0, c1, c2, c3)                                        \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3[m
[31m-[m
[31m-#define ngx_str5cmp(m, c0, c1, c2, c3, c4)                                    \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4[m
[31m-[m
[31m-#define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5)                                \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5[m
[31m-[m
[31m-#define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6[m
[31m-[m
[31m-#define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                        \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7[m
[31m-[m
[31m-#define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8)                    \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7 && m[8] == c8[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* gcc, icc, msvc and others compile these switches as an jump table */[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    u_char  c, ch, *p, *m;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_method,[m
[31m-        sw_spaces_before_uri,[m
[31m-        sw_schema,[m
[31m-        sw_schema_slash,[m
[31m-        sw_schema_slash_slash,[m
[31m-        sw_host_start,[m
[31m-        sw_host,[m
[31m-        sw_host_end,[m
[31m-        sw_host_ip_literal,[m
[31m-        sw_port,[m
[31m-        sw_host_http_09,[m
[31m-        sw_after_slash_in_uri,[m
[31m-        sw_check_uri,[m
[31m-        sw_check_uri_http_09,[m
[31m-        sw_uri,[m
[31m-        sw_http_09,[m
[31m-        sw_http_H,[m
[31m-        sw_http_HT,[m
[31m-        sw_http_HTT,[m
[31m-        sw_http_HTTP,[m
[31m-        sw_first_major_digit,[m
[31m-        sw_major_digit,[m
[31m-        sw_first_minor_digit,[m
[31m-        sw_minor_digit,[m
[31m-        sw_spaces_after_digit,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = r->state;[m
[31m-[m
[31m-    for (p = b->pos; p < b->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* HTTP methods: GET, HEAD, POST */[m
[31m-        case sw_start:[m
[31m-            r->request_start = p;[m
[31m-[m
[31m-            if (ch == CR || ch == LF) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && ch != '_') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_METHOD;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_method;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_method:[m
[31m-            if (ch == ' ') {[m
[31m-                r->method_end = p - 1;[m
[31m-                m = r->request_start;[m
[31m-[m
[31m-                switch (p - m) {[m
[31m-[m
[31m-                case 3:[m
[31m-                    if (ngx_str3_cmp(m, 'G', 'E', 'T', ' ')) {[m
[31m-                        r->method = NGX_HTTP_GET;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_str3_cmp(m, 'P', 'U', 'T', ' ')) {[m
[31m-                        r->method = NGX_HTTP_PUT;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 4:[m
[31m-                    if (m[1] == 'O') {[m
[31m-[m
[31m-                        if (ngx_str3Ocmp(m, 'P', 'O', 'S', 'T')) {[m
[31m-                            r->method = NGX_HTTP_POST;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_str3Ocmp(m, 'C', 'O', 'P', 'Y')) {[m
[31m-                            r->method = NGX_HTTP_COPY;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_str3Ocmp(m, 'M', 'O', 'V', 'E')) {[m
[31m-                            r->method = NGX_HTTP_MOVE;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_str3Ocmp(m, 'L', 'O', 'C', 'K')) {[m
[31m-                            r->method = NGX_HTTP_LOCK;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                    } else {[m
[31m-[m
[31m-                        if (ngx_str4cmp(m, 'H', 'E', 'A', 'D')) {[m
[31m-                            r->method = NGX_HTTP_HEAD;[m
[31m-                            break;[m
[31m-                        }[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 5:[m
[31m-                    if (ngx_str5cmp(m, 'M', 'K', 'C', 'O', 'L')) {[m
[31m-                        r->method = NGX_HTTP_MKCOL;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_str5cmp(m, 'P', 'A', 'T', 'C', 'H')) {[m
[31m-                        r->method = NGX_HTTP_PATCH;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_str5cmp(m, 'T', 'R', 'A', 'C', 'E')) {[m
[31m-                        r->method = NGX_HTTP_TRACE;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 6:[m
[31m-                    if (ngx_str6cmp(m, 'D', 'E', 'L', 'E', 'T', 'E')) {[m
[31m-                        r->method = NGX_HTTP_DELETE;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_str6cmp(m, 'U', 'N', 'L', 'O', 'C', 'K')) {[m
[31m-                        r->method = NGX_HTTP_UNLOCK;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 7:[m
[31m-                    if (ngx_str7_cmp(m, 'O', 'P', 'T', 'I', 'O', 'N', 'S', ' '))[m
[31m-                    {[m
[31m-                        r->method = NGX_HTTP_OPTIONS;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 8:[m
[31m-                    if (ngx_str8cmp(m, 'P', 'R', 'O', 'P', 'F', 'I', 'N', 'D'))[m
[31m-                    {[m
[31m-                        r->method = NGX_HTTP_PROPFIND;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case 9:[m
[31m-                    if (ngx_str9cmp(m,[m
[31m-                            'P', 'R', 'O', 'P', 'P', 'A', 'T', 'C', 'H'))[m
[31m-                    {[m
[31m-                        r->method = NGX_HTTP_PROPPATCH;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                state = sw_spaces_before_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && ch != '_') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_METHOD;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before URI */[m
[31m-        case sw_spaces_before_uri:[m
[31m-[m
[31m-            if (ch == '/') {[m
[31m-                r->uri_start = p;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                r->schema_start = p;[m
[31m-                state = sw_schema;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_schema:[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ':':[m
[31m-                r->schema_end = p;[m
[31m-                state = sw_schema_slash;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_schema_slash:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_schema_slash_slash;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_schema_slash_slash:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_host_start;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_host_start:[m
[31m-[m
[31m-            r->host_start = p;[m
[31m-[m
[31m-            if (ch == '[') {[m
[31m-                state = sw_host_ip_literal;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_host;[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case sw_host:[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch >= '0' && ch <= '9') || ch == '.' || ch == '-') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case sw_host_end:[m
[31m-[m
[31m-            r->host_end = p;[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ':':[m
[31m-                state = sw_port;[m
[31m-                break;[m
[31m-            case '/':[m
[31m-                r->uri_start = p;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            case ' ':[m
[31m-                /*[m
[31m-                 * use single "/" from request line to preserve pointers,[m
[31m-                 * if request line will be copied to large client buffer[m
[31m-                 */[m
[31m-                r->uri_start = r->schema_end + 1;[m
[31m-                r->uri_end = r->schema_end + 2;[m
[31m-                state = sw_host_http_09;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_host_ip_literal:[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ':':[m
[31m-                break;[m
[31m-            case ']':[m
[31m-                state = sw_host_end;[m
[31m-                break;[m
[31m-            case '-':[m
[31m-            case '.':[m
[31m-            case '_':[m
[31m-            case '~':[m
[31m-                /* unreserved */[m
[31m-                break;[m
[31m-            case '!':[m
[31m-            case '$':[m
[31m-            case '&':[m
[31m-            case '\'':[m
[31m-            case '(':[m
[31m-            case ')':[m
[31m-            case '*':[m
[31m-            case '+':[m
[31m-            case ',':[m
[31m-            case ';':[m
[31m-            case '=':[m
[31m-                /* sub-delims */[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_port:[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                r->port_end = p;[m
[31m-                r->uri_start = p;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            case ' ':[m
[31m-                r->port_end = p;[m
[31m-                /*[m
[31m-                 * use single "/" from request line to preserve pointers,[m
[31m-                 * if request line will be copied to large client buffer[m
[31m-                 */[m
[31m-                r->uri_start = r->schema_end + 1;[m
[31m-                r->uri_end = r->schema_end + 2;[m
[31m-                state = sw_host_http_09;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space+ after "http://host[:port] " */[m
[31m-        case sw_host_http_09:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case 'H':[m
[31m-                r->http_protocol.data = p;[m
[31m-                state = sw_http_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-[m
[31m-        /* check "/.", "//", "%", and "\" (Win32) in URI */[m
[31m-        case sw_after_slash_in_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->uri_end = p;[m
[31m-                state = sw_check_uri_http_09;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case '.':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                r->quoted_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '/':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '?':[m
[31m-                r->args_start = p + 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                break;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            default:[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* check "/", "%" and "\" (Win32) in URI */[m
[31m-        case sw_check_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-#if (NGX_WIN32)[m
[31m-                if (r->uri_ext == p) {[m
[31m-                    r->complex_uri = 1;[m
[31m-                    state = sw_uri;[m
[31m-                    break;[m
[31m-                }[m
[31m-#endif[m
[31m-                r->uri_ext = NULL;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                r->uri_ext = p + 1;[m
[31m-                break;[m
[31m-            case ' ':[m
[31m-                r->uri_end = p;[m
[31m-                state = sw_check_uri_http_09;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '%':[m
[31m-                r->quoted_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p + 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                break;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space+ after URI */[m
[31m-        case sw_check_uri_http_09:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case 'H':[m
[31m-                r->http_protocol.data = p;[m
[31m-                state = sw_http_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                r->space_in_uri = 1;[m
[31m-                state = sw_check_uri;[m
[31m-                p--;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-[m
[31m-        /* URI */[m
[31m-        case sw_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->uri_end = p;[m
[31m-                state = sw_http_09;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->uri_end = p;[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                break;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space+ after URI */[m
[31m-        case sw_http_09:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->http_minor = 9;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->http_minor = 9;[m
[31m-                goto done;[m
[31m-            case 'H':[m
[31m-                r->http_protocol.data = p;[m
[31m-                state = sw_http_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                r->space_in_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                p--;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_http_H:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_http_HT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_http_HT:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_http_HTT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_http_HTT:[m
[31m-            switch (ch) {[m
[31m-            case 'P':[m
[31m-                state = sw_http_HTTP;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_http_HTTP:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_first_major_digit;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* first digit of major HTTP version */[m
[31m-        case sw_first_major_digit:[m
[31m-            if (ch < '1' || ch > '9') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            r->http_major = ch - '0';[m
[31m-            state = sw_major_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* major HTTP version or dot */[m
[31m-        case sw_major_digit:[m
[31m-            if (ch == '.') {[m
[31m-                state = sw_first_minor_digit;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            r->http_major = r->http_major * 10 + ch - '0';[m
[31m-            break;[m
[31m-[m
[31m-        /* first digit of minor HTTP version */[m
[31m-        case sw_first_minor_digit:[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            r->http_minor = ch - '0';[m
[31m-            state = sw_minor_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* minor HTTP version or end of request line */[m
[31m-        case sw_minor_digit:[m
[31m-            if (ch == CR) {[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == LF) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ' ') {[m
[31m-                state = sw_spaces_after_digit;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            r->http_minor = r->http_minor * 10 + ch - '0';[m
[31m-            break;[m
[31m-[m
[31m-        case sw_spaces_after_digit:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of request line */[m
[31m-        case sw_almost_done:[m
[31m-            r->request_end = p - 1;[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = p;[m
[31m-    r->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-[m
[31m-    if (r->request_end == NULL) {[m
[31m-        r->request_end = p;[m
[31m-    }[m
[31m-[m
[31m-    r->http_version = r->http_major * 1000 + r->http_minor;[m
[31m-    r->state = sw_start;[m
[31m-[m
[31m-    if (r->http_version == 9 && r->method != NGX_HTTP_GET) {[m
[31m-        return NGX_HTTP_PARSE_INVALID_09_METHOD;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_uint_t allow_underscores)[m
[31m-{[m
[31m-    u_char      c, ch, *p;[m
[31m-    ngx_uint_t  hash, i;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_name,[m
[31m-        sw_space_before_value,[m
[31m-        sw_value,[m
[31m-        sw_space_after_value,[m
[31m-        sw_ignore_line,[m
[31m-        sw_almost_done,[m
[31m-        sw_header_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    /* the last '\0' is not needed because string is zero terminated */[m
[31m-[m
[31m-    static u_char  lowcase[] =[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0-\0\0" "0123456789\0\0\0\0\0\0"[m
[31m-        "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"[m
[31m-        "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[m
[31m-        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";[m
[31m-[m
[31m-    state = r->state;[m
[31m-    hash = r->header_hash;[m
[31m-    i = r->lowcase_index;[m
[31m-[m
[31m-    for (p = b->pos; p < b->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* first char */[m
[31m-        case sw_start:[m
[31m-            r->header_name_start = p;[m
[31m-            r->invalid_header = 0;[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                r->header_end = p;[m
[31m-                state = sw_header_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->header_end = p;[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                state = sw_name;[m
[31m-[m
[31m-                c = lowcase[ch];[m
[31m-[m
[31m-                if (c) {[m
[31m-                    hash = ngx_hash(0, c);[m
[31m-                    r->lowcase_header[0] = c;[m
[31m-                    i = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (ch == '_') {[m
[31m-                    if (allow_underscores) {[m
[31m-                        hash = ngx_hash(0, ch);[m
[31m-                        r->lowcase_header[0] = ch;[m
[31m-                        i = 1;[m
[31m-[m
[31m-                    } else {[m
[31m-                        r->invalid_header = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (ch == '\0') {[m
[31m-                    return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-                }[m
[31m-[m
[31m-                r->invalid_header = 1;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header name */[m
[31m-        case sw_name:[m
[31m-            c = lowcase[ch];[m
[31m-[m
[31m-            if (c) {[m
[31m-                hash = ngx_hash(hash, c);[m
[31m-                r->lowcase_header[i++] = c;[m
[31m-                i &= (NGX_HTTP_LC_HEADER_LEN - 1);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '_') {[m
[31m-                if (allow_underscores) {[m
[31m-                    hash = ngx_hash(hash, ch);[m
[31m-                    r->lowcase_header[i++] = ch;[m
[31m-                    i &= (NGX_HTTP_LC_HEADER_LEN - 1);[m
[31m-[m
[31m-                } else {[m
[31m-                    r->invalid_header = 1;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                r->header_name_end = p;[m
[31m-                state = sw_space_before_value;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == CR) {[m
[31m-                r->header_name_end = p;[m
[31m-                r->header_start = p;[m
[31m-                r->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == LF) {[m
[31m-                r->header_name_end = p;[m
[31m-                r->header_start = p;[m
[31m-                r->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            /* IIS may send the duplicate "HTTP/1.1 ..." lines */[m
[31m-            if (ch == '/'[m
[31m-                && r->upstream[m
[31m-                && p - r->header_name_start == 4[m
[31m-                && ngx_strncmp(r->header_name_start, "HTTP", 4) == 0)[m
[31m-            {[m
[31m-                state = sw_ignore_line;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '\0') {[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            }[m
[31m-[m
[31m-            r->invalid_header = 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before header value */[m
[31m-        case sw_space_before_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->header_start = p;[m
[31m-                r->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->header_start = p;[m
[31m-                r->header_end = p;[m
[31m-                goto done;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            default:[m
[31m-                r->header_start = p;[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header value */[m
[31m-        case sw_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->header_end = p;[m
[31m-                state = sw_space_after_value;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                r->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                r->header_end = p;[m
[31m-                goto done;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before end of header line */[m
[31m-        case sw_space_after_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            case '\0':[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            default:[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* ignore header line */[m
[31m-        case sw_ignore_line:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                state = sw_start;[m
[31m-                break;[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of header line */[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            case CR:[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of header */[m
[31m-        case sw_header_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                return NGX_HTTP_PARSE_INVALID_HEADER;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = p;[m
[31m-    r->state = state;[m
[31m-    r->header_hash = hash;[m
[31m-    r->lowcase_index = i;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-    r->state = sw_start;[m
[31m-    r->header_hash = hash;[m
[31m-    r->lowcase_index = i;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-header_done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-    r->state = sw_start;[m
[31m-[m
[31m-    return NGX_HTTP_PARSE_HEADER_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_uri(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char  *p, ch;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_after_slash_in_uri,[m
[31m-        sw_check_uri,[m
[31m-        sw_uri[m
[31m-    } state;[m
[31m-[m
[31m-    state = sw_start;[m
[31m-[m
[31m-    for (p = r->uri_start; p != r->uri_end; p++) {[m
[31m-[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case sw_start:[m
[31m-[m
[31m-            if (ch != '/') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_after_slash_in_uri;[m
[31m-            break;[m
[31m-[m
[31m-        /* check "/.", "//", "%", and "\" (Win32) in URI */[m
[31m-        case sw_after_slash_in_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->space_in_uri = 1;[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                r->quoted_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '/':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '?':[m
[31m-                r->args_start = p + 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                break;[m
[31m-            default:[m
[31m-                state = sw_check_uri;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* check "/", "%" and "\" (Win32) in URI */[m
[31m-        case sw_check_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-#if (NGX_WIN32)[m
[31m-                if (r->uri_ext == p) {[m
[31m-                    r->complex_uri = 1;[m
[31m-                    state = sw_uri;[m
[31m-                    break;[m
[31m-                }[m
[31m-#endif[m
[31m-                r->uri_ext = NULL;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                r->uri_ext = p + 1;[m
[31m-                break;[m
[31m-            case ' ':[m
[31m-                r->space_in_uri = 1;[m
[31m-                break;[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_after_slash_in_uri;[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '%':[m
[31m-                r->quoted_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p + 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                state = sw_uri;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* URI */[m
[31m-        case sw_uri:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                r->space_in_uri = 1;[m
[31m-                break;[m
[31m-            case '#':[m
[31m-                r->complex_uri = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_complex_uri(ngx_http_request_t *r, ngx_uint_t merge_slashes)[m
[31m-{[m
[31m-    u_char  c, ch, decoded, *p, *u;[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_slash,[m
[31m-        sw_dot,[m
[31m-        sw_dot_dot,[m
[31m-        sw_quoted,[m
[31m-        sw_quoted_second[m
[31m-    } state, quoted_state;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    decoded = '\0';[m
[31m-    quoted_state = sw_usual;[m
[31m-#endif[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-    p = r->uri_start;[m
[31m-    u = r->uri.data;[m
[31m-    r->uri_ext = NULL;[m
[31m-    r->args_start = NULL;[m
[31m-[m
[31m-    ch = *p++;[m
[31m-[m
[31m-    while (p <= r->uri_end) {[m
[31m-[m
[31m-        /*[m
[31m-         * we use "ch = *p++" inside the cycle, but this operation is safe,[m
[31m-         * because after the URI there is always at least one character:[m
[31m-         * the line feed[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "s:%d in:'%Xd:%c'", state, ch, ch);[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case sw_usual:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                *u++ = ch;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                if (u - 2 >= r->uri.data[m
[31m-                    && *(u - 1) == '.' && *(u - 2) != '.')[m
[31m-                {[m
[31m-                    u--;[m
[31m-                }[m
[31m-[m
[31m-                r->uri_ext = NULL;[m
[31m-[m
[31m-                if (p == r->uri_start + r->uri.len) {[m
[31m-[m
[31m-                    /*[m
[31m-                     * we omit the last "\" to cause redirect because[m
[31m-                     * the browsers do not treat "\" as "/" in relative URL path[m
[31m-                     */[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                state = sw_slash;[m
[31m-                *u++ = '/';[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '/':[m
[31m-#if (NGX_WIN32)[m
[31m-                if (u - 2 >= r->uri.data[m
[31m-                    && *(u - 1) == '.' && *(u - 2) != '.')[m
[31m-                {[m
[31m-                    u--;[m
[31m-                }[m
[31m-#endif[m
[31m-                r->uri_ext = NULL;[m
[31m-                state = sw_slash;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                quoted_state = state;[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p;[m
[31m-                goto args;[m
[31m-            case '#':[m
[31m-                goto done;[m
[31m-            case '.':[m
[31m-                r->uri_ext = u + 1;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-                /* fall through */[m
[31m-            default:[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ch = *p++;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_slash:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-                break;[m
[31m-#endif[m
[31m-            case '/':[m
[31m-                if (!merge_slashes) {[m
[31m-                    *u++ = ch;[m
[31m-                }[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                state = sw_dot;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                quoted_state = state;[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p;[m
[31m-                goto args;[m
[31m-            case '#':[m
[31m-                goto done;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-            default:[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ch = *p++;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_dot:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-#endif[m
[31m-            case '/':[m
[31m-                state = sw_slash;[m
[31m-                u--;[m
[31m-                break;[m
[31m-            case '.':[m
[31m-                state = sw_dot_dot;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                quoted_state = state;[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p;[m
[31m-                goto args;[m
[31m-            case '#':[m
[31m-                goto done;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-            default:[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ch = *p++;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_dot_dot:[m
[31m-[m
[31m-            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-#if (NGX_WIN32)[m
[31m-            case '\\':[m
[31m-#endif[m
[31m-            case '/':[m
[31m-                state = sw_slash;[m
[31m-                u -= 5;[m
[31m-                for ( ;; ) {[m
[31m-                    if (u < r->uri.data) {[m
[31m-                        return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-                    }[m
[31m-                    if (*u == '/') {[m
[31m-                        u++;[m
[31m-                        break;[m
[31m-                    }[m
[31m-                    u--;[m
[31m-                }[m
[31m-                break;[m
[31m-            case '%':[m
[31m-                quoted_state = state;[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            case '?':[m
[31m-                r->args_start = p;[m
[31m-                goto args;[m
[31m-            case '#':[m
[31m-                goto done;[m
[31m-            case '+':[m
[31m-                r->plus_in_uri = 1;[m
[31m-            default:[m
[31m-                state = sw_usual;[m
[31m-                *u++ = ch;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ch = *p++;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted:[m
[31m-            r->quoted_uri = 1;[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                decoded = (u_char) (ch - '0');[m
[31m-                state = sw_quoted_second;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                decoded = (u_char) (c - 'a' + 10);[m
[31m-                state = sw_quoted_second;[m
[31m-                ch = *p++;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-[m
[31m-        case sw_quoted_second:[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ch = (u_char) ((decoded << 4) + ch - '0');[m
[31m-[m
[31m-                if (ch == '%' || ch == '#') {[m
[31m-                    state = sw_usual;[m
[31m-                    *u++ = ch;[m
[31m-                    ch = *p++;[m
[31m-                    break;[m
[31m-[m
[31m-                } else if (ch == '\0') {[m
[31m-                    return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-                }[m
[31m-[m
[31m-                state = quoted_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ch = (u_char) ((decoded << 4) + c - 'a' + 10);[m
[31m-[m
[31m-                if (ch == '?') {[m
[31m-                    state = sw_usual;[m
[31m-                    *u++ = ch;[m
[31m-                    ch = *p++;[m
[31m-                    break;[m
[31m-[m
[31m-                } else if (ch == '+') {[m
[31m-                    r->plus_in_uri = 1;[m
[31m-                }[m
[31m-[m
[31m-                state = quoted_state;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_PARSE_INVALID_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    r->uri.len = u - r->uri.data;[m
[31m-[m
[31m-    if (r->uri_ext) {[m
[31m-        r->exten.len = u - r->uri_ext;[m
[31m-        r->exten.data = r->uri_ext;[m
[31m-    }[m
[31m-[m
[31m-    r->uri_ext = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-args:[m
[31m-[m
[31m-    while (p < r->uri_end) {[m
[31m-        if (*p++ != '#') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        r->args.len = p - 1 - r->args_start;[m
[31m-        r->args.data = r->args_start;[m
[31m-        r->args_start = NULL;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    r->uri.len = u - r->uri.data;[m
[31m-[m
[31m-    if (r->uri_ext) {[m
[31m-        r->exten.len = u - r->uri_ext;[m
[31m-        r->exten.data = r->uri_ext;[m
[31m-    }[m
[31m-[m
[31m-    r->uri_ext = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_status_line(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_status_t *status)[m
[31m-{[m
[31m-    u_char   ch;[m
[31m-    u_char  *p;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_H,[m
[31m-        sw_HT,[m
[31m-        sw_HTT,[m
[31m-        sw_HTTP,[m
[31m-        sw_first_major_digit,[m
[31m-        sw_major_digit,[m
[31m-        sw_first_minor_digit,[m
[31m-        sw_minor_digit,[m
[31m-        sw_status,[m
[31m-        sw_space_after_status,[m
[31m-        sw_status_text,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = r->state;[m
[31m-[m
[31m-    for (p = b->pos; p < b->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* "HTTP/" */[m
[31m-        case sw_start:[m
[31m-            switch (ch) {[m
[31m-            case 'H':[m
[31m-                state = sw_H;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_H:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_HT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HT:[m
[31m-            switch (ch) {[m
[31m-            case 'T':[m
[31m-                state = sw_HTT;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HTT:[m
[31m-            switch (ch) {[m
[31m-            case 'P':[m
[31m-                state = sw_HTTP;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_HTTP:[m
[31m-            switch (ch) {[m
[31m-            case '/':[m
[31m-                state = sw_first_major_digit;[m
[31m-                break;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* the first digit of major HTTP version */[m
[31m-        case sw_first_major_digit:[m
[31m-            if (ch < '1' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->http_major = ch - '0';[m
[31m-            state = sw_major_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* the major HTTP version or dot */[m
[31m-        case sw_major_digit:[m
[31m-            if (ch == '.') {[m
[31m-                state = sw_first_minor_digit;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->http_major = r->http_major * 10 + ch - '0';[m
[31m-            break;[m
[31m-[m
[31m-        /* the first digit of minor HTTP version */[m
[31m-        case sw_first_minor_digit:[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->http_minor = ch - '0';[m
[31m-            state = sw_minor_digit;[m
[31m-            break;[m
[31m-[m
[31m-        /* the minor HTTP version or the end of the request line */[m
[31m-        case sw_minor_digit:[m
[31m-            if (ch == ' ') {[m
[31m-                state = sw_status;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->http_minor = r->http_minor * 10 + ch - '0';[m
[31m-            break;[m
[31m-[m
[31m-        /* HTTP status code */[m
[31m-        case sw_status:[m
[31m-            if (ch == ' ') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch < '0' || ch > '9') {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            status->code = status->code * 10 + ch - '0';[m
[31m-[m
[31m-            if (++status->count == 3) {[m
[31m-                state = sw_space_after_status;[m
[31m-                status->start = p - 2;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* space or end of line */[m
[31m-        case sw_space_after_status:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                state = sw_status_text;[m
[31m-                break;[m
[31m-            case '.':                    /* IIS may send 403.1, 403.2, etc */[m
[31m-                state = sw_status_text;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* any text until end of line */[m
[31m-        case sw_status_text:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of status line */[m
[31m-        case sw_almost_done:[m
[31m-            status->end = p - 1;[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    b->pos = p;[m
[31m-    r->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    b->pos = p + 1;[m
[31m-[m
[31m-    if (status->end == NULL) {[m
[31m-        status->end = p;[m
[31m-    }[m
[31m-[m
[31m-    status->http_version = r->http_major * 1000 + r->http_minor;[m
[31m-    r->state = sw_start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_unsafe_uri(ngx_http_request_t *r, ngx_str_t *uri,[m
[31m-    ngx_str_t *args, ngx_uint_t *flags)[m
[31m-{[m
[31m-    u_char      ch, *p, *src, *dst;[m
[31m-    size_t      len;[m
[31m-    ngx_uint_t  quoted;[m
[31m-[m
[31m-    len = uri->len;[m
[31m-    p = uri->data;[m
[31m-    quoted = 0;[m
[31m-[m
[31m-    if (len == 0 || p[0] == '?') {[m
[31m-        goto unsafe;[m
[31m-    }[m
[31m-[m
[31m-    if (p[0] == '.' && len > 1 && p[1] == '.'[m
[31m-        && (len == 2 || ngx_path_separator(p[2])))[m
[31m-    {[m
[31m-        goto unsafe;[m
[31m-    }[m
[31m-[m
[31m-    for ( /* void */ ; len; len--) {[m
[31m-[m
[31m-        ch = *p++;[m
[31m-[m
[31m-        if (ch == '%') {[m
[31m-            quoted = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (usual[ch >> 5] & (1 << (ch & 0x1f))) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ch == '?') {[m
[31m-            args->len = len - 1;[m
[31m-            args->data = p;[m
[31m-            uri->len -= len;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ch == '\0') {[m
[31m-            goto unsafe;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_path_separator(ch) && len > 2) {[m
[31m-[m
[31m-            /* detect "/../" and "/.." */[m
[31m-[m
[31m-            if (p[0] == '.' && p[1] == '.'[m
[31m-                && (len == 3 || ngx_path_separator(p[2])))[m
[31m-            {[m
[31m-                goto unsafe;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (quoted) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "escaped URI: \"%V\"", uri);[m
[31m-[m
[31m-        src = uri->data;[m
[31m-[m
[31m-        dst = ngx_pnalloc(r->pool, uri->len);[m
[31m-        if (dst == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        uri->data = dst;[m
[31m-[m
[31m-        ngx_unescape_uri(&dst, &src, uri->len, 0);[m
[31m-[m
[31m-        uri->len = dst - uri->data;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "unescaped URI: \"%V\"", uri);[m
[31m-[m
[31m-        len = uri->len;[m
[31m-        p = uri->data;[m
[31m-[m
[31m-        if (p[0] == '.' && len > 1 && p[1] == '.'[m
[31m-            && (len == 2 || ngx_path_separator(p[2])))[m
[31m-        {[m
[31m-            goto unsafe;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; len; len--) {[m
[31m-[m
[31m-            ch = *p++;[m
[31m-[m
[31m-            if (ch == '\0') {[m
[31m-                goto unsafe;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_path_separator(ch) && len > 2) {[m
[31m-[m
[31m-                /* detect "/../" and "/.." */[m
[31m-[m
[31m-                if (p[0] == '.' && p[1] == '.'[m
[31m-                    && (len == 3 || ngx_path_separator(p[2])))[m
[31m-                {[m
[31m-                    goto unsafe;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-unsafe:[m
[31m-[m
[31m-    if (*flags & NGX_HTTP_LOG_UNSAFE) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "unsafe URI \"%V\" was detected", uri);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_multi_header_lines(ngx_array_t *headers, ngx_str_t *name,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    u_char            *start, *last, *end, ch;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    h = headers->elts;[m
[31m-[m
[31m-    for (i = 0; i < headers->nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, headers->pool->log, 0,[m
[31m-                       "parse header: \"%V: %V\"", &h[i]->key, &h[i]->value);[m
[31m-[m
[31m-        if (name->len > h[i]->value.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        start = h[i]->value.data;[m
[31m-        end = h[i]->value.data + h[i]->value.len;[m
[31m-[m
[31m-        while (start < end) {[m
[31m-[m
[31m-            if (ngx_strncasecmp(start, name->data, name->len) != 0) {[m
[31m-                goto skip;[m
[31m-            }[m
[31m-[m
[31m-            for (start += name->len; start < end && *start == ' '; start++) {[m
[31m-                /* void */[m
[31m-            }[m
[31m-[m
[31m-            if (value == NULL) {[m
[31m-                if (start == end || *start == ',') {[m
[31m-                    return i;[m
[31m-                }[m
[31m-[m
[31m-                goto skip;[m
[31m-            }[m
[31m-[m
[31m-            if (start == end || *start++ != '=') {[m
[31m-                /* the invalid header value */[m
[31m-                goto skip;[m
[31m-            }[m
[31m-[m
[31m-            while (start < end && *start == ' ') { start++; }[m
[31m-[m
[31m-            for (last = start; last < end && *last != ';'; last++) {[m
[31m-                /* void */[m
[31m-            }[m
[31m-[m
[31m-            value->len = last - start;[m
[31m-            value->data = start;[m
[31m-[m
[31m-            return i;[m
[31m-[m
[31m-        skip:[m
[31m-[m
[31m-            while (start < end) {[m
[31m-                ch = *start++;[m
[31m-                if (ch == ';' || ch == ',') {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            while (start < end && *start == ' ') { start++; }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_set_cookie_lines(ngx_array_t *headers, ngx_str_t *name,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    u_char            *start, *last, *end;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    h = headers->elts;[m
[31m-[m
[31m-    for (i = 0; i < headers->nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, headers->pool->log, 0,[m
[31m-                       "parse header: \"%V: %V\"", &h[i]->key, &h[i]->value);[m
[31m-[m
[31m-        if (name->len >= h[i]->value.len) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        start = h[i]->value.data;[m
[31m-        end = h[i]->value.data + h[i]->value.len;[m
[31m-[m
[31m-        if (ngx_strncasecmp(start, name->data, name->len) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for (start += name->len; start < end && *start == ' '; start++) {[m
[31m-            /* void */[m
[31m-        }[m
[31m-[m
[31m-        if (start == end || *start++ != '=') {[m
[31m-            /* the invalid header value */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        while (start < end && *start == ' ') { start++; }[m
[31m-[m
[31m-        for (last = start; last < end && *last != ';'; last++) {[m
[31m-            /* void */[m
[31m-        }[m
[31m-[m
[31m-        value->len = last - start;[m
[31m-        value->data = start;[m
[31m-[m
[31m-        return i;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_arg(ngx_http_request_t *r, u_char *name, size_t len, ngx_str_t *value)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    if (r->args.len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    p = r->args.data;[m
[31m-    last = p + r->args.len;[m
[31m-[m
[31m-    for ( /* void */ ; p < last; p++) {[m
[31m-[m
[31m-        /* we need '=' after name, so drop one char from last */[m
[31m-[m
[31m-        p = ngx_strlcasestrn(p, last - 1, name, len - 1);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if ((p == r->args.data || *(p - 1) == '&') && *(p + len) == '=') {[m
[31m-[m
[31m-            value->data = p + len + 1;[m
[31m-[m
[31m-            p = ngx_strlchr(p, last, '&');[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                p = r->args.data + r->args.len;[m
[31m-            }[m
[31m-[m
[31m-            value->len = p - value->data;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_split_args(ngx_http_request_t *r, ngx_str_t *uri, ngx_str_t *args)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    last = uri->data + uri->len;[m
[31m-[m
[31m-    p = ngx_strlchr(uri->data, last, '?');[m
[31m-[m
[31m-    if (p) {[m
[31m-        uri->len = p - uri->data;[m
[31m-        p++;[m
[31m-        args->len = last - p;[m
[31m-        args->data = p;[m
[31m-[m
[31m-    } else {[m
[31m-        args->len = 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_parse_chunked(ngx_http_request_t *r, ngx_buf_t *b,[m
[31m-    ngx_http_chunked_t *ctx)[m
[31m-{[m
[31m-    u_char     *pos, ch, c;[m
[31m-    ngx_int_t   rc;[m
[31m-    enum {[m
[31m-        sw_chunk_start = 0,[m
[31m-        sw_chunk_size,[m
[31m-        sw_chunk_extension,[m
[31m-        sw_chunk_extension_almost_done,[m
[31m-        sw_chunk_data,[m
[31m-        sw_after_data,[m
[31m-        sw_after_data_almost_done,[m
[31m-        sw_last_chunk_extension,[m
[31m-        sw_last_chunk_extension_almost_done,[m
[31m-        sw_trailer,[m
[31m-        sw_trailer_almost_done,[m
[31m-        sw_trailer_header,[m
[31m-        sw_trailer_header_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-[m
[31m-    if (state == sw_chunk_data && ctx->size == 0) {[m
[31m-        state = sw_after_data;[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for (pos = b->pos; pos < b->last; pos++) {[m
[31m-[m
[31m-        ch = *pos;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http chunked byte: %02Xd s:%d", ch, state);[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case sw_chunk_start:[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                state = sw_chunk_size;[m
[31m-                ctx->size = ch - '0';[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                state = sw_chunk_size;[m
[31m-                ctx->size = c - 'a' + 10;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_chunk_size:[m
[31m-            if (ctx->size > NGX_MAX_OFF_T_VALUE / 16) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ctx->size = ctx->size * 16 + (ch - '0');[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ctx->size = ctx->size * 16 + (c - 'a' + 10);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->size == 0) {[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case CR:[m
[31m-                    state = sw_last_chunk_extension_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    state = sw_trailer;[m
[31m-                    break;[m
[31m-                case ';':[m
[31m-                case ' ':[m
[31m-                case '\t':[m
[31m-                    state = sw_last_chunk_extension;[m
[31m-                    break;[m
[31m-                default:[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_chunk_extension_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_chunk_data;[m
[31m-                break;[m
[31m-            case ';':[m
[31m-            case ' ':[m
[31m-            case '\t':[m
[31m-                state = sw_chunk_extension;[m
[31m-                break;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_chunk_extension:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_chunk_extension_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_chunk_data;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_chunk_extension_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                state = sw_chunk_data;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_chunk_data:[m
[31m-            rc = NGX_OK;[m
[31m-            goto data;[m
[31m-[m
[31m-        case sw_after_data:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_after_data_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_chunk_start;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_after_data_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                state = sw_chunk_start;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_last_chunk_extension:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_last_chunk_extension_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_trailer;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_last_chunk_extension_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                state = sw_trailer;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_trailer:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_trailer_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                state = sw_trailer_header;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_trailer_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_trailer_header:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_trailer_header_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                state = sw_trailer;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_trailer_header_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                state = sw_trailer;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-data:[m
[31m-[m
[31m-    ctx->state = state;[m
[31m-    b->pos = pos;[m
[31m-[m
[31m-    if (ctx->size > NGX_MAX_OFF_T_VALUE - 5) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    switch (state) {[m
[31m-[m
[31m-    case sw_chunk_start:[m
[31m-        ctx->length = 3 /* "0" LF LF */;[m
[31m-        break;[m
[31m-    case sw_chunk_size:[m
[31m-        ctx->length = 1 /* LF */[m
[31m-                      + (ctx->size ? ctx->size + 4 /* LF "0" LF LF */[m
[31m-                                   : 1 /* LF */);[m
[31m-        break;[m
[31m-    case sw_chunk_extension:[m
[31m-    case sw_chunk_extension_almost_done:[m
[31m-        ctx->length = 1 /* LF */ + ctx->size + 4 /* LF "0" LF LF */;[m
[31m-        break;[m
[31m-    case sw_chunk_data:[m
[31m-        ctx->length = ctx->size + 4 /* LF "0" LF LF */;[m
[31m-        break;[m
[31m-    case sw_after_data:[m
[31m-    case sw_after_data_almost_done:[m
[31m-        ctx->length = 4 /* LF "0" LF LF */;[m
[31m-        break;[m
[31m-    case sw_last_chunk_extension:[m
[31m-    case sw_last_chunk_extension_almost_done:[m
[31m-        ctx->length = 2 /* LF LF */;[m
[31m-        break;[m
[31m-    case sw_trailer:[m
[31m-    case sw_trailer_almost_done:[m
[31m-        ctx->length = 1 /* LF */;[m
[31m-        break;[m
[31m-    case sw_trailer_header:[m
[31m-    case sw_trailer_header_almost_done:[m
[31m-        ctx->length = 2 /* LF LF */;[m
[31m-        break;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ctx->state = 0;[m
[31m-    b->pos = pos + 1;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_postpone_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_postpone_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex e893b83..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_postpone_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,176 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_postpone_filter_add(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_postpone_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_postpone_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_postpone_filter_init,         /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_postpone_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_postpone_filter_module_ctx,  /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_postpone_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_postponed_request_t  *pr;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http postpone filter \"%V?%V\" %p", &r->uri, &r->args, in);[m
[31m-[m
[31m-    if (r != c->data) {[m
[31m-[m
[31m-        if (in) {[m
[31m-            ngx_http_postpone_filter_add(r, in);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        /* TODO: SSI may pass NULL */[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "http postpone filter NULL inactive request");[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->postponed == NULL) {[m
[31m-[m
[31m-        if (in || c->buffered) {[m
[31m-            return ngx_http_next_body_filter(r->main, in);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (in) {[m
[31m-        ngx_http_postpone_filter_add(r, in);[m
[31m-    }[m
[31m-[m
[31m-    do {[m
[31m-        pr = r->postponed;[m
[31m-[m
[31m-        if (pr->request) {[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http postpone filter wake \"%V?%V\"",[m
[31m-                           &pr->request->uri, &pr->request->args);[m
[31m-[m
[31m-            r->postponed = pr->next;[m
[31m-[m
[31m-            c->data = pr->request;[m
[31m-[m
[31m-            return ngx_http_post_request(pr->request, NULL);[m
[31m-        }[m
[31m-[m
[31m-        if (pr->out == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "http postpone filter NULL output");[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http postpone filter output \"%V?%V\"",[m
[31m-                           &r->uri, &r->args);[m
[31m-[m
[31m-            if (ngx_http_next_body_filter(r->main, pr->out) == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        r->postponed = pr->next;[m
[31m-[m
[31m-    } while (r->postponed);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_postpone_filter_add(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_postponed_request_t  *pr, **ppr;[m
[31m-[m
[31m-    if (r->postponed) {[m
[31m-        for (pr = r->postponed; pr->next; pr = pr->next) { /* void */ }[m
[31m-[m
[31m-        if (pr->request == NULL) {[m
[31m-            goto found;[m
[31m-        }[m
[31m-[m
[31m-        ppr = &pr->next;[m
[31m-[m
[31m-    } else {[m
[31m-        ppr = &r->postponed;[m
[31m-    }[m
[31m-[m
[31m-    pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ppr = pr;[m
[31m-[m
[31m-    pr->request = NULL;[m
[31m-    pr->out = NULL;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (ngx_chain_add_copy(r->pool, &pr->out, in) == NGX_OK) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_postpone_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_postpone_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_probe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_probe.h[m
[1mdeleted file mode 100644[m
[1mindex d7d2d45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_probe.h[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-#ifndef _NGX_HTTP_PROBE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_PROBE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-[m
[31m-#include <ngx_dtrace_provider.h>[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_cycle(pr, uri, args)                       \[m
[31m-    NGINX_HTTP_SUBREQUEST_CYCLE(pr, uri, args)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_start(r)                                   \[m
[31m-    NGINX_HTTP_SUBREQUEST_START(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_finalize_writing(r)                        \[m
[31m-    NGINX_HTTP_SUBREQUEST_FINALIZE_WRITING(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_finalize_nonactive(r)                      \[m
[31m-    NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_finalize_nonactive(r)                      \[m
[31m-    NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_wake_parent(r)                             \[m
[31m-    NGINX_HTTP_SUBREQUEST_WAKE_PARENT(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_done(r)                                    \[m
[31m-    NGINX_HTTP_SUBREQUEST_DONE(r)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_post_start(r, rc)                          \[m
[31m-    NGINX_HTTP_SUBREQUEST_POST_START(r, rc)[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_post_done(r, rc)                           \[m
[31m-    NGINX_HTTP_SUBREQUEST_POST_DONE(r, rc)[m
[31m-[m
[31m-#define ngx_http_probe_module_post_config(m)                                 \[m
[31m-    NGINX_HTTP_MODULE_POST_CONFIG(m)[m
[31m-[m
[31m-#define ngx_http_probe_read_body_abort(r, reason)                            \[m
[31m-    NGINX_HTTP_READ_BODY_ABORT(r, reason)[m
[31m-[m
[31m-#define ngx_http_probe_read_body_done(r)                                     \[m
[31m-    NGINX_HTTP_READ_BODY_DONE(r)[m
[31m-[m
[31m-#define ngx_http_probe_read_req_line_done(r)                                 \[m
[31m-    NGINX_HTTP_READ_REQ_LINE_DONE(r)[m
[31m-[m
[31m-#define ngx_http_probe_read_req_header_done(r, h)                               \[m
[31m-    NGINX_HTTP_READ_REQ_HEADER_DONE(r, h)[m
[31m-[m
[31m-#else /* !(NGX_DTRACE) */[m
[31m-[m
[31m-#define ngx_http_probe_subrequest_cycle(pr, uri, args)[m
[31m-#define ngx_http_probe_subrequest_start(r)[m
[31m-#define ngx_http_probe_subrequest_finalize_writing(r)[m
[31m-#define ngx_http_probe_subrequest_finalize_nonactive(r)[m
[31m-#define ngx_http_probe_subrequest_wake_parent(r)[m
[31m-#define ngx_http_probe_subrequest_done(r)[m
[31m-#define ngx_http_probe_subrequest_post_start(r, rc)[m
[31m-#define ngx_http_probe_subrequest_post_done(r, rc)[m
[31m-#define ngx_http_probe_module_post_config(m)[m
[31m-#define ngx_http_probe_read_body_abort(r, reason)[m
[31m-#define ngx_http_probe_read_body_done(r)[m
[31m-#define ngx_http_probe_read_req_line_done(r)[m
[31m-#define ngx_http_probe_read_req_header_done(r, h)[m
[31m-[m
[31m-#endif /* NGX_DTRACE */[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_PROBE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.c[m
[1mdeleted file mode 100644[m
[1mindex 88c8298..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.c[m
[1m+++ /dev/null[m
[36m@@ -1,3666 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_wait_request_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_process_request_line(ngx_event_t *rev);[m
[31m-static void ngx_http_process_request_headers(ngx_event_t *rev);[m
[31m-static ssize_t ngx_http_read_request_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,[m
[31m-    ngx_uint_t request_line);[m
[31m-[m
[31m-static ngx_int_t ngx_http_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_unique_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_host(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_connection(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_user_agent(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-static ngx_int_t ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool,[m
[31m-    ngx_uint_t alloc);[m
[31m-static ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r,[m
[31m-    ngx_str_t *host);[m
[31m-static ngx_int_t ngx_http_find_virtual_server(ngx_connection_t *c,[m
[31m-    ngx_http_virtual_names_t *virtual_names, ngx_str_t *host,[m
[31m-    ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp);[m
[31m-[m
[31m-static void ngx_http_request_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-static void ngx_http_terminate_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_finalize_connection(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_set_write_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_writer(ngx_http_request_t *r);[m
[31m-static void ngx_http_request_finalizer(ngx_http_request_t *r);[m
[31m-[m
[31m-static void ngx_http_set_keepalive(ngx_http_request_t *r);[m
[31m-static void ngx_http_keepalive_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_set_lingering_close(ngx_http_request_t *r);[m
[31m-static void ngx_http_lingering_close_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_http_post_action(ngx_http_request_t *r);[m
[31m-static void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error);[m
[31m-static void ngx_http_log_request(ngx_http_request_t *r);[m
[31m-[m
[31m-static u_char *ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-static u_char *ngx_http_log_error_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_request_t *sr, u_char *buf, size_t len);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static void ngx_http_ssl_handshake(ngx_event_t *rev);[m
[31m-static void ngx_http_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_client_errors[] = {[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_METHOD */[m
[31m-    "client sent invalid method",[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_REQUEST */[m
[31m-    "client sent invalid request",[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_09_METHOD */[m
[31m-    "client sent invalid method in HTTP/0.9 request"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_header_t  ngx_http_headers_in[] = {[m
[31m-    { ngx_string("Host"), offsetof(ngx_http_headers_in_t, host),[m
[31m-                 ngx_http_process_host },[m
[31m-[m
[31m-    { ngx_string("Connection"), offsetof(ngx_http_headers_in_t, connection),[m
[31m-                 ngx_http_process_connection },[m
[31m-[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_modified_since),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Unmodified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_unmodified_since),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_match),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-None-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_none_match),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("User-Agent"), offsetof(ngx_http_headers_in_t, user_agent),[m
[31m-                 ngx_http_process_user_agent },[m
[31m-[m
[31m-    { ngx_string("Referer"), offsetof(ngx_http_headers_in_t, referer),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_length),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_type),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Range"), offsetof(ngx_http_headers_in_t, range),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_range),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, transfer_encoding),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Expect"),[m
[31m-                 offsetof(ngx_http_headers_in_t, expect),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Upgrade"),[m
[31m-                 offsetof(ngx_http_headers_in_t, upgrade),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Accept-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_encoding),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Via"), offsetof(ngx_http_headers_in_t, via),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Authorization"),[m
[31m-                 offsetof(ngx_http_headers_in_t, authorization),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"), offsetof(ngx_http_headers_in_t, keep_alive),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("X-Forwarded-For"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_forwarded_for),[m
[31m-                 ngx_http_process_multi_header_lines },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    { ngx_string("X-Real-IP"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_real_ip),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_HEADERS)[m
[31m-    { ngx_string("Accept"), offsetof(ngx_http_headers_in_t, accept),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Accept-Language"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_language),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    { ngx_string("Depth"), offsetof(ngx_http_headers_in_t, depth),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Overwrite"), offsetof(ngx_http_headers_in_t, overwrite),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Cookie"), offsetof(ngx_http_headers_in_t, cookies),[m
[31m-                 ngx_http_process_multi_header_lines },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_init_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_uint_t              i;[m
[31m-    ngx_event_t            *rev;[m
[31m-    struct sockaddr_in     *sin;[m
[31m-    ngx_http_port_t        *port;[m
[31m-    ngx_http_in_addr_t     *addr;[m
[31m-    ngx_http_log_ctx_t     *ctx;[m
[31m-    ngx_http_connection_t  *hc;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6    *sin6;[m
[31m-    ngx_http_in6_addr_t    *addr6;[m
[31m-#endif[m
[31m-[m
[31m-    hc = ngx_pcalloc(c->pool, sizeof(ngx_http_connection_t));[m
[31m-    if (hc == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->data = hc;[m
[31m-[m
[31m-    /* find the server configuration for the address:port */[m
[31m-[m
[31m-    port = c->listening->servers;[m
[31m-[m
[31m-    if (port->naddrs > 1) {[m
[31m-[m
[31m-        /*[m
[31m-         * there are several addresses on this port and one of them[m
[31m-         * is an "*:port" wildcard so getsockname() in ngx_http_server_addr()[m
[31m-         * is required to determine a server address[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-[m
[31m-            addr6 = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hc->addr_conf = &addr6[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-[m
[31m-            addr = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (addr[i].addr == sin->sin_addr.s_addr) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hc->addr_conf = &addr[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            addr6 = port->addrs;[m
[31m-            hc->addr_conf = &addr6[0].conf;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            addr = port->addrs;[m
[31m-            hc->addr_conf = &addr[0].conf;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the default server configuration for the address:port */[m
[31m-    hc->conf_ctx = hc->addr_conf->default_server->ctx;[m
[31m-[m
[31m-    ctx = ngx_palloc(c->pool, sizeof(ngx_http_log_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->connection = c;[m
[31m-    ctx->request = NULL;[m
[31m-    ctx->current_request = NULL;[m
[31m-[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->handler = ngx_http_log_error;[m
[31m-    c->log->data = ctx;[m
[31m-    c->log->action = "waiting for request";[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    rev->handler = ngx_http_wait_request_handler;[m
[31m-    c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (hc->addr_conf->http2) {[m
[31m-        rev->handler = ngx_http_v2_init;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    {[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-    if (sscf->enable || hc->addr_conf->ssl) {[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (hc->addr_conf->ssl && sscf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined "[m
[31m-                          "in server listening on SSL port");[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        hc->ssl = 1;[m
[31m-[m
[31m-        rev->handler = ngx_http_ssl_handshake;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (hc->addr_conf->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 1;[m
[31m-        c->log->action = "reading PROXY protocol";[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        /* the deferred accept(), iocp */[m
[31m-[m
[31m-        if (ngx_use_accept_mutex) {[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rev->handler(rev);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_wait_request_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http wait request handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    hc = c->data;[m
[31m-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    size = cscf->client_header_buffer_size;[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        b = ngx_create_temp_buf(c->pool, size);[m
[31m-        if (b == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->buffer = b;[m
[31m-[m
[31m-    } else if (b->start == NULL) {[m
[31m-[m
[31m-        b->start = ngx_palloc(c->pool, size);[m
[31m-        if (b->start == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-        b->end = b->last + size;[m
[31m-    }[m
[31m-[m
[31m-    n = c->recv(c, b->last, size);[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!rev->timer_set) {[m
[31m-            ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-            ngx_reusable_connection(c, 1);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * We are trying to not hold c->buffer's memory for an idle connection.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-            b->start = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client closed connection");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    if (hc->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 0;[m
[31m-[m
[31m-        p = ngx_proxy_protocol_read(c, b->pos, b->last);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = p;[m
[31m-[m
[31m-        if (b->pos == b->last) {[m
[31m-            c->log->action = "waiting for request";[m
[31m-            b->pos = b->start;[m
[31m-            b->last = b->start;[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "reading client request line";[m
[31m-[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    c->data = ngx_http_create_request(c);[m
[31m-    if (c->data == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rev->handler = ngx_http_process_request_line;[m
[31m-    ngx_http_process_request_line(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *[m
[31m-ngx_http_create_request(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t                 *pool;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_log_ctx_t         *ctx;[m
[31m-    ngx_http_connection_t      *hc;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    c->requests++;[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    pool = ngx_create_pool(cscf->request_pool_size, c->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_pcalloc(pool, sizeof(ngx_http_request_t));[m
[31m-    if (r == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->pool = pool;[m
[31m-[m
[31m-    r->http_connection = hc;[m
[31m-    r->signature = NGX_HTTP_MODULE;[m
[31m-    r->connection = c;[m
[31m-[m
[31m-    r->main_conf = hc->conf_ctx->main_conf;[m
[31m-    r->srv_conf = hc->conf_ctx->srv_conf;[m
[31m-    r->loc_conf = hc->conf_ctx->loc_conf;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-    r->header_in = hc->nbusy ? hc->busy[0] : c->buffer;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (r->ctx == NULL) {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    r->variables = ngx_pcalloc(r->pool, cmcf->variables.nelts[m
[31m-                                        * sizeof(ngx_http_variable_value_t));[m
[31m-    if (r->variables == NULL) {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        r->main_filter_need_in_memory = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->main = r;[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    r->start_sec = tp->sec;[m
[31m-    r->start_msec = tp->msec;[m
[31m-[m
[31m-    r->method = NGX_HTTP_UNKNOWN;[m
[31m-    r->http_version = NGX_HTTP_VERSION_10;[m
[31m-[m
[31m-    r->headers_in.content_length_n = -1;[m
[31m-    r->headers_in.keep_alive_n = -1;[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-    r->headers_out.last_modified_time = -1;[m
[31m-[m
[31m-    r->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    r->subrequests = NGX_HTTP_MAX_SUBREQUESTS + 1;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_READING_REQUEST_STATE;[m
[31m-[m
[31m-    ctx = c->log->data;[m
[31m-    ctx->request = r;[m
[31m-    ctx->current_request = r;[m
[31m-    r->log_handler = ngx_http_log_error_handler;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_reading, 1);[m
[31m-    r->stat_reading = 1;[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_requests, 1);[m
[31m-#endif[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssl_handshake(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                   *p, buf[NGX_PROXY_PROTOCOL_MAX_HEADER + 1];[m
[31m-    size_t                    size;[m
[31m-    ssize_t                   n;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_connection_t         *c;[m
[31m-    ngx_http_connection_t    *hc;[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http check ssl handshake");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    size = hc->proxy_protocol ? sizeof(buf) : 1;[m
[31m-[m
[31m-    n = recv(c->fd, (char *) buf, size, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http recv(): %z", n);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            rev->ready = 0;[m
[31m-[m
[31m-            if (!rev->timer_set) {[m
[31m-                ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-                ngx_reusable_connection(c, 1);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_http_close_connection(c);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_connection_error(c, err, "recv() failed");[m
[31m-        ngx_http_close_connection(c);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (hc->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 0;[m
[31m-[m
[31m-        p = ngx_proxy_protocol_read(c, buf, buf + n);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        size = p - buf;[m
[31m-[m
[31m-        if (c->recv(c, buf, size) != (ssize_t) size) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (n == (ssize_t) size) {[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        n = 1;[m
[31m-        buf[0] = *p;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        if (buf[0] & 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                           "https ssl handshake: 0x%02Xd", buf[0]);[m
[31m-[m
[31m-            sscf = ngx_http_get_module_srv_conf(hc->conf_ctx,[m
[31m-                                                ngx_http_ssl_module);[m
[31m-[m
[31m-            if (ngx_ssl_create_connection(&sscf->ssl, c, NGX_SSL_BUFFER)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                if (!rev->timer_set) {[m
[31m-                    ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-                }[m
[31m-[m
[31m-                ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-                c->ssl->handler = ngx_http_ssl_handshake_handler;[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_ssl_handshake_handler(c);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "plain http");[m
[31m-[m
[31m-        c->log->action = "waiting for request";[m
[31m-[m
[31m-        rev->handler = ngx_http_wait_request_handler;[m
[31m-        ngx_http_wait_request_handler(rev);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, "client closed connection");[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        /*[m
[31m-         * The majority of browsers do not send the "close notify" alert.[m
[31m-         * Among them are MSIE, old Mozilla, Netscape 4, Konqueror,[m
[31m-         * and Links.  And what is more, MSIE ignores the server's alert.[m
[31m-         *[m
[31m-         * Opera and recent Mozilla send the alert.[m
[31m-         */[m
[31m-[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_V2                                                              \[m
[31m-     && (defined TLSEXT_TYPE_application_layer_protocol_negotiation           \[m
[31m-         || defined TLSEXT_TYPE_next_proto_neg))[m
[31m-        {[m
[31m-        unsigned int            len;[m
[31m-        const unsigned char    *data;[m
[31m-        ngx_http_connection_t  *hc;[m
[31m-[m
[31m-        hc = c->data;[m
[31m-[m
[31m-        if (hc->addr_conf->http2) {[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-            SSL_get0_alpn_selected(c->ssl->connection, &data, &len);[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-            if (len == 0) {[m
[31m-                SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#else /* TLSEXT_TYPE_next_proto_neg */[m
[31m-            SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);[m
[31m-#endif[m
[31m-[m
[31m-            if (len == 2 && data[0] == 'h' && data[1] == '2') {[m
[31m-                ngx_http_v2_init(c->read);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c->log->action = "waiting for request";[m
[31m-[m
[31m-        c->read->handler = ngx_http_wait_request_handler;[m
[31m-        /* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-        ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-        ngx_http_wait_request_handler(c->read);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-int[m
[31m-ngx_http_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg)[m
[31m-{[m
[31m-    ngx_str_t                  host;[m
[31m-    const char                *servername;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_ssl_srv_conf_t   *sscf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    servername = SSL_get_servername(ssl_conn, TLSEXT_NAMETYPE_host_name);[m
[31m-[m
[31m-    if (servername == NULL) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    if (c->ssl->renegotiation) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "SSL server name: \"%s\"", servername);[m
[31m-[m
[31m-    host.len = ngx_strlen(servername);[m
[31m-[m
[31m-    if (host.len == 0) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) servername;[m
[31m-[m
[31m-    if (ngx_http_validate_host(&host, c->pool, 1) != NGX_OK) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    if (ngx_http_find_virtual_server(c, hc->addr_conf->virtual_names, &host,[m
[31m-                                     NULL, &cscf)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    hc->ssl_servername = ngx_palloc(c->pool, sizeof(ngx_str_t));[m
[31m-    if (hc->ssl_servername == NULL) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    *hc->ssl_servername = host;[m
[31m-[m
[31m-    hc->conf_ctx = cscf->ctx;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(c, clcf->error_log);[m
[31m-[m
[31m-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-    if (sscf->ssl.ctx) {[m
[31m-        SSL_set_SSL_CTX(ssl_conn, sscf->ssl.ctx);[m
[31m-[m
[31m-        /*[m
[31m-         * SSL_set_SSL_CTX() only changes certs as of 1.0.0d[m
[31m-         * adjust other things we care about[m
[31m-         */[m
[31m-[m
[31m-        SSL_set_verify(ssl_conn, SSL_CTX_get_verify_mode(sscf->ssl.ctx),[m
[31m-                       SSL_CTX_get_verify_callback(sscf->ssl.ctx));[m
[31m-[m
[31m-        SSL_set_verify_depth(ssl_conn, SSL_CTX_get_verify_depth(sscf->ssl.ctx));[m
[31m-[m
[31m-#ifdef SSL_CTRL_CLEAR_OPTIONS[m
[31m-        /* only in 0.9.8m+ */[m
[31m-        SSL_clear_options(ssl_conn, SSL_get_options(ssl_conn) &[m
[31m-                                    ~SSL_CTX_get_options(sscf->ssl.ctx));[m
[31m-#endif[m
[31m-[m
[31m-        SSL_set_options(ssl_conn, SSL_CTX_get_options(sscf->ssl.ctx));[m
[31m-    }[m
[31m-[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_process_request_line(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t              n;[m
[31m-    ngx_int_t            rc, rv;[m
[31m-    ngx_str_t            host;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http process request line");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            n = ngx_http_read_request_header(r);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_parse_request_line(r, r->header_in);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* the request line has been parsed successfully */[m
[31m-[m
[31m-            r->request_line.len = r->request_end - r->request_start;[m
[31m-            r->request_line.data = r->request_start;[m
[31m-            r->request_length = r->header_in->pos - r->request_start;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http request line: \"%V\"", &r->request_line);[m
[31m-[m
[31m-            r->method_name.len = r->method_end - r->request_start + 1;[m
[31m-            r->method_name.data = r->request_line.data;[m
[31m-[m
[31m-            if (r->http_protocol.data) {[m
[31m-                r->http_protocol.len = r->request_end - r->http_protocol.data;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_process_request_uri(r) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (r->host_start && r->host_end) {[m
[31m-[m
[31m-                host.len = r->host_end - r->host_start;[m
[31m-                host.data = r->host_start;[m
[31m-[m
[31m-                rc = ngx_http_validate_host(&host, r->pool, 0);[m
[31m-[m
[31m-                if (rc == NGX_DECLINED) {[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                  "client sent invalid host in request line");[m
[31m-                    ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                r->headers_in.server = host;[m
[31m-            }[m
[31m-[m
[31m-            if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-[m
[31m-                if (r->headers_in.server.len == 0[m
[31m-                    && ngx_http_set_virtual_server(r, &r->headers_in.server)[m
[31m-                       == NGX_ERROR)[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_process_request(r);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                              sizeof(ngx_table_elt_t))[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "reading client request headers";[m
[31m-[m
[31m-            rev->handler = ngx_http_process_request_headers;[m
[31m-            ngx_http_process_request_headers(rev);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_AGAIN) {[m
[31m-[m
[31m-            /* there was error while a request line parsing */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          ngx_http_client_errors[rc - NGX_HTTP_CLIENT_ERROR]);[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_AGAIN: a request line parsing is still incomplete */[m
[31m-[m
[31m-        if (r->header_in->pos == r->header_in->end) {[m
[31m-[m
[31m-            rv = ngx_http_alloc_large_header_buffer(r, 1);[m
[31m-[m
[31m-            if (rv == NGX_ERROR) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (rv == NGX_DECLINED) {[m
[31m-                r->request_line.len = r->header_in->end - r->request_start;[m
[31m-                r->request_line.data = r->request_start;[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client sent too long URI");[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_process_request_uri(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (r->args_start) {[m
[31m-        r->uri.len = r->args_start - 1 - r->uri_start;[m
[31m-    } else {[m
[31m-        r->uri.len = r->uri_end - r->uri_start;[m
[31m-    }[m
[31m-[m
[31m-    if (r->complex_uri || r->quoted_uri) {[m
[31m-[m
[31m-        r->uri.data = ngx_pnalloc(r->pool, r->uri.len + 1);[m
[31m-        if (r->uri.data == NULL) {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (ngx_http_parse_complex_uri(r, cscf->merge_slashes) != NGX_OK) {[m
[31m-            r->uri.len = 0;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid request");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->uri.data = r->uri_start;[m
[31m-    }[m
[31m-[m
[31m-    r->unparsed_uri.len = r->uri_end - r->uri_start;[m
[31m-    r->unparsed_uri.data = r->uri_start;[m
[31m-[m
[31m-    r->valid_unparsed_uri = r->space_in_uri ? 0 : 1;[m
[31m-[m
[31m-    if (r->uri_ext) {[m
[31m-        if (r->args_start) {[m
[31m-            r->exten.len = r->args_start - 1 - r->uri_ext;[m
[31m-        } else {[m
[31m-            r->exten.len = r->uri_end - r->uri_ext;[m
[31m-        }[m
[31m-[m
[31m-        r->exten.data = r->uri_ext;[m
[31m-    }[m
[31m-[m
[31m-    if (r->args_start && r->uri_end > r->args_start) {[m
[31m-        r->args.len = r->uri_end - r->args_start;[m
[31m-        r->args.data = r->args_start;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    {[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    p = r->uri.data;[m
[31m-    last = r->uri.data + r->uri.len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        if (*p++ == ':') {[m
[31m-[m
[31m-            /*[m
[31m-             * this check covers "::$data", "::$index_allocation" and[m
[31m-             * ":$i30:$index_allocation"[m
[31m-             */[m
[31m-[m
[31m-            if (p < last && *p == '$') {[m
[31m-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                              "client sent unsafe win32 URI");[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = r->uri.data + r->uri.len - 1;[m
[31m-[m
[31m-    while (p > r->uri.data) {[m
[31m-[m
[31m-        if (*p == ' ') {[m
[31m-            p--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == '.') {[m
[31m-            p--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (p != r->uri.data + r->uri.len - 1) {[m
[31m-        r->uri.len = p + 1 - r->uri.data;[m
[31m-        ngx_http_set_exten(r);[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http uri: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http args: \"%V\"", &r->args);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http exten: \"%V\"", &r->exten);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_process_request_headers(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ssize_t                     n;[m
[31m-    ngx_int_t                   rc, rv;[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http process request header line");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            if (r->header_in->pos == r->header_in->end) {[m
[31m-[m
[31m-                rv = ngx_http_alloc_large_header_buffer(r, 0);[m
[31m-[m
[31m-                if (rv == NGX_ERROR) {[m
[31m-                    ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (rv == NGX_DECLINED) {[m
[31m-                    p = r->header_name_start;[m
[31m-[m
[31m-                    r->lingering_close = 1;[m
[31m-[m
[31m-                    if (p == NULL) {[m
[31m-                        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                      "client sent too large request");[m
[31m-                        ngx_http_finalize_request(r,[m
[31m-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    len = r->header_in->end - p;[m
[31m-[m
[31m-                    if (len > NGX_MAX_ERROR_STR - 300) {[m
[31m-                        len = NGX_MAX_ERROR_STR - 300;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                "client sent too long header line: \"%*s...\"",[m
[31m-                                len, r->header_name_start);[m
[31m-[m
[31m-                    ngx_http_finalize_request(r,[m
[31m-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_http_read_request_header(r);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* the host header could change the server configuration context */[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, r->header_in,[m
[31m-                                        cscf->underscores_in_headers);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            r->request_length += r->header_in->pos - r->header_name_start;[m
[31m-[m
[31m-            if (r->invalid_header && cscf->ignore_invalid_headers) {[m
[31m-[m
[31m-                /* there was error while a header line parsing */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client sent invalid header line: \"%*s\"",[m
[31m-                              r->header_end - r->header_name_start,[m
[31m-                              r->header_name_start);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->key.data = r->header_name_start;[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-            h->value.data = r->header_start;[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-            if (h->lowcase_key == NULL) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_probe_read_req_header_done(r, h);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http header: \"%V: %V\"",[m
[31m-                           &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http header done");[m
[31m-[m
[31m-            r->request_length += r->header_in->pos - r->header_name_start;[m
[31m-[m
[31m-            r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;[m
[31m-[m
[31m-            rc = ngx_http_process_request_header(r);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_process_request(r);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            /* a header line parsing is still not complete */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_HTTP_PARSE_INVALID_HEADER */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent invalid header line");[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_read_request_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    n = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        n = c->recv(c, r->header_in->last,[m
[31m-                    r->header_in->end - r->header_in->last);[m
[31m-    } else {[m
[31m-        n = NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (!rev->timer_set) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(rev, cscf->client_header_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client prematurely closed connection");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0 || n == NGX_ERROR) {[m
[31m-        c->error = 1;[m
[31m-        c->log->action = "reading client request headers";[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->header_in->last += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,[m
[31m-    ngx_uint_t request_line)[m
[31m-{[m
[31m-    u_char                    *old, *new;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http alloc large header buffer");[m
[31m-[m
[31m-    if (request_line && r->state == 0) {[m
[31m-[m
[31m-        /* the client fills up the buffer with "\r\n" */[m
[31m-[m
[31m-        r->header_in->pos = r->header_in->start;[m
[31m-        r->header_in->last = r->header_in->start;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    old = request_line ? r->request_start : r->header_name_start;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->state != 0[m
[31m-        && (size_t) (r->header_in->pos - old)[m
[31m-                                     >= cscf->large_client_header_buffers.size)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-[m
[31m-    if (hc->nfree) {[m
[31m-        b = hc->free[--hc->nfree];[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http large header free: %p %uz",[m
[31m-                       b->pos, b->end - b->last);[m
[31m-[m
[31m-    } else if (hc->nbusy < cscf->large_client_header_buffers.num) {[m
[31m-[m
[31m-        if (hc->busy == NULL) {[m
[31m-            hc->busy = ngx_palloc(r->connection->pool,[m
[31m-                  cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));[m
[31m-            if (hc->busy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->connection->pool,[m
[31m-                                cscf->large_client_header_buffers.size);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http large header alloc: %p %uz",[m
[31m-                       b->pos, b->end - b->last);[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hc->busy[hc->nbusy++] = b;[m
[31m-[m
[31m-    if (r->state == 0) {[m
[31m-        /*[m
[31m-         * r->state == 0 means that a header line was parsed successfully[m
[31m-         * and we do not need to copy incomplete header line and[m
[31m-         * to relocate the parser header pointers[m
[31m-         */[m
[31m-[m
[31m-        r->header_in = b;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http large header copy: %uz", r->header_in->pos - old);[m
[31m-[m
[31m-    new = b->start;[m
[31m-[m
[31m-    ngx_memcpy(new, old, r->header_in->pos - old);[m
[31m-[m
[31m-    b->pos = new + (r->header_in->pos - old);[m
[31m-    b->last = new + (r->header_in->pos - old);[m
[31m-[m
[31m-    if (request_line) {[m
[31m-        r->request_start = new;[m
[31m-[m
[31m-        if (r->request_end) {[m
[31m-            r->request_end = new + (r->request_end - old);[m
[31m-        }[m
[31m-[m
[31m-        r->method_end = new + (r->method_end - old);[m
[31m-[m
[31m-        r->uri_start = new + (r->uri_start - old);[m
[31m-        r->uri_end = new + (r->uri_end - old);[m
[31m-[m
[31m-        if (r->schema_start) {[m
[31m-            r->schema_start = new + (r->schema_start - old);[m
[31m-            r->schema_end = new + (r->schema_end - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->host_start) {[m
[31m-            r->host_start = new + (r->host_start - old);[m
[31m-            if (r->host_end) {[m
[31m-                r->host_end = new + (r->host_end - old);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (r->port_start) {[m
[31m-            r->port_start = new + (r->port_start - old);[m
[31m-            r->port_end = new + (r->port_end - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->uri_ext) {[m
[31m-            r->uri_ext = new + (r->uri_ext - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->args_start) {[m
[31m-            r->args_start = new + (r->args_start - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->http_protocol.data) {[m
[31m-            r->http_protocol.data = new + (r->http_protocol.data - old);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->header_name_start = new;[m
[31m-        r->header_name_end = new + (r->header_name_end - old);[m
[31m-        r->header_start = new + (r->header_start - old);[m
[31m-        r->header_end = new + (r->header_end - old);[m
[31m-    }[m
[31m-[m
[31m-    r->header_in = b;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_unique_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                  "client sent duplicate header line: \"%V: %V\", "[m
[31m-                  "previous value: \"%V: %V\"",[m
[31m-                  &h->key, &h->value, &(*ph)->key, &(*ph)->value);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_host(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_str_t  host;[m
[31m-[m
[31m-    if (r->headers_in.host == NULL) {[m
[31m-        r->headers_in.host = h;[m
[31m-    }[m
[31m-[m
[31m-    host = h->value;[m
[31m-[m
[31m-    rc = ngx_http_validate_host(&host, r->pool, 0);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent invalid host header");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.server.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.server = host;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    if (ngx_strcasestrn(h->value.data, "close", 5 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-[m
[31m-    } else if (ngx_strcasestrn(h->value.data, "keep-alive", 10 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_user_agent(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *user_agent, *msie;[m
[31m-[m
[31m-    if (r->headers_in.user_agent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.user_agent = h;[m
[31m-[m
[31m-    /* check some widespread browsers while the header is in CPU cache */[m
[31m-[m
[31m-    user_agent = h->value.data;[m
[31m-[m
[31m-    msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1);[m
[31m-[m
[31m-    if (msie && msie + 7 < user_agent + h->value.len) {[m
[31m-[m
[31m-        r->headers_in.msie = 1;[m
[31m-[m
[31m-        if (msie[6] == '.') {[m
[31m-[m
[31m-            switch (msie[5]) {[m
[31m-            case '4':[m
[31m-            case '5':[m
[31m-                r->headers_in.msie6 = 1;[m
[31m-                break;[m
[31m-            case '6':[m
[31m-                if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) {[m
[31m-                    r->headers_in.msie6 = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        /* MSIE ignores the SSL "close notify" alert */[m
[31m-        if (c->ssl) {[m
[31m-            c->ssl->no_send_shutdown = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstrn(user_agent, "Opera", 5 - 1)) {[m
[31m-        r->headers_in.opera = 1;[m
[31m-        r->headers_in.msie = 0;[m
[31m-        r->headers_in.msie6 = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->headers_in.msie && !r->headers_in.opera) {[m
[31m-[m
[31m-        if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {[m
[31m-            r->headers_in.gecko = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {[m
[31m-            r->headers_in.chrome = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)[m
[31m-                   && ngx_strstrn(user_agent, "Mac OS X", 8 - 1))[m
[31m-        {[m
[31m-            r->headers_in.safari = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {[m
[31m-            r->headers_in.konqueror = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_multi_header_lines(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t       *headers;[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    headers = (ngx_array_t *) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (headers->elts == NULL) {[m
[31m-        if (ngx_array_init(headers, r->pool, 1, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(headers);[m
[31m-    if (ph == NULL) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_process_request_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->headers_in.server.len == 0[m
[31m-        && ngx_http_set_virtual_server(r, &r->headers_in.server)[m
[31m-           == NGX_ERROR)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.host == NULL && r->http_version > NGX_HTTP_VERSION_10) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                   "client sent HTTP/1.1 request without \"Host\" header");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length_n =[m
[31m-                            ngx_atoof(r->headers_in.content_length->value.data,[m
[31m-                                      r->headers_in.content_length->value.len);[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid \"Content-Length\" header");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_TRACE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent TRACE method");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.transfer_encoding) {[m
[31m-        if (r->headers_in.transfer_encoding->value.len == 7[m
[31m-            && ngx_strncasecmp(r->headers_in.transfer_encoding->value.data,[m
[31m-                               (u_char *) "chunked", 7) == 0)[m
[31m-        {[m
[31m-            r->headers_in.content_length = NULL;[m
[31m-            r->headers_in.content_length_n = -1;[m
[31m-            r->headers_in.chunked = 1;[m
[31m-[m
[31m-        } else if (r->headers_in.transfer_encoding->value.len != 8[m
[31m-            || ngx_strncasecmp(r->headers_in.transfer_encoding->value.data,[m
[31m-                               (u_char *) "identity", 8) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent unknown \"Transfer-Encoding\": \"%V\"",[m
[31m-                          &r->headers_in.transfer_encoding->value);[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_NOT_IMPLEMENTED);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.connection_type == NGX_HTTP_CONNECTION_KEEP_ALIVE) {[m
[31m-        if (r->headers_in.keep_alive) {[m
[31m-            r->headers_in.keep_alive_n =[m
[31m-                            ngx_atotm(r->headers_in.keep_alive->value.data,[m
[31m-                                      r->headers_in.keep_alive->value.len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_process_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->http_connection->ssl) {[m
[31m-        long                      rc;[m
[31m-        X509                     *cert;[m
[31m-        ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-        if (c->ssl == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "client sent plain HTTP request to HTTPS port");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module);[m
[31m-[m
[31m-        if (sscf->verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK[m
[31m-                && (sscf->verify != 3 || !ngx_ssl_verify_error_optional(rc)))[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-[m
[31m-                ngx_ssl_remove_cached_session(sscf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-                ngx_http_finalize_request(r, NGX_HTTPS_CERT_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (sscf->verify == 1) {[m
[31m-                cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-                if (cert == NULL) {[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                  "client sent no required SSL certificate");[m
[31m-[m
[31m-                    ngx_ssl_remove_cached_session(sscf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-                    ngx_http_finalize_request(r, NGX_HTTPS_NO_CERT);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                X509_free(cert);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_reading, -1);[m
[31m-    r->stat_reading = 0;[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_writing, 1);[m
[31m-    r->stat_writing = 1;[m
[31m-#endif[m
[31m-[m
[31m-    c->read->handler = ngx_http_request_handler;[m
[31m-    c->write->handler = ngx_http_request_handler;[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    ngx_http_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc)[m
[31m-{[m
[31m-    u_char  *h, ch;[m
[31m-    size_t   i, dot_pos, host_len;[m
[31m-[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_literal,[m
[31m-        sw_rest[m
[31m-    } state;[m
[31m-[m
[31m-    dot_pos = host->len;[m
[31m-    host_len = host->len;[m
[31m-[m
[31m-    h = host->data;[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-[m
[31m-    for (i = 0; i < host->len; i++) {[m
[31m-        ch = h[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '.':[m
[31m-            if (dot_pos == i - 1) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-            dot_pos = i;[m
[31m-            break;[m
[31m-[m
[31m-        case ':':[m
[31m-            if (state == sw_usual) {[m
[31m-                host_len = i;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '[':[m
[31m-            if (i == 0) {[m
[31m-                state = sw_literal;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ']':[m
[31m-            if (state == sw_literal) {[m
[31m-                host_len = i + 1;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '\0':[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            if (ngx_path_separator(ch)) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                alloc = 1;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dot_pos == host_len - 1) {[m
[31m-        host_len--;[m
[31m-    }[m
[31m-[m
[31m-    if (host_len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc) {[m
[31m-        host->data = ngx_pnalloc(pool, host_len);[m
[31m-        if (host->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_strlow(host->data, h, host_len);[m
[31m-    }[m
[31m-[m
[31m-    host->len = host_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf = NULL;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    cscf = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-    if (hc->ssl_servername) {[m
[31m-        if (hc->ssl_servername->len == host->len[m
[31m-            && ngx_strncmp(hc->ssl_servername->data,[m
[31m-                           host->data, host->len) == 0)[m
[31m-        {[m
[31m-#if (NGX_PCRE)[m
[31m-            if (hc->ssl_servername_regex[m
[31m-                && ngx_http_regex_exec(r, hc->ssl_servername_regex,[m
[31m-                                          hc->ssl_servername) != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-#endif[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_find_virtual_server(r->connection,[m
[31m-                                      hc->addr_conf->virtual_names,[m
[31m-                                      host, r, &cscf);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-    if (hc->ssl_servername) {[m
[31m-        ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            cscf = hc->addr_conf->default_server;[m
[31m-            rc = NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_http_get_module_srv_conf(cscf->ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-        if (sscf->verify) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client attempted to request the server name "[m
[31m-                          "different from that one was negotiated");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->srv_conf = cscf->ctx->srv_conf;[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_find_virtual_server(ngx_connection_t *c,[m
[31m-    ngx_http_virtual_names_t *virtual_names, ngx_str_t *host,[m
[31m-    ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (virtual_names == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_hash_find_combined(&virtual_names->names,[m
[31m-                                  ngx_hash_key(host->data, host->len),[m
[31m-                                  host->data, host->len);[m
[31m-[m
[31m-    if (cscf) {[m
[31m-        *cscfp = cscf;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (host->len && virtual_names->nregex) {[m
[31m-        ngx_int_t                n;[m
[31m-        ngx_uint_t               i;[m
[31m-        ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-        sn = virtual_names->regex;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-        if (r == NULL) {[m
[31m-            ngx_http_connection_t  *hc;[m
[31m-[m
[31m-            for (i = 0; i < virtual_names->nregex; i++) {[m
[31m-[m
[31m-                n = ngx_regex_exec(sn[i].regex->regex, host, NULL, 0);[m
[31m-[m
[31m-                if (n == NGX_REGEX_NO_MATCHED) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (n >= 0) {[m
[31m-                    hc = c->data;[m
[31m-                    hc->ssl_servername_regex = sn[i].regex;[m
[31m-[m
[31m-                    *cscfp = sn[i].server;[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              ngx_regex_exec_n " failed: %i "[m
[31m-                              "on \"%V\" using \"%V\"",[m
[31m-                              n, host, &sn[i].regex->name);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-#endif /* NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME */[m
[31m-[m
[31m-        for (i = 0; i < virtual_names->nregex; i++) {[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, sn[i].regex, host);[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                *cscfp = sn[i].server;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif /* NGX_PCRE */[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_request_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http run request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        r->write_event_handler(r);[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_run_posted_requests(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_posted_request_t  *pr;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (c->destroyed) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r = c->data;[m
[31m-        pr = r->main->posted_requests;[m
[31m-[m
[31m-        if (pr == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->main->posted_requests = pr->next;[m
[31m-[m
[31m-        r = pr->request;[m
[31m-[m
[31m-        ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http posted request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_post_request(ngx_http_request_t *r, ngx_http_posted_request_t *pr)[m
[31m-{[m
[31m-    ngx_http_posted_request_t  **p;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-        if (pr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-    for (p = &r->main->posted_requests; *p; p = &(*p)->next) { /* void */ }[m
[31m-[m
[31m-    *p = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_t        *pr;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http finalize request: %i, \"%V?%V\" a:%d, c:%d",[m
[31m-                   rc, &r->uri, &r->args, r == c->data, r->main->count);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_finalize_connection(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK && r->filter_finalize) {[m
[31m-        c->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->content_handler = NULL;[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main && r->post_subrequest) {[m
[31m-        ngx_http_probe_subrequest_post_start(r, rc);[m
[31m-[m
[31m-        rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc);[m
[31m-[m
[31m-        ngx_http_probe_subrequest_post_done(r, rc);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc == NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        || c->error)[m
[31m-    {[m
[31m-        if (ngx_http_post_action(r) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (r->main->blocked) {[m
[31m-            r->write_event_handler = ngx_http_request_finalizer;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_terminate_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        || rc == NGX_HTTP_CREATED[m
[31m-        || rc == NGX_HTTP_NO_CONTENT)[m
[31m-    {[m
[31m-        if (rc == NGX_HTTP_CLOSE) {[m
[31m-            ngx_http_terminate_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (r == r->main) {[m
[31m-            if (c->read->timer_set) {[m
[31m-                ngx_del_timer(c->read);[m
[31m-            }[m
[31m-[m
[31m-            if (c->write->timer_set) {[m
[31m-                ngx_del_timer(c->write);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        c->read->handler = ngx_http_request_handler;[m
[31m-        c->write->handler = ngx_http_request_handler;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-[m
[31m-        if (r->buffered || r->postponed) {[m
[31m-[m
[31m-            ngx_http_probe_subrequest_finalize_writing(r);[m
[31m-[m
[31m-            if (ngx_http_set_write_handler(r) != NGX_OK) {[m
[31m-                ngx_http_terminate_request(r, 0);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        pr = r->parent;[m
[31m-[m
[31m-        if (r == c->data) {[m
[31m-[m
[31m-            r->main->count--;[m
[31m-[m
[31m-            if (!r->logged) {[m
[31m-[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                if (clcf->log_subrequest) {[m
[31m-                    ngx_http_log_request(r);[m
[31m-                }[m
[31m-[m
[31m-                r->logged = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              "subrequest: \"%V?%V\" logged again",[m
[31m-                              &r->uri, &r->args);[m
[31m-            }[m
[31m-[m
[31m-            r->done = 1;[m
[31m-[m
[31m-            if (pr->postponed && pr->postponed->request == r) {[m
[31m-                pr->postponed = pr->postponed->next;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_probe_subrequest_done(r);[m
[31m-[m
[31m-            c->data = pr;[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            ngx_http_probe_subrequest_finalize_nonactive(r);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http finalize non-active request: \"%V?%V\"",[m
[31m-                           &r->uri, &r->args);[m
[31m-[m
[31m-            r->write_event_handler = ngx_http_request_finalizer;[m
[31m-[m
[31m-            if (r->waited) {[m
[31m-                r->done = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_probe_subrequest_wake_parent(r);[m
[31m-[m
[31m-        if (ngx_http_post_request(pr, NULL) != NGX_OK) {[m
[31m-            r->main->count++;[m
[31m-            ngx_http_terminate_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http wake parent request: \"%V?%V\"",[m
[31m-                       &pr->uri, &pr->args);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered || c->buffered || r->postponed || r->blocked) {[m
[31m-[m
[31m-        if (ngx_http_set_write_handler(r) != NGX_OK) {[m
[31m-            ngx_http_terminate_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != c->data) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "http finalize non-active request: \"%V?%V\"",[m
[31m-                      &r->uri, &r->args);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->done = 1;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    if (!r->post_action) {[m
[31m-        r->request_complete = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_post_action(r) == NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        c->write->delayed = 0;[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->eof) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_connection(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_cleanup_t    *cln;[m
[31m-    ngx_http_request_t    *mr;[m
[31m-    ngx_http_ephemeral_t  *e;[m
[31m-[m
[31m-    mr = r->main;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate request count:%d", mr->count);[m
[31m-[m
[31m-    if (rc > 0 && (mr->headers_out.status == 0 || mr->connection->sent == 0)) {[m
[31m-        mr->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    cln = mr->cleanup;[m
[31m-    mr->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate cleanup count:%d blk:%d",[m
[31m-                   mr->count, mr->blocked);[m
[31m-[m
[31m-    if (mr->write_event_handler) {[m
[31m-[m
[31m-        if (mr->blocked) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        e = ngx_http_ephemeral(mr);[m
[31m-        mr->posted_requests = NULL;[m
[31m-        mr->write_event_handler = ngx_http_terminate_handler;[m
[31m-        (void) ngx_http_post_request(mr, &e->terminal_posted_request);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_request(mr, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_terminate_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate handler count:%d", r->count);[m
[31m-[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    ngx_http_close_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_finalize_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->main->count != 1) {[m
[31m-[m
[31m-        if (r->discard_body) {[m
[31m-            r->read_event_handler = ngx_http_discarded_request_body_handler;[m
[31m-            ngx_add_timer(r->connection->read, clcf->lingering_timeout);[m
[31m-[m
[31m-            if (r->lingering_time == 0) {[m
[31m-                r->lingering_time = ngx_time()[m
[31m-                                      + (time_t) (clcf->lingering_time / 1000);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->reading_body) {[m
[31m-        r->keepalive = 0;[m
[31m-        r->lingering_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_terminate[m
[31m-         && !ngx_exiting[m
[31m-         && r->keepalive[m
[31m-         && clcf->keepalive_timeout > 0)[m
[31m-    {[m
[31m-        ngx_http_set_keepalive(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lingering_close == NGX_HTTP_LINGERING_ALWAYS[m
[31m-        || (clcf->lingering_close == NGX_HTTP_LINGERING_ON[m
[31m-            && (r->lingering_close[m
[31m-                || r->header_in->pos < r->header_in->last[m
[31m-                || r->connection->read->ready)))[m
[31m-    {[m
[31m-        ngx_http_set_lingering_close(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_write_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_WRITING_REQUEST_STATE;[m
[31m-[m
[31m-    r->read_event_handler = r->discard_body ?[m
[31m-                                ngx_http_discarded_request_body_handler:[m
[31m-                                ngx_http_test_reading;[m
[31m-    r->write_event_handler = ngx_http_writer;[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wev->ready && wev->delayed) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    if (!wev->delayed) {[m
[31m-        ngx_add_timer(wev, clcf->send_timeout);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_writer(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                        rc;[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                   "http writer handler: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "client timed out");[m
[31m-            c->timedout = 1;[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        wev->timedout = 0;[m
[31m-        wev->delayed = 0;[m
[31m-[m
[31m-        if (!wev->ready) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-                ngx_http_close_request(r, 0);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    if (wev->delayed || r->aio) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                       "http writer delayed");[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, NULL);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http writer output filter: %d, \"%V?%V\"",[m
[31m-                   rc, &r->uri, &r->args);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered || r->postponed || (r == r->main && c->buffered)) {[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                   "http writer done: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_request_finalizer(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http finalizer done: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_block_reading(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http reading blocked");[m
[31m-[m
[31m-    /* aio does not call this handler */[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT)[m
[31m-        && r->connection->read->active)[m
[31m-    {[m
[31m-        if (ngx_del_event(r->connection->read, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_test_reading(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http test reading");[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-[m
[31m-    if (r->stream) {[m
[31m-        if (c->error) {[m
[31m-            err = 0;[m
[31m-            goto closed;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!rev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-        err = rev->kq_errno;[m
[31m-[m
[31m-        goto closed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && rev->pending_eof) {[m
[31m-        socklen_t  len;[m
[31m-[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        err = 0;[m
[31m-        len = sizeof(ngx_err_t);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        goto closed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-        err = 0;[m
[31m-[m
[31m-        goto closed;[m
[31m-[m
[31m-    } else if (n == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err != NGX_EAGAIN) {[m
[31m-            rev->eof = 1;[m
[31m-            c->error = 1;[m
[31m-[m
[31m-            goto closed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* aio does not call this handler */[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && rev->active) {[m
[31m-[m
[31m-        if (ngx_del_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-closed:[m
[31m-[m
[31m-    if (err) {[m
[31m-        rev->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_set_keepalive(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  i;[m
[31m-    ngx_buf_t                 *b, *f;[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler");[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-        r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);[m
[31m-        ngx_add_timer(rev, clcf->lingering_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "closing request";[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-    b = r->header_in;[m
[31m-[m
[31m-    if (b->pos < b->last) {[m
[31m-[m
[31m-        /* the pipelined request */[m
[31m-[m
[31m-        if (b != c->buffer) {[m
[31m-[m
[31m-            /*[m
[31m-             * If the large header buffers were allocated while the previous[m
[31m-             * request processing then we do not use c->buffer for[m
[31m-             * the pipelined request (see ngx_http_create_request()).[m
[31m-             *[m
[31m-             * Now we would move the large header buffers to the free list.[m
[31m-             */[m
[31m-[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            if (hc->free == NULL) {[m
[31m-                hc->free = ngx_palloc(c->pool,[m
[31m-                  cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));[m
[31m-[m
[31m-                if (hc->free == NULL) {[m
[31m-                    ngx_http_close_request(r, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; i < hc->nbusy - 1; i++) {[m
[31m-                f = hc->busy[i];[m
[31m-                hc->free[hc->nfree++] = f;[m
[31m-                f->pos = f->start;[m
[31m-                f->last = f->start;[m
[31m-            }[m
[31m-[m
[31m-            hc->busy[0] = b;[m
[31m-            hc->nbusy = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* guard against recursive call from ngx_http_finalize_connection() */[m
[31m-    r->keepalive = 0;[m
[31m-[m
[31m-    ngx_http_free_request(r, 0);[m
[31m-[m
[31m-    c->data = hc;[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-    wev->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    if (b->pos < b->last) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "pipelined request");[m
[31m-[m
[31m-        c->log->action = "reading client pipelined request line";[m
[31m-[m
[31m-        r = ngx_http_create_request(c);[m
[31m-        if (r == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->pipeline = 1;[m
[31m-[m
[31m-        c->data = r;[m
[31m-[m
[31m-        c->sent = 0;[m
[31m-        c->destroyed = 0;[m
[31m-[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        rev->handler = ngx_http_process_request_line;[m
[31m-        ngx_post_event(rev, &ngx_posted_events);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * To keep a memory footprint as small as possible for an idle keepalive[m
[31m-     * connection we try to free c->buffer's memory if it was allocated outside[m
[31m-     * the c->pool.  The large header buffers are always allocated outside the[m
[31m-     * c->pool and are freed too.[m
[31m-     */[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-[m
[31m-        /*[m
[31m-         * the special note for ngx_http_keepalive_handler() that[m
[31m-         * c->buffer's memory was freed[m
[31m-         */[m
[31m-[m
[31m-        b->pos = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc free: %p %i",[m
[31m-                   hc->free, hc->nfree);[m
[31m-[m
[31m-    if (hc->free) {[m
[31m-        for (i = 0; i < hc->nfree; i++) {[m
[31m-            ngx_pfree(c->pool, hc->free[i]->start);[m
[31m-            hc->free[i] = NULL;[m
[31m-        }[m
[31m-[m
[31m-        hc->nfree = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc busy: %p %i",[m
[31m-                   hc->busy, hc->nbusy);[m
[31m-[m
[31m-    if (hc->busy) {[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            ngx_pfree(c->pool, hc->busy[i]->start);[m
[31m-            hc->busy[i] = NULL;[m
[31m-        }[m
[31m-[m
[31m-        hc->nbusy = 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        ngx_ssl_free_buffer(c);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rev->handler = ngx_http_keepalive_handler;[m
[31m-[m
[31m-    if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "keepalive";[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == -1) {[m
[31m-            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-        tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;[m
[31m-[m
[31m-    } else {[m
[31m-        tcp_nodelay = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (tcp_nodelay[m
[31m-        && clcf->tcp_nodelay[m
[31m-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-            == -1)[m
[31m-        {[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris returns EINVAL if a socket has been shut down */[m
[31m-            c->log_error = NGX_ERROR_IGNORE_EINVAL;[m
[31m-#endif[m
[31m-[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-[m
[31m-            c->log_error = NGX_ERROR_INFO;[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    /* if ngx_http_request_t was freed then we need some other place */[m
[31m-    r->http_state = NGX_HTTP_KEEPALIVE_STATE;[m
[31m-#endif[m
[31m-[m
[31m-    c->idle = 1;[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    ngx_add_timer(rev, clcf->keepalive_timeout);[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_post_event(rev, &ngx_posted_events);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_keepalive_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ssize_t            n;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http keepalive handler");[m
[31m-[m
[31m-    if (rev->timedout || c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        if (rev->pending_eof) {[m
[31m-            c->log->handler = NULL;[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,[m
[31m-                          "kevent() reported that client %V closed "[m
[31m-                          "keepalive connection", &c->addr_text);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl) {[m
[31m-                c->ssl->no_send_shutdown = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-    size = b->end - b->start;[m
[31m-[m
[31m-    if (b->pos == NULL) {[m
[31m-[m
[31m-        /*[m
[31m-         * The c->buffer's memory was freed by ngx_http_set_keepalive().[m
[31m-         * However, the c->buffer->start and c->buffer->end were not changed[m
[31m-         * to keep the buffer size.[m
[31m-         */[m
[31m-[m
[31m-        b->pos = ngx_palloc(c->pool, size);[m
[31m-        if (b->pos == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->start = b->pos;[m
[31m-        b->last = b->pos;[m
[31m-        b->end = b->pos + size;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * MSIE closes a keepalive connection with RST flag[m
[31m-     * so we ignore ECONNRESET here.[m
[31m-     */[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_IGNORE_ECONNRESET;[m
[31m-    ngx_set_socket_errno(0);[m
[31m-[m
[31m-    n = c->recv(c, b->last, size);[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * Like ngx_http_set_keepalive() we are trying to not hold[m
[31m-         * c->buffer's memory for a keepalive connection.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-[m
[31m-            /*[m
[31m-             * the special note that c->buffer's memory was freed[m
[31m-             */[m
[31m-[m
[31m-            b->pos = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->handler = NULL;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno,[m
[31m-                      "client %V closed keepalive connection", &c->addr_text);[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    c->log->handler = ngx_http_log_error;[m
[31m-    c->log->action = "reading client request line";[m
[31m-[m
[31m-    c->idle = 0;[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    c->data = ngx_http_create_request(c);[m
[31m-    if (c->data == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->sent = 0;[m
[31m-    c->destroyed = 0;[m
[31m-[m
[31m-    ngx_del_timer(rev);[m
[31m-[m
[31m-    rev->handler = ngx_http_process_request_line;[m
[31m-    ngx_http_process_request_line(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_set_lingering_close(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    rev->handler = ngx_http_lingering_close_handler;[m
[31m-[m
[31m-    r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);[m
[31m-    ngx_add_timer(rev, clcf->lingering_timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-    wev->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {[m
[31m-        ngx_connection_error(c, ngx_socket_errno,[m
[31m-                             ngx_shutdown_socket_n " failed");[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_http_lingering_close_handler(rev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lingering_close_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_msec_t                 timer;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    u_char                     buffer[NGX_HTTP_LINGERING_BUFFER_SIZE];[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lingering close handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();[m
[31m-    if ((ngx_msec_int_t) timer <= 0) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    do {[m
[31m-        n = c->recv(c, buffer, NGX_HTTP_LINGERING_BUFFER_SIZE);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "lingering read: %z", n);[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } while (rev->ready);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    timer *= 1000;[m
[31m-[m
[31m-    if (timer > clcf->lingering_timeout) {[m
[31m-        timer = clcf->lingering_timeout;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(rev, timer);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_empty_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http empty handler");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_request_empty_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http request empty handler");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_special(ngx_http_request_t *r, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_LAST) {[m
[31m-[m
[31m-        if (r == r->main && !r->post_action) {[m
[31m-            b->last_buf = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            b->sync = 1;[m
[31m-            b->last_in_chain = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_FLUSH) {[m
[31m-        b->flush = 1;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_post_action(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->post_action.data == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->post_action && r->uri_changes == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post action: \"%V\"", &clcf->post_action);[m
[31m-[m
[31m-    r->main->count--;[m
[31m-[m
[31m-    r->http_version = NGX_HTTP_VERSION_9;[m
[31m-    r->header_only = 1;[m
[31m-    r->post_action = 1;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    if (clcf->post_action.data[0] == '/') {[m
[31m-        ngx_http_internal_redirect(r, &clcf->post_action, NULL);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_http_named_location(r, &clcf->post_action);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r = r->main;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http request count:%d blk:%d", r->count, r->blocked);[m
[31m-[m
[31m-    if (r->count == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http request count is zero");[m
[31m-    }[m
[31m-[m
[31m-    r->count--;[m
[31m-[m
[31m-    if (r->count || r->blocked) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_v2_close_stream(r->stream, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_free_request(r, rc);[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_pool_t                *pool;[m
[31m-    struct linger              linger;[m
[31m-    ngx_http_cleanup_t        *cln;[m
[31m-    ngx_http_log_ctx_t        *ctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http close request");[m
[31m-[m
[31m-    if (r->pool == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "http request already closed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln = r->cleanup;[m
[31m-    r->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-    if (r->stat_reading) {[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_reading, -1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->stat_writing) {[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_writing, -1);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (rc > 0 && (r->headers_out.status == 0 || r->connection->sent == 0)) {[m
[31m-        r->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    log->action = "logging request";[m
[31m-[m
[31m-    ngx_http_log_request(r);[m
[31m-[m
[31m-    log->action = "closing request";[m
[31m-[m
[31m-    if (r->connection->timedout) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->reset_timedout_connection) {[m
[31m-            linger.l_onoff = 1;[m
[31m-            linger.l_linger = 0;[m
[31m-[m
[31m-            if (setsockopt(r->connection->fd, SOL_SOCKET, SO_LINGER,[m
[31m-                           (const void *) &linger, sizeof(struct linger)) == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_LINGER) failed");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the various request strings were allocated from r->pool */[m
[31m-    ctx = log->data;[m
[31m-    ctx->request = NULL;[m
[31m-[m
[31m-    r->request_line.len = 0;[m
[31m-[m
[31m-    r->connection->destroyed = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * Setting r->pool to NULL will increase probability to catch double close[m
[31m-     * of request since the request object is allocated from its own pool.[m
[31m-     */[m
[31m-[m
[31m-    pool = r->pool;[m
[31m-    r->pool = NULL;[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_handler_pt        *log_handler;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    log_handler = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.elts;[m
[31m-    n = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.nelts;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        log_handler[i](r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "close http connection: %d", c->fd);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_http_close_connection;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_http_request_t  *r;[m
[31m-    ngx_http_log_ctx_t  *ctx;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    ctx = log->data;[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", client: %V", &ctx->connection->addr_text);[m
[31m-    len -= p - buf;[m
[31m-[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    if (r) {[m
[31m-        return r->log_handler(r, ctx->current_request, p, len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_snprintf(p, len, ", server: %V",[m
[31m-                         &ctx->connection->listening->addr_text);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_error_handler(ngx_http_request_t *r, ngx_http_request_t *sr,[m
[31m-    u_char *buf, size_t len)[m
[31m-{[m
[31m-    char                      *uri_separator;[m
[31m-    u_char                    *p;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", server: %V", &cscf->server_name);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (r->request_line.data == NULL && r->request_start) {[m
[31m-        for (p = r->request_start; p < r->header_in->last; p++) {[m
[31m-            if (*p == CR || *p == LF) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        r->request_line.len = p - r->request_start;[m
[31m-        r->request_line.data = r->request_start;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_line.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", request: \"%V\"", &r->request_line);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r != sr) {[m
[31m-        p = ngx_snprintf(buf, len, ", subrequest: \"%V\"", &sr->uri);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    u = sr->upstream;[m
[31m-[m
[31m-    if (u && u->peer.name) {[m
[31m-[m
[31m-        uri_separator = "";[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        if (u->peer.sockaddr && u->peer.sockaddr->sa_family == AF_UNIX) {[m
[31m-            uri_separator = ":";[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        p = ngx_snprintf(buf, len, ", upstream: \"%V%V%s%V\"",[m
[31m-                         &u->schema, u->peer.name,[m
[31m-                         uri_separator, &u->uri);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.host) {[m
[31m-        p = ngx_snprintf(buf, len, ", host: \"%V\"",[m
[31m-                         &r->headers_in.host->value);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.referer) {[m
[31m-        p = ngx_snprintf(buf, len, ", referrer: \"%V\"",[m
[31m-                         &r->headers_in.referer->value);[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.c.orig[m
[1mdeleted file mode 100644[m
[1mindex e958e94..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,3666 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_wait_request_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_process_request_line(ngx_event_t *rev);[m
[31m-static void ngx_http_process_request_headers(ngx_event_t *rev);[m
[31m-static ssize_t ngx_http_read_request_header(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,[m
[31m-    ngx_uint_t request_line);[m
[31m-[m
[31m-static ngx_int_t ngx_http_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_unique_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_host(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_connection(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_process_user_agent(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-static ngx_int_t ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool,[m
[31m-    ngx_uint_t alloc);[m
[31m-static ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r,[m
[31m-    ngx_str_t *host);[m
[31m-static ngx_int_t ngx_http_find_virtual_server(ngx_connection_t *c,[m
[31m-    ngx_http_virtual_names_t *virtual_names, ngx_str_t *host,[m
[31m-    ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp);[m
[31m-[m
[31m-static void ngx_http_request_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-static void ngx_http_terminate_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_finalize_connection(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_set_write_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_writer(ngx_http_request_t *r);[m
[31m-static void ngx_http_request_finalizer(ngx_http_request_t *r);[m
[31m-[m
[31m-static void ngx_http_set_keepalive(ngx_http_request_t *r);[m
[31m-static void ngx_http_keepalive_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_set_lingering_close(ngx_http_request_t *r);[m
[31m-static void ngx_http_lingering_close_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_http_post_action(ngx_http_request_t *r);[m
[31m-static void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error);[m
[31m-static void ngx_http_log_request(ngx_http_request_t *r);[m
[31m-[m
[31m-static u_char *ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-static u_char *ngx_http_log_error_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_request_t *sr, u_char *buf, size_t len);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static void ngx_http_ssl_handshake(ngx_event_t *rev);[m
[31m-static void ngx_http_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *ngx_http_client_errors[] = {[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_METHOD */[m
[31m-    "client sent invalid method",[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_REQUEST */[m
[31m-    "client sent invalid request",[m
[31m-[m
[31m-    /* NGX_HTTP_PARSE_INVALID_09_METHOD */[m
[31m-    "client sent invalid method in HTTP/0.9 request"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_header_t  ngx_http_headers_in[] = {[m
[31m-    { ngx_string("Host"), offsetof(ngx_http_headers_in_t, host),[m
[31m-                 ngx_http_process_host },[m
[31m-[m
[31m-    { ngx_string("Connection"), offsetof(ngx_http_headers_in_t, connection),[m
[31m-                 ngx_http_process_connection },[m
[31m-[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_modified_since),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Unmodified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_unmodified_since),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_match),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("If-None-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_none_match),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("User-Agent"), offsetof(ngx_http_headers_in_t, user_agent),[m
[31m-                 ngx_http_process_user_agent },[m
[31m-[m
[31m-    { ngx_string("Referer"), offsetof(ngx_http_headers_in_t, referer),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_length),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_type),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Range"), offsetof(ngx_http_headers_in_t, range),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("If-Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_range),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, transfer_encoding),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Expect"),[m
[31m-                 offsetof(ngx_http_headers_in_t, expect),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Upgrade"),[m
[31m-                 offsetof(ngx_http_headers_in_t, upgrade),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Accept-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_encoding),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Via"), offsetof(ngx_http_headers_in_t, via),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Authorization"),[m
[31m-                 offsetof(ngx_http_headers_in_t, authorization),[m
[31m-                 ngx_http_process_unique_header_line },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"), offsetof(ngx_http_headers_in_t, keep_alive),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("X-Forwarded-For"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_forwarded_for),[m
[31m-                 ngx_http_process_multi_header_lines },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    { ngx_string("X-Real-IP"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_real_ip),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_HEADERS)[m
[31m-    { ngx_string("Accept"), offsetof(ngx_http_headers_in_t, accept),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Accept-Language"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_language),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    { ngx_string("Depth"), offsetof(ngx_http_headers_in_t, depth),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Overwrite"), offsetof(ngx_http_headers_in_t, overwrite),[m
[31m-                 ngx_http_process_header_line },[m
[31m-[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date),[m
[31m-                 ngx_http_process_header_line },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Cookie"), offsetof(ngx_http_headers_in_t, cookies),[m
[31m-                 ngx_http_process_multi_header_lines },[m
[31m-[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_init_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_uint_t              i;[m
[31m-    ngx_event_t            *rev;[m
[31m-    struct sockaddr_in     *sin;[m
[31m-    ngx_http_port_t        *port;[m
[31m-    ngx_http_in_addr_t     *addr;[m
[31m-    ngx_http_log_ctx_t     *ctx;[m
[31m-    ngx_http_connection_t  *hc;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6    *sin6;[m
[31m-    ngx_http_in6_addr_t    *addr6;[m
[31m-#endif[m
[31m-[m
[31m-    hc = ngx_pcalloc(c->pool, sizeof(ngx_http_connection_t));[m
[31m-    if (hc == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->data = hc;[m
[31m-[m
[31m-    /* find the server configuration for the address:port */[m
[31m-[m
[31m-    port = c->listening->servers;[m
[31m-[m
[31m-    if (port->naddrs > 1) {[m
[31m-[m
[31m-        /*[m
[31m-         * there are several addresses on this port and one of them[m
[31m-         * is an "*:port" wildcard so getsockname() in ngx_http_server_addr()[m
[31m-         * is required to determine a server address[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-[m
[31m-            addr6 = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hc->addr_conf = &addr6[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-[m
[31m-            addr = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (addr[i].addr == sin->sin_addr.s_addr) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hc->addr_conf = &addr[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            addr6 = port->addrs;[m
[31m-            hc->addr_conf = &addr6[0].conf;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            addr = port->addrs;[m
[31m-            hc->addr_conf = &addr[0].conf;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the default server configuration for the address:port */[m
[31m-    hc->conf_ctx = hc->addr_conf->default_server->ctx;[m
[31m-[m
[31m-    ctx = ngx_palloc(c->pool, sizeof(ngx_http_log_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->connection = c;[m
[31m-    ctx->request = NULL;[m
[31m-    ctx->current_request = NULL;[m
[31m-[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->handler = ngx_http_log_error;[m
[31m-    c->log->data = ctx;[m
[31m-    c->log->action = "waiting for request";[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    rev->handler = ngx_http_wait_request_handler;[m
[31m-    c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (hc->addr_conf->http2) {[m
[31m-        rev->handler = ngx_http_v2_init;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    {[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-    if (sscf->enable || hc->addr_conf->ssl) {[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (hc->addr_conf->ssl && sscf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined "[m
[31m-                          "in server listening on SSL port");[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        hc->ssl = 1;[m
[31m-[m
[31m-        rev->handler = ngx_http_ssl_handshake;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (hc->addr_conf->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 1;[m
[31m-        c->log->action = "reading PROXY protocol";[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        /* the deferred accept(), iocp */[m
[31m-[m
[31m-        if (ngx_use_accept_mutex) {[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rev->handler(rev);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_wait_request_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http wait request handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    hc = c->data;[m
[31m-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    size = cscf->client_header_buffer_size;[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (b == NULL) {[m
[31m-        b = ngx_create_temp_buf(c->pool, size);[m
[31m-        if (b == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->buffer = b;[m
[31m-[m
[31m-    } else if (b->start == NULL) {[m
[31m-[m
[31m-        b->start = ngx_palloc(c->pool, size);[m
[31m-        if (b->start == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-        b->end = b->last + size;[m
[31m-    }[m
[31m-[m
[31m-    n = c->recv(c, b->last, size);[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!rev->timer_set) {[m
[31m-            ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-            ngx_reusable_connection(c, 1);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * We are trying to not hold c->buffer's memory for an idle connection.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-            b->start = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client closed connection");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    if (hc->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 0;[m
[31m-[m
[31m-        p = ngx_proxy_protocol_read(c, b->pos, b->last);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = p;[m
[31m-[m
[31m-        if (b->pos == b->last) {[m
[31m-            c->log->action = "waiting for request";[m
[31m-            b->pos = b->start;[m
[31m-            b->last = b->start;[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "reading client request line";[m
[31m-[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    c->data = ngx_http_create_request(c);[m
[31m-    if (c->data == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rev->handler = ngx_http_process_request_line;[m
[31m-    ngx_http_process_request_line(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *[m
[31m-ngx_http_create_request(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t                 *pool;[m
[31m-    ngx_time_t                 *tp;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_log_ctx_t         *ctx;[m
[31m-    ngx_http_connection_t      *hc;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_loc_conf_t   *clcf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    c->requests++;[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    pool = ngx_create_pool(cscf->request_pool_size, c->log);[m
[31m-    if (pool == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_pcalloc(pool, sizeof(ngx_http_request_t));[m
[31m-    if (r == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->pool = pool;[m
[31m-[m
[31m-    r->http_connection = hc;[m
[31m-    r->signature = NGX_HTTP_MODULE;[m
[31m-    r->connection = c;[m
[31m-[m
[31m-    r->main_conf = hc->conf_ctx->main_conf;[m
[31m-    r->srv_conf = hc->conf_ctx->srv_conf;[m
[31m-    r->loc_conf = hc->conf_ctx->loc_conf;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-    r->header_in = hc->nbusy ? hc->busy[0] : c->buffer;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (r->ctx == NULL) {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    r->variables = ngx_pcalloc(r->pool, cmcf->variables.nelts[m
[31m-                                        * sizeof(ngx_http_variable_value_t));[m
[31m-    if (r->variables == NULL) {[m
[31m-        ngx_destroy_pool(r->pool);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        r->main_filter_need_in_memory = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->main = r;[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    r->start_sec = tp->sec;[m
[31m-    r->start_msec = tp->msec;[m
[31m-[m
[31m-    r->method = NGX_HTTP_UNKNOWN;[m
[31m-    r->http_version = NGX_HTTP_VERSION_10;[m
[31m-[m
[31m-    r->headers_in.content_length_n = -1;[m
[31m-    r->headers_in.keep_alive_n = -1;[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-    r->headers_out.last_modified_time = -1;[m
[31m-[m
[31m-    r->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    r->subrequests = NGX_HTTP_MAX_SUBREQUESTS + 1;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_READING_REQUEST_STATE;[m
[31m-[m
[31m-    ctx = c->log->data;[m
[31m-    ctx->request = r;[m
[31m-    ctx->current_request = r;[m
[31m-    r->log_handler = ngx_http_log_error_handler;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_reading, 1);[m
[31m-    r->stat_reading = 1;[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_requests, 1);[m
[31m-#endif[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssl_handshake(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                   *p, buf[NGX_PROXY_PROTOCOL_MAX_HEADER + 1];[m
[31m-    size_t                    size;[m
[31m-    ssize_t                   n;[m
[31m-    ngx_err_t                 err;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_connection_t         *c;[m
[31m-    ngx_http_connection_t    *hc;[m
[31m-    ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http check ssl handshake");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    size = hc->proxy_protocol ? sizeof(buf) : 1;[m
[31m-[m
[31m-    n = recv(c->fd, (char *) buf, size, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http recv(): %z", n);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            rev->ready = 0;[m
[31m-[m
[31m-            if (!rev->timer_set) {[m
[31m-                ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-                ngx_reusable_connection(c, 1);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_http_close_connection(c);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_connection_error(c, err, "recv() failed");[m
[31m-        ngx_http_close_connection(c);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (hc->proxy_protocol) {[m
[31m-        hc->proxy_protocol = 0;[m
[31m-[m
[31m-        p = ngx_proxy_protocol_read(c, buf, buf + n);[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        size = p - buf;[m
[31m-[m
[31m-        if (c->recv(c, buf, size) != (ssize_t) size) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (n == (ssize_t) size) {[m
[31m-            ngx_post_event(rev, &ngx_posted_events);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        n = 1;[m
[31m-        buf[0] = *p;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        if (buf[0] & 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                           "https ssl handshake: 0x%02Xd", buf[0]);[m
[31m-[m
[31m-            sscf = ngx_http_get_module_srv_conf(hc->conf_ctx,[m
[31m-                                                ngx_http_ssl_module);[m
[31m-[m
[31m-            if (ngx_ssl_create_connection(&sscf->ssl, c, NGX_SSL_BUFFER)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                if (!rev->timer_set) {[m
[31m-                    ngx_add_timer(rev, c->listening->post_accept_timeout);[m
[31m-                }[m
[31m-[m
[31m-                ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-                c->ssl->handler = ngx_http_ssl_handshake_handler;[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_ssl_handshake_handler(c);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "plain http");[m
[31m-[m
[31m-        c->log->action = "waiting for request";[m
[31m-[m
[31m-        rev->handler = ngx_http_wait_request_handler;[m
[31m-        ngx_http_wait_request_handler(rev);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, "client closed connection");[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        /*[m
[31m-         * The majority of browsers do not send the "close notify" alert.[m
[31m-         * Among them are MSIE, old Mozilla, Netscape 4, Konqueror,[m
[31m-         * and Links.  And what is more, MSIE ignores the server's alert.[m
[31m-         *[m
[31m-         * Opera and recent Mozilla send the alert.[m
[31m-         */[m
[31m-[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_V2                                                              \[m
[31m-     && (defined TLSEXT_TYPE_application_layer_protocol_negotiation           \[m
[31m-         || defined TLSEXT_TYPE_next_proto_neg))[m
[31m-        {[m
[31m-        unsigned int            len;[m
[31m-        const unsigned char    *data;[m
[31m-        ngx_http_connection_t  *hc;[m
[31m-[m
[31m-        hc = c->data;[m
[31m-[m
[31m-        if (hc->addr_conf->http2) {[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation[m
[31m-            SSL_get0_alpn_selected(c->ssl->connection, &data, &len);[m
[31m-[m
[31m-#ifdef TLSEXT_TYPE_next_proto_neg[m
[31m-            if (len == 0) {[m
[31m-                SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#else /* TLSEXT_TYPE_next_proto_neg */[m
[31m-            SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);[m
[31m-#endif[m
[31m-[m
[31m-            if (len == 2 && data[0] == 'h' && data[1] == '2') {[m
[31m-                ngx_http_v2_init(c->read);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        c->log->action = "waiting for request";[m
[31m-[m
[31m-        c->read->handler = ngx_http_wait_request_handler;[m
[31m-        /* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-        ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-        ngx_http_wait_request_handler(c->read);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-int[m
[31m-ngx_http_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg)[m
[31m-{[m
[31m-    ngx_str_t                  host;[m
[31m-    const char                *servername;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_ssl_srv_conf_t   *sscf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    servername = SSL_get_servername(ssl_conn, TLSEXT_NAMETYPE_host_name);[m
[31m-[m
[31m-    if (servername == NULL) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    if (c->ssl->renegotiation) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "SSL server name: \"%s\"", servername);[m
[31m-[m
[31m-    host.len = ngx_strlen(servername);[m
[31m-[m
[31m-    if (host.len == 0) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) servername;[m
[31m-[m
[31m-    if (ngx_http_validate_host(&host, c->pool, 1) != NGX_OK) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    if (ngx_http_find_virtual_server(c, hc->addr_conf->virtual_names, &host,[m
[31m-                                     NULL, &cscf)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    hc->ssl_servername = ngx_palloc(c->pool, sizeof(ngx_str_t));[m
[31m-    if (hc->ssl_servername == NULL) {[m
[31m-        return SSL_TLSEXT_ERR_NOACK;[m
[31m-    }[m
[31m-[m
[31m-    *hc->ssl_servername = host;[m
[31m-[m
[31m-    hc->conf_ctx = cscf->ctx;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(c, clcf->error_log);[m
[31m-[m
[31m-    sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-    if (sscf->ssl.ctx) {[m
[31m-        SSL_set_SSL_CTX(ssl_conn, sscf->ssl.ctx);[m
[31m-[m
[31m-        /*[m
[31m-         * SSL_set_SSL_CTX() only changes certs as of 1.0.0d[m
[31m-         * adjust other things we care about[m
[31m-         */[m
[31m-[m
[31m-        SSL_set_verify(ssl_conn, SSL_CTX_get_verify_mode(sscf->ssl.ctx),[m
[31m-                       SSL_CTX_get_verify_callback(sscf->ssl.ctx));[m
[31m-[m
[31m-        SSL_set_verify_depth(ssl_conn, SSL_CTX_get_verify_depth(sscf->ssl.ctx));[m
[31m-[m
[31m-#ifdef SSL_CTRL_CLEAR_OPTIONS[m
[31m-        /* only in 0.9.8m+ */[m
[31m-        SSL_clear_options(ssl_conn, SSL_get_options(ssl_conn) &[m
[31m-                                    ~SSL_CTX_get_options(sscf->ssl.ctx));[m
[31m-#endif[m
[31m-[m
[31m-        SSL_set_options(ssl_conn, SSL_CTX_get_options(sscf->ssl.ctx));[m
[31m-    }[m
[31m-[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_process_request_line(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t              n;[m
[31m-    ngx_int_t            rc, rv;[m
[31m-    ngx_str_t            host;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http process request line");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            n = ngx_http_read_request_header(r);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_parse_request_line(r, r->header_in);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            /* the request line has been parsed successfully */[m
[31m-[m
[31m-            r->request_line.len = r->request_end - r->request_start;[m
[31m-            r->request_line.data = r->request_start;[m
[31m-            r->request_length = r->header_in->pos - r->request_start;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http request line: \"%V\"", &r->request_line);[m
[31m-[m
[31m-            r->method_name.len = r->method_end - r->request_start + 1;[m
[31m-            r->method_name.data = r->request_line.data;[m
[31m-[m
[31m-            if (r->http_protocol.data) {[m
[31m-                r->http_protocol.len = r->request_end - r->http_protocol.data;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_process_request_uri(r) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (r->host_start && r->host_end) {[m
[31m-[m
[31m-                host.len = r->host_end - r->host_start;[m
[31m-                host.data = r->host_start;[m
[31m-[m
[31m-                rc = ngx_http_validate_host(&host, r->pool, 0);[m
[31m-[m
[31m-                if (rc == NGX_DECLINED) {[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                  "client sent invalid host in request line");[m
[31m-                    ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                r->headers_in.server = host;[m
[31m-            }[m
[31m-[m
[31m-            if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-[m
[31m-                if (r->headers_in.server.len == 0[m
[31m-                    && ngx_http_set_virtual_server(r, &r->headers_in.server)[m
[31m-                       == NGX_ERROR)[m
[31m-                {[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_process_request(r);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-            if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                              sizeof(ngx_table_elt_t))[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "reading client request headers";[m
[31m-[m
[31m-            rev->handler = ngx_http_process_request_headers;[m
[31m-            ngx_http_process_request_headers(rev);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_AGAIN) {[m
[31m-[m
[31m-            /* there was error while a request line parsing */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          ngx_http_client_errors[rc - NGX_HTTP_CLIENT_ERROR]);[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_AGAIN: a request line parsing is still incomplete */[m
[31m-[m
[31m-        if (r->header_in->pos == r->header_in->end) {[m
[31m-[m
[31m-            rv = ngx_http_alloc_large_header_buffer(r, 1);[m
[31m-[m
[31m-            if (rv == NGX_ERROR) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (rv == NGX_DECLINED) {[m
[31m-                r->request_line.len = r->header_in->end - r->request_start;[m
[31m-                r->request_line.data = r->request_start;[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client sent too long URI");[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_process_request_uri(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (r->args_start) {[m
[31m-        r->uri.len = r->args_start - 1 - r->uri_start;[m
[31m-    } else {[m
[31m-        r->uri.len = r->uri_end - r->uri_start;[m
[31m-    }[m
[31m-[m
[31m-    if (r->complex_uri || r->quoted_uri) {[m
[31m-[m
[31m-        r->uri.data = ngx_pnalloc(r->pool, r->uri.len + 1);[m
[31m-        if (r->uri.data == NULL) {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (ngx_http_parse_complex_uri(r, cscf->merge_slashes) != NGX_OK) {[m
[31m-            r->uri.len = 0;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid request");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->uri.data = r->uri_start;[m
[31m-    }[m
[31m-[m
[31m-    r->unparsed_uri.len = r->uri_end - r->uri_start;[m
[31m-    r->unparsed_uri.data = r->uri_start;[m
[31m-[m
[31m-    r->valid_unparsed_uri = r->space_in_uri ? 0 : 1;[m
[31m-[m
[31m-    if (r->uri_ext) {[m
[31m-        if (r->args_start) {[m
[31m-            r->exten.len = r->args_start - 1 - r->uri_ext;[m
[31m-        } else {[m
[31m-            r->exten.len = r->uri_end - r->uri_ext;[m
[31m-        }[m
[31m-[m
[31m-        r->exten.data = r->uri_ext;[m
[31m-    }[m
[31m-[m
[31m-    if (r->args_start && r->uri_end > r->args_start) {[m
[31m-        r->args.len = r->uri_end - r->args_start;[m
[31m-        r->args.data = r->args_start;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_WIN32)[m
[31m-    {[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    p = r->uri.data;[m
[31m-    last = r->uri.data + r->uri.len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-[m
[31m-        if (*p++ == ':') {[m
[31m-[m
[31m-            /*[m
[31m-             * this check covers "::$data", "::$index_allocation" and[m
[31m-             * ":$i30:$index_allocation"[m
[31m-             */[m
[31m-[m
[31m-            if (p < last && *p == '$') {[m
[31m-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                              "client sent unsafe win32 URI");[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = r->uri.data + r->uri.len - 1;[m
[31m-[m
[31m-    while (p > r->uri.data) {[m
[31m-[m
[31m-        if (*p == ' ') {[m
[31m-            p--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == '.') {[m
[31m-            p--;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (p != r->uri.data + r->uri.len - 1) {[m
[31m-        r->uri.len = p + 1 - r->uri.data;[m
[31m-        ngx_http_set_exten(r);[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http uri: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http args: \"%V\"", &r->args);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http exten: \"%V\"", &r->exten);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_process_request_headers(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ssize_t                     n;[m
[31m-    ngx_int_t                   rc, rv;[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http process request header line");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rc = NGX_AGAIN;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            if (r->header_in->pos == r->header_in->end) {[m
[31m-[m
[31m-                rv = ngx_http_alloc_large_header_buffer(r, 0);[m
[31m-[m
[31m-                if (rv == NGX_ERROR) {[m
[31m-                    ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (rv == NGX_DECLINED) {[m
[31m-                    p = r->header_name_start;[m
[31m-[m
[31m-                    r->lingering_close = 1;[m
[31m-[m
[31m-                    if (p == NULL) {[m
[31m-                        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                      "client sent too large request");[m
[31m-                        ngx_http_finalize_request(r,[m
[31m-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    len = r->header_in->end - p;[m
[31m-[m
[31m-                    if (len > NGX_MAX_ERROR_STR - 300) {[m
[31m-                        len = NGX_MAX_ERROR_STR - 300;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                "client sent too long header line: \"%*s...\"",[m
[31m-                                len, r->header_name_start);[m
[31m-[m
[31m-                    ngx_http_finalize_request(r,[m
[31m-                                            NGX_HTTP_REQUEST_HEADER_TOO_LARGE);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_http_read_request_header(r);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* the host header could change the server configuration context */[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        rc = ngx_http_parse_header_line(r, r->header_in,[m
[31m-                                        cscf->underscores_in_headers);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-            r->request_length += r->header_in->pos - r->header_name_start;[m
[31m-[m
[31m-            if (r->invalid_header && cscf->ignore_invalid_headers) {[m
[31m-[m
[31m-                /* there was error while a header line parsing */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client sent invalid header line: \"%*s\"",[m
[31m-                              r->header_end - r->header_name_start,[m
[31m-                              r->header_name_start);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* a header line has been parsed successfully */[m
[31m-[m
[31m-            h = ngx_list_push(&r->headers_in.headers);[m
[31m-            if (h == NULL) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            h->hash = r->header_hash;[m
[31m-[m
[31m-            h->key.len = r->header_name_end - r->header_name_start;[m
[31m-            h->key.data = r->header_name_start;[m
[31m-            h->key.data[h->key.len] = '\0';[m
[31m-[m
[31m-            h->value.len = r->header_end - r->header_start;[m
[31m-            h->value.data = r->header_start;[m
[31m-            h->value.data[h->value.len] = '\0';[m
[31m-[m
[31m-            h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-            if (h->lowcase_key == NULL) {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (h->key.len == r->lowcase_index) {[m
[31m-                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                               h->lowcase_key, h->key.len);[m
[31m-[m
[31m-            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_probe_read_req_header_done(r, h);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http header: \"%V: %V\"",[m
[31m-                           &h->key, &h->value);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {[m
[31m-[m
[31m-            /* a whole header has been parsed successfully */[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http header done");[m
[31m-[m
[31m-            r->request_length += r->header_in->pos - r->header_name_start;[m
[31m-[m
[31m-            r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;[m
[31m-[m
[31m-            rc = ngx_http_process_request_header(r);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_process_request(r);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            /* a header line parsing is still not complete */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_HTTP_PARSE_INVALID_HEADER */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent invalid header line");[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_http_read_request_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    n = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        n = c->recv(c, r->header_in->last,[m
[31m-                    r->header_in->end - r->header_in->last);[m
[31m-    } else {[m
[31m-        n = NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (!rev->timer_set) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(rev, cscf->client_header_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client prematurely closed connection");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0 || n == NGX_ERROR) {[m
[31m-        c->error = 1;[m
[31m-        c->log->action = "reading client request headers";[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->header_in->last += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,[m
[31m-    ngx_uint_t request_line)[m
[31m-{[m
[31m-    u_char                    *old, *new;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http alloc large header buffer");[m
[31m-[m
[31m-    if (request_line && r->state == 0) {[m
[31m-[m
[31m-        /* the client fills up the buffer with "\r\n" */[m
[31m-[m
[31m-        r->header_in->pos = r->header_in->start;[m
[31m-        r->header_in->last = r->header_in->start;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    old = request_line ? r->request_start : r->header_name_start;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->state != 0[m
[31m-        && (size_t) (r->header_in->pos - old)[m
[31m-                                     >= cscf->large_client_header_buffers.size)[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-[m
[31m-    if (hc->nfree) {[m
[31m-        b = hc->free[--hc->nfree];[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http large header free: %p %uz",[m
[31m-                       b->pos, b->end - b->last);[m
[31m-[m
[31m-    } else if (hc->nbusy < cscf->large_client_header_buffers.num) {[m
[31m-[m
[31m-        if (hc->busy == NULL) {[m
[31m-            hc->busy = ngx_palloc(r->connection->pool,[m
[31m-                  cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));[m
[31m-            if (hc->busy == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->connection->pool,[m
[31m-                                cscf->large_client_header_buffers.size);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http large header alloc: %p %uz",[m
[31m-                       b->pos, b->end - b->last);[m
[31m-[m
[31m-    } else {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hc->busy[hc->nbusy++] = b;[m
[31m-[m
[31m-    if (r->state == 0) {[m
[31m-        /*[m
[31m-         * r->state == 0 means that a header line was parsed successfully[m
[31m-         * and we do not need to copy incomplete header line and[m
[31m-         * to relocate the parser header pointers[m
[31m-         */[m
[31m-[m
[31m-        r->header_in = b;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http large header copy: %uz", r->header_in->pos - old);[m
[31m-[m
[31m-    new = b->start;[m
[31m-[m
[31m-    ngx_memcpy(new, old, r->header_in->pos - old);[m
[31m-[m
[31m-    b->pos = new + (r->header_in->pos - old);[m
[31m-    b->last = new + (r->header_in->pos - old);[m
[31m-[m
[31m-    if (request_line) {[m
[31m-        r->request_start = new;[m
[31m-[m
[31m-        if (r->request_end) {[m
[31m-            r->request_end = new + (r->request_end - old);[m
[31m-        }[m
[31m-[m
[31m-        r->method_end = new + (r->method_end - old);[m
[31m-[m
[31m-        r->uri_start = new + (r->uri_start - old);[m
[31m-        r->uri_end = new + (r->uri_end - old);[m
[31m-[m
[31m-        if (r->schema_start) {[m
[31m-            r->schema_start = new + (r->schema_start - old);[m
[31m-            r->schema_end = new + (r->schema_end - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->host_start) {[m
[31m-            r->host_start = new + (r->host_start - old);[m
[31m-            if (r->host_end) {[m
[31m-                r->host_end = new + (r->host_end - old);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (r->port_start) {[m
[31m-            r->port_start = new + (r->port_start - old);[m
[31m-            r->port_end = new + (r->port_end - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->uri_ext) {[m
[31m-            r->uri_ext = new + (r->uri_ext - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->args_start) {[m
[31m-            r->args_start = new + (r->args_start - old);[m
[31m-        }[m
[31m-[m
[31m-        if (r->http_protocol.data) {[m
[31m-            r->http_protocol.data = new + (r->http_protocol.data - old);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->header_name_start = new;[m
[31m-        r->header_name_end = new + (r->header_name_end - old);[m
[31m-        r->header_start = new + (r->header_start - old);[m
[31m-        r->header_end = new + (r->header_end - old);[m
[31m-    }[m
[31m-[m
[31m-    r->header_in = b;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_unique_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                  "client sent duplicate header line: \"%V: %V\", "[m
[31m-                  "previous value: \"%V: %V\"",[m
[31m-                  &h->key, &h->value, &(*ph)->key, &(*ph)->value);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_host(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_str_t  host;[m
[31m-[m
[31m-    if (r->headers_in.host == NULL) {[m
[31m-        r->headers_in.host = h;[m
[31m-    }[m
[31m-[m
[31m-    host = h->value;[m
[31m-[m
[31m-    rc = ngx_http_validate_host(&host, r->pool, 0);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent invalid host header");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.server.len) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.server = host;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    if (ngx_strcasestrn(h->value.data, "close", 5 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-[m
[31m-    } else if (ngx_strcasestrn(h->value.data, "keep-alive", 10 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_user_agent(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *user_agent, *msie;[m
[31m-[m
[31m-    if (r->headers_in.user_agent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.user_agent = h;[m
[31m-[m
[31m-    /* check some widespread browsers while the header is in CPU cache */[m
[31m-[m
[31m-    user_agent = h->value.data;[m
[31m-[m
[31m-    msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1);[m
[31m-[m
[31m-    if (msie && msie + 7 < user_agent + h->value.len) {[m
[31m-[m
[31m-        r->headers_in.msie = 1;[m
[31m-[m
[31m-        if (msie[6] == '.') {[m
[31m-[m
[31m-            switch (msie[5]) {[m
[31m-            case '4':[m
[31m-            case '5':[m
[31m-                r->headers_in.msie6 = 1;[m
[31m-                break;[m
[31m-            case '6':[m
[31m-                if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) {[m
[31m-                    r->headers_in.msie6 = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        /* MSIE ignores the SSL "close notify" alert */[m
[31m-        if (c->ssl) {[m
[31m-            c->ssl->no_send_shutdown = 1;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstrn(user_agent, "Opera", 5 - 1)) {[m
[31m-        r->headers_in.opera = 1;[m
[31m-        r->headers_in.msie = 0;[m
[31m-        r->headers_in.msie6 = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->headers_in.msie && !r->headers_in.opera) {[m
[31m-[m
[31m-        if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {[m
[31m-            r->headers_in.gecko = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {[m
[31m-            r->headers_in.chrome = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)[m
[31m-                   && ngx_strstrn(user_agent, "Mac OS X", 8 - 1))[m
[31m-        {[m
[31m-            r->headers_in.safari = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {[m
[31m-            r->headers_in.konqueror = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_process_multi_header_lines(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t       *headers;[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    headers = (ngx_array_t *) ((char *) &r->headers_in + offset);[m
[31m-[m
[31m-    if (headers->elts == NULL) {[m
[31m-        if (ngx_array_init(headers, r->pool, 1, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(headers);[m
[31m-    if (ph == NULL) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_process_request_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->headers_in.server.len == 0[m
[31m-        && ngx_http_set_virtual_server(r, &r->headers_in.server)[m
[31m-           == NGX_ERROR)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.host == NULL && r->http_version > NGX_HTTP_VERSION_10) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                   "client sent HTTP/1.1 request without \"Host\" header");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length_n =[m
[31m-                            ngx_atoof(r->headers_in.content_length->value.data,[m
[31m-                                      r->headers_in.content_length->value.len);[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid \"Content-Length\" header");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_TRACE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent TRACE method");[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.transfer_encoding) {[m
[31m-        if (r->headers_in.transfer_encoding->value.len == 7[m
[31m-            && ngx_strncasecmp(r->headers_in.transfer_encoding->value.data,[m
[31m-                               (u_char *) "chunked", 7) == 0)[m
[31m-        {[m
[31m-            r->headers_in.content_length = NULL;[m
[31m-            r->headers_in.content_length_n = -1;[m
[31m-            r->headers_in.chunked = 1;[m
[31m-[m
[31m-        } else if (r->headers_in.transfer_encoding->value.len != 8[m
[31m-            || ngx_strncasecmp(r->headers_in.transfer_encoding->value.data,[m
[31m-                               (u_char *) "identity", 8) != 0)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent unknown \"Transfer-Encoding\": \"%V\"",[m
[31m-                          &r->headers_in.transfer_encoding->value);[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_NOT_IMPLEMENTED);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.connection_type == NGX_HTTP_CONNECTION_KEEP_ALIVE) {[m
[31m-        if (r->headers_in.keep_alive) {[m
[31m-            r->headers_in.keep_alive_n =[m
[31m-                            ngx_atotm(r->headers_in.keep_alive->value.data,[m
[31m-                                      r->headers_in.keep_alive->value.len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_process_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->http_connection->ssl) {[m
[31m-        long                      rc;[m
[31m-        X509                     *cert;[m
[31m-        ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-        if (c->ssl == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "client sent plain HTTP request to HTTPS port");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module);[m
[31m-[m
[31m-        if (sscf->verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK[m
[31m-                && (sscf->verify != 3 || !ngx_ssl_verify_error_optional(rc)))[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-[m
[31m-                ngx_ssl_remove_cached_session(sscf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-                ngx_http_finalize_request(r, NGX_HTTPS_CERT_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (sscf->verify == 1) {[m
[31m-                cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-                if (cert == NULL) {[m
[31m-                    ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                                  "client sent no required SSL certificate");[m
[31m-[m
[31m-                    ngx_ssl_remove_cached_session(sscf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-                    ngx_http_finalize_request(r, NGX_HTTPS_NO_CERT);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                X509_free(cert);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_reading, -1);[m
[31m-    r->stat_reading = 0;[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_writing, 1);[m
[31m-    r->stat_writing = 1;[m
[31m-#endif[m
[31m-[m
[31m-    c->read->handler = ngx_http_request_handler;[m
[31m-    c->write->handler = ngx_http_request_handler;[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    ngx_http_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc)[m
[31m-{[m
[31m-    u_char  *h, ch;[m
[31m-    size_t   i, dot_pos, host_len;[m
[31m-[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_literal,[m
[31m-        sw_rest[m
[31m-    } state;[m
[31m-[m
[31m-    dot_pos = host->len;[m
[31m-    host_len = host->len;[m
[31m-[m
[31m-    h = host->data;[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-[m
[31m-    for (i = 0; i < host->len; i++) {[m
[31m-        ch = h[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '.':[m
[31m-            if (dot_pos == i - 1) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-            dot_pos = i;[m
[31m-            break;[m
[31m-[m
[31m-        case ':':[m
[31m-            if (state == sw_usual) {[m
[31m-                host_len = i;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '[':[m
[31m-            if (i == 0) {[m
[31m-                state = sw_literal;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ']':[m
[31m-            if (state == sw_literal) {[m
[31m-                host_len = i + 1;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '\0':[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            if (ngx_path_separator(ch)) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                alloc = 1;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dot_pos == host_len - 1) {[m
[31m-        host_len--;[m
[31m-    }[m
[31m-[m
[31m-    if (host_len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc) {[m
[31m-        host->data = ngx_pnalloc(pool, host_len);[m
[31m-        if (host->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_strlow(host->data, h, host_len);[m
[31m-    }[m
[31m-[m
[31m-    host->len = host_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    cscf = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-    if (hc->ssl_servername) {[m
[31m-        if (hc->ssl_servername->len == host->len[m
[31m-            && ngx_strncmp(hc->ssl_servername->data,[m
[31m-                           host->data, host->len) == 0)[m
[31m-        {[m
[31m-#if (NGX_PCRE)[m
[31m-            if (hc->ssl_servername_regex[m
[31m-                && ngx_http_regex_exec(r, hc->ssl_servername_regex,[m
[31m-                                          hc->ssl_servername) != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-#endif[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_find_virtual_server(r->connection,[m
[31m-                                      hc->addr_conf->virtual_names,[m
[31m-                                      host, r, &cscf);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-    if (hc->ssl_servername) {[m
[31m-        ngx_http_ssl_srv_conf_t  *sscf;[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            cscf = hc->addr_conf->default_server;[m
[31m-            rc = NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_http_get_module_srv_conf(cscf->ctx, ngx_http_ssl_module);[m
[31m-[m
[31m-        if (sscf->verify) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client attempted to request the server name "[m
[31m-                          "different from that one was negotiated");[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->srv_conf = cscf->ctx->srv_conf;[m
[31m-    r->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_find_virtual_server(ngx_connection_t *c,[m
[31m-    ngx_http_virtual_names_t *virtual_names, ngx_str_t *host,[m
[31m-    ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (virtual_names == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_hash_find_combined(&virtual_names->names,[m
[31m-                                  ngx_hash_key(host->data, host->len),[m
[31m-                                  host->data, host->len);[m
[31m-[m
[31m-    if (cscf) {[m
[31m-        *cscfp = cscf;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (host->len && virtual_names->nregex) {[m
[31m-        ngx_int_t                n;[m
[31m-        ngx_uint_t               i;[m
[31m-        ngx_http_server_name_t  *sn;[m
[31m-[m
[31m-        sn = virtual_names->regex;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-[m
[31m-        if (r == NULL) {[m
[31m-            ngx_http_connection_t  *hc;[m
[31m-[m
[31m-            for (i = 0; i < virtual_names->nregex; i++) {[m
[31m-[m
[31m-                n = ngx_regex_exec(sn[i].regex->regex, host, NULL, 0);[m
[31m-[m
[31m-                if (n == NGX_REGEX_NO_MATCHED) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (n >= 0) {[m
[31m-                    hc = c->data;[m
[31m-                    hc->ssl_servername_regex = sn[i].regex;[m
[31m-[m
[31m-                    *cscfp = sn[i].server;[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              ngx_regex_exec_n " failed: %i "[m
[31m-                              "on \"%V\" using \"%V\"",[m
[31m-                              n, host, &sn[i].regex->name);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-#endif /* NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME */[m
[31m-[m
[31m-        for (i = 0; i < virtual_names->nregex; i++) {[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, sn[i].regex, host);[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                *cscfp = sn[i].server;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif /* NGX_PCRE */[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_request_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http run request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        r->write_event_handler(r);[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_run_posted_requests(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_posted_request_t  *pr;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (c->destroyed) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r = c->data;[m
[31m-        pr = r->main->posted_requests;[m
[31m-[m
[31m-        if (pr == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->main->posted_requests = pr->next;[m
[31m-[m
[31m-        r = pr->request;[m
[31m-[m
[31m-        ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http posted request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_post_request(ngx_http_request_t *r, ngx_http_posted_request_t *pr)[m
[31m-{[m
[31m-    ngx_http_posted_request_t  **p;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-        if (pr == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = NULL;[m
[31m-[m
[31m-    for (p = &r->main->posted_requests; *p; p = &(*p)->next) { /* void */ }[m
[31m-[m
[31m-    *p = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_t        *pr;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http finalize request: %i, \"%V?%V\" a:%d, c:%d",[m
[31m-                   rc, &r->uri, &r->args, r == c->data, r->main->count);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_finalize_connection(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK && r->filter_finalize) {[m
[31m-        c->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        r->content_handler = NULL;[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main && r->post_subrequest) {[m
[31m-        ngx_http_probe_subrequest_post_start(r, rc);[m
[31m-[m
[31m-        rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc);[m
[31m-[m
[31m-        ngx_http_probe_subrequest_post_done(r, rc);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc == NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        || c->error)[m
[31m-    {[m
[31m-        if (ngx_http_post_action(r) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (r->main->blocked) {[m
[31m-            r->write_event_handler = ngx_http_request_finalizer;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_terminate_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        || rc == NGX_HTTP_CREATED[m
[31m-        || rc == NGX_HTTP_NO_CONTENT)[m
[31m-    {[m
[31m-        if (rc == NGX_HTTP_CLOSE) {[m
[31m-            ngx_http_terminate_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (r == r->main) {[m
[31m-            if (c->read->timer_set) {[m
[31m-                ngx_del_timer(c->read);[m
[31m-            }[m
[31m-[m
[31m-            if (c->write->timer_set) {[m
[31m-                ngx_del_timer(c->write);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        c->read->handler = ngx_http_request_handler;[m
[31m-        c->write->handler = ngx_http_request_handler;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-[m
[31m-        if (r->buffered || r->postponed) {[m
[31m-[m
[31m-            ngx_http_probe_subrequest_finalize_writing(r);[m
[31m-[m
[31m-            if (ngx_http_set_write_handler(r) != NGX_OK) {[m
[31m-                ngx_http_terminate_request(r, 0);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        pr = r->parent;[m
[31m-[m
[31m-        if (r == c->data) {[m
[31m-[m
[31m-            r->main->count--;[m
[31m-[m
[31m-            if (!r->logged) {[m
[31m-[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                if (clcf->log_subrequest) {[m
[31m-                    ngx_http_log_request(r);[m
[31m-                }[m
[31m-[m
[31m-                r->logged = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              "subrequest: \"%V?%V\" logged again",[m
[31m-                              &r->uri, &r->args);[m
[31m-            }[m
[31m-[m
[31m-            r->done = 1;[m
[31m-[m
[31m-            if (pr->postponed && pr->postponed->request == r) {[m
[31m-                pr->postponed = pr->postponed->next;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_probe_subrequest_done(r);[m
[31m-[m
[31m-            c->data = pr;[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            ngx_http_probe_subrequest_finalize_nonactive(r);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http finalize non-active request: \"%V?%V\"",[m
[31m-                           &r->uri, &r->args);[m
[31m-[m
[31m-            r->write_event_handler = ngx_http_request_finalizer;[m
[31m-[m
[31m-            if (r->waited) {[m
[31m-                r->done = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_probe_subrequest_wake_parent(r);[m
[31m-[m
[31m-        if (ngx_http_post_request(pr, NULL) != NGX_OK) {[m
[31m-            r->main->count++;[m
[31m-            ngx_http_terminate_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http wake parent request: \"%V?%V\"",[m
[31m-                       &pr->uri, &pr->args);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered || c->buffered || r->postponed || r->blocked) {[m
[31m-[m
[31m-        if (ngx_http_set_write_handler(r) != NGX_OK) {[m
[31m-            ngx_http_terminate_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r != c->data) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "http finalize non-active request: \"%V?%V\"",[m
[31m-                      &r->uri, &r->args);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->done = 1;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    if (!r->post_action) {[m
[31m-        r->request_complete = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_post_action(r) == NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        c->write->delayed = 0;[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->eof) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_connection(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_cleanup_t    *cln;[m
[31m-    ngx_http_request_t    *mr;[m
[31m-    ngx_http_ephemeral_t  *e;[m
[31m-[m
[31m-    mr = r->main;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate request count:%d", mr->count);[m
[31m-[m
[31m-    if (rc > 0 && (mr->headers_out.status == 0 || mr->connection->sent == 0)) {[m
[31m-        mr->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    cln = mr->cleanup;[m
[31m-    mr->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate cleanup count:%d blk:%d",[m
[31m-                   mr->count, mr->blocked);[m
[31m-[m
[31m-    if (mr->write_event_handler) {[m
[31m-[m
[31m-        if (mr->blocked) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        e = ngx_http_ephemeral(mr);[m
[31m-        mr->posted_requests = NULL;[m
[31m-        mr->write_event_handler = ngx_http_terminate_handler;[m
[31m-        (void) ngx_http_post_request(mr, &e->terminal_posted_request);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_request(mr, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_terminate_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http terminate handler count:%d", r->count);[m
[31m-[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    ngx_http_close_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_finalize_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->main->count != 1) {[m
[31m-[m
[31m-        if (r->discard_body) {[m
[31m-            r->read_event_handler = ngx_http_discarded_request_body_handler;[m
[31m-            ngx_add_timer(r->connection->read, clcf->lingering_timeout);[m
[31m-[m
[31m-            if (r->lingering_time == 0) {[m
[31m-                r->lingering_time = ngx_time()[m
[31m-                                      + (time_t) (clcf->lingering_time / 1000);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->reading_body) {[m
[31m-        r->keepalive = 0;[m
[31m-        r->lingering_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_terminate[m
[31m-         && !ngx_exiting[m
[31m-         && r->keepalive[m
[31m-         && clcf->keepalive_timeout > 0)[m
[31m-    {[m
[31m-        ngx_http_set_keepalive(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->lingering_close == NGX_HTTP_LINGERING_ALWAYS[m
[31m-        || (clcf->lingering_close == NGX_HTTP_LINGERING_ON[m
[31m-            && (r->lingering_close[m
[31m-                || r->header_in->pos < r->header_in->last[m
[31m-                || r->connection->read->ready)))[m
[31m-    {[m
[31m-        ngx_http_set_lingering_close(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_write_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_WRITING_REQUEST_STATE;[m
[31m-[m
[31m-    r->read_event_handler = r->discard_body ?[m
[31m-                                ngx_http_discarded_request_body_handler:[m
[31m-                                ngx_http_test_reading;[m
[31m-    r->write_event_handler = ngx_http_writer;[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wev->ready && wev->delayed) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    if (!wev->delayed) {[m
[31m-        ngx_add_timer(wev, clcf->send_timeout);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_writer(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                        rc;[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                   "http writer handler: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "client timed out");[m
[31m-            c->timedout = 1;[m
[31m-[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        wev->timedout = 0;[m
[31m-        wev->delayed = 0;[m
[31m-[m
[31m-        if (!wev->ready) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-                ngx_http_close_request(r, 0);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    if (wev->delayed || r->aio) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                       "http writer delayed");[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, NULL);[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http writer output filter: %d, \"%V?%V\"",[m
[31m-                   rc, &r->uri, &r->args);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->buffered || r->postponed || (r == r->main && c->buffered)) {[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,[m
[31m-                   "http writer done: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_request_finalizer(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http finalizer done: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ngx_http_finalize_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_block_reading(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http reading blocked");[m
[31m-[m
[31m-    /* aio does not call this handler */[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT)[m
[31m-        && r->connection->read->active)[m
[31m-    {[m
[31m-        if (ngx_del_event(r->connection->read, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_test_reading(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_err_t          err;[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http test reading");[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-[m
[31m-    if (r->stream) {[m
[31m-        if (c->error) {[m
[31m-            err = 0;[m
[31m-            goto closed;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!rev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-        err = rev->kq_errno;[m
[31m-[m
[31m-        goto closed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && rev->pending_eof) {[m
[31m-        socklen_t  len;[m
[31m-[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        err = 0;[m
[31m-        len = sizeof(ngx_err_t);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        goto closed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        rev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-        err = 0;[m
[31m-[m
[31m-        goto closed;[m
[31m-[m
[31m-    } else if (n == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err != NGX_EAGAIN) {[m
[31m-            rev->eof = 1;[m
[31m-            c->error = 1;[m
[31m-[m
[31m-            goto closed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* aio does not call this handler */[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && rev->active) {[m
[31m-[m
[31m-        if (ngx_del_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-closed:[m
[31m-[m
[31m-    if (err) {[m
[31m-        rev->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_set_keepalive(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  i;[m
[31m-    ngx_buf_t                 *b, *f;[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler");[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-        r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);[m
[31m-        ngx_add_timer(rev, clcf->lingering_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "closing request";[m
[31m-[m
[31m-    hc = r->http_connection;[m
[31m-    b = r->header_in;[m
[31m-[m
[31m-    if (b->pos < b->last) {[m
[31m-[m
[31m-        /* the pipelined request */[m
[31m-[m
[31m-        if (b != c->buffer) {[m
[31m-[m
[31m-            /*[m
[31m-             * If the large header buffers were allocated while the previous[m
[31m-             * request processing then we do not use c->buffer for[m
[31m-             * the pipelined request (see ngx_http_create_request()).[m
[31m-             *[m
[31m-             * Now we would move the large header buffers to the free list.[m
[31m-             */[m
[31m-[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            if (hc->free == NULL) {[m
[31m-                hc->free = ngx_palloc(c->pool,[m
[31m-                  cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));[m
[31m-[m
[31m-                if (hc->free == NULL) {[m
[31m-                    ngx_http_close_request(r, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; i < hc->nbusy - 1; i++) {[m
[31m-                f = hc->busy[i];[m
[31m-                hc->free[hc->nfree++] = f;[m
[31m-                f->pos = f->start;[m
[31m-                f->last = f->start;[m
[31m-            }[m
[31m-[m
[31m-            hc->busy[0] = b;[m
[31m-            hc->nbusy = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* guard against recursive call from ngx_http_finalize_connection() */[m
[31m-    r->keepalive = 0;[m
[31m-[m
[31m-    ngx_http_free_request(r, 0);[m
[31m-[m
[31m-    c->data = hc;[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-    wev->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    if (b->pos < b->last) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "pipelined request");[m
[31m-[m
[31m-        c->log->action = "reading client pipelined request line";[m
[31m-[m
[31m-        r = ngx_http_create_request(c);[m
[31m-        if (r == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->pipeline = 1;[m
[31m-[m
[31m-        c->data = r;[m
[31m-[m
[31m-        c->sent = 0;[m
[31m-        c->destroyed = 0;[m
[31m-[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        rev->handler = ngx_http_process_request_line;[m
[31m-        ngx_post_event(rev, &ngx_posted_events);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * To keep a memory footprint as small as possible for an idle keepalive[m
[31m-     * connection we try to free c->buffer's memory if it was allocated outside[m
[31m-     * the c->pool.  The large header buffers are always allocated outside the[m
[31m-     * c->pool and are freed too.[m
[31m-     */[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-[m
[31m-        /*[m
[31m-         * the special note for ngx_http_keepalive_handler() that[m
[31m-         * c->buffer's memory was freed[m
[31m-         */[m
[31m-[m
[31m-        b->pos = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc free: %p %i",[m
[31m-                   hc->free, hc->nfree);[m
[31m-[m
[31m-    if (hc->free) {[m
[31m-        for (i = 0; i < hc->nfree; i++) {[m
[31m-            ngx_pfree(c->pool, hc->free[i]->start);[m
[31m-            hc->free[i] = NULL;[m
[31m-        }[m
[31m-[m
[31m-        hc->nfree = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc busy: %p %i",[m
[31m-                   hc->busy, hc->nbusy);[m
[31m-[m
[31m-    if (hc->busy) {[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            ngx_pfree(c->pool, hc->busy[i]->start);[m
[31m-            hc->busy[i] = NULL;[m
[31m-        }[m
[31m-[m
[31m-        hc->nbusy = 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        ngx_ssl_free_buffer(c);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rev->handler = ngx_http_keepalive_handler;[m
[31m-[m
[31m-    if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "keepalive";[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == -1) {[m
[31m-            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-        tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;[m
[31m-[m
[31m-    } else {[m
[31m-        tcp_nodelay = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (tcp_nodelay[m
[31m-        && clcf->tcp_nodelay[m
[31m-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-            == -1)[m
[31m-        {[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris returns EINVAL if a socket has been shut down */[m
[31m-            c->log_error = NGX_ERROR_IGNORE_EINVAL;[m
[31m-#endif[m
[31m-[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-[m
[31m-            c->log_error = NGX_ERROR_INFO;[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    /* if ngx_http_request_t was freed then we need some other place */[m
[31m-    r->http_state = NGX_HTTP_KEEPALIVE_STATE;[m
[31m-#endif[m
[31m-[m
[31m-    c->idle = 1;[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    ngx_add_timer(rev, clcf->keepalive_timeout);[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_post_event(rev, &ngx_posted_events);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_keepalive_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ssize_t            n;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http keepalive handler");[m
[31m-[m
[31m-    if (rev->timedout || c->close) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        if (rev->pending_eof) {[m
[31m-            c->log->handler = NULL;[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,[m
[31m-                          "kevent() reported that client %V closed "[m
[31m-                          "keepalive connection", &c->addr_text);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl) {[m
[31m-                c->ssl->no_send_shutdown = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-    size = b->end - b->start;[m
[31m-[m
[31m-    if (b->pos == NULL) {[m
[31m-[m
[31m-        /*[m
[31m-         * The c->buffer's memory was freed by ngx_http_set_keepalive().[m
[31m-         * However, the c->buffer->start and c->buffer->end were not changed[m
[31m-         * to keep the buffer size.[m
[31m-         */[m
[31m-[m
[31m-        b->pos = ngx_palloc(c->pool, size);[m
[31m-        if (b->pos == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        b->start = b->pos;[m
[31m-        b->last = b->pos;[m
[31m-        b->end = b->pos + size;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * MSIE closes a keepalive connection with RST flag[m
[31m-     * so we ignore ECONNRESET here.[m
[31m-     */[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_IGNORE_ECONNRESET;[m
[31m-    ngx_set_socket_errno(0);[m
[31m-[m
[31m-    n = c->recv(c, b->last, size);[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * Like ngx_http_set_keepalive() we are trying to not hold[m
[31m-         * c->buffer's memory for a keepalive connection.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_pfree(c->pool, b->start) == NGX_OK) {[m
[31m-[m
[31m-            /*[m
[31m-             * the special note that c->buffer's memory was freed[m
[31m-             */[m
[31m-[m
[31m-            b->pos = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->handler = NULL;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno,[m
[31m-                      "client %V closed keepalive connection", &c->addr_text);[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    c->log->handler = ngx_http_log_error;[m
[31m-    c->log->action = "reading client request line";[m
[31m-[m
[31m-    c->idle = 0;[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    c->data = ngx_http_create_request(c);[m
[31m-    if (c->data == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->sent = 0;[m
[31m-    c->destroyed = 0;[m
[31m-[m
[31m-    ngx_del_timer(rev);[m
[31m-[m
[31m-    rev->handler = ngx_http_process_request_line;[m
[31m-    ngx_http_process_request_line(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_set_lingering_close(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    rev->handler = ngx_http_lingering_close_handler;[m
[31m-[m
[31m-    r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);[m
[31m-    ngx_add_timer(rev, clcf->lingering_timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-    wev->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {[m
[31m-        ngx_connection_error(c, ngx_socket_errno,[m
[31m-                             ngx_shutdown_socket_n " failed");[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_http_lingering_close_handler(rev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lingering_close_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_msec_t                 timer;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    u_char                     buffer[NGX_HTTP_LINGERING_BUFFER_SIZE];[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lingering close handler");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();[m
[31m-    if ((ngx_msec_int_t) timer <= 0) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    do {[m
[31m-        n = c->recv(c, buffer, NGX_HTTP_LINGERING_BUFFER_SIZE);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "lingering read: %z", n);[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            ngx_http_close_request(r, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } while (rev->ready);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_close_request(r, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    timer *= 1000;[m
[31m-[m
[31m-    if (timer > clcf->lingering_timeout) {[m
[31m-        timer = clcf->lingering_timeout;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(rev, timer);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_empty_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http empty handler");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_request_empty_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http request empty handler");[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_send_special(ngx_http_request_t *r, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_LAST) {[m
[31m-[m
[31m-        if (r == r->main && !r->post_action) {[m
[31m-            b->last_buf = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            b->sync = 1;[m
[31m-            b->last_in_chain = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_FLUSH) {[m
[31m-        b->flush = 1;[m
[31m-    }[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_post_action(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->post_action.data == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (r->post_action && r->uri_changes == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "post action: \"%V\"", &clcf->post_action);[m
[31m-[m
[31m-    r->main->count--;[m
[31m-[m
[31m-    r->http_version = NGX_HTTP_VERSION_9;[m
[31m-    r->header_only = 1;[m
[31m-    r->post_action = 1;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    if (clcf->post_action.data[0] == '/') {[m
[31m-        ngx_http_internal_redirect(r, &clcf->post_action, NULL);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_http_named_location(r, &clcf->post_action);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r = r->main;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http request count:%d blk:%d", r->count, r->blocked);[m
[31m-[m
[31m-    if (r->count == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http request count is zero");[m
[31m-    }[m
[31m-[m
[31m-    r->count--;[m
[31m-[m
[31m-    if (r->count || r->blocked) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_v2_close_stream(r->stream, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_free_request(r, rc);[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_pool_t                *pool;[m
[31m-    struct linger              linger;[m
[31m-    ngx_http_cleanup_t        *cln;[m
[31m-    ngx_http_log_ctx_t        *ctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http close request");[m
[31m-[m
[31m-    if (r->pool == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "http request already closed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln = r->cleanup;[m
[31m-    r->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-[m
[31m-    if (r->stat_reading) {[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_reading, -1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->stat_writing) {[m
[31m-        (void) ngx_atomic_fetch_add(ngx_stat_writing, -1);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (rc > 0 && (r->headers_out.status == 0 || r->connection->sent == 0)) {[m
[31m-        r->headers_out.status = rc;[m
[31m-    }[m
[31m-[m
[31m-    log->action = "logging request";[m
[31m-[m
[31m-    ngx_http_log_request(r);[m
[31m-[m
[31m-    log->action = "closing request";[m
[31m-[m
[31m-    if (r->connection->timedout) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->reset_timedout_connection) {[m
[31m-            linger.l_onoff = 1;[m
[31m-            linger.l_linger = 0;[m
[31m-[m
[31m-            if (setsockopt(r->connection->fd, SOL_SOCKET, SO_LINGER,[m
[31m-                           (const void *) &linger, sizeof(struct linger)) == -1)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                              "setsockopt(SO_LINGER) failed");[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the various request strings were allocated from r->pool */[m
[31m-    ctx = log->data;[m
[31m-    ctx->request = NULL;[m
[31m-[m
[31m-    r->request_line.len = 0;[m
[31m-[m
[31m-    r->connection->destroyed = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * Setting r->pool to NULL will increase probability to catch double close[m
[31m-     * of request since the request object is allocated from its own pool.[m
[31m-     */[m
[31m-[m
[31m-    pool = r->pool;[m
[31m-    r->pool = NULL;[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_log_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_handler_pt        *log_handler;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    log_handler = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.elts;[m
[31m-    n = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.nelts;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        log_handler[i](r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "close http connection: %d", c->fd);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_http_close_connection;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_http_request_t  *r;[m
[31m-    ngx_http_log_ctx_t  *ctx;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    ctx = log->data;[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", client: %V", &ctx->connection->addr_text);[m
[31m-    len -= p - buf;[m
[31m-[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    if (r) {[m
[31m-        return r->log_handler(r, ctx->current_request, p, len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_snprintf(p, len, ", server: %V",[m
[31m-                         &ctx->connection->listening->addr_text);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_log_error_handler(ngx_http_request_t *r, ngx_http_request_t *sr,[m
[31m-    u_char *buf, size_t len)[m
[31m-{[m
[31m-    char                      *uri_separator;[m
[31m-    u_char                    *p;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", server: %V", &cscf->server_name);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (r->request_line.data == NULL && r->request_start) {[m
[31m-        for (p = r->request_start; p < r->header_in->last; p++) {[m
[31m-            if (*p == CR || *p == LF) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        r->request_line.len = p - r->request_start;[m
[31m-        r->request_line.data = r->request_start;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_line.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", request: \"%V\"", &r->request_line);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r != sr) {[m
[31m-        p = ngx_snprintf(buf, len, ", subrequest: \"%V\"", &sr->uri);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    u = sr->upstream;[m
[31m-[m
[31m-    if (u && u->peer.name) {[m
[31m-[m
[31m-        uri_separator = "";[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        if (u->peer.sockaddr && u->peer.sockaddr->sa_family == AF_UNIX) {[m
[31m-            uri_separator = ":";[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        p = ngx_snprintf(buf, len, ", upstream: \"%V%V%s%V\"",[m
[31m-                         &u->schema, u->peer.name,[m
[31m-                         uri_separator, &u->uri);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.host) {[m
[31m-        p = ngx_snprintf(buf, len, ", host: \"%V\"",[m
[31m-                         &r->headers_in.host->value);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.referer) {[m
[31m-        p = ngx_snprintf(buf, len, ", referrer: \"%V\"",[m
[31m-                         &r->headers_in.referer->value);[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.h[m
[1mdeleted file mode 100644[m
[1mindex cfde7dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request.h[m
[1m+++ /dev/null[m
[36m@@ -1,599 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_REQUEST_H_INCLUDED_[m
[31m-#define _NGX_HTTP_REQUEST_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_MAX_URI_CHANGES           10[m
[31m-#define NGX_HTTP_MAX_SUBREQUESTS           50[m
[31m-[m
[31m-/* must be 2^n */[m
[31m-#define NGX_HTTP_LC_HEADER_LEN             32[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_DISCARD_BUFFER_SIZE       4096[m
[31m-#define NGX_HTTP_LINGERING_BUFFER_SIZE     4096[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_VERSION_9                 9[m
[31m-#define NGX_HTTP_VERSION_10                1000[m
[31m-#define NGX_HTTP_VERSION_11                1001[m
[31m-#define NGX_HTTP_VERSION_20                2000[m
[31m-[m
[31m-#define NGX_HTTP_UNKNOWN                   0x0001[m
[31m-#define NGX_HTTP_GET                       0x0002[m
[31m-#define NGX_HTTP_HEAD                      0x0004[m
[31m-#define NGX_HTTP_POST                      0x0008[m
[31m-#define NGX_HTTP_PUT                       0x0010[m
[31m-#define NGX_HTTP_DELETE                    0x0020[m
[31m-#define NGX_HTTP_MKCOL                     0x0040[m
[31m-#define NGX_HTTP_COPY                      0x0080[m
[31m-#define NGX_HTTP_MOVE                      0x0100[m
[31m-#define NGX_HTTP_OPTIONS                   0x0200[m
[31m-#define NGX_HTTP_PROPFIND                  0x0400[m
[31m-#define NGX_HTTP_PROPPATCH                 0x0800[m
[31m-#define NGX_HTTP_LOCK                      0x1000[m
[31m-#define NGX_HTTP_UNLOCK                    0x2000[m
[31m-#define NGX_HTTP_PATCH                     0x4000[m
[31m-#define NGX_HTTP_TRACE                     0x8000[m
[31m-[m
[31m-#define NGX_HTTP_CONNECTION_CLOSE          1[m
[31m-#define NGX_HTTP_CONNECTION_KEEP_ALIVE     2[m
[31m-[m
[31m-[m
[31m-#define NGX_NONE                           1[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_PARSE_HEADER_DONE         1[m
[31m-[m
[31m-#define NGX_HTTP_CLIENT_ERROR              10[m
[31m-#define NGX_HTTP_PARSE_INVALID_METHOD      10[m
[31m-#define NGX_HTTP_PARSE_INVALID_REQUEST     11[m
[31m-#define NGX_HTTP_PARSE_INVALID_09_METHOD   12[m
[31m-[m
[31m-#define NGX_HTTP_PARSE_INVALID_HEADER      13[m
[31m-[m
[31m-[m
[31m-/* unused                                  1 */[m
[31m-#define NGX_HTTP_SUBREQUEST_IN_MEMORY      2[m
[31m-#define NGX_HTTP_SUBREQUEST_WAITED         4[m
[31m-#define NGX_HTTP_LOG_UNSAFE                8[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_CONTINUE                  100[m
[31m-#define NGX_HTTP_SWITCHING_PROTOCOLS       101[m
[31m-#define NGX_HTTP_PROCESSING                102[m
[31m-[m
[31m-#define NGX_HTTP_OK                        200[m
[31m-#define NGX_HTTP_CREATED                   201[m
[31m-#define NGX_HTTP_ACCEPTED                  202[m
[31m-#define NGX_HTTP_NO_CONTENT                204[m
[31m-#define NGX_HTTP_PARTIAL_CONTENT           206[m
[31m-[m
[31m-#define NGX_HTTP_SPECIAL_RESPONSE          300[m
[31m-#define NGX_HTTP_MOVED_PERMANENTLY         301[m
[31m-#define NGX_HTTP_MOVED_TEMPORARILY         302[m
[31m-#define NGX_HTTP_SEE_OTHER                 303[m
[31m-#define NGX_HTTP_NOT_MODIFIED              304[m
[31m-#define NGX_HTTP_TEMPORARY_REDIRECT        307[m
[31m-[m
[31m-#define NGX_HTTP_BAD_REQUEST               400[m
[31m-#define NGX_HTTP_UNAUTHORIZED              401[m
[31m-#define NGX_HTTP_FORBIDDEN                 403[m
[31m-#define NGX_HTTP_NOT_FOUND                 404[m
[31m-#define NGX_HTTP_NOT_ALLOWED               405[m
[31m-#define NGX_HTTP_REQUEST_TIME_OUT          408[m
[31m-#define NGX_HTTP_CONFLICT                  409[m
[31m-#define NGX_HTTP_LENGTH_REQUIRED           411[m
[31m-#define NGX_HTTP_PRECONDITION_FAILED       412[m
[31m-#define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE  413[m
[31m-#define NGX_HTTP_REQUEST_URI_TOO_LARGE     414[m
[31m-#define NGX_HTTP_UNSUPPORTED_MEDIA_TYPE    415[m
[31m-#define NGX_HTTP_RANGE_NOT_SATISFIABLE     416[m
[31m-[m
[31m-[m
[31m-/* Our own HTTP codes */[m
[31m-[m
[31m-/* The special code to close connection without any response */[m
[31m-#define NGX_HTTP_CLOSE                     444[m
[31m-[m
[31m-#define NGX_HTTP_NGINX_CODES               494[m
[31m-[m
[31m-#define NGX_HTTP_REQUEST_HEADER_TOO_LARGE  494[m
[31m-[m
[31m-#define NGX_HTTPS_CERT_ERROR               495[m
[31m-#define NGX_HTTPS_NO_CERT                  496[m
[31m-[m
[31m-/*[m
[31m- * We use the special code for the plain HTTP requests that are sent to[m
[31m- * HTTPS port to distinguish it from 4XX in an error page redirection[m
[31m- */[m
[31m-#define NGX_HTTP_TO_HTTPS                  497[m
[31m-[m
[31m-/* 498 is the canceled code for the requests with invalid host name */[m
[31m-[m
[31m-/*[m
[31m- * HTTP does not define the code for the case when a client closed[m
[31m- * the connection while we are processing its request so we introduce[m
[31m- * own code to log such situation when a client has closed the connection[m
[31m- * before we even try to send the HTTP header to it[m
[31m- */[m
[31m-#define NGX_HTTP_CLIENT_CLOSED_REQUEST     499[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_INTERNAL_SERVER_ERROR     500[m
[31m-#define NGX_HTTP_NOT_IMPLEMENTED           501[m
[31m-#define NGX_HTTP_BAD_GATEWAY               502[m
[31m-#define NGX_HTTP_SERVICE_UNAVAILABLE       503[m
[31m-#define NGX_HTTP_GATEWAY_TIME_OUT          504[m
[31m-#define NGX_HTTP_INSUFFICIENT_STORAGE      507[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LOWLEVEL_BUFFERED         0xf0[m
[31m-#define NGX_HTTP_WRITE_BUFFERED            0x10[m
[31m-#define NGX_HTTP_GZIP_BUFFERED             0x20[m
[31m-#define NGX_HTTP_SSI_BUFFERED              0x01[m
[31m-#define NGX_HTTP_SUB_BUFFERED              0x02[m
[31m-#define NGX_HTTP_COPY_BUFFERED             0x04[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_INITING_REQUEST_STATE = 0,[m
[31m-    NGX_HTTP_READING_REQUEST_STATE,[m
[31m-    NGX_HTTP_PROCESS_REQUEST_STATE,[m
[31m-[m
[31m-    NGX_HTTP_CONNECT_UPSTREAM_STATE,[m
[31m-    NGX_HTTP_WRITING_UPSTREAM_STATE,[m
[31m-    NGX_HTTP_READING_UPSTREAM_STATE,[m
[31m-[m
[31m-    NGX_HTTP_WRITING_REQUEST_STATE,[m
[31m-    NGX_HTTP_LINGERING_CLOSE_STATE,[m
[31m-    NGX_HTTP_KEEPALIVE_STATE[m
[31m-} ngx_http_state_e;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                         name;[m
[31m-    ngx_uint_t                        offset;[m
[31m-    ngx_http_header_handler_pt        handler;[m
[31m-} ngx_http_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                         name;[m
[31m-    ngx_uint_t                        offset;[m
[31m-} ngx_http_header_out_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_list_t                        headers;[m
[31m-[m
[31m-    ngx_table_elt_t                  *host;[m
[31m-    ngx_table_elt_t                  *connection;[m
[31m-    ngx_table_elt_t                  *if_modified_since;[m
[31m-    ngx_table_elt_t                  *if_unmodified_since;[m
[31m-    ngx_table_elt_t                  *if_match;[m
[31m-    ngx_table_elt_t                  *if_none_match;[m
[31m-    ngx_table_elt_t                  *user_agent;[m
[31m-    ngx_table_elt_t                  *referer;[m
[31m-    ngx_table_elt_t                  *content_length;[m
[31m-    ngx_table_elt_t                  *content_type;[m
[31m-[m
[31m-    ngx_table_elt_t                  *range;[m
[31m-    ngx_table_elt_t                  *if_range;[m
[31m-[m
[31m-    ngx_table_elt_t                  *transfer_encoding;[m
[31m-    ngx_table_elt_t                  *expect;[m
[31m-    ngx_table_elt_t                  *upgrade;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    ngx_table_elt_t                  *accept_encoding;[m
[31m-    ngx_table_elt_t                  *via;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_table_elt_t                  *authorization;[m
[31m-[m
[31m-    ngx_table_elt_t                  *keep_alive;[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    ngx_array_t                       x_forwarded_for;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    ngx_table_elt_t                  *x_real_ip;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_HEADERS)[m
[31m-    ngx_table_elt_t                  *accept;[m
[31m-    ngx_table_elt_t                  *accept_language;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    ngx_table_elt_t                  *depth;[m
[31m-    ngx_table_elt_t                  *destination;[m
[31m-    ngx_table_elt_t                  *overwrite;[m
[31m-    ngx_table_elt_t                  *date;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_str_t                         user;[m
[31m-    ngx_str_t                         passwd;[m
[31m-[m
[31m-    ngx_array_t                       cookies;[m
[31m-[m
[31m-    ngx_str_t                         server;[m
[31m-    off_t                             content_length_n;[m
[31m-    time_t                            keep_alive_n;[m
[31m-[m
[31m-    unsigned                          connection_type:2;[m
[31m-    unsigned                          chunked:1;[m
[31m-    unsigned                          msie:1;[m
[31m-    unsigned                          msie6:1;[m
[31m-    unsigned                          opera:1;[m
[31m-    unsigned                          gecko:1;[m
[31m-    unsigned                          chrome:1;[m
[31m-    unsigned                          safari:1;[m
[31m-    unsigned                          konqueror:1;[m
[31m-} ngx_http_headers_in_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_list_t                        headers;[m
[31m-[m
[31m-    ngx_uint_t                        status;[m
[31m-    ngx_str_t                         status_line;[m
[31m-[m
[31m-    ngx_table_elt_t                  *server;[m
[31m-    ngx_table_elt_t                  *date;[m
[31m-    ngx_table_elt_t                  *content_length;[m
[31m-    ngx_table_elt_t                  *content_encoding;[m
[31m-    ngx_table_elt_t                  *location;[m
[31m-    ngx_table_elt_t                  *refresh;[m
[31m-    ngx_table_elt_t                  *last_modified;[m
[31m-    ngx_table_elt_t                  *content_range;[m
[31m-    ngx_table_elt_t                  *accept_ranges;[m
[31m-    ngx_table_elt_t                  *www_authenticate;[m
[31m-    ngx_table_elt_t                  *expires;[m
[31m-    ngx_table_elt_t                  *etag;[m
[31m-[m
[31m-    ngx_str_t                        *override_charset;[m
[31m-[m
[31m-    size_t                            content_type_len;[m
[31m-    ngx_str_t                         content_type;[m
[31m-    ngx_str_t                         charset;[m
[31m-    u_char                           *content_type_lowcase;[m
[31m-    ngx_uint_t                        content_type_hash;[m
[31m-[m
[31m-    ngx_array_t                       cache_control;[m
[31m-[m
[31m-    off_t                             content_length_n;[m
[31m-    off_t                             content_offset;[m
[31m-    time_t                            date_time;[m
[31m-    time_t                            last_modified_time;[m
[31m-} ngx_http_headers_out_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_client_body_handler_pt)(ngx_http_request_t *r);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_temp_file_t                  *temp_file;[m
[31m-    ngx_chain_t                      *bufs;[m
[31m-    ngx_buf_t                        *buf;[m
[31m-    off_t                             rest;[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    off_t                             received;[m
[31m-#endif[m
[31m-    ngx_chain_t                      *free;[m
[31m-    ngx_chain_t                      *busy;[m
[31m-    ngx_http_chunked_t               *chunked;[m
[31m-    ngx_http_client_body_handler_pt   post_handler;[m
[31m-} ngx_http_request_body_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_addr_conf_s  ngx_http_addr_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_addr_conf_t             *addr_conf;[m
[31m-    ngx_http_conf_ctx_t              *conf_ctx;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)[m
[31m-    ngx_str_t                        *ssl_servername;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_regex_t                 *ssl_servername_regex;[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    ngx_buf_t                       **busy;[m
[31m-    ngx_int_t                         nbusy;[m
[31m-[m
[31m-    ngx_buf_t                       **free;[m
[31m-    ngx_int_t                         nfree;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    unsigned                          ssl:1;[m
[31m-#endif[m
[31m-    unsigned                          proxy_protocol:1;[m
[31m-} ngx_http_connection_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_cleanup_pt)(void *data);[m
[31m-[m
[31m-typedef struct ngx_http_cleanup_s  ngx_http_cleanup_t;[m
[31m-[m
[31m-struct ngx_http_cleanup_s {[m
[31m-    ngx_http_cleanup_pt               handler;[m
[31m-    void                             *data;[m
[31m-    ngx_http_cleanup_t               *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r,[m
[31m-    void *data, ngx_int_t rc);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_post_subrequest_pt       handler;[m
[31m-    void                             *data;[m
[31m-} ngx_http_post_subrequest_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_postponed_request_s  ngx_http_postponed_request_t;[m
[31m-[m
[31m-struct ngx_http_postponed_request_s {[m
[31m-    ngx_http_request_t               *request;[m
[31m-    ngx_chain_t                      *out;[m
[31m-    ngx_http_postponed_request_t     *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_posted_request_s  ngx_http_posted_request_t;[m
[31m-[m
[31m-struct ngx_http_posted_request_s {[m
[31m-    ngx_http_request_t               *request;[m
[31m-    ngx_http_posted_request_t        *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);[m
[31m-typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_request_s {[m
[31m-    uint32_t                          signature;         /* "HTTP" */[m
[31m-[m
[31m-    ngx_connection_t                 *connection;[m
[31m-[m
[31m-    void                            **ctx;[m
[31m-    void                            **main_conf;[m
[31m-    void                            **srv_conf;[m
[31m-    void                            **loc_conf;[m
[31m-[m
[31m-    ngx_http_event_handler_pt         read_event_handler;[m
[31m-    ngx_http_event_handler_pt         write_event_handler;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_http_cache_t                 *cache;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_t              *upstream;[m
[31m-    ngx_array_t                      *upstream_states;[m
[31m-                                         /* of ngx_http_upstream_state_t */[m
[31m-[m
[31m-    ngx_pool_t                       *pool;[m
[31m-    ngx_buf_t                        *header_in;[m
[31m-[m
[31m-    ngx_http_headers_in_t             headers_in;[m
[31m-    ngx_http_headers_out_t            headers_out;[m
[31m-[m
[31m-    ngx_http_request_body_t          *request_body;[m
[31m-[m
[31m-    time_t                            lingering_time;[m
[31m-    time_t                            start_sec;[m
[31m-    ngx_msec_t                        start_msec;[m
[31m-[m
[31m-    ngx_uint_t                        method;[m
[31m-    ngx_uint_t                        http_version;[m
[31m-[m
[31m-    ngx_str_t                         request_line;[m
[31m-    ngx_str_t                         uri;[m
[31m-    ngx_str_t                         args;[m
[31m-    ngx_str_t                         exten;[m
[31m-    ngx_str_t                         unparsed_uri;[m
[31m-[m
[31m-    ngx_str_t                         method_name;[m
[31m-    ngx_str_t                         http_protocol;[m
[31m-[m
[31m-    ngx_chain_t                      *out;[m
[31m-    ngx_http_request_t               *main;[m
[31m-    ngx_http_request_t               *parent;[m
[31m-    ngx_http_postponed_request_t     *postponed;[m
[31m-    ngx_http_post_subrequest_t       *post_subrequest;[m
[31m-    ngx_http_posted_request_t        *posted_requests;[m
[31m-[m
[31m-    ngx_int_t                         phase_handler;[m
[31m-    ngx_http_handler_pt               content_handler;[m
[31m-    ngx_uint_t                        access_code;[m
[31m-[m
[31m-    ngx_http_variable_value_t        *variables;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_uint_t                        ncaptures;[m
[31m-    int                              *captures;[m
[31m-    u_char                           *captures_data;[m
[31m-#endif[m
[31m-[m
[31m-    size_t                            limit_rate;[m
[31m-    size_t                            limit_rate_after;[m
[31m-[m
[31m-    /* used to learn the Apache compatible response length without a header */[m
[31m-    size_t                            header_size;[m
[31m-[m
[31m-    off_t                             request_length;[m
[31m-[m
[31m-    ngx_uint_t                        err_status;[m
[31m-[m
[31m-    ngx_http_connection_t            *http_connection;[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    ngx_http_v2_stream_t             *stream;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_log_handler_pt           log_handler;[m
[31m-[m
[31m-    ngx_http_cleanup_t               *cleanup;[m
[31m-[m
[31m-    unsigned                          count:16;[m
[31m-    unsigned                          subrequests:8;[m
[31m-    unsigned                          blocked:8;[m
[31m-[m
[31m-    unsigned                          aio:1;[m
[31m-[m
[31m-    unsigned                          http_state:4;[m
[31m-[m
[31m-    /* URI with "/." and on Win32 with "//" */[m
[31m-    unsigned                          complex_uri:1;[m
[31m-[m
[31m-    /* URI with "%" */[m
[31m-    unsigned                          quoted_uri:1;[m
[31m-[m
[31m-    /* URI with "+" */[m
[31m-    unsigned                          plus_in_uri:1;[m
[31m-[m
[31m-    /* URI with " " */[m
[31m-    unsigned                          space_in_uri:1;[m
[31m-[m
[31m-    unsigned                          invalid_header:1;[m
[31m-[m
[31m-    unsigned                          add_uri_to_alias:1;[m
[31m-    unsigned                          valid_location:1;[m
[31m-    unsigned                          valid_unparsed_uri:1;[m
[31m-    unsigned                          uri_changed:1;[m
[31m-    unsigned                          uri_changes:4;[m
[31m-[m
[31m-    unsigned                          request_body_in_single_buf:1;[m
[31m-    unsigned                          request_body_in_file_only:1;[m
[31m-    unsigned                          request_body_in_persistent_file:1;[m
[31m-    unsigned                          request_body_in_clean_file:1;[m
[31m-    unsigned                          request_body_file_group_access:1;[m
[31m-    unsigned                          request_body_file_log_level:3;[m
[31m-    unsigned                          request_body_no_buffering:1;[m
[31m-[m
[31m-    unsigned                          subrequest_in_memory:1;[m
[31m-    unsigned                          waited:1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    unsigned                          cached:1;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    unsigned                          gzip_tested:1;[m
[31m-    unsigned                          gzip_ok:1;[m
[31m-    unsigned                          gzip_vary:1;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                          proxy:1;[m
[31m-    unsigned                          bypass_cache:1;[m
[31m-    unsigned                          no_cache:1;[m
[31m-[m
[31m-    /*[m
[31m-     * instead of using the request context data in[m
[31m-     * ngx_http_limit_conn_module and ngx_http_limit_req_module[m
[31m-     * we use the single bits in the request structure[m
[31m-     */[m
[31m-    unsigned                          limit_conn_set:1;[m
[31m-    unsigned                          limit_req_set:1;[m
[31m-[m
[31m-#if 0[m
[31m-    unsigned                          cacheable:1;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                          pipeline:1;[m
[31m-    unsigned                          chunked:1;[m
[31m-    unsigned                          header_only:1;[m
[31m-    unsigned                          keepalive:1;[m
[31m-    unsigned                          lingering_close:1;[m
[31m-    unsigned                          discard_body:1;[m
[31m-    unsigned                          reading_body:1;[m
[31m-    unsigned                          internal:1;[m
[31m-    unsigned                          error_page:1;[m
[31m-    unsigned                          filter_finalize:1;[m
[31m-    unsigned                          post_action:1;[m
[31m-    unsigned                          request_complete:1;[m
[31m-    unsigned                          request_output:1;[m
[31m-    unsigned                          header_sent:1;[m
[31m-    unsigned                          expect_tested:1;[m
[31m-    unsigned                          root_tested:1;[m
[31m-    unsigned                          done:1;[m
[31m-    unsigned                          logged:1;[m
[31m-[m
[31m-    unsigned                          buffered:4;[m
[31m-[m
[31m-    unsigned                          main_filter_need_in_memory:1;[m
[31m-    unsigned                          filter_need_in_memory:1;[m
[31m-    unsigned                          filter_need_temporary:1;[m
[31m-    unsigned                          allow_ranges:1;[m
[31m-    unsigned                          subrequest_ranges:1;[m
[31m-    unsigned                          single_range:1;[m
[31m-    unsigned                          disable_not_modified:1;[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    unsigned                          stat_reading:1;[m
[31m-    unsigned                          stat_writing:1;[m
[31m-#endif[m
[31m-[m
[31m-    /* used to parse HTTP headers */[m
[31m-[m
[31m-    ngx_uint_t                        state;[m
[31m-[m
[31m-    ngx_uint_t                        header_hash;[m
[31m-    ngx_uint_t                        lowcase_index;[m
[31m-    u_char                            lowcase_header[NGX_HTTP_LC_HEADER_LEN];[m
[31m-[m
[31m-    u_char                           *header_name_start;[m
[31m-    u_char                           *header_name_end;[m
[31m-    u_char                           *header_start;[m
[31m-    u_char                           *header_end;[m
[31m-[m
[31m-    /*[m
[31m-     * a memory that can be reused after parsing a request line[m
[31m-     * via ngx_http_ephemeral_t[m
[31m-     */[m
[31m-[m
[31m-    u_char                           *uri_start;[m
[31m-    u_char                           *uri_end;[m
[31m-    u_char                           *uri_ext;[m
[31m-    u_char                           *args_start;[m
[31m-    u_char                           *request_start;[m
[31m-    u_char                           *request_end;[m
[31m-    u_char                           *method_end;[m
[31m-    u_char                           *schema_start;[m
[31m-    u_char                           *schema_end;[m
[31m-    u_char                           *host_start;[m
[31m-    u_char                           *host_end;[m
[31m-    u_char                           *port_start;[m
[31m-    u_char                           *port_end;[m
[31m-[m
[31m-    unsigned                          http_minor:16;[m
[31m-    unsigned                          http_major:16;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_posted_request_t         terminal_posted_request;[m
[31m-} ngx_http_ephemeral_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_http_ephemeral(r)  (void *) (&r->uri_start)[m
[31m-[m
[31m-[m
[31m-extern ngx_http_header_t       ngx_http_headers_in[];[m
[31m-extern ngx_http_header_out_t   ngx_http_headers_out[];[m
[31m-[m
[31m-[m
[31m-#define ngx_http_set_log_request(log, r)                                      \[m
[31m-    ((ngx_http_log_ctx_t *) log->data)->current_request = r[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request_body.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request_body.c[m
[1mdeleted file mode 100644[m
[1mindex c032109..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request_body.c[m
[1m+++ /dev/null[m
[36m@@ -1,1164 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_probe.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_write_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_read_discarded_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_discard_request_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_buf_t *b);[m
[31m-static ngx_int_t ngx_http_test_expect(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_request_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_request_body_length_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_request_body_chunked_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_read_client_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler)[m
[31m-{[m
[31m-    size_t                     preread;[m
[31m-    ssize_t                    size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    if (r != r->main || r->request_body || r->discard_body) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        rc = ngx_http_v2_read_request_body(r, post_handler);[m
[31m-        goto done;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_test_expect(r) != NGX_OK) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (rb == NULL) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     rb->bufs = NULL;[m
[31m-     *     rb->buf = NULL;[m
[31m-     *     rb->free = NULL;[m
[31m-     *     rb->busy = NULL;[m
[31m-     *     rb->chunked = NULL;[m
[31m-     */[m
[31m-[m
[31m-    rb->rest = -1;[m
[31m-    rb->post_handler = post_handler;[m
[31m-[m
[31m-    r->request_body = rb;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n < 0 && !r->headers_in.chunked) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    preread = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (preread) {[m
[31m-[m
[31m-        /* there is the pre-read part of the request body */[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http client request body preread %uz", preread);[m
[31m-[m
[31m-        out.buf = r->header_in;[m
[31m-        out.next = NULL;[m
[31m-[m
[31m-        rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        r->request_length += preread - (r->header_in->last - r->header_in->pos);[m
[31m-[m
[31m-        if (!r->headers_in.chunked[m
[31m-            && rb->rest > 0[m
[31m-            && rb->rest <= (off_t) (r->header_in->end - r->header_in->last))[m
[31m-        {[m
[31m-            /* the whole request body may be placed in r->header_in */[m
[31m-[m
[31m-            b = ngx_calloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            b->temporary = 1;[m
[31m-            b->start = r->header_in->pos;[m
[31m-            b->pos = r->header_in->pos;[m
[31m-            b->last = r->header_in->last;[m
[31m-            b->end = r->header_in->end;[m
[31m-[m
[31m-            rb->buf = b;[m
[31m-[m
[31m-            r->read_event_handler = ngx_http_read_client_request_body_handler;[m
[31m-            r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-            rc = ngx_http_do_read_client_request_body(r);[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* set rb->rest */[m
[31m-[m
[31m-        if (ngx_http_request_body_filter(r, NULL) != NGX_OK) {[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest == 0) {[m
[31m-        /* the whole request body was pre-read */[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest < 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "negative request body rest");[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    size = clcf->client_body_buffer_size;[m
[31m-    size += size >> 2;[m
[31m-[m
[31m-    /* TODO: honor r->request_body_in_single_buf */[m
[31m-[m
[31m-    if (!r->headers_in.chunked && rb->rest < size) {[m
[31m-        size = (ssize_t) rb->rest;[m
[31m-[m
[31m-        if (r->request_body_in_single_buf) {[m
[31m-            size += preread;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = clcf->client_body_buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    rb->buf = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (rb->buf == NULL) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_read_client_request_body_handler;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (r->request_body_no_buffering[m
[31m-        && (rc == NGX_OK || rc == NGX_AGAIN))[m
[31m-    {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->request_body_no_buffering = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-            r->reading_body = 1;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        post_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        r->main->count--;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_read_unbuffered_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        rc = ngx_http_v2_read_unbuffered_request_body(r);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->reading_body = 0;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (r->connection->read->timedout) {[m
[31m-        r->connection->timedout = 1;[m
[31m-        return NGX_HTTP_REQUEST_TIME_OUT;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->reading_body = 0;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_read_client_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (r->connection->read->timedout) {[m
[31m-        r->connection->timedout = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_do_read_client_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                      rest;[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http read client request body");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        for ( ;; ) {[m
[31m-            if (rb->buf->last == rb->buf->end) {[m
[31m-[m
[31m-                if (rb->buf->pos != rb->buf->last) {[m
[31m-[m
[31m-                    /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                    out.buf = rb->buf;[m
[31m-                    out.next = NULL;[m
[31m-[m
[31m-                    rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    /* update chains */[m
[31m-[m
[31m-                    rc = ngx_http_request_body_filter(r, NULL);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (rb->busy != NULL) {[m
[31m-                    if (r->request_body_no_buffering) {[m
[31m-                        if (c->read->timer_set) {[m
[31m-                            ngx_del_timer(c->read);[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rb->buf->pos = rb->buf->start;[m
[31m-                rb->buf->last = rb->buf->start;[m
[31m-            }[m
[31m-[m
[31m-            size = rb->buf->end - rb->buf->last;[m
[31m-            rest = rb->rest - (rb->buf->last - rb->buf->pos);[m
[31m-[m
[31m-            if ((off_t) size > rest) {[m
[31m-                size = (size_t) rest;[m
[31m-            }[m
[31m-[m
[31m-            n = c->recv(c, rb->buf->last, size);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http client request body recv %z", n);[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client prematurely closed connection");[m
[31m-            }[m
[31m-[m
[31m-            if (n == 0 || n == NGX_ERROR) {[m
[31m-                c->error = 1;[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            rb->buf->last += n;[m
[31m-            r->request_length += n;[m
[31m-[m
[31m-            if (n == rest) {[m
[31m-                /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                out.buf = rb->buf;[m
[31m-                out.next = NULL;[m
[31m-[m
[31m-                rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (rb->rest == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rb->buf->last < rb->buf->end) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http client request body rest %O", rb->rest);[m
[31m-[m
[31m-        if (rb->rest == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (!c->read->ready) {[m
[31m-[m
[31m-            if (r->request_body_no_buffering[m
[31m-                && rb->buf->pos != rb->buf->last)[m
[31m-            {[m
[31m-                /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                out.buf = rb->buf;[m
[31m-                out.next = NULL;[m
[31m-[m
[31m-                rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(c->read, clcf->client_body_timeout);[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        rb->post_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_probe_read_body_done(r);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_write_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_chain_t               *cl, *ln;[m
[31m-    ngx_temp_file_t           *tf;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http write client request body, bufs %p", rb->bufs);[m
[31m-[m
[31m-    if (rb->temp_file == NULL) {[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = clcf->client_body_temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->warn = "a client request body is buffered to a temporary file";[m
[31m-        tf->log_level = r->request_body_file_log_level;[m
[31m-        tf->persistent = r->request_body_in_persistent_file;[m
[31m-        tf->clean = r->request_body_in_clean_file;[m
[31m-[m
[31m-        if (r->request_body_file_group_access) {[m
[31m-            tf->access = 0660;[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = tf;[m
[31m-[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            /* empty body with r->request_body_in_file_only */[m
[31m-[m
[31m-            if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                     tf->persistent, tf->clean, tf->access)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->bufs == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_chain_to_temp_file(rb->temp_file, rb->bufs);[m
[31m-[m
[31m-    /* TODO: n == 0 or not complete and level event */[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rb->temp_file->offset += n;[m
[31m-[m
[31m-    /* mark all buffers as written */[m
[31m-[m
[31m-    for (cl = rb->bufs; cl; /* void */) {[m
[31m-[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-[m
[31m-        ln = cl;[m
[31m-        cl = cl->next;[m
[31m-        ngx_free_chain(r->pool, ln);[m
[31m-    }[m
[31m-[m
[31m-    rb->bufs = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_discard_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t       size;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    if (r != r->main || r->discard_body || r->request_body) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        r->stream->skip_data = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_test_expect(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rev = r->connection->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http set discard body");[m
[31m-[m
[31m-    if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    size = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (size || r->headers_in.chunked) {[m
[31m-        rc = ngx_http_discard_request_body_filter(r, r->header_in);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_discarded_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->lingering_close = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_discarded_request_body_handler;[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->count++;[m
[31m-    r->discard_body = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_discarded_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_msec_t                 timer;[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->lingering_time) {[m
[31m-        timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();[m
[31m-[m
[31m-        if ((ngx_msec_int_t) timer <= 0) {[m
[31m-            r->discard_body = 0;[m
[31m-            r->lingering_close = 0;[m
[31m-            ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        timer = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_discarded_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->discard_body = 0;[m
[31m-        r->lingering_close = 0;[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (timer) {[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        timer *= 1000;[m
[31m-[m
[31m-        if (timer > clcf->lingering_timeout) {[m
[31m-            timer = clcf->lingering_timeout;[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(rev, timer);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_read_discarded_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t     size;[m
[31m-    ssize_t    n;[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_buf_t  b;[m
[31m-    u_char     buffer[NGX_HTTP_DISCARD_BUFFER_SIZE];[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http read discarded body");[m
[31m-[m
[31m-    ngx_memzero(&b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    b.temporary = 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (r->headers_in.content_length_n == 0) {[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!r->connection->read->ready) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        size = (size_t) ngx_min(r->headers_in.content_length_n,[m
[31m-                                NGX_HTTP_DISCARD_BUFFER_SIZE);[m
[31m-[m
[31m-        n = r->connection->recv(r->connection, buffer, size);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            r->connection->error = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b.pos = buffer;[m
[31m-        b.last = buffer + n;[m
[31m-[m
[31m-        rc = ngx_http_discard_request_body_filter(r, &b);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_discard_request_body_filter(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    size_t                    size;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_http_request_body_t  *rb;[m
[31m-[m
[31m-    if (r->headers_in.chunked) {[m
[31m-[m
[31m-        rb = r->request_body;[m
[31m-[m
[31m-        if (rb == NULL) {[m
[31m-[m
[31m-            rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-            if (rb == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));[m
[31m-            if (rb->chunked == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->request_body = rb;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            rc = ngx_http_parse_chunked(r, b, rb->chunked);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a chunk has been parsed successfully */[m
[31m-[m
[31m-                size = b->last - b->pos;[m
[31m-[m
[31m-                if ((off_t) size > rb->chunked->size) {[m
[31m-                    b->pos += (size_t) rb->chunked->size;[m
[31m-                    rb->chunked->size = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    rb->chunked->size -= size;[m
[31m-                    b->pos = b->last;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-[m
[31m-                /* a whole response has been parsed successfully */[m
[31m-[m
[31m-                r->headers_in.content_length_n = 0;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                /* set amount of data we want to see next time */[m
[31m-[m
[31m-                r->headers_in.content_length_n = rb->chunked->length;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* invalid */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "client sent invalid chunked body");[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = b->last - b->pos;[m
[31m-[m
[31m-        if ((off_t) size > r->headers_in.content_length_n) {[m
[31m-            b->pos += (size_t) r->headers_in.content_length_n;[m
[31m-            r->headers_in.content_length_n = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            b->pos = b->last;[m
[31m-            r->headers_in.content_length_n -= size;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_test_expect(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_str_t  *expect;[m
[31m-[m
[31m-    if (r->expect_tested[m
[31m-        || r->headers_in.expect == NULL[m
[31m-        || r->http_version < NGX_HTTP_VERSION_11)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->expect_tested = 1;[m
[31m-[m
[31m-    expect = &r->headers_in.expect->value;[m
[31m-[m
[31m-    if (expect->len != sizeof("100-continue") - 1[m
[31m-        || ngx_strncasecmp(expect->data, (u_char *) "100-continue",[m
[31m-                           sizeof("100-continue") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "send 100 Continue");[m
[31m-[m
[31m-    n = r->connection->send(r->connection,[m
[31m-                            (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF,[m
[31m-                            sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1);[m
[31m-[m
[31m-    if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* we assume that such small packet should be send successfully */[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    if (r->headers_in.chunked) {[m
[31m-        return ngx_http_request_body_chunked_filter(r, in);[m
[31m-[m
[31m-    } else {[m
[31m-        return ngx_http_request_body_length_filter(r, in);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_length_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl, *tl, *out, **ll;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->rest == -1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http request body content length filter");[m
[31m-[m
[31m-        rb->rest = r->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        if (rb->rest == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;[m
[31m-        b->start = cl->buf->pos;[m
[31m-        b->pos = cl->buf->pos;[m
[31m-        b->last = cl->buf->last;[m
[31m-        b->end = cl->buf->end;[m
[31m-        b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-        size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-        if ((off_t) size < rb->rest) {[m
[31m-            cl->buf->pos = cl->buf->last;[m
[31m-            rb->rest -= size;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf->pos += (size_t) rb->rest;[m
[31m-            rb->rest = 0;[m
[31m-            b->last = cl->buf->pos;[m
[31m-            b->last_buf = 1;[m
[31m-        }[m
[31m-[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_read_client_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_chunked_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl, *out, *tl, **ll;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->rest == -1) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http request body chunked filter");[m
[31m-[m
[31m-        rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));[m
[31m-        if (rb->chunked == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.content_length_n = 0;[m
[31m-        rb->rest = 3;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                           "http body chunked buf "[m
[31m-                           "t:%d f:%d %p, pos %p, size: %z file: %O, size: %O",[m
[31m-                           cl->buf->temporary, cl->buf->in_file,[m
[31m-                           cl->buf->start, cl->buf->pos,[m
[31m-                           cl->buf->last - cl->buf->pos,[m
[31m-                           cl->buf->file_pos,[m
[31m-                           cl->buf->file_last - cl->buf->file_pos);[m
[31m-[m
[31m-            rc = ngx_http_parse_chunked(r, cl->buf, rb->chunked);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a chunk has been parsed successfully */[m
[31m-[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                if (clcf->client_max_body_size[m
[31m-                    && clcf->client_max_body_size[m
[31m-                       - r->headers_in.content_length_n < rb->chunked->size)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "client intended to send too large chunked "[m
[31m-                                  "body: %O+%O bytes",[m
[31m-                                  r->headers_in.content_length_n,[m
[31m-                                  rb->chunked->size);[m
[31m-[m
[31m-                    r->lingering_close = 1;[m
[31m-[m
[31m-                    return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;[m
[31m-                }[m
[31m-[m
[31m-                tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-                if (tl == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = tl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->temporary = 1;[m
[31m-                b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;[m
[31m-                b->start = cl->buf->pos;[m
[31m-                b->pos = cl->buf->pos;[m
[31m-                b->last = cl->buf->last;[m
[31m-                b->end = cl->buf->end;[m
[31m-                b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-                *ll = tl;[m
[31m-                ll = &tl->next;[m
[31m-[m
[31m-                size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-                if ((off_t) size > rb->chunked->size) {[m
[31m-                    cl->buf->pos += (size_t) rb->chunked->size;[m
[31m-                    r->headers_in.content_length_n += rb->chunked->size;[m
[31m-                    rb->chunked->size = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    rb->chunked->size -= size;[m
[31m-                    r->headers_in.content_length_n += size;[m
[31m-                    cl->buf->pos = cl->buf->last;[m
[31m-                }[m
[31m-[m
[31m-                b->last = cl->buf->pos;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-[m
[31m-                /* a whole response has been parsed successfully */[m
[31m-[m
[31m-                rb->rest = 0;[m
[31m-[m
[31m-                tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-                if (tl == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = tl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->last_buf = 1;[m
[31m-[m
[31m-                *ll = tl;[m
[31m-                ll = &tl->next;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                /* set rb->rest, amount of data we want to see next time */[m
[31m-[m
[31m-                rb->rest = rb->chunked->length;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* invalid */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "client sent invalid chunked body");[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_read_client_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_request_body_save_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "http body old buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "http body new buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: coalesce neighbouring buffers */[m
[31m-[m
[31m-    if (ngx_chain_add_copy(r->pool, &rb->bufs, in) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest > 0) {[m
[31m-[m
[31m-        if (rb->buf && rb->buf->last == rb->buf->end[m
[31m-            && ngx_http_write_request_body(r) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rb->rest == 0 */[m
[31m-[m
[31m-    if (rb->temp_file || r->request_body_in_file_only) {[m
[31m-[m
[31m-        if (ngx_http_write_request_body(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rb->temp_file->file.offset != 0) {[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->in_file = 1;[m
[31m-            b->file_last = rb->temp_file->file.offset;[m
[31m-            b->file = &rb->temp_file->file;[m
[31m-[m
[31m-            rb->bufs = cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request_body.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request_body.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 0641329..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_request_body.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,1161 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_write_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_read_discarded_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_discard_request_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_buf_t *b);[m
[31m-static ngx_int_t ngx_http_test_expect(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_request_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_request_body_length_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_request_body_chunked_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_read_client_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler)[m
[31m-{[m
[31m-    size_t                     preread;[m
[31m-    ssize_t                    size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    if (r != r->main || r->request_body || r->discard_body) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        rc = ngx_http_v2_read_request_body(r, post_handler);[m
[31m-        goto done;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_test_expect(r) != NGX_OK) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (rb == NULL) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     rb->bufs = NULL;[m
[31m-     *     rb->buf = NULL;[m
[31m-     *     rb->free = NULL;[m
[31m-     *     rb->busy = NULL;[m
[31m-     *     rb->chunked = NULL;[m
[31m-     */[m
[31m-[m
[31m-    rb->rest = -1;[m
[31m-    rb->post_handler = post_handler;[m
[31m-[m
[31m-    r->request_body = rb;[m
[31m-[m
[31m-    if (r->headers_in.content_length_n < 0 && !r->headers_in.chunked) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    preread = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (preread) {[m
[31m-[m
[31m-        /* there is the pre-read part of the request body */[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http client request body preread %uz", preread);[m
[31m-[m
[31m-        out.buf = r->header_in;[m
[31m-        out.next = NULL;[m
[31m-[m
[31m-        rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        r->request_length += preread - (r->header_in->last - r->header_in->pos);[m
[31m-[m
[31m-        if (!r->headers_in.chunked[m
[31m-            && rb->rest > 0[m
[31m-            && rb->rest <= (off_t) (r->header_in->end - r->header_in->last))[m
[31m-        {[m
[31m-            /* the whole request body may be placed in r->header_in */[m
[31m-[m
[31m-            b = ngx_calloc_buf(r->pool);[m
[31m-            if (b == NULL) {[m
[31m-                rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            b->temporary = 1;[m
[31m-            b->start = r->header_in->pos;[m
[31m-            b->pos = r->header_in->pos;[m
[31m-            b->last = r->header_in->last;[m
[31m-            b->end = r->header_in->end;[m
[31m-[m
[31m-            rb->buf = b;[m
[31m-[m
[31m-            r->read_event_handler = ngx_http_read_client_request_body_handler;[m
[31m-            r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-            rc = ngx_http_do_read_client_request_body(r);[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* set rb->rest */[m
[31m-[m
[31m-        if (ngx_http_request_body_filter(r, NULL) != NGX_OK) {[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest == 0) {[m
[31m-        /* the whole request body was pre-read */[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest < 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "negative request body rest");[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    size = clcf->client_body_buffer_size;[m
[31m-    size += size >> 2;[m
[31m-[m
[31m-    /* TODO: honor r->request_body_in_single_buf */[m
[31m-[m
[31m-    if (!r->headers_in.chunked && rb->rest < size) {[m
[31m-        size = (ssize_t) rb->rest;[m
[31m-[m
[31m-        if (r->request_body_in_single_buf) {[m
[31m-            size += preread;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = clcf->client_body_buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    rb->buf = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (rb->buf == NULL) {[m
[31m-        rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_read_client_request_body_handler;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (r->request_body_no_buffering[m
[31m-        && (rc == NGX_OK || rc == NGX_AGAIN))[m
[31m-    {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->request_body_no_buffering = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-            r->reading_body = 1;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        post_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        r->main->count--;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_read_unbuffered_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        rc = ngx_http_v2_read_unbuffered_request_body(r);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->reading_body = 0;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (r->connection->read->timedout) {[m
[31m-        r->connection->timedout = 1;[m
[31m-        return NGX_HTTP_REQUEST_TIME_OUT;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->reading_body = 0;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_read_client_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    if (r->connection->read->timedout) {[m
[31m-        r->connection->timedout = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_do_read_client_request_body(r);[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_do_read_client_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    off_t                      rest;[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t                out;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http read client request body");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        for ( ;; ) {[m
[31m-            if (rb->buf->last == rb->buf->end) {[m
[31m-[m
[31m-                if (rb->buf->pos != rb->buf->last) {[m
[31m-[m
[31m-                    /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                    out.buf = rb->buf;[m
[31m-                    out.next = NULL;[m
[31m-[m
[31m-                    rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    /* update chains */[m
[31m-[m
[31m-                    rc = ngx_http_request_body_filter(r, NULL);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (rb->busy != NULL) {[m
[31m-                    if (r->request_body_no_buffering) {[m
[31m-                        if (c->read->timer_set) {[m
[31m-                            ngx_del_timer(c->read);[m
[31m-                        }[m
[31m-[m
[31m-                        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rb->buf->pos = rb->buf->start;[m
[31m-                rb->buf->last = rb->buf->start;[m
[31m-            }[m
[31m-[m
[31m-            size = rb->buf->end - rb->buf->last;[m
[31m-            rest = rb->rest - (rb->buf->last - rb->buf->pos);[m
[31m-[m
[31m-            if ((off_t) size > rest) {[m
[31m-                size = (size_t) rest;[m
[31m-            }[m
[31m-[m
[31m-            n = c->recv(c, rb->buf->last, size);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http client request body recv %z", n);[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n == 0) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                              "client prematurely closed connection");[m
[31m-            }[m
[31m-[m
[31m-            if (n == 0 || n == NGX_ERROR) {[m
[31m-                c->error = 1;[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            rb->buf->last += n;[m
[31m-            r->request_length += n;[m
[31m-[m
[31m-            if (n == rest) {[m
[31m-                /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                out.buf = rb->buf;[m
[31m-                out.next = NULL;[m
[31m-[m
[31m-                rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (rb->rest == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rb->buf->last < rb->buf->end) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http client request body rest %O", rb->rest);[m
[31m-[m
[31m-        if (rb->rest == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (!c->read->ready) {[m
[31m-[m
[31m-            if (r->request_body_no_buffering[m
[31m-                && rb->buf->pos != rb->buf->last)[m
[31m-            {[m
[31m-                /* pass buffer to request body filter chain */[m
[31m-[m
[31m-                out.buf = rb->buf;[m
[31m-                out.next = NULL;[m
[31m-[m
[31m-                rc = ngx_http_request_body_filter(r, &out);[m
[31m-[m
[31m-                if (rc != NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(c->read, clcf->client_body_timeout);[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        rb->post_handler(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_write_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_chain_t               *cl, *ln;[m
[31m-    ngx_temp_file_t           *tf;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http write client request body, bufs %p", rb->bufs);[m
[31m-[m
[31m-    if (rb->temp_file == NULL) {[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = clcf->client_body_temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->warn = "a client request body is buffered to a temporary file";[m
[31m-        tf->log_level = r->request_body_file_log_level;[m
[31m-        tf->persistent = r->request_body_in_persistent_file;[m
[31m-        tf->clean = r->request_body_in_clean_file;[m
[31m-[m
[31m-        if (r->request_body_file_group_access) {[m
[31m-            tf->access = 0660;[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = tf;[m
[31m-[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            /* empty body with r->request_body_in_file_only */[m
[31m-[m
[31m-            if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                     tf->persistent, tf->clean, tf->access)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->bufs == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_chain_to_temp_file(rb->temp_file, rb->bufs);[m
[31m-[m
[31m-    /* TODO: n == 0 or not complete and level event */[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rb->temp_file->offset += n;[m
[31m-[m
[31m-    /* mark all buffers as written */[m
[31m-[m
[31m-    for (cl = rb->bufs; cl; /* void */) {[m
[31m-[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-[m
[31m-        ln = cl;[m
[31m-        cl = cl->next;[m
[31m-        ngx_free_chain(r->pool, ln);[m
[31m-    }[m
[31m-[m
[31m-    rb->bufs = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_discard_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ssize_t       size;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    if (r != r->main || r->discard_body || r->request_body) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        r->stream->skip_data = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_test_expect(r) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rev = r->connection->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http set discard body");[m
[31m-[m
[31m-    if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    size = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-    if (size || r->headers_in.chunked) {[m
[31m-        rc = ngx_http_discard_request_body_filter(r, r->header_in);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_discarded_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->lingering_close = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_discarded_request_body_handler;[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->count++;[m
[31m-    r->discard_body = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_discarded_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_msec_t                 timer;[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->lingering_time) {[m
[31m-        timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();[m
[31m-[m
[31m-        if ((ngx_msec_int_t) timer <= 0) {[m
[31m-            r->discard_body = 0;[m
[31m-            r->lingering_close = 0;[m
[31m-            ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        timer = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_read_discarded_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        r->discard_body = 0;[m
[31m-        r->lingering_close = 0;[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        c->error = 1;[m
[31m-        ngx_http_finalize_request(r, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (timer) {[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        timer *= 1000;[m
[31m-[m
[31m-        if (timer > clcf->lingering_timeout) {[m
[31m-            timer = clcf->lingering_timeout;[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(rev, timer);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_read_discarded_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t     size;[m
[31m-    ssize_t    n;[m
[31m-    ngx_int_t  rc;[m
[31m-    ngx_buf_t  b;[m
[31m-    u_char     buffer[NGX_HTTP_DISCARD_BUFFER_SIZE];[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http read discarded body");[m
[31m-[m
[31m-    ngx_memzero(&b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    b.temporary = 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (r->headers_in.content_length_n == 0) {[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!r->connection->read->ready) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        size = (size_t) ngx_min(r->headers_in.content_length_n,[m
[31m-                                NGX_HTTP_DISCARD_BUFFER_SIZE);[m
[31m-[m
[31m-        n = r->connection->recv(r->connection, buffer, size);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            r->connection->error = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        b.pos = buffer;[m
[31m-        b.last = buffer + n;[m
[31m-[m
[31m-        rc = ngx_http_discard_request_body_filter(r, &b);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_discard_request_body_filter(ngx_http_request_t *r, ngx_buf_t *b)[m
[31m-{[m
[31m-    size_t                    size;[m
[31m-    ngx_int_t                 rc;[m
[31m-    ngx_http_request_body_t  *rb;[m
[31m-[m
[31m-    if (r->headers_in.chunked) {[m
[31m-[m
[31m-        rb = r->request_body;[m
[31m-[m
[31m-        if (rb == NULL) {[m
[31m-[m
[31m-            rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-            if (rb == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));[m
[31m-            if (rb->chunked == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            r->request_body = rb;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            rc = ngx_http_parse_chunked(r, b, rb->chunked);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a chunk has been parsed successfully */[m
[31m-[m
[31m-                size = b->last - b->pos;[m
[31m-[m
[31m-                if ((off_t) size > rb->chunked->size) {[m
[31m-                    b->pos += (size_t) rb->chunked->size;[m
[31m-                    rb->chunked->size = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    rb->chunked->size -= size;[m
[31m-                    b->pos = b->last;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-[m
[31m-                /* a whole response has been parsed successfully */[m
[31m-[m
[31m-                r->headers_in.content_length_n = 0;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                /* set amount of data we want to see next time */[m
[31m-[m
[31m-                r->headers_in.content_length_n = rb->chunked->length;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* invalid */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "client sent invalid chunked body");[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = b->last - b->pos;[m
[31m-[m
[31m-        if ((off_t) size > r->headers_in.content_length_n) {[m
[31m-            b->pos += (size_t) r->headers_in.content_length_n;[m
[31m-            r->headers_in.content_length_n = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            b->pos = b->last;[m
[31m-            r->headers_in.content_length_n -= size;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_test_expect(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_str_t  *expect;[m
[31m-[m
[31m-    if (r->expect_tested[m
[31m-        || r->headers_in.expect == NULL[m
[31m-        || r->http_version < NGX_HTTP_VERSION_11)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->expect_tested = 1;[m
[31m-[m
[31m-    expect = &r->headers_in.expect->value;[m
[31m-[m
[31m-    if (expect->len != sizeof("100-continue") - 1[m
[31m-        || ngx_strncasecmp(expect->data, (u_char *) "100-continue",[m
[31m-                           sizeof("100-continue") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "send 100 Continue");[m
[31m-[m
[31m-    n = r->connection->send(r->connection,[m
[31m-                            (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF,[m
[31m-                            sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1);[m
[31m-[m
[31m-    if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* we assume that such small packet should be send successfully */[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    if (r->headers_in.chunked) {[m
[31m-        return ngx_http_request_body_chunked_filter(r, in);[m
[31m-[m
[31m-    } else {[m
[31m-        return ngx_http_request_body_length_filter(r, in);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_length_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl, *tl, *out, **ll;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->rest == -1) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http request body content length filter");[m
[31m-[m
[31m-        rb->rest = r->headers_in.content_length_n;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        if (rb->rest == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-        if (tl == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b = tl->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;[m
[31m-        b->start = cl->buf->pos;[m
[31m-        b->pos = cl->buf->pos;[m
[31m-        b->last = cl->buf->last;[m
[31m-        b->end = cl->buf->end;[m
[31m-        b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-        size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-        if ((off_t) size < rb->rest) {[m
[31m-            cl->buf->pos = cl->buf->last;[m
[31m-            rb->rest -= size;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->buf->pos += (size_t) rb->rest;[m
[31m-            rb->rest = 0;[m
[31m-            b->last = cl->buf->pos;[m
[31m-            b->last_buf = 1;[m
[31m-        }[m
[31m-[m
[31m-        *ll = tl;[m
[31m-        ll = &tl->next;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_read_client_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_request_body_chunked_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl, *out, *tl, **ll;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->rest == -1) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http request body chunked filter");[m
[31m-[m
[31m-        rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));[m
[31m-        if (rb->chunked == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.content_length_n = 0;[m
[31m-        rb->rest = 3;[m
[31m-    }[m
[31m-[m
[31m-    out = NULL;[m
[31m-    ll = &out;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                           "http body chunked buf "[m
[31m-                           "t:%d f:%d %p, pos %p, size: %z file: %O, size: %O",[m
[31m-                           cl->buf->temporary, cl->buf->in_file,[m
[31m-                           cl->buf->start, cl->buf->pos,[m
[31m-                           cl->buf->last - cl->buf->pos,[m
[31m-                           cl->buf->file_pos,[m
[31m-                           cl->buf->file_last - cl->buf->file_pos);[m
[31m-[m
[31m-            rc = ngx_http_parse_chunked(r, cl->buf, rb->chunked);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                /* a chunk has been parsed successfully */[m
[31m-[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                if (clcf->client_max_body_size[m
[31m-                    && clcf->client_max_body_size[m
[31m-                       - r->headers_in.content_length_n < rb->chunked->size)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                                  "client intended to send too large chunked "[m
[31m-                                  "body: %O+%O bytes",[m
[31m-                                  r->headers_in.content_length_n,[m
[31m-                                  rb->chunked->size);[m
[31m-[m
[31m-                    r->lingering_close = 1;[m
[31m-[m
[31m-                    return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;[m
[31m-                }[m
[31m-[m
[31m-                tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-                if (tl == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = tl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->temporary = 1;[m
[31m-                b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;[m
[31m-                b->start = cl->buf->pos;[m
[31m-                b->pos = cl->buf->pos;[m
[31m-                b->last = cl->buf->last;[m
[31m-                b->end = cl->buf->end;[m
[31m-                b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-                *ll = tl;[m
[31m-                ll = &tl->next;[m
[31m-[m
[31m-                size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-                if ((off_t) size > rb->chunked->size) {[m
[31m-                    cl->buf->pos += (size_t) rb->chunked->size;[m
[31m-                    r->headers_in.content_length_n += rb->chunked->size;[m
[31m-                    rb->chunked->size = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    rb->chunked->size -= size;[m
[31m-                    r->headers_in.content_length_n += size;[m
[31m-                    cl->buf->pos = cl->buf->last;[m
[31m-                }[m
[31m-[m
[31m-                b->last = cl->buf->pos;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-[m
[31m-                /* a whole response has been parsed successfully */[m
[31m-[m
[31m-                rb->rest = 0;[m
[31m-[m
[31m-                tl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-                if (tl == NULL) {[m
[31m-                    return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                b = tl->buf;[m
[31m-[m
[31m-                ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-                b->last_buf = 1;[m
[31m-[m
[31m-                *ll = tl;[m
[31m-                ll = &tl->next;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-                /* set rb->rest, amount of data we want to see next time */[m
[31m-[m
[31m-                rb->rest = rb->chunked->length;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* invalid */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "client sent invalid chunked body");[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, out);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_read_client_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_request_body_save_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-    for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "http body old buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,[m
[31m-                       "http body new buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: coalesce neighbouring buffers */[m
[31m-[m
[31m-    if (ngx_chain_add_copy(r->pool, &rb->bufs, in) != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->rest > 0) {[m
[31m-[m
[31m-        if (rb->buf && rb->buf->last == rb->buf->end[m
[31m-            && ngx_http_write_request_body(r) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rb->rest == 0 */[m
[31m-[m
[31m-    if (rb->temp_file || r->request_body_in_file_only) {[m
[31m-[m
[31m-        if (ngx_http_write_request_body(r) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rb->temp_file->file.offset != 0) {[m
[31m-[m
[31m-            cl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->in_file = 1;[m
[31m-            b->file_last = rb->temp_file->file.offset;[m
[31m-            b->file = &rb->temp_file->file;[m
[31m-[m
[31m-            rb->bufs = cl;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_script.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_script.c[m
[1mdeleted file mode 100644[m
[1mindex bff9525..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_script.c[m
[1m+++ /dev/null[m
[36m@@ -1,1754 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_script_init_arrays(ngx_http_script_compile_t *sc);[m
[31m-static ngx_int_t ngx_http_script_done(ngx_http_script_compile_t *sc);[m
[31m-static ngx_int_t ngx_http_script_add_copy_code(ngx_http_script_compile_t *sc,[m
[31m-    ngx_str_t *value, ngx_uint_t last);[m
[31m-static ngx_int_t ngx_http_script_add_var_code(ngx_http_script_compile_t *sc,[m
[31m-    ngx_str_t *name);[m
[31m-static ngx_int_t ngx_http_script_add_args_code(ngx_http_script_compile_t *sc);[m
[31m-#if (NGX_PCRE)[m
[31m-static ngx_int_t ngx_http_script_add_capture_code(ngx_http_script_compile_t *sc,[m
[31m-    ngx_uint_t n);[m
[31m-#endif[m
[31m-static ngx_int_t[m
[31m-    ngx_http_script_add_full_name_code(ngx_http_script_compile_t *sc);[m
[31m-static size_t ngx_http_script_full_name_len_code(ngx_http_script_engine_t *e);[m
[31m-static void ngx_http_script_full_name_code(ngx_http_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_script_exit  (u_char *) &ngx_http_script_exit_code[m
[31m-[m
[31m-static uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_flush_complex_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *val)[m
[31m-{[m
[31m-    ngx_uint_t *index;[m
[31m-[m
[31m-    index = val->flushes;[m
[31m-[m
[31m-    if (index) {[m
[31m-        while (*index != (ngx_uint_t) -1) {[m
[31m-[m
[31m-            if (r->variables[*index].no_cacheable) {[m
[31m-                r->variables[*index].valid = 0;[m
[31m-                r->variables[*index].not_found = 0;[m
[31m-            }[m
[31m-[m
[31m-            index++;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_complex_value(ngx_http_request_t *r, ngx_http_complex_value_t *val,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    size_t                        len;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-[m
[31m-    if (val->lengths == NULL) {[m
[31m-        *value = val->value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_script_flush_complex_value(r, val);[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    e.ip = val->lengths;[m
[31m-    e.request = r;[m
[31m-    e.flushed = 1;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-        len += lcode(&e);[m
[31m-    }[m
[31m-[m
[31m-    value->len = len;[m
[31m-    value->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (value->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    e.ip = val->values;[m
[31m-    e.pos = value->data;[m
[31m-    e.buf = *value;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-        code((ngx_http_script_engine_t *) &e);[m
[31m-    }[m
[31m-[m
[31m-    *value = e.buf;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv)[m
[31m-{[m
[31m-    ngx_str_t                  *v;[m
[31m-    ngx_uint_t                  i, n, nv, nc;[m
[31m-    ngx_array_t                 flushes, lengths, values, *pf, *pl, *pv;[m
[31m-    ngx_http_script_compile_t   sc;[m
[31m-[m
[31m-    v = ccv->value;[m
[31m-[m
[31m-    nv = 0;[m
[31m-    nc = 0;[m
[31m-[m
[31m-    for (i = 0; i < v->len; i++) {[m
[31m-        if (v->data[i] == '$') {[m
[31m-            if (v->data[i + 1] >= '1' && v->data[i + 1] <= '9') {[m
[31m-                nc++;[m
[31m-[m
[31m-            } else {[m
[31m-                nv++;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((v->len == 0 || v->data[0] != '$')[m
[31m-        && (ccv->conf_prefix || ccv->root_prefix))[m
[31m-    {[m
[31m-        if (ngx_conf_full_name(ccv->cf->cycle, v, ccv->conf_prefix) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ccv->conf_prefix = 0;[m
[31m-        ccv->root_prefix = 0;[m
[31m-    }[m
[31m-[m
[31m-    ccv->complex_value->value = *v;[m
[31m-    ccv->complex_value->flushes = NULL;[m
[31m-    ccv->complex_value->lengths = NULL;[m
[31m-    ccv->complex_value->values = NULL;[m
[31m-[m
[31m-    if (nv == 0 && nc == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = nv + 1;[m
[31m-[m
[31m-    if (ngx_array_init(&flushes, ccv->cf->pool, n, sizeof(ngx_uint_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = nv * (2 * sizeof(ngx_http_script_copy_code_t)[m
[31m-                  + sizeof(ngx_http_script_var_code_t))[m
[31m-        + sizeof(uintptr_t);[m
[31m-[m
[31m-    if (ngx_array_init(&lengths, ccv->cf->pool, n, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = (nv * (2 * sizeof(ngx_http_script_copy_code_t)[m
[31m-                   + sizeof(ngx_http_script_var_code_t))[m
[31m-                + sizeof(uintptr_t)[m
[31m-                + v->len[m
[31m-                + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-    if (ngx_array_init(&values, ccv->cf->pool, n, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pf = &flushes;[m
[31m-    pl = &lengths;[m
[31m-    pv = &values;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = ccv->cf;[m
[31m-    sc.source = v;[m
[31m-    sc.flushes = &pf;[m
[31m-    sc.lengths = &pl;[m
[31m-    sc.values = &pv;[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-    sc.zero = ccv->zero;[m
[31m-    sc.conf_prefix = ccv->conf_prefix;[m
[31m-    sc.root_prefix = ccv->root_prefix;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (flushes.nelts) {[m
[31m-        ccv->complex_value->flushes = flushes.elts;[m
[31m-        ccv->complex_value->flushes[flushes.nelts] = (ngx_uint_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    ccv->complex_value->lengths = lengths.elts;[m
[31m-    ccv->complex_value->values = values.elts;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_http_complex_value_t          **cv;[m
[31m-    ngx_http_compile_complex_value_t    ccv;[m
[31m-[m
[31m-    cv = (ngx_http_complex_value_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*cv != NULL) {[m
[31m-        return "duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *cv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-    if (*cv == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = *cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_test_predicates(ngx_http_request_t *r, ngx_array_t *predicates)[m
[31m-{[m
[31m-    ngx_str_t                  val;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_complex_value_t  *cv;[m
[31m-[m
[31m-    if (predicates == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cv = predicates->elts;[m
[31m-[m
[31m-    for (i = 0; i < predicates->nelts; i++) {[m
[31m-        if (ngx_http_complex_value(r, &cv[i], &val) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (val.len && (val.len != 1 || val.data[0] != '0')) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_set_predicate_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_uint_t                          i;[m
[31m-    ngx_array_t                       **a;[m
[31m-    ngx_http_complex_value_t           *cv;[m
[31m-    ngx_http_compile_complex_value_t    ccv;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NGX_CONF_UNSET_PTR) {[m
[31m-        *a = ngx_array_create(cf->pool, 1, sizeof(ngx_http_complex_value_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        cv = ngx_array_push(*a);[m
[31m-        if (cv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[i];[m
[31m-        ccv.complex_value = cv;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ngx_http_script_variables_count(ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_uint_t  i, n;[m
[31m-[m
[31m-    for (n = 0, i = 0; i < value->len; i++) {[m
[31m-        if (value->data[i] == '$') {[m
[31m-            n++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_script_compile(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    u_char       ch;[m
[31m-    ngx_str_t    name;[m
[31m-    ngx_uint_t   i, bracket;[m
[31m-[m
[31m-    if (ngx_http_script_init_arrays(sc) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < sc->source->len; /* void */ ) {[m
[31m-[m
[31m-        name.len = 0;[m
[31m-[m
[31m-        if (sc->source->data[i] == '$') {[m
[31m-[m
[31m-            if (++i == sc->source->len) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            {[m
[31m-            ngx_uint_t  n;[m
[31m-[m
[31m-            if (sc->source->data[i] >= '1' && sc->source->data[i] <= '9') {[m
[31m-[m
[31m-                n = sc->source->data[i] - '0';[m
[31m-[m
[31m-                if (sc->captures_mask & (1 << n)) {[m
[31m-                    sc->dup_capture = 1;[m
[31m-                }[m
[31m-[m
[31m-                sc->captures_mask |= 1 << n;[m
[31m-[m
[31m-                if (ngx_http_script_add_capture_code(sc, n) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                i++;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            if (sc->source->data[i] == '{') {[m
[31m-                bracket = 1;[m
[31m-[m
[31m-                if (++i == sc->source->len) {[m
[31m-                    goto invalid_variable;[m
[31m-                }[m
[31m-[m
[31m-                name.data = &sc->source->data[i];[m
[31m-[m
[31m-            } else {[m
[31m-                bracket = 0;[m
[31m-                name.data = &sc->source->data[i];[m
[31m-            }[m
[31m-[m
[31m-            for ( /* void */ ; i < sc->source->len; i++, name.len++) {[m
[31m-                ch = sc->source->data[i];[m
[31m-[m
[31m-                if (ch == '}' && bracket) {[m
[31m-                    i++;[m
[31m-                    bracket = 0;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if ((ch >= 'A' && ch <= 'Z')[m
[31m-                    || (ch >= 'a' && ch <= 'z')[m
[31m-                    || (ch >= '0' && ch <= '9')[m
[31m-                    || ch == '_')[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (bracket) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0,[m
[31m-                                   "the closing bracket in \"%V\" "[m
[31m-                                   "variable is missing", &name);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (name.len == 0) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            sc->variables++;[m
[31m-[m
[31m-            if (ngx_http_script_add_var_code(sc, &name) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (sc->source->data[i] == '?' && sc->compile_args) {[m
[31m-            sc->args = 1;[m
[31m-            sc->compile_args = 0;[m
[31m-[m
[31m-            if (ngx_http_script_add_args_code(sc) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        name.data = &sc->source->data[i];[m
[31m-[m
[31m-        while (i < sc->source->len) {[m
[31m-[m
[31m-            if (sc->source->data[i] == '$') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (sc->source->data[i] == '?') {[m
[31m-[m
[31m-                sc->args = 1;[m
[31m-[m
[31m-                if (sc->compile_args) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-            name.len++;[m
[31m-        }[m
[31m-[m
[31m-        sc->size += name.len;[m
[31m-[m
[31m-        if (ngx_http_script_add_copy_code(sc, &name, (i == sc->source->len))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_script_done(sc);[m
[31m-[m
[31m-invalid_variable:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, "invalid variable name");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value,[m
[31m-    void *code_lengths, size_t len, void *code_values)[m
[31m-{[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_http_script_code_pt       code;[m
[31m-    ngx_http_script_len_code_pt   lcode;[m
[31m-    ngx_http_script_engine_t      e;[m
[31m-    ngx_http_core_main_conf_t    *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    for (i = 0; i < cmcf->variables.nelts; i++) {[m
[31m-        if (r->variables[i].no_cacheable) {[m
[31m-            r->variables[i].valid = 0;[m
[31m-            r->variables[i].not_found = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    e.ip = code_lengths;[m
[31m-    e.request = r;[m
[31m-    e.flushed = 1;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) e.ip;[m
[31m-        len += lcode(&e);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    value->len = len;[m
[31m-    value->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (value->data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    e.ip = code_values;[m
[31m-    e.pos = value->data;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        code = *(ngx_http_script_code_pt *) e.ip;[m
[31m-        code((ngx_http_script_engine_t *) &e);[m
[31m-    }[m
[31m-[m
[31m-    return e.pos;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r,[m
[31m-    ngx_array_t *indices)[m
[31m-{[m
[31m-    ngx_uint_t  n, *index;[m
[31m-[m
[31m-    if (indices) {[m
[31m-        index = indices->elts;[m
[31m-        for (n = 0; n < indices->nelts; n++) {[m
[31m-            if (r->variables[index[n]].no_cacheable) {[m
[31m-                r->variables[index[n]].valid = 0;[m
[31m-                r->variables[index[n]].not_found = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_init_arrays(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    ngx_uint_t   n;[m
[31m-[m
[31m-    if (sc->flushes && *sc->flushes == NULL) {[m
[31m-        n = sc->variables ? sc->variables : 1;[m
[31m-        *sc->flushes = ngx_array_create(sc->cf->pool, n, sizeof(ngx_uint_t));[m
[31m-        if (*sc->flushes == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (*sc->lengths == NULL) {[m
[31m-        n = sc->variables * (2 * sizeof(ngx_http_script_copy_code_t)[m
[31m-                             + sizeof(ngx_http_script_var_code_t))[m
[31m-            + sizeof(uintptr_t);[m
[31m-[m
[31m-        *sc->lengths = ngx_array_create(sc->cf->pool, n, 1);[m
[31m-        if (*sc->lengths == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (*sc->values == NULL) {[m
[31m-        n = (sc->variables * (2 * sizeof(ngx_http_script_copy_code_t)[m
[31m-                              + sizeof(ngx_http_script_var_code_t))[m
[31m-                + sizeof(uintptr_t)[m
[31m-                + sc->source->len[m
[31m-                + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        *sc->values = ngx_array_create(sc->cf->pool, n, 1);[m
[31m-        if (*sc->values == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sc->variables = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_done(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    ngx_str_t    zero;[m
[31m-    uintptr_t   *code;[m
[31m-[m
[31m-    if (sc->zero) {[m
[31m-[m
[31m-        zero.len = 1;[m
[31m-        zero.data = (u_char *) "\0";[m
[31m-[m
[31m-        if (ngx_http_script_add_copy_code(sc, &zero, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (sc->conf_prefix || sc->root_prefix) {[m
[31m-        if (ngx_http_script_add_full_name_code(sc) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (sc->complete_lengths) {[m
[31m-        code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL);[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (sc->complete_values) {[m
[31m-        code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t),[m
[31m-                                        &sc->main);[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes, size_t size)[m
[31m-{[m
[31m-    if (*codes == NULL) {[m
[31m-        *codes = ngx_array_create(pool, 256, 1);[m
[31m-        if (*codes == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_array_push_n(*codes, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code)[m
[31m-{[m
[31m-    u_char  *elts, **p;[m
[31m-    void    *new;[m
[31m-[m
[31m-    elts = codes->elts;[m
[31m-[m
[31m-    new = ngx_array_push_n(codes, size);[m
[31m-    if (new == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (code) {[m
[31m-        if (elts != codes->elts) {[m
[31m-            p = code;[m
[31m-            *p += (u_char *) codes->elts - elts;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return new;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_copy_code(ngx_http_script_compile_t *sc, ngx_str_t *value,[m
[31m-    ngx_uint_t last)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    size_t                        size, len, zero;[m
[31m-    ngx_http_script_copy_code_t  *code;[m
[31m-[m
[31m-    zero = (sc->zero && last);[m
[31m-    len = value->len + zero;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_code_t), NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;[m
[31m-    code->len = len;[m
[31m-[m
[31m-    size = (sizeof(ngx_http_script_copy_code_t) + len + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values, size, &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_script_copy_code;[m
[31m-    code->len = len;[m
[31m-[m
[31m-    p = ngx_cpymem((u_char *) code + sizeof(ngx_http_script_copy_code_t),[m
[31m-                   value->data, value->len);[m
[31m-[m
[31m-    if (zero) {[m
[31m-        *p = '\0';[m
[31m-        sc->zero = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_script_copy_len_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_copy_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_copy_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_copy_code_t);[m
[31m-[m
[31m-    return code->len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_copy_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    ngx_http_script_copy_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_copy_code_t *) e->ip;[m
[31m-[m
[31m-    p = e->pos;[m
[31m-[m
[31m-    if (!e->skip) {[m
[31m-        e->pos = ngx_copy(p, e->ip + sizeof(ngx_http_script_copy_code_t),[m
[31m-                          code->len);[m
[31m-    }[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_copy_code_t)[m
[31m-          + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1));[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script copy: \"%*s\"", e->pos - p, p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_var_code(ngx_http_script_compile_t *sc, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_int_t                    index, *p;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(sc->cf, name);[m
[31m-[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sc->flushes) {[m
[31m-        p = ngx_array_push(*sc->flushes);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *p = index;[m
[31m-    }[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_script_var_code_t), NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_script_code_pt) ngx_http_script_copy_var_len_code;[m
[31m-    code->index = (uintptr_t) index;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values,[m
[31m-                                    sizeof(ngx_http_script_var_code_t),[m
[31m-                                    &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_script_copy_var_code;[m
[31m-    code->index = (uintptr_t) index;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_variable_value_t   *value;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_code_t);[m
[31m-[m
[31m-    if (e->flushed) {[m
[31m-        value = ngx_http_get_indexed_variable(e->request, code->index);[m
[31m-[m
[31m-    } else {[m
[31m-        value = ngx_http_get_flushed_variable(e->request, code->index);[m
[31m-    }[m
[31m-[m
[31m-    if (value && !value->not_found) {[m
[31m-        return value->len;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_copy_var_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_http_variable_value_t   *value;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_code_t);[m
[31m-[m
[31m-    if (!e->skip) {[m
[31m-[m
[31m-        if (e->flushed) {[m
[31m-            value = ngx_http_get_indexed_variable(e->request, code->index);[m
[31m-[m
[31m-        } else {[m
[31m-            value = ngx_http_get_flushed_variable(e->request, code->index);[m
[31m-        }[m
[31m-[m
[31m-        if (value && !value->not_found) {[m
[31m-            p = e->pos;[m
[31m-            e->pos = ngx_copy(p, value->data, value->len);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP,[m
[31m-                           e->request->connection->log, 0,[m
[31m-                           "http script var: \"%*s\"", e->pos - p, p);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_args_code(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    uintptr_t   *code;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) ngx_http_script_mark_args_code;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t), &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *code = (uintptr_t) ngx_http_script_start_args_code;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_script_mark_args_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    e->is_args = 1;[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_start_args_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script args");[m
[31m-[m
[31m-    e->is_args = 1;[m
[31m-    e->args = e->pos;[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    size_t                         len;[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_uint_t                     n;[m
[31m-    ngx_http_request_t            *r;[m
[31m-    ngx_http_script_engine_t       le;[m
[31m-    ngx_http_script_len_code_pt    lcode;[m
[31m-    ngx_http_script_regex_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_regex_code_t *) e->ip;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http script regex: \"%V\"", &code->name);[m
[31m-[m
[31m-    if (code->uri) {[m
[31m-        e->line = r->uri;[m
[31m-    } else {[m
[31m-        e->sp--;[m
[31m-        e->line.len = e->sp->len;[m
[31m-        e->line.data = e->sp->data;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_regex_exec(r, code->regex, &e->line);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                          "\"%V\" does not match \"%V\"",[m
[31m-                          &code->name, &e->line);[m
[31m-        }[m
[31m-[m
[31m-        r->ncaptures = 0;[m
[31m-[m
[31m-        if (code->test) {[m
[31m-            if (code->negative_test) {[m
[31m-                e->sp->len = 1;[m
[31m-                e->sp->data = (u_char *) "1";[m
[31m-[m
[31m-            } else {[m
[31m-                e->sp->len = 0;[m
[31m-                e->sp->data = (u_char *) "";[m
[31m-            }[m
[31m-[m
[31m-            e->sp++;[m
[31m-[m
[31m-            e->ip += sizeof(ngx_http_script_regex_code_t);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        e->ip += code->next;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                      "\"%V\" matches \"%V\"", &code->name, &e->line);[m
[31m-    }[m
[31m-[m
[31m-    if (code->test) {[m
[31m-        if (code->negative_test) {[m
[31m-            e->sp->len = 0;[m
[31m-            e->sp->data = (u_char *) "";[m
[31m-[m
[31m-        } else {[m
[31m-            e->sp->len = 1;[m
[31m-            e->sp->data = (u_char *) "1";[m
[31m-        }[m
[31m-[m
[31m-        e->sp++;[m
[31m-[m
[31m-        e->ip += sizeof(ngx_http_script_regex_code_t);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (code->status) {[m
[31m-        e->status = code->status;[m
[31m-[m
[31m-        if (!code->redirect) {[m
[31m-            e->ip = ngx_http_script_exit;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (code->uri) {[m
[31m-        r->internal = 1;[m
[31m-        r->valid_unparsed_uri = 0;[m
[31m-[m
[31m-        if (code->break_cycle) {[m
[31m-            r->valid_location = 0;[m
[31m-            r->uri_changed = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            r->uri_changed = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (code->lengths == NULL) {[m
[31m-        e->buf.len = code->size;[m
[31m-[m
[31m-        if (code->uri) {[m
[31m-            if (r->ncaptures && (r->quoted_uri || r->plus_in_uri)) {[m
[31m-                e->buf.len += 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len,[m
[31m-                                                 NGX_ESCAPE_ARGS);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for (n = 2; n < r->ncaptures; n += 2) {[m
[31m-            e->buf.len += r->captures[n + 1] - r->captures[n];[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-        le.ip = code->lengths->elts;[m
[31m-        le.line = e->line;[m
[31m-        le.request = r;[m
[31m-        le.quote = code->redirect;[m
[31m-[m
[31m-        len = 0;[m
[31m-[m
[31m-        while (*(uintptr_t *) le.ip) {[m
[31m-            lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-            len += lcode(&le);[m
[31m-        }[m
[31m-[m
[31m-        e->buf.len = len;[m
[31m-    }[m
[31m-[m
[31m-    if (code->add_args && r->args.len) {[m
[31m-        e->buf.len += r->args.len + 1;[m
[31m-    }[m
[31m-[m
[31m-    e->buf.data = ngx_pnalloc(r->pool, e->buf.len);[m
[31m-    if (e->buf.data == NULL) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    e->quote = code->redirect;[m
[31m-[m
[31m-    e->pos = e->buf.data;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_regex_code_t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                            *dst, *src;[m
[31m-    ngx_http_request_t                *r;[m
[31m-    ngx_http_script_regex_end_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_regex_end_code_t *) e->ip;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    e->quote = 0;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http script regex end");[m
[31m-[m
[31m-    if (code->redirect) {[m
[31m-[m
[31m-        dst = e->buf.data;[m
[31m-        src = e->buf.data;[m
[31m-[m
[31m-        ngx_unescape_uri(&dst, &src, e->pos - e->buf.data,[m
[31m-                         NGX_UNESCAPE_REDIRECT);[m
[31m-[m
[31m-        if (src < e->pos) {[m
[31m-            dst = ngx_movemem(dst, src, e->pos - src);[m
[31m-        }[m
[31m-[m
[31m-        e->pos = dst;[m
[31m-[m
[31m-        if (code->add_args && r->args.len) {[m
[31m-            *e->pos++ = (u_char) (code->args ? '&' : '?');[m
[31m-            e->pos = ngx_copy(e->pos, r->args.data, r->args.len);[m
[31m-        }[m
[31m-[m
[31m-        e->buf.len = e->pos - e->buf.data;[m
[31m-[m
[31m-        if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                          "rewritten redirect: \"%V\"", &e->buf);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_clear_location(r);[m
[31m-[m
[31m-        r->headers_out.location = ngx_list_push(&r->headers_out.headers);[m
[31m-        if (r->headers_out.location == NULL) {[m
[31m-            e->ip = ngx_http_script_exit;[m
[31m-            e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.location->hash = 1;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-        r->headers_out.location->value = e->buf;[m
[31m-[m
[31m-        e->ip += sizeof(ngx_http_script_regex_end_code_t);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (e->args) {[m
[31m-        e->buf.len = e->args - e->buf.data;[m
[31m-[m
[31m-        if (code->add_args && r->args.len) {[m
[31m-            *e->pos++ = '&';[m
[31m-            e->pos = ngx_copy(e->pos, r->args.data, r->args.len);[m
[31m-        }[m
[31m-[m
[31m-        r->args.len = e->pos - e->args;[m
[31m-        r->args.data = e->args;[m
[31m-[m
[31m-        e->args = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        e->buf.len = e->pos - e->buf.data;[m
[31m-[m
[31m-        if (!code->add_args) {[m
[31m-            r->args.len = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,[m
[31m-                      "rewritten data: \"%V\", args: \"%V\"",[m
[31m-                      &e->buf, &r->args);[m
[31m-    }[m
[31m-[m
[31m-    if (code->uri) {[m
[31m-        r->uri = e->buf;[m
[31m-[m
[31m-        if (r->uri.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "the rewritten URI has a zero length");[m
[31m-            e->ip = ngx_http_script_exit;[m
[31m-            e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_set_exten(r);[m
[31m-    }[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_regex_end_code_t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_capture_code(ngx_http_script_compile_t *sc, ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_http_script_copy_capture_code_t  *code;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_script_copy_capture_code_t),[m
[31m-                                    NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_script_code_pt)[m
[31m-                      ngx_http_script_copy_capture_len_code;[m
[31m-    code->n = 2 * n;[m
[31m-[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values,[m
[31m-                                    sizeof(ngx_http_script_copy_capture_code_t),[m
[31m-                                    &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_script_copy_capture_code;[m
[31m-    code->n = 2 * n;[m
[31m-[m
[31m-    if (sc->ncaptures < n) {[m
[31m-        sc->ncaptures = n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    int                                  *cap;[m
[31m-    u_char                               *p;[m
[31m-    ngx_uint_t                            n;[m
[31m-    ngx_http_request_t                   *r;[m
[31m-    ngx_http_script_copy_capture_code_t  *code;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    code = (ngx_http_script_copy_capture_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_copy_capture_code_t);[m
[31m-[m
[31m-    n = code->n;[m
[31m-[m
[31m-    if (n < r->ncaptures) {[m
[31m-[m
[31m-        cap = r->captures;[m
[31m-[m
[31m-        if ((e->is_args || e->quote)[m
[31m-            && (e->request->quoted_uri || e->request->plus_in_uri))[m
[31m-        {[m
[31m-            p = r->captures_data;[m
[31m-[m
[31m-            return cap[n + 1] - cap[n][m
[31m-                   + 2 * ngx_escape_uri(NULL, &p[cap[n]], cap[n + 1] - cap[n],[m
[31m-                                        NGX_ESCAPE_ARGS);[m
[31m-        } else {[m
[31m-            return cap[n + 1] - cap[n];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    int                                  *cap;[m
[31m-    u_char                               *p, *pos;[m
[31m-    ngx_uint_t                            n;[m
[31m-    ngx_http_request_t                   *r;[m
[31m-    ngx_http_script_copy_capture_code_t  *code;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    code = (ngx_http_script_copy_capture_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_copy_capture_code_t);[m
[31m-[m
[31m-    n = code->n;[m
[31m-[m
[31m-    pos = e->pos;[m
[31m-[m
[31m-    if (n < r->ncaptures) {[m
[31m-[m
[31m-        cap = r->captures;[m
[31m-        p = r->captures_data;[m
[31m-[m
[31m-        if ((e->is_args || e->quote)[m
[31m-            && (e->request->quoted_uri || e->request->plus_in_uri))[m
[31m-        {[m
[31m-            e->pos = (u_char *) ngx_escape_uri(pos, &p[cap[n]],[m
[31m-                                               cap[n + 1] - cap[n],[m
[31m-                                               NGX_ESCAPE_ARGS);[m
[31m-        } else {[m
[31m-            e->pos = ngx_copy(pos, &p[cap[n]], cap[n + 1] - cap[n]);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script capture: \"%*s\"", e->pos - pos, pos);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_script_add_full_name_code(ngx_http_script_compile_t *sc)[m
[31m-{[m
[31m-    ngx_http_script_full_name_code_t  *code;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_script_full_name_code_t),[m
[31m-                                    NULL);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_script_code_pt) ngx_http_script_full_name_len_code;[m
[31m-    code->conf_prefix = sc->conf_prefix;[m
[31m-[m
[31m-    code = ngx_http_script_add_code(*sc->values,[m
[31m-                                    sizeof(ngx_http_script_full_name_code_t),[m
[31m-                                    &sc->main);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_script_full_name_code;[m
[31m-    code->conf_prefix = sc->conf_prefix;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_script_full_name_len_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_full_name_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_full_name_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_full_name_code_t);[m
[31m-[m
[31m-    return code->conf_prefix ? ngx_cycle->conf_prefix.len:[m
[31m-                               ngx_cycle->prefix.len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_script_full_name_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_full_name_code_t  *code;[m
[31m-[m
[31m-    ngx_str_t  value, *prefix;[m
[31m-[m
[31m-    code = (ngx_http_script_full_name_code_t *) e->ip;[m
[31m-[m
[31m-    value.data = e->buf.data;[m
[31m-    value.len = e->pos - e->buf.data;[m
[31m-[m
[31m-    prefix = code->conf_prefix ? (ngx_str_t *) &ngx_cycle->conf_prefix:[m
[31m-                                 (ngx_str_t *) &ngx_cycle->prefix;[m
[31m-[m
[31m-    if (ngx_get_full_name(e->request->pool, prefix, &value) != NGX_OK) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    e->buf = value;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script fullname: \"%V\"", &value);[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_full_name_code_t);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_return_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_return_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_return_code_t *) e->ip;[m
[31m-[m
[31m-    if (code->status < NGX_HTTP_BAD_REQUEST[m
[31m-        || code->text.value.len[m
[31m-        || code->text.lengths)[m
[31m-    {[m
[31m-        e->status = ngx_http_send_response(e->request, code->status, NULL,[m
[31m-                                           &code->text);[m
[31m-    } else {[m
[31m-        e->status = code->status;[m
[31m-    }[m
[31m-[m
[31m-    e->ip = ngx_http_script_exit;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_break_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    e->request->uri_changed = 0;[m
[31m-[m
[31m-    e->ip = ngx_http_script_exit;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_if_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_if_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_if_code_t *) e->ip;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script if");[m
[31m-[m
[31m-    e->sp--;[m
[31m-[m
[31m-    if (e->sp->len && (e->sp->len != 1 || e->sp->data[0] != '0')) {[m
[31m-        if (code->loc_conf) {[m
[31m-            e->request->loc_conf = code->loc_conf;[m
[31m-            ngx_http_update_location_config(e->request);[m
[31m-        }[m
[31m-[m
[31m-        e->ip += sizeof(ngx_http_script_if_code_t);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script if: false");[m
[31m-[m
[31m-    e->ip += code->next;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_equal_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *val, *res;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script equal");[m
[31m-[m
[31m-    e->sp--;[m
[31m-    val = e->sp;[m
[31m-    res = e->sp - 1;[m
[31m-[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-[m
[31m-    if (val->len == res->len[m
[31m-        && ngx_strncmp(val->data, res->data, res->len) == 0)[m
[31m-    {[m
[31m-        *res = ngx_http_variable_true_value;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script equal: no");[m
[31m-[m
[31m-    *res = ngx_http_variable_null_value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_not_equal_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *val, *res;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script not equal");[m
[31m-[m
[31m-    e->sp--;[m
[31m-    val = e->sp;[m
[31m-    res = e->sp - 1;[m
[31m-[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-[m
[31m-    if (val->len == res->len[m
[31m-        && ngx_strncmp(val->data, res->data, res->len) == 0)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                       "http script not equal: no");[m
[31m-[m
[31m-        *res = ngx_http_variable_null_value;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *res = ngx_http_variable_true_value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_file_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_str_t                     path;[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_open_file_info_t          of;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-    ngx_http_variable_value_t    *value;[m
[31m-    ngx_http_script_file_code_t  *code;[m
[31m-[m
[31m-    value = e->sp - 1;[m
[31m-[m
[31m-    code = (ngx_http_script_file_code_t *) e->ip;[m
[31m-    e->ip += sizeof(ngx_http_script_file_code_t);[m
[31m-[m
[31m-    path.len = value->len - 1;[m
[31m-    path.data = value->data;[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http script file op %p \"%V\"", (void *) code->op, &path);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.read_ahead = clcf->read_ahead;[m
[31m-    of.directio = clcf->directio;[m
[31m-    of.valid = clcf->open_file_cache_valid;[m
[31m-    of.min_uses = clcf->open_file_cache_min_uses;[m
[31m-    of.test_only = 1;[m
[31m-    of.errors = clcf->open_file_cache_errors;[m
[31m-    of.events = clcf->open_file_cache_events;[m
[31m-[m
[31m-    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        if (of.err != NGX_ENOENT[m
[31m-            && of.err != NGX_ENOTDIR[m
[31m-            && of.err != NGX_ENAMETOOLONG)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,[m
[31m-                          "%s \"%s\" failed", of.failed, value->data);[m
[31m-        }[m
[31m-[m
[31m-        switch (code->op) {[m
[31m-[m
[31m-        case ngx_http_script_file_plain:[m
[31m-        case ngx_http_script_file_dir:[m
[31m-        case ngx_http_script_file_exists:[m
[31m-        case ngx_http_script_file_exec:[m
[31m-             goto false_value;[m
[31m-[m
[31m-        case ngx_http_script_file_not_plain:[m
[31m-        case ngx_http_script_file_not_dir:[m
[31m-        case ngx_http_script_file_not_exists:[m
[31m-        case ngx_http_script_file_not_exec:[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-[m
[31m-        goto false_value;[m
[31m-    }[m
[31m-[m
[31m-    switch (code->op) {[m
[31m-    case ngx_http_script_file_plain:[m
[31m-        if (of.is_file) {[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-        goto false_value;[m
[31m-[m
[31m-    case ngx_http_script_file_not_plain:[m
[31m-        if (of.is_file) {[m
[31m-            goto false_value;[m
[31m-        }[m
[31m-        goto true_value;[m
[31m-[m
[31m-    case ngx_http_script_file_dir:[m
[31m-        if (of.is_dir) {[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-        goto false_value;[m
[31m-[m
[31m-    case ngx_http_script_file_not_dir:[m
[31m-        if (of.is_dir) {[m
[31m-            goto false_value;[m
[31m-        }[m
[31m-        goto true_value;[m
[31m-[m
[31m-    case ngx_http_script_file_exists:[m
[31m-        if (of.is_file || of.is_dir || of.is_link) {[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-        goto false_value;[m
[31m-[m
[31m-    case ngx_http_script_file_not_exists:[m
[31m-        if (of.is_file || of.is_dir || of.is_link) {[m
[31m-            goto false_value;[m
[31m-        }[m
[31m-        goto true_value;[m
[31m-[m
[31m-    case ngx_http_script_file_exec:[m
[31m-        if (of.is_exec) {[m
[31m-             goto true_value;[m
[31m-        }[m
[31m-        goto false_value;[m
[31m-[m
[31m-    case ngx_http_script_file_not_exec:[m
[31m-        if (of.is_exec) {[m
[31m-            goto false_value;[m
[31m-        }[m
[31m-        goto true_value;[m
[31m-    }[m
[31m-[m
[31m-false_value:[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http script file op false");[m
[31m-[m
[31m-    *value = ngx_http_variable_null_value;[m
[31m-    return;[m
[31m-[m
[31m-true_value:[m
[31m-[m
[31m-    *value = ngx_http_variable_true_value;[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    size_t                                 len;[m
[31m-    ngx_http_script_engine_t               le;[m
[31m-    ngx_http_script_len_code_pt            lcode;[m
[31m-    ngx_http_script_complex_value_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_complex_value_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_complex_value_code_t);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script complex value");[m
[31m-[m
[31m-    ngx_memzero(&le, sizeof(ngx_http_script_engine_t));[m
[31m-[m
[31m-    le.ip = code->lengths->elts;[m
[31m-    le.line = e->line;[m
[31m-    le.request = e->request;[m
[31m-    le.quote = e->quote;[m
[31m-[m
[31m-    for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {[m
[31m-        lcode = *(ngx_http_script_len_code_pt *) le.ip;[m
[31m-    }[m
[31m-[m
[31m-    e->buf.len = len;[m
[31m-    e->buf.data = ngx_pnalloc(e->request->pool, len);[m
[31m-    if (e->buf.data == NULL) {[m
[31m-        e->ip = ngx_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    e->pos = e->buf.data;[m
[31m-[m
[31m-    e->sp->len = e->buf.len;[m
[31m-    e->sp->data = e->buf.data;[m
[31m-    e->sp++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_value_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_value_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_value_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_value_code_t);[m
[31m-[m
[31m-    e->sp->len = code->text_len;[m
[31m-    e->sp->data = (u_char *) code->text_data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script value: \"%v\"", e->sp);[m
[31m-[m
[31m-    e->sp++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_set_var_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_script_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_code_t);[m
[31m-[m
[31m-    r = e->request;[m
[31m-[m
[31m-    e->sp--;[m
[31m-[m
[31m-    r->variables[code->index].len = e->sp->len;[m
[31m-    r->variables[code->index].valid = 1;[m
[31m-    r->variables[code->index].no_cacheable = 0;[m
[31m-    r->variables[code->index].not_found = 0;[m
[31m-    r->variables[code->index].data = e->sp->data;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v = cmcf->variables.elts;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script set $%V", &v[code->index].name);[m
[31m-    }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_script_var_handler_code_t  *code;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script set var handler");[m
[31m-[m
[31m-    code = (ngx_http_script_var_handler_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_handler_code_t);[m
[31m-[m
[31m-    e->sp--;[m
[31m-[m
[31m-    code->handler(e->request, e->sp, code->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_var_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_variable_value_t   *value;[m
[31m-    ngx_http_script_var_code_t  *code;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script var");[m
[31m-[m
[31m-    code = (ngx_http_script_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_script_var_code_t);[m
[31m-[m
[31m-    value = ngx_http_get_flushed_variable(e->request, code->index);[m
[31m-[m
[31m-    if (value && !value->not_found) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                       "http script var: \"%v\"", value);[m
[31m-[m
[31m-        *e->sp = *value;[m
[31m-        e->sp++;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *e->sp = ngx_http_variable_null_value;[m
[31m-    e->sp++;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_script_nop_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    e->ip += sizeof(uintptr_t);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_script.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_script.h[m
[1mdeleted file mode 100644[m
[1mindex 46592ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_script.h[m
[1m+++ /dev/null[m
[36m@@ -1,257 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_SCRIPT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_SCRIPT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *ip;[m
[31m-    u_char                     *pos;[m
[31m-    ngx_http_variable_value_t  *sp;[m
[31m-[m
[31m-    ngx_str_t                   buf;[m
[31m-    ngx_str_t                   line;[m
[31m-[m
[31m-    /* the start of the rewritten arguments */[m
[31m-    u_char                     *args;[m
[31m-[m
[31m-    unsigned                    flushed:1;[m
[31m-    unsigned                    skip:1;[m
[31m-    unsigned                    quote:1;[m
[31m-    unsigned                    is_args:1;[m
[31m-    unsigned                    log:1;[m
[31m-[m
[31m-    ngx_int_t                   status;[m
[31m-    ngx_http_request_t         *request;[m
[31m-} ngx_http_script_engine_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_t                 *cf;[m
[31m-    ngx_str_t                  *source;[m
[31m-[m
[31m-    ngx_array_t               **flushes;[m
[31m-    ngx_array_t               **lengths;[m
[31m-    ngx_array_t               **values;[m
[31m-[m
[31m-    ngx_uint_t                  variables;[m
[31m-    ngx_uint_t                  ncaptures;[m
[31m-    ngx_uint_t                  captures_mask;[m
[31m-    ngx_uint_t                  size;[m
[31m-[m
[31m-    void                       *main;[m
[31m-[m
[31m-    unsigned                    compile_args:1;[m
[31m-    unsigned                    complete_lengths:1;[m
[31m-    unsigned                    complete_values:1;[m
[31m-    unsigned                    zero:1;[m
[31m-    unsigned                    conf_prefix:1;[m
[31m-    unsigned                    root_prefix:1;[m
[31m-[m
[31m-    unsigned                    dup_capture:1;[m
[31m-    unsigned                    args:1;[m
[31m-} ngx_http_script_compile_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   value;[m
[31m-    ngx_uint_t                 *flushes;[m
[31m-    void                       *lengths;[m
[31m-    void                       *values;[m
[31m-} ngx_http_complex_value_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_conf_t                 *cf;[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_http_complex_value_t   *complex_value;[m
[31m-[m
[31m-    unsigned                    zero:1;[m
[31m-    unsigned                    conf_prefix:1;[m
[31m-    unsigned                    root_prefix:1;[m
[31m-} ngx_http_compile_complex_value_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_script_code_pt) (ngx_http_script_engine_t *e);[m
[31m-typedef size_t (*ngx_http_script_len_code_pt) (ngx_http_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   len;[m
[31m-} ngx_http_script_copy_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   index;[m
[31m-} ngx_http_script_var_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    ngx_http_set_variable_pt    handler;[m
[31m-    uintptr_t                   data;[m
[31m-} ngx_http_script_var_handler_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   n;[m
[31m-} ngx_http_script_copy_capture_code_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    ngx_http_regex_t           *regex;[m
[31m-    ngx_array_t                *lengths;[m
[31m-    uintptr_t                   size;[m
[31m-    uintptr_t                   status;[m
[31m-    uintptr_t                   next;[m
[31m-[m
[31m-    uintptr_t                   test:1;[m
[31m-    uintptr_t                   negative_test:1;[m
[31m-    uintptr_t                   uri:1;[m
[31m-    uintptr_t                   args:1;[m
[31m-[m
[31m-    /* add the r->args to the new arguments */[m
[31m-    uintptr_t                   add_args:1;[m
[31m-[m
[31m-    uintptr_t                   redirect:1;[m
[31m-    uintptr_t                   break_cycle:1;[m
[31m-[m
[31m-    ngx_str_t                   name;[m
[31m-} ngx_http_script_regex_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-[m
[31m-    uintptr_t                   uri:1;[m
[31m-    uintptr_t                   args:1;[m
[31m-[m
[31m-    /* add the r->args to the new arguments */[m
[31m-    uintptr_t                   add_args:1;[m
[31m-[m
[31m-    uintptr_t                   redirect:1;[m
[31m-} ngx_http_script_regex_end_code_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   conf_prefix;[m
[31m-} ngx_http_script_full_name_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   status;[m
[31m-    ngx_http_complex_value_t    text;[m
[31m-} ngx_http_script_return_code_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_http_script_file_plain = 0,[m
[31m-    ngx_http_script_file_not_plain,[m
[31m-    ngx_http_script_file_dir,[m
[31m-    ngx_http_script_file_not_dir,[m
[31m-    ngx_http_script_file_exists,[m
[31m-    ngx_http_script_file_not_exists,[m
[31m-    ngx_http_script_file_exec,[m
[31m-    ngx_http_script_file_not_exec[m
[31m-} ngx_http_script_file_op_e;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   op;[m
[31m-} ngx_http_script_file_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   next;[m
[31m-    void                      **loc_conf;[m
[31m-} ngx_http_script_if_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    ngx_array_t                *lengths;[m
[31m-} ngx_http_script_complex_value_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    uintptr_t                   value;[m
[31m-    uintptr_t                   text_len;[m
[31m-    uintptr_t                   text_data;[m
[31m-} ngx_http_script_value_code_t;[m
[31m-[m
[31m-[m
[31m-void ngx_http_script_flush_complex_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *val);[m
[31m-ngx_int_t ngx_http_complex_value(ngx_http_request_t *r,[m
[31m-    ngx_http_complex_value_t *val, ngx_str_t *value);[m
[31m-ngx_int_t ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv);[m
[31m-char *ngx_http_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_test_predicates(ngx_http_request_t *r,[m
[31m-    ngx_array_t *predicates);[m
[31m-char *ngx_http_set_predicate_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-ngx_uint_t ngx_http_script_variables_count(ngx_str_t *value);[m
[31m-ngx_int_t ngx_http_script_compile(ngx_http_script_compile_t *sc);[m
[31m-u_char *ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value,[m
[31m-    void *code_lengths, size_t reserved, void *code_values);[m
[31m-void ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r,[m
[31m-    ngx_array_t *indices);[m
[31m-[m
[31m-void *ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes,[m
[31m-    size_t size);[m
[31m-void *ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code);[m
[31m-[m
[31m-size_t ngx_http_script_copy_len_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_copy_code(ngx_http_script_engine_t *e);[m
[31m-size_t ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_copy_var_code(ngx_http_script_engine_t *e);[m
[31m-size_t ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e);[m
[31m-size_t ngx_http_script_mark_args_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_start_args_code(ngx_http_script_engine_t *e);[m
[31m-#if (NGX_PCRE)[m
[31m-void ngx_http_script_regex_start_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_regex_end_code(ngx_http_script_engine_t *e);[m
[31m-#endif[m
[31m-void ngx_http_script_return_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_break_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_if_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_equal_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_not_equal_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_file_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_value_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_set_var_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_var_code(ngx_http_script_engine_t *e);[m
[31m-void ngx_http_script_nop_code(ngx_http_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_SCRIPT_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_special_response.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_special_response.c[m
[1mdeleted file mode 100644[m
[1mindex 2771e58..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_special_response.c[m
[1m+++ /dev/null[m
[36m@@ -1,789 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_send_error_page(ngx_http_request_t *r,[m
[31m-    ngx_http_err_page_t *err_page);[m
[31m-static ngx_int_t ngx_http_send_special_response(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_uint_t err);[m
[31m-static ngx_int_t ngx_http_send_refresh(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_error_full_tail[] =[m
[31m-"<hr><center>" NGINX_VER "</center>" CRLF[m
[31m-"</body>" CRLF[m
[31m-"</html>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_error_tail[] =[m
[31m-"<hr><center>nginx</center>" CRLF[m
[31m-"</body>" CRLF[m
[31m-"</html>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_msie_padding[] =[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_msie_refresh_head[] =[m
[31m-"<html><head><meta http-equiv=\"Refresh\" content=\"0; URL=";[m
[31m-[m
[31m-[m
[31m-static u_char ngx_http_msie_refresh_tail[] =[m
[31m-"\"></head><body></body></html>" CRLF;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_301_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>301 Moved Permanently</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>301 Moved Permanently</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_302_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>302 Found</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>302 Found</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_303_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>303 See Other</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>303 See Other</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_307_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>307 Temporary Redirect</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>307 Temporary Redirect</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_400_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 Bad Request</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_401_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>401 Authorization Required</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>401 Authorization Required</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_402_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>402 Payment Required</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>402 Payment Required</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_403_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>403 Forbidden</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>403 Forbidden</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_404_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>404 Not Found</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>404 Not Found</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_405_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>405 Not Allowed</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>405 Not Allowed</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_406_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>406 Not Acceptable</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>406 Not Acceptable</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_408_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>408 Request Time-out</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>408 Request Time-out</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_409_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>409 Conflict</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>409 Conflict</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_410_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>410 Gone</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>410 Gone</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_411_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>411 Length Required</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>411 Length Required</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_412_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>412 Precondition Failed</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>412 Precondition Failed</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_413_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>413 Request Entity Too Large</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>413 Request Entity Too Large</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_414_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>414 Request-URI Too Large</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>414 Request-URI Too Large</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_415_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>415 Unsupported Media Type</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>415 Unsupported Media Type</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_416_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>416 Requested Range Not Satisfiable</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>416 Requested Range Not Satisfiable</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_494_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 Request Header Or Cookie Too Large</title></head>"[m
[31m-CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-"<center>Request Header Or Cookie Too Large</center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_495_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 The SSL certificate error</title></head>"[m
[31m-CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-"<center>The SSL certificate error</center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_496_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 No required SSL certificate was sent</title></head>"[m
[31m-CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-"<center>No required SSL certificate was sent</center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_497_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>"[m
[31m-CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>400 Bad Request</h1></center>" CRLF[m
[31m-"<center>The plain HTTP request was sent to HTTPS port</center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_500_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>500 Internal Server Error</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>500 Internal Server Error</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_501_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>501 Not Implemented</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>501 Not Implemented</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_502_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>502 Bad Gateway</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>502 Bad Gateway</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_503_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>503 Service Temporarily Unavailable</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>503 Service Temporarily Unavailable</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_504_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>504 Gateway Time-out</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>504 Gateway Time-out</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static char ngx_http_error_507_page[] =[m
[31m-"<html>" CRLF[m
[31m-"<head><title>507 Insufficient Storage</title></head>" CRLF[m
[31m-"<body bgcolor=\"white\">" CRLF[m
[31m-"<center><h1>507 Insufficient Storage</h1></center>" CRLF[m
[31m-;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_http_error_pages[] = {[m
[31m-[m
[31m-    ngx_null_string,                     /* 201, 204 */[m
[31m-[m
[31m-#define NGX_HTTP_LAST_2XX  202[m
[31m-#define NGX_HTTP_OFF_3XX   (NGX_HTTP_LAST_2XX - 201)[m
[31m-[m
[31m-    /* ngx_null_string, */               /* 300 */[m
[31m-    ngx_string(ngx_http_error_301_page),[m
[31m-    ngx_string(ngx_http_error_302_page),[m
[31m-    ngx_string(ngx_http_error_303_page),[m
[31m-    ngx_null_string,                     /* 304 */[m
[31m-    ngx_null_string,                     /* 305 */[m
[31m-    ngx_null_string,                     /* 306 */[m
[31m-    ngx_string(ngx_http_error_307_page),[m
[31m-[m
[31m-#define NGX_HTTP_LAST_3XX  308[m
[31m-#define NGX_HTTP_OFF_4XX   (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX)[m
[31m-[m
[31m-    ngx_string(ngx_http_error_400_page),[m
[31m-    ngx_string(ngx_http_error_401_page),[m
[31m-    ngx_string(ngx_http_error_402_page),[m
[31m-    ngx_string(ngx_http_error_403_page),[m
[31m-    ngx_string(ngx_http_error_404_page),[m
[31m-    ngx_string(ngx_http_error_405_page),[m
[31m-    ngx_string(ngx_http_error_406_page),[m
[31m-    ngx_null_string,                     /* 407 */[m
[31m-    ngx_string(ngx_http_error_408_page),[m
[31m-    ngx_string(ngx_http_error_409_page),[m
[31m-    ngx_string(ngx_http_error_410_page),[m
[31m-    ngx_string(ngx_http_error_411_page),[m
[31m-    ngx_string(ngx_http_error_412_page),[m
[31m-    ngx_string(ngx_http_error_413_page),[m
[31m-    ngx_string(ngx_http_error_414_page),[m
[31m-    ngx_string(ngx_http_error_415_page),[m
[31m-    ngx_string(ngx_http_error_416_page),[m
[31m-[m
[31m-#define NGX_HTTP_LAST_4XX  417[m
[31m-#define NGX_HTTP_OFF_5XX   (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)[m
[31m-[m
[31m-    ngx_string(ngx_http_error_494_page), /* 494, request header too large */[m
[31m-    ngx_string(ngx_http_error_495_page), /* 495, https certificate error */[m
[31m-    ngx_string(ngx_http_error_496_page), /* 496, https no certificate */[m
[31m-    ngx_string(ngx_http_error_497_page), /* 497, http to https */[m
[31m-    ngx_string(ngx_http_error_404_page), /* 498, canceled */[m
[31m-    ngx_null_string,                     /* 499, client has closed connection */[m
[31m-[m
[31m-    ngx_string(ngx_http_error_500_page),[m
[31m-    ngx_string(ngx_http_error_501_page),[m
[31m-    ngx_string(ngx_http_error_502_page),[m
[31m-    ngx_string(ngx_http_error_503_page),[m
[31m-    ngx_string(ngx_http_error_504_page),[m
[31m-    ngx_null_string,                     /* 505 */[m
[31m-    ngx_null_string,                     /* 506 */[m
[31m-    ngx_string(ngx_http_error_507_page)[m
[31m-[m
[31m-#define NGX_HTTP_LAST_5XX  508[m
[31m-[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)[m
[31m-{[m
[31m-    ngx_uint_t                 i, err;[m
[31m-    ngx_http_err_page_t       *err_page;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http special response: %i, \"%V?%V\"",[m
[31m-                   error, &r->uri, &r->args);[m
[31m-[m
[31m-    r->err_status = error;[m
[31m-[m
[31m-    if (r->keepalive) {[m
[31m-        switch (error) {[m
[31m-            case NGX_HTTP_BAD_REQUEST:[m
[31m-            case NGX_HTTP_REQUEST_ENTITY_TOO_LARGE:[m
[31m-            case NGX_HTTP_REQUEST_URI_TOO_LARGE:[m
[31m-            case NGX_HTTP_TO_HTTPS:[m
[31m-            case NGX_HTTPS_CERT_ERROR:[m
[31m-            case NGX_HTTPS_NO_CERT:[m
[31m-            case NGX_HTTP_INTERNAL_SERVER_ERROR:[m
[31m-            case NGX_HTTP_NOT_IMPLEMENTED:[m
[31m-                r->keepalive = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->lingering_close) {[m
[31m-        switch (error) {[m
[31m-            case NGX_HTTP_BAD_REQUEST:[m
[31m-            case NGX_HTTP_TO_HTTPS:[m
[31m-            case NGX_HTTPS_CERT_ERROR:[m
[31m-            case NGX_HTTPS_NO_CERT:[m
[31m-                r->lingering_close = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_type.len = 0;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!r->error_page && clcf->error_pages && r->uri_changes != 0) {[m
[31m-[m
[31m-        if (clcf->recursive_error_pages == 0) {[m
[31m-            r->error_page = 1;[m
[31m-        }[m
[31m-[m
[31m-        err_page = clcf->error_pages->elts;[m
[31m-[m
[31m-        for (i = 0; i < clcf->error_pages->nelts; i++) {[m
[31m-            if (err_page[i].status == error) {[m
[31m-                return ngx_http_send_error_page(r, &err_page[i]);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->expect_tested = 1;[m
[31m-[m
[31m-    if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-        r->keepalive = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (clcf->msie_refresh[m
[31m-        && r->headers_in.msie[m
[31m-        && (error == NGX_HTTP_MOVED_PERMANENTLY[m
[31m-            || error == NGX_HTTP_MOVED_TEMPORARILY))[m
[31m-    {[m
[31m-        return ngx_http_send_refresh(r);[m
[31m-    }[m
[31m-[m
[31m-    if (error == NGX_HTTP_CREATED) {[m
[31m-        /* 201 */[m
[31m-        err = 0;[m
[31m-[m
[31m-    } else if (error == NGX_HTTP_NO_CONTENT) {[m
[31m-        /* 204 */[m
[31m-        err = 0;[m
[31m-[m
[31m-    } else if (error >= NGX_HTTP_MOVED_PERMANENTLY[m
[31m-               && error < NGX_HTTP_LAST_3XX)[m
[31m-    {[m
[31m-        /* 3XX */[m
[31m-        err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;[m
[31m-[m
[31m-    } else if (error >= NGX_HTTP_BAD_REQUEST[m
[31m-               && error < NGX_HTTP_LAST_4XX)[m
[31m-    {[m
[31m-        /* 4XX */[m
[31m-        err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_OFF_4XX;[m
[31m-[m
[31m-    } else if (error >= NGX_HTTP_NGINX_CODES[m
[31m-               && error < NGX_HTTP_LAST_5XX)[m
[31m-    {[m
[31m-        /* 49X, 5XX */[m
[31m-        err = error - NGX_HTTP_NGINX_CODES + NGX_HTTP_OFF_5XX;[m
[31m-        switch (error) {[m
[31m-            case NGX_HTTP_TO_HTTPS:[m
[31m-            case NGX_HTTPS_CERT_ERROR:[m
[31m-            case NGX_HTTPS_NO_CERT:[m
[31m-            case NGX_HTTP_REQUEST_HEADER_TOO_LARGE:[m
[31m-                r->err_status = NGX_HTTP_BAD_REQUEST;[m
[31m-                break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* unknown code, zero body */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_send_special_response(r, clcf, err);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_filter_finalize_request(ngx_http_request_t *r, ngx_module_t *m,[m
[31m-    ngx_int_t error)[m
[31m-{[m
[31m-    void       *ctx;[m
[31m-    ngx_int_t   rc;[m
[31m-[m
[31m-    ngx_http_clean_header(r);[m
[31m-[m
[31m-    ctx = NULL;[m
[31m-[m
[31m-    if (m) {[m
[31m-        ctx = r->ctx[m->ctx_index];[m
[31m-    }[m
[31m-[m
[31m-    /* clear the modules contexts */[m
[31m-    ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-    if (m) {[m
[31m-        r->ctx[m->ctx_index] = ctx;[m
[31m-    }[m
[31m-[m
[31m-    r->filter_finalize = 1;[m
[31m-[m
[31m-    rc = ngx_http_special_response_handler(r, error);[m
[31m-[m
[31m-    /* NGX_ERROR resets any pending data */[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-    case NGX_DONE:[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    default:[m
[31m-        return rc;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_clean_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_memzero(&r->headers_out.status,[m
[31m-                sizeof(ngx_http_headers_out_t)[m
[31m-                    - offsetof(ngx_http_headers_out_t, status));[m
[31m-[m
[31m-    r->headers_out.headers.part.nelts = 0;[m
[31m-    r->headers_out.headers.part.next = NULL;[m
[31m-    r->headers_out.headers.last = &r->headers_out.headers.part;[m
[31m-[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-    r->headers_out.last_modified_time = -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)[m
[31m-{[m
[31m-    ngx_int_t                  overwrite;[m
[31m-    ngx_str_t                  uri, args;[m
[31m-    ngx_table_elt_t           *location;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    overwrite = err_page->overwrite;[m
[31m-[m
[31m-    if (overwrite && overwrite != NGX_HTTP_OK) {[m
[31m-        r->expect_tested = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (overwrite >= 0) {[m
[31m-        r->err_status = overwrite;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (uri.len && uri.data[0] == '/') {[m
[31m-[m
[31m-        if (err_page->value.lengths) {[m
[31m-            ngx_http_split_args(r, &uri, &args);[m
[31m-[m
[31m-        } else {[m
[31m-            args = err_page->args;[m
[31m-        }[m
[31m-[m
[31m-        if (r->method != NGX_HTTP_HEAD) {[m
[31m-            r->method = NGX_HTTP_GET;[m
[31m-            r->method_name = ngx_http_core_get_method;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_internal_redirect(r, &uri, &args);[m
[31m-    }[m
[31m-[m
[31m-    if (uri.len && uri.data[0] == '@') {[m
[31m-        return ngx_http_named_location(r, &uri);[m
[31m-    }[m
[31m-[m
[31m-    location = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-    if (location == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (overwrite != NGX_HTTP_MOVED_PERMANENTLY[m
[31m-        && overwrite != NGX_HTTP_MOVED_TEMPORARILY[m
[31m-        && overwrite != NGX_HTTP_SEE_OTHER[m
[31m-        && overwrite != NGX_HTTP_TEMPORARY_REDIRECT)[m
[31m-    {[m
[31m-        r->err_status = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-    }[m
[31m-[m
[31m-    location->hash = 1;[m
[31m-    ngx_str_set(&location->key, "Location");[m
[31m-    location->value = uri;[m
[31m-[m
[31m-    ngx_http_clear_location(r);[m
[31m-[m
[31m-    r->headers_out.location = location;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->msie_refresh && r->headers_in.msie) {[m
[31m-        return ngx_http_send_refresh(r);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_send_special_response(r, clcf, r->err_status[m
[31m-                                                   - NGX_HTTP_MOVED_PERMANENTLY[m
[31m-                                                   + NGX_HTTP_OFF_3XX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_send_special_response(ngx_http_request_t *r,[m
[31m-    ngx_http_core_loc_conf_t *clcf, ngx_uint_t err)[m
[31m-{[m
[31m-    u_char       *tail;[m
[31m-    size_t        len;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_uint_t    msie_padding;[m
[31m-    ngx_chain_t   out[3];[m
[31m-[m
[31m-    if (clcf->server_tokens) {[m
[31m-        len = sizeof(ngx_http_error_full_tail) - 1;[m
[31m-        tail = ngx_http_error_full_tail;[m
[31m-[m
[31m-    } else {[m
[31m-        len = sizeof(ngx_http_error_tail) - 1;[m
[31m-        tail = ngx_http_error_tail;[m
[31m-    }[m
[31m-[m
[31m-    msie_padding = 0;[m
[31m-[m
[31m-    if (ngx_http_error_pages[err].len) {[m
[31m-        r->headers_out.content_length_n = ngx_http_error_pages[err].len + len;[m
[31m-        if (clcf->msie_padding[m
[31m-            && (r->headers_in.msie || r->headers_in.chrome)[m
[31m-            && r->http_version >= NGX_HTTP_VERSION_10[m
[31m-            && err >= NGX_HTTP_OFF_4XX)[m
[31m-        {[m
[31m-            r->headers_out.content_length_n +=[m
[31m-                                         sizeof(ngx_http_msie_padding) - 1;[m
[31m-            msie_padding = 1;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_len = sizeof("text/html") - 1;[m
[31m-        ngx_str_set(&r->headers_out.content_type, "text/html");[m
[31m-        r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_out.content_length_n = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_clear_last_modified(r);[m
[31m-    ngx_http_clear_etag(r);[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_error_pages[err].len == 0) {[m
[31m-        return ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-    b->pos = ngx_http_error_pages[err].data;[m
[31m-    b->last = ngx_http_error_pages[err].data + ngx_http_error_pages[err].len;[m
[31m-[m
[31m-    out[0].buf = b;[m
[31m-    out[0].next = &out[1];[m
[31m-[m
[31m-    b = ngx_calloc_buf(r->pool);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->memory = 1;[m
[31m-[m
[31m-    b->pos = tail;[m
[31m-    b->last = tail + len;[m
[31m-[m
[31m-    out[1].buf = b;[m
[31m-    out[1].next = NULL;[m
[31m-[m
[31m-    if (msie_padding) {[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->memory = 1;[m
[31m-        b->pos = ngx_http_msie_padding;[m
[31m-        b->last = ngx_http_msie_padding + sizeof(ngx_http_msie_padding) - 1;[m
[31m-[m
[31m-        out[1].next = &out[2];[m
[31m-        out[2].buf = b;[m
[31m-        out[2].next = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (r == r->main) {[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out[0]);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_send_refresh(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char       *p, *location;[m
[31m-    size_t        len, size;[m
[31m-    uintptr_t     escape;[m
[31m-    ngx_int_t     rc;[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t   out;[m
[31m-[m
[31m-    len = r->headers_out.location->value.len;[m
[31m-    location = r->headers_out.location->value.data;[m
[31m-[m
[31m-    escape = 2 * ngx_escape_uri(NULL, location, len, NGX_ESCAPE_REFRESH);[m
[31m-[m
[31m-    size = sizeof(ngx_http_msie_refresh_head) - 1[m
[31m-           + escape + len[m
[31m-           + sizeof(ngx_http_msie_refresh_tail) - 1;[m
[31m-[m
[31m-    r->err_status = NGX_HTTP_OK;[m
[31m-[m
[31m-    r->headers_out.content_type_len = sizeof("text/html") - 1;[m
[31m-    ngx_str_set(&r->headers_out.content_type, "text/html");[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    r->headers_out.location->hash = 0;[m
[31m-    r->headers_out.location = NULL;[m
[31m-[m
[31m-    r->headers_out.content_length_n = size;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        r->headers_out.content_length->hash = 0;[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_clear_accept_ranges(r);[m
[31m-    ngx_http_clear_last_modified(r);[m
[31m-    ngx_http_clear_etag(r);[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || r->header_only) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(b->pos, ngx_http_msie_refresh_head,[m
[31m-                   sizeof(ngx_http_msie_refresh_head) - 1);[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_cpymem(p, location, len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_escape_uri(p, location, len, NGX_ESCAPE_REFRESH);[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(p, ngx_http_msie_refresh_tail,[m
[31m-                         sizeof(ngx_http_msie_refresh_tail) - 1);[m
[31m-[m
[31m-    b->last_buf = 1;[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    out.buf = b;[m
[31m-    out.next = NULL;[m
[31m-[m
[31m-    return ngx_http_output_filter(r, &out);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex fcbb530..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,6126 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_cache_get(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_file_cache_t **cache);[m
[31m-static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_cache_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_cache_etag(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#endif[m
[31m-[m
[31m-static void ngx_http_upstream_init_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_connect(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_send_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write);[m
[31m-static ngx_int_t ngx_http_upstream_send_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write);[m
[31m-static void ngx_http_upstream_send_request_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_read_request_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_process_header(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_test_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_intercept_errors(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_http_upstream_process_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_send_response(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgrade(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_upgraded(ngx_http_request_t *r,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,[m
[31m-    ngx_uint_t do_write);[m
[31m-static ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_upstream_non_buffered_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-#if (NGX_THREADS)[m
[31m-static ngx_int_t ngx_http_upstream_thread_handler(ngx_thread_task_t *task,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_upstream_thread_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_upstream_output_filter(void *data,[m
[31m-    ngx_chain_t *chain);[m
[31m-static void ngx_http_upstream_process_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_process_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_store(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_upstream_cleanup(void *data);[m
[31m-static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_set_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_process_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_buffering(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_charset(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_connection(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_vary(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_upstream_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_response_length_variable([m
[31m-    ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static char *ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy);[m
[31m-static char *ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_addr_t *ngx_http_upstream_get_local(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_local_t *local);[m
[31m-[m
[31m-static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c);[m
[31m-static void ngx_http_upstream_ssl_handshake(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_http_upstream_ssl_name(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_header_t  ngx_http_upstream_headers_in[] = {[m
[31m-[m
[31m-    { ngx_string("Status"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, status),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, content_type),[m
[31m-                 ngx_http_upstream_copy_content_type, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 ngx_http_upstream_process_content_length, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, date),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, date), 0 },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 ngx_http_upstream_process_last_modified, 0,[m
[31m-                 ngx_http_upstream_copy_last_modified, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, etag),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, etag), 0 },[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, server),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, server), 0 },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, www_authenticate),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, location),[m
[31m-                 ngx_http_upstream_rewrite_location, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_rewrite_refresh, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Set-Cookie"),[m
[31m-                 ngx_http_upstream_process_set_cookie,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, cookies),[m
[31m-                 ngx_http_upstream_rewrite_set_cookie, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Disposition"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 ngx_http_upstream_process_cache_control, 0,[m
[31m-                 ngx_http_upstream_copy_multi_header_lines,[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control), 1 },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 ngx_http_upstream_process_expires, 0,[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, expires), 1 },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, accept_ranges),[m
[31m-                 ngx_http_upstream_copy_allow_ranges,[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges), 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Range"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, content_range), 0 },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 ngx_http_upstream_process_connection, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Vary"),[m
[31m-                 ngx_http_upstream_process_vary, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Powered-By"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Expires"),[m
[31m-                 ngx_http_upstream_process_accel_expires, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Redirect"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Limit-Rate"),[m
[31m-                 ngx_http_upstream_process_limit_rate, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Buffering"),[m
[31m-                 ngx_http_upstream_process_buffering, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Charset"),[m
[31m-                 ngx_http_upstream_process_charset, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 ngx_http_upstream_process_transfer_encoding, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, content_encoding),[m
[31m-                 ngx_http_upstream_copy_content_encoding, 0, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, 0, NULL, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_commands[] = {[m
[31m-[m
[31m-    { ngx_string("upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_upstream_server,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_module_ctx = {[m
[31m-    ngx_http_upstream_add_variables,       /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_upstream_create_main_conf,    /* create main configuration */[m
[31m-    ngx_http_upstream_init_main_conf,      /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_module_ctx,         /* module context */[m
[31m-    ngx_http_upstream_commands,            /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_upstream_vars[] = {[m
[31m-[m
[31m-    { ngx_string("upstream_addr"), NULL,[m
[31m-      ngx_http_upstream_addr_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_status"), NULL,[m
[31m-      ngx_http_upstream_status_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_connect_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 2,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_header_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 1,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_response_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_response_length"), NULL,[m
[31m-      ngx_http_upstream_response_length_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("upstream_cache_status"), NULL,[m
[31m-      ngx_http_upstream_cache_status, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_cache_last_modified"), NULL,[m
[31m-      ngx_http_upstream_cache_last_modified, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_cache_etag"), NULL,[m
[31m-      ngx_http_upstream_cache_etag, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_next_t  ngx_http_upstream_next_errors[] = {[m
[31m-    { 500, NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { 502, NGX_HTTP_UPSTREAM_FT_HTTP_502 },[m
[31m-    { 503, NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { 504, NGX_HTTP_UPSTREAM_FT_HTTP_504 },[m
[31m-    { 403, NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { 404, NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_conf_bitmask_t  ngx_http_upstream_cache_method_mask[] = {[m
[31m-    { ngx_string("GET"), NGX_HTTP_GET },[m
[31m-    { ngx_string("HEAD"), NGX_HTTP_HEAD },[m
[31m-    { ngx_string("POST"), NGX_HTTP_POST },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_conf_bitmask_t  ngx_http_upstream_ignore_headers_masks[] = {[m
[31m-    { ngx_string("X-Accel-Redirect"), NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT },[m
[31m-    { ngx_string("X-Accel-Expires"), NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES },[m
[31m-    { ngx_string("X-Accel-Limit-Rate"), NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE },[m
[31m-    { ngx_string("X-Accel-Buffering"), NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING },[m
[31m-    { ngx_string("X-Accel-Charset"), NGX_HTTP_UPSTREAM_IGN_XA_CHARSET },[m
[31m-    { ngx_string("Expires"), NGX_HTTP_UPSTREAM_IGN_EXPIRES },[m
[31m-    { ngx_string("Cache-Control"), NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL },[m
[31m-    { ngx_string("Set-Cookie"), NGX_HTTP_UPSTREAM_IGN_SET_COOKIE },[m
[31m-    { ngx_string("Vary"), NGX_HTTP_UPSTREAM_IGN_VARY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_create(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u && u->cleanup) {[m
[31m-        r->main->count++;[m
[31m-        ngx_http_upstream_cleanup(r);[m
[31m-    }[m
[31m-[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream = u;[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    r->cache = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_init(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http init upstream, client timer: %d", c->read->timer_set);[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_upstream_init_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        if (!c->write->active) {[m
[31m-            if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_init_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_init_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *host;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_resolver_ctx_t             *ctx, temp;[m
[31m-    ngx_http_cleanup_t             *cln;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (r->aio) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->cache) {[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache(r, u);[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            r->write_event_handler = ngx_http_upstream_init_request;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = ngx_http_upstream_cache_send(r, u);[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {[m
[31m-                rc = NGX_DECLINED;[m
[31m-                r->cached = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            ngx_http_finalize_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->store = u->conf->store;[m
[31m-[m
[31m-    if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;[m
[31m-        r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body) {[m
[31m-        u->request_bufs = r->request_body->bufs;[m
[31m-    }[m
[31m-[m
[31m-    if (u->create_request(r) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.local = ngx_http_upstream_get_local(r, u->conf->local);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    u->output.alignment = clcf->directio_alignment;[m
[31m-    u->output.pool = r->pool;[m
[31m-    u->output.bufs.num = 1;[m
[31m-    u->output.bufs.size = clcf->client_body_buffer_size;[m
[31m-[m
[31m-    if (u->output.output_filter == NULL) {[m
[31m-        u->output.output_filter = ngx_chain_writer;[m
[31m-        u->output.filter_ctx = &u->writer;[m
[31m-    }[m
[31m-[m
[31m-    u->writer.pool = r->pool;[m
[31m-[m
[31m-    if (r->upstream_states == NULL) {[m
[31m-[m
[31m-        r->upstream_states = ngx_array_create(r->pool, 1,[m
[31m-                                            sizeof(ngx_http_upstream_state_t));[m
[31m-        if (r->upstream_states == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        u->state = ngx_array_push(r->upstream_states);[m
[31m-        if (u->state == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_upstream_cleanup;[m
[31m-    cln->data = r;[m
[31m-    u->cleanup = &cln->handler;[m
[31m-[m
[31m-    if (u->resolved == NULL) {[m
[31m-[m
[31m-        uscf = u->conf->upstream;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl_name = u->resolved->host;[m
[31m-#endif[m
[31m-[m
[31m-        host = &u->resolved->host;[m
[31m-[m
[31m-        if (u->resolved->sockaddr) {[m
[31m-[m
[31m-            if (u->resolved->port == 0[m
[31m-                && u->resolved->sockaddr->sa_family != AF_UNIX)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "no port in upstream \"%V\"", host);[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_connect(r, u);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-        uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->host.len == host->len[m
[31m-                && ((uscf->port == 0 && u->resolved->no_port)[m
[31m-                     || uscf->port == u->resolved->port)[m
[31m-                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)[m
[31m-            {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (u->resolved->port == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no port in upstream \"%V\"", host);[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        temp.name = *host;[m
[31m-[m
[31m-        ctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-        if (ctx == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx == NGX_NO_RESOLVER) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no resolver defined to resolve %V", host);[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->name = *host;[m
[31m-        ctx->handler = ngx_http_upstream_resolve_handler;[m
[31m-        ctx->data = r;[m
[31m-        ctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-        u->resolved->ctx = ctx;[m
[31m-[m
[31m-        if (ngx_resolve_name(ctx) != NGX_OK) {[m
[31m-            u->resolved->ctx = NULL;[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (uscf == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "no upstream configuration");[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    u->ssl_name = uscf->host;[m
[31m-#endif[m
[31m-[m
[31m-    if (uscf->peer.init(r, uscf) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (u->conf->next_upstream_tries[m
[31m-        && u->peer.tries > u->conf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = u->conf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_http_cache_t       *c;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-[m
[31m-        if (!(r->method & u->conf->cache_methods)) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache_get(r, u, &cache);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_HEAD && u->conf->cache_convert_head) {[m
[31m-            u->method = ngx_http_core_get_method;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_file_cache_new(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (u->create_key(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* TODO: add keys */[m
[31m-[m
[31m-        ngx_http_file_cache_create_key(r);[m
[31m-[m
[31m-        if (r->cache->header_start + 256 >= u->conf->buffer_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%V_buffer_size %uz is not enough for cache key, "[m
[31m-                          "it should be increased to at least %uz",[m
[31m-                          &u->conf->module, u->conf->buffer_size,[m
[31m-                          ngx_align(r->cache->header_start + 256, 1024));[m
[31m-[m
[31m-            r->cache = NULL;[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        u->cacheable = 1;[m
[31m-[m
[31m-        c = r->cache;[m
[31m-[m
[31m-        c->body_start = u->conf->buffer_size;[m
[31m-        c->min_uses = u->conf->cache_min_uses;[m
[31m-        c->file_cache = cache;[m
[31m-[m
[31m-        switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) {[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        case NGX_DECLINED:[m
[31m-            u->cache_status = NGX_HTTP_CACHE_BYPASS;[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default: /* NGX_OK */[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        c->lock = u->conf->cache_lock;[m
[31m-        c->lock_timeout = u->conf->cache_lock_timeout;[m
[31m-        c->lock_age = u->conf->cache_lock_age;[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_MISS;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_file_cache_open(r);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream cache: %i", rc);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_UPDATING:[m
[31m-[m
[31m-        if (u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) {[m
[31m-            u->cache_status = rc;[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = NGX_HTTP_CACHE_STALE;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-        u->cache_status = NGX_HTTP_CACHE_HIT;[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_STALE:[m
[31m-[m
[31m-        c->valid_sec = 0;[m
[31m-        u->buffer.start = NULL;[m
[31m-        u->cache_status = NGX_HTTP_CACHE_EXPIRED;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-[m
[31m-        if ((size_t) (u->buffer.end - u->buffer.start) < u->conf->buffer_size) {[m
[31m-            u->buffer.start = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            u->buffer.pos = u->buffer.start + c->header_start;[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_SCARCE:[m
[31m-[m
[31m-        u->cacheable = 0;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_AGAIN:[m
[31m-[m
[31m-        return NGX_BUSY;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        /* cached NGX_HTTP_BAD_GATEWAY, NGX_HTTP_GATEWAY_TIME_OUT, etc. */[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_HIT;[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->cached = 0;[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_get(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_http_file_cache_t **cache)[m
[31m-{[m
[31m-    ngx_str_t               *name, val;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_file_cache_t  **caches;[m
[31m-[m
[31m-    if (u->conf->cache_zone) {[m
[31m-        *cache = u->conf->cache_zone->data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, u->conf->cache_value, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len == 0[m
[31m-        || (val.len == 3 && ngx_strncmp(val.data, "off", 3) == 0))[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    caches = u->caches->elts;[m
[31m-[m
[31m-    for (i = 0; i < u->caches->nelts; i++) {[m
[31m-        name = &caches[i]->shm_zone->shm.name;[m
[31m-[m
[31m-        if (name->len == val.len[m
[31m-            && ngx_strncmp(name->data, val.data, val.len) == 0)[m
[31m-        {[m
[31m-            *cache = caches[i];[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "cache \"%V\" not found", &val);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    r->cached = 1;[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->header_start == c->body_start) {[m
[31m-        r->http_version = NGX_HTTP_VERSION_9;[m
[31m-        return ngx_http_cache_send(r);[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: cache stack */[m
[31m-[m
[31m-    u->buffer = *c->buf;[m
[31m-    u->buffer.pos += c->header_start;[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = u->process_header(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_cache_send(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_HTTP_UPSTREAM_INVALID_HEADER */[m
[31m-[m
[31m-    /* TODO: delete file */[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *r;[m
[31m-    ngx_http_upstream_t           *u;[m
[31m-    ngx_http_upstream_resolved_t  *ur;[m
[31m-[m
[31m-    r = ctx->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream resolve: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "%V could not be resolved (%i: %s)",[m
[31m-                      &ctx->name, ctx->state,[m
[31m-                      ngx_resolver_strerror(ctx->state));[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ur->naddrs = ctx->naddrs;[m
[31m-    ur->addrs = ctx->addrs;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    u_char      text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t   addr;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-    ur->ctx = NULL;[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (u->conf->next_upstream_tries[m
[31m-        && u->peer.tries > u->conf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = u->conf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        u->write_event_handler(r, u);[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_check_broken_connection(r, r->connection->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_check_broken_connection(r, r->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    char                 buf[1];[m
[31m-    ngx_err_t            err;[m
[31m-    ngx_int_t            event;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "http upstream check client, write event:%d, \"%V\"",[m
[31m-                   ev->write, &r->uri);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-            event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-            if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!ev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        if (ev->kq_errno) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                          "kevent() reported that client prematurely closed "[m
[31m-                          "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                      "kevent() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ev->pending_eof) {[m
[31m-        socklen_t  len;[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        err = 0;[m
[31m-        len = sizeof(ngx_err_t);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                        "epoll_wait() reported that client prematurely closed "[m
[31m-                        "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "epoll_wait() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,[m
[31m-                   "http upstream recv(): %d", n);[m
[31m-[m
[31m-    if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-        event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-        if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->error = 1;[m
[31m-[m
[31m-    } else { /* n == 0 */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev->eof = 1;[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (!u->cacheable && u->peer.connection) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "client prematurely closed connection, "[m
[31m-                      "so upstream connection is closed too");[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    if (u->peer.connection == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r->connection->log->action = "connecting to upstream";[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-    u->state = ngx_array_push(r->upstream_states);[m
[31m-    if (u->state == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-[m
[31m-    u->state->response_time = ngx_current_msec;[m
[31m-    u->state->connect_time = (ngx_msec_t) -1;[m
[31m-    u->state->header_time = (ngx_msec_t) -1;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&u->peer);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->peer = u->peer.name;[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    c->data = r;[m
[31m-[m
[31m-    c->write->handler = ngx_http_upstream_handler;[m
[31m-    c->read->handler = ngx_http_upstream_handler;[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_upstream_send_request_handler;[m
[31m-    u->read_event_handler = ngx_http_upstream_process_header;[m
[31m-[m
[31m-    c->sendfile &= r->connection->sendfile;[m
[31m-    u->output.sendfile = c->sendfile;[m
[31m-[m
[31m-    if (c->pool == NULL) {[m
[31m-[m
[31m-        /* we need separate pool here to be able to cache SSL connections */[m
[31m-[m
[31m-        c->pool = ngx_create_pool(128, r->connection->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log = r->connection->log;[m
[31m-    c->pool->log = c->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */[m
[31m-[m
[31m-    u->writer.out = NULL;[m
[31m-    u->writer.last = &u->writer.out;[m
[31m-    u->writer.connection = c;[m
[31m-    u->writer.limit = 0;[m
[31m-[m
[31m-    if (u->request_sent) {[m
[31m-        if (ngx_http_upstream_reinit(r, u) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body[m
[31m-        && r->request_body->buf[m
[31m-        && r->request_body->temp_file[m
[31m-        && r == r->main)[m
[31m-    {[m
[31m-        /*[m
[31m-         * the r->request_body->buf can be reused for one request only,[m
[31m-         * the subrequests should allocate their own temporary bufs[m
[31m-         */[m
[31m-[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = r->request_body->buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-        u->output.allocated = 1;[m
[31m-[m
[31m-        r->request_body->buf->pos = r->request_body->buf->start;[m
[31m-        r->request_body->buf->last = r->request_body->buf->start;[m
[31m-        r->request_body->buf->tag = u->output.tag;[m
[31m-    }[m
[31m-[m
[31m-    u->request_sent = 0;[m
[31m-    u->request_body_sent = 0;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(u->conf->ssl, c,[m
[31m-                                  NGX_SSL_BUFFER|NGX_SSL_CLIENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->sendfile = 0;[m
[31m-    u->output.sendfile = 0;[m
[31m-[m
[31m-    if (u->conf->ssl_server_name || u->conf->ssl_verify) {[m
[31m-        if (ngx_http_upstream_ssl_name(r, u, c) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->ssl_session_reuse) {[m
[31m-        if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* abbreviated SSL handshake may interact badly with Nagle */[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "SSL handshaking to upstream";[m
[31m-[m
[31m-    rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!c->write->timer_set) {[m
[31m-            ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->handler = ngx_http_upstream_ssl_handshake;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_ssl_handshake(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_ssl_handshake(ngx_connection_t *c)[m
[31m-{[m
[31m-    long                  rc;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    r = c->data;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        if (u->conf->ssl_verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_ssl_check_host(c, &u->ssl_name) != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream SSL certificate does not match \"%V\"",[m
[31m-                              &u->ssl_name);[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (u->conf->ssl_session_reuse) {[m
[31m-            u->peer.save_session(&u->peer, u->peer.data);[m
[31m-        }[m
[31m-[m
[31m-        c->write->handler = ngx_http_upstream_handler;[m
[31m-        c->read->handler = ngx_http_upstream_handler;[m
[31m-[m
[31m-        c = r->connection;[m
[31m-[m
[31m-        ngx_http_upstream_send_request(r, u, 1);[m
[31m-[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_ssl_name(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_connection_t *c)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t   name;[m
[31m-[m
[31m-    if (u->conf->ssl_name) {[m
[31m-        if (ngx_http_complex_value(r, u->conf->ssl_name, &name) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        name = u->ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * ssl name here may contain port, notably if derived from $proxy_host[m
[31m-     * or $http_host; we have to strip it[m
[31m-     */[m
[31m-[m
[31m-    p = name.data;[m
[31m-    last = name.data + name.len;[m
[31m-[m
[31m-    if (*p == '[') {[m
[31m-        p = ngx_strlchr(p, last, ']');[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            p = name.data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlchr(p, last, ':');[m
[31m-[m
[31m-    if (p != NULL) {[m
[31m-        name.len = p - name.data;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->conf->ssl_server_name) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */[m
[31m-[m
[31m-    if (name.len == 0 || *name.data == '[') {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_set_tlsext_host_name() needs a null-terminated string,[m
[31m-     * hence we explicitly null-terminate name here[m
[31m-     */[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, name.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(p, name.data, name.len + 1);[m
[31m-[m
[31m-    name.data = p;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream SSL server name: \"%s\"", name.data);[m
[31m-[m
[31m-    if (SSL_set_tlsext_host_name(c->ssl->connection, name.data) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "SSL_set_tlsext_host_name(\"%s\") failed", name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    u->ssl_name = name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    off_t         file_pos;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (u->reinit_request(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->keepalive = 0;[m
[31m-    u->upgrade = 0;[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the request chain */[m
[31m-[m
[31m-    file_pos = 0;[m
[31m-[m
[31m-    for (cl = u->request_bufs; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->start;[m
[31m-[m
[31m-        /* there is at most one file */[m
[31m-[m
[31m-        if (cl->buf->in_file) {[m
[31m-            cl->buf->file_pos = file_pos;[m
[31m-            file_pos = cl->buf->file_last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the subrequest's ngx_output_chain() context */[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file[m
[31m-        && r != r->main && u->output.buf)[m
[31m-    {[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = u->output.buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-[m
[31m-        u->output.buf->pos = u->output.buf->start;[m
[31m-        u->output.buf->last = u->output.buf->start;[m
[31m-    }[m
[31m-[m
[31m-    u->output.buf = NULL;[m
[31m-    u->output.in = NULL;[m
[31m-    u->output.busy = NULL;[m
[31m-[m
[31m-    /* reinit u->buffer */[m
[31m-[m
[31m-    u->buffer.pos = u->buffer.start;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-        u->buffer.pos += r->cache->header_start;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream send request");[m
[31m-[m
[31m-    if (u->state->connect_time == (ngx_msec_t) -1) {[m
[31m-        u->state->connect_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "sending request to upstream";[m
[31m-[m
[31m-    rc = ngx_http_upstream_send_request_body(r, u, do_write);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        if (!c->write->ready) {[m
[31m-            ngx_add_timer(c->write, u->conf->send_timeout);[m
[31m-[m
[31m-        } else if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    u->request_body_sent = 1;[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,[m
[31m-                          ngx_tcp_push_n " failed");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-    }[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_upstream_dummy_handler;[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(c->read, u->conf->read_timeout);[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        ngx_http_upstream_process_header(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_send_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t               *out, *cl, *ln;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream send request body");[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-[m
[31m-        /* buffered request body */[m
[31m-[m
[31m-        if (!u->request_sent) {[m
[31m-            u->request_sent = 1;[m
[31m-            out = u->request_bufs;[m
[31m-[m
[31m-        } else {[m
[31m-            out = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_output_chain(&u->output, out);[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent) {[m
[31m-        u->request_sent = 1;[m
[31m-        out = u->request_bufs;[m
[31m-[m
[31m-        if (r->request_body->bufs) {[m
[31m-            for (cl = out; cl->next; cl = out->next) { /* void */ }[m
[31m-            cl->next = r->request_body->bufs;[m
[31m-            r->request_body->bufs = NULL;[m
[31m-        }[m
[31m-[m
[31m-        c = u->peer.connection;[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_upstream_read_request_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        out = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-            rc = ngx_output_chain(&u->output, out);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            while (out) {[m
[31m-                ln = out;[m
[31m-                out = out->next;[m
[31m-                ngx_free_chain(r->pool, ln);[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_OK && !r->reading_body) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (r->reading_body) {[m
[31m-            /* read client request body */[m
[31m-[m
[31m-            rc = ngx_http_read_unbuffered_request_body(r);[m
[31m-[m
[31m-            if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            out = r->request_body->bufs;[m
[31m-            r->request_body->bufs = NULL;[m
[31m-        }[m
[31m-[m
[31m-        /* stop if there is nothing to send */[m
[31m-[m
[31m-        if (out == NULL) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        do_write = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->reading_body) {[m
[31m-        if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-            r->read_event_handler =[m
[31m-                                  ngx_http_upstream_rd_check_broken_connection;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_request_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream send request handler");[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (u->request_body_sent) {[m
[31m-        u->write_event_handler = ngx_http_upstream_dummy_handler;[m
[31m-[m
[31m-        (void) ngx_handle_write_event(c->write, 0);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_read_request_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream read request handler");[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ssize_t            n;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process header");[m
[31m-[m
[31m-    c->log->action = "reading response header from upstream";[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->buffer.start == NULL) {[m
[31m-        u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size);[m
[31m-        if (u->buffer.start == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->buffer.pos = u->buffer.start;[m
[31m-        u->buffer.last = u->buffer.start;[m
[31m-        u->buffer.end = u->buffer.start + u->conf->buffer_size;[m
[31m-        u->buffer.temporary = 1;[m
[31m-[m
[31m-        u->buffer.tag = u->output.tag;[m
[31m-[m
[31m-        if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                          sizeof(ngx_table_elt_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (r->cache) {[m
[31m-            u->buffer.pos += r->cache->header_start;[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-#if 0[m
[31m-            ngx_add_timer(rev, u->read_timeout);[m
[31m-#endif[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "upstream prematurely closed connection");[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->buffer.last += n;[m
[31m-[m
[31m-#if 0[m
[31m-        u->valid_header_in = 0;[m
[31m-[m
[31m-        u->peer.cached = 0;[m
[31m-#endif[m
[31m-[m
[31m-        rc = u->process_header(r);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            if (u->buffer.last == u->buffer.end) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream sent too big header");[m
[31m-[m
[31m-                ngx_http_upstream_next(r, u,[m
[31m-                                       NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    u->state->header_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-    if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-[m
[31m-        if (ngx_http_upstream_test_next(r, u) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_upstream_intercept_errors(r, u) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->subrequest_in_memory) {[m
[31m-        ngx_http_upstream_send_response(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* subrequest content in memory */[m
[31m-[m
[31m-    if (u->input_filter == NULL) {[m
[31m-        u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;[m
[31m-        u->input_filter = ngx_http_upstream_non_buffered_filter;[m
[31m-        u->input_filter_ctx = r;[m
[31m-    }[m
[31m-[m
[31m-    if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    n = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-    if (n) {[m
[31m-        u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-        u->state->response_length += n;[m
[31m-[m
[31m-        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_process_body_in_memory;[m
[31m-[m
[31m-    ngx_http_upstream_process_body_in_memory(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_uint_t                 status;[m
[31m-    ngx_http_upstream_next_t  *un;[m
[31m-[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    for (un = ngx_http_upstream_next_errors; un->status; un++) {[m
[31m-[m
[31m-        if (status != un->status) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.tries > 1 && (u->conf->next_upstream & un->mask)) {[m
[31m-            ngx_http_upstream_next(r, u, un->mask);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-            && (u->conf->cache_use_stale & un->mask))[m
[31m-        {[m
[31m-            ngx_int_t  rc;[m
[31m-[m
[31m-            rc = u->reinit_request(r);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                u->cache_status = NGX_HTTP_CACHE_STALE;[m
[31m-                rc = ngx_http_upstream_cache_send(r, u);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (status == NGX_HTTP_NOT_MODIFIED[m
[31m-        && u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-        && u->conf->cache_revalidate)[m
[31m-    {[m
[31m-        time_t     now, valid;[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream not modified");[m
[31m-[m
[31m-        now = ngx_time();[m
[31m-        valid = r->cache->valid_sec;[m
[31m-[m
[31m-        rc = u->reinit_request(r);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_REVALIDATED;[m
[31m-        rc = ngx_http_upstream_cache_send(r, u);[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = r->cache->valid_sec;[m
[31m-        }[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = ngx_http_file_cache_valid(u->conf->cache_valid,[m
[31m-                                              u->headers_in.status_n);[m
[31m-            if (valid) {[m
[31m-                valid = now + valid;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (valid) {[m
[31m-            r->cache->valid_sec = valid;[m
[31m-            r->cache->date = now;[m
[31m-[m
[31m-            ngx_http_file_cache_update_header(r);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_intercept_errors(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                  status;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_table_elt_t           *h;[m
[31m-    ngx_http_err_page_t       *err_page;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->conf->intercept_errors) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    err_page = clcf->error_pages->elts;[m
[31m-    for (i = 0; i < clcf->error_pages->nelts; i++) {[m
[31m-[m
[31m-        if (err_page[i].status == status) {[m
[31m-[m
[31m-            if (status == NGX_HTTP_UNAUTHORIZED[m
[31m-                && u->headers_in.www_authenticate)[m
[31m-            {[m
[31m-                h = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-                if (h == NULL) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                *h = *u->headers_in.www_authenticate;[m
[31m-[m
[31m-                r->headers_out.www_authenticate = h;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-            if (r->cache) {[m
[31m-                time_t  valid;[m
[31m-[m
[31m-                valid = ngx_http_file_cache_valid(u->conf->cache_valid, status);[m
[31m-[m
[31m-                if (valid) {[m
[31m-                    r->cache->valid_sec = ngx_time() + valid;[m
[31m-                    r->cache->error = status;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_upstream_finalize_request(r, u, status);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        if (c->write->pending_eof || c->read->pending_eof) {[m
[31m-            if (c->write->pending_eof) {[m
[31m-                err = c->write->kq_errno;[m
[31m-[m
[31m-            } else {[m
[31m-                err = c->read->kq_errno;[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err,[m
[31m-                                    "kevent() reported that connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_str_t                       uri, args;[m
[31m-    ngx_uint_t                      i, flags;[m
[31m-    ngx_list_part_t                *part;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (u->headers_in.x_accel_redirect[m
[31m-        && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT))[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);[m
[31m-[m
[31m-        part = &u->headers_in.headers.part;[m
[31m-        h = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                h = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,[m
[31m-                               h[i].lowcase_key, h[i].key.len);[m
[31m-[m
[31m-            if (hh && hh->redirect) {[m
[31m-                if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {[m
[31m-                    ngx_http_finalize_request(r,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        uri = u->headers_in.x_accel_redirect->value;[m
[31m-[m
[31m-        if (uri.data[0] == '@') {[m
[31m-            ngx_http_named_location(r, &uri);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_null(&args);[m
[31m-            flags = NGX_HTTP_LOG_UNSAFE;[m
[31m-[m
[31m-            if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags) != NGX_OK) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            if (r->method != NGX_HTTP_HEAD) {[m
[31m-                r->method = NGX_HTTP_GET;[m
[31m-                r->method_name = ngx_http_core_get_method;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_internal_redirect(r, &uri, &args);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    part = &u->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash,[m
[31m-                          h[i].lowcase_key, h[i].key.len))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,[m
[31m-                           h[i].lowcase_key, h[i].key.len);[m
[31m-[m
[31m-        if (hh) {[m
[31m-            if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.server && r->headers_out.server->value.data == NULL) {[m
[31m-        r->headers_out.server->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date && r->headers_out.date->value.data == NULL) {[m
[31m-        r->headers_out.date->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = u->headers_in.status_n;[m
[31m-    r->headers_out.status_line = u->headers_in.status_line;[m
[31m-[m
[31m-    r->headers_out.content_length_n = u->headers_in.content_length_n;[m
[31m-[m
[31m-    r->disable_not_modified = !u->cacheable;[m
[31m-[m
[31m-    if (u->conf->force_ranges) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        r->single_range = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        if (r->cached) {[m
[31m-            r->single_range = 0;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    u->length = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ssize_t            n;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process body on memory");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "upstream buffer is too small to read response");[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        n = c->recv(c, b->last, size);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0 || n == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, n);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->state->response_length += n;[m
[31m-[m
[31m-        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!rev->ready) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        ngx_add_timer(rev, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_event_pipe_t          *p;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->header_sent = 1;[m
[31m-[m
[31m-    if (u->upgrade) {[m
[31m-        ngx_http_upstream_upgrade(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-[m
[31m-        if (!u->buffering) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && !u->store) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->pipe->downstream_error = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file) {[m
[31m-        ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd);[m
[31m-        r->request_body->temp_file->file.fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!u->buffering) {[m
[31m-[m
[31m-        if (u->input_filter == NULL) {[m
[31m-            u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;[m
[31m-            u->input_filter = ngx_http_upstream_non_buffered_filter;[m
[31m-            u->input_filter_ctx = r;[m
[31m-        }[m
[31m-[m
[31m-        u->read_event_handler = ngx_http_upstream_process_non_buffered_upstream;[m
[31m-        r->write_event_handler =[m
[31m-                             ngx_http_upstream_process_non_buffered_downstream;[m
[31m-[m
[31m-        r->limit_rate = 0;[m
[31m-[m
[31m-        if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                               (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        n = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-        if (n) {[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-            u->state->response_length += n;[m
[31m-[m
[31m-            if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_process_non_buffered_downstream(r);[m
[31m-[m
[31m-        } else {[m
[31m-            u->buffer.pos = u->buffer.start;[m
[31m-            u->buffer.last = u->buffer.start;[m
[31m-[m
[31m-            if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (u->peer.connection->read->ready || u->length == 0) {[m
[31m-                ngx_http_upstream_process_non_buffered_upstream(r, u);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: preallocate event_pipe bufs, look "Content-Length" */[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache && r->cache->file.fd != NGX_INVALID_FILE) {[m
[31m-        ngx_pool_run_cleanup_file(r->pool, r->cache->file.fd);[m
[31m-        r->cache->file.fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    switch (ngx_http_test_predicates(r, u->conf->no_cache)) {[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        u->cacheable = 0;[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_OK */[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_BYPASS) {[m
[31m-[m
[31m-            /* create cache if previously bypassed */[m
[31m-[m
[31m-            if (ngx_http_file_cache_create(r) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-        time_t  now, valid;[m
[31m-[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        valid = r->cache->valid_sec;[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = ngx_http_file_cache_valid(u->conf->cache_valid,[m
[31m-                                              u->headers_in.status_n);[m
[31m-            if (valid) {[m
[31m-                r->cache->valid_sec = now + valid;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (valid) {[m
[31m-            r->cache->date = now;[m
[31m-            r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start);[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_OK[m
[31m-                || u->headers_in.status_n == NGX_HTTP_PARTIAL_CONTENT)[m
[31m-            {[m
[31m-                r->cache->last_modified = u->headers_in.last_modified_time;[m
[31m-[m
[31m-                if (u->headers_in.etag) {[m
[31m-                    r->cache->etag = u->headers_in.etag->value;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_str_null(&r->cache->etag);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                r->cache->last_modified = -1;[m
[31m-                ngx_str_null(&r->cache->etag);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_file_cache_set_header(r, u->buffer.start) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            u->cacheable = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http cacheable: %d", u->cacheable);[m
[31m-[m
[31m-    if (u->cacheable == 0 && r->cache) {[m
[31m-        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only && !u->cacheable && !u->store) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    p = u->pipe;[m
[31m-[m
[31m-    p->output_filter = ngx_http_upstream_output_filter;[m
[31m-    p->output_ctx = r;[m
[31m-    p->tag = u->output.tag;[m
[31m-    p->bufs = u->conf->bufs;[m
[31m-    p->busy_size = u->conf->busy_buffers_size;[m
[31m-    p->upstream = u->peer.connection;[m
[31m-    p->downstream = c;[m
[31m-    p->pool = r->pool;[m
[31m-    p->log = c->log;[m
[31m-    p->limit_rate = u->conf->limit_rate;[m
[31m-    p->start_sec = ngx_time();[m
[31m-[m
[31m-    p->cacheable = u->cacheable || u->store;[m
[31m-[m
[31m-    p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-    if (p->temp_file == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p->temp_file->file.fd = NGX_INVALID_FILE;[m
[31m-    p->temp_file->file.log = c->log;[m
[31m-    p->temp_file->path = u->conf->temp_path;[m
[31m-    p->temp_file->pool = r->pool;[m
[31m-[m
[31m-    if (p->cacheable) {[m
[31m-        p->temp_file->persistent = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        if (r->cache && r->cache->file_cache->temp_path) {[m
[31m-            p->temp_file->path = r->cache->file_cache->temp_path;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        p->temp_file->log_level = NGX_LOG_WARN;[m
[31m-        p->temp_file->warn = "an upstream response is buffered "[m
[31m-                             "to a temporary file";[m
[31m-    }[m
[31m-[m
[31m-    p->max_temp_file_size = u->conf->max_temp_file_size;[m
[31m-    p->temp_file_write_size = u->conf->temp_file_write_size;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (clcf->aio == NGX_HTTP_AIO_THREADS && clcf->aio_write) {[m
[31m-        p->thread_handler = ngx_http_upstream_thread_handler;[m
[31m-        p->thread_ctx = r;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    p->preread_bufs = ngx_alloc_chain_link(r->pool);[m
[31m-    if (p->preread_bufs == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p->preread_bufs->buf = &u->buffer;[m
[31m-    p->preread_bufs->next = NULL;[m
[31m-    u->buffer.recycled = 1;[m
[31m-[m
[31m-    p->preread_size = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-[m
[31m-        p->buf_to_file = ngx_calloc_buf(r->pool);[m
[31m-        if (p->buf_to_file == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p->buf_to_file->start = u->buffer.start;[m
[31m-        p->buf_to_file->pos = u->buffer.start;[m
[31m-        p->buf_to_file->last = u->buffer.pos;[m
[31m-        p->buf_to_file->temporary = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-        /* the posted aio operation may corrupt a shadow buffer */[m
[31m-        p->single_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */[m
[31m-    p->free_bufs = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * event_pipe would do u->buffer.last += p->preread_size[m
[31m-     * as though these bytes were read[m
[31m-     */[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    if (u->conf->cyclic_temp_file) {[m
[31m-[m
[31m-        /*[m
[31m-         * we need to disable the use of sendfile() if we use cyclic temp file[m
[31m-         * because the writing a new data may interfere with sendfile()[m
[31m-         * that uses the same kernel file pages (at least on FreeBSD)[m
[31m-         */[m
[31m-[m
[31m-        p->cyclic_temp_file = 1;[m
[31m-        c->sendfile = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        p->cyclic_temp_file = 0;[m
[31m-    }[m
[31m-[m
[31m-    p->read_timeout = u->conf->read_timeout;[m
[31m-    p->send_timeout = clcf->send_timeout;[m
[31m-    p->send_lowat = clcf->send_lowat;[m
[31m-[m
[31m-    p->length = -1;[m
[31m-[m
[31m-    if (u->input_filter_init[m
[31m-        && u->input_filter_init(p->input_ctx) != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_process_upstream;[m
[31m-    r->write_event_handler = ngx_http_upstream_process_downstream;[m
[31m-[m
[31m-    ngx_http_upstream_process_upstream(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgrade(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    /* TODO: prevent upgrade if not requested or not possible */[m
[31m-[m
[31m-    r->keepalive = 0;[m
[31m-    c->log->action = "proxying upgraded connection";[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_upgraded_read_upstream;[m
[31m-    u->write_event_handler = ngx_http_upstream_upgraded_write_upstream;[m
[31m-    r->read_event_handler = ngx_http_upstream_upgraded_read_downstream;[m
[31m-    r->write_event_handler = ngx_http_upstream_upgraded_write_downstream;[m
[31m-[m
[31m-    if (clcf->tcp_nodelay) {[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.connection->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, u->peer.connection->log, 0,[m
[31m-                           "tcp_nodelay");[m
[31m-[m
[31m-            if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(u->peer.connection, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection->read->ready[m
[31m-        || u->buffer.pos != u->buffer.last)[m
[31m-    {[m
[31m-        ngx_post_event(c->read, &ngx_posted_events);[m
[31m-        ngx_http_upstream_process_upgraded(r, 1, 1);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 1, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 1, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_upgraded(ngx_http_request_t *r,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c, *downstream, *upstream, *dst, *src;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process upgraded, fu:%ui", from_upstream);[m
[31m-[m
[31m-    downstream = c;[m
[31m-    upstream = u->peer.connection;[m
[31m-[m
[31m-    if (downstream->write->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->timedout || upstream->write->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (from_upstream) {[m
[31m-        src = upstream;[m
[31m-        dst = downstream;[m
[31m-        b = &u->buffer;[m
[31m-[m
[31m-    } else {[m
[31m-        src = downstream;[m
[31m-        dst = upstream;[m
[31m-        b = &u->from_client;[m
[31m-[m
[31m-        if (r->header_in->last > r->header_in->pos) {[m
[31m-            b = r->header_in;[m
[31m-            b->end = b->last;[m
[31m-            do_write = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (b->start == NULL) {[m
[31m-            b->start = ngx_palloc(r->pool, u->conf->buffer_size);[m
[31m-            if (b->start == NULL) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start;[m
[31m-            b->last = b->start;[m
[31m-            b->end = b->start + u->conf->buffer_size;[m
[31m-            b->temporary = 1;[m
[31m-            b->tag = u->output.tag;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            size = b->last - b->pos;[m
[31m-[m
[31m-            if (size && dst->write->ready) {[m
[31m-[m
[31m-                n = dst->send(dst, b->pos, size);[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (n > 0) {[m
[31m-                    b->pos += n;[m
[31m-[m
[31m-                    if (b->pos == b->last) {[m
[31m-                        b->pos = b->start;[m
[31m-                        b->last = b->start;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && src->read->ready) {[m
[31m-[m
[31m-            n = src->recv(src, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                do_write = 1;[m
[31m-                b->last += n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                src->read->eof = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if ((upstream->read->eof && u->buffer.pos == u->buffer.last)[m
[31m-        || (downstream->read->eof && u->from_client.pos == u->from_client.last)[m
[31m-        || (downstream->read->eof && upstream->read->eof))[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http upstream upgraded done");[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (ngx_handle_write_event(upstream->write, u->conf->send_lowat)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->write->active && !upstream->write->ready) {[m
[31m-        ngx_add_timer(upstream->write, u->conf->send_timeout);[m
[31m-[m
[31m-    } else if (upstream->write->timer_set) {[m
[31m-        ngx_del_timer(upstream->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->active && !upstream->read->ready) {[m
[31m-        ngx_add_timer(upstream->read, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (upstream->read->timer_set) {[m
[31m-        ngx_del_timer(upstream->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(downstream->write, clcf->send_lowat)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (downstream->write->active && !downstream->write->ready) {[m
[31m-        ngx_add_timer(downstream->write, clcf->send_timeout);[m
[31m-[m
[31m-    } else if (downstream->write->timer_set) {[m
[31m-        ngx_del_timer(downstream->write);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t          *wev;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process non buffered downstream");[m
[31m-[m
[31m-    c->log->action = "sending to client";[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_non_buffered_request(r, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process non buffered upstream");[m
[31m-[m
[31m-    c->log->action = "reading upstream";[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_non_buffered_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_connection_t          *downstream, *upstream;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    downstream = r->connection;[m
[31m-    upstream = u->peer.connection;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    do_write = do_write || u->length == 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            if (u->out_bufs || u->busy_bufs) {[m
[31m-                rc = ngx_http_output_filter(r, u->out_bufs);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs,[m
[31m-                                        &u->out_bufs, u->output.tag);[m
[31m-            }[m
[31m-[m
[31m-            if (u->busy_bufs == NULL) {[m
[31m-[m
[31m-                if (u->length == 0[m
[31m-                    || (upstream->read->eof && u->length == -1))[m
[31m-                {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (upstream->read->eof) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, upstream->log, 0,[m
[31m-                                  "upstream prematurely closed connection");[m
[31m-[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                                       NGX_HTTP_BAD_GATEWAY);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (upstream->read->error) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                                       NGX_HTTP_BAD_GATEWAY);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                b->pos = b->start;[m
[31m-                b->last = b->start;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && upstream->read->ready) {[m
[31m-[m
[31m-            n = upstream->recv(upstream, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                u->state->response_length += n;[m
[31m-[m
[31m-                if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            do_write = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (downstream->data == r) {[m
[31m-        if (ngx_handle_write_event(downstream->write, clcf->send_lowat)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (downstream->write->active && !downstream->write->ready) {[m
[31m-        ngx_add_timer(downstream->write, clcf->send_timeout);[m
[31m-[m
[31m-    } else if (downstream->write->timer_set) {[m
[31m-        ngx_del_timer(downstream->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->active && !upstream->read->ready) {[m
[31m-        ngx_add_timer(upstream->read, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (upstream->read->timer_set) {[m
[31m-        ngx_del_timer(upstream->read);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_non_buffered_filter_init(void *data)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    cl->buf->pos = b->last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    if (u->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u->length -= bytes;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_event_pipe_t          *p;[m
[31m-    ngx_thread_pool_t         *tp;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r = file->thread_ctx;[m
[31m-    p = r->upstream->pipe;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    tp = clcf->thread_pool;[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "thread pool \"%V\" not found", &name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    task->event.data = r;[m
[31m-    task->event.handler = ngx_http_upstream_thread_event_handler;[m
[31m-[m
[31m-    if (ngx_thread_task_post(tp, task) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-    p->aio = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_thread_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream thread: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_output_filter(void *data, ngx_chain_t *chain)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_event_pipe_t    *p;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = data;[m
[31m-    p = r->upstream->pipe;[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, chain);[m
[31m-[m
[31m-    p->aio = r->aio;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t          *wev;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_event_pipe_t     *p;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-    p = u->pipe;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process downstream");[m
[31m-[m
[31m-    c->log->action = "sending to client";[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    p->aio = r->aio;[m
[31m-#endif[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-[m
[31m-        if (wev->delayed) {[m
[31m-[m
[31m-            wev->timedout = 0;[m
[31m-            wev->delayed = 0;[m
[31m-[m
[31m-            if (!wev->ready) {[m
[31m-                ngx_add_timer(wev, p->send_timeout);[m
[31m-[m
[31m-                if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_event_pipe(p, wev->write) == NGX_ABORT) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p->downstream_error = 1;[m
[31m-            c->timedout = 1;[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (wev->delayed) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http downstream delayed");[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_pipe(p, 1) == NGX_ABORT) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_request(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_event_pipe_t  *p;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    p = u->pipe;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process upstream");[m
[31m-[m
[31m-    c->log->action = "reading upstream";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-[m
[31m-        if (rev->delayed) {[m
[31m-[m
[31m-            rev->timedout = 0;[m
[31m-            rev->delayed = 0;[m
[31m-[m
[31m-            if (!rev->ready) {[m
[31m-                ngx_add_timer(rev, p->read_timeout);[m
[31m-[m
[31m-                if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_event_pipe(p, 0) == NGX_ABORT) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p->upstream_error = 1;[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (rev->delayed) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http upstream delayed");[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_pipe(p, 0) == NGX_ABORT) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_request(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_temp_file_t   *tf;[m
[31m-    ngx_event_pipe_t  *p;[m
[31m-[m
[31m-    p = u->pipe;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (p->writing) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-        if (u->store) {[m
[31m-[m
[31m-            if (p->upstream_eof || p->upstream_done) {[m
[31m-[m
[31m-                tf = p->temp_file;[m
[31m-[m
[31m-                if (u->headers_in.status_n == NGX_HTTP_OK[m
[31m-                    && (p->upstream_done || p->length == -1)[m
[31m-                    && (u->headers_in.content_length_n == -1[m
[31m-                        || u->headers_in.content_length_n == tf->offset))[m
[31m-                {[m
[31m-                    ngx_http_upstream_store(r, u);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cacheable) {[m
[31m-[m
[31m-            if (p->upstream_done) {[m
[31m-                ngx_http_file_cache_update(r, p->temp_file);[m
[31m-[m
[31m-            } else if (p->upstream_eof) {[m
[31m-[m
[31m-                tf = p->temp_file;[m
[31m-[m
[31m-                if (p->length == -1[m
[31m-                    && (u->headers_in.content_length_n == -1[m
[31m-                        || u->headers_in.content_length_n[m
[31m-                           == tf->offset - (off_t) r->cache->body_start))[m
[31m-                {[m
[31m-                    ngx_http_file_cache_update(r, tf);[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_http_file_cache_free(r->cache, tf);[m
[31m-                }[m
[31m-[m
[31m-            } else if (p->upstream_error) {[m
[31m-                ngx_http_file_cache_free(r->cache, p->temp_file);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (p->upstream_done || p->upstream_eof || p->upstream_error) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http upstream exit: %p", p->out);[m
[31m-[m
[31m-            if (p->upstream_done[m
[31m-                || (p->upstream_eof && p->length == -1))[m
[31m-            {[m
[31m-                ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (p->upstream_eof) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream prematurely closed connection");[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->downstream_error) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream downstream error");[m
[31m-[m
[31m-        if (!u->cacheable && !u->store && u->peer.connection) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    size_t                  root;[m
[31m-    time_t                  lm;[m
[31m-    ngx_str_t               path;[m
[31m-    ngx_temp_file_t        *tf;[m
[31m-    ngx_ext_rename_file_t   ext;[m
[31m-[m
[31m-    tf = u->pipe->temp_file;[m
[31m-[m
[31m-    if (tf->file.fd == NGX_INVALID_FILE) {[m
[31m-[m
[31m-        /* create file for empty 200 response */[m
[31m-[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = u->conf->temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->persistent = 1;[m
[31m-[m
[31m-        if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                 tf->persistent, tf->clean, tf->access)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->pipe->temp_file = tf;[m
[31m-    }[m
[31m-[m
[31m-    ext.access = u->conf->store_access;[m
[31m-    ext.path_access = u->conf->store_access;[m
[31m-    ext.time = -1;[m
[31m-    ext.create_path = 1;[m
[31m-    ext.delete_file = 1;[m
[31m-    ext.log = r->connection->log;[m
[31m-[m
[31m-    if (u->headers_in.last_modified) {[m
[31m-[m
[31m-        lm = ngx_parse_http_time(u->headers_in.last_modified->value.data,[m
[31m-                                 u->headers_in.last_modified->value.len);[m
[31m-[m
[31m-        if (lm != NGX_ERROR) {[m
[31m-            ext.time = lm;[m
[31m-            ext.fd = tf->file.fd;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->store_lengths == NULL) {[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_script_run(r, &path, u->conf->store_lengths->elts, 0,[m
[31m-                                u->conf->store_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    path.len--;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream stores \"%s\" to \"%s\"",[m
[31m-                   tf->file.name.data, path.data);[m
[31m-[m
[31m-    (void) ngx_ext_rename_file(&tf->file.name, &path, &ext);[m
[31m-[m
[31m-    u->store = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dummy_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_msec_t  timeout;[m
[31m-    ngx_uint_t  status, state;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http next upstream, %xi", ft_type);[m
[31m-[m
[31m-    if (u->peer.sockaddr) {[m
[31m-[m
[31m-        if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_403[m
[31m-            || ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404)[m
[31m-        {[m
[31m-            state = NGX_PEER_NEXT;[m
[31m-[m
[31m-        } else {[m
[31m-            state = NGX_PEER_FAILED;[m
[31m-        }[m
[31m-[m
[31m-        u->peer.free(&u->peer, u->peer.data, state);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        /* TODO: inform balancer instead */[m
[31m-        u->peer.tries++;[m
[31m-    }[m
[31m-[m
[31m-    switch (ft_type) {[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_TIMEOUT:[m
[31m-        status = NGX_HTTP_GATEWAY_TIME_OUT;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_500:[m
[31m-        status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_403:[m
[31m-        status = NGX_HTTP_FORBIDDEN;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_404:[m
[31m-        status = NGX_HTTP_NOT_FOUND;[m
[31m-        break;[m
[31m-[m
[31m-    /*[m
[31m-     * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING[m
[31m-     * never reach here[m
[31m-     */[m
[31m-[m
[31m-    default:[m
[31m-        status = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->error) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->status = status;[m
[31m-[m
[31m-    timeout = u->conf->next_upstream_timeout;[m
[31m-[m
[31m-    if (u->request_sent[m
[31m-        && (r->method & (NGX_HTTP_POST|NGX_HTTP_LOCK|NGX_HTTP_PATCH)))[m
[31m-    {[m
[31m-        ft_type |= NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.tries == 0[m
[31m-        || ((u->conf->next_upstream & ft_type) != ft_type)[m
[31m-        || (u->request_sent && r->request_body_no_buffering)[m
[31m-        || (timeout && ngx_current_msec - u->peer.start_time >= timeout))[m
[31m-    {[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-            && (u->conf->cache_use_stale & ft_type))[m
[31m-        {[m
[31m-            ngx_int_t  rc;[m
[31m-[m
[31m-            rc = u->reinit_request(r);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                u->cache_status = NGX_HTTP_CACHE_STALE;[m
[31m-                rc = ngx_http_upstream_cache_send(r, u);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, status);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-            u->peer.connection->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-        u->peer.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t *r = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup http upstream request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_http_upstream_finalize_request(r, r->upstream, NGX_DONE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_uint_t  flush;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http upstream request: %i", rc);[m
[31m-[m
[31m-    if (u->cleanup == NULL) {[m
[31m-        /* the request was already finalized */[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *u->cleanup = NULL;[m
[31m-    u->cleanup = NULL;[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-        if (u->pipe && u->pipe->read_length) {[m
[31m-            u->state->response_length = u->pipe->read_length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->finalize_request(r, rc);[m
[31m-[m
[31m-    if (u->peer.free && u->peer.sockaddr) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        /* TODO: do not shutdown persistent connection */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-[m
[31m-            /*[m
[31m-             * We send the "close notify" shutdown alert to the upstream only[m
[31m-             * and do not wait its "close notify" shutdown alert.[m
[31m-             * It is acceptable according to the TLS standard.[m
[31m-             */[m
[31m-[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    u->peer.connection = NULL;[m
[31m-[m
[31m-    if (u->pipe && u->pipe->temp_file) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream temp fd: %d",[m
[31m-                       u->pipe->temp_file->file.fd);[m
[31m-    }[m
[31m-[m
[31m-    if (u->store && u->pipe && u->pipe->temp_file[m
[31m-        && u->pipe->temp_file->file.fd != NGX_INVALID_FILE)[m
[31m-    {[m
[31m-        if (ngx_delete_file(u->pipe->temp_file->file.name.data)[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                          ngx_delete_file_n " \"%s\" failed",[m
[31m-                          u->pipe->temp_file->file.name.data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-[m
[31m-        if (u->cacheable) {[m
[31m-[m
[31m-            if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT) {[m
[31m-                time_t  valid;[m
[31m-[m
[31m-                valid = ngx_http_file_cache_valid(u->conf->cache_valid, rc);[m
[31m-[m
[31m-                if (valid) {[m
[31m-                    r->cache->valid_sec = ngx_time() + valid;[m
[31m-                    r->cache->error = rc;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (r->subrequest_in_memory[m
[31m-        && u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-    {[m
[31m-        u->buffer.last = u->buffer.pos;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "sending to client";[m
[31m-[m
[31m-    if (!u->header_sent[m
[31m-        || rc == NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        || (u->pipe && u->pipe->downstream_error))[m
[31m-    {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    flush = 0;[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        rc = NGX_ERROR;[m
[31m-        flush = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-    } else if (flush) {[m
[31m-        r->keepalive = 0;[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_FLUSH);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->headers_in.content_length = h;[m
[31m-    u->headers_in.content_length_n = ngx_atoof(h->value.data, h->value.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->headers_in.last_modified = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-        u->headers_in.last_modified_time = ngx_parse_http_time(h->value.data,[m
[31m-                                                               h->value.len);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t           *pa;[m
[31m-    ngx_table_elt_t      **ph;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pa = &u->headers_in.cookies;[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 1, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (!(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE)) {[m
[31m-        u->cacheable = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t          *pa;[m
[31m-    ngx_table_elt_t     **ph;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pa = &u->headers_in.cache_control;[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    u_char     *p, *start, *last;[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache->valid_sec != 0 && u->headers_in.x_accel_expires != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    start = h->value.data;[m
[31m-    last = start + h->value.len;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(start, last, (u_char *) "no-cache", 8 - 1) != NULL[m
[31m-        || ngx_strlcasestrn(start, last, (u_char *) "no-store", 8 - 1) != NULL[m
[31m-        || ngx_strlcasestrn(start, last, (u_char *) "private", 7 - 1) != NULL)[m
[31m-    {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlcasestrn(start, last, (u_char *) "s-maxage=", 9 - 1);[m
[31m-    offset = 9;[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        p = ngx_strlcasestrn(start, last, (u_char *) "max-age=", 8 - 1);[m
[31m-        offset = 8;[m
[31m-    }[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (p += offset; p < last; p++) {[m
[31m-        if (*p == ',' || *p == ';' || *p == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (*p >= '0' && *p <= '9') {[m
[31m-            n = n * 10 + *p - '0';[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->valid_sec = ngx_time() + n;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_expires(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.expires = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    time_t  expires;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_EXPIRES) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache->valid_sec != 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    expires = ngx_parse_http_time(h->value.data, h->value.len);[m
[31m-[m
[31m-    if (expires == NGX_ERROR || expires < ngx_time()) {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->valid_sec = expires;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.x_accel_expires = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    u_char     *p;[m
[31m-    size_t      len;[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = h->value.len;[m
[31m-    p = h->value.data;[m
[31m-[m
[31m-    if (p[0] != '@') {[m
[31m-        n = ngx_atoi(p, len);[m
[31m-[m
[31m-        switch (n) {[m
[31m-        case 0:[m
[31m-            u->cacheable = 0;[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        default:[m
[31m-            r->cache->valid_sec = ngx_time() + n;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p++;[m
[31m-    len--;[m
[31m-[m
[31m-    n = ngx_atoi(p, len);[m
[31m-[m
[31m-    if (n != NGX_ERROR) {[m
[31m-        r->cache->valid_sec = n;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.x_accel_limit_rate = h;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(h->value.data, h->value.len);[m
[31m-[m
[31m-    if (n != NGX_ERROR) {[m
[31m-        r->limit_rate = (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_buffering(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char                c0, c1, c2;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->change_buffering) {[m
[31m-[m
[31m-        if (h->value.len == 2) {[m
[31m-            c0 = ngx_tolower(h->value.data[0]);[m
[31m-            c1 = ngx_tolower(h->value.data[1]);[m
[31m-[m
[31m-            if (c0 == 'n' && c1 == 'o') {[m
[31m-                u->buffering = 0;[m
[31m-            }[m
[31m-[m
[31m-        } else if (h->value.len == 3) {[m
[31m-            c0 = ngx_tolower(h->value.data[0]);[m
[31m-            c1 = ngx_tolower(h->value.data[1]);[m
[31m-            c2 = ngx_tolower(h->value.data[2]);[m
[31m-[m
[31m-            if (c0 == 'y' && c1 == 'e' && c2 == 's') {[m
[31m-                u->buffering = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_charset(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    if (r->upstream->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_CHARSET) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.override_charset = &h->value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    r->upstream->headers_in.connection = h;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,[m
[31m-                         (u_char *) "close", 5 - 1)[m
[31m-        != NULL)[m
[31m-    {[m
[31m-        r->upstream->headers_in.connection_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    r->upstream->headers_in.transfer_encoding = h;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,[m
[31m-                         (u_char *) "chunked", 7 - 1)[m
[31m-        != NULL)[m
[31m-    {[m
[31m-        r->upstream->headers_in.chunked = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_vary(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.vary = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_VARY) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (h->value.len > NGX_HTTP_CACHE_VARY_LEN[m
[31m-        || (h->value.len == 1 && h->value.data[0] == '*'))[m
[31m-    {[m
[31m-        u->cacheable = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->vary = h->value;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (offset) {[m
[31m-        ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);[m
[31m-        *ph = ho;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    r->headers_out.content_type_len = h->value.len;[m
[31m-    r->headers_out.content_type = h->value;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    for (p = h->value.data; *p; p++) {[m
[31m-[m
[31m-        if (*p != ';') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        last = p;[m
[31m-[m
[31m-        while (*++p == ' ') { /* void */ }[m
[31m-[m
[31m-        if (*p == '\0') {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p += 8;[m
[31m-[m
[31m-        r->headers_out.content_type_len = last - h->value.data;[m
[31m-[m
[31m-        if (*p == '"') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        last = h->value.data + h->value.len;[m
[31m-[m
[31m-        if (*(last - 1) == '"') {[m
[31m-            last--;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.charset.len = last - p;[m
[31m-        r->headers_out.charset.data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.last_modified = ho;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->upstream->cacheable) {[m
[31m-        r->headers_out.last_modified_time =[m
[31m-                                    r->upstream->headers_in.last_modified_time;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_redirect) {[m
[31m-        rc = r->upstream->rewrite_redirect(r, ho, 0);[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->headers_out.location = ho;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten location: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ho->value.data[0] != '/') {[m
[31m-        r->headers_out.location = ho;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_redirect) {[m
[31m-[m
[31m-        p = ngx_strcasestrn(ho->value.data, "url=", 4 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data);[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->headers_out.refresh = ho;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten refresh: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.refresh = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_cookie) {[m
[31m-        rc = r->upstream->rewrite_cookie(r, ho);[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        if (rc == NGX_OK) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten cookie: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    if (r->upstream->conf->force_ranges) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cached) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->upstream->cacheable) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        r->single_range = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.accept_ranges = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.content_encoding = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_upstream_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for (i = 0; i < r->upstream_states->nelts; i++) {[m
[31m-        if (state[i].peer) {[m
[31m-            len += state[i].peer->len + 2;[m
[31m-[m
[31m-        } else {[m
[31m-            len += 3;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].peer) {[m
[31m-            p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len);[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (3 + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].status) {[m
[31m-            p = ngx_sprintf(p, "%ui", state[i].status);[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = '-';[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_response_time_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].status) {[m
[31m-[m
[31m-            if (data == 1 && state[i].header_time != (ngx_msec_t) -1) {[m
[31m-                ms = state[i].header_time;[m
[31m-[m
[31m-            } else if (data == 2 && state[i].connect_time != (ngx_msec_t) -1) {[m
[31m-                ms = state[i].connect_time;[m
[31m-[m
[31m-            } else {[m
[31m-                ms = state[i].response_time;[m
[31m-            }[m
[31m-[m
[31m-            ms = ngx_max(ms, 0);[m
[31m-            p = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000);[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = '-';[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_response_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (NGX_OFF_T_LEN + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        p = ngx_sprintf(p, "%O", state[i].response_length);[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_header_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->upstream == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,[m
[31m-                                         &r->upstream->headers_in.headers.part,[m
[31m-                                         sizeof("upstream_http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_cookie_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  *name = (ngx_str_t *) data;[m
[31m-[m
[31m-    ngx_str_t   cookie, s;[m
[31m-[m
[31m-    if (r->upstream == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    s.len = name->len - (sizeof("upstream_cookie_") - 1);[m
[31m-    s.data = name->data + sizeof("upstream_cookie_") - 1;[m
[31m-[m
[31m-    if (ngx_http_parse_set_cookie_lines(&r->upstream->headers_in.cookies,[m
[31m-                                        &s, &cookie)[m
[31m-        == NGX_DECLINED)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = cookie.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = cookie.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_cache_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t  n;[m
[31m-[m
[31m-    if (r->upstream == NULL || r->upstream->cache_status == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = r->upstream->cache_status - 1;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = ngx_http_cache_status[n].len;[m
[31m-    v->data = ngx_http_cache_status[n].data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->upstream == NULL[m
[31m-        || !r->upstream->conf->cache_revalidate[m
[31m-        || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED[m
[31m-        || r->cache->last_modified == -1)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_http_time(p, r->cache->last_modified) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_etag(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->upstream == NULL[m
[31m-        || !r->upstream->conf->cache_revalidate[m
[31m-        || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED[m
[31m-        || r->cache->etag.len == 0)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = r->cache->etag.len;[m
[31m-    v->data = r->cache->etag.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                          *rv;[m
[31m-    void                          *mconf;[m
[31m-    ngx_str_t                     *value;[m
[31m-    ngx_url_t                      u;[m
[31m-    ngx_uint_t                     m;[m
[31m-    ngx_conf_t                     pcf;[m
[31m-    ngx_http_module_t             *module;[m
[31m-    ngx_http_conf_ctx_t           *ctx, *http_ctx;[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    u.host = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-    u.no_port = 1;[m
[31m-[m
[31m-    uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE[m
[31m-                                         |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                                         |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                                         |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                                         |NGX_HTTP_UPSTREAM_DOWN[m
[31m-                                         |NGX_HTTP_UPSTREAM_BACKUP);[m
[31m-    if (uscf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx = cf->ctx;[m
[31m-    ctx->main_conf = http_ctx->main_conf;[m
[31m-[m
[31m-    /* the upstream{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->srv_conf[ngx_http_upstream_module.ctx_index] = uscf;[m
[31m-[m
[31m-    uscf->srv_conf = ctx->srv_conf;[m
[31m-[m
[31m-[m
[31m-    /* the upstream{}'s loc_conf */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    uscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                                     sizeof(ngx_http_upstream_server_t));[m
[31m-    if (uscf->servers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside upstream{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_UPS_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (uscf->servers->nelts == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no servers are inside upstream");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf = conf;[m
[31m-[m
[31m-    time_t                       fail_timeout;[m
[31m-    ngx_str_t                   *value, s;[m
[31m-    ngx_url_t                    u;[m
[31m-    ngx_int_t                    weight, max_fails;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_http_upstream_server_t  *us;[m
[31m-[m
[31m-    us = ngx_array_push(uscf->servers);[m
[31m-    if (us == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(us, sizeof(ngx_http_upstream_server_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    weight = 1;[m
[31m-    max_fails = 1;[m
[31m-    fail_timeout = 10;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            weight = ngx_atoi(&value[i].data[7], value[i].len - 7);[m
[31m-[m
[31m-            if (weight == NGX_ERROR || weight == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);[m
[31m-[m
[31m-            if (max_fails == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 13;[m
[31m-            s.data = &value[i].data[13];[m
[31m-[m
[31m-            fail_timeout = ngx_parse_time(&s, 1);[m
[31m-[m
[31m-            if (fail_timeout == (time_t) NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "backup") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->backup = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "down") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->down = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = 80;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in upstream \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->name = u.url;[m
[31m-    us->addrs = u.addrs;[m
[31m-    us->naddrs = u.naddrs;[m
[31m-    us->weight = weight;[m
[31m-    us->max_fails = max_fails;[m
[31m-    us->fail_timeout = fail_timeout;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid parameter \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-not_supported:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "balancing method does not support parameter \"%V\"",[m
[31m-                       &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_http_upstream_server_t     *us;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) {[m
[31m-[m
[31m-        if (ngx_parse_url(cf->pool, u) != NGX_OK) {[m
[31m-            if (u->err) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "%s in upstream \"%V\"", u->err, &u->url);[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != u->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_UPSTREAM_CREATE)[m
[31m-             && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate upstream \"%V\"", &u->host);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && !u->no_port) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "upstream \"%V\" may not have port %d",[m
[31m-                               &u->host, u->port);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_UPSTREAM_CREATE) && !uscfp[i]->no_port) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                          "upstream \"%V\" may not have port %d in %s:%ui",[m
[31m-                          &u->host, uscfp[i]->port,[m
[31m-                          uscfp[i]->file_name, uscfp[i]->line);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port && u->port[m
[31m-            && uscfp[i]->port != u->port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && u->default_port[m
[31m-            && uscfp[i]->default_port != u->default_port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_HTTP_UPSTREAM_CREATE) {[m
[31m-            uscfp[i]->flags = flags;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_srv_conf_t));[m
[31m-    if (uscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = flags;[m
[31m-    uscf->host = u->host;[m
[31m-    uscf->file_name = cf->conf_file->file.name.data;[m
[31m-    uscf->line = cf->conf_file->line;[m
[31m-    uscf->port = u->port;[m
[31m-    uscf->default_port = u->default_port;[m
[31m-    uscf->no_port = u->no_port;[m
[31m-[m
[31m-    if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) {[m
[31m-        uscf->servers = ngx_array_create(cf->pool, 1,[m
[31m-                                         sizeof(ngx_http_upstream_server_t));[m
[31m-        if (uscf->servers == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        us = ngx_array_push(uscf->servers);[m
[31m-        if (us == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(us, sizeof(ngx_http_upstream_server_t));[m
[31m-[m
[31m-        us->addrs = u->addrs;[m
[31m-        us->naddrs = 1;[m
[31m-    }[m
[31m-[m
[31m-    uscfp = ngx_array_push(&umcf->upstreams);[m
[31m-    if (uscfp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *uscfp = uscf;[m
[31m-[m
[31m-    return uscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t                           rc;[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_http_complex_value_t            cv;[m
[31m-    ngx_http_upstream_local_t         **plocal, *local;[m
[31m-    ngx_http_compile_complex_value_t    ccv;[m
[31m-[m
[31m-    plocal = (ngx_http_upstream_local_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*plocal != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        *plocal = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    local = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_local_t));[m
[31m-    if (local == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *plocal = local;[m
[31m-[m
[31m-    if (cv.lengths) {[m
[31m-        local->value = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (local->value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *local->value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));[m
[31m-    if (local->addr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(cf->pool, local->addr, value[1].data, value[1].len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        local->addr->name = value[1];[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid address \"%V\"", &value[1]);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_addr_t *[m
[31m-ngx_http_upstream_get_local(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_local_t *local)[m
[31m-{[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_str_t    val;[m
[31m-    ngx_addr_t  *addr;[m
[31m-[m
[31m-    if (local == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (local->value == NULL) {[m
[31m-        return local->addr;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, local->value, &val) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    addr = ngx_palloc(r->pool, sizeof(ngx_addr_t));[m
[31m-    if (addr == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(r->pool, addr, val.data, val.len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        addr->name = val;[m
[31m-        return addr;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid local address \"%V\"", &val);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_array_t                **a;[m
[31m-    ngx_http_upstream_param_t   *param;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_http_upstream_param_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    param = ngx_array_push(*a);[m
[31m-    if (param == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    param->key = value[1];[m
[31m-    param->value = value[2];[m
[31m-    param->skip_empty = 0;[m
[31m-[m
[31m-    if (cf->args->nelts == 4) {[m
[31m-        if (ngx_strcmp(value[3].data, "if_not_empty") != 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[3]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        param->skip_empty = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,[m
[31m-    ngx_str_t *default_hide_headers, ngx_hash_init_t *hash)[m
[31m-{[m
[31m-    ngx_str_t       *h;[m
[31m-    ngx_uint_t       i, j;[m
[31m-    ngx_array_t      hide_headers;[m
[31m-    ngx_hash_key_t  *hk;[m
[31m-[m
[31m-    if (conf->hide_headers == NGX_CONF_UNSET_PTR[m
[31m-        && conf->pass_headers == NGX_CONF_UNSET_PTR)[m
[31m-    {[m
[31m-        conf->hide_headers = prev->hide_headers;[m
[31m-        conf->pass_headers = prev->pass_headers;[m
[31m-[m
[31m-        conf->hide_headers_hash = prev->hide_headers_hash;[m
[31m-[m
[31m-        if (conf->hide_headers_hash.buckets[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-            && ((conf->cache == 0) == (prev->cache == 0))[m
[31m-#endif[m
[31m-           )[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (conf->hide_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->hide_headers = prev->hide_headers;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->pass_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->pass_headers = prev->pass_headers;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (h = default_hide_headers; h->len; h++) {[m
[31m-        hk = ngx_array_push(&hide_headers);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = *h;[m
[31m-        hk->key_hash = ngx_hash_key_lc(h->data, h->len);[m
[31m-        hk->value = (void *) 1;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->hide_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->hide_headers->elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->hide_headers->nelts; i++) {[m
[31m-[m
[31m-            hk = hide_headers.elts;[m
[31m-[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    goto exist;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hk = ngx_array_push(&hide_headers);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key = h[i];[m
[31m-            hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-        exist:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pass_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->pass_headers->elts;[m
[31m-        hk = hide_headers.elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->pass_headers->nelts; i++) {[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-[m
[31m-                if (hk[j].key.data == NULL) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    hk[j].key.data = NULL;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hash->hash = &conf->hide_headers_hash;[m
[31m-    hash->key = ngx_hash_key_lc;[m
[31m-    hash->pool = cf->pool;[m
[31m-    hash->temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_upstream_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t));[m
[31m-    if (umcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&umcf->upstreams, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_upstream_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return umcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_array_t                     headers_in;[m
[31m-    ngx_hash_key_t                 *hk;[m
[31m-    ngx_hash_init_t                 hash;[m
[31m-    ngx_http_upstream_init_pt       init;[m
[31m-    ngx_http_upstream_header_t     *header;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream:[m
[31m-                                            ngx_http_upstream_init_round_robin;[m
[31m-[m
[31m-        if (init(cf, uscfp[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* upstream_headers_in_hash */[m
[31m-[m
[31m-    if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (header = ngx_http_upstream_headers_in; header->name.len; header++) {[m
[31m-        hk = ngx_array_push(&headers_in);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = header->name;[m
[31m-        hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);[m
[31m-        hk->value = header;[m
[31m-    }[m
[31m-[m
[31m-    hash.hash = &umcf->headers_in_hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "upstream_headers_in_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 1386bdb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,6126 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_cache_get(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_http_file_cache_t **cache);[m
[31m-static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_cache_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_cache_etag(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#endif[m
[31m-[m
[31m-static void ngx_http_upstream_init_request(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev);[m
[31m-static void ngx_http_upstream_connect(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_send_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write);[m
[31m-static ngx_int_t ngx_http_upstream_send_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write);[m
[31m-static void ngx_http_upstream_send_request_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_read_request_handler(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_process_header(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_test_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_intercept_errors(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_http_upstream_process_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_send_response(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgrade(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_upgraded(ngx_http_request_t *r,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void[m
[31m-    ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,[m
[31m-    ngx_uint_t do_write);[m
[31m-static ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data);[m
[31m-static ngx_int_t ngx_http_upstream_non_buffered_filter(void *data,[m
[31m-    ssize_t bytes);[m
[31m-#if (NGX_THREADS)[m
[31m-static ngx_int_t ngx_http_upstream_thread_handler(ngx_thread_task_t *task,[m
[31m-    ngx_file_t *file);[m
[31m-static void ngx_http_upstream_thread_event_handler(ngx_event_t *ev);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_upstream_output_filter(void *data,[m
[31m-    ngx_chain_t *chain);[m
[31m-static void ngx_http_upstream_process_downstream(ngx_http_request_t *r);[m
[31m-static void ngx_http_upstream_process_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_process_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_store(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-static void ngx_http_upstream_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_upstream_cleanup(void *data);[m
[31m-static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc);[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_set_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_process_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_buffering(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_charset(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_connection(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_process_vary(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-static ngx_int_t ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf);[m
[31m-static ngx_int_t ngx_http_upstream_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_upstream_response_length_variable([m
[31m-    ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static char *ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy);[m
[31m-static char *ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-static ngx_addr_t *ngx_http_upstream_get_local(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_local_t *local);[m
[31m-[m
[31m-static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c);[m
[31m-static void ngx_http_upstream_ssl_handshake(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_http_upstream_ssl_name(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_header_t  ngx_http_upstream_headers_in[] = {[m
[31m-[m
[31m-    { ngx_string("Status"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, status),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, content_type),[m
[31m-                 ngx_http_upstream_copy_content_type, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 ngx_http_upstream_process_content_length, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, date),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, date), 0 },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 ngx_http_upstream_process_last_modified, 0,[m
[31m-                 ngx_http_upstream_copy_last_modified, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, etag),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, etag), 0 },[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, server),[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, server), 0 },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, www_authenticate),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, location),[m
[31m-                 ngx_http_upstream_rewrite_location, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_rewrite_refresh, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Set-Cookie"),[m
[31m-                 ngx_http_upstream_process_set_cookie,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, cookies),[m
[31m-                 ngx_http_upstream_rewrite_set_cookie, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Disposition"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 1 },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 ngx_http_upstream_process_cache_control, 0,[m
[31m-                 ngx_http_upstream_copy_multi_header_lines,[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control), 1 },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 ngx_http_upstream_process_expires, 0,[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, expires), 1 },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, accept_ranges),[m
[31m-                 ngx_http_upstream_copy_allow_ranges,[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges), 1 },[m
[31m-[m
[31m-    { ngx_string("Content-Range"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line,[m
[31m-                 offsetof(ngx_http_headers_out_t, content_range), 0 },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 ngx_http_upstream_process_connection, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Vary"),[m
[31m-                 ngx_http_upstream_process_vary, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Powered-By"),[m
[31m-                 ngx_http_upstream_ignore_header_line, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Expires"),[m
[31m-                 ngx_http_upstream_process_accel_expires, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Redirect"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect),[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Limit-Rate"),[m
[31m-                 ngx_http_upstream_process_limit_rate, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Buffering"),[m
[31m-                 ngx_http_upstream_process_buffering, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("X-Accel-Charset"),[m
[31m-                 ngx_http_upstream_process_charset, 0,[m
[31m-                 ngx_http_upstream_copy_header_line, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 ngx_http_upstream_process_transfer_encoding, 0,[m
[31m-                 ngx_http_upstream_ignore_header_line, 0, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 ngx_http_upstream_process_header_line,[m
[31m-                 offsetof(ngx_http_upstream_headers_in_t, content_encoding),[m
[31m-                 ngx_http_upstream_copy_content_encoding, 0, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, 0, NULL, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_upstream_commands[] = {[m
[31m-[m
[31m-    { ngx_string("upstream"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,[m
[31m-      ngx_http_upstream,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_http_upstream_server,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_upstream_module_ctx = {[m
[31m-    ngx_http_upstream_add_variables,       /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_upstream_create_main_conf,    /* create main configuration */[m
[31m-    ngx_http_upstream_init_main_conf,      /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_upstream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_upstream_module_ctx,         /* module context */[m
[31m-    ngx_http_upstream_commands,            /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_upstream_vars[] = {[m
[31m-[m
[31m-    { ngx_string("upstream_addr"), NULL,[m
[31m-      ngx_http_upstream_addr_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_status"), NULL,[m
[31m-      ngx_http_upstream_status_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_connect_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 2,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_header_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 1,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_response_time"), NULL,[m
[31m-      ngx_http_upstream_response_time_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_response_length"), NULL,[m
[31m-      ngx_http_upstream_response_length_variable, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    { ngx_string("upstream_cache_status"), NULL,[m
[31m-      ngx_http_upstream_cache_status, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_cache_last_modified"), NULL,[m
[31m-      ngx_http_upstream_cache_last_modified, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("upstream_cache_etag"), NULL,[m
[31m-      ngx_http_upstream_cache_etag, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_next_t  ngx_http_upstream_next_errors[] = {[m
[31m-    { 500, NGX_HTTP_UPSTREAM_FT_HTTP_500 },[m
[31m-    { 502, NGX_HTTP_UPSTREAM_FT_HTTP_502 },[m
[31m-    { 503, NGX_HTTP_UPSTREAM_FT_HTTP_503 },[m
[31m-    { 504, NGX_HTTP_UPSTREAM_FT_HTTP_504 },[m
[31m-    { 403, NGX_HTTP_UPSTREAM_FT_HTTP_403 },[m
[31m-    { 404, NGX_HTTP_UPSTREAM_FT_HTTP_404 },[m
[31m-    { 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_conf_bitmask_t  ngx_http_upstream_cache_method_mask[] = {[m
[31m-    { ngx_string("GET"), NGX_HTTP_GET },[m
[31m-    { ngx_string("HEAD"), NGX_HTTP_HEAD },[m
[31m-    { ngx_string("POST"), NGX_HTTP_POST },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_conf_bitmask_t  ngx_http_upstream_ignore_headers_masks[] = {[m
[31m-    { ngx_string("X-Accel-Redirect"), NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT },[m
[31m-    { ngx_string("X-Accel-Expires"), NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES },[m
[31m-    { ngx_string("X-Accel-Limit-Rate"), NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE },[m
[31m-    { ngx_string("X-Accel-Buffering"), NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING },[m
[31m-    { ngx_string("X-Accel-Charset"), NGX_HTTP_UPSTREAM_IGN_XA_CHARSET },[m
[31m-    { ngx_string("Expires"), NGX_HTTP_UPSTREAM_IGN_EXPIRES },[m
[31m-    { ngx_string("Cache-Control"), NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL },[m
[31m-    { ngx_string("Set-Cookie"), NGX_HTTP_UPSTREAM_IGN_SET_COOKIE },[m
[31m-    { ngx_string("Vary"), NGX_HTTP_UPSTREAM_IGN_VARY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_create(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u && u->cleanup) {[m
[31m-        r->main->count++;[m
[31m-        ngx_http_upstream_cleanup(r);[m
[31m-    }[m
[31m-[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream = u;[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    r->cache = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_init(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http init upstream, client timer: %d", c->read->timer_set);[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        ngx_http_upstream_init_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-[m
[31m-        if (!c->write->active) {[m
[31m-            if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_init_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_init_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_str_t                      *host;[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_resolver_ctx_t             *ctx, temp;[m
[31m-    ngx_http_cleanup_t             *cln;[m
[31m-    ngx_http_upstream_t            *u;[m
[31m-    ngx_http_core_loc_conf_t       *clcf;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (r->aio) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->cache) {[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache(r, u);[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            r->write_event_handler = ngx_http_upstream_init_request;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = ngx_http_upstream_cache_send(r, u);[m
[31m-[m
[31m-            if (rc == NGX_DONE) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {[m
[31m-                rc = NGX_DECLINED;[m
[31m-                r->cached = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            ngx_http_finalize_request(r, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->store = u->conf->store;[m
[31m-[m
[31m-    if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;[m
[31m-        r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body) {[m
[31m-        u->request_bufs = r->request_body->bufs;[m
[31m-    }[m
[31m-[m
[31m-    if (u->create_request(r) != NGX_OK) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.local = ngx_http_upstream_get_local(r, u->conf->local);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    u->output.alignment = clcf->directio_alignment;[m
[31m-    u->output.pool = r->pool;[m
[31m-    u->output.bufs.num = 1;[m
[31m-    u->output.bufs.size = clcf->client_body_buffer_size;[m
[31m-[m
[31m-    if (u->output.output_filter == NULL) {[m
[31m-        u->output.output_filter = ngx_chain_writer;[m
[31m-        u->output.filter_ctx = &u->writer;[m
[31m-    }[m
[31m-[m
[31m-    u->writer.pool = r->pool;[m
[31m-[m
[31m-    if (r->upstream_states == NULL) {[m
[31m-[m
[31m-        r->upstream_states = ngx_array_create(r->pool, 1,[m
[31m-                                            sizeof(ngx_http_upstream_state_t));[m
[31m-        if (r->upstream_states == NULL) {[m
[31m-            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        u->state = ngx_array_push(r->upstream_states);[m
[31m-        if (u->state == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_upstream_cleanup;[m
[31m-    cln->data = r;[m
[31m-    u->cleanup = &cln->handler;[m
[31m-[m
[31m-    if (u->resolved == NULL) {[m
[31m-[m
[31m-        uscf = u->conf->upstream;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-        u->ssl_name = u->resolved->host;[m
[31m-#endif[m
[31m-[m
[31m-        host = &u->resolved->host;[m
[31m-[m
[31m-        if (u->resolved->sockaddr) {[m
[31m-[m
[31m-            if (u->resolved->port == 0[m
[31m-                && u->resolved->sockaddr->sa_family != AF_UNIX)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "no port in upstream \"%V\"", host);[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_connect(r, u);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-        uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->host.len == host->len[m
[31m-                && ((uscf->port == 0 && u->resolved->no_port)[m
[31m-                     || uscf->port == u->resolved->port)[m
[31m-                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)[m
[31m-            {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (u->resolved->port == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no port in upstream \"%V\"", host);[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        temp.name = *host;[m
[31m-[m
[31m-        ctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-        if (ctx == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx == NGX_NO_RESOLVER) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "no resolver defined to resolve %V", host);[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->name = *host;[m
[31m-        ctx->handler = ngx_http_upstream_resolve_handler;[m
[31m-        ctx->data = r;[m
[31m-        ctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-        u->resolved->ctx = ctx;[m
[31m-[m
[31m-        if (ngx_resolve_name(ctx) != NGX_OK) {[m
[31m-            u->resolved->ctx = NULL;[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (uscf == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "no upstream configuration");[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    u->ssl_name = uscf->host;[m
[31m-#endif[m
[31m-[m
[31m-    if (uscf->peer.init(r, uscf) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (u->conf->next_upstream_tries[m
[31m-        && u->peer.tries > u->conf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = u->conf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_http_cache_t       *c;[m
[31m-    ngx_http_file_cache_t  *cache;[m
[31m-[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-[m
[31m-        if (!(r->method & u->conf->cache_methods)) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_upstream_cache_get(r, u, &cache);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_HEAD && u->conf->cache_convert_head) {[m
[31m-            u->method = ngx_http_core_get_method;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_file_cache_new(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (u->create_key(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* TODO: add keys */[m
[31m-[m
[31m-        ngx_http_file_cache_create_key(r);[m
[31m-[m
[31m-        if (r->cache->header_start + 256 >= u->conf->buffer_size) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "%V_buffer_size %uz is not enough for cache key, "[m
[31m-                          "it should be increased to at least %uz",[m
[31m-                          &u->conf->module, u->conf->buffer_size,[m
[31m-                          ngx_align(r->cache->header_start + 256, 1024));[m
[31m-[m
[31m-            r->cache = NULL;[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        u->cacheable = 1;[m
[31m-[m
[31m-        c = r->cache;[m
[31m-[m
[31m-        c->body_start = u->conf->buffer_size;[m
[31m-        c->min_uses = u->conf->cache_min_uses;[m
[31m-        c->file_cache = cache;[m
[31m-[m
[31m-        switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) {[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        case NGX_DECLINED:[m
[31m-            u->cache_status = NGX_HTTP_CACHE_BYPASS;[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default: /* NGX_OK */[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        c->lock = u->conf->cache_lock;[m
[31m-        c->lock_timeout = u->conf->cache_lock_timeout;[m
[31m-        c->lock_age = u->conf->cache_lock_age;[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_MISS;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_file_cache_open(r);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream cache: %i", rc);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_UPDATING:[m
[31m-[m
[31m-        if (u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) {[m
[31m-            u->cache_status = rc;[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = NGX_HTTP_CACHE_STALE;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-        u->cache_status = NGX_HTTP_CACHE_HIT;[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_STALE:[m
[31m-[m
[31m-        c->valid_sec = 0;[m
[31m-        u->buffer.start = NULL;[m
[31m-        u->cache_status = NGX_HTTP_CACHE_EXPIRED;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-[m
[31m-        if ((size_t) (u->buffer.end - u->buffer.start) < u->conf->buffer_size) {[m
[31m-            u->buffer.start = NULL;[m
[31m-[m
[31m-        } else {[m
[31m-            u->buffer.pos = u->buffer.start + c->header_start;[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_CACHE_SCARCE:[m
[31m-[m
[31m-        u->cacheable = 0;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_AGAIN:[m
[31m-[m
[31m-        return NGX_BUSY;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        /* cached NGX_HTTP_BAD_GATEWAY, NGX_HTTP_GATEWAY_TIME_OUT, etc. */[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_HIT;[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->cached = 0;[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_get(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_http_file_cache_t **cache)[m
[31m-{[m
[31m-    ngx_str_t               *name, val;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_http_file_cache_t  **caches;[m
[31m-[m
[31m-    if (u->conf->cache_zone) {[m
[31m-        *cache = u->conf->cache_zone->data;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, u->conf->cache_value, &val) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len == 0[m
[31m-        || (val.len == 3 && ngx_strncmp(val.data, "off", 3) == 0))[m
[31m-    {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    caches = u->caches->elts;[m
[31m-[m
[31m-    for (i = 0; i < u->caches->nelts; i++) {[m
[31m-        name = &caches[i]->shm_zone->shm.name;[m
[31m-[m
[31m-        if (name->len == val.len[m
[31m-            && ngx_strncmp(name->data, val.data, val.len) == 0)[m
[31m-        {[m
[31m-            *cache = caches[i];[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "cache \"%V\" not found", &val);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_http_cache_t  *c;[m
[31m-[m
[31m-    r->cached = 1;[m
[31m-    c = r->cache;[m
[31m-[m
[31m-    if (c->header_start == c->body_start) {[m
[31m-        r->http_version = NGX_HTTP_VERSION_9;[m
[31m-        return ngx_http_cache_send(r);[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: cache stack */[m
[31m-[m
[31m-    u->buffer = *c->buf;[m
[31m-    u->buffer.pos += c->header_start;[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = u->process_header(r);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_cache_send(r);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_HTTP_UPSTREAM_INVALID_HEADER */[m
[31m-[m
[31m-    /* TODO: delete file */[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *r;[m
[31m-    ngx_http_upstream_t           *u;[m
[31m-    ngx_http_upstream_resolved_t  *ur;[m
[31m-[m
[31m-    r = ctx->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream resolve: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "%V could not be resolved (%i: %s)",[m
[31m-                      &ctx->name, ctx->state,[m
[31m-                      ngx_resolver_strerror(ctx->state));[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ur->naddrs = ctx->naddrs;[m
[31m-    ur->addrs = ctx->addrs;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-    u_char      text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t   addr;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-    ur->ctx = NULL;[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (u->conf->next_upstream_tries[m
[31m-        && u->peer.tries > u->conf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = u->conf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    r = c->data;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream request: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        u->write_event_handler(r, u);[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_check_broken_connection(r, r->connection->read);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_check_broken_connection(r, r->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    char                 buf[1];[m
[31m-    ngx_err_t            err;[m
[31m-    ngx_int_t            event;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "http upstream check client, write event:%d, \"%V\"",[m
[31m-                   ev->write, &r->uri);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-            event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-            if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!ev->pending_eof) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        if (ev->kq_errno) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                          "kevent() reported that client prematurely closed "[m
[31m-                          "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                      "kevent() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLLRDHUP)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ev->pending_eof) {[m
[31m-        socklen_t  len;[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-        c->error = 1;[m
[31m-[m
[31m-        err = 0;[m
[31m-        len = sizeof(ngx_err_t);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && u->peer.connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                        "epoll_wait() reported that client prematurely closed "[m
[31m-                        "connection, so upstream connection is closed too");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "epoll_wait() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        if (u->peer.connection == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,[m
[31m-                   "http upstream recv(): %d", n);[m
[31m-[m
[31m-    if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-        event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-        if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ev->error = 1;[m
[31m-[m
[31m-    } else { /* n == 0 */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev->eof = 1;[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (!u->cacheable && u->peer.connection) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                      "client prematurely closed connection, "[m
[31m-                      "so upstream connection is closed too");[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    if (u->peer.connection == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r->connection->log->action = "connecting to upstream";[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-    u->state = ngx_array_push(r->upstream_states);[m
[31m-    if (u->state == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));[m
[31m-[m
[31m-    u->state->response_time = ngx_current_msec;[m
[31m-    u->state->connect_time = (ngx_msec_t) -1;[m
[31m-    u->state->header_time = (ngx_msec_t) -1;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&u->peer);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->peer = u->peer.name;[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    c->data = r;[m
[31m-[m
[31m-    c->write->handler = ngx_http_upstream_handler;[m
[31m-    c->read->handler = ngx_http_upstream_handler;[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_upstream_send_request_handler;[m
[31m-    u->read_event_handler = ngx_http_upstream_process_header;[m
[31m-[m
[31m-    c->sendfile &= r->connection->sendfile;[m
[31m-    u->output.sendfile = c->sendfile;[m
[31m-[m
[31m-    if (c->pool == NULL) {[m
[31m-[m
[31m-        /* we need separate pool here to be able to cache SSL connections */[m
[31m-[m
[31m-        c->pool = ngx_create_pool(128, r->connection->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log = r->connection->log;[m
[31m-    c->pool->log = c->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */[m
[31m-[m
[31m-    u->writer.out = NULL;[m
[31m-    u->writer.last = &u->writer.out;[m
[31m-    u->writer.connection = c;[m
[31m-    u->writer.limit = 0;[m
[31m-[m
[31m-    if (u->request_sent) {[m
[31m-        if (ngx_http_upstream_reinit(r, u) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body[m
[31m-        && r->request_body->buf[m
[31m-        && r->request_body->temp_file[m
[31m-        && r == r->main)[m
[31m-    {[m
[31m-        /*[m
[31m-         * the r->request_body->buf can be reused for one request only,[m
[31m-         * the subrequests should allocate their own temporary bufs[m
[31m-         */[m
[31m-[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = r->request_body->buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-        u->output.allocated = 1;[m
[31m-[m
[31m-        r->request_body->buf->pos = r->request_body->buf->start;[m
[31m-        r->request_body->buf->last = r->request_body->buf->start;[m
[31m-        r->request_body->buf->tag = u->output.tag;[m
[31m-    }[m
[31m-[m
[31m-    u->request_sent = 0;[m
[31m-    u->request_body_sent = 0;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_connection_t *c)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(u->conf->ssl, c,[m
[31m-                                  NGX_SSL_BUFFER|NGX_SSL_CLIENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->sendfile = 0;[m
[31m-    u->output.sendfile = 0;[m
[31m-[m
[31m-    if (u->conf->ssl_server_name || u->conf->ssl_verify) {[m
[31m-        if (ngx_http_upstream_ssl_name(r, u, c) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->ssl_session_reuse) {[m
[31m-        if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* abbreviated SSL handshake may interact badly with Nagle */[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "SSL handshaking to upstream";[m
[31m-[m
[31m-    rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!c->write->timer_set) {[m
[31m-            ngx_add_timer(c->write, u->conf->connect_timeout);[m
[31m-        }[m
[31m-[m
[31m-        c->ssl->handler = ngx_http_upstream_ssl_handshake;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_ssl_handshake(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_ssl_handshake(ngx_connection_t *c)[m
[31m-{[m
[31m-    long                  rc;[m
[31m-    ngx_http_request_t   *r;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    r = c->data;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        if (u->conf->ssl_verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_ssl_check_host(c, &u->ssl_name) != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream SSL certificate does not match \"%V\"",[m
[31m-                              &u->ssl_name);[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (u->conf->ssl_session_reuse) {[m
[31m-            u->peer.save_session(&u->peer, u->peer.data);[m
[31m-        }[m
[31m-[m
[31m-        c->write->handler = ngx_http_upstream_handler;[m
[31m-        c->read->handler = ngx_http_upstream_handler;[m
[31m-[m
[31m-        c = r->connection;[m
[31m-[m
[31m-        ngx_http_upstream_send_request(r, u, 1);[m
[31m-[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_ssl_name(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_connection_t *c)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t   name;[m
[31m-[m
[31m-    if (u->conf->ssl_name) {[m
[31m-        if (ngx_http_complex_value(r, u->conf->ssl_name, &name) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        name = u->ssl_name;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * ssl name here may contain port, notably if derived from $proxy_host[m
[31m-     * or $http_host; we have to strip it[m
[31m-     */[m
[31m-[m
[31m-    p = name.data;[m
[31m-    last = name.data + name.len;[m
[31m-[m
[31m-    if (*p == '[') {[m
[31m-        p = ngx_strlchr(p, last, ']');[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            p = name.data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlchr(p, last, ':');[m
[31m-[m
[31m-    if (p != NULL) {[m
[31m-        name.len = p - name.data;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->conf->ssl_server_name) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */[m
[31m-[m
[31m-    if (name.len == 0 || *name.data == '[') {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_set_tlsext_host_name() needs a null-terminated string,[m
[31m-     * hence we explicitly null-terminate name here[m
[31m-     */[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, name.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(p, name.data, name.len + 1);[m
[31m-[m
[31m-    name.data = p;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream SSL server name: \"%s\"", name.data);[m
[31m-[m
[31m-    if (SSL_set_tlsext_host_name(c->ssl->connection, name.data) == 0) {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "SSL_set_tlsext_host_name(\"%s\") failed", name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    u->ssl_name = name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    off_t         file_pos;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (u->reinit_request(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->keepalive = 0;[m
[31m-    u->upgrade = 0;[m
[31m-[m
[31m-    ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));[m
[31m-    u->headers_in.content_length_n = -1;[m
[31m-    u->headers_in.last_modified_time = -1;[m
[31m-[m
[31m-    if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the request chain */[m
[31m-[m
[31m-    file_pos = 0;[m
[31m-[m
[31m-    for (cl = u->request_bufs; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->start;[m
[31m-[m
[31m-        /* there is at most one file */[m
[31m-[m
[31m-        if (cl->buf->in_file) {[m
[31m-            cl->buf->file_pos = file_pos;[m
[31m-            file_pos = cl->buf->file_last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* reinit the subrequest's ngx_output_chain() context */[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file[m
[31m-        && r != r->main && u->output.buf)[m
[31m-    {[m
[31m-        u->output.free = ngx_alloc_chain_link(r->pool);[m
[31m-        if (u->output.free == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->output.free->buf = u->output.buf;[m
[31m-        u->output.free->next = NULL;[m
[31m-[m
[31m-        u->output.buf->pos = u->output.buf->start;[m
[31m-        u->output.buf->last = u->output.buf->start;[m
[31m-    }[m
[31m-[m
[31m-    u->output.buf = NULL;[m
[31m-    u->output.in = NULL;[m
[31m-    u->output.busy = NULL;[m
[31m-[m
[31m-    /* reinit u->buffer */[m
[31m-[m
[31m-    u->buffer.pos = u->buffer.start;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-        u->buffer.pos += r->cache->header_start;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream send request");[m
[31m-[m
[31m-    if (u->state->connect_time == (ngx_msec_t) -1) {[m
[31m-        u->state->connect_time = ngx_current_msec - u->state->response_time;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "sending request to upstream";[m
[31m-[m
[31m-    rc = ngx_http_upstream_send_request_body(r, u, do_write);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        if (!c->write->ready) {[m
[31m-            ngx_add_timer(c->write, u->conf->send_timeout);[m
[31m-[m
[31m-        } else if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    u->request_body_sent = 1;[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == NGX_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,[m
[31m-                          ngx_tcp_push_n " failed");[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-    }[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_upstream_dummy_handler;[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(c->read, u->conf->read_timeout);[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        ngx_http_upstream_process_header(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_send_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_uint_t do_write)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t               *out, *cl, *ln;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream send request body");[m
[31m-[m
[31m-    if (!r->request_body_no_buffering) {[m
[31m-[m
[31m-        /* buffered request body */[m
[31m-[m
[31m-        if (!u->request_sent) {[m
[31m-            u->request_sent = 1;[m
[31m-            out = u->request_bufs;[m
[31m-[m
[31m-        } else {[m
[31m-            out = NULL;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_output_chain(&u->output, out);[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent) {[m
[31m-        u->request_sent = 1;[m
[31m-        out = u->request_bufs;[m
[31m-[m
[31m-        if (r->request_body->bufs) {[m
[31m-            for (cl = out; cl->next; cl = out->next) { /* void */ }[m
[31m-            cl->next = r->request_body->bufs;[m
[31m-            r->request_body->bufs = NULL;[m
[31m-        }[m
[31m-[m
[31m-        c = u->peer.connection;[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_upstream_read_request_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        out = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-            rc = ngx_output_chain(&u->output, out);[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            while (out) {[m
[31m-                ln = out;[m
[31m-                out = out->next;[m
[31m-                ngx_free_chain(r->pool, ln);[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_OK && !r->reading_body) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (r->reading_body) {[m
[31m-            /* read client request body */[m
[31m-[m
[31m-            rc = ngx_http_read_unbuffered_request_body(r);[m
[31m-[m
[31m-            if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            out = r->request_body->bufs;[m
[31m-            r->request_body->bufs = NULL;[m
[31m-        }[m
[31m-[m
[31m-        /* stop if there is nothing to send */[m
[31m-[m
[31m-        if (out == NULL) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        do_write = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->reading_body) {[m
[31m-        if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {[m
[31m-            r->read_event_handler =[m
[31m-                                  ngx_http_upstream_rd_check_broken_connection;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_request_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream send request handler");[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (u->ssl && c->ssl == NULL) {[m
[31m-        ngx_http_upstream_ssl_init_connection(r, u, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (u->header_sent) {[m
[31m-        u->write_event_handler = ngx_http_upstream_dummy_handler;[m
[31m-[m
[31m-        (void) ngx_handle_write_event(c->write, 0);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_read_request_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream read request handler");[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_send_request(r, u, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ssize_t            n;[m
[31m-    ngx_int_t          rc;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process header");[m
[31m-[m
[31m-    c->log->action = "reading response header from upstream";[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->buffer.start == NULL) {[m
[31m-        u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size);[m
[31m-        if (u->buffer.start == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->buffer.pos = u->buffer.start;[m
[31m-        u->buffer.last = u->buffer.start;[m
[31m-        u->buffer.end = u->buffer.start + u->conf->buffer_size;[m
[31m-        u->buffer.temporary = 1;[m
[31m-[m
[31m-        u->buffer.tag = u->output.tag;[m
[31m-[m
[31m-        if (ngx_list_init(&u->headers_in.headers, r->pool, 8,[m
[31m-                          sizeof(ngx_table_elt_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (r->cache) {[m
[31m-            u->buffer.pos += r->cache->header_start;[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-#if 0[m
[31m-            ngx_add_timer(rev, u->read_timeout);[m
[31m-#endif[m
[31m-[m
[31m-            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "upstream prematurely closed connection");[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR || n == 0) {[m
[31m-            ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->buffer.last += n;[m
[31m-[m
[31m-#if 0[m
[31m-        u->valid_header_in = 0;[m
[31m-[m
[31m-        u->peer.cached = 0;[m
[31m-#endif[m
[31m-[m
[31m-        rc = u->process_header(r);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-            if (u->buffer.last == u->buffer.end) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                              "upstream sent too big header");[m
[31m-[m
[31m-                ngx_http_upstream_next(r, u,[m
[31m-                                       NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {[m
[31m-        ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    u->state->header_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-    if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-[m
[31m-        if (ngx_http_upstream_test_next(r, u) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_upstream_intercept_errors(r, u) == NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_upstream_process_headers(r, u) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->subrequest_in_memory) {[m
[31m-        ngx_http_upstream_send_response(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* subrequest content in memory */[m
[31m-[m
[31m-    if (u->input_filter == NULL) {[m
[31m-        u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;[m
[31m-        u->input_filter = ngx_http_upstream_non_buffered_filter;[m
[31m-        u->input_filter_ctx = r;[m
[31m-    }[m
[31m-[m
[31m-    if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    n = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-    if (n) {[m
[31m-        u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-        u->state->response_length += n;[m
[31m-[m
[31m-        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_process_body_in_memory;[m
[31m-[m
[31m-    ngx_http_upstream_process_body_in_memory(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_uint_t                 status;[m
[31m-    ngx_http_upstream_next_t  *un;[m
[31m-[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    for (un = ngx_http_upstream_next_errors; un->status; un++) {[m
[31m-[m
[31m-        if (status != un->status) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.tries > 1 && (u->conf->next_upstream & un->mask)) {[m
[31m-            ngx_http_upstream_next(r, u, un->mask);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-            && (u->conf->cache_use_stale & un->mask))[m
[31m-        {[m
[31m-            ngx_int_t  rc;[m
[31m-[m
[31m-            rc = u->reinit_request(r);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                u->cache_status = NGX_HTTP_CACHE_STALE;[m
[31m-                rc = ngx_http_upstream_cache_send(r, u);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (status == NGX_HTTP_NOT_MODIFIED[m
[31m-        && u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-        && u->conf->cache_revalidate)[m
[31m-    {[m
[31m-        time_t     now, valid;[m
[31m-        ngx_int_t  rc;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream not modified");[m
[31m-[m
[31m-        now = ngx_time();[m
[31m-        valid = r->cache->valid_sec;[m
[31m-[m
[31m-        rc = u->reinit_request(r);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        u->cache_status = NGX_HTTP_CACHE_REVALIDATED;[m
[31m-        rc = ngx_http_upstream_cache_send(r, u);[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = r->cache->valid_sec;[m
[31m-        }[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = ngx_http_file_cache_valid(u->conf->cache_valid,[m
[31m-                                              u->headers_in.status_n);[m
[31m-            if (valid) {[m
[31m-                valid = now + valid;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (valid) {[m
[31m-            r->cache->valid_sec = valid;[m
[31m-            r->cache->date = now;[m
[31m-[m
[31m-            ngx_http_file_cache_update_header(r);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_intercept_errors(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                  status;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_table_elt_t           *h;[m
[31m-    ngx_http_err_page_t       *err_page;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    status = u->headers_in.status_n;[m
[31m-[m
[31m-    if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (!u->conf->intercept_errors) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->error_pages == NULL) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    err_page = clcf->error_pages->elts;[m
[31m-    for (i = 0; i < clcf->error_pages->nelts; i++) {[m
[31m-[m
[31m-        if (err_page[i].status == status) {[m
[31m-[m
[31m-            if (status == NGX_HTTP_UNAUTHORIZED[m
[31m-                && u->headers_in.www_authenticate)[m
[31m-            {[m
[31m-                h = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-                if (h == NULL) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-[m
[31m-                *h = *u->headers_in.www_authenticate;[m
[31m-[m
[31m-                r->headers_out.www_authenticate = h;[m
[31m-            }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-            if (r->cache) {[m
[31m-                time_t  valid;[m
[31m-[m
[31m-                valid = ngx_http_file_cache_valid(u->conf->cache_valid, status);[m
[31m-[m
[31m-                if (valid) {[m
[31m-                    r->cache->valid_sec = ngx_time() + valid;[m
[31m-                    r->cache->error = status;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_upstream_finalize_request(r, u, status);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        if (c->write->pending_eof || c->read->pending_eof) {[m
[31m-            if (c->write->pending_eof) {[m
[31m-                err = c->write->kq_errno;[m
[31m-[m
[31m-            } else {[m
[31m-                err = c->read->kq_errno;[m
[31m-            }[m
[31m-[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err,[m
[31m-                                    "kevent() reported that connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_str_t                       uri, args;[m
[31m-    ngx_uint_t                      i, flags;[m
[31m-    ngx_list_part_t                *part;[m
[31m-    ngx_table_elt_t                *h;[m
[31m-    ngx_http_upstream_header_t     *hh;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (u->headers_in.x_accel_redirect[m
[31m-        && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT))[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);[m
[31m-[m
[31m-        part = &u->headers_in.headers.part;[m
[31m-        h = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                h = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,[m
[31m-                               h[i].lowcase_key, h[i].key.len);[m
[31m-[m
[31m-            if (hh && hh->redirect) {[m
[31m-                if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {[m
[31m-                    ngx_http_finalize_request(r,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        uri = u->headers_in.x_accel_redirect->value;[m
[31m-[m
[31m-        if (uri.data[0] == '@') {[m
[31m-            ngx_http_named_location(r, &uri);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_null(&args);[m
[31m-            flags = NGX_HTTP_LOG_UNSAFE;[m
[31m-[m
[31m-            if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags) != NGX_OK) {[m
[31m-                ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            if (r->method != NGX_HTTP_HEAD) {[m
[31m-                r->method = NGX_HTTP_GET;[m
[31m-                r->method_name = ngx_http_core_get_method;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_internal_redirect(r, &uri, &args);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    part = &u->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash,[m
[31m-                          h[i].lowcase_key, h[i].key.len))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,[m
[31m-                           h[i].lowcase_key, h[i].key.len);[m
[31m-[m
[31m-        if (hh) {[m
[31m-            if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) {[m
[31m-            ngx_http_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.server && r->headers_out.server->value.data == NULL) {[m
[31m-        r->headers_out.server->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date && r->headers_out.date->value.data == NULL) {[m
[31m-        r->headers_out.date->hash = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = u->headers_in.status_n;[m
[31m-    r->headers_out.status_line = u->headers_in.status_line;[m
[31m-[m
[31m-    r->headers_out.content_length_n = u->headers_in.content_length_n;[m
[31m-[m
[31m-    r->disable_not_modified = !u->cacheable;[m
[31m-[m
[31m-    if (u->conf->force_ranges) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        r->single_range = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        if (r->cached) {[m
[31m-            r->single_range = 0;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    u->length = -1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_body_in_memory(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    size_t             size;[m
[31m-    ssize_t            n;[m
[31m-    ngx_buf_t         *b;[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process body on memory");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "upstream buffer is too small to read response");[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        n = c->recv(c, b->last, size);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0 || n == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, n);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->state->response_length += n;[m
[31m-[m
[31m-        if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!rev->ready) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->length == 0) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        ngx_add_timer(rev, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_event_pipe_t          *p;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->header_sent = 1;[m
[31m-[m
[31m-    if (u->upgrade) {[m
[31m-        ngx_http_upstream_upgrade(r, u);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-[m
[31m-        if (!u->buffering) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!u->cacheable && !u->store) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->pipe->downstream_error = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body && r->request_body->temp_file) {[m
[31m-        ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd);[m
[31m-        r->request_body->temp_file->file.fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (!u->buffering) {[m
[31m-[m
[31m-        if (u->input_filter == NULL) {[m
[31m-            u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;[m
[31m-            u->input_filter = ngx_http_upstream_non_buffered_filter;[m
[31m-            u->input_filter_ctx = r;[m
[31m-        }[m
[31m-[m
[31m-        u->read_event_handler = ngx_http_upstream_process_non_buffered_upstream;[m
[31m-        r->write_event_handler =[m
[31m-                             ngx_http_upstream_process_non_buffered_downstream;[m
[31m-[m
[31m-        r->limit_rate = 0;[m
[31m-[m
[31m-        if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            tcp_nodelay = 1;[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                               (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        n = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-        if (n) {[m
[31m-            u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-            u->state->response_length += n;[m
[31m-[m
[31m-            if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_process_non_buffered_downstream(r);[m
[31m-[m
[31m-        } else {[m
[31m-            u->buffer.pos = u->buffer.start;[m
[31m-            u->buffer.last = u->buffer.start;[m
[31m-[m
[31m-            if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (u->peer.connection->read->ready || u->length == 0) {[m
[31m-                ngx_http_upstream_process_non_buffered_upstream(r, u);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: preallocate event_pipe bufs, look "Content-Length" */[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache && r->cache->file.fd != NGX_INVALID_FILE) {[m
[31m-        ngx_pool_run_cleanup_file(r->pool, r->cache->file.fd);[m
[31m-        r->cache->file.fd = NGX_INVALID_FILE;[m
[31m-    }[m
[31m-[m
[31m-    switch (ngx_http_test_predicates(r, u->conf->no_cache)) {[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        u->cacheable = 0;[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_OK */[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_BYPASS) {[m
[31m-[m
[31m-            /* create cache if previously bypassed */[m
[31m-[m
[31m-            if (ngx_http_file_cache_create(r) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-        time_t  now, valid;[m
[31m-[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        valid = r->cache->valid_sec;[m
[31m-[m
[31m-        if (valid == 0) {[m
[31m-            valid = ngx_http_file_cache_valid(u->conf->cache_valid,[m
[31m-                                              u->headers_in.status_n);[m
[31m-            if (valid) {[m
[31m-                r->cache->valid_sec = now + valid;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (valid) {[m
[31m-            r->cache->date = now;[m
[31m-            r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start);[m
[31m-[m
[31m-            if (u->headers_in.status_n == NGX_HTTP_OK[m
[31m-                || u->headers_in.status_n == NGX_HTTP_PARTIAL_CONTENT)[m
[31m-            {[m
[31m-                r->cache->last_modified = u->headers_in.last_modified_time;[m
[31m-[m
[31m-                if (u->headers_in.etag) {[m
[31m-                    r->cache->etag = u->headers_in.etag->value;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_str_null(&r->cache->etag);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                r->cache->last_modified = -1;[m
[31m-                ngx_str_null(&r->cache->etag);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_file_cache_set_header(r, u->buffer.start) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            u->cacheable = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http cacheable: %d", u->cacheable);[m
[31m-[m
[31m-    if (u->cacheable == 0 && r->cache) {[m
[31m-        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only && !u->cacheable && !u->store) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    p = u->pipe;[m
[31m-[m
[31m-    p->output_filter = ngx_http_upstream_output_filter;[m
[31m-    p->output_ctx = r;[m
[31m-    p->tag = u->output.tag;[m
[31m-    p->bufs = u->conf->bufs;[m
[31m-    p->busy_size = u->conf->busy_buffers_size;[m
[31m-    p->upstream = u->peer.connection;[m
[31m-    p->downstream = c;[m
[31m-    p->pool = r->pool;[m
[31m-    p->log = c->log;[m
[31m-    p->limit_rate = u->conf->limit_rate;[m
[31m-    p->start_sec = ngx_time();[m
[31m-[m
[31m-    p->cacheable = u->cacheable || u->store;[m
[31m-[m
[31m-    p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-    if (p->temp_file == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p->temp_file->file.fd = NGX_INVALID_FILE;[m
[31m-    p->temp_file->file.log = c->log;[m
[31m-    p->temp_file->path = u->conf->temp_path;[m
[31m-    p->temp_file->pool = r->pool;[m
[31m-[m
[31m-    if (p->cacheable) {[m
[31m-        p->temp_file->persistent = 1;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-        if (r->cache && r->cache->file_cache->temp_path) {[m
[31m-            p->temp_file->path = r->cache->file_cache->temp_path;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        p->temp_file->log_level = NGX_LOG_WARN;[m
[31m-        p->temp_file->warn = "an upstream response is buffered "[m
[31m-                             "to a temporary file";[m
[31m-    }[m
[31m-[m
[31m-    p->max_temp_file_size = u->conf->max_temp_file_size;[m
[31m-    p->temp_file_write_size = u->conf->temp_file_write_size;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (clcf->aio == NGX_HTTP_AIO_THREADS && clcf->aio_write) {[m
[31m-        p->thread_handler = ngx_http_upstream_thread_handler;[m
[31m-        p->thread_ctx = r;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    p->preread_bufs = ngx_alloc_chain_link(r->pool);[m
[31m-    if (p->preread_bufs == NULL) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p->preread_bufs->buf = &u->buffer;[m
[31m-    p->preread_bufs->next = NULL;[m
[31m-    u->buffer.recycled = 1;[m
[31m-[m
[31m-    p->preread_size = u->buffer.last - u->buffer.pos;[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-[m
[31m-        p->buf_to_file = ngx_calloc_buf(r->pool);[m
[31m-        if (p->buf_to_file == NULL) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p->buf_to_file->start = u->buffer.start;[m
[31m-        p->buf_to_file->pos = u->buffer.start;[m
[31m-        p->buf_to_file->last = u->buffer.pos;[m
[31m-        p->buf_to_file->temporary = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-        /* the posted aio operation may corrupt a shadow buffer */[m
[31m-        p->single_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */[m
[31m-    p->free_bufs = 1;[m
[31m-[m
[31m-    /*[m
[31m-     * event_pipe would do u->buffer.last += p->preread_size[m
[31m-     * as though these bytes were read[m
[31m-     */[m
[31m-    u->buffer.last = u->buffer.pos;[m
[31m-[m
[31m-    if (u->conf->cyclic_temp_file) {[m
[31m-[m
[31m-        /*[m
[31m-         * we need to disable the use of sendfile() if we use cyclic temp file[m
[31m-         * because the writing a new data may interfere with sendfile()[m
[31m-         * that uses the same kernel file pages (at least on FreeBSD)[m
[31m-         */[m
[31m-[m
[31m-        p->cyclic_temp_file = 1;[m
[31m-        c->sendfile = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        p->cyclic_temp_file = 0;[m
[31m-    }[m
[31m-[m
[31m-    p->read_timeout = u->conf->read_timeout;[m
[31m-    p->send_timeout = clcf->send_timeout;[m
[31m-    p->send_lowat = clcf->send_lowat;[m
[31m-[m
[31m-    p->length = -1;[m
[31m-[m
[31m-    if (u->input_filter_init[m
[31m-        && u->input_filter_init(p->input_ctx) != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_process_upstream;[m
[31m-    r->write_event_handler = ngx_http_upstream_process_downstream;[m
[31m-[m
[31m-    ngx_http_upstream_process_upstream(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgrade(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    /* TODO: prevent upgrade if not requested or not possible */[m
[31m-[m
[31m-    r->keepalive = 0;[m
[31m-    c->log->action = "proxying upgraded connection";[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_upstream_upgraded_read_upstream;[m
[31m-    u->write_event_handler = ngx_http_upstream_upgraded_write_upstream;[m
[31m-    r->read_event_handler = ngx_http_upstream_upgraded_read_downstream;[m
[31m-    r->write_event_handler = ngx_http_upstream_upgraded_write_downstream;[m
[31m-[m
[31m-    if (clcf->tcp_nodelay) {[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-            if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.connection->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, u->peer.connection->log, 0,[m
[31m-                           "tcp_nodelay");[m
[31m-[m
[31m-            if (setsockopt(u->peer.connection->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                           (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-            {[m
[31m-                ngx_connection_error(u->peer.connection, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) failed");[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            u->peer.connection->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection->read->ready[m
[31m-        || u->buffer.pos != u->buffer.last)[m
[31m-    {[m
[31m-        ngx_post_event(c->read, &ngx_posted_events);[m
[31m-        ngx_http_upstream_process_upgraded(r, 1, 1);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 1, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 1, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_upstream_process_upgraded(r, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_upgraded(ngx_http_request_t *r,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c, *downstream, *upstream, *dst, *src;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process upgraded, fu:%ui", from_upstream);[m
[31m-[m
[31m-    downstream = c;[m
[31m-    upstream = u->peer.connection;[m
[31m-[m
[31m-    if (downstream->write->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->timedout || upstream->write->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (from_upstream) {[m
[31m-        src = upstream;[m
[31m-        dst = downstream;[m
[31m-        b = &u->buffer;[m
[31m-[m
[31m-    } else {[m
[31m-        src = downstream;[m
[31m-        dst = upstream;[m
[31m-        b = &u->from_client;[m
[31m-[m
[31m-        if (r->header_in->last > r->header_in->pos) {[m
[31m-            b = r->header_in;[m
[31m-            b->end = b->last;[m
[31m-            do_write = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (b->start == NULL) {[m
[31m-            b->start = ngx_palloc(r->pool, u->conf->buffer_size);[m
[31m-            if (b->start == NULL) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start;[m
[31m-            b->last = b->start;[m
[31m-            b->end = b->start + u->conf->buffer_size;[m
[31m-            b->temporary = 1;[m
[31m-            b->tag = u->output.tag;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            size = b->last - b->pos;[m
[31m-[m
[31m-            if (size && dst->write->ready) {[m
[31m-[m
[31m-                n = dst->send(dst, b->pos, size);[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (n > 0) {[m
[31m-                    b->pos += n;[m
[31m-[m
[31m-                    if (b->pos == b->last) {[m
[31m-                        b->pos = b->start;[m
[31m-                        b->last = b->start;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && src->read->ready) {[m
[31m-[m
[31m-            n = src->recv(src, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                do_write = 1;[m
[31m-                b->last += n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                src->read->eof = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if ((upstream->read->eof && u->buffer.pos == u->buffer.last)[m
[31m-        || (downstream->read->eof && u->from_client.pos == u->from_client.last)[m
[31m-        || (downstream->read->eof && upstream->read->eof))[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http upstream upgraded done");[m
[31m-        ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (ngx_handle_write_event(upstream->write, u->conf->send_lowat)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->write->active && !upstream->write->ready) {[m
[31m-        ngx_add_timer(upstream->write, u->conf->send_timeout);[m
[31m-[m
[31m-    } else if (upstream->write->timer_set) {[m
[31m-        ngx_del_timer(upstream->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->active && !upstream->read->ready) {[m
[31m-        ngx_add_timer(upstream->read, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (upstream->read->timer_set) {[m
[31m-        ngx_del_timer(upstream->read);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(downstream->write, clcf->send_lowat)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(downstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (downstream->write->active && !downstream->write->ready) {[m
[31m-        ngx_add_timer(downstream->write, clcf->send_timeout);[m
[31m-[m
[31m-    } else if (downstream->write->timer_set) {[m
[31m-        ngx_del_timer(downstream->write);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t          *wev;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process non buffered downstream");[m
[31m-[m
[31m-    c->log->action = "sending to client";[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        c->timedout = 1;[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_non_buffered_request(r, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process non buffered upstream");[m
[31m-[m
[31m-    c->log->action = "reading upstream";[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_non_buffered_request(r, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    size_t                     size;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_connection_t          *downstream, *upstream;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    downstream = r->connection;[m
[31m-    upstream = u->peer.connection;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    do_write = do_write || u->length == 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            if (u->out_bufs || u->busy_bufs) {[m
[31m-                rc = ngx_http_output_filter(r, u->out_bufs);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs,[m
[31m-                                        &u->out_bufs, u->output.tag);[m
[31m-            }[m
[31m-[m
[31m-            if (u->busy_bufs == NULL) {[m
[31m-[m
[31m-                if (u->length == 0[m
[31m-                    || (upstream->read->eof && u->length == -1))[m
[31m-                {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (upstream->read->eof) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, upstream->log, 0,[m
[31m-                                  "upstream prematurely closed connection");[m
[31m-[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                                       NGX_HTTP_BAD_GATEWAY);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (upstream->read->error) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u,[m
[31m-                                                       NGX_HTTP_BAD_GATEWAY);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                b->pos = b->start;[m
[31m-                b->last = b->start;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && upstream->read->ready) {[m
[31m-[m
[31m-            n = upstream->recv(upstream, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                u->state->response_length += n;[m
[31m-[m
[31m-                if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            do_write = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (downstream->data == r) {[m
[31m-        if (ngx_handle_write_event(downstream->write, clcf->send_lowat)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (downstream->write->active && !downstream->write->ready) {[m
[31m-        ngx_add_timer(downstream->write, clcf->send_timeout);[m
[31m-[m
[31m-    } else if (downstream->write->timer_set) {[m
[31m-        ngx_del_timer(downstream->write);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(upstream->read, 0) != NGX_OK) {[m
[31m-        ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (upstream->read->active && !upstream->read->ready) {[m
[31m-        ngx_add_timer(upstream->read, u->conf->read_timeout);[m
[31m-[m
[31m-    } else if (upstream->read->timer_set) {[m
[31m-        ngx_del_timer(upstream->read);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_non_buffered_filter_init(void *data)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    ngx_buf_t            *b;[m
[31m-    ngx_chain_t          *cl, **ll;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ll = cl;[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-    cl->buf->memory = 1;[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    cl->buf->pos = b->last;[m
[31m-    b->last += bytes;[m
[31m-    cl->buf->last = b->last;[m
[31m-    cl->buf->tag = u->output.tag;[m
[31m-[m
[31m-    if (u->length == -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    u->length -= bytes;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)[m
[31m-{[m
[31m-    ngx_str_t                  name;[m
[31m-    ngx_event_pipe_t          *p;[m
[31m-    ngx_thread_pool_t         *tp;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    r = file->thread_ctx;[m
[31m-    p = r->upstream->pipe;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    tp = clcf->thread_pool;[m
[31m-[m
[31m-    if (tp == NULL) {[m
[31m-        if (ngx_http_complex_value(r, clcf->thread_pool_value, &name)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name);[m
[31m-[m
[31m-        if (tp == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "thread pool \"%V\" not found", &name);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    task->event.data = r;[m
[31m-    task->event.handler = ngx_http_upstream_thread_event_handler;[m
[31m-[m
[31m-    if (ngx_thread_task_post(tp, task) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->main->blocked++;[m
[31m-    r->aio = 1;[m
[31m-    p->aio = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_thread_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ev->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_http_set_log_request(c->log, r);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream thread: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    r->main->blocked--;[m
[31m-    r->aio = 0;[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_output_filter(void *data, ngx_chain_t *chain)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_event_pipe_t    *p;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = data;[m
[31m-    p = r->upstream->pipe;[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, chain);[m
[31m-[m
[31m-    p->aio = r->aio;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_downstream(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_event_t          *wev;[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_event_pipe_t     *p;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    u = r->upstream;[m
[31m-    p = u->pipe;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process downstream");[m
[31m-[m
[31m-    c->log->action = "sending to client";[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    p->aio = r->aio;[m
[31m-#endif[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-[m
[31m-        if (wev->delayed) {[m
[31m-[m
[31m-            wev->timedout = 0;[m
[31m-            wev->delayed = 0;[m
[31m-[m
[31m-            if (!wev->ready) {[m
[31m-                ngx_add_timer(wev, p->send_timeout);[m
[31m-[m
[31m-                if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_event_pipe(p, wev->write) == NGX_ABORT) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p->downstream_error = 1;[m
[31m-            c->timedout = 1;[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (wev->delayed) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http downstream delayed");[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_pipe(p, 1) == NGX_ABORT) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_request(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_upstream(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_event_pipe_t  *p;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    p = u->pipe;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http upstream process upstream");[m
[31m-[m
[31m-    c->log->action = "reading upstream";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-[m
[31m-        if (rev->delayed) {[m
[31m-[m
[31m-            rev->timedout = 0;[m
[31m-            rev->delayed = 0;[m
[31m-[m
[31m-            if (!rev->ready) {[m
[31m-                ngx_add_timer(rev, p->read_timeout);[m
[31m-[m
[31m-                if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                    ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_event_pipe(p, 0) == NGX_ABORT) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p->upstream_error = 1;[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (rev->delayed) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "http upstream delayed");[m
[31m-[m
[31m-            if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_pipe(p, 0) == NGX_ABORT) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_process_request(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_process_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_temp_file_t   *tf;[m
[31m-    ngx_event_pipe_t  *p;[m
[31m-[m
[31m-    p = u->pipe;[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-    if (p->writing) {[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-        if (u->store) {[m
[31m-[m
[31m-            if (p->upstream_eof || p->upstream_done) {[m
[31m-[m
[31m-                tf = p->temp_file;[m
[31m-[m
[31m-                if (u->headers_in.status_n == NGX_HTTP_OK[m
[31m-                    && (p->upstream_done || p->length == -1)[m
[31m-                    && (u->headers_in.content_length_n == -1[m
[31m-                        || u->headers_in.content_length_n == tf->offset))[m
[31m-                {[m
[31m-                    ngx_http_upstream_store(r, u);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cacheable) {[m
[31m-[m
[31m-            if (p->upstream_done) {[m
[31m-                ngx_http_file_cache_update(r, p->temp_file);[m
[31m-[m
[31m-            } else if (p->upstream_eof) {[m
[31m-[m
[31m-                tf = p->temp_file;[m
[31m-[m
[31m-                if (p->length == -1[m
[31m-                    && (u->headers_in.content_length_n == -1[m
[31m-                        || u->headers_in.content_length_n[m
[31m-                           == tf->offset - (off_t) r->cache->body_start))[m
[31m-                {[m
[31m-                    ngx_http_file_cache_update(r, tf);[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_http_file_cache_free(r->cache, tf);[m
[31m-                }[m
[31m-[m
[31m-            } else if (p->upstream_error) {[m
[31m-                ngx_http_file_cache_free(r->cache, p->temp_file);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (p->upstream_done || p->upstream_eof || p->upstream_error) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "http upstream exit: %p", p->out);[m
[31m-[m
[31m-            if (p->upstream_done[m
[31m-                || (p->upstream_eof && p->length == -1))[m
[31m-            {[m
[31m-                ngx_http_upstream_finalize_request(r, u, 0);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (p->upstream_eof) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "upstream prematurely closed connection");[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p->downstream_error) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream downstream error");[m
[31m-[m
[31m-        if (!u->cacheable && !u->store && u->peer.connection) {[m
[31m-            ngx_http_upstream_finalize_request(r, u, NGX_ERROR);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    size_t                  root;[m
[31m-    time_t                  lm;[m
[31m-    ngx_str_t               path;[m
[31m-    ngx_temp_file_t        *tf;[m
[31m-    ngx_ext_rename_file_t   ext;[m
[31m-[m
[31m-    tf = u->pipe->temp_file;[m
[31m-[m
[31m-    if (tf->file.fd == NGX_INVALID_FILE) {[m
[31m-[m
[31m-        /* create file for empty 200 response */[m
[31m-[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = u->conf->temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->persistent = 1;[m
[31m-[m
[31m-        if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                 tf->persistent, tf->clean, tf->access)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->pipe->temp_file = tf;[m
[31m-    }[m
[31m-[m
[31m-    ext.access = u->conf->store_access;[m
[31m-    ext.path_access = u->conf->store_access;[m
[31m-    ext.time = -1;[m
[31m-    ext.create_path = 1;[m
[31m-    ext.delete_file = 1;[m
[31m-    ext.log = r->connection->log;[m
[31m-[m
[31m-    if (u->headers_in.last_modified) {[m
[31m-[m
[31m-        lm = ngx_parse_http_time(u->headers_in.last_modified->value.data,[m
[31m-                                 u->headers_in.last_modified->value.len);[m
[31m-[m
[31m-        if (lm != NGX_ERROR) {[m
[31m-            ext.time = lm;[m
[31m-            ext.fd = tf->file.fd;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->store_lengths == NULL) {[m
[31m-[m
[31m-        if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_script_run(r, &path, u->conf->store_lengths->elts, 0,[m
[31m-                                u->conf->store_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    path.len--;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "upstream stores \"%s\" to \"%s\"",[m
[31m-                   tf->file.name.data, path.data);[m
[31m-[m
[31m-    (void) ngx_ext_rename_file(&tf->file.name, &path, &ext);[m
[31m-[m
[31m-    u->store = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_dummy_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http upstream dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_msec_t  timeout;[m
[31m-    ngx_uint_t  status, state;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http next upstream, %xi", ft_type);[m
[31m-[m
[31m-    if (u->peer.sockaddr) {[m
[31m-[m
[31m-        if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_403[m
[31m-            || ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404)[m
[31m-        {[m
[31m-            state = NGX_PEER_NEXT;[m
[31m-[m
[31m-        } else {[m
[31m-            state = NGX_PEER_FAILED;[m
[31m-        }[m
[31m-[m
[31m-        u->peer.free(&u->peer, u->peer.data, state);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        /* TODO: inform balancer instead */[m
[31m-        u->peer.tries++;[m
[31m-    }[m
[31m-[m
[31m-    switch (ft_type) {[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_TIMEOUT:[m
[31m-        status = NGX_HTTP_GATEWAY_TIME_OUT;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_500:[m
[31m-        status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_403:[m
[31m-        status = NGX_HTTP_FORBIDDEN;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_UPSTREAM_FT_HTTP_404:[m
[31m-        status = NGX_HTTP_NOT_FOUND;[m
[31m-        break;[m
[31m-[m
[31m-    /*[m
[31m-     * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING[m
[31m-     * never reach here[m
[31m-     */[m
[31m-[m
[31m-    default:[m
[31m-        status = NGX_HTTP_BAD_GATEWAY;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->error) {[m
[31m-        ngx_http_upstream_finalize_request(r, u,[m
[31m-                                           NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->state->status = status;[m
[31m-[m
[31m-    timeout = u->conf->next_upstream_timeout;[m
[31m-[m
[31m-    if (u->request_sent[m
[31m-        && (r->method & (NGX_HTTP_POST|NGX_HTTP_LOCK|NGX_HTTP_PATCH)))[m
[31m-    {[m
[31m-        ft_type |= NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.tries == 0[m
[31m-        || ((u->conf->next_upstream & ft_type) != ft_type)[m
[31m-        || (u->request_sent && r->request_body_no_buffering)[m
[31m-        || (timeout && ngx_current_msec - u->peer.start_time >= timeout))[m
[31m-    {[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-        if (u->cache_status == NGX_HTTP_CACHE_EXPIRED[m
[31m-            && (u->conf->cache_use_stale & ft_type))[m
[31m-        {[m
[31m-            ngx_int_t  rc;[m
[31m-[m
[31m-            rc = u->reinit_request(r);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-                u->cache_status = NGX_HTTP_CACHE_STALE;[m
[31m-                rc = ngx_http_upstream_cache_send(r, u);[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_upstream_finalize_request(r, u, rc);[m
[31m-            return;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_http_upstream_finalize_request(r, u, status);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-            u->peer.connection->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-        u->peer.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_connect(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t *r = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup http upstream request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_http_upstream_finalize_request(r, r->upstream, NGX_DONE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_uint_t  flush;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http upstream request: %i", rc);[m
[31m-[m
[31m-    if (u->cleanup == NULL) {[m
[31m-        /* the request was already finalized */[m
[31m-        ngx_http_finalize_request(r, NGX_DONE);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *u->cleanup = NULL;[m
[31m-    u->cleanup = NULL;[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-[m
[31m-        if (u->pipe && u->pipe->read_length) {[m
[31m-            u->state->response_length = u->pipe->read_length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->finalize_request(r, rc);[m
[31m-[m
[31m-    if (u->peer.free && u->peer.sockaddr) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        /* TODO: do not shutdown persistent connection */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-[m
[31m-            /*[m
[31m-             * We send the "close notify" shutdown alert to the upstream only[m
[31m-             * and do not wait its "close notify" shutdown alert.[m
[31m-             * It is acceptable according to the TLS standard.[m
[31m-             */[m
[31m-[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    u->peer.connection = NULL;[m
[31m-[m
[31m-    if (u->pipe && u->pipe->temp_file) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream temp fd: %d",[m
[31m-                       u->pipe->temp_file->file.fd);[m
[31m-    }[m
[31m-[m
[31m-    if (u->store && u->pipe && u->pipe->temp_file[m
[31m-        && u->pipe->temp_file->file.fd != NGX_INVALID_FILE)[m
[31m-    {[m
[31m-        if (ngx_delete_file(u->pipe->temp_file->file.name.data)[m
[31m-            == NGX_FILE_ERROR)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                          ngx_delete_file_n " \"%s\" failed",[m
[31m-                          u->pipe->temp_file->file.name.data);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cache) {[m
[31m-[m
[31m-        if (u->cacheable) {[m
[31m-[m
[31m-            if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT) {[m
[31m-                time_t  valid;[m
[31m-[m
[31m-                valid = ngx_http_file_cache_valid(u->conf->cache_valid, rc);[m
[31m-[m
[31m-                if (valid) {[m
[31m-                    r->cache->valid_sec = ngx_time() + valid;[m
[31m-                    r->cache->error = rc;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_file_cache_free(r->cache, u->pipe->temp_file);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (r->subrequest_in_memory[m
[31m-        && u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-    {[m
[31m-        u->buffer.last = u->buffer.pos;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "sending to client";[m
[31m-[m
[31m-    if (!u->header_sent[m
[31m-        || rc == NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        || (u->pipe && u->pipe->downstream_error))[m
[31m-    {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    flush = 0;[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        rc = NGX_ERROR;[m
[31m-        flush = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-    } else if (flush) {[m
[31m-        r->keepalive = 0;[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_FLUSH);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  **ph;[m
[31m-[m
[31m-    ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset);[m
[31m-[m
[31m-    if (*ph == NULL) {[m
[31m-        *ph = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_content_length(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->headers_in.content_length = h;[m
[31m-    u->headers_in.content_length_n = ngx_atoof(h->value.data, h->value.len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    u->headers_in.last_modified = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->cacheable) {[m
[31m-        u->headers_in.last_modified_time = ngx_parse_http_time(h->value.data,[m
[31m-                                                               h->value.len);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t           *pa;[m
[31m-    ngx_table_elt_t      **ph;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pa = &u->headers_in.cookies;[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 1, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    if (!(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE)) {[m
[31m-        u->cacheable = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_cache_control(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t          *pa;[m
[31m-    ngx_table_elt_t     **ph;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pa = &u->headers_in.cache_control;[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ph = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    u_char     *p, *start, *last;[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache->valid_sec != 0 && u->headers_in.x_accel_expires != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    start = h->value.data;[m
[31m-    last = start + h->value.len;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(start, last, (u_char *) "no-cache", 8 - 1) != NULL[m
[31m-        || ngx_strlcasestrn(start, last, (u_char *) "no-store", 8 - 1) != NULL[m
[31m-        || ngx_strlcasestrn(start, last, (u_char *) "private", 7 - 1) != NULL)[m
[31m-    {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlcasestrn(start, last, (u_char *) "s-maxage=", 9 - 1);[m
[31m-    offset = 9;[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        p = ngx_strlcasestrn(start, last, (u_char *) "max-age=", 8 - 1);[m
[31m-        offset = 8;[m
[31m-    }[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (p += offset; p < last; p++) {[m
[31m-        if (*p == ',' || *p == ';' || *p == ' ') {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (*p >= '0' && *p <= '9') {[m
[31m-            n = n * 10 + *p - '0';[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->valid_sec = ngx_time() + n;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_expires(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.expires = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    time_t  expires;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_EXPIRES) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache->valid_sec != 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    expires = ngx_parse_http_time(h->value.data, h->value.len);[m
[31m-[m
[31m-    if (expires == NGX_ERROR || expires < ngx_time()) {[m
[31m-        u->cacheable = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->valid_sec = expires;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.x_accel_expires = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    {[m
[31m-    u_char     *p;[m
[31m-    size_t      len;[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = h->value.len;[m
[31m-    p = h->value.data;[m
[31m-[m
[31m-    if (p[0] != '@') {[m
[31m-        n = ngx_atoi(p, len);[m
[31m-[m
[31m-        switch (n) {[m
[31m-        case 0:[m
[31m-            u->cacheable = 0;[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        default:[m
[31m-            r->cache->valid_sec = ngx_time() + n;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p++;[m
[31m-    len--;[m
[31m-[m
[31m-    n = ngx_atoi(p, len);[m
[31m-[m
[31m-    if (n != NGX_ERROR) {[m
[31m-        r->cache->valid_sec = n;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t             n;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.x_accel_limit_rate = h;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(h->value.data, h->value.len);[m
[31m-[m
[31m-    if (n != NGX_ERROR) {[m
[31m-        r->limit_rate = (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_buffering(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char                c0, c1, c2;[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (u->conf->change_buffering) {[m
[31m-[m
[31m-        if (h->value.len == 2) {[m
[31m-            c0 = ngx_tolower(h->value.data[0]);[m
[31m-            c1 = ngx_tolower(h->value.data[1]);[m
[31m-[m
[31m-            if (c0 == 'n' && c1 == 'o') {[m
[31m-                u->buffering = 0;[m
[31m-            }[m
[31m-[m
[31m-        } else if (h->value.len == 3) {[m
[31m-            c0 = ngx_tolower(h->value.data[0]);[m
[31m-            c1 = ngx_tolower(h->value.data[1]);[m
[31m-            c2 = ngx_tolower(h->value.data[2]);[m
[31m-[m
[31m-            if (c0 == 'y' && c1 == 'e' && c2 == 's') {[m
[31m-                u->buffering = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_charset(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    if (r->upstream->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_CHARSET) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.override_charset = &h->value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    r->upstream->headers_in.connection = h;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,[m
[31m-                         (u_char *) "close", 5 - 1)[m
[31m-        != NULL)[m
[31m-    {[m
[31m-        r->upstream->headers_in.connection_close = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    r->upstream->headers_in.transfer_encoding = h;[m
[31m-[m
[31m-    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,[m
[31m-                         (u_char *) "chunked", 7 - 1)[m
[31m-        != NULL)[m
[31m-    {[m
[31m-        r->upstream->headers_in.chunked = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_process_vary(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    u->headers_in.vary = h;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_VARY) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->cache == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (h->value.len > NGX_HTTP_CACHE_VARY_LEN[m
[31m-        || (h->value.len == 1 && h->value.data[0] == '*'))[m
[31m-    {[m
[31m-        u->cacheable = 0;[m
[31m-    }[m
[31m-[m
[31m-    r->cache->vary = h->value;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (offset) {[m
[31m-        ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);[m
[31m-        *ph = ho;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char  *p, *last;[m
[31m-[m
[31m-    r->headers_out.content_type_len = h->value.len;[m
[31m-    r->headers_out.content_type = h->value;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    for (p = h->value.data; *p; p++) {[m
[31m-[m
[31m-        if (*p != ';') {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        last = p;[m
[31m-[m
[31m-        while (*++p == ' ') { /* void */ }[m
[31m-[m
[31m-        if (*p == '\0') {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p += 8;[m
[31m-[m
[31m-        r->headers_out.content_type_len = last - h->value.data;[m
[31m-[m
[31m-        if (*p == '"') {[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        last = h->value.data + h->value.len;[m
[31m-[m
[31m-        if (*(last - 1) == '"') {[m
[31m-            last--;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.charset.len = last - p;[m
[31m-        r->headers_out.charset.data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.last_modified = ho;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->upstream->cacheable) {[m
[31m-        r->headers_out.last_modified_time =[m
[31m-                                    r->upstream->headers_in.last_modified_time;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_redirect) {[m
[31m-        rc = r->upstream->rewrite_redirect(r, ho, 0);[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->headers_out.location = ho;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten location: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ho->value.data[0] != '/') {[m
[31m-        r->headers_out.location = ho;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    u_char           *p;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_redirect) {[m
[31m-[m
[31m-        p = ngx_strcasestrn(ho->value.data, "url=", 4 - 1);[m
[31m-[m
[31m-        if (p) {[m
[31m-            rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data);[m
[31m-[m
[31m-        } else {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            r->headers_out.refresh = ho;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten refresh: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.refresh = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,[m
[31m-    ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    if (r->upstream->rewrite_cookie) {[m
[31m-        rc = r->upstream->rewrite_cookie(r, ho);[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        if (rc == NGX_OK) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "rewritten cookie: \"%V\"", &ho->value);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    if (r->upstream->conf->force_ranges) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-    if (r->cached) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->upstream->cacheable) {[m
[31m-        r->allow_ranges = 1;[m
[31m-        r->single_range = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.accept_ranges = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,[m
[31m-    ngx_table_elt_t *h, ngx_uint_t offset)[m
[31m-{[m
[31m-    ngx_table_elt_t  *ho;[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *ho = *h;[m
[31m-[m
[31m-    r->headers_out.content_encoding = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_upstream_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_addr_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for (i = 0; i < r->upstream_states->nelts; i++) {[m
[31m-        if (state[i].peer) {[m
[31m-            len += state[i].peer->len + 2;[m
[31m-[m
[31m-        } else {[m
[31m-            len += 3;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].peer) {[m
[31m-            p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len);[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_status_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (3 + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].status) {[m
[31m-            p = ngx_sprintf(p, "%ui", state[i].status);[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = '-';[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_response_time_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_msec_int_t              ms;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (state[i].status) {[m
[31m-[m
[31m-            if (data == 1 && state[i].header_time != (ngx_msec_t) -1) {[m
[31m-                ms = state[i].header_time;[m
[31m-[m
[31m-            } else if (data == 2 && state[i].connect_time != (ngx_msec_t) -1) {[m
[31m-                ms = state[i].connect_time;[m
[31m-[m
[31m-            } else {[m
[31m-                ms = state[i].response_time;[m
[31m-            }[m
[31m-[m
[31m-            ms = ngx_max(ms, 0);[m
[31m-            p = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000);[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = '-';[m
[31m-        }[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_response_length_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      len;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = r->upstream_states->nelts * (NGX_OFF_T_LEN + 2);[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-[m
[31m-    i = 0;[m
[31m-    state = r->upstream_states->elts;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        p = ngx_sprintf(p, "%O", state[i].response_length);[m
[31m-[m
[31m-        if (++i == r->upstream_states->nelts) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (state[i].peer) {[m
[31m-            *p++ = ',';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-        } else {[m
[31m-            *p++ = ' ';[m
[31m-            *p++ = ':';[m
[31m-            *p++ = ' ';[m
[31m-[m
[31m-            if (++i == r->upstream_states->nelts) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->len = p - v->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_header_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->upstream == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,[m
[31m-                                         &r->upstream->headers_in.headers.part,[m
[31m-                                         sizeof("upstream_http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_cookie_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  *name = (ngx_str_t *) data;[m
[31m-[m
[31m-    ngx_str_t   cookie, s;[m
[31m-[m
[31m-    if (r->upstream == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    s.len = name->len - (sizeof("upstream_cookie_") - 1);[m
[31m-    s.data = name->data + sizeof("upstream_cookie_") - 1;[m
[31m-[m
[31m-    if (ngx_http_parse_set_cookie_lines(&r->upstream->headers_in.cookies,[m
[31m-                                        &s, &cookie)[m
[31m-        == NGX_DECLINED)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = cookie.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = cookie.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_cache_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t  n;[m
[31m-[m
[31m-    if (r->upstream == NULL || r->upstream->cache_status == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = r->upstream->cache_status - 1;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = ngx_http_cache_status[n].len;[m
[31m-    v->data = ngx_http_cache_status[n].data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->upstream == NULL[m
[31m-        || !r->upstream->conf->cache_revalidate[m
[31m-        || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED[m
[31m-        || r->cache->last_modified == -1)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_http_time(p, r->cache->last_modified) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_cache_etag(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->upstream == NULL[m
[31m-        || !r->upstream->conf->cache_revalidate[m
[31m-        || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED[m
[31m-        || r->cache->etag.len == 0)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = r->cache->etag.len;[m
[31m-    v->data = r->cache->etag.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                          *rv;[m
[31m-    void                          *mconf;[m
[31m-    ngx_str_t                     *value;[m
[31m-    ngx_url_t                      u;[m
[31m-    ngx_uint_t                     m;[m
[31m-    ngx_conf_t                     pcf;[m
[31m-    ngx_http_module_t             *module;[m
[31m-    ngx_http_conf_ctx_t           *ctx, *http_ctx;[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    u.host = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-    u.no_port = 1;[m
[31m-[m
[31m-    uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE[m
[31m-                                         |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                                         |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                                         |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                                         |NGX_HTTP_UPSTREAM_DOWN[m
[31m-                                         |NGX_HTTP_UPSTREAM_BACKUP);[m
[31m-    if (uscf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx = cf->ctx;[m
[31m-    ctx->main_conf = http_ctx->main_conf;[m
[31m-[m
[31m-    /* the upstream{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->srv_conf[ngx_http_upstream_module.ctx_index] = uscf;[m
[31m-[m
[31m-    uscf->srv_conf = ctx->srv_conf;[m
[31m-[m
[31m-[m
[31m-    /* the upstream{}'s loc_conf */[m
[31m-[m
[31m-    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (ctx->loc_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    uscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                                     sizeof(ngx_http_upstream_server_t));[m
[31m-    if (uscf->servers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside upstream{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_HTTP_UPS_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (uscf->servers->nelts == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no servers are inside upstream");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_srv_conf_t  *uscf = conf;[m
[31m-[m
[31m-    time_t                       fail_timeout;[m
[31m-    ngx_str_t                   *value, s;[m
[31m-    ngx_url_t                    u;[m
[31m-    ngx_int_t                    weight, max_fails;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_http_upstream_server_t  *us;[m
[31m-[m
[31m-    us = ngx_array_push(uscf->servers);[m
[31m-    if (us == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(us, sizeof(ngx_http_upstream_server_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    weight = 1;[m
[31m-    max_fails = 1;[m
[31m-    fail_timeout = 10;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            weight = ngx_atoi(&value[i].data[7], value[i].len - 7);[m
[31m-[m
[31m-            if (weight == NGX_ERROR || weight == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);[m
[31m-[m
[31m-            if (max_fails == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 13;[m
[31m-            s.data = &value[i].data[13];[m
[31m-[m
[31m-            fail_timeout = ngx_parse_time(&s, 1);[m
[31m-[m
[31m-            if (fail_timeout == (time_t) NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "backup") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->backup = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "down") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->down = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = 80;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in upstream \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->name = u.url;[m
[31m-    us->addrs = u.addrs;[m
[31m-    us->naddrs = u.naddrs;[m
[31m-    us->weight = weight;[m
[31m-    us->max_fails = max_fails;[m
[31m-    us->fail_timeout = fail_timeout;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid parameter \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-not_supported:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "balancing method does not support parameter \"%V\"",[m
[31m-                       &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_http_upstream_server_t     *us;[m
[31m-    ngx_http_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) {[m
[31m-[m
[31m-        if (ngx_parse_url(cf->pool, u) != NGX_OK) {[m
[31m-            if (u->err) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "%s in upstream \"%V\"", u->err, &u->url);[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != u->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_UPSTREAM_CREATE)[m
[31m-             && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate upstream \"%V\"", &u->host);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && !u->no_port) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "upstream \"%V\" may not have port %d",[m
[31m-                               &u->host, u->port);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_HTTP_UPSTREAM_CREATE) && !uscfp[i]->no_port) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                          "upstream \"%V\" may not have port %d in %s:%ui",[m
[31m-                          &u->host, uscfp[i]->port,[m
[31m-                          uscfp[i]->file_name, uscfp[i]->line);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port && u->port[m
[31m-            && uscfp[i]->port != u->port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && u->default_port[m
[31m-            && uscfp[i]->default_port != u->default_port)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_HTTP_UPSTREAM_CREATE) {[m
[31m-            uscfp[i]->flags = flags;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_srv_conf_t));[m
[31m-    if (uscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = flags;[m
[31m-    uscf->host = u->host;[m
[31m-    uscf->file_name = cf->conf_file->file.name.data;[m
[31m-    uscf->line = cf->conf_file->line;[m
[31m-    uscf->port = u->port;[m
[31m-    uscf->default_port = u->default_port;[m
[31m-    uscf->no_port = u->no_port;[m
[31m-[m
[31m-    if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) {[m
[31m-        uscf->servers = ngx_array_create(cf->pool, 1,[m
[31m-                                         sizeof(ngx_http_upstream_server_t));[m
[31m-        if (uscf->servers == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        us = ngx_array_push(uscf->servers);[m
[31m-        if (us == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(us, sizeof(ngx_http_upstream_server_t));[m
[31m-[m
[31m-        us->addrs = u->addrs;[m
[31m-        us->naddrs = 1;[m
[31m-    }[m
[31m-[m
[31m-    uscfp = ngx_array_push(&umcf->upstreams);[m
[31m-    if (uscfp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *uscfp = uscf;[m
[31m-[m
[31m-    return uscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t                           rc;[m
[31m-    ngx_str_t                          *value;[m
[31m-    ngx_http_complex_value_t            cv;[m
[31m-    ngx_http_upstream_local_t         **plocal, *local;[m
[31m-    ngx_http_compile_complex_value_t    ccv;[m
[31m-[m
[31m-    plocal = (ngx_http_upstream_local_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*plocal != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        *plocal = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &value[1];[m
[31m-    ccv.complex_value = &cv;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    local = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_local_t));[m
[31m-    if (local == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *plocal = local;[m
[31m-[m
[31m-    if (cv.lengths) {[m
[31m-        local->value = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (local->value == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *local->value = cv;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));[m
[31m-    if (local->addr == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(cf->pool, local->addr, value[1].data, value[1].len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        local->addr->name = value[1];[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid address \"%V\"", &value[1]);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_addr_t *[m
[31m-ngx_http_upstream_get_local(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_local_t *local)[m
[31m-{[m
[31m-    ngx_int_t    rc;[m
[31m-    ngx_str_t    val;[m
[31m-    ngx_addr_t  *addr;[m
[31m-[m
[31m-    if (local == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (local->value == NULL) {[m
[31m-        return local->addr;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, local->value, &val) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (val.len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    addr = ngx_palloc(r->pool, sizeof(ngx_addr_t));[m
[31m-    if (addr == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(r->pool, addr, val.data, val.len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        addr->name = val;[m
[31m-        return addr;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid local address \"%V\"", &val);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_array_t                **a;[m
[31m-    ngx_http_upstream_param_t   *param;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_http_upstream_param_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    param = ngx_array_push(*a);[m
[31m-    if (param == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    param->key = value[1];[m
[31m-    param->value = value[2];[m
[31m-    param->skip_empty = 0;[m
[31m-[m
[31m-    if (cf->args->nelts == 4) {[m
[31m-        if (ngx_strcmp(value[3].data, "if_not_empty") != 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid parameter \"%V\"", &value[3]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        param->skip_empty = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,[m
[31m-    ngx_str_t *default_hide_headers, ngx_hash_init_t *hash)[m
[31m-{[m
[31m-    ngx_str_t       *h;[m
[31m-    ngx_uint_t       i, j;[m
[31m-    ngx_array_t      hide_headers;[m
[31m-    ngx_hash_key_t  *hk;[m
[31m-[m
[31m-    if (conf->hide_headers == NGX_CONF_UNSET_PTR[m
[31m-        && conf->pass_headers == NGX_CONF_UNSET_PTR)[m
[31m-    {[m
[31m-        conf->hide_headers = prev->hide_headers;[m
[31m-        conf->pass_headers = prev->pass_headers;[m
[31m-[m
[31m-        conf->hide_headers_hash = prev->hide_headers_hash;[m
[31m-[m
[31m-        if (conf->hide_headers_hash.buckets[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-            && ((conf->cache == 0) == (prev->cache == 0))[m
[31m-#endif[m
[31m-           )[m
[31m-        {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (conf->hide_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->hide_headers = prev->hide_headers;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->pass_headers == NGX_CONF_UNSET_PTR) {[m
[31m-            conf->pass_headers = prev->pass_headers;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (h = default_hide_headers; h->len; h++) {[m
[31m-        hk = ngx_array_push(&hide_headers);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = *h;[m
[31m-        hk->key_hash = ngx_hash_key_lc(h->data, h->len);[m
[31m-        hk->value = (void *) 1;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->hide_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->hide_headers->elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->hide_headers->nelts; i++) {[m
[31m-[m
[31m-            hk = hide_headers.elts;[m
[31m-[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    goto exist;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            hk = ngx_array_push(&hide_headers);[m
[31m-            if (hk == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            hk->key = h[i];[m
[31m-            hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len);[m
[31m-            hk->value = (void *) 1;[m
[31m-[m
[31m-        exist:[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (conf->pass_headers != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        h = conf->pass_headers->elts;[m
[31m-        hk = hide_headers.elts;[m
[31m-[m
[31m-        for (i = 0; i < conf->pass_headers->nelts; i++) {[m
[31m-            for (j = 0; j < hide_headers.nelts; j++) {[m
[31m-[m
[31m-                if (hk[j].key.data == NULL) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {[m
[31m-                    hk[j].key.data = NULL;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hash->hash = &conf->hide_headers_hash;[m
[31m-    hash->key = ngx_hash_key_lc;[m
[31m-    hash->pool = cf->pool;[m
[31m-    hash->temp_pool = NULL;[m
[31m-[m
[31m-    return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_upstream_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t));[m
[31m-    if (umcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&umcf->upstreams, cf->pool, 4,[m
[31m-                       sizeof(ngx_http_upstream_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return umcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t  *umcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                      i;[m
[31m-    ngx_array_t                     headers_in;[m
[31m-    ngx_hash_key_t                 *hk;[m
[31m-    ngx_hash_init_t                 hash;[m
[31m-    ngx_http_upstream_init_pt       init;[m
[31m-    ngx_http_upstream_header_t     *header;[m
[31m-    ngx_http_upstream_srv_conf_t  **uscfp;[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream:[m
[31m-                                            ngx_http_upstream_init_round_robin;[m
[31m-[m
[31m-        if (init(cf, uscfp[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* upstream_headers_in_hash */[m
[31m-[m
[31m-    if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (header = ngx_http_upstream_headers_in; header->name.len; header++) {[m
[31m-        hk = ngx_array_push(&headers_in);[m
[31m-        if (hk == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        hk->key = header->name;[m
[31m-        hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);[m
[31m-        hk->value = header;[m
[31m-    }[m
[31m-[m
[31m-    hash.hash = &umcf->headers_in_hash;[m
[31m-    hash.key = ngx_hash_key_lc;[m
[31m-    hash.max_size = 512;[m
[31m-    hash.bucket_size = ngx_align(64, ngx_cacheline_size);[m
[31m-    hash.name = "upstream_headers_in_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex 7595dcf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,419 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_[m
[31m-#define _NGX_HTTP_UPSTREAM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-#include <ngx_event_pipe.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_FT_ERROR           0x00000002[m
[31m-#define NGX_HTTP_UPSTREAM_FT_TIMEOUT         0x00000004[m
[31m-#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER  0x00000008[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_500        0x00000010[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_502        0x00000020[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_503        0x00000040[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_504        0x00000080[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_403        0x00000100[m
[31m-#define NGX_HTTP_UPSTREAM_FT_HTTP_404        0x00000200[m
[31m-#define NGX_HTTP_UPSTREAM_FT_UPDATING        0x00000400[m
[31m-#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK       0x00000800[m
[31m-#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING     0x00001000[m
[31m-#define NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT  0x00002000[m
[31m-#define NGX_HTTP_UPSTREAM_FT_NOLIVE          0x40000000[m
[31m-#define NGX_HTTP_UPSTREAM_FT_OFF             0x80000000[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_FT_STATUS          (NGX_HTTP_UPSTREAM_FT_HTTP_500  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_502  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_503  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_504  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_403  \[m
[31m-                                             |NGX_HTTP_UPSTREAM_FT_HTTP_404)[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_INVALID_HEADER     40[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT    0x00000002[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES     0x00000004[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_EXPIRES        0x00000008[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL  0x00000010[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE     0x00000020[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE  0x00000040[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING   0x00000080[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET     0x00000100[m
[31m-#define NGX_HTTP_UPSTREAM_IGN_VARY           0x00000200[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_msec_t                       bl_time;[m
[31m-    ngx_uint_t                       bl_state;[m
[31m-[m
[31m-    ngx_uint_t                       status;[m
[31m-    ngx_msec_t                       response_time;[m
[31m-    ngx_msec_t                       connect_time;[m
[31m-    ngx_msec_t                       header_time;[m
[31m-    off_t                            response_length;[m
[31m-[m
[31m-    ngx_str_t                       *peer;[m
[31m-} ngx_http_upstream_state_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_t                       headers_in_hash;[m
[31m-    ngx_array_t                      upstreams;[m
[31m-                                             /* ngx_http_upstream_srv_conf_t */[m
[31m-} ngx_http_upstream_main_conf_t;[m
[31m-[m
[31m-typedef struct ngx_http_upstream_srv_conf_s  ngx_http_upstream_srv_conf_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_upstream_init_pt)(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-typedef ngx_int_t (*ngx_http_upstream_init_peer_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_init_pt        init_upstream;[m
[31m-    ngx_http_upstream_init_peer_pt   init;[m
[31m-    void                            *data;[m
[31m-} ngx_http_upstream_peer_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_addr_t                      *addrs;[m
[31m-    ngx_uint_t                       naddrs;[m
[31m-    ngx_uint_t                       weight;[m
[31m-    ngx_uint_t                       max_fails;[m
[31m-    time_t                           fail_timeout;[m
[31m-[m
[31m-    unsigned                         down:1;[m
[31m-    unsigned                         backup:1;[m
[31m-} ngx_http_upstream_server_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_UPSTREAM_CREATE        0x0001[m
[31m-#define NGX_HTTP_UPSTREAM_WEIGHT        0x0002[m
[31m-#define NGX_HTTP_UPSTREAM_MAX_FAILS     0x0004[m
[31m-#define NGX_HTTP_UPSTREAM_FAIL_TIMEOUT  0x0008[m
[31m-#define NGX_HTTP_UPSTREAM_DOWN          0x0010[m
[31m-#define NGX_HTTP_UPSTREAM_BACKUP        0x0020[m
[31m-[m
[31m-[m
[31m-struct ngx_http_upstream_srv_conf_s {[m
[31m-    ngx_http_upstream_peer_t         peer;[m
[31m-    void                           **srv_conf;[m
[31m-[m
[31m-    ngx_array_t                     *servers;  /* ngx_http_upstream_server_t */[m
[31m-[m
[31m-    ngx_uint_t                       flags;[m
[31m-    ngx_str_t                        host;[m
[31m-    u_char                          *file_name;[m
[31m-    ngx_uint_t                       line;[m
[31m-    in_port_t                        port;[m
[31m-    in_port_t                        default_port;[m
[31m-    ngx_uint_t                       no_port;  /* unsigned no_port:1 */[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    ngx_shm_zone_t                  *shm_zone;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_addr_t                      *addr;[m
[31m-    ngx_http_complex_value_t        *value;[m
[31m-} ngx_http_upstream_local_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_srv_conf_t    *upstream;[m
[31m-[m
[31m-    ngx_msec_t                       connect_timeout;[m
[31m-    ngx_msec_t                       send_timeout;[m
[31m-    ngx_msec_t                       read_timeout;[m
[31m-    ngx_msec_t                       timeout;[m
[31m-    ngx_msec_t                       next_upstream_timeout;[m
[31m-[m
[31m-    size_t                           send_lowat;[m
[31m-    size_t                           buffer_size;[m
[31m-    size_t                           limit_rate;[m
[31m-[m
[31m-    size_t                           busy_buffers_size;[m
[31m-    size_t                           max_temp_file_size;[m
[31m-    size_t                           temp_file_write_size;[m
[31m-[m
[31m-    size_t                           busy_buffers_size_conf;[m
[31m-    size_t                           max_temp_file_size_conf;[m
[31m-    size_t                           temp_file_write_size_conf;[m
[31m-[m
[31m-    ngx_bufs_t                       bufs;[m
[31m-[m
[31m-    ngx_uint_t                       ignore_headers;[m
[31m-    ngx_uint_t                       next_upstream;[m
[31m-    ngx_uint_t                       store_access;[m
[31m-    ngx_uint_t                       next_upstream_tries;[m
[31m-    ngx_flag_t                       buffering;[m
[31m-    ngx_flag_t                       request_buffering;[m
[31m-    ngx_flag_t                       pass_request_headers;[m
[31m-    ngx_flag_t                       pass_request_body;[m
[31m-[m
[31m-    ngx_flag_t                       ignore_client_abort;[m
[31m-    ngx_flag_t                       intercept_errors;[m
[31m-    ngx_flag_t                       cyclic_temp_file;[m
[31m-    ngx_flag_t                       force_ranges;[m
[31m-[m
[31m-    ngx_path_t                      *temp_path;[m
[31m-[m
[31m-    ngx_hash_t                       hide_headers_hash;[m
[31m-    ngx_array_t                     *hide_headers;[m
[31m-    ngx_array_t                     *pass_headers;[m
[31m-[m
[31m-    ngx_http_upstream_local_t       *local;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_shm_zone_t                  *cache_zone;[m
[31m-    ngx_http_complex_value_t        *cache_value;[m
[31m-[m
[31m-    ngx_uint_t                       cache_min_uses;[m
[31m-    ngx_uint_t                       cache_use_stale;[m
[31m-    ngx_uint_t                       cache_methods;[m
[31m-[m
[31m-    ngx_flag_t                       cache_lock;[m
[31m-    ngx_msec_t                       cache_lock_timeout;[m
[31m-    ngx_msec_t                       cache_lock_age;[m
[31m-[m
[31m-    ngx_flag_t                       cache_revalidate;[m
[31m-    ngx_flag_t                       cache_convert_head;[m
[31m-[m
[31m-    ngx_array_t                     *cache_valid;[m
[31m-    ngx_array_t                     *cache_bypass;[m
[31m-    ngx_array_t                     *no_cache;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t                     *store_lengths;[m
[31m-    ngx_array_t                     *store_values;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    signed                           cache:2;[m
[31m-#endif[m
[31m-    signed                           store:2;[m
[31m-    unsigned                         intercept_404:1;[m
[31m-    unsigned                         change_buffering:1;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_ssl_t                       *ssl;[m
[31m-    ngx_flag_t                       ssl_session_reuse;[m
[31m-[m
[31m-    ngx_http_complex_value_t        *ssl_name;[m
[31m-    ngx_flag_t                       ssl_server_name;[m
[31m-    ngx_flag_t                       ssl_verify;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_str_t                        module;[m
[31m-} ngx_http_upstream_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_http_header_handler_pt       handler;[m
[31m-    ngx_uint_t                       offset;[m
[31m-    ngx_http_header_handler_pt       copy_handler;[m
[31m-    ngx_uint_t                       conf;[m
[31m-    ngx_uint_t                       redirect;  /* unsigned   redirect:1; */[m
[31m-} ngx_http_upstream_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_list_t                       headers;[m
[31m-[m
[31m-    ngx_uint_t                       status_n;[m
[31m-    ngx_str_t                        status_line;[m
[31m-[m
[31m-    ngx_table_elt_t                 *status;[m
[31m-    ngx_table_elt_t                 *date;[m
[31m-    ngx_table_elt_t                 *server;[m
[31m-    ngx_table_elt_t                 *connection;[m
[31m-[m
[31m-    ngx_table_elt_t                 *expires;[m
[31m-    ngx_table_elt_t                 *etag;[m
[31m-    ngx_table_elt_t                 *x_accel_expires;[m
[31m-    ngx_table_elt_t                 *x_accel_redirect;[m
[31m-    ngx_table_elt_t                 *x_accel_limit_rate;[m
[31m-[m
[31m-    ngx_table_elt_t                 *content_type;[m
[31m-    ngx_table_elt_t                 *content_length;[m
[31m-[m
[31m-    ngx_table_elt_t                 *last_modified;[m
[31m-    ngx_table_elt_t                 *location;[m
[31m-    ngx_table_elt_t                 *accept_ranges;[m
[31m-    ngx_table_elt_t                 *www_authenticate;[m
[31m-    ngx_table_elt_t                 *transfer_encoding;[m
[31m-    ngx_table_elt_t                 *vary;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    ngx_table_elt_t                 *content_encoding;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t                      cache_control;[m
[31m-    ngx_array_t                      cookies;[m
[31m-[m
[31m-    off_t                            content_length_n;[m
[31m-    time_t                           last_modified_time;[m
[31m-[m
[31m-    unsigned                         connection_close:1;[m
[31m-    unsigned                         chunked:1;[m
[31m-} ngx_http_upstream_headers_in_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        host;[m
[31m-    in_port_t                        port;[m
[31m-    ngx_uint_t                       no_port; /* unsigned no_port:1 */[m
[31m-[m
[31m-    ngx_uint_t                       naddrs;[m
[31m-    ngx_resolver_addr_t             *addrs;[m
[31m-[m
[31m-    struct sockaddr                 *sockaddr;[m
[31m-    socklen_t                        socklen;[m
[31m-[m
[31m-    ngx_resolver_ctx_t              *ctx;[m
[31m-} ngx_http_upstream_resolved_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_upstream_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_upstream_s {[m
[31m-    ngx_http_upstream_handler_pt     read_event_handler;[m
[31m-    ngx_http_upstream_handler_pt     write_event_handler;[m
[31m-[m
[31m-    ngx_peer_connection_t            peer;[m
[31m-[m
[31m-    ngx_event_pipe_t                *pipe;[m
[31m-[m
[31m-    ngx_chain_t                     *request_bufs;[m
[31m-[m
[31m-    ngx_output_chain_ctx_t           output;[m
[31m-    ngx_chain_writer_ctx_t           writer;[m
[31m-[m
[31m-    ngx_http_upstream_conf_t        *conf;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_array_t                     *caches;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_headers_in_t   headers_in;[m
[31m-[m
[31m-    ngx_http_upstream_resolved_t    *resolved;[m
[31m-[m
[31m-    ngx_buf_t                        from_client;[m
[31m-[m
[31m-    ngx_buf_t                        buffer;[m
[31m-    off_t                            length;[m
[31m-[m
[31m-    ngx_chain_t                     *out_bufs;[m
[31m-    ngx_chain_t                     *busy_bufs;[m
[31m-    ngx_chain_t                     *free_bufs;[m
[31m-[m
[31m-    ngx_int_t                      (*input_filter_init)(void *data);[m
[31m-    ngx_int_t                      (*input_filter)(void *data, ssize_t bytes);[m
[31m-    void                            *input_filter_ctx;[m
[31m-[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    ngx_int_t                      (*create_key)(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-    ngx_int_t                      (*create_request)(ngx_http_request_t *r);[m
[31m-    ngx_int_t                      (*reinit_request)(ngx_http_request_t *r);[m
[31m-    ngx_int_t                      (*process_header)(ngx_http_request_t *r);[m
[31m-    void                           (*abort_request)(ngx_http_request_t *r);[m
[31m-    void                           (*finalize_request)(ngx_http_request_t *r,[m
[31m-                                         ngx_int_t rc);[m
[31m-    ngx_int_t                      (*rewrite_redirect)(ngx_http_request_t *r,[m
[31m-                                         ngx_table_elt_t *h, size_t prefix);[m
[31m-    ngx_int_t                      (*rewrite_cookie)(ngx_http_request_t *r,[m
[31m-                                         ngx_table_elt_t *h);[m
[31m-[m
[31m-    ngx_msec_t                       timeout;[m
[31m-[m
[31m-    ngx_http_upstream_state_t       *state;[m
[31m-[m
[31m-    ngx_str_t                        method;[m
[31m-    ngx_str_t                        schema;[m
[31m-    ngx_str_t                        uri;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_str_t                        ssl_name;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_cleanup_pt             *cleanup;[m
[31m-[m
[31m-    unsigned                         store:1;[m
[31m-    unsigned                         cacheable:1;[m
[31m-    unsigned                         accel:1;[m
[31m-    unsigned                         ssl:1;[m
[31m-#if (NGX_HTTP_CACHE)[m
[31m-    unsigned                         cache_status:3;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                         buffering:1;[m
[31m-    unsigned                         keepalive:1;[m
[31m-    unsigned                         upgrade:1;[m
[31m-[m
[31m-    unsigned                         request_sent:1;[m
[31m-    unsigned                         request_body_sent:1;[m
[31m-    unsigned                         header_sent:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                      status;[m
[31m-    ngx_uint_t                      mask;[m
[31m-} ngx_http_upstream_next_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t   key;[m
[31m-    ngx_str_t   value;[m
[31m-    ngx_uint_t  skip_empty;[m
[31m-} ngx_http_upstream_param_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_upstream_cookie_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-ngx_int_t ngx_http_upstream_header_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-ngx_int_t ngx_http_upstream_create(ngx_http_request_t *r);[m
[31m-void ngx_http_upstream_init(ngx_http_request_t *r);[m
[31m-ngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf,[m
[31m-    ngx_url_t *u, ngx_uint_t flags);[m
[31m-char *ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-ngx_int_t ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,[m
[31m-    ngx_str_t *default_hide_headers, ngx_hash_init_t *hash);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_conf_upstream_srv_conf(uscf, module)                         \[m
[31m-    uscf->srv_conf[module.ctx_index][m
[31m-[m
[31m-[m
[31m-extern ngx_module_t        ngx_http_upstream_module;[m
[31m-extern ngx_conf_bitmask_t  ngx_http_upstream_cache_method_mask[];[m
[31m-extern ngx_conf_bitmask_t  ngx_http_upstream_ignore_headers_masks[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.c[m
[1mdeleted file mode 100644[m
[1mindex 8342dc8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.c[m
[1m+++ /dev/null[m
[36m@@ -1,843 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_http_upstream_tries(p) ((p)->number                               \[m
[31m-                                    + ((p)->next ? (p)->next->number : 0))[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer([m
[31m-    ngx_http_upstream_rr_peer_data_t *rrp);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static void ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_init_round_robin(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_url_t                      u;[m
[31m-    ngx_uint_t                     i, j, n, w;[m
[31m-    ngx_http_upstream_server_t    *server;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer, **peerp;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers, *backup;[m
[31m-[m
[31m-    us->peer.init = ngx_http_upstream_init_round_robin_peer;[m
[31m-[m
[31m-    if (us->servers) {[m
[31m-        server = us->servers->elts;[m
[31m-[m
[31m-        n = 0;[m
[31m-        w = 0;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n += server[i].naddrs;[m
[31m-            w += server[i].naddrs * server[i].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no servers in upstream \"%V\" in %s:%ui",[m
[31m-                          &us->host, us->file_name, us->line);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-        if (peers == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers->single = (n == 1);[m
[31m-        peers->number = n;[m
[31m-        peers->weighted = (w != n);[m
[31m-        peers->total_weight = w;[m
[31m-        peers->name = &us->host;[m
[31m-[m
[31m-        n = 0;[m
[31m-        peerp = &peers->peer;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-                peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-                peer[n].name = server[i].addrs[j].name;[m
[31m-                peer[n].weight = server[i].weight;[m
[31m-                peer[n].effective_weight = server[i].weight;[m
[31m-                peer[n].current_weight = 0;[m
[31m-                peer[n].max_fails = server[i].max_fails;[m
[31m-                peer[n].fail_timeout = server[i].fail_timeout;[m
[31m-                peer[n].down = server[i].down;[m
[31m-                peer[n].server = server[i].name;[m
[31m-[m
[31m-                *peerp = &peer[n];[m
[31m-                peerp = &peer[n].next;[m
[31m-                n++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        us->peer.data = peers;[m
[31m-[m
[31m-        /* backup servers */[m
[31m-[m
[31m-        n = 0;[m
[31m-        w = 0;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (!server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n += server[i].naddrs;[m
[31m-            w += server[i].naddrs * server[i].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        backup = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-        if (backup == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers->single = 0;[m
[31m-        backup->single = 0;[m
[31m-        backup->number = n;[m
[31m-        backup->weighted = (w != n);[m
[31m-        backup->total_weight = w;[m
[31m-        backup->name = &us->host;[m
[31m-[m
[31m-        n = 0;[m
[31m-        peerp = &backup->peer;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (!server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-                peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-                peer[n].name = server[i].addrs[j].name;[m
[31m-                peer[n].weight = server[i].weight;[m
[31m-                peer[n].effective_weight = server[i].weight;[m
[31m-                peer[n].current_weight = 0;[m
[31m-                peer[n].max_fails = server[i].max_fails;[m
[31m-                peer[n].fail_timeout = server[i].fail_timeout;[m
[31m-                peer[n].down = server[i].down;[m
[31m-                peer[n].server = server[i].name;[m
[31m-[m
[31m-                *peerp = &peer[n];[m
[31m-                peerp = &peer[n].next;[m
[31m-                n++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        peers->next = backup;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* an upstream implicitly defined by proxy_pass, etc. */[m
[31m-[m
[31m-    if (us->port == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no port in upstream \"%V\" in %s:%ui",[m
[31m-                      &us->host, us->file_name, us->line);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.host = us->host;[m
[31m-    u.port = us->port;[m
[31m-[m
[31m-    if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "%s in upstream \"%V\" in %s:%ui",[m
[31m-                          u.err, &us->host, us->file_name, us->line);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = u.naddrs;[m
[31m-[m
[31m-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n);[m
[31m-    if (peer == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (n == 1);[m
[31m-    peers->number = n;[m
[31m-    peers->weighted = 0;[m
[31m-    peers->total_weight = n;[m
[31m-    peers->name = &us->host;[m
[31m-[m
[31m-    peerp = &peers->peer;[m
[31m-[m
[31m-    for (i = 0; i < u.naddrs; i++) {[m
[31m-        peer[i].sockaddr = u.addrs[i].sockaddr;[m
[31m-        peer[i].socklen = u.addrs[i].socklen;[m
[31m-        peer[i].name = u.addrs[i].name;[m
[31m-        peer[i].weight = 1;[m
[31m-        peer[i].effective_weight = 1;[m
[31m-        peer[i].current_weight = 0;[m
[31m-        peer[i].max_fails = 1;[m
[31m-        peer[i].fail_timeout = 10;[m
[31m-        *peerp = &peer[i];[m
[31m-        peerp = &peer[i].next;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.data = peers;[m
[31m-[m
[31m-    /* implicitly defined upstream has no backup servers */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_uint_t                         n;[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp;[m
[31m-[m
[31m-    rrp = r->upstream->peer.data;[m
[31m-[m
[31m-    if (rrp == NULL) {[m
[31m-        rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t));[m
[31m-        if (rrp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->upstream->peer.data = rrp;[m
[31m-    }[m
[31m-[m
[31m-    rrp->peers = us->peer.data;[m
[31m-    rrp->current = NULL;[m
[31m-[m
[31m-    n = rrp->peers->number;[m
[31m-[m
[31m-    if (rrp->peers->next && rrp->peers->next->number > n) {[m
[31m-        n = rrp->peers->next->number;[m
[31m-    }[m
[31m-[m
[31m-    if (n <= 8 * sizeof(uintptr_t)) {[m
[31m-        rrp->tried = &rrp->data;[m
[31m-        rrp->data = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t));[m
[31m-        if (rrp->tried == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;[m
[31m-    r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;[m
[31m-    r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    r->upstream->peer.set_session =[m
[31m-                               ngx_http_upstream_set_round_robin_peer_session;[m
[31m-    r->upstream->peer.save_session =[m
[31m-                               ngx_http_upstream_save_round_robin_peer_session;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_resolved_t *ur)[m
[31m-{[m
[31m-    u_char                            *p;[m
[31m-    size_t                             len;[m
[31m-    socklen_t                          socklen;[m
[31m-    ngx_uint_t                         i, n;[m
[31m-    struct sockaddr                   *sockaddr;[m
[31m-    ngx_http_upstream_rr_peer_t       *peer, **peerp;[m
[31m-    ngx_http_upstream_rr_peers_t      *peers;[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp;[m
[31m-[m
[31m-    rrp = r->upstream->peer.data;[m
[31m-[m
[31m-    if (rrp == NULL) {[m
[31m-        rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t));[m
[31m-        if (rrp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->upstream->peer.data = rrp;[m
[31m-    }[m
[31m-[m
[31m-    peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peer = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peer_t)[m
[31m-                                * ur->naddrs);[m
[31m-    if (peer == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (ur->naddrs == 1);[m
[31m-    peers->number = ur->naddrs;[m
[31m-    peers->name = &ur->host;[m
[31m-[m
[31m-    if (ur->sockaddr) {[m
[31m-        peer[0].sockaddr = ur->sockaddr;[m
[31m-        peer[0].socklen = ur->socklen;[m
[31m-        peer[0].name = ur->host;[m
[31m-        peer[0].weight = 1;[m
[31m-        peer[0].effective_weight = 1;[m
[31m-        peer[0].current_weight = 0;[m
[31m-        peer[0].max_fails = 1;[m
[31m-        peer[0].fail_timeout = 10;[m
[31m-        peers->peer = peer;[m
[31m-[m
[31m-    } else {[m
[31m-        peerp = &peers->peer;[m
[31m-[m
[31m-        for (i = 0; i < ur->naddrs; i++) {[m
[31m-[m
[31m-            socklen = ur->addrs[i].socklen;[m
[31m-[m
[31m-            sockaddr = ngx_palloc(r->pool, socklen);[m
[31m-            if (sockaddr == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);[m
[31m-[m
[31m-            switch (sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                ((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                ((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-            peer[i].sockaddr = sockaddr;[m
[31m-            peer[i].socklen = socklen;[m
[31m-            peer[i].name.len = len;[m
[31m-            peer[i].name.data = p;[m
[31m-            peer[i].weight = 1;[m
[31m-            peer[i].effective_weight = 1;[m
[31m-            peer[i].current_weight = 0;[m
[31m-            peer[i].max_fails = 1;[m
[31m-            peer[i].fail_timeout = 10;[m
[31m-            *peerp = &peer[i];[m
[31m-            peerp = &peer[i].next;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    rrp->peers = peers;[m
[31m-    rrp->current = NULL;[m
[31m-[m
[31m-    if (rrp->peers->number <= 8 * sizeof(uintptr_t)) {[m
[31m-        rrp->tried = &rrp->data;[m
[31m-        rrp->data = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t));[m
[31m-        if (rrp->tried == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;[m
[31m-    r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;[m
[31m-    r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    r->upstream->peer.set_session = ngx_http_upstream_empty_set_session;[m
[31m-    r->upstream->peer.save_session = ngx_http_upstream_empty_save_session;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_uint_t                     i, n;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "get rr peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    pc->cached = 0;[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    peers = rrp->peers;[m
[31m-    ngx_http_upstream_rr_peers_wlock(peers);[m
[31m-[m
[31m-    if (peers->single) {[m
[31m-        peer = peers->peer;[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        rrp->current = peer;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* there are several peers */[m
[31m-[m
[31m-        peer = ngx_http_upstream_get_peer(rrp);[m
[31m-[m
[31m-        if (peer == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "get rr peer, current: %p %i",[m
[31m-                       peer, peer->current_weight);[m
[31m-    }[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (peers->next) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");[m
[31m-[m
[31m-        rrp->peers = peers->next;[m
[31m-[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            rrp->tried[i] = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        rc = ngx_http_upstream_get_round_robin_peer(pc, rrp);[m
[31m-[m
[31m-        if (rc != NGX_BUSY) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_wlock(peers);[m
[31m-    }[m
[31m-[m
[31m-    /* all peers failed, mark them as live for quick recovery */[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        peer->fails = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    pc->name = peers->name;[m
[31m-[m
[31m-    return NGX_BUSY;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_rr_peer_t *[m
[31m-ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)[m
[31m-{[m
[31m-    time_t                        now;[m
[31m-    uintptr_t                     m;[m
[31m-    ngx_int_t                     total;[m
[31m-    ngx_uint_t                    i, n, p;[m
[31m-    ngx_http_upstream_rr_peer_t  *peer, *best;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    best = NULL;[m
[31m-    total = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    p = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (peer = rrp->peers->peer, i = 0;[m
[31m-         peer;[m
[31m-         peer = peer->next, i++)[m
[31m-    {[m
[31m-[m
[31m-        n = i / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (rrp->tried[n] & m) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        peer->current_weight += peer->effective_weight;[m
[31m-        total += peer->effective_weight;[m
[31m-[m
[31m-        if (peer->effective_weight < peer->weight) {[m
[31m-            peer->effective_weight++;[m
[31m-        }[m
[31m-[m
[31m-        if (best == NULL || peer->current_weight > best->current_weight) {[m
[31m-            best = peer;[m
[31m-            p = i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (best == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rrp->current = best;[m
[31m-[m
[31m-    n = p / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    rrp->tried[n] |= m;[m
[31m-[m
[31m-    best->current_weight -= total;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    return best;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    time_t                       now;[m
[31m-    ngx_http_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "free rr peer %ui %ui", pc->tries, state);[m
[31m-[m
[31m-    /* TODO: NGX_PEER_KEEPALIVE */[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_rlock(rrp->peers);[m
[31m-    ngx_http_upstream_rr_peer_lock(rrp->peers, peer);[m
[31m-[m
[31m-    if (rrp->peers->single) {[m
[31m-[m
[31m-        peer->conns--;[m
[31m-[m
[31m-        ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);[m
[31m-        ngx_http_upstream_rr_peers_unlock(rrp->peers);[m
[31m-[m
[31m-        pc->tries = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED) {[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        peer->fails++;[m
[31m-        peer->accessed = now;[m
[31m-        peer->checked = now;[m
[31m-[m
[31m-        if (peer->max_fails) {[m
[31m-            peer->effective_weight -= peer->weight / peer->max_fails;[m
[31m-[m
[31m-            if (peer->fails >= peer->max_fails) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, pc->log, 0,[m
[31m-                              "upstream server temporarily disabled");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "free rr peer failed: %p %i",[m
[31m-                       peer, peer->effective_weight);[m
[31m-[m
[31m-        if (peer->effective_weight < 0) {[m
[31m-            peer->effective_weight = 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* mark peer live if check passed */[m
[31m-[m
[31m-        if (peer->accessed < peer->checked) {[m
[31m-            peer->fails = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    peer->conns--;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peer_unlock(rrp->peers, peer);[m
[31m-    ngx_http_upstream_rr_peers_unlock(rrp->peers);[m
[31m-[m
[31m-    if (pc->tries) {[m
[31m-        pc->tries--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_ssl_session_t             *ssl_session;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer;[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    int                            len;[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                        *p;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers;[m
[31m-    u_char                         buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-#endif[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    if (peers->shpool) {[m
[31m-        ngx_http_upstream_rr_peers_rlock(peers);[m
[31m-        ngx_http_upstream_rr_peer_lock(peers, peer);[m
[31m-[m
[31m-        if (peer->ssl_session == NULL) {[m
[31m-            ngx_http_upstream_rr_peer_unlock(peers, peer);[m
[31m-            ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        len = peer->ssl_session_len;[m
[31m-[m
[31m-        ngx_memcpy(buf, peer->ssl_session, len);[m
[31m-[m
[31m-        ngx_http_upstream_rr_peer_unlock(peers, peer);[m
[31m-        ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        p = buf;[m
[31m-        ssl_session = d2i_SSL_SESSION(NULL, &p, len);[m
[31m-[m
[31m-        rc = ngx_ssl_set_session(pc->connection, ssl_session);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "set session: %p", ssl_session);[m
[31m-[m
[31m-        ngx_ssl_free_session(ssl_session);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ssl_session = peer->ssl_session;[m
[31m-[m
[31m-    rc = ngx_ssl_set_session(pc->connection, ssl_session);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "set session: %p", ssl_session);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_ssl_session_t             *old_ssl_session, *ssl_session;[m
[31m-    ngx_http_upstream_rr_peer_t   *peer;[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    int                            len;[m
[31m-    u_char                        *p;[m
[31m-    ngx_http_upstream_rr_peers_t  *peers;[m
[31m-    u_char                         buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    if (peers->shpool) {[m
[31m-[m
[31m-        ssl_session = SSL_get0_session(pc->connection->ssl->connection);[m
[31m-[m
[31m-        if (ssl_session == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "save session: %p", ssl_session);[m
[31m-[m
[31m-        len = i2d_SSL_SESSION(ssl_session, NULL);[m
[31m-[m
[31m-        /* do not cache too big session */[m
[31m-[m
[31m-        if (len > NGX_SSL_MAX_SESSION_SIZE) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-        (void) i2d_SSL_SESSION(ssl_session, &p);[m
[31m-[m
[31m-        peer = rrp->current;[m
[31m-[m
[31m-        ngx_http_upstream_rr_peers_rlock(peers);[m
[31m-        ngx_http_upstream_rr_peer_lock(peers, peer);[m
[31m-[m
[31m-        if (len > peer->ssl_session_len) {[m
[31m-            ngx_shmtx_lock(&peers->shpool->mutex);[m
[31m-[m
[31m-            if (peer->ssl_session) {[m
[31m-                ngx_slab_free_locked(peers->shpool, peer->ssl_session);[m
[31m-            }[m
[31m-[m
[31m-            peer->ssl_session = ngx_slab_alloc_locked(peers->shpool, len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&peers->shpool->mutex);[m
[31m-[m
[31m-            if (peer->ssl_session == NULL) {[m
[31m-                peer->ssl_session_len = 0;[m
[31m-[m
[31m-                ngx_http_upstream_rr_peer_unlock(peers, peer);[m
[31m-                ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            peer->ssl_session_len = len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer->ssl_session, buf, len);[m
[31m-[m
[31m-        ngx_http_upstream_rr_peer_unlock(peers, peer);[m
[31m-        ngx_http_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ssl_session = ngx_ssl_get_session(pc->connection);[m
[31m-[m
[31m-    if (ssl_session == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "save session: %p", ssl_session);[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-    old_ssl_session = peer->ssl_session;[m
[31m-    peer->ssl_session = ssl_session;[m
[31m-[m
[31m-    if (old_ssl_session) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "old session: %p", old_ssl_session);[m
[31m-[m
[31m-        /* TODO: may block */[m
[31m-[m
[31m-        ngx_ssl_free_session(old_ssl_session);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.h[m
[1mdeleted file mode 100644[m
[1mindex f2c573f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_upstream_round_robin.h[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_[m
[31m-#define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_upstream_rr_peer_s   ngx_http_upstream_rr_peer_t;[m
[31m-[m
[31m-struct ngx_http_upstream_rr_peer_s {[m
[31m-    struct sockaddr                *sockaddr;[m
[31m-    socklen_t                       socklen;[m
[31m-    ngx_str_t                       name;[m
[31m-    ngx_str_t                       server;[m
[31m-[m
[31m-    ngx_int_t                       current_weight;[m
[31m-    ngx_int_t                       effective_weight;[m
[31m-    ngx_int_t                       weight;[m
[31m-[m
[31m-    ngx_uint_t                      conns;[m
[31m-[m
[31m-    ngx_uint_t                      fails;[m
[31m-    time_t                          accessed;[m
[31m-    time_t                          checked;[m
[31m-[m
[31m-    ngx_uint_t                      max_fails;[m
[31m-    time_t                          fail_timeout;[m
[31m-[m
[31m-    ngx_uint_t                      down;          /* unsigned  down:1; */[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    void                           *ssl_session;[m
[31m-    int                             ssl_session_len;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_rr_peer_t    *next;[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    ngx_atomic_t                    lock;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_upstream_rr_peers_s  ngx_http_upstream_rr_peers_t;[m
[31m-[m
[31m-struct ngx_http_upstream_rr_peers_s {[m
[31m-    ngx_uint_t                      number;[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-    ngx_slab_pool_t                *shpool;[m
[31m-    ngx_atomic_t                    rwlock;[m
[31m-    ngx_http_upstream_rr_peers_t   *zone_next;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t                      total_weight;[m
[31m-[m
[31m-    unsigned                        single:1;[m
[31m-    unsigned                        weighted:1;[m
[31m-[m
[31m-    ngx_str_t                      *name;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peers_t   *next;[m
[31m-[m
[31m-    ngx_http_upstream_rr_peer_t    *peer;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_UPSTREAM_ZONE)[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peers_rlock(peers)                               \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_rlock(&peers->rwlock);                                     \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peers_wlock(peers)                               \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_wlock(&peers->rwlock);                                     \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peers_unlock(peers)                              \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_unlock(&peers->rwlock);                                    \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peer_lock(peers, peer)                           \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_wlock(&peer->lock);                                        \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peer_unlock(peers, peer)                         \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_unlock(&peer->lock);                                       \[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_http_upstream_rr_peers_rlock(peers)[m
[31m-#define ngx_http_upstream_rr_peers_wlock(peers)[m
[31m-#define ngx_http_upstream_rr_peers_unlock(peers)[m
[31m-#define ngx_http_upstream_rr_peer_lock(peers, peer)[m
[31m-#define ngx_http_upstream_rr_peer_unlock(peers, peer)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_upstream_rr_peers_t   *peers;[m
[31m-    ngx_http_upstream_rr_peer_t    *current;[m
[31m-    uintptr_t                      *tried;[m
[31m-    uintptr_t                       data;[m
[31m-} ngx_http_upstream_rr_peer_data_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_resolved_t *ur);[m
[31m-ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-ngx_int_t[m
[31m-    ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_variables.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_variables.c[m
[1mdeleted file mode 100644[m
[1mindex f8271ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_variables.c[m
[1m+++ /dev/null[m
[36m@@ -1,2633 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#if 0[m
[31m-static void ngx_http_variable_request_set(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static void ngx_http_variable_request_set_size(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_cookies(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_headers_internal(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data, u_char sep);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_line(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#if (NGX_HAVE_TCP_INFO)[m
[31m-static ngx_int_t ngx_http_variable_tcpinfo(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_content_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_remote_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_proxy_protocol_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_server_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_https(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static void ngx_http_variable_set_args(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_realpath_root(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_server_name(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_method(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_remote_user(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_bytes_sent(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_body_bytes_sent(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_pipe(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_completion(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_request_time(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_sent_content_type(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_content_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_location(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_keep_alive(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_connection_requests(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_variable_nginx_version(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_hostname(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_pid(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_msec(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_time_iso8601(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-static ngx_int_t ngx_http_variable_time_local(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-/*[m
[31m- * TODO:[m
[31m- *     Apache CGI: AUTH_TYPE, PATH_INFO (null), PATH_TRANSLATED[m
[31m- *                 REMOTE_HOST (null), REMOTE_IDENT (null),[m
[31m- *                 SERVER_SOFTWARE[m
[31m- *[m
[31m- *     Apache SSI: DOCUMENT_NAME, LAST_MODIFIED, USER_NAME (file owner)[m
[31m- */[m
[31m-[m
[31m-/*[m
[31m- * the $http_host, $http_user_agent, $http_referer, and $http_via[m
[31m- * variables may be handled by generic[m
[31m- * ngx_http_variable_unknown_header_in(), but for performance reasons[m
[31m- * they are handled using dedicated entries[m
[31m- */[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_core_variables[] = {[m
[31m-[m
[31m-    { ngx_string("http_host"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.host), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("http_user_agent"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.user_agent), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("http_referer"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.referer), 0, 0 },[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("http_via"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.via), 0, 0 },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_headers,[m
[31m-      offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("http_cookie"), NULL, ngx_http_variable_cookies,[m
[31m-      offsetof(ngx_http_request_t, headers_in.cookies), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("content_length"), NULL, ngx_http_variable_content_length,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("content_type"), NULL, ngx_http_variable_header,[m
[31m-      offsetof(ngx_http_request_t, headers_in.content_type), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("host"), NULL, ngx_http_variable_host, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("binary_remote_addr"), NULL,[m
[31m-      ngx_http_variable_binary_remote_addr, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("remote_addr"), NULL, ngx_http_variable_remote_addr, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("remote_port"), NULL, ngx_http_variable_remote_port, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("proxy_protocol_addr"), NULL,[m
[31m-      ngx_http_variable_proxy_protocol_addr, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("server_addr"), NULL, ngx_http_variable_server_addr, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("server_port"), NULL, ngx_http_variable_server_port, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("server_protocol"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, http_protocol), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("scheme"), NULL, ngx_http_variable_scheme, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("https"), NULL, ngx_http_variable_https, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_uri"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, unparsed_uri), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("uri"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, uri),[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("document_uri"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, uri),[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("request"), NULL, ngx_http_variable_request_line, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("document_root"), NULL,[m
[31m-      ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("realpath_root"), NULL,[m
[31m-      ngx_http_variable_realpath_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("query_string"), NULL, ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, args),[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("args"),[m
[31m-      ngx_http_variable_set_args,[m
[31m-      ngx_http_variable_request,[m
[31m-      offsetof(ngx_http_request_t, args),[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("is_args"), NULL, ngx_http_variable_is_args,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("request_filename"), NULL,[m
[31m-      ngx_http_variable_request_filename, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("server_name"), NULL, ngx_http_variable_server_name, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_method"), NULL,[m
[31m-      ngx_http_variable_request_method, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("remote_user"), NULL, ngx_http_variable_remote_user, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("bytes_sent"), NULL, ngx_http_variable_bytes_sent,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("body_bytes_sent"), NULL, ngx_http_variable_body_bytes_sent,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("pipe"), NULL, ngx_http_variable_pipe,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_completion"), NULL,[m
[31m-      ngx_http_variable_request_completion,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_body"), NULL,[m
[31m-      ngx_http_variable_request_body,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_body_file"), NULL,[m
[31m-      ngx_http_variable_request_body_file,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("request_length"), NULL, ngx_http_variable_request_length,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("request_time"), NULL, ngx_http_variable_request_time,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("status"), NULL,[m
[31m-      ngx_http_variable_status, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_content_type"), NULL,[m
[31m-      ngx_http_variable_sent_content_type, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_content_length"), NULL,[m
[31m-      ngx_http_variable_sent_content_length, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_location"), NULL,[m
[31m-      ngx_http_variable_sent_location, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_last_modified"), NULL,[m
[31m-      ngx_http_variable_sent_last_modified, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_connection"), NULL,[m
[31m-      ngx_http_variable_sent_connection, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_keep_alive"), NULL,[m
[31m-      ngx_http_variable_sent_keep_alive, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_transfer_encoding"), NULL,[m
[31m-      ngx_http_variable_sent_transfer_encoding, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers,[m
[31m-      offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 },[m
[31m-[m
[31m-    { ngx_string("limit_rate"), ngx_http_variable_request_set_size,[m
[31m-      ngx_http_variable_request_get_size,[m
[31m-      offsetof(ngx_http_request_t, limit_rate),[m
[31m-      NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("connection"), NULL,[m
[31m-      ngx_http_variable_connection, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("connection_requests"), NULL,[m
[31m-      ngx_http_variable_connection_requests, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("hostname"), NULL, ngx_http_variable_hostname,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("pid"), NULL, ngx_http_variable_pid,[m
[31m-      0, 0, 0 },[m
[31m-[m
[31m-    { ngx_string("msec"), NULL, ngx_http_variable_msec,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("time_iso8601"), NULL, ngx_http_variable_time_iso8601,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("time_local"), NULL, ngx_http_variable_time_local,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_INFO)[m
[31m-    { ngx_string("tcpinfo_rtt"), NULL, ngx_http_variable_tcpinfo,[m
[31m-      0, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("tcpinfo_rttvar"), NULL, ngx_http_variable_tcpinfo,[m
[31m-      1, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("tcpinfo_snd_cwnd"), NULL, ngx_http_variable_tcpinfo,[m
[31m-      2, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("tcpinfo_rcv_space"), NULL, ngx_http_variable_tcpinfo,[m
[31m-      3, NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_value_t  ngx_http_variable_null_value =[m
[31m-    ngx_http_variable("");[m
[31m-ngx_http_variable_value_t  ngx_http_variable_true_value =[m
[31m-    ngx_http_variable("1");[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_t *[m
[31m-ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_hash_key_t             *key;[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    if (name->len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"$\"");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    key = cmcf->variables_keys->keys.elts;[m
[31m-    for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) {[m
[31m-        if (name->len != key[i].key.len[m
[31m-            || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        v = key[i].value;[m
[31m-[m
[31m-        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the duplicate \"%V\" variable", name);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        return v;[m
[31m-    }[m
[31m-[m
[31m-    v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t));[m
[31m-    if (v == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    v->name.len = name->len;[m
[31m-    v->name.data = ngx_pnalloc(cf->pool, name->len);[m
[31m-    if (v->name.data == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(v->name.data, name->data, name->len);[m
[31m-[m
[31m-    v->set_handler = NULL;[m
[31m-    v->get_handler = NULL;[m
[31m-    v->data = 0;[m
[31m-    v->flags = flags;[m
[31m-    v->index = 0;[m
[31m-[m
[31m-    rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "conflicting variable name \"%V\"", name);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return v;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    if (name->len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"$\"");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    v = cmcf->variables.elts;[m
[31m-[m
[31m-    if (v == NULL) {[m
[31m-        if (ngx_array_init(&cmcf->variables, cf->pool, 4,[m
[31m-                           sizeof(ngx_http_variable_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        for (i = 0; i < cmcf->variables.nelts; i++) {[m
[31m-            if (name->len != v[i].name.len[m
[31m-                || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v = ngx_array_push(&cmcf->variables);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->name.len = name->len;[m
[31m-    v->name.data = ngx_pnalloc(cf->pool, name->len);[m
[31m-    if (v->name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(v->name.data, name->data, name->len);[m
[31m-[m
[31m-    v->set_handler = NULL;[m
[31m-    v->get_handler = NULL;[m
[31m-    v->data = 0;[m
[31m-    v->flags = 0;[m
[31m-    v->index = cmcf->variables.nelts - 1;[m
[31m-[m
[31m-    return v->index;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_value_t *[m
[31m-ngx_http_get_indexed_variable(ngx_http_request_t *r, ngx_uint_t index)[m
[31m-{[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (cmcf->variables.nelts <= index) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      "unknown variable index: %ui", index);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (r->variables[index].not_found || r->variables[index].valid) {[m
[31m-        return &r->variables[index];[m
[31m-    }[m
[31m-[m
[31m-    v = cmcf->variables.elts;[m
[31m-[m
[31m-    if (v[index].get_handler(r, &r->variables[index], v[index].data)[m
[31m-        == NGX_OK)[m
[31m-    {[m
[31m-        if (v[index].flags & NGX_HTTP_VAR_NOCACHEABLE) {[m
[31m-            r->variables[index].no_cacheable = 1;[m
[31m-        }[m
[31m-[m
[31m-        return &r->variables[index];[m
[31m-    }[m
[31m-[m
[31m-    r->variables[index].valid = 0;[m
[31m-    r->variables[index].not_found = 1;[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_value_t *[m
[31m-ngx_http_get_flushed_variable(ngx_http_request_t *r, ngx_uint_t index)[m
[31m-{[m
[31m-    ngx_http_variable_value_t  *v;[m
[31m-[m
[31m-    v = &r->variables[index];[m
[31m-[m
[31m-    if (v->valid || v->not_found) {[m
[31m-        if (!v->no_cacheable) {[m
[31m-            return v;[m
[31m-        }[m
[31m-[m
[31m-        v->valid = 0;[m
[31m-        v->not_found = 0;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_get_indexed_variable(r, index);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_value_t *[m
[31m-ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key)[m
[31m-{[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len);[m
[31m-[m
[31m-    if (v) {[m
[31m-        if (v->flags & NGX_HTTP_VAR_INDEXED) {[m
[31m-            return ngx_http_get_flushed_variable(r, v->index);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-            if (vv && v->get_handler(r, vv, v->data) == NGX_OK) {[m
[31m-                return vv;[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));[m
[31m-    if (vv == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 5 && ngx_strncmp(name->data, "http_", 5) == 0) {[m
[31m-[m
[31m-        if (ngx_http_variable_unknown_header_in(r, vv, (uintptr_t) name)[m
[31m-            == NGX_OK)[m
[31m-        {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 10 && ngx_strncmp(name->data, "sent_http_", 10) == 0) {[m
[31m-[m
[31m-        if (ngx_http_variable_unknown_header_out(r, vv, (uintptr_t) name)[m
[31m-            == NGX_OK)[m
[31m-        {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 14 && ngx_strncmp(name->data, "upstream_http_", 14) == 0) {[m
[31m-[m
[31m-        if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name)[m
[31m-            == NGX_OK)[m
[31m-        {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 7 && ngx_strncmp(name->data, "cookie_", 7) == 0) {[m
[31m-[m
[31m-        if (ngx_http_variable_cookie(r, vv, (uintptr_t) name) == NGX_OK) {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 16[m
[31m-        && ngx_strncmp(name->data, "upstream_cookie_", 16) == 0)[m
[31m-    {[m
[31m-[m
[31m-        if (ngx_http_upstream_cookie_variable(r, vv, (uintptr_t) name)[m
[31m-            == NGX_OK)[m
[31m-        {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (name->len >= 4 && ngx_strncmp(name->data, "arg_", 4) == 0) {[m
[31m-[m
[31m-        if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) {[m
[31m-            return vv;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    vv->not_found = 1;[m
[31m-[m
[31m-    return vv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  *s;[m
[31m-[m
[31m-    s = (ngx_str_t *) ((char *) r + data);[m
[31m-[m
[31m-    if (s->data) {[m
[31m-        v->len = s->len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = s->data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-static void[m
[31m-ngx_http_variable_request_set(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  *s;[m
[31m-[m
[31m-    s = (ngx_str_t *) ((char *) r + data);[m
[31m-[m
[31m-    s->len = v->len;[m
[31m-    s->data = v->data;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_get_size(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t  *sp;[m
[31m-[m
[31m-    sp = (size_t *) ((char *) r + data);[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_SIZE_T_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%uz", *sp) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_variable_request_set_size(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ssize_t    s, *sp;[m
[31m-    ngx_str_t  val;[m
[31m-[m
[31m-    val.len = v->len;[m
[31m-    val.data = v->data;[m
[31m-[m
[31m-    s = ngx_parse_size(&val);[m
[31m-[m
[31m-    if (s == NGX_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "invalid size \"%V\"", &val);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    sp = (ssize_t *) ((char *) r + data);[m
[31m-[m
[31m-    *sp = s;[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    h = *(ngx_table_elt_t **) ((char *) r + data);[m
[31m-[m
[31m-    if (h) {[m
[31m-        v->len = h->value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = h->value.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_cookies(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    return ngx_http_variable_headers_internal(r, v, data, ';');[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    return ngx_http_variable_headers_internal(r, v, data, ',');[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_headers_internal(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data, u_char sep)[m
[31m-{[m
[31m-    size_t             len;[m
[31m-    u_char            *p, *end;[m
[31m-    ngx_uint_t         i, n;[m
[31m-    ngx_array_t       *a;[m
[31m-    ngx_table_elt_t  **h;[m
[31m-[m
[31m-    a = (ngx_array_t *) ((char *) r + data);[m
[31m-[m
[31m-    n = a->nelts;[m
[31m-    h = a->elts;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        if (h[i]->hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        len += h[i]->value.len + 2;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len -= 2;[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        v->len = (*h)->value.len;[m
[31m-        v->data = (*h)->value.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    end = p + len;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (h[i]->hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(p, h[i]->value.data, h[i]->value.len);[m
[31m-[m
[31m-        if (p == end) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        *p++ = sep; *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_unknown_header_in(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,[m
[31m-                                            &r->headers_in.headers.part,[m
[31m-                                            sizeof("http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_unknown_header_out(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,[m
[31m-                                            &r->headers_out.headers.part,[m
[31m-                                            sizeof("sent_http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var,[m
[31m-    ngx_list_part_t *part, size_t prefix)[m
[31m-{[m
[31m-    u_char            ch;[m
[31m-    ngx_uint_t        i, n;[m
[31m-    ngx_table_elt_t  *header;[m
[31m-[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {[m
[31m-            ch = header[i].key.data[n];[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                ch |= 0x20;[m
[31m-[m
[31m-            } else if (ch == '-') {[m
[31m-                ch = '_';[m
[31m-            }[m
[31m-[m
[31m-            if (var->data[n + prefix] != ch) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n + prefix == var->len && n == header[i].key.len) {[m
[31m-            v->len = header[i].value.len;[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 0;[m
[31m-            v->not_found = 0;[m
[31m-            v->data = header[i].value.data;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_line(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p, *s;[m
[31m-[m
[31m-    s = r->request_line.data;[m
[31m-[m
[31m-    if (s == NULL) {[m
[31m-        s = r->request_start;[m
[31m-[m
[31m-        if (s == NULL) {[m
[31m-            v->not_found = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        for (p = s; p < r->header_in->last; p++) {[m
[31m-            if (*p == CR || *p == LF) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        r->request_line.len = p - s;[m
[31m-        r->request_line.data = s;[m
[31m-    }[m
[31m-[m
[31m-    v->len = r->request_line.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = s;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_cookie(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t *name = (ngx_str_t *) data;[m
[31m-[m
[31m-    ngx_str_t  cookie, s;[m
[31m-[m
[31m-    s.len = name->len - (sizeof("cookie_") - 1);[m
[31m-    s.data = name->data + sizeof("cookie_") - 1;[m
[31m-[m
[31m-    if (ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &s, &cookie)[m
[31m-        == NGX_DECLINED)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = cookie.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = cookie.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t *name = (ngx_str_t *) data;[m
[31m-[m
[31m-    u_char     *arg;[m
[31m-    size_t      len;[m
[31m-    ngx_str_t   value;[m
[31m-[m
[31m-    len = name->len - (sizeof("arg_") - 1);[m
[31m-    arg = name->data + sizeof("arg_") - 1;[m
[31m-[m
[31m-    if (ngx_http_arg(r, arg, len, &value) != NGX_OK) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = value.data;[m
[31m-    v->len = value.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_TCP_INFO)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_tcpinfo(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    struct tcp_info  ti;[m
[31m-    socklen_t        len;[m
[31m-    uint32_t         value;[m
[31m-[m
[31m-    len = sizeof(struct tcp_info);[m
[31m-    if (getsockopt(r->connection->fd, IPPROTO_TCP, TCP_INFO, &ti, &len) == -1) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (data) {[m
[31m-    case 0:[m
[31m-        value = ti.tcpi_rtt;[m
[31m-        break;[m
[31m-[m
[31m-    case 1:[m
[31m-        value = ti.tcpi_rttvar;[m
[31m-        break;[m
[31m-[m
[31m-    case 2:[m
[31m-        value = ti.tcpi_snd_cwnd;[m
[31m-        break;[m
[31m-[m
[31m-    case 3:[m
[31m-        value = ti.tcpi_rcv_space;[m
[31m-        break;[m
[31m-[m
[31m-    /* suppress warning */[m
[31m-    default:[m
[31m-        value = 0;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%uD", value) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_content_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        v->len = r->headers_in.content_length->value.len;[m
[31m-        v->data = r->headers_in.content_length->value.data;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-    } else if (r->reading_body) {[m
[31m-        v->not_found = 1;[m
[31m-        v->no_cacheable = 1;[m
[31m-[m
[31m-    } else if (r->headers_in.content_length_n >= 0) {[m
[31m-        p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_sprintf(p, "%O", r->headers_in.content_length_n) - p;[m
[31m-        v->data = p;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_host(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (r->headers_in.server.len) {[m
[31m-        v->len = r->headers_in.server.len;[m
[31m-        v->data = r->headers_in.server.data;[m
[31m-[m
[31m-    } else {[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        v->len = cscf->server_name.len;[m
[31m-        v->data = cscf->server_name.data;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_binary_remote_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    switch (r->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;[m
[31m-[m
[31m-        v->len = sizeof(struct in6_addr);[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = sin6->sin6_addr.s6_addr;[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) r->connection->sockaddr;[m
[31m-[m
[31m-        v->len = sizeof(in_addr_t);[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) &sin->sin_addr;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_remote_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->len = r->connection->addr_text.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->connection->addr_text.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_remote_port(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t            port;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (r->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;[m
[31m-        port = ntohs(sin6->sin6_port);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        port = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) r->connection->sockaddr;[m
[31m-        port = ntohs(sin->sin_port);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (port > 0 && port < 65536) {[m
[31m-        v->len = ngx_sprintf(v->data, "%ui", port) - v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_proxy_protocol_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->len = r->connection->proxy_protocol_addr.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->connection->proxy_protocol_addr.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_server_addr(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  s;[m
[31m-    u_char     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    s.len = NGX_SOCKADDR_STRLEN;[m
[31m-    s.data = addr;[m
[31m-[m
[31m-    if (ngx_connection_local_sockaddr(r->connection, &s, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s.data = ngx_pnalloc(r->pool, s.len);[m
[31m-    if (s.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s.data, addr, s.len);[m
[31m-[m
[31m-    v->len = s.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = s.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_server_port(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t            port;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (ngx_connection_local_sockaddr(r->connection, NULL, 0) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    switch (r->connection->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) r->connection->local_sockaddr;[m
[31m-        port = ntohs(sin6->sin6_port);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        port = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) r->connection->local_sockaddr;[m
[31m-        port = ntohs(sin->sin_port);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (port > 0 && port < 65536) {[m
[31m-        v->len = ngx_sprintf(v->data, "%ui", port) - v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_scheme(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-        v->len = sizeof("https") - 1;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "https";[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    v->len = sizeof("http") - 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) "http";[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_https(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (r->connection->ssl) {[m
[31m-        v->len = sizeof("on") - 1;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "on";[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_variable_set_args(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    r->args.len = v->len;[m
[31m-    r->args.data = v->data;[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_is_args(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    if (r->args.len == 0) {[m
[31m-        v->len = 0;[m
[31m-        v->data = NULL;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = 1;[m
[31m-    v->data = (u_char *) "?";[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_document_root(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t                  path;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->root_lengths == NULL) {[m
[31m-        v->len = clcf->root.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = clcf->root.data;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 0,[m
[31m-                                clcf->root_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, &path)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = path.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = path.data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_realpath_root(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                    *real;[m
[31m-    size_t                     len;[m
[31m-    ngx_str_t                  path;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-#if (NGX_HAVE_MAX_PATH)[m
[31m-    u_char                     buffer[NGX_MAX_PATH];[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (clcf->root_lengths == NULL) {[m
[31m-        path = clcf->root;[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 1,[m
[31m-                                clcf->root_values->elts)[m
[31m-            == NULL)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        path.data[path.len - 1] = '\0';[m
[31m-[m
[31m-        if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, &path)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_MAX_PATH)[m
[31m-    real = buffer;[m
[31m-#else[m
[31m-    real = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    real = ngx_realpath(path.data, real);[m
[31m-[m
[31m-    if (real == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,[m
[31m-                      ngx_realpath_n " \"%s\" failed", path.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(real);[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, len);[m
[31m-    if (v->data == NULL) {[m
[31m-#if !(NGX_HAVE_MAX_PATH)[m
[31m-        ngx_free(real);[m
[31m-#endif[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    ngx_memcpy(v->data, real, len);[m
[31m-[m
[31m-#if !(NGX_HAVE_MAX_PATH)[m
[31m-    ngx_free(real);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_filename(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t     root;[m
[31m-    ngx_str_t  path;[m
[31m-[m
[31m-    if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* ngx_http_map_uri_to_path() allocates memory for terminating '\0' */[m
[31m-[m
[31m-    v->len = path.len - 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = path.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_server_name(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v->len = cscf->server_name.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = cscf->server_name.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_method(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->main->method_name.data) {[m
[31m-        v->len = r->main->method_name.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->main->method_name.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_remote_user(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    rc = ngx_http_auth_basic_user(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = r->headers_in.user.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->headers_in.user.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_bytes_sent(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%O", r->connection->sent) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_body_bytes_sent(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    off_t    sent;[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    sent = r->connection->sent - r->header_size;[m
[31m-[m
[31m-    if (sent < 0) {[m
[31m-        sent = 0;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%O", sent) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_pipe(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->data = (u_char *) (r->pipeline ? "p" : ".");[m
[31m-    v->len = 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_status(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_uint_t  status;[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT_T_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        status = r->err_status;[m
[31m-[m
[31m-    } else if (r->headers_out.status) {[m
[31m-        status = r->headers_out.status;[m
[31m-[m
[31m-    } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-        status = 9;[m
[31m-[m
[31m-    } else {[m
[31m-        status = 0;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%03ui", status) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_content_type(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        v->len = r->headers_out.content_type.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->headers_out.content_type.data;[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_content_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->headers_out.content_length) {[m
[31m-        v->len = r->headers_out.content_length->value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->headers_out.content_length->value.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length_n >= 0) {[m
[31m-        p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_sprintf(p, "%O", r->headers_out.content_length_n) - p;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_location(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_str_t  name;[m
[31m-[m
[31m-    if (r->headers_out.location) {[m
[31m-        v->len = r->headers_out.location->value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->headers_out.location->value.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&name, "sent_http_location");[m
[31m-[m
[31m-    return ngx_http_variable_unknown_header(v, &name,[m
[31m-                                            &r->headers_out.headers.part,[m
[31m-                                            sizeof("sent_http_") - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_last_modified(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    if (r->headers_out.last_modified) {[m
[31m-        v->len = r->headers_out.last_modified->value.len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = r->headers_out.last_modified->value.data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified_time >= 0) {[m
[31m-        p = ngx_pnalloc(r->pool, sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->len = ngx_http_time(p, r->headers_out.last_modified_time) - p;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = p;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    char    *p;[m
[31m-[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        len = sizeof("upgrade") - 1;[m
[31m-        p = "upgrade";[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        len = sizeof("keep-alive") - 1;[m
[31m-        p = "keep-alive";[m
[31m-[m
[31m-    } else {[m
[31m-        len = sizeof("close") - 1;[m
[31m-        p = "close";[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_keep_alive(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    if (r->keepalive) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (clcf->keepalive_header) {[m
[31m-[m
[31m-            p = ngx_pnalloc(r->pool, sizeof("timeout=") - 1 + NGX_TIME_T_LEN);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            v->len = ngx_sprintf(p, "timeout=%T", clcf->keepalive_header) - p;[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 0;[m
[31m-            v->not_found = 0;[m
[31m-            v->data = p;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    v->not_found = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->chunked) {[m
[31m-        v->len = sizeof("chunked") - 1;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "chunked";[m
[31m-[m
[31m-    } else {[m
[31m-        v->not_found = 1;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_completion(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->request_complete) {[m
[31m-        v->len = 2;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "OK";[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = 0;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) "";[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char       *p;[m
[31m-    size_t        len;[m
[31m-    ngx_buf_t    *buf;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->bufs == NULL[m
[31m-        || r->request_body->temp_file)[m
[31m-    {[m
[31m-        v->not_found = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = r->request_body->bufs;[m
[31m-    buf = cl->buf;[m
[31m-[m
[31m-    if (cl->next == NULL) {[m
[31m-        v->len = buf->last - buf->pos;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = buf->pos;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = buf->last - buf->pos;[m
[31m-    cl = cl->next;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        len += buf->last - buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->data = p;[m
[31m-    cl = r->request_body->bufs;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-        buf = cl->buf;[m
[31m-        p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    v->len = len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_body_file(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    if (r->request_body == NULL || r->request_body->temp_file == NULL) {[m
[31m-        v->not_found = 1;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->len = r->request_body->temp_file->file.name.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->request_body->temp_file->file.name.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_length(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%O", r->request_length) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_request_time(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char          *p;[m
[31m-    ngx_time_t      *tp;[m
[31m-    ngx_msec_int_t   ms;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    ms = (ngx_msec_int_t)[m
[31m-             ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec));[m
[31m-    ms = ngx_max(ms, 0);[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_connection(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_ATOMIC_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%uA", r->connection->number) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_connection_requests(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_INT_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%ui", r->connection->requests) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_nginx_version(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->len = sizeof(NGINX_VERSION) - 1;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = (u_char *) NGINX_VERSION;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_hostname(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    v->len = ngx_cycle->hostname.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = ngx_cycle->hostname.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_pid(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_INT64_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%P", ngx_pid) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_msec(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    ngx_time_t  *tp;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    v->len = ngx_sprintf(p, "%T.%03M", tp->sec, tp->msec) - p;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_time_iso8601(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, ngx_cached_http_log_iso8601.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, ngx_cached_http_log_iso8601.data,[m
[31m-               ngx_cached_http_log_iso8601.len);[m
[31m-[m
[31m-    v->len = ngx_cached_http_log_iso8601.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_time_local(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, ngx_cached_http_log_time.len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, ngx_cached_http_log_time.data, ngx_cached_http_log_time.len);[m
[31m-[m
[31m-    v->len = ngx_cached_http_log_time.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, ngx_str_t *match)[m
[31m-{[m
[31m-    void        *value;[m
[31m-    u_char      *low;[m
[31m-    size_t       len;[m
[31m-    ngx_uint_t   key;[m
[31m-[m
[31m-    len = match->len;[m
[31m-[m
[31m-    if (len) {[m
[31m-        low = ngx_pnalloc(r->pool, len);[m
[31m-        if (low == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        low = NULL;[m
[31m-    }[m
[31m-[m
[31m-    key = ngx_hash_strlow(low, match->data, len);[m
[31m-[m
[31m-    value = ngx_hash_find_combined(&map->hash, key, low, len);[m
[31m-    if (value) {[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-    if (len && map->nregex) {[m
[31m-        ngx_int_t              n;[m
[31m-        ngx_uint_t             i;[m
[31m-        ngx_http_map_regex_t  *reg;[m
[31m-[m
[31m-        reg = map->regex;[m
[31m-[m
[31m-        for (i = 0; i < map->nregex; i++) {[m
[31m-[m
[31m-            n = ngx_http_regex_exec(r, reg[i].regex, match);[m
[31m-[m
[31m-            if (n == NGX_OK) {[m
[31m-                return reg[i].value;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_DECLINED) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* NGX_ERROR */[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_variable_not_found(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    v->not_found = 1;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_regex_t *[m
[31m-ngx_http_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc)[m
[31m-{[m
[31m-    u_char                     *p;[m
[31m-    size_t                      size;[m
[31m-    ngx_str_t                   name;[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_http_variable_t        *v;[m
[31m-    ngx_http_regex_t           *re;[m
[31m-    ngx_http_regex_variable_t  *rv;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    rc->pool = cf->pool;[m
[31m-[m
[31m-    if (ngx_regex_compile(rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    re = ngx_pcalloc(cf->pool, sizeof(ngx_http_regex_t));[m
[31m-    if (re == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = rc->regex;[m
[31m-    re->ncaptures = rc->captures;[m
[31m-    re->name = rc->pattern;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-    cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures);[m
[31m-[m
[31m-    n = (ngx_uint_t) rc->named_captures;[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return re;[m
[31m-    }[m
[31m-[m
[31m-    rv = ngx_palloc(rc->pool, n * sizeof(ngx_http_regex_variable_t));[m
[31m-    if (rv == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    re->variables = rv;[m
[31m-    re->nvariables = n;[m
[31m-[m
[31m-    size = rc->name_size;[m
[31m-    p = rc->names;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        rv[i].capture = 2 * ((p[0] << 8) + p[1]);[m
[31m-[m
[31m-        name.data = &p[2];[m
[31m-        name.len = ngx_strlen(name.data);[m
[31m-[m
[31m-        v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-        if (v == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        rv[i].index = ngx_http_get_variable_index(cf, &name);[m
[31m-        if (rv[i].index == NGX_ERROR) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        v->get_handler = ngx_http_variable_not_found;[m
[31m-[m
[31m-        p += size;[m
[31m-    }[m
[31m-[m
[31m-    return re;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, ngx_str_t *s)[m
[31m-{[m
[31m-    ngx_int_t                   rc, index;[m
[31m-    ngx_uint_t                  i, n, len;[m
[31m-    ngx_http_variable_value_t  *vv;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (re->ncaptures) {[m
[31m-        len = cmcf->ncaptures;[m
[31m-[m
[31m-        if (r->captures == NULL) {[m
[31m-            r->captures = ngx_palloc(r->pool, len * sizeof(int));[m
[31m-            if (r->captures == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        len = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_regex_exec(re->regex, s, r->captures, len);[m
[31m-[m
[31m-    if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (rc < 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,[m
[31m-                      ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"",[m
[31m-                      rc, s, &re->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < re->nvariables; i++) {[m
[31m-[m
[31m-        n = re->variables[i].capture;[m
[31m-        index = re->variables[i].index;[m
[31m-        vv = &r->variables[index];[m
[31m-[m
[31m-        vv->len = r->captures[n + 1] - r->captures[n];[m
[31m-        vv->valid = 1;[m
[31m-        vv->no_cacheable = 0;[m
[31m-        vv->not_found = 0;[m
[31m-        vv->data = &s->data[r->captures[n]];[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        ngx_http_variable_t  *v;[m
[31m-[m
[31m-        v = cmcf->variables.elts;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http regex set $%V to \"%v\"", &v[index].name, vv);[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    r->ncaptures = rc * 2;[m
[31m-    r->captures_data = s->data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_variables_add_core_vars(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_variable_t        *cv, *v;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    cmcf->variables_keys = ngx_pcalloc(cf->temp_pool,[m
[31m-                                       sizeof(ngx_hash_keys_arrays_t));[m
[31m-    if (cmcf->variables_keys == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->variables_keys->pool = cf->pool;[m
[31m-    cmcf->variables_keys->temp_pool = cf->pool;[m
[31m-[m
[31m-    if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (cv = ngx_http_core_variables; cv->name.len; cv++) {[m
[31m-        v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t));[m
[31m-        if (v == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *v = *cv;[m
[31m-[m
[31m-        rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v,[m
[31m-                              NGX_HASH_READONLY_KEY);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_BUSY) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "conflicting variable name \"%V\"", &v->name);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_variables_init_vars(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_uint_t                  i, n;[m
[31m-    ngx_hash_key_t             *key;[m
[31m-    ngx_hash_init_t             hash;[m
[31m-    ngx_http_variable_t        *v, *av;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    /* set the handlers for the indexed http variables */[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    v = cmcf->variables.elts;[m
[31m-    key = cmcf->variables_keys->keys.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->variables.nelts; i++) {[m
[31m-[m
[31m-        for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {[m
[31m-[m
[31m-            av = key[n].value;[m
[31m-[m
[31m-            if (v[i].name.len == key[n].key.len[m
[31m-                && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                v[i].get_handler = av->get_handler;[m
[31m-                v[i].data = av->data;[m
[31m-[m
[31m-                av->flags |= NGX_HTTP_VAR_INDEXED;[m
[31m-                v[i].flags = av->flags;[m
[31m-[m
[31m-                av->index = i;[m
[31m-[m
[31m-                if (av->get_handler == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 5[m
[31m-            && ngx_strncmp(v[i].name.data, "http_", 5) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_variable_unknown_header_in;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 10[m
[31m-            && ngx_strncmp(v[i].name.data, "sent_http_", 10) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_variable_unknown_header_out;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 14[m
[31m-            && ngx_strncmp(v[i].name.data, "upstream_http_", 14) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_upstream_header_variable;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-            v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 7[m
[31m-            && ngx_strncmp(v[i].name.data, "cookie_", 7) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_variable_cookie;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 16[m
[31m-            && ngx_strncmp(v[i].name.data, "upstream_cookie_", 16) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_upstream_cookie_variable;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-            v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (v[i].name.len >= 4[m
[31m-            && ngx_strncmp(v[i].name.data, "arg_", 4) == 0)[m
[31m-        {[m
[31m-            v[i].get_handler = ngx_http_variable_argument;[m
[31m-            v[i].data = (uintptr_t) &v[i].name;[m
[31m-            v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "unknown \"%V\" variable", &v[i].name);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {[m
[31m-        av = key[n].value;[m
[31m-[m
[31m-        if (av->flags & NGX_HTTP_VAR_NOHASH) {[m
[31m-            key[n].key.data = NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    hash.hash = &cmcf->variables_hash;[m
[31m-    hash.key = ngx_hash_key;[m
[31m-    hash.max_size = cmcf->variables_hash_max_size;[m
[31m-    hash.bucket_size = cmcf->variables_hash_bucket_size;[m
[31m-    hash.name = "variables_hash";[m
[31m-    hash.pool = cf->pool;[m
[31m-    hash.temp_pool = NULL;[m
[31m-[m
[31m-    if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts,[m
[31m-                      cmcf->variables_keys->keys.nelts)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf->variables_keys = NULL;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_variables.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_variables.h[m
[1mdeleted file mode 100644[m
[1mindex 829fab3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_variables.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_VARIABLES_H_INCLUDED_[m
[31m-#define _NGX_HTTP_VARIABLES_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_variable_value_t  ngx_http_variable_value_t;[m
[31m-[m
[31m-#define ngx_http_variable(v)     { sizeof(v) - 1, 1, 0, 0, 0, (u_char *) v }[m
[31m-[m
[31m-typedef struct ngx_http_variable_s  ngx_http_variable_t;[m
[31m-[m
[31m-typedef void (*ngx_http_set_variable_pt) (ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-typedef ngx_int_t (*ngx_http_get_variable_pt) (ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_VAR_CHANGEABLE   1[m
[31m-#define NGX_HTTP_VAR_NOCACHEABLE  2[m
[31m-#define NGX_HTTP_VAR_INDEXED      4[m
[31m-#define NGX_HTTP_VAR_NOHASH       8[m
[31m-[m
[31m-[m
[31m-struct ngx_http_variable_s {[m
[31m-    ngx_str_t                     name;   /* must be first to build the hash */[m
[31m-    ngx_http_set_variable_pt      set_handler;[m
[31m-    ngx_http_get_variable_pt      get_handler;[m
[31m-    uintptr_t                     data;[m
[31m-    ngx_uint_t                    flags;[m
[31m-    ngx_uint_t                    index;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_variable_t *ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name,[m
[31m-    ngx_uint_t flags);[m
[31m-ngx_int_t ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name);[m
[31m-ngx_http_variable_value_t *ngx_http_get_indexed_variable(ngx_http_request_t *r,[m
[31m-    ngx_uint_t index);[m
[31m-ngx_http_variable_value_t *ngx_http_get_flushed_variable(ngx_http_request_t *r,[m
[31m-    ngx_uint_t index);[m
[31m-[m
[31m-ngx_http_variable_value_t *ngx_http_get_variable(ngx_http_request_t *r,[m
[31m-    ngx_str_t *name, ngx_uint_t key);[m
[31m-[m
[31m-ngx_int_t ngx_http_variable_unknown_header(ngx_http_variable_value_t *v,[m
[31m-    ngx_str_t *var, ngx_list_part_t *part, size_t prefix);[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                    capture;[m
[31m-    ngx_int_t                     index;[m
[31m-} ngx_http_regex_variable_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_regex_t                  *regex;[m
[31m-    ngx_uint_t                    ncaptures;[m
[31m-    ngx_http_regex_variable_t    *variables;[m
[31m-    ngx_uint_t                    nvariables;[m
[31m-    ngx_str_t                     name;[m
[31m-} ngx_http_regex_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_regex_t             *regex;[m
[31m-    void                         *value;[m
[31m-} ngx_http_map_regex_t;[m
[31m-[m
[31m-[m
[31m-ngx_http_regex_t *ngx_http_regex_compile(ngx_conf_t *cf,[m
[31m-    ngx_regex_compile_t *rc);[m
[31m-ngx_int_t ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re,[m
[31m-    ngx_str_t *s);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_hash_combined_t           hash;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_map_regex_t         *regex;[m
[31m-    ngx_uint_t                    nregex;[m
[31m-#endif[m
[31m-} ngx_http_map_t;[m
[31m-[m
[31m-[m
[31m-void *ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map,[m
[31m-    ngx_str_t *match);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_variables_add_core_vars(ngx_conf_t *cf);[m
[31m-ngx_int_t ngx_http_variables_init_vars(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-extern ngx_http_variable_value_t  ngx_http_variable_null_value;[m
[31m-extern ngx_http_variable_value_t  ngx_http_variable_true_value;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_VARIABLES_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_write_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_write_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex 0036231..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/ngx_http_write_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,327 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_write_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_write_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_write_filter_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL,                                  /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_write_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_write_filter_module_ctx,     /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    off_t                      size, sent, nsent, limit;[m
[31m-    ngx_uint_t                 last, flush, sync;[m
[31m-    ngx_msec_t                 delay;[m
[31m-    ngx_chain_t               *cl, *ln, **ll, *chain;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    flush = 0;[m
[31m-    sync = 0;[m
[31m-    last = 0;[m
[31m-    ll = &r->out;[m
[31m-[m
[31m-    /* find the size, the flush point and the last link of the saved chain */[m
[31m-[m
[31m-    for (cl = r->out; cl; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "write old buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "zero size buf in writer "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          cl->buf->temporary,[m
[31m-                          cl->buf->recycled,[m
[31m-                          cl->buf->in_file,[m
[31m-                          cl->buf->start,[m
[31m-                          cl->buf->pos,[m
[31m-                          cl->buf->last,[m
[31m-                          cl->buf->file,[m
[31m-                          cl->buf->file_pos,[m
[31m-                          cl->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush || cl->buf->recycled) {[m
[31m-            flush = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->sync) {[m
[31m-            sync = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* add the new chain to the existent one */[m
[31m-[m
[31m-    for (ln = in; ln; ln = ln->next) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = ln->buf;[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "write new buf t:%d f:%d %p, pos %p, size: %z "[m
[31m-                       "file: %O, size: %O",[m
[31m-                       cl->buf->temporary, cl->buf->in_file,[m
[31m-                       cl->buf->start, cl->buf->pos,[m
[31m-                       cl->buf->last - cl->buf->pos,[m
[31m-                       cl->buf->file_pos,[m
[31m-                       cl->buf->file_last - cl->buf->file_pos);[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "zero size buf in writer "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          cl->buf->temporary,[m
[31m-                          cl->buf->recycled,[m
[31m-                          cl->buf->in_file,[m
[31m-                          cl->buf->start,[m
[31m-                          cl->buf->pos,[m
[31m-                          cl->buf->last,[m
[31m-                          cl->buf->file,[m
[31m-                          cl->buf->file_pos,[m
[31m-                          cl->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        size += ngx_buf_size(cl->buf);[m
[31m-[m
[31m-        if (cl->buf->flush || cl->buf->recycled) {[m
[31m-            flush = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->sync) {[m
[31m-            sync = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_buf) {[m
[31m-            last = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *ll = NULL;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http write filter: l:%ui f:%ui s:%O", last, flush, size);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    /*[m
[31m-     * avoid the output if there are no last buf, no flush point,[m
[31m-     * there are the incoming bufs and the size of all bufs[m
[31m-     * is smaller than "postpone_output" directive[m
[31m-     */[m
[31m-[m
[31m-    if (!last && !flush && in && size < (off_t) clcf->postpone_output) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->delayed) {[m
[31m-        c->buffered |= NGX_HTTP_WRITE_BUFFERED;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0[m
[31m-        && !(c->buffered & NGX_LOWLEVEL_BUFFERED)[m
[31m-        && !(last && c->need_last_buf))[m
[31m-    {[m
[31m-        if (last || flush || sync) {[m
[31m-            for (cl = r->out; cl; /* void */) {[m
[31m-                ln = cl;[m
[31m-                cl = cl->next;[m
[31m-                ngx_free_chain(r->pool, ln);[m
[31m-            }[m
[31m-[m
[31m-            r->out = NULL;[m
[31m-            c->buffered &= ~NGX_HTTP_WRITE_BUFFERED;[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "the http output chain is empty");[m
[31m-[m
[31m-        ngx_debug_point();[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->limit_rate) {[m
[31m-        if (r->limit_rate_after == 0) {[m
[31m-            r->limit_rate_after = clcf->limit_rate_after;[m
[31m-        }[m
[31m-[m
[31m-        limit = (off_t) r->limit_rate * (ngx_time() - r->start_sec + 1)[m
[31m-                - (c->sent - r->limit_rate_after);[m
[31m-[m
[31m-        if (limit <= 0) {[m
[31m-            c->write->delayed = 1;[m
[31m-            delay = (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1);[m
[31m-            ngx_add_timer(c->write, delay);[m
[31m-[m
[31m-            c->buffered |= NGX_HTTP_WRITE_BUFFERED;[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (clcf->sendfile_max_chunk[m
[31m-            && (off_t) clcf->sendfile_max_chunk < limit)[m
[31m-        {[m
[31m-            limit = clcf->sendfile_max_chunk;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        limit = clcf->sendfile_max_chunk;[m
[31m-    }[m
[31m-[m
[31m-    sent = c->sent;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http write filter limit %O", limit);[m
[31m-[m
[31m-    chain = c->send_chain(c, r->out, limit);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http write filter %p", chain);[m
[31m-[m
[31m-    if (chain == NGX_CHAIN_ERROR) {[m
[31m-        c->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->limit_rate) {[m
[31m-[m
[31m-        nsent = c->sent;[m
[31m-[m
[31m-        if (r->limit_rate_after) {[m
[31m-[m
[31m-            sent -= r->limit_rate_after;[m
[31m-            if (sent < 0) {[m
[31m-                sent = 0;[m
[31m-            }[m
[31m-[m
[31m-            nsent -= r->limit_rate_after;[m
[31m-            if (nsent < 0) {[m
[31m-                nsent = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        delay = (ngx_msec_t) ((nsent - sent) * 1000 / r->limit_rate);[m
[31m-[m
[31m-        if (delay > 0) {[m
[31m-            limit = 0;[m
[31m-            c->write->delayed = 1;[m
[31m-            ngx_add_timer(c->write, delay);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (limit[m
[31m-        && c->write->ready[m
[31m-        && c->sent - sent >= limit - (off_t) (2 * ngx_pagesize))[m
[31m-    {[m
[31m-        c->write->delayed = 1;[m
[31m-        ngx_add_timer(c->write, 1);[m
[31m-    }[m
[31m-[m
[31m-    for (cl = r->out; cl && cl != chain; /* void */) {[m
[31m-        ln = cl;[m
[31m-        cl = cl->next;[m
[31m-        ngx_free_chain(r->pool, ln);[m
[31m-    }[m
[31m-[m
[31m-    r->out = chain;[m
[31m-[m
[31m-    if (chain) {[m
[31m-        c->buffered |= NGX_HTTP_WRITE_BUFFERED;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    c->buffered &= ~NGX_HTTP_WRITE_BUFFERED;[m
[31m-[m
[31m-    if ((c->buffered & NGX_LOWLEVEL_BUFFERED) && r->postponed == NULL) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_write_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_top_body_filter = ngx_http_write_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2.c[m
[1mdeleted file mode 100644[m
[1mindex 278c9ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2.c[m
[1m+++ /dev/null[m
[36m@@ -1,4349 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_v2_module.h>[m
[31m-[m
[31m-[m
[31m-/* errors */[m
[31m-#define NGX_HTTP_V2_NO_ERROR                     0x0[m
[31m-#define NGX_HTTP_V2_PROTOCOL_ERROR               0x1[m
[31m-#define NGX_HTTP_V2_INTERNAL_ERROR               0x2[m
[31m-#define NGX_HTTP_V2_FLOW_CTRL_ERROR              0x3[m
[31m-#define NGX_HTTP_V2_SETTINGS_TIMEOUT             0x4[m
[31m-#define NGX_HTTP_V2_STREAM_CLOSED                0x5[m
[31m-#define NGX_HTTP_V2_SIZE_ERROR                   0x6[m
[31m-#define NGX_HTTP_V2_REFUSED_STREAM               0x7[m
[31m-#define NGX_HTTP_V2_CANCEL                       0x8[m
[31m-#define NGX_HTTP_V2_COMP_ERROR                   0x9[m
[31m-#define NGX_HTTP_V2_CONNECT_ERROR                0xa[m
[31m-#define NGX_HTTP_V2_ENHANCE_YOUR_CALM            0xb[m
[31m-#define NGX_HTTP_V2_INADEQUATE_SECURITY          0xc[m
[31m-#define NGX_HTTP_V2_HTTP_1_1_REQUIRED            0xd[m
[31m-[m
[31m-/* frame sizes */[m
[31m-#define NGX_HTTP_V2_RST_STREAM_SIZE              4[m
[31m-#define NGX_HTTP_V2_PRIORITY_SIZE                5[m
[31m-#define NGX_HTTP_V2_PING_SIZE                    8[m
[31m-#define NGX_HTTP_V2_GOAWAY_SIZE                  8[m
[31m-#define NGX_HTTP_V2_WINDOW_UPDATE_SIZE           4[m
[31m-[m
[31m-#define NGX_HTTP_V2_STREAM_ID_SIZE               4[m
[31m-[m
[31m-#define NGX_HTTP_V2_SETTINGS_PARAM_SIZE          6[m
[31m-[m
[31m-/* settings fields */[m
[31m-#define NGX_HTTP_V2_HEADER_TABLE_SIZE_SETTING    0x1[m
[31m-#define NGX_HTTP_V2_MAX_STREAMS_SETTING          0x3[m
[31m-#define NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING     0x4[m
[31m-#define NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING       0x5[m
[31m-[m
[31m-#define NGX_HTTP_V2_FRAME_BUFFER_SIZE            24[m
[31m-[m
[31m-#define NGX_HTTP_V2_DEFAULT_FRAME_SIZE           (1 << 14)[m
[31m-[m
[31m-#define NGX_HTTP_V2_MAX_WINDOW                   ((1U << 31) - 1)[m
[31m-#define NGX_HTTP_V2_DEFAULT_WINDOW               65535[m
[31m-[m
[31m-#define NGX_HTTP_V2_INITIAL_WINDOW               0[m
[31m-[m
[31m-#define NGX_HTTP_V2_ROOT                         (void *) -1[m
[31m-[m
[31m-[m
[31m-static void ngx_http_v2_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_http_v2_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c);[m
[31m-[m
[31m-static u_char *ngx_http_v2_state_proxy_protocol(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_head(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_data(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_header_block(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_field_len(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_field_huff(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_field_raw(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_field_skip(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_header_complete(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_handle_continuation(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end, ngx_http_v2_handler_pt handler);[m
[31m-static u_char *ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_rst_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_push_promise(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_ping(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_goaway(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_continuation(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_complete(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_skip_padded(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_skip(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-static u_char *ngx_http_v2_state_save(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end, ngx_http_v2_handler_pt handler);[m
[31m-static u_char *ngx_http_v2_state_headers_save(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end, ngx_http_v2_handler_pt handler);[m
[31m-static u_char *ngx_http_v2_connection_error(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t err);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_parse_int(ngx_http_v2_connection_t *h2c,[m
[31m-    u_char **pos, u_char *end, ngx_uint_t prefix);[m
[31m-[m
[31m-static ngx_http_v2_stream_t *ngx_http_v2_create_stream([m
[31m-    ngx_http_v2_connection_t *h2c);[m
[31m-static ngx_http_v2_node_t *ngx_http_v2_get_node_by_id([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_uint_t sid, ngx_uint_t alloc);[m
[31m-static ngx_http_v2_node_t *ngx_http_v2_get_closed_node([m
[31m-    ngx_http_v2_connection_t *h2c);[m
[31m-#define ngx_http_v2_index_size(h2scf)  (h2scf->streams_index_mask + 1)[m
[31m-#define ngx_http_v2_index(h2scf, sid)  ((sid >> 1) & h2scf->streams_index_mask)[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_send_settings(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t ack);[m
[31m-static ngx_int_t ngx_http_v2_settings_frame_handler([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);[m
[31m-static ngx_int_t ngx_http_v2_send_window_update(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t sid, size_t window);[m
[31m-static ngx_int_t ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t sid, ngx_uint_t status);[m
[31m-[m
[31m-static ngx_http_v2_out_frame_t *ngx_http_v2_get_frame([m
[31m-    ngx_http_v2_connection_t *h2c, size_t length, ngx_uint_t type,[m
[31m-    u_char flags, ngx_uint_t sid);[m
[31m-static ngx_int_t ngx_http_v2_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_validate_header(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_pseudo_header(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_parse_path(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_parse_method(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_parse_scheme(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_parse_authority(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_construct_request_line(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_v2_cookie(ngx_http_request_t *r,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-static ngx_int_t ngx_http_v2_construct_cookie_header(ngx_http_request_t *r);[m
[31m-static void ngx_http_v2_run_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_v2_process_request_body(ngx_http_request_t *r,[m
[31m-    u_char *pos, size_t size, ngx_uint_t last);[m
[31m-static ngx_int_t ngx_http_v2_filter_request_body(ngx_http_request_t *r);[m
[31m-static void ngx_http_v2_read_client_request_body_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream, ngx_uint_t status);[m
[31m-static void ngx_http_v2_close_stream_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_v2_handle_connection_handler(ngx_event_t *rev);[m
[31m-static void ngx_http_v2_idle_handler(ngx_event_t *rev);[m
[31m-static void ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t status);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_adjust_windows(ngx_http_v2_connection_t *h2c,[m
[31m-    ssize_t delta);[m
[31m-static void ngx_http_v2_set_dependency(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_node_t *node, ngx_uint_t depend, ngx_uint_t exclusive);[m
[31m-static void ngx_http_v2_node_children_update(ngx_http_v2_node_t *node);[m
[31m-[m
[31m-static void ngx_http_v2_pool_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_handler_pt ngx_http_v2_frame_states[] = {[m
[31m-    ngx_http_v2_state_data,[m
[31m-    ngx_http_v2_state_headers,[m
[31m-    ngx_http_v2_state_priority,[m
[31m-    ngx_http_v2_state_rst_stream,[m
[31m-    ngx_http_v2_state_settings,[m
[31m-    ngx_http_v2_state_push_promise,[m
[31m-    ngx_http_v2_state_ping,[m
[31m-    ngx_http_v2_state_goaway,[m
[31m-    ngx_http_v2_state_window_update,[m
[31m-    ngx_http_v2_state_continuation[m
[31m-};[m
[31m-[m
[31m-#define NGX_HTTP_V2_FRAME_STATES                                              \[m
[31m-    (sizeof(ngx_http_v2_frame_states) / sizeof(ngx_http_v2_handler_pt))[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_v2_init(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_pool_cleanup_t        *cln;[m
[31m-    ngx_http_connection_t     *hc;[m
[31m-    ngx_http_v2_srv_conf_t    *h2scf;[m
[31m-    ngx_http_v2_main_conf_t   *h2mcf;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "init http2 connection");[m
[31m-[m
[31m-    c->log->action = "processing HTTP/2 connection";[m
[31m-[m
[31m-    h2mcf = ngx_http_get_module_main_conf(hc->conf_ctx, ngx_http_v2_module);[m
[31m-[m
[31m-    if (h2mcf->recv_buffer == NULL) {[m
[31m-        h2mcf->recv_buffer = ngx_palloc(ngx_cycle->pool,[m
[31m-                                        h2mcf->recv_buffer_size);[m
[31m-        if (h2mcf->recv_buffer == NULL) {[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    h2c = ngx_pcalloc(c->pool, sizeof(ngx_http_v2_connection_t));[m
[31m-    if (h2c == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    h2c->connection = c;[m
[31m-    h2c->http_connection = hc;[m
[31m-[m
[31m-    h2c->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;[m
[31m-    h2c->recv_window = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-[m
[31m-    h2c->init_window = NGX_HTTP_V2_DEFAULT_WINDOW;[m
[31m-[m
[31m-    h2c->frame_size = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v2_module);[m
[31m-[m
[31m-    h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log);[m
[31m-    if (h2c->pool == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(c->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_v2_pool_cleanup;[m
[31m-    cln->data = h2c;[m
[31m-[m
[31m-    h2c->streams_index = ngx_pcalloc(c->pool, ngx_http_v2_index_size(h2scf)[m
[31m-                                              * sizeof(ngx_http_v2_node_t *));[m
[31m-    if (h2c->streams_index == NULL) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_send_settings(h2c, 0) == NGX_ERROR) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_send_window_update(h2c, 0, NGX_HTTP_V2_MAX_WINDOW[m
[31m-                                               - NGX_HTTP_V2_DEFAULT_WINDOW)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.handler = hc->proxy_protocol ? ngx_http_v2_state_proxy_protocol[m
[31m-                                            : ngx_http_v2_state_preface;[m
[31m-[m
[31m-    ngx_queue_init(&h2c->waiting);[m
[31m-    ngx_queue_init(&h2c->posted);[m
[31m-    ngx_queue_init(&h2c->dependencies);[m
[31m-    ngx_queue_init(&h2c->closed);[m
[31m-[m
[31m-    c->data = h2c;[m
[31m-[m
[31m-    rev->handler = ngx_http_v2_read_handler;[m
[31m-    c->write->handler = ngx_http_v2_write_handler;[m
[31m-[m
[31m-    ngx_http_v2_read_handler(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                    *p, *end;[m
[31m-    size_t                     available;[m
[31m-    ssize_t                    n;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_main_conf_t   *h2mcf;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    h2c = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 read handler");[m
[31m-[m
[31m-    h2c->blocked = 1;[m
[31m-[m
[31m-    h2mcf = ngx_http_get_module_main_conf(h2c->http_connection->conf_ctx,[m
[31m-                                          ngx_http_v2_module);[m
[31m-[m
[31m-    available = h2mcf->recv_buffer_size - 2 * NGX_HTTP_V2_STATE_BUFFER_SIZE;[m
[31m-[m
[31m-    do {[m
[31m-        p = h2mcf->recv_buffer;[m
[31m-[m
[31m-        ngx_memcpy(p, h2c->state.buffer, NGX_HTTP_V2_STATE_BUFFER_SIZE);[m
[31m-        end = p + h2c->state.buffer_used;[m
[31m-[m
[31m-        n = c->recv(c, end, available);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0 && (h2c->state.incomplete || h2c->processing)) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "client prematurely closed connection");[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0 || n == NGX_ERROR) {[m
[31m-            c->error = 1;[m
[31m-            ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        end += n;[m
[31m-[m
[31m-        h2c->state.buffer_used = 0;[m
[31m-        h2c->state.incomplete = 0;[m
[31m-[m
[31m-        do {[m
[31m-            p = h2c->state.handler(h2c, p, end);[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } while (p != end);[m
[31m-[m
[31m-    } while (rev->ready);[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->last_out && ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    h2c->blocked = 0;[m
[31m-[m
[31m-    if (h2c->processing) {[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_handle_connection(h2c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_queue_t               *q;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    h2c = c->data;[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http2 write event timed out");[m
[31m-        c->error = 1;[m
[31m-        ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 write handler");[m
[31m-[m
[31m-    h2c->blocked = 1;[m
[31m-[m
[31m-    rc = ngx_http_v2_send_output_queue(h2c);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    while (!ngx_queue_empty(&h2c->posted)) {[m
[31m-        q = ngx_queue_head(&h2c->posted);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);[m
[31m-[m
[31m-        stream->handled = 0;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "run http2 stream %ui", stream->node->id);[m
[31m-[m
[31m-        wev = stream->request->connection->write;[m
[31m-[m
[31m-        wev->active = 0;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        wev->handler(wev);[m
[31m-    }[m
[31m-[m
[31m-    h2c->blocked = 0;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_handle_connection(h2c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_send_output_queue(ngx_http_v2_connection_t *h2c)[m
[31m-{[m
[31m-    int                        tcp_nodelay;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_out_frame_t   *out, *frame, *fn;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    c = h2c->connection;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = NULL;[m
[31m-    out = NULL;[m
[31m-[m
[31m-    for (frame = h2c->last_out; frame; frame = fn) {[m
[31m-        frame->last->next = cl;[m
[31m-        cl = frame->first;[m
[31m-[m
[31m-        fn = frame->next;[m
[31m-        frame->next = out;[m
[31m-        out = frame;[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http2 frame out: %p sid:%ui bl:%d len:%uz",[m
[31m-                       out, out->stream ? out->stream->node->id : 0,[m
[31m-                       out->blocked, out->length);[m
[31m-    }[m
[31m-[m
[31m-    cl = c->send_chain(c, cl, 0);[m
[31m-[m
[31m-    if (cl == NGX_CHAIN_ERROR) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx,[m
[31m-                                        ngx_http_core_module);[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {[m
[31m-        if (ngx_tcp_push(c->fd) == -1) {[m
[31m-            ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;[m
[31m-        tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;[m
[31m-[m
[31m-    } else {[m
[31m-        tcp_nodelay = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (tcp_nodelay[m
[31m-        && clcf->tcp_nodelay[m
[31m-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-            == -1)[m
[31m-        {[m
[31m-#if (NGX_SOLARIS)[m
[31m-            /* Solaris returns EINVAL if a socket has been shut down */[m
[31m-            c->log_error = NGX_ERROR_IGNORE_EINVAL;[m
[31m-#endif[m
[31m-[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-[m
[31m-            c->log_error = NGX_ERROR_INFO;[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-    if (cl) {[m
[31m-        ngx_add_timer(wev, clcf->send_timeout);[m
[31m-[m
[31m-    } else {[m
[31m-        if (wev->timer_set) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( /* void */ ; out; out = fn) {[m
[31m-        fn = out->next;[m
[31m-[m
[31m-        if (out->handler(h2c, out) != NGX_OK) {[m
[31m-            out->blocked = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "http2 frame sent: %p sid:%ui bl:%d len:%uz",[m
[31m-                       out, out->stream ? out->stream->node->id : 0,[m
[31m-                       out->blocked, out->length);[m
[31m-    }[m
[31m-[m
[31m-    frame = NULL;[m
[31m-[m
[31m-    for ( /* void */ ; out; out = fn) {[m
[31m-        fn = out->next;[m
[31m-        out->next = frame;[m
[31m-        frame = out;[m
[31m-    }[m
[31m-[m
[31m-    h2c->last_out = frame;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (!h2c->blocked) {[m
[31m-        ngx_post_event(wev, &ngx_posted_events);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    if (h2c->last_out || h2c->processing) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = h2c->connection;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->buffered) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-    if (h2c->state.incomplete) {[m
[31m-        ngx_add_timer(c->read, h2scf->recv_timeout);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_terminate || ngx_exiting) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(h2c->pool);[m
[31m-[m
[31m-    h2c->pool = NULL;[m
[31m-    h2c->free_frames = NULL;[m
[31m-    h2c->free_fake_connections = NULL;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (c->ssl) {[m
[31m-        ngx_ssl_free_buffer(c);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-    c->idle = 1;[m
[31m-    ngx_reusable_connection(c, 1);[m
[31m-[m
[31m-    c->write->handler = ngx_http_empty_handler;[m
[31m-    c->read->handler = ngx_http_v2_idle_handler;[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(c->read, h2scf->idle_timeout);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_proxy_protocol(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_log_t  *log;[m
[31m-[m
[31m-    log = h2c->connection->log;[m
[31m-    log->action = "reading PROXY protocol";[m
[31m-[m
[31m-    pos = ngx_proxy_protocol_read(h2c->connection, pos, end);[m
[31m-[m
[31m-    log->action = "processing HTTP/2 connection";[m
[31m-[m
[31m-    if (pos == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_preface(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    static const u_char preface[] = "PRI * HTTP/2.0\r\n";[m
[31m-[m
[31m-    if ((size_t) (end - pos) < sizeof(preface) - 1) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_preface);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "invalid http2 connection preface \"%*s\"",[m
[31m-                       sizeof(preface) - 1, pos);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_preface_end(h2c, pos + sizeof(preface) - 1, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    static const u_char preface[] = "\r\nSM\r\n\r\n";[m
[31m-[m
[31m-    if ((size_t) (end - pos) < sizeof(preface) - 1) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_preface_end);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "invalid http2 connection preface \"%*s\"",[m
[31m-                       sizeof(preface) - 1, pos);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 preface verified");[m
[31m-[m
[31m-    return ngx_http_v2_state_head(h2c, pos + sizeof(preface) - 1, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_head(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)[m
[31m-{[m
[31m-    uint32_t    head;[m
[31m-    ngx_uint_t  type;[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_FRAME_HEADER_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_head);[m
[31m-    }[m
[31m-[m
[31m-    head = ngx_http_v2_parse_uint32(pos);[m
[31m-[m
[31m-    h2c->state.length = ngx_http_v2_parse_length(head);[m
[31m-    h2c->state.flags = pos[4];[m
[31m-[m
[31m-    h2c->state.sid = ngx_http_v2_parse_sid(&pos[5]);[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_FRAME_HEADER_SIZE;[m
[31m-[m
[31m-    type = ngx_http_v2_parse_type(head);[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "process http2 frame type:%ui f:%Xd l:%uz sid:%ui",[m
[31m-                   type, h2c->state.flags, h2c->state.length, h2c->state.sid);[m
[31m-[m
[31m-    if (type >= NGX_HTTP_V2_FRAME_STATES) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "http2 frame with unknown type %ui", type);[m
[31m-        return ngx_http_v2_state_skip(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_frame_states[type](h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_data(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)[m
[31m-{[m
[31m-    ngx_http_v2_node_t    *node;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_PADDED_FLAG) {[m
[31m-[m
[31m-        if (h2c->state.length == 0) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent padded DATA frame "[m
[31m-                          "with incorrect length: 0");[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        if (end - pos == 0) {[m
[31m-            return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                          ngx_http_v2_state_data);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.padding = *pos++;[m
[31m-        h2c->state.length--;[m
[31m-[m
[31m-        if (h2c->state.padding > h2c->state.length) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent padded DATA frame "[m
[31m-                          "with incorrect length: %uz, padding: %uz",[m
[31m-                          h2c->state.length, h2c->state.padding);[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.length -= h2c->state.padding;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 DATA frame");[m
[31m-[m
[31m-    if (h2c->state.length > h2c->recv_window) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client violated connection flow control: "[m
[31m-                      "received DATA frame length %uz, available window %uz",[m
[31m-                      h2c->state.length, h2c->recv_window);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_FLOW_CTRL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->recv_window -= h2c->state.length;[m
[31m-[m
[31m-    if (h2c->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4) {[m
[31m-[m
[31m-        if (ngx_http_v2_send_window_update(h2c, 0, NGX_HTTP_V2_MAX_WINDOW[m
[31m-                                                   - h2c->recv_window)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->recv_window = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-    }[m
[31m-[m
[31m-    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);[m
[31m-[m
[31m-    if (node == NULL || node->stream == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "unknown http2 stream");[m
[31m-[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    stream = node->stream;[m
[31m-[m
[31m-    if (h2c->state.length > stream->recv_window) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client violated flow control for stream %ui: "[m
[31m-                      "received DATA frame length %uz, available window %uz",[m
[31m-                      node->id, h2c->state.length, stream->recv_window);[m
[31m-[m
[31m-        if (ngx_http_v2_terminate_stream(h2c, stream,[m
[31m-                                         NGX_HTTP_V2_FLOW_CTRL_ERROR)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    stream->recv_window -= h2c->state.length;[m
[31m-[m
[31m-    if (stream->no_flow_control[m
[31m-        && stream->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4)[m
[31m-    {[m
[31m-        if (ngx_http_v2_send_window_update(h2c, node->id,[m
[31m-                                           NGX_HTTP_V2_MAX_WINDOW[m
[31m-                                           - stream->recv_window)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        stream->recv_window = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-    }[m
[31m-[m
[31m-    if (stream->in_closed) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent DATA frame for half-closed stream %ui",[m
[31m-                      node->id);[m
[31m-[m
[31m-        if (ngx_http_v2_terminate_stream(h2c, stream,[m
[31m-                                         NGX_HTTP_V2_STREAM_CLOSED)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG;[m
[31m-[m
[31m-    h2c->state.stream = stream;[m
[31m-[m
[31m-    return ngx_http_v2_state_read_data(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                 size;[m
[31m-    ngx_int_t              rc;[m
[31m-    ngx_uint_t             last;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    stream = h2c->state.stream;[m
[31m-[m
[31m-    if (stream == NULL) {[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (stream->skip_data) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "skipping http2 DATA frame");[m
[31m-[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size >= h2c->state.length) {[m
[31m-        size = h2c->state.length;[m
[31m-        last = stream->in_closed;[m
[31m-[m
[31m-    } else {[m
[31m-        last = 0;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_v2_process_request_body(stream->request, pos, size, last);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        stream->skip_data = 1;[m
[31m-        ngx_http_finalize_request(stream->request, rc);[m
[31m-    }[m
[31m-[m
[31m-    pos += size;[m
[31m-    h2c->state.length -= size;[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_read_data);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.padding) {[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                   size;[m
[31m-    ngx_uint_t               padded, priority, depend, dependency, excl, weight;[m
[31m-    ngx_uint_t               status;[m
[31m-    ngx_http_v2_node_t      *node;[m
[31m-    ngx_http_v2_stream_t    *stream;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    padded = h2c->state.flags & NGX_HTTP_V2_PADDED_FLAG;[m
[31m-    priority = h2c->state.flags & NGX_HTTP_V2_PRIORITY_FLAG;[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    if (padded) {[m
[31m-        size++;[m
[31m-    }[m
[31m-[m
[31m-    if (priority) {[m
[31m-        size += sizeof(uint32_t) + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length < size) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent HEADERS frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length == size) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent HEADERS frame with empty header block");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (end - pos) < size) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_headers);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.length -= size;[m
[31m-[m
[31m-    if (padded) {[m
[31m-        h2c->state.padding = *pos++;[m
[31m-[m
[31m-        if (h2c->state.padding > h2c->state.length) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent padded HEADERS frame "[m
[31m-                          "with incorrect length: %uz, padding: %uz",[m
[31m-                          h2c->state.length, h2c->state.padding);[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.length -= h2c->state.padding;[m
[31m-    }[m
[31m-[m
[31m-    depend = 0;[m
[31m-    excl = 0;[m
[31m-    weight = 16;[m
[31m-[m
[31m-    if (priority) {[m
[31m-        dependency = ngx_http_v2_parse_uint32(pos);[m
[31m-[m
[31m-        depend = dependency & 0x7fffffff;[m
[31m-        excl = dependency >> 31;[m
[31m-        weight = pos[4] + 1;[m
[31m-[m
[31m-        pos += sizeof(uint32_t) + 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 HEADERS frame sid:%ui on %ui excl:%ui weight:%ui",[m
[31m-                   h2c->state.sid, depend, excl, weight);[m
[31m-[m
[31m-    if (h2c->state.sid % 2 == 0 || h2c->state.sid <= h2c->last_sid) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent HEADERS frame with incorrect identifier "[m
[31m-                      "%ui, the last was %ui", h2c->state.sid, h2c->last_sid);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->last_sid = h2c->state.sid;[m
[31m-[m
[31m-    h2c->state.pool = ngx_create_pool(1024, h2c->connection->log);[m
[31m-    if (h2c->state.pool == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (depend == h2c->state.sid) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent HEADERS frame for stream %ui "[m
[31m-                      "with incorrect dependency", h2c->state.sid);[m
[31m-[m
[31m-        status = NGX_HTTP_V2_PROTOCOL_ERROR;[m
[31m-        goto rst_stream;[m
[31m-    }[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    h2c->state.header_limit = h2scf->max_header_size;[m
[31m-[m
[31m-    if (h2c->processing >= h2scf->concurrent_streams) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "concurrent streams exceeded %ui", h2c->processing);[m
[31m-[m
[31m-        status = NGX_HTTP_V2_REFUSED_STREAM;[m
[31m-        goto rst_stream;[m
[31m-    }[m
[31m-[m
[31m-    if (!h2c->settings_ack && !(h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent stream with data "[m
[31m-                      "before settings were acknowledged");[m
[31m-[m
[31m-        status = NGX_HTTP_V2_REFUSED_STREAM;[m
[31m-        goto rst_stream;[m
[31m-    }[m
[31m-[m
[31m-    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 1);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (node->parent) {[m
[31m-        ngx_queue_remove(&node->reuse);[m
[31m-        h2c->closed_nodes--;[m
[31m-    }[m
[31m-[m
[31m-    stream = ngx_http_v2_create_stream(h2c);[m
[31m-    if (stream == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.stream = stream;[m
[31m-[m
[31m-    stream->pool = h2c->state.pool;[m
[31m-    h2c->state.keep_pool = 1;[m
[31m-[m
[31m-    stream->request->request_length = h2c->state.length;[m
[31m-[m
[31m-    stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG;[m
[31m-    stream->node = node;[m
[31m-[m
[31m-    node->stream = stream;[m
[31m-[m
[31m-    if (priority || node->parent == NULL) {[m
[31m-        node->weight = weight;[m
[31m-        ngx_http_v2_set_dependency(h2c, node, depend, excl);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_header_block(h2c, pos, end);[m
[31m-[m
[31m-rst_stream:[m
[31m-[m
[31m-    if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid, status) != NGX_OK) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_header_block(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_header_block(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    ngx_int_t   value;[m
[31m-    ngx_uint_t  indexed, size_update, prefix;[m
[31m-[m
[31m-    if (end - pos < 1) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                              ngx_http_v2_state_header_block);[m
[31m-    }[m
[31m-[m
[31m-    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)[m
[31m-        && h2c->state.length < NGX_HTTP_V2_INT_OCTETS)[m
[31m-    {[m
[31m-        return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                               ngx_http_v2_state_header_block);[m
[31m-    }[m
[31m-[m
[31m-    size_update = 0;[m
[31m-    indexed = 0;[m
[31m-[m
[31m-    ch = *pos;[m
[31m-[m
[31m-    if (ch >= (1 << 7)) {[m
[31m-        /* indexed header field */[m
[31m-        indexed = 1;[m
[31m-        prefix = ngx_http_v2_prefix(7);[m
[31m-[m
[31m-    } else if (ch >= (1 << 6)) {[m
[31m-        /* literal header field with incremental indexing */[m
[31m-        h2c->state.index = 1;[m
[31m-        prefix = ngx_http_v2_prefix(6);[m
[31m-[m
[31m-    } else if (ch >= (1 << 5)) {[m
[31m-        /* dynamic table size update */[m
[31m-        size_update = 1;[m
[31m-        prefix = ngx_http_v2_prefix(5);[m
[31m-[m
[31m-    } else if (ch >= (1 << 4)) {[m
[31m-        /* literal header field never indexed */[m
[31m-        prefix = ngx_http_v2_prefix(4);[m
[31m-[m
[31m-    } else {[m
[31m-        /* literal header field without indexing */[m
[31m-        prefix = ngx_http_v2_prefix(4);[m
[31m-    }[m
[31m-[m
[31m-    value = ngx_http_v2_parse_int(h2c, &pos, end, prefix);[m
[31m-[m
[31m-    if (value < 0) {[m
[31m-        if (value == NGX_AGAIN) {[m
[31m-            return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                               ngx_http_v2_state_header_block);[m
[31m-        }[m
[31m-[m
[31m-        if (value == NGX_DECLINED) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent header block with too long %s value",[m
[31m-                          size_update ? "size update" : "header index");[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header block with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (indexed) {[m
[31m-        if (ngx_http_v2_get_indexed_header(h2c, value, 0) != NGX_OK) {[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_process_header(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (size_update) {[m
[31m-        if (ngx_http_v2_table_size(h2c, value) != NGX_OK) {[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (value == 0) {[m
[31m-        h2c->state.parse_name = 1;[m
[31m-[m
[31m-    } else if (ngx_http_v2_get_indexed_header(h2c, value, 1) != NGX_OK) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.parse_value = 1;[m
[31m-[m
[31m-    return ngx_http_v2_state_field_len(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_field_len(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                   alloc;[m
[31m-    ngx_int_t                len;[m
[31m-    ngx_uint_t               huff;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)[m
[31m-        && h2c->state.length < NGX_HTTP_V2_INT_OCTETS)[m
[31m-    {[m
[31m-        return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                               ngx_http_v2_state_field_len);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length < 1) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header block with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < 1) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                              ngx_http_v2_state_field_len);[m
[31m-    }[m
[31m-[m
[31m-    huff = *pos >> 7;[m
[31m-    len = ngx_http_v2_parse_int(h2c, &pos, end, ngx_http_v2_prefix(7));[m
[31m-[m
[31m-    if (len < 0) {[m
[31m-        if (len == NGX_AGAIN) {[m
[31m-            return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                                  ngx_http_v2_state_field_len);[m
[31m-        }[m
[31m-[m
[31m-        if (len == NGX_DECLINED) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                        "client sent header field with too long length value");[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header block with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 hpack %s string length: %i",[m
[31m-                   huff ? "encoded" : "raw", len);[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    if ((size_t) len > h2scf->max_field_size) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client exceeded http2_max_field_size limit");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.field_rest = len;[m
[31m-[m
[31m-    if (h2c->state.stream == NULL && !h2c->state.index) {[m
[31m-        return ngx_http_v2_state_field_skip(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    alloc = (huff ? len * 8 / 5 : len) + 1;[m
[31m-[m
[31m-    h2c->state.field_start = ngx_pnalloc(h2c->state.pool, alloc);[m
[31m-    if (h2c->state.field_start == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.field_end = h2c->state.field_start;[m
[31m-[m
[31m-    if (huff) {[m
[31m-        return ngx_http_v2_state_field_huff(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_field_raw(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_field_huff(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size > h2c->state.field_rest) {[m
[31m-        size = h2c->state.field_rest;[m
[31m-    }[m
[31m-[m
[31m-    if (size > h2c->state.length) {[m
[31m-        size = h2c->state.length;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.length -= size;[m
[31m-    h2c->state.field_rest -= size;[m
[31m-[m
[31m-    if (ngx_http_v2_huff_decode(&h2c->state.field_state, pos, size,[m
[31m-                                &h2c->state.field_end,[m
[31m-                                h2c->state.field_rest == 0,[m
[31m-                                h2c->connection->log)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent invalid encoded header field");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    pos += size;[m
[31m-[m
[31m-    if (h2c->state.field_rest == 0) {[m
[31m-        *h2c->state.field_end = '\0';[m
[31m-        return ngx_http_v2_state_process_header(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                              ngx_http_v2_state_field_huff);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header field with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                           ngx_http_v2_state_field_huff);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_field_raw(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size > h2c->state.field_rest) {[m
[31m-        size = h2c->state.field_rest;[m
[31m-    }[m
[31m-[m
[31m-    if (size > h2c->state.length) {[m
[31m-        size = h2c->state.length;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.length -= size;[m
[31m-    h2c->state.field_rest -= size;[m
[31m-[m
[31m-    h2c->state.field_end = ngx_cpymem(h2c->state.field_end, pos, size);[m
[31m-[m
[31m-    pos += size;[m
[31m-[m
[31m-    if (h2c->state.field_rest == 0) {[m
[31m-        *h2c->state.field_end = '\0';[m
[31m-        return ngx_http_v2_state_process_header(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end,[m
[31m-                                              ngx_http_v2_state_field_raw);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header field with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                           ngx_http_v2_state_field_raw);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_field_skip(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size > h2c->state.field_rest) {[m
[31m-        size = h2c->state.field_rest;[m
[31m-    }[m
[31m-[m
[31m-    if (size > h2c->state.length) {[m
[31m-        size = h2c->state.length;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.length -= size;[m
[31m-    h2c->state.field_rest -= size;[m
[31m-[m
[31m-    pos += size;[m
[31m-[m
[31m-    if (h2c->state.field_rest == 0) {[m
[31m-        return ngx_http_v2_state_process_header(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_field_skip);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent header field with incorrect length");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                           ngx_http_v2_state_field_skip);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_request_t         *r;[m
[31m-    ngx_http_v2_header_t       *header;[m
[31m-    ngx_http_core_srv_conf_t   *cscf;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    static ngx_str_t cookie = ngx_string("cookie");[m
[31m-[m
[31m-    header = &h2c->state.header;[m
[31m-[m
[31m-    if (h2c->state.parse_name) {[m
[31m-        h2c->state.parse_name = 0;[m
[31m-[m
[31m-        header->name.len = h2c->state.field_end - h2c->state.field_start;[m
[31m-        header->name.data = h2c->state.field_start;[m
[31m-[m
[31m-        return ngx_http_v2_state_field_len(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.parse_value) {[m
[31m-        h2c->state.parse_value = 0;[m
[31m-[m
[31m-        header->value.len = h2c->state.field_end - h2c->state.field_start;[m
[31m-        header->value.data = h2c->state.field_start;[m
[31m-    }[m
[31m-[m
[31m-    len = header->name.len + header->value.len;[m
[31m-[m
[31m-    if (len > h2c->state.header_limit) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client exceeded http2_max_header_size limit");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.header_limit -= len;[m
[31m-[m
[31m-    if (h2c->state.index) {[m
[31m-        if (ngx_http_v2_add_header(h2c, header) != NGX_OK) {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.index = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.stream == NULL) {[m
[31m-        return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    r = h2c->state.stream->request;[m
[31m-[m
[31m-    /* TODO Optimization: validate headers while parsing. */[m
[31m-    if (ngx_http_v2_validate_header(r, header) != NGX_OK) {[m
[31m-        if (ngx_http_v2_terminate_stream(h2c, h2c->state.stream,[m
[31m-                                         NGX_HTTP_V2_PROTOCOL_ERROR)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (header->name.data[0] == ':') {[m
[31m-        rc = ngx_http_v2_pseudo_header(r, header);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ABORT) {[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            if (ngx_http_v2_terminate_stream(h2c, h2c->state.stream,[m
[31m-                                             NGX_HTTP_V2_PROTOCOL_ERROR)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (r->invalid_header) {[m
[31m-        cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (cscf->ignore_invalid_headers) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid header: \"%V\"", &header->name);[m
[31m-[m
[31m-            return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (header->name.len == cookie.len[m
[31m-        && ngx_memcmp(header->name.data, cookie.data, cookie.len) == 0)[m
[31m-    {[m
[31m-        if (ngx_http_v2_cookie(r, header) != NGX_OK) {[m
[31m-            return ngx_http_v2_connection_error(h2c,[m
[31m-                                                NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h->key.len = header->name.len;[m
[31m-    h->key.data = header->name.data;[m
[31m-[m
[31m-    /* TODO Optimization: precalculate hash and handler for indexed headers. */[m
[31m-    h->hash = ngx_hash_key(h->key.data, h->key.len);[m
[31m-[m
[31m-    h->value.len = header->value.len;[m
[31m-    h->value.data = header->value.data;[m
[31m-[m
[31m-    h->lowcase_key = h->key.data;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                       h->lowcase_key, h->key.len);[m
[31m-[m
[31m-    if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http2 http header: \"%V: %V\"", &h->key, &h->value);[m
[31m-[m
[31m-    return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    h2c->state.stream = NULL;[m
[31m-[m
[31m-    return ngx_http_v2_state_header_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_header_complete(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    if (h2c->state.length) {[m
[31m-        h2c->state.handler = ngx_http_v2_state_header_block;[m
[31m-        return pos;[m
[31m-    }[m
[31m-[m
[31m-    if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)) {[m
[31m-        return ngx_http_v2_handle_continuation(h2c, pos, end,[m
[31m-                                             ngx_http_v2_state_header_complete);[m
[31m-    }[m
[31m-[m
[31m-    stream = h2c->state.stream;[m
[31m-[m
[31m-    if (stream) {[m
[31m-        ngx_http_v2_run_request(stream->request);[m
[31m-    }[m
[31m-[m
[31m-    if (!h2c->state.keep_pool) {[m
[31m-        ngx_destroy_pool(h2c->state.pool);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.pool = NULL;[m
[31m-    h2c->state.keep_pool = 0;[m
[31m-[m
[31m-    if (h2c->state.padding) {[m
[31m-        return ngx_http_v2_state_skip_padded(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_handle_continuation(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end, ngx_http_v2_handler_pt handler)[m
[31m-{[m
[31m-    u_char    *p;[m
[31m-    size_t     len, skip;[m
[31m-    uint32_t   head;[m
[31m-[m
[31m-    len = h2c->state.length;[m
[31m-[m
[31m-    if (h2c->state.padding && (size_t) (end - pos) > len) {[m
[31m-        skip = ngx_min(h2c->state.padding, (end - pos) - len);[m
[31m-[m
[31m-        h2c->state.padding -= skip;[m
[31m-[m
[31m-        p = pos;[m
[31m-        pos += skip;[m
[31m-        ngx_memmove(pos, p, len);[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (end - pos) < len + NGX_HTTP_V2_FRAME_HEADER_SIZE) {[m
[31m-        return ngx_http_v2_state_headers_save(h2c, pos, end, handler);[m
[31m-    }[m
[31m-[m
[31m-    p = pos + len;[m
[31m-[m
[31m-    head = ngx_http_v2_parse_uint32(p);[m
[31m-[m
[31m-    if (ngx_http_v2_parse_type(head) != NGX_HTTP_V2_CONTINUATION_FRAME) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-             "client sent inappropriate frame while CONTINUATION was expected");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.flags |= p[4];[m
[31m-[m
[31m-    if (h2c->state.sid != ngx_http_v2_parse_sid(&p[5])) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                    "client sent CONTINUATION frame with incorrect identifier");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    p = pos;[m
[31m-    pos += NGX_HTTP_V2_FRAME_HEADER_SIZE;[m
[31m-[m
[31m-    ngx_memcpy(pos, p, len);[m
[31m-[m
[31m-    len = ngx_http_v2_parse_length(head);[m
[31m-[m
[31m-    h2c->state.length += len;[m
[31m-[m
[31m-    if (h2c->state.stream) {[m
[31m-        h2c->state.stream->request->request_length += len;[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.handler = handler;[m
[31m-    return pos;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_uint_t           depend, dependency, excl, weight;[m
[31m-    ngx_http_v2_node_t  *node;[m
[31m-[m
[31m-    if (h2c->state.length != NGX_HTTP_V2_PRIORITY_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent PRIORITY frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_PRIORITY_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_priority);[m
[31m-    }[m
[31m-[m
[31m-    dependency = ngx_http_v2_parse_uint32(pos);[m
[31m-[m
[31m-    depend = dependency & 0x7fffffff;[m
[31m-    excl = dependency >> 31;[m
[31m-    weight = pos[4] + 1;[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_PRIORITY_SIZE;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 PRIORITY frame sid:%ui on %ui excl:%ui weight:%ui",[m
[31m-                   h2c->state.sid, depend, excl, weight);[m
[31m-[m
[31m-    if (h2c->state.sid == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent PRIORITY frame with incorrect identifier");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (depend == h2c->state.sid) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent PRIORITY frame for stream %ui "[m
[31m-                      "with incorrect dependency", h2c->state.sid);[m
[31m-[m
[31m-        node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);[m
[31m-[m
[31m-        if (node && node->stream) {[m
[31m-            if (ngx_http_v2_terminate_stream(h2c, node->stream,[m
[31m-                                             NGX_HTTP_V2_PROTOCOL_ERROR)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid,[m
[31m-                                            NGX_HTTP_V2_PROTOCOL_ERROR)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 1);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    node->weight = weight;[m
[31m-[m
[31m-    if (node->stream == NULL) {[m
[31m-        if (node->parent == NULL) {[m
[31m-            h2c->closed_nodes++;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_queue_remove(&node->reuse);[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_insert_tail(&h2c->closed, &node->reuse);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_set_dependency(h2c, node, depend, excl);[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_rst_stream(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_uint_t             status;[m
[31m-    ngx_event_t           *ev;[m
[31m-    ngx_connection_t      *fc;[m
[31m-    ngx_http_v2_node_t    *node;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    if (h2c->state.length != NGX_HTTP_V2_RST_STREAM_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent RST_STREAM frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_RST_STREAM_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_rst_stream);[m
[31m-    }[m
[31m-[m
[31m-    status = ngx_http_v2_parse_uint32(pos);[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_RST_STREAM_SIZE;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 RST_STREAM frame, sid:%ui status:%ui",[m
[31m-                   h2c->state.sid, status);[m
[31m-[m
[31m-    if (h2c->state.sid == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent RST_STREAM frame with incorrect identifier");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);[m
[31m-[m
[31m-    if (node == NULL || node->stream == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                        "unknown http2 stream");[m
[31m-[m
[31m-        return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    stream = node->stream;[m
[31m-[m
[31m-    stream->in_closed = 1;[m
[31m-    stream->out_closed = 1;[m
[31m-[m
[31m-    fc = stream->request->connection;[m
[31m-    fc->error = 1;[m
[31m-[m
[31m-    switch (status) {[m
[31m-[m
[31m-    case NGX_HTTP_V2_CANCEL:[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                      "client canceled stream %ui", h2c->state.sid);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_V2_INTERNAL_ERROR:[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                      "client terminated stream %ui due to internal error",[m
[31m-                      h2c->state.sid);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                      "client terminated stream %ui with status %ui",[m
[31m-                      h2c->state.sid, status);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ev = fc->read;[m
[31m-    ev->handler(ev);[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    if (h2c->state.flags == NGX_HTTP_V2_ACK_FLAG) {[m
[31m-[m
[31m-        if (h2c->state.length != 0) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client sent SETTINGS frame with the ACK flag "[m
[31m-                          "and nonzero length");[m
[31m-[m
[31m-            return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        h2c->settings_ack = 1;[m
[31m-[m
[31m-        return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.length % NGX_HTTP_V2_SETTINGS_PARAM_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent SETTINGS frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_send_settings(h2c, 1);[m
[31m-[m
[31m-    return ngx_http_v2_state_settings_params(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_uint_t  id, value;[m
[31m-[m
[31m-    while (h2c->state.length) {[m
[31m-        if (end - pos < NGX_HTTP_V2_SETTINGS_PARAM_SIZE) {[m
[31m-            return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                          ngx_http_v2_state_settings_params);[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.length -= NGX_HTTP_V2_SETTINGS_PARAM_SIZE;[m
[31m-[m
[31m-        id = ngx_http_v2_parse_uint16(pos);[m
[31m-        value = ngx_http_v2_parse_uint32(&pos[2]);[m
[31m-[m
[31m-        switch (id) {[m
[31m-[m
[31m-        case NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING:[m
[31m-[m
[31m-            if (value > NGX_HTTP_V2_MAX_WINDOW) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                              "client sent SETTINGS frame with incorrect "[m
[31m-                              "INITIAL_WINDOW_SIZE value %ui", value);[m
[31m-[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                  NGX_HTTP_V2_FLOW_CTRL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_v2_adjust_windows(h2c, value - h2c->init_window)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            h2c->init_window = value;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING:[m
[31m-            if (value > NGX_HTTP_V2_MAX_FRAME_SIZE[m
[31m-                || value < NGX_HTTP_V2_DEFAULT_FRAME_SIZE)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                              "client sent SETTINGS frame with incorrect "[m
[31m-                              "MAX_FRAME_SIZE value %ui", value);[m
[31m-[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            h2c->frame_size = value;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        pos += NGX_HTTP_V2_SETTINGS_PARAM_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_push_promise(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                  "client sent PUSH_PROMISE frame");[m
[31m-[m
[31m-    return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_ping(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    if (h2c->state.length != NGX_HTTP_V2_PING_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent PING frame with incorrect length %uz",[m
[31m-                      h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_PING_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_ping);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 PING frame, flags: %ud", h2c->state.flags);[m
[31m-[m
[31m-    if (h2c->state.flags & NGX_HTTP_V2_ACK_FLAG) {[m
[31m-        return ngx_http_v2_state_skip(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_PING_SIZE,[m
[31m-                                  NGX_HTTP_V2_PING_FRAME,[m
[31m-                                  NGX_HTTP_V2_ACK_FLAG, 0);[m
[31m-    if (frame == NULL) {[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    buf->last = ngx_cpymem(buf->last, pos, NGX_HTTP_V2_PING_SIZE);[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos + NGX_HTTP_V2_PING_SIZE, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_goaway(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_uint_t  last_sid, error;[m
[31m-#endif[m
[31m-[m
[31m-    if (h2c->state.length < NGX_HTTP_V2_GOAWAY_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent GOAWAY frame "[m
[31m-                      "with incorrect length %uz", h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_GOAWAY_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_goaway);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    h2c->state.length -= NGX_HTTP_V2_GOAWAY_SIZE;[m
[31m-[m
[31m-    last_sid = ngx_http_v2_parse_sid(pos);[m
[31m-    error = ngx_http_v2_parse_uint32(&pos[4]);[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_GOAWAY_SIZE;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 GOAWAY frame: last sid %ui, error %ui",[m
[31m-                   last_sid, error);[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_http_v2_state_skip(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    size_t                 window;[m
[31m-    ngx_event_t           *wev;[m
[31m-    ngx_queue_t           *q;[m
[31m-    ngx_http_v2_node_t    *node;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    if (h2c->state.length != NGX_HTTP_V2_WINDOW_UPDATE_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent WINDOW_UPDATE frame "[m
[31m-                      "with incorrect length %uz", h2c->state.length);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    if (end - pos < NGX_HTTP_V2_WINDOW_UPDATE_SIZE) {[m
[31m-        return ngx_http_v2_state_save(h2c, pos, end,[m
[31m-                                      ngx_http_v2_state_window_update);[m
[31m-    }[m
[31m-[m
[31m-    window = ngx_http_v2_parse_window(pos);[m
[31m-[m
[31m-    pos += NGX_HTTP_V2_WINDOW_UPDATE_SIZE;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 WINDOW_UPDATE frame sid:%ui window:%uz",[m
[31m-                   h2c->state.sid, window);[m
[31m-[m
[31m-    if (h2c->state.sid) {[m
[31m-        node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0);[m
[31m-[m
[31m-        if (node == NULL || node->stream == NULL) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "unknown http2 stream");[m
[31m-[m
[31m-            return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-        }[m
[31m-[m
[31m-        stream = node->stream;[m
[31m-[m
[31m-        if (window > (size_t) (NGX_HTTP_V2_MAX_WINDOW - stream->send_window)) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                          "client violated flow control for stream %ui: "[m
[31m-                          "received WINDOW_UPDATE frame "[m
[31m-                          "with window increment %uz "[m
[31m-                          "not allowed for window %z",[m
[31m-                          h2c->state.sid, window, stream->send_window);[m
[31m-[m
[31m-            if (ngx_http_v2_terminate_stream(h2c, stream,[m
[31m-                                             NGX_HTTP_V2_FLOW_CTRL_ERROR)[m
[31m-                == NGX_ERROR)[m
[31m-            {[m
[31m-                return ngx_http_v2_connection_error(h2c,[m
[31m-                                                    NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-        }[m
[31m-[m
[31m-        stream->send_window += window;[m
[31m-[m
[31m-        if (stream->exhausted) {[m
[31m-            stream->exhausted = 0;[m
[31m-[m
[31m-            wev = stream->request->connection->write;[m
[31m-[m
[31m-            wev->active = 0;[m
[31m-            wev->ready = 1;[m
[31m-[m
[31m-            if (!wev->delayed) {[m
[31m-                wev->handler(wev);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-    }[m
[31m-[m
[31m-    if (window > NGX_HTTP_V2_MAX_WINDOW - h2c->send_window) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client violated connection flow control: "[m
[31m-                      "received WINDOW_UPDATE frame "[m
[31m-                      "with window increment %uz "[m
[31m-                      "not allowed for window %uz",[m
[31m-                      window, h2c->send_window);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_FLOW_CTRL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->send_window += window;[m
[31m-[m
[31m-    while (!ngx_queue_empty(&h2c->waiting)) {[m
[31m-        q = ngx_queue_head(&h2c->waiting);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);[m
[31m-[m
[31m-        stream->handled = 0;[m
[31m-[m
[31m-        wev = stream->request->connection->write;[m
[31m-[m
[31m-        wev->active = 0;[m
[31m-        wev->ready = 1;[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            wev->handler(wev);[m
[31m-[m
[31m-            if (h2c->send_window == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_continuation(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                  "client sent unexpected CONTINUATION frame");[m
[31m-[m
[31m-    return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_complete(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 frame complete pos:%p end:%p", pos, end);[m
[31m-[m
[31m-    if (pos > end) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,[m
[31m-                      "receive buffer overrun");[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    h2c->state.stream = NULL;[m
[31m-    h2c->state.handler = ngx_http_v2_state_head;[m
[31m-[m
[31m-    return pos;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_skip_padded(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    h2c->state.length += h2c->state.padding;[m
[31m-    h2c->state.padding = 0;[m
[31m-[m
[31m-    return ngx_http_v2_state_skip(h2c, pos, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_skip(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size < h2c->state.length) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                       "http2 frame skip %uz of %uz", size, h2c->state.length);[m
[31m-[m
[31m-        h2c->state.length -= size;[m
[31m-        return ngx_http_v2_state_save(h2c, end, end, ngx_http_v2_state_skip);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 frame skip %uz", h2c->state.length);[m
[31m-[m
[31m-    return ngx_http_v2_state_complete(h2c, pos + h2c->state.length, end);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_save(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end,[m
[31m-    ngx_http_v2_handler_pt handler)[m
[31m-{[m
[31m-    size_t  size;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 frame state save pos:%p end:%p handler:%p",[m
[31m-                   pos, end, handler);[m
[31m-[m
[31m-    size = end - pos;[m
[31m-[m
[31m-    if (size > NGX_HTTP_V2_STATE_BUFFER_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,[m
[31m-                      "state buffer overflow: %uz bytes required", size);[m
[31m-[m
[31m-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(h2c->state.buffer, pos, NGX_HTTP_V2_STATE_BUFFER_SIZE);[m
[31m-[m
[31m-    h2c->state.buffer_used = size;[m
[31m-    h2c->state.handler = handler;[m
[31m-    h2c->state.incomplete = 1;[m
[31m-[m
[31m-    return end;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_state_headers_save(ngx_http_v2_connection_t *h2c, u_char *pos,[m
[31m-    u_char *end, ngx_http_v2_handler_pt handler)[m
[31m-{[m
[31m-    ngx_event_t               *rev;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (h2c->state.stream) {[m
[31m-        r = h2c->state.stream->request;[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if (!rev->timer_set) {[m
[31m-            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-            ngx_add_timer(rev, cscf->client_header_timeout);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_v2_state_save(h2c, pos, end, handler);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_connection_error(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t err)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 state connection error");[m
[31m-[m
[31m-    if (err == NGX_HTTP_V2_INTERNAL_ERROR) {[m
[31m-        ngx_debug_point();[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_finalize_connection(h2c, err);[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_int(ngx_http_v2_connection_t *h2c, u_char **pos, u_char *end,[m
[31m-    ngx_uint_t prefix)[m
[31m-{[m
[31m-    u_char      *start, *p;[m
[31m-    ngx_uint_t   value, octet, shift;[m
[31m-[m
[31m-    start = *pos;[m
[31m-    p = start;[m
[31m-[m
[31m-    value = *p++ & prefix;[m
[31m-[m
[31m-    if (value != prefix) {[m
[31m-        if (h2c->state.length == 0) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.length--;[m
[31m-[m
[31m-        *pos = p;[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    if (end - start > NGX_HTTP_V2_INT_OCTETS) {[m
[31m-        end = start + NGX_HTTP_V2_INT_OCTETS;[m
[31m-    }[m
[31m-[m
[31m-    for (shift = 0; p != end; shift += 7) {[m
[31m-        octet = *p++;[m
[31m-[m
[31m-        value += (octet & 0x7f) << shift;[m
[31m-[m
[31m-        if (octet < 128) {[m
[31m-            if ((size_t) (p - start) > h2c->state.length) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h2c->state.length -= p - start;[m
[31m-[m
[31m-            *pos = p;[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) (end - start) >= h2c->state.length) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (end == start + NGX_HTTP_V2_INT_OCTETS) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_send_settings(ngx_http_v2_connection_t *h2c, ngx_uint_t ack)[m
[31m-{[m
[31m-    size_t                    len;[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_chain_t              *cl;[m
[31m-    ngx_http_v2_srv_conf_t   *h2scf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 send SETTINGS frame ack:%ui", ack);[m
[31m-[m
[31m-    frame = ngx_palloc(h2c->pool, sizeof(ngx_http_v2_out_frame_t));[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(h2c->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = ack ? 0 : (sizeof(uint16_t) + sizeof(uint32_t)) * 3;[m
[31m-[m
[31m-    buf = ngx_create_temp_buf(h2c->pool, NGX_HTTP_V2_FRAME_HEADER_SIZE + len);[m
[31m-    if (buf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf->last_buf = 1;[m
[31m-[m
[31m-    cl->buf = buf;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    frame->first = cl;[m
[31m-    frame->last = cl;[m
[31m-    frame->handler = ngx_http_v2_settings_frame_handler;[m
[31m-    frame->stream = NULL;[m
[31m-#if (NGX_DEBUG)[m
[31m-    frame->length = len;[m
[31m-#endif[m
[31m-    frame->blocked = 0;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_len_and_type(buf->last, len,[m
[31m-                                               NGX_HTTP_V2_SETTINGS_FRAME);[m
[31m-[m
[31m-    *buf->last++ = ack ? NGX_HTTP_V2_ACK_FLAG : NGX_HTTP_V2_NO_FLAG;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_sid(buf->last, 0);[m
[31m-[m
[31m-    if (!ack) {[m
[31m-        h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                             ngx_http_v2_module);[m
[31m-[m
[31m-        buf->last = ngx_http_v2_write_uint16(buf->last,[m
[31m-                                             NGX_HTTP_V2_MAX_STREAMS_SETTING);[m
[31m-        buf->last = ngx_http_v2_write_uint32(buf->last,[m
[31m-                                             h2scf->concurrent_streams);[m
[31m-[m
[31m-        buf->last = ngx_http_v2_write_uint16(buf->last,[m
[31m-                                         NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING);[m
[31m-        buf->last = ngx_http_v2_write_uint32(buf->last,[m
[31m-                                             NGX_HTTP_V2_INITIAL_WINDOW);[m
[31m-[m
[31m-        buf->last = ngx_http_v2_write_uint16(buf->last,[m
[31m-                                           NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING);[m
[31m-        buf->last = ngx_http_v2_write_uint32(buf->last,[m
[31m-                                             NGX_HTTP_V2_MAX_FRAME_SIZE);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_settings_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_buf_t  *buf;[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    if (buf->pos != buf->last) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free_chain(h2c->pool, frame->first);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_send_window_update(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,[m
[31m-    size_t window)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 send WINDOW_UPDATE frame sid:%ui, window:%uz",[m
[31m-                   sid, window);[m
[31m-[m
[31m-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_WINDOW_UPDATE_SIZE,[m
[31m-                                  NGX_HTTP_V2_WINDOW_UPDATE_FRAME,[m
[31m-                                  NGX_HTTP_V2_NO_FLAG, sid);[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_uint32(buf->last, window);[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,[m
[31m-    ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 send RST_STREAM frame sid:%ui, status:%uz",[m
[31m-                   sid, status);[m
[31m-[m
[31m-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_RST_STREAM_SIZE,[m
[31m-                                  NGX_HTTP_V2_RST_STREAM_FRAME,[m
[31m-                                  NGX_HTTP_V2_NO_FLAG, sid);[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_uint32(buf->last, status);[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_send_goaway(ngx_http_v2_connection_t *h2c, ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 send GOAWAY frame, status:%uz", status);[m
[31m-[m
[31m-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_GOAWAY_SIZE,[m
[31m-                                  NGX_HTTP_V2_GOAWAY_FRAME,[m
[31m-                                  NGX_HTTP_V2_NO_FLAG, 0);[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_sid(buf->last, h2c->last_sid);[m
[31m-    buf->last = ngx_http_v2_write_uint32(buf->last, status);[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(h2c, frame);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_out_frame_t *[m
[31m-ngx_http_v2_get_frame(ngx_http_v2_connection_t *h2c, size_t length,[m
[31m-    ngx_uint_t type, u_char flags, ngx_uint_t sid)[m
[31m-{[m
[31m-    ngx_buf_t                *buf;[m
[31m-    ngx_pool_t               *pool;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    frame = h2c->free_frames;[m
[31m-[m
[31m-    if (frame) {[m
[31m-        h2c->free_frames = frame->next;[m
[31m-[m
[31m-        buf = frame->first->buf;[m
[31m-        buf->pos = buf->start;[m
[31m-[m
[31m-        frame->blocked = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        pool = h2c->pool ? h2c->pool : h2c->connection->pool;[m
[31m-[m
[31m-        frame = ngx_pcalloc(pool, sizeof(ngx_http_v2_out_frame_t));[m
[31m-        if (frame == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        frame->first = ngx_alloc_chain_link(pool);[m
[31m-        if (frame->first == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        buf = ngx_create_temp_buf(pool, NGX_HTTP_V2_FRAME_BUFFER_SIZE);[m
[31m-        if (buf == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        buf->last_buf = 1;[m
[31m-[m
[31m-        frame->first->buf = buf;[m
[31m-        frame->last = frame->first;[m
[31m-[m
[31m-        frame->handler = ngx_http_v2_frame_handler;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    if (length > NGX_HTTP_V2_FRAME_BUFFER_SIZE - NGX_HTTP_V2_FRAME_HEADER_SIZE)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,[m
[31m-                      "requested control frame is too large: %uz", length);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    frame->length = length;[m
[31m-#endif[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_len_and_type(buf->pos, length, type);[m
[31m-[m
[31m-    *buf->last++ = flags;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_sid(buf->last, sid);[m
[31m-[m
[31m-    return frame;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_buf_t  *buf;[m
[31m-[m
[31m-    buf = frame->first->buf;[m
[31m-[m
[31m-    if (buf->pos != buf->last) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    frame->next = h2c->free_frames;[m
[31m-    h2c->free_frames = frame;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_stream_t *[m
[31m-ngx_http_v2_create_stream(ngx_http_v2_connection_t *h2c)[m
[31m-{[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_event_t               *rev, *wev;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_log_ctx_t        *ctx;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    fc = h2c->free_fake_connections;[m
[31m-[m
[31m-    if (fc) {[m
[31m-        h2c->free_fake_connections = fc->data;[m
[31m-[m
[31m-        rev = fc->read;[m
[31m-        wev = fc->write;[m
[31m-        log = fc->log;[m
[31m-        ctx = log->data;[m
[31m-[m
[31m-    } else {[m
[31m-        fc = ngx_palloc(h2c->pool, sizeof(ngx_connection_t));[m
[31m-        if (fc == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        rev = ngx_palloc(h2c->pool, sizeof(ngx_event_t));[m
[31m-        if (rev == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        wev = ngx_palloc(h2c->pool, sizeof(ngx_event_t));[m
[31m-        if (wev == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        log = ngx_palloc(h2c->pool, sizeof(ngx_log_t));[m
[31m-        if (log == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ctx = ngx_palloc(h2c->pool, sizeof(ngx_http_log_ctx_t));[m
[31m-        if (ctx == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ctx->connection = fc;[m
[31m-        ctx->request = NULL;[m
[31m-        ctx->current_request = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(log, h2c->connection->log, sizeof(ngx_log_t));[m
[31m-[m
[31m-    log->data = ctx;[m
[31m-    log->action = "reading client request headers";[m
[31m-[m
[31m-    ngx_memzero(rev, sizeof(ngx_event_t));[m
[31m-[m
[31m-    rev->data = fc;[m
[31m-    rev->ready = 1;[m
[31m-    rev->handler = ngx_http_v2_close_stream_handler;[m
[31m-    rev->log = log;[m
[31m-[m
[31m-    ngx_memcpy(wev, rev, sizeof(ngx_event_t));[m
[31m-[m
[31m-    wev->write = 1;[m
[31m-[m
[31m-    ngx_memcpy(fc, h2c->connection, sizeof(ngx_connection_t));[m
[31m-[m
[31m-    fc->data = h2c->http_connection;[m
[31m-    fc->read = rev;[m
[31m-    fc->write = wev;[m
[31m-    fc->sent = 0;[m
[31m-    fc->log = log;[m
[31m-    fc->buffered = 0;[m
[31m-    fc->sndlowat = 1;[m
[31m-    fc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;[m
[31m-[m
[31m-    r = ngx_http_create_request(fc);[m
[31m-    if (r == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&r->http_protocol, "HTTP/2.0");[m
[31m-[m
[31m-    r->http_version = NGX_HTTP_VERSION_20;[m
[31m-    r->valid_location = 1;[m
[31m-[m
[31m-    fc->data = r;[m
[31m-    h2c->connection->requests++;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    r->header_in = ngx_create_temp_buf(r->pool,[m
[31m-                                       cscf->client_header_buffer_size);[m
[31m-    if (r->header_in == NULL) {[m
[31m-        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-[m
[31m-    stream = ngx_pcalloc(r->pool, sizeof(ngx_http_v2_stream_t));[m
[31m-    if (stream == NULL) {[m
[31m-        ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    r->stream = stream;[m
[31m-[m
[31m-    stream->request = r;[m
[31m-    stream->connection = h2c;[m
[31m-[m
[31m-    stream->send_window = h2c->init_window;[m
[31m-    stream->recv_window = NGX_HTTP_V2_INITIAL_WINDOW;[m
[31m-[m
[31m-    h2c->processing++;[m
[31m-[m
[31m-    return stream;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_node_t *[m
[31m-ngx_http_v2_get_node_by_id(ngx_http_v2_connection_t *h2c, ngx_uint_t sid,[m
[31m-    ngx_uint_t alloc)[m
[31m-{[m
[31m-    ngx_uint_t               index;[m
[31m-    ngx_http_v2_node_t      *node;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    index = ngx_http_v2_index(h2scf, sid);[m
[31m-[m
[31m-    for (node = h2c->streams_index[index]; node; node = node->index) {[m
[31m-[m
[31m-        if (node->id == sid) {[m
[31m-            return node;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!alloc) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->closed_nodes < 32) {[m
[31m-        node = ngx_pcalloc(h2c->connection->pool, sizeof(ngx_http_v2_node_t));[m
[31m-        if (node == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        node = ngx_http_v2_get_closed_node(h2c);[m
[31m-    }[m
[31m-[m
[31m-    node->id = sid;[m
[31m-[m
[31m-    ngx_queue_init(&node->children);[m
[31m-[m
[31m-    node->index = h2c->streams_index[index];[m
[31m-    h2c->streams_index[index] = node;[m
[31m-[m
[31m-    return node;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_node_t *[m
[31m-ngx_http_v2_get_closed_node(ngx_http_v2_connection_t *h2c)[m
[31m-{[m
[31m-    ngx_uint_t               weight;[m
[31m-    ngx_queue_t             *q, *children;[m
[31m-    ngx_http_v2_node_t      *node, **next, *n, *parent, *child;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    h2c->closed_nodes--;[m
[31m-[m
[31m-    q = ngx_queue_head(&h2c->closed);[m
[31m-[m
[31m-    ngx_queue_remove(q);[m
[31m-[m
[31m-    node = ngx_queue_data(q, ngx_http_v2_node_t, reuse);[m
[31m-[m
[31m-    next = &h2c->streams_index[ngx_http_v2_index(h2scf, node->id)];[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = *next;[m
[31m-[m
[31m-        if (n == node) {[m
[31m-            *next = n->index;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        next = &n->index;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(&node->queue);[m
[31m-[m
[31m-    weight = 0;[m
[31m-[m
[31m-    for (q = ngx_queue_head(&node->children);[m
[31m-         q != ngx_queue_sentinel(&node->children);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);[m
[31m-        weight += child->weight;[m
[31m-    }[m
[31m-[m
[31m-    parent = node->parent;[m
[31m-[m
[31m-    for (q = ngx_queue_head(&node->children);[m
[31m-         q != ngx_queue_sentinel(&node->children);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);[m
[31m-        child->parent = parent;[m
[31m-        child->weight = node->weight * child->weight / weight;[m
[31m-[m
[31m-        if (child->weight == 0) {[m
[31m-            child->weight = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (parent == NGX_HTTP_V2_ROOT) {[m
[31m-        node->rank = 0;[m
[31m-        node->rel_weight = 1.0;[m
[31m-[m
[31m-        children = &h2c->dependencies;[m
[31m-[m
[31m-    } else {[m
[31m-        node->rank = parent->rank;[m
[31m-        node->rel_weight = parent->rel_weight;[m
[31m-[m
[31m-        children = &parent->children;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_node_children_update(node);[m
[31m-    ngx_queue_add(children, &node->children);[m
[31m-[m
[31m-    ngx_memzero(node, sizeof(ngx_http_v2_node_t));[m
[31m-[m
[31m-    return node;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_validate_header(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    u_char                     ch;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (header->name.len == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->invalid_header = 0;[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    for (i = (header->name.data[0] == ':'); i != header->name.len; i++) {[m
[31m-        ch = header->name.data[i];[m
[31m-[m
[31m-        if ((ch >= 'a' && ch <= 'z')[m
[31m-            || (ch == '-')[m
[31m-            || (ch >= '0' && ch <= '9')[m
[31m-            || (ch == '_' && cscf->underscores_in_headers))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (ch) {[m
[31m-        case '\0':[m
[31m-        case LF:[m
[31m-        case CR:[m
[31m-        case ':':[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid header name: \"%V\"",[m
[31m-                          &header->name);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ch >= 'A' && ch <= 'Z') {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid header name: \"%V\"",[m
[31m-                          &header->name);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->invalid_header = 1;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i != header->value.len; i++) {[m
[31m-        ch = header->value.data[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-        case '\0':[m
[31m-        case LF:[m
[31m-        case CR:[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent header \"%V\" with "[m
[31m-                          "invalid value: \"%V\"",[m
[31m-                          &header->name, &header->value);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_pseudo_header(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    header->name.len--;[m
[31m-    header->name.data++;[m
[31m-[m
[31m-    switch (header->name.len) {[m
[31m-    case 4:[m
[31m-        if (ngx_memcmp(header->name.data, "path", sizeof("path") - 1)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            return ngx_http_v2_parse_path(r, header);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case 6:[m
[31m-        if (ngx_memcmp(header->name.data, "method", sizeof("method") - 1)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            return ngx_http_v2_parse_method(r, header);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_memcmp(header->name.data, "scheme", sizeof("scheme") - 1)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            return ngx_http_v2_parse_scheme(r, header);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case 9:[m
[31m-        if (ngx_memcmp(header->name.data, "authority", sizeof("authority") - 1)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            return ngx_http_v2_parse_authority(r, header);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                  "client sent unknown pseudo header \"%V\"",[m
[31m-                  &header->name);[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_path(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    if (r->unparsed_uri.len) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent duplicate :path header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (header->value.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent empty :path header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->uri_start = header->value.data;[m
[31m-    r->uri_end = header->value.data + header->value.len;[m
[31m-[m
[31m-    if (ngx_http_parse_uri(r) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent invalid :path header: \"%V\"",[m
[31m-                      &header->value);[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_process_request_uri(r) != NGX_OK) {[m
[31m-        /*[m
[31m-         * request has been finalized already[m
[31m-         * in ngx_http_process_request_uri()[m
[31m-         */[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_method(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    size_t         k, len;[m
[31m-    ngx_uint_t     n;[m
[31m-    const u_char  *p, *m;[m
[31m-[m
[31m-    /*[m
[31m-     * This array takes less than 256 sequential bytes,[m
[31m-     * and if typical CPU cache line size is 64 bytes,[m
[31m-     * it is prefetched for 4 load operations.[m
[31m-     */[m
[31m-    static const struct {[m
[31m-        u_char            len;[m
[31m-        const u_char      method[11];[m
[31m-        uint32_t          value;[m
[31m-    } tests[] = {[m
[31m-        { 3, "GET",       NGX_HTTP_GET },[m
[31m-        { 4, "POST",      NGX_HTTP_POST },[m
[31m-        { 4, "HEAD",      NGX_HTTP_HEAD },[m
[31m-        { 7, "OPTIONS",   NGX_HTTP_OPTIONS },[m
[31m-        { 8, "PROPFIND",  NGX_HTTP_PROPFIND },[m
[31m-        { 3, "PUT",       NGX_HTTP_PUT },[m
[31m-        { 5, "MKCOL",     NGX_HTTP_MKCOL },[m
[31m-        { 6, "DELETE",    NGX_HTTP_DELETE },[m
[31m-        { 4, "COPY",      NGX_HTTP_COPY },[m
[31m-        { 4, "MOVE",      NGX_HTTP_MOVE },[m
[31m-        { 9, "PROPPATCH", NGX_HTTP_PROPPATCH },[m
[31m-        { 4, "LOCK",      NGX_HTTP_LOCK },[m
[31m-        { 6, "UNLOCK",    NGX_HTTP_UNLOCK },[m
[31m-        { 5, "PATCH",     NGX_HTTP_PATCH },[m
[31m-        { 5, "TRACE",     NGX_HTTP_TRACE }[m
[31m-    }, *test;[m
[31m-[m
[31m-    if (r->method_name.len) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent duplicate :method header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (header->value.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent empty :method header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->method_name.len = header->value.len;[m
[31m-    r->method_name.data = header->value.data;[m
[31m-[m
[31m-    len = r->method_name.len;[m
[31m-    n = sizeof(tests) / sizeof(tests[0]);[m
[31m-    test = tests;[m
[31m-[m
[31m-    do {[m
[31m-        if (len == test->len) {[m
[31m-            p = r->method_name.data;[m
[31m-            m = test->method;[m
[31m-            k = len;[m
[31m-[m
[31m-            do {[m
[31m-                if (*p++ != *m++) {[m
[31m-                    goto next;[m
[31m-                }[m
[31m-            } while (--k);[m
[31m-[m
[31m-            r->method = test->value;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    next:[m
[31m-        test++;[m
[31m-[m
[31m-    } while (--n);[m
[31m-[m
[31m-    p = r->method_name.data;[m
[31m-[m
[31m-    do {[m
[31m-        if ((*p < 'A' || *p > 'Z') && *p != '_') {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client sent invalid method: \"%V\"",[m
[31m-                          &r->method_name);[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-[m
[31m-    } while (--len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_scheme(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    if (r->schema_start) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent duplicate :schema header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (header->value.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client sent empty :schema header");[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->schema_start = header->value.data;[m
[31m-    r->schema_end = header->value.data + header->value.len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_parse_authority(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    static ngx_str_t host = ngx_string("host");[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = ngx_hash_key(host.data, host.len);[m
[31m-[m
[31m-    h->key.len = host.len;[m
[31m-    h->key.data = host.data;[m
[31m-[m
[31m-    h->value.len = header->value.len;[m
[31m-    h->value.data = header->value.data;[m
[31m-[m
[31m-    h->lowcase_key = host.data;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                       h->lowcase_key, h->key.len);[m
[31m-[m
[31m-    if (hh == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-        /*[m
[31m-         * request has been finalized already[m
[31m-         * in ngx_http_process_host()[m
[31m-         */[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_construct_request_line(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char  *p;[m
[31m-[m
[31m-    static const u_char ending[] = " HTTP/2.0";[m
[31m-[m
[31m-    if (r->method_name.len == 0[m
[31m-        || r->unparsed_uri.len == 0)[m
[31m-    {[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->request_line.len = r->method_name.len + 1[m
[31m-                          + r->unparsed_uri.len[m
[31m-                          + sizeof(ending) - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, r->request_line.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->request_line.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, r->method_name.data, r->method_name.len);[m
[31m-[m
[31m-    *p++ = ' ';[m
[31m-[m
[31m-    p = ngx_cpymem(p, r->unparsed_uri.data, r->unparsed_uri.len);[m
[31m-[m
[31m-    ngx_memcpy(p, ending, sizeof(ending));[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http2 http request line: \"%V\"", &r->request_line);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_cookie(ngx_http_request_t *r, ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    ngx_str_t    *val;[m
[31m-    ngx_array_t  *cookies;[m
[31m-[m
[31m-    cookies = r->stream->cookies;[m
[31m-[m
[31m-    if (cookies == NULL) {[m
[31m-        cookies = ngx_array_create(r->pool, 2, sizeof(ngx_str_t));[m
[31m-        if (cookies == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->stream->cookies = cookies;[m
[31m-    }[m
[31m-[m
[31m-    val = ngx_array_push(cookies);[m
[31m-    if (val == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    val->len = header->value.len;[m
[31m-    val->data = header->value.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_construct_cookie_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                     *buf, *p, *end;[m
[31m-    size_t                      len;[m
[31m-    ngx_str_t                  *vals;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_array_t                *cookies;[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_http_header_t          *hh;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    static ngx_str_t cookie = ngx_string("cookie");[m
[31m-[m
[31m-    cookies = r->stream->cookies;[m
[31m-[m
[31m-    if (cookies == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    vals = cookies->elts;[m
[31m-[m
[31m-    i = 0;[m
[31m-    len = 0;[m
[31m-[m
[31m-    do {[m
[31m-        len += vals[i].len + 2;[m
[31m-    } while (++i != cookies->nelts);[m
[31m-[m
[31m-    len -= 2;[m
[31m-[m
[31m-    buf = ngx_pnalloc(r->pool, len + 1);[m
[31m-    if (buf == NULL) {[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    p = buf;[m
[31m-    end = buf + len;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        p = ngx_cpymem(p, vals[i].data, vals[i].len);[m
[31m-[m
[31m-        if (p == end) {[m
[31m-            *p = '\0';[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        *p++ = ';'; *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = ngx_hash_key(cookie.data, cookie.len);[m
[31m-[m
[31m-    h->key.len = cookie.len;[m
[31m-    h->key.data = cookie.data;[m
[31m-[m
[31m-    h->value.len = len;[m
[31m-    h->value.data = buf;[m
[31m-[m
[31m-    h->lowcase_key = cookie.data;[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash,[m
[31m-                       h->lowcase_key, h->key.len);[m
[31m-[m
[31m-    if (hh == NULL) {[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (hh->handler(r, h, hh->offset) != NGX_OK) {[m
[31m-        /*[m
[31m-         * request has been finalized already[m
[31m-         * in ngx_http_process_multi_header_lines()[m
[31m-         */[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_run_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (ngx_http_v2_construct_request_line(r) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_construct_cookie_header(r) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;[m
[31m-[m
[31m-    if (ngx_http_process_request_header(r) != NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_in.content_length_n > 0 && r->stream->in_closed) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                      "client prematurely closed stream");[m
[31m-[m
[31m-        r->stream->skip_data = 1;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_in.chunked = (r->headers_in.content_length_n == -1);[m
[31m-[m
[31m-    ngx_http_process_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_read_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler)[m
[31m-{[m
[31m-    off_t                      len;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    stream = r->stream;[m
[31m-[m
[31m-    if (stream->skip_data) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        post_handler(r);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (rb == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     rb->bufs = NULL;[m
[31m-     *     rb->buf = NULL;[m
[31m-     *     rb->received = 0;[m
[31m-     *     rb->free = NULL;[m
[31m-     *     rb->busy = NULL;[m
[31m-     */[m
[31m-[m
[31m-    rb->rest = 1;[m
[31m-    rb->post_handler = post_handler;[m
[31m-[m
[31m-    r->request_body = rb;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    len = r->headers_in.content_length_n;[m
[31m-[m
[31m-    if (r->request_body_no_buffering && !stream->in_closed) {[m
[31m-        r->request_body_in_file_only = 0;[m
[31m-[m
[31m-        if (len < 0 || len > (off_t) clcf->client_body_buffer_size) {[m
[31m-            len = clcf->client_body_buffer_size;[m
[31m-        }[m
[31m-[m
[31m-        if (len > NGX_HTTP_V2_MAX_WINDOW) {[m
[31m-            len = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len >= 0 && len <= (off_t) clcf->client_body_buffer_size[m
[31m-        && !r->request_body_in_file_only)[m
[31m-    {[m
[31m-        rb->buf = ngx_create_temp_buf(r->pool, (size_t) len);[m
[31m-[m
[31m-    } else {[m
[31m-        rb->buf = ngx_calloc_buf(r->pool);[m
[31m-[m
[31m-        if (rb->buf != NULL) {[m
[31m-            rb->buf->sync = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (rb->buf == NULL) {[m
[31m-        stream->skip_data = 1;[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (stream->in_closed) {[m
[31m-        r->request_body_no_buffering = 0;[m
[31m-        return ngx_http_v2_process_request_body(r, NULL, 0, 1);[m
[31m-    }[m
[31m-[m
[31m-    if (len) {[m
[31m-        if (r->request_body_no_buffering) {[m
[31m-            stream->recv_window = (size_t) len;[m
[31m-[m
[31m-        } else {[m
[31m-            stream->no_flow_control = 1;[m
[31m-            stream->recv_window = NGX_HTTP_V2_MAX_WINDOW;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_v2_send_window_update(stream->connection, stream->node->id,[m
[31m-                                           stream->recv_window)[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            stream->skip_data = 1;[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c = stream->connection;[m
[31m-[m
[31m-        if (!h2c->blocked) {[m
[31m-            if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {[m
[31m-                stream->skip_data = 1;[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(r->connection->read, clcf->client_body_timeout);[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_v2_read_client_request_body_handler;[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_process_request_body(ngx_http_request_t *r, u_char *pos,[m
[31m-    size_t size, ngx_uint_t last)[m
[31m-{[m
[31m-    ngx_buf_t                 *buf;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    fc = r->connection;[m
[31m-    buf = rb->buf;[m
[31m-[m
[31m-    if (size) {[m
[31m-        if (buf->sync) {[m
[31m-            buf->pos = buf->start = pos;[m
[31m-            buf->last = buf->end = pos + size;[m
[31m-[m
[31m-        } else {[m
[31m-            if (size > (size_t) (buf->end - buf->last)) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                                "client intended to send body data "[m
[31m-                                "larger than declared");[m
[31m-[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-            buf->last = ngx_cpymem(buf->last, pos, size);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        rb->rest = 0;[m
[31m-[m
[31m-        if (fc->read->timer_set) {[m
[31m-            ngx_del_timer(fc->read);[m
[31m-        }[m
[31m-[m
[31m-        if (r->request_body_no_buffering) {[m
[31m-            ngx_post_event(fc->read, &ngx_posted_events);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_v2_filter_request_body(r);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (buf->sync) {[m
[31m-            /* prevent reusing this buffer in the upstream module */[m
[31m-            rb->buf = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (r->headers_in.content_length_n == -1) {[m
[31m-            r->headers_in.content_length_n = rb->received;[m
[31m-        }[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-        rb->post_handler(r);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    ngx_add_timer(fc->read, clcf->client_body_timeout);[m
[31m-[m
[31m-    if (r->request_body_no_buffering) {[m
[31m-        ngx_post_event(fc->read, &ngx_posted_events);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (buf->sync) {[m
[31m-        return ngx_http_v2_filter_request_body(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_filter_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_buf_t                 *b, *buf;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-    buf = rb->buf;[m
[31m-[m
[31m-    if (buf->pos == buf->last && rb->rest) {[m
[31m-        cl = NULL;[m
[31m-        goto update;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(r->pool, &rb->free);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    if (buf->pos != buf->last) {[m
[31m-        r->request_length += buf->last - buf->pos;[m
[31m-        rb->received += buf->last - buf->pos;[m
[31m-[m
[31m-        if (r->headers_in.content_length_n != -1) {[m
[31m-            if (rb->received > r->headers_in.content_length_n) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                              "client intended to send body data "[m
[31m-                              "larger than declared");[m
[31m-[m
[31m-                return NGX_HTTP_BAD_REQUEST;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            if (clcf->client_max_body_size[m
[31m-                && rb->received > clcf->client_max_body_size)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "client intended to send too large chunked body: "[m
[31m-                              "%O bytes", rb->received);[m
[31m-[m
[31m-                return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->pos = buf->pos;[m
[31m-        b->last = buf->last;[m
[31m-        b->start = b->pos;[m
[31m-        b->end = b->last;[m
[31m-[m
[31m-        buf->pos = buf->last;[m
[31m-    }[m
[31m-[m
[31m-    if (!rb->rest) {[m
[31m-        if (r->headers_in.content_length_n != -1[m
[31m-            && r->headers_in.content_length_n != rb->received)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,[m
[31m-                          "client prematurely closed stream: "[m
[31m-                          "only %O out of %O bytes of request body received",[m
[31m-                          rb->received, r->headers_in.content_length_n);[m
[31m-[m
[31m-            return NGX_HTTP_BAD_REQUEST;[m
[31m-        }[m
[31m-[m
[31m-        b->last_buf = 1;[m
[31m-    }[m
[31m-[m
[31m-    b->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_request_body;[m
[31m-    b->flush = r->request_body_no_buffering;[m
[31m-[m
[31m-update:[m
[31m-[m
[31m-    rc = ngx_http_top_request_body_filter(r, cl);[m
[31m-[m
[31m-    ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &cl,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_v2_filter_request_body);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_read_client_request_body_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t  *fc;[m
[31m-[m
[31m-    fc = r->connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                   "http2 read client request body handler");[m
[31m-[m
[31m-    if (fc->read->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-[m
[31m-        fc->timedout = 1;[m
[31m-        r->stream->skip_data = 1;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (fc->error) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, 0,[m
[31m-                      "client prematurely closed stream");[m
[31m-[m
[31m-        r->stream->skip_data = 1;[m
[31m-[m
[31m-        ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_read_unbuffered_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    size_t                     window;[m
[31m-    ngx_buf_t                 *buf;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    stream = r->stream;[m
[31m-    fc = r->connection;[m
[31m-[m
[31m-    if (fc->read->timedout) {[m
[31m-        if (stream->recv_window) {[m
[31m-            stream->skip_data = 1;[m
[31m-            fc->timedout = 1;[m
[31m-[m
[31m-            return NGX_HTTP_REQUEST_TIME_OUT;[m
[31m-        }[m
[31m-[m
[31m-        fc->read->timedout = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (fc->error) {[m
[31m-        stream->skip_data = 1;[m
[31m-        return NGX_HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_v2_filter_request_body(r);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        stream->skip_data = 1;[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->request_body->rest) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body->busy != NULL) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    buf = r->request_body->buf;[m
[31m-[m
[31m-    buf->pos = buf->start;[m
[31m-    buf->last = buf->start;[m
[31m-[m
[31m-    window = buf->end - buf->start;[m
[31m-    h2c = stream->connection;[m
[31m-[m
[31m-    if (h2c->state.stream == stream) {[m
[31m-        window -= h2c->state.length;[m
[31m-    }[m
[31m-[m
[31m-    if (window == stream->recv_window) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_send_window_update(h2c, stream->node->id,[m
[31m-                                       window - stream->recv_window)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        stream->skip_data = 1;[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {[m
[31m-        stream->skip_data = 1;[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (stream->recv_window == 0) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-        ngx_add_timer(fc->read, clcf->client_body_timeout);[m
[31m-    }[m
[31m-[m
[31m-    stream->recv_window = window;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream, ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_event_t       *rev;[m
[31m-    ngx_connection_t  *fc;[m
[31m-[m
[31m-    if (ngx_http_v2_send_rst_stream(h2c, stream->node->id, status)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    stream->rst_sent = 1;[m
[31m-[m
[31m-    fc = stream->request->connection;[m
[31m-    fc->error = 1;[m
[31m-[m
[31m-    rev = fc->read;[m
[31m-    rev->handler(rev);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_pool_t                *pool;[m
[31m-    ngx_event_t               *ev;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_v2_node_t        *node;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    h2c = stream->connection;[m
[31m-    node = stream->node;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 close stream %ui, queued %ui, processing %ui",[m
[31m-                   node->id, stream->queued, h2c->processing);[m
[31m-[m
[31m-    fc = stream->request->connection;[m
[31m-[m
[31m-    if (stream->queued) {[m
[31m-        fc->write->handler = ngx_http_v2_close_stream_handler;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!stream->rst_sent && !h2c->connection->error) {[m
[31m-[m
[31m-        if (!stream->out_closed) {[m
[31m-            if (ngx_http_v2_send_rst_stream(h2c, node->id,[m
[31m-                                      fc->timedout ? NGX_HTTP_V2_PROTOCOL_ERROR[m
[31m-                                                   : NGX_HTTP_V2_INTERNAL_ERROR)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                h2c->connection->error = 1;[m
[31m-            }[m
[31m-[m
[31m-        } else if (!stream->in_closed) {[m
[31m-#if 0[m
[31m-            if (ngx_http_v2_send_rst_stream(h2c, node->id, NGX_HTTP_V2_NO_ERROR)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                h2c->connection->error = 1;[m
[31m-            }[m
[31m-#else[m
[31m-            /*[m
[31m-             * At the time of writing at least the latest versions of Chrome[m
[31m-             * do not properly handle RST_STREAM with NO_ERROR status.[m
[31m-             *[m
[31m-             * See: https://bugs.chromium.org/p/chromium/issues/detail?id=603182[m
[31m-             *[m
[31m-             * As a workaround, the stream window is maximized before closing[m
[31m-             * the stream.  This allows a client to send up to 2 GB of data[m
[31m-             * before getting blocked on flow control.[m
[31m-             */[m
[31m-[m
[31m-            if (stream->recv_window < NGX_HTTP_V2_MAX_WINDOW[m
[31m-                && ngx_http_v2_send_window_update(h2c, node->id,[m
[31m-                                                  NGX_HTTP_V2_MAX_WINDOW[m
[31m-                                                  - stream->recv_window)[m
[31m-                   != NGX_OK)[m
[31m-            {[m
[31m-                h2c->connection->error = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->state.stream == stream) {[m
[31m-        h2c->state.stream = NULL;[m
[31m-    }[m
[31m-[m
[31m-    node->stream = NULL;[m
[31m-[m
[31m-    ngx_queue_insert_tail(&h2c->closed, &node->reuse);[m
[31m-    h2c->closed_nodes++;[m
[31m-[m
[31m-    /*[m
[31m-     * This pool keeps decoded request headers which can be used by log phase[m
[31m-     * handlers in ngx_http_free_request().[m
[31m-     *[m
[31m-     * The pointer is stored into local variable because the stream object[m
[31m-     * will be destroyed after a call to ngx_http_free_request().[m
[31m-     */[m
[31m-    pool = stream->pool;[m
[31m-[m
[31m-    ngx_http_free_request(stream->request, rc);[m
[31m-[m
[31m-    if (pool != h2c->state.pool) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-[m
[31m-    } else {[m
[31m-        /* pool will be destroyed when the complete header is parsed */[m
[31m-        h2c->state.keep_pool = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev = fc->read;[m
[31m-[m
[31m-    if (ev->timer_set) {[m
[31m-        ngx_del_timer(ev);[m
[31m-    }[m
[31m-[m
[31m-    if (ev->posted) {[m
[31m-        ngx_delete_posted_event(ev);[m
[31m-    }[m
[31m-[m
[31m-    ev = fc->write;[m
[31m-[m
[31m-    if (ev->timer_set) {[m
[31m-        ngx_del_timer(ev);[m
[31m-    }[m
[31m-[m
[31m-    if (ev->posted) {[m
[31m-        ngx_delete_posted_event(ev);[m
[31m-    }[m
[31m-[m
[31m-    fc->data = h2c->free_fake_connections;[m
[31m-    h2c->free_fake_connections = fc;[m
[31m-[m
[31m-    h2c->processing--;[m
[31m-[m
[31m-    if (h2c->processing || h2c->blocked) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ev = h2c->connection->read;[m
[31m-[m
[31m-    ev->handler = ngx_http_v2_handle_connection_handler;[m
[31m-    ngx_post_event(ev, &ngx_posted_events);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_close_stream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t    *fc;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    fc = ev->data;[m
[31m-    r = fc->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                   "http2 close stream handler");[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, fc->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-[m
[31m-        fc->timedout = 1;[m
[31m-[m
[31m-        ngx_http_v2_close_stream(r->stream, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_close_stream(r->stream, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_handle_connection_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,[m
[31m-                   "http2 handle connection handler");[m
[31m-[m
[31m-    rev->handler = ngx_http_v2_read_handler;[m
[31m-[m
[31m-    if (rev->ready) {[m
[31m-        ngx_http_v2_read_handler(rev);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    h2c = c->data;[m
[31m-[m
[31m-    if (h2c->last_out && ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, 0);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_handle_connection(c->data);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_idle_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_http_v2_srv_conf_t    *h2scf;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    h2c = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 idle handler");[m
[31m-[m
[31m-    if (rev->timedout || c->close) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        if (rev->pending_eof) {[m
[31m-            c->log->handler = NULL;[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,[m
[31m-                          "kevent() reported that client %V closed "[m
[31m-                          "idle connection", &c->addr_text);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (c->ssl) {[m
[31m-                c->ssl->no_send_shutdown = 1;[m
[31m-            }[m
[31m-#endif[m
[31m-            ngx_http_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 0;[m
[31m-    c->idle = 0;[m
[31m-    ngx_reusable_connection(c, 0);[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log);[m
[31m-    if (h2c->pool == NULL) {[m
[31m-        ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_INTERNAL_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_http_v2_write_handler;[m
[31m-[m
[31m-    rev->handler = ngx_http_v2_read_handler;[m
[31m-    ngx_http_v2_read_handler(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t status)[m
[31m-{[m
[31m-    ngx_uint_t               i, size;[m
[31m-    ngx_event_t             *ev;[m
[31m-    ngx_connection_t        *c, *fc;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_v2_node_t      *node;[m
[31m-    ngx_http_v2_stream_t    *stream;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    c = h2c->connection;[m
[31m-[m
[31m-    h2c->blocked = 1;[m
[31m-[m
[31m-    if (!c->error && ngx_http_v2_send_goaway(h2c, status) != NGX_ERROR) {[m
[31m-        (void) ngx_http_v2_send_output_queue(h2c);[m
[31m-    }[m
[31m-[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    if (h2c->state.stream) {[m
[31m-        ngx_http_v2_close_stream(h2c->state.stream, NGX_HTTP_BAD_REQUEST);[m
[31m-    }[m
[31m-[m
[31m-    if (!h2c->processing) {[m
[31m-        ngx_http_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->read->handler = ngx_http_empty_handler;[m
[31m-    c->write->handler = ngx_http_empty_handler;[m
[31m-[m
[31m-    h2c->last_out = NULL;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    size = ngx_http_v2_index_size(h2scf);[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-[m
[31m-        for (node = h2c->streams_index[i]; node; node = node->index) {[m
[31m-            stream = node->stream;[m
[31m-[m
[31m-            if (stream == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            stream->handled = 0;[m
[31m-[m
[31m-            r = stream->request;[m
[31m-            fc = r->connection;[m
[31m-[m
[31m-            fc->error = 1;[m
[31m-[m
[31m-            if (stream->queued) {[m
[31m-                stream->queued = 0;[m
[31m-                ev = fc->write;[m
[31m-[m
[31m-            } else {[m
[31m-                ev = fc->read;[m
[31m-            }[m
[31m-[m
[31m-            ev->eof = 1;[m
[31m-            ev->handler(ev);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    h2c->blocked = 0;[m
[31m-[m
[31m-    if (h2c->processing) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_adjust_windows(ngx_http_v2_connection_t *h2c, ssize_t delta)[m
[31m-{[m
[31m-    ngx_uint_t               i, size;[m
[31m-    ngx_event_t             *wev;[m
[31m-    ngx_http_v2_node_t      *node;[m
[31m-    ngx_http_v2_stream_t    *stream;[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,[m
[31m-                                         ngx_http_v2_module);[m
[31m-[m
[31m-    size = ngx_http_v2_index_size(h2scf);[m
[31m-[m
[31m-    for (i = 0; i < size; i++) {[m
[31m-[m
[31m-        for (node = h2c->streams_index[i]; node; node = node->index) {[m
[31m-            stream = node->stream;[m
[31m-[m
[31m-            if (stream == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (delta > 0[m
[31m-                && stream->send_window[m
[31m-                      > (ssize_t) (NGX_HTTP_V2_MAX_WINDOW - delta))[m
[31m-            {[m
[31m-                if (ngx_http_v2_terminate_stream(h2c, stream,[m
[31m-                                                 NGX_HTTP_V2_FLOW_CTRL_ERROR)[m
[31m-                    == NGX_ERROR)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            stream->send_window += delta;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "http2:%ui adjusted window: %z",[m
[31m-                           node->id, stream->send_window);[m
[31m-[m
[31m-            if (stream->send_window > 0 && stream->exhausted) {[m
[31m-                stream->exhausted = 0;[m
[31m-[m
[31m-                wev = stream->request->connection->write;[m
[31m-[m
[31m-                wev->active = 0;[m
[31m-                wev->ready = 1;[m
[31m-[m
[31m-                if (!wev->delayed) {[m
[31m-                    wev->handler(wev);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_set_dependency(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_node_t *node, ngx_uint_t depend, ngx_uint_t exclusive)[m
[31m-{[m
[31m-    ngx_queue_t         *children, *q;[m
[31m-    ngx_http_v2_node_t  *parent, *child, *next;[m
[31m-[m
[31m-    parent = depend ? ngx_http_v2_get_node_by_id(h2c, depend, 0) : NULL;[m
[31m-[m
[31m-    if (parent == NULL) {[m
[31m-        parent = NGX_HTTP_V2_ROOT;[m
[31m-[m
[31m-        if (depend != 0) {[m
[31m-            exclusive = 0;[m
[31m-        }[m
[31m-[m
[31m-        node->rank = 1;[m
[31m-        node->rel_weight = (1.0 / 256) * node->weight;[m
[31m-[m
[31m-        children = &h2c->dependencies;[m
[31m-[m
[31m-    } else {[m
[31m-        if (node->parent != NULL) {[m
[31m-[m
[31m-            for (next = parent->parent;[m
[31m-                 next != NGX_HTTP_V2_ROOT && next->rank >= node->rank;[m
[31m-                 next = next->parent)[m
[31m-            {[m
[31m-                if (next != node) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                ngx_queue_remove(&parent->queue);[m
[31m-                ngx_queue_insert_after(&node->queue, &parent->queue);[m
[31m-[m
[31m-                parent->parent = node->parent;[m
[31m-[m
[31m-                if (node->parent == NGX_HTTP_V2_ROOT) {[m
[31m-                    parent->rank = 1;[m
[31m-                    parent->rel_weight = (1.0 / 256) * parent->weight;[m
[31m-[m
[31m-                } else {[m
[31m-                    parent->rank = node->parent->rank + 1;[m
[31m-                    parent->rel_weight = (node->parent->rel_weight / 256)[m
[31m-                                         * parent->weight;[m
[31m-                }[m
[31m-[m
[31m-                if (!exclusive) {[m
[31m-                    ngx_http_v2_node_children_update(parent);[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        node->rank = parent->rank + 1;[m
[31m-        node->rel_weight = (parent->rel_weight / 256) * node->weight;[m
[31m-[m
[31m-        if (parent->stream == NULL) {[m
[31m-            ngx_queue_remove(&parent->reuse);[m
[31m-            ngx_queue_insert_tail(&h2c->closed, &parent->reuse);[m
[31m-        }[m
[31m-[m
[31m-        children = &parent->children;[m
[31m-    }[m
[31m-[m
[31m-    if (exclusive) {[m
[31m-        for (q = ngx_queue_head(children);[m
[31m-             q != ngx_queue_sentinel(children);[m
[31m-             q = ngx_queue_next(q))[m
[31m-        {[m
[31m-            child = ngx_queue_data(q, ngx_http_v2_node_t, queue);[m
[31m-            child->parent = node;[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_add(&node->children, children);[m
[31m-        ngx_queue_init(children);[m
[31m-    }[m
[31m-[m
[31m-    if (node->parent != NULL) {[m
[31m-        ngx_queue_remove(&node->queue);[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_insert_tail(children, &node->queue);[m
[31m-[m
[31m-    node->parent = parent;[m
[31m-[m
[31m-    ngx_http_v2_node_children_update(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_node_children_update(ngx_http_v2_node_t *node)[m
[31m-{[m
[31m-    ngx_queue_t         *q;[m
[31m-    ngx_http_v2_node_t  *child;[m
[31m-[m
[31m-    for (q = ngx_queue_head(&node->children);[m
[31m-         q != ngx_queue_sentinel(&node->children);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        child = ngx_queue_data(q, ngx_http_v2_node_t, queue);[m
[31m-[m
[31m-        child->rank = node->rank + 1;[m
[31m-        child->rel_weight = (node->rel_weight / 256) * child->weight;[m
[31m-[m
[31m-        ngx_http_v2_node_children_update(child);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_pool_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_v2_connection_t  *h2c = data;[m
[31m-[m
[31m-    if (h2c->state.pool) {[m
[31m-        ngx_destroy_pool(h2c->state.pool);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->pool) {[m
[31m-        ngx_destroy_pool(h2c->pool);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2.h[m
[1mdeleted file mode 100644[m
[1mindex 1adf8de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2.h[m
[1m+++ /dev/null[m
[36m@@ -1,337 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_V2_H_INCLUDED_[m
[31m-#define _NGX_HTTP_V2_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_V2_ALPN_ADVERTISE       "\x02h2"[m
[31m-#define NGX_HTTP_V2_NPN_ADVERTISE        NGX_HTTP_V2_ALPN_ADVERTISE[m
[31m-[m
[31m-#define NGX_HTTP_V2_STATE_BUFFER_SIZE    16[m
[31m-[m
[31m-#define NGX_HTTP_V2_MAX_FRAME_SIZE       ((1 << 24) - 1)[m
[31m-[m
[31m-#define NGX_HTTP_V2_INT_OCTETS           4[m
[31m-#define NGX_HTTP_V2_MAX_FIELD                                                 \[m
[31m-    (127 + (1 << (NGX_HTTP_V2_INT_OCTETS - 1) * 7) - 1)[m
[31m-[m
[31m-#define NGX_HTTP_V2_FRAME_HEADER_SIZE    9[m
[31m-[m
[31m-/* frame types */[m
[31m-#define NGX_HTTP_V2_DATA_FRAME           0x0[m
[31m-#define NGX_HTTP_V2_HEADERS_FRAME        0x1[m
[31m-#define NGX_HTTP_V2_PRIORITY_FRAME       0x2[m
[31m-#define NGX_HTTP_V2_RST_STREAM_FRAME     0x3[m
[31m-#define NGX_HTTP_V2_SETTINGS_FRAME       0x4[m
[31m-#define NGX_HTTP_V2_PUSH_PROMISE_FRAME   0x5[m
[31m-#define NGX_HTTP_V2_PING_FRAME           0x6[m
[31m-#define NGX_HTTP_V2_GOAWAY_FRAME         0x7[m
[31m-#define NGX_HTTP_V2_WINDOW_UPDATE_FRAME  0x8[m
[31m-#define NGX_HTTP_V2_CONTINUATION_FRAME   0x9[m
[31m-[m
[31m-/* frame flags */[m
[31m-#define NGX_HTTP_V2_NO_FLAG              0x00[m
[31m-#define NGX_HTTP_V2_ACK_FLAG             0x01[m
[31m-#define NGX_HTTP_V2_END_STREAM_FLAG      0x01[m
[31m-#define NGX_HTTP_V2_END_HEADERS_FLAG     0x04[m
[31m-#define NGX_HTTP_V2_PADDED_FLAG          0x08[m
[31m-#define NGX_HTTP_V2_PRIORITY_FLAG        0x20[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_v2_connection_s   ngx_http_v2_connection_t;[m
[31m-typedef struct ngx_http_v2_node_s         ngx_http_v2_node_t;[m
[31m-typedef struct ngx_http_v2_out_frame_s    ngx_http_v2_out_frame_t;[m
[31m-[m
[31m-[m
[31m-typedef u_char *(*ngx_http_v2_handler_pt) (ngx_http_v2_connection_t *h2c,[m
[31m-    u_char *pos, u_char *end);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_str_t                        value;[m
[31m-} ngx_http_v2_header_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                       sid;[m
[31m-    size_t                           length;[m
[31m-    size_t                           padding;[m
[31m-    unsigned                         flags:8;[m
[31m-[m
[31m-    unsigned                         incomplete:1;[m
[31m-    unsigned                         keep_pool:1;[m
[31m-[m
[31m-    /* HPACK */[m
[31m-    unsigned                         parse_name:1;[m
[31m-    unsigned                         parse_value:1;[m
[31m-    unsigned                         index:1;[m
[31m-    ngx_http_v2_header_t             header;[m
[31m-    size_t                           header_limit;[m
[31m-    u_char                           field_state;[m
[31m-    u_char                          *field_start;[m
[31m-    u_char                          *field_end;[m
[31m-    size_t                           field_rest;[m
[31m-    ngx_pool_t                      *pool;[m
[31m-[m
[31m-    ngx_http_v2_stream_t            *stream;[m
[31m-[m
[31m-    u_char                           buffer[NGX_HTTP_V2_STATE_BUFFER_SIZE];[m
[31m-    size_t                           buffer_used;[m
[31m-    ngx_http_v2_handler_pt           handler;[m
[31m-} ngx_http_v2_state_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_v2_header_t           **entries;[m
[31m-[m
[31m-    ngx_uint_t                       added;[m
[31m-    ngx_uint_t                       deleted;[m
[31m-    ngx_uint_t                       reused;[m
[31m-    ngx_uint_t                       allocated;[m
[31m-[m
[31m-    size_t                           size;[m
[31m-    size_t                           free;[m
[31m-    u_char                          *storage;[m
[31m-    u_char                          *pos;[m
[31m-} ngx_http_v2_hpack_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_v2_connection_s {[m
[31m-    ngx_connection_t                *connection;[m
[31m-    ngx_http_connection_t           *http_connection;[m
[31m-[m
[31m-    ngx_uint_t                       processing;[m
[31m-[m
[31m-    size_t                           send_window;[m
[31m-    size_t                           recv_window;[m
[31m-    size_t                           init_window;[m
[31m-[m
[31m-    size_t                           frame_size;[m
[31m-[m
[31m-    ngx_queue_t                      waiting;[m
[31m-[m
[31m-    ngx_http_v2_state_t              state;[m
[31m-[m
[31m-    ngx_http_v2_hpack_t              hpack;[m
[31m-[m
[31m-    ngx_pool_t                      *pool;[m
[31m-[m
[31m-    ngx_http_v2_out_frame_t         *free_frames;[m
[31m-    ngx_connection_t                *free_fake_connections;[m
[31m-[m
[31m-    ngx_http_v2_node_t             **streams_index;[m
[31m-[m
[31m-    ngx_http_v2_out_frame_t         *last_out;[m
[31m-[m
[31m-    ngx_queue_t                      posted;[m
[31m-    ngx_queue_t                      dependencies;[m
[31m-    ngx_queue_t                      closed;[m
[31m-[m
[31m-    ngx_uint_t                       last_sid;[m
[31m-[m
[31m-    unsigned                         closed_nodes:8;[m
[31m-    unsigned                         settings_ack:1;[m
[31m-    unsigned                         blocked:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_v2_node_s {[m
[31m-    ngx_uint_t                       id;[m
[31m-    ngx_http_v2_node_t              *index;[m
[31m-    ngx_http_v2_node_t              *parent;[m
[31m-    ngx_queue_t                      queue;[m
[31m-    ngx_queue_t                      children;[m
[31m-    ngx_queue_t                      reuse;[m
[31m-    ngx_uint_t                       rank;[m
[31m-    ngx_uint_t                       weight;[m
[31m-    double                           rel_weight;[m
[31m-    ngx_http_v2_stream_t            *stream;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_v2_stream_s {[m
[31m-    ngx_http_request_t              *request;[m
[31m-    ngx_http_v2_connection_t        *connection;[m
[31m-    ngx_http_v2_node_t              *node;[m
[31m-[m
[31m-    ngx_uint_t                       queued;[m
[31m-[m
[31m-    /*[m
[31m-     * A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the[m
[31m-     * send_window to become negative, hence it's signed.[m
[31m-     */[m
[31m-    ssize_t                          send_window;[m
[31m-    size_t                           recv_window;[m
[31m-[m
[31m-    ngx_http_v2_out_frame_t         *free_frames;[m
[31m-    ngx_chain_t                     *free_frame_headers;[m
[31m-    ngx_chain_t                     *free_bufs;[m
[31m-[m
[31m-    ngx_queue_t                      queue;[m
[31m-[m
[31m-    ngx_array_t                     *cookies;[m
[31m-[m
[31m-    size_t                           header_limit;[m
[31m-[m
[31m-    ngx_pool_t                      *pool;[m
[31m-[m
[31m-    unsigned                         handled:1;[m
[31m-    unsigned                         blocked:1;[m
[31m-    unsigned                         exhausted:1;[m
[31m-    unsigned                         in_closed:1;[m
[31m-    unsigned                         out_closed:1;[m
[31m-    unsigned                         rst_sent:1;[m
[31m-    unsigned                         no_flow_control:1;[m
[31m-    unsigned                         skip_data:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_v2_out_frame_s {[m
[31m-    ngx_http_v2_out_frame_t         *next;[m
[31m-    ngx_chain_t                     *first;[m
[31m-    ngx_chain_t                     *last;[m
[31m-    ngx_int_t                      (*handler)(ngx_http_v2_connection_t *h2c,[m
[31m-                                        ngx_http_v2_out_frame_t *frame);[m
[31m-[m
[31m-    ngx_http_v2_stream_t            *stream;[m
[31m-    size_t                           length;[m
[31m-[m
[31m-    unsigned                         blocked:1;[m
[31m-    unsigned                         fin:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_v2_queue_frame(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_http_v2_out_frame_t  **out;[m
[31m-[m
[31m-    for (out = &h2c->last_out; *out; out = &(*out)->next) {[m
[31m-[m
[31m-        if ((*out)->blocked || (*out)->stream == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if ((*out)->stream->node->rank < frame->stream->node->rank[m
[31m-            || ((*out)->stream->node->rank == frame->stream->node->rank[m
[31m-                && (*out)->stream->node->rel_weight[m
[31m-                   >= frame->stream->node->rel_weight))[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    frame->next = *out;[m
[31m-    *out = frame;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_v2_queue_blocked_frame(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_http_v2_out_frame_t  **out;[m
[31m-[m
[31m-    for (out = &h2c->last_out; *out; out = &(*out)->next)[m
[31m-    {[m
[31m-        if ((*out)->blocked || (*out)->stream == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    frame->next = *out;[m
[31m-    *out = frame;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void ngx_http_v2_init(ngx_event_t *rev);[m
[31m-void ngx_http_v2_request_headers_init(void);[m
[31m-[m
[31m-ngx_int_t ngx_http_v2_read_request_body(ngx_http_request_t *r,[m
[31m-    ngx_http_client_body_handler_pt post_handler);[m
[31m-ngx_int_t ngx_http_v2_read_unbuffered_request_body(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc);[m
[31m-[m
[31m-ngx_int_t ngx_http_v2_send_output_queue(ngx_http_v2_connection_t *h2c);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_v2_get_indexed_header(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_uint_t index, ngx_uint_t name_only);[m
[31m-ngx_int_t ngx_http_v2_add_header(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_header_t *header);[m
[31m-ngx_int_t ngx_http_v2_table_size(ngx_http_v2_connection_t *h2c, size_t size);[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_v2_huff_decode(u_char *state, u_char *src, size_t len,[m
[31m-    u_char **dst, ngx_uint_t last, ngx_log_t *log);[m
[31m-size_t ngx_http_v2_huff_encode(u_char *src, size_t len, u_char *dst,[m
[31m-    ngx_uint_t lower);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_v2_prefix(bits)  ((1 << (bits)) - 1)[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define ngx_http_v2_parse_uint16(p)  ntohs(*(uint16_t *) (p))[m
[31m-#define ngx_http_v2_parse_uint32(p)  ntohl(*(uint32_t *) (p))[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_http_v2_parse_uint16(p)  ((p)[0] << 8 | (p)[1])[m
[31m-#define ngx_http_v2_parse_uint32(p)                                           \[m
[31m-    ((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_http_v2_parse_length(p)  ((p) >> 8)[m
[31m-#define ngx_http_v2_parse_type(p)    ((p) & 0xff)[m
[31m-#define ngx_http_v2_parse_sid(p)     (ngx_http_v2_parse_uint32(p) & 0x7fffffff)[m
[31m-#define ngx_http_v2_parse_window(p)  (ngx_http_v2_parse_uint32(p) & 0x7fffffff)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_v2_write_uint16_aligned(p, s)                                \[m
[31m-    (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t))[m
[31m-#define ngx_http_v2_write_uint32_aligned(p, s)                                \[m
[31m-    (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t))[m
[31m-[m
[31m-#if (NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define ngx_http_v2_write_uint16  ngx_http_v2_write_uint16_aligned[m
[31m-#define ngx_http_v2_write_uint32  ngx_http_v2_write_uint32_aligned[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_http_v2_write_uint16(p, s)                                        \[m
[31m-    ((p)[0] = (u_char) ((s) >> 8),                                            \[m
[31m-     (p)[1] = (u_char)  (s),                                                  \[m
[31m-     (p) + sizeof(uint16_t))[m
[31m-[m
[31m-#define ngx_http_v2_write_uint32(p, s)                                        \[m
[31m-    ((p)[0] = (u_char) ((s) >> 24),                                           \[m
[31m-     (p)[1] = (u_char) ((s) >> 16),                                           \[m
[31m-     (p)[2] = (u_char) ((s) >> 8),                                            \[m
[31m-     (p)[3] = (u_char)  (s),                                                  \[m
[31m-     (p) + sizeof(uint32_t))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_http_v2_write_len_and_type(p, l, t)                               \[m
[31m-    ngx_http_v2_write_uint32_aligned(p, (l) << 8 | (t))[m
[31m-[m
[31m-#define ngx_http_v2_write_sid  ngx_http_v2_write_uint32[m
[31m-[m
[31m-#endif /* _NGX_HTTP_V2_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_filter_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_filter_module.c[m
[1mdeleted file mode 100644[m
[1mindex caa835d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_filter_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1391 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_http_v2_module.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * This returns precise number of octets for values in range 0..253[m
[31m- * and estimate number for the rest, but not smaller than required.[m
[31m- */[m
[31m-[m
[31m-#define ngx_http_v2_integer_octets(v)  (1 + (v) / 127)[m
[31m-[m
[31m-#define ngx_http_v2_literal_size(h)                                           \[m
[31m-    (ngx_http_v2_integer_octets(sizeof(h) - 1) + sizeof(h) - 1)[m
[31m-[m
[31m-#define ngx_http_v2_indexed(i)      (128 + (i))[m
[31m-#define ngx_http_v2_inc_indexed(i)  (64 + (i))[m
[31m-[m
[31m-#define ngx_http_v2_write_name(dst, src, len, tmp)                            \[m
[31m-    ngx_http_v2_string_encode(dst, src, len, tmp, 1)[m
[31m-#define ngx_http_v2_write_value(dst, src, len, tmp)                           \[m
[31m-    ngx_http_v2_string_encode(dst, src, len, tmp, 0)[m
[31m-[m
[31m-#define NGX_HTTP_V2_ENCODE_RAW            0[m
[31m-#define NGX_HTTP_V2_ENCODE_HUFF           0x80[m
[31m-[m
[31m-#define NGX_HTTP_V2_STATUS_INDEX          8[m
[31m-#define NGX_HTTP_V2_STATUS_200_INDEX      8[m
[31m-#define NGX_HTTP_V2_STATUS_204_INDEX      9[m
[31m-#define NGX_HTTP_V2_STATUS_206_INDEX      10[m
[31m-#define NGX_HTTP_V2_STATUS_304_INDEX      11[m
[31m-#define NGX_HTTP_V2_STATUS_400_INDEX      12[m
[31m-#define NGX_HTTP_V2_STATUS_404_INDEX      13[m
[31m-#define NGX_HTTP_V2_STATUS_500_INDEX      14[m
[31m-[m
[31m-#define NGX_HTTP_V2_CONTENT_LENGTH_INDEX  28[m
[31m-#define NGX_HTTP_V2_CONTENT_TYPE_INDEX    31[m
[31m-#define NGX_HTTP_V2_DATE_INDEX            33[m
[31m-#define NGX_HTTP_V2_LAST_MODIFIED_INDEX   44[m
[31m-#define NGX_HTTP_V2_LOCATION_INDEX        46[m
[31m-#define NGX_HTTP_V2_SERVER_INDEX          54[m
[31m-#define NGX_HTTP_V2_VARY_INDEX            59[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_http_v2_string_encode(u_char *dst, u_char *src, size_t len,[m
[31m-    u_char *tmp, ngx_uint_t lower);[m
[31m-static u_char *ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix,[m
[31m-    ngx_uint_t value);[m
[31m-static ngx_http_v2_out_frame_t *ngx_http_v2_create_headers_frame([m
[31m-    ngx_http_request_t *r, u_char *pos, u_char *end);[m
[31m-[m
[31m-static ngx_chain_t *ngx_http_v2_send_chain(ngx_connection_t *fc,[m
[31m-    ngx_chain_t *in, off_t limit);[m
[31m-[m
[31m-static ngx_chain_t *ngx_http_v2_filter_get_shadow([m
[31m-    ngx_http_v2_stream_t *stream, ngx_buf_t *buf, off_t offset, off_t size);[m
[31m-static ngx_http_v2_out_frame_t *ngx_http_v2_filter_get_data_frame([m
[31m-    ngx_http_v2_stream_t *stream, size_t len, ngx_chain_t *first,[m
[31m-    ngx_chain_t *last);[m
[31m-[m
[31m-static ngx_inline ngx_int_t ngx_http_v2_flow_control([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream);[m
[31m-static void ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream);[m
[31m-[m
[31m-static ngx_inline ngx_int_t ngx_http_v2_filter_send([m
[31m-    ngx_connection_t *fc, ngx_http_v2_stream_t *stream);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_headers_frame_handler([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);[m
[31m-static ngx_int_t ngx_http_v2_data_frame_handler([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame);[m
[31m-static ngx_inline void ngx_http_v2_handle_frame([m
[31m-    ngx_http_v2_stream_t *stream, ngx_http_v2_out_frame_t *frame);[m
[31m-static ngx_inline void ngx_http_v2_handle_stream([m
[31m-    ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream);[m
[31m-[m
[31m-static void ngx_http_v2_filter_cleanup(void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_v2_filter_module_ctx = {[m
[31m-    NULL,                                  /* preconfiguration */[m
[31m-    ngx_http_v2_filter_init,               /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-[m
[31m-    NULL,                                  /* create location configuration */[m
[31m-    NULL                                   /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_v2_filter_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_v2_filter_module_ctx,        /* module context */[m
[31m-    NULL,                                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt  ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                     status, *pos, *start, *p, *tmp;[m
[31m-    size_t                     len, tmp_len;[m
[31m-    ngx_str_t                  host, location;[m
[31m-    ngx_uint_t                 i, port;[m
[31m-    ngx_list_part_t           *part;[m
[31m-    ngx_table_elt_t           *header;[m
[31m-    ngx_connection_t          *fc;[m
[31m-    ngx_http_cleanup_t        *cln;[m
[31m-    ngx_http_v2_out_frame_t   *frame;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_core_srv_conf_t  *cscf;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-#endif[m
[31m-    u_char                     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    static const u_char nginx[5] = "\x84\xaa\x63\x55\xe7";[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    static const u_char accept_encoding[12] =[m
[31m-        "\x8b\x84\x84\x2d\x69\x5b\x05\x44\x3c\x86\xaa\x6f";[m
[31m-#endif[m
[31m-[m
[31m-    static size_t nginx_ver_len = ngx_http_v2_literal_size(NGINX_VER);[m
[31m-    static u_char nginx_ver[ngx_http_v2_literal_size(NGINX_VER)];[m
[31m-[m
[31m-    if (!r->stream) {[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http2 header filter");[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->header_sent = 1;[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->method == NGX_HTTP_HEAD) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    switch (r->headers_out.status) {[m
[31m-[m
[31m-    case NGX_HTTP_OK:[m
[31m-        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_200_INDEX);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_NO_CONTENT:[m
[31m-        r->header_only = 1;[m
[31m-[m
[31m-        ngx_str_null(&r->headers_out.content_type);[m
[31m-[m
[31m-        r->headers_out.content_length = NULL;[m
[31m-        r->headers_out.content_length_n = -1;[m
[31m-[m
[31m-        r->headers_out.last_modified_time = -1;[m
[31m-        r->headers_out.last_modified = NULL;[m
[31m-[m
[31m-        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_204_INDEX);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_PARTIAL_CONTENT:[m
[31m-        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_206_INDEX);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_NOT_MODIFIED:[m
[31m-        r->header_only = 1;[m
[31m-        status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_304_INDEX);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        r->headers_out.last_modified_time = -1;[m
[31m-        r->headers_out.last_modified = NULL;[m
[31m-[m
[31m-        switch (r->headers_out.status) {[m
[31m-[m
[31m-        case NGX_HTTP_BAD_REQUEST:[m
[31m-            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_400_INDEX);[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_NOT_FOUND:[m
[31m-            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_404_INDEX);[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_INTERNAL_SERVER_ERROR:[m
[31m-            status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_500_INDEX);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            status = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = status ? 1 : 1 + ngx_http_v2_literal_size("418");[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        len += 1 + (clcf->server_tokens ? nginx_ver_len : sizeof(nginx));[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT");[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        len += 1 + NGX_HTTP_V2_INT_OCTETS + r->headers_out.content_type.len;[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len += sizeof("; charset=") - 1 + r->headers_out.charset.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        len += 1 + ngx_http_v2_integer_octets(NGX_OFF_T_LEN) + NGX_OFF_T_LEN;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT");[m
[31m-    }[m
[31m-[m
[31m-    fc = r->connection;[m
[31m-[m
[31m-    if (r->headers_out.location && r->headers_out.location->value.len) {[m
[31m-[m
[31m-        if (r->headers_out.location->value.data[0] == '/') {[m
[31m-            if (clcf->server_name_in_redirect) {[m
[31m-                cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-                host = cscf->server_name;[m
[31m-[m
[31m-            } else if (r->headers_in.server.len) {[m
[31m-                host = r->headers_in.server;[m
[31m-[m
[31m-            } else {[m
[31m-                host.len = NGX_SOCKADDR_STRLEN;[m
[31m-                host.data = addr;[m
[31m-[m
[31m-                if (ngx_connection_local_sockaddr(fc, &host, 0) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            switch (fc->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                sin6 = (struct sockaddr_in6 *) fc->local_sockaddr;[m
[31m-                port = ntohs(sin6->sin6_port);[m
[31m-                break;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-            case AF_UNIX:[m
[31m-                port = 0;[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                sin = (struct sockaddr_in *) fc->local_sockaddr;[m
[31m-                port = ntohs(sin->sin_port);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            location.len = sizeof("https://") - 1 + host.len[m
[31m-                           + r->headers_out.location->value.len;[m
[31m-[m
[31m-            if (clcf->port_in_redirect) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-                if (fc->ssl)[m
[31m-                    port = (port == 443) ? 0 : port;[m
[31m-                else[m
[31m-#endif[m
[31m-                    port = (port == 80) ? 0 : port;[m
[31m-[m
[31m-            } else {[m
[31m-                port = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (port) {[m
[31m-                location.len += sizeof(":65535") - 1;[m
[31m-            }[m
[31m-[m
[31m-            location.data = ngx_pnalloc(r->pool, location.len);[m
[31m-            if (location.data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_cpymem(location.data, "http", sizeof("http") - 1);[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-            if (fc->ssl) {[m
[31m-                *p++ = 's';[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            *p++ = ':'; *p++ = '/'; *p++ = '/';[m
[31m-            p = ngx_cpymem(p, host.data, host.len);[m
[31m-[m
[31m-            if (port) {[m
[31m-                p = ngx_sprintf(p, ":%ui", port);[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_cpymem(p, r->headers_out.location->value.data,[m
[31m-                              r->headers_out.location->value.len);[m
[31m-[m
[31m-            /* update r->headers_out.location->value for possible logging */[m
[31m-[m
[31m-            r->headers_out.location->value.len = p - location.data;[m
[31m-            r->headers_out.location->value.data = location.data;[m
[31m-            ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.location->hash = 0;[m
[31m-[m
[31m-        len += 1 + NGX_HTTP_V2_INT_OCTETS + r->headers_out.location->value.len;[m
[31m-    }[m
[31m-[m
[31m-    tmp_len = len;[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        if (clcf->gzip_vary) {[m
[31m-            len += 1 + sizeof(accept_encoding);[m
[31m-[m
[31m-        } else {[m
[31m-            r->gzip_vary = 0;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, fc->log, 0,[m
[31m-                          "too long response header name: \"%V\"",[m
[31m-                          &header[i].key);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, fc->log, 0,[m
[31m-                          "too long response header value: \"%V: %V\"",[m
[31m-                          &header[i].key, &header[i].value);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len[m
[31m-                 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;[m
[31m-[m
[31m-        if (header[i].key.len > tmp_len) {[m
[31m-            tmp_len = header[i].key.len;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].value.len > tmp_len) {[m
[31m-            tmp_len = header[i].value.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    tmp = ngx_palloc(r->pool, tmp_len);[m
[31m-    pos = ngx_pnalloc(r->pool, len);[m
[31m-[m
[31m-    if (pos == NULL || tmp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    start = pos;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                   "http2 output header: \":status: %03ui\"",[m
[31m-                   r->headers_out.status);[m
[31m-[m
[31m-    if (status) {[m
[31m-        *pos++ = status;[m
[31m-[m
[31m-    } else {[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_STATUS_INDEX);[m
[31m-        *pos++ = NGX_HTTP_V2_ENCODE_RAW | 3;[m
[31m-        pos = ngx_sprintf(pos, "%03ui", r->headers_out.status);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.server == NULL) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"server: %s\"",[m
[31m-                       clcf->server_tokens ? NGINX_VER : "nginx");[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_SERVER_INDEX);[m
[31m-[m
[31m-        if (clcf->server_tokens) {[m
[31m-            if (nginx_ver[0] == '\0') {[m
[31m-                p = ngx_http_v2_write_value(nginx_ver, (u_char *) NGINX_VER,[m
[31m-                                            sizeof(NGINX_VER) - 1, tmp);[m
[31m-                nginx_ver_len = p - nginx_ver;[m
[31m-            }[m
[31m-[m
[31m-            pos = ngx_cpymem(pos, nginx_ver, nginx_ver_len);[m
[31m-[m
[31m-        } else {[m
[31m-            pos = ngx_cpymem(pos, nginx, sizeof(nginx));[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.date == NULL) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"date: %V\"",[m
[31m-                       &ngx_cached_http_time);[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_DATE_INDEX);[m
[31m-        pos = ngx_http_v2_write_value(pos, ngx_cached_http_time.data,[m
[31m-                                      ngx_cached_http_time.len, tmp);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_CONTENT_TYPE_INDEX);[m
[31m-[m
[31m-        if (r->headers_out.content_type_len == r->headers_out.content_type.len[m
[31m-            && r->headers_out.charset.len)[m
[31m-        {[m
[31m-            len = r->headers_out.content_type.len + sizeof("; charset=") - 1[m
[31m-                  + r->headers_out.charset.len;[m
[31m-[m
[31m-            p = ngx_pnalloc(r->pool, len);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            p = ngx_cpymem(p, r->headers_out.content_type.data,[m
[31m-                           r->headers_out.content_type.len);[m
[31m-[m
[31m-            p = ngx_cpymem(p, "; charset=", sizeof("; charset=") - 1);[m
[31m-[m
[31m-            p = ngx_cpymem(p, r->headers_out.charset.data,[m
[31m-                           r->headers_out.charset.len);[m
[31m-[m
[31m-            /* updated r->headers_out.content_type is also needed for logging */[m
[31m-[m
[31m-            r->headers_out.content_type.len = len;[m
[31m-            r->headers_out.content_type.data = p - len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"content-type: %V\"",[m
[31m-                       &r->headers_out.content_type);[m
[31m-[m
[31m-        pos = ngx_http_v2_write_value(pos, r->headers_out.content_type.data,[m
[31m-                                      r->headers_out.content_type.len, tmp);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"content-length: %O\"",[m
[31m-                       r->headers_out.content_length_n);[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_CONTENT_LENGTH_INDEX);[m
[31m-[m
[31m-        p = pos;[m
[31m-        pos = ngx_sprintf(pos + 1, "%O", r->headers_out.content_length_n);[m
[31m-        *p = NGX_HTTP_V2_ENCODE_RAW | (u_char) (pos - p - 1);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.last_modified == NULL[m
[31m-        && r->headers_out.last_modified_time != -1)[m
[31m-    {[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_LAST_MODIFIED_INDEX);[m
[31m-[m
[31m-        ngx_http_time(pos, r->headers_out.last_modified_time);[m
[31m-        len = sizeof("Wed, 31 Dec 1986 18:00:00 GMT") - 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"last-modified: %*s\"",[m
[31m-                       len, pos);[m
[31m-[m
[31m-        /*[m
[31m-         * Date will always be encoded using huffman in the temporary buffer,[m
[31m-         * so it's safe here to use src and dst pointing to the same address.[m
[31m-         */[m
[31m-        pos = ngx_http_v2_write_value(pos, pos, len, tmp);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.location && r->headers_out.location->value.len) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"location: %V\"",[m
[31m-                       &r->headers_out.location->value);[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_LOCATION_INDEX);[m
[31m-        pos = ngx_http_v2_write_value(pos, r->headers_out.location->value.data,[m
[31m-                                      r->headers_out.location->value.len, tmp);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    if (r->gzip_vary) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                       "http2 output header: \"vary: Accept-Encoding\"");[m
[31m-[m
[31m-        *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_VARY_INDEX);[m
[31m-        pos = ngx_cpymem(pos, accept_encoding, sizeof(accept_encoding));[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        if (fc->log->log_level & NGX_LOG_DEBUG_HTTP) {[m
[31m-            ngx_strlow(tmp, header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, fc->log, 0,[m
[31m-                           "http2 output header: \"%*s: %V\"",[m
[31m-                           header[i].key.len, tmp, &header[i].value);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        *pos++ = 0;[m
[31m-[m
[31m-        pos = ngx_http_v2_write_name(pos, header[i].key.data,[m
[31m-                                     header[i].key.len, tmp);[m
[31m-[m
[31m-        pos = ngx_http_v2_write_value(pos, header[i].value.data,[m
[31m-                                      header[i].value.len, tmp);[m
[31m-    }[m
[31m-[m
[31m-    frame = ngx_http_v2_create_headers_frame(r, start, pos);[m
[31m-    if (frame == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_v2_queue_blocked_frame(r->stream->connection, frame);[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_v2_filter_cleanup;[m
[31m-    cln->data = r->stream;[m
[31m-[m
[31m-    r->stream->queued = 1;[m
[31m-[m
[31m-    fc->send_chain = ngx_http_v2_send_chain;[m
[31m-    fc->need_last_buf = 1;[m
[31m-[m
[31m-    return ngx_http_v2_filter_send(fc, r->stream);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_string_encode(u_char *dst, u_char *src, size_t len, u_char *tmp,[m
[31m-    ngx_uint_t lower)[m
[31m-{[m
[31m-    size_t  hlen;[m
[31m-[m
[31m-    hlen = ngx_http_v2_huff_encode(src, len, tmp, lower);[m
[31m-[m
[31m-    if (hlen > 0) {[m
[31m-        *dst = NGX_HTTP_V2_ENCODE_HUFF;[m
[31m-        dst = ngx_http_v2_write_int(dst, ngx_http_v2_prefix(7), hlen);[m
[31m-        return ngx_cpymem(dst, tmp, hlen);[m
[31m-    }[m
[31m-[m
[31m-    *dst = NGX_HTTP_V2_ENCODE_RAW;[m
[31m-    dst = ngx_http_v2_write_int(dst, ngx_http_v2_prefix(7), len);[m
[31m-[m
[31m-    if (lower) {[m
[31m-        ngx_strlow(dst, src, len);[m
[31m-        return dst + len;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_cpymem(dst, src, len);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix, ngx_uint_t value)[m
[31m-{[m
[31m-    if (value < prefix) {[m
[31m-        *pos++ |= value;[m
[31m-        return pos;[m
[31m-    }[m
[31m-[m
[31m-    *pos++ |= prefix;[m
[31m-    value -= prefix;[m
[31m-[m
[31m-    while (value >= 128) {[m
[31m-        *pos++ = value % 128 + 128;[m
[31m-        value /= 128;[m
[31m-    }[m
[31m-[m
[31m-    *pos++ = (u_char) value;[m
[31m-[m
[31m-    return pos;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_out_frame_t *[m
[31m-ngx_http_v2_create_headers_frame(ngx_http_request_t *r, u_char *pos,[m
[31m-    u_char *end)[m
[31m-{[m
[31m-    u_char                    type, flags;[m
[31m-    size_t                    rest, frame_size;[m
[31m-    ngx_buf_t                *b;[m
[31m-    ngx_chain_t              *cl, **ll;[m
[31m-    ngx_http_v2_stream_t     *stream;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-    stream = r->stream;[m
[31m-    rest = end - pos;[m
[31m-[m
[31m-    frame = ngx_palloc(r->pool, sizeof(ngx_http_v2_out_frame_t));[m
[31m-    if (frame == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    frame->handler = ngx_http_v2_headers_frame_handler;[m
[31m-    frame->stream = stream;[m
[31m-    frame->length = rest;[m
[31m-    frame->blocked = 1;[m
[31m-    frame->fin = r->header_only;[m
[31m-[m
[31m-    ll = &frame->first;[m
[31m-[m
[31m-    type = NGX_HTTP_V2_HEADERS_FRAME;[m
[31m-    flags = r->header_only ? NGX_HTTP_V2_END_STREAM_FLAG : NGX_HTTP_V2_NO_FLAG;[m
[31m-    frame_size = stream->connection->frame_size;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (rest <= frame_size) {[m
[31m-            frame_size = rest;[m
[31m-            flags |= NGX_HTTP_V2_END_HEADERS_FLAG;[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->pool, NGX_HTTP_V2_FRAME_HEADER_SIZE);[m
[31m-        if (b == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        b->last = ngx_http_v2_write_len_and_type(b->last, frame_size, type);[m
[31m-        *b->last++ = flags;[m
[31m-        b->last = ngx_http_v2_write_sid(b->last, stream->node->id);[m
[31m-[m
[31m-        b->tag = (ngx_buf_tag_t) &ngx_http_v2_module;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        b->pos = pos;[m
[31m-[m
[31m-        pos += frame_size;[m
[31m-[m
[31m-        b->last = pos;[m
[31m-        b->start = b->pos;[m
[31m-        b->end = b->last;[m
[31m-        b->temporary = 1;[m
[31m-[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = b;[m
[31m-[m
[31m-        *ll = cl;[m
[31m-        ll = &cl->next;[m
[31m-[m
[31m-        rest -= frame_size;[m
[31m-[m
[31m-        if (rest) {[m
[31m-            type = NGX_HTTP_V2_CONTINUATION_FRAME;[m
[31m-            flags = NGX_HTTP_V2_NO_FLAG;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        b->last_buf = r->header_only;[m
[31m-        cl->next = NULL;[m
[31m-        frame->last = cl;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http2:%ui create HEADERS frame %p: len:%uz",[m
[31m-                       stream->node->id, frame, frame->length);[m
[31m-[m
[31m-        return frame;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_v2_send_chain(ngx_connection_t *fc, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    off_t                      size, offset;[m
[31m-    size_t                     rest, frame_size;[m
[31m-    ngx_chain_t               *cl, *out, **ln;[m
[31m-    ngx_http_request_t        *r;[m
[31m-    ngx_http_v2_stream_t      *stream;[m
[31m-    ngx_http_v2_loc_conf_t    *h2lcf;[m
[31m-    ngx_http_v2_out_frame_t   *frame;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    r = fc->data;[m
[31m-    stream = r->stream;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    size = 0;[m
[31m-#endif[m
[31m-[m
[31m-    while (in) {[m
[31m-        size = ngx_buf_size(in->buf);[m
[31m-[m
[31m-        if (size || in->buf->last_buf) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-[m
[31m-        if (stream->queued) {[m
[31m-            fc->write->active = 1;[m
[31m-            fc->write->ready = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            fc->buffered &= ~NGX_HTTP_V2_BUFFERED;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    h2c = stream->connection;[m
[31m-[m
[31m-    if (size && ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) {[m
[31m-        fc->write->active = 1;[m
[31m-        fc->write->ready = 0;[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-    if (in->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {[m
[31m-        cl = ngx_alloc_chain_link(r->pool);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cl->buf = in->buf;[m
[31m-        in->buf = cl->buf->shadow;[m
[31m-[m
[31m-        offset = ngx_buf_in_memory(in->buf)[m
[31m-                 ? (cl->buf->pos - in->buf->pos)[m
[31m-                 : (cl->buf->file_pos - in->buf->file_pos);[m
[31m-[m
[31m-        cl->next = stream->free_bufs;[m
[31m-        stream->free_bufs = cl;[m
[31m-[m
[31m-    } else {[m
[31m-        offset = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) h2c->send_window) {[m
[31m-        limit = h2c->send_window;[m
[31m-    }[m
[31m-[m
[31m-    if (limit > stream->send_window) {[m
[31m-        limit = (stream->send_window > 0) ? stream->send_window : 0;[m
[31m-    }[m
[31m-[m
[31m-    h2lcf = ngx_http_get_module_loc_conf(r, ngx_http_v2_module);[m
[31m-[m
[31m-    frame_size = (h2lcf->chunk_size < h2c->frame_size)[m
[31m-                 ? h2lcf->chunk_size : h2c->frame_size;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    cl = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if ((off_t) frame_size > limit) {[m
[31m-            frame_size = (size_t) limit;[m
[31m-        }[m
[31m-[m
[31m-        ln = &out;[m
[31m-        rest = frame_size;[m
[31m-[m
[31m-        while ((off_t) rest >= size) {[m
[31m-[m
[31m-            if (offset) {[m
[31m-                cl = ngx_http_v2_filter_get_shadow(stream, in->buf,[m
[31m-                                                   offset, size);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                offset = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                cl = ngx_alloc_chain_link(r->pool);[m
[31m-                if (cl == NULL) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                cl->buf = in->buf;[m
[31m-            }[m
[31m-[m
[31m-            *ln = cl;[m
[31m-            ln = &cl->next;[m
[31m-[m
[31m-            rest -= (size_t) size;[m
[31m-            in = in->next;[m
[31m-[m
[31m-            if (in == NULL) {[m
[31m-                frame_size -= rest;[m
[31m-                rest = 0;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            size = ngx_buf_size(in->buf);[m
[31m-        }[m
[31m-[m
[31m-        if (rest) {[m
[31m-            cl = ngx_http_v2_filter_get_shadow(stream, in->buf, offset, rest);[m
[31m-            if (cl == NULL) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cl->buf->flush = 0;[m
[31m-            cl->buf->last_buf = 0;[m
[31m-[m
[31m-            *ln = cl;[m
[31m-[m
[31m-            offset += rest;[m
[31m-            size -= rest;[m
[31m-        }[m
[31m-[m
[31m-        frame = ngx_http_v2_filter_get_data_frame(stream, frame_size, out, cl);[m
[31m-        if (frame == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_v2_queue_frame(h2c, frame);[m
[31m-[m
[31m-        h2c->send_window -= frame_size;[m
[31m-[m
[31m-        stream->send_window -= frame_size;[m
[31m-        stream->queued++;[m
[31m-[m
[31m-        if (in == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        limit -= frame_size;[m
[31m-[m
[31m-        if (limit == 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (offset) {[m
[31m-        cl = ngx_http_v2_filter_get_shadow(stream, in->buf, offset, size);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        in->buf = cl->buf;[m
[31m-        ngx_free_chain(r->pool, cl);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_filter_send(fc, stream) == NGX_ERROR) {[m
[31m-        return NGX_CHAIN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (in && ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) {[m
[31m-        fc->write->active = 1;[m
[31m-        fc->write->ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_http_v2_filter_get_shadow(ngx_http_v2_stream_t *stream, ngx_buf_t *buf,[m
[31m-    off_t offset, off_t size)[m
[31m-{[m
[31m-    ngx_buf_t    *chunk;[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(stream->request->pool, &stream->free_bufs);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    chunk = cl->buf;[m
[31m-[m
[31m-    ngx_memcpy(chunk, buf, sizeof(ngx_buf_t));[m
[31m-[m
[31m-    chunk->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow;[m
[31m-    chunk->shadow = buf;[m
[31m-[m
[31m-    if (ngx_buf_in_memory(chunk)) {[m
[31m-        chunk->pos += offset;[m
[31m-        chunk->last = chunk->pos + size;[m
[31m-    }[m
[31m-[m
[31m-    if (chunk->in_file) {[m
[31m-        chunk->file_pos += offset;[m
[31m-        chunk->file_last = chunk->file_pos + size;[m
[31m-    }[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_out_frame_t *[m
[31m-ngx_http_v2_filter_get_data_frame(ngx_http_v2_stream_t *stream,[m
[31m-    size_t len, ngx_chain_t *first, ngx_chain_t *last)[m
[31m-{[m
[31m-    u_char                      flags;[m
[31m-    ngx_buf_t                  *buf;[m
[31m-    ngx_chain_t                *cl;[m
[31m-    ngx_http_v2_out_frame_t  *frame;[m
[31m-[m
[31m-[m
[31m-    frame = stream->free_frames;[m
[31m-[m
[31m-    if (frame) {[m
[31m-        stream->free_frames = frame->next;[m
[31m-[m
[31m-    } else {[m
[31m-        frame = ngx_palloc(stream->request->pool,[m
[31m-                           sizeof(ngx_http_v2_out_frame_t));[m
[31m-        if (frame == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    flags = last->buf->last_buf ? NGX_HTTP_V2_END_STREAM_FLAG : 0;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, stream->request->connection->log, 0,[m
[31m-                   "http2:%ui create DATA frame %p: len:%uz flags:%ui",[m
[31m-                   stream->node->id, frame, len, (ngx_uint_t) flags);[m
[31m-[m
[31m-    cl = ngx_chain_get_free_buf(stream->request->pool,[m
[31m-                                &stream->free_frame_headers);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    buf = cl->buf;[m
[31m-[m
[31m-    if (!buf->start) {[m
[31m-        buf->start = ngx_palloc(stream->request->pool,[m
[31m-                                NGX_HTTP_V2_FRAME_HEADER_SIZE);[m
[31m-        if (buf->start == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        buf->end = buf->start + NGX_HTTP_V2_FRAME_HEADER_SIZE;[m
[31m-        buf->last = buf->end;[m
[31m-[m
[31m-        buf->tag = (ngx_buf_tag_t) &ngx_http_v2_module;[m
[31m-        buf->memory = 1;[m
[31m-    }[m
[31m-[m
[31m-    buf->pos = buf->start;[m
[31m-    buf->last = buf->pos;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_len_and_type(buf->last, len,[m
[31m-                                               NGX_HTTP_V2_DATA_FRAME);[m
[31m-    *buf->last++ = flags;[m
[31m-[m
[31m-    buf->last = ngx_http_v2_write_sid(buf->last, stream->node->id);[m
[31m-[m
[31m-    cl->next = first;[m
[31m-    first = cl;[m
[31m-[m
[31m-    last->buf->flush = 1;[m
[31m-[m
[31m-    frame->first = first;[m
[31m-    frame->last = last;[m
[31m-    frame->handler = ngx_http_v2_data_frame_handler;[m
[31m-    frame->stream = stream;[m
[31m-    frame->length = len;[m
[31m-    frame->blocked = 0;[m
[31m-    frame->fin = last->buf->last_buf;[m
[31m-[m
[31m-    return frame;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_v2_filter_send(ngx_connection_t *fc, ngx_http_v2_stream_t *stream)[m
[31m-{[m
[31m-    stream->blocked = 1;[m
[31m-[m
[31m-    if (ngx_http_v2_send_output_queue(stream->connection) == NGX_ERROR) {[m
[31m-        fc->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    stream->blocked = 0;[m
[31m-[m
[31m-    if (stream->queued) {[m
[31m-        fc->buffered |= NGX_HTTP_V2_BUFFERED;[m
[31m-        fc->write->active = 1;[m
[31m-        fc->write->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    fc->buffered &= ~NGX_HTTP_V2_BUFFERED;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_v2_flow_control(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream)[m
[31m-{[m
[31m-    if (stream->send_window <= 0) {[m
[31m-        stream->exhausted = 1;[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->send_window == 0) {[m
[31m-        ngx_http_v2_waiting_queue(h2c, stream);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream)[m
[31m-{[m
[31m-    ngx_queue_t           *q;[m
[31m-    ngx_http_v2_stream_t  *s;[m
[31m-[m
[31m-    if (stream->handled) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    stream->handled = 1;[m
[31m-[m
[31m-    for (q = ngx_queue_last(&h2c->waiting);[m
[31m-         q != ngx_queue_sentinel(&h2c->waiting);[m
[31m-         q = ngx_queue_prev(q))[m
[31m-    {[m
[31m-        s = ngx_queue_data(q, ngx_http_v2_stream_t, queue);[m
[31m-[m
[31m-        if (s->node->rank < stream->node->rank[m
[31m-            || (s->node->rank == stream->node->rank[m
[31m-                && s->node->rel_weight >= stream->node->rel_weight))[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_insert_after(q, &stream->queue);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_chain_t           *cl, *ln;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    stream = frame->stream;[m
[31m-    cl = frame->first;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (cl->buf->pos != cl->buf->last) {[m
[31m-            frame->first = cl;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "http2:%ui HEADERS frame %p was sent partially",[m
[31m-                           stream->node->id, frame);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ln = cl->next;[m
[31m-[m
[31m-        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_module) {[m
[31m-            cl->next = stream->free_frame_headers;[m
[31m-            stream->free_frame_headers = cl;[m
[31m-[m
[31m-        } else {[m
[31m-            cl->next = stream->free_bufs;[m
[31m-            stream->free_bufs = cl;[m
[31m-        }[m
[31m-[m
[31m-        if (cl == frame->last) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        cl = ln;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2:%ui HEADERS frame %p was sent",[m
[31m-                   stream->node->id, frame);[m
[31m-[m
[31m-    ngx_http_v2_handle_frame(stream, frame);[m
[31m-[m
[31m-    ngx_http_v2_handle_stream(h2c, stream);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_data_frame_handler(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_buf_t             *buf;[m
[31m-    ngx_chain_t           *cl, *ln;[m
[31m-    ngx_http_v2_stream_t  *stream;[m
[31m-[m
[31m-    stream = frame->stream;[m
[31m-[m
[31m-    cl = frame->first;[m
[31m-[m
[31m-    if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_module) {[m
[31m-[m
[31m-        if (cl->buf->pos != cl->buf->last) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "http2:%ui DATA frame %p was sent partially",[m
[31m-                           stream->node->id, frame);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ln = cl->next;[m
[31m-[m
[31m-        cl->next = stream->free_frame_headers;[m
[31m-        stream->free_frame_headers = cl;[m
[31m-[m
[31m-        if (cl == frame->last) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        cl = ln;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {[m
[31m-            buf = cl->buf->shadow;[m
[31m-[m
[31m-            if (ngx_buf_in_memory(buf)) {[m
[31m-                buf->pos = cl->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            if (buf->in_file) {[m
[31m-                buf->file_pos = cl->buf->file_pos;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_buf_size(cl->buf) != 0) {[m
[31m-[m
[31m-            if (cl != frame->first) {[m
[31m-                frame->first = cl;[m
[31m-                ngx_http_v2_handle_stream(h2c, stream);[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                           "http2:%ui DATA frame %p was sent partially",[m
[31m-                           stream->node->id, frame);[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ln = cl->next;[m
[31m-[m
[31m-        if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) {[m
[31m-            cl->next = stream->free_bufs;[m
[31m-            stream->free_bufs = cl;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_free_chain(stream->request->pool, cl);[m
[31m-        }[m
[31m-[m
[31m-        if (cl == frame->last) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        cl = ln;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2:%ui DATA frame %p was sent",[m
[31m-                   stream->node->id, frame);[m
[31m-[m
[31m-    stream->request->header_size += NGX_HTTP_V2_FRAME_HEADER_SIZE;[m
[31m-[m
[31m-    ngx_http_v2_handle_frame(stream, frame);[m
[31m-[m
[31m-    ngx_http_v2_handle_stream(h2c, stream);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_v2_handle_frame(ngx_http_v2_stream_t *stream,[m
[31m-    ngx_http_v2_out_frame_t *frame)[m
[31m-{[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = stream->request;[m
[31m-[m
[31m-    r->connection->sent += NGX_HTTP_V2_FRAME_HEADER_SIZE + frame->length;[m
[31m-[m
[31m-    if (frame->fin) {[m
[31m-        stream->out_closed = 1;[m
[31m-    }[m
[31m-[m
[31m-    frame->next = stream->free_frames;[m
[31m-    stream->free_frames = frame;[m
[31m-[m
[31m-    stream->queued--;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_v2_handle_stream(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_stream_t *stream)[m
[31m-{[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    if (stream->handled || stream->blocked || stream->exhausted) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = stream->request->connection->write;[m
[31m-[m
[31m-    if (!wev->delayed) {[m
[31m-        stream->handled = 1;[m
[31m-        ngx_queue_insert_tail(&h2c->posted, &stream->queue);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_v2_filter_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_v2_stream_t *stream = data;[m
[31m-[m
[31m-    size_t                     window;[m
[31m-    ngx_http_v2_out_frame_t   *frame, **fn;[m
[31m-    ngx_http_v2_connection_t  *h2c;[m
[31m-[m
[31m-    if (stream->handled) {[m
[31m-        stream->handled = 0;[m
[31m-        ngx_queue_remove(&stream->queue);[m
[31m-    }[m
[31m-[m
[31m-    if (stream->queued == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    window = 0;[m
[31m-    h2c = stream->connection;[m
[31m-    fn = &h2c->last_out;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        frame = *fn;[m
[31m-[m
[31m-        if (frame == NULL) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (frame->stream == stream && !frame->blocked) {[m
[31m-            *fn = frame->next;[m
[31m-[m
[31m-            window += frame->length;[m
[31m-[m
[31m-            if (--stream->queued == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        fn = &frame->next;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->send_window == 0 && window && !ngx_queue_empty(&h2c->waiting)) {[m
[31m-        ngx_queue_add(&h2c->posted, &h2c->waiting);[m
[31m-        ngx_queue_init(&h2c->waiting);[m
[31m-    }[m
[31m-[m
[31m-    h2c->send_window += window;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_v2_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_decode.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_decode.c[m
[1mdeleted file mode 100644[m
[1mindex 49ca576..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_decode.c[m
[1m+++ /dev/null[m
[36m@@ -1,2714 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char  next;[m
[31m-    u_char  emit;[m
[31m-    u_char  sym;[m
[31m-    u_char  ending;[m
[31m-} ngx_http_v2_huff_decode_code_t;[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t ngx_http_v2_huff_decode_bits(u_char *state,[m
[31m-    u_char *ending, ngx_uint_t bits, u_char **dst);[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_huff_decode_code_t  ngx_http_v2_huff_decode_codes[256][16] =[m
[31m-{[m
[31m-    /* 0 */[m
[31m-    {[m
[31m-        {0x04, 0x00, 0x00, 0x00}, {0x05, 0x00, 0x00, 0x00},[m
[31m-        {0x07, 0x00, 0x00, 0x00}, {0x08, 0x00, 0x00, 0x00},[m
[31m-        {0x0b, 0x00, 0x00, 0x00}, {0x0c, 0x00, 0x00, 0x00},[m
[31m-        {0x10, 0x00, 0x00, 0x00}, {0x13, 0x00, 0x00, 0x00},[m
[31m-        {0x19, 0x00, 0x00, 0x00}, {0x1c, 0x00, 0x00, 0x00},[m
[31m-        {0x20, 0x00, 0x00, 0x00}, {0x23, 0x00, 0x00, 0x00},[m
[31m-        {0x2a, 0x00, 0x00, 0x00}, {0x31, 0x00, 0x00, 0x00},[m
[31m-        {0x39, 0x00, 0x00, 0x00}, {0x40, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x30, 0x01}, {0x00, 0x01, 0x31, 0x01},[m
[31m-        {0x00, 0x01, 0x32, 0x01}, {0x00, 0x01, 0x61, 0x01},[m
[31m-        {0x00, 0x01, 0x63, 0x01}, {0x00, 0x01, 0x65, 0x01},[m
[31m-        {0x00, 0x01, 0x69, 0x01}, {0x00, 0x01, 0x6f, 0x01},[m
[31m-        {0x00, 0x01, 0x73, 0x01}, {0x00, 0x01, 0x74, 0x01},[m
[31m-        {0x0d, 0x00, 0x00, 0x00}, {0x0e, 0x00, 0x00, 0x00},[m
[31m-        {0x11, 0x00, 0x00, 0x00}, {0x12, 0x00, 0x00, 0x00},[m
[31m-        {0x14, 0x00, 0x00, 0x00}, {0x15, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x30, 0x00}, {0x16, 0x01, 0x30, 0x01},[m
[31m-        {0x01, 0x01, 0x31, 0x00}, {0x16, 0x01, 0x31, 0x01},[m
[31m-        {0x01, 0x01, 0x32, 0x00}, {0x16, 0x01, 0x32, 0x01},[m
[31m-        {0x01, 0x01, 0x61, 0x00}, {0x16, 0x01, 0x61, 0x01},[m
[31m-        {0x01, 0x01, 0x63, 0x00}, {0x16, 0x01, 0x63, 0x01},[m
[31m-        {0x01, 0x01, 0x65, 0x00}, {0x16, 0x01, 0x65, 0x01},[m
[31m-        {0x01, 0x01, 0x69, 0x00}, {0x16, 0x01, 0x69, 0x01},[m
[31m-        {0x01, 0x01, 0x6f, 0x00}, {0x16, 0x01, 0x6f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x30, 0x00}, {0x09, 0x01, 0x30, 0x00},[m
[31m-        {0x17, 0x01, 0x30, 0x00}, {0x28, 0x01, 0x30, 0x01},[m
[31m-        {0x02, 0x01, 0x31, 0x00}, {0x09, 0x01, 0x31, 0x00},[m
[31m-        {0x17, 0x01, 0x31, 0x00}, {0x28, 0x01, 0x31, 0x01},[m
[31m-        {0x02, 0x01, 0x32, 0x00}, {0x09, 0x01, 0x32, 0x00},[m
[31m-        {0x17, 0x01, 0x32, 0x00}, {0x28, 0x01, 0x32, 0x01},[m
[31m-        {0x02, 0x01, 0x61, 0x00}, {0x09, 0x01, 0x61, 0x00},[m
[31m-        {0x17, 0x01, 0x61, 0x00}, {0x28, 0x01, 0x61, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x30, 0x00}, {0x06, 0x01, 0x30, 0x00},[m
[31m-        {0x0a, 0x01, 0x30, 0x00}, {0x0f, 0x01, 0x30, 0x00},[m
[31m-        {0x18, 0x01, 0x30, 0x00}, {0x1f, 0x01, 0x30, 0x00},[m
[31m-        {0x29, 0x01, 0x30, 0x00}, {0x38, 0x01, 0x30, 0x01},[m
[31m-        {0x03, 0x01, 0x31, 0x00}, {0x06, 0x01, 0x31, 0x00},[m
[31m-        {0x0a, 0x01, 0x31, 0x00}, {0x0f, 0x01, 0x31, 0x00},[m
[31m-        {0x18, 0x01, 0x31, 0x00}, {0x1f, 0x01, 0x31, 0x00},[m
[31m-        {0x29, 0x01, 0x31, 0x00}, {0x38, 0x01, 0x31, 0x01}[m
[31m-    },[m
[31m-    /* 5 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x32, 0x00}, {0x06, 0x01, 0x32, 0x00},[m
[31m-        {0x0a, 0x01, 0x32, 0x00}, {0x0f, 0x01, 0x32, 0x00},[m
[31m-        {0x18, 0x01, 0x32, 0x00}, {0x1f, 0x01, 0x32, 0x00},[m
[31m-        {0x29, 0x01, 0x32, 0x00}, {0x38, 0x01, 0x32, 0x01},[m
[31m-        {0x03, 0x01, 0x61, 0x00}, {0x06, 0x01, 0x61, 0x00},[m
[31m-        {0x0a, 0x01, 0x61, 0x00}, {0x0f, 0x01, 0x61, 0x00},[m
[31m-        {0x18, 0x01, 0x61, 0x00}, {0x1f, 0x01, 0x61, 0x00},[m
[31m-        {0x29, 0x01, 0x61, 0x00}, {0x38, 0x01, 0x61, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x63, 0x00}, {0x09, 0x01, 0x63, 0x00},[m
[31m-        {0x17, 0x01, 0x63, 0x00}, {0x28, 0x01, 0x63, 0x01},[m
[31m-        {0x02, 0x01, 0x65, 0x00}, {0x09, 0x01, 0x65, 0x00},[m
[31m-        {0x17, 0x01, 0x65, 0x00}, {0x28, 0x01, 0x65, 0x01},[m
[31m-        {0x02, 0x01, 0x69, 0x00}, {0x09, 0x01, 0x69, 0x00},[m
[31m-        {0x17, 0x01, 0x69, 0x00}, {0x28, 0x01, 0x69, 0x01},[m
[31m-        {0x02, 0x01, 0x6f, 0x00}, {0x09, 0x01, 0x6f, 0x00},[m
[31m-        {0x17, 0x01, 0x6f, 0x00}, {0x28, 0x01, 0x6f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x63, 0x00}, {0x06, 0x01, 0x63, 0x00},[m
[31m-        {0x0a, 0x01, 0x63, 0x00}, {0x0f, 0x01, 0x63, 0x00},[m
[31m-        {0x18, 0x01, 0x63, 0x00}, {0x1f, 0x01, 0x63, 0x00},[m
[31m-        {0x29, 0x01, 0x63, 0x00}, {0x38, 0x01, 0x63, 0x01},[m
[31m-        {0x03, 0x01, 0x65, 0x00}, {0x06, 0x01, 0x65, 0x00},[m
[31m-        {0x0a, 0x01, 0x65, 0x00}, {0x0f, 0x01, 0x65, 0x00},[m
[31m-        {0x18, 0x01, 0x65, 0x00}, {0x1f, 0x01, 0x65, 0x00},[m
[31m-        {0x29, 0x01, 0x65, 0x00}, {0x38, 0x01, 0x65, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x69, 0x00}, {0x06, 0x01, 0x69, 0x00},[m
[31m-        {0x0a, 0x01, 0x69, 0x00}, {0x0f, 0x01, 0x69, 0x00},[m
[31m-        {0x18, 0x01, 0x69, 0x00}, {0x1f, 0x01, 0x69, 0x00},[m
[31m-        {0x29, 0x01, 0x69, 0x00}, {0x38, 0x01, 0x69, 0x01},[m
[31m-        {0x03, 0x01, 0x6f, 0x00}, {0x06, 0x01, 0x6f, 0x00},[m
[31m-        {0x0a, 0x01, 0x6f, 0x00}, {0x0f, 0x01, 0x6f, 0x00},[m
[31m-        {0x18, 0x01, 0x6f, 0x00}, {0x1f, 0x01, 0x6f, 0x00},[m
[31m-        {0x29, 0x01, 0x6f, 0x00}, {0x38, 0x01, 0x6f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x73, 0x00}, {0x16, 0x01, 0x73, 0x01},[m
[31m-        {0x01, 0x01, 0x74, 0x00}, {0x16, 0x01, 0x74, 0x01},[m
[31m-        {0x00, 0x01, 0x20, 0x01}, {0x00, 0x01, 0x25, 0x01},[m
[31m-        {0x00, 0x01, 0x2d, 0x01}, {0x00, 0x01, 0x2e, 0x01},[m
[31m-        {0x00, 0x01, 0x2f, 0x01}, {0x00, 0x01, 0x33, 0x01},[m
[31m-        {0x00, 0x01, 0x34, 0x01}, {0x00, 0x01, 0x35, 0x01},[m
[31m-        {0x00, 0x01, 0x36, 0x01}, {0x00, 0x01, 0x37, 0x01},[m
[31m-        {0x00, 0x01, 0x38, 0x01}, {0x00, 0x01, 0x39, 0x01}[m
[31m-    },[m
[31m-    /* 10 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x73, 0x00}, {0x09, 0x01, 0x73, 0x00},[m
[31m-        {0x17, 0x01, 0x73, 0x00}, {0x28, 0x01, 0x73, 0x01},[m
[31m-        {0x02, 0x01, 0x74, 0x00}, {0x09, 0x01, 0x74, 0x00},[m
[31m-        {0x17, 0x01, 0x74, 0x00}, {0x28, 0x01, 0x74, 0x01},[m
[31m-        {0x01, 0x01, 0x20, 0x00}, {0x16, 0x01, 0x20, 0x01},[m
[31m-        {0x01, 0x01, 0x25, 0x00}, {0x16, 0x01, 0x25, 0x01},[m
[31m-        {0x01, 0x01, 0x2d, 0x00}, {0x16, 0x01, 0x2d, 0x01},[m
[31m-        {0x01, 0x01, 0x2e, 0x00}, {0x16, 0x01, 0x2e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x73, 0x00}, {0x06, 0x01, 0x73, 0x00},[m
[31m-        {0x0a, 0x01, 0x73, 0x00}, {0x0f, 0x01, 0x73, 0x00},[m
[31m-        {0x18, 0x01, 0x73, 0x00}, {0x1f, 0x01, 0x73, 0x00},[m
[31m-        {0x29, 0x01, 0x73, 0x00}, {0x38, 0x01, 0x73, 0x01},[m
[31m-        {0x03, 0x01, 0x74, 0x00}, {0x06, 0x01, 0x74, 0x00},[m
[31m-        {0x0a, 0x01, 0x74, 0x00}, {0x0f, 0x01, 0x74, 0x00},[m
[31m-        {0x18, 0x01, 0x74, 0x00}, {0x1f, 0x01, 0x74, 0x00},[m
[31m-        {0x29, 0x01, 0x74, 0x00}, {0x38, 0x01, 0x74, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x20, 0x00}, {0x09, 0x01, 0x20, 0x00},[m
[31m-        {0x17, 0x01, 0x20, 0x00}, {0x28, 0x01, 0x20, 0x01},[m
[31m-        {0x02, 0x01, 0x25, 0x00}, {0x09, 0x01, 0x25, 0x00},[m
[31m-        {0x17, 0x01, 0x25, 0x00}, {0x28, 0x01, 0x25, 0x01},[m
[31m-        {0x02, 0x01, 0x2d, 0x00}, {0x09, 0x01, 0x2d, 0x00},[m
[31m-        {0x17, 0x01, 0x2d, 0x00}, {0x28, 0x01, 0x2d, 0x01},[m
[31m-        {0x02, 0x01, 0x2e, 0x00}, {0x09, 0x01, 0x2e, 0x00},[m
[31m-        {0x17, 0x01, 0x2e, 0x00}, {0x28, 0x01, 0x2e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x20, 0x00}, {0x06, 0x01, 0x20, 0x00},[m
[31m-        {0x0a, 0x01, 0x20, 0x00}, {0x0f, 0x01, 0x20, 0x00},[m
[31m-        {0x18, 0x01, 0x20, 0x00}, {0x1f, 0x01, 0x20, 0x00},[m
[31m-        {0x29, 0x01, 0x20, 0x00}, {0x38, 0x01, 0x20, 0x01},[m
[31m-        {0x03, 0x01, 0x25, 0x00}, {0x06, 0x01, 0x25, 0x00},[m
[31m-        {0x0a, 0x01, 0x25, 0x00}, {0x0f, 0x01, 0x25, 0x00},[m
[31m-        {0x18, 0x01, 0x25, 0x00}, {0x1f, 0x01, 0x25, 0x00},[m
[31m-        {0x29, 0x01, 0x25, 0x00}, {0x38, 0x01, 0x25, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x2d, 0x00}, {0x06, 0x01, 0x2d, 0x00},[m
[31m-        {0x0a, 0x01, 0x2d, 0x00}, {0x0f, 0x01, 0x2d, 0x00},[m
[31m-        {0x18, 0x01, 0x2d, 0x00}, {0x1f, 0x01, 0x2d, 0x00},[m
[31m-        {0x29, 0x01, 0x2d, 0x00}, {0x38, 0x01, 0x2d, 0x01},[m
[31m-        {0x03, 0x01, 0x2e, 0x00}, {0x06, 0x01, 0x2e, 0x00},[m
[31m-        {0x0a, 0x01, 0x2e, 0x00}, {0x0f, 0x01, 0x2e, 0x00},[m
[31m-        {0x18, 0x01, 0x2e, 0x00}, {0x1f, 0x01, 0x2e, 0x00},[m
[31m-        {0x29, 0x01, 0x2e, 0x00}, {0x38, 0x01, 0x2e, 0x01}[m
[31m-    },[m
[31m-    /* 15 */[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x2f, 0x00}, {0x16, 0x01, 0x2f, 0x01},[m
[31m-        {0x01, 0x01, 0x33, 0x00}, {0x16, 0x01, 0x33, 0x01},[m
[31m-        {0x01, 0x01, 0x34, 0x00}, {0x16, 0x01, 0x34, 0x01},[m
[31m-        {0x01, 0x01, 0x35, 0x00}, {0x16, 0x01, 0x35, 0x01},[m
[31m-        {0x01, 0x01, 0x36, 0x00}, {0x16, 0x01, 0x36, 0x01},[m
[31m-        {0x01, 0x01, 0x37, 0x00}, {0x16, 0x01, 0x37, 0x01},[m
[31m-        {0x01, 0x01, 0x38, 0x00}, {0x16, 0x01, 0x38, 0x01},[m
[31m-        {0x01, 0x01, 0x39, 0x00}, {0x16, 0x01, 0x39, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x2f, 0x00}, {0x09, 0x01, 0x2f, 0x00},[m
[31m-        {0x17, 0x01, 0x2f, 0x00}, {0x28, 0x01, 0x2f, 0x01},[m
[31m-        {0x02, 0x01, 0x33, 0x00}, {0x09, 0x01, 0x33, 0x00},[m
[31m-        {0x17, 0x01, 0x33, 0x00}, {0x28, 0x01, 0x33, 0x01},[m
[31m-        {0x02, 0x01, 0x34, 0x00}, {0x09, 0x01, 0x34, 0x00},[m
[31m-        {0x17, 0x01, 0x34, 0x00}, {0x28, 0x01, 0x34, 0x01},[m
[31m-        {0x02, 0x01, 0x35, 0x00}, {0x09, 0x01, 0x35, 0x00},[m
[31m-        {0x17, 0x01, 0x35, 0x00}, {0x28, 0x01, 0x35, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x2f, 0x00}, {0x06, 0x01, 0x2f, 0x00},[m
[31m-        {0x0a, 0x01, 0x2f, 0x00}, {0x0f, 0x01, 0x2f, 0x00},[m
[31m-        {0x18, 0x01, 0x2f, 0x00}, {0x1f, 0x01, 0x2f, 0x00},[m
[31m-        {0x29, 0x01, 0x2f, 0x00}, {0x38, 0x01, 0x2f, 0x01},[m
[31m-        {0x03, 0x01, 0x33, 0x00}, {0x06, 0x01, 0x33, 0x00},[m
[31m-        {0x0a, 0x01, 0x33, 0x00}, {0x0f, 0x01, 0x33, 0x00},[m
[31m-        {0x18, 0x01, 0x33, 0x00}, {0x1f, 0x01, 0x33, 0x00},[m
[31m-        {0x29, 0x01, 0x33, 0x00}, {0x38, 0x01, 0x33, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x34, 0x00}, {0x06, 0x01, 0x34, 0x00},[m
[31m-        {0x0a, 0x01, 0x34, 0x00}, {0x0f, 0x01, 0x34, 0x00},[m
[31m-        {0x18, 0x01, 0x34, 0x00}, {0x1f, 0x01, 0x34, 0x00},[m
[31m-        {0x29, 0x01, 0x34, 0x00}, {0x38, 0x01, 0x34, 0x01},[m
[31m-        {0x03, 0x01, 0x35, 0x00}, {0x06, 0x01, 0x35, 0x00},[m
[31m-        {0x0a, 0x01, 0x35, 0x00}, {0x0f, 0x01, 0x35, 0x00},[m
[31m-        {0x18, 0x01, 0x35, 0x00}, {0x1f, 0x01, 0x35, 0x00},[m
[31m-        {0x29, 0x01, 0x35, 0x00}, {0x38, 0x01, 0x35, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x36, 0x00}, {0x09, 0x01, 0x36, 0x00},[m
[31m-        {0x17, 0x01, 0x36, 0x00}, {0x28, 0x01, 0x36, 0x01},[m
[31m-        {0x02, 0x01, 0x37, 0x00}, {0x09, 0x01, 0x37, 0x00},[m
[31m-        {0x17, 0x01, 0x37, 0x00}, {0x28, 0x01, 0x37, 0x01},[m
[31m-        {0x02, 0x01, 0x38, 0x00}, {0x09, 0x01, 0x38, 0x00},[m
[31m-        {0x17, 0x01, 0x38, 0x00}, {0x28, 0x01, 0x38, 0x01},[m
[31m-        {0x02, 0x01, 0x39, 0x00}, {0x09, 0x01, 0x39, 0x00},[m
[31m-        {0x17, 0x01, 0x39, 0x00}, {0x28, 0x01, 0x39, 0x01}[m
[31m-    },[m
[31m-    /* 20 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x36, 0x00}, {0x06, 0x01, 0x36, 0x00},[m
[31m-        {0x0a, 0x01, 0x36, 0x00}, {0x0f, 0x01, 0x36, 0x00},[m
[31m-        {0x18, 0x01, 0x36, 0x00}, {0x1f, 0x01, 0x36, 0x00},[m
[31m-        {0x29, 0x01, 0x36, 0x00}, {0x38, 0x01, 0x36, 0x01},[m
[31m-        {0x03, 0x01, 0x37, 0x00}, {0x06, 0x01, 0x37, 0x00},[m
[31m-        {0x0a, 0x01, 0x37, 0x00}, {0x0f, 0x01, 0x37, 0x00},[m
[31m-        {0x18, 0x01, 0x37, 0x00}, {0x1f, 0x01, 0x37, 0x00},[m
[31m-        {0x29, 0x01, 0x37, 0x00}, {0x38, 0x01, 0x37, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x38, 0x00}, {0x06, 0x01, 0x38, 0x00},[m
[31m-        {0x0a, 0x01, 0x38, 0x00}, {0x0f, 0x01, 0x38, 0x00},[m
[31m-        {0x18, 0x01, 0x38, 0x00}, {0x1f, 0x01, 0x38, 0x00},[m
[31m-        {0x29, 0x01, 0x38, 0x00}, {0x38, 0x01, 0x38, 0x01},[m
[31m-        {0x03, 0x01, 0x39, 0x00}, {0x06, 0x01, 0x39, 0x00},[m
[31m-        {0x0a, 0x01, 0x39, 0x00}, {0x0f, 0x01, 0x39, 0x00},[m
[31m-        {0x18, 0x01, 0x39, 0x00}, {0x1f, 0x01, 0x39, 0x00},[m
[31m-        {0x29, 0x01, 0x39, 0x00}, {0x38, 0x01, 0x39, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x1a, 0x00, 0x00, 0x00}, {0x1b, 0x00, 0x00, 0x00},[m
[31m-        {0x1d, 0x00, 0x00, 0x00}, {0x1e, 0x00, 0x00, 0x00},[m
[31m-        {0x21, 0x00, 0x00, 0x00}, {0x22, 0x00, 0x00, 0x00},[m
[31m-        {0x24, 0x00, 0x00, 0x00}, {0x25, 0x00, 0x00, 0x00},[m
[31m-        {0x2b, 0x00, 0x00, 0x00}, {0x2e, 0x00, 0x00, 0x00},[m
[31m-        {0x32, 0x00, 0x00, 0x00}, {0x35, 0x00, 0x00, 0x00},[m
[31m-        {0x3a, 0x00, 0x00, 0x00}, {0x3d, 0x00, 0x00, 0x00},[m
[31m-        {0x41, 0x00, 0x00, 0x00}, {0x44, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x3d, 0x01}, {0x00, 0x01, 0x41, 0x01},[m
[31m-        {0x00, 0x01, 0x5f, 0x01}, {0x00, 0x01, 0x62, 0x01},[m
[31m-        {0x00, 0x01, 0x64, 0x01}, {0x00, 0x01, 0x66, 0x01},[m
[31m-        {0x00, 0x01, 0x67, 0x01}, {0x00, 0x01, 0x68, 0x01},[m
[31m-        {0x00, 0x01, 0x6c, 0x01}, {0x00, 0x01, 0x6d, 0x01},[m
[31m-        {0x00, 0x01, 0x6e, 0x01}, {0x00, 0x01, 0x70, 0x01},[m
[31m-        {0x00, 0x01, 0x72, 0x01}, {0x00, 0x01, 0x75, 0x01},[m
[31m-        {0x26, 0x00, 0x00, 0x00}, {0x27, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x3d, 0x00}, {0x16, 0x01, 0x3d, 0x01},[m
[31m-        {0x01, 0x01, 0x41, 0x00}, {0x16, 0x01, 0x41, 0x01},[m
[31m-        {0x01, 0x01, 0x5f, 0x00}, {0x16, 0x01, 0x5f, 0x01},[m
[31m-        {0x01, 0x01, 0x62, 0x00}, {0x16, 0x01, 0x62, 0x01},[m
[31m-        {0x01, 0x01, 0x64, 0x00}, {0x16, 0x01, 0x64, 0x01},[m
[31m-        {0x01, 0x01, 0x66, 0x00}, {0x16, 0x01, 0x66, 0x01},[m
[31m-        {0x01, 0x01, 0x67, 0x00}, {0x16, 0x01, 0x67, 0x01},[m
[31m-        {0x01, 0x01, 0x68, 0x00}, {0x16, 0x01, 0x68, 0x01}[m
[31m-    },[m
[31m-    /* 25 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x3d, 0x00}, {0x09, 0x01, 0x3d, 0x00},[m
[31m-        {0x17, 0x01, 0x3d, 0x00}, {0x28, 0x01, 0x3d, 0x01},[m
[31m-        {0x02, 0x01, 0x41, 0x00}, {0x09, 0x01, 0x41, 0x00},[m
[31m-        {0x17, 0x01, 0x41, 0x00}, {0x28, 0x01, 0x41, 0x01},[m
[31m-        {0x02, 0x01, 0x5f, 0x00}, {0x09, 0x01, 0x5f, 0x00},[m
[31m-        {0x17, 0x01, 0x5f, 0x00}, {0x28, 0x01, 0x5f, 0x01},[m
[31m-        {0x02, 0x01, 0x62, 0x00}, {0x09, 0x01, 0x62, 0x00},[m
[31m-        {0x17, 0x01, 0x62, 0x00}, {0x28, 0x01, 0x62, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x3d, 0x00}, {0x06, 0x01, 0x3d, 0x00},[m
[31m-        {0x0a, 0x01, 0x3d, 0x00}, {0x0f, 0x01, 0x3d, 0x00},[m
[31m-        {0x18, 0x01, 0x3d, 0x00}, {0x1f, 0x01, 0x3d, 0x00},[m
[31m-        {0x29, 0x01, 0x3d, 0x00}, {0x38, 0x01, 0x3d, 0x01},[m
[31m-        {0x03, 0x01, 0x41, 0x00}, {0x06, 0x01, 0x41, 0x00},[m
[31m-        {0x0a, 0x01, 0x41, 0x00}, {0x0f, 0x01, 0x41, 0x00},[m
[31m-        {0x18, 0x01, 0x41, 0x00}, {0x1f, 0x01, 0x41, 0x00},[m
[31m-        {0x29, 0x01, 0x41, 0x00}, {0x38, 0x01, 0x41, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x5f, 0x00}, {0x06, 0x01, 0x5f, 0x00},[m
[31m-        {0x0a, 0x01, 0x5f, 0x00}, {0x0f, 0x01, 0x5f, 0x00},[m
[31m-        {0x18, 0x01, 0x5f, 0x00}, {0x1f, 0x01, 0x5f, 0x00},[m
[31m-        {0x29, 0x01, 0x5f, 0x00}, {0x38, 0x01, 0x5f, 0x01},[m
[31m-        {0x03, 0x01, 0x62, 0x00}, {0x06, 0x01, 0x62, 0x00},[m
[31m-        {0x0a, 0x01, 0x62, 0x00}, {0x0f, 0x01, 0x62, 0x00},[m
[31m-        {0x18, 0x01, 0x62, 0x00}, {0x1f, 0x01, 0x62, 0x00},[m
[31m-        {0x29, 0x01, 0x62, 0x00}, {0x38, 0x01, 0x62, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x64, 0x00}, {0x09, 0x01, 0x64, 0x00},[m
[31m-        {0x17, 0x01, 0x64, 0x00}, {0x28, 0x01, 0x64, 0x01},[m
[31m-        {0x02, 0x01, 0x66, 0x00}, {0x09, 0x01, 0x66, 0x00},[m
[31m-        {0x17, 0x01, 0x66, 0x00}, {0x28, 0x01, 0x66, 0x01},[m
[31m-        {0x02, 0x01, 0x67, 0x00}, {0x09, 0x01, 0x67, 0x00},[m
[31m-        {0x17, 0x01, 0x67, 0x00}, {0x28, 0x01, 0x67, 0x01},[m
[31m-        {0x02, 0x01, 0x68, 0x00}, {0x09, 0x01, 0x68, 0x00},[m
[31m-        {0x17, 0x01, 0x68, 0x00}, {0x28, 0x01, 0x68, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x64, 0x00}, {0x06, 0x01, 0x64, 0x00},[m
[31m-        {0x0a, 0x01, 0x64, 0x00}, {0x0f, 0x01, 0x64, 0x00},[m
[31m-        {0x18, 0x01, 0x64, 0x00}, {0x1f, 0x01, 0x64, 0x00},[m
[31m-        {0x29, 0x01, 0x64, 0x00}, {0x38, 0x01, 0x64, 0x01},[m
[31m-        {0x03, 0x01, 0x66, 0x00}, {0x06, 0x01, 0x66, 0x00},[m
[31m-        {0x0a, 0x01, 0x66, 0x00}, {0x0f, 0x01, 0x66, 0x00},[m
[31m-        {0x18, 0x01, 0x66, 0x00}, {0x1f, 0x01, 0x66, 0x00},[m
[31m-        {0x29, 0x01, 0x66, 0x00}, {0x38, 0x01, 0x66, 0x01}[m
[31m-    },[m
[31m-    /* 30 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x67, 0x00}, {0x06, 0x01, 0x67, 0x00},[m
[31m-        {0x0a, 0x01, 0x67, 0x00}, {0x0f, 0x01, 0x67, 0x00},[m
[31m-        {0x18, 0x01, 0x67, 0x00}, {0x1f, 0x01, 0x67, 0x00},[m
[31m-        {0x29, 0x01, 0x67, 0x00}, {0x38, 0x01, 0x67, 0x01},[m
[31m-        {0x03, 0x01, 0x68, 0x00}, {0x06, 0x01, 0x68, 0x00},[m
[31m-        {0x0a, 0x01, 0x68, 0x00}, {0x0f, 0x01, 0x68, 0x00},[m
[31m-        {0x18, 0x01, 0x68, 0x00}, {0x1f, 0x01, 0x68, 0x00},[m
[31m-        {0x29, 0x01, 0x68, 0x00}, {0x38, 0x01, 0x68, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x6c, 0x00}, {0x16, 0x01, 0x6c, 0x01},[m
[31m-        {0x01, 0x01, 0x6d, 0x00}, {0x16, 0x01, 0x6d, 0x01},[m
[31m-        {0x01, 0x01, 0x6e, 0x00}, {0x16, 0x01, 0x6e, 0x01},[m
[31m-        {0x01, 0x01, 0x70, 0x00}, {0x16, 0x01, 0x70, 0x01},[m
[31m-        {0x01, 0x01, 0x72, 0x00}, {0x16, 0x01, 0x72, 0x01},[m
[31m-        {0x01, 0x01, 0x75, 0x00}, {0x16, 0x01, 0x75, 0x01},[m
[31m-        {0x00, 0x01, 0x3a, 0x01}, {0x00, 0x01, 0x42, 0x01},[m
[31m-        {0x00, 0x01, 0x43, 0x01}, {0x00, 0x01, 0x44, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x6c, 0x00}, {0x09, 0x01, 0x6c, 0x00},[m
[31m-        {0x17, 0x01, 0x6c, 0x00}, {0x28, 0x01, 0x6c, 0x01},[m
[31m-        {0x02, 0x01, 0x6d, 0x00}, {0x09, 0x01, 0x6d, 0x00},[m
[31m-        {0x17, 0x01, 0x6d, 0x00}, {0x28, 0x01, 0x6d, 0x01},[m
[31m-        {0x02, 0x01, 0x6e, 0x00}, {0x09, 0x01, 0x6e, 0x00},[m
[31m-        {0x17, 0x01, 0x6e, 0x00}, {0x28, 0x01, 0x6e, 0x01},[m
[31m-        {0x02, 0x01, 0x70, 0x00}, {0x09, 0x01, 0x70, 0x00},[m
[31m-        {0x17, 0x01, 0x70, 0x00}, {0x28, 0x01, 0x70, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x6c, 0x00}, {0x06, 0x01, 0x6c, 0x00},[m
[31m-        {0x0a, 0x01, 0x6c, 0x00}, {0x0f, 0x01, 0x6c, 0x00},[m
[31m-        {0x18, 0x01, 0x6c, 0x00}, {0x1f, 0x01, 0x6c, 0x00},[m
[31m-        {0x29, 0x01, 0x6c, 0x00}, {0x38, 0x01, 0x6c, 0x01},[m
[31m-        {0x03, 0x01, 0x6d, 0x00}, {0x06, 0x01, 0x6d, 0x00},[m
[31m-        {0x0a, 0x01, 0x6d, 0x00}, {0x0f, 0x01, 0x6d, 0x00},[m
[31m-        {0x18, 0x01, 0x6d, 0x00}, {0x1f, 0x01, 0x6d, 0x00},[m
[31m-        {0x29, 0x01, 0x6d, 0x00}, {0x38, 0x01, 0x6d, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x6e, 0x00}, {0x06, 0x01, 0x6e, 0x00},[m
[31m-        {0x0a, 0x01, 0x6e, 0x00}, {0x0f, 0x01, 0x6e, 0x00},[m
[31m-        {0x18, 0x01, 0x6e, 0x00}, {0x1f, 0x01, 0x6e, 0x00},[m
[31m-        {0x29, 0x01, 0x6e, 0x00}, {0x38, 0x01, 0x6e, 0x01},[m
[31m-        {0x03, 0x01, 0x70, 0x00}, {0x06, 0x01, 0x70, 0x00},[m
[31m-        {0x0a, 0x01, 0x70, 0x00}, {0x0f, 0x01, 0x70, 0x00},[m
[31m-        {0x18, 0x01, 0x70, 0x00}, {0x1f, 0x01, 0x70, 0x00},[m
[31m-        {0x29, 0x01, 0x70, 0x00}, {0x38, 0x01, 0x70, 0x01}[m
[31m-    },[m
[31m-    /* 35 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x72, 0x00}, {0x09, 0x01, 0x72, 0x00},[m
[31m-        {0x17, 0x01, 0x72, 0x00}, {0x28, 0x01, 0x72, 0x01},[m
[31m-        {0x02, 0x01, 0x75, 0x00}, {0x09, 0x01, 0x75, 0x00},[m
[31m-        {0x17, 0x01, 0x75, 0x00}, {0x28, 0x01, 0x75, 0x01},[m
[31m-        {0x01, 0x01, 0x3a, 0x00}, {0x16, 0x01, 0x3a, 0x01},[m
[31m-        {0x01, 0x01, 0x42, 0x00}, {0x16, 0x01, 0x42, 0x01},[m
[31m-        {0x01, 0x01, 0x43, 0x00}, {0x16, 0x01, 0x43, 0x01},[m
[31m-        {0x01, 0x01, 0x44, 0x00}, {0x16, 0x01, 0x44, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x72, 0x00}, {0x06, 0x01, 0x72, 0x00},[m
[31m-        {0x0a, 0x01, 0x72, 0x00}, {0x0f, 0x01, 0x72, 0x00},[m
[31m-        {0x18, 0x01, 0x72, 0x00}, {0x1f, 0x01, 0x72, 0x00},[m
[31m-        {0x29, 0x01, 0x72, 0x00}, {0x38, 0x01, 0x72, 0x01},[m
[31m-        {0x03, 0x01, 0x75, 0x00}, {0x06, 0x01, 0x75, 0x00},[m
[31m-        {0x0a, 0x01, 0x75, 0x00}, {0x0f, 0x01, 0x75, 0x00},[m
[31m-        {0x18, 0x01, 0x75, 0x00}, {0x1f, 0x01, 0x75, 0x00},[m
[31m-        {0x29, 0x01, 0x75, 0x00}, {0x38, 0x01, 0x75, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x3a, 0x00}, {0x09, 0x01, 0x3a, 0x00},[m
[31m-        {0x17, 0x01, 0x3a, 0x00}, {0x28, 0x01, 0x3a, 0x01},[m
[31m-        {0x02, 0x01, 0x42, 0x00}, {0x09, 0x01, 0x42, 0x00},[m
[31m-        {0x17, 0x01, 0x42, 0x00}, {0x28, 0x01, 0x42, 0x01},[m
[31m-        {0x02, 0x01, 0x43, 0x00}, {0x09, 0x01, 0x43, 0x00},[m
[31m-        {0x17, 0x01, 0x43, 0x00}, {0x28, 0x01, 0x43, 0x01},[m
[31m-        {0x02, 0x01, 0x44, 0x00}, {0x09, 0x01, 0x44, 0x00},[m
[31m-        {0x17, 0x01, 0x44, 0x00}, {0x28, 0x01, 0x44, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x3a, 0x00}, {0x06, 0x01, 0x3a, 0x00},[m
[31m-        {0x0a, 0x01, 0x3a, 0x00}, {0x0f, 0x01, 0x3a, 0x00},[m
[31m-        {0x18, 0x01, 0x3a, 0x00}, {0x1f, 0x01, 0x3a, 0x00},[m
[31m-        {0x29, 0x01, 0x3a, 0x00}, {0x38, 0x01, 0x3a, 0x01},[m
[31m-        {0x03, 0x01, 0x42, 0x00}, {0x06, 0x01, 0x42, 0x00},[m
[31m-        {0x0a, 0x01, 0x42, 0x00}, {0x0f, 0x01, 0x42, 0x00},[m
[31m-        {0x18, 0x01, 0x42, 0x00}, {0x1f, 0x01, 0x42, 0x00},[m
[31m-        {0x29, 0x01, 0x42, 0x00}, {0x38, 0x01, 0x42, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x43, 0x00}, {0x06, 0x01, 0x43, 0x00},[m
[31m-        {0x0a, 0x01, 0x43, 0x00}, {0x0f, 0x01, 0x43, 0x00},[m
[31m-        {0x18, 0x01, 0x43, 0x00}, {0x1f, 0x01, 0x43, 0x00},[m
[31m-        {0x29, 0x01, 0x43, 0x00}, {0x38, 0x01, 0x43, 0x01},[m
[31m-        {0x03, 0x01, 0x44, 0x00}, {0x06, 0x01, 0x44, 0x00},[m
[31m-        {0x0a, 0x01, 0x44, 0x00}, {0x0f, 0x01, 0x44, 0x00},[m
[31m-        {0x18, 0x01, 0x44, 0x00}, {0x1f, 0x01, 0x44, 0x00},[m
[31m-        {0x29, 0x01, 0x44, 0x00}, {0x38, 0x01, 0x44, 0x01}[m
[31m-    },[m
[31m-    /* 40 */[m
[31m-    {[m
[31m-        {0x2c, 0x00, 0x00, 0x00}, {0x2d, 0x00, 0x00, 0x00},[m
[31m-        {0x2f, 0x00, 0x00, 0x00}, {0x30, 0x00, 0x00, 0x00},[m
[31m-        {0x33, 0x00, 0x00, 0x00}, {0x34, 0x00, 0x00, 0x00},[m
[31m-        {0x36, 0x00, 0x00, 0x00}, {0x37, 0x00, 0x00, 0x00},[m
[31m-        {0x3b, 0x00, 0x00, 0x00}, {0x3c, 0x00, 0x00, 0x00},[m
[31m-        {0x3e, 0x00, 0x00, 0x00}, {0x3f, 0x00, 0x00, 0x00},[m
[31m-        {0x42, 0x00, 0x00, 0x00}, {0x43, 0x00, 0x00, 0x00},[m
[31m-        {0x45, 0x00, 0x00, 0x00}, {0x48, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x45, 0x01}, {0x00, 0x01, 0x46, 0x01},[m
[31m-        {0x00, 0x01, 0x47, 0x01}, {0x00, 0x01, 0x48, 0x01},[m
[31m-        {0x00, 0x01, 0x49, 0x01}, {0x00, 0x01, 0x4a, 0x01},[m
[31m-        {0x00, 0x01, 0x4b, 0x01}, {0x00, 0x01, 0x4c, 0x01},[m
[31m-        {0x00, 0x01, 0x4d, 0x01}, {0x00, 0x01, 0x4e, 0x01},[m
[31m-        {0x00, 0x01, 0x4f, 0x01}, {0x00, 0x01, 0x50, 0x01},[m
[31m-        {0x00, 0x01, 0x51, 0x01}, {0x00, 0x01, 0x52, 0x01},[m
[31m-        {0x00, 0x01, 0x53, 0x01}, {0x00, 0x01, 0x54, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x45, 0x00}, {0x16, 0x01, 0x45, 0x01},[m
[31m-        {0x01, 0x01, 0x46, 0x00}, {0x16, 0x01, 0x46, 0x01},[m
[31m-        {0x01, 0x01, 0x47, 0x00}, {0x16, 0x01, 0x47, 0x01},[m
[31m-        {0x01, 0x01, 0x48, 0x00}, {0x16, 0x01, 0x48, 0x01},[m
[31m-        {0x01, 0x01, 0x49, 0x00}, {0x16, 0x01, 0x49, 0x01},[m
[31m-        {0x01, 0x01, 0x4a, 0x00}, {0x16, 0x01, 0x4a, 0x01},[m
[31m-        {0x01, 0x01, 0x4b, 0x00}, {0x16, 0x01, 0x4b, 0x01},[m
[31m-        {0x01, 0x01, 0x4c, 0x00}, {0x16, 0x01, 0x4c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x45, 0x00}, {0x09, 0x01, 0x45, 0x00},[m
[31m-        {0x17, 0x01, 0x45, 0x00}, {0x28, 0x01, 0x45, 0x01},[m
[31m-        {0x02, 0x01, 0x46, 0x00}, {0x09, 0x01, 0x46, 0x00},[m
[31m-        {0x17, 0x01, 0x46, 0x00}, {0x28, 0x01, 0x46, 0x01},[m
[31m-        {0x02, 0x01, 0x47, 0x00}, {0x09, 0x01, 0x47, 0x00},[m
[31m-        {0x17, 0x01, 0x47, 0x00}, {0x28, 0x01, 0x47, 0x01},[m
[31m-        {0x02, 0x01, 0x48, 0x00}, {0x09, 0x01, 0x48, 0x00},[m
[31m-        {0x17, 0x01, 0x48, 0x00}, {0x28, 0x01, 0x48, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x45, 0x00}, {0x06, 0x01, 0x45, 0x00},[m
[31m-        {0x0a, 0x01, 0x45, 0x00}, {0x0f, 0x01, 0x45, 0x00},[m
[31m-        {0x18, 0x01, 0x45, 0x00}, {0x1f, 0x01, 0x45, 0x00},[m
[31m-        {0x29, 0x01, 0x45, 0x00}, {0x38, 0x01, 0x45, 0x01},[m
[31m-        {0x03, 0x01, 0x46, 0x00}, {0x06, 0x01, 0x46, 0x00},[m
[31m-        {0x0a, 0x01, 0x46, 0x00}, {0x0f, 0x01, 0x46, 0x00},[m
[31m-        {0x18, 0x01, 0x46, 0x00}, {0x1f, 0x01, 0x46, 0x00},[m
[31m-        {0x29, 0x01, 0x46, 0x00}, {0x38, 0x01, 0x46, 0x01}[m
[31m-    },[m
[31m-    /* 45 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x47, 0x00}, {0x06, 0x01, 0x47, 0x00},[m
[31m-        {0x0a, 0x01, 0x47, 0x00}, {0x0f, 0x01, 0x47, 0x00},[m
[31m-        {0x18, 0x01, 0x47, 0x00}, {0x1f, 0x01, 0x47, 0x00},[m
[31m-        {0x29, 0x01, 0x47, 0x00}, {0x38, 0x01, 0x47, 0x01},[m
[31m-        {0x03, 0x01, 0x48, 0x00}, {0x06, 0x01, 0x48, 0x00},[m
[31m-        {0x0a, 0x01, 0x48, 0x00}, {0x0f, 0x01, 0x48, 0x00},[m
[31m-        {0x18, 0x01, 0x48, 0x00}, {0x1f, 0x01, 0x48, 0x00},[m
[31m-        {0x29, 0x01, 0x48, 0x00}, {0x38, 0x01, 0x48, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x49, 0x00}, {0x09, 0x01, 0x49, 0x00},[m
[31m-        {0x17, 0x01, 0x49, 0x00}, {0x28, 0x01, 0x49, 0x01},[m
[31m-        {0x02, 0x01, 0x4a, 0x00}, {0x09, 0x01, 0x4a, 0x00},[m
[31m-        {0x17, 0x01, 0x4a, 0x00}, {0x28, 0x01, 0x4a, 0x01},[m
[31m-        {0x02, 0x01, 0x4b, 0x00}, {0x09, 0x01, 0x4b, 0x00},[m
[31m-        {0x17, 0x01, 0x4b, 0x00}, {0x28, 0x01, 0x4b, 0x01},[m
[31m-        {0x02, 0x01, 0x4c, 0x00}, {0x09, 0x01, 0x4c, 0x00},[m
[31m-        {0x17, 0x01, 0x4c, 0x00}, {0x28, 0x01, 0x4c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x49, 0x00}, {0x06, 0x01, 0x49, 0x00},[m
[31m-        {0x0a, 0x01, 0x49, 0x00}, {0x0f, 0x01, 0x49, 0x00},[m
[31m-        {0x18, 0x01, 0x49, 0x00}, {0x1f, 0x01, 0x49, 0x00},[m
[31m-        {0x29, 0x01, 0x49, 0x00}, {0x38, 0x01, 0x49, 0x01},[m
[31m-        {0x03, 0x01, 0x4a, 0x00}, {0x06, 0x01, 0x4a, 0x00},[m
[31m-        {0x0a, 0x01, 0x4a, 0x00}, {0x0f, 0x01, 0x4a, 0x00},[m
[31m-        {0x18, 0x01, 0x4a, 0x00}, {0x1f, 0x01, 0x4a, 0x00},[m
[31m-        {0x29, 0x01, 0x4a, 0x00}, {0x38, 0x01, 0x4a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x4b, 0x00}, {0x06, 0x01, 0x4b, 0x00},[m
[31m-        {0x0a, 0x01, 0x4b, 0x00}, {0x0f, 0x01, 0x4b, 0x00},[m
[31m-        {0x18, 0x01, 0x4b, 0x00}, {0x1f, 0x01, 0x4b, 0x00},[m
[31m-        {0x29, 0x01, 0x4b, 0x00}, {0x38, 0x01, 0x4b, 0x01},[m
[31m-        {0x03, 0x01, 0x4c, 0x00}, {0x06, 0x01, 0x4c, 0x00},[m
[31m-        {0x0a, 0x01, 0x4c, 0x00}, {0x0f, 0x01, 0x4c, 0x00},[m
[31m-        {0x18, 0x01, 0x4c, 0x00}, {0x1f, 0x01, 0x4c, 0x00},[m
[31m-        {0x29, 0x01, 0x4c, 0x00}, {0x38, 0x01, 0x4c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x4d, 0x00}, {0x16, 0x01, 0x4d, 0x01},[m
[31m-        {0x01, 0x01, 0x4e, 0x00}, {0x16, 0x01, 0x4e, 0x01},[m
[31m-        {0x01, 0x01, 0x4f, 0x00}, {0x16, 0x01, 0x4f, 0x01},[m
[31m-        {0x01, 0x01, 0x50, 0x00}, {0x16, 0x01, 0x50, 0x01},[m
[31m-        {0x01, 0x01, 0x51, 0x00}, {0x16, 0x01, 0x51, 0x01},[m
[31m-        {0x01, 0x01, 0x52, 0x00}, {0x16, 0x01, 0x52, 0x01},[m
[31m-        {0x01, 0x01, 0x53, 0x00}, {0x16, 0x01, 0x53, 0x01},[m
[31m-        {0x01, 0x01, 0x54, 0x00}, {0x16, 0x01, 0x54, 0x01}[m
[31m-    },[m
[31m-    /* 50 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x4d, 0x00}, {0x09, 0x01, 0x4d, 0x00},[m
[31m-        {0x17, 0x01, 0x4d, 0x00}, {0x28, 0x01, 0x4d, 0x01},[m
[31m-        {0x02, 0x01, 0x4e, 0x00}, {0x09, 0x01, 0x4e, 0x00},[m
[31m-        {0x17, 0x01, 0x4e, 0x00}, {0x28, 0x01, 0x4e, 0x01},[m
[31m-        {0x02, 0x01, 0x4f, 0x00}, {0x09, 0x01, 0x4f, 0x00},[m
[31m-        {0x17, 0x01, 0x4f, 0x00}, {0x28, 0x01, 0x4f, 0x01},[m
[31m-        {0x02, 0x01, 0x50, 0x00}, {0x09, 0x01, 0x50, 0x00},[m
[31m-        {0x17, 0x01, 0x50, 0x00}, {0x28, 0x01, 0x50, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x4d, 0x00}, {0x06, 0x01, 0x4d, 0x00},[m
[31m-        {0x0a, 0x01, 0x4d, 0x00}, {0x0f, 0x01, 0x4d, 0x00},[m
[31m-        {0x18, 0x01, 0x4d, 0x00}, {0x1f, 0x01, 0x4d, 0x00},[m
[31m-        {0x29, 0x01, 0x4d, 0x00}, {0x38, 0x01, 0x4d, 0x01},[m
[31m-        {0x03, 0x01, 0x4e, 0x00}, {0x06, 0x01, 0x4e, 0x00},[m
[31m-        {0x0a, 0x01, 0x4e, 0x00}, {0x0f, 0x01, 0x4e, 0x00},[m
[31m-        {0x18, 0x01, 0x4e, 0x00}, {0x1f, 0x01, 0x4e, 0x00},[m
[31m-        {0x29, 0x01, 0x4e, 0x00}, {0x38, 0x01, 0x4e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x4f, 0x00}, {0x06, 0x01, 0x4f, 0x00},[m
[31m-        {0x0a, 0x01, 0x4f, 0x00}, {0x0f, 0x01, 0x4f, 0x00},[m
[31m-        {0x18, 0x01, 0x4f, 0x00}, {0x1f, 0x01, 0x4f, 0x00},[m
[31m-        {0x29, 0x01, 0x4f, 0x00}, {0x38, 0x01, 0x4f, 0x01},[m
[31m-        {0x03, 0x01, 0x50, 0x00}, {0x06, 0x01, 0x50, 0x00},[m
[31m-        {0x0a, 0x01, 0x50, 0x00}, {0x0f, 0x01, 0x50, 0x00},[m
[31m-        {0x18, 0x01, 0x50, 0x00}, {0x1f, 0x01, 0x50, 0x00},[m
[31m-        {0x29, 0x01, 0x50, 0x00}, {0x38, 0x01, 0x50, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x51, 0x00}, {0x09, 0x01, 0x51, 0x00},[m
[31m-        {0x17, 0x01, 0x51, 0x00}, {0x28, 0x01, 0x51, 0x01},[m
[31m-        {0x02, 0x01, 0x52, 0x00}, {0x09, 0x01, 0x52, 0x00},[m
[31m-        {0x17, 0x01, 0x52, 0x00}, {0x28, 0x01, 0x52, 0x01},[m
[31m-        {0x02, 0x01, 0x53, 0x00}, {0x09, 0x01, 0x53, 0x00},[m
[31m-        {0x17, 0x01, 0x53, 0x00}, {0x28, 0x01, 0x53, 0x01},[m
[31m-        {0x02, 0x01, 0x54, 0x00}, {0x09, 0x01, 0x54, 0x00},[m
[31m-        {0x17, 0x01, 0x54, 0x00}, {0x28, 0x01, 0x54, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x51, 0x00}, {0x06, 0x01, 0x51, 0x00},[m
[31m-        {0x0a, 0x01, 0x51, 0x00}, {0x0f, 0x01, 0x51, 0x00},[m
[31m-        {0x18, 0x01, 0x51, 0x00}, {0x1f, 0x01, 0x51, 0x00},[m
[31m-        {0x29, 0x01, 0x51, 0x00}, {0x38, 0x01, 0x51, 0x01},[m
[31m-        {0x03, 0x01, 0x52, 0x00}, {0x06, 0x01, 0x52, 0x00},[m
[31m-        {0x0a, 0x01, 0x52, 0x00}, {0x0f, 0x01, 0x52, 0x00},[m
[31m-        {0x18, 0x01, 0x52, 0x00}, {0x1f, 0x01, 0x52, 0x00},[m
[31m-        {0x29, 0x01, 0x52, 0x00}, {0x38, 0x01, 0x52, 0x01}[m
[31m-    },[m
[31m-    /* 55 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x53, 0x00}, {0x06, 0x01, 0x53, 0x00},[m
[31m-        {0x0a, 0x01, 0x53, 0x00}, {0x0f, 0x01, 0x53, 0x00},[m
[31m-        {0x18, 0x01, 0x53, 0x00}, {0x1f, 0x01, 0x53, 0x00},[m
[31m-        {0x29, 0x01, 0x53, 0x00}, {0x38, 0x01, 0x53, 0x01},[m
[31m-        {0x03, 0x01, 0x54, 0x00}, {0x06, 0x01, 0x54, 0x00},[m
[31m-        {0x0a, 0x01, 0x54, 0x00}, {0x0f, 0x01, 0x54, 0x00},[m
[31m-        {0x18, 0x01, 0x54, 0x00}, {0x1f, 0x01, 0x54, 0x00},[m
[31m-        {0x29, 0x01, 0x54, 0x00}, {0x38, 0x01, 0x54, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x55, 0x01}, {0x00, 0x01, 0x56, 0x01},[m
[31m-        {0x00, 0x01, 0x57, 0x01}, {0x00, 0x01, 0x59, 0x01},[m
[31m-        {0x00, 0x01, 0x6a, 0x01}, {0x00, 0x01, 0x6b, 0x01},[m
[31m-        {0x00, 0x01, 0x71, 0x01}, {0x00, 0x01, 0x76, 0x01},[m
[31m-        {0x00, 0x01, 0x77, 0x01}, {0x00, 0x01, 0x78, 0x01},[m
[31m-        {0x00, 0x01, 0x79, 0x01}, {0x00, 0x01, 0x7a, 0x01},[m
[31m-        {0x46, 0x00, 0x00, 0x00}, {0x47, 0x00, 0x00, 0x00},[m
[31m-        {0x49, 0x00, 0x00, 0x00}, {0x4a, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x55, 0x00}, {0x16, 0x01, 0x55, 0x01},[m
[31m-        {0x01, 0x01, 0x56, 0x00}, {0x16, 0x01, 0x56, 0x01},[m
[31m-        {0x01, 0x01, 0x57, 0x00}, {0x16, 0x01, 0x57, 0x01},[m
[31m-        {0x01, 0x01, 0x59, 0x00}, {0x16, 0x01, 0x59, 0x01},[m
[31m-        {0x01, 0x01, 0x6a, 0x00}, {0x16, 0x01, 0x6a, 0x01},[m
[31m-        {0x01, 0x01, 0x6b, 0x00}, {0x16, 0x01, 0x6b, 0x01},[m
[31m-        {0x01, 0x01, 0x71, 0x00}, {0x16, 0x01, 0x71, 0x01},[m
[31m-        {0x01, 0x01, 0x76, 0x00}, {0x16, 0x01, 0x76, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x55, 0x00}, {0x09, 0x01, 0x55, 0x00},[m
[31m-        {0x17, 0x01, 0x55, 0x00}, {0x28, 0x01, 0x55, 0x01},[m
[31m-        {0x02, 0x01, 0x56, 0x00}, {0x09, 0x01, 0x56, 0x00},[m
[31m-        {0x17, 0x01, 0x56, 0x00}, {0x28, 0x01, 0x56, 0x01},[m
[31m-        {0x02, 0x01, 0x57, 0x00}, {0x09, 0x01, 0x57, 0x00},[m
[31m-        {0x17, 0x01, 0x57, 0x00}, {0x28, 0x01, 0x57, 0x01},[m
[31m-        {0x02, 0x01, 0x59, 0x00}, {0x09, 0x01, 0x59, 0x00},[m
[31m-        {0x17, 0x01, 0x59, 0x00}, {0x28, 0x01, 0x59, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x55, 0x00}, {0x06, 0x01, 0x55, 0x00},[m
[31m-        {0x0a, 0x01, 0x55, 0x00}, {0x0f, 0x01, 0x55, 0x00},[m
[31m-        {0x18, 0x01, 0x55, 0x00}, {0x1f, 0x01, 0x55, 0x00},[m
[31m-        {0x29, 0x01, 0x55, 0x00}, {0x38, 0x01, 0x55, 0x01},[m
[31m-        {0x03, 0x01, 0x56, 0x00}, {0x06, 0x01, 0x56, 0x00},[m
[31m-        {0x0a, 0x01, 0x56, 0x00}, {0x0f, 0x01, 0x56, 0x00},[m
[31m-        {0x18, 0x01, 0x56, 0x00}, {0x1f, 0x01, 0x56, 0x00},[m
[31m-        {0x29, 0x01, 0x56, 0x00}, {0x38, 0x01, 0x56, 0x01}[m
[31m-    },[m
[31m-    /* 60 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x57, 0x00}, {0x06, 0x01, 0x57, 0x00},[m
[31m-        {0x0a, 0x01, 0x57, 0x00}, {0x0f, 0x01, 0x57, 0x00},[m
[31m-        {0x18, 0x01, 0x57, 0x00}, {0x1f, 0x01, 0x57, 0x00},[m
[31m-        {0x29, 0x01, 0x57, 0x00}, {0x38, 0x01, 0x57, 0x01},[m
[31m-        {0x03, 0x01, 0x59, 0x00}, {0x06, 0x01, 0x59, 0x00},[m
[31m-        {0x0a, 0x01, 0x59, 0x00}, {0x0f, 0x01, 0x59, 0x00},[m
[31m-        {0x18, 0x01, 0x59, 0x00}, {0x1f, 0x01, 0x59, 0x00},[m
[31m-        {0x29, 0x01, 0x59, 0x00}, {0x38, 0x01, 0x59, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x6a, 0x00}, {0x09, 0x01, 0x6a, 0x00},[m
[31m-        {0x17, 0x01, 0x6a, 0x00}, {0x28, 0x01, 0x6a, 0x01},[m
[31m-        {0x02, 0x01, 0x6b, 0x00}, {0x09, 0x01, 0x6b, 0x00},[m
[31m-        {0x17, 0x01, 0x6b, 0x00}, {0x28, 0x01, 0x6b, 0x01},[m
[31m-        {0x02, 0x01, 0x71, 0x00}, {0x09, 0x01, 0x71, 0x00},[m
[31m-        {0x17, 0x01, 0x71, 0x00}, {0x28, 0x01, 0x71, 0x01},[m
[31m-        {0x02, 0x01, 0x76, 0x00}, {0x09, 0x01, 0x76, 0x00},[m
[31m-        {0x17, 0x01, 0x76, 0x00}, {0x28, 0x01, 0x76, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x6a, 0x00}, {0x06, 0x01, 0x6a, 0x00},[m
[31m-        {0x0a, 0x01, 0x6a, 0x00}, {0x0f, 0x01, 0x6a, 0x00},[m
[31m-        {0x18, 0x01, 0x6a, 0x00}, {0x1f, 0x01, 0x6a, 0x00},[m
[31m-        {0x29, 0x01, 0x6a, 0x00}, {0x38, 0x01, 0x6a, 0x01},[m
[31m-        {0x03, 0x01, 0x6b, 0x00}, {0x06, 0x01, 0x6b, 0x00},[m
[31m-        {0x0a, 0x01, 0x6b, 0x00}, {0x0f, 0x01, 0x6b, 0x00},[m
[31m-        {0x18, 0x01, 0x6b, 0x00}, {0x1f, 0x01, 0x6b, 0x00},[m
[31m-        {0x29, 0x01, 0x6b, 0x00}, {0x38, 0x01, 0x6b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x71, 0x00}, {0x06, 0x01, 0x71, 0x00},[m
[31m-        {0x0a, 0x01, 0x71, 0x00}, {0x0f, 0x01, 0x71, 0x00},[m
[31m-        {0x18, 0x01, 0x71, 0x00}, {0x1f, 0x01, 0x71, 0x00},[m
[31m-        {0x29, 0x01, 0x71, 0x00}, {0x38, 0x01, 0x71, 0x01},[m
[31m-        {0x03, 0x01, 0x76, 0x00}, {0x06, 0x01, 0x76, 0x00},[m
[31m-        {0x0a, 0x01, 0x76, 0x00}, {0x0f, 0x01, 0x76, 0x00},[m
[31m-        {0x18, 0x01, 0x76, 0x00}, {0x1f, 0x01, 0x76, 0x00},[m
[31m-        {0x29, 0x01, 0x76, 0x00}, {0x38, 0x01, 0x76, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x77, 0x00}, {0x16, 0x01, 0x77, 0x01},[m
[31m-        {0x01, 0x01, 0x78, 0x00}, {0x16, 0x01, 0x78, 0x01},[m
[31m-        {0x01, 0x01, 0x79, 0x00}, {0x16, 0x01, 0x79, 0x01},[m
[31m-        {0x01, 0x01, 0x7a, 0x00}, {0x16, 0x01, 0x7a, 0x01},[m
[31m-        {0x00, 0x01, 0x26, 0x01}, {0x00, 0x01, 0x2a, 0x01},[m
[31m-        {0x00, 0x01, 0x2c, 0x01}, {0x00, 0x01, 0x3b, 0x01},[m
[31m-        {0x00, 0x01, 0x58, 0x01}, {0x00, 0x01, 0x5a, 0x01},[m
[31m-        {0x4b, 0x00, 0x00, 0x00}, {0x4e, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 65 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x77, 0x00}, {0x09, 0x01, 0x77, 0x00},[m
[31m-        {0x17, 0x01, 0x77, 0x00}, {0x28, 0x01, 0x77, 0x01},[m
[31m-        {0x02, 0x01, 0x78, 0x00}, {0x09, 0x01, 0x78, 0x00},[m
[31m-        {0x17, 0x01, 0x78, 0x00}, {0x28, 0x01, 0x78, 0x01},[m
[31m-        {0x02, 0x01, 0x79, 0x00}, {0x09, 0x01, 0x79, 0x00},[m
[31m-        {0x17, 0x01, 0x79, 0x00}, {0x28, 0x01, 0x79, 0x01},[m
[31m-        {0x02, 0x01, 0x7a, 0x00}, {0x09, 0x01, 0x7a, 0x00},[m
[31m-        {0x17, 0x01, 0x7a, 0x00}, {0x28, 0x01, 0x7a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x77, 0x00}, {0x06, 0x01, 0x77, 0x00},[m
[31m-        {0x0a, 0x01, 0x77, 0x00}, {0x0f, 0x01, 0x77, 0x00},[m
[31m-        {0x18, 0x01, 0x77, 0x00}, {0x1f, 0x01, 0x77, 0x00},[m
[31m-        {0x29, 0x01, 0x77, 0x00}, {0x38, 0x01, 0x77, 0x01},[m
[31m-        {0x03, 0x01, 0x78, 0x00}, {0x06, 0x01, 0x78, 0x00},[m
[31m-        {0x0a, 0x01, 0x78, 0x00}, {0x0f, 0x01, 0x78, 0x00},[m
[31m-        {0x18, 0x01, 0x78, 0x00}, {0x1f, 0x01, 0x78, 0x00},[m
[31m-        {0x29, 0x01, 0x78, 0x00}, {0x38, 0x01, 0x78, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x79, 0x00}, {0x06, 0x01, 0x79, 0x00},[m
[31m-        {0x0a, 0x01, 0x79, 0x00}, {0x0f, 0x01, 0x79, 0x00},[m
[31m-        {0x18, 0x01, 0x79, 0x00}, {0x1f, 0x01, 0x79, 0x00},[m
[31m-        {0x29, 0x01, 0x79, 0x00}, {0x38, 0x01, 0x79, 0x01},[m
[31m-        {0x03, 0x01, 0x7a, 0x00}, {0x06, 0x01, 0x7a, 0x00},[m
[31m-        {0x0a, 0x01, 0x7a, 0x00}, {0x0f, 0x01, 0x7a, 0x00},[m
[31m-        {0x18, 0x01, 0x7a, 0x00}, {0x1f, 0x01, 0x7a, 0x00},[m
[31m-        {0x29, 0x01, 0x7a, 0x00}, {0x38, 0x01, 0x7a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x26, 0x00}, {0x16, 0x01, 0x26, 0x01},[m
[31m-        {0x01, 0x01, 0x2a, 0x00}, {0x16, 0x01, 0x2a, 0x01},[m
[31m-        {0x01, 0x01, 0x2c, 0x00}, {0x16, 0x01, 0x2c, 0x01},[m
[31m-        {0x01, 0x01, 0x3b, 0x00}, {0x16, 0x01, 0x3b, 0x01},[m
[31m-        {0x01, 0x01, 0x58, 0x00}, {0x16, 0x01, 0x58, 0x01},[m
[31m-        {0x01, 0x01, 0x5a, 0x00}, {0x16, 0x01, 0x5a, 0x01},[m
[31m-        {0x4c, 0x00, 0x00, 0x00}, {0x4d, 0x00, 0x00, 0x00},[m
[31m-        {0x4f, 0x00, 0x00, 0x00}, {0x51, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x26, 0x00}, {0x09, 0x01, 0x26, 0x00},[m
[31m-        {0x17, 0x01, 0x26, 0x00}, {0x28, 0x01, 0x26, 0x01},[m
[31m-        {0x02, 0x01, 0x2a, 0x00}, {0x09, 0x01, 0x2a, 0x00},[m
[31m-        {0x17, 0x01, 0x2a, 0x00}, {0x28, 0x01, 0x2a, 0x01},[m
[31m-        {0x02, 0x01, 0x2c, 0x00}, {0x09, 0x01, 0x2c, 0x00},[m
[31m-        {0x17, 0x01, 0x2c, 0x00}, {0x28, 0x01, 0x2c, 0x01},[m
[31m-        {0x02, 0x01, 0x3b, 0x00}, {0x09, 0x01, 0x3b, 0x00},[m
[31m-        {0x17, 0x01, 0x3b, 0x00}, {0x28, 0x01, 0x3b, 0x01}[m
[31m-    },[m
[31m-    /* 70 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x26, 0x00}, {0x06, 0x01, 0x26, 0x00},[m
[31m-        {0x0a, 0x01, 0x26, 0x00}, {0x0f, 0x01, 0x26, 0x00},[m
[31m-        {0x18, 0x01, 0x26, 0x00}, {0x1f, 0x01, 0x26, 0x00},[m
[31m-        {0x29, 0x01, 0x26, 0x00}, {0x38, 0x01, 0x26, 0x01},[m
[31m-        {0x03, 0x01, 0x2a, 0x00}, {0x06, 0x01, 0x2a, 0x00},[m
[31m-        {0x0a, 0x01, 0x2a, 0x00}, {0x0f, 0x01, 0x2a, 0x00},[m
[31m-        {0x18, 0x01, 0x2a, 0x00}, {0x1f, 0x01, 0x2a, 0x00},[m
[31m-        {0x29, 0x01, 0x2a, 0x00}, {0x38, 0x01, 0x2a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x2c, 0x00}, {0x06, 0x01, 0x2c, 0x00},[m
[31m-        {0x0a, 0x01, 0x2c, 0x00}, {0x0f, 0x01, 0x2c, 0x00},[m
[31m-        {0x18, 0x01, 0x2c, 0x00}, {0x1f, 0x01, 0x2c, 0x00},[m
[31m-        {0x29, 0x01, 0x2c, 0x00}, {0x38, 0x01, 0x2c, 0x01},[m
[31m-        {0x03, 0x01, 0x3b, 0x00}, {0x06, 0x01, 0x3b, 0x00},[m
[31m-        {0x0a, 0x01, 0x3b, 0x00}, {0x0f, 0x01, 0x3b, 0x00},[m
[31m-        {0x18, 0x01, 0x3b, 0x00}, {0x1f, 0x01, 0x3b, 0x00},[m
[31m-        {0x29, 0x01, 0x3b, 0x00}, {0x38, 0x01, 0x3b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x58, 0x00}, {0x09, 0x01, 0x58, 0x00},[m
[31m-        {0x17, 0x01, 0x58, 0x00}, {0x28, 0x01, 0x58, 0x01},[m
[31m-        {0x02, 0x01, 0x5a, 0x00}, {0x09, 0x01, 0x5a, 0x00},[m
[31m-        {0x17, 0x01, 0x5a, 0x00}, {0x28, 0x01, 0x5a, 0x01},[m
[31m-        {0x00, 0x01, 0x21, 0x01}, {0x00, 0x01, 0x22, 0x01},[m
[31m-        {0x00, 0x01, 0x28, 0x01}, {0x00, 0x01, 0x29, 0x01},[m
[31m-        {0x00, 0x01, 0x3f, 0x01}, {0x50, 0x00, 0x00, 0x00},[m
[31m-        {0x52, 0x00, 0x00, 0x00}, {0x54, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x58, 0x00}, {0x06, 0x01, 0x58, 0x00},[m
[31m-        {0x0a, 0x01, 0x58, 0x00}, {0x0f, 0x01, 0x58, 0x00},[m
[31m-        {0x18, 0x01, 0x58, 0x00}, {0x1f, 0x01, 0x58, 0x00},[m
[31m-        {0x29, 0x01, 0x58, 0x00}, {0x38, 0x01, 0x58, 0x01},[m
[31m-        {0x03, 0x01, 0x5a, 0x00}, {0x06, 0x01, 0x5a, 0x00},[m
[31m-        {0x0a, 0x01, 0x5a, 0x00}, {0x0f, 0x01, 0x5a, 0x00},[m
[31m-        {0x18, 0x01, 0x5a, 0x00}, {0x1f, 0x01, 0x5a, 0x00},[m
[31m-        {0x29, 0x01, 0x5a, 0x00}, {0x38, 0x01, 0x5a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x21, 0x00}, {0x16, 0x01, 0x21, 0x01},[m
[31m-        {0x01, 0x01, 0x22, 0x00}, {0x16, 0x01, 0x22, 0x01},[m
[31m-        {0x01, 0x01, 0x28, 0x00}, {0x16, 0x01, 0x28, 0x01},[m
[31m-        {0x01, 0x01, 0x29, 0x00}, {0x16, 0x01, 0x29, 0x01},[m
[31m-        {0x01, 0x01, 0x3f, 0x00}, {0x16, 0x01, 0x3f, 0x01},[m
[31m-        {0x00, 0x01, 0x27, 0x01}, {0x00, 0x01, 0x2b, 0x01},[m
[31m-        {0x00, 0x01, 0x7c, 0x01}, {0x53, 0x00, 0x00, 0x00},[m
[31m-        {0x55, 0x00, 0x00, 0x00}, {0x58, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 75 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x21, 0x00}, {0x09, 0x01, 0x21, 0x00},[m
[31m-        {0x17, 0x01, 0x21, 0x00}, {0x28, 0x01, 0x21, 0x01},[m
[31m-        {0x02, 0x01, 0x22, 0x00}, {0x09, 0x01, 0x22, 0x00},[m
[31m-        {0x17, 0x01, 0x22, 0x00}, {0x28, 0x01, 0x22, 0x01},[m
[31m-        {0x02, 0x01, 0x28, 0x00}, {0x09, 0x01, 0x28, 0x00},[m
[31m-        {0x17, 0x01, 0x28, 0x00}, {0x28, 0x01, 0x28, 0x01},[m
[31m-        {0x02, 0x01, 0x29, 0x00}, {0x09, 0x01, 0x29, 0x00},[m
[31m-        {0x17, 0x01, 0x29, 0x00}, {0x28, 0x01, 0x29, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x21, 0x00}, {0x06, 0x01, 0x21, 0x00},[m
[31m-        {0x0a, 0x01, 0x21, 0x00}, {0x0f, 0x01, 0x21, 0x00},[m
[31m-        {0x18, 0x01, 0x21, 0x00}, {0x1f, 0x01, 0x21, 0x00},[m
[31m-        {0x29, 0x01, 0x21, 0x00}, {0x38, 0x01, 0x21, 0x01},[m
[31m-        {0x03, 0x01, 0x22, 0x00}, {0x06, 0x01, 0x22, 0x00},[m
[31m-        {0x0a, 0x01, 0x22, 0x00}, {0x0f, 0x01, 0x22, 0x00},[m
[31m-        {0x18, 0x01, 0x22, 0x00}, {0x1f, 0x01, 0x22, 0x00},[m
[31m-        {0x29, 0x01, 0x22, 0x00}, {0x38, 0x01, 0x22, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x28, 0x00}, {0x06, 0x01, 0x28, 0x00},[m
[31m-        {0x0a, 0x01, 0x28, 0x00}, {0x0f, 0x01, 0x28, 0x00},[m
[31m-        {0x18, 0x01, 0x28, 0x00}, {0x1f, 0x01, 0x28, 0x00},[m
[31m-        {0x29, 0x01, 0x28, 0x00}, {0x38, 0x01, 0x28, 0x01},[m
[31m-        {0x03, 0x01, 0x29, 0x00}, {0x06, 0x01, 0x29, 0x00},[m
[31m-        {0x0a, 0x01, 0x29, 0x00}, {0x0f, 0x01, 0x29, 0x00},[m
[31m-        {0x18, 0x01, 0x29, 0x00}, {0x1f, 0x01, 0x29, 0x00},[m
[31m-        {0x29, 0x01, 0x29, 0x00}, {0x38, 0x01, 0x29, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x3f, 0x00}, {0x09, 0x01, 0x3f, 0x00},[m
[31m-        {0x17, 0x01, 0x3f, 0x00}, {0x28, 0x01, 0x3f, 0x01},[m
[31m-        {0x01, 0x01, 0x27, 0x00}, {0x16, 0x01, 0x27, 0x01},[m
[31m-        {0x01, 0x01, 0x2b, 0x00}, {0x16, 0x01, 0x2b, 0x01},[m
[31m-        {0x01, 0x01, 0x7c, 0x00}, {0x16, 0x01, 0x7c, 0x01},[m
[31m-        {0x00, 0x01, 0x23, 0x01}, {0x00, 0x01, 0x3e, 0x01},[m
[31m-        {0x56, 0x00, 0x00, 0x00}, {0x57, 0x00, 0x00, 0x00},[m
[31m-        {0x59, 0x00, 0x00, 0x00}, {0x5a, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x3f, 0x00}, {0x06, 0x01, 0x3f, 0x00},[m
[31m-        {0x0a, 0x01, 0x3f, 0x00}, {0x0f, 0x01, 0x3f, 0x00},[m
[31m-        {0x18, 0x01, 0x3f, 0x00}, {0x1f, 0x01, 0x3f, 0x00},[m
[31m-        {0x29, 0x01, 0x3f, 0x00}, {0x38, 0x01, 0x3f, 0x01},[m
[31m-        {0x02, 0x01, 0x27, 0x00}, {0x09, 0x01, 0x27, 0x00},[m
[31m-        {0x17, 0x01, 0x27, 0x00}, {0x28, 0x01, 0x27, 0x01},[m
[31m-        {0x02, 0x01, 0x2b, 0x00}, {0x09, 0x01, 0x2b, 0x00},[m
[31m-        {0x17, 0x01, 0x2b, 0x00}, {0x28, 0x01, 0x2b, 0x01}[m
[31m-    },[m
[31m-    /* 80 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x27, 0x00}, {0x06, 0x01, 0x27, 0x00},[m
[31m-        {0x0a, 0x01, 0x27, 0x00}, {0x0f, 0x01, 0x27, 0x00},[m
[31m-        {0x18, 0x01, 0x27, 0x00}, {0x1f, 0x01, 0x27, 0x00},[m
[31m-        {0x29, 0x01, 0x27, 0x00}, {0x38, 0x01, 0x27, 0x01},[m
[31m-        {0x03, 0x01, 0x2b, 0x00}, {0x06, 0x01, 0x2b, 0x00},[m
[31m-        {0x0a, 0x01, 0x2b, 0x00}, {0x0f, 0x01, 0x2b, 0x00},[m
[31m-        {0x18, 0x01, 0x2b, 0x00}, {0x1f, 0x01, 0x2b, 0x00},[m
[31m-        {0x29, 0x01, 0x2b, 0x00}, {0x38, 0x01, 0x2b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x7c, 0x00}, {0x09, 0x01, 0x7c, 0x00},[m
[31m-        {0x17, 0x01, 0x7c, 0x00}, {0x28, 0x01, 0x7c, 0x01},[m
[31m-        {0x01, 0x01, 0x23, 0x00}, {0x16, 0x01, 0x23, 0x01},[m
[31m-        {0x01, 0x01, 0x3e, 0x00}, {0x16, 0x01, 0x3e, 0x01},[m
[31m-        {0x00, 0x01, 0x00, 0x01}, {0x00, 0x01, 0x24, 0x01},[m
[31m-        {0x00, 0x01, 0x40, 0x01}, {0x00, 0x01, 0x5b, 0x01},[m
[31m-        {0x00, 0x01, 0x5d, 0x01}, {0x00, 0x01, 0x7e, 0x01},[m
[31m-        {0x5b, 0x00, 0x00, 0x00}, {0x5c, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x7c, 0x00}, {0x06, 0x01, 0x7c, 0x00},[m
[31m-        {0x0a, 0x01, 0x7c, 0x00}, {0x0f, 0x01, 0x7c, 0x00},[m
[31m-        {0x18, 0x01, 0x7c, 0x00}, {0x1f, 0x01, 0x7c, 0x00},[m
[31m-        {0x29, 0x01, 0x7c, 0x00}, {0x38, 0x01, 0x7c, 0x01},[m
[31m-        {0x02, 0x01, 0x23, 0x00}, {0x09, 0x01, 0x23, 0x00},[m
[31m-        {0x17, 0x01, 0x23, 0x00}, {0x28, 0x01, 0x23, 0x01},[m
[31m-        {0x02, 0x01, 0x3e, 0x00}, {0x09, 0x01, 0x3e, 0x00},[m
[31m-        {0x17, 0x01, 0x3e, 0x00}, {0x28, 0x01, 0x3e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x23, 0x00}, {0x06, 0x01, 0x23, 0x00},[m
[31m-        {0x0a, 0x01, 0x23, 0x00}, {0x0f, 0x01, 0x23, 0x00},[m
[31m-        {0x18, 0x01, 0x23, 0x00}, {0x1f, 0x01, 0x23, 0x00},[m
[31m-        {0x29, 0x01, 0x23, 0x00}, {0x38, 0x01, 0x23, 0x01},[m
[31m-        {0x03, 0x01, 0x3e, 0x00}, {0x06, 0x01, 0x3e, 0x00},[m
[31m-        {0x0a, 0x01, 0x3e, 0x00}, {0x0f, 0x01, 0x3e, 0x00},[m
[31m-        {0x18, 0x01, 0x3e, 0x00}, {0x1f, 0x01, 0x3e, 0x00},[m
[31m-        {0x29, 0x01, 0x3e, 0x00}, {0x38, 0x01, 0x3e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x00, 0x00}, {0x16, 0x01, 0x00, 0x01},[m
[31m-        {0x01, 0x01, 0x24, 0x00}, {0x16, 0x01, 0x24, 0x01},[m
[31m-        {0x01, 0x01, 0x40, 0x00}, {0x16, 0x01, 0x40, 0x01},[m
[31m-        {0x01, 0x01, 0x5b, 0x00}, {0x16, 0x01, 0x5b, 0x01},[m
[31m-        {0x01, 0x01, 0x5d, 0x00}, {0x16, 0x01, 0x5d, 0x01},[m
[31m-        {0x01, 0x01, 0x7e, 0x00}, {0x16, 0x01, 0x7e, 0x01},[m
[31m-        {0x00, 0x01, 0x5e, 0x01}, {0x00, 0x01, 0x7d, 0x01},[m
[31m-        {0x5d, 0x00, 0x00, 0x00}, {0x5e, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 85 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x00, 0x00}, {0x09, 0x01, 0x00, 0x00},[m
[31m-        {0x17, 0x01, 0x00, 0x00}, {0x28, 0x01, 0x00, 0x01},[m
[31m-        {0x02, 0x01, 0x24, 0x00}, {0x09, 0x01, 0x24, 0x00},[m
[31m-        {0x17, 0x01, 0x24, 0x00}, {0x28, 0x01, 0x24, 0x01},[m
[31m-        {0x02, 0x01, 0x40, 0x00}, {0x09, 0x01, 0x40, 0x00},[m
[31m-        {0x17, 0x01, 0x40, 0x00}, {0x28, 0x01, 0x40, 0x01},[m
[31m-        {0x02, 0x01, 0x5b, 0x00}, {0x09, 0x01, 0x5b, 0x00},[m
[31m-        {0x17, 0x01, 0x5b, 0x00}, {0x28, 0x01, 0x5b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x00, 0x00}, {0x06, 0x01, 0x00, 0x00},[m
[31m-        {0x0a, 0x01, 0x00, 0x00}, {0x0f, 0x01, 0x00, 0x00},[m
[31m-        {0x18, 0x01, 0x00, 0x00}, {0x1f, 0x01, 0x00, 0x00},[m
[31m-        {0x29, 0x01, 0x00, 0x00}, {0x38, 0x01, 0x00, 0x01},[m
[31m-        {0x03, 0x01, 0x24, 0x00}, {0x06, 0x01, 0x24, 0x00},[m
[31m-        {0x0a, 0x01, 0x24, 0x00}, {0x0f, 0x01, 0x24, 0x00},[m
[31m-        {0x18, 0x01, 0x24, 0x00}, {0x1f, 0x01, 0x24, 0x00},[m
[31m-        {0x29, 0x01, 0x24, 0x00}, {0x38, 0x01, 0x24, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x40, 0x00}, {0x06, 0x01, 0x40, 0x00},[m
[31m-        {0x0a, 0x01, 0x40, 0x00}, {0x0f, 0x01, 0x40, 0x00},[m
[31m-        {0x18, 0x01, 0x40, 0x00}, {0x1f, 0x01, 0x40, 0x00},[m
[31m-        {0x29, 0x01, 0x40, 0x00}, {0x38, 0x01, 0x40, 0x01},[m
[31m-        {0x03, 0x01, 0x5b, 0x00}, {0x06, 0x01, 0x5b, 0x00},[m
[31m-        {0x0a, 0x01, 0x5b, 0x00}, {0x0f, 0x01, 0x5b, 0x00},[m
[31m-        {0x18, 0x01, 0x5b, 0x00}, {0x1f, 0x01, 0x5b, 0x00},[m
[31m-        {0x29, 0x01, 0x5b, 0x00}, {0x38, 0x01, 0x5b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x5d, 0x00}, {0x09, 0x01, 0x5d, 0x00},[m
[31m-        {0x17, 0x01, 0x5d, 0x00}, {0x28, 0x01, 0x5d, 0x01},[m
[31m-        {0x02, 0x01, 0x7e, 0x00}, {0x09, 0x01, 0x7e, 0x00},[m
[31m-        {0x17, 0x01, 0x7e, 0x00}, {0x28, 0x01, 0x7e, 0x01},[m
[31m-        {0x01, 0x01, 0x5e, 0x00}, {0x16, 0x01, 0x5e, 0x01},[m
[31m-        {0x01, 0x01, 0x7d, 0x00}, {0x16, 0x01, 0x7d, 0x01},[m
[31m-        {0x00, 0x01, 0x3c, 0x01}, {0x00, 0x01, 0x60, 0x01},[m
[31m-        {0x00, 0x01, 0x7b, 0x01}, {0x5f, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x5d, 0x00}, {0x06, 0x01, 0x5d, 0x00},[m
[31m-        {0x0a, 0x01, 0x5d, 0x00}, {0x0f, 0x01, 0x5d, 0x00},[m
[31m-        {0x18, 0x01, 0x5d, 0x00}, {0x1f, 0x01, 0x5d, 0x00},[m
[31m-        {0x29, 0x01, 0x5d, 0x00}, {0x38, 0x01, 0x5d, 0x01},[m
[31m-        {0x03, 0x01, 0x7e, 0x00}, {0x06, 0x01, 0x7e, 0x00},[m
[31m-        {0x0a, 0x01, 0x7e, 0x00}, {0x0f, 0x01, 0x7e, 0x00},[m
[31m-        {0x18, 0x01, 0x7e, 0x00}, {0x1f, 0x01, 0x7e, 0x00},[m
[31m-        {0x29, 0x01, 0x7e, 0x00}, {0x38, 0x01, 0x7e, 0x01}[m
[31m-    },[m
[31m-    /* 90 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x5e, 0x00}, {0x09, 0x01, 0x5e, 0x00},[m
[31m-        {0x17, 0x01, 0x5e, 0x00}, {0x28, 0x01, 0x5e, 0x01},[m
[31m-        {0x02, 0x01, 0x7d, 0x00}, {0x09, 0x01, 0x7d, 0x00},[m
[31m-        {0x17, 0x01, 0x7d, 0x00}, {0x28, 0x01, 0x7d, 0x01},[m
[31m-        {0x01, 0x01, 0x3c, 0x00}, {0x16, 0x01, 0x3c, 0x01},[m
[31m-        {0x01, 0x01, 0x60, 0x00}, {0x16, 0x01, 0x60, 0x01},[m
[31m-        {0x01, 0x01, 0x7b, 0x00}, {0x16, 0x01, 0x7b, 0x01},[m
[31m-        {0x60, 0x00, 0x00, 0x00}, {0x6e, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x5e, 0x00}, {0x06, 0x01, 0x5e, 0x00},[m
[31m-        {0x0a, 0x01, 0x5e, 0x00}, {0x0f, 0x01, 0x5e, 0x00},[m
[31m-        {0x18, 0x01, 0x5e, 0x00}, {0x1f, 0x01, 0x5e, 0x00},[m
[31m-        {0x29, 0x01, 0x5e, 0x00}, {0x38, 0x01, 0x5e, 0x01},[m
[31m-        {0x03, 0x01, 0x7d, 0x00}, {0x06, 0x01, 0x7d, 0x00},[m
[31m-        {0x0a, 0x01, 0x7d, 0x00}, {0x0f, 0x01, 0x7d, 0x00},[m
[31m-        {0x18, 0x01, 0x7d, 0x00}, {0x1f, 0x01, 0x7d, 0x00},[m
[31m-        {0x29, 0x01, 0x7d, 0x00}, {0x38, 0x01, 0x7d, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x3c, 0x00}, {0x09, 0x01, 0x3c, 0x00},[m
[31m-        {0x17, 0x01, 0x3c, 0x00}, {0x28, 0x01, 0x3c, 0x01},[m
[31m-        {0x02, 0x01, 0x60, 0x00}, {0x09, 0x01, 0x60, 0x00},[m
[31m-        {0x17, 0x01, 0x60, 0x00}, {0x28, 0x01, 0x60, 0x01},[m
[31m-        {0x02, 0x01, 0x7b, 0x00}, {0x09, 0x01, 0x7b, 0x00},[m
[31m-        {0x17, 0x01, 0x7b, 0x00}, {0x28, 0x01, 0x7b, 0x01},[m
[31m-        {0x61, 0x00, 0x00, 0x00}, {0x65, 0x00, 0x00, 0x00},[m
[31m-        {0x6f, 0x00, 0x00, 0x00}, {0x85, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x3c, 0x00}, {0x06, 0x01, 0x3c, 0x00},[m
[31m-        {0x0a, 0x01, 0x3c, 0x00}, {0x0f, 0x01, 0x3c, 0x00},[m
[31m-        {0x18, 0x01, 0x3c, 0x00}, {0x1f, 0x01, 0x3c, 0x00},[m
[31m-        {0x29, 0x01, 0x3c, 0x00}, {0x38, 0x01, 0x3c, 0x01},[m
[31m-        {0x03, 0x01, 0x60, 0x00}, {0x06, 0x01, 0x60, 0x00},[m
[31m-        {0x0a, 0x01, 0x60, 0x00}, {0x0f, 0x01, 0x60, 0x00},[m
[31m-        {0x18, 0x01, 0x60, 0x00}, {0x1f, 0x01, 0x60, 0x00},[m
[31m-        {0x29, 0x01, 0x60, 0x00}, {0x38, 0x01, 0x60, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x7b, 0x00}, {0x06, 0x01, 0x7b, 0x00},[m
[31m-        {0x0a, 0x01, 0x7b, 0x00}, {0x0f, 0x01, 0x7b, 0x00},[m
[31m-        {0x18, 0x01, 0x7b, 0x00}, {0x1f, 0x01, 0x7b, 0x00},[m
[31m-        {0x29, 0x01, 0x7b, 0x00}, {0x38, 0x01, 0x7b, 0x01},[m
[31m-        {0x62, 0x00, 0x00, 0x00}, {0x63, 0x00, 0x00, 0x00},[m
[31m-        {0x66, 0x00, 0x00, 0x00}, {0x69, 0x00, 0x00, 0x00},[m
[31m-        {0x70, 0x00, 0x00, 0x00}, {0x77, 0x00, 0x00, 0x00},[m
[31m-        {0x86, 0x00, 0x00, 0x00}, {0x99, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 95 */[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x5c, 0x01}, {0x00, 0x01, 0xc3, 0x01},[m
[31m-        {0x00, 0x01, 0xd0, 0x01}, {0x64, 0x00, 0x00, 0x00},[m
[31m-        {0x67, 0x00, 0x00, 0x00}, {0x68, 0x00, 0x00, 0x00},[m
[31m-        {0x6a, 0x00, 0x00, 0x00}, {0x6b, 0x00, 0x00, 0x00},[m
[31m-        {0x71, 0x00, 0x00, 0x00}, {0x74, 0x00, 0x00, 0x00},[m
[31m-        {0x78, 0x00, 0x00, 0x00}, {0x7e, 0x00, 0x00, 0x00},[m
[31m-        {0x87, 0x00, 0x00, 0x00}, {0x8e, 0x00, 0x00, 0x00},[m
[31m-        {0x9a, 0x00, 0x00, 0x00}, {0xa9, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x5c, 0x00}, {0x16, 0x01, 0x5c, 0x01},[m
[31m-        {0x01, 0x01, 0xc3, 0x00}, {0x16, 0x01, 0xc3, 0x01},[m
[31m-        {0x01, 0x01, 0xd0, 0x00}, {0x16, 0x01, 0xd0, 0x01},[m
[31m-        {0x00, 0x01, 0x80, 0x01}, {0x00, 0x01, 0x82, 0x01},[m
[31m-        {0x00, 0x01, 0x83, 0x01}, {0x00, 0x01, 0xa2, 0x01},[m
[31m-        {0x00, 0x01, 0xb8, 0x01}, {0x00, 0x01, 0xc2, 0x01},[m
[31m-        {0x00, 0x01, 0xe0, 0x01}, {0x00, 0x01, 0xe2, 0x01},[m
[31m-        {0x6c, 0x00, 0x00, 0x00}, {0x6d, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x5c, 0x00}, {0x09, 0x01, 0x5c, 0x00},[m
[31m-        {0x17, 0x01, 0x5c, 0x00}, {0x28, 0x01, 0x5c, 0x01},[m
[31m-        {0x02, 0x01, 0xc3, 0x00}, {0x09, 0x01, 0xc3, 0x00},[m
[31m-        {0x17, 0x01, 0xc3, 0x00}, {0x28, 0x01, 0xc3, 0x01},[m
[31m-        {0x02, 0x01, 0xd0, 0x00}, {0x09, 0x01, 0xd0, 0x00},[m
[31m-        {0x17, 0x01, 0xd0, 0x00}, {0x28, 0x01, 0xd0, 0x01},[m
[31m-        {0x01, 0x01, 0x80, 0x00}, {0x16, 0x01, 0x80, 0x01},[m
[31m-        {0x01, 0x01, 0x82, 0x00}, {0x16, 0x01, 0x82, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x5c, 0x00}, {0x06, 0x01, 0x5c, 0x00},[m
[31m-        {0x0a, 0x01, 0x5c, 0x00}, {0x0f, 0x01, 0x5c, 0x00},[m
[31m-        {0x18, 0x01, 0x5c, 0x00}, {0x1f, 0x01, 0x5c, 0x00},[m
[31m-        {0x29, 0x01, 0x5c, 0x00}, {0x38, 0x01, 0x5c, 0x01},[m
[31m-        {0x03, 0x01, 0xc3, 0x00}, {0x06, 0x01, 0xc3, 0x00},[m
[31m-        {0x0a, 0x01, 0xc3, 0x00}, {0x0f, 0x01, 0xc3, 0x00},[m
[31m-        {0x18, 0x01, 0xc3, 0x00}, {0x1f, 0x01, 0xc3, 0x00},[m
[31m-        {0x29, 0x01, 0xc3, 0x00}, {0x38, 0x01, 0xc3, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd0, 0x00}, {0x06, 0x01, 0xd0, 0x00},[m
[31m-        {0x0a, 0x01, 0xd0, 0x00}, {0x0f, 0x01, 0xd0, 0x00},[m
[31m-        {0x18, 0x01, 0xd0, 0x00}, {0x1f, 0x01, 0xd0, 0x00},[m
[31m-        {0x29, 0x01, 0xd0, 0x00}, {0x38, 0x01, 0xd0, 0x01},[m
[31m-        {0x02, 0x01, 0x80, 0x00}, {0x09, 0x01, 0x80, 0x00},[m
[31m-        {0x17, 0x01, 0x80, 0x00}, {0x28, 0x01, 0x80, 0x01},[m
[31m-        {0x02, 0x01, 0x82, 0x00}, {0x09, 0x01, 0x82, 0x00},[m
[31m-        {0x17, 0x01, 0x82, 0x00}, {0x28, 0x01, 0x82, 0x01}[m
[31m-    },[m
[31m-    /* 100 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x80, 0x00}, {0x06, 0x01, 0x80, 0x00},[m
[31m-        {0x0a, 0x01, 0x80, 0x00}, {0x0f, 0x01, 0x80, 0x00},[m
[31m-        {0x18, 0x01, 0x80, 0x00}, {0x1f, 0x01, 0x80, 0x00},[m
[31m-        {0x29, 0x01, 0x80, 0x00}, {0x38, 0x01, 0x80, 0x01},[m
[31m-        {0x03, 0x01, 0x82, 0x00}, {0x06, 0x01, 0x82, 0x00},[m
[31m-        {0x0a, 0x01, 0x82, 0x00}, {0x0f, 0x01, 0x82, 0x00},[m
[31m-        {0x18, 0x01, 0x82, 0x00}, {0x1f, 0x01, 0x82, 0x00},[m
[31m-        {0x29, 0x01, 0x82, 0x00}, {0x38, 0x01, 0x82, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x83, 0x00}, {0x16, 0x01, 0x83, 0x01},[m
[31m-        {0x01, 0x01, 0xa2, 0x00}, {0x16, 0x01, 0xa2, 0x01},[m
[31m-        {0x01, 0x01, 0xb8, 0x00}, {0x16, 0x01, 0xb8, 0x01},[m
[31m-        {0x01, 0x01, 0xc2, 0x00}, {0x16, 0x01, 0xc2, 0x01},[m
[31m-        {0x01, 0x01, 0xe0, 0x00}, {0x16, 0x01, 0xe0, 0x01},[m
[31m-        {0x01, 0x01, 0xe2, 0x00}, {0x16, 0x01, 0xe2, 0x01},[m
[31m-        {0x00, 0x01, 0x99, 0x01}, {0x00, 0x01, 0xa1, 0x01},[m
[31m-        {0x00, 0x01, 0xa7, 0x01}, {0x00, 0x01, 0xac, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x83, 0x00}, {0x09, 0x01, 0x83, 0x00},[m
[31m-        {0x17, 0x01, 0x83, 0x00}, {0x28, 0x01, 0x83, 0x01},[m
[31m-        {0x02, 0x01, 0xa2, 0x00}, {0x09, 0x01, 0xa2, 0x00},[m
[31m-        {0x17, 0x01, 0xa2, 0x00}, {0x28, 0x01, 0xa2, 0x01},[m
[31m-        {0x02, 0x01, 0xb8, 0x00}, {0x09, 0x01, 0xb8, 0x00},[m
[31m-        {0x17, 0x01, 0xb8, 0x00}, {0x28, 0x01, 0xb8, 0x01},[m
[31m-        {0x02, 0x01, 0xc2, 0x00}, {0x09, 0x01, 0xc2, 0x00},[m
[31m-        {0x17, 0x01, 0xc2, 0x00}, {0x28, 0x01, 0xc2, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x83, 0x00}, {0x06, 0x01, 0x83, 0x00},[m
[31m-        {0x0a, 0x01, 0x83, 0x00}, {0x0f, 0x01, 0x83, 0x00},[m
[31m-        {0x18, 0x01, 0x83, 0x00}, {0x1f, 0x01, 0x83, 0x00},[m
[31m-        {0x29, 0x01, 0x83, 0x00}, {0x38, 0x01, 0x83, 0x01},[m
[31m-        {0x03, 0x01, 0xa2, 0x00}, {0x06, 0x01, 0xa2, 0x00},[m
[31m-        {0x0a, 0x01, 0xa2, 0x00}, {0x0f, 0x01, 0xa2, 0x00},[m
[31m-        {0x18, 0x01, 0xa2, 0x00}, {0x1f, 0x01, 0xa2, 0x00},[m
[31m-        {0x29, 0x01, 0xa2, 0x00}, {0x38, 0x01, 0xa2, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb8, 0x00}, {0x06, 0x01, 0xb8, 0x00},[m
[31m-        {0x0a, 0x01, 0xb8, 0x00}, {0x0f, 0x01, 0xb8, 0x00},[m
[31m-        {0x18, 0x01, 0xb8, 0x00}, {0x1f, 0x01, 0xb8, 0x00},[m
[31m-        {0x29, 0x01, 0xb8, 0x00}, {0x38, 0x01, 0xb8, 0x01},[m
[31m-        {0x03, 0x01, 0xc2, 0x00}, {0x06, 0x01, 0xc2, 0x00},[m
[31m-        {0x0a, 0x01, 0xc2, 0x00}, {0x0f, 0x01, 0xc2, 0x00},[m
[31m-        {0x18, 0x01, 0xc2, 0x00}, {0x1f, 0x01, 0xc2, 0x00},[m
[31m-        {0x29, 0x01, 0xc2, 0x00}, {0x38, 0x01, 0xc2, 0x01}[m
[31m-    },[m
[31m-    /* 105 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xe0, 0x00}, {0x09, 0x01, 0xe0, 0x00},[m
[31m-        {0x17, 0x01, 0xe0, 0x00}, {0x28, 0x01, 0xe0, 0x01},[m
[31m-        {0x02, 0x01, 0xe2, 0x00}, {0x09, 0x01, 0xe2, 0x00},[m
[31m-        {0x17, 0x01, 0xe2, 0x00}, {0x28, 0x01, 0xe2, 0x01},[m
[31m-        {0x01, 0x01, 0x99, 0x00}, {0x16, 0x01, 0x99, 0x01},[m
[31m-        {0x01, 0x01, 0xa1, 0x00}, {0x16, 0x01, 0xa1, 0x01},[m
[31m-        {0x01, 0x01, 0xa7, 0x00}, {0x16, 0x01, 0xa7, 0x01},[m
[31m-        {0x01, 0x01, 0xac, 0x00}, {0x16, 0x01, 0xac, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xe0, 0x00}, {0x06, 0x01, 0xe0, 0x00},[m
[31m-        {0x0a, 0x01, 0xe0, 0x00}, {0x0f, 0x01, 0xe0, 0x00},[m
[31m-        {0x18, 0x01, 0xe0, 0x00}, {0x1f, 0x01, 0xe0, 0x00},[m
[31m-        {0x29, 0x01, 0xe0, 0x00}, {0x38, 0x01, 0xe0, 0x01},[m
[31m-        {0x03, 0x01, 0xe2, 0x00}, {0x06, 0x01, 0xe2, 0x00},[m
[31m-        {0x0a, 0x01, 0xe2, 0x00}, {0x0f, 0x01, 0xe2, 0x00},[m
[31m-        {0x18, 0x01, 0xe2, 0x00}, {0x1f, 0x01, 0xe2, 0x00},[m
[31m-        {0x29, 0x01, 0xe2, 0x00}, {0x38, 0x01, 0xe2, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x99, 0x00}, {0x09, 0x01, 0x99, 0x00},[m
[31m-        {0x17, 0x01, 0x99, 0x00}, {0x28, 0x01, 0x99, 0x01},[m
[31m-        {0x02, 0x01, 0xa1, 0x00}, {0x09, 0x01, 0xa1, 0x00},[m
[31m-        {0x17, 0x01, 0xa1, 0x00}, {0x28, 0x01, 0xa1, 0x01},[m
[31m-        {0x02, 0x01, 0xa7, 0x00}, {0x09, 0x01, 0xa7, 0x00},[m
[31m-        {0x17, 0x01, 0xa7, 0x00}, {0x28, 0x01, 0xa7, 0x01},[m
[31m-        {0x02, 0x01, 0xac, 0x00}, {0x09, 0x01, 0xac, 0x00},[m
[31m-        {0x17, 0x01, 0xac, 0x00}, {0x28, 0x01, 0xac, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x99, 0x00}, {0x06, 0x01, 0x99, 0x00},[m
[31m-        {0x0a, 0x01, 0x99, 0x00}, {0x0f, 0x01, 0x99, 0x00},[m
[31m-        {0x18, 0x01, 0x99, 0x00}, {0x1f, 0x01, 0x99, 0x00},[m
[31m-        {0x29, 0x01, 0x99, 0x00}, {0x38, 0x01, 0x99, 0x01},[m
[31m-        {0x03, 0x01, 0xa1, 0x00}, {0x06, 0x01, 0xa1, 0x00},[m
[31m-        {0x0a, 0x01, 0xa1, 0x00}, {0x0f, 0x01, 0xa1, 0x00},[m
[31m-        {0x18, 0x01, 0xa1, 0x00}, {0x1f, 0x01, 0xa1, 0x00},[m
[31m-        {0x29, 0x01, 0xa1, 0x00}, {0x38, 0x01, 0xa1, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa7, 0x00}, {0x06, 0x01, 0xa7, 0x00},[m
[31m-        {0x0a, 0x01, 0xa7, 0x00}, {0x0f, 0x01, 0xa7, 0x00},[m
[31m-        {0x18, 0x01, 0xa7, 0x00}, {0x1f, 0x01, 0xa7, 0x00},[m
[31m-        {0x29, 0x01, 0xa7, 0x00}, {0x38, 0x01, 0xa7, 0x01},[m
[31m-        {0x03, 0x01, 0xac, 0x00}, {0x06, 0x01, 0xac, 0x00},[m
[31m-        {0x0a, 0x01, 0xac, 0x00}, {0x0f, 0x01, 0xac, 0x00},[m
[31m-        {0x18, 0x01, 0xac, 0x00}, {0x1f, 0x01, 0xac, 0x00},[m
[31m-        {0x29, 0x01, 0xac, 0x00}, {0x38, 0x01, 0xac, 0x01}[m
[31m-    },[m
[31m-    /* 110 */[m
[31m-    {[m
[31m-        {0x72, 0x00, 0x00, 0x00}, {0x73, 0x00, 0x00, 0x00},[m
[31m-        {0x75, 0x00, 0x00, 0x00}, {0x76, 0x00, 0x00, 0x00},[m
[31m-        {0x79, 0x00, 0x00, 0x00}, {0x7b, 0x00, 0x00, 0x00},[m
[31m-        {0x7f, 0x00, 0x00, 0x00}, {0x82, 0x00, 0x00, 0x00},[m
[31m-        {0x88, 0x00, 0x00, 0x00}, {0x8b, 0x00, 0x00, 0x00},[m
[31m-        {0x8f, 0x00, 0x00, 0x00}, {0x92, 0x00, 0x00, 0x00},[m
[31m-        {0x9b, 0x00, 0x00, 0x00}, {0xa2, 0x00, 0x00, 0x00},[m
[31m-        {0xaa, 0x00, 0x00, 0x00}, {0xb4, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xb0, 0x01}, {0x00, 0x01, 0xb1, 0x01},[m
[31m-        {0x00, 0x01, 0xb3, 0x01}, {0x00, 0x01, 0xd1, 0x01},[m
[31m-        {0x00, 0x01, 0xd8, 0x01}, {0x00, 0x01, 0xd9, 0x01},[m
[31m-        {0x00, 0x01, 0xe3, 0x01}, {0x00, 0x01, 0xe5, 0x01},[m
[31m-        {0x00, 0x01, 0xe6, 0x01}, {0x7a, 0x00, 0x00, 0x00},[m
[31m-        {0x7c, 0x00, 0x00, 0x00}, {0x7d, 0x00, 0x00, 0x00},[m
[31m-        {0x80, 0x00, 0x00, 0x00}, {0x81, 0x00, 0x00, 0x00},[m
[31m-        {0x83, 0x00, 0x00, 0x00}, {0x84, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xb0, 0x00}, {0x16, 0x01, 0xb0, 0x01},[m
[31m-        {0x01, 0x01, 0xb1, 0x00}, {0x16, 0x01, 0xb1, 0x01},[m
[31m-        {0x01, 0x01, 0xb3, 0x00}, {0x16, 0x01, 0xb3, 0x01},[m
[31m-        {0x01, 0x01, 0xd1, 0x00}, {0x16, 0x01, 0xd1, 0x01},[m
[31m-        {0x01, 0x01, 0xd8, 0x00}, {0x16, 0x01, 0xd8, 0x01},[m
[31m-        {0x01, 0x01, 0xd9, 0x00}, {0x16, 0x01, 0xd9, 0x01},[m
[31m-        {0x01, 0x01, 0xe3, 0x00}, {0x16, 0x01, 0xe3, 0x01},[m
[31m-        {0x01, 0x01, 0xe5, 0x00}, {0x16, 0x01, 0xe5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xb0, 0x00}, {0x09, 0x01, 0xb0, 0x00},[m
[31m-        {0x17, 0x01, 0xb0, 0x00}, {0x28, 0x01, 0xb0, 0x01},[m
[31m-        {0x02, 0x01, 0xb1, 0x00}, {0x09, 0x01, 0xb1, 0x00},[m
[31m-        {0x17, 0x01, 0xb1, 0x00}, {0x28, 0x01, 0xb1, 0x01},[m
[31m-        {0x02, 0x01, 0xb3, 0x00}, {0x09, 0x01, 0xb3, 0x00},[m
[31m-        {0x17, 0x01, 0xb3, 0x00}, {0x28, 0x01, 0xb3, 0x01},[m
[31m-        {0x02, 0x01, 0xd1, 0x00}, {0x09, 0x01, 0xd1, 0x00},[m
[31m-        {0x17, 0x01, 0xd1, 0x00}, {0x28, 0x01, 0xd1, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb0, 0x00}, {0x06, 0x01, 0xb0, 0x00},[m
[31m-        {0x0a, 0x01, 0xb0, 0x00}, {0x0f, 0x01, 0xb0, 0x00},[m
[31m-        {0x18, 0x01, 0xb0, 0x00}, {0x1f, 0x01, 0xb0, 0x00},[m
[31m-        {0x29, 0x01, 0xb0, 0x00}, {0x38, 0x01, 0xb0, 0x01},[m
[31m-        {0x03, 0x01, 0xb1, 0x00}, {0x06, 0x01, 0xb1, 0x00},[m
[31m-        {0x0a, 0x01, 0xb1, 0x00}, {0x0f, 0x01, 0xb1, 0x00},[m
[31m-        {0x18, 0x01, 0xb1, 0x00}, {0x1f, 0x01, 0xb1, 0x00},[m
[31m-        {0x29, 0x01, 0xb1, 0x00}, {0x38, 0x01, 0xb1, 0x01}[m
[31m-    },[m
[31m-    /* 115 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb3, 0x00}, {0x06, 0x01, 0xb3, 0x00},[m
[31m-        {0x0a, 0x01, 0xb3, 0x00}, {0x0f, 0x01, 0xb3, 0x00},[m
[31m-        {0x18, 0x01, 0xb3, 0x00}, {0x1f, 0x01, 0xb3, 0x00},[m
[31m-        {0x29, 0x01, 0xb3, 0x00}, {0x38, 0x01, 0xb3, 0x01},[m
[31m-        {0x03, 0x01, 0xd1, 0x00}, {0x06, 0x01, 0xd1, 0x00},[m
[31m-        {0x0a, 0x01, 0xd1, 0x00}, {0x0f, 0x01, 0xd1, 0x00},[m
[31m-        {0x18, 0x01, 0xd1, 0x00}, {0x1f, 0x01, 0xd1, 0x00},[m
[31m-        {0x29, 0x01, 0xd1, 0x00}, {0x38, 0x01, 0xd1, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xd8, 0x00}, {0x09, 0x01, 0xd8, 0x00},[m
[31m-        {0x17, 0x01, 0xd8, 0x00}, {0x28, 0x01, 0xd8, 0x01},[m
[31m-        {0x02, 0x01, 0xd9, 0x00}, {0x09, 0x01, 0xd9, 0x00},[m
[31m-        {0x17, 0x01, 0xd9, 0x00}, {0x28, 0x01, 0xd9, 0x01},[m
[31m-        {0x02, 0x01, 0xe3, 0x00}, {0x09, 0x01, 0xe3, 0x00},[m
[31m-        {0x17, 0x01, 0xe3, 0x00}, {0x28, 0x01, 0xe3, 0x01},[m
[31m-        {0x02, 0x01, 0xe5, 0x00}, {0x09, 0x01, 0xe5, 0x00},[m
[31m-        {0x17, 0x01, 0xe5, 0x00}, {0x28, 0x01, 0xe5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd8, 0x00}, {0x06, 0x01, 0xd8, 0x00},[m
[31m-        {0x0a, 0x01, 0xd8, 0x00}, {0x0f, 0x01, 0xd8, 0x00},[m
[31m-        {0x18, 0x01, 0xd8, 0x00}, {0x1f, 0x01, 0xd8, 0x00},[m
[31m-        {0x29, 0x01, 0xd8, 0x00}, {0x38, 0x01, 0xd8, 0x01},[m
[31m-        {0x03, 0x01, 0xd9, 0x00}, {0x06, 0x01, 0xd9, 0x00},[m
[31m-        {0x0a, 0x01, 0xd9, 0x00}, {0x0f, 0x01, 0xd9, 0x00},[m
[31m-        {0x18, 0x01, 0xd9, 0x00}, {0x1f, 0x01, 0xd9, 0x00},[m
[31m-        {0x29, 0x01, 0xd9, 0x00}, {0x38, 0x01, 0xd9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xe3, 0x00}, {0x06, 0x01, 0xe3, 0x00},[m
[31m-        {0x0a, 0x01, 0xe3, 0x00}, {0x0f, 0x01, 0xe3, 0x00},[m
[31m-        {0x18, 0x01, 0xe3, 0x00}, {0x1f, 0x01, 0xe3, 0x00},[m
[31m-        {0x29, 0x01, 0xe3, 0x00}, {0x38, 0x01, 0xe3, 0x01},[m
[31m-        {0x03, 0x01, 0xe5, 0x00}, {0x06, 0x01, 0xe5, 0x00},[m
[31m-        {0x0a, 0x01, 0xe5, 0x00}, {0x0f, 0x01, 0xe5, 0x00},[m
[31m-        {0x18, 0x01, 0xe5, 0x00}, {0x1f, 0x01, 0xe5, 0x00},[m
[31m-        {0x29, 0x01, 0xe5, 0x00}, {0x38, 0x01, 0xe5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xe6, 0x00}, {0x16, 0x01, 0xe6, 0x01},[m
[31m-        {0x00, 0x01, 0x81, 0x01}, {0x00, 0x01, 0x84, 0x01},[m
[31m-        {0x00, 0x01, 0x85, 0x01}, {0x00, 0x01, 0x86, 0x01},[m
[31m-        {0x00, 0x01, 0x88, 0x01}, {0x00, 0x01, 0x92, 0x01},[m
[31m-        {0x00, 0x01, 0x9a, 0x01}, {0x00, 0x01, 0x9c, 0x01},[m
[31m-        {0x00, 0x01, 0xa0, 0x01}, {0x00, 0x01, 0xa3, 0x01},[m
[31m-        {0x00, 0x01, 0xa4, 0x01}, {0x00, 0x01, 0xa9, 0x01},[m
[31m-        {0x00, 0x01, 0xaa, 0x01}, {0x00, 0x01, 0xad, 0x01}[m
[31m-    },[m
[31m-    /* 120 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xe6, 0x00}, {0x09, 0x01, 0xe6, 0x00},[m
[31m-        {0x17, 0x01, 0xe6, 0x00}, {0x28, 0x01, 0xe6, 0x01},[m
[31m-        {0x01, 0x01, 0x81, 0x00}, {0x16, 0x01, 0x81, 0x01},[m
[31m-        {0x01, 0x01, 0x84, 0x00}, {0x16, 0x01, 0x84, 0x01},[m
[31m-        {0x01, 0x01, 0x85, 0x00}, {0x16, 0x01, 0x85, 0x01},[m
[31m-        {0x01, 0x01, 0x86, 0x00}, {0x16, 0x01, 0x86, 0x01},[m
[31m-        {0x01, 0x01, 0x88, 0x00}, {0x16, 0x01, 0x88, 0x01},[m
[31m-        {0x01, 0x01, 0x92, 0x00}, {0x16, 0x01, 0x92, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xe6, 0x00}, {0x06, 0x01, 0xe6, 0x00},[m
[31m-        {0x0a, 0x01, 0xe6, 0x00}, {0x0f, 0x01, 0xe6, 0x00},[m
[31m-        {0x18, 0x01, 0xe6, 0x00}, {0x1f, 0x01, 0xe6, 0x00},[m
[31m-        {0x29, 0x01, 0xe6, 0x00}, {0x38, 0x01, 0xe6, 0x01},[m
[31m-        {0x02, 0x01, 0x81, 0x00}, {0x09, 0x01, 0x81, 0x00},[m
[31m-        {0x17, 0x01, 0x81, 0x00}, {0x28, 0x01, 0x81, 0x01},[m
[31m-        {0x02, 0x01, 0x84, 0x00}, {0x09, 0x01, 0x84, 0x00},[m
[31m-        {0x17, 0x01, 0x84, 0x00}, {0x28, 0x01, 0x84, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x81, 0x00}, {0x06, 0x01, 0x81, 0x00},[m
[31m-        {0x0a, 0x01, 0x81, 0x00}, {0x0f, 0x01, 0x81, 0x00},[m
[31m-        {0x18, 0x01, 0x81, 0x00}, {0x1f, 0x01, 0x81, 0x00},[m
[31m-        {0x29, 0x01, 0x81, 0x00}, {0x38, 0x01, 0x81, 0x01},[m
[31m-        {0x03, 0x01, 0x84, 0x00}, {0x06, 0x01, 0x84, 0x00},[m
[31m-        {0x0a, 0x01, 0x84, 0x00}, {0x0f, 0x01, 0x84, 0x00},[m
[31m-        {0x18, 0x01, 0x84, 0x00}, {0x1f, 0x01, 0x84, 0x00},[m
[31m-        {0x29, 0x01, 0x84, 0x00}, {0x38, 0x01, 0x84, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x85, 0x00}, {0x09, 0x01, 0x85, 0x00},[m
[31m-        {0x17, 0x01, 0x85, 0x00}, {0x28, 0x01, 0x85, 0x01},[m
[31m-        {0x02, 0x01, 0x86, 0x00}, {0x09, 0x01, 0x86, 0x00},[m
[31m-        {0x17, 0x01, 0x86, 0x00}, {0x28, 0x01, 0x86, 0x01},[m
[31m-        {0x02, 0x01, 0x88, 0x00}, {0x09, 0x01, 0x88, 0x00},[m
[31m-        {0x17, 0x01, 0x88, 0x00}, {0x28, 0x01, 0x88, 0x01},[m
[31m-        {0x02, 0x01, 0x92, 0x00}, {0x09, 0x01, 0x92, 0x00},[m
[31m-        {0x17, 0x01, 0x92, 0x00}, {0x28, 0x01, 0x92, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x85, 0x00}, {0x06, 0x01, 0x85, 0x00},[m
[31m-        {0x0a, 0x01, 0x85, 0x00}, {0x0f, 0x01, 0x85, 0x00},[m
[31m-        {0x18, 0x01, 0x85, 0x00}, {0x1f, 0x01, 0x85, 0x00},[m
[31m-        {0x29, 0x01, 0x85, 0x00}, {0x38, 0x01, 0x85, 0x01},[m
[31m-        {0x03, 0x01, 0x86, 0x00}, {0x06, 0x01, 0x86, 0x00},[m
[31m-        {0x0a, 0x01, 0x86, 0x00}, {0x0f, 0x01, 0x86, 0x00},[m
[31m-        {0x18, 0x01, 0x86, 0x00}, {0x1f, 0x01, 0x86, 0x00},[m
[31m-        {0x29, 0x01, 0x86, 0x00}, {0x38, 0x01, 0x86, 0x01}[m
[31m-    },[m
[31m-    /* 125 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x88, 0x00}, {0x06, 0x01, 0x88, 0x00},[m
[31m-        {0x0a, 0x01, 0x88, 0x00}, {0x0f, 0x01, 0x88, 0x00},[m
[31m-        {0x18, 0x01, 0x88, 0x00}, {0x1f, 0x01, 0x88, 0x00},[m
[31m-        {0x29, 0x01, 0x88, 0x00}, {0x38, 0x01, 0x88, 0x01},[m
[31m-        {0x03, 0x01, 0x92, 0x00}, {0x06, 0x01, 0x92, 0x00},[m
[31m-        {0x0a, 0x01, 0x92, 0x00}, {0x0f, 0x01, 0x92, 0x00},[m
[31m-        {0x18, 0x01, 0x92, 0x00}, {0x1f, 0x01, 0x92, 0x00},[m
[31m-        {0x29, 0x01, 0x92, 0x00}, {0x38, 0x01, 0x92, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x9a, 0x00}, {0x16, 0x01, 0x9a, 0x01},[m
[31m-        {0x01, 0x01, 0x9c, 0x00}, {0x16, 0x01, 0x9c, 0x01},[m
[31m-        {0x01, 0x01, 0xa0, 0x00}, {0x16, 0x01, 0xa0, 0x01},[m
[31m-        {0x01, 0x01, 0xa3, 0x00}, {0x16, 0x01, 0xa3, 0x01},[m
[31m-        {0x01, 0x01, 0xa4, 0x00}, {0x16, 0x01, 0xa4, 0x01},[m
[31m-        {0x01, 0x01, 0xa9, 0x00}, {0x16, 0x01, 0xa9, 0x01},[m
[31m-        {0x01, 0x01, 0xaa, 0x00}, {0x16, 0x01, 0xaa, 0x01},[m
[31m-        {0x01, 0x01, 0xad, 0x00}, {0x16, 0x01, 0xad, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x9a, 0x00}, {0x09, 0x01, 0x9a, 0x00},[m
[31m-        {0x17, 0x01, 0x9a, 0x00}, {0x28, 0x01, 0x9a, 0x01},[m
[31m-        {0x02, 0x01, 0x9c, 0x00}, {0x09, 0x01, 0x9c, 0x00},[m
[31m-        {0x17, 0x01, 0x9c, 0x00}, {0x28, 0x01, 0x9c, 0x01},[m
[31m-        {0x02, 0x01, 0xa0, 0x00}, {0x09, 0x01, 0xa0, 0x00},[m
[31m-        {0x17, 0x01, 0xa0, 0x00}, {0x28, 0x01, 0xa0, 0x01},[m
[31m-        {0x02, 0x01, 0xa3, 0x00}, {0x09, 0x01, 0xa3, 0x00},[m
[31m-        {0x17, 0x01, 0xa3, 0x00}, {0x28, 0x01, 0xa3, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x9a, 0x00}, {0x06, 0x01, 0x9a, 0x00},[m
[31m-        {0x0a, 0x01, 0x9a, 0x00}, {0x0f, 0x01, 0x9a, 0x00},[m
[31m-        {0x18, 0x01, 0x9a, 0x00}, {0x1f, 0x01, 0x9a, 0x00},[m
[31m-        {0x29, 0x01, 0x9a, 0x00}, {0x38, 0x01, 0x9a, 0x01},[m
[31m-        {0x03, 0x01, 0x9c, 0x00}, {0x06, 0x01, 0x9c, 0x00},[m
[31m-        {0x0a, 0x01, 0x9c, 0x00}, {0x0f, 0x01, 0x9c, 0x00},[m
[31m-        {0x18, 0x01, 0x9c, 0x00}, {0x1f, 0x01, 0x9c, 0x00},[m
[31m-        {0x29, 0x01, 0x9c, 0x00}, {0x38, 0x01, 0x9c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa0, 0x00}, {0x06, 0x01, 0xa0, 0x00},[m
[31m-        {0x0a, 0x01, 0xa0, 0x00}, {0x0f, 0x01, 0xa0, 0x00},[m
[31m-        {0x18, 0x01, 0xa0, 0x00}, {0x1f, 0x01, 0xa0, 0x00},[m
[31m-        {0x29, 0x01, 0xa0, 0x00}, {0x38, 0x01, 0xa0, 0x01},[m
[31m-        {0x03, 0x01, 0xa3, 0x00}, {0x06, 0x01, 0xa3, 0x00},[m
[31m-        {0x0a, 0x01, 0xa3, 0x00}, {0x0f, 0x01, 0xa3, 0x00},[m
[31m-        {0x18, 0x01, 0xa3, 0x00}, {0x1f, 0x01, 0xa3, 0x00},[m
[31m-        {0x29, 0x01, 0xa3, 0x00}, {0x38, 0x01, 0xa3, 0x01}[m
[31m-    },[m
[31m-    /* 130 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xa4, 0x00}, {0x09, 0x01, 0xa4, 0x00},[m
[31m-        {0x17, 0x01, 0xa4, 0x00}, {0x28, 0x01, 0xa4, 0x01},[m
[31m-        {0x02, 0x01, 0xa9, 0x00}, {0x09, 0x01, 0xa9, 0x00},[m
[31m-        {0x17, 0x01, 0xa9, 0x00}, {0x28, 0x01, 0xa9, 0x01},[m
[31m-        {0x02, 0x01, 0xaa, 0x00}, {0x09, 0x01, 0xaa, 0x00},[m
[31m-        {0x17, 0x01, 0xaa, 0x00}, {0x28, 0x01, 0xaa, 0x01},[m
[31m-        {0x02, 0x01, 0xad, 0x00}, {0x09, 0x01, 0xad, 0x00},[m
[31m-        {0x17, 0x01, 0xad, 0x00}, {0x28, 0x01, 0xad, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa4, 0x00}, {0x06, 0x01, 0xa4, 0x00},[m
[31m-        {0x0a, 0x01, 0xa4, 0x00}, {0x0f, 0x01, 0xa4, 0x00},[m
[31m-        {0x18, 0x01, 0xa4, 0x00}, {0x1f, 0x01, 0xa4, 0x00},[m
[31m-        {0x29, 0x01, 0xa4, 0x00}, {0x38, 0x01, 0xa4, 0x01},[m
[31m-        {0x03, 0x01, 0xa9, 0x00}, {0x06, 0x01, 0xa9, 0x00},[m
[31m-        {0x0a, 0x01, 0xa9, 0x00}, {0x0f, 0x01, 0xa9, 0x00},[m
[31m-        {0x18, 0x01, 0xa9, 0x00}, {0x1f, 0x01, 0xa9, 0x00},[m
[31m-        {0x29, 0x01, 0xa9, 0x00}, {0x38, 0x01, 0xa9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xaa, 0x00}, {0x06, 0x01, 0xaa, 0x00},[m
[31m-        {0x0a, 0x01, 0xaa, 0x00}, {0x0f, 0x01, 0xaa, 0x00},[m
[31m-        {0x18, 0x01, 0xaa, 0x00}, {0x1f, 0x01, 0xaa, 0x00},[m
[31m-        {0x29, 0x01, 0xaa, 0x00}, {0x38, 0x01, 0xaa, 0x01},[m
[31m-        {0x03, 0x01, 0xad, 0x00}, {0x06, 0x01, 0xad, 0x00},[m
[31m-        {0x0a, 0x01, 0xad, 0x00}, {0x0f, 0x01, 0xad, 0x00},[m
[31m-        {0x18, 0x01, 0xad, 0x00}, {0x1f, 0x01, 0xad, 0x00},[m
[31m-        {0x29, 0x01, 0xad, 0x00}, {0x38, 0x01, 0xad, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x89, 0x00, 0x00, 0x00}, {0x8a, 0x00, 0x00, 0x00},[m
[31m-        {0x8c, 0x00, 0x00, 0x00}, {0x8d, 0x00, 0x00, 0x00},[m
[31m-        {0x90, 0x00, 0x00, 0x00}, {0x91, 0x00, 0x00, 0x00},[m
[31m-        {0x93, 0x00, 0x00, 0x00}, {0x96, 0x00, 0x00, 0x00},[m
[31m-        {0x9c, 0x00, 0x00, 0x00}, {0x9f, 0x00, 0x00, 0x00},[m
[31m-        {0xa3, 0x00, 0x00, 0x00}, {0xa6, 0x00, 0x00, 0x00},[m
[31m-        {0xab, 0x00, 0x00, 0x00}, {0xae, 0x00, 0x00, 0x00},[m
[31m-        {0xb5, 0x00, 0x00, 0x00}, {0xbe, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xb2, 0x01}, {0x00, 0x01, 0xb5, 0x01},[m
[31m-        {0x00, 0x01, 0xb9, 0x01}, {0x00, 0x01, 0xba, 0x01},[m
[31m-        {0x00, 0x01, 0xbb, 0x01}, {0x00, 0x01, 0xbd, 0x01},[m
[31m-        {0x00, 0x01, 0xbe, 0x01}, {0x00, 0x01, 0xc4, 0x01},[m
[31m-        {0x00, 0x01, 0xc6, 0x01}, {0x00, 0x01, 0xe4, 0x01},[m
[31m-        {0x00, 0x01, 0xe8, 0x01}, {0x00, 0x01, 0xe9, 0x01},[m
[31m-        {0x94, 0x00, 0x00, 0x00}, {0x95, 0x00, 0x00, 0x00},[m
[31m-        {0x97, 0x00, 0x00, 0x00}, {0x98, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    /* 135 */[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xb2, 0x00}, {0x16, 0x01, 0xb2, 0x01},[m
[31m-        {0x01, 0x01, 0xb5, 0x00}, {0x16, 0x01, 0xb5, 0x01},[m
[31m-        {0x01, 0x01, 0xb9, 0x00}, {0x16, 0x01, 0xb9, 0x01},[m
[31m-        {0x01, 0x01, 0xba, 0x00}, {0x16, 0x01, 0xba, 0x01},[m
[31m-        {0x01, 0x01, 0xbb, 0x00}, {0x16, 0x01, 0xbb, 0x01},[m
[31m-        {0x01, 0x01, 0xbd, 0x00}, {0x16, 0x01, 0xbd, 0x01},[m
[31m-        {0x01, 0x01, 0xbe, 0x00}, {0x16, 0x01, 0xbe, 0x01},[m
[31m-        {0x01, 0x01, 0xc4, 0x00}, {0x16, 0x01, 0xc4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xb2, 0x00}, {0x09, 0x01, 0xb2, 0x00},[m
[31m-        {0x17, 0x01, 0xb2, 0x00}, {0x28, 0x01, 0xb2, 0x01},[m
[31m-        {0x02, 0x01, 0xb5, 0x00}, {0x09, 0x01, 0xb5, 0x00},[m
[31m-        {0x17, 0x01, 0xb5, 0x00}, {0x28, 0x01, 0xb5, 0x01},[m
[31m-        {0x02, 0x01, 0xb9, 0x00}, {0x09, 0x01, 0xb9, 0x00},[m
[31m-        {0x17, 0x01, 0xb9, 0x00}, {0x28, 0x01, 0xb9, 0x01},[m
[31m-        {0x02, 0x01, 0xba, 0x00}, {0x09, 0x01, 0xba, 0x00},[m
[31m-        {0x17, 0x01, 0xba, 0x00}, {0x28, 0x01, 0xba, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb2, 0x00}, {0x06, 0x01, 0xb2, 0x00},[m
[31m-        {0x0a, 0x01, 0xb2, 0x00}, {0x0f, 0x01, 0xb2, 0x00},[m
[31m-        {0x18, 0x01, 0xb2, 0x00}, {0x1f, 0x01, 0xb2, 0x00},[m
[31m-        {0x29, 0x01, 0xb2, 0x00}, {0x38, 0x01, 0xb2, 0x01},[m
[31m-        {0x03, 0x01, 0xb5, 0x00}, {0x06, 0x01, 0xb5, 0x00},[m
[31m-        {0x0a, 0x01, 0xb5, 0x00}, {0x0f, 0x01, 0xb5, 0x00},[m
[31m-        {0x18, 0x01, 0xb5, 0x00}, {0x1f, 0x01, 0xb5, 0x00},[m
[31m-        {0x29, 0x01, 0xb5, 0x00}, {0x38, 0x01, 0xb5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb9, 0x00}, {0x06, 0x01, 0xb9, 0x00},[m
[31m-        {0x0a, 0x01, 0xb9, 0x00}, {0x0f, 0x01, 0xb9, 0x00},[m
[31m-        {0x18, 0x01, 0xb9, 0x00}, {0x1f, 0x01, 0xb9, 0x00},[m
[31m-        {0x29, 0x01, 0xb9, 0x00}, {0x38, 0x01, 0xb9, 0x01},[m
[31m-        {0x03, 0x01, 0xba, 0x00}, {0x06, 0x01, 0xba, 0x00},[m
[31m-        {0x0a, 0x01, 0xba, 0x00}, {0x0f, 0x01, 0xba, 0x00},[m
[31m-        {0x18, 0x01, 0xba, 0x00}, {0x1f, 0x01, 0xba, 0x00},[m
[31m-        {0x29, 0x01, 0xba, 0x00}, {0x38, 0x01, 0xba, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xbb, 0x00}, {0x09, 0x01, 0xbb, 0x00},[m
[31m-        {0x17, 0x01, 0xbb, 0x00}, {0x28, 0x01, 0xbb, 0x01},[m
[31m-        {0x02, 0x01, 0xbd, 0x00}, {0x09, 0x01, 0xbd, 0x00},[m
[31m-        {0x17, 0x01, 0xbd, 0x00}, {0x28, 0x01, 0xbd, 0x01},[m
[31m-        {0x02, 0x01, 0xbe, 0x00}, {0x09, 0x01, 0xbe, 0x00},[m
[31m-        {0x17, 0x01, 0xbe, 0x00}, {0x28, 0x01, 0xbe, 0x01},[m
[31m-        {0x02, 0x01, 0xc4, 0x00}, {0x09, 0x01, 0xc4, 0x00},[m
[31m-        {0x17, 0x01, 0xc4, 0x00}, {0x28, 0x01, 0xc4, 0x01}[m
[31m-    },[m
[31m-    /* 140 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xbb, 0x00}, {0x06, 0x01, 0xbb, 0x00},[m
[31m-        {0x0a, 0x01, 0xbb, 0x00}, {0x0f, 0x01, 0xbb, 0x00},[m
[31m-        {0x18, 0x01, 0xbb, 0x00}, {0x1f, 0x01, 0xbb, 0x00},[m
[31m-        {0x29, 0x01, 0xbb, 0x00}, {0x38, 0x01, 0xbb, 0x01},[m
[31m-        {0x03, 0x01, 0xbd, 0x00}, {0x06, 0x01, 0xbd, 0x00},[m
[31m-        {0x0a, 0x01, 0xbd, 0x00}, {0x0f, 0x01, 0xbd, 0x00},[m
[31m-        {0x18, 0x01, 0xbd, 0x00}, {0x1f, 0x01, 0xbd, 0x00},[m
[31m-        {0x29, 0x01, 0xbd, 0x00}, {0x38, 0x01, 0xbd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xbe, 0x00}, {0x06, 0x01, 0xbe, 0x00},[m
[31m-        {0x0a, 0x01, 0xbe, 0x00}, {0x0f, 0x01, 0xbe, 0x00},[m
[31m-        {0x18, 0x01, 0xbe, 0x00}, {0x1f, 0x01, 0xbe, 0x00},[m
[31m-        {0x29, 0x01, 0xbe, 0x00}, {0x38, 0x01, 0xbe, 0x01},[m
[31m-        {0x03, 0x01, 0xc4, 0x00}, {0x06, 0x01, 0xc4, 0x00},[m
[31m-        {0x0a, 0x01, 0xc4, 0x00}, {0x0f, 0x01, 0xc4, 0x00},[m
[31m-        {0x18, 0x01, 0xc4, 0x00}, {0x1f, 0x01, 0xc4, 0x00},[m
[31m-        {0x29, 0x01, 0xc4, 0x00}, {0x38, 0x01, 0xc4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xc6, 0x00}, {0x16, 0x01, 0xc6, 0x01},[m
[31m-        {0x01, 0x01, 0xe4, 0x00}, {0x16, 0x01, 0xe4, 0x01},[m
[31m-        {0x01, 0x01, 0xe8, 0x00}, {0x16, 0x01, 0xe8, 0x01},[m
[31m-        {0x01, 0x01, 0xe9, 0x00}, {0x16, 0x01, 0xe9, 0x01},[m
[31m-        {0x00, 0x01, 0x01, 0x01}, {0x00, 0x01, 0x87, 0x01},[m
[31m-        {0x00, 0x01, 0x89, 0x01}, {0x00, 0x01, 0x8a, 0x01},[m
[31m-        {0x00, 0x01, 0x8b, 0x01}, {0x00, 0x01, 0x8c, 0x01},[m
[31m-        {0x00, 0x01, 0x8d, 0x01}, {0x00, 0x01, 0x8f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xc6, 0x00}, {0x09, 0x01, 0xc6, 0x00},[m
[31m-        {0x17, 0x01, 0xc6, 0x00}, {0x28, 0x01, 0xc6, 0x01},[m
[31m-        {0x02, 0x01, 0xe4, 0x00}, {0x09, 0x01, 0xe4, 0x00},[m
[31m-        {0x17, 0x01, 0xe4, 0x00}, {0x28, 0x01, 0xe4, 0x01},[m
[31m-        {0x02, 0x01, 0xe8, 0x00}, {0x09, 0x01, 0xe8, 0x00},[m
[31m-        {0x17, 0x01, 0xe8, 0x00}, {0x28, 0x01, 0xe8, 0x01},[m
[31m-        {0x02, 0x01, 0xe9, 0x00}, {0x09, 0x01, 0xe9, 0x00},[m
[31m-        {0x17, 0x01, 0xe9, 0x00}, {0x28, 0x01, 0xe9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc6, 0x00}, {0x06, 0x01, 0xc6, 0x00},[m
[31m-        {0x0a, 0x01, 0xc6, 0x00}, {0x0f, 0x01, 0xc6, 0x00},[m
[31m-        {0x18, 0x01, 0xc6, 0x00}, {0x1f, 0x01, 0xc6, 0x00},[m
[31m-        {0x29, 0x01, 0xc6, 0x00}, {0x38, 0x01, 0xc6, 0x01},[m
[31m-        {0x03, 0x01, 0xe4, 0x00}, {0x06, 0x01, 0xe4, 0x00},[m
[31m-        {0x0a, 0x01, 0xe4, 0x00}, {0x0f, 0x01, 0xe4, 0x00},[m
[31m-        {0x18, 0x01, 0xe4, 0x00}, {0x1f, 0x01, 0xe4, 0x00},[m
[31m-        {0x29, 0x01, 0xe4, 0x00}, {0x38, 0x01, 0xe4, 0x01}[m
[31m-    },[m
[31m-    /* 145 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xe8, 0x00}, {0x06, 0x01, 0xe8, 0x00},[m
[31m-        {0x0a, 0x01, 0xe8, 0x00}, {0x0f, 0x01, 0xe8, 0x00},[m
[31m-        {0x18, 0x01, 0xe8, 0x00}, {0x1f, 0x01, 0xe8, 0x00},[m
[31m-        {0x29, 0x01, 0xe8, 0x00}, {0x38, 0x01, 0xe8, 0x01},[m
[31m-        {0x03, 0x01, 0xe9, 0x00}, {0x06, 0x01, 0xe9, 0x00},[m
[31m-        {0x0a, 0x01, 0xe9, 0x00}, {0x0f, 0x01, 0xe9, 0x00},[m
[31m-        {0x18, 0x01, 0xe9, 0x00}, {0x1f, 0x01, 0xe9, 0x00},[m
[31m-        {0x29, 0x01, 0xe9, 0x00}, {0x38, 0x01, 0xe9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x01, 0x00}, {0x16, 0x01, 0x01, 0x01},[m
[31m-        {0x01, 0x01, 0x87, 0x00}, {0x16, 0x01, 0x87, 0x01},[m
[31m-        {0x01, 0x01, 0x89, 0x00}, {0x16, 0x01, 0x89, 0x01},[m
[31m-        {0x01, 0x01, 0x8a, 0x00}, {0x16, 0x01, 0x8a, 0x01},[m
[31m-        {0x01, 0x01, 0x8b, 0x00}, {0x16, 0x01, 0x8b, 0x01},[m
[31m-        {0x01, 0x01, 0x8c, 0x00}, {0x16, 0x01, 0x8c, 0x01},[m
[31m-        {0x01, 0x01, 0x8d, 0x00}, {0x16, 0x01, 0x8d, 0x01},[m
[31m-        {0x01, 0x01, 0x8f, 0x00}, {0x16, 0x01, 0x8f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x01, 0x00}, {0x09, 0x01, 0x01, 0x00},[m
[31m-        {0x17, 0x01, 0x01, 0x00}, {0x28, 0x01, 0x01, 0x01},[m
[31m-        {0x02, 0x01, 0x87, 0x00}, {0x09, 0x01, 0x87, 0x00},[m
[31m-        {0x17, 0x01, 0x87, 0x00}, {0x28, 0x01, 0x87, 0x01},[m
[31m-        {0x02, 0x01, 0x89, 0x00}, {0x09, 0x01, 0x89, 0x00},[m
[31m-        {0x17, 0x01, 0x89, 0x00}, {0x28, 0x01, 0x89, 0x01},[m
[31m-        {0x02, 0x01, 0x8a, 0x00}, {0x09, 0x01, 0x8a, 0x00},[m
[31m-        {0x17, 0x01, 0x8a, 0x00}, {0x28, 0x01, 0x8a, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x01, 0x00}, {0x06, 0x01, 0x01, 0x00},[m
[31m-        {0x0a, 0x01, 0x01, 0x00}, {0x0f, 0x01, 0x01, 0x00},[m
[31m-        {0x18, 0x01, 0x01, 0x00}, {0x1f, 0x01, 0x01, 0x00},[m
[31m-        {0x29, 0x01, 0x01, 0x00}, {0x38, 0x01, 0x01, 0x01},[m
[31m-        {0x03, 0x01, 0x87, 0x00}, {0x06, 0x01, 0x87, 0x00},[m
[31m-        {0x0a, 0x01, 0x87, 0x00}, {0x0f, 0x01, 0x87, 0x00},[m
[31m-        {0x18, 0x01, 0x87, 0x00}, {0x1f, 0x01, 0x87, 0x00},[m
[31m-        {0x29, 0x01, 0x87, 0x00}, {0x38, 0x01, 0x87, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x89, 0x00}, {0x06, 0x01, 0x89, 0x00},[m
[31m-        {0x0a, 0x01, 0x89, 0x00}, {0x0f, 0x01, 0x89, 0x00},[m
[31m-        {0x18, 0x01, 0x89, 0x00}, {0x1f, 0x01, 0x89, 0x00},[m
[31m-        {0x29, 0x01, 0x89, 0x00}, {0x38, 0x01, 0x89, 0x01},[m
[31m-        {0x03, 0x01, 0x8a, 0x00}, {0x06, 0x01, 0x8a, 0x00},[m
[31m-        {0x0a, 0x01, 0x8a, 0x00}, {0x0f, 0x01, 0x8a, 0x00},[m
[31m-        {0x18, 0x01, 0x8a, 0x00}, {0x1f, 0x01, 0x8a, 0x00},[m
[31m-        {0x29, 0x01, 0x8a, 0x00}, {0x38, 0x01, 0x8a, 0x01}[m
[31m-    },[m
[31m-    /* 150 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x8b, 0x00}, {0x09, 0x01, 0x8b, 0x00},[m
[31m-        {0x17, 0x01, 0x8b, 0x00}, {0x28, 0x01, 0x8b, 0x01},[m
[31m-        {0x02, 0x01, 0x8c, 0x00}, {0x09, 0x01, 0x8c, 0x00},[m
[31m-        {0x17, 0x01, 0x8c, 0x00}, {0x28, 0x01, 0x8c, 0x01},[m
[31m-        {0x02, 0x01, 0x8d, 0x00}, {0x09, 0x01, 0x8d, 0x00},[m
[31m-        {0x17, 0x01, 0x8d, 0x00}, {0x28, 0x01, 0x8d, 0x01},[m
[31m-        {0x02, 0x01, 0x8f, 0x00}, {0x09, 0x01, 0x8f, 0x00},[m
[31m-        {0x17, 0x01, 0x8f, 0x00}, {0x28, 0x01, 0x8f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x8b, 0x00}, {0x06, 0x01, 0x8b, 0x00},[m
[31m-        {0x0a, 0x01, 0x8b, 0x00}, {0x0f, 0x01, 0x8b, 0x00},[m
[31m-        {0x18, 0x01, 0x8b, 0x00}, {0x1f, 0x01, 0x8b, 0x00},[m
[31m-        {0x29, 0x01, 0x8b, 0x00}, {0x38, 0x01, 0x8b, 0x01},[m
[31m-        {0x03, 0x01, 0x8c, 0x00}, {0x06, 0x01, 0x8c, 0x00},[m
[31m-        {0x0a, 0x01, 0x8c, 0x00}, {0x0f, 0x01, 0x8c, 0x00},[m
[31m-        {0x18, 0x01, 0x8c, 0x00}, {0x1f, 0x01, 0x8c, 0x00},[m
[31m-        {0x29, 0x01, 0x8c, 0x00}, {0x38, 0x01, 0x8c, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x8d, 0x00}, {0x06, 0x01, 0x8d, 0x00},[m
[31m-        {0x0a, 0x01, 0x8d, 0x00}, {0x0f, 0x01, 0x8d, 0x00},[m
[31m-        {0x18, 0x01, 0x8d, 0x00}, {0x1f, 0x01, 0x8d, 0x00},[m
[31m-        {0x29, 0x01, 0x8d, 0x00}, {0x38, 0x01, 0x8d, 0x01},[m
[31m-        {0x03, 0x01, 0x8f, 0x00}, {0x06, 0x01, 0x8f, 0x00},[m
[31m-        {0x0a, 0x01, 0x8f, 0x00}, {0x0f, 0x01, 0x8f, 0x00},[m
[31m-        {0x18, 0x01, 0x8f, 0x00}, {0x1f, 0x01, 0x8f, 0x00},[m
[31m-        {0x29, 0x01, 0x8f, 0x00}, {0x38, 0x01, 0x8f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x9d, 0x00, 0x00, 0x00}, {0x9e, 0x00, 0x00, 0x00},[m
[31m-        {0xa0, 0x00, 0x00, 0x00}, {0xa1, 0x00, 0x00, 0x00},[m
[31m-        {0xa4, 0x00, 0x00, 0x00}, {0xa5, 0x00, 0x00, 0x00},[m
[31m-        {0xa7, 0x00, 0x00, 0x00}, {0xa8, 0x00, 0x00, 0x00},[m
[31m-        {0xac, 0x00, 0x00, 0x00}, {0xad, 0x00, 0x00, 0x00},[m
[31m-        {0xaf, 0x00, 0x00, 0x00}, {0xb1, 0x00, 0x00, 0x00},[m
[31m-        {0xb6, 0x00, 0x00, 0x00}, {0xb9, 0x00, 0x00, 0x00},[m
[31m-        {0xbf, 0x00, 0x00, 0x00}, {0xcf, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x93, 0x01}, {0x00, 0x01, 0x95, 0x01},[m
[31m-        {0x00, 0x01, 0x96, 0x01}, {0x00, 0x01, 0x97, 0x01},[m
[31m-        {0x00, 0x01, 0x98, 0x01}, {0x00, 0x01, 0x9b, 0x01},[m
[31m-        {0x00, 0x01, 0x9d, 0x01}, {0x00, 0x01, 0x9e, 0x01},[m
[31m-        {0x00, 0x01, 0xa5, 0x01}, {0x00, 0x01, 0xa6, 0x01},[m
[31m-        {0x00, 0x01, 0xa8, 0x01}, {0x00, 0x01, 0xae, 0x01},[m
[31m-        {0x00, 0x01, 0xaf, 0x01}, {0x00, 0x01, 0xb4, 0x01},[m
[31m-        {0x00, 0x01, 0xb6, 0x01}, {0x00, 0x01, 0xb7, 0x01}[m
[31m-    },[m
[31m-    /* 155 */[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x93, 0x00}, {0x16, 0x01, 0x93, 0x01},[m
[31m-        {0x01, 0x01, 0x95, 0x00}, {0x16, 0x01, 0x95, 0x01},[m
[31m-        {0x01, 0x01, 0x96, 0x00}, {0x16, 0x01, 0x96, 0x01},[m
[31m-        {0x01, 0x01, 0x97, 0x00}, {0x16, 0x01, 0x97, 0x01},[m
[31m-        {0x01, 0x01, 0x98, 0x00}, {0x16, 0x01, 0x98, 0x01},[m
[31m-        {0x01, 0x01, 0x9b, 0x00}, {0x16, 0x01, 0x9b, 0x01},[m
[31m-        {0x01, 0x01, 0x9d, 0x00}, {0x16, 0x01, 0x9d, 0x01},[m
[31m-        {0x01, 0x01, 0x9e, 0x00}, {0x16, 0x01, 0x9e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x93, 0x00}, {0x09, 0x01, 0x93, 0x00},[m
[31m-        {0x17, 0x01, 0x93, 0x00}, {0x28, 0x01, 0x93, 0x01},[m
[31m-        {0x02, 0x01, 0x95, 0x00}, {0x09, 0x01, 0x95, 0x00},[m
[31m-        {0x17, 0x01, 0x95, 0x00}, {0x28, 0x01, 0x95, 0x01},[m
[31m-        {0x02, 0x01, 0x96, 0x00}, {0x09, 0x01, 0x96, 0x00},[m
[31m-        {0x17, 0x01, 0x96, 0x00}, {0x28, 0x01, 0x96, 0x01},[m
[31m-        {0x02, 0x01, 0x97, 0x00}, {0x09, 0x01, 0x97, 0x00},[m
[31m-        {0x17, 0x01, 0x97, 0x00}, {0x28, 0x01, 0x97, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x93, 0x00}, {0x06, 0x01, 0x93, 0x00},[m
[31m-        {0x0a, 0x01, 0x93, 0x00}, {0x0f, 0x01, 0x93, 0x00},[m
[31m-        {0x18, 0x01, 0x93, 0x00}, {0x1f, 0x01, 0x93, 0x00},[m
[31m-        {0x29, 0x01, 0x93, 0x00}, {0x38, 0x01, 0x93, 0x01},[m
[31m-        {0x03, 0x01, 0x95, 0x00}, {0x06, 0x01, 0x95, 0x00},[m
[31m-        {0x0a, 0x01, 0x95, 0x00}, {0x0f, 0x01, 0x95, 0x00},[m
[31m-        {0x18, 0x01, 0x95, 0x00}, {0x1f, 0x01, 0x95, 0x00},[m
[31m-        {0x29, 0x01, 0x95, 0x00}, {0x38, 0x01, 0x95, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x96, 0x00}, {0x06, 0x01, 0x96, 0x00},[m
[31m-        {0x0a, 0x01, 0x96, 0x00}, {0x0f, 0x01, 0x96, 0x00},[m
[31m-        {0x18, 0x01, 0x96, 0x00}, {0x1f, 0x01, 0x96, 0x00},[m
[31m-        {0x29, 0x01, 0x96, 0x00}, {0x38, 0x01, 0x96, 0x01},[m
[31m-        {0x03, 0x01, 0x97, 0x00}, {0x06, 0x01, 0x97, 0x00},[m
[31m-        {0x0a, 0x01, 0x97, 0x00}, {0x0f, 0x01, 0x97, 0x00},[m
[31m-        {0x18, 0x01, 0x97, 0x00}, {0x1f, 0x01, 0x97, 0x00},[m
[31m-        {0x29, 0x01, 0x97, 0x00}, {0x38, 0x01, 0x97, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x98, 0x00}, {0x09, 0x01, 0x98, 0x00},[m
[31m-        {0x17, 0x01, 0x98, 0x00}, {0x28, 0x01, 0x98, 0x01},[m
[31m-        {0x02, 0x01, 0x9b, 0x00}, {0x09, 0x01, 0x9b, 0x00},[m
[31m-        {0x17, 0x01, 0x9b, 0x00}, {0x28, 0x01, 0x9b, 0x01},[m
[31m-        {0x02, 0x01, 0x9d, 0x00}, {0x09, 0x01, 0x9d, 0x00},[m
[31m-        {0x17, 0x01, 0x9d, 0x00}, {0x28, 0x01, 0x9d, 0x01},[m
[31m-        {0x02, 0x01, 0x9e, 0x00}, {0x09, 0x01, 0x9e, 0x00},[m
[31m-        {0x17, 0x01, 0x9e, 0x00}, {0x28, 0x01, 0x9e, 0x01}[m
[31m-    },[m
[31m-    /* 160 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x98, 0x00}, {0x06, 0x01, 0x98, 0x00},[m
[31m-        {0x0a, 0x01, 0x98, 0x00}, {0x0f, 0x01, 0x98, 0x00},[m
[31m-        {0x18, 0x01, 0x98, 0x00}, {0x1f, 0x01, 0x98, 0x00},[m
[31m-        {0x29, 0x01, 0x98, 0x00}, {0x38, 0x01, 0x98, 0x01},[m
[31m-        {0x03, 0x01, 0x9b, 0x00}, {0x06, 0x01, 0x9b, 0x00},[m
[31m-        {0x0a, 0x01, 0x9b, 0x00}, {0x0f, 0x01, 0x9b, 0x00},[m
[31m-        {0x18, 0x01, 0x9b, 0x00}, {0x1f, 0x01, 0x9b, 0x00},[m
[31m-        {0x29, 0x01, 0x9b, 0x00}, {0x38, 0x01, 0x9b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x9d, 0x00}, {0x06, 0x01, 0x9d, 0x00},[m
[31m-        {0x0a, 0x01, 0x9d, 0x00}, {0x0f, 0x01, 0x9d, 0x00},[m
[31m-        {0x18, 0x01, 0x9d, 0x00}, {0x1f, 0x01, 0x9d, 0x00},[m
[31m-        {0x29, 0x01, 0x9d, 0x00}, {0x38, 0x01, 0x9d, 0x01},[m
[31m-        {0x03, 0x01, 0x9e, 0x00}, {0x06, 0x01, 0x9e, 0x00},[m
[31m-        {0x0a, 0x01, 0x9e, 0x00}, {0x0f, 0x01, 0x9e, 0x00},[m
[31m-        {0x18, 0x01, 0x9e, 0x00}, {0x1f, 0x01, 0x9e, 0x00},[m
[31m-        {0x29, 0x01, 0x9e, 0x00}, {0x38, 0x01, 0x9e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xa5, 0x00}, {0x16, 0x01, 0xa5, 0x01},[m
[31m-        {0x01, 0x01, 0xa6, 0x00}, {0x16, 0x01, 0xa6, 0x01},[m
[31m-        {0x01, 0x01, 0xa8, 0x00}, {0x16, 0x01, 0xa8, 0x01},[m
[31m-        {0x01, 0x01, 0xae, 0x00}, {0x16, 0x01, 0xae, 0x01},[m
[31m-        {0x01, 0x01, 0xaf, 0x00}, {0x16, 0x01, 0xaf, 0x01},[m
[31m-        {0x01, 0x01, 0xb4, 0x00}, {0x16, 0x01, 0xb4, 0x01},[m
[31m-        {0x01, 0x01, 0xb6, 0x00}, {0x16, 0x01, 0xb6, 0x01},[m
[31m-        {0x01, 0x01, 0xb7, 0x00}, {0x16, 0x01, 0xb7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xa5, 0x00}, {0x09, 0x01, 0xa5, 0x00},[m
[31m-        {0x17, 0x01, 0xa5, 0x00}, {0x28, 0x01, 0xa5, 0x01},[m
[31m-        {0x02, 0x01, 0xa6, 0x00}, {0x09, 0x01, 0xa6, 0x00},[m
[31m-        {0x17, 0x01, 0xa6, 0x00}, {0x28, 0x01, 0xa6, 0x01},[m
[31m-        {0x02, 0x01, 0xa8, 0x00}, {0x09, 0x01, 0xa8, 0x00},[m
[31m-        {0x17, 0x01, 0xa8, 0x00}, {0x28, 0x01, 0xa8, 0x01},[m
[31m-        {0x02, 0x01, 0xae, 0x00}, {0x09, 0x01, 0xae, 0x00},[m
[31m-        {0x17, 0x01, 0xae, 0x00}, {0x28, 0x01, 0xae, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa5, 0x00}, {0x06, 0x01, 0xa5, 0x00},[m
[31m-        {0x0a, 0x01, 0xa5, 0x00}, {0x0f, 0x01, 0xa5, 0x00},[m
[31m-        {0x18, 0x01, 0xa5, 0x00}, {0x1f, 0x01, 0xa5, 0x00},[m
[31m-        {0x29, 0x01, 0xa5, 0x00}, {0x38, 0x01, 0xa5, 0x01},[m
[31m-        {0x03, 0x01, 0xa6, 0x00}, {0x06, 0x01, 0xa6, 0x00},[m
[31m-        {0x0a, 0x01, 0xa6, 0x00}, {0x0f, 0x01, 0xa6, 0x00},[m
[31m-        {0x18, 0x01, 0xa6, 0x00}, {0x1f, 0x01, 0xa6, 0x00},[m
[31m-        {0x29, 0x01, 0xa6, 0x00}, {0x38, 0x01, 0xa6, 0x01}[m
[31m-    },[m
[31m-    /* 165 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xa8, 0x00}, {0x06, 0x01, 0xa8, 0x00},[m
[31m-        {0x0a, 0x01, 0xa8, 0x00}, {0x0f, 0x01, 0xa8, 0x00},[m
[31m-        {0x18, 0x01, 0xa8, 0x00}, {0x1f, 0x01, 0xa8, 0x00},[m
[31m-        {0x29, 0x01, 0xa8, 0x00}, {0x38, 0x01, 0xa8, 0x01},[m
[31m-        {0x03, 0x01, 0xae, 0x00}, {0x06, 0x01, 0xae, 0x00},[m
[31m-        {0x0a, 0x01, 0xae, 0x00}, {0x0f, 0x01, 0xae, 0x00},[m
[31m-        {0x18, 0x01, 0xae, 0x00}, {0x1f, 0x01, 0xae, 0x00},[m
[31m-        {0x29, 0x01, 0xae, 0x00}, {0x38, 0x01, 0xae, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xaf, 0x00}, {0x09, 0x01, 0xaf, 0x00},[m
[31m-        {0x17, 0x01, 0xaf, 0x00}, {0x28, 0x01, 0xaf, 0x01},[m
[31m-        {0x02, 0x01, 0xb4, 0x00}, {0x09, 0x01, 0xb4, 0x00},[m
[31m-        {0x17, 0x01, 0xb4, 0x00}, {0x28, 0x01, 0xb4, 0x01},[m
[31m-        {0x02, 0x01, 0xb6, 0x00}, {0x09, 0x01, 0xb6, 0x00},[m
[31m-        {0x17, 0x01, 0xb6, 0x00}, {0x28, 0x01, 0xb6, 0x01},[m
[31m-        {0x02, 0x01, 0xb7, 0x00}, {0x09, 0x01, 0xb7, 0x00},[m
[31m-        {0x17, 0x01, 0xb7, 0x00}, {0x28, 0x01, 0xb7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xaf, 0x00}, {0x06, 0x01, 0xaf, 0x00},[m
[31m-        {0x0a, 0x01, 0xaf, 0x00}, {0x0f, 0x01, 0xaf, 0x00},[m
[31m-        {0x18, 0x01, 0xaf, 0x00}, {0x1f, 0x01, 0xaf, 0x00},[m
[31m-        {0x29, 0x01, 0xaf, 0x00}, {0x38, 0x01, 0xaf, 0x01},[m
[31m-        {0x03, 0x01, 0xb4, 0x00}, {0x06, 0x01, 0xb4, 0x00},[m
[31m-        {0x0a, 0x01, 0xb4, 0x00}, {0x0f, 0x01, 0xb4, 0x00},[m
[31m-        {0x18, 0x01, 0xb4, 0x00}, {0x1f, 0x01, 0xb4, 0x00},[m
[31m-        {0x29, 0x01, 0xb4, 0x00}, {0x38, 0x01, 0xb4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xb6, 0x00}, {0x06, 0x01, 0xb6, 0x00},[m
[31m-        {0x0a, 0x01, 0xb6, 0x00}, {0x0f, 0x01, 0xb6, 0x00},[m
[31m-        {0x18, 0x01, 0xb6, 0x00}, {0x1f, 0x01, 0xb6, 0x00},[m
[31m-        {0x29, 0x01, 0xb6, 0x00}, {0x38, 0x01, 0xb6, 0x01},[m
[31m-        {0x03, 0x01, 0xb7, 0x00}, {0x06, 0x01, 0xb7, 0x00},[m
[31m-        {0x0a, 0x01, 0xb7, 0x00}, {0x0f, 0x01, 0xb7, 0x00},[m
[31m-        {0x18, 0x01, 0xb7, 0x00}, {0x1f, 0x01, 0xb7, 0x00},[m
[31m-        {0x29, 0x01, 0xb7, 0x00}, {0x38, 0x01, 0xb7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xbc, 0x01}, {0x00, 0x01, 0xbf, 0x01},[m
[31m-        {0x00, 0x01, 0xc5, 0x01}, {0x00, 0x01, 0xe7, 0x01},[m
[31m-        {0x00, 0x01, 0xef, 0x01}, {0xb0, 0x00, 0x00, 0x00},[m
[31m-        {0xb2, 0x00, 0x00, 0x00}, {0xb3, 0x00, 0x00, 0x00},[m
[31m-        {0xb7, 0x00, 0x00, 0x00}, {0xb8, 0x00, 0x00, 0x00},[m
[31m-        {0xba, 0x00, 0x00, 0x00}, {0xbb, 0x00, 0x00, 0x00},[m
[31m-        {0xc0, 0x00, 0x00, 0x00}, {0xc7, 0x00, 0x00, 0x00},[m
[31m-        {0xd0, 0x00, 0x00, 0x00}, {0xdf, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    /* 170 */[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xbc, 0x00}, {0x16, 0x01, 0xbc, 0x01},[m
[31m-        {0x01, 0x01, 0xbf, 0x00}, {0x16, 0x01, 0xbf, 0x01},[m
[31m-        {0x01, 0x01, 0xc5, 0x00}, {0x16, 0x01, 0xc5, 0x01},[m
[31m-        {0x01, 0x01, 0xe7, 0x00}, {0x16, 0x01, 0xe7, 0x01},[m
[31m-        {0x01, 0x01, 0xef, 0x00}, {0x16, 0x01, 0xef, 0x01},[m
[31m-        {0x00, 0x01, 0x09, 0x01}, {0x00, 0x01, 0x8e, 0x01},[m
[31m-        {0x00, 0x01, 0x90, 0x01}, {0x00, 0x01, 0x91, 0x01},[m
[31m-        {0x00, 0x01, 0x94, 0x01}, {0x00, 0x01, 0x9f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xbc, 0x00}, {0x09, 0x01, 0xbc, 0x00},[m
[31m-        {0x17, 0x01, 0xbc, 0x00}, {0x28, 0x01, 0xbc, 0x01},[m
[31m-        {0x02, 0x01, 0xbf, 0x00}, {0x09, 0x01, 0xbf, 0x00},[m
[31m-        {0x17, 0x01, 0xbf, 0x00}, {0x28, 0x01, 0xbf, 0x01},[m
[31m-        {0x02, 0x01, 0xc5, 0x00}, {0x09, 0x01, 0xc5, 0x00},[m
[31m-        {0x17, 0x01, 0xc5, 0x00}, {0x28, 0x01, 0xc5, 0x01},[m
[31m-        {0x02, 0x01, 0xe7, 0x00}, {0x09, 0x01, 0xe7, 0x00},[m
[31m-        {0x17, 0x01, 0xe7, 0x00}, {0x28, 0x01, 0xe7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xbc, 0x00}, {0x06, 0x01, 0xbc, 0x00},[m
[31m-        {0x0a, 0x01, 0xbc, 0x00}, {0x0f, 0x01, 0xbc, 0x00},[m
[31m-        {0x18, 0x01, 0xbc, 0x00}, {0x1f, 0x01, 0xbc, 0x00},[m
[31m-        {0x29, 0x01, 0xbc, 0x00}, {0x38, 0x01, 0xbc, 0x01},[m
[31m-        {0x03, 0x01, 0xbf, 0x00}, {0x06, 0x01, 0xbf, 0x00},[m
[31m-        {0x0a, 0x01, 0xbf, 0x00}, {0x0f, 0x01, 0xbf, 0x00},[m
[31m-        {0x18, 0x01, 0xbf, 0x00}, {0x1f, 0x01, 0xbf, 0x00},[m
[31m-        {0x29, 0x01, 0xbf, 0x00}, {0x38, 0x01, 0xbf, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc5, 0x00}, {0x06, 0x01, 0xc5, 0x00},[m
[31m-        {0x0a, 0x01, 0xc5, 0x00}, {0x0f, 0x01, 0xc5, 0x00},[m
[31m-        {0x18, 0x01, 0xc5, 0x00}, {0x1f, 0x01, 0xc5, 0x00},[m
[31m-        {0x29, 0x01, 0xc5, 0x00}, {0x38, 0x01, 0xc5, 0x01},[m
[31m-        {0x03, 0x01, 0xe7, 0x00}, {0x06, 0x01, 0xe7, 0x00},[m
[31m-        {0x0a, 0x01, 0xe7, 0x00}, {0x0f, 0x01, 0xe7, 0x00},[m
[31m-        {0x18, 0x01, 0xe7, 0x00}, {0x1f, 0x01, 0xe7, 0x00},[m
[31m-        {0x29, 0x01, 0xe7, 0x00}, {0x38, 0x01, 0xe7, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xef, 0x00}, {0x09, 0x01, 0xef, 0x00},[m
[31m-        {0x17, 0x01, 0xef, 0x00}, {0x28, 0x01, 0xef, 0x01},[m
[31m-        {0x01, 0x01, 0x09, 0x00}, {0x16, 0x01, 0x09, 0x01},[m
[31m-        {0x01, 0x01, 0x8e, 0x00}, {0x16, 0x01, 0x8e, 0x01},[m
[31m-        {0x01, 0x01, 0x90, 0x00}, {0x16, 0x01, 0x90, 0x01},[m
[31m-        {0x01, 0x01, 0x91, 0x00}, {0x16, 0x01, 0x91, 0x01},[m
[31m-        {0x01, 0x01, 0x94, 0x00}, {0x16, 0x01, 0x94, 0x01},[m
[31m-        {0x01, 0x01, 0x9f, 0x00}, {0x16, 0x01, 0x9f, 0x01}[m
[31m-    },[m
[31m-    /* 175 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xef, 0x00}, {0x06, 0x01, 0xef, 0x00},[m
[31m-        {0x0a, 0x01, 0xef, 0x00}, {0x0f, 0x01, 0xef, 0x00},[m
[31m-        {0x18, 0x01, 0xef, 0x00}, {0x1f, 0x01, 0xef, 0x00},[m
[31m-        {0x29, 0x01, 0xef, 0x00}, {0x38, 0x01, 0xef, 0x01},[m
[31m-        {0x02, 0x01, 0x09, 0x00}, {0x09, 0x01, 0x09, 0x00},[m
[31m-        {0x17, 0x01, 0x09, 0x00}, {0x28, 0x01, 0x09, 0x01},[m
[31m-        {0x02, 0x01, 0x8e, 0x00}, {0x09, 0x01, 0x8e, 0x00},[m
[31m-        {0x17, 0x01, 0x8e, 0x00}, {0x28, 0x01, 0x8e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x09, 0x00}, {0x06, 0x01, 0x09, 0x00},[m
[31m-        {0x0a, 0x01, 0x09, 0x00}, {0x0f, 0x01, 0x09, 0x00},[m
[31m-        {0x18, 0x01, 0x09, 0x00}, {0x1f, 0x01, 0x09, 0x00},[m
[31m-        {0x29, 0x01, 0x09, 0x00}, {0x38, 0x01, 0x09, 0x01},[m
[31m-        {0x03, 0x01, 0x8e, 0x00}, {0x06, 0x01, 0x8e, 0x00},[m
[31m-        {0x0a, 0x01, 0x8e, 0x00}, {0x0f, 0x01, 0x8e, 0x00},[m
[31m-        {0x18, 0x01, 0x8e, 0x00}, {0x1f, 0x01, 0x8e, 0x00},[m
[31m-        {0x29, 0x01, 0x8e, 0x00}, {0x38, 0x01, 0x8e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x90, 0x00}, {0x09, 0x01, 0x90, 0x00},[m
[31m-        {0x17, 0x01, 0x90, 0x00}, {0x28, 0x01, 0x90, 0x01},[m
[31m-        {0x02, 0x01, 0x91, 0x00}, {0x09, 0x01, 0x91, 0x00},[m
[31m-        {0x17, 0x01, 0x91, 0x00}, {0x28, 0x01, 0x91, 0x01},[m
[31m-        {0x02, 0x01, 0x94, 0x00}, {0x09, 0x01, 0x94, 0x00},[m
[31m-        {0x17, 0x01, 0x94, 0x00}, {0x28, 0x01, 0x94, 0x01},[m
[31m-        {0x02, 0x01, 0x9f, 0x00}, {0x09, 0x01, 0x9f, 0x00},[m
[31m-        {0x17, 0x01, 0x9f, 0x00}, {0x28, 0x01, 0x9f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x90, 0x00}, {0x06, 0x01, 0x90, 0x00},[m
[31m-        {0x0a, 0x01, 0x90, 0x00}, {0x0f, 0x01, 0x90, 0x00},[m
[31m-        {0x18, 0x01, 0x90, 0x00}, {0x1f, 0x01, 0x90, 0x00},[m
[31m-        {0x29, 0x01, 0x90, 0x00}, {0x38, 0x01, 0x90, 0x01},[m
[31m-        {0x03, 0x01, 0x91, 0x00}, {0x06, 0x01, 0x91, 0x00},[m
[31m-        {0x0a, 0x01, 0x91, 0x00}, {0x0f, 0x01, 0x91, 0x00},[m
[31m-        {0x18, 0x01, 0x91, 0x00}, {0x1f, 0x01, 0x91, 0x00},[m
[31m-        {0x29, 0x01, 0x91, 0x00}, {0x38, 0x01, 0x91, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x94, 0x00}, {0x06, 0x01, 0x94, 0x00},[m
[31m-        {0x0a, 0x01, 0x94, 0x00}, {0x0f, 0x01, 0x94, 0x00},[m
[31m-        {0x18, 0x01, 0x94, 0x00}, {0x1f, 0x01, 0x94, 0x00},[m
[31m-        {0x29, 0x01, 0x94, 0x00}, {0x38, 0x01, 0x94, 0x01},[m
[31m-        {0x03, 0x01, 0x9f, 0x00}, {0x06, 0x01, 0x9f, 0x00},[m
[31m-        {0x0a, 0x01, 0x9f, 0x00}, {0x0f, 0x01, 0x9f, 0x00},[m
[31m-        {0x18, 0x01, 0x9f, 0x00}, {0x1f, 0x01, 0x9f, 0x00},[m
[31m-        {0x29, 0x01, 0x9f, 0x00}, {0x38, 0x01, 0x9f, 0x01}[m
[31m-    },[m
[31m-    /* 180 */[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xab, 0x01}, {0x00, 0x01, 0xce, 0x01},[m
[31m-        {0x00, 0x01, 0xd7, 0x01}, {0x00, 0x01, 0xe1, 0x01},[m
[31m-        {0x00, 0x01, 0xec, 0x01}, {0x00, 0x01, 0xed, 0x01},[m
[31m-        {0xbc, 0x00, 0x00, 0x00}, {0xbd, 0x00, 0x00, 0x00},[m
[31m-        {0xc1, 0x00, 0x00, 0x00}, {0xc4, 0x00, 0x00, 0x00},[m
[31m-        {0xc8, 0x00, 0x00, 0x00}, {0xcb, 0x00, 0x00, 0x00},[m
[31m-        {0xd1, 0x00, 0x00, 0x00}, {0xd8, 0x00, 0x00, 0x00},[m
[31m-        {0xe0, 0x00, 0x00, 0x00}, {0xee, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xab, 0x00}, {0x16, 0x01, 0xab, 0x01},[m
[31m-        {0x01, 0x01, 0xce, 0x00}, {0x16, 0x01, 0xce, 0x01},[m
[31m-        {0x01, 0x01, 0xd7, 0x00}, {0x16, 0x01, 0xd7, 0x01},[m
[31m-        {0x01, 0x01, 0xe1, 0x00}, {0x16, 0x01, 0xe1, 0x01},[m
[31m-        {0x01, 0x01, 0xec, 0x00}, {0x16, 0x01, 0xec, 0x01},[m
[31m-        {0x01, 0x01, 0xed, 0x00}, {0x16, 0x01, 0xed, 0x01},[m
[31m-        {0x00, 0x01, 0xc7, 0x01}, {0x00, 0x01, 0xcf, 0x01},[m
[31m-        {0x00, 0x01, 0xea, 0x01}, {0x00, 0x01, 0xeb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xab, 0x00}, {0x09, 0x01, 0xab, 0x00},[m
[31m-        {0x17, 0x01, 0xab, 0x00}, {0x28, 0x01, 0xab, 0x01},[m
[31m-        {0x02, 0x01, 0xce, 0x00}, {0x09, 0x01, 0xce, 0x00},[m
[31m-        {0x17, 0x01, 0xce, 0x00}, {0x28, 0x01, 0xce, 0x01},[m
[31m-        {0x02, 0x01, 0xd7, 0x00}, {0x09, 0x01, 0xd7, 0x00},[m
[31m-        {0x17, 0x01, 0xd7, 0x00}, {0x28, 0x01, 0xd7, 0x01},[m
[31m-        {0x02, 0x01, 0xe1, 0x00}, {0x09, 0x01, 0xe1, 0x00},[m
[31m-        {0x17, 0x01, 0xe1, 0x00}, {0x28, 0x01, 0xe1, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xab, 0x00}, {0x06, 0x01, 0xab, 0x00},[m
[31m-        {0x0a, 0x01, 0xab, 0x00}, {0x0f, 0x01, 0xab, 0x00},[m
[31m-        {0x18, 0x01, 0xab, 0x00}, {0x1f, 0x01, 0xab, 0x00},[m
[31m-        {0x29, 0x01, 0xab, 0x00}, {0x38, 0x01, 0xab, 0x01},[m
[31m-        {0x03, 0x01, 0xce, 0x00}, {0x06, 0x01, 0xce, 0x00},[m
[31m-        {0x0a, 0x01, 0xce, 0x00}, {0x0f, 0x01, 0xce, 0x00},[m
[31m-        {0x18, 0x01, 0xce, 0x00}, {0x1f, 0x01, 0xce, 0x00},[m
[31m-        {0x29, 0x01, 0xce, 0x00}, {0x38, 0x01, 0xce, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd7, 0x00}, {0x06, 0x01, 0xd7, 0x00},[m
[31m-        {0x0a, 0x01, 0xd7, 0x00}, {0x0f, 0x01, 0xd7, 0x00},[m
[31m-        {0x18, 0x01, 0xd7, 0x00}, {0x1f, 0x01, 0xd7, 0x00},[m
[31m-        {0x29, 0x01, 0xd7, 0x00}, {0x38, 0x01, 0xd7, 0x01},[m
[31m-        {0x03, 0x01, 0xe1, 0x00}, {0x06, 0x01, 0xe1, 0x00},[m
[31m-        {0x0a, 0x01, 0xe1, 0x00}, {0x0f, 0x01, 0xe1, 0x00},[m
[31m-        {0x18, 0x01, 0xe1, 0x00}, {0x1f, 0x01, 0xe1, 0x00},[m
[31m-        {0x29, 0x01, 0xe1, 0x00}, {0x38, 0x01, 0xe1, 0x01}[m
[31m-    },[m
[31m-    /* 185 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xec, 0x00}, {0x09, 0x01, 0xec, 0x00},[m
[31m-        {0x17, 0x01, 0xec, 0x00}, {0x28, 0x01, 0xec, 0x01},[m
[31m-        {0x02, 0x01, 0xed, 0x00}, {0x09, 0x01, 0xed, 0x00},[m
[31m-        {0x17, 0x01, 0xed, 0x00}, {0x28, 0x01, 0xed, 0x01},[m
[31m-        {0x01, 0x01, 0xc7, 0x00}, {0x16, 0x01, 0xc7, 0x01},[m
[31m-        {0x01, 0x01, 0xcf, 0x00}, {0x16, 0x01, 0xcf, 0x01},[m
[31m-        {0x01, 0x01, 0xea, 0x00}, {0x16, 0x01, 0xea, 0x01},[m
[31m-        {0x01, 0x01, 0xeb, 0x00}, {0x16, 0x01, 0xeb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xec, 0x00}, {0x06, 0x01, 0xec, 0x00},[m
[31m-        {0x0a, 0x01, 0xec, 0x00}, {0x0f, 0x01, 0xec, 0x00},[m
[31m-        {0x18, 0x01, 0xec, 0x00}, {0x1f, 0x01, 0xec, 0x00},[m
[31m-        {0x29, 0x01, 0xec, 0x00}, {0x38, 0x01, 0xec, 0x01},[m
[31m-        {0x03, 0x01, 0xed, 0x00}, {0x06, 0x01, 0xed, 0x00},[m
[31m-        {0x0a, 0x01, 0xed, 0x00}, {0x0f, 0x01, 0xed, 0x00},[m
[31m-        {0x18, 0x01, 0xed, 0x00}, {0x1f, 0x01, 0xed, 0x00},[m
[31m-        {0x29, 0x01, 0xed, 0x00}, {0x38, 0x01, 0xed, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xc7, 0x00}, {0x09, 0x01, 0xc7, 0x00},[m
[31m-        {0x17, 0x01, 0xc7, 0x00}, {0x28, 0x01, 0xc7, 0x01},[m
[31m-        {0x02, 0x01, 0xcf, 0x00}, {0x09, 0x01, 0xcf, 0x00},[m
[31m-        {0x17, 0x01, 0xcf, 0x00}, {0x28, 0x01, 0xcf, 0x01},[m
[31m-        {0x02, 0x01, 0xea, 0x00}, {0x09, 0x01, 0xea, 0x00},[m
[31m-        {0x17, 0x01, 0xea, 0x00}, {0x28, 0x01, 0xea, 0x01},[m
[31m-        {0x02, 0x01, 0xeb, 0x00}, {0x09, 0x01, 0xeb, 0x00},[m
[31m-        {0x17, 0x01, 0xeb, 0x00}, {0x28, 0x01, 0xeb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc7, 0x00}, {0x06, 0x01, 0xc7, 0x00},[m
[31m-        {0x0a, 0x01, 0xc7, 0x00}, {0x0f, 0x01, 0xc7, 0x00},[m
[31m-        {0x18, 0x01, 0xc7, 0x00}, {0x1f, 0x01, 0xc7, 0x00},[m
[31m-        {0x29, 0x01, 0xc7, 0x00}, {0x38, 0x01, 0xc7, 0x01},[m
[31m-        {0x03, 0x01, 0xcf, 0x00}, {0x06, 0x01, 0xcf, 0x00},[m
[31m-        {0x0a, 0x01, 0xcf, 0x00}, {0x0f, 0x01, 0xcf, 0x00},[m
[31m-        {0x18, 0x01, 0xcf, 0x00}, {0x1f, 0x01, 0xcf, 0x00},[m
[31m-        {0x29, 0x01, 0xcf, 0x00}, {0x38, 0x01, 0xcf, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xea, 0x00}, {0x06, 0x01, 0xea, 0x00},[m
[31m-        {0x0a, 0x01, 0xea, 0x00}, {0x0f, 0x01, 0xea, 0x00},[m
[31m-        {0x18, 0x01, 0xea, 0x00}, {0x1f, 0x01, 0xea, 0x00},[m
[31m-        {0x29, 0x01, 0xea, 0x00}, {0x38, 0x01, 0xea, 0x01},[m
[31m-        {0x03, 0x01, 0xeb, 0x00}, {0x06, 0x01, 0xeb, 0x00},[m
[31m-        {0x0a, 0x01, 0xeb, 0x00}, {0x0f, 0x01, 0xeb, 0x00},[m
[31m-        {0x18, 0x01, 0xeb, 0x00}, {0x1f, 0x01, 0xeb, 0x00},[m
[31m-        {0x29, 0x01, 0xeb, 0x00}, {0x38, 0x01, 0xeb, 0x01}[m
[31m-    },[m
[31m-    /* 190 */[m
[31m-    {[m
[31m-        {0xc2, 0x00, 0x00, 0x00}, {0xc3, 0x00, 0x00, 0x00},[m
[31m-        {0xc5, 0x00, 0x00, 0x00}, {0xc6, 0x00, 0x00, 0x00},[m
[31m-        {0xc9, 0x00, 0x00, 0x00}, {0xca, 0x00, 0x00, 0x00},[m
[31m-        {0xcc, 0x00, 0x00, 0x00}, {0xcd, 0x00, 0x00, 0x00},[m
[31m-        {0xd2, 0x00, 0x00, 0x00}, {0xd5, 0x00, 0x00, 0x00},[m
[31m-        {0xd9, 0x00, 0x00, 0x00}, {0xdc, 0x00, 0x00, 0x00},[m
[31m-        {0xe1, 0x00, 0x00, 0x00}, {0xe7, 0x00, 0x00, 0x00},[m
[31m-        {0xef, 0x00, 0x00, 0x00}, {0xf6, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xc0, 0x01}, {0x00, 0x01, 0xc1, 0x01},[m
[31m-        {0x00, 0x01, 0xc8, 0x01}, {0x00, 0x01, 0xc9, 0x01},[m
[31m-        {0x00, 0x01, 0xca, 0x01}, {0x00, 0x01, 0xcd, 0x01},[m
[31m-        {0x00, 0x01, 0xd2, 0x01}, {0x00, 0x01, 0xd5, 0x01},[m
[31m-        {0x00, 0x01, 0xda, 0x01}, {0x00, 0x01, 0xdb, 0x01},[m
[31m-        {0x00, 0x01, 0xee, 0x01}, {0x00, 0x01, 0xf0, 0x01},[m
[31m-        {0x00, 0x01, 0xf2, 0x01}, {0x00, 0x01, 0xf3, 0x01},[m
[31m-        {0x00, 0x01, 0xff, 0x01}, {0xce, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xc0, 0x00}, {0x16, 0x01, 0xc0, 0x01},[m
[31m-        {0x01, 0x01, 0xc1, 0x00}, {0x16, 0x01, 0xc1, 0x01},[m
[31m-        {0x01, 0x01, 0xc8, 0x00}, {0x16, 0x01, 0xc8, 0x01},[m
[31m-        {0x01, 0x01, 0xc9, 0x00}, {0x16, 0x01, 0xc9, 0x01},[m
[31m-        {0x01, 0x01, 0xca, 0x00}, {0x16, 0x01, 0xca, 0x01},[m
[31m-        {0x01, 0x01, 0xcd, 0x00}, {0x16, 0x01, 0xcd, 0x01},[m
[31m-        {0x01, 0x01, 0xd2, 0x00}, {0x16, 0x01, 0xd2, 0x01},[m
[31m-        {0x01, 0x01, 0xd5, 0x00}, {0x16, 0x01, 0xd5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xc0, 0x00}, {0x09, 0x01, 0xc0, 0x00},[m
[31m-        {0x17, 0x01, 0xc0, 0x00}, {0x28, 0x01, 0xc0, 0x01},[m
[31m-        {0x02, 0x01, 0xc1, 0x00}, {0x09, 0x01, 0xc1, 0x00},[m
[31m-        {0x17, 0x01, 0xc1, 0x00}, {0x28, 0x01, 0xc1, 0x01},[m
[31m-        {0x02, 0x01, 0xc8, 0x00}, {0x09, 0x01, 0xc8, 0x00},[m
[31m-        {0x17, 0x01, 0xc8, 0x00}, {0x28, 0x01, 0xc8, 0x01},[m
[31m-        {0x02, 0x01, 0xc9, 0x00}, {0x09, 0x01, 0xc9, 0x00},[m
[31m-        {0x17, 0x01, 0xc9, 0x00}, {0x28, 0x01, 0xc9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc0, 0x00}, {0x06, 0x01, 0xc0, 0x00},[m
[31m-        {0x0a, 0x01, 0xc0, 0x00}, {0x0f, 0x01, 0xc0, 0x00},[m
[31m-        {0x18, 0x01, 0xc0, 0x00}, {0x1f, 0x01, 0xc0, 0x00},[m
[31m-        {0x29, 0x01, 0xc0, 0x00}, {0x38, 0x01, 0xc0, 0x01},[m
[31m-        {0x03, 0x01, 0xc1, 0x00}, {0x06, 0x01, 0xc1, 0x00},[m
[31m-        {0x0a, 0x01, 0xc1, 0x00}, {0x0f, 0x01, 0xc1, 0x00},[m
[31m-        {0x18, 0x01, 0xc1, 0x00}, {0x1f, 0x01, 0xc1, 0x00},[m
[31m-        {0x29, 0x01, 0xc1, 0x00}, {0x38, 0x01, 0xc1, 0x01}[m
[31m-    },[m
[31m-    /* 195 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xc8, 0x00}, {0x06, 0x01, 0xc8, 0x00},[m
[31m-        {0x0a, 0x01, 0xc8, 0x00}, {0x0f, 0x01, 0xc8, 0x00},[m
[31m-        {0x18, 0x01, 0xc8, 0x00}, {0x1f, 0x01, 0xc8, 0x00},[m
[31m-        {0x29, 0x01, 0xc8, 0x00}, {0x38, 0x01, 0xc8, 0x01},[m
[31m-        {0x03, 0x01, 0xc9, 0x00}, {0x06, 0x01, 0xc9, 0x00},[m
[31m-        {0x0a, 0x01, 0xc9, 0x00}, {0x0f, 0x01, 0xc9, 0x00},[m
[31m-        {0x18, 0x01, 0xc9, 0x00}, {0x1f, 0x01, 0xc9, 0x00},[m
[31m-        {0x29, 0x01, 0xc9, 0x00}, {0x38, 0x01, 0xc9, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xca, 0x00}, {0x09, 0x01, 0xca, 0x00},[m
[31m-        {0x17, 0x01, 0xca, 0x00}, {0x28, 0x01, 0xca, 0x01},[m
[31m-        {0x02, 0x01, 0xcd, 0x00}, {0x09, 0x01, 0xcd, 0x00},[m
[31m-        {0x17, 0x01, 0xcd, 0x00}, {0x28, 0x01, 0xcd, 0x01},[m
[31m-        {0x02, 0x01, 0xd2, 0x00}, {0x09, 0x01, 0xd2, 0x00},[m
[31m-        {0x17, 0x01, 0xd2, 0x00}, {0x28, 0x01, 0xd2, 0x01},[m
[31m-        {0x02, 0x01, 0xd5, 0x00}, {0x09, 0x01, 0xd5, 0x00},[m
[31m-        {0x17, 0x01, 0xd5, 0x00}, {0x28, 0x01, 0xd5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xca, 0x00}, {0x06, 0x01, 0xca, 0x00},[m
[31m-        {0x0a, 0x01, 0xca, 0x00}, {0x0f, 0x01, 0xca, 0x00},[m
[31m-        {0x18, 0x01, 0xca, 0x00}, {0x1f, 0x01, 0xca, 0x00},[m
[31m-        {0x29, 0x01, 0xca, 0x00}, {0x38, 0x01, 0xca, 0x01},[m
[31m-        {0x03, 0x01, 0xcd, 0x00}, {0x06, 0x01, 0xcd, 0x00},[m
[31m-        {0x0a, 0x01, 0xcd, 0x00}, {0x0f, 0x01, 0xcd, 0x00},[m
[31m-        {0x18, 0x01, 0xcd, 0x00}, {0x1f, 0x01, 0xcd, 0x00},[m
[31m-        {0x29, 0x01, 0xcd, 0x00}, {0x38, 0x01, 0xcd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd2, 0x00}, {0x06, 0x01, 0xd2, 0x00},[m
[31m-        {0x0a, 0x01, 0xd2, 0x00}, {0x0f, 0x01, 0xd2, 0x00},[m
[31m-        {0x18, 0x01, 0xd2, 0x00}, {0x1f, 0x01, 0xd2, 0x00},[m
[31m-        {0x29, 0x01, 0xd2, 0x00}, {0x38, 0x01, 0xd2, 0x01},[m
[31m-        {0x03, 0x01, 0xd5, 0x00}, {0x06, 0x01, 0xd5, 0x00},[m
[31m-        {0x0a, 0x01, 0xd5, 0x00}, {0x0f, 0x01, 0xd5, 0x00},[m
[31m-        {0x18, 0x01, 0xd5, 0x00}, {0x1f, 0x01, 0xd5, 0x00},[m
[31m-        {0x29, 0x01, 0xd5, 0x00}, {0x38, 0x01, 0xd5, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xda, 0x00}, {0x16, 0x01, 0xda, 0x01},[m
[31m-        {0x01, 0x01, 0xdb, 0x00}, {0x16, 0x01, 0xdb, 0x01},[m
[31m-        {0x01, 0x01, 0xee, 0x00}, {0x16, 0x01, 0xee, 0x01},[m
[31m-        {0x01, 0x01, 0xf0, 0x00}, {0x16, 0x01, 0xf0, 0x01},[m
[31m-        {0x01, 0x01, 0xf2, 0x00}, {0x16, 0x01, 0xf2, 0x01},[m
[31m-        {0x01, 0x01, 0xf3, 0x00}, {0x16, 0x01, 0xf3, 0x01},[m
[31m-        {0x01, 0x01, 0xff, 0x00}, {0x16, 0x01, 0xff, 0x01},[m
[31m-        {0x00, 0x01, 0xcb, 0x01}, {0x00, 0x01, 0xcc, 0x01}[m
[31m-    },[m
[31m-    /* 200 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xda, 0x00}, {0x09, 0x01, 0xda, 0x00},[m
[31m-        {0x17, 0x01, 0xda, 0x00}, {0x28, 0x01, 0xda, 0x01},[m
[31m-        {0x02, 0x01, 0xdb, 0x00}, {0x09, 0x01, 0xdb, 0x00},[m
[31m-        {0x17, 0x01, 0xdb, 0x00}, {0x28, 0x01, 0xdb, 0x01},[m
[31m-        {0x02, 0x01, 0xee, 0x00}, {0x09, 0x01, 0xee, 0x00},[m
[31m-        {0x17, 0x01, 0xee, 0x00}, {0x28, 0x01, 0xee, 0x01},[m
[31m-        {0x02, 0x01, 0xf0, 0x00}, {0x09, 0x01, 0xf0, 0x00},[m
[31m-        {0x17, 0x01, 0xf0, 0x00}, {0x28, 0x01, 0xf0, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xda, 0x00}, {0x06, 0x01, 0xda, 0x00},[m
[31m-        {0x0a, 0x01, 0xda, 0x00}, {0x0f, 0x01, 0xda, 0x00},[m
[31m-        {0x18, 0x01, 0xda, 0x00}, {0x1f, 0x01, 0xda, 0x00},[m
[31m-        {0x29, 0x01, 0xda, 0x00}, {0x38, 0x01, 0xda, 0x01},[m
[31m-        {0x03, 0x01, 0xdb, 0x00}, {0x06, 0x01, 0xdb, 0x00},[m
[31m-        {0x0a, 0x01, 0xdb, 0x00}, {0x0f, 0x01, 0xdb, 0x00},[m
[31m-        {0x18, 0x01, 0xdb, 0x00}, {0x1f, 0x01, 0xdb, 0x00},[m
[31m-        {0x29, 0x01, 0xdb, 0x00}, {0x38, 0x01, 0xdb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xee, 0x00}, {0x06, 0x01, 0xee, 0x00},[m
[31m-        {0x0a, 0x01, 0xee, 0x00}, {0x0f, 0x01, 0xee, 0x00},[m
[31m-        {0x18, 0x01, 0xee, 0x00}, {0x1f, 0x01, 0xee, 0x00},[m
[31m-        {0x29, 0x01, 0xee, 0x00}, {0x38, 0x01, 0xee, 0x01},[m
[31m-        {0x03, 0x01, 0xf0, 0x00}, {0x06, 0x01, 0xf0, 0x00},[m
[31m-        {0x0a, 0x01, 0xf0, 0x00}, {0x0f, 0x01, 0xf0, 0x00},[m
[31m-        {0x18, 0x01, 0xf0, 0x00}, {0x1f, 0x01, 0xf0, 0x00},[m
[31m-        {0x29, 0x01, 0xf0, 0x00}, {0x38, 0x01, 0xf0, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xf2, 0x00}, {0x09, 0x01, 0xf2, 0x00},[m
[31m-        {0x17, 0x01, 0xf2, 0x00}, {0x28, 0x01, 0xf2, 0x01},[m
[31m-        {0x02, 0x01, 0xf3, 0x00}, {0x09, 0x01, 0xf3, 0x00},[m
[31m-        {0x17, 0x01, 0xf3, 0x00}, {0x28, 0x01, 0xf3, 0x01},[m
[31m-        {0x02, 0x01, 0xff, 0x00}, {0x09, 0x01, 0xff, 0x00},[m
[31m-        {0x17, 0x01, 0xff, 0x00}, {0x28, 0x01, 0xff, 0x01},[m
[31m-        {0x01, 0x01, 0xcb, 0x00}, {0x16, 0x01, 0xcb, 0x01},[m
[31m-        {0x01, 0x01, 0xcc, 0x00}, {0x16, 0x01, 0xcc, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf2, 0x00}, {0x06, 0x01, 0xf2, 0x00},[m
[31m-        {0x0a, 0x01, 0xf2, 0x00}, {0x0f, 0x01, 0xf2, 0x00},[m
[31m-        {0x18, 0x01, 0xf2, 0x00}, {0x1f, 0x01, 0xf2, 0x00},[m
[31m-        {0x29, 0x01, 0xf2, 0x00}, {0x38, 0x01, 0xf2, 0x01},[m
[31m-        {0x03, 0x01, 0xf3, 0x00}, {0x06, 0x01, 0xf3, 0x00},[m
[31m-        {0x0a, 0x01, 0xf3, 0x00}, {0x0f, 0x01, 0xf3, 0x00},[m
[31m-        {0x18, 0x01, 0xf3, 0x00}, {0x1f, 0x01, 0xf3, 0x00},[m
[31m-        {0x29, 0x01, 0xf3, 0x00}, {0x38, 0x01, 0xf3, 0x01}[m
[31m-    },[m
[31m-    /* 205 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xff, 0x00}, {0x06, 0x01, 0xff, 0x00},[m
[31m-        {0x0a, 0x01, 0xff, 0x00}, {0x0f, 0x01, 0xff, 0x00},[m
[31m-        {0x18, 0x01, 0xff, 0x00}, {0x1f, 0x01, 0xff, 0x00},[m
[31m-        {0x29, 0x01, 0xff, 0x00}, {0x38, 0x01, 0xff, 0x01},[m
[31m-        {0x02, 0x01, 0xcb, 0x00}, {0x09, 0x01, 0xcb, 0x00},[m
[31m-        {0x17, 0x01, 0xcb, 0x00}, {0x28, 0x01, 0xcb, 0x01},[m
[31m-        {0x02, 0x01, 0xcc, 0x00}, {0x09, 0x01, 0xcc, 0x00},[m
[31m-        {0x17, 0x01, 0xcc, 0x00}, {0x28, 0x01, 0xcc, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xcb, 0x00}, {0x06, 0x01, 0xcb, 0x00},[m
[31m-        {0x0a, 0x01, 0xcb, 0x00}, {0x0f, 0x01, 0xcb, 0x00},[m
[31m-        {0x18, 0x01, 0xcb, 0x00}, {0x1f, 0x01, 0xcb, 0x00},[m
[31m-        {0x29, 0x01, 0xcb, 0x00}, {0x38, 0x01, 0xcb, 0x01},[m
[31m-        {0x03, 0x01, 0xcc, 0x00}, {0x06, 0x01, 0xcc, 0x00},[m
[31m-        {0x0a, 0x01, 0xcc, 0x00}, {0x0f, 0x01, 0xcc, 0x00},[m
[31m-        {0x18, 0x01, 0xcc, 0x00}, {0x1f, 0x01, 0xcc, 0x00},[m
[31m-        {0x29, 0x01, 0xcc, 0x00}, {0x38, 0x01, 0xcc, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0xd3, 0x00, 0x00, 0x00}, {0xd4, 0x00, 0x00, 0x00},[m
[31m-        {0xd6, 0x00, 0x00, 0x00}, {0xd7, 0x00, 0x00, 0x00},[m
[31m-        {0xda, 0x00, 0x00, 0x00}, {0xdb, 0x00, 0x00, 0x00},[m
[31m-        {0xdd, 0x00, 0x00, 0x00}, {0xde, 0x00, 0x00, 0x00},[m
[31m-        {0xe2, 0x00, 0x00, 0x00}, {0xe4, 0x00, 0x00, 0x00},[m
[31m-        {0xe8, 0x00, 0x00, 0x00}, {0xeb, 0x00, 0x00, 0x00},[m
[31m-        {0xf0, 0x00, 0x00, 0x00}, {0xf3, 0x00, 0x00, 0x00},[m
[31m-        {0xf7, 0x00, 0x00, 0x00}, {0xfa, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xd3, 0x01}, {0x00, 0x01, 0xd4, 0x01},[m
[31m-        {0x00, 0x01, 0xd6, 0x01}, {0x00, 0x01, 0xdd, 0x01},[m
[31m-        {0x00, 0x01, 0xde, 0x01}, {0x00, 0x01, 0xdf, 0x01},[m
[31m-        {0x00, 0x01, 0xf1, 0x01}, {0x00, 0x01, 0xf4, 0x01},[m
[31m-        {0x00, 0x01, 0xf5, 0x01}, {0x00, 0x01, 0xf6, 0x01},[m
[31m-        {0x00, 0x01, 0xf7, 0x01}, {0x00, 0x01, 0xf8, 0x01},[m
[31m-        {0x00, 0x01, 0xfa, 0x01}, {0x00, 0x01, 0xfb, 0x01},[m
[31m-        {0x00, 0x01, 0xfc, 0x01}, {0x00, 0x01, 0xfd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xd3, 0x00}, {0x16, 0x01, 0xd3, 0x01},[m
[31m-        {0x01, 0x01, 0xd4, 0x00}, {0x16, 0x01, 0xd4, 0x01},[m
[31m-        {0x01, 0x01, 0xd6, 0x00}, {0x16, 0x01, 0xd6, 0x01},[m
[31m-        {0x01, 0x01, 0xdd, 0x00}, {0x16, 0x01, 0xdd, 0x01},[m
[31m-        {0x01, 0x01, 0xde, 0x00}, {0x16, 0x01, 0xde, 0x01},[m
[31m-        {0x01, 0x01, 0xdf, 0x00}, {0x16, 0x01, 0xdf, 0x01},[m
[31m-        {0x01, 0x01, 0xf1, 0x00}, {0x16, 0x01, 0xf1, 0x01},[m
[31m-        {0x01, 0x01, 0xf4, 0x00}, {0x16, 0x01, 0xf4, 0x01}[m
[31m-    },[m
[31m-    /* 210 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xd3, 0x00}, {0x09, 0x01, 0xd3, 0x00},[m
[31m-        {0x17, 0x01, 0xd3, 0x00}, {0x28, 0x01, 0xd3, 0x01},[m
[31m-        {0x02, 0x01, 0xd4, 0x00}, {0x09, 0x01, 0xd4, 0x00},[m
[31m-        {0x17, 0x01, 0xd4, 0x00}, {0x28, 0x01, 0xd4, 0x01},[m
[31m-        {0x02, 0x01, 0xd6, 0x00}, {0x09, 0x01, 0xd6, 0x00},[m
[31m-        {0x17, 0x01, 0xd6, 0x00}, {0x28, 0x01, 0xd6, 0x01},[m
[31m-        {0x02, 0x01, 0xdd, 0x00}, {0x09, 0x01, 0xdd, 0x00},[m
[31m-        {0x17, 0x01, 0xdd, 0x00}, {0x28, 0x01, 0xdd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd3, 0x00}, {0x06, 0x01, 0xd3, 0x00},[m
[31m-        {0x0a, 0x01, 0xd3, 0x00}, {0x0f, 0x01, 0xd3, 0x00},[m
[31m-        {0x18, 0x01, 0xd3, 0x00}, {0x1f, 0x01, 0xd3, 0x00},[m
[31m-        {0x29, 0x01, 0xd3, 0x00}, {0x38, 0x01, 0xd3, 0x01},[m
[31m-        {0x03, 0x01, 0xd4, 0x00}, {0x06, 0x01, 0xd4, 0x00},[m
[31m-        {0x0a, 0x01, 0xd4, 0x00}, {0x0f, 0x01, 0xd4, 0x00},[m
[31m-        {0x18, 0x01, 0xd4, 0x00}, {0x1f, 0x01, 0xd4, 0x00},[m
[31m-        {0x29, 0x01, 0xd4, 0x00}, {0x38, 0x01, 0xd4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xd6, 0x00}, {0x06, 0x01, 0xd6, 0x00},[m
[31m-        {0x0a, 0x01, 0xd6, 0x00}, {0x0f, 0x01, 0xd6, 0x00},[m
[31m-        {0x18, 0x01, 0xd6, 0x00}, {0x1f, 0x01, 0xd6, 0x00},[m
[31m-        {0x29, 0x01, 0xd6, 0x00}, {0x38, 0x01, 0xd6, 0x01},[m
[31m-        {0x03, 0x01, 0xdd, 0x00}, {0x06, 0x01, 0xdd, 0x00},[m
[31m-        {0x0a, 0x01, 0xdd, 0x00}, {0x0f, 0x01, 0xdd, 0x00},[m
[31m-        {0x18, 0x01, 0xdd, 0x00}, {0x1f, 0x01, 0xdd, 0x00},[m
[31m-        {0x29, 0x01, 0xdd, 0x00}, {0x38, 0x01, 0xdd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xde, 0x00}, {0x09, 0x01, 0xde, 0x00},[m
[31m-        {0x17, 0x01, 0xde, 0x00}, {0x28, 0x01, 0xde, 0x01},[m
[31m-        {0x02, 0x01, 0xdf, 0x00}, {0x09, 0x01, 0xdf, 0x00},[m
[31m-        {0x17, 0x01, 0xdf, 0x00}, {0x28, 0x01, 0xdf, 0x01},[m
[31m-        {0x02, 0x01, 0xf1, 0x00}, {0x09, 0x01, 0xf1, 0x00},[m
[31m-        {0x17, 0x01, 0xf1, 0x00}, {0x28, 0x01, 0xf1, 0x01},[m
[31m-        {0x02, 0x01, 0xf4, 0x00}, {0x09, 0x01, 0xf4, 0x00},[m
[31m-        {0x17, 0x01, 0xf4, 0x00}, {0x28, 0x01, 0xf4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xde, 0x00}, {0x06, 0x01, 0xde, 0x00},[m
[31m-        {0x0a, 0x01, 0xde, 0x00}, {0x0f, 0x01, 0xde, 0x00},[m
[31m-        {0x18, 0x01, 0xde, 0x00}, {0x1f, 0x01, 0xde, 0x00},[m
[31m-        {0x29, 0x01, 0xde, 0x00}, {0x38, 0x01, 0xde, 0x01},[m
[31m-        {0x03, 0x01, 0xdf, 0x00}, {0x06, 0x01, 0xdf, 0x00},[m
[31m-        {0x0a, 0x01, 0xdf, 0x00}, {0x0f, 0x01, 0xdf, 0x00},[m
[31m-        {0x18, 0x01, 0xdf, 0x00}, {0x1f, 0x01, 0xdf, 0x00},[m
[31m-        {0x29, 0x01, 0xdf, 0x00}, {0x38, 0x01, 0xdf, 0x01}[m
[31m-    },[m
[31m-    /* 215 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf1, 0x00}, {0x06, 0x01, 0xf1, 0x00},[m
[31m-        {0x0a, 0x01, 0xf1, 0x00}, {0x0f, 0x01, 0xf1, 0x00},[m
[31m-        {0x18, 0x01, 0xf1, 0x00}, {0x1f, 0x01, 0xf1, 0x00},[m
[31m-        {0x29, 0x01, 0xf1, 0x00}, {0x38, 0x01, 0xf1, 0x01},[m
[31m-        {0x03, 0x01, 0xf4, 0x00}, {0x06, 0x01, 0xf4, 0x00},[m
[31m-        {0x0a, 0x01, 0xf4, 0x00}, {0x0f, 0x01, 0xf4, 0x00},[m
[31m-        {0x18, 0x01, 0xf4, 0x00}, {0x1f, 0x01, 0xf4, 0x00},[m
[31m-        {0x29, 0x01, 0xf4, 0x00}, {0x38, 0x01, 0xf4, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xf5, 0x00}, {0x16, 0x01, 0xf5, 0x01},[m
[31m-        {0x01, 0x01, 0xf6, 0x00}, {0x16, 0x01, 0xf6, 0x01},[m
[31m-        {0x01, 0x01, 0xf7, 0x00}, {0x16, 0x01, 0xf7, 0x01},[m
[31m-        {0x01, 0x01, 0xf8, 0x00}, {0x16, 0x01, 0xf8, 0x01},[m
[31m-        {0x01, 0x01, 0xfa, 0x00}, {0x16, 0x01, 0xfa, 0x01},[m
[31m-        {0x01, 0x01, 0xfb, 0x00}, {0x16, 0x01, 0xfb, 0x01},[m
[31m-        {0x01, 0x01, 0xfc, 0x00}, {0x16, 0x01, 0xfc, 0x01},[m
[31m-        {0x01, 0x01, 0xfd, 0x00}, {0x16, 0x01, 0xfd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xf5, 0x00}, {0x09, 0x01, 0xf5, 0x00},[m
[31m-        {0x17, 0x01, 0xf5, 0x00}, {0x28, 0x01, 0xf5, 0x01},[m
[31m-        {0x02, 0x01, 0xf6, 0x00}, {0x09, 0x01, 0xf6, 0x00},[m
[31m-        {0x17, 0x01, 0xf6, 0x00}, {0x28, 0x01, 0xf6, 0x01},[m
[31m-        {0x02, 0x01, 0xf7, 0x00}, {0x09, 0x01, 0xf7, 0x00},[m
[31m-        {0x17, 0x01, 0xf7, 0x00}, {0x28, 0x01, 0xf7, 0x01},[m
[31m-        {0x02, 0x01, 0xf8, 0x00}, {0x09, 0x01, 0xf8, 0x00},[m
[31m-        {0x17, 0x01, 0xf8, 0x00}, {0x28, 0x01, 0xf8, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf5, 0x00}, {0x06, 0x01, 0xf5, 0x00},[m
[31m-        {0x0a, 0x01, 0xf5, 0x00}, {0x0f, 0x01, 0xf5, 0x00},[m
[31m-        {0x18, 0x01, 0xf5, 0x00}, {0x1f, 0x01, 0xf5, 0x00},[m
[31m-        {0x29, 0x01, 0xf5, 0x00}, {0x38, 0x01, 0xf5, 0x01},[m
[31m-        {0x03, 0x01, 0xf6, 0x00}, {0x06, 0x01, 0xf6, 0x00},[m
[31m-        {0x0a, 0x01, 0xf6, 0x00}, {0x0f, 0x01, 0xf6, 0x00},[m
[31m-        {0x18, 0x01, 0xf6, 0x00}, {0x1f, 0x01, 0xf6, 0x00},[m
[31m-        {0x29, 0x01, 0xf6, 0x00}, {0x38, 0x01, 0xf6, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf7, 0x00}, {0x06, 0x01, 0xf7, 0x00},[m
[31m-        {0x0a, 0x01, 0xf7, 0x00}, {0x0f, 0x01, 0xf7, 0x00},[m
[31m-        {0x18, 0x01, 0xf7, 0x00}, {0x1f, 0x01, 0xf7, 0x00},[m
[31m-        {0x29, 0x01, 0xf7, 0x00}, {0x38, 0x01, 0xf7, 0x01},[m
[31m-        {0x03, 0x01, 0xf8, 0x00}, {0x06, 0x01, 0xf8, 0x00},[m
[31m-        {0x0a, 0x01, 0xf8, 0x00}, {0x0f, 0x01, 0xf8, 0x00},[m
[31m-        {0x18, 0x01, 0xf8, 0x00}, {0x1f, 0x01, 0xf8, 0x00},[m
[31m-        {0x29, 0x01, 0xf8, 0x00}, {0x38, 0x01, 0xf8, 0x01}[m
[31m-    },[m
[31m-    /* 220 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xfa, 0x00}, {0x09, 0x01, 0xfa, 0x00},[m
[31m-        {0x17, 0x01, 0xfa, 0x00}, {0x28, 0x01, 0xfa, 0x01},[m
[31m-        {0x02, 0x01, 0xfb, 0x00}, {0x09, 0x01, 0xfb, 0x00},[m
[31m-        {0x17, 0x01, 0xfb, 0x00}, {0x28, 0x01, 0xfb, 0x01},[m
[31m-        {0x02, 0x01, 0xfc, 0x00}, {0x09, 0x01, 0xfc, 0x00},[m
[31m-        {0x17, 0x01, 0xfc, 0x00}, {0x28, 0x01, 0xfc, 0x01},[m
[31m-        {0x02, 0x01, 0xfd, 0x00}, {0x09, 0x01, 0xfd, 0x00},[m
[31m-        {0x17, 0x01, 0xfd, 0x00}, {0x28, 0x01, 0xfd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xfa, 0x00}, {0x06, 0x01, 0xfa, 0x00},[m
[31m-        {0x0a, 0x01, 0xfa, 0x00}, {0x0f, 0x01, 0xfa, 0x00},[m
[31m-        {0x18, 0x01, 0xfa, 0x00}, {0x1f, 0x01, 0xfa, 0x00},[m
[31m-        {0x29, 0x01, 0xfa, 0x00}, {0x38, 0x01, 0xfa, 0x01},[m
[31m-        {0x03, 0x01, 0xfb, 0x00}, {0x06, 0x01, 0xfb, 0x00},[m
[31m-        {0x0a, 0x01, 0xfb, 0x00}, {0x0f, 0x01, 0xfb, 0x00},[m
[31m-        {0x18, 0x01, 0xfb, 0x00}, {0x1f, 0x01, 0xfb, 0x00},[m
[31m-        {0x29, 0x01, 0xfb, 0x00}, {0x38, 0x01, 0xfb, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xfc, 0x00}, {0x06, 0x01, 0xfc, 0x00},[m
[31m-        {0x0a, 0x01, 0xfc, 0x00}, {0x0f, 0x01, 0xfc, 0x00},[m
[31m-        {0x18, 0x01, 0xfc, 0x00}, {0x1f, 0x01, 0xfc, 0x00},[m
[31m-        {0x29, 0x01, 0xfc, 0x00}, {0x38, 0x01, 0xfc, 0x01},[m
[31m-        {0x03, 0x01, 0xfd, 0x00}, {0x06, 0x01, 0xfd, 0x00},[m
[31m-        {0x0a, 0x01, 0xfd, 0x00}, {0x0f, 0x01, 0xfd, 0x00},[m
[31m-        {0x18, 0x01, 0xfd, 0x00}, {0x1f, 0x01, 0xfd, 0x00},[m
[31m-        {0x29, 0x01, 0xfd, 0x00}, {0x38, 0x01, 0xfd, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0xfe, 0x01}, {0xe3, 0x00, 0x00, 0x00},[m
[31m-        {0xe5, 0x00, 0x00, 0x00}, {0xe6, 0x00, 0x00, 0x00},[m
[31m-        {0xe9, 0x00, 0x00, 0x00}, {0xea, 0x00, 0x00, 0x00},[m
[31m-        {0xec, 0x00, 0x00, 0x00}, {0xed, 0x00, 0x00, 0x00},[m
[31m-        {0xf1, 0x00, 0x00, 0x00}, {0xf2, 0x00, 0x00, 0x00},[m
[31m-        {0xf4, 0x00, 0x00, 0x00}, {0xf5, 0x00, 0x00, 0x00},[m
[31m-        {0xf8, 0x00, 0x00, 0x00}, {0xf9, 0x00, 0x00, 0x00},[m
[31m-        {0xfb, 0x00, 0x00, 0x00}, {0xfc, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0xfe, 0x00}, {0x16, 0x01, 0xfe, 0x01},[m
[31m-        {0x00, 0x01, 0x02, 0x01}, {0x00, 0x01, 0x03, 0x01},[m
[31m-        {0x00, 0x01, 0x04, 0x01}, {0x00, 0x01, 0x05, 0x01},[m
[31m-        {0x00, 0x01, 0x06, 0x01}, {0x00, 0x01, 0x07, 0x01},[m
[31m-        {0x00, 0x01, 0x08, 0x01}, {0x00, 0x01, 0x0b, 0x01},[m
[31m-        {0x00, 0x01, 0x0c, 0x01}, {0x00, 0x01, 0x0e, 0x01},[m
[31m-        {0x00, 0x01, 0x0f, 0x01}, {0x00, 0x01, 0x10, 0x01},[m
[31m-        {0x00, 0x01, 0x11, 0x01}, {0x00, 0x01, 0x12, 0x01}[m
[31m-    },[m
[31m-    /* 225 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0xfe, 0x00}, {0x09, 0x01, 0xfe, 0x00},[m
[31m-        {0x17, 0x01, 0xfe, 0x00}, {0x28, 0x01, 0xfe, 0x01},[m
[31m-        {0x01, 0x01, 0x02, 0x00}, {0x16, 0x01, 0x02, 0x01},[m
[31m-        {0x01, 0x01, 0x03, 0x00}, {0x16, 0x01, 0x03, 0x01},[m
[31m-        {0x01, 0x01, 0x04, 0x00}, {0x16, 0x01, 0x04, 0x01},[m
[31m-        {0x01, 0x01, 0x05, 0x00}, {0x16, 0x01, 0x05, 0x01},[m
[31m-        {0x01, 0x01, 0x06, 0x00}, {0x16, 0x01, 0x06, 0x01},[m
[31m-        {0x01, 0x01, 0x07, 0x00}, {0x16, 0x01, 0x07, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xfe, 0x00}, {0x06, 0x01, 0xfe, 0x00},[m
[31m-        {0x0a, 0x01, 0xfe, 0x00}, {0x0f, 0x01, 0xfe, 0x00},[m
[31m-        {0x18, 0x01, 0xfe, 0x00}, {0x1f, 0x01, 0xfe, 0x00},[m
[31m-        {0x29, 0x01, 0xfe, 0x00}, {0x38, 0x01, 0xfe, 0x01},[m
[31m-        {0x02, 0x01, 0x02, 0x00}, {0x09, 0x01, 0x02, 0x00},[m
[31m-        {0x17, 0x01, 0x02, 0x00}, {0x28, 0x01, 0x02, 0x01},[m
[31m-        {0x02, 0x01, 0x03, 0x00}, {0x09, 0x01, 0x03, 0x00},[m
[31m-        {0x17, 0x01, 0x03, 0x00}, {0x28, 0x01, 0x03, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x02, 0x00}, {0x06, 0x01, 0x02, 0x00},[m
[31m-        {0x0a, 0x01, 0x02, 0x00}, {0x0f, 0x01, 0x02, 0x00},[m
[31m-        {0x18, 0x01, 0x02, 0x00}, {0x1f, 0x01, 0x02, 0x00},[m
[31m-        {0x29, 0x01, 0x02, 0x00}, {0x38, 0x01, 0x02, 0x01},[m
[31m-        {0x03, 0x01, 0x03, 0x00}, {0x06, 0x01, 0x03, 0x00},[m
[31m-        {0x0a, 0x01, 0x03, 0x00}, {0x0f, 0x01, 0x03, 0x00},[m
[31m-        {0x18, 0x01, 0x03, 0x00}, {0x1f, 0x01, 0x03, 0x00},[m
[31m-        {0x29, 0x01, 0x03, 0x00}, {0x38, 0x01, 0x03, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x04, 0x00}, {0x09, 0x01, 0x04, 0x00},[m
[31m-        {0x17, 0x01, 0x04, 0x00}, {0x28, 0x01, 0x04, 0x01},[m
[31m-        {0x02, 0x01, 0x05, 0x00}, {0x09, 0x01, 0x05, 0x00},[m
[31m-        {0x17, 0x01, 0x05, 0x00}, {0x28, 0x01, 0x05, 0x01},[m
[31m-        {0x02, 0x01, 0x06, 0x00}, {0x09, 0x01, 0x06, 0x00},[m
[31m-        {0x17, 0x01, 0x06, 0x00}, {0x28, 0x01, 0x06, 0x01},[m
[31m-        {0x02, 0x01, 0x07, 0x00}, {0x09, 0x01, 0x07, 0x00},[m
[31m-        {0x17, 0x01, 0x07, 0x00}, {0x28, 0x01, 0x07, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x04, 0x00}, {0x06, 0x01, 0x04, 0x00},[m
[31m-        {0x0a, 0x01, 0x04, 0x00}, {0x0f, 0x01, 0x04, 0x00},[m
[31m-        {0x18, 0x01, 0x04, 0x00}, {0x1f, 0x01, 0x04, 0x00},[m
[31m-        {0x29, 0x01, 0x04, 0x00}, {0x38, 0x01, 0x04, 0x01},[m
[31m-        {0x03, 0x01, 0x05, 0x00}, {0x06, 0x01, 0x05, 0x00},[m
[31m-        {0x0a, 0x01, 0x05, 0x00}, {0x0f, 0x01, 0x05, 0x00},[m
[31m-        {0x18, 0x01, 0x05, 0x00}, {0x1f, 0x01, 0x05, 0x00},[m
[31m-        {0x29, 0x01, 0x05, 0x00}, {0x38, 0x01, 0x05, 0x01}[m
[31m-    },[m
[31m-    /* 230 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x06, 0x00}, {0x06, 0x01, 0x06, 0x00},[m
[31m-        {0x0a, 0x01, 0x06, 0x00}, {0x0f, 0x01, 0x06, 0x00},[m
[31m-        {0x18, 0x01, 0x06, 0x00}, {0x1f, 0x01, 0x06, 0x00},[m
[31m-        {0x29, 0x01, 0x06, 0x00}, {0x38, 0x01, 0x06, 0x01},[m
[31m-        {0x03, 0x01, 0x07, 0x00}, {0x06, 0x01, 0x07, 0x00},[m
[31m-        {0x0a, 0x01, 0x07, 0x00}, {0x0f, 0x01, 0x07, 0x00},[m
[31m-        {0x18, 0x01, 0x07, 0x00}, {0x1f, 0x01, 0x07, 0x00},[m
[31m-        {0x29, 0x01, 0x07, 0x00}, {0x38, 0x01, 0x07, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x08, 0x00}, {0x16, 0x01, 0x08, 0x01},[m
[31m-        {0x01, 0x01, 0x0b, 0x00}, {0x16, 0x01, 0x0b, 0x01},[m
[31m-        {0x01, 0x01, 0x0c, 0x00}, {0x16, 0x01, 0x0c, 0x01},[m
[31m-        {0x01, 0x01, 0x0e, 0x00}, {0x16, 0x01, 0x0e, 0x01},[m
[31m-        {0x01, 0x01, 0x0f, 0x00}, {0x16, 0x01, 0x0f, 0x01},[m
[31m-        {0x01, 0x01, 0x10, 0x00}, {0x16, 0x01, 0x10, 0x01},[m
[31m-        {0x01, 0x01, 0x11, 0x00}, {0x16, 0x01, 0x11, 0x01},[m
[31m-        {0x01, 0x01, 0x12, 0x00}, {0x16, 0x01, 0x12, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x08, 0x00}, {0x09, 0x01, 0x08, 0x00},[m
[31m-        {0x17, 0x01, 0x08, 0x00}, {0x28, 0x01, 0x08, 0x01},[m
[31m-        {0x02, 0x01, 0x0b, 0x00}, {0x09, 0x01, 0x0b, 0x00},[m
[31m-        {0x17, 0x01, 0x0b, 0x00}, {0x28, 0x01, 0x0b, 0x01},[m
[31m-        {0x02, 0x01, 0x0c, 0x00}, {0x09, 0x01, 0x0c, 0x00},[m
[31m-        {0x17, 0x01, 0x0c, 0x00}, {0x28, 0x01, 0x0c, 0x01},[m
[31m-        {0x02, 0x01, 0x0e, 0x00}, {0x09, 0x01, 0x0e, 0x00},[m
[31m-        {0x17, 0x01, 0x0e, 0x00}, {0x28, 0x01, 0x0e, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x08, 0x00}, {0x06, 0x01, 0x08, 0x00},[m
[31m-        {0x0a, 0x01, 0x08, 0x00}, {0x0f, 0x01, 0x08, 0x00},[m
[31m-        {0x18, 0x01, 0x08, 0x00}, {0x1f, 0x01, 0x08, 0x00},[m
[31m-        {0x29, 0x01, 0x08, 0x00}, {0x38, 0x01, 0x08, 0x01},[m
[31m-        {0x03, 0x01, 0x0b, 0x00}, {0x06, 0x01, 0x0b, 0x00},[m
[31m-        {0x0a, 0x01, 0x0b, 0x00}, {0x0f, 0x01, 0x0b, 0x00},[m
[31m-        {0x18, 0x01, 0x0b, 0x00}, {0x1f, 0x01, 0x0b, 0x00},[m
[31m-        {0x29, 0x01, 0x0b, 0x00}, {0x38, 0x01, 0x0b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x0c, 0x00}, {0x06, 0x01, 0x0c, 0x00},[m
[31m-        {0x0a, 0x01, 0x0c, 0x00}, {0x0f, 0x01, 0x0c, 0x00},[m
[31m-        {0x18, 0x01, 0x0c, 0x00}, {0x1f, 0x01, 0x0c, 0x00},[m
[31m-        {0x29, 0x01, 0x0c, 0x00}, {0x38, 0x01, 0x0c, 0x01},[m
[31m-        {0x03, 0x01, 0x0e, 0x00}, {0x06, 0x01, 0x0e, 0x00},[m
[31m-        {0x0a, 0x01, 0x0e, 0x00}, {0x0f, 0x01, 0x0e, 0x00},[m
[31m-        {0x18, 0x01, 0x0e, 0x00}, {0x1f, 0x01, 0x0e, 0x00},[m
[31m-        {0x29, 0x01, 0x0e, 0x00}, {0x38, 0x01, 0x0e, 0x01}[m
[31m-    },[m
[31m-    /* 235 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x0f, 0x00}, {0x09, 0x01, 0x0f, 0x00},[m
[31m-        {0x17, 0x01, 0x0f, 0x00}, {0x28, 0x01, 0x0f, 0x01},[m
[31m-        {0x02, 0x01, 0x10, 0x00}, {0x09, 0x01, 0x10, 0x00},[m
[31m-        {0x17, 0x01, 0x10, 0x00}, {0x28, 0x01, 0x10, 0x01},[m
[31m-        {0x02, 0x01, 0x11, 0x00}, {0x09, 0x01, 0x11, 0x00},[m
[31m-        {0x17, 0x01, 0x11, 0x00}, {0x28, 0x01, 0x11, 0x01},[m
[31m-        {0x02, 0x01, 0x12, 0x00}, {0x09, 0x01, 0x12, 0x00},[m
[31m-        {0x17, 0x01, 0x12, 0x00}, {0x28, 0x01, 0x12, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x0f, 0x00}, {0x06, 0x01, 0x0f, 0x00},[m
[31m-        {0x0a, 0x01, 0x0f, 0x00}, {0x0f, 0x01, 0x0f, 0x00},[m
[31m-        {0x18, 0x01, 0x0f, 0x00}, {0x1f, 0x01, 0x0f, 0x00},[m
[31m-        {0x29, 0x01, 0x0f, 0x00}, {0x38, 0x01, 0x0f, 0x01},[m
[31m-        {0x03, 0x01, 0x10, 0x00}, {0x06, 0x01, 0x10, 0x00},[m
[31m-        {0x0a, 0x01, 0x10, 0x00}, {0x0f, 0x01, 0x10, 0x00},[m
[31m-        {0x18, 0x01, 0x10, 0x00}, {0x1f, 0x01, 0x10, 0x00},[m
[31m-        {0x29, 0x01, 0x10, 0x00}, {0x38, 0x01, 0x10, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x11, 0x00}, {0x06, 0x01, 0x11, 0x00},[m
[31m-        {0x0a, 0x01, 0x11, 0x00}, {0x0f, 0x01, 0x11, 0x00},[m
[31m-        {0x18, 0x01, 0x11, 0x00}, {0x1f, 0x01, 0x11, 0x00},[m
[31m-        {0x29, 0x01, 0x11, 0x00}, {0x38, 0x01, 0x11, 0x01},[m
[31m-        {0x03, 0x01, 0x12, 0x00}, {0x06, 0x01, 0x12, 0x00},[m
[31m-        {0x0a, 0x01, 0x12, 0x00}, {0x0f, 0x01, 0x12, 0x00},[m
[31m-        {0x18, 0x01, 0x12, 0x00}, {0x1f, 0x01, 0x12, 0x00},[m
[31m-        {0x29, 0x01, 0x12, 0x00}, {0x38, 0x01, 0x12, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x00, 0x01, 0x13, 0x01}, {0x00, 0x01, 0x14, 0x01},[m
[31m-        {0x00, 0x01, 0x15, 0x01}, {0x00, 0x01, 0x17, 0x01},[m
[31m-        {0x00, 0x01, 0x18, 0x01}, {0x00, 0x01, 0x19, 0x01},[m
[31m-        {0x00, 0x01, 0x1a, 0x01}, {0x00, 0x01, 0x1b, 0x01},[m
[31m-        {0x00, 0x01, 0x1c, 0x01}, {0x00, 0x01, 0x1d, 0x01},[m
[31m-        {0x00, 0x01, 0x1e, 0x01}, {0x00, 0x01, 0x1f, 0x01},[m
[31m-        {0x00, 0x01, 0x7f, 0x01}, {0x00, 0x01, 0xdc, 0x01},[m
[31m-        {0x00, 0x01, 0xf9, 0x01}, {0xfd, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x13, 0x00}, {0x16, 0x01, 0x13, 0x01},[m
[31m-        {0x01, 0x01, 0x14, 0x00}, {0x16, 0x01, 0x14, 0x01},[m
[31m-        {0x01, 0x01, 0x15, 0x00}, {0x16, 0x01, 0x15, 0x01},[m
[31m-        {0x01, 0x01, 0x17, 0x00}, {0x16, 0x01, 0x17, 0x01},[m
[31m-        {0x01, 0x01, 0x18, 0x00}, {0x16, 0x01, 0x18, 0x01},[m
[31m-        {0x01, 0x01, 0x19, 0x00}, {0x16, 0x01, 0x19, 0x01},[m
[31m-        {0x01, 0x01, 0x1a, 0x00}, {0x16, 0x01, 0x1a, 0x01},[m
[31m-        {0x01, 0x01, 0x1b, 0x00}, {0x16, 0x01, 0x1b, 0x01}[m
[31m-    },[m
[31m-    /* 240 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x13, 0x00}, {0x09, 0x01, 0x13, 0x00},[m
[31m-        {0x17, 0x01, 0x13, 0x00}, {0x28, 0x01, 0x13, 0x01},[m
[31m-        {0x02, 0x01, 0x14, 0x00}, {0x09, 0x01, 0x14, 0x00},[m
[31m-        {0x17, 0x01, 0x14, 0x00}, {0x28, 0x01, 0x14, 0x01},[m
[31m-        {0x02, 0x01, 0x15, 0x00}, {0x09, 0x01, 0x15, 0x00},[m
[31m-        {0x17, 0x01, 0x15, 0x00}, {0x28, 0x01, 0x15, 0x01},[m
[31m-        {0x02, 0x01, 0x17, 0x00}, {0x09, 0x01, 0x17, 0x00},[m
[31m-        {0x17, 0x01, 0x17, 0x00}, {0x28, 0x01, 0x17, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x13, 0x00}, {0x06, 0x01, 0x13, 0x00},[m
[31m-        {0x0a, 0x01, 0x13, 0x00}, {0x0f, 0x01, 0x13, 0x00},[m
[31m-        {0x18, 0x01, 0x13, 0x00}, {0x1f, 0x01, 0x13, 0x00},[m
[31m-        {0x29, 0x01, 0x13, 0x00}, {0x38, 0x01, 0x13, 0x01},[m
[31m-        {0x03, 0x01, 0x14, 0x00}, {0x06, 0x01, 0x14, 0x00},[m
[31m-        {0x0a, 0x01, 0x14, 0x00}, {0x0f, 0x01, 0x14, 0x00},[m
[31m-        {0x18, 0x01, 0x14, 0x00}, {0x1f, 0x01, 0x14, 0x00},[m
[31m-        {0x29, 0x01, 0x14, 0x00}, {0x38, 0x01, 0x14, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x15, 0x00}, {0x06, 0x01, 0x15, 0x00},[m
[31m-        {0x0a, 0x01, 0x15, 0x00}, {0x0f, 0x01, 0x15, 0x00},[m
[31m-        {0x18, 0x01, 0x15, 0x00}, {0x1f, 0x01, 0x15, 0x00},[m
[31m-        {0x29, 0x01, 0x15, 0x00}, {0x38, 0x01, 0x15, 0x01},[m
[31m-        {0x03, 0x01, 0x17, 0x00}, {0x06, 0x01, 0x17, 0x00},[m
[31m-        {0x0a, 0x01, 0x17, 0x00}, {0x0f, 0x01, 0x17, 0x00},[m
[31m-        {0x18, 0x01, 0x17, 0x00}, {0x1f, 0x01, 0x17, 0x00},[m
[31m-        {0x29, 0x01, 0x17, 0x00}, {0x38, 0x01, 0x17, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x18, 0x00}, {0x09, 0x01, 0x18, 0x00},[m
[31m-        {0x17, 0x01, 0x18, 0x00}, {0x28, 0x01, 0x18, 0x01},[m
[31m-        {0x02, 0x01, 0x19, 0x00}, {0x09, 0x01, 0x19, 0x00},[m
[31m-        {0x17, 0x01, 0x19, 0x00}, {0x28, 0x01, 0x19, 0x01},[m
[31m-        {0x02, 0x01, 0x1a, 0x00}, {0x09, 0x01, 0x1a, 0x00},[m
[31m-        {0x17, 0x01, 0x1a, 0x00}, {0x28, 0x01, 0x1a, 0x01},[m
[31m-        {0x02, 0x01, 0x1b, 0x00}, {0x09, 0x01, 0x1b, 0x00},[m
[31m-        {0x17, 0x01, 0x1b, 0x00}, {0x28, 0x01, 0x1b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x18, 0x00}, {0x06, 0x01, 0x18, 0x00},[m
[31m-        {0x0a, 0x01, 0x18, 0x00}, {0x0f, 0x01, 0x18, 0x00},[m
[31m-        {0x18, 0x01, 0x18, 0x00}, {0x1f, 0x01, 0x18, 0x00},[m
[31m-        {0x29, 0x01, 0x18, 0x00}, {0x38, 0x01, 0x18, 0x01},[m
[31m-        {0x03, 0x01, 0x19, 0x00}, {0x06, 0x01, 0x19, 0x00},[m
[31m-        {0x0a, 0x01, 0x19, 0x00}, {0x0f, 0x01, 0x19, 0x00},[m
[31m-        {0x18, 0x01, 0x19, 0x00}, {0x1f, 0x01, 0x19, 0x00},[m
[31m-        {0x29, 0x01, 0x19, 0x00}, {0x38, 0x01, 0x19, 0x01}[m
[31m-    },[m
[31m-    /* 245 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x1a, 0x00}, {0x06, 0x01, 0x1a, 0x00},[m
[31m-        {0x0a, 0x01, 0x1a, 0x00}, {0x0f, 0x01, 0x1a, 0x00},[m
[31m-        {0x18, 0x01, 0x1a, 0x00}, {0x1f, 0x01, 0x1a, 0x00},[m
[31m-        {0x29, 0x01, 0x1a, 0x00}, {0x38, 0x01, 0x1a, 0x01},[m
[31m-        {0x03, 0x01, 0x1b, 0x00}, {0x06, 0x01, 0x1b, 0x00},[m
[31m-        {0x0a, 0x01, 0x1b, 0x00}, {0x0f, 0x01, 0x1b, 0x00},[m
[31m-        {0x18, 0x01, 0x1b, 0x00}, {0x1f, 0x01, 0x1b, 0x00},[m
[31m-        {0x29, 0x01, 0x1b, 0x00}, {0x38, 0x01, 0x1b, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x01, 0x01, 0x1c, 0x00}, {0x16, 0x01, 0x1c, 0x01},[m
[31m-        {0x01, 0x01, 0x1d, 0x00}, {0x16, 0x01, 0x1d, 0x01},[m
[31m-        {0x01, 0x01, 0x1e, 0x00}, {0x16, 0x01, 0x1e, 0x01},[m
[31m-        {0x01, 0x01, 0x1f, 0x00}, {0x16, 0x01, 0x1f, 0x01},[m
[31m-        {0x01, 0x01, 0x7f, 0x00}, {0x16, 0x01, 0x7f, 0x01},[m
[31m-        {0x01, 0x01, 0xdc, 0x00}, {0x16, 0x01, 0xdc, 0x01},[m
[31m-        {0x01, 0x01, 0xf9, 0x00}, {0x16, 0x01, 0xf9, 0x01},[m
[31m-        {0xfe, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x1c, 0x00}, {0x09, 0x01, 0x1c, 0x00},[m
[31m-        {0x17, 0x01, 0x1c, 0x00}, {0x28, 0x01, 0x1c, 0x01},[m
[31m-        {0x02, 0x01, 0x1d, 0x00}, {0x09, 0x01, 0x1d, 0x00},[m
[31m-        {0x17, 0x01, 0x1d, 0x00}, {0x28, 0x01, 0x1d, 0x01},[m
[31m-        {0x02, 0x01, 0x1e, 0x00}, {0x09, 0x01, 0x1e, 0x00},[m
[31m-        {0x17, 0x01, 0x1e, 0x00}, {0x28, 0x01, 0x1e, 0x01},[m
[31m-        {0x02, 0x01, 0x1f, 0x00}, {0x09, 0x01, 0x1f, 0x00},[m
[31m-        {0x17, 0x01, 0x1f, 0x00}, {0x28, 0x01, 0x1f, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x1c, 0x00}, {0x06, 0x01, 0x1c, 0x00},[m
[31m-        {0x0a, 0x01, 0x1c, 0x00}, {0x0f, 0x01, 0x1c, 0x00},[m
[31m-        {0x18, 0x01, 0x1c, 0x00}, {0x1f, 0x01, 0x1c, 0x00},[m
[31m-        {0x29, 0x01, 0x1c, 0x00}, {0x38, 0x01, 0x1c, 0x01},[m
[31m-        {0x03, 0x01, 0x1d, 0x00}, {0x06, 0x01, 0x1d, 0x00},[m
[31m-        {0x0a, 0x01, 0x1d, 0x00}, {0x0f, 0x01, 0x1d, 0x00},[m
[31m-        {0x18, 0x01, 0x1d, 0x00}, {0x1f, 0x01, 0x1d, 0x00},[m
[31m-        {0x29, 0x01, 0x1d, 0x00}, {0x38, 0x01, 0x1d, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x1e, 0x00}, {0x06, 0x01, 0x1e, 0x00},[m
[31m-        {0x0a, 0x01, 0x1e, 0x00}, {0x0f, 0x01, 0x1e, 0x00},[m
[31m-        {0x18, 0x01, 0x1e, 0x00}, {0x1f, 0x01, 0x1e, 0x00},[m
[31m-        {0x29, 0x01, 0x1e, 0x00}, {0x38, 0x01, 0x1e, 0x01},[m
[31m-        {0x03, 0x01, 0x1f, 0x00}, {0x06, 0x01, 0x1f, 0x00},[m
[31m-        {0x0a, 0x01, 0x1f, 0x00}, {0x0f, 0x01, 0x1f, 0x00},[m
[31m-        {0x18, 0x01, 0x1f, 0x00}, {0x1f, 0x01, 0x1f, 0x00},[m
[31m-        {0x29, 0x01, 0x1f, 0x00}, {0x38, 0x01, 0x1f, 0x01}[m
[31m-    },[m
[31m-    /* 250 */[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x7f, 0x00}, {0x09, 0x01, 0x7f, 0x00},[m
[31m-        {0x17, 0x01, 0x7f, 0x00}, {0x28, 0x01, 0x7f, 0x01},[m
[31m-        {0x02, 0x01, 0xdc, 0x00}, {0x09, 0x01, 0xdc, 0x00},[m
[31m-        {0x17, 0x01, 0xdc, 0x00}, {0x28, 0x01, 0xdc, 0x01},[m
[31m-        {0x02, 0x01, 0xf9, 0x00}, {0x09, 0x01, 0xf9, 0x00},[m
[31m-        {0x17, 0x01, 0xf9, 0x00}, {0x28, 0x01, 0xf9, 0x01},[m
[31m-        {0x00, 0x01, 0x0a, 0x01}, {0x00, 0x01, 0x0d, 0x01},[m
[31m-        {0x00, 0x01, 0x16, 0x01}, {0xfa, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x7f, 0x00}, {0x06, 0x01, 0x7f, 0x00},[m
[31m-        {0x0a, 0x01, 0x7f, 0x00}, {0x0f, 0x01, 0x7f, 0x00},[m
[31m-        {0x18, 0x01, 0x7f, 0x00}, {0x1f, 0x01, 0x7f, 0x00},[m
[31m-        {0x29, 0x01, 0x7f, 0x00}, {0x38, 0x01, 0x7f, 0x01},[m
[31m-        {0x03, 0x01, 0xdc, 0x00}, {0x06, 0x01, 0xdc, 0x00},[m
[31m-        {0x0a, 0x01, 0xdc, 0x00}, {0x0f, 0x01, 0xdc, 0x00},[m
[31m-        {0x18, 0x01, 0xdc, 0x00}, {0x1f, 0x01, 0xdc, 0x00},[m
[31m-        {0x29, 0x01, 0xdc, 0x00}, {0x38, 0x01, 0xdc, 0x01}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0xf9, 0x00}, {0x06, 0x01, 0xf9, 0x00},[m
[31m-        {0x0a, 0x01, 0xf9, 0x00}, {0x0f, 0x01, 0xf9, 0x00},[m
[31m-        {0x18, 0x01, 0xf9, 0x00}, {0x1f, 0x01, 0xf9, 0x00},[m
[31m-        {0x29, 0x01, 0xf9, 0x00}, {0x38, 0x01, 0xf9, 0x01},[m
[31m-        {0x01, 0x01, 0x0a, 0x00}, {0x16, 0x01, 0x0a, 0x01},[m
[31m-        {0x01, 0x01, 0x0d, 0x00}, {0x16, 0x01, 0x0d, 0x01},[m
[31m-        {0x01, 0x01, 0x16, 0x00}, {0x16, 0x01, 0x16, 0x01},[m
[31m-        {0xfc, 0x00, 0x00, 0x00}, {0xfc, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x02, 0x01, 0x0a, 0x00}, {0x09, 0x01, 0x0a, 0x00},[m
[31m-        {0x17, 0x01, 0x0a, 0x00}, {0x28, 0x01, 0x0a, 0x01},[m
[31m-        {0x02, 0x01, 0x0d, 0x00}, {0x09, 0x01, 0x0d, 0x00},[m
[31m-        {0x17, 0x01, 0x0d, 0x00}, {0x28, 0x01, 0x0d, 0x01},[m
[31m-        {0x02, 0x01, 0x16, 0x00}, {0x09, 0x01, 0x16, 0x00},[m
[31m-        {0x17, 0x01, 0x16, 0x00}, {0x28, 0x01, 0x16, 0x01},[m
[31m-        {0xfd, 0x00, 0x00, 0x00}, {0xfd, 0x00, 0x00, 0x00},[m
[31m-        {0xfd, 0x00, 0x00, 0x00}, {0xfd, 0x00, 0x00, 0x00}[m
[31m-    },[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x0a, 0x00}, {0x06, 0x01, 0x0a, 0x00},[m
[31m-        {0x0a, 0x01, 0x0a, 0x00}, {0x0f, 0x01, 0x0a, 0x00},[m
[31m-        {0x18, 0x01, 0x0a, 0x00}, {0x1f, 0x01, 0x0a, 0x00},[m
[31m-        {0x29, 0x01, 0x0a, 0x00}, {0x38, 0x01, 0x0a, 0x01},[m
[31m-        {0x03, 0x01, 0x0d, 0x00}, {0x06, 0x01, 0x0d, 0x00},[m
[31m-        {0x0a, 0x01, 0x0d, 0x00}, {0x0f, 0x01, 0x0d, 0x00},[m
[31m-        {0x18, 0x01, 0x0d, 0x00}, {0x1f, 0x01, 0x0d, 0x00},[m
[31m-        {0x29, 0x01, 0x0d, 0x00}, {0x38, 0x01, 0x0d, 0x01}[m
[31m-    },[m
[31m-    /* 255 */[m
[31m-    {[m
[31m-        {0x03, 0x01, 0x16, 0x00}, {0x06, 0x01, 0x16, 0x00},[m
[31m-        {0x0a, 0x01, 0x16, 0x00}, {0x0f, 0x01, 0x16, 0x00},[m
[31m-        {0x18, 0x01, 0x16, 0x00}, {0x1f, 0x01, 0x16, 0x00},[m
[31m-        {0x29, 0x01, 0x16, 0x00}, {0x38, 0x01, 0x16, 0x01},[m
[31m-        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},[m
[31m-        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},[m
[31m-        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00},[m
[31m-        {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00}[m
[31m-    }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_huff_decode(u_char *state, u_char *src, size_t len, u_char **dst,[m
[31m-    ngx_uint_t last, ngx_log_t *log)[m
[31m-{[m
[31m-    u_char  *end, ch, ending;[m
[31m-[m
[31m-    ch = 0;[m
[31m-    ending = 1;[m
[31m-[m
[31m-    end = src + len;[m
[31m-[m
[31m-    while (src != end) {[m
[31m-        ch = *src++;[m
[31m-[m
[31m-        if (ngx_http_v2_huff_decode_bits(state, &ending, ch >> 4, dst)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                           "http2 huffman decoding error at state %d: "[m
[31m-                           "bad code 0x%Xd", *state, ch >> 4);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_v2_huff_decode_bits(state, &ending, ch & 0xf, dst)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                           "http2 huffman decoding error at state %d: "[m
[31m-                           "bad code 0x%Xd", *state, ch & 0xf);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last) {[m
[31m-        if (!ending) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                           "http2 huffman decoding error: "[m
[31m-                           "incomplete code 0x%Xd", ch);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *state = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_v2_huff_decode_bits(u_char *state, u_char *ending, ngx_uint_t bits,[m
[31m-    u_char **dst)[m
[31m-{[m
[31m-    ngx_http_v2_huff_decode_code_t  code;[m
[31m-[m
[31m-    code = ngx_http_v2_huff_decode_codes[*state][bits];[m
[31m-[m
[31m-    if (code.next == *state) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (code.emit) {[m
[31m-        *(*dst)++ = code.sym;[m
[31m-    }[m
[31m-[m
[31m-    *ending = code.ending;[m
[31m-    *state = code.next;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_encode.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_encode.c[m
[1mdeleted file mode 100644[m
[1mindex 3f822cd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_huff_encode.c[m
[1m+++ /dev/null[m
[36m@@ -1,254 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- * Copyright (C) 2015 Vlad Krasnov[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t  code;[m
[31m-    uint32_t  len;[m
[31m-} ngx_http_v2_huff_encode_code_t;[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_huff_encode_code_t  ngx_http_v2_huff_encode_table[256] =[m
[31m-{[m
[31m-    {0x00001ff8, 13}, {0x007fffd8, 23}, {0x0fffffe2, 28}, {0x0fffffe3, 28},[m
[31m-    {0x0fffffe4, 28}, {0x0fffffe5, 28}, {0x0fffffe6, 28}, {0x0fffffe7, 28},[m
[31m-    {0x0fffffe8, 28}, {0x00ffffea, 24}, {0x3ffffffc, 30}, {0x0fffffe9, 28},[m
[31m-    {0x0fffffea, 28}, {0x3ffffffd, 30}, {0x0fffffeb, 28}, {0x0fffffec, 28},[m
[31m-    {0x0fffffed, 28}, {0x0fffffee, 28}, {0x0fffffef, 28}, {0x0ffffff0, 28},[m
[31m-    {0x0ffffff1, 28}, {0x0ffffff2, 28}, {0x3ffffffe, 30}, {0x0ffffff3, 28},[m
[31m-    {0x0ffffff4, 28}, {0x0ffffff5, 28}, {0x0ffffff6, 28}, {0x0ffffff7, 28},[m
[31m-    {0x0ffffff8, 28}, {0x0ffffff9, 28}, {0x0ffffffa, 28}, {0x0ffffffb, 28},[m
[31m-    {0x00000014,  6}, {0x000003f8, 10}, {0x000003f9, 10}, {0x00000ffa, 12},[m
[31m-    {0x00001ff9, 13}, {0x00000015,  6}, {0x000000f8,  8}, {0x000007fa, 11},[m
[31m-    {0x000003fa, 10}, {0x000003fb, 10}, {0x000000f9,  8}, {0x000007fb, 11},[m
[31m-    {0x000000fa,  8}, {0x00000016,  6}, {0x00000017,  6}, {0x00000018,  6},[m
[31m-    {0x00000000,  5}, {0x00000001,  5}, {0x00000002,  5}, {0x00000019,  6},[m
[31m-    {0x0000001a,  6}, {0x0000001b,  6}, {0x0000001c,  6}, {0x0000001d,  6},[m
[31m-    {0x0000001e,  6}, {0x0000001f,  6}, {0x0000005c,  7}, {0x000000fb,  8},[m
[31m-    {0x00007ffc, 15}, {0x00000020,  6}, {0x00000ffb, 12}, {0x000003fc, 10},[m
[31m-    {0x00001ffa, 13}, {0x00000021,  6}, {0x0000005d,  7}, {0x0000005e,  7},[m
[31m-    {0x0000005f,  7}, {0x00000060,  7}, {0x00000061,  7}, {0x00000062,  7},[m
[31m-    {0x00000063,  7}, {0x00000064,  7}, {0x00000065,  7}, {0x00000066,  7},[m
[31m-    {0x00000067,  7}, {0x00000068,  7}, {0x00000069,  7}, {0x0000006a,  7},[m
[31m-    {0x0000006b,  7}, {0x0000006c,  7}, {0x0000006d,  7}, {0x0000006e,  7},[m
[31m-    {0x0000006f,  7}, {0x00000070,  7}, {0x00000071,  7}, {0x00000072,  7},[m
[31m-    {0x000000fc,  8}, {0x00000073,  7}, {0x000000fd,  8}, {0x00001ffb, 13},[m
[31m-    {0x0007fff0, 19}, {0x00001ffc, 13}, {0x00003ffc, 14}, {0x00000022,  6},[m
[31m-    {0x00007ffd, 15}, {0x00000003,  5}, {0x00000023,  6}, {0x00000004,  5},[m
[31m-    {0x00000024,  6}, {0x00000005,  5}, {0x00000025,  6}, {0x00000026,  6},[m
[31m-    {0x00000027,  6}, {0x00000006,  5}, {0x00000074,  7}, {0x00000075,  7},[m
[31m-    {0x00000028,  6}, {0x00000029,  6}, {0x0000002a,  6}, {0x00000007,  5},[m
[31m-    {0x0000002b,  6}, {0x00000076,  7}, {0x0000002c,  6}, {0x00000008,  5},[m
[31m-    {0x00000009,  5}, {0x0000002d,  6}, {0x00000077,  7}, {0x00000078,  7},[m
[31m-    {0x00000079,  7}, {0x0000007a,  7}, {0x0000007b,  7}, {0x00007ffe, 15},[m
[31m-    {0x000007fc, 11}, {0x00003ffd, 14}, {0x00001ffd, 13}, {0x0ffffffc, 28},[m
[31m-    {0x000fffe6, 20}, {0x003fffd2, 22}, {0x000fffe7, 20}, {0x000fffe8, 20},[m
[31m-    {0x003fffd3, 22}, {0x003fffd4, 22}, {0x003fffd5, 22}, {0x007fffd9, 23},[m
[31m-    {0x003fffd6, 22}, {0x007fffda, 23}, {0x007fffdb, 23}, {0x007fffdc, 23},[m
[31m-    {0x007fffdd, 23}, {0x007fffde, 23}, {0x00ffffeb, 24}, {0x007fffdf, 23},[m
[31m-    {0x00ffffec, 24}, {0x00ffffed, 24}, {0x003fffd7, 22}, {0x007fffe0, 23},[m
[31m-    {0x00ffffee, 24}, {0x007fffe1, 23}, {0x007fffe2, 23}, {0x007fffe3, 23},[m
[31m-    {0x007fffe4, 23}, {0x001fffdc, 21}, {0x003fffd8, 22}, {0x007fffe5, 23},[m
[31m-    {0x003fffd9, 22}, {0x007fffe6, 23}, {0x007fffe7, 23}, {0x00ffffef, 24},[m
[31m-    {0x003fffda, 22}, {0x001fffdd, 21}, {0x000fffe9, 20}, {0x003fffdb, 22},[m
[31m-    {0x003fffdc, 22}, {0x007fffe8, 23}, {0x007fffe9, 23}, {0x001fffde, 21},[m
[31m-    {0x007fffea, 23}, {0x003fffdd, 22}, {0x003fffde, 22}, {0x00fffff0, 24},[m
[31m-    {0x001fffdf, 21}, {0x003fffdf, 22}, {0x007fffeb, 23}, {0x007fffec, 23},[m
[31m-    {0x001fffe0, 21}, {0x001fffe1, 21}, {0x003fffe0, 22}, {0x001fffe2, 21},[m
[31m-    {0x007fffed, 23}, {0x003fffe1, 22}, {0x007fffee, 23}, {0x007fffef, 23},[m
[31m-    {0x000fffea, 20}, {0x003fffe2, 22}, {0x003fffe3, 22}, {0x003fffe4, 22},[m
[31m-    {0x007ffff0, 23}, {0x003fffe5, 22}, {0x003fffe6, 22}, {0x007ffff1, 23},[m
[31m-    {0x03ffffe0, 26}, {0x03ffffe1, 26}, {0x000fffeb, 20}, {0x0007fff1, 19},[m
[31m-    {0x003fffe7, 22}, {0x007ffff2, 23}, {0x003fffe8, 22}, {0x01ffffec, 25},[m
[31m-    {0x03ffffe2, 26}, {0x03ffffe3, 26}, {0x03ffffe4, 26}, {0x07ffffde, 27},[m
[31m-    {0x07ffffdf, 27}, {0x03ffffe5, 26}, {0x00fffff1, 24}, {0x01ffffed, 25},[m
[31m-    {0x0007fff2, 19}, {0x001fffe3, 21}, {0x03ffffe6, 26}, {0x07ffffe0, 27},[m
[31m-    {0x07ffffe1, 27}, {0x03ffffe7, 26}, {0x07ffffe2, 27}, {0x00fffff2, 24},[m
[31m-    {0x001fffe4, 21}, {0x001fffe5, 21}, {0x03ffffe8, 26}, {0x03ffffe9, 26},[m
[31m-    {0x0ffffffd, 28}, {0x07ffffe3, 27}, {0x07ffffe4, 27}, {0x07ffffe5, 27},[m
[31m-    {0x000fffec, 20}, {0x00fffff3, 24}, {0x000fffed, 20}, {0x001fffe6, 21},[m
[31m-    {0x003fffe9, 22}, {0x001fffe7, 21}, {0x001fffe8, 21}, {0x007ffff3, 23},[m
[31m-    {0x003fffea, 22}, {0x003fffeb, 22}, {0x01ffffee, 25}, {0x01ffffef, 25},[m
[31m-    {0x00fffff4, 24}, {0x00fffff5, 24}, {0x03ffffea, 26}, {0x007ffff4, 23},[m
[31m-    {0x03ffffeb, 26}, {0x07ffffe6, 27}, {0x03ffffec, 26}, {0x03ffffed, 26},[m
[31m-    {0x07ffffe7, 27}, {0x07ffffe8, 27}, {0x07ffffe9, 27}, {0x07ffffea, 27},[m
[31m-    {0x07ffffeb, 27}, {0x0ffffffe, 28}, {0x07ffffec, 27}, {0x07ffffed, 27},[m
[31m-    {0x07ffffee, 27}, {0x07ffffef, 27}, {0x07fffff0, 27}, {0x03ffffee, 26}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* same as above, but embeds lowercase transformation */[m
[31m-static ngx_http_v2_huff_encode_code_t  ngx_http_v2_huff_encode_table_lc[256] =[m
[31m-{[m
[31m-    {0x00001ff8, 13}, {0x007fffd8, 23}, {0x0fffffe2, 28}, {0x0fffffe3, 28},[m
[31m-    {0x0fffffe4, 28}, {0x0fffffe5, 28}, {0x0fffffe6, 28}, {0x0fffffe7, 28},[m
[31m-    {0x0fffffe8, 28}, {0x00ffffea, 24}, {0x3ffffffc, 30}, {0x0fffffe9, 28},[m
[31m-    {0x0fffffea, 28}, {0x3ffffffd, 30}, {0x0fffffeb, 28}, {0x0fffffec, 28},[m
[31m-    {0x0fffffed, 28}, {0x0fffffee, 28}, {0x0fffffef, 28}, {0x0ffffff0, 28},[m
[31m-    {0x0ffffff1, 28}, {0x0ffffff2, 28}, {0x3ffffffe, 30}, {0x0ffffff3, 28},[m
[31m-    {0x0ffffff4, 28}, {0x0ffffff5, 28}, {0x0ffffff6, 28}, {0x0ffffff7, 28},[m
[31m-    {0x0ffffff8, 28}, {0x0ffffff9, 28}, {0x0ffffffa, 28}, {0x0ffffffb, 28},[m
[31m-    {0x00000014,  6}, {0x000003f8, 10}, {0x000003f9, 10}, {0x00000ffa, 12},[m
[31m-    {0x00001ff9, 13}, {0x00000015,  6}, {0x000000f8,  8}, {0x000007fa, 11},[m
[31m-    {0x000003fa, 10}, {0x000003fb, 10}, {0x000000f9,  8}, {0x000007fb, 11},[m
[31m-    {0x000000fa,  8}, {0x00000016,  6}, {0x00000017,  6}, {0x00000018,  6},[m
[31m-    {0x00000000,  5}, {0x00000001,  5}, {0x00000002,  5}, {0x00000019,  6},[m
[31m-    {0x0000001a,  6}, {0x0000001b,  6}, {0x0000001c,  6}, {0x0000001d,  6},[m
[31m-    {0x0000001e,  6}, {0x0000001f,  6}, {0x0000005c,  7}, {0x000000fb,  8},[m
[31m-    {0x00007ffc, 15}, {0x00000020,  6}, {0x00000ffb, 12}, {0x000003fc, 10},[m
[31m-    {0x00001ffa, 13}, {0x00000003,  5}, {0x00000023,  6}, {0x00000004,  5},[m
[31m-    {0x00000024,  6}, {0x00000005,  5}, {0x00000025,  6}, {0x00000026,  6},[m
[31m-    {0x00000027,  6}, {0x00000006,  5}, {0x00000074,  7}, {0x00000075,  7},[m
[31m-    {0x00000028,  6}, {0x00000029,  6}, {0x0000002a,  6}, {0x00000007,  5},[m
[31m-    {0x0000002b,  6}, {0x00000076,  7}, {0x0000002c,  6}, {0x00000008,  5},[m
[31m-    {0x00000009,  5}, {0x0000002d,  6}, {0x00000077,  7}, {0x00000078,  7},[m
[31m-    {0x00000079,  7}, {0x0000007a,  7}, {0x0000007b,  7}, {0x00001ffb, 13},[m
[31m-    {0x0007fff0, 19}, {0x00001ffc, 13}, {0x00003ffc, 14}, {0x00000022,  6},[m
[31m-    {0x00007ffd, 15}, {0x00000003,  5}, {0x00000023,  6}, {0x00000004,  5},[m
[31m-    {0x00000024,  6}, {0x00000005,  5}, {0x00000025,  6}, {0x00000026,  6},[m
[31m-    {0x00000027,  6}, {0x00000006,  5}, {0x00000074,  7}, {0x00000075,  7},[m
[31m-    {0x00000028,  6}, {0x00000029,  6}, {0x0000002a,  6}, {0x00000007,  5},[m
[31m-    {0x0000002b,  6}, {0x00000076,  7}, {0x0000002c,  6}, {0x00000008,  5},[m
[31m-    {0x00000009,  5}, {0x0000002d,  6}, {0x00000077,  7}, {0x00000078,  7},[m
[31m-    {0x00000079,  7}, {0x0000007a,  7}, {0x0000007b,  7}, {0x00007ffe, 15},[m
[31m-    {0x000007fc, 11}, {0x00003ffd, 14}, {0x00001ffd, 13}, {0x0ffffffc, 28},[m
[31m-    {0x000fffe6, 20}, {0x003fffd2, 22}, {0x000fffe7, 20}, {0x000fffe8, 20},[m
[31m-    {0x003fffd3, 22}, {0x003fffd4, 22}, {0x003fffd5, 22}, {0x007fffd9, 23},[m
[31m-    {0x003fffd6, 22}, {0x007fffda, 23}, {0x007fffdb, 23}, {0x007fffdc, 23},[m
[31m-    {0x007fffdd, 23}, {0x007fffde, 23}, {0x00ffffeb, 24}, {0x007fffdf, 23},[m
[31m-    {0x00ffffec, 24}, {0x00ffffed, 24}, {0x003fffd7, 22}, {0x007fffe0, 23},[m
[31m-    {0x00ffffee, 24}, {0x007fffe1, 23}, {0x007fffe2, 23}, {0x007fffe3, 23},[m
[31m-    {0x007fffe4, 23}, {0x001fffdc, 21}, {0x003fffd8, 22}, {0x007fffe5, 23},[m
[31m-    {0x003fffd9, 22}, {0x007fffe6, 23}, {0x007fffe7, 23}, {0x00ffffef, 24},[m
[31m-    {0x003fffda, 22}, {0x001fffdd, 21}, {0x000fffe9, 20}, {0x003fffdb, 22},[m
[31m-    {0x003fffdc, 22}, {0x007fffe8, 23}, {0x007fffe9, 23}, {0x001fffde, 21},[m
[31m-    {0x007fffea, 23}, {0x003fffdd, 22}, {0x003fffde, 22}, {0x00fffff0, 24},[m
[31m-    {0x001fffdf, 21}, {0x003fffdf, 22}, {0x007fffeb, 23}, {0x007fffec, 23},[m
[31m-    {0x001fffe0, 21}, {0x001fffe1, 21}, {0x003fffe0, 22}, {0x001fffe2, 21},[m
[31m-    {0x007fffed, 23}, {0x003fffe1, 22}, {0x007fffee, 23}, {0x007fffef, 23},[m
[31m-    {0x000fffea, 20}, {0x003fffe2, 22}, {0x003fffe3, 22}, {0x003fffe4, 22},[m
[31m-    {0x007ffff0, 23}, {0x003fffe5, 22}, {0x003fffe6, 22}, {0x007ffff1, 23},[m
[31m-    {0x03ffffe0, 26}, {0x03ffffe1, 26}, {0x000fffeb, 20}, {0x0007fff1, 19},[m
[31m-    {0x003fffe7, 22}, {0x007ffff2, 23}, {0x003fffe8, 22}, {0x01ffffec, 25},[m
[31m-    {0x03ffffe2, 26}, {0x03ffffe3, 26}, {0x03ffffe4, 26}, {0x07ffffde, 27},[m
[31m-    {0x07ffffdf, 27}, {0x03ffffe5, 26}, {0x00fffff1, 24}, {0x01ffffed, 25},[m
[31m-    {0x0007fff2, 19}, {0x001fffe3, 21}, {0x03ffffe6, 26}, {0x07ffffe0, 27},[m
[31m-    {0x07ffffe1, 27}, {0x03ffffe7, 26}, {0x07ffffe2, 27}, {0x00fffff2, 24},[m
[31m-    {0x001fffe4, 21}, {0x001fffe5, 21}, {0x03ffffe8, 26}, {0x03ffffe9, 26},[m
[31m-    {0x0ffffffd, 28}, {0x07ffffe3, 27}, {0x07ffffe4, 27}, {0x07ffffe5, 27},[m
[31m-    {0x000fffec, 20}, {0x00fffff3, 24}, {0x000fffed, 20}, {0x001fffe6, 21},[m
[31m-    {0x003fffe9, 22}, {0x001fffe7, 21}, {0x001fffe8, 21}, {0x007ffff3, 23},[m
[31m-    {0x003fffea, 22}, {0x003fffeb, 22}, {0x01ffffee, 25}, {0x01ffffef, 25},[m
[31m-    {0x00fffff4, 24}, {0x00fffff5, 24}, {0x03ffffea, 26}, {0x007ffff4, 23},[m
[31m-    {0x03ffffeb, 26}, {0x07ffffe6, 27}, {0x03ffffec, 26}, {0x03ffffed, 26},[m
[31m-    {0x07ffffe7, 27}, {0x07ffffe8, 27}, {0x07ffffe9, 27}, {0x07ffffea, 27},[m
[31m-    {0x07ffffeb, 27}, {0x0ffffffe, 28}, {0x07ffffec, 27}, {0x07ffffed, 27},[m
[31m-    {0x07ffffee, 27}, {0x07ffffef, 27}, {0x07fffff0, 27}, {0x03ffffee, 26}[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN)[m
[31m-[m
[31m-#if (NGX_HAVE_GCC_BSWAP64)[m
[31m-#define ngx_http_v2_huff_encode_buf(dst, buf)                                 \[m
[31m-    (*(uint64_t *) (dst) = __builtin_bswap64(buf))[m
[31m-#else[m
[31m-#define ngx_http_v2_huff_encode_buf(dst, buf)                                 \[m
[31m-    ((dst)[0] = (u_char) ((buf) >> 56),                                       \[m
[31m-     (dst)[1] = (u_char) ((buf) >> 48),                                       \[m
[31m-     (dst)[2] = (u_char) ((buf) >> 40),                                       \[m
[31m-     (dst)[3] = (u_char) ((buf) >> 32),                                       \[m
[31m-     (dst)[4] = (u_char) ((buf) >> 24),                                       \[m
[31m-     (dst)[5] = (u_char) ((buf) >> 16),                                       \[m
[31m-     (dst)[6] = (u_char) ((buf) >> 8),                                        \[m
[31m-     (dst)[7] = (u_char)  (buf))[m
[31m-#endif[m
[31m-[m
[31m-#else /* !NGX_HAVE_LITTLE_ENDIAN */[m
[31m-#define ngx_http_v2_huff_encode_buf(dst, buf)                                 \[m
[31m-    (*(uint64_t *) (dst) = (buf))[m
[31m-#endif[m
[31m-[m
[31m-#else /* NGX_PTR_SIZE == 4 */[m
[31m-[m
[31m-#define ngx_http_v2_huff_encode_buf(dst, buf)                                 \[m
[31m-    (*(uint32_t *) (dst) = htonl(buf))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_v2_huff_encode(u_char *src, size_t len, u_char *dst, ngx_uint_t lower)[m
[31m-{[m
[31m-    u_char                          *end;[m
[31m-    size_t                           hlen;[m
[31m-    ngx_uint_t                       buf, pending, code;[m
[31m-    ngx_http_v2_huff_encode_code_t  *table, *next;[m
[31m-[m
[31m-    table = lower ? ngx_http_v2_huff_encode_table_lc[m
[31m-                  : ngx_http_v2_huff_encode_table;[m
[31m-    hlen = 0;[m
[31m-    buf = 0;[m
[31m-    pending = 0;[m
[31m-[m
[31m-    end = src + len;[m
[31m-[m
[31m-    while (src != end) {[m
[31m-        next = &table[*src++];[m
[31m-[m
[31m-        code = next->code;[m
[31m-        pending += next->len;[m
[31m-[m
[31m-        /* accumulate bits */[m
[31m-        if (pending < sizeof(buf) * 8) {[m
[31m-            buf |= code << (sizeof(buf) * 8 - pending);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hlen + sizeof(buf) >= len) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        pending -= sizeof(buf) * 8;[m
[31m-[m
[31m-        buf |= code >> pending;[m
[31m-[m
[31m-        ngx_http_v2_huff_encode_buf(&dst[hlen], buf);[m
[31m-[m
[31m-        hlen += sizeof(buf);[m
[31m-[m
[31m-        buf = pending ? code << (sizeof(buf) * 8 - pending) : 0;[m
[31m-    }[m
[31m-[m
[31m-    if (pending == 0) {[m
[31m-        return hlen;[m
[31m-    }[m
[31m-[m
[31m-    buf |= (ngx_uint_t) -1 >> pending;[m
[31m-[m
[31m-    pending = ngx_align(pending, 8);[m
[31m-[m
[31m-    if (hlen + pending / 8 >= len) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    buf >>= sizeof(buf) * 8 - pending;[m
[31m-[m
[31m-    do {[m
[31m-        pending -= 8;[m
[31m-        dst[hlen++] = (u_char) (buf >> pending);[m
[31m-    } while (pending);[m
[31m-[m
[31m-    return hlen;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_module.c[m
[1mdeleted file mode 100644[m
[1mindex 5a4561c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,469 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_http_v2_module.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_add_variables(ngx_conf_t *cf);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_module_init(ngx_cycle_t *cycle);[m
[31m-[m
[31m-static void *ngx_http_v2_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_v2_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static void *ngx_http_v2_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-static char *ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post,[m
[31m-    void *data);[m
[31m-static char *ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post,[m
[31m-    void *data);[m
[31m-static char *ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data);[m
[31m-static char *ngx_http_v2_spdy_deprecated(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_v2_recv_buffer_size_post =[m
[31m-    { ngx_http_v2_recv_buffer_size };[m
[31m-static ngx_conf_post_t  ngx_http_v2_pool_size_post =[m
[31m-    { ngx_http_v2_pool_size };[m
[31m-static ngx_conf_post_t  ngx_http_v2_streams_index_mask_post =[m
[31m-    { ngx_http_v2_streams_index_mask };[m
[31m-static ngx_conf_post_t  ngx_http_v2_chunk_size_post =[m
[31m-    { ngx_http_v2_chunk_size };[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_v2_commands[] = {[m
[31m-[m
[31m-    { ngx_string("http2_recv_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_main_conf_t, recv_buffer_size),[m
[31m-      &ngx_http_v2_recv_buffer_size_post },[m
[31m-[m
[31m-    { ngx_string("http2_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, pool_size),[m
[31m-      &ngx_http_v2_pool_size_post },[m
[31m-[m
[31m-    { ngx_string("http2_max_concurrent_streams"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, concurrent_streams),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_max_field_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, max_field_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_max_header_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, max_header_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_streams_index_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, streams_index_mask),[m
[31m-      &ngx_http_v2_streams_index_mask_post },[m
[31m-[m
[31m-    { ngx_string("http2_recv_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, recv_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_idle_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_srv_conf_t, idle_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("http2_chunk_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_v2_loc_conf_t, chunk_size),[m
[31m-      &ngx_http_v2_chunk_size_post },[m
[31m-[m
[31m-    { ngx_string("spdy_recv_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_max_concurrent_streams"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_streams_index_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_recv_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_keepalive_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_headers_comp"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("spdy_chunk_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_v2_spdy_deprecated,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t  ngx_http_v2_module_ctx = {[m
[31m-    ngx_http_v2_add_variables,             /* preconfiguration */[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_http_v2_create_main_conf,          /* create main configuration */[m
[31m-    ngx_http_v2_init_main_conf,            /* init main configuration */[m
[31m-[m
[31m-    ngx_http_v2_create_srv_conf,           /* create server configuration */[m
[31m-    ngx_http_v2_merge_srv_conf,            /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_v2_create_loc_conf,           /* create location configuration */[m
[31m-    ngx_http_v2_merge_loc_conf             /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_http_v2_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_v2_module_ctx,               /* module context */[m
[31m-    ngx_http_v2_commands,                  /* module directives */[m
[31m-    NGX_HTTP_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    ngx_http_v2_module_init,               /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_http_variable_t  ngx_http_v2_vars[] = {[m
[31m-[m
[31m-    { ngx_string("http2"), NULL,[m
[31m-      ngx_http_v2_variable, 0, 0, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_http_v2_vars; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_variable(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-[m
[31m-    if (r->stream) {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        if (r->connection->ssl) {[m
[31m-            v->len = sizeof("h2") - 1;[m
[31m-            v->valid = 1;[m
[31m-            v->no_cacheable = 0;[m
[31m-            v->not_found = 0;[m
[31m-            v->data = (u_char *) "h2";[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-        v->len = sizeof("h2c") - 1;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-        v->data = (u_char *) "h2c";[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_module_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_v2_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_v2_main_conf_t  *h2mcf;[m
[31m-[m
[31m-    h2mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_main_conf_t));[m
[31m-    if (h2mcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    h2mcf->recv_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return h2mcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_v2_main_conf_t *h2mcf = conf;[m
[31m-[m
[31m-    ngx_conf_init_size_value(h2mcf->recv_buffer_size, 256 * 1024);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_v2_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_v2_srv_conf_t  *h2scf;[m
[31m-[m
[31m-    h2scf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_srv_conf_t));[m
[31m-    if (h2scf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    h2scf->pool_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    h2scf->concurrent_streams = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    h2scf->max_field_size = NGX_CONF_UNSET_SIZE;[m
[31m-    h2scf->max_header_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    h2scf->streams_index_mask = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    h2scf->recv_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    h2scf->idle_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    return h2scf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_v2_srv_conf_t *prev = parent;[m
[31m-    ngx_http_v2_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->pool_size, prev->pool_size, 4096);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->concurrent_streams,[m
[31m-                              prev->concurrent_streams, 128);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->max_field_size, prev->max_field_size,[m
[31m-                              4096);[m
[31m-    ngx_conf_merge_size_value(conf->max_header_size, prev->max_header_size,[m
[31m-                              16384);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->streams_index_mask,[m
[31m-                              prev->streams_index_mask, 32 - 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->recv_timeout,[m
[31m-                              prev->recv_timeout, 30000);[m
[31m-    ngx_conf_merge_msec_value(conf->idle_timeout,[m
[31m-                              prev->idle_timeout, 180000);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_v2_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_v2_loc_conf_t  *h2lcf;[m
[31m-[m
[31m-    h2lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_loc_conf_t));[m
[31m-    if (h2lcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    h2lcf->chunk_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    return h2lcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_v2_loc_conf_t *prev = parent;[m
[31m-    ngx_http_v2_loc_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->chunk_size, prev->chunk_size, 8 * 1024);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp <= 2 * NGX_HTTP_V2_STATE_BUFFER_SIZE) {[m
[31m-        return "value is too small";[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp < NGX_MIN_POOL_SIZE) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be no less than %uz",[m
[31m-                           NGX_MIN_POOL_SIZE);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*sp % NGX_POOL_ALIGNMENT) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the pool size must be a multiple of %uz",[m
[31m-                           NGX_POOL_ALIGNMENT);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    ngx_uint_t *np = data;[m
[31m-[m
[31m-    ngx_uint_t  mask;[m
[31m-[m
[31m-    mask = *np - 1;[m
[31m-[m
[31m-    if (*np == 0 || (*np & mask)) {[m
[31m-        return "must be a power of two";[m
[31m-    }[m
[31m-[m
[31m-    *np = mask;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-    size_t *sp = data;[m
[31m-[m
[31m-    if (*sp == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the http2 chunk size cannot be zero");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (*sp > NGX_HTTP_V2_MAX_FRAME_SIZE) {[m
[31m-        *sp = NGX_HTTP_V2_MAX_FRAME_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_v2_spdy_deprecated(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "invalid directive \"%V\": ngx_http_spdy_module "[m
[31m-                       "was superseded by ngx_http_v2_module", &cmd->name);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_module.h[m
[1mdeleted file mode 100644[m
[1mindex 95cc7d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_V2_MODULE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_V2_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                          recv_buffer_size;[m
[31m-    u_char                         *recv_buffer;[m
[31m-} ngx_http_v2_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                          pool_size;[m
[31m-    ngx_uint_t                      concurrent_streams;[m
[31m-    size_t                          max_field_size;[m
[31m-    size_t                          max_header_size;[m
[31m-    ngx_uint_t                      streams_index_mask;[m
[31m-    ngx_msec_t                      recv_timeout;[m
[31m-    ngx_msec_t                      idle_timeout;[m
[31m-} ngx_http_v2_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                          chunk_size;[m
[31m-} ngx_http_v2_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_v2_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_V2_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_table.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_table.c[m
[1mdeleted file mode 100644[m
[1mindex a73748a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/http/v2/ngx_http_v2_table.c[m
[1m+++ /dev/null[m
[36m@@ -1,349 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- * Copyright (C) Valentin V. Bartenev[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_V2_TABLE_SIZE  4096[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_v2_table_account(ngx_http_v2_connection_t *h2c,[m
[31m-    size_t size);[m
[31m-[m
[31m-[m
[31m-static ngx_http_v2_header_t  ngx_http_v2_static_table[] = {[m
[31m-    { ngx_string(":authority"), ngx_string("") },[m
[31m-    { ngx_string(":method"), ngx_string("GET") },[m
[31m-    { ngx_string(":method"), ngx_string("POST") },[m
[31m-    { ngx_string(":path"), ngx_string("/") },[m
[31m-    { ngx_string(":path"), ngx_string("/index.html") },[m
[31m-    { ngx_string(":scheme"), ngx_string("http") },[m
[31m-    { ngx_string(":scheme"), ngx_string("https") },[m
[31m-    { ngx_string(":status"), ngx_string("200") },[m
[31m-    { ngx_string(":status"), ngx_string("204") },[m
[31m-    { ngx_string(":status"), ngx_string("206") },[m
[31m-    { ngx_string(":status"), ngx_string("304") },[m
[31m-    { ngx_string(":status"), ngx_string("400") },[m
[31m-    { ngx_string(":status"), ngx_string("404") },[m
[31m-    { ngx_string(":status"), ngx_string("500") },[m
[31m-    { ngx_string("accept-charset"), ngx_string("") },[m
[31m-    { ngx_string("accept-encoding"), ngx_string("gzip, deflate") },[m
[31m-    { ngx_string("accept-language"), ngx_string("") },[m
[31m-    { ngx_string("accept-ranges"), ngx_string("") },[m
[31m-    { ngx_string("accept"), ngx_string("") },[m
[31m-    { ngx_string("access-control-allow-origin"), ngx_string("") },[m
[31m-    { ngx_string("age"), ngx_string("") },[m
[31m-    { ngx_string("allow"), ngx_string("") },[m
[31m-    { ngx_string("authorization"), ngx_string("") },[m
[31m-    { ngx_string("cache-control"), ngx_string("") },[m
[31m-    { ngx_string("content-disposition"), ngx_string("") },[m
[31m-    { ngx_string("content-encoding"), ngx_string("") },[m
[31m-    { ngx_string("content-language"), ngx_string("") },[m
[31m-    { ngx_string("content-length"), ngx_string("") },[m
[31m-    { ngx_string("content-location"), ngx_string("") },[m
[31m-    { ngx_string("content-range"), ngx_string("") },[m
[31m-    { ngx_string("content-type"), ngx_string("") },[m
[31m-    { ngx_string("cookie"), ngx_string("") },[m
[31m-    { ngx_string("date"), ngx_string("") },[m
[31m-    { ngx_string("etag"), ngx_string("") },[m
[31m-    { ngx_string("expect"), ngx_string("") },[m
[31m-    { ngx_string("expires"), ngx_string("") },[m
[31m-    { ngx_string("from"), ngx_string("") },[m
[31m-    { ngx_string("host"), ngx_string("") },[m
[31m-    { ngx_string("if-match"), ngx_string("") },[m
[31m-    { ngx_string("if-modified-since"), ngx_string("") },[m
[31m-    { ngx_string("if-none-match"), ngx_string("") },[m
[31m-    { ngx_string("if-range"), ngx_string("") },[m
[31m-    { ngx_string("if-unmodified-since"), ngx_string("") },[m
[31m-    { ngx_string("last-modified"), ngx_string("") },[m
[31m-    { ngx_string("link"), ngx_string("") },[m
[31m-    { ngx_string("location"), ngx_string("") },[m
[31m-    { ngx_string("max-forwards"), ngx_string("") },[m
[31m-    { ngx_string("proxy-authenticate"), ngx_string("") },[m
[31m-    { ngx_string("proxy-authorization"), ngx_string("") },[m
[31m-    { ngx_string("range"), ngx_string("") },[m
[31m-    { ngx_string("referer"), ngx_string("") },[m
[31m-    { ngx_string("refresh"), ngx_string("") },[m
[31m-    { ngx_string("retry-after"), ngx_string("") },[m
[31m-    { ngx_string("server"), ngx_string("") },[m
[31m-    { ngx_string("set-cookie"), ngx_string("") },[m
[31m-    { ngx_string("strict-transport-security"), ngx_string("") },[m
[31m-    { ngx_string("transfer-encoding"), ngx_string("") },[m
[31m-    { ngx_string("user-agent"), ngx_string("") },[m
[31m-    { ngx_string("vary"), ngx_string("") },[m
[31m-    { ngx_string("via"), ngx_string("") },[m
[31m-    { ngx_string("www-authenticate"), ngx_string("") },[m
[31m-};[m
[31m-[m
[31m-#define NGX_HTTP_V2_STATIC_TABLE_ENTRIES                                      \[m
[31m-    (sizeof(ngx_http_v2_static_table)                                         \[m
[31m-     / sizeof(ngx_http_v2_header_t))[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_get_indexed_header(ngx_http_v2_connection_t *h2c, ngx_uint_t index,[m
[31m-    ngx_uint_t name_only)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    size_t                 rest;[m
[31m-    ngx_http_v2_header_t  *entry;[m
[31m-[m
[31m-    if (index == 0) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent invalid hpack table index 0");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 get indexed %s: %ui",[m
[31m-                   name_only ? "header" : "header name", index);[m
[31m-[m
[31m-    index--;[m
[31m-[m
[31m-    if (index < NGX_HTTP_V2_STATIC_TABLE_ENTRIES) {[m
[31m-        h2c->state.header = ngx_http_v2_static_table[index];[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    index -= NGX_HTTP_V2_STATIC_TABLE_ENTRIES;[m
[31m-[m
[31m-    if (index < h2c->hpack.added - h2c->hpack.deleted) {[m
[31m-        index = (h2c->hpack.added - index - 1) % h2c->hpack.allocated;[m
[31m-        entry = h2c->hpack.entries[index];[m
[31m-[m
[31m-        p = ngx_pnalloc(h2c->state.pool, entry->name.len + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.header.name.len = entry->name.len;[m
[31m-        h2c->state.header.name.data = p;[m
[31m-[m
[31m-        rest = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - entry->name.data;[m
[31m-[m
[31m-        if (entry->name.len > rest) {[m
[31m-            p = ngx_cpymem(p, entry->name.data, rest);[m
[31m-            p = ngx_cpymem(p, h2c->hpack.storage, entry->name.len - rest);[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_cpymem(p, entry->name.data, entry->name.len);[m
[31m-        }[m
[31m-[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        if (name_only) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_pnalloc(h2c->state.pool, entry->value.len + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->state.header.value.len = entry->value.len;[m
[31m-        h2c->state.header.value.data = p;[m
[31m-[m
[31m-        rest = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - entry->value.data;[m
[31m-[m
[31m-        if (entry->value.len > rest) {[m
[31m-            p = ngx_cpymem(p, entry->value.data, rest);[m
[31m-            p = ngx_cpymem(p, h2c->hpack.storage, entry->value.len - rest);[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_cpymem(p, entry->value.data, entry->value.len);[m
[31m-        }[m
[31m-[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                  "client sent out of bound hpack table index: %ui", index);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_add_header(ngx_http_v2_connection_t *h2c,[m
[31m-    ngx_http_v2_header_t *header)[m
[31m-{[m
[31m-    size_t                 avail;[m
[31m-    ngx_uint_t             index;[m
[31m-    ngx_http_v2_header_t  *entry, **entries;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 add header to hpack table: \"%V: %V\"",[m
[31m-                   &header->name, &header->value);[m
[31m-[m
[31m-    if (h2c->hpack.entries == NULL) {[m
[31m-        h2c->hpack.allocated = 64;[m
[31m-        h2c->hpack.size = NGX_HTTP_V2_TABLE_SIZE;[m
[31m-        h2c->hpack.free = NGX_HTTP_V2_TABLE_SIZE;[m
[31m-[m
[31m-        h2c->hpack.entries = ngx_palloc(h2c->connection->pool,[m
[31m-                                        sizeof(ngx_http_v2_header_t *)[m
[31m-                                        * h2c->hpack.allocated);[m
[31m-        if (h2c->hpack.entries == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->hpack.storage = ngx_palloc(h2c->connection->pool,[m
[31m-                                        h2c->hpack.free);[m
[31m-        if (h2c->hpack.storage == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        h2c->hpack.pos = h2c->hpack.storage;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_v2_table_account(h2c, header->name.len + header->value.len)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->hpack.reused == h2c->hpack.deleted) {[m
[31m-        entry = ngx_palloc(h2c->connection->pool, sizeof(ngx_http_v2_header_t));[m
[31m-        if (entry == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        entry = h2c->hpack.entries[h2c->hpack.reused++ % h2c->hpack.allocated];[m
[31m-    }[m
[31m-[m
[31m-    avail = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - h2c->hpack.pos;[m
[31m-[m
[31m-    entry->name.len = header->name.len;[m
[31m-    entry->name.data = h2c->hpack.pos;[m
[31m-[m
[31m-    if (avail >= header->name.len) {[m
[31m-        h2c->hpack.pos = ngx_cpymem(h2c->hpack.pos, header->name.data,[m
[31m-                                    header->name.len);[m
[31m-    } else {[m
[31m-        ngx_memcpy(h2c->hpack.pos, header->name.data, avail);[m
[31m-        h2c->hpack.pos = ngx_cpymem(h2c->hpack.storage,[m
[31m-                                    header->name.data + avail,[m
[31m-                                    header->name.len - avail);[m
[31m-        avail = NGX_HTTP_V2_TABLE_SIZE;[m
[31m-    }[m
[31m-[m
[31m-    avail -= header->name.len;[m
[31m-[m
[31m-    entry->value.len = header->value.len;[m
[31m-    entry->value.data = h2c->hpack.pos;[m
[31m-[m
[31m-    if (avail >= header->value.len) {[m
[31m-        h2c->hpack.pos = ngx_cpymem(h2c->hpack.pos, header->value.data,[m
[31m-                                    header->value.len);[m
[31m-    } else {[m
[31m-        ngx_memcpy(h2c->hpack.pos, header->value.data, avail);[m
[31m-        h2c->hpack.pos = ngx_cpymem(h2c->hpack.storage,[m
[31m-                                    header->value.data + avail,[m
[31m-                                    header->value.len - avail);[m
[31m-    }[m
[31m-[m
[31m-    if (h2c->hpack.allocated == h2c->hpack.added - h2c->hpack.deleted) {[m
[31m-[m
[31m-        entries = ngx_palloc(h2c->connection->pool,[m
[31m-                             sizeof(ngx_http_v2_header_t *)[m
[31m-                             * (h2c->hpack.allocated + 64));[m
[31m-        if (entries == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        index = h2c->hpack.deleted % h2c->hpack.allocated;[m
[31m-[m
[31m-        ngx_memcpy(entries, &h2c->hpack.entries[index],[m
[31m-                   (h2c->hpack.allocated - index)[m
[31m-                   * sizeof(ngx_http_v2_header_t *));[m
[31m-[m
[31m-        ngx_memcpy(&entries[h2c->hpack.allocated - index], h2c->hpack.entries,[m
[31m-                   index * sizeof(ngx_http_v2_header_t *));[m
[31m-[m
[31m-        (void) ngx_pfree(h2c->connection->pool, h2c->hpack.entries);[m
[31m-[m
[31m-        h2c->hpack.entries = entries;[m
[31m-[m
[31m-        h2c->hpack.added = h2c->hpack.allocated;[m
[31m-        h2c->hpack.deleted = 0;[m
[31m-        h2c->hpack.reused = 0;[m
[31m-        h2c->hpack.allocated += 64;[m
[31m-    }[m
[31m-[m
[31m-    h2c->hpack.entries[h2c->hpack.added++ % h2c->hpack.allocated] = entry;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_v2_table_account(ngx_http_v2_connection_t *h2c, size_t size)[m
[31m-{[m
[31m-    ngx_http_v2_header_t  *entry;[m
[31m-[m
[31m-    size += 32;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 hpack table account: %uz free:%uz",[m
[31m-                   size, h2c->hpack.free);[m
[31m-[m
[31m-    if (size <= h2c->hpack.free) {[m
[31m-        h2c->hpack.free -= size;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (size > h2c->hpack.size) {[m
[31m-        h2c->hpack.deleted = h2c->hpack.added;[m
[31m-        h2c->hpack.free = h2c->hpack.size;[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    do {[m
[31m-        entry = h2c->hpack.entries[h2c->hpack.deleted++ % h2c->hpack.allocated];[m
[31m-        h2c->hpack.free += 32 + entry->name.len + entry->value.len;[m
[31m-    } while (size > h2c->hpack.free);[m
[31m-[m
[31m-    h2c->hpack.free -= size;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_v2_table_size(ngx_http_v2_connection_t *h2c, size_t size)[m
[31m-{[m
[31m-    ssize_t                needed;[m
[31m-    ngx_http_v2_header_t  *entry;[m
[31m-[m
[31m-    if (size > NGX_HTTP_V2_TABLE_SIZE) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,[m
[31m-                      "client sent invalid table size update: %uz", size);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,[m
[31m-                   "http2 new hpack table size: %uz was:%uz",[m
[31m-                   size, h2c->hpack.size);[m
[31m-[m
[31m-    needed = h2c->hpack.size - size;[m
[31m-[m
[31m-    while (needed > (ssize_t) h2c->hpack.free) {[m
[31m-        entry = h2c->hpack.entries[h2c->hpack.deleted++ % h2c->hpack.allocated];[m
[31m-        h2c->hpack.free += 32 + entry->name.len + entry->value.len;[m
[31m-    }[m
[31m-[m
[31m-    h2c->hpack.size = size;[m
[31m-    h2c->hpack.free -= needed;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail.c[m
[1mdeleted file mode 100644[m
[1mindex 6ad5a67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail.c[m
[1m+++ /dev/null[m
[36m@@ -1,534 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports,[m
[31m-    ngx_mail_listen_t *listen);[m
[31m-static char *ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports);[m
[31m-static ngx_int_t ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,[m
[31m-    ngx_mail_conf_addr_t *addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,[m
[31m-    ngx_mail_conf_addr_t *addr);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_mail_cmp_conf_addrs(const void *one, const void *two);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_mail_max_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_commands[] = {[m
[31m-[m
[31m-    { ngx_string("mail"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_mail_block,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_mail_module_ctx = {[m
[31m-    ngx_string("mail"),[m
[31m-    NULL,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_module_ctx,                  /* module context */[m
[31m-    ngx_mail_commands,                     /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    ngx_uint_t                   i, m, mi, s;[m
[31m-    ngx_conf_t                   pcf;[m
[31m-    ngx_array_t                  ports;[m
[31m-    ngx_mail_listen_t           *listen;[m
[31m-    ngx_mail_module_t           *module;[m
[31m-    ngx_mail_conf_ctx_t         *ctx;[m
[31m-    ngx_mail_core_srv_conf_t   **cscfp;[m
[31m-    ngx_mail_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    if (*(ngx_mail_conf_ctx_t **) conf) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* the main mail context */[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(ngx_mail_conf_ctx_t **) conf = ctx;[m
[31m-[m
[31m-    /* count the number of the mail modules and set up their indices */[m
[31m-[m
[31m-    ngx_mail_max_module = ngx_count_modules(cf->cycle, NGX_MAIL_MODULE);[m
[31m-[m
[31m-[m
[31m-    /* the mail main_conf context, it is the same in the all mail contexts */[m
[31m-[m
[31m-    ctx->main_conf = ngx_pcalloc(cf->pool,[m
[31m-                                 sizeof(void *) * ngx_mail_max_module);[m
[31m-    if (ctx->main_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * the mail null srv_conf context, it is used to merge[m
[31m-     * the server{}s' srv_conf's[m
[31m-     */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * create the main_conf's and the null srv_conf's of the all mail modules[m
[31m-     */[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        if (module->create_main_conf) {[m
[31m-            ctx->main_conf[mi] = module->create_main_conf(cf);[m
[31m-            if (ctx->main_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            ctx->srv_conf[mi] = module->create_srv_conf(cf);[m
[31m-            if (ctx->srv_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside the mail{} block */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-[m
[31m-    cf->module_type = NGX_MAIL_MODULE;[m
[31m-    cf->cmd_type = NGX_MAIL_MAIN_CONF;[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        *cf = pcf;[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* init mail{} main_conf's, merge the server{}s' srv_conf's */[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index];[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        /* init mail{} main_conf's */[m
[31m-[m
[31m-        cf->ctx = ctx;[m
[31m-[m
[31m-        if (module->init_main_conf) {[m
[31m-            rv = module->init_main_conf(cf, ctx->main_conf[mi]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                *cf = pcf;[m
[31m-                return rv;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-            /* merge the server{}s' srv_conf's */[m
[31m-[m
[31m-            cf->ctx = cscfp[s]->ctx;[m
[31m-[m
[31m-            if (module->merge_srv_conf) {[m
[31m-                rv = module->merge_srv_conf(cf,[m
[31m-                                            ctx->srv_conf[mi],[m
[31m-                                            cscfp[s]->ctx->srv_conf[mi]);[m
[31m-                if (rv != NGX_CONF_OK) {[m
[31m-                    *cf = pcf;[m
[31m-                    return rv;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-[m
[31m-    if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_mail_conf_port_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    listen = cmcf->listen.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->listen.nelts; i++) {[m
[31m-        if (ngx_mail_add_ports(cf, &ports, &listen[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_mail_optimize_servers(cf, &ports);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports,[m
[31m-    ngx_mail_listen_t *listen)[m
[31m-{[m
[31m-    in_port_t              p;[m
[31m-    ngx_uint_t             i;[m
[31m-    struct sockaddr       *sa;[m
[31m-    struct sockaddr_in    *sin;[m
[31m-    ngx_mail_conf_port_t  *port;[m
[31m-    ngx_mail_conf_addr_t  *addr;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6   *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    sa = &listen->u.sockaddr;[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = &listen->u.sockaddr_in6;[m
[31m-        p = sin6->sin6_port;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        p = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = &listen->u.sockaddr_in;[m
[31m-        p = sin->sin_port;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (i = 0; i < ports->nelts; i++) {[m
[31m-        if (p == port[i].port && sa->sa_family == port[i].family) {[m
[31m-[m
[31m-            /* a port is already in the port list */[m
[31m-[m
[31m-            port = &port[i];[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* add a port to the port list */[m
[31m-[m
[31m-    port = ngx_array_push(ports);[m
[31m-    if (port == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    port->family = sa->sa_family;[m
[31m-    port->port = p;[m
[31m-[m
[31m-    if (ngx_array_init(&port->addrs, cf->temp_pool, 2,[m
[31m-                       sizeof(ngx_mail_conf_addr_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    addr = ngx_array_push(&port->addrs);[m
[31m-    if (addr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addr->opt = *listen;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)[m
[31m-{[m
[31m-    ngx_uint_t                 i, p, last, bind_wildcard;[m
[31m-    ngx_listening_t           *ls;[m
[31m-    ngx_mail_port_t           *mport;[m
[31m-    ngx_mail_conf_port_t      *port;[m
[31m-    ngx_mail_conf_addr_t      *addr;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (p = 0; p < ports->nelts; p++) {[m
[31m-[m
[31m-        ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,[m
[31m-                 sizeof(ngx_mail_conf_addr_t), ngx_mail_cmp_conf_addrs);[m
[31m-[m
[31m-        addr = port[p].addrs.elts;[m
[31m-        last = port[p].addrs.nelts;[m
[31m-[m
[31m-        /*[m
[31m-         * if there is the binding to the "*:port" then we need to bind()[m
[31m-         * to the "*:port" only and ignore the other bindings[m
[31m-         */[m
[31m-[m
[31m-        if (addr[last - 1].opt.wildcard) {[m
[31m-            addr[last - 1].opt.bind = 1;[m
[31m-            bind_wildcard = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            bind_wildcard = 0;[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-[m
[31m-        while (i < last) {[m
[31m-[m
[31m-            if (bind_wildcard && !addr[i].opt.bind) {[m
[31m-                i++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls = ngx_create_listening(cf, &addr[i].opt.u.sockaddr,[m
[31m-                                      addr[i].opt.socklen);[m
[31m-            if (ls == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls->addr_ntop = 1;[m
[31m-            ls->handler = ngx_mail_init_connection;[m
[31m-            ls->pool_size = 256;[m
[31m-[m
[31m-            cscf = addr->opt.ctx->srv_conf[ngx_mail_core_module.ctx_index];[m
[31m-[m
[31m-            ls->logp = cscf->error_log;[m
[31m-            ls->log.data = &ls->addr_text;[m
[31m-            ls->log.handler = ngx_accept_log_error;[m
[31m-[m
[31m-            ls->backlog = addr[i].opt.backlog;[m
[31m-[m
[31m-            ls->keepalive = addr[i].opt.so_keepalive;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-            ls->keepidle = addr[i].opt.tcp_keepidle;[m
[31m-            ls->keepintvl = addr[i].opt.tcp_keepintvl;[m
[31m-            ls->keepcnt = addr[i].opt.tcp_keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            ls->ipv6only = addr[i].opt.ipv6only;[m
[31m-#endif[m
[31m-[m
[31m-            mport = ngx_palloc(cf->pool, sizeof(ngx_mail_port_t));[m
[31m-            if (mport == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls->servers = mport;[m
[31m-[m
[31m-            mport->naddrs = i + 1;[m
[31m-[m
[31m-            switch (ls->sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                if (ngx_mail_add_addrs6(cf, mport, addr) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                if (ngx_mail_add_addrs(cf, mport, addr) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            addr++;[m
[31m-            last--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,[m
[31m-    ngx_mail_conf_addr_t *addr)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    size_t               len;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_mail_in_addr_t  *addrs;[m
[31m-    struct sockaddr_in  *sin;[m
[31m-    u_char               buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    mport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                               mport->naddrs * sizeof(ngx_mail_in_addr_t));[m
[31m-    if (mport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs = mport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < mport->naddrs; i++) {[m
[31m-[m
[31m-        sin = &addr[i].opt.u.sockaddr_in;[m
[31m-        addrs[i].addr = sin->sin_addr.s_addr;[m
[31m-[m
[31m-        addrs[i].conf.ctx = addr[i].opt.ctx;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-        addrs[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-[m
[31m-        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,[m
[31m-                            NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-        addrs[i].conf.addr_text.len = len;[m
[31m-        addrs[i].conf.addr_text.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,[m
[31m-    ngx_mail_conf_addr_t *addr)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    size_t                len;[m
[31m-    ngx_uint_t            i;[m
[31m-    ngx_mail_in6_addr_t  *addrs6;[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-    u_char                buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    mport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                               mport->naddrs * sizeof(ngx_mail_in6_addr_t));[m
[31m-    if (mport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs6 = mport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < mport->naddrs; i++) {[m
[31m-[m
[31m-        sin6 = &addr[i].opt.u.sockaddr_in6;[m
[31m-        addrs6[i].addr6 = sin6->sin6_addr;[m
[31m-[m
[31m-        addrs6[i].conf.ctx = addr[i].opt.ctx;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-        addrs6[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-[m
[31m-        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,[m
[31m-                            NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-        addrs6[i].conf.addr_text.len = len;[m
[31m-        addrs6[i].conf.addr_text.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_cmp_conf_addrs(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_mail_conf_addr_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_mail_conf_addr_t *) one;[m
[31m-    second = (ngx_mail_conf_addr_t *) two;[m
[31m-[m
[31m-    if (first->opt.wildcard) {[m
[31m-        /* a wildcard must be the last resort, shift it to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (second->opt.wildcard) {[m
[31m-        /* a wildcard must be the last resort, shift it to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->opt.bind && !second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->opt.bind && second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* do not sort by default */[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail.h[m
[1mdeleted file mode 100644[m
[1mindex bfbf768..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail.h[m
[1m+++ /dev/null[m
[36m@@ -1,416 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_H_INCLUDED_[m
[31m-#define _NGX_MAIL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-#include <ngx_mail_ssl_module.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void                  **main_conf;[m
[31m-    void                  **srv_conf;[m
[31m-} ngx_mail_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    union {[m
[31m-        struct sockaddr     sockaddr;[m
[31m-        struct sockaddr_in  sockaddr_in;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        struct sockaddr_in6 sockaddr_in6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        struct sockaddr_un  sockaddr_un;[m
[31m-#endif[m
[31m-        u_char              sockaddr_data[NGX_SOCKADDRLEN];[m
[31m-    } u;[m
[31m-[m
[31m-    socklen_t               socklen;[m
[31m-[m
[31m-    /* server ctx */[m
[31m-    ngx_mail_conf_ctx_t    *ctx;[m
[31m-[m
[31m-    unsigned                bind:1;[m
[31m-    unsigned                wildcard:1;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    unsigned                ssl:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    unsigned                ipv6only:1;[m
[31m-#endif[m
[31m-    unsigned                so_keepalive:2;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    int                     tcp_keepidle;[m
[31m-    int                     tcp_keepintvl;[m
[31m-    int                     tcp_keepcnt;[m
[31m-#endif[m
[31m-    int                     backlog;[m
[31m-} ngx_mail_listen_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_mail_conf_ctx_t    *ctx;[m
[31m-    ngx_str_t               addr_text;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_uint_t              ssl;    /* unsigned   ssl:1; */[m
[31m-#endif[m
[31m-} ngx_mail_addr_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t               addr;[m
[31m-    ngx_mail_addr_conf_t    conf;[m
[31m-} ngx_mail_in_addr_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr         addr6;[m
[31m-    ngx_mail_addr_conf_t    conf;[m
[31m-} ngx_mail_in6_addr_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* ngx_mail_in_addr_t or ngx_mail_in6_addr_t */[m
[31m-    void                   *addrs;[m
[31m-    ngx_uint_t              naddrs;[m
[31m-} ngx_mail_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int                     family;[m
[31m-    in_port_t               port;[m
[31m-    ngx_array_t             addrs;       /* array of ngx_mail_conf_addr_t */[m
[31m-} ngx_mail_conf_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_mail_listen_t       opt;[m
[31m-} ngx_mail_conf_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t             servers;     /* ngx_mail_core_srv_conf_t */[m
[31m-    ngx_array_t             listen;      /* ngx_mail_listen_t */[m
[31m-} ngx_mail_core_main_conf_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_POP3_PROTOCOL  0[m
[31m-#define NGX_MAIL_IMAP_PROTOCOL  1[m
[31m-#define NGX_MAIL_SMTP_PROTOCOL  2[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_mail_protocol_s  ngx_mail_protocol_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_mail_protocol_t    *protocol;[m
[31m-[m
[31m-    ngx_msec_t              timeout;[m
[31m-    ngx_msec_t              resolver_timeout;[m
[31m-[m
[31m-    ngx_str_t               server_name;[m
[31m-[m
[31m-    u_char                 *file_name;[m
[31m-    ngx_int_t               line;[m
[31m-[m
[31m-    ngx_resolver_t         *resolver;[m
[31m-    ngx_log_t              *error_log;[m
[31m-[m
[31m-    /* server ctx */[m
[31m-    ngx_mail_conf_ctx_t    *ctx;[m
[31m-} ngx_mail_core_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_pop3_start = 0,[m
[31m-    ngx_pop3_user,[m
[31m-    ngx_pop3_passwd,[m
[31m-    ngx_pop3_auth_login_username,[m
[31m-    ngx_pop3_auth_login_password,[m
[31m-    ngx_pop3_auth_plain,[m
[31m-    ngx_pop3_auth_cram_md5[m
[31m-} ngx_pop3_state_e;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_imap_start = 0,[m
[31m-    ngx_imap_auth_login_username,[m
[31m-    ngx_imap_auth_login_password,[m
[31m-    ngx_imap_auth_plain,[m
[31m-    ngx_imap_auth_cram_md5,[m
[31m-    ngx_imap_login,[m
[31m-    ngx_imap_user,[m
[31m-    ngx_imap_passwd[m
[31m-} ngx_imap_state_e;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    ngx_smtp_start = 0,[m
[31m-    ngx_smtp_auth_login_username,[m
[31m-    ngx_smtp_auth_login_password,[m
[31m-    ngx_smtp_auth_plain,[m
[31m-    ngx_smtp_auth_cram_md5,[m
[31m-    ngx_smtp_helo,[m
[31m-    ngx_smtp_helo_xclient,[m
[31m-    ngx_smtp_helo_from,[m
[31m-    ngx_smtp_xclient,[m
[31m-    ngx_smtp_xclient_from,[m
[31m-    ngx_smtp_xclient_helo,[m
[31m-    ngx_smtp_from,[m
[31m-    ngx_smtp_to[m
[31m-} ngx_smtp_state_e;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_peer_connection_t   upstream;[m
[31m-    ngx_buf_t              *buffer;[m
[31m-} ngx_mail_proxy_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t                signature;         /* "MAIL" */[m
[31m-[m
[31m-    ngx_connection_t       *connection;[m
[31m-[m
[31m-    ngx_str_t               out;[m
[31m-    ngx_buf_t              *buffer;[m
[31m-[m
[31m-    void                  **ctx;[m
[31m-    void                  **main_conf;[m
[31m-    void                  **srv_conf;[m
[31m-[m
[31m-    ngx_resolver_ctx_t     *resolver_ctx;[m
[31m-[m
[31m-    ngx_mail_proxy_ctx_t   *proxy;[m
[31m-[m
[31m-    ngx_uint_t              mail_state;[m
[31m-[m
[31m-    unsigned                protocol:3;[m
[31m-    unsigned                blocked:1;[m
[31m-    unsigned                quit:1;[m
[31m-    unsigned                quoted:1;[m
[31m-    unsigned                backslash:1;[m
[31m-    unsigned                no_sync_literal:1;[m
[31m-    unsigned                starttls:1;[m
[31m-    unsigned                esmtp:1;[m
[31m-    unsigned                auth_method:3;[m
[31m-    unsigned                auth_wait:1;[m
[31m-[m
[31m-    ngx_str_t               login;[m
[31m-    ngx_str_t               passwd;[m
[31m-[m
[31m-    ngx_str_t               salt;[m
[31m-    ngx_str_t               tag;[m
[31m-    ngx_str_t               tagged_line;[m
[31m-    ngx_str_t               text;[m
[31m-[m
[31m-    ngx_str_t              *addr_text;[m
[31m-    ngx_str_t               host;[m
[31m-    ngx_str_t               smtp_helo;[m
[31m-    ngx_str_t               smtp_from;[m
[31m-    ngx_str_t               smtp_to;[m
[31m-[m
[31m-    ngx_str_t               cmd;[m
[31m-[m
[31m-    ngx_uint_t              command;[m
[31m-    ngx_array_t             args;[m
[31m-[m
[31m-    ngx_uint_t              login_attempt;[m
[31m-[m
[31m-    /* used to parse POP3/IMAP/SMTP command */[m
[31m-[m
[31m-    ngx_uint_t              state;[m
[31m-    u_char                 *cmd_start;[m
[31m-    u_char                 *arg_start;[m
[31m-    u_char                 *arg_end;[m
[31m-    ngx_uint_t              literal_len;[m
[31m-} ngx_mail_session_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t              *client;[m
[31m-    ngx_mail_session_t     *session;[m
[31m-} ngx_mail_log_ctx_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_POP3_USER          1[m
[31m-#define NGX_POP3_PASS          2[m
[31m-#define NGX_POP3_CAPA          3[m
[31m-#define NGX_POP3_QUIT          4[m
[31m-#define NGX_POP3_NOOP          5[m
[31m-#define NGX_POP3_STLS          6[m
[31m-#define NGX_POP3_APOP          7[m
[31m-#define NGX_POP3_AUTH          8[m
[31m-#define NGX_POP3_STAT          9[m
[31m-#define NGX_POP3_LIST          10[m
[31m-#define NGX_POP3_RETR          11[m
[31m-#define NGX_POP3_DELE          12[m
[31m-#define NGX_POP3_RSET          13[m
[31m-#define NGX_POP3_TOP           14[m
[31m-#define NGX_POP3_UIDL          15[m
[31m-[m
[31m-[m
[31m-#define NGX_IMAP_LOGIN         1[m
[31m-#define NGX_IMAP_LOGOUT        2[m
[31m-#define NGX_IMAP_CAPABILITY    3[m
[31m-#define NGX_IMAP_NOOP          4[m
[31m-#define NGX_IMAP_STARTTLS      5[m
[31m-[m
[31m-#define NGX_IMAP_NEXT          6[m
[31m-[m
[31m-#define NGX_IMAP_AUTHENTICATE  7[m
[31m-[m
[31m-[m
[31m-#define NGX_SMTP_HELO          1[m
[31m-#define NGX_SMTP_EHLO          2[m
[31m-#define NGX_SMTP_AUTH          3[m
[31m-#define NGX_SMTP_QUIT          4[m
[31m-#define NGX_SMTP_NOOP          5[m
[31m-#define NGX_SMTP_MAIL          6[m
[31m-#define NGX_SMTP_RSET          7[m
[31m-#define NGX_SMTP_RCPT          8[m
[31m-#define NGX_SMTP_DATA          9[m
[31m-#define NGX_SMTP_VRFY          10[m
[31m-#define NGX_SMTP_EXPN          11[m
[31m-#define NGX_SMTP_HELP          12[m
[31m-#define NGX_SMTP_STARTTLS      13[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_AUTH_PLAIN             0[m
[31m-#define NGX_MAIL_AUTH_LOGIN             1[m
[31m-#define NGX_MAIL_AUTH_LOGIN_USERNAME    2[m
[31m-#define NGX_MAIL_AUTH_APOP              3[m
[31m-#define NGX_MAIL_AUTH_CRAM_MD5          4[m
[31m-#define NGX_MAIL_AUTH_NONE              5[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_AUTH_PLAIN_ENABLED     0x0002[m
[31m-#define NGX_MAIL_AUTH_LOGIN_ENABLED     0x0004[m
[31m-#define NGX_MAIL_AUTH_APOP_ENABLED      0x0008[m
[31m-#define NGX_MAIL_AUTH_CRAM_MD5_ENABLED  0x0010[m
[31m-#define NGX_MAIL_AUTH_NONE_ENABLED      0x0020[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_PARSE_INVALID_COMMAND  20[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_mail_init_session_pt)(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-typedef void (*ngx_mail_init_protocol_pt)(ngx_event_t *rev);[m
[31m-typedef void (*ngx_mail_auth_state_pt)(ngx_event_t *rev);[m
[31m-typedef ngx_int_t (*ngx_mail_parse_command_pt)(ngx_mail_session_t *s);[m
[31m-[m
[31m-[m
[31m-struct ngx_mail_protocol_s {[m
[31m-    ngx_str_t                   name;[m
[31m-    in_port_t                   port[4];[m
[31m-    ngx_uint_t                  type;[m
[31m-[m
[31m-    ngx_mail_init_session_pt    init_session;[m
[31m-    ngx_mail_init_protocol_pt   init_protocol;[m
[31m-    ngx_mail_parse_command_pt   parse_command;[m
[31m-    ngx_mail_auth_state_pt      auth_state;[m
[31m-[m
[31m-    ngx_str_t                   internal_server_error;[m
[31m-    ngx_str_t                   cert_error;[m
[31m-    ngx_str_t                   no_cert;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_mail_protocol_t        *protocol;[m
[31m-[m
[31m-    void                       *(*create_main_conf)(ngx_conf_t *cf);[m
[31m-    char                       *(*init_main_conf)(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-    void                       *(*create_srv_conf)(ngx_conf_t *cf);[m
[31m-    char                       *(*merge_srv_conf)(ngx_conf_t *cf, void *prev,[m
[31m-                                                  void *conf);[m
[31m-} ngx_mail_module_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_MODULE         0x4C49414D     /* "MAIL" */[m
[31m-[m
[31m-#define NGX_MAIL_MAIN_CONF      0x02000000[m
[31m-#define NGX_MAIL_SRV_CONF       0x04000000[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_MAIN_CONF_OFFSET  offsetof(ngx_mail_conf_ctx_t, main_conf)[m
[31m-#define NGX_MAIL_SRV_CONF_OFFSET   offsetof(ngx_mail_conf_ctx_t, srv_conf)[m
[31m-[m
[31m-[m
[31m-#define ngx_mail_get_module_ctx(s, module)     (s)->ctx[module.ctx_index][m
[31m-#define ngx_mail_set_ctx(s, c, module)         s->ctx[module.ctx_index] = c;[m
[31m-#define ngx_mail_delete_ctx(s, module)         s->ctx[module.ctx_index] = NULL;[m
[31m-[m
[31m-[m
[31m-#define ngx_mail_get_module_main_conf(s, module)                             \[m
[31m-    (s)->main_conf[module.ctx_index][m
[31m-#define ngx_mail_get_module_srv_conf(s, module)  (s)->srv_conf[module.ctx_index][m
[31m-[m
[31m-#define ngx_mail_conf_get_module_main_conf(cf, module)                       \[m
[31m-    ((ngx_mail_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index][m
[31m-#define ngx_mail_conf_get_module_srv_conf(cf, module)                        \[m
[31m-    ((ngx_mail_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index][m
[31m-[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-void ngx_mail_starttls_handler(ngx_event_t *rev);[m
[31m-ngx_int_t ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_mail_init_connection(ngx_connection_t *c);[m
[31m-[m
[31m-ngx_int_t ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_mail_core_srv_conf_t *cscf);[m
[31m-ngx_int_t ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_uint_t n);[m
[31m-ngx_int_t ngx_mail_auth_login_username(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c, ngx_uint_t n);[m
[31m-ngx_int_t ngx_mail_auth_login_password(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-ngx_int_t ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c, char *prefix, size_t len);[m
[31m-ngx_int_t ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-ngx_int_t ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-[m
[31m-void ngx_mail_send(ngx_event_t *wev);[m
[31m-ngx_int_t ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_close_connection(ngx_connection_t *c);[m
[31m-void ngx_mail_session_internal_server_error(ngx_mail_session_t *s);[m
[31m-u_char *ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-char *ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-/* STUB */[m
[31m-void ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer);[m
[31m-void ngx_mail_auth_http_init(ngx_mail_session_t *s);[m
[31m-/**/[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t    ngx_mail_max_module;[m
[31m-extern ngx_module_t  ngx_mail_core_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_auth_http_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_auth_http_module.c[m
[1mdeleted file mode 100644[m
[1mindex 39f9b17..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_auth_http_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1590 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_addr_t                     *peer;[m
[31m-[m
[31m-    ngx_msec_t                      timeout;[m
[31m-    ngx_flag_t                      pass_client_cert;[m
[31m-[m
[31m-    ngx_str_t                       host_header;[m
[31m-    ngx_str_t                       uri;[m
[31m-    ngx_str_t                       header;[m
[31m-[m
[31m-    ngx_array_t                    *headers;[m
[31m-[m
[31m-    u_char                         *file;[m
[31m-    ngx_uint_t                      line;[m
[31m-} ngx_mail_auth_http_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_mail_auth_http_ctx_s  ngx_mail_auth_http_ctx_t;[m
[31m-[m
[31m-typedef void (*ngx_mail_auth_http_handler_pt)(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx);[m
[31m-[m
[31m-struct ngx_mail_auth_http_ctx_s {[m
[31m-    ngx_buf_t                      *request;[m
[31m-    ngx_buf_t                      *response;[m
[31m-    ngx_peer_connection_t           peer;[m
[31m-[m
[31m-    ngx_mail_auth_http_handler_pt   handler;[m
[31m-[m
[31m-    ngx_uint_t                      state;[m
[31m-[m
[31m-    u_char                         *header_name_start;[m
[31m-    u_char                         *header_name_end;[m
[31m-    u_char                         *header_start;[m
[31m-    u_char                         *header_end;[m
[31m-[m
[31m-    ngx_str_t                       addr;[m
[31m-    ngx_str_t                       port;[m
[31m-    ngx_str_t                       err;[m
[31m-    ngx_str_t                       errmsg;[m
[31m-    ngx_str_t                       errcode;[m
[31m-[m
[31m-    time_t                          sleep;[m
[31m-[m
[31m-    ngx_pool_t                     *pool;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void ngx_mail_auth_http_write_handler(ngx_event_t *wev);[m
[31m-static void ngx_mail_auth_http_read_handler(ngx_event_t *rev);[m
[31m-static void ngx_mail_auth_http_ignore_status_line(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx);[m
[31m-static void ngx_mail_auth_http_process_headers(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx);[m
[31m-static void ngx_mail_auth_sleep_handler(ngx_event_t *rev);[m
[31m-static ngx_int_t ngx_mail_auth_http_parse_header_line(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx);[m
[31m-static void ngx_mail_auth_http_block_read(ngx_event_t *rev);[m
[31m-static void ngx_mail_auth_http_dummy_handler(ngx_event_t *ev);[m
[31m-static ngx_buf_t *ngx_mail_auth_http_create_request(ngx_mail_session_t *s,[m
[31m-    ngx_pool_t *pool, ngx_mail_auth_http_conf_t *ahcf);[m
[31m-static ngx_int_t ngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text,[m
[31m-    ngx_str_t *escaped);[m
[31m-[m
[31m-static void *ngx_mail_auth_http_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static char *ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_auth_http_commands[] = {[m
[31m-[m
[31m-    { ngx_string("auth_http"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_mail_auth_http,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_http_timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_auth_http_conf_t, timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_http_header"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_mail_auth_http_header,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("auth_http_pass_client_cert"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_auth_http_conf_t, pass_client_cert),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_auth_http_module_ctx = {[m
[31m-    NULL,                                  /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_auth_http_create_conf,        /* create server configuration */[m
[31m-    ngx_mail_auth_http_merge_conf          /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_auth_http_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_auth_http_module_ctx,        /* module context */[m
[31m-    ngx_mail_auth_http_commands,           /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t   ngx_mail_auth_http_method[] = {[m
[31m-    ngx_string("plain"),[m
[31m-    ngx_string("plain"),[m
[31m-    ngx_string("plain"),[m
[31m-    ngx_string("apop"),[m
[31m-    ngx_string("cram-md5"),[m
[31m-    ngx_string("none")[m
[31m-};[m
[31m-[m
[31m-static ngx_str_t   ngx_mail_smtp_errcode = ngx_string("535 5.7.0");[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_auth_http_init(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_pool_t                 *pool;[m
[31m-    ngx_mail_auth_http_ctx_t   *ctx;[m
[31m-    ngx_mail_auth_http_conf_t  *ahcf;[m
[31m-[m
[31m-    s->connection->log->action = "in http auth state";[m
[31m-[m
[31m-    pool = ngx_create_pool(2048, s->connection->log);[m
[31m-    if (pool == NULL) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(pool, sizeof(ngx_mail_auth_http_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->pool = pool;[m
[31m-[m
[31m-    ahcf = ngx_mail_get_module_srv_conf(s, ngx_mail_auth_http_module);[m
[31m-[m
[31m-    ctx->request = ngx_mail_auth_http_create_request(s, pool, ahcf);[m
[31m-    if (ctx->request == NULL) {[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_set_ctx(s, ctx, ngx_mail_auth_http_module);[m
[31m-[m
[31m-    ctx->peer.sockaddr = ahcf->peer->sockaddr;[m
[31m-    ctx->peer.socklen = ahcf->peer->socklen;[m
[31m-    ctx->peer.name = &ahcf->peer->name;[m
[31m-    ctx->peer.get = ngx_event_get_peer;[m
[31m-    ctx->peer.log = s->connection->log;[m
[31m-    ctx->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&ctx->peer);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {[m
[31m-        if (ctx->peer.connection) {[m
[31m-            ngx_close_connection(ctx->peer.connection);[m
[31m-        }[m
[31m-[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->peer.connection->data = s;[m
[31m-    ctx->peer.connection->pool = s->connection->pool;[m
[31m-[m
[31m-    s->connection->read->handler = ngx_mail_auth_http_block_read;[m
[31m-    ctx->peer.connection->read->handler = ngx_mail_auth_http_read_handler;[m
[31m-    ctx->peer.connection->write->handler = ngx_mail_auth_http_write_handler;[m
[31m-[m
[31m-    ctx->handler = ngx_mail_auth_http_ignore_status_line;[m
[31m-[m
[31m-    ngx_add_timer(ctx->peer.connection->read, ahcf->timeout);[m
[31m-    ngx_add_timer(ctx->peer.connection->write, ahcf->timeout);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        ngx_mail_auth_http_write_handler(ctx->peer.connection->write);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_write_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ssize_t                     n, size;[m
[31m-    ngx_connection_t           *c;[m
[31m-    ngx_mail_session_t         *s;[m
[31m-    ngx_mail_auth_http_ctx_t   *ctx;[m
[31m-    ngx_mail_auth_http_conf_t  *ahcf;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0,[m
[31m-                   "mail auth http write handler");[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT,[m
[31m-                      "auth http server %V timed out", ctx->peer.name);[m
[31m-        ngx_close_connection(c);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    size = ctx->request->last - ctx->request->pos;[m
[31m-[m
[31m-    n = ngx_send(c, ctx->request->pos, size);[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_close_connection(c);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        ctx->request->pos += n;[m
[31m-[m
[31m-        if (n == size) {[m
[31m-            wev->handler = ngx_mail_auth_http_dummy_handler;[m
[31m-[m
[31m-            if (wev->timer_set) {[m
[31m-                ngx_del_timer(wev);[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-                ngx_close_connection(c);[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-            }[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!wev->timer_set) {[m
[31m-        ahcf = ngx_mail_get_module_srv_conf(s, ngx_mail_auth_http_module);[m
[31m-        ngx_add_timer(wev, ahcf->timeout);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_read_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ssize_t                     n, size;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_auth_http_ctx_t  *ctx;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail auth http read handler");[m
[31m-[m
[31m-    ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module);[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT,[m
[31m-                      "auth http server %V timed out", ctx->peer.name);[m
[31m-        ngx_close_connection(c);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->response == NULL) {[m
[31m-        ctx->response = ngx_create_temp_buf(ctx->pool, 1024);[m
[31m-        if (ctx->response == NULL) {[m
[31m-            ngx_close_connection(c);[m
[31m-            ngx_destroy_pool(ctx->pool);[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = ctx->response->end - ctx->response->last;[m
[31m-[m
[31m-    n = ngx_recv(c, ctx->response->pos, size);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        ctx->response->last += n;[m
[31m-[m
[31m-        ctx->handler(s, ctx);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-    ngx_destroy_pool(ctx->pool);[m
[31m-    ngx_mail_session_internal_server_error(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_ignore_status_line(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char  *p, ch;[m
[31m-    enum  {[m
[31m-        sw_start = 0,[m
[31m-        sw_H,[m
[31m-        sw_HT,[m
[31m-        sw_HTT,[m
[31m-        sw_HTTP,[m
[31m-        sw_skip,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                   "mail auth http process status line");[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-[m
[31m-    for (p = ctx->response->pos; p < ctx->response->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* "HTTP/" */[m
[31m-        case sw_start:[m
[31m-            if (ch == 'H') {[m
[31m-                state = sw_H;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        case sw_H:[m
[31m-            if (ch == 'T') {[m
[31m-                state = sw_HT;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        case sw_HT:[m
[31m-            if (ch == 'T') {[m
[31m-                state = sw_HTT;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        case sw_HTT:[m
[31m-            if (ch == 'P') {[m
[31m-                state = sw_HTTP;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        case sw_HTTP:[m
[31m-            if (ch == '/') {[m
[31m-                state = sw_skip;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto next;[m
[31m-[m
[31m-        /* any text until end of line */[m
[31m-        case sw_skip:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of status line */[m
[31m-        case sw_almost_done:[m
[31m-            if (ch == LF) {[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                          "auth http server %V sent invalid response",[m
[31m-                          ctx->peer.name);[m
[31m-            ngx_close_connection(ctx->peer.connection);[m
[31m-            ngx_destroy_pool(ctx->pool);[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->response->pos = p;[m
[31m-    ctx->state = state;[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-next:[m
[31m-[m
[31m-    p = ctx->response->start - 1;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = 0;[m
[31m-    ctx->handler = ngx_mail_auth_http_process_headers;[m
[31m-    ctx->handler(s, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_process_headers(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char               *p;[m
[31m-    time_t                timer;[m
[31m-    size_t                len, size;[m
[31m-    ngx_int_t             rc, port, n;[m
[31m-    ngx_addr_t           *peer;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                   "mail auth http process headers");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        rc = ngx_mail_auth_http_parse_header_line(s, ctx);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-            {[m
[31m-            ngx_str_t  key, value;[m
[31m-[m
[31m-            key.len = ctx->header_name_end - ctx->header_name_start;[m
[31m-            key.data = ctx->header_name_start;[m
[31m-            value.len = ctx->header_end - ctx->header_start;[m
[31m-            value.data = ctx->header_start;[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                           "mail auth http header: \"%V: %V\"",[m
[31m-                           &key, &value);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            len = ctx->header_name_end - ctx->header_name_start;[m
[31m-[m
[31m-            if (len == sizeof("Auth-Status") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Status",[m
[31m-                                   sizeof("Auth-Status") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                if (len == 2[m
[31m-                    && ctx->header_start[0] == 'O'[m
[31m-                    && ctx->header_start[1] == 'K')[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                if (len == 4[m
[31m-                    && ctx->header_start[0] == 'W'[m
[31m-                    && ctx->header_start[1] == 'A'[m
[31m-                    && ctx->header_start[2] == 'I'[m
[31m-                    && ctx->header_start[3] == 'T')[m
[31m-                {[m
[31m-                    s->auth_wait = 1;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                ctx->errmsg.len = len;[m
[31m-                ctx->errmsg.data = ctx->header_start;[m
[31m-[m
[31m-                switch (s->protocol) {[m
[31m-[m
[31m-                case NGX_MAIL_POP3_PROTOCOL:[m
[31m-                    size = sizeof("-ERR ") - 1 + len + sizeof(CRLF) - 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_MAIL_IMAP_PROTOCOL:[m
[31m-                    size = s->tag.len + sizeof("NO ") - 1 + len[m
[31m-                           + sizeof(CRLF) - 1;[m
[31m-                    break;[m
[31m-[m
[31m-                default: /* NGX_MAIL_SMTP_PROTOCOL */[m
[31m-                    ctx->err = ctx->errmsg;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                p = ngx_pnalloc(s->connection->pool, size);[m
[31m-                if (p == NULL) {[m
[31m-                    ngx_close_connection(ctx->peer.connection);[m
[31m-                    ngx_destroy_pool(ctx->pool);[m
[31m-                    ngx_mail_session_internal_server_error(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ctx->err.data = p;[m
[31m-[m
[31m-                switch (s->protocol) {[m
[31m-[m
[31m-                case NGX_MAIL_POP3_PROTOCOL:[m
[31m-                    *p++ = '-'; *p++ = 'E'; *p++ = 'R'; *p++ = 'R'; *p++ = ' ';[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_MAIL_IMAP_PROTOCOL:[m
[31m-                    p = ngx_cpymem(p, s->tag.data, s->tag.len);[m
[31m-                    *p++ = 'N'; *p++ = 'O'; *p++ = ' ';[m
[31m-                    break;[m
[31m-[m
[31m-                default: /* NGX_MAIL_SMTP_PROTOCOL */[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                p = ngx_cpymem(p, ctx->header_start, len);[m
[31m-                *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-                ctx->err.len = p - ctx->err.data;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Server") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Server",[m
[31m-                                   sizeof("Auth-Server") - 1)[m
[31m-                    == 0)[m
[31m-            {[m
[31m-                ctx->addr.len = ctx->header_end - ctx->header_start;[m
[31m-                ctx->addr.data = ctx->header_start;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Port") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Port",[m
[31m-                                   sizeof("Auth-Port") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                ctx->port.len = ctx->header_end - ctx->header_start;[m
[31m-                ctx->port.data = ctx->header_start;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-User") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-User",[m
[31m-                                   sizeof("Auth-User") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                s->login.len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                s->login.data = ngx_pnalloc(s->connection->pool, s->login.len);[m
[31m-                if (s->login.data == NULL) {[m
[31m-                    ngx_close_connection(ctx->peer.connection);[m
[31m-                    ngx_destroy_pool(ctx->pool);[m
[31m-                    ngx_mail_session_internal_server_error(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(s->login.data, ctx->header_start, s->login.len);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Pass") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Pass",[m
[31m-                                   sizeof("Auth-Pass") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                s->passwd.len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                s->passwd.data = ngx_pnalloc(s->connection->pool,[m
[31m-                                             s->passwd.len);[m
[31m-                if (s->passwd.data == NULL) {[m
[31m-                    ngx_close_connection(ctx->peer.connection);[m
[31m-                    ngx_destroy_pool(ctx->pool);[m
[31m-                    ngx_mail_session_internal_server_error(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(s->passwd.data, ctx->header_start, s->passwd.len);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Wait") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Wait",[m
[31m-                                   sizeof("Auth-Wait") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                n = ngx_atoi(ctx->header_start,[m
[31m-                             ctx->header_end - ctx->header_start);[m
[31m-[m
[31m-                if (n != NGX_ERROR) {[m
[31m-                    ctx->sleep = n;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (len == sizeof("Auth-Error-Code") - 1[m
[31m-                && ngx_strncasecmp(ctx->header_name_start,[m
[31m-                                   (u_char *) "Auth-Error-Code",[m
[31m-                                   sizeof("Auth-Error-Code") - 1)[m
[31m-                   == 0)[m
[31m-            {[m
[31m-                ctx->errcode.len = ctx->header_end - ctx->header_start;[m
[31m-[m
[31m-                ctx->errcode.data = ngx_pnalloc(s->connection->pool,[m
[31m-                                                ctx->errcode.len);[m
[31m-                if (ctx->errcode.data == NULL) {[m
[31m-                    ngx_close_connection(ctx->peer.connection);[m
[31m-                    ngx_destroy_pool(ctx->pool);[m
[31m-                    ngx_mail_session_internal_server_error(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(ctx->errcode.data, ctx->header_start,[m
[31m-                           ctx->errcode.len);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* ignore other headers */[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                           "mail auth http header done");[m
[31m-[m
[31m-            ngx_close_connection(ctx->peer.connection);[m
[31m-[m
[31m-            if (ctx->err.len) {[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, s->connection->log, 0,[m
[31m-                              "client login failed: \"%V\"", &ctx->errmsg);[m
[31m-[m
[31m-                if (s->protocol == NGX_MAIL_SMTP_PROTOCOL) {[m
[31m-[m
[31m-                    if (ctx->errcode.len == 0) {[m
[31m-                        ctx->errcode = ngx_mail_smtp_errcode;[m
[31m-                    }[m
[31m-[m
[31m-                    ctx->err.len = ctx->errcode.len + ctx->errmsg.len[m
[31m-                                   + sizeof(" " CRLF) - 1;[m
[31m-[m
[31m-                    p = ngx_pnalloc(s->connection->pool, ctx->err.len);[m
[31m-                    if (p == NULL) {[m
[31m-                        ngx_destroy_pool(ctx->pool);[m
[31m-                        ngx_mail_session_internal_server_error(s);[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    ctx->err.data = p;[m
[31m-[m
[31m-                    p = ngx_cpymem(p, ctx->errcode.data, ctx->errcode.len);[m
[31m-                    *p++ = ' ';[m
[31m-                    p = ngx_cpymem(p, ctx->errmsg.data, ctx->errmsg.len);[m
[31m-                    *p++ = CR; *p = LF;[m
[31m-                }[m
[31m-[m
[31m-                s->out = ctx->err;[m
[31m-                timer = ctx->sleep;[m
[31m-[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-[m
[31m-                if (timer == 0) {[m
[31m-                    s->quit = 1;[m
[31m-                    ngx_mail_send(s->connection->write);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_add_timer(s->connection->read, (ngx_msec_t) (timer * 1000));[m
[31m-[m
[31m-                s->connection->read->handler = ngx_mail_auth_sleep_handler;[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (s->auth_wait) {[m
[31m-                timer = ctx->sleep;[m
[31m-[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-[m
[31m-                if (timer == 0) {[m
[31m-                    ngx_mail_auth_http_init(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                ngx_add_timer(s->connection->read, (ngx_msec_t) (timer * 1000));[m
[31m-[m
[31m-                s->connection->read->handler = ngx_mail_auth_sleep_handler;[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->addr.len == 0 || ctx->port.len == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                              "auth http server %V did not send server or port",[m
[31m-                              ctx->peer.name);[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            if (s->passwd.data == NULL[m
[31m-                && s->protocol != NGX_MAIL_SMTP_PROTOCOL)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                              "auth http server %V did not send password",[m
[31m-                              ctx->peer.name);[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            peer = ngx_pcalloc(s->connection->pool, sizeof(ngx_addr_t));[m
[31m-            if (peer == NULL) {[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            rc = ngx_parse_addr(s->connection->pool, peer,[m
[31m-                                ctx->addr.data, ctx->addr.len);[m
[31m-[m
[31m-            switch (rc) {[m
[31m-            case NGX_OK:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_DECLINED:[m
[31m-                ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                              "auth http server %V sent invalid server "[m
[31m-                              "address:\"%V\"",[m
[31m-                              ctx->peer.name, &ctx->addr);[m
[31m-                /* fall through */[m
[31m-[m
[31m-            default:[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            port = ngx_atoi(ctx->port.data, ctx->port.len);[m
[31m-            if (port == NGX_ERROR || port < 1 || port > 65535) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                              "auth http server %V sent invalid server "[m
[31m-                              "port:\"%V\"",[m
[31m-                              ctx->peer.name, &ctx->port);[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            switch (peer->sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                sin6 = (struct sockaddr_in6 *) peer->sockaddr;[m
[31m-                sin6->sin6_port = htons((in_port_t) port);[m
[31m-                break;[m
[31m-#endif[m
[31m-[m
[31m-            default: /* AF_INET */[m
[31m-                sin = (struct sockaddr_in *) peer->sockaddr;[m
[31m-                sin->sin_port = htons((in_port_t) port);[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            len = ctx->addr.len + 1 + ctx->port.len;[m
[31m-[m
[31m-            peer->name.len = len;[m
[31m-[m
[31m-            peer->name.data = ngx_pnalloc(s->connection->pool, len);[m
[31m-            if (peer->name.data == NULL) {[m
[31m-                ngx_destroy_pool(ctx->pool);[m
[31m-                ngx_mail_session_internal_server_error(s);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            len = ctx->addr.len;[m
[31m-[m
[31m-            ngx_memcpy(peer->name.data, ctx->addr.data, len);[m
[31m-[m
[31m-            peer->name.data[len++] = ':';[m
[31m-[m
[31m-            ngx_memcpy(peer->name.data + len, ctx->port.data, ctx->port.len);[m
[31m-[m
[31m-            ngx_destroy_pool(ctx->pool);[m
[31m-            ngx_mail_proxy_init(s, peer);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN ) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_ERROR */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                      "auth http server %V sent invalid header in response",[m
[31m-                      ctx->peer.name);[m
[31m-        ngx_close_connection(ctx->peer.connection);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_sleep_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail auth sleep handler");[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-[m
[31m-        rev->timedout = 0;[m
[31m-[m
[31m-        if (s->auth_wait) {[m
[31m-            s->auth_wait = 0;[m
[31m-            ngx_mail_auth_http_init(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        rev->handler = cscf->protocol->auth_state;[m
[31m-[m
[31m-        s->mail_state = 0;[m
[31m-        s->auth_method = NGX_MAIL_AUTH_PLAIN;[m
[31m-[m
[31m-        c->log->action = "in auth state";[m
[31m-[m
[31m-        ngx_mail_send(c->write);[m
[31m-[m
[31m-        if (c->destroyed) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(rev, cscf->timeout);[m
[31m-[m
[31m-        if (rev->ready) {[m
[31m-            rev->handler(rev);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_auth_http_parse_header_line(ngx_mail_session_t *s,[m
[31m-    ngx_mail_auth_http_ctx_t *ctx)[m
[31m-{[m
[31m-    u_char      c, ch, *p;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_name,[m
[31m-        sw_space_before_value,[m
[31m-        sw_value,[m
[31m-        sw_space_after_value,[m
[31m-        sw_almost_done,[m
[31m-        sw_header_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = ctx->state;[m
[31m-[m
[31m-    for (p = ctx->response->pos; p < ctx->response->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* first char */[m
[31m-        case sw_start:[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_header_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_end = p;[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                state = sw_name;[m
[31m-                ctx->header_name_start = p;[m
[31m-[m
[31m-                c = (u_char) (ch | 0x20);[m
[31m-                if (c >= 'a' && c <= 'z') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (ch >= '0' && ch <= '9') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header name */[m
[31m-        case sw_name:[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'z') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                ctx->header_name_end = p;[m
[31m-                state = sw_space_before_value;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '-') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == CR) {[m
[31m-                ctx->header_name_end = p;[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == LF) {[m
[31m-                ctx->header_name_end = p;[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-[m
[31m-        /* space* before header value */[m
[31m-        case sw_space_before_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_start = p;[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                ctx->header_start = p;[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* header value */[m
[31m-        case sw_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_space_after_value;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                ctx->header_end = p;[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                ctx->header_end = p;[m
[31m-                goto done;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* space* before end of header line */[m
[31m-        case sw_space_after_value:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                state = sw_value;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        /* end of header line */[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        /* end of header */[m
[31m-        case sw_header_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto header_done;[m
[31m-            default:[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->response->pos = p;[m
[31m-    ctx->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-header_done:[m
[31m-[m
[31m-    ctx->response->pos = p + 1;[m
[31m-    ctx->state = sw_start;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_block_read(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_auth_http_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail auth http block read");[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        c = rev->data;[m
[31m-        s = c->data;[m
[31m-[m
[31m-        ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module);[m
[31m-[m
[31m-        ngx_close_connection(ctx->peer.connection);[m
[31m-        ngx_destroy_pool(ctx->pool);[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_auth_http_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, ev->log, 0,[m
[31m-                   "mail auth http dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_buf_t *[m
[31m-ngx_mail_auth_http_create_request(ngx_mail_session_t *s, ngx_pool_t *pool,[m
[31m-    ngx_mail_auth_http_conf_t *ahcf)[m
[31m-{[m
[31m-    size_t                     len;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_str_t                  login, passwd;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_str_t                  verify, subject, issuer, serial, fingerprint,[m
[31m-                               raw_cert, cert;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_ssl_conf_t       *sslcf;[m
[31m-#endif[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (ngx_mail_auth_http_escape(pool, &s->login, &login) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_mail_auth_http_escape(pool, &s->passwd, &passwd) != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    c = s->connection;[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    if (c->ssl && sslcf->verify) {[m
[31m-[m
[31m-        /* certificate details */[m
[31m-[m
[31m-        if (ngx_ssl_get_client_verify(c, pool, &verify) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_get_subject_dn(c, pool, &subject) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_get_issuer_dn(c, pool, &issuer) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_get_serial_number(c, pool, &serial) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_get_fingerprint(c, pool, &fingerprint) != NGX_OK) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ahcf->pass_client_cert) {[m
[31m-[m
[31m-            /* certificate itself, if configured */[m
[31m-[m
[31m-            if (ngx_ssl_get_raw_certificate(c, pool, &raw_cert) != NGX_OK) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_mail_auth_http_escape(pool, &raw_cert, &cert) != NGX_OK) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_str_null(&cert);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_null(&verify);[m
[31m-        ngx_str_null(&subject);[m
[31m-        ngx_str_null(&issuer);[m
[31m-        ngx_str_null(&serial);[m
[31m-        ngx_str_null(&fingerprint);[m
[31m-        ngx_str_null(&cert);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    len = sizeof("GET ") - 1 + ahcf->uri.len + sizeof(" HTTP/1.0" CRLF) - 1[m
[31m-          + sizeof("Host: ") - 1 + ahcf->host_header.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-Method: ") - 1[m
[31m-                + ngx_mail_auth_http_method[s->auth_method].len[m
[31m-                + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-User: ") - 1 + login.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-Pass: ") - 1 + passwd.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-Salt: ") - 1 + s->salt.len[m
[31m-          + sizeof("Auth-Protocol: ") - 1 + cscf->protocol->name.len[m
[31m-                + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-Login-Attempt: ") - 1 + NGX_INT_T_LEN[m
[31m-                + sizeof(CRLF) - 1[m
[31m-          + sizeof("Client-IP: ") - 1 + s->connection->addr_text.len[m
[31m-                + sizeof(CRLF) - 1[m
[31m-          + sizeof("Client-Host: ") - 1 + s->host.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SMTP-Helo: ") - 1 + s->smtp_helo.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SMTP-From: ") - 1 + s->smtp_from.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SMTP-To: ") - 1 + s->smtp_to.len + sizeof(CRLF) - 1[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-          + sizeof("Auth-SSL: on" CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Verify: ") - 1 + verify.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Subject: ") - 1 + subject.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Issuer: ") - 1 + issuer.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Serial: ") - 1 + serial.len + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Fingerprint: ") - 1 + fingerprint.len[m
[31m-              + sizeof(CRLF) - 1[m
[31m-          + sizeof("Auth-SSL-Cert: ") - 1 + cert.len + sizeof(CRLF) - 1[m
[31m-#endif[m
[31m-          + ahcf->header.len[m
[31m-          + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, len);[m
[31m-    if (b == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "GET ", sizeof("GET ") - 1);[m
[31m-    b->last = ngx_copy(b->last, ahcf->uri.data, ahcf->uri.len);[m
[31m-    b->last = ngx_cpymem(b->last, " HTTP/1.0" CRLF,[m
[31m-                         sizeof(" HTTP/1.0" CRLF) - 1);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Host: ", sizeof("Host: ") - 1);[m
[31m-    b->last = ngx_copy(b->last, ahcf->host_header.data,[m
[31m-                         ahcf->host_header.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Auth-Method: ",[m
[31m-                         sizeof("Auth-Method: ") - 1);[m
[31m-    b->last = ngx_cpymem(b->last,[m
[31m-                         ngx_mail_auth_http_method[s->auth_method].data,[m
[31m-                         ngx_mail_auth_http_method[s->auth_method].len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Auth-User: ", sizeof("Auth-User: ") - 1);[m
[31m-    b->last = ngx_copy(b->last, login.data, login.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Auth-Pass: ", sizeof("Auth-Pass: ") - 1);[m
[31m-    b->last = ngx_copy(b->last, passwd.data, passwd.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (s->auth_method != NGX_MAIL_AUTH_PLAIN && s->salt.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-Salt: ", sizeof("Auth-Salt: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->salt.data, s->salt.len);[m
[31m-[m
[31m-        s->passwd.data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Auth-Protocol: ",[m
[31m-                         sizeof("Auth-Protocol: ") - 1);[m
[31m-    b->last = ngx_cpymem(b->last, cscf->protocol->name.data,[m
[31m-                         cscf->protocol->name.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    b->last = ngx_sprintf(b->last, "Auth-Login-Attempt: %ui" CRLF,[m
[31m-                          s->login_attempt);[m
[31m-[m
[31m-    b->last = ngx_cpymem(b->last, "Client-IP: ", sizeof("Client-IP: ") - 1);[m
[31m-    b->last = ngx_copy(b->last, s->connection->addr_text.data,[m
[31m-                       s->connection->addr_text.len);[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    if (s->host.len) {[m
[31m-        b->last = ngx_cpymem(b->last, "Client-Host: ",[m
[31m-                             sizeof("Client-Host: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->host.data, s->host.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (s->auth_method == NGX_MAIL_AUTH_NONE) {[m
[31m-[m
[31m-        /* HELO, MAIL FROM, and RCPT TO can't contain CRLF, no need to escape */[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-SMTP-Helo: ",[m
[31m-                             sizeof("Auth-SMTP-Helo: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->smtp_helo.data, s->smtp_helo.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-SMTP-From: ",[m
[31m-                             sizeof("Auth-SMTP-From: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->smtp_from.data, s->smtp_from.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-SMTP-To: ",[m
[31m-                             sizeof("Auth-SMTP-To: ") - 1);[m
[31m-        b->last = ngx_copy(b->last, s->smtp_to.data, s->smtp_to.len);[m
[31m-        *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        b->last = ngx_cpymem(b->last, "Auth-SSL: on" CRLF,[m
[31m-                             sizeof("Auth-SSL: on" CRLF) - 1);[m
[31m-[m
[31m-        if (verify.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Verify: ",[m
[31m-                                 sizeof("Auth-SSL-Verify: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, verify.data, verify.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (subject.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Subject: ",[m
[31m-                                 sizeof("Auth-SSL-Subject: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, subject.data, subject.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (issuer.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Issuer: ",[m
[31m-                                 sizeof("Auth-SSL-Issuer: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, issuer.data, issuer.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (serial.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Serial: ",[m
[31m-                                 sizeof("Auth-SSL-Serial: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, serial.data, serial.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (fingerprint.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Fingerprint: ",[m
[31m-                                 sizeof("Auth-SSL-Fingerprint: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, fingerprint.data, fingerprint.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-[m
[31m-        if (cert.len) {[m
[31m-            b->last = ngx_cpymem(b->last, "Auth-SSL-Cert: ",[m
[31m-                                 sizeof("Auth-SSL-Cert: ") - 1);[m
[31m-            b->last = ngx_copy(b->last, cert.data, cert.len);[m
[31m-            *b->last++ = CR; *b->last++ = LF;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ahcf->header.len) {[m
[31m-        b->last = ngx_copy(b->last, ahcf->header.data, ahcf->header.len);[m
[31m-    }[m
[31m-[m
[31m-    /* add "\r\n" at the header end */[m
[31m-    *b->last++ = CR; *b->last++ = LF;[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                   "mail auth http header:%N\"%*s\"",[m
[31m-                   (size_t) (b->last - b->pos), b->pos);[m
[31m-#endif[m
[31m-[m
[31m-    return b;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text, ngx_str_t *escaped)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    uintptr_t   n;[m
[31m-[m
[31m-    n = ngx_escape_uri(NULL, text->data, text->len, NGX_ESCAPE_MAIL_AUTH);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        *escaped = *text;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    escaped->len = text->len + n * 2;[m
[31m-[m
[31m-    p = ngx_pnalloc(pool, escaped->len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_escape_uri(p, text->data, text->len, NGX_ESCAPE_MAIL_AUTH);[m
[31m-[m
[31m-    escaped->data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_auth_http_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_auth_http_conf_t  *ahcf;[m
[31m-[m
[31m-    ahcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_auth_http_conf_t));[m
[31m-    if (ahcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ahcf->timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    ahcf->pass_client_cert = NGX_CONF_UNSET;[m
[31m-[m
[31m-    ahcf->file = cf->conf_file->file.name.data;[m
[31m-    ahcf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return ahcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_auth_http_conf_t *prev = parent;[m
[31m-    ngx_mail_auth_http_conf_t *conf = child;[m
[31m-[m
[31m-    u_char           *p;[m
[31m-    size_t            len;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_table_elt_t  *header;[m
[31m-[m
[31m-    if (conf->peer == NULL) {[m
[31m-        conf->peer = prev->peer;[m
[31m-        conf->host_header = prev->host_header;[m
[31m-        conf->uri = prev->uri;[m
[31m-[m
[31m-        if (conf->peer == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"auth_http\" is defined for server in %s:%ui",[m
[31m-                          conf->file, conf->line);[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->pass_client_cert, prev->pass_client_cert, 0);[m
[31m-[m
[31m-    if (conf->headers == NULL) {[m
[31m-        conf->headers = prev->headers;[m
[31m-        conf->header = prev->header;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->headers && conf->header.len == 0) {[m
[31m-        len = 0;[m
[31m-        header = conf->headers->elts;[m
[31m-        for (i = 0; i < conf->headers->nelts; i++) {[m
[31m-            len += header[i].key.len + 2 + header[i].value.len + 2;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        conf->header.len = len;[m
[31m-        conf->header.data = p;[m
[31m-[m
[31m-        for (i = 0; i < conf->headers->nelts; i++) {[m
[31m-            p = ngx_cpymem(p, header[i].key.data, header[i].key.len);[m
[31m-            *p++ = ':'; *p++ = ' ';[m
[31m-            p = ngx_cpymem(p, header[i].value.data, header[i].value.len);[m
[31m-            *p++ = CR; *p++ = LF;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_auth_http_conf_t *ahcf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-    ngx_url_t   u;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = 80;[m
[31m-    u.uri_part = 1;[m
[31m-[m
[31m-    if (ngx_strncmp(u.url.data, "http://", 7) == 0) {[m
[31m-        u.url.len -= 7;[m
[31m-        u.url.data += 7;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in auth_http \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ahcf->peer = u.addrs;[m
[31m-[m
[31m-    if (u.family != AF_UNIX) {[m
[31m-        ahcf->host_header = u.host;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&ahcf->host_header, "localhost");[m
[31m-    }[m
[31m-[m
[31m-    ahcf->uri = u.uri;[m
[31m-[m
[31m-    if (ahcf->uri.len == 0) {[m
[31m-        ngx_str_set(&ahcf->uri, "/");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_auth_http_conf_t *ahcf = conf;[m
[31m-[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_table_elt_t  *header;[m
[31m-[m
[31m-    if (ahcf->headers == NULL) {[m
[31m-        ahcf->headers = ngx_array_create(cf->pool, 1, sizeof(ngx_table_elt_t));[m
[31m-        if (ahcf->headers == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    header = ngx_array_push(ahcf->headers);[m
[31m-    if (header == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    header->key = value[1];[m
[31m-    header->value = value[2];[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_core_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_core_module.c[m
[1mdeleted file mode 100644[m
[1mindex 8ea8ea9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_core_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,679 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_core_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_mail_core_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_mail_core_server,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("listen"),[m
[31m-      NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_core_listen,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("protocol"),[m
[31m-      NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_mail_core_protocol,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_core_srv_conf_t, timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server_name"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_core_srv_conf_t, server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_core_error_log,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_core_resolver,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("resolver_timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_core_srv_conf_t, resolver_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_core_module_ctx = {[m
[31m-    NULL,                                  /* protocol */[m
[31m-[m
[31m-    ngx_mail_core_create_main_conf,        /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_core_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_mail_core_merge_srv_conf           /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_core_module_ctx,             /* module context */[m
[31m-    ngx_mail_core_commands,                /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_core_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_main_conf_t));[m
[31m-    if (cmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->servers, cf->pool, 4,[m
[31m-                       sizeof(ngx_mail_core_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_mail_listen_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return cmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_core_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_srv_conf_t));[m
[31m-    if (cscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     cscf->protocol = NULL;[m
[31m-     *     cscf->error_log = NULL;[m
[31m-     */[m
[31m-[m
[31m-    cscf->timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    cscf->resolver_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    cscf->resolver = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    cscf->file_name = cf->conf_file->file.name.data;[m
[31m-    cscf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return cscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t *prev = parent;[m
[31m-    ngx_mail_core_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000);[m
[31m-    ngx_conf_merge_msec_value(conf->resolver_timeout, prev->resolver_timeout,[m
[31m-                              30000);[m
[31m-[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->server_name, prev->server_name, "");[m
[31m-[m
[31m-    if (conf->server_name.len == 0) {[m
[31m-        conf->server_name = cf->cycle->hostname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->protocol == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "unknown mail protocol for server in %s:%ui",[m
[31m-                      conf->file_name, conf->line);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->error_log == NULL) {[m
[31m-        if (prev->error_log) {[m
[31m-            conf->error_log = prev->error_log;[m
[31m-        } else {[m
[31m-            conf->error_log = &cf->cycle->new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->resolver, prev->resolver, NULL);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                       *rv;[m
[31m-    void                       *mconf;[m
[31m-    ngx_uint_t                  m;[m
[31m-    ngx_conf_t                  pcf;[m
[31m-    ngx_mail_module_t          *module;[m
[31m-    ngx_mail_conf_ctx_t        *ctx, *mail_ctx;[m
[31m-    ngx_mail_core_srv_conf_t   *cscf, **cscfp;[m
[31m-    ngx_mail_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    mail_ctx = cf->ctx;[m
[31m-    ctx->main_conf = mail_ctx->main_conf;[m
[31m-[m
[31m-    /* the server{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the server configuration context */[m
[31m-[m
[31m-    cscf = ctx->srv_conf[ngx_mail_core_module.ctx_index];[m
[31m-    cscf->ctx = ctx;[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index];[m
[31m-[m
[31m-    cscfp = ngx_array_push(&cmcf->servers);[m
[31m-    if (cscfp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *cscfp = cscf;[m
[31m-[m
[31m-[m
[31m-    /* parse inside server{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_MAIL_SRV_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    size_t                      len, off;[m
[31m-    in_port_t                   port;[m
[31m-    ngx_str_t                  *value;[m
[31m-    ngx_url_t                   u;[m
[31m-    ngx_uint_t                  i, m;[m
[31m-    struct sockaddr            *sa;[m
[31m-    ngx_mail_listen_t          *ls;[m
[31m-    ngx_mail_module_t          *module;[m
[31m-    struct sockaddr_in         *sin;[m
[31m-    ngx_mail_core_main_conf_t  *cmcf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6        *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.listen = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in \"%V\" of the \"listen\" directive",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_mail_conf_get_module_main_conf(cf, ngx_mail_core_module);[m
[31m-[m
[31m-    ls = cmcf->listen.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->listen.nelts; i++) {[m
[31m-[m
[31m-        sa = &ls[i].u.sockaddr;[m
[31m-[m
[31m-        if (sa->sa_family != u.family) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            off = offsetof(struct sockaddr_in6, sin6_addr);[m
[31m-            len = 16;[m
[31m-            sin6 = &ls[i].u.sockaddr_in6;[m
[31m-            port = ntohs(sin6->sin6_port);[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            off = offsetof(struct sockaddr_un, sun_path);[m
[31m-            len = sizeof(((struct sockaddr_un *) sa)->sun_path);[m
[31m-            port = 0;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            off = offsetof(struct sockaddr_in, sin_addr);[m
[31m-            len = 4;[m
[31m-            sin = &ls[i].u.sockaddr_in;[m
[31m-            port = ntohs(sin->sin_port);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_memcmp(ls[i].u.sockaddr_data + off, u.sockaddr + off, len)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (port != u.port) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate \"%V\" address and port pair", &u.url);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ls = ngx_array_push(&cmcf->listen);[m
[31m-    if (ls == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(ls, sizeof(ngx_mail_listen_t));[m
[31m-[m
[31m-    ngx_memcpy(&ls->u.sockaddr, u.sockaddr, u.socklen);[m
[31m-[m
[31m-    ls->socklen = u.socklen;[m
[31m-    ls->backlog = NGX_LISTEN_BACKLOG;[m
[31m-    ls->wildcard = u.wildcard;[m
[31m-    ls->ctx = cf->ctx;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    ls->ipv6only = 1;[m
[31m-#endif[m
[31m-[m
[31m-    if (cscf->protocol == NULL) {[m
[31m-        for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-            if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-            if (module->protocol == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (i = 0; module->protocol->port[i]; i++) {[m
[31m-                if (module->protocol->port[i] == u.port) {[m
[31m-                    cscf->protocol = module->protocol;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "bind") == 0) {[m
[31m-            ls->bind = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) {[m
[31m-            ls->backlog = ngx_atoi(value[i].data + 8, value[i].len - 8);[m
[31m-            ls->bind = 1;[m
[31m-[m
[31m-            if (ls->backlog == NGX_ERROR || ls->backlog == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid backlog \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) {[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            u_char  buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-            sa = &ls->u.sockaddr;[m
[31m-[m
[31m-            if (sa->sa_family == AF_INET6) {[m
[31m-[m
[31m-                if (ngx_strcmp(&value[i].data[10], "n") == 0) {[m
[31m-                    ls->ipv6only = 1;[m
[31m-[m
[31m-                } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) {[m
[31m-                    ls->ipv6only = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid ipv6only flags \"%s\"",[m
[31m-                                       &value[i].data[9]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ls->bind = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                len = ngx_sock_ntop(sa, ls->socklen, buf,[m
[31m-                                    NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "ipv6only is not supported "[m
[31m-                                   "on addr \"%*s\", ignored", len, buf);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "bind ipv6only is not supported "[m
[31m-                               "on this platform");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "ssl") == 0) {[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-            ls->ssl = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"ssl\" parameter requires "[m
[31m-                               "ngx_mail_ssl_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[i].data[13], "on") == 0) {[m
[31m-                ls->so_keepalive = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[i].data[13], "off") == 0) {[m
[31m-                ls->so_keepalive = 2;[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-                u_char     *p, *end;[m
[31m-                ngx_str_t   s;[m
[31m-[m
[31m-                end = value[i].data + value[i].len;[m
[31m-                s.data = value[i].data + 13;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepidle = ngx_parse_time(&s, 1);[m
[31m-                    if (ls->tcp_keepidle == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepintvl = ngx_parse_time(&s, 1);[m
[31m-                    if (ls->tcp_keepintvl == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                if (s.data < end) {[m
[31m-                    s.len = end - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepcnt = ngx_atoi(s.data, s.len);[m
[31m-                    if (ls->tcp_keepcnt == NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0[m
[31m-                    && ls->tcp_keepcnt == 0)[m
[31m-                {[m
[31m-                    goto invalid_so_keepalive;[m
[31m-                }[m
[31m-[m
[31m-                ls->so_keepalive = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"so_keepalive\" parameter accepts "[m
[31m-                                   "only \"on\" or \"off\" on this platform");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            ls->bind = 1;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-        invalid_so_keepalive:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid so_keepalive value: \"%s\"",[m
[31m-                               &value[i].data[13]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the invalid \"%V\" parameter", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    ngx_str_t          *value;[m
[31m-    ngx_uint_t          m;[m
[31m-    ngx_mail_module_t  *module;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->protocol[m
[31m-            && ngx_strcmp(module->protocol->name.data, value[1].data) == 0)[m
[31m-        {[m
[31m-            cscf->protocol = module->protocol;[m
[31m-[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "unknown protocol \"%V\"", &value[1]);[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &cscf->error_log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (cscf->resolver != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        cscf->resolver = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    cscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);[m
[31m-    if (cscf->resolver == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t    *c, *value;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_array_t  *a;[m
[31m-[m
[31m-    a = (ngx_array_t *) (p + cmd->offset);[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-        c = ngx_array_push(a);[m
[31m-        if (c == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *c = value[i];[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 901bb8f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,866 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_mail_init_session(ngx_connection_t *c);[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-static void ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c);[m
[31m-static void ngx_mail_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_verify_cert(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_init_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    size_t                     len;[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_mail_port_t           *port;[m
[31m-    struct sockaddr           *sa;[m
[31m-    struct sockaddr_in        *sin;[m
[31m-    ngx_mail_log_ctx_t        *ctx;[m
[31m-    ngx_mail_in_addr_t        *addr;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_addr_conf_t      *addr_conf;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    u_char                     text[NGX_SOCKADDR_STRLEN];[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6       *sin6;[m
[31m-    ngx_mail_in6_addr_t       *addr6;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-    /* find the server configuration for the address:port */[m
[31m-[m
[31m-    port = c->listening->servers;[m
[31m-[m
[31m-    if (port->naddrs > 1) {[m
[31m-[m
[31m-        /*[m
[31m-         * There are several addresses on this port and one of them[m
[31m-         * is the "*:port" wildcard so getsockname() is needed to determine[m
[31m-         * the server address.[m
[31m-         *[m
[31m-         * AcceptEx() already gave this address.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sa = c->local_sockaddr;[m
[31m-[m
[31m-        switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) sa;[m
[31m-[m
[31m-            addr6 = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            addr_conf = &addr6[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) sa;[m
[31m-[m
[31m-            addr = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (addr[i].addr == sin->sin_addr.s_addr) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            addr_conf = &addr[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            addr6 = port->addrs;[m
[31m-            addr_conf = &addr6[0].conf;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            addr = port->addrs;[m
[31m-            addr_conf = &addr[0].conf;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = ngx_pcalloc(c->pool, sizeof(ngx_mail_session_t));[m
[31m-    if (s == NULL) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->signature = NGX_MAIL_MODULE;[m
[31m-[m
[31m-    s->main_conf = addr_conf->ctx->main_conf;[m
[31m-    s->srv_conf = addr_conf->ctx->srv_conf;[m
[31m-[m
[31m-    s->addr_text = &addr_conf->addr_text;[m
[31m-[m
[31m-    c->data = s;[m
[31m-    s->connection = c;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(c, cscf->error_log);[m
[31m-[m
[31m-    len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA client %*s connected to %V",[m
[31m-                  c->number, len, text, s->addr_text);[m
[31m-[m
[31m-    ctx = ngx_palloc(c->pool, sizeof(ngx_mail_log_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->client = &c->addr_text;[m
[31m-    ctx->session = s;[m
[31m-[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->handler = ngx_mail_log_error;[m
[31m-    c->log->data = ctx;[m
[31m-    c->log->action = "sending client greeting line";[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    {[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    if (sslcf->enable) {[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        ngx_mail_ssl_init_connection(&sslcf->ssl, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (addr_conf->ssl) {[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (sslcf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined "[m
[31m-                          "in server listening on SSL port");[m
[31m-            ngx_mail_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_mail_ssl_init_connection(&sslcf->ssl, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_mail_init_session(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-void[m
[31m-ngx_mail_starttls_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t     *c;[m
[31m-    ngx_mail_session_t   *s;[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-    s->starttls = 1;[m
[31m-[m
[31m-    c->log->action = "in starttls state";[m
[31m-[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    ngx_mail_ssl_init_connection(&sslcf->ssl, c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(ssl, c, 0) == NGX_ERROR) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_handshake(c) == NGX_AGAIN) {[m
[31m-[m
[31m-        s = c->data;[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        ngx_add_timer(c->read, cscf->timeout);[m
[31m-[m
[31m-        c->ssl->handler = ngx_mail_ssl_handshake_handler;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_ssl_handshake_handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        s = c->data;[m
[31m-[m
[31m-        if (ngx_mail_verify_cert(s, c) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (s->starttls) {[m
[31m-            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-            c->read->handler = cscf->protocol->init_protocol;[m
[31m-            c->write->handler = ngx_mail_send;[m
[31m-[m
[31m-            cscf->protocol->init_protocol(c->read);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->read->ready = 0;[m
[31m-[m
[31m-        ngx_mail_init_session(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_verify_cert(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    long                       rc;[m
[31m-    X509                      *cert;[m
[31m-    ngx_mail_ssl_conf_t       *sslcf;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    if (!sslcf->verify) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-    if (rc != X509_V_OK[m
[31m-        && (sslcf->verify != 3 || !ngx_ssl_verify_error_optional(rc)))[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client SSL certificate verify error: (%l:%s)",[m
[31m-                      rc, X509_verify_cert_error_string(rc));[m
[31m-[m
[31m-        ngx_ssl_remove_cached_session(sslcf->ssl.ctx,[m
[31m-                                      (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        s->out = cscf->protocol->cert_error;[m
[31m-        s->quit = 1;[m
[31m-[m
[31m-        c->write->handler = ngx_mail_send;[m
[31m-[m
[31m-        ngx_mail_send(s->connection->write);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sslcf->verify == 1) {[m
[31m-        cert = SSL_get_peer_certificate(c->ssl->connection);[m
[31m-[m
[31m-        if (cert == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "client sent no required SSL certificate");[m
[31m-[m
[31m-            ngx_ssl_remove_cached_session(sslcf->ssl.ctx,[m
[31m-                                       (SSL_get0_session(c->ssl->connection)));[m
[31m-[m
[31m-            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-            s->out = cscf->protocol->no_cert;[m
[31m-            s->quit = 1;[m
[31m-[m
[31m-            c->write->handler = ngx_mail_send;[m
[31m-[m
[31m-            ngx_mail_send(s->connection->write);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        X509_free(cert);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_init_session(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    s = c->data;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    s->protocol = cscf->protocol->type;[m
[31m-[m
[31m-    s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_mail_max_module);[m
[31m-    if (s->ctx == NULL) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_mail_send;[m
[31m-[m
[31m-    cscf->protocol->init_session(s, c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_mail_core_srv_conf_t *cscf)[m
[31m-{[m
[31m-    s->salt.data = ngx_pnalloc(c->pool,[m
[31m-                               sizeof(" <18446744073709551616.@>" CRLF) - 1[m
[31m-                               + NGX_TIME_T_LEN[m
[31m-                               + cscf->server_name.len);[m
[31m-    if (s->salt.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->salt.len = ngx_sprintf(s->salt.data, "<%ul.%T@%V>" CRLF,[m
[31m-                              ngx_random(), ngx_time(), &cscf->server_name)[m
[31m-                  - s->salt.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-    if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, ngx_uint_t n)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t  *arg, plain;[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth plain: \"%V\"", &arg[n]);[m
[31m-#endif[m
[31m-[m
[31m-    plain.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len));[m
[31m-    if (plain.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&plain, &arg[n]) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid base64 encoding in AUTH PLAIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    p = plain.data;[m
[31m-    last = p + plain.len;[m
[31m-[m
[31m-    while (p < last && *p++) { /* void */ }[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent invalid login in AUTH PLAIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    s->login.data = p;[m
[31m-[m
[31m-    while (p < last && *p) { p++; }[m
[31m-[m
[31m-    if (p == last) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent invalid password in AUTH PLAIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    s->login.len = p++ - s->login.data;[m
[31m-[m
[31m-    s->passwd.len = last - p;[m
[31m-    s->passwd.data = p;[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth plain: \"%V\" \"%V\"", &s->login, &s->passwd);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_login_username(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth login username: \"%V\"", &arg[n]);[m
[31m-[m
[31m-    s->login.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len));[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&s->login, &arg[n]) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid base64 encoding in AUTH LOGIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth login username: \"%V\"", &s->login);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_login_password(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth login password: \"%V\"", &arg[0]);[m
[31m-#endif[m
[31m-[m
[31m-    s->passwd.data = ngx_pnalloc(c->pool,[m
[31m-                                 ngx_base64_decoded_length(arg[0].len));[m
[31m-    if (s->passwd.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&s->passwd, &arg[0]) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid base64 encoding in AUTH LOGIN command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth login password: \"%V\"", &s->passwd);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    char *prefix, size_t len)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    ngx_str_t    salt;[m
[31m-    ngx_uint_t   n;[m
[31m-[m
[31m-    p = ngx_pnalloc(c->pool, len + ngx_base64_encoded_length(s->salt.len) + 2);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    salt.data = ngx_cpymem(p, prefix, len);[m
[31m-    s->salt.len -= 2;[m
[31m-[m
[31m-    ngx_encode_base64(&salt, &s->salt);[m
[31m-[m
[31m-    s->salt.len += 2;[m
[31m-    n = len + salt.len;[m
[31m-    p[n++] = CR; p[n++] = LF;[m
[31m-[m
[31m-    s->out.len = n;[m
[31m-    s->out.data = p;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    u_char     *p, *last;[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth cram-md5: \"%V\"", &arg[0]);[m
[31m-[m
[31m-    s->login.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[0].len));[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid base64 encoding in AUTH CRAM-MD5 command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    p = s->login.data;[m
[31m-    last = p + s->login.len;[m
[31m-[m
[31m-    while (p < last) {[m
[31m-        if (*p++ == ' ') {[m
[31m-            s->login.len = p - s->login.data - 1;[m
[31m-            s->passwd.len = last - p;[m
[31m-            s->passwd.data = p;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (s->passwd.len != 32) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-            "client sent invalid CRAM-MD5 hash in AUTH CRAM-MD5 command");[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "mail auth cram-md5: \"%V\" \"%V\"", &s->login, &s->passwd);[m
[31m-[m
[31m-    s->auth_method = NGX_MAIL_AUTH_CRAM_MD5;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_send(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_int_t                  n;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = wev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (wev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len == 0) {[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    n = c->send(c, s->out.data, s->out.len);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        s->out.data += n;[m
[31m-        s->out.len -= n;[m
[31m-[m
[31m-        if (s->out.len != 0) {[m
[31m-            goto again;[m
[31m-        }[m
[31m-[m
[31m-        if (wev->timer_set) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-[m
[31m-        if (s->quit) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (s->blocked) {[m
[31m-            c->read->handler(c->read);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* n == NGX_AGAIN */[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    ngx_add_timer(c->write, cscf->timeout);[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_str_t                  l;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == 0) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        s->buffer->last += n;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (s->buffer->pos == s->buffer->last) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    rc = cscf->protocol->parse_command(s);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-        if (s->buffer->last < s->buffer->end) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        l.len = s->buffer->last - s->buffer->start;[m
[31m-        l.data = s->buffer->start;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "client sent too long command \"%V\"", &l);[m
[31m-[m
[31m-        s->quit = 1;[m
[31m-[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_IMAP_NEXT || rc == NGX_MAIL_PARSE_INVALID_COMMAND) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    s->args.nelts = 0;[m
[31m-[m
[31m-    if (s->buffer->pos == s->buffer->last) {[m
[31m-        s->buffer->pos = s->buffer->start;[m
[31m-        s->buffer->last = s->buffer->start;[m
[31m-    }[m
[31m-[m
[31m-    s->state = 0;[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    s->login_attempt++;[m
[31m-[m
[31m-    ngx_mail_auth_http_init(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_session_internal_server_error(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    s->out = cscf->protocol->internal_server_error;[m
[31m-    s->quit = 1;[m
[31m-[m
[31m-    ngx_mail_send(s->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "close mail connection: %d", c->fd);[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_mail_close_connection;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-    ngx_mail_log_ctx_t  *ctx;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    ctx = log->data;[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", client: %V", ctx->client);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    s = ctx->session;[m
[31m-[m
[31m-    if (s == NULL) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, "%s, server: %V",[m
[31m-                     s->starttls ? " using starttls" : "",[m
[31m-                     s->addr_text);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (s->login.len == 0) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", login: \"%V\"", &s->login);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (s->proxy == NULL) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", upstream: %V", s->proxy->upstream.name);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 57e2fb7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,457 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_imap_module.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_mail_imap_login(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_imap_authenticate(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_imap_capability(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_imap_starttls(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-static u_char  imap_greeting[] = "* OK IMAP4 ready" CRLF;[m
[31m-static u_char  imap_star[] = "* ";[m
[31m-static u_char  imap_ok[] = "OK completed" CRLF;[m
[31m-static u_char  imap_next[] = "+ OK" CRLF;[m
[31m-static u_char  imap_plain_next[] = "+ " CRLF;[m
[31m-static u_char  imap_username[] = "+ VXNlcm5hbWU6" CRLF;[m
[31m-static u_char  imap_password[] = "+ UGFzc3dvcmQ6" CRLF;[m
[31m-static u_char  imap_bye[] = "* BYE" CRLF;[m
[31m-static u_char  imap_invalid_command[] = "BAD invalid command" CRLF;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    ngx_str_set(&s->out, imap_greeting);[m
[31m-[m
[31m-    c->read->handler = ngx_mail_imap_init_protocol;[m
[31m-[m
[31m-    ngx_add_timer(c->read, cscf->timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_imap_init_protocol(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_imap_srv_conf_t  *iscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->log->action = "in auth state";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (s->buffer == NULL) {[m
[31m-        if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t))[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);[m
[31m-[m
[31m-        s->buffer = ngx_create_temp_buf(c->pool, iscf->client_buffer_size);[m
[31m-        if (s->buffer == NULL) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->mail_state = ngx_imap_start;[m
[31m-    c->read->handler = ngx_mail_imap_auth_state;[m
[31m-[m
[31m-    ngx_mail_imap_auth_state(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_imap_auth_state(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char              *p, *dst, *src, *end;[m
[31m-    ngx_str_t           *arg;[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_uint_t           tag, i;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth state");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap send handler busy");[m
[31m-        s->blocked = 1;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->blocked = 0;[m
[31m-[m
[31m-    rc = ngx_mail_read_command(s, c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    tag = 1;[m
[31m-    s->text.len = 0;[m
[31m-    ngx_str_set(&s->out, imap_ok);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth command: %i",[m
[31m-                       s->command);[m
[31m-[m
[31m-        if (s->backslash) {[m
[31m-[m
[31m-            arg = s->args.elts;[m
[31m-[m
[31m-            for (i = 0; i < s->args.nelts; i++) {[m
[31m-                dst = arg[i].data;[m
[31m-                end = dst + arg[i].len;[m
[31m-[m
[31m-                for (src = dst; src < end; dst++) {[m
[31m-                    *dst = *src;[m
[31m-                    if (*src++ == '\\') {[m
[31m-                        *dst = *src++;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                arg[i].len = dst - arg[i].data;[m
[31m-            }[m
[31m-[m
[31m-            s->backslash = 0;[m
[31m-        }[m
[31m-[m
[31m-        switch (s->mail_state) {[m
[31m-[m
[31m-        case ngx_imap_start:[m
[31m-[m
[31m-            switch (s->command) {[m
[31m-[m
[31m-            case NGX_IMAP_LOGIN:[m
[31m-                rc = ngx_mail_imap_login(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_AUTHENTICATE:[m
[31m-                rc = ngx_mail_imap_authenticate(s, c);[m
[31m-                tag = (rc != NGX_OK);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_CAPABILITY:[m
[31m-                rc = ngx_mail_imap_capability(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_LOGOUT:[m
[31m-                s->quit = 1;[m
[31m-                ngx_str_set(&s->text, imap_bye);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_NOOP:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_IMAP_STARTTLS:[m
[31m-                rc = ngx_mail_imap_starttls(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                rc = NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_auth_login_username:[m
[31m-            rc = ngx_mail_auth_login_username(s, c, 0);[m
[31m-[m
[31m-            tag = 0;[m
[31m-            ngx_str_set(&s->out, imap_password);[m
[31m-            s->mail_state = ngx_imap_auth_login_password;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_auth_login_password:[m
[31m-            rc = ngx_mail_auth_login_password(s, c);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_auth_plain:[m
[31m-            rc = ngx_mail_auth_plain(s, c, 0);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_auth_cram_md5:[m
[31m-            rc = ngx_mail_auth_cram_md5(s, c);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else if (rc == NGX_IMAP_NEXT) {[m
[31m-        tag = 0;[m
[31m-        ngx_str_set(&s->out, imap_next);[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_DONE:[m
[31m-        ngx_mail_auth(s, c);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_MAIL_PARSE_INVALID_COMMAND:[m
[31m-        s->state = 0;[m
[31m-        ngx_str_set(&s->out, imap_invalid_command);[m
[31m-        s->mail_state = ngx_imap_start;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (tag) {[m
[31m-        if (s->tag.len == 0) {[m
[31m-            ngx_str_set(&s->tag, imap_star);[m
[31m-        }[m
[31m-[m
[31m-        if (s->tagged_line.len < s->tag.len + s->text.len + s->out.len) {[m
[31m-            s->tagged_line.len = s->tag.len + s->text.len + s->out.len;[m
[31m-            s->tagged_line.data = ngx_pnalloc(c->pool, s->tagged_line.len);[m
[31m-            if (s->tagged_line.data == NULL) {[m
[31m-                ngx_mail_close_connection(c);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        p = s->tagged_line.data;[m
[31m-[m
[31m-        if (s->text.len) {[m
[31m-            p = ngx_cpymem(p, s->text.data, s->text.len);[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, s->tag.data, s->tag.len);[m
[31m-        ngx_memcpy(p, s->out.data, s->out.len);[m
[31m-[m
[31m-        s->out.len = s->text.len + s->tag.len + s->out.len;[m
[31m-        s->out.data = s->tagged_line.data;[m
[31m-    }[m
[31m-[m
[31m-    if (rc != NGX_IMAP_NEXT) {[m
[31m-        s->args.nelts = 0;[m
[31m-[m
[31m-        if (s->state) {[m
[31m-            /* preserve tag */[m
[31m-            s->arg_start = s->buffer->start + s->tag.len;[m
[31m-            s->buffer->pos = s->arg_start;[m
[31m-            s->buffer->last = s->arg_start;[m
[31m-[m
[31m-        } else {[m
[31m-            s->buffer->pos = s->buffer->start;[m
[31m-            s->buffer->last = s->buffer->start;[m
[31m-            s->tag.len = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    if (s->args.nelts != 2 || arg[0].len == 0) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    s->login.len = arg[0].len;[m
[31m-    s->login.data = ngx_pnalloc(c->pool, s->login.len);[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->login.data, arg[0].data, s->login.len);[m
[31m-[m
[31m-    s->passwd.len = arg[1].len;[m
[31m-    s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);[m
[31m-    if (s->passwd.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "imap login:\"%V\" passwd:\"%V\"",[m
[31m-                   &s->login, &s->passwd);[m
[31m-#else[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "imap login:\"%V\"", &s->login);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_imap_srv_conf_t  *iscf;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_mail_auth_parse(s, c);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, imap_username);[m
[31m-        s->mail_state = ngx_imap_auth_login_username;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN_USERNAME:[m
[31m-[m
[31m-        ngx_str_set(&s->out, imap_password);[m
[31m-        s->mail_state = ngx_imap_auth_login_password;[m
[31m-[m
[31m-        return ngx_mail_auth_login_username(s, c, 1);[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_PLAIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, imap_plain_next);[m
[31m-        s->mail_state = ngx_imap_auth_plain;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_CRAM_MD5:[m
[31m-[m
[31m-        iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);[m
[31m-[m
[31m-        if (!(iscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (s->salt.data == NULL) {[m
[31m-            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-            if (ngx_mail_salt(s, c, cscf) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) {[m
[31m-            s->mail_state = ngx_imap_auth_cram_md5;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_imap_srv_conf_t  *iscf;[m
[31m-[m
[31m-    iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module);[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    if (c->ssl == NULL) {[m
[31m-        ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-        if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {[m
[31m-            s->text = iscf->starttls_capability;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {[m
[31m-            s->text = iscf->starttls_only_capability;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    s->text = iscf->capability;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_imap_starttls(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (c->ssl == NULL) {[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-        if (sslcf->starttls) {[m
[31m-            c->read->handler = ngx_mail_starttls_handler;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_module.c[m
[1mdeleted file mode 100644[m
[1mindex d281070..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,255 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_imap_module.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_imap_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_imap_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_imap_default_capabilities[] = {[m
[31m-    ngx_string("IMAP4"),[m
[31m-    ngx_string("IMAP4rev1"),[m
[31m-    ngx_string("UIDPLUS"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_mail_imap_auth_methods[] = {[m
[31m-    { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },[m
[31m-    { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },[m
[31m-    { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_imap_auth_methods_names[] = {[m
[31m-    ngx_string("AUTH=PLAIN"),[m
[31m-    ngx_string("AUTH=LOGIN"),[m
[31m-    ngx_null_string,  /* APOP */[m
[31m-    ngx_string("AUTH=CRAM-MD5"),[m
[31m-    ngx_null_string   /* NONE */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_protocol_t  ngx_mail_imap_protocol = {[m
[31m-    ngx_string("imap"),[m
[31m-    { 143, 993, 0, 0 },[m
[31m-    NGX_MAIL_IMAP_PROTOCOL,[m
[31m-[m
[31m-    ngx_mail_imap_init_session,[m
[31m-    ngx_mail_imap_init_protocol,[m
[31m-    ngx_mail_imap_parse_command,[m
[31m-    ngx_mail_imap_auth_state,[m
[31m-[m
[31m-    ngx_string("* BAD internal server error" CRLF),[m
[31m-    ngx_string("* BYE SSL certificate error" CRLF),[m
[31m-    ngx_string("* BYE No required SSL certificate" CRLF)[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_imap_commands[] = {[m
[31m-[m
[31m-    { ngx_string("imap_client_buffer"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_imap_srv_conf_t, client_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("imap_capabilities"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_capabilities,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_imap_srv_conf_t, capabilities),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("imap_auth"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_imap_srv_conf_t, auth_methods),[m
[31m-      &ngx_mail_imap_auth_methods },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_imap_module_ctx = {[m
[31m-    &ngx_mail_imap_protocol,               /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_imap_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_mail_imap_merge_srv_conf           /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_imap_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_imap_module_ctx,             /* module context */[m
[31m-    ngx_mail_imap_commands,                /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_imap_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_imap_srv_conf_t  *iscf;[m
[31m-[m
[31m-    iscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_imap_srv_conf_t));[m
[31m-    if (iscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    iscf->client_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-[m
[31m-    if (ngx_array_init(&iscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return iscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_imap_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_imap_srv_conf_t *prev = parent;[m
[31m-    ngx_mail_imap_srv_conf_t *conf = child;[m
[31m-[m
[31m-    u_char      *p, *auth;[m
[31m-    size_t       size;[m
[31m-    ngx_str_t   *c, *d;[m
[31m-    ngx_uint_t   i, m;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->client_buffer_size,[m
[31m-                              prev->client_buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->auth_methods,[m
[31m-                              prev->auth_methods,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_MAIL_AUTH_PLAIN_ENABLED));[m
[31m-[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-        conf->capabilities = prev->capabilities;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-[m
[31m-        for (d = ngx_mail_imap_default_capabilities; d->len; d++) {[m
[31m-            c = ngx_array_push(&conf->capabilities);[m
[31m-            if (c == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *c = *d;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof("* CAPABILITY" CRLF) - 1;[m
[31m-[m
[31m-    c = conf->capabilities.elts;[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        size += 1 + c[i].len;[m
[31m-    }[m
[31m-[m
[31m-    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;[m
[31m-         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;[m
[31m-         m <<= 1, i++)[m
[31m-    {[m
[31m-        if (m & conf->auth_methods) {[m
[31m-            size += 1 + ngx_mail_imap_auth_methods_names[i].len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->capability.len = size;[m
[31m-    conf->capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, "* CAPABILITY", sizeof("* CAPABILITY") - 1);[m
[31m-[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        *p++ = ' ';[m
[31m-        p = ngx_cpymem(p, c[i].data, c[i].len);[m
[31m-    }[m
[31m-[m
[31m-    auth = p;[m
[31m-[m
[31m-    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;[m
[31m-         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;[m
[31m-         m <<= 1, i++)[m
[31m-    {[m
[31m-        if (m & conf->auth_methods) {[m
[31m-            *p++ = ' ';[m
[31m-            p = ngx_cpymem(p, ngx_mail_imap_auth_methods_names[i].data,[m
[31m-                           ngx_mail_imap_auth_methods_names[i].len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    size += sizeof(" STARTTLS") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_capability.len = size;[m
[31m-    conf->starttls_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data,[m
[31m-                   conf->capability.len - (sizeof(CRLF) - 1));[m
[31m-    p = ngx_cpymem(p, " STARTTLS", sizeof(" STARTTLS") - 1);[m
[31m-    *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    size = (auth - conf->capability.data) + sizeof(CRLF) - 1[m
[31m-            + sizeof(" STARTTLS LOGINDISABLED") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_only_capability.len = size;[m
[31m-    conf->starttls_only_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data,[m
[31m-                   auth - conf->capability.data);[m
[31m-    p = ngx_cpymem(p, " STARTTLS LOGINDISABLED",[m
[31m-                   sizeof(" STARTTLS LOGINDISABLED") - 1);[m
[31m-    *p++ = CR; *p = LF;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_module.h[m
[1mdeleted file mode 100644[m
[1mindex 131b445..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_imap_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_IMAP_MODULE_H_INCLUDED_[m
[31m-#define _NGX_MAIL_IMAP_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t       client_buffer_size;[m
[31m-[m
[31m-    ngx_str_t    capability;[m
[31m-    ngx_str_t    starttls_capability;[m
[31m-    ngx_str_t    starttls_only_capability;[m
[31m-[m
[31m-    ngx_uint_t   auth_methods;[m
[31m-[m
[31m-    ngx_array_t  capabilities;[m
[31m-} ngx_mail_imap_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-void ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_imap_init_protocol(ngx_event_t *rev);[m
[31m-void ngx_mail_imap_auth_state(ngx_event_t *rev);[m
[31m-ngx_int_t ngx_mail_imap_parse_command(ngx_mail_session_t *s);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_mail_imap_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_parse.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_parse.c[m
[1mdeleted file mode 100644[m
[1mindex b158f5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_parse.c[m
[1m+++ /dev/null[m
[36m@@ -1,918 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_pop3_module.h>[m
[31m-#include <ngx_mail_imap_module.h>[m
[31m-#include <ngx_mail_smtp_module.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_pop3_parse_command(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    u_char      ch, *p, *c, c0, c1, c2, c3;[m
[31m-    ngx_str_t  *arg;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_spaces_before_argument,[m
[31m-        sw_argument,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = s->state;[m
[31m-[m
[31m-    for (p = s->buffer->pos; p < s->buffer->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* POP3 command */[m
[31m-        case sw_start:[m
[31m-            if (ch == ' ' || ch == CR || ch == LF) {[m
[31m-                c = s->buffer->start;[m
[31m-[m
[31m-                if (p - c == 4) {[m
[31m-[m
[31m-                    c0 = ngx_toupper(c[0]);[m
[31m-                    c1 = ngx_toupper(c[1]);[m
[31m-                    c2 = ngx_toupper(c[2]);[m
[31m-                    c3 = ngx_toupper(c[3]);[m
[31m-[m
[31m-                    if (c0 == 'U' && c1 == 'S' && c2 == 'E' && c3 == 'R')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_USER;[m
[31m-[m
[31m-                    } else if (c0 == 'P' && c1 == 'A' && c2 == 'S' && c3 == 'S')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_PASS;[m
[31m-[m
[31m-                    } else if (c0 == 'A' && c1 == 'P' && c2 == 'O' && c3 == 'P')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_APOP;[m
[31m-[m
[31m-                    } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_QUIT;[m
[31m-[m
[31m-                    } else if (c0 == 'C' && c1 == 'A' && c2 == 'P' && c3 == 'A')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_CAPA;[m
[31m-[m
[31m-                    } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_AUTH;[m
[31m-[m
[31m-                    } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_NOOP;[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-                    } else if (c0 == 'S' && c1 == 'T' && c2 == 'L' && c3 == 'S')[m
[31m-                    {[m
[31m-                        s->command = NGX_POP3_STLS;[m
[31m-#endif[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_spaces_before_argument:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                s->arg_end = p;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                s->arg_end = p;[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    state = sw_argument;[m
[31m-                    s->arg_start = p;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_argument:[m
[31m-            switch (ch) {[m
[31m-[m
[31m-            case ' ':[m
[31m-[m
[31m-                /*[m
[31m-                 * the space should be considered as part of the at username[m
[31m-                 * or password, but not of argument in other commands[m
[31m-                 */[m
[31m-[m
[31m-                if (s->command == NGX_POP3_USER[m
[31m-                    || s->command == NGX_POP3_PASS)[m
[31m-                {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                /* fall through */[m
[31m-[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-                arg = ngx_array_push(&s->args);[m
[31m-                if (arg == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                arg->len = p - s->arg_start;[m
[31m-                arg->data = s->arg_start;[m
[31m-                s->arg_start = NULL;[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->buffer->pos = p;[m
[31m-    s->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    s->buffer->pos = p + 1;[m
[31m-[m
[31m-    if (s->arg_start) {[m
[31m-        arg = ngx_array_push(&s->args);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        arg->len = s->arg_end - s->arg_start;[m
[31m-        arg->data = s->arg_start;[m
[31m-        s->arg_start = NULL;[m
[31m-    }[m
[31m-[m
[31m-    s->state = (s->command != NGX_POP3_AUTH) ? sw_start : sw_argument;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    s->state = sw_start;[m
[31m-    s->arg_start = NULL;[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_imap_parse_command(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    u_char      ch, *p, *c;[m
[31m-    ngx_str_t  *arg;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_spaces_before_command,[m
[31m-        sw_command,[m
[31m-        sw_spaces_before_argument,[m
[31m-        sw_argument,[m
[31m-        sw_backslash,[m
[31m-        sw_literal,[m
[31m-        sw_no_sync_literal_argument,[m
[31m-        sw_start_literal_argument,[m
[31m-        sw_literal_argument,[m
[31m-        sw_end_literal_argument,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = s->state;[m
[31m-[m
[31m-    for (p = s->buffer->pos; p < s->buffer->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* IMAP tag */[m
[31m-        case sw_start:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                s->tag.len = p - s->buffer->start + 1;[m
[31m-                s->tag.data = s->buffer->start;[m
[31m-                state = sw_spaces_before_command;[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                s->state = sw_start;[m
[31m-                return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-            case LF:[m
[31m-                s->state = sw_start;[m
[31m-                return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_spaces_before_command:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                s->state = sw_start;[m
[31m-                return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-            case LF:[m
[31m-                s->state = sw_start;[m
[31m-                return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-            default:[m
[31m-                s->cmd_start = p;[m
[31m-                state = sw_command;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_command:[m
[31m-            if (ch == ' ' || ch == CR || ch == LF) {[m
[31m-[m
[31m-                c = s->cmd_start;[m
[31m-[m
[31m-                switch (p - c) {[m
[31m-[m
[31m-                case 4:[m
[31m-                    if ((c[0] == 'N' || c[0] == 'n')[m
[31m-                        && (c[1] == 'O'|| c[1] == 'o')[m
[31m-                        && (c[2] == 'O'|| c[2] == 'o')[m
[31m-                        && (c[3] == 'P'|| c[3] == 'p'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_NOOP;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-                case 5:[m
[31m-                    if ((c[0] == 'L'|| c[0] == 'l')[m
[31m-                        && (c[1] == 'O'|| c[1] == 'o')[m
[31m-                        && (c[2] == 'G'|| c[2] == 'g')[m
[31m-                        && (c[3] == 'I'|| c[3] == 'i')[m
[31m-                        && (c[4] == 'N'|| c[4] == 'n'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_LOGIN;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-                case 6:[m
[31m-                    if ((c[0] == 'L'|| c[0] == 'l')[m
[31m-                        && (c[1] == 'O'|| c[1] == 'o')[m
[31m-                        && (c[2] == 'G'|| c[2] == 'g')[m
[31m-                        && (c[3] == 'O'|| c[3] == 'o')[m
[31m-                        && (c[4] == 'U'|| c[4] == 'u')[m
[31m-                        && (c[5] == 'T'|| c[5] == 't'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_LOGOUT;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-                case 8:[m
[31m-                    if ((c[0] == 'S'|| c[0] == 's')[m
[31m-                        && (c[1] == 'T'|| c[1] == 't')[m
[31m-                        && (c[2] == 'A'|| c[2] == 'a')[m
[31m-                        && (c[3] == 'R'|| c[3] == 'r')[m
[31m-                        && (c[4] == 'T'|| c[4] == 't')[m
[31m-                        && (c[5] == 'T'|| c[5] == 't')[m
[31m-                        && (c[6] == 'L'|| c[6] == 'l')[m
[31m-                        && (c[7] == 'S'|| c[7] == 's'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_STARTTLS;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-#endif[m
[31m-[m
[31m-                case 10:[m
[31m-                    if ((c[0] == 'C'|| c[0] == 'c')[m
[31m-                        && (c[1] == 'A'|| c[1] == 'a')[m
[31m-                        && (c[2] == 'P'|| c[2] == 'p')[m
[31m-                        && (c[3] == 'A'|| c[3] == 'a')[m
[31m-                        && (c[4] == 'B'|| c[4] == 'b')[m
[31m-                        && (c[5] == 'I'|| c[5] == 'i')[m
[31m-                        && (c[6] == 'L'|| c[6] == 'l')[m
[31m-                        && (c[7] == 'I'|| c[7] == 'i')[m
[31m-                        && (c[8] == 'T'|| c[8] == 't')[m
[31m-                        && (c[9] == 'Y'|| c[9] == 'y'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_CAPABILITY;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-                case 12:[m
[31m-                    if ((c[0] == 'A'|| c[0] == 'a')[m
[31m-                        && (c[1] == 'U'|| c[1] == 'u')[m
[31m-                        && (c[2] == 'T'|| c[2] == 't')[m
[31m-                        && (c[3] == 'H'|| c[3] == 'h')[m
[31m-                        && (c[4] == 'E'|| c[4] == 'e')[m
[31m-                        && (c[5] == 'N'|| c[5] == 'n')[m
[31m-                        && (c[6] == 'T'|| c[6] == 't')[m
[31m-                        && (c[7] == 'I'|| c[7] == 'i')[m
[31m-                        && (c[8] == 'C'|| c[8] == 'c')[m
[31m-                        && (c[9] == 'A'|| c[9] == 'a')[m
[31m-                        && (c[10] == 'T'|| c[10] == 't')[m
[31m-                        && (c[11] == 'E'|| c[11] == 'e'))[m
[31m-                    {[m
[31m-                        s->command = NGX_IMAP_AUTHENTICATE;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_spaces_before_argument:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                s->arg_end = p;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                s->arg_end = p;[m
[31m-                goto done;[m
[31m-            case '"':[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    s->quoted = 1;[m
[31m-                    s->arg_start = p + 1;[m
[31m-                    state = sw_argument;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            case '{':[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    state = sw_literal;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            default:[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    s->arg_start = p;[m
[31m-                    state = sw_argument;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_argument:[m
[31m-            if (ch == ' ' && s->quoted) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            switch (ch) {[m
[31m-            case '"':[m
[31m-                if (!s->quoted) {[m
[31m-                    break;[m
[31m-                }[m
[31m-                s->quoted = 0;[m
[31m-                /* fall through */[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-                arg = ngx_array_push(&s->args);[m
[31m-                if (arg == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                arg->len = p - s->arg_start;[m
[31m-                arg->data = s->arg_start;[m
[31m-                s->arg_start = NULL;[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case '"':[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-            case '\\':[m
[31m-                if (s->quoted) {[m
[31m-                    s->backslash = 1;[m
[31m-                    state = sw_backslash;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_backslash:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-                goto invalid;[m
[31m-            default:[m
[31m-                state = sw_argument;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_literal:[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                s->literal_len = s->literal_len * 10 + (ch - '0');[m
[31m-                break;[m
[31m-            }[m
[31m-            if (ch == '}') {[m
[31m-                state = sw_start_literal_argument;[m
[31m-                break;[m
[31m-            }[m
[31m-            if (ch == '+') {[m
[31m-                state = sw_no_sync_literal_argument;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_no_sync_literal_argument:[m
[31m-            if (ch == '}') {[m
[31m-                s->no_sync_literal = 1;[m
[31m-                state = sw_start_literal_argument;[m
[31m-                break;[m
[31m-            }[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_start_literal_argument:[m
[31m-            switch (ch) {[m
[31m-            case CR:[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                s->buffer->pos = p + 1;[m
[31m-                s->arg_start = p + 1;[m
[31m-                if (s->no_sync_literal == 0) {[m
[31m-                    s->state = sw_literal_argument;[m
[31m-                    return NGX_IMAP_NEXT;[m
[31m-                }[m
[31m-                state = sw_literal_argument;[m
[31m-                s->no_sync_literal = 0;[m
[31m-                break;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_literal_argument:[m
[31m-            if (s->literal_len && --s->literal_len) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            arg = ngx_array_push(&s->args);[m
[31m-            if (arg == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-            arg->len = p + 1 - s->arg_start;[m
[31m-            arg->data = s->arg_start;[m
[31m-            s->arg_start = NULL;[m
[31m-            state = sw_end_literal_argument;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_end_literal_argument:[m
[31m-            switch (ch) {[m
[31m-            case '{':[m
[31m-                if (s->args.nelts <= 2) {[m
[31m-                    state = sw_literal;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                state = sw_spaces_before_argument;[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->buffer->pos = p;[m
[31m-    s->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    s->buffer->pos = p + 1;[m
[31m-[m
[31m-    if (s->arg_start) {[m
[31m-        arg = ngx_array_push(&s->args);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        arg->len = s->arg_end - s->arg_start;[m
[31m-        arg->data = s->arg_start;[m
[31m-[m
[31m-        s->arg_start = NULL;[m
[31m-        s->cmd_start = NULL;[m
[31m-        s->quoted = 0;[m
[31m-        s->no_sync_literal = 0;[m
[31m-        s->literal_len = 0;[m
[31m-    }[m
[31m-[m
[31m-    s->state = (s->command != NGX_IMAP_AUTHENTICATE) ? sw_start : sw_argument;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    s->state = sw_start;[m
[31m-    s->quoted = 0;[m
[31m-    s->no_sync_literal = 0;[m
[31m-    s->literal_len = 0;[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_smtp_parse_command(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    u_char      ch, *p, *c, c0, c1, c2, c3;[m
[31m-    ngx_str_t  *arg;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_command,[m
[31m-        sw_invalid,[m
[31m-        sw_spaces_before_argument,[m
[31m-        sw_argument,[m
[31m-        sw_almost_done[m
[31m-    } state;[m
[31m-[m
[31m-    state = s->state;[m
[31m-[m
[31m-    for (p = s->buffer->pos; p < s->buffer->last; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        /* SMTP command */[m
[31m-        case sw_start:[m
[31m-            s->cmd_start = p;[m
[31m-            state = sw_command;[m
[31m-[m
[31m-            /* fall through */[m
[31m-[m
[31m-        case sw_command:[m
[31m-            if (ch == ' ' || ch == CR || ch == LF) {[m
[31m-                c = s->cmd_start;[m
[31m-[m
[31m-                if (p - c == 4) {[m
[31m-[m
[31m-                    c0 = ngx_toupper(c[0]);[m
[31m-                    c1 = ngx_toupper(c[1]);[m
[31m-                    c2 = ngx_toupper(c[2]);[m
[31m-                    c3 = ngx_toupper(c[3]);[m
[31m-[m
[31m-                    if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'O')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_HELO;[m
[31m-[m
[31m-                    } else if (c0 == 'E' && c1 == 'H' && c2 == 'L' && c3 == 'O')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_EHLO;[m
[31m-[m
[31m-                    } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_QUIT;[m
[31m-[m
[31m-                    } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_AUTH;[m
[31m-[m
[31m-                    } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_NOOP;[m
[31m-[m
[31m-                    } else if (c0 == 'M' && c1 == 'A' && c2 == 'I' && c3 == 'L')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_MAIL;[m
[31m-[m
[31m-                    } else if (c0 == 'R' && c1 == 'S' && c2 == 'E' && c3 == 'T')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_RSET;[m
[31m-[m
[31m-                    } else if (c0 == 'R' && c1 == 'C' && c2 == 'P' && c3 == 'T')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_RCPT;[m
[31m-[m
[31m-                    } else if (c0 == 'V' && c1 == 'R' && c2 == 'F' && c3 == 'Y')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_VRFY;[m
[31m-[m
[31m-                    } else if (c0 == 'E' && c1 == 'X' && c2 == 'P' && c3 == 'N')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_EXPN;[m
[31m-[m
[31m-                    } else if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'P')[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_HELP;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-                } else if (p - c == 8) {[m
[31m-[m
[31m-                    if ((c[0] == 'S'|| c[0] == 's')[m
[31m-                        && (c[1] == 'T'|| c[1] == 't')[m
[31m-                        && (c[2] == 'A'|| c[2] == 'a')[m
[31m-                        && (c[3] == 'R'|| c[3] == 'r')[m
[31m-                        && (c[4] == 'T'|| c[4] == 't')[m
[31m-                        && (c[5] == 'T'|| c[5] == 't')[m
[31m-                        && (c[6] == 'L'|| c[6] == 'l')[m
[31m-                        && (c[7] == 'S'|| c[7] == 's'))[m
[31m-                    {[m
[31m-                        s->command = NGX_SMTP_STARTTLS;[m
[31m-[m
[31m-                    } else {[m
[31m-                        goto invalid;[m
[31m-                    }[m
[31m-#endif[m
[31m-                } else {[m
[31m-                    goto invalid;[m
[31m-                }[m
[31m-[m
[31m-                s->cmd.data = s->cmd_start;[m
[31m-                s->cmd.len = p - s->cmd_start;[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_invalid:[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_spaces_before_argument:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-                break;[m
[31m-            case CR:[m
[31m-                state = sw_almost_done;[m
[31m-                s->arg_end = p;[m
[31m-                break;[m
[31m-            case LF:[m
[31m-                s->arg_end = p;[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                if (s->args.nelts <= 10) {[m
[31m-                    state = sw_argument;[m
[31m-                    s->arg_start = p;[m
[31m-                    break;[m
[31m-                }[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_argument:[m
[31m-            switch (ch) {[m
[31m-            case ' ':[m
[31m-            case CR:[m
[31m-            case LF:[m
[31m-                arg = ngx_array_push(&s->args);[m
[31m-                if (arg == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-                arg->len = p - s->arg_start;[m
[31m-                arg->data = s->arg_start;[m
[31m-                s->arg_start = NULL;[m
[31m-[m
[31m-                switch (ch) {[m
[31m-                case ' ':[m
[31m-                    state = sw_spaces_before_argument;[m
[31m-                    break;[m
[31m-                case CR:[m
[31m-                    state = sw_almost_done;[m
[31m-                    break;[m
[31m-                case LF:[m
[31m-                    goto done;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                break;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case sw_almost_done:[m
[31m-            switch (ch) {[m
[31m-            case LF:[m
[31m-                goto done;[m
[31m-            default:[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->buffer->pos = p;[m
[31m-    s->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    s->buffer->pos = p + 1;[m
[31m-[m
[31m-    if (s->arg_start) {[m
[31m-        arg = ngx_array_push(&s->args);[m
[31m-        if (arg == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        arg->len = s->arg_end - s->arg_start;[m
[31m-        arg->data = s->arg_start;[m
[31m-        s->arg_start = NULL;[m
[31m-    }[m
[31m-[m
[31m-    s->state = (s->command != NGX_SMTP_AUTH) ? sw_start : sw_argument;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    s->state = sw_invalid;[m
[31m-    s->arg_start = NULL;[m
[31m-[m
[31m-    /* skip invalid command till LF */[m
[31m-[m
[31m-    for (p = s->buffer->pos; p < s->buffer->last; p++) {[m
[31m-        if (*p == LF) {[m
[31m-            s->state = sw_start;[m
[31m-            p++;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->buffer->pos = p;[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t                 *arg;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    if (arg[0].len == 5) {[m
[31m-[m
[31m-        if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) {[m
[31m-[m
[31m-            if (s->args.nelts == 1) {[m
[31m-                return NGX_MAIL_AUTH_LOGIN;[m
[31m-            }[m
[31m-[m
[31m-            if (s->args.nelts == 2) {[m
[31m-                return NGX_MAIL_AUTH_LOGIN_USERNAME;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) {[m
[31m-[m
[31m-            if (s->args.nelts == 1) {[m
[31m-                return NGX_MAIL_AUTH_PLAIN;[m
[31m-            }[m
[31m-[m
[31m-            if (s->args.nelts == 2) {[m
[31m-                return ngx_mail_auth_plain(s, c, 1);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    if (arg[0].len == 8) {[m
[31m-[m
[31m-        if (s->args.nelts != 1) {[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) {[m
[31m-            return NGX_MAIL_AUTH_CRAM_MD5;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 51bc257..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,500 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_pop3_module.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    ngx_int_t stls);[m
[31m-static ngx_int_t ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-static u_char  pop3_greeting[] = "+OK POP3 ready" CRLF;[m
[31m-static u_char  pop3_ok[] = "+OK" CRLF;[m
[31m-static u_char  pop3_next[] = "+ " CRLF;[m
[31m-static u_char  pop3_username[] = "+ VXNlcm5hbWU6" CRLF;[m
[31m-static u_char  pop3_password[] = "+ UGFzc3dvcmQ6" CRLF;[m
[31m-static u_char  pop3_invalid_command[] = "-ERR invalid command" CRLF;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-    pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    if (pscf->auth_methods[m
[31m-        & (NGX_MAIL_AUTH_APOP_ENABLED|NGX_MAIL_AUTH_CRAM_MD5_ENABLED))[m
[31m-    {[m
[31m-        if (ngx_mail_salt(s, c, cscf) != NGX_OK) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        s->out.data = ngx_pnalloc(c->pool, sizeof(pop3_greeting) + s->salt.len);[m
[31m-        if (s->out.data == NULL) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(s->out.data, pop3_greeting, sizeof(pop3_greeting) - 3);[m
[31m-        *p++ = ' ';[m
[31m-        p = ngx_cpymem(p, s->salt.data, s->salt.len);[m
[31m-[m
[31m-        s->out.len = p - s->out.data;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_str_set(&s->out, pop3_greeting);[m
[31m-    }[m
[31m-[m
[31m-    c->read->handler = ngx_mail_pop3_init_protocol;[m
[31m-[m
[31m-    ngx_add_timer(c->read, cscf->timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_pop3_init_protocol(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->log->action = "in auth state";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (s->buffer == NULL) {[m
[31m-        if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t))[m
[31m-            == NGX_ERROR)[m
[31m-        {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        s->buffer = ngx_create_temp_buf(c->pool, 128);[m
[31m-        if (s->buffer == NULL) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->mail_state = ngx_pop3_start;[m
[31m-    c->read->handler = ngx_mail_pop3_auth_state;[m
[31m-[m
[31m-    ngx_mail_pop3_auth_state(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_pop3_auth_state(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 auth state");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 send handler busy");[m
[31m-        s->blocked = 1;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->blocked = 0;[m
[31m-[m
[31m-    rc = ngx_mail_read_command(s, c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&s->out, pop3_ok);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        switch (s->mail_state) {[m
[31m-[m
[31m-        case ngx_pop3_start:[m
[31m-[m
[31m-            switch (s->command) {[m
[31m-[m
[31m-            case NGX_POP3_USER:[m
[31m-                rc = ngx_mail_pop3_user(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_CAPA:[m
[31m-                rc = ngx_mail_pop3_capa(s, c, 1);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_APOP:[m
[31m-                rc = ngx_mail_pop3_apop(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_AUTH:[m
[31m-                rc = ngx_mail_pop3_auth(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_QUIT:[m
[31m-                s->quit = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_NOOP:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_STLS:[m
[31m-                rc = ngx_mail_pop3_stls(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                rc = NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_user:[m
[31m-[m
[31m-            switch (s->command) {[m
[31m-[m
[31m-            case NGX_POP3_PASS:[m
[31m-                rc = ngx_mail_pop3_pass(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_CAPA:[m
[31m-                rc = ngx_mail_pop3_capa(s, c, 0);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_QUIT:[m
[31m-                s->quit = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_POP3_NOOP:[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                rc = NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        /* suppress warnings */[m
[31m-        case ngx_pop3_passwd:[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_auth_login_username:[m
[31m-            rc = ngx_mail_auth_login_username(s, c, 0);[m
[31m-[m
[31m-            ngx_str_set(&s->out, pop3_password);[m
[31m-            s->mail_state = ngx_pop3_auth_login_password;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_auth_login_password:[m
[31m-            rc = ngx_mail_auth_login_password(s, c);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_auth_plain:[m
[31m-            rc = ngx_mail_auth_plain(s, c, 0);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_pop3_auth_cram_md5:[m
[31m-            rc = ngx_mail_auth_cram_md5(s, c);[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_DONE:[m
[31m-        ngx_mail_auth(s, c);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_MAIL_PARSE_INVALID_COMMAND:[m
[31m-        s->mail_state = ngx_pop3_start;[m
[31m-        s->state = 0;[m
[31m-[m
[31m-        ngx_str_set(&s->out, pop3_invalid_command);[m
[31m-[m
[31m-        /* fall through */[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-[m
[31m-        s->args.nelts = 0;[m
[31m-        s->buffer->pos = s->buffer->start;[m
[31m-        s->buffer->last = s->buffer->start;[m
[31m-[m
[31m-        if (s->state) {[m
[31m-            s->arg_start = s->buffer->start;[m
[31m-        }[m
[31m-[m
[31m-        ngx_mail_send(c->write);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (s->args.nelts != 1) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-    s->login.len = arg[0].len;[m
[31m-    s->login.data = ngx_pnalloc(c->pool, s->login.len);[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->login.data, arg[0].data, s->login.len);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "pop3 login: \"%V\"", &s->login);[m
[31m-[m
[31m-    s->mail_state = ngx_pop3_user;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg;[m
[31m-[m
[31m-    if (s->args.nelts != 1) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-    s->passwd.len = arg[0].len;[m
[31m-    s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);[m
[31m-    if (s->passwd.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->passwd.data, arg[0].data, s->passwd.len);[m
[31m-[m
[31m-#if (NGX_DEBUG_MAIL_PASSWD)[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "pop3 passwd: \"%V\"", &s->passwd);[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c, ngx_int_t stls)[m
[31m-{[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-    pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-    if (stls && c->ssl == NULL) {[m
[31m-        ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-        if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {[m
[31m-            s->out = pscf->starttls_capability;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {[m
[31m-            s->out = pscf->starttls_only_capability;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    s->out = pscf->capability;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (c->ssl == NULL) {[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-        if (sslcf->starttls) {[m
[31m-            c->read->handler = ngx_mail_starttls_handler;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t                 *arg;[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (s->args.nelts != 2) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);[m
[31m-[m
[31m-    if (!(pscf->auth_methods & NGX_MAIL_AUTH_APOP_ENABLED)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    s->login.len = arg[0].len;[m
[31m-    s->login.data = ngx_pnalloc(c->pool, s->login.len);[m
[31m-    if (s->login.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->login.data, arg[0].data, s->login.len);[m
[31m-[m
[31m-    s->passwd.len = arg[1].len;[m
[31m-    s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len);[m
[31m-    if (s->passwd.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "pop3 apop: \"%V\" \"%V\"", &s->login, &s->passwd);[m
[31m-[m
[31m-    s->auth_method = NGX_MAIL_AUTH_APOP;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module);[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        s->out = pscf->auth_capability;[m
[31m-        s->state = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_auth_parse(s, c);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, pop3_username);[m
[31m-        s->mail_state = ngx_pop3_auth_login_username;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN_USERNAME:[m
[31m-[m
[31m-        ngx_str_set(&s->out, pop3_password);[m
[31m-        s->mail_state = ngx_pop3_auth_login_password;[m
[31m-[m
[31m-        return ngx_mail_auth_login_username(s, c, 1);[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_PLAIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, pop3_next);[m
[31m-        s->mail_state = ngx_pop3_auth_plain;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_CRAM_MD5:[m
[31m-[m
[31m-        if (!(pscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) {[m
[31m-            s->mail_state = ngx_pop3_auth_cram_md5;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_module.c[m
[1mdeleted file mode 100644[m
[1mindex 73f8531..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,266 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_pop3_module.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_pop3_default_capabilities[] = {[m
[31m-    ngx_string("TOP"),[m
[31m-    ngx_string("USER"),[m
[31m-    ngx_string("UIDL"),[m
[31m-    ngx_null_string[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_mail_pop3_auth_methods[] = {[m
[31m-    { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },[m
[31m-    { ngx_string("apop"), NGX_MAIL_AUTH_APOP_ENABLED },[m
[31m-    { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_pop3_auth_plain_capability =[m
[31m-    ngx_string("+OK methods supported:" CRLF[m
[31m-               "LOGIN" CRLF[m
[31m-               "PLAIN" CRLF[m
[31m-               "." CRLF);[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_pop3_auth_cram_md5_capability =[m
[31m-    ngx_string("+OK methods supported:" CRLF[m
[31m-               "LOGIN" CRLF[m
[31m-               "PLAIN" CRLF[m
[31m-               "CRAM-MD5" CRLF[m
[31m-               "." CRLF);[m
[31m-[m
[31m-[m
[31m-static ngx_mail_protocol_t  ngx_mail_pop3_protocol = {[m
[31m-    ngx_string("pop3"),[m
[31m-    { 110, 995, 0, 0 },[m
[31m-    NGX_MAIL_POP3_PROTOCOL,[m
[31m-[m
[31m-    ngx_mail_pop3_init_session,[m
[31m-    ngx_mail_pop3_init_protocol,[m
[31m-    ngx_mail_pop3_parse_command,[m
[31m-    ngx_mail_pop3_auth_state,[m
[31m-[m
[31m-    ngx_string("-ERR internal server error" CRLF),[m
[31m-    ngx_string("-ERR SSL certificate error" CRLF),[m
[31m-    ngx_string("-ERR No required SSL certificate" CRLF)[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_pop3_commands[] = {[m
[31m-[m
[31m-    { ngx_string("pop3_capabilities"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_capabilities,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_pop3_srv_conf_t, capabilities),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("pop3_auth"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_pop3_srv_conf_t, auth_methods),[m
[31m-      &ngx_mail_pop3_auth_methods },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_pop3_module_ctx = {[m
[31m-    &ngx_mail_pop3_protocol,               /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_pop3_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_mail_pop3_merge_srv_conf           /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_pop3_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_pop3_module_ctx,             /* module context */[m
[31m-    ngx_mail_pop3_commands,                /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_pop3_srv_conf_t  *pscf;[m
[31m-[m
[31m-    pscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_pop3_srv_conf_t));[m
[31m-    if (pscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&pscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return pscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_pop3_srv_conf_t *prev = parent;[m
[31m-    ngx_mail_pop3_srv_conf_t *conf = child;[m
[31m-[m
[31m-    u_char      *p;[m
[31m-    size_t       size, stls_only_size;[m
[31m-    ngx_str_t   *c, *d;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->auth_methods,[m
[31m-                                 prev->auth_methods,[m
[31m-                                 (NGX_CONF_BITMASK_SET[m
[31m-                                  |NGX_MAIL_AUTH_PLAIN_ENABLED));[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-        conf->capabilities = prev->capabilities;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-[m
[31m-        for (d = ngx_mail_pop3_default_capabilities; d->len; d++) {[m
[31m-            c = ngx_array_push(&conf->capabilities);[m
[31m-            if (c == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            *c = *d;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof("+OK Capability list follows" CRLF) - 1[m
[31m-           + sizeof("." CRLF) - 1;[m
[31m-[m
[31m-    stls_only_size = size + sizeof("STLS" CRLF) - 1;[m
[31m-[m
[31m-    c = conf->capabilities.elts;[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        size += c[i].len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-        if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        stls_only_size += c[i].len + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {[m
[31m-        size += sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        size += sizeof("SASL LOGIN PLAIN" CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->capability.len = size;[m
[31m-    conf->capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, "+OK Capability list follows" CRLF,[m
[31m-                   sizeof("+OK Capability list follows" CRLF) - 1);[m
[31m-[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        p = ngx_cpymem(p, c[i].data, c[i].len);[m
[31m-        *p++ = CR; *p++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {[m
[31m-        p = ngx_cpymem(p, "SASL LOGIN PLAIN CRAM-MD5" CRLF,[m
[31m-                       sizeof("SASL LOGIN PLAIN CRAM-MD5" CRLF) - 1);[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_cpymem(p, "SASL LOGIN PLAIN" CRLF,[m
[31m-                       sizeof("SASL LOGIN PLAIN" CRLF) - 1);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '.'; *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    size += sizeof("STLS" CRLF) - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_capability.len = size;[m
[31m-    conf->starttls_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data,[m
[31m-                   conf->capability.len - (sizeof("." CRLF) - 1));[m
[31m-[m
[31m-    p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1);[m
[31m-    *p++ = '.'; *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    if (conf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED) {[m
[31m-        conf->auth_capability = ngx_mail_pop3_auth_cram_md5_capability;[m
[31m-[m
[31m-    } else {[m
[31m-        conf->auth_capability = ngx_mail_pop3_auth_plain_capability;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, stls_only_size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_only_capability.len = stls_only_size;[m
[31m-    conf->starttls_only_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, "+OK Capability list follows" CRLF,[m
[31m-                   sizeof("+OK Capability list follows" CRLF) - 1);[m
[31m-[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, c[i].data, c[i].len);[m
[31m-        *p++ = CR; *p++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1);[m
[31m-    *p++ = '.'; *p++ = CR; *p = LF;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_module.h[m
[1mdeleted file mode 100644[m
[1mindex 86947a7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_pop3_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,38 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_POP3_MODULE_H_INCLUDED_[m
[31m-#define _NGX_MAIL_POP3_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t    capability;[m
[31m-    ngx_str_t    starttls_capability;[m
[31m-    ngx_str_t    starttls_only_capability;[m
[31m-    ngx_str_t    auth_capability;[m
[31m-[m
[31m-    ngx_uint_t   auth_methods;[m
[31m-[m
[31m-    ngx_array_t  capabilities;[m
[31m-} ngx_mail_pop3_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-void ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_pop3_init_protocol(ngx_event_t *rev);[m
[31m-void ngx_mail_pop3_auth_state(ngx_event_t *rev);[m
[31m-ngx_int_t ngx_mail_pop3_parse_command(ngx_mail_session_t *s);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_mail_pop3_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_POP3_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_proxy_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_proxy_module.c[m
[1mdeleted file mode 100644[m
[1mindex 007284b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_proxy_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1123 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t  enable;[m
[31m-    ngx_flag_t  pass_error_message;[m
[31m-    ngx_flag_t  xclient;[m
[31m-    size_t      buffer_size;[m
[31m-    ngx_msec_t  timeout;[m
[31m-} ngx_mail_proxy_conf_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_mail_proxy_block_read(ngx_event_t *rev);[m
[31m-static void ngx_mail_proxy_pop3_handler(ngx_event_t *rev);[m
[31m-static void ngx_mail_proxy_imap_handler(ngx_event_t *rev);[m
[31m-static void ngx_mail_proxy_smtp_handler(ngx_event_t *rev);[m
[31m-static void ngx_mail_proxy_dummy_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_mail_proxy_read_response(ngx_mail_session_t *s,[m
[31m-    ngx_uint_t state);[m
[31m-static void ngx_mail_proxy_handler(ngx_event_t *ev);[m
[31m-static void ngx_mail_proxy_upstream_error(ngx_mail_session_t *s);[m
[31m-static void ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s);[m
[31m-static void ngx_mail_proxy_close_session(ngx_mail_session_t *s);[m
[31m-static void *ngx_mail_proxy_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_proxy_commands[] = {[m
[31m-[m
[31m-    { ngx_string("proxy"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffer"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_pass_error_message"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, pass_error_message),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("xclient"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_proxy_conf_t, xclient),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_proxy_module_ctx = {[m
[31m-    NULL,                                  /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_proxy_create_conf,            /* create server configuration */[m
[31m-    ngx_mail_proxy_merge_conf              /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_proxy_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_proxy_module_ctx,            /* module context */[m
[31m-    ngx_mail_proxy_commands,               /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static u_char  smtp_auth_ok[] = "235 2.0.0 OK" CRLF;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_mail_proxy_ctx_t      *p;[m
[31m-    ngx_mail_proxy_conf_t     *pcf;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    s->connection->log->action = "connecting to upstream";[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    p = ngx_pcalloc(s->connection->pool, sizeof(ngx_mail_proxy_ctx_t));[m
[31m-    if (p == NULL) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->proxy = p;[m
[31m-[m
[31m-    p->upstream.sockaddr = peer->sockaddr;[m
[31m-    p->upstream.socklen = peer->socklen;[m
[31m-    p->upstream.name = &peer->name;[m
[31m-    p->upstream.get = ngx_event_get_peer;[m
[31m-    p->upstream.log = s->connection->log;[m
[31m-    p->upstream.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&p->upstream);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(p->upstream.connection->read, cscf->timeout);[m
[31m-[m
[31m-    p->upstream.connection->data = s;[m
[31m-    p->upstream.connection->pool = s->connection->pool;[m
[31m-[m
[31m-    s->connection->read->handler = ngx_mail_proxy_block_read;[m
[31m-    p->upstream.connection->write->handler = ngx_mail_proxy_dummy_handler;[m
[31m-[m
[31m-    pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-[m
[31m-    s->proxy->buffer = ngx_create_temp_buf(s->connection->pool,[m
[31m-                                           pcf->buffer_size);[m
[31m-    if (s->proxy->buffer == NULL) {[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->out.len = 0;[m
[31m-[m
[31m-    switch (s->protocol) {[m
[31m-[m
[31m-    case NGX_MAIL_POP3_PROTOCOL:[m
[31m-        p->upstream.connection->read->handler = ngx_mail_proxy_pop3_handler;[m
[31m-        s->mail_state = ngx_pop3_start;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_MAIL_IMAP_PROTOCOL:[m
[31m-        p->upstream.connection->read->handler = ngx_mail_proxy_imap_handler;[m
[31m-        s->mail_state = ngx_imap_start;[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_MAIL_SMTP_PROTOCOL */[m
[31m-        p->upstream.connection->read->handler = ngx_mail_proxy_smtp_handler;[m
[31m-        s->mail_state = ngx_smtp_start;[m
[31m-        break;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_block_read(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy block read");[m
[31m-[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        c = rev->data;[m
[31m-        s = c->data;[m
[31m-[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_pop3_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_str_t               line;[m
[31m-    ngx_connection_t       *c;[m
[31m-    ngx_mail_session_t     *s;[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail proxy pop3 auth handler");[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_proxy_read_response(s, 0);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_mail_proxy_upstream_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    switch (s->mail_state) {[m
[31m-[m
[31m-    case ngx_pop3_start:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user");[m
[31m-[m
[31m-        s->connection->log->action = "sending user name to upstream";[m
[31m-[m
[31m-        line.len = sizeof("USER ")  - 1 + s->login.len + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, "USER ", sizeof("USER ") - 1);[m
[31m-        p = ngx_cpymem(p, s->login.data, s->login.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_pop3_user;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_pop3_user:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send pass");[m
[31m-[m
[31m-        s->connection->log->action = "sending password to upstream";[m
[31m-[m
[31m-        line.len = sizeof("PASS ")  - 1 + s->passwd.len + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, "PASS ", sizeof("PASS ") - 1);[m
[31m-        p = ngx_cpymem(p, s->passwd.data, s->passwd.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_pop3_passwd;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_pop3_passwd:[m
[31m-        s->connection->read->handler = ngx_mail_proxy_handler;[m
[31m-        s->connection->write->handler = ngx_mail_proxy_handler;[m
[31m-        rev->handler = ngx_mail_proxy_handler;[m
[31m-        c->write->handler = ngx_mail_proxy_handler;[m
[31m-[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-        ngx_add_timer(s->connection->read, pcf->timeout);[m
[31m-        ngx_del_timer(c->read);[m
[31m-[m
[31m-        c->log->action = NULL;[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");[m
[31m-[m
[31m-        ngx_mail_proxy_handler(s->connection->write);[m
[31m-[m
[31m-        return;[m
[31m-[m
[31m-    default:[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        ngx_str_null(&line);[m
[31m-#endif[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (c->send(c, line.data, line.len) < (ssize_t) line.len) {[m
[31m-        /*[m
[31m-         * we treat the incomplete sending as NGX_ERROR[m
[31m-         * because it is very strange here[m
[31m-         */[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->proxy->buffer->pos = s->proxy->buffer->start;[m
[31m-    s->proxy->buffer->last = s->proxy->buffer->start;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_imap_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    ngx_int_t               rc;[m
[31m-    ngx_str_t               line;[m
[31m-    ngx_connection_t       *c;[m
[31m-    ngx_mail_session_t     *s;[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail proxy imap auth handler");[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_proxy_read_response(s, s->mail_state);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_mail_proxy_upstream_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    switch (s->mail_state) {[m
[31m-[m
[31m-    case ngx_imap_start:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send login");[m
[31m-[m
[31m-        s->connection->log->action = "sending LOGIN command to upstream";[m
[31m-[m
[31m-        line.len = s->tag.len + sizeof("LOGIN ") - 1[m
[31m-                   + 1 + NGX_SIZE_T_LEN + 1 + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        line.len = ngx_sprintf(line.data, "%VLOGIN {%uz}" CRLF,[m
[31m-                               &s->tag, s->login.len)[m
[31m-                   - line.data;[m
[31m-[m
[31m-        s->mail_state = ngx_imap_login;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_imap_login:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user");[m
[31m-[m
[31m-        s->connection->log->action = "sending user name to upstream";[m
[31m-[m
[31m-        line.len = s->login.len + 1 + 1 + NGX_SIZE_T_LEN + 1 + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        line.len = ngx_sprintf(line.data, "%V {%uz}" CRLF,[m
[31m-                               &s->login, s->passwd.len)[m
[31m-                   - line.data;[m
[31m-[m
[31m-        s->mail_state = ngx_imap_user;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_imap_user:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send passwd");[m
[31m-[m
[31m-        s->connection->log->action = "sending password to upstream";[m
[31m-[m
[31m-        line.len = s->passwd.len + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, s->passwd.data, s->passwd.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_imap_passwd;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_imap_passwd:[m
[31m-        s->connection->read->handler = ngx_mail_proxy_handler;[m
[31m-        s->connection->write->handler = ngx_mail_proxy_handler;[m
[31m-        rev->handler = ngx_mail_proxy_handler;[m
[31m-        c->write->handler = ngx_mail_proxy_handler;[m
[31m-[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-        ngx_add_timer(s->connection->read, pcf->timeout);[m
[31m-        ngx_del_timer(c->read);[m
[31m-[m
[31m-        c->log->action = NULL;[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");[m
[31m-[m
[31m-        ngx_mail_proxy_handler(s->connection->write);[m
[31m-[m
[31m-        return;[m
[31m-[m
[31m-    default:[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        ngx_str_null(&line);[m
[31m-#endif[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (c->send(c, line.data, line.len) < (ssize_t) line.len) {[m
[31m-        /*[m
[31m-         * we treat the incomplete sending as NGX_ERROR[m
[31m-         * because it is very strange here[m
[31m-         */[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->proxy->buffer->pos = s->proxy->buffer->start;[m
[31m-    s->proxy->buffer->last = s->proxy->buffer->start;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_smtp_handler(ngx_event_t *rev)[m
[31m-{[m
[31m-    u_char                    *p;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_str_t                  line;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_proxy_conf_t     *pcf;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                   "mail proxy smtp auth handler");[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_proxy_read_response(s, s->mail_state);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_mail_proxy_upstream_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    switch (s->mail_state) {[m
[31m-[m
[31m-    case ngx_smtp_start:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send ehlo");[m
[31m-[m
[31m-        s->connection->log->action = "sending HELO/EHLO to upstream";[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        line.len = sizeof("HELO ")  - 1 + cscf->server_name.len + 2;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-[m
[31m-        p = ngx_cpymem(line.data,[m
[31m-                       ((s->esmtp || pcf->xclient) ? "EHLO " : "HELO "),[m
[31m-                       sizeof("HELO ") - 1);[m
[31m-[m
[31m-        p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        if (pcf->xclient) {[m
[31m-            s->mail_state = ngx_smtp_helo_xclient;[m
[31m-[m
[31m-        } else if (s->auth_method == NGX_MAIL_AUTH_NONE) {[m
[31m-            s->mail_state = ngx_smtp_helo_from;[m
[31m-[m
[31m-        } else {[m
[31m-            s->mail_state = ngx_smtp_helo;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_helo_xclient:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send xclient");[m
[31m-[m
[31m-        s->connection->log->action = "sending XCLIENT to upstream";[m
[31m-[m
[31m-        line.len = sizeof("XCLIENT ADDR= LOGIN= NAME="[m
[31m-                          CRLF) - 1[m
[31m-                   + s->connection->addr_text.len + s->login.len + s->host.len;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (s->connection->sockaddr->sa_family == AF_INET6) {[m
[31m-            line.len += sizeof("IPV6:") - 1;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, "XCLIENT ADDR=", sizeof("XCLIENT ADDR=") - 1);[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        if (s->connection->sockaddr->sa_family == AF_INET6) {[m
[31m-            p = ngx_cpymem(p, "IPV6:", sizeof("IPV6:") - 1);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        p = ngx_copy(p, s->connection->addr_text.data,[m
[31m-                     s->connection->addr_text.len);[m
[31m-[m
[31m-        if (s->login.len) {[m
[31m-            p = ngx_cpymem(p, " LOGIN=", sizeof(" LOGIN=") - 1);[m
[31m-            p = ngx_copy(p, s->login.data, s->login.len);[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(p, " NAME=", sizeof(" NAME=") - 1);[m
[31m-        p = ngx_copy(p, s->host.data, s->host.len);[m
[31m-[m
[31m-        *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-        line.len = p - line.data;[m
[31m-[m
[31m-        if (s->smtp_helo.len) {[m
[31m-            s->mail_state = ngx_smtp_xclient_helo;[m
[31m-[m
[31m-        } else if (s->auth_method == NGX_MAIL_AUTH_NONE) {[m
[31m-            s->mail_state = ngx_smtp_xclient_from;[m
[31m-[m
[31m-        } else {[m
[31m-            s->mail_state = ngx_smtp_xclient;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_xclient_helo:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send client ehlo");[m
[31m-[m
[31m-        s->connection->log->action = "sending client HELO/EHLO to upstream";[m
[31m-[m
[31m-        line.len = sizeof("HELO " CRLF) - 1 + s->smtp_helo.len;[m
[31m-[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        line.len = ngx_sprintf(line.data,[m
[31m-                       ((s->esmtp) ? "EHLO %V" CRLF : "HELO %V" CRLF),[m
[31m-                       &s->smtp_helo)[m
[31m-                   - line.data;[m
[31m-[m
[31m-        s->mail_state = (s->auth_method == NGX_MAIL_AUTH_NONE) ?[m
[31m-                            ngx_smtp_helo_from : ngx_smtp_helo;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_helo_from:[m
[31m-    case ngx_smtp_xclient_from:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send mail from");[m
[31m-[m
[31m-        s->connection->log->action = "sending MAIL FROM to upstream";[m
[31m-[m
[31m-        line.len = s->smtp_from.len + sizeof(CRLF) - 1;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, s->smtp_from.data, s->smtp_from.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_smtp_from;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_from:[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,[m
[31m-                       "mail proxy send rcpt to");[m
[31m-[m
[31m-        s->connection->log->action = "sending RCPT TO to upstream";[m
[31m-[m
[31m-        line.len = s->smtp_to.len + sizeof(CRLF) - 1;[m
[31m-        line.data = ngx_pnalloc(c->pool, line.len);[m
[31m-        if (line.data == NULL) {[m
[31m-            ngx_mail_proxy_internal_server_error(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_cpymem(line.data, s->smtp_to.data, s->smtp_to.len);[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-        s->mail_state = ngx_smtp_to;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_smtp_helo:[m
[31m-    case ngx_smtp_xclient:[m
[31m-    case ngx_smtp_to:[m
[31m-[m
[31m-        b = s->proxy->buffer;[m
[31m-[m
[31m-        if (s->auth_method == NGX_MAIL_AUTH_NONE) {[m
[31m-            b->pos = b->start;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_memcpy(b->start, smtp_auth_ok, sizeof(smtp_auth_ok) - 1);[m
[31m-            b->last = b->start + sizeof(smtp_auth_ok) - 1;[m
[31m-        }[m
[31m-[m
[31m-        s->connection->read->handler = ngx_mail_proxy_handler;[m
[31m-        s->connection->write->handler = ngx_mail_proxy_handler;[m
[31m-        rev->handler = ngx_mail_proxy_handler;[m
[31m-        c->write->handler = ngx_mail_proxy_handler;[m
[31m-[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-        ngx_add_timer(s->connection->read, pcf->timeout);[m
[31m-        ngx_del_timer(c->read);[m
[31m-[m
[31m-        c->log->action = NULL;[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");[m
[31m-[m
[31m-        if (s->buffer->pos == s->buffer->last) {[m
[31m-            ngx_mail_proxy_handler(s->connection->write);[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_mail_proxy_handler(c->write);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-[m
[31m-    default:[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-        ngx_str_null(&line);[m
[31m-#endif[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (c->send(c, line.data, line.len) < (ssize_t) line.len) {[m
[31m-        /*[m
[31m-         * we treat the incomplete sending as NGX_ERROR[m
[31m-         * because it is very strange here[m
[31m-         */[m
[31m-        ngx_mail_proxy_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->proxy->buffer->pos = s->proxy->buffer->start;[m
[31m-    s->proxy->buffer->last = s->proxy->buffer->start;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_dummy_handler(ngx_event_t *wev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0, "mail proxy dummy handler");[m
[31m-[m
[31m-    if (ngx_handle_write_event(wev, 0) != NGX_OK) {[m
[31m-        c = wev->data;[m
[31m-        s = c->data;[m
[31m-[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_proxy_read_response(ngx_mail_session_t *s, ngx_uint_t state)[m
[31m-{[m
[31m-    u_char                 *p, *m;[m
[31m-    ssize_t                 n;[m
[31m-    ngx_buf_t              *b;[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    s->connection->log->action = "reading response from upstream";[m
[31m-[m
[31m-    b = s->proxy->buffer;[m
[31m-[m
[31m-    n = s->proxy->upstream.connection->recv(s->proxy->upstream.connection,[m
[31m-                                            b->last, b->end - b->last);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    b->last += n;[m
[31m-[m
[31m-    if (b->last - b->pos < 4) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (*(b->last - 2) != CR || *(b->last - 1) != LF) {[m
[31m-        if (b->last == b->end) {[m
[31m-            *(b->last - 1) = '\0';[m
[31m-            ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                          "upstream sent too long response line: \"%s\"",[m
[31m-                          b->pos);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    p = b->pos;[m
[31m-[m
[31m-    switch (s->protocol) {[m
[31m-[m
[31m-    case NGX_MAIL_POP3_PROTOCOL:[m
[31m-        if (p[0] == '+' && p[1] == 'O' && p[2] == 'K') {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_MAIL_IMAP_PROTOCOL:[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case ngx_imap_start:[m
[31m-            if (p[0] == '*' && p[1] == ' ' && p[2] == 'O' && p[3] == 'K') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_login:[m
[31m-        case ngx_imap_user:[m
[31m-            if (p[0] == '+') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_imap_passwd:[m
[31m-            if (ngx_strncmp(p, s->tag.data, s->tag.len) == 0) {[m
[31m-                p += s->tag.len;[m
[31m-                if (p[0] == 'O' && p[1] == 'K') {[m
[31m-                    return NGX_OK;[m
[31m-                }[m
[31m-            }[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default: /* NGX_MAIL_SMTP_PROTOCOL */[m
[31m-[m
[31m-        if (p[3] == '-') {[m
[31m-            /* multiline reply, check if we got last line */[m
[31m-[m
[31m-            m = b->last - (sizeof(CRLF "200" CRLF) - 1);[m
[31m-[m
[31m-            while (m > p) {[m
[31m-                if (m[0] == CR && m[1] == LF) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                m--;[m
[31m-            }[m
[31m-[m
[31m-            if (m <= p || m[5] == '-') {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case ngx_smtp_start:[m
[31m-            if (p[0] == '2' && p[1] == '2' && p[2] == '0') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_helo:[m
[31m-        case ngx_smtp_helo_xclient:[m
[31m-        case ngx_smtp_helo_from:[m
[31m-        case ngx_smtp_from:[m
[31m-            if (p[0] == '2' && p[1] == '5' && p[2] == '0') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_xclient:[m
[31m-        case ngx_smtp_xclient_from:[m
[31m-        case ngx_smtp_xclient_helo:[m
[31m-            if (p[0] == '2' && (p[1] == '2' || p[1] == '5') && p[2] == '0') {[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_to:[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-[m
[31m-    if (pcf->pass_error_message == 0) {[m
[31m-        *(b->last - 2) = '\0';[m
[31m-        ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                      "upstream sent invalid response: \"%s\"", p);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->out.len = b->last - p - 2;[m
[31m-    s->out.data = p;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, s->connection->log, 0,[m
[31m-                  "upstream sent invalid response: \"%V\"", &s->out);[m
[31m-[m
[31m-    s->out.len = b->last - b->pos;[m
[31m-    s->out.data = b->pos;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    char                   *action, *recv_action, *send_action;[m
[31m-    size_t                  size;[m
[31m-    ssize_t                 n;[m
[31m-    ngx_buf_t              *b;[m
[31m-    ngx_uint_t              do_write;[m
[31m-    ngx_connection_t       *c, *src, *dst;[m
[31m-    ngx_mail_session_t     *s;[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        c->log->action = "proxying";[m
[31m-[m
[31m-        if (c == s->connection) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "client timed out");[m
[31m-            c->timedout = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "upstream timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c == s->connection) {[m
[31m-        if (ev->write) {[m
[31m-            recv_action = "proxying and reading from upstream";[m
[31m-            send_action = "proxying and sending to client";[m
[31m-            src = s->proxy->upstream.connection;[m
[31m-            dst = c;[m
[31m-            b = s->proxy->buffer;[m
[31m-[m
[31m-        } else {[m
[31m-            recv_action = "proxying and reading from client";[m
[31m-            send_action = "proxying and sending to upstream";[m
[31m-            src = c;[m
[31m-            dst = s->proxy->upstream.connection;[m
[31m-            b = s->buffer;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ev->write) {[m
[31m-            recv_action = "proxying and reading from client";[m
[31m-            send_action = "proxying and sending to upstream";[m
[31m-            src = s->connection;[m
[31m-            dst = c;[m
[31m-            b = s->buffer;[m
[31m-[m
[31m-        } else {[m
[31m-            recv_action = "proxying and reading from upstream";[m
[31m-            send_action = "proxying and sending to client";[m
[31m-            src = c;[m
[31m-            dst = s->connection;[m
[31m-            b = s->proxy->buffer;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    do_write = ev->write ? 1 : 0;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_MAIL, ev->log, 0,[m
[31m-                   "mail proxy handler: %ui, #%d > #%d",[m
[31m-                   do_write, src->fd, dst->fd);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            size = b->last - b->pos;[m
[31m-[m
[31m-            if (size && dst->write->ready) {[m
[31m-                c->log->action = send_action;[m
[31m-[m
[31m-                n = dst->send(dst, b->pos, size);[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    ngx_mail_proxy_close_session(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (n > 0) {[m
[31m-                    b->pos += n;[m
[31m-[m
[31m-                    if (b->pos == b->last) {[m
[31m-                        b->pos = b->start;[m
[31m-                        b->last = b->start;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && src->read->ready) {[m
[31m-            c->log->action = recv_action;[m
[31m-[m
[31m-            n = src->recv(src, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                do_write = 1;[m
[31m-                b->last += n;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                src->read->eof = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "proxying";[m
[31m-[m
[31m-    if ((s->connection->read->eof && s->buffer->pos == s->buffer->last)[m
[31m-        || (s->proxy->upstream.connection->read->eof[m
[31m-            && s->proxy->buffer->pos == s->proxy->buffer->last)[m
[31m-        || (s->connection->read->eof[m
[31m-            && s->proxy->upstream.connection->read->eof))[m
[31m-    {[m
[31m-        action = c->log->action;[m
[31m-        c->log->action = NULL;[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "proxied session done");[m
[31m-        c->log->action = action;[m
[31m-[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(dst->write, 0) != NGX_OK) {[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(dst->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_write_event(src->write, 0) != NGX_OK) {[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(src->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_proxy_close_session(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c == s->connection) {[m
[31m-        pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);[m
[31m-        ngx_add_timer(c->read, pcf->timeout);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_upstream_error(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    if (s->proxy->upstream.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                       "close mail proxy connection: %d",[m
[31m-                       s->proxy->upstream.connection->fd);[m
[31m-[m
[31m-        ngx_close_connection(s->proxy->upstream.connection);[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len == 0) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->quit = 1;[m
[31m-    ngx_mail_send(s->connection->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    if (s->proxy->upstream.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                       "close mail proxy connection: %d",[m
[31m-                       s->proxy->upstream.connection->fd);[m
[31m-[m
[31m-        ngx_close_connection(s->proxy->upstream.connection);[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_session_internal_server_error(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_proxy_close_session(ngx_mail_session_t *s)[m
[31m-{[m
[31m-    if (s->proxy->upstream.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,[m
[31m-                       "close mail proxy connection: %d",[m
[31m-                       s->proxy->upstream.connection->fd);[m
[31m-[m
[31m-        ngx_close_connection(s->proxy->upstream.connection);[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_close_connection(s->connection);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_proxy_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_proxy_conf_t  *pcf;[m
[31m-[m
[31m-    pcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_proxy_conf_t));[m
[31m-    if (pcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    pcf->enable = NGX_CONF_UNSET;[m
[31m-    pcf->pass_error_message = NGX_CONF_UNSET;[m
[31m-    pcf->xclient = NGX_CONF_UNSET;[m
[31m-    pcf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    pcf->timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    return pcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_proxy_conf_t *prev = parent;[m
[31m-    ngx_mail_proxy_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_value(conf->pass_error_message, prev->pass_error_message, 0);[m
[31m-    ngx_conf_merge_value(conf->xclient, prev->xclient, 1);[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 24 * 60 * 60000);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_handler.c[m
[1mdeleted file mode 100644[m
[1mindex 81cc75f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,857 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_smtp_module.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static void ngx_mail_smtp_resolve_name(ngx_event_t *rev);[m
[31m-static void ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static void ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static void ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev);[m
[31m-static ngx_int_t ngx_mail_smtp_create_buffer(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-[m
[31m-static ngx_int_t ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_starttls(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-static ngx_int_t ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-[m
[31m-static ngx_int_t ngx_mail_smtp_discard_command(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c, char *err);[m
[31m-static void ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s,[m
[31m-    ngx_connection_t *c, char *err);[m
[31m-[m
[31m-[m
[31m-static u_char  smtp_ok[] = "250 2.0.0 OK" CRLF;[m
[31m-static u_char  smtp_bye[] = "221 2.0.0 Bye" CRLF;[m
[31m-static u_char  smtp_starttls[] = "220 2.0.0 Start TLS" CRLF;[m
[31m-static u_char  smtp_next[] = "334 " CRLF;[m
[31m-static u_char  smtp_username[] = "334 VXNlcm5hbWU6" CRLF;[m
[31m-static u_char  smtp_password[] = "334 UGFzc3dvcmQ6" CRLF;[m
[31m-static u_char  smtp_invalid_command[] = "500 5.5.1 Invalid command" CRLF;[m
[31m-static u_char  smtp_invalid_pipelining[] =[m
[31m-    "503 5.5.0 Improper use of SMTP command pipelining" CRLF;[m
[31m-static u_char  smtp_invalid_argument[] = "501 5.5.4 Invalid argument" CRLF;[m
[31m-static u_char  smtp_auth_required[] = "530 5.7.1 Authentication required" CRLF;[m
[31m-static u_char  smtp_bad_sequence[] = "503 5.5.1 Bad sequence of commands" CRLF;[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  smtp_unavailable = ngx_string("[UNAVAILABLE]");[m
[31m-static ngx_str_t  smtp_tempunavail = ngx_string("[TEMPUNAVAIL]");[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t        *ctx;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    if (cscf->resolver == NULL) {[m
[31m-        s->host = smtp_unavailable;[m
[31m-        ngx_mail_smtp_greeting(s, c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    if (c->sockaddr->sa_family == AF_UNIX) {[m
[31m-        s->host = smtp_tempunavail;[m
[31m-        ngx_mail_smtp_greeting(s, c);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    c->log->action = "in resolving client address";[m
[31m-[m
[31m-    ctx = ngx_resolve_start(cscf->resolver, NULL);[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->addr.sockaddr = c->sockaddr;[m
[31m-    ctx->addr.socklen = c->socklen;[m
[31m-    ctx->handler = ngx_mail_smtp_resolve_addr_handler;[m
[31m-    ctx->data = s;[m
[31m-    ctx->timeout = cscf->resolver_timeout;[m
[31m-[m
[31m-    if (ngx_resolve_addr(ctx) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    s = ctx->data;[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "%V could not be resolved (%i: %s)",[m
[31m-                      &c->addr_text, ctx->state,[m
[31m-                      ngx_resolver_strerror(ctx->state));[m
[31m-[m
[31m-        if (ctx->state == NGX_RESOLVE_NXDOMAIN) {[m
[31m-            s->host = smtp_unavailable;[m
[31m-[m
[31m-        } else {[m
[31m-            s->host = smtp_tempunavail;[m
[31m-        }[m
[31m-[m
[31m-        ngx_resolve_addr_done(ctx);[m
[31m-[m
[31m-        ngx_mail_smtp_greeting(s, s->connection);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "in resolving client hostname";[m
[31m-[m
[31m-    s->host.data = ngx_pstrdup(c->pool, &ctx->name);[m
[31m-    if (s->host.data == NULL) {[m
[31m-        ngx_resolve_addr_done(ctx);[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->host.len = ctx->name.len;[m
[31m-[m
[31m-    ngx_resolve_addr_done(ctx);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "address resolved: %V", &s->host);[m
[31m-[m
[31m-    c->read->handler = ngx_mail_smtp_resolve_name;[m
[31m-[m
[31m-    ngx_post_event(c->read, &ngx_posted_events);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_resolve_name(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_resolver_ctx_t        *ctx;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-    ctx = ngx_resolve_start(cscf->resolver, NULL);[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->name = s->host;[m
[31m-    ctx->handler = ngx_mail_smtp_resolve_name_handler;[m
[31m-    ctx->data = s;[m
[31m-    ctx->timeout = cscf->resolver_timeout;[m
[31m-[m
[31m-    if (ngx_resolve_name(ctx) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    s = ctx->data;[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "\"%V\" could not be resolved (%i: %s)",[m
[31m-                      &ctx->name, ctx->state,[m
[31m-                      ngx_resolver_strerror(ctx->state));[m
[31m-[m
[31m-        if (ctx->state == NGX_RESOLVE_NXDOMAIN) {[m
[31m-            s->host = smtp_unavailable;[m
[31m-[m
[31m-        } else {[m
[31m-            s->host = smtp_tempunavail;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        u_char     text[NGX_SOCKADDR_STRLEN];[m
[31m-        ngx_str_t  addr;[m
[31m-[m
[31m-        addr.data = text;[m
[31m-[m
[31m-        for (i = 0; i < ctx->naddrs; i++) {[m
[31m-            addr.len = ngx_sock_ntop(ctx->addrs[i].sockaddr,[m
[31m-                                     ctx->addrs[i].socklen,[m
[31m-                                     text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                           "name was resolved to %V", &addr);[m
[31m-        }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        for (i = 0; i < ctx->naddrs; i++) {[m
[31m-            if (ngx_cmp_sockaddr(ctx->addrs[i].sockaddr, ctx->addrs[i].socklen,[m
[31m-                                 c->sockaddr, c->socklen, 0)[m
[31m-                == NGX_OK)[m
[31m-            {[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        s->host = smtp_unavailable;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-[m
[31m-    ngx_mail_smtp_greeting(s, c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_msec_t                 timeout;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "smtp greeting for \"%V\"", &s->host);[m
[31m-[m
[31m-    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-    sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-    timeout = sscf->greeting_delay ? sscf->greeting_delay : cscf->timeout;[m
[31m-    ngx_add_timer(c->read, timeout);[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-    }[m
[31m-[m
[31m-    if (sscf->greeting_delay) {[m
[31m-         c->read->handler = ngx_mail_smtp_invalid_pipelining;[m
[31m-         return;[m
[31m-    }[m
[31m-[m
[31m-    c->read->handler = ngx_mail_smtp_init_protocol;[m
[31m-[m
[31m-    s->out = sscf->greeting;[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_mail_session_t        *s;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    c->log->action = "in delay pipelining state";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "delay greeting");[m
[31m-[m
[31m-        rev->timedout = 0;[m
[31m-[m
[31m-        cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-        c->read->handler = ngx_mail_smtp_init_protocol;[m
[31m-[m
[31m-        ngx_add_timer(c->read, cscf->timeout);[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            ngx_mail_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-        s->out = sscf->greeting;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "invalid pipelining");[m
[31m-[m
[31m-        if (s->buffer == NULL) {[m
[31m-            if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_mail_smtp_discard_command(s, c,[m
[31m-                                "client was rejected before greeting: \"%V\"")[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_str_set(&s->out, smtp_invalid_pipelining);[m
[31m-        s->quit = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_send(c->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_smtp_init_protocol(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-[m
[31m-    c->log->action = "in auth state";[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (s->buffer == NULL) {[m
[31m-        if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->mail_state = ngx_smtp_start;[m
[31m-    c->read->handler = ngx_mail_smtp_auth_state;[m
[31m-[m
[31m-    ngx_mail_smtp_auth_state(rev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) == NGX_ERROR) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-    s->buffer = ngx_create_temp_buf(c->pool, sscf->client_buffer_size);[m
[31m-    if (s->buffer == NULL) {[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_mail_smtp_auth_state(ngx_event_t *rev)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_mail_session_t  *s;[m
[31m-[m
[31m-    c = rev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp auth state");[m
[31m-[m
[31m-    if (rev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");[m
[31m-        c->timedout = 1;[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (s->out.len) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp send handler busy");[m
[31m-        s->blocked = 1;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->blocked = 0;[m
[31m-[m
[31m-    rc = ngx_mail_read_command(s, c);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_set(&s->out, smtp_ok);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        switch (s->mail_state) {[m
[31m-[m
[31m-        case ngx_smtp_start:[m
[31m-[m
[31m-            switch (s->command) {[m
[31m-[m
[31m-            case NGX_SMTP_HELO:[m
[31m-            case NGX_SMTP_EHLO:[m
[31m-                rc = ngx_mail_smtp_helo(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_AUTH:[m
[31m-                rc = ngx_mail_smtp_auth(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_QUIT:[m
[31m-                s->quit = 1;[m
[31m-                ngx_str_set(&s->out, smtp_bye);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_MAIL:[m
[31m-                rc = ngx_mail_smtp_mail(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_RCPT:[m
[31m-                rc = ngx_mail_smtp_rcpt(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_RSET:[m
[31m-                rc = ngx_mail_smtp_rset(s, c);[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_NOOP:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_SMTP_STARTTLS:[m
[31m-                rc = ngx_mail_smtp_starttls(s, c);[m
[31m-                ngx_str_set(&s->out, smtp_starttls);[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                rc = NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_auth_login_username:[m
[31m-            rc = ngx_mail_auth_login_username(s, c, 0);[m
[31m-[m
[31m-            ngx_str_set(&s->out, smtp_password);[m
[31m-            s->mail_state = ngx_smtp_auth_login_password;[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_auth_login_password:[m
[31m-            rc = ngx_mail_auth_login_password(s, c);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_auth_plain:[m
[31m-            rc = ngx_mail_auth_plain(s, c, 0);[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_smtp_auth_cram_md5:[m
[31m-            rc = ngx_mail_auth_cram_md5(s, c);[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (s->buffer->pos < s->buffer->last) {[m
[31m-        s->blocked = 1;[m
[31m-    }[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_DONE:[m
[31m-        ngx_mail_auth(s, c);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-        ngx_mail_session_internal_server_error(s);[m
[31m-        return;[m
[31m-[m
[31m-    case NGX_MAIL_PARSE_INVALID_COMMAND:[m
[31m-        s->mail_state = ngx_smtp_start;[m
[31m-        s->state = 0;[m
[31m-        ngx_str_set(&s->out, smtp_invalid_command);[m
[31m-[m
[31m-        /* fall through */[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-        s->args.nelts = 0;[m
[31m-[m
[31m-        if (s->buffer->pos == s->buffer->last) {[m
[31m-            s->buffer->pos = s->buffer->start;[m
[31m-            s->buffer->last = s->buffer->start;[m
[31m-        }[m
[31m-[m
[31m-        if (s->state) {[m
[31m-            s->arg_start = s->buffer->pos;[m
[31m-        }[m
[31m-[m
[31m-        ngx_mail_send(c->write);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t                 *arg;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    if (s->args.nelts != 1) {[m
[31m-        ngx_str_set(&s->out, smtp_invalid_argument);[m
[31m-        s->state = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-[m
[31m-    s->smtp_helo.len = arg[0].len;[m
[31m-[m
[31m-    s->smtp_helo.data = ngx_pnalloc(c->pool, arg[0].len);[m
[31m-    if (s->smtp_helo.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->smtp_helo.data, arg[0].data, arg[0].len);[m
[31m-[m
[31m-    ngx_str_null(&s->smtp_from);[m
[31m-    ngx_str_null(&s->smtp_to);[m
[31m-[m
[31m-    sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-    if (s->command == NGX_SMTP_HELO) {[m
[31m-        s->out = sscf->server_name;[m
[31m-[m
[31m-    } else {[m
[31m-        s->esmtp = 1;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-[m
[31m-        if (c->ssl == NULL) {[m
[31m-            ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-            sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-[m
[31m-            if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) {[m
[31m-                s->out = sscf->starttls_capability;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) {[m
[31m-                s->out = sscf->starttls_only_capability;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        s->out = sscf->capability;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    if (ngx_mail_starttls_only(s, c)) {[m
[31m-        return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        ngx_str_set(&s->out, smtp_invalid_argument);[m
[31m-        s->state = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_mail_auth_parse(s, c);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, smtp_username);[m
[31m-        s->mail_state = ngx_smtp_auth_login_username;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_LOGIN_USERNAME:[m
[31m-[m
[31m-        ngx_str_set(&s->out, smtp_password);[m
[31m-        s->mail_state = ngx_smtp_auth_login_password;[m
[31m-[m
[31m-        return ngx_mail_auth_login_username(s, c, 1);[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_PLAIN:[m
[31m-[m
[31m-        ngx_str_set(&s->out, smtp_next);[m
[31m-        s->mail_state = ngx_smtp_auth_plain;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-    case NGX_MAIL_AUTH_CRAM_MD5:[m
[31m-[m
[31m-        sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-        if (!(sscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) {[m
[31m-            return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-        }[m
[31m-[m
[31m-        if (s->salt.data == NULL) {[m
[31m-            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);[m
[31m-[m
[31m-            if (ngx_mail_salt(s, c, cscf) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_mail_auth_cram_md5_salt(s, c, "334 ", 4) == NGX_OK) {[m
[31m-            s->mail_state = ngx_smtp_auth_cram_md5;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t                 *arg, cmd;[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module);[m
[31m-[m
[31m-    if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) {[m
[31m-        ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\"");[m
[31m-        ngx_str_set(&s->out, smtp_auth_required);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* auth none */[m
[31m-[m
[31m-    if (s->smtp_from.len) {[m
[31m-        ngx_str_set(&s->out, smtp_bad_sequence);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        ngx_str_set(&s->out, smtp_invalid_argument);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-    arg += s->args.nelts - 1;[m
[31m-[m
[31m-    cmd.len = arg->data + arg->len - s->cmd.data;[m
[31m-    cmd.data = s->cmd.data;[m
[31m-[m
[31m-    s->smtp_from.len = cmd.len;[m
[31m-[m
[31m-    s->smtp_from.data = ngx_pnalloc(c->pool, cmd.len);[m
[31m-    if (s->smtp_from.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->smtp_from.data, cmd.data, cmd.len);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "smtp mail from:\"%V\"", &s->smtp_from);[m
[31m-[m
[31m-    ngx_str_set(&s->out, smtp_ok);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_t  *arg, cmd;[m
[31m-[m
[31m-    if (s->smtp_from.len == 0) {[m
[31m-        ngx_str_set(&s->out, smtp_bad_sequence);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (s->args.nelts == 0) {[m
[31m-        ngx_str_set(&s->out, smtp_invalid_argument);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    arg = s->args.elts;[m
[31m-    arg += s->args.nelts - 1;[m
[31m-[m
[31m-    cmd.len = arg->data + arg->len - s->cmd.data;[m
[31m-    cmd.data = s->cmd.data;[m
[31m-[m
[31m-    s->smtp_to.len = cmd.len;[m
[31m-[m
[31m-    s->smtp_to.data = ngx_pnalloc(c->pool, cmd.len);[m
[31m-    if (s->smtp_to.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(s->smtp_to.data, cmd.data, cmd.len);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0,[m
[31m-                   "smtp rcpt to:\"%V\"", &s->smtp_to);[m
[31m-[m
[31m-    s->auth_method = NGX_MAIL_AUTH_NONE;[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_str_null(&s->smtp_from);[m
[31m-    ngx_str_null(&s->smtp_to);[m
[31m-    ngx_str_set(&s->out, smtp_ok);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_starttls(ngx_mail_session_t *s, ngx_connection_t *c)[m
[31m-{[m
[31m-#if (NGX_MAIL_SSL)[m
[31m-    ngx_mail_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (c->ssl == NULL) {[m
[31m-        sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module);[m
[31m-        if (sslcf->starttls) {[m
[31m-[m
[31m-            /*[m
[31m-             * RFC3207 requires us to discard any knowledge[m
[31m-             * obtained from client before STARTTLS.[m
[31m-             */[m
[31m-[m
[31m-            ngx_str_null(&s->smtp_helo);[m
[31m-            ngx_str_null(&s->smtp_from);[m
[31m-            ngx_str_null(&s->smtp_to);[m
[31m-[m
[31m-            s->buffer->pos = s->buffer->start;[m
[31m-            s->buffer->last = s->buffer->start;[m
[31m-[m
[31m-            c->read->handler = ngx_mail_starttls_handler;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_MAIL_PARSE_INVALID_COMMAND;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_mail_smtp_discard_command(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    char *err)[m
[31m-{[m
[31m-    ssize_t    n;[m
[31m-[m
[31m-    n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == 0) {[m
[31m-        ngx_mail_close_connection(c);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        s->buffer->last += n;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            ngx_mail_session_internal_server_error(s);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_mail_smtp_log_rejected_command(s, c, err);[m
[31m-[m
[31m-    s->buffer->pos = s->buffer->start;[m
[31m-    s->buffer->last = s->buffer->start;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s, ngx_connection_t *c,[m
[31m-    char *err)[m
[31m-{[m
[31m-    u_char      ch;[m
[31m-    ngx_str_t   cmd;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    if (c->log->log_level < NGX_LOG_INFO) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cmd.len = s->buffer->last - s->buffer->start;[m
[31m-    cmd.data = s->buffer->start;[m
[31m-[m
[31m-    for (i = 0; i < cmd.len; i++) {[m
[31m-        ch = cmd.data[i];[m
[31m-[m
[31m-        if (ch != CR && ch != LF) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cmd.data[i] = '_';[m
[31m-    }[m
[31m-[m
[31m-    cmd.len = i;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, err, &cmd);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_module.c[m
[1mdeleted file mode 100644[m
[1mindex d5bb51c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,309 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_smtp_module.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_mail_smtp_auth_methods[] = {[m
[31m-    { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED },[m
[31m-    { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED },[m
[31m-    { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED },[m
[31m-    { ngx_string("none"), NGX_MAIL_AUTH_NONE_ENABLED },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_mail_smtp_auth_methods_names[] = {[m
[31m-    ngx_string("PLAIN"),[m
[31m-    ngx_string("LOGIN"),[m
[31m-    ngx_null_string,  /* APOP */[m
[31m-    ngx_string("CRAM-MD5"),[m
[31m-    ngx_null_string   /* NONE */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_protocol_t  ngx_mail_smtp_protocol = {[m
[31m-    ngx_string("smtp"),[m
[31m-    { 25, 465, 587, 0 },[m
[31m-    NGX_MAIL_SMTP_PROTOCOL,[m
[31m-[m
[31m-    ngx_mail_smtp_init_session,[m
[31m-    ngx_mail_smtp_init_protocol,[m
[31m-    ngx_mail_smtp_parse_command,[m
[31m-    ngx_mail_smtp_auth_state,[m
[31m-[m
[31m-    ngx_string("451 4.3.2 Internal server error" CRLF),[m
[31m-    ngx_string("421 4.7.1 SSL certificate error" CRLF),[m
[31m-    ngx_string("421 4.7.1 No required SSL certificate" CRLF)[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_smtp_commands[] = {[m
[31m-[m
[31m-    { ngx_string("smtp_client_buffer"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_smtp_srv_conf_t, client_buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("smtp_greeting_delay"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_smtp_srv_conf_t, greeting_delay),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("smtp_capabilities"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_mail_capabilities,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_smtp_srv_conf_t, capabilities),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("smtp_auth"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_smtp_srv_conf_t, auth_methods),[m
[31m-      &ngx_mail_smtp_auth_methods },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_smtp_module_ctx = {[m
[31m-    &ngx_mail_smtp_protocol,               /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_smtp_create_srv_conf,         /* create server configuration */[m
[31m-    ngx_mail_smtp_merge_srv_conf           /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_smtp_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_smtp_module_ctx,             /* module context */[m
[31m-    ngx_mail_smtp_commands,                /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_smtp_srv_conf_t  *sscf;[m
[31m-[m
[31m-    sscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_smtp_srv_conf_t));[m
[31m-    if (sscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    sscf->client_buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    sscf->greeting_delay = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    if (ngx_array_init(&sscf->capabilities, cf->pool, 4, sizeof(ngx_str_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return sscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_smtp_srv_conf_t *prev = parent;[m
[31m-    ngx_mail_smtp_srv_conf_t *conf = child;[m
[31m-[m
[31m-    u_char                    *p, *auth, *last;[m
[31m-    size_t                     size;[m
[31m-    ngx_str_t                 *c;[m
[31m-    ngx_uint_t                 i, m, auth_enabled;[m
[31m-    ngx_mail_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->client_buffer_size,[m
[31m-                              prev->client_buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->greeting_delay,[m
[31m-                              prev->greeting_delay, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->auth_methods,[m
[31m-                              prev->auth_methods,[m
[31m-                              (NGX_CONF_BITMASK_SET[m
[31m-                               |NGX_MAIL_AUTH_PLAIN_ENABLED[m
[31m-                               |NGX_MAIL_AUTH_LOGIN_ENABLED));[m
[31m-[m
[31m-[m
[31m-    cscf = ngx_mail_conf_get_module_srv_conf(cf, ngx_mail_core_module);[m
[31m-[m
[31m-    size = sizeof("220  ESMTP ready" CRLF) - 1 + cscf->server_name.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->greeting.len = size;[m
[31m-    conf->greeting.data = p;[m
[31m-[m
[31m-    *p++ = '2'; *p++ = '2'; *p++ = '0'; *p++ = ' ';[m
[31m-    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);[m
[31m-    ngx_memcpy(p, " ESMTP ready" CRLF, sizeof(" ESMTP ready" CRLF) - 1);[m
[31m-[m
[31m-[m
[31m-    size = sizeof("250 " CRLF) - 1 + cscf->server_name.len;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->server_name.len = size;[m
[31m-    conf->server_name.data = p;[m
[31m-[m
[31m-    *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' ';[m
[31m-    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);[m
[31m-    *p++ = CR; *p = LF;[m
[31m-[m
[31m-[m
[31m-    if (conf->capabilities.nelts == 0) {[m
[31m-        conf->capabilities = prev->capabilities;[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof("250-") - 1 + cscf->server_name.len + sizeof(CRLF) - 1;[m
[31m-[m
[31m-    c = conf->capabilities.elts;[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        size += sizeof("250 ") - 1 + c[i].len + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    auth_enabled = 0;[m
[31m-[m
[31m-    for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;[m
[31m-         m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;[m
[31m-         m <<= 1, i++)[m
[31m-    {[m
[31m-        if (m & conf->auth_methods) {[m
[31m-            size += 1 + ngx_mail_smtp_auth_methods_names[i].len;[m
[31m-            auth_enabled = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (auth_enabled) {[m
[31m-        size += sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->capability.len = size;[m
[31m-    conf->capability.data = p;[m
[31m-[m
[31m-    last = p;[m
[31m-[m
[31m-    *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-';[m
[31m-    p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);[m
[31m-    *p++ = CR; *p++ = LF;[m
[31m-[m
[31m-    for (i = 0; i < conf->capabilities.nelts; i++) {[m
[31m-        last = p;[m
[31m-        *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-';[m
[31m-        p = ngx_cpymem(p, c[i].data, c[i].len);[m
[31m-        *p++ = CR; *p++ = LF;[m
[31m-    }[m
[31m-[m
[31m-    auth = p;[m
[31m-[m
[31m-    if (auth_enabled) {[m
[31m-        last = p;[m
[31m-[m
[31m-        *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' ';[m
[31m-        *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H';[m
[31m-[m
[31m-        for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0;[m
[31m-             m <= NGX_MAIL_AUTH_CRAM_MD5_ENABLED;[m
[31m-             m <<= 1, i++)[m
[31m-        {[m
[31m-            if (m & conf->auth_methods) {[m
[31m-                *p++ = ' ';[m
[31m-                p = ngx_cpymem(p, ngx_mail_smtp_auth_methods_names[i].data,[m
[31m-                               ngx_mail_smtp_auth_methods_names[i].len);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        *p++ = CR; *p = LF;[m
[31m-[m
[31m-    } else {[m
[31m-        last[3] = ' ';[m
[31m-    }[m
[31m-[m
[31m-    size += sizeof("250 STARTTLS" CRLF) - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_capability.len = size;[m
[31m-    conf->starttls_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data, conf->capability.len);[m
[31m-[m
[31m-    p = ngx_cpymem(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);[m
[31m-[m
[31m-    p = conf->starttls_capability.data[m
[31m-        + (last - conf->capability.data) + 3;[m
[31m-    *p = '-';[m
[31m-[m
[31m-    size = (auth - conf->capability.data)[m
[31m-            + sizeof("250 STARTTLS" CRLF) - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(cf->pool, size);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf->starttls_only_capability.len = size;[m
[31m-    conf->starttls_only_capability.data = p;[m
[31m-[m
[31m-    p = ngx_cpymem(p, conf->capability.data, auth - conf->capability.data);[m
[31m-[m
[31m-    ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1);[m
[31m-[m
[31m-    if (last < auth) {[m
[31m-        p = conf->starttls_only_capability.data[m
[31m-            + (last - conf->capability.data) + 3;[m
[31m-        *p = '-';[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_module.h[m
[1mdeleted file mode 100644[m
[1mindex 04ffab6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_smtp_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_SMTP_MODULE_H_INCLUDED_[m
[31m-#define _NGX_MAIL_SMTP_MODULE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-#include <ngx_mail_smtp_module.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_msec_t   greeting_delay;[m
[31m-[m
[31m-    size_t       client_buffer_size;[m
[31m-[m
[31m-    ngx_str_t    capability;[m
[31m-    ngx_str_t    starttls_capability;[m
[31m-    ngx_str_t    starttls_only_capability;[m
[31m-[m
[31m-    ngx_str_t    server_name;[m
[31m-    ngx_str_t    greeting;[m
[31m-[m
[31m-    ngx_uint_t   auth_methods;[m
[31m-[m
[31m-    ngx_array_t  capabilities;[m
[31m-} ngx_mail_smtp_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-void ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c);[m
[31m-void ngx_mail_smtp_init_protocol(ngx_event_t *rev);[m
[31m-void ngx_mail_smtp_auth_state(ngx_event_t *rev);[m
[31m-ngx_int_t ngx_mail_smtp_parse_command(ngx_mail_session_t *s);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_mail_smtp_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_ssl_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_ssl_module.c[m
[1mdeleted file mode 100644[m
[1mindex ff5c141..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_ssl_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,657 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_DEFAULT_CIPHERS     "HIGH:!aNULL:!MD5"[m
[31m-#define NGX_DEFAULT_ECDH_CURVE  "prime256v1"[m
[31m-[m
[31m-[m
[31m-static void *ngx_mail_ssl_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child);[m
[31m-[m
[31m-static char *ngx_mail_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_ssl_starttls(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_mail_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_mail_starttls_state[] = {[m
[31m-    { ngx_string("off"), NGX_MAIL_STARTTLS_OFF },[m
[31m-    { ngx_string("on"), NGX_MAIL_STARTTLS_ON },[m
[31m-    { ngx_string("only"), NGX_MAIL_STARTTLS_ONLY },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_mail_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_mail_ssl_verify[] = {[m
[31m-    { ngx_string("off"), 0 },[m
[31m-    { ngx_string("on"), 1 },[m
[31m-    { ngx_string("optional"), 2 },[m
[31m-    { ngx_string("optional_no_ca"), 3 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_mail_ssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_mail_ssl_enable,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("starttls"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_mail_ssl_starttls,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, starttls),[m
[31m-      ngx_mail_starttls_state },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_key"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_password_file"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_mail_ssl_password_file,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_dhparam"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, dhparam),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_ecdh_curve"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, ecdh_curve),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_protocols"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, protocols),[m
[31m-      &ngx_mail_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("ssl_ciphers"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_prefer_server_ciphers"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, prefer_server_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_cache"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_mail_ssl_session_cache,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_tickets"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, session_tickets),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_ticket_key"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, session_ticket_keys),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_timeout"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, session_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_verify_client"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, verify),[m
[31m-      &ngx_mail_ssl_verify },[m
[31m-[m
[31m-    { ngx_string("ssl_verify_depth"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_client_certificate"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, client_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_trusted_certificate"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_crl"),[m
[31m-      NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_MAIL_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_mail_ssl_conf_t, crl),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_mail_module_t  ngx_mail_ssl_module_ctx = {[m
[31m-    NULL,                                  /* protocol */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_mail_ssl_create_conf,              /* create server configuration */[m
[31m-    ngx_mail_ssl_merge_conf                /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_mail_ssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_mail_ssl_module_ctx,              /* module context */[m
[31m-    ngx_mail_ssl_commands,                 /* module directives */[m
[31m-    NGX_MAIL_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_mail_ssl_sess_id_ctx = ngx_string("MAIL");[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_mail_ssl_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf;[m
[31m-[m
[31m-    scf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_ssl_conf_t));[m
[31m-    if (scf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     scf->protocols = 0;[m
[31m-     *     scf->certificate = { 0, NULL };[m
[31m-     *     scf->certificate_key = { 0, NULL };[m
[31m-     *     scf->dhparam = { 0, NULL };[m
[31m-     *     scf->ecdh_curve = { 0, NULL };[m
[31m-     *     scf->client_certificate = { 0, NULL };[m
[31m-     *     scf->trusted_certificate = { 0, NULL };[m
[31m-     *     scf->crl = { 0, NULL };[m
[31m-     *     scf->ciphers = { 0, NULL };[m
[31m-     *     scf->shm_zone = NULL;[m
[31m-     */[m
[31m-[m
[31m-    scf->enable = NGX_CONF_UNSET;[m
[31m-    scf->starttls = NGX_CONF_UNSET_UINT;[m
[31m-    scf->passwords = NGX_CONF_UNSET_PTR;[m
[31m-    scf->prefer_server_ciphers = NGX_CONF_UNSET;[m
[31m-    scf->verify = NGX_CONF_UNSET_UINT;[m
[31m-    scf->verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    scf->builtin_session_cache = NGX_CONF_UNSET;[m
[31m-    scf->session_timeout = NGX_CONF_UNSET;[m
[31m-    scf->session_tickets = NGX_CONF_UNSET;[m
[31m-    scf->session_ticket_keys = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return scf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t *prev = parent;[m
[31m-    ngx_mail_ssl_conf_t *conf = child;[m
[31m-[m
[31m-    char                *mode;[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->enable, prev->enable, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->starttls, prev->starttls,[m
[31m-                         NGX_MAIL_STARTTLS_OFF);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_timeout,[m
[31m-                         prev->session_timeout, 300);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->prefer_server_ciphers,[m
[31m-                         prev->prefer_server_ciphers, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,[m
[31m-                         (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                          |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->verify, prev->verify, 0);[m
[31m-    ngx_conf_merge_uint_value(conf->verify_depth, prev->verify_depth, 1);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->certificate, prev->certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->certificate_key, prev->certificate_key, "");[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve,[m
[31m-                         NGX_DEFAULT_ECDH_CURVE);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->client_certificate,[m
[31m-                         prev->client_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->trusted_certificate,[m
[31m-                         prev->trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->crl, prev->crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);[m
[31m-[m
[31m-[m
[31m-    conf->ssl.log = cf->log;[m
[31m-[m
[31m-    if (conf->enable) {[m
[31m-        mode = "ssl";[m
[31m-[m
[31m-    } else if (conf->starttls != NGX_MAIL_STARTTLS_OFF) {[m
[31m-        mode = "starttls";[m
[31m-[m
[31m-    } else {[m
[31m-        mode = "";[m
[31m-    }[m
[31m-[m
[31m-    if (conf->file == NULL) {[m
[31m-        conf->file = prev->file;[m
[31m-        conf->line = prev->line;[m
[31m-    }[m
[31m-[m
[31m-    if (*mode) {[m
[31m-[m
[31m-        if (conf->certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined for "[m
[31m-                          "the \"%s\" directive in %s:%ui",[m
[31m-                          mode, conf->file, conf->line);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate_key\" is defined for "[m
[31m-                          "the \"%s\" directive in %s:%ui",[m
[31m-                          mode, conf->file, conf->line);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (conf->certificate.len == 0) {[m
[31m-            return NGX_CONF_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (conf->certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"",[m
[31m-                          &conf->certificate);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create(&conf->ssl, conf->protocols, NULL) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = &conf->ssl;[m
[31m-[m
[31m-    if (ngx_ssl_certificate(cf, &conf->ssl, &conf->certificate,[m
[31m-                            &conf->certificate_key, conf->passwords)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->verify) {[m
[31m-[m
[31m-        if (conf->client_certificate.len == 0 && conf->verify != 3) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no ssl_client_certificate for ssl_client_verify");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_client_certificate(cf, &conf->ssl,[m
[31m-                                       &conf->client_certificate,[m
[31m-                                       conf->verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, &conf->ssl,[m
[31m-                                        &conf->trusted_certificate,[m
[31m-                                        conf->verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, &conf->ssl, &conf->crl) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(conf->ssl.ctx,[m
[31m-                                (const char *) conf->ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &conf->ciphers);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->prefer_server_ciphers) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100001L && !defined LIBRESSL_VERSION_NUMBER)[m
[31m-    SSL_CTX_set_tmp_rsa_callback(conf->ssl.ctx, ngx_ssl_rsa512_key_callback);[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->builtin_session_cache,[m
[31m-                         prev->builtin_session_cache, NGX_SSL_NONE_SCACHE);[m
[31m-[m
[31m-    if (conf->shm_zone == NULL) {[m
[31m-        conf->shm_zone = prev->shm_zone;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_session_cache(&conf->ssl, &ngx_mail_ssl_sess_id_ctx,[m
[31m-                              conf->builtin_session_cache,[m
[31m-                              conf->shm_zone, conf->session_timeout)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_tickets,[m
[31m-                         prev->session_tickets, 1);[m
[31m-[m
[31m-#ifdef SSL_OP_NO_TICKET[m
[31m-    if (!conf->session_tickets) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->session_ticket_keys,[m
[31m-                         prev->session_ticket_keys, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_enable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    char  *rv;[m
[31m-[m
[31m-    rv = ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->enable && (ngx_int_t) scf->starttls > NGX_MAIL_STARTTLS_OFF) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "\"starttls\" directive conflicts with \"ssl on\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    scf->file = cf->conf_file->file.name.data;[m
[31m-    scf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_starttls(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    char  *rv;[m
[31m-[m
[31m-    rv = ngx_conf_set_enum_slot(cf, cmd, conf);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->enable == 1 && (ngx_int_t) scf->starttls > NGX_MAIL_STARTTLS_OFF) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "\"ssl\" directive conflicts with \"starttls\"");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    scf->file = cf->conf_file->file.name.data;[m
[31m-    scf->line = cf->conf_file->line;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (scf->passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    scf->passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (scf->passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_mail_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_mail_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    size_t       len;[m
[31m-    ngx_str_t   *value, name, size;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i, j;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_NO_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "none") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_NONE_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "builtin") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("builtin:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            n = ngx_atoi(value[i].data + sizeof("builtin:") - 1,[m
[31m-                         value[i].len - (sizeof("builtin:") - 1));[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            scf->builtin_session_cache = n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("shared:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            len = 0;[m
[31m-[m
[31m-            for (j = sizeof("shared:") - 1; j < value[i].len; j++) {[m
[31m-                if (value[i].data[j] == ':') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                len++;[m
[31m-            }[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            name.len = len;[m
[31m-            name.data = value[i].data + sizeof("shared:") - 1;[m
[31m-[m
[31m-            size.len = value[i].len - j - 1;[m
[31m-            size.data = name.data + len + 1;[m
[31m-[m
[31m-            n = ngx_parse_size(&size);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (n < (ngx_int_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "session cache \"%V\" is too small",[m
[31m-                                   &value[i]);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            scf->shm_zone = ngx_shared_memory_add(cf, &name, n,[m
[31m-                                                   &ngx_mail_ssl_module);[m
[31m-            if (scf->shm_zone == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            scf->shm_zone->init = ngx_ssl_session_cache_init;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->shm_zone && scf->builtin_session_cache == NGX_CONF_UNSET) {[m
[31m-        scf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid session cache \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_ssl_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_ssl_module.h[m
[1mdeleted file mode 100644[m
[1mindex 296a6a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/mail/ngx_mail_ssl_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_MAIL_SSL_H_INCLUDED_[m
[31m-#define _NGX_MAIL_SSL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_mail.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MAIL_STARTTLS_OFF   0[m
[31m-#define NGX_MAIL_STARTTLS_ON    1[m
[31m-#define NGX_MAIL_STARTTLS_ONLY  2[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_flag_t       enable;[m
[31m-    ngx_flag_t       prefer_server_ciphers;[m
[31m-[m
[31m-    ngx_ssl_t        ssl;[m
[31m-[m
[31m-    ngx_uint_t       starttls;[m
[31m-    ngx_uint_t       protocols;[m
[31m-[m
[31m-    ngx_uint_t       verify;[m
[31m-    ngx_uint_t       verify_depth;[m
[31m-[m
[31m-    ssize_t          builtin_session_cache;[m
[31m-[m
[31m-    time_t           session_timeout;[m
[31m-[m
[31m-    ngx_str_t        certificate;[m
[31m-    ngx_str_t        certificate_key;[m
[31m-    ngx_str_t        dhparam;[m
[31m-    ngx_str_t        ecdh_curve;[m
[31m-    ngx_str_t        client_certificate;[m
[31m-    ngx_str_t        trusted_certificate;[m
[31m-    ngx_str_t        crl;[m
[31m-[m
[31m-    ngx_str_t        ciphers;[m
[31m-[m
[31m-    ngx_array_t     *passwords;[m
[31m-[m
[31m-    ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-    ngx_flag_t       session_tickets;[m
[31m-    ngx_array_t     *session_ticket_keys;[m
[31m-[m
[31m-    u_char          *file;[m
[31m-    ngx_uint_t       line;[m
[31m-} ngx_mail_ssl_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_mail_ssl_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_MAIL_SSL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/misc/ngx_cpp_test_module.cpp b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/misc/ngx_cpp_test_module.cpp[m
[1mdeleted file mode 100644[m
[1mindex 5d2f08d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/misc/ngx_cpp_test_module.cpp[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-[m
[31m-// stub module to test header files' C++ compatibility[m
[31m-[m
[31m-extern "C" {[m
[31m-  #include <ngx_config.h>[m
[31m-  #include <ngx_core.h>[m
[31m-  #include <ngx_event.h>[m
[31m-  #include <ngx_event_connect.h>[m
[31m-  #include <ngx_event_pipe.h>[m
[31m-[m
[31m-  #include <ngx_http.h>[m
[31m-[m
[31m-  #include <ngx_mail.h>[m
[31m-  #include <ngx_mail_pop3_module.h>[m
[31m-  #include <ngx_mail_imap_module.h>[m
[31m-  #include <ngx_mail_smtp_module.h>[m
[31m-}[m
[31m-[m
[31m-// nginx header files should go before other, because they define 64-bit off_t[m
[31m-// #include <string>[m
[31m-[m
[31m-[m
[31m-void ngx_cpp_test_handler(void *data);[m
[31m-[m
[31m-void[m
[31m-ngx_cpp_test_handler(void *data)[m
[31m-{[m
[31m-    return;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/misc/ngx_google_perftools_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/misc/ngx_google_perftools_module.c[m
[1mdeleted file mode 100644[m
[1mindex f2f8221..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/misc/ngx_google_perftools_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,126 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-/*[m
[31m- * declare Profiler interface here because[m
[31m- * <google/profiler.h> is C++ header file[m
[31m- */[m
[31m-[m
[31m-int ProfilerStart(u_char* fname);[m
[31m-void ProfilerStop(void);[m
[31m-void ProfilerRegisterThread(void);[m
[31m-[m
[31m-[m
[31m-static void *ngx_google_perftools_create_conf(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_google_perftools_worker(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t  profiles;[m
[31m-} ngx_google_perftools_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_google_perftools_commands[] = {[m
[31m-[m
[31m-    { ngx_string("google_perftools_profiles"),[m
[31m-      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      0,[m
[31m-      offsetof(ngx_google_perftools_conf_t, profiles),[m
[31m-      NULL },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_google_perftools_module_ctx = {[m
[31m-    ngx_string("google_perftools"),[m
[31m-    ngx_google_perftools_create_conf,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_google_perftools_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_google_perftools_module_ctx,      /* module context */[m
[31m-    ngx_google_perftools_commands,         /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    ngx_google_perftools_worker,           /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_google_perftools_create_conf(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_google_perftools_conf_t  *gptcf;[m
[31m-[m
[31m-    gptcf = ngx_pcalloc(cycle->pool, sizeof(ngx_google_perftools_conf_t));[m
[31m-    if (gptcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc()[m
[31m-     *[m
[31m-     *     gptcf->profiles = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    return gptcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_google_perftools_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_char                       *profile;[m
[31m-    ngx_google_perftools_conf_t  *gptcf;[m
[31m-[m
[31m-    gptcf = (ngx_google_perftools_conf_t *)[m
[31m-                ngx_get_conf(cycle->conf_ctx, ngx_google_perftools_module);[m
[31m-[m
[31m-    if (gptcf->profiles.len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    profile = ngx_alloc(gptcf->profiles.len + NGX_INT_T_LEN + 2, cycle->log);[m
[31m-    if (profile == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (getenv("CPUPROFILE")) {[m
[31m-        /* disable inherited Profiler enabled in master process */[m
[31m-        ProfilerStop();[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(profile, "%V.%d%Z", &gptcf->profiles, ngx_pid);[m
[31m-[m
[31m-    if (ProfilerStart(profile)) {[m
[31m-        /* start ITIMER_PROF timer */[m
[31m-        ProfilerRegisterThread();[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,[m
[31m-                      "ProfilerStart(%s) failed", profile);[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(profile);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* ProfilerStop() is called on Profiler destruction */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_alloc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_alloc.c[m
[1mdeleted file mode 100644[m
[1mindex 5c2f787..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_alloc.c[m
[1m+++ /dev/null[m
[36m@@ -1,90 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_pagesize;[m
[31m-ngx_uint_t  ngx_pagesize_shift;[m
[31m-ngx_uint_t  ngx_cacheline_size;[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_alloc(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = malloc(size);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "malloc(%uz) failed", size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *[m
[31m-ngx_calloc(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = ngx_alloc(size, log);[m
[31m-[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_MEMALIGN)[m
[31m-[m
[31m-void *[m
[31m-ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-    int    err;[m
[31m-[m
[31m-    err = posix_memalign(&p, alignment, size);[m
[31m-[m
[31m-    if (err) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                      "posix_memalign(%uz, %uz) failed", alignment, size);[m
[31m-        p = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,[m
[31m-                   "posix_memalign: %p:%uz @%uz", p, size, alignment);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_MEMALIGN)[m
[31m-[m
[31m-void *[m
[31m-ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = memalign(alignment, size);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "memalign(%uz, %uz) failed", alignment, size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,[m
[31m-                   "memalign: %p:%uz @%uz", p, size, alignment);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_alloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_alloc.h[m
[1mdeleted file mode 100644[m
[1mindex 655db25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_alloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ALLOC_H_INCLUDED_[m
[31m-#define _NGX_ALLOC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void *ngx_alloc(size_t size, ngx_log_t *log);[m
[31m-void *ngx_calloc(size_t size, ngx_log_t *log);[m
[31m-[m
[31m-#define ngx_free          free[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Linux has memalign() or posix_memalign()[m
[31m- * Solaris has memalign()[m
[31m- * FreeBSD 7.0 has posix_memalign(), besides, early version's malloc()[m
[31m- * aligns allocations bigger than page size at the page boundary[m
[31m- */[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_MEMALIGN || NGX_HAVE_MEMALIGN)[m
[31m-[m
[31m-void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_memalign(alignment, size, log)  ngx_alloc(size, log)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t  ngx_pagesize;[m
[31m-extern ngx_uint_t  ngx_pagesize_shift;[m
[31m-extern ngx_uint_t  ngx_cacheline_size;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ALLOC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_atomic.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_atomic.h[m
[1mdeleted file mode 100644[m
[1mindex 74b8b7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_atomic.h[m
[1m+++ /dev/null[m
[36m@@ -1,313 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ATOMIC_H_INCLUDED_[m
[31m-#define _NGX_ATOMIC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_LIBATOMIC)[m
[31m-[m
[31m-#define AO_REQUIRE_CAS[m
[31m-#include <atomic_ops.h>[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-typedef long                        ngx_atomic_int_t;[m
[31m-typedef AO_t                        ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-#else[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, new)                                    \[m
[31m-    AO_compare_and_swap(lock, old, new)[m
[31m-#define ngx_atomic_fetch_add(value, add)                                      \[m
[31m-    AO_fetch_and_add(value, add)[m
[31m-#define ngx_memory_barrier()        AO_nop()[m
[31m-#define ngx_cpu_pause()[m
[31m-[m
[31m-[m
[31m-#elif (NGX_DARWIN_ATOMIC)[m
[31m-[m
[31m-/*[m
[31m- * use Darwin 8 atomic(3) and barrier(3) operations[m
[31m- * optimized at run-time for UP and SMP[m
[31m- */[m
[31m-[m
[31m-#include <libkern/OSAtomic.h>[m
[31m-[m
[31m-/* "bool" conflicts with perl's CORE/handy.h */[m
[31m-#if 0[m
[31m-#undef bool[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-typedef int64_t                     ngx_atomic_int_t;[m
[31m-typedef uint64_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, new)                                    \[m
[31m-    OSAtomicCompareAndSwap64Barrier(old, new, (int64_t *) lock)[m
[31m-[m
[31m-#define ngx_atomic_fetch_add(value, add)                                      \[m
[31m-    (OSAtomicAdd64(add, (int64_t *) value) - add)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, new)                                    \[m
[31m-    OSAtomicCompareAndSwap32Barrier(old, new, (int32_t *) lock)[m
[31m-[m
[31m-#define ngx_atomic_fetch_add(value, add)                                      \[m
[31m-    (OSAtomicAdd32(add, (int32_t *) value) - add)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_memory_barrier()        OSMemoryBarrier()[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[31m-[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-[m
[31m-#elif (NGX_HAVE_GCC_ATOMIC)[m
[31m-[m
[31m-/* GCC 4.1 builtin atomic operations */[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-typedef long                        ngx_atomic_int_t;[m
[31m-typedef unsigned long               ngx_atomic_uint_t;[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-#else[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-#endif[m
[31m-[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, set)                                    \[m
[31m-    __sync_bool_compare_and_swap(lock, old, set)[m
[31m-[m
[31m-#define ngx_atomic_fetch_add(value, add)                                      \[m
[31m-    __sync_fetch_and_add(value, add)[m
[31m-[m
[31m-#define ngx_memory_barrier()        __sync_synchronize()[m
[31m-[m
[31m-#if ( __i386__ || __i386 || __amd64__ || __amd64 )[m
[31m-#define ngx_cpu_pause()             __asm__ ("pause")[m
[31m-#else[m
[31m-#define ngx_cpu_pause()[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif ( __i386__ || __i386 )[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-[m
[31m-#if ( __SUNPRO_C )[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set);[m
[31m-[m
[31m-ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add);[m
[31m-[m
[31m-/*[m
[31m- * Sun Studio 12 exits with segmentation fault on '__asm ("pause")',[m
[31m- * so ngx_cpu_pause is declared in src/os/unix/ngx_sunpro_x86.il[m
[31m- */[m
[31m-[m
[31m-void[m
[31m-ngx_cpu_pause(void);[m
[31m-[m
[31m-/* the code in src/os/unix/ngx_sunpro_x86.il */[m
[31m-[m
[31m-#define ngx_memory_barrier()        __asm (".volatile"); __asm (".nonvolatile")[m
[31m-[m
[31m-[m
[31m-#else /* ( __GNUC__ || __INTEL_COMPILER ) */[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#include "ngx_gcc_atomic_x86.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif ( __amd64__ || __amd64 )[m
[31m-[m
[31m-typedef int64_t                     ngx_atomic_int_t;[m
[31m-typedef uint64_t                    ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-[m
[31m-#if ( __SUNPRO_C )[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set);[m
[31m-[m
[31m-ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add);[m
[31m-[m
[31m-/*[m
[31m- * Sun Studio 12 exits with segmentation fault on '__asm ("pause")',[m
[31m- * so ngx_cpu_pause is declared in src/os/unix/ngx_sunpro_amd64.il[m
[31m- */[m
[31m-[m
[31m-void[m
[31m-ngx_cpu_pause(void);[m
[31m-[m
[31m-/* the code in src/os/unix/ngx_sunpro_amd64.il */[m
[31m-[m
[31m-#define ngx_memory_barrier()        __asm (".volatile"); __asm (".nonvolatile")[m
[31m-[m
[31m-[m
[31m-#else /* ( __GNUC__ || __INTEL_COMPILER ) */[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#include "ngx_gcc_atomic_amd64.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif ( __sparc__ || __sparc || __sparcv9 )[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-typedef int64_t                     ngx_atomic_int_t;[m
[31m-typedef uint64_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-[m
[31m-#if ( __SUNPRO_C )[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#include "ngx_sunpro_atomic_sparc64.h"[m
[31m-[m
[31m-[m
[31m-#else /* ( __GNUC__ || __INTEL_COMPILER ) */[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#include "ngx_gcc_atomic_sparc64.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#elif ( __powerpc__ || __POWERPC__ )[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  1[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-typedef int64_t                     ngx_atomic_int_t;[m
[31m-typedef uint64_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-9223372036854775808") - 1)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-[m
[31m-[m
[31m-#include "ngx_gcc_atomic_ppc.h"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if !(NGX_HAVE_ATOMIC_OPS)[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS  0[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    if (*lock == old) {[m
[31m-        *lock = set;[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_int_t  old;[m
[31m-[m
[31m-    old = *value;[m
[31m-    *value += add;[m
[31m-[m
[31m-    return old;[m
[31m-}[m
[31m-[m
[31m-#define ngx_memory_barrier()[m
[31m-#define ngx_cpu_pause()[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin);[m
[31m-[m
[31m-#define ngx_trylock(lock)  (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))[m
[31m-#define ngx_unlock(lock)    *(lock) = 0[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ATOMIC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_channel.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_channel.c[m
[1mdeleted file mode 100644[m
[1mindex 1efa066..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_channel.c[m
[1m+++ /dev/null[m
[36m@@ -1,253 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_channel.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    ssize_t             n;[m
[31m-    ngx_err_t           err;[m
[31m-    struct iovec        iov[1];[m
[31m-    struct msghdr       msg;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-    union {[m
[31m-        struct cmsghdr  cm;[m
[31m-        char            space[CMSG_SPACE(sizeof(int))];[m
[31m-    } cmsg;[m
[31m-[m
[31m-    if (ch->fd == -1) {[m
[31m-        msg.msg_control = NULL;[m
[31m-        msg.msg_controllen = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        msg.msg_control = (caddr_t) &cmsg;[m
[31m-        msg.msg_controllen = sizeof(cmsg);[m
[31m-[m
[31m-        ngx_memzero(&cmsg, sizeof(cmsg));[m
[31m-[m
[31m-        cmsg.cm.cmsg_len = CMSG_LEN(sizeof(int));[m
[31m-        cmsg.cm.cmsg_level = SOL_SOCKET;[m
[31m-        cmsg.cm.cmsg_type = SCM_RIGHTS;[m
[31m-[m
[31m-        /*[m
[31m-         * We have to use ngx_memcpy() instead of simple[m
[31m-         *   *(int *) CMSG_DATA(&cmsg.cm) = ch->fd;[m
[31m-         * because some gcc 4.4 with -O2/3/s optimization issues the warning:[m
[31m-         *   dereferencing type-punned pointer will break strict-aliasing rules[m
[31m-         *[m
[31m-         * Fortunately, gcc with -O1 compiles this ngx_memcpy()[m
[31m-         * in the same simple assignment as in the code above[m
[31m-         */[m
[31m-[m
[31m-        ngx_memcpy(CMSG_DATA(&cmsg.cm), &ch->fd, sizeof(int));[m
[31m-    }[m
[31m-[m
[31m-    msg.msg_flags = 0;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (ch->fd == -1) {[m
[31m-        msg.msg_accrights = NULL;[m
[31m-        msg.msg_accrightslen = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        msg.msg_accrights = (caddr_t) &ch->fd;[m
[31m-        msg.msg_accrightslen = sizeof(int);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    iov[0].iov_base = (char *) ch;[m
[31m-    iov[0].iov_len = size;[m
[31m-[m
[31m-    msg.msg_name = NULL;[m
[31m-    msg.msg_namelen = 0;[m
[31m-    msg.msg_iov = iov;[m
[31m-    msg.msg_iovlen = 1;[m
[31m-[m
[31m-    n = sendmsg(s, &msg, 0);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err, "sendmsg() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    ssize_t             n;[m
[31m-    ngx_err_t           err;[m
[31m-    struct iovec        iov[1];[m
[31m-    struct msghdr       msg;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-    union {[m
[31m-        struct cmsghdr  cm;[m
[31m-        char            space[CMSG_SPACE(sizeof(int))];[m
[31m-    } cmsg;[m
[31m-#else[m
[31m-    int                 fd;[m
[31m-#endif[m
[31m-[m
[31m-    iov[0].iov_base = (char *) ch;[m
[31m-    iov[0].iov_len = size;[m
[31m-[m
[31m-    msg.msg_name = NULL;[m
[31m-    msg.msg_namelen = 0;[m
[31m-    msg.msg_iov = iov;[m
[31m-    msg.msg_iovlen = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-    msg.msg_control = (caddr_t) &cmsg;[m
[31m-    msg.msg_controllen = sizeof(cmsg);[m
[31m-#else[m
[31m-    msg.msg_accrights = (caddr_t) &fd;[m
[31m-    msg.msg_accrightslen = sizeof(int);[m
[31m-#endif[m
[31m-[m
[31m-    n = recvmsg(s, &msg, 0);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err, "recvmsg() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "recvmsg() returned zero");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n < sizeof(ngx_channel_t)) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "recvmsg() returned not enough data: %z", n);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_MSGHDR_MSG_CONTROL)[m
[31m-[m
[31m-    if (ch->command == NGX_CMD_OPEN_CHANNEL) {[m
[31m-[m
[31m-        if (cmsg.cm.cmsg_len < (socklen_t) CMSG_LEN(sizeof(int))) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "recvmsg() returned too small ancillary data");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cmsg.cm.cmsg_level != SOL_SOCKET || cmsg.cm.cmsg_type != SCM_RIGHTS)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "recvmsg() returned invalid ancillary data "[m
[31m-                          "level %d or type %d",[m
[31m-                          cmsg.cm.cmsg_level, cmsg.cm.cmsg_type);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* ch->fd = *(int *) CMSG_DATA(&cmsg.cm); */[m
[31m-[m
[31m-        ngx_memcpy(&ch->fd, CMSG_DATA(&cmsg.cm), sizeof(int));[m
[31m-    }[m
[31m-[m
[31m-    if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "recvmsg() truncated data");[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (ch->command == NGX_CMD_OPEN_CHANNEL) {[m
[31m-        if (msg.msg_accrightslen != sizeof(int)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "recvmsg() returned no ancillary data");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ch->fd = fd;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, ngx_int_t event,[m
[31m-    ngx_event_handler_pt handler)[m
[31m-{[m
[31m-    ngx_event_t       *ev, *rev, *wev;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ngx_get_connection(fd, cycle->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c->pool = cycle->pool;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = cycle->log;[m
[31m-    wev->log = cycle->log;[m
[31m-[m
[31m-    rev->channel = 1;[m
[31m-    wev->channel = 1;[m
[31m-[m
[31m-    ev = (event == NGX_READ_EVENT) ? rev : wev;[m
[31m-[m
[31m-    ev->handler = handler;[m
[31m-[m
[31m-    if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            ngx_free_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_add_event(ev, event, 0) == NGX_ERROR) {[m
[31m-            ngx_free_connection(c);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log)[m
[31m-{[m
[31m-    if (close(fd[0]) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() channel failed");[m
[31m-    }[m
[31m-[m
[31m-    if (close(fd[1]) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() channel failed");[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_channel.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_channel.h[m
[1mdeleted file mode 100644[m
[1mindex 362cc64..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_channel.h[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_CHANNEL_H_INCLUDED_[m
[31m-#define _NGX_CHANNEL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t  command;[m
[31m-    ngx_pid_t   pid;[m
[31m-    ngx_int_t   slot;[m
[31m-    ngx_fd_t    fd;[m
[31m-} ngx_channel_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size,[m
[31m-    ngx_log_t *log);[m
[31m-ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size,[m
[31m-    ngx_log_t *log);[m
[31m-ngx_int_t ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd,[m
[31m-    ngx_int_t event, ngx_event_handler_pt handler);[m
[31m-void ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_CHANNEL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_daemon.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_daemon.c[m
[1mdeleted file mode 100644[m
[1mindex ab67211..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_daemon.c[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_daemon(ngx_log_t *log)[m
[31m-{[m
[31m-    int  fd;[m
[31m-[m
[31m-    switch (fork()) {[m
[31m-    case -1:[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-    case 0:[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        exit(0);[m
[31m-    }[m
[31m-[m
[31m-    ngx_pid = ngx_getpid();[m
[31m-[m
[31m-    if (setsid() == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    umask(0);[m
[31m-[m
[31m-    fd = open("/dev/null", O_RDWR);[m
[31m-    if (fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "open(\"/dev/null\") failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (dup2(fd, STDIN_FILENO) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (dup2(fd, STDOUT_FILENO) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (dup2(fd, STDERR_FILENO) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (fd > STDERR_FILENO) {[m
[31m-        if (close(fd) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin.h[m
[1mdeleted file mode 100644[m
[1mindex 4d01b26..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_DARWIN_H_INCLUDED_[m
[31m-#define _NGX_DARWIN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-void ngx_debug_init(void);[m
[31m-ngx_chain_t *ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-extern int       ngx_darwin_kern_osreldate;[m
[31m-extern int       ngx_darwin_hw_ncpu;[m
[31m-extern u_long    ngx_darwin_net_inet_tcp_sendspace;[m
[31m-[m
[31m-extern ngx_uint_t  ngx_debug_malloc;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_DARWIN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_config.h[m
[1mdeleted file mode 100644[m
[1mindex cfe3ce2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_DARWIN_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_DARWIN_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <unistd.h>[m
[31m-#include <inttypes.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <sys/mount.h>          /* statfs() */[m
[31m-[m
[31m-#include <sys/filio.h>          /* FIONBIO */[m
[31m-#include <sys/ioctl.h>[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#include <sys/sysctl.h>[m
[31m-#include <xlocale.h>[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-[m
[31m-#ifndef IOV_MAX[m
[31m-#define IOV_MAX   64[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-#include <sys/event.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG  -1[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_CASELESS_FILESYSTEM[m
[31m-#define NGX_HAVE_CASELESS_FILESYSTEM  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_OS_SPECIFIC_INIT    1[m
[31m-#define NGX_HAVE_DEBUG_MALLOC        1[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_DARWIN_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_init.c[m
[1mdeleted file mode 100644[m
[1mindex a9d12a8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,197 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-char    ngx_darwin_kern_ostype[16];[m
[31m-char    ngx_darwin_kern_osrelease[128];[m
[31m-int     ngx_darwin_hw_ncpu;[m
[31m-int     ngx_darwin_kern_ipc_somaxconn;[m
[31m-u_long  ngx_darwin_net_inet_tcp_sendspace;[m
[31m-[m
[31m-ngx_uint_t  ngx_debug_malloc;[m
[31m-[m
[31m-[m
[31m-static ngx_os_io_t ngx_darwin_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-    ngx_darwin_sendfile_chain,[m
[31m-    NGX_IO_SENDFILE[m
[31m-#else[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char        *name;[m
[31m-    void        *value;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   exists;[m
[31m-} sysctl_t;[m
[31m-[m
[31m-[m
[31m-sysctl_t sysctls[] = {[m
[31m-    { "hw.ncpu",[m
[31m-      &ngx_darwin_hw_ncpu,[m
[31m-      sizeof(ngx_darwin_hw_ncpu), 0 },[m
[31m-[m
[31m-    { "net.inet.tcp.sendspace",[m
[31m-      &ngx_darwin_net_inet_tcp_sendspace,[m
[31m-      sizeof(ngx_darwin_net_inet_tcp_sendspace), 0 },[m
[31m-[m
[31m-    { "kern.ipc.somaxconn",[m
[31m-      &ngx_darwin_kern_ipc_somaxconn,[m
[31m-      sizeof(ngx_darwin_kern_ipc_somaxconn), 0 },[m
[31m-[m
[31m-    { NULL, NULL, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_debug_init(void)[m
[31m-{[m
[31m-#if (NGX_DEBUG_MALLOC)[m
[31m-[m
[31m-    /*[m
[31m-     * MacOSX 10.6, 10.7:  MallocScribble fills freed memory with 0x55[m
[31m-     *                     and fills allocated memory with 0xAA.[m
[31m-     * MacOSX 10.4, 10.5:  MallocScribble fills freed memory with 0x55,[m
[31m-     *                     MallocPreScribble fills allocated memory with 0xAA.[m
[31m-     * MacOSX 10.3:        MallocScribble fills freed memory with 0x55,[m
[31m-     *                     and no way to fill allocated memory.[m
[31m-     */[m
[31m-[m
[31m-    setenv("MallocScribble", "1", 0);[m
[31m-[m
[31m-    ngx_debug_malloc = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (getenv("MallocScribble")) {[m
[31m-        ngx_debug_malloc = 1;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_specific_init(ngx_log_t *log)[m
[31m-{[m
[31m-    size_t      size;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    size = sizeof(ngx_darwin_kern_ostype);[m
[31m-    if (sysctlbyname("kern.ostype", ngx_darwin_kern_ostype, &size, NULL, 0)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "sysctlbyname(kern.ostype) failed");[m
[31m-[m
[31m-            if (err != NGX_ENOMEM) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_darwin_kern_ostype[size - 1] = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof(ngx_darwin_kern_osrelease);[m
[31m-    if (sysctlbyname("kern.osrelease", ngx_darwin_kern_osrelease, &size,[m
[31m-                     NULL, 0)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != NGX_ENOENT) {[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "sysctlbyname(kern.osrelease) failed");[m
[31m-[m
[31m-            if (err != NGX_ENOMEM) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_darwin_kern_osrelease[size - 1] = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; sysctls[i].name; i++) {[m
[31m-        size = sysctls[i].size;[m
[31m-[m
[31m-        if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            sysctls[i].exists = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "sysctlbyname(%s) failed", sysctls[i].name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_ncpu = ngx_darwin_hw_ncpu;[m
[31m-[m
[31m-    if (ngx_darwin_kern_ipc_somaxconn > 32767) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "sysctl kern.ipc.somaxconn must be less than 32768");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_tcp_nodelay_and_tcp_nopush = 1;[m
[31m-[m
[31m-    ngx_os_io = ngx_darwin_io;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_specific_status(ngx_log_t *log)[m
[31m-{[m
[31m-    u_long      value;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    if (ngx_darwin_kern_ostype[0]) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",[m
[31m-                      ngx_darwin_kern_ostype, ngx_darwin_kern_osrelease);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; sysctls[i].name; i++) {[m
[31m-        if (sysctls[i].exists) {[m
[31m-            if (sysctls[i].size == sizeof(long)) {[m
[31m-                value = *(long *) sysctls[i].value;[m
[31m-[m
[31m-            } else {[m
[31m-                value = *(int *) sysctls[i].value;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",[m
[31m-                          sysctls[i].name, value);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_sendfile_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_sendfile_chain.c[m
[1mdeleted file mode 100644[m
[1mindex c802e9f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_darwin_sendfile_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * It seems that Darwin 9.4 (Mac OS X 1.5) sendfile() has the same[m
[31m- * old bug as early FreeBSD sendfile() syscall:[m
[31m- * http://bugs.freebsd.org/33771[m
[31m- *[m
[31m- * Besides sendfile() has another bug: if one calls sendfile()[m
[31m- * with both a header and a trailer, then sendfile() ignores a file part[m
[31m- * at all and sends only the header and the trailer together.[m
[31m- * For this reason we send a trailer only if there is no a header.[m
[31m- *[m
[31m- * Although sendfile() allows to pass a header or a trailer,[m
[31m- * it may send the header or the trailer and a part of the file[m
[31m- * in different packets.  And FreeBSD workaround (TCP_NOPUSH option)[m
[31m- * does not help.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int              rc;[m
[31m-    off_t            send, prev_send, sent;[m
[31m-    off_t            file_size;[m
[31m-    ssize_t          n;[m
[31m-    ngx_uint_t       eintr;[m
[31m-    ngx_err_t        err;[m
[31m-    ngx_buf_t       *file;[m
[31m-    ngx_event_t     *wev;[m
[31m-    ngx_chain_t     *cl;[m
[31m-    ngx_iovec_t      header, trailer;[m
[31m-    struct sf_hdtr   hdtr;[m
[31m-    struct iovec     headers[NGX_IOVS_PREALLOCATE];[m
[31m-    struct iovec     trailers[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {[m
[31m-        (void) ngx_connection_error(c, wev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-        wev->error = 1;[m
[31m-        return NGX_CHAIN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* the maximum limit size is the maximum size_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    header.iovs = headers;[m
[31m-    header.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    trailer.iovs = trailers;[m
[31m-    trailer.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        eintr = 0;[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        /* create the header iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log);[m
[31m-[m
[31m-        if (cl == NGX_CHAIN_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        send += header.size;[m
[31m-[m
[31m-        if (cl && cl->buf->in_file && send < limit) {[m
[31m-            file = cl->buf;[m
[31m-[m
[31m-            /* coalesce the neighbouring file bufs */[m
[31m-[m
[31m-            file_size = ngx_chain_coalesce_file(&cl, limit - send);[m
[31m-[m
[31m-            send += file_size;[m
[31m-[m
[31m-            if (header.count == 0) {[m
[31m-[m
[31m-                /*[m
[31m-                 * create the trailer iovec and coalesce the neighbouring bufs[m
[31m-                 */[m
[31m-[m
[31m-                cl = ngx_output_chain_to_iovec(&trailer, cl, limit - send,[m
[31m-                                               c->log);[m
[31m-                if (cl == NGX_CHAIN_ERROR) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                send += trailer.size;[m
[31m-[m
[31m-            } else {[m
[31m-                trailer.count = 0;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * sendfile() returns EINVAL if sf_hdtr's count is 0,[m
[31m-             * but corresponding pointer is not NULL[m
[31m-             */[m
[31m-[m
[31m-            hdtr.headers = header.count ? header.iovs : NULL;[m
[31m-            hdtr.hdr_cnt = header.count;[m
[31m-            hdtr.trailers = trailer.count ? trailer.iovs : NULL;[m
[31m-            hdtr.trl_cnt = trailer.count;[m
[31m-[m
[31m-            sent = header.size + file_size;[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "sendfile: @%O %O h:%uz",[m
[31m-                           file->file_pos, sent, header.size);[m
[31m-[m
[31m-            rc = sendfile(file->file->fd, c->fd, file->file_pos,[m
[31m-                          &sent, &hdtr, 0);[m
[31m-[m
[31m-            if (rc == -1) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                switch (err) {[m
[31m-                case NGX_EAGAIN:[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_EINTR:[m
[31m-                    eintr = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    wev->error = 1;[m
[31m-                    (void) ngx_connection_error(c, err, "sendfile() failed");[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                               "sendfile() sent only %O bytes", sent);[m
[31m-            }[m
[31m-[m
[31m-            if (rc == 0 && sent == 0) {[m
[31m-[m
[31m-                /*[m
[31m-                 * if rc and sent equal to zero, then someone[m
[31m-                 * has truncated the file, so the offset became beyond[m
[31m-                 * the end of the file[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              "sendfile() reported that \"%s\" was truncated",[m
[31m-                              file->file->name.data);[m
[31m-[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "sendfile: %d, @%O %O:%O",[m
[31m-                           rc, file->file_pos, sent, file_size + header.size);[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_writev(c, &header);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-        }[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if (eintr) {[m
[31m-            send = prev_send + sent;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (send - prev_send != sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_dlopen.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_dlopen.c[m
[1mdeleted file mode 100644[m
[1mindex a0efc69..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_dlopen.c[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-[m
[31m-char *[m
[31m-ngx_dlerror(void)[m
[31m-{[m
[31m-    char  *err;[m
[31m-[m
[31m-    err = (char *) dlerror();[m
[31m-[m
[31m-    if (err == NULL) {[m
[31m-        return "";[m
[31m-    }[m
[31m-[m
[31m-    return err;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_dlopen.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_dlopen.h[m
[1mdeleted file mode 100644[m
[1mindex 7a3159f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_dlopen.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_DLOPEN_H_INCLUDED_[m
[31m-#define _NGX_DLOPEN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_dlopen(path)           dlopen((char *) path, RTLD_NOW | RTLD_GLOBAL)[m
[31m-#define ngx_dlopen_n               "dlopen()"[m
[31m-[m
[31m-#define ngx_dlsym(handle, symbol)  dlsym(handle, symbol)[m
[31m-#define ngx_dlsym_n                "dlsym()"[m
[31m-[m
[31m-#define ngx_dlclose(handle)        dlclose(handle)[m
[31m-#define ngx_dlclose_n              "dlclose()"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-char *ngx_dlerror(void);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_DLOPEN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_errno.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_errno.c[m
[1mdeleted file mode 100644[m
[1mindex e787b23..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_errno.c[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The strerror() messages are copied because:[m
[31m- *[m
[31m- * 1) strerror() and strerror_r() functions are not Async-Signal-Safe,[m
[31m- *    therefore, they cannot be used in signal handlers;[m
[31m- *[m
[31m- * 2) a direct sys_errlist[] array may be used instead of these functions,[m
[31m- *    but Linux linker warns about its usage:[m
[31m- *[m
[31m- * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead[m
[31m- * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead[m
[31m- *[m
[31m- *    causing false bug reports.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  *ngx_sys_errlist;[m
[31m-static ngx_str_t   ngx_unknown_error = ngx_string("Unknown error");[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)[m
[31m-{[m
[31m-    ngx_str_t  *msg;[m
[31m-[m
[31m-    msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]:[m
[31m-                                              &ngx_unknown_error;[m
[31m-    size = ngx_min(size, msg->len);[m
[31m-[m
[31m-    return ngx_cpymem(errstr, msg->data, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_strerror_init(void)[m
[31m-{[m
[31m-    char       *msg;[m
[31m-    u_char     *p;[m
[31m-    size_t      len;[m
[31m-    ngx_err_t   err;[m
[31m-[m
[31m-    /*[m
[31m-     * ngx_strerror() is not ready to work at this stage, therefore,[m
[31m-     * malloc() is used and possible errors are logged using strerror().[m
[31m-     */[m
[31m-[m
[31m-    len = NGX_SYS_NERR * sizeof(ngx_str_t);[m
[31m-[m
[31m-    ngx_sys_errlist = malloc(len);[m
[31m-    if (ngx_sys_errlist == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    for (err = 0; err < NGX_SYS_NERR; err++) {[m
[31m-        msg = strerror(err);[m
[31m-        len = ngx_strlen(msg);[m
[31m-[m
[31m-        p = malloc(len);[m
[31m-        if (p == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, msg, len);[m
[31m-        ngx_sys_errlist[err].len = len;[m
[31m-        ngx_sys_errlist[err].data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    err = errno;[m
[31m-    ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err));[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_errno.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_errno.h[m
[1mdeleted file mode 100644[m
[1mindex 7d6ca76..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_errno.h[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ERRNO_H_INCLUDED_[m
[31m-#define _NGX_ERRNO_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef int               ngx_err_t;[m
[31m-[m
[31m-#define NGX_EPERM         EPERM[m
[31m-#define NGX_ENOENT        ENOENT[m
[31m-#define NGX_ENOPATH       ENOENT[m
[31m-#define NGX_ESRCH         ESRCH[m
[31m-#define NGX_EINTR         EINTR[m
[31m-#define NGX_ECHILD        ECHILD[m
[31m-#define NGX_ENOMEM        ENOMEM[m
[31m-#define NGX_EACCES        EACCES[m
[31m-#define NGX_EBUSY         EBUSY[m
[31m-#define NGX_EEXIST        EEXIST[m
[31m-#define NGX_EEXIST_FILE   EEXIST[m
[31m-#define NGX_EXDEV         EXDEV[m
[31m-#define NGX_ENOTDIR       ENOTDIR[m
[31m-#define NGX_EISDIR        EISDIR[m
[31m-#define NGX_EINVAL        EINVAL[m
[31m-#define NGX_ENFILE        ENFILE[m
[31m-#define NGX_EMFILE        EMFILE[m
[31m-#define NGX_ENOSPC        ENOSPC[m
[31m-#define NGX_EPIPE         EPIPE[m
[31m-#define NGX_EINPROGRESS   EINPROGRESS[m
[31m-#define NGX_ENOPROTOOPT   ENOPROTOOPT[m
[31m-#define NGX_EOPNOTSUPP    EOPNOTSUPP[m
[31m-#define NGX_EADDRINUSE    EADDRINUSE[m
[31m-#define NGX_ECONNABORTED  ECONNABORTED[m
[31m-#define NGX_ECONNRESET    ECONNRESET[m
[31m-#define NGX_ENOTCONN      ENOTCONN[m
[31m-#define NGX_ETIMEDOUT     ETIMEDOUT[m
[31m-#define NGX_ECONNREFUSED  ECONNREFUSED[m
[31m-#define NGX_ENAMETOOLONG  ENAMETOOLONG[m
[31m-#define NGX_ENETDOWN      ENETDOWN[m
[31m-#define NGX_ENETUNREACH   ENETUNREACH[m
[31m-#define NGX_EHOSTDOWN     EHOSTDOWN[m
[31m-#define NGX_EHOSTUNREACH  EHOSTUNREACH[m
[31m-#define NGX_ENOSYS        ENOSYS[m
[31m-#define NGX_ECANCELED     ECANCELED[m
[31m-#define NGX_EILSEQ        EILSEQ[m
[31m-#define NGX_ENOMOREFILES  0[m
[31m-#define NGX_ELOOP         ELOOP[m
[31m-#define NGX_EBADF         EBADF[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-#define NGX_EMLINK        EMLINK[m
[31m-#endif[m
[31m-[m
[31m-#if (__hpux__)[m
[31m-#define NGX_EAGAIN        EWOULDBLOCK[m
[31m-#else[m
[31m-#define NGX_EAGAIN        EAGAIN[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_errno                  errno[m
[31m-#define ngx_socket_errno           errno[m
[31m-#define ngx_set_errno(err)         errno = err[m
[31m-#define ngx_set_socket_errno(err)  errno = err[m
[31m-[m
[31m-[m
[31m-u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size);[m
[31m-ngx_int_t ngx_strerror_init(void);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ERRNO_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_file_aio_read.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_file_aio_read.c[m
[1mdeleted file mode 100644[m
[1mindex aedc3c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_file_aio_read.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * FreeBSD file AIO features and quirks:[m
[31m- *[m
[31m- *    if an asked data are already in VM cache, then aio_error() returns 0,[m
[31m- *    and the data are already copied in buffer;[m
[31m- *[m
[31m- *    aio_read() preread in VM cache as minimum 16K (probably BKVASIZE);[m
[31m- *    the first AIO preload may be up to 128K;[m
[31m- *[m
[31m- *    aio_read/aio_error() may return EINPROGRESS for just written data;[m
[31m- *[m
[31m- *    kqueue EVFILT_AIO filter is level triggered only: an event repeats[m
[31m- *    until aio_return() will be called;[m
[31m- *[m
[31m- *    aio_cancel() cannot cancel file AIO: it returns AIO_NOTCANCELED always.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-extern int  ngx_kqueue;[m
[31m-[m
[31m-[m
[31m-static ssize_t ngx_file_aio_result(ngx_file_t *file, ngx_event_aio_t *aio,[m
[31m-    ngx_event_t *ev);[m
[31m-static void ngx_file_aio_event_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    aio = ngx_pcalloc(pool, sizeof(ngx_event_aio_t));[m
[31m-    if (aio == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio->file = file;[m
[31m-    aio->fd = file->fd;[m
[31m-    aio->event.data = aio;[m
[31m-    aio->event.ready = 1;[m
[31m-    aio->event.log = file->log;[m
[31m-[m
[31m-    file->aio = aio;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    int               n;[m
[31m-    ngx_event_t      *ev;[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    if (!ngx_file_aio) {[m
[31m-        return ngx_read_file(file, buf, size, offset);[m
[31m-    }[m
[31m-[m
[31m-    if (file->aio == NULL && ngx_file_aio_init(file, pool) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio = file->aio;[m
[31m-    ev = &aio->event;[m
[31m-[m
[31m-    if (!ev->ready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, file->log, 0,[m
[31m-                      "second aio post for \"%V\"", &file->name);[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio complete:%d @%O:%uz %V",[m
[31m-                   ev->complete, offset, size, &file->name);[m
[31m-[m
[31m-    if (ev->complete) {[m
[31m-        ev->complete = 0;[m
[31m-        ngx_set_errno(aio->err);[m
[31m-[m
[31m-        if (aio->err == 0) {[m
[31m-            return aio->nbytes;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                      "aio read \"%s\" failed", file->name.data);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&aio->aiocb, sizeof(struct aiocb));[m
[31m-[m
[31m-    aio->aiocb.aio_fildes = file->fd;[m
[31m-    aio->aiocb.aio_offset = offset;[m
[31m-    aio->aiocb.aio_buf = buf;[m
[31m-    aio->aiocb.aio_nbytes = size;[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-    aio->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;[m
[31m-    aio->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;[m
[31m-    aio->aiocb.aio_sigevent.sigev_value.sigval_ptr = ev;[m
[31m-#endif[m
[31m-    ev->handler = ngx_file_aio_event_handler;[m
[31m-[m
[31m-    n = aio_read(&aio->aiocb);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        n = ngx_errno;[m
[31m-[m
[31m-        if (n == NGX_EAGAIN) {[m
[31m-            return ngx_read_file(file, buf, size, offset);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, n,[m
[31m-                      "aio_read(\"%V\") failed", &file->name);[m
[31m-[m
[31m-        if (n == NGX_ENOSYS) {[m
[31m-            ngx_file_aio = 0;[m
[31m-            return ngx_read_file(file, buf, size, offset);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio_read: fd:%d %d", file->fd, n);[m
[31m-[m
[31m-    ev->active = 1;[m
[31m-    ev->ready = 0;[m
[31m-    ev->complete = 0;[m
[31m-[m
[31m-    return ngx_file_aio_result(aio->file, aio, ev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_file_aio_result(ngx_file_t *file, ngx_event_aio_t *aio, ngx_event_t *ev)[m
[31m-{[m
[31m-    int        n;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    n = aio_error(&aio->aiocb);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio_error: fd:%d %d", file->fd, n);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-        aio->err = err;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, file->log, err,[m
[31m-                      "aio_error(\"%V\") failed", &file->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_EINPROGRESS) {[m
[31m-        if (ev->ready) {[m
[31m-            ev->ready = 0;[m
[31m-            ngx_log_error(NGX_LOG_ALERT, file->log, n,[m
[31m-                          "aio_read(\"%V\") still in progress",[m
[31m-                          &file->name);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    n = aio_return(&aio->aiocb);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-        aio->err = err;[m
[31m-        ev->ready = 1;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                      "aio_return(\"%V\") failed", &file->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio->err = 0;[m
[31m-    aio->nbytes = n;[m
[31m-    ev->ready = 1;[m
[31m-    ev->active = 0;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio_return: fd:%d %d", file->fd, n);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_file_aio_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                   "aio event handler fd:%d %V", aio->fd, &aio->file->name);[m
[31m-[m
[31m-    if (ngx_file_aio_result(aio->file, aio, ev) != NGX_AGAIN) {[m
[31m-        aio->handler(ev);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_files.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_files.c[m
[1mdeleted file mode 100644[m
[1mindex 7fbb7c9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_files.c[m
[1m+++ /dev/null[m
[36m@@ -1,906 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-#include <ngx_thread_pool.h>[m
[31m-static void ngx_thread_read_handler(void *data, ngx_log_t *log);[m
[31m-static void ngx_thread_write_chain_to_file_handler(void *data, ngx_log_t *log);[m
[31m-#endif[m
[31m-[m
[31m-static ngx_chain_t *ngx_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *cl);[m
[31m-static ssize_t ngx_writev_file(ngx_file_t *file, ngx_iovec_t *vec,[m
[31m-    off_t offset);[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-ngx_uint_t  ngx_file_aio = 1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)[m
[31m-{[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "read: %d, %p, %uz, %O", file->fd, buf, size, offset);[m
[31m-[m
[31m-#if (NGX_HAVE_PREAD)[m
[31m-[m
[31m-    n = pread(file->fd, buf, size, offset);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                      "pread() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (file->sys_offset != offset) {[m
[31m-        if (lseek(file->fd, offset, SEEK_SET) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                          "lseek() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->sys_offset = offset;[m
[31m-    }[m
[31m-[m
[31m-    n = read(file->fd, buf, size);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                      "read() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->sys_offset += n;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    file->offset += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_fd_t       fd;[m
[31m-    ngx_uint_t     write;   /* unsigned  write:1; */[m
[31m-[m
[31m-    u_char        *buf;[m
[31m-    size_t         size;[m
[31m-    ngx_chain_t   *chain;[m
[31m-    off_t          offset;[m
[31m-[m
[31m-    size_t         nbytes;[m
[31m-    ngx_err_t      err;[m
[31m-} ngx_thread_file_ctx_t;[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_thread_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_thread_task_t      *task;[m
[31m-    ngx_thread_file_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "thread read: %d, %p, %uz, %O",[m
[31m-                   file->fd, buf, size, offset);[m
[31m-[m
[31m-    task = file->thread_task;[m
[31m-[m
[31m-    if (task == NULL) {[m
[31m-        task = ngx_thread_task_alloc(pool, sizeof(ngx_thread_file_ctx_t));[m
[31m-        if (task == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->thread_task = task;[m
[31m-    }[m
[31m-[m
[31m-    ctx = task->ctx;[m
[31m-[m
[31m-    if (task->event.complete) {[m
[31m-        task->event.complete = 0;[m
[31m-[m
[31m-        if (ctx->write) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, file->log, 0,[m
[31m-                          "invalid thread call, read instead of write");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->err) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ctx->err,[m
[31m-                          "pread() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return ctx->nbytes;[m
[31m-    }[m
[31m-[m
[31m-    task->handler = ngx_thread_read_handler;[m
[31m-[m
[31m-    ctx->write = 0;[m
[31m-[m
[31m-    ctx->fd = file->fd;[m
[31m-    ctx->buf = buf;[m
[31m-    ctx->size = size;[m
[31m-    ctx->offset = offset;[m
[31m-[m
[31m-    if (file->thread_handler(task, file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_PREAD)[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_read_handler(void *data, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_thread_file_ctx_t *ctx = data;[m
[31m-[m
[31m-    ssize_t  n;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "thread read handler");[m
[31m-[m
[31m-    n = pread(ctx->fd, ctx->buf, ctx->size, ctx->offset);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ctx->err = ngx_errno;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->nbytes = n;[m
[31m-        ctx->err = 0;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pread: %z (err: %d) of %uz @%O",[m
[31m-                   n, ctx->err, ctx->size, ctx->offset);[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#error pread() is required![m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_THREADS */[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)[m
[31m-{[m
[31m-    ssize_t    n, written;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "write: %d, %p, %uz, %O", file->fd, buf, size, offset);[m
[31m-[m
[31m-    written = 0;[m
[31m-[m
[31m-#if (NGX_HAVE_PWRITE)[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = pwrite(file->fd, buf + written, size, offset);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_EINTR) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,[m
[31m-                               "pwrite() was interrupted");[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                          "pwrite() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->offset += n;[m
[31m-        written += n;[m
[31m-[m
[31m-        if ((size_t) n == size) {[m
[31m-            return written;[m
[31m-        }[m
[31m-[m
[31m-        offset += n;[m
[31m-        size -= n;[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (file->sys_offset != offset) {[m
[31m-        if (lseek(file->fd, offset, SEEK_SET) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                          "lseek() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->sys_offset = offset;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = write(file->fd, buf + written, size);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_EINTR) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,[m
[31m-                               "write() was interrupted");[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                          "write() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->sys_offset += n;[m
[31m-        file->offset += n;[m
[31m-        written += n;[m
[31m-[m
[31m-        if ((size_t) n == size) {[m
[31m-            return written;[m
[31m-        }[m
[31m-[m
[31m-        size -= n;[m
[31m-    }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_fd_t[m
[31m-ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access)[m
[31m-{[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR,[m
[31m-              access ? access : 0600);[m
[31m-[m
[31m-    if (fd != -1 && !persistent) {[m
[31m-        (void) unlink((const char *) name);[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    ssize_t        total, n;[m
[31m-    ngx_iovec_t    vec;[m
[31m-    struct iovec   iovs[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    /* use pwrite() if there is the only buf in a chain */[m
[31m-[m
[31m-    if (cl->next == NULL) {[m
[31m-        return ngx_write_file(file, cl->buf->pos,[m
[31m-                              (size_t) (cl->buf->last - cl->buf->pos),[m
[31m-                              offset);[m
[31m-    }[m
[31m-[m
[31m-    total = 0;[m
[31m-[m
[31m-    vec.iovs = iovs;[m
[31m-    vec.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    do {[m
[31m-        /* create the iovec and coalesce the neighbouring bufs */[m
[31m-        cl = ngx_chain_to_iovec(&vec, cl);[m
[31m-[m
[31m-        /* use pwrite() if there is the only iovec buffer */[m
[31m-[m
[31m-        if (vec.count == 1) {[m
[31m-            n = ngx_write_file(file, (u_char *) iovs[0].iov_base,[m
[31m-                               iovs[0].iov_len, offset);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return n;[m
[31m-            }[m
[31m-[m
[31m-            return total + n;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_writev_file(file, &vec, offset);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        offset += n;[m
[31m-        total += n;[m
[31m-[m
[31m-    } while (cl);[m
[31m-[m
[31m-    return total;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_chain_t *[m
[31m-ngx_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *cl)[m
[31m-{[m
[31m-    size_t         total, size;[m
[31m-    u_char        *prev;[m
[31m-    ngx_uint_t     n;[m
[31m-    struct iovec  *iov;[m
[31m-[m
[31m-    iov = NULL;[m
[31m-    prev = NULL;[m
[31m-    total = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for ( /* void */ ; cl; cl = cl->next) {[m
[31m-[m
[31m-        if (ngx_buf_special(cl->buf)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-        if (prev == cl->buf->pos) {[m
[31m-            iov->iov_len += size;[m
[31m-[m
[31m-        } else {[m
[31m-            if (n == vec->nalloc) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            iov = &vec->iovs[n++];[m
[31m-[m
[31m-            iov->iov_base = (void *) cl->buf->pos;[m
[31m-            iov->iov_len = size;[m
[31m-        }[m
[31m-[m
[31m-        prev = cl->buf->pos + size;[m
[31m-        total += size;[m
[31m-    }[m
[31m-[m
[31m-    vec->count = n;[m
[31m-    vec->size = total;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_writev_file(ngx_file_t *file, ngx_iovec_t *vec, off_t offset)[m
[31m-{[m
[31m-    ssize_t    n;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "writev: %d, %uz, %O", file->fd, vec->size, offset);[m
[31m-[m
[31m-#if (NGX_HAVE_PWRITEV)[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-    n = pwritev(file->fd, vec->iovs, vec->count, offset);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,[m
[31m-                           "pwritev() was interrupted");[m
[31m-            goto eintr;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                      "pwritev() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != vec->size) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, 0,[m
[31m-                      "pwritev() \"%s\" has written only %z of %uz",[m
[31m-                      file->name.data, n, vec->size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    if (file->sys_offset != offset) {[m
[31m-        if (lseek(file->fd, offset, SEEK_SET) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                          "lseek() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->sys_offset = offset;[m
[31m-    }[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-    n = writev(file->fd, vec->iovs, vec->count);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,[m
[31m-                           "writev() was interrupted");[m
[31m-            goto eintr;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                      "writev() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((size_t) n != vec->size) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, 0,[m
[31m-                      "writev() \"%s\" has written only %z of %uz",[m
[31m-                      file->name.data, n, vec->size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->sys_offset += n;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    file->offset += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_thread_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_thread_task_t      *task;[m
[31m-    ngx_thread_file_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "thread write chain: %d, %p, %O",[m
[31m-                   file->fd, cl, offset);[m
[31m-[m
[31m-    task = file->thread_task;[m
[31m-[m
[31m-    if (task == NULL) {[m
[31m-        task = ngx_thread_task_alloc(pool,[m
[31m-                                     sizeof(ngx_thread_file_ctx_t));[m
[31m-        if (task == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->thread_task = task;[m
[31m-    }[m
[31m-[m
[31m-    ctx = task->ctx;[m
[31m-[m
[31m-    if (task->event.complete) {[m
[31m-        task->event.complete = 0;[m
[31m-[m
[31m-        if (!ctx->write) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, file->log, 0,[m
[31m-                          "invalid thread call, write instead of read");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->err || ctx->nbytes == 0) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, file->log, ctx->err,[m
[31m-                          "pwritev() \"%s\" failed", file->name.data);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        file->offset += ctx->nbytes;[m
[31m-        return ctx->nbytes;[m
[31m-    }[m
[31m-[m
[31m-    task->handler = ngx_thread_write_chain_to_file_handler;[m
[31m-[m
[31m-    ctx->write = 1;[m
[31m-[m
[31m-    ctx->fd = file->fd;[m
[31m-    ctx->chain = cl;[m
[31m-    ctx->offset = offset;[m
[31m-[m
[31m-    if (file->thread_handler(task, file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_thread_write_chain_to_file_handler(void *data, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_thread_file_ctx_t *ctx = data;[m
[31m-[m
[31m-#if (NGX_HAVE_PWRITEV)[m
[31m-[m
[31m-    off_t          offset;[m
[31m-    ssize_t        n;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_chain_t   *cl;[m
[31m-    ngx_iovec_t    vec;[m
[31m-    struct iovec   iovs[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    vec.iovs = iovs;[m
[31m-    vec.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    cl = ctx->chain;[m
[31m-    offset = ctx->offset;[m
[31m-[m
[31m-    ctx->nbytes = 0;[m
[31m-    ctx->err = 0;[m
[31m-[m
[31m-    do {[m
[31m-        /* create the iovec and coalesce the neighbouring bufs */[m
[31m-        cl = ngx_chain_to_iovec(&vec, cl);[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-        n = pwritev(ctx->fd, iovs, vec.count, offset);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_EINTR) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, err,[m
[31m-                               "pwritev() was interrupted");[m
[31m-                goto eintr;[m
[31m-            }[m
[31m-[m
[31m-            ctx->err = err;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if ((size_t) n != vec.size) {[m
[31m-            ctx->nbytes = 0;[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->nbytes += n;[m
[31m-        offset += n;[m
[31m-    } while (cl);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ctx->err = NGX_ENOSYS;[m
[31m-    return;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_THREADS */[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s)[m
[31m-{[m
[31m-    struct timeval  tv[2];[m
[31m-[m
[31m-    tv[0].tv_sec = ngx_time();[m
[31m-    tv[0].tv_usec = 0;[m
[31m-    tv[1].tv_sec = s;[m
[31m-    tv[1].tv_usec = 0;[m
[31m-[m
[31m-    if (utimes((char *) name, tv) != -1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_file_mapping(ngx_file_mapping_t *fm)[m
[31m-{[m
[31m-    fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE,[m
[31m-                           NGX_FILE_DEFAULT_ACCESS);[m
[31m-    if (fm->fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", fm->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ftruncate(fm->fd, fm->size) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "ftruncate() \"%s\" failed", fm->name);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fm->addr = mmap(NULL, fm->size, PROT_READ|PROT_WRITE, MAP_SHARED,[m
[31m-                    fm->fd, 0);[m
[31m-    if (fm->addr != MAP_FAILED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                  "mmap(%uz) \"%s\" failed", fm->size, fm->name);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", fm->name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_file_mapping(ngx_file_mapping_t *fm)[m
[31m-{[m
[31m-    if (munmap(fm->addr, fm->size) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "munmap(%uz) \"%s\" failed", fm->size, fm->name);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", fm->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    dir->dir = opendir((const char *) name->data);[m
[31m-[m
[31m-    if (dir->dir == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dir->valid_info = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_dir(ngx_dir_t *dir)[m
[31m-{[m
[31m-    dir->de = readdir(dir->dir);[m
[31m-[m
[31m-    if (dir->de) {[m
[31m-#if (NGX_HAVE_D_TYPE)[m
[31m-        dir->type = dir->de->d_type;[m
[31m-#else[m
[31m-        dir->type = 0;[m
[31m-#endif[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_glob(ngx_glob_t *gl)[m
[31m-{[m
[31m-    int  n;[m
[31m-[m
[31m-    n = glob((char *) gl->pattern, 0, NULL, &gl->pglob);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#ifdef GLOB_NOMATCH[m
[31m-[m
[31m-    if (n == GLOB_NOMATCH && gl->test) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)[m
[31m-{[m
[31m-    size_t  count;[m
[31m-[m
[31m-#ifdef GLOB_NOMATCH[m
[31m-    count = (size_t) gl->pglob.gl_pathc;[m
[31m-#else[m
[31m-    count = (size_t) gl->pglob.gl_matchc;[m
[31m-#endif[m
[31m-[m
[31m-    if (gl->n < count) {[m
[31m-[m
[31m-        name->len = (size_t) ngx_strlen(gl->pglob.gl_pathv[gl->n]);[m
[31m-        name->data = (u_char *) gl->pglob.gl_pathv[gl->n];[m
[31m-        gl->n++;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_glob(ngx_glob_t *gl)[m
[31m-{[m
[31m-    globfree(&gl->pglob);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_trylock_fd(ngx_fd_t fd)[m
[31m-{[m
[31m-    struct flock  fl;[m
[31m-[m
[31m-    ngx_memzero(&fl, sizeof(struct flock));[m
[31m-    fl.l_type = F_WRLCK;[m
[31m-    fl.l_whence = SEEK_SET;[m
[31m-[m
[31m-    if (fcntl(fd, F_SETLK, &fl) == -1) {[m
[31m-        return ngx_errno;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_lock_fd(ngx_fd_t fd)[m
[31m-{[m
[31m-    struct flock  fl;[m
[31m-[m
[31m-    ngx_memzero(&fl, sizeof(struct flock));[m
[31m-    fl.l_type = F_WRLCK;[m
[31m-    fl.l_whence = SEEK_SET;[m
[31m-[m
[31m-    if (fcntl(fd, F_SETLKW, &fl) == -1) {[m
[31m-        return ngx_errno;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_unlock_fd(ngx_fd_t fd)[m
[31m-{[m
[31m-    struct flock  fl;[m
[31m-[m
[31m-    ngx_memzero(&fl, sizeof(struct flock));[m
[31m-    fl.l_type = F_UNLCK;[m
[31m-    fl.l_whence = SEEK_SET;[m
[31m-[m
[31m-    if (fcntl(fd, F_SETLK, &fl) == -1) {[m
[31m-        return  ngx_errno;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_FADVISE) && !(NGX_HAVE_F_READAHEAD)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_ahead(ngx_fd_t fd, size_t n)[m
[31m-{[m
[31m-    int  err;[m
[31m-[m
[31m-    err = posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_set_errno(err);[m
[31m-    return NGX_FILE_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_O_DIRECT)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_directio_on(ngx_fd_t fd)[m
[31m-{[m
[31m-    int  flags;[m
[31m-[m
[31m-    flags = fcntl(fd, F_GETFL);[m
[31m-[m
[31m-    if (flags == -1) {[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return fcntl(fd, F_SETFL, flags | O_DIRECT);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_directio_off(ngx_fd_t fd)[m
[31m-{[m
[31m-    int  flags;[m
[31m-[m
[31m-    flags = fcntl(fd, F_GETFL);[m
[31m-[m
[31m-    if (flags == -1) {[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return fcntl(fd, F_SETFL, flags & ~O_DIRECT);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_STATFS)[m
[31m-[m
[31m-size_t[m
[31m-ngx_fs_bsize(u_char *name)[m
[31m-{[m
[31m-    struct statfs  fs;[m
[31m-[m
[31m-    if (statfs((char *) name, &fs) == -1) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    if ((fs.f_bsize % 512) != 0) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    return (size_t) fs.f_bsize;[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_STATVFS)[m
[31m-[m
[31m-size_t[m
[31m-ngx_fs_bsize(u_char *name)[m
[31m-{[m
[31m-    struct statvfs  fs;[m
[31m-[m
[31m-    if (statvfs((char *) name, &fs) == -1) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    if ((fs.f_frsize % 512) != 0) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    return (size_t) fs.f_frsize;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-size_t[m
[31m-ngx_fs_bsize(u_char *name)[m
[31m-{[m
[31m-    return 512;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_files.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_files.h[m
[1mdeleted file mode 100644[m
[1mindex 07872b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_files.h[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FILES_H_INCLUDED_[m
[31m-#define _NGX_FILES_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef int                      ngx_fd_t;[m
[31m-typedef struct stat              ngx_file_info_t;[m
[31m-typedef ino_t                    ngx_file_uniq_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                      *name;[m
[31m-    size_t                       size;[m
[31m-    void                        *addr;[m
[31m-    ngx_fd_t                     fd;[m
[31m-    ngx_log_t                   *log;[m
[31m-} ngx_file_mapping_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    DIR                         *dir;[m
[31m-    struct dirent               *de;[m
[31m-    struct stat                  info;[m
[31m-[m
[31m-    unsigned                     type:8;[m
[31m-    unsigned                     valid_info:1;[m
[31m-} ngx_dir_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t                       n;[m
[31m-    glob_t                       pglob;[m
[31m-    u_char                      *pattern;[m
[31m-    ngx_log_t                   *log;[m
[31m-    ngx_uint_t                   test;[m
[31m-} ngx_glob_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_INVALID_FILE         -1[m
[31m-#define NGX_FILE_ERROR           -1[m
[31m-[m
[31m-[m
[31m-[m
[31m-#ifdef __CYGWIN__[m
[31m-[m
[31m-#ifndef NGX_HAVE_CASELESS_FILESYSTEM[m
[31m-#define NGX_HAVE_CASELESS_FILESYSTEM  1[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_open_file(name, mode, create, access)                            \[m
[31m-    open((const char *) name, mode|create|O_BINARY, access)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_open_file(name, mode, create, access)                            \[m
[31m-    open((const char *) name, mode|create, access)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_open_file_n          "open()"[m
[31m-[m
[31m-#define NGX_FILE_RDONLY          O_RDONLY[m
[31m-#define NGX_FILE_WRONLY          O_WRONLY[m
[31m-#define NGX_FILE_RDWR            O_RDWR[m
[31m-#define NGX_FILE_CREATE_OR_OPEN  O_CREAT[m
[31m-#define NGX_FILE_OPEN            0[m
[31m-#define NGX_FILE_TRUNCATE        (O_CREAT|O_TRUNC)[m
[31m-#define NGX_FILE_APPEND          (O_WRONLY|O_APPEND)[m
[31m-#define NGX_FILE_NONBLOCK        O_NONBLOCK[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-#define NGX_FILE_NOFOLLOW        O_NOFOLLOW[m
[31m-[m
[31m-#if defined(O_DIRECTORY)[m
[31m-#define NGX_FILE_DIRECTORY       O_DIRECTORY[m
[31m-#else[m
[31m-#define NGX_FILE_DIRECTORY       0[m
[31m-#endif[m
[31m-[m
[31m-#if defined(O_SEARCH)[m
[31m-#define NGX_FILE_SEARCH          (O_SEARCH|NGX_FILE_DIRECTORY)[m
[31m-[m
[31m-#elif defined(O_EXEC)[m
[31m-#define NGX_FILE_SEARCH          (O_EXEC|NGX_FILE_DIRECTORY)[m
[31m-[m
[31m-#elif (NGX_HAVE_O_PATH)[m
[31m-#define NGX_FILE_SEARCH          (O_PATH|O_RDONLY|NGX_FILE_DIRECTORY)[m
[31m-[m
[31m-#else[m
[31m-#define NGX_FILE_SEARCH          (O_RDONLY|NGX_FILE_DIRECTORY)[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_HAVE_OPENAT */[m
[31m-[m
[31m-#define NGX_FILE_DEFAULT_ACCESS  0644[m
[31m-#define NGX_FILE_OWNER_ACCESS    0600[m
[31m-[m
[31m-[m
[31m-#define ngx_close_file           close[m
[31m-#define ngx_close_file_n         "close()"[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_file(name)    unlink((const char *) name)[m
[31m-#define ngx_delete_file_n        "unlink()"[m
[31m-[m
[31m-[m
[31m-ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent,[m
[31m-    ngx_uint_t access);[m
[31m-#define ngx_open_tempfile_n      "open()"[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset);[m
[31m-#if (NGX_HAVE_PREAD)[m
[31m-#define ngx_read_file_n          "pread()"[m
[31m-#else[m
[31m-#define ngx_read_file_n          "read()"[m
[31m-#endif[m
[31m-[m
[31m-ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size,[m
[31m-    off_t offset);[m
[31m-[m
[31m-ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-[m
[31m-[m
[31m-#define ngx_read_fd              read[m
[31m-#define ngx_read_fd_n            "read()"[m
[31m-[m
[31m-/*[m
[31m- * we use inlined function instead of simple #define[m
[31m- * because glibc 2.3 sets warn_unused_result attribute for write()[m
[31m- * and in this case gcc 4.3 ignores (void) cast[m
[31m- */[m
[31m-static ngx_inline ssize_t[m
[31m-ngx_write_fd(ngx_fd_t fd, void *buf, size_t n)[m
[31m-{[m
[31m-    return write(fd, buf, n);[m
[31m-}[m
[31m-[m
[31m-#define ngx_write_fd_n           "write()"[m
[31m-[m
[31m-[m
[31m-#define ngx_write_console        ngx_write_fd[m
[31m-[m
[31m-[m
[31m-#define ngx_linefeed(p)          *p++ = LF;[m
[31m-#define NGX_LINEFEED_SIZE        1[m
[31m-#define NGX_LINEFEED             "\x0a"[m
[31m-[m
[31m-[m
[31m-#define ngx_rename_file(o, n)    rename((const char *) o, (const char *) n)[m
[31m-#define ngx_rename_file_n        "rename()"[m
[31m-[m
[31m-[m
[31m-#define ngx_change_file_access(n, a) chmod((const char *) n, a)[m
[31m-#define ngx_change_file_access_n "chmod()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s);[m
[31m-#define ngx_set_file_time_n      "utimes()"[m
[31m-[m
[31m-[m
[31m-#define ngx_file_info(file, sb)  stat((const char *) file, sb)[m
[31m-#define ngx_file_info_n          "stat()"[m
[31m-[m
[31m-#define ngx_fd_info(fd, sb)      fstat(fd, sb)[m
[31m-#define ngx_fd_info_n            "fstat()"[m
[31m-[m
[31m-#define ngx_link_info(file, sb)  lstat((const char *) file, sb)[m
[31m-#define ngx_link_info_n          "lstat()"[m
[31m-[m
[31m-#define ngx_is_dir(sb)           (S_ISDIR((sb)->st_mode))[m
[31m-#define ngx_is_file(sb)          (S_ISREG((sb)->st_mode))[m
[31m-#define ngx_is_link(sb)          (S_ISLNK((sb)->st_mode))[m
[31m-#define ngx_is_exec(sb)          (((sb)->st_mode & S_IXUSR) == S_IXUSR)[m
[31m-#define ngx_file_access(sb)      ((sb)->st_mode & 0777)[m
[31m-#define ngx_file_size(sb)        (sb)->st_size[m
[31m-#define ngx_file_fs_size(sb)     ngx_max((sb)->st_size, (sb)->st_blocks * 512)[m
[31m-#define ngx_file_mtime(sb)       (sb)->st_mtime[m
[31m-#define ngx_file_uniq(sb)        (sb)->st_ino[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_create_file_mapping(ngx_file_mapping_t *fm);[m
[31m-void ngx_close_file_mapping(ngx_file_mapping_t *fm);[m
[31m-[m
[31m-[m
[31m-#define ngx_realpath(p, r)       (u_char *) realpath((char *) p, (char *) r)[m
[31m-#define ngx_realpath_n           "realpath()"[m
[31m-#define ngx_getcwd(buf, size)    (getcwd((char *) buf, size) != NULL)[m
[31m-#define ngx_getcwd_n             "getcwd()"[m
[31m-#define ngx_path_separator(c)    ((c) == '/')[m
[31m-[m
[31m-[m
[31m-#if defined(PATH_MAX)[m
[31m-[m
[31m-#define NGX_HAVE_MAX_PATH        1[m
[31m-#define NGX_MAX_PATH             PATH_MAX[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define NGX_MAX_PATH             4096[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_DIR_MASK_LEN         0[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir);[m
[31m-#define ngx_open_dir_n           "opendir()"[m
[31m-[m
[31m-[m
[31m-#define ngx_close_dir(d)         closedir((d)->dir)[m
[31m-#define ngx_close_dir_n          "closedir()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_read_dir(ngx_dir_t *dir);[m
[31m-#define ngx_read_dir_n           "readdir()"[m
[31m-[m
[31m-[m
[31m-#define ngx_create_dir(name, access) mkdir((const char *) name, access)[m
[31m-#define ngx_create_dir_n         "mkdir()"[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_dir(name)     rmdir((const char *) name)[m
[31m-#define ngx_delete_dir_n         "rmdir()"[m
[31m-[m
[31m-[m
[31m-#define ngx_dir_access(a)        (a | (a & 0444) >> 2)[m
[31m-[m
[31m-[m
[31m-#define ngx_de_name(dir)         ((u_char *) (dir)->de->d_name)[m
[31m-#if (NGX_HAVE_D_NAMLEN)[m
[31m-#define ngx_de_namelen(dir)      (dir)->de->d_namlen[m
[31m-#else[m
[31m-#define ngx_de_namelen(dir)      ngx_strlen((dir)->de->d_name)[m
[31m-#endif[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_de_info(u_char *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    dir->type = 0;[m
[31m-    return stat((const char *) name, &dir->info);[m
[31m-}[m
[31m-[m
[31m-#define ngx_de_info_n            "stat()"[m
[31m-#define ngx_de_link_info(name, dir)  lstat((const char *) name, &(dir)->info)[m
[31m-#define ngx_de_link_info_n       "lstat()"[m
[31m-[m
[31m-#if (NGX_HAVE_D_TYPE)[m
[31m-[m
[31m-/*[m
[31m- * some file systems (e.g. XFS on Linux and CD9660 on FreeBSD)[m
[31m- * do not set dirent.d_type[m
[31m- */[m
[31m-[m
[31m-#define ngx_de_is_dir(dir)                                                   \[m
[31m-    (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode)))[m
[31m-#define ngx_de_is_file(dir)                                                  \[m
[31m-    (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode)))[m
[31m-#define ngx_de_is_link(dir)                                                  \[m
[31m-    (((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode)))[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_de_is_dir(dir)       (S_ISDIR((dir)->info.st_mode))[m
[31m-#define ngx_de_is_file(dir)      (S_ISREG((dir)->info.st_mode))[m
[31m-#define ngx_de_is_link(dir)      (S_ISLNK((dir)->info.st_mode))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_de_access(dir)       (((dir)->info.st_mode) & 0777)[m
[31m-#define ngx_de_size(dir)         (dir)->info.st_size[m
[31m-#define ngx_de_fs_size(dir)                                                  \[m
[31m-    ngx_max((dir)->info.st_size, (dir)->info.st_blocks * 512)[m
[31m-#define ngx_de_mtime(dir)        (dir)->info.st_mtime[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_open_glob(ngx_glob_t *gl);[m
[31m-#define ngx_open_glob_n          "glob()"[m
[31m-ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name);[m
[31m-void ngx_close_glob(ngx_glob_t *gl);[m
[31m-[m
[31m-[m
[31m-ngx_err_t ngx_trylock_fd(ngx_fd_t fd);[m
[31m-ngx_err_t ngx_lock_fd(ngx_fd_t fd);[m
[31m-ngx_err_t ngx_unlock_fd(ngx_fd_t fd);[m
[31m-[m
[31m-#define ngx_trylock_fd_n         "fcntl(F_SETLK, F_WRLCK)"[m
[31m-#define ngx_lock_fd_n            "fcntl(F_SETLKW, F_WRLCK)"[m
[31m-#define ngx_unlock_fd_n          "fcntl(F_SETLK, F_UNLCK)"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_F_READAHEAD)[m
[31m-[m
[31m-#define NGX_HAVE_READ_AHEAD      1[m
[31m-[m
[31m-#define ngx_read_ahead(fd, n)    fcntl(fd, F_READAHEAD, (int) n)[m
[31m-#define ngx_read_ahead_n         "fcntl(fd, F_READAHEAD)"[m
[31m-[m
[31m-#elif (NGX_HAVE_POSIX_FADVISE)[m
[31m-[m
[31m-#define NGX_HAVE_READ_AHEAD      1[m
[31m-[m
[31m-ngx_int_t ngx_read_ahead(ngx_fd_t fd, size_t n);[m
[31m-#define ngx_read_ahead_n         "posix_fadvise(POSIX_FADV_SEQUENTIAL)"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_read_ahead(fd, n)    0[m
[31m-#define ngx_read_ahead_n         "ngx_read_ahead_n"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_O_DIRECT)[m
[31m-[m
[31m-ngx_int_t ngx_directio_on(ngx_fd_t fd);[m
[31m-#define ngx_directio_on_n        "fcntl(O_DIRECT)"[m
[31m-[m
[31m-ngx_int_t ngx_directio_off(ngx_fd_t fd);[m
[31m-#define ngx_directio_off_n       "fcntl(!O_DIRECT)"[m
[31m-[m
[31m-#elif (NGX_HAVE_F_NOCACHE)[m
[31m-[m
[31m-#define ngx_directio_on(fd)      fcntl(fd, F_NOCACHE, 1)[m
[31m-#define ngx_directio_on_n        "fcntl(F_NOCACHE, 1)"[m
[31m-[m
[31m-#elif (NGX_HAVE_DIRECTIO)[m
[31m-[m
[31m-#define ngx_directio_on(fd)      directio(fd, DIRECTIO_ON)[m
[31m-#define ngx_directio_on_n        "directio(DIRECTIO_ON)"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_directio_on(fd)      0[m
[31m-#define ngx_directio_on_n        "ngx_directio_on_n"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-size_t ngx_fs_bsize(u_char *name);[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_OPENAT)[m
[31m-[m
[31m-#define ngx_openat_file(fd, name, mode, create, access)                      \[m
[31m-    openat(fd, (const char *) name, mode|create, access)[m
[31m-[m
[31m-#define ngx_openat_file_n        "openat()"[m
[31m-[m
[31m-#define ngx_file_at_info(fd, name, sb, flag)                                 \[m
[31m-    fstatat(fd, (const char *) name, sb, flag)[m
[31m-[m
[31m-#define ngx_file_at_info_n       "fstatat()"[m
[31m-[m
[31m-#define NGX_AT_FDCWD             (ngx_fd_t) AT_FDCWD[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_stdout               STDOUT_FILENO[m
[31m-#define ngx_stderr               STDERR_FILENO[m
[31m-#define ngx_set_stderr(fd)       dup2(fd, STDERR_FILENO)[m
[31m-#define ngx_set_stderr_n         "dup2(STDERR_FILENO)"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-[m
[31m-ngx_int_t ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool);[m
[31m-ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-[m
[31m-extern ngx_uint_t  ngx_file_aio;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-ssize_t ngx_thread_read(ngx_file_t *file, u_char *buf, size_t size,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-ssize_t ngx_thread_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FILES_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd.h[m
[1mdeleted file mode 100644[m
[1mindex 4f93da5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FREEBSD_H_INCLUDED_[m
[31m-#define _NGX_FREEBSD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-void ngx_debug_init(void);[m
[31m-ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-extern int         ngx_freebsd_kern_osreldate;[m
[31m-extern int         ngx_freebsd_hw_ncpu;[m
[31m-extern u_long      ngx_freebsd_net_inet_tcp_sendspace;[m
[31m-[m
[31m-extern ngx_uint_t  ngx_freebsd_sendfile_nbytes_bug;[m
[31m-extern ngx_uint_t  ngx_freebsd_use_tcp_nopush;[m
[31m-extern ngx_uint_t  ngx_debug_malloc;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FREEBSD_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_config.h[m
[1mdeleted file mode 100644[m
[1mindex b7da48c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,123 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FREEBSD_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_FREEBSD_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <unistd.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <time.h>[m
[31m-#include <sys/param.h>          /* ALIGN() */[m
[31m-#include <sys/mount.h>          /* statfs() */[m
[31m-[m
[31m-#include <sys/filio.h>          /* FIONBIO */[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY, TCP_NOPUSH */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#include <libutil.h>            /* setproctitle() before 4.1 */[m
[31m-#include <osreldate.h>[m
[31m-#include <sys/sysctl.h>[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-[m
[31m-#if __FreeBSD_version < 400017[m
[31m-[m
[31m-/*[m
[31m- * FreeBSD 3.x has no CMSG_SPACE() and CMSG_LEN() and has the broken CMSG_DATA()[m
[31m- */[m
[31m-[m
[31m-#undef  CMSG_SPACE[m
[31m-#define CMSG_SPACE(l)       (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l))[m
[31m-[m
[31m-#undef  CMSG_LEN[m
[31m-#define CMSG_LEN(l)         (ALIGN(sizeof(struct cmsghdr)) + (l))[m
[31m-[m
[31m-#undef  CMSG_DATA[m
[31m-#define CMSG_DATA(cmsg)     ((u_char *)(cmsg) + ALIGN(sizeof(struct cmsghdr)))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-#include <sys/event.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-#include <aio.h>[m
[31m-typedef struct aiocb  ngx_aiocb_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG        -1[m
[31m-[m
[31m-[m
[31m-#ifdef __DragonFly__[m
[31m-#define NGX_KEEPALIVE_FACTOR      1000[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef IOV_MAX[m
[31m-#define IOV_MAX   1024[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_OS_SPECIFIC_INIT    1[m
[31m-#define NGX_HAVE_DEBUG_MALLOC        1[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-extern char  *malloc_options;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_init.c[m
[1mdeleted file mode 100644[m
[1mindex 71672c7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/* FreeBSD 3.0 at least */[m
[31m-char    ngx_freebsd_kern_ostype[16];[m
[31m-char    ngx_freebsd_kern_osrelease[128];[m
[31m-int     ngx_freebsd_kern_osreldate;[m
[31m-int     ngx_freebsd_hw_ncpu;[m
[31m-int     ngx_freebsd_kern_ipc_somaxconn;[m
[31m-u_long  ngx_freebsd_net_inet_tcp_sendspace;[m
[31m-[m
[31m-/* FreeBSD 4.9 */[m
[31m-int     ngx_freebsd_machdep_hlt_logical_cpus;[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_freebsd_sendfile_nbytes_bug;[m
[31m-ngx_uint_t  ngx_freebsd_use_tcp_nopush;[m
[31m-[m
[31m-ngx_uint_t  ngx_debug_malloc;[m
[31m-[m
[31m-[m
[31m-static ngx_os_io_t ngx_freebsd_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-    ngx_freebsd_sendfile_chain,[m
[31m-    NGX_IO_SENDFILE[m
[31m-#else[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char        *name;[m
[31m-    void        *value;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   exists;[m
[31m-} sysctl_t;[m
[31m-[m
[31m-[m
[31m-sysctl_t sysctls[] = {[m
[31m-    { "hw.ncpu",[m
[31m-      &ngx_freebsd_hw_ncpu,[m
[31m-      sizeof(ngx_freebsd_hw_ncpu), 0 },[m
[31m-[m
[31m-    { "machdep.hlt_logical_cpus",[m
[31m-      &ngx_freebsd_machdep_hlt_logical_cpus,[m
[31m-      sizeof(ngx_freebsd_machdep_hlt_logical_cpus), 0 },[m
[31m-[m
[31m-    { "net.inet.tcp.sendspace",[m
[31m-      &ngx_freebsd_net_inet_tcp_sendspace,[m
[31m-      sizeof(ngx_freebsd_net_inet_tcp_sendspace), 0 },[m
[31m-[m
[31m-    { "kern.ipc.somaxconn",[m
[31m-      &ngx_freebsd_kern_ipc_somaxconn,[m
[31m-      sizeof(ngx_freebsd_kern_ipc_somaxconn), 0 },[m
[31m-[m
[31m-    { NULL, NULL, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_debug_init(void)[m
[31m-{[m
[31m-#if (NGX_DEBUG_MALLOC)[m
[31m-[m
[31m-#if __FreeBSD_version >= 500014 && __FreeBSD_version < 1000011[m
[31m-    _malloc_options = "J";[m
[31m-#elif __FreeBSD_version < 500014[m
[31m-    malloc_options = "J";[m
[31m-#endif[m
[31m-[m
[31m-    ngx_debug_malloc = 1;[m
[31m-[m
[31m-#else[m
[31m-    char  *mo;[m
[31m-[m
[31m-    mo = getenv("MALLOC_OPTIONS");[m
[31m-[m
[31m-    if (mo && ngx_strchr(mo, 'J')) {[m
[31m-        ngx_debug_malloc = 1;[m
[31m-    }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_specific_init(ngx_log_t *log)[m
[31m-{[m
[31m-    int         version;[m
[31m-    size_t      size;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    size = sizeof(ngx_freebsd_kern_ostype);[m
[31m-    if (sysctlbyname("kern.ostype",[m
[31m-                     ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysctlbyname(kern.ostype) failed");[m
[31m-[m
[31m-        if (ngx_errno != NGX_ENOMEM) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_freebsd_kern_ostype[size - 1] = '\0';[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof(ngx_freebsd_kern_osrelease);[m
[31m-    if (sysctlbyname("kern.osrelease",[m
[31m-                     ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysctlbyname(kern.osrelease) failed");[m
[31m-[m
[31m-        if (ngx_errno != NGX_ENOMEM) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_freebsd_kern_osrelease[size - 1] = '\0';[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    size = sizeof(int);[m
[31m-    if (sysctlbyname("kern.osreldate",[m
[31m-                     &ngx_freebsd_kern_osreldate, &size, NULL, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysctlbyname(kern.osreldate) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    version = ngx_freebsd_kern_osreldate;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-[m
[31m-    /*[m
[31m-     * The determination of the sendfile() "nbytes bug" is complex enough.[m
[31m-     * There are two sendfile() syscalls: a new #393 has no bug while[m
[31m-     * an old #336 has the bug in some versions and has not in others.[m
[31m-     * Besides libc_r wrapper also emulates the bug in some versions.[m
[31m-     * There is no way to say exactly if syscall #336 in FreeBSD circa 4.6[m
[31m-     * has the bug.  We use the algorithm that is correct at least for[m
[31m-     * RELEASEs and for syscalls only (not libc_r wrapper).[m
[31m-     *[m
[31m-     * 4.6.1-RELEASE and below have the bug[m
[31m-     * 4.6.2-RELEASE and above have the new syscall[m
[31m-     *[m
[31m-     * We detect the new sendfile() syscall available at the compile time[m
[31m-     * to allow an old binary to run correctly on an updated FreeBSD system.[m
[31m-     */[m
[31m-[m
[31m-#if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \[m
[31m-    || __FreeBSD_version == 460002 || __FreeBSD_version >= 500039[m
[31m-[m
[31m-    /* a new syscall without the bug */[m
[31m-[m
[31m-    ngx_freebsd_sendfile_nbytes_bug = 0;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    /* an old syscall that may have the bug */[m
[31m-[m
[31m-    ngx_freebsd_sendfile_nbytes_bug = 1;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_HAVE_SENDFILE */[m
[31m-[m
[31m-[m
[31m-    if ((version < 500000 && version >= 440003) || version >= 500017) {[m
[31m-        ngx_freebsd_use_tcp_nopush = 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    for (i = 0; sysctls[i].name; i++) {[m
[31m-        size = sysctls[i].size;[m
[31m-[m
[31m-        if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            sysctls[i].exists = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == NGX_ENOENT) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "sysctlbyname(%s) failed", sysctls[i].name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_freebsd_machdep_hlt_logical_cpus) {[m
[31m-        ngx_ncpu = ngx_freebsd_hw_ncpu / 2;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_ncpu = ngx_freebsd_hw_ncpu;[m
[31m-    }[m
[31m-[m
[31m-    if (version < 600008 && ngx_freebsd_kern_ipc_somaxconn > 32767) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                      "sysctl kern.ipc.somaxconn must be less than 32768");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_tcp_nodelay_and_tcp_nopush = 1;[m
[31m-[m
[31m-    ngx_os_io = ngx_freebsd_io;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_specific_status(ngx_log_t *log)[m
[31m-{[m
[31m-    u_long      value;[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",[m
[31m-                  ngx_freebsd_kern_ostype, ngx_freebsd_kern_osrelease);[m
[31m-[m
[31m-#ifdef __DragonFly_version[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                  "kern.osreldate: %d, built on %d",[m
[31m-                  ngx_freebsd_kern_osreldate, __DragonFly_version);[m
[31m-#else[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                  "kern.osreldate: %d, built on %d",[m
[31m-                  ngx_freebsd_kern_osreldate, __FreeBSD_version);[m
[31m-#endif[m
[31m-[m
[31m-    for (i = 0; sysctls[i].name; i++) {[m
[31m-        if (sysctls[i].exists) {[m
[31m-            if (sysctls[i].size == sizeof(long)) {[m
[31m-                value = *(long *) sysctls[i].value;[m
[31m-[m
[31m-            } else {[m
[31m-                value = *(int *) sysctls[i].value;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",[m
[31m-                          sysctls[i].name, value);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_sendfile_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_sendfile_chain.c[m
[1mdeleted file mode 100644[m
[1mindex d0299f5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_freebsd_sendfile_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,325 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Although FreeBSD sendfile() allows to pass a header and a trailer,[m
[31m- * it cannot send a header with a part of the file in one packet until[m
[31m- * FreeBSD 5.3.  Besides, over the fast ethernet connection sendfile()[m
[31m- * may send the partially filled packets, i.e. the 8 file pages may be sent[m
[31m- * as the 11 full 1460-bytes packets, then one incomplete 324-bytes packet,[m
[31m- * and then again the 11 full 1460-bytes packets.[m
[31m- *[m
[31m- * Therefore we use the TCP_NOPUSH option (similar to Linux's TCP_CORK)[m
[31m- * to postpone the sending - it not only sends a header and the first part of[m
[31m- * the file in one packet, but also sends the file pages in the full packets.[m
[31m- *[m
[31m- * But until FreeBSD 4.5 turning TCP_NOPUSH off does not flush a pending[m
[31m- * data that less than MSS, so that data may be sent with 5 second delay.[m
[31m- * So we do not use TCP_NOPUSH on FreeBSD prior to 4.5, although it can be used[m
[31m- * for non-keepalive HTTP connections.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int               rc, flags;[m
[31m-    off_t             send, prev_send, sent;[m
[31m-    size_t            file_size;[m
[31m-    ssize_t           n;[m
[31m-    ngx_uint_t        eintr, eagain;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_buf_t        *file;[m
[31m-    ngx_event_t      *wev;[m
[31m-    ngx_chain_t      *cl;[m
[31m-    ngx_iovec_t       header, trailer;[m
[31m-    struct sf_hdtr    hdtr;[m
[31m-    struct iovec      headers[NGX_IOVS_PREALLOCATE];[m
[31m-    struct iovec      trailers[NGX_IOVS_PREALLOCATE];[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-    ngx_uint_t        ebusy;[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-#endif[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {[m
[31m-        (void) ngx_connection_error(c, wev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-        wev->error = 1;[m
[31m-        return NGX_CHAIN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* the maximum limit size is the maximum size_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    send = 0;[m
[31m-    eagain = 0;[m
[31m-    flags = 0;[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE && NGX_SUPPRESS_WARN)[m
[31m-    aio = NULL;[m
[31m-    file = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    header.iovs = headers;[m
[31m-    header.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    trailer.iovs = trailers;[m
[31m-    trailer.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        eintr = 0;[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-        ebusy = 0;[m
[31m-#endif[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        /* create the header iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log);[m
[31m-[m
[31m-        if (cl == NGX_CHAIN_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        send += header.size;[m
[31m-[m
[31m-        if (cl && cl->buf->in_file && send < limit) {[m
[31m-            file = cl->buf;[m
[31m-[m
[31m-            /* coalesce the neighbouring file bufs */[m
[31m-[m
[31m-            file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);[m
[31m-[m
[31m-            send += file_size;[m
[31m-[m
[31m-            /* create the trailer iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-            cl = ngx_output_chain_to_iovec(&trailer, cl, limit - send, c->log);[m
[31m-[m
[31m-            if (cl == NGX_CHAIN_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            send += trailer.size;[m
[31m-[m
[31m-            if (ngx_freebsd_use_tcp_nopush[m
[31m-                && c->tcp_nopush == NGX_TCP_NOPUSH_UNSET)[m
[31m-            {[m
[31m-                if (ngx_tcp_nopush(c->fd) == NGX_ERROR) {[m
[31m-                    err = ngx_socket_errno;[m
[31m-[m
[31m-                    /*[m
[31m-                     * there is a tiny chance to be interrupted, however,[m
[31m-                     * we continue a processing without the TCP_NOPUSH[m
[31m-                     */[m
[31m-[m
[31m-                    if (err != NGX_EINTR) {[m
[31m-                        wev->error = 1;[m
[31m-                        (void) ngx_connection_error(c, err,[m
[31m-                                                    ngx_tcp_nopush_n " failed");[m
[31m-                        return NGX_CHAIN_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    c->tcp_nopush = NGX_TCP_NOPUSH_SET;[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                                   "tcp_nopush");[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * sendfile() does unneeded work if sf_hdtr's count is 0,[m
[31m-             * but corresponding pointer is not NULL[m
[31m-             */[m
[31m-[m
[31m-            hdtr.headers = header.count ? header.iovs : NULL;[m
[31m-            hdtr.hdr_cnt = header.count;[m
[31m-            hdtr.trailers = trailer.count ? trailer.iovs : NULL;[m
[31m-            hdtr.trl_cnt = trailer.count;[m
[31m-[m
[31m-            /*[m
[31m-             * the "nbytes bug" of the old sendfile() syscall:[m
[31m-             * http://bugs.freebsd.org/33771[m
[31m-             */[m
[31m-[m
[31m-            if (!ngx_freebsd_sendfile_nbytes_bug) {[m
[31m-                header.size = 0;[m
[31m-            }[m
[31m-[m
[31m-            sent = 0;[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-            aio = file->file->aio;[m
[31m-            flags = (aio && aio->preload_handler) ? SF_NODISKIO : 0;[m
[31m-#endif[m
[31m-[m
[31m-            rc = sendfile(file->file->fd, c->fd, file->file_pos,[m
[31m-                          file_size + header.size, &hdtr, &sent, flags);[m
[31m-[m
[31m-            if (rc == -1) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                switch (err) {[m
[31m-                case NGX_EAGAIN:[m
[31m-                    eagain = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_EINTR:[m
[31m-                    eintr = 1;[m
[31m-                    break;[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-                case NGX_EBUSY:[m
[31m-                    ebusy = 1;[m
[31m-                    break;[m
[31m-#endif[m
[31m-[m
[31m-                default:[m
[31m-                    wev->error = 1;[m
[31m-                    (void) ngx_connection_error(c, err, "sendfile() failed");[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                               "sendfile() sent only %O bytes", sent);[m
[31m-[m
[31m-            /*[m
[31m-             * sendfile() in FreeBSD 3.x-4.x may return value >= 0[m
[31m-             * on success, although only 0 is documented[m
[31m-             */[m
[31m-[m
[31m-            } else if (rc >= 0 && sent == 0) {[m
[31m-[m
[31m-                /*[m
[31m-                 * if rc is OK and sent equal to zero, then someone[m
[31m-                 * has truncated the file, so the offset became beyond[m
[31m-                 * the end of the file[m
[31m-                 */[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                         "sendfile() reported that \"%s\" was truncated at %O",[m
[31m-                         file->file->name.data, file->file_pos);[m
[31m-[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "sendfile: %d, @%O %O:%uz",[m
[31m-                           rc, file->file_pos, sent, file_size + header.size);[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_writev(c, &header);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-        }[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-#if (NGX_HAVE_AIO_SENDFILE)[m
[31m-[m
[31m-        if (ebusy) {[m
[31m-            if (aio->event.active) {[m
[31m-                /*[m
[31m-                 * tolerate duplicate calls; they can happen due to subrequests[m
[31m-                 * or multiple calls of the next body filter from a filter[m
[31m-                 */[m
[31m-[m
[31m-                if (sent) {[m
[31m-                    c->busy_count = 0;[m
[31m-                }[m
[31m-[m
[31m-                return in;[m
[31m-            }[m
[31m-[m
[31m-            if (sent == 0) {[m
[31m-                c->busy_count++;[m
[31m-[m
[31m-                if (c->busy_count > 2) {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                                  "sendfile(%V) returned busy again",[m
[31m-                                  &file->file->name);[m
[31m-[m
[31m-                    c->busy_count = 0;[m
[31m-                    aio->preload_handler = NULL;[m
[31m-[m
[31m-                    send = prev_send;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                c->busy_count = 0;[m
[31m-            }[m
[31m-[m
[31m-            n = aio->preload_handler(file);[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                send = prev_send + sent;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (flags == SF_NODISKIO) {[m
[31m-            c->busy_count = 0;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        if (eagain) {[m
[31m-[m
[31m-            /*[m
[31m-             * sendfile() may return EAGAIN, even if it has sent a whole file[m
[31m-             * part, it indicates that the successive sendfile() call would[m
[31m-             * return EAGAIN right away and would not send anything.[m
[31m-             * We use it as a hint.[m
[31m-             */[m
[31m-[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (eintr) {[m
[31m-            send = prev_send + sent;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (send - prev_send != sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_amd64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_amd64.h[m
[1mdeleted file mode 100644[m
[1mindex 159a297..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_amd64.h[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define NGX_SMP_LOCK  "lock;"[m
[31m-#else[m
[31m-#define NGX_SMP_LOCK[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "cmpxchgq  r, [m]":[m
[31m- *[m
[31m- *     if (rax == [m]) {[m
[31m- *         zf = 1;[m
[31m- *         [m] = r;[m
[31m- *     } else {[m
[31m- *         zf = 0;[m
[31m- *         rax = [m];[m
[31m- *     }[m
[31m- *[m
[31m- *[m
[31m- * The "r" is any register, %rax (%r0) - %r16.[m
[31m- * The "=a" and "a" are the %rax register.[m
[31m- * Although we can return result in any register, we use "a" because it is[m
[31m- * used in cmpxchgq anyway.  The result is actually in %al but not in $rax,[m
[31m- * however as the code is inlined gcc can test %al as well as %rax.[m
[31m- *[m
[31m- * The "cc" means that flags were changed.[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    u_char  res;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    cmpxchgq  %3, %1;   "[m
[31m-    "    sete      %0;       "[m
[31m-[m
[31m-    : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "xaddq  r, [m]":[m
[31m- *[m
[31m- *     temp = [m];[m
[31m- *     [m] += r;[m
[31m- *     r = temp;[m
[31m- *[m
[31m- *[m
[31m- * The "+r" is any register, %rax (%r0) - %r16.[m
[31m- * The "cc" means that flags were changed.[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    xaddq  %0, %1;   "[m
[31m-[m
[31m-    : "+r" (add) : "m" (*value) : "cc", "memory");[m
[31m-[m
[31m-    return add;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_memory_barrier()    __asm__ volatile ("" ::: "memory")[m
[31m-[m
[31m-#define ngx_cpu_pause()         __asm__ ("pause")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_ppc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_ppc.h[m
[1mdeleted file mode 100644[m
[1mindex 45afc4b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_ppc.h[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * The ppc assembler treats ";" as comment, so we have to use "\n".[m
[31m- * The minus in "bne-" is a hint for the branch prediction unit that[m
[31m- * this branch is unlikely to be taken.[m
[31m- * The "1b" means the nearest backward label "1" and the "1f" means[m
[31m- * the nearest forward label "1".[m
[31m- *[m
[31m- * The "b" means that the base registers can be used only, i.e.[m
[31m- * any register except r0.  The r0 register always has a zero value and[m
[31m- * could not be used in "addi  r0, r0, 1".[m
[31m- * The "=&b" means that no input registers can be used.[m
[31m- *[m
[31m- * "sync"    read and write barriers[m
[31m- * "isync"   read barrier, is faster than "sync"[m
[31m- * "eieio"   write barrier, is faster than "sync"[m
[31m- * "lwsync"  write barrier, is faster than "eieio" on ppc64[m
[31m- */[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 8)[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  res, temp;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    "    li      %0, 0       \n" /* preset "0" to "res"                      */[m
[31m-    "    lwsync              \n" /* write barrier                            */[m
[31m-    "1:                      \n"[m
[31m-    "    ldarx   %1, 0, %2   \n" /* load from [lock] into "temp"             */[m
[31m-                                 /*   and store reservation                  */[m
[31m-    "    cmpd    %1, %3      \n" /* compare "temp" and "old"                 */[m
[31m-    "    bne-    2f          \n" /* not equal                                */[m
[31m-    "    stdcx.  %4, 0, %2   \n" /* store "set" into [lock] if reservation   */[m
[31m-                                 /*   is not cleared                         */[m
[31m-    "    bne-    1b          \n" /* the reservation was cleared              */[m
[31m-    "    isync               \n" /* read barrier                             */[m
[31m-    "    li      %0, 1       \n" /* set "1" to "res"                         */[m
[31m-    "2:                      \n"[m
[31m-[m
[31m-    : "=&b" (res), "=&b" (temp)[m
[31m-    : "b" (lock), "b" (old), "b" (set)[m
[31m-    : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  res, temp;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    "    lwsync              \n" /* write barrier                            */[m
[31m-    "1:  ldarx   %0, 0, %2   \n" /* load from [value] into "res"             */[m
[31m-                                 /*   and store reservation                  */[m
[31m-    "    add     %1, %0, %3  \n" /* "res" + "add" store in "temp"            */[m
[31m-    "    stdcx.  %1, 0, %2   \n" /* store "temp" into [value] if reservation */[m
[31m-                                 /*   is not cleared                         */[m
[31m-    "    bne-    1b          \n" /* try again if reservation was cleared     */[m
[31m-    "    isync               \n" /* read barrier                             */[m
[31m-[m
[31m-    : "=&b" (res), "=&b" (temp)[m
[31m-    : "b" (value), "b" (add)[m
[31m-    : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define ngx_memory_barrier()                                                  \[m
[31m-    __asm__ volatile ("isync  \n  lwsync  \n" ::: "memory")[m
[31m-#else[m
[31m-#define ngx_memory_barrier()   __asm__ volatile ("" ::: "memory")[m
[31m-#endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  res, temp;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    "    li      %0, 0       \n" /* preset "0" to "res"                      */[m
[31m-    "    eieio               \n" /* write barrier                            */[m
[31m-    "1:                      \n"[m
[31m-    "    lwarx   %1, 0, %2   \n" /* load from [lock] into "temp"             */[m
[31m-                                 /*   and store reservation                  */[m
[31m-    "    cmpw    %1, %3      \n" /* compare "temp" and "old"                 */[m
[31m-    "    bne-    2f          \n" /* not equal                                */[m
[31m-    "    stwcx.  %4, 0, %2   \n" /* store "set" into [lock] if reservation   */[m
[31m-                                 /*   is not cleared                         */[m
[31m-    "    bne-    1b          \n" /* the reservation was cleared              */[m
[31m-    "    isync               \n" /* read barrier                             */[m
[31m-    "    li      %0, 1       \n" /* set "1" to "res"                         */[m
[31m-    "2:                      \n"[m
[31m-[m
[31m-    : "=&b" (res), "=&b" (temp)[m
[31m-    : "b" (lock), "b" (old), "b" (set)[m
[31m-    : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  res, temp;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    "    eieio               \n" /* write barrier                            */[m
[31m-    "1:  lwarx   %0, 0, %2   \n" /* load from [value] into "res"             */[m
[31m-                                 /*   and store reservation                  */[m
[31m-    "    add     %1, %0, %3  \n" /* "res" + "add" store in "temp"            */[m
[31m-    "    stwcx.  %1, 0, %2   \n" /* store "temp" into [value] if reservation */[m
[31m-                                 /*   is not cleared                         */[m
[31m-    "    bne-    1b          \n" /* try again if reservation was cleared     */[m
[31m-    "    isync               \n" /* read barrier                             */[m
[31m-[m
[31m-    : "=&b" (res), "=&b" (temp)[m
[31m-    : "b" (value), "b" (add)[m
[31m-    : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define ngx_memory_barrier()                                                  \[m
[31m-    __asm__ volatile ("isync  \n  eieio  \n" ::: "memory")[m
[31m-#else[m
[31m-#define ngx_memory_barrier()   __asm__ volatile ("" ::: "memory")[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_sparc64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_sparc64.h[m
[1mdeleted file mode 100644[m
[1mindex a84db35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_sparc64.h[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "casa   [r1] 0x80, r2, r0"  and[m
[31m- * "casxa  [r1] 0x80, r2, r0"  do the following:[m
[31m- *[m
[31m- *     if ([r1] == r2) {[m
[31m- *         swap(r0, [r1]);[m
[31m- *     } else {[m
[31m- *         r0 = [r1];[m
[31m- *     }[m
[31m- *[m
[31m- * so "r0 == r2" means that the operation was successful.[m
[31m- *[m
[31m- *[m
[31m- * The "r" means the general register.[m
[31m- * The "+r" means the general register used for both input and output.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-#define NGX_CASA  "casa"[m
[31m-#else[m
[31m-#define NGX_CASA  "casxa"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-    NGX_CASA " [%1] 0x80, %2, %0"[m
[31m-[m
[31m-    : "+r" (set) : "r" (lock), "r" (old) : "memory");[m
[31m-[m
[31m-    return (set == old);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  old, res;[m
[31m-[m
[31m-    old = *value;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        res = old + add;[m
[31m-[m
[31m-        __asm__ volatile ([m
[31m-[m
[31m-        NGX_CASA " [%1] 0x80, %2, %0"[m
[31m-[m
[31m-        : "+r" (res) : "r" (value), "r" (old) : "memory");[m
[31m-[m
[31m-        if (res == old) {[m
[31m-            return res;[m
[31m-        }[m
[31m-[m
[31m-        old = res;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define ngx_memory_barrier()                                                  \[m
[31m-            __asm__ volatile (                                                \[m
[31m-            "membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad"        \[m
[31m-            ::: "memory")[m
[31m-#else[m
[31m-#define ngx_memory_barrier()   __asm__ volatile ("" ::: "memory")[m
[31m-#endif[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_x86.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_x86.h[m
[1mdeleted file mode 100644[m
[1mindex 54e01ae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_gcc_atomic_x86.h[m
[1m+++ /dev/null[m
[36m@@ -1,127 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_SMP)[m
[31m-#define NGX_SMP_LOCK  "lock;"[m
[31m-#else[m
[31m-#define NGX_SMP_LOCK[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "cmpxchgl  r, [m]":[m
[31m- *[m
[31m- *     if (eax == [m]) {[m
[31m- *         zf = 1;[m
[31m- *         [m] = r;[m
[31m- *     } else {[m
[31m- *         zf = 0;[m
[31m- *         eax = [m];[m
[31m- *     }[m
[31m- *[m
[31m- *[m
[31m- * The "r" means the general register.[m
[31m- * The "=a" and "a" are the %eax register.[m
[31m- * Although we can return result in any register, we use "a" because it is[m
[31m- * used in cmpxchgl anyway.  The result is actually in %al but not in %eax,[m
[31m- * however, as the code is inlined gcc can test %al as well as %eax,[m
[31m- * and icc adds "movzbl %al, %eax" by itself.[m
[31m- *[m
[31m- * The "cc" means that flags were changed.[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    u_char  res;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    cmpxchgl  %3, %1;   "[m
[31m-    "    sete      %0;       "[m
[31m-[m
[31m-    : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");[m
[31m-[m
[31m-    return res;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * "xaddl  r, [m]":[m
[31m- *[m
[31m- *     temp = [m];[m
[31m- *     [m] += r;[m
[31m- *     r = temp;[m
[31m- *[m
[31m- *[m
[31m- * The "+r" means the general register.[m
[31m- * The "cc" means that flags were changed.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if !(( __GNUC__ == 2 && __GNUC_MINOR__ <= 7 ) || ( __INTEL_COMPILER >= 800 ))[m
[31m-[m
[31m-/*[m
[31m- * icc 8.1 and 9.0 compile broken code with -march=pentium4 option:[m
[31m- * ngx_atomic_fetch_add() always return the input "add" value,[m
[31m- * so we use the gcc 2.7 version.[m
[31m- *[m
[31m- * icc 8.1 and 9.0 with -march=pentiumpro option or icc 7.1 compile[m
[31m- * correct code.[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    xaddl  %0, %1;   "[m
[31m-[m
[31m-    : "+r" (add) : "m" (*value) : "cc", "memory");[m
[31m-[m
[31m-    return add;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/*[m
[31m- * gcc 2.7 does not support "+r", so we have to use the fixed[m
[31m- * %eax ("=a" and "a") and this adds two superfluous instructions in the end[m
[31m- * of code, something like this: "mov %eax, %edx / mov %edx, %eax".[m
[31m- */[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  old;[m
[31m-[m
[31m-    __asm__ volatile ([m
[31m-[m
[31m-         NGX_SMP_LOCK[m
[31m-    "    xaddl  %2, %1;   "[m
[31m-[m
[31m-    : "=a" (old) : "m" (*value), "a" (add) : "cc", "memory");[m
[31m-[m
[31m-    return old;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * on x86 the write operations go in a program order, so we need only[m
[31m- * to disable the gcc reorder optimizations[m
[31m- */[m
[31m-[m
[31m-#define ngx_memory_barrier()    __asm__ volatile ("" ::: "memory")[m
[31m-[m
[31m-/* old "as" does not support "pause" opcode */[m
[31m-#define ngx_cpu_pause()         __asm__ (".byte 0xf3, 0x90")[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux.h[m
[1mdeleted file mode 100644[m
[1mindex 13d654e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LINUX_H_INCLUDED_[m
[31m-#define _NGX_LINUX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LINUX_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_aio_read.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_aio_read.c[m
[1mdeleted file mode 100644[m
[1mindex 9f0a6c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_aio_read.c[m
[1m+++ /dev/null[m
[36m@@ -1,148 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-extern int            ngx_eventfd;[m
[31m-extern aio_context_t  ngx_aio_ctx;[m
[31m-[m
[31m-[m
[31m-static void ngx_file_aio_event_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-io_submit(aio_context_t ctx, long n, struct iocb **paiocb)[m
[31m-{[m
[31m-    return syscall(SYS_io_submit, ctx, n, paiocb);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    aio = ngx_pcalloc(pool, sizeof(ngx_event_aio_t));[m
[31m-    if (aio == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio->file = file;[m
[31m-    aio->fd = file->fd;[m
[31m-    aio->event.data = aio;[m
[31m-    aio->event.ready = 1;[m
[31m-    aio->event.log = file->log;[m
[31m-[m
[31m-    file->aio = aio;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_err_t         err;[m
[31m-    struct iocb      *piocb[1];[m
[31m-    ngx_event_t      *ev;[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    if (!ngx_file_aio) {[m
[31m-        return ngx_read_file(file, buf, size, offset);[m
[31m-    }[m
[31m-[m
[31m-    if (file->aio == NULL && ngx_file_aio_init(file, pool) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    aio = file->aio;[m
[31m-    ev = &aio->event;[m
[31m-[m
[31m-    if (!ev->ready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, file->log, 0,[m
[31m-                      "second aio post for \"%V\"", &file->name);[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,[m
[31m-                   "aio complete:%d @%O:%uz %V",[m
[31m-                   ev->complete, offset, size, &file->name);[m
[31m-[m
[31m-    if (ev->complete) {[m
[31m-        ev->active = 0;[m
[31m-        ev->complete = 0;[m
[31m-[m
[31m-        if (aio->res >= 0) {[m
[31m-            ngx_set_errno(0);[m
[31m-            return aio->res;[m
[31m-        }[m
[31m-[m
[31m-        ngx_set_errno(-aio->res);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,[m
[31m-                      "aio read \"%s\" failed", file->name.data);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&aio->aiocb, sizeof(struct iocb));[m
[31m-[m
[31m-    aio->aiocb.aio_data = (uint64_t) (uintptr_t) ev;[m
[31m-    aio->aiocb.aio_lio_opcode = IOCB_CMD_PREAD;[m
[31m-    aio->aiocb.aio_fildes = file->fd;[m
[31m-    aio->aiocb.aio_buf = (uint64_t) (uintptr_t) buf;[m
[31m-    aio->aiocb.aio_nbytes = size;[m
[31m-    aio->aiocb.aio_offset = offset;[m
[31m-    aio->aiocb.aio_flags = IOCB_FLAG_RESFD;[m
[31m-    aio->aiocb.aio_resfd = ngx_eventfd;[m
[31m-[m
[31m-    ev->handler = ngx_file_aio_event_handler;[m
[31m-[m
[31m-    piocb[0] = &aio->aiocb;[m
[31m-[m
[31m-    if (io_submit(ngx_aio_ctx, 1, piocb) == 1) {[m
[31m-        ev->active = 1;[m
[31m-        ev->ready = 0;[m
[31m-        ev->complete = 0;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    if (err == NGX_EAGAIN) {[m
[31m-        return ngx_read_file(file, buf, size, offset);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, file->log, err,[m
[31m-                  "io_submit(\"%V\") failed", &file->name);[m
[31m-[m
[31m-    if (err == NGX_ENOSYS) {[m
[31m-        ngx_file_aio = 0;[m
[31m-        return ngx_read_file(file, buf, size, offset);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_file_aio_event_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_event_aio_t  *aio;[m
[31m-[m
[31m-    aio = ev->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                   "aio event handler fd:%d %V", aio->fd, &aio->file->name);[m
[31m-[m
[31m-    aio->handler(ev);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_config.h[m
[1mdeleted file mode 100644[m
[1mindex 2f6129d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,123 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_LINUX_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_LINUX_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#ifndef _GNU_SOURCE[m
[31m-#define _GNU_SOURCE             /* pread(), pwrite(), gethostname() */[m
[31m-#endif[m
[31m-[m
[31m-#define _FILE_OFFSET_BITS  64[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <unistd.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <sys/vfs.h>            /* statfs() */[m
[31m-[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY, TCP_CORK */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#include <time.h>               /* tzset() */[m
[31m-#include <malloc.h>             /* memalign() */[m
[31m-#include <limits.h>             /* IOV_MAX */[m
[31m-#include <sys/ioctl.h>[m
[31m-#include <crypt.h>[m
[31m-#include <sys/utsname.h>        /* uname() */[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_PRCTL_H)[m
[31m-#include <sys/prctl.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SENDFILE64)[m
[31m-#include <sys/sendfile.h>[m
[31m-#else[m
[31m-extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size);[m
[31m-#define NGX_SENDFILE_LIMIT  0x80000000[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EPOLL)[m
[31m-#include <sys/epoll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_EVENTFD_H)[m
[31m-#include <sys/eventfd.h>[m
[31m-#endif[m
[31m-#include <sys/syscall.h>[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-#include <linux/aio_abi.h>[m
[31m-typedef struct iocb  ngx_aiocb_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG        511[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SO_SNDLOWAT[m
[31m-/* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */[m
[31m-#define NGX_HAVE_SO_SNDLOWAT         0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_OS_SPECIFIC_INIT    1[m
[31m-#define ngx_debug_init()[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_init.c[m
[1mdeleted file mode 100644[m
[1mindex a1372e9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-u_char  ngx_linux_kern_ostype[50];[m
[31m-u_char  ngx_linux_kern_osrelease[50];[m
[31m-[m
[31m-[m
[31m-static ngx_os_io_t ngx_linux_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-    ngx_linux_sendfile_chain,[m
[31m-    NGX_IO_SENDFILE[m
[31m-#else[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_specific_init(ngx_log_t *log)[m
[31m-{[m
[31m-    struct utsname  u;[m
[31m-[m
[31m-    if (uname(&u) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname,[m
[31m-                       sizeof(ngx_linux_kern_ostype));[m
[31m-[m
[31m-    (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release,[m
[31m-                       sizeof(ngx_linux_kern_osrelease));[m
[31m-[m
[31m-    ngx_os_io = ngx_linux_io;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_specific_status(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",[m
[31m-                  ngx_linux_kern_ostype, ngx_linux_kern_osrelease);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_sendfile_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_sendfile_chain.c[m
[1mdeleted file mode 100644[m
[1mindex 3c0696a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_linux_sendfile_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,462 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-static ssize_t ngx_linux_sendfile(ngx_connection_t *c, ngx_buf_t *file,[m
[31m-    size_t size);[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-#include <ngx_thread_pool.h>[m
[31m-[m
[31m-#if !(NGX_HAVE_SENDFILE64)[m
[31m-#error sendfile64() is required![m
[31m-#endif[m
[31m-[m
[31m-static ngx_int_t ngx_linux_sendfile_thread(ngx_connection_t *c, ngx_buf_t *file,[m
[31m-    size_t size, size_t *sent);[m
[31m-static void ngx_linux_sendfile_thread_handler(void *data, ngx_log_t *log);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * On Linux up to 2.4.21 sendfile() (syscall #187) works with 32-bit[m
[31m- * offsets only, and the including <sys/sendfile.h> breaks the compiling,[m
[31m- * if off_t is 64 bit wide.  So we use own sendfile() definition, where offset[m
[31m- * parameter is int32_t, and use sendfile() for the file parts below 2G only,[m
[31m- * see src/os/unix/ngx_linux_config.h[m
[31m- *[m
[31m- * Linux 2.4.21 has the new sendfile64() syscall #239.[m
[31m- *[m
[31m- * On Linux up to 2.6.16 sendfile() does not allow to pass the count parameter[m
[31m- * more than 2G-1 bytes even on 64-bit platforms: it returns EINVAL,[m
[31m- * so we limit it to 2G-1 bytes.[m
[31m- */[m
[31m-[m
[31m-#define NGX_SENDFILE_MAXSIZE  2147483647L[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int            tcp_nodelay;[m
[31m-    off_t          send, prev_send;[m
[31m-    size_t         file_size, sent;[m
[31m-    ssize_t        n;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_buf_t     *file;[m
[31m-    ngx_event_t   *wev;[m
[31m-    ngx_chain_t   *cl;[m
[31m-    ngx_iovec_t    header;[m
[31m-    struct iovec   headers[NGX_IOVS_PREALLOCATE];[m
[31m-#if (NGX_THREADS)[m
[31m-    ngx_int_t      rc;[m
[31m-    ngx_uint_t     thread_handled, thread_complete;[m
[31m-#endif[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the maximum limit size is 2G-1 - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_SENDFILE_MAXSIZE - ngx_pagesize)) {[m
[31m-        limit = NGX_SENDFILE_MAXSIZE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    header.iovs = headers;[m
[31m-    header.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        prev_send = send;[m
[31m-#if (NGX_THREADS)[m
[31m-        thread_handled = 0;[m
[31m-        thread_complete = 0;[m
[31m-#endif[m
[31m-[m
[31m-        /* create the iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log);[m
[31m-[m
[31m-        if (cl == NGX_CHAIN_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        send += header.size;[m
[31m-[m
[31m-        /* set TCP_CORK if there is a header before a file */[m
[31m-[m
[31m-        if (c->tcp_nopush == NGX_TCP_NOPUSH_UNSET[m
[31m-            && header.count != 0[m
[31m-            && cl[m
[31m-            && cl->buf->in_file)[m
[31m-        {[m
[31m-            /* the TCP_CORK and TCP_NODELAY are mutually exclusive */[m
[31m-[m
[31m-            if (c->tcp_nodelay == NGX_TCP_NODELAY_SET) {[m
[31m-[m
[31m-                tcp_nodelay = 0;[m
[31m-[m
[31m-                if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                               (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-                {[m
[31m-                    err = ngx_socket_errno;[m
[31m-[m
[31m-                    /*[m
[31m-                     * there is a tiny chance to be interrupted, however,[m
[31m-                     * we continue a processing with the TCP_NODELAY[m
[31m-                     * and without the TCP_CORK[m
[31m-                     */[m
[31m-[m
[31m-                    if (err != NGX_EINTR) {[m
[31m-                        wev->error = 1;[m
[31m-                        ngx_connection_error(c, err,[m
[31m-                                             "setsockopt(TCP_NODELAY) failed");[m
[31m-                        return NGX_CHAIN_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    c->tcp_nodelay = NGX_TCP_NODELAY_UNSET;[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                                   "no tcp_nodelay");[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-[m
[31m-                if (ngx_tcp_nopush(c->fd) == NGX_ERROR) {[m
[31m-                    err = ngx_socket_errno;[m
[31m-[m
[31m-                    /*[m
[31m-                     * there is a tiny chance to be interrupted, however,[m
[31m-                     * we continue a processing without the TCP_CORK[m
[31m-                     */[m
[31m-[m
[31m-                    if (err != NGX_EINTR) {[m
[31m-                        wev->error = 1;[m
[31m-                        ngx_connection_error(c, err,[m
[31m-                                             ngx_tcp_nopush_n " failed");[m
[31m-                        return NGX_CHAIN_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    c->tcp_nopush = NGX_TCP_NOPUSH_SET;[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                                   "tcp_nopush");[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* get the file buf */[m
[31m-[m
[31m-        if (header.count == 0 && cl && cl->buf->in_file && send < limit) {[m
[31m-            file = cl->buf;[m
[31m-[m
[31m-            /* coalesce the neighbouring file bufs */[m
[31m-[m
[31m-            file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);[m
[31m-[m
[31m-            send += file_size;[m
[31m-#if 1[m
[31m-            if (file_size == 0) {[m
[31m-                ngx_debug_point();[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-            if (file->file->thread_handler) {[m
[31m-                rc = ngx_linux_sendfile_thread(c, file, file_size, &sent);[m
[31m-[m
[31m-                switch (rc) {[m
[31m-                case NGX_OK:[m
[31m-                    thread_handled = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_DONE:[m
[31m-                    thread_complete = 1;[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_AGAIN:[m
[31m-                    break;[m
[31m-[m
[31m-                default: /* NGX_ERROR */[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-            } else[m
[31m-#endif[m
[31m-            {[m
[31m-                n = ngx_linux_sendfile(c, file, file_size);[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_writev(c, &header);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-        }[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if ((size_t) (send - prev_send) != sent) {[m
[31m-#if (NGX_THREADS)[m
[31m-            if (thread_handled) {[m
[31m-                return in;[m
[31m-            }[m
[31m-[m
[31m-            if (thread_complete) {[m
[31m-                send = prev_send + sent;[m
[31m-                continue;[m
[31m-            }[m
[31m-#endif[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ssize_t[m
[31m-ngx_linux_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size)[m
[31m-{[m
[31m-#if (NGX_HAVE_SENDFILE64)[m
[31m-    off_t      offset;[m
[31m-#else[m
[31m-    int32_t    offset;[m
[31m-#endif[m
[31m-    ssize_t    n;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-#if (NGX_HAVE_SENDFILE64)[m
[31m-    offset = file->file_pos;[m
[31m-#else[m
[31m-    offset = (int32_t) file->file_pos;[m
[31m-#endif[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "sendfile: @%O %uz", file->file_pos, size);[m
[31m-[m
[31m-    n = sendfile(c->fd, file->file->fd, &offset, size);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        switch (err) {[m
[31m-        case NGX_EAGAIN:[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "sendfile() is not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-[m
[31m-        case NGX_EINTR:[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "sendfile() was interrupted");[m
[31m-            goto eintr;[m
[31m-[m
[31m-        default:[m
[31m-            c->write->error = 1;[m
[31m-            ngx_connection_error(c, err, "sendfile() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        /*[m
[31m-         * if sendfile returns zero, then someone has truncated the file,[m
[31m-         * so the offset became beyond the end of the file[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                      "sendfile() reported that \"%s\" was truncated at %O",[m
[31m-                      file->file->name.data, file->file_pos);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, "sendfile: %z of %uz @%O",[m
[31m-                   n, size, file->file_pos);[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_buf_t     *file;[m
[31m-    ngx_socket_t   socket;[m
[31m-    size_t         size;[m
[31m-[m
[31m-    size_t         sent;[m
[31m-    ngx_err_t      err;[m
[31m-} ngx_linux_sendfile_ctx_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_linux_sendfile_thread(ngx_connection_t *c, ngx_buf_t *file, size_t size,[m
[31m-    size_t *sent)[m
[31m-{[m
[31m-    ngx_event_t               *wev;[m
[31m-    ngx_thread_task_t         *task;[m
[31m-    ngx_linux_sendfile_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, c->log, 0,[m
[31m-                   "linux sendfile thread: %d, %uz, %O",[m
[31m-                   file->file->fd, size, file->file_pos);[m
[31m-[m
[31m-    task = c->sendfile_task;[m
[31m-[m
[31m-    if (task == NULL) {[m
[31m-        task = ngx_thread_task_alloc(c->pool, sizeof(ngx_linux_sendfile_ctx_t));[m
[31m-        if (task == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        task->handler = ngx_linux_sendfile_thread_handler;[m
[31m-[m
[31m-        c->sendfile_task = task;[m
[31m-    }[m
[31m-[m
[31m-    ctx = task->ctx;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (task->event.complete) {[m
[31m-        task->event.complete = 0;[m
[31m-[m
[31m-        if (ctx->err == NGX_EAGAIN) {[m
[31m-            *sent = 0;[m
[31m-[m
[31m-            if (wev->complete) {[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->err) {[m
[31m-            wev->error = 1;[m
[31m-            ngx_connection_error(c, ctx->err, "sendfile() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->sent == 0) {[m
[31m-            /*[m
[31m-             * if sendfile returns zero, then someone has truncated the file,[m
[31m-             * so the offset became beyond the end of the file[m
[31m-             */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "sendfile() reported that \"%s\" was truncated at %O",[m
[31m-                          file->file->name.data, file->file_pos);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *sent = ctx->sent;[m
[31m-[m
[31m-        if (ctx->sent == ctx->size || wev->complete) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (task->event.active && ctx->file == file) {[m
[31m-        /*[m
[31m-         * tolerate duplicate calls; they can happen due to subrequests[m
[31m-         * or multiple calls of the next body filter from a filter[m
[31m-         */[m
[31m-[m
[31m-        *sent = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->file = file;[m
[31m-    ctx->socket = c->fd;[m
[31m-    ctx->size = size;[m
[31m-[m
[31m-    wev->complete = 0;[m
[31m-[m
[31m-    if (file->file->thread_handler(task, file->file) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *sent = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_linux_sendfile_thread_handler(void *data, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_linux_sendfile_ctx_t *ctx = data;[m
[31m-[m
[31m-    off_t       offset;[m
[31m-    ssize_t     n;[m
[31m-    ngx_buf_t  *file;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "linux sendfile thread handler");[m
[31m-[m
[31m-    file = ctx->file;[m
[31m-    offset = file->file_pos;[m
[31m-[m
[31m-again:[m
[31m-[m
[31m-    n = sendfile(ctx->socket, file->file->fd, &offset, ctx->size);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        ctx->err = ngx_errno;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->sent = n;[m
[31m-        ctx->err = 0;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,[m
[31m-                   "sendfile: %z (err: %d) of %uz @%O",[m
[31m-                   n, ctx->err, ctx->size, file->file_pos);[m
[31m-[m
[31m-    if (ctx->err == NGX_EINTR) {[m
[31m-        goto again;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_THREADS */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_os.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_os.h[m
[1mdeleted file mode 100644[m
[1mindex e22f07c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_os.h[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_OS_H_INCLUDED_[m
[31m-#define _NGX_OS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_IO_SENDFILE    1[m
[31m-[m
[31m-[m
[31m-typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_recv_pt        recv;[m
[31m-    ngx_recv_chain_pt  recv_chain;[m
[31m-    ngx_recv_pt        udp_recv;[m
[31m-    ngx_send_pt        send;[m
[31m-    ngx_send_pt        udp_send;[m
[31m-    ngx_send_chain_pt  send_chain;[m
[31m-    ngx_uint_t         flags;[m
[31m-} ngx_os_io_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_os_init(ngx_log_t *log);[m
[31m-void ngx_os_status(ngx_log_t *log);[m
[31m-ngx_int_t ngx_os_specific_init(ngx_log_t *log);[m
[31m-void ngx_os_specific_status(ngx_log_t *log);[m
[31m-ngx_int_t ngx_daemon(ngx_log_t *log);[m
[31m-ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid);[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *entry, off_t limit);[m
[31m-ssize_t ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-ssize_t ngx_udp_unix_send(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-[m
[31m-[m
[31m-#if (IOV_MAX > 64)[m
[31m-#define NGX_IOVS_PREALLOCATE  64[m
[31m-#else[m
[31m-#define NGX_IOVS_PREALLOCATE  IOV_MAX[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct iovec  *iovs;[m
[31m-    ngx_uint_t     count;[m
[31m-    size_t         size;[m
[31m-    ngx_uint_t     nalloc;[m
[31m-} ngx_iovec_t;[m
[31m-[m
[31m-ngx_chain_t *ngx_output_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *in,[m
[31m-    size_t limit, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_writev(ngx_connection_t *c, ngx_iovec_t *vec);[m
[31m-[m
[31m-[m
[31m-extern ngx_os_io_t  ngx_os_io;[m
[31m-extern ngx_int_t    ngx_ncpu;[m
[31m-extern ngx_int_t    ngx_max_sockets;[m
[31m-extern ngx_uint_t   ngx_inherited_nonblocking;[m
[31m-extern ngx_uint_t   ngx_tcp_nodelay_and_tcp_nopush;[m
[31m-[m
[31m-[m
[31m-#if (NGX_FREEBSD)[m
[31m-#include <ngx_freebsd.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_LINUX)[m
[31m-#include <ngx_linux.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_SOLARIS)[m
[31m-#include <ngx_solaris.h>[m
[31m-[m
[31m-[m
[31m-#elif (NGX_DARWIN)[m
[31m-#include <ngx_darwin.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_OS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_posix_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_posix_config.h[m
[1mdeleted file mode 100644[m
[1mindex 5d1358e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_posix_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,171 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_POSIX_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_POSIX_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#if (NGX_HPUX)[m
[31m-#define _XOPEN_SOURCE[m
[31m-#define _XOPEN_SOURCE_EXTENDED  1[m
[31m-#define _HPUX_ALT_XOPEN_SOCKET_API[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_TRU64)[m
[31m-#define _REENTRANT[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_GNU_HURD)[m
[31m-#ifndef _GNU_SOURCE[m
[31m-#define _GNU_SOURCE             /* accept4() */[m
[31m-#endif[m
[31m-#define _FILE_OFFSET_BITS       64[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef __CYGWIN__[m
[31m-#define timezonevar             /* timezone is variable */[m
[31m-#define NGX_BROKEN_SCM_RIGHTS   1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#if (NGX_HAVE_UNISTD_H)[m
[31m-#include <unistd.h>[m
[31m-#endif[m
[31m-#if (NGX_HAVE_INTTYPES_H)[m
[31m-#include <inttypes.h>[m
[31m-#endif[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <time.h>[m
[31m-#if (NGX_HAVE_SYS_PARAM_H)[m
[31m-#include <sys/param.h>          /* statfs() */[m
[31m-#endif[m
[31m-#if (NGX_HAVE_SYS_MOUNT_H)[m
[31m-#include <sys/mount.h>          /* statfs() */[m
[31m-#endif[m
[31m-#if (NGX_HAVE_SYS_STATVFS_H)[m
[31m-#include <sys/statvfs.h>        /* statvfs() */[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_SYS_FILIO_H)[m
[31m-#include <sys/filio.h>          /* FIONBIO */[m
[31m-#endif[m
[31m-#include <sys/ioctl.h>          /* FIONBIO */[m
[31m-[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#if (NGX_HAVE_LIMITS_H)[m
[31m-#include <limits.h>             /* IOV_MAX */[m
[31m-#endif[m
[31m-[m
[31m-#ifdef __CYGWIN__[m
[31m-#include <malloc.h>             /* memalign() */[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_CRYPT_H)[m
[31m-#include <crypt.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef IOV_MAX[m
[31m-#define IOV_MAX   16[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DLOPEN)[m
[31m-#include <dlfcn.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-#include <sys/event.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DEVPOLL) && !(NGX_TEST_BUILD_DEVPOLL)[m
[31m-#include <sys/ioctl.h>[m
[31m-#include <sys/devpoll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FILE_AIO)[m
[31m-#include <aio.h>[m
[31m-typedef struct aiocb  ngx_aiocb_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG  511[m
[31m-[m
[31m-#define ngx_debug_init()[m
[31m-[m
[31m-[m
[31m-#if (__FreeBSD__) && (__FreeBSD_version < 400017)[m
[31m-[m
[31m-#include <sys/param.h>          /* ALIGN() */[m
[31m-[m
[31m-/*[m
[31m- * FreeBSD 3.x has no CMSG_SPACE() and CMSG_LEN() and has the broken CMSG_DATA()[m
[31m- */[m
[31m-[m
[31m-#undef  CMSG_SPACE[m
[31m-#define CMSG_SPACE(l)       (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l))[m
[31m-[m
[31m-#undef  CMSG_LEN[m
[31m-#define CMSG_LEN(l)         (ALIGN(sizeof(struct cmsghdr)) + (l))[m
[31m-[m
[31m-#undef  CMSG_DATA[m
[31m-#define CMSG_DATA(cmsg)     ((u_char *)(cmsg) + ALIGN(sizeof(struct cmsghdr)))[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_posix_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_posix_init.c[m
[1mdeleted file mode 100644[m
[1mindex 76ed94e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_posix_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_ncpu;[m
[31m-ngx_int_t   ngx_max_sockets;[m
[31m-ngx_uint_t  ngx_inherited_nonblocking;[m
[31m-ngx_uint_t  ngx_tcp_nodelay_and_tcp_nopush;[m
[31m-[m
[31m-[m
[31m-struct rlimit  rlmt;[m
[31m-[m
[31m-[m
[31m-ngx_os_io_t ngx_os_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_init(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t  n;[m
[31m-[m
[31m-#if (NGX_HAVE_OS_SPECIFIC_INIT)[m
[31m-    if (ngx_os_specific_init(log) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_init_setproctitle(log) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_pagesize = getpagesize();[m
[31m-    ngx_cacheline_size = NGX_CPU_CACHE_LINE;[m
[31m-[m
[31m-    for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }[m
[31m-[m
[31m-#if (NGX_HAVE_SC_NPROCESSORS_ONLN)[m
[31m-    if (ngx_ncpu == 0) {[m
[31m-        ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_ncpu < 1) {[m
[31m-        ngx_ncpu = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cpuinfo();[m
[31m-[m
[31m-    if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, errno,[m
[31m-                      "getrlimit(RLIMIT_NOFILE) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur;[m
[31m-[m
[31m-#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4)[m
[31m-    ngx_inherited_nonblocking = 1;[m
[31m-#else[m
[31m-    ngx_inherited_nonblocking = 0;[m
[31m-#endif[m
[31m-[m
[31m-    srandom(ngx_time());[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_status(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER_BUILD);[m
[31m-[m
[31m-#ifdef NGX_COMPILER[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "built by " NGX_COMPILER);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_OS_SPECIFIC_INIT)[m
[31m-    ngx_os_specific_status(log);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                  "getrlimit(RLIMIT_NOFILE): %r:%r",[m
[31m-                  rlmt.rlim_cur, rlmt.rlim_max);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if 0[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_posix_post_conf_init(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t  pp[2];[m
[31m-[m
[31m-    if (pipe(pp) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "pipe() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (dup2(pp[1], STDERR_FILENO) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pp[1] > STDERR_FILENO) {[m
[31m-        if (close(pp[1]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process.c[m
[1mdeleted file mode 100644[m
[1mindex 24a63fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process.c[m
[1m+++ /dev/null[m
[36m@@ -1,630 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_channel.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int     signo;[m
[31m-    char   *signame;[m
[31m-    char   *name;[m
[31m-    void  (*handler)(int signo);[m
[31m-} ngx_signal_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void ngx_execute_proc(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_signal_handler(int signo);[m
[31m-static void ngx_process_get_status(void);[m
[31m-static void ngx_unlock_mutexes(ngx_pid_t pid);[m
[31m-[m
[31m-[m
[31m-int              ngx_argc;[m
[31m-char           **ngx_argv;[m
[31m-char           **ngx_os_argv;[m
[31m-[m
[31m-ngx_int_t        ngx_process_slot;[m
[31m-ngx_socket_t     ngx_channel;[m
[31m-ngx_int_t        ngx_last_process;[m
[31m-ngx_process_t    ngx_processes[NGX_MAX_PROCESSES];[m
[31m-[m
[31m-[m
[31m-ngx_signal_t  signals[] = {[m
[31m-    { ngx_signal_value(NGX_RECONFIGURE_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),[m
[31m-      "reload",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_REOPEN_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_REOPEN_SIGNAL),[m
[31m-      "reopen",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_NOACCEPT_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_NOACCEPT_SIGNAL),[m
[31m-      "",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_TERMINATE_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_TERMINATE_SIGNAL),[m
[31m-      "stop",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_SHUTDOWN_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_SHUTDOWN_SIGNAL),[m
[31m-      "quit",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { ngx_signal_value(NGX_CHANGEBIN_SIGNAL),[m
[31m-      "SIG" ngx_value(NGX_CHANGEBIN_SIGNAL),[m
[31m-      "",[m
[31m-      ngx_signal_handler },[m
[31m-[m
[31m-    { SIGALRM, "SIGALRM", "", ngx_signal_handler },[m
[31m-[m
[31m-    { SIGINT, "SIGINT", "", ngx_signal_handler },[m
[31m-[m
[31m-    { SIGIO, "SIGIO", "", ngx_signal_handler },[m
[31m-[m
[31m-    { SIGCHLD, "SIGCHLD", "", ngx_signal_handler },[m
[31m-[m
[31m-    { SIGSYS, "SIGSYS, SIG_IGN", "", SIG_IGN },[m
[31m-[m
[31m-    { SIGPIPE, "SIGPIPE, SIG_IGN", "", SIG_IGN },[m
[31m-[m
[31m-    { 0, NULL, "", NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,[m
[31m-    char *name, ngx_int_t respawn)[m
[31m-{[m
[31m-    u_long     on;[m
[31m-    ngx_pid_t  pid;[m
[31m-    ngx_int_t  s;[m
[31m-[m
[31m-    if (respawn >= 0) {[m
[31m-        s = respawn;[m
[31m-[m
[31m-    } else {[m
[31m-        for (s = 0; s < ngx_last_process; s++) {[m
[31m-            if (ngx_processes[s].pid == -1) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (s == NGX_MAX_PROCESSES) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "no more than %d processes can be spawned",[m
[31m-                          NGX_MAX_PROCESSES);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (respawn != NGX_PROCESS_DETACHED) {[m
[31m-[m
[31m-        /* Solaris 9 still has no AF_LOCAL */[m
[31m-[m
[31m-        if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1)[m
[31m-        {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "socketpair() failed while spawning \"%s\"", name);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "channel %d:%d",[m
[31m-                       ngx_processes[s].channel[0],[m
[31m-                       ngx_processes[s].channel[1]);[m
[31m-[m
[31m-        if (ngx_nonblocking(ngx_processes[s].channel[0]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_nonblocking_n " failed while spawning \"%s\"",[m
[31m-                          name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_nonblocking(ngx_processes[s].channel[1]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          ngx_nonblocking_n " failed while spawning \"%s\"",[m
[31m-                          name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        on = 1;[m
[31m-        if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "ioctl(FIOASYNC) failed while spawning \"%s\"", name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "fcntl(F_SETOWN) failed while spawning \"%s\"", name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        if (fcntl(ngx_processes[s].channel[0], F_SETFD, FD_CLOEXEC) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "fcntl(FD_CLOEXEC) failed while spawning \"%s\"",[m
[31m-                           name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        if (fcntl(ngx_processes[s].channel[1], F_SETFD, FD_CLOEXEC) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "fcntl(FD_CLOEXEC) failed while spawning \"%s\"",[m
[31m-                           name);[m
[31m-            ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-[m
[31m-        ngx_channel = ngx_processes[s].channel[1];[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_processes[s].channel[0] = -1;[m
[31m-        ngx_processes[s].channel[1] = -1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_process_slot = s;[m
[31m-[m
[31m-[m
[31m-    pid = fork();[m
[31m-[m
[31m-    switch (pid) {[m
[31m-[m
[31m-    case -1:[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "fork() failed while spawning \"%s\"", name);[m
[31m-        ngx_close_channel(ngx_processes[s].channel, cycle->log);[m
[31m-        return NGX_INVALID_PID;[m
[31m-[m
[31m-    case 0:[m
[31m-        ngx_pid = ngx_getpid();[m
[31m-        proc(cycle, data);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start %s %P", name, pid);[m
[31m-[m
[31m-    ngx_processes[s].pid = pid;[m
[31m-    ngx_processes[s].exited = 0;[m
[31m-[m
[31m-    if (respawn >= 0) {[m
[31m-        return pid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_processes[s].proc = proc;[m
[31m-    ngx_processes[s].data = data;[m
[31m-    ngx_processes[s].name = name;[m
[31m-    ngx_processes[s].exiting = 0;[m
[31m-[m
[31m-    switch (respawn) {[m
[31m-[m
[31m-    case NGX_PROCESS_NORESPAWN:[m
[31m-        ngx_processes[s].respawn = 0;[m
[31m-        ngx_processes[s].just_spawn = 0;[m
[31m-        ngx_processes[s].detached = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_JUST_SPAWN:[m
[31m-        ngx_processes[s].respawn = 0;[m
[31m-        ngx_processes[s].just_spawn = 1;[m
[31m-        ngx_processes[s].detached = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_RESPAWN:[m
[31m-        ngx_processes[s].respawn = 1;[m
[31m-        ngx_processes[s].just_spawn = 0;[m
[31m-        ngx_processes[s].detached = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_JUST_RESPAWN:[m
[31m-        ngx_processes[s].respawn = 1;[m
[31m-        ngx_processes[s].just_spawn = 1;[m
[31m-        ngx_processes[s].detached = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_DETACHED:[m
[31m-        ngx_processes[s].respawn = 0;[m
[31m-        ngx_processes[s].just_spawn = 0;[m
[31m-        ngx_processes[s].detached = 1;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (s == ngx_last_process) {[m
[31m-        ngx_last_process++;[m
[31m-    }[m
[31m-[m
[31m-    return pid;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)[m
[31m-{[m
[31m-    return ngx_spawn_process(cycle, ngx_execute_proc, ctx, ctx->name,[m
[31m-                             NGX_PROCESS_DETACHED);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_execute_proc(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_exec_ctx_t  *ctx = data;[m
[31m-[m
[31m-    if (execve(ctx->path, ctx->argv, ctx->envp) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "execve() failed while executing %s \"%s\"",[m
[31m-                      ctx->name, ctx->path);[m
[31m-    }[m
[31m-[m
[31m-    exit(1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_init_signals(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_signal_t      *sig;[m
[31m-    struct sigaction   sa;[m
[31m-[m
[31m-    for (sig = signals; sig->signo != 0; sig++) {[m
[31m-        ngx_memzero(&sa, sizeof(struct sigaction));[m
[31m-        sa.sa_handler = sig->handler;[m
[31m-        sigemptyset(&sa.sa_mask);[m
[31m-        if (sigaction(sig->signo, &sa, NULL) == -1) {[m
[31m-#if (NGX_VALGRIND)[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          "sigaction(%s) failed, ignored", sig->signame);[m
[31m-#else[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          "sigaction(%s) failed", sig->signame);[m
[31m-            return NGX_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_signal_handler(int signo)[m
[31m-{[m
[31m-    char            *action;[m
[31m-    ngx_int_t        ignore;[m
[31m-    ngx_err_t        err;[m
[31m-    ngx_signal_t    *sig;[m
[31m-[m
[31m-    ignore = 0;[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    for (sig = signals; sig->signo != 0; sig++) {[m
[31m-        if (sig->signo == signo) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_time_sigsafe_update();[m
[31m-[m
[31m-    action = "";[m
[31m-[m
[31m-    switch (ngx_process) {[m
[31m-[m
[31m-    case NGX_PROCESS_MASTER:[m
[31m-    case NGX_PROCESS_SINGLE:[m
[31m-        switch (signo) {[m
[31m-[m
[31m-        case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):[m
[31m-            ngx_quit = 1;[m
[31m-            action = ", shutting down";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_TERMINATE_SIGNAL):[m
[31m-        case SIGINT:[m
[31m-            ngx_terminate = 1;[m
[31m-            action = ", exiting";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_NOACCEPT_SIGNAL):[m
[31m-            if (ngx_daemonized) {[m
[31m-                ngx_noaccept = 1;[m
[31m-                action = ", stop accepting connections";[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_RECONFIGURE_SIGNAL):[m
[31m-            ngx_reconfigure = 1;[m
[31m-            action = ", reconfiguring";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_REOPEN_SIGNAL):[m
[31m-            ngx_reopen = 1;[m
[31m-            action = ", reopening logs";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):[m
[31m-            if (getppid() > 1 || ngx_new_binary > 0) {[m
[31m-[m
[31m-                /*[m
[31m-                 * Ignore the signal in the new binary if its parent is[m
[31m-                 * not the init process, i.e. the old binary's process[m
[31m-                 * is still running.  Or ignore the signal in the old binary's[m
[31m-                 * process if the new binary's process is already running.[m
[31m-                 */[m
[31m-[m
[31m-                action = ", ignoring";[m
[31m-                ignore = 1;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            ngx_change_binary = 1;[m
[31m-            action = ", changing binary";[m
[31m-            break;[m
[31m-[m
[31m-        case SIGALRM:[m
[31m-            ngx_sigalrm = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case SIGIO:[m
[31m-            ngx_sigio = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case SIGCHLD:[m
[31m-            ngx_reap = 1;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_WORKER:[m
[31m-    case NGX_PROCESS_HELPER:[m
[31m-        switch (signo) {[m
[31m-[m
[31m-        case ngx_signal_value(NGX_NOACCEPT_SIGNAL):[m
[31m-            if (!ngx_daemonized) {[m
[31m-                break;[m
[31m-            }[m
[31m-            ngx_debug_quit = 1;[m
[31m-        case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):[m
[31m-            ngx_quit = 1;[m
[31m-            action = ", shutting down";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_TERMINATE_SIGNAL):[m
[31m-        case SIGINT:[m
[31m-            ngx_terminate = 1;[m
[31m-            action = ", exiting";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_REOPEN_SIGNAL):[m
[31m-            ngx_reopen = 1;[m
[31m-            action = ", reopening logs";[m
[31m-            break;[m
[31m-[m
[31m-        case ngx_signal_value(NGX_RECONFIGURE_SIGNAL):[m
[31m-        case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):[m
[31m-        case SIGIO:[m
[31m-            action = ", ignoring";[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,[m
[31m-                  "signal %d (%s) received%s", signo, sig->signame, action);[m
[31m-[m
[31m-    if (ignore) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, 0,[m
[31m-                      "the changing binary signal is ignored: "[m
[31m-                      "you should shutdown or terminate "[m
[31m-                      "before either old or new binary's process");[m
[31m-    }[m
[31m-[m
[31m-    if (signo == SIGCHLD) {[m
[31m-        ngx_process_get_status();[m
[31m-    }[m
[31m-[m
[31m-    ngx_set_errno(err);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_process_get_status(void)[m
[31m-{[m
[31m-    int              status;[m
[31m-    char            *process;[m
[31m-    ngx_pid_t        pid;[m
[31m-    ngx_err_t        err;[m
[31m-    ngx_int_t        i;[m
[31m-    ngx_uint_t       one;[m
[31m-[m
[31m-    one = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        pid = waitpid(-1, &status, WNOHANG);[m
[31m-[m
[31m-        if (pid == 0) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (pid == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == NGX_EINTR) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (err == NGX_ECHILD && one) {[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            /*[m
[31m-             * Solaris always calls the signal handler for each exited process[m
[31m-             * despite waitpid() may be already called for this process.[m
[31m-             *[m
[31m-             * When several processes exit at the same time FreeBSD may[m
[31m-             * erroneously call the signal handler for exited process[m
[31m-             * despite waitpid() may be already called for this process.[m
[31m-             */[m
[31m-[m
[31m-            if (err == NGX_ECHILD) {[m
[31m-                ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, err,[m
[31m-                              "waitpid() failed");[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,[m
[31m-                          "waitpid() failed");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-        one = 1;[m
[31m-        process = "unknown process";[m
[31m-[m
[31m-        for (i = 0; i < ngx_last_process; i++) {[m
[31m-            if (ngx_processes[i].pid == pid) {[m
[31m-                ngx_processes[i].status = status;[m
[31m-                ngx_processes[i].exited = 1;[m
[31m-                process = ngx_processes[i].name;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (WTERMSIG(status)) {[m
[31m-#ifdef WCOREDUMP[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "%s %P exited on signal %d%s",[m
[31m-                          process, pid, WTERMSIG(status),[m
[31m-                          WCOREDUMP(status) ? " (core dumped)" : "");[m
[31m-#else[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "%s %P exited on signal %d",[m
[31m-                          process, pid, WTERMSIG(status));[m
[31m-#endif[m
[31m-[m
[31m-        } else {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,[m
[31m-                          "%s %P exited with code %d",[m
[31m-                          process, pid, WEXITSTATUS(status));[m
[31m-        }[m
[31m-[m
[31m-        if (WEXITSTATUS(status) == 2 && ngx_processes[i].respawn) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "%s %P exited with fatal code %d "[m
[31m-                          "and cannot be respawned",[m
[31m-                          process, pid, WEXITSTATUS(status));[m
[31m-            ngx_processes[i].respawn = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_unlock_mutexes(pid);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_unlock_mutexes(ngx_pid_t pid)[m
[31m-{[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_shm_zone_t   *shm_zone;[m
[31m-    ngx_list_part_t  *part;[m
[31m-    ngx_slab_pool_t  *sp;[m
[31m-[m
[31m-    /*[m
[31m-     * unlock the accept mutex if the abnormally exited process[m
[31m-     * held it[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_accept_mutex_ptr) {[m
[31m-        (void) ngx_shmtx_force_unlock(&ngx_accept_mutex, pid);[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * unlock shared memory mutexes if held by the abnormally exited[m
[31m-     * process[m
[31m-     */[m
[31m-[m
[31m-    part = (ngx_list_part_t *) &ngx_cycle->shared_memory.part;[m
[31m-    shm_zone = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            shm_zone = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        sp = (ngx_slab_pool_t *) shm_zone[i].shm.addr;[m
[31m-[m
[31m-        if (ngx_shmtx_force_unlock(&sp->mutex, pid)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "shared memory zone \"%V\" was locked by %P",[m
[31m-                          &shm_zone[i].shm.name, pid);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_debug_point(void)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    switch (ccf->debug_points) {[m
[31m-[m
[31m-    case NGX_DEBUG_POINTS_STOP:[m
[31m-        raise(SIGSTOP);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_DEBUG_POINTS_ABORT:[m
[31m-        ngx_abort();[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_signal_process(ngx_cycle_t *cycle, char *name, ngx_pid_t pid)[m
[31m-{[m
[31m-    ngx_signal_t  *sig;[m
[31m-[m
[31m-    for (sig = signals; sig->signo != 0; sig++) {[m
[31m-        if (ngx_strcmp(name, sig->name) == 0) {[m
[31m-            if (kill(pid, sig->signo) != -1) {[m
[31m-                return 0;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "kill(%P, %d) failed", pid, sig->signo);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process.h[m
[1mdeleted file mode 100644[m
[1mindex 7b5e8c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process.h[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROCESS_H_INCLUDED_[m
[31m-#define _NGX_PROCESS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_setaffinity.h>[m
[31m-#include <ngx_setproctitle.h>[m
[31m-[m
[31m-[m
[31m-typedef pid_t       ngx_pid_t;[m
[31m-[m
[31m-#define NGX_INVALID_PID  -1[m
[31m-[m
[31m-typedef void (*ngx_spawn_proc_pt) (ngx_cycle_t *cycle, void *data);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_pid_t           pid;[m
[31m-    int                 status;[m
[31m-    ngx_socket_t        channel[2];[m
[31m-[m
[31m-    ngx_spawn_proc_pt   proc;[m
[31m-    void               *data;[m
[31m-    char               *name;[m
[31m-[m
[31m-    unsigned            respawn:1;[m
[31m-    unsigned            just_spawn:1;[m
[31m-    unsigned            detached:1;[m
[31m-    unsigned            exiting:1;[m
[31m-    unsigned            exited:1;[m
[31m-} ngx_process_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char         *path;[m
[31m-    char         *name;[m
[31m-    char *const  *argv;[m
[31m-    char *const  *envp;[m
[31m-} ngx_exec_ctx_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_PROCESSES         1024[m
[31m-[m
[31m-#define NGX_PROCESS_NORESPAWN     -1[m
[31m-#define NGX_PROCESS_JUST_SPAWN    -2[m
[31m-#define NGX_PROCESS_RESPAWN       -3[m
[31m-#define NGX_PROCESS_JUST_RESPAWN  -4[m
[31m-#define NGX_PROCESS_DETACHED      -5[m
[31m-[m
[31m-[m
[31m-#define ngx_getpid   getpid[m
[31m-[m
[31m-#ifndef ngx_log_pid[m
[31m-#define ngx_log_pid  ngx_pid[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle,[m
[31m-    ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn);[m
[31m-ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx);[m
[31m-ngx_int_t ngx_init_signals(ngx_log_t *log);[m
[31m-void ngx_debug_point(void);[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SCHED_YIELD)[m
[31m-#define ngx_sched_yield()  sched_yield()[m
[31m-#else[m
[31m-#define ngx_sched_yield()  usleep(1)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern int            ngx_argc;[m
[31m-extern char         **ngx_argv;[m
[31m-extern char         **ngx_os_argv;[m
[31m-[m
[31m-extern ngx_pid_t      ngx_pid;[m
[31m-extern ngx_socket_t   ngx_channel;[m
[31m-extern ngx_int_t      ngx_process_slot;[m
[31m-extern ngx_int_t      ngx_last_process;[m
[31m-extern ngx_process_t  ngx_processes[NGX_MAX_PROCESSES];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROCESS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.c[m
[1mdeleted file mode 100644[m
[1mindex 3ead164..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.c[m
[1m+++ /dev/null[m
[36m@@ -1,1198 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_channel.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n,[m
[31m-    ngx_int_t type);[m
[31m-static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle,[m
[31m-    ngx_uint_t respawn);[m
[31m-static void ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch);[m
[31m-static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo);[m
[31m-static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle);[m
[31m-static void ngx_master_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker);[m
[31m-static void ngx_worker_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_channel_handler(ngx_event_t *ev);[m
[31m-static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_cache_manager_process_handler(ngx_event_t *ev);[m
[31m-static void ngx_cache_loader_process_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t    ngx_process;[m
[31m-ngx_uint_t    ngx_worker;[m
[31m-ngx_pid_t     ngx_pid;[m
[31m-[m
[31m-sig_atomic_t  ngx_reap;[m
[31m-sig_atomic_t  ngx_sigio;[m
[31m-sig_atomic_t  ngx_sigalrm;[m
[31m-sig_atomic_t  ngx_terminate;[m
[31m-sig_atomic_t  ngx_quit;[m
[31m-sig_atomic_t  ngx_debug_quit;[m
[31m-ngx_uint_t    ngx_exiting;[m
[31m-sig_atomic_t  ngx_reconfigure;[m
[31m-sig_atomic_t  ngx_reopen;[m
[31m-[m
[31m-sig_atomic_t  ngx_change_binary;[m
[31m-ngx_pid_t     ngx_new_binary;[m
[31m-ngx_uint_t    ngx_inherited;[m
[31m-ngx_uint_t    ngx_daemonized;[m
[31m-[m
[31m-sig_atomic_t  ngx_noaccept;[m
[31m-ngx_uint_t    ngx_noaccepting;[m
[31m-ngx_uint_t    ngx_restart;[m
[31m-[m
[31m-[m
[31m-static u_char  master_process[] = "master process";[m
[31m-[m
[31m-[m
[31m-static ngx_cache_manager_ctx_t  ngx_cache_manager_ctx = {[m
[31m-    ngx_cache_manager_process_handler, "cache manager process", 0[m
[31m-};[m
[31m-[m
[31m-static ngx_cache_manager_ctx_t  ngx_cache_loader_ctx = {[m
[31m-    ngx_cache_loader_process_handler, "cache loader process", 60000[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_cycle_t      ngx_exit_cycle;[m
[31m-static ngx_log_t        ngx_exit_log;[m
[31m-static ngx_open_file_t  ngx_exit_log_file;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_master_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    char              *title;[m
[31m-    u_char            *p;[m
[31m-    size_t             size;[m
[31m-    ngx_int_t          i;[m
[31m-    ngx_uint_t         n, sigio;[m
[31m-    sigset_t           set;[m
[31m-    struct itimerval   itv;[m
[31m-    ngx_uint_t         live;[m
[31m-    ngx_msec_t         delay;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-    sigaddset(&set, SIGCHLD);[m
[31m-    sigaddset(&set, SIGALRM);[m
[31m-    sigaddset(&set, SIGIO);[m
[31m-    sigaddset(&set, SIGINT);[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));[m
[31m-[m
[31m-    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "sigprocmask() failed");[m
[31m-    }[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-[m
[31m-[m
[31m-    size = sizeof(master_process);[m
[31m-[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        size += ngx_strlen(ngx_argv[i]) + 1;[m
[31m-    }[m
[31m-[m
[31m-    title = ngx_pnalloc(cycle->pool, size);[m
[31m-    if (title == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(title, master_process, sizeof(master_process) - 1);[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        *p++ = ' ';[m
[31m-        p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_setproctitle(title);[m
[31m-[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                               NGX_PROCESS_RESPAWN);[m
[31m-    ngx_start_cache_manager_processes(cycle, 0);[m
[31m-[m
[31m-    ngx_new_binary = 0;[m
[31m-    delay = 0;[m
[31m-    sigio = 0;[m
[31m-    live = 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (delay) {[m
[31m-            if (ngx_sigalrm) {[m
[31m-                sigio = 0;[m
[31m-                delay *= 2;[m
[31m-                ngx_sigalrm = 0;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "termination cycle: %M", delay);[m
[31m-[m
[31m-            itv.it_interval.tv_sec = 0;[m
[31m-            itv.it_interval.tv_usec = 0;[m
[31m-            itv.it_value.tv_sec = delay / 1000;[m
[31m-            itv.it_value.tv_usec = (delay % 1000 ) * 1000;[m
[31m-[m
[31m-            if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                              "setitimer() failed");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend");[m
[31m-[m
[31m-        sigsuspend(&set);[m
[31m-[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "wake up, sigio %i", sigio);[m
[31m-[m
[31m-        if (ngx_reap) {[m
[31m-            ngx_reap = 0;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");[m
[31m-[m
[31m-            live = ngx_reap_children(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (!live && (ngx_terminate || ngx_quit)) {[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            if (delay == 0) {[m
[31m-                delay = 50;[m
[31m-            }[m
[31m-[m
[31m-            if (sigio) {[m
[31m-                sigio--;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            sigio = ccf->worker_processes + 2 /* cache processes */;[m
[31m-[m
[31m-            if (delay > 1000) {[m
[31m-                ngx_signal_worker_processes(cycle, SIGKILL);[m
[31m-            } else {[m
[31m-                ngx_signal_worker_processes(cycle,[m
[31m-                                       ngx_signal_value(NGX_TERMINATE_SIGNAL));[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-[m
[31m-            ls = cycle->listening.elts;[m
[31m-            for (n = 0; n < cycle->listening.nelts; n++) {[m
[31m-                if (ngx_close_socket(ls[n].fd) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[n].addr_text);[m
[31m-                }[m
[31m-            }[m
[31m-            cycle->listening.nelts = 0;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reconfigure) {[m
[31m-            ngx_reconfigure = 0;[m
[31m-[m
[31m-            if (ngx_new_binary) {[m
[31m-                ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                           NGX_PROCESS_RESPAWN);[m
[31m-                ngx_start_cache_manager_processes(cycle, 0);[m
[31m-                ngx_noaccepting = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-            ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                   ngx_core_module);[m
[31m-            ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                       NGX_PROCESS_JUST_RESPAWN);[m
[31m-            ngx_start_cache_manager_processes(cycle, 1);[m
[31m-[m
[31m-            /* allow new processes to start */[m
[31m-            ngx_msleep(100);[m
[31m-[m
[31m-            live = 1;[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_restart) {[m
[31m-            ngx_restart = 0;[m
[31m-            ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                       NGX_PROCESS_RESPAWN);[m
[31m-            ngx_start_cache_manager_processes(cycle, 0);[m
[31m-            live = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, ccf->user);[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_REOPEN_SIGNAL));[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_change_binary) {[m
[31m-            ngx_change_binary = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "changing binary");[m
[31m-            ngx_new_binary = ngx_exec_new_binary(cycle, ngx_argv);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_noaccept) {[m
[31m-            ngx_noaccept = 0;[m
[31m-            ngx_noaccepting = 1;[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_single_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    if (ngx_set_environment(cycle, NULL) == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_process) {[m
[31m-            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-[m
[31m-            for (i = 0; cycle->modules[i]; i++) {[m
[31m-                if (cycle->modules[i]->exit_process) {[m
[31m-                    cycle->modules[i]->exit_process(cycle);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reconfigure) {[m
[31m-            ngx_reconfigure = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, (ngx_uid_t) -1);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)[m
[31m-{[m
[31m-    ngx_int_t      i;[m
[31m-    ngx_channel_t  ch;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        ngx_spawn_process(cycle, ngx_worker_process_cycle,[m
[31m-                          (void *) (intptr_t) i, "worker process", type);[m
[31m-[m
[31m-        ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-        ch.slot = ngx_process_slot;[m
[31m-        ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-        ngx_pass_open_channel(cycle, &ch);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn)[m
[31m-{[m
[31m-    ngx_uint_t       i, manager, loader;[m
[31m-    ngx_path_t     **path;[m
[31m-    ngx_channel_t    ch;[m
[31m-[m
[31m-    manager = 0;[m
[31m-    loader = 0;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            manager = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            loader = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (manager == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,[m
[31m-                      &ngx_cache_manager_ctx, "cache manager process",[m
[31m-                      respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN);[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-    ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-    ch.slot = ngx_process_slot;[m
[31m-    ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-    ngx_pass_open_channel(cycle, &ch);[m
[31m-[m
[31m-    if (loader == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,[m
[31m-                      &ngx_cache_loader_ctx, "cache loader process",[m
[31m-                      respawn ? NGX_PROCESS_JUST_SPAWN : NGX_PROCESS_NORESPAWN);[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-    ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-    ch.slot = ngx_process_slot;[m
[31m-    ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-    ngx_pass_open_channel(cycle, &ch);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch)[m
[31m-{[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        if (i == ngx_process_slot[m
[31m-            || ngx_processes[i].pid == -1[m
[31m-            || ngx_processes[i].channel[0] == -1)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                      "pass channel s:%i pid:%P fd:%d to s:%i pid:%P fd:%d",[m
[31m-                      ch->slot, ch->pid, ch->fd,[m
[31m-                      i, ngx_processes[i].pid,[m
[31m-                      ngx_processes[i].channel[0]);[m
[31m-[m
[31m-        /* TODO: NGX_AGAIN */[m
[31m-[m
[31m-        ngx_write_channel(ngx_processes[i].channel[0],[m
[31m-                          ch, sizeof(ngx_channel_t), cycle->log);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo)[m
[31m-{[m
[31m-    ngx_int_t      i;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_channel_t  ch;[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-#if (NGX_BROKEN_SCM_RIGHTS)[m
[31m-[m
[31m-    ch.command = 0;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    switch (signo) {[m
[31m-[m
[31m-    case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):[m
[31m-        ch.command = NGX_CMD_QUIT;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_signal_value(NGX_TERMINATE_SIGNAL):[m
[31m-        ch.command = NGX_CMD_TERMINATE;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_signal_value(NGX_REOPEN_SIGNAL):[m
[31m-        ch.command = NGX_CMD_REOPEN;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ch.command = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ch.fd = -1;[m
[31m-[m
[31m-[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "child: %i %P e:%d t:%d d:%d r:%d j:%d",[m
[31m-                       i,[m
[31m-                       ngx_processes[i].pid,[m
[31m-                       ngx_processes[i].exiting,[m
[31m-                       ngx_processes[i].exited,[m
[31m-                       ngx_processes[i].detached,[m
[31m-                       ngx_processes[i].respawn,[m
[31m-                       ngx_processes[i].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[i].detached || ngx_processes[i].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].just_spawn) {[m
[31m-            ngx_processes[i].just_spawn = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].exiting[m
[31m-            && signo == ngx_signal_value(NGX_SHUTDOWN_SIGNAL))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ch.command) {[m
[31m-            if (ngx_write_channel(ngx_processes[i].channel[0],[m
[31m-                                  &ch, sizeof(ngx_channel_t), cycle->log)[m
[31m-                == NGX_OK)[m
[31m-            {[m
[31m-                if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {[m
[31m-                    ngx_processes[i].exiting = 1;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "kill (%P, %d)", ngx_processes[i].pid, signo);[m
[31m-[m
[31m-        if (kill(ngx_processes[i].pid, signo) == -1) {[m
[31m-            err = ngx_errno;[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "kill(%P, %d) failed", ngx_processes[i].pid, signo);[m
[31m-[m
[31m-            if (err == NGX_ESRCH) {[m
[31m-                ngx_processes[i].exited = 1;[m
[31m-                ngx_processes[i].exiting = 0;[m
[31m-                ngx_reap = 1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {[m
[31m-            ngx_processes[i].exiting = 1;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_reap_children(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_int_t         i, n;[m
[31m-    ngx_uint_t        live;[m
[31m-    ngx_channel_t     ch;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_CLOSE_CHANNEL;[m
[31m-    ch.fd = -1;[m
[31m-[m
[31m-    live = 0;[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "child: %i %P e:%d t:%d d:%d r:%d j:%d",[m
[31m-                       i,[m
[31m-                       ngx_processes[i].pid,[m
[31m-                       ngx_processes[i].exiting,[m
[31m-                       ngx_processes[i].exited,[m
[31m-                       ngx_processes[i].detached,[m
[31m-                       ngx_processes[i].respawn,[m
[31m-                       ngx_processes[i].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[i].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].exited) {[m
[31m-[m
[31m-            if (!ngx_processes[i].detached) {[m
[31m-                ngx_close_channel(ngx_processes[i].channel, cycle->log);[m
[31m-[m
[31m-                ngx_processes[i].channel[0] = -1;[m
[31m-                ngx_processes[i].channel[1] = -1;[m
[31m-[m
[31m-                ch.pid = ngx_processes[i].pid;[m
[31m-                ch.slot = i;[m
[31m-[m
[31m-                for (n = 0; n < ngx_last_process; n++) {[m
[31m-                    if (ngx_processes[n].exited[m
[31m-                        || ngx_processes[n].pid == -1[m
[31m-                        || ngx_processes[n].channel[0] == -1)[m
[31m-                    {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                                   "pass close channel s:%i pid:%P to:%P",[m
[31m-                                   ch.slot, ch.pid, ngx_processes[n].pid);[m
[31m-[m
[31m-                    /* TODO: NGX_AGAIN */[m
[31m-[m
[31m-                    ngx_write_channel(ngx_processes[n].channel[0],[m
[31m-                                      &ch, sizeof(ngx_channel_t), cycle->log);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_processes[i].respawn[m
[31m-                && !ngx_processes[i].exiting[m
[31m-                && !ngx_terminate[m
[31m-                && !ngx_quit)[m
[31m-            {[m
[31m-                if (ngx_spawn_process(cycle, ngx_processes[i].proc,[m
[31m-                                      ngx_processes[i].data,[m
[31m-                                      ngx_processes[i].name, i)[m
[31m-                    == NGX_INVALID_PID)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                                  "could not respawn %s",[m
[31m-                                  ngx_processes[i].name);[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-[m
[31m-                ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-                ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-                ch.slot = ngx_process_slot;[m
[31m-                ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-                ngx_pass_open_channel(cycle, &ch);[m
[31m-[m
[31m-                live = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_processes[i].pid == ngx_new_binary) {[m
[31m-[m
[31m-                ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                       ngx_core_module);[m
[31m-[m
[31m-                if (ngx_rename_file((char *) ccf->oldpid.data,[m
[31m-                                    (char *) ccf->pid.data)[m
[31m-                    == NGX_FILE_ERROR)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                                  ngx_rename_file_n " %s back to %s failed "[m
[31m-                                  "after the new binary process \"%s\" exited",[m
[31m-                                  ccf->oldpid.data, ccf->pid.data, ngx_argv[0]);[m
[31m-                }[m
[31m-[m
[31m-                ngx_new_binary = 0;[m
[31m-                if (ngx_noaccepting) {[m
[31m-                    ngx_restart = 1;[m
[31m-                    ngx_noaccepting = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (i == ngx_last_process - 1) {[m
[31m-                ngx_last_process--;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_processes[i].pid = -1;[m
[31m-            }[m
[31m-[m
[31m-        } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) {[m
[31m-            live = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return live;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_master_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    ngx_delete_pidfile(cycle);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_master) {[m
[31m-            cycle->modules[i]->exit_master(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    /*[m
[31m-     * Copy ngx_cycle->log related data to the special static exit cycle,[m
[31m-     * log, and log file structures enough to allow a signal handler to log.[m
[31m-     * The handler may be called when standard ngx_cycle->log allocated from[m
[31m-     * ngx_cycle->pool is already destroyed.[m
[31m-     */[m
[31m-[m
[31m-[m
[31m-    ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log);[m
[31m-[m
[31m-    ngx_exit_log_file.fd = ngx_exit_log.file->fd;[m
[31m-    ngx_exit_log.file = &ngx_exit_log_file;[m
[31m-    ngx_exit_log.next = NULL;[m
[31m-    ngx_exit_log.writer = NULL;[m
[31m-[m
[31m-    ngx_exit_cycle.log = &ngx_exit_log;[m
[31m-    ngx_exit_cycle.files = ngx_cycle->files;[m
[31m-    ngx_exit_cycle.files_n = ngx_cycle->files_n;[m
[31m-    ngx_cycle = &ngx_exit_cycle;[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_int_t worker = (intptr_t) data;[m
[31m-[m
[31m-    ngx_process = NGX_PROCESS_WORKER;[m
[31m-    ngx_worker = worker;[m
[31m-[m
[31m-    ngx_worker_process_init(cycle, worker);[m
[31m-[m
[31m-    ngx_setproctitle("worker process");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_exiting) {[m
[31m-            ngx_event_cancel_timers();[m
[31m-[m
[31m-            if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-                ngx_worker_process_exit(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-            ngx_worker_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_quit = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                          "gracefully shutting down");[m
[31m-            ngx_setproctitle("worker process is shutting down");[m
[31m-[m
[31m-            if (!ngx_exiting) {[m
[31m-                ngx_exiting = 1;[m
[31m-                ngx_close_listening_sockets(cycle);[m
[31m-                ngx_close_idle_connections(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)[m
[31m-{[m
[31m-    sigset_t          set;[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_cpuset_t     *cpu_affinity;[m
[31m-    struct rlimit     rlmt;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-    ngx_listening_t  *ls;[m
[31m-[m
[31m-    if (ngx_set_environment(cycle, NULL) == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (worker >= 0 && ccf->priority != 0) {[m
[31m-        if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setpriority(%d) failed", ccf->priority);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->rlimit_nofile != NGX_CONF_UNSET) {[m
[31m-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;[m
[31m-        rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile;[m
[31m-[m
[31m-        if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setrlimit(RLIMIT_NOFILE, %i) failed",[m
[31m-                          ccf->rlimit_nofile);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->rlimit_core != NGX_CONF_UNSET) {[m
[31m-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;[m
[31m-        rlmt.rlim_max = (rlim_t) ccf->rlimit_core;[m
[31m-[m
[31m-        if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setrlimit(RLIMIT_CORE, %O) failed",[m
[31m-                          ccf->rlimit_core);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (geteuid() == 0) {[m
[31m-        if (setgid(ccf->group) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "setgid(%d) failed", ccf->group);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-[m
[31m-        if (initgroups(ccf->username, ccf->group) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "initgroups(%s, %d) failed",[m
[31m-                          ccf->username, ccf->group);[m
[31m-        }[m
[31m-[m
[31m-        if (setuid(ccf->user) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "setuid(%d) failed", ccf->user);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (worker >= 0) {[m
[31m-        cpu_affinity = ngx_get_cpu_affinity(worker);[m
[31m-[m
[31m-        if (cpu_affinity) {[m
[31m-            ngx_setaffinity(cpu_affinity, cycle->log);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_PR_SET_DUMPABLE)[m
[31m-[m
[31m-    /* allow coredump after setuid() in Linux 2.4.x */[m
[31m-[m
[31m-    if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "prctl(PR_SET_DUMPABLE) failed");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ccf->working_directory.len) {[m
[31m-        if (chdir((char *) ccf->working_directory.data) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "chdir(\"%s\") failed", ccf->working_directory.data);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-[m
[31m-    if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "sigprocmask() failed");[m
[31m-    }[m
[31m-[m
[31m-    srandom((ngx_pid << 16) ^ ngx_time());[m
[31m-[m
[31m-    /*[m
[31m-     * disable deleting previous events for the listening sockets because[m
[31m-     * in the worker processes there are no events at all at this point[m
[31m-     */[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-        ls[i].previous = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_process) {[m
[31m-            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == ngx_process_slot) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[n].channel[1] == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (close(ngx_processes[n].channel[1]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "close() channel failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "close() channel failed");[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_last_process = 0;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,[m
[31m-                              ngx_channel_handler)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_process) {[m
[31m-            cycle->modules[i]->exit_process(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_exiting) {[m
[31m-        c = cycle->connections;[m
[31m-        for (i = 0; i < cycle->connection_n; i++) {[m
[31m-            if (c[i].fd != -1[m
[31m-                && c[i].read[m
[31m-                && !c[i].read->accept[m
[31m-                && !c[i].read->channel[m
[31m-                && !c[i].read->resolver)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "*%uA open socket #%d left in connection %ui",[m
[31m-                              c[i].number, c[i].fd, i);[m
[31m-                ngx_debug_quit = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_debug_quit) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "aborting");[m
[31m-            ngx_debug_point();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Copy ngx_cycle->log related data to the special static exit cycle,[m
[31m-     * log, and log file structures enough to allow a signal handler to log.[m
[31m-     * The handler may be called when standard ngx_cycle->log allocated from[m
[31m-     * ngx_cycle->pool is already destroyed.[m
[31m-     */[m
[31m-[m
[31m-    ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log);[m
[31m-[m
[31m-    ngx_exit_log_file.fd = ngx_exit_log.file->fd;[m
[31m-    ngx_exit_log.file = &ngx_exit_log_file;[m
[31m-    ngx_exit_log.next = NULL;[m
[31m-    ngx_exit_log.writer = NULL;[m
[31m-[m
[31m-    ngx_exit_cycle.log = &ngx_exit_log;[m
[31m-    ngx_exit_cycle.files = ngx_cycle->files;[m
[31m-    ngx_exit_cycle.files_n = ngx_cycle->files_n;[m
[31m-    ngx_cycle = &ngx_exit_cycle;[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, "exit");[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_channel_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_int_t          n;[m
[31m-    ngx_channel_t      ch;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ev->timedout = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {[m
[31m-                ngx_del_conn(c, 0);[m
[31m-            }[m
[31m-[m
[31m-            ngx_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {[m
[31m-            if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                       "channel command: %ui", ch.command);[m
[31m-[m
[31m-        switch (ch.command) {[m
[31m-[m
[31m-        case NGX_CMD_QUIT:[m
[31m-            ngx_quit = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_TERMINATE:[m
[31m-            ngx_terminate = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_REOPEN:[m
[31m-            ngx_reopen = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_OPEN_CHANNEL:[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                           "get channel s:%i pid:%P fd:%d",[m
[31m-                           ch.slot, ch.pid, ch.fd);[m
[31m-[m
[31m-            ngx_processes[ch.slot].pid = ch.pid;[m
[31m-            ngx_processes[ch.slot].channel[0] = ch.fd;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_CLOSE_CHANNEL:[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                           "close channel s:%i pid:%P our:%P fd:%d",[m
[31m-                           ch.slot, ch.pid, ngx_processes[ch.slot].pid,[m
[31m-                           ngx_processes[ch.slot].channel[0]);[m
[31m-[m
[31m-            if (close(ngx_processes[ch.slot].channel[0]) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                              "close() channel failed");[m
[31m-            }[m
[31m-[m
[31m-            ngx_processes[ch.slot].channel[0] = -1;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_cache_manager_ctx_t *ctx = data;[m
[31m-[m
[31m-    void         *ident[4];[m
[31m-    ngx_event_t   ev;[m
[31m-[m
[31m-    /*[m
[31m-     * Set correct process type since closing listening Unix domain socket[m
[31m-     * in a master process also removes the Unix domain socket file.[m
[31m-     */[m
[31m-    ngx_process = NGX_PROCESS_HELPER;[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    /* Set a moderate number of connections for a helper process. */[m
[31m-    cycle->connection_n = 512;[m
[31m-[m
[31m-    ngx_worker_process_init(cycle, -1);[m
[31m-[m
[31m-    ngx_memzero(&ev, sizeof(ngx_event_t));[m
[31m-    ev.handler = ctx->handler;[m
[31m-    ev.data = ident;[m
[31m-    ev.log = cycle->log;[m
[31m-    ident[3] = (void *) -1;[m
[31m-[m
[31m-    ngx_use_accept_mutex = 0;[m
[31m-[m
[31m-    ngx_setproctitle(ctx->name);[m
[31m-[m
[31m-    ngx_add_timer(&ev, ctx->delay);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-            ngx_worker_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    time_t        next, n;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_path_t  **path;[m
[31m-[m
[31m-    next = 60 * 60;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            n = path[i]->manager(path[i]->data);[m
[31m-[m
[31m-            next = (n <= next) ? n : next;[m
[31m-[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (next == 0) {[m
[31m-        next = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(ev, next * 1000);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_loader_process_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_uint_t     i;[m
[31m-    ngx_path_t   **path;[m
[31m-    ngx_cycle_t   *cycle;[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    path = cycle->paths.elts;[m
[31m-    for (i = 0; i < cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            path[i]->loader(path[i]->data);[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.c.orig b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.c.orig[m
[1mdeleted file mode 100644[m
[1mindex 7cee1c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.c.orig[m
[1m+++ /dev/null[m
[36m@@ -1,1198 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_channel.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n,[m
[31m-    ngx_int_t type);[m
[31m-static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle,[m
[31m-    ngx_uint_t respawn);[m
[31m-static void ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch);[m
[31m-static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo);[m
[31m-static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle);[m
[31m-static void ngx_master_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker);[m
[31m-static void ngx_worker_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_channel_handler(ngx_event_t *ev);[m
[31m-static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data);[m
[31m-static void ngx_cache_manager_process_handler(ngx_event_t *ev);[m
[31m-static void ngx_cache_loader_process_handler(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t    ngx_process;[m
[31m-ngx_uint_t    ngx_worker;[m
[31m-ngx_pid_t     ngx_pid;[m
[31m-[m
[31m-sig_atomic_t  ngx_reap;[m
[31m-sig_atomic_t  ngx_sigio;[m
[31m-sig_atomic_t  ngx_sigalrm;[m
[31m-sig_atomic_t  ngx_terminate;[m
[31m-sig_atomic_t  ngx_quit;[m
[31m-sig_atomic_t  ngx_debug_quit;[m
[31m-ngx_uint_t    ngx_exiting;[m
[31m-sig_atomic_t  ngx_reconfigure;[m
[31m-sig_atomic_t  ngx_reopen;[m
[31m-[m
[31m-sig_atomic_t  ngx_change_binary;[m
[31m-ngx_pid_t     ngx_new_binary;[m
[31m-ngx_uint_t    ngx_inherited;[m
[31m-ngx_uint_t    ngx_daemonized;[m
[31m-[m
[31m-sig_atomic_t  ngx_noaccept;[m
[31m-ngx_uint_t    ngx_noaccepting;[m
[31m-ngx_uint_t    ngx_restart;[m
[31m-[m
[31m-[m
[31m-static u_char  master_process[] = "master process";[m
[31m-[m
[31m-[m
[31m-static ngx_cache_manager_ctx_t  ngx_cache_manager_ctx = {[m
[31m-    ngx_cache_manager_process_handler, "cache manager process", 0[m
[31m-};[m
[31m-[m
[31m-static ngx_cache_manager_ctx_t  ngx_cache_loader_ctx = {[m
[31m-    ngx_cache_loader_process_handler, "cache loader process", 60000[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_cycle_t      ngx_exit_cycle;[m
[31m-static ngx_log_t        ngx_exit_log;[m
[31m-static ngx_open_file_t  ngx_exit_log_file;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_master_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    char              *title;[m
[31m-    u_char            *p;[m
[31m-    size_t             size;[m
[31m-    ngx_int_t          i;[m
[31m-    ngx_uint_t         n, sigio;[m
[31m-    sigset_t           set;[m
[31m-    struct itimerval   itv;[m
[31m-    ngx_uint_t         live;[m
[31m-    ngx_msec_t         delay;[m
[31m-    ngx_listening_t   *ls;[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-    sigaddset(&set, SIGCHLD);[m
[31m-    sigaddset(&set, SIGALRM);[m
[31m-    sigaddset(&set, SIGIO);[m
[31m-    sigaddset(&set, SIGINT);[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-    sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));[m
[31m-[m
[31m-    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "sigprocmask() failed");[m
[31m-    }[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-[m
[31m-[m
[31m-    size = sizeof(master_process);[m
[31m-[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        size += ngx_strlen(ngx_argv[i]) + 1;[m
[31m-    }[m
[31m-[m
[31m-    title = ngx_pnalloc(cycle->pool, size);[m
[31m-    if (title == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_cpymem(title, master_process, sizeof(master_process) - 1);[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        *p++ = ' ';[m
[31m-        p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_setproctitle(title);[m
[31m-[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                               NGX_PROCESS_RESPAWN);[m
[31m-    ngx_start_cache_manager_processes(cycle, 0);[m
[31m-[m
[31m-    ngx_new_binary = 0;[m
[31m-    delay = 0;[m
[31m-    sigio = 0;[m
[31m-    live = 1;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (delay) {[m
[31m-            if (ngx_sigalrm) {[m
[31m-                sigio = 0;[m
[31m-                delay *= 2;[m
[31m-                ngx_sigalrm = 0;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                           "termination cycle: %M", delay);[m
[31m-[m
[31m-            itv.it_interval.tv_sec = 0;[m
[31m-            itv.it_interval.tv_usec = 0;[m
[31m-            itv.it_value.tv_sec = delay / 1000;[m
[31m-            itv.it_value.tv_usec = (delay % 1000 ) * 1000;[m
[31m-[m
[31m-            if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                              "setitimer() failed");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend");[m
[31m-[m
[31m-        sigsuspend(&set);[m
[31m-[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "wake up, sigio %i", sigio);[m
[31m-[m
[31m-        if (ngx_reap) {[m
[31m-            ngx_reap = 0;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");[m
[31m-[m
[31m-            live = ngx_reap_children(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (!live && (ngx_terminate || ngx_quit)) {[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            if (delay == 0) {[m
[31m-                delay = 50;[m
[31m-            }[m
[31m-[m
[31m-            if (sigio) {[m
[31m-                sigio--;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            sigio = ccf->worker_processes + 2 /* cache processes */;[m
[31m-[m
[31m-            if (delay > 1000) {[m
[31m-                ngx_signal_worker_processes(cycle, SIGKILL);[m
[31m-            } else {[m
[31m-                ngx_signal_worker_processes(cycle,[m
[31m-                                       ngx_signal_value(NGX_TERMINATE_SIGNAL));[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-[m
[31m-            ls = cycle->listening.elts;[m
[31m-            for (n = 0; n < cycle->listening.nelts; n++) {[m
[31m-                if (ngx_close_socket(ls[n].fd) == -1) {[m
[31m-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,[m
[31m-                                  ngx_close_socket_n " %V failed",[m
[31m-                                  &ls[n].addr_text);[m
[31m-                }[m
[31m-            }[m
[31m-            cycle->listening.nelts = 0;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reconfigure) {[m
[31m-            ngx_reconfigure = 0;[m
[31m-[m
[31m-            if (ngx_new_binary) {[m
[31m-                ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                           NGX_PROCESS_RESPAWN);[m
[31m-                ngx_start_cache_manager_processes(cycle, 0);[m
[31m-                ngx_noaccepting = 0;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-            ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                   ngx_core_module);[m
[31m-            ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                       NGX_PROCESS_JUST_RESPAWN);[m
[31m-            ngx_start_cache_manager_processes(cycle, 1);[m
[31m-[m
[31m-            /* allow new processes to start */[m
[31m-            ngx_msleep(100);[m
[31m-[m
[31m-            live = 1;[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_restart) {[m
[31m-            ngx_restart = 0;[m
[31m-            ngx_start_worker_processes(cycle, ccf->worker_processes,[m
[31m-                                       NGX_PROCESS_RESPAWN);[m
[31m-            ngx_start_cache_manager_processes(cycle, 0);[m
[31m-            live = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, ccf->user);[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_REOPEN_SIGNAL));[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_change_binary) {[m
[31m-            ngx_change_binary = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "changing binary");[m
[31m-            ngx_new_binary = ngx_exec_new_binary(cycle, ngx_argv);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_noaccept) {[m
[31m-            ngx_noaccept = 0;[m
[31m-            ngx_noaccepting = 1;[m
[31m-            ngx_signal_worker_processes(cycle,[m
[31m-                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_single_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    if (ngx_set_environment(cycle, NULL) == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_process) {[m
[31m-            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-[m
[31m-            for (i = 0; cycle->modules[i]; i++) {[m
[31m-                if (cycle->modules[i]->exit_process) {[m
[31m-                    cycle->modules[i]->exit_process(cycle);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reconfigure) {[m
[31m-            ngx_reconfigure = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, (ngx_uid_t) -1);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)[m
[31m-{[m
[31m-    ngx_int_t      i;[m
[31m-    ngx_channel_t  ch;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-[m
[31m-        ngx_spawn_process(cycle, ngx_worker_process_cycle,[m
[31m-                          (void *) (intptr_t) i, "worker process", type);[m
[31m-[m
[31m-        ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-        ch.slot = ngx_process_slot;[m
[31m-        ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-        ngx_pass_open_channel(cycle, &ch);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn)[m
[31m-{[m
[31m-    ngx_uint_t       i, manager, loader;[m
[31m-    ngx_path_t     **path;[m
[31m-    ngx_channel_t    ch;[m
[31m-[m
[31m-    manager = 0;[m
[31m-    loader = 0;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            manager = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            loader = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (manager == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,[m
[31m-                      &ngx_cache_manager_ctx, "cache manager process",[m
[31m-                      respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN);[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-    ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-    ch.slot = ngx_process_slot;[m
[31m-    ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-    ngx_pass_open_channel(cycle, &ch);[m
[31m-[m
[31m-    if (loader == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,[m
[31m-                      &ngx_cache_loader_ctx, "cache loader process",[m
[31m-                      respawn ? NGX_PROCESS_JUST_SPAWN : NGX_PROCESS_NORESPAWN);[m
[31m-[m
[31m-    ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-    ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-    ch.slot = ngx_process_slot;[m
[31m-    ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-    ngx_pass_open_channel(cycle, &ch);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch)[m
[31m-{[m
[31m-    ngx_int_t  i;[m
[31m-[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        if (i == ngx_process_slot[m
[31m-            || ngx_processes[i].pid == -1[m
[31m-            || ngx_processes[i].channel[0] == -1)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                      "pass channel s:%i pid:%P fd:%d to s:%i pid:%P fd:%d",[m
[31m-                      ch->slot, ch->pid, ch->fd,[m
[31m-                      i, ngx_processes[i].pid,[m
[31m-                      ngx_processes[i].channel[0]);[m
[31m-[m
[31m-        /* TODO: NGX_AGAIN */[m
[31m-[m
[31m-        ngx_write_channel(ngx_processes[i].channel[0],[m
[31m-                          ch, sizeof(ngx_channel_t), cycle->log);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo)[m
[31m-{[m
[31m-    ngx_int_t      i;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_channel_t  ch;[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-#if (NGX_BROKEN_SCM_RIGHTS)[m
[31m-[m
[31m-    ch.command = 0;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    switch (signo) {[m
[31m-[m
[31m-    case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):[m
[31m-        ch.command = NGX_CMD_QUIT;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_signal_value(NGX_TERMINATE_SIGNAL):[m
[31m-        ch.command = NGX_CMD_TERMINATE;[m
[31m-        break;[m
[31m-[m
[31m-    case ngx_signal_value(NGX_REOPEN_SIGNAL):[m
[31m-        ch.command = NGX_CMD_REOPEN;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ch.command = 0;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ch.fd = -1;[m
[31m-[m
[31m-[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "child: %i %P e:%d t:%d d:%d r:%d j:%d",[m
[31m-                       i,[m
[31m-                       ngx_processes[i].pid,[m
[31m-                       ngx_processes[i].exiting,[m
[31m-                       ngx_processes[i].exited,[m
[31m-                       ngx_processes[i].detached,[m
[31m-                       ngx_processes[i].respawn,[m
[31m-                       ngx_processes[i].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[i].detached || ngx_processes[i].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].just_spawn) {[m
[31m-            ngx_processes[i].just_spawn = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].exiting[m
[31m-            && signo == ngx_signal_value(NGX_SHUTDOWN_SIGNAL))[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ch.command) {[m
[31m-            if (ngx_write_channel(ngx_processes[i].channel[0],[m
[31m-                                  &ch, sizeof(ngx_channel_t), cycle->log)[m
[31m-                == NGX_OK)[m
[31m-            {[m
[31m-                if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {[m
[31m-                    ngx_processes[i].exiting = 1;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "kill (%P, %d)", ngx_processes[i].pid, signo);[m
[31m-[m
[31m-        if (kill(ngx_processes[i].pid, signo) == -1) {[m
[31m-            err = ngx_errno;[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "kill(%P, %d) failed", ngx_processes[i].pid, signo);[m
[31m-[m
[31m-            if (err == NGX_ESRCH) {[m
[31m-                ngx_processes[i].exited = 1;[m
[31m-                ngx_processes[i].exiting = 0;[m
[31m-                ngx_reap = 1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {[m
[31m-            ngx_processes[i].exiting = 1;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_reap_children(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_int_t         i, n;[m
[31m-    ngx_uint_t        live;[m
[31m-    ngx_channel_t     ch;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ngx_memzero(&ch, sizeof(ngx_channel_t));[m
[31m-[m
[31m-    ch.command = NGX_CMD_CLOSE_CHANNEL;[m
[31m-    ch.fd = -1;[m
[31m-[m
[31m-    live = 0;[m
[31m-    for (i = 0; i < ngx_last_process; i++) {[m
[31m-[m
[31m-        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,[m
[31m-                       "child: %i %P e:%d t:%d d:%d r:%d j:%d",[m
[31m-                       i,[m
[31m-                       ngx_processes[i].pid,[m
[31m-                       ngx_processes[i].exiting,[m
[31m-                       ngx_processes[i].exited,[m
[31m-                       ngx_processes[i].detached,[m
[31m-                       ngx_processes[i].respawn,[m
[31m-                       ngx_processes[i].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[i].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[i].exited) {[m
[31m-[m
[31m-            if (!ngx_processes[i].detached) {[m
[31m-                ngx_close_channel(ngx_processes[i].channel, cycle->log);[m
[31m-[m
[31m-                ngx_processes[i].channel[0] = -1;[m
[31m-                ngx_processes[i].channel[1] = -1;[m
[31m-[m
[31m-                ch.pid = ngx_processes[i].pid;[m
[31m-                ch.slot = i;[m
[31m-[m
[31m-                for (n = 0; n < ngx_last_process; n++) {[m
[31m-                    if (ngx_processes[n].exited[m
[31m-                        || ngx_processes[n].pid == -1[m
[31m-                        || ngx_processes[n].channel[0] == -1)[m
[31m-                    {[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                                   "pass close channel s:%i pid:%P to:%P",[m
[31m-                                   ch.slot, ch.pid, ngx_processes[n].pid);[m
[31m-[m
[31m-                    /* TODO: NGX_AGAIN */[m
[31m-[m
[31m-                    ngx_write_channel(ngx_processes[n].channel[0],[m
[31m-                                      &ch, sizeof(ngx_channel_t), cycle->log);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_processes[i].respawn[m
[31m-                && !ngx_processes[i].exiting[m
[31m-                && !ngx_terminate[m
[31m-                && !ngx_quit)[m
[31m-            {[m
[31m-                if (ngx_spawn_process(cycle, ngx_processes[i].proc,[m
[31m-                                      ngx_processes[i].data,[m
[31m-                                      ngx_processes[i].name, i)[m
[31m-                    == NGX_INVALID_PID)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                                  "could not respawn %s",[m
[31m-                                  ngx_processes[i].name);[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-[m
[31m-                ch.command = NGX_CMD_OPEN_CHANNEL;[m
[31m-                ch.pid = ngx_processes[ngx_process_slot].pid;[m
[31m-                ch.slot = ngx_process_slot;[m
[31m-                ch.fd = ngx_processes[ngx_process_slot].channel[0];[m
[31m-[m
[31m-                ngx_pass_open_channel(cycle, &ch);[m
[31m-[m
[31m-                live = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_processes[i].pid == ngx_new_binary) {[m
[31m-[m
[31m-                ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,[m
[31m-                                                       ngx_core_module);[m
[31m-[m
[31m-                if (ngx_rename_file((char *) ccf->oldpid.data,[m
[31m-                                    (char *) ccf->pid.data)[m
[31m-                    == NGX_FILE_ERROR)[m
[31m-                {[m
[31m-                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                                  ngx_rename_file_n " %s back to %s failed "[m
[31m-                                  "after the new binary process \"%s\" exited",[m
[31m-                                  ccf->oldpid.data, ccf->pid.data, ngx_argv[0]);[m
[31m-                }[m
[31m-[m
[31m-                ngx_new_binary = 0;[m
[31m-                if (ngx_noaccepting) {[m
[31m-                    ngx_restart = 1;[m
[31m-                    ngx_noaccepting = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (i == ngx_last_process - 1) {[m
[31m-                ngx_last_process--;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_processes[i].pid = -1;[m
[31m-            }[m
[31m-[m
[31m-        } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) {[m
[31m-            live = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return live;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_master_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    ngx_delete_pidfile(cycle);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_master) {[m
[31m-            cycle->modules[i]->exit_master(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    /*[m
[31m-     * Copy ngx_cycle->log related data to the special static exit cycle,[m
[31m-     * log, and log file structures enough to allow a signal handler to log.[m
[31m-     * The handler may be called when standard ngx_cycle->log allocated from[m
[31m-     * ngx_cycle->pool is already destroyed.[m
[31m-     */[m
[31m-[m
[31m-[m
[31m-    ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log);[m
[31m-[m
[31m-    ngx_exit_log_file.fd = ngx_exit_log.file->fd;[m
[31m-    ngx_exit_log.file = &ngx_exit_log_file;[m
[31m-    ngx_exit_log.next = NULL;[m
[31m-    ngx_exit_log.writer = NULL;[m
[31m-[m
[31m-    ngx_exit_cycle.log = &ngx_exit_log;[m
[31m-    ngx_exit_cycle.files = ngx_cycle->files;[m
[31m-    ngx_exit_cycle.files_n = ngx_cycle->files_n;[m
[31m-    ngx_cycle = &ngx_exit_cycle;[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_int_t worker = (intptr_t) data;[m
[31m-[m
[31m-    ngx_process = NGX_PROCESS_WORKER;[m
[31m-    ngx_worker = worker;[m
[31m-[m
[31m-    ngx_worker_process_init(cycle, worker);[m
[31m-[m
[31m-    ngx_setproctitle("worker process");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_exiting) {[m
[31m-            ngx_event_cancel_timers();[m
[31m-[m
[31m-            if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-                ngx_worker_process_exit(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-            ngx_worker_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_quit = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                          "gracefully shutting down");[m
[31m-            ngx_setproctitle("worker process is shutting down");[m
[31m-[m
[31m-            if (!ngx_exiting) {[m
[31m-                ngx_exiting = 1;[m
[31m-                ngx_close_listening_sockets(cycle);[m
[31m-                ngx_close_idle_connections(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)[m
[31m-{[m
[31m-    sigset_t          set;[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_uint_t        i;[m
[31m-    ngx_cpuset_t     *cpu_affinity;[m
[31m-    struct rlimit     rlmt;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-    ngx_listening_t  *ls;[m
[31m-[m
[31m-    if (ngx_set_environment(cycle, NULL) == NULL) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (worker >= 0 && ccf->priority != 0) {[m
[31m-        if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setpriority(%d) failed", ccf->priority);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->rlimit_nofile != NGX_CONF_UNSET) {[m
[31m-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;[m
[31m-        rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile;[m
[31m-[m
[31m-        if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setrlimit(RLIMIT_NOFILE, %i) failed",[m
[31m-                          ccf->rlimit_nofile);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ccf->rlimit_core != NGX_CONF_UNSET) {[m
[31m-        rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;[m
[31m-        rlmt.rlim_max = (rlim_t) ccf->rlimit_core;[m
[31m-[m
[31m-        if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "setrlimit(RLIMIT_CORE, %O) failed",[m
[31m-                          ccf->rlimit_core);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (geteuid() == 0) {[m
[31m-        if (setgid(ccf->group) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "setgid(%d) failed", ccf->group);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-[m
[31m-        if (initgroups(ccf->username, ccf->group) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "initgroups(%s, %d) failed",[m
[31m-                          ccf->username, ccf->group);[m
[31m-        }[m
[31m-[m
[31m-        if (setuid(ccf->user) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,[m
[31m-                          "setuid(%d) failed", ccf->user);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (worker >= 0) {[m
[31m-        cpu_affinity = ngx_get_cpu_affinity(worker);[m
[31m-[m
[31m-        if (cpu_affinity) {[m
[31m-            ngx_setaffinity(cpu_affinity, cycle->log);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_PR_SET_DUMPABLE)[m
[31m-[m
[31m-    /* allow coredump after setuid() in Linux 2.4.x */[m
[31m-[m
[31m-    if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "prctl(PR_SET_DUMPABLE) failed");[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ccf->working_directory.len) {[m
[31m-        if (chdir((char *) ccf->working_directory.data) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "chdir(\"%s\") failed", ccf->working_directory.data);[m
[31m-            /* fatal */[m
[31m-            exit(2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sigemptyset(&set);[m
[31m-[m
[31m-    if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "sigprocmask() failed");[m
[31m-    }[m
[31m-[m
[31m-    srandom((ngx_pid << 16) ^ ngx_time());[m
[31m-[m
[31m-    /*[m
[31m-     * disable deleting previous events for the listening sockets because[m
[31m-     * in the worker processes there are no events at all at this point[m
[31m-     */[m
[31m-    ls = cycle->listening.elts;[m
[31m-    for (i = 0; i < cycle->listening.nelts; i++) {[m
[31m-        ls[i].previous = NULL;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->init_process) {[m
[31m-            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].pid == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == ngx_process_slot) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[n].channel[1] == -1) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (close(ngx_processes[n].channel[1]) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "close() channel failed");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "close() channel failed");[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_last_process = 0;[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,[m
[31m-                              ngx_channel_handler)[m
[31m-        == NGX_ERROR)[m
[31m-    {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_process) {[m
[31m-            cycle->modules[i]->exit_process(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_exiting) {[m
[31m-        c = cycle->connections;[m
[31m-        for (i = 0; i < cycle->connection_n; i++) {[m
[31m-            if (c[i].fd != -1[m
[31m-                && c[i].read[m
[31m-                && !c[i].read->accept[m
[31m-                && !c[i].read->channel[m
[31m-                && !c[i].read->resolver)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "*%uA open socket #%d left in connection %ui",[m
[31m-                              c[i].number, c[i].fd, i);[m
[31m-                ngx_debug_quit = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_debug_quit) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "aborting");[m
[31m-            ngx_debug_point();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Copy ngx_cycle->log related data to the special static exit cycle,[m
[31m-     * log, and log file structures enough to allow a signal handler to log.[m
[31m-     * The handler may be called when standard ngx_cycle->log allocated from[m
[31m-     * ngx_cycle->pool is already destroyed.[m
[31m-     */[m
[31m-[m
[31m-    ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log);[m
[31m-[m
[31m-    ngx_exit_log_file.fd = ngx_exit_log.file->fd;[m
[31m-    ngx_exit_log.file = &ngx_exit_log_file;[m
[31m-    ngx_exit_log.next = NULL;[m
[31m-    ngx_exit_log.writer = NULL;[m
[31m-[m
[31m-    ngx_exit_cycle.log = &ngx_exit_log;[m
[31m-    ngx_exit_cycle.files = ngx_cycle->files;[m
[31m-    ngx_exit_cycle.files_n = ngx_cycle->files_n;[m
[31m-    ngx_cycle = &ngx_exit_cycle;[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, "exit");[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_channel_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_int_t          n;[m
[31m-    ngx_channel_t      ch;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ev->timedout = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler");[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {[m
[31m-                ngx_del_conn(c, 0);[m
[31m-            }[m
[31m-[m
[31m-            ngx_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {[m
[31m-            if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                       "channel command: %ui", ch.command);[m
[31m-[m
[31m-        switch (ch.command) {[m
[31m-[m
[31m-        case NGX_CMD_QUIT:[m
[31m-            ngx_quit = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_TERMINATE:[m
[31m-            ngx_terminate = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_REOPEN:[m
[31m-            ngx_reopen = 1;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_OPEN_CHANNEL:[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                           "get channel s:%i pid:%P fd:%d",[m
[31m-                           ch.slot, ch.pid, ch.fd);[m
[31m-[m
[31m-            ngx_processes[ch.slot].pid = ch.pid;[m
[31m-            ngx_processes[ch.slot].channel[0] = ch.fd;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_CMD_CLOSE_CHANNEL:[m
[31m-[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,[m
[31m-                           "close channel s:%i pid:%P our:%P fd:%d",[m
[31m-                           ch.slot, ch.pid, ngx_processes[ch.slot].pid,[m
[31m-                           ngx_processes[ch.slot].channel[0]);[m
[31m-[m
[31m-            if (close(ngx_processes[ch.slot].channel[0]) == -1) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,[m
[31m-                              "close() channel failed");[m
[31m-            }[m
[31m-[m
[31m-            ngx_processes[ch.slot].channel[0] = -1;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data)[m
[31m-{[m
[31m-    ngx_cache_manager_ctx_t *ctx = data;[m
[31m-[m
[31m-    void         *ident[4];[m
[31m-    ngx_event_t   ev;[m
[31m-[m
[31m-    /*[m
[31m-     * Set correct process type since closing listening Unix domain socket[m
[31m-     * in a master process also removes the Unix domain socket file.[m
[31m-     */[m
[31m-    ngx_process = NGX_PROCESS_HELPER;[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    /* Set a moderate number of connections for a helper process. */[m
[31m-    cycle->connection_n = 512;[m
[31m-[m
[31m-    ngx_worker_process_init(cycle, -1);[m
[31m-[m
[31m-    ngx_memzero(&ev, sizeof(ngx_event_t));[m
[31m-    ev.handler = ctx->handler;[m
[31m-    ev.data = ident;[m
[31m-    ev.log = cycle->log;[m
[31m-    ident[3] = (void *) -1;[m
[31m-[m
[31m-    ngx_use_accept_mutex = 0;[m
[31m-[m
[31m-    ngx_setproctitle(ctx->name);[m
[31m-[m
[31m-    ngx_add_timer(&ev, ctx->delay);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-            exit(0);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    time_t        next, n;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_path_t  **path;[m
[31m-[m
[31m-    next = 60 * 60;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            n = path[i]->manager(path[i]->data);[m
[31m-[m
[31m-            next = (n <= next) ? n : next;[m
[31m-[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (next == 0) {[m
[31m-        next = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_add_timer(ev, next * 1000);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_loader_process_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_uint_t     i;[m
[31m-    ngx_path_t   **path;[m
[31m-    ngx_cycle_t   *cycle;[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    path = cycle->paths.elts;[m
[31m-    for (i = 0; i < cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            path[i]->loader(path[i]->data);[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.h[m
[1mdeleted file mode 100644[m
[1mindex 69495d5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_process_cycle.h[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_[m
[31m-#define _NGX_PROCESS_CYCLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_CMD_OPEN_CHANNEL   1[m
[31m-#define NGX_CMD_CLOSE_CHANNEL  2[m
[31m-#define NGX_CMD_QUIT           3[m
[31m-#define NGX_CMD_TERMINATE      4[m
[31m-#define NGX_CMD_REOPEN         5[m
[31m-[m
[31m-[m
[31m-#define NGX_PROCESS_SINGLE     0[m
[31m-#define NGX_PROCESS_MASTER     1[m
[31m-#define NGX_PROCESS_SIGNALLER  2[m
[31m-#define NGX_PROCESS_WORKER     3[m
[31m-#define NGX_PROCESS_HELPER     4[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_event_handler_pt       handler;[m
[31m-    char                      *name;[m
[31m-    ngx_msec_t                 delay;[m
[31m-} ngx_cache_manager_ctx_t;[m
[31m-[m
[31m-[m
[31m-void ngx_master_process_cycle(ngx_cycle_t *cycle);[m
[31m-void ngx_single_process_cycle(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t      ngx_process;[m
[31m-extern ngx_uint_t      ngx_worker;[m
[31m-extern ngx_pid_t       ngx_pid;[m
[31m-extern ngx_pid_t       ngx_new_binary;[m
[31m-extern ngx_uint_t      ngx_inherited;[m
[31m-extern ngx_uint_t      ngx_daemonized;[m
[31m-extern ngx_uint_t      ngx_exiting;[m
[31m-[m
[31m-extern sig_atomic_t    ngx_reap;[m
[31m-extern sig_atomic_t    ngx_sigio;[m
[31m-extern sig_atomic_t    ngx_sigalrm;[m
[31m-extern sig_atomic_t    ngx_quit;[m
[31m-extern sig_atomic_t    ngx_debug_quit;[m
[31m-extern sig_atomic_t    ngx_terminate;[m
[31m-extern sig_atomic_t    ngx_noaccept;[m
[31m-extern sig_atomic_t    ngx_reconfigure;[m
[31m-extern sig_atomic_t    ngx_reopen;[m
[31m-extern sig_atomic_t    ngx_change_binary;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_readv_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_readv_chain.c[m
[1mdeleted file mode 100644[m
[1mindex d23508e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_readv_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,182 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)[m
[31m-{[m
[31m-    u_char        *prev;[m
[31m-    ssize_t        n, size;[m
[31m-    ngx_err_t      err;[m
[31m-    ngx_array_t    vec;[m
[31m-    ngx_event_t   *rev;[m
[31m-    struct iovec  *iov, iovs[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "readv: eof:%d, avail:%d, err:%d",[m
[31m-                       rev->pending_eof, rev->available, rev->kq_errno);[m
[31m-[m
[31m-        if (rev->available == 0) {[m
[31m-            if (rev->pending_eof) {[m
[31m-                rev->ready = 0;[m
[31m-                rev->eof = 1;[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,[m
[31m-                              "kevent() reported about an closed connection");[m
[31m-[m
[31m-                if (rev->kq_errno) {[m
[31m-                    rev->error = 1;[m
[31m-                    ngx_set_socket_errno(rev->kq_errno);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return 0;[m
[31m-[m
[31m-            } else {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    prev = NULL;[m
[31m-    iov = NULL;[m
[31m-    size = 0;[m
[31m-[m
[31m-    vec.elts = iovs;[m
[31m-    vec.nelts = 0;[m
[31m-    vec.size = sizeof(struct iovec);[m
[31m-    vec.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-    vec.pool = c->pool;[m
[31m-[m
[31m-    /* coalesce the neighbouring bufs */[m
[31m-[m
[31m-    while (chain) {[m
[31m-        n = chain->buf->end - chain->buf->last;[m
[31m-[m
[31m-        if (limit) {[m
[31m-            if (size >= limit) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (size + n > limit) {[m
[31m-                n = (ssize_t) (limit - size);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (prev == chain->buf->last) {[m
[31m-            iov->iov_len += n;[m
[31m-[m
[31m-        } else {[m
[31m-            if (vec.nelts >= IOV_MAX) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            iov = ngx_array_push(&vec);[m
[31m-            if (iov == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            iov->iov_base = (void *) chain->buf->last;[m
[31m-            iov->iov_len = n;[m
[31m-        }[m
[31m-[m
[31m-        size += n;[m
[31m-        prev = chain->buf->end;[m
[31m-        chain = chain->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "readv: %ui, last:%uz", vec.nelts, iov->iov_len);[m
[31m-[m
[31m-    do {[m
[31m-        n = readv(c->fd, (struct iovec *) vec.elts, vec.nelts);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            rev->ready = 0;[m
[31m-            rev->eof = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD readv() may return 0 on closed socket[m
[31m-             * even if kqueue reported about available data[m
[31m-             */[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available = 0;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available -= n;[m
[31m-[m
[31m-                /*[m
[31m-                 * rev->available may be negative here because some additional[m
[31m-                 * bytes may be received between kevent() and readv()[m
[31m-                 */[m
[31m-[m
[31m-                if (rev->available <= 0) {[m
[31m-                    if (!rev->pending_eof) {[m
[31m-                        rev->ready = 0;[m
[31m-                    }[m
[31m-[m
[31m-                    rev->available = 0;[m
[31m-                }[m
[31m-[m
[31m-                return n;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            if (n < size && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) {[m
[31m-                rev->ready = 0;[m
[31m-            }[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_EAGAIN || err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "readv() not ready");[m
[31m-            n = NGX_AGAIN;[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_connection_error(c, err, "readv() failed");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } while (err == NGX_EINTR);[m
[31m-[m
[31m-    rev->ready = 0;[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        c->read->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_recv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_recv.c[m
[1mdeleted file mode 100644[m
[1mindex 5013ae3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_recv.c[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    ssize_t       n;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "recv: eof:%d, avail:%d, err:%d",[m
[31m-                       rev->pending_eof, rev->available, rev->kq_errno);[m
[31m-[m
[31m-        if (rev->available == 0) {[m
[31m-            if (rev->pending_eof) {[m
[31m-                rev->ready = 0;[m
[31m-                rev->eof = 1;[m
[31m-[m
[31m-                if (rev->kq_errno) {[m
[31m-                    rev->error = 1;[m
[31m-                    ngx_set_socket_errno(rev->kq_errno);[m
[31m-[m
[31m-                    return ngx_connection_error(c, rev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-                }[m
[31m-[m
[31m-                return 0;[m
[31m-[m
[31m-            } else {[m
[31m-                rev->ready = 0;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    do {[m
[31m-        n = recv(c->fd, buf, size, 0);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "recv: fd:%d %z of %uz", c->fd, n, size);[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            rev->ready = 0;[m
[31m-            rev->eof = 1;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            /*[m
[31m-             * on FreeBSD recv() may return 0 on closed socket[m
[31m-             * even if kqueue reported about available data[m
[31m-             */[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available = 0;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available -= n;[m
[31m-[m
[31m-                /*[m
[31m-                 * rev->available may be negative here because some additional[m
[31m-                 * bytes may be received between kevent() and recv()[m
[31m-                 */[m
[31m-[m
[31m-                if (rev->available <= 0) {[m
[31m-                    if (!rev->pending_eof) {[m
[31m-                        rev->ready = 0;[m
[31m-                    }[m
[31m-[m
[31m-                    rev->available = 0;[m
[31m-                }[m
[31m-[m
[31m-                return n;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            if ((size_t) n < size[m
[31m-                && !(ngx_event_flags & NGX_USE_GREEDY_EVENT))[m
[31m-            {[m
[31m-                rev->ready = 0;[m
[31m-            }[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_EAGAIN || err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "recv() not ready");[m
[31m-            n = NGX_AGAIN;[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_connection_error(c, err, "recv() failed");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } while (err == NGX_EINTR);[m
[31m-[m
[31m-    rev->ready = 0;[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        rev->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_send.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_send.c[m
[1mdeleted file mode 100644[m
[1mindex 61ea202..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_send.c[m
[1m+++ /dev/null[m
[36m@@ -1,73 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    ssize_t       n;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {[m
[31m-        (void) ngx_connection_error(c, wev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-        wev->error = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = send(c->fd, buf, size, 0);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "send: fd:%d %z of %uz", c->fd, n, size);[m
[31m-[m
[31m-        if (n > 0) {[m
[31m-            if (n < (ssize_t) size) {[m
[31m-                wev->ready = 0;[m
[31m-            }[m
[31m-[m
[31m-            c->sent += n;[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, err, "send() returned zero");[m
[31m-            wev->ready = 0;[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        if (err == NGX_EAGAIN || err == NGX_EINTR) {[m
[31m-            wev->ready = 0;[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "send() not ready");[m
[31m-[m
[31m-            if (err == NGX_EAGAIN) {[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            wev->error = 1;[m
[31m-            (void) ngx_connection_error(c, err, "send() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setaffinity.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setaffinity.c[m
[1mdeleted file mode 100644[m
[1mindex 34ec390..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setaffinity.c[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_CPUSET_SETAFFINITY)[m
[31m-[m
[31m-void[m
[31m-ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    for (i = 0; i < CPU_SETSIZE; i++) {[m
[31m-        if (CPU_ISSET(i, cpu_affinity)) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                          "cpuset_setaffinity(): using cpu #%ui", i);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1,[m
[31m-                           sizeof(cpuset_t), cpu_affinity) == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "cpuset_setaffinity() failed");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_SCHED_SETAFFINITY)[m
[31m-[m
[31m-void[m
[31m-ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    for (i = 0; i < CPU_SETSIZE; i++) {[m
[31m-        if (CPU_ISSET(i, cpu_affinity)) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                          "sched_setaffinity(): using cpu #%ui", i);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (sched_setaffinity(0, sizeof(cpu_set_t), cpu_affinity) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sched_setaffinity() failed");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setaffinity.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setaffinity.h[m
[1mdeleted file mode 100644[m
[1mindex a4139ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setaffinity.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_SETAFFINITY_H_INCLUDED_[m
[31m-#define _NGX_SETAFFINITY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SCHED_SETAFFINITY || NGX_HAVE_CPUSET_SETAFFINITY)[m
[31m-[m
[31m-#define NGX_HAVE_CPU_AFFINITY 1[m
[31m-[m
[31m-#if (NGX_HAVE_SCHED_SETAFFINITY)[m
[31m-[m
[31m-typedef cpu_set_t  ngx_cpuset_t;[m
[31m-[m
[31m-#elif (NGX_HAVE_CPUSET_SETAFFINITY)[m
[31m-[m
[31m-#include <sys/cpuset.h>[m
[31m-[m
[31m-typedef cpuset_t  ngx_cpuset_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-void ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_setaffinity(cpu_affinity, log)[m
[31m-[m
[31m-typedef uint64_t  ngx_cpuset_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SETAFFINITY_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setproctitle.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setproctitle.c[m
[1mdeleted file mode 100644[m
[1mindex 91afa51..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setproctitle.c[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_SETPROCTITLE_USES_ENV)[m
[31m-[m
[31m-/*[m
[31m- * To change the process title in Linux and Solaris we have to set argv[1][m
[31m- * to NULL and to copy the title to the same place where the argv[0] points to.[m
[31m- * However, argv[0] may be too small to hold a new title.  Fortunately, Linux[m
[31m- * and Solaris store argv[] and environ[] one after another.  So we should[m
[31m- * ensure that is the continuous memory and then we allocate the new memory[m
[31m- * for environ[] and copy it.  After this we could use the memory starting[m
[31m- * from argv[0] for our process title.[m
[31m- *[m
[31m- * The Solaris's standard /bin/ps does not show the changed process title.[m
[31m- * You have to use "/usr/ucb/ps -w" instead.  Besides, the UCB ps does not[m
[31m- * show a new title if its length less than the origin command line length.[m
[31m- * To avoid it we append to a new title the origin command line in the[m
[31m- * parenthesis.[m
[31m- */[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-static char *ngx_os_argv_last;[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_init_setproctitle(ngx_log_t *log)[m
[31m-{[m
[31m-    u_char      *p;[m
[31m-    size_t       size;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 0; environ[i]; i++) {[m
[31m-        size += ngx_strlen(environ[i]) + 1;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_alloc(size, log);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_os_argv_last = ngx_os_argv[0];[m
[31m-[m
[31m-    for (i = 0; ngx_os_argv[i]; i++) {[m
[31m-        if (ngx_os_argv_last == ngx_os_argv[i]) {[m
[31m-            ngx_os_argv_last = ngx_os_argv[i] + ngx_strlen(ngx_os_argv[i]) + 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; environ[i]; i++) {[m
[31m-        if (ngx_os_argv_last == environ[i]) {[m
[31m-[m
[31m-            size = ngx_strlen(environ[i]) + 1;[m
[31m-            ngx_os_argv_last = environ[i] + size;[m
[31m-[m
[31m-            ngx_cpystrn(p, (u_char *) environ[i], size);[m
[31m-            environ[i] = (char *) p;[m
[31m-            p += size;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_os_argv_last--;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_setproctitle(char *title)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-[m
[31m-    ngx_int_t   i;[m
[31m-    size_t      size;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_os_argv[1] = NULL;[m
[31m-[m
[31m-    p = ngx_cpystrn((u_char *) ngx_os_argv[0], (u_char *) "nginx: ",[m
[31m-                    ngx_os_argv_last - ngx_os_argv[0]);[m
[31m-[m
[31m-    p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char *) p);[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 0; i < ngx_argc; i++) {[m
[31m-        size += ngx_strlen(ngx_argv[i]) + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (size > (size_t) ((char *) p - ngx_os_argv[0])) {[m
[31m-[m
[31m-        /*[m
[31m-         * ngx_setproctitle() is too rare operation so we use[m
[31m-         * the non-optimized copies[m
[31m-         */[m
[31m-[m
[31m-        p = ngx_cpystrn(p, (u_char *) " (", ngx_os_argv_last - (char *) p);[m
[31m-[m
[31m-        for (i = 0; i < ngx_argc; i++) {[m
[31m-            p = ngx_cpystrn(p, (u_char *) ngx_argv[i],[m
[31m-                            ngx_os_argv_last - (char *) p);[m
[31m-            p = ngx_cpystrn(p, (u_char *) " ", ngx_os_argv_last - (char *) p);[m
[31m-        }[m
[31m-[m
[31m-        if (*(p - 1) == ' ') {[m
[31m-            *(p - 1) = ')';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_os_argv_last - (char *) p) {[m
[31m-        ngx_memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                   "setproctitle: \"%s\"", ngx_os_argv[0]);[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_SETPROCTITLE_USES_ENV */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setproctitle.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setproctitle.h[m
[1mdeleted file mode 100644[m
[1mindex c363662..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_setproctitle.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SETPROCTITLE_H_INCLUDED_[m
[31m-#define _NGX_SETPROCTITLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SETPROCTITLE)[m
[31m-[m
[31m-/* FreeBSD, NetBSD, OpenBSD */[m
[31m-[m
[31m-#define ngx_init_setproctitle(log) NGX_OK[m
[31m-#define ngx_setproctitle(title)    setproctitle("%s", title)[m
[31m-[m
[31m-[m
[31m-#else /* !NGX_HAVE_SETPROCTITLE */[m
[31m-[m
[31m-#if !defined NGX_SETPROCTITLE_USES_ENV[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-[m
[31m-#define NGX_SETPROCTITLE_USES_ENV  1[m
[31m-#define NGX_SETPROCTITLE_PAD       ' '[m
[31m-[m
[31m-ngx_int_t ngx_init_setproctitle(ngx_log_t *log);[m
[31m-void ngx_setproctitle(char *title);[m
[31m-[m
[31m-#elif (NGX_LINUX) || (NGX_DARWIN)[m
[31m-[m
[31m-#define NGX_SETPROCTITLE_USES_ENV  1[m
[31m-#define NGX_SETPROCTITLE_PAD       '\0'[m
[31m-[m
[31m-ngx_int_t ngx_init_setproctitle(ngx_log_t *log);[m
[31m-void ngx_setproctitle(char *title);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_init_setproctitle(log) NGX_OK[m
[31m-#define ngx_setproctitle(title)[m
[31m-[m
[31m-#endif /* OSes */[m
[31m-[m
[31m-#endif /* NGX_SETPROCTITLE_USES_ENV */[m
[31m-[m
[31m-#endif /* NGX_HAVE_SETPROCTITLE */[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SETPROCTITLE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_shmem.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_shmem.c[m
[1mdeleted file mode 100644[m
[1mindex 3ec7cbf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_shmem.c[m
[1m+++ /dev/null[m
[36m@@ -1,126 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_MAP_ANON)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_alloc(ngx_shm_t *shm)[m
[31m-{[m
[31m-    shm->addr = (u_char *) mmap(NULL, shm->size,[m
[31m-                                PROT_READ|PROT_WRITE,[m
[31m-                                MAP_ANON|MAP_SHARED, -1, 0);[m
[31m-[m
[31m-    if (shm->addr == MAP_FAILED) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shm_free(ngx_shm_t *shm)[m
[31m-{[m
[31m-    if (munmap((void *) shm->addr, shm->size) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "munmap(%p, %uz) failed", shm->addr, shm->size);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_MAP_DEVZERO)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_alloc(ngx_shm_t *shm)[m
[31m-{[m
[31m-    ngx_fd_t  fd;[m
[31m-[m
[31m-    fd = open("/dev/zero", O_RDWR);[m
[31m-[m
[31m-    if (fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "open(\"/dev/zero\") failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm->addr = (u_char *) mmap(NULL, shm->size, PROT_READ|PROT_WRITE,[m
[31m-                                MAP_SHARED, fd, 0);[m
[31m-[m
[31m-    if (shm->addr == MAP_FAILED) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "mmap(/dev/zero, MAP_SHARED, %uz) failed", shm->size);[m
[31m-    }[m
[31m-[m
[31m-    if (close(fd) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "close(\"/dev/zero\") failed");[m
[31m-    }[m
[31m-[m
[31m-    return (shm->addr == MAP_FAILED) ? NGX_ERROR : NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shm_free(ngx_shm_t *shm)[m
[31m-{[m
[31m-    if (munmap((void *) shm->addr, shm->size) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "munmap(%p, %uz) failed", shm->addr, shm->size);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_HAVE_SYSVSHM)[m
[31m-[m
[31m-#include <sys/ipc.h>[m
[31m-#include <sys/shm.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_alloc(ngx_shm_t *shm)[m
[31m-{[m
[31m-    int  id;[m
[31m-[m
[31m-    id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT));[m
[31m-[m
[31m-    if (id == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "shmget(%uz) failed", shm->size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, shm->log, 0, "shmget id: %d", id);[m
[31m-[m
[31m-    shm->addr = shmat(id, NULL, 0);[m
[31m-[m
[31m-    if (shm->addr == (void *) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, "shmat() failed");[m
[31m-    }[m
[31m-[m
[31m-    if (shmctl(id, IPC_RMID, NULL) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "shmctl(IPC_RMID) failed");[m
[31m-    }[m
[31m-[m
[31m-    return (shm->addr == (void *) -1) ? NGX_ERROR : NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shm_free(ngx_shm_t *shm)[m
[31m-{[m
[31m-    if (shmdt(shm->addr) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "shmdt(%p) failed", shm->addr);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_shmem.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_shmem.h[m
[1mdeleted file mode 100644[m
[1mindex 566a7d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_shmem.h[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SHMEM_H_INCLUDED_[m
[31m-#define _NGX_SHMEM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char      *addr;[m
[31m-    size_t       size;[m
[31m-    ngx_str_t    name;[m
[31m-    ngx_log_t   *log;[m
[31m-    ngx_uint_t   exists;   /* unsigned  exists:1;  */[m
[31m-} ngx_shm_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);[m
[31m-void ngx_shm_free(ngx_shm_t *shm);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SHMEM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_socket.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_socket.c[m
[1mdeleted file mode 100644[m
[1mindex 3978f65..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_socket.c[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ioctl(FIONBIO) sets a non-blocking mode with the single syscall[m
[31m- * while fcntl(F_SETFL, O_NONBLOCK) needs to learn the current state[m
[31m- * using fcntl(F_GETFL).[m
[31m- *[m
[31m- * ioctl() and fcntl() are syscalls at least in FreeBSD 2.x, Linux 2.2[m
[31m- * and Solaris 7.[m
[31m- *[m
[31m- * ioctl() in Linux 2.4 and 2.6 uses BKL, however, fcntl(F_SETFL) uses it too.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FIONBIO)[m
[31m-[m
[31m-int[m
[31m-ngx_nonblocking(ngx_socket_t s)[m
[31m-{[m
[31m-    int  nb;[m
[31m-[m
[31m-    nb = 1;[m
[31m-[m
[31m-    return ioctl(s, FIONBIO, &nb);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_blocking(ngx_socket_t s)[m
[31m-{[m
[31m-    int  nb;[m
[31m-[m
[31m-    nb = 0;[m
[31m-[m
[31m-    return ioctl(s, FIONBIO, &nb);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_FREEBSD)[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_nopush(ngx_socket_t s)[m
[31m-{[m
[31m-    int  tcp_nopush;[m
[31m-[m
[31m-    tcp_nopush = 1;[m
[31m-[m
[31m-    return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,[m
[31m-                      (const void *) &tcp_nopush, sizeof(int));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_push(ngx_socket_t s)[m
[31m-{[m
[31m-    int  tcp_nopush;[m
[31m-[m
[31m-    tcp_nopush = 0;[m
[31m-[m
[31m-    return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,[m
[31m-                      (const void *) &tcp_nopush, sizeof(int));[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_LINUX)[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_nopush(ngx_socket_t s)[m
[31m-{[m
[31m-    int  cork;[m
[31m-[m
[31m-    cork = 1;[m
[31m-[m
[31m-    return setsockopt(s, IPPROTO_TCP, TCP_CORK,[m
[31m-                      (const void *) &cork, sizeof(int));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_push(ngx_socket_t s)[m
[31m-{[m
[31m-    int  cork;[m
[31m-[m
[31m-    cork = 0;[m
[31m-[m
[31m-    return setsockopt(s, IPPROTO_TCP, TCP_CORK,[m
[31m-                      (const void *) &cork, sizeof(int));[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_nopush(ngx_socket_t s)[m
[31m-{[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_push(ngx_socket_t s)[m
[31m-{[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_socket.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_socket.h[m
[1mdeleted file mode 100644[m
[1mindex fcc5153..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_socket.h[m
[1m+++ /dev/null[m
[36m@@ -1,64 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SOCKET_H_INCLUDED_[m
[31m-#define _NGX_SOCKET_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_WRITE_SHUTDOWN SHUT_WR[m
[31m-[m
[31m-typedef int  ngx_socket_t;[m
[31m-[m
[31m-#define ngx_socket          socket[m
[31m-#define ngx_socket_n        "socket()"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_FIONBIO)[m
[31m-[m
[31m-int ngx_nonblocking(ngx_socket_t s);[m
[31m-int ngx_blocking(ngx_socket_t s);[m
[31m-[m
[31m-#define ngx_nonblocking_n   "ioctl(FIONBIO)"[m
[31m-#define ngx_blocking_n      "ioctl(!FIONBIO)"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_nonblocking(s)  fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)[m
[31m-#define ngx_nonblocking_n   "fcntl(O_NONBLOCK)"[m
[31m-[m
[31m-#define ngx_blocking(s)     fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK)[m
[31m-#define ngx_blocking_n      "fcntl(!O_NONBLOCK)"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-int ngx_tcp_nopush(ngx_socket_t s);[m
[31m-int ngx_tcp_push(ngx_socket_t s);[m
[31m-[m
[31m-#if (NGX_LINUX)[m
[31m-[m
[31m-#define ngx_tcp_nopush_n   "setsockopt(TCP_CORK)"[m
[31m-#define ngx_tcp_push_n     "setsockopt(!TCP_CORK)"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_tcp_nopush_n   "setsockopt(TCP_NOPUSH)"[m
[31m-#define ngx_tcp_push_n     "setsockopt(!TCP_NOPUSH)"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_shutdown_socket    shutdown[m
[31m-#define ngx_shutdown_socket_n  "shutdown()"[m
[31m-[m
[31m-#define ngx_close_socket    close[m
[31m-#define ngx_close_socket_n  "close() socket"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SOCKET_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris.h[m
[1mdeleted file mode 100644[m
[1mindex 7b167d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris.h[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SOLARIS_H_INCLUDED_[m
[31m-#define _NGX_SOLARIS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SOLARIS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_config.h[m
[1mdeleted file mode 100644[m
[1mindex ffa01c8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SOLARIS_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_SOLARIS_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#ifndef _REENTRANT[m
[31m-#define _REENTRANT[m
[31m-#endif[m
[31m-[m
[31m-#define _FILE_OFFSET_BITS  64   /* must be before <sys/types.h> */[m
[31m-[m
[31m-#include <sys/types.h>[m
[31m-#include <sys/time.h>[m
[31m-#include <unistd.h>[m
[31m-#include <stdarg.h>[m
[31m-#include <stddef.h>             /* offsetof() */[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-#include <signal.h>[m
[31m-#include <pwd.h>[m
[31m-#include <grp.h>[m
[31m-#include <dirent.h>[m
[31m-#include <glob.h>[m
[31m-#include <time.h>[m
[31m-#include <sys/statvfs.h>        /* statvfs() */[m
[31m-[m
[31m-#include <sys/filio.h>          /* FIONBIO */[m
[31m-#include <sys/uio.h>[m
[31m-#include <sys/stat.h>[m
[31m-#include <fcntl.h>[m
[31m-[m
[31m-#include <sys/wait.h>[m
[31m-#include <sys/mman.h>[m
[31m-#include <sys/resource.h>[m
[31m-#include <sched.h>[m
[31m-[m
[31m-#include <sys/socket.h>[m
[31m-#include <netinet/in.h>[m
[31m-#include <netinet/tcp.h>        /* TCP_NODELAY */[m
[31m-#include <arpa/inet.h>[m
[31m-#include <netdb.h>[m
[31m-#include <sys/un.h>[m
[31m-[m
[31m-#include <sys/systeminfo.h>[m
[31m-#include <limits.h>             /* IOV_MAX */[m
[31m-#include <inttypes.h>[m
[31m-#include <crypt.h>[m
[31m-[m
[31m-#include <dlfcn.h>[m
[31m-[m
[31m-#define NGX_ALIGNMENT  _MAX_ALIGNMENT[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POSIX_SEM)[m
[31m-#include <semaphore.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_POLL)[m
[31m-#include <poll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_DEVPOLL)[m
[31m-#include <sys/ioctl.h>[m
[31m-#include <sys/devpoll.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_EVENTPORT)[m
[31m-#include <port.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-#include <sys/sendfile.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG           511[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_SO_SNDLOWAT[m
[31m-/* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */[m
[31m-#define NGX_HAVE_SO_SNDLOWAT         0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_OS_SPECIFIC_INIT    1[m
[31m-#define ngx_debug_init()[m
[31m-[m
[31m-[m
[31m-extern char **environ;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SOLARIS_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_init.c[m
[1mdeleted file mode 100644[m
[1mindex 83acae1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-char ngx_solaris_sysname[20];[m
[31m-char ngx_solaris_release[10];[m
[31m-char ngx_solaris_version[50];[m
[31m-[m
[31m-[m
[31m-static ngx_os_io_t ngx_solaris_io = {[m
[31m-    ngx_unix_recv,[m
[31m-    ngx_readv_chain,[m
[31m-    ngx_udp_unix_recv,[m
[31m-    ngx_unix_send,[m
[31m-    ngx_udp_unix_send,[m
[31m-#if (NGX_HAVE_SENDFILE)[m
[31m-    ngx_solaris_sendfilev_chain,[m
[31m-    NGX_IO_SENDFILE[m
[31m-#else[m
[31m-    ngx_writev_chain,[m
[31m-    0[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_specific_init(ngx_log_t *log)[m
[31m-{[m
[31m-    if (sysinfo(SI_SYSNAME, ngx_solaris_sysname, sizeof(ngx_solaris_sysname))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysinfo(SI_SYSNAME) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sysinfo(SI_RELEASE, ngx_solaris_release, sizeof(ngx_solaris_release))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysinfo(SI_RELEASE) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (sysinfo(SI_VERSION, ngx_solaris_version, sizeof(ngx_solaris_version))[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "sysinfo(SI_SYSNAME) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_os_io = ngx_solaris_io;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_specific_status(ngx_log_t *log)[m
[31m-{[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",[m
[31m-                  ngx_solaris_sysname, ngx_solaris_release);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, "version: %s",[m
[31m-                  ngx_solaris_version);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_sendfilev_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_sendfilev_chain.c[m
[1mdeleted file mode 100644[m
[1mindex 39bcafa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_solaris_sendfilev_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,228 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_TEST_BUILD_SOLARIS_SENDFILEV)[m
[31m-[m
[31m-/* Solaris declarations */[m
[31m-[m
[31m-typedef struct sendfilevec {[m
[31m-    int     sfv_fd;[m
[31m-    u_int   sfv_flag;[m
[31m-    off_t   sfv_off;[m
[31m-    size_t  sfv_len;[m
[31m-} sendfilevec_t;[m
[31m-[m
[31m-#define SFV_FD_SELF  -2[m
[31m-[m
[31m-static ssize_t sendfilev(int fd, const struct sendfilevec *vec,[m
[31m-    int sfvcnt, size_t *xferred)[m
[31m-{[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_SENDFILEVECS  NGX_IOVS_PREALLOCATE[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int             fd;[m
[31m-    u_char         *prev;[m
[31m-    off_t           size, send, prev_send, aligned, fprev;[m
[31m-    size_t          sent;[m
[31m-    ssize_t         n;[m
[31m-    ngx_int_t       eintr;[m
[31m-    ngx_err_t       err;[m
[31m-    ngx_buf_t      *file;[m
[31m-    ngx_uint_t      nsfv;[m
[31m-    sendfilevec_t  *sfv, sfvs[NGX_SENDFILEVECS];[m
[31m-    ngx_event_t    *wev;[m
[31m-    ngx_chain_t    *cl;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-    if (!c->sendfile) {[m
[31m-        return ngx_writev_chain(c, in, limit);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* the maximum limit size is the maximum size_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        fd = SFV_FD_SELF;[m
[31m-        prev = NULL;[m
[31m-        fprev = 0;[m
[31m-        file = NULL;[m
[31m-        sfv = NULL;[m
[31m-        eintr = 0;[m
[31m-        sent = 0;[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        nsfv = 0;[m
[31m-[m
[31m-        /* create the sendfilevec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        for (cl = in; cl && send < limit; cl = cl->next) {[m
[31m-[m
[31m-            if (ngx_buf_special(cl->buf)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_buf_in_memory_only(cl->buf)) {[m
[31m-                fd = SFV_FD_SELF;[m
[31m-[m
[31m-                size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-                if (send + size > limit) {[m
[31m-                    size = limit - send;[m
[31m-                }[m
[31m-[m
[31m-                if (prev == cl->buf->pos) {[m
[31m-                    sfv->sfv_len += (size_t) size;[m
[31m-[m
[31m-                } else {[m
[31m-                    if (nsfv == NGX_SENDFILEVECS) {[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    sfv = &sfvs[nsfv++];[m
[31m-[m
[31m-                    sfv->sfv_fd = SFV_FD_SELF;[m
[31m-                    sfv->sfv_flag = 0;[m
[31m-                    sfv->sfv_off = (off_t) (uintptr_t) cl->buf->pos;[m
[31m-                    sfv->sfv_len = (size_t) size;[m
[31m-                }[m
[31m-[m
[31m-                prev = cl->buf->pos + (size_t) size;[m
[31m-                send += size;[m
[31m-[m
[31m-            } else {[m
[31m-                prev = NULL;[m
[31m-[m
[31m-                size = cl->buf->file_last - cl->buf->file_pos;[m
[31m-[m
[31m-                if (send + size > limit) {[m
[31m-                    size = limit - send;[m
[31m-[m
[31m-                    aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)[m
[31m-                               & ~((off_t) ngx_pagesize - 1);[m
[31m-[m
[31m-                    if (aligned <= cl->buf->file_last) {[m
[31m-                        size = aligned - cl->buf->file_pos;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) {[m
[31m-                    sfv->sfv_len += (size_t) size;[m
[31m-[m
[31m-                } else {[m
[31m-                    if (nsfv == NGX_SENDFILEVECS) {[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    sfv = &sfvs[nsfv++];[m
[31m-[m
[31m-                    fd = cl->buf->file->fd;[m
[31m-                    sfv->sfv_fd = fd;[m
[31m-                    sfv->sfv_flag = 0;[m
[31m-                    sfv->sfv_off = cl->buf->file_pos;[m
[31m-                    sfv->sfv_len = (size_t) size;[m
[31m-                }[m
[31m-[m
[31m-                file = cl->buf;[m
[31m-                fprev = cl->buf->file_pos + size;[m
[31m-                send += size;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        n = sendfilev(c->fd, sfvs, nsfv, &sent);[m
[31m-[m
[31m-        if (n == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            switch (err) {[m
[31m-            case NGX_EAGAIN:[m
[31m-                break;[m
[31m-[m
[31m-            case NGX_EINTR:[m
[31m-                eintr = 1;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                wev->error = 1;[m
[31m-                ngx_connection_error(c, err, "sendfilev() failed");[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                          "sendfilev() sent only %uz bytes", sent);[m
[31m-[m
[31m-        } else if (n == 0 && sent == 0) {[m
[31m-[m
[31m-            /*[m
[31m-             * sendfilev() is documented to return -1 with errno[m
[31m-             * set to EINVAL if svf_len is greater than the file size,[m
[31m-             * but at least Solaris 11 returns 0 instead[m
[31m-             */[m
[31m-[m
[31m-            if (file) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                        "sendfilev() reported that \"%s\" was truncated at %O",[m
[31m-                        file->file->name.data, file->file_pos);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                              "sendfilev() returned 0 with memory buffers");[m
[31m-            }[m
[31m-[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "sendfilev: %z %z", n, sent);[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if (eintr) {[m
[31m-            send = prev_send + sent;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (send - prev_send != (off_t) sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_amd64.il b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_amd64.il[m
[1mdeleted file mode 100644[m
[1mindex 07f3210..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_amd64.il[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/[m
[31m-/ Copyright (C) Igor Sysoev[m
[31m-/ Copyright (C) Nginx, Inc.[m
[31m-/[m
[31m-[m
[31m-/ ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock,[m
[31m-/     ngx_atomic_uint_t old, ngx_atomic_uint_t set);[m
[31m-/[m
[31m-/ the arguments are passed in %rdi, %rsi, %rdx[m
[31m-/ the result is returned in the %rax[m
[31m-[m
[31m-        .inline ngx_atomic_cmp_set,0[m
[31m-        movq      %rsi, %rax[m
[31m-        lock[m
[31m-        cmpxchgq  %rdx, (%rdi)[m
[31m-        setz      %al[m
[31m-        movzbq    %al, %rax[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value,[m
[31m-/     ngx_atomic_int_t add);[m
[31m-/[m
[31m-/ the arguments are passed in %rdi, %rsi[m
[31m-/ the result is returned in the %rax[m
[31m-[m
[31m-        .inline ngx_atomic_fetch_add,0[m
[31m-        movq      %rsi, %rax[m
[31m-        lock[m
[31m-        xaddq     %rax, (%rdi)[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_cpu_pause()[m
[31m-/[m
[31m-/ the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware[m
[31m-/ capability added by linker because Solaris/amd64 does not know about it:[m
[31m-/[m
[31m-/ ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000 [ PAUSE ][m
[31m-[m
[31m-        .inline ngx_cpu_pause,0[m
[31m-        rep; nop[m
[31m-        .end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_atomic_sparc64.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_atomic_sparc64.h[m
[1mdeleted file mode 100644[m
[1mindex 5f28055..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_atomic_sparc64.h[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_PTR_SIZE == 4)[m
[31m-#define NGX_CASA  ngx_casa[m
[31m-#else[m
[31m-#define NGX_CASA  ngx_casxa[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock);[m
[31m-[m
[31m-ngx_atomic_uint_t[m
[31m-ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock);[m
[31m-[m
[31m-/* the code in src/os/unix/ngx_sunpro_sparc64.il */[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_uint_t[m
[31m-ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,[m
[31m-    ngx_atomic_uint_t set)[m
[31m-{[m
[31m-    set = NGX_CASA(set, old, lock);[m
[31m-[m
[31m-    return (set == old);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_atomic_int_t[m
[31m-ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)[m
[31m-{[m
[31m-    ngx_atomic_uint_t  old, res;[m
[31m-[m
[31m-    old = *value;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        res = old + add;[m
[31m-[m
[31m-        res = NGX_CASA(res, old, value);[m
[31m-[m
[31m-        if (res == old) {[m
[31m-            return res;[m
[31m-        }[m
[31m-[m
[31m-        old = res;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_memory_barrier()                                                  \[m
[31m-        __asm (".volatile");                                                  \[m
[31m-        __asm ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad");   \[m
[31m-        __asm (".nonvolatile")[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_sparc64.il b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_sparc64.il[m
[1mdeleted file mode 100644[m
[1mindex bdeef61..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_sparc64.il[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-/[m
[31m-/ Copyright (C) Igor Sysoev[m
[31m-/ Copyright (C) Nginx, Inc.[m
[31m-/[m
[31m-[m
[31m-[m
[31m-/  "casa   [%o2] 0x80, %o1, %o0"  and[m
[31m-/  "casxa  [%o2] 0x80, %o1, %o0"  do the following:[m
[31m-/[m
[31m-/       if ([%o2] == %o1) {[m
[31m-/           swap(%o0, [%o2]);[m
[31m-/       } else {[m
[31m-/           %o0 = [%o2];[m
[31m-/       }[m
[31m-[m
[31m-[m
[31m-/ ngx_atomic_uint_t ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old,[m
[31m-/      ngx_atomic_t *lock);[m
[31m-/[m
[31m-/ the arguments are passed in the %o0, %o1, %o2[m
[31m-/ the result is returned in the %o0[m
[31m-[m
[31m-        .inline ngx_casa,0[m
[31m-        casa    [%o2] 0x80, %o1, %o0[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_atomic_uint_t ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old,[m
[31m-/      ngx_atomic_t *lock);[m
[31m-/[m
[31m-/ the arguments are passed in the %o0, %o1, %o2[m
[31m-/ the result is returned in the %o0[m
[31m-[m
[31m-        .inline ngx_casxa,0[m
[31m-        casxa   [%o2] 0x80, %o1, %o0[m
[31m-        .end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_x86.il b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_x86.il[m
[1mdeleted file mode 100644[m
[1mindex d7e127c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_sunpro_x86.il[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-/[m
[31m-/ Copyright (C) Igor Sysoev[m
[31m-/ Copyright (C) Nginx, Inc.[m
[31m-/[m
[31m-[m
[31m-/ ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock,[m
[31m-/     ngx_atomic_uint_t old, ngx_atomic_uint_t set);[m
[31m-/[m
[31m-/ the arguments are passed on stack (%esp), 4(%esp), 8(%esp)[m
[31m-[m
[31m-        .inline ngx_atomic_cmp_set,0[m
[31m-        movl      (%esp), %ecx[m
[31m-        movl      4(%esp), %eax[m
[31m-        movl      8(%esp), %edx[m
[31m-        lock[m
[31m-        cmpxchgl  %edx, (%ecx)[m
[31m-        setz      %al[m
[31m-        movzbl    %al, %eax[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value,[m
[31m-/     ngx_atomic_int_t add);[m
[31m-/[m
[31m-/ the arguments are passed on stack (%esp), 4(%esp)[m
[31m-[m
[31m-        .inline ngx_atomic_fetch_add,0[m
[31m-        movl      (%esp), %ecx[m
[31m-        movl      4(%esp), %eax[m
[31m-        lock[m
[31m-        xaddl     %eax, (%ecx)[m
[31m-        .end[m
[31m-[m
[31m-[m
[31m-/ ngx_cpu_pause()[m
[31m-/[m
[31m-/ the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware[m
[31m-/ capability added by linker because Solaris/i386 does not know about it:[m
[31m-/[m
[31m-/ ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000  [ PAUSE ][m
[31m-[m
[31m-        .inline ngx_cpu_pause,0[m
[31m-        rep; nop[m
[31m-        .end[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread.h[m
[1mdeleted file mode 100644[m
[1mindex 1b52dd7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread.h[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_THREAD_H_INCLUDED_[m
[31m-#define _NGX_THREAD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if (NGX_THREADS)[m
[31m-[m
[31m-#include <pthread.h>[m
[31m-[m
[31m-[m
[31m-typedef pthread_mutex_t  ngx_thread_mutex_t;[m
[31m-[m
[31m-ngx_int_t ngx_thread_mutex_create(ngx_thread_mutex_t *mtx, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_mutex_destroy(ngx_thread_mutex_t *mtx, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_mutex_lock(ngx_thread_mutex_t *mtx, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_mutex_unlock(ngx_thread_mutex_t *mtx, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-typedef pthread_cond_t  ngx_thread_cond_t;[m
[31m-[m
[31m-ngx_int_t ngx_thread_cond_create(ngx_thread_cond_t *cond, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_cond_destroy(ngx_thread_cond_t *cond, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_cond_signal(ngx_thread_cond_t *cond, ngx_log_t *log);[m
[31m-ngx_int_t ngx_thread_cond_wait(ngx_thread_cond_t *cond, ngx_thread_mutex_t *mtx,[m
[31m-    ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-#if (NGX_LINUX)[m
[31m-[m
[31m-typedef pid_t      ngx_tid_t;[m
[31m-#define NGX_TID_T_FMT         "%P"[m
[31m-[m
[31m-#elif (NGX_FREEBSD)[m
[31m-[m
[31m-typedef uint32_t   ngx_tid_t;[m
[31m-#define NGX_TID_T_FMT         "%uD"[m
[31m-[m
[31m-#elif (NGX_DARWIN)[m
[31m-[m
[31m-typedef uint64_t   ngx_tid_t;[m
[31m-#define NGX_TID_T_FMT         "%uA"[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef uint64_t   ngx_tid_t;[m
[31m-#define NGX_TID_T_FMT         "%uA"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-ngx_tid_t ngx_thread_tid(void);[m
[31m-[m
[31m-#define ngx_log_tid           ngx_thread_tid()[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_log_tid           0[m
[31m-#define NGX_TID_T_FMT         "%d"[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_THREAD_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_cond.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_cond.c[m
[1mdeleted file mode 100644[m
[1mindex f524696..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_cond.c[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_cond_create(ngx_thread_cond_t *cond, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_cond_init(cond, NULL);[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_cond_init(%p)", cond);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_init() failed");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_cond_destroy(ngx_thread_cond_t *cond, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_cond_destroy(cond);[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_cond_destroy(%p)", cond);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_destroy() failed");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_cond_signal(ngx_thread_cond_t *cond, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_cond_signal(cond);[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_cond_signal(%p)", cond);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_signal() failed");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_cond_wait(ngx_thread_cond_t *cond, ngx_thread_mutex_t *mtx,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pthread_cond_wait(%p) enter", cond);[m
[31m-[m
[31m-    err = pthread_cond_wait(cond, mtx);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_cond_wait(%p) exit", cond);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_cond_wait() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_id.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_id.c[m
[1mdeleted file mode 100644[m
[1mindex 5174f1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_id.c[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_thread_pool.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_LINUX)[m
[31m-[m
[31m-/*[m
[31m- * Linux thread id is a pid of thread created by clone(2),[m
[31m- * glibc does not provide a wrapper for gettid().[m
[31m- */[m
[31m-[m
[31m-ngx_tid_t[m
[31m-ngx_thread_tid(void)[m
[31m-{[m
[31m-    return syscall(SYS_gettid);[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_FREEBSD) && (__FreeBSD_version >= 900031)[m
[31m-[m
[31m-#include <pthread_np.h>[m
[31m-[m
[31m-ngx_tid_t[m
[31m-ngx_thread_tid(void)[m
[31m-{[m
[31m-    return pthread_getthreadid_np();[m
[31m-}[m
[31m-[m
[31m-#elif (NGX_DARWIN)[m
[31m-[m
[31m-/*[m
[31m- * MacOSX thread has two thread ids:[m
[31m- *[m
[31m- * 1) MacOSX 10.6 (Snow Leoprad) has pthread_threadid_np() returning[m
[31m- *    an uint64_t value, which is obtained using the __thread_selfid()[m
[31m- *    syscall.  It is a number above 300,000.[m
[31m- */[m
[31m-[m
[31m-ngx_tid_t[m
[31m-ngx_thread_tid(void)[m
[31m-{[m
[31m-    uint64_t  tid;[m
[31m-[m
[31m-    (void) pthread_threadid_np(NULL, &tid);[m
[31m-    return tid;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m- * 2) Kernel thread mach_port_t returned by pthread_mach_thread_np().[m
[31m- *    It is a number in range 100-100,000.[m
[31m- *[m
[31m- * return pthread_mach_thread_np(pthread_self());[m
[31m- */[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-ngx_tid_t[m
[31m-ngx_thread_tid(void)[m
[31m-{[m
[31m-    return (uint64_t) (uintptr_t) pthread_self();[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_mutex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_mutex.c[m
[1mdeleted file mode 100644[m
[1mindex 6e8385e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_thread_mutex.c[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * All modern pthread mutex implementations try to acquire a lock[m
[31m- * atomically in userland before going to sleep in kernel.  Some[m
[31m- * spins before the sleeping.[m
[31m- *[m
[31m- * In Solaris since version 8 all mutex types spin before sleeping.[m
[31m- * The default spin count is 1000.  It can be overridden using[m
[31m- * _THREAD_ADAPTIVE_SPIN=100 environment variable.[m
[31m- *[m
[31m- * In MacOSX all mutex types spin to acquire a lock protecting a mutex's[m
[31m- * internals.  If the mutex is busy, thread calls Mach semaphore_wait().[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_NORMAL lacks deadlock detection and is the fastest[m
[31m- * mutex type.[m
[31m- *[m
[31m- *   Linux:    No spinning.  The internal name PTHREAD_MUTEX_TIMED_NP[m
[31m- *             remains from the times when pthread_mutex_timedlock() was[m
[31m- *             non-standard extension.  Alias name: PTHREAD_MUTEX_FAST_NP.[m
[31m- *   FreeBSD:  No spinning.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_ERRORCHECK is usually as fast as PTHREAD_MUTEX_NORMAL[m
[31m- * yet has lightweight deadlock detection.[m
[31m- *[m
[31m- *   Linux:    No spinning.  The internal name: PTHREAD_MUTEX_ERRORCHECK_NP.[m
[31m- *   FreeBSD:  No spinning.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_RECURSIVE allows recursive locking.[m
[31m- *[m
[31m- *   Linux:    No spinning.  The internal name: PTHREAD_MUTEX_RECURSIVE_NP.[m
[31m- *   FreeBSD:  No spinning.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_ADAPTIVE_NP spins on SMP systems before sleeping.[m
[31m- *[m
[31m- *   Linux:    No deadlock detection.  Dynamically changes a spin count[m
[31m- *             for each mutex from 10 to 100 based on spin count taken[m
[31m- *             previously.[m
[31m- *   FreeBSD:  Deadlock detection.  The default spin count is 2000.[m
[31m- *             It can be overriden using LIBPTHREAD_SPINLOOPS environment[m
[31m- *             variable or by pthread_mutex_setspinloops_np().  If a lock[m
[31m- *             is still busy, sched_yield() can be called on both UP and[m
[31m- *             SMP systems.  The default yield loop count is zero, but[m
[31m- *             it can be set by LIBPTHREAD_YIELDLOOPS environment[m
[31m- *             variable or by pthread_mutex_setyieldloops_np().[m
[31m- *   Solaris:  No PTHREAD_MUTEX_ADAPTIVE_NP.[m
[31m- *   MacOSX:   No PTHREAD_MUTEX_ADAPTIVE_NP.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_ELISION_NP is a Linux extension to elide locks using[m
[31m- * Intel Restricted Transactional Memory.  It is the most suitable for[m
[31m- * rwlock pattern access because it allows simultaneous reads without lock.[m
[31m- * Supported since glibc 2.18.[m
[31m- *[m
[31m- *[m
[31m- * PTHREAD_MUTEX_DEFAULT is default mutex type.[m
[31m- *[m
[31m- *   Linux:    PTHREAD_MUTEX_NORMAL.[m
[31m- *   FreeBSD:  PTHREAD_MUTEX_ERRORCHECK.[m
[31m- *   Solaris:  PTHREAD_MUTEX_NORMAL.[m
[31m- *   MacOSX:   PTHREAD_MUTEX_NORMAL.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_mutex_create(ngx_thread_mutex_t *mtx, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t            err;[m
[31m-    pthread_mutexattr_t  attr;[m
[31m-[m
[31m-    err = pthread_mutexattr_init(&attr);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                      "pthread_mutexattr_init() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    err = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                      "pthread_mutexattr_settype"[m
[31m-                      "(PTHREAD_MUTEX_ERRORCHECK) failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    err = pthread_mutex_init(mtx, &attr);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                      "pthread_mutex_init() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    err = pthread_mutexattr_destroy(&attr);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "pthread_mutexattr_destroy() failed");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pthread_mutex_init(%p)", mtx);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_mutex_destroy(ngx_thread_mutex_t *mtx, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_mutex_destroy(mtx);[m
[31m-    if (err != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                      "pthread_mutex_destroy() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pthread_mutex_destroy(%p)", mtx);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_mutex_lock(ngx_thread_mutex_t *mtx, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                   "pthread_mutex_lock(%p) enter", mtx);[m
[31m-[m
[31m-    err = pthread_mutex_lock(mtx);[m
[31m-    if (err == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_mutex_lock() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_thread_mutex_unlock(ngx_thread_mutex_t *mtx, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    err = pthread_mutex_unlock(mtx);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_time_update();[m
[31m-#endif[m
[31m-[m
[31m-    if (err == 0) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "pthread_mutex_unlock(%p) exit", mtx);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_mutex_unlock() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_time.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_time.c[m
[1mdeleted file mode 100644[m
[1mindex cc760b2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_time.c[m
[1m+++ /dev/null[m
[36m@@ -1,104 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * FreeBSD does not test /etc/localtime change, however, we can workaround it[m
[31m- * by calling tzset() with TZ and then without TZ to update timezone.[m
[31m- * The trick should work since FreeBSD 2.1.0.[m
[31m- *[m
[31m- * Linux does not test /etc/localtime change in localtime(),[m
[31m- * but may stat("/etc/localtime") several times in every strftime(),[m
[31m- * therefore we use it to update timezone.[m
[31m- *[m
[31m- * Solaris does not test /etc/TIMEZONE change too and no workaround available.[m
[31m- */[m
[31m-[m
[31m-void[m
[31m-ngx_timezone_update(void)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-[m
[31m-    if (getenv("TZ")) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    putenv("TZ=UTC");[m
[31m-[m
[31m-    tzset();[m
[31m-[m
[31m-    unsetenv("TZ");[m
[31m-[m
[31m-    tzset();[m
[31m-[m
[31m-#elif (NGX_LINUX)[m
[31m-    time_t      s;[m
[31m-    struct tm  *t;[m
[31m-    char        buf[4];[m
[31m-[m
[31m-    s = time(0);[m
[31m-[m
[31m-    t = localtime(&s);[m
[31m-[m
[31m-    strftime(buf, 4, "%H", t);[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_localtime(time_t s, ngx_tm_t *tm)[m
[31m-{[m
[31m-#if (NGX_HAVE_LOCALTIME_R)[m
[31m-    (void) localtime_r(&s, tm);[m
[31m-[m
[31m-#else[m
[31m-    ngx_tm_t  *t;[m
[31m-[m
[31m-    t = localtime(&s);[m
[31m-    *tm = *t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    tm->ngx_tm_mon++;[m
[31m-    tm->ngx_tm_year += 1900;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_libc_localtime(time_t s, struct tm *tm)[m
[31m-{[m
[31m-#if (NGX_HAVE_LOCALTIME_R)[m
[31m-    (void) localtime_r(&s, tm);[m
[31m-[m
[31m-#else[m
[31m-    struct tm  *t;[m
[31m-[m
[31m-    t = localtime(&s);[m
[31m-    *tm = *t;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_libc_gmtime(time_t s, struct tm *tm)[m
[31m-{[m
[31m-#if (NGX_HAVE_LOCALTIME_R)[m
[31m-    (void) gmtime_r(&s, tm);[m
[31m-[m
[31m-#else[m
[31m-    struct tm  *t;[m
[31m-[m
[31m-    t = gmtime(&s);[m
[31m-    *tm = *t;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_time.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_time.h[m
[1mdeleted file mode 100644[m
[1mindex c128c9a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_time.h[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_TIME_H_INCLUDED_[m
[31m-#define _NGX_TIME_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_rbtree_key_t      ngx_msec_t;[m
[31m-typedef ngx_rbtree_key_int_t  ngx_msec_int_t;[m
[31m-[m
[31m-typedef struct tm             ngx_tm_t;[m
[31m-[m
[31m-#define ngx_tm_sec            tm_sec[m
[31m-#define ngx_tm_min            tm_min[m
[31m-#define ngx_tm_hour           tm_hour[m
[31m-#define ngx_tm_mday           tm_mday[m
[31m-#define ngx_tm_mon            tm_mon[m
[31m-#define ngx_tm_year           tm_year[m
[31m-#define ngx_tm_wday           tm_wday[m
[31m-#define ngx_tm_isdst          tm_isdst[m
[31m-[m
[31m-#define ngx_tm_sec_t          int[m
[31m-#define ngx_tm_min_t          int[m
[31m-#define ngx_tm_hour_t         int[m
[31m-#define ngx_tm_mday_t         int[m
[31m-#define ngx_tm_mon_t          int[m
[31m-#define ngx_tm_year_t         int[m
[31m-#define ngx_tm_wday_t         int[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_GMTOFF)[m
[31m-#define ngx_tm_gmtoff         tm_gmtoff[m
[31m-#define ngx_tm_zone           tm_zone[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_SOLARIS)[m
[31m-[m
[31m-#define ngx_timezone(isdst) (- (isdst ? altzone : timezone) / 60)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_timezone(isdst) (- (isdst ? timezone + 3600 : timezone) / 60)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_timezone_update(void);[m
[31m-void ngx_localtime(time_t s, ngx_tm_t *tm);[m
[31m-void ngx_libc_localtime(time_t s, struct tm *tm);[m
[31m-void ngx_libc_gmtime(time_t s, struct tm *tm);[m
[31m-[m
[31m-#define ngx_gettimeofday(tp)  (void) gettimeofday(tp, NULL);[m
[31m-#define ngx_msleep(ms)        (void) usleep(ms * 1000)[m
[31m-#define ngx_sleep(s)          (void) sleep(s)[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_TIME_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_udp_recv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_udp_recv.c[m
[1mdeleted file mode 100644[m
[1mindex 6d544c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_udp_recv.c[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    ssize_t       n;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    do {[m
[31m-        n = recv(c->fd, buf, size, 0);[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "recv: fd:%d %z of %uz", c->fd, n, size);[m
[31m-[m
[31m-        if (n >= 0) {[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-            if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-                rev->available -= n;[m
[31m-[m
[31m-                /*[m
[31m-                 * rev->available may be negative here because some additional[m
[31m-                 * bytes may be received between kevent() and recv()[m
[31m-                 */[m
[31m-[m
[31m-                if (rev->available <= 0) {[m
[31m-                    rev->ready = 0;[m
[31m-                    rev->available = 0;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_EAGAIN || err == NGX_EINTR) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "recv() not ready");[m
[31m-            n = NGX_AGAIN;[m
[31m-[m
[31m-        } else {[m
[31m-            n = ngx_connection_error(c, err, "recv() failed");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } while (err == NGX_EINTR);[m
[31m-[m
[31m-    rev->ready = 0;[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        rev->error = 1;[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_udp_send.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_udp_send.c[m
[1mdeleted file mode 100644[m
[1mindex aabbc8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_udp_send.c[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_udp_unix_send(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    ssize_t       n;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *wev;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        n = sendto(c->fd, buf, size, 0, c->sockaddr, c->socklen);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "sendto: fd:%d %z of %uz to \"%V\"",[m
[31m-                       c->fd, n, size, &c->addr_text);[m
[31m-[m
[31m-        if (n >= 0) {[m
[31m-            if ((size_t) n != size) {[m
[31m-                wev->error = 1;[m
[31m-                (void) ngx_connection_error(c, 0, "sendto() incomplete");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            c->sent += n;[m
[31m-[m
[31m-            return n;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            wev->ready = 0;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, NGX_EAGAIN,[m
[31m-                           "sendto() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        if (err != NGX_EINTR) {[m
[31m-            wev->error = 1;[m
[31m-            (void) ngx_connection_error(c, err, "sendto() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_user.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_user.c[m
[1mdeleted file mode 100644[m
[1mindex 27c76ef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_user.c[m
[1m+++ /dev/null[m
[36m@@ -1,90 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Solaris has thread-safe crypt()[m
[31m- * Linux has crypt_r(); "struct crypt_data" is more than 128K[m
[31m- * FreeBSD needs the mutex to protect crypt()[m
[31m- *[m
[31m- * TODO:[m
[31m- *     ngx_crypt_init() to init mutex[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#if (NGX_CRYPT)[m
[31m-[m
[31m-#if (NGX_HAVE_GNU_CRYPT_R)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    char               *value;[m
[31m-    size_t              len;[m
[31m-    struct crypt_data   cd;[m
[31m-[m
[31m-    cd.initialized = 0;[m
[31m-#ifdef __GLIBC__[m
[31m-    /* work around the glibc bug */[m
[31m-    cd.current_salt[0] = ~salt[0];[m
[31m-#endif[m
[31m-[m
[31m-    value = crypt_r((char *) key, (char *) salt, &cd);[m
[31m-[m
[31m-    if (value) {[m
[31m-        len = ngx_strlen(value) + 1;[m
[31m-[m
[31m-        *encrypted = ngx_pnalloc(pool, len);[m
[31m-        if (*encrypted == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(*encrypted, value, len);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, pool->log, ngx_errno, "crypt_r() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    char       *value;[m
[31m-    size_t      len;[m
[31m-    ngx_err_t   err;[m
[31m-[m
[31m-    value = crypt((char *) key, (char *) salt);[m
[31m-[m
[31m-    if (value) {[m
[31m-        len = ngx_strlen(value) + 1;[m
[31m-[m
[31m-        *encrypted = ngx_pnalloc(pool, len);[m
[31m-        if (*encrypted == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(*encrypted, value, len);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NGX_CRYPT */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_user.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_user.h[m
[1mdeleted file mode 100644[m
[1mindex 6e82204..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_user.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_USER_H_INCLUDED_[m
[31m-#define _NGX_USER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef uid_t  ngx_uid_t;[m
[31m-typedef gid_t  ngx_gid_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_USER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_writev_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_writev_chain.c[m
[1mdeleted file mode 100644[m
[1mindex e38a3aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/unix/ngx_writev_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    ssize_t        n, sent;[m
[31m-    off_t          send, prev_send;[m
[31m-    ngx_chain_t   *cl;[m
[31m-    ngx_event_t   *wev;[m
[31m-    ngx_iovec_t    vec;[m
[31m-    struct iovec   iovs[NGX_IOVS_PREALLOCATE];[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) {[m
[31m-        (void) ngx_connection_error(c, wev->kq_errno,[m
[31m-                               "kevent() reported about an closed connection");[m
[31m-        wev->error = 1;[m
[31m-        return NGX_CHAIN_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    /* the maximum limit size is the maximum size_t value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    vec.iovs = iovs;[m
[31m-    vec.nalloc = NGX_IOVS_PREALLOCATE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        /* create the iovec and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        cl = ngx_output_chain_to_iovec(&vec, in, limit - send, c->log);[m
[31m-[m
[31m-        if (cl == NGX_CHAIN_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (cl && cl->buf->in_file) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, c->log, 0,[m
[31m-                          "file buf in writev "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          cl->buf->temporary,[m
[31m-                          cl->buf->recycled,[m
[31m-                          cl->buf->in_file,[m
[31m-                          cl->buf->start,[m
[31m-                          cl->buf->pos,[m
[31m-                          cl->buf->last,[m
[31m-                          cl->buf->file,[m
[31m-                          cl->buf->file_pos,[m
[31m-                          cl->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        send += vec.size;[m
[31m-[m
[31m-        n = ngx_writev(c, &vec);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sent = (n == NGX_AGAIN) ? 0 : n;[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if (send - prev_send != sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_output_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *in, size_t limit,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    size_t         total, size;[m
[31m-    u_char        *prev;[m
[31m-    ngx_uint_t     n;[m
[31m-    struct iovec  *iov;[m
[31m-[m
[31m-    iov = NULL;[m
[31m-    prev = NULL;[m
[31m-    total = 0;[m
[31m-    n = 0;[m
[31m-[m
[31m-    for ( /* void */ ; in && total < limit; in = in->next) {[m
[31m-[m
[31m-        if (ngx_buf_special(in->buf)) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (in->buf->in_file) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (!ngx_buf_in_memory(in->buf)) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                          "bad buf in output chain "[m
[31m-                          "t:%d r:%d f:%d %p %p-%p %p %O-%O",[m
[31m-                          in->buf->temporary,[m
[31m-                          in->buf->recycled,[m
[31m-                          in->buf->in_file,[m
[31m-                          in->buf->start,[m
[31m-                          in->buf->pos,[m
[31m-                          in->buf->last,[m
[31m-                          in->buf->file,[m
[31m-                          in->buf->file_pos,[m
[31m-                          in->buf->file_last);[m
[31m-[m
[31m-            ngx_debug_point();[m
[31m-[m
[31m-            return NGX_CHAIN_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        size = in->buf->last - in->buf->pos;[m
[31m-[m
[31m-        if (size > limit - total) {[m
[31m-            size = limit - total;[m
[31m-        }[m
[31m-[m
[31m-        if (prev == in->buf->pos) {[m
[31m-            iov->iov_len += size;[m
[31m-[m
[31m-        } else {[m
[31m-            if (n == vec->nalloc) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            iov = &vec->iovs[n++];[m
[31m-[m
[31m-            iov->iov_base = (void *) in->buf->pos;[m
[31m-            iov->iov_len = size;[m
[31m-        }[m
[31m-[m
[31m-        prev = in->buf->pos + size;[m
[31m-        total += size;[m
[31m-    }[m
[31m-[m
[31m-    vec->count = n;[m
[31m-    vec->size = total;[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_writev(ngx_connection_t *c, ngx_iovec_t *vec)[m
[31m-{[m
[31m-    ssize_t    n;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-eintr:[m
[31m-[m
[31m-    n = writev(c->fd, vec->iovs, vec->count);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "writev: %z of %uz", n, vec->size);[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        switch (err) {[m
[31m-        case NGX_EAGAIN:[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "writev() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-[m
[31m-        case NGX_EINTR:[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "writev() was interrupted");[m
[31m-            goto eintr;[m
[31m-[m
[31m-        default:[m
[31m-            c->write->error = 1;[m
[31m-            ngx_connection_error(c, err, "writev() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx.ico b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx.ico[m
[1mdeleted file mode 100644[m
[1mindex 70f79db..0000000[m
Binary files a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx.ico and /dev/null differ
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx.rc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx.rc[m
[1mdeleted file mode 100644[m
[1mindex dc8b7ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx.rc[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-[m
[31m-// Copyright (C) Igor Sysoev[m
[31m-// Copyright (C) Nginx, Inc.[m
[31m-[m
[31m-[m
[31m-nginx   icon  discardable  "src\\os\\win32\\nginx.ico"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon16.xpm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon16.xpm[m
[1mdeleted file mode 100644[m
[1mindex 45e4bad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon16.xpm[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-/* XPM */[m
[31m-static char * nginx_xpm[] = {[m
[31m-"16 16 2 2",[m
[31m-/* colors */[m
[31m-"   c none",[m
[31m-"GG c #009900",[m
[31m-/* pixels */[m
[31m-"                                ",[m
[31m-"        GGGGGGGGGGGGGGGG        ",[m
[31m-"        GGGGGGGGGGGGGGGG        ",[m
[31m-"      GGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"      GGGGGG        GGGGGG      ",[m
[31m-"    GGGGGG            GGGGGG    ",[m
[31m-"    GGGGGG                      ",[m
[31m-"  GGGGGG      GGGGGGGGGGGGGGGG  ",[m
[31m-"  GGGGGG    GGGGGGGGGGGGGGGGGG  ",[m
[31m-"    GGGGGG    GGGGGGGGGGGGGG    ",[m
[31m-"    GGGGGG            GGGGGG    ",[m
[31m-"      GGGGGG        GGGGGG      ",[m
[31m-"      GGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"        GGGGGGGGGGGGGGGG        ",[m
[31m-"        GGGGGGGGGGGGGGGG        ",[m
[31m-"                                "[m
[31m-};[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon32.xpm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon32.xpm[m
[1mdeleted file mode 100644[m
[1mindex eb26638..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon32.xpm[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-/* XPM */[m
[31m-static char * nginx_xpm[] = {[m
[31m-"32 32 2 2",[m
[31m-/* colors */[m
[31m-"   c none",[m
[31m-"GG c #009900",[m
[31m-/* pixels */[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                  GGGGGGGGGGGGGGGGGGGGGGGGGGGG                  ",[m
[31m-"                GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                ",[m
[31m-"                GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                ",[m
[31m-"              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG              ",[m
[31m-"              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG              ",[m
[31m-"            GGGGGGGGGG                    GGGGGGGGGG            ",[m
[31m-"            GGGGGGGGGG                    GGGGGGGGGG            ",[m
[31m-"          GGGGGGGGGG                        GGGGGGGGGG          ",[m
[31m-"          GGGGGGGGGG                        GGGGGGGGGG          ",[m
[31m-"        GGGGGGGGGG                                              ",[m
[31m-"        GGGGGGGGGG                                              ",[m
[31m-"      GGGGGGGGGG            GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"      GGGGGGGGGG          GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"        GGGGGGGGGG        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG        ",[m
[31m-"        GGGGGGGGGG        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG        ",[m
[31m-"          GGGGGGGGGG        GGGGGGGGGGGGGGGGGGGGGGGGGG          ",[m
[31m-"          GGGGGGGGGG                        GGGGGGGGGG          ",[m
[31m-"            GGGGGGGGGG                    GGGGGGGGGG            ",[m
[31m-"            GGGGGGGGGG                    GGGGGGGGGG            ",[m
[31m-"              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG              ",[m
[31m-"              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG              ",[m
[31m-"                GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                ",[m
[31m-"                GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                ",[m
[31m-"                  GGGGGGGGGGGGGGGGGGGGGGGGGGGG                  ",[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                                                                ",[m
[31m-"                                                                "[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon48.xpm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon48.xpm[m
[1mdeleted file mode 100644[m
[1mindex c25ba0f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/nginx_icon48.xpm[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-/* XPM */[m
[31m-static char * nginx_xpm[] = {[m
[31m-"48 48 2 2",[m
[31m-/* colors */[m
[31m-"   c none",[m
[31m-"GG c #009900",[m
[31m-/* pixels */[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                        ",[m
[31m-"                        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                        ",[m
[31m-"                      GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                      ",[m
[31m-"                      GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                      ",[m
[31m-"                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                    ",[m
[31m-"                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                    ",[m
[31m-"                  GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                  ",[m
[31m-"                  GGGGGGGGGGGGGGGG                            GGGGGGGGGGGGGGGG                  ",[m
[31m-"                GGGGGGGGGGGGGGGG                                GGGGGGGGGGGGGGGG                ",[m
[31m-"                GGGGGGGGGGGGGGGG                                GGGGGGGGGGGGGGGG                ",[m
[31m-"              GGGGGGGGGGGGGGGG                                    GGGGGGGGGGGGGGGG              ",[m
[31m-"              GGGGGGGGGGGGGGGG                                    GGGGGGGGGGGGGGGG              ",[m
[31m-"            GGGGGGGGGGGGGGGG                                        GGGGGGGGGGGGGGGG            ",[m
[31m-"            GGGGGGGGGGGGGGGG                                        GGGGGGGGGGGGGGGG            ",[m
[31m-"          GGGGGGGGGGGGGGGG                                            GGGGGGGGGGGGGGGG          ",[m
[31m-"          GGGGGGGGGGGGGGGG                                                                      ",[m
[31m-"        GGGGGGGGGGGGGGGG                                                                        ",[m
[31m-"        GGGGGGGGGGGGGGGG                                                                        ",[m
[31m-"      GGGGGGGGGGGGGGGG                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"      GGGGGGGGGGGGGGGG                  GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG      ",[m
[31m-"        GGGGGGGGGGGGGGGG              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG        ",[m
[31m-"        GGGGGGGGGGGGGGGG              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG        ",[m
[31m-"          GGGGGGGGGGGGGGGG            GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG          ",[m
[31m-"          GGGGGGGGGGGGGGGG              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG          ",[m
[31m-"            GGGGGGGGGGGGGGGG              GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG            ",[m
[31m-"            GGGGGGGGGGGGGGGG                                        GGGGGGGGGGGGGGGG            ",[m
[31m-"              GGGGGGGGGGGGGGGG                                    GGGGGGGGGGGGGGGG              ",[m
[31m-"              GGGGGGGGGGGGGGGG                                    GGGGGGGGGGGGGGGG              ",[m
[31m-"                GGGGGGGGGGGGGGGG                                GGGGGGGGGGGGGGGG                ",[m
[31m-"                GGGGGGGGGGGGGGGG                                GGGGGGGGGGGGGGGG                ",[m
[31m-"                  GGGGGGGGGGGGGGGG                            GGGGGGGGGGGGGGGG                  ",[m
[31m-"                  GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                  ",[m
[31m-"                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                    ",[m
[31m-"                    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                    ",[m
[31m-"                      GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                      ",[m
[31m-"                      GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                      ",[m
[31m-"                        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                        ",[m
[31m-"                        GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG                        ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[31m-"                                                                                                ",[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_alloc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_alloc.c[m
[1mdeleted file mode 100644[m
[1mindex 0c0ef30..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_alloc.c[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_pagesize;[m
[31m-ngx_uint_t  ngx_pagesize_shift;[m
[31m-ngx_uint_t  ngx_cacheline_size;[m
[31m-[m
[31m-[m
[31m-void *ngx_alloc(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = malloc(size);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "malloc(%uz) failed", size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void *ngx_calloc(size_t size, ngx_log_t *log)[m
[31m-{[m
[31m-    void  *p;[m
[31m-[m
[31m-    p = ngx_alloc(size, log);[m
[31m-[m
[31m-    if (p) {[m
[31m-        ngx_memzero(p, size);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_alloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_alloc.h[m
[1mdeleted file mode 100644[m
[1mindex 5a0fa3f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_alloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ALLOC_H_INCLUDED_[m
[31m-#define _NGX_ALLOC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void *ngx_alloc(size_t size, ngx_log_t *log);[m
[31m-void *ngx_calloc(size_t size, ngx_log_t *log);[m
[31m-[m
[31m-#define ngx_free          free[m
[31m-#define ngx_memalign(alignment, size, log)  ngx_alloc(size, log)[m
[31m-[m
[31m-extern ngx_uint_t  ngx_pagesize;[m
[31m-extern ngx_uint_t  ngx_pagesize_shift;[m
[31m-extern ngx_uint_t  ngx_cacheline_size;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ALLOC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_atomic.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_atomic.h[m
[1mdeleted file mode 100644[m
[1mindex 113f561..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_atomic.h[m
[1m+++ /dev/null[m
[36m@@ -1,69 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ATOMIC_H_INCLUDED_[m
[31m-#define _NGX_ATOMIC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_ATOMIC_OPS   1[m
[31m-[m
[31m-typedef int32_t                     ngx_atomic_int_t;[m
[31m-typedef uint32_t                    ngx_atomic_uint_t;[m
[31m-typedef volatile ngx_atomic_uint_t  ngx_atomic_t;[m
[31m-#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") - 1)[m
[31m-[m
[31m-[m
[31m-#if defined( __WATCOMC__ ) || defined( __BORLANDC__ ) || defined(__GNUC__)    \[m
[31m-    || ( _MSC_VER >= 1300 )[m
[31m-[m
[31m-/* the new SDK headers */[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, set)                                    \[m
[31m-    ((ngx_atomic_uint_t) InterlockedCompareExchange((long *) lock, set, old)  \[m
[31m-                         == old)[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-/* the old MS VC6.0SP2 SDK headers */[m
[31m-[m
[31m-#define ngx_atomic_cmp_set(lock, old, set)                                    \[m
[31m-    (InterlockedCompareExchange((void **) lock, (void *) set, (void *) old)   \[m
[31m-     == (void *) old)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_atomic_fetch_add(p, add) InterlockedExchangeAdd((long *) p, add)[m
[31m-[m
[31m-[m
[31m-#define ngx_memory_barrier()[m
[31m-[m
[31m-[m
[31m-#if defined( __BORLANDC__ ) || ( __WATCOMC__ < 1230 )[m
[31m-[m
[31m-/*[m
[31m- * Borland C++ 5.5 (tasm32) and Open Watcom C prior to 1.3[m
[31m- * do not understand the "pause" instruction[m
[31m- */[m
[31m-[m
[31m-#define ngx_cpu_pause()[m
[31m-#else[m
[31m-#define ngx_cpu_pause()       __asm { pause }[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin);[m
[31m-[m
[31m-#define ngx_trylock(lock)  (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))[m
[31m-#define ngx_unlock(lock)    *(lock) = 0[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ATOMIC_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_dlopen.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_dlopen.c[m
[1mdeleted file mode 100644[m
[1mindex 804f49d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_dlopen.c[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_dlerror(void)[m
[31m-{[m
[31m-    u_char         *p;[m
[31m-    static u_char   errstr[NGX_MAX_ERROR_STR];[m
[31m-[m
[31m-    p = ngx_strerror(ngx_errno, errstr, NGX_MAX_ERROR_STR);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return (char *) errstr;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_dlopen.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_dlopen.h[m
[1mdeleted file mode 100644[m
[1mindex 0d6b405..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_dlopen.h[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_DLOPEN_H_INCLUDED_[m
[31m-#define _NGX_DLOPEN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_DLOPEN  1[m
[31m-[m
[31m-[m
[31m-#define ngx_dlopen(path)           LoadLibrary((char *) path)[m
[31m-#define ngx_dlopen_n               "LoadLibrary()"[m
[31m-[m
[31m-#define ngx_dlsym(handle, symbol)  (void *) GetProcAddress(handle, symbol)[m
[31m-#define ngx_dlsym_n                "GetProcAddress()"[m
[31m-[m
[31m-#define ngx_dlclose(handle)        (FreeLibrary(handle) ? 0 : -1)[m
[31m-#define ngx_dlclose_n              "FreeLibrary()"[m
[31m-[m
[31m-[m
[31m-char *ngx_dlerror(void);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_DLOPEN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_errno.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_errno.c[m
[1mdeleted file mode 100644[m
[1mindex b732bf4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_errno.c[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)[m
[31m-{[m
[31m-    u_int          len;[m
[31m-    static u_long  lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        return errstr;[m
[31m-    }[m
[31m-[m
[31m-    len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-                        NULL, err, lang, (char *) errstr, size, NULL);[m
[31m-[m
[31m-    if (len == 0 && lang && GetLastError() == ERROR_RESOURCE_LANG_NOT_FOUND) {[m
[31m-[m
[31m-        /*[m
[31m-         * Try to use English messages first and fallback to a language,[m
[31m-         * based on locale: non-English Windows have no English messages[m
[31m-         * at all.  This way allows to use English messages at least on[m
[31m-         * Windows with MUI.[m
[31m-         */[m
[31m-[m
[31m-        lang = 0;[m
[31m-[m
[31m-        len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,[m
[31m-                            NULL, err, lang, (char *) errstr, size, NULL);[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return ngx_snprintf(errstr, size,[m
[31m-                            "FormatMessage() error:(%d)", GetLastError());[m
[31m-    }[m
[31m-[m
[31m-    /* remove ".\r\n\0" */[m
[31m-    while (errstr[len] == '\0' || errstr[len] == CR[m
[31m-           || errstr[len] == LF || errstr[len] == '.')[m
[31m-    {[m
[31m-        --len;[m
[31m-    }[m
[31m-[m
[31m-    return &errstr[++len];[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_strerror_init(void)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_errno.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_errno.h[m
[1mdeleted file mode 100644[m
[1mindex 255a39d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_errno.h[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_ERRNO_H_INCLUDED_[m
[31m-#define _NGX_ERRNO_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef DWORD                      ngx_err_t;[m
[31m-[m
[31m-#define ngx_errno                  GetLastError()[m
[31m-#define ngx_set_errno(err)         SetLastError(err)[m
[31m-#define ngx_socket_errno           WSAGetLastError()[m
[31m-#define ngx_set_socket_errno(err)  WSASetLastError(err)[m
[31m-[m
[31m-#define NGX_EPERM                  ERROR_ACCESS_DENIED[m
[31m-#define NGX_ENOENT                 ERROR_FILE_NOT_FOUND[m
[31m-#define NGX_ENOPATH                ERROR_PATH_NOT_FOUND[m
[31m-#define NGX_ENOMEM                 ERROR_NOT_ENOUGH_MEMORY[m
[31m-#define NGX_EACCES                 ERROR_ACCESS_DENIED[m
[31m-/*[m
[31m- * there are two EEXIST error codes:[m
[31m- * ERROR_FILE_EXISTS used by CreateFile(CREATE_NEW),[m
[31m- * and ERROR_ALREADY_EXISTS used by CreateDirectory();[m
[31m- * MoveFile() uses both[m
[31m- */[m
[31m-#define NGX_EEXIST                 ERROR_ALREADY_EXISTS[m
[31m-#define NGX_EEXIST_FILE            ERROR_FILE_EXISTS[m
[31m-#define NGX_EXDEV                  ERROR_NOT_SAME_DEVICE[m
[31m-#define NGX_ENOTDIR                ERROR_PATH_NOT_FOUND[m
[31m-#define NGX_EISDIR                 ERROR_CANNOT_MAKE[m
[31m-#define NGX_ENOSPC                 ERROR_DISK_FULL[m
[31m-#define NGX_EPIPE                  EPIPE[m
[31m-#define NGX_EAGAIN                 WSAEWOULDBLOCK[m
[31m-#define NGX_EINPROGRESS            WSAEINPROGRESS[m
[31m-#define NGX_ENOPROTOOPT            WSAENOPROTOOPT[m
[31m-#define NGX_EOPNOTSUPP             WSAEOPNOTSUPP[m
[31m-#define NGX_EADDRINUSE             WSAEADDRINUSE[m
[31m-#define NGX_ECONNABORTED           WSAECONNABORTED[m
[31m-#define NGX_ECONNRESET             WSAECONNRESET[m
[31m-#define NGX_ENOTCONN               WSAENOTCONN[m
[31m-#define NGX_ETIMEDOUT              WSAETIMEDOUT[m
[31m-#define NGX_ECONNREFUSED           WSAECONNREFUSED[m
[31m-#define NGX_ENAMETOOLONG           ERROR_BAD_PATHNAME[m
[31m-#define NGX_ENETDOWN               WSAENETDOWN[m
[31m-#define NGX_ENETUNREACH            WSAENETUNREACH[m
[31m-#define NGX_EHOSTDOWN              WSAEHOSTDOWN[m
[31m-#define NGX_EHOSTUNREACH           WSAEHOSTUNREACH[m
[31m-#define NGX_ENOMOREFILES           ERROR_NO_MORE_FILES[m
[31m-#define NGX_EILSEQ                 ERROR_NO_UNICODE_TRANSLATION[m
[31m-#define NGX_ELOOP                  0[m
[31m-#define NGX_EBADF                  WSAEBADF[m
[31m-[m
[31m-#define NGX_EALREADY               WSAEALREADY[m
[31m-#define NGX_EINVAL                 WSAEINVAL[m
[31m-#define NGX_EMFILE                 WSAEMFILE[m
[31m-#define NGX_ENFILE                 WSAEMFILE[m
[31m-[m
[31m-[m
[31m-u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size);[m
[31m-ngx_int_t ngx_strerror_init(void);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_ERRNO_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_event_log.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_event_log.c[m
[1mdeleted file mode 100644[m
[1mindex e11ed1e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_event_log.c[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_ERROR_STR   2048[m
[31m-[m
[31m-[m
[31m-void ngx_cdecl[m
[31m-ngx_event_log(ngx_err_t err, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char         *p, *last;[m
[31m-    long            types;[m
[31m-    HKEY            key;[m
[31m-    HANDLE          ev;[m
[31m-    va_list         args;[m
[31m-    u_char          text[NGX_MAX_ERROR_STR];[m
[31m-    const char     *msgarg[9];[m
[31m-    static u_char   netmsg[] = "%SystemRoot%\\System32\\netmsg.dll";[m
[31m-[m
[31m-    last = text + NGX_MAX_ERROR_STR;[m
[31m-    p = text + GetModuleFileName(NULL, (char *) text, NGX_MAX_ERROR_STR - 50);[m
[31m-[m
[31m-    *p++ = ':';[m
[31m-    ngx_linefeed(p);[m
[31m-[m
[31m-    va_start(args, fmt);[m
[31m-    p = ngx_vslprintf(p, last, fmt, args);[m
[31m-    va_end(args);[m
[31m-[m
[31m-    if (err) {[m
[31m-        p = ngx_log_errno(p, last, err);[m
[31m-    }[m
[31m-[m
[31m-    if (p > last - NGX_LINEFEED_SIZE - 1) {[m
[31m-        p = last - NGX_LINEFEED_SIZE - 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_linefeed(p);[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    /*[m
[31m-     * we do not log errors here since we use[m
[31m-     * Event Log only to log our own logs open errors[m
[31m-     */[m
[31m-[m
[31m-    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,[m
[31m-           "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\nginx",[m
[31m-           0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &key, NULL)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (RegSetValueEx(key, "EventMessageFile", 0, REG_EXPAND_SZ,[m
[31m-                      netmsg, sizeof(netmsg) - 1)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    types = EVENTLOG_ERROR_TYPE;[m
[31m-[m
[31m-    if (RegSetValueEx(key, "TypesSupported", 0, REG_DWORD,[m
[31m-                      (u_char *) &types, sizeof(long))[m
[31m-        != 0)[m
[31m-    {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    RegCloseKey(key);[m
[31m-[m
[31m-    ev = RegisterEventSource(NULL, "nginx");[m
[31m-[m
[31m-    msgarg[0] = (char *) text;[m
[31m-    msgarg[1] = NULL;[m
[31m-    msgarg[2] = NULL;[m
[31m-    msgarg[3] = NULL;[m
[31m-    msgarg[4] = NULL;[m
[31m-    msgarg[5] = NULL;[m
[31m-    msgarg[6] = NULL;[m
[31m-    msgarg[7] = NULL;[m
[31m-    msgarg[8] = NULL;[m
[31m-[m
[31m-    /*[m
[31m-     * the 3299 event id in netmsg.dll has the generic message format:[m
[31m-     *     "%1 %2 %3 %4 %5 %6 %7 %8 %9"[m
[31m-     */[m
[31m-[m
[31m-    ReportEvent(ev, EVENTLOG_ERROR_TYPE, 0, 3299, NULL, 9, 0, msgarg, NULL);[m
[31m-[m
[31m-    DeregisterEventSource(ev);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_files.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_files.c[m
[1mdeleted file mode 100644[m
[1mindex 9ef22a5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_files.c[m
[1m+++ /dev/null[m
[36m@@ -1,883 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_UTF16_BUFLEN  256[m
[31m-[m
[31m-static ngx_int_t ngx_win32_check_filename(u_char *name, u_short *u,[m
[31m-    size_t len);[m
[31m-static u_short *ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len);[m
[31m-[m
[31m-[m
[31m-/* FILE_FLAG_BACKUP_SEMANTICS allows to obtain a handle to a directory */[m
[31m-[m
[31m-ngx_fd_t[m
[31m-ngx_open_file(u_char *name, u_long mode, u_long create, u_long access)[m
[31m-{[m
[31m-    size_t      len;[m
[31m-    u_short    *u;[m
[31m-    ngx_fd_t    fd;[m
[31m-    ngx_err_t   err;[m
[31m-    u_short     utf16[NGX_UTF16_BUFLEN];[m
[31m-[m
[31m-    len = NGX_UTF16_BUFLEN;[m
[31m-    u = ngx_utf8_to_utf16(utf16, name, &len);[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        return INVALID_HANDLE_VALUE;[m
[31m-    }[m
[31m-[m
[31m-    fd = INVALID_HANDLE_VALUE;[m
[31m-[m
[31m-    if (create == NGX_FILE_OPEN[m
[31m-        && ngx_win32_check_filename(name, u, len) != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fd = CreateFileW(u, mode,[m
[31m-                     FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,[m
[31m-                     NULL, create, FILE_FLAG_BACKUP_SEMANTICS, NULL);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (u != utf16) {[m
[31m-        err = ngx_errno;[m
[31m-        ngx_free(u);[m
[31m-        ngx_set_errno(err);[m
[31m-    }[m
[31m-[m
[31m-    return fd;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)[m
[31m-{[m
[31m-    u_long      n;[m
[31m-    ngx_err_t   err;[m
[31m-    OVERLAPPED  ovlp, *povlp;[m
[31m-[m
[31m-    ovlp.Internal = 0;[m
[31m-    ovlp.InternalHigh = 0;[m
[31m-    ovlp.Offset = (u_long) offset;[m
[31m-    ovlp.OffsetHigh = (u_long) (offset >> 32);[m
[31m-    ovlp.hEvent = NULL;[m
[31m-[m
[31m-    povlp = &ovlp;[m
[31m-[m
[31m-    if (ReadFile(file->fd, buf, size, &n, povlp) == 0) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err == ERROR_HANDLE_EOF) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, file->log, err,[m
[31m-                      "ReadFile() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->offset += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)[m
[31m-{[m
[31m-    u_long      n;[m
[31m-    OVERLAPPED  ovlp, *povlp;[m
[31m-[m
[31m-    ovlp.Internal = 0;[m
[31m-    ovlp.InternalHigh = 0;[m
[31m-    ovlp.Offset = (u_long) offset;[m
[31m-    ovlp.OffsetHigh = (u_long) (offset >> 32);[m
[31m-    ovlp.hEvent = NULL;[m
[31m-[m
[31m-    povlp = &ovlp;[m
[31m-[m
[31m-    if (WriteFile(file->fd, buf, size, &n, povlp) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno,[m
[31m-                      "WriteFile() \"%s\" failed", file->name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n != size) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, file->log, 0,[m
[31m-                      "WriteFile() \"%s\" has written only %ul of %uz",[m
[31m-                      file->name.data, n, size);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    file->offset += n;[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,[m
[31m-    ngx_pool_t *pool)[m
[31m-{[m
[31m-    u_char   *buf, *prev;[m
[31m-    size_t    size;[m
[31m-    ssize_t   total, n;[m
[31m-[m
[31m-    total = 0;[m
[31m-[m
[31m-    while (cl) {[m
[31m-        buf = cl->buf->pos;[m
[31m-        prev = buf;[m
[31m-        size = 0;[m
[31m-[m
[31m-        /* coalesce the neighbouring bufs */[m
[31m-[m
[31m-        while (cl && prev == cl->buf->pos) {[m
[31m-            size += cl->buf->last - cl->buf->pos;[m
[31m-            prev = cl->buf->last;[m
[31m-            cl = cl->next;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_write_file(file, buf, size, offset);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        total += n;[m
[31m-        offset += n;[m
[31m-    }[m
[31m-[m
[31m-    return total;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_read_fd(ngx_fd_t fd, void *buf, size_t size)[m
[31m-{[m
[31m-    u_long  n;[m
[31m-[m
[31m-    if (ReadFile(fd, buf, size, &n, NULL) != 0) {[m
[31m-        return (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_fd(ngx_fd_t fd, void *buf, size_t size)[m
[31m-{[m
[31m-    u_long  n;[m
[31m-[m
[31m-    if (WriteFile(fd, buf, size, &n, NULL) != 0) {[m
[31m-        return (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_write_console(ngx_fd_t fd, void *buf, size_t size)[m
[31m-{[m
[31m-    u_long  n;[m
[31m-[m
[31m-    (void) CharToOemBuff(buf, buf, size);[m
[31m-[m
[31m-    if (WriteFile(fd, buf, size, &n, NULL) != 0) {[m
[31m-        return (size_t) n;[m
[31m-    }[m
[31m-[m
[31m-    return -1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)[m
[31m-{[m
[31m-    u_char             *name;[m
[31m-    ngx_err_t           err;[m
[31m-    ngx_uint_t          collision;[m
[31m-    ngx_atomic_uint_t   num;[m
[31m-[m
[31m-    name = ngx_alloc(to->len + 1 + NGX_ATOMIC_T_LEN + 1 + sizeof("DELETE"),[m
[31m-                     log);[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_ENOMEM;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name, to->data, to->len);[m
[31m-[m
[31m-    collision = 0;[m
[31m-[m
[31m-    /* mutex_lock() (per cache or single ?) */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        num = ngx_next_temp_number(collision);[m
[31m-[m
[31m-        ngx_sprintf(name + to->len, ".%0muA.DELETE%Z", num);[m
[31m-[m
[31m-        if (MoveFile((const char *) to->data, (const char *) name) != 0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        collision = 1;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,[m
[31m-                      "MoveFile() \"%s\" to \"%s\" failed", to->data, name);[m
[31m-    }[m
[31m-[m
[31m-    if (MoveFile((const char *) from->data, (const char *) to->data) == 0) {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-    } else {[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (DeleteFile((const char *) name) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,[m
[31m-                      "DeleteFile() \"%s\" failed", name);[m
[31m-    }[m
[31m-[m
[31m-    /* mutex_unlock() */[m
[31m-[m
[31m-    ngx_free(name);[m
[31m-[m
[31m-    return err;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_file_info(u_char *file, ngx_file_info_t *sb)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    long                        rc;[m
[31m-    u_short                    *u;[m
[31m-    ngx_err_t                   err;[m
[31m-    WIN32_FILE_ATTRIBUTE_DATA   fa;[m
[31m-    u_short                     utf16[NGX_UTF16_BUFLEN];[m
[31m-[m
[31m-    len = NGX_UTF16_BUFLEN;[m
[31m-[m
[31m-    u = ngx_utf8_to_utf16(utf16, file, &len);[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        return NGX_FILE_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = NGX_FILE_ERROR;[m
[31m-[m
[31m-    if (ngx_win32_check_filename(file, u, len) != NGX_OK) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    rc = GetFileAttributesExW(u, GetFileExInfoStandard, &fa);[m
[31m-[m
[31m-    sb->dwFileAttributes = fa.dwFileAttributes;[m
[31m-    sb->ftCreationTime = fa.ftCreationTime;[m
[31m-    sb->ftLastAccessTime = fa.ftLastAccessTime;[m
[31m-    sb->ftLastWriteTime = fa.ftLastWriteTime;[m
[31m-    sb->nFileSizeHigh = fa.nFileSizeHigh;[m
[31m-    sb->nFileSizeLow = fa.nFileSizeLow;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (u != utf16) {[m
[31m-        err = ngx_errno;[m
[31m-        ngx_free(u);[m
[31m-        ngx_set_errno(err);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s)[m
[31m-{[m
[31m-    uint64_t  intervals;[m
[31m-    FILETIME  ft;[m
[31m-[m
[31m-    /* 116444736000000000 is commented in src/os/win32/ngx_time.c */[m
[31m-[m
[31m-    intervals = s * 10000000 + 116444736000000000;[m
[31m-[m
[31m-    ft.dwLowDateTime = (DWORD) intervals;[m
[31m-    ft.dwHighDateTime = (DWORD) (intervals >> 32);[m
[31m-[m
[31m-    if (SetFileTime(fd, NULL, NULL, &ft) != 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_create_file_mapping(ngx_file_mapping_t *fm)[m
[31m-{[m
[31m-    LARGE_INTEGER  size;[m
[31m-[m
[31m-    fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE,[m
[31m-                           NGX_FILE_DEFAULT_ACCESS);[m
[31m-    if (fm->fd == NGX_INVALID_FILE) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      ngx_open_file_n " \"%s\" failed", fm->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    fm->handle = NULL;[m
[31m-[m
[31m-    size.QuadPart = fm->size;[m
[31m-[m
[31m-    if (SetFilePointerEx(fm->fd, size, NULL, FILE_BEGIN) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "SetFilePointerEx(\"%s\", %uz) failed",[m
[31m-                      fm->name, fm->size);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (SetEndOfFile(fm->fd) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "SetEndOfFile() \"%s\" failed", fm->name);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fm->handle = CreateFileMapping(fm->fd, NULL, PAGE_READWRITE,[m
[31m-                                   (u_long) ((off_t) fm->size >> 32),[m
[31m-                                   (u_long) ((off_t) fm->size & 0xffffffff),[m
[31m-                                   NULL);[m
[31m-    if (fm->handle == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                      "CreateFileMapping(%s, %uz) failed",[m
[31m-                      fm->name, fm->size);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fm->addr = MapViewOfFile(fm->handle, FILE_MAP_WRITE, 0, 0, 0);[m
[31m-[m
[31m-    if (fm->addr != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno,[m
[31m-                  "MapViewOfFile(%uz) of file mapping \"%s\" failed",[m
[31m-                  fm->size, fm->name);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (fm->handle) {[m
[31m-        if (CloseHandle(fm->handle) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                          "CloseHandle() of file mapping \"%s\" failed",[m
[31m-                          fm->name);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", fm->name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_file_mapping(ngx_file_mapping_t *fm)[m
[31m-{[m
[31m-    if (UnmapViewOfFile(fm->addr) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      "UnmapViewOfFile(%p) of file mapping \"%s\" failed",[m
[31m-                      fm->addr, &fm->name);[m
[31m-    }[m
[31m-[m
[31m-    if (CloseHandle(fm->handle) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      "CloseHandle() of file mapping \"%s\" failed",[m
[31m-                      &fm->name);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno,[m
[31m-                      ngx_close_file_n " \"%s\" failed", fm->name);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_realpath(u_char *path, u_char *resolved)[m
[31m-{[m
[31m-    /* STUB */[m
[31m-    return path;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    ngx_cpystrn(name->data + name->len, NGX_DIR_MASK, NGX_DIR_MASK_LEN + 1);[m
[31m-[m
[31m-    dir->dir = FindFirstFile((const char *) name->data, &dir->finddata);[m
[31m-[m
[31m-    name->data[name->len] = '\0';[m
[31m-[m
[31m-    if (dir->dir == INVALID_HANDLE_VALUE) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dir->valid_info = 1;[m
[31m-    dir->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_dir(ngx_dir_t *dir)[m
[31m-{[m
[31m-    if (dir->ready) {[m
[31m-        dir->ready = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (FindNextFile(dir->dir, &dir->finddata) != 0) {[m
[31m-        dir->type = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_close_dir(ngx_dir_t *dir)[m
[31m-{[m
[31m-    if (FindClose(dir->dir) == 0) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_open_glob(ngx_glob_t *gl)[m
[31m-{[m
[31m-    u_char     *p;[m
[31m-    size_t      len;[m
[31m-    ngx_err_t   err;[m
[31m-[m
[31m-    gl->dir = FindFirstFile((const char *) gl->pattern, &gl->finddata);[m
[31m-[m
[31m-    if (gl->dir == INVALID_HANDLE_VALUE) {[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if ((err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND)[m
[31m-             && gl->test)[m
[31m-        {[m
[31m-            gl->no_match = 1;[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (p = gl->pattern; *p; p++) {[m
[31m-        if (*p == '/') {[m
[31m-            gl->last = p + 1 - gl->pattern;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(gl->finddata.cFileName);[m
[31m-    gl->name.len = gl->last + len;[m
[31m-[m
[31m-    gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);[m
[31m-    if (gl->name.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(gl->name.data, gl->pattern, gl->last);[m
[31m-    ngx_cpystrn(gl->name.data + gl->last, (u_char *) gl->finddata.cFileName,[m
[31m-                len + 1);[m
[31m-[m
[31m-    gl->ready = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)[m
[31m-{[m
[31m-    size_t     len;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    if (gl->no_match) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (gl->ready) {[m
[31m-        *name = gl->name;[m
[31m-[m
[31m-        gl->ready = 0;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(gl->name.data);[m
[31m-    gl->name.data = NULL;[m
[31m-[m
[31m-    if (FindNextFile(gl->dir, &gl->finddata) != 0) {[m
[31m-[m
[31m-        len = ngx_strlen(gl->finddata.cFileName);[m
[31m-        gl->name.len = gl->last + len;[m
[31m-[m
[31m-        gl->name.data = ngx_alloc(gl->name.len + 1, gl->log);[m
[31m-        if (gl->name.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(gl->name.data, gl->pattern, gl->last);[m
[31m-        ngx_cpystrn(gl->name.data + gl->last, (u_char *) gl->finddata.cFileName,[m
[31m-                    len + 1);[m
[31m-[m
[31m-        *name = gl->name;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-[m
[31m-    if (err == NGX_ENOMOREFILES) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, gl->log, err,[m
[31m-                  "FindNextFile(%s) failed", gl->pattern);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_glob(ngx_glob_t *gl)[m
[31m-{[m
[31m-    if (gl->name.data) {[m
[31m-        ngx_free(gl->name.data);[m
[31m-    }[m
[31m-[m
[31m-    if (gl->dir == INVALID_HANDLE_VALUE) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (FindClose(gl->dir) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, gl->log, ngx_errno,[m
[31m-                      "FindClose(%s) failed", gl->pattern);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_de_info(u_char *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_de_link_info(u_char *name, ngx_dir_t *dir)[m
[31m-{[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_read_ahead(ngx_fd_t fd, size_t n)[m
[31m-{[m
[31m-    return ~NGX_FILE_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_directio_on(ngx_fd_t fd)[m
[31m-{[m
[31m-    return ~NGX_FILE_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_directio_off(ngx_fd_t fd)[m
[31m-{[m
[31m-    return ~NGX_FILE_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_fs_bsize(u_char *name)[m
[31m-{[m
[31m-    u_char  root[4];[m
[31m-    u_long  sc, bs, nfree, ncl;[m
[31m-[m
[31m-    if (name[2] == ':') {[m
[31m-        ngx_cpystrn(root, name, 4);[m
[31m-        name = root;[m
[31m-    }[m
[31m-[m
[31m-    if (GetDiskFreeSpace((const char *) name, &sc, &bs, &nfree, &ncl) == 0) {[m
[31m-        return 512;[m
[31m-    }[m
[31m-[m
[31m-    return sc * bs;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_win32_check_filename(u_char *name, u_short *u, size_t len)[m
[31m-{[m
[31m-    u_char     *p, ch;[m
[31m-    u_long      n;[m
[31m-    u_short    *lu;[m
[31m-    ngx_err_t   err;[m
[31m-    enum {[m
[31m-        sw_start = 0,[m
[31m-        sw_normal,[m
[31m-        sw_after_slash,[m
[31m-        sw_after_colon,[m
[31m-        sw_after_dot[m
[31m-    } state;[m
[31m-[m
[31m-    /* check for NTFS streams (":"), trailing dots and spaces */[m
[31m-[m
[31m-    lu = NULL;[m
[31m-    state = sw_start;[m
[31m-[m
[31m-    for (p = name; *p; p++) {[m
[31m-        ch = *p;[m
[31m-[m
[31m-        switch (state) {[m
[31m-[m
[31m-        case sw_start:[m
[31m-[m
[31m-            /*[m
[31m-             * skip till first "/" to allow paths starting with drive and[m
[31m-             * relative path, like "c:html/"[m
[31m-             */[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                state = sw_after_slash;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_normal:[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                state = sw_after_colon;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '.' || ch == ' ') {[m
[31m-                state = sw_after_dot;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                state = sw_after_slash;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_after_slash:[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '.') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                state = sw_after_colon;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_normal;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_after_colon:[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                state = sw_after_slash;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            goto invalid;[m
[31m-[m
[31m-        case sw_after_dot:[m
[31m-[m
[31m-            if (ch == '/' || ch == '\\') {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == ':') {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '.' || ch == ' ') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            state = sw_normal;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (state == sw_after_dot) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    /* check if long name match */[m
[31m-[m
[31m-    lu = malloc(len * 2);[m
[31m-    if (lu == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = GetLongPathNameW(u, lu, len);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (n != len - 1 || _wcsicmp(u, lu) != 0) {[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(lu);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_set_errno(NGX_ENOENT);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (lu) {[m
[31m-        err = ngx_errno;[m
[31m-        ngx_free(lu);[m
[31m-        ngx_set_errno(err);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_short *[m
[31m-ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len)[m
[31m-{[m
[31m-    u_char    *p;[m
[31m-    u_short   *u, *last;[m
[31m-    uint32_t   n;[m
[31m-[m
[31m-    p = utf8;[m
[31m-    u = utf16;[m
[31m-    last = utf16 + *len;[m
[31m-[m
[31m-    while (u < last) {[m
[31m-[m
[31m-        if (*p < 0x80) {[m
[31m-            *u++ = (u_short) *p;[m
[31m-[m
[31m-            if (*p == 0) {[m
[31m-                *len = u - utf16;[m
[31m-                return utf16;[m
[31m-            }[m
[31m-[m
[31m-            p++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (u + 1 == last) {[m
[31m-            *len = u - utf16;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_utf8_decode(&p, 4);[m
[31m-[m
[31m-        if (n > 0x10ffff) {[m
[31m-            ngx_set_errno(NGX_EILSEQ);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0xffff) {[m
[31m-            n -= 0x10000;[m
[31m-            *u++ = (u_short) (0xd800 + (n >> 10));[m
[31m-            *u++ = (u_short) (0xdc00 + (n & 0x03ff));[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *u++ = (u_short) n;[m
[31m-    }[m
[31m-[m
[31m-    /* the given buffer is not enough, allocate a new one */[m
[31m-[m
[31m-    u = malloc(((p - utf8) + ngx_strlen(p) + 1) * sizeof(u_short));[m
[31m-    if (u == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(u, utf16, *len * 2);[m
[31m-[m
[31m-    utf16 = u;[m
[31m-    u += *len;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (*p < 0x80) {[m
[31m-            *u++ = (u_short) *p;[m
[31m-[m
[31m-            if (*p == 0) {[m
[31m-                *len = u - utf16;[m
[31m-                return utf16;[m
[31m-            }[m
[31m-[m
[31m-            p++;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_utf8_decode(&p, 4);[m
[31m-[m
[31m-        if (n > 0x10ffff) {[m
[31m-            ngx_free(utf16);[m
[31m-            ngx_set_errno(NGX_EILSEQ);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (n > 0xffff) {[m
[31m-            n -= 0x10000;[m
[31m-            *u++ = (u_short) (0xd800 + (n >> 10));[m
[31m-            *u++ = (u_short) (0xdc00 + (n & 0x03ff));[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        *u++ = (u_short) n;[m
[31m-    }[m
[31m-[m
[31m-    /* unreachable */[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_files.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_files.h[m
[1mdeleted file mode 100644[m
[1mindex 895daea..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_files.h[m
[1m+++ /dev/null[m
[36m@@ -1,273 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_FILES_H_INCLUDED_[m
[31m-#define _NGX_FILES_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef HANDLE                      ngx_fd_t;[m
[31m-typedef BY_HANDLE_FILE_INFORMATION  ngx_file_info_t;[m
[31m-typedef uint64_t                    ngx_file_uniq_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                         *name;[m
[31m-    size_t                          size;[m
[31m-    void                           *addr;[m
[31m-    ngx_fd_t                        fd;[m
[31m-    HANDLE                          handle;[m
[31m-    ngx_log_t                      *log;[m
[31m-} ngx_file_mapping_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    HANDLE                          dir;[m
[31m-    WIN32_FIND_DATA                 finddata;[m
[31m-[m
[31m-    unsigned                        valid_info:1;[m
[31m-    unsigned                        type:1;[m
[31m-    unsigned                        ready:1;[m
[31m-} ngx_dir_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    HANDLE                          dir;[m
[31m-    WIN32_FIND_DATA                 finddata;[m
[31m-[m
[31m-    unsigned                        ready:1;[m
[31m-    unsigned                        test:1;[m
[31m-    unsigned                        no_match:1;[m
[31m-[m
[31m-    u_char                         *pattern;[m
[31m-    ngx_str_t                       name;[m
[31m-    size_t                          last;[m
[31m-    ngx_log_t                      *log;[m
[31m-} ngx_glob_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* INVALID_FILE_ATTRIBUTES is specified but not defined at least in MSVC6SP2 */[m
[31m-#ifndef INVALID_FILE_ATTRIBUTES[m
[31m-#define INVALID_FILE_ATTRIBUTES     0xffffffff[m
[31m-#endif[m
[31m-[m
[31m-/* INVALID_SET_FILE_POINTER is not defined at least in MSVC6SP2 */[m
[31m-#ifndef INVALID_SET_FILE_POINTER[m
[31m-#define INVALID_SET_FILE_POINTER    0xffffffff[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_INVALID_FILE            INVALID_HANDLE_VALUE[m
[31m-#define NGX_FILE_ERROR              0[m
[31m-[m
[31m-[m
[31m-ngx_fd_t ngx_open_file(u_char *name, u_long mode, u_long create, u_long access);[m
[31m-#define ngx_open_file_n             "CreateFile()"[m
[31m-[m
[31m-#define NGX_FILE_RDONLY             GENERIC_READ[m
[31m-#define NGX_FILE_WRONLY             GENERIC_WRITE[m
[31m-#define NGX_FILE_RDWR               GENERIC_READ|GENERIC_WRITE[m
[31m-#define NGX_FILE_APPEND             FILE_APPEND_DATA|SYNCHRONIZE[m
[31m-#define NGX_FILE_NONBLOCK           0[m
[31m-[m
[31m-#define NGX_FILE_CREATE_OR_OPEN     OPEN_ALWAYS[m
[31m-#define NGX_FILE_OPEN               OPEN_EXISTING[m
[31m-#define NGX_FILE_TRUNCATE           CREATE_ALWAYS[m
[31m-[m
[31m-#define NGX_FILE_DEFAULT_ACCESS     0[m
[31m-#define NGX_FILE_OWNER_ACCESS       0[m
[31m-[m
[31m-[m
[31m-#define ngx_open_tempfile(name, persistent, access)                          \[m
[31m-    CreateFile((const char *) name,                                          \[m
[31m-               GENERIC_READ|GENERIC_WRITE,                                   \[m
[31m-               FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,           \[m
[31m-               NULL,                                                         \[m
[31m-               CREATE_NEW,                                                   \[m
[31m-               persistent ? 0:                                               \[m
[31m-                   FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE,       \[m
[31m-               NULL);[m
[31m-[m
[31m-#define ngx_open_tempfile_n         "CreateFile()"[m
[31m-[m
[31m-[m
[31m-#define ngx_close_file              CloseHandle[m
[31m-#define ngx_close_file_n            "CloseHandle()"[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_read_fd(ngx_fd_t fd, void *buf, size_t size);[m
[31m-#define ngx_read_fd_n               "ReadFile()"[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_write_fd(ngx_fd_t fd, void *buf, size_t size);[m
[31m-#define ngx_write_fd_n              "WriteFile()"[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_write_console(ngx_fd_t fd, void *buf, size_t size);[m
[31m-[m
[31m-[m
[31m-#define ngx_linefeed(p)             *p++ = CR; *p++ = LF;[m
[31m-#define NGX_LINEFEED_SIZE           2[m
[31m-#define NGX_LINEFEED                CRLF[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_file(name)       DeleteFile((const char *) name)[m
[31m-#define ngx_delete_file_n           "DeleteFile()"[m
[31m-[m
[31m-[m
[31m-#define ngx_rename_file(o, n)       MoveFile((const char *) o, (const char *) n)[m
[31m-#define ngx_rename_file_n           "MoveFile()"[m
[31m-ngx_err_t ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log);[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s);[m
[31m-#define ngx_set_file_time_n         "SetFileTime()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_file_info(u_char *filename, ngx_file_info_t *fi);[m
[31m-#define ngx_file_info_n             "GetFileAttributesEx()"[m
[31m-[m
[31m-[m
[31m-#define ngx_fd_info(fd, fi)         GetFileInformationByHandle(fd, fi)[m
[31m-#define ngx_fd_info_n               "GetFileInformationByHandle()"[m
[31m-[m
[31m-[m
[31m-#define ngx_link_info(name, fi)     ngx_file_info(name, fi)[m
[31m-#define ngx_link_info_n             "GetFileAttributesEx()"[m
[31m-[m
[31m-[m
[31m-#define ngx_is_dir(fi)                                                       \[m
[31m-    (((fi)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)[m
[31m-#define ngx_is_file(fi)                                                      \[m
[31m-    (((fi)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)[m
[31m-#define ngx_is_link(fi)     0[m
[31m-#define ngx_is_exec(fi)     0[m
[31m-[m
[31m-#define ngx_file_access(fi) 0[m
[31m-[m
[31m-#define ngx_file_size(fi)                                                    \[m
[31m-    (((off_t) (fi)->nFileSizeHigh << 32) | (fi)->nFileSizeLow)[m
[31m-#define ngx_file_fs_size(fi)        ngx_file_size(fi)[m
[31m-[m
[31m-#define ngx_file_uniq(fi)   (*(ngx_file_uniq_t *) &(fi)->nFileIndexHigh)[m
[31m-[m
[31m-[m
[31m-/* 116444736000000000 is commented in src/os/win32/ngx_time.c */[m
[31m-[m
[31m-#define ngx_file_mtime(fi)                                                   \[m
[31m- (time_t) (((((unsigned __int64) (fi)->ftLastWriteTime.dwHighDateTime << 32) \[m
[31m-                               | (fi)->ftLastWriteTime.dwLowDateTime)        \[m
[31m-                                          - 116444736000000000) / 10000000)[m
[31m-[m
[31m-ngx_int_t ngx_create_file_mapping(ngx_file_mapping_t *fm);[m
[31m-void ngx_close_file_mapping(ngx_file_mapping_t *fm);[m
[31m-[m
[31m-[m
[31m-u_char *ngx_realpath(u_char *path, u_char *resolved);[m
[31m-#define ngx_realpath_n              ""[m
[31m-#define ngx_getcwd(buf, size)       GetCurrentDirectory(size, (char *) buf)[m
[31m-#define ngx_getcwd_n                "GetCurrentDirectory()"[m
[31m-#define ngx_path_separator(c)       ((c) == '/' || (c) == '\\')[m
[31m-[m
[31m-#define NGX_HAVE_MAX_PATH           1[m
[31m-#define NGX_MAX_PATH                MAX_PATH[m
[31m-[m
[31m-#define NGX_DIR_MASK                (u_char *) "/*"[m
[31m-#define NGX_DIR_MASK_LEN            2[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir);[m
[31m-#define ngx_open_dir_n              "FindFirstFile()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_read_dir(ngx_dir_t *dir);[m
[31m-#define ngx_read_dir_n              "FindNextFile()"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_close_dir(ngx_dir_t *dir);[m
[31m-#define ngx_close_dir_n             "FindClose()"[m
[31m-[m
[31m-[m
[31m-#define ngx_create_dir(name, access) CreateDirectory((const char *) name, NULL)[m
[31m-#define ngx_create_dir_n            "CreateDirectory()"[m
[31m-[m
[31m-[m
[31m-#define ngx_delete_dir(name)        RemoveDirectory((const char *) name)[m
[31m-#define ngx_delete_dir_n            "RemoveDirectory()"[m
[31m-[m
[31m-[m
[31m-#define ngx_dir_access(a)           (a)[m
[31m-[m
[31m-[m
[31m-#define ngx_de_name(dir)            ((u_char *) (dir)->finddata.cFileName)[m
[31m-#define ngx_de_namelen(dir)         ngx_strlen((dir)->finddata.cFileName)[m
[31m-[m
[31m-ngx_int_t ngx_de_info(u_char *name, ngx_dir_t *dir);[m
[31m-#define ngx_de_info_n               "dummy()"[m
[31m-[m
[31m-ngx_int_t ngx_de_link_info(u_char *name, ngx_dir_t *dir);[m
[31m-#define ngx_de_link_info_n          "dummy()"[m
[31m-[m
[31m-#define ngx_de_is_dir(dir)                                                   \[m
[31m-    (((dir)->finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)[m
[31m-#define ngx_de_is_file(dir)                                                  \[m
[31m-    (((dir)->finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)[m
[31m-#define ngx_de_is_link(dir)         0[m
[31m-#define ngx_de_access(dir)          0[m
[31m-#define ngx_de_size(dir)                                                     \[m
[31m-  (((off_t) (dir)->finddata.nFileSizeHigh << 32) | (dir)->finddata.nFileSizeLow)[m
[31m-#define ngx_de_fs_size(dir)         ngx_de_size(dir)[m
[31m-[m
[31m-/* 116444736000000000 is commented in src/os/win32/ngx_time.c */[m
[31m-[m
[31m-#define ngx_de_mtime(dir)                                                    \[m
[31m-    (time_t) (((((unsigned __int64)                                          \[m
[31m-                     (dir)->finddata.ftLastWriteTime.dwHighDateTime << 32)   \[m
[31m-                      | (dir)->finddata.ftLastWriteTime.dwLowDateTime)       \[m
[31m-                                          - 116444736000000000) / 10000000)[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_open_glob(ngx_glob_t *gl);[m
[31m-#define ngx_open_glob_n             "FindFirstFile()"[m
[31m-[m
[31m-ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name);[m
[31m-void ngx_close_glob(ngx_glob_t *gl);[m
[31m-[m
[31m-[m
[31m-ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset);[m
[31m-#define ngx_read_file_n             "ReadFile()"[m
[31m-[m
[31m-ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size,[m
[31m-    off_t offset);[m
[31m-[m
[31m-ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce,[m
[31m-    off_t offset, ngx_pool_t *pool);[m
[31m-[m
[31m-ngx_int_t ngx_read_ahead(ngx_fd_t fd, size_t n);[m
[31m-#define ngx_read_ahead_n            "ngx_read_ahead_n"[m
[31m-[m
[31m-ngx_int_t ngx_directio_on(ngx_fd_t fd);[m
[31m-#define ngx_directio_on_n           "ngx_directio_on_n"[m
[31m-[m
[31m-ngx_int_t ngx_directio_off(ngx_fd_t fd);[m
[31m-#define ngx_directio_off_n          "ngx_directio_off_n"[m
[31m-[m
[31m-size_t ngx_fs_bsize(u_char *name);[m
[31m-[m
[31m-[m
[31m-#define ngx_stdout               GetStdHandle(STD_OUTPUT_HANDLE)[m
[31m-#define ngx_stderr               GetStdHandle(STD_ERROR_HANDLE)[m
[31m-#define ngx_set_stderr(fd)       SetStdHandle(STD_ERROR_HANDLE, fd)[m
[31m-#define ngx_set_stderr_n         "SetStdHandle(STD_ERROR_HANDLE)"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_FILES_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_os.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_os.h[m
[1mdeleted file mode 100644[m
[1mindex 98210a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_os.h[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_OS_H_INCLUDED_[m
[31m-#define _NGX_OS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_IO_SENDFILE    1[m
[31m-[m
[31m-[m
[31m-typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_recv_pt        recv;[m
[31m-    ngx_recv_chain_pt  recv_chain;[m
[31m-    ngx_recv_pt        udp_recv;[m
[31m-    ngx_send_pt        send;[m
[31m-    ngx_send_chain_pt  send_chain;[m
[31m-    ngx_uint_t         flags;[m
[31m-} ngx_os_io_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_os_init(ngx_log_t *log);[m
[31m-void ngx_os_status(ngx_log_t *log);[m
[31m-ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid);[m
[31m-[m
[31m-ssize_t ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf,[m
[31m-    size_t size);[m
[31m-ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit);[m
[31m-ssize_t ngx_wsasend(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ssize_t ngx_overlapped_wsasend(ngx_connection_t *c, u_char *buf, size_t size);[m
[31m-ngx_chain_t *ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in,[m
[31m-    off_t limit);[m
[31m-[m
[31m-void ngx_cdecl ngx_event_log(ngx_err_t err, const char *fmt, ...);[m
[31m-[m
[31m-[m
[31m-extern ngx_os_io_t  ngx_os_io;[m
[31m-extern ngx_uint_t   ngx_ncpu;[m
[31m-extern ngx_uint_t   ngx_max_wsabufs;[m
[31m-extern ngx_int_t    ngx_max_sockets;[m
[31m-extern ngx_uint_t   ngx_inherited_nonblocking;[m
[31m-extern ngx_uint_t   ngx_tcp_nodelay_and_tcp_nopush;[m
[31m-extern ngx_uint_t   ngx_win32_version;[m
[31m-extern char         ngx_unique[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_OS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process.c[m
[1mdeleted file mode 100644[m
[1mindex 57b1ae9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process.c[m
[1m+++ /dev/null[m
[36m@@ -1,238 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-int              ngx_argc;[m
[31m-char           **ngx_argv;[m
[31m-char           **ngx_os_argv;[m
[31m-[m
[31m-ngx_int_t        ngx_last_process;[m
[31m-ngx_process_t    ngx_processes[NGX_MAX_PROCESSES];[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)[m
[31m-{[m
[31m-    u_long          rc, n, code;[m
[31m-    ngx_int_t       s;[m
[31m-    ngx_pid_t       pid;[m
[31m-    ngx_exec_ctx_t  ctx;[m
[31m-    HANDLE          events[2];[m
[31m-    char            file[MAX_PATH + 1];[m
[31m-[m
[31m-    if (respawn >= 0) {[m
[31m-        s = respawn;[m
[31m-[m
[31m-    } else {[m
[31m-        for (s = 0; s < ngx_last_process; s++) {[m
[31m-            if (ngx_processes[s].handle == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (s == NGX_MAX_PROCESSES) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "no more than %d processes can be spawned",[m
[31m-                          NGX_MAX_PROCESSES);[m
[31m-            return NGX_INVALID_PID;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = GetModuleFileName(NULL, file, MAX_PATH);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "GetModuleFileName() failed");[m
[31m-        return NGX_INVALID_PID;[m
[31m-    }[m
[31m-[m
[31m-    file[n] = '\0';[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                   "GetModuleFileName: \"%s\"", file);[m
[31m-[m
[31m-    ctx.path = file;[m
[31m-    ctx.name = name;[m
[31m-    ctx.args = GetCommandLine();[m
[31m-    ctx.argv = NULL;[m
[31m-    ctx.envp = NULL;[m
[31m-[m
[31m-    pid = ngx_execute(cycle, &ctx);[m
[31m-[m
[31m-    if (pid == NGX_INVALID_PID) {[m
[31m-        return pid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t));[m
[31m-[m
[31m-    ngx_processes[s].handle = ctx.child;[m
[31m-    ngx_processes[s].pid = pid;[m
[31m-    ngx_processes[s].name = name;[m
[31m-[m
[31m-    ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%P%Z", name, pid);[m
[31m-    ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%P%Z", name, pid);[m
[31m-    ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%P%Z",[m
[31m-                name, pid);[m
[31m-[m
[31m-    events[0] = ngx_master_process_event;[m
[31m-    events[1] = ctx.child;[m
[31m-[m
[31m-    rc = WaitForMultipleObjects(2, events, 0, 5000);[m
[31m-[m
[31m-    ngx_time_update();[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                   "WaitForMultipleObjects: %ul", rc);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case WAIT_OBJECT_0:[m
[31m-[m
[31m-        ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0,[m
[31m-                                          (char *) ngx_processes[s].term_event);[m
[31m-        if (ngx_processes[s].term == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "OpenEvent(\"%s\") failed",[m
[31m-                          ngx_processes[s].term_event);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0,[m
[31m-                                          (char *) ngx_processes[s].quit_event);[m
[31m-        if (ngx_processes[s].quit == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "OpenEvent(\"%s\") failed",[m
[31m-                          ngx_processes[s].quit_event);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0,[m
[31m-                                       (char *) ngx_processes[s].reopen_event);[m
[31m-        if (ngx_processes[s].reopen == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "OpenEvent(\"%s\") failed",[m
[31m-                          ngx_processes[s].reopen_event);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ResetEvent(ngx_master_process_event) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                          "ResetEvent(\"%s\") failed",[m
[31m-                          ngx_master_process_event_name);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case WAIT_OBJECT_0 + 1:[m
[31m-        if (GetExitCodeProcess(ctx.child, &code) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "GetExitCodeProcess(%P) failed", pid);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "%s process %P exited with code %Xl",[m
[31m-                      name, pid, code);[m
[31m-[m
[31m-        goto failed;[m
[31m-[m
[31m-    case WAIT_TIMEOUT:[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                      "the event \"%s\" was not signaled for 5s",[m
[31m-                      ngx_master_process_event_name);[m
[31m-        goto failed;[m
[31m-[m
[31m-    case WAIT_FAILED:[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "WaitForSingleObject(\"%s\") failed",[m
[31m-                      ngx_master_process_event_name);[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (respawn >= 0) {[m
[31m-        return pid;[m
[31m-    }[m
[31m-[m
[31m-    switch (respawn) {[m
[31m-[m
[31m-    case NGX_PROCESS_RESPAWN:[m
[31m-        ngx_processes[s].just_spawn = 0;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_PROCESS_JUST_RESPAWN:[m
[31m-        ngx_processes[s].just_spawn = 1;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (s == ngx_last_process) {[m
[31m-        ngx_last_process++;[m
[31m-    }[m
[31m-[m
[31m-    return pid;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ngx_processes[s].reopen) {[m
[31m-        ngx_close_handle(ngx_processes[s].reopen);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_processes[s].quit) {[m
[31m-        ngx_close_handle(ngx_processes[s].quit);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_processes[s].term) {[m
[31m-        ngx_close_handle(ngx_processes[s].term);[m
[31m-    }[m
[31m-[m
[31m-    TerminateProcess(ngx_processes[s].handle, 2);[m
[31m-[m
[31m-    if (ngx_processes[s].handle) {[m
[31m-        ngx_close_handle(ngx_processes[s].handle);[m
[31m-        ngx_processes[s].handle = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_INVALID_PID;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pid_t[m
[31m-ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)[m
[31m-{[m
[31m-    STARTUPINFO          si;[m
[31m-    PROCESS_INFORMATION  pi;[m
[31m-[m
[31m-    ngx_memzero(&si, sizeof(STARTUPINFO));[m
[31m-    si.cb = sizeof(STARTUPINFO);[m
[31m-[m
[31m-    ngx_memzero(&pi, sizeof(PROCESS_INFORMATION));[m
[31m-[m
[31m-    if (CreateProcess(ctx->path, ctx->args,[m
[31m-                      NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,[m
[31m-                      "CreateProcess(\"%s\") failed", ngx_argv[0]);[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx->child = pi.hProcess;[m
[31m-[m
[31m-    if (CloseHandle(pi.hThread) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CloseHandle(pi.hThread) failed");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                  "start %s process %P", ctx->name, pi.dwProcessId);[m
[31m-[m
[31m-    return pi.dwProcessId;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process.h[m
[1mdeleted file mode 100644[m
[1mindex a6a5aa2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process.h[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROCESS_H_INCLUDED_[m
[31m-#define _NGX_PROCESS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef DWORD               ngx_pid_t;[m
[31m-#define NGX_INVALID_PID     0[m
[31m-[m
[31m-[m
[31m-#define ngx_getpid          GetCurrentProcessId[m
[31m-#define ngx_log_pid         ngx_pid[m
[31m-[m
[31m-[m
[31m-#define NGX_PROCESS_SYNC_NAME                                                 \[m
[31m-    (sizeof("ngx_cache_manager_mutex_") + NGX_INT32_LEN)[m
[31m-[m
[31m-[m
[31m-typedef uint64_t            ngx_cpuset_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    HANDLE                  handle;[m
[31m-    ngx_pid_t               pid;[m
[31m-    char                   *name;[m
[31m-[m
[31m-    HANDLE                  term;[m
[31m-    HANDLE                  quit;[m
[31m-    HANDLE                  reopen;[m
[31m-[m
[31m-    u_char                  term_event[NGX_PROCESS_SYNC_NAME];[m
[31m-    u_char                  quit_event[NGX_PROCESS_SYNC_NAME];[m
[31m-    u_char                  reopen_event[NGX_PROCESS_SYNC_NAME];[m
[31m-[m
[31m-    unsigned                just_spawn:1;[m
[31m-    unsigned                exiting:1;[m
[31m-} ngx_process_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    char                   *path;[m
[31m-    char                   *name;[m
[31m-    char                   *args;[m
[31m-    char *const            *argv;[m
[31m-    char *const            *envp;[m
[31m-    HANDLE                  child;[m
[31m-} ngx_exec_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn);[m
[31m-ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx);[m
[31m-[m
[31m-#define ngx_debug_point()[m
[31m-#define ngx_sched_yield()   SwitchToThread()[m
[31m-[m
[31m-[m
[31m-#define NGX_MAX_PROCESSES         (MAXIMUM_WAIT_OBJECTS - 4)[m
[31m-[m
[31m-#define NGX_PROCESS_RESPAWN       -2[m
[31m-#define NGX_PROCESS_JUST_RESPAWN  -3[m
[31m-[m
[31m-[m
[31m-extern int                  ngx_argc;[m
[31m-extern char               **ngx_argv;[m
[31m-extern char               **ngx_os_argv;[m
[31m-[m
[31m-extern ngx_int_t            ngx_last_process;[m
[31m-extern ngx_process_t        ngx_processes[NGX_MAX_PROCESSES];[m
[31m-[m
[31m-extern ngx_pid_t            ngx_pid;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROCESS_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process_cycle.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process_cycle.c[m
[1mdeleted file mode 100644[m
[1mindex 795e41e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process_cycle.c[m
[1m+++ /dev/null[m
[36m@@ -1,1041 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-static void ngx_console_init(ngx_cycle_t *cycle);[m
[31m-static int __stdcall ngx_console_handler(u_long type);[m
[31m-static ngx_int_t ngx_create_signal_events(ngx_cycle_t *cycle);[m
[31m-static ngx_int_t ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t type);[m
[31m-static void ngx_reopen_worker_processes(ngx_cycle_t *cycle);[m
[31m-static void ngx_quit_worker_processes(ngx_cycle_t *cycle, ngx_uint_t old);[m
[31m-static void ngx_terminate_worker_processes(ngx_cycle_t *cycle);[m
[31m-static ngx_uint_t ngx_reap_worker(ngx_cycle_t *cycle, HANDLE h);[m
[31m-static void ngx_master_process_exit(ngx_cycle_t *cycle);[m
[31m-static void ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn);[m
[31m-static void ngx_worker_process_exit(ngx_cycle_t *cycle);[m
[31m-static ngx_thread_value_t __stdcall ngx_worker_thread(void *data);[m
[31m-static ngx_thread_value_t __stdcall ngx_cache_manager_thread(void *data);[m
[31m-static void ngx_cache_manager_process_handler(void);[m
[31m-static ngx_thread_value_t __stdcall ngx_cache_loader_thread(void *data);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t     ngx_process;[m
[31m-ngx_uint_t     ngx_worker;[m
[31m-ngx_pid_t      ngx_pid;[m
[31m-[m
[31m-ngx_uint_t     ngx_inherited;[m
[31m-ngx_pid_t      ngx_new_binary;[m
[31m-[m
[31m-sig_atomic_t   ngx_terminate;[m
[31m-sig_atomic_t   ngx_quit;[m
[31m-sig_atomic_t   ngx_reopen;[m
[31m-sig_atomic_t   ngx_reconfigure;[m
[31m-ngx_uint_t     ngx_exiting;[m
[31m-[m
[31m-[m
[31m-HANDLE         ngx_master_process_event;[m
[31m-char           ngx_master_process_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-[m
[31m-static HANDLE  ngx_stop_event;[m
[31m-static char    ngx_stop_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-static HANDLE  ngx_quit_event;[m
[31m-static char    ngx_quit_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-static HANDLE  ngx_reopen_event;[m
[31m-static char    ngx_reopen_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-static HANDLE  ngx_reload_event;[m
[31m-static char    ngx_reload_event_name[NGX_PROCESS_SYNC_NAME];[m
[31m-[m
[31m-HANDLE         ngx_cache_manager_mutex;[m
[31m-char           ngx_cache_manager_mutex_name[NGX_PROCESS_SYNC_NAME];[m
[31m-HANDLE         ngx_cache_manager_event;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_master_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    u_long      nev, ev, timeout;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_msec_t  timer;[m
[31m-    ngx_uint_t  live;[m
[31m-    HANDLE      events[MAXIMUM_WAIT_OBJECTS];[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_master_process_event_name,[m
[31m-                "ngx_master_%s%Z", ngx_unique);[m
[31m-[m
[31m-    if (ngx_process == NGX_PROCESS_WORKER) {[m
[31m-        ngx_worker_process_cycle(cycle, ngx_master_process_event_name);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "master started");[m
[31m-[m
[31m-    ngx_console_init(cycle);[m
[31m-[m
[31m-    SetEnvironmentVariable("ngx_unique", ngx_unique);[m
[31m-[m
[31m-    ngx_master_process_event = CreateEvent(NULL, 1, 0,[m
[31m-                                           ngx_master_process_event_name);[m
[31m-    if (ngx_master_process_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed",[m
[31m-                      ngx_master_process_event_name);[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_create_signal_events(cycle) != NGX_OK) {[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_cache_manager_mutex_name,[m
[31m-                "ngx_cache_manager_mutex_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_cache_manager_mutex = CreateMutex(NULL, 0,[m
[31m-                                          ngx_cache_manager_mutex_name);[m
[31m-    if (ngx_cache_manager_mutex == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                   "CreateMutex(\"%s\") failed", ngx_cache_manager_mutex_name);[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    events[0] = ngx_stop_event;[m
[31m-    events[1] = ngx_quit_event;[m
[31m-    events[2] = ngx_reopen_event;[m
[31m-    events[3] = ngx_reload_event;[m
[31m-[m
[31m-    ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-    if (ngx_start_worker_processes(cycle, NGX_PROCESS_RESPAWN) == 0) {[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    timer = 0;[m
[31m-    timeout = INFINITE;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        nev = 4;[m
[31m-        for (n = 0; n < ngx_last_process; n++) {[m
[31m-            if (ngx_processes[n].handle) {[m
[31m-                events[nev++] = ngx_processes[n].handle;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (timer) {[m
[31m-            timeout = timer > ngx_current_msec ? timer - ngx_current_msec : 0;[m
[31m-        }[m
[31m-[m
[31m-        ev = WaitForMultipleObjects(nev, events, 0, timeout);[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "master WaitForMultipleObjects: %ul", ev);[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-            if (ResetEvent(ngx_stop_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed", ngx_stop_event_name);[m
[31m-            }[m
[31m-[m
[31m-            if (timer == 0) {[m
[31m-                timer = ngx_current_msec + 5000;[m
[31m-            }[m
[31m-[m
[31m-            ngx_terminate = 1;[m
[31m-            ngx_quit_worker_processes(cycle, 0);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 1) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "shutting down");[m
[31m-[m
[31m-            if (ResetEvent(ngx_quit_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed", ngx_quit_event_name);[m
[31m-            }[m
[31m-[m
[31m-            ngx_quit = 1;[m
[31m-            ngx_quit_worker_processes(cycle, 0);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 2) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");[m
[31m-[m
[31m-            if (ResetEvent(ngx_reopen_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed",[m
[31m-                              ngx_reopen_event_name);[m
[31m-            }[m
[31m-[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-            ngx_reopen_worker_processes(cycle);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 3) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");[m
[31m-[m
[31m-            if (ResetEvent(ngx_reload_event) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed",[m
[31m-                              ngx_reload_event_name);[m
[31m-            }[m
[31m-[m
[31m-            cycle = ngx_init_cycle(cycle);[m
[31m-            if (cycle == NULL) {[m
[31m-                cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ngx_cycle = cycle;[m
[31m-[m
[31m-            ngx_close_listening_sockets(cycle);[m
[31m-[m
[31m-            if (ngx_start_worker_processes(cycle, NGX_PROCESS_JUST_RESPAWN)) {[m
[31m-                ngx_quit_worker_processes(cycle, 1);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev > WAIT_OBJECT_0 + 3 && ev < WAIT_OBJECT_0 + nev) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "reap worker");[m
[31m-[m
[31m-            live = ngx_reap_worker(cycle, events[ev]);[m
[31m-[m
[31m-            if (!live && (ngx_terminate || ngx_quit)) {[m
[31m-                ngx_master_process_exit(cycle);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_TIMEOUT) {[m
[31m-            ngx_terminate_worker_processes(cycle);[m
[31m-[m
[31m-            ngx_master_process_exit(cycle);[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "WaitForMultipleObjects() failed");[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-            "WaitForMultipleObjects() returned unexpected value %ul", ev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_console_init(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    if (ccf->daemon) {[m
[31m-        if (FreeConsole() == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "FreeConsole() failed");[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (SetConsoleCtrlHandler(ngx_console_handler, 1) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "SetConsoleCtrlHandler() failed");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int __stdcall[m
[31m-ngx_console_handler(u_long type)[m
[31m-{[m
[31m-    char  *msg;[m
[31m-[m
[31m-    switch (type) {[m
[31m-[m
[31m-    case CTRL_C_EVENT:[m
[31m-        msg = "Ctrl-C pressed, exiting";[m
[31m-        break;[m
[31m-[m
[31m-    case CTRL_BREAK_EVENT:[m
[31m-        msg = "Ctrl-Break pressed, exiting";[m
[31m-        break;[m
[31m-[m
[31m-    case CTRL_CLOSE_EVENT:[m
[31m-        msg = "console closing, exiting";[m
[31m-        break;[m
[31m-[m
[31m-    case CTRL_LOGOFF_EVENT:[m
[31m-        msg = "user logs off, exiting";[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, msg);[m
[31m-[m
[31m-    if (ngx_stop_event == NULL) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (SetEvent(ngx_stop_event) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "SetEvent(\"%s\") failed", ngx_stop_event_name);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_create_signal_events(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_sprintf((u_char *) ngx_stop_event_name,[m
[31m-                "Global\\ngx_stop_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_stop_event = CreateEvent(NULL, 1, 0, ngx_stop_event_name);[m
[31m-    if (ngx_stop_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", ngx_stop_event_name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_quit_event_name,[m
[31m-                "Global\\ngx_quit_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_quit_event = CreateEvent(NULL, 1, 0, ngx_quit_event_name);[m
[31m-    if (ngx_quit_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", ngx_quit_event_name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_reopen_event_name,[m
[31m-                "Global\\ngx_reopen_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_reopen_event = CreateEvent(NULL, 1, 0, ngx_reopen_event_name);[m
[31m-    if (ngx_reopen_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", ngx_reopen_event_name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_reload_event_name,[m
[31m-                "Global\\ngx_reload_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_reload_event = CreateEvent(NULL, 1, 0, ngx_reload_event_name);[m
[31m-    if (ngx_reload_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", ngx_reload_event_name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t type)[m
[31m-{[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_core_conf_t  *ccf;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);[m
[31m-[m
[31m-    for (n = 0; n < ccf->worker_processes; n++) {[m
[31m-        if (ngx_spawn_process(cycle, "worker", type) == NGX_INVALID_PID) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_reopen_worker_processes(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].handle == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (SetEvent(ngx_processes[n].reopen) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "SetEvent(\"%s\") failed",[m
[31m-                          ngx_processes[n].reopen_event);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_quit_worker_processes(ngx_cycle_t *cycle, ngx_uint_t old)[m
[31m-{[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        ngx_log_debug5(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "process: %d %P %p e:%d j:%d",[m
[31m-                       n,[m
[31m-                       ngx_processes[n].pid,[m
[31m-                       ngx_processes[n].handle,[m
[31m-                       ngx_processes[n].exiting,[m
[31m-                       ngx_processes[n].just_spawn);[m
[31m-[m
[31m-        if (old && ngx_processes[n].just_spawn) {[m
[31m-            ngx_processes[n].just_spawn = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_processes[n].handle == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (SetEvent(ngx_processes[n].quit) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "SetEvent(\"%s\") failed",[m
[31m-                          ngx_processes[n].quit_event);[m
[31m-        }[m
[31m-[m
[31m-        ngx_processes[n].exiting = 1;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_terminate_worker_processes(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].handle == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (TerminateProcess(ngx_processes[n].handle, 0) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "TerminateProcess(\"%p\") failed",[m
[31m-                          ngx_processes[n].handle);[m
[31m-        }[m
[31m-[m
[31m-        ngx_processes[n].exiting = 1;[m
[31m-[m
[31m-        ngx_close_handle(ngx_processes[n].reopen);[m
[31m-        ngx_close_handle(ngx_processes[n].quit);[m
[31m-        ngx_close_handle(ngx_processes[n].term);[m
[31m-        ngx_close_handle(ngx_processes[n].handle);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_reap_worker(ngx_cycle_t *cycle, HANDLE h)[m
[31m-{[m
[31m-    u_long     code;[m
[31m-    ngx_int_t  n;[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        if (ngx_processes[n].handle != h) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (GetExitCodeProcess(h, &code) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                          "GetExitCodeProcess(%P) failed",[m
[31m-                          ngx_processes[n].pid);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,[m
[31m-                      "%s process %P exited with code %Xl",[m
[31m-                      ngx_processes[n].name, ngx_processes[n].pid, code);[m
[31m-[m
[31m-        ngx_close_handle(ngx_processes[n].reopen);[m
[31m-        ngx_close_handle(ngx_processes[n].quit);[m
[31m-        ngx_close_handle(ngx_processes[n].term);[m
[31m-        ngx_close_handle(h);[m
[31m-[m
[31m-        ngx_processes[n].handle = NULL;[m
[31m-        ngx_processes[n].term = NULL;[m
[31m-        ngx_processes[n].quit = NULL;[m
[31m-        ngx_processes[n].reopen = NULL;[m
[31m-[m
[31m-        if (!ngx_processes[n].exiting && !ngx_terminate && !ngx_quit) {[m
[31m-[m
[31m-            if (ngx_spawn_process(cycle, ngx_processes[n].name, n)[m
[31m-                == NGX_INVALID_PID)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "could not respawn %s", ngx_processes[n].name);[m
[31m-[m
[31m-                if (n == ngx_last_process - 1) {[m
[31m-                    ngx_last_process--;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto found;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unknown process handle %p", h);[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    for (n = 0; n < ngx_last_process; n++) {[m
[31m-[m
[31m-        ngx_log_debug5(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "process: %d %P %p e:%d j:%d",[m
[31m-                       n,[m
[31m-                       ngx_processes[n].pid,[m
[31m-                       ngx_processes[n].handle,[m
[31m-                       ngx_processes[n].exiting,[m
[31m-                       ngx_processes[n].just_spawn);[m
[31m-[m
[31m-        if (ngx_processes[n].handle) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_master_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-    ngx_delete_pidfile(cycle);[m
[31m-[m
[31m-    ngx_close_handle(ngx_cache_manager_mutex);[m
[31m-    ngx_close_handle(ngx_stop_event);[m
[31m-    ngx_close_handle(ngx_quit_event);[m
[31m-    ngx_close_handle(ngx_reopen_event);[m
[31m-    ngx_close_handle(ngx_reload_event);[m
[31m-    ngx_close_handle(ngx_master_process_event);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_master) {[m
[31m-            cycle->modules[i]->exit_master(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn)[m
[31m-{[m
[31m-    char        wtevn[NGX_PROCESS_SYNC_NAME];[m
[31m-    char        wqevn[NGX_PROCESS_SYNC_NAME];[m
[31m-    char        wroevn[NGX_PROCESS_SYNC_NAME];[m
[31m-    HANDLE      mev, events[3];[m
[31m-    u_long      nev, ev;[m
[31m-    ngx_err_t   err;[m
[31m-    ngx_tid_t   wtid, cmtid, cltid;[m
[31m-    ngx_log_t  *log;[m
[31m-[m
[31m-    log = cycle->log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "worker started");[m
[31m-[m
[31m-    ngx_sprintf((u_char *) wtevn, "ngx_worker_term_%P%Z", ngx_pid);[m
[31m-    events[0] = CreateEvent(NULL, 1, 0, wtevn);[m
[31m-    if (events[0] == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", wtevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf((u_char *) wqevn, "ngx_worker_quit_%P%Z", ngx_pid);[m
[31m-    events[1] = CreateEvent(NULL, 1, 0, wqevn);[m
[31m-    if (events[1] == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", wqevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf((u_char *) wroevn, "ngx_worker_reopen_%P%Z", ngx_pid);[m
[31m-    events[2] = CreateEvent(NULL, 1, 0, wroevn);[m
[31m-    if (events[2] == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "CreateEvent(\"%s\") failed", wroevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    mev = OpenEvent(EVENT_MODIFY_STATE, 0, mevn);[m
[31m-    if (mev == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "OpenEvent(\"%s\") failed", mevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (SetEvent(mev) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "SetEvent(\"%s\") failed", mevn);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ngx_sprintf((u_char *) ngx_cache_manager_mutex_name,[m
[31m-                "ngx_cache_manager_mutex_%s%Z", ngx_unique);[m
[31m-[m
[31m-    ngx_cache_manager_mutex = OpenMutex(SYNCHRONIZE, 0,[m
[31m-                                        ngx_cache_manager_mutex_name);[m
[31m-    if (ngx_cache_manager_mutex == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "OpenMutex(\"%s\") failed", ngx_cache_manager_mutex_name);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_cache_manager_event = CreateEvent(NULL, 1, 0, NULL);[m
[31m-    if (ngx_cache_manager_event == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "CreateEvent(\"ngx_cache_manager_event\") failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (ngx_create_thread(&wtid, ngx_worker_thread, NULL, log) != 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_create_thread(&cmtid, ngx_cache_manager_thread, NULL, log) != 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_create_thread(&cltid, ngx_cache_loader_thread, NULL, log) != 0) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ev = WaitForMultipleObjects(3, events, 0, INFINITE);[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "worker WaitForMultipleObjects: %ul", ev);[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0) {[m
[31m-            ngx_terminate = 1;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "exiting");[m
[31m-[m
[31m-            if (ResetEvent(events[0]) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed", wtevn);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 1) {[m
[31m-            ngx_quit = 1;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "gracefully shutting down");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 2) {[m
[31m-            ngx_reopen = 1;[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, log, 0, "reopening logs");[m
[31m-[m
[31m-            if (ResetEvent(events[2]) == 0) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, 0,[m
[31m-                              "ResetEvent(\"%s\") failed", wroevn);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "WaitForMultipleObjects() failed");[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* wait threads */[m
[31m-[m
[31m-    if (SetEvent(ngx_cache_manager_event) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                      "SetEvent(\"ngx_cache_manager_event\") failed");[m
[31m-    }[m
[31m-[m
[31m-    events[1] = wtid;[m
[31m-    events[2] = cmtid;[m
[31m-[m
[31m-    nev = 3;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ev = WaitForMultipleObjects(nev, events, 0, INFINITE);[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,[m
[31m-                       "worker exit WaitForMultipleObjects: %ul", ev);[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 1) {[m
[31m-            if (nev == 2) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            events[1] = events[2];[m
[31m-            nev = 2;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_OBJECT_0 + 2) {[m
[31m-            nev = 2;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ev == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "WaitForMultipleObjects() failed");[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_handle(ngx_cache_manager_event);[m
[31m-    ngx_close_handle(events[0]);[m
[31m-    ngx_close_handle(events[1]);[m
[31m-    ngx_close_handle(events[2]);[m
[31m-    ngx_close_handle(mev);[m
[31m-[m
[31m-    ngx_worker_process_exit(cycle);[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    exit(2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_thread_value_t __stdcall[m
[31m-ngx_worker_thread(void *data)[m
[31m-{[m
[31m-    ngx_int_t     n;[m
[31m-    ngx_cycle_t  *cycle;[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    for (n = 0; cycle->modules[n]; n++) {[m
[31m-        if (cycle->modules[n]->init_process) {[m
[31m-            if (cycle->modules[n]->init_process(cycle) == NGX_ERROR) {[m
[31m-                /* fatal */[m
[31m-                exit(2);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    while (!ngx_quit) {[m
[31m-[m
[31m-        if (ngx_exiting) {[m
[31m-            ngx_event_cancel_timers();[m
[31m-[m
[31m-            if (ngx_event_timer_rbtree.root[m
[31m-                == ngx_event_timer_rbtree.sentinel)[m
[31m-            {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "worker cycle");[m
[31m-[m
[31m-        ngx_process_events_and_timers(cycle);[m
[31m-[m
[31m-        if (ngx_terminate) {[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_quit) {[m
[31m-            ngx_quit = 0;[m
[31m-[m
[31m-            if (!ngx_exiting) {[m
[31m-                ngx_exiting = 1;[m
[31m-                ngx_close_listening_sockets(cycle);[m
[31m-                ngx_close_idle_connections(cycle);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_reopen) {[m
[31m-            ngx_reopen = 0;[m
[31m-            ngx_reopen_files(cycle, -1);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_worker_process_exit(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_uint_t         i;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");[m
[31m-[m
[31m-    for (i = 0; cycle->modules[i]; i++) {[m
[31m-        if (cycle->modules[i]->exit_process) {[m
[31m-            cycle->modules[i]->exit_process(cycle);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_exiting) {[m
[31m-        c = cycle->connections;[m
[31m-        for (i = 0; i < cycle->connection_n; i++) {[m
[31m-            if (c[i].fd != (ngx_socket_t) -1[m
[31m-                && c[i].read[m
[31m-                && !c[i].read->accept[m
[31m-                && !c[i].read->channel[m
[31m-                && !c[i].read->resolver)[m
[31m-            {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,[m
[31m-                              "*%uA open socket #%d left in connection %ui",[m
[31m-                              c[i].number, c[i].fd, i);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(cycle->pool);[m
[31m-[m
[31m-    exit(0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_thread_value_t __stdcall[m
[31m-ngx_cache_manager_thread(void *data)[m
[31m-{[m
[31m-    u_long        ev;[m
[31m-    HANDLE        events[2];[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_cycle_t  *cycle;[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    events[0] = ngx_cache_manager_event;[m
[31m-    events[1] = ngx_cache_manager_mutex;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        ev = WaitForMultipleObjects(2, events, 0, INFINITE);[m
[31m-[m
[31m-        err = ngx_errno;[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,[m
[31m-                       "cache manager WaitForMultipleObjects: %ul", ev);[m
[31m-[m
[31m-        if (ev == WAIT_FAILED) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,[m
[31m-                          "WaitForMultipleObjects() failed");[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * ev == WAIT_OBJECT_0[m
[31m-         * ev == WAIT_OBJECT_0 + 1[m
[31m-         * ev == WAIT_ABANDONED_0 + 1[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit || ngx_exiting) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit || ngx_exiting) {[m
[31m-            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_cache_manager_process_handler();[m
[31m-    }[m
[31m-[m
[31m-    if (ReleaseMutex(ngx_cache_manager_mutex) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "ReleaseMutex() failed");[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_cache_manager_process_handler(void)[m
[31m-{[m
[31m-    u_long        ev;[m
[31m-    time_t        next, n;[m
[31m-    ngx_uint_t    i;[m
[31m-    ngx_path_t  **path;[m
[31m-[m
[31m-    next = 60 * 60;[m
[31m-[m
[31m-    path = ngx_cycle->paths.elts;[m
[31m-    for (i = 0; i < ngx_cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (path[i]->manager) {[m
[31m-            n = path[i]->manager(path[i]->data);[m
[31m-[m
[31m-            next = (n <= next) ? n : next;[m
[31m-[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (next == 0) {[m
[31m-        next = 1;[m
[31m-    }[m
[31m-[m
[31m-    ev = WaitForSingleObject(ngx_cache_manager_event, (u_long) next * 1000);[m
[31m-[m
[31m-    if (ev != WAIT_TIMEOUT) {[m
[31m-[m
[31m-        ngx_time_update();[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,[m
[31m-                       "cache manager WaitForSingleObject: %ul", ev);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_thread_value_t __stdcall[m
[31m-ngx_cache_loader_thread(void *data)[m
[31m-{[m
[31m-    ngx_uint_t     i;[m
[31m-    ngx_path_t   **path;[m
[31m-    ngx_cycle_t   *cycle;[m
[31m-[m
[31m-    ngx_msleep(60000);[m
[31m-[m
[31m-    cycle = (ngx_cycle_t *) ngx_cycle;[m
[31m-[m
[31m-    path = cycle->paths.elts;[m
[31m-    for (i = 0; i < cycle->paths.nelts; i++) {[m
[31m-[m
[31m-        if (ngx_terminate || ngx_quit || ngx_exiting) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (path[i]->loader) {[m
[31m-            path[i]->loader(path[i]->data);[m
[31m-            ngx_time_update();[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_single_process_cycle(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    ngx_tid_t  tid;[m
[31m-[m
[31m-    ngx_console_init(cycle);[m
[31m-[m
[31m-    if (ngx_create_signal_events(cycle) != NGX_OK) {[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_create_thread(&tid, ngx_worker_thread, NULL, cycle->log) != 0) {[m
[31m-        /* fatal */[m
[31m-        exit(2);[m
[31m-    }[m
[31m-[m
[31m-    /* STUB */[m
[31m-    WaitForSingleObject(ngx_stop_event, INFINITE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid)[m
[31m-{[m
[31m-    HANDLE     ev;[m
[31m-    ngx_int_t  rc;[m
[31m-    char       evn[NGX_PROCESS_SYNC_NAME];[m
[31m-[m
[31m-    ngx_sprintf((u_char *) evn, "Global\\ngx_%s_%P%Z", sig, pid);[m
[31m-[m
[31m-    ev = OpenEvent(EVENT_MODIFY_STATE, 0, evn);[m
[31m-    if (ev == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno,[m
[31m-                      "OpenEvent(\"%s\") failed", evn);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (SetEvent(ev) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,[m
[31m-                      "SetEvent(\"%s\") failed", evn);[m
[31m-        rc = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        rc = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_handle(ev);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_close_handle(HANDLE h)[m
[31m-{[m
[31m-    if (CloseHandle(h) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno,[m
[31m-                      "CloseHandle(%p) failed", h);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process_cycle.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process_cycle.h[m
[1mdeleted file mode 100644[m
[1mindex 95d2743..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_process_cycle.h[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_[m
[31m-#define _NGX_PROCESS_CYCLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_PROCESS_SINGLE     0[m
[31m-#define NGX_PROCESS_MASTER     1[m
[31m-#define NGX_PROCESS_SIGNALLER  2[m
[31m-#define NGX_PROCESS_WORKER     3[m
[31m-[m
[31m-[m
[31m-void ngx_master_process_cycle(ngx_cycle_t *cycle);[m
[31m-void ngx_single_process_cycle(ngx_cycle_t *cycle);[m
[31m-void ngx_close_handle(HANDLE h);[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t      ngx_process;[m
[31m-extern ngx_uint_t      ngx_worker;[m
[31m-extern ngx_pid_t       ngx_pid;[m
[31m-extern ngx_uint_t      ngx_exiting;[m
[31m-[m
[31m-extern sig_atomic_t    ngx_quit;[m
[31m-extern sig_atomic_t    ngx_terminate;[m
[31m-extern sig_atomic_t    ngx_reopen;[m
[31m-[m
[31m-extern ngx_uint_t      ngx_inherited;[m
[31m-extern ngx_pid_t       ngx_new_binary;[m
[31m-[m
[31m-[m
[31m-extern HANDLE          ngx_master_process_event;[m
[31m-extern char            ngx_master_process_event_name[];[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_service.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_service.c[m
[1mdeleted file mode 100644[m
[1mindex 835d9cf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_service.c[m
[1m+++ /dev/null[m
[36m@@ -1,134 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-[m
[31m-#define NGX_SERVICE_CONTROL_SHUTDOWN   128[m
[31m-#define NGX_SERVICE_CONTROL_REOPEN     129[m
[31m-[m
[31m-[m
[31m-SERVICE_TABLE_ENTRY st[] = {[m
[31m-    { "nginx", service_main },[m
[31m-    { NULL, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_service(ngx_log_t *log)[m
[31m-{[m
[31m-    /* primary thread */[m
[31m-[m
[31m-    /* StartServiceCtrlDispatcher() should be called within 30 seconds */[m
[31m-[m
[31m-    if (StartServiceCtrlDispatcher(st) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "StartServiceCtrlDispatcher() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-service_main(u_int argc, char **argv)[m
[31m-{[m
[31m-    SERVICE_STATUS         status;[m
[31m-    SERVICE_STATUS_HANDLE  service;[m
[31m-[m
[31m-    /* thread spawned by SCM */[m
[31m-[m
[31m-    service = RegisterServiceCtrlHandlerEx("nginx", service_handler, ctx);[m
[31m-    if (service == INVALID_HANDLE_VALUE) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "RegisterServiceCtrlHandlerEx() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;[m
[31m-    status.dwCurrentState = SERVICE_START_PENDING;[m
[31m-    status.dwControlsAccepted = SERVICE_ACCEPT_STOP[m
[31m-                                |SERVICE_ACCEPT_PARAMCHANGE;[m
[31m-    status.dwWin32ExitCode = NO_ERROR;[m
[31m-    status.dwServiceSpecificExitCode = 0;[m
[31m-    status.dwCheckPoint = 1;[m
[31m-    status.dwWaitHint = 2000;[m
[31m-[m
[31m-    /* SetServiceStatus() should be called within 80 seconds */[m
[31m-[m
[31m-    if (SetServiceStatus(service, &status) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "SetServiceStatus() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* init */[m
[31m-[m
[31m-    status.dwCurrentState = SERVICE_RUNNING;[m
[31m-    status.dwCheckPoint = 0;[m
[31m-    status.dwWaitHint = 0;[m
[31m-[m
[31m-    if (SetServiceStatus(service, &status) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                      "SetServiceStatus() failed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* call master or worker loop */[m
[31m-[m
[31m-    /*[m
[31m-     * master should use event notification and look status[m
[31m-     * single should use iocp to get notifications from service handler[m
[31m-     */[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_int[m
[31m-service_handler(u_int control, u_int type, void *data, void *ctx)[m
[31m-{[m
[31m-    /* primary thread */[m
[31m-[m
[31m-    switch (control) {[m
[31m-[m
[31m-    case SERVICE_CONTROL_INTERROGATE:[m
[31m-        status = NGX_IOCP_INTERROGATE;[m
[31m-        break;[m
[31m-[m
[31m-    case SERVICE_CONTROL_STOP:[m
[31m-        status = NGX_IOCP_STOP;[m
[31m-        break;[m
[31m-[m
[31m-    case SERVICE_CONTROL_PARAMCHANGE:[m
[31m-        status = NGX_IOCP_RECONFIGURE;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_SERVICE_CONTROL_SHUTDOWN:[m
[31m-        status = NGX_IOCP_REOPEN;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_SERVICE_CONTROL_REOPEN:[m
[31m-        status = NGX_IOCP_REOPEN;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return ERROR_CALL_NOT_IMPLEMENTED;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_single) {[m
[31m-        if (PostQueuedCompletionStatus(iocp, ... status, ...) == 0) {[m
[31m-            err = ngx_errno;[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, err,[m
[31m-                          "PostQueuedCompletionStatus() failed");[m
[31m-            return err;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        Event[m
[31m-    }[m
[31m-[m
[31m-    return NO_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_shmem.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_shmem.c[m
[1mdeleted file mode 100644[m
[1mindex c3ed699..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_shmem.c[m
[1m+++ /dev/null[m
[36m@@ -1,161 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Base addresses selected by system for shared memory mappings are likely[m
[31m- * to be different on Windows Vista and later versions due to address space[m
[31m- * layout randomization.  This is however incompatible with storing absolute[m
[31m- * addresses within the shared memory.[m
[31m- *[m
[31m- * To make it possible to store absolute addresses we create mappings[m
[31m- * at the same address in all processes by starting mappings at predefined[m
[31m- * addresses.  The addresses were selected somewhat randomly in order to[m
[31m- * minimize the probability that some other library doing something similar[m
[31m- * conflicts with us.  The addresses are from the following typically free[m
[31m- * blocks:[m
[31m- *[m
[31m- * - 0x10000000 .. 0x70000000 (about 1.5 GB in total) on 32-bit platforms[m
[31m- * - 0x000000007fff0000 .. 0x000007f68e8b0000 (about 8 TB) on 64-bit platforms[m
[31m- *[m
[31m- * Additionally, we allow to change the mapping address once it was detected[m
[31m- * to be different from one originally used.  This is needed to support[m
[31m- * reconfiguration.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifdef _WIN64[m
[31m-#define NGX_SHMEM_BASE  0x0000047047e00000[m
[31m-#else[m
[31m-#define NGX_SHMEM_BASE  0x2efe0000[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_allocation_granularity;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_alloc(ngx_shm_t *shm)[m
[31m-{[m
[31m-    u_char         *name;[m
[31m-    uint64_t        size;[m
[31m-    static u_char  *base = (u_char *) NGX_SHMEM_BASE;[m
[31m-[m
[31m-    name = ngx_alloc(shm->name.len + 2 + NGX_INT32_LEN, shm->log);[m
[31m-    if (name == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_sprintf(name, "%V_%s%Z", &shm->name, ngx_unique);[m
[31m-[m
[31m-    ngx_set_errno(0);[m
[31m-[m
[31m-    size = shm->size;[m
[31m-[m
[31m-    shm->handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,[m
[31m-                                    (u_long) (size >> 32),[m
[31m-                                    (u_long) (size & 0xffffffff),[m
[31m-                                    (char *) name);[m
[31m-[m
[31m-    if (shm->handle == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "CreateFileMapping(%uz, %s) failed",[m
[31m-                      shm->size, name);[m
[31m-        ngx_free(name);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_free(name);[m
[31m-[m
[31m-    if (ngx_errno == ERROR_ALREADY_EXISTS) {[m
[31m-        shm->exists = 1;[m
[31m-    }[m
[31m-[m
[31m-    shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, base);[m
[31m-[m
[31m-    if (shm->addr != NULL) {[m
[31m-        base += ngx_align(size, ngx_allocation_granularity);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_CORE, shm->log, ngx_errno,[m
[31m-                   "MapViewOfFileEx(%uz, %p) of file mapping \"%V\" failed, "[m
[31m-                   "retry without a base address",[m
[31m-                   shm->size, base, &shm->name);[m
[31m-[m
[31m-    /*[m
[31m-     * Order of shared memory zones may be different in the master process[m
[31m-     * and worker processes after reconfiguration.  As a result, the above[m
[31m-     * may fail due to a conflict with a previously created mapping remapped[m
[31m-     * to a different address.  Additionally, there may be a conflict with[m
[31m-     * some other uses of the memory.  In this case we retry without a base[m
[31m-     * address to let the system assign the address itself.[m
[31m-     */[m
[31m-[m
[31m-    shm->addr = MapViewOfFile(shm->handle, FILE_MAP_WRITE, 0, 0, 0);[m
[31m-[m
[31m-    if (shm->addr != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                  "MapViewOfFile(%uz) of file mapping \"%V\" failed",[m
[31m-                  shm->size, &shm->name);[m
[31m-[m
[31m-    if (CloseHandle(shm->handle) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "CloseHandle() of file mapping \"%V\" failed",[m
[31m-                      &shm->name);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_shm_remap(ngx_shm_t *shm, u_char *addr)[m
[31m-{[m
[31m-    if (UnmapViewOfFile(shm->addr) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "UnmapViewOfFile(%p) of file mapping \"%V\" failed",[m
[31m-                      shm->addr, &shm->name);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, addr);[m
[31m-[m
[31m-    if (shm->addr != NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                  "MapViewOfFileEx(%uz, %p) of file mapping \"%V\" failed",[m
[31m-                  shm->size, addr, &shm->name);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_shm_free(ngx_shm_t *shm)[m
[31m-{[m
[31m-    if (UnmapViewOfFile(shm->addr) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "UnmapViewOfFile(%p) of file mapping \"%V\" failed",[m
[31m-                      shm->addr, &shm->name);[m
[31m-    }[m
[31m-[m
[31m-    if (CloseHandle(shm->handle) == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,[m
[31m-                      "CloseHandle() of file mapping \"%V\" failed",[m
[31m-                      &shm->name);[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_shmem.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_shmem.h[m
[1mdeleted file mode 100644[m
[1mindex ee47429..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_shmem.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SHMEM_H_INCLUDED_[m
[31m-#define _NGX_SHMEM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char      *addr;[m
[31m-    size_t       size;[m
[31m-    ngx_str_t    name;[m
[31m-    HANDLE       handle;[m
[31m-    ngx_log_t   *log;[m
[31m-    ngx_uint_t   exists;   /* unsigned  exists:1;  */[m
[31m-} ngx_shm_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);[m
[31m-ngx_int_t ngx_shm_remap(ngx_shm_t *shm, u_char *addr);[m
[31m-void ngx_shm_free(ngx_shm_t *shm);[m
[31m-[m
[31m-extern ngx_uint_t  ngx_allocation_granularity;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SHMEM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_socket.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_socket.c[m
[1mdeleted file mode 100644[m
[1mindex 05a39f4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_socket.c[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_nonblocking(ngx_socket_t s)[m
[31m-{[m
[31m-    unsigned long  nb = 1;[m
[31m-[m
[31m-    return ioctlsocket(s, FIONBIO, &nb);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_blocking(ngx_socket_t s)[m
[31m-{[m
[31m-    unsigned long  nb = 0;[m
[31m-[m
[31m-    return ioctlsocket(s, FIONBIO, &nb);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_tcp_push(ngx_socket_t s)[m
[31m-{[m
[31m-    return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_socket.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_socket.h[m
[1mdeleted file mode 100644[m
[1mindex a9e26c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_socket.h[m
[1m+++ /dev/null[m
[36m@@ -1,207 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_SOCKET_H_INCLUDED_[m
[31m-#define _NGX_SOCKET_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_WRITE_SHUTDOWN SD_SEND[m
[31m-[m
[31m-[m
[31m-typedef SOCKET  ngx_socket_t;[m
[31m-typedef int     socklen_t;[m
[31m-[m
[31m-[m
[31m-#define ngx_socket(af, type, proto)                                          \[m
[31m-    WSASocketW(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED)[m
[31m-[m
[31m-#define ngx_socket_n        "WSASocketW()"[m
[31m-[m
[31m-int ngx_nonblocking(ngx_socket_t s);[m
[31m-int ngx_blocking(ngx_socket_t s);[m
[31m-[m
[31m-#define ngx_nonblocking_n   "ioctlsocket(FIONBIO)"[m
[31m-#define ngx_blocking_n      "ioctlsocket(!FIONBIO)"[m
[31m-[m
[31m-#define ngx_shutdown_socket    shutdown[m
[31m-#define ngx_shutdown_socket_n  "shutdown()"[m
[31m-[m
[31m-#define ngx_close_socket    closesocket[m
[31m-#define ngx_close_socket_n  "closesocket()"[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_ACCEPTEX[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_ACCEPTEX)([m
[31m-    IN SOCKET sListenSocket,[m
[31m-    IN SOCKET sAcceptSocket,[m
[31m-    IN PVOID lpOutputBuffer,[m
[31m-    IN DWORD dwReceiveDataLength,[m
[31m-    IN DWORD dwLocalAddressLength,[m
[31m-    IN DWORD dwRemoteAddressLength,[m
[31m-    OUT LPDWORD lpdwBytesReceived,[m
[31m-    IN LPOVERLAPPED lpOverlapped[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_ACCEPTEX                                                       \[m
[31m-    {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_GETACCEPTEXSOCKADDRS[m
[31m-[m
[31m-typedef VOID (PASCAL FAR * LPFN_GETACCEPTEXSOCKADDRS)([m
[31m-    IN PVOID lpOutputBuffer,[m
[31m-    IN DWORD dwReceiveDataLength,[m
[31m-    IN DWORD dwLocalAddressLength,[m
[31m-    IN DWORD dwRemoteAddressLength,[m
[31m-    OUT struct sockaddr **LocalSockaddr,[m
[31m-    OUT LPINT LocalSockaddrLength,[m
[31m-    OUT struct sockaddr **RemoteSockaddr,[m
[31m-    OUT LPINT RemoteSockaddrLength[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_GETACCEPTEXSOCKADDRS                                           \[m
[31m-        {0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_TRANSMITFILE[m
[31m-[m
[31m-#ifndef TF_DISCONNECT[m
[31m-[m
[31m-#define TF_DISCONNECT           1[m
[31m-#define TF_REUSE_SOCKET         2[m
[31m-#define TF_WRITE_BEHIND         4[m
[31m-#define TF_USE_DEFAULT_WORKER   0[m
[31m-#define TF_USE_SYSTEM_THREAD    16[m
[31m-#define TF_USE_KERNEL_APC       32[m
[31m-[m
[31m-typedef struct _TRANSMIT_FILE_BUFFERS {[m
[31m-    LPVOID Head;[m
[31m-    DWORD HeadLength;[m
[31m-    LPVOID Tail;[m
[31m-    DWORD TailLength;[m
[31m-} TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, FAR *LPTRANSMIT_FILE_BUFFERS;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_TRANSMITFILE)([m
[31m-    IN SOCKET hSocket,[m
[31m-    IN HANDLE hFile,[m
[31m-    IN DWORD nNumberOfBytesToWrite,[m
[31m-    IN DWORD nNumberOfBytesPerSend,[m
[31m-    IN LPOVERLAPPED lpOverlapped,[m
[31m-    IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,[m
[31m-    IN DWORD dwReserved[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_TRANSMITFILE                                                   \[m
[31m-    {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_TRANSMITPACKETS[m
[31m-[m
[31m-/* OpenWatcom has a swapped TP_ELEMENT_FILE and TP_ELEMENT_MEMORY definition */[m
[31m-[m
[31m-#ifndef TP_ELEMENT_FILE[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(disable:4201) /* Nonstandard extension, nameless struct/union */[m
[31m-#endif[m
[31m-[m
[31m-typedef struct _TRANSMIT_PACKETS_ELEMENT {[m
[31m-    ULONG dwElFlags;[m
[31m-#define TP_ELEMENT_MEMORY   1[m
[31m-#define TP_ELEMENT_FILE     2[m
[31m-#define TP_ELEMENT_EOP      4[m
[31m-    ULONG cLength;[m
[31m-    union {[m
[31m-        struct {[m
[31m-            LARGE_INTEGER nFileOffset;[m
[31m-            HANDLE        hFile;[m
[31m-        };[m
[31m-        PVOID             pBuffer;[m
[31m-    };[m
[31m-} TRANSMIT_PACKETS_ELEMENT, *PTRANSMIT_PACKETS_ELEMENT,[m
[31m-    FAR *LPTRANSMIT_PACKETS_ELEMENT;[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(default:4201)[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_TRANSMITPACKETS) ([m
[31m-    SOCKET hSocket,[m
[31m-    TRANSMIT_PACKETS_ELEMENT *lpPacketArray,[m
[31m-    DWORD nElementCount,[m
[31m-    DWORD nSendSize,[m
[31m-    LPOVERLAPPED lpOverlapped,[m
[31m-    DWORD dwFlags[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_TRANSMITPACKETS                                                \[m
[31m-    {0xd9689da0,0x1f90,0x11d3,{0x99,0x71,0x00,0xc0,0x4f,0x68,0xc8,0x76}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_CONNECTEX[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_CONNECTEX) ([m
[31m-    IN SOCKET s,[m
[31m-    IN const struct sockaddr FAR *name,[m
[31m-    IN int namelen,[m
[31m-    IN PVOID lpSendBuffer OPTIONAL,[m
[31m-    IN DWORD dwSendDataLength,[m
[31m-    OUT LPDWORD lpdwBytesSent,[m
[31m-    IN LPOVERLAPPED lpOverlapped[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_CONNECTEX \[m
[31m-    {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef WSAID_DISCONNECTEX[m
[31m-[m
[31m-typedef BOOL (PASCAL FAR * LPFN_DISCONNECTEX) ([m
[31m-    IN SOCKET s,[m
[31m-    IN LPOVERLAPPED lpOverlapped,[m
[31m-    IN DWORD  dwFlags,[m
[31m-    IN DWORD  dwReserved[m
[31m-    );[m
[31m-[m
[31m-#define WSAID_DISCONNECTEX                                                   \[m
[31m-    {0x7fda2e11,0x8630,0x436f,{0xa0,0x31,0xf5,0x36,0xa6,0xee,0xc1,0x57}}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-extern LPFN_ACCEPTEX              ngx_acceptex;[m
[31m-extern LPFN_GETACCEPTEXSOCKADDRS  ngx_getacceptexsockaddrs;[m
[31m-extern LPFN_TRANSMITFILE          ngx_transmitfile;[m
[31m-extern LPFN_TRANSMITPACKETS       ngx_transmitpackets;[m
[31m-extern LPFN_CONNECTEX             ngx_connectex;[m
[31m-extern LPFN_DISCONNECTEX          ngx_disconnectex;[m
[31m-[m
[31m-[m
[31m-int ngx_tcp_push(ngx_socket_t s);[m
[31m-#define ngx_tcp_push_n            "tcp_push()"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_SOCKET_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_stat.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_stat.c[m
[1mdeleted file mode 100644[m
[1mindex 51bcd96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_stat.c[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-int ngx_file_type(char *file, ngx_file_info_t *sb)[m
[31m-{[m
[31m-    sb->dwFileAttributes = GetFileAttributes(file);[m
[31m-[m
[31m-    if (sb->dwFileAttributes == INVALID_FILE_ATTRIBUTES) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-int ngx_stat(char *file, ngx_stat_t *sb)[m
[31m-{[m
[31m-    *sb = GetFileAttributes(file);[m
[31m-[m
[31m-    if (*sb == INVALID_FILE_ATTRIBUTES) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-*/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_thread.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_thread.c[m
[1mdeleted file mode 100644[m
[1mindex a13de2d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_thread.c[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-ngx_err_t[m
[31m-ngx_create_thread(ngx_tid_t *tid,[m
[31m-    ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log)[m
[31m-{[m
[31m-    u_long     id;[m
[31m-    ngx_err_t  err;[m
[31m-[m
[31m-    *tid = CreateThread(NULL, 0, func, arg, 0, &id);[m
[31m-[m
[31m-    if (*tid != NULL) {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, 0,[m
[31m-                      "create thread " NGX_TID_T_FMT, id);[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_errno;[m
[31m-    ngx_log_error(NGX_LOG_ALERT, log, err, "CreateThread() failed");[m
[31m-    return err;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_thread.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_thread.h[m
[1mdeleted file mode 100644[m
[1mindex 4012276..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_thread.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_THREAD_H_INCLUDED_[m
[31m-#define _NGX_THREAD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef HANDLE  ngx_tid_t;[m
[31m-typedef DWORD   ngx_thread_value_t;[m
[31m-[m
[31m-[m
[31m-ngx_err_t ngx_create_thread(ngx_tid_t *tid,[m
[31m-    ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log);[m
[31m-[m
[31m-#define ngx_log_tid                 GetCurrentThreadId()[m
[31m-#define NGX_TID_T_FMT               "%ud"[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_THREAD_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_time.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_time.c[m
[1mdeleted file mode 100644[m
[1mindex bd6d287..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_time.c[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_gettimeofday(struct timeval *tp)[m
[31m-{[m
[31m-    uint64_t  intervals;[m
[31m-    FILETIME  ft;[m
[31m-[m
[31m-    GetSystemTimeAsFileTime(&ft);[m
[31m-[m
[31m-    /*[m
[31m-     * A file time is a 64-bit value that represents the number[m
[31m-     * of 100-nanosecond intervals that have elapsed since[m
[31m-     * January 1, 1601 12:00 A.M. UTC.[m
[31m-     *[m
[31m-     * Between January 1, 1970 (Epoch) and January 1, 1601 there were[m
[31m-     * 134744 days,[m
[31m-     * 11644473600 seconds or[m
[31m-     * 11644473600,000,000,0 100-nanosecond intervals.[m
[31m-     *[m
[31m-     * See also MSKB Q167296.[m
[31m-     */[m
[31m-[m
[31m-    intervals = ((uint64_t) ft.dwHighDateTime << 32) | ft.dwLowDateTime;[m
[31m-    intervals -= 116444736000000000;[m
[31m-[m
[31m-    tp->tv_sec = (long) (intervals / 10000000);[m
[31m-    tp->tv_usec = (long) ((intervals % 10000000) / 10);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_libc_localtime(time_t s, struct tm *tm)[m
[31m-{[m
[31m-    struct tm  *t;[m
[31m-[m
[31m-    t = localtime(&s);[m
[31m-    *tm = *t;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_libc_gmtime(time_t s, struct tm *tm)[m
[31m-{[m
[31m-    struct tm  *t;[m
[31m-[m
[31m-    t = gmtime(&s);[m
[31m-    *tm = *t;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_gettimezone(void)[m
[31m-{[m
[31m-    u_long                 n;[m
[31m-    TIME_ZONE_INFORMATION  tz;[m
[31m-[m
[31m-    n = GetTimeZoneInformation(&tz);[m
[31m-[m
[31m-    switch (n) {[m
[31m-[m
[31m-    case TIME_ZONE_ID_UNKNOWN:[m
[31m-        return -tz.Bias;[m
[31m-[m
[31m-    case TIME_ZONE_ID_STANDARD:[m
[31m-        return -(tz.Bias + tz.StandardBias);[m
[31m-[m
[31m-    case TIME_ZONE_ID_DAYLIGHT:[m
[31m-        return -(tz.Bias + tz.DaylightBias);[m
[31m-[m
[31m-    default: /* TIME_ZONE_ID_INVALID */[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_time.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_time.h[m
[1mdeleted file mode 100644[m
[1mindex 6c2f806..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_time.h[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_TIME_H_INCLUDED_[m
[31m-#define _NGX_TIME_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-typedef ngx_rbtree_key_t      ngx_msec_t;[m
[31m-typedef ngx_rbtree_key_int_t  ngx_msec_int_t;[m
[31m-[m
[31m-typedef SYSTEMTIME            ngx_tm_t;[m
[31m-typedef FILETIME              ngx_mtime_t;[m
[31m-[m
[31m-#define ngx_tm_sec            wSecond[m
[31m-#define ngx_tm_min            wMinute[m
[31m-#define ngx_tm_hour           wHour[m
[31m-#define ngx_tm_mday           wDay[m
[31m-#define ngx_tm_mon            wMonth[m
[31m-#define ngx_tm_year           wYear[m
[31m-#define ngx_tm_wday           wDayOfWeek[m
[31m-[m
[31m-#define ngx_tm_sec_t          u_short[m
[31m-#define ngx_tm_min_t          u_short[m
[31m-#define ngx_tm_hour_t         u_short[m
[31m-#define ngx_tm_mday_t         u_short[m
[31m-#define ngx_tm_mon_t          u_short[m
[31m-#define ngx_tm_year_t         u_short[m
[31m-#define ngx_tm_wday_t         u_short[m
[31m-[m
[31m-[m
[31m-#define ngx_msleep            Sleep[m
[31m-[m
[31m-#define NGX_HAVE_GETTIMEZONE  1[m
[31m-[m
[31m-#define  ngx_timezone_update()[m
[31m-[m
[31m-ngx_int_t ngx_gettimezone(void);[m
[31m-void ngx_libc_localtime(time_t s, struct tm *tm);[m
[31m-void ngx_libc_gmtime(time_t s, struct tm *tm);[m
[31m-void ngx_gettimeofday(struct timeval *tp);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_TIME_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_udp_wsarecv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_udp_wsarecv.c[m
[1mdeleted file mode 100644[m
[1mindex 5424375..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_udp_wsarecv.c[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    u_long        bytes, flags;[m
[31m-    WSABUF        wsabuf[1];[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    wsabuf[0].buf = (char *) buf;[m
[31m-    wsabuf[0].len = size;[m
[31m-    flags = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        rev->ready = 0;[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == WSAEWOULDBLOCK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        rev->error = 1;[m
[31m-        ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int               rc;[m
[31m-    u_long            bytes, flags;[m
[31m-    WSABUF            wsabuf[1];[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *rev;[m
[31m-    LPWSAOVERLAPPED   ovlp;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (!rev->ready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second wsa post");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "rev->complete: %d", rev->complete);[m
[31m-[m
[31m-    if (rev->complete) {[m
[31m-        rev->complete = 0;[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            if (rev->ovlp.error) {[m
[31m-                ngx_connection_error(c, rev->ovlp.error, "WSARecv() failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "WSARecv ovlp: fd:%d %ul of %z",[m
[31m-                           c->fd, rev->available, size);[m
[31m-[m
[31m-            return rev->available;[m
[31m-        }[m
[31m-[m
[31m-        if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp,[m
[31m-                                   &bytes, 0, NULL)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                               "WSARecv() or WSAGetOverlappedResult() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSARecv: fd:%d %ul of %z", c->fd, bytes, size);[m
[31m-[m
[31m-        return bytes;[m
[31m-    }[m
[31m-[m
[31m-    ovlp = (LPWSAOVERLAPPED) &rev->ovlp;[m
[31m-    ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));[m
[31m-    wsabuf[0].buf = (char *) buf;[m
[31m-    wsabuf[0].len = size;[m
[31m-    flags = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL);[m
[31m-[m
[31m-    rev->complete = 0;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv ovlp: fd:%d rc:%d %ul of %z",[m
[31m-                   c->fd, rc, bytes, size);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-        if (err == WSA_IO_PENDING) {[m
[31m-            rev->active = 1;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() posted");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        rev->error = 1;[m
[31m-        ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        /*[m
[31m-         * if a socket was bound with I/O completion port[m
[31m-         * then GetQueuedCompletionStatus() would anyway return its status[m
[31m-         * despite that WSARecv() was already complete[m
[31m-         */[m
[31m-[m
[31m-        rev->active = 1;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    rev->active = 0;[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_user.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_user.c[m
[1mdeleted file mode 100644[m
[1mindex ea6da5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_user.c[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if (NGX_CRYPT)[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted)[m
[31m-{[m
[31m-    /* STUB: a plain text password */[m
[31m-[m
[31m-    *encrypted = key;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_CRYPT */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_user.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_user.h[m
[1mdeleted file mode 100644[m
[1mindex 61408e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_user.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_USER_H_INCLUDED_[m
[31m-#define _NGX_USER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-/* STUB */[m
[31m-#define ngx_uid_t  ngx_int_t[m
[31m-#define ngx_gid_t  ngx_int_t[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt,[m
[31m-    u_char **encrypted);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_USER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_win32_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_win32_config.h[m
[1mdeleted file mode 100644[m
[1mindex f5b5950..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_win32_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,265 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_WIN32_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_WIN32_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#undef  WIN32[m
[31m-#define WIN32         0x0400[m
[31m-#define _WIN32_WINNT  0x0501[m
[31m-[m
[31m-[m
[31m-#define STRICT[m
[31m-#define WIN32_LEAN_AND_MEAN[m
[31m-[m
[31m-/* enable getenv() and gmtime() in msvc8 */[m
[31m-#define _CRT_SECURE_NO_WARNINGS[m
[31m-#define _CRT_SECURE_NO_DEPRECATE[m
[31m-[m
[31m-/* enable gethostbyname() in msvc2015 */[m
[31m-#if !(NGX_HAVE_INET6)[m
[31m-#define _WINSOCK_DEPRECATED_NO_WARNINGS[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m- * we need to include <windows.h> explicitly before <winsock2.h> because[m
[31m- * the warning 4201 is enabled in <windows.h>[m
[31m- */[m
[31m-#include <windows.h>[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(disable:4201)[m
[31m-#endif[m
[31m-[m
[31m-#include <winsock2.h>[m
[31m-#include <ws2tcpip.h>  /* ipv6 */[m
[31m-#include <mswsock.h>[m
[31m-#include <shellapi.h>[m
[31m-#include <stddef.h>    /* offsetof() */[m
[31m-[m
[31m-#ifdef __MINGW64_VERSION_MAJOR[m
[31m-[m
[31m-/* GCC MinGW-w64 supports _FILE_OFFSET_BITS */[m
[31m-#define _FILE_OFFSET_BITS 64[m
[31m-[m
[31m-#elif defined __GNUC__[m
[31m-[m
[31m-/* GCC MinGW's stdio.h includes sys/types.h */[m
[31m-#define _OFF_T_[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#include <stdio.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdarg.h>[m
[31m-#ifdef __MINGW64_VERSION_MAJOR[m
[31m-#include <stdint.h>[m
[31m-#endif[m
[31m-#include <ctype.h>[m
[31m-#include <locale.h>[m
[31m-[m
[31m-#ifdef __WATCOMC__[m
[31m-#define _TIME_T_DEFINED[m
[31m-typedef long  time_t;[m
[31m-/* OpenWatcom defines time_t as "unsigned long" */[m
[31m-#endif[m
[31m-[m
[31m-#include <time.h>      /* localtime(), strftime() */[m
[31m-[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-[m
[31m-/* the end of the precompiled headers */[m
[31m-#pragma hdrstop[m
[31m-[m
[31m-#pragma warning(default:4201)[m
[31m-[m
[31m-/* disable some "-W4" level warnings */[m
[31m-[m
[31m-/* 'type cast': from function pointer to data pointer */[m
[31m-#pragma warning(disable:4054)[m
[31m-[m
[31m-/* 'type cast': from data pointer to function pointer */[m
[31m-#pragma warning(disable:4055)[m
[31m-[m
[31m-/* unreferenced formal parameter */[m
[31m-#pragma warning(disable:4100)[m
[31m-[m
[31m-/* FD_SET() and FD_CLR(): conditional expression is constant */[m
[31m-#pragma warning(disable:4127)[m
[31m-[m
[31m-/* array is too small to include a terminating null character */[m
[31m-#pragma warning(disable:4295)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef __WATCOMC__[m
[31m-[m
[31m-/* symbol 'ngx_rbtree_min' has been defined, but not referenced */[m
[31m-#pragma disable_message(202)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef __BORLANDC__[m
[31m-[m
[31m-/* the end of the precompiled headers */[m
[31m-#pragma hdrstop[m
[31m-[m
[31m-/* functions containing (for|while|some if) are not expanded inline */[m
[31m-#pragma warn -8027[m
[31m-[m
[31m-/* unreferenced formal parameter */[m
[31m-#pragma warn -8057[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include <ngx_auto_config.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_inline          __inline[m
[31m-#define ngx_cdecl           __cdecl[m
[31m-[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-typedef unsigned __int32    uint32_t;[m
[31m-typedef __int32             int32_t;[m
[31m-typedef unsigned __int16    uint16_t;[m
[31m-#define ngx_libc_cdecl      __cdecl[m
[31m-[m
[31m-#elif defined __BORLANDC__[m
[31m-typedef unsigned __int32    uint32_t;[m
[31m-typedef __int32             int32_t;[m
[31m-typedef unsigned __int16    uint16_t;[m
[31m-#define ngx_libc_cdecl      __cdecl[m
[31m-[m
[31m-#else /* __WATCOMC__ */[m
[31m-typedef unsigned int        uint32_t;[m
[31m-typedef int                 int32_t;[m
[31m-typedef unsigned short int  uint16_t;[m
[31m-#define ngx_libc_cdecl[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef __int64             int64_t;[m
[31m-typedef unsigned __int64    uint64_t;[m
[31m-[m
[31m-#if !defined(__WATCOMC__) && !defined(__MINGW64_VERSION_MAJOR)[m
[31m-typedef int                 intptr_t;[m
[31m-typedef u_int               uintptr_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef __MINGW64_VERSION_MAJOR[m
[31m-[m
[31m-/* Windows defines off_t as long, which is 32-bit */[m
[31m-typedef __int64             off_t;[m
[31m-#define _OFF_T_DEFINED[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef __WATCOMC__[m
[31m-[m
[31m-/* off_t is redefined by sys/types.h used by zlib.h */[m
[31m-#define __TYPES_H_INCLUDED[m
[31m-typedef int                 dev_t;[m
[31m-typedef unsigned int        ino_t;[m
[31m-[m
[31m-#elif __BORLANDC__[m
[31m-[m
[31m-/* off_t is redefined by sys/types.h used by zlib.h */[m
[31m-#define __TYPES_H[m
[31m-[m
[31m-typedef int                 dev_t;[m
[31m-typedef unsigned int        ino_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef __MINGW64_VERSION_MAJOR[m
[31m-typedef int                 ssize_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef uint32_t            in_addr_t;[m
[31m-typedef u_short             in_port_t;[m
[31m-typedef int                 sig_atomic_t;[m
[31m-[m
[31m-[m
[31m-#ifdef _WIN64[m
[31m-[m
[31m-#define NGX_PTR_SIZE            8[m
[31m-#define NGX_SIZE_T_LEN          (sizeof("-9223372036854775808") - 1)[m
[31m-#define NGX_MAX_SIZE_T_VALUE    9223372036854775807[m
[31m-#define NGX_TIME_T_LEN          (sizeof("-9223372036854775808") - 1)[m
[31m-#define NGX_TIME_T_SIZE         8[m
[31m-#define NGX_MAX_TIME_T_VALUE    9223372036854775807[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define NGX_PTR_SIZE            4[m
[31m-#define NGX_SIZE_T_LEN          (sizeof("-2147483648") - 1)[m
[31m-#define NGX_MAX_SIZE_T_VALUE    2147483647[m
[31m-#define NGX_TIME_T_LEN          (sizeof("-2147483648") - 1)[m
[31m-#define NGX_TIME_T_SIZE         4[m
[31m-#define NGX_MAX_TIME_T_VALUE    2147483647[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_OFF_T_LEN           (sizeof("-9223372036854775807") - 1)[m
[31m-#define NGX_MAX_OFF_T_VALUE     9223372036854775807[m
[31m-#define NGX_SIG_ATOMIC_T_SIZE   4[m
[31m-[m
[31m-[m
[31m-#define NGX_HAVE_LITTLE_ENDIAN  1[m
[31m-#define NGX_HAVE_NONALIGNED     1[m
[31m-[m
[31m-[m
[31m-#define NGX_WIN_NT        200000[m
[31m-[m
[31m-[m
[31m-#define NGX_LISTEN_BACKLOG           511[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HAVE_INHERITED_NONBLOCK[m
[31m-#define NGX_HAVE_INHERITED_NONBLOCK  1[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_HAVE_CASELESS_FILESYSTEM[m
[31m-#define NGX_HAVE_CASELESS_FILESYSTEM  1[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_HAVE_WIN32_TRANSMITPACKETS[m
[31m-#define NGX_HAVE_WIN32_TRANSMITPACKETS  1[m
[31m-#define NGX_HAVE_WIN32_TRANSMITFILE     0[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_HAVE_WIN32_TRANSMITFILE[m
[31m-#define NGX_HAVE_WIN32_TRANSMITFILE  1[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_WIN32_TRANSMITPACKETS) || (NGX_HAVE_WIN32_TRANSMITFILE)[m
[31m-#define NGX_HAVE_SENDFILE  1[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NGX_HAVE_SO_SNDLOWAT[m
[31m-/* setsockopt(SO_SNDLOWAT) returns error WSAENOPROTOOPT */[m
[31m-#define NGX_HAVE_SO_SNDLOWAT         0[m
[31m-#endif[m
[31m-[m
[31m-#define NGX_HAVE_GETADDRINFO         1[m
[31m-[m
[31m-#define ngx_random               rand[m
[31m-#define ngx_debug_init()[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_WIN32_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_win32_init.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_win32_init.c[m
[1mdeleted file mode 100644[m
[1mindex 9b26db5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_win32_init.c[m
[1m+++ /dev/null[m
[36m@@ -1,293 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_win32_version;[m
[31m-ngx_uint_t  ngx_ncpu;[m
[31m-ngx_uint_t  ngx_max_wsabufs;[m
[31m-ngx_int_t   ngx_max_sockets;[m
[31m-ngx_uint_t  ngx_inherited_nonblocking = 1;[m
[31m-ngx_uint_t  ngx_tcp_nodelay_and_tcp_nopush;[m
[31m-[m
[31m-char        ngx_unique[NGX_INT32_LEN + 1];[m
[31m-[m
[31m-[m
[31m-ngx_os_io_t ngx_os_io = {[m
[31m-    ngx_wsarecv,[m
[31m-    ngx_wsarecv_chain,[m
[31m-    ngx_udp_wsarecv,[m
[31m-    ngx_wsasend,[m
[31m-    ngx_wsasend_chain,[m
[31m-    0[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    WORD  wServicePackMinor;[m
[31m-    WORD  wSuiteMask;[m
[31m-    BYTE  wProductType;[m
[31m-} ngx_osviex_stub_t;[m
[31m-[m
[31m-[m
[31m-static u_int               osviex;[m
[31m-static OSVERSIONINFOEX     osvi;[m
[31m-[m
[31m-/* Should these pointers be per protocol ? */[m
[31m-LPFN_ACCEPTEX              ngx_acceptex;[m
[31m-LPFN_GETACCEPTEXSOCKADDRS  ngx_getacceptexsockaddrs;[m
[31m-LPFN_TRANSMITFILE          ngx_transmitfile;[m
[31m-LPFN_TRANSMITPACKETS       ngx_transmitpackets;[m
[31m-LPFN_CONNECTEX             ngx_connectex;[m
[31m-LPFN_DISCONNECTEX          ngx_disconnectex;[m
[31m-[m
[31m-static GUID ax_guid = WSAID_ACCEPTEX;[m
[31m-static GUID as_guid = WSAID_GETACCEPTEXSOCKADDRS;[m
[31m-static GUID tf_guid = WSAID_TRANSMITFILE;[m
[31m-static GUID tp_guid = WSAID_TRANSMITPACKETS;[m
[31m-static GUID cx_guid = WSAID_CONNECTEX;[m
[31m-static GUID dx_guid = WSAID_DISCONNECTEX;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_os_init(ngx_log_t *log)[m
[31m-{[m
[31m-    DWORD        bytes;[m
[31m-    SOCKET       s;[m
[31m-    WSADATA      wsd;[m
[31m-    ngx_err_t    err;[m
[31m-    ngx_uint_t   n;[m
[31m-    SYSTEM_INFO  si;[m
[31m-[m
[31m-    /* get Windows version */[m
[31m-[m
[31m-    ngx_memzero(&osvi, sizeof(OSVERSIONINFOEX));[m
[31m-    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(disable:4996)[m
[31m-#endif[m
[31m-[m
[31m-    osviex = GetVersionEx((OSVERSIONINFO *) &osvi);[m
[31m-[m
[31m-    if (osviex == 0) {[m
[31m-        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);[m
[31m-        if (GetVersionEx((OSVERSIONINFO *) &osvi) == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          "GetVersionEx() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#ifdef _MSC_VER[m
[31m-#pragma warning(default:4996)[m
[31m-#endif[m
[31m-[m
[31m-    /*[m
[31m-     *  Windows 3.1 Win32s   0xxxxx[m
[31m-     *[m
[31m-     *  Windows 95           140000[m
[31m-     *  Windows 98           141000[m
[31m-     *  Windows ME           149000[m
[31m-     *  Windows NT 3.51      235100[m
[31m-     *  Windows NT 4.0       240000[m
[31m-     *  Windows NT 4.0 SP5   240050[m
[31m-     *  Windows 2000         250000[m
[31m-     *  Windows XP           250100[m
[31m-     *  Windows 2003         250200[m
[31m-     *  Windows Vista/2008   260000[m
[31m-     *[m
[31m-     *  Windows CE x.x       3xxxxx[m
[31m-     */[m
[31m-[m
[31m-    ngx_win32_version = osvi.dwPlatformId * 100000[m
[31m-                        + osvi.dwMajorVersion * 10000[m
[31m-                        + osvi.dwMinorVersion * 100;[m
[31m-[m
[31m-    if (osviex) {[m
[31m-        ngx_win32_version += osvi.wServicePackMajor * 10[m
[31m-                             + osvi.wServicePackMinor;[m
[31m-    }[m
[31m-[m
[31m-    GetSystemInfo(&si);[m
[31m-    ngx_pagesize = si.dwPageSize;[m
[31m-    ngx_allocation_granularity = si.dwAllocationGranularity;[m
[31m-    ngx_ncpu = si.dwNumberOfProcessors;[m
[31m-    ngx_cacheline_size = NGX_CPU_CACHE_LINE;[m
[31m-[m
[31m-    for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }[m
[31m-[m
[31m-    /* delete default "C" locale for _wcsicmp() */[m
[31m-    setlocale(LC_ALL, "");[m
[31m-[m
[31m-[m
[31m-    /* init Winsock */[m
[31m-[m
[31m-    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                      "WSAStartup() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_win32_version < NGX_WIN_NT) {[m
[31m-        ngx_max_wsabufs = 16;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* STUB: ngx_uint_t max */[m
[31m-    ngx_max_wsabufs = 1024 * 1024;[m
[31m-[m
[31m-    /*[m
[31m-     * get AcceptEx(), GetAcceptExSockAddrs(), TransmitFile(),[m
[31m-     * TransmitPackets(), ConnectEx(), and DisconnectEx() addresses[m
[31m-     */[m
[31m-[m
[31m-    s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP);[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &ax_guid, sizeof(GUID),[m
[31m-                 &ngx_acceptex, sizeof(LPFN_ACCEPTEX), &bytes, NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_ACCEPTEX) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &as_guid, sizeof(GUID),[m
[31m-                 &ngx_getacceptexsockaddrs, sizeof(LPFN_GETACCEPTEXSOCKADDRS),[m
[31m-                 &bytes, NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_GETACCEPTEXSOCKADDRS) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tf_guid, sizeof(GUID),[m
[31m-                 &ngx_transmitfile, sizeof(LPFN_TRANSMITFILE), &bytes,[m
[31m-                 NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_TRANSMITFILE) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tp_guid, sizeof(GUID),[m
[31m-                 &ngx_transmitpackets, sizeof(LPFN_TRANSMITPACKETS), &bytes,[m
[31m-                 NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_TRANSMITPACKETS) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &cx_guid, sizeof(GUID),[m
[31m-                 &ngx_connectex, sizeof(LPFN_CONNECTEX), &bytes,[m
[31m-                 NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_CONNECTEX) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &dx_guid, sizeof(GUID),[m
[31m-                 &ngx_disconnectex, sizeof(LPFN_DISCONNECTEX), &bytes,[m
[31m-                 NULL, NULL)[m
[31m-        == -1)[m
[31m-    {[m
[31m-        ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,[m
[31m-                      "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "[m
[31m-                               "WSAID_DISCONNECTEX) failed");[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_close_socket(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,[m
[31m-                      ngx_close_socket_n " failed");[m
[31m-    }[m
[31m-[m
[31m-    if (GetEnvironmentVariable("ngx_unique", ngx_unique, NGX_INT32_LEN + 1)[m
[31m-        != 0)[m
[31m-    {[m
[31m-        ngx_process = NGX_PROCESS_WORKER;[m
[31m-[m
[31m-    } else {[m
[31m-        err = ngx_errno;[m
[31m-[m
[31m-        if (err != ERROR_ENVVAR_NOT_FOUND) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, log, err,[m
[31m-                          "GetEnvironmentVariable(\"ngx_unique\") failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_sprintf((u_char *) ngx_unique, "%P%Z", ngx_pid);[m
[31m-    }[m
[31m-[m
[31m-    srand((ngx_pid << 16) ^ (unsigned) ngx_time());[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_os_status(ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_osviex_stub_t  *osviex_stub;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER_BUILD);[m
[31m-[m
[31m-    if (osviex) {[m
[31m-[m
[31m-        /*[m
[31m-         * the MSVC 6.0 SP2 defines wSuiteMask and wProductType[m
[31m-         * as WORD wReserved[2][m
[31m-         */[m
[31m-        osviex_stub = (ngx_osviex_stub_t *) &osvi.wServicePackMinor;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, log, 0,[m
[31m-                      "OS: %ud build:%ud, \"%s\", suite:%Xd, type:%ud",[m
[31m-                      ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion,[m
[31m-                      osviex_stub->wSuiteMask, osviex_stub->wProductType);[m
[31m-[m
[31m-    } else {[m
[31m-        if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {[m
[31m-[m
[31m-            /* Win9x build */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, log, 0,[m
[31m-                          "OS: %u build:%ud.%ud.%ud, \"%s\"",[m
[31m-                          ngx_win32_version,[m
[31m-                          osvi.dwBuildNumber >> 24,[m
[31m-                          (osvi.dwBuildNumber >> 16) & 0xff,[m
[31m-                          osvi.dwBuildNumber & 0xffff,[m
[31m-                          osvi.szCSDVersion);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            /*[m
[31m-             * VER_PLATFORM_WIN32_NT[m
[31m-             *[m
[31m-             * we do not currently support VER_PLATFORM_WIN32_CE[m
[31m-             * and we do not support VER_PLATFORM_WIN32s at all[m
[31m-             */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %ud build:%ud, \"%s\"",[m
[31m-                          ngx_win32_version, osvi.dwBuildNumber,[m
[31m-                          osvi.szCSDVersion);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsarecv.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsarecv.c[m
[1mdeleted file mode 100644[m
[1mindex 1925f0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsarecv.c[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    u_long        bytes, flags;[m
[31m-    WSABUF        wsabuf[1];[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_int_t     n;[m
[31m-    ngx_event_t  *rev;[m
[31m-[m
[31m-    wsabuf[0].buf = (char *) buf;[m
[31m-    wsabuf[0].len = size;[m
[31m-    flags = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        rev->ready = 0;[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == WSAEWOULDBLOCK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            rev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes < size) {[m
[31m-        rev->ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        rev->eof = 1;[m
[31m-    }[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int               rc;[m
[31m-    u_long            bytes, flags;[m
[31m-    WSABUF            wsabuf[1];[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_int_t         n;[m
[31m-    ngx_event_t      *rev;[m
[31m-    LPWSAOVERLAPPED   ovlp;[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (!rev->ready) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second wsa post");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "rev->complete: %d", rev->complete);[m
[31m-[m
[31m-    if (rev->complete) {[m
[31m-        rev->complete = 0;[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            if (rev->ovlp.error) {[m
[31m-                ngx_connection_error(c, rev->ovlp.error, "WSARecv() failed");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                           "WSARecv ovlp: fd:%d %ul of %z",[m
[31m-                           c->fd, rev->available, size);[m
[31m-[m
[31m-            return rev->available;[m
[31m-        }[m
[31m-[m
[31m-        if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp,[m
[31m-                                   &bytes, 0, NULL)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                               "WSARecv() or WSAGetOverlappedResult() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSARecv: fd:%d %ul of %z", c->fd, bytes, size);[m
[31m-[m
[31m-        return bytes;[m
[31m-    }[m
[31m-[m
[31m-    ovlp = (LPWSAOVERLAPPED) &rev->ovlp;[m
[31m-    ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));[m
[31m-    wsabuf[0].buf = (char *) buf;[m
[31m-    wsabuf[0].len = size;[m
[31m-    flags = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL);[m
[31m-[m
[31m-    rev->complete = 0;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv ovlp: fd:%d rc:%d %ul of %z",[m
[31m-                   c->fd, rc, bytes, size);[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        err = ngx_socket_errno;[m
[31m-        if (err == WSA_IO_PENDING) {[m
[31m-            rev->active = 1;[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() posted");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            rev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        /*[m
[31m-         * if a socket was bound with I/O completion port[m
[31m-         * then GetQueuedCompletionStatus() would anyway return its status[m
[31m-         * despite that WSARecv() was already complete[m
[31m-         */[m
[31m-[m
[31m-        rev->active = 1;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        rev->eof = 1;[m
[31m-        rev->ready = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        rev->ready = 1;[m
[31m-    }[m
[31m-[m
[31m-    rev->active = 0;[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsarecv_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsarecv_chain.c[m
[1mdeleted file mode 100644[m
[1mindex 2598e09..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsarecv_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,106 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_WSABUFS  8[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    u_char       *prev;[m
[31m-    u_long        bytes, flags;[m
[31m-    size_t        n, size;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_array_t   vec;[m
[31m-    ngx_event_t  *rev;[m
[31m-    LPWSABUF      wsabuf;[m
[31m-    WSABUF        wsabufs[NGX_WSABUFS];[m
[31m-[m
[31m-    prev = NULL;[m
[31m-    wsabuf = NULL;[m
[31m-    flags = 0;[m
[31m-    size = 0;[m
[31m-    bytes = 0;[m
[31m-[m
[31m-    vec.elts = wsabufs;[m
[31m-    vec.nelts = 0;[m
[31m-    vec.size = sizeof(WSABUF);[m
[31m-    vec.nalloc = NGX_WSABUFS;[m
[31m-    vec.pool = c->pool;[m
[31m-[m
[31m-    /* coalesce the neighbouring bufs */[m
[31m-[m
[31m-    while (chain) {[m
[31m-        n = chain->buf->end - chain->buf->last;[m
[31m-[m
[31m-        if (limit) {[m
[31m-            if (size >= (size_t) limit) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (size + n > (size_t) limit) {[m
[31m-                n = (size_t) limit - size;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (prev == chain->buf->last) {[m
[31m-            wsabuf->len += n;[m
[31m-[m
[31m-        } else {[m
[31m-            wsabuf = ngx_array_push(&vec);[m
[31m-            if (wsabuf == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            wsabuf->buf = (char *) chain->buf->last;[m
[31m-            wsabuf->len = n;[m
[31m-        }[m
[31m-[m
[31m-        size += n;[m
[31m-        prev = chain->buf->end;[m
[31m-        chain = chain->next;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSARecv: %d:%d", vec.nelts, wsabuf->len);[m
[31m-[m
[31m-[m
[31m-    rc = WSARecv(c->fd, vec.elts, vec.nelts, &bytes, &flags, NULL, NULL);[m
[31m-[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        rev->ready = 0;[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == WSAEWOULDBLOCK) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSARecv() not ready");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        rev->error = 1;[m
[31m-        ngx_connection_error(c, err, "WSARecv() failed");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes < size) {[m
[31m-        rev->ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        rev->eof = 1;[m
[31m-    }[m
[31m-[m
[31m-    return bytes;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsasend.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsasend.c[m
[1mdeleted file mode 100644[m
[1mindex d6a23d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsasend.c[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_wsasend(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int           n;[m
[31m-    u_long        sent;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *wev;[m
[31m-    WSABUF        wsabuf;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * WSABUF must be 4-byte aligned otherwise[m
[31m-     * WSASend() will return undocumented WSAEINVAL error.[m
[31m-     */[m
[31m-[m
[31m-    wsabuf.buf = (char *) buf;[m
[31m-    wsabuf.len = size;[m
[31m-[m
[31m-    sent = 0;[m
[31m-[m
[31m-    n = WSASend(c->fd, &wsabuf, 1, &sent, 0, NULL, NULL);[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        if (sent < size) {[m
[31m-            wev->ready = 0;[m
[31m-        }[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        return sent;[m
[31m-    }[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    if (err == WSAEWOULDBLOCK) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, "WSASend() not ready");[m
[31m-        wev->ready = 0;[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    wev->error = 1;[m
[31m-    ngx_connection_error(c, err, "WSASend() failed");[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ssize_t[m
[31m-ngx_overlapped_wsasend(ngx_connection_t *c, u_char *buf, size_t size)[m
[31m-{[m
[31m-    int               n;[m
[31m-    u_long            sent;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *wev;[m
[31m-    LPWSAOVERLAPPED   ovlp;[m
[31m-    WSABUF            wsabuf;[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "wev->complete: %d", wev->complete);[m
[31m-[m
[31m-    if (!wev->complete) {[m
[31m-[m
[31m-        /* post the overlapped WSASend() */[m
[31m-[m
[31m-        /*[m
[31m-         * WSABUFs must be 4-byte aligned otherwise[m
[31m-         * WSASend() will return undocumented WSAEINVAL error.[m
[31m-         */[m
[31m-[m
[31m-        wsabuf.buf = (char *) buf;[m
[31m-        wsabuf.len = size;[m
[31m-[m
[31m-        sent = 0;[m
[31m-[m
[31m-        ovlp = (LPWSAOVERLAPPED) &c->write->ovlp;[m
[31m-        ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));[m
[31m-[m
[31m-        n = WSASend(c->fd, &wsabuf, 1, &sent, 0, ovlp, NULL);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size);[m
[31m-[m
[31m-        wev->complete = 0;[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-                /*[m
[31m-                 * if a socket was bound with I/O completion port then[m
[31m-                 * GetQueuedCompletionStatus() would anyway return its status[m
[31m-                 * despite that WSASend() was already complete[m
[31m-                 */[m
[31m-[m
[31m-                wev->active = 1;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            if (sent < size) {[m
[31m-                wev->ready = 0;[m
[31m-            }[m
[31m-[m
[31m-            c->sent += sent;[m
[31m-[m
[31m-            return sent;[m
[31m-        }[m
[31m-[m
[31m-        err = ngx_socket_errno;[m
[31m-[m
[31m-        if (err == WSA_IO_PENDING) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                           "WSASend() posted");[m
[31m-            wev->active = 1;[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-[m
[31m-        wev->error = 1;[m
[31m-        ngx_connection_error(c, err, "WSASend() failed");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* the overlapped WSASend() complete */[m
[31m-[m
[31m-    wev->complete = 0;[m
[31m-    wev->active = 0;[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-        if (wev->ovlp.error) {[m
[31m-            ngx_connection_error(c, wev->ovlp.error, "WSASend() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sent = wev->available;[m
[31m-[m
[31m-    } else {[m
[31m-        if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &wev->ovlp,[m
[31m-                                   &sent, 0, NULL)[m
[31m-            == 0)[m
[31m-        {[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                           "WSASend() or WSAGetOverlappedResult() failed");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSAGetOverlappedResult: fd:%d, %ul of %uz",[m
[31m-                   c->fd, sent, size);[m
[31m-[m
[31m-    if (sent < size) {[m
[31m-        wev->ready = 0;[m
[31m-    }[m
[31m-[m
[31m-    c->sent += sent;[m
[31m-[m
[31m-    return sent;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsasend_chain.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsasend_chain.c[m
[1mdeleted file mode 100644[m
[1mindex e2dde22..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/os/win32/ngx_wsasend_chain.c[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_WSABUFS  8[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int           rc;[m
[31m-    u_char       *prev;[m
[31m-    u_long        size, sent, send, prev_send;[m
[31m-    ngx_err_t     err;[m
[31m-    ngx_event_t  *wev;[m
[31m-    ngx_array_t   vec;[m
[31m-    ngx_chain_t  *cl;[m
[31m-    LPWSABUF      wsabuf;[m
[31m-    WSABUF        wsabufs[NGX_WSABUFS];[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-    /* the maximum limit size is the maximum u_long value - the page size */[m
[31m-[m
[31m-    if (limit == 0 || limit > (off_t) (NGX_MAX_UINT32_VALUE - ngx_pagesize)) {[m
[31m-        limit = NGX_MAX_UINT32_VALUE - ngx_pagesize;[m
[31m-    }[m
[31m-[m
[31m-    send = 0;[m
[31m-[m
[31m-    /*[m
[31m-     * WSABUFs must be 4-byte aligned otherwise[m
[31m-     * WSASend() will return undocumented WSAEINVAL error.[m
[31m-     */[m
[31m-[m
[31m-    vec.elts = wsabufs;[m
[31m-    vec.size = sizeof(WSABUF);[m
[31m-    vec.nalloc = NGX_WSABUFS;[m
[31m-    vec.pool = c->pool;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        prev = NULL;[m
[31m-        wsabuf = NULL;[m
[31m-        prev_send = send;[m
[31m-[m
[31m-        vec.nelts = 0;[m
[31m-[m
[31m-        /* create the WSABUF and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        for (cl = in;[m
[31m-             cl && vec.nelts < ngx_max_wsabufs && send < limit;[m
[31m-             cl = cl->next)[m
[31m-        {[m
[31m-            if (ngx_buf_special(cl->buf)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            if (send + size > limit) {[m
[31m-                size = (u_long) (limit - send);[m
[31m-            }[m
[31m-[m
[31m-            if (prev == cl->buf->pos) {[m
[31m-                wsabuf->len += cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            } else {[m
[31m-                wsabuf = ngx_array_push(&vec);[m
[31m-                if (wsabuf == NULL) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                wsabuf->buf = (char *) cl->buf->pos;[m
[31m-                wsabuf->len = cl->buf->last - cl->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            prev = cl->buf->last;[m
[31m-            send += size;[m
[31m-        }[m
[31m-[m
[31m-        sent = 0;[m
[31m-[m
[31m-        rc = WSASend(c->fd, vec.elts, vec.nelts, &sent, 0, NULL, NULL);[m
[31m-[m
[31m-        if (rc == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == WSAEWOULDBLOCK) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                               "WSASend() not ready");[m
[31m-[m
[31m-            } else {[m
[31m-                wev->error = 1;[m
[31m-                ngx_connection_error(c, err, "WSASend() failed");[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSASend: fd:%d, s:%ul", c->fd, sent);[m
[31m-[m
[31m-        c->sent += sent;[m
[31m-[m
[31m-        in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-        if (send - prev_send != sent) {[m
[31m-            wev->ready = 0;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        if (send >= limit || in == NULL) {[m
[31m-            return in;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)[m
[31m-{[m
[31m-    int               rc;[m
[31m-    u_char           *prev;[m
[31m-    u_long            size, send, sent;[m
[31m-    ngx_err_t         err;[m
[31m-    ngx_event_t      *wev;[m
[31m-    ngx_array_t       vec;[m
[31m-    ngx_chain_t      *cl;[m
[31m-    LPWSAOVERLAPPED   ovlp;[m
[31m-    LPWSABUF          wsabuf;[m
[31m-    WSABUF            wsabufs[NGX_WSABUFS];[m
[31m-[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    if (!wev->ready) {[m
[31m-        return in;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "wev->complete: %d", wev->complete);[m
[31m-[m
[31m-    if (!wev->complete) {[m
[31m-[m
[31m-        /* post the overlapped WSASend() */[m
[31m-[m
[31m-        /* the maximum limit size is the maximum u_long value - the page size */[m
[31m-[m
[31m-        if (limit == 0 || limit > (off_t) (NGX_MAX_UINT32_VALUE - ngx_pagesize))[m
[31m-        {[m
[31m-            limit = NGX_MAX_UINT32_VALUE - ngx_pagesize;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * WSABUFs must be 4-byte aligned otherwise[m
[31m-         * WSASend() will return undocumented WSAEINVAL error.[m
[31m-         */[m
[31m-[m
[31m-        vec.elts = wsabufs;[m
[31m-        vec.nelts = 0;[m
[31m-        vec.size = sizeof(WSABUF);[m
[31m-        vec.nalloc = NGX_WSABUFS;[m
[31m-        vec.pool = c->pool;[m
[31m-[m
[31m-        send = 0;[m
[31m-        prev = NULL;[m
[31m-        wsabuf = NULL;[m
[31m-[m
[31m-        /* create the WSABUF and coalesce the neighbouring bufs */[m
[31m-[m
[31m-        for (cl = in;[m
[31m-             cl && vec.nelts < ngx_max_wsabufs && send < limit;[m
[31m-             cl = cl->next)[m
[31m-        {[m
[31m-            if (ngx_buf_special(cl->buf)) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            size = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            if (send + size > limit) {[m
[31m-                size = (u_long) (limit - send);[m
[31m-            }[m
[31m-[m
[31m-            if (prev == cl->buf->pos) {[m
[31m-                wsabuf->len += cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-            } else {[m
[31m-                wsabuf = ngx_array_push(&vec);[m
[31m-                if (wsabuf == NULL) {[m
[31m-                    return NGX_CHAIN_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                wsabuf->buf = (char *) cl->buf->pos;[m
[31m-                wsabuf->len = cl->buf->last - cl->buf->pos;[m
[31m-            }[m
[31m-[m
[31m-            prev = cl->buf->last;[m
[31m-            send += size;[m
[31m-        }[m
[31m-[m
[31m-        ovlp = (LPWSAOVERLAPPED) &c->write->ovlp;[m
[31m-        ngx_memzero(ovlp, sizeof(WSAOVERLAPPED));[m
[31m-[m
[31m-        rc = WSASend(c->fd, vec.elts, vec.nelts, &sent, 0, ovlp, NULL);[m
[31m-[m
[31m-        wev->complete = 0;[m
[31m-[m
[31m-        if (rc == -1) {[m
[31m-            err = ngx_errno;[m
[31m-[m
[31m-            if (err == WSA_IO_PENDING) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,[m
[31m-                               "WSASend() posted");[m
[31m-                wev->active = 1;[m
[31m-                return in;[m
[31m-[m
[31m-            } else {[m
[31m-                wev->error = 1;[m
[31m-                ngx_connection_error(c, err, "WSASend() failed");[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-        } else if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-[m
[31m-            /*[m
[31m-             * if a socket was bound with I/O completion port then[m
[31m-             * GetQueuedCompletionStatus() would anyway return its status[m
[31m-             * despite that WSASend() was already complete[m
[31m-             */[m
[31m-[m
[31m-            wev->active = 1;[m
[31m-            return in;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                       "WSASend: fd:%d, s:%ul", c->fd, sent);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* the overlapped WSASend() complete */[m
[31m-[m
[31m-        wev->complete = 0;[m
[31m-        wev->active = 0;[m
[31m-[m
[31m-        if (ngx_event_flags & NGX_USE_IOCP_EVENT) {[m
[31m-            if (wev->ovlp.error) {[m
[31m-                ngx_connection_error(c, wev->ovlp.error, "WSASend() failed");[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sent = wev->available;[m
[31m-[m
[31m-        } else {[m
[31m-            if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &wev->ovlp,[m
[31m-                                       &sent, 0, NULL)[m
[31m-                == 0)[m
[31m-            {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                               "WSASend() or WSAGetOverlappedResult() failed");[m
[31m-[m
[31m-                return NGX_CHAIN_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,[m
[31m-                   "WSASend ovlp: fd:%d, s:%ul", c->fd, sent);[m
[31m-[m
[31m-    c->sent += sent;[m
[31m-[m
[31m-    in = ngx_chain_update_sent(in, sent);[m
[31m-[m
[31m-    if (in) {[m
[31m-        wev->ready = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        wev->ready = 1;[m
[31m-    }[m
[31m-[m
[31m-    return in;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream.c[m
[1mdeleted file mode 100644[m
[1mindex 3bd8f6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream.c[m
[1m+++ /dev/null[m
[36m@@ -1,564 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_stream_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-static ngx_int_t ngx_stream_add_ports(ngx_conf_t *cf, ngx_array_t *ports,[m
[31m-    ngx_stream_listen_t *listen);[m
[31m-static char *ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports);[m
[31m-static ngx_int_t ngx_stream_add_addrs(ngx_conf_t *cf, ngx_stream_port_t *stport,[m
[31m-    ngx_stream_conf_addr_t *addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_stream_add_addrs6(ngx_conf_t *cf,[m
[31m-    ngx_stream_port_t *stport, ngx_stream_conf_addr_t *addr);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_stream_cmp_conf_addrs(const void *one, const void *two);[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_stream_max_module;[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_commands[] = {[m
[31m-[m
[31m-    { ngx_string("stream"),[m
[31m-      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_stream_block,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_core_module_t  ngx_stream_module_ctx = {[m
[31m-    ngx_string("stream"),[m
[31m-    NULL,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_module_ctx,                /* module context */[m
[31m-    ngx_stream_commands,                   /* module directives */[m
[31m-    NGX_CORE_MODULE,                       /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                          *rv;[m
[31m-    ngx_uint_t                     i, m, mi, s;[m
[31m-    ngx_conf_t                     pcf;[m
[31m-    ngx_array_t                    ports;[m
[31m-    ngx_stream_listen_t           *listen;[m
[31m-    ngx_stream_module_t           *module;[m
[31m-    ngx_stream_conf_ctx_t         *ctx;[m
[31m-    ngx_stream_core_srv_conf_t   **cscfp;[m
[31m-    ngx_stream_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    if (*(ngx_stream_conf_ctx_t **) conf) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    /* the main stream context */[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *(ngx_stream_conf_ctx_t **) conf = ctx;[m
[31m-[m
[31m-    /* count the number of the stream modules and set up their indices */[m
[31m-[m
[31m-    ngx_stream_max_module = ngx_count_modules(cf->cycle, NGX_STREAM_MODULE);[m
[31m-[m
[31m-[m
[31m-    /* the stream main_conf context, it's the same in the all stream contexts */[m
[31m-[m
[31m-    ctx->main_conf = ngx_pcalloc(cf->pool,[m
[31m-                                 sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (ctx->main_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * the stream null srv_conf context, it is used to merge[m
[31m-     * the server{}s' srv_conf's[m
[31m-     */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool,[m
[31m-                                sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /*[m
[31m-     * create the main_conf's and the null srv_conf's of the all stream modules[m
[31m-     */[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        if (module->create_main_conf) {[m
[31m-            ctx->main_conf[mi] = module->create_main_conf(cf);[m
[31m-            if (ctx->main_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            ctx->srv_conf[mi] = module->create_srv_conf(cf);[m
[31m-            if (ctx->srv_conf[mi] == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside the stream{} block */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-[m
[31m-    cf->module_type = NGX_STREAM_MODULE;[m
[31m-    cf->cmd_type = NGX_STREAM_MAIN_CONF;[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        *cf = pcf;[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* init stream{} main_conf's, merge the server{}s' srv_conf's */[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index];[m
[31m-    cscfp = cmcf->servers.elts;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-        mi = cf->cycle->modules[m]->ctx_index;[m
[31m-[m
[31m-        /* init stream{} main_conf's */[m
[31m-[m
[31m-        cf->ctx = ctx;[m
[31m-[m
[31m-        if (module->init_main_conf) {[m
[31m-            rv = module->init_main_conf(cf, ctx->main_conf[mi]);[m
[31m-            if (rv != NGX_CONF_OK) {[m
[31m-                *cf = pcf;[m
[31m-                return rv;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        for (s = 0; s < cmcf->servers.nelts; s++) {[m
[31m-[m
[31m-            /* merge the server{}s' srv_conf's */[m
[31m-[m
[31m-            cf->ctx = cscfp[s]->ctx;[m
[31m-[m
[31m-            if (module->merge_srv_conf) {[m
[31m-                rv = module->merge_srv_conf(cf,[m
[31m-                                            ctx->srv_conf[mi],[m
[31m-                                            cscfp[s]->ctx->srv_conf[mi]);[m
[31m-                if (rv != NGX_CONF_OK) {[m
[31m-                    *cf = pcf;[m
[31m-                    return rv;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->postconfiguration) {[m
[31m-            if (module->postconfiguration(cf) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-[m
[31m-    if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_stream_conf_port_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    listen = cmcf->listen.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->listen.nelts; i++) {[m
[31m-        if (ngx_stream_add_ports(cf, &ports, &listen[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_stream_optimize_servers(cf, &ports);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_add_ports(ngx_conf_t *cf, ngx_array_t *ports,[m
[31m-    ngx_stream_listen_t *listen)[m
[31m-{[m
[31m-    in_port_t                p;[m
[31m-    ngx_uint_t               i;[m
[31m-    struct sockaddr         *sa;[m
[31m-    struct sockaddr_in      *sin;[m
[31m-    ngx_stream_conf_port_t  *port;[m
[31m-    ngx_stream_conf_addr_t  *addr;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6     *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    sa = &listen->u.sockaddr;[m
[31m-[m
[31m-    switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = &listen->u.sockaddr_in6;[m
[31m-        p = sin6->sin6_port;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        p = 0;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = &listen->u.sockaddr_in;[m
[31m-        p = sin->sin_port;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (i = 0; i < ports->nelts; i++) {[m
[31m-[m
[31m-        if (p == port[i].port[m
[31m-            && listen->type == port[i].type[m
[31m-            && sa->sa_family == port[i].family)[m
[31m-        {[m
[31m-            /* a port is already in the port list */[m
[31m-[m
[31m-            port = &port[i];[m
[31m-            goto found;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* add a port to the port list */[m
[31m-[m
[31m-    port = ngx_array_push(ports);[m
[31m-    if (port == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    port->family = sa->sa_family;[m
[31m-    port->type = listen->type;[m
[31m-    port->port = p;[m
[31m-[m
[31m-    if (ngx_array_init(&port->addrs, cf->temp_pool, 2,[m
[31m-                       sizeof(ngx_stream_conf_addr_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    addr = ngx_array_push(&port->addrs);[m
[31m-    if (addr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addr->opt = *listen;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)[m
[31m-{[m
[31m-    ngx_uint_t                   i, p, last, bind_wildcard;[m
[31m-    ngx_listening_t             *ls;[m
[31m-    ngx_stream_port_t           *stport;[m
[31m-    ngx_stream_conf_port_t      *port;[m
[31m-    ngx_stream_conf_addr_t      *addr;[m
[31m-    ngx_stream_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    port = ports->elts;[m
[31m-    for (p = 0; p < ports->nelts; p++) {[m
[31m-[m
[31m-        ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,[m
[31m-                 sizeof(ngx_stream_conf_addr_t), ngx_stream_cmp_conf_addrs);[m
[31m-[m
[31m-        addr = port[p].addrs.elts;[m
[31m-        last = port[p].addrs.nelts;[m
[31m-[m
[31m-        /*[m
[31m-         * if there is the binding to the "*:port" then we need to bind()[m
[31m-         * to the "*:port" only and ignore the other bindings[m
[31m-         */[m
[31m-[m
[31m-        if (addr[last - 1].opt.wildcard) {[m
[31m-            addr[last - 1].opt.bind = 1;[m
[31m-            bind_wildcard = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            bind_wildcard = 0;[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-[m
[31m-        while (i < last) {[m
[31m-[m
[31m-            if (bind_wildcard && !addr[i].opt.bind) {[m
[31m-                i++;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            ls = ngx_create_listening(cf, &addr[i].opt.u.sockaddr,[m
[31m-                                      addr[i].opt.socklen);[m
[31m-            if (ls == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls->addr_ntop = 1;[m
[31m-            ls->handler = ngx_stream_init_connection;[m
[31m-            ls->pool_size = 256;[m
[31m-            ls->type = addr[i].opt.type;[m
[31m-[m
[31m-            cscf = addr->opt.ctx->srv_conf[ngx_stream_core_module.ctx_index];[m
[31m-[m
[31m-            ls->logp = cscf->error_log;[m
[31m-            ls->log.data = &ls->addr_text;[m
[31m-            ls->log.handler = ngx_accept_log_error;[m
[31m-[m
[31m-            ls->backlog = addr[i].opt.backlog;[m
[31m-[m
[31m-            ls->wildcard = addr[i].opt.wildcard;[m
[31m-[m
[31m-            ls->keepalive = addr[i].opt.so_keepalive;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-            ls->keepidle = addr[i].opt.tcp_keepidle;[m
[31m-            ls->keepintvl = addr[i].opt.tcp_keepintvl;[m
[31m-            ls->keepcnt = addr[i].opt.tcp_keepcnt;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            ls->ipv6only = addr[i].opt.ipv6only;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            ls->reuseport = addr[i].opt.reuseport;[m
[31m-#endif[m
[31m-[m
[31m-            stport = ngx_palloc(cf->pool, sizeof(ngx_stream_port_t));[m
[31m-            if (stport == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ls->servers = stport;[m
[31m-[m
[31m-            stport->naddrs = i + 1;[m
[31m-[m
[31m-            switch (ls->sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-            case AF_INET6:[m
[31m-                if (ngx_stream_add_addrs6(cf, stport, addr) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                break;[m
[31m-#endif[m
[31m-            default: /* AF_INET */[m
[31m-                if (ngx_stream_add_addrs(cf, stport, addr) != NGX_OK) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_clone_listening(cf, ls) != NGX_OK) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            addr++;[m
[31m-            last--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_add_addrs(ngx_conf_t *cf, ngx_stream_port_t *stport,[m
[31m-    ngx_stream_conf_addr_t *addr)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    size_t                 len;[m
[31m-    ngx_uint_t             i;[m
[31m-    struct sockaddr_in    *sin;[m
[31m-    ngx_stream_in_addr_t  *addrs;[m
[31m-    u_char                 buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    stport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                                stport->naddrs * sizeof(ngx_stream_in_addr_t));[m
[31m-    if (stport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs = stport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < stport->naddrs; i++) {[m
[31m-[m
[31m-        sin = &addr[i].opt.u.sockaddr_in;[m
[31m-        addrs[i].addr = sin->sin_addr.s_addr;[m
[31m-[m
[31m-        addrs[i].conf.ctx = addr[i].opt.ctx;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        addrs[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-[m
[31m-        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,[m
[31m-                            NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-        addrs[i].conf.addr_text.len = len;[m
[31m-        addrs[i].conf.addr_text.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_add_addrs6(ngx_conf_t *cf, ngx_stream_port_t *stport,[m
[31m-    ngx_stream_conf_addr_t *addr)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    size_t                  len;[m
[31m-    ngx_uint_t              i;[m
[31m-    struct sockaddr_in6    *sin6;[m
[31m-    ngx_stream_in6_addr_t  *addrs6;[m
[31m-    u_char                  buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-    stport->addrs = ngx_pcalloc(cf->pool,[m
[31m-                                stport->naddrs * sizeof(ngx_stream_in6_addr_t));[m
[31m-    if (stport->addrs == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    addrs6 = stport->addrs;[m
[31m-[m
[31m-    for (i = 0; i < stport->naddrs; i++) {[m
[31m-[m
[31m-        sin6 = &addr[i].opt.u.sockaddr_in6;[m
[31m-        addrs6[i].addr6 = sin6->sin6_addr;[m
[31m-[m
[31m-        addrs6[i].conf.ctx = addr[i].opt.ctx;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        addrs6[i].conf.ssl = addr[i].opt.ssl;[m
[31m-#endif[m
[31m-[m
[31m-        len = ngx_sock_ntop(&addr[i].opt.u.sockaddr, addr[i].opt.socklen, buf,[m
[31m-                            NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-        p = ngx_pnalloc(cf->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(p, buf, len);[m
[31m-[m
[31m-        addrs6[i].conf.addr_text.len = len;[m
[31m-        addrs6[i].conf.addr_text.data = p;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_cmp_conf_addrs(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_stream_conf_addr_t  *first, *second;[m
[31m-[m
[31m-    first = (ngx_stream_conf_addr_t *) one;[m
[31m-    second = (ngx_stream_conf_addr_t *) two;[m
[31m-[m
[31m-    if (first->opt.wildcard) {[m
[31m-        /* a wildcard must be the last resort, shift it to the end */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (second->opt.wildcard) {[m
[31m-        /* a wildcard must be the last resort, shift it to the end */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (first->opt.bind && !second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (!first->opt.bind && second->opt.bind) {[m
[31m-        /* shift explicit bind()ed addresses to the start */[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* do not sort by default */[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream.h[m
[1mdeleted file mode 100644[m
[1mindex 49efa45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,212 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STREAM_H_INCLUDED_[m
[31m-#define _NGX_STREAM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-#include <ngx_stream_ssl_module.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_stream_session_s  ngx_stream_session_t;[m
[31m-[m
[31m-[m
[31m-#include <ngx_stream_upstream.h>[m
[31m-#include <ngx_stream_upstream_round_robin.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void                  **main_conf;[m
[31m-    void                  **srv_conf;[m
[31m-} ngx_stream_conf_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    union {[m
[31m-        struct sockaddr     sockaddr;[m
[31m-        struct sockaddr_in  sockaddr_in;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        struct sockaddr_in6 sockaddr_in6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        struct sockaddr_un  sockaddr_un;[m
[31m-#endif[m
[31m-        u_char              sockaddr_data[NGX_SOCKADDRLEN];[m
[31m-    } u;[m
[31m-[m
[31m-    socklen_t               socklen;[m
[31m-[m
[31m-    /* server ctx */[m
[31m-    ngx_stream_conf_ctx_t  *ctx;[m
[31m-[m
[31m-    unsigned                bind:1;[m
[31m-    unsigned                wildcard:1;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    unsigned                ssl:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    unsigned                ipv6only:1;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-    unsigned                reuseport:1;[m
[31m-#endif[m
[31m-    unsigned                so_keepalive:2;[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-    int                     tcp_keepidle;[m
[31m-    int                     tcp_keepintvl;[m
[31m-    int                     tcp_keepcnt;[m
[31m-#endif[m
[31m-    int                     backlog;[m
[31m-    int                     type;[m
[31m-} ngx_stream_listen_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_conf_ctx_t  *ctx;[m
[31m-    ngx_str_t               addr_text;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    ngx_uint_t              ssl;    /* unsigned   ssl:1; */[m
[31m-#endif[m
[31m-} ngx_stream_addr_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t               addr;[m
[31m-    ngx_stream_addr_conf_t  conf;[m
[31m-} ngx_stream_in_addr_t;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr         addr6;[m
[31m-    ngx_stream_addr_conf_t  conf;[m
[31m-} ngx_stream_in6_addr_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* ngx_stream_in_addr_t or ngx_stream_in6_addr_t */[m
[31m-    void                   *addrs;[m
[31m-    ngx_uint_t              naddrs;[m
[31m-} ngx_stream_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int                     family;[m
[31m-    int                     type;[m
[31m-    in_port_t               port;[m
[31m-    ngx_array_t             addrs;       /* array of ngx_stream_conf_addr_t */[m
[31m-} ngx_stream_conf_port_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_listen_t     opt;[m
[31m-} ngx_stream_conf_addr_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_stream_access_pt)(ngx_stream_session_t *s);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t             servers;     /* ngx_stream_core_srv_conf_t */[m
[31m-    ngx_array_t             listen;      /* ngx_stream_listen_t */[m
[31m-    ngx_stream_access_pt    limit_conn_handler;[m
[31m-    ngx_stream_access_pt    access_handler;[m
[31m-} ngx_stream_core_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_stream_handler_pt)(ngx_stream_session_t *s);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_handler_pt   handler;[m
[31m-    ngx_stream_conf_ctx_t  *ctx;[m
[31m-    u_char                 *file_name;[m
[31m-    ngx_int_t               line;[m
[31m-    ngx_log_t              *error_log;[m
[31m-    ngx_flag_t              tcp_nodelay;[m
[31m-} ngx_stream_core_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_stream_session_s {[m
[31m-    uint32_t                signature;         /* "STRM" */[m
[31m-[m
[31m-    ngx_connection_t       *connection;[m
[31m-[m
[31m-    off_t                   received;[m
[31m-[m
[31m-    ngx_log_handler_pt      log_handler;[m
[31m-[m
[31m-    void                  **ctx;[m
[31m-    void                  **main_conf;[m
[31m-    void                  **srv_conf;[m
[31m-[m
[31m-    ngx_stream_upstream_t  *upstream;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t             (*postconfiguration)(ngx_conf_t *cf);[m
[31m-[m
[31m-    void                 *(*create_main_conf)(ngx_conf_t *cf);[m
[31m-    char                 *(*init_main_conf)(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-    void                 *(*create_srv_conf)(ngx_conf_t *cf);[m
[31m-    char                 *(*merge_srv_conf)(ngx_conf_t *cf, void *prev,[m
[31m-                                            void *conf);[m
[31m-} ngx_stream_module_t;[m
[31m-[m
[31m-[m
[31m-#define NGX_STREAM_MODULE       0x4d525453     /* "STRM" */[m
[31m-[m
[31m-#define NGX_STREAM_MAIN_CONF    0x02000000[m
[31m-#define NGX_STREAM_SRV_CONF     0x04000000[m
[31m-#define NGX_STREAM_UPS_CONF     0x08000000[m
[31m-[m
[31m-[m
[31m-#define NGX_STREAM_MAIN_CONF_OFFSET  offsetof(ngx_stream_conf_ctx_t, main_conf)[m
[31m-#define NGX_STREAM_SRV_CONF_OFFSET   offsetof(ngx_stream_conf_ctx_t, srv_conf)[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_get_module_ctx(s, module)   (s)->ctx[module.ctx_index][m
[31m-#define ngx_stream_set_ctx(s, c, module)       s->ctx[module.ctx_index] = c;[m
[31m-#define ngx_stream_delete_ctx(s, module)       s->ctx[module.ctx_index] = NULL;[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_get_module_main_conf(s, module)                             \[m
[31m-    (s)->main_conf[module.ctx_index][m
[31m-#define ngx_stream_get_module_srv_conf(s, module)                              \[m
[31m-    (s)->srv_conf[module.ctx_index][m
[31m-[m
[31m-#define ngx_stream_conf_get_module_main_conf(cf, module)                       \[m
[31m-    ((ngx_stream_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index][m
[31m-#define ngx_stream_conf_get_module_srv_conf(cf, module)                        \[m
[31m-    ((ngx_stream_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index][m
[31m-[m
[31m-#define ngx_stream_cycle_get_module_main_conf(cycle, module)                   \[m
[31m-    (cycle->conf_ctx[ngx_stream_module.index] ?                                \[m
[31m-        ((ngx_stream_conf_ctx_t *) cycle->conf_ctx[ngx_stream_module.index])   \[m
[31m-            ->main_conf[module.ctx_index]:                                     \[m
[31m-        NULL)[m
[31m-[m
[31m-[m
[31m-void ngx_stream_init_connection(ngx_connection_t *c);[m
[31m-void ngx_stream_close_connection(ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_stream_module;[m
[31m-extern ngx_uint_t    ngx_stream_max_module;[m
[31m-extern ngx_module_t  ngx_stream_core_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STREAM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_access_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_access_module.c[m
[1mdeleted file mode 100644[m
[1mindex 64869d2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_access_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,451 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    in_addr_t         mask;[m
[31m-    in_addr_t         addr;[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_stream_access_rule_t;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct in6_addr   addr;[m
[31m-    struct in6_addr   mask;[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_stream_access_rule6_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t        deny;      /* unsigned  deny:1; */[m
[31m-} ngx_stream_access_rule_un_t;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t      *rules;     /* array of ngx_stream_access_rule_t */[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_array_t      *rules6;    /* array of ngx_stream_access_rule6_t */[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    ngx_array_t      *rules_un;  /* array of ngx_stream_access_rule_un_t */[m
[31m-#endif[m
[31m-} ngx_stream_access_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_stream_access_handler(ngx_stream_session_t *s);[m
[31m-static ngx_int_t ngx_stream_access_inet(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf, in_addr_t addr);[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-static ngx_int_t ngx_stream_access_inet6(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf, u_char *p);[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-static ngx_int_t ngx_stream_access_unix(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_stream_access_found(ngx_stream_session_t *s,[m
[31m-    ngx_uint_t deny);[m
[31m-static char *ngx_stream_access_rule(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_stream_access_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_access_merge_srv_conf(ngx_conf_t *cf,[m
[31m-    void *parent, void *child);[m
[31m-static ngx_int_t ngx_stream_access_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_access_commands[] = {[m
[31m-[m
[31m-    { ngx_string("allow"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_access_rule,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("deny"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_access_rule,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_access_module_ctx = {[m
[31m-    ngx_stream_access_init,                /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_access_create_srv_conf,     /* create server configuration */[m
[31m-    ngx_stream_access_merge_srv_conf       /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_access_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_access_module_ctx,         /* module context */[m
[31m-    ngx_stream_access_commands,            /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_handler(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    struct sockaddr_in            *sin;[m
[31m-    ngx_stream_access_srv_conf_t  *ascf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    u_char                        *p;[m
[31m-    in_addr_t                      addr;[m
[31m-    struct sockaddr_in6           *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    ascf = ngx_stream_get_module_srv_conf(s, ngx_stream_access_module);[m
[31m-[m
[31m-    switch (s->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        if (ascf->rules) {[m
[31m-            sin = (struct sockaddr_in *) s->connection->sockaddr;[m
[31m-            return ngx_stream_access_inet(s, ascf, sin->sin_addr.s_addr);[m
[31m-        }[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;[m
[31m-        p = sin6->sin6_addr.s6_addr;[m
[31m-[m
[31m-        if (ascf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {[m
[31m-            addr = p[12] << 24;[m
[31m-            addr += p[13] << 16;[m
[31m-            addr += p[14] << 8;[m
[31m-            addr += p[15];[m
[31m-            return ngx_stream_access_inet(s, ascf, htonl(addr));[m
[31m-        }[m
[31m-[m
[31m-        if (ascf->rules6) {[m
[31m-            return ngx_stream_access_inet6(s, ascf, p);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-    case AF_UNIX:[m
[31m-        if (ascf->rules_un) {[m
[31m-            return ngx_stream_access_unix(s, ascf);[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_inet(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf, in_addr_t addr)[m
[31m-{[m
[31m-    ngx_uint_t                 i;[m
[31m-    ngx_stream_access_rule_t  *rule;[m
[31m-[m
[31m-    rule = ascf->rules->elts;[m
[31m-    for (i = 0; i < ascf->rules->nelts; i++) {[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "access: %08XD %08XD %08XD",[m
[31m-                       addr, rule[i].mask, rule[i].addr);[m
[31m-[m
[31m-        if ((addr & rule[i].mask) == rule[i].addr) {[m
[31m-            return ngx_stream_access_found(s, rule[i].deny);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_inet6(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf, u_char *p)[m
[31m-{[m
[31m-    ngx_uint_t                  n;[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_stream_access_rule6_t  *rule6;[m
[31m-[m
[31m-    rule6 = ascf->rules6->elts;[m
[31m-    for (i = 0; i < ascf->rules6->nelts; i++) {[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        {[m
[31m-        size_t  cl, ml, al;[m
[31m-        u_char  ct[NGX_INET6_ADDRSTRLEN];[m
[31m-        u_char  mt[NGX_INET6_ADDRSTRLEN];[m
[31m-        u_char  at[NGX_INET6_ADDRSTRLEN];[m
[31m-[m
[31m-        cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN);[m
[31m-        ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN);[m
[31m-        al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN);[m
[31m-[m
[31m-        ngx_log_debug6(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "access: %*s %*s %*s", cl, ct, ml, mt, al, at);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        for (n = 0; n < 16; n++) {[m
[31m-            if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) {[m
[31m-                goto next;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return ngx_stream_access_found(s, rule6[i].deny);[m
[31m-[m
[31m-    next:[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_unix(ngx_stream_session_t *s,[m
[31m-    ngx_stream_access_srv_conf_t *ascf)[m
[31m-{[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_stream_access_rule_un_t  *rule_un;[m
[31m-[m
[31m-    rule_un = ascf->rules_un->elts;[m
[31m-    for (i = 0; i < ascf->rules_un->nelts; i++) {[m
[31m-[m
[31m-        /* TODO: check path */[m
[31m-        if (1) {[m
[31m-            return ngx_stream_access_found(s, rule_un[i].deny);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_found(ngx_stream_session_t *s, ngx_uint_t deny)[m
[31m-{[m
[31m-    if (deny) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                      "access forbidden by rule");[m
[31m-        return NGX_ABORT;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_access_srv_conf_t *ascf = conf;[m
[31m-[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_uint_t                    all;[m
[31m-    ngx_str_t                    *value;[m
[31m-    ngx_cidr_t                    cidr;[m
[31m-    ngx_stream_access_rule_t     *rule;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    ngx_stream_access_rule6_t    *rule6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    ngx_stream_access_rule_un_t  *rule_un;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memzero(&cidr, sizeof(ngx_cidr_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    all = (value[1].len == 3 && ngx_strcmp(value[1].data, "all") == 0);[m
[31m-[m
[31m-    if (!all) {[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-[m
[31m-        if (value[1].len == 5 && ngx_strcmp(value[1].data, "unix:") == 0) {[m
[31m-            cidr.family = AF_UNIX;[m
[31m-            rc = NGX_OK;[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_ptocidr(&value[1], &cidr);[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-        rc = ngx_ptocidr(&value[1], &cidr);[m
[31m-#endif[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                         "invalid parameter \"%V\"", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                         "low address bits of %V are meaningless", &value[1]);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cidr.family == AF_INET || all) {[m
[31m-[m
[31m-        if (ascf->rules == NULL) {[m
[31m-            ascf->rules = ngx_array_create(cf->pool, 4,[m
[31m-                                           sizeof(ngx_stream_access_rule_t));[m
[31m-            if (ascf->rules == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule = ngx_array_push(ascf->rules);[m
[31m-        if (rule == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule->mask = cidr.u.in.mask;[m
[31m-        rule->addr = cidr.u.in.addr;[m
[31m-        rule->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    if (cidr.family == AF_INET6 || all) {[m
[31m-[m
[31m-        if (ascf->rules6 == NULL) {[m
[31m-            ascf->rules6 = ngx_array_create(cf->pool, 4,[m
[31m-                                            sizeof(ngx_stream_access_rule6_t));[m
[31m-            if (ascf->rules6 == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule6 = ngx_array_push(ascf->rules6);[m
[31m-        if (rule6 == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule6->mask = cidr.u.in6.mask;[m
[31m-        rule6->addr = cidr.u.in6.addr;[m
[31m-        rule6->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    if (cidr.family == AF_UNIX || all) {[m
[31m-[m
[31m-        if (ascf->rules_un == NULL) {[m
[31m-            ascf->rules_un = ngx_array_create(cf->pool, 1,[m
[31m-                                          sizeof(ngx_stream_access_rule_un_t));[m
[31m-            if (ascf->rules_un == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rule_un = ngx_array_push(ascf->rules_un);[m
[31m-        if (rule_un == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rule_un->deny = (value[0].data[0] == 'd') ? 1 : 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_access_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_access_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_access_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_access_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_access_srv_conf_t  *prev = parent;[m
[31m-    ngx_stream_access_srv_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->rules == NULL[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        && conf->rules6 == NULL[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        && conf->rules_un == NULL[m
[31m-#endif[m
[31m-    ) {[m
[31m-        conf->rules = prev->rules;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        conf->rules6 = prev->rules6;[m
[31m-#endif[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        conf->rules_un = prev->rules_un;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_access_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);[m
[31m-    cmcf->access_handler = ngx_stream_access_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_core_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_core_module.c[m
[1mdeleted file mode 100644[m
[1mindex ebc2b1c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_core_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,562 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static void *ngx_stream_core_create_main_conf(ngx_conf_t *cf);[m
[31m-static void *ngx_stream_core_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_core_commands[] = {[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_stream_core_server,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("listen"),[m
[31m-      NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_stream_core_listen,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("error_log"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_stream_core_error_log,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("tcp_nodelay"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_core_srv_conf_t, tcp_nodelay),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_core_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_stream_core_create_main_conf,      /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_core_create_srv_conf,       /* create server configuration */[m
[31m-    ngx_stream_core_merge_srv_conf         /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_core_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_core_module_ctx,           /* module context */[m
[31m-    ngx_stream_core_commands,              /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_core_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_main_conf_t));[m
[31m-    if (cmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->servers, cf->pool, 4,[m
[31m-                       sizeof(ngx_stream_core_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_stream_listen_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return cmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_core_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    cscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_srv_conf_t));[m
[31m-    if (cscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     cscf->handler = NULL;[m
[31m-     *     cscf->error_log = NULL;[m
[31m-     */[m
[31m-[m
[31m-    cscf->file_name = cf->conf_file->file.name.data;[m
[31m-    cscf->line = cf->conf_file->line;[m
[31m-    cscf->tcp_nodelay = NGX_CONF_UNSET;[m
[31m-[m
[31m-    return cscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_core_srv_conf_t *prev = parent;[m
[31m-    ngx_stream_core_srv_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->handler == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no handler for server in %s:%ui",[m
[31m-                      conf->file_name, conf->line);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->error_log == NULL) {[m
[31m-        if (prev->error_log) {[m
[31m-            conf->error_log = prev->error_log;[m
[31m-        } else {[m
[31m-            conf->error_log = &cf->cycle->new_log;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_core_srv_conf_t  *cscf = conf;[m
[31m-[m
[31m-    return ngx_log_set_log(cf, &cscf->error_log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char                         *rv;[m
[31m-    void                         *mconf;[m
[31m-    ngx_uint_t                    m;[m
[31m-    ngx_conf_t                    pcf;[m
[31m-    ngx_stream_module_t          *module;[m
[31m-    ngx_stream_conf_ctx_t        *ctx, *stream_ctx;[m
[31m-    ngx_stream_core_srv_conf_t   *cscf, **cscfp;[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    stream_ctx = cf->ctx;[m
[31m-    ctx->main_conf = stream_ctx->main_conf;[m
[31m-[m
[31m-    /* the server{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool,[m
[31m-                                sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* the server configuration context */[m
[31m-[m
[31m-    cscf = ctx->srv_conf[ngx_stream_core_module.ctx_index];[m
[31m-    cscf->ctx = ctx;[m
[31m-[m
[31m-    cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index];[m
[31m-[m
[31m-    cscfp = ngx_array_push(&cmcf->servers);[m
[31m-    if (cscfp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *cscfp = cscf;[m
[31m-[m
[31m-[m
[31m-    /* parse inside server{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_STREAM_SRV_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    size_t                        len, off;[m
[31m-    in_port_t                     port;[m
[31m-    ngx_str_t                    *value;[m
[31m-    ngx_url_t                     u;[m
[31m-    ngx_uint_t                    i, backlog;[m
[31m-    struct sockaddr              *sa;[m
[31m-    struct sockaddr_in           *sin;[m
[31m-    ngx_stream_listen_t          *ls;[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6          *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.listen = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in \"%V\" of the \"listen\" directive",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);[m
[31m-[m
[31m-    ls = cmcf->listen.elts;[m
[31m-[m
[31m-    for (i = 0; i < cmcf->listen.nelts; i++) {[m
[31m-[m
[31m-        sa = &ls[i].u.sockaddr;[m
[31m-[m
[31m-        if (sa->sa_family != u.family) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            off = offsetof(struct sockaddr_in6, sin6_addr);[m
[31m-            len = 16;[m
[31m-            sin6 = &ls[i].u.sockaddr_in6;[m
[31m-            port = sin6->sin6_port;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-        case AF_UNIX:[m
[31m-            off = offsetof(struct sockaddr_un, sun_path);[m
[31m-            len = sizeof(((struct sockaddr_un *) sa)->sun_path);[m
[31m-            port = 0;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            off = offsetof(struct sockaddr_in, sin_addr);[m
[31m-            len = 4;[m
[31m-            sin = &ls[i].u.sockaddr_in;[m
[31m-            port = sin->sin_port;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_memcmp(ls[i].u.sockaddr_data + off, u.sockaddr + off, len)[m
[31m-            != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (port != u.port) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate \"%V\" address and port pair", &u.url);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ls = ngx_array_push(&cmcf->listen);[m
[31m-    if (ls == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(ls, sizeof(ngx_stream_listen_t));[m
[31m-[m
[31m-    ngx_memcpy(&ls->u.sockaddr, u.sockaddr, u.socklen);[m
[31m-[m
[31m-    ls->socklen = u.socklen;[m
[31m-    ls->backlog = NGX_LISTEN_BACKLOG;[m
[31m-    ls->type = SOCK_STREAM;[m
[31m-    ls->wildcard = u.wildcard;[m
[31m-    ls->ctx = cf->ctx;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-    ls->ipv6only = 1;[m
[31m-#endif[m
[31m-[m
[31m-    backlog = 0;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-#if !(NGX_WIN32)[m
[31m-        if (ngx_strcmp(value[i].data, "udp") == 0) {[m
[31m-            ls->type = SOCK_DGRAM;[m
[31m-            continue;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "bind") == 0) {[m
[31m-            ls->bind = 1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) {[m
[31m-            ls->backlog = ngx_atoi(value[i].data + 8, value[i].len - 8);[m
[31m-            ls->bind = 1;[m
[31m-[m
[31m-            if (ls->backlog == NGX_ERROR || ls->backlog == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid backlog \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            backlog = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) {[m
[31m-#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)[m
[31m-            u_char  buf[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-            sa = &ls->u.sockaddr;[m
[31m-[m
[31m-            if (sa->sa_family == AF_INET6) {[m
[31m-[m
[31m-                if (ngx_strcmp(&value[i].data[10], "n") == 0) {[m
[31m-                    ls->ipv6only = 1;[m
[31m-[m
[31m-                } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) {[m
[31m-                    ls->ipv6only = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                       "invalid ipv6only flags \"%s\"",[m
[31m-                                       &value[i].data[9]);[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ls->bind = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                len = ngx_sock_ntop(sa, ls->socklen, buf,[m
[31m-                                    NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "ipv6only is not supported "[m
[31m-                                   "on addr \"%*s\", ignored", len, buf);[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "bind ipv6only is not supported "[m
[31m-                               "on this platform");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "reuseport") == 0) {[m
[31m-#if (NGX_HAVE_REUSEPORT)[m
[31m-            ls->reuseport = 1;[m
[31m-            ls->bind = 1;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "reuseport is not supported "[m
[31m-                               "on this platform, ignored");[m
[31m-#endif[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "ssl") == 0) {[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-            ls->ssl = 1;[m
[31m-            continue;[m
[31m-#else[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "the \"ssl\" parameter requires "[m
[31m-                               "ngx_stream_ssl_module");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) {[m
[31m-[m
[31m-            if (ngx_strcmp(&value[i].data[13], "on") == 0) {[m
[31m-                ls->so_keepalive = 1;[m
[31m-[m
[31m-            } else if (ngx_strcmp(&value[i].data[13], "off") == 0) {[m
[31m-                ls->so_keepalive = 2;[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-                u_char     *p, *end;[m
[31m-                ngx_str_t   s;[m
[31m-[m
[31m-                end = value[i].data + value[i].len;[m
[31m-                s.data = value[i].data + 13;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepidle = ngx_parse_time(&s, 1);[m
[31m-                    if (ls->tcp_keepidle == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                p = ngx_strlchr(s.data, end, ':');[m
[31m-                if (p == NULL) {[m
[31m-                    p = end;[m
[31m-                }[m
[31m-[m
[31m-                if (p > s.data) {[m
[31m-                    s.len = p - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepintvl = ngx_parse_time(&s, 1);[m
[31m-                    if (ls->tcp_keepintvl == (time_t) NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                s.data = (p < end) ? (p + 1) : end;[m
[31m-[m
[31m-                if (s.data < end) {[m
[31m-                    s.len = end - s.data;[m
[31m-[m
[31m-                    ls->tcp_keepcnt = ngx_atoi(s.data, s.len);[m
[31m-                    if (ls->tcp_keepcnt == NGX_ERROR) {[m
[31m-                        goto invalid_so_keepalive;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0[m
[31m-                    && ls->tcp_keepcnt == 0)[m
[31m-                {[m
[31m-                    goto invalid_so_keepalive;[m
[31m-                }[m
[31m-[m
[31m-                ls->so_keepalive = 1;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "the \"so_keepalive\" parameter accepts "[m
[31m-                                   "only \"on\" or \"off\" on this platform");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            ls->bind = 1;[m
[31m-[m
[31m-            continue;[m
[31m-[m
[31m-#if (NGX_HAVE_KEEPALIVE_TUNABLE)[m
[31m-        invalid_so_keepalive:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid so_keepalive value: \"%s\"",[m
[31m-                               &value[i].data[13]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "the invalid \"%V\" parameter", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ls->type == SOCK_DGRAM) {[m
[31m-        if (backlog) {[m
[31m-            return "\"backlog\" parameter is incompatible with \"udp\"";[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        if (ls->ssl) {[m
[31m-            return "\"ssl\" parameter is incompatible with \"udp\"";[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ls->so_keepalive) {[m
[31m-            return "\"so_keepalive\" parameter is incompatible with \"udp\"";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_handler.c[m
[1mdeleted file mode 100644[m
[1mindex aa69e44..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,344 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_event.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len);[m
[31m-static void ngx_stream_init_session(ngx_connection_t *c);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-static void ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c);[m
[31m-static void ngx_stream_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_stream_init_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    int                           tcp_nodelay;[m
[31m-    u_char                        text[NGX_SOCKADDR_STRLEN];[m
[31m-    size_t                        len;[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_uint_t                    i;[m
[31m-    struct sockaddr              *sa;[m
[31m-    ngx_stream_port_t            *port;[m
[31m-    struct sockaddr_in           *sin;[m
[31m-    ngx_stream_in_addr_t         *addr;[m
[31m-    ngx_stream_session_t         *s;[m
[31m-    ngx_stream_addr_conf_t       *addr_conf;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6          *sin6;[m
[31m-    ngx_stream_in6_addr_t        *addr6;[m
[31m-#endif[m
[31m-    ngx_stream_core_srv_conf_t   *cscf;[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    /* find the server configuration for the address:port */[m
[31m-[m
[31m-    port = c->listening->servers;[m
[31m-[m
[31m-    if (port->naddrs > 1) {[m
[31m-[m
[31m-        /*[m
[31m-         * There are several addresses on this port and one of them[m
[31m-         * is the "*:port" wildcard so getsockname() is needed to determine[m
[31m-         * the server address.[m
[31m-         *[m
[31m-         * AcceptEx() and recvmsg() already gave this address.[m
[31m-         */[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        sa = c->local_sockaddr;[m
[31m-[m
[31m-        switch (sa->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            sin6 = (struct sockaddr_in6 *) sa;[m
[31m-[m
[31m-            addr6 = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            addr_conf = &addr6[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            sin = (struct sockaddr_in *) sa;[m
[31m-[m
[31m-            addr = port->addrs;[m
[31m-[m
[31m-            /* the last address is "*" */[m
[31m-[m
[31m-            for (i = 0; i < port->naddrs - 1; i++) {[m
[31m-                if (addr[i].addr == sin->sin_addr.s_addr) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            addr_conf = &addr[i].conf;[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-        case AF_INET6:[m
[31m-            addr6 = port->addrs;[m
[31m-            addr_conf = &addr6[0].conf;[m
[31m-            break;[m
[31m-#endif[m
[31m-[m
[31m-        default: /* AF_INET */[m
[31m-            addr = port->addrs;[m
[31m-            addr_conf = &addr[0].conf;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = ngx_pcalloc(c->pool, sizeof(ngx_stream_session_t));[m
[31m-    if (s == NULL) {[m
[31m-        ngx_stream_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->signature = NGX_STREAM_MODULE;[m
[31m-    s->main_conf = addr_conf->ctx->main_conf;[m
[31m-    s->srv_conf = addr_conf->ctx->srv_conf;[m
[31m-[m
[31m-    s->connection = c;[m
[31m-    c->data = s;[m
[31m-[m
[31m-    cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);[m
[31m-[m
[31m-    ngx_set_connection_log(c, cscf->error_log);[m
[31m-[m
[31m-    len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA %sclient %*s connected to %V",[m
[31m-                  c->number, c->type == SOCK_DGRAM ? "udp " : "",[m
[31m-                  len, text, &addr_conf->addr_text);[m
[31m-[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->handler = ngx_stream_log_error;[m
[31m-    c->log->data = s;[m
[31m-    c->log->action = "initializing connection";[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-    cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);[m
[31m-[m
[31m-    if (cmcf->limit_conn_handler) {[m
[31m-        rc = cmcf->limit_conn_handler(s);[m
[31m-[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cmcf->access_handler) {[m
[31m-        rc = cmcf->access_handler(s);[m
[31m-[m
[31m-        if (rc != NGX_OK && rc != NGX_DECLINED) {[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (c->type == SOCK_STREAM[m
[31m-        && cscf->tcp_nodelay[m
[31m-        && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-        {[m
[31m-            ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    {[m
[31m-    ngx_stream_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    sslcf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module);[m
[31m-[m
[31m-    if (addr_conf->ssl) {[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-[m
[31m-        if (sslcf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                          "no \"ssl_certificate\" is defined "[m
[31m-                          "in server listening on SSL port");[m
[31m-            ngx_stream_close_connection(c);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_ssl_init_connection(&sslcf->ssl, c);[m
[31m-        return;[m
[31m-    }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_stream_init_session(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_init_session(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_stream_session_t        *s;[m
[31m-    ngx_stream_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    s = c->data;[m
[31m-    c->log->action = "handling client connection";[m
[31m-[m
[31m-    cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);[m
[31m-[m
[31m-    s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (s->ctx == NULL) {[m
[31m-        ngx_stream_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cscf->handler(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_stream_session_t   *s;[m
[31m-    ngx_stream_ssl_conf_t  *sslcf;[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(ssl, c, 0) == NGX_ERROR) {[m
[31m-        ngx_stream_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_handshake(c) == NGX_AGAIN) {[m
[31m-[m
[31m-        s = c->data;[m
[31m-[m
[31m-        sslcf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module);[m
[31m-[m
[31m-        ngx_add_timer(c->read, sslcf->handshake_timeout);[m
[31m-[m
[31m-        c->ssl->handler = ngx_stream_ssl_handshake_handler;[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_ssl_handshake_handler(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    if (!c->ssl->handshaked) {[m
[31m-        ngx_stream_close_connection(c);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_init_session(c);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_stream_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t  *pool;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                   "close stream connection: %d", c->fd);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        if (ngx_ssl_shutdown(c) == NGX_AGAIN) {[m
[31m-            c->ssl->handler = ngx_stream_close_connection;[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STAT_STUB)[m
[31m-    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);[m
[31m-#endif[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-[m
[31m-    ngx_destroy_pool(pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char                *p;[m
[31m-    ngx_stream_session_t  *s;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    s = log->data;[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", %sclient: %V, server: %V",[m
[31m-                     s->connection->type == SOCK_DGRAM ? "udp " : "",[m
[31m-                     &s->connection->addr_text,[m
[31m-                     &s->connection->listening->addr_text);[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (s->log_handler) {[m
[31m-        p = s->log_handler(log, buf, len);[m
[31m-    }[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_limit_conn_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_limit_conn_module.c[m
[1mdeleted file mode 100644[m
[1mindex f1d8a37..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_limit_conn_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,632 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     color;[m
[31m-    u_char                     len;[m
[31m-    u_short                    conn;[m
[31m-    u_char                     data[1];[m
[31m-} ngx_stream_limit_conn_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t            *shm_zone;[m
[31m-    ngx_rbtree_node_t         *node;[m
[31m-} ngx_stream_limit_conn_cleanup_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t              *rbtree;[m
[31m-} ngx_stream_limit_conn_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_shm_zone_t            *shm_zone;[m
[31m-    ngx_uint_t                 conn;[m
[31m-} ngx_stream_limit_conn_limit_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                limits;[m
[31m-    ngx_uint_t                 log_level;[m
[31m-} ngx_stream_limit_conn_conf_t;[m
[31m-[m
[31m-[m
[31m-static ngx_rbtree_node_t *ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree,[m
[31m-    ngx_str_t *key, uint32_t hash);[m
[31m-static void ngx_stream_limit_conn_cleanup(void *data);[m
[31m-static ngx_inline void ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool);[m
[31m-[m
[31m-static void *ngx_stream_limit_conn_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_stream_limit_conn_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_enum_t  ngx_stream_limit_conn_log_levels[] = {[m
[31m-    { ngx_string("info"), NGX_LOG_INFO },[m
[31m-    { ngx_string("notice"), NGX_LOG_NOTICE },[m
[31m-    { ngx_string("warn"), NGX_LOG_WARN },[m
[31m-    { ngx_string("error"), NGX_LOG_ERR },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_limit_conn_commands[] = {[m
[31m-[m
[31m-    { ngx_string("limit_conn_zone"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_stream_limit_conn_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_conn"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_stream_limit_conn,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("limit_conn_log_level"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_enum_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_limit_conn_conf_t, log_level),[m
[31m-      &ngx_stream_limit_conn_log_levels },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_limit_conn_module_ctx = {[m
[31m-    ngx_stream_limit_conn_init,            /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_limit_conn_create_conf,     /* create server configuration */[m
[31m-    ngx_stream_limit_conn_merge_conf,      /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_limit_conn_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_limit_conn_module_ctx,       /* module context */[m
[31m-    ngx_stream_limit_conn_commands,          /* module directives */[m
[31m-    NGX_STREAM_MODULE,                       /* module type */[m
[31m-    NULL,                                    /* init master */[m
[31m-    NULL,                                    /* init module */[m
[31m-    NULL,                                    /* init process */[m
[31m-    NULL,                                    /* init thread */[m
[31m-    NULL,                                    /* exit thread */[m
[31m-    NULL,                                    /* exit process */[m
[31m-    NULL,                                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_limit_conn_handler(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    size_t                            n;[m
[31m-    uint32_t                          hash;[m
[31m-    ngx_str_t                         key;[m
[31m-    ngx_uint_t                        i;[m
[31m-    ngx_slab_pool_t                  *shpool;[m
[31m-    ngx_rbtree_node_t                *node;[m
[31m-    ngx_pool_cleanup_t               *cln;[m
[31m-    struct sockaddr_in               *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6              *sin6;[m
[31m-#endif[m
[31m-    ngx_stream_limit_conn_ctx_t      *ctx;[m
[31m-    ngx_stream_limit_conn_node_t     *lc;[m
[31m-    ngx_stream_limit_conn_conf_t     *lccf;[m
[31m-    ngx_stream_limit_conn_limit_t    *limits;[m
[31m-    ngx_stream_limit_conn_cleanup_t  *lccln;[m
[31m-[m
[31m-    switch (s->connection->sockaddr->sa_family) {[m
[31m-[m
[31m-    case AF_INET:[m
[31m-        sin = (struct sockaddr_in *) s->connection->sockaddr;[m
[31m-[m
[31m-        key.len = sizeof(in_addr_t);[m
[31m-        key.data = (u_char *) &sin->sin_addr;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;[m
[31m-[m
[31m-        key.len = sizeof(struct in6_addr);[m
[31m-        key.data = sin6->sin6_addr.s6_addr;[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-    lccf = ngx_stream_get_module_srv_conf(s, ngx_stream_limit_conn_module);[m
[31m-    limits = lccf->limits.elts;[m
[31m-[m
[31m-    for (i = 0; i < lccf->limits.nelts; i++) {[m
[31m-        ctx = limits[i].shm_zone->data;[m
[31m-[m
[31m-        shpool = (ngx_slab_pool_t *) limits[i].shm_zone->shm.addr;[m
[31m-[m
[31m-        ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-        node = ngx_stream_limit_conn_lookup(ctx->rbtree, &key, hash);[m
[31m-[m
[31m-        if (node == NULL) {[m
[31m-[m
[31m-            n = offsetof(ngx_rbtree_node_t, color)[m
[31m-                + offsetof(ngx_stream_limit_conn_node_t, data)[m
[31m-                + key.len;[m
[31m-[m
[31m-            node = ngx_slab_alloc_locked(shpool, n);[m
[31m-[m
[31m-            if (node == NULL) {[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-                ngx_stream_limit_conn_cleanup_all(s->connection->pool);[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            lc = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-            node->key = hash;[m
[31m-            lc->len = (u_char) key.len;[m
[31m-            lc->conn = 1;[m
[31m-            ngx_memcpy(lc->data, key.data, key.len);[m
[31m-[m
[31m-            ngx_rbtree_insert(ctx->rbtree, node);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            lc = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-            if ((ngx_uint_t) lc->conn >= limits[i].conn) {[m
[31m-[m
[31m-                ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-                ngx_log_error(lccf->log_level, s->connection->log, 0,[m
[31m-                              "limiting connections by zone \"%V\"",[m
[31m-                              &limits[i].shm_zone->shm.name);[m
[31m-[m
[31m-                ngx_stream_limit_conn_cleanup_all(s->connection->pool);[m
[31m-                return NGX_ABORT;[m
[31m-            }[m
[31m-[m
[31m-            lc->conn++;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "limit conn: %08Xi %d", node->key, lc->conn);[m
[31m-[m
[31m-        ngx_shmtx_unlock(&shpool->mutex);[m
[31m-[m
[31m-        cln = ngx_pool_cleanup_add(s->connection->pool,[m
[31m-                                   sizeof(ngx_stream_limit_conn_cleanup_t));[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_stream_limit_conn_cleanup;[m
[31m-        lccln = cln->data;[m
[31m-[m
[31m-        lccln->shm_zone = limits[i].shm_zone;[m
[31m-        lccln->node = node;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t             **p;[m
[31m-    ngx_stream_limit_conn_node_t   *lcn, *lcnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            lcn = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-            lcnt = (ngx_stream_limit_conn_node_t *) &temp->color;[m
[31m-[m
[31m-            p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0)[m
[31m-                ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_rbtree_node_t *[m
[31m-ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_int_t                      rc;[m
[31m-    ngx_rbtree_node_t             *node, *sentinel;[m
[31m-    ngx_stream_limit_conn_node_t  *lcn;[m
[31m-[m
[31m-    node = rbtree->root;[m
[31m-    sentinel = rbtree->sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        lcn = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            return node;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_limit_conn_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_stream_limit_conn_cleanup_t  *lccln = data;[m
[31m-[m
[31m-    ngx_slab_pool_t               *shpool;[m
[31m-    ngx_rbtree_node_t             *node;[m
[31m-    ngx_stream_limit_conn_ctx_t   *ctx;[m
[31m-    ngx_stream_limit_conn_node_t  *lc;[m
[31m-[m
[31m-    ctx = lccln->shm_zone->data;[m
[31m-    shpool = (ngx_slab_pool_t *) lccln->shm_zone->shm.addr;[m
[31m-    node = lccln->node;[m
[31m-    lc = (ngx_stream_limit_conn_node_t *) &node->color;[m
[31m-[m
[31m-    ngx_shmtx_lock(&shpool->mutex);[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_STREAM, lccln->shm_zone->shm.log, 0,[m
[31m-                   "limit conn cleanup: %08Xi %d", node->key, lc->conn);[m
[31m-[m
[31m-    lc->conn--;[m
[31m-[m
[31m-    if (lc->conn == 0) {[m
[31m-        ngx_rbtree_delete(ctx->rbtree, node);[m
[31m-        ngx_slab_free_locked(shpool, node);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&shpool->mutex);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    cln = pool->cleanup;[m
[31m-[m
[31m-    while (cln && cln->handler == ngx_stream_limit_conn_cleanup) {[m
[31m-        ngx_stream_limit_conn_cleanup(cln->data);[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    pool->cleanup = cln;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_stream_limit_conn_ctx_t  *octx = data;[m
[31m-[m
[31m-    size_t                        len;[m
[31m-    ngx_slab_pool_t              *shpool;[m
[31m-    ngx_rbtree_node_t            *sentinel;[m
[31m-    ngx_stream_limit_conn_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    if (octx) {[m
[31m-        ctx->rbtree = octx->rbtree;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        ctx->rbtree = shpool->data;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->rbtree = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_t));[m
[31m-    if (ctx->rbtree == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shpool->data = ctx->rbtree;[m
[31m-[m
[31m-    sentinel = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_node_t));[m
[31m-    if (sentinel == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_rbtree_init(ctx->rbtree, sentinel,[m
[31m-                    ngx_stream_limit_conn_rbtree_insert_value);[m
[31m-[m
[31m-    len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in limit_conn_zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_limit_conn_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_limit_conn_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->limits.elts = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->log_level = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_limit_conn_conf_t *prev = parent;[m
[31m-    ngx_stream_limit_conn_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->limits.elts == NULL) {[m
[31m-        conf->limits = prev->limits;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    ssize_t                       size;[m
[31m-    ngx_str_t                    *value, name, s;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_shm_zone_t               *shm_zone;[m
[31m-    ngx_stream_limit_conn_ctx_t  *ctx;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-    name.len = 0;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {[m
[31m-[m
[31m-            name.data = value[i].data + 5;[m
[31m-[m
[31m-            p = (u_char *) ngx_strchr(name.data, ':');[m
[31m-[m
[31m-            if (p == NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            name.len = p - name.data;[m
[31m-[m
[31m-            s.data = p + 1;[m
[31m-            s.len = value[i].data + value[i].len - s.data;[m
[31m-[m
[31m-            size = ngx_parse_size(&s);[m
[31m-[m
[31m-            if (size == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "invalid zone size \"%V\"", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "zone \"%V\" is too small", &value[i]);[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[i]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"%V\" must have \"zone\" parameter",[m
[31m-                           &cmd->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &name, size,[m
[31m-                                     &ngx_stream_limit_conn_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (shm_zone->data) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "%V \"%V\" is already bound to key "[m
[31m-                           "\"$binary_remote_addr\"",[m
[31m-                           &cmd->name, &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "$binary_remote_addr") != 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unsupported key \"%V\", use "[m
[31m-                           "$binary_remote_addr", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    shm_zone->init = ngx_stream_limit_conn_init_zone;[m
[31m-    shm_zone->data = ctx;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_shm_zone_t                 *shm_zone;[m
[31m-    ngx_stream_limit_conn_conf_t   *lccf = conf;[m
[31m-    ngx_stream_limit_conn_limit_t  *limit, *limits;[m
[31m-[m
[31m-    ngx_str_t   *value;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    shm_zone = ngx_shared_memory_add(cf, &value[1], 0,[m
[31m-                                     &ngx_stream_limit_conn_module);[m
[31m-    if (shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limits = lccf->limits.elts;[m
[31m-[m
[31m-    if (limits == NULL) {[m
[31m-        if (ngx_array_init(&lccf->limits, cf->pool, 1,[m
[31m-                           sizeof(ngx_stream_limit_conn_limit_t))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < lccf->limits.nelts; i++) {[m
[31m-        if (shm_zone == limits[i].shm_zone) {[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_atoi(value[2].data, value[2].len);[m
[31m-    if (n <= 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid number of connections \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n > 65535) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "connection limit must be less 65536");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit = ngx_array_push(&lccf->limits);[m
[31m-    if (limit == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    limit->conn = n;[m
[31m-    limit->shm_zone = shm_zone;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_limit_conn_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);[m
[31m-[m
[31m-    cmcf->limit_conn_handler = ngx_stream_limit_conn_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_proxy_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_proxy_module.c[m
[1mdeleted file mode 100644[m
[1mindex 6c535fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_proxy_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1674 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_msec_t                       connect_timeout;[m
[31m-    ngx_msec_t                       timeout;[m
[31m-    ngx_msec_t                       next_upstream_timeout;[m
[31m-    size_t                           buffer_size;[m
[31m-    size_t                           upload_rate;[m
[31m-    size_t                           download_rate;[m
[31m-    ngx_uint_t                       responses;[m
[31m-    ngx_uint_t                       next_upstream_tries;[m
[31m-    ngx_flag_t                       next_upstream;[m
[31m-    ngx_flag_t                       proxy_protocol;[m
[31m-    ngx_addr_t                      *local;[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    ngx_flag_t                       ssl_enable;[m
[31m-    ngx_flag_t                       ssl_session_reuse;[m
[31m-    ngx_uint_t                       ssl_protocols;[m
[31m-    ngx_str_t                        ssl_ciphers;[m
[31m-    ngx_str_t                        ssl_name;[m
[31m-    ngx_flag_t                       ssl_server_name;[m
[31m-[m
[31m-    ngx_flag_t                       ssl_verify;[m
[31m-    ngx_uint_t                       ssl_verify_depth;[m
[31m-    ngx_str_t                        ssl_trusted_certificate;[m
[31m-    ngx_str_t                        ssl_crl;[m
[31m-    ngx_str_t                        ssl_certificate;[m
[31m-    ngx_str_t                        ssl_certificate_key;[m
[31m-    ngx_array_t                     *ssl_passwords;[m
[31m-[m
[31m-    ngx_ssl_t                       *ssl;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_stream_upstream_srv_conf_t  *upstream;[m
[31m-} ngx_stream_proxy_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-static void ngx_stream_proxy_handler(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_connect(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_init_upstream(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_upstream_handler(ngx_event_t *ev);[m
[31m-static void ngx_stream_proxy_downstream_handler(ngx_event_t *ev);[m
[31m-static void ngx_stream_proxy_process_connection(ngx_event_t *ev,[m
[31m-    ngx_uint_t from_upstream);[m
[31m-static void ngx_stream_proxy_connect_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);[m
[31m-static void ngx_stream_proxy_process(ngx_stream_session_t *s,[m
[31m-    ngx_uint_t from_upstream, ngx_uint_t do_write);[m
[31m-static void ngx_stream_proxy_next_upstream(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_int_t rc);[m
[31m-static u_char *ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf,[m
[31m-    size_t len);[m
[31m-[m
[31m-static void *ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static char *ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static char *ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-static void ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s);[m
[31m-static void ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc);[m
[31m-static ngx_int_t ngx_stream_proxy_ssl_name(ngx_stream_session_t *s);[m
[31m-static ngx_int_t ngx_stream_proxy_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_stream_proxy_srv_conf_t *pscf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_stream_proxy_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_deprecated_t  ngx_conf_deprecated_proxy_downstream_buffer = {[m
[31m-    ngx_conf_deprecated, "proxy_downstream_buffer", "proxy_buffer_size"[m
[31m-};[m
[31m-[m
[31m-static ngx_conf_deprecated_t  ngx_conf_deprecated_proxy_upstream_buffer = {[m
[31m-    ngx_conf_deprecated, "proxy_upstream_buffer", "proxy_buffer_size"[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_proxy_commands[] = {[m
[31m-[m
[31m-    { ngx_string("proxy_pass"),[m
[31m-      NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_proxy_pass,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_bind"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_proxy_bind,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_connect_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_buffer_size"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_downstream_buffer"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),[m
[31m-      &ngx_conf_deprecated_proxy_downstream_buffer },[m
[31m-[m
[31m-    { ngx_string("proxy_upstream_buffer"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),[m
[31m-      &ngx_conf_deprecated_proxy_upstream_buffer },[m
[31m-[m
[31m-    { ngx_string("proxy_upload_rate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, upload_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_download_rate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, download_rate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_responses"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, responses),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, next_upstream),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_tries"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_tries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_next_upstream_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_protocol"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, proxy_protocol),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-    { ngx_string("proxy_ssl"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_enable),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_session_reuse"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_session_reuse),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_protocols"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_protocols),[m
[31m-      &ngx_stream_proxy_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_ciphers"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_name"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_server_name"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_server_name),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_verify_depth"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_trusted_certificate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_crl"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_certificate_key"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("proxy_ssl_password_file"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_proxy_ssl_password_file,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_proxy_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_proxy_create_srv_conf,      /* create server configuration */[m
[31m-    ngx_stream_proxy_merge_srv_conf        /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_proxy_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_proxy_module_ctx,          /* module context */[m
[31m-    ngx_stream_proxy_commands,             /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_handler(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    u_char                          *p;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_stream_upstream_t           *u;[m
[31m-    ngx_stream_proxy_srv_conf_t     *pscf;[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                   "proxy connection handler");[m
[31m-[m
[31m-    u = ngx_pcalloc(c->pool, sizeof(ngx_stream_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream = u;[m
[31m-[m
[31m-    s->log_handler = ngx_stream_proxy_log_error;[m
[31m-[m
[31m-    u->peer.log = c->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    u->peer.local = pscf->local;[m
[31m-    u->peer.type = c->type;[m
[31m-[m
[31m-    uscf = pscf->upstream;[m
[31m-[m
[31m-    if (uscf->peer.init(s, uscf) != NGX_OK) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.start_time = ngx_current_msec;[m
[31m-[m
[31m-    if (pscf->next_upstream_tries[m
[31m-        && u->peer.tries > pscf->next_upstream_tries)[m
[31m-    {[m
[31m-        u->peer.tries = pscf->next_upstream_tries;[m
[31m-    }[m
[31m-[m
[31m-    u->proxy_protocol = pscf->proxy_protocol;[m
[31m-    u->start_sec = ngx_time();[m
[31m-[m
[31m-    c->write->handler = ngx_stream_proxy_downstream_handler;[m
[31m-    c->read->handler = ngx_stream_proxy_downstream_handler;[m
[31m-[m
[31m-    if (c->type == SOCK_DGRAM) {[m
[31m-        ngx_stream_proxy_connect(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(c->pool, pscf->buffer_size);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->downstream_buf.start = p;[m
[31m-    u->downstream_buf.end = p + pscf->buffer_size;[m
[31m-    u->downstream_buf.pos = p;[m
[31m-    u->downstream_buf.last = p;[m
[31m-[m
[31m-    if (u->proxy_protocol[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        && pscf->ssl == NULL[m
[31m-#endif[m
[31m-        && pscf->buffer_size >= NGX_PROXY_PROTOCOL_MAX_HEADER)[m
[31m-    {[m
[31m-        /* optimization for a typical case */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                       "stream proxy send PROXY protocol header");[m
[31m-[m
[31m-        p = ngx_proxy_protocol_write(c, u->downstream_buf.last,[m
[31m-                                     u->downstream_buf.end);[m
[31m-        if (p == NULL) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->downstream_buf.last = p;[m
[31m-        u->proxy_protocol = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        ngx_post_event(c->read, &ngx_posted_events);[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_connect(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_connect(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_connection_t             *c, *pc;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    c->log->action = "connecting to upstream";[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(&u->peer);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "proxy connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0, "no live upstreams");[m
[31m-        ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        ngx_stream_proxy_next_upstream(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    pc->data = s;[m
[31m-    pc->log = c->log;[m
[31m-    pc->pool = c->pool;[m
[31m-    pc->read->log = c->log;[m
[31m-    pc->write->log = c->log;[m
[31m-[m
[31m-    if (rc != NGX_AGAIN) {[m
[31m-        ngx_stream_proxy_init_upstream(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    pc->read->handler = ngx_stream_proxy_connect_handler;[m
[31m-    pc->write->handler = ngx_stream_proxy_connect_handler;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    ngx_add_timer(pc->write, pscf->connect_timeout);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_init_upstream(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    int                           tcp_nodelay;[m
[31m-    u_char                       *p;[m
[31m-    ngx_connection_t             *c, *pc;[m
[31m-    ngx_log_handler_pt            handler;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_core_srv_conf_t   *cscf;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);[m
[31m-[m
[31m-    if (pc->type == SOCK_STREAM[m
[31m-        && cscf->tcp_nodelay[m
[31m-        && pc->tcp_nodelay == NGX_TCP_NODELAY_UNSET)[m
[31m-    {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, "tcp_nodelay");[m
[31m-[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (setsockopt(pc->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int)) == -1)[m
[31m-        {[m
[31m-            ngx_connection_error(pc, ngx_socket_errno,[m
[31m-                                 "setsockopt(TCP_NODELAY) failed");[m
[31m-            ngx_stream_proxy_next_upstream(s);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        pc->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-    if (u->proxy_protocol) {[m
[31m-        if (ngx_stream_proxy_send_proxy_protocol(s) != NGX_OK) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->proxy_protocol = 0;[m
[31m-    }[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    if (pc->type == SOCK_STREAM && pscf->ssl && pc->ssl == NULL) {[m
[31m-        ngx_stream_proxy_ssl_init_connection(s);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    if (c->log->log_level >= NGX_LOG_INFO) {[m
[31m-        ngx_str_t  str;[m
[31m-        u_char     addr[NGX_SOCKADDR_STRLEN];[m
[31m-[m
[31m-        str.len = NGX_SOCKADDR_STRLEN;[m
[31m-        str.data = addr;[m
[31m-[m
[31m-        if (ngx_connection_local_sockaddr(pc, &str, 1) == NGX_OK) {[m
[31m-            handler = c->log->handler;[m
[31m-            c->log->handler = NULL;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                          "%sproxy %V connected to %V",[m
[31m-                          pc->type == SOCK_DGRAM ? "udp " : "",[m
[31m-                          &str, u->peer.name);[m
[31m-[m
[31m-            c->log->handler = handler;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log->action = "proxying connection";[m
[31m-[m
[31m-    if (u->upstream_buf.start == NULL) {[m
[31m-        p = ngx_pnalloc(c->pool, pscf->buffer_size);[m
[31m-        if (p == NULL) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        u->upstream_buf.start = p;[m
[31m-        u->upstream_buf.end = p + pscf->buffer_size;[m
[31m-        u->upstream_buf.pos = p;[m
[31m-        u->upstream_buf.last = p;[m
[31m-    }[m
[31m-[m
[31m-    if (c->type == SOCK_DGRAM) {[m
[31m-        s->received = c->buffer->last - c->buffer->pos;[m
[31m-        u->downstream_buf = *c->buffer;[m
[31m-[m
[31m-        if (pscf->responses == 0) {[m
[31m-            pc->read->ready = 0;[m
[31m-            pc->read->eof = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->connected = 1;[m
[31m-[m
[31m-    pc->read->handler = ngx_stream_proxy_upstream_handler;[m
[31m-    pc->write->handler = ngx_stream_proxy_upstream_handler;[m
[31m-[m
[31m-    if (pc->read->ready || pc->read->eof) {[m
[31m-        ngx_post_event(pc->read, &ngx_posted_events);[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_process(s, 0, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    u_char                       *p;[m
[31m-    ssize_t                       n, size;[m
[31m-    ngx_connection_t             *c, *pc;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-    u_char                        buf[NGX_PROXY_PROTOCOL_MAX_HEADER];[m
[31m-[m
[31m-    c = s->connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                   "stream proxy send PROXY protocol header");[m
[31m-[m
[31m-    p = ngx_proxy_protocol_write(c, buf, buf + NGX_PROXY_PROTOCOL_MAX_HEADER);[m
[31m-    if (p == NULL) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    size = p - buf;[m
[31m-[m
[31m-    n = pc->send(pc, buf, size);[m
[31m-[m
[31m-    if (n == NGX_AGAIN) {[m
[31m-        if (ngx_handle_write_event(pc->write, 0) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-        ngx_add_timer(pc->write, pscf->timeout);[m
[31m-[m
[31m-        pc->write->handler = ngx_stream_proxy_connect_handler;[m
[31m-[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n != size) {[m
[31m-[m
[31m-        /*[m
[31m-         * PROXY protocol specification:[m
[31m-         * The sender must always ensure that the header[m
[31m-         * is sent at once, so that the transport layer[m
[31m-         * maintains atomicity along the path to the receiver.[m
[31m-         */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "could not send PROXY protocol header at once");[m
[31m-[m
[31m-        ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t *pscf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (pscf->ssl_passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    pscf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (pscf->ssl_passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_connection_t             *pc;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(pscf->ssl, pc, NGX_SSL_BUFFER|NGX_SSL_CLIENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (pscf->ssl_server_name || pscf->ssl_verify) {[m
[31m-        if (ngx_stream_proxy_ssl_name(s) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pscf->ssl_session_reuse) {[m
[31m-        if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->connection->log->action = "SSL handshaking to upstream";[m
[31m-[m
[31m-    rc = ngx_ssl_handshake(pc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-[m
[31m-        if (!pc->write->timer_set) {[m
[31m-            ngx_add_timer(pc->write, pscf->connect_timeout);[m
[31m-        }[m
[31m-[m
[31m-        pc->ssl->handler = ngx_stream_proxy_ssl_handshake;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_ssl_handshake(pc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc)[m
[31m-{[m
[31m-    long                          rc;[m
[31m-    ngx_stream_session_t         *s;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    s = pc->data;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    if (pc->ssl->handshaked) {[m
[31m-[m
[31m-        if (pscf->ssl_verify) {[m
[31m-            rc = SSL_get_verify_result(pc->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                              "upstream SSL certificate verify error: (%l:%s)",[m
[31m-                              rc, X509_verify_cert_error_string(rc));[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            u = s->upstream;[m
[31m-[m
[31m-            if (ngx_ssl_check_host(pc, &u->ssl_name) != NGX_OK) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                              "upstream SSL certificate does not match \"%V\"",[m
[31m-                              &u->ssl_name);[m
[31m-                goto failed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (pscf->ssl_session_reuse) {[m
[31m-            u = s->upstream;[m
[31m-            u->peer.save_session(&u->peer, u->peer.data);[m
[31m-        }[m
[31m-[m
[31m-        if (pc->write->timer_set) {[m
[31m-            ngx_del_timer(pc->write);[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_proxy_init_upstream(s);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_stream_proxy_next_upstream(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_proxy_ssl_name(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    u_char                       *p, *last;[m
[31m-    ngx_str_t                     name;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    name = pscf->ssl_name;[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        name = pscf->upstream->host;[m
[31m-    }[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * ssl name here may contain port, strip it for compatibility[m
[31m-     * with the http module[m
[31m-     */[m
[31m-[m
[31m-    p = name.data;[m
[31m-    last = name.data + name.len;[m
[31m-[m
[31m-    if (*p == '[') {[m
[31m-        p = ngx_strlchr(p, last, ']');[m
[31m-[m
[31m-        if (p == NULL) {[m
[31m-            p = name.data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_strlchr(p, last, ':');[m
[31m-[m
[31m-    if (p != NULL) {[m
[31m-        name.len = p - name.data;[m
[31m-    }[m
[31m-[m
[31m-    if (!pscf->ssl_server_name) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */[m
[31m-[m
[31m-    if (name.len == 0 || *name.data == '[') {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * SSL_set_tlsext_host_name() needs a null-terminated string,[m
[31m-     * hence we explicitly null-terminate name here[m
[31m-     */[m
[31m-[m
[31m-    p = ngx_pnalloc(s->connection->pool, name.len + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(p, name.data, name.len + 1);[m
[31m-[m
[31m-    name.data = p;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "upstream SSL server name: \"%s\"", name.data);[m
[31m-[m
[31m-    if (SSL_set_tlsext_host_name(u->peer.connection->ssl->connection, name.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_ERR, s->connection->log, 0,[m
[31m-                      "SSL_set_tlsext_host_name(\"%s\") failed", name.data);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    u->ssl_name = name;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_downstream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_stream_proxy_process_connection(ev, ev->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_upstream_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_stream_proxy_process_connection(ev, !ev->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_process_connection(ngx_event_t *ev, ngx_uint_t from_upstream)[m
[31m-{[m
[31m-    ngx_connection_t             *c, *pc;[m
[31m-    ngx_stream_session_t         *s;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    s = c->data;[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    c = s->connection;[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ev->timedout = 0;[m
[31m-[m
[31m-        if (ev->delayed) {[m
[31m-            ev->delayed = 0;[m
[31m-[m
[31m-            if (!ev->ready) {[m
[31m-                if (ngx_handle_read_event(ev, 0) != NGX_OK) {[m
[31m-                    ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (u->connected && !c->read->delayed && !pc->read->delayed) {[m
[31m-                    ngx_add_timer(c->write, pscf->timeout);[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (s->connection->type == SOCK_DGRAM) {[m
[31m-                if (pscf->responses == NGX_MAX_INT32_VALUE) {[m
[31m-[m
[31m-                    /*[m
[31m-                     * successfully terminate timed out UDP session[m
[31m-                     * with unspecified number of responses[m
[31m-                     */[m
[31m-[m
[31m-                    pc->read->ready = 0;[m
[31m-                    pc->read->eof = 1;[m
[31m-[m
[31m-                    ngx_stream_proxy_process(s, 1, 0);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (u->received == 0) {[m
[31m-                    ngx_stream_proxy_next_upstream(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ngx_connection_error(c, NGX_ETIMEDOUT, "connection timed out");[m
[31m-            ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ev->delayed) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                       "stream connection delayed");[m
[31m-[m
[31m-        if (ngx_handle_read_event(ev, 0) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (from_upstream && !u->connected) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_process(s, from_upstream, ev->write);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_connect_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t      *c;[m
[31m-    ngx_stream_session_t  *s;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    s = c->data;[m
[31m-[m
[31m-    if (ev->timedout) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, "upstream timed out");[m
[31m-        ngx_stream_proxy_next_upstream(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_del_timer(c->write);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,[m
[31m-                   "stream proxy connect upstream");[m
[31m-[m
[31m-    if (ngx_stream_proxy_test_connect(c) != NGX_OK) {[m
[31m-        ngx_stream_proxy_next_upstream(s);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_init_upstream(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_proxy_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        err = c->write->kq_errno ? c->write->kq_errno : c->read->kq_errno;[m
[31m-[m
[31m-        if (err) {[m
[31m-            (void) ngx_connection_error(c, err,[m
[31m-                                    "kevent() reported that connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_socket_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream,[m
[31m-    ngx_uint_t do_write)[m
[31m-{[m
[31m-    off_t                        *received, limit;[m
[31m-    size_t                        size, limit_rate;[m
[31m-    ssize_t                       n;[m
[31m-    ngx_buf_t                    *b;[m
[31m-    ngx_uint_t                    flags;[m
[31m-    ngx_msec_t                    delay;[m
[31m-    ngx_connection_t             *c, *pc, *src, *dst;[m
[31m-    ngx_log_handler_pt            handler;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    c = s->connection;[m
[31m-    pc = u->connected ? u->peer.connection : NULL;[m
[31m-[m
[31m-    if (c->type == SOCK_DGRAM && (ngx_terminate || ngx_exiting)) {[m
[31m-[m
[31m-        /* socket is already closed on worker shutdown */[m
[31m-[m
[31m-        handler = c->log->handler;[m
[31m-        c->log->handler = NULL;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0, "disconnected on shutdown");[m
[31m-[m
[31m-        c->log->handler = handler;[m
[31m-[m
[31m-        ngx_stream_proxy_finalize(s, NGX_OK);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    if (from_upstream) {[m
[31m-        src = pc;[m
[31m-        dst = c;[m
[31m-        b = &u->upstream_buf;[m
[31m-        limit_rate = pscf->download_rate;[m
[31m-        received = &u->received;[m
[31m-[m
[31m-    } else {[m
[31m-        src = c;[m
[31m-        dst = pc;[m
[31m-        b = &u->downstream_buf;[m
[31m-        limit_rate = pscf->upload_rate;[m
[31m-        received = &s->received;[m
[31m-    }[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (do_write) {[m
[31m-[m
[31m-            size = b->last - b->pos;[m
[31m-[m
[31m-            if (size && dst && dst->write->ready) {[m
[31m-[m
[31m-                n = dst->send(dst, b->pos, size);[m
[31m-[m
[31m-                if (n == NGX_AGAIN && dst->shared) {[m
[31m-                    /* cannot wait on a shared socket */[m
[31m-                    n = NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                if (n == NGX_ERROR) {[m
[31m-                    if (c->type == SOCK_DGRAM && !from_upstream) {[m
[31m-                        ngx_stream_proxy_next_upstream(s);[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                if (n > 0) {[m
[31m-                    b->pos += n;[m
[31m-[m
[31m-                    if (b->pos == b->last) {[m
[31m-                        b->pos = b->start;[m
[31m-                        b->last = b->start;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size && src->read->ready && !src->read->delayed) {[m
[31m-[m
[31m-            if (limit_rate) {[m
[31m-                limit = (off_t) limit_rate * (ngx_time() - u->start_sec + 1)[m
[31m-                        - *received;[m
[31m-[m
[31m-                if (limit <= 0) {[m
[31m-                    src->read->delayed = 1;[m
[31m-                    delay = (ngx_msec_t) (- limit * 1000 / limit_rate + 1);[m
[31m-                    ngx_add_timer(src->read, delay);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if ((off_t) size > limit) {[m
[31m-                    size = (size_t) limit;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            n = src->recv(src, b->last, size);[m
[31m-[m
[31m-            if (n == NGX_AGAIN || n == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (n > 0) {[m
[31m-                if (limit_rate) {[m
[31m-                    delay = (ngx_msec_t) (n * 1000 / limit_rate);[m
[31m-[m
[31m-                    if (delay > 0) {[m
[31m-                        src->read->delayed = 1;[m
[31m-                        ngx_add_timer(src->read, delay);[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (c->type == SOCK_DGRAM && ++u->responses == pscf->responses)[m
[31m-                {[m
[31m-                    src->read->ready = 0;[m
[31m-                    src->read->eof = 1;[m
[31m-                }[m
[31m-[m
[31m-                *received += n;[m
[31m-                b->last += n;[m
[31m-                do_write = 1;[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                if (c->type == SOCK_DGRAM && u->received == 0) {[m
[31m-                    ngx_stream_proxy_next_upstream(s);[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                src->read->eof = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (src->read->eof && (b->pos == b->last || (dst && dst->read->eof))) {[m
[31m-        handler = c->log->handler;[m
[31m-        c->log->handler = NULL;[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, c->log, 0,[m
[31m-                      "%s%s disconnected"[m
[31m-                      ", bytes from/to client:%O/%O"[m
[31m-                      ", bytes from/to upstream:%O/%O",[m
[31m-                      src->type == SOCK_DGRAM ? "udp " : "",[m
[31m-                      from_upstream ? "upstream" : "client",[m
[31m-                      s->received, c->sent, u->received, pc ? pc->sent : 0);[m
[31m-[m
[31m-        c->log->handler = handler;[m
[31m-[m
[31m-        ngx_stream_proxy_finalize(s, NGX_OK);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    flags = src->read->eof ? NGX_CLOSE_EVENT : 0;[m
[31m-[m
[31m-    if (!src->shared && ngx_handle_read_event(src->read, flags) != NGX_OK) {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (dst) {[m
[31m-        if (!dst->shared && ngx_handle_write_event(dst->write, 0) != NGX_OK) {[m
[31m-            ngx_stream_proxy_finalize(s, NGX_ERROR);[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!c->read->delayed && !pc->read->delayed) {[m
[31m-            ngx_add_timer(c->write, pscf->timeout);[m
[31m-[m
[31m-        } else if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_next_upstream(ngx_stream_session_t *s)[m
[31m-{[m
[31m-    ngx_msec_t                    timeout;[m
[31m-    ngx_connection_t             *pc;[m
[31m-    ngx_stream_upstream_t        *u;[m
[31m-    ngx_stream_proxy_srv_conf_t  *pscf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "stream proxy next upstream");[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    if (u->peer.sockaddr) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, NGX_PEER_FAILED);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);[m
[31m-[m
[31m-    timeout = pscf->next_upstream_timeout;[m
[31m-[m
[31m-    if (u->peer.tries == 0[m
[31m-        || !pscf->next_upstream[m
[31m-        || (timeout && ngx_current_msec - u->peer.start_time >= timeout))[m
[31m-    {[m
[31m-        ngx_stream_proxy_finalize(s, NGX_DECLINED);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    if (pc) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "close proxy upstream connection: %d", pc->fd);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        if (pc->ssl) {[m
[31m-            pc->ssl->no_wait_shutdown = 1;[m
[31m-            pc->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(pc);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_close_connection(pc);[m
[31m-        u->peer.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_proxy_connect(s);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t       *pc;[m
[31m-    ngx_stream_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "finalize stream proxy: %i", rc);[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        goto noupstream;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.free && u->peer.sockaddr) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-        u->peer.sockaddr = NULL;[m
[31m-    }[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    if (pc) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                       "close stream proxy upstream connection: %d", pc->fd);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-        if (pc->ssl) {[m
[31m-            pc->ssl->no_wait_shutdown = 1;[m
[31m-            (void) ngx_ssl_shutdown(pc);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_close_connection(pc);[m
[31m-        u->peer.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-noupstream:[m
[31m-[m
[31m-    ngx_stream_close_connection(s->connection);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char                 *p;[m
[31m-    ngx_connection_t       *pc;[m
[31m-    ngx_stream_session_t   *s;[m
[31m-    ngx_stream_upstream_t  *u;[m
[31m-[m
[31m-    s = log->data;[m
[31m-[m
[31m-    u = s->upstream;[m
[31m-[m
[31m-    p = buf;[m
[31m-[m
[31m-    if (u->peer.name) {[m
[31m-        p = ngx_snprintf(p, len, ", upstream: \"%V\"", u->peer.name);[m
[31m-        len -= p - buf;[m
[31m-    }[m
[31m-[m
[31m-    pc = u->peer.connection;[m
[31m-[m
[31m-    p = ngx_snprintf(p, len,[m
[31m-                     ", bytes from/to client:%O/%O"[m
[31m-                     ", bytes from/to upstream:%O/%O",[m
[31m-                     s->received, s->connection->sent,[m
[31m-                     u->received, pc ? pc->sent : 0);[m
[31m-[m
[31m-    return p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_proxy_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->ssl_protocols = 0;[m
[31m-     *     conf->ssl_ciphers = { 0, NULL };[m
[31m-     *     conf->ssl_name = { 0, NULL };[m
[31m-     *     conf->ssl_trusted_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_crl = { 0, NULL };[m
[31m-     *     conf->ssl_certificate = { 0, NULL };[m
[31m-     *     conf->ssl_certificate_key = { 0, NULL };[m
[31m-     *[m
[31m-     *     conf->ssl = NULL;[m
[31m-     *     conf->upstream = NULL;[m
[31m-     */[m
[31m-[m
[31m-    conf->connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->next_upstream_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->upload_rate = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->download_rate = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->responses = NGX_CONF_UNSET_UINT;[m
[31m-    conf->next_upstream_tries = NGX_CONF_UNSET_UINT;[m
[31m-    conf->next_upstream = NGX_CONF_UNSET;[m
[31m-    conf->proxy_protocol = NGX_CONF_UNSET;[m
[31m-    conf->local = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    conf->ssl_enable = NGX_CONF_UNSET;[m
[31m-    conf->ssl_session_reuse = NGX_CONF_UNSET;[m
[31m-    conf->ssl_server_name = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify = NGX_CONF_UNSET;[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-    conf->ssl_passwords = NGX_CONF_UNSET_PTR;[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t *prev = parent;[m
[31m-    ngx_stream_proxy_srv_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->connect_timeout,[m
[31m-                              prev->connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->timeout,[m
[31m-                              prev->timeout, 10 * 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->next_upstream_timeout,[m
[31m-                              prev->next_upstream_timeout, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size,[m
[31m-                              prev->buffer_size, 16384);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->upload_rate,[m
[31m-                              prev->upload_rate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->download_rate,[m
[31m-                              prev->download_rate, 0);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->responses,[m
[31m-                              prev->responses, NGX_MAX_INT32_VALUE);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->next_upstream_tries,[m
[31m-                              prev->next_upstream_tries, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->next_upstream, prev->next_upstream, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->proxy_protocol, prev->proxy_protocol, 0);[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->local, prev->local, NULL);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ssl_enable, prev->ssl_enable, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ssl_session_reuse,[m
[31m-                              prev->ssl_session_reuse, 1);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                              (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                               |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers, "DEFAULT");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_name, prev->ssl_name, "");[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ssl_server_name, prev->ssl_server_name, 0);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->ssl_verify, prev->ssl_verify, 0);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                              prev->ssl_trusted_certificate, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate,[m
[31m-                              prev->ssl_certificate, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_certificate_key,[m
[31m-                              prev->ssl_certificate_key, "");[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);[m
[31m-[m
[31m-    if (conf->ssl_enable && ngx_stream_proxy_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_proxy_set_ssl(ngx_conf_t *cf, ngx_stream_proxy_srv_conf_t *pscf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    pscf->ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (pscf->ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pscf->ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(pscf->ssl, pscf->ssl_protocols, NULL) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = pscf->ssl;[m
[31m-[m
[31m-    if (pscf->ssl_certificate.len) {[m
[31m-[m
[31m-        if (pscf->ssl_certificate_key.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no \"proxy_ssl_certificate_key\" is defined "[m
[31m-                          "for certificate \"%V\"", &pscf->ssl_certificate);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_certificate(cf, pscf->ssl, &pscf->ssl_certificate,[m
[31m-                                &pscf->ssl_certificate_key, pscf->ssl_passwords)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(pscf->ssl->ctx,[m
[31m-                                (const char *) pscf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &pscf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pscf->ssl_verify) {[m
[31m-        if (pscf->ssl_trusted_certificate.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no proxy_ssl_trusted_certificate for proxy_ssl_verify");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, pscf->ssl,[m
[31m-                                        &pscf->ssl_trusted_certificate,[m
[31m-                                        pscf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_ssl_crl(cf, pscf->ssl, &pscf->ssl_crl) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t *pscf = conf;[m
[31m-[m
[31m-    ngx_url_t                    u;[m
[31m-    ngx_str_t                   *value, *url;[m
[31m-    ngx_stream_core_srv_conf_t  *cscf;[m
[31m-[m
[31m-    if (pscf->upstream) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module);[m
[31m-[m
[31m-    cscf->handler = ngx_stream_proxy_handler;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    url = &value[1];[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = *url;[m
[31m-    u.no_resolve = 1;[m
[31m-[m
[31m-    pscf->upstream = ngx_stream_upstream_add(cf, &u, 0);[m
[31m-    if (pscf->upstream == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_proxy_srv_conf_t *pscf = conf;[m
[31m-[m
[31m-    ngx_int_t   rc;[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (pscf->local != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        pscf->local = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    pscf->local = ngx_palloc(cf->pool, sizeof(ngx_addr_t));[m
[31m-    if (pscf->local == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_parse_addr(cf->pool, pscf->local, value[1].data, value[1].len);[m
[31m-[m
[31m-    switch (rc) {[m
[31m-    case NGX_OK:[m
[31m-        pscf->local->name = value[1];[m
[31m-        return NGX_CONF_OK;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid address \"%V\"", &value[1]);[m
[31m-        /* fall through */[m
[31m-[m
[31m-    default:[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_ssl_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_ssl_module.c[m
[1mdeleted file mode 100644[m
[1mindex e12da1b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_ssl_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,460 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_DEFAULT_CIPHERS     "HIGH:!aNULL:!MD5"[m
[31m-#define NGX_DEFAULT_ECDH_CURVE  "prime256v1"[m
[31m-[m
[31m-[m
[31m-static void *ngx_stream_ssl_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_ssl_merge_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-[m
[31m-static char *ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static char *ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_stream_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_ssl_commands[] = {[m
[31m-[m
[31m-    { ngx_string("ssl_handshake_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, handshake_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_key"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, certificate_key),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_password_file"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_ssl_password_file,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_dhparam"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, dhparam),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_ecdh_curve"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, ecdh_curve),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_protocols"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, protocols),[m
[31m-      &ngx_stream_ssl_protocols },[m
[31m-[m
[31m-    { ngx_string("ssl_ciphers"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_prefer_server_ciphers"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, prefer_server_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_cache"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_stream_ssl_session_cache,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_tickets"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, session_tickets),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_ticket_key"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_array_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, session_ticket_keys),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_session_timeout"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_sec_slot,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      offsetof(ngx_stream_ssl_conf_t, session_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_ssl_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_ssl_create_conf,            /* create server configuration */[m
[31m-    ngx_stream_ssl_merge_conf              /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_ssl_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_ssl_module_ctx,            /* module context */[m
[31m-    ngx_stream_ssl_commands,               /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_str_t ngx_stream_ssl_sess_id_ctx = ngx_string("STREAM");[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_ssl_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_ssl_conf_t  *scf;[m
[31m-[m
[31m-    scf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_ssl_conf_t));[m
[31m-    if (scf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     scf->protocols = 0;[m
[31m-     *     scf->certificate = { 0, NULL };[m
[31m-     *     scf->certificate_key = { 0, NULL };[m
[31m-     *     scf->dhparam = { 0, NULL };[m
[31m-     *     scf->ecdh_curve = { 0, NULL };[m
[31m-     *     scf->ciphers = { 0, NULL };[m
[31m-     *     scf->shm_zone = NULL;[m
[31m-     */[m
[31m-[m
[31m-    scf->handshake_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    scf->passwords = NGX_CONF_UNSET_PTR;[m
[31m-    scf->prefer_server_ciphers = NGX_CONF_UNSET;[m
[31m-    scf->builtin_session_cache = NGX_CONF_UNSET;[m
[31m-    scf->session_timeout = NGX_CONF_UNSET;[m
[31m-    scf->session_tickets = NGX_CONF_UNSET;[m
[31m-    scf->session_ticket_keys = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return scf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_stream_ssl_conf_t *prev = parent;[m
[31m-    ngx_stream_ssl_conf_t *conf = child;[m
[31m-[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->handshake_timeout,[m
[31m-                         prev->handshake_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_timeout,[m
[31m-                         prev->session_timeout, 300);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->prefer_server_ciphers,[m
[31m-                         prev->prefer_server_ciphers, 0);[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,[m
[31m-                         (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1[m
[31m-                          |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->certificate, prev->certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->certificate_key, prev->certificate_key, "");[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, "");[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve,[m
[31m-                         NGX_DEFAULT_ECDH_CURVE);[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);[m
[31m-[m
[31m-[m
[31m-    conf->ssl.log = cf->log;[m
[31m-[m
[31m-    if (conf->certificate.len == 0) {[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->certificate_key.len == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no \"ssl_certificate_key\" is defined "[m
[31m-                      "for certificate \"%V\"",[m
[31m-                      &conf->certificate);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create(&conf->ssl, conf->protocols, NULL) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = &conf->ssl;[m
[31m-[m
[31m-    if (ngx_ssl_certificate(cf, &conf->ssl, &conf->certificate,[m
[31m-                            &conf->certificate_key, conf->passwords)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(conf->ssl.ctx,[m
[31m-                                (const char *) conf->ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &conf->ciphers);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->prefer_server_ciphers) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);[m
[31m-    }[m
[31m-[m
[31m-#if (OPENSSL_VERSION_NUMBER < 0x10100001L && !defined LIBRESSL_VERSION_NUMBER)[m
[31m-    SSL_CTX_set_tmp_rsa_callback(conf->ssl.ctx, ngx_ssl_rsa512_key_callback);[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->builtin_session_cache,[m
[31m-                         prev->builtin_session_cache, NGX_SSL_NONE_SCACHE);[m
[31m-[m
[31m-    if (conf->shm_zone == NULL) {[m
[31m-        conf->shm_zone = prev->shm_zone;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_session_cache(&conf->ssl, &ngx_stream_ssl_sess_id_ctx,[m
[31m-                              conf->builtin_session_cache,[m
[31m-                              conf->shm_zone, conf->session_timeout)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->session_tickets,[m
[31m-                         prev->session_tickets, 1);[m
[31m-[m
[31m-#ifdef SSL_OP_NO_TICKET[m
[31m-    if (!conf->session_tickets) {[m
[31m-        SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->session_ticket_keys,[m
[31m-                         prev->session_ticket_keys, NULL);[m
[31m-[m
[31m-    if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    ngx_str_t  *value;[m
[31m-[m
[31m-    if (scf->passwords != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    scf->passwords = ngx_ssl_read_password_file(cf, &value[1]);[m
[31m-[m
[31m-    if (scf->passwords == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_ssl_conf_t  *scf = conf;[m
[31m-[m
[31m-    size_t       len;[m
[31m-    ngx_str_t   *value, name, size;[m
[31m-    ngx_int_t    n;[m
[31m-    ngx_uint_t   i, j;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "off") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_NO_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "none") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_NONE_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "builtin") == 0) {[m
[31m-            scf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("builtin:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            n = ngx_atoi(value[i].data + sizeof("builtin:") - 1,[m
[31m-                         value[i].len - (sizeof("builtin:") - 1));[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            scf->builtin_session_cache = n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (value[i].len > sizeof("shared:") - 1[m
[31m-            && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            len = 0;[m
[31m-[m
[31m-            for (j = sizeof("shared:") - 1; j < value[i].len; j++) {[m
[31m-                if (value[i].data[j] == ':') {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                len++;[m
[31m-            }[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            name.len = len;[m
[31m-            name.data = value[i].data + sizeof("shared:") - 1;[m
[31m-[m
[31m-            size.len = value[i].len - j - 1;[m
[31m-            size.data = name.data + len + 1;[m
[31m-[m
[31m-            n = ngx_parse_size(&size);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            if (n < (ngx_int_t) (8 * ngx_pagesize)) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "session cache \"%V\" is too small",[m
[31m-                                   &value[i]);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            scf->shm_zone = ngx_shared_memory_add(cf, &name, n,[m
[31m-                                                   &ngx_stream_ssl_module);[m
[31m-            if (scf->shm_zone == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            scf->shm_zone->init = ngx_ssl_session_cache_init;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    if (scf->shm_zone && scf->builtin_session_cache == NGX_CONF_UNSET) {[m
[31m-        scf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid session cache \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_ssl_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_ssl_module.h[m
[1mdeleted file mode 100644[m
[1mindex 85e8b6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_ssl_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STREAM_SSL_H_INCLUDED_[m
[31m-#define _NGX_STREAM_SSL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_msec_t       handshake_timeout;[m
[31m-[m
[31m-    ngx_flag_t       prefer_server_ciphers;[m
[31m-[m
[31m-    ngx_ssl_t        ssl;[m
[31m-[m
[31m-    ngx_uint_t       protocols;[m
[31m-[m
[31m-    ssize_t          builtin_session_cache;[m
[31m-[m
[31m-    time_t           session_timeout;[m
[31m-[m
[31m-    ngx_str_t        certificate;[m
[31m-    ngx_str_t        certificate_key;[m
[31m-    ngx_str_t        dhparam;[m
[31m-    ngx_str_t        ecdh_curve;[m
[31m-[m
[31m-    ngx_str_t        ciphers;[m
[31m-[m
[31m-    ngx_array_t     *passwords;[m
[31m-[m
[31m-    ngx_shm_zone_t  *shm_zone;[m
[31m-[m
[31m-    ngx_flag_t       session_tickets;[m
[31m-    ngx_array_t     *session_ticket_keys;[m
[31m-} ngx_stream_ssl_conf_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_stream_ssl_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STREAM_SSL_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex 69dddc5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,464 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_stream_upstream(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *dummy);[m
[31m-static char *ngx_stream_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static void *ngx_stream_upstream_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_upstream_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_upstream_commands[] = {[m
[31m-[m
[31m-    { ngx_string("upstream"),[m
[31m-      NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,[m
[31m-      ngx_stream_upstream,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("server"),[m
[31m-      NGX_STREAM_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_stream_upstream_server,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_upstream_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    ngx_stream_upstream_create_main_conf,  /* create main configuration */[m
[31m-    ngx_stream_upstream_init_main_conf,    /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_upstream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_upstream_module_ctx,       /* module context */[m
[31m-    ngx_stream_upstream_commands,          /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)[m
[31m-{[m
[31m-    char                            *rv;[m
[31m-    void                            *mconf;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_url_t                        u;[m
[31m-    ngx_uint_t                       m;[m
[31m-    ngx_conf_t                       pcf;[m
[31m-    ngx_stream_module_t             *module;[m
[31m-    ngx_stream_conf_ctx_t           *ctx, *stream_ctx;[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    u.host = value[1];[m
[31m-    u.no_resolve = 1;[m
[31m-    u.no_port = 1;[m
[31m-[m
[31m-    uscf = ngx_stream_upstream_add(cf, &u, NGX_STREAM_UPSTREAM_CREATE[m
[31m-                                           |NGX_STREAM_UPSTREAM_WEIGHT[m
[31m-                                           |NGX_STREAM_UPSTREAM_MAX_FAILS[m
[31m-                                           |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT[m
[31m-                                           |NGX_STREAM_UPSTREAM_DOWN[m
[31m-                                           |NGX_STREAM_UPSTREAM_BACKUP);[m
[31m-    if (uscf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    stream_ctx = cf->ctx;[m
[31m-    ctx->main_conf = stream_ctx->main_conf;[m
[31m-[m
[31m-    /* the upstream{}'s srv_conf */[m
[31m-[m
[31m-    ctx->srv_conf = ngx_pcalloc(cf->pool,[m
[31m-                                sizeof(void *) * ngx_stream_max_module);[m
[31m-    if (ctx->srv_conf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->srv_conf[ngx_stream_upstream_module.ctx_index] = uscf;[m
[31m-[m
[31m-    uscf->srv_conf = ctx->srv_conf;[m
[31m-[m
[31m-    for (m = 0; cf->cycle->modules[m]; m++) {[m
[31m-        if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = cf->cycle->modules[m]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            mconf = module->create_srv_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    uscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                                     sizeof(ngx_stream_upstream_server_t));[m
[31m-    if (uscf->servers == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* parse inside upstream{} */[m
[31m-[m
[31m-    pcf = *cf;[m
[31m-    cf->ctx = ctx;[m
[31m-    cf->cmd_type = NGX_STREAM_UPS_CONF;[m
[31m-[m
[31m-    rv = ngx_conf_parse(cf, NULL);[m
[31m-[m
[31m-    *cf = pcf;[m
[31m-[m
[31m-    if (rv != NGX_CONF_OK) {[m
[31m-        return rv;[m
[31m-    }[m
[31m-[m
[31m-    if (uscf->servers->nelts == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no servers are inside upstream");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf = conf;[m
[31m-[m
[31m-    time_t                         fail_timeout;[m
[31m-    ngx_str_t                     *value, s;[m
[31m-    ngx_url_t                      u;[m
[31m-    ngx_int_t                      weight, max_fails;[m
[31m-    ngx_uint_t                     i;[m
[31m-    ngx_stream_upstream_server_t  *us;[m
[31m-[m
[31m-    us = ngx_array_push(uscf->servers);[m
[31m-    if (us == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(us, sizeof(ngx_stream_upstream_server_t));[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    weight = 1;[m
[31m-    max_fails = 1;[m
[31m-    fail_timeout = 10;[m
[31m-[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_WEIGHT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            weight = ngx_atoi(&value[i].data[7], value[i].len - 7);[m
[31m-[m
[31m-            if (weight == NGX_ERROR || weight == 0) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_MAX_FAILS)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);[m
[31m-[m
[31m-            if (max_fails == NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_FAIL_TIMEOUT)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            s.len = value[i].len - 13;[m
[31m-            s.data = &value[i].data[13];[m
[31m-[m
[31m-            fail_timeout = ngx_parse_time(&s, 1);[m
[31m-[m
[31m-            if (fail_timeout == (time_t) NGX_ERROR) {[m
[31m-                goto invalid;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "backup") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_BACKUP)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->backup = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strcmp(value[i].data, "down") == 0) {[m
[31m-[m
[31m-            if (!(uscf->flags & NGX_STREAM_UPSTREAM_DOWN)) {[m
[31m-                goto not_supported;[m
[31m-            }[m
[31m-[m
[31m-            us->down = 1;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "%s in upstream \"%V\"", u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (u.no_port) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "no port in upstream \"%V\"", &u.url);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->name = u.url;[m
[31m-    us->addrs = u.addrs;[m
[31m-    us->naddrs = u.naddrs;[m
[31m-    us->weight = weight;[m
[31m-    us->max_fails = max_fails;[m
[31m-    us->fail_timeout = fail_timeout;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "invalid parameter \"%V\"", &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-not_supported:[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                       "balancing method does not support parameter \"%V\"",[m
[31m-                       &value[i]);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_stream_upstream_srv_conf_t *[m
[31m-ngx_stream_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_uint_t                        i;[m
[31m-    ngx_stream_upstream_server_t     *us;[m
[31m-    ngx_stream_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_stream_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    if (!(flags & NGX_STREAM_UPSTREAM_CREATE)) {[m
[31m-[m
[31m-        if (ngx_parse_url(cf->pool, u) != NGX_OK) {[m
[31m-            if (u->err) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "%s in upstream \"%V\"", u->err, &u->url);[m
[31m-            }[m
[31m-[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    umcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if (uscfp[i]->host.len != u->host.len[m
[31m-            || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)[m
[31m-               != 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_STREAM_UPSTREAM_CREATE)[m
[31m-             && (uscfp[i]->flags & NGX_STREAM_UPSTREAM_CREATE))[m
[31m-        {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "duplicate upstream \"%V\"", &u->host);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((uscfp[i]->flags & NGX_STREAM_UPSTREAM_CREATE) && !u->no_port) {[m
[31m-            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                               "upstream \"%V\" may not have port %d",[m
[31m-                               &u->host, u->port);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_STREAM_UPSTREAM_CREATE) && !uscfp[i]->no_port) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, cf->log, 0,[m
[31m-                          "upstream \"%V\" may not have port %d in %s:%ui",[m
[31m-                          &u->host, uscfp[i]->port,[m
[31m-                          uscfp[i]->file_name, uscfp[i]->line);[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != u->port) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_STREAM_UPSTREAM_CREATE) {[m
[31m-            uscfp[i]->flags = flags;[m
[31m-        }[m
[31m-[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_srv_conf_t));[m
[31m-    if (uscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = flags;[m
[31m-    uscf->host = u->host;[m
[31m-    uscf->file_name = cf->conf_file->file.name.data;[m
[31m-    uscf->line = cf->conf_file->line;[m
[31m-    uscf->port = u->port;[m
[31m-    uscf->no_port = u->no_port;[m
[31m-[m
[31m-    if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) {[m
[31m-        uscf->servers = ngx_array_create(cf->pool, 1,[m
[31m-                                         sizeof(ngx_stream_upstream_server_t));[m
[31m-        if (uscf->servers == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        us = ngx_array_push(uscf->servers);[m
[31m-        if (us == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(us, sizeof(ngx_stream_upstream_server_t));[m
[31m-[m
[31m-        us->addrs = u->addrs;[m
[31m-        us->naddrs = 1;[m
[31m-    }[m
[31m-[m
[31m-    uscfp = ngx_array_push(&umcf->upstreams);[m
[31m-    if (uscfp == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *uscfp = uscf;[m
[31m-[m
[31m-    return uscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_upstream_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    umcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_main_conf_t));[m
[31m-    if (umcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_array_init(&umcf->upstreams, cf->pool, 4,[m
[31m-                       sizeof(ngx_stream_upstream_srv_conf_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return umcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_stream_upstream_main_conf_t *umcf = conf;[m
[31m-[m
[31m-    ngx_uint_t                        i;[m
[31m-    ngx_stream_upstream_init_pt       init;[m
[31m-    ngx_stream_upstream_srv_conf_t  **uscfp;[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        init = uscfp[i]->peer.init_upstream[m
[31m-                                         ? uscfp[i]->peer.init_upstream[m
[31m-                                         : ngx_stream_upstream_init_round_robin;[m
[31m-[m
[31m-        if (init(cf, uscfp[i]) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex 1f4810c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,107 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STREAM_UPSTREAM_H_INCLUDED_[m
[31m-#define _NGX_STREAM_UPSTREAM_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-#include <ngx_event_connect.h>[m
[31m-[m
[31m-[m
[31m-#define NGX_STREAM_UPSTREAM_CREATE        0x0001[m
[31m-#define NGX_STREAM_UPSTREAM_WEIGHT        0x0002[m
[31m-#define NGX_STREAM_UPSTREAM_MAX_FAILS     0x0004[m
[31m-#define NGX_STREAM_UPSTREAM_FAIL_TIMEOUT  0x0008[m
[31m-#define NGX_STREAM_UPSTREAM_DOWN          0x0010[m
[31m-#define NGX_STREAM_UPSTREAM_BACKUP        0x0020[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                        upstreams;[m
[31m-                                           /* ngx_stream_upstream_srv_conf_t */[m
[31m-} ngx_stream_upstream_main_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_stream_upstream_srv_conf_s  ngx_stream_upstream_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_stream_upstream_init_pt)(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-typedef ngx_int_t (*ngx_stream_upstream_init_peer_pt)(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_upstream_init_pt        init_upstream;[m
[31m-    ngx_stream_upstream_init_peer_pt   init;[m
[31m-    void                              *data;[m
[31m-} ngx_stream_upstream_peer_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                          name;[m
[31m-    ngx_addr_t                        *addrs;[m
[31m-    ngx_uint_t                         naddrs;[m
[31m-    ngx_uint_t                         weight;[m
[31m-    ngx_uint_t                         max_fails;[m
[31m-    time_t                             fail_timeout;[m
[31m-[m
[31m-    unsigned                           down:1;[m
[31m-    unsigned                           backup:1;[m
[31m-} ngx_stream_upstream_server_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_stream_upstream_srv_conf_s {[m
[31m-    ngx_stream_upstream_peer_t         peer;[m
[31m-    void                             **srv_conf;[m
[31m-[m
[31m-    ngx_array_t                       *servers;[m
[31m-                                              /* ngx_stream_upstream_server_t */[m
[31m-[m
[31m-    ngx_uint_t                         flags;[m
[31m-    ngx_str_t                          host;[m
[31m-    u_char                            *file_name;[m
[31m-    ngx_uint_t                         line;[m
[31m-    in_port_t                          port;[m
[31m-    ngx_uint_t                         no_port;  /* unsigned no_port:1 */[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    ngx_shm_zone_t                    *shm_zone;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_peer_connection_t              peer;[m
[31m-    ngx_buf_t                          downstream_buf;[m
[31m-    ngx_buf_t                          upstream_buf;[m
[31m-    off_t                              received;[m
[31m-    time_t                             start_sec;[m
[31m-    ngx_uint_t                         responses;[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    ngx_str_t                          ssl_name;[m
[31m-#endif[m
[31m-    unsigned                           connected:1;[m
[31m-    unsigned                           proxy_protocol:1;[m
[31m-} ngx_stream_upstream_t;[m
[31m-[m
[31m-[m
[31m-ngx_stream_upstream_srv_conf_t *ngx_stream_upstream_add(ngx_conf_t *cf,[m
[31m-    ngx_url_t *u, ngx_uint_t flags);[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_conf_upstream_srv_conf(uscf, module)                       \[m
[31m-    uscf->srv_conf[module.ctx_index][m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_stream_upstream_module;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STREAM_UPSTREAM_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_hash_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_hash_module.c[m
[1mdeleted file mode 100644[m
[1mindex 56ff7d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_hash_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,656 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Roman Arutyunyan[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint32_t                              hash;[m
[31m-    ngx_str_t                            *server;[m
[31m-} ngx_stream_upstream_chash_point_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                            number;[m
[31m-    ngx_stream_upstream_chash_point_t     point[1];[m
[31m-} ngx_stream_upstream_chash_points_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_upstream_chash_points_t   *points;[m
[31m-} ngx_stream_upstream_hash_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* the round robin data must be first */[m
[31m-    ngx_stream_upstream_rr_peer_data_t    rrp;[m
[31m-    ngx_stream_upstream_hash_srv_conf_t  *conf;[m
[31m-    ngx_str_t                             key;[m
[31m-    ngx_uint_t                            tries;[m
[31m-    ngx_uint_t                            rehash;[m
[31m-    uint32_t                              hash;[m
[31m-    ngx_event_get_peer_pt                 get_rr_peer;[m
[31m-} ngx_stream_upstream_hash_peer_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_stream_upstream_init_hash(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_stream_upstream_init_hash_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_stream_upstream_get_hash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-static ngx_int_t ngx_stream_upstream_init_chash(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-static int ngx_libc_cdecl[m
[31m-    ngx_stream_upstream_chash_cmp_points(const void *one, const void *two);[m
[31m-static ngx_uint_t ngx_stream_upstream_find_chash_point([m
[31m-    ngx_stream_upstream_chash_points_t *points, uint32_t hash);[m
[31m-static ngx_int_t ngx_stream_upstream_init_chash_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_stream_upstream_get_chash_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-[m
[31m-static void *ngx_stream_upstream_hash_create_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_stream_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_upstream_hash_commands[] = {[m
[31m-[m
[31m-    { ngx_string("hash"),[m
[31m-      NGX_STREAM_UPS_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_stream_upstream_hash,[m
[31m-      NGX_STREAM_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_upstream_hash_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    ngx_stream_upstream_hash_create_conf,  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_upstream_hash_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_upstream_hash_module_ctx,  /* module context */[m
[31m-    ngx_stream_upstream_hash_commands,     /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_hash(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_stream_upstream_init_hash_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_hash_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_stream_upstream_hash_srv_conf_t   *hcf;[m
[31m-    ngx_stream_upstream_hash_peer_data_t  *hp;[m
[31m-[m
[31m-    hp = ngx_palloc(s->connection->pool,[m
[31m-                    sizeof(ngx_stream_upstream_hash_peer_data_t));[m
[31m-    if (hp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.data = &hp->rrp;[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_round_robin_peer(s, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.get = ngx_stream_upstream_get_hash_peer;[m
[31m-[m
[31m-    hcf = ngx_stream_conf_upstream_srv_conf(us,[m
[31m-                                            ngx_stream_upstream_hash_module);[m
[31m-[m
[31m-    hp->key = s->connection->addr_text;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "upstream hash key:\"%V\"", &hp->key);[m
[31m-[m
[31m-    hp->conf = hcf;[m
[31m-    hp->tries = 0;[m
[31m-    hp->rehash = 0;[m
[31m-    hp->hash = 0;[m
[31m-    hp->get_rr_peer = ngx_stream_upstream_get_round_robin_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_hash_peer_data_t *hp = data;[m
[31m-[m
[31m-    time_t                          now;[m
[31m-    u_char                          buf[NGX_INT_T_LEN];[m
[31m-    size_t                          size;[m
[31m-    uint32_t                        hash;[m
[31m-    ngx_int_t                       w;[m
[31m-    uintptr_t                       m;[m
[31m-    ngx_uint_t                      n, p;[m
[31m-    ngx_stream_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "get hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_wlock(hp->rrp.peers);[m
[31m-[m
[31m-    if (hp->tries > 20 || hp->rrp.peers->single) {[m
[31m-        ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-        return hp->get_rr_peer(pc, &hp->rrp);[m
[31m-    }[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        /*[m
[31m-         * Hash expression is compatible with Cache::Memcached:[m
[31m-         * ((crc32([REHASH] KEY) >> 16) & 0x7fff) + PREV_HASH[m
[31m-         * with REHASH omitted at the first iteration.[m
[31m-         */[m
[31m-[m
[31m-        ngx_crc32_init(hash);[m
[31m-[m
[31m-        if (hp->rehash > 0) {[m
[31m-            size = ngx_sprintf(buf, "%ui", hp->rehash) - buf;[m
[31m-            ngx_crc32_update(&hash, buf, size);[m
[31m-        }[m
[31m-[m
[31m-        ngx_crc32_update(&hash, hp->key.data, hp->key.len);[m
[31m-        ngx_crc32_final(hash);[m
[31m-[m
[31m-        hash = (hash >> 16) & 0x7fff;[m
[31m-[m
[31m-        hp->hash += hash;[m
[31m-        hp->rehash++;[m
[31m-[m
[31m-        w = hp->hash % hp->rrp.peers->total_weight;[m
[31m-        peer = hp->rrp.peers->peer;[m
[31m-        p = 0;[m
[31m-[m
[31m-        while (w >= peer->weight) {[m
[31m-            w -= peer->weight;[m
[31m-            peer = peer->next;[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        n = p / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (hp->rrp.tried[n] & m) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get hash peer, value:%uD, peer:%ui", hp->hash, p);[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            goto next;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    next:[m
[31m-[m
[31m-        if (++hp->tries > 20) {[m
[31m-            ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-            return hp->get_rr_peer(pc, &hp->rrp);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hp->rrp.current = peer;[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    if (now - peer->checked > peer->fail_timeout) {[m
[31m-        peer->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    hp->rrp.tried[n] |= m;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_chash(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    u_char                               *host, *port, c;[m
[31m-    size_t                                host_len, port_len, size;[m
[31m-    uint32_t                              hash, base_hash;[m
[31m-    ngx_str_t                            *server;[m
[31m-    ngx_uint_t                            npoints, i, j;[m
[31m-    ngx_stream_upstream_rr_peer_t        *peer;[m
[31m-    ngx_stream_upstream_rr_peers_t       *peers;[m
[31m-    ngx_stream_upstream_chash_points_t   *points;[m
[31m-    ngx_stream_upstream_hash_srv_conf_t  *hcf;[m
[31m-    union {[m
[31m-        uint32_t                          value;[m
[31m-        u_char                            byte[4];[m
[31m-    } prev_hash;[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_stream_upstream_init_chash_peer;[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-    npoints = peers->total_weight * 160;[m
[31m-[m
[31m-    size = sizeof(ngx_stream_upstream_chash_points_t)[m
[31m-           + sizeof(ngx_stream_upstream_chash_point_t) * (npoints - 1);[m
[31m-[m
[31m-    points = ngx_palloc(cf->pool, size);[m
[31m-    if (points == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    points->number = 0;[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        server = &peer->server;[m
[31m-[m
[31m-        /*[m
[31m-         * Hash expression is compatible with Cache::Memcached::Fast:[m
[31m-         * crc32(HOST \0 PORT PREV_HASH).[m
[31m-         */[m
[31m-[m
[31m-        if (server->len >= 5[m
[31m-            && ngx_strncasecmp(server->data, (u_char *) "unix:", 5) == 0)[m
[31m-        {[m
[31m-            host = server->data + 5;[m
[31m-            host_len = server->len - 5;[m
[31m-            port = NULL;[m
[31m-            port_len = 0;[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        for (j = 0; j < server->len; j++) {[m
[31m-            c = server->data[server->len - j - 1];[m
[31m-[m
[31m-            if (c == ':') {[m
[31m-                host = server->data;[m
[31m-                host_len = server->len - j - 1;[m
[31m-                port = server->data + server->len - j;[m
[31m-                port_len = j;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (c < '0' || c > '9') {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        host = server->data;[m
[31m-        host_len = server->len;[m
[31m-        port = NULL;[m
[31m-        port_len = 0;[m
[31m-[m
[31m-    done:[m
[31m-[m
[31m-        ngx_crc32_init(base_hash);[m
[31m-        ngx_crc32_update(&base_hash, host, host_len);[m
[31m-        ngx_crc32_update(&base_hash, (u_char *) "", 1);[m
[31m-        ngx_crc32_update(&base_hash, port, port_len);[m
[31m-[m
[31m-        prev_hash.value = 0;[m
[31m-        npoints = peer->weight * 160;[m
[31m-[m
[31m-        for (j = 0; j < npoints; j++) {[m
[31m-            hash = base_hash;[m
[31m-[m
[31m-            ngx_crc32_update(&hash, prev_hash.byte, 4);[m
[31m-            ngx_crc32_final(hash);[m
[31m-[m
[31m-            points->point[points->number].hash = hash;[m
[31m-            points->point[points->number].server = server;[m
[31m-            points->number++;[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN)[m
[31m-            prev_hash.value = hash;[m
[31m-#else[m
[31m-            prev_hash.byte[0] = (u_char) (hash & 0xff);[m
[31m-            prev_hash.byte[1] = (u_char) ((hash >> 8) & 0xff);[m
[31m-            prev_hash.byte[2] = (u_char) ((hash >> 16) & 0xff);[m
[31m-            prev_hash.byte[3] = (u_char) ((hash >> 24) & 0xff);[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_qsort(points->point,[m
[31m-              points->number,[m
[31m-              sizeof(ngx_stream_upstream_chash_point_t),[m
[31m-              ngx_stream_upstream_chash_cmp_points);[m
[31m-[m
[31m-    for (i = 0, j = 1; j < points->number; j++) {[m
[31m-        if (points->point[i].hash != points->point[j].hash) {[m
[31m-            points->point[++i] = points->point[j];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    points->number = i + 1;[m
[31m-[m
[31m-    hcf = ngx_stream_conf_upstream_srv_conf(us,[m
[31m-                                            ngx_stream_upstream_hash_module);[m
[31m-    hcf->points = points;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int ngx_libc_cdecl[m
[31m-ngx_stream_upstream_chash_cmp_points(const void *one, const void *two)[m
[31m-{[m
[31m-    ngx_stream_upstream_chash_point_t *first =[m
[31m-                                     (ngx_stream_upstream_chash_point_t *) one;[m
[31m-    ngx_stream_upstream_chash_point_t *second =[m
[31m-                                     (ngx_stream_upstream_chash_point_t *) two;[m
[31m-[m
[31m-    if (first->hash < second->hash) {[m
[31m-        return -1;[m
[31m-[m
[31m-    } else if (first->hash > second->hash) {[m
[31m-        return 1;[m
[31m-[m
[31m-    } else {[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_stream_upstream_find_chash_point(ngx_stream_upstream_chash_points_t *points,[m
[31m-    uint32_t hash)[m
[31m-{[m
[31m-    ngx_uint_t                          i, j, k;[m
[31m-    ngx_stream_upstream_chash_point_t  *point;[m
[31m-[m
[31m-    /* find first point >= hash */[m
[31m-[m
[31m-    point = &points->point[0];[m
[31m-[m
[31m-    i = 0;[m
[31m-    j = points->number;[m
[31m-[m
[31m-    while (i < j) {[m
[31m-        k = (i + j) / 2;[m
[31m-[m
[31m-        if (hash > point[k].hash) {[m
[31m-            i = k + 1;[m
[31m-[m
[31m-        } else if (hash < point[k].hash) {[m
[31m-            j = k;[m
[31m-[m
[31m-        } else {[m
[31m-            return k;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return i;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_chash_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    uint32_t                               hash;[m
[31m-    ngx_stream_upstream_hash_srv_conf_t   *hcf;[m
[31m-    ngx_stream_upstream_hash_peer_data_t  *hp;[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_hash_peer(s, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.get = ngx_stream_upstream_get_chash_peer;[m
[31m-[m
[31m-    hp = s->upstream->peer.data;[m
[31m-    hcf = ngx_stream_conf_upstream_srv_conf(us,[m
[31m-                                            ngx_stream_upstream_hash_module);[m
[31m-[m
[31m-    hash = ngx_crc32_long(hp->key.data, hp->key.len);[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_rlock(hp->rrp.peers);[m
[31m-[m
[31m-    hp->hash = ngx_stream_upstream_find_chash_point(hcf->points, hash);[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_hash_peer_data_t *hp = data;[m
[31m-[m
[31m-    time_t                                now;[m
[31m-    intptr_t                              m;[m
[31m-    ngx_str_t                            *server;[m
[31m-    ngx_int_t                             total;[m
[31m-    ngx_uint_t                            i, n, best_i;[m
[31m-    ngx_stream_upstream_rr_peer_t        *peer, *best;[m
[31m-    ngx_stream_upstream_chash_point_t    *point;[m
[31m-    ngx_stream_upstream_chash_points_t   *points;[m
[31m-    ngx_stream_upstream_hash_srv_conf_t  *hcf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "get consistent hash peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_wlock(hp->rrp.peers);[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-    hcf = hp->conf;[m
[31m-[m
[31m-    points = hcf->points;[m
[31m-    point = &points->point[0];[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        server = point[hp->hash % points->number].server;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "consistent hash peer:%uD, server:\"%V\"",[m
[31m-                       hp->hash, server);[m
[31m-[m
[31m-        best = NULL;[m
[31m-        best_i = 0;[m
[31m-        total = 0;[m
[31m-[m
[31m-        for (peer = hp->rrp.peers->peer, i = 0;[m
[31m-             peer;[m
[31m-             peer = peer->next, i++)[m
[31m-        {[m
[31m-[m
[31m-            n = i / (8 * sizeof(uintptr_t));[m
[31m-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-            if (hp->rrp.tried[n] & m) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->down) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->server.len != server->len[m
[31m-                || ngx_strncmp(peer->server.data, server->data, server->len)[m
[31m-                   != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->max_fails[m
[31m-                && peer->fails >= peer->max_fails[m
[31m-                && now - peer->checked <= peer->fail_timeout)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            peer->current_weight += peer->effective_weight;[m
[31m-            total += peer->effective_weight;[m
[31m-[m
[31m-            if (peer->effective_weight < peer->weight) {[m
[31m-                peer->effective_weight++;[m
[31m-            }[m
[31m-[m
[31m-            if (best == NULL || peer->current_weight > best->current_weight) {[m
[31m-                best = peer;[m
[31m-                best_i = i;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (best) {[m
[31m-            best->current_weight -= total;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        hp->hash++;[m
[31m-        hp->tries++;[m
[31m-[m
[31m-        if (hp->tries >= points->number) {[m
[31m-            ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-            return NGX_BUSY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hp->rrp.current = best;[m
[31m-[m
[31m-    pc->sockaddr = best->sockaddr;[m
[31m-    pc->socklen = best->socklen;[m
[31m-    pc->name = &best->name;[m
[31m-[m
[31m-    best->conns++;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);[m
[31m-[m
[31m-    n = best_i / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    hp->rrp.tried[n] |= m;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_stream_upstream_hash_create_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_stream_upstream_hash_srv_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_stream_upstream_hash_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    conf->points = NULL;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "$remote_addr")) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "unsupported hash key \"%V\", use $remote_addr",[m
[31m-                           &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->flags = NGX_STREAM_UPSTREAM_CREATE[m
[31m-                  |NGX_STREAM_UPSTREAM_WEIGHT[m
[31m-                  |NGX_STREAM_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_STREAM_UPSTREAM_DOWN;[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        uscf->peer.init_upstream = ngx_stream_upstream_init_hash;[m
[31m-[m
[31m-    } else if (ngx_strcmp(value[2].data, "consistent") == 0) {[m
[31m-        uscf->peer.init_upstream = ngx_stream_upstream_init_chash;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid parameter \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_least_conn_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_least_conn_module.c[m
[1mdeleted file mode 100644[m
[1mindex c9719f9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_least_conn_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,307 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Maxim Dounin[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_stream_upstream_init_least_conn_peer([m
[31m-    ngx_stream_session_t *s, ngx_stream_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_stream_upstream_get_least_conn_peer([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-static char *ngx_stream_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_upstream_least_conn_commands[] = {[m
[31m-[m
[31m-    { ngx_string("least_conn"),[m
[31m-      NGX_STREAM_UPS_CONF|NGX_CONF_NOARGS,[m
[31m-      ngx_stream_upstream_least_conn,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_upstream_least_conn_module_ctx = {[m
[31m-    NULL,                                    /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                    /* create main configuration */[m
[31m-    NULL,                                    /* init main configuration */[m
[31m-[m
[31m-    NULL,                                    /* create server configuration */[m
[31m-    NULL,                                    /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_upstream_least_conn_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_upstream_least_conn_module_ctx, /* module context */[m
[31m-    ngx_stream_upstream_least_conn_commands, /* module directives */[m
[31m-    NGX_STREAM_MODULE,                       /* module type */[m
[31m-    NULL,                                    /* init master */[m
[31m-    NULL,                                    /* init module */[m
[31m-    NULL,                                    /* init process */[m
[31m-    NULL,                                    /* init thread */[m
[31m-    NULL,                                    /* exit thread */[m
[31m-    NULL,                                    /* exit process */[m
[31m-    NULL,                                    /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_least_conn(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, cf->log, 0,[m
[31m-                   "init least conn");[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.init = ngx_stream_upstream_init_least_conn_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_least_conn_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,[m
[31m-                   "init least conn peer");[m
[31m-[m
[31m-    if (ngx_stream_upstream_init_round_robin_peer(s, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.get = ngx_stream_upstream_get_least_conn_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t *rrp = data;[m
[31m-[m
[31m-    time_t                           now;[m
[31m-    uintptr_t                        m;[m
[31m-    ngx_int_t                        rc, total;[m
[31m-    ngx_uint_t                       i, n, p, many;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer, *best;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "get least conn peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    if (rrp->peers->single) {[m
[31m-        return ngx_stream_upstream_get_round_robin_peer(pc, rrp);[m
[31m-    }[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_wlock(peers);[m
[31m-[m
[31m-    best = NULL;[m
[31m-    total = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    many = 0;[m
[31m-    p = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (peer = peers->peer, i = 0;[m
[31m-         peer;[m
[31m-         peer = peer->next, i++)[m
[31m-    {[m
[31m-[m
[31m-        n = i / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (rrp->tried[n] & m) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /*[m
[31m-         * select peer with least number of connections; if there are[m
[31m-         * multiple peers with the same number of connections, select[m
[31m-         * based on round-robin[m
[31m-         */[m
[31m-[m
[31m-        if (best == NULL[m
[31m-            || peer->conns * best->weight < best->conns * peer->weight)[m
[31m-        {[m
[31m-            best = peer;[m
[31m-            many = 0;[m
[31m-            p = i;[m
[31m-[m
[31m-        } else if (peer->conns * best->weight == best->conns * peer->weight) {[m
[31m-            many = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (best == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get least conn peer, no peer found");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (many) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get least conn peer, many");[m
[31m-[m
[31m-        for (peer = best, i = p;[m
[31m-             peer;[m
[31m-             peer = peer->next, i++)[m
[31m-        {[m
[31m-            n = i / (8 * sizeof(uintptr_t));[m
[31m-            m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-            if (rrp->tried[n] & m) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->down) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->conns * best->weight != best->conns * peer->weight) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->max_fails[m
[31m-                && peer->fails >= peer->max_fails[m
[31m-                && now - peer->checked <= peer->fail_timeout)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            peer->current_weight += peer->effective_weight;[m
[31m-            total += peer->effective_weight;[m
[31m-[m
[31m-            if (peer->effective_weight < peer->weight) {[m
[31m-                peer->effective_weight++;[m
[31m-            }[m
[31m-[m
[31m-            if (peer->current_weight > best->current_weight) {[m
[31m-                best = peer;[m
[31m-                p = i;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    best->current_weight -= total;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    pc->sockaddr = best->sockaddr;[m
[31m-    pc->socklen = best->socklen;[m
[31m-    pc->name = &best->name;[m
[31m-[m
[31m-    best->conns++;[m
[31m-[m
[31m-    rrp->current = best;[m
[31m-[m
[31m-    n = p / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    rrp->tried[n] |= m;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (peers->next) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get least conn peer, backup servers");[m
[31m-[m
[31m-        rrp->peers = peers->next;[m
[31m-[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            rrp->tried[i] = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        rc = ngx_stream_upstream_get_least_conn_peer(pc, rrp);[m
[31m-[m
[31m-        if (rc != NGX_BUSY) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_wlock(peers);[m
[31m-    }[m
[31m-[m
[31m-    /* all peers failed, mark them as live for quick recovery */[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        peer->fails = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    pc->name = peers->name;[m
[31m-[m
[31m-    return NGX_BUSY;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_stream_upstream_srv_conf_t  *uscf;[m
[31m-[m
[31m-    uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_stream_upstream_init_least_conn;[m
[31m-[m
[31m-    uscf->flags = NGX_STREAM_UPSTREAM_CREATE[m
[31m-                  |NGX_STREAM_UPSTREAM_WEIGHT[m
[31m-                  |NGX_STREAM_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_STREAM_UPSTREAM_DOWN[m
[31m-                  |NGX_STREAM_UPSTREAM_BACKUP;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.c[m
[1mdeleted file mode 100644[m
[1mindex e1ab592..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.c[m
[1m+++ /dev/null[m
[36m@@ -1,702 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_upstream_tries(p) ((p)->number                             \[m
[31m-                                      + ((p)->next ? (p)->next->number : 0))[m
[31m-[m
[31m-[m
[31m-static ngx_stream_upstream_rr_peer_t *ngx_stream_upstream_get_peer([m
[31m-    ngx_stream_upstream_rr_peer_data_t *rrp);[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static ngx_int_t ngx_stream_upstream_set_round_robin_peer_session([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-static void ngx_stream_upstream_save_round_robin_peer_session([m
[31m-    ngx_peer_connection_t *pc, void *data);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_url_t                        u;[m
[31m-    ngx_uint_t                       i, j, n, w;[m
[31m-    ngx_stream_upstream_server_t    *server;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer, **peerp;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers, *backup;[m
[31m-[m
[31m-    us->peer.init = ngx_stream_upstream_init_round_robin_peer;[m
[31m-[m
[31m-    if (us->servers) {[m
[31m-        server = us->servers->elts;[m
[31m-[m
[31m-        n = 0;[m
[31m-        w = 0;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n += server[i].naddrs;[m
[31m-            w += server[i].naddrs * server[i].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no servers in upstream \"%V\" in %s:%ui",[m
[31m-                          &us->host, us->file_name, us->line);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-        if (peers == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) * n);[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers->single = (n == 1);[m
[31m-        peers->number = n;[m
[31m-        peers->weighted = (w != n);[m
[31m-        peers->total_weight = w;[m
[31m-        peers->name = &us->host;[m
[31m-[m
[31m-        n = 0;[m
[31m-        peerp = &peers->peer;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-                peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-                peer[n].name = server[i].addrs[j].name;[m
[31m-                peer[n].weight = server[i].weight;[m
[31m-                peer[n].effective_weight = server[i].weight;[m
[31m-                peer[n].current_weight = 0;[m
[31m-                peer[n].max_fails = server[i].max_fails;[m
[31m-                peer[n].fail_timeout = server[i].fail_timeout;[m
[31m-                peer[n].down = server[i].down;[m
[31m-                peer[n].server = server[i].name;[m
[31m-[m
[31m-                *peerp = &peer[n];[m
[31m-                peerp = &peer[n].next;[m
[31m-                n++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        us->peer.data = peers;[m
[31m-[m
[31m-        /* backup servers */[m
[31m-[m
[31m-        n = 0;[m
[31m-        w = 0;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (!server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            n += server[i].naddrs;[m
[31m-            w += server[i].naddrs * server[i].weight;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        backup = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-        if (backup == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) * n);[m
[31m-        if (peer == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        peers->single = 0;[m
[31m-        backup->single = 0;[m
[31m-        backup->number = n;[m
[31m-        backup->weighted = (w != n);[m
[31m-        backup->total_weight = w;[m
[31m-        backup->name = &us->host;[m
[31m-[m
[31m-        n = 0;[m
[31m-        peerp = &backup->peer;[m
[31m-[m
[31m-        for (i = 0; i < us->servers->nelts; i++) {[m
[31m-            if (!server[i].backup) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-                peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-                peer[n].name = server[i].addrs[j].name;[m
[31m-                peer[n].weight = server[i].weight;[m
[31m-                peer[n].effective_weight = server[i].weight;[m
[31m-                peer[n].current_weight = 0;[m
[31m-                peer[n].max_fails = server[i].max_fails;[m
[31m-                peer[n].fail_timeout = server[i].fail_timeout;[m
[31m-                peer[n].down = server[i].down;[m
[31m-                peer[n].server = server[i].name;[m
[31m-[m
[31m-                *peerp = &peer[n];[m
[31m-                peerp = &peer[n].next;[m
[31m-                n++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        peers->next = backup;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* an upstream implicitly defined by proxy_pass, etc. */[m
[31m-[m
[31m-    if (us->port == 0) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "no port in upstream \"%V\" in %s:%ui",[m
[31m-                      &us->host, us->file_name, us->line);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.host = us->host;[m
[31m-    u.port = us->port;[m
[31m-[m
[31m-    if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "%s in upstream \"%V\" in %s:%ui",[m
[31m-                          u.err, &us->host, us->file_name, us->line);[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = u.naddrs;[m
[31m-[m
[31m-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) * n);[m
[31m-    if (peer == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (n == 1);[m
[31m-    peers->number = n;[m
[31m-    peers->weighted = 0;[m
[31m-    peers->total_weight = n;[m
[31m-    peers->name = &us->host;[m
[31m-[m
[31m-    peerp = &peers->peer;[m
[31m-[m
[31m-    for (i = 0; i < u.naddrs; i++) {[m
[31m-        peer[i].sockaddr = u.addrs[i].sockaddr;[m
[31m-        peer[i].socklen = u.addrs[i].socklen;[m
[31m-        peer[i].name = u.addrs[i].name;[m
[31m-        peer[i].weight = 1;[m
[31m-        peer[i].effective_weight = 1;[m
[31m-        peer[i].current_weight = 0;[m
[31m-        peer[i].max_fails = 1;[m
[31m-        peer[i].fail_timeout = 10;[m
[31m-        *peerp = &peer[i];[m
[31m-        peerp = &peer[i].next;[m
[31m-    }[m
[31m-[m
[31m-    us->peer.data = peers;[m
[31m-[m
[31m-    /* implicitly defined upstream has no backup servers */[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_uint_t                           n;[m
[31m-    ngx_stream_upstream_rr_peer_data_t  *rrp;[m
[31m-[m
[31m-    rrp = s->upstream->peer.data;[m
[31m-[m
[31m-    if (rrp == NULL) {[m
[31m-        rrp = ngx_palloc(s->connection->pool,[m
[31m-                         sizeof(ngx_stream_upstream_rr_peer_data_t));[m
[31m-        if (rrp == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        s->upstream->peer.data = rrp;[m
[31m-    }[m
[31m-[m
[31m-    rrp->peers = us->peer.data;[m
[31m-    rrp->current = NULL;[m
[31m-[m
[31m-    n = rrp->peers->number;[m
[31m-[m
[31m-    if (rrp->peers->next && rrp->peers->next->number > n) {[m
[31m-        n = rrp->peers->next->number;[m
[31m-    }[m
[31m-[m
[31m-    if (n <= 8 * sizeof(uintptr_t)) {[m
[31m-        rrp->tried = &rrp->data;[m
[31m-        rrp->data = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        rrp->tried = ngx_pcalloc(s->connection->pool, n * sizeof(uintptr_t));[m
[31m-        if (rrp->tried == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s->upstream->peer.get = ngx_stream_upstream_get_round_robin_peer;[m
[31m-    s->upstream->peer.free = ngx_stream_upstream_free_round_robin_peer;[m
[31m-    s->upstream->peer.tries = ngx_stream_upstream_tries(rrp->peers);[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    s->upstream->peer.set_session =[m
[31m-                             ngx_stream_upstream_set_round_robin_peer_session;[m
[31m-    s->upstream->peer.save_session =[m
[31m-                             ngx_stream_upstream_save_round_robin_peer_session;[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t *rrp = data;[m
[31m-[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_uint_t                       i, n;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "get rr peer, try: %ui", pc->tries);[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-    peers = rrp->peers;[m
[31m-    ngx_stream_upstream_rr_peers_wlock(peers);[m
[31m-[m
[31m-    if (peers->single) {[m
[31m-        peer = peers->peer;[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        rrp->current = peer;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* there are several peers */[m
[31m-[m
[31m-        peer = ngx_stream_upstream_get_peer(rrp);[m
[31m-[m
[31m-        if (peer == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "get rr peer, current: %p %i",[m
[31m-                       peer, peer->current_weight);[m
[31m-    }[m
[31m-[m
[31m-    pc->sockaddr = peer->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->name = &peer->name;[m
[31m-[m
[31m-    peer->conns++;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (peers->next) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, "backup servers");[m
[31m-[m
[31m-        rrp->peers = peers->next;[m
[31m-[m
[31m-        n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))[m
[31m-                / (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        for (i = 0; i < n; i++) {[m
[31m-            rrp->tried[i] = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        rc = ngx_stream_upstream_get_round_robin_peer(pc, rrp);[m
[31m-[m
[31m-        if (rc != NGX_BUSY) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_wlock(peers);[m
[31m-    }[m
[31m-[m
[31m-    /* all peers failed, mark them as live for quick recovery */[m
[31m-[m
[31m-    for (peer = peers->peer; peer; peer = peer->next) {[m
[31m-        peer->fails = 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-    pc->name = peers->name;[m
[31m-[m
[31m-    return NGX_BUSY;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_stream_upstream_rr_peer_t *[m
[31m-ngx_stream_upstream_get_peer(ngx_stream_upstream_rr_peer_data_t *rrp)[m
[31m-{[m
[31m-    time_t                          now;[m
[31m-    uintptr_t                       m;[m
[31m-    ngx_int_t                       total;[m
[31m-    ngx_uint_t                      i, n, p;[m
[31m-    ngx_stream_upstream_rr_peer_t  *peer, *best;[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-[m
[31m-    best = NULL;[m
[31m-    total = 0;[m
[31m-[m
[31m-#if (NGX_SUPPRESS_WARN)[m
[31m-    p = 0;[m
[31m-#endif[m
[31m-[m
[31m-    for (peer = rrp->peers->peer, i = 0;[m
[31m-         peer;[m
[31m-         peer = peer->next, i++)[m
[31m-    {[m
[31m-[m
[31m-        n = i / (8 * sizeof(uintptr_t));[m
[31m-        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-        if (rrp->tried[n] & m) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->down) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (peer->max_fails[m
[31m-            && peer->fails >= peer->max_fails[m
[31m-            && now - peer->checked <= peer->fail_timeout)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        peer->current_weight += peer->effective_weight;[m
[31m-        total += peer->effective_weight;[m
[31m-[m
[31m-        if (peer->effective_weight < peer->weight) {[m
[31m-            peer->effective_weight++;[m
[31m-        }[m
[31m-[m
[31m-        if (best == NULL || peer->current_weight > best->current_weight) {[m
[31m-            best = peer;[m
[31m-            p = i;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (best == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    rrp->current = best;[m
[31m-[m
[31m-    n = p / (8 * sizeof(uintptr_t));[m
[31m-    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));[m
[31m-[m
[31m-    rrp->tried[n] |= m;[m
[31m-[m
[31m-    best->current_weight -= total;[m
[31m-[m
[31m-    if (now - best->checked > best->fail_timeout) {[m
[31m-        best->checked = now;[m
[31m-    }[m
[31m-[m
[31m-    return best;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    time_t                          now;[m
[31m-    ngx_stream_upstream_rr_peer_t  *peer;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "free rr peer %ui %ui", pc->tries, state);[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_rlock(rrp->peers);[m
[31m-    ngx_stream_upstream_rr_peer_lock(rrp->peers, peer);[m
[31m-[m
[31m-    if (rrp->peers->single) {[m
[31m-        peer->conns--;[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peer_unlock(rrp->peers, peer);[m
[31m-        ngx_stream_upstream_rr_peers_unlock(rrp->peers);[m
[31m-[m
[31m-        pc->tries = 0;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED) {[m
[31m-        now = ngx_time();[m
[31m-[m
[31m-        peer->fails++;[m
[31m-        peer->accessed = now;[m
[31m-        peer->checked = now;[m
[31m-[m
[31m-        if (peer->max_fails) {[m
[31m-            peer->effective_weight -= peer->weight / peer->max_fails;[m
[31m-[m
[31m-            if (peer->fails >= peer->max_fails) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, pc->log, 0,[m
[31m-                              "upstream server temporarily disabled");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "free rr peer failed: %p %i",[m
[31m-                       peer, peer->effective_weight);[m
[31m-[m
[31m-        if (peer->effective_weight < 0) {[m
[31m-            peer->effective_weight = 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /* mark peer live if check passed */[m
[31m-[m
[31m-        if (peer->accessed < peer->checked) {[m
[31m-            peer->fails = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    peer->conns--;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peer_unlock(rrp->peers, peer);[m
[31m-    ngx_stream_upstream_rr_peers_unlock(rrp->peers);[m
[31m-[m
[31m-    if (pc->tries) {[m
[31m-        pc->tries--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_ssl_session_t               *ssl_session;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer;[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    int                              len;[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x0090707fL[m
[31m-    const[m
[31m-#endif[m
[31m-    u_char                          *p;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-    u_char                           buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-#endif[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    if (peers->shpool) {[m
[31m-        ngx_stream_upstream_rr_peers_rlock(peers);[m
[31m-        ngx_stream_upstream_rr_peer_lock(peers, peer);[m
[31m-[m
[31m-        if (peer->ssl_session == NULL) {[m
[31m-            ngx_stream_upstream_rr_peer_unlock(peers, peer);[m
[31m-            ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        len = peer->ssl_session_len;[m
[31m-[m
[31m-        ngx_memcpy(buf, peer->ssl_session, len);[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peer_unlock(peers, peer);[m
[31m-        ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        p = buf;[m
[31m-        ssl_session = d2i_SSL_SESSION(NULL, &p, len);[m
[31m-[m
[31m-        rc = ngx_ssl_set_session(pc->connection, ssl_session);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "set session: %p", ssl_session);[m
[31m-[m
[31m-        ngx_ssl_free_session(ssl_session);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ssl_session = peer->ssl_session;[m
[31m-[m
[31m-    rc = ngx_ssl_set_session(pc->connection, ssl_session);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "set session: %p", ssl_session);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_stream_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,[m
[31m-    void *data)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_data_t  *rrp = data;[m
[31m-[m
[31m-    ngx_ssl_session_t               *old_ssl_session, *ssl_session;[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer;[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    int                              len;[m
[31m-    u_char                          *p;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-    u_char                           buf[NGX_SSL_MAX_SESSION_SIZE];[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    peers = rrp->peers;[m
[31m-[m
[31m-    if (peers->shpool) {[m
[31m-[m
[31m-        ssl_session = SSL_get0_session(pc->connection->ssl->connection);[m
[31m-[m
[31m-        if (ssl_session == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "save session: %p", ssl_session);[m
[31m-[m
[31m-        len = i2d_SSL_SESSION(ssl_session, NULL);[m
[31m-[m
[31m-        /* do not cache too big session */[m
[31m-[m
[31m-        if (len > NGX_SSL_MAX_SESSION_SIZE) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        p = buf;[m
[31m-        (void) i2d_SSL_SESSION(ssl_session, &p);[m
[31m-[m
[31m-        peer = rrp->current;[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peers_rlock(peers);[m
[31m-        ngx_stream_upstream_rr_peer_lock(peers, peer);[m
[31m-[m
[31m-        if (len > peer->ssl_session_len) {[m
[31m-            ngx_shmtx_lock(&peers->shpool->mutex);[m
[31m-[m
[31m-            if (peer->ssl_session) {[m
[31m-                ngx_slab_free_locked(peers->shpool, peer->ssl_session);[m
[31m-            }[m
[31m-[m
[31m-            peer->ssl_session = ngx_slab_alloc_locked(peers->shpool, len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&peers->shpool->mutex);[m
[31m-[m
[31m-            if (peer->ssl_session == NULL) {[m
[31m-                peer->ssl_session_len = 0;[m
[31m-[m
[31m-                ngx_stream_upstream_rr_peer_unlock(peers, peer);[m
[31m-                ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            peer->ssl_session_len = len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer->ssl_session, buf, len);[m
[31m-[m
[31m-        ngx_stream_upstream_rr_peer_unlock(peers, peer);[m
[31m-        ngx_stream_upstream_rr_peers_unlock(peers);[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ssl_session = ngx_ssl_get_session(pc->connection);[m
[31m-[m
[31m-    if (ssl_session == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                   "save session: %p", ssl_session);[m
[31m-[m
[31m-    peer = rrp->current;[m
[31m-[m
[31m-    old_ssl_session = peer->ssl_session;[m
[31m-    peer->ssl_session = ssl_session;[m
[31m-[m
[31m-    if (old_ssl_session) {[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,[m
[31m-                       "old session: %p", old_ssl_session);[m
[31m-[m
[31m-        /* TODO: may block */[m
[31m-[m
[31m-        ngx_ssl_free_session(old_ssl_session);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.h[m
[1mdeleted file mode 100644[m
[1mindex 77ee0ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_round_robin.h[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_[m
[31m-#define _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_stream_upstream_rr_peer_s   ngx_stream_upstream_rr_peer_t;[m
[31m-[m
[31m-struct ngx_stream_upstream_rr_peer_s {[m
[31m-    struct sockaddr                 *sockaddr;[m
[31m-    socklen_t                        socklen;[m
[31m-    ngx_str_t                        name;[m
[31m-    ngx_str_t                        server;[m
[31m-[m
[31m-    ngx_int_t                        current_weight;[m
[31m-    ngx_int_t                        effective_weight;[m
[31m-    ngx_int_t                        weight;[m
[31m-[m
[31m-    ngx_uint_t                       conns;[m
[31m-[m
[31m-    ngx_uint_t                       fails;[m
[31m-    time_t                           accessed;[m
[31m-    time_t                           checked;[m
[31m-[m
[31m-    ngx_uint_t                       max_fails;[m
[31m-    time_t                           fail_timeout;[m
[31m-[m
[31m-    ngx_uint_t                       down;         /* unsigned  down:1; */[m
[31m-[m
[31m-#if (NGX_STREAM_SSL)[m
[31m-    void                            *ssl_session;[m
[31m-    int                              ssl_session_len;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peer_t   *next;[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    ngx_atomic_t                     lock;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_stream_upstream_rr_peers_s  ngx_stream_upstream_rr_peers_t;[m
[31m-[m
[31m-struct ngx_stream_upstream_rr_peers_s {[m
[31m-    ngx_uint_t                       number;[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-    ngx_slab_pool_t                 *shpool;[m
[31m-    ngx_atomic_t                     rwlock;[m
[31m-    ngx_stream_upstream_rr_peers_t  *zone_next;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_uint_t                       total_weight;[m
[31m-[m
[31m-    unsigned                         single:1;[m
[31m-    unsigned                         weighted:1;[m
[31m-[m
[31m-    ngx_str_t                       *name;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peers_t  *next;[m
[31m-[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_STREAM_UPSTREAM_ZONE)[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peers_rlock(peers)                             \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_rlock(&peers->rwlock);                                     \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peers_wlock(peers)                             \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_wlock(&peers->rwlock);                                     \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peers_unlock(peers)                            \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_unlock(&peers->rwlock);                                    \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peer_lock(peers, peer)                         \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_wlock(&peer->lock);                                        \[m
[31m-    }[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peer_unlock(peers, peer)                       \[m
[31m-                                                                              \[m
[31m-    if (peers->shpool) {                                                      \[m
[31m-        ngx_rwlock_unlock(&peer->lock);                                       \[m
[31m-    }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define ngx_stream_upstream_rr_peers_rlock(peers)[m
[31m-#define ngx_stream_upstream_rr_peers_wlock(peers)[m
[31m-#define ngx_stream_upstream_rr_peers_unlock(peers)[m
[31m-#define ngx_stream_upstream_rr_peer_lock(peers, peer)[m
[31m-#define ngx_stream_upstream_rr_peer_unlock(peers, peer)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers;[m
[31m-    ngx_stream_upstream_rr_peer_t   *current;[m
[31m-    uintptr_t                       *tried;[m
[31m-    uintptr_t                        data;[m
[31m-} ngx_stream_upstream_rr_peer_data_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-ngx_int_t ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s,[m
[31m-    ngx_stream_upstream_srv_conf_t *us);[m
[31m-ngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-void ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_zone_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_zone_module.c[m
[1mdeleted file mode 100644[m
[1mindex ffc9e8a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-1.9.15/src/stream/ngx_stream_upstream_zone_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,242 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Ruslan Ermilov[m
[31m- * Copyright (C) Nginx, Inc.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_stream.h>[m
[31m-[m
[31m-[m
[31m-static char *ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone,[m
[31m-    void *data);[m
[31m-static ngx_stream_upstream_rr_peers_t *ngx_stream_upstream_zone_copy_peers([m
[31m-    ngx_slab_pool_t *shpool, ngx_stream_upstream_srv_conf_t *uscf);[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_stream_upstream_zone_commands[] = {[m
[31m-[m
[31m-    { ngx_string("zone"),[m
[31m-      NGX_STREAM_UPS_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_stream_upstream_zone,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_stream_module_t  ngx_stream_upstream_zone_module_ctx = {[m
[31m-    NULL,                                  /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                  /* create main configuration */[m
[31m-    NULL,                                  /* init main configuration */[m
[31m-[m
[31m-    NULL,                                  /* create server configuration */[m
[31m-    NULL,                                  /* merge server configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t  ngx_stream_upstream_zone_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_stream_upstream_zone_module_ctx,  /* module context */[m
[31m-    ngx_stream_upstream_zone_commands,     /* module directives */[m
[31m-    NGX_STREAM_MODULE,                     /* module type */[m
[31m-    NULL,                                  /* init master */[m
[31m-    NULL,                                  /* init module */[m
[31m-    NULL,                                  /* init process */[m
[31m-    NULL,                                  /* init thread */[m
[31m-    NULL,                                  /* exit thread */[m
[31m-    NULL,                                  /* exit process */[m
[31m-    NULL,                                  /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ssize_t                           size;[m
[31m-    ngx_str_t                        *value;[m
[31m-    ngx_stream_upstream_srv_conf_t   *uscf;[m
[31m-    ngx_stream_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module);[m
[31m-    umcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_upstream_module);[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (!value[1].len) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid zone name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        size = ngx_parse_size(&value[2]);[m
[31m-[m
[31m-        if (size == NGX_ERROR) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "invalid zone size \"%V\"", &value[2]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (size < (ssize_t) (8 * ngx_pagesize)) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "zone \"%V\" is too small", &value[1]);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        size = 0;[m
[31m-    }[m
[31m-[m
[31m-    uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size,[m
[31m-                                           &ngx_stream_upstream_module);[m
[31m-    if (uscf->shm_zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf->shm_zone->init = ngx_stream_upstream_init_zone;[m
[31m-    uscf->shm_zone->data = umcf;[m
[31m-[m
[31m-    uscf->shm_zone->noreuse = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    size_t                            len;[m
[31m-    ngx_uint_t                        i;[m
[31m-    ngx_slab_pool_t                  *shpool;[m
[31m-    ngx_stream_upstream_rr_peers_t   *peers, **peersp;[m
[31m-    ngx_stream_upstream_srv_conf_t   *uscf, **uscfp;[m
[31m-    ngx_stream_upstream_main_conf_t  *umcf;[m
[31m-[m
[31m-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-    umcf = shm_zone->data;[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        peers = shpool->data;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->shm_zone != shm_zone) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            uscf->peer.data = peers;[m
[31m-            peers = peers->zone_next;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    shpool->log_ctx = ngx_slab_alloc(shpool, len);[m
[31m-    if (shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-[m
[31m-    /* copy peers to shared memory */[m
[31m-[m
[31m-    peersp = (ngx_stream_upstream_rr_peers_t **) (void *) &shpool->data;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->shm_zone != shm_zone) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        peers = ngx_stream_upstream_zone_copy_peers(shpool, uscf);[m
[31m-        if (peers == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *peersp = peers;[m
[31m-        peersp = &peers->zone_next;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_stream_upstream_rr_peers_t *[m
[31m-ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,[m
[31m-    ngx_stream_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_stream_upstream_rr_peer_t   *peer, **peerp;[m
[31m-    ngx_stream_upstream_rr_peers_t  *peers, *backup;[m
[31m-[m
[31m-    peers = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-    if (peers == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-[m
[31m-    peers->shpool = shpool;[m
[31m-[m
[31m-    for (peerp = &peers->peer; *peerp; peerp = &peer->next) {[m
[31m-        /* pool is unlocked */[m
[31m-        peer = ngx_slab_calloc_locked(shpool,[m
[31m-                                      sizeof(ngx_stream_upstream_rr_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));[m
[31m-[m
[31m-        *peerp = peer;[m
[31m-    }[m
[31m-[m
[31m-    if (peers->next == NULL) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    backup = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-    if (backup == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t));[m
[31m-[m
[31m-    backup->shpool = shpool;[m
[31m-[m
[31m-    for (peerp = &backup->peer; *peerp; peerp = &peer->next) {[m
[31m-        /* pool is unlocked */[m
[31m-        peer = ngx_slab_calloc_locked(shpool,[m
[31m-                                      sizeof(ngx_stream_upstream_rr_peer_t));[m
[31m-        if (peer == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t));[m
[31m-[m
[31m-        *peerp = peer;[m
[31m-    }[m
[31m-[m
[31m-    peers->next = backup;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    uscf->peer.data = peers;[m
[31m-[m
[31m-    return peers;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-no_pool.patch b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-no_pool.patch[m
[1mdeleted file mode 100644[m
[1mindex 5077f5a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/nginx-no_pool.patch[m
[1m+++ /dev/null[m
[36m@@ -1,587 +0,0 @@[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/nginx.h nginx-1.9.15-patched/src/core/nginx.h[m
[31m---- nginx-1.9.15/src/core/nginx.h	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/nginx.h	2016-04-21 16:25:07.452944624 -0700[m
[31m-@@ -10,7 +10,7 @@[m
[31m- [m
[31m- [m
[31m- #define nginx_version      1009015[m
[31m- #define NGINX_VERSION      "1.9.15"[m
[31m--#define NGINX_VER          "openresty/" NGINX_VERSION ".1"[m
[31m-+#define NGINX_VER          "openresty/" NGINX_VERSION ".1 (no pool)"[m
[31m- [m
[31m- #ifdef NGX_BUILD[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/ngx_array.c nginx-1.9.15-patched/src/core/ngx_array.c[m
[31m---- nginx-1.9.15/src/core/ngx_array.c	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/ngx_array.c	2016-04-21 16:25:07.453947190 -0700[m
[31m-@@ -30,26 +30,30 @@ ngx_array_create(ngx_pool_t *p, ngx_uint[m
[31m- void[m
[31m- ngx_array_destroy(ngx_array_t *a)[m
[31m- {[m
[31m--    ngx_pool_t  *p;[m
[31m-+    ngx_pool_t          *p;[m
[31m-+    ngx_array_link_t    *link;[m
[31m- [m
[31m-     p = a->pool;[m
[31m- [m
[31m--    if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {[m
[31m--        p->d.last -= a->size * a->nalloc;[m
[31m-+    if (a->elts) {[m
[31m-+        ngx_pfree(p, a->elts);[m
[31m-     }[m
[31m- [m
[31m--    if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {[m
[31m--        p->d.last = (u_char *) a;[m
[31m-+    for (link = a->old_elts; link; link = link->next) {[m
[31m-+        ngx_pfree(p, link->elts);[m
[31m-     }[m
[31m-+[m
[31m-+    ngx_pfree(p, a);[m
[31m- }[m
[31m- [m
[31m- [m
[31m- void *[m
[31m- ngx_array_push(ngx_array_t *a)[m
[31m- {[m
[31m--    void        *elt, *new;[m
[31m--    size_t       size;[m
[31m--    ngx_pool_t  *p;[m
[31m-+    void                *elt, *new;[m
[31m-+    size_t               size;[m
[31m-+    ngx_pool_t          *p;[m
[31m-+    ngx_array_link_t    *link;[m
[31m- [m
[31m-     if (a->nelts == a->nalloc) {[m
[31m- [m
[31m-@@ -59,29 +63,27 @@ ngx_array_push(ngx_array_t *a)[m
[31m- [m
[31m-         p = a->pool;[m
[31m- [m
[31m--        if ((u_char *) a->elts + size == p->d.last[m
[31m--            && p->d.last + a->size <= p->d.end)[m
[31m--        {[m
[31m--            /*[m
[31m--             * the array allocation is the last in the pool[m
[31m--             * and there is space for new allocation[m
[31m--             */[m
[31m--[m
[31m--            p->d.last += a->size;[m
[31m--            a->nalloc++;[m
[31m-+        /* allocate a new array */[m
[31m- [m
[31m--        } else {[m
[31m--            /* allocate a new array */[m
[31m-+        new = ngx_palloc(p, 2 * size);[m
[31m-+        if (new == NULL) {[m
[31m-+            return NULL;[m
[31m-+        }[m
[31m- [m
[31m--            new = ngx_palloc(p, 2 * size);[m
[31m--            if (new == NULL) {[m
[31m--                return NULL;[m
[31m--            }[m
[31m-+        ngx_memcpy(new, a->elts, size);[m
[31m- [m
[31m--            ngx_memcpy(new, a->elts, size);[m
[31m--            a->elts = new;[m
[31m--            a->nalloc *= 2;[m
[31m-+        link = ngx_palloc(p, sizeof(ngx_array_link_t));[m
[31m-+        if (link == NULL) {[m
[31m-+            ngx_pfree(p, new);[m
[31m-+            return NULL;[m
[31m-         }[m
[31m-+[m
[31m-+        link->next = a->old_elts;[m
[31m-+        link->elts = a->elts;[m
[31m-+        a->old_elts = link;[m
[31m-+[m
[31m-+        a->elts = new;[m
[31m-+        a->nalloc *= 2;[m
[31m-     }[m
[31m- [m
[31m-     elt = (u_char *) a->elts + a->size * a->nelts;[m
[31m-@@ -95,11 +97,10 @@ void *[m
[31m- ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)[m
[31m- {[m
[31m-     void        *elt, *new;[m
[31m--    size_t       size;[m
[31m-     ngx_uint_t   nalloc;[m
[31m-     ngx_pool_t  *p;[m
[31m- [m
[31m--    size = n * a->size;[m
[31m-+    ngx_array_link_t    *link;[m
[31m- [m
[31m-     if (a->nelts + n > a->nalloc) {[m
[31m- [m
[31m-@@ -107,31 +108,27 @@ ngx_array_push_n(ngx_array_t *a, ngx_uin[m
[31m- [m
[31m-         p = a->pool;[m
[31m- [m
[31m--        if ((u_char *) a->elts + a->size * a->nalloc == p->d.last[m
[31m--            && p->d.last + size <= p->d.end)[m
[31m--        {[m
[31m--            /*[m
[31m--             * the array allocation is the last in the pool[m
[31m--             * and there is space for new allocation[m
[31m--             */[m
[31m-+        nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);[m
[31m- [m
[31m--            p->d.last += size;[m
[31m--            a->nalloc += n;[m
[31m-+        new = ngx_palloc(p, nalloc * a->size);[m
[31m-+        if (new == NULL) {[m
[31m-+            return NULL;[m
[31m-+        }[m
[31m- [m
[31m--        } else {[m
[31m--            /* allocate a new array */[m
[31m-+        ngx_memcpy(new, a->elts, a->nelts * a->size);[m
[31m- [m
[31m--            nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);[m
[31m-+        link = ngx_palloc(p, sizeof(ngx_array_link_t));[m
[31m-+        if (link == NULL) {[m
[31m-+            ngx_pfree(p, new);[m
[31m-+            return NULL;[m
[31m-+        }[m
[31m- [m
[31m--            new = ngx_palloc(p, nalloc * a->size);[m
[31m--            if (new == NULL) {[m
[31m--                return NULL;[m
[31m--            }[m
[31m-+        link->next = a->old_elts;[m
[31m-+        link->elts = a->elts;[m
[31m-+        a->old_elts = link;[m
[31m- [m
[31m--            ngx_memcpy(new, a->elts, a->nelts * a->size);[m
[31m--            a->elts = new;[m
[31m--            a->nalloc = nalloc;[m
[31m--        }[m
[31m-+        a->elts = new;[m
[31m-+        a->nalloc = nalloc;[m
[31m-     }[m
[31m- [m
[31m-     elt = (u_char *) a->elts + a->size * a->nelts;[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/ngx_array.h nginx-1.9.15-patched/src/core/ngx_array.h[m
[31m---- nginx-1.9.15/src/core/ngx_array.h	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/ngx_array.h	2016-04-21 16:25:07.453947190 -0700[m
[31m-@@ -13,12 +13,23 @@[m
[31m- #include <ngx_core.h>[m
[31m- [m
[31m- [m
[31m-+typedef struct ngx_array_link_s ngx_array_link_t;[m
[31m-+[m
[31m-+[m
[31m-+struct ngx_array_link_s {[m
[31m-+    void                    *elts;[m
[31m-+    ngx_array_link_t        *next;[m
[31m-+};[m
[31m-+[m
[31m-+[m
[31m- typedef struct {[m
[31m-     void        *elts;[m
[31m-     ngx_uint_t   nelts;[m
[31m-     size_t       size;[m
[31m-     ngx_uint_t   nalloc;[m
[31m-     ngx_pool_t  *pool;[m
[31m-+[m
[31m-+    ngx_array_link_t *old_elts;[m
[31m- } ngx_array_t;[m
[31m- [m
[31m- [m
[31m-@@ -40,6 +51,7 @@ ngx_array_init(ngx_array_t *array, ngx_p[m
[31m-     array->size = size;[m
[31m-     array->nalloc = n;[m
[31m-     array->pool = pool;[m
[31m-+    array->old_elts = NULL;[m
[31m- [m
[31m-     array->elts = ngx_palloc(pool, n * size);[m
[31m-     if (array->elts == NULL) {[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/ngx_palloc.c nginx-1.9.15-patched/src/core/ngx_palloc.c[m
[31m---- nginx-1.9.15/src/core/ngx_palloc.c	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/ngx_palloc.c	2016-04-21 16:25:45.912282685 -0700[m
[31m-@@ -9,34 +9,26 @@[m
[31m- #include <ngx_core.h>[m
[31m- [m
[31m- [m
[31m--static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size,[m
[31m--    ngx_uint_t align);[m
[31m--static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);[m
[31m--static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);[m
[31m-+static void * ngx_malloc(ngx_pool_t *pool, size_t size);[m
[31m- [m
[31m- [m
[31m- ngx_pool_t *[m
[31m- ngx_create_pool(size_t size, ngx_log_t *log)[m
[31m- {[m
[31m--    ngx_pool_t  *p;[m
[31m-+    ngx_pool_t        *p;[m
[31m- [m
[31m--    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);[m
[31m-+    size = sizeof(ngx_pool_t);[m
[31m-+    p = ngx_alloc(size, log);[m
[31m-     if (p == NULL) {[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m--    p->d.end = (u_char *) p + size;[m
[31m--    p->d.next = NULL;[m
[31m--    p->d.failed = 0;[m
[31m-+    ngx_memzero(p, size);[m
[31m- [m
[31m-     size = size - sizeof(ngx_pool_t);[m
[31m-     p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;[m
[31m- [m
[31m-     p->current = p;[m
[31m--    p->chain = NULL;[m
[31m--    p->large = NULL;[m
[31m--    p->cleanup = NULL;[m
[31m-     p->log = log;[m
[31m- [m
[31m-     return p;[m
[31m-@@ -46,8 +38,7 @@ ngx_create_pool(size_t size, ngx_log_t *[m
[31m- void[m
[31m- ngx_destroy_pool(ngx_pool_t *pool)[m
[31m- {[m
[31m--    ngx_pool_t          *p, *n;[m
[31m--    ngx_pool_large_t    *l;[m
[31m-+    ngx_pool_data_t     *d, *n;[m
[31m-     ngx_pool_cleanup_t  *c;[m
[31m- [m
[31m-     for (c = pool->cleanup; c; c = c->next) {[m
[31m-@@ -58,6 +49,11 @@ ngx_destroy_pool(ngx_pool_t *pool)[m
[31m-         }[m
[31m-     }[m
[31m- [m
[31m-+    if (pool->d == NULL) {[m
[31m-+        ngx_free(pool);[m
[31m-+        return;[m
[31m-+    }[m
[31m-+[m
[31m- #if (NGX_DEBUG)[m
[31m- [m
[31m-     /*[m
[31m-@@ -65,13 +61,9 @@ ngx_destroy_pool(ngx_pool_t *pool)[m
[31m-      * so we cannot use this log while free()ing the pool[m
[31m-      */[m
[31m- [m
[31m--    for (l = pool->large; l; l = l->next) {[m
[31m--        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);[m
[31m--    }[m
[31m--[m
[31m--    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m-+    for (d = pool->d, n = d->next; ; d = n, n = n->next) {[m
[31m-         ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m--                       "free: %p, unused: %uz", p, p->d.end - p->d.last);[m
[31m-+                       "free: %p, unused: %d", d, 0);[m
[31m- [m
[31m-         if (n == NULL) {[m
[31m-             break;[m
[31m-@@ -80,171 +72,82 @@ ngx_destroy_pool(ngx_pool_t *pool)[m
[31m- [m
[31m- #endif[m
[31m- [m
[31m--    for (l = pool->large; l; l = l->next) {[m
[31m--        if (l->alloc) {[m
[31m--            ngx_free(l->alloc);[m
[31m--        }[m
[31m--    }[m
[31m--[m
[31m--    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {[m
[31m--        ngx_free(p);[m
[31m-+    for (d = pool->d, n = d->next; ; d = n, n = n->next) {[m
[31m-+        ngx_free(d->alloc);[m
[31m-+        ngx_free(d);[m
[31m- [m
[31m-         if (n == NULL) {[m
[31m-             break;[m
[31m-         }[m
[31m-     }[m
[31m-+[m
[31m-+    pool->d = NULL;[m
[31m-+    ngx_free(pool);[m
[31m- }[m
[31m- [m
[31m- [m
[31m- void[m
[31m- ngx_reset_pool(ngx_pool_t *pool)[m
[31m- {[m
[31m--    ngx_pool_t        *p;[m
[31m--    ngx_pool_large_t  *l;[m
[31m-+    ngx_pool_data_t     *d, *n;[m
[31m-+    ngx_pool_data_t     *saved = NULL;[m
[31m- [m
[31m--    for (l = pool->large; l; l = l->next) {[m
[31m--        if (l->alloc) {[m
[31m--            ngx_free(l->alloc);[m
[31m-+    if (pool->d) {[m
[31m-+        for (d = pool->d, n = d->next; ; d = n, n = n->next) {[m
[31m-+            if (d->alloc == pool->log) {[m
[31m-+                saved = d;[m
[31m-+                continue;[m
[31m-+            }[m
[31m-+[m
[31m-+            ngx_free(d->alloc);[m
[31m-+            ngx_free(d);[m
[31m-+[m
[31m-+            if (n == NULL) {[m
[31m-+                break;[m
[31m-+            }[m
[31m-         }[m
[31m--    }[m
[31m- [m
[31m--    for (p = pool; p; p = p->d.next) {[m
[31m--        p->d.last = (u_char *) p + sizeof(ngx_pool_t);[m
[31m--        p->d.failed = 0;[m
[31m-+        pool->d = saved;[m
[31m-+        pool->current = pool;[m
[31m-+        pool->chain = NULL;[m
[31m-     }[m
[31m--[m
[31m--    pool->current = pool;[m
[31m--    pool->chain = NULL;[m
[31m--    pool->large = NULL;[m
[31m- }[m
[31m- [m
[31m- [m
[31m- void *[m
[31m- ngx_palloc(ngx_pool_t *pool, size_t size)[m
[31m- {[m
[31m--#if !(NGX_DEBUG_PALLOC)[m
[31m--    if (size <= pool->max) {[m
[31m--        return ngx_palloc_small(pool, size, 1);[m
[31m--    }[m
[31m--#endif[m
[31m--[m
[31m--    return ngx_palloc_large(pool, size);[m
[31m-+    return ngx_malloc(pool, size);[m
[31m- }[m
[31m- [m
[31m- [m
[31m- void *[m
[31m- ngx_pnalloc(ngx_pool_t *pool, size_t size)[m
[31m- {[m
[31m--#if !(NGX_DEBUG_PALLOC)[m
[31m--    if (size <= pool->max) {[m
[31m--        return ngx_palloc_small(pool, size, 0);[m
[31m--    }[m
[31m--#endif[m
[31m--[m
[31m--    return ngx_palloc_large(pool, size);[m
[31m--}[m
[31m--[m
[31m--[m
[31m--static ngx_inline void *[m
[31m--ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)[m
[31m--{[m
[31m--    u_char      *m;[m
[31m--    ngx_pool_t  *p;[m
[31m--[m
[31m--    p = pool->current;[m
[31m--[m
[31m--    do {[m
[31m--        m = p->d.last;[m
[31m--[m
[31m--        if (align) {[m
[31m--            m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m--        }[m
[31m--[m
[31m--        if ((size_t) (p->d.end - m) >= size) {[m
[31m--            p->d.last = m + size;[m
[31m--[m
[31m--            return m;[m
[31m--        }[m
[31m--[m
[31m--        p = p->d.next;[m
[31m--[m
[31m--    } while (p);[m
[31m--[m
[31m--    return ngx_palloc_block(pool, size);[m
[31m--}[m
[31m--[m
[31m--[m
[31m--static void *[m
[31m--ngx_palloc_block(ngx_pool_t *pool, size_t size)[m
[31m--{[m
[31m--    u_char      *m;[m
[31m--    size_t       psize;[m
[31m--    ngx_pool_t  *p, *new;[m
[31m--[m
[31m--    psize = (size_t) (pool->d.end - (u_char *) pool);[m
[31m--[m
[31m--    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);[m
[31m--    if (m == NULL) {[m
[31m--        return NULL;[m
[31m--    }[m
[31m--[m
[31m--    new = (ngx_pool_t *) m;[m
[31m--[m
[31m--    new->d.end = m + psize;[m
[31m--    new->d.next = NULL;[m
[31m--    new->d.failed = 0;[m
[31m--[m
[31m--    m += sizeof(ngx_pool_data_t);[m
[31m--    m = ngx_align_ptr(m, NGX_ALIGNMENT);[m
[31m--    new->d.last = m + size;[m
[31m--[m
[31m--    for (p = pool->current; p->d.next; p = p->d.next) {[m
[31m--        if (p->d.failed++ > 4) {[m
[31m--            pool->current = p->d.next;[m
[31m--        }[m
[31m--    }[m
[31m--[m
[31m--    p->d.next = new;[m
[31m--[m
[31m--    return m;[m
[31m-+    return ngx_malloc(pool, size);[m
[31m- }[m
[31m- [m
[31m- [m
[31m- static void *[m
[31m--ngx_palloc_large(ngx_pool_t *pool, size_t size)[m
[31m-+ngx_malloc(ngx_pool_t *pool, size_t size)[m
[31m- {[m
[31m--    void              *p;[m
[31m--    ngx_uint_t         n;[m
[31m--    ngx_pool_large_t  *large;[m
[31m-+    void                *p;[m
[31m-+    ngx_pool_data_t     *d;[m
[31m- [m
[31m-     p = ngx_alloc(size, pool->log);[m
[31m-     if (p == NULL) {[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    n = 0;[m
[31m--[m
[31m--    for (large = pool->large; large; large = large->next) {[m
[31m--        if (large->alloc == NULL) {[m
[31m--            large->alloc = p;[m
[31m--            return p;[m
[31m--        }[m
[31m--[m
[31m--        if (n++ > 3) {[m
[31m--            break;[m
[31m--        }[m
[31m--    }[m
[31m--[m
[31m--    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m--    if (large == NULL) {[m
[31m-+    d = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);[m
[31m-+    if (d == NULL){[m
[31m-         ngx_free(p);[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    large->alloc = p;[m
[31m--    large->next = pool->large;[m
[31m--    pool->large = large;[m
[31m--[m
[31m-+    d->alloc = p;[m
[31m-+    d->next = pool->d;[m
[31m-+    pool->d = d;[m
[31m-     return p;[m
[31m- }[m
[31m- [m
[31m-@@ -253,38 +156,48 @@ void *[m
[31m- ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)[m
[31m- {[m
[31m-     void              *p;[m
[31m--    ngx_pool_large_t  *large;[m
[31m-+    ngx_pool_data_t   *d;[m
[31m- [m
[31m-     p = ngx_memalign(alignment, size, pool->log);[m
[31m-     if (p == NULL) {[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);[m
[31m--    if (large == NULL) {[m
[31m-+    d = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);[m
[31m-+    if (d == NULL){[m
[31m-         ngx_free(p);[m
[31m-         return NULL;[m
[31m-     }[m
[31m- [m
[31m--    large->alloc = p;[m
[31m--    large->next = pool->large;[m
[31m--    pool->large = large;[m
[31m--[m
[31m-+    d->alloc = p;[m
[31m-+    d->next = pool->d;[m
[31m-+    pool->d = d;[m
[31m-     return p;[m
[31m- }[m
[31m- [m
[31m- [m
[31m- ngx_int_t[m
[31m--ngx_pfree(ngx_pool_t *pool, void *p)[m
[31m-+ngx_pfree(ngx_pool_t *pool, void *data)[m
[31m- {[m
[31m--    ngx_pool_large_t  *l;[m
[31m-+    ngx_pool_data_t     *p, *d;[m
[31m- [m
[31m--    for (l = pool->large; l; l = l->next) {[m
[31m--        if (p == l->alloc) {[m
[31m--            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,[m
[31m--                           "free: %p", l->alloc);[m
[31m--            ngx_free(l->alloc);[m
[31m--            l->alloc = NULL;[m
[31m-+    p = NULL;[m
[31m-+    for (d = pool->d; d; p = d, d = d->next) {[m
[31m-+        if (data == d->alloc) {[m
[31m-+[m
[31m-+            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);[m
[31m-+[m
[31m-+            ngx_free(d->alloc);[m
[31m-+            d->alloc = NULL;[m
[31m-+[m
[31m-+            if (p) {[m
[31m-+                p->next = d->next;[m
[31m-+[m
[31m-+            } else {[m
[31m-+                pool->d = d->next;[m
[31m-+            }[m
[31m-+[m
[31m-+            ngx_free(d);[m
[31m- [m
[31m-             return NGX_OK;[m
[31m-         }[m
[31m-diff --minimal '--exclude=*.swp' '--exclude=*~' -up nginx-1.9.15/src/core/ngx_palloc.h nginx-1.9.15-patched/src/core/ngx_palloc.h[m
[31m---- nginx-1.9.15/src/core/ngx_palloc.h	2016-04-19 09:02:38.000000000 -0700[m
[31m-+++ nginx-1.9.15-patched/src/core/ngx_palloc.h	2016-04-21 16:25:07.454949755 -0700[m
[31m-@@ -38,28 +38,21 @@ struct ngx_pool_cleanup_s {[m
[31m- };[m
[31m- [m
[31m- [m
[31m--typedef struct ngx_pool_large_s  ngx_pool_large_t;[m
[31m--[m
[31m--struct ngx_pool_large_s {[m
[31m--    ngx_pool_large_t     *next;[m
[31m--    void                 *alloc;[m
[31m--};[m
[31m-+typedef struct ngx_pool_data_s   ngx_pool_large_t;[m
[31m-+typedef struct ngx_pool_data_s   ngx_pool_data_t;[m
[31m- [m
[31m- [m
[31m--typedef struct {[m
[31m--    u_char               *last;[m
[31m--    u_char               *end;[m
[31m--    ngx_pool_t           *next;[m
[31m--    ngx_uint_t            failed;[m
[31m--} ngx_pool_data_t;[m
[31m-+struct ngx_pool_data_s {[m
[31m-+    ngx_pool_data_t        *next;[m
[31m-+    void                   *alloc;[m
[31m-+};[m
[31m- [m
[31m- [m
[31m- struct ngx_pool_s {[m
[31m--    ngx_pool_data_t       d;[m
[31m-+    ngx_pool_data_t      *d;[m
[31m-     size_t                max;[m
[31m-     ngx_pool_t           *current;[m
[31m-     ngx_chain_t          *chain;[m
[31m--    ngx_pool_large_t     *large;[m
[31m-     ngx_pool_cleanup_t   *cleanup;[m
[31m-     ngx_log_t            *log;[m
[31m- };[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex c6af6c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-.svn[m
[31m-t/servroot/[m
[31m-*~[m
[31m-*.swp[m
[31m-work/[m
[31m-buildroot/[m
[31m-util/[m
[31m-reindex[m
[31m-go[m
[31m-build1*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/CHANGES b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/CHANGES[m
[1mdeleted file mode 100644[m
[1mindex a76ce50..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/CHANGES[m
[1m+++ /dev/null[m
[36m@@ -1,2 +0,0 @@[m
[31m-2010-07-01    VERSION 1.0[m
[31m-    * Initial release.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex e5d57c8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-1. Redistributions of source code must retain the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer.[m
[31m-2. Redistributions in binary form must reproduce the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer in the[m
[31m-   documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/README[m
[1mdeleted file mode 100644[m
[1mindex 4391030..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/README[m
[1m+++ /dev/null[m
[36m@@ -1,76 +0,0 @@[m
[31m-ABOUT:[m
[31m-------[m
[31m-ngx_coolkit is collection of small and useful nginx add-ons.[m
[31m-[m
[31m-[m
[31m-CONFIGURATION DIRECTIVES:[m
[31m--------------------------[m
[31m-[m
[31m-  override_method off | [methods] source (context: http, server, location)[m
[31m-  ------------------------------------------------------------------------[m
[31m-  Override HTTP method.[m
[31m-[m
[31m-  default: none[m
[31m-[m
[31m-[m
[31m-CONFIGURATION VARIABLES:[m
[31m-------------------------[m
[31m-[m
[31m-  $remote_passwd[m
[31m-  -----------------[m
[31m-  Decoded password from "Authorization" header (Basic HTTP Authentication).[m
[31m-[m
[31m-[m
[31m-  $location[m
[31m-  ---------[m
[31m-  Name of the matched location block.[m
[31m-[m
[31m-[m
[31m-EXAMPLE CONFIGURATION #1:[m
[31m--------------------------[m
[31m-http {[m
[31m-    server {[m
[31m-        location / {[m
[31m-            override_method  $arg_method;[m
[31m-            proxy_pass       http://127.0.0.1:8100;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-Pass request with changed HTTP method (based on "?method=XXX") to the backend.[m
[31m-[m
[31m-[m
[31m-EXAMPLE CONFIGURATION #2:[m
[31m--------------------------[m
[31m-http {[m
[31m-    upstream database {[m
[31m-        postgres_server        127.0.0.1 dbname=test[m
[31m-                               user=monty password=some_pass;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        location = /auth {[m
[31m-            internal;[m
[31m-[m
[31m-            set_quote_sql_str  $user $remote_user;[m
[31m-            set_quote_sql_str  $pass $remote_passwd;[m
[31m-[m
[31m-            postgres_pass      database;[m
[31m-            postgres_query     "SELECT login FROM users WHERE login=$user AND pass=$pass";[m
[31m-            postgres_rewrite   no_rows 403;[m
[31m-            postgres_output    none;[m
[31m-        }[m
[31m-[m
[31m-        location / {[m
[31m-            auth_request       /auth;[m
[31m-            root               /files;[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-Restrict access to local files by authenticating against SQL database.[m
[31m-[m
[31m-Required modules (other than ngx_coolkit):[m
[31m-- ngx_http_auth_request_module,[m
[31m-- ngx_postgres (PostgreSQL) or ngx_drizzle (MySQL, Drizzle, SQLite),[m
[31m-- ngx_set_misc.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/config[m
[1mdeleted file mode 100644[m
[1mindex 6f27634..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/config[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-ngx_addon_name=ngx_coolkit_module[m
[31m-[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_coolkit_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_coolkit_handlers.c $ngx_addon_dir/src/ngx_coolkit_module.c $ngx_addon_dir/src/ngx_coolkit_variables.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ngx_coolkit_handlers.h $ngx_addon_dir/src/ngx_coolkit_module.h $ngx_addon_dir/src/ngx_coolkit_variables.h"[m
[31m-[m
[31m-have=NGX_COOLKIT_MODULE . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.c[m
[1mdeleted file mode 100644[m
[1mindex bae192c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.c[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#include "ngx_coolkit_handlers.h"[m
[31m-#include "ngx_coolkit_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_override_method_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_coolkit_loc_conf_t  *cklcf;[m
[31m-    ngx_coolkit_ctx_t       *ckctx;[m
[31m-    ngx_str_t                method;[m
[31m-    ngx_conf_bitmask_t      *b;[m
[31m-    ngx_uint_t               original, j;[m
[31m-[m
[31m-    cklcf = ngx_http_get_module_loc_conf(r, ngx_coolkit_module);[m
[31m-    ckctx = ngx_http_get_module_ctx(r, ngx_coolkit_module);[m
[31m-[m
[31m-    /* always test against original request method */[m
[31m-    if ((ckctx != NULL) && (ckctx->overridden_method != 0)) {[m
[31m-        original = ckctx->overridden_method;[m
[31m-    } else {[m
[31m-        original = r->method;[m
[31m-    }[m
[31m-[m
[31m-    if ((cklcf->override_source) && (cklcf->override_methods & original)) {[m
[31m-        if (ngx_http_complex_value(r, cklcf->override_source, &method)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (method.len == 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_coolkit_http_methods;[m
[31m-        for (j = 0; b[j].name.len; j++) {[m
[31m-            if ((b[j].name.len - 1 == method.len)[m
[31m-                && (ngx_strncasecmp(b[j].name.data, method.data, method.len)[m
[31m-                     == 0))[m
[31m-            {[m
[31m-                if (ckctx == NULL) {[m
[31m-                    ckctx = ngx_pcalloc(r->pool, sizeof(ngx_coolkit_ctx_t));[m
[31m-                    if (ckctx == NULL) {[m
[31m-                        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    /*[m
[31m-                     * set by ngx_pcalloc():[m
[31m-                     *[m
[31m-                     *     ckctx->overridden_method = 0[m
[31m-                     *     ckctx->overridden_method_name = { 0, NULL }[m
[31m-                     */[m
[31m-[m
[31m-                    ngx_http_set_ctx(r, ckctx, ngx_coolkit_module);[m
[31m-                }[m
[31m-[m
[31m-                if (ckctx->overridden_method == 0) {[m
[31m-                    ckctx->overridden_method = r->method;[m
[31m-                    ckctx->overridden_method_name = r->method_name;[m
[31m-                }[m
[31m-[m
[31m-                r->method = b[j].mask;[m
[31m-                r->method_name = b[j].name;[m
[31m-                r->method_name.len--; /* "hidden" space */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "coolkit override method: %V", &method);[m
[31m-[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if ((ckctx != NULL) && (ckctx->overridden_method != 0)[m
[31m-        && (cklcf->override_source == NULL))[m
[31m-    {[m
[31m-        /*[m
[31m-         * Bring back original method in location with[m
[31m-         * "override_method off".[m
[31m-         * This mess happens because this handlers runs twice:[m
[31m-         * in server rewrite and (location) rewrite phases.[m
[31m-         */[m
[31m-[m
[31m-        r->method = ckctx->overridden_method;[m
[31m-        r->method_name = ckctx->overridden_method_name;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.h[m
[1mdeleted file mode 100644[m
[1mindex f58c334..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_handlers.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_COOLKIT_HANDLERS_H_[m
[31m-#define _NGX_COOLKIT_HANDLERS_H_[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_coolkit_override_method_handler(ngx_http_request_t *);[m
[31m-[m
[31m-#endif /* _NGX_COOLKIT_HANDLERS_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.c[m
[1mdeleted file mode 100644[m
[1mindex 423eba1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,270 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#include "ngx_coolkit_handlers.h"[m
[31m-#include "ngx_coolkit_module.h"[m
[31m-#include "ngx_coolkit_variables.h"[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_coolkit_module_commands[] = {[m
[31m-[m
[31m-    { ngx_string("override_method"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_coolkit_conf_override_method,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-static ngx_http_variable_t ngx_coolkit_module_variables[] = {[m
[31m-[m
[31m-    { ngx_string("remote_passwd"), NULL,[m
[31m-      ngx_coolkit_variable_remote_passwd, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_string("location"), NULL,[m
[31m-      ngx_coolkit_variable_location, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_module_t ngx_coolkit_module_ctx = {[m
[31m-    ngx_coolkit_add_variables,    /* preconfiguration */[m
[31m-    ngx_coolkit_init,             /* postconfiguration */[m
[31m-[m
[31m-    NULL,                         /* create main configuration */[m
[31m-    NULL,                         /* init main configuration */[m
[31m-[m
[31m-    NULL,                         /* create server configuration */[m
[31m-    NULL,                         /* merge server configuration */[m
[31m-[m
[31m-    ngx_coolkit_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_coolkit_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-ngx_module_t ngx_coolkit_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_coolkit_module_ctx,      /* module context */[m
[31m-    ngx_coolkit_module_commands,  /* module directives */[m
[31m-    NGX_HTTP_MODULE,              /* module type */[m
[31m-    NULL,                         /* init master */[m
[31m-    NULL,                         /* init module */[m
[31m-    NULL,                         /* init process */[m
[31m-    NULL,                         /* init thread */[m
[31m-    NULL,                         /* exit thread */[m
[31m-    NULL,                         /* exit process */[m
[31m-    NULL,                         /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-/*[m
[31m- * nginx assumes that HTTP method name is followed by space, so add it here[m
[31m- * instead of allocating memory for copy with added space for each request.[m
[31m- */[m
[31m-ngx_conf_bitmask_t ngx_coolkit_http_methods[] = {[m
[31m-   { ngx_string("GET "),       NGX_HTTP_GET },[m
[31m-   { ngx_string("HEAD "),      NGX_HTTP_HEAD },[m
[31m-   { ngx_string("POST "),      NGX_HTTP_POST },[m
[31m-   { ngx_string("PUT "),       NGX_HTTP_PUT },[m
[31m-   { ngx_string("DELETE "),    NGX_HTTP_DELETE },[m
[31m-   { ngx_string("MKCOL "),     NGX_HTTP_MKCOL },[m
[31m-   { ngx_string("COPY "),      NGX_HTTP_COPY },[m
[31m-   { ngx_string("MOVE "),      NGX_HTTP_MOVE },[m
[31m-   { ngx_string("OPTIONS "),   NGX_HTTP_OPTIONS },[m
[31m-   { ngx_string("PROPFIND "),  NGX_HTTP_PROPFIND },[m
[31m-   { ngx_string("PROPPATCH "), NGX_HTTP_PROPPATCH },[m
[31m-   { ngx_string("LOCK "),      NGX_HTTP_LOCK },[m
[31m-   { ngx_string("UNLOCK "),    NGX_HTTP_UNLOCK },[m
[31m-#if defined(nginx_version) && (nginx_version >= 8041)[m
[31m-   { ngx_string("PATCH "),     NGX_HTTP_PATCH },[m
[31m-#endif[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    for (v = ngx_coolkit_module_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_coolkit_override_method_handler;[m
[31m-[m
[31m-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *h = ngx_coolkit_override_method_handler;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-void *[m
[31m-ngx_coolkit_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_coolkit_loc_conf_t  *conf;[m
[31m-[m
[31m-    conf = ngx_palloc(cf->pool, sizeof(ngx_coolkit_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->override_methods = 0[m
[31m-     */[m
[31m-[m
[31m-    conf->override_source = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_coolkit_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_coolkit_loc_conf_t  *prev = parent;[m
[31m-    ngx_coolkit_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    if (conf->override_source == NGX_CONF_UNSET_PTR) {[m
[31m-       if (prev->override_source == NGX_CONF_UNSET_PTR) {[m
[31m-           /* default */[m
[31m-           conf->override_methods = 0;[m
[31m-           conf->override_source = NULL;[m
[31m-       } else {[m
[31m-           /* merge */[m
[31m-           conf->override_methods = prev->override_methods;[m
[31m-           conf->override_source = prev->override_source;[m
[31m-       }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_coolkit_conf_override_method(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_str_t                          source = value[cf->args->nelts - 1];[m
[31m-    ngx_coolkit_loc_conf_t            *cklcf = conf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_conf_bitmask_t                *b;[m
[31m-    ngx_uint_t                         i, j;[m
[31m-[m
[31m-    if (cklcf->override_source != NGX_CONF_UNSET_PTR) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcmp(value[1].data, "off") == 0) {[m
[31m-        cklcf->override_source = NULL;[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (source.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "coolkit: empty source in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        /* override method for all methods */[m
[31m-        cklcf->override_methods = 0xFFFF;[m
[31m-    } else {[m
[31m-        /* override method only for specified methods */[m
[31m-        cklcf->override_methods = 0;[m
[31m-[m
[31m-        for (i = 1; i < cf->args->nelts - 1; i++) {[m
[31m-            b = ngx_coolkit_http_methods;[m
[31m-            for (j = 0; b[j].name.len; j++) {[m
[31m-                if ((b[j].name.len - 1 == value[i].len)[m
[31m-                    && (ngx_strncasecmp(b[j].name.data,[m
[31m-                                        value[i].data, value[i].len) == 0))[m
[31m-                {[m
[31m-                    cklcf->override_methods |= b[j].mask;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "coolkit: invalid method \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    cklcf->override_source = ngx_palloc(cf->pool,[m
[31m-                                        sizeof(ngx_http_complex_value_t));[m
[31m-    if (cklcf->override_source == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = &source;[m
[31m-    ccv.complex_value = cklcf->override_source;[m
[31m-[m
[31m-    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.h[m
[1mdeleted file mode 100644[m
[1mindex 7419f21..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_COOLKIT_MODULE_H_[m
[31m-#define _NGX_COOLKIT_MODULE_H_[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t        ngx_coolkit_module;[m
[31m-extern ngx_conf_bitmask_t  ngx_coolkit_http_methods[];[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* override_method */[m
[31m-    ngx_uint_t                 override_methods;[m
[31m-    ngx_http_complex_value_t  *override_source;[m
[31m-} ngx_coolkit_loc_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* override_method */[m
[31m-    ngx_uint_t                 overridden_method;[m
[31m-    ngx_str_t                  overridden_method_name;[m
[31m-} ngx_coolkit_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_coolkit_add_variables(ngx_conf_t *);[m
[31m-ngx_int_t   ngx_coolkit_init(ngx_conf_t *);[m
[31m-void       *ngx_coolkit_create_loc_conf(ngx_conf_t *);[m
[31m-char       *ngx_coolkit_merge_loc_conf(ngx_conf_t *, void *, void *);[m
[31m-char       *ngx_coolkit_conf_override_method(ngx_conf_t *, ngx_command_t *,[m
[31m-                void *);[m
[31m-[m
[31m-#endif /* _NGX_COOLKIT_MODULE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.c[m
[1mdeleted file mode 100644[m
[1mindex 6a0d026..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.c[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#include "ngx_coolkit_module.h"[m
[31m-#include "ngx_coolkit_variables.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * source: ngx_http_variables.c/ngx_http_variable_remote_user[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- */[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_variable_remote_passwd(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_int_t  rc;[m
[31m-[m
[31m-    rc = ngx_http_auth_basic_user(r);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        v->not_found = 1;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = r->headers_in.passwd.len;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->data = r->headers_in.passwd.data;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_coolkit_variable_location(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t                  rc;[m
[31m-    int                        captures[3];[m
[31m-#endif[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (clcf->regex) {[m
[31m-        rc = ngx_regex_exec(clcf->regex->regex, &r->uri, captures, 3);[m
[31m-[m
[31m-        if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        v->data = r->uri.data + captures[0];[m
[31m-        v->len = captures[1] - captures[0];[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        v->data = clcf->name.data;[m
[31m-        v->len = clcf->name.len;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.h[m
[1mdeleted file mode 100644[m
[1mindex d83e639..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/src/ngx_coolkit_variables.h[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_COOLKIT_VARIABLES_H_[m
[31m-#define _NGX_COOLKIT_VARIABLES_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_coolkit_variable_remote_passwd(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_coolkit_variable_location(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-[m
[31m-#endif /* _NGX_COOLKIT_VARIABLES_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/location.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/location.t[m
[1mdeleted file mode 100644[m
[1mindex d6c5f4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/location.t[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n  $location;[m
[31m-    }[m
[31m---- request[m
[31m-GET /echo[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-/echo[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: regex[m
[31m---- config[m
[31m-    location ~/echo {[m
[31m-        echo -n  $location;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test/echo/regex[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-/echo[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/override_method.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/override_method.t[m
[1mdeleted file mode 100644[m
[1mindex 009df3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/override_method.t[m
[1m+++ /dev/null[m
[36m@@ -1,279 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: not changed[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: changed[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: inherited[m
[31m---- config[m
[31m-    override_method  $arg_method;[m
[31m-[m
[31m-    location /test {[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not inherited[m
[31m---- config[m
[31m-    override_method  $arg_method;[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  PUT;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-PUT[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: restored[m
[31m---- config[m
[31m-    override_method  $arg_method;[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  off;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: method-specific (changed)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  GET $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: method-specific (not changed)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  PUT $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: method-specific (multiple methods)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  GET HEAD PUT $arg_method;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: double dance (blocked)[m
[31m---- config[m
[31m-    override_method  GET $arg_method;[m
[31m-    if ($request_method = GET) {[m
[31m-        return 400;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  GET PUT;[m
[31m-        if ($request_method = GET) {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 400[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: double dance (passed)[m
[31m---- config[m
[31m-    override_method  GET $arg_method;[m
[31m-    if ($request_method = GET) {[m
[31m-        return 400;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  GET PUT;[m
[31m-        if ($request_method = GET) {[m
[31m-            return 400;[m
[31m-        }[m
[31m-[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-PUT[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.34[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: double dance with "off"[m
[31m---- config[m
[31m-    override_method  GET $arg_method;[m
[31m-    if ($request_method = GET) {[m
[31m-        return 400;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  off;[m
[31m-        echo -n          $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.34[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: changed method passed to upstream[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen  8100;[m
[31m-        location / {[m
[31m-            echo -n      $request_method;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        override_method  $arg_method;[m
[31m-        proxy_pass       http://127.0.0.1:8100;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-POST[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: restored method passed to upstream[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen  8100;[m
[31m-        location / {[m
[31m-            echo -n      $request_method;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    override_method  $arg_method;[m
[31m-[m
[31m-    location /test {[m
[31m-        override_method  off;[m
[31m-        proxy_pass       http://127.0.0.1:8100;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?method=POST[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-GET[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/remote_passwd.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/remote_passwd.t[m
[1mdeleted file mode 100644[m
[1mindex 0f5a176..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/t/remote_passwd.t[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-worker_connections(128);[m
[31m-run_tests();[m
[31m-[m
[31m-no_diff();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n  $remote_passwd;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Authorization: Basic bW9udHk6c29tZV9wYXNz[m
[31m---- request[m
[31m-GET /echo[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chop[m
[31m-some_pass[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (without Authorization header)[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo -n  $remote_passwd;[m
[31m-    }[m
[31m---- request[m
[31m-GET /echo[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body:[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: accessible from within lua[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.remote_passwd)[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Authorization: Basic bW9udHk6c29tZV9wYXNz[m
[31m---- request[m
[31m-GET /echo[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-some_pass[m
[31m---- timeout: 10[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex d1f6eb8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_coolkit-0.2rc3/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,612 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr1[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:sendmsg[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_signal_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Param[m
[31m-socketcall.sendmsg(msg.msg_iov[i])[m
[31m-fun:__sendmsg_nocancel[m
[31m-fun:ngx_write_channel[m
[31m-fun:ngx_pass_open_channel[m
[31m-fun:ngx_start_worker_processes[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   write(buf)[m
[31m-   fun:__write_nocancel[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_sprintf_num[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_resolver_read_response[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   obj:*[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lj_str_fromnum[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_pushlstring[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_setfield[m
[31m-   fun:ngx_http_lua_cache_store_code[m
[31m-}[m
[31m-{[m
[31m-   <false_alarm_due_to_u32_alignment_in_luajit2>[m
[31m-   Memcheck:Addr4[m
[31m-   fun:lj_str_new[m
[31m-   fun:lua_getfield[m
[31m-   fun:ngx_http_lua_cache_load_code[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pool_cleanup_add[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_pcalloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc_large[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_malloc[m
[31m-   fun:ngx_pnalloc[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_http_get_variable_index[m
[31m-   fun:ngx_http_memc_add_variable[m
[31m-   fun:ngx_http_memc_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-   fun:ngx_worker_process_init[m
[31m-   fun:ngx_worker_process_cycle[m
[31m-   fun:ngx_spawn_process[m
[31m-   fun:ngx_start_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.sendmsg(msg.msg_iov[i])[m
[31m-   fun:__sendmsg_nocancel[m
[31m-   fun:ngx_write_channel[m
[31m-   fun:ngx_signal_worker_processes[m
[31m-   fun:ngx_master_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_drizzle_keepalive_init[m
[31m-   fun:ngx_http_upstream_drizzle_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_palloc_block[m
[31m-   fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 0fd79d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-tags[m
[31m-cscope.*[m
[31m-*~[m
[31m-*.swp[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex ee54448..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-Copyright (c) 2010-2015, Marcus Clyne[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/README_AUTO_LIB b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/README_AUTO_LIB[m
[1mdeleted file mode 100644[m
[1mindex fd2776f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/README_AUTO_LIB[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-Nginx Auto Lib Core[m
[31m-===================[m
[31m-[m
[31m-Nginx Auto Lib Core is a generic external library-handler that has been designed to[m
[31m-facilitate the inclusion of external libraries in modules for the Nginx web server.[m
[31m-It has been written both for the benefit of Nginx module developers and for the end[m
[31m-users of those Nginx modules, and can provide a consistent, intelligent, flexible[m
[31m-cross-platform way to include external libraries.[m
[31m-[m
[31m-Any developers of Nginx modules are encouraged to use Auto Lib Core to handle library[m
[31m-dependencies for their modules rather than writing their own custom handler from scratch.[m
[31m-[m
[31m-Note : the latest version can be found at github.com/simpl/ngx_auto_lib[m
[31m-[m
[31m-[m
[31m-Information for end users[m
[31m-=========================[m
[31m-[m
[31m-To include external libraries using Auto Lib to you may need or wish to export some[m
[31m-variables before you run configure. e.g.[m
[31m-[m
[31m-$ export MOZJS=/path/to/mozjs[m
[31m-$ export MOZJS_SHARED=NO[m
[31m-$ ./configure ...[m
[31m-[m
[31m-In all cases below [PFX] should be replaced with the name of the library (e.g. MOZJS). The[m
[31m-specific value for [PFX] should be mentioned in the README file for the module that[m
[31m-uses Auto Lib Core.[m
[31m-[m
[31m-[m
[31m-Search order for paths[m
[31m-----------------------[m
[31m-[m
[31m-(1) [PFX]_INC and [PFX]_LIB[m
[31m-(2) [PFX] (source or install dir)[m
[31m-(3) any dirs under [PFX]_BASE (see below)[m
[31m-(4) any dirs under the parent directory of the Nginx source dir beginning with '[pfx]-'[m
[31m-(5) standard system paths (including /usr/local, /usr, /opt/local, /opt, /usr/pkg)[m
[31m-[m
[31m-If any of 1-3 are specified, then any set values will be searched, and the the Nginx[m
[31m-source's parent directory and system paths are not searched unless [PFX]_SEARCH_[PLACE][m
[31m-variable is set to YES, where PLACE ::= PARENT | SYSTEM. e.g.[m
[31m-[m
[31m-$ export OPENSSL_LIB=/path/to/openssl/lib[m
[31m-$ export OPENSSL_INC=/path/to/openssl/inc[m
[31m-$ ./configure[m
[31m-[m
[31m-will search only in the lib and include paths specified, and[m
[31m-[m
[31m-$ export OPENSSL_LIB=/path/to/openssl/lib[m
[31m-$ export OPENSSL_INC=/path/to/openssl/inc[m
[31m-$ export OPENSSL_BASE=/path/to/openssl/base[m
[31m-$ export OPENSSL_SEARCH_PARENT=YES[m
[31m-$ ./configure --with-openssl=/path/to/openssl[m
[31m-[m
[31m-will search first in the lib & inc dirs specified, then in /path/to/openssl, then will[m
[31m-look for directories in /path/to/openssl/base and then in the Nginx source parent[m
[31m-directory, but will skip checking the system paths.[m
[31m-[m
[31m-Note : apart from system paths, all dirs are checked as both source and install directories,[m
[31m-so static versions of installed OpenSSL, PCRE, Zlib etc libraries can be used with Nginx[m
[31m-if desired.[m
[31m-[m
[31m-[m
[31m-Specifying a path to find a library[m
[31m------------------------------------[m
[31m-[m
[31m-If the version of a library you wish to include is in any of the standard paths (e.g.[m
[31m-/usr/local, /usr ...), you will not need to specify a path to include the library.[m
[31m-[m
[31m-If you do wish to specify a specific path, in most cases just specifying [m
[31m-[PFX]=/path/to/library will be sufficient. e.g.[m
[31m-[m
[31m-$ export MOZJS=/path/to/mozjs[m
[31m-$ ./configure ...[m
[31m-[m
[31m-The path can be either a source directory or an install directory. Auto Lib will search[m
[31m-[m
[31m-[m
[31m-Searching under base paths[m
[31m---------------------------[m
[31m-[m
[31m-Rather than specifying a specific path to find new libraries in non-standard locations,[m
[31m-you may wish to specify a base path (or just let Auto Lib search the directory that the[m
[31m-Nginx source is located in). This will then automatically find the most recent versions[m
[31m-of libraries and check them before older versions.[m
[31m-[m
[31m-e.g.[m
[31m-[m
[31m-You have installations[m
[31m-[m
[31m-/openssl/version/0.9.8m[m
[31m-/openssl/version/1.0.0a[m
[31m-...[m
[31m-[m
[31m-$ export OPENSSL_BASE=/openssl/version[m
[31m-$ ./configure ...[m
[31m-[m
[31m-Any directories under /openssl/version will be searched IN REVERSE ORDER, i.e. most recent[m
[31m-version first. Here /openssl/version/1.0.0a would be searched before /openssl/version/0.9.8m.[m
[31m-[m
[31m-If [PFX]_BASE_SEARCH_PREFIX=YES, then only directories beginning with '[pfx]-' are searched.[m
[31m-If [PFX]_BASE_SEARCH_PREFIX=something, then only directories beginning with 'something' are[m
[31m-searched.[m
[31m-[m
[31m-When searching under [PFX]_BASE no prefix is added to the search, but when searching under[m
[31m-the directory that the Nginx source is located in, the prefix [pfx]- is automatically added.[m
[31m-[m
[31m-Note : there is currently a minor bug (due to the implementation of the 'sort' command) [m
[31m-means versions that include hyphens (e.g. 1.0.0-beta5) are checked before versions like [m
[31m-1.0.0a. This will be fixed soon, and searching of -build folders before normal source ones[m
[31m-will be added too.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Shared or static?[m
[31m------------------[m
[31m-[m
[31m-The default for most libraries is to look for shared libraries, though this can be overridden[m
[31m-by the user by setting [PFX]_SHARED=NO.[m
[31m-[m
[31m-In the near future the default action will be to look for shared libraries then to look [m
[31m-for static libraries in each directory searched unless one of [PFX]_SHARED and/or[m
[31m-[PFX]_STATIC = NO. If both are set to NO, then Auto Lib will not be used at all.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Variables that users can set to help find libraries[m
[31m----------------------------------------------------[m
[31m-[m
[31m-[PFX]                   Location of dir where the library can be found      (PATH, see below)[m
[31m-[PFX]_INC               Include dir for library headers                     (PATH)[m
[31m-[PFX]_LIB               Lib dir for library archive/shared objects          (PATH)[m
[31m-[PFX]_BASE              Base dir under which to search for other dirs       (PATH)[m
[31m-[PFX]_SEARCH_LIB_INC    Search in [PFX]_INC and [PFX]_LIB if set            (YES|NO, def=YES)[m
[31m-[PFX]_SEARCH_DIR        Search [PFX] if set                                 (YES|NO, def=YES)[m
[31m-[PFX]_SEARCH_BASE       Search under [PFX]_BASE if set                      (YES|NO, def=YES)[m
[31m-[PFX]_SEARCH_PARENT     Search under the dir that the Nginx source is in    (YES|NO, see above)[m
[31m-[PFX]_SEARCH_SYSTEM     Search in standard system paths                     (YES|NO, see above)[m
[31m-[PFX]_SHARED            Use shared library rather than static               (YES|NO, def=YES)[m
[31m-[PFX]_SYSTEM_DIRS       System dirs to search in (PATHS, space-separated, overrides the defaults)[m
[31m-USE_[PFX]               Whether or not to install the library               (YES|NO, def=YES)[m
[31m-[m
[31m-[m
[31m-Note : for libraries that have configure options (e.g. --with-openssl=/path), the [PFX][m
[31m-variable is set automatically by configure, so will not be used if exported.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Information for module developers[m
[31m-=================================[m
[31m-[m
[31m-How Auto Lib Core works[m
[31m------------------------[m
[31m-[m
[31m-Auto Lib Core works as an interface layer between the module and the auto/feature part of[m
[31m-the Nginx source. This is the file that results in the 'checking for ...' lines that you [m
[31m-see when you call ./configure.[m
[31m-[m
[31m-auto/feature works by using a few key variables (see below) to generate some C code, trying[m
[31m-to compile it to see if it works and optionally running the code. This output file is called[m
[31m-autotest.c (located under the objs/ directory whilst configure is running, but is deleted[m
[31m-after each call to auto/feature).[m
[31m-[m
[31m-Normally, whenever an external library is required, a module developer will write a number [m
[31m-of calls to auto/feature manually in their config files - e.g. to check under a range of [m
[31m-different possible locations to find a library. Apart from being tedious, this is obviously[m
[31m-potentially error-prone.[m
[31m-[m
[31m-Auto Lib Core will automatically generate all the calls to auto/feature for you, and will[m
[31m-take into account different operating systems etc in a consistent way, 'intelligent' way.[m
[31m-[m
[31m-[m
[31m-Including Nginx Auto Lib Core with custom modules[m
[31m--------------------------------------------------[m
[31m-[m
[31m-Option 1 :[m
[31m-[m
[31m-- include ngx_auto_lib_core in the same directory that your module config file is[m
[31m-  located[m
[31m-- add the following line to your config file[m
[31m-[m
[31m-  . $ngx_addon_dir/ngx_auto_lib_core [m
[31m-[m
[31m-NOTE : if you want to include the file in a different directory to your config[m
[31m-file, you will need to change both the include line in your config file AND[m
[31m-the line in the ngx_auto_lib_core file that points to the file (it's the line that[m
[31m-has $ngx_addon_dir/ngx_auto_lib_core in it)[m
[31m-[m
[31m-Option 2 :[m
[31m-[m
[31m-- make the Nginx Development Kit (github.com/simpl-it/ngx_devel_kit) a dependency [m
[31m-  for your module (Auto Lib Core is included automatically with it)[m
[31m-[m
[31m-[m
[31m-Recommended way of including Auto Lib Core[m
[31m-------------------------------------------[m
[31m-[m
[31m-If the Nginx Development Kit (NDK) is already a dependency for your module, then you do[m
[31m-not need to do anything - just follow the 'using Auto Lib Core' instructions below.[m
[31m-[m
[31m-If the NDK is not a dependency for your module, then it is recommended to include a[m
[31m-copy of ngx_auto_lib_core with your module, but to recommend to users of your module[m
[31m-to include the NDK when compiling. If the module is not required for anything else, this[m
[31m-will not make any difference to the Nginx binary that they compile, but will mean they[m
[31m-will get the latest version of Auto Lib Core (which probably won't change much anyway,[m
[31m-but you never know).[m
[31m-[m
[31m-You will also probably want to include a copy of this readme file for Auto Lib Core[m
[31m-(at least the user section), and mention what the relevant [PFX] you use for your module[m
[31m-is in your module's readme file so that users will know what to write for any variables[m
[31m-that they might use to control the search paths for libraries (see above user section).[m
[31m-[m
[31m-[m
[31m-Using Auto Lib Core[m
[31m--------------------[m
[31m-[m
[31m-To use Auto Lib Core, you should do the following in your config file for each[m
[31m-external library that you want to include :[m
[31m-[m
[31m-1 - Call ngx_auto_lib_init[m
[31m-2 - Define any variables used for testing[m
[31m-3 - Define any hooks (custom functions)[m
[31m-4 - Call ngx_auto_lib_run[m
[31m-[m
[31m-[m
[31m-Calling ngx_auto_lib_init() and ngx_auto_lib_run()[m
[31m---------------------------------------------------[m
[31m-[m
[31m-You can pass either one or two variables to ngx_auto_lib_init(). The first is the name of[m
[31m-the library as it will appear when running ./configure, the second is the prefix that is[m
[31m-used for internal variables and looking for directory prefixes. If the second is not [m
[31m-specified, it defaults to the first.[m
[31m-[m
[31m-The init function resets all key variables and functions, so it must be called before [m
[31m-setting any other variables or functions that are to be used as hooks (see the notes below).[m
[31m-[m
[31m-ngx_auto_lib_run() should be called in the config files after all the variables and hooks[m
[31m-have been defined. This will then run through all the tests to try to find the external[m
[31m-library.[m
[31m-[m
[31m-[m
[31m-Variables you can set in your config files[m
[31m-------------------------------------------[m
[31m-[m
[31m-All the variables that you set in Auto Lib Core are similar to the ones you set for[m
[31m-including libraries in the normal way.[m
[31m-[m
[31m-       name                           description[m
[31m-----------------------------------------------------------------------------------------[m
[31m-[m
[31m-core variables (i.e. the ones in the core Nginx source)[m
[31m-[m
[31m-ngx_feature_inc_path                CFLAGS and include path info (including -I)[m
[31m-ngx_feature_incs                    Include/define code inserted before main() in autotest.c[m
[31m-ngx_feature_libs                    External libraries to add (see below)[m
[31m-ngx_feature_path                    Space-separated include path[m
[31m-ngx_feature_run                     Whether to run the autotest binary (default = no)[m
[31m-ngx_feature_test                    C-code inserted inside main() in autotest.c[m
[31m-[m
[31m-extended variables (only work in NALC) :[m
[31m-[m
[31m-ngx_feature_add_libs                Add libraries (but do not add include files)[m
[31m-ngx_feature_add_path                Add extra directories to include path[m
[31m-ngx_feature_build_dirs              Sub dirs that builds might be found[m
[31m-ngx_feature_build_inc_dirs          Sub dirs that include files might be found[m
[31m-ngx_feature_build_lib_dirs          Sub dirs that lib files might be found[m
[31m-ngx_feature_check_macros_defined    Lib required only if one of these macros is defined[m
[31m-ngx_feature_check_macros_non_zero   Lib required only if one of these macros is non-zero[m
[31m-ngx_feature_defines                 Define these macros if the library is found[m
[31m-ngx_feature_deps                    Deps to add (e.g. to CORE_DEPS) if the library is found[m
[31m-ngx_feature_exit_if_not_found       Quit configure if the library is not found[m
[31m-ngx_feature_haves                   Set these macros to 1 if the library is found[m
[31m-ngx_feature_inc_names               Names for include files (not including the .h)[m
[31m-ngx_feature_lib_files               Add these files under the lib dir for static inclusions[m
[31m-ngx_feature_lib_names               Names for lib files (not including -l or .a)[m
[31m-ngx_feature_modules                 Modules to add if the library is found[m
[31m-ngx_feature_srcs                    Sources to add (e.g. to ADDON_SRCS) if the lib is found[m
[31m-ngx_feature_shared                  If set to 'no', then only use static lib versions[m
[31m-ngx_feature_test_libs               Add these libs when testing, but not to the final binary[m
[31m-ngx_feature_variables               Set these variables if the library is found[m
[31m-[m
[31m-standard variables that are completely over-written (i.e. they won't work with NALC) :[m
[31m-[m
[31m-ngx_feature_name                    Message that is displayed after 'checking for' in configure[m
[31m-[m
[31m-[m
[31m-Using these variables[m
[31m----------------------[m
[31m-[m
[31m-You do not need to set most of these variables, since 'intelligent' guesses are made that[m
[31m-will work for most cases. With the exception of ngx_feature_test, you should generally use[m
[31m-the extended variables rather than the core ones, since sensible core variables will be[m
[31m-automatically generated from them, and will work for both static and shared libraries.[m
[31m-[m
[31m-[m
[31m-Variable defaults[m
[31m------------------[m
[31m-[m
[31m-ngx_feature_incs            for i in $ngx_feature_inc_names { #include <$i.h> }[m
[31m-ngx_feature_libs            for l in $ngx_feature_lib_names { -l$l or $LIB/lib$l.a }[m
[31m-                            + $ngx_feature_add_libs[m
[31m-ngx_feature_inc_names       $ngx_feature_lib_names[m
[31m-ngx_feature_lib_names       $pfx[m
[31m-pfx                         str_to_lower (if two variables are passed to ngx_auto_lib_init, then[m
[31m-                            then $2, otherwise, $1)[m
[31m-[m
[31m-The easiest way to understand how all the defaults work is probably to look at the source code[m
[31m-of ngx_auto_lib_test_setup() and to look at the examples in the standard Nginx Auto Lib module[m
[31m-which has code for OpenSSL, PCRE, Zlib, MD5 and SHA1.[m
[31m-[m
[31m-[m
[31m-Hooks[m
[31m------[m
[31m-[m
[31m-To facilitate using Auto Lib Core in a flexible way, a number of 'hooks' have been[m
[31m-placed in the testing cycle. These hooks are implemented as functions that you define[m
[31m-in your config file which are called if required by the core library. In the core [m
[31m-library they are left as empty functions that return either 0 or 1. Any functions[m
[31m-you write will [m
[31m-[m
[31m-Note : ngx_auto_lib_init() resets the variables and functions each time it is called, so[m
[31m-you must DEFINE HOOKS AFTER YOU CALL ngx_auto_lib_init.[m
[31m-[m
[31m-Note : an update on what hooks are available will be added later. To see what hooks are[m
[31m-available, just look in the source code of ngx_auto_lib_core for any functions that just[m
[31m-return 0 or 1.[m
[31m-[m
[31m-See the MD5 and SHA1 libraries of Nginx Auto Lib module for examples.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Checking that a library is required[m
[31m------------------------------------[m
[31m-[m
[31m-Although in most cases Auto Lib Core will be used where external libraries are[m
[31m-definitely required (for a module to work), this may not always be the case. In the[m
[31m-standard Nginx Auto Lib module (github.com/simpl-it/ngx_auto_lib) - which is designed[m
[31m-to improve the inclusion of OpenSSL, PCRE and Zlib libraries and increase compilation[m
[31m-speed where possible - the libraries are not always required, so checks are made to [m
[31m-see if it is necessary.[m
[31m-[m
[31m-[m
[31m-[m
[31m-How Auto Lib Core checks if a library is required - ngx_auto_lib_check_require()[m
[31m-------------------------------------------------------------------------------------[m
[31m-[m
[31m-- search for USE_[PFX]=YES (it is set to YES by default for most modules)[m
[31m-- search for any external libraries that have been included in the CORE_LIBS or ADDON_LIBS[m
[31m-  variables that use the same lib name as any set in ngx_feature_lib_names[m
[31m-- search for any macros that have been defined either in the CFLAGS variable or using [m
[31m-  auto/have or auto/define as set in the ngx_feature_check_macros_defined and [m
[31m-  ngx_feature_ngx_macros_non_zero variables[m
[31m-- any custom checks implemented by creating an ngx_auto_lib_check hook function (which[m
[31m-  should return 0 if the library is required and return 1 at the end if the module is [m
[31m-  not required)[m
[31m-[m
[31m-[m
[31m-[m
[31m-Guaranteeing that the correct version of a shared library is linked at run time[m
[31m--------------------------------------------------------------------------------[m
[31m-[m
[31m-Sometimes users will want to use shared libraries that are in non-standard locations[m
[31m-that the linker may have a problem in locating at run time - even if the correct[m
[31m-linker path (-L/path/to/lib) is supplied when checking. To make sure that the linker[m
[31m-can find the library at run time, and to make sure that the linker will use the correct[m
[31m-version of a library if the library is also located in a standard directory, a run path[m
[31m-is added to the linker flags (using -Wl,--rpath -Wl,/path/to/lib/dir). In most cases this[m
[31m-will guarantee that the correct library is used when linking - though care should be taken[m
[31m-by any users specifying specific paths for libraries that the correct version of the[m
[31m-library has been linked at run time (e.g. using ldd etc).[m
[31m-[m
[31m-As an additional check when running auto/feature, as well as the compilation of the[m
[31m-autotest.c file, a check is made by ldd to see that the path of the shared library[m
[31m-that the linker links to is the same as the one specified. This is done because[m
[31m-[m
[31m-[m
[31m-To do[m
[31m------[m
[31m-[m
[31m-- change how library paths are searched to include both shared and static libraries[m
[31m-- touch up documentation[m
[31m-[m
[31m-[m
[31m-License[m
[31m--------[m
[31m-[m
[31m-    BSD[m
[31m-[m
[31m-[m
[31m-Copyright[m
[31m----------[m
[31m-[m
[31m-    Marcus Clyne (c) 2010  (http://simpl.it)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/TODO b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/TODO[m
[1mdeleted file mode 100644[m
[1mindex 0acf8bf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/TODO[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-- for backward compatability, add the ndk_macros [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/actions/array b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/actions/array[m
[1mdeleted file mode 100644[m
[1mindex 04cd889..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/actions/array[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-[m
[31m-array_create        (a,pl,n,sz)     a = %1%_array_create (pl,n,sz); if (a == NULL) %A%[m
[31m-array_init          (a,pl,n,sz)     if (%1%_array_init (a,pl,n,sz) == %E%) %A%[m
[31m-array_push          (p,a)           p = %1%_array_push (a);     if (p == NULL) %A%[m
[31m-array_push_clean    (p,a)           p = %1%_array_push (a);     if (p == NULL) %A%; %2%_zerop (p)[m
[31m-array_push_n        (p,a,n)         p = %1%_array_push_n (a,n); if (p == NULL) %A%[m
[31m-array_push_n_clean  (p,a,n)         p = %1%_array_push_n (a,n); if (p == NULL) %A%; %2%_zeropn (p,n)[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/actions/palloc b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/actions/palloc[m
[1mdeleted file mode 100644[m
[1mindex 6d430bd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/actions/palloc[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-[m
[31m-palloc              (p,pl,sz)       p = %1%_palloc (pl,sz);    if (p == NULL) %A%[m
[31m-pallocp             (p,pl)          %2%_pallocp (p,pl);        if (p == NULL) %A%[m
[31m-pallocpn            (p,pl,n)        %2%_pallocpn (p,pl,n);     if (p == NULL) %A%[m
[31m-pcalloc             (p,pl,sz)       p = %1%_pcalloc (pl,sz);   if (p == NULL) %A%[m
[31m-pcallocp            (p,pl)          %2%_pcallocp (p,pl);       if (p == NULL) %A%[m
[31m-pcallocpn           (p,pl,n)        %2%_pcallocpn (p,pl,n);    if (p == NULL) %A%[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/build b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/build[m
[1mdeleted file mode 100644[m
[1mindex feb84b3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/build[m
[1m+++ /dev/null[m
[36m@@ -1,597 +0,0 @@[m
[31m-#! /bin/bash[m
[31m-[m
[31m-cd `dirname $0`[m
[31m-[m
[31m-if [ $# -eq 2 ];[m
[31m-then[m
[31m-  if [ `expr $2 : /` -eq 1 ];[m
[31m-  then[m
[31m-    output_dir=$2[m
[31m-  else[m
[31m-    output_dir=$1/$2[m
[31m-  fi[m
[31m-else[m
[31m-    output_dir=../objs[m
[31m-fi[m
[31m-[m
[31m-list_file=data/action_list[m
[31m-types_file=data/action_types[m
[31m-reps_file=data/action_replacements[m
[31m-prefix_file=data/prefixes [m
[31m-header_file=data/header_files[m
[31m-optional_modules_file=data/modules_optional[m
[31m-headers_file=data/headers[m
[31m-module_dependencies_file=data/module_dependencies[m
[31m-conf_macros_file=data/conf_macros[m
[31m-conf_locs_file=data/conf_locs[m
[31m-conf_args_file=data/conf_args[m
[31m-[m
[31m-autogen_notice=text/autogen[m
[31m-[m
[31m-actions_dir=actions[m
[31m-srcs_dir=src[m
[31m-include_prefix=[m
[31m-file_prefix=ndk_[m
[31m-auto_file_name=config[m
[31m-auto_includes_name=includes[m
[31m-[m
[31m-conf_merge_filename=conf_merge.h[m
[31m-conf_cmd_basic_filename=conf_cmd_basic.h[m
[31m-conf_cmd_extra_filename=conf_cmd_extra.h[m
[31m-[m
[31m-[m
[31m-spacer=¬[m
[31m-[m
[31m-sed_delete_empty_lines='t_NEL;d;:_NEL'[m
[31m-[m
[31m-[m
[31m-function trim_lines {[m
[31m-    sed -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}'[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function strtoupper {[m
[31m-    [ $# -eq 1 ] || return 1[m
[31m-    local _str _cu _cl _x[m
[31m-    _cu=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)[m
[31m-    _cl=(a b c d e f g h i j k l m n o p q r s t u v w x y z)[m
[31m-    _str=$1[m
[31m-    for ((_x=0;_x<${#_cl[*]};_x++)); do[m
[31m-        _str=${_str//${_cl[$_x]}/${_cu[$_x]}}[m
[31m-    done[m
[31m-    echo $_str[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function sed_pad_right {[m
[31m-    len=$1[m
[31m-    spacer=$2[m
[31m-    prefix=_PR$3[m
[31m-[m
[31m-    # returns a SED script that pads out (spaces) to the right to alignment $len[m
[31m-    # this script should be used inside a call to sed[m
[31m-    # NOTE : a spacer character $spacer should have already been written into the parsed string[m
[31m-[m
[31m-    echo "t${prefix}a;:${prefix}a;s/^[^$spacer]{$len}/&/;\[m
[31m-t${prefix}b;s/^[^$spacer]*/& /;t${prefix}a;:${prefix}b;s/$spacer/ /"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function sed_pad_left {[m
[31m-[m
[31m-    len=$1[m
[31m-    spacer=$2[m
[31m-    prefix=_PL$3[m
[31m-[m
[31m-   # echo "t${prefix}a;:${prefix}a;s/^[^$spacer]{$len}/& /;t${prefix}a"     # NOT CORRECT?[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_notice {[m
[31m-[m
[31m-    echo > $1[m
[31m-    cat $autogen_notice | trim_lines >> $1[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-function add_non_generated_content {[m
[31m-[m
[31m-    file=src/$1.h[m
[31m-    [ ! -f $file ] && return[m
[31m-[m
[31m-    echo "/* Non-generated macros */" >> $2[m
[31m-    echo >> $2[m
[31m-[m
[31m-    cat $file | trim_lines >> $2[m
[31m-[m
[31m-    echo >> $2[m
[31m-    echo >> $2[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_action_macros {[m
[31m-[m
[31m-    list_file=$actions_dir/$1[m
[31m-[m
[31m-    [ ! -f $list_file ] && return[m
[31m-[m
[31m-    out=$2[m
[31m-[m
[31m-[m
[31m-    # alignment settings[m
[31m-[m
[31m-    align1=20[m
[31m-    align2=35[m
[31m-    align3=62[m
[31m-    base_shrink=12[m
[31m-    define="#define     "[m
[31m-[m
[31m-[m
[31m-[m
[31m-    # base macros[m
[31m-[m
[31m-    echo "/* base action macro macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    cat $list_file | trim_lines | sed -r \[m
[31m-    -e "s/^[ ]*([a-zA-Z0-9_]+)([ ]*)\(([a-zA-Z0-9_,]+)\)([ ]*)(.*)/$define%2%_\1_ac(\3,ac)\2\4  {\5;}/" \[m
[31m-    -e "s/[ ]{$base_shrink}\{/\{/" \[m
[31m-    -e 's/%A%/ac/g' \[m
[31m-    >> $out[m
[31m-[m
[31m-    echo >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-[m
[31m-    # generated macros[m
[31m-[m
[31m-    echo "/* generated action macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    cat -s $list_file | while read list_line; do[m
[31m-[m
[31m-        [ "x`echo $list_line`" = 'x' ] && continue[m
[31m-[m
[31m-        cat $types_file | while read type_line; do[m
[31m-[m
[31m-            [ "x`echo $type_line`" = 'x' ] && continue  [m
[31m-[m
[31m-            #ext=`echo $type_line | grep -E '^[a-zA-Z0-9_]+' | cut -d " " -f1`[m
[31m-            ext=`echo $type_line | sed -r 's/^([a-zA-Z0-9_]+).*/\1/'`[m
[31m-            params=`echo $type_line | sed -r 's/^[a-zA-Z0-9_]+[ ]*\((.*)\).*/\1/;ta;d;:a'`[m
[31m-            act=`echo $type_line | sed -r 's/^[a-zA-Z0-9_]+[ ]*(\(.*\))?(.*)/\2/'`[m
[31m-            [ "x$params" != "x" ] && params=",$params"[m
[31m-[m
[31m-            echo $list_line | sed -r \[m
[31m-            -e "s/^([a-zA-Z0-9_]+)[ ]*\(([a-zA-Z0-9_,]+)\).*/%2%_\1_$ext(\2$params)$spacer%2%_\1_ac$spacer(\2,$act)/" \[m
[31m-            -e 's/[ ]*,[ ]*/,/g' \[m
[31m-            -e "`sed_pad_right $align2 $spacer 1`" \[m
[31m-            -e "`sed_pad_right $align3 $spacer 2`" \[m
[31m-            -e "s/.*/$define&/" \[m
[31m-            >> $out[m
[31m-        done[m
[31m-        echo >> $out[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function replace_prefixes {[m
[31m-[m
[31m-    temp=.temp[m
[31m-[m
[31m-    file=`cat $prefix_file`[m
[31m-[m
[31m-    prefix1=[m
[31m-    prefix2=[m
[31m-[m
[31m-    for prefix in $file ; do[m
[31m-        [ "x$prefix2" != "x" ] && echo "Too many prefixes in prefix file $prefix_file" && exit 1[m
[31m-        [ "x$prefix1" != "x" ] && prefix2=$prefix && continue[m
[31m-        prefix1=$prefix[m
[31m-    done[m
[31m-[m
[31m-    sed -r "s/%1%/$prefix1/g;s/%2%/$prefix2/g" < $1 > $temp[m
[31m-[m
[31m-    mv -f $temp $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function replace_other_strings {[m
[31m-[m
[31m-    temp=.temp[m
[31m-[m
[31m-    cat $reps_file | while read line; do[m
[31m-[m
[31m-        rep1=[m
[31m-        rep2=[m
[31m-[m
[31m-        for rep in $line ; do[m
[31m-            [ "x$rep2" != "x" ] && echo "Too many replacments in replacements file $reps_file" && exit 1[m
[31m-            [ "x$rep1" != "x" ] && rep2=$rep && continue[m
[31m-            rep1=$rep[m
[31m-        done[m
[31m-[m
[31m-        sed -r "s/%$rep1%/$rep2/g" < $1 > $temp[m
[31m-        mv -f $temp $1[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_header_file {[m
[31m-[m
[31m-    name=$1[m
[31m-    out=$output_dir/$file_prefix$name.h[m
[31m-[m
[31m-    add_notice $out[m
[31m-    add_non_generated_content $name $out[m
[31m-    add_action_macros $name $out[m
[31m-    replace_prefixes $out[m
[31m-    replace_other_strings $out[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_auto_include {[m
[31m-    echo "#include  <${file_prefix}$2>" >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function add_include {[m
[31m-    echo "#include  <${include_prefix}${file_prefix}$2>" >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_non_optional_h_includes {[m
[31m-[m
[31m-    # TODO : split into auto-generated and non-auto-generated ones[m
[31m-[m
[31m-    echo "/* non-optional includes */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    for mod in `cat $headers_file | sort`; do[m
[31m-[m
[31m-        add_auto_include  $1  $mod.h[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_include_all_includes {[m
[31m-[m
[31m-    echo "/* include all optional modules */" >> $1[m
[31m-    echo >> $1[m
[31m-    echo "#ifdef NDK_ALL" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    modules=`cat $optional_modules_file | sed 's/*//g' | sort`[m
[31m-[m
[31m-    for mod in $modules; do[m
[31m-        def="NDK_`strtoupper $mod`"[m
[31m-        echo "#ifndef $def" >> $1[m
[31m-        echo "#define $def 1" >> $1[m
[31m-        echo "#endif" >> $1[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo "#endif" >> $1[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_dependent_includes {[m
[31m-[m
[31m-    echo "/* module dependencies */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    cat $module_dependencies_file | while read line; do[m
[31m-[m
[31m-        first=1[m
[31m-[m
[31m-        for mod in $line; do[m
[31m-[m
[31m-            def="NDK_`strtoupper $mod`"[m
[31m-[m
[31m-            if [ $first = 1 ] ; then[m
[31m-[m
[31m-                echo "#ifdef  $def" >> $1[m
[31m-                first=0[m
[31m-            else[m
[31m-                echo "#ifndef $def" >> $1[m
[31m-                echo "#define $def 1" >> $1[m
[31m-                echo "#endif" >> $1[m
[31m-            fi[m
[31m-        done[m
[31m-[m
[31m-        [ $first = 0 ] && echo "#endif" >> $1[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_optional_h_includes {[m
[31m-[m
[31m-    echo "/* optional includes */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    for mod in $modules; do[m
[31m-        def="NDK_`strtoupper $mod`"[m
[31m-        echo "#if ($def)" >> $1[m
[31m-        add_include  $1  $mod.h[m
[31m-        echo "#endif" >> $1[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_conf_merge_macros_file {[m
[31m-[m
[31m-    file=$conf_merge_filename[m
[31m-    out_file=${file_prefix}$file[m
[31m-    out=$output_dir/$out_file[m
[31m-[m
[31m-    add_notice $out[m
[31m-[m
[31m-    echo "/* conf-merge-value macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    cat $srcs_dir/$file | trim_lines >> $out[m
[31m-    echo >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    echo "/* conf-merge-prop macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    echo "#define     ndk_conf_merge_prop(prop,default)\\" >> $out[m
[31m-    echo "            ndk_conf_merge_value\\" >> $out[m
[31m-    echo "                (conf->prop, prev->prop, default)" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    # loads macros, removes empty elements, sorts and translates to merge-prop macros[m
[31m-[m
[31m-    cat $conf_macros_file | sed -r 's/^[A-Z0-9_]+[ ]*[A-Z0-9_]+[ ]*([a-z0-9_]+).*$/\1/;ta;d;:a' \[m
[31m-        | sort | sed -r \[m
[31m-        's/(.*)/#define     ndk_conf_merge_\1_prop(prop,default,...)\\\[m
[31m-            ndk_conf_merge_\1_value\\\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)\[m
[31m-    /' \[m
[31m-    >> $out[m
[31m-[m
[31m-    add_auto_include $1 $file[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_conf_cmd_basic_file {[m
[31m-[m
[31m-    temp=.rep[m
[31m-    file=$conf_cmd_basic_filename[m
[31m-    out_file=${file_prefix}$file[m
[31m-    out=$output_dir/$out_file[m
[31m-[m
[31m-    align1=35[m
[31m-[m
[31m-    # initial text[m
[31m-[m
[31m-    add_notice $out[m
[31m-[m
[31m-[m
[31m-    # add ndk bitmasks[m
[31m-[m
[31m-    echo "/* conf cmd core values/bitmasks */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-    cat $conf_args_file | sort | trim_lines | sed -r \[m
[31m-    -e "s/^([A-Z0-9_]+)/${define}NDK_\1${spacer}NGX_\1/" \[m
[31m-    -e $sed_delete_empty_lines \[m
[31m-    -e  "`sed_pad_right $align1 $spacer`" \[m
[31m-    >> $out[m
[31m-[m
[31m-    echo >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-    # add additional bitmasks stored in file[m
[31m-[m
[31m-    echo "/* conf cmd bitmasks */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    cat $srcs_dir/$conf_cmd_basic_filename | trim_lines >> $out[m
[31m-[m
[31m-    echo >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-    echo "/* conf cmd basic macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-    # build replacement string[m
[31m-[m
[31m-    echo -n "s/^([A-Z0-9_]+)$/" > $temp[m
[31m-[m
[31m-    cat $conf_locs_file | sed \[m
[31m-    -r -e 's/^([A-Z0-9_]+) *([A-Z0-9_]+).*/#define     NDK_\1_CONF_\\1\(name,func,off1,off2,post)\\\\\\\[m
[31m-                                    {ngx_string (name),\\\\\\\[m
[31m-                                    NGX_CONF_\\1|NDK_\1_CONF,\\\\\\\[m
[31m-                                    func, off1, off2, post},\\\[m
[31m-\\/' -e $sed_delete_empty_lines \[m
[31m-    >> $temp[m
[31m-[m
[31m-    echo -n "/;$sed_delete_empty_lines" >> $temp[m
[31m-[m
[31m-[m
[31m-    # apply the replacement string to the [m
[31m-[m
[31m-    cat $conf_args_file | sort | trim_lines | sed -rf $temp >> $out[m
[31m-    rm -f $temp[m
[31m-[m
[31m-    add_auto_include $1 $file[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_conf_cmd_extra_file {[m
[31m-[m
[31m-    temp=.rep[m
[31m-    file=$conf_cmd_extra_filename[m
[31m-    out=$output_dir/${file_prefix}$file[m
[31m-[m
[31m-    align1=35[m
[31m-[m
[31m-    # initial text[m
[31m-[m
[31m-    add_notice $out[m
[31m-[m
[31m-    echo "/* conf command macros */" >> $out[m
[31m-    echo >> $out[m
[31m-[m
[31m-[m
[31m-    # build replacement string[m
[31m-[m
[31m-    echo -n 's/^([A-Z0-9_]+)[ ]*([A-Z0-9_]+)[ ]*([a-z0-9_]+).*$/' > $temp[m
[31m-[m
[31m-    cat $conf_locs_file | sed \[m
[31m-    -r -e 's/^([A-Z0-9_]+)[ ]*([A-Z0-9_]+)[ ]*([a-zA-Z0-9_]+)/#define     NDK_\1_CONF_\\1(name,p,post\)\\\\\\\[m
[31m-            NDK_\1_CONF_\\2\\\\\\\[m
[31m-                (name,\\\\\\\[m
[31m-                ndk_conf_set_\\3_slot,\\\\\\\[m
[31m-                NGX_\2_CONF_OFFSET,\\\\\\\[m
[31m-                offsetof (ndk_module_\3_conf_t, p),\\\\\\\[m
[31m-                post)\\\[m
[31m-\\/' -e $sed_delete_empty_lines \[m
[31m-    >> $temp[m
[31m-[m
[31m-    echo -n "/;$sed_delete_empty_lines" >> $temp[m
[31m-    #echo -n ";`sed_pad_right 60 $spacer`" >> $temp[m
[31m-[m
[31m-[m
[31m-    # apply the replacement string to the [m
[31m-[m
[31m-    cat $conf_macros_file | sort | trim_lines | sed -rf $temp -e "`sed_pad_right 60 $spacer`" >> $out[m
[31m-    rm -f $temp[m
[31m-[m
[31m-    add_auto_include $1 $file[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_auto_generated_h_includes {[m
[31m-[m
[31m-    echo "/* auto-generated headers */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    for name in `cat $header_file | sort` ; do[m
[31m-[m
[31m-        generate_header_file $name[m
[31m-        add_auto_include $1 $name.h[m
[31m-    done[m
[31m-[m
[31m-    generate_conf_merge_macros_file $1[m
[31m-    generate_conf_cmd_basic_file $1[m
[31m-    generate_conf_cmd_extra_file $1[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_optional_c_includes {[m
[31m-[m
[31m-    echo "/* optional includes */" >> $1[m
[31m-    echo >> $1[m
[31m-[m
[31m-    modules=`cat $optional_modules_file | sed 's/*//g' | sort`[m
[31m-[m
[31m-    for mod in $modules; do[m
[31m-        def="NDK_`strtoupper "$mod"`"[m
[31m-        echo "#if ($def)" >> $1[m
[31m-        add_include $1 $mod.c[m
[31m-        echo "#endif" >> $1[m
[31m-    done[m
[31m-[m
[31m-    echo >> $1[m
[31m-    echo >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_commands {[m
[31m-[m
[31m-    echo "/* module commands */" >> $1[m
[31m-    echo >> $1[m
[31m-    echo "static ngx_command_t  ndk_http_commands[] = {" >> $1[m
[31m-[m
[31m-    cat $optional_modules_file | sort | while read line; do[m
[31m-[m
[31m-        cmds=`echo "$line" | grep -E '\*'`[m
[31m-[m
[31m-        [ "x$cmds" = "x" ] && continue[m
[31m-[m
[31m-        mod=`echo "$line" | grep -E '^[a-zA-Z0-9_]+' | cut -d " " -f1`[m
[31m-        up=`strtoupper $mod`[m
[31m-        def="NDK_$up"[m
[31m-        defcmd="NDK_${up}_CMDS"[m
[31m-[m
[31m-        echo "#if ($def)"                   >> $1[m
[31m-        echo "#define $defcmd 1"            >> $1[m
[31m-        add_include  $1  $mod.h[m
[31m-        echo "#undef  $defcmd"              >> $1[m
[31m-        echo "#endif"                       >> $1[m
[31m-[m
[31m-    done[m
[31m-[m
[31m-    echo -e "    ngx_null_command\n};"      >> $1[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_all_h_files {[m
[31m-[m
[31m-    out=$output_dir/${file_prefix}$auto_file_name.h[m
[31m-[m
[31m-    add_notice $out[m
[31m-[m
[31m-    generate_include_all_includes $out[m
[31m-    generate_dependent_includes $out[m
[31m-[m
[31m-    out=$output_dir/${file_prefix}$auto_includes_name.h[m
[31m-[m
[31m-    generate_optional_h_includes $out[m
[31m-    generate_non_optional_h_includes $out[m
[31m-    generate_auto_generated_h_includes $out $list[m
[31m-}[m
[31m-[m
[31m-[m
[31m-function generate_all_c_files {[m
[31m-[m
[31m-    out=$output_dir/${file_prefix}$auto_file_name.c[m
[31m-[m
[31m-    add_notice $out[m
[31m-    generate_optional_c_includes $out[m
[31m-    generate_commands $out[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-function generate_all_files {[m
[31m-[m
[31m-    mkdir -p $output_dir[m
[31m-    rm -f $output_dir/*[m
[31m-[m
[31m-    generate_all_h_files[m
[31m-    generate_all_c_files[m
[31m-}[m
[31m-[m
[31m-generate_all_files[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/action_replacements b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/action_replacements[m
[1mdeleted file mode 100644[m
[1mindex f419bc3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/action_replacements[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-[m
[31m-OK      NGX_OK[m
[31m-E       NGX_ERROR[m
[31m-CE      NGX_CONF_ERROR[m
[31m-COK     NGX_CONF_OK[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/action_types b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/action_types[m
[1mdeleted file mode 100644[m
[1mindex 284a5cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/action_types[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-r0          return 0[m
[31m-r1          return 1[m
[31m-r_1         return -1[m
[31m-rok         return %OK%[m
[31m-rce         return %CE%[m
[31m-rcok        return %COK%[m
[31m-re          return %E%[m
[31m-rn          return NULL[m
[31m-rse         {ngx_script_error (e); return;}[m
[31m-sce         {ngx_script_configure_error (c); return;}[m
[31m-g(_lb)      goto _lb[m
[31m-ge          goto error[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_args b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_args[m
[1mdeleted file mode 100644[m
[1mindex 752b533..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_args[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m- [m
[31m-TAKE1[m
[31m-TAKE2[m
[31m-TAKE3[m
[31m-TAKE4[m
[31m-TAKE5[m
[31m-TAKE6[m
[31m-TAKE7[m
[31m-TAKE8[m
[31m-TAKE12[m
[31m-TAKE13[m
[31m-TAKE23[m
[31m-TAKE123[m
[31m-TAKE1234[m
[31m-1MORE[m
[31m-2MORE[m
[31m-ANY[m
[31m-FLAG[m
[31m-BLOCK[m
[31m-MULTI[m
[31m-ARGS_NUMBER[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_locs b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_locs[m
[1mdeleted file mode 100644[m
[1mindex f5352c3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_locs[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-HTTP_MAIN                   HTTP_MAIN       main[m
[31m-HTTP_SRV                    HTTP_SRV        srv[m
[31m-HTTP_SIF                    HTTP_SRV        srv[m
[31m-HTTP_LOC                    HTTP_LOC        loc[m
[31m-HTTP_LIF                    HTTP_LOC        loc[m
[31m-[m
[31m-HTTP_MAIN_SRV               HTTP_SRV        srv[m
[31m-HTTP_MAIN_SIF               HTTP_SRV        srv[m
[31m-HTTP_MAIN_LOC               HTTP_LOC        loc[m
[31m-HTTP_MAIN_LIF               HTTP_LOC        loc[m
[31m-[m
[31m-HTTP_SRV_LOC                HTTP_LOC        loc[m
[31m-HTTP_SRV_LIF                HTTP_LOC        loc[m
[31m-HTTP_SIF_LOC                HTTP_LOC        loc[m
[31m-HTTP_SIF_LIF                HTTP_LOC        loc[m
[31m-[m
[31m-HTTP_MAIN_SRV_LOC           HTTP_LOC        loc[m
[31m-HTTP_MAIN_SRV_LIF           HTTP_LOC        loc[m
[31m-HTTP_MAIN_SIF_LOC           HTTP_LOC        loc[m
[31m-HTTP_MAIN_SRV_SIF_LOC       HTTP_LOC        loc[m
[31m-HTTP                        HTTP_LOC        loc[m
[31m-HTTP_UPS                    HTTP_LOC        loc[m
[31m-HTTP_ANY                    HTTP_LOC        loc[m
[31m-ANY                         HTTP_LOC        loc[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_macros b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_macros[m
[1mdeleted file mode 100644[m
[1mindex f42206a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/conf_macros[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-[m
[31m-BITMASK             1MORE       bitmask[m
[31m-BUFS                TAKE1       bufs[m
[31m-COMPLEX_KEYVAL      TAKE2       http_complex_keyval[m
[31m-COMPLEX_PATH        TAKE1       http_complex_path[m
[31m-COMPLEX_VALUE       TAKE1       http_complex_value[m
[31m-COMPLEX_VALUE_ARRAY 1MORE       http_complex_value_array[m
[31m-ENCODING            TAKE1       encoding[m
[31m-ENUM                TAKE1       enum[m
[31m-FALSE               NOARGS      false[m
[31m-FULL_PATH           TAKE1       full_path[m
[31m-KEYVAL              TAKE2       keyval[m
[31m-KEYVAL1             TAKE2       keyval1[m
[31m-MSEC                TAKE1       msec[m
[31m-NULL                NOARGS      null[m
[31m-NUM                 TAKE1       num[m
[31m-NUM64               TAKE1       num64[m
[31m-NUM_FLAG            TAKE1       num_flag[m
[31m-ONOFF               FLAG        flag[m
[31m-OFF                 TAKE1       off[m
[31m-PATH                TAKE1       split_path[m
[31m-REXEX               TAKE1       regex[m
[31m-REGEX_CL            TAKE1       regex_caseless[m
[31m-REGEX_ARRAY         1MORE       regex_array[m
[31m-REGEX_ARRAY_CL      1MORE       regex_array_caseless[m
[31m-PTR                 NOARGS      ptr[m
[31m-SEC                 TAKE1       sec[m
[31m-SEC_FLAG            TAKE2       sec_flag[m
[31m-SIZE                TAKE1       size[m
[31m-STR                 TAKE1       str[m
[31m-STR_ARRAY           1MORE       str_array_multi[m
[31m-STR_ARRAY1          TAKE1       str_array[m
[31m-TRUE                NOARGS      true[m
[31m-[m
[31m- [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/contexts b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/contexts[m
[1mdeleted file mode 100644[m
[1mindex e7e8ff0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/contexts[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m- [m
[31m-MAIN[m
[31m-SRV[m
[31m-SIF[m
[31m-LOC[m
[31m-LIF[m
[31m-[m
[31m-MAIN_SRV[m
[31m-MAIN_SIF[m
[31m-MAIN_LOC[m
[31m-MAIN_LIF[m
[31m-SRV_LOC[m
[31m-SRV_LIF[m
[31m-SIF_LOC[m
[31m-SIF_LIF[m
[31m-[m
[31m-MAIN_SRV_LOC[m
[31m-MAIN_SRV_LIF[m
[31m-MAIN_SIF_LOC[m
[31m-MAIN_SIF_LIF[m
[31m-ANY_MAIN[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/header_files b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/header_files[m
[1mdeleted file mode 100644[m
[1mindex aa0f11c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/header_files[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-array[m
[31m-palloc[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/headers b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/headers[m
[1mdeleted file mode 100644[m
[1mindex 7583cb9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/headers[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-http_headers[m
[31m-log[m
[31m-parse[m
[31m-string_util[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/module_dependencies b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/module_dependencies[m
[1mdeleted file mode 100644[m
[1mindex a179316..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/module_dependencies[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-complex_path    complex_value   path[m
[31m-conf_file       string[m
[31m-hash            string[m
[31m-set_var         rewrite[m
[31m-upstream_list   http_create_main_conf[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/modules_optional b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/modules_optional[m
[1mdeleted file mode 100644[m
[1mindex bbd6ec5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/modules_optional[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-buf[m
[31m-complex_path[m
[31m-complex_value[m
[31m-conf_file[m
[31m-encoding[m
[31m-hash[m
[31m-http[m
[31m-path[m
[31m-process[m
[31m-regex[m
[31m-rewrite[m
[31m-set_var[m
[31m-string[m
[31m-upstream_list   *[m
[31m-uri[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/prefixes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/prefixes[m
[1mdeleted file mode 100644[m
[1mindex ee53474..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/data/prefixes[m
[1m+++ /dev/null[m
[36m@@ -1,2 +0,0 @@[m
[31m-ngx[m
[31m-ndk [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/array.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/array.h[m
[1mdeleted file mode 100644[m
[1mindex a583759..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/array.h[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-[m
[31m-#define     %2%_array_count(a)                  ((a)->nelts)[m
[31m-#define     %2%_array_get_first(a)              ((a)->elts)[m
[31m-#define     %2%_array_get_index(a,n)            ((void*) ((char*) (a)->elts + (a)->size * n))[m
[31m-#define     %2%_array_get_last(a)               ((void*) ((char*) (a)->elts + (a)->size * ((a)->nelts - 1)))[m
[31m-#define     %2%_array_get_reverse_index(a,n)    ((void*) ((char*) (a)->elts + (a)->size * ((a)->nelts - 1 - n)))[m
[31m-#define     %2%_array_push_clean(p,a)           {p = %1%_array_push (a); %2%_zerop (p);}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/conf_cmd_basic.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/conf_cmd_basic.h[m
[1mdeleted file mode 100644[m
[1mindex 38743a6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/conf_cmd_basic.h[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-[m
[31m-/* TODO : finish this */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF              NGX_HTTP_MAIN_CONF[m
[31m-#define     NDK_HTTP_SRV_CONF               NGX_HTTP_SRV_CONF[m
[31m-#define     NDK_HTTP_SIF_CONF               NGX_HTTP_SIF_CONF[m
[31m-#define     NDK_HTTP_LOC_CONF               NGX_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_LIF_CONF               NGX_HTTP_LIF_CONF[m
[31m-#define     NDK_HTTP_UPS_CONF               NGX_HTTP_UPS_CONF[m
[31m-#define     NDK_MAIN_CONF                   NGX_MAIN_CONF[m
[31m-#define     NDK_ANY_CONF                    NGX_ANY_CONF[m
[31m-[m
[31m-[m
[31m-/* compound locations */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_CONF[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_SIF_CONF[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_SIF_CONF                   NDK_HTTP_SRV_CONF|NDK_HTTP_SIF_CONF[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF                   NDK_HTTP_SRV_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_SRV_LOC_LIF_CONF               NDK_HTTP_SRV_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-#define     NDK_HTTP_SRV_SIF_LOC_CONF               NDK_HTTP_SRV_SIF_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_SRV_SIF_LOC_LIF_CONF           NDK_HTTP_SRV_SIF_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_LIF_CONF                   NDK_HTTP_LOC_CONF|NDK_HTTP_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_LIF_CONF[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SIF_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_LIF_CONF      NDK_HTTP_SRV_SIF_LOC_LIF_CONF|NDK_MAIN_CONF[m
[31m-#define     NDK_HTTP_CONF                           NDK_HTTP_MAIN_SRV_SIF_LOC_LIF_CONF[m
[31m-#define     NDK_HTTP_ANY_CONF                       NDK_HTTP_CONF|NDK_HTTP_UPS_CONF[m
[31m-[m
[31m-[m
[31m-/* property offsets     NOTE : ngx_module_main_conf_t etc should be defined in the module's .c file before the commands */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_PROP(p)      NGX_HTTP_MAIN_CONF_OFFSET, offsetof (ndk_module_main_conf_t, p)[m
[31m-#define     NDK_HTTP_SRV_CONF_PROP(p)       NGX_HTTP_SRV_CONF_OFFSET, offsetof (ndk_module_srv_conf_t, p)[m
[31m-#define     NDK_HTTP_LOC_CONF_PROP(p)       NGX_HTTP_LOC_CONF_OFFSET, offsetof (ndk_module_loc_conf_t, p)[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/conf_merge.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/conf_merge.h[m
[1mdeleted file mode 100644[m
[1mindex 1e3ba70..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/conf_merge.h[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-[m
[31m-/* TODO : check that all the main types have a corresponding merge function */[m
[31m-[m
[31m-#define     ndk_conf_merge_value            ngx_conf_merge_value[m
[31m-#define     ndk_conf_merge_off_value        ngx_conf_merge_off_value [m
[31m-#define     ndk_conf_merge_ptr_value        ngx_conf_merge_ptr_value[m
[31m-#define     ndk_conf_merge_str_value        ngx_conf_merge_str_value[m
[31m-#define     ndk_conf_merge_size_value       ngx_conf_merge_size_value [m
[31m-[m
[31m-[m
[31m-#define     ndk_conf_merge_keyval_value(conf,prev,default)                                  \[m
[31m-                                                                                            \[m
[31m-                conf = prev ? prev : default;[m
[31m-[m
[31m-#define     ndk_conf_merge_str_array_value(conf,prev,val1,...)                              \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR) {                                           \[m
[31m-                    if (prev == NGX_CONF_UNSET_PTR) {                                       \[m
[31m-                        if (val1 == NULL) {                                                 \[m
[31m-                            conf = NULL;                                                    \[m
[31m-                        } else {                                                            \[m
[31m-                            char * elts[] = {val1,##__VA_ARGS__};                           \[m
[31m-                            int    n = sizeof(elts)/sizeof(char*);                          \[m
[31m-                                                                                            \[m
[31m-                            conf = ndk_str_array_create (cf->pool, elts, n);                \[m
[31m-                                                                                            \[m
[31m-                            if (conf == NULL)                                               \[m
[31m-                                return  NGX_CONF_ERROR;                                     \[m
[31m-                        }                                                                   \[m
[31m-                    } else {                                                                \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_value_value(conf,prev,default)                      \[m
[31m-                                                                                            \[m
[31m-                if (!conf.str.len) {                                                        \[m
[31m-                    if (prev.str.len) {                                                     \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    } else {                                                                \[m
[31m-                        conf.str.data = (u_char *) default;                                 \[m
[31m-                        conf.str.len = sizeof (default) - 1;                                \[m
[31m-                                                                                            \[m
[31m-                        if (ndk_http_complex_value_compile (cf, &conf))                     \[m
[31m-                            return  NGX_CONF_ERROR;                                         \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_value_array_value(conf,prev,val1,...)               \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR) {                                           \[m
[31m-                    if (prev == NGX_CONF_UNSET_PTR) {                                       \[m
[31m-                        if (val1 == NULL)                                                   \[m
[31m-                            conf = NULL;                                                    \[m
[31m-                        else {                                                              \[m
[31m-                            char * elts[] = {val1,##__VA_ARGS__};                           \[m
[31m-                            int    n = sizeof(elts)/sizeof(char*);                          \[m
[31m-                                                                                            \[m
[31m-                            conf = ndk_http_complex_value_array_create (cf, elts, n);       \[m
[31m-                                                                                            \[m
[31m-                            if (conf == NULL)                                               \[m
[31m-                                return  NGX_CONF_ERROR;                                     \[m
[31m-                        }                                                                   \[m
[31m-                    } else {                                                                \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_path_value(conf,prev,...)                           \[m
[31m-                ndk_conf_merge_http_complex_value_array_value (conf.a, prev.a, __VA_ARGS__)[m
[31m-[m
[31m-#define     ndk_conf_merge_split_path_value(conf,prev,path)                                 \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR)  {                                          \[m
[31m-                    conf = (prev == NGX_CONF_UNSET_PTR ?                                    \[m
[31m-                        ndk_split_path_create_raw (cf, path) : prev);                       \[m
[31m-                }[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/palloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/palloc.h[m
[1mdeleted file mode 100644[m
[1mindex 798e360..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/src/palloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-[m
[31m-#define     %2%_pallocp(p,pl)                   p = %1%_palloc (pl,sizeof(*p))[m
[31m-#define     %2%_pallocpn(p,pl,n)                p = %1%_palloc (pl,sizeof(*p)*(n))[m
[31m-[m
[31m-#define     %2%_pcallocp(p,pl)                  p = %1%_pcalloc (pl,sizeof(*p))[m
[31m-#define     %2%_pcallocpn(p,pl,n)               p = %1%_pcalloc (pl,sizeof(*p)*(n))[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/text/autogen b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/text/autogen[m
[1mdeleted file mode 100644[m
[1mindex 6a244c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/auto/text/autogen[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/config[m
[1mdeleted file mode 100644[m
[1mindex 8cb7ad0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/config[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-[m
[31m-###############[m
[31m-## FUNCTIONS ##[m
[31m-###############[m
[31m-[m
[31m-# TODO : provide information about checking versions of sed etc[m
[31m-# TODO : an optional patch function[m
[31m-[m
[31m-ndk_generate_files() {[m
[31m-    echo "building Nginx Development Kit utility functions and macros ..."[m
[31m-[m
[31m-    autobuild="$ngx_addon_dir/auto/build"[m
[31m-    chmod +x $autobuild[m
[31m-    $autobuild `pwd` $NGX_OBJS/addon/ndk || exit 1[m
[31m-}[m
[31m-[m
[31m-ndk_get_nginx_version() {[m
[31m-    # We get the Nginx version number from the string form rather than[m
[31m-    # nginx_version because it is available in more (every?) version[m
[31m-[m
[31m-    cat src/core/nginx.h                                |[m
[31m-    grep  '#define NGINX_VERSION'                       |[m
[31m-    sed -r                                              \[m
[31m-        -e 's/[^0-9.]*([0-9.]+).*/\1/'                  \[m
[31m-        -e 's/([0-9]+\.[0-9]+\.)([0-9]{1})$/\100\2/'    \[m
[31m-        -e 's/([0-9]+\.[0-9]+\.)([0-9]{2})$/\10\2/'     \[m
[31m-        -e 's/\.//g'                                    \[m
[31m-        -e 's/^0+(.*)/\1/'[m
[31m-}[m
[31m-[m
[31m-#####################[m
[31m-## CONFIG SETTINGS ##[m
[31m-#####################[m
[31m-[m
[31m-ngx_addon_name=ngx_devel_kit[m
[31m-ngx_objs_dirs="$ngx_addon_dir/objs $NGX_OBJS/addon/ndk"[m
[31m-[m
[31m-NDK_SRCS="$ngx_addon_dir/src/ndk.c"[m
[31m-NDK_DEPS="$ngx_addon_dir/src/ndk.h"[m
[31m-NDK_INCS="$ngx_addon_dir/src $ngx_objs_dirs"[m
[31m-[m
[31m-CORE_INCS="$CORE_INCS $ngx_objs_dirs"[m
[31m-HTTP_INCS="$HTTP_INCS $ngx_addon_dir/src $ngx_objs_dir"[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name="ndk_http_module"[m
[31m-    ngx_module_srcs="$NDK_SRCS"[m
[31m-    ngx_module_deps="$NDK_DEPS"[m
[31m-    ngx_module_incs="$NDK_INCS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES ndk_http_module"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $NDK_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_SRCS $NDK_DEPS"[m
[31m-fi[m
[31m-[m
[31m-have=NDK . auto/have[m
[31m-[m
[31m-##############[m
[31m-## INCLUDES ##[m
[31m-##############[m
[31m-[m
[31m-. $ngx_addon_dir/ngx_auto_lib_core[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/core/action_macros b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/core/action_macros[m
[1mdeleted file mode 100644[m
[1mindex 802eb1f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/core/action_macros[m
[1m+++ /dev/null[m
[36m@@ -1,63 +0,0 @@[m
[31m-[m
[31m-    GENERAL NOTES[m
[31m-    -------------[m
[31m-[m
[31m-    These functions and macros have been provided as a tool for Nginx module developers.  They have[m
[31m-    been created with four main purposes:[m
[31m-[m
[31m-        - to speed up code-writing[m
[31m-        - to reduce the code you have to read on file[m
[31m-        - to add additional generic functionality similar to exising Nginx functions [m
[31m-        - to reduce code errors[m
[31m-[m
[31m-    Most of the utility macros are just wrappers around commonly used code, especially checking for[m
[31m-    NULL and returning a value, zeroing data etc.  The functions add things like extra conf_set_X_slot[m
[31m-    functions that don't exist in the standard Nginx distribution, but which might be useful in more[m
[31m-    than one module.[m
[31m-[m
[31m-    A consistent approach has been taken to creating the macros, so that in theory you should be able[m
[31m-    to 'know' the macro name from using the few rules below and your knowledge of the existing Nginx[m
[31m-    functions.  As much as possible, the ordering of variables used within the underlying functions[m
[31m-    remain the same, to reduce the learning time.  Also, a constent naming pattern has been used to[m
[31m-    make it easier to read the macros above.[m
[31m-[m
[31m-    Obviously not all programmers will want to use all or any of these macros, but they are provided[m
[31m-    as a tool for those who wish to use them.[m
[31m-[m
[31m-    If you have any comments about them, including any additions or errors please let me know at [m
[31m-    'eugaia at gmail dot com'.  I don't promise to include all additions people send, but if they seem[m
[31m-    like they could be of use to multiple developers, I will.[m
[31m-[m
[31m-[m
[31m-    UTILITY MACRO PARAMS[m
[31m-    --------------------[m
[31m-    p       pointer                 - used to set the result of a function to a pointer[m
[31m-    a       array[m
[31m-    pl      pool[m
[31m-    n       multiplication factor   - for allocating multiple pointers & pushing 'n' elts in arrays etc[m
[31m-    sz      size[m
[31m-    l       log[m
[31m-    rv      return value[m
[31m-[m
[31m-[m
[31m-[m
[31m-    UTILITY MACRO FUNCTION SUFFIXES[m
[31m-    -------------------------------[m
[31m-[m
[31m- - general[m
[31m-[m
[31m-    p       p = [FUNCTION] ()[m
[31m-    _r      [ if result of function is NULL | NGX_ERROR (as appropriate) ] return rv[m
[31m-    _rce    rv = NGX_CONF_ERROR[m
[31m-    _re     rv = NGX_ERROR[m
[31m-    _rn     rv = NULL[m
[31m-[m
[31m- - (p)(c)alloc functions[m
[31m-[m
[31m-    p       p = [function] (pool, sizeof (*p))[m
[31m-    pn      p = [function] (pool, sizeof (*p) * n)[m
[31m-[m
[31m-[m
[31m-    UTILITY MACRO PARAMS ORDER[m
[31m-    --------------------------[m
[31m-    p, pl|a, sz|n, l, rv [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/core/conf_cmds b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/core/conf_cmds[m
[1mdeleted file mode 100644[m
[1mindex 70978b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/core/conf_cmds[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-[m
[31m-Conf command macros[m
[31m--------------------[m
[31m-[m
[31m-The build script generates a large number of macros for reducing the code required for command[m
[31m-definitions.[m
[31m-[m
[31m-There are basically three types of macros :[m
[31m-[m
[31m-- combination bitmasks[m
[31m-[m
[31m-    e.g. NDK_HTTP_MAIN_SRV_CONF  =  (NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF)[m
[31m-[m
[31m-- base command structures[m
[31m-[m
[31m-    e.g. NDK_HTTP_MAIN_CONF_TAKE1[m
[31m-[m
[31m-- conf-set command structures[m
[31m-[m
[31m-    e.g. NDK_HTTP_CONF_STR[m
[31m-[m
[31m-[m
[31m-Combination bitmasks[m
[31m---------------------[m
[31m-[m
[31m-Basically combinations of existing bitmasks for locations, with general > specific order[m
[31m-[m
[31m-NDK_HTTP_CONF = (NGX_HTTP_MAIN_CONF | NGX_HTTP_SVR_CONF | NGX_HTTP_SIF_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF)[m
[31m-[m
[31m-[m
[31m-Base command structures[m
[31m------------------------[m
[31m-[m
[31m-These macros are basically there as wrappers for the conf-set command structures, and but incorporate [m
[31m-the bitmask element into the name of the macro.[m
[31m-[m
[31m-[m
[31m-Conf-set command structures[m
[31m----------------------------[m
[31m-[m
[31m-These macros simplify creating commands that use any of the build-in conf-set functions or any of those[m
[31m-added by the NDK.[m
[31m-[m
[31m-e.g.  NGX_HTTP_MAIN_SRV_STR ("name", prop, NULL)[m
[31m-[m
[31m-where prop is the name of the property that is a ngx_str_t.  Whether this is in the loc conf, main conf[m
[31m-or svr conf is generated automatically in by the macro.[m
[31m-[m
[31m-NOTE : you need to set the following if they will be used (using macro definitions) :[m
[31m-[m
[31m-ndk_module_main_conf_t[m
[31m-ndk_module_srv_conf_t[m
[31m-ndk_module_loc_conf_t[m
[31m-[m
[31m-e.g[m
[31m-[m
[31m-#define     ndk_module_loc_conf_t       ngx_http_my_module_loc_conf_t[m
[31m-[m
[31m-[m
[31m-TODO[m
[31m-----[m
[31m-Much better documentation for this[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/modules/set_var b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/modules/set_var[m
[1mdeleted file mode 100644[m
[1mindex 6be5c0f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/modules/set_var[m
[1m+++ /dev/null[m
[36m@@ -1,124 +0,0 @@[m
[31m-[m
[31m-set var tools[m
[31m-=============[m
[31m-[m
[31m-OVERVIEW[m
[31m---------[m
[31m-This collection of tools is designed to make it easier to set Nginx variables[m
[31m-using a common interface.  It works by plugging into and extending the features[m
[31m-of the internal rewrite module, and operations performed by this module are[m
[31m-therefore done at the rewrite phase of handling.[m
[31m-[m
[31m-[m
[31m-ADVANTAGES OF USING THIS MODULE[m
[31m--------------------------------[m
[31m-[m
[31m-- simple interface - you don't have to worry about lots of http script compiling[m
[31m-- it plugs into the rewrite module, so setting (and getting) vars will happen[m
[31m-  in the order you expect based on how they appear in the configuration file[m
[31m-- you do not have to worry about overriding the v->get_handler (useful if[m
[31m-  a variable of a specific name could be set in multiple different ways)[m
[31m-[m
[31m-[m
[31m-WHEN TO USE THIS AND WHEN TO USE v->get_handler = my_func[m
[31m----------------------------------------------------------[m
[31m-[m
[31m-- if you want a variable to always be generated using a specific function,[m
[31m-    and should not be over-ridden by 'set' functions (e.g. $request_uri, [m
[31m-    $document_root), then you should use v->get_handler[m
[31m-[m
[31m-- if you want to allow a variable to be set using many possible methods,[m
[31m-    including using the 'set' directive, then this module provides an easy way[m
[31m-    for you to do so (if you use the v->get_handler method in this case, you may[m
[31m-    run into problems because the get_handler may over-ride previous uses of the[m
[31m-    set directive)[m
[31m-[m
[31m-[m
[31m-USAGE[m
[31m------[m
[31m-[m
[31m-- decide on the type of function you'll need to write[m
[31m-[m
[31m-    type                                use when there are these requirements[m
[31m-    ----                                -------------------------------------[m
[31m-    NDK_SET_VAR_BASIC                   0 variable values, no extra data[m
[31m-    NDK_SET_VAR_DATA                    0 variable values, extra data[m
[31m-    NDK_SET_VAR_VALUE                   1 variable value, no extra data[m
[31m-    NDK_SET_VAR_VALUE_DATA              1 variable value, extra data[m
[31m-    NDK_SET_VAR_MULTI_VALUE             2+ variable values, no extra data[m
[31m-    NDK_SET_VAR_MULTI_VALUE_DATA        2+ variable values, extra data[m
[31m-    NDK_SET_VAR_HASH                    the space needed for the result string [m
[31m-                                        value is known in advance (usually [m
[31m-                                        used in a hash function)[m
[31m-[m
[31m-    NOTE : if none of these generic calling types suit your needs, it is[m
[31m-    easy to extend the list of types in the .c file (and you if you let me know[m
[31m-    I'll add them to the list[m
[31m-[m
[31m-[m
[31m-- define the filter function with the respective prototype[m
[31m-[m
[31m-    type                                prototype[m
[31m-    ----                                ---------[m
[31m-    NDK_SET_VAR_BASIC                   ndk_set_var_pt[m
[31m-    NDK_SET_VAR_DATA                    ndk_set_var_data_pt[m
[31m-    NDK_SET_VAR_VALUE                   ndk_set_var_value_pt[m
[31m-    NDK_SET_VAR_DATA_VALUE              ndk_set_var_value_data_pt[m
[31m-    NDK_SET_VAR_MULTI_VALUE             ndk_set_var_value_pt[m
[31m-    NDK_SET_VAR_MULTI_VALUE_DATA        ndk_set_var_value_data_pt[m
[31m-    NDK_SET_VAR_HASH                    ndk_set_var_hash_pt[m
[31m-[m
[31m-    (See ngx_tools_module.h for the prototype definitions.)[m
[31m-[m
[31m-    Note : For the multi_value functions, the variable value pointer is to the[m
[31m-    first value (with the others being in an array following it)[m
[31m-[m
[31m-[m
[31m-to use one of the default setup functions[m
[31m------------------------------------------[m
[31m-[m
[31m-- define one or multiple ngx_http_var_filter_t's at the global scope, setting :[m
[31m-[m
[31m-    type = (one of types above)[m
[31m-    func = function to call[m
[31m-    size = (for multi value)        the number of variable values[m
[31m-           (for hash)               length of buffer to allocate[m
[31m-    data = (for data functions)     additional data (see note below)[m
[31m-[m
[31m-- define a configuration directive (see in the .c file for examples), where the[m
[31m-    function is 'ngx_http_set_var' and the 'post' is a pointer your filter definition[m
[31m-[m
[31m-[m
[31m-to setup in a customized way[m
[31m-----------------------------[m
[31m-[m
[31m-- define a configuration directive which has your own specific configuration function[m
[31m-[m
[31m-- inside your config function, define one or several ngx_http_var_filter_t's like[m
[31m-    above, and call one of the ngx_http_set_var_..._core functions, passing the [m
[31m-    variable name and value pointers as appropriate - see examples section[m
[31m-[m
[31m-Note : if you're passing extra data to the function, then you will probably want[m
[31m-to use this second method and store the data either in the loc conf, or just[m
[31m-allocate the space for it using one of the ngx_palloc functions.[m
[31m-[m
[31m-If the values that will be used for processing are in the same order as in the[m
[31m-config file and there aren't any additional values that are input, then you can[m
[31m-just use the (ngx_str_t *) (cf->args->elts) + 1 as your base for the values or [m
[31m-possibly not use the _core versions of the functions.[m
[31m-[m
[31m-[m
[31m-That's it![m
[31m-[m
[31m-[m
[31m-FEEDBACK[m
[31m---------[m
[31m-[m
[31m-If you have any comments (good/bad), or have found any bugs, please let me know at:[m
[31m-ngx.eugaia AT gmail DOT com[m
[31m-[m
[31m-[m
[31m-TODO[m
[31m-----[m
[31m-- add more documentation/examples[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/patches/more_logging_info b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/patches/more_logging_info[m
[1mdeleted file mode 100644[m
[1mindex 3685916..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/patches/more_logging_info[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-When tracking down some potential issues in the nginx constellation,[m
[31m-we've found it useful to understand where particular error messages[m
[31m-are coming from, since many of the same messages are repeated in[m
[31m-various places. This patch will write the source file from which the[m
[31m-message originated, the function name, and the line number if you're[m
[31m-using GCC to compile nginx. Here's an example:[m
[31m-[m
[31m-Old Output:[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: nginx/0.7.64[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: built by gcc 4.0.1 (Apple Inc. build 5490)[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: OS: Darwin 9.8.0[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: hw.ncpu: 2[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: net.inet.tcp.sendspace: 65536[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: kern.ipc.somaxconn: 128[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: getrlimit(RLIMIT_NOFILE):[m
[31m-256:9223372036854775807[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: start worker processes[m
[31m-2010/01/12 14:43:10 [notice] 67772#0: start worker process 67785[m
[31m-2010/01/12 14:43:16 [notice] 67772#0: signal 20 (SIGCHLD) received[m
[31m-[m
[31m-New Output:[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_posix_init.c[m
[31m-ngx_os_status(   80) nginx/0.7.64[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_posix_init.c[m
[31m-ngx_os_status(   83) built by gcc 4.0.1 (Apple Inc. build 5490)[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_darwin_init.c[m
[31m-ngx_os_specific_status(  153) OS: Darwin 9.8.0[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_darwin_init.c[m
[31m-ngx_os_specific_status(  166) hw.ncpu: 2[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_darwin_init.c[m
[31m-ngx_os_specific_status(  166) net.inet.tcp.sendspace: 65536[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_darwin_init.c[m
[31m-ngx_os_specific_status(  166) kern.ipc.somaxconn: 128[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_posix_init.c[m
[31m-ngx_os_status(   92) getrlimit(RLIMIT_NOFILE):[m
[31m-2560:9223372036854775807[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_process_cycle.c[m
[31m-ngx_start_worker_processes(  337) start worker processes[m
[31m-2010/01/14 16:35:09 [notice] 27241#0: src/os/unix/ngx_process.c[m
[31m-ngx_spawn_process(  201) start worker process 27254[m
[31m-2010/01/14 16:35:14 [notice] 27241#0: src/os/unix/ngx_process.c[m
[31m-ngx_signal_handler(  420) signal 20 (SIGCHLD) received[m
[31m-[m
[31m-Formatting the filename and function name fields into fixed-width[m
[31m-fields would be nicer, however that would require further changes in[m
[31m-src/core/ngx_string.c[m
[31m-[m
[31m-(C) Brian Moran - bmoran@onehub.com  (posted to nginx-devel mailing list on 15/01/10)[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/upstream/list b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/upstream/list[m
[1mdeleted file mode 100644[m
[1mindex 3ad485d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/docs/upstream/list[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-NDK_UPSTREAM_LIST[m
[31m------------------[m
[31m-[m
[31m-This submodule provides a directive that creates a list of upstreams, with[m
[31m-optional weighting. This list can then be used by other modules to hash over[m
[31m-the upstreams however they choose.[m
[31m-[m
[31m-[m
[31m-USAGE IN CONF FILE[m
[31m-------------------[m
[31m-[m
[31m-e.g. upstream_list   name    backend1  4:backend2    3:backend3;[m
[31m-[m
[31m-[m
[31m-[m
[31m-USAGE WITH OTHER MODULES[m
[31m-------------------------[m
[31m-[m
[31m-Add a line like[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_UPSTREAM_LIST"[m
[31m-[m
[31m-to the config file of your module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-INTEGRATING WITH YOUR MODULE[m
[31m-----------------------------[m
[31m-[m
[31m-The upstream lists are stored in the array given in the lists.h file, which is[m
[31m-an array of ndk_upstream_list_t elts.  The elts are currently all pointers to [m
[31m-strings which have been distributed according to the weight - so if there are[m
[31m-two backends, with weight 3 and 4 respectively, there will be 7 pointers in[m
[31m-total with the first 3 pointing to the first backend and the last 4 to the [m
[31m-second.[m
[31m-[m
[31m-[m
[31m-[m
[31m-TODO[m
[31m-----[m
[31m--   replace strings with pointers to upstreams if they are available (and if [m
[31m-    this is possible)[m
[31m--   add additional 'http://' to strings if necessary[m
[31m--   improve this documentation[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/README b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/README[m
[1mdeleted file mode 100644[m
[1mindex 22e2417..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/README[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-2010 (C) Marcus Clyne[m
[31m-[m
[31m-[m
[31m-Examples[m
[31m---------[m
[31m-[m
[31m-In this section there are a number of examples of the various features of the tools[m
[31m-module.  These have been given in the form of dummy modules, to make it easier to[m
[31m-use as templates for your own module should you choose to do so.[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/http/set_var/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/http/set_var/config[m
[1mdeleted file mode 100644[m
[1mindex aa58f77..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/http/set_var/config[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_set_var_examples_module[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_http_set_var_examples_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_set_var_examples_module.c"[m
[31m-have=NDK_SET_VAR . auto/have[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/http/set_var/ngx_http_set_var_examples_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/http/set_var/ngx_http_set_var_examples_module.c[m
[1mdeleted file mode 100644[m
[1mindex 7a4daae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/examples/http/set_var/ngx_http_set_var_examples_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,136 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- */[m
[31m- [m
[31m-[m
[31m-#include    <ndk.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t    ngx_http_set_var_concat2    (ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v);[m
[31m-static char *       ngx_http_set_prepend_hello   (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-static  ndk_set_var_t      ngx_http_var_set_concat2 = {[m
[31m-    NDK_SET_VAR_MULTI_VALUE,[m
[31m-    ngx_http_set_var_concat2,[m
[31m-    2,[m
[31m-    NULL[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_command_t  ngx_http_set_var_examples_commands[] = {[m
[31m-    {[m
[31m-        ngx_string ("set_concat2"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE3,[m
[31m-        ndk_set_var_multi_value,[m
[31m-        0,[m
[31m-        0,[m
[31m-        &ngx_http_var_set_concat2[m
[31m-    },[m
[31m-    {[m
[31m-        ngx_string ("set_prepend_hello"),[m
[31m-        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-        ngx_http_set_prepend_hello,[m
[31m-        0,[m
[31m-        0,[m
[31m-        NULL[m
[31m-    },[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t     ngx_http_set_var_examples_module_ctx = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};[m
[31m-ngx_module_t          ngx_http_set_var_examples_module = {[m
[31m-[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_set_var_examples_module_ctx,  // module context[m
[31m-    ngx_http_set_var_examples_commands,     // module directives[m
[31m-    NGX_HTTP_MODULE,                        // module type[m
[31m-    NULL,                                   // init master[m
[31m-    NULL,                                   // init module[m
[31m-    NULL,                                   // init process[m
[31m-    NULL,                                   // init thread[m
[31m-    NULL,                                   // exit thread[m
[31m-    NULL,                                   // exit process[m
[31m-    NULL,                                   // exit master[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m-    This function is called by both examples, takes two variable values and concatenates them[m
[31m-    to give a third string.[m
[31m-*/[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_var_concat2 (ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v)[m
[31m-{[m
[31m-    size_t                      len;[m
[31m-    ngx_http_variable_value_t   *v2;[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    v2 = v + 1;[m
[31m-[m
[31m-    len = v->len + v2->len;[m
[31m-[m
[31m-	/*[m
[31m-	 * NDK provided abbreviation for the following code:[m
[31m-	 *[m
[31m-	 * p = ngx_palloc (r->pool, len);[m
[31m-	 * if (p == NULL)[m
[31m-	 * 		return  NGX_ERROR;[m
[31m-	 *[m
[31m-	 * */[m
[31m-	ndk_palloc_re(p, r->pool, len);[m
[31m-[m
[31m-    val->data = p;[m
[31m-    val->len = len;[m
[31m-[m
[31m-    ngx_memzero (p, len);[m
[31m-[m
[31m-    p = ngx_cpymem (p, v->data, v->len);[m
[31m-    ngx_memcpy (p, v2->data, v2->len);[m
[31m-[m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-/*  [m
[31m-    This function demonstrates using the 'core' function in a function that appends the word[m
[31m-    'hello_' to the beginning of a variable.[m
[31m-[m
[31m-    set                 $var      world;[m
[31m-    set_prepend_hello    $var      $var;[m
[31m-[m
[31m-    If the arguments used in the variable value filter do not all come directly from the conf[m
[31m-    file, or are not given in the order[m
[31m-[m
[31m-    direcive    $var_name   val1 "val2 string $var" ...[m
[31m-[m
[31m-    then the _core functions should be used inside the function that is called when the directive[m
[31m-    is read.[m
[31m-*/[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_set_prepend_hello (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               s[2], *var_name;[m
[31m-    ndk_set_var_t      filter;[m
[31m-[m
[31m-    var_name = cf->args->elts;[m
[31m-    var_name++;[m
[31m-[m
[31m-    s[0].data = (u_char*) "hello_";[m
[31m-    s[0].len = 6;[m
[31m-[m
[31m-    s[1] = *(var_name + 1);[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE;[m
[31m-    filter.func = ngx_http_set_var_concat2;[m
[31m-    filter.size = 2;[m
[31m-[m
[31m-    return  ndk_set_var_multi_value_core (cf, var_name, (ngx_str_t *) s, &filter);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/ngx_auto_lib_core b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/ngx_auto_lib_core[m
[1mdeleted file mode 100644[m
[1mindex d5441fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/ngx_auto_lib_core[m
[1m+++ /dev/null[m
[36m@@ -1,797 +0,0 @@[m
[31m-[m
[31m-## Directories to search for usable builds:[m
[31m-##[m
[31m-## - [$PFX]_INC and [$PFX]_LIB[m
[31m-## - the dir specified by --with-[$pfx]=*[m
[31m-## - each dir named [$pfx]-* under [$PFX]_BASE (descending order)[m
[31m-## - each dir named [$pfx]-* under $ngx_src_dir/.. (descending order)[m
[31m-## - system_paths (see below)[m
[31m-##[m
[31m-## Note : specifying [$PFX]_INC or [$PFX]_LIB prevents other dirs being tried[m
[31m-##        specifying --with-[$pfx]= prevents autodiscovery of dirs[m
[31m-##[m
[31m-## Note : if this file is not in the same directory as the config file, the value[m
[31m-##        for ngx_auto_lib_file should be changed to a relative path from that file[m
[31m-## e.g. : $ngx_addon_dir/libs/ngx_auto_lib[m
[31m-##[m
[31m-## TODO : explain hooks[m
[31m-[m
[31m-#############[m
[31m-## VERSION ##[m
[31m-#############[m
[31m-[m
[31m-ngx_auto_lib_version=1001[m
[31m-[m
[31m-if [ ! $ngx_auto_lib_file_version ] || [ $ngx_auto_lib_file_version -lt $ngx_auto_lib_version ]; then[m
[31m-[m
[31m-    if [ ! $ngx_addon_dir ]; then[m
[31m-        ngx_addon_dir=`cd $(dirname $0); pwd`[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_file="$ngx_addon_dir/ngx_auto_lib_core"[m
[31m-    ngx_auto_lib_file_version="$ngx_auto_lib_version"[m
[31m-fi[m
[31m-[m
[31m-###############[m
[31m-## VARIABLES ##[m
[31m-###############[m
[31m-[m
[31m-v=[m
[31m-v="$v       inc_path"[m
[31m-v="$v       incs"[m
[31m-v="$v       libs"[m
[31m-v="$v       name"[m
[31m-v="$v       path"[m
[31m-v="$v       run"[m
[31m-v="$v       test"[m
[31m-ev=[m
[31m-ev="$ev     add_libs"[m
[31m-ev="$ev     add_path"[m
[31m-ev="$ev     build_dirs"[m
[31m-ev="$ev     build_inc_dirs"[m
[31m-ev="$ev     build_lib_dirs"[m
[31m-ev="$ev     check_macros_defined"[m
[31m-ev="$ev     check_macros_non_zero"[m
[31m-ev="$ev     defines"[m
[31m-ev="$ev     deps"[m
[31m-ev="$ev     exit_if_not_found"[m
[31m-ev="$ev     haves"[m
[31m-ev="$ev     inc_names"[m
[31m-ev="$ev     lib_files"[m
[31m-ev="$ev     lib_names"[m
[31m-ev="$ev     libs_to_add"[m
[31m-ev="$ev     modules"[m
[31m-ev="$ev     srcs"[m
[31m-ev="$ev     shared"[m
[31m-ev="$ev     test_libs"[m
[31m-ev="$ev     variables"[m
[31m-[m
[31m-ngx_feature_vars="$v"[m
[31m-ngx_feature_extra_vars="$ev"[m
[31m-ngx_feature_all_vars="$v $ev"[m
[31m-[m
[31m-NGX_AUTO_LIB_DEFAULT_SYSTEM_DIRS='/usr/local /usr /opt/local /opt /usr/pkg'[m
[31m-[m
[31m-####################[m
[31m-## UTIL FUNCTIONS ##[m
[31m-####################[m
[31m-[m
[31m-to_upper() {[m
[31m-    echo "$@" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[m
[31m-}[m
[31m-[m
[31m-to_lower() {[m
[31m-    echo "$@" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'[m
[31m-}[m
[31m-[m
[31m-####################[m
[31m-## INIT FUNCTIONS ##[m
[31m-####################[m
[31m-[m
[31m-ngx_auto_lib_init() {[m
[31m-[m
[31m-    . $ngx_auto_lib_file[m
[31m-[m
[31m-    ngx_auto_lib_init_latest  $@[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_init_latest() {[m
[31m-[m
[31m-    # set name and prefixes[m
[31m-[m
[31m-    if [ ! $1 ]; then[m
[31m-        echo "ngx_auto_lib_init() requires that a name be passed"[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_name=$1[m
[31m-    ngx_auto_lib_module_name=$2[m
[31m-[m
[31m-    if [ $2 ]; then[m
[31m-        NGX_AUTO_LIB_PFX=`to_upper $2`[m
[31m-    else[m
[31m-        NGX_AUTO_LIB_PFX=`to_upper $1`[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_pfx=`to_lower $NGX_AUTO_LIB_PFX`[m
[31m-[m
[31m-    ngx_auto_lib_clean_feature_vars[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_clean_feature_vars() {[m
[31m-    for var in $ngx_feature_all_vars; do[m
[31m-        eval ngx_feature_$var=[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_get_variables() {[m
[31m-[m
[31m-    local pfx=$ngx_auto_lib_pfx[m
[31m-    local PFX=$NGX_AUTO_LIB_PFX[m
[31m-[m
[31m-    eval NGX_AUTO_LIB_INC=\"\$${PFX}_INC\"[m
[31m-    eval NGX_AUTO_LIB_LIB=\"\$${PFX}_LIB\"[m
[31m-    eval NGX_AUTO_LIB_DIR=\"\$${PFX}\"[m
[31m-    eval NGX_AUTO_LIB_BASE=\"\$${PFX}_BASE\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_LIB_INC=\"\$${PFX}_SEARCH_LIB_INC\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_DIR=\"\$${PFX}_SEARCH_DIR\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_BASE=\"\$${PFX}_SEARCH_BASE\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_BASE_PREFIX=\"\$${PFX}_SEARCH_BASE_PREFIX\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_PARENT=\"\$${PFX}_SEARCH_PARENT\"[m
[31m-    eval NGX_AUTO_LIB_SEARCH_SYSTEM=\"\$${PFX}_SEARCH_SYSTEM\"[m
[31m-    eval NGX_AUTO_LIB_SHARED=\"\$${PFX}_SHARED\"[m
[31m-    eval NGX_AUTO_LIB_SYSTEM_DIRS=\"\$${PFX}_SYSTEM_DIR\"[m
[31m-    eval USE_NGX_AUTO_LIB=\"\$USE_${LIB}\"[m
[31m-[m
[31m-    if [ ! "$NGX_AUTO_LIB_DIR" ]; then[m
[31m-        NGX_AUTO_LIB_DIR=NONE[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! "$USE_NGX_AUTO_LIB" ]; then[m
[31m-        if [ $ngx_feature_check_macros_defined -o $ngx_feature_check_macros_non_zero ]; then[m
[31m-            USE_NGX_AUTO_LIB=MAYBE[m
[31m-        elif [ "$ngx_feature_required" = no ]; then[m
[31m-            USE_NGX_AUTO_LIB=MAYBE[m
[31m-        else[m
[31m-            USE_NGX_AUTO_LIB=YES[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! "$NGX_AUTO_LIB_SYSTEM_DIRS" ]; then[m
[31m-        NGX_AUTO_LIB_SYSTEM_DIRS=$NGX_AUTO_LIB_DEFAULT_SYSTEM_DIRS[m
[31m-    fi[m
[31m-[m
[31m-    # TODO : add _STATIC, and do searches for both static and shared libs[m
[31m-[m
[31m-    if [ ! "$NGX_AUTO_LIB_SHARED" ]; then[m
[31m-        if [ "$ngx_feature_shared" = no ]; then[m
[31m-            NGX_AUTO_LIB_SHARED=NO[m
[31m-        else[m
[31m-            NGX_AUTO_LIB_SHARED=YES[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    NGX_AUTO_LIB_SEARCH_DEP=NO[m
[31m-[m
[31m-    # set default search methods[m
[31m-    # Note : these can be over-ridden by setting NGX_AUTO_LIB_SEARCH_[type]=YES|NO[m
[31m-[m
[31m-    local auto=y[m
[31m-[m
[31m-    if [ "$NGX_AUTO_LIB_INC" ] || [ "$NGX_AUTO_LIB_LIB" ]; then[m
[31m-        ngx_auto_lib_search  LIB_INC    YES[m
[31m-        auto=n[m
[31m-    fi[m
[31m-[m
[31m-    if [ "$NGX_AUTO_LIB_DIR" != NONE ]; then[m
[31m-        ngx_auto_lib_search  DIR        YES[m
[31m-        auto=n[m
[31m-    fi[m
[31m-[m
[31m-    if [ "$NGX_AUTO_LIB_BASE" ]; then[m
[31m-        ngx_auto_lib_search  BASE       YES[m
[31m-        auto=n[m
[31m-    fi[m
[31m-[m
[31m-    if [ $auto = y ]; then[m
[31m-        ngx_auto_lib_search  PARENT     YES[m
[31m-        ngx_auto_lib_search  SYSTEM     YES[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_search  LIB_INC    NO[m
[31m-    ngx_auto_lib_search  DIR        NO[m
[31m-    ngx_auto_lib_search  BASE       NO[m
[31m-    ngx_auto_lib_search  PARENT     NO[m
[31m-    ngx_auto_lib_search  SYSTEM     NO[m
[31m-[m
[31m-    if [ ! "$ngx_feature_lib_names" ]; then[m
[31m-        ngx_feature_lib_names=$pfx[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! "$ngx_feature_inc_names" ]; then[m
[31m-        ngx_feature_inc_names=$ngx_feature_lib_names[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! "$ngx_feature_exit_if_not_found" ]; then[m
[31m-        ngx_feature_exit_if_not_found=yes[m
[31m-    fi[m
[31m-}[m
[31m-[m
[31m-#######################[m
[31m-## DEFAULT FUNCTIONS ##[m
[31m-#######################[m
[31m-[m
[31m-ngx_auto_lib_set_default() {[m
[31m-[m
[31m-    local suffix=[m
[31m-    if [ $1 ]; then[m
[31m-        suffix="_$1"[m
[31m-    fi[m
[31m-[m
[31m-    local def=$2[m
[31m-    local var="NGX_AUTO_LIB$suffix"[m
[31m-[m
[31m-    val=[m
[31m-    if [ ! `eval echo '$'$var` ]; then[m
[31m-        eval $var=\"$def\"[m
[31m-    fi[m
[31m-[m
[31m-    #eval echo "$var = \$$var"[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_search() {[m
[31m-    ngx_auto_lib_set_default "SEARCH_$1" $2[m
[31m-}[m
[31m-[m
[31m-####################[m
[31m-## SAVE FUNCTIONS ##[m
[31m-####################[m
[31m-[m
[31m-ngx_auto_lib_save_vars() {[m
[31m-    OLD_CORE_DEPS=$CORE_DEPS[m
[31m-    OLD_CORE_INCS=$CORE_INCS[m
[31m-    OLD_CORE_LIBS=$CORE_LIBS[m
[31m-    OLD_CORE_SRCS=$CORE_SRCS[m
[31m-    OLD_LINK_DEPS=$LINK_DEPS[m
[31m-[m
[31m-    CORE_DEPS=[m
[31m-    CORE_INCS=[m
[31m-    CORE_LIBS=[m
[31m-    CORE_SRCS=[m
[31m-    LINK_DEPS=[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_reset_vars() {[m
[31m-    CORE_DEPS=$OLD_CORE_DEPS[m
[31m-    CORE_INCS=$OLD_CORE_INCS[m
[31m-    CORE_LIBS=$OLD_CORE_LIBS[m
[31m-    CORE_SRCS=$OLD_CORE_SRCS[m
[31m-    LINK_DEPS=$OLD_LINK_DEPS[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_save_feature_vars() {[m
[31m-    for var in $ngx_feature_all_vars; do[m
[31m-        eval main_ngx_feature_$var=\"\$ngx_feature_$var\"[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_reset_feature_vars() {[m
[31m-    for var in $ngx_feature_all_vars; do[m
[31m-        eval ngx_feature_$var=\"\$main_ngx_feature_$var\"[m
[31m-    done[m
[31m-}[m
[31m-[m
[31m-########################[m
[31m-## CHECKING FUNCTIONS ##[m
[31m-########################[m
[31m-[m
[31m-ngx_auto_lib_check_auto_config() {[m
[31m-[m
[31m-    ngx_auto_lib_save_feature_vars[m
[31m-    ngx_auto_lib_clean_feature_vars[m
[31m-[m
[31m-    ngx_feature=$1[m
[31m-    ngx_feature_inc_path="`echo $CFLAGS | tr ' ' '\n' | grep -- -D | tr '\n' ' '`"[m
[31m-    ngx_feature_incs="#include <$NGX_AUTO_CONFIG_H>"[m
[31m-    ngx_feature_libs=[m
[31m-    ngx_feature_path=`pwd`[m
[31m-    ngx_feature_run=no[m
[31m-    ngx_feature_test=$2[m
[31m-[m
[31m-    #ngx_auto_lib_print_feature_vars[m
[31m-[m
[31m-    . auto/feature[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-        rv=0[m
[31m-    else[m
[31m-        rv=1[m
[31m-    fi[m
[31m-[m
[31m-    ngx_auto_lib_reset_feature_vars[m
[31m-[m
[31m-    return $rv[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_check_macro_defined() {[m
[31m-[m
[31m-    for m in $@; do[m
[31m-        ngx_auto_lib_check_auto_config  "$m"  "[m
[31m-    #ifndef $m[m
[31m-        rubbish[m
[31m-    #endif"  && return 0[m
[31m-    done[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_check_macro_non_zero() {[m
[31m-[m
[31m-    for m in $@; do[m
[31m-        ngx_auto_lib_check_auto_config  "$m" "[m
[31m-    #if !($m)[m
[31m-        rubbish[m
[31m-    #endif"  && return 0[m
[31m-    done[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_check_require() {[m
[31m-[m
[31m-    if [ $USE_NGX_AUTO_LIB = YES ]; then[m
[31m-        return 0[m
[31m-    elif [ $USE_NGX_AUTO_LIB = NO ]; then[m
[31m-        return 1[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # check if the libraries are required elsewhere[m
[31m-[m
[31m-    for l in $ngx_feature_lib_names; do[m
[31m-        [ ! "`echo $CORE_LIBS $ADDON_LIBS | grep -w -- -l$l`" ] && return 0[m
[31m-    done[m
[31m-[m
[31m-[m
[31m-[m
[31m-    # check that any required macros are set[m
[31m-[m
[31m-    local d=$ngx_feature_check_macros_defined[m
[31m-    local nz=$ngx_feature_check_macros_non_zero[m
[31m-[m
[31m-    if [ "$d" ] || [ "$nz" ]; then[m
[31m-[m
[31m-        ngx_auto_lib_check_macro_defined   $d  && return 0[m
[31m-        ngx_auto_lib_check_macro_non_zero  $nz  && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    ngx_auto_lib_check[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_check() {[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-##################################[m
[31m-## TEST PHASE HANDLER FUNCTIONS ##[m
[31m-##################################[m
[31m-[m
[31m-ngx_auto_lib_test() {[m
[31m-    ngx_auto_lib_test_pre_setup "$@"[m
[31m-    ngx_auto_lib_test_setup "$@"[m
[31m-    ngx_auto_lib_test_post_setup "$@"[m
[31m-    ngx_auto_lib_test_feature[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_pre_setup() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_setup() {[m
[31m-[m
[31m-    local INC=$1[m
[31m-    local LIB=$2[m
[31m-[m
[31m-    ngx_auto_lib_inc_dir=$INC[m
[31m-    ngx_auto_lib_lib_dir=$LIB[m
[31m-[m
[31m-    ngx_auto_lib_reset_feature_vars[m
[31m-[m
[31m-    if [ ! "$ngx_feature_path" ]; then[m
[31m-        ngx_feature_path="$INC"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_feature_path="$ngx_feature_path $ngx_feature_add_path"[m
[31m-[m
[31m-    for sfx in $ngx_feature_path_suffixes; do[m
[31m-        ngx_feature_path="$ngx_feature_path $INC/$sfx"[m
[31m-    done[m
[31m-[m
[31m-[m
[31m-    local inc=[m
[31m-    local lib=[m
[31m-    local incs="$ngx_feature_inc_names"[m
[31m-    local libs="$ngx_feature_lib_names"[m
[31m-    local lib_files="$ngx_feature_lib_files"[m
[31m-[m
[31m-    for inc in $incs; do[m
[31m-        ngx_feature_incs="$ngx_feature_incs[m
[31m-#include <$inc.h>"[m
[31m-    done[m
[31m-[m
[31m-[m
[31m-    if [ ! "$ngx_feature_libs" ]; then[m
[31m-[m
[31m-        if [ $NGX_AUTO_LIB_SHARED = YES ]; then[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R$LIB"[m
[31m-            fi[m
[31m-            ngx_feature_libs="$ngx_feature_libs -L$LIB"[m
[31m-[m
[31m-            for lib in $libs; do[m
[31m-                ngx_feature_libs="$ngx_feature_libs -l$lib"[m
[31m-            done[m
[31m-[m
[31m-            # TODO : only add --rpath when the path is not a standard system path - warn if /usr[m
[31m-[m
[31m-            ngx_feature_libs="$ngx_feature_libs -Wl,--rpath -Wl,$LIB"[m
[31m-[m
[31m-        else[m
[31m-[m
[31m-            for lib in $lib_files; do[m
[31m-                ngx_feature_libs="$ngx_feature_libs $LIB/$lib"      [m
[31m-            done[m
[31m-[m
[31m-            for lib in $libs; do[m
[31m-                ngx_feature_libs="$ngx_feature_libs $LIB/lib$lib.a"[m
[31m-            done[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ ! $ngx_feature_run ]; then[m
[31m-        ngx_feature_run=no[m
[31m-    fi[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SHARED = YES ]; then[m
[31m-[m
[31m-        # Add a test to be called in auto/feature after compilation that will check [m
[31m-        # whether any libraries that are linked are in fact using the path provided to[m
[31m-        # link libraries rather than a standard path. Note : this test will work on [m
[31m-        # all linked shared objects, even if supplied directly by setting [m
[31m-        # $ngx_feature_libs instead of usign $ngx_feature_lib_names[m
[31m-[m
[31m-        # TODO : allow for some libraries to not be checked here if desired - if part of system paths[m
[31m-[m
[31m-        libs="`echo $ngx_feature_libs | tr ' ' '\n' | grep -- -l | sed 's|-l||g'`"[m
[31m-[m
[31m-        local test="[m
[31m-            for l in $libs; do[m
[31m-                o="'\`ldd '$NGX_AUTOTEST' | grep '$LIB'/lib\$l\\.so\`;[m
[31m-                if [ ! \"\$o\" ]; then[m
[31m-                    chmod -x $NGX_AUTOTEST;[m
[31m-                    echo Linker does not link to correct version[m
[31m-                else[m
[31m-                    chmod +x $NGX_AUTOTEST;[m
[31m-                fi[m
[31m-            done'[m
[31m-        test="`echo "$test" | tr '\n' ' '`"[m
[31m-[m
[31m-        ngx_feature_test_libs="$ngx_feature_test_libs; $test"[m
[31m-    fi[m
[31m-[m
[31m-    ngx_feature_libs="$ngx_feature_libs $ngx_feature_add_libs"[m
[31m-    ngx_feature_libs_to_add="$ngx_feature_libs"[m
[31m-    ngx_feature_libs="$ngx_feature_libs $ngx_feature_test_libs"[m
[31m-    ngx_feature="$ngx_auto_lib_name library $ngx_feature"[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_post_setup() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_feature() {[m
[31m-    #ngx_auto_lib_print_feature_vars[m
[31m-    . auto/feature[m
[31m-    [ $ngx_found = yes ] && return 0[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-########################[m
[31m-## TEST DIR FUNCTIONS ##[m
[31m-########################[m
[31m-[m
[31m-ngx_auto_lib_test_dir_pair() {[m
[31m-    ngx_auto_lib_test_inc_dir=$1[m
[31m-    ngx_auto_lib_test_lib_dir=$2[m
[31m-[m
[31m-    if [ $1 = $2 ]; then[m
[31m-        ngx_feature="in $1$3"[m
[31m-    else[m
[31m-        ngx_feature="in $1 and $2$3"[m
[31m-    fi[m
[31m-    ngx_auto_lib_test "$1" "$2" "$3"[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_dir_pairs() {[m
[31m-    ngx_auto_lib_test_dir_pair  "$1/include"  "$2/lib"  "$3"   && return 0[m
[31m-    ngx_auto_lib_test_dir_pair  "$1"          "$2"      "$3"   && return 0[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_dirs() {[m
[31m-[m
[31m-    local msg="$1"[m
[31m-    local bdir idir ldir[m
[31m-[m
[31m-    local bdirs=$ngx_feature_build_dirs[m
[31m-    local idirs=$ngx_feature_build_inc_dirs[m
[31m-    local ldirs=$ngx_feature_build_lib_dirs[m
[31m-[m
[31m-    shift[m
[31m-[m
[31m-    for dir in "$@"; do[m
[31m-        ngx_auto_lib_test_dir=$dir[m
[31m-[m
[31m-        for ldir in $ldirs; do[m
[31m-            for idir in $idirs; do[m
[31m-                ngx_auto_lib_test_dir_pair   "$dir/$idir"  "$dir/$ldir"  "$msg"  && return 0[m
[31m-            done[m
[31m-        done[m
[31m-[m
[31m-        for ldir in $ldirs; do[m
[31m-            ngx_auto_lib_test_dir_pair       "$dir"        "$dir/$ldir"  "$msg"  && return 0[m
[31m-        done[m
[31m-[m
[31m-        for idir in $idirs; do[m
[31m-            ngx_auto_lib_test_dir_pair       "$dir/$idir"  "$dir"        "$msg"  && return 0[m
[31m-        done[m
[31m-[m
[31m-        for bdir in $bdirs; do[m
[31m-            ngx_auto_lib_test_dir_pairs      "$dir/$bdir"  "$dir/$bdir"  "$msg"  && return 0[m
[31m-        done[m
[31m-[m
[31m-        ngx_auto_lib_test_dir_pairs          "$dir"        "$dir"        "$msg"  && return 0[m
[31m-        ngx_auto_lib_test_dir=[m
[31m-    done[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_test_install_dirs() {[m
[31m-[m
[31m-    local msg="$1"[m
[31m-    local dir=[m
[31m-[m
[31m-    shift[m
[31m-[m
[31m-    for dir in "$@"; do[m
[31m-        ngx_auto_lib_test_dir=$dir[m
[31m-        ngx_auto_lib_test_dir_pair  "$dir/include"  "$dir/lib"  "$msg"   && return 0[m
[31m-        ngx_auto_lib_test_dir=[m
[31m-    done[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_run_tests() {[m
[31m-[m
[31m-    local name="$ngx_auto_lib_name"[m
[31m-    local pfx="$ngx_auto_lib_pfx"[m
[31m-    local PFX="$NGX_AUTO_LIB_PFX"[m
[31m-    local INC="$NGX_AUTO_LIB_INC"[m
[31m-    local LIB="$NGX_AUTO_LIB_LIB"[m
[31m-    local DIR="$NGX_AUTO_LIB_DIR"[m
[31m-    local BASE="$NGX_AUTO_LIB_BASE"[m
[31m-    local MSG="$NGX_AUTO_LIB_MSG"[m
[31m-[m
[31m-[m
[31m-    ngx_found=no[m
[31m-[m
[31m-[m
[31m-    # dependency[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_DEP = YES ]; then[m
[31m-        ngx_auto_lib_test_dir_pair  "$INC"  "$LIB"  "$MSG"[m
[31m-        return $?[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # lib and include dirs set explicitly (e.g. $OPENSSL_INC, $OPENSSL_LIB)[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_LIB_INC = YES ]; then[m
[31m-        ngx_auto_lib_test_dir_pair  "$INC"  "$LIB"  " (specified by \$${PFX}_INC and \$${PFX}_LIB)"  && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # path specified by ${PFX} (e.g. $OPENSSL, $PCRE)[m
[31m-    # Note : these will be set automatically by configure for OpenSSL, PCRE, Zlib etc[m
[31m-    # TODO : change to searching more than one path[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_DIR = YES ] && [ $DIR != NONE ]; then[m
[31m-        ngx_auto_lib_test_dirs  " (specified by \$${PFX})"  $DIR  && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # directories beginning with '$pfx-' that are in $NGX_AUTO_LIB_BASE (e.g. $OPENSSL_BASE)[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_BASE = YES ] && [ $BASE ]; then[m
[31m-[m
[31m-        p=$NGX_AUTO_LIB_SEARCH_BASE_PREFIX[m
[31m-[m
[31m-        if [ "$p" = YES ]; then[m
[31m-            p="!ame $pfx-*"[m
[31m-        elif [ "$p" ]; then[m
[31m-            p="!ame $p*"[m
[31m-        fi[m
[31m-[m
[31m-        ngx_auto_lib_test_dirs " (found under \$${PFX}_BASE)" \[m
[31m-                `find $BASE/* -maxdepth 0 -type d $p 2> /dev/null | sort -r`  && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # directories beginning with '$pfx-' that are in the same directory as the Nginx source[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_PARENT = YES ]; then[m
[31m-        local src_dir=`cd ..; pwd`[m
[31m-        ngx_auto_lib_test_dirs " (found under Nginx source parent dir)" \[m
[31m-                `find $src_dir/* -maxdepth 0 -type d !ame $pfx-* 2> /dev/null | sort -r` && return 0[m
[31m-    fi[m
[31m-[m
[31m-[m
[31m-    # system folders[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SEARCH_SYSTEM = YES ]; then[m
[31m-        ngx_auto_lib_test_install_dirs  ""  $NGX_AUTO_LIB_SYSTEM_DIRS  && return 0[m
[31m-    fi[m
[31m-[m
[31m-    return 1[m
[31m-}[m
[31m-[m
[31m-#######################[m
[31m-## HANDLER FUNCTIONS ##[m
[31m-#######################[m
[31m-[m
[31m-ngx_auto_lib_run() {[m
[31m-    ngx_auto_lib_get_variables[m
[31m-    eval AUTO_$NGX_AUTO_LIB_PFX=NO[m
[31m-[m
[31m-    ngx_auto_lib_check_require  || return[m
[31m-    ngx_auto_lib_setup          || return[m
[31m-    ngx_auto_lib_save_feature_vars[m
[31m-    ngx_auto_lib_run_tests[m
[31m-    ngx_auto_lib_post_tests     || return[m
[31m-    ngx_auto_lib_finalize[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_print_feature_vars() {[m
[31m-    echo ----------------------------[m
[31m-    for var in $ngx_feature_vars; do[m
[31m-        eval "echo ngx_feature_$var = \$ngx_feature_$var"[m
[31m-    done[m
[31m-    echo ----------------------------[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_setup() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_post_tests() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-#############################[m
[31m-## SET VARIABLES FUNCTIONS ##[m
[31m-#############################[m
[31m-[m
[31m-# TODO : add HTTP/ADDON settings too[m
[31m-[m
[31m-ngx_auto_lib_set_core_variables() {[m
[31m-    # TODO : don't add includes / libs more than once[m
[31m-[m
[31m-    eval CORE_DEPS=\"$CORE_DEPS $ngx_feature_deps\"[m
[31m-    eval CORE_INCS=\"$CORE_INCS $ngx_feature_path\"[m
[31m-    eval CORE_LIBS=\"$CORE_LIBS $ngx_feature_libs_to_add\"[m
[31m-    eval CORE_SRCS=\"$CORE_SRCS $ngx_feature_srcs\"[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_set_generic_variables() {[m
[31m-    local INC=$ngx_auto_lib_test_inc_dir[m
[31m-    local LIB=$ngx_auto_lib_test_lib_dir[m
[31m-[m
[31m-    modules="$modules $ngx_feature_modules"[m
[31m-[m
[31m-    for have in $ngx_feature_haves; do[m
[31m-        . auto/have[m
[31m-    done[m
[31m-[m
[31m-    set - $ngx_feature_defines[m
[31m-[m
[31m-    while [ $1 ]; do[m
[31m-        have=$1[m
[31m-        value=$2[m
[31m-        . auto/define[m
[31m-    done[m
[31m-[m
[31m-    local PFX=$NGX_AUTO_LIB_PFX[m
[31m-[m
[31m-    eval USE_$PFX=NO[m
[31m-[m
[31m-    if [ $ngx_auto_lib_test_dir ]; then[m
[31m-        eval $PFX=$ngx_auto_lib_test_dir[m
[31m-    else[m
[31m-        eval $PFX=$ngx_auto_lib_lib_dir[m
[31m-    fi[m
[31m-[m
[31m-    if [ $NGX_AUTO_LIB_SHARED != YES ]; then[m
[31m-        for l in $ngx_feature_lib_names; do[m
[31m-            CORE_LIBS=`echo $CORE_LIBS | sed 's|-\<l$l\>||g'`[m
[31m-            ADDON_LIBS=`echo $ADDON_LIBS | sed 's|-\<l$l\>||g'`[m
[31m-        done[m
[31m-    fi[m
[31m-[m
[31m-    eval ${PFX}_INC=$INC[m
[31m-    eval ${PFX}_LIB=$LIB[m
[31m-    eval ${PFX}_SHARED=$NGX_AUTO_LIB_SHARED[m
[31m-    eval AUTO_$PFX=YES[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_set_custom_variables() {[m
[31m-    return 0[m
[31m-}[m
[31m-[m
[31m-########################[m
[31m-## FINALIZE FUNCTIONS ##[m
[31m-########################[m
[31m-[m
[31m-ngx_auto_lib_finalize() {[m
[31m-    ngx_auto_lib_finalize_core[m
[31m-}[m
[31m-[m
[31m-ngx_auto_lib_finalize_core() {[m
[31m-[m
[31m-    if [ $ngx_found = yes ]; then[m
[31m-[m
[31m-        ngx_auto_lib_set_core_variables[m
[31m-        ngx_auto_lib_set_generic_variables[m
[31m-[m
[31m-        if [ "$ngx_feature_variables" ]; then[m
[31m-            eval $ngx_feature_variables[m
[31m-        fi[m
[31m-[m
[31m-        ngx_auto_lib_set_custom_variables[m
[31m-[m
[31m-    elif [ $ngx_feature_exit_if_not_found = yes ]; then[m
[31m-[m
[31m-        if [ $ngx_auto_lib_module_name ]; then[m
[31m-            module_txt=" by the $ngx_auto_lib_module_name module" [m
[31m-        else[m
[31m-            module_text=[m
[31m-        fi        [m
[31m-[m
[31m-        lib=$ngx_auto_lib_name[m
[31m-        pfx=$ngx_auto_lib_pfx[m
[31m-        PFX=$NGX_AUTO_LIB_PFX[m
[31m-[m
[31m-cat << END[m
[31m-[m
[31m-$0: error: the $lib library is required$module_txt, but cannot[m
[31m-be found using the current configuration. In order for the compilation to succeed,[m
[31m-you will need to install the library using your system's package installer or point[m
[31m-the configure script to the library using one of the following variables :[m
[31m-[m
[31m-to define a dir to find $pfx library (source or install dir)    $PFX[m
[31m-to define $pfx lib and include dirs separately                  ${PFX}_LIB & ${PFX}_INC[m
[31m-to define a base dir to search for dirs beginning with $pfx-    ${PFX}_BASE[m
[31m-[m
[31m-e.g.[m
[31m-[m
[31m-$ export ${PFX}_LIB=/path/to/library/lib[m
[31m-$ export ${PFX}_LIB=/path/to/library/include[m
[31m-$ $0 ...[m
[31m-[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/notes/CHANGES b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/notes/CHANGES[m
[1mdeleted file mode 100644[m
[1mindex eaaef0b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/notes/CHANGES[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-Changelog[m
[31m----------[m
[31m-[m
[31m-0.1         feature : set_var functions[m
[31m-0.1.1       feature : upstream_list directive and functions[m
[31m-0.2         feature : conf merge functions[m
[31m-            feature : conf command macros[m
[31m-            feature : 'action' macros[m
[31m-0.2.1       bugfix  : ndk_map_uri_to_path_add_suffix[m
[31m-0.2.2       feature : regex conf functions[m
[31m-0.2.3       feature : version number[m
[31m-0.2.4       change  : the auto/build script is now executed automatically on compilation[m
[31m-0.2.9       feature : ngx_auto_lib included with source[m
[31m-0.2.11      bugfix  : hash functions did not display properly[m
[31m-0.2.12      feature : patches for rewrite functions and rewrite phase handler[m
[31m-0.2.13      change  : revert to old behaviour rewrite functions[m
[31m-            change  : pre-generated config and macro files now provided[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/notes/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/notes/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 7074f57..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/notes/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-Copyright (c) 2010, Marcus Clyne, Simpl (simpl.it)[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are met:[m
[31m-    * Redistributions of source code must retain the above copyright[m
[31m-      notice, this list of conditions and the following disclaimer.[m
[31m-    * Redistributions in binary form must reproduce the above copyright[m
[31m-      notice, this list of conditions and the following disclaimer in the[m
[31m-      documentation and/or other materials provided with the distribution.[m
[31m-    * Neither the name of the organization (Simpl) nor the[m
[31m-      names of its contributors may be used to endorse or promote products[m
[31m-      derived from this software without specific prior written permission.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND[m
[31m-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED[m
[31m-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE[m
[31m-DISCLAIMED. IN NO EVENT SHALL MARCUS CLYNE OR SIMPL BE LIABLE FOR ANY[m
[31m-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES[m
[31m-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;[m
[31m-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND[m
[31m-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_array.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_array.h[m
[1mdeleted file mode 100644[m
[1mindex 4e0d518..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_array.h[m
[1m+++ /dev/null[m
[36m@@ -1,113 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* Non-generated macros */[m
[31m-[m
[31m-#define     ndk_array_count(a)                  ((a)->nelts)[m
[31m-#define     ndk_array_get_first(a)              ((a)->elts)[m
[31m-#define     ndk_array_get_index(a,n)            ((void*) ((char*) (a)->elts + (a)->size * n))[m
[31m-#define     ndk_array_get_last(a)               ((void*) ((char*) (a)->elts + (a)->size * ((a)->nelts - 1)))[m
[31m-#define     ndk_array_get_reverse_index(a,n)    ((void*) ((char*) (a)->elts + (a)->size * ((a)->nelts - 1 - n)))[m
[31m-#define     ndk_array_push_clean(p,a)           {p = ngx_array_push (a); ndk_zerop (p);}[m
[31m-[m
[31m-[m
[31m-/* base action macro macros */[m
[31m-[m
[31m-#define     ndk_array_create_ac(a,pl,n,sz,ac)   {a = ngx_array_create (pl,n,sz); if (a == NULL) ac;}[m
[31m-#define     ndk_array_init_ac(a,pl,n,sz,ac)     {if (ngx_array_init (a,pl,n,sz) == NGX_ERROR) ac;}[m
[31m-#define     ndk_array_push_ac(p,a,ac)           {p = ngx_array_push (a);     if (p == NULL) ac;}[m
[31m-#define     ndk_array_push_clean_ac(p,a,ac)     {p = ngx_array_push (a);     if (p == NULL) ac; ndk_zerop (p);}[m
[31m-#define     ndk_array_push_n_ac(p,a,n,ac)       {p = ngx_array_push_n (a,n); if (p == NULL) ac;}[m
[31m-#define     ndk_array_push_n_clean_ac(p,a,n,ac) {p = ngx_array_push_n (a,n); if (p == NULL) ac; ndk_zeropn (p,n);}[m
[31m-[m
[31m-[m
[31m-/* generated action macros */[m
[31m-[m
[31m-#define     ndk_array_create_r0(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,return 0)[m
[31m-#define     ndk_array_create_r1(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,return 1)[m
[31m-#define     ndk_array_create_r_1(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,return -1)[m
[31m-#define     ndk_array_create_rok(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,return NGX_OK)[m
[31m-#define     ndk_array_create_rce(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_create_rcok(a,pl,n,sz)    ndk_array_create_ac        (a,pl,n,sz,return NGX_CONF_OK)[m
[31m-#define     ndk_array_create_re(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,return NGX_ERROR)[m
[31m-#define     ndk_array_create_rn(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,return NULL)[m
[31m-#define     ndk_array_create_rse(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_create_sce(a,pl,n,sz)     ndk_array_create_ac        (a,pl,n,sz,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_create_g(a,pl,n,sz,_lb)   ndk_array_create_ac        (a,pl,n,sz,goto _lb)[m
[31m-#define     ndk_array_create_ge(a,pl,n,sz)      ndk_array_create_ac        (a,pl,n,sz,goto error)[m
[31m-[m
[31m-#define     ndk_array_init_r0(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,return 0)[m
[31m-#define     ndk_array_init_r1(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,return 1)[m
[31m-#define     ndk_array_init_r_1(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,return -1)[m
[31m-#define     ndk_array_init_rok(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,return NGX_OK)[m
[31m-#define     ndk_array_init_rce(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_init_rcok(a,pl,n,sz)      ndk_array_init_ac          (a,pl,n,sz,return NGX_CONF_OK)[m
[31m-#define     ndk_array_init_re(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,return NGX_ERROR)[m
[31m-#define     ndk_array_init_rn(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,return NULL)[m
[31m-#define     ndk_array_init_rse(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_init_sce(a,pl,n,sz)       ndk_array_init_ac          (a,pl,n,sz,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_init_g(a,pl,n,sz,_lb)     ndk_array_init_ac          (a,pl,n,sz,goto _lb)[m
[31m-#define     ndk_array_init_ge(a,pl,n,sz)        ndk_array_init_ac          (a,pl,n,sz,goto error)[m
[31m-[m
[31m-#define     ndk_array_push_r0(p,a)              ndk_array_push_ac          (p,a,return 0)[m
[31m-#define     ndk_array_push_r1(p,a)              ndk_array_push_ac          (p,a,return 1)[m
[31m-#define     ndk_array_push_r_1(p,a)             ndk_array_push_ac          (p,a,return -1)[m
[31m-#define     ndk_array_push_rok(p,a)             ndk_array_push_ac          (p,a,return NGX_OK)[m
[31m-#define     ndk_array_push_rce(p,a)             ndk_array_push_ac          (p,a,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_push_rcok(p,a)            ndk_array_push_ac          (p,a,return NGX_CONF_OK)[m
[31m-#define     ndk_array_push_re(p,a)              ndk_array_push_ac          (p,a,return NGX_ERROR)[m
[31m-#define     ndk_array_push_rn(p,a)              ndk_array_push_ac          (p,a,return NULL)[m
[31m-#define     ndk_array_push_rse(p,a)             ndk_array_push_ac          (p,a,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_push_sce(p,a)             ndk_array_push_ac          (p,a,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_push_g(p,a,_lb)           ndk_array_push_ac          (p,a,goto _lb)[m
[31m-#define     ndk_array_push_ge(p,a)              ndk_array_push_ac          (p,a,goto error)[m
[31m-[m
[31m-#define     ndk_array_push_clean_r0(p,a)        ndk_array_push_clean_ac    (p,a,return 0)[m
[31m-#define     ndk_array_push_clean_r1(p,a)        ndk_array_push_clean_ac    (p,a,return 1)[m
[31m-#define     ndk_array_push_clean_r_1(p,a)       ndk_array_push_clean_ac    (p,a,return -1)[m
[31m-#define     ndk_array_push_clean_rok(p,a)       ndk_array_push_clean_ac    (p,a,return NGX_OK)[m
[31m-#define     ndk_array_push_clean_rce(p,a)       ndk_array_push_clean_ac    (p,a,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_push_clean_rcok(p,a)      ndk_array_push_clean_ac    (p,a,return NGX_CONF_OK)[m
[31m-#define     ndk_array_push_clean_re(p,a)        ndk_array_push_clean_ac    (p,a,return NGX_ERROR)[m
[31m-#define     ndk_array_push_clean_rn(p,a)        ndk_array_push_clean_ac    (p,a,return NULL)[m
[31m-#define     ndk_array_push_clean_rse(p,a)       ndk_array_push_clean_ac    (p,a,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_push_clean_sce(p,a)       ndk_array_push_clean_ac    (p,a,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_push_clean_g(p,a,_lb)     ndk_array_push_clean_ac    (p,a,goto _lb)[m
[31m-#define     ndk_array_push_clean_ge(p,a)        ndk_array_push_clean_ac    (p,a,goto error)[m
[31m-[m
[31m-#define     ndk_array_push_n_r0(p,a,n)          ndk_array_push_n_ac        (p,a,n,return 0)[m
[31m-#define     ndk_array_push_n_r1(p,a,n)          ndk_array_push_n_ac        (p,a,n,return 1)[m
[31m-#define     ndk_array_push_n_r_1(p,a,n)         ndk_array_push_n_ac        (p,a,n,return -1)[m
[31m-#define     ndk_array_push_n_rok(p,a,n)         ndk_array_push_n_ac        (p,a,n,return NGX_OK)[m
[31m-#define     ndk_array_push_n_rce(p,a,n)         ndk_array_push_n_ac        (p,a,n,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_push_n_rcok(p,a,n)        ndk_array_push_n_ac        (p,a,n,return NGX_CONF_OK)[m
[31m-#define     ndk_array_push_n_re(p,a,n)          ndk_array_push_n_ac        (p,a,n,return NGX_ERROR)[m
[31m-#define     ndk_array_push_n_rn(p,a,n)          ndk_array_push_n_ac        (p,a,n,return NULL)[m
[31m-#define     ndk_array_push_n_rse(p,a,n)         ndk_array_push_n_ac        (p,a,n,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_push_n_sce(p,a,n)         ndk_array_push_n_ac        (p,a,n,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_push_n_g(p,a,n,_lb)       ndk_array_push_n_ac        (p,a,n,goto _lb)[m
[31m-#define     ndk_array_push_n_ge(p,a,n)          ndk_array_push_n_ac        (p,a,n,goto error)[m
[31m-[m
[31m-#define     ndk_array_push_n_clean_r0(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,return 0)[m
[31m-#define     ndk_array_push_n_clean_r1(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,return 1)[m
[31m-#define     ndk_array_push_n_clean_r_1(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,return -1)[m
[31m-#define     ndk_array_push_n_clean_rok(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,return NGX_OK)[m
[31m-#define     ndk_array_push_n_clean_rce(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,return NGX_CONF_ERROR)[m
[31m-#define     ndk_array_push_n_clean_rcok(p,a,n)  ndk_array_push_n_clean_ac  (p,a,n,return NGX_CONF_OK)[m
[31m-#define     ndk_array_push_n_clean_re(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,return NGX_ERROR)[m
[31m-#define     ndk_array_push_n_clean_rn(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,return NULL)[m
[31m-#define     ndk_array_push_n_clean_rse(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,{ngx_script_error (e); return;})[m
[31m-#define     ndk_array_push_n_clean_sce(p,a,n)   ndk_array_push_n_clean_ac  (p,a,n,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_array_push_n_clean_g(p,a,n,_lb) ndk_array_push_n_clean_ac  (p,a,n,goto _lb)[m
[31m-#define     ndk_array_push_n_clean_ge(p,a,n)    ndk_array_push_n_clean_ac  (p,a,n,goto error)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_basic.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_basic.h[m
[1mdeleted file mode 100644[m
[1mindex c2db894..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_basic.h[m
[1m+++ /dev/null[m
[36m@@ -1,2203 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* conf cmd core values/bitmasks */[m
[31m-[m
[31m-#define     NDK_1MORE               NGX_1MORE[m
[31m-#define     NDK_2MORE               NGX_2MORE[m
[31m-#define     NDK_ANY                 NGX_ANY[m
[31m-#define     NDK_ARGS_NUMBER         NGX_ARGS_NUMBER[m
[31m-#define     NDK_BLOCK               NGX_BLOCK[m
[31m-#define     NDK_FLAG                NGX_FLAG[m
[31m-#define     NDK_MULTI               NGX_MULTI[m
[31m-#define     NDK_TAKE1               NGX_TAKE1[m
[31m-#define     NDK_TAKE12              NGX_TAKE12[m
[31m-#define     NDK_TAKE123             NGX_TAKE123[m
[31m-#define     NDK_TAKE1234            NGX_TAKE1234[m
[31m-#define     NDK_TAKE13              NGX_TAKE13[m
[31m-#define     NDK_TAKE2               NGX_TAKE2[m
[31m-#define     NDK_TAKE23              NGX_TAKE23[m
[31m-#define     NDK_TAKE3               NGX_TAKE3[m
[31m-#define     NDK_TAKE4               NGX_TAKE4[m
[31m-#define     NDK_TAKE5               NGX_TAKE5[m
[31m-#define     NDK_TAKE6               NGX_TAKE6[m
[31m-#define     NDK_TAKE7               NGX_TAKE7[m
[31m-#define     NDK_TAKE8               NGX_TAKE8[m
[31m-[m
[31m-[m
[31m-/* conf cmd bitmasks */[m
[31m-[m
[31m-/* TODO : finish this */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF              NGX_HTTP_MAIN_CONF[m
[31m-#define     NDK_HTTP_SRV_CONF               NGX_HTTP_SRV_CONF[m
[31m-#define     NDK_HTTP_SIF_CONF               NGX_HTTP_SIF_CONF[m
[31m-#define     NDK_HTTP_LOC_CONF               NGX_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_LIF_CONF               NGX_HTTP_LIF_CONF[m
[31m-#define     NDK_HTTP_UPS_CONF               NGX_HTTP_UPS_CONF[m
[31m-#define     NDK_MAIN_CONF                   NGX_MAIN_CONF[m
[31m-#define     NDK_ANY_CONF                    NGX_ANY_CONF[m
[31m-[m
[31m-[m
[31m-/* compound locations */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_CONF[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_SIF_CONF[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF                  NDK_HTTP_MAIN_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_SIF_CONF                   NDK_HTTP_SRV_CONF|NDK_HTTP_SIF_CONF[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF                   NDK_HTTP_SRV_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_SRV_LOC_LIF_CONF               NDK_HTTP_SRV_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-#define     NDK_HTTP_SRV_SIF_LOC_CONF               NDK_HTTP_SRV_SIF_CONF|NDK_HTTP_LOC_CONF[m
[31m-#define     NDK_HTTP_SRV_SIF_LOC_LIF_CONF           NDK_HTTP_SRV_SIF_CONF|NDK_HTTP_LOC_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_LIF_CONF                   NDK_HTTP_LOC_CONF|NDK_HTTP_LIF_CONF[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SRV_LIF_CONF[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF              NDK_HTTP_MAIN_CONF|NDK_HTTP_SIF_LOC_CONF[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_LIF_CONF      NDK_HTTP_SRV_SIF_LOC_LIF_CONF|NDK_MAIN_CONF[m
[31m-#define     NDK_HTTP_CONF                           NDK_HTTP_MAIN_SRV_SIF_LOC_LIF_CONF[m
[31m-#define     NDK_HTTP_ANY_CONF                       NDK_HTTP_CONF|NDK_HTTP_UPS_CONF[m
[31m-[m
[31m-[m
[31m-/* property offsets     NOTE : ngx_module_main_conf_t etc should be defined in the module's .c file before the commands */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_PROP(p)      NGX_HTTP_MAIN_CONF_OFFSET, offsetof (ndk_module_main_conf_t, p)[m
[31m-#define     NDK_HTTP_SRV_CONF_PROP(p)       NGX_HTTP_SRV_CONF_OFFSET, offsetof (ndk_module_srv_conf_t, p)[m
[31m-#define     NDK_HTTP_LOC_CONF_PROP(p)       NGX_HTTP_LOC_CONF_OFFSET, offsetof (ndk_module_loc_conf_t, p)[m
[31m-[m
[31m-[m
[31m-/* conf cmd basic macros */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_1MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_1MORE|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_2MORE(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_2MORE|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ANY(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ANY|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ARGS_NUMBER(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_ARGS_NUMBER|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_BLOCK(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_BLOCK|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_FLAG(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_FLAG|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_MULTI(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_MULTI|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE1(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE12(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE12|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE123(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE123|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE1234(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE1234|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE13(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE13|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE2(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE2|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE23(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE23|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE3(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE3|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE4(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE4|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE5(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE5|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE6(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE6|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE7(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE7|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SRV_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_SIF_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SRV_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SRV_LIF_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_MAIN_SRV_SIF_LOC_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_UPS_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_HTTP_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TAKE8(name,func,off1,off2,post)\[m
[31m-                                    {ngx_string (name),\[m
[31m-                                    NGX_CONF_TAKE8|NDK_ANY_CONF,\[m
[31m-                                    func, off1, off2, post},[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_extra.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_extra.h[m
[1mdeleted file mode 100644[m
[1mindex 68e276f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_cmd_extra.h[m
[1m+++ /dev/null[m
[36m@@ -1,5423 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* conf command macros */[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_BITMASK(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bitmask_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_BUFS(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_BUFS(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_bufs_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_COMPLEX_KEYVAL(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_COMPLEX_PATH(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_COMPLEX_VALUE_ARRAY(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_COMPLEX_VALUE(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_http_complex_value_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ENCODING(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_encoding_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ENUM(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ENUM(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_enum_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_FALSE(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_FALSE(name,p,post)\[m
[31m-            NDK_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_false_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_FULL_PATH(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_full_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_KEYVAL1(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval1_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_KEYVAL(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_keyval_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_MSEC(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_MSEC(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_msec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_NULL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_NULL(name,p,post)\[m
[31m-            NDK_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_null_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_NUM64(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_NUM64(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num64_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_NUM_FLAG(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_NUM(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_NUM(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_num_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_OFF(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_OFF(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_off_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_ONOFF(name,p,post)\[m
[31m-            NDK_ANY_CONF_FLAG\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_PATH(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_PATH(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_split_path_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_PTR(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_PTR(name,p,post)\[m
[31m-            NDK_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_ptr_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_REGEX_ARRAY(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_REGEX_ARRAY_CL(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_array_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_REGEX_CL(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_caseless_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_REXEX(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_REXEX(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_regex_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_SEC_FLAG(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE2\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_flag_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_SEC(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_SEC(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_sec_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_SIZE(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_SIZE(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_size_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_STR_ARRAY(name,p,post)\[m
[31m-            NDK_ANY_CONF_1MORE\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_multi_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_STR_ARRAY1(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_array_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_STR(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_STR(name,p,post)\[m
[31m-            NDK_ANY_CONF_TAKE1\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_str_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_MAIN_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_main_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_SRV_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_srv_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SRV_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_SIF_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_SIF_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_LIF_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_LIF_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SIF_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_MAIN_SRV_SIF_LOC_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_UPS_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_UPS_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_HTTP_ANY_CONF_TRUE(name,p,post)\[m
[31m-            NDK_HTTP_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-#define     NDK_ANY_CONF_TRUE(name,p,post)\[m
[31m-            NDK_ANY_CONF_NOARGS\[m
[31m-                (name,\[m
[31m-                ndk_conf_set_true_slot,\[m
[31m-                NGX_HTTP_LOC_CONF_OFFSET,\[m
[31m-                offsetof (ndk_module_loc_conf_t, p),\[m
[31m-                post)[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_merge.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_merge.h[m
[1mdeleted file mode 100644[m
[1mindex 4f7855f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_conf_merge.h[m
[1m+++ /dev/null[m
[36m@@ -1,227 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* conf-merge-value macros */[m
[31m-[m
[31m-/* TODO : check that all the main types have a corresponding merge function */[m
[31m-[m
[31m-#define     ndk_conf_merge_value            ngx_conf_merge_value[m
[31m-#define     ndk_conf_merge_off_value        ngx_conf_merge_off_value [m
[31m-#define     ndk_conf_merge_ptr_value        ngx_conf_merge_ptr_value[m
[31m-#define     ndk_conf_merge_str_value        ngx_conf_merge_str_value[m
[31m-#define     ndk_conf_merge_size_value       ngx_conf_merge_size_value [m
[31m-[m
[31m-[m
[31m-#define     ndk_conf_merge_keyval_value(conf,prev,default)                                  \[m
[31m-                                                                                            \[m
[31m-                conf = prev ? prev : default;[m
[31m-[m
[31m-#define     ndk_conf_merge_str_array_value(conf,prev,val1,...)                              \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR) {                                           \[m
[31m-                    if (prev == NGX_CONF_UNSET_PTR) {                                       \[m
[31m-                        if (val1 == NULL) {                                                 \[m
[31m-                            conf = NULL;                                                    \[m
[31m-                        } else {                                                            \[m
[31m-                            char * elts[] = {val1,##__VA_ARGS__};                           \[m
[31m-                            int    n = sizeof(elts)/sizeof(char*);                          \[m
[31m-                                                                                            \[m
[31m-                            conf = ndk_str_array_create (cf->pool, elts, n);                \[m
[31m-                                                                                            \[m
[31m-                            if (conf == NULL)                                               \[m
[31m-                                return  NGX_CONF_ERROR;                                     \[m
[31m-                        }                                                                   \[m
[31m-                    } else {                                                                \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_value_value(conf,prev,default)                      \[m
[31m-                                                                                            \[m
[31m-                if (!conf.str.len) {                                                        \[m
[31m-                    if (prev.str.len) {                                                     \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    } else {                                                                \[m
[31m-                        conf.str.data = (u_char *) default;                                 \[m
[31m-                        conf.str.len = sizeof (default) - 1;                                \[m
[31m-                                                                                            \[m
[31m-                        if (ndk_http_complex_value_compile (cf, &conf))                     \[m
[31m-                            return  NGX_CONF_ERROR;                                         \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_value_array_value(conf,prev,val1,...)               \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR) {                                           \[m
[31m-                    if (prev == NGX_CONF_UNSET_PTR) {                                       \[m
[31m-                        if (val1 == NULL)                                                   \[m
[31m-                            conf = NULL;                                                    \[m
[31m-                        else {                                                              \[m
[31m-                            char * elts[] = {val1,##__VA_ARGS__};                           \[m
[31m-                            int    n = sizeof(elts)/sizeof(char*);                          \[m
[31m-                                                                                            \[m
[31m-                            conf = ndk_http_complex_value_array_create (cf, elts, n);       \[m
[31m-                                                                                            \[m
[31m-                            if (conf == NULL)                                               \[m
[31m-                                return  NGX_CONF_ERROR;                                     \[m
[31m-                        }                                                                   \[m
[31m-                    } else {                                                                \[m
[31m-                        conf = prev;                                                        \[m
[31m-                    }                                                                       \[m
[31m-                }[m
[31m-[m
[31m-#define     ndk_conf_merge_http_complex_path_value(conf,prev,...)                           \[m
[31m-                ndk_conf_merge_http_complex_value_array_value (conf.a, prev.a, __VA_ARGS__)[m
[31m-[m
[31m-#define     ndk_conf_merge_split_path_value(conf,prev,path)                                 \[m
[31m-                                                                                            \[m
[31m-                if (conf == NGX_CONF_UNSET_PTR)  {                                          \[m
[31m-                    conf = (prev == NGX_CONF_UNSET_PTR ?                                    \[m
[31m-                        ndk_split_path_create_raw (cf, path) : prev);                       \[m
[31m-                }[m
[31m-[m
[31m-[m
[31m-/* conf-merge-prop macros */[m
[31m-[m
[31m-#define     ndk_conf_merge_prop(prop,default)\[m
[31m-            ndk_conf_merge_value\[m
[31m-                (conf->prop, prev->prop, default)[m
[31m-[m
[31m-#define     ndk_conf_merge_bitmask_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_bitmask_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_bufs_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_bufs_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_encoding_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_encoding_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_enum_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_enum_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_false_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_false_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_flag_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_flag_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_full_path_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_full_path_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_http_complex_keyval_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_http_complex_keyval_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_http_complex_path_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_http_complex_path_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_http_complex_value_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_http_complex_value_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_http_complex_value_array_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_http_complex_value_array_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_keyval_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_keyval_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_keyval1_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_keyval1_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_msec_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_msec_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_null_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_null_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_num_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_num_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_num64_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_num64_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_num_flag_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_num_flag_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_off_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_off_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_ptr_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_ptr_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_regex_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_regex_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_regex_array_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_regex_array_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_regex_array_caseless_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_regex_array_caseless_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_regex_caseless_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_regex_caseless_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_sec_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_sec_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_sec_flag_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_sec_flag_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_size_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_size_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_split_path_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_split_path_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_str_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_str_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_str_array_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_str_array_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_str_array_multi_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_str_array_multi_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[31m-#define     ndk_conf_merge_true_prop(prop,default,...)\[m
[31m-            ndk_conf_merge_true_value\[m
[31m-                (conf->prop, prev->prop, default,##__VA_ARGS__)[m
[31m-    [m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_config.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_config.c[m
[1mdeleted file mode 100644[m
[1mindex d2e572f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_config.c[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* optional includes */[m
[31m-[m
[31m-#if (NDK_BUF)[m
[31m-#include  <ndk_buf.c>[m
[31m-#endif[m
[31m-#if (NDK_COMPLEX_PATH)[m
[31m-#include  <ndk_complex_path.c>[m
[31m-#endif[m
[31m-#if (NDK_COMPLEX_VALUE)[m
[31m-#include  <ndk_complex_value.c>[m
[31m-#endif[m
[31m-#if (NDK_CONF_FILE)[m
[31m-#include  <ndk_conf_file.c>[m
[31m-#endif[m
[31m-#if (NDK_ENCODING)[m
[31m-#include  <ndk_encoding.c>[m
[31m-#endif[m
[31m-#if (NDK_HASH)[m
[31m-#include  <ndk_hash.c>[m
[31m-#endif[m
[31m-#if (NDK_HTTP)[m
[31m-#include  <ndk_http.c>[m
[31m-#endif[m
[31m-#if (NDK_PATH)[m
[31m-#include  <ndk_path.c>[m
[31m-#endif[m
[31m-#if (NDK_PROCESS)[m
[31m-#include  <ndk_process.c>[m
[31m-#endif[m
[31m-#if (NDK_REGEX)[m
[31m-#include  <ndk_regex.c>[m
[31m-#endif[m
[31m-#if (NDK_REWRITE)[m
[31m-#include  <ndk_rewrite.c>[m
[31m-#endif[m
[31m-#if (NDK_SET_VAR)[m
[31m-#include  <ndk_set_var.c>[m
[31m-#endif[m
[31m-#if (NDK_STRING)[m
[31m-#include  <ndk_string.c>[m
[31m-#endif[m
[31m-#if (NDK_UPSTREAM_LIST)[m
[31m-#include  <ndk_upstream_list.c>[m
[31m-#endif[m
[31m-#if (NDK_URI)[m
[31m-#include  <ndk_uri.c>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* module commands */[m
[31m-[m
[31m-static ngx_command_t  ndk_http_commands[] = {[m
[31m-#if (NDK_UPSTREAM_LIST)[m
[31m-#define NDK_UPSTREAM_LIST_CMDS 1[m
[31m-#include  <ndk_upstream_list.h>[m
[31m-#undef  NDK_UPSTREAM_LIST_CMDS[m
[31m-#endif[m
[31m-    ngx_null_command[m
[31m-};[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_config.h[m
[1mdeleted file mode 100644[m
[1mindex 7223950..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,98 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* include all optional modules */[m
[31m-[m
[31m-#ifdef NDK_ALL[m
[31m-[m
[31m-#ifndef NDK_BUF[m
[31m-#define NDK_BUF 1[m
[31m-#endif[m
[31m-#ifndef NDK_COMPLEX_PATH[m
[31m-#define NDK_COMPLEX_PATH 1[m
[31m-#endif[m
[31m-#ifndef NDK_COMPLEX_VALUE[m
[31m-#define NDK_COMPLEX_VALUE 1[m
[31m-#endif[m
[31m-#ifndef NDK_CONF_FILE[m
[31m-#define NDK_CONF_FILE 1[m
[31m-#endif[m
[31m-#ifndef NDK_ENCODING[m
[31m-#define NDK_ENCODING 1[m
[31m-#endif[m
[31m-#ifndef NDK_HASH[m
[31m-#define NDK_HASH 1[m
[31m-#endif[m
[31m-#ifndef NDK_HTTP[m
[31m-#define NDK_HTTP 1[m
[31m-#endif[m
[31m-#ifndef NDK_PATH[m
[31m-#define NDK_PATH 1[m
[31m-#endif[m
[31m-#ifndef NDK_PROCESS[m
[31m-#define NDK_PROCESS 1[m
[31m-#endif[m
[31m-#ifndef NDK_REGEX[m
[31m-#define NDK_REGEX 1[m
[31m-#endif[m
[31m-#ifndef NDK_REWRITE[m
[31m-#define NDK_REWRITE 1[m
[31m-#endif[m
[31m-#ifndef NDK_SET_VAR[m
[31m-#define NDK_SET_VAR 1[m
[31m-#endif[m
[31m-#ifndef NDK_STRING[m
[31m-#define NDK_STRING 1[m
[31m-#endif[m
[31m-#ifndef NDK_UPSTREAM_LIST[m
[31m-#define NDK_UPSTREAM_LIST 1[m
[31m-#endif[m
[31m-#ifndef NDK_URI[m
[31m-#define NDK_URI 1[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* module dependencies */[m
[31m-[m
[31m-#ifdef  NDK_COMPLEX_PATH[m
[31m-#ifndef NDK_COMPLEX_VALUE[m
[31m-#define NDK_COMPLEX_VALUE 1[m
[31m-#endif[m
[31m-#ifndef NDK_PATH[m
[31m-#define NDK_PATH 1[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef  NDK_CONF_FILE[m
[31m-#ifndef NDK_STRING[m
[31m-#define NDK_STRING 1[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef  NDK_HASH[m
[31m-#ifndef NDK_STRING[m
[31m-#define NDK_STRING 1[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef  NDK_SET_VAR[m
[31m-#ifndef NDK_REWRITE[m
[31m-#define NDK_REWRITE 1[m
[31m-#endif[m
[31m-#endif[m
[31m-#ifdef  NDK_UPSTREAM_LIST[m
[31m-#ifndef NDK_HTTP_CREATE_MAIN_CONF[m
[31m-#define NDK_HTTP_CREATE_MAIN_CONF 1[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_includes.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_includes.h[m
[1mdeleted file mode 100644[m
[1mindex cbbf60a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_includes.h[m
[1m+++ /dev/null[m
[36m@@ -1,66 +0,0 @@[m
[31m-/* optional includes */[m
[31m-[m
[31m-#if (NDK_BUF)[m
[31m-#include  <ndk_buf.h>[m
[31m-#endif[m
[31m-#if (NDK_COMPLEX_PATH)[m
[31m-#include  <ndk_complex_path.h>[m
[31m-#endif[m
[31m-#if (NDK_COMPLEX_VALUE)[m
[31m-#include  <ndk_complex_value.h>[m
[31m-#endif[m
[31m-#if (NDK_CONF_FILE)[m
[31m-#include  <ndk_conf_file.h>[m
[31m-#endif[m
[31m-#if (NDK_ENCODING)[m
[31m-#include  <ndk_encoding.h>[m
[31m-#endif[m
[31m-#if (NDK_HASH)[m
[31m-#include  <ndk_hash.h>[m
[31m-#endif[m
[31m-#if (NDK_HTTP)[m
[31m-#include  <ndk_http.h>[m
[31m-#endif[m
[31m-#if (NDK_PATH)[m
[31m-#include  <ndk_path.h>[m
[31m-#endif[m
[31m-#if (NDK_PROCESS)[m
[31m-#include  <ndk_process.h>[m
[31m-#endif[m
[31m-#if (NDK_REGEX)[m
[31m-#include  <ndk_regex.h>[m
[31m-#endif[m
[31m-#if (NDK_REWRITE)[m
[31m-#include  <ndk_rewrite.h>[m
[31m-#endif[m
[31m-#if (NDK_SET_VAR)[m
[31m-#include  <ndk_set_var.h>[m
[31m-#endif[m
[31m-#if (NDK_STRING)[m
[31m-#include  <ndk_string.h>[m
[31m-#endif[m
[31m-#if (NDK_UPSTREAM_LIST)[m
[31m-#include  <ndk_upstream_list.h>[m
[31m-#endif[m
[31m-#if (NDK_URI)[m
[31m-#include  <ndk_uri.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* non-optional includes */[m
[31m-[m
[31m-#include  <ndk_http_headers.h>[m
[31m-#include  <ndk_log.h>[m
[31m-#include  <ndk_parse.h>[m
[31m-#include  <ndk_string_util.h>[m
[31m-[m
[31m-[m
[31m-/* auto-generated headers */[m
[31m-[m
[31m-#include  <ndk_array.h>[m
[31m-#include  <ndk_palloc.h>[m
[31m-#include  <ndk_conf_merge.h>[m
[31m-#include  <ndk_conf_cmd_basic.h>[m
[31m-#include  <ndk_conf_cmd_extra.h>[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_palloc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_palloc.h[m
[1mdeleted file mode 100644[m
[1mindex db8aaf1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/objs/ndk_palloc.h[m
[1m+++ /dev/null[m
[36m@@ -1,112 +0,0 @@[m
[31m-[m
[31m-/* [m
[31m- * 2010 (C) Marcus Clyne [m
[31m- *[m
[31m- * DO NOT EDIT THIS FILE MANUALLY[m
[31m- * ------------------------------[m
[31m- * This file has been generated automatically from scripts in the $base/auto dir and[m
[31m- * data in the $base/auto/data dir. If you wish to edit the output of this file, then[m
[31m- * you should edit these files instead.[m
[31m- *[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/* Non-generated macros */[m
[31m-[m
[31m-#define     ndk_pallocp(p,pl)                   p = ngx_palloc (pl,sizeof(*p))[m
[31m-#define     ndk_pallocpn(p,pl,n)                p = ngx_palloc (pl,sizeof(*p)*(n))[m
[31m-[m
[31m-#define     ndk_pcallocp(p,pl)                  p = ngx_pcalloc (pl,sizeof(*p))[m
[31m-#define     ndk_pcallocpn(p,pl,n)               p = ngx_pcalloc (pl,sizeof(*p)*(n))[m
[31m-[m
[31m-[m
[31m-/* base action macro macros */[m
[31m-[m
[31m-#define     ndk_palloc_ac(p,pl,sz,ac)           {p = ngx_palloc (pl,sz);    if (p == NULL) ac;}[m
[31m-#define     ndk_pallocp_ac(p,pl,ac)             {ndk_pallocp (p,pl);        if (p == NULL) ac;}[m
[31m-#define     ndk_pallocpn_ac(p,pl,n,ac)          {ndk_pallocpn (p,pl,n);     if (p == NULL) ac;}[m
[31m-#define     ndk_pcalloc_ac(p,pl,sz,ac)          {p = ngx_pcalloc (pl,sz);   if (p == NULL) ac;}[m
[31m-#define     ndk_pcallocp_ac(p,pl,ac)            {ndk_pcallocp (p,pl);       if (p == NULL) ac;}[m
[31m-#define     ndk_pcallocpn_ac(p,pl,n,ac)         {ndk_pcallocpn (p,pl,n);    if (p == NULL) ac;}[m
[31m-[m
[31m-[m
[31m-/* generated action macros */[m
[31m-[m
[31m-#define     ndk_palloc_r0(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,return 0)[m
[31m-#define     ndk_palloc_r1(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,return 1)[m
[31m-#define     ndk_palloc_r_1(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,return -1)[m
[31m-#define     ndk_palloc_rok(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,return NGX_OK)[m
[31m-#define     ndk_palloc_rce(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,return NGX_CONF_ERROR)[m
[31m-#define     ndk_palloc_rcok(p,pl,sz)            ndk_palloc_ac              (p,pl,sz,return NGX_CONF_OK)[m
[31m-#define     ndk_palloc_re(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,return NGX_ERROR)[m
[31m-#define     ndk_palloc_rn(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,return NULL)[m
[31m-#define     ndk_palloc_rse(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,{ngx_script_error (e); return;})[m
[31m-#define     ndk_palloc_sce(p,pl,sz)             ndk_palloc_ac              (p,pl,sz,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_palloc_g(p,pl,sz,_lb)           ndk_palloc_ac              (p,pl,sz,goto _lb)[m
[31m-#define     ndk_palloc_ge(p,pl,sz)              ndk_palloc_ac              (p,pl,sz,goto error)[m
[31m-[m
[31m-#define     ndk_pallocp_r0(p,pl)                ndk_pallocp_ac             (p,pl,return 0)[m
[31m-#define     ndk_pallocp_r1(p,pl)                ndk_pallocp_ac             (p,pl,return 1)[m
[31m-#define     ndk_pallocp_r_1(p,pl)               ndk_pallocp_ac             (p,pl,return -1)[m
[31m-#define     ndk_pallocp_rok(p,pl)               ndk_pallocp_ac             (p,pl,return NGX_OK)[m
[31m-#define     ndk_pallocp_rce(p,pl)               ndk_pallocp_ac             (p,pl,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pallocp_rcok(p,pl)              ndk_pallocp_ac             (p,pl,return NGX_CONF_OK)[m
[31m-#define     ndk_pallocp_re(p,pl)                ndk_pallocp_ac             (p,pl,return NGX_ERROR)[m
[31m-#define     ndk_pallocp_rn(p,pl)                ndk_pallocp_ac             (p,pl,return NULL)[m
[31m-#define     ndk_pallocp_rse(p,pl)               ndk_pallocp_ac             (p,pl,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pallocp_sce(p,pl)               ndk_pallocp_ac             (p,pl,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pallocp_g(p,pl,_lb)             ndk_pallocp_ac             (p,pl,goto _lb)[m
[31m-#define     ndk_pallocp_ge(p,pl)                ndk_pallocp_ac             (p,pl,goto error)[m
[31m-[m
[31m-#define     ndk_pallocpn_r0(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,return 0)[m
[31m-#define     ndk_pallocpn_r1(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,return 1)[m
[31m-#define     ndk_pallocpn_r_1(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,return -1)[m
[31m-#define     ndk_pallocpn_rok(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,return NGX_OK)[m
[31m-#define     ndk_pallocpn_rce(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pallocpn_rcok(p,pl,n)           ndk_pallocpn_ac            (p,pl,n,return NGX_CONF_OK)[m
[31m-#define     ndk_pallocpn_re(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,return NGX_ERROR)[m
[31m-#define     ndk_pallocpn_rn(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,return NULL)[m
[31m-#define     ndk_pallocpn_rse(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pallocpn_sce(p,pl,n)            ndk_pallocpn_ac            (p,pl,n,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pallocpn_g(p,pl,n,_lb)          ndk_pallocpn_ac            (p,pl,n,goto _lb)[m
[31m-#define     ndk_pallocpn_ge(p,pl,n)             ndk_pallocpn_ac            (p,pl,n,goto error)[m
[31m-[m
[31m-#define     ndk_pcalloc_r0(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,return 0)[m
[31m-#define     ndk_pcalloc_r1(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,return 1)[m
[31m-#define     ndk_pcalloc_r_1(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,return -1)[m
[31m-#define     ndk_pcalloc_rok(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,return NGX_OK)[m
[31m-#define     ndk_pcalloc_rce(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pcalloc_rcok(p,pl,sz)           ndk_pcalloc_ac             (p,pl,sz,return NGX_CONF_OK)[m
[31m-#define     ndk_pcalloc_re(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,return NGX_ERROR)[m
[31m-#define     ndk_pcalloc_rn(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,return NULL)[m
[31m-#define     ndk_pcalloc_rse(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pcalloc_sce(p,pl,sz)            ndk_pcalloc_ac             (p,pl,sz,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pcalloc_g(p,pl,sz,_lb)          ndk_pcalloc_ac             (p,pl,sz,goto _lb)[m
[31m-#define     ndk_pcalloc_ge(p,pl,sz)             ndk_pcalloc_ac             (p,pl,sz,goto error)[m
[31m-[m
[31m-#define     ndk_pcallocp_r0(p,pl)               ndk_pcallocp_ac            (p,pl,return 0)[m
[31m-#define     ndk_pcallocp_r1(p,pl)               ndk_pcallocp_ac            (p,pl,return 1)[m
[31m-#define     ndk_pcallocp_r_1(p,pl)              ndk_pcallocp_ac            (p,pl,return -1)[m
[31m-#define     ndk_pcallocp_rok(p,pl)              ndk_pcallocp_ac            (p,pl,return NGX_OK)[m
[31m-#define     ndk_pcallocp_rce(p,pl)              ndk_pcallocp_ac            (p,pl,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pcallocp_rcok(p,pl)             ndk_pcallocp_ac            (p,pl,return NGX_CONF_OK)[m
[31m-#define     ndk_pcallocp_re(p,pl)               ndk_pcallocp_ac            (p,pl,return NGX_ERROR)[m
[31m-#define     ndk_pcallocp_rn(p,pl)               ndk_pcallocp_ac            (p,pl,return NULL)[m
[31m-#define     ndk_pcallocp_rse(p,pl)              ndk_pcallocp_ac            (p,pl,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pcallocp_sce(p,pl)              ndk_pcallocp_ac            (p,pl,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pcallocp_g(p,pl,_lb)            ndk_pcallocp_ac            (p,pl,goto _lb)[m
[31m-#define     ndk_pcallocp_ge(p,pl)               ndk_pcallocp_ac            (p,pl,goto error)[m
[31m-[m
[31m-#define     ndk_pcallocpn_r0(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,return 0)[m
[31m-#define     ndk_pcallocpn_r1(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,return 1)[m
[31m-#define     ndk_pcallocpn_r_1(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,return -1)[m
[31m-#define     ndk_pcallocpn_rok(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,return NGX_OK)[m
[31m-#define     ndk_pcallocpn_rce(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,return NGX_CONF_ERROR)[m
[31m-#define     ndk_pcallocpn_rcok(p,pl,n)          ndk_pcallocpn_ac           (p,pl,n,return NGX_CONF_OK)[m
[31m-#define     ndk_pcallocpn_re(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,return NGX_ERROR)[m
[31m-#define     ndk_pcallocpn_rn(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,return NULL)[m
[31m-#define     ndk_pcallocpn_rse(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,{ngx_script_error (e); return;})[m
[31m-#define     ndk_pcallocpn_sce(p,pl,n)           ndk_pcallocpn_ac           (p,pl,n,{ngx_script_configure_error (c); return;})[m
[31m-#define     ndk_pcallocpn_g(p,pl,n,_lb)         ndk_pcallocpn_ac           (p,pl,n,goto _lb)[m
[31m-#define     ndk_pcallocpn_ge(p,pl,n)            ndk_pcallocpn_ac           (p,pl,n,goto error)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/auto_config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/auto_config[m
[1mdeleted file mode 100644[m
[1mindex ba4fdd4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/auto_config[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-diff -pNr a/src/core/ngx_config.h b/src/core/ngx_config.h[m
[31m-*** a/src/core/ngx_config.h	2008-09-19 13:47:13.000000000 +0100[m
[31m---- b/src/core/ngx_config.h	2010-10-09 17:14:13.000000000 +0100[m
[31m-*************** typedef intptr_t        ngx_flag_t;[m
[31m-*** 127,131 ****[m
[31m-  #define NGX_MAX_UINT32_VALUE  (uint32_t) 0xffffffff[m
[31m-  #endif[m
[31m-  [m
[31m-! [m
[31m-  #endif /* _NGX_CONFIG_H_INCLUDED_ */[m
[31m---- 127,131 ----[m
[31m-  #define NGX_MAX_UINT32_VALUE  (uint32_t) 0xffffffff[m
[31m-  #endif[m
[31m-  [m
[31m-! #include <ndk_config.h>[m
[31m-  #endif /* _NGX_CONFIG_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/expose_rewrite_functions b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/expose_rewrite_functions[m
[1mdeleted file mode 100644[m
[1mindex ec1d6d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/expose_rewrite_functions[m
[1m+++ /dev/null[m
[36m@@ -1,291 +0,0 @@[m
[31m-diff -rNp a/src/http/modules/ngx_http_rewrite_module.c b/src/http/modules/ngx_http_rewrite_module.c[m
[31m-*** a/src/http/modules/ngx_http_rewrite_module.c	2010-06-18 16:15:20.000000000 +0100[m
[31m---- b/src/http/modules/ngx_http_rewrite_module.c	2010-10-09 14:47:10.000000000 +0100[m
[31m-***************[m
[31m-*** 8,14 ****[m
[31m-  #include <ngx_core.h>[m
[31m-  #include <ngx_http.h>[m
[31m-  [m
[31m-! [m
[31m-  typedef struct {[m
[31m-      ngx_array_t  *codes;        /* uintptr_t */[m
[31m-  [m
[31m---- 8,14 ----[m
[31m-  #include <ngx_core.h>[m
[31m-  #include <ngx_http.h>[m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-  typedef struct {[m
[31m-      ngx_array_t  *codes;        /* uintptr_t */[m
[31m-  [m
[31m-*************** typedef struct {[m
[31m-*** 17,23 ****[m
[31m-      ngx_flag_t    log;[m
[31m-      ngx_flag_t    uninitialized_variable_warn;[m
[31m-  } ngx_http_rewrite_loc_conf_t;[m
[31m-! [m
[31m-  [m
[31m-  static void *ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf);[m
[31m-  static char *ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf,[m
[31m---- 17,23 ----[m
[31m-      ngx_flag_t    log;[m
[31m-      ngx_flag_t    uninitialized_variable_warn;[m
[31m-  } ngx_http_rewrite_loc_conf_t;[m
[31m-! #endif[m
[31m-  [m
[31m-  static void *ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf);[m
[31m-  static char *ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf,[m
[31m-*************** static char *ngx_http_rewrite_return(ngx[m
[31m-*** 28,44 ****[m
[31m-      void *conf);[m
[31m-  static char *ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-  static char *ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-  static char * ngx_http_rewrite_if_condition(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf);[m
[31m-  static char *ngx_http_rewrite_variable(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-  static char *ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-  static char * ngx_http_rewrite_value(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-! [m
[31m-  [m
[31m-  static ngx_command_t  ngx_http_rewrite_commands[] = {[m
[31m-  [m
[31m---- 28,47 ----[m
[31m-      void *conf);[m
[31m-  static char *ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-+ #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-  static char *ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-  static char * ngx_http_rewrite_if_condition(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf);[m
[31m-  static char *ngx_http_rewrite_variable(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-+ #endif[m
[31m-  static char *ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-      void *conf);[m
[31m-+ #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-  static char * ngx_http_rewrite_value(ngx_conf_t *cf,[m
[31m-      ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value);[m
[31m-! #endif[m
[31m-  [m
[31m-  static ngx_command_t  ngx_http_rewrite_commands[] = {[m
[31m-  [m
[31m-*************** ngx_http_rewrite_handler(ngx_http_reques[m
[31m-*** 178,185 ****[m
[31m-      return r->err_status;[m
[31m-  }[m
[31m-  [m
[31m-! [m
[31m-! static ngx_int_t[m
[31m-  ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-      uintptr_t data)[m
[31m-  {[m
[31m---- 181,190 ----[m
[31m-      return r->err_status;[m
[31m-  }[m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! ngx_int_t[m
[31m-  ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-      uintptr_t data)[m
[31m-  {[m
[31m-*************** ngx_http_rewrite_break(ngx_conf_t *cf, n[m
[31m-*** 511,517 ****[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! static char *[m
[31m-  ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-  {[m
[31m-      ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m---- 516,525 ----[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! char *[m
[31m-  ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-  {[m
[31m-      ngx_http_rewrite_loc_conf_t  *lcf = conf;[m
[31m-*************** ngx_http_rewrite_if(ngx_conf_t *cf, ngx_[m
[31m-*** 627,633 ****[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! static char *[m
[31m-  ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf)[m
[31m-  {[m
[31m-      u_char                        *p;[m
[31m---- 635,644 ----[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! char *[m
[31m-  ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf)[m
[31m-  {[m
[31m-      u_char                        *p;[m
[31m-*************** ngx_http_rewrite_if_condition(ngx_conf_t[m
[31m-*** 847,853 ****[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! static char *[m
[31m-  ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-      ngx_str_t *value)[m
[31m-  {[m
[31m---- 858,867 ----[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! char *[m
[31m-  ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-      ngx_str_t *value)[m
[31m-  {[m
[31m-*************** ngx_http_rewrite_set(ngx_conf_t *cf, ngx[m
[31m-*** 948,954 ****[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! static char *[m
[31m-  ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-      ngx_str_t *value)[m
[31m-  {[m
[31m---- 962,971 ----[m
[31m-  }[m
[31m-  [m
[31m-  [m
[31m-! #if !(NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-! static[m
[31m-! #endif[m
[31m-! char *[m
[31m-  ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-      ngx_str_t *value)[m
[31m-  {[m
[31m-diff -rNp a/src/http/modules/ngx_http_rewrite_module.h b/src/http/modules/ngx_http_rewrite_module.h[m
[31m-*** a/src/http/modules/ngx_http_rewrite_module.h	1970-01-01 01:00:00.000000000 +0100[m
[31m---- b/src/http/modules/ngx_http_rewrite_module.h	2010-10-09 14:38:04.000000000 +0100[m
[31m-***************[m
[31m-*** 0 ****[m
[31m---- 1,47 ----[m
[31m-+ [m
[31m-+ /*[m
[31m-+  * Copyright (C) Marcus Clyne[m
[31m-+  *[m
[31m-+  * Note : this file has been created by the Nginx Development Kit using[m
[31m-+  * some code from ngx_http_rewrite_module.c[m
[31m-+  */[m
[31m-+ [m
[31m-+ #if (NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-+ [m
[31m-+ #ifndef _NGX_HTTP_REWRITE_H_INCLUDED_[m
[31m-+ #define _NGX_HTTP_REWRITE_H_INCLUDED_[m
[31m-+ [m
[31m-+ #include <ngx_config.h>[m
[31m-+ #include <ngx_core.h>[m
[31m-+ #include <ngx_http.h>[m
[31m-+ [m
[31m-+ [m
[31m-+ extern  ngx_module_t  ngx_http_rewrite_module;[m
[31m-+ [m
[31m-+ [m
[31m-+ typedef struct {[m
[31m-+     ngx_array_t  *codes;        /* uintptr_t */[m
[31m-+ [m
[31m-+     ngx_uint_t    stack_size;[m
[31m-+ [m
[31m-+     ngx_flag_t    log;[m
[31m-+     ngx_flag_t    uninitialized_variable_warn;[m
[31m-+ } ngx_http_rewrite_loc_conf_t;[m
[31m-+ [m
[31m-+ [m
[31m-+ char *[m
[31m-+ ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-+ char *[m
[31m-+ ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf);[m
[31m-+ char *[m
[31m-+ ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-+     ngx_str_t *value);[m
[31m-+ char *[m
[31m-+ ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,[m
[31m-+     ngx_str_t *value);[m
[31m-+ ngx_int_t[m
[31m-+ ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-+     uintptr_t data);[m
[31m-+ [m
[31m-+ #endif[m
[31m-+ #endif[m
[31m-diff -rNp a/src/http/ngx_http.h b/src/http/ngx_http.h[m
[31m-*** a/src/http/ngx_http.h	2010-06-15 16:13:34.000000000 +0100[m
[31m---- b/src/http/ngx_http.h	2010-10-09 14:25:56.000000000 +0100[m
[31m-*************** typedef u_char *(*ngx_http_log_handler_p[m
[31m-*** 43,48 ****[m
[31m---- 43,52 ----[m
[31m-  #include <ngx_http_ssl_module.h>[m
[31m-  #endif[m
[31m-  [m
[31m-+ #if (NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-+ #include <ngx_http_rewrite_module.h>[m
[31m-+ #endif[m
[31m-+ [m
[31m-  [m
[31m-  struct ngx_http_log_ctx_s {[m
[31m-      ngx_connection_t    *connection;[m
[31m-diff -rNp a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c[m
[31m-*** a/src/http/ngx_http_script.c	2010-09-13 13:44:43.000000000 +0100[m
[31m---- b/src/http/ngx_http_script.c	2010-10-09 14:36:10.000000000 +0100[m
[31m-*************** static size_t ngx_http_script_full_name_[m
[31m-*** 26,35 ****[m
[31m---- 26,43 ----[m
[31m-  static void ngx_http_script_full_name_code(ngx_http_script_engine_t *e);[m
[31m-  [m
[31m-  [m
[31m-+ #if (NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-+ [m
[31m-+ uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL;[m
[31m-+ [m
[31m-+ #else[m
[31m-+ [m
[31m-  #define ngx_http_script_exit  (u_char *) &ngx_http_script_exit_code[m
[31m-  [m
[31m-  static uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL;[m
[31m-  [m
[31m-+ #endif[m
[31m-+ [m
[31m-  [m
[31m-  void[m
[31m-  ngx_http_script_flush_complex_value(ngx_http_request_t *r,[m
[31m-diff -rNp a/src/http/ngx_http_script.h b/src/http/ngx_http_script.h[m
[31m-*** a/src/http/ngx_http_script.h	2010-09-13 13:44:43.000000000 +0100[m
[31m---- b/src/http/ngx_http_script.h	2010-10-09 14:33:40.000000000 +0100[m
[31m-***************[m
[31m-*** 12,17 ****[m
[31m---- 12,25 ----[m
[31m-  #include <ngx_core.h>[m
[31m-  #include <ngx_http.h>[m
[31m-  [m
[31m-+ #if (NDK_EXPOSE_REWRITE_FUNCTIONS)[m
[31m-+ [m
[31m-+ #define ngx_http_script_exit  (u_char *) &ngx_http_script_exit_code[m
[31m-+ [m
[31m-+ extern uintptr_t ngx_http_script_exit_code;[m
[31m-+ [m
[31m-+ #endif[m
[31m-+ [m
[31m-  [m
[31m-  typedef struct {[m
[31m-      u_char                     *ip;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/rewrite_phase_handler b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/rewrite_phase_handler[m
[1mdeleted file mode 100644[m
[1mindex bd5161f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/patches/rewrite_phase_handler[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-diff -p -r a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c[m
[31m-*** a/src/http/ngx_http_core_module.c	2010-09-27 12:48:12.000000000 +0100[m
[31m---- b/src/http/ngx_http_core_module.c	2010-10-09 13:44:09.000000000 +0100[m
[31m-*************** ngx_http_core_rewrite_phase(ngx_http_req[m
[31m-*** 910,915 ****[m
[31m---- 910,922 ----[m
[31m-          return NGX_AGAIN;[m
[31m-      }[m
[31m-  [m
[31m-+ #if defined(nginx_version) && nginx_version >= 8042 && (NDK_REWRITE_PHASE)[m
[31m-+ [m
[31m-+     if (rc == NGX_AGAIN || rc == NGX_DONE) {[m
[31m-+         return NGX_OK;[m
[31m-+     }[m
[31m-+     [m
[31m-+ #endif[m
[31m-      /* rc == NGX_OK || rc == NGX_ERROR || rc == NGX_HTTP_...  */[m
[31m-  [m
[31m-      ngx_http_finalize_request(r, rc);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/md5.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/md5.h[m
[1mdeleted file mode 100644[m
[1mindex 4cbf843..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/md5.h[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-/* crypto/md5/md5.h */[m
[31m-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * This package is an SSL implementation written[m
[31m- * by Eric Young (eay@cryptsoft.com).[m
[31m- * The implementation was written so as to conform with Netscapes SSL.[m
[31m- * [m
[31m- * This library is free for commercial and non-commercial use as long as[m
[31m- * the following conditions are aheared to.  The following conditions[m
[31m- * apply to all code found in this distribution, be it the RC4, RSA,[m
[31m- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation[m
[31m- * included with this distribution is covered by the same copyright terms[m
[31m- * except that the holder is Tim Hudson (tjh@cryptsoft.com).[m
[31m- * [m
[31m- * Copyright remains Eric Young's, and as such any Copyright notices in[m
[31m- * the code are not to be removed.[m
[31m- * If this package is used in a product, Eric Young should be given attribution[m
[31m- * as the author of the parts of the library used.[m
[31m- * This can be in the form of a textual message at program startup or[m
[31m- * in documentation (online or textual) provided with the package.[m
[31m- * [m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- * 3. All advertising materials mentioning features or use of this software[m
[31m- *    must display the following acknowledgement:[m
[31m- *    "This product includes cryptographic software written by[m
[31m- *     Eric Young (eay@cryptsoft.com)"[m
[31m- *    The word 'cryptographic' can be left out if the rouines from the library[m
[31m- *    being used are not cryptographic related :-).[m
[31m- * 4. If you include any Windows specific code (or a derivative thereof) from [m
[31m- *    the apps directory (application code) you must include an acknowledgement:[m
[31m- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"[m
[31m- * [m
[31m- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- * [m
[31m- * The licence and distribution terms for any publically available version or[m
[31m- * derivative of this code cannot be changed.  i.e. this code cannot simply be[m
[31m- * copied and put under another distribution licence[m
[31m- * [including the GNU Public Licence.][m
[31m- */[m
[31m-[m
[31m-#ifndef HEADER_MD5_H[m
[31m-#define HEADER_MD5_H[m
[31m-[m
[31m-#include <openssl/e_os2.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#ifdef  __cplusplus[m
[31m-extern "C" {[m
[31m-#endif[m
[31m-[m
[31m-#ifdef OPENSSL_NO_MD5[m
[31m-#error MD5 is disabled.[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![m
[31m- * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then ![m
[31m- * ! MD5_LONG_LOG2 has to be defined along.			   ![m
[31m- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![m
[31m- */[m
[31m-[m
[31m-#if defined(__LP32__)[m
[31m-#define MD5_LONG unsigned long[m
[31m-#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)[m
[31m-#define MD5_LONG unsigned long[m
[31m-#define MD5_LONG_LOG2 3[m
[31m-/*[m
[31m- * _CRAY note. I could declare short, but I have no idea what impact[m
[31m- * does it have on performance on none-T3E machines. I could declare[m
[31m- * int, but at least on C90 sizeof(int) can be chosen at compile time.[m
[31m- * So I've chosen long...[m
[31m- *					<appro@fy.chalmers.se>[m
[31m- */[m
[31m-#else[m
[31m-#define MD5_LONG unsigned int[m
[31m-#endif[m
[31m-[m
[31m-#define MD5_CBLOCK	64[m
[31m-#define MD5_LBLOCK	(MD5_CBLOCK/4)[m
[31m-#define MD5_DIGEST_LENGTH 16[m
[31m-[m
[31m-typedef struct MD5state_st[m
[31m-	{[m
[31m-	MD5_LONG A,B,C,D;[m
[31m-	MD5_LONG Nl,Nh;[m
[31m-	MD5_LONG data[MD5_LBLOCK];[m
[31m-	unsigned int num;[m
[31m-	} MD5_CTX;[m
[31m-[m
[31m-int MD5_Init(MD5_CTX *c);[m
[31m-int MD5_Update(MD5_CTX *c, const void *data, size_t len);[m
[31m-int MD5_Final(unsigned char *md, MD5_CTX *c);[m
[31m-unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);[m
[31m-void MD5_Transform(MD5_CTX *c, const unsigned char *b);[m
[31m-#ifdef  __cplusplus[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/murmurhash2.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/murmurhash2.c[m
[1mdeleted file mode 100644[m
[1mindex ac899b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/murmurhash2.c[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#ifndef MURMURHASH2_C[m
[31m-#define MURMURHASH2_C[m
[31m-[m
[31m-#define     MURMURHASH2_DIGEST_LENGTH   4[m
[31m-[m
[31m-/*[m
[31m- * -----------------------------------------------------------------------------[m
[31m- * MurmurHash2, by Austin Appleby[m
[31m-[m
[31m- * Note - This code makes a few assumptions about how your machine behaves -[m
[31m-[m
[31m- * 1. We can read a 4-byte value from any address without crashing[m
[31m- * 2. sizeof(int) == 4[m
[31m-[m
[31m- * And it has a few limitations -[m
[31m-[m
[31m- * 1. It will not work incrementally.[m
[31m- * 2. It will not produce the same results on little-endian and big-endian[m
[31m- *    machines.[m
[31m- */[m
[31m-[m
[31m-unsigned int MurmurHash2 ( const void * key, int len, unsigned int seed )[m
[31m-{[m
[31m-	/*[m
[31m-         * 'm' and 'r' are mixing constants generated offline.[m
[31m-	 * They're not really 'magic', they just happen to work well.[m
[31m-         */[m
[31m-[m
[31m-	const unsigned int m = 0x5bd1e995;[m
[31m-	const int r = 24;[m
[31m-[m
[31m-	/* Initialize the hash to a 'random' value */[m
[31m-[m
[31m-	unsigned int h = seed ^ len;[m
[31m-[m
[31m-	/* Mix 4 bytes at a time into the hash */[m
[31m-[m
[31m-	const unsigned char * data = (const unsigned char *)key;[m
[31m-[m
[31m-	while(len >= 4)[m
[31m-	{[m
[31m-		unsigned int k = *(unsigned int *)data;[m
[31m-[m
[31m-		k *= m;[m
[31m-		k ^= k >> r;[m
[31m-		k *= m;[m
[31m-[m
[31m-		h *= m;[m
[31m-		h ^= k;[m
[31m-[m
[31m-		data += 4;[m
[31m-		len -= 4;[m
[31m-	}[m
[31m-[m
[31m-	/* Handle the last few bytes of the input array */[m
[31m-[m
[31m-	switch(len)[m
[31m-	{[m
[31m-	case 3: h ^= data[2] << 16;[m
[31m-	case 2: h ^= data[1] << 8;[m
[31m-	case 1: h ^= data[0];[m
[31m-	        h *= m;[m
[31m-	};[m
[31m-[m
[31m-	/* Do a few final mixes of the hash to ensure the last few[m
[31m-	 * bytes are well-incorporated. */[m
[31m-[m
[31m-	h ^= h >> 13;[m
[31m-	h *= m;[m
[31m-	h ^= h >> 15;[m
[31m-[m
[31m-	return h;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/sha.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/sha.h[m
[1mdeleted file mode 100644[m
[1mindex 16cacf9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/hash/sha.h[m
[1m+++ /dev/null[m
[36m@@ -1,200 +0,0 @@[m
[31m-/* crypto/sha/sha.h */[m
[31m-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * This package is an SSL implementation written[m
[31m- * by Eric Young (eay@cryptsoft.com).[m
[31m- * The implementation was written so as to conform with Netscapes SSL.[m
[31m- * [m
[31m- * This library is free for commercial and non-commercial use as long as[m
[31m- * the following conditions are aheared to.  The following conditions[m
[31m- * apply to all code found in this distribution, be it the RC4, RSA,[m
[31m- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation[m
[31m- * included with this distribution is covered by the same copyright terms[m
[31m- * except that the holder is Tim Hudson (tjh@cryptsoft.com).[m
[31m- * [m
[31m- * Copyright remains Eric Young's, and as such any Copyright notices in[m
[31m- * the code are not to be removed.[m
[31m- * If this package is used in a product, Eric Young should be given attribution[m
[31m- * as the author of the parts of the library used.[m
[31m- * This can be in the form of a textual message at program startup or[m
[31m- * in documentation (online or textual) provided with the package.[m
[31m- * [m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- * 3. All advertising materials mentioning features or use of this software[m
[31m- *    must display the following acknowledgement:[m
[31m- *    "This product includes cryptographic software written by[m
[31m- *     Eric Young (eay@cryptsoft.com)"[m
[31m- *    The word 'cryptographic' can be left out if the rouines from the library[m
[31m- *    being used are not cryptographic related :-).[m
[31m- * 4. If you include any Windows specific code (or a derivative thereof) from [m
[31m- *    the apps directory (application code) you must include an acknowledgement:[m
[31m- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"[m
[31m- * [m
[31m- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- * [m
[31m- * The licence and distribution terms for any publically available version or[m
[31m- * derivative of this code cannot be changed.  i.e. this code cannot simply be[m
[31m- * copied and put under another distribution licence[m
[31m- * [including the GNU Public Licence.][m
[31m- */[m
[31m-[m
[31m-#ifndef HEADER_SHA_H[m
[31m-#define HEADER_SHA_H[m
[31m-[m
[31m-#include <openssl/e_os2.h>[m
[31m-#include <stddef.h>[m
[31m-[m
[31m-#ifdef  __cplusplus[m
[31m-extern "C" {[m
[31m-#endif[m
[31m-[m
[31m-#if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1))[m
[31m-#error SHA is disabled.[m
[31m-#endif[m
[31m-[m
[31m-#if defined(OPENSSL_FIPS)[m
[31m-#define FIPS_SHA_SIZE_T size_t[m
[31m-#endif[m
[31m-[m
[31m-/*[m
[31m- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![m
[31m- * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ![m
[31m- * ! SHA_LONG_LOG2 has to be defined along.                        ![m
[31m- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![m
[31m- */[m
[31m-[m
[31m-#if defined(__LP32__)[m
[31m-#define SHA_LONG unsigned long[m
[31m-#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)[m
[31m-#define SHA_LONG unsigned long[m
[31m-#define SHA_LONG_LOG2 3[m
[31m-#else[m
[31m-#define SHA_LONG unsigned int[m
[31m-#endif[m
[31m-[m
[31m-#define SHA_LBLOCK	16[m
[31m-#define SHA_CBLOCK	(SHA_LBLOCK*4)	/* SHA treats input data as a[m
[31m-					 * contiguous array of 32 bit[m
[31m-					 * wide big-endian values. */[m
[31m-#define SHA_LAST_BLOCK  (SHA_CBLOCK-8)[m
[31m-#define SHA_DIGEST_LENGTH 20[m
[31m-[m
[31m-typedef struct SHAstate_st[m
[31m-	{[m
[31m-	SHA_LONG h0,h1,h2,h3,h4;[m
[31m-	SHA_LONG Nl,Nh;[m
[31m-	SHA_LONG data[SHA_LBLOCK];[m
[31m-	unsigned int num;[m
[31m-	} SHA_CTX;[m
[31m-[m
[31m-#ifndef OPENSSL_NO_SHA0[m
[31m-int SHA_Init(SHA_CTX *c);[m
[31m-int SHA_Update(SHA_CTX *c, const void *data, size_t len);[m
[31m-int SHA_Final(unsigned char *md, SHA_CTX *c);[m
[31m-unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md);[m
[31m-void SHA_Transform(SHA_CTX *c, const unsigned char *data);[m
[31m-#endif[m
[31m-#ifndef OPENSSL_NO_SHA1[m
[31m-int SHA1_Init(SHA_CTX *c);[m
[31m-int SHA1_Update(SHA_CTX *c, const void *data, size_t len);[m
[31m-int SHA1_Final(unsigned char *md, SHA_CTX *c);[m
[31m-unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md);[m
[31m-void SHA1_Transform(SHA_CTX *c, const unsigned char *data);[m
[31m-#endif[m
[31m-[m
[31m-#define SHA256_CBLOCK	(SHA_LBLOCK*4)	/* SHA-256 treats input data as a[m
[31m-					 * contiguous array of 32 bit[m
[31m-					 * wide big-endian values. */[m
[31m-#define SHA224_DIGEST_LENGTH	28[m
[31m-#define SHA256_DIGEST_LENGTH	32[m
[31m-[m
[31m-typedef struct SHA256state_st[m
[31m-	{[m
[31m-	SHA_LONG h[8];[m
[31m-	SHA_LONG Nl,Nh;[m
[31m-	SHA_LONG data[SHA_LBLOCK];[m
[31m-	unsigned int num,md_len;[m
[31m-	} SHA256_CTX;[m
[31m-[m
[31m-#ifndef OPENSSL_NO_SHA256[m
[31m-int SHA224_Init(SHA256_CTX *c);[m
[31m-int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);[m
[31m-int SHA224_Final(unsigned char *md, SHA256_CTX *c);[m
[31m-unsigned char *SHA224(const unsigned char *d, size_t n,unsigned char *md);[m
[31m-int SHA256_Init(SHA256_CTX *c);[m
[31m-int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);[m
[31m-int SHA256_Final(unsigned char *md, SHA256_CTX *c);[m
[31m-unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md);[m
[31m-void SHA256_Transform(SHA256_CTX *c, const unsigned char *data);[m
[31m-#endif[m
[31m-[m
[31m-#define SHA384_DIGEST_LENGTH	48[m
[31m-#define SHA512_DIGEST_LENGTH	64[m
[31m-[m
[31m-#ifndef OPENSSL_NO_SHA512[m
[31m-/*[m
[31m- * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64[m
[31m- * being exactly 64-bit wide. See Implementation Notes in sha512.c[m
[31m- * for further details.[m
[31m- */[m
[31m-#define SHA512_CBLOCK	(SHA_LBLOCK*8)	/* SHA-512 treats input data as a[m
[31m-					 * contiguous array of 64 bit[m
[31m-					 * wide big-endian values. */[m
[31m-#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)[m
[31m-#define SHA_LONG64 unsigned __int64[m
[31m-#define U64(C)     C##UI64[m
[31m-#elif defined(__arch64__)[m
[31m-#define SHA_LONG64 unsigned long[m
[31m-#define U64(C)     C##UL[m
[31m-#else[m
[31m-#define SHA_LONG64 unsigned long long[m
[31m-#define U64(C)     C##ULL[m
[31m-#endif[m
[31m-[m
[31m-typedef struct SHA512state_st[m
[31m-	{[m
[31m-	SHA_LONG64 h[8];[m
[31m-	SHA_LONG64 Nl,Nh;[m
[31m-	union {[m
[31m-		SHA_LONG64	d[SHA_LBLOCK];[m
[31m-		unsigned char	p[SHA512_CBLOCK];[m
[31m-	} u;[m
[31m-	unsigned int num,md_len;[m
[31m-	} SHA512_CTX;[m
[31m-#endif[m
[31m-[m
[31m-#ifndef OPENSSL_NO_SHA512[m
[31m-int SHA384_Init(SHA512_CTX *c);[m
[31m-int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);[m
[31m-int SHA384_Final(unsigned char *md, SHA512_CTX *c);[m
[31m-unsigned char *SHA384(const unsigned char *d, size_t n,unsigned char *md);[m
[31m-int SHA512_Init(SHA512_CTX *c);[m
[31m-int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);[m
[31m-int SHA512_Final(unsigned char *md, SHA512_CTX *c);[m
[31m-unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md);[m
[31m-void SHA512_Transform(SHA512_CTX *c, const unsigned char *data);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef  __cplusplus[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk.c[m
[1mdeleted file mode 100644[m
[1mindex d57040a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk.c[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- */[m
[31m-[m
[31m-#include    <ndk.h>[m
[31m-[m
[31m-#include    <ndk_config.c>[m
[31m-[m
[31m-[m
[31m-#if (NDK_HTTP_PRE_CONFIG)[m
[31m-static  ngx_int_t   ndk_http_preconfiguration    (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_POST_CONFIG)[m
[31m-static  ngx_int_t   ndk_http_postconfiguration   (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_CREATE_MAIN_CONF)[m
[31m-static void *       ndk_http_create_main_conf    (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_MAIN_CONF)[m
[31m-static char *       ndk_http_init_main_conf      (ngx_conf_t *cf, void *conf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_CREATE_SRV_CONF)[m
[31m-static void *       ndk_http_create_srv_conf     (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_MERGE_SRV_CONF)[m
[31m-static char *       ndk_http_merge_srv_conf      (ngx_conf_t *cf, void *parent, void *child);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_CREATE_LOC_CONF)[m
[31m-static void *       ndk_http_create_loc_conf     (ngx_conf_t *cf);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_MERGE_LOC_CONF)[m
[31m-static char *       ndk_http_merge_loc_conf      (ngx_conf_t *cf, void *parent, void *child);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (NDK_HTTP_INIT_MASTER)[m
[31m-static ngx_int_t    ndk_http_init_master         (ngx_log_t *log);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_MODULE)[m
[31m-static ngx_int_t    ndk_http_init_module         (ngx_cycle_t *cycle);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_PROCESS)[m
[31m-static ngx_int_t    ndk_http_init_process        (ngx_cycle_t *cycle);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_EXIT_PROCESS)[m
[31m-static void         ndk_http_exit_process        (ngx_cycle_t *cycle);[m
[31m-#endif[m
[31m-#if (NDK_HTTP_EXIT_MASTER)[m
[31m-static void         ndk_http_exit_master         (ngx_cycle_t *cycle);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t   ndk_http_module_ctx = {[m
[31m-[m
[31m-#if (NDK_HTTP_PRE_CONFIG)[m
[31m-    ndk_http_preconfiguration,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_POST_CONFIG)[m
[31m-    ndk_http_postconfiguration,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_MAIN_CONF)[m
[31m-    ndk_http_create_main_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_MAIN_CONF)[m
[31m-    ndk_http_merge_main_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_SVR_CONF)[m
[31m-    ndk_http_create_srv_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_MERGE_SVR_CONF)[m
[31m-    ndk_http_merge_srv_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_LOC_CONF)[m
[31m-    ndk_http_create_loc_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_MERGE_LOC_CONF)[m
[31m-    ndk_http_merge_loc_conf,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-};[m
[31m-[m
[31m-ngx_module_t          ndk_http_module = {[m
[31m-[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ndk_http_module_ctx,          /* module context */[m
[31m-    ndk_http_commands,             /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-[m
[31m-#if (NDK_HTTP_INIT_MASTER)[m
[31m-    ndk_http_init_master,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_HTTP_INIT_MODULE)[m
[31m-    ndk_http_init_module,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_INIT_PROCESS)[m
[31m-    ndk_http_init_process,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-[m
[31m-    NULL,                                   /* init thread */[m
[31m-    NULL,                                   /* exit thread */[m
[31m-[m
[31m-#if (NDK_HTTP_EXIT_PROCESS)[m
[31m-    ndk_http_exit_process,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-#if (NDK_HTTP_EXIT_MASTER)[m
[31m-    ndk_http_exit_master,[m
[31m-#else[m
[31m-    NULL,[m
[31m-#endif[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_MAIN_CONF)[m
[31m-static void *[m
[31m-ndk_http_create_main_conf (ngx_conf_t *cf)[m
[31m-{[m
[31m-    ndk_http_main_conf_t    *mcf;[m
[31m-[m
[31m-    ndk_pcallocp_rce (mcf, cf->pool);[m
[31m-[m
[31m-    return  mcf;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk.h[m
[1mdeleted file mode 100644[m
[1mindex febcc32..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk.h[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m- [m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#ifndef NDK_H[m
[31m-#define NDK_H[m
[31m-[m
[31m-[m
[31m-#include    <ngx_config.h>[m
[31m-#include    <ngx_core.h>[m
[31m-#include    <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#define     ndk_version     2015[m
[31m-#define     NDK_VERSION     "0.2.15"[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-#ifndef     NDK_DEBUG[m
[31m-#define     NDK_DEBUG 1[m
[31m-#endif[m
[31m-#else[m
[31m-#ifndef     NDK_DEBUG[m
[31m-#define     NDK_DEBUG 0[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if !(NDK)[m
[31m-#error At least one module requires the Nginx Development Kit to be compiled with \[m
[31m-the source (add --with-module=/path/to/devel/kit/src to configure command)[m
[31m-#endif[m
[31m-[m
[31m-#include    <ndk_config.h>[m
[31m-[m
[31m-[m
[31m-#if (NDK_HTTP_CREATE_MAIN_CONF)[m
[31m-[m
[31m-#define     ndk_http_conf_get_main_conf(cf)   ngx_http_conf_get_module_main_conf (cf, ndk_http_module)[m
[31m-#define     ndk_http_get_main_conf(r)         ngx_http_get_module_main_conf (r, ndk_http_module)[m
[31m-[m
[31m-typedef struct {[m
[31m-#if (NDK_UPSTREAM_LIST)[m
[31m-    ngx_array_t         *upstreams;[m
[31m-#endif[m
[31m-} ndk_http_main_conf_t;[m
[31m-[m
[31m-#endif /* NDK_HTTP_CREATE_MAIN_CONF */[m
[31m-[m
[31m-#include    <ndk_includes.h>[m
[31m-[m
[31m-[m
[31m-extern  ngx_module_t    ndk_http_module;[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_buf.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_buf.c[m
[1mdeleted file mode 100644[m
[1mindex c491f72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_buf.c[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_copy_chain_to_str (ngx_pool_t *pool, ngx_chain_t *in, ngx_str_t *str)[m
[31m-{[m
[31m-    ngx_chain_t     *cl;[m
[31m-    size_t           len;[m
[31m-    u_char          *p;[m
[31m-    ngx_buf_t       *b;[m
[31m-    [m
[31m-    len = 0;[m
[31m-    for (cl = in; cl; cl = cl->next)[m
[31m-        len += ngx_buf_size (cl->buf);[m
[31m-    [m
[31m-    ndk_palloc_re (p, pool, len + 1);[m
[31m-    [m
[31m-    str->data = p;[m
[31m-    str->len = len;[m
[31m-    [m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        [m
[31m-        b = cl->buf;[m
[31m-        [m
[31m-        if (ngx_buf_in_memory (b)) {[m
[31m-            p = ngx_cpymem (p, b->pos, b->last - b->pos);[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-    *p = '\0';[m
[31m-    [m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_copy_chain_to_charp (ngx_pool_t *pool, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_str_t   str;[m
[31m-    [m
[31m-    if (ndk_copy_chain_to_str (pool, in, &str) != NGX_OK)[m
[31m-        return  NULL;[m
[31m-    [m
[31m-    return  (char *) str.data;[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_buf.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_buf.h[m
[1mdeleted file mode 100644[m
[1mindex e6334ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_buf.h[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ndk_copy_chain_to_str   (ngx_pool_t *pool, ngx_chain_t *in, ngx_str_t *str);[m
[31m-char *      ndk_copy_chain_to_charp (ngx_pool_t *pool, ngx_chain_t *in);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_path.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_path.c[m
[1mdeleted file mode 100644[m
[1mindex a66a808..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_path.c[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-[m
[31m-[m
[31m-ndk_http_complex_path_value_t     ndk_empty_http_complex_path_value = {{0,NULL},0};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_http_complex_path_value_compile (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value, ngx_uint_t prefix)[m
[31m-{[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    ngx_memzero (&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = value;[m
[31m-    ccv.complex_value = cv;[m
[31m-[m
[31m-    switch (prefix) {[m
[31m-[m
[31m-    case    1 :[m
[31m-        ccv.root_prefix = 1;[m
[31m-        break;[m
[31m-[m
[31m-    case    2 :[m
[31m-        ccv.conf_prefix = 1;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    ndk_path_to_dir_safe (value, 1, 0);[m
[31m-[m
[31m-    if (!value->len)[m
[31m-        return  NGX_OK;[m
[31m-[m
[31m-    return  ngx_http_compile_complex_value (&ccv);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_http_complex_path_create_compile (ngx_conf_t *cf, ngx_str_t *path, ngx_uint_t prefix)[m
[31m-{[m
[31m-    ndk_http_complex_path_elt_t     *cpe;[m
[31m-    ngx_array_t                     *a;[m
[31m-    ngx_int_t                        n;[m
[31m-    u_char                          *m, *s, *e;[m
[31m-    ngx_str_t                        value;[m
[31m-[m
[31m-    n = ndk_strcntc (path, ':') + 1;[m
[31m-[m
[31m-    a = ngx_array_create (cf->pool, n, sizeof (ndk_http_complex_path_elt_t));[m
[31m-    if (a == NULL) {[m
[31m-        return  NULL;[m
[31m-    }[m
[31m-[m
[31m-    s = path->data;[m
[31m-    e = s + path->len;[m
[31m-[m
[31m-[m
[31m-    while (s < e) {[m
[31m-[m
[31m-        m = s;[m
[31m-[m
[31m-        while (m < e && *m != ':') m++;[m
[31m-[m
[31m-        if (m == s) {[m
[31m-            s = m+1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cpe = ngx_array_push (a);[m
[31m-        if (cpe == NULL) {[m
[31m-            return  NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (*s == '#') {[m
[31m-            s++;[m
[31m-            cpe->dynamic = 1;[m
[31m-        } else {[m
[31m-            cpe->dynamic = 0;[m
[31m-        }[m
[31m-[m
[31m-        value.data = s;[m
[31m-        value.len = m - s;[m
[31m-[m
[31m-        if (ndk_http_complex_path_value_compile (cf, &cpe->val, &value, prefix) == NGX_ERROR)[m
[31m-            return  NULL;[m
[31m-[m
[31m-        s = m+1;[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_http_complex_path_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *path;[m
[31m-    ngx_array_t                 *a;[m
[31m-    ngx_conf_post_t             *post;[m
[31m-    ndk_http_complex_path_t     *cp;[m
[31m-[m
[31m-    cp = (ndk_http_complex_path_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (cp->a != NGX_CONF_UNSET_PTR) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    path = cf->args->elts;[m
[31m-    path++;[m
[31m-[m
[31m-    cp->a = ndk_http_complex_path_create_compile (cf, path, cp->prefix);[m
[31m-    if (cp->a == NULL)[m
[31m-        /* TODO : log */[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_path.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_path.h[m
[1mdeleted file mode 100644[m
[1mindex eb93d1f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_path.h[m
[1m+++ /dev/null[m
[36m@@ -1,30 +0,0 @@[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t                    *a;[m
[31m-    ngx_uint_t                      prefix;[m
[31m-} ndk_http_complex_path_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_complex_value_t        val;[m
[31m-    ngx_flag_t                      dynamic;[m
[31m-} ndk_http_complex_path_elt_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                       val;[m
[31m-    ngx_flag_t                      dynamic;[m
[31m-} ndk_http_complex_path_value_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ndk_http_complex_path_value_t  *elts;[m
[31m-    ngx_uint_t                      nelts;[m
[31m-} ndk_http_complex_path_values_t;[m
[31m-[m
[31m-[m
[31m-extern  ndk_http_complex_path_value_t     ndk_empty_http_complex_path_value;[m
[31m-[m
[31m-[m
[31m-ngx_array_t *   ndk_http_complex_path_create_compile     (ngx_conf_t *cf, ngx_str_t *path, ngx_uint_t prefix);[m
[31m-ngx_int_t       ndk_http_complex_path_value_compile      (ngx_conf_t *cf, ngx_http_complex_value_t *cv, [m
[31m-                                                                    ngx_str_t *value, ngx_uint_t prefix);[m
[31m-char *          ndk_conf_set_http_complex_path_slot      (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_value.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_value.c[m
[1mdeleted file mode 100644[m
[1mindex 97681ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_value.c[m
[1m+++ /dev/null[m
[36m@@ -1,192 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_http_complex_value_compile (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-[m
[31m-    ngx_memzero (&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-    ccv.cf = cf;[m
[31m-    ccv.value = value;[m
[31m-    ccv.complex_value = cv;[m
[31m-[m
[31m-    return  ngx_http_compile_complex_value (&ccv);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_http_complex_value_array_create (ngx_conf_t *cf, char **s, ngx_int_t n)[m
[31m-{[m
[31m-    ngx_int_t                    i;[m
[31m-    ngx_http_complex_value_t    *cv;[m
[31m-    ngx_array_t                 *a;[m
[31m-    ngx_str_t                    value;[m
[31m-[m
[31m-    a = ngx_array_create (cf->pool, n, sizeof (ngx_http_complex_value_t));[m
[31m-    if (a == NULL)[m
[31m-        return  NULL;[m
[31m-[m
[31m-[m
[31m-    for (i=0; i<n; i++, s++) {[m
[31m-[m
[31m-        cv = ngx_array_push (a);[m
[31m-[m
[31m-        value.data = (u_char *) *s;[m
[31m-        value.len = strlen (*s);[m
[31m-[m
[31m-        if (ndk_http_complex_value_compile (cf, cv, &value))[m
[31m-            return  NULL;[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_http_complex_value_array_compile (ngx_conf_t *cf, ngx_array_t *a)[m
[31m-{[m
[31m-    ngx_uint_t                  i;[m
[31m-    ngx_http_complex_value_t   *cv;[m
[31m-[m
[31m-    if (a == NULL || a == NGX_CONF_UNSET_PTR) {[m
[31m-        return  NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cv = a->elts;[m
[31m-[m
[31m-    for (i=0; i<a->nelts; i++, cv++) {[m
[31m-[m
[31m-        if (ndk_http_complex_value_compile (cf, cv, &cv->value))[m
[31m-            return  NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_http_complex_value_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_http_complex_value_t    *cv;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_conf_post_t             *post;[m
[31m-[m
[31m-    cv = (ngx_http_complex_value_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (cv->value.data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ndk_http_complex_value_compile (cf, cv, value + 1))[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, cv);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_http_complex_value_array_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_complex_value_t    *cv;[m
[31m-    ngx_array_t                **a;[m
[31m-    ngx_conf_post_t             *post;[m
[31m-    ngx_uint_t                   i, alloc;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL || *a == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        alloc = cf->args->nelts > 4 ? cf->args->nelts : 4;[m
[31m-[m
[31m-        *a = ngx_array_create (cf->pool, alloc, sizeof (ngx_http_complex_value_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    for (i=1; i<cf->args->nelts; i++) {[m
[31m-[m
[31m-        cv = ngx_array_push (*a);[m
[31m-        if (cv == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ndk_http_complex_value_compile (cf, cv, &value[i]) == NGX_ERROR)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_http_complex_keyval_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char *p = conf;[m
[31m-[m
[31m-    ngx_str_t                   *value;[m
[31m-    ndk_http_complex_keyval_t   *ckv;[m
[31m-    ngx_array_t                **a;[m
[31m-    ngx_conf_post_t             *post;[m
[31m-    ngx_int_t                    alloc;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NULL || *a == NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        alloc = cf->args->nelts > 4 ? cf->args->nelts : 4;[m
[31m-[m
[31m-        *a = ngx_array_create (cf->pool, alloc, sizeof (ndk_http_complex_keyval_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ckv = ngx_array_push (*a);[m
[31m-    if (ckv == NULL) {[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ckv->key = value[1];[m
[31m-[m
[31m-    if (ndk_http_complex_value_compile (cf, &ckv->value, &value[2]) == NGX_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-/* TODO : complex keyval1 */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_value.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_value.h[m
[1mdeleted file mode 100644[m
[1mindex 4178d62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_complex_value.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   key;[m
[31m-    ngx_http_complex_value_t    value;[m
[31m-} ndk_http_complex_keyval_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* create/compile functions */[m
[31m-[m
[31m-ngx_int_t      ndk_http_complex_value_compile        (ngx_conf_t *cf, ngx_http_complex_value_t *cv, ngx_str_t *value);[m
[31m-ngx_array_t *  ndk_http_complex_value_array_create   (ngx_conf_t *cf, char **s, ngx_int_t n);[m
[31m-ngx_int_t      ndk_http_complex_value_array_compile  (ngx_conf_t *cf, ngx_array_t *a);[m
[31m-[m
[31m-[m
[31m-/* conf set slot functions */[m
[31m-[m
[31m-char *  ndk_conf_set_http_complex_keyval_slot        (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_http_complex_value_slot         (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_http_complex_value_array_slot   (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_conf_file.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_conf_file.c[m
[1mdeleted file mode 100644[m
[1mindex 980641c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_conf_file.c[m
[1m+++ /dev/null[m
[36m@@ -1,396 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* NOTE : you will find other conf_set functions in the following files :[m
[31m- *[m
[31m- * complex_value.c[m
[31m- * encoding.c[m
[31m- * path.c[m
[31m- *[m
[31m- */[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_true_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_flag_t       *fp;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    fp = (ngx_flag_t*) (p + cmd->offset);[m
[31m-[m
[31m-    if (*fp != NGX_CONF_UNSET) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *fp = 1;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, fp);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_false_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_flag_t       *fp;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    fp = (ngx_flag_t*) (p + cmd->offset);[m
[31m-[m
[31m-    if (*fp != NGX_CONF_UNSET) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *fp = 0;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, fp);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_ptr_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    void  **ptr;[m
[31m-[m
[31m-    ptr = (void**) (p + cmd->offset);[m
[31m-[m
[31m-    if (*ptr != NGX_CONF_UNSET_PTR) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *ptr = cmd->post;[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_null_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    void            **pp;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    pp = (void **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*pp != NGX_CONF_UNSET_PTR) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    *pp = NULL;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, pp);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_num64_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    int64_t          *np;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-[m
[31m-    np = (int64_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*np != NGX_CONF_UNSET) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    *np = ndk_atoi64 (value[1].data, value[1].len);[m
[31m-    if (*np == NGX_ERROR) {[m
[31m-        return "invalid number";[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, np);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_str_array_multi_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t         *value, *s;[m
[31m-    ngx_array_t      **a;[m
[31m-    ngx_conf_post_t   *post;[m
[31m-    ngx_uint_t         i;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a == NGX_CONF_UNSET_PTR) {[m
[31m-        *a = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = NULL;[m
[31m-[m
[31m-    for (i=cf->args->nelts-1; i; i--) {[m
[31m-[m
[31m-        s = ngx_array_push(*a);[m
[31m-        if (s == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = cf->args->elts;[m
[31m-[m
[31m-        *s = value[i];[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler(cf, post, s);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_keyval1_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_keyval_t        *kv;[m
[31m-    ngx_conf_post_t     *post;[m
[31m-[m
[31m-    kv = (ngx_keyval_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (kv->key.data)[m
[31m-        return  "is duplicate";[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    kv->key = value[1];[m
[31m-    kv->value = value[2];[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, kv);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_num_flag_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_int_t        *np;[m
[31m-    ngx_str_t        *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    np = (ngx_int_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*np != NGX_CONF_UNSET) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcasecmp (value[1].data, (u_char *) "on") == 0) {[m
[31m-        *np = NDK_CONF_SET_TRUE;[m
[31m-[m
[31m-    } else if (ngx_strcasecmp (value[1].data, (u_char *) "off") == 0) {[m
[31m-        *np = NDK_CONF_SET_FALSE;[m
[31m-[m
[31m-    } else {[m
[31m-        *np = ngx_atoi (value[1].data, value[1].len);[m
[31m-        if (*np == NGX_ERROR) {[m
[31m-            return  "invalid number and not 'on'/'off'";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, np);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_sec_flag_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    time_t              *tp;[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_conf_post_t     *post;[m
[31m-[m
[31m-    tp = (time_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (*tp != NGX_CONF_UNSET) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (ngx_strcasecmp (value[1].data, (u_char *) "on") == 0) {[m
[31m-        *tp = NDK_CONF_SET_TRUE;[m
[31m-[m
[31m-    } else if (ngx_strcasecmp (value[1].data, (u_char *) "off") == 0) {[m
[31m-        *tp = NDK_CONF_SET_FALSE;[m
[31m-[m
[31m-    } else {[m
[31m-        *tp = ngx_parse_time (&value[1], 1);[m
[31m-        if (*tp == NGX_ERROR) {[m
[31m-            return  "has an invalid time and not 'on'/'off'";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, tp);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_http_conf_ctx_t *[m
[31m-ndk_conf_create_http_location (ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_conf_ctx_t          *ctx, *pctx;[m
[31m-    void                         *mconf;[m
[31m-    ngx_http_core_loc_conf_t     *clcf, *pclcf;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_http_module_t            *module;[m
[31m-[m
[31m-    ndk_pcallocp_rce (ctx, cf->pool);[m
[31m-[m
[31m-    pctx = cf->ctx;[m
[31m-    ctx->main_conf = pctx->main_conf;[m
[31m-    ctx->srv_conf = pctx->srv_conf;[m
[31m-[m
[31m-    ndk_pcalloc_rce (ctx->loc_conf, cf->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-[m
[31m-[m
[31m-    for (i = 0; ngx_modules[i]; i++) {[m
[31m-        if (ngx_modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = ngx_modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-[m
[31m-            mconf = module->create_loc_conf(cf);[m
[31m-            if (mconf == NULL) {[m
[31m-                 return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ctx->loc_conf[ngx_modules[i]->ctx_index] = mconf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    clcf->loc_conf = ctx->loc_conf;[m
[31m-    clcf->name = pclcf->name;[m
[31m-    clcf->noname = 1;[m
[31m-[m
[31m-    if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return  ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_conf_ctx_t *[m
[31m-ngx_conf_create_http_named_location (ngx_conf_t *cf, ngx_str_t *name)[m
[31m-{[m
[31m-    ngx_http_conf_ctx_t          *ctx;[m
[31m-    ngx_http_core_loc_conf_t     *clcf;[m
[31m-[m
[31m-    ctx = ndk_conf_create_http_location (cf);[m
[31m-    if (ctx == NGX_CONF_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-[m
[31m-    /* in case the developer forgets to add '@' at the beginning of the named location */[m
[31m-[m
[31m-    if (name->data[0] != '@' && ndk_catstrf (cf->pool, name, "sS", "@", name) == NULL)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    clcf->name = *name;     /* TODO : copy? */[m
[31m-    clcf->noname = 0;[m
[31m-    clcf->named = 1;[m
[31m-[m
[31m-    return  ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_replace_command (ngx_command_t *new_cmd, ngx_uint_t module_type)[m
[31m-{[m
[31m-    ngx_uint_t       i;[m
[31m-    ngx_command_t   *cmd;[m
[31m-[m
[31m-    for (i = 0; ngx_modules[i]; i++) {[m
[31m-[m
[31m-        if (ngx_modules[i]->type != module_type)[m
[31m-            continue;[m
[31m-[m
[31m-        cmd = ngx_modules[i]->commands;[m
[31m-        if (cmd == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; cmd->name.len; cmd++) {[m
[31m-[m
[31m-            if (ndk_cmpstr (&new_cmd->name, &cmd->name) == 0) {[m
[31m-[m
[31m-                ndk_memcpyp (cmd, new_cmd);[m
[31m-                return  NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_DECLINED;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_conf_file.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_conf_file.h[m
[1mdeleted file mode 100644[m
[1mindex 6956b17..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_conf_file.h[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* conf set functions */[m
[31m-[m
[31m-char *  ndk_conf_set_true_slot              (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_false_slot             (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_full_path_slot         (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_ptr_slot               (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_null_slot              (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_str_array_multi_slot   (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_keyval1_slot           (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_num_flag               (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_num64_slot             (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_sec_flag_slot          (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-ngx_http_conf_ctx_t *   ndk_conf_create_http_location           (ngx_conf_t *cf);[m
[31m-ngx_http_conf_ctx_t *   ngx_conf_create_http_named_location     (ngx_conf_t *cf, ngx_str_t *name);[m
[31m-[m
[31m-ngx_int_t               ndk_replace_command     (ngx_command_t *new_cmd, ngx_uint_t module_type);[m
[31m-[m
[31m-[m
[31m-/* values for conf_set_xxx_flag */[m
[31m-[m
[31m-#define     NDK_CONF_SET_TRUE       -2[m
[31m-#define     NDK_CONF_SET_FALSE      -3[m
[31m-[m
[31m-[m
[31m-/* wrappers for utility macros */[m
[31m-[m
[31m-#define     ndk_conf_set_bitmask_slot       ngx_conf_set_bitmask_slot[m
[31m-#define     ndk_conf_set_bufs_slot          ngx_conf_set_bufs_slot[m
[31m-#define     ndk_conf_set_enum_slot          ngx_conf_set_enum_slot[m
[31m-#define     ndk_conf_set_flag_slot          ngx_conf_set_flag_slot[m
[31m-#define     ndk_conf_set_keyval_slot        ngx_conf_set_keyval_slot[m
[31m-#define     ndk_conf_set_msec_slot          ngx_conf_set_msec_slot[m
[31m-#define     ndk_conf_set_num_slot           ngx_conf_set_num_slot[m
[31m-#define     ndk_conf_set_off_slot           ngx_conf_set_off_slot[m
[31m-#define     ndk_conf_set_sec_slot           ngx_conf_set_sec_slot[m
[31m-#define     ndk_conf_set_size_slot          ngx_conf_set_size_slot[m
[31m-#define     ndk_conf_set_str_slot           ngx_conf_set_str_slot[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_debug.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_debug.c[m
[1mdeleted file mode 100644[m
[1mindex e0251cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_debug.c[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-void[m
[31m-ndk_debug_helper (const char *func, const char *fmt, ...)[m
[31m-{[m
[31m-    size_t   len, flen, tlen;[m
[31m-    char    *s, *p, *e;[m
[31m-[m
[31m-    /* check to see if the format is empty */[m
[31m-[m
[31m-    flen = strlen (fmt);[m
[31m-[m
[31m-    /* build func name */[m
[31m-[m
[31m-    len = strlen (func);[m
[31m-[m
[31m-    if (flen == 0)[m
[31m-        tlen = len + 1;[m
[31m-    else[m
[31m-[m
[31m-    char    func_name [len + flen + 1];[m
[31m-[m
[31m-    s = func_name;[m
[31m-    e = s + len;[m
[31m-[m
[31m-    memcpy (s, func, len);[m
[31m-[m
[31m-    /* remove initial ngx_ */[m
[31m-[m
[31m-    if (strncmp (s, "ngx_", 4) == 0)[m
[31m-        s += 4;[m
[31m-[m
[31m-    /* replace '_' with ' ' */[m
[31m-[m
[31m-    for (p=s; p<e; p++) {[m
[31m-        if (*p == '_')[m
[31m-            *p = ' ';[m
[31m-    }[m
[31m-[m
[31m-    vfprintf (stderr, const char *format, va_list ap)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ndk_debug_request_helper (const char *func, ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-    /* TODO : improve the format */[m
[31m-[m
[31m-    fprintf (stderr, "%s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-            func,[m
[31m-            (int) r->method_name.len, r->method_name.data,[m
[31m-            (int) r->uri.len, r->uri.data,[m
[31m-            (int) r->args.len, r->args.data,[m
[31m-            0/*(int) r->main->count*/, r->main,[m
[31m-            r, r->connection->data, r->parent);[m
[31m-[m
[31m-    if (r->posted_requests) {[m
[31m-        fprintf(stderr, " posted:");[m
[31m-[m
[31m-        for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-            fprintf (stderr, "%p,", pr);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    fprintf (stderr, "\n");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_debug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_debug.h[m
[1mdeleted file mode 100644[m
[1mindex 883a6eb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_debug.h[m
[1m+++ /dev/null[m
[36m@@ -1,171 +0,0 @@[m
[31m-#ifndef NDK_DEBUG_H[m
[31m-#define NDK_DEBUG_H[m
[31m-[m
[31m-[m
[31m-/* TODO : use the Nginx printf function */[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-/* TODO[m
[31m-- andk_debug variety of debugging formats[m
[31m-- global include file for all debugging - can pass declaration to cflags for the option[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-#if (NDK_DEBUG)[m
[31m-[m
[31m-    #if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-        #define ndk_debug(...)  ndk_debug_helper (__func__,__VA_ARGS__)[m
[31m-[m
[31m-        #define ndk_debug_helper(func,...) \[m
[31m-            fprintf(stderr, "%-60s", func); \[m
[31m-            fprintf(stderr, (const char *)__VA_ARGS__); \[m
[31m-            fprintf(stderr,"\n");[m
[31m-            /*fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)*/[m
[31m-[m
[31m-    #else[m
[31m-[m
[31m-        /* NOTE : these includes might not be necessary since they're probably included with the core */[m
[31m-[m
[31m-        #include <stdarg.h>[m
[31m-        #include <stdio.h>[m
[31m-        #include <stdarg.h>[m
[31m-[m
[31m-        static void ndk_debug (const char * fmt, ...) {[m
[31m-        }[m
[31m-[m
[31m-    #endif[m
[31m-[m
[31m-    #if NDK_DEBUG > 1[m
[31m-[m
[31m-        #define ndk_debug_request()  ndk_debug_request_helper(r, __func__)[m
[31m-[m
[31m-        static ngx_inline void[m
[31m-        ndk_debug_request_helper (ngx_http_request_t *r, const char *func)[m
[31m-        {[m
[31m-            ngx_http_posted_request_t       *pr;[m
[31m-[m
[31m-            /* TODO : improve the format */[m
[31m-[m
[31m-            fprintf (stderr, "%s %.*s %.*s?%.*s c:%d m:%p r:%p ar:%p pr:%p",[m
[31m-                    func,[m
[31m-                    (int) r->method_name.len, r->method_name.data,[m
[31m-                    (int) r->uri.len, r->uri.data,[m
[31m-                    (int) r->args.len, r->args.data,[m
[31m-                    0/*(int) r->main->count*/, r->main,[m
[31m-                    r, r->connection->data, r->parent);[m
[31m-[m
[31m-            if (r->posted_requests) {[m
[31m-                fprintf(stderr, " posted:");[m
[31m-[m
[31m-                for (pr = r->posted_requests; pr; pr = pr->next) {[m
[31m-                    fprintf (stderr, "%p,", pr);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            fprintf (stderr, "\n");[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-    #else[m
[31m-[m
[31m-        #define ndk_debug_request()[m
[31m-[m
[31m-    #endif[m
[31m-[m
[31m-[m
[31m-    static ngx_inline void[m
[31m-    ndk_debug_print_posted_requests (ngx_http_request_t *r)[m
[31m-    {[m
[31m-        ngx_http_posted_request_t   *pr;[m
[31m-[m
[31m-        ndk_request_log_debug_http (r, "ndk debug - http posted requests");[m
[31m-[m
[31m-        for (pr = r->main->posted_requests; pr; pr = pr->next) {[m
[31m-[m
[31m-            if (!pr->request)[m
[31m-                continue;[m
[31m-[m
[31m-            ndk_request_log_debug_http (r, "ndk debug - http posted request:%V", &pr->request->uri);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    #define ndk_debug_http_conf_location(cf)    ndk_debug_http_conf_location_helper (cf, __func__)[m
[31m-[m
[31m-    static ngx_inline void[m
[31m-    ndk_debug_http_conf_location_helper (ngx_conf_t *cf, const char *func)[m
[31m-    {[m
[31m-        ngx_http_core_loc_conf_t        *lcf;[m
[31m-[m
[31m-        lcf = ngx_http_conf_get_module_loc_conf (cf, ngx_http_core_module);[m
[31m-[m
[31m-        ndk_debug_helper (func, "[%s]", lcf->name.data);[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-    static void[m
[31m-    ndk_debug_log_chain (ngx_log_t *log, ngx_chain_t *cl)[m
[31m-    {[m
[31m-[m
[31m-[m
[31m-    }[m
[31m-    */[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    #if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-        #define     ndk_debug(...)[m
[31m-        #define     ndk_debug_request()[m
[31m-[m
[31m-    #else[m
[31m-[m
[31m-        #include <stdarg.h>[m
[31m-[m
[31m-        static void ndk_debug (const char * fmt, ...) {[m
[31m-        }[m
[31m-[m
[31m-        static void ndk_debug_request() {[m
[31m-        }[m
[31m-[m
[31m-    #endif[m
[31m-[m
[31m-    #define     ndk_debug_http_conf_location(cf)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NDK_DEBUG)[m
[31m-[m
[31m-    #define     ndk_debug_check_read_event_handler(r)                               \[m
[31m-                                                                                    \[m
[31m-                    ndk_debug("r->read_event_handler = %s",                         \[m
[31m-                        r->read_event_handler == ngx_http_block_reading ?           \[m
[31m-                            "ngx_http_block_reading" :                              \[m
[31m-                        r->read_event_handler == ngx_http_test_reading ?            \[m
[31m-                            "ngx_http_test_reading" :                               \[m
[31m-                        r->read_event_handler == ngx_http_request_empty_handler ?   \[m
[31m-                            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-    #define     ndk_debug_check_write_event_handler(r)                              \[m
[31m-                                                                                    \[m
[31m-                    ndk_debug ("r->write_event_handler = %s",                       \[m
[31m-                        r->write_event_handler == ngx_http_handler ?                \[m
[31m-                            "ngx_http_handler" :                                    \[m
[31m-                        r->write_event_handler == ngx_http_core_run_phases ?        \[m
[31m-                            "ngx_http_core_run_phases" :                            \[m
[31m-                        r->write_event_handler == ngx_http_request_empty_handler ?  \[m
[31m-                            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    #define     ndk_debug_check_read_event_handler(r)[m
[31m-    #define     ndk_debug_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NDK_DEBUG_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_encoding.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_encoding.c[m
[1mdeleted file mode 100644[m
[1mindex 4a07872..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_encoding.c[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_encoding_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char    *p = conf;[m
[31m-[m
[31m-    ndk_encoding_t  *ep;[m
[31m-    ngx_str_t       *value;[m
[31m-    size_t           len;[m
[31m-    iconv_t          ic;[m
[31m-[m
[31m-    ep = (ndk_encoding_t *) (p + cmd->offset);[m
[31m-    if (ep->from && ep->to)[m
[31m-        return  "is duplicate";[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-[m
[31m-    if (ep->from) {[m
[31m-[m
[31m-        ep->to = (char *) value[1].data;[m
[31m-        len = strlen (ep->from);[m
[31m-[m
[31m-    } else if (ep->to) {[m
[31m-[m
[31m-        ep->from = (char *) value[1].data;[m
[31m-        len = strlen (ep->to);[m
[31m-[m
[31m-    } else {[m
[31m-        return  "has no base encoding";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (len == value[1].len && !strncasecmp (ep->to, ep->from, len)) {[m
[31m-[m
[31m-        ngx_log_error (NGX_LOG_WARN, cf->log, 0, [m
[31m-            "\"%V\" '%V' encoding is ignored (no conversion)", &value[0], &value[1]);[m
[31m-[m
[31m-        return  NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ic = iconv_open (ep->to, ep->from);[m
[31m-    if (ic == (iconv_t)-1)[m
[31m-        return  "has an invalid encoding";[m
[31m-[m
[31m-[m
[31m-    if (iconv_close (ic)) {[m
[31m-        ngx_log_error (NGX_LOG_EMERG, cf->log, errno, "iconv_close()");[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_encoding.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_encoding.h[m
[1mdeleted file mode 100644[m
[1mindex b295b18..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_encoding.h[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#include    <iconv.h>[m
[31m-[m
[31m-typedef struct {[m
[31m-    char        *from;[m
[31m-    char        *to;[m
[31m-} ndk_encoding_t;[m
[31m-[m
[31m-[m
[31m-char *  ndk_conf_set_encoding_slot  (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_hash.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_hash.c[m
[1mdeleted file mode 100644[m
[1mindex dec3d41..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_hash.c[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-[m
[31m-#include <ndk_hash.h>[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* openssl hashes */[m
[31m-[m
[31m-#define     NDK_OPENSSL_HASH(type,ctxt_type,upper)                  \[m
[31m-    u_char              md [ctxt_type ## _DIGEST_LENGTH];           \[m
[31m-    ctxt_type ##_CTX    c;                                          \[m
[31m-                                                                    \[m
[31m-    type ## _Init (&c);                                             \[m
[31m-    type ## _Update (&c, data, len);                                \[m
[31m-    type ## _Final (md, &c);                                        \[m
[31m-                                                                    \[m
[31m-    ndk_hex_dump (p, (u_char *) md, ctxt_type ## _DIGEST_LENGTH);   \[m
[31m-    if (upper) {                                                    \[m
[31m-        ndk_strtoupper (p, (ctxt_type ## _DIGEST_LENGTH) *2);       \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#ifdef NDK_MD5[m
[31m-[m
[31m-void[m
[31m-ndk_md5_hash (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    NDK_OPENSSL_HASH (MD5, MD5, 0);[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ndk_md5_hash_upper (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    NDK_OPENSSL_HASH (MD5, MD5, 1);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-#ifdef NDK_SHA1[m
[31m-[m
[31m-void[m
[31m-ndk_sha1_hash (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    NDK_OPENSSL_HASH (SHA1, SHA, 0);[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ndk_sha1_hash_upper (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    NDK_OPENSSL_HASH (SHA1, SHA, 1);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* non-openssl hashes */[m
[31m-[m
[31m-#ifdef NDK_MURMUR2[m
[31m-[m
[31m-#include    "hash/murmurhash2.c"[m
[31m-[m
[31m-void[m
[31m-ndk_murmur2_hash (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    uint32_t    hash;[m
[31m-[m
[31m-    hash = MurmurHash2 (data, len, 47);[m
[31m-[m
[31m-    ndk_hex_dump (p, (u_char*) &hash, 4);[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ndk_murmur2_hash_upper (u_char *p, char *data, size_t len)[m
[31m-{[m
[31m-    uint32_t    hash;[m
[31m-[m
[31m-    hash = MurmurHash2 (data, len, 47);[m
[31m-[m
[31m-    ndk_hex_dump (p, (u_char*) &hash, 4);[m
[31m-    ndk_strtoupper (p, 8);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_hash.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_hash.h[m
[1mdeleted file mode 100644[m
[1mindex a15e923..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_hash.h[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-#ifndef NDK_HASH_H[m
[31m-#define NDK_HASH_H[m
[31m-[m
[31m-#ifdef NDK_HASH_ALL[m
[31m-[m
[31m-#ifndef NDK_MD5[m
[31m-#define NDK_MD5[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NDK_MURMUR2[m
[31m-#define NDK_MURMUR2[m
[31m-#endif[m
[31m-[m
[31m-#ifndef NDK_SHA1[m
[31m-#define NDK_SHA1[m
[31m-#endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-typedef void (*ndk_hash_pt) (u_char *p, char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-#ifdef NDK_MD5[m
[31m-#include <ngx_md5.h>[m
[31m-void    ndk_md5_hash            (u_char *p, char *data, size_t len);[m
[31m-void    ndk_md5_hash_upper      (u_char *p, char *data, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef NDK_MURMUR2[m
[31m-#define MURMURHASH2_DIGEST_LENGTH   4[m
[31m-void    ndk_murmur2_hash        (u_char *p, char *data, size_t len);[m
[31m-void    ndk_murmur2_hash_upper  (u_char *p, char *data, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-#ifdef NDK_SHA1[m
[31m-#include <ngx_sha1.h>[m
[31m-void    ndk_sha1_hash           (u_char *p, char *data, size_t len);[m
[31m-void    ndk_sha1_hash_upper     (u_char *p, char *data, size_t len);[m
[31m-#endif[m
[31m-[m
[31m-#endif /* NDK_HASH_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http.c[m
[1mdeleted file mode 100644[m
[1mindex 60728bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http.c[m
[1m+++ /dev/null[m
[36m@@ -1,138 +0,0 @@[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ndk_http_count_phase_handlers (ngx_http_core_main_conf_t *cmcf)[m
[31m-{[m
[31m-    ngx_http_phase_handler_t    *ph;[m
[31m-    ngx_uint_t                   i;[m
[31m-    [m
[31m-    ph = cmcf->phase_engine.handlers;[m
[31m-    [m
[31m-    for (i=0; ph[i].checker; i++) /* void */;[m
[31m-        [m
[31m-    return  i;        [m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_uint_t[m
[31m-ndk_http_parse_request_method (ngx_str_t *m)[m
[31m-{[m
[31m-    switch (m->len) {[m
[31m-[m
[31m-        case 3:[m
[31m-            [m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-        {[m
[31m-            u_char    t[4];[m
[31m-            [m
[31m-            ngx_memcpy (t, m->data, 3);[m
[31m-            t[3] = ' ';[m
[31m-            [m
[31m-            if (ndk_str3_cmp (t, 'G', 'E', 'T', ' ')) {[m
[31m-                return  NGX_HTTP_GET;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str3_cmp (t, 'P', 'U', 'T', ' ')) {[m
[31m-                return  NGX_HTTP_PUT;[m
[31m-            }[m
[31m-        }[m
[31m-            [m
[31m-#else[m
[31m-[m
[31m-            if (ndk_str3_cmp (m->data, 'G', 'E', 'T', ' ')) {[m
[31m-                return  NGX_HTTP_GET;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str3_cmp (m->data, 'P', 'U', 'T', ' ')) {[m
[31m-                return  NGX_HTTP_PUT;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-            break;[m
[31m-[m
[31m-        case 4:[m
[31m-            [m
[31m-            if  (m->data[1] == 'O') {[m
[31m-[m
[31m-                if (ndk_str3Ocmp (m->data, 'P', 'O', 'S', 'T')) {[m
[31m-                    return  NGX_HTTP_POST;[m
[31m-                }[m
[31m-[m
[31m-                if (ndk_str3Ocmp (m->data, 'C', 'O', 'P', 'Y')) {[m
[31m-                    return  NGX_HTTP_COPY;[m
[31m-                }[m
[31m-[m
[31m-                if (ndk_str3Ocmp (m->data, 'M', 'O', 'V', 'E')) {[m
[31m-                    return  NGX_HTTP_MOVE;[m
[31m-                }[m
[31m-[m
[31m-                if (ndk_str3Ocmp (m->data, 'L', 'O', 'C', 'K')) {[m
[31m-                    return  NGX_HTTP_LOCK;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                if (ndk_str4cmp (m->data, 'H', 'E', 'A', 'D')) {[m
[31m-                    return  NGX_HTTP_HEAD;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 5:[m
[31m-            [m
[31m-            if (ndk_str5cmp (m->data, 'M', 'K', 'C', 'O', 'L')) {[m
[31m-                return  NGX_HTTP_MKCOL;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str5cmp (m->data, 'P', 'A', 'T', 'C', 'H')) {[m
[31m-                return  NGX_HTTP_PATCH;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str5cmp (m->data, 'T', 'R', 'A', 'C', 'E')) {[m
[31m-                return  NGX_HTTP_TRACE;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 6:[m
[31m-            [m
[31m-            if (ndk_str6cmp (m->data, 'D', 'E', 'L', 'E', 'T', 'E')) {[m
[31m-                return  NGX_HTTP_DELETE;[m
[31m-            }[m
[31m-[m
[31m-            if (ndk_str6cmp (m->data, 'U', 'N', 'L', 'O', 'C', 'K')) {[m
[31m-                return  NGX_HTTP_UNLOCK;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 7:[m
[31m-            [m
[31m-            if (ndk_str7_cmp (m->data, 'O', 'P', 'T', 'I', 'O', 'N', 'S', ' '))[m
[31m-            {[m
[31m-                return  NGX_HTTP_OPTIONS;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 8:[m
[31m-            [m
[31m-            if (ndk_str8cmp (m->data, 'P', 'R', 'O', 'P', 'F', 'I', 'N', 'D'))[m
[31m-            {[m
[31m-                return  NGX_HTTP_PROPFIND;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case 9:[m
[31m-            [m
[31m-            if (ndk_str9cmp (m->data, 'P', 'R', 'O', 'P', 'P', 'A', 'T', 'C', 'H'))[m
[31m-            {[m
[31m-                return  NGX_HTTP_PROPPATCH;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-    }[m
[31m-[m
[31m-    return  0;[m
[31m-}[m
\ No newline at end of file[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http.h[m
[1mdeleted file mode 100644[m
[1mindex 6a9d1c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http.h[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-[m
[31m-ngx_uint_t  ndk_http_count_phase_handlers       (ngx_http_core_main_conf_t *cmcf);[m
[31m-ngx_uint_t  ndk_http_parse_request_method       (ngx_str_t *m);[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http_headers.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http_headers.h[m
[1mdeleted file mode 100644[m
[1mindex e71c70e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_http_headers.h[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : organize and add */[m
[31m-/* TODO : check - should it be r->main? */[m
[31m-[m
[31m-#define     ndk_http_uri(r)                         (r)->uri[m
[31m-#define     ndk_http_request_uri(r)                 (r)->unparsed_uri[m
[31m-[m
[31m-#define     ndk_http_header_in(r,name)              ((r)->headers_in.name ? &(r)->headers_in.name->value : NULL)[m
[31m-#define     ndk_http_header_out(r,name)             ((r)->headers_out.name ? &(r)->headers_out.name->value : NULL)[m
[31m-[m
[31m-#define     ndk_http_host_header(r)                 ndk_http_header_in (r, host)[m
[31m-#define     ndk_http_connection_header(r)           ndk_http_header_in (r, connection)[m
[31m-#define     ndk_http_if_modified_since_header(r)    ndk_http_header_in (r, if_modified_since)[m
[31m-#define     ndk_http_user_agent_header(r)           ndk_http_header_in (r, user_agent)[m
[31m-#define     ndk_http_referer_header(r)              ndk_http_header_in (r, referer)[m
[31m-#define     ndk_http_content_length_header(r)       ndk_http_header_in (r, content_length)[m
[31m-#define     ndk_http_content_type_header(r)         ndk_http_header_in (r, content_type)[m
[31m-#define     ndk_http_range_header(r)                ndk_http_header_in (r, range)[m
[31m-#define     ndk_http_if_range_header(r)             ndk_http_header_in (r, if_range)[m
[31m-#define     ndk_http_transfer_encoding_header(r)    ndk_http_header_in (r, transfer_encoding)[m
[31m-#define     ndk_http_expect_header(r)               ndk_http_header_in (r, expect)[m
[31m-#define     ndk_http_accept_encoding_header(r)      ndk_http_header_in (r, accept_encoding)[m
[31m-#define     ndk_http_via_header(r)                  ndk_http_header_in (r, via)[m
[31m-#define     ndk_http_authorization_header(r)        ndk_http_header_in (r, authorization)[m
[31m-#define     ndk_http_keep_alive_header(r)           ndk_http_header_in (r, keep_alive)[m
[31m-#define     ndk_http_x_forwarded_for_header(r)      ndk_http_header_in (r, x_forwarded_for)[m
[31m-#define     ndk_http_x_real_ip_header(r)            ndk_http_header_in (r, x_real_ip)[m
[31m-#define     ndk_http_accept_header(r)               ndk_http_header_in (r, accept)[m
[31m-#define     ndk_http_accept_language_header(r)      ndk_http_header_in (r, accept_language)[m
[31m-#define     ndk_http_depth_header(r)                ndk_http_header_in (r, depth)[m
[31m-#define     ndk_http_destination_header(r)          ndk_http_header_in (r, destination)[m
[31m-#define     ndk_http_overwrite_header(r)            ndk_http_header_in (r, overwrite)[m
[31m-#define     ndk_http_date_header(r)                 ndk_http_header_in (r, date)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_log.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_log.c[m
[1mdeleted file mode 100644[m
[1mindex 36dca15..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_log.c[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : the required functions if the compiler does not have variadic macros */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_log.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_log.h[m
[1mdeleted file mode 100644[m
[1mindex 1dd9c22..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_log.h[m
[1m+++ /dev/null[m
[36m@@ -1,165 +0,0 @@[m
[31m-[m
[31m-/* TODO : fix the conf_log macros */[m
[31m-[m
[31m-#define NGX_LOG_DEBUG_SCRIPT        NGX_LOG_DEBUG_HTTP      /* TODO : add new section to log/conf directives */[m
[31m-[m
[31m-#define ndk_conf_to_log(cf)         ((cf)->log)[m
[31m-[m
[31m-#ifndef ndk_request_to_log[m
[31m-#define ndk_request_to_log(r)       ((r)->connection->log)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#if (NGX_HAVE_C99_VARIADIC_MACROS)[m
[31m-[m
[31m-#define ndk_log_stderr(log,...)                     ngx_log_error (NGX_LOG_STDERR, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_emerg(log,...)                      ngx_log_error (NGX_LOG_EMERG, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_alert(log,...)                      ngx_log_error (NGX_LOG_ALERT, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_crit(log,...)                       ngx_log_error (NGX_LOG_CRIT, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_err(log,...)                        ngx_log_error (NGX_LOG_ERR, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_warning(log,...)                    ngx_log_error (NGX_LOG_WARN, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_notice(log,...)                     ngx_log_error (NGX_LOG_NOTICE, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_info(log,...)                       ngx_log_error (NGX_LOG_INFO, log, 0, __VA_ARGS__)[m
[31m-[m
[31m-#define ndk_conf_log_stderr(cf,...)                 ngx_conf_log_error (NGX_LOG_STDERR, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_emerg(cf,...)                  ngx_conf_log_error (NGX_LOG_EMERG, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_alert(cf,...)                  ngx_conf_log_error (NGX_LOG_ALERT, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_crit(cf,...)                   ngx_conf_log_error (NGX_LOG_CRIT, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_err(cf,...)                    ngx_conf_log_error (NGX_LOG_ERR, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_warning(cf,...)                ngx_conf_log_error (NGX_LOG_WARN, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_notice(cf,...)                 ngx_conf_log_error (NGX_LOG_NOTICE, cf, 0, __VA_ARGS__)[m
[31m-#define ndk_conf_log_info(cf,...)                   ngx_conf_log_error (NGX_LOG_INFO, cf, 0, __VA_ARGS__)[m
[31m-[m
[31m-#define ndk_request_log_stderr(r,...)               ndk_log_stderr (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_emerg(r,...)                ndk_log_emerg (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_alert(r,...)                ndk_log_alert (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_crit(r,...)                 ndk_log_crit (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_err(r,...)                  ndk_log_err (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_warning(r,...)              ndk_log_warning (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_notice(r,...)               ndk_log_notice (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_info(r,...)                 ndk_log_info (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-[m
[31m-#define ndk_log_debug_core(log,...)                 ngx_log_debug (NGX_LOG_DEBUG_CORE, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_alloc(log,...)                ngx_log_debug (NGX_LOG_DEBUG_ALLOC, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_mutex(log,...)                ngx_log_debug (NGX_LOG_DEBUG_MUTEX, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_event(log,...)                ngx_log_debug (NGX_LOG_DEBUG_EVENT, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_http(log,...)                 ngx_log_debug (NGX_LOG_DEBUG_HTTP, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_mail(log,...)                 ngx_log_debug (NGX_LOG_DEBUG_MAIL, log, 0, __VA_ARGS__)[m
[31m-#define ndk_log_debug_mysql(log,...)                ngx_log_debug (NGX_LOG_DEBUG_MYSQL, log, 0, __VA_ARGS__)[m
[31m-[m
[31m-#define ndk_conf_log_debug_core(r,...)              ndk_log_debug_core (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_alloc(r,...)             ndk_log_debug_alloc (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_mutex(r,...)             ndk_log_debug_mutex (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_event(r,...)             ndk_log_debug_event (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_http(r,...)              ndk_log_debug_http (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_mail(r,...)              ndk_log_debug_mail (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_conf_log_debug_mysql(r,...)             ndk_log_debug_mysql (ndk_conf_to_log(r), __VA_ARGS__)[m
[31m-[m
[31m-#define ndk_request_log_debug_core(r,...)           ndk_log_debug_core (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_alloc(r,...)          ndk_log_debug_alloc (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_mutex(r,...)          ndk_log_debug_mutex (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_event(r,...)          ndk_log_debug_event (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_http(r,...)           ndk_log_debug_http (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_mail(r,...)           ndk_log_debug_mail (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-#define ndk_request_log_debug_mysql(r,...)          ndk_log_debug_mysql (ndk_request_to_log(r), __VA_ARGS__)[m
[31m-[m
[31m-#else [m
[31m-[m
[31m-#define ndk_log_debug_core(log,...)[m
[31m-#define ndk_log_debug_alloc(log,...)[m
[31m-#define ndk_log_debug_mutex(log,...)[m
[31m-#define ndk_log_debug_event(log,...)[m
[31m-#define ndk_log_debug_http(log,...)[m
[31m-#define ndk_log_debug_mail(log,...)[m
[31m-#define ndk_log_debug_mysql(log,...)[m
[31m-[m
[31m-#define ndk_conf_log_debug_core(r,...)[m
[31m-#define ndk_conf_log_debug_alloc(r,...)[m
[31m-#define ndk_conf_log_debug_mutex(r,...)[m
[31m-#define ndk_conf_log_debug_event(r,...)[m
[31m-#define ndk_conf_log_debug_http(r,...)[m
[31m-#define ndk_conf_log_debug_mail(r,...)[m
[31m-#define ndk_conf_log_debug_mysql(r,...)[m
[31m-[m
[31m-#define ndk_request_log_debug_core(r,...)[m
[31m-#define ndk_request_log_debug_alloc(r,...)[m
[31m-#define ndk_request_log_debug_mutex(r,...)[m
[31m-#define ndk_request_log_debug_event(r,...)[m
[31m-#define ndk_request_log_debug_http(r,...)[m
[31m-#define ndk_request_log_debug_mail(r,...)[m
[31m-#define ndk_request_log_debug_mysql(r,...)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#elif (NGX_HAVE_GCC_VARIADIC_MACROS)[m
[31m-[m
[31m-#define ndk_log_stderr(log,args...)                 ngx_log_error (NGX_LOG_STDERR, log, 0, args)[m
[31m-#define ndk_log_emerg(log,args...)                  ngx_log_error (NGX_LOG_EMERG, log, 0, args)[m
[31m-#define ndk_log_alert(log,args...)                  ngx_log_error (NGX_LOG_ALERT, log, 0, args)[m
[31m-#define ndk_log_crit(log,args...)                   ngx_log_error (NGX_LOG_CRIT, log, 0, args)[m
[31m-#define ndk_log_err(log,args...)                    ngx_log_error (NGX_LOG_ERR, log, 0, args)[m
[31m-#define ndk_log_warning(log,args...)                ngx_log_error (NGX_LOG_WARN, log, 0, args)[m
[31m-#define ndk_log_notice(log,args...)                 ngx_log_error (NGX_LOG_NOTICE, log, 0, args)[m
[31m-#define ndk_log_info(log,args...)                   ngx_log_error (NGX_LOG_INFO, log, 0, args)[m
[31m-[m
[31m-#define ndk_log_debug_core(log,args...)             ngx_log_debug (NGX_LOG_DEBUG_CORE, log, 0, args)[m
[31m-#define ndk_log_debug_alloc(log,args...)            ngx_log_debug (NGX_LOG_DEBUG_ALLOC, log, 0, args)[m
[31m-#define ndk_log_debug_mutex(log,args...)            ngx_log_debug (NGX_LOG_DEBUG_MUTEX, log, 0, args)[m
[31m-#define ndk_log_debug_event(log,args...)            ngx_log_debug (NGX_LOG_DEBUG_EVENT, log, 0, args)[m
[31m-#define ndk_log_debug_http(log,args...)             ngx_log_debug (NGX_LOG_DEBUG_HTTP, log, 0, args)[m
[31m-#define ndk_log_debug_mail(log,args...)             ngx_log_debug (NGX_LOG_DEBUG_MAIL, log, 0, args)[m
[31m-#define ndk_log_debug_mysql(log,args...)            ngx_log_debug (NGX_LOG_DEBUG_MYSQL, log, 0, args)[m
[31m-#define ndk_log_debug_script(log,args...)           ngx_log_debug (NGX_LOG_DEBUG_SCRIPT, log, 0, args)[m
[31m-[m
[31m-#define ndk_conf_log_stderr(cf,args...)             ngx_conf_log_error (NGX_LOG_STDERR, cf, 0, args)[m
[31m-#define ndk_conf_log_emerg(cf,args...)              ngx_conf_log_error (NGX_LOG_EMERG, cf, 0, args)[m
[31m-#define ndk_conf_log_alert(cf,args...)              ngx_conf_log_error (NGX_LOG_ALERT, cf, 0, args)[m
[31m-#define ndk_conf_log_crit(cf,args...)               ngx_conf_log_error (NGX_LOG_CRIT, cf, 0, args)[m
[31m-#define ndk_conf_log_err(cf,args...)                ngx_conf_log_error (NGX_LOG_ERR, cf, 0, args)[m
[31m-#define ndk_conf_log_warning(cf,args...)            ngx_conf_log_error (NGX_LOG_WARN, cf, 0, args)[m
[31m-#define ndk_conf_log_notice(cf,args...)             ngx_conf_log_error (NGX_LOG_NOTICE, cf, 0, args)[m
[31m-#define ndk_conf_log_info(cf,args...)               ngx_conf_log_error (NGX_LOG_INFO, cf, 0, args)[m
[31m-[m
[31m-#define ndk_conf_log_debug_core(r,args...)          ndk_log_debug_core (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_alloc(r,args...)         ndk_log_debug_alloc (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_mutex(r,args...)         ndk_log_debug_mutex (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_event(r,args...)         ndk_log_debug_event (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_http(r,args...)          ndk_log_debug_http (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_mail(r,args...)          ndk_log_debug_mail (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_mysql(r,args...)         ndk_log_debug_mysql (ndk_conf_to_log(r), args)[m
[31m-#define ndk_conf_log_debug_script(r,args...)        ndk_log_debug_script (ndk_conf_to_log(r), args)[m
[31m-[m
[31m-#define ndk_request_log_stderr(r,args...)           ndk_log_stderr (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_emerg(r,args...)            ndk_log_emerg (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_alert(r,args...)            ndk_log_alert (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_crit(r,args...)             ndk_log_crit (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_err(r,args...)              ndk_log_err (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_warning(r,args...)          ndk_log_warning (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_notice(r,args...)           ndk_log_notice (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_info(r,args...)             ndk_log_info (ndk_request_to_log(r), args)[m
[31m-[m
[31m-#define ndk_request_log_debug_core(r,args...)       ndk_log_debug_core (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_alloc(r,args...)      ndk_log_debug_alloc (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_mutex(r,args...)      ndk_log_debug_mutex (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_event(r,args...)      ndk_log_debug_event (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_http(r,args...)       ndk_log_debug_http (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_mail(r,args...)       ndk_log_debug_mail (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_mysql(r,args...)      ndk_log_debug_mysql (ndk_request_to_log(r), args)[m
[31m-#define ndk_request_log_debug_script(r,args...)     ndk_log_debug_script (ndk_request_to_log(r), args)[m
[31m-[m
[31m-/*********************************/[m
[31m-[m
[31m-#else /* NO VARIADIC MACROS */[m
[31m-[m
[31m-/* #warning does not work on Windows */[m
[31m-#pragma message("Nginx Devel Kit logging without variadic macros not yet implemented")[m
[31m-[m
[31m-#endif /* VARIADIC MACROS */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_parse.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_parse.h[m
[1mdeleted file mode 100644[m
[1mindex 7c43e14..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_parse.h[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)[m
[31m-[m
[31m-#define ndk_str3_cmp(m, c0, c1, c2, c3)                                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ndk_str3Ocmp(m, c0, c1, c2, c3)                                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ndk_str4cmp(m, c0, c1, c2, c3)                                        \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)[m
[31m-[m
[31m-#define ndk_str5cmp(m, c0, c1, c2, c3, c4)                                    \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && m[4] == c4[m
[31m-[m
[31m-#define ndk_str6cmp(m, c0, c1, c2, c3, c4, c5)                                \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4)[m
[31m-[m
[31m-#define ndk_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                       \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)[m
[31m-[m
[31m-#define ndk_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                        \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)[m
[31m-[m
[31m-#define ndk_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8)                    \[m
[31m-    *(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)             \[m
[31m-        && ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)  \[m
[31m-        && m[8] == c8[m
[31m-[m
[31m-#else /* !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) */[m
[31m-[m
[31m-#define ndk_str3_cmp(m, c0, c1, c2, c3)                                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2[m
[31m-[m
[31m-#define ndk_str3Ocmp(m, c0, c1, c2, c3)                                       \[m
[31m-    m[0] == c0 && m[2] == c2 && m[3] == c3[m
[31m-[m
[31m-#define ndk_str4cmp(m, c0, c1, c2, c3)                                        \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3[m
[31m-[m
[31m-#define ndk_str5cmp(m, c0, c1, c2, c3, c4)                                    \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4[m
[31m-[m
[31m-#define ndk_str6cmp(m, c0, c1, c2, c3, c4, c5)                                \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5[m
[31m-[m
[31m-#define ndk_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                       \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6[m
[31m-[m
[31m-#define ndk_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7)                        \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7[m
[31m-[m
[31m-#define ndk_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8)                    \[m
[31m-    m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3                      \[m
[31m-        && m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7 && m[8] == c8[m
[31m-[m
[31m-#endif[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_path.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_path.c[m
[1mdeleted file mode 100644[m
[1mindex 0b7c266..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_path.c[m
[1m+++ /dev/null[m
[36m@@ -1,583 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* This function cleans a path to its most basic form, performing the following transformations :[m
[31m- *[m
[31m- *  - ./ -> [empty][m
[31m- *  - // -> /[m
[31m- *  - /base/parent/../ -> /base/[m
[31m- *[m
[31m- * If possible, it leaves the original string in place and does not copy characters, otherwise[m
[31m- * characters are copied.[m
[31m-*/[m
[31m-[m
[31m-void[m
[31m-ndk_clean_path (ngx_str_t *path, ngx_uint_t complex, size_t off)[m
[31m-{[m
[31m-    u_char         *s, *p, *m, *e, c, *l;[m
[31m-    ngx_uint_t      root;[m
[31m-[m
[31m-    if (path->len == 1) {[m
[31m-[m
[31m-        if (path->data[0] == '.') {[m
[31m-            path->len = 0;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* strip initial './' */[m
[31m-[m
[31m-    s = path->data;[m
[31m-    e = s + path->len;[m
[31m-[m
[31m-    if (off) {[m
[31m-        p = s + off;[m
[31m-        goto check_basic;[m
[31m-    }[m
[31m-[m
[31m-    if (*s == '/')[m
[31m-        root = 1;[m
[31m-    else[m
[31m-        root = 0;[m
[31m-[m
[31m-    while (s < e) {[m
[31m-[m
[31m-        switch (*s) {[m
[31m-[m
[31m-        case    '/' :[m
[31m-[m
[31m-            /* '//' => '/' */[m
[31m-[m
[31m-            s++;[m
[31m-            continue;[m
[31m-[m
[31m-        case    '.' :[m
[31m-[m
[31m-            if (s == e-1) {[m
[31m-[m
[31m-                if (root) {[m
[31m-                    path->data[0] = '/';[m
[31m-                    path->len = 1;[m
[31m-                } else {[m
[31m-                    path->len = 0;[m
[31m-                }[m
[31m-[m
[31m-                return;[m
[31m-            }[m
[31m-[m
[31m-            /* './' => '' */[m
[31m-[m
[31m-            if (s[1] == '/') {[m
[31m-[m
[31m-                s += 2;[m
[31m-[m
[31m-                if (s == e) {[m
[31m-[m
[31m-                    path->len = 0;[m
[31m-                    return;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (root && *s != '/') {[m
[31m-        s--;[m
[31m-    }[m
[31m-[m
[31m-    p = s;[m
[31m-[m
[31m-check_basic :[m
[31m-[m
[31m-    for ( ; p<e; p++) {[m
[31m-[m
[31m-        if (*p == '/') {[m
[31m-[m
[31m-        new_dir_first :[m
[31m-[m
[31m-            if (e - p == 1)[m
[31m-                break;[m
[31m-[m
[31m-            switch (p[1]) {[m
[31m-[m
[31m-            case    '/' :[m
[31m-[m
[31m-                /* '//' => '/' */[m
[31m-[m
[31m-                m = p + 2;[m
[31m-                goto copy;[m
[31m-[m
[31m-            case    '.' :[m
[31m-[m
[31m-                if (e - p == 2)[m
[31m-                    break;[m
[31m-[m
[31m-                switch (p[2]) {[m
[31m-[m
[31m-                case    '/' :[m
[31m-[m
[31m-                    /* './' => '' */[m
[31m-[m
[31m-                    m = p + 2;[m
[31m-                    goto copy;[m
[31m-[m
[31m-                case    '.' :[m
[31m-[m
[31m-                    if (e - p == 3 || p[3] == '/') {[m
[31m-[m
[31m-                        if (p == s) {[m
[31m-[m
[31m-                            s += 3;[m
[31m-                            continue;[m
[31m-                        }[m
[31m-[m
[31m-                        if (p - s >= 2) {[m
[31m-[m
[31m-                            if (p[-1] == '.' && p[-2] == '.') {[m
[31m-[m
[31m-                                if (p - s == 2 || p[-3] == '/') {    /* = '../../' */[m
[31m-[m
[31m-                                    p += 2;     /* 3? */[m
[31m-                                    continue;[m
[31m-                                }[m
[31m-                            }[m
[31m-                        }[m
[31m-[m
[31m-                        m = p + 4;[m
[31m-[m
[31m-                        if (complex) {[m
[31m-[m
[31m-                            for (p--; p >= s; p--) {[m
[31m-[m
[31m-                                switch (*p) {[m
[31m-[m
[31m-                                case    '/' :[m
[31m-                                    goto copy;[m
[31m-[m
[31m-                                case    '$' :[m
[31m-[m
[31m-                                    p = m - 1;[m
[31m-[m
[31m-                                    if (m == e)[m
[31m-                                        goto end_basic;[m
[31m-[m
[31m-                                    goto new_dir_first;[m
[31m-                                }[m
[31m-                            }[m
[31m-[m
[31m-                        } else {[m
[31m-[m
[31m-                           for (p--; p > s; p--) {[m
[31m-[m
[31m-                                /* '/path/folder/../' => '/path/' */[m
[31m-[m
[31m-                                if (*p == '/')[m
[31m-                                    break;[m
[31m-                            }[m
[31m-                        }[m
[31m-[m
[31m-                        goto copy;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-end_basic :[m
[31m-[m
[31m-    path->data = s;[m
[31m-    path->len = p - s;[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-copy :[m
[31m-[m
[31m-    p++;[m
[31m-[m
[31m-    if (m < e)[m
[31m-        goto new_dir;[m
[31m-[m
[31m-    while (m < e) {       [m
[31m-[m
[31m-        c = *m;[m
[31m-        *p = c;[m
[31m-        p++;[m
[31m-[m
[31m-        if (c == '/') {[m
[31m-[m
[31m-            m++;[m
[31m-[m
[31m-        new_dir :[m
[31m-[m
[31m-            for ( ; m<e; m++) {[m
[31m-[m
[31m-                c = *m;[m
[31m-                if (c != '/')[m
[31m-                    break;[m
[31m-            }[m
[31m-[m
[31m-            if (m == e)[m
[31m-                break;[m
[31m-[m
[31m-            if (c == '.') {[m
[31m-[m
[31m-                if (e - m == 1)[m
[31m-                    break;[m
[31m-[m
[31m-                switch (m[1]) {[m
[31m-[m
[31m-                case    '/' :[m
[31m-[m
[31m-                    /* './' => '' */[m
[31m-[m
[31m-                    m += 2;[m
[31m-                    if (m == e)[m
[31m-                        break;[m
[31m-[m
[31m-                    goto new_dir;[m
[31m-[m
[31m-                case    '.' :[m
[31m-[m
[31m-                    if (e - m == 2 || m[2] == '/') {[m
[31m-[m
[31m-                        if (m - s >= 3) {   /* NOTE : this is one higher than above because m has moved on 1 */[m
[31m-[m
[31m-                            if (p[-2] == '.' && p[-3] == '.') {[m
[31m-[m
[31m-                                if (m - s == 3 || p[-4] == '/') {    /* = '../../' */[m
[31m-[m
[31m-                                    p[0] = '.';[m
[31m-                                    p[1] = '.';[m
[31m-                                    p[2] = '/';[m
[31m-                                    p += 3;[m
[31m-                                    m += 3;[m
[31m-                                    goto new_dir;[m
[31m-                                }[m
[31m-                            }[m
[31m-                        }[m
[31m-[m
[31m-                        if (complex) {[m
[31m-[m
[31m-                            l = p;[m
[31m-[m
[31m-                            for (p -= 2; p >= s; p--) {[m
[31m-[m
[31m-                                switch (*p) {[m
[31m-[m
[31m-                                case    '/' :[m
[31m-                                    break;[m
[31m-[m
[31m-                                case    '$' :[m
[31m-[m
[31m-                                    l[0] = '.';[m
[31m-                                    l[1] = '.';[m
[31m-                                    l[2] = '/';[m
[31m-                                    p = l + 4;[m
[31m-                                    break;[m
[31m-[m
[31m-                                default :[m
[31m-                                    continue;[m
[31m-                                }[m
[31m-[m
[31m-                                break;[m
[31m-                            }[m
[31m-[m
[31m-                            m += 3;[m
[31m-                            if (m == e)[m
[31m-                                goto end;[m
[31m-[m
[31m-                            goto new_dir;[m
[31m-[m
[31m-                        } else {[m
[31m-[m
[31m-                            for (p -= 2; p > s; p--) {[m
[31m-[m
[31m-                                /* '/path/folder/../' => '/path/' */[m
[31m-[m
[31m-                                if (*p == '/')[m
[31m-                                    break;[m
[31m-                            }[m
[31m-[m
[31m-                            m += 3;[m
[31m-                            if (m == e)[m
[31m-                                goto end;[m
[31m-[m
[31m-                            goto new_dir;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            m++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-end :[m
[31m-[m
[31m-    path->data = s;[m
[31m-    path->len = p - s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* This function converts a path to its directory version, and assumes that there is always space[m
[31m- * to allocatate an extra character on the end (which is only true if the provided strings always[m
[31m- * have NULL's at the end (hence the 'safe').[m
[31m-*/[m
[31m-[m
[31m-void[m
[31m-ndk_path_to_dir_safe (ngx_str_t *path, ngx_uint_t complex, size_t off)[m
[31m-{[m
[31m-    size_t   len;[m
[31m-    u_char  *p, *m;[m
[31m-[m
[31m-    ndk_clean_path (path, complex, off);[m
[31m-[m
[31m-    len = path->len;[m
[31m-    if (!len)[m
[31m-        return;[m
[31m-[m
[31m-    p = path->data;[m
[31m-    m = p + len - 1;[m
[31m-[m
[31m-    if (*m != '/') {[m
[31m-[m
[31m-        p [len] = '/';[m
[31m-        path->len++;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* Divides a path given by path/to/path1:path/to/path2 into separate strings and returns an[m
[31m- * array of these strings.[m
[31m-*/[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_split_path_create (ngx_conf_t *cf, ngx_str_t *path)[m
[31m-{[m
[31m-    ngx_str_t         *str;[m
[31m-    int                n;[m
[31m-    u_char            *m, *s, *e;[m
[31m-    ngx_array_t       *a; [m
[31m-[m
[31m-    if (path == NULL)[m
[31m-        return  NULL;[m
[31m-[m
[31m-    n = ndk_strcntc (path, ':');[m
[31m-[m
[31m-    a = ngx_array_create (cf->pool, n + 1, sizeof (ngx_str_t));[m
[31m-    if (a == NULL) {[m
[31m-        return  NULL;[m
[31m-    }[m
[31m-[m
[31m-    s = path->data;[m
[31m-    e = s + path->len;[m
[31m-[m
[31m-    while (s < e) {[m
[31m-[m
[31m-        m = s;[m
[31m-[m
[31m-        while (m < e && *m != ':') m++;[m
[31m-[m
[31m-        if (m == s) {[m
[31m-            s = m+1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        str = ngx_array_push (a);[m
[31m-        if (str == NULL) {[m
[31m-            return  NULL;[m
[31m-        }[m
[31m-[m
[31m-        str->data = s;[m
[31m-        str->len = m - s;[m
[31m-[m
[31m-        if (ngx_conf_full_name (cf->cycle, str, 0) == NGX_ERROR)[m
[31m-            return  NULL;[m
[31m-[m
[31m-        s = m+1;[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_split_path_create_raw (ngx_conf_t *cf, char *path)[m
[31m-{[m
[31m-    ngx_str_t         *str;[m
[31m-    int                n;[m
[31m-    char              *m, *s;[m
[31m-    ngx_array_t       *a; [m
[31m-[m
[31m-    if (path == NULL)[m
[31m-        return  NULL;[m
[31m-[m
[31m-    n = ndk_strccnt (path, ':');[m
[31m-[m
[31m-    a = ngx_array_create (cf->pool, n + 1, sizeof (ngx_str_t));[m
[31m-    if (a == NULL) {[m
[31m-        return  NULL;[m
[31m-    }[m
[31m-[m
[31m-    s = path;[m
[31m-[m
[31m-[m
[31m-    while (*s != '\0') {[m
[31m-[m
[31m-        m = s;[m
[31m-[m
[31m-        while (*m != '\0' && *m != ':') m++;[m
[31m-[m
[31m-        if (m == s) {[m
[31m-            s = m+1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        str = ngx_array_push (a);[m
[31m-        if (str == NULL) {[m
[31m-            return  NULL;[m
[31m-        }[m
[31m-[m
[31m-        str->data = (u_char *) s;[m
[31m-        str->len = m - s;[m
[31m-[m
[31m-        if (ngx_conf_full_name (cf->cycle, str, 0) == NGX_ERROR)[m
[31m-            return  NULL;[m
[31m-[m
[31m-        if (*m == '\0')[m
[31m-            break;[m
[31m-[m
[31m-        s = m+1;[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_full_path_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t        *path, *value;[m
[31m-    ngx_conf_post_t  *post;[m
[31m-[m
[31m-    path = (ngx_str_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (path->data) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    *path = value[1];[m
[31m-[m
[31m-    if (ngx_conf_full_name (cf->cycle, path, 0) == NGX_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return post->post_handler(cf, post, path);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_split_path_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)     [m
[31m-{[m
[31m-    /* TODO : change to use the path func above */[m
[31m-[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t         *value, *str;[m
[31m-    ngx_array_t      **a;[m
[31m-    ngx_conf_post_t   *post;[m
[31m-    int                n;[m
[31m-    u_char            *m, *s, *e;[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a != NGX_CONF_UNSET_PTR) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    n = ndk_strcntc (value, ':') + 1;[m
[31m-[m
[31m-    *a = ngx_array_create (cf->pool, n, sizeof (ngx_str_t));[m
[31m-    if (*a == NULL) {[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    s = value->data;[m
[31m-    e = s + value->len;[m
[31m-[m
[31m-    while (s < e) {[m
[31m-[m
[31m-        m = s;[m
[31m-[m
[31m-        while (m < e && *m != ':') m++;[m
[31m-[m
[31m-        if (m == s) {[m
[31m-            s = m+1;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        str = ngx_array_push (*a);[m
[31m-        if (str == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        str->data = s;[m
[31m-        str->len = m - s;[m
[31m-[m
[31m-        if (ngx_conf_full_name (cf->cycle, str, 0) == NGX_ERROR)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        s = m+1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_full_path (ngx_conf_t *cf, void *data, ngx_str_t *path)[m
[31m-{[m
[31m-    if (ngx_conf_full_name (cf->cycle, path, 0) == NGX_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_full_conf_path (ngx_conf_t *cf, void *data, ngx_str_t *path)[m
[31m-{[m
[31m-    if (ngx_conf_full_name (cf->cycle, path, 1) == NGX_ERROR)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_path.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_path.h[m
[1mdeleted file mode 100644[m
[1mindex 22ba945..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_path.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* path conversion functions */[m
[31m-[m
[31m-void            ndk_clean_path                  (ngx_str_t *path, ngx_uint_t complex, size_t off);[m
[31m-void            ndk_path_to_dir_safe            (ngx_str_t *path, ngx_uint_t complex, size_t off);[m
[31m-[m
[31m-/* path create functions */[m
[31m-[m
[31m-ngx_array_t *   ndk_split_path_create           (ngx_conf_t *cf, ngx_str_t *path);[m
[31m-ngx_array_t *   ndk_split_path_create_raw       (ngx_conf_t *cf, char *path);[m
[31m-[m
[31m-/* conf set functions */[m
[31m-[m
[31m-char *          ndk_conf_set_full_path_slot     (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *          ndk_conf_set_split_path_slot    (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-/* conf set post functions */[m
[31m-[m
[31m-char *          ndk_conf_set_full_path          (ngx_conf_t *cf, void *data, ngx_str_t *path);[m
[31m-char *          ndk_conf_set_full_conf_path     (ngx_conf_t *cf, void *data, ngx_str_t *path);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_process.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_process.c[m
[1mdeleted file mode 100644[m
[1mindex fbc789c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_process.c[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_init_signals (ngx_signal_t *sig, ngx_log_t *log)[m
[31m-{[m
[31m-    struct sigaction   sa;[m
[31m-[m
[31m-    for ( ; sig->signo != 0; sig++) {[m
[31m-        ndk_zerov (sa);[m
[31m-        sa.sa_handler = sig->handler;[m
[31m-        sigemptyset (&sa.sa_mask);[m
[31m-        [m
[31m-        if (sigaction (sig->signo, &sa, NULL) == -1) {[m
[31m-            ngx_log_error (NGX_LOG_EMERG, log, ngx_errno,[m
[31m-                          "sigaction(%s) failed", sig->signame);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_process.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_process.h[m
[1mdeleted file mode 100644[m
[1mindex 7ac1d99..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_process.h[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int     signo;[m
[31m-    char   *signame;[m
[31m-    char   *name;[m
[31m-    void  (*handler)(int signo);[m
[31m-} ngx_signal_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ndk_init_signals    (ngx_signal_t *sig, ngx_log_t *log);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_regex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_regex.c[m
[1mdeleted file mode 100644[m
[1mindex d5893df..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_regex.c[m
[1m+++ /dev/null[m
[36m@@ -1,215 +0,0 @@[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_regex_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_conf_post_t         *post;[m
[31m-    ngx_regex_elt_t         *re;   [m
[31m-    ngx_regex_compile_t      rc;[m
[31m-    u_char                   errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    re = (ngx_regex_elt_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (re->name) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    ndk_zerov (rc);[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-    rc.pattern = *value;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = rc.regex;[m
[31m-    re->name = value->data;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, re);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m- [m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_regex_caseless_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_conf_post_t         *post;[m
[31m-    ngx_regex_elt_t         *re;   [m
[31m-    ngx_regex_compile_t      rc;[m
[31m-    u_char                   errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    re = (ngx_regex_elt_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (re->name) {[m
[31m-        return  "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    ndk_zerov (rc);[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-    rc.pattern = *value;[m
[31m-    rc.options = NGX_REGEX_CASELESS;[m
[31m-[m
[31m-    if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    re->regex = rc.regex;[m
[31m-    re->name = value->data;[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, re);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_regex_array_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_conf_post_t         *post;[m
[31m-    ngx_array_t            **a;[m
[31m-    ngx_regex_elt_t         *re;   [m
[31m-    ngx_regex_compile_t      rc;[m
[31m-    ngx_uint_t               i, n;[m
[31m-    u_char                   errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        n = cf->args->nelts > 4 ? cf->args->nelts : 4;[m
[31m-[m
[31m-        *a = ngx_array_create (cf->pool, n, sizeof (ngx_regex_elt_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ndk_zerov (rc);[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    for (i=0; i<n; i++, value++) {[m
[31m-[m
[31m-        re = ngx_array_push (*a);[m
[31m-        if (re == NULL)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        rc.pattern = *value;[m
[31m-[m
[31m-        if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        re->regex = rc.regex;[m
[31m-        re->name = value->data;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_conf_set_regex_array_caseless_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char  *p = conf;[m
[31m-[m
[31m-    ngx_str_t               *value;[m
[31m-    ngx_conf_post_t         *post;[m
[31m-    ngx_array_t            **a;[m
[31m-    ngx_regex_elt_t         *re;   [m
[31m-    ngx_regex_compile_t      rc;[m
[31m-    ngx_uint_t               i, n;[m
[31m-    u_char                   errstr[NGX_MAX_CONF_ERRSTR];[m
[31m-[m
[31m-    a = (ngx_array_t **) (p + cmd->offset);[m
[31m-[m
[31m-    if (*a != NGX_CONF_UNSET_PTR) {[m
[31m-[m
[31m-        n = cf->args->nelts > 4 ? cf->args->nelts : 4;[m
[31m-[m
[31m-        *a = ngx_array_create (cf->pool, n, sizeof (ngx_regex_elt_t));[m
[31m-        if (*a == NULL) {[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ndk_zerov (rc);[m
[31m-[m
[31m-    rc.pool = cf->pool;[m
[31m-    rc.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    rc.err.data = errstr;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    for (i=0; i<n; i++, value++) {[m
[31m-[m
[31m-        re = ngx_array_push (*a);[m
[31m-        if (re == NULL)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        rc.pattern = *value;[m
[31m-        rc.options = NGX_REGEX_CASELESS;[m
[31m-[m
[31m-        if (ngx_regex_compile(&rc) != NGX_OK) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        re->regex = rc.regex;[m
[31m-        re->name = value->data;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    if (cmd->post) {[m
[31m-        post = cmd->post;[m
[31m-        return  post->post_handler (cf, post, a);[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_regex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_regex.h[m
[1mdeleted file mode 100644[m
[1mindex 4319b04..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_regex.h[m
[1m+++ /dev/null[m
[36m@@ -1,7 +0,0 @@[m
[31m-[m
[31m-[m
[31m-char *  ndk_conf_set_regex_slot                 (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_regex_caseless_slot        (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_regex_array_slot           (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_conf_set_regex_array_caseless_slot  (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_rewrite.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_rewrite.c[m
[1mdeleted file mode 100644[m
[1mindex 77ce9f8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_rewrite.c[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* these have been taken from the rewrite module and http_script file[m
[31m- * because those functions are defined as being static - a patch will[m
[31m- * be provided later to un-define them as being static[m
[31m- */[m
[31m-[m
[31m-[m
[31m-uintptr_t ndk_http_script_exit_code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_http_rewrite_value (ngx_conf_t *cf, ndk_http_rewrite_loc_conf_t *lcf,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t                              n;[m
[31m-    ngx_http_script_compile_t              sc;[m
[31m-    ngx_http_script_value_code_t          *val;[m
[31m-    ngx_http_script_complex_value_code_t  *complex;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(value);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        val = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                         sizeof(ngx_http_script_value_code_t));[m
[31m-        if (val == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_atoi(value->data, value->len);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            n = 0;[m
[31m-        }[m
[31m-[m
[31m-        val->code = ngx_http_script_value_code;[m
[31m-        val->value = (uintptr_t) n;[m
[31m-        val->text_len = (uintptr_t) value->len;[m
[31m-        val->text_data = (uintptr_t) value->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    complex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                 sizeof(ngx_http_script_complex_value_code_t));[m
[31m-    if (complex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    complex->code = ngx_http_script_complex_value_code;[m
[31m-    complex->lengths = NULL;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = value;[m
[31m-    sc.lengths = &complex->lengths;[m
[31m-    sc.values = &lcf->codes;[m
[31m-    sc.variables = n;[m
[31m-    sc.complete_lengths = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_http_rewrite_var (ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_variable_t          *var;[m
[31m-    ngx_http_core_main_conf_t    *cmcf;[m
[31m-    ndk_http_rewrite_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (rlcf->uninitialized_variable_warn == 0) {[m
[31m-        *v = ngx_http_variable_null_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    var = cmcf->variables.elts;[m
[31m-[m
[31m-    /*[m
[31m-     * the ngx_http_rewrite_module sets variables directly in r->variables,[m
[31m-     * and they should be handled by ngx_http_get_indexed_variable(),[m
[31m-     * so the handler is called only if the variable is not initialized[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                  "using uninitialized \"%V\" variable", &var[data].name);[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_rewrite.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_rewrite.h[m
[1mdeleted file mode 100644[m
[1mindex 2479aa2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_rewrite.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : should remove this when not needed */[m
[31m-[m
[31m-[m
[31m-[m
[31m-/* used for plugging into the rewrite module (taken from the rewrite module) */[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t  *codes;        /* uintptr_t */[m
[31m-    ngx_uint_t    stack_size;[m
[31m-    ngx_flag_t    log;[m
[31m-    ngx_flag_t    uninitialized_variable_warn;[m
[31m-} ndk_http_rewrite_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-extern  ngx_module_t    ngx_http_rewrite_module;[m
[31m-extern  uintptr_t       ndk_http_script_exit_code;[m
[31m-[m
[31m-char *      ndk_http_rewrite_value      (ngx_conf_t *cf, ndk_http_rewrite_loc_conf_t *lcf,[m
[31m-                                            ngx_str_t *value);[m
[31m-ngx_int_t   ndk_http_rewrite_var        (ngx_http_request_t *r, [m
[31m-                                            ngx_http_variable_value_t *v, uintptr_t data);[m
[31m-[m
[31m-#define     ndk_http_script_exit  (u_char *) &ndk_http_script_exit_code[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_set_var.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_set_var.c[m
[1mdeleted file mode 100644[m
[1mindex 388f873..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_set_var.c[m
[1m+++ /dev/null[m
[36m@@ -1,602 +0,0 @@[m
[31m-#include    <ndk.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    void                       *func;[m
[31m-} ndk_set_var_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    void                       *func;[m
[31m-    size_t                      size;[m
[31m-} ndk_set_var_size_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    void                       *func;[m
[31m-    void                       *data;[m
[31m-} ndk_set_var_data_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt     code;[m
[31m-    void                       *func;[m
[31m-    size_t                      size;[m
[31m-    void                       *data;[m
[31m-} ndk_set_var_size_data_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                        index;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_http_variable_t             *v;[m
[31m-    ngx_conf_t                      *cf;[m
[31m-    ndk_http_rewrite_loc_conf_t     *rlcf;[m
[31m-} ndk_set_var_info_t;[m
[31m-[m
[31m-[m
[31m-static void     ndk_set_var_code           (ngx_http_script_engine_t *e);[m
[31m-static void     ndk_set_var_hash_code      (ngx_http_script_engine_t *e);[m
[31m-static void     ndk_set_var_value_code     (ngx_http_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ndk_set_var_code_finalize(ngx_http_script_engine_t *e, ngx_int_t rc,[m
[31m-                                ngx_http_variable_value_t *v, ngx_str_t *str)[m
[31m-{[m
[31m-    switch (rc) {[m
[31m-[m
[31m-    case NGX_OK:[m
[31m-[m
[31m-        v->data = str->data;[m
[31m-        v->len = str->len;[m
[31m-        v->valid = 1;[m
[31m-        v->no_cacheable = 0;[m
[31m-        v->not_found = 0;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                        "http script value (post filter): \"%v\"", v);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_DECLINED:[m
[31m-[m
[31m-        v->valid = 0;[m
[31m-        v->not_found = 1;[m
[31m-        v->no_cacheable = 1;[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_ERROR:[m
[31m-[m
[31m-        e->ip = ndk_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        break;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_code_t          *sv;[m
[31m-    ndk_set_var_pt               func;[m
[31m-[m
[31m-    sv = (ndk_set_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_code_t);[m
[31m-[m
[31m-    v = e->sp++;[m
[31m-[m
[31m-    func = (ndk_set_var_pt) sv->func;[m
[31m-[m
[31m-    rc = func(e->request, &str);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_data_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_data_code_t     *svd;[m
[31m-    ndk_set_var_data_pt          func;[m
[31m-[m
[31m-    svd = (ndk_set_var_data_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_data_code_t);[m
[31m-[m
[31m-    v = e->sp++;[m
[31m-[m
[31m-    func = (ndk_set_var_data_pt) svd->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, svd->data);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_value_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_code_t          *sv;[m
[31m-    ndk_set_var_value_pt         func;[m
[31m-[m
[31m-    sv = (ndk_set_var_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_code_t);[m
[31m-[m
[31m-    v = e->sp - 1;[m
[31m-[m
[31m-    func = (ndk_set_var_value_pt) sv->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, v);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_value_data_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_data_code_t     *svd;[m
[31m-    ndk_set_var_value_data_pt    func;[m
[31m-[m
[31m-    svd = (ndk_set_var_data_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_data_code_t);[m
[31m-[m
[31m-    v = e->sp - 1;[m
[31m-[m
[31m-    func = (ndk_set_var_value_data_pt) svd->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, v, svd->data);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_multi_value_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_str_t                    str;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_size_code_t     *svs;[m
[31m-    ndk_set_var_value_pt         func;[m
[31m-[m
[31m-    svs = (ndk_set_var_size_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_size_code_t);[m
[31m-[m
[31m-    v = e->sp - svs->size;[m
[31m-    e->sp = v + 1;[m
[31m-[m
[31m-    func = (ndk_set_var_value_pt) svs->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, v);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_multi_value_data_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_str_t                        str;[m
[31m-    ngx_http_variable_value_t       *v;[m
[31m-    ndk_set_var_size_data_code_t    *svsd;[m
[31m-    ndk_set_var_value_data_pt        func;[m
[31m-[m
[31m-    svsd = (ndk_set_var_size_data_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_size_data_code_t);[m
[31m-[m
[31m-    v = e->sp - svsd->size;[m
[31m-    e->sp = v + 1;[m
[31m-[m
[31m-    func = (ndk_set_var_value_data_pt) svsd->func;[m
[31m-[m
[31m-    rc = func(e->request, &str, v, svsd->data);[m
[31m-[m
[31m-    ndk_set_var_code_finalize(e, rc, v, &str);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_var_hash_code(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_http_variable_value_t   *v;[m
[31m-    ndk_set_var_size_code_t     *svs;[m
[31m-    ndk_set_var_hash_pt          func;[m
[31m-[m
[31m-    svs = (ndk_set_var_size_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ndk_set_var_size_code_t);[m
[31m-[m
[31m-    p = ngx_palloc(e->request->pool, svs->size);[m
[31m-    if (p == NULL) {[m
[31m-        e->ip = ndk_http_script_exit;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    v = e->sp - 1;[m
[31m-[m
[31m-    func = (ndk_set_var_hash_pt) svs->func;[m
[31m-[m
[31m-    func(p, (char *) v->data, v->len);[m
[31m-[m
[31m-    v->data = (u_char *) p;[m
[31m-    v->len = svs->size;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,[m
[31m-                   "http script hashed value: \"%v\"", v);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ndk_set_var_name(ndk_set_var_info_t *info, ngx_str_t *varname)[m
[31m-{[m
[31m-    ngx_int_t                        index;[m
[31m-    ngx_http_variable_t             *v;[m
[31m-    ngx_conf_t                      *cf;[m
[31m-    ndk_http_rewrite_loc_conf_t     *rlcf;[m
[31m-    ngx_str_t                        name;[m
[31m-[m
[31m-    name = *varname;[m
[31m-[m
[31m-    cf = info->cf;[m
[31m-    rlcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (name.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid variable name \"%V\"", &name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name.len--;[m
[31m-    name.data++;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, &name);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->get_handler == NULL[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "arg_", 4) != 0[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "cookie_", 7) != 0[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "http_", 5) != 0[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "sent_http_", 10) != 0[m
[31m-        && ngx_strncasecmp(name.data, (u_char *) "upstream_http_", 14) != 0)[m
[31m-    {[m
[31m-        v->get_handler = ndk_http_rewrite_var;[m
[31m-        v->data = index;[m
[31m-    }[m
[31m-[m
[31m-    info->v = v;[m
[31m-    info->index = index;[m
[31m-    info->rlcf = rlcf;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ndk_set_variable_value_space(ndk_http_rewrite_loc_conf_t *rlcf, ngx_uint_t count)[m
[31m-{[m
[31m-    /* if the number of variable values that will be used is greater than 10,[m
[31m-     * make sure there is enough space allocated on the rewrite value stack[m
[31m-     */[m
[31m-[m
[31m-    if (count <= 10)[m
[31m-        return;[m
[31m-[m
[31m-    if (rlcf->stack_size == NGX_CONF_UNSET_UINT) {[m
[31m-        rlcf->stack_size = count;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rlcf->stack_size < count)[m
[31m-        rlcf->stack_size = count;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ndk_set_var_filter(ngx_conf_t *cf, ndk_http_rewrite_loc_conf_t *rlcf,[m
[31m-    ndk_set_var_t *filter)[m
[31m-{[m
[31m-    ndk_set_var_code_t             *sv;[m
[31m-    ndk_set_var_size_code_t        *svs;[m
[31m-    ndk_set_var_data_code_t        *svd;[m
[31m-    ndk_set_var_size_data_code_t   *svsd;[m
[31m-[m
[31m-    if (filter == NULL) {[m
[31m-        return "no filter set";[m
[31m-    }[m
[31m-[m
[31m-    switch (filter->type) {[m
[31m-    case NDK_SET_VAR_BASIC:[m
[31m-[m
[31m-        sv = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                         sizeof(ndk_set_var_code_t));[m
[31m-        if (sv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sv->code = ndk_set_var_code;[m
[31m-        sv->func = filter->func;[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_DATA:[m
[31m-[m
[31m-        svd = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                         sizeof(ndk_set_var_data_code_t));[m
[31m-        if (svd == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svd->code = ndk_set_var_data_code;[m
[31m-        svd->func = filter->func;[m
[31m-        svd->data = filter->data;[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_VALUE:[m
[31m-[m
[31m-        sv = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                         sizeof(ndk_set_var_code_t));[m
[31m-        if (sv == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        sv->code = ndk_set_var_value_code;[m
[31m-        sv->func = filter->func;[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_VALUE_DATA:[m
[31m-[m
[31m-        svd = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                         sizeof(ndk_set_var_data_code_t));[m
[31m-        if (svd == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svd->code = ndk_set_var_value_data_code;[m
[31m-        svd->func = filter->func;[m
[31m-        svd->data = filter->data;[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_MULTI_VALUE:[m
[31m-[m
[31m-        svs = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                          sizeof(ndk_set_var_size_code_t));[m
[31m-        if (svs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svs->code = ndk_set_var_multi_value_code;[m
[31m-        svs->func = filter->func;[m
[31m-        svs->size = filter->size;[m
[31m-[m
[31m-        ndk_set_variable_value_space(rlcf, svs->size);[m
[31m-        break;[m
[31m-[m
[31m-    case NDK_SET_VAR_MULTI_VALUE_DATA:[m
[31m-[m
[31m-        svsd = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                          sizeof(ndk_set_var_size_data_code_t));[m
[31m-        if (svsd == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svsd->code = ndk_set_var_multi_value_data_code;[m
[31m-        svsd->func = filter->func;[m
[31m-        svsd->size = filter->size;[m
[31m-        svsd->data = filter->data;[m
[31m-[m
[31m-        ndk_set_variable_value_space(rlcf, svsd->size);[m
[31m-        break;[m
[31m-[m
[31m-[m
[31m-    case NDK_SET_VAR_HASH:[m
[31m-[m
[31m-        svs = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                          sizeof(ndk_set_var_size_code_t));[m
[31m-        if (svs == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        svs->code = ndk_set_var_hash_code;[m
[31m-        svs->func = filter->func;[m
[31m-        svs->size = filter->size;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid filter type \"%ul\"", filter->type);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ndk_set_var_filter_value(ndk_set_var_info_t *info, ndk_set_var_t *filter)[m
[31m-{[m
[31m-    ngx_conf_t                          *cf;[m
[31m-    ngx_http_variable_t                 *v;[m
[31m-    ndk_http_rewrite_loc_conf_t         *rlcf;[m
[31m-    ngx_http_script_var_code_t          *vcode;[m
[31m-    ngx_http_script_var_handler_code_t  *vhcode;[m
[31m-[m
[31m-    v = info->v;[m
[31m-    cf = info->cf;[m
[31m-    rlcf = info->rlcf;[m
[31m-[m
[31m-    if (ndk_set_var_filter(cf, rlcf, filter) != NGX_CONF_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->set_handler) {[m
[31m-        vhcode = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                   sizeof(ngx_http_script_var_handler_code_t));[m
[31m-        if (vhcode == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        vhcode->code = ngx_http_script_var_set_handler_code;[m
[31m-        vhcode->handler = v->set_handler;[m
[31m-        vhcode->data = v->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    vcode = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                       sizeof(ngx_http_script_var_code_t));[m
[31m-    if (vcode == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vcode->code = ngx_http_script_set_var_code;[m
[31m-    vcode->index = (uintptr_t) info->index;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_core(ngx_conf_t *cf, ngx_str_t *name, ndk_set_var_t *filter)[m
[31m-{[m
[31m-    char                    *p;[m
[31m-    ndk_set_var_info_t       info;[m
[31m-[m
[31m-    info.cf = cf;[m
[31m-[m
[31m-    p = ndk_set_var_name(&info, name);[m
[31m-    if (p != NGX_CONF_OK) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_filter_value(&info, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_value_core(ngx_conf_t *cf, ngx_str_t *name, ngx_str_t *value, ndk_set_var_t *filter)[m
[31m-{[m
[31m-    char                    *p;[m
[31m-    ndk_set_var_info_t       info;[m
[31m-[m
[31m-    info.cf = cf;[m
[31m-[m
[31m-    p = ndk_set_var_name(&info, name);[m
[31m-    if (p != NGX_CONF_OK) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    p = ndk_http_rewrite_value(cf, info.rlcf, value);[m
[31m-    if (p != NGX_CONF_OK) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_filter_value(&info, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_multi_value_core(ngx_conf_t *cf, ngx_str_t *name,[m
[31m-        ngx_str_t *value, ndk_set_var_t *filter)[m
[31m-{[m
[31m-    char                    *p;[m
[31m-    ndk_set_var_info_t       info;[m
[31m-    ngx_int_t                i;[m
[31m-[m
[31m-    info.cf = cf;[m
[31m-[m
[31m-    p = ndk_set_var_name(&info, name);[m
[31m-    if (p != NGX_CONF_OK) {[m
[31m-        return p;[m
[31m-    }[m
[31m-[m
[31m-    for (i = filter->size; i; i--, value++) {[m
[31m-[m
[31m-        p = ndk_http_rewrite_value(cf, info.rlcf, value);[m
[31m-        if (p != NGX_CONF_OK) {[m
[31m-            return p;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ndk_set_var_filter_value(&info, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t      *filter;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    filter = (ndk_set_var_t *) cmd->post;[m
[31m-[m
[31m-    return ndk_set_var_core(cf, value, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t           *filter;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    filter = (ndk_set_var_t *) cmd->post;[m
[31m-[m
[31m-    return ndk_set_var_value_core(cf, value,[m
[31m-            cf->args->nelts == 1 + 1 ? value : value + 1, filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ndk_set_var_multi_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t               *value;[m
[31m-    ndk_set_var_t      *filter;[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    filter = (ndk_set_var_t *) cmd->post;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, value, value + 1, filter);[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_set_var.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_set_var.h[m
[1mdeleted file mode 100644[m
[1mindex 5dcba97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_set_var.h[m
[1m+++ /dev/null[m
[36m@@ -1,44 +0,0 @@[m
[31m-/*[m
[31m- * 2010 (C) Marcus Clyne[m
[31m- */[m
[31m-[m
[31m-#ifndef _NDK_SET_VAR_H_INCLUDED_[m
[31m-#define _NDK_SET_VAR_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t   (*ndk_set_var_pt)              (ngx_http_request_t *r, ngx_str_t *val);[m
[31m-typedef ngx_int_t   (*ndk_set_var_data_pt)         (ngx_http_request_t *r, ngx_str_t *val, void *data);[m
[31m-typedef ngx_int_t   (*ndk_set_var_value_pt)        (ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v);[m
[31m-typedef ngx_int_t   (*ndk_set_var_value_data_pt)   (ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v, void *data);[m
[31m-typedef void        (*ndk_set_var_hash_pt)         (u_char *p, char *data, size_t len);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t      type;[m
[31m-    void           *func;[m
[31m-    size_t          size;[m
[31m-    void           *data;[m
[31m-} ndk_set_var_t;[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NDK_SET_VAR_BASIC = 0,[m
[31m-    NDK_SET_VAR_DATA,[m
[31m-    NDK_SET_VAR_VALUE,[m
[31m-    NDK_SET_VAR_VALUE_DATA,[m
[31m-    NDK_SET_VAR_MULTI_VALUE,[m
[31m-    NDK_SET_VAR_MULTI_VALUE_DATA,[m
[31m-    NDK_SET_VAR_HASH[m
[31m-};[m
[31m-[m
[31m-[m
[31m-char *  ndk_set_var                    (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_set_var_value              (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *  ndk_set_var_multi_value        (ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-[m
[31m-char *  ndk_set_var_core               (ngx_conf_t *cf, ngx_str_t *name, ndk_set_var_t *filter);[m
[31m-char *  ndk_set_var_value_core         (ngx_conf_t *cf, ngx_str_t *name, ngx_str_t *value, ndk_set_var_t *filter);[m
[31m-char *  ndk_set_var_multi_value_core   (ngx_conf_t *cf, ngx_str_t *name, ngx_str_t *value, ndk_set_var_t *filter);[m
[31m-[m
[31m-#endif /* _NDK_SET_VAR_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string.c[m
[1mdeleted file mode 100644[m
[1mindex 7c2a965..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string.c[m
[1m+++ /dev/null[m
[36m@@ -1,434 +0,0 @@[m
[31m-[m
[31m-[m
[31m-int64_t[m
[31m-ndk_atoi64 (u_char *line, size_t n)[m
[31m-{[m
[31m-    int64_t  value;[m
[31m-[m
[31m-    if (n == 0ll) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (value = 0ll; n--; line++) {[m
[31m-        if (*line < '0' || *line > '9') {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value = value * 10ll + (*line - '0');[m
[31m-    }[m
[31m-[m
[31m-    if (value < 0ll) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return value;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_strcntc (ngx_str_t *s, char c)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-    size_t      i;[m
[31m-    u_char     *p;[m
[31m-[m
[31m-    i = s->len;[m
[31m-    p = s->data;[m
[31m-[m
[31m-    for (n=0; i; i--, p++) {[m
[31m-[m
[31m-        if (*p == (u_char) c)[m
[31m-            n++;[m
[31m-    }[m
[31m-[m
[31m-    return  n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_strccnt (char *s, char c)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    while (*s != '\0') {[m
[31m-[m
[31m-        if (*s == 'c')[m
[31m-            n++;[m
[31m-[m
[31m-        s++;[m
[31m-    }[m
[31m-[m
[31m-    return  n;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-ngx_array_t *[m
[31m-ndk_str_array_create (ngx_pool_t *pool, char **s, ngx_int_t n)[m
[31m-{[m
[31m-    ngx_int_t        i;[m
[31m-    ngx_str_t       *str;[m
[31m-    ngx_array_t     *a;[m
[31m-[m
[31m-    a = ngx_array_create (pool, n, sizeof (ngx_str_t));[m
[31m-    if (a == NULL)[m
[31m-        return  NULL;[m
[31m-[m
[31m-[m
[31m-    for (i=0; i<n; i++, s++) {[m
[31m-[m
[31m-        str = ngx_array_push (a);[m
[31m-[m
[31m-        str->data = (u_char *) *s;[m
[31m-        str->len = strlen (*s);[m
[31m-    }[m
[31m-[m
[31m-    return  a;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ndk_vcatstrf (ngx_pool_t *pool, ngx_str_t *dest, const char *fmt, va_list args)[m
[31m-{[m
[31m-    size_t          len, l, el;[m
[31m-    int             argc;[m
[31m-    u_char         *p, *m, *e, c, c1, *cp;[m
[31m-[m
[31m-    argc = strlen (fmt);[m
[31m-[m
[31m-    ngx_str_t      *s;[m
[31m-    ndk_estr_t     *sp, *sp2, ss [argc];[m
[31m-    u_char        cs [argc];[m
[31m-[m
[31m-    sp = sp2 = ss;[m
[31m-    cp = cs;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    /* TODO : maybe have 'e' at the beginning? */[m
[31m-[m
[31m-    /* parse format to get strings */[m
[31m-[m
[31m-    while (*fmt) {[m
[31m-[m
[31m-        switch (*fmt) {[m
[31m-[m
[31m-        case    'S'     :[m
[31m-[m
[31m-            s = va_arg (args, ngx_str_t *);[m
[31m-[m
[31m-            sp->data = s->data;[m
[31m-            sp->len = s->len;[m
[31m-            sp->escaped = 0;[m
[31m-[m
[31m-            len += sp->len;[m
[31m-            break;[m
[31m-[m
[31m-        case    's'     :[m
[31m-[m
[31m-            sp->data = va_arg (args, u_char *);[m
[31m-            sp->len = (size_t) ngx_strlen (sp->data);[m
[31m-            sp->escaped = 0;[m
[31m-[m
[31m-            len += sp->len;[m
[31m-            break;[m
[31m-[m
[31m-        case    'l'     :[m
[31m-[m
[31m-            sp->data = va_arg (args, u_char *);[m
[31m-            sp->len = (size_t) va_arg (args, int);[m
[31m-            sp->escaped = 0;[m
[31m-[m
[31m-            len += sp->len;[m
[31m-            break;[m
[31m-[m
[31m-        case    'L'     :[m
[31m-[m
[31m-            sp->data = va_arg (args, u_char *);[m
[31m-            sp->len = va_arg (args, size_t);[m
[31m-            sp->escaped = 0;[m
[31m-[m
[31m-            len += sp->len;[m
[31m-            break;[m
[31m-[m
[31m-        case    'e' :[m
[31m-[m
[31m-            p = va_arg (args, u_char *);[m
[31m-[m
[31m-            sp->data = p;[m
[31m-[m
[31m-            l = 0;[m
[31m-            el = 0;[m
[31m-            c = *p;[m
[31m-[m
[31m-            while (c != '\0') {[m
[31m-[m
[31m-                if (c == '\\') {[m
[31m-                    l += 2;[m
[31m-                    p += 2;[m
[31m-                } else {[m
[31m-                    l++;[m
[31m-                    p++;[m
[31m-                }[m
[31m-[m
[31m-                el++; [m
[31m-                c = *p;[m
[31m-            }[m
[31m-[m
[31m-            sp->len = l;[m
[31m-            sp->escaped = 1;[m
[31m-[m
[31m-            len += el;[m
[31m-            break;[m
[31m-[m
[31m-        case    'E' :[m
[31m-[m
[31m-            s = va_arg (args, ngx_str_t *);[m
[31m-[m
[31m-            sp->data = s->data;[m
[31m-            sp->len = s->len;[m
[31m-[m
[31m-            p = sp->data;[m
[31m-[m
[31m-            el = 0;[m
[31m-            e = p + sp->len;[m
[31m-[m
[31m-            while (p < e) {[m
[31m-[m
[31m-                c = *p;[m
[31m-[m
[31m-                if (c == '\\') {[m
[31m-                    p += 2;[m
[31m-                } else {[m
[31m-                    p++;[m
[31m-                }[m
[31m-[m
[31m-                el++;                    [m
[31m-            }[m
[31m-[m
[31m-            sp->escaped = 1;[m
[31m-[m
[31m-            len += el;[m
[31m-            break;[m
[31m-[m
[31m-        case    'n' :[m
[31m-[m
[31m-            sp->data = va_arg (args, u_char *);[m
[31m-            sp->len = (size_t) va_arg (args, int);[m
[31m-[m
[31m-            p = sp->data;[m
[31m-[m
[31m-            el = 0;[m
[31m-            e = p + sp->len;[m
[31m-[m
[31m-            while (p < e) {[m
[31m-[m
[31m-                c = *p;[m
[31m-[m
[31m-                if (c == '\\') {[m
[31m-                    p += 2;[m
[31m-                } else {[m
[31m-                    p++;[m
[31m-                }[m
[31m-[m
[31m-                el++;                    [m
[31m-            }[m
[31m-[m
[31m-            sp->escaped = 1;[m
[31m-[m
[31m-            len += el;[m
[31m-            break;[m
[31m-[m
[31m-        case    'c' :[m
[31m-[m
[31m-            *cp = (u_char) va_arg (args, int);[m
[31m-[m
[31m-            sp->data = cp;[m
[31m-            sp->len = (size_t) 1;[m
[31m-[m
[31m-            len++;[m
[31m-            cp++;[m
[31m-[m
[31m-            break; [m
[31m-[m
[31m-        default         :[m
[31m-[m
[31m-            ndk_log_alert (pool->log, 0, "catstrf () : format [%s] incorrect", fmt);[m
[31m-[m
[31m-            return  NULL;[m
[31m-[m
[31m-        }[m
[31m-[m
[31m-        sp++;[m
[31m-        fmt++;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-    /* create space for string (assumes no NULL's in strings) */[m
[31m-[m
[31m-    ndk_palloc_rn (p, pool, len + 1);[m
[31m-[m
[31m-    dest->data = p;[m
[31m-    dest->len = len;[m
[31m-[m
[31m-    /* copy other strings */[m
[31m-[m
[31m-    if (len) {[m
[31m-[m
[31m-        while (sp2 < sp) {[m
[31m-[m
[31m-            if (sp2->escaped) {[m
[31m-[m
[31m-                m = sp2->data;[m
[31m-                e = m + sp2->len;[m
[31m-[m
[31m-                while (m < e) {[m
[31m-[m
[31m-                    c = *m;[m
[31m-[m
[31m-                    if (c == '\\') {[m
[31m-[m
[31m-                        if (m == e - 1) {[m
[31m-                            *p = '\\';[m
[31m-                            p++;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        c1 = m[1];[m
[31m-[m
[31m-                        switch (c1) {[m
[31m-[m
[31m-                        case    'n' :[m
[31m-                            *p = '\n';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    't' :[m
[31m-                            *p = '\t';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    '0' :[m
[31m-                            *p = '\0';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    '\\' :[m
[31m-                            *p = '\\';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    's' :[m
[31m-                            *p = ' ';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    'b' :[m
[31m-                            *p = '\b';[m
[31m-                            break;[m
[31m-[m
[31m-                        case    'r' :[m
[31m-                            *p = '\r';[m
[31m-                            break;[m
[31m-[m
[31m-                        default :[m
[31m-[m
[31m-                            *p = c1;[m
[31m-                            break;[m
[31m-                        }[m
[31m-[m
[31m-                        m += 2;[m
[31m-[m
[31m-                    } else {[m
[31m-[m
[31m-                        *p = c;[m
[31m-                        m++;[m
[31m-                    }[m
[31m-[m
[31m-                    p++;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                p = ngx_cpymem (p, sp2->data, sp2->len);[m
[31m-            }[m
[31m-[m
[31m-            sp2++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return  dest->data;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ndk_catstrf (ngx_pool_t *pool, ngx_str_t *dest, const char *fmt, ...)[m
[31m-{[m
[31m-    u_char       *p;[m
[31m-    va_list         args;[m
[31m-[m
[31m-    va_start (args, fmt);[m
[31m-    p = ndk_vcatstrf (pool, dest, fmt, args);[m
[31m-    va_end (args);[m
[31m-[m
[31m-    return  p;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ndk_cmpstr (ngx_str_t *s1, ngx_str_t *s2)[m
[31m-{[m
[31m-    ngx_int_t   rv;[m
[31m-    size_t      len1, len2;[m
[31m-[m
[31m-    len1 = s1->len;[m
[31m-    len2 = s2->len;[m
[31m-[m
[31m-    if (len1 == len2) {[m
[31m-        return  ngx_strncmp (s1->data, s2->data, len1);[m
[31m-    }[m
[31m-[m
[31m-    if (len1 > len2) {[m
[31m-[m
[31m-        rv = ngx_strncmp (s1->data, s2->data, len2);[m
[31m-        if (rv == 0)[m
[31m-            return  1;[m
[31m-[m
[31m-        return  rv;[m
[31m-    }[m
[31m-[m
[31m-    rv = ngx_strncmp (s1->data, s2->data, len1);[m
[31m-    if (rv == 0)[m
[31m-        return  -1;[m
[31m-[m
[31m-    return  rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ndk_dupstr (ngx_pool_t *pool, ngx_str_t *dest, ngx_str_t *src)[m
[31m-{[m
[31m-    u_char       *d;[m
[31m-    size_t       n;[m
[31m-[m
[31m-    n = src->len;[m
[31m-[m
[31m-    ndk_palloc_rn (d, pool, n + 1);[m
[31m-    ndk_strncpy (d, src->data, n);[m
[31m-[m
[31m-    dest->data = d;[m
[31m-    dest->len = n;[m
[31m-[m
[31m-    return  d;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-ngx_keyval_t *[m
[31m-ndk_url_args_to_keyval_list (ngx_pool_t *pool, ngx_str_t *str)[m
[31m-{[m
[31m-    ngx_keyval_t    *kv;[m
[31m-    ngx_st[m
[31m-    [m
[31m-}[m
[31m-*/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string.h[m
[1mdeleted file mode 100644[m
[1mindex ecd21c4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string.h[m
[1m+++ /dev/null[m
[36m@@ -1,37 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#if 1[m
[31m-/* TODO : set ndk_hex_dump for older versions of Nginx */[m
[31m-#define     ndk_hex_dump                    ngx_hex_dump[m
[31m-#endif[m
[31m-[m
[31m-typedef struct {[m
[31m-    size_t          len;[m
[31m-    u_char         *data;[m
[31m-    ngx_flag_t      escaped;[m
[31m-} ndk_estr_t;[m
[31m-[m
[31m-int64_t         ndk_atoi64                  (u_char *line, size_t n);[m
[31m-[m
[31m-ngx_int_t       ndk_strcntc                 (ngx_str_t *s, char c);[m
[31m-ngx_int_t       ndk_strccnt                 (char *s, char c);[m
[31m-ngx_array_t *   ndk_str_array_create        (ngx_pool_t *pool, char **s, ngx_int_t n);[m
[31m-u_char *        ndk_catstrf                 (ngx_pool_t *pool, ngx_str_t *dest, const char *fmt, ...);[m
[31m-ngx_int_t       ndk_cmpstr                  (ngx_str_t *s1, ngx_str_t *s2);[m
[31m-u_char *        ndk_dupstr                  (ngx_pool_t *pool, ngx_str_t *dest, ngx_str_t *src);[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ndk_strtoupper (u_char *p, size_t len)[m
[31m-{[m
[31m-    u_char *e = p + len;[m
[31m-    for ( ; p<e; p++) {[m
[31m-        *p = ngx_toupper(*p);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline u_char *[m
[31m-ndk_strncpy (u_char *d, u_char *s, size_t n)[m
[31m-{[m
[31m-    return  (u_char *) strncpy ((char *) d, (char *) s, n);[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string_util.h[m
[1mdeleted file mode 100644[m
[1mindex d23b8e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_string_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,14 +0,0 @@[m
[31m-[m
[31m-[m
[31m-#define     ndk_str_init(ns,s)              {(ns).data = (u_char*) s; (ns).len = sizeof (s) - 1;}[m
[31m-#define     ndk_strp_init(ns,s)             {(ns)->data = (u_char*) s; (ns)->len = sizeof (s) - 1;}[m
[31m-[m
[31m-#define     ndk_zero(p,sz)                  memset (p,'\0',sz)[m
[31m-#define     ndk_zerop(p)                    ndk_zero (p,sizeof(*p))[m
[31m-#define     ndk_zeropn(p,n)                 ndk_zero (p,sizeof(*p)*(n))[m
[31m-#define     ndk_zerov(v)                    ndk_zero (&v,sizeof(v))[m
[31m-[m
[31m-#define     ngx_null_enum   { ngx_null_string, 0 }[m
[31m-[m
[31m-#define     ndk_memcpyp(d,s)                ngx_memcpy(d,s,sizeof(s))[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_upstream_list.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_upstream_list.c[m
[1mdeleted file mode 100644[m
[1mindex 7381777..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_upstream_list.c[m
[1m+++ /dev/null[m
[36m@@ -1,205 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : generalize this into a generic list module, with weight */[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t      weight;[m
[31m-    ngx_str_t       s;[m
[31m-    ngx_conf_t     *cf;[m
[31m-} ndk_upstream_list_parse_t;[m
[31m-[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ndk_upstream_list_parse_weight (ndk_upstream_list_parse_t *ulp)[m
[31m-{[m
[31m-    size_t      i;[m
[31m-    ngx_str_t   *s;[m
[31m-[m
[31m-    s = &ulp->s;[m
[31m-[m
[31m-    for (i=0; i<s->len; i++) {[m
[31m-[m
[31m-        if (s->data[i] < '0' || s->data[i] > '9')[m
[31m-            break;[m
[31m-    }[m
[31m-[m
[31m-    if (!i) {[m
[31m-        ulp->weight = 1;[m
[31m-        return  NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (i == s->len) {[m
[31m-        ngx_conf_log_error (NGX_LOG_EMERG, ulp->cf, 0,[m
[31m-            "upstream list just consists of number \"%V\"", s);[m
[31m-[m
[31m-        return  NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (s->data[i] != ':') {[m
[31m-        ngx_conf_log_error (NGX_LOG_EMERG, ulp->cf, 0,[m
[31m-            "upstream list not correct format \"%V\"", s);[m
[31m-[m
[31m-        return  NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    ulp->weight = ngx_atoi (s->data, i);[m
[31m-[m
[31m-    s->data += (i + 1);[m
[31m-    s->len -= (i + 1);[m
[31m-[m
[31m-    return  NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ndk_upstream_list (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    /* TODO : change this for getting upstream pointer if available */[m
[31m-[m
[31m-    ngx_uint_t                   buckets, count, i, j;[m
[31m-    ngx_str_t                   *value, **bucket, *us;[m
[31m-    ngx_array_t                 *ula;[m
[31m-    ndk_upstream_list_t         *ul, *ule;[m
[31m-    ndk_upstream_list_parse_t    ulp;[m
[31m-[m
[31m-    ndk_http_main_conf_t        *mcf;[m
[31m-[m
[31m-    mcf = ngx_http_conf_get_module_main_conf (cf, ndk_http_module);[m
[31m-[m
[31m-    ula = mcf->upstreams;[m
[31m-[m
[31m-    /* create array of upstream lists it doesn't already exist */[m
[31m-[m
[31m-    if (ula == NULL) {[m
[31m-[m
[31m-        ula = ngx_array_create (cf->pool, 4, sizeof (ndk_upstream_list_t));[m
[31m-        if (ula == NULL)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        mcf->upstreams = ula;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* check to see if the list already exists */[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-    value++;[m
[31m-[m
[31m-    ul = ula->elts;[m
[31m-    ule = ul + ula->nelts;[m
[31m-[m
[31m-    for ( ; ul<ule; ul++) {[m
[31m-[m
[31m-        if (ul->name.len == value->len &&[m
[31m-            ngx_strncasecmp (ul->name.data, value->data, value->len) == 0) {[m
[31m-[m
[31m-            ngx_conf_log_error (NGX_LOG_EMERG, cf, 0,[m
[31m-                           "duplicate upstream list name \"%V\"", value);[m
[31m-[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* create a new list */[m
[31m-[m
[31m-    ul = ngx_array_push (ula);[m
[31m-    if (ul == NULL)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    ul->name = *value;[m
[31m-[m
[31m-[m
[31m-[m
[31m-    /* copy all the upstream names */[m
[31m-[m
[31m-    count = cf->args->nelts - 2;[m
[31m-[m
[31m-    us = ngx_palloc (cf->pool, count * sizeof (ngx_str_t));[m
[31m-    if (us == NULL)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    ngx_memcpy (us, value + 1, count * sizeof (ngx_str_t));[m
[31m-[m
[31m-[m
[31m-    /* calculate the total number of buckets */[m
[31m-[m
[31m-    buckets = 0;[m
[31m-[m
[31m-    ulp.cf = cf;[m
[31m-[m
[31m-    for (i=0; i<count; i++, us++) {[m
[31m-[m
[31m-        ulp.s = *us;[m
[31m-[m
[31m-        if (ndk_upstream_list_parse_weight (&ulp) != NGX_OK)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        buckets += ulp.weight;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-    /* allocate space for all buckets */[m
[31m-[m
[31m-    bucket = ngx_palloc (cf->pool, buckets * sizeof (ngx_str_t **));[m
[31m-    if (bucket == NULL)[m
[31m-        return  NGX_CONF_ERROR;[m
[31m-[m
[31m-    ul->elts = bucket;[m
[31m-    ul->nelts = buckets;[m
[31m-[m
[31m-[m
[31m-    /* set values for each bucket */[m
[31m-[m
[31m-    us -= count;[m
[31m-[m
[31m-    for (i=0; i<count; i++, us++) {[m
[31m-[m
[31m-        ulp.s = *us;[m
[31m-[m
[31m-        if (ndk_upstream_list_parse_weight (&ulp) != NGX_OK)[m
[31m-            return  NGX_CONF_ERROR;[m
[31m-[m
[31m-        us->data = ulp.s.data;[m
[31m-        us->len = ulp.s.len;[m
[31m-[m
[31m-        /* TODO : check format of upstream */[m
[31m-        /* TODO : add automatic adding of http:// in upstreams? */[m
[31m-[m
[31m-        for (j=0; j<ulp.weight; j++, bucket++) {[m
[31m-[m
[31m-            *bucket = us;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return  NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ndk_upstream_list_t *[m
[31m-ndk_get_upstream_list (ndk_http_main_conf_t *mcf, u_char *data, size_t len)[m
[31m-{[m
[31m-    ndk_upstream_list_t         *ul, *ule;[m
[31m-    ngx_array_t                 *ua = mcf->upstreams;[m
[31m-[m
[31m-    if (ua == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ul = ua->elts;[m
[31m-    ule = ul + ua->nelts;[m
[31m-[m
[31m-    for (; ul < ule; ul++) {[m
[31m-        if (ul->name.len == len && ngx_strncasecmp(ul->name.data, data, len) == 0)[m
[31m-        {[m
[31m-            return ul;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_upstream_list.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_upstream_list.h[m
[1mdeleted file mode 100644[m
[1mindex 3786456..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_upstream_list.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-#if (NDK_UPSTREAM_LIST_CMDS)[m
[31m-[m
[31m-/* TODO : use the generated commands */[m
[31m-[m
[31m-{[m
[31m-    ngx_string ("upstream_list"),[m
[31m-    NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_2MORE,[m
[31m-    ndk_upstream_list,[m
[31m-    0,[m
[31m-    0,[m
[31m-    NULL[m
[31m-},[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t       **elts;[m
[31m-    ngx_uint_t        nelts;[m
[31m-    ngx_str_t         name;[m
[31m-} ndk_upstream_list_t;[m
[31m-[m
[31m-[m
[31m-ndk_upstream_list_t *[m
[31m-ndk_get_upstream_list (ndk_http_main_conf_t *mcf, u_char *data, size_t len);[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_uri.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_uri.c[m
[1mdeleted file mode 100644[m
[1mindex 19e90e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_uri.c[m
[1m+++ /dev/null[m
[36m@@ -1,45 +0,0 @@[m
[31m-[m
[31m-[m
[31m-/* TODO : check that this is correct */[m
[31m-[m
[31m-u_char *[m
[31m-ndk_map_uri_to_path_add_suffix (ngx_http_request_t *r, ngx_str_t *path, ngx_str_t *suffix, ngx_int_t dot)[m
[31m-{[m
[31m-    size_t      root_size;[m
[31m-    u_char     *p;[m
[31m-[m
[31m-    if (suffix->len) {[m
[31m-[m
[31m-        if (dot) {[m
[31m-[m
[31m-            p = ngx_http_map_uri_to_path (r, path, &root_size, suffix->len + 1);[m
[31m-[m
[31m-            if (p == NULL)[m
[31m-                return  NULL;[m
[31m-[m
[31m-            *p = '.';[m
[31m-            p++;[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            p = ngx_http_map_uri_to_path (r, path, &root_size, suffix->len);[m
[31m-[m
[31m-            if (p == NULL)[m
[31m-                return  NULL;[m
[31m-        }       [m
[31m-[m
[31m-        path->len--;[m
[31m-[m
[31m-        p = ngx_cpymem (p, suffix->data, suffix->len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        return  p;  [m
[31m-    }[m
[31m-[m
[31m-    p = ngx_http_map_uri_to_path (r, path, &root_size, 0);[m
[31m-[m
[31m-    path->len--;[m
[31m-[m
[31m-    return  p;[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_uri.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_uri.h[m
[1mdeleted file mode 100644[m
[1mindex dac3880..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_devel_kit-0.3.0/src/ndk_uri.h[m
[1m+++ /dev/null[m
[36m@@ -1,6 +0,0 @@[m
[31m-[m
[31m-[m
[31m-[m
[31m-u_char *  ndk_map_uri_to_path_add_suffix  (ngx_http_request_t *r, ngx_str_t *path, ngx_str_t *suffix, ngx_int_t dot);[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex e5cbc8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,169 +0,0 @@[m
[31m-build/[m
[31m-work/[m
[31m-tags[m
[31m-cscope.*[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[789][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/checker.h[m
[31m-src/checker.c[m
[31m-src/quoting.h[m
[31m-src/quoting.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/util.h[m
[31m-src/util.c[m
[31m-src/processor.h[m
[31m-src/processor.c[m
[31m-src/rds.h[m
[31m-src/utils.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-util/bench[m
[31m-*.html[m
[31m-trace.out*[m
[31m-try.sh[m
[31m-src/cache.c[m
[31m-src/cache.h[m
[31m-src/common.h[m
[31m-src/directive.c[m
[31m-src/directive.h[m
[31m-src/consts.[ch][m
[31m-src/contentby.[ch][m
[31m-src/pcrefix.[ch][m
[31m-src/util.c[m
[31m-src/clfactory.c[m
[31m-src/directive.c[m
[31m-src/conf.h[m
[31m-src/setby.h[m
[31m-src/cache.h[m
[31m-src/hook.c[m
[31m-src/util.h[m
[31m-src/hook.h[m
[31m-src/common.h[m
[31m-src/directive.h[m
[31m-src/conf.c[m
[31m-src/setby.c[m
[31m-src/cache.c[m
[31m-src/module.c[m
[31m-src/clfactory.h[m
[31m-src/capturefilter.[ch][m
[31m-src/contentby.c[m
[31m-pack[m
[31m-b.sh[m
[31m-src/in.[ch][m
[31m-src/out.[ch][m
[31m-go[m
[31m-all.sh[m
[31m-src/accessby.[ch][m
[31m-src/rewriteby.[ch][m
[31m-src/patch.[ch][m
[31m-src/ndk.[ch][m
[31m-src/control.[ch][m
[31m-src/output.[ch][m
[31m-src/variable.[ch][m
[31m-src/string.[ch][m
[31m-src/misc.[ch][m
[31m-src/log.[ch][m
[31m-src/exception.[ch][m
[31m-src/subrequest.[ch][m
[31m-src/time.[ch][m
[31m-src/regex.[ch][m
[31m-src/ctx.[ch][m
[31m-src/args.[ch][m
[31m-src/headers.[ch][m
[31m-src/script.[ch][m
[31m-src/filter.[ch][m
[31m-src/shdict.[ch][m
[31m-src/body.[ch][m
[31m-src/uri.[ch][m
[31m-src/api.[ch][m
[31m-src/coroutine.[ch][m
[31m-src/logby.[ch][m
[31m-src/sleep.[ch][m
[31m-a.patch[m
[31m-all[m
[31m-build1[0-9][m
[31m-g[m
[31m-buildroot/[m
[31m-src/headerfilterby.[ch][m
[31m-*.patch[m
[31m-analyze[m
[31m-tsock[m
[31m-a.c[m
[31m-test.lua[m
[31m-build12[m
[31m-ERRORS[m
[31m-src/bodyfilterby.[ch][m
[31m-src/tcp.[ch][m
[31m-src/initby.[ch][m
[31m-src/initworkerby.[ch][m
[31m-src/socket.[ch][m
[31m-src/udp.[ch][m
[31m-src/method.[ch][m
[31m-tre[m
[31m-src/phase.[ch][m
[31m-src/probe.h[m
[31m-src/uthread.[ch][m
[31m-src/timer.[ch][m
[31m-src/config.[ch][m
[31m-src/worker.[ch][m
[31m-src/certby.[ch][m
[31m-src/ocsp.c[m
[31m-src/lex.[ch][m
[31m-src/balancer.[ch][m
[31m-src/semaphore.[ch][m
[31m-*.plist[m
[31m-lua[m
[31m-ttimer[m
[31m-Makefile[m
[31m-tsubreq[m
[31m-tthread[m
[31m-addr2line[m
[31m-hup[m
[31m-theaders[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.travis.yml b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.travis.yml[m
[1mdeleted file mode 100644[m
[1mindex 10bb9ca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/.travis.yml[m
[1m+++ /dev/null[m
[36m@@ -1,118 +0,0 @@[m
[31m-sudo: required[m
[31m-dist: trusty[m
[31m-[m
[31m-os: linux[m
[31m-[m
[31m-language: c[m
[31m-[m
[31m-compiler:[m
[31m-  - gcc[m
[31m-  - clang[m
[31m-[m
[31m-addons:[m
[31m-  apt:[m
[31m-    packages:[m
[31m-    - mysql-server[m
[31m-[m
[31m-cache:[m
[31m-  directories:[m
[31m-  - download-cache[m
[31m-[m
[31m-env:[m
[31m-  global:[m
[31m-    - JOBS=3[m
[31m-    - NGX_BUILD_JOBS=$JOBS[m
[31m-    - LUAJIT_PREFIX=/opt/luajit21[m
[31m-    - LUAJIT_LIB=$LUAJIT_PREFIX/lib[m
[31m-    - LUAJIT_INC=$LUAJIT_PREFIX/include/luajit-2.1[m
[31m-    - LUA_INCLUDE_DIR=$LUAJIT_INC[m
[31m-    - LUA_CMODULE_DIR=/lib[m
[31m-    - PCRE_VER=8.33[m
[31m-    - PCRE_PREFIX=/opt/pcre[m
[31m-    - PCRE_LIB=$PCRE_PREFIX/lib[m
[31m-    - PCRE_INC=$PCRE_PREFIX/include[m
[31m-    - OPENSSL_PREFIX=/opt/ssl[m
[31m-    - OPENSSL_LIB=$OPENSSL_PREFIX/lib[m
[31m-    - OPENSSL_INC=$OPENSSL_PREFIX/include[m
[31m-    - OPENSSL_VER=1.0.2h[m
[31m-    - LIBDRIZZLE_PREFIX=/opt/drizzle[m
[31m-    - LIBDRIZZLE_INC=$LIBDRIZZLE_PREFIX/include/libdrizzle-1.0[m
[31m-    - LIBDRIZZLE_LIB=$LIBDRIZZLE_PREFIX/lib[m
[31m-    - LD_LIBRARY_PATH=$LUAJIT_LIB:$LD_LIBRARY_PATH[m
[31m-    - DRIZZLE_VER=2011.07.21[m
[31m-    - TEST_NGINX_SLEEP=0.006[m
[31m-  matrix:[m
[31m-    - NGINX_VERSION=1.9.15[m
[31m-#    - NGINX_VERSION=1.10.0[m
[31m-[m
[31m-services:[m
[31m- - memcache[m
[31m- - redis-server[m
[31m-[m
[31m-before_install:[m
[31m-  - sudo apt-get install -y axel cpanminus libtest-base-perl libtext-diff-perl liburi-perl libwww-perl libtest-longstring-perl liblist-moreutils-perl libgd-dev[m
[31m-[m
[31m-install:[m
[31m-  - if [ ! -d download-cache ]; then mkdir download-cache; fi[m
[31m-  - if [ ! -f download-cache/drizzle7-$DRIZZLE_VER.tar.gz ]; then wget -O download-cache/drizzle7-$DRIZZLE_VER.tar.gz http://openresty.org/download/drizzle7-$DRIZZLE_VER.tar.gz; fi[m
[31m-  - if [ ! -f download-cache/pcre-$PCRE_VER.tar.gz ]; then wget -O download-cache/pcre-$PCRE_VER.tar.gz http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-$PCRE_VER.tar.gz; fi[m
[31m-  - if [ ! -f download-cache/openssl-$OPENSSL_VER.tar.gz ]; then wget -O download-cache/openssl-$OPENSSL_VER.tar.gz https://www.openssl.org/source/openssl-$OPENSSL_VER.tar.gz; fi[m
[31m-  - git clone https://github.com/openresty/test-nginx.git[m
[31m-  - git clone https://github.com/openresty/openresty.git ../openresty[m
[31m-  - git clone https://github.com/openresty/no-pool-nginx.git ../no-pool-nginx[m
[31m-  - git clone https://github.com/openresty/nginx-devel-utils.git[m
[31m-  - git clone https://github.com/openresty/mockeagain.git[m
[31m-  - git clone https://github.com/openresty/lua-cjson.git[m
[31m-  - git clone https://github.com/openresty/lua-upstream-nginx-module.git ../lua-upstream-nginx-module[m
[31m-  - git clone https://github.com/openresty/echo-nginx-module.git ../echo-nginx-module[m
[31m-  - git clone https://github.com/openresty/nginx-eval-module.git ../nginx-eval-module[m
[31m-  - git clone https://github.com/simpl/ngx_devel_kit.git ../ndk-nginx-module[m
[31m-  - git clone https://github.com/FRiCKLE/ngx_coolkit.git ../coolkit-nginx-module[m
[31m-  - git clone https://github.com/openresty/headers-more-nginx-module.git ../headers-more-nginx-module[m
[31m-  - git clone https://github.com/openresty/drizzle-nginx-module.git ../drizzle-nginx-module[m
[31m-  - git clone https://github.com/openresty/set-misc-nginx-module.git ../set-misc-nginx-module[m
[31m-  - git clone https://github.com/openresty/memc-nginx-module.git ../memc-nginx-module[m
[31m-  - git clone https://github.com/openresty/rds-json-nginx-module.git ../rds-json-nginx-module[m
[31m-  - git clone https://github.com/openresty/srcache-nginx-module.git ../srcache-nginx-module[m
[31m-  - git clone https://github.com/openresty/redis2-nginx-module.git ../redis2-nginx-module[m
[31m-  - git clone -b v2.1-agentzh https://github.com/openresty/luajit2.git[m
[31m-[m
[31m-before_script:[m
[31m-  - mysql -uroot -e 'create database ngx_test; grant all on ngx_test.* to "ngx_test"@"%" identified by "ngx_test"; flush privileges;'[m
[31m-[m
[31m-script:[m
[31m-  - cd luajit2/[m
[31m-  - make -j$JOBS CCDEBUG=-g Q= PREFIX=$LUAJIT_PREFIX CC=$CC XCFLAGS='-DLUA_USE_APICHECK -DLUA_USE_ASSERT' > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make install PREFIX=$LUAJIT_PREFIX > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - tar xzf download-cache/drizzle7-$DRIZZLE_VER.tar.gz && cd drizzle7-$DRIZZLE_VER[m
[31m-  - ./configure --prefix=$LIBDRIZZLE_PREFIX --without-server > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make libdrizzle-1.0 -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make install-libdrizzle-1.0 > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - cd mockeagain/ && make CC=$CC -j$JOBS && cd ..[m
[31m-  - cd test-nginx/ && sudo cpanm . && cd ..[m
[31m-  - cd lua-cjson/ && make -j$JOBS && sudo make install && cd ..[m
[31m-  - tar zxf download-cache/pcre-$PCRE_VER.tar.gz[m
[31m-  - cd pcre-$PCRE_VER/[m
[31m-  - ./configure --prefix=$PCRE_PREFIX --enable-jit --enable-utf --enable-unicode-properties > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo PATH=$PATH make install > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - tar zxf download-cache/openssl-$OPENSSL_VER.tar.gz[m
[31m-  - cd openssl-$OPENSSL_VER/[m
[31m-  - ./config shared --prefix=$OPENSSL_PREFIX -DPURIFY > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - make -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - sudo make PATH=$PATH install_sw > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - cd ..[m
[31m-  - export PATH=$PWD/work/nginx/sbin:$PWD/nginx-devel-utils:$PATH[m
[31m-  - export NGX_BUILD_CC=$CC[m
[31m-  - sh util/build.sh $NGINX_VERSION > build.log 2>&1 || (cat build.log && exit 1)[m
[31m-  - nginx -V[m
[31m-  - ldd `which nginx`|grep -E 'luajit|ssl|pcre'[m
[31m-  - export LD_PRELOAD=$PWD/mockeagain/mockeagain.so[m
[31m-  - export LD_LIBRARY_PATH=$PWD/mockeagain:$LD_LIBRARY_PATH[m
[31m-  - export TEST_NGINX_RESOLVER=8.8.4.4[m
[31m-  - dig +short @$TEST_NGINX_RESOLVER openresty.org || exit 0[m
[31m-  - dig +short @$TEST_NGINX_RESOLVER agentzh.org || exit 0[m
[31m-  - prove -r t[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/Changes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/Changes[m
[1mdeleted file mode 100644[m
[1mindex 703f73d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/Changes[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-0.2.0 - 5 July 2011[m
[31m-* now we support ngx.var[1], ngx.var[2], and etc to refer to the nginx regex capturing variables \$1, \$2, and etc in Lua. this resolved github issue #43. thanks Tobia Conforto for reporting it.[m
[31m-[m
[31m-* now we use the same value overriding mechanism as ngx_rewrite's set command for ngx.var.VAR = new_value. Assigning values to special variables like $limit_rate and $args should now work; also writing to built-in variables that are not changeable (like $arg_PARAMETER) will result in a 500 error page, as expected, now. thanks Richard Kearsley for reporting it.[m
[31m-[m
[31m-* fixed the lua_code_cache off warning when the lua_code_cache is explicitly on. thanks Feng Xingguo.[m
[31m-[m
[31m-* applied the patch from cyberty to add ngx.http_time() function to expose the nginx core function ngx_http_time to the Lua land.[m
[31m-[m
[31m-* fixed an issue on i386: we now use off_t consistently. mixing it with size_t on 32-bit systems can cause Bad Things. this fixed github issue #42. thanks moodydeath.[m
[31m-[m
[31m-* fixed an issue on i386: fixed a formatter mismatch issue in ngx_http_echo_adjust_subrequest. thanks Wang Bin. This caused incorrect subrequest Content-Length header when a body is specified.[m
[31m-[m
[31m-* now in the subrequest capturing processor, we worked around an issue in ngx_http_static_module that when it issues 301 redirect for directory access w/o a trailing slash, it does not inject r->headers_out.location into the r->headers_out.headers list. thanks moodydeath for reporting it in the discussion of github issue #41.[m
[31m-[m
[31m-* fixed a bug in ngx.location.capture() and ngx.location.capture_multi() that we could not capture locations with internal redirections in them. thanks moodydeath for reporting it in github issue #41.[m
[31m-[m
[31m-* fixed redundant last chunk issue for ngx.exec() invocation at rewrite and access phases: we should quit the current core_run_phases cycle; this also fixed github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location.[m
[31m-[m
[31m-* fixed ngx.exit(status) where status >= 200 and status < 300 for access_by_lua* and rewrite_by_lua*: it should quit the whole request altegother and skip all those subsequent phase handlers (if any). thanks moodydeath for reporting it.[m
[31m-[m
[31m-* fixed github issue #39: setting differnt response headers in Lua with common prefix might interfere with each other. thanks moodydeath.[m
[31m-[m
[31m-* fixed GitHub issue #38: request headers did not forward to subrequests when the "method" or "body" option is explicitly specified by a non-nil value for ngx.location.capture(). thanks Richard Kearsley.[m
[31m-[m
[31m-* fixed a bug in output header set; we should always set the header->hash to 1. thanks moodydeath for reporting it.[m
[31m-[m
[31m-* fixed spots that trigger the "variable set but not used" warning issued by gcc 4.6.0.[m
[31m-[m
[31m-* now we turn the ngx.req.header table into an ngx.req.get_headers() function; we also added ngx.req.set_header(name, value) and ngx.req.clear_header(name). thanks moodydeath.[m
[31m-[m
[31m-* now we make ngx_devel_kit (NDK) optional. thanks Kirill A. Korinskiy.[m
[31m-[m
[31m-* removed a duplicate definition of the ngx_str_set macro caught by ctags; also fixed a warning thrown by gcc -O3 on Mac OS X 10.6.[m
[31m-[m
[31m-* added patch to use PCRE related Lua extensions in ngx_lua (chaoslawful)[m
[31m-[m
[31m-* now we change the way we process HTTP 1.0 requests by automatically buffering all the user outputs generated by ngx.print()/ngx.say() calls, which is much more natural than the old broken way.[m
[31m-[m
[31m-* fixed the "ngx.exec() after ngx.location.capture() hanging" bug for rewrite_by_lua* and access_by_lua* as well. thanks Wendal Chen.[m
[31m-[m
[31m-* applied a patch from moodydeath to introduce the "ngx.is_subrequest" attribute.[m
[31m-[m
[31m-* now we encourage use of the client_body_in_single_buffer directive instead of big client_body_buffer_size when lua_need_request_body is turned on.[m
[31m-[m
[31m-* fixed the config script and added extra linking options needed by LuaJIT in 64-bit Mac OS X.[m
[31m-[m
[31m-* fixed the zero size alert caused by ngx.print("") in Lua.[m
[31m-[m
[31m-* now we always allocate r->request_body for subrequests when the method option is specified for ngx.location.capture*. this prevents accidental inheritance of parent request's request body when client_body_buffer_size < client_max_body_size.[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/config[m
[1mdeleted file mode 100644[m
[1mindex c91a07e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/config[m
[1m+++ /dev/null[m
[36m@@ -1,533 +0,0 @@[m
[31m-ngx_feature="Lua library"[m
[31m-ngx_feature_libs="-llua -lm"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <lauxlib.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_test="#if LUA_VERSION_NUM != 501[m
[31m-#   error unsupported Lua language version[m
[31m-#endif[m
[31m-(void) luaL_newstate();"[m
[31m-ngx_lua_opt_I=[m
[31m-ngx_lua_opt_L=[m
[31m-[m
[31m-if [ -n "$LUAJIT_INC" -o -n "$LUAJIT_LIB" ]; then[m
[31m-    # explicitly set LuaJIT paths[m
[31m-[m
[31m-    if [ "$NGX_PLATFORM" = win32 ]; then[m
[31m-        ngx_feature="LuaJIT library in $LUAJIT_LIB and $LUAJIT_INC (win32)"[m
[31m-        ngx_feature_path="$LUAJIT_INC"[m
[31m-        ngx_lua_opt_I="-I$LUAJIT_INC"[m
[31m-        ngx_lua_opt_L="-L$LUAJIT_LIB"[m
[31m-[m
[31m-        # ensure that our -I$LUAJIT_INC and -L$LUAJIT_LIB is at the first.[m
[31m-        SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-        CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-        SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-        NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        # LuaJIT's win32 build uses the library file name lua51.dll.[m
[31m-        ngx_feature_libs="$ngx_lua_opt_L -llua51"[m
[31m-[m
[31m-        . auto/feature[m
[31m-[m
[31m-        # clean up[m
[31m-        CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-        NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-    else[m
[31m-[m
[31m-        # attempt to link with -ldl, static linking on Linux requires it.[m
[31m-        ngx_feature="LuaJIT library in $LUAJIT_LIB and $LUAJIT_INC (specified by the LUAJIT_LIB and LUAJIT_INC env, with -ldl)"[m
[31m-        ngx_feature_path="$LUAJIT_INC"[m
[31m-        ngx_lua_opt_I="-I$LUAJIT_INC"[m
[31m-        ngx_lua_opt_L="-L$LUAJIT_LIB"[m
[31m-[m
[31m-        # ensure that our -I$LUAJIT_INC and -L$LUAJIT_LIB is at the first.[m
[31m-        SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-        CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-        SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-        NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R$LUAJIT_LIB $ngx_lua_opt_L -lluajit-5.1 -lm -ldl"[m
[31m-        else[m
[31m-            ngx_feature_libs="$ngx_lua_opt_L -lluajit-5.1 -lm -ldl"[m
[31m-        fi[m
[31m-[m
[31m-        . auto/feature[m
[31m-[m
[31m-        # clean up[m
[31m-        CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-        NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # retry without -ldl[m
[31m-            ngx_feature="LuaJIT library in $LUAJIT_LIB and $LUAJIT_INC (specified by the LUAJIT_LIB and LUAJIT_INC env)"[m
[31m-            ngx_feature_path="$LUAJIT_INC"[m
[31m-            ngx_lua_opt_I="-I$LUAJIT_INC"[m
[31m-            ngx_lua_opt_L="-L$LUAJIT_LIB"[m
[31m-[m
[31m-            # ensure that our -I$LUAJIT_INC and -L$LUAJIT_LIB is at the first.[m
[31m-            SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-            CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-            SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-            NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R$LUAJIT_LIB $ngx_lua_opt_L -lluajit-5.1 -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="$ngx_lua_opt_L -lluajit-5.1 -lm"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-[m
[31m-            # clean up[m
[31m-            CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-            NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-        fi[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        cat << END[m
[31m-        $0: error: ngx_http_lua_module requires the Lua or LuaJIT library and LUAJIT_LIB is defined as $LUAJIT_LIB and LUAJIT_INC (path for lua.h) $LUAJIT_INC, but we cannot find LuaJIT there.[m
[31m-END[m
[31m-        exit 1[m
[31m-    fi[m
[31m-[m
[31m-    case "$NGX_PLATFORM" in[m
[31m-        Darwin:*)[m
[31m-            case "$NGX_MACHINE" in[m
[31m-                amd64 | x86_64 | i386)[m
[31m-                    echo "adding extra linking options needed by LuaJIT"[m
[31m-                    ngx_feature_libs="$ngx_feature_libs -pagezero_size 10000 -image_base 100000000"[m
[31m-                ;;[m
[31m-[m
[31m-                *)[m
[31m-                ;;[m
[31m-            esac[m
[31m-        ;;[m
[31m-[m
[31m-        *)[m
[31m-        ;;[m
[31m-    esac[m
[31m-else[m
[31m-    if [ -n "$LUA_INC" -o -n "$LUA_LIB" ]; then[m
[31m-        # explicitly set Lua paths[m
[31m-        ngx_feature="Lua library in $LUA_LIB and $LUA_INC (specified by the LUA_LIB and LUA_INC env)"[m
[31m-        ngx_feature_path="$LUA_INC"[m
[31m-        ngx_lua_opt_I="-I$LUA_INC"[m
[31m-        ngx_lua_opt_L="-L$LUA_LIB"[m
[31m-[m
[31m-        # ensure that our -I$LUA_INC and -L$LUA_LIB is at the first.[m
[31m-        SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-        CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-        SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-        NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R$LUA_LIB $ngx_lua_opt_L -llua -lm -ldl"[m
[31m-        else[m
[31m-            ngx_feature_libs="$ngx_lua_opt_L -llua -lm -ldl"[m
[31m-        fi[m
[31m-[m
[31m-        . auto/feature[m
[31m-[m
[31m-        # clean up[m
[31m-        CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-        NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # retry without -ldl[m
[31m-[m
[31m-            ngx_feature_path="$LUA_INC"[m
[31m-            ngx_lua_opt_I="-I$LUA_INC"[m
[31m-            ngx_lua_opt_L="-L$LUA_LIB"[m
[31m-[m
[31m-            # ensure that our -I$LUA_INC and -L$LUA_LIB is at the first.[m
[31m-            SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-            CC_TEST_FLAGS="$ngx_lua_opt_I $CC_TEST_FLAGS"[m
[31m-            SAVED_NGX_TEST_LD_OPT="$NGX_TEST_LD_OPT"[m
[31m-            NGX_TEST_LD_OPT="$ngx_lua_opt_L $NGX_TEST_LD_OPT"[m
[31m-[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R$LUA_LIB $ngx_lua_opt_L -llua -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="$ngx_lua_opt_L -llua -lm"[m
[31m-            fi[m
[31m-[m
[31m-            . auto/feature[m
[31m-[m
[31m-            # clean up[m
[31m-            CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-            NGX_TEST_LD_OPT="$SAVED_NGX_TEST_LD_OPT"[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            cat << END[m
[31m-            $0: error: ngx_http_lua_module requires the Lua or LuaJIT library and LUA_LIB is defined as $LUA_LIB and LUA_INC (path for lua.h) is $LUA_INC, but we cannot find standard Lua there.[m
[31m-END[m
[31m-            exit 1[m
[31m-        fi[m
[31m-    else[m
[31m-        # auto-discovery[m
[31m-        ngx_feature="Lua library"[m
[31m-        ngx_feature_libs="-llua -lm"[m
[31m-        . auto/feature[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # OpenBSD-5.2[m
[31m-            ngx_feature="Lua library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include/lua-5.1"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -llua -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -llua5.1 -lm"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # OpenBSD < 5.2[m
[31m-            ngx_feature="Lua library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -llua -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -llua -lm"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # NetBSD[m
[31m-            ngx_feature="Lua library in /usr/pkg/"[m
[31m-            ngx_feature_path="/usr/pkg/include/"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lm -llua"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/pkg/lib -lm -llua"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # MacPorts[m
[31m-            ngx_feature="Lua library in /opt/local/"[m
[31m-            ngx_feature_path="/opt/local/include"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lm -llua"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/opt/local/lib -lm -llua"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # FreeBSD[m
[31m-            ngx_feature="Lua library in /usr/local/*/lua51/"[m
[31m-            ngx_feature_path="/usr/local/include/lua51"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib/lua51 -L/usr/local/lib/lua51 -llua -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib/lua51 -llua -lm"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # Debian[m
[31m-            ngx_feature="Lua library in /usr/"[m
[31m-            ngx_feature_path="/usr/include/lua5.1"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/lib -L/usr/lib -lm -llua5.1"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/lib -lm -llua5.1"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # FreeBSD with luajit-2.0 from ports collection[m
[31m-            ngx_feature="LuaJIT library in /usr/local/"[m
[31m-            ngx_feature_path="/usr/local/include/luajit-2.0"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lluajit-5.1 -lm"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/local/lib -lluajit-5.1 -lm"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # Gentoo with LuaJIT-2.0, try with -ldl[m
[31m-            ngx_feature="LuaJIT library in /usr/"[m
[31m-            ngx_feature_path="/usr/include/luajit-2.0"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/lib -L/usr/lib -lm -lluajit-5.1 -ldl"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/lib -lm -lluajit-5.1 -ldl"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-[m
[31m-        if [ $ngx_found = no ]; then[m
[31m-            # Gentoo with LuaJIT 2.0[m
[31m-            ngx_feature="LuaJIT library in /usr/"[m
[31m-            ngx_feature_path="/usr/include/luajit-2.0"[m
[31m-            if [ $NGX_RPATH = YES ]; then[m
[31m-                ngx_feature_libs="-R/usr/lib -L/usr/lib -lm -lluajit-5.1"[m
[31m-            else[m
[31m-                ngx_feature_libs="-L/usr/lib -lm -lluajit-5.1"[m
[31m-            fi[m
[31m-            . auto/feature[m
[31m-        fi[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-ngx_module_incs=[m
[31m-ngx_module_libs=[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    # this is a hack to persuade nginx's build system to favor[m
[31m-    # the paths set by our user environments:[m
[31m-    CFLAGS="$ngx_lua_opt_I $CFLAGS"[m
[31m-    NGX_LD_OPT="$ngx_lua_opt_L $NGX_LD_OPT"[m
[31m-[m
[31m-    ngx_module_incs="$ngx_module_incs $ngx_feature_path"[m
[31m-    ngx_module_libs="$ngx_module_libs $ngx_feature_libs"[m
[31m-else[m
[31m- cat << END[m
[31m- $0: error: ngx_http_lua_module requires the Lua library.[m
[31m-END[m
[31m- exit 1[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_http_lua_module[m
[31m-HTTP_LUA_SRCS=" \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_script.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_log.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_subrequest.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ndk.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_control.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_time.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_misc.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_variable.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_string.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_output.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_req_body.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_uri.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_args.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ctx.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_regex.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_module.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers_out.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers_in.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_directive.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_consts.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_exception.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_util.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_cache.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_contentby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_rewriteby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_accessby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_setby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_capturefilter.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_clfactory.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_pcrefix.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headerfilterby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_shdict.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_socket_tcp.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_api.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_logby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_sleep.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_semaphore.c\[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_coroutine.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_bodyfilterby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_initby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_initworkerby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_socket_udp.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_req_method.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_phase.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_uthread.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_timer.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_config.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_worker.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ssl_certby.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ssl_ocsp.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_lex.c \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_balancer.c \[m
[31m-            "[m
[31m-[m
[31m-HTTP_LUA_DEPS=" \[m
[31m-            $ngx_addon_dir/src/ddebug.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_script.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_log.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_subrequest.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ndk.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_control.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_time.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_string.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_misc.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_variable.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_output.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_uri.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_req_body.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_args.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ctx.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_regex.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_common.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_directive.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers_out.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headers_in.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_consts.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_exception.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_util.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_cache.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_contentby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_rewriteby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_accessby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_setby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_capturefilter.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_clfactory.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_pcrefix.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_headerfilterby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_shdict.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_socket_tcp.h \[m
[31m-            $ngx_addon_dir/src/api/ngx_http_lua_api.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_logby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_sleep.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_semaphore.h\[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_coroutine.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_bodyfilterby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_initby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_initworkerby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_socket_udp.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_req_method.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_phase.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_probe.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_uthread.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_timer.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_config.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_worker.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_ssl_certby.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_lex.h \[m
[31m-            $ngx_addon_dir/src/ngx_http_lua_balancer.h \[m
[31m-            "[m
[31m-[m
[31m-CFLAGS="$CFLAGS -DNDK_SET_VAR"[m
[31m-[m
[31m-ngx_feature="export symbols by default (-E)"[m
[31m-ngx_feature_libs="-Wl,-E"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_test='printf("hello");'[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_LIBS="-Wl,-E $CORE_LIBS"[m
[31m-fi[m
[31m-[m
[31m-# for Cygwin[m
[31m-ngx_feature="export symbols by default (--export-all-symbols)"[m
[31m-ngx_feature_libs="-Wl,--export-all-symbols"[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <stdio.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_test='printf("hello");'[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = yes ]; then[m
[31m-    CORE_LIBS="-Wl,--export-all-symbols $CORE_LIBS"[m
[31m-fi[m
[31m-[m
[31m-NGX_DTRACE_PROVIDERS="$NGX_DTRACE_PROVIDERS $ngx_addon_dir/dtrace/ngx_lua_provider.d"[m
[31m-NGX_TAPSET_SRCS="$NGX_TAPSET_SRCS $ngx_addon_dir/tapset/ngx_lua.stp"[m
[31m-[m
[31m-USE_MD5=YES[m
[31m-USE_SHA1=YES[m
[31m-[m
[31m-CORE_INCS="$CORE_INCS $ngx_addon_dir/src/api"[m
[31m-[m
[31m-ngx_feature="SO_PASSCRED"[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_name="NGX_HTTP_LUA_HAVE_SO_PASSCRED"[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <sys/types.h>[m
[31m-#include <sys/socket.h>"[m
[31m-ngx_feature_path=[m
[31m-ngx_feature_test='setsockopt(1, SOL_SOCKET, SO_PASSCRED, NULL, 0);'[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-ngx_feature="mmap(sbrk(0))"[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_name="NGX_HTTP_LUA_HAVE_MMAP_SBRK"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <unistd.h>[m
[31m-#include <stdlib.h>[m
[31m-#include <stdint.h>[m
[31m-#include <sys/mman.h>[m
[31m-#define align_ptr(p, a)                                                   \[m
[31m-    (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))[m
[31m-"[m
[31m-ngx_feature_test="[m
[31m-#if defined(__x86_64__)[m
[31m-exit(mmap(align_ptr(sbrk(0), getpagesize()), 1, PROT_READ,[m
[31m-          MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0) < (void *) 0x40000000LL[m
[31m-          ? 0 : 1);[m
[31m-#else[m
[31m-exit(1);[m
[31m-#endif[m
[31m-"[m
[31m-SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-CC_TEST_FLAGS="-Werror -Wall $CC_TEST_FLAGS"[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-[m
[31m-ngx_feature="__attribute__(constructor)"[m
[31m-ngx_feature_libs=[m
[31m-ngx_feature_name="NGX_HTTP_LUA_HAVE_CONSTRUCTOR"[m
[31m-ngx_feature_run=yes[m
[31m-ngx_feature_incs="#include <stdlib.h>[m
[31m-int a = 2;[m
[31m-__attribute__((constructor))[m
[31m-static void foo(void)[m
[31m-{[m
[31m-    a = 0;[m
[31m-}[m
[31m-"[m
[31m-ngx_feature_test="exit(a);"[m
[31m-SAVED_CC_TEST_FLAGS="$CC_TEST_FLAGS"[m
[31m-CC_TEST_FLAGS="-Werror -Wall $CC_TEST_FLAGS"[m
[31m-[m
[31m-. auto/feature[m
[31m-[m
[31m-CC_TEST_FLAGS="$SAVED_CC_TEST_FLAGS"[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP_AUX_FILTER[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_deps="$HTTP_LUA_DEPS"[m
[31m-    ngx_module_srcs="$HTTP_LUA_SRCS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_LUA_SRCS"[m
[31m-    NGX_ADDON_DEPS="$NGX_ADDON_DEPS $HTTP_LUA_DEPS"[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_module_incs"[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_module_libs"[m
[31m-fi[m
[31m-[m
[31m-#CFLAGS=$"$CFLAGS -DLUA_DEFAULT_PATH='\"/usr/local/openresty/lualib/?.lua\"'"[m
[31m-#CFLAGS=$"$CFLAGS -DLUA_DEFAULT_CPATH='\"/usr/local/openresty/lualib/?.so\"'"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/dtrace/ngx_lua_provider.d b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/dtrace/ngx_lua_provider.d[m
[1mdeleted file mode 100644[m
[1mindex 394484c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/dtrace/ngx_lua_provider.d[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-provider nginx_lua {[m
[31m-    probe http__lua__info(char *s);[m
[31m-[m
[31m-    /* lua_State *L */[m
[31m-    probe http__lua__register__preload__package(void *L, u_char *pkg);[m
[31m-[m
[31m-    probe http__lua__req__socket__consume__preread(void *r,[m
[31m-            u_char *data, size_t len);[m
[31m-[m
[31m-    /* lua_State *parent, lua_State *child */[m
[31m-    probe http__lua__user__coroutine__create(void *r,[m
[31m-            void *parent, void *child);[m
[31m-[m
[31m-    /* lua_State *parent, lua_State *child */[m
[31m-    probe http__lua__user__coroutine__resume(void *r,[m
[31m-                                             void *parent, void *child);[m
[31m-[m
[31m-    /* lua_State *parent, lua_State *child */[m
[31m-    probe http__lua__user__coroutine__yield(void *r,[m
[31m-                                            void *parent, void *child);[m
[31m-[m
[31m-    /* lua_State *L */[m
[31m-    probe http__lua__thread__yield(void *r, void *L);[m
[31m-[m
[31m-    /* ngx_http_lua_socket_tcp_upstream_t *u */[m
[31m-    probe http__lua__socket__tcp__send__start(void *r,[m
[31m-            void *u, u_char *data, size_t len);[m
[31m-[m
[31m-    /* ngx_http_lua_socket_tcp_upstream_t *u */[m
[31m-    probe http__lua__socket__tcp__receive__done(void *r,[m
[31m-            void *u, u_char *data, size_t len);[m
[31m-[m
[31m-    /* ngx_http_lua_socket_tcp_upstream_t *u */[m
[31m-    probe http__lua__socket__tcp__setkeepalive__buf__unread([m
[31m-            void *r, void *u, u_char *data, size_t len);[m
[31m-[m
[31m-    /* lua_State *creator, lua_State *newthread */[m
[31m-    probe http__lua__user__thread__spawn(void *r,[m
[31m-            void *creator, void *newthread);[m
[31m-[m
[31m-    /* lua_State *thread, ngx_http_lua_ctx_t *ctx */[m
[31m-    probe http__lua__thread__delete(void *r, void *thread, void *ctx);[m
[31m-[m
[31m-    /* lua_State *thread */[m
[31m-    probe http__lua__run__posted__thread(void *r, void *thread,[m
[31m-            int status);[m
[31m-[m
[31m-    probe http__lua__coroutine__done(void *r, void *co,[m
[31m-            int success);[m
[31m-[m
[31m-    /* lua_State *parent, lua_State *child */[m
[31m-    probe http__lua__user__thread__wait(void *parent, void *child);[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#pragma D attributes Evolving/Evolving/Common      provider nginx_lua provider[m
[31m-#pragma D attributes Private/Private/Unknown       provider nginx_lua module[m
[31m-#pragma D attributes Private/Private/Unknown       provider nginx_lua function[m
[31m-#pragma D attributes Private/Private/Common        provider nginx_lua name[m
[31m-#pragma D attributes Evolving/Evolving/Common      provider nginx_lua args[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/lib/RecvUntil.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/lib/RecvUntil.pm[m
[1mdeleted file mode 100755[m
[1mindex 54fdc54..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/lib/RecvUntil.pm[m
[1m+++ /dev/null[m
[36m@@ -1,138 +0,0 @@[m
[31m-package RecvUntil;[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-sub recv_until {[m
[31m-    my ($pat) = @_;[m
[31m-[m
[31m-    my $len = length $pat;[m
[31m-    my @backtracks;[m
[31m-[m
[31m-    for (my $i = 1; $i <= $len - 1; $i++) {[m
[31m-        my $matched_prefix_len = 1;[m
[31m-        while ($matched_prefix_len <= $len - $i - 1) {[m
[31m-            #while (1) {[m
[31m-            #my $left = $len - $i;[m
[31m-            #warn "left: $i: $len: ", $len - 1 - $i, "\n";[m
[31m-            #warn "matched_prefix_len: $matched_prefix_len\n";[m
[31m-[m
[31m-            #while (1) {[m
[31m-            my $prefix = substr($pat, 0, $matched_prefix_len);[m
[31m-            my $next = substr($pat, $matched_prefix_len, 1);[m
[31m-[m
[31m-            my $prefix2 = substr($pat, $i, $matched_prefix_len);[m
[31m-            my $next2 = substr($pat, $i + $matched_prefix_len, 1);[m
[31m-[m
[31m-            #warn "$i: global prefix $prefix $next\n";[m
[31m-            #warn "$i: local prefix $prefix2 $next2\n";[m
[31m-[m
[31m-            if ($prefix2 eq $prefix) {[m
[31m-                if ($next2 eq $next) {[m
[31m-                    $matched_prefix_len++;[m
[31m-                    next;[m
[31m-                }[m
[31m-[m
[31m-                #warn "$matched_prefix_len: $prefix: found match at $i (next $next, next2 $next2)\n";[m
[31m-                my $cur_state = $i + $matched_prefix_len;[m
[31m-                my $new_state = $matched_prefix_len + 1;[m
[31m-[m
[31m-                my $matched = substr($pat, 0, $cur_state);[m
[31m-[m
[31m-                my $chain = $backtracks[$cur_state - 2];[m
[31m-                if (!$chain) {[m
[31m-                    $chain = [];[m
[31m-                    $backtracks[$cur_state - 2] = $chain;[m
[31m-                }[m
[31m-[m
[31m-                my $found = 0;[m
[31m-                for my $rec (@$chain) {[m
[31m-                    if ($rec->{char} eq $next) {[m
[31m-                        $found = 1;[m
[31m-[m
[31m-                        if ($rec->{new_state} < $new_state) {[m
[31m-                            warn "overriding...\n";[m
[31m-                            $rec->{new_state} = $new_state;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (!$found) {[m
[31m-                    warn "on state $cur_state ($matched), if next is '$next', ",[m
[31m-                        "then backtrack to state $new_state ($prefix$next)\n";[m
[31m-[m
[31m-                    push @$chain, { char => $next, new_state => $new_state };[m
[31m-                }[m
[31m-[m
[31m-                #if ($matched_prefix_len > 1) {[m
[31m-                #$i += $matched_prefix_len - 1;[m
[31m-                #}[m
[31m-[m
[31m-                last;[m
[31m-            }[m
[31m-[m
[31m-            last;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return sub {[m
[31m-        my ($txt) = @_;[m
[31m-[m
[31m-        my $max_state = length $pat;[m
[31m-        my $len = length $txt;[m
[31m-        my $state = 0;[m
[31m-        my $ret = '';[m
[31m-[m
[31m-        for (my $i = 0; $i < $len; $i++) {[m
[31m-            # read the char[m
[31m-            my $c = substr($txt, $i, 1);[m
[31m-[m
[31m-            #warn "$state: read char at $i: $c\n";[m
[31m-            #warn "matched: $ret\n";[m
[31m-[m
[31m-            my $expected = substr($pat, $state, 1);[m
[31m-            if ($expected eq $c) {[m
[31m-                #warn "matched the char in pattern.\n";[m
[31m-                $state++;[m
[31m-[m
[31m-                if ($state == $max_state) {[m
[31m-                    last;[m
[31m-                }[m
[31m-[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            if ($state == 0) {[m
[31m-                #warn "did not match the first char in pattern\n";[m
[31m-                $ret .= $c;[m
[31m-                next;[m
[31m-            }[m
[31m-[m
[31m-            my $old_state;[m
[31m-            my $matched;[m
[31m-            my $chain = $backtracks[$state - 2];[m
[31m-            for my $rec (@$chain) {[m
[31m-                if ($rec->{char} eq $c) {[m
[31m-                    $old_state = $state;[m
[31m-                    $state = $rec->{new_state};[m
[31m-                    #warn "matched the char for backtracking to state $state\n";[m
[31m-                    $matched = 1;[m
[31m-                    last;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (!$matched) {[m
[31m-                $ret .= substr($pat, 0, $state);[m
[31m-                $state = 0;[m
[31m-                redo;[m
[31m-            }[m
[31m-[m
[31m-            $ret .= substr($pat, 0, $old_state + 1 - $state);[m
[31m-            next;[m
[31m-        }[m
[31m-[m
[31m-        return $ret;[m
[31m-    };[m
[31m-}[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 5783ee6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/misc/recv-until-pm/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-# vi:ft=[m
[31m-[m
[31m-use 5.10.1;[m
[31m-use Test::Base;[m
[31m-use RecvUntil;[m
[31m-[m
[31m-plan tests => 1 * blocks();[m
[31m-[m
[31m-run {[m
[31m-    my $block = shift;[m
[31m-    my $name = $block->name;[m
[31m-    my $pat = $block->pat // die "$name: No --- pat found";[m
[31m-    my $txt = $block->txt // die "$name: No --- txt found";[m
[31m-[m
[31m-    my $expected = $block->out // die "$name: No --- out found";[m
[31m-[m
[31m-    my $it = RecvUntil::recv_until($pat);[m
[31m-    is $it->($txt), $expected, "$name: output ok";[m
[31m-};[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1:[m
[31m---- pat: abcabd[m
[31m---- txt: abcabcabd[m
[31m---- out: abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2:[m
[31m---- pat: aa[m
[31m---- txt: abcabcaad[m
[31m---- out: abcabc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3:[m
[31m---- pat: ab[m
[31m---- txt: bbcabcaad[m
[31m---- out: bbc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4:[m
[31m---- pat: aaa[m
[31m---- txt: abaabcaaaef[m
[31m---- out: abaabc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5:[m
[31m---- pat: aaaaad[m
[31m---- txt: baaaaaaaaeaaaaaaadf[m
[31m---- out: baaaaaaaaeaa[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6:[m
[31m---- pat: abacadae[m
[31m---- txt: a[m
[31m---- out:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7:[m
[31m---- pat: abacadae[m
[31m---- txt: ababacadae[m
[31m---- out: ab[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8:[m
[31m---- pat: abacadae[m
[31m---- txt: abacabacadae[m
[31m---- out: abac[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9:[m
[31m---- pat: abacadae[m
[31m---- txt: abaabacadae[m
[31m---- out: aba[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10:[m
[31m---- pat: abacadae[m
[31m---- txt: abacadabacadae[m
[31m---- out: abacad[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11:[m
[31m---- pat: abcabdabcabe[m
[31m---- txt: abcabdabcabdabcabe[m
[31m---- out: abcabd[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12:[m
[31m---- pat: abcabdabcabe[m
[31m---- txt: abcabdabcabcabdabcabe[m
[31m---- out: abcabdabc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13:[m
[31m---- pat: abcabdabcabe[m
[31m---- txt: abcabcabdabcabe[m
[31m---- out: abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14:[m
[31m---- pat: abcabdabcabe[m
[31m---- txt: ababcabdabcabe[m
[31m---- out: ab[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15:[m
[31m---- pat: abcdef[m
[31m---- txt: abcabcdef[m
[31m---- out: abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16:[m
[31m---- pat: -- abc[m
[31m---- txt: ---- abc[m
[31m---- out: --[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17:[m
[31m---- pat: yz--ababyz[m
[31m---- txt: [m
[31m---- out: --[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/api/ngx_http_lua_api.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/api/ngx_http_lua_api.h[m
[1mdeleted file mode 100644[m
[1mindex 4bac0f6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/api/ngx_http_lua_api.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_API_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_API_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include <lua.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-[m
[31m-/* Public API for other Nginx modules */[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_version  10005[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    uint8_t         type;[m
[31m-[m
[31m-    union {[m
[31m-        int         b; /* boolean */[m
[31m-        lua_Number  n; /* number */[m
[31m-        ngx_str_t   s; /* string */[m
[31m-    } value;[m
[31m-[m
[31m-} ngx_http_lua_value_t;[m
[31m-[m
[31m-[m
[31m-lua_State *ngx_http_lua_get_global_state(ngx_conf_t *cf);[m
[31m-[m
[31m-ngx_http_request_t *ngx_http_lua_get_request(lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_add_package_preload(ngx_conf_t *cf, const char *package,[m
[31m-    lua_CFunction func);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_shared_dict_get(ngx_shm_zone_t *shm_zone,[m
[31m-    u_char *key_data, size_t key_len, ngx_http_lua_value_t *value);[m
[31m-[m
[31m-ngx_shm_zone_t *ngx_http_lua_find_zone(u_char *name_data, size_t name_len);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_API_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex f2d4b73..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _DDEBUG_H_INCLUDED_[m
[31m-#define _DDEBUG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "lua *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char *fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static ngx_inline void[m
[31m-dd(const char *fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _DDEBUG_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_accessby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_accessby.c[m
[1mdeleted file mode 100644[m
[1mindex bd09def..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_accessby.c[m
[1m+++ /dev/null[m
[36m@@ -1,388 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_accessby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_access_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_access_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_http_lua_ctx_t         *ctx;[m
[31m-    ngx_http_lua_loc_conf_t    *llcf;[m
[31m-    ngx_http_lua_main_conf_t   *lmcf;[m
[31m-    ngx_http_phase_handler_t    tmp, *ph, *cur_ph, *last_ph;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua access handler, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (!lmcf->postponed_to_access_phase_end) {[m
[31m-[m
[31m-        lmcf->postponed_to_access_phase_end = 1;[m
[31m-[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ph = cmcf->phase_engine.handlers;[m
[31m-        cur_ph = &ph[r->phase_handler];[m
[31m-[m
[31m-        /* we should skip the post_access phase handler here too */[m
[31m-        last_ph = &ph[cur_ph->next - 2];[m
[31m-[m
[31m-        dd("ph cur: %d, ph next: %d", (int) r->phase_handler,[m
[31m-           (int) (cur_ph->next - 2));[m
[31m-[m
[31m-#if 0[m
[31m-        if (cur_ph == last_ph) {[m
[31m-            dd("XXX our handler is already the last access phase handler");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (cur_ph < last_ph) {[m
[31m-            dd("swaping the contents of cur_ph and last_ph...");[m
[31m-[m
[31m-            tmp = *cur_ph;[m
[31m-[m
[31m-            memmove(cur_ph, cur_ph + 1,[m
[31m-                    (last_ph - cur_ph) * sizeof (ngx_http_phase_handler_t));[m
[31m-[m
[31m-            *last_ph = tmp;[m
[31m-[m
[31m-            r->phase_handler--; /* redo the current ph */[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->access_handler == NULL) {[m
[31m-        dd("no access handler found");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("entered? %d", (int) ctx->entered_access_phase);[m
[31m-[m
[31m-    if (ctx->entered_access_phase) {[m
[31m-        dd("calling wev handler");[m
[31m-        rc = ctx->resume_handler(r);[m
[31m-        dd("wev handler returns %d", (int) rc);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc == NGX_DONE || rc > NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            if (r->header_sent) {[m
[31m-                dd("header already sent");[m
[31m-[m
[31m-                /* response header was already generated in access_by_lua*,[m
[31m-                 * so it is no longer safe to proceed to later phases[m
[31m-                 * which may generate responses again */[m
[31m-[m
[31m-                if (!ctx->eof) {[m
[31m-                    dd("eof not yet sent");[m
[31m-[m
[31m-                    rc = ngx_http_lua_send_chain_link(r, ctx, NULL[m
[31m-                                                     /* indicate last_buf */);[m
[31m-                    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                return NGX_HTTP_OK;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        dd("WAITING MORE BODY");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->force_read_body && !ctx->read_body_done) {[m
[31m-        r->request_body_in_single_buf = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r,[m
[31m-                                       ngx_http_lua_generic_phase_post_read);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            ctx->waiting_more_body = 1;[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("calling access handler");[m
[31m-    return llcf->access_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_access_handler_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                  rc;[m
[31m-    lua_State                 *L;[m
[31m-    ngx_http_lua_loc_conf_t   *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->access_src.value.data,[m
[31m-                                       llcf->access_src.value.len,[m
[31m-                                       llcf->access_src_key,[m
[31m-                                       (const char *) llcf->access_chunkname);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_access_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_access_handler_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                    *script_path;[m
[31m-    ngx_int_t                  rc;[m
[31m-    ngx_str_t                  eval_src;[m
[31m-    lua_State                 *L;[m
[31m-    ngx_http_lua_loc_conf_t   *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* Eval nginx variables in code path string first */[m
[31m-    if (ngx_http_complex_value(r, &llcf->access_src, &eval_src) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->access_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc < NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_access_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_access_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                  co_ref;[m
[31m-    ngx_int_t            rc;[m
[31m-    lua_State           *co;[m
[31m-    ngx_event_t         *rev;[m
[31m-    ngx_connection_t    *c;[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-    ngx_http_cleanup_t  *cln;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    /*  {{{ new coroutine to handle request */[m
[31m-    co = ngx_http_lua_new_thread(r, L, &co_ref);[m
[31m-[m
[31m-    if (co == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua: failed to create new coroutine "[m
[31m-                      "to handle request");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  move code closure to new coroutine */[m
[31m-    lua_xmove(L, co, 1);[m
[31m-[m
[31m-    /*  set closure's env table to new coroutine's globals table */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /*  save nginx request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(co, r);[m
[31m-[m
[31m-    /*  {{{ initialize request context */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-[m
[31m-    ctx->entered_access_phase = 1;[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-    ctx->cur_co_ctx->co = co;[m
[31m-    ctx->cur_co_ctx->co_ref = co_ref;[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    /*  {{{ register request cleanup hooks */[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_ACCESS;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->check_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if (!rev->active) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-    dd("returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        rc = ngx_http_lua_run_posted_threads(c, L, r, ctx);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc == NGX_DONE || rc > NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-    } else if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-[m
[31m-        rc = ngx_http_lua_run_posted_threads(c, L, r, ctx);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc == NGX_DONE || rc > NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (rc == NGX_OK) {[m
[31m-        if (r->header_sent) {[m
[31m-            dd("header already sent");[m
[31m-[m
[31m-            /* response header was already generated in access_by_lua*,[m
[31m-             * so it is no longer safe to proceed to later phases[m
[31m-             * which may generate responses again */[m
[31m-[m
[31m-            if (!ctx->eof) {[m
[31m-                dd("eof not yet sent");[m
[31m-[m
[31m-                rc = ngx_http_lua_send_chain_link(r, ctx, NULL[m
[31m-                                                  /* indicate last_buf */);[m
[31m-                if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_accessby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_accessby.h[m
[1mdeleted file mode 100644[m
[1mindex 28c9eb2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_accessby.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_ACCESSBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_ACCESSBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_access_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_access_handler_inline(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_access_handler_file(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_ACCESSBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_api.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_api.c[m
[1mdeleted file mode 100644[m
[1mindex fcf07ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_api.c[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-#include "api/ngx_http_lua_api.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-lua_State *[m
[31m-ngx_http_lua_get_global_state(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t *lmcf;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    return lmcf->lua;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *[m
[31m-ngx_http_lua_get_request(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_get_req(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_add_package_preload(ngx_conf_t *cf, const char *package,[m
[31m-    lua_CFunction func)[m
[31m-{[m
[31m-    lua_State                     *L;[m
[31m-    ngx_http_lua_main_conf_t      *lmcf;[m
[31m-    ngx_http_lua_preload_hook_t   *hook;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    L = lmcf->lua;[m
[31m-[m
[31m-    if (L) {[m
[31m-        lua_getglobal(L, "package");[m
[31m-        lua_getfield(L, -1, "preload");[m
[31m-        lua_pushcfunction(L, func);[m
[31m-        lua_setfield(L, -2, package);[m
[31m-        lua_pop(L, 2);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* L == NULL */[m
[31m-[m
[31m-    if (lmcf->preload_hooks == NULL) {[m
[31m-        lmcf->preload_hooks =[m
[31m-            ngx_array_create(cf->pool, 4,[m
[31m-                             sizeof(ngx_http_lua_preload_hook_t));[m
[31m-[m
[31m-        if (lmcf->preload_hooks == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    hook = ngx_array_push(lmcf->preload_hooks);[m
[31m-    if (hook == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hook->package = (u_char *) package;[m
[31m-    hook->loader = func;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_args.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_args.c[m
[1mdeleted file mode 100644[m
[1mindex 0c307d6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_args.c[m
[1m+++ /dev/null[m
[36m@@ -1,550 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_args.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_set_uri_args(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_uri_args(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_post_args(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_uri_args(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_str_t                    args;[m
[31m-    const char                  *msg;[m
[31m-    size_t                       len;[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    switch (lua_type(L, 1)) {[m
[31m-    case LUA_TNUMBER:[m
[31m-    case LUA_TSTRING:[m
[31m-        p = (u_char *) lua_tolstring(L, 1, &len);[m
[31m-[m
[31m-        args.data = ngx_palloc(r->pool, len);[m
[31m-        if (args.data == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(args.data, p, len);[m
[31m-[m
[31m-        args.len = len;[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TTABLE:[m
[31m-        ngx_http_lua_process_args_option(r, L, 1, &args);[m
[31m-[m
[31m-        dd("args: %.*s", (int) args.len, args.data);[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        msg = lua_pushfstring(L, "string, number, or table expected, "[m
[31m-                              "but got %s", luaL_typename(L, 2));[m
[31m-        return luaL_argerror(L, 1, msg);[m
[31m-    }[m
[31m-[m
[31m-    dd("args: %.*s", (int) args.len, args.data);[m
[31m-[m
[31m-    r->args.data = args.data;[m
[31m-    r->args.len = args.len;[m
[31m-[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_uri_args(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *buf;[m
[31m-    u_char                      *last;[m
[31m-    int                          retval;[m
[31m-    int                          n;[m
[31m-    int                          max;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0 && n != 1) {[m
[31m-        return luaL_error(L, "expecting 0 or 1 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        max = luaL_checkinteger(L, 1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_ARGS;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->args.len == 0) {[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* we copy r->args over to buf to simplify[m
[31m-     * unescaping query arg keys and values */[m
[31m-[m
[31m-    buf = ngx_palloc(r->pool, r->args.len);[m
[31m-    if (buf == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, 4);[m
[31m-[m
[31m-    ngx_memcpy(buf, r->args.data, r->args.len);[m
[31m-[m
[31m-    last = buf + r->args.len;[m
[31m-[m
[31m-    retval = ngx_http_lua_parse_args(L, buf, last, max);[m
[31m-[m
[31m-    ngx_pfree(r->pool, buf);[m
[31m-[m
[31m-    return retval;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_post_args(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *buf;[m
[31m-    int                          retval;[m
[31m-    size_t                       len;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *last;[m
[31m-    int                          n;[m
[31m-    int                          max;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0 && n != 1) {[m
[31m-        return luaL_error(L, "expecting 0 or 1 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        max = luaL_checkinteger(L, 1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_ARGS;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body == NULL) {[m
[31m-        return luaL_error(L, "no request body found; "[m
[31m-                          "maybe you should turn on lua_need_request_body?");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body->temp_file) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "requesty body in temp file not supported");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body->bufs == NULL) {[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* we copy r->request_body->bufs over to buf to simplify[m
[31m-     * unescaping query arg keys and values */[m
[31m-[m
[31m-    len = 0;[m
[31m-    for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-        len += cl->buf->last - cl->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    dd("post body length: %d", (int) len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    buf = ngx_palloc(r->pool, len);[m
[31m-    if (buf == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, 4);[m
[31m-[m
[31m-    p = buf;[m
[31m-    for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-        p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    dd("post body: %.*s", (int) len, buf);[m
[31m-[m
[31m-    last = buf + len;[m
[31m-[m
[31m-    retval = ngx_http_lua_parse_args(L, buf, last, max);[m
[31m-[m
[31m-    ngx_pfree(r->pool, buf);[m
[31m-[m
[31m-    return retval;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_parse_args(lua_State *L, u_char *buf, u_char *last, int max)[m
[31m-{[m
[31m-    u_char                      *p, *q;[m
[31m-    u_char                      *src, *dst;[m
[31m-    unsigned                     parsing_value;[m
[31m-    size_t                       len;[m
[31m-    int                          count = 0;[m
[31m-    int                          top;[m
[31m-[m
[31m-    top = lua_gettop(L);[m
[31m-[m
[31m-    p = buf;[m
[31m-[m
[31m-    parsing_value = 0;[m
[31m-    q = p;[m
[31m-[m
[31m-    while (p != last) {[m
[31m-        if (*p == '=' && ! parsing_value) {[m
[31m-            /* key data is between p and q */[m
[31m-[m
[31m-            src = q; dst = q;[m
[31m-[m
[31m-            ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                      NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            dd("pushing key %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-            /* push the key */[m
[31m-            lua_pushlstring(L, (char *) q, dst - q);[m
[31m-[m
[31m-            /* skip the current '=' char */[m
[31m-            p++;[m
[31m-[m
[31m-            q = p;[m
[31m-            parsing_value = 1;[m
[31m-[m
[31m-        } else if (*p == '&') {[m
[31m-            /* reached the end of a key or a value, just save it */[m
[31m-            src = q; dst = q;[m
[31m-[m
[31m-            ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                      NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            dd("pushing key or value %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-            /* push the value or key */[m
[31m-            lua_pushlstring(L, (char *) q, dst - q);[m
[31m-[m
[31m-            /* skip the current '&' char */[m
[31m-            p++;[m
[31m-[m
[31m-            q = p;[m
[31m-[m
[31m-            if (parsing_value) {[m
[31m-                /* end of the current pair's value */[m
[31m-                parsing_value = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                /* the current parsing pair takes no value,[m
[31m-                 * just push the value "true" */[m
[31m-                dd("pushing boolean true");[m
[31m-[m
[31m-                lua_pushboolean(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            (void) lua_tolstring(L, -2, &len);[m
[31m-[m
[31m-            if (len == 0) {[m
[31m-                /* ignore empty string key pairs */[m
[31m-                dd("popping key and value...");[m
[31m-                lua_pop(L, 2);[m
[31m-[m
[31m-            } else {[m
[31m-                dd("setting table...");[m
[31m-                ngx_http_lua_set_multi_value_table(L, top);[m
[31m-            }[m
[31m-[m
[31m-            if (max > 0 && ++count == max) {[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                               "lua hit query args limit %d", max);[m
[31m-[m
[31m-                return 1;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            p++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p != q || parsing_value) {[m
[31m-        src = q; dst = q;[m
[31m-[m
[31m-        ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                  NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-        dd("pushing key or value %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) q, dst - q);[m
[31m-[m
[31m-        if (!parsing_value) {[m
[31m-            dd("pushing boolean true...");[m
[31m-            lua_pushboolean(L, 1);[m
[31m-        }[m
[31m-[m
[31m-        (void) lua_tolstring(L, -2, &len);[m
[31m-[m
[31m-        if (len == 0) {[m
[31m-            /* ignore empty string key pairs */[m
[31m-            dd("popping key and value...");[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-        } else {[m
[31m-            dd("setting table...");[m
[31m-            ngx_http_lua_set_multi_value_table(L, top);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("gettop: %d", lua_gettop(L));[m
[31m-    dd("type: %s", lua_typename(L, lua_type(L, 1)));[m
[31m-[m
[31m-    if (lua_gettop(L) != top) {[m
[31m-        return luaL_error(L, "internal error: stack in bad state");[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_args_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_uri_args);[m
[31m-    lua_setfield(L, -2, "set_uri_args");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_uri_args);[m
[31m-    lua_setfield(L, -2, "get_uri_args");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_uri_args);[m
[31m-    lua_setfield(L, -2, "get_query_args"); /* deprecated */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_post_args);[m
[31m-    lua_setfield(L, -2, "get_post_args");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_req_get_querystring_len(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return r->args.len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_uri_args_count(ngx_http_request_t *r, int max)[m
[31m-{[m
[31m-    int                      count;[m
[31m-    u_char                  *p, *last;[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (max < 0) {[m
[31m-        max = NGX_HTTP_LUA_MAX_ARGS;[m
[31m-    }[m
[31m-[m
[31m-    last = r->args.data + r->args.len;[m
[31m-    count = 0;[m
[31m-[m
[31m-    for (p = r->args.data; p != last; p++) {[m
[31m-        if (*p == '&') {[m
[31m-            if (count == 0) {[m
[31m-                count += 2;[m
[31m-[m
[31m-            } else {[m
[31m-                count++;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (count) {[m
[31m-        if (max > 0 && count > max) {[m
[31m-            count = max;[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua hit query args limit %d", max);[m
[31m-        }[m
[31m-[m
[31m-        return count;[m
[31m-    }[m
[31m-[m
[31m-    if (r->args.len) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_uri_args(ngx_http_request_t *r, u_char *buf,[m
[31m-    ngx_http_lua_ffi_table_elt_t *out, int count)[m
[31m-{[m
[31m-    int                          i, parsing_value = 0;[m
[31m-    u_char                      *last, *p, *q;[m
[31m-    u_char                      *src, *dst;[m
[31m-[m
[31m-    if (count <= 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(buf, r->args.data, r->args.len);[m
[31m-[m
[31m-    i = 0;[m
[31m-    last = buf + r->args.len;[m
[31m-    p = buf;[m
[31m-    q = p;[m
[31m-[m
[31m-    while (p != last) {[m
[31m-        if (*p == '=' && !parsing_value) {[m
[31m-            /* key data is between p and q */[m
[31m-[m
[31m-            src = q; dst = q;[m
[31m-[m
[31m-            ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                      NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            dd("saving key %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-            out[i].key.data = q;[m
[31m-            out[i].key.len = (int) (dst - q);[m
[31m-[m
[31m-            /* skip the current '=' char */[m
[31m-            p++;[m
[31m-[m
[31m-            q = p;[m
[31m-            parsing_value = 1;[m
[31m-[m
[31m-        } else if (*p == '&') {[m
[31m-            /* reached the end of a key or a value, just save it */[m
[31m-            src = q; dst = q;[m
[31m-[m
[31m-            ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                      NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-            dd("pushing key or value %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-            if (parsing_value) {[m
[31m-                /* end of the current pair's value */[m
[31m-                parsing_value = 0;[m
[31m-[m
[31m-                if (out[i].key.len) {[m
[31m-                    out[i].value.data = q;[m
[31m-                    out[i].value.len = (int) (dst - q);[m
[31m-                    i++;[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                /* the current parsing pair takes no value,[m
[31m-                 * just push the value "true" */[m
[31m-                dd("pushing boolean true");[m
[31m-[m
[31m-                if (dst - q) {[m
[31m-                    out[i].key.data = q;[m
[31m-                    out[i].key.len = (int) (dst - q);[m
[31m-                    out[i].value.len = -1;[m
[31m-                    i++;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (i == count) {[m
[31m-                return i;[m
[31m-            }[m
[31m-[m
[31m-            /* skip the current '&' char */[m
[31m-            p++;[m
[31m-[m
[31m-            q = p;[m
[31m-[m
[31m-        } else {[m
[31m-            p++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p != q || parsing_value) {[m
[31m-        src = q; dst = q;[m
[31m-[m
[31m-        ngx_http_lua_unescape_uri(&dst, &src, p - q,[m
[31m-                                  NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-        dd("pushing key or value %.*s", (int) (dst - q), q);[m
[31m-[m
[31m-        if (parsing_value) {[m
[31m-            if (out[i].key.len) {[m
[31m-                out[i].value.data = q;[m
[31m-                out[i].value.len = (int) (dst - q);[m
[31m-                i++;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (dst - q) {[m
[31m-                out[i].key.data = q;[m
[31m-                out[i].key.len = (int) (dst - q);[m
[31m-                out[i].value.len = (int) -1;[m
[31m-                i++;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return i;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_args.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_args.h[m
[1mdeleted file mode 100644[m
[1mindex d89889f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_args.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_ARGS_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_ARGS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_req_args_api(lua_State *L);[m
[31m-int ngx_http_lua_parse_args(lua_State *L, u_char *buf, u_char *last, int max);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_ARGS_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_balancer.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_balancer.c[m
[1mdeleted file mode 100644[m
[1mindex 5fa289b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_balancer.c[m
[1m+++ /dev/null[m
[36m@@ -1,655 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_balancer.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_balancer_peer_data_s {[m
[31m-    /* the round robin data must be first */[m
[31m-    ngx_http_upstream_rr_peer_data_t    rrp;[m
[31m-[m
[31m-    ngx_http_lua_srv_conf_t            *conf;[m
[31m-    ngx_http_request_t                 *request;[m
[31m-[m
[31m-    ngx_uint_t                          more_tries;[m
[31m-    ngx_uint_t                          total_tries;[m
[31m-[m
[31m-    struct sockaddr                    *sockaddr;[m
[31m-    socklen_t                           socklen;[m
[31m-[m
[31m-    ngx_str_t                          *host;[m
[31m-    in_port_t                           port;[m
[31m-[m
[31m-    int                                 last_peer_state;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_lua_balancer_set_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static void ngx_http_lua_balancer_save_session(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-static ngx_int_t ngx_http_lua_balancer_init(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_lua_balancer_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us);[m
[31m-static ngx_int_t ngx_http_lua_balancer_get_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static ngx_int_t ngx_http_lua_balancer_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r);[m
[31m-void ngx_http_lua_balancer_free_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_balancer_handler_file(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L,[m
[31m-                                     lscf->balancer.src.data,[m
[31m-                                     lscf->balancer.src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_balancer_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_balancer_handler_inline(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       lscf->balancer.src.data,[m
[31m-                                       lscf->balancer.src.len,[m
[31m-                                       lscf->balancer.src_key,[m
[31m-                                       "=balancer_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_balancer_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_balancer_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_balancer_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_balancer_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *name;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_srv_conf_t     *lscf = conf;[m
[31m-[m
[31m-    ngx_http_upstream_srv_conf_t      *uscf;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (lscf->balancer.handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lscf->balancer.handler = (ngx_http_lua_srv_conf_handler_pt) cmd->post;[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_balancer_handler_file) {[m
[31m-        /* Lua code in an external file */[m
[31m-[m
[31m-        name = ngx_http_lua_rebase_path(cf->pool, value[1].data,[m
[31m-                                        value[1].len);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->balancer.src.data = name;[m
[31m-        lscf->balancer.src.len = ngx_strlen(name);[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->balancer.src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        /* inlined Lua code */[m
[31m-[m
[31m-        lscf->balancer.src = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->balancer.src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-    }[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (uscf->peer.init_upstream) {[m
[31m-        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                           "load balancing method redefined");[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_http_lua_balancer_init;[m
[31m-[m
[31m-    uscf->flags = NGX_HTTP_UPSTREAM_CREATE[m
[31m-                  |NGX_HTTP_UPSTREAM_WEIGHT[m
[31m-                  |NGX_HTTP_UPSTREAM_MAX_FAILS[m
[31m-                  |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT[m
[31m-                  |NGX_HTTP_UPSTREAM_DOWN;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_init(ngx_conf_t *cf,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* this callback is called upon individual requests */[m
[31m-    us->peer.init = ngx_http_lua_balancer_init_peer;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *us)[m
[31m-{[m
[31m-    ngx_http_lua_srv_conf_t            *bcf;[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp;[m
[31m-[m
[31m-    bp = ngx_pcalloc(r->pool, sizeof(ngx_http_lua_balancer_peer_data_t));[m
[31m-    if (bp == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.data = &bp->rrp;[m
[31m-[m
[31m-    if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->upstream->peer.get = ngx_http_lua_balancer_get_peer;[m
[31m-    r->upstream->peer.free = ngx_http_lua_balancer_free_peer;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    r->upstream->peer.set_session = ngx_http_lua_balancer_set_session;[m
[31m-    r->upstream->peer.save_session = ngx_http_lua_balancer_save_session;[m
[31m-#endif[m
[31m-[m
[31m-    bcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_lua_module);[m
[31m-[m
[31m-    bp->conf = bcf;[m
[31m-    bp->request = r;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    lua_State                          *L;[m
[31m-    ngx_int_t                           rc;[m
[31m-    ngx_http_request_t                 *r;[m
[31m-    ngx_http_lua_ctx_t                 *ctx;[m
[31m-    ngx_http_lua_srv_conf_t            *lscf;[m
[31m-    ngx_http_lua_main_conf_t           *lmcf;[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua balancer peer, tries: %ui", pc->tries);[m
[31m-[m
[31m-    lscf = bp->conf;[m
[31m-[m
[31m-    r = bp->request;[m
[31m-[m
[31m-    ngx_http_lua_assert(lscf->balancer.handler && r);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    } else {[m
[31m-        L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-        dd("reset ctx");[m
[31m-        ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_BALANCER;[m
[31m-[m
[31m-    bp->sockaddr = NULL;[m
[31m-    bp->socklen = 0;[m
[31m-    bp->more_tries = 0;[m
[31m-    bp->total_tries++;[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* balancer_by_lua does not support yielding and[m
[31m-     * there cannot be any conflicts among concurrent requests,[m
[31m-     * thus it is safe to store the peer data in the main conf.[m
[31m-     */[m
[31m-    lmcf->balancer_peer_data = bp;[m
[31m-[m
[31m-    rc = lscf->balancer.handler(r, lscf, L);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->exited && ctx->exit_code != NGX_OK) {[m
[31m-        rc = ctx->exit_code;[m
[31m-        if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc > NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (bp->sockaddr && bp->socklen) {[m
[31m-        pc->sockaddr = bp->sockaddr;[m
[31m-        pc->socklen = bp->socklen;[m
[31m-        pc->cached = 0;[m
[31m-        pc->connection = NULL;[m
[31m-        pc->name = bp->host;[m
[31m-[m
[31m-        bp->rrp.peers->single = 0;[m
[31m-[m
[31m-        if (bp->more_tries) {[m
[31m-            r->upstream->peer.tries += bp->more_tries;[m
[31m-        }[m
[31m-[m
[31m-        dd("tries: %d", (int) r->upstream->peer.tries);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_upstream_get_round_robin_peer(pc, &bp->rrp);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    u_char                  *err_msg;[m
[31m-    size_t                   len;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    /* init nginx context in Lua VM */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    lua_createtable(L, 0, 1 /* nrec */);   /* the metatable for the new env */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable({}, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-    lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-    /*  protected call user code */[m
[31m-    rc = lua_pcall(L, 0, 1, 1);[m
[31m-[m
[31m-    lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-    dd("rc == %d", (int) rc);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        /*  error occured when running loaded code */[m
[31m-        err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-        if (err_msg == NULL) {[m
[31m-            err_msg = (u_char *) "unknown reason";[m
[31m-            len = sizeof("unknown reason") - 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "failed to run balancer_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-        lua_settop(L, 0); /*  clear remaining elems on stack */[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lua_settop(L, 0); /*  clear remaining elems on stack */[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_balancer_free_peer(ngx_peer_connection_t *pc, void *data,[m
[31m-    ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua balancer free peer, tries: %ui", pc->tries);[m
[31m-[m
[31m-    if (bp->sockaddr && bp->socklen) {[m
[31m-        bp->last_peer_state = (int) state;[m
[31m-[m
[31m-        if (pc->tries) {[m
[31m-            pc->tries--;[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* fallback */[m
[31m-[m
[31m-    ngx_http_upstream_free_round_robin_peer(pc, data, state);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_balancer_set_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp = data;[m
[31m-[m
[31m-    if (bp->sockaddr && bp->socklen) {[m
[31m-        /* TODO */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_upstream_set_round_robin_peer_session(pc, &bp->rrp);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_balancer_save_session(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp = data;[m
[31m-[m
[31m-    if (bp->sockaddr && bp->socklen) {[m
[31m-        /* TODO */[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_upstream_save_round_robin_peer_session(pc, &bp->rrp);[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_balancer_set_current_peer(ngx_http_request_t *r,[m
[31m-    const u_char *addr, size_t addr_len, int port, char **err)[m
[31m-{[m
[31m-    ngx_url_t              url;[m
[31m-    ngx_http_lua_ctx_t    *ctx;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t           *lmcf;[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp;[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        *err = "no request found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        *err = "no upstream found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *err = "no ctx found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->context & NGX_HTTP_LUA_CONTEXT_BALANCER) == 0) {[m
[31m-        *err = "API disabled in the current context";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* we cannot read r->upstream->peer.data here directly because[m
[31m-     * it could be overridden by other modules like[m
[31m-     * ngx_http_upstream_keepalive_module.[m
[31m-     */[m
[31m-    bp = lmcf->balancer_peer_data;[m
[31m-    if (bp == NULL) {[m
[31m-        *err = "no upstream peer data found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.data = ngx_palloc(r->pool, addr_len);[m
[31m-    if (url.url.data == NULL) {[m
[31m-        *err = "no memory";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(url.url.data, addr, addr_len);[m
[31m-[m
[31m-    url.url.len = addr_len;[m
[31m-    url.default_port = (in_port_t) port;[m
[31m-    url.uri_part = 0;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        if (url.err) {[m
[31m-            *err = url.err;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        bp->sockaddr = url.addrs[0].sockaddr;[m
[31m-        bp->socklen = url.addrs[0].socklen;[m
[31m-        bp->host = &url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        *err = "no host allowed";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_balancer_set_more_tries(ngx_http_request_t *r,[m
[31m-    int count, char **err)[m
[31m-{[m
[31m-#if (nginx_version >= 1007005)[m
[31m-    ngx_uint_t             max_tries;[m
[31m-#endif[m
[31m-    ngx_http_lua_ctx_t    *ctx;[m
[31m-    ngx_http_upstream_t   *u;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t           *lmcf;[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp;[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        *err = "no request found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        *err = "no upstream found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *err = "no ctx found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->context & NGX_HTTP_LUA_CONTEXT_BALANCER) == 0) {[m
[31m-        *err = "API disabled in the current context";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    bp = lmcf->balancer_peer_data;[m
[31m-    if (bp == NULL) {[m
[31m-        *err = "no upstream peer data found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (nginx_version >= 1007005)[m
[31m-    max_tries = r->upstream->conf->next_upstream_tries;[m
[31m-[m
[31m-    if (bp->total_tries + count > max_tries) {[m
[31m-        count = max_tries - bp->total_tries;[m
[31m-        *err = "reduced tries due to limit";[m
[31m-[m
[31m-    } else {[m
[31m-        *err = NULL;[m
[31m-    }[m
[31m-#else[m
[31m-    *err = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    bp->more_tries = count;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_balancer_get_last_failure(ngx_http_request_t *r,[m
[31m-    int *status, char **err)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t         *ctx;[m
[31m-    ngx_http_upstream_t        *u;[m
[31m-    ngx_http_upstream_state_t  *state;[m
[31m-[m
[31m-    ngx_http_lua_balancer_peer_data_t  *bp;[m
[31m-    ngx_http_lua_main_conf_t           *lmcf;[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        *err = "no request found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        *err = "no upstream found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *err = "no ctx found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->context & NGX_HTTP_LUA_CONTEXT_BALANCER) == 0) {[m
[31m-        *err = "API disabled in the current context";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    bp = lmcf->balancer_peer_data;[m
[31m-    if (bp == NULL) {[m
[31m-        *err = "no upstream peer data found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (r->upstream_states && r->upstream_states->nelts > 1) {[m
[31m-        state = r->upstream_states->elts;[m
[31m-        *status = (int) state[r->upstream_states->nelts - 2].status;[m
[31m-[m
[31m-    } else {[m
[31m-        *status = 0;[m
[31m-    }[m
[31m-[m
[31m-    return bp->last_peer_state;[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_LUA_NO_FFI_API */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_balancer.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_balancer.h[m
[1mdeleted file mode 100644[m
[1mindex bb49dc0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_balancer.h[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_BALANCER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_BALANCER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_balancer_handler_inline(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_balancer_handler_file(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L);[m
[31m-[m
[31m-char *ngx_http_lua_balancer_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-char *ngx_http_lua_balancer_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_BALANCER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.c[m
[1mdeleted file mode 100644[m
[1mindex 86e347e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.c[m
[1m+++ /dev/null[m
[36m@@ -1,633 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_bodyfilterby.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-[m
[31m-[m
[31m-static void ngx_http_lua_body_filter_by_lua_env(lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_chain_t *in);[m
[31m-static ngx_http_output_body_filter_pt ngx_http_next_body_filter;[m
[31m-[m
[31m-[m
[31m-/* key for the ngx_chain_t *in pointer in the Lua thread */[m
[31m-#define ngx_http_lua_chain_key  "__ngx_cl"[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Set environment table for the given code closure.[m
[31m- *[m
[31m- * Before:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- *[m
[31m- * After:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- * */[m
[31m-static void[m
[31m-ngx_http_lua_body_filter_by_lua_env(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    /*  set nginx request pointer to current lua thread's globals table */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, in);[m
[31m-    lua_setglobal(L, ngx_http_lua_chain_key);[m
[31m-[m
[31m-    /**[m
[31m-     * we want to create empty environment for current script[m
[31m-     *[m
[31m-     * setmetatable({}, {__index = _G})[m
[31m-     *[m
[31m-     * if a function or symbol is not defined in our env, __index will lookup[m
[31m-     * in the global env.[m
[31m-     *[m
[31m-     * all variables created in the script-env will be thrown away at the end[m
[31m-     * of the script run.[m
[31m-     * */[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    lua_createtable(L, 0, 1 /* nrec */);    /*  the metatable for the new[m
[31m-                                                env */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable({}, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_body_filter_by_chunk(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t        rc;[m
[31m-    u_char          *err_msg;[m
[31m-    size_t           len;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t      *old_pool;[m
[31m-#endif[m
[31m-[m
[31m-    dd("initialize nginx context in Lua VM, code chunk at stack top  sp = 1");[m
[31m-    ngx_http_lua_body_filter_by_lua_env(L, r, in);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* XXX: work-around to nginx regex subsystem */[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-    lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-    dd("protected call user code");[m
[31m-    rc = lua_pcall(L, 0, 1, 1);[m
[31m-[m
[31m-    lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* XXX: work-around to nginx regex subsystem */[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-[m
[31m-        /*  error occured */[m
[31m-        err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-        if (err_msg == NULL) {[m
[31m-            err_msg = (u_char *) "unknown reason";[m
[31m-            len = sizeof("unknown reason") - 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "failed to run body_filter_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-        lua_settop(L, 0);    /*  clear remaining elems on stack */[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == 0 */[m
[31m-[m
[31m-    rc = (ngx_int_t) lua_tointeger(L, -1);[m
[31m-[m
[31m-    dd("got return value: %d", (int) rc);[m
[31m-[m
[31m-    lua_settop(L, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_body_filter_inline(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->body_filter_src.value.data,[m
[31m-                                       llcf->body_filter_src.value.len,[m
[31m-                                       llcf->body_filter_src_key,[m
[31m-                                       "=body_filter_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_body_filter_by_chunk(L, r, in);[m
[31m-[m
[31m-    dd("body filter by chunk returns %d", (int) rc);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_body_filter_file(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* Eval nginx variables in code path string first */[m
[31m-    if (ngx_http_complex_value(r, &llcf->body_filter_src, &eval_src)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->body_filter_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    rc = ngx_http_lua_body_filter_by_chunk(L, r, in);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    uint16_t                     old_context;[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-    lua_State                   *L;[m
[31m-    ngx_chain_t                 *out;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua body filter for user lua code, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->body_filter_handler == NULL) {[m
[31m-        dd("no body filter handler found");[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->seen_last_in_filter) {[m
[31m-        for (/* void */; in; in = in->next) {[m
[31m-            dd("mark the buf as consumed: %d", (int) ngx_buf_size(in->buf));[m
[31m-            in->buf->pos = in->buf->last;[m
[31m-            in->buf->file_pos = in->buf->file_last;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    old_context = ctx->context;[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_BODY_FILTER;[m
[31m-[m
[31m-    dd("calling body filter handler");[m
[31m-    rc = llcf->body_filter_handler(r, in);[m
[31m-[m
[31m-    dd("calling body filter handler returned %d", (int) rc);[m
[31m-[m
[31m-    ctx->context = old_context;[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    lua_getglobal(L, ngx_http_lua_chain_key);[m
[31m-    out = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (in == out) {[m
[31m-        return ngx_http_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (out == NULL) {[m
[31m-        /* do not forward NULL to the next filters because the input is[m
[31m-         * not NULL */[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* in != out */[m
[31m-    rc = ngx_http_next_body_filter(r, out);[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if nginx_version >= 1001004[m
[31m-    ngx_chain_update_chains(r->pool,[m
[31m-#else[m
[31m-    ngx_chain_update_chains([m
[31m-#endif[m
[31m-                            &ctx->free_bufs, &ctx->busy_bufs, &out,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_lua_module);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_body_filter_init(void)[m
[31m-{[m
[31m-    dd("calling body filter init");[m
[31m-    ngx_http_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_lua_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_body_filter_param_get(lua_State *L)[m
[31m-{[m
[31m-    u_char              *data, *p;[m
[31m-    size_t               size;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    ngx_buf_t           *b;[m
[31m-    int                  idx;[m
[31m-    ngx_chain_t         *in;[m
[31m-[m
[31m-    idx = luaL_checkint(L, 2);[m
[31m-[m
[31m-    dd("index: %d", idx);[m
[31m-[m
[31m-    if (idx != 1 && idx != 2) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_getglobal(L, ngx_http_lua_chain_key);[m
[31m-    in = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (idx == 2) {[m
[31m-        /* asking for the eof argument */[m
[31m-[m
[31m-        for (cl = in; cl; cl = cl->next) {[m
[31m-            if (cl->buf->last_buf || cl->buf->last_in_chain) {[m
[31m-                lua_pushboolean(L, 1);[m
[31m-                return 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        lua_pushboolean(L, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* idx == 1 */[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        /* being a cleared chain on the Lua land */[m
[31m-        lua_pushliteral(L, "");[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (in->next == NULL) {[m
[31m-[m
[31m-        dd("seen only single buffer");[m
[31m-[m
[31m-        b = in->buf;[m
[31m-        lua_pushlstring(L, (char *) b->pos, b->last - b->pos);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("seen multiple buffers");[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        size += b->last - b->pos;[m
[31m-[m
[31m-        if (b->last_buf || b->last_in_chain) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    data = (u_char *) lua_newuserdata(L, size);[m
[31m-[m
[31m-    for (p = data, cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-        p = ngx_copy(p, b->pos, b->last - b->pos);[m
[31m-[m
[31m-        if (b->last_buf || b->last_in_chain) {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) data, size);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_body_filter_param_set(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    int                      type;[m
[31m-    int                      idx;[m
[31m-    int                      found;[m
[31m-    u_char                  *data;[m
[31m-    size_t                   size;[m
[31m-    unsigned                 last;[m
[31m-    unsigned                 flush = 0;[m
[31m-    ngx_buf_t               *b;[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_chain_t             *in;[m
[31m-[m
[31m-    idx = luaL_checkint(L, 2);[m
[31m-[m
[31m-    dd("index: %d", idx);[m
[31m-[m
[31m-    if (idx != 1 && idx != 2) {[m
[31m-        return luaL_error(L, "bad index: %d", idx);[m
[31m-    }[m
[31m-[m
[31m-    if (idx == 2) {[m
[31m-        /* overwriting the eof flag */[m
[31m-        last = lua_toboolean(L, 3);[m
[31m-[m
[31m-        lua_getglobal(L, ngx_http_lua_chain_key);[m
[31m-        in = lua_touserdata(L, -1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (last) {[m
[31m-            ctx->seen_last_in_filter = 1;[m
[31m-[m
[31m-            /* the "in" chain cannot be NULL and we set the "last_buf" or[m
[31m-             * "last_in_chain" flag in the last buf of "in" */[m
[31m-[m
[31m-            for (cl = in; cl; cl = cl->next) {[m
[31m-                if (cl->next == NULL) {[m
[31m-                    if (r == r->main) {[m
[31m-                        cl->buf->last_buf = 1;[m
[31m-[m
[31m-                    } else {[m
[31m-                        cl->buf->last_in_chain = 1;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* last == 0 */[m
[31m-[m
[31m-            found = 0;[m
[31m-[m
[31m-            for (cl = in; cl; cl = cl->next) {[m
[31m-                b = cl->buf;[m
[31m-[m
[31m-                if (b->last_buf) {[m
[31m-                    b->last_buf = 0;[m
[31m-                    found = 1;[m
[31m-                }[m
[31m-[m
[31m-                if (b->last_in_chain) {[m
[31m-                    b->last_in_chain = 0;[m
[31m-                    found = 1;[m
[31m-                }[m
[31m-[m
[31m-                if (found && b->last == b->pos && !ngx_buf_in_memory(b)) {[m
[31m-                    /* make it a special sync buf to make[m
[31m-                     * ngx_http_write_filter_module happy. */[m
[31m-                    b->sync = 1;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            ctx->seen_last_in_filter = 0;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    /* idx == 1, overwriting the chunk data */[m
[31m-[m
[31m-    type = lua_type(L, 3);[m
[31m-[m
[31m-    switch (type) {[m
[31m-    case LUA_TSTRING:[m
[31m-    case LUA_TNUMBER:[m
[31m-        data = (u_char *) lua_tolstring(L, 3, &size);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNIL:[m
[31m-        /* discard the buffers */[m
[31m-[m
[31m-        lua_getglobal(L, ngx_http_lua_chain_key); /* key val */[m
[31m-        in = lua_touserdata(L, -1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        last = 0;[m
[31m-[m
[31m-        for (cl = in; cl; cl = cl->next) {[m
[31m-            b = cl->buf;[m
[31m-[m
[31m-            if (b->flush) {[m
[31m-                flush = 1;[m
[31m-            }[m
[31m-[m
[31m-            if (b->last_in_chain || b->last_buf) {[m
[31m-                last = 1;[m
[31m-            }[m
[31m-[m
[31m-            dd("mark the buf as consumed: %d", (int) ngx_buf_size(b));[m
[31m-            b->pos = b->last;[m
[31m-        }[m
[31m-[m
[31m-        /* cl == NULL */[m
[31m-[m
[31m-        goto done;[m
[31m-[m
[31m-    case LUA_TTABLE:[m
[31m-        size = ngx_http_lua_calc_strlen_in_table(L, 3 /* index */, 3 /* arg */,[m
[31m-                                                 1 /* strict */);[m
[31m-        data = NULL;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return luaL_error(L, "bad chunk data type: %s",[m
[31m-                          lua_typename(L, type));[m
[31m-    }[m
[31m-[m
[31m-    lua_getglobal(L, ngx_http_lua_chain_key);[m
[31m-    in = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    last = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        if (b->flush) {[m
[31m-            flush = 1;[m
[31m-        }[m
[31m-[m
[31m-        if (b->last_buf || b->last_in_chain) {[m
[31m-            last = 1;[m
[31m-        }[m
[31m-[m
[31m-        dd("mark the buf as consumed: %d", (int) ngx_buf_size(cl->buf));[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-    }[m
[31m-[m
[31m-    /* cl == NULL */[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, size);[m
[31m-    if (cl == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    if (type == LUA_TTABLE) {[m
[31m-        cl->buf->last = ngx_http_lua_copy_str_in_table(L, 3, cl->buf->last);[m
[31m-[m
[31m-    } else {[m
[31m-        cl->buf->last = ngx_copy(cl->buf->pos, data, size);[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (last || flush) {[m
[31m-        if (cl == NULL) {[m
[31m-            cl = ngx_http_lua_chain_get_free_buf(r->connection->log,[m
[31m-                                                 r->pool,[m
[31m-                                                 &ctx->free_bufs, 0);[m
[31m-            if (cl == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (last) {[m
[31m-            ctx->seen_last_in_filter = 1;[m
[31m-[m
[31m-            if (r == r->main) {[m
[31m-                cl->buf->last_buf = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                cl->buf->last_in_chain = 1;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (flush) {[m
[31m-            cl->buf->flush = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlightuserdata(L, cl);[m
[31m-    lua_setglobal(L, ngx_http_lua_chain_key);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.h[m
[1mdeleted file mode 100644[m
[1mindex 6a4b306..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_bodyfilterby.h[m
[1m+++ /dev/null[m
[36m@@ -1,31 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_BODYFILTERBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_BODYFILTERBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_body_filter_pt ngx_http_lua_next_filter_body_filter;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_body_filter_init(void);[m
[31m-ngx_int_t ngx_http_lua_body_filter_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_chain_t *in);[m
[31m-ngx_int_t ngx_http_lua_body_filter_inline(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-ngx_int_t ngx_http_lua_body_filter_file(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-int ngx_http_lua_body_filter_param_get(lua_State *L);[m
[31m-int ngx_http_lua_body_filter_param_set(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_BODYFILTERBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_cache.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_cache.c[m
[1mdeleted file mode 100644[m
[1mindex e8a132e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_cache.c[m
[1m+++ /dev/null[m
[36m@@ -1,296 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_md5.h>[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_clfactory.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Find code chunk associated with the given key in code cache,[m
[31m- * and push it to the top of Lua stack if found.[m
[31m- *[m
[31m- * Stack layout before call:[m
[31m- *         |     ...    | <- top[m
[31m- *[m
[31m- * Stack layout after call:[m
[31m- *         | code chunk | <- top[m
[31m- *         |     ...    |[m
[31m- *[m
[31m- * */[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_cache_load_code(ngx_log_t *log, lua_State *L,[m
[31m-    const char *key)[m
[31m-{[m
[31m-    int          rc;[m
[31m-    u_char      *err;[m
[31m-[m
[31m-    /*  get code cache table */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_code_cache_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);    /*  sp++ */[m
[31m-[m
[31m-    dd("Code cache table to load: %p", lua_topointer(L, -1));[m
[31m-[m
[31m-    if (!lua_istable(L, -1)) {[m
[31m-        dd("Error: code cache table to load did not exist!!");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lua_getfield(L, -1, key);    /*  sp++ */[m
[31m-[m
[31m-    if (lua_isfunction(L, -1)) {[m
[31m-        /*  call closure factory to gen new closure */[m
[31m-        rc = lua_pcall(L, 0, 1, 0);[m
[31m-        if (rc == 0) {[m
[31m-            /*  remove cache table from stack, leave code chunk at[m
[31m-             *  top of stack */[m
[31m-            lua_remove(L, -2);   /*  sp-- */[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (lua_isstring(L, -1)) {[m
[31m-            err = (u_char *) lua_tostring(L, -1);[m
[31m-[m
[31m-        } else {[m
[31m-            err = (u_char *) "unknown error";[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "lua: failed to run factory at key \"%s\": %s",[m
[31m-                      key, err);[m
[31m-        lua_pop(L, 2);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("Value associated with given key in code cache table is not code "[m
[31m-       "chunk: stack top=%d, top value type=%s\n",[m
[31m-       lua_gettop(L), lua_typename(L, -1));[m
[31m-[m
[31m-    /*  remove cache table and value from stack */[m
[31m-    lua_pop(L, 2);                                /*  sp-=2 */[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Store the closure factory at the top of Lua stack to code cache, and[m
[31m- * associate it with the given key. Then generate new closure.[m
[31m- *[m
[31m- * Stack layout before call:[m
[31m- *         | code factory | <- top[m
[31m- *         |     ...      |[m
[31m- *[m
[31m- * Stack layout after call:[m
[31m- *         | code chunk | <- top[m
[31m- *         |     ...    |[m
[31m- *[m
[31m- * */[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_cache_store_code(lua_State *L, const char *key)[m
[31m-{[m
[31m-    int rc;[m
[31m-[m
[31m-    /*  get code cache table */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_code_cache_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    dd("Code cache table to store: %p", lua_topointer(L, -1));[m
[31m-[m
[31m-    if (!lua_istable(L, -1)) {[m
[31m-        dd("Error: code cache table to load did not exist!!");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushvalue(L, -2); /* closure cache closure */[m
[31m-    lua_setfield(L, -2, key); /* closure cache */[m
[31m-[m
[31m-    /*  remove cache table, leave closure factory at top of stack */[m
[31m-    lua_pop(L, 1); /* closure */[m
[31m-[m
[31m-    /*  call closure factory to generate new closure */[m
[31m-    rc = lua_pcall(L, 0, 1, 0);[m
[31m-    if (rc != 0) {[m
[31m-        dd("Error: failed to call closure factory!!");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_cache_loadbuffer(ngx_log_t *log, lua_State *L,[m
[31m-    const u_char *src, size_t src_len, const u_char *cache_key,[m
[31m-    const char *name)[m
[31m-{[m
[31m-    int          n;[m
[31m-    ngx_int_t    rc;[m
[31m-    const char  *err = NULL;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    dd("XXX cache key: [%s]", cache_key);[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_load_code(log, L, (char *) cache_key);[m
[31m-    if (rc == NGX_OK) {[m
[31m-        /*  code chunk loaded from cache, sp++ */[m
[31m-        dd("Code cache hit! cache key='%s', stack top=%d, script='%.*s'",[m
[31m-           cache_key, lua_gettop(L), (int) src_len, src);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    dd("Code cache missed! cache key='%s', stack top=%d, script='%.*s'",[m
[31m-       cache_key, lua_gettop(L), (int) src_len, src);[m
[31m-[m
[31m-    /* load closure factory of inline script to the top of lua stack, sp++ */[m
[31m-    rc = ngx_http_lua_clfactory_loadbuffer(L, (char *) src, src_len, name);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        /*  Oops! error occured when loading Lua script */[m
[31m-        if (rc == LUA_ERRMEM) {[m
[31m-            err = "memory allocation error";[m
[31m-[m
[31m-        } else {[m
[31m-            if (lua_isstring(L, -1)) {[m
[31m-                err = lua_tostring(L, -1);[m
[31m-[m
[31m-            } else {[m
[31m-                err = "unknown error";[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    /*  store closure factory and gen new closure at the top of lua stack to[m
[31m-     *  code cache */[m
[31m-    rc = ngx_http_lua_cache_store_code(L, (char *) cache_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        err = "fail to generate new closure from the closure factory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                  "failed to load inlined Lua code: %s", err);[m
[31m-    lua_settop(L, n);[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_cache_loadfile(ngx_log_t *log, lua_State *L,[m
[31m-    const u_char *script, const u_char *cache_key)[m
[31m-{[m
[31m-    int              n;[m
[31m-    ngx_int_t        rc, errcode = NGX_ERROR;[m
[31m-    u_char          *p;[m
[31m-    u_char           buf[NGX_HTTP_LUA_FILE_KEY_LEN + 1];[m
[31m-    const char      *err = NULL;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    /*  calculate digest of script file path */[m
[31m-    if (cache_key == NULL) {[m
[31m-        dd("CACHE file key not pre-calculated...calculating");[m
[31m-        p = ngx_copy(buf, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-[m
[31m-        p = ngx_http_lua_digest_hex(p, script, ngx_strlen(script));[m
[31m-[m
[31m-        *p = '\0';[m
[31m-        cache_key = buf;[m
[31m-[m
[31m-    } else {[m
[31m-        dd("CACHE file key already pre-calculated");[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX cache key for file: [%s]", cache_key);[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_load_code(log, L, (char *) cache_key);[m
[31m-    if (rc == NGX_OK) {[m
[31m-        /*  code chunk loaded from cache, sp++ */[m
[31m-        dd("Code cache hit! cache key='%s', stack top=%d, file path='%s'",[m
[31m-           cache_key, lua_gettop(L), script);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    dd("Code cache missed! cache key='%s', stack top=%d, file path='%s'",[m
[31m-       cache_key, lua_gettop(L), script);[m
[31m-[m
[31m-    /*  load closure factory of script file to the top of lua stack, sp++ */[m
[31m-    rc = ngx_http_lua_clfactory_loadfile(L, (char *) script);[m
[31m-[m
[31m-    dd("loadfile returns %d (%d)", (int) rc, LUA_ERRFILE);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        /*  Oops! error occured when loading Lua script */[m
[31m-        switch (rc) {[m
[31m-        case LUA_ERRMEM:[m
[31m-            err = "memory allocation error";[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_ERRFILE:[m
[31m-            errcode = NGX_HTTP_NOT_FOUND;[m
[31m-            /* fall through */[m
[31m-[m
[31m-        default:[m
[31m-            if (lua_isstring(L, -1)) {[m
[31m-                err = lua_tostring(L, -1);[m
[31m-[m
[31m-            } else {[m
[31m-                err = "unknown error";[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    /*  store closure factory and gen new closure at the top of lua stack[m
[31m-     *  to code cache */[m
[31m-    rc = ngx_http_lua_cache_store_code(L, (char *) cache_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        err = "fail to generate new closure from the closure factory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                  "failed to load external Lua file \"%s\": %s", script, err);[m
[31m-[m
[31m-    lua_settop(L, n);[m
[31m-    return errcode;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_cache.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_cache.h[m
[1mdeleted file mode 100644[m
[1mindex 52e6d2c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_cache.h[m
[1m+++ /dev/null[m
[36m@@ -1,24 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CACHE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CACHE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_cache_loadbuffer(ngx_log_t *log, lua_State *L,[m
[31m-    const u_char *src, size_t src_len, const u_char *cache_key,[m
[31m-    const char *name);[m
[31m-ngx_int_t ngx_http_lua_cache_loadfile(ngx_log_t *log, lua_State *L,[m
[31m-    const u_char *script, const u_char *cache_key);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CACHE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.c[m
[1mdeleted file mode 100644[m
[1mindex 5fe5f60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.c[m
[1m+++ /dev/null[m
[36m@@ -1,176 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_capturefilter.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_subrequest.h"[m
[31m-[m
[31m-[m
[31m-ngx_http_output_header_filter_pt ngx_http_lua_next_header_filter;[m
[31m-ngx_http_output_body_filter_pt ngx_http_lua_next_body_filter;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_capture_header_filter(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_capture_body_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_capture_filter_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    /* setting up output filters to intercept subrequest responses */[m
[31m-    ngx_http_lua_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_lua_capture_header_filter;[m
[31m-[m
[31m-    ngx_http_lua_next_body_filter = ngx_http_top_body_filter;[m
[31m-    ngx_http_top_body_filter = ngx_http_lua_capture_body_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_capture_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_post_subrequest_t      *psr;[m
[31m-    ngx_http_lua_ctx_t              *old_ctx;[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-[m
[31m-    ngx_http_lua_post_subrequest_data_t      *psr_data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua capture header filter, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("old ctx: %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL || ! ctx->capture) {[m
[31m-[m
[31m-        psr = r->post_subrequest;[m
[31m-[m
[31m-        if (psr != NULL[m
[31m-            && psr->handler == ngx_http_lua_post_subrequest[m
[31m-            && psr->data != NULL)[m
[31m-        {[m
[31m-            /* the lua ctx has been cleared by ngx_http_internal_redirect,[m
[31m-             * resume it from the post_subrequest data[m
[31m-             */[m
[31m-            psr_data = psr->data;[m
[31m-[m
[31m-            old_ctx = psr_data->ctx;[m
[31m-[m
[31m-            if (ctx == NULL) {[m
[31m-                ctx = old_ctx;[m
[31m-                ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua restoring ctx with capture %d, index %d",[m
[31m-                               old_ctx->capture, old_ctx->index);[m
[31m-[m
[31m-                ctx->capture = old_ctx->capture;[m
[31m-                ctx->index = old_ctx->index;[m
[31m-                ctx->body = NULL;[m
[31m-                ctx->last_body = &ctx->body;[m
[31m-                psr_data->ctx = ctx;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx && ctx->capture) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua capturing response body");[m
[31m-[m
[31m-        /* force subrequest response body buffer in memory */[m
[31m-        r->filter_need_in_memory = 1;[m
[31m-        r->header_sent = 1;[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        if (r->method == NGX_HTTP_HEAD) {[m
[31m-            r->header_only = 1;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_capture_body_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    int                              rc;[m
[31m-    ngx_int_t                        eof;[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_http_lua_ctx_t              *pr_ctx;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua capture body filter, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        return ngx_http_lua_next_body_filter(r, NULL);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (!ctx || !ctx->capture) {[m
[31m-        dd("no ctx or no capture %.*s", (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-        return ngx_http_lua_next_body_filter(r, in);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->run_post_subrequest) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua body filter skipped because post subrequest "[m
[31m-                       "already run");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (r->parent == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua body filter skipped because no parent request "[m
[31m-                       "found");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr_ctx = ngx_http_get_module_ctx(r->parent, ngx_http_lua_module);[m
[31m-    if (pr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua capture body filter capturing response body, uri "[m
[31m-                   "\"%V\"", &r->uri);[m
[31m-[m
[31m-    rc = ngx_http_lua_add_copy_chain(r, pr_ctx, &ctx->last_body, in, &eof);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("add copy chain eof: %d, sr: %d", (int) eof, r != r->main);[m
[31m-[m
[31m-    if (eof) {[m
[31m-        ctx->seen_last_for_subreq = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_discard_bufs(r->pool, in);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.h[m
[1mdeleted file mode 100644[m
[1mindex 1e9d529..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_capturefilter.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CAPTUREFILTER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CAPTUREFILTER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_capture_filter_init(ngx_conf_t *cf);[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_LUA_CAPTUREFILTER_H */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.c[m
[1mdeleted file mode 100644[m
[1mindex 86885bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.c[m
[1m+++ /dev/null[m
[36m@@ -1,887 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_clfactory.h"[m
[31m-[m
[31m-[m
[31m-#define CLFACTORY_BEGIN_CODE "return function() "[m
[31m-#define CLFACTORY_BEGIN_SIZE (sizeof(CLFACTORY_BEGIN_CODE) - 1)[m
[31m-[m
[31m-#define CLFACTORY_END_CODE "\nend"[m
[31m-#define CLFACTORY_END_SIZE (sizeof(CLFACTORY_END_CODE) - 1)[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * taken from chaoslawful:[m
[31m- * Lua bytecode header        Luajit bytecode header[m
[31m- * --------------              --------------[m
[31m- * |  \033Lua   | 0-3          |  \033LJ    | 0-2[m
[31m- * --------------              --------------[m
[31m- * |    LuaC    | 4            |  bytecode  | 3[m
[31m- * |   Version  |              |   version  |[m
[31m- * --------------              --------------[m
[31m- * |    LuaC    | 5            |  misc flag | 4 [F|S|B][m
[31m- * |   Format   |              --------------[m
[31m- * --------------              |  chunkname | ULEB128 var-len[m
[31m- * |   Endian   | 6            |     len    | encoded uint32[m
[31m- * --------------              --------------[m
[31m- * |   size of  | 7            |  chunkname |[m
[31m- * |     int    |              |  str no \0 |[m
[31m- * --------------              --------------[m
[31m- * |   size of  | 8[m
[31m- * |    size_t  |[m
[31m- * --------------[m
[31m- * |   size of  | 9[m
[31m- * | instruction|[m
[31m- * --------------[m
[31m- * |   size of  | 10[m
[31m- * |   number   |[m
[31m- * --------------[m
[31m- * |   number   | 11[m
[31m- * |   is int?  |[m
[31m- * --------------[m
[31m-*/[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * CLOSURE 0 0 RETURN 0 2 RETURN 0 1[m
[31m- * length(Instruction) = 4 or 8[m
[31m- * little endian or big endian[m
[31m-*/[m
[31m-#define    LUA_LITTLE_ENDIAN_4BYTES_CODE                                \[m
[31m-    "\x24\x00\x00\x00\x1e\x00\x00\x01\x1e\x00\x80\x00"[m
[31m-#define    LUA_LITTLE_ENDIAN_8BYTES_CODE                                \[m
[31m-    "\x24\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x01"                  \[m
[31m-    "\x00\x00\x00\x00\x1e\x00\x80\x00\x00\x00\x00\x00"[m
[31m-#define    LUA_BIG_ENDIAN_4BYTES_CODE                                   \[m
[31m-    "\x00\x00\x00\x24\x01\x00\x00\x1e\x00\x08\x00\x1e"[m
[31m-#define    LUA_BIG_ENDIAN_8BYTES_CODE                                   \[m
[31m-    "\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00"                  \[m
[31m-    "\x01\x00\x00\x1e\x00\x00\x00\x00\x00\x08\x00\x1e"[m
[31m-#define    LUA_LITTLE_ENDIAN_4BYTES_CODE_LEN        (4 + 4 + 4)[m
[31m-#define    LUA_LITTLE_ENDIAN_8BYTES_CODE_LEN        (8 + 8 + 8)[m
[31m-#define    LUA_BIG_ENDIAN_4BYTES_CODE_LEN           (4 + 4 + 4)[m
[31m-#define    LUA_BIG_ENDIAN_8BYTES_CODE_LEN           (8 + 8 + 8)[m
[31m-#define    LUAC_HEADERSIZE         12[m
[31m-#define    LUAC_VERSION            0x51[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * taken from chaoslawful:[m
[31m- *  Lua Proto[m
[31m- * ---------------------[m
[31m- * | String            | Can be empty string[m
[31m- * | [source]          | (stripped or internal function)[m
[31m- * ---------------------[m
[31m- * | Int               | At which line this function is defined[m
[31m- * | [linedefined]     |[m
[31m- * ---------------------[m
[31m- * | Int               | At while line this function definition ended[m
[31m- * | [lastlinedefined] |[m
[31m- * ---------------------[m
[31m- * | Char              | Number of upvalues referenced by this function[m
[31m- * | [nups]            |[m
[31m- * ---------------------[m
[31m- * | Char              | Number of paramters of this function[m
[31m- * | [numparams]       |[m
[31m- * ---------------------[m
[31m- * | Char              | Does this function has variable number of arguments?[m
[31m- * | [is_var_arg]      | main function always set to VARARG_ISVARARG (2)[m
[31m- * ---------------------[m
[31m- * | Char              | Maximum stack size this function used[m
[31m- * | [maxstacksize]    | Intially set to 2[m
[31m- * ---------------------[m
[31m- * | Vector(instr)     | Code instructions of this function[m
[31m- * | [code]            |[m
[31m- * ---------------------[m
[31m- * | Int               | Number of constants referenced by this function[m
[31m- * | [sizek]           |[m
[31m- * ---------------------[m
[31m- * | Char              | ------------------------------------[m
[31m- * | type of [k[i]]    |  The type and content of constants |[m
[31m- * ---------------------                                    |-> repeat for i in[m
[31m- * | Char if boolean   |  No content part if type is NIL    |   [1..sizek][m
[31m- * | Number if number  | ------------------------------------[m
[31m- * | String if string  |[m
[31m- * ---------------------[m
[31m- * | Int               | Number of internal functions[m
[31m- * | [sizep]           |[m
[31m- * ---------------------[m
[31m- * | Function          | -> repeat for i in [1..sizep][m
[31m- * | at [p[i]]         |[m
[31m- * ---------------------[m
[31m- * | Vector            | Debug lineinfo vector[m
[31m- * | [lineinfo]        | Empty vector here if dubug info is stripped[m
[31m- * ---------------------[m
[31m- * | Int               | Number of local variable in this function[m
[31m- * | [sizelocvars]     | 0 if debug info is stripped[m
[31m- * ---------------------[m
[31m- * | String            | ------------------------------------[m
[31m- * | [locvars[i]]      |  Name of local var i               |[m
[31m- * |  .varname]        |                                    |[m
[31m- * ---------------------                                    |[m
[31m- * | Int               |  instruction counter               |[m
[31m- * | [locvars[i]]      |  where lcoal var i start to be     |-> repeat for i in[m
[31m- * |  .startpc]        |  referenced                        |  [0..sizelocvars][m
[31m- * ---------------------                                    |[m
[31m- * | Int               |  instruction counter, where local  |[m
[31m- * | [locvars[i]]      |  var i ceased to be referenced     |[m
[31m- * |  .endpc]          | ------------------------------------[m
[31m- * ---------------------[m
[31m- * | Int               | Number of upvalues referenced by this function,[m
[31m- * | [sizeupvalues]    | 0 if stripped[m
[31m- * ---------------------[m
[31m- * | String            | -> repeat for i in[0..sizeupvalues][m
[31m- * | [upvalues[i]]     |[m
[31m- * ---------------------[m
[31m-*/[m
[31m-[m
[31m-#define    POS_SOURCE_STR_LEN      LUAC_HEADERSIZE[m
[31m-#define    POS_START_LINE          (POS_SOURCE_STR_LEN + sizeof(size_t))[m
[31m-#define    POS_LAST_LINE           (POS_START_LINE + sizeof(int))[m
[31m-#define    POS_NUM_OF_UPVS         (POS_LAST_LINE + sizeof(int))[m
[31m-#define    POS_NUM_OF_PARA         (POS_NUM_OF_UPVS + sizeof(char))[m
[31m-#define    POS_IS_VAR_ARG          (POS_NUM_OF_PARA + sizeof(char))[m
[31m-#define    POS_MAX_STACK_SIZE      (POS_IS_VAR_ARG + sizeof(char))[m
[31m-#define    POS_NUM_OF_INST         (POS_MAX_STACK_SIZE +sizeof(char))[m
[31m-#define    POS_BYTECODE            (POS_NUM_OF_INST + sizeof(int))[m
[31m-#define    MAX_BEGIN_CODE_SIZE                                              \[m
[31m-    (POS_BYTECODE + LUA_LITTLE_ENDIAN_8BYTES_CODE_LEN                       \[m
[31m-    + sizeof(int) + sizeof(int))[m
[31m-#define    MAX_END_CODE_SIZE       (sizeof(int) + sizeof(int) + sizeof(int))[m
[31m-[m
[31m-/*[m
[31m- * taken from chaoslawful:[m
[31m- * Luajit bytecode format[m
[31m- * ---------------------[m
[31m- * | HEAD              | Luajit bytecode head[m
[31m- * ---------------------[m
[31m- * | Internal          | All internal functions[m
[31m- * | functions         |[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Rest data total length of this function[m
[31m- * | [Date len of      | (not include itself)[m
[31m- * |  this function]   |[m
[31m- * ---------------------[m
[31m- * | Char              | F(ffi) | V(vararg)| C(has internal funcs)[m
[31m- * | [func flag]       |[m
[31m- * ---------------------[m
[31m- * | Char              | Number of paramters of this function[m
[31m- * | [numparams]       |[m
[31m- * ---------------------[m
[31m- * | Char              |[m
[31m- * | [framesize]       |[m
[31m- * ---------------------[m
[31m- * | Char              | Number of upvalues referenced by this function[m
[31m- * | [sizeupvalues]    |[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Number of collectable constants referenced[m
[31m- * | [sizekgc]         | by this function[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Number of lua number constants referenced[m
[31m- * | [sizekn]          | by this function[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Number of bytecode instructions of this function[m
[31m- * | [sizebc]m1        | minus 1 to omit the BC_FUNCV/BC_FUNCF header bytecode[m
[31m- * ---------------------[m
[31m- * | ULEB128           |[m
[31m- * | [size of dbg      | Size of debug lineinfo map, available when not stripped[m
[31m- * |  lineinfo]        |[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Available when not stripped[m
[31m- * | [firstline]       | The first line of this function's definition[m
[31m- * ---------------------[m
[31m- * | ULEB128           | Available when not stripped[m
[31m- * | [numline]         | The number of lines of this function's definition[m
[31m- * ---------------------[m
[31m- * | [bytecode]        | Bytecode instructions of this function[m
[31m- * ---------------------[m
[31m- * |[upvalue ref slots]| [sizeupvalues] * 2[m
[31m- * ---------------------[m
[31m- * | [collectable      | [sizekgc] elems, variable length[m
[31m- * |  constants]       |[m
[31m- * ---------------------[m
[31m- * | [lua number       | [sizekn] elems, variable length[m
[31m- * |  constants]       |[m
[31m- * ---------------------[m
[31m- * | [debug lineinfo   | Length is the calculated size of debug lineinfo above[m
[31m- * |                   | Only available if not stripped[m
[31m- * ---------------------[m
[31m- * | Char              |[m
[31m- * | [\x00]            | Footer[m
[31m- * ---------------------[m
[31m-*/[m
[31m-[m
[31m-/* bytecode for luajit 2.0 */[m
[31m-[m
[31m-#define    LJ20_LITTLE_ENDIAN_CODE_STRIPPED                             \[m
[31m-    "\x14\x03\x00\x01\x00\x01\x00\x03"                                  \[m
[31m-    "\x31\x00\x00\x00\x30\x00\x00\x80\x48\x00\x02\x00"                  \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ20_BIG_ENDIAN_CODE_STRIPPED                                \[m
[31m-    "\x14\x03\x00\x01\x00\x01\x00\x03"                                  \[m
[31m-    "\x00\x00\x00\x31\x80\x00\x00\x30\x00\x02\x00\x48"                  \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ20_LITTLE_ENDIAN_CODE                                      \[m
[31m-    "\x15\x03\x00\x01\x00\x01\x00\x03\x00"                              \[m
[31m-    "\x31\x00\x00\x00\x30\x00\x00\x80\x48\x00\x02\x00"                  \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ20_BIG_ENDIAN_CODE                                         \[m
[31m-    "\x15\x03\x00\x01\x00\x01\x00\x03\x00"                              \[m
[31m-    "\x00\x00\x00\x31\x80\x00\x00\x30\x00\x02\x00\x48"                  \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-/* bytecode for luajit 2.1 */[m
[31m-[m
[31m-#define    LJ21_LITTLE_ENDIAN_CODE_STRIPPED                                  \[m
[31m-    "\x14\x03\x00\x01\x00\x01\x00\x03"                                       \[m
[31m-    "\x33\x00\x00\x00\x32\x00\x00\x80\x4c\x00\x02\x00"                       \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ21_BIG_ENDIAN_CODE_STRIPPED                                     \[m
[31m-    "\x14\x03\x00\x01\x00\x01\x00\x03"                                       \[m
[31m-    "\x00\x00\x00\x33\x80\x00\x00\x32\x00\x02\x00\x4c"                       \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ21_LITTLE_ENDIAN_CODE                                           \[m
[31m-    "\x15\x03\x00\x01\x00\x01\x00\x03\x00"                                   \[m
[31m-    "\x33\x00\x00\x00\x32\x00\x00\x80\x4c\x00\x02\x00"                       \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ21_BIG_ENDIAN_CODE                                              \[m
[31m-    "\x15\x03\x00\x01\x00\x01\x00\x03\x00"                                   \[m
[31m-    "\x00\x00\x00\x33\x80\x00\x00\x32\x00\x02\x00\x4c"                       \[m
[31m-    "\x00\x00"[m
[31m-[m
[31m-#define    LJ_CODE_LEN              23[m
[31m-#define    LJ_CODE_LEN_STRIPPED     22[m
[31m-#define    LJ_HEADERSIZE            5[m
[31m-#define    LJ_BCDUMP_F_BE           0x01[m
[31m-#define    LJ_BCDUMP_F_STRIP        0x02[m
[31m-#define    LJ21_BCDUMP_VERSION        2[m
[31m-#define    LJ20_BCDUMP_VERSION        1[m
[31m-#define    LJ_SIGNATURE             "\x1b\x4c\x4a"[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_LUA_TEXT_FILE,[m
[31m-    NGX_LUA_BT_LUA,[m
[31m-    NGX_LUA_BT_LJ[m
[31m-} ngx_http_lua_clfactory_file_type_e;[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NGX_LUA_READER_BUFSIZE = 4096[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_clfactory_file_type_e file_type;[m
[31m-[m
[31m-    int         sent_begin;[m
[31m-    int         sent_end;[m
[31m-    int         extraline;[m
[31m-    FILE       *f;[m
[31m-    size_t      begin_code_len;[m
[31m-    size_t      end_code_len;[m
[31m-    size_t      rest_len;[m
[31m-    union {[m
[31m-        char   *ptr;[m
[31m-        char    str[MAX_BEGIN_CODE_SIZE];[m
[31m-    }           begin_code;[m
[31m-    union {[m
[31m-        char   *ptr;[m
[31m-        char    str[MAX_END_CODE_SIZE];[m
[31m-    }           end_code;[m
[31m-    char        buff[NGX_LUA_READER_BUFSIZE];[m
[31m-} ngx_http_lua_clfactory_file_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int         sent_begin;[m
[31m-    int         sent_end;[m
[31m-    const char *s;[m
[31m-    size_t      size;[m
[31m-} ngx_http_lua_clfactory_buffer_ctx_t;[m
[31m-[m
[31m-[m
[31m-static const char *ngx_http_lua_clfactory_getF(lua_State *L, void *ud,[m
[31m-    size_t *size);[m
[31m-static int ngx_http_lua_clfactory_errfile(lua_State *L, const char *what,[m
[31m-    int fname_index);[m
[31m-static const char *ngx_http_lua_clfactory_getS(lua_State *L, void *ud,[m
[31m-    size_t *size);[m
[31m-static long ngx_http_lua_clfactory_file_size(FILE *f);[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_clfactory_bytecode_prepare(lua_State *L,[m
[31m-    ngx_http_lua_clfactory_file_ctx_t *lf, int fname_index)[m
[31m-{[m
[31m-    int                 x = 1, size_of_int, size_of_size_t, little_endian,[m
[31m-                        size_of_inst, version, stripped;[m
[31m-    static int          num_of_inst = 3, num_of_inter_func = 1;[m
[31m-    const char         *emsg, *serr, *bytecode;[m
[31m-    size_t              size, bytecode_len;[m
[31m-    long                fsize;[m
[31m-[m
[31m-    serr = NULL;[m
[31m-[m
[31m-    *lf->begin_code.str = LUA_SIGNATURE[0];[m
[31m-[m
[31m-    if (lf->file_type == NGX_LUA_BT_LJ) {[m
[31m-        size = fread(lf->begin_code.str + 1, 1, LJ_HEADERSIZE - 1, lf->f);[m
[31m-[m
[31m-        if (size != LJ_HEADERSIZE - 1) {[m
[31m-            serr = strerror(errno);[m
[31m-            emsg = "cannot read header";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        version = *(lf->begin_code.str + 3);[m
[31m-[m
[31m-        dd("version: %d", (int) version);[m
[31m-[m
[31m-        if (ngx_memcmp(lf->begin_code.str, LJ_SIGNATURE,[m
[31m-                       sizeof(LJ_SIGNATURE) - 1))[m
[31m-        {[m
[31m-            emsg = "bad byte-code header";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        dd("==LJ_BT_HEADER==");[m
[31m-        size_t i;[m
[31m-        for (i = 0; i < LJ_HEADERSIZE; i++) {[m
[31m-            dd("%ld: 0x%02X", i, (unsigned)(u_char) lf->begin_code.str[i]);[m
[31m-        }[m
[31m-        dd("==LJ_BT_HEADER_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        lf->begin_code_len = LJ_HEADERSIZE;[m
[31m-        little_endian = !((*(lf->begin_code.str + 4)) & LJ_BCDUMP_F_BE);[m
[31m-        stripped = (*(lf->begin_code.str + 4)) & LJ_BCDUMP_F_STRIP;[m
[31m-[m
[31m-        dd("stripped: %d", (int) stripped);[m
[31m-[m
[31m-        if (version == LJ21_BCDUMP_VERSION) {[m
[31m-            if (stripped) {[m
[31m-                if (little_endian) {[m
[31m-                    lf->end_code.ptr = LJ21_LITTLE_ENDIAN_CODE_STRIPPED;[m
[31m-[m
[31m-                } else {[m
[31m-                    lf->end_code.ptr = LJ21_BIG_ENDIAN_CODE_STRIPPED;[m
[31m-                }[m
[31m-[m
[31m-                lf->end_code_len = LJ_CODE_LEN_STRIPPED;[m
[31m-[m
[31m-            } else {[m
[31m-                if (little_endian) {[m
[31m-                    lf->end_code.ptr = LJ21_LITTLE_ENDIAN_CODE;[m
[31m-[m
[31m-                } else {[m
[31m-                    lf->end_code.ptr = LJ21_BIG_ENDIAN_CODE;[m
[31m-                }[m
[31m-[m
[31m-                lf->end_code_len = LJ_CODE_LEN;[m
[31m-            }[m
[31m-[m
[31m-        } else if (version == LJ20_BCDUMP_VERSION) {[m
[31m-            if (stripped) {[m
[31m-                if (little_endian) {[m
[31m-                    lf->end_code.ptr = LJ20_LITTLE_ENDIAN_CODE_STRIPPED;[m
[31m-[m
[31m-                } else {[m
[31m-                    lf->end_code.ptr = LJ20_BIG_ENDIAN_CODE_STRIPPED;[m
[31m-                }[m
[31m-[m
[31m-                lf->end_code_len = LJ_CODE_LEN_STRIPPED;[m
[31m-[m
[31m-            } else {[m
[31m-                if (little_endian) {[m
[31m-                    lf->end_code.ptr = LJ20_LITTLE_ENDIAN_CODE;[m
[31m-[m
[31m-                } else {[m
[31m-                    lf->end_code.ptr = LJ20_BIG_ENDIAN_CODE;[m
[31m-                }[m
[31m-[m
[31m-                lf->end_code_len = LJ_CODE_LEN;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            emsg = "bytecode format version unsupported";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        fsize = ngx_http_lua_clfactory_file_size(lf->f);[m
[31m-        if (fsize < 0) {[m
[31m-            serr = strerror(errno);[m
[31m-            emsg = "cannot fseek/ftell";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        lf->rest_len = fsize - LJ_HEADERSIZE;[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        size_t i = 0;[m
[31m-        dd("==LJ_END_CODE: %ld rest_len: %ld==", lf->end_code_len,[m
[31m-           lf->rest_len);[m
[31m-[m
[31m-        for (i = 0; i < lf->end_code_len; i++) {[m
[31m-            dd("%ld: 0x%02X", i, (unsigned) ((u_char) lf->end_code.ptr[i]));[m
[31m-        }[m
[31m-        dd("==LJ_END_CODE_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        size = fread(lf->begin_code.str + 1, 1, LUAC_HEADERSIZE - 1, lf->f);[m
[31m-[m
[31m-        if (size != LUAC_HEADERSIZE - 1) {[m
[31m-            serr = strerror(errno);[m
[31m-            emsg = "cannot read header";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        version = *(lf->begin_code.str + 4);[m
[31m-        little_endian = *(lf->begin_code.str + 6);[m
[31m-        size_of_int = *(lf->begin_code.str + 7);[m
[31m-        size_of_size_t = *(lf->begin_code.str + 8);[m
[31m-        size_of_inst = *(lf->begin_code.str + 9);[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        dd("==LUA_BT_HEADER==");[m
[31m-        size_t i;[m
[31m-        for (i = 0; i < LUAC_HEADERSIZE; i++) {[m
[31m-            dd("%ld, 0x%02X", i, (unsigned)(u_char) lf->begin_code.str[i]);[m
[31m-        }[m
[31m-        dd("==LUA_BT_HEADER_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ngx_memcmp(lf->begin_code.str, LUA_SIGNATURE,[m
[31m-                       sizeof(LUA_SIGNATURE) -1)[m
[31m-            || version != LUAC_VERSION[m
[31m-            || little_endian != (int) (*(char *) &x)[m
[31m-            || size_of_int != sizeof(int)[m
[31m-            || size_of_size_t != sizeof(size_t)[m
[31m-            || (size_of_inst != 4 && size_of_inst != 8))[m
[31m-        {[m
[31m-            emsg = "bad byte-code header";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        /* clear the following fields to zero:[m
[31m-         * - source string length[m
[31m-         * - start line[m
[31m-         * - last line[m
[31m-         */[m
[31m-        ngx_memzero(lf->begin_code.str + POS_SOURCE_STR_LEN,[m
[31m-                    sizeof(size_t) + sizeof(int) * 2);[m
[31m-        /* number of upvalues */[m
[31m-        *(lf->begin_code.str + POS_NUM_OF_UPVS) = 0;[m
[31m-        /* number of paramters */[m
[31m-        *(lf->begin_code.str + POS_NUM_OF_PARA) = 0;[m
[31m-        /* is var-argument function? */[m
[31m-        *(lf->begin_code.str + POS_IS_VAR_ARG) = 2;[m
[31m-        /* max stack size */[m
[31m-        *(lf->begin_code.str + POS_MAX_STACK_SIZE) = 2;[m
[31m-        /* number of bytecode instructions */[m
[31m-        ngx_memcpy(lf->begin_code.str + POS_NUM_OF_INST, &num_of_inst,[m
[31m-                   sizeof(int));[m
[31m-[m
[31m-        lf->begin_code_len = POS_BYTECODE;[m
[31m-[m
[31m-        if (little_endian) {[m
[31m-            if (size_of_inst == 4) {[m
[31m-                bytecode = LUA_LITTLE_ENDIAN_4BYTES_CODE;[m
[31m-                bytecode_len = LUA_LITTLE_ENDIAN_4BYTES_CODE_LEN;[m
[31m-[m
[31m-            } else {[m
[31m-                bytecode = LUA_LITTLE_ENDIAN_8BYTES_CODE;[m
[31m-                bytecode_len = LUA_LITTLE_ENDIAN_8BYTES_CODE_LEN;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            if (size_of_inst == 4) {[m
[31m-                bytecode = LUA_BIG_ENDIAN_4BYTES_CODE;[m
[31m-                bytecode_len = LUA_BIG_ENDIAN_4BYTES_CODE_LEN;[m
[31m-[m
[31m-            } else {[m
[31m-                bytecode = LUA_BIG_ENDIAN_8BYTES_CODE;[m
[31m-                bytecode_len = LUA_BIG_ENDIAN_8BYTES_CODE_LEN;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* bytecode */[m
[31m-        ngx_memcpy(lf->begin_code.str + POS_BYTECODE, bytecode, bytecode_len);[m
[31m-[m
[31m-        /* number of consts */[m
[31m-        ngx_memzero(lf->begin_code.str + POS_BYTECODE + bytecode_len,[m
[31m-                    sizeof(int));[m
[31m-        /* number of internal functions */[m
[31m-        ngx_memcpy(lf->begin_code.str + POS_BYTECODE + bytecode_len[m
[31m-                   + sizeof(int), &num_of_inter_func, sizeof(int));[m
[31m-[m
[31m-        lf->begin_code_len += bytecode_len + sizeof(int) + sizeof(int);[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        size_t i = 0;[m
[31m-        dd("==LUA_BEGIN_CODE: %ld==", lf->begin_code_len);[m
[31m-        for (i = 0; i < lf->begin_code_len; i++) {[m
[31m-            dd("%ld: 0x%02X", i, (unsigned) ((u_char) lf->begin_code.str[i]));[m
[31m-        }[m
[31m-        dd("==LUA_BEGIN_CODE_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        /* clear the following fields to zero:[m
[31m-         * - lineinfo vector size[m
[31m-         * - number of local vars[m
[31m-         * - number of upvalues[m
[31m-         */[m
[31m-        ngx_memzero(lf->end_code.str, sizeof(int) * 3);[m
[31m-[m
[31m-        lf->end_code_len = sizeof(int) + sizeof(int) + sizeof(int);[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        {[m
[31m-        size_t i = 0;[m
[31m-        dd("==LUA_END_CODE: %ld==", lf->end_code_len);[m
[31m-        for (i = 0; i < lf->end_code_len; i++) {[m
[31m-            dd("%ld: 0x%02X", i, (unsigned) ((u_char) lf->end_code.str[i]));[m
[31m-        }[m
[31m-        dd("==LUA_END_CODE_END==");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    fclose(lf->f);  /* close file (even in case of errors) */[m
[31m-[m
[31m-    if (serr) {[m
[31m-        lua_pushfstring(L, "%s: %s", emsg, serr);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushstring(L, emsg);[m
[31m-    }[m
[31m-[m
[31m-    lua_remove(L, fname_index);[m
[31m-[m
[31m-    return LUA_ERRFILE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_clfactory_loadfile(lua_State *L, const char *filename)[m
[31m-{[m
[31m-    int                         c, status, readstatus;[m
[31m-    ngx_flag_t                  sharp;[m
[31m-[m
[31m-    ngx_http_lua_clfactory_file_ctx_t        lf;[m
[31m-[m
[31m-    /* index of filename on the stack */[m
[31m-    int                         fname_index;[m
[31m-[m
[31m-    sharp = 0;[m
[31m-    fname_index = lua_gettop(L) + 1;[m
[31m-[m
[31m-    lf.extraline = 0;[m
[31m-    lf.file_type = NGX_LUA_TEXT_FILE;[m
[31m-[m
[31m-    lf.begin_code.ptr = CLFACTORY_BEGIN_CODE;[m
[31m-    lf.begin_code_len = CLFACTORY_BEGIN_SIZE;[m
[31m-    lf.end_code.ptr = CLFACTORY_END_CODE;[m
[31m-    lf.end_code_len = CLFACTORY_END_SIZE;[m
[31m-[m
[31m-    lua_pushfstring(L, "@%s", filename);[m
[31m-[m
[31m-    lf.f = fopen(filename, "r");[m
[31m-    if (lf.f == NULL) {[m
[31m-        return ngx_http_lua_clfactory_errfile(L, "open", fname_index);[m
[31m-    }[m
[31m-[m
[31m-    c = getc(lf.f);[m
[31m-[m
[31m-    if (c == '#') {  /* Unix exec. file? */[m
[31m-        lf.extraline = 1;[m
[31m-[m
[31m-        while ((c = getc(lf.f)) != EOF && c != '\n') {[m
[31m-            /* skip first line */[m
[31m-        }[m
[31m-[m
[31m-        if (c == '\n') {[m
[31m-            c = getc(lf.f);[m
[31m-        }[m
[31m-[m
[31m-        sharp = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */[m
[31m-        lf.f = freopen(filename, "rb", lf.f);  /* reopen in binary mode */[m
[31m-[m
[31m-        if (lf.f == NULL) {[m
[31m-            return ngx_http_lua_clfactory_errfile(L, "reopen", fname_index);[m
[31m-        }[m
[31m-[m
[31m-        /* check whether lib jit exists */[m
[31m-        luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);[m
[31m-        lua_getfield(L, -1, "jit");  /* get _LOADED["jit"] */[m
[31m-[m
[31m-        if (lua_istable(L, -1)) {[m
[31m-            lf.file_type = NGX_LUA_BT_LJ;[m
[31m-[m
[31m-        } else {[m
[31m-            lf.file_type = NGX_LUA_BT_LUA;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 2);[m
[31m-[m
[31m-        /*[m
[31m-         * Loading bytecode with an extra header is disabled for security[m
[31m-         * reasons. This may circumvent the usual check for bytecode vs.[m
[31m-         * Lua code by looking at the first char. Since this is a potential[m
[31m-         * security violation no attempt is made to echo the chunkname either.[m
[31m-         */[m
[31m-        if (lf.file_type == NGX_LUA_BT_LJ && sharp) {[m
[31m-[m
[31m-            if (filename) {[m
[31m-                fclose(lf.f);  /* close file (even in case of errors) */[m
[31m-            }[m
[31m-[m
[31m-            filename = lua_tostring(L, fname_index) + 1;[m
[31m-            lua_pushfstring(L, "bad byte-code header in %s", filename);[m
[31m-            lua_remove(L, fname_index);[m
[31m-[m
[31m-            return LUA_ERRFILE;[m
[31m-        }[m
[31m-[m
[31m-        while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) {[m
[31m-            /* skip eventual `#!...' */[m
[31m-        }[m
[31m-[m
[31m-        status = ngx_http_lua_clfactory_bytecode_prepare(L, &lf, fname_index);[m
[31m-[m
[31m-        if (status != 0) {[m
[31m-            return status;[m
[31m-        }[m
[31m-[m
[31m-        lf.extraline = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (lf.file_type == NGX_LUA_TEXT_FILE) {[m
[31m-        ungetc(c, lf.f);[m
[31m-    }[m
[31m-[m
[31m-    lf.sent_begin = lf.sent_end = 0;[m
[31m-    status = lua_load(L, ngx_http_lua_clfactory_getF, &lf,[m
[31m-                      lua_tostring(L, -1));[m
[31m-[m
[31m-    readstatus = ferror(lf.f);[m
[31m-[m
[31m-    if (filename) {[m
[31m-        fclose(lf.f);  /* close file (even in case of errors) */[m
[31m-    }[m
[31m-[m
[31m-    if (readstatus) {[m
[31m-        lua_settop(L, fname_index);  /* ignore results from `lua_load' */[m
[31m-        return ngx_http_lua_clfactory_errfile(L, "read", fname_index);[m
[31m-    }[m
[31m-[m
[31m-    lua_remove(L, fname_index);[m
[31m-[m
[31m-    return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_clfactory_loadbuffer(lua_State *L, const char *buff,[m
[31m-    size_t size, const char *name)[m
[31m-{[m
[31m-    ngx_http_lua_clfactory_buffer_ctx_t     ls;[m
[31m-[m
[31m-    ls.s = buff;[m
[31m-    ls.size = size;[m
[31m-    ls.sent_begin = 0;[m
[31m-    ls.sent_end = 0;[m
[31m-[m
[31m-    return lua_load(L, ngx_http_lua_clfactory_getS, &ls, name);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *[m
[31m-ngx_http_lua_clfactory_getF(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-    char                        *buf;[m
[31m-    size_t                       num;[m
[31m-[m
[31m-    ngx_http_lua_clfactory_file_ctx_t        *lf;[m
[31m-[m
[31m-    lf = (ngx_http_lua_clfactory_file_ctx_t *) ud;[m
[31m-[m
[31m-    if (lf->extraline) {[m
[31m-        lf->extraline = 0;[m
[31m-        *size = 1;[m
[31m-        return "\n";[m
[31m-    }[m
[31m-[m
[31m-    if (lf->sent_begin == 0) {[m
[31m-        lf->sent_begin = 1;[m
[31m-        *size = lf->begin_code_len;[m
[31m-[m
[31m-        if (lf->file_type == NGX_LUA_TEXT_FILE) {[m
[31m-            buf = lf->begin_code.ptr;[m
[31m-[m
[31m-        } else {[m
[31m-            buf = lf->begin_code.str;[m
[31m-        }[m
[31m-[m
[31m-        return buf;[m
[31m-    }[m
[31m-[m
[31m-    num = fread(lf->buff, 1, sizeof(lf->buff), lf->f);[m
[31m-[m
[31m-    dd("fread returned %d", (int) num);[m
[31m-[m
[31m-    if (num == 0) {[m
[31m-        if (lf->sent_end == 0) {[m
[31m-            lf->sent_end = 1;[m
[31m-            *size = lf->end_code_len;[m
[31m-[m
[31m-            if (lf->file_type == NGX_LUA_BT_LUA) {[m
[31m-                buf = lf->end_code.str;[m
[31m-[m
[31m-            } else {[m
[31m-                buf = lf->end_code.ptr;[m
[31m-            }[m
[31m-[m
[31m-            return buf;[m
[31m-        }[m
[31m-[m
[31m-        *size = 0;[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (lf->file_type == NGX_LUA_BT_LJ) {[m
[31m-        /* skip the footer(\x00) in luajit */[m
[31m-[m
[31m-        lf->rest_len -= num;[m
[31m-[m
[31m-        if (lf->rest_len == 0) {[m
[31m-            if (--num == 0 && lf->sent_end == 0) {[m
[31m-                lf->sent_end = 1;[m
[31m-                buf = lf->end_code.ptr;[m
[31m-                *size = lf->end_code_len;[m
[31m-[m
[31m-                return buf;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *size = num;[m
[31m-    return lf->buff;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_clfactory_errfile(lua_State *L, const char *what, int fname_index)[m
[31m-{[m
[31m-    const char      *serr;[m
[31m-    const char      *filename;[m
[31m-[m
[31m-    filename = lua_tostring(L, fname_index) + 1;[m
[31m-[m
[31m-    if (errno) {[m
[31m-        serr = strerror(errno);[m
[31m-        lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushfstring(L, "cannot %s %s", what, filename);[m
[31m-    }[m
[31m-[m
[31m-    lua_remove(L, fname_index);[m
[31m-[m
[31m-    return LUA_ERRFILE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static const char *[m
[31m-ngx_http_lua_clfactory_getS(lua_State *L, void *ud, size_t *size)[m
[31m-{[m
[31m-    ngx_http_lua_clfactory_buffer_ctx_t      *ls = ud;[m
[31m-[m
[31m-    if (ls->sent_begin == 0) {[m
[31m-        ls->sent_begin = 1;[m
[31m-        *size = CLFACTORY_BEGIN_SIZE;[m
[31m-[m
[31m-        return CLFACTORY_BEGIN_CODE;[m
[31m-    }[m
[31m-[m
[31m-    if (ls->size == 0) {[m
[31m-        if (ls->sent_end == 0) {[m
[31m-            ls->sent_end = 1;[m
[31m-            *size = CLFACTORY_END_SIZE;[m
[31m-            return CLFACTORY_END_CODE;[m
[31m-        }[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    *size = ls->size;[m
[31m-    ls->size = 0;[m
[31m-[m
[31m-    return ls->s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static long[m
[31m-ngx_http_lua_clfactory_file_size(FILE *f)[m
[31m-{[m
[31m-    long              cur_pos, len;[m
[31m-[m
[31m-    cur_pos = ftell(f);[m
[31m-    if (cur_pos == -1) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (fseek(f, 0, SEEK_END) != 0) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    len = ftell(f);[m
[31m-    if (len == -1) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    if (fseek(f, cur_pos, SEEK_SET) != 0) {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.h[m
[1mdeleted file mode 100644[m
[1mindex 806d8af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_clfactory.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CLFACTORY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CLFACTORY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_clfactory_loadfile(lua_State *L, const char *filename);[m
[31m-ngx_int_t ngx_http_lua_clfactory_loadbuffer(lua_State *L, const char *buff,[m
[31m-    size_t size, const char *name);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CLFACTORY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_common.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_common.h[m
[1mdeleted file mode 100644[m
[1mindex 758c42a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_common.h[m
[1m+++ /dev/null[m
[36m@@ -1,541 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_COMMON_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_COMMON_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <ngx_md5.h>[m
[31m-[m
[31m-#include <setjmp.h>[m
[31m-#include <stdint.h>[m
[31m-[m
[31m-#include <lua.h>[m
[31m-#include <lualib.h>[m
[31m-#include <lauxlib.h>[m
[31m-[m
[31m-[m
[31m-#if !defined(nginx_version) || (nginx_version < 1006000)[m
[31m-#error at least nginx 1.6.0 is required but found an older version[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-#include <ndk.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if LUA_VERSION_NUM != 501[m
[31m-#   error unsupported Lua language version[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (!defined OPENSSL_NO_OCSP && defined SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB)[m
[31m-#   define NGX_HTTP_LUA_USE_OCSP 1[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef MD5_DIGEST_LENGTH[m
[31m-#define MD5_DIGEST_LENGTH 16[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-#   include <assert.h>[m
[31m-#   define ngx_http_lua_assert(a)  assert(a)[m
[31m-#else[m
[31m-#   define ngx_http_lua_assert(a)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* Nginx HTTP Lua Inline tag prefix */[m
[31m-[m
[31m-#define NGX_HTTP_LUA_INLINE_TAG "nhli_"[m
[31m-[m
[31m-#define NGX_HTTP_LUA_INLINE_TAG_LEN \[m
[31m-    (sizeof(NGX_HTTP_LUA_INLINE_TAG) - 1)[m
[31m-[m
[31m-#define NGX_HTTP_LUA_INLINE_KEY_LEN \[m
[31m-    (NGX_HTTP_LUA_INLINE_TAG_LEN + 2 * MD5_DIGEST_LENGTH)[m
[31m-[m
[31m-/* Nginx HTTP Lua File tag prefix */[m
[31m-[m
[31m-#define NGX_HTTP_LUA_FILE_TAG "nhlf_"[m
[31m-[m
[31m-#define NGX_HTTP_LUA_FILE_TAG_LEN \[m
[31m-    (sizeof(NGX_HTTP_LUA_FILE_TAG) - 1)[m
[31m-[m
[31m-#define NGX_HTTP_LUA_FILE_KEY_LEN \[m
[31m-    (NGX_HTTP_LUA_FILE_TAG_LEN + 2 * MD5_DIGEST_LENGTH)[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-typedef struct {[m
[31m-    size_t       size;[m
[31m-    u_char      *key;[m
[31m-    ngx_str_t    script;[m
[31m-} ngx_http_lua_set_var_data_t;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_MAX_ARGS[m
[31m-#define NGX_HTTP_LUA_MAX_ARGS 100[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_MAX_HEADERS[m
[31m-#define NGX_HTTP_LUA_MAX_HEADERS 100[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* must be within 16 bit */[m
[31m-#define NGX_HTTP_LUA_CONTEXT_SET            0x001[m
[31m-#define NGX_HTTP_LUA_CONTEXT_REWRITE        0x002[m
[31m-#define NGX_HTTP_LUA_CONTEXT_ACCESS         0x004[m
[31m-#define NGX_HTTP_LUA_CONTEXT_CONTENT        0x008[m
[31m-#define NGX_HTTP_LUA_CONTEXT_LOG            0x010[m
[31m-#define NGX_HTTP_LUA_CONTEXT_HEADER_FILTER  0x020[m
[31m-#define NGX_HTTP_LUA_CONTEXT_BODY_FILTER    0x040[m
[31m-#define NGX_HTTP_LUA_CONTEXT_TIMER          0x080[m
[31m-#define NGX_HTTP_LUA_CONTEXT_INIT_WORKER    0x100[m
[31m-#define NGX_HTTP_LUA_CONTEXT_BALANCER       0x200[m
[31m-#define NGX_HTTP_LUA_CONTEXT_SSL_CERT       0x400[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-#define NGX_HTTP_LUA_FFI_NO_REQ_CTX         -100[m
[31m-#define NGX_HTTP_LUA_FFI_BAD_CONTEXT        -101[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_main_conf_s  ngx_http_lua_main_conf_t;[m
[31m-typedef union ngx_http_lua_srv_conf_u  ngx_http_lua_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_balancer_peer_data_s[m
[31m-    ngx_http_lua_balancer_peer_data_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_sema_mm_s  ngx_http_lua_sema_mm_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_lua_main_conf_handler_pt)(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-typedef ngx_int_t (*ngx_http_lua_srv_conf_handler_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char              *package;[m
[31m-    lua_CFunction        loader;[m
[31m-} ngx_http_lua_preload_hook_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_main_conf_s {[m
[31m-    lua_State           *lua;[m
[31m-[m
[31m-    ngx_str_t            lua_path;[m
[31m-    ngx_str_t            lua_cpath;[m
[31m-[m
[31m-    ngx_cycle_t         *cycle;[m
[31m-    ngx_pool_t          *pool;[m
[31m-[m
[31m-    ngx_int_t            max_pending_timers;[m
[31m-    ngx_int_t            pending_timers;[m
[31m-[m
[31m-    ngx_int_t            max_running_timers;[m
[31m-    ngx_int_t            running_timers;[m
[31m-[m
[31m-    ngx_connection_t    *watcher;  /* for watching the process exit event */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_int_t            regex_cache_entries;[m
[31m-    ngx_int_t            regex_cache_max_entries;[m
[31m-    ngx_int_t            regex_match_limit;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_array_t         *shm_zones;  /* of ngx_shm_zone_t* */[m
[31m-[m
[31m-    ngx_array_t         *preload_hooks; /* of ngx_http_lua_preload_hook_t */[m
[31m-[m
[31m-    ngx_flag_t           postponed_to_rewrite_phase_end;[m
[31m-    ngx_flag_t           postponed_to_access_phase_end;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_handler_pt    init_handler;[m
[31m-    ngx_str_t                            init_src;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_handler_pt    init_worker_handler;[m
[31m-    ngx_str_t                            init_worker_src;[m
[31m-[m
[31m-    ngx_http_lua_balancer_peer_data_t      *balancer_peer_data;[m
[31m-                    /* balancer_by_lua does not support yielding and[m
[31m-                     * there cannot be any conflicts among concurrent requests,[m
[31m-                     * thus it is safe to store the peer data in the main conf.[m
[31m-                     */[m
[31m-[m
[31m-    ngx_uint_t                      shm_zones_inited;[m
[31m-[m
[31m-    ngx_http_lua_sema_mm_t         *sema_mm;[m
[31m-[m
[31m-    unsigned             requires_header_filter:1;[m
[31m-    unsigned             requires_body_filter:1;[m
[31m-    unsigned             requires_capture_filter:1;[m
[31m-    unsigned             requires_rewrite:1;[m
[31m-    unsigned             requires_access:1;[m
[31m-    unsigned             requires_log:1;[m
[31m-    unsigned             requires_shm:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-union ngx_http_lua_srv_conf_u {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    struct {[m
[31m-        ngx_http_lua_srv_conf_handler_pt     cert_handler;[m
[31m-        ngx_str_t                            cert_src;[m
[31m-        u_char                              *cert_src_key;[m
[31m-    } ssl;[m
[31m-#endif[m
[31m-[m
[31m-    struct {[m
[31m-        ngx_str_t           src;[m
[31m-        u_char             *src_key;[m
[31m-[m
[31m-        ngx_http_lua_srv_conf_handler_pt  handler;[m
[31m-    } balancer;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_ssl_t              *ssl;  /* shared by SSL cosockets */[m
[31m-    ngx_uint_t              ssl_protocols;[m
[31m-    ngx_str_t               ssl_ciphers;[m
[31m-    ngx_uint_t              ssl_verify_depth;[m
[31m-    ngx_str_t               ssl_trusted_certificate;[m
[31m-    ngx_str_t               ssl_crl;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_flag_t              force_read_body; /* whether force request body to[m
[31m-                                                be read */[m
[31m-[m
[31m-    ngx_flag_t              enable_code_cache; /* whether to enable[m
[31m-                                                  code cache */[m
[31m-[m
[31m-    ngx_flag_t              http10_buffering;[m
[31m-[m
[31m-    ngx_http_handler_pt     rewrite_handler;[m
[31m-    ngx_http_handler_pt     access_handler;[m
[31m-    ngx_http_handler_pt     content_handler;[m
[31m-    ngx_http_handler_pt     log_handler;[m
[31m-    ngx_http_handler_pt     header_filter_handler;[m
[31m-[m
[31m-    ngx_http_output_body_filter_pt         body_filter_handler;[m
[31m-[m
[31m-    u_char                  *rewrite_chunkname;[m
[31m-    ngx_http_complex_value_t rewrite_src;    /*  rewrite_by_lua[m
[31m-                                                inline script/script[m
[31m-                                                file path */[m
[31m-[m
[31m-    u_char                  *rewrite_src_key; /* cached key for rewrite_src */[m
[31m-[m
[31m-    u_char                  *access_chunkname;[m
[31m-    ngx_http_complex_value_t access_src;     /*  access_by_lua[m
[31m-                                                inline script/script[m
[31m-                                                file path */[m
[31m-[m
[31m-    u_char                  *access_src_key; /* cached key for access_src */[m
[31m-[m
[31m-    u_char                  *content_chunkname;[m
[31m-    ngx_http_complex_value_t content_src;    /*  content_by_lua[m
[31m-                                                inline script/script[m
[31m-                                                file path */[m
[31m-[m
[31m-    u_char                 *content_src_key; /* cached key for content_src */[m
[31m-[m
[31m-[m
[31m-    u_char                      *log_chunkname;[m
[31m-    ngx_http_complex_value_t     log_src;     /* log_by_lua inline script/script[m
[31m-                                                 file path */[m
[31m-[m
[31m-    u_char                      *log_src_key; /* cached key for log_src */[m
[31m-[m
[31m-    ngx_http_complex_value_t header_filter_src;  /*  header_filter_by_lua[m
[31m-                                                     inline script/script[m
[31m-                                                     file path */[m
[31m-[m
[31m-    u_char                 *header_filter_src_key;[m
[31m-                                    /* cached key for header_filter_src */[m
[31m-[m
[31m-[m
[31m-    ngx_http_complex_value_t         body_filter_src;[m
[31m-    u_char                          *body_filter_src_key;[m
[31m-[m
[31m-    ngx_msec_t                       keepalive_timeout;[m
[31m-    ngx_msec_t                       connect_timeout;[m
[31m-    ngx_msec_t                       send_timeout;[m
[31m-    ngx_msec_t                       read_timeout;[m
[31m-[m
[31m-    size_t                           send_lowat;[m
[31m-    size_t                           buffer_size;[m
[31m-[m
[31m-    ngx_uint_t                       pool_size;[m
[31m-[m
[31m-    ngx_flag_t                       transform_underscores_in_resp_headers;[m
[31m-    ngx_flag_t                       log_socket_errors;[m
[31m-    ngx_flag_t                       check_client_abort;[m
[31m-    ngx_flag_t                       use_default_type;[m
[31m-} ngx_http_lua_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_LUA_USER_CORO_NOP      = 0,[m
[31m-    NGX_HTTP_LUA_USER_CORO_RESUME   = 1,[m
[31m-    NGX_HTTP_LUA_USER_CORO_YIELD    = 2,[m
[31m-    NGX_HTTP_LUA_USER_THREAD_RESUME = 3[m
[31m-} ngx_http_lua_user_coro_op_t;[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    NGX_HTTP_LUA_CO_RUNNING   = 0, /* coroutine running */[m
[31m-    NGX_HTTP_LUA_CO_SUSPENDED = 1, /* coroutine suspended */[m
[31m-    NGX_HTTP_LUA_CO_NORMAL    = 2, /* coroutine normal */[m
[31m-    NGX_HTTP_LUA_CO_DEAD      = 3, /* coroutine dead */[m
[31m-    NGX_HTTP_LUA_CO_ZOMBIE    = 4, /* coroutine zombie */[m
[31m-} ngx_http_lua_co_status_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_co_ctx_s  ngx_http_lua_co_ctx_t;[m
[31m-[m
[31m-typedef struct ngx_http_lua_posted_thread_s  ngx_http_lua_posted_thread_t;[m
[31m-[m
[31m-struct ngx_http_lua_posted_thread_s {[m
[31m-    ngx_http_lua_co_ctx_t               *co_ctx;[m
[31m-    ngx_http_lua_posted_thread_t        *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NGX_HTTP_LUA_SUBREQ_TRUNCATED = 1[m
[31m-};[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_co_ctx_s {[m
[31m-    void                    *data;      /* user state for cosockets */[m
[31m-[m
[31m-    lua_State               *co;[m
[31m-    ngx_http_lua_co_ctx_t   *parent_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_posted_thread_t    *zombie_child_threads;[m
[31m-[m
[31m-    ngx_http_cleanup_pt      cleanup;[m
[31m-[m
[31m-    ngx_int_t               *sr_statuses; /* all capture subrequest statuses */[m
[31m-[m
[31m-    ngx_http_headers_out_t **sr_headers;[m
[31m-[m
[31m-    ngx_str_t               *sr_bodies;   /* all captured subrequest bodies */[m
[31m-[m
[31m-    uint8_t                 *sr_flags;[m
[31m-[m
[31m-    unsigned                 nsubreqs;  /* number of subrequests of the[m
[31m-                                         * current request */[m
[31m-[m
[31m-    unsigned                 pending_subreqs; /* number of subrequests being[m
[31m-                                                 waited */[m
[31m-[m
[31m-    ngx_event_t              sleep;  /* used for ngx.sleep */[m
[31m-[m
[31m-    ngx_queue_t              sem_wait_queue;[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    int                      co_top; /* stack top after yielding/creation,[m
[31m-                                        only for sanity checks */[m
[31m-#endif[m
[31m-[m
[31m-    int                      co_ref; /*  reference to anchor the thread[m
[31m-                                         coroutines (entry coroutine and user[m
[31m-                                         threads) in the Lua registry,[m
[31m-                                         preventing the thread coroutine[m
[31m-                                         from beging collected by the[m
[31m-                                         Lua GC */[m
[31m-[m
[31m-    unsigned                 waited_by_parent:1;  /* whether being waited by[m
[31m-                                                     a parent coroutine */[m
[31m-[m
[31m-    unsigned                 co_status:3;  /* the current coroutine's status */[m
[31m-[m
[31m-    unsigned                 flushing:1; /* indicates whether the current[m
[31m-                                            coroutine is waiting for[m
[31m-                                            ngx.flush(true) */[m
[31m-[m
[31m-    unsigned                 is_uthread:1; /* whether the current coroutine is[m
[31m-                                              a user thread */[m
[31m-[m
[31m-    unsigned                 thread_spawn_yielded:1; /* yielded from[m
[31m-                                                        the ngx.thread.spawn()[m
[31m-                                                        call */[m
[31m-    unsigned                 sem_resume_status:1;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    lua_State       *vm;[m
[31m-    ngx_int_t        count;[m
[31m-} ngx_http_lua_vm_state_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_ctx_s {[m
[31m-    /* for lua_coce_cache off: */[m
[31m-    ngx_http_lua_vm_state_t  *vm_state;[m
[31m-[m
[31m-    ngx_http_request_t      *request;[m
[31m-    ngx_http_handler_pt      resume_handler;[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t   *cur_co_ctx; /* co ctx for the current coroutine */[m
[31m-[m
[31m-    /* FIXME: we should use rbtree here to prevent O(n) lookup overhead */[m
[31m-    ngx_list_t              *user_co_ctx; /* coroutine contexts for user[m
[31m-                                             coroutines */[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t    entry_co_ctx; /* coroutine context for the[m
[31m-                                              entry coroutine */[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t   *on_abort_co_ctx; /* coroutine context for the[m
[31m-                                                 on_abort thread */[m
[31m-[m
[31m-    int                      ctx_ref;  /*  reference to anchor[m
[31m-                                           request ctx data in lua[m
[31m-                                           registry */[m
[31m-[m
[31m-    unsigned                 flushing_coros; /* number of coroutines waiting on[m
[31m-                                                ngx.flush(true) */[m
[31m-[m
[31m-    ngx_chain_t             *out;  /* buffered output chain for HTTP 1.0 */[m
[31m-    ngx_chain_t             *free_bufs;[m
[31m-    ngx_chain_t             *busy_bufs;[m
[31m-    ngx_chain_t             *free_recv_bufs;[m
[31m-[m
[31m-    ngx_http_cleanup_pt     *cleanup;[m
[31m-[m
[31m-    ngx_http_cleanup_t      *free_cleanup; /* free list of cleanup records */[m
[31m-[m
[31m-    ngx_chain_t             *body; /* buffered subrequest response body[m
[31m-                                      chains */[m
[31m-[m
[31m-    ngx_chain_t            **last_body; /* for the "body" field */[m
[31m-[m
[31m-    ngx_str_t                exec_uri;[m
[31m-    ngx_str_t                exec_args;[m
[31m-[m
[31m-    ngx_int_t                exit_code;[m
[31m-[m
[31m-    void                    *downstream;  /* can be either[m
[31m-                                             ngx_http_lua_socket_tcp_upstream_t[m
[31m-                                             or ngx_http_lua_co_ctx_t */[m
[31m-[m
[31m-    ngx_uint_t               index;              /* index of the current[m
[31m-                                                    subrequest in its parent[m
[31m-                                                    request */[m
[31m-[m
[31m-    ngx_http_lua_posted_thread_t   *posted_threads;[m
[31m-[m
[31m-    int                      uthreads; /* number of active user threads */[m
[31m-[m
[31m-    uint16_t                 context;   /* the current running directive context[m
[31m-                                           (or running phase) for the current[m
[31m-                                           Lua chunk */[m
[31m-[m
[31m-    unsigned                 run_post_subrequest:1; /* whether it has run[m
[31m-                                                       post_subrequest[m
[31m-                                                       (for subrequests only) */[m
[31m-[m
[31m-    unsigned                 waiting_more_body:1;   /* 1: waiting for more[m
[31m-                                                       request body data;[m
[31m-                                                       0: no need to wait */[m
[31m-[m
[31m-    unsigned         co_op:2; /*  coroutine API operation */[m
[31m-[m
[31m-    unsigned         exited:1;[m
[31m-[m
[31m-    unsigned         eof:1;             /*  1: last_buf has been sent;[m
[31m-                                            0: last_buf not sent yet */[m
[31m-[m
[31m-    unsigned         capture:1;  /*  1: response body of current request[m
[31m-                                        is to be captured by the lua[m
[31m-                                        capture filter,[m
[31m-                                     0: not to be captured */[m
[31m-[m
[31m-[m
[31m-    unsigned         read_body_done:1;      /* 1: request body has been all[m
[31m-                                               read; 0: body has not been[m
[31m-                                               all read */[m
[31m-[m
[31m-    unsigned         headers_set:1; /* whether the user has set custom[m
[31m-                                       response headers */[m
[31m-[m
[31m-    unsigned         entered_rewrite_phase:1;[m
[31m-    unsigned         entered_access_phase:1;[m
[31m-    unsigned         entered_content_phase:1;[m
[31m-[m
[31m-    unsigned         buffering:1; /* HTTP 1.0 response body buffering flag */[m
[31m-[m
[31m-    unsigned         no_abort:1; /* prohibit "world abortion" via ngx.exit()[m
[31m-                                    and etc */[m
[31m-[m
[31m-    unsigned         header_sent:1; /* r->header_sent is not sufficient for[m
[31m-                                     * this because special header filters[m
[31m-                                     * like ngx_image_filter may intercept[m
[31m-                                     * the header. so we should always test[m
[31m-                                     * both flags. see the test case in[m
[31m-                                     * t/020-subrequest.t */[m
[31m-[m
[31m-    unsigned         seen_last_in_filter:1;  /* used by body_filter_by_lua* */[m
[31m-    unsigned         seen_last_for_subreq:1; /* used by body capture filter */[m
[31m-    unsigned         writing_raw_req_socket:1; /* used by raw downstream[m
[31m-                                                  socket */[m
[31m-    unsigned         acquired_raw_req_socket:1;  /* whether a raw req socket[m
[31m-                                                    is acquired */[m
[31m-    unsigned         seen_body_data:1;[m
[31m-} ngx_http_lua_ctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_header_val_s  ngx_http_lua_header_val_t;[m
[31m-[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_http_lua_set_header_pt)(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_header_val_s {[m
[31m-    ngx_http_complex_value_t                value;[m
[31m-    ngx_uint_t                              hash;[m
[31m-    ngx_str_t                               key;[m
[31m-    ngx_http_lua_set_header_pt              handler;[m
[31m-    ngx_uint_t                              offset;[m
[31m-    unsigned                                no_override;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                               name;[m
[31m-    ngx_uint_t                              offset;[m
[31m-    ngx_http_lua_set_header_pt              handler;[m
[31m-[m
[31m-} ngx_http_lua_set_header_t;[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t ngx_http_lua_module;[m
[31m-extern ngx_http_output_header_filter_pt ngx_http_lua_next_header_filter;[m
[31m-extern ngx_http_output_body_filter_pt ngx_http_lua_next_body_filter;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_COMMON_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_config.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_config.c[m
[1mdeleted file mode 100644[m
[1mindex 3323175..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_config.c[m
[1m+++ /dev/null[m
[36m@@ -1,70 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_config.h"[m
[31m-#include "api/ngx_http_lua_api.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_config_prefix(lua_State *L);[m
[31m-static int ngx_http_lua_config_configure(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_config_api(lua_State *L)[m
[31m-{[m
[31m-    /* ngx.config */[m
[31m-[m
[31m-    lua_createtable(L, 0, 6 /* nrec */);    /* .config */[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    lua_pushboolean(L, 1);[m
[31m-#else[m
[31m-    lua_pushboolean(L, 0);[m
[31m-#endif[m
[31m-    lua_setfield(L, -2, "debug");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_config_prefix);[m
[31m-    lua_setfield(L, -2, "prefix");[m
[31m-[m
[31m-    lua_pushinteger(L, nginx_version);[m
[31m-    lua_setfield(L, -2, "nginx_version");[m
[31m-[m
[31m-    lua_pushinteger(L, ngx_http_lua_version);[m
[31m-    lua_setfield(L, -2, "ngx_lua_version");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_config_configure);[m
[31m-    lua_setfield(L, -2, "nginx_configure");[m
[31m-[m
[31m-    lua_pushliteral(L, "http");[m
[31m-    lua_setfield(L, -2, "subsystem");[m
[31m-[m
[31m-    lua_setfield(L, -2, "config");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_config_prefix(lua_State *L)[m
[31m-{[m
[31m-    lua_pushlstring(L, (char *) ngx_cycle->prefix.data,[m
[31m-                    ngx_cycle->prefix.len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_config_configure(lua_State *L)[m
[31m-{[m
[31m-    lua_pushliteral(L, NGX_CONFIGURE);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_config.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_config.h[m
[1mdeleted file mode 100644[m
[1mindex 9f85f31..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_config.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CONFIG_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CONFIG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_config_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CONFIG_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_consts.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_consts.c[m
[1mdeleted file mode 100644[m
[1mindex 30a86f1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_consts.c[m
[1m+++ /dev/null[m
[36m@@ -1,199 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_core_consts(lua_State *L)[m
[31m-{[m
[31m-    /* {{{ core constants */[m
[31m-    lua_pushinteger(L, NGX_OK);[m
[31m-    lua_setfield(L, -2, "OK");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_AGAIN);[m
[31m-    lua_setfield(L, -2, "AGAIN");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_DONE);[m
[31m-    lua_setfield(L, -2, "DONE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_DECLINED);[m
[31m-    lua_setfield(L, -2, "DECLINED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_ERROR);[m
[31m-    lua_setfield(L, -2, "ERROR");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, NULL);[m
[31m-    lua_setfield(L, -2, "null");[m
[31m-    /* }}} */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_http_consts(lua_State *L)[m
[31m-{[m
[31m-    /* {{{ HTTP status constants */[m
[31m-    lua_pushinteger(L, NGX_HTTP_GET);[m
[31m-    lua_setfield(L, -2, "HTTP_GET");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_POST);[m
[31m-    lua_setfield(L, -2, "HTTP_POST");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PUT);[m
[31m-    lua_setfield(L, -2, "HTTP_PUT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_HEAD);[m
[31m-    lua_setfield(L, -2, "HTTP_HEAD");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_DELETE);[m
[31m-    lua_setfield(L, -2, "HTTP_DELETE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_OPTIONS);[m
[31m-    lua_setfield(L, -2, "HTTP_OPTIONS");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_MKCOL);[m
[31m-    lua_setfield(L, -2, "HTTP_MKCOL");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_COPY);[m
[31m-    lua_setfield(L, -2, "HTTP_COPY");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_MOVE);[m
[31m-    lua_setfield(L, -2, "HTTP_MOVE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PROPFIND);[m
[31m-    lua_setfield(L, -2, "HTTP_PROPFIND");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PROPPATCH);[m
[31m-    lua_setfield(L, -2, "HTTP_PROPPATCH");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_LOCK);[m
[31m-    lua_setfield(L, -2, "HTTP_LOCK");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_UNLOCK);[m
[31m-    lua_setfield(L, -2, "HTTP_UNLOCK");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PATCH);[m
[31m-    lua_setfield(L, -2, "HTTP_PATCH");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_TRACE);[m
[31m-    lua_setfield(L, -2, "HTTP_TRACE");[m
[31m-    /* }}} */[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_CONTINUE);[m
[31m-    lua_setfield(L, -2, "HTTP_CONTINUE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_SWITCHING_PROTOCOLS);[m
[31m-    lua_setfield(L, -2, "HTTP_SWITCHING_PROTOCOLS");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_OK);[m
[31m-    lua_setfield(L, -2, "HTTP_OK");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_CREATED);[m
[31m-    lua_setfield(L, -2, "HTTP_CREATED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_ACCEPTED);[m
[31m-    lua_setfield(L, -2, "HTTP_ACCEPTED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NO_CONTENT);[m
[31m-    lua_setfield(L, -2, "HTTP_NO_CONTENT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_PARTIAL_CONTENT);[m
[31m-    lua_setfield(L, -2, "HTTP_PARTIAL_CONTENT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_SPECIAL_RESPONSE);[m
[31m-    lua_setfield(L, -2, "HTTP_SPECIAL_RESPONSE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_MOVED_PERMANENTLY);[m
[31m-    lua_setfield(L, -2, "HTTP_MOVED_PERMANENTLY");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_MOVED_TEMPORARILY);[m
[31m-    lua_setfield(L, -2, "HTTP_MOVED_TEMPORARILY");[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8042[m
[31m-    lua_pushinteger(L, NGX_HTTP_SEE_OTHER);[m
[31m-    lua_setfield(L, -2, "HTTP_SEE_OTHER");[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NOT_MODIFIED);[m
[31m-    lua_setfield(L, -2, "HTTP_NOT_MODIFIED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_TEMPORARY_REDIRECT);[m
[31m-    lua_setfield(L, -2, "HTTP_TEMPORARY_REDIRECT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_BAD_REQUEST);[m
[31m-    lua_setfield(L, -2, "HTTP_BAD_REQUEST");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_UNAUTHORIZED);[m
[31m-    lua_setfield(L, -2, "HTTP_UNAUTHORIZED");[m
[31m-[m
[31m-    lua_pushinteger(L, 402);[m
[31m-    lua_setfield(L, -2, "HTTP_PAYMENT_REQUIRED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_FORBIDDEN);[m
[31m-    lua_setfield(L, -2, "HTTP_FORBIDDEN");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NOT_FOUND);[m
[31m-    lua_setfield(L, -2, "HTTP_NOT_FOUND");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NOT_ALLOWED);[m
[31m-    lua_setfield(L, -2, "HTTP_NOT_ALLOWED");[m
[31m-[m
[31m-    lua_pushinteger(L, 406);[m
[31m-    lua_setfield(L, -2, "HTTP_NOT_ACCEPTABLE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_REQUEST_TIME_OUT);[m
[31m-    lua_setfield(L, -2, "HTTP_REQUEST_TIMEOUT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_CONFLICT);[m
[31m-    lua_setfield(L, -2, "HTTP_CONFLICT");[m
[31m-[m
[31m-    lua_pushinteger(L, 410);[m
[31m-    lua_setfield(L, -2, "HTTP_GONE");[m
[31m-[m
[31m-    lua_pushinteger(L, 426);[m
[31m-    lua_setfield(L, -2, "HTTP_UPGRADE_REQUIRED");[m
[31m-[m
[31m-    lua_pushinteger(L, 429);[m
[31m-    lua_setfield(L, -2, "HTTP_TOO_MANY_REQUESTS");[m
[31m-[m
[31m-    lua_pushinteger(L, 451);[m
[31m-    lua_setfield(L, -2, "HTTP_ILLEGAL");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_CLOSE);[m
[31m-    lua_setfield(L, -2, "HTTP_CLOSE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-    lua_setfield(L, -2, "HTTP_INTERNAL_SERVER_ERROR");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_NOT_IMPLEMENTED);[m
[31m-    lua_setfield(L, -2, "HTTP_METHOD_NOT_IMPLEMENTED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_BAD_GATEWAY);[m
[31m-    lua_setfield(L, -2, "HTTP_BAD_GATEWAY");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-    lua_setfield(L, -2, "HTTP_SERVICE_UNAVAILABLE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_GATEWAY_TIME_OUT);[m
[31m-    lua_setfield(L, -2, "HTTP_GATEWAY_TIMEOUT");[m
[31m-[m
[31m-    lua_pushinteger(L, 505);[m
[31m-    lua_setfield(L, -2, "HTTP_VERSION_NOT_SUPPORTED");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_HTTP_INSUFFICIENT_STORAGE);[m
[31m-    lua_setfield(L, -2, "HTTP_INSUFFICIENT_STORAGE");[m
[31m-[m
[31m-    /* }}} */[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_consts.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_consts.h[m
[1mdeleted file mode 100644[m
[1mindex c403f81..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_consts.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CONSTS_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CONSTS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_http_consts(lua_State *L);[m
[31m-void ngx_http_lua_inject_core_consts(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CONSTS_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_contentby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_contentby.c[m
[1mdeleted file mode 100644[m
[1mindex 6718885..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_contentby.c[m
[1m+++ /dev/null[m
[36m@@ -1,379 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-static void ngx_http_lua_content_phase_post_read(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                      co_ref;[m
[31m-    ngx_int_t                rc;[m
[31m-    lua_State               *co;[m
[31m-    ngx_event_t             *rev;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_cleanup_t      *cln;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t      *llcf;[m
[31m-[m
[31m-    dd("content by chunk");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        dd("reset ctx");[m
[31m-        ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-    }[m
[31m-[m
[31m-    ctx->entered_content_phase = 1;[m
[31m-[m
[31m-    /*  {{{ new coroutine to handle request */[m
[31m-    co = ngx_http_lua_new_thread(r, L, &co_ref);[m
[31m-[m
[31m-    if (co == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua: failed to create new coroutine to handle request");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  move code closure to new coroutine */[m
[31m-    lua_xmove(L, co, 1);[m
[31m-[m
[31m-    /*  set closure's env table to new coroutine's globals table */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /*  save nginx request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(co, r);[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-    ctx->cur_co_ctx->co = co;[m
[31m-    ctx->cur_co_ctx->co_ref = co_ref;[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /*  {{{ register request cleanup hooks */[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_CONTENT;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->check_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if (!rev->active) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_content_run_posted_threads(L, r, ctx, 0);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        return ngx_http_lua_content_run_posted_threads(L, r, ctx, 1);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_content_wev_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    (void) ctx->resume_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua content handler, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->content_handler == NULL) {[m
[31m-        dd("no content handler found");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("entered? %d", (int) ctx->entered_content_phase);[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        dd("calling wev handler");[m
[31m-        rc = ctx->resume_handler(r);[m
[31m-        dd("wev handler returns %d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->force_read_body && !ctx->read_body_done) {[m
[31m-        r->request_body_in_single_buf = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r,[m
[31m-                                        ngx_http_lua_content_phase_post_read);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            ctx->waiting_more_body = 1;[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("setting entered");[m
[31m-[m
[31m-    ctx->entered_content_phase = 1;[m
[31m-[m
[31m-    dd("calling content handler");[m
[31m-    return llcf->content_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* post read callback for the content phase */[m
[31m-static void[m
[31m-ngx_http_lua_content_phase_post_read(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    ctx->read_body_done = 1;[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        ctx->waiting_more_body = 0;[m
[31m-        ngx_http_lua_finalize_request(r, ngx_http_lua_content_handler(r));[m
[31m-[m
[31m-    } else {[m
[31m-        r->main->count--;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_handler_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &llcf->content_src, &eval_src) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->content_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc < NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_content_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_handler_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->content_src.value.data,[m
[31m-                                       llcf->content_src.value.len,[m
[31m-                                       llcf->content_src_key,[m
[31m-                                       (const char *)[m
[31m-                                       llcf->content_chunkname);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_content_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_content_run_posted_threads(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, int n)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_lua_posted_thread_t    *pt;[m
[31m-[m
[31m-    dd("run posted threads: %p", ctx->posted_threads);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        pt = ctx->posted_threads;[m
[31m-        if (pt == NULL) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-        ctx->posted_threads = pt->next;[m
[31m-[m
[31m-        ngx_http_lua_probe_run_posted_thread(r, pt->co_ctx->co,[m
[31m-                                             (int) pt->co_ctx->co_status);[m
[31m-[m
[31m-        dd("posted thread status: %d", pt->co_ctx->co_status);[m
[31m-[m
[31m-        if (pt->co_ctx->co_status != NGX_HTTP_LUA_CO_RUNNING) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ctx->cur_co_ctx = pt->co_ctx;[m
[31m-[m
[31m-        rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            n++;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            while (n > 0) {[m
[31m-                ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-                n--;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_ERROR || rc > NGX_OK */[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        r->main->count++;[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    /* n > 1 */[m
[31m-[m
[31m-    do {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-    } while (--n > 1);[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_contentby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_contentby.h[m
[1mdeleted file mode 100644[m
[1mindex 58ba8e1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_contentby.h[m
[1m+++ /dev/null[m
[36m@@ -1,26 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CONTENT_BY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CONTENT_BY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_content_by_chunk(lua_State *L, ngx_http_request_t *r);[m
[31m-void ngx_http_lua_content_wev_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_content_handler_file(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_content_handler_inline(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_content_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_content_run_posted_threads(lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx, int n);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CONTENT_BY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_control.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_control.c[m
[1mdeleted file mode 100644[m
[1mindex 4c5f65e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_control.c[m
[1m+++ /dev/null[m
[36m@@ -1,533 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_control.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_coroutine.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_exec(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_redirect(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_exit(lua_State *L);[m
[31m-static int ngx_http_lua_on_abort(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_control_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    /* ngx.redirect */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_redirect);[m
[31m-    lua_setfield(L, -2, "redirect");[m
[31m-[m
[31m-    /* ngx.exec */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_exec);[m
[31m-    lua_setfield(L, -2, "exec");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_exit);[m
[31m-    lua_setfield(L, -2, "throw_error"); /* deprecated */[m
[31m-[m
[31m-    /* ngx.exit */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_exit);[m
[31m-    lua_setfield(L, -2, "exit");[m
[31m-[m
[31m-    /* ngx.on_abort */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_on_abort);[m
[31m-    lua_setfield(L, -2, "on_abort");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_exec(lua_State *L)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_str_t                    uri;[m
[31m-    ngx_str_t                    args, user_args;[m
[31m-    ngx_uint_t                   flags;[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *q;[m
[31m-    size_t                       len;[m
[31m-    const char                  *msg;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting one or two arguments, but got %d",[m
[31m-                          n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_str_null(&args);[m
[31m-[m
[31m-    /* read the 1st argument (uri) */[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return luaL_error(L, "The uri argument is empty");[m
[31m-    }[m
[31m-[m
[31m-    uri.data = ngx_palloc(r->pool, len);[m
[31m-    if (uri.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(uri.data, p, len);[m
[31m-[m
[31m-    uri.len = len;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    ngx_http_lua_check_if_abortable(L, ctx);[m
[31m-[m
[31m-    if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        /* read the 2nd argument (args) */[m
[31m-        dd("args type: %s", luaL_typename(L, 2));[m
[31m-[m
[31m-        switch (lua_type(L, 2)) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            p = (u_char *) lua_tolstring(L, 2, &len);[m
[31m-[m
[31m-            user_args.data = ngx_palloc(r->pool, len);[m
[31m-            if (user_args.data == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(user_args.data, p, len);[m
[31m-[m
[31m-            user_args.len = len;[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            ngx_http_lua_process_args_option(r, L, 2, &user_args);[m
[31m-[m
[31m-            dd("user_args: %.*s", (int) user_args.len, user_args.data);[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TNIL:[m
[31m-            ngx_str_null(&user_args);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "string, number, or table expected, "[m
[31m-                                  "but got %s", luaL_typename(L, 2));[m
[31m-            return luaL_argerror(L, 2, msg);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        user_args.data = NULL;[m
[31m-        user_args.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (user_args.len) {[m
[31m-        if (args.len == 0) {[m
[31m-            args = user_args;[m
[31m-[m
[31m-        } else {[m
[31m-            p = ngx_palloc(r->pool, args.len + user_args.len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-[m
[31m-            q = ngx_copy(p, args.data, args.len);[m
[31m-            *q++ = '&';[m
[31m-            ngx_memcpy(q, user_args.data, user_args.len);[m
[31m-[m
[31m-            args.data = p;[m
[31m-            args.len += user_args.len + 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        return luaL_error(L, "attempt to call ngx.exec after "[m
[31m-                          "sending out response headers");[m
[31m-    }[m
[31m-[m
[31m-    ctx->exec_uri = uri;[m
[31m-    ctx->exec_args = args;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua exec \"%V?%V\"",[m
[31m-                   &ctx->exec_uri, &ctx->exec_args);[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_redirect(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          n;[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *uri;[m
[31m-    size_t                       len;[m
[31m-    ngx_table_elt_t             *h;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting one or two arguments");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        rc = (ngx_int_t) luaL_checknumber(L, 2);[m
[31m-[m
[31m-        if (rc != NGX_HTTP_MOVED_TEMPORARILY[m
[31m-            && rc != NGX_HTTP_MOVED_PERMANENTLY[m
[31m-            && rc != NGX_HTTP_TEMPORARY_REDIRECT)[m
[31m-        {[m
[31m-            return luaL_error(L, "only ngx.HTTP_MOVED_TEMPORARILY, "[m
[31m-                              "ngx.HTTP_MOVED_PERMANENTLY, and "[m
[31m-                              "ngx.HTTP_TEMPORARY_REDIRECT are allowed");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        rc = NGX_HTTP_MOVED_TEMPORARILY;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    ngx_http_lua_check_if_abortable(L, ctx);[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        return luaL_error(L, "attempt to call ngx.redirect after sending out "[m
[31m-                          "the headers");[m
[31m-    }[m
[31m-[m
[31m-    uri = ngx_palloc(r->pool, len);[m
[31m-    if (uri == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(uri, p, len);[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    h->hash = ngx_http_lua_location_hash;[m
[31m-[m
[31m-#if 0[m
[31m-    dd("location hash: %lu == %lu",[m
[31m-       (unsigned long) h->hash,[m
[31m-       (unsigned long) ngx_hash_key_lc((u_char *) "Location",[m
[31m-                                       sizeof("Location") - 1));[m
[31m-#endif[m
[31m-[m
[31m-    h->value.len = len;[m
[31m-    h->value.data = uri;[m
[31m-    ngx_str_set(&h->key, "Location");[m
[31m-[m
[31m-    r->headers_out.status = rc;[m
[31m-[m
[31m-    ctx->exit_code = rc;[m
[31m-    ctx->exited = 1;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua redirect to \"%V\" with code %i",[m
[31m-                   &h->value, ctx->exit_code);[m
[31m-[m
[31m-    if (len && uri[0] != '/') {[m
[31m-        r->headers_out.location = h;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_exit(lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_HEADER_FILTER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_BALANCER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    rc = (ngx_int_t) luaL_checkinteger(L, 1);[m
[31m-[m
[31m-    if (ctx->context == NGX_HTTP_LUA_CONTEXT_SSL_CERT) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        ctx->exit_code = rc;[m
[31m-        ctx->exited = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exit with code %i", rc);[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        return luaL_error(L, "no SSL support");[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->no_abort[m
[31m-        && rc != NGX_ERROR[m
[31m-        && rc != NGX_HTTP_CLOSE[m
[31m-        && rc != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && rc != NGX_HTTP_CLIENT_CLOSED_REQUEST)[m
[31m-    {[m
[31m-        return luaL_error(L, "attempt to abort with pending subrequests");[m
[31m-    }[m
[31m-[m
[31m-    if ((r->header_sent || ctx->header_sent)[m
[31m-        && rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        && rc != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && rc != NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        && rc != NGX_HTTP_CLOSE)[m
[31m-    {[m
[31m-        if (rc != (ngx_int_t) r->headers_out.status) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "[m
[31m-                          "set status %i via ngx.exit after sending out the "[m
[31m-                          "response status %ui", rc, r->headers_out.status);[m
[31m-        }[m
[31m-[m
[31m-        rc = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("setting exit code: %d", (int) rc);[m
[31m-[m
[31m-    ctx->exit_code = rc;[m
[31m-    ctx->exited = 1;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua exit with code %i", ctx->exit_code);[m
[31m-[m
[31m-    if (ctx->context & (NGX_HTTP_LUA_CONTEXT_HEADER_FILTER[m
[31m-                        | NGX_HTTP_LUA_CONTEXT_BALANCER))[m
[31m-    {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("calling yield");[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_on_abort(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_http_lua_ctx_t           *ctx;[m
[31m-    ngx_http_lua_co_ctx_t        *coctx = NULL;[m
[31m-    ngx_http_lua_loc_conf_t      *llcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request2(L, r, ctx);[m
[31m-[m
[31m-    if (ctx->on_abort_co_ctx) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "duplicate call");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (!llcf->check_client_abort) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "lua_check_client_abort is off");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_coroutine_create_helper(L, r, ctx, &coctx);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-[m
[31m-    dd("on_wait thread 1: %p", lua_tothread(L, -1));[m
[31m-[m
[31m-    coctx->co_ref = luaL_ref(L, -2);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    coctx->is_uthread = 1;[m
[31m-    ctx->on_abort_co_ctx = coctx;[m
[31m-[m
[31m-    dd("on_wait thread 2: %p", coctx->co);[m
[31m-[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_SUSPENDED;[m
[31m-    coctx->parent_co_ctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_exit(ngx_http_request_t *r, int status, u_char *err,[m
[31m-    size_t *errlen)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t       *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *errlen = ngx_snprintf(err, *errlen, "no request ctx found") - err;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_lua_ffi_check_context(ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_HEADER_FILTER[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_BALANCER[m
[31m-                                       | NGX_HTTP_LUA_CONTEXT_SSL_CERT,[m
[31m-                                       err, errlen)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->context == NGX_HTTP_LUA_CONTEXT_SSL_CERT) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        ctx->exit_code = status;[m
[31m-        ctx->exited = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exit with code %d", status);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->no_abort[m
[31m-        && status != NGX_ERROR[m
[31m-        && status != NGX_HTTP_CLOSE[m
[31m-        && status != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && status != NGX_HTTP_CLIENT_CLOSED_REQUEST)[m
[31m-    {[m
[31m-        *errlen = ngx_snprintf(err, *errlen,[m
[31m-                               "attempt to abort with pending subrequests")[m
[31m-                  - err;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((r->header_sent || ctx->header_sent)[m
[31m-        && status >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-        && status != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && status != NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        && status != NGX_HTTP_CLOSE)[m
[31m-    {[m
[31m-        if (status != (ngx_int_t) r->headers_out.status) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "[m
[31m-                          "set status %d via ngx.exit after sending out the "[m
[31m-                          "response status %ui", status,[m
[31m-                          r->headers_out.status);[m
[31m-        }[m
[31m-[m
[31m-        status = NGX_HTTP_OK;[m
[31m-    }[m
[31m-[m
[31m-    ctx->exit_code = status;[m
[31m-    ctx->exited = 1;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua exit with code %i", ctx->exit_code);[m
[31m-[m
[31m-    if (ctx->context & (NGX_HTTP_LUA_CONTEXT_HEADER_FILTER[m
[31m-                        | NGX_HTTP_LUA_CONTEXT_BALANCER))[m
[31m-    {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif  /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_control.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_control.h[m
[1mdeleted file mode 100644[m
[1mindex 2c13615..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_control.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CONTROL_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CONTROL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_control_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CONTROL_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.c[m
[1mdeleted file mode 100644[m
[1mindex cb819c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.c[m
[1m+++ /dev/null[m
[36m@@ -1,383 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_coroutine.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * Design:[m
[31m- *[m
[31m- * In order to support using ngx.* API in Lua coroutines, we have to create[m
[31m- * new coroutine in the main coroutine instead of the calling coroutine[m
[31m- */[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_coroutine_create(lua_State *L);[m
[31m-static int ngx_http_lua_coroutine_resume(lua_State *L);[m
[31m-static int ngx_http_lua_coroutine_yield(lua_State *L);[m
[31m-static int ngx_http_lua_coroutine_status(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static const ngx_str_t[m
[31m-    ngx_http_lua_co_status_names[] =[m
[31m-    {[m
[31m-        ngx_string("running"),[m
[31m-        ngx_string("suspended"),[m
[31m-        ngx_string("normal"),[m
[31m-        ngx_string("dead"),[m
[31m-        ngx_string("zombie")[m
[31m-    };[m
[31m-[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_coroutine_create(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_coroutine_create_helper(L, r, ctx, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_coroutine_create_helper(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t **pcoctx)[m
[31m-{[m
[31m-    lua_State                     *vm;  /* the Lua VM */[m
[31m-    lua_State                     *co;  /* new coroutine to be created */[m
[31m-    ngx_http_lua_co_ctx_t         *coctx; /* co ctx for the new coroutine */[m
[31m-[m
[31m-    luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,[m
[31m-                  "Lua function expected");[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    /* create new coroutine on root Lua state, so it always yields[m
[31m-     * to main Lua thread[m
[31m-     */[m
[31m-    co = lua_newthread(vm);[m
[31m-[m
[31m-    ngx_http_lua_probe_user_coroutine_create(r, L, co);[m
[31m-[m
[31m-    coctx = ngx_http_lua_get_co_ctx(co, ctx);[m
[31m-    if (coctx == NULL) {[m
[31m-        coctx = ngx_http_lua_create_co_ctx(r, ctx);[m
[31m-        if (coctx == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(coctx, sizeof(ngx_http_lua_co_ctx_t));[m
[31m-        coctx->co_ref = LUA_NOREF;[m
[31m-    }[m
[31m-[m
[31m-    coctx->co = co;[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_SUSPENDED;[m
[31m-[m
[31m-    /* make new coroutine share globals of the parent coroutine.[m
[31m-     * NOTE: globals don't have to be separated! */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_xmove(L, co, 1);[m
[31m-    ngx_http_lua_set_globals_table(co);[m
[31m-[m
[31m-    lua_xmove(vm, L, 1);    /* move coroutine from main thread to L */[m
[31m-[m
[31m-    lua_pushvalue(L, 1);    /* copy entry function to top of L*/[m
[31m-    lua_xmove(L, co, 1);    /* move entry function from L to co */[m
[31m-[m
[31m-    if (pcoctx) {[m
[31m-        *pcoctx = coctx;[m
[31m-    }[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    coctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    return 1;    /* return new coroutine to Lua */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_coroutine_resume(lua_State *L)[m
[31m-{[m
[31m-    lua_State                   *co;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-    ngx_http_lua_co_ctx_t       *p_coctx; /* parent co ctx */[m
[31m-[m
[31m-    co = lua_tothread(L, 1);[m
[31m-[m
[31m-    luaL_argcheck(L, co, 1, "coroutine expected");[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    p_coctx = ctx->cur_co_ctx;[m
[31m-    if (p_coctx == NULL) {[m
[31m-        return luaL_error(L, "no parent co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    coctx = ngx_http_lua_get_co_ctx(co, ctx);[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_probe_user_coroutine_resume(r, L, co);[m
[31m-[m
[31m-    if (coctx->co_status != NGX_HTTP_LUA_CO_SUSPENDED) {[m
[31m-        dd("coroutine resume: %d", coctx->co_status);[m
[31m-[m
[31m-        lua_pushboolean(L, 0);[m
[31m-        lua_pushfstring(L, "cannot resume %s coroutine",[m
[31m-                        ngx_http_lua_co_status_names[coctx->co_status].data);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    p_coctx->co_status = NGX_HTTP_LUA_CO_NORMAL;[m
[31m-[m
[31m-    coctx->parent_co_ctx = p_coctx;[m
[31m-[m
[31m-    dd("set coroutine to running");[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-    ctx->co_op = NGX_HTTP_LUA_USER_CORO_RESUME;[m
[31m-    ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-    /* yield and pass args to main thread, and resume target coroutine from[m
[31m-     * there */[m
[31m-    return lua_yield(L, lua_gettop(L) - 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_coroutine_yield(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_SUSPENDED;[m
[31m-[m
[31m-    ctx->co_op = NGX_HTTP_LUA_USER_CORO_YIELD;[m
[31m-[m
[31m-    if (!coctx->is_uthread && coctx->parent_co_ctx) {[m
[31m-        dd("set coroutine to running");[m
[31m-        coctx->parent_co_ctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-        ngx_http_lua_probe_user_coroutine_yield(r, coctx->parent_co_ctx->co, L);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_http_lua_probe_user_coroutine_yield(r, NULL, L);[m
[31m-    }[m
[31m-[m
[31m-    /* yield and pass retvals to main thread,[m
[31m-     * and resume parent coroutine there */[m
[31m-    return lua_yield(L, lua_gettop(L));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_coroutine_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    int         rc;[m
[31m-[m
[31m-    /* new coroutine table */[m
[31m-    lua_createtable(L, 0 /* narr */, 14 /* nrec */);[m
[31m-[m
[31m-    /* get old coroutine table */[m
[31m-    lua_getglobal(L, "coroutine");[m
[31m-[m
[31m-    /* set running to the old one */[m
[31m-    lua_getfield(L, -1, "running");[m
[31m-    lua_setfield(L, -3, "running");[m
[31m-[m
[31m-    lua_getfield(L, -1, "create");[m
[31m-    lua_setfield(L, -3, "_create");[m
[31m-[m
[31m-    lua_getfield(L, -1, "resume");[m
[31m-    lua_setfield(L, -3, "_resume");[m
[31m-[m
[31m-    lua_getfield(L, -1, "yield");[m
[31m-    lua_setfield(L, -3, "_yield");[m
[31m-[m
[31m-    lua_getfield(L, -1, "status");[m
[31m-    lua_setfield(L, -3, "_status");[m
[31m-[m
[31m-    /* pop the old coroutine */[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_coroutine_create);[m
[31m-    lua_setfield(L, -2, "__create");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_coroutine_resume);[m
[31m-    lua_setfield(L, -2, "__resume");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_coroutine_yield);[m
[31m-    lua_setfield(L, -2, "__yield");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_coroutine_status);[m
[31m-    lua_setfield(L, -2, "__status");[m
[31m-[m
[31m-    lua_setglobal(L, "coroutine");[m
[31m-[m
[31m-    /* inject coroutine APIs */[m
[31m-    {[m
[31m-        const char buf[] =[m
[31m-            "local keys = {'create', 'yield', 'resume', 'status'}\n"[m
[31m-            "local getfenv = getfenv\n"[m
[31m-            "for _, key in ipairs(keys) do\n"[m
[31m-               "local std = coroutine['_' .. key]\n"[m
[31m-               "local ours = coroutine['__' .. key]\n"[m
[31m-               "local raw_ctx = ngx._phase_ctx\n"[m
[31m-               "coroutine[key] = function (...)\n"[m
[31m-                    "local r = getfenv(0).__ngx_req\n"[m
[31m-                    "if r then\n"[m
[31m-                        "local ctx = raw_ctx(r)\n"[m
[31m-                        /* ignore header and body filters */[m
[31m-                        "if ctx ~= 0x020 and ctx ~= 0x040 then\n"[m
[31m-                            "return ours(...)\n"[m
[31m-                        "end\n"[m
[31m-                    "end\n"[m
[31m-                    "return std(...)\n"[m
[31m-                "end\n"[m
[31m-            "end\n"[m
[31m-            "local create, resume = coroutine.create, coroutine.resume\n"[m
[31m-            "coroutine.wrap = function(f)\n"[m
[31m-               "local co = create(f)\n"[m
[31m-               "return function(...) return select(2, resume(co, ...)) end\n"[m
[31m-            "end\n"[m
[31m-            "package.loaded.coroutine = coroutine";[m
[31m-[m
[31m-#if 0[m
[31m-            "debug.sethook(function () collectgarbage() end, 'rl', 1)"[m
[31m-#endif[m
[31m-            ;[m
[31m-[m
[31m-        rc = luaL_loadbuffer(L, buf, sizeof(buf) - 1, "=coroutine.wrap");[m
[31m-    }[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "failed to load Lua code for coroutine.wrap(): %i: %s",[m
[31m-                      rc, lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = lua_pcall(L, 0, 0, 0);[m
[31m-    if (rc != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "failed to run the Lua code for coroutine.wrap(): %i: %s",[m
[31m-                      rc, lua_tostring(L, -1));[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_coroutine_status(lua_State *L)[m
[31m-{[m
[31m-    lua_State                     *co;  /* new coroutine to be created */[m
[31m-    ngx_http_request_t            *r;[m
[31m-    ngx_http_lua_ctx_t            *ctx;[m
[31m-    ngx_http_lua_co_ctx_t         *coctx; /* co ctx for the new coroutine */[m
[31m-[m
[31m-    co = lua_tothread(L, 1);[m
[31m-[m
[31m-    luaL_argcheck(L, co, 1, "coroutine expected");[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ngx_http_lua_get_co_ctx(co, ctx);[m
[31m-    if (coctx == NULL) {[m
[31m-        lua_pushlstring(L, (const char *)[m
[31m-                        ngx_http_lua_co_status_names[NGX_HTTP_LUA_CO_DEAD].data,[m
[31m-                        ngx_http_lua_co_status_names[NGX_HTTP_LUA_CO_DEAD].len);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("co status: %d", coctx->co_status);[m
[31m-[m
[31m-    lua_pushlstring(L, (const char *)[m
[31m-                    ngx_http_lua_co_status_names[coctx->co_status].data,[m
[31m-                    ngx_http_lua_co_status_names[coctx->co_status].len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.h[m
[1mdeleted file mode 100644[m
[1mindex 8b7bc90..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_coroutine.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_COROUTINE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_COROUTINE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_coroutine_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-int ngx_http_lua_coroutine_create_helper(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t **pcoctx);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_COROUTINE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ctx.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ctx.c[m
[1mdeleted file mode 100644[m
[1mindex a14bb4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ctx.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_ctx.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    int              ref;[m
[31m-    lua_State       *vm;[m
[31m-} ngx_http_lua_ngx_ctx_cleanup_data_t;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_ngx_ctx_add_cleanup(ngx_http_request_t *r,[m
[31m-    int ref);[m
[31m-static void ngx_http_lua_ngx_ctx_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ngx_get_ctx(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ctx_ref == LUA_NOREF) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua create ngx.ctx table for the current request");[m
[31m-[m
[31m-        lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_createtable(L, 0 /* narr */, 4 /* nrec */);[m
[31m-        lua_pushvalue(L, -1);[m
[31m-        ctx->ctx_ref = luaL_ref(L, -3);[m
[31m-[m
[31m-        if (ngx_http_lua_ngx_ctx_add_cleanup(r, ctx->ctx_ref) != NGX_OK) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua fetching existing ngx.ctx table for the current "[m
[31m-                   "request");[m
[31m-[m
[31m-    lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_rawgeti(L, -1, ctx->ctx_ref);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ngx_set_ctx(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_ngx_set_ctx_helper(L, r, ctx, 3);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ngx_set_ctx_helper(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, int index)[m
[31m-{[m
[31m-    if (index < 0) {[m
[31m-        index = lua_gettop(L) + index + 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->ctx_ref == LUA_NOREF) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua create ngx.ctx table for the current request");[m
[31m-[m
[31m-        lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_pushvalue(L, index);[m
[31m-        ctx->ctx_ref = luaL_ref(L, -2);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (ngx_http_lua_ngx_ctx_add_cleanup(r, ctx->ctx_ref) != NGX_OK) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua fetching existing ngx.ctx table for the current "[m
[31m-                   "request");[m
[31m-[m
[31m-    lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    luaL_unref(L, -1, ctx->ctx_ref);[m
[31m-    lua_pushvalue(L, index);[m
[31m-    ctx->ctx_ref = luaL_ref(L, -2);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_get_ctx_ref(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_LUA_FFI_NO_REQ_CTX;[m
[31m-    }[m
[31m-[m
[31m-    return ctx->ctx_ref;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_set_ctx_ref(ngx_http_request_t *r, int ref)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_LUA_FFI_NO_REQ_CTX;[m
[31m-    }[m
[31m-[m
[31m-    ctx->ctx_ref = ref;[m
[31m-[m
[31m-    if (ngx_http_lua_ngx_ctx_add_cleanup(r, ref) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_ngx_ctx_add_cleanup(ngx_http_request_t *r, int ref)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_pool_cleanup_t          *cln;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ngx_http_lua_ngx_ctx_cleanup_data_t    *data;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool,[m
[31m-                               sizeof(ngx_http_lua_ngx_ctx_cleanup_data_t));[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_ngx_ctx_cleanup;[m
[31m-[m
[31m-    data = cln->data;[m
[31m-    data->vm = L;[m
[31m-    data->ref = ref;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ngx_ctx_cleanup(void *data)[m
[31m-{[m
[31m-    lua_State       *L;[m
[31m-[m
[31m-    ngx_http_lua_ngx_ctx_cleanup_data_t    *clndata = data;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua release ngx.ctx at ref %d", clndata->ref);[m
[31m-[m
[31m-    L = clndata->vm;[m
[31m-[m
[31m-    lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    luaL_unref(L, -1, clndata->ref);[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ctx.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ctx.h[m
[1mdeleted file mode 100644[m
[1mindex f73f73e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ctx.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_CTX_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_CTX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-int ngx_http_lua_ngx_get_ctx(lua_State *L);[m
[31m-int ngx_http_lua_ngx_set_ctx(lua_State *L);[m
[31m-int ngx_http_lua_ngx_set_ctx_helper(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, int index);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_CTX_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_directive.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_directive.c[m
[1mdeleted file mode 100644[m
[1mindex e6bc339..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_directive.c[m
[1m+++ /dev/null[m
[36m@@ -1,1737 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_accessby.h"[m
[31m-#include "ngx_http_lua_rewriteby.h"[m
[31m-#include "ngx_http_lua_logby.h"[m
[31m-#include "ngx_http_lua_headerfilterby.h"[m
[31m-#include "ngx_http_lua_bodyfilterby.h"[m
[31m-#include "ngx_http_lua_initby.h"[m
[31m-#include "ngx_http_lua_initworkerby.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_ssl_certby.h"[m
[31m-#include "ngx_http_lua_lex.h"[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_block_parser_ctx_s[m
[31m-    ngx_http_lua_block_parser_ctx_t;[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-#include "ngx_http_lua_setby.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_set_by_lua_init(ngx_http_request_t *r);[m
[31m-#endif[m
[31m-[m
[31m-static u_char *ngx_http_lua_gen_chunk_name(ngx_conf_t *cf, const char *tag,[m
[31m-    size_t tag_len);[m
[31m-static ngx_int_t ngx_http_lua_conf_read_lua_token(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_block_parser_ctx_t *ctx);[m
[31m-static u_char *ngx_http_lua_strlstrn(u_char *s1, u_char *last, u_char *s2,[m
[31m-    size_t n);[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_block_parser_ctx_s {[m
[31m-    ngx_uint_t  start_line;[m
[31m-    int         token_len;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    FOUND_LEFT_CURLY = 0,[m
[31m-    FOUND_RIGHT_CURLY,[m
[31m-    FOUND_LEFT_LBRACKET_STR,[m
[31m-    FOUND_LBRACKET_STR = FOUND_LEFT_LBRACKET_STR,[m
[31m-    FOUND_LEFT_LBRACKET_CMT,[m
[31m-    FOUND_LBRACKET_CMT = FOUND_LEFT_LBRACKET_CMT,[m
[31m-    FOUND_RIGHT_LBRACKET,[m
[31m-    FOUND_COMMENT_LINE,[m
[31m-    FOUND_DOUBLE_QUOTED,[m
[31m-    FOUND_SINGLE_QUOTED[m
[31m-};[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_shared_dict(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t   *lmcf = conf;[m
[31m-[m
[31m-    ngx_str_t                  *value, name;[m
[31m-    ngx_shm_zone_t             *zone;[m
[31m-    ngx_shm_zone_t            **zp;[m
[31m-    ngx_http_lua_shdict_ctx_t  *ctx;[m
[31m-    ssize_t                     size;[m
[31m-[m
[31m-    if (lmcf->shm_zones == NULL) {[m
[31m-        lmcf->shm_zones = ngx_palloc(cf->pool, sizeof(ngx_array_t));[m
[31m-        if (lmcf->shm_zones == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_array_init(lmcf->shm_zones, cf->pool, 2,[m
[31m-                           sizeof(ngx_shm_zone_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    ctx = NULL;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid lua shared dict name \"%V\"", &value[1]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    name = value[1];[m
[31m-[m
[31m-    size = ngx_parse_size(&value[2]);[m
[31m-[m
[31m-    if (size <= 8191) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "invalid lua shared dict size \"%V\"", &value[2]);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_shdict_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->name = name;[m
[31m-    ctx->main_conf = lmcf;[m
[31m-    ctx->log = &cf->cycle->new_log;[m
[31m-    ctx->cycle = cf->cycle;[m
[31m-[m
[31m-    zone = ngx_shared_memory_add(cf, &name, (size_t) size,[m
[31m-                                 &ngx_http_lua_module);[m
[31m-    if (zone == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (zone->data) {[m
[31m-        ctx = zone->data;[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "lua_shared_dict \"%V\" is already defined as "[m
[31m-                           "\"%V\"", &name, &ctx->name);[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    zone->init = ngx_http_lua_shdict_init_zone;[m
[31m-    zone->data = ctx;[m
[31m-[m
[31m-    zp = ngx_array_push(lmcf->shm_zones);[m
[31m-    if (zp == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *zp = zone;[m
[31m-[m
[31m-    lmcf->requires_shm = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_code_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    char             *p = conf;[m
[31m-    ngx_flag_t       *fp;[m
[31m-    char             *ret;[m
[31m-[m
[31m-    ret = ngx_conf_set_flag_slot(cf, cmd, conf);[m
[31m-    if (ret != NGX_CONF_OK) {[m
[31m-        return ret;[m
[31m-    }[m
[31m-[m
[31m-    fp = (ngx_flag_t *) (p + cmd->offset);[m
[31m-[m
[31m-    if (!*fp) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, 0,[m
[31m-                           "lua_code_cache is off; this will hurt "[m
[31m-                           "performance");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_package_cpath(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t *lmcf = conf;[m
[31m-    ngx_str_t                *value;[m
[31m-[m
[31m-    if (lmcf->lua_cpath.len != 0) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lmcf->lua_cpath.len = value[1].len;[m
[31m-    lmcf->lua_cpath.data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_package_path(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t *lmcf = conf;[m
[31m-    ngx_str_t                *value;[m
[31m-[m
[31m-    if (lmcf->lua_path.len != 0) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lmcf->lua_path.len = value[1].len;[m
[31m-    lmcf->lua_path.data = value[1].data;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-char *[m
[31m-ngx_http_lua_set_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_set_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_set_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_str_t            target;[m
[31m-    ndk_set_var_t        filter;[m
[31m-[m
[31m-    ngx_http_lua_set_var_data_t     *filter_data;[m
[31m-[m
[31m-    /*[m
[31m-     * value[0] = "set_by_lua"[m
[31m-     * value[1] = target variable name[m
[31m-     * value[2] = lua script source to be executed[m
[31m-     * value[3..] = real params[m
[31m-     * */[m
[31m-    value = cf->args->elts;[m
[31m-    target = value[1];[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-    filter.func = cmd->post;[m
[31m-    filter.size = cf->args->nelts - 3;    /*  get number of real params */[m
[31m-[m
[31m-    filter_data = ngx_palloc(cf->pool, sizeof(ngx_http_lua_set_var_data_t));[m
[31m-    if (filter_data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->size = filter.size;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->key = p;[m
[31m-[m
[31m-    p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-    p = ngx_http_lua_digest_hex(p, value[2].data, value[2].len);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    filter_data->script = value[2];[m
[31m-[m
[31m-    filter.data = filter_data;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, &target, &value[3], &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_set_by_lua_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_str_t           *value;[m
[31m-    ngx_str_t            target;[m
[31m-    ndk_set_var_t        filter;[m
[31m-[m
[31m-    ngx_http_lua_set_var_data_t     *filter_data;[m
[31m-[m
[31m-    /*[m
[31m-     * value[0] = "set_by_lua_file"[m
[31m-     * value[1] = target variable name[m
[31m-     * value[2] = lua script file path to be executed[m
[31m-     * value[3..] = real params[m
[31m-     * */[m
[31m-    value = cf->args->elts;[m
[31m-    target = value[1];[m
[31m-[m
[31m-    filter.type = NDK_SET_VAR_MULTI_VALUE_DATA;[m
[31m-    filter.func = cmd->post;[m
[31m-    filter.size = cf->args->nelts - 2;    /*  get number of real params and[m
[31m-                                              lua script */[m
[31m-[m
[31m-    filter_data = ngx_palloc(cf->pool, sizeof(ngx_http_lua_set_var_data_t));[m
[31m-    if (filter_data == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->size = filter.size;[m
[31m-[m
[31m-    p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->key = p;[m
[31m-[m
[31m-    p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-    p = ngx_http_lua_digest_hex(p, value[2].data, value[2].len);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    ngx_str_null(&filter_data->script);[m
[31m-[m
[31m-    filter.data = filter_data;[m
[31m-[m
[31m-    return ndk_set_var_multi_value_core(cf, &target, &value[2], &filter);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_filter_set_by_lua_inline(ngx_http_request_t *r, ngx_str_t *val,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    ngx_http_lua_set_var_data_t     *filter_data = data;[m
[31m-[m
[31m-    if (ngx_http_lua_set_by_lua_init(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       filter_data->script.data,[m
[31m-                                       filter_data->script.len,[m
[31m-                                       filter_data->key, "=set_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_set_by_chunk(L, r, val, v, filter_data->size,[m
[31m-                                   &filter_data->script);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_filter_set_by_lua_file(ngx_http_request_t *r, ngx_str_t *val,[m
[31m-    ngx_http_variable_value_t *v, void *data)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    u_char                      *script_path;[m
[31m-    size_t                       nargs;[m
[31m-[m
[31m-    ngx_http_lua_set_var_data_t     *filter_data = data;[m
[31m-[m
[31m-    dd("set by lua file");[m
[31m-[m
[31m-    if (ngx_http_lua_set_by_lua_init(r) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    filter_data->script.data = v[0].data;[m
[31m-    filter_data->script.len = v[0].len;[m
[31m-[m
[31m-    /* skip the lua file path argument */[m
[31m-    v++;[m
[31m-    nargs = filter_data->size - 1;[m
[31m-[m
[31m-    dd("script: %.*s", (int) filter_data->script.len, filter_data->script.data);[m
[31m-    dd("nargs: %d", (int) nargs);[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, filter_data->script.data,[m
[31m-                                           filter_data->script.len);[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     filter_data->key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_set_by_chunk(L, r, val, v, nargs, &filter_data->script);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif /* defined(NDK) && NDK */[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_rewrite_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_rewrite_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_rewrite_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                      *p, *chunkname;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8042 && nginx_version <= 8053[m
[31m-    return "does not work with " NGINX_VER;[m
[31m-#endif[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->rewrite_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_rewrite_handler_inline) {[m
[31m-        chunkname = ngx_http_lua_gen_chunk_name(cf, "rewrite_by_lua",[m
[31m-                                                sizeof("rewrite_by_lua") - 1);[m
[31m-        if (chunkname == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->rewrite_chunkname = chunkname;[m
[31m-[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-[m
[31m-        llcf->rewrite_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->rewrite_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->rewrite_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->rewrite_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->rewrite_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->rewrite_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_rewrite = 1;[m
[31m-    lmcf->requires_capture_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_access_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_access_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_access_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                      *p, *chunkname;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->access_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_access_handler_inline) {[m
[31m-        chunkname = ngx_http_lua_gen_chunk_name(cf, "access_by_lua",[m
[31m-                                                sizeof("access_by_lua") - 1);[m
[31m-        if (chunkname == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->access_chunkname = chunkname;[m
[31m-[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-[m
[31m-        llcf->access_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->access_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->access_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->access_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->access_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->access_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_access = 1;[m
[31m-    lmcf->requires_capture_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_content_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_content_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_content_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *chunkname;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->content_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    dd("value[0]: %.*s", (int) value[0].len, value[0].data);[m
[31m-    dd("value[1]: %.*s", (int) value[1].len, value[1].data);[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_content_handler_inline) {[m
[31m-        chunkname = ngx_http_lua_gen_chunk_name(cf, "content_by_lua",[m
[31m-                                                sizeof("content_by_lua") - 1);[m
[31m-        if (chunkname == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->content_chunkname = chunkname;[m
[31m-[m
[31m-        dd("chunkname: %s", chunkname);[m
[31m-[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-[m
[31m-        llcf->content_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->content_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->content_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->content_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->content_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->content_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_capture_filter = 1;[m
[31m-[m
[31m-    /*  register location content handler */[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-    if (clcf == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf->handler = ngx_http_lua_content_handler;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_log_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_log_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_log_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    u_char                      *p, *chunkname;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->log_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_log_handler_inline) {[m
[31m-        chunkname = ngx_http_lua_gen_chunk_name(cf, "log_by_lua",[m
[31m-                                                sizeof("log_by_lua") - 1);[m
[31m-        if (chunkname == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->log_chunkname = chunkname;[m
[31m-[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-[m
[31m-        llcf->log_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->log_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->log_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->log_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->log_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->log_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_log = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_header_filter_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_header_filter_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_header_filter_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->header_filter_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_header_filter_inline) {[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-        llcf->header_filter_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->header_filter_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->header_filter_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->header_filter_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->header_filter_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->header_filter_handler = (ngx_http_handler_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_header_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_body_filter_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_body_filter_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_body_filter_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf = conf;[m
[31m-[m
[31m-    ngx_http_compile_complex_value_t         ccv;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->body_filter_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_body_filter_inline) {[m
[31m-        /* Don't eval nginx variables for inline lua code */[m
[31m-        llcf->body_filter_src.value = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        llcf->body_filter_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = &llcf->body_filter_src;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (llcf->body_filter_src.lengths == NULL) {[m
[31m-            /* no variable found */[m
[31m-            p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            llcf->body_filter_src_key = p;[m
[31m-[m
[31m-            p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-            p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-            *p = '\0';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf->body_filter_handler = (ngx_http_output_body_filter_pt) cmd->post;[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    lmcf->requires_body_filter = 1;[m
[31m-    lmcf->requires_header_filter = 1;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_init_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_init_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_init_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *name;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf = conf;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->init_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        /*  Oops...Invalid location conf */[m
[31m-        ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                           "invalid location config: no runnable Lua code");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf->init_handler = (ngx_http_lua_main_conf_handler_pt) cmd->post;[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_init_by_file) {[m
[31m-        name = ngx_http_lua_rebase_path(cf->pool, value[1].data,[m
[31m-                                        value[1].len);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lmcf->init_src.data = name;[m
[31m-        lmcf->init_src.len = ngx_strlen(name);[m
[31m-[m
[31m-    } else {[m
[31m-        lmcf->init_src = value[1];[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_init_worker_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_init_worker_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_init_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    u_char                      *name;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf = conf;[m
[31m-[m
[31m-    dd("enter");[m
[31m-[m
[31m-    /*  must specifiy a content handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->init_worker_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lmcf->init_worker_handler = (ngx_http_lua_main_conf_handler_pt) cmd->post;[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_init_worker_by_file) {[m
[31m-        name = ngx_http_lua_rebase_path(cf->pool, value[1].data,[m
[31m-                                        value[1].len);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lmcf->init_worker_src.data = name;[m
[31m-        lmcf->init_worker_src.len = ngx_strlen(name);[m
[31m-[m
[31m-    } else {[m
[31m-        lmcf->init_worker_src = value[1];[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_set_by_lua_init(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-        ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_SET;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_gen_chunk_name(ngx_conf_t *cf, const char *tag, size_t tag_len)[m
[31m-{[m
[31m-    u_char      *p, *out;[m
[31m-    size_t       len;[m
[31m-[m
[31m-    len = sizeof("=(:)") - 1 + tag_len + cf->conf_file->file.name.len[m
[31m-          + NGX_INT64_LEN + 1;[m
[31m-[m
[31m-    out = ngx_palloc(cf->pool, len);[m
[31m-    if (out == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->conf_file->file.name.len) {[m
[31m-        p = cf->conf_file->file.name.data + cf->conf_file->file.name.len;[m
[31m-        while (--p >= cf->conf_file->file.name.data) {[m
[31m-            if (*p == '/' || *p == '\\') {[m
[31m-                p++;[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-[m
[31m-    } else {[m
[31m-        p = cf->conf_file->file.name.data;[m
[31m-    }[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    ngx_snprintf(out, len, "=%*s(%*s:%d)%Z",[m
[31m-                 tag_len, tag, cf->conf_file->file.name.data[m
[31m-                               + cf->conf_file->file.name.len - p,[m
[31m-                 p, cf->conf_file->line);[m
[31m-[m
[31m-    return out;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* a specialized version of the standard ngx_conf_parse() function */[m
[31m-char *[m
[31m-ngx_http_lua_conf_lua_block_parse(ngx_conf_t *cf, ngx_command_t *cmd)[m
[31m-{[m
[31m-    ngx_http_lua_block_parser_ctx_t     ctx;[m
[31m-[m
[31m-    int               level = 1;[m
[31m-    char             *rv;[m
[31m-    u_char           *p;[m
[31m-    size_t            len;[m
[31m-    ngx_str_t        *src, *dst;[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_uint_t        i, start_line;[m
[31m-    ngx_array_t      *saved;[m
[31m-    enum {[m
[31m-        parse_block = 0,[m
[31m-        parse_param[m
[31m-    } type;[m
[31m-[m
[31m-    if (cf->conf_file->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        type = parse_block;[m
[31m-[m
[31m-    } else {[m
[31m-        type = parse_param;[m
[31m-    }[m
[31m-[m
[31m-    saved = cf->args;[m
[31m-[m
[31m-    cf->args = ngx_array_create(cf->temp_pool, 4, sizeof(ngx_str_t));[m
[31m-    if (cf->args == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx.token_len = 0;[m
[31m-    start_line = cf->conf_file->line;[m
[31m-[m
[31m-    dd("init start line: %d", (int) start_line);[m
[31m-[m
[31m-    ctx.start_line = start_line;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        rc = ngx_http_lua_conf_read_lua_token(cf, &ctx);[m
[31m-[m
[31m-        dd("parser start line: %d", (int) start_line);[m
[31m-[m
[31m-        switch (rc) {[m
[31m-[m
[31m-        case NGX_ERROR:[m
[31m-            goto done;[m
[31m-[m
[31m-        case FOUND_LEFT_CURLY:[m
[31m-[m
[31m-            ctx.start_line = cf->conf_file->line;[m
[31m-[m
[31m-            if (type == parse_param) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "block directives are not supported "[m
[31m-                                   "in -g option");[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            level++;[m
[31m-            dd("seen block start: level=%d", (int) level);[m
[31m-            break;[m
[31m-[m
[31m-        case FOUND_RIGHT_CURLY:[m
[31m-[m
[31m-            level--;[m
[31m-            dd("seen block done: level=%d", (int) level);[m
[31m-[m
[31m-            if (type != parse_block || level < 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected \"}\": level %d, "[m
[31m-                                   "starting at line %ui", level,[m
[31m-                                   start_line);[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            if (level == 0) {[m
[31m-                ngx_http_lua_assert(cf->handler);[m
[31m-[m
[31m-                src = cf->args->elts;[m
[31m-[m
[31m-                for (len = 0, i = 0; i < cf->args->nelts; i++) {[m
[31m-                    len += src[i].len;[m
[31m-                }[m
[31m-[m
[31m-                dd("saved nelts: %d", (int) saved->nelts);[m
[31m-                dd("temp nelts: %d", (int) cf->args->nelts);[m
[31m-#if 0[m
[31m-                ngx_http_lua_assert(saved->nelts == 1);[m
[31m-#endif[m
[31m-[m
[31m-                dst = ngx_array_push(saved);[m
[31m-                if (dst == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                dst->len = len;[m
[31m-                dst->len--;  /* skip the trailing '}' block terminator */[m
[31m-[m
[31m-                p = ngx_palloc(cf->pool, len);[m
[31m-                if (p == NULL) {[m
[31m-                    return NGX_CONF_ERROR;[m
[31m-                }[m
[31m-                dst->data = p;[m
[31m-[m
[31m-                for (i = 0; i < cf->args->nelts; i++) {[m
[31m-                    p = ngx_copy(p, src[i].data, src[i].len);[m
[31m-                }[m
[31m-[m
[31m-                p[-1] = '\0';  /* override the last '}' char to null */[m
[31m-[m
[31m-                cf->args = saved;[m
[31m-[m
[31m-                rv = (*cf->handler)(cf, cmd, cf->handler_conf);[m
[31m-                if (rv == NGX_CONF_OK) {[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                if (rv == NGX_CONF_ERROR) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, rv);[m
[31m-[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case FOUND_LBRACKET_STR:[m
[31m-        case FOUND_LBRACKET_CMT:[m
[31m-        case FOUND_RIGHT_LBRACKET:[m
[31m-        case FOUND_COMMENT_LINE:[m
[31m-        case FOUND_DOUBLE_QUOTED:[m
[31m-        case FOUND_SINGLE_QUOTED:[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "unknown return value from the lexer: %i", rc);[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc = NGX_ERROR;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_conf_read_lua_token(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_block_parser_ctx_t *ctx)[m
[31m-{[m
[31m-    enum {[m
[31m-        OVEC_SIZE = 2[m
[31m-    };[m
[31m-    int          i, rc;[m
[31m-    int          ovec[OVEC_SIZE];[m
[31m-    u_char      *start, *p, *q, ch;[m
[31m-    off_t        file_size;[m
[31m-    size_t       len, buf_size;[m
[31m-    ssize_t      n, size;[m
[31m-    ngx_uint_t   start_line;[m
[31m-    ngx_str_t   *word;[m
[31m-    ngx_buf_t   *b;[m
[31m-#if nginx_version >= 1009002[m
[31m-    ngx_buf_t   *dump;[m
[31m-#endif[m
[31m-[m
[31m-    b = cf->conf_file->buffer;[m
[31m-#if nginx_version >= 1009002[m
[31m-    dump = cf->conf_file->dump;[m
[31m-#endif[m
[31m-    start = b->pos;[m
[31m-    start_line = cf->conf_file->line;[m
[31m-    buf_size = b->end - b->start;[m
[31m-[m
[31m-    dd("lexer start line: %d", (int) start_line);[m
[31m-[m
[31m-    file_size = ngx_file_size(&cf->conf_file->file.info);[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (b->pos >= b->last[m
[31m-            || (b->last - b->pos < (b->end - b->start) / 3[m
[31m-                && cf->conf_file->file.offset < file_size))[m
[31m-        {[m
[31m-[m
[31m-            if (cf->conf_file->file.offset >= file_size) {[m
[31m-[m
[31m-                cf->conf_file->line = ctx->start_line;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected end of file, expecting "[m
[31m-                                   "terminating characters for lua code "[m
[31m-                                   "block");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = b->last - start;[m
[31m-[m
[31m-            if (len == buf_size) {[m
[31m-[m
[31m-                cf->conf_file->line = start_line;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "too long lua code block, probably "[m
[31m-                                   "missing terminating characters");[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                ngx_memmove(b->start, start, len);[m
[31m-            }[m
[31m-[m
[31m-            size = (ssize_t) (file_size - cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (size > b->end - (b->start + len)) {[m
[31m-                size = b->end - (b->start + len);[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_read_file(&cf->conf_file->file, b->start + len, size,[m
[31m-                              cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n != size) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   ngx_read_file_n " returned "[m
[31m-                                   "only %z bytes instead of %z",[m
[31m-                                   n, size);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start + (b->pos - start);[m
[31m-            b->last = b->start + len + n;[m
[31m-            start = b->start;[m
[31m-[m
[31m-#if nginx_version >= 1009002[m
[31m-            if (dump) {[m
[31m-                dump->last = ngx_cpymem(dump->last, b->pos, size);[m
[31m-            }[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_lua_lex(b->pos, b->last - b->pos, ovec);[m
[31m-[m
[31m-        if (rc < 0) {  /* no match */[m
[31m-            /* alas. the lexer does not yet support streaming processing. need[m
[31m-             * more work below */[m
[31m-[m
[31m-            if (cf->conf_file->file.offset >= file_size) {[m
[31m-[m
[31m-                cf->conf_file->line = ctx->start_line;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "unexpected end of file, expecting "[m
[31m-                                   "terminating characters for lua code "[m
[31m-                                   "block");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            len = b->last - b->pos;[m
[31m-[m
[31m-            if (len == buf_size) {[m
[31m-[m
[31m-                cf->conf_file->line = start_line;[m
[31m-[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "too long lua code block, probably "[m
[31m-                                   "missing terminating characters");[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (len) {[m
[31m-                ngx_memcpy(b->start, b->pos, len);[m
[31m-            }[m
[31m-[m
[31m-            size = (ssize_t) (file_size - cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (size > b->end - (b->start + len)) {[m
[31m-                size = b->end - (b->start + len);[m
[31m-            }[m
[31m-[m
[31m-            n = ngx_read_file(&cf->conf_file->file, b->start + len, size,[m
[31m-                              cf->conf_file->file.offset);[m
[31m-[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (n != size) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   ngx_read_file_n " returned "[m
[31m-                                   "only %z bytes instead of %z",[m
[31m-                                   n, size);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b->pos = b->start + len;[m
[31m-            b->last = b->pos + n;[m
[31m-            start = b->start;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == FOUND_LEFT_LBRACKET_STR || rc == FOUND_LEFT_LBRACKET_CMT) {[m
[31m-[m
[31m-            /* we update the line numbers for best error messages when the[m
[31m-             * closing long bracket is missing */[m
[31m-[m
[31m-            for (i = 0; i < ovec[0]; i++) {[m
[31m-                ch = b->pos[i];[m
[31m-                if (ch == LF) {[m
[31m-                    cf->conf_file->line++;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            b->pos += ovec[0];[m
[31m-            ovec[1] -= ovec[0];[m
[31m-            ovec[0] = 0;[m
[31m-[m
[31m-            if (rc == FOUND_LEFT_LBRACKET_CMT) {[m
[31m-                p = &b->pos[2];     /* we skip the leading "--" prefix */[m
[31m-                rc = FOUND_LBRACKET_CMT;[m
[31m-[m
[31m-            } else {[m
[31m-                p = b->pos;[m
[31m-                rc = FOUND_LBRACKET_STR;[m
[31m-            }[m
[31m-[m
[31m-            /* we temporarily rewrite [=*[ in the input buffer to ]=*] to[m
[31m-             * construct the pattern for the corresponding closing long[m
[31m-             * bracket without additional buffers. */[m
[31m-[m
[31m-            ngx_http_lua_assert(p[0] == '[');[m
[31m-            p[0] = ']';[m
[31m-[m
[31m-            ngx_http_lua_assert(b->pos[ovec[1] - 1] == '[');[m
[31m-            b->pos[ovec[1] - 1] = ']';[m
[31m-[m
[31m-            /* search for the corresponding closing bracket */[m
[31m-[m
[31m-            dd("search pattern for the closing long bracket: \"%.*s\" (len=%d)",[m
[31m-               (int) (b->pos + ovec[1] - p), p, (int) (b->pos + ovec[1] - p));[m
[31m-[m
[31m-            q = ngx_http_lua_strlstrn(b->pos + ovec[1], b->last, p,[m
[31m-                                      b->pos + ovec[1] - p - 1);[m
[31m-[m
[31m-            if (q == NULL) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "Lua code block missing the closing "[m
[31m-                                   "long bracket \"%*s\"",[m
[31m-                                   b->pos + ovec[1] - p, p);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* restore the original opening long bracket */[m
[31m-[m
[31m-            p[0] = '[';[m
[31m-            b->pos[ovec[1] - 1] = '[';[m
[31m-[m
[31m-            ovec[1] = q - b->pos + b->pos + ovec[1] - p;[m
[31m-[m
[31m-            dd("found long bracket token: \"%.*s\"",[m
[31m-               (int) (ovec[1] - ovec[0]), b->pos + ovec[0]);[m
[31m-        }[m
[31m-[m
[31m-        for (i = 0; i < ovec[1]; i++) {[m
[31m-            ch = b->pos[i];[m
[31m-            if (ch == LF) {[m
[31m-                cf->conf_file->line++;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        b->pos += ovec[1];[m
[31m-        ctx->token_len = ovec[1] - ovec[0];[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    word = ngx_array_push(cf->args);[m
[31m-    if (word == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    word->data = ngx_pnalloc(cf->temp_pool, b->pos - start);[m
[31m-    if (word->data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    len = b->pos - start;[m
[31m-    ngx_memcpy(word->data, start, len);[m
[31m-    word->len = len;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_http_lua_strlstrn() is intended to search for static substring[m
[31m- * with known length in string until the argument last. The argument n[m
[31m- * must be length of the second substring - 1.[m
[31m- */[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  c1, c2;[m
[31m-[m
[31m-    c2 = (ngx_uint_t) *s2++;[m
[31m-    last -= n;[m
[31m-[m
[31m-    do {[m
[31m-        do {[m
[31m-            if (s1 >= last) {[m
[31m-                return NULL;[m
[31m-            }[m
[31m-[m
[31m-            c1 = (ngx_uint_t) *s1++;[m
[31m-[m
[31m-            dd("testing char '%c' vs '%c'", (int) c1, (int) c2);[m
[31m-[m
[31m-        } while (c1 != c2);[m
[31m-[m
[31m-        dd("testing against pattern \"%.*s\"", (int) n, s2);[m
[31m-[m
[31m-    } while (ngx_strncmp(s1, s2, n) != 0);[m
[31m-[m
[31m-    return --s1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_directive.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_directive.h[m
[1mdeleted file mode 100644[m
[1mindex be591f3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_directive.h[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_DIRECTIVE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_DIRECTIVE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-char *ngx_http_lua_shared_dict(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_package_cpath(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_package_path(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_content_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_content_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_rewrite_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_rewrite_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_access_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_access_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_log_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_log_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_header_filter_by_lua_block(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_header_filter_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_body_filter_by_lua_block(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_body_filter_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_init_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_init_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_init_worker_by_lua_block(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_init_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_code_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-[m
[31m-char *ngx_http_lua_set_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-char *ngx_http_lua_set_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);[m
[31m-char *ngx_http_lua_set_by_lua_file(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-ngx_int_t ngx_http_lua_filter_set_by_lua_inline(ngx_http_request_t *r,[m
[31m-    ngx_str_t *val, ngx_http_variable_value_t *v, void *data);[m
[31m-ngx_int_t ngx_http_lua_filter_set_by_lua_file(ngx_http_request_t *r,[m
[31m-    ngx_str_t *val, ngx_http_variable_value_t *v, void *data);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-char *ngx_http_lua_rewrite_no_postpone(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-char *ngx_http_lua_conf_lua_block_parse(ngx_conf_t *cf,[m
[31m-    ngx_command_t *cmd);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_DIRECTIVE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_exception.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_exception.c[m
[1mdeleted file mode 100644[m
[1mindex 752cbc9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_exception.c[m
[1m+++ /dev/null[m
[36m@@ -1,58 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-/*  longjmp mark for restoring nginx execution after Lua VM crashing */[m
[31m-jmp_buf ngx_http_lua_exception;[m
[31m-[m
[31m-/**[m
[31m- * Override default Lua panic handler, output VM crash reason to nginx error[m
[31m- * log, and restore execution to the nearest jmp-mark.[m
[31m- *[m
[31m- * @param L Lua state pointer[m
[31m- * @retval Long jump to the nearest jmp-mark, never returns.[m
[31m- * @note nginx request pointer should be stored in Lua thread's globals table[m
[31m- * in order to make logging working.[m
[31m- * */[m
[31m-int[m
[31m-ngx_http_lua_atpanic(lua_State *L)[m
[31m-{[m
[31m-#ifdef NGX_LUA_ABORT_AT_PANIC[m
[31m-    abort();[m
[31m-#else[m
[31m-    u_char                  *s = NULL;[m
[31m-    size_t                   len = 0;[m
[31m-[m
[31m-    if (lua_type(L, -1) == LUA_TSTRING) {[m
[31m-        s = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-    }[m
[31m-[m
[31m-    if (s == NULL) {[m
[31m-        s = (u_char *) "unknown reason";[m
[31m-        len = sizeof("unknown reason") - 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_stderr(0, "lua atpanic: Lua VM crashed, reason: %*s", len, s);[m
[31m-    ngx_quit = 1;[m
[31m-[m
[31m-    /*  restore nginx execution */[m
[31m-    NGX_LUA_EXCEPTION_THROW(1);[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_exception.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_exception.h[m
[1mdeleted file mode 100644[m
[1mindex a70708a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_exception.h[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_EXCEPTION_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_EXCEPTION_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#define NGX_LUA_EXCEPTION_TRY                                               \[m
[31m-    if (setjmp(ngx_http_lua_exception) == 0)[m
[31m-[m
[31m-#define NGX_LUA_EXCEPTION_CATCH                                             \[m
[31m-    else[m
[31m-[m
[31m-#define NGX_LUA_EXCEPTION_THROW(x)                                          \[m
[31m-    longjmp(ngx_http_lua_exception, (x))[m
[31m-[m
[31m-[m
[31m-extern jmp_buf ngx_http_lua_exception;[m
[31m-[m
[31m-[m
[31m-int ngx_http_lua_atpanic(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_EXCEPTION_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.c[m
[1mdeleted file mode 100644[m
[1mindex 75ce324..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.c[m
[1m+++ /dev/null[m
[36m@@ -1,302 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_lua_headerfilterby.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-[m
[31m-[m
[31m-static ngx_http_output_header_filter_pt ngx_http_next_header_filter;[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Set environment table for the given code closure.[m
[31m- *[m
[31m- * Before:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- *[m
[31m- * After:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- * */[m
[31m-static void[m
[31m-ngx_http_lua_header_filter_by_lua_env(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    /*  set nginx request pointer to current lua thread's globals table */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-[m
[31m-    /**[m
[31m-     * we want to create empty environment for current script[m
[31m-     *[m
[31m-     * newt = {}[m
[31m-     * newt["_G"] = newt[m
[31m-     * setmetatable(newt, {__index = _G})[m
[31m-     *[m
[31m-     * if a function or symbol is not defined in our env, __index will lookup[m
[31m-     * in the global env.[m
[31m-     *[m
[31m-     * all variables created in the script-env will be thrown away at the end[m
[31m-     * of the script run.[m
[31m-     * */[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    lua_createtable(L, 0, 1 /* nrec */);   /* the metatable for the new env */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable({}, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_header_filter_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int              old_exit_code = 0;[m
[31m-    ngx_int_t        rc;[m
[31m-    u_char          *err_msg;[m
[31m-    size_t           len;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t      *old_pool;[m
[31m-#endif[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx->exited) {[m
[31m-        old_exit_code = ctx->exit_code;[m
[31m-    }[m
[31m-[m
[31m-    /*  initialize nginx context in Lua VM, code chunk at stack top    sp = 1 */[m
[31m-    ngx_http_lua_header_filter_by_lua_env(L, r);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* XXX: work-around to nginx regex subsystem */[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-    lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-    /*  protected call user code */[m
[31m-    rc = lua_pcall(L, 0, 1, 1);[m
[31m-[m
[31m-    lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* XXX: work-around to nginx regex subsystem */[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-    dd("rc == %d", (int) rc);[m
[31m-[m
[31m-    if (rc != 0) {[m
[31m-        /*  error occured when running loaded code */[m
[31m-        err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-        if (err_msg == NULL) {[m
[31m-            err_msg = (u_char *) "unknown reason";[m
[31m-            len = sizeof("unknown reason") - 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "failed to run header_filter_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-        lua_settop(L, 0); /*  clear remaining elems on stack */[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("exited: %d, exit code: %d, old exit code: %d",[m
[31m-       (int) ctx->exited, (int) ctx->exit_code, (int) old_exit_code);[m
[31m-[m
[31m-#if 1[m
[31m-    /*  clear Lua stack */[m
[31m-    lua_settop(L, 0);[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->exited && ctx->exit_code != old_exit_code) {[m
[31m-        if (ctx->exit_code == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("finalize request with %d", (int) ctx->exit_code);[m
[31m-[m
[31m-        rc = ngx_http_filter_finalize_request(r, &ngx_http_lua_module,[m
[31m-                                              ctx->exit_code);[m
[31m-        if (rc == NGX_ERROR || rc == NGX_AGAIN) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_header_filter_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->header_filter_src.value.data,[m
[31m-                                       llcf->header_filter_src.value.len,[m
[31m-                                       llcf->header_filter_src_key,[m
[31m-                                       "=header_filter_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("calling header filter by chunk");[m
[31m-[m
[31m-    return ngx_http_lua_header_filter_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_header_filter_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* Eval nginx variables in code path string first */[m
[31m-    if (ngx_http_complex_value(r, &llcf->header_filter_src, &eval_src)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->header_filter_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_header_filter_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_header_filter(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-    uint16_t                     old_context;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua header filter for user lua code, uri \"%V\"", &r->uri);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->body_filter_handler) {[m
[31m-        r->filter_need_in_memory = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->header_filter_handler == NULL) {[m
[31m-        dd("no header filter handler found");[m
[31m-        return ngx_http_next_header_filter(r);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    old_context = ctx->context;[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_HEADER_FILTER;[m
[31m-[m
[31m-    dd("calling header filter handler");[m
[31m-    rc = llcf->header_filter_handler(r);[m
[31m-[m
[31m-    ctx->context = old_context;[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_AGAIN || rc == NGX_ERROR) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_next_header_filter(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_header_filter_init(void)[m
[31m-{[m
[31m-    dd("calling header filter init");[m
[31m-    ngx_http_next_header_filter = ngx_http_top_header_filter;[m
[31m-    ngx_http_top_header_filter = ngx_http_lua_header_filter;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.h[m
[1mdeleted file mode 100644[m
[1mindex 822baf7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headerfilterby.h[m
[1m+++ /dev/null[m
[36m@@ -1,29 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_HEADERFILTERBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_HEADERFILTERBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-extern ngx_http_output_header_filter_pt ngx_http_lua_next_filter_header_filter;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_header_filter_init(void);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_header_filter_by_chunk(lua_State *L,[m
[31m-        ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_header_filter_inline(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_header_filter_file(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_HEADERFILTERBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers.c[m
[1mdeleted file mode 100644[m
[1mindex 45be168..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers.c[m
[1m+++ /dev/null[m
[36m@@ -1,1376 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_headers_out.h"[m
[31m-#include "ngx_http_lua_headers_in.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_http_version(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_raw_header(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_header_set_helper(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_header_get(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_header_set(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_headers(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_header_clear(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_header_set(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_resp_get_headers(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_http_version(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    switch (r->http_version) {[m
[31m-    case NGX_HTTP_VERSION_9:[m
[31m-        lua_pushnumber(L, 0.9);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_VERSION_10:[m
[31m-        lua_pushnumber(L, 1.0);[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_VERSION_11:[m
[31m-        lua_pushnumber(L, 1.1);[m
[31m-        break;[m
[31m-[m
[31m-#ifdef NGX_HTTP_VERSION_20[m
[31m-    case NGX_HTTP_VERSION_20:[m
[31m-        lua_pushnumber(L, 2.0);[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default:[m
[31m-        lua_pushnil(L);[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_raw_header(lua_State *L)[m
[31m-{[m
[31m-    int                          n, line_break_len;[m
[31m-    u_char                      *data, *p, *last, *pos;[m
[31m-    unsigned                     no_req_line = 0, found;[m
[31m-    size_t                       size;[m
[31m-    ngx_buf_t                   *b, *first = NULL;[m
[31m-    ngx_int_t                    i, j;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_request_t          *r, *mr;[m
[31m-    ngx_http_connection_t       *hc;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n > 0) {[m
[31m-        no_req_line = lua_toboolean(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    dd("no req line: %d", (int) no_req_line);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    mr = r->main;[m
[31m-    hc = mr->http_connection;[m
[31m-    c = mr->connection;[m
[31m-[m
[31m-#if 1[m
[31m-    dd("hc->nbusy: %d", (int) hc->nbusy);[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        dd("hc->busy: %p %p %p %p", hc->busy[0]->start, hc->busy[0]->pos,[m
[31m-           hc->busy[0]->last, hc->busy[0]->end);[m
[31m-    }[m
[31m-[m
[31m-    dd("request line: %p %p", mr->request_line.data,[m
[31m-       mr->request_line.data + mr->request_line.len);[m
[31m-[m
[31m-    dd("header in: %p %p %p %p", mr->header_in->start,[m
[31m-       mr->header_in->pos, mr->header_in->last,[m
[31m-       mr->header_in->end);[m
[31m-[m
[31m-    dd("c->buffer: %p %p %p %p", c->buffer->start,[m
[31m-       c->buffer->pos, c->buffer->last,[m
[31m-       c->buffer->end);[m
[31m-#endif[m
[31m-[m
[31m-    size = 0;[m
[31m-    b = c->buffer;[m
[31m-[m
[31m-    if (mr->request_line.data[mr->request_line.len] == CR) {[m
[31m-        line_break_len = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        line_break_len = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (mr->request_line.data >= b->start[m
[31m-        && mr->request_line.data + mr->request_line.len[m
[31m-           + line_break_len <= b->pos)[m
[31m-    {[m
[31m-        first = b;[m
[31m-        size += b->pos - mr->request_line.data;[m
[31m-    }[m
[31m-[m
[31m-    dd("size: %d", (int) size);[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        b = NULL;[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            b = hc->busy[i];[m
[31m-[m
[31m-            dd("busy buf: %d: [%.*s]", (int) i, (int) (b->pos - b->start),[m
[31m-               b->start);[m
[31m-[m
[31m-            if (first == NULL) {[m
[31m-                if (mr->request_line.data >= b->pos[m
[31m-                    || mr->request_line.data[m
[31m-                       + mr->request_line.len + line_break_len[m
[31m-                       <= b->start)[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                dd("found first at %d", (int) i);[m
[31m-                first = b;[m
[31m-            }[m
[31m-[m
[31m-            dd("adding size %d", (int) (b->pos - b->start));[m
[31m-            size += b->pos - b->start;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size++;  /* plus the null terminator, as required by the later[m
[31m-                ngx_strstr() call */[m
[31m-[m
[31m-    dd("header size: %d", (int) size);[m
[31m-[m
[31m-    data = lua_newuserdata(L, size);[m
[31m-    last = data;[m
[31m-[m
[31m-    b = c->buffer;[m
[31m-    found = 0;[m
[31m-[m
[31m-    if (first == b) {[m
[31m-        found = 1;[m
[31m-        pos = b->pos;[m
[31m-[m
[31m-        if (no_req_line) {[m
[31m-            last = ngx_copy(data,[m
[31m-                            mr->request_line.data[m
[31m-                            + mr->request_line.len + line_break_len,[m
[31m-                            pos - mr->request_line.data[m
[31m-                            - mr->request_line.len - line_break_len);[m
[31m-[m
[31m-        } else {[m
[31m-            last = ngx_copy(data, mr->request_line.data,[m
[31m-                            pos - mr->request_line.data);[m
[31m-        }[m
[31m-[m
[31m-        if (b != mr->header_in) {[m
[31m-            /* skip truncated header entries (if any) */[m
[31m-            while (last > data && last[-1] != LF) {[m
[31m-                last--;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        i = 0;[m
[31m-        for (p = data; p != last; p++) {[m
[31m-            if (*p == '\0') {[m
[31m-                i++;[m
[31m-                if (p + 1 != last && *(p + 1) == LF) {[m
[31m-                    *p = CR;[m
[31m-[m
[31m-                } else if (i % 2 == 1) {[m
[31m-                    *p = ':';[m
[31m-[m
[31m-                } else {[m
[31m-                    *p = LF;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (hc->nbusy) {[m
[31m-        for (i = 0; i < hc->nbusy; i++) {[m
[31m-            b = hc->busy[i];[m
[31m-[m
[31m-            if (!found) {[m
[31m-                if (b != first) {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                dd("found first");[m
[31m-                found = 1;[m
[31m-            }[m
[31m-[m
[31m-            p = last;[m
[31m-[m
[31m-            pos = b->pos;[m
[31m-[m
[31m-            if (b == first) {[m
[31m-                dd("request line: %.*s", (int) mr->request_line.len,[m
[31m-                   mr->request_line.data);[m
[31m-[m
[31m-                if (no_req_line) {[m
[31m-                    last = ngx_copy(last,[m
[31m-                                    mr->request_line.data[m
[31m-                                    + mr->request_line.len + line_break_len,[m
[31m-                                    pos - mr->request_line.data[m
[31m-                                    - mr->request_line.len - line_break_len);[m
[31m-[m
[31m-                } else {[m
[31m-                    last = ngx_copy(last,[m
[31m-                                    mr->request_line.data,[m
[31m-                                    pos - mr->request_line.data);[m
[31m-[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                last = ngx_copy(last, b->start, pos - b->start);[m
[31m-            }[m
[31m-[m
[31m-#if 1[m
[31m-            /* skip truncated header entries (if any) */[m
[31m-            while (last > p && last[-1] != LF) {[m
[31m-                last--;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            j = 0;[m
[31m-            for (; p != last; p++) {[m
[31m-                if (*p == '\0') {[m
[31m-                    j++;[m
[31m-                    if (p + 1 == last) {[m
[31m-                        /* XXX this should not happen */[m
[31m-                        dd("found string end!!");[m
[31m-[m
[31m-                    } else if (*(p + 1) == LF) {[m
[31m-                        *p = CR;[m
[31m-[m
[31m-                    } else if (j % 2 == 1) {[m
[31m-                        *p = ':';[m
[31m-[m
[31m-                    } else {[m
[31m-                        *p = LF;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b == mr->header_in) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    *last++ = '\0';[m
[31m-[m
[31m-    if (last - data > (ssize_t) size) {[m
[31m-        return luaL_error(L, "buffer error: %d", (int) (last - data - size));[m
[31m-    }[m
[31m-[m
[31m-    /* strip the leading part (if any) of the request body in our header.[m
[31m-     * the first part of the request body could slip in because nginx core's[m
[31m-     * ngx_http_request_body_length_filter and etc can move r->header_in->pos[m
[31m-     * in case that some of the body data has been preread into r->header_in.[m
[31m-     */[m
[31m-[m
[31m-    if ((p = (u_char *) ngx_strstr(data, CRLF CRLF)) != NULL) {[m
[31m-        last = p + sizeof(CRLF CRLF) - 1;[m
[31m-[m
[31m-    } else if ((p = (u_char *) ngx_strstr(data, CRLF "\n")) != NULL) {[m
[31m-        last = p + sizeof(CRLF "\n") - 1;[m
[31m-[m
[31m-    } else if ((p = (u_char *) ngx_strstr(data, "\n" CRLF)) != NULL) {[m
[31m-        last = p + sizeof("\n" CRLF) - 1;[m
[31m-[m
[31m-    } else {[m
[31m-        for (p = last - 1; p - data >= 2; p--) {[m
[31m-            if (p[0] == LF && p[-1] == CR) {[m
[31m-                p[-1] = LF;[m
[31m-                last = p + 1;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (p[0] == LF && p[-1] == LF) {[m
[31m-                last = p + 1;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) data, last - data);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_headers(lua_State *L)[m
[31m-{[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header;[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_uint_t                    i;[m
[31m-    int                           n;[m
[31m-    int                           max;[m
[31m-    int                           raw = 0;[m
[31m-    int                           count = 0;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n >= 1) {[m
[31m-        if (lua_isnil(L, 1)) {[m
[31m-            max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-[m
[31m-        } else {[m
[31m-            max = luaL_checkinteger(L, 1);[m
[31m-        }[m
[31m-[m
[31m-        if (n >= 2) {[m
[31m-            raw = lua_toboolean(L, 2);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    count = part->nelts;[m
[31m-    while (part->next) {[m
[31m-        part = part->next;[m
[31m-        count += part->nelts;[m
[31m-    }[m
[31m-[m
[31m-    if (max > 0 && count > max) {[m
[31m-        count = max;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exceeding request header limit %d", max);[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, count);[m
[31m-[m
[31m-    if (!raw) {[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_headers_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-    }[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        dd("stack top: %d", lua_gettop(L));[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (raw) {[m
[31m-            lua_pushlstring(L, (char *) header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushlstring(L, (char *) header[i].lowcase_key,[m
[31m-                            header[i].key.len);[m
[31m-        }[m
[31m-[m
[31m-        /* stack: table key */[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) header[i].value.data,[m
[31m-                        header[i].value.len); /* stack: table key value */[m
[31m-[m
[31m-        ngx_http_lua_set_multi_value_table(L, -3);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua request header: \"%V: %V\"",[m
[31m-                       &header[i].key, &header[i].value);[m
[31m-[m
[31m-        if (--count == 0) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_resp_get_headers(lua_State *L)[m
[31m-{[m
[31m-    ngx_list_part_t    *part;[m
[31m-    ngx_table_elt_t    *header;[m
[31m-    ngx_http_request_t *r;[m
[31m-    u_char             *lowcase_key = NULL;[m
[31m-    size_t              lowcase_key_sz = 0;[m
[31m-    ngx_uint_t          i;[m
[31m-    int                 n;[m
[31m-    int                 max;[m
[31m-    int                 raw = 0;[m
[31m-    int                 count = 0;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n >= 1) {[m
[31m-        if (lua_isnil(L, 1)) {[m
[31m-            max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-[m
[31m-        } else {[m
[31m-            max = luaL_checkinteger(L, 1);[m
[31m-        }[m
[31m-[m
[31m-        if (n >= 2) {[m
[31m-            raw = lua_toboolean(L, 2);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    count = part->nelts;[m
[31m-    while (part->next) {[m
[31m-        part = part->next;[m
[31m-        count += part->nelts;[m
[31m-    }[m
[31m-[m
[31m-    if (max > 0 && count > max) {[m
[31m-        count = max;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exceeding request header limit %d", max);[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, count);[m
[31m-[m
[31m-    if (!raw) {[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_headers_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.content_type.len) {[m
[31m-        lua_pushliteral(L, "content-type");[m
[31m-        lua_pushlstring(L, (char *) r->headers_out.content_type.data,[m
[31m-                        r->headers_out.content_type.len);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL[m
[31m-        && r->headers_out.content_length_n >= 0)[m
[31m-    {[m
[31m-        lua_pushliteral(L, "content-length");[m
[31m-        lua_pushfstring(L, "%d", (int) r->headers_out.content_length_n);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushliteral(L, "connection");[m
[31m-    if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {[m
[31m-        lua_pushliteral(L, "upgrade");[m
[31m-[m
[31m-    } else if (r->keepalive) {[m
[31m-        lua_pushliteral(L, "keep-alive");[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushliteral(L, "close");[m
[31m-    }[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    if (r->chunked) {[m
[31m-        lua_pushliteral(L, "transfer-encoding");[m
[31m-        lua_pushliteral(L, "chunked");[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        dd("stack top: %d", lua_gettop(L));[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (raw) {[m
[31m-            lua_pushlstring(L, (char *) header[i].key.data, header[i].key.len);[m
[31m-[m
[31m-        } else {[m
[31m-            /* nginx does not even bother initializing output header entry's[m
[31m-             * "lowcase_key" field. so we cannot count on that at all. */[m
[31m-            if (header[i].key.len > lowcase_key_sz) {[m
[31m-                lowcase_key_sz = header[i].key.len * 2;[m
[31m-[m
[31m-                /* we allocate via Lua's GC to prevent in-request[m
[31m-                 * leaks in the nginx request memory pools */[m
[31m-                lowcase_key = lua_newuserdata(L, lowcase_key_sz);[m
[31m-                lua_insert(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            ngx_strlow(lowcase_key, header[i].key.data, header[i].key.len);[m
[31m-            lua_pushlstring(L, (char *) lowcase_key, header[i].key.len);[m
[31m-        }[m
[31m-[m
[31m-        /* stack: [udata] table key */[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) header[i].value.data,[m
[31m-                        header[i].value.len); /* stack: [udata] table key[m
[31m-                                                 value */[m
[31m-[m
[31m-        ngx_http_lua_set_multi_value_table(L, -3);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua response header: \"%V: %V\"",[m
[31m-                       &header[i].key, &header[i].value);[m
[31m-[m
[31m-        if (--count == 0) {[m
[31m-            return 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_header_get(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p, c;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_uint_t                   i;[m
[31m-    size_t                       len;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    /* we skip the first argument that is the table */[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    dd("key: %.*s, len %d", (int) len, p, (int) len);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (llcf->transform_underscores_in_resp_headers[m
[31m-        && memchr(p, '_', len) != NULL)[m
[31m-    {[m
[31m-        key.data = (u_char *) lua_newuserdata(L, len);[m
[31m-        if (key.data == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        /* replace "_" with "-" */[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            c = p[i];[m
[31m-            if (c == '_') {[m
[31m-                c = '-';[m
[31m-            }[m
[31m-            key.data[i] = c;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        key.data = p;[m
[31m-    }[m
[31m-[m
[31m-    key.len = len;[m
[31m-[m
[31m-    return ngx_http_lua_get_output_header(L, r, &key);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_header_set(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_str_t                    value;[m
[31m-    ngx_uint_t                   i;[m
[31m-    size_t                       len;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "[m
[31m-                      "set ngx.header.HEADER after sending out "[m
[31m-                      "response headers");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    /* we skip the first argument that is the table */[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    dd("key: %.*s, len %d", (int) len, p, (int) len);[m
[31m-[m
[31m-    key.data = ngx_palloc(r->pool, len + 1);[m
[31m-    if (key.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(key.data, p, len);[m
[31m-    key.data[len] = '\0';[m
[31m-    key.len = len;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->transform_underscores_in_resp_headers) {[m
[31m-        /* replace "_" with "-" */[m
[31m-        p = key.data;[m
[31m-        for (i = 0; i < len; i++) {[m
[31m-            if (p[i] == '_') {[m
[31m-                p[i] = '-';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->headers_set) {[m
[31m-        rc = ngx_http_lua_set_content_type(r);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L,[m
[31m-                              "failed to set default content type: %d",[m
[31m-                              (int) rc);[m
[31m-        }[m
[31m-[m
[31m-        ctx->headers_set = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 3) == LUA_TNIL) {[m
[31m-        ngx_str_null(&value);[m
[31m-[m
[31m-    } else if (lua_type(L, 3) == LUA_TTABLE) {[m
[31m-        n = luaL_getn(L, 3);[m
[31m-        if (n == 0) {[m
[31m-            ngx_str_null(&value);[m
[31m-[m
[31m-        } else {[m
[31m-            for (i = 1; i <= n; i++) {[m
[31m-                dd("header value table index %d", (int) i);[m
[31m-[m
[31m-                lua_rawgeti(L, 3, i);[m
[31m-                p = (u_char *) luaL_checklstring(L, -1, &len);[m
[31m-[m
[31m-                value.data = ngx_palloc(r->pool, len);[m
[31m-                if (value.data == NULL) {[m
[31m-                    return luaL_error(L, "no memory");[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(value.data, p, len);[m
[31m-                value.len = len;[m
[31m-[m
[31m-                rc = ngx_http_lua_set_output_header(r, key, value,[m
[31m-                                                    i == 1 /* override */);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    return luaL_error(L,[m
[31m-                                      "failed to set header %s (error: %d)",[m
[31m-                                      key.data, (int) rc);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) luaL_checklstring(L, 3, &len);[m
[31m-        value.data = ngx_palloc(r->pool, len);[m
[31m-        if (value.data == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(value.data, p, len);[m
[31m-        value.len = len;[m
[31m-    }[m
[31m-[m
[31m-    dd("key: %.*s, value: %.*s",[m
[31m-       (int) key.len, key.data, (int) value.len, value.data);[m
[31m-[m
[31m-    rc = ngx_http_lua_set_output_header(r, key, value, 1 /* override */);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return luaL_error(L, "failed to set header %s (error: %d)",[m
[31m-                          key.data, (int) rc);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_header_clear(lua_State *L)[m
[31m-{[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one arguments, but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-[m
[31m-    return ngx_http_lua_ngx_req_header_set_helper(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_header_set(lua_State *L)[m
[31m-{[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expecting two arguments, but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_ngx_req_header_set_helper(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_header_set_helper(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_str_t                    value;[m
[31m-    ngx_uint_t                   i;[m
[31m-    size_t                       len;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    dd("key: %.*s, len %d", (int) len, p, (int) len);[m
[31m-[m
[31m-#if 0[m
[31m-    /* replace "_" with "-" */[m
[31m-    for (i = 0; i < len; i++) {[m
[31m-        if (p[i] == '_') {[m
[31m-            p[i] = '-';[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    key.data = ngx_palloc(r->pool, len + 1);[m
[31m-    if (key.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(key.data, p, len);[m
[31m-[m
[31m-    key.data[len] = '\0';[m
[31m-[m
[31m-    key.len = len;[m
[31m-[m
[31m-    if (lua_type(L, 2) == LUA_TNIL) {[m
[31m-        ngx_str_null(&value);[m
[31m-[m
[31m-    } else if (lua_type(L, 2) == LUA_TTABLE) {[m
[31m-        n = luaL_getn(L, 2);[m
[31m-        if (n == 0) {[m
[31m-            ngx_str_null(&value);[m
[31m-[m
[31m-        } else {[m
[31m-            for (i = 1; i <= n; i++) {[m
[31m-                dd("header value table index %d, top: %d", (int) i,[m
[31m-                   lua_gettop(L));[m
[31m-[m
[31m-                lua_rawgeti(L, 2, i);[m
[31m-                p = (u_char *) luaL_checklstring(L, -1, &len);[m
[31m-[m
[31m-                /*[m
[31m-                 * we also copy the trailling '\0' char here because nginx[m
[31m-                 * header values must be null-terminated[m
[31m-                 * */[m
[31m-[m
[31m-                value.data = ngx_palloc(r->pool, len + 1);[m
[31m-                if (value.data == NULL) {[m
[31m-                    return luaL_error(L, "no memory");[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(value.data, p, len + 1);[m
[31m-                value.len = len;[m
[31m-[m
[31m-                rc = ngx_http_lua_set_input_header(r, key, value,[m
[31m-                                                   i == 1 /* override */);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    return luaL_error(L,[m
[31m-                                      "failed to set header %s (error: %d)",[m
[31m-                                      key.data, (int) rc);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        /*[m
[31m-         * we also copy the trailling '\0' char here because nginx[m
[31m-         * header values must be null-terminated[m
[31m-         * */[m
[31m-[m
[31m-        p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-        value.data = ngx_palloc(r->pool, len + 1);[m
[31m-        if (value.data == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(value.data, p, len + 1);[m
[31m-        value.len = len;[m
[31m-    }[m
[31m-[m
[31m-    dd("key: %.*s, value: %.*s",[m
[31m-       (int) key.len, key.data, (int) value.len, value.data);[m
[31m-[m
[31m-    rc = ngx_http_lua_set_input_header(r, key, value, 1 /* override */);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return luaL_error(L, "failed to set header %s (error: %d)",[m
[31m-                          key.data, (int) rc);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_resp_header_api(lua_State *L)[m
[31m-{[m
[31m-    lua_newtable(L);    /* .header */[m
[31m-[m
[31m-    lua_createtable(L, 0, 2); /* metatable for .header */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_header_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_header_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    lua_setfield(L, -2, "header");[m
[31m-[m
[31m-    lua_createtable(L, 0, 1); /* .resp */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_resp_get_headers);[m
[31m-    lua_setfield(L, -2, "get_headers");[m
[31m-[m
[31m-    lua_setfield(L, -2, "resp");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_header_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_http_version);[m
[31m-    lua_setfield(L, -2, "http_version");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_raw_header);[m
[31m-    lua_setfield(L, -2, "raw_header");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_header_clear);[m
[31m-    lua_setfield(L, -2, "clear_header");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_header_set);[m
[31m-    lua_setfield(L, -2, "set_header");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_headers);[m
[31m-    lua_setfield(L, -2, "get_headers");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_create_headers_metatable(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    int rc;[m
[31m-    const char buf[] =[m
[31m-        "local tb, key = ...\n"[m
[31m-        "local new_key = string.gsub(string.lower(key), '_', '-')\n"[m
[31m-        "if new_key ~= key then return tb[new_key] else return nil end";[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_headers_metatable_key);[m
[31m-[m
[31m-    /* metatable for ngx.req.get_headers(_, true) and[m
[31m-     * ngx.resp.get_headers(_, true) */[m
[31m-    lua_createtable(L, 0, 1);[m
[31m-[m
[31m-    rc = luaL_loadbuffer(L, buf, sizeof(buf) - 1, "=headers metatable");[m
[31m-    if (rc != 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0,[m
[31m-                      "failed to load Lua code for the metamethod for "[m
[31m-                      "headers: %i: %s", rc, lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_pop(L, 3);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_headers_count(ngx_http_request_t *r, int max)[m
[31m-{[m
[31m-    int                           count;[m
[31m-    ngx_list_part_t              *part;[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (max < 0) {[m
[31m-        max = NGX_HTTP_LUA_MAX_HEADERS;[m
[31m-    }[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    count = part->nelts;[m
[31m-    while (part->next) {[m
[31m-        part = part->next;[m
[31m-        count += part->nelts;[m
[31m-    }[m
[31m-[m
[31m-    if (max > 0 && count > max) {[m
[31m-        count = max;[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua exceeding request header limit %d", max);[m
[31m-    }[m
[31m-[m
[31m-    return count;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ffi_table_elt_t *out, int count, int raw)[m
[31m-{[m
[31m-    int                           n;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_list_part_t              *part;[m
[31m-    ngx_table_elt_t              *header;[m
[31m-[m
[31m-    if (count <= 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (raw) {[m
[31m-            out[n].key.data = header[i].key.data;[m
[31m-            out[n].key.len = (int) header[i].key.len;[m
[31m-[m
[31m-        } else {[m
[31m-            out[n].key.data = header[i].lowcase_key;[m
[31m-            out[n].key.len = (int) header[i].key.len;[m
[31m-        }[m
[31m-[m
[31m-        out[n].value.data = header[i].value.data;[m
[31m-        out[n].value.len = (int) header[i].value.len;[m
[31m-[m
[31m-        if (++n == count) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r, const u_char *key_data,[m
[31m-    size_t key_len, int is_nil, const u_char *sval, size_t sval_len,[m
[31m-    ngx_http_lua_ffi_str_t *mvals, size_t mvals_len, char **errmsg)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_str_t                    value, key;[m
[31m-    ngx_uint_t                   i;[m
[31m-    size_t                       len;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_LUA_FFI_NO_REQ_CTX;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "[m
[31m-                      "set ngx.header.HEADER after sending out "[m
[31m-                      "response headers");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    key.data = ngx_palloc(r->pool, key_len + 1);[m
[31m-    if (key.data == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(key.data, key_data, key_len);[m
[31m-    key.data[key_len] = '\0';[m
[31m-    key.len = key_len;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->transform_underscores_in_resp_headers) {[m
[31m-        /* replace "_" with "-" */[m
[31m-        p = key.data;[m
[31m-        for (i = 0; i < key_len; i++) {[m
[31m-            if (p[i] == '_') {[m
[31m-                p[i] = '-';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->headers_set) {[m
[31m-        rc = ngx_http_lua_set_content_type(r);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            *errmsg = "failed to set default content type";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ctx->headers_set = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (is_nil) {[m
[31m-        value.data = NULL;[m
[31m-        value.len = 0;[m
[31m-[m
[31m-    } else if (mvals) {[m
[31m-[m
[31m-        if (mvals_len == 0) {[m
[31m-            value.data = NULL;[m
[31m-            value.len = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            for (i = 0; i < mvals_len; i++) {[m
[31m-                dd("header value table index %d", (int) i);[m
[31m-[m
[31m-                p = mvals[i].data;[m
[31m-                len = mvals[i].len;[m
[31m-[m
[31m-                value.data = ngx_palloc(r->pool, len);[m
[31m-                if (value.data == NULL) {[m
[31m-                    goto nomem;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(value.data, p, len);[m
[31m-                value.len = len;[m
[31m-[m
[31m-                rc = ngx_http_lua_set_output_header(r, key, value,[m
[31m-                                                    i == 0 /* override */);[m
[31m-[m
[31m-                if (rc == NGX_ERROR) {[m
[31m-                    *errmsg = "failed to set header";[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) sval;[m
[31m-        value.data = ngx_palloc(r->pool, sval_len);[m
[31m-        if (value.data == NULL) {[m
[31m-            goto nomem;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(value.data, p, sval_len);[m
[31m-        value.len = sval_len;[m
[31m-    }[m
[31m-[m
[31m-    dd("key: %.*s, value: %.*s",[m
[31m-       (int) key.len, key.data, (int) value.len, value.data);[m
[31m-[m
[31m-    rc = ngx_http_lua_set_output_header(r, key, value, 1 /* override */);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        *errmsg = "failed to set header";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    *errmsg = "no memory";[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_header_set_single_value(ngx_http_request_t *r,[m
[31m-    const u_char *key, size_t key_len, const u_char *value, size_t value_len)[m
[31m-{[m
[31m-    ngx_str_t                    k;[m
[31m-    ngx_str_t                    v;[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {  /* fake request */[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (r->http_version < NGX_HTTP_VERSION_10) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    k.data = ngx_palloc(r->pool, key_len + 1);[m
[31m-    if (k.data == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-    ngx_memcpy(k.data, key, key_len);[m
[31m-    k.data[key_len] = '\0';[m
[31m-[m
[31m-    k.len = key_len;[m
[31m-[m
[31m-    if (value_len == 0) {[m
[31m-        v.data = NULL;[m
[31m-        v.len = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        v.data = ngx_palloc(r->pool, value_len + 1);[m
[31m-        if (v.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        ngx_memcpy(v.data, value, value_len);[m
[31m-        v.data[value_len] = '\0';[m
[31m-    }[m
[31m-[m
[31m-    v.len = value_len;[m
[31m-[m
[31m-    if (ngx_http_lua_set_input_header(r, k, v, 1 /* override */)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_get_resp_header(ngx_http_request_t *r,[m
[31m-    const u_char *key, size_t key_len,[m
[31m-    u_char *key_buf, ngx_http_lua_ffi_str_t *values, int max_nvalues)[m
[31m-{[m
[31m-    int                  found;[m
[31m-    u_char               c, *p;[m
[31m-    ngx_uint_t           i;[m
[31m-    ngx_table_elt_t     *h;[m
[31m-    ngx_list_part_t     *part;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (llcf->transform_underscores_in_resp_headers[m
[31m-        && memchr(key, '_', key_len) != NULL)[m
[31m-    {[m
[31m-        for (i = 0; i < key_len; i++) {[m
[31m-            c = key[i];[m
[31m-            if (c == '_') {[m
[31m-                c = '-';[m
[31m-            }[m
[31m-[m
[31m-            key_buf[i] = c;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        key_buf = (u_char *) key;[m
[31m-    }[m
[31m-[m
[31m-    switch (key_len) {[m
[31m-    case 14:[m
[31m-        if (r->headers_out.content_length == NULL[m
[31m-            && r->headers_out.content_length_n >= 0[m
[31m-            && ngx_strncasecmp(key_buf, (u_char *) "Content-Length", 14) == 0)[m
[31m-        {[m
[31m-            p = ngx_palloc(r->pool, NGX_OFF_T_LEN);[m
[31m-            if (p == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            values[0].data = p;[m
[31m-            values[0].len = (int) (ngx_snprintf(p, NGX_OFF_T_LEN, "%O",[m
[31m-                                              r->headers_out.content_length_n)[m
[31m-                            - p);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case 12:[m
[31m-        if (r->headers_out.content_type.len[m
[31m-            && ngx_strncasecmp(key_buf, (u_char *) "Content-Type", 12) == 0)[m
[31m-        {[m
[31m-            values[0].data = r->headers_out.content_type.data;[m
[31m-            values[0].len = r->headers_out.content_type.len;[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    dd("not a built-in output header");[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        /* XXX ngx_http_core_find_config_phase, for example,[m
[31m-         * may not initialize the "key" and "hash" fields[m
[31m-         * for a nasty optimization purpose, and[m
[31m-         * we have to work-around it here */[m
[31m-[m
[31m-        r->headers_out.location->hash = ngx_http_lua_location_hash;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("checking (%d) \"%.*s\"", (int) h[i].key.len, (int) h[i].key.len,[m
[31m-           h[i].key.data);[m
[31m-[m
[31m-        if (h[i].key.len == key_len[m
[31m-            && ngx_strncasecmp(key_buf, h[i].key.data, key_len) == 0)[m
[31m-        {[m
[31m-            values[found].data = h[i].value.data;[m
[31m-            values[found].len = (int) h[i].value.len;[m
[31m-[m
[31m-            if (++found >= max_nvalues) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return found;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers.h[m
[1mdeleted file mode 100644[m
[1mindex 39f1114..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_HEADERS_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_HEADERS_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_resp_header_api(lua_State *L);[m
[31m-void ngx_http_lua_inject_req_header_api(lua_State *L);[m
[31m-void ngx_http_lua_create_headers_metatable(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_HEADERS_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.c[m
[1mdeleted file mode 100644[m
[1mindex 82b4331..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.c[m
[1m+++ /dev/null[m
[36m@@ -1,830 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_headers_in.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header);[m
[31m-static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_user_agent_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_connection_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_lua_validate_host(ngx_str_t *host, ngx_pool_t *pool,[m
[31m-    ngx_uint_t alloc);[m
[31m-static ngx_int_t ngx_http_set_host_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_lua_rm_header_helper(ngx_list_t *l,[m
[31m-    ngx_list_part_t *cur, ngx_uint_t i);[m
[31m-[m
[31m-[m
[31m-static ngx_http_lua_set_header_t  ngx_http_lua_set_handlers[] = {[m
[31m-    { ngx_string("Host"),[m
[31m-                 offsetof(ngx_http_headers_in_t, host),[m
[31m-                 ngx_http_set_host_header },[m
[31m-[m
[31m-    { ngx_string("Connection"),[m
[31m-                 offsetof(ngx_http_headers_in_t, connection),[m
[31m-                 ngx_http_set_connection_header },[m
[31m-[m
[31m-    { ngx_string("If-Modified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_modified_since),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 9002[m
[31m-    { ngx_string("If-Unmodified-Since"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_unmodified_since),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003003[m
[31m-    { ngx_string("If-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_match),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("If-None-Match"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_none_match),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("User-Agent"),[m
[31m-                 offsetof(ngx_http_headers_in_t, user_agent),[m
[31m-                 ngx_http_set_user_agent_header },[m
[31m-[m
[31m-    { ngx_string("Referer"),[m
[31m-                 offsetof(ngx_http_headers_in_t, referer),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_length),[m
[31m-                 ngx_http_set_content_length_header },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_in_t, content_type),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("If-Range"),[m
[31m-                 offsetof(ngx_http_headers_in_t, if_range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Transfer-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, transfer_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Expect"),[m
[31m-                 offsetof(ngx_http_headers_in_t, expect),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003013[m
[31m-    { ngx_string("Upgrade"),[m
[31m-                 offsetof(ngx_http_headers_in_t, upgrade),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_GZIP)[m
[31m-    { ngx_string("Accept-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_in_t, accept_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Via"),[m
[31m-                 offsetof(ngx_http_headers_in_t, via),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Authorization"),[m
[31m-                 offsetof(ngx_http_headers_in_t, authorization),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Keep-Alive"),[m
[31m-                 offsetof(ngx_http_headers_in_t, keep_alive),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if (NGX_HTTP_X_FORWARDED_FOR)[m
[31m-    { ngx_string("X-Forwarded-For"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_forwarded_for),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_REALIP)[m
[31m-    { ngx_string("X-Real-IP"),[m
[31m-                 offsetof(ngx_http_headers_in_t, x_real_ip),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_DAV)[m
[31m-    { ngx_string("Depth"),[m
[31m-                 offsetof(ngx_http_headers_in_t, depth),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Destination"),[m
[31m-                 offsetof(ngx_http_headers_in_t, destination),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Overwrite"),[m
[31m-                 offsetof(ngx_http_headers_in_t, overwrite),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Cookie"),[m
[31m-                 offsetof(ngx_http_headers_in_t, cookies),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, ngx_http_set_header }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* request time implementation */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header_helper(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value, ngx_table_elt_t **output_header)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h, *matched;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_uint_t                   rc;[m
[31m-[m
[31m-    if (hv->no_override) {[m
[31m-        goto new_header;[m
[31m-    }[m
[31m-[m
[31m-    matched = NULL;[m
[31m-[m
[31m-retry:[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        dd("i: %d, part: %p", (int) i, part);[m
[31m-[m
[31m-        if (h[i].key.len == hv->key.len[m
[31m-            && ngx_strncasecmp(h[i].key.data, hv->key.data, h[i].key.len)[m
[31m-               == 0)[m
[31m-        {[m
[31m-            if (value->len == 0 || (matched && matched != &h[i])) {[m
[31m-                h[i].hash = 0;[m
[31m-[m
[31m-                dd("rm header %.*s: %.*s", (int) h[i].key.len, h[i].key.data,[m
[31m-                   (int) h[i].value.len, h[i].value.data);[m
[31m-[m
[31m-                rc = ngx_http_lua_rm_header_helper(&r->headers_in.headers,[m
[31m-                                                   part, i);[m
[31m-[m
[31m-                ngx_http_lua_assert(!(r->headers_in.headers.part.next == NULL[m
[31m-                                      && r->headers_in.headers.last[m
[31m-                                         != &r->headers_in.headers.part));[m
[31m-[m
[31m-                dd("rm header: rc=%d", (int) rc);[m
[31m-[m
[31m-                if (rc == NGX_OK) {[m
[31m-[m
[31m-                    if (output_header) {[m
[31m-                        *output_header = NULL;[m
[31m-                    }[m
[31m-[m
[31m-                    goto retry;[m
[31m-                }[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            h[i].value = *value;[m
[31m-[m
[31m-            if (output_header) {[m
[31m-                *output_header = &h[i];[m
[31m-                dd("setting existing builtin input header");[m
[31m-            }[m
[31m-[m
[31m-            if (matched == NULL) {[m
[31m-                matched = &h[i];[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (matched){[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-new_header:[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("created new header for %.*s", (int) hv->key.len, hv->key.data);[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        h->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    if (output_header) {[m
[31m-        *output_header = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h, **old;[m
[31m-[m
[31m-    dd("entered set_builtin_header (input)");[m
[31m-[m
[31m-    if (hv->offset) {[m
[31m-        old = (ngx_table_elt_t **) ((char *) &r->headers_in + hv->offset);[m
[31m-[m
[31m-    } else {[m
[31m-        old = NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("old builtin ptr ptr: %p", old);[m
[31m-    if (old) {[m
[31m-        dd("old builtin ptr: %p", *old);[m
[31m-    }[m
[31m-[m
[31m-    if (old == NULL || *old == NULL) {[m
[31m-        dd("set normal header");[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old);[m
[31m-    }[m
[31m-[m
[31m-    h = *old;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-        h->value = *value;[m
[31m-[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old);[m
[31m-    }[m
[31m-[m
[31m-    h->hash = hv->hash;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc)[m
[31m-{[m
[31m-    u_char  *h, ch;[m
[31m-    size_t   i, dot_pos, host_len;[m
[31m-[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_literal,[m
[31m-        sw_rest[m
[31m-    } state;[m
[31m-[m
[31m-    dot_pos = host->len;[m
[31m-    host_len = host->len;[m
[31m-[m
[31m-    h = host->data;[m
[31m-[m
[31m-    state = sw_usual;[m
[31m-[m
[31m-    for (i = 0; i < host->len; i++) {[m
[31m-        ch = h[i];[m
[31m-[m
[31m-        switch (ch) {[m
[31m-[m
[31m-        case '.':[m
[31m-            if (dot_pos == i - 1) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-            dot_pos = i;[m
[31m-            break;[m
[31m-[m
[31m-        case ':':[m
[31m-            if (state == sw_usual) {[m
[31m-                host_len = i;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '[':[m
[31m-            if (i == 0) {[m
[31m-                state = sw_literal;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case ']':[m
[31m-            if (state == sw_literal) {[m
[31m-                host_len = i + 1;[m
[31m-                state = sw_rest;[m
[31m-            }[m
[31m-            break;[m
[31m-[m
[31m-        case '\0':[m
[31m-            return NGX_DECLINED;[m
[31m-[m
[31m-        default:[m
[31m-[m
[31m-            if (ngx_path_separator(ch)) {[m
[31m-                return NGX_DECLINED;[m
[31m-            }[m
[31m-[m
[31m-            if (ch >= 'A' && ch <= 'Z') {[m
[31m-                alloc = 1;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (dot_pos == host_len - 1) {[m
[31m-        host_len--;[m
[31m-    }[m
[31m-[m
[31m-    if (host_len == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    if (alloc) {[m
[31m-        host->data = ngx_pnalloc(pool, host_len);[m
[31m-        if (host->data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_strlow(host->data, h, host_len);[m
[31m-    }[m
[31m-[m
[31m-    host->len = host_len;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_host_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_str_t host;[m
[31m-[m
[31m-    dd("server new value len: %d", (int) value->len);[m
[31m-[m
[31m-    if (value->len) {[m
[31m-        host= *value;[m
[31m-[m
[31m-        if (ngx_http_lua_validate_host(&host, r->pool, 0) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.server = host;[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_in.server = *value;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_connection_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_in.connection_type = 0;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_set_builtin_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strcasestrn(value->data, "close", 5 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;[m
[31m-        r->headers_in.keep_alive_n = -1;[m
[31m-[m
[31m-    } else if (ngx_strcasestrn(value->data, "keep-alive", 10 - 1)) {[m
[31m-        r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* borrowed the code from ngx_http_request.c:ngx_http_process_user_agent */[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_user_agent_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    u_char  *user_agent, *msie;[m
[31m-[m
[31m-    /* clear existing settings */[m
[31m-[m
[31m-    r->headers_in.msie = 0;[m
[31m-    r->headers_in.msie6 = 0;[m
[31m-    r->headers_in.opera = 0;[m
[31m-    r->headers_in.gecko = 0;[m
[31m-    r->headers_in.chrome = 0;[m
[31m-    r->headers_in.safari = 0;[m
[31m-    r->headers_in.konqueror = 0;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_set_builtin_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    /* check some widespread browsers */[m
[31m-[m
[31m-    user_agent = value->data;[m
[31m-[m
[31m-    msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1);[m
[31m-[m
[31m-    if (msie && msie + 7 < user_agent + value->len) {[m
[31m-[m
[31m-        r->headers_in.msie = 1;[m
[31m-[m
[31m-        if (msie[6] == '.') {[m
[31m-[m
[31m-            switch (msie[5]) {[m
[31m-            case '4':[m
[31m-            case '5':[m
[31m-                r->headers_in.msie6 = 1;[m
[31m-                break;[m
[31m-            case '6':[m
[31m-                if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) {[m
[31m-                    r->headers_in.msie6 = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_strstrn(user_agent, "Opera", 5 - 1)) {[m
[31m-        r->headers_in.opera = 1;[m
[31m-        r->headers_in.msie = 0;[m
[31m-        r->headers_in.msie6 = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!r->headers_in.msie && !r->headers_in.opera) {[m
[31m-[m
[31m-        if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {[m
[31m-            r->headers_in.gecko = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {[m
[31m-            r->headers_in.chrome = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)[m
[31m-                   && ngx_strstrn(user_agent, "Mac OS X", 8 - 1))[m
[31m-        {[m
[31m-            r->headers_in.safari = 1;[m
[31m-[m
[31m-        } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {[m
[31m-            r->headers_in.konqueror = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    off_t           len;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_content_length_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_atosz(value->data, value->len);[m
[31m-    if (len == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("reset headers_in.content_length_n to %d", (int) len);[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_array_t       *headers;[m
[31m-    ngx_table_elt_t  **v, *h;[m
[31m-[m
[31m-    headers = (ngx_array_t *) ((char *) &r->headers_in + hv->offset);[m
[31m-[m
[31m-    if (!hv->no_override && headers->nelts > 0) {[m
[31m-        ngx_array_destroy(headers);[m
[31m-[m
[31m-        if (ngx_array_init(headers, r->pool, 2,[m
[31m-                           sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("clear multi-value headers: %d", (int) headers->nelts);[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (headers->nalloc == 0) {[m
[31m-        if (ngx_array_init(headers, r->pool, 2,[m
[31m-                           sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_http_set_header_helper(r, hv, value, &h) == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("new multi-value header: %p", h);[m
[31m-[m
[31m-    v = ngx_array_push(headers);[m
[31m-    if (v == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *v = h;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_in.content_length_n = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    value->len = 0;[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_set_input_header(ngx_http_request_t *r, ngx_str_t key,[m
[31m-    ngx_str_t value, unsigned override)[m
[31m-{[m
[31m-    ngx_http_lua_header_val_t         hv;[m
[31m-    ngx_http_lua_set_header_t        *handlers = ngx_http_lua_set_handlers;[m
[31m-[m
[31m-    ngx_uint_t                        i;[m
[31m-[m
[31m-    dd("set header value: %.*s", (int) value.len, value.data);[m
[31m-[m
[31m-    hv.hash = ngx_hash_key_lc(key.data, key.len);[m
[31m-    hv.key = key;[m
[31m-[m
[31m-    hv.offset = 0;[m
[31m-    hv.no_override = !override;[m
[31m-    hv.handler = NULL;[m
[31m-[m
[31m-    for (i = 0; handlers[i].name.len; i++) {[m
[31m-        if (hv.key.len != handlers[i].name.len[m
[31m-            || ngx_strncasecmp(hv.key.data, handlers[i].name.data,[m
[31m-                               handlers[i].name.len) != 0)[m
[31m-        {[m
[31m-            dd("hv key comparison: %s <> %s", handlers[i].name.data,[m
[31m-               hv.key.data);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("Matched handler: %s %s", handlers[i].name.data, hv.key.data);[m
[31m-[m
[31m-        hv.offset = handlers[i].offset;[m
[31m-        hv.handler = handlers[i].handler;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (handlers[i].name.len == 0 && handlers[i].handler) {[m
[31m-        hv.offset = handlers[i].offset;[m
[31m-        hv.handler = handlers[i].handler;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (hv.handler == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return hv.handler(r, &hv, &value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_rm_header_helper(ngx_list_t *l, ngx_list_part_t *cur,[m
[31m-    ngx_uint_t i)[m
[31m-{[m
[31m-    ngx_table_elt_t             *data;[m
[31m-    ngx_list_part_t             *new, *part;[m
[31m-[m
[31m-    dd("list rm item: part %p, i %d, nalloc %d", cur, (int) i,[m
[31m-       (int) l->nalloc);[m
[31m-[m
[31m-    data = cur->elts;[m
[31m-[m
[31m-    dd("cur: nelts %d, nalloc %d", (int) cur->nelts,[m
[31m-       (int) l->nalloc);[m
[31m-[m
[31m-    dd("removing: \"%.*s:%.*s\"", (int) data[i].key.len, data[i].key.data,[m
[31m-       (int) data[i].value.len, data[i].value.data);[m
[31m-[m
[31m-    if (i == 0) {[m
[31m-        dd("first entry in the part");[m
[31m-        cur->elts = (char *) cur->elts + l->size;[m
[31m-        cur->nelts--;[m
[31m-[m
[31m-        if (cur == l->last) {[m
[31m-            dd("being the last part");[m
[31m-            if (cur->nelts == 0) {[m
[31m-#if 1[m
[31m-                part = &l->part;[m
[31m-                dd("cur=%p, part=%p, part next=%p, last=%p",[m
[31m-                   cur, part, part->next, l->last);[m
[31m-[m
[31m-                if (part == cur) {[m
[31m-                    cur->elts = (char *) cur->elts - l->size;[m
[31m-                    /* do nothing */[m
[31m-[m
[31m-                } else {[m
[31m-                    while (part->next != cur) {[m
[31m-                        if (part->next == NULL) {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-                        part = part->next;[m
[31m-                    }[m
[31m-[m
[31m-                    l->last = part;[m
[31m-                    part->next = NULL;[m
[31m-                    dd("part nelts: %d", (int) part->nelts);[m
[31m-                    l->nalloc = part->nelts;[m
[31m-                }[m
[31m-#endif[m
[31m-[m
[31m-            } else {[m
[31m-                l->nalloc--;[m
[31m-                dd("nalloc decreased: %d", (int) l->nalloc);[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (cur->nelts == 0) {[m
[31m-            dd("current part is empty");[m
[31m-            part = &l->part;[m
[31m-            if (part == cur) {[m
[31m-                ngx_http_lua_assert(cur->next != NULL);[m
[31m-[m
[31m-                dd("remove 'cur' from the list by rewriting 'cur': "[m
[31m-                   "l->last: %p, cur: %p, cur->next: %p, part: %p",[m
[31m-                   l->last, cur, cur->next, part);[m
[31m-[m
[31m-                if (l->last == cur->next) {[m
[31m-                    dd("last is cur->next");[m
[31m-                    l->part = *(cur->next);[m
[31m-                    l->last = part;[m
[31m-                    l->nalloc = part->nelts;[m
[31m-[m
[31m-                } else {[m
[31m-                    l->part = *(cur->next);[m
[31m-                }[m
[31m-[m
[31m-            } else {[m
[31m-                dd("remove 'cur' from the list");[m
[31m-                while (part->next != cur) {[m
[31m-                    if (part->next == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                    part = part->next;[m
[31m-                }[m
[31m-[m
[31m-                part->next = cur->next;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (i == cur->nelts - 1) {[m
[31m-        dd("last entry in the part");[m
[31m-[m
[31m-        cur->nelts--;[m
[31m-[m
[31m-        if (cur == l->last) {[m
[31m-            l->nalloc--;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("the middle entry in the part");[m
[31m-[m
[31m-    new = ngx_palloc(l->pool, sizeof(ngx_list_part_t));[m
[31m-    if (new == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    new->elts = &data[i + 1];[m
[31m-    new->nelts = cur->nelts - i - 1;[m
[31m-    new->next = cur->next;[m
[31m-[m
[31m-    cur->nelts = i;[m
[31m-    cur->next = new;[m
[31m-[m
[31m-    if (cur == l->last) {[m
[31m-        l->last = new;[m
[31m-        l->nalloc = new->nelts;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.h[m
[1mdeleted file mode 100644[m
[1mindex 5397471..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_in.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_HEADERS_IN_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_HEADERS_IN_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_set_input_header(ngx_http_request_t *r, ngx_str_t key,[m
[31m-    ngx_str_t value, unsigned override);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_HEADERS_IN_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.c[m
[1mdeleted file mode 100644[m
[1mindex b908eae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.c[m
[1m+++ /dev/null[m
[36m@@ -1,637 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_headers_out.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include <ctype.h>[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value,[m
[31m-    ngx_table_elt_t **output_header, unsigned no_create);[m
[31m-static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_last_modified_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_content_type_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_last_modified_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-static ngx_int_t ngx_http_set_location_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value);[m
[31m-[m
[31m-[m
[31m-static ngx_http_lua_set_header_t  ngx_http_lua_set_handlers[] = {[m
[31m-[m
[31m-    { ngx_string("Server"),[m
[31m-                 offsetof(ngx_http_headers_out_t, server),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Date"),[m
[31m-                 offsetof(ngx_http_headers_out_t, date),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-#if 1[m
[31m-    { ngx_string("Content-Encoding"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_encoding),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("Location"),[m
[31m-                 offsetof(ngx_http_headers_out_t, location),[m
[31m-                 ngx_http_set_location_header },[m
[31m-[m
[31m-    { ngx_string("Refresh"),[m
[31m-                 offsetof(ngx_http_headers_out_t, refresh),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Last-Modified"),[m
[31m-                 offsetof(ngx_http_headers_out_t, last_modified),[m
[31m-                 ngx_http_set_last_modified_header },[m
[31m-[m
[31m-    { ngx_string("Content-Range"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_range),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Accept-Ranges"),[m
[31m-                 offsetof(ngx_http_headers_out_t, accept_ranges),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("WWW-Authenticate"),[m
[31m-                 offsetof(ngx_http_headers_out_t, www_authenticate),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Expires"),[m
[31m-                 offsetof(ngx_http_headers_out_t, expires),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("E-Tag"),[m
[31m-                 offsetof(ngx_http_headers_out_t, etag),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("ETag"),[m
[31m-                 offsetof(ngx_http_headers_out_t, etag),[m
[31m-                 ngx_http_set_builtin_header },[m
[31m-[m
[31m-    { ngx_string("Content-Length"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_length),[m
[31m-                 ngx_http_set_content_length_header },[m
[31m-[m
[31m-    { ngx_string("Content-Type"),[m
[31m-                 offsetof(ngx_http_headers_out_t, content_type),[m
[31m-                 ngx_http_set_content_type_header },[m
[31m-[m
[31m-    { ngx_string("Cache-Control"),[m
[31m-                 offsetof(ngx_http_headers_out_t, cache_control),[m
[31m-                 ngx_http_set_builtin_multi_header },[m
[31m-[m
[31m-    { ngx_null_string, 0, ngx_http_set_header }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* request time implementation */[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_header_helper(ngx_http_request_t *r, ngx_http_lua_header_val_t *hv,[m
[31m-    ngx_str_t *value, ngx_table_elt_t **output_header,[m
[31m-    unsigned no_create)[m
[31m-{[m
[31m-    ngx_table_elt_t             *h;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_uint_t                   i;[m
[31m-    unsigned                     matched = 0;[m
[31m-[m
[31m-    if (hv->no_override) {[m
[31m-        goto new_header;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        /* XXX ngx_http_core_find_config_phase, for example,[m
[31m-         * may not initialize the "key" and "hash" fields[m
[31m-         * for a nasty optimization purpose, and[m
[31m-         * we have to work-around it here */[m
[31m-[m
[31m-        r->headers_out.location->hash = ngx_http_lua_location_hash;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash != 0[m
[31m-            && h[i].key.len == hv->key.len[m
[31m-            && ngx_strncasecmp(hv->key.data, h[i].key.data, h[i].key.len) == 0)[m
[31m-        {[m
[31m-            dd("found out header %.*s", (int) h[i].key.len, h[i].key.data);[m
[31m-[m
[31m-            if (value->len == 0 || matched) {[m
[31m-                dd("clearing normal header for %.*s", (int) hv->key.len,[m
[31m-                   hv->key.data);[m
[31m-[m
[31m-                h[i].value.len = 0;[m
[31m-                h[i].hash = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                dd("setting header to value %.*s", (int) value->len,[m
[31m-                   value->data);[m
[31m-[m
[31m-                h[i].value = *value;[m
[31m-                h[i].hash = hv->hash;[m
[31m-            }[m
[31m-[m
[31m-            if (output_header) {[m
[31m-                *output_header = &h[i];[m
[31m-            }[m
[31m-[m
[31m-            /* return NGX_OK; */[m
[31m-            matched = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (matched){[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (no_create && value->len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-new_header:[m
[31m-[m
[31m-    /* XXX we still need to create header slot even if the value[m
[31m-     * is empty because some builtin headers like Last-Modified[m
[31m-     * relies on this to get cleared */[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_out.headers);[m
[31m-[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        h->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        h->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    if (output_header) {[m
[31m-        *output_header = h;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_location_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-    ngx_table_elt_t  *h;[m
[31m-[m
[31m-    rc = ngx_http_set_builtin_header(r, hv, value);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * we do not set r->headers_out.location here to avoid the handling[m
[31m-     * the local redirects without a host name by ngx_http_header_filter()[m
[31m-     */[m
[31m-[m
[31m-    h = r->headers_out.location;[m
[31m-    if (h && h->value.len && h->value.data[0] == '/') {[m
[31m-        r->headers_out.location = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_table_elt_t  *h, **old;[m
[31m-[m
[31m-    if (hv->offset) {[m
[31m-        old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    } else {[m
[31m-        old = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (old == NULL || *old == NULL) {[m
[31m-        return ngx_http_set_header_helper(r, hv, value, old, 0);[m
[31m-    }[m
[31m-[m
[31m-    h = *old;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        dd("clearing the builtin header");[m
[31m-[m
[31m-        h->hash = 0;[m
[31m-        h->value = *value;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    h->hash = hv->hash;[m
[31m-    h->key = hv->key;[m
[31m-    h->value = *value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_builtin_multi_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_array_t      *pa;[m
[31m-    ngx_table_elt_t  *ho, **ph;[m
[31m-    ngx_uint_t        i;[m
[31m-[m
[31m-    pa = (ngx_array_t *) ((char *) &r->headers_out + hv->offset);[m
[31m-[m
[31m-    if (pa->elts == NULL) {[m
[31m-        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (hv->no_override) {[m
[31m-        ph = pa->elts;[m
[31m-        for (i = 0; i < pa->nelts; i++) {[m
[31m-            if (!ph[i]->hash) {[m
[31m-                ph[i]->value = *value;[m
[31m-                ph[i]->hash = hv->hash;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        goto create;[m
[31m-    }[m
[31m-[m
[31m-    /* override old values (if any) */[m
[31m-[m
[31m-    if (pa->nelts > 0) {[m
[31m-        ph = pa->elts;[m
[31m-        for (i = 1; i < pa->nelts; i++) {[m
[31m-            ph[i]->hash = 0;[m
[31m-            ph[i]->value.len = 0;[m
[31m-        }[m
[31m-[m
[31m-        ph[0]->value = *value;[m
[31m-[m
[31m-        if (value->len == 0) {[m
[31m-            ph[0]->hash = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            ph[0]->hash = hv->hash;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-create:[m
[31m-[m
[31m-    ph = ngx_array_push(pa);[m
[31m-    if (ph == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho = ngx_list_push(&r->headers_out.headers);[m
[31m-    if (ho == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ho->value = *value;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        ho->hash = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ho->hash = hv->hash;[m
[31m-    }[m
[31m-[m
[31m-    ho->key = hv->key;[m
[31m-    *ph = ho;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_type_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_uint_t          i;[m
[31m-[m
[31m-    r->headers_out.content_type_len = value->len;[m
[31m-[m
[31m-#if 1[m
[31m-    for (i = 0; i < value->len; i++) {[m
[31m-        if (value->data[i] == ';') {[m
[31m-            r->headers_out.content_type_len = i;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->headers_out.content_type = *value;[m
[31m-    r->headers_out.content_type_hash = hv->hash;[m
[31m-    r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-    value->len = 0;[m
[31m-[m
[31m-    return ngx_http_set_header_helper(r, hv, value, NULL, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_set_last_modified_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_last_modified_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.last_modified_time = ngx_http_parse_time(value->data,[m
[31m-                                                            value->len);[m
[31m-[m
[31m-    dd("last modified time: %d", (int) r->headers_out.last_modified_time);[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_last_modified_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_out.last_modified_time = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_set_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    off_t           len;[m
[31m-[m
[31m-    if (value->len == 0) {[m
[31m-        return ngx_http_clear_content_length_header(r, hv, value);[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_atosz(value->data, value->len);[m
[31m-    if (len == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.content_length_n = len;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_content_length_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    r->headers_out.content_length_n = -1;[m
[31m-[m
[31m-    return ngx_http_clear_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_clear_builtin_header(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_header_val_t *hv, ngx_str_t *value)[m
[31m-{[m
[31m-    value->len = 0;[m
[31m-[m
[31m-    return ngx_http_set_builtin_header(r, hv, value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_str_t key,[m
[31m-    ngx_str_t value, unsigned override)[m
[31m-{[m
[31m-    ngx_http_lua_header_val_t         hv;[m
[31m-    ngx_http_lua_set_header_t        *handlers = ngx_http_lua_set_handlers;[m
[31m-    ngx_uint_t                        i;[m
[31m-[m
[31m-    dd("set header value: %.*s", (int) value.len, value.data);[m
[31m-[m
[31m-    hv.hash = ngx_hash_key_lc(key.data, key.len);[m
[31m-    hv.key = key;[m
[31m-[m
[31m-    hv.offset = 0;[m
[31m-    hv.no_override = !override;[m
[31m-    hv.handler = NULL;[m
[31m-[m
[31m-    for (i = 0; handlers[i].name.len; i++) {[m
[31m-        if (hv.key.len != handlers[i].name.len[m
[31m-            || ngx_strncasecmp(hv.key.data, handlers[i].name.data,[m
[31m-                               handlers[i].name.len) != 0)[m
[31m-        {[m
[31m-            dd("hv key comparison: %s <> %s", handlers[i].name.data,[m
[31m-               hv.key.data);[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("Matched handler: %s %s", handlers[i].name.data, hv.key.data);[m
[31m-[m
[31m-        hv.offset = handlers[i].offset;[m
[31m-        hv.handler = handlers[i].handler;[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (handlers[i].name.len == 0 && handlers[i].handler) {[m
[31m-        hv.offset = handlers[i].offset;[m
[31m-        hv.handler = handlers[i].handler;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (hv.handler == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return hv.handler(r, &hv, &value);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_get_output_header(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_str_t *key)[m
[31m-{[m
[31m-    ngx_table_elt_t            *h;[m
[31m-    ngx_list_part_t            *part;[m
[31m-    ngx_uint_t                  i;[m
[31m-    unsigned                    found;[m
[31m-[m
[31m-    dd("looking for response header \"%.*s\"", (int) key->len, key->data);[m
[31m-[m
[31m-    switch (key->len) {[m
[31m-    case 14:[m
[31m-        if (r->headers_out.content_length == NULL[m
[31m-            && r->headers_out.content_length_n >= 0[m
[31m-            && ngx_strncasecmp(key->data, (u_char *) "Content-Length", 14) == 0)[m
[31m-        {[m
[31m-            lua_pushinteger(L, (lua_Integer) r->headers_out.content_length_n);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case 12:[m
[31m-        if (r->headers_out.content_type.len[m
[31m-            && ngx_strncasecmp(key->data, (u_char *) "Content-Type", 12) == 0)[m
[31m-        {[m
[31m-            lua_pushlstring(L, (char *) r->headers_out.content_type.data,[m
[31m-                            r->headers_out.content_type.len);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    dd("not a built-in output header");[m
[31m-[m
[31m-    found = 0;[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->headers_out.location[m
[31m-        && r->headers_out.location->value.len[m
[31m-        && r->headers_out.location->value.data[0] == '/')[m
[31m-    {[m
[31m-        /* XXX ngx_http_core_find_config_phase, for example,[m
[31m-         * may not initialize the "key" and "hash" fields[m
[31m-         * for a nasty optimization purpose, and[m
[31m-         * we have to work-around it here */[m
[31m-[m
[31m-        r->headers_out.location->hash = ngx_http_lua_location_hash;[m
[31m-        ngx_str_set(&r->headers_out.location->key, "Location");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    part = &r->headers_out.headers.part;[m
[31m-    h = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            h = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash == 0) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (h[i].hash != 0[m
[31m-            && h[i].key.len == key->len[m
[31m-            && ngx_strncasecmp(key->data, h[i].key.data, h[i].key.len) == 0)[m
[31m-         {[m
[31m-             if (!found) {[m
[31m-                 found = 1;[m
[31m-[m
[31m-                 lua_pushlstring(L, (char *) h[i].value.data, h[i].value.len);[m
[31m-                 continue;[m
[31m-             }[m
[31m-[m
[31m-             if (found == 1) {[m
[31m-                 lua_createtable(L, 4 /* narr */, 0);[m
[31m-                 lua_insert(L, -2);[m
[31m-                 lua_rawseti(L, -2, found);[m
[31m-             }[m
[31m-[m
[31m-             found++;[m
[31m-[m
[31m-             lua_pushlstring(L, (char *) h[i].value.data, h[i].value.len);[m
[31m-             lua_rawseti(L, -2, found);[m
[31m-         }[m
[31m-    }[m
[31m-[m
[31m-    if (found) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.h[m
[1mdeleted file mode 100644[m
[1mindex ef5e6d4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_headers_out.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_HEADERS_OUT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_HEADERS_OUT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_str_t key,[m
[31m-    ngx_str_t value, unsigned override);[m
[31m-int ngx_http_lua_get_output_header(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_str_t *key);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_HEADERS_OUT_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initby.c[m
[1mdeleted file mode 100644[m
[1mindex e8941da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initby.c[m
[1m+++ /dev/null[m
[36m@@ -1,42 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-#include "ngx_http_lua_initby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_by_inline(ngx_log_t *log, ngx_http_lua_main_conf_t *lmcf,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    int         status;[m
[31m-[m
[31m-    status = luaL_loadbuffer(L, (char *) lmcf->init_src.data,[m
[31m-                             lmcf->init_src.len, "=init_by_lua")[m
[31m-             || ngx_http_lua_do_call(log, L);[m
[31m-[m
[31m-    return ngx_http_lua_report(log, L, status, "init_by_lua");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_by_file(ngx_log_t *log, ngx_http_lua_main_conf_t *lmcf,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    int         status;[m
[31m-[m
[31m-    status = luaL_loadfile(L, (char *) lmcf->init_src.data)[m
[31m-             || ngx_http_lua_do_call(log, L);[m
[31m-[m
[31m-    return ngx_http_lua_report(log, L, status, "init_by_lua_file");[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initby.h[m
[1mdeleted file mode 100644[m
[1mindex 67ac0b6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initby.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_INITBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_INITBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_by_inline(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_by_file(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_INITBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.c[m
[1mdeleted file mode 100644[m
[1mindex 6754b4b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.c[m
[1m+++ /dev/null[m
[36m@@ -1,334 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_initworkerby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static u_char *ngx_http_lua_log_init_worker_error(ngx_log_t *log,[m
[31m-    u_char *buf, size_t len);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_worker(ngx_cycle_t *cycle)[m
[31m-{[m
[31m-    char                        *rv;[m
[31m-    void                        *cur, *prev;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_conf_t                   conf;[m
[31m-    ngx_cycle_t                 *fake_cycle;[m
[31m-    ngx_module_t               **modules;[m
[31m-    ngx_open_file_t             *file, *ofile;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_connection_t            *c = NULL;[m
[31m-    ngx_http_module_t           *module;[m
[31m-    ngx_http_request_t          *r = NULL;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_conf_ctx_t         *conf_ctx, http_ctx;[m
[31m-    ngx_http_lua_loc_conf_t     *top_llcf;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_core_loc_conf_t    *clcf, *top_clcf;[m
[31m-[m
[31m-    lmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_lua_module);[m
[31m-[m
[31m-    if (lmcf == NULL[m
[31m-        || lmcf->init_worker_handler == NULL[m
[31m-        || lmcf->lua == NULL)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    conf_ctx = (ngx_http_conf_ctx_t *) cycle->conf_ctx[ngx_http_module.index];[m
[31m-    http_ctx.main_conf = conf_ctx->main_conf;[m
[31m-[m
[31m-    top_clcf = conf_ctx->loc_conf[ngx_http_core_module.ctx_index];[m
[31m-    top_llcf = conf_ctx->loc_conf[ngx_http_lua_module.ctx_index];[m
[31m-[m
[31m-    ngx_memzero(&conf, sizeof(ngx_conf_t));[m
[31m-[m
[31m-    conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, cycle->log);[m
[31m-    if (conf.temp_pool == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    conf.temp_pool->log = cycle->log;[m
[31m-[m
[31m-    /* we fake a temporary ngx_cycle_t here because some[m
[31m-     * modules' merge conf handler may produce side effects in[m
[31m-     * cf->cycle (like ngx_proxy vs cf->cycle->paths).[m
[31m-     * also, we cannot allocate our temp cycle on the stack[m
[31m-     * because some modules like ngx_http_core_module reference[m
[31m-     * addresses within cf->cycle (i.e., via "&cf->cycle->new_log")[m
[31m-     */[m
[31m-[m
[31m-    fake_cycle = ngx_palloc(cycle->pool, sizeof(ngx_cycle_t));[m
[31m-    if (fake_cycle == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(fake_cycle, cycle, sizeof(ngx_cycle_t));[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 9007[m
[31m-[m
[31m-    ngx_queue_init(&fake_cycle->reusable_connections_queue);[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (ngx_array_init(&fake_cycle->listening, cycle->pool,[m
[31m-                       cycle->listening.nelts || 1,[m
[31m-                       sizeof(ngx_listening_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003007[m
[31m-[m
[31m-    if (ngx_array_init(&fake_cycle->paths, cycle->pool, cycle->paths.nelts || 1,[m
[31m-                       sizeof(ngx_path_t *))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    part = &cycle->open_files.part;[m
[31m-    ofile = part->elts;[m
[31m-[m
[31m-    if (ngx_list_init(&fake_cycle->open_files, cycle->pool, part->nelts || 1,[m
[31m-                      sizeof(ngx_open_file_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-            part = part->next;[m
[31m-            ofile = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        file = ngx_list_push(&fake_cycle->open_files);[m
[31m-        if (file == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(file, ofile, sizeof(ngx_open_file_t));[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&fake_cycle->shared_memory, cycle->pool, 1,[m
[31m-                      sizeof(ngx_shm_zone_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    conf.ctx = &http_ctx;[m
[31m-    conf.cycle = fake_cycle;[m
[31m-    conf.pool = fake_cycle->pool;[m
[31m-    conf.log = cycle->log;[m
[31m-[m
[31m-    http_ctx.loc_conf = ngx_pcalloc(conf.pool,[m
[31m-                                    sizeof(void *) * ngx_http_max_module);[m
[31m-    if (http_ctx.loc_conf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    http_ctx.srv_conf = ngx_pcalloc(conf.pool,[m
[31m-                                    sizeof(void *) * ngx_http_max_module);[m
[31m-    if (http_ctx.srv_conf == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009011[m
[31m-    modules = cycle->modules;[m
[31m-#else[m
[31m-    modules = ngx_modules;[m
[31m-#endif[m
[31m-[m
[31m-    for (i = 0; modules[i]; i++) {[m
[31m-        if (modules[i]->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        module = modules[i]->ctx;[m
[31m-[m
[31m-        if (module->create_srv_conf) {[m
[31m-            cur = module->create_srv_conf(&conf);[m
[31m-            if (cur == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            http_ctx.srv_conf[modules[i]->ctx_index] = cur;[m
[31m-[m
[31m-            if (module->merge_srv_conf) {[m
[31m-                prev = module->create_srv_conf(&conf);[m
[31m-                if (prev == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                rv = module->merge_srv_conf(&conf, prev, cur);[m
[31m-                if (rv != NGX_CONF_OK) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (module->create_loc_conf) {[m
[31m-            cur = module->create_loc_conf(&conf);[m
[31m-            if (cur == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            http_ctx.loc_conf[modules[i]->ctx_index] = cur;[m
[31m-[m
[31m-            if (module->merge_loc_conf) {[m
[31m-                if (modules[i] == &ngx_http_lua_module) {[m
[31m-                    prev = top_llcf;[m
[31m-[m
[31m-                } else if (modules[i] == &ngx_http_core_module) {[m
[31m-                    prev = top_clcf;[m
[31m-[m
[31m-                } else {[m
[31m-                    prev = module->create_loc_conf(&conf);[m
[31m-                    if (prev == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                rv = module->merge_loc_conf(&conf, prev, cur);[m
[31m-                if (rv != NGX_CONF_OK) {[m
[31m-                    goto failed;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(conf.temp_pool);[m
[31m-    conf.temp_pool = NULL;[m
[31m-[m
[31m-    c = ngx_http_lua_create_fake_connection(NULL);[m
[31m-    if (c == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c->log->handler = ngx_http_lua_log_init_worker_error;[m
[31m-[m
[31m-    r = ngx_http_lua_create_fake_request(c);[m
[31m-    if (r == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    r->main_conf = http_ctx.main_conf;[m
[31m-    r->srv_conf = http_ctx.srv_conf;[m
[31m-    r->loc_conf = http_ctx.loc_conf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003014[m
[31m-[m
[31m-#   if nginx_version >= 1009000[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-    ngx_http_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    c->log->file = clcf->error_log->file;[m
[31m-[m
[31m-    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {[m
[31m-        c->log->log_level = clcf->error_log->log_level;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_http_lua_create_ctx(r);[m
[31m-    if (ctx == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_INIT_WORKER;[m
[31m-    ctx->cur_co_ctx = NULL;[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    ngx_http_lua_set_req(lmcf->lua, r);[m
[31m-[m
[31m-    (void) lmcf->init_worker_handler(cycle->log, lmcf, lmcf->lua);[m
[31m-[m
[31m-    ngx_destroy_pool(c->pool);[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (conf.temp_pool) {[m
[31m-        ngx_destroy_pool(conf.temp_pool);[m
[31m-    }[m
[31m-[m
[31m-    if (c) {[m
[31m-        ngx_http_lua_close_fake_connection(c);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_worker_by_inline(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L)[m
[31m-{[m
[31m-    int         status;[m
[31m-[m
[31m-    status = luaL_loadbuffer(L, (char *) lmcf->init_worker_src.data,[m
[31m-                             lmcf->init_worker_src.len, "=init_worker_by_lua")[m
[31m-             || ngx_http_lua_do_call(log, L);[m
[31m-[m
[31m-    return ngx_http_lua_report(log, L, status, "init_worker_by_lua");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_init_worker_by_file(ngx_log_t *log, ngx_http_lua_main_conf_t *lmcf,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    int         status;[m
[31m-[m
[31m-    status = luaL_loadfile(L, (char *) lmcf->init_worker_src.data)[m
[31m-             || ngx_http_lua_do_call(log, L);[m
[31m-[m
[31m-    return ngx_http_lua_report(log, L, status, "init_worker_by_lua_file");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_log_init_worker_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_snprintf(buf, len, ", context: init_worker_by_lua*");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.h[m
[1mdeleted file mode 100644[m
[1mindex 40b2db0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_initworkerby.h[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_INITWORKERBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_INITWORKERBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_worker_by_inline(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_worker_by_file(ngx_log_t *log,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_init_worker(ngx_cycle_t *cycle);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_INITWORKERBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_lex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_lex.c[m
[1mdeleted file mode 100644[m
[1mindex 45cf754..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_lex.c[m
[1m+++ /dev/null[m
[36m@@ -1,8251 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- *[m
[31m- * WARNING: DO NOT EVER EDIT THIS FILE!![m
[31m- *[m
[31m- * This file was automatically generated by the re.pl script of sregex's[m
[31m- * "dfa-multi-re" git branch.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_lex.h"[m
[31m-#include <stdlib.h>[m
[31m-#include <stdint.h>[m
[31m-#include <stdio.h>[m
[31m-#include <ctype.h>[m
[31m-#include <errno.h>[m
[31m-#include <string.h>[m
[31m-[m
[31m-[m
[31m-#if __GNUC__ > 3[m
[31m-#    define likely(x)       __builtin_expect((x),1)[m
[31m-#    define unlikely(x)     __builtin_expect((x),0)[m
[31m-#else[m
[31m-#    define likely(x)      (x)[m
[31m-#    define unlikely(x)    (x)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef u_char[m
[31m-#define u_char          unsigned char[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NO_MATCH = -1,[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * ngx_http_lua_lex: the "ovec" array should be allocated by the caller with at[m
[31m- * least 2 elements.[m
[31m- */[m
[31m-int[m
[31m-ngx_http_lua_lex(const u_char *const s, size_t len, int *const ovec)[m
[31m-{[m
[31m-    unsigned i = 0;[m
[31m-    int matched_0 = -1;[m
[31m-    int matched_1 = -1;[m
[31m-    int matched_id = NO_MATCH;  /* (pending) matched regex ID */[m
[31m-    int c;[m
[31m-    int caps0_0 = -1;[m
[31m-    int caps0_10 = -1;[m
[31m-    int caps0_12 = -1;[m
[31m-    int caps0_14 = -1;[m
[31m-    int caps0_2 = -1;[m
[31m-    int caps0_4 = -1;[m
[31m-    int caps0_6 = -1;[m
[31m-    int caps0_8 = -1;[m
[31m-    int caps1_0 = -1;[m
[31m-    int caps1_10 = -1;[m
[31m-    int caps1_12 = -1;[m
[31m-    int caps1_14 = -1;[m
[31m-    int caps1_2 = -1;[m
[31m-    int caps1_4 = -1;[m
[31m-    int caps1_6 = -1;[m
[31m-    int caps1_8 = -1;[m
[31m-    int caps2_0 = -1;[m
[31m-    int caps2_10 = -1;[m
[31m-    int caps2_2 = -1;[m
[31m-    int caps2_4 = -1;[m
[31m-    int caps2_6 = -1;[m
[31m-    int caps2_8 = -1;[m
[31m-    int caps3_10 = -1;[m
[31m-[m
[31m-    {  /* DFA node {0} 0 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st0_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* transfer caps from row 0 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st0_error;[m
[31m-[m
[31m-st1: {  /* DFA node {1} 1 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st1_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* transfer caps from row 0 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 0 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st1_error;[m
[31m-[m
[31m-st2: {  /* DFA node {59,1} 2 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st2_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st2_error;[m
[31m-[m
[31m-st3: {  /* DFA node {72,1} 3 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st3_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st3_error;[m
[31m-[m
[31m-st4: {  /* DFA node {30,50,1} 4 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st4_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st27;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st4_error;[m
[31m-[m
[31m-st5: {  /* DFA node {21,1} 5 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st5_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st28;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st29;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 1 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st5_error;[m
[31m-[m
[31m-st6: {  /* DFA node {41,1} 6 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st6_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st30;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st31;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 1 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st6_error;[m
[31m-[m
[31m-st7: {  /* DFA node {11,1} 7 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st8: {  /* DFA node {16,1} 8 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st9: {  /* DFA node {65,1} 9 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st9_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st9_error;[m
[31m-[m
[31m-st10: {  /* DFA node {67,59,1} 10 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st11: {  /* DFA node {65,72,1} 11 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st11_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st11_error;[m
[31m-[m
[31m-st12: {  /* DFA node {65,30,50,1} 12 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st12_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* transfer caps from row 3 to row 5 */[m
[31m-        /* capture stores */[m
[31m-        goto st44;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st12_error;[m
[31m-[m
[31m-st13: {  /* DFA node {65,21,1} 13 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st13_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st45;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st46;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st13_error;[m
[31m-[m
[31m-st14: {  /* DFA node {62,1} 14 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st14_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st48;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st49;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st50;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st51;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st52;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st53;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st54;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st47;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st14_error;[m
[31m-[m
[31m-st15: {  /* DFA node {65,41,1} 15 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st15_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st55;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st56;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st15_error;[m
[31m-[m
[31m-st16: {  /* DFA node {65,11,1} 16 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st17: {  /* DFA node {65,16,1} 17 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st18: {  /* DFA node {78,1} 18 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st18_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st18_error;[m
[31m-[m
[31m-st19: {  /* DFA node {78,59,1} 19 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st19_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st19_error;[m
[31m-[m
[31m-st20: {  /* DFA node {80,72,1} 20 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st21: {  /* DFA node {78,30,50,1} 21 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st21_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* transfer caps from row 3 to row 5 */[m
[31m-        /* capture stores */[m
[31m-        goto st70;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st21_error;[m
[31m-[m
[31m-st22: {  /* DFA node {78,21,1} 22 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st22_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st71;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st72;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st22_error;[m
[31m-[m
[31m-st23: {  /* DFA node {75,1} 23 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st23_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st74;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st75;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st76;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st77;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st78;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st79;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st80;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st73;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st23_error;[m
[31m-[m
[31m-st24: {  /* DFA node {78,41,1} 24 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st24_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st81;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st82;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st24_error;[m
[31m-[m
[31m-st25: {  /* DFA node {78,11,1} 25 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st26: {  /* DFA node {78,16,1} 26 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st27: {  /* DFA node {31,51,30,50,1} 27 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 91) {[m
[31m-            goto st88;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 90)[m
[31m-            || (c >= 92 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 1 to row 0 */[m
[31m-            caps0_10 = caps1_10;[m
[31m-            goto st87;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st28: {  /* DFA node {23,1} 28 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st28_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st28;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st29;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_8 = i - 1;[m
[31m-        goto st6;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 1 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st28_error;[m
[31m-[m
[31m-st29: {  /* DFA node {25,21,1} 29 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st30: {  /* DFA node {43,1} 30 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st30_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_12 = i - 1;[m
[31m-        goto st2;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_14 = i - 1;[m
[31m-        goto st3;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps0_6 = i - 1;[m
[31m-        caps1_10 = i - 1;[m
[31m-        goto st4;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st30;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_4 = i - 1;[m
[31m-        goto st5;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st31;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_0 = i - 1;[m
[31m-        goto st7;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        /* capture stores */[m
[31m-        caps0_2 = i - 1;[m
[31m-        goto st8;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 1 to row 0 */[m
[31m-    goto st1;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st30_error;[m
[31m-[m
[31m-st31: {  /* DFA node {45,41,1} 31 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st35: {  /* DFA node {65,78,1} 35 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st35_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st35_error;[m
[31m-[m
[31m-st36: {  /* DFA node {67,78,59,1} 36 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st37: {  /* DFA node {65,80,72,1} 37 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st38: {  /* DFA node {65,78,30,50,1} 38 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st38_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 4 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 4 to row 5 */[m
[31m-        /* transfer caps from row 4 to row 6 */[m
[31m-        /* capture stores */[m
[31m-        goto st91;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 4 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st38_error;[m
[31m-[m
[31m-st39: {  /* DFA node {65,78,21,1} 39 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st39_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st92;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st93;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st39_error;[m
[31m-[m
[31m-st40: {  /* DFA node {62,75,1} 40 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st40_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st95;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st96;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st97;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st98;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st99;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st100;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st101;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st94;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st40_error;[m
[31m-[m
[31m-st41: {  /* DFA node {65,78,41,1} 41 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st41_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st102;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st103;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st41_error;[m
[31m-[m
[31m-st42: {  /* DFA node {65,78,11,1} 42 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st43: {  /* DFA node {65,78,16,1} 43 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st44: {  /* DFA node {65,31,51,30,50,1} 44 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st110;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st45: {  /* DFA node {65,23,1} 45 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st45_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st45;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st46;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st45_error;[m
[31m-[m
[31m-st46: {  /* DFA node {65,25,21,1} 46 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st47: {  /* DFA node {63,1} 47 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st47_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st47_error;[m
[31m-[m
[31m-st48: {  /* DFA node {63,59,1} 48 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st48_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st48_error;[m
[31m-[m
[31m-st49: {  /* DFA node {63,72,1} 49 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st49_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st49_error;[m
[31m-[m
[31m-st50: {  /* DFA node {63,30,50,1} 50 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st50_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* transfer caps from row 3 to row 5 */[m
[31m-        /* capture stores */[m
[31m-        goto st44;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st50_error;[m
[31m-[m
[31m-st51: {  /* DFA node {63,21,1} 51 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st51_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st45;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st46;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st15;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st51_error;[m
[31m-[m
[31m-st52: {  /* DFA node {63,41,1} 52 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st52_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st55;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st56;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st52_error;[m
[31m-[m
[31m-st53: {  /* DFA node {63,11,1} 53 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st54: {  /* DFA node {63,16,1} 54 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st55: {  /* DFA node {65,43,1} 55 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st55_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st10;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st11;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st12;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st55;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st13;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st14;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st56;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st16;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st17;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st9;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st55_error;[m
[31m-[m
[31m-st56: {  /* DFA node {65,45,41,1} 56 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st57: {  /* DFA node {65} 57 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st57_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st58;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st59;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st57;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st57_error;[m
[31m-[m
[31m-st58: {  /* DFA node {67} 58 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st59: {  /* DFA node {62} 59 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st59_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-        goto st112;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st59_error;[m
[31m-[m
[31m-st60: {  /* DFA node {78,65,1} 60 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st60_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st60_error;[m
[31m-[m
[31m-st61: {  /* DFA node {78,67,59,1} 61 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st62: {  /* DFA node {80,65,72,1} 62 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st63: {  /* DFA node {78,65,30,50,1} 63 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st63_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 4 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 4 to row 5 */[m
[31m-        /* transfer caps from row 4 to row 6 */[m
[31m-        /* capture stores */[m
[31m-        goto st113;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 4 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st63_error;[m
[31m-[m
[31m-st64: {  /* DFA node {78,65,21,1} 64 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st64_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st114;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st115;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st64_error;[m
[31m-[m
[31m-st65: {  /* DFA node {75,62,1} 65 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st65_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st117;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st118;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st119;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st120;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st121;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st122;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st123;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c == 92)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st116;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st65_error;[m
[31m-[m
[31m-st66: {  /* DFA node {78,65,41,1} 66 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st66_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st124;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st125;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st66_error;[m
[31m-[m
[31m-st67: {  /* DFA node {78,65,11,1} 67 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st68: {  /* DFA node {78,65,16,1} 68 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st70: {  /* DFA node {78,31,51,30,50,1} 70 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st132;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st71: {  /* DFA node {78,23,1} 71 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st71_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st71;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st72;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st71_error;[m
[31m-[m
[31m-st72: {  /* DFA node {78,25,21,1} 72 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st73: {  /* DFA node {76,1} 73 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st73_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 1 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* transfer caps from row 1 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 1 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st73_error;[m
[31m-[m
[31m-st74: {  /* DFA node {76,59,1} 74 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st74_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st74_error;[m
[31m-[m
[31m-st75: {  /* DFA node {76,72,1} 75 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st75_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st75_error;[m
[31m-[m
[31m-st76: {  /* DFA node {76,30,50,1} 76 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st76_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* transfer caps from row 3 to row 5 */[m
[31m-        /* capture stores */[m
[31m-        goto st70;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 1 */[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st76_error;[m
[31m-[m
[31m-st77: {  /* DFA node {76,21,1} 77 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st77_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st71;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st72;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_8 = i - 1;[m
[31m-        goto st24;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st77_error;[m
[31m-[m
[31m-st78: {  /* DFA node {76,41,1} 78 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st78_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st81;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st82;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st78_error;[m
[31m-[m
[31m-st79: {  /* DFA node {76,11,1} 79 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st80: {  /* DFA node {76,16,1} 80 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st81: {  /* DFA node {78,43,1} 81 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st81_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_12 = i - 1;[m
[31m-        goto st19;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_14 = i - 1;[m
[31m-        goto st20;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps1_6 = i - 1;[m
[31m-        caps2_10 = i - 1;[m
[31m-        goto st21;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st81;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_4 = i - 1;[m
[31m-        goto st22;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        goto st23;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st82;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_0 = i - 1;[m
[31m-        goto st25;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 1 */[m
[31m-        /* capture stores */[m
[31m-        caps1_2 = i - 1;[m
[31m-        goto st26;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 2 to row 1 */[m
[31m-    goto st18;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st81_error;[m
[31m-[m
[31m-st82: {  /* DFA node {78,45,41,1} 82 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st83: {  /* DFA node {78} 83 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st83_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 39: {[m
[31m-        goto st84;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st85;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st83;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st83_error;[m
[31m-[m
[31m-st84: {  /* DFA node {80} 84 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st85: {  /* DFA node {75} 85 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st85_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-        goto st134;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st85_error;[m
[31m-[m
[31m-st87: {  /* DFA node {53} 87 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st87;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st88: {  /* DFA node {32,53} 88 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 61) {[m
[31m-            goto st135;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st136;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 92 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 1 to row 0 */[m
[31m-            caps0_10 = caps1_10;[m
[31m-            goto st87;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st91: {  /* DFA node {65,78,31,51,30,50,1} 91 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st140;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st92: {  /* DFA node {65,78,23,1} 92 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st92_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st92;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st93;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st92_error;[m
[31m-[m
[31m-st93: {  /* DFA node {65,78,25,21,1} 93 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st94: {  /* DFA node {63,76,1} 94 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st94_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st94_error;[m
[31m-[m
[31m-st95: {  /* DFA node {63,76,59,1} 95 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st95_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st95_error;[m
[31m-[m
[31m-st96: {  /* DFA node {63,76,72,1} 96 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st96_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st96_error;[m
[31m-[m
[31m-st97: {  /* DFA node {63,76,30,50,1} 97 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st97_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 4 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 4 to row 5 */[m
[31m-        /* transfer caps from row 4 to row 6 */[m
[31m-        /* capture stores */[m
[31m-        goto st91;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 4 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st97_error;[m
[31m-[m
[31m-st98: {  /* DFA node {63,76,21,1} 98 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st98_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st92;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st93;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st41;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st98_error;[m
[31m-[m
[31m-st99: {  /* DFA node {63,76,41,1} 99 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st99_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st102;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st103;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st99_error;[m
[31m-[m
[31m-st100: {  /* DFA node {63,76,11,1} 100 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st101: {  /* DFA node {63,76,16,1} 101 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st102: {  /* DFA node {65,78,43,1} 102 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st102_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st36;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st37;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st38;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st102;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st39;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st40;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st103;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st42;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st43;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st35;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st102_error;[m
[31m-[m
[31m-st103: {  /* DFA node {65,78,45,41,1} 103 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st104: {  /* DFA node {65,78} 104 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st104_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st105;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        goto st106;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st107;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st104;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st104_error;[m
[31m-[m
[31m-st105: {  /* DFA node {67,78} 105 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st106: {  /* DFA node {65,80} 106 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st107: {  /* DFA node {62,75} 107 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st107_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-        goto st142;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st107_error;[m
[31m-[m
[31m-st108: {  /* DFA node {65,53} 108 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st109: {  /* DFA node {67,53} 109 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st110: {  /* DFA node {65,32,53} 110 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st143;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st144;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st111: {  /* DFA node {62,53} 111 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st145;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st112: {  /* DFA node {63} 112 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st112_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st58;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st59;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st57;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st112_error;[m
[31m-[m
[31m-st113: {  /* DFA node {78,65,31,51,30,50,1} 113 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st149;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st114: {  /* DFA node {78,65,23,1} 114 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st114_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st114;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st115;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st114_error;[m
[31m-[m
[31m-st115: {  /* DFA node {78,65,25,21,1} 115 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_4;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 2;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st116: {  /* DFA node {76,63,1} 116 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st116_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 2 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* transfer caps from row 2 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 2 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st116_error;[m
[31m-[m
[31m-st117: {  /* DFA node {76,63,59,1} 117 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st117_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st117_error;[m
[31m-[m
[31m-st118: {  /* DFA node {76,63,72,1} 118 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st118_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st118_error;[m
[31m-[m
[31m-st119: {  /* DFA node {76,63,30,50,1} 119 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st119_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 4 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 4 to row 5 */[m
[31m-        /* transfer caps from row 4 to row 6 */[m
[31m-        /* capture stores */[m
[31m-        goto st113;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 4 to row 2 */[m
[31m-        /* transfer caps from row 4 to row 3 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 4 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st119_error;[m
[31m-[m
[31m-st120: {  /* DFA node {76,63,21,1} 120 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st120_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st114;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st115;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_8 = i - 1;[m
[31m-        goto st66;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st120_error;[m
[31m-[m
[31m-st121: {  /* DFA node {76,63,41,1} 121 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st121_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st124;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st125;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st121_error;[m
[31m-[m
[31m-st122: {  /* DFA node {76,63,11,1} 122 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_0;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 0;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st123: {  /* DFA node {76,63,16,1} 123 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_2;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 1;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st124: {  /* DFA node {78,65,43,1} 124 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st124_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 10: {[m
[31m-        /* transfer caps from row 3 to row 0 */[m
[31m-        goto st1;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 34: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st61;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        goto st62;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 45: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        caps2_6 = i - 1;[m
[31m-        caps3_10 = i - 1;[m
[31m-        goto st63;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 61: {[m
[31m-        goto st124;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 91: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_4 = i - 1;[m
[31m-        goto st64;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        goto st65;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 93: {[m
[31m-        /* transfer caps from row 3 to row 4 */[m
[31m-        /* capture stores */[m
[31m-        goto st125;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 123: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_0 = i - 1;[m
[31m-        goto st67;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 125: {[m
[31m-        /* transfer caps from row 3 to row 2 */[m
[31m-        /* capture stores */[m
[31m-        caps2_2 = i - 1;[m
[31m-        goto st68;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    /* (c >= 0 && c <= 9)[m
[31m-     * || (c >= 11 && c <= 33)[m
[31m-     * || (c >= 35 && c <= 38)[m
[31m-     * || (c >= 40 && c <= 44)[m
[31m-     * || (c >= 46 && c <= 60)[m
[31m-     * || (c >= 62 && c <= 90)[m
[31m-     * || (c >= 94 && c <= 122)[m
[31m-     * || (c == 124)[m
[31m-     * || (c >= 126 && c <= 255)[m
[31m-     */[m
[31m-    /* transfer caps from row 3 to row 2 */[m
[31m-    goto st60;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st124_error;[m
[31m-[m
[31m-st125: {  /* DFA node {78,65,45,41,1} 125 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_8;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 4;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st126: {  /* DFA node {78,65} 126 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st126_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st127;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        goto st128;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st129;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st126;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st126_error;[m
[31m-[m
[31m-st127: {  /* DFA node {78,67} 127 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st128: {  /* DFA node {80,65} 128 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st129: {  /* DFA node {75,62} 129 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st129_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-        goto st151;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st129_error;[m
[31m-[m
[31m-st130: {  /* DFA node {78,53} 130 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st131: {  /* DFA node {80,53} 131 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st132: {  /* DFA node {78,32,53} 132 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st152;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st153;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st133: {  /* DFA node {75,53} 133 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st154;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st134: {  /* DFA node {76} 134 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st134_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 39: {[m
[31m-        goto st84;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st85;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st83;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st134_error;[m
[31m-[m
[31m-st135: {  /* DFA node {34,53} 135 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 61) {[m
[31m-            goto st135;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st136;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 92 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 1 to row 0 */[m
[31m-            caps0_10 = caps1_10;[m
[31m-            goto st87;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st136: {  /* DFA node {36,53} 136 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st137: {  /* DFA node {65,78,53} 137 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st138: {  /* DFA node {67,78,53} 138 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st139: {  /* DFA node {65,80,53} 139 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st140: {  /* DFA node {65,78,32,53} 140 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st156;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st157;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st141: {  /* DFA node {62,75,53} 141 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st158;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st142: {  /* DFA node {63,76} 142 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st142_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st105;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        goto st106;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st107;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st104;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st142_error;[m
[31m-[m
[31m-st143: {  /* DFA node {65,34,53} 143 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st143;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st144;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st144: {  /* DFA node {65,36,53} 144 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st58;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st59;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st57;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st145: {  /* DFA node {63,53} 145 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st109;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st111;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st108;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st146: {  /* DFA node {78,65,53} 146 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st147: {  /* DFA node {78,67,53} 147 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_12;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 6;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st148: {  /* DFA node {80,65,53} 148 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 0 to matched */[m
[31m-    matched_0 = caps0_14;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 7;[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st149: {  /* DFA node {78,65,32,53} 149 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st159;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st160;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st150: {  /* DFA node {75,62,53} 150 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if ((c >= 0 && c <= 9) || (c >= 11 && c <= 255)) {[m
[31m-            goto st161;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st151: {  /* DFA node {76,63} 151 */[m
[31m-    if (unlikely(i >= len)) {[m
[31m-        i++;[m
[31m-        goto st151_error;[m
[31m-    }[m
[31m-[m
[31m-    c = s[i];[m
[31m-    i++;[m
[31m-    switch (c) {[m
[31m-    case 34: {[m
[31m-        goto st127;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 39: {[m
[31m-        goto st128;[m
[31m-        break;[m
[31m-        }[m
[31m-    case 92: {[m
[31m-        goto st129;[m
[31m-        break;[m
[31m-        }[m
[31m-    default:[m
[31m-        break;[m
[31m-    }[m
[31m-    if ((c >= 0 && c <= 9)[m
[31m-        || (c >= 11 && c <= 33)[m
[31m-        || (c >= 35 && c <= 38)[m
[31m-        || (c >= 40 && c <= 91)[m
[31m-        || (c >= 93 && c <= 255))[m
[31m-    {[m
[31m-        goto st126;[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    goto st151_error;[m
[31m-[m
[31m-st152: {  /* DFA node {78,34,53} 152 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st152;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st153;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 2 to row 1 */[m
[31m-            caps1_10 = caps2_10;[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st153: {  /* DFA node {78,36,53} 153 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st84;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st85;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st83;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st154: {  /* DFA node {76,53} 154 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 1 to matched */[m
[31m-    matched_0 = caps1_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 39) {[m
[31m-            goto st131;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st133;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st130;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st156: {  /* DFA node {65,78,34,53} 156 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st156;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st157;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st157: {  /* DFA node {65,78,36,53} 157 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st105;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st106;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st107;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st104;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st158: {  /* DFA node {63,76,53} 158 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st138;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st139;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st141;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st137;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st159: {  /* DFA node {78,65,34,53} 159 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 3 to matched */[m
[31m-    matched_0 = caps3_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 61) {[m
[31m-            goto st159;[m
[31m-        }[m
[31m-        if (c == 91) {[m
[31m-            goto st160;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 60)[m
[31m-            || (c >= 62 && c <= 90)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            /* transfer caps from row 3 to row 2 */[m
[31m-            caps2_10 = caps3_10;[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st160: {  /* DFA node {78,65,36,53} 160 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_6;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 3;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st127;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st128;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st129;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st126;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st161: {  /* DFA node {76,63,53} 161 */[m
[31m-    c = i < len ? s[i] : -1;[m
[31m-    i++;[m
[31m-    /* transfer caps from row 2 to matched */[m
[31m-    matched_0 = caps2_10;[m
[31m-    /* capture stores */[m
[31m-    matched_1 = i - 1;[m
[31m-    matched_id = 5;[m
[31m-    if (c != -1) {[m
[31m-        if (c == 34) {[m
[31m-            goto st147;[m
[31m-        }[m
[31m-        if (c == 39) {[m
[31m-            goto st148;[m
[31m-        }[m
[31m-        if (c == 92) {[m
[31m-            goto st150;[m
[31m-        }[m
[31m-        if ((c >= 0 && c <= 9)[m
[31m-            || (c >= 11 && c <= 33)[m
[31m-            || (c >= 35 && c <= 38)[m
[31m-            || (c >= 40 && c <= 91)[m
[31m-            || (c >= 93 && c <= 255))[m
[31m-        {[m
[31m-            goto st146;[m
[31m-        }[m
[31m-    }[m
[31m-    }  /* end state */[m
[31m-[m
[31m-    ovec[0] = matched_0;[m
[31m-    ovec[1] = matched_1;[m
[31m-    return matched_id;  /* fallback */[m
[31m-[m
[31m-st0_error:[m
[31m-st1_error:[m
[31m-st2_error:[m
[31m-st3_error:[m
[31m-st4_error:[m
[31m-st5_error:[m
[31m-st6_error:[m
[31m-st9_error:[m
[31m-st11_error:[m
[31m-st12_error:[m
[31m-st13_error:[m
[31m-st14_error:[m
[31m-st15_error:[m
[31m-st18_error:[m
[31m-st19_error:[m
[31m-st21_error:[m
[31m-st22_error:[m
[31m-st23_error:[m
[31m-st24_error:[m
[31m-st28_error:[m
[31m-st30_error:[m
[31m-st35_error:[m
[31m-st38_error:[m
[31m-st39_error:[m
[31m-st40_error:[m
[31m-st41_error:[m
[31m-st45_error:[m
[31m-st47_error:[m
[31m-st48_error:[m
[31m-st49_error:[m
[31m-st50_error:[m
[31m-st51_error:[m
[31m-st52_error:[m
[31m-st55_error:[m
[31m-st57_error:[m
[31m-st59_error:[m
[31m-st60_error:[m
[31m-st63_error:[m
[31m-st64_error:[m
[31m-st65_error:[m
[31m-st66_error:[m
[31m-st71_error:[m
[31m-st73_error:[m
[31m-st74_error:[m
[31m-st75_error:[m
[31m-st76_error:[m
[31m-st77_error:[m
[31m-st78_error:[m
[31m-st81_error:[m
[31m-st83_error:[m
[31m-st85_error:[m
[31m-st92_error:[m
[31m-st94_error:[m
[31m-st95_error:[m
[31m-st96_error:[m
[31m-st97_error:[m
[31m-st98_error:[m
[31m-st99_error:[m
[31m-st102_error:[m
[31m-st104_error:[m
[31m-st107_error:[m
[31m-st112_error:[m
[31m-st114_error:[m
[31m-st116_error:[m
[31m-st117_error:[m
[31m-st118_error:[m
[31m-st119_error:[m
[31m-st120_error:[m
[31m-st121_error:[m
[31m-st124_error:[m
[31m-st126_error:[m
[31m-st129_error:[m
[31m-st134_error:[m
[31m-st142_error:[m
[31m-st151_error:[m
[31m-[m
[31m-    if (matched_0 != -1) {[m
[31m-        ovec[0] = matched_0;[m
[31m-        ovec[1] = matched_1;[m
[31m-        return matched_id;  /* fallback */[m
[31m-    }[m
[31m-    return NO_MATCH;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_lex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_lex.h[m
[1mdeleted file mode 100644[m
[1mindex 11f102c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_lex.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_LEX_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_LEX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-int ngx_http_lua_lex(const u_char *const s, size_t len, int *const ovec);[m
[31m-[m
[31m-[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_log.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_log.c[m
[1mdeleted file mode 100644[m
[1mindex c2b2269..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_log.c[m
[1m+++ /dev/null[m
[36m@@ -1,316 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_print(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_log(lua_State *L);[m
[31m-static int log_wrapper(ngx_log_t *log, const char *ident,[m
[31m-    ngx_uint_t level, lua_State *L);[m
[31m-static void ngx_http_lua_inject_log_consts(lua_State *L);[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Wrapper of nginx log functionality. Take a log level param and varargs of[m
[31m- * log message params.[m
[31m- *[m
[31m- * @param L Lua state pointer[m
[31m- * @retval always 0 (don't return values to Lua)[m
[31m- * */[m
[31m-int[m
[31m-ngx_http_lua_ngx_log(lua_State *L)[m
[31m-{[m
[31m-    ngx_log_t                   *log;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    const char                  *msg;[m
[31m-    int                          level;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    if (r && r->connection && r->connection->log) {[m
[31m-        log = r->connection->log;[m
[31m-[m
[31m-    } else {[m
[31m-        log = ngx_cycle->log;[m
[31m-    }[m
[31m-[m
[31m-    level = luaL_checkint(L, 1);[m
[31m-    if (level < NGX_LOG_STDERR || level > NGX_LOG_DEBUG) {[m
[31m-        msg = lua_pushfstring(L, "bad log level: %d", level);[m
[31m-        return luaL_argerror(L, 1, msg);[m
[31m-    }[m
[31m-[m
[31m-    /* remove log-level param from stack */[m
[31m-    lua_remove(L, 1);[m
[31m-[m
[31m-    return log_wrapper(log, "[lua] ", (ngx_uint_t) level, L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Override Lua print function, output message to nginx error logs. Equal to[m
[31m- * ngx.log(ngx.NOTICE, ...).[m
[31m- *[m
[31m- * @param L Lua state pointer[m
[31m- * @retval always 0 (don't return values to Lua)[m
[31m- * */[m
[31m-int[m
[31m-ngx_http_lua_print(lua_State *L)[m
[31m-{[m
[31m-    ngx_log_t                   *log;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    if (r && r->connection && r->connection->log) {[m
[31m-        log = r->connection->log;[m
[31m-[m
[31m-    } else {[m
[31m-        log = ngx_cycle->log;[m
[31m-    }[m
[31m-[m
[31m-    return log_wrapper(log, "[lua] ", NGX_LOG_NOTICE, L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-log_wrapper(ngx_log_t *log, const char *ident, ngx_uint_t level,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    u_char              *buf;[m
[31m-    u_char              *p, *q;[m
[31m-    ngx_str_t            name;[m
[31m-    int                  nargs, i;[m
[31m-    size_t               size, len;[m
[31m-    size_t               src_len = 0;[m
[31m-    int                  type;[m
[31m-    const char          *msg;[m
[31m-    lua_Debug            ar;[m
[31m-[m
[31m-    if (level > log->log_level) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    /* add debug info */[m
[31m-[m
[31m-    lua_getstack(L, 1, &ar);[m
[31m-    lua_getinfo(L, "Snl", &ar);[m
[31m-[m
[31m-    /* get the basename of the Lua source file path, stored in q */[m
[31m-    name.data = (u_char *) ar.short_src;[m
[31m-    if (name.data == NULL) {[m
[31m-        name.len = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        p = name.data;[m
[31m-        while (*p != '\0') {[m
[31m-            if (*p == '/' || *p == '\\') {[m
[31m-                name.data = p + 1;[m
[31m-            }[m
[31m-            p++;[m
[31m-        }[m
[31m-[m
[31m-        name.len = p - name.data;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    size = name.len + NGX_INT_T_LEN + sizeof(":: ") - 1;[m
[31m-[m
[31m-    if (*ar.namewhat != '\0' && *ar.what == 'L') {[m
[31m-        src_len = ngx_strlen(ar.name);[m
[31m-        size += src_len + sizeof("(): ") - 1;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-        type = lua_type(L, i);[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                lua_tolstring(L, i, &len);[m
[31m-                size += len;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                size += sizeof("nil") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, i)) {[m
[31m-                    size += sizeof("true") - 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    size += sizeof("false") - 1;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-                if (!luaL_callmeta(L, i, "__tostring")) {[m
[31m-                    return luaL_argerror(L, i, "expected table to have "[m
[31m-                                         "__tostring metamethod");[m
[31m-                }[m
[31m-[m
[31m-                lua_tolstring(L, -1, &len);[m
[31m-                size += len;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                if (lua_touserdata(L, i) == NULL) {[m
[31m-                    size += sizeof("null") - 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-                msg = lua_pushfstring(L, "string, number, boolean, or nil "[m
[31m-                                      "expected, got %s",[m
[31m-                                      lua_typename(L, type));[m
[31m-                return luaL_argerror(L, i, msg);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    buf = lua_newuserdata(L, size);[m
[31m-[m
[31m-    p = ngx_copy(buf, name.data, name.len);[m
[31m-[m
[31m-    *p++ = ':';[m
[31m-[m
[31m-    p = ngx_snprintf(p, NGX_INT_T_LEN, "%d",[m
[31m-                     ar.currentline ? ar.currentline : ar.linedefined);[m
[31m-[m
[31m-    *p++ = ':'; *p++ = ' ';[m
[31m-[m
[31m-    if (*ar.namewhat != '\0' && *ar.what == 'L') {[m
[31m-        p = ngx_copy(p, ar.name, src_len);[m
[31m-        *p++ = '(';[m
[31m-        *p++ = ')';[m
[31m-        *p++ = ':';[m
[31m-        *p++ = ' ';[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-        type = lua_type(L, i);[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                q = (u_char *) lua_tolstring(L, i, &len);[m
[31m-                p = ngx_copy(p, q, len);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                *p++ = 'n';[m
[31m-                *p++ = 'i';[m
[31m-                *p++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, i)) {[m
[31m-                    *p++ = 't';[m
[31m-                    *p++ = 'r';[m
[31m-                    *p++ = 'u';[m
[31m-                    *p++ = 'e';[m
[31m-[m
[31m-                } else {[m
[31m-                    *p++ = 'f';[m
[31m-                    *p++ = 'a';[m
[31m-                    *p++ = 'l';[m
[31m-                    *p++ = 's';[m
[31m-                    *p++ = 'e';[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-                luaL_callmeta(L, i, "__tostring");[m
[31m-                q = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-                p = ngx_copy(p, q, len);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                *p++ = 'n';[m
[31m-                *p++ = 'u';[m
[31m-                *p++ = 'l';[m
[31m-                *p++ = 'l';[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "impossible to reach here");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (p - buf > (off_t) size) {[m
[31m-        return luaL_error(L, "buffer error: %d > %d", (int) (p - buf),[m
[31m-                          (int) size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_error(level, log, 0, "%s%*s", ident, (size_t) (p - buf), buf);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_log_api(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_inject_log_consts(L);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_log);[m
[31m-    lua_setfield(L, -2, "log");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_print);[m
[31m-    lua_setglobal(L, "print");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_inject_log_consts(lua_State *L)[m
[31m-{[m
[31m-    /* {{{ nginx log level constants */[m
[31m-    lua_pushinteger(L, NGX_LOG_STDERR);[m
[31m-    lua_setfield(L, -2, "STDERR");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_EMERG);[m
[31m-    lua_setfield(L, -2, "EMERG");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_ALERT);[m
[31m-    lua_setfield(L, -2, "ALERT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_CRIT);[m
[31m-    lua_setfield(L, -2, "CRIT");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_ERR);[m
[31m-    lua_setfield(L, -2, "ERR");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_WARN);[m
[31m-    lua_setfield(L, -2, "WARN");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_NOTICE);[m
[31m-    lua_setfield(L, -2, "NOTICE");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_INFO);[m
[31m-    lua_setfield(L, -2, "INFO");[m
[31m-[m
[31m-    lua_pushinteger(L, NGX_LOG_DEBUG);[m
[31m-    lua_setfield(L, -2, "DEBUG");[m
[31m-    /* }}} */[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_log.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_log.h[m
[1mdeleted file mode 100644[m
[1mindex 42f1839..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_log.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_LOG_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_LOG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_log_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_LOG_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_logby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_logby.c[m
[1mdeleted file mode 100644[m
[1mindex 0a79acd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_logby.c[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-#include "ngx_http_lua_logby.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_log_by_chunk(lua_State *L, ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_log_by_lua_env(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    /*  set nginx request pointer to current lua thread's globals table */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-[m
[31m-    /**[m
[31m-     * we want to create empty environment for current script[m
[31m-     *[m
[31m-     * newt = {}[m
[31m-     * newt["_G"] = newt[m
[31m-     * setmetatable(newt, {__index = _G})[m
[31m-     *[m
[31m-     * if a function or symbol is not defined in our env, __index will lookup[m
[31m-     * in the global env.[m
[31m-     *[m
[31m-     * all variables created in the script-env will be thrown away at the end[m
[31m-     * of the script run.[m
[31m-     * */[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    lua_createtable(L, 0, 1);    /*  the metatable for the new env */[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable({}, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_log_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua log handler, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->log_handler == NULL) {[m
[31m-        dd("no log handler found");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_LOG;[m
[31m-[m
[31m-    dd("calling log handler");[m
[31m-    return llcf->log_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_log_handler_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    dd("log by lua inline");[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->log_src.value.data,[m
[31m-                                       llcf->log_src.value.len,[m
[31m-                                       llcf->log_src_key,[m
[31m-                                       (const char *) llcf->log_chunkname);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_log_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_log_handler_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &llcf->log_src, &eval_src) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->log_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_log_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_log_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t        rc;[m
[31m-    u_char          *err_msg;[m
[31m-    size_t           len;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t      *old_pool;[m
[31m-#endif[m
[31m-[m
[31m-    /*  set Lua VM panic handler */[m
[31m-    lua_atpanic(L, ngx_http_lua_atpanic);[m
[31m-[m
[31m-    NGX_LUA_EXCEPTION_TRY {[m
[31m-[m
[31m-        /* initialize nginx context in Lua VM, code chunk at stack top sp = 1 */[m
[31m-        ngx_http_lua_log_by_lua_env(L, r);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        /* XXX: work-around to nginx regex subsystem */[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-        lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-        /*  protected call user code */[m
[31m-        rc = lua_pcall(L, 0, 1, 1);[m
[31m-[m
[31m-        lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        /* XXX: work-around to nginx regex subsystem */[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-        if (rc != 0) {[m
[31m-            /*  error occured when running loaded code */[m
[31m-            err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-            if (err_msg == NULL) {[m
[31m-                err_msg = (u_char *) "unknown reason";[m
[31m-                len = sizeof("unknown reason") - 1;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "failed to run log_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-            lua_settop(L, 0);    /*  clear remaining elems on stack */[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } NGX_LUA_EXCEPTION_CATCH {[m
[31m-[m
[31m-        dd("nginx execution restored");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  clear Lua stack */[m
[31m-    lua_settop(L, 0);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_logby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_logby.h[m
[1mdeleted file mode 100644[m
[1mindex af8aaaa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_logby.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_LOGBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_LOGBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_log_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_log_handler_inline(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_log_handler_file(ngx_http_request_t *r);[m
[31m-void ngx_http_lua_inject_logby_ngx_api(ngx_conf_t *cf, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_LOGBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_misc.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_misc.c[m
[1mdeleted file mode 100644[m
[1mindex f96e2f2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_misc.c[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_ctx.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_get(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_set(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_is_internal(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_misc_api(lua_State *L)[m
[31m-{[m
[31m-    /* ngx. getter and setter */[m
[31m-    lua_createtable(L, 0, 2); /* metatable for .ngx */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_misc_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_is_internal);[m
[31m-    lua_setfield(L, -2, "is_internal");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_is_internal(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    lua_pushboolean(L, r->internal == 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_get(lua_State *L)[m
[31m-{[m
[31m-    int                          status;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, -1, &len);[m
[31m-[m
[31m-    dd("ngx get %s", p);[m
[31m-[m
[31m-    if (len == sizeof("status") - 1[m
[31m-        && ngx_strncmp(p, "status", sizeof("status") - 1) == 0)[m
[31m-    {[m
[31m-        ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-        if (r->err_status) {[m
[31m-            status = r->err_status;[m
[31m-[m
[31m-        } else if (r->headers_out.status) {[m
[31m-            status = r->headers_out.status;[m
[31m-[m
[31m-        } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-            status = 9;[m
[31m-[m
[31m-        } else {[m
[31m-            status = 0;[m
[31m-        }[m
[31m-[m
[31m-        lua_pushinteger(L, status);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (len == sizeof("ctx") - 1[m
[31m-        && ngx_strncmp(p, "ctx", sizeof("ctx") - 1) == 0)[m
[31m-    {[m
[31m-        return ngx_http_lua_ngx_get_ctx(L);[m
[31m-    }[m
[31m-[m
[31m-    if (len == sizeof("is_subrequest") - 1[m
[31m-        && ngx_strncmp(p, "is_subrequest", sizeof("is_subrequest") - 1) == 0)[m
[31m-    {[m
[31m-        lua_pushboolean(L, r != r->main);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (len == sizeof("headers_sent") - 1[m
[31m-        && ngx_strncmp(p, "headers_sent", sizeof("headers_sent") - 1) == 0)[m
[31m-    {[m
[31m-        ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-        dd("headers sent: %d", r->header_sent || ctx->header_sent);[m
[31m-[m
[31m-        lua_pushboolean(L, r->header_sent || ctx->header_sent);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("key %s not matched", p);[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_set(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-[m
[31m-    /* we skip the first argument that is the table */[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    if (len == sizeof("status") - 1[m
[31m-        && ngx_strncmp(p, "status", sizeof("status") - 1) == 0)[m
[31m-    {[m
[31m-        r = ngx_http_lua_get_req(L);[m
[31m-        if (r == NULL) {[m
[31m-            return luaL_error(L, "no request object found");[m
[31m-        }[m
[31m-[m
[31m-        if (r->header_sent) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to set ngx.status after sending out "[m
[31m-                          "response headers");[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (r->err_status) {[m
[31m-            r->err_status = 0;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-        /* get the value */[m
[31m-        r->headers_out.status = (ngx_uint_t) luaL_checknumber(L, 3);[m
[31m-[m
[31m-        if (r->headers_out.status == 101) {[m
[31m-            /*[m
[31m-             * XXX work-around a bug in the Nginx core that 101 does[m
[31m-             * not have a default status line[m
[31m-             */[m
[31m-[m
[31m-            ngx_str_set(&r->headers_out.status_line, "101 Switching Protocols");[m
[31m-[m
[31m-        } else {[m
[31m-            r->headers_out.status_line.len = 0;[m
[31m-        }[m
[31m-[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (len == sizeof("ctx") - 1[m
[31m-        && ngx_strncmp(p, "ctx", sizeof("ctx") - 1) == 0)[m
[31m-    {[m
[31m-        r = ngx_http_lua_get_req(L);[m
[31m-        if (r == NULL) {[m
[31m-            return luaL_error(L, "no request object found");[m
[31m-        }[m
[31m-[m
[31m-        return ngx_http_lua_ngx_set_ctx(L);[m
[31m-    }[m
[31m-[m
[31m-    lua_rawset(L, -3);[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_get_resp_status(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        return r->err_status;[m
[31m-[m
[31m-    } else if (r->headers_out.status) {[m
[31m-        return r->headers_out.status;[m
[31m-[m
[31m-    } else if (r->http_version == NGX_HTTP_VERSION_9) {[m
[31m-        return 9;[m
[31m-[m
[31m-    } else {[m
[31m-        return 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_set_resp_status(ngx_http_request_t *r, int status)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_sent) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "attempt to set ngx.status after sending out "[m
[31m-                      "response headers");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->headers_out.status = status;[m
[31m-[m
[31m-    if (r->err_status) {[m
[31m-        r->err_status = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (status == 101) {[m
[31m-        /*[m
[31m-         * XXX work-around a bug in the Nginx core older than 1.5.5[m
[31m-         * that 101 does not have a default status line[m
[31m-         */[m
[31m-[m
[31m-        ngx_str_set(&r->headers_out.status_line, "101 Switching Protocols");[m
[31m-[m
[31m-    } else {[m
[31m-        r->headers_out.status_line.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_is_subrequest(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    return r != r->main;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_headers_sent(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_HTTP_LUA_FFI_NO_REQ_CTX;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    return r->header_sent ? 1 : 0;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_misc.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_misc.h[m
[1mdeleted file mode 100644[m
[1mindex c26d869..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_misc.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_MISC_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_MISC_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_misc_api(lua_State *L);[m
[31m-[m
[31m-void ngx_http_lua_inject_req_misc_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_MISC_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_module.c[m
[1mdeleted file mode 100644[m
[1mindex 867661c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1194 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-#include "ngx_http_lua_capturefilter.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_rewriteby.h"[m
[31m-#include "ngx_http_lua_accessby.h"[m
[31m-#include "ngx_http_lua_logby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_headerfilterby.h"[m
[31m-#include "ngx_http_lua_bodyfilterby.h"[m
[31m-#include "ngx_http_lua_initby.h"[m
[31m-#include "ngx_http_lua_initworkerby.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-#include "ngx_http_lua_semaphore.h"[m
[31m-#include "ngx_http_lua_balancer.h"[m
[31m-#include "ngx_http_lua_ssl_certby.h"[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_lua_create_main_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_lua_init_main_conf(ngx_conf_t *cf, void *conf);[m
[31m-static void *ngx_http_lua_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_lua_merge_srv_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static void *ngx_http_lua_create_loc_conf(ngx_conf_t *cf);[m
[31m-[m
[31m-static char *ngx_http_lua_merge_loc_conf(ngx_conf_t *cf, void *parent,[m
[31m-    void *child);[m
[31m-static ngx_int_t ngx_http_lua_init(ngx_conf_t *cf);[m
[31m-static char *ngx_http_lua_lowat_check(ngx_conf_t *cf, void *post, void *data);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static ngx_int_t ngx_http_lua_set_ssl(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_loc_conf_t *llcf);[m
[31m-#endif[m
[31m-#if (NGX_HTTP_LUA_HAVE_MMAP_SBRK) && (NGX_LINUX)[m
[31m-/* we cannot use "static" for this function since it may lead to compiler[m
[31m- * warnings */[m
[31m-void ngx_http_lua_limit_data_segment(void);[m
[31m-#   if !(NGX_HTTP_LUA_HAVE_CONSTRUCTOR)[m
[31m-static ngx_int_t ngx_http_lua_pre_config(ngx_conf_t *cf);[m
[31m-#   endif[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_conf_post_t  ngx_http_lua_lowat_post =[m
[31m-    { ngx_http_lua_lowat_check };[m
[31m-[m
[31m-[m
[31m-static volatile ngx_cycle_t  *ngx_http_lua_prev_cycle = NULL;[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL) && defined(nginx_version) && nginx_version >= 1001013[m
[31m-[m
[31m-static ngx_conf_bitmask_t  ngx_http_lua_ssl_protocols[] = {[m
[31m-    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },[m
[31m-    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },[m
[31m-    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },[m
[31m-    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },[m
[31m-    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_http_lua_cmds[] = {[m
[31m-[m
[31m-    { ngx_string("lua_max_running_timers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, max_running_timers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_max_pending_timers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, max_pending_timers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_shared_dict"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,[m
[31m-      ngx_http_lua_shared_dict,[m
[31m-      0,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    { ngx_string("lua_regex_cache_max_entries"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, regex_cache_max_entries),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_regex_match_limit"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, regex_match_limit),[m
[31m-      NULL },[m
[31m-#endif[m
[31m-[m
[31m-    { ngx_string("lua_package_cpath"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_package_cpath,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_package_path"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_package_path,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_code_cache"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_http_lua_code_cache,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, enable_code_cache),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_need_request_body"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, force_read_body),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_transform_underscores_in_response_headers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, transform_underscores_in_resp_headers),[m
[31m-      NULL },[m
[31m-[m
[31m-     { ngx_string("lua_socket_log_errors"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, log_socket_errors),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("init_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_init_by_lua_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_by_inline },[m
[31m-[m
[31m-    { ngx_string("init_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_init_by_lua,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_by_inline },[m
[31m-[m
[31m-    { ngx_string("init_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_init_by_lua,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_by_file },[m
[31m-[m
[31m-    { ngx_string("init_worker_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_init_worker_by_lua_block,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_worker_by_inline },[m
[31m-[m
[31m-    { ngx_string("init_worker_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_init_worker_by_lua,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_worker_by_inline },[m
[31m-[m
[31m-    { ngx_string("init_worker_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_init_worker_by_lua,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_init_worker_by_file },[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-    /* set_by_lua $res { inline Lua code } [$arg1 [$arg2 [...]]] */[m
[31m-    { ngx_string("set_by_lua_block"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_1MORE|NGX_CONF_BLOCK,[m
[31m-      ngx_http_lua_set_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_filter_set_by_lua_inline },[m
[31m-[m
[31m-    /* set_by_lua $res <inline script> [$arg1 [$arg2 [...]]] */[m
[31m-    { ngx_string("set_by_lua"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_2MORE,[m
[31m-      ngx_http_lua_set_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_filter_set_by_lua_inline },[m
[31m-[m
[31m-    /* set_by_lua_file $res rel/or/abs/path/to/script [$arg1 [$arg2 [..]]] */[m
[31m-    { ngx_string("set_by_lua_file"),[m
[31m-      NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                       |NGX_CONF_2MORE,[m
[31m-      ngx_http_lua_set_by_lua_file,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_filter_set_by_lua_file },[m
[31m-#endif[m
[31m-[m
[31m-    /* rewrite_by_lua "<inline script>" */[m
[31m-    { ngx_string("rewrite_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_rewrite_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_rewrite_handler_inline },[m
[31m-[m
[31m-    /* rewrite_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("rewrite_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_rewrite_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_rewrite_handler_inline },[m
[31m-[m
[31m-    /* access_by_lua "<inline script>" */[m
[31m-    { ngx_string("access_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_access_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_access_handler_inline },[m
[31m-[m
[31m-    /* access_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("access_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_access_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_access_handler_inline },[m
[31m-[m
[31m-    /* content_by_lua "<inline script>" */[m
[31m-    { ngx_string("content_by_lua"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_content_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_content_handler_inline },[m
[31m-[m
[31m-    /* content_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("content_by_lua_block"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_content_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_content_handler_inline },[m
[31m-[m
[31m-    /* log_by_lua <inline script> */[m
[31m-    { ngx_string("log_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_log_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_log_handler_inline },[m
[31m-[m
[31m-    /* log_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("log_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_log_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_log_handler_inline },[m
[31m-[m
[31m-    { ngx_string("rewrite_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_rewrite_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_rewrite_handler_file },[m
[31m-[m
[31m-    { ngx_string("rewrite_by_lua_no_postpone"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, postponed_to_rewrite_phase_end),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("access_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_access_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_access_handler_file },[m
[31m-[m
[31m-    { ngx_string("access_by_lua_no_postpone"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_MAIN_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_main_conf_t, postponed_to_access_phase_end),[m
[31m-      NULL },[m
[31m-[m
[31m-    /* content_by_lua_file rel/or/abs/path/to/script */[m
[31m-    { ngx_string("content_by_lua_file"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_content_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_content_handler_file },[m
[31m-[m
[31m-    { ngx_string("log_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_log_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_log_handler_file },[m
[31m-[m
[31m-    /* header_filter_by_lua <inline script> */[m
[31m-    { ngx_string("header_filter_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_header_filter_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_header_filter_inline },[m
[31m-[m
[31m-    /* header_filter_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("header_filter_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_header_filter_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_header_filter_inline },[m
[31m-[m
[31m-    { ngx_string("header_filter_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_header_filter_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_header_filter_file },[m
[31m-[m
[31m-    { ngx_string("body_filter_by_lua"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_body_filter_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_body_filter_inline },[m
[31m-[m
[31m-    /* body_filter_by_lua_block { <inline script> } */[m
[31m-    { ngx_string("body_filter_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_body_filter_by_lua_block,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_body_filter_inline },[m
[31m-[m
[31m-    { ngx_string("body_filter_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_body_filter_by_lua,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_body_filter_file },[m
[31m-[m
[31m-    { ngx_string("balancer_by_lua_block"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_balancer_by_lua_block,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_balancer_handler_inline },[m
[31m-[m
[31m-    { ngx_string("balancer_by_lua_file"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_balancer_by_lua,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_balancer_handler_file },[m
[31m-[m
[31m-    { ngx_string("lua_socket_keepalive_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, keepalive_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_send_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, send_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_send_lowat"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, send_lowat),[m
[31m-      &ngx_http_lua_lowat_post },[m
[31m-[m
[31m-    { ngx_string("lua_socket_buffer_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_size_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, buffer_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_pool_size"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-                        |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, pool_size),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_socket_read_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF[m
[31m-          |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_http10_buffering"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, http10_buffering),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_check_client_abort"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, check_client_abort),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_use_default_type"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF[m
[31m-                        |NGX_CONF_FLAG,[m
[31m-      ngx_conf_set_flag_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, use_default_type),[m
[31m-      NULL },[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-#   if defined(nginx_version) && nginx_version >= 1001013[m
[31m-[m
[31m-    { ngx_string("lua_ssl_protocols"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_conf_set_bitmask_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_protocols),[m
[31m-      &ngx_http_lua_ssl_protocols },[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-    { ngx_string("lua_ssl_ciphers"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_ciphers),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_by_lua_block"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,[m
[31m-      ngx_http_lua_ssl_cert_by_lua_block,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_ssl_cert_handler_inline },[m
[31m-[m
[31m-    { ngx_string("ssl_certificate_by_lua_file"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_http_lua_ssl_cert_by_lua,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      (void *) ngx_http_lua_ssl_cert_handler_file },[m
[31m-[m
[31m-    { ngx_string("lua_ssl_verify_depth"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_num_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_verify_depth),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_ssl_trusted_certificate"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_trusted_certificate),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("lua_ssl_crl"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_str_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_http_lua_loc_conf_t, ssl_crl),[m
[31m-      NULL },[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-    ngx_null_command[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_http_module_t ngx_http_lua_module_ctx = {[m
[31m-#if (NGX_HTTP_LUA_HAVE_MMAP_SBRK)                                            \[m
[31m-    && (NGX_LINUX)                                                           \[m
[31m-    && !(NGX_HTTP_LUA_HAVE_CONSTRUCTOR)[m
[31m-    ngx_http_lua_pre_config,          /*  preconfiguration */[m
[31m-#else[m
[31m-    NULL,                             /*  preconfiguration */[m
[31m-#endif[m
[31m-    ngx_http_lua_init,                /*  postconfiguration */[m
[31m-[m
[31m-    ngx_http_lua_create_main_conf,    /*  create main configuration */[m
[31m-    ngx_http_lua_init_main_conf,      /*  init main configuration */[m
[31m-[m
[31m-    ngx_http_lua_create_srv_conf,     /*  create server configuration */[m
[31m-    ngx_http_lua_merge_srv_conf,      /*  merge server configuration */[m
[31m-[m
[31m-    ngx_http_lua_create_loc_conf,     /*  create location configuration */[m
[31m-    ngx_http_lua_merge_loc_conf       /*  merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_lua_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_lua_module_ctx,   /*  module context */[m
[31m-    ngx_http_lua_cmds,          /*  module directives */[m
[31m-    NGX_HTTP_MODULE,            /*  module type */[m
[31m-    NULL,                       /*  init master */[m
[31m-    NULL,                       /*  init module */[m
[31m-    ngx_http_lua_init_worker,   /*  init process */[m
[31m-    NULL,                       /*  init thread */[m
[31m-    NULL,                       /*  exit thread */[m
[31m-    NULL,                       /*  exit process */[m
[31m-    NULL,                       /*  exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    int                         multi_http_blocks;[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_array_t                *arr;[m
[31m-    ngx_http_handler_pt        *h;[m
[31m-    volatile ngx_cycle_t       *saved_cycle;[m
[31m-    ngx_http_core_main_conf_t  *cmcf;[m
[31m-    ngx_http_lua_main_conf_t   *lmcf;[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-    ngx_pool_cleanup_t         *cln;[m
[31m-#endif[m
[31m-[m
[31m-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_http_lua_prev_cycle != ngx_cycle) {[m
[31m-        ngx_http_lua_prev_cycle = ngx_cycle;[m
[31m-        multi_http_blocks = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        multi_http_blocks = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || lmcf->requires_capture_filter) {[m
[31m-        rc = ngx_http_lua_capture_filter_init(cf);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->postponed_to_rewrite_phase_end == NGX_CONF_UNSET) {[m
[31m-        lmcf->postponed_to_rewrite_phase_end = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->postponed_to_access_phase_end == NGX_CONF_UNSET) {[m
[31m-        lmcf->postponed_to_access_phase_end = 0;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    if (lmcf->requires_rewrite) {[m
[31m-        h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *h = ngx_http_lua_rewrite_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->requires_access) {[m
[31m-        h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *h = ngx_http_lua_access_handler;[m
[31m-    }[m
[31m-[m
[31m-    dd("requires log: %d", (int) lmcf->requires_log);[m
[31m-[m
[31m-    if (lmcf->requires_log) {[m
[31m-        arr = &cmcf->phases[NGX_HTTP_LOG_PHASE].handlers;[m
[31m-        h = ngx_array_push(arr);[m
[31m-        if (h == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (arr->nelts > 1) {[m
[31m-            h = arr->elts;[m
[31m-            ngx_memmove(&h[1], h,[m
[31m-                        (arr->nelts - 1) * sizeof(ngx_http_handler_pt));[m
[31m-        }[m
[31m-[m
[31m-        *h = ngx_http_lua_log_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || lmcf->requires_header_filter) {[m
[31m-        rc = ngx_http_lua_header_filter_init();[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (multi_http_blocks || lmcf->requires_body_filter) {[m
[31m-        rc = ngx_http_lua_body_filter_init();[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-    /* add the cleanup of semaphores after the lua_close */[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->data = lmcf;[m
[31m-    cln->handler = ngx_http_lua_sema_mm_cleanup;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (lmcf->lua == NULL) {[m
[31m-        dd("initializing lua vm");[m
[31m-[m
[31m-        ngx_http_lua_content_length_hash =[m
[31m-                                  ngx_http_lua_hash_literal("content-length");[m
[31m-        ngx_http_lua_location_hash = ngx_http_lua_hash_literal("location");[m
[31m-[m
[31m-        lmcf->lua = ngx_http_lua_init_vm(NULL, cf->cycle, cf->pool, lmcf,[m
[31m-                                         cf->log, NULL);[m
[31m-        if (lmcf->lua == NULL) {[m
[31m-            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,[m
[31m-                               "failed to initialize Lua VM");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (!lmcf->requires_shm && lmcf->init_handler) {[m
[31m-            saved_cycle = ngx_cycle;[m
[31m-            ngx_cycle = cf->cycle;[m
[31m-[m
[31m-            rc = lmcf->init_handler(cf->log, lmcf, lmcf->lua);[m
[31m-[m
[31m-            ngx_cycle = saved_cycle;[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                /* an error happened */[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("Lua VM initialized!");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_lua_lowat_check(ngx_conf_t *cf, void *post, void *data)[m
[31m-{[m
[31m-#if (NGX_FREEBSD)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "\"lua_send_lowat\" must be less than %d "[m
[31m-                           "(sysctl net.inet.tcp.sendspace)",[m
[31m-                           ngx_freebsd_net_inet_tcp_sendspace);[m
[31m-[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#elif !(NGX_HAVE_SO_SNDLOWAT)[m
[31m-    ssize_t *np = data;[m
[31m-[m
[31m-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,[m
[31m-                       "\"lua_send_lowat\" is not supported, ignored");[m
[31m-[m
[31m-    *np = 0;[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_lua_create_main_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_int_t       rc;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    lmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_main_conf_t));[m
[31m-    if (lmcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      lmcf->lua = NULL;[m
[31m-     *      lmcf->lua_path = { 0, NULL };[m
[31m-     *      lmcf->lua_cpath = { 0, NULL };[m
[31m-     *      lmcf->pending_timers = 0;[m
[31m-     *      lmcf->running_timers = 0;[m
[31m-     *      lmcf->watcher = NULL;[m
[31m-     *      lmcf->regex_cache_entries = 0;[m
[31m-     *      lmcf->shm_zones = NULL;[m
[31m-     *      lmcf->init_handler = NULL;[m
[31m-     *      lmcf->init_src = { 0, NULL };[m
[31m-     *      lmcf->shm_zones_inited = 0;[m
[31m-     *      lmcf->preload_hooks = NULL;[m
[31m-     *      lmcf->requires_header_filter = 0;[m
[31m-     *      lmcf->requires_body_filter = 0;[m
[31m-     *      lmcf->requires_capture_filter = 0;[m
[31m-     *      lmcf->requires_rewrite = 0;[m
[31m-     *      lmcf->requires_access = 0;[m
[31m-     *      lmcf->requires_log = 0;[m
[31m-     *      lmcf->requires_shm = 0;[m
[31m-     */[m
[31m-[m
[31m-    lmcf->pool = cf->pool;[m
[31m-    lmcf->max_pending_timers = NGX_CONF_UNSET;[m
[31m-    lmcf->max_running_timers = NGX_CONF_UNSET;[m
[31m-#if (NGX_PCRE)[m
[31m-    lmcf->regex_cache_max_entries = NGX_CONF_UNSET;[m
[31m-    lmcf->regex_match_limit = NGX_CONF_UNSET;[m
[31m-#endif[m
[31m-    lmcf->postponed_to_rewrite_phase_end = NGX_CONF_UNSET;[m
[31m-    lmcf->postponed_to_access_phase_end = NGX_CONF_UNSET;[m
[31m-[m
[31m-    rc = ngx_http_lua_sema_mm_init(cf, lmcf);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-    dd("nginx Lua module main config structure initialized!");[m
[31m-[m
[31m-    return lmcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_lua_init_main_conf(ngx_conf_t *cf, void *conf)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t *lmcf = conf;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (lmcf->regex_cache_max_entries == NGX_CONF_UNSET) {[m
[31m-        lmcf->regex_cache_max_entries = 1024;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->regex_match_limit == NGX_CONF_UNSET) {[m
[31m-        lmcf->regex_match_limit = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (lmcf->max_pending_timers == NGX_CONF_UNSET) {[m
[31m-        lmcf->max_pending_timers = 1024;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->max_running_timers == NGX_CONF_UNSET) {[m
[31m-        lmcf->max_running_timers = 256;[m
[31m-    }[m
[31m-[m
[31m-    lmcf->cycle = cf->cycle;[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_lua_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_lua_srv_conf_t     *lscf;[m
[31m-[m
[31m-    lscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_srv_conf_t));[m
[31m-    if (lscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      lscf->ssl.cert_handler = NULL;[m
[31m-     *      lscf->ssl.cert_src = { 0, NULL };[m
[31m-     *      lscf->ssl.cert_src_key = NULL;[m
[31m-     *      lscf->balancer.handler = NULL;[m
[31m-     *      lscf->balancer.src = { 0, NULL };[m
[31m-     *      lscf->balancer.src_key = NULL;[m
[31m-     */[m
[31m-[m
[31m-    return lscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_lua_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    ngx_http_lua_srv_conf_t *prev = parent;[m
[31m-    ngx_http_lua_srv_conf_t *conf = child;[m
[31m-    ngx_http_ssl_srv_conf_t *sscf;[m
[31m-[m
[31m-    dd("merge srv conf");[m
[31m-[m
[31m-    if (conf->ssl.cert_src.len == 0) {[m
[31m-        conf->ssl.cert_src = prev->ssl.cert_src;[m
[31m-        conf->ssl.cert_src_key = prev->ssl.cert_src_key;[m
[31m-        conf->ssl.cert_handler = prev->ssl.cert_handler;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->ssl.cert_src.len) {[m
[31m-        sscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_ssl_module);[m
[31m-        if (sscf == NULL || sscf->ssl.ctx == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                          "no ssl configured for the server");[m
[31m-[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#ifdef LIBRESSL_VERSION_NUMBER[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "LibreSSL does not support ssl_ceritificate_by_lua*");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if OPENSSL_VERSION_NUMBER >= 0x1000205fL[m
[31m-[m
[31m-        SSL_CTX_set_cert_cb(sscf->ssl.ctx, ngx_http_lua_ssl_cert_handler, NULL);[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "OpenSSL too old to support ssl_ceritificate_by_lua*");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_lua_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t *conf;[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* set by ngx_pcalloc:[m
[31m-     *      conf->access_src  = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->access_src_key = NULL[m
[31m-     *      conf->rewrite_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->rewrite_src_key = NULL[m
[31m-     *      conf->rewrite_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->content_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->content_src_key = NULL[m
[31m-     *      conf->content_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->log_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->log_src_key = NULL[m
[31m-     *      conf->log_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->header_filter_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->header_filter_src_key = NULL[m
[31m-     *      conf->header_filter_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->body_filter_src = {{ 0, NULL }, NULL, NULL, NULL};[m
[31m-     *      conf->body_filter_src_key = NULL[m
[31m-     *      conf->body_filter_handler = NULL;[m
[31m-     *[m
[31m-     *      conf->ssl = 0;[m
[31m-     *      conf->ssl_protocols = 0;[m
[31m-     *      conf->ssl_ciphers = { 0, NULL };[m
[31m-     *      conf->ssl_trusted_certificate = { 0, NULL };[m
[31m-     *      conf->ssl_crl = { 0, NULL };[m
[31m-     */[m
[31m-[m
[31m-    conf->force_read_body    = NGX_CONF_UNSET;[m
[31m-    conf->enable_code_cache  = NGX_CONF_UNSET;[m
[31m-    conf->http10_buffering   = NGX_CONF_UNSET;[m
[31m-    conf->check_client_abort = NGX_CONF_UNSET;[m
[31m-    conf->use_default_type   = NGX_CONF_UNSET;[m
[31m-[m
[31m-    conf->keepalive_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->send_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->send_lowat = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->buffer_size = NGX_CONF_UNSET_SIZE;[m
[31m-    conf->pool_size = NGX_CONF_UNSET_UINT;[m
[31m-[m
[31m-    conf->transform_underscores_in_resp_headers = NGX_CONF_UNSET;[m
[31m-    conf->log_socket_errors = NGX_CONF_UNSET;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;[m
[31m-#endif[m
[31m-[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static char *[m
[31m-ngx_http_lua_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t *prev = parent;[m
[31m-    ngx_http_lua_loc_conf_t *conf = child;[m
[31m-[m
[31m-    if (conf->rewrite_src.value.len == 0) {[m
[31m-        conf->rewrite_src = prev->rewrite_src;[m
[31m-        conf->rewrite_handler = prev->rewrite_handler;[m
[31m-        conf->rewrite_src_key = prev->rewrite_src_key;[m
[31m-        conf->rewrite_chunkname = prev->rewrite_chunkname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->access_src.value.len == 0) {[m
[31m-        conf->access_src = prev->access_src;[m
[31m-        conf->access_handler = prev->access_handler;[m
[31m-        conf->access_src_key = prev->access_src_key;[m
[31m-        conf->access_chunkname = prev->access_chunkname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->content_src.value.len == 0) {[m
[31m-        conf->content_src = prev->content_src;[m
[31m-        conf->content_handler = prev->content_handler;[m
[31m-        conf->content_src_key = prev->content_src_key;[m
[31m-        conf->content_chunkname = prev->content_chunkname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->log_src.value.len == 0) {[m
[31m-        conf->log_src = prev->log_src;[m
[31m-        conf->log_handler = prev->log_handler;[m
[31m-        conf->log_src_key = prev->log_src_key;[m
[31m-        conf->log_chunkname = prev->log_chunkname;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->header_filter_src.value.len == 0) {[m
[31m-        conf->header_filter_src = prev->header_filter_src;[m
[31m-        conf->header_filter_handler = prev->header_filter_handler;[m
[31m-        conf->header_filter_src_key = prev->header_filter_src_key;[m
[31m-    }[m
[31m-[m
[31m-    if (conf->body_filter_src.value.len == 0) {[m
[31m-        conf->body_filter_src = prev->body_filter_src;[m
[31m-        conf->body_filter_handler = prev->body_filter_handler;[m
[31m-        conf->body_filter_src_key = prev->body_filter_src_key;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-#   if defined(nginx_version) && nginx_version >= 1001013[m
[31m-[m
[31m-    ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,[m
[31m-                                 (NGX_CONF_BITMASK_SET|NGX_SSL_SSLv3[m
[31m-                                  |NGX_SSL_TLSv1|NGX_SSL_TLSv1_1[m
[31m-                                  |NGX_SSL_TLSv1_2));[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-    ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,[m
[31m-                             "DEFAULT");[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->ssl_verify_depth,[m
[31m-                              prev->ssl_verify_depth, 1);[m
[31m-    ngx_conf_merge_str_value(conf->ssl_trusted_certificate,[m
[31m-                             prev->ssl_trusted_certificate, "");[m
[31m-    ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");[m
[31m-[m
[31m-    if (ngx_http_lua_set_ssl(cf, conf) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->force_read_body, prev->force_read_body, 0);[m
[31m-    ngx_conf_merge_value(conf->enable_code_cache, prev->enable_code_cache, 1);[m
[31m-    ngx_conf_merge_value(conf->http10_buffering, prev->http10_buffering, 1);[m
[31m-    ngx_conf_merge_value(conf->check_client_abort, prev->check_client_abort, 0);[m
[31m-    ngx_conf_merge_value(conf->use_default_type, prev->use_default_type, 1);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->keepalive_timeout,[m
[31m-                              prev->keepalive_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->connect_timeout,[m
[31m-                              prev->connect_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->send_timeout,[m
[31m-                              prev->send_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->read_timeout,[m
[31m-                              prev->read_timeout, 60000);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->send_lowat,[m
[31m-                              prev->send_lowat, 0);[m
[31m-[m
[31m-    ngx_conf_merge_size_value(conf->buffer_size,[m
[31m-                              prev->buffer_size,[m
[31m-                              (size_t) ngx_pagesize);[m
[31m-[m
[31m-    ngx_conf_merge_uint_value(conf->pool_size, prev->pool_size, 30);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->transform_underscores_in_resp_headers,[m
[31m-                         prev->transform_underscores_in_resp_headers, 1);[m
[31m-[m
[31m-    ngx_conf_merge_value(conf->log_socket_errors, prev->log_socket_errors, 1);[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_set_ssl(ngx_conf_t *cf, ngx_http_lua_loc_conf_t *llcf)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t  *cln;[m
[31m-[m
[31m-    llcf->ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));[m
[31m-    if (llcf->ssl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    llcf->ssl->log = cf->log;[m
[31m-[m
[31m-    if (ngx_ssl_create(llcf->ssl, llcf->ssl_protocols, NULL) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_ssl_cleanup_ctx;[m
[31m-    cln->data = llcf->ssl;[m
[31m-[m
[31m-    if (SSL_CTX_set_cipher_list(llcf->ssl->ctx,[m
[31m-                                (const char *) llcf->ssl_ciphers.data)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                      "SSL_CTX_set_cipher_list(\"%V\") failed",[m
[31m-                      &llcf->ssl_ciphers);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->ssl_trusted_certificate.len) {[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003007[m
[31m-[m
[31m-        if (ngx_ssl_trusted_certificate(cf, llcf->ssl,[m
[31m-                                        &llcf->ssl_trusted_certificate,[m
[31m-                                        llcf->ssl_verify_depth)[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_CRIT, cf->log, 0, "at least nginx 1.3.7 is "[m
[31m-                      "required for the \"lua_ssl_trusted_certificate\" "[m
[31m-                      "directive");[m
[31m-        return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dd("ssl crl: %.*s", (int) llcf->ssl_crl.len, llcf->ssl_crl.data);[m
[31m-[m
[31m-    if (ngx_ssl_crl(cf, llcf->ssl, &llcf->ssl_crl) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_LUA_HAVE_MMAP_SBRK)                                            \[m
[31m-    && (NGX_LINUX)                                                           \[m
[31m-    && !(NGX_HTTP_LUA_HAVE_CONSTRUCTOR)[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_pre_config(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_lua_limit_data_segment();[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * we simply assume that LuaJIT is used. it does little harm when the[m
[31m- * standard Lua 5.1 interpreter is used instead.[m
[31m- */[m
[31m-#if (NGX_HTTP_LUA_HAVE_MMAP_SBRK) && (NGX_LINUX)[m
[31m-#   if (NGX_HTTP_LUA_HAVE_CONSTRUCTOR)[m
[31m-__attribute__((constructor))[m
[31m-#   endif[m
[31m-void[m
[31m-ngx_http_lua_limit_data_segment(void)[m
[31m-{[m
[31m-    if (sbrk(0) < (void *) 0x40000000LL) {[m
[31m-        mmap(ngx_align_ptr(sbrk(0), getpagesize()), 1, PROT_READ,[m
[31m-             MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);[m
[31m-    }[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ndk.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ndk.c[m
[1mdeleted file mode 100644[m
[1mindex 24b80b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ndk.c[m
[1m+++ /dev/null[m
[36m@@ -1,191 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_ndk.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_value_pt ngx_http_lookup_ndk_set_var_directive(u_char *name,[m
[31m-    size_t name_len);[m
[31m-static int ngx_http_lua_ndk_set_var_get(lua_State *L);[m
[31m-static int ngx_http_lua_ndk_set_var_set(lua_State *L);[m
[31m-static int ngx_http_lua_run_set_var_directive(lua_State *L);[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ndk_set_var_get(lua_State *L)[m
[31m-{[m
[31m-    ndk_set_var_value_pt                 func;[m
[31m-    size_t                               len;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    dd("ndk.set_var metatable __index: %s", p);[m
[31m-[m
[31m-    func = ngx_http_lookup_ndk_set_var_directive(p, len);[m
[31m-[m
[31m-    if (func == NULL) {[m
[31m-        return luaL_error(L, "ndk.set_var: directive \"%s\" not found "[m
[31m-                          "or does not use ndk_set_var_value", p);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushvalue(L, -1); /* table key key */[m
[31m-    lua_pushvalue(L, -1); /* table key key key */[m
[31m-    lua_pushlightuserdata(L, (void *) func); /* table key key key func */[m
[31m-    lua_pushcclosure(L, ngx_http_lua_run_set_var_directive, 2);[m
[31m-        /* table key key closure */[m
[31m-    lua_rawset(L, 1); /* table key */[m
[31m-    lua_rawget(L, 1); /* table closure */[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ndk_set_var_set(lua_State *L)[m
[31m-{[m
[31m-    return luaL_error(L, "Not allowed");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_run_set_var_directive(lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ndk_set_var_value_pt                 func;[m
[31m-    ngx_str_t                            res;[m
[31m-    ngx_http_variable_value_t            arg;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-    ngx_http_request_t                  *r;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_memzero(&arg, sizeof(ngx_http_variable_value_t));[m
[31m-[m
[31m-    arg.valid = 1;[m
[31m-#endif[m
[31m-[m
[31m-    arg.data = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-    arg.len = len;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, lua_upvalueindex(1), &len);[m
[31m-[m
[31m-    dd("calling set_var func for %s", p);[m
[31m-[m
[31m-    func = (ndk_set_var_value_pt) lua_touserdata(L, lua_upvalueindex(2));[m
[31m-[m
[31m-    rc = func(r, &res, &arg);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return luaL_error(L, "calling directive %s failed with code %d",[m
[31m-                          p, (int) rc);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) res.data, res.len);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ndk_set_var_value_pt[m
[31m-ngx_http_lookup_ndk_set_var_directive(u_char *name,[m
[31m-    size_t name_len)[m
[31m-{[m
[31m-    ndk_set_var_t           *filter;[m
[31m-    ngx_uint_t               i;[m
[31m-    ngx_module_t            *module;[m
[31m-    ngx_module_t           **modules;[m
[31m-    ngx_command_t           *cmd;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1009011[m
[31m-    modules = ngx_cycle->modules;[m
[31m-#else[m
[31m-    modules = ngx_modules;[m
[31m-#endif[m
[31m-[m
[31m-    for (i = 0; modules[i]; i++) {[m
[31m-        module = modules[i];[m
[31m-        if (module->type != NGX_HTTP_MODULE) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        cmd = modules[i]->commands;[m
[31m-        if (cmd == NULL) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        for ( /* void */ ; cmd->name.len; cmd++) {[m
[31m-            if (cmd->set != ndk_set_var_value) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            filter = cmd->post;[m
[31m-            if (filter == NULL) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (cmd->name.len != name_len[m
[31m-                || ngx_strncmp(cmd->name.data, name, name_len) != 0)[m
[31m-            {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            return (ndk_set_var_value_pt)(filter->func);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_ndk_api(lua_State *L)[m
[31m-{[m
[31m-    lua_createtable(L, 0, 1 /* nrec */);    /* ndk.* */[m
[31m-[m
[31m-    lua_newtable(L);    /* .set_var */[m
[31m-[m
[31m-    lua_createtable(L, 0, 2 /* nrec */); /* metatable for .set_var */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ndk_set_var_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ndk_set_var_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    lua_setfield(L, -2, "set_var");[m
[31m-[m
[31m-    lua_getglobal(L, "package"); /* ndk package */[m
[31m-    lua_getfield(L, -1, "loaded"); /* ndk package loaded */[m
[31m-    lua_pushvalue(L, -3); /* ndk package loaded ndk */[m
[31m-    lua_setfield(L, -2, "ndk"); /* ndk package loaded */[m
[31m-    lua_pop(L, 2);[m
[31m-[m
[31m-    lua_setglobal(L, "ndk");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* defined(NDK) && NDK */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ndk.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ndk.h[m
[1mdeleted file mode 100644[m
[1mindex 8015b5f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ndk.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_NDK_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_NDK_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-void ngx_http_lua_inject_ndk_api(lua_State *L);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_NDK_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_output.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_output.c[m
[1mdeleted file mode 100644[m
[1mindex b410ba4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_output.c[m
[1m+++ /dev/null[m
[36m@@ -1,805 +0,0 @@[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include <math.h>[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_say(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_print(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_flush(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_eof(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_send_headers(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_echo(lua_State *L, unsigned newline);[m
[31m-static void ngx_http_lua_flush_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_print(lua_State *L)[m
[31m-{[m
[31m-    dd("calling lua print");[m
[31m-    return ngx_http_lua_ngx_echo(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_say(lua_State *L)[m
[31m-{[m
[31m-    dd("calling");[m
[31m-    return ngx_http_lua_ngx_echo(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_echo(lua_State *L, unsigned newline)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    const char                  *p;[m
[31m-    size_t                       len;[m
[31m-    size_t                       size;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          i;[m
[31m-    int                          nargs;[m
[31m-    int                          type;[m
[31m-    const char                  *msg;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    if (ctx->acquired_raw_req_socket) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "raw request socket acquired");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "header only");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->eof) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "seen eof");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-[m
[31m-        type = lua_type(L, i);[m
[31m-[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-[m
[31m-                lua_tolstring(L, i, &len);[m
[31m-                size += len;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-[m
[31m-                size += sizeof("nil") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-[m
[31m-                if (lua_toboolean(L, i)) {[m
[31m-                    size += sizeof("true") - 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    size += sizeof("false") - 1;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-[m
[31m-                size += ngx_http_lua_calc_strlen_in_table(L, i, i,[m
[31m-                                                          0 /* strict */);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-[m
[31m-                dd("userdata: %p", lua_touserdata(L, i));[m
[31m-[m
[31m-                if (lua_touserdata(L, i) == NULL) {[m
[31m-                    size += sizeof("null") - 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-[m
[31m-                msg = lua_pushfstring(L, "string, number, boolean, nil, "[m
[31m-                                      "ngx.null, or array table expected, "[m
[31m-                                      "but got %s", lua_typename(L, type));[m
[31m-[m
[31m-                return luaL_argerror(L, i, msg);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (newline) {[m
[31m-        size += sizeof("\n") - 1;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        rc = ngx_http_lua_send_header_if_needed(r, ctx);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "nginx output filter error");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        lua_pushinteger(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx->seen_body_data = 1;[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, size);[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-        type = lua_type(L, i);[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                p = lua_tolstring(L, i, &len);[m
[31m-                b->last = ngx_copy(b->last, (u_char *) p, len);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                *b->last++ = 'n';[m
[31m-                *b->last++ = 'i';[m
[31m-                *b->last++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, i)) {[m
[31m-                    *b->last++ = 't';[m
[31m-                    *b->last++ = 'r';[m
[31m-                    *b->last++ = 'u';[m
[31m-                    *b->last++ = 'e';[m
[31m-[m
[31m-                } else {[m
[31m-                    *b->last++ = 'f';[m
[31m-                    *b->last++ = 'a';[m
[31m-                    *b->last++ = 'l';[m
[31m-                    *b->last++ = 's';[m
[31m-                    *b->last++ = 'e';[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-                b->last = ngx_http_lua_copy_str_in_table(L, i, b->last);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-                *b->last++ = 'n';[m
[31m-                *b->last++ = 'u';[m
[31m-                *b->last++ = 'l';[m
[31m-                *b->last++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "impossible to reach here");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (newline) {[m
[31m-        *b->last++ = '\n';[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (b->last != b->end) {[m
[31m-        return luaL_error(L, "buffer error: %p != %p", b->last, b->end);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   newline ? "lua say response" : "lua print response");[m
[31m-[m
[31m-    rc = ngx_http_lua_send_chain_link(r, ctx, cl);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nginx output filter error");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    dd("downstream write: %d, buf len: %d", (int) rc,[m
[31m-       (int) (b->last - b->pos));[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_calc_strlen_in_table(lua_State *L, int index, int arg_i,[m
[31m-    unsigned strict)[m
[31m-{[m
[31m-    double              key;[m
[31m-    int                 max;[m
[31m-    int                 i;[m
[31m-    int                 type;[m
[31m-    size_t              size;[m
[31m-    size_t              len;[m
[31m-    const char         *msg;[m
[31m-[m
[31m-    if (index < 0) {[m
[31m-        index = lua_gettop(L) + index + 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("table index: %d", index);[m
[31m-[m
[31m-    max = 0;[m
[31m-[m
[31m-    lua_pushnil(L); /* stack: table key */[m
[31m-    while (lua_next(L, index) != 0) { /* stack: table key value */[m
[31m-        dd("key type: %s", luaL_typename(L, -2));[m
[31m-[m
[31m-        if (lua_type(L, -2) == LUA_TNUMBER) {[m
[31m-[m
[31m-            key = lua_tonumber(L, -2);[m
[31m-[m
[31m-            dd("key value: %d", (int) key);[m
[31m-[m
[31m-            if (floor(key) == key && key >= 1) {[m
[31m-                if (key > max) {[m
[31m-                    max = (int) key;[m
[31m-                }[m
[31m-[m
[31m-                lua_pop(L, 1); /* stack: table key */[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        /* not an array (non positive integer key) */[m
[31m-        lua_pop(L, 2); /* stack: table */[m
[31m-[m
[31m-        luaL_argerror(L, arg_i, "non-array table found");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (i = 1; i <= max; i++) {[m
[31m-        lua_rawgeti(L, index, i); /* stack: table value */[m
[31m-        type = lua_type(L, -1);[m
[31m-[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-[m
[31m-                lua_tolstring(L, -1, &len);[m
[31m-                size += len;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-[m
[31m-                if (strict) {[m
[31m-                    goto bad_type;[m
[31m-                }[m
[31m-[m
[31m-                size += sizeof("nil") - 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-[m
[31m-                if (strict) {[m
[31m-                    goto bad_type;[m
[31m-                }[m
[31m-[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    size += sizeof("true") - 1;[m
[31m-[m
[31m-                } else {[m
[31m-                    size += sizeof("false") - 1;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-[m
[31m-                size += ngx_http_lua_calc_strlen_in_table(L, -1, arg_i, strict);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-[m
[31m-                if (strict) {[m
[31m-                    goto bad_type;[m
[31m-                }[m
[31m-[m
[31m-                if (lua_touserdata(L, -1) == NULL) {[m
[31m-                    size += sizeof("null") - 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            default:[m
[31m-[m
[31m-bad_type:[m
[31m-[m
[31m-                msg = lua_pushfstring(L, "bad data type %s found",[m
[31m-                                      lua_typename(L, type));[m
[31m-                return luaL_argerror(L, arg_i, msg);[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1); /* stack: table */[m
[31m-    }[m
[31m-[m
[31m-    return size;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_lua_copy_str_in_table(lua_State *L, int index, u_char *dst)[m
[31m-{[m
[31m-    double               key;[m
[31m-    int                  max;[m
[31m-    int                  i;[m
[31m-    int                  type;[m
[31m-    size_t               len;[m
[31m-    u_char              *p;[m
[31m-[m
[31m-    if (index < 0) {[m
[31m-        index = lua_gettop(L) + index + 1;[m
[31m-    }[m
[31m-[m
[31m-    max = 0;[m
[31m-[m
[31m-    lua_pushnil(L); /* stack: table key */[m
[31m-    while (lua_next(L, index) != 0) { /* stack: table key value */[m
[31m-        key = lua_tonumber(L, -2);[m
[31m-        if (key > max) {[m
[31m-            max = (int) key;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1); /* stack: table key */[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i <= max; i++) {[m
[31m-        lua_rawgeti(L, index, i); /* stack: table value */[m
[31m-        type = lua_type(L, -1);[m
[31m-        switch (type) {[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                p = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-                dst = ngx_copy(dst, p, len);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                *dst++ = 'n';[m
[31m-                *dst++ = 'i';[m
[31m-                *dst++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    *dst++ = 't';[m
[31m-                    *dst++ = 'r';[m
[31m-                    *dst++ = 'u';[m
[31m-                    *dst++ = 'e';[m
[31m-[m
[31m-                } else {[m
[31m-                    *dst++ = 'f';[m
[31m-                    *dst++ = 'a';[m
[31m-                    *dst++ = 'l';[m
[31m-                    *dst++ = 's';[m
[31m-                    *dst++ = 'e';[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TTABLE:[m
[31m-                dst = ngx_http_lua_copy_str_in_table(L, -1, dst);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TLIGHTUSERDATA:[m
[31m-[m
[31m-                *dst++ = 'n';[m
[31m-                *dst++ = 'u';[m
[31m-                *dst++ = 'l';[m
[31m-                *dst++ = 'l';[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                luaL_error(L, "impossible to reach here");[m
[31m-                return NULL;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1); /* stack: table */[m
[31m-    }[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Force flush out response content[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_ngx_flush(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          n;[m
[31m-    unsigned                     wait = 0;[m
[31m-    ngx_event_t                 *wev;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n > 1) {[m
[31m-        return luaL_error(L, "attempt to pass %d arguments, but accepted 0 "[m
[31m-                          "or 1", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    if (n == 1 && r == r->main) {[m
[31m-        luaL_checktype(L, 1, LUA_TBOOLEAN);[m
[31m-        wait = lua_toboolean(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    if (ctx->acquired_raw_req_socket) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "raw request socket acquired");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "header only");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->eof) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "seen eof");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->buffering) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua http 1.0 buffering makes ngx.flush() a no-op");[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "buffering");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if ((!r->header_sent && !ctx->header_sent)[m
[31m-        || (!ctx->seen_body_data && !wait))[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nothing to flush");[m
[31m-        return 2;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    cl = ngx_http_lua_get_flush_chain(r, ctx);[m
[31m-    if (cl == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_send_chain_link(r, ctx, cl);[m
[31m-[m
[31m-    dd("send chain: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nginx output filter error");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    dd("wait:%d, rc:%d, buffered:0x%x", wait, (int) rc,[m
[31m-       r->connection->buffered);[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wait && (r->connection->buffered & NGX_HTTP_LOWLEVEL_BUFFERED[m
[31m-                 || wev->delayed))[m
[31m-    {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua flush requires waiting: buffered 0x%uxd, "[m
[31m-                       "delayed:%d", (unsigned) r->connection->buffered,[m
[31m-                       wev->delayed);[m
[31m-[m
[31m-        coctx->flushing = 1;[m
[31m-        ctx->flushing_coros++;[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            /* mimic ngx_http_set_write_handler */[m
[31m-            r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-        } else {[m
[31m-            r->write_event_handler = ngx_http_core_run_phases;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            if (wev->timer_set) {[m
[31m-                wev->delayed = 0;[m
[31m-                ngx_del_timer(wev);[m
[31m-            }[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "connection broken");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-        coctx->cleanup = ngx_http_lua_flush_cleanup;[m
[31m-        coctx->data = r;[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua flush asynchronously");[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Send last_buf, terminate output stream[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_ngx_eof(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_int_t                rc;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_gettop(L) != 0) {[m
[31m-        return luaL_error(L, "no argument is expected");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->acquired_raw_req_socket) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "raw request socket acquired");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->eof) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "seen eof");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua send eof");[m
[31m-[m
[31m-    rc = ngx_http_lua_send_chain_link(r, ctx, NULL /* indicate last_buf */);[m
[31m-[m
[31m-    dd("send chain: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nginx output filter error");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_output_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_send_headers);[m
[31m-    lua_setfield(L, -2, "send_headers");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_print);[m
[31m-    lua_setfield(L, -2, "print");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_say);[m
[31m-    lua_setfield(L, -2, "say");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_flush);[m
[31m-    lua_setfield(L, -2, "flush");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_eof);[m
[31m-    lua_setfield(L, -2, "eof");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Send out headers[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_ngx_send_headers(lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    if (!r->header_sent && !ctx->header_sent) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua send headers");[m
[31m-[m
[31m-        rc = ngx_http_lua_send_header_if_needed(r, ctx);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "nginx output filter error");[m
[31m-            return 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_flush_resume_helper(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ctx->cur_co_ctx->cleanup = NULL;[m
[31m-[m
[31m-    /* push the return values */[m
[31m-[m
[31m-    if (c->timedout) {[m
[31m-        lua_pushnil(ctx->cur_co_ctx->co);[m
[31m-        lua_pushliteral(ctx->cur_co_ctx->co, "timeout");[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else if (c->error) {[m
[31m-        lua_pushnil(ctx->cur_co_ctx->co);[m
[31m-        lua_pushliteral(ctx->cur_co_ctx->co, "client aborted");[m
[31m-        n = 2;[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushinteger(ctx->cur_co_ctx->co, 1);[m
[31m-        n = 1;[m
[31m-    }[m
[31m-[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, n);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc >= NGX_OK */[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_flush_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t                      *r;[m
[31m-    ngx_event_t                             *wev;[m
[31m-    ngx_http_lua_ctx_t                      *ctx;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    coctx->flushing = 0;[m
[31m-[m
[31m-    r = coctx->data;[m
[31m-    if (r == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    wev = r->connection->write;[m
[31m-[m
[31m-    if (wev && wev->timer_set) {[m
[31m-        ngx_del_timer(wev);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->flushing_coros--;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_output.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_output.h[m
[1mdeleted file mode 100644[m
[1mindex 109a4b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_output.h[m
[1m+++ /dev/null[m
[36m@@ -1,28 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_OUTPUT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_OUTPUT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_output_api(lua_State *L);[m
[31m-[m
[31m-size_t ngx_http_lua_calc_strlen_in_table(lua_State *L, int index, int arg_i,[m
[31m-    unsigned strict);[m
[31m-[m
[31m-u_char *ngx_http_lua_copy_str_in_table(lua_State *L, int index, u_char *dst);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_flush_resume_helper(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_OUTPUT_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.c[m
[1mdeleted file mode 100644[m
[1mindex 562847a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.c[m
[1m+++ /dev/null[m
[36m@@ -1,106 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "stdio.h"[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-static ngx_pool_t *ngx_http_lua_pcre_pool = NULL;[m
[31m-[m
[31m-static void *(*old_pcre_malloc)(size_t);[m
[31m-static void (*old_pcre_free)(void *ptr);[m
[31m-[m
[31m-[m
[31m-/* XXX: work-around to nginx regex subsystem, must init a memory pool[m
[31m- * to use PCRE functions. As PCRE still has memory-leaking problems,[m
[31m- * and nginx overwrote pcre_malloc/free hooks with its own static[m
[31m- * functions, so nobody else can reuse nginx regex subsystem... */[m
[31m-static void *[m
[31m-ngx_http_lua_pcre_malloc(size_t size)[m
[31m-{[m
[31m-    dd("lua pcre pool is %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    if (ngx_http_lua_pcre_pool) {[m
[31m-        return ngx_palloc(ngx_http_lua_pcre_pool, size);[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "error: lua pcre malloc failed due to empty pcre pool");[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_pcre_free(void *ptr)[m
[31m-{[m
[31m-    dd("lua pcre pool is %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    if (ngx_http_lua_pcre_pool) {[m
[31m-        ngx_pfree(ngx_http_lua_pcre_pool, ptr);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    fprintf(stderr, "error: lua pcre free failed due to empty pcre pool");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_pool_t *[m
[31m-ngx_http_lua_pcre_malloc_init(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_pool_t          *old_pool;[m
[31m-[m
[31m-    if (pcre_malloc != ngx_http_lua_pcre_malloc) {[m
[31m-[m
[31m-        dd("overriding nginx pcre malloc and free");[m
[31m-[m
[31m-        ngx_http_lua_pcre_pool = pool;[m
[31m-[m
[31m-        old_pcre_malloc = pcre_malloc;[m
[31m-        old_pcre_free = pcre_free;[m
[31m-[m
[31m-        pcre_malloc = ngx_http_lua_pcre_malloc;[m
[31m-        pcre_free = ngx_http_lua_pcre_free;[m
[31m-[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("lua pcre pool was %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_pool;[m
[31m-    ngx_http_lua_pcre_pool = pool;[m
[31m-[m
[31m-    dd("lua pcre pool is %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    return old_pool;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_pcre_malloc_done(ngx_pool_t *old_pool)[m
[31m-{[m
[31m-    dd("lua pcre pool was %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    ngx_http_lua_pcre_pool = old_pool;[m
[31m-[m
[31m-    dd("lua pcre pool is %p", ngx_http_lua_pcre_pool);[m
[31m-[m
[31m-    if (old_pool == NULL) {[m
[31m-        pcre_malloc = old_pcre_malloc;[m
[31m-        pcre_free = old_pcre_free;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-#endif /* NGX_PCRE */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.h[m
[1mdeleted file mode 100644[m
[1mindex 80f29f9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_pcrefix.h[m
[1m+++ /dev/null[m
[36m@@ -1,23 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_PCREFIX_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_PCREFIX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-ngx_pool_t *ngx_http_lua_pcre_malloc_init(ngx_pool_t *pool);[m
[31m-void ngx_http_lua_pcre_malloc_done(ngx_pool_t *old_pool);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_PCREFIX_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_phase.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_phase.c[m
[1mdeleted file mode 100644[m
[1mindex b8e936a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_phase.c[m
[1m+++ /dev/null[m
[36m@@ -1,102 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_phase.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_ctx.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_get_phase(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_get_phase(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    /* If we have no request object, assume we are called from the "init"[m
[31m-     * phase. */[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        lua_pushliteral(L, "init");[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    switch (ctx->context) {[m
[31m-    case NGX_HTTP_LUA_CONTEXT_INIT_WORKER:[m
[31m-        lua_pushliteral(L, "init_worker");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_SET:[m
[31m-        lua_pushliteral(L, "set");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_REWRITE:[m
[31m-        lua_pushliteral(L, "rewrite");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_ACCESS:[m
[31m-        lua_pushliteral(L, "access");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_CONTENT:[m
[31m-        lua_pushliteral(L, "content");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_LOG:[m
[31m-        lua_pushliteral(L, "log");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_HEADER_FILTER:[m
[31m-        lua_pushliteral(L, "header_filter");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_BODY_FILTER:[m
[31m-        lua_pushliteral(L, "body_filter");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_TIMER:[m
[31m-        lua_pushliteral(L, "timer");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_BALANCER:[m
[31m-        lua_pushliteral(L, "balancer");[m
[31m-        break;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CONTEXT_SSL_CERT:[m
[31m-        lua_pushliteral(L, "ssl_cert");[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        return luaL_error(L, "unknown phase: %d", (int) ctx->context);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_phase_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_get_phase);[m
[31m-    lua_setfield(L, -2, "get_phase");[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_phase.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_phase.h[m
[1mdeleted file mode 100644[m
[1mindex dcb670f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_phase.h[m
[1m+++ /dev/null[m
[36m@@ -1,13 +0,0 @@[m
[31m-#ifndef _NGX_HTTP_LUA_PHASE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_PHASE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_phase_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_PHASE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_probe.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_probe.h[m
[1mdeleted file mode 100644[m
[1mindex 37b2500..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_probe.h[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-/*[m
[31m- * automatically generated from the file dtrace/ngx_lua_provider.d by the[m
[31m- *  gen-dtrace-probe-header tool in the nginx-devel-utils project:[m
[31m- *  https://github.com/agentzh/nginx-devel-utils[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_PROBE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_PROBE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-[m
[31m-#include <ngx_dtrace_provider.h>[m
[31m-[m
[31m-#define ngx_http_lua_probe_info(s)                                           \[m
[31m-    NGINX_LUA_HTTP_LUA_INFO(s)[m
[31m-[m
[31m-#define ngx_http_lua_probe_register_preload_package(L, pkg)                  \[m
[31m-    NGINX_LUA_HTTP_LUA_REGISTER_PRELOAD_PACKAGE(L, pkg)[m
[31m-[m
[31m-#define ngx_http_lua_probe_req_socket_consume_preread(r, data, len)          \[m
[31m-    NGINX_LUA_HTTP_LUA_REQ_SOCKET_CONSUME_PREREAD(r, data, len)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_coroutine_create(r, parent, child)           \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_COROUTINE_CREATE(r, parent, child)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_coroutine_resume(r, parent, child)           \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_COROUTINE_RESUME(r, parent, child)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_coroutine_yield(r, parent, child)            \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_COROUTINE_YIELD(r, parent, child)[m
[31m-[m
[31m-#define ngx_http_lua_probe_thread_yield(r, L)                                \[m
[31m-    NGINX_LUA_HTTP_LUA_THREAD_YIELD(r, L)[m
[31m-[m
[31m-#define ngx_http_lua_probe_socket_tcp_send_start(r, u, data, len)            \[m
[31m-    NGINX_LUA_HTTP_LUA_SOCKET_TCP_SEND_START(r, u, data, len)[m
[31m-[m
[31m-#define ngx_http_lua_probe_socket_tcp_receive_done(r, u, data, len)          \[m
[31m-    NGINX_LUA_HTTP_LUA_SOCKET_TCP_RECEIVE_DONE(r, u, data, len)[m
[31m-[m
[31m-#define ngx_http_lua_probe_socket_tcp_setkeepalive_buf_unread(r, u, data, len)\[m
[31m-    NGINX_LUA_HTTP_LUA_SOCKET_TCP_SETKEEPALIVE_BUF_UNREAD(r, u, data, len)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_thread_spawn(r, creator, newthread)          \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_THREAD_SPAWN(r, creator, newthread)[m
[31m-[m
[31m-#define ngx_http_lua_probe_thread_delete(r, thread, ctx)                     \[m
[31m-    NGINX_LUA_HTTP_LUA_THREAD_DELETE(r, thread, ctx)[m
[31m-[m
[31m-#define ngx_http_lua_probe_run_posted_thread(r, thread, status)              \[m
[31m-    NGINX_LUA_HTTP_LUA_RUN_POSTED_THREAD(r, thread, status)[m
[31m-[m
[31m-#define ngx_http_lua_probe_coroutine_done(r, co, success)                    \[m
[31m-    NGINX_LUA_HTTP_LUA_COROUTINE_DONE(r, co, success)[m
[31m-[m
[31m-#define ngx_http_lua_probe_user_thread_wait(parent, child)                   \[m
[31m-    NGINX_LUA_HTTP_LUA_USER_THREAD_WAIT(parent, child)[m
[31m-[m
[31m-#else /* !(NGX_DTRACE) */[m
[31m-[m
[31m-#define ngx_http_lua_probe_info(s)[m
[31m-#define ngx_http_lua_probe_register_preload_package(L, pkg)[m
[31m-#define ngx_http_lua_probe_req_socket_consume_preread(r, data, len)[m
[31m-#define ngx_http_lua_probe_user_coroutine_create(r, parent, child)[m
[31m-#define ngx_http_lua_probe_user_coroutine_resume(r, parent, child)[m
[31m-#define ngx_http_lua_probe_user_coroutine_yield(r, parent, child)[m
[31m-#define ngx_http_lua_probe_thread_yield(r, L)[m
[31m-#define ngx_http_lua_probe_socket_tcp_send_start(r, u, data, len)[m
[31m-#define ngx_http_lua_probe_socket_tcp_receive_done(r, u, data, len)[m
[31m-#define ngx_http_lua_probe_socket_tcp_setkeepalive_buf_unread(r, u, data, len)[m
[31m-#define ngx_http_lua_probe_user_thread_spawn(r, creator, newthread)[m
[31m-#define ngx_http_lua_probe_thread_delete(r, thread, ctx)[m
[31m-#define ngx_http_lua_probe_run_posted_thread(r, thread, status)[m
[31m-#define ngx_http_lua_probe_coroutine_done(r, co, success)[m
[31m-#define ngx_http_lua_probe_user_thread_wait(parent, child)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_PROBE_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_regex.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_regex.c[m
[1mdeleted file mode 100644[m
[1mindex d882061..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_regex.c[m
[1m+++ /dev/null[m
[36m@@ -1,2486 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_script.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include <pcre.h>[m
[31m-[m
[31m-[m
[31m-#if (PCRE_MAJOR > 8) || (PCRE_MAJOR == 8 && PCRE_MINOR >= 21)[m
[31m-#   define LUA_HAVE_PCRE_JIT 1[m
[31m-#else[m
[31m-#   define LUA_HAVE_PCRE_JIT 0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if (PCRE_MAJOR >= 6)[m
[31m-#   define LUA_HAVE_PCRE_DFA 1[m
[31m-#else[m
[31m-#   define LUA_HAVE_PCRE_DFA 0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_LUA_RE_COMPILE_ONCE      (1<<0)[m
[31m-#define NGX_LUA_RE_MODE_DFA          (1<<1)[m
[31m-#define NGX_LUA_RE_MODE_JIT          (1<<2)[m
[31m-#define NGX_LUA_RE_MODE_DUPNAMES     (1<<3)[m
[31m-#define NGX_LUA_RE_NO_UTF8_CHECK     (1<<4)[m
[31m-[m
[31m-#define NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT (100)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-    ngx_pool_t                   *pool;[m
[31m-    u_char                       *name_table;[m
[31m-    int                           name_count;[m
[31m-    int                           name_entry_size;[m
[31m-#endif[m
[31m-[m
[31m-    int                           ncaptures;[m
[31m-    int                          *captures;[m
[31m-[m
[31m-    pcre                         *regex;[m
[31m-    pcre_extra                   *regex_sd;[m
[31m-[m
[31m-    ngx_http_lua_complex_value_t    *replace;[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-    /* only for (stap) debugging, and may be an invalid pointer */[m
[31m-    const u_char                 *pattern;[m
[31m-#endif[m
[31m-} ngx_http_lua_regex_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t     pattern;[m
[31m-    ngx_pool_t   *pool;[m
[31m-    ngx_int_t     options;[m
[31m-[m
[31m-    pcre         *regex;[m
[31m-    int           captures;[m
[31m-    ngx_str_t     err;[m
[31m-} ngx_http_lua_regex_compile_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_cleanup_pt     *cleanup;[m
[31m-    ngx_http_request_t      *request;[m
[31m-    pcre                    *regex;[m
[31m-    pcre_extra              *regex_sd;[m
[31m-    int                      ncaptures;[m
[31m-    int                     *captures;[m
[31m-    int                      captures_len;[m
[31m-    uint8_t                  flags;[m
[31m-} ngx_http_lua_regex_ctx_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_re_gmatch_iterator(lua_State *L);[m
[31m-static ngx_uint_t ngx_http_lua_ngx_re_parse_opts(lua_State *L,[m
[31m-    ngx_http_lua_regex_compile_t *re, ngx_str_t *opts, int narg);[m
[31m-static int ngx_http_lua_ngx_re_sub_helper(lua_State *L, unsigned global);[m
[31m-static int ngx_http_lua_ngx_re_match_helper(lua_State *L, int wantcaps);[m
[31m-static int ngx_http_lua_ngx_re_find(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_re_match(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_re_gmatch(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_re_sub(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_re_gsub(lua_State *L);[m
[31m-static void ngx_http_lua_regex_free_study_data(ngx_pool_t *pool,[m
[31m-    pcre_extra *sd);[m
[31m-static ngx_int_t ngx_http_lua_regex_compile(ngx_http_lua_regex_compile_t *rc);[m
[31m-static void ngx_http_lua_ngx_re_gmatch_cleanup(void *data);[m
[31m-static int ngx_http_lua_ngx_re_gmatch_gc(lua_State *L);[m
[31m-static void ngx_http_lua_re_collect_named_captures(lua_State *L,[m
[31m-    int res_tb_idx, u_char *name_table, int name_count, int name_entry_size,[m
[31m-    unsigned flags, ngx_str_t *subj);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_regex_exec(re, e, s, start, captures, size, opts)       \[m
[31m-    pcre_exec(re, e, (const char *) (s)->data, (s)->len, start, opts,        \[m
[31m-              captures, size)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_regex_dfa_exec(re, e, s, start, captures, size, ws,     \[m
[31m-                                    wscount, opts)                           \[m
[31m-    pcre_dfa_exec(re, e, (const char *) (s)->data, (s)->len, start, opts,    \[m
[31m-                  captures, size, ws, wscount)[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_match(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_ngx_re_match_helper(L, 1 /* want captures */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_find(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_ngx_re_match_helper(L, 0 /* want captures */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_match_helper(lua_State *L, int wantcaps)[m
[31m-{[m
[31m-    /* u_char                      *p; */[m
[31m-    int                          res_tb_idx = 0;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_str_t                    subj;[m
[31m-    ngx_str_t                    pat;[m
[31m-    ngx_str_t                    opts;[m
[31m-    ngx_http_lua_regex_t        *re;[m
[31m-    const char                  *msg;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-    int                          i;[m
[31m-    ngx_int_t                    pos = 0;[m
[31m-    int                          nargs;[m
[31m-    int                         *cap = NULL;[m
[31m-    int                          ovecsize;[m
[31m-    int                          has_ctx = 0;[m
[31m-    ngx_uint_t                   flags;[m
[31m-    ngx_pool_t                  *pool, *old_pool;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    u_char                       errstr[NGX_MAX_CONF_ERRSTR + 1];[m
[31m-    pcre_extra                  *sd = NULL;[m
[31m-    int                          name_entry_size = 0, name_count;[m
[31m-    u_char                      *name_table = NULL;[m
[31m-    int                          exec_opts;[m
[31m-    int                          group_id = 0;[m
[31m-[m
[31m-    ngx_http_lua_regex_compile_t      re_comp;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    if (nargs != 2 && nargs != 3 && nargs != 4 && nargs != 5) {[m
[31m-        return luaL_error(L, "expecting 2, 3, 4 or 5 arguments, "[m
[31m-                          "but got %d", nargs);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    subj.data = (u_char *) luaL_checklstring(L, 1, &subj.len);[m
[31m-    pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-[m
[31m-    ngx_memzero(&re_comp, sizeof(ngx_http_lua_regex_compile_t));[m
[31m-[m
[31m-    if (nargs >= 3) {[m
[31m-        opts.data = (u_char *) luaL_checklstring(L, 3, &opts.len);[m
[31m-[m
[31m-        if (nargs >= 4) {[m
[31m-            if (!lua_isnil(L, 4)) {[m
[31m-                luaL_checktype(L, 4, LUA_TTABLE);[m
[31m-                has_ctx = 1;[m
[31m-[m
[31m-                lua_getfield(L, 4, "pos");[m
[31m-                if (lua_isnumber(L, -1)) {[m
[31m-                    pos = (ngx_int_t) lua_tointeger(L, -1);[m
[31m-                    if (pos <= 0) {[m
[31m-                        pos = 0;[m
[31m-[m
[31m-                    } else {[m
[31m-                        pos--;  /* 1-based on the Lua land */[m
[31m-                    }[m
[31m-[m
[31m-                } else if (lua_isnil(L, -1)) {[m
[31m-                    pos = 0;[m
[31m-[m
[31m-                } else {[m
[31m-                    msg = lua_pushfstring(L, "bad pos field type in the ctx "[m
[31m-                                          "table argument: %s",[m
[31m-                                          luaL_typename(L, -1));[m
[31m-[m
[31m-                    return luaL_argerror(L, 4, msg);[m
[31m-                }[m
[31m-[m
[31m-                lua_pop(L, 1);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        opts.data = (u_char *) "";[m
[31m-        opts.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (nargs == 5) {[m
[31m-        if (wantcaps) {[m
[31m-            luaL_checktype(L, 5, LUA_TTABLE);[m
[31m-            res_tb_idx = 5;[m
[31m-[m
[31m-#if 0[m
[31m-            /* clear the Lua table */[m
[31m-            lua_pushnil(L);[m
[31m-            while (lua_next(L, res_tb_idx) != 0) {[m
[31m-                lua_pop(L, 1);[m
[31m-                lua_pushvalue(L, -1);[m
[31m-                lua_pushnil(L);[m
[31m-                lua_rawset(L, res_tb_idx);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-        } else {[m
[31m-            group_id =  luaL_checkint(L, 5);[m
[31m-            if (group_id < 0) {[m
[31m-                group_id = 0;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    re_comp.options = 0;[m
[31m-[m
[31m-    flags = ngx_http_lua_ngx_re_parse_opts(L, &re_comp, &opts, 3);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-        pool = lmcf->pool;[m
[31m-[m
[31m-        dd("server pool %p", lmcf->pool);[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-[m
[31m-        lua_pushliteral(L, "m");[m
[31m-        lua_pushvalue(L, 2); /* table regex */[m
[31m-[m
[31m-        dd("options size: %d", (int) sizeof(re_comp.options));[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) &re_comp.options, sizeof(re_comp.options));[m
[31m-                /* table regex opts */[m
[31m-[m
[31m-        lua_concat(L, 3); /* table key */[m
[31m-        lua_pushvalue(L, -1); /* table key key */[m
[31m-[m
[31m-        dd("regex cache key: %.*s", (int) (pat.len + sizeof(re_comp.options)),[m
[31m-           lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_rawget(L, -3); /* table key re */[m
[31m-        re = lua_touserdata(L, -1);[m
[31m-[m
[31m-        lua_pop(L, 1); /* table key */[m
[31m-[m
[31m-        if (re) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua regex cache hit for match regex \"%s\" with "[m
[31m-                           "options \"%s\"", pat.data, opts.data);[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-            dd("restoring regex %p, ncaptures %d,  captures %p", re->regex,[m
[31m-               re->ncaptures, re->captures);[m
[31m-[m
[31m-            re_comp.regex = re->regex;[m
[31m-            sd = re->regex_sd;[m
[31m-            re_comp.captures = re->ncaptures;[m
[31m-            cap = re->captures;[m
[31m-[m
[31m-            if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-                ovecsize = 2;[m
[31m-[m
[31m-            } else {[m
[31m-                ovecsize = (re->ncaptures + 1) * 3;[m
[31m-            }[m
[31m-[m
[31m-            goto exec;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua regex cache miss for match regex \"%s\" "[m
[31m-                       "with options \"%s\"", pat.data, opts.data);[m
[31m-[m
[31m-        if (lmcf->regex_cache_entries >= lmcf->regex_cache_max_entries) {[m
[31m-[m
[31m-            if (lmcf->regex_cache_entries == lmcf->regex_cache_max_entries) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "lua exceeding regex cache max entries (%i)",[m
[31m-                              lmcf->regex_cache_max_entries);[m
[31m-[m
[31m-                lmcf->regex_cache_entries++;[m
[31m-            }[m
[31m-[m
[31m-            pool = r->pool;[m
[31m-            flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        pool = r->pool;[m
[31m-    }[m
[31m-[m
[31m-    dd("pool %p, r pool %p", pool, r->pool);[m
[31m-[m
[31m-    re_comp.pattern = pat;[m
[31m-    re_comp.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    re_comp.err.data = errstr;[m
[31m-    re_comp.pool = pool;[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua compiling match regex \"%s\" with options \"%s\" "[m
[31m-                   "(compile once: %d) (dfa mode: %d) (jit mode: %d)",[m
[31m-                   pat.data, opts.data,[m
[31m-                   (flags & NGX_LUA_RE_COMPILE_ONCE) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_DFA) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_JIT) != 0);[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-    rc = ngx_http_lua_regex_compile(&re_comp);[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dd("compile failed");[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        if (!wantcaps) {[m
[31m-            lua_pushnil(L);[m
[31m-        }[m
[31m-        lua_pushlstring(L, (char *) re_comp.err.data, re_comp.err.len);[m
[31m-        return wantcaps ? 2 : 3;[m
[31m-    }[m
[31m-[m
[31m-#if (LUA_HAVE_PCRE_JIT)[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (sd != NULL) {[m
[31m-            int         jitted;[m
[31m-[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-            pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);[m
[31m-[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre JIT compiling result: %d", jitted);[m
[31m-        }[m
[31m-#   endif /* !(NGX_DEBUG) */[m
[31m-[m
[31m-    } else {[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, 0, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre_study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-    }[m
[31m-[m
[31m-#else  /* !(LUA_HAVE_PCRE_JIT) */[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "your pcre build does not have JIT support and "[m
[31m-                       "the \"j\" regex option is ignored");[m
[31m-    }[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (sd && lmcf->regex_match_limit > 0) {[m
[31m-        sd->flags |= PCRE_EXTRA_MATCH_LIMIT;[m
[31m-        sd->match_limit = lmcf->regex_match_limit;[m
[31m-    }[m
[31m-[m
[31m-    dd("compile done, captures %d", (int) re_comp.captures);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re_comp.captures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re_comp.captures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    dd("allocating cap with size: %d", (int) ovecsize);[m
[31m-[m
[31m-    cap = ngx_palloc(pool, ovecsize * sizeof(int));[m
[31m-[m
[31m-    if (cap == NULL) {[m
[31m-        flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua saving compiled regex (%d captures) into the cache "[m
[31m-                       "(entries %i)", re_comp.captures,[m
[31m-                       lmcf->regex_cache_entries);[m
[31m-[m
[31m-        re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));[m
[31m-        if (re == NULL) {[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        dd("saving regex %p, ncaptures %d,  captures %p", re_comp.regex,[m
[31m-           re_comp.captures, cap);[m
[31m-[m
[31m-        re->regex = re_comp.regex;[m
[31m-        re->regex_sd = sd;[m
[31m-        re->ncaptures = re_comp.captures;[m
[31m-        re->captures = cap;[m
[31m-        re->replace = NULL;[m
[31m-[m
[31m-        lua_pushlightuserdata(L, re); /* table key value */[m
[31m-        lua_rawset(L, -3); /* table */[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (lmcf) {[m
[31m-            lmcf->regex_cache_entries++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-exec:[m
[31m-[m
[31m-    if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMECOUNT,[m
[31m-                      &name_count) != 0)[m
[31m-    {[m
[31m-        msg = "cannot acquire named subpattern count";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMEENTRYSIZE,[m
[31m-                          &name_entry_size) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern entry size";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMETABLE,[m
[31m-                          &name_table) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern table";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_NO_UTF8_CHECK) {[m
[31m-        exec_opts = PCRE_NO_UTF8_CHECK;[m
[31m-[m
[31m-    } else {[m
[31m-        exec_opts = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_DFA[m
[31m-[m
[31m-        int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];[m
[31m-        rc = ngx_http_lua_regex_dfa_exec(re_comp.regex, sd, &subj,[m
[31m-                                         (int) pos, cap, ovecsize, ws,[m
[31m-                                         sizeof(ws)/sizeof(ws[0]), exec_opts);[m
[31m-[m
[31m-#else /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-        msg = "at least pcre 6.0 is required for the DFA mode";[m
[31m-        goto error;[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-    } else {[m
[31m-        rc = ngx_http_lua_regex_exec(re_comp.regex, sd, &subj, (int) pos, cap,[m
[31m-                                     ovecsize, exec_opts);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "regex \"%V\" not matched on string \"%V\" starting "[m
[31m-                       "from %i", &pat, &subj, pos);[m
[31m-[m
[31m-        if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-            if (sd) {[m
[31m-                ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc < 0) {[m
[31m-        msg = lua_pushfstring(L, ngx_regex_exec_n " failed: %d", (int) rc);[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-            rc = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            msg = "capture size too small";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("rc = %d", (int) rc);[m
[31m-[m
[31m-    if (has_ctx) { /* having ctx table */[m
[31m-        pos = cap[1];[m
[31m-        lua_pushinteger(L, (lua_Integer) (pos + 1));[m
[31m-        lua_setfield(L, 4, "pos");[m
[31m-    }[m
[31m-[m
[31m-    if (!wantcaps) {[m
[31m-        if (group_id > re_comp.captures) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "nth out of bound");[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        if (group_id >= rc) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushnil(L);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        {[m
[31m-            int     from, to;[m
[31m-[m
[31m-            from = cap[group_id * 2] + 1;[m
[31m-            to = cap[group_id * 2 + 1];[m
[31m-            if (from < 0 || to < 0) {[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushnil(L);[m
[31m-                return 2;[m
[31m-            }[m
[31m-[m
[31m-            lua_pushinteger(L, from);[m
[31m-            lua_pushinteger(L, to);[m
[31m-            return 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (res_tb_idx == 0) {[m
[31m-        lua_createtable(L, re_comp.captures || 1 /* narr */,[m
[31m-                        name_count /* nrec */);[m
[31m-        res_tb_idx = lua_gettop(L);[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0, n = 0; i <= re_comp.captures; i++, n += 2) {[m
[31m-        dd("capture %d: %d %d", i, cap[n], cap[n + 1]);[m
[31m-        if (i >= rc || cap[n] < 0) {[m
[31m-            lua_pushboolean(L, 0);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushlstring(L, (char *) &subj.data[cap[n]],[m
[31m-                            cap[n + 1] - cap[n]);[m
[31m-[m
[31m-            dd("pushing capture %s at %d", lua_tostring(L, -1), (int) i);[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, res_tb_idx, (int) i);[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        ngx_http_lua_re_collect_named_captures(L, res_tb_idx, name_table,[m
[31m-                                               name_count, name_entry_size,[m
[31m-                                               flags, &subj);[m
[31m-    }[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        ngx_pfree(pool, re_comp.regex);[m
[31m-        ngx_pfree(pool, cap);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (re_comp.regex) {[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-        }[m
[31m-[m
[31m-        if (cap) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    if (!wantcaps) {[m
[31m-        lua_pushnil(L);[m
[31m-    }[m
[31m-    lua_pushstring(L, msg);[m
[31m-    return wantcaps ? 2 : 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_gmatch(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_str_t                    subj;[m
[31m-    ngx_str_t                    pat;[m
[31m-    ngx_str_t                    opts;[m
[31m-    int                          ovecsize;[m
[31m-    ngx_http_lua_regex_t        *re;[m
[31m-    ngx_http_lua_regex_ctx_t    *ctx;[m
[31m-    const char                  *msg;[m
[31m-    int                          nargs;[m
[31m-    ngx_int_t                    flags;[m
[31m-    int                         *cap = NULL;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_pool_t                  *pool, *old_pool;[m
[31m-    u_char                       errstr[NGX_MAX_CONF_ERRSTR + 1];[m
[31m-    pcre_extra                  *sd = NULL;[m
[31m-    ngx_http_cleanup_t          *cln;[m
[31m-[m
[31m-    ngx_http_lua_regex_compile_t      re_comp;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    if (nargs != 2 && nargs != 3) {[m
[31m-        return luaL_error(L, "expecting two or three arguments, but got %d",[m
[31m-                          nargs);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    subj.data = (u_char *) luaL_checklstring(L, 1, &subj.len);[m
[31m-    pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-[m
[31m-    if (nargs == 3) {[m
[31m-        opts.data = (u_char *) luaL_checklstring(L, 3, &opts.len);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        opts.data = (u_char *) "";[m
[31m-        opts.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* stack: subj regex */[m
[31m-[m
[31m-    re_comp.options = 0;[m
[31m-[m
[31m-    flags = ngx_http_lua_ngx_re_parse_opts(L, &re_comp, &opts, 3);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-        pool = lmcf->pool;[m
[31m-[m
[31m-        dd("server pool %p", lmcf->pool);[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-[m
[31m-        lua_pushliteral(L, "m");[m
[31m-        lua_pushvalue(L, 2); /* table regex */[m
[31m-[m
[31m-        dd("options size: %d", (int) sizeof(re_comp.options));[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) &re_comp.options,[m
[31m-                        sizeof(re_comp.options)); /* table regex opts */[m
[31m-[m
[31m-        lua_concat(L, 3); /* table key */[m
[31m-        lua_pushvalue(L, -1); /* table key key */[m
[31m-[m
[31m-        dd("regex cache key: %.*s", (int) (pat.len + sizeof(re_comp.options)),[m
[31m-           lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_rawget(L, -3); /* table key re */[m
[31m-        re = lua_touserdata(L, -1);[m
[31m-[m
[31m-        lua_pop(L, 1); /* table key */[m
[31m-[m
[31m-        if (re) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua regex cache hit for match regex \"%s\" "[m
[31m-                           "with options \"%s\"", pat.data, opts.data);[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-            dd("restoring regex %p, ncaptures %d,  captures %p", re->regex,[m
[31m-               re->ncaptures, re->captures);[m
[31m-[m
[31m-            re_comp.regex = re->regex;[m
[31m-            sd = re->regex_sd;[m
[31m-            re_comp.captures = re->ncaptures;[m
[31m-            cap = re->captures;[m
[31m-[m
[31m-            if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-                ovecsize = 2;[m
[31m-[m
[31m-            } else {[m
[31m-                ovecsize = (re->ncaptures + 1) * 3;[m
[31m-            }[m
[31m-[m
[31m-            goto compiled;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua regex cache miss for match regex \"%s\" "[m
[31m-                       "with options \"%s\"", pat.data, opts.data);[m
[31m-[m
[31m-        if (lmcf->regex_cache_entries >= lmcf->regex_cache_max_entries) {[m
[31m-[m
[31m-            if (lmcf->regex_cache_entries == lmcf->regex_cache_max_entries) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "lua exceeding regex cache max entries (%i)",[m
[31m-                              lmcf->regex_cache_max_entries);[m
[31m-[m
[31m-                lmcf->regex_cache_entries++;[m
[31m-            }[m
[31m-[m
[31m-            pool = r->pool;[m
[31m-            flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        pool = r->pool;[m
[31m-    }[m
[31m-[m
[31m-    re_comp.pattern = pat;[m
[31m-    re_comp.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    re_comp.err.data = errstr;[m
[31m-    re_comp.pool = pool;[m
[31m-[m
[31m-    ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua compiling gmatch regex \"%s\" with options \"%s\" "[m
[31m-                   "(compile once: %d) (dfa mode: %d) (jit mode: %d)",[m
[31m-                   pat.data, opts.data,[m
[31m-                   (flags & NGX_LUA_RE_COMPILE_ONCE) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_DFA) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_JIT) != 0);[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-    rc = ngx_http_lua_regex_compile(&re_comp);[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dd("compile failed");[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushlstring(L, (char *) re_comp.err.data, re_comp.err.len);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_JIT[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre_study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (sd != NULL) {[m
[31m-            int         jitted;[m
[31m-[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-            pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);[m
[31m-[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre JIT compiling result: %d", jitted);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, 0, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-    }[m
[31m-[m
[31m-#else  /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "your pcre build does not have JIT support and "[m
[31m-                       "the \"j\" regex option is ignored");[m
[31m-    }[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (sd && lmcf->regex_match_limit > 0) {[m
[31m-        sd->flags |= PCRE_EXTRA_MATCH_LIMIT;[m
[31m-        sd->match_limit = lmcf->regex_match_limit;[m
[31m-    }[m
[31m-[m
[31m-    dd("compile done, captures %d", re_comp.captures);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re_comp.captures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re_comp.captures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    cap = ngx_palloc(pool, ovecsize * sizeof(int));[m
[31m-    if (cap == NULL) {[m
[31m-        flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua saving compiled regex (%d captures) into the cache "[m
[31m-                       "(entries %i)", re_comp.captures,[m
[31m-                       lmcf->regex_cache_entries);[m
[31m-[m
[31m-        re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));[m
[31m-        if (re == NULL) {[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        dd("saving regex %p, ncaptures %d,  captures %p", re_comp.regex,[m
[31m-           re_comp.captures, cap);[m
[31m-[m
[31m-        re->regex = re_comp.regex;[m
[31m-        re->regex_sd = sd;[m
[31m-        re->ncaptures = re_comp.captures;[m
[31m-        re->captures = cap;[m
[31m-        re->replace = NULL;[m
[31m-[m
[31m-        lua_pushlightuserdata(L, re); /* table key value */[m
[31m-        lua_rawset(L, -3); /* table */[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (lmcf) {[m
[31m-            lmcf->regex_cache_entries++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-compiled:[m
[31m-[m
[31m-    lua_settop(L, 1);[m
[31m-[m
[31m-    ctx = lua_newuserdata(L, sizeof(ngx_http_lua_regex_ctx_t));[m
[31m-[m
[31m-    ctx->request = r;[m
[31m-    ctx->regex = re_comp.regex;[m
[31m-    ctx->regex_sd = sd;[m
[31m-    ctx->ncaptures = re_comp.captures;[m
[31m-    ctx->captures = cap;[m
[31m-    ctx->captures_len = ovecsize;[m
[31m-    ctx->flags = (uint8_t) flags;[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-        lua_pushcfunction(L, ngx_http_lua_ngx_re_gmatch_gc);[m
[31m-        lua_setfield(L, -2, "__gc");[m
[31m-        lua_setmetatable(L, -2);[m
[31m-[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_ngx_re_gmatch_cleanup;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, 0);[m
[31m-[m
[31m-    /* upvalues in order: subj ctx offset */[m
[31m-    lua_pushcclosure(L, ngx_http_lua_ngx_re_gmatch_iterator, 3);[m
[31m-[m
[31m-    return 1;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (re_comp.regex) {[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-        }[m
[31m-[m
[31m-        if (cap) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushstring(L, msg);[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_gmatch_iterator(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_regex_ctx_t    *ctx;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                         *cap;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-    int                          i;[m
[31m-    ngx_str_t                    subj;[m
[31m-    int                          offset;[m
[31m-    const char                  *msg = NULL;[m
[31m-    int                          name_entry_size = 0, name_count;[m
[31m-    u_char                      *name_table = NULL;[m
[31m-    int                          exec_opts;[m
[31m-[m
[31m-    /* upvalues in order: subj ctx offset */[m
[31m-[m
[31m-    subj.data = (u_char *) lua_tolstring(L, lua_upvalueindex(1), &subj.len);[m
[31m-    ctx = (ngx_http_lua_regex_ctx_t *) lua_touserdata(L, lua_upvalueindex(2));[m
[31m-    offset = (int) lua_tointeger(L, lua_upvalueindex(3));[m
[31m-[m
[31m-    if (offset < 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    cap = ctx->captures;[m
[31m-[m
[31m-    dd("offset %d, r %p, subj %s", (int) offset, ctx->request, subj.data);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    if (r != ctx->request || r->pool != ctx->request->pool) {[m
[31m-        return luaL_error(L, "attempt to use ngx.re.gmatch iterator in a "[m
[31m-                          "request that did not create it");[m
[31m-    }[m
[31m-[m
[31m-    dd("regex exec...");[m
[31m-[m
[31m-    if (pcre_fullinfo(ctx->regex, NULL, PCRE_INFO_NAMECOUNT,[m
[31m-                      &name_count) != 0)[m
[31m-    {[m
[31m-        msg = "cannot acquire named subpattern count";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        if (pcre_fullinfo(ctx->regex, NULL, PCRE_INFO_NAMEENTRYSIZE,[m
[31m-                          &name_entry_size) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern entry size";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (pcre_fullinfo(ctx->regex, NULL, PCRE_INFO_NAMETABLE,[m
[31m-                          &name_table) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern table";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->flags & NGX_LUA_RE_NO_UTF8_CHECK) {[m
[31m-        exec_opts = PCRE_NO_UTF8_CHECK;[m
[31m-[m
[31m-    } else {[m
[31m-        exec_opts = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_DFA[m
[31m-[m
[31m-        int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];[m
[31m-[m
[31m-        rc = ngx_http_lua_regex_dfa_exec(ctx->regex, ctx->regex_sd, &subj,[m
[31m-                                         offset, cap, ctx->captures_len, ws,[m
[31m-                                         sizeof(ws)/sizeof(ws[0]), exec_opts);[m
[31m-[m
[31m-#else /* LUA_HAVE_PCRE_DFA */[m
[31m-        msg = "at least pcre 6.0 is required for the DFA mode";[m
[31m-        goto error;[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-    } else {[m
[31m-        rc = ngx_http_lua_regex_exec(ctx->regex, ctx->regex_sd, &subj,[m
[31m-                                     offset, cap, ctx->captures_len,[m
[31m-                                     exec_opts);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-        /* set upvalue "offset" to -1 */[m
[31m-        lua_pushinteger(L, -1);[m
[31m-        lua_replace(L, lua_upvalueindex(3));[m
[31m-[m
[31m-        if (!(ctx->flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-            if (ctx->regex_sd) {[m
[31m-                ngx_http_lua_regex_free_study_data(r->pool, ctx->regex_sd);[m
[31m-                ctx->regex_sd = NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(r->pool, cap);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc < 0) {[m
[31m-        msg = lua_pushfstring(L, ngx_regex_exec_n " failed: %d", (int) rc);[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        if (ctx->flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-            rc = 1;[m
[31m-[m
[31m-        } else {[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("rc = %d", (int) rc);[m
[31m-[m
[31m-    lua_createtable(L, ctx->ncaptures || 1 /* narr */, name_count /* nrec */);[m
[31m-[m
[31m-    for (i = 0, n = 0; i <= ctx->ncaptures; i++, n += 2) {[m
[31m-        dd("capture %d: %d %d", i, cap[n], cap[n + 1]);[m
[31m-        if (i >= rc || cap[n] < 0) {[m
[31m-            lua_pushboolean(L, 0);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushlstring(L, (char *) &subj.data[cap[n]],[m
[31m-                            cap[n + 1] - cap[n]);[m
[31m-[m
[31m-            dd("pushing capture %s at %d", lua_tostring(L, -1), (int) i);[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, -2, (int) i);[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        ngx_http_lua_re_collect_named_captures(L, lua_gettop(L), name_table,[m
[31m-                                               name_count, name_entry_size,[m
[31m-                                               ctx->flags, &subj);[m
[31m-    }[m
[31m-[m
[31m-    offset = cap[1];[m
[31m-    if (offset == cap[0]) {[m
[31m-        offset++;[m
[31m-    }[m
[31m-[m
[31m-    if (offset > (ssize_t) subj.len) {[m
[31m-        offset = -1;[m
[31m-[m
[31m-        if (!(ctx->flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-            if (ctx->regex_sd) {[m
[31m-                ngx_http_lua_regex_free_study_data(r->pool, ctx->regex_sd);[m
[31m-                ctx->regex_sd = NULL;[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(r->pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, offset);[m
[31m-    lua_replace(L, lua_upvalueindex(3));[m
[31m-[m
[31m-    return 1;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    lua_pushinteger(L, -1);[m
[31m-    lua_replace(L, lua_upvalueindex(3));[m
[31m-[m
[31m-    if (!(ctx->flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (ctx->regex_sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(r->pool, ctx->regex_sd);[m
[31m-            ctx->regex_sd = NULL;[m
[31m-        }[m
[31m-[m
[31m-        ngx_pfree(r->pool, cap);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushstring(L, msg);[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_uint_t[m
[31m-ngx_http_lua_ngx_re_parse_opts(lua_State *L, ngx_http_lua_regex_compile_t *re,[m
[31m-    ngx_str_t *opts, int narg)[m
[31m-{[m
[31m-    u_char          *p;[m
[31m-    const char      *msg;[m
[31m-    ngx_uint_t       flags;[m
[31m-[m
[31m-    flags = 0;[m
[31m-    p = opts->data;[m
[31m-[m
[31m-    while (*p != '\0') {[m
[31m-        switch (*p) {[m
[31m-            case 'i':[m
[31m-                re->options |= NGX_REGEX_CASELESS;[m
[31m-                break;[m
[31m-[m
[31m-            case 's':[m
[31m-                re->options |= PCRE_DOTALL;[m
[31m-                break;[m
[31m-[m
[31m-            case 'm':[m
[31m-                re->options |= PCRE_MULTILINE;[m
[31m-                break;[m
[31m-[m
[31m-            case 'u':[m
[31m-                re->options |= PCRE_UTF8;[m
[31m-                break;[m
[31m-[m
[31m-            case 'U':[m
[31m-                re->options |= PCRE_UTF8;[m
[31m-                flags |= NGX_LUA_RE_NO_UTF8_CHECK;[m
[31m-                break;[m
[31m-[m
[31m-            case 'x':[m
[31m-                re->options |= PCRE_EXTENDED;[m
[31m-                break;[m
[31m-[m
[31m-            case 'o':[m
[31m-                flags |= NGX_LUA_RE_COMPILE_ONCE;[m
[31m-                break;[m
[31m-[m
[31m-            case 'j':[m
[31m-                flags |= NGX_LUA_RE_MODE_JIT;[m
[31m-                break;[m
[31m-[m
[31m-            case 'd':[m
[31m-                flags |= NGX_LUA_RE_MODE_DFA;[m
[31m-                break;[m
[31m-[m
[31m-            case 'a':[m
[31m-                re->options |= PCRE_ANCHORED;[m
[31m-                break;[m
[31m-[m
[31m-#if (PCRE_MAJOR > 8) || (PCRE_MAJOR == 8 && PCRE_MINOR >= 12)[m
[31m-            case 'D':[m
[31m-                re->options |= PCRE_DUPNAMES;[m
[31m-                flags |= NGX_LUA_RE_MODE_DUPNAMES;[m
[31m-                break;[m
[31m-[m
[31m-            case 'J':[m
[31m-                re->options |= PCRE_JAVASCRIPT_COMPAT;[m
[31m-                break;[m
[31m-#endif[m
[31m-[m
[31m-            default:[m
[31m-                msg = lua_pushfstring(L, "unknown flag \"%c\" (flags \"%s\")",[m
[31m-                                      *p, opts->data);[m
[31m-                return luaL_argerror(L, narg, msg);[m
[31m-        }[m
[31m-[m
[31m-        p++;[m
[31m-    }[m
[31m-[m
[31m-    /* pcre does not support JIT for DFA mode yet,[m
[31m-     * so if DFA mode is specified, we turn off JIT automatically[m
[31m-     * */[m
[31m-    if ((flags & NGX_LUA_RE_MODE_JIT) && (flags & NGX_LUA_RE_MODE_DFA)) {[m
[31m-        flags &= ~NGX_LUA_RE_MODE_JIT;[m
[31m-    }[m
[31m-[m
[31m-    return flags;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_sub(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_ngx_re_sub_helper(L, 0 /* global */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_gsub(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_ngx_re_sub_helper(L, 1 /* global */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_sub_helper(lua_State *L, unsigned global)[m
[31m-{[m
[31m-    ngx_http_lua_regex_t        *re;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_str_t                    subj;[m
[31m-    ngx_str_t                    pat;[m
[31m-    ngx_str_t                    opts;[m
[31m-    ngx_str_t                    tpl;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    ngx_pool_t                  *pool, *old_pool;[m
[31m-    const char                  *msg;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_uint_t                   n;[m
[31m-    ngx_int_t                    i;[m
[31m-    int                          nargs;[m
[31m-    int                         *cap = NULL;[m
[31m-    int                          ovecsize;[m
[31m-    int                          type;[m
[31m-    unsigned                     func;[m
[31m-    int                          offset;[m
[31m-    int                          cp_offset;[m
[31m-    size_t                       count;[m
[31m-    luaL_Buffer                  luabuf;[m
[31m-    ngx_int_t                    flags;[m
[31m-    u_char                      *p;[m
[31m-    u_char                       errstr[NGX_MAX_CONF_ERRSTR + 1];[m
[31m-    pcre_extra                  *sd = NULL;[m
[31m-    int                          name_entry_size = 0, name_count;[m
[31m-    u_char                      *name_table = NULL;[m
[31m-    int                          exec_opts;[m
[31m-[m
[31m-    ngx_http_lua_regex_compile_t               re_comp;[m
[31m-    ngx_http_lua_complex_value_t              *ctpl = NULL;[m
[31m-    ngx_http_lua_compile_complex_value_t       ccv;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    if (nargs != 3 && nargs != 4) {[m
[31m-        return luaL_error(L, "expecting three or four arguments, but got %d",[m
[31m-                          nargs);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    subj.data = (u_char *) luaL_checklstring(L, 1, &subj.len);[m
[31m-    pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-[m
[31m-    func = 0;[m
[31m-[m
[31m-    type = lua_type(L, 3);[m
[31m-    switch (type) {[m
[31m-        case LUA_TFUNCTION:[m
[31m-            func = 1;[m
[31m-            tpl.len = 0;[m
[31m-            tpl.data = (u_char *) "";[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            tpl.data = (u_char *) lua_tolstring(L, 3, &tpl.len);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "string, number, or function expected, "[m
[31m-                                  "got %s", lua_typename(L, type));[m
[31m-            return luaL_argerror(L, 3, msg);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&re_comp, sizeof(ngx_http_lua_regex_compile_t));[m
[31m-[m
[31m-    if (nargs == 4) {[m
[31m-        opts.data = (u_char *) luaL_checklstring(L, 4, &opts.len);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else { /* nargs == 3 */[m
[31m-        opts.data = (u_char *) "";[m
[31m-        opts.len = 0;[m
[31m-    }[m
[31m-[m
[31m-    /* stack: subj regex repl */[m
[31m-[m
[31m-    re_comp.options = 0;[m
[31m-[m
[31m-    flags = ngx_http_lua_ngx_re_parse_opts(L, &re_comp, &opts, 4);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-        pool = lmcf->pool;[m
[31m-[m
[31m-        dd("server pool %p", lmcf->pool);[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-[m
[31m-        lua_pushliteral(L, "s");[m
[31m-        lua_pushinteger(L, tpl.len);[m
[31m-        lua_pushliteral(L, ":");[m
[31m-        lua_pushvalue(L, 2);[m
[31m-[m
[31m-        if (tpl.len != 0) {[m
[31m-            lua_pushvalue(L, 3);[m
[31m-        }[m
[31m-[m
[31m-        dd("options size: %d", (int) sizeof(re_comp.options));[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) &re_comp.options, sizeof(re_comp.options));[m
[31m-                /* table regex opts */[m
[31m-[m
[31m-        if (tpl.len == 0) {[m
[31m-            lua_concat(L, 5); /* table key */[m
[31m-[m
[31m-        } else {[m
[31m-            lua_concat(L, 6); /* table key */[m
[31m-        }[m
[31m-[m
[31m-        lua_pushvalue(L, -1); /* table key key */[m
[31m-[m
[31m-        dd("regex cache key: %.*s", (int) (pat.len + sizeof(re_comp.options)),[m
[31m-           lua_tostring(L, -1));[m
[31m-[m
[31m-        lua_rawget(L, -3); /* table key re */[m
[31m-        re = lua_touserdata(L, -1);[m
[31m-[m
[31m-        lua_pop(L, 1); /* table key */[m
[31m-[m
[31m-        if (re) {[m
[31m-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua regex cache hit for sub regex \"%s\" with "[m
[31m-                           "options \"%s\" and replace \"%s\"",[m
[31m-                           pat.data, opts.data,[m
[31m-                           func ? (u_char *) "<func>" : tpl.data);[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-            dd("restoring regex %p, ncaptures %d,  captures %p", re->regex,[m
[31m-               re->ncaptures, re->captures);[m
[31m-[m
[31m-            re_comp.regex = re->regex;[m
[31m-            sd = re->regex_sd;[m
[31m-            re_comp.captures = re->ncaptures;[m
[31m-            cap = re->captures;[m
[31m-            ctpl = re->replace;[m
[31m-[m
[31m-            if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-                ovecsize = 2;[m
[31m-[m
[31m-            } else {[m
[31m-                ovecsize = (re->ncaptures + 1) * 3;[m
[31m-            }[m
[31m-[m
[31m-            goto exec;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua regex cache miss for %ssub regex \"%s\" with "[m
[31m-                       "options \"%s\" and replace \"%s\"",[m
[31m-                       global ? "g" : "", pat.data, opts.data,[m
[31m-                       func ? (u_char *) "<func>" : tpl.data);[m
[31m-[m
[31m-        if (lmcf->regex_cache_entries >= lmcf->regex_cache_max_entries) {[m
[31m-[m
[31m-            if (lmcf->regex_cache_entries == lmcf->regex_cache_max_entries) {[m
[31m-                ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                              "lua exceeding regex cache max entries (%i)",[m
[31m-                              lmcf->regex_cache_max_entries);[m
[31m-[m
[31m-                lmcf->regex_cache_entries++;[m
[31m-            }[m
[31m-[m
[31m-            pool = r->pool;[m
[31m-            flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        pool = r->pool;[m
[31m-    }[m
[31m-[m
[31m-    re_comp.pattern = pat;[m
[31m-    re_comp.err.len = NGX_MAX_CONF_ERRSTR;[m
[31m-    re_comp.err.data = errstr;[m
[31m-    re_comp.pool = pool;[m
[31m-[m
[31m-    dd("compiling regex");[m
[31m-[m
[31m-    ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua compiling %ssub regex \"%s\" with options \"%s\" "[m
[31m-                   "(compile once: %d) (dfa mode: %d) (jit mode: %d)",[m
[31m-                   global ? "g" : "", pat.data, opts.data,[m
[31m-                   (flags & NGX_LUA_RE_COMPILE_ONCE) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_DFA) != 0,[m
[31m-                   (flags & NGX_LUA_RE_MODE_JIT) != 0);[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-    rc = ngx_http_lua_regex_compile(&re_comp);[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dd("compile failed");[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushlstring(L, (char *) re_comp.err.data, re_comp.err.len);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_JIT[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (sd != NULL) {[m
[31m-            int         jitted;[m
[31m-[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-            pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);[m
[31m-[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre JIT compiling result: %d", jitted);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-        sd = pcre_study(re_comp.regex, 0, &msg);[m
[31m-[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        dd("sd = %p", sd);[m
[31m-[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "pcre_study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-#   endif /* NGX_DEBUG */[m
[31m-    }[m
[31m-[m
[31m-#else  /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "your pcre build does not have JIT support and "[m
[31m-                       "the \"j\" regex option is ignored");[m
[31m-    }[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    if (sd && lmcf->regex_match_limit > 0) {[m
[31m-        sd->flags |= PCRE_EXTRA_MATCH_LIMIT;[m
[31m-        sd->match_limit = lmcf->regex_match_limit;[m
[31m-    }[m
[31m-[m
[31m-    dd("compile done, captures %d", re_comp.captures);[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re_comp.captures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re_comp.captures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    cap = ngx_palloc(pool, ovecsize * sizeof(int));[m
[31m-    if (cap == NULL) {[m
[31m-        flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (func) {[m
[31m-        ctpl = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        ctpl = ngx_palloc(pool, sizeof(ngx_http_lua_complex_value_t));[m
[31m-        if (ctpl == NULL) {[m
[31m-            flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if ((flags & NGX_LUA_RE_COMPILE_ONCE) && tpl.len != 0) {[m
[31m-            /* copy the string buffer pointed to by tpl.data from Lua VM */[m
[31m-            p = ngx_palloc(pool, tpl.len + 1);[m
[31m-            if (p == NULL) {[m
[31m-                flags &= ~NGX_LUA_RE_COMPILE_ONCE;[m
[31m-                msg = "no memory";[m
[31m-                goto error;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(p, tpl.data, tpl.len);[m
[31m-            p[tpl.len] = '\0';[m
[31m-[m
[31m-            tpl.data = p;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_lua_compile_complex_value_t));[m
[31m-        ccv.pool = pool;[m
[31m-        ccv.log = r->connection->log;[m
[31m-        ccv.value = &tpl;[m
[31m-        ccv.complex_value = ctpl;[m
[31m-[m
[31m-        if (ngx_http_lua_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-            ngx_pfree(pool, ctpl);[m
[31m-[m
[31m-            if ((flags & NGX_LUA_RE_COMPILE_ONCE) && tpl.len != 0) {[m
[31m-                ngx_pfree(pool, tpl.data);[m
[31m-            }[m
[31m-[m
[31m-            if (sd) {[m
[31m-                ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-            }[m
[31m-[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "failed to compile the replacement template");[m
[31m-            return 3;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_COMPILE_ONCE) {[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua saving compiled sub regex (%d captures) into "[m
[31m-                       "the cache (entries %i)", re_comp.captures,[m
[31m-                       lmcf->regex_cache_entries);[m
[31m-[m
[31m-        re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));[m
[31m-        if (re == NULL) {[m
[31m-            msg = "no memory";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        dd("saving regex %p, ncaptures %d,  captures %p", re_comp.regex,[m
[31m-           re_comp.captures, cap);[m
[31m-[m
[31m-        re->regex = re_comp.regex;[m
[31m-        re->regex_sd = sd;[m
[31m-        re->ncaptures = re_comp.captures;[m
[31m-        re->captures = cap;[m
[31m-        re->replace = ctpl;[m
[31m-[m
[31m-        lua_pushlightuserdata(L, re); /* table key value */[m
[31m-        lua_rawset(L, -3); /* table */[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-        if (lmcf) {[m
[31m-            lmcf->regex_cache_entries++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-exec:[m
[31m-[m
[31m-    count = 0;[m
[31m-    offset = 0;[m
[31m-    cp_offset = 0;[m
[31m-[m
[31m-    if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMECOUNT,[m
[31m-                      &name_count) != 0)[m
[31m-    {[m
[31m-        msg = "cannot acquire named subpattern count";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (name_count > 0) {[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMEENTRYSIZE,[m
[31m-                          &name_entry_size) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern entry size";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMETABLE,[m
[31m-                          &name_table) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern table";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_NO_UTF8_CHECK) {[m
[31m-        exec_opts = PCRE_NO_UTF8_CHECK;[m
[31m-[m
[31m-    } else {[m
[31m-        exec_opts = 0;[m
[31m-    }[m
[31m-[m
[31m-    for (;;) {[m
[31m-        if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_DFA[m
[31m-[m
[31m-            int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];[m
[31m-            rc = ngx_http_lua_regex_dfa_exec(re_comp.regex, sd, &subj,[m
[31m-                                             offset, cap, ovecsize, ws,[m
[31m-                                             sizeof(ws)/sizeof(ws[0]),[m
[31m-                                             exec_opts);[m
[31m-[m
[31m-#else /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-            msg = "at least pcre 6.0 is required for the DFA mode";[m
[31m-            goto error;[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-        } else {[m
[31m-            rc = ngx_http_lua_regex_exec(re_comp.regex, sd, &subj, offset, cap,[m
[31m-                                         ovecsize, exec_opts);[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_REGEX_NO_MATCHED) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (rc < 0) {[m
[31m-            msg = lua_pushfstring(L, ngx_regex_exec_n " failed: %d",[m
[31m-                                  (int) rc);[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-                rc = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                msg = "capture size too small";[m
[31m-                goto error;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        dd("rc = %d", (int) rc);[m
[31m-[m
[31m-        count++;[m
[31m-[m
[31m-        if (count == 1) {[m
[31m-            luaL_buffinit(L, &luabuf);[m
[31m-        }[m
[31m-[m
[31m-        if (func) {[m
[31m-            lua_pushvalue(L, 3);[m
[31m-[m
[31m-            lua_createtable(L, re_comp.captures || 1 /* narr */,[m
[31m-                            name_count /* nrec */);[m
[31m-[m
[31m-            for (i = 0, n = 0; i <= re_comp.captures; i++, n += 2) {[m
[31m-                dd("capture %d: %d %d", (int) i, cap[n], cap[n + 1]);[m
[31m-                if (i >= rc || cap[n] < 0) {[m
[31m-                    lua_pushboolean(L, 0);[m
[31m-[m
[31m-                } else {[m
[31m-                    lua_pushlstring(L, (char *) &subj.data[cap[n]],[m
[31m-                                    cap[n + 1] - cap[n]);[m
[31m-[m
[31m-                    dd("pushing capture %s at %d", lua_tostring(L, -1),[m
[31m-                       (int) i);[m
[31m-                }[m
[31m-[m
[31m-                lua_rawseti(L, -2, (int) i);[m
[31m-            }[m
[31m-[m
[31m-            if (name_count > 0) {[m
[31m-                ngx_http_lua_re_collect_named_captures(L, lua_gettop(L),[m
[31m-                                                       name_table,[m
[31m-                                                       name_count,[m
[31m-                                                       name_entry_size,[m
[31m-                                                       flags, &subj);[m
[31m-            }[m
[31m-[m
[31m-            dd("stack size at call: %d", lua_gettop(L));[m
[31m-[m
[31m-            lua_call(L, 1 /* nargs */, 1 /* nresults */);[m
[31m-            type = lua_type(L, -1);[m
[31m-            switch (type) {[m
[31m-                case LUA_TNUMBER:[m
[31m-                case LUA_TSTRING:[m
[31m-                    tpl.data = (u_char *) lua_tolstring(L, -1, &tpl.len);[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    msg = lua_pushfstring(L, "string or number expected to be "[m
[31m-                                          "returned by the replace "[m
[31m-                                          "function, got %s",[m
[31m-                                          lua_typename(L, type));[m
[31m-                    return luaL_argerror(L, 3, msg);[m
[31m-            }[m
[31m-[m
[31m-            lua_insert(L, 1);[m
[31m-[m
[31m-            luaL_addlstring(&luabuf, (char *) &subj.data[cp_offset],[m
[31m-                            cap[0] - cp_offset);[m
[31m-[m
[31m-            luaL_addlstring(&luabuf, (char *) tpl.data, tpl.len);[m
[31m-[m
[31m-            lua_remove(L, 1);[m
[31m-[m
[31m-            cp_offset = cap[1];[m
[31m-            offset = cp_offset;[m
[31m-            if (offset == cap[0]) {[m
[31m-                offset++;[m
[31m-                if (offset > (ssize_t) subj.len) {[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (global) {[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_lua_complex_value(r, &subj, cp_offset, rc, cap, ctpl,[m
[31m-                                        &luabuf);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            msg = lua_pushfstring(L, "failed to eval the template for "[m
[31m-                                  "replacement: \"%s\"", tpl.data);[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        cp_offset = cap[1];[m
[31m-        offset = cp_offset;[m
[31m-        if (offset == cap[0]) {[m
[31m-            offset++;[m
[31m-            if (offset > (ssize_t) subj.len) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (global) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (count == 0) {[m
[31m-        dd("no match, just the original subject");[m
[31m-        lua_settop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        if (offset < (int) subj.len) {[m
[31m-            dd("adding trailer: %s (len %d)", &subj.data[cp_offset],[m
[31m-               (int) (subj.len - cp_offset));[m
[31m-[m
[31m-[m
[31m-            luaL_addlstring(&luabuf, (char *) &subj.data[cp_offset],[m
[31m-                            subj.len - cp_offset);[m
[31m-        }[m
[31m-[m
[31m-        luaL_pushresult(&luabuf);[m
[31m-[m
[31m-        dd("the dst string: %s", lua_tostring(L, -1));[m
[31m-    }[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (re_comp.regex) {[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-        }[m
[31m-[m
[31m-        if (ctpl) {[m
[31m-            ngx_pfree(pool, ctpl);[m
[31m-        }[m
[31m-[m
[31m-        if (cap) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, count);[m
[31m-    return 2;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {[m
[31m-        if (sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (re_comp.regex) {[m
[31m-            ngx_pfree(pool, re_comp.regex);[m
[31m-        }[m
[31m-[m
[31m-        if (ctpl) {[m
[31m-            ngx_pfree(pool, ctpl);[m
[31m-        }[m
[31m-[m
[31m-        if (cap) {[m
[31m-            ngx_pfree(pool, cap);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushstring(L, msg);[m
[31m-    return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_regex_api(lua_State *L)[m
[31m-{[m
[31m-    /* ngx.re */[m
[31m-[m
[31m-    lua_createtable(L, 0, 5 /* nrec */);    /* .re */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_find);[m
[31m-    lua_setfield(L, -2, "find");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_match);[m
[31m-    lua_setfield(L, -2, "match");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_gmatch);[m
[31m-    lua_setfield(L, -2, "gmatch");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_sub);[m
[31m-    lua_setfield(L, -2, "sub");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_re_gsub);[m
[31m-    lua_setfield(L, -2, "gsub");[m
[31m-[m
[31m-    lua_setfield(L, -2, "re");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_regex_free_study_data(ngx_pool_t *pool, pcre_extra *sd)[m
[31m-{[m
[31m-    ngx_pool_t              *old_pool;[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_JIT[m
[31m-    pcre_free_study(sd);[m
[31m-#else[m
[31m-    pcre_free(sd);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_regex_compile(ngx_http_lua_regex_compile_t *rc)[m
[31m-{[m
[31m-    int           n, erroff;[m
[31m-    char         *p;[m
[31m-    const char   *errstr;[m
[31m-    pcre         *re;[m
[31m-    ngx_pool_t   *old_pool;[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(rc->pool);[m
[31m-[m
[31m-    re = pcre_compile((const char *) rc->pattern.data, (int) rc->options,[m
[31m-                      &errstr, &erroff, NULL);[m
[31m-[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (re == NULL) {[m
[31m-        if ((size_t) erroff == rc->pattern.len) {[m
[31m-            rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                                       "pcre_compile() failed: %s in \"%V\"",[m
[31m-                                      errstr, &rc->pattern)[m
[31m-                         - rc->err.data;[m
[31m-[m
[31m-        } else {[m
[31m-            rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,[m
[31m-                                       "pcre_compile() failed: %s in \"%V\" "[m
[31m-                                       "at \"%s\"", errstr, &rc->pattern,[m
[31m-                                       rc->pattern.data + erroff)[m
[31m-                         - rc->err.data;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc->regex = re;[m
[31m-[m
[31m-#if 1[m
[31m-    n = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &rc->captures);[m
[31m-    if (n < 0) {[m
[31m-        p = "pcre_fullinfo(\"%V\", PCRE_INFO_CAPTURECOUNT) failed: %d";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, p, &rc->pattern, n)[m
[31m-                  - rc->err.data;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ngx_re_gmatch_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_regex_ctx_t    *ctx = data;[m
[31m-[m
[31m-    if (ctx) {[m
[31m-        if (ctx->regex_sd) {[m
[31m-            ngx_http_lua_regex_free_study_data(ctx->request->pool,[m
[31m-                                               ctx->regex_sd);[m
[31m-            ctx->regex_sd = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->cleanup) {[m
[31m-            *ctx->cleanup = NULL;[m
[31m-            ctx->cleanup = NULL;[m
[31m-        }[m
[31m-[m
[31m-        ctx->request = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_re_gmatch_gc(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_regex_ctx_t    *ctx;[m
[31m-[m
[31m-    ctx = lua_touserdata(L, 1);[m
[31m-[m
[31m-    if (ctx && ctx->cleanup) {[m
[31m-        ngx_http_lua_ngx_re_gmatch_cleanup(ctx);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_re_collect_named_captures(lua_State *L, int res_tb_idx,[m
[31m-    u_char *name_table, int name_count, int name_entry_size, unsigned flags,[m
[31m-    ngx_str_t *subj)[m
[31m-{[m
[31m-    int              i, n;[m
[31m-    size_t           len;[m
[31m-    u_char          *name_entry;[m
[31m-    char            *name;[m
[31m-[m
[31m-    for (i = 0; i < name_count; i++) {[m
[31m-        dd("top: %d", lua_gettop(L));[m
[31m-[m
[31m-        name_entry = &name_table[i * name_entry_size];[m
[31m-        n = (name_entry[0] << 8) | name_entry[1];[m
[31m-        name = (char *) &name_entry[2];[m
[31m-[m
[31m-        lua_rawgeti(L, -1, n);[m
[31m-        if (lua_isnil(L, -1)) {[m
[31m-            lua_pop(L, 1);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (flags & NGX_LUA_RE_MODE_DUPNAMES) {[m
[31m-            /* unmatched groups are not stored in tables in DUPNAMES mode */[m
[31m-            if (!lua_toboolean(L, -1)) {[m
[31m-                lua_pop(L, 1);[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            lua_getfield(L, -2, name); /* big_tb cap small_tb */[m
[31m-[m
[31m-            if (lua_isnil(L, -1)) {[m
[31m-                lua_pop(L, 1);[m
[31m-[m
[31m-                /* assuming named submatches are usually unique */[m
[31m-                lua_createtable(L, 1 /* narr */, 0 /* nrec */);[m
[31m-                lua_pushstring(L, name);[m
[31m-                lua_pushvalue(L, -2); /* big_tb cap small_tb key small_tb */[m
[31m-                lua_rawset(L, res_tb_idx); /* big_tb cap small_tb */[m
[31m-                len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                len = lua_objlen(L, -1);[m
[31m-            }[m
[31m-[m
[31m-            lua_pushvalue(L, -2); /* big_tb cap small_tb cap */[m
[31m-            lua_rawseti(L, -2, (int) len + 1); /* big_tb cap small_tb */[m
[31m-            lua_pop(L, 2);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushstring(L, name); /* big_tb cap key */[m
[31m-            lua_pushvalue(L, -2); /* big_tb cap key cap */[m
[31m-            lua_rawset(L, res_tb_idx); /* big_tb cap */[m
[31m-            lua_pop(L, 1);[m
[31m-        }[m
[31m-[m
[31m-        dd("top 2: %d", lua_gettop(L));[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-ngx_http_lua_regex_t *[m
[31m-ngx_http_lua_ffi_compile_regex(const unsigned char *pat, size_t pat_len,[m
[31m-    int flags, int pcre_opts, u_char *errstr,[m
[31m-    size_t errstr_size)[m
[31m-{[m
[31m-    int                     *cap = NULL, ovecsize;[m
[31m-    u_char                  *p;[m
[31m-    ngx_int_t                rc;[m
[31m-    const char              *msg;[m
[31m-    ngx_pool_t              *pool, *old_pool;[m
[31m-    pcre_extra              *sd = NULL;[m
[31m-    ngx_http_lua_regex_t    *re;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t         *lmcf;[m
[31m-    ngx_http_lua_regex_compile_t      re_comp;[m
[31m-[m
[31m-    pool = ngx_create_pool(512, ngx_cycle->log);[m
[31m-    if (pool == NULL) {[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));[m
[31m-    if (re == NULL) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-        pool = NULL;[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    re->pool = pool;[m
[31m-[m
[31m-    re_comp.options      = pcre_opts;[m
[31m-    re_comp.pattern.data = (u_char *) pat;[m
[31m-    re_comp.pattern.len  = pat_len;[m
[31m-    re_comp.err.len      = errstr_size - 1;[m
[31m-    re_comp.err.data     = errstr;[m
[31m-    re_comp.pool         = pool;[m
[31m-[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-    rc = ngx_http_lua_regex_compile(&re_comp);[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        re_comp.err.data[re_comp.err.len] = '\0';[m
[31m-        msg = (char *) re_comp.err.data;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-#if (LUA_HAVE_PCRE_JIT)[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_JIT) {[m
[31m-[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-        sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-#   if (NGX_DEBUG)[m
[31m-        if (msg != NULL) {[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                           "pcre study failed with PCRE_STUDY_JIT_COMPILE: "[m
[31m-                           "%s (%p)", msg, sd);[m
[31m-        }[m
[31m-[m
[31m-        if (sd != NULL) {[m
[31m-            int         jitted;[m
[31m-[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-[m
[31m-            pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);[m
[31m-[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                           "pcre JIT compiling result: %d", jitted);[m
[31m-        }[m
[31m-#   endif /* !(NGX_DEBUG) */[m
[31m-[m
[31m-    } else {[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(pool);[m
[31m-        sd = pcre_study(re_comp.regex, 0, &msg);[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-    }[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_JIT */[m
[31m-[m
[31m-    lmcf = ngx_http_cycle_get_module_main_conf(ngx_cycle,[m
[31m-                                               ngx_http_lua_module);[m
[31m-[m
[31m-    if (sd && lmcf && lmcf->regex_match_limit > 0) {[m
[31m-        sd->flags |= PCRE_EXTRA_MATCH_LIMIT;[m
[31m-        sd->match_limit = lmcf->regex_match_limit;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re_comp.captures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re_comp.captures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    dd("allocating cap with size: %d", (int) ovecsize);[m
[31m-[m
[31m-    cap = ngx_palloc(pool, ovecsize * sizeof(int));[m
[31m-    if (cap == NULL) {[m
[31m-        msg = "no memory";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMECOUNT,[m
[31m-                      &re->name_count) != 0)[m
[31m-    {[m
[31m-        msg = "cannot acquire named subpattern count";[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (re->name_count > 0) {[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMEENTRYSIZE,[m
[31m-                          &re->name_entry_size) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern entry size";[m
[31m-            goto error;[m
[31m-        }[m
[31m-[m
[31m-        if (pcre_fullinfo(re_comp.regex, NULL, PCRE_INFO_NAMETABLE,[m
[31m-                          &re->name_table) != 0)[m
[31m-        {[m
[31m-            msg = "cannot acquire named subpattern table";[m
[31m-            goto error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    re->regex = re_comp.regex;[m
[31m-    re->regex_sd = sd;[m
[31m-    re->ncaptures = re_comp.captures;[m
[31m-    re->captures = cap;[m
[31m-    re->replace = NULL;[m
[31m-[m
[31m-    /* only for (stap) debugging, the pointer might be invalid when the[m
[31m-     * string is collected later on.... */[m
[31m-    re->pattern = pat;[m
[31m-[m
[31m-    return re;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    p = ngx_snprintf(errstr, errstr_size - 1, "%s", msg);[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    if (sd) {[m
[31m-        ngx_http_lua_regex_free_study_data(pool, sd);[m
[31m-    }[m
[31m-[m
[31m-    if (pool) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_exec_regex(ngx_http_lua_regex_t *re, int flags,[m
[31m-    const u_char *s, size_t len, int pos)[m
[31m-{[m
[31m-    int             rc, ovecsize, exec_opts, *cap;[m
[31m-    ngx_str_t       subj;[m
[31m-    pcre_extra     *sd;[m
[31m-[m
[31m-    cap = re->captures;[m
[31m-    sd = re->regex_sd;[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-        ovecsize = 2;[m
[31m-        re->ncaptures = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ovecsize = (re->ncaptures + 1) * 3;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_NO_UTF8_CHECK) {[m
[31m-        exec_opts = PCRE_NO_UTF8_CHECK;[m
[31m-[m
[31m-    } else {[m
[31m-        exec_opts = 0;[m
[31m-    }[m
[31m-[m
[31m-    subj.data = (u_char *) s;[m
[31m-    subj.len = len;[m
[31m-[m
[31m-    if (flags & NGX_LUA_RE_MODE_DFA) {[m
[31m-[m
[31m-#if LUA_HAVE_PCRE_DFA[m
[31m-[m
[31m-        int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];[m
[31m-        rc = ngx_http_lua_regex_dfa_exec(re->regex, sd, &subj,[m
[31m-                                         (int) pos, cap, ovecsize, ws,[m
[31m-                                         sizeof(ws)/sizeof(ws[0]), exec_opts);[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-        return PCRE_ERROR_BADOPTION;[m
[31m-[m
[31m-#endif /* LUA_HAVE_PCRE_DFA */[m
[31m-[m
[31m-    } else {[m
[31m-        rc = ngx_http_lua_regex_exec(re->regex, sd, &subj, (int) pos, cap,[m
[31m-                                     ovecsize, exec_opts);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_destroy_regex(ngx_http_lua_regex_t *re)[m
[31m-{[m
[31m-    ngx_pool_t                  *old_pool;[m
[31m-[m
[31m-    dd("destroy regex called");[m
[31m-[m
[31m-    if (re == NULL || re->pool == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (re->regex_sd) {[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(re->pool);[m
[31m-#if LUA_HAVE_PCRE_JIT[m
[31m-        pcre_free_study(re->regex_sd);[m
[31m-#else[m
[31m-        pcre_free(re->regex_sd);[m
[31m-#endif[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-        re->regex_sd = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_destroy_pool(re->pool);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_compile_replace_template(ngx_http_lua_regex_t *re,[m
[31m-    const u_char *replace_data, size_t replace_len)[m
[31m-{[m
[31m-    ngx_int_t                                rc;[m
[31m-    ngx_str_t                                tpl;[m
[31m-    ngx_http_lua_complex_value_t            *ctpl;[m
[31m-    ngx_http_lua_compile_complex_value_t     ccv;[m
[31m-[m
[31m-    ctpl = ngx_palloc(re->pool, sizeof(ngx_http_lua_complex_value_t));[m
[31m-    if (ctpl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (replace_len != 0) {[m
[31m-        /* copy the string buffer pointed to by tpl.data from Lua VM */[m
[31m-        tpl.data = ngx_palloc(re->pool, replace_len + 1);[m
[31m-        if (tpl.data == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(tpl.data, replace_data, replace_len);[m
[31m-        tpl.data[replace_len] = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        tpl.data = (u_char *) replace_data;[m
[31m-    }[m
[31m-[m
[31m-    tpl.len = replace_len;[m
[31m-[m
[31m-    ngx_memzero(&ccv, sizeof(ngx_http_lua_compile_complex_value_t));[m
[31m-    ccv.pool = re->pool;[m
[31m-    ccv.log = ngx_cycle->log;[m
[31m-    ccv.value = &tpl;[m
[31m-    ccv.complex_value = ctpl;[m
[31m-[m
[31m-    rc = ngx_http_lua_compile_complex_value(&ccv);[m
[31m-[m
[31m-    re->replace = ctpl;[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_lua_script_engine_t *[m
[31m-ngx_http_lua_ffi_create_script_engine(void)[m
[31m-{[m
[31m-    return ngx_calloc(sizeof(ngx_http_lua_script_engine_t), ngx_cycle->log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_init_script_engine(ngx_http_lua_script_engine_t *e,[m
[31m-    const unsigned char *subj, ngx_http_lua_regex_t *compiled, int count)[m
[31m-{[m
[31m-    e->log = ngx_cycle->log;[m
[31m-    e->ncaptures = count * 2;[m
[31m-    e->captures = compiled->captures;[m
[31m-    e->captures_data = (u_char *) subj;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_destroy_script_engine(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_free(e);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_script_eval_len(ngx_http_lua_script_engine_t *e,[m
[31m-    ngx_http_lua_complex_value_t *val)[m
[31m-{[m
[31m-    size_t          len;[m
[31m-[m
[31m-    ngx_http_lua_script_len_code_pt   lcode;[m
[31m-[m
[31m-    e->ip = val->lengths;[m
[31m-    len = 0;[m
[31m-[m
[31m-    while (*(uintptr_t *) e->ip) {[m
[31m-        lcode = *(ngx_http_lua_script_len_code_pt *) e->ip;[m
[31m-        len += lcode(e);[m
[31m-    }[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_script_eval_data(ngx_http_lua_script_engine_t *e,[m
[31m-    ngx_http_lua_complex_value_t *val, u_char *dst)[m
[31m-{[m
[31m-    ngx_http_lua_script_code_pt       code;[m
[31m-[m
[31m-    e->ip = val->values;[m
[31m-    e->pos = dst;[m
[31m-[m
[31m-    while (*(uintptr_t *) e->ip) {[m
[31m-        code = *(ngx_http_lua_script_code_pt *) e->ip;[m
[31m-        code(e);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uint32_t[m
[31m-ngx_http_lua_ffi_max_regex_cache_size(void)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-    lmcf = ngx_http_cycle_get_module_main_conf(ngx_cycle,[m
[31m-                                               ngx_http_lua_module);[m
[31m-    if (lmcf == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-    return (uint32_t) lmcf->regex_cache_max_entries;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_PCRE */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_regex.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_regex.h[m
[1mdeleted file mode 100644[m
[1mindex f5f8e2f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_regex.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_REGEX_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_REGEX_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-#include "ngx_http_lua_script.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-void ngx_http_lua_inject_regex_api(lua_State *L);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_REGEX_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_body.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_body.c[m
[1mdeleted file mode 100644[m
[1mindex 6f2ae38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_body.c[m
[1m+++ /dev/null[m
[36m@@ -1,1186 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include "ngx_http_lua_req_body.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_headers_in.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_read_body(lua_State *L);[m
[31m-static void ngx_http_lua_req_body_post_read(ngx_http_request_t *r);[m
[31m-static int ngx_http_lua_ngx_req_discard_body(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_body_data(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_get_body_file(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_set_body_data(lua_State *L);[m
[31m-static void ngx_http_lua_pool_cleanup_file(ngx_pool_t *p, ngx_fd_t fd);[m
[31m-static int ngx_http_lua_ngx_req_set_body_file(lua_State *L);[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_init_body(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_append_body(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_body_finish(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_write_request_body(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *body);[m
[31m-static ngx_int_t ngx_http_lua_read_body_resume(ngx_http_request_t *r);[m
[31m-static void ngx_http_lua_req_body_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_body_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_read_body);[m
[31m-    lua_setfield(L, -2, "read_body");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_discard_body);[m
[31m-    lua_setfield(L, -2, "discard_body");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_body_data);[m
[31m-    lua_setfield(L, -2, "get_body_data");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_body_file);[m
[31m-    lua_setfield(L, -2, "get_body_file");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_body_data);[m
[31m-    lua_setfield(L, -2, "set_body_data");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_body_file);[m
[31m-    lua_setfield(L, -2, "set_body_file");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_init_body);[m
[31m-    lua_setfield(L, -2, "init_body");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_append_body);[m
[31m-    lua_setfield(L, -2, "append_body");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_body_finish);[m
[31m-    lua_setfield(L, -2, "finish_body");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_read_body(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    r->request_body_in_single_buf = 1;[m
[31m-    r->request_body_in_persistent_file = 1;[m
[31m-    r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->request_body_in_file_only) {[m
[31m-        r->request_body_file_log_level = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua start to read buffered request body");[m
[31m-[m
[31m-    rc = ngx_http_read_client_request_body(r, ngx_http_lua_req_body_post_read);[m
[31m-[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-    r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ctx->exit_code = rc;[m
[31m-        ctx->exited = 1;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http read client request body returned error code %i, "[m
[31m-                       "exitting now", rc);[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-#if (nginx_version >= 1002006 && nginx_version < 1003000) ||                 \[m
[31m-        nginx_version >= 1003009[m
[31m-    r->main->count--;[m
[31m-    dd("decrement r->main->count: %d", (int) r->main->count);[m
[31m-#endif[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua read buffered request body requires I/O "[m
[31m-                       "interruptions");[m
[31m-[m
[31m-        ctx->waiting_more_body = 1;[m
[31m-        ctx->downstream = coctx;[m
[31m-[m
[31m-        ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-        coctx->cleanup = ngx_http_lua_req_body_cleanup;[m
[31m-        coctx->data = r;[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua has read buffered request body in a single run");[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_req_body_post_read(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_lua_co_ctx_t   *coctx;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua req body post read, c:%ud", r->main->count);[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        ctx->waiting_more_body = 0;[m
[31m-[m
[31m-        coctx = ctx->downstream;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        coctx->cleanup = NULL;[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->check_client_abort) {[m
[31m-            r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-        } else {[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            (void) ngx_http_lua_read_body_resume(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->resume_handler = ngx_http_lua_read_body_resume;[m
[31m-            ngx_http_core_run_phases(r);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_discard_body(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return luaL_error(L, "failed to discard request body");[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_body_data(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    size_t                       len;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *buf;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->temp_file[m
[31m-        || r->request_body->bufs == NULL)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    cl = r->request_body->bufs;[m
[31m-[m
[31m-    if (cl->next == NULL) {[m
[31m-        len = cl->buf->last - cl->buf->pos;[m
[31m-[m
[31m-        if (len == 0) {[m
[31m-            lua_pushnil(L);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) cl->buf->pos, len);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* found multi-buffer body */[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    for (; cl; cl = cl->next) {[m
[31m-        dd("body chunk len: %d", (int) ngx_buf_size(cl->buf));[m
[31m-        len += cl->buf->last - cl->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    buf = (u_char *) lua_newuserdata(L, len);[m
[31m-[m
[31m-    p = buf;[m
[31m-    for (cl = r->request_body->bufs; cl; cl = cl->next) {[m
[31m-        p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_body_file(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->request_body == NULL || r->request_body->temp_file == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX file directio: %u, f:%u, m:%u, t:%u, end - pos %d, size %d",[m
[31m-       r->request_body->temp_file->file.directio,[m
[31m-       r->request_body->bufs->buf->in_file,[m
[31m-       r->request_body->bufs->buf->memory,[m
[31m-       r->request_body->bufs->buf->temporary,[m
[31m-       (int) (r->request_body->bufs->buf->end -[m
[31m-              r->request_body->bufs->buf->pos),[m
[31m-       (int) ngx_buf_size(r->request_body->bufs->buf));[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) r->request_body->temp_file->file.name.data,[m
[31m-                    r->request_body->temp_file->file.name.len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_body_data(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    ngx_temp_file_t             *tf;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_str_t                    body, key, value;[m
[31m-#if 1[m
[31m-    ngx_int_t                    rc;[m
[31m-#endif[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_buf_tag_t                tag;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "expecting 1 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    body.data = (u_char *) luaL_checklstring(L, 1, &body.len);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        return luaL_error(L, "request body already discarded asynchronously");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body == NULL) {[m
[31m-        return luaL_error(L, "request body not read yet");[m
[31m-    }[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    tag = (ngx_buf_tag_t) &ngx_http_lua_module;[m
[31m-[m
[31m-    tf = rb->temp_file;[m
[31m-[m
[31m-    if (tf) {[m
[31m-        if (tf->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-            dd("cleaning temp file %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-[m
[31m-            ngx_http_lua_pool_cleanup_file(r->pool, tf->file.fd);[m
[31m-            tf->file.fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-            dd("temp file cleaned: %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (body.len == 0) {[m
[31m-[m
[31m-        if (rb->bufs) {[m
[31m-[m
[31m-            for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-                if (cl->buf->tag == tag && cl->buf->temporary) {[m
[31m-[m
[31m-                    dd("free old request body buffer: size:%d",[m
[31m-                       (int) ngx_buf_size(cl->buf));[m
[31m-[m
[31m-                    ngx_pfree(r->pool, cl->buf->start);[m
[31m-                    cl->buf->tag = (ngx_buf_tag_t) NULL;[m
[31m-                    cl->buf->temporary = 0;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs = NULL;[m
[31m-        rb->buf = NULL;[m
[31m-[m
[31m-        dd("request body is set to empty string");[m
[31m-        goto set_header;[m
[31m-    }[m
[31m-[m
[31m-    if (rb->bufs) {[m
[31m-[m
[31m-        for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-            if (cl->buf->tag == tag && cl->buf->temporary) {[m
[31m-                dd("free old request body buffer: size:%d",[m
[31m-                   (int) ngx_buf_size(cl->buf));[m
[31m-[m
[31m-                ngx_pfree(r->pool, cl->buf->start);[m
[31m-                cl->buf->tag = (ngx_buf_tag_t) NULL;[m
[31m-                cl->buf->temporary = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs->next = NULL;[m
[31m-[m
[31m-        b = rb->bufs->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->temporary = 1;[m
[31m-        b->tag = tag;[m
[31m-[m
[31m-        b->start = ngx_palloc(r->pool, body.len);[m
[31m-        if (b->start == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-        b->end = b->start + body.len;[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = ngx_copy(b->pos, body.data, body.len);[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-        rb->bufs->next = NULL;[m
[31m-[m
[31m-        b = ngx_create_temp_buf(r->pool, body.len);[m
[31m-        if (b == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        b->tag = tag;[m
[31m-        b->last = ngx_copy(b->pos, body.data, body.len);[m
[31m-[m
[31m-        rb->bufs->buf = b;[m
[31m-        rb->buf = b;[m
[31m-    }[m
[31m-[m
[31m-set_header:[m
[31m-[m
[31m-    /* override input header Content-Length (value must be null terminated) */[m
[31m-[m
[31m-    value.data = ngx_palloc(r->pool, NGX_SIZE_T_LEN + 1);[m
[31m-    if (value.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    value.len = ngx_sprintf(value.data, "%uz", body.len) - value.data;[m
[31m-    value.data[value.len] = '\0';[m
[31m-[m
[31m-    dd("setting request Content-Length to %.*s (%d)",[m
[31m-       (int) value.len, value.data, (int) body.len);[m
[31m-[m
[31m-    r->headers_in.content_length_n = body.len;[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length->value.data = value.data;[m
[31m-        r->headers_in.content_length->value.len = value.len;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_str_set(&key, "Content-Length");[m
[31m-[m
[31m-        rc = ngx_http_lua_set_input_header(r, key, value, 1 /* override */);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L, "failed to reset the Content-Length "[m
[31m-                              "input header");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_init_body(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    size_t                       size;[m
[31m-    lua_Integer                  num;[m
[31m-#if 1[m
[31m-    ngx_temp_file_t             *tf;[m
[31m-#endif[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 or 1 argument but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        return luaL_error(L, "request body already discarded asynchronously");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body == NULL) {[m
[31m-        return luaL_error(L, "request body not read yet");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 1) {[m
[31m-        num = luaL_checkinteger(L, 1);[m
[31m-        if (num < 0) {[m
[31m-            return luaL_error(L, "bad size argument: %d", (int) num);[m
[31m-        }[m
[31m-[m
[31m-        size = (size_t) num;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-        size = clcf->client_body_buffer_size;[m
[31m-    }[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        r->request_body_in_file_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-#if 1[m
[31m-    tf = rb->temp_file;[m
[31m-[m
[31m-    if (tf) {[m
[31m-        if (tf->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-            dd("cleaning temp file %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-[m
[31m-            ngx_http_lua_pool_cleanup_file(r->pool, tf->file.fd);[m
[31m-[m
[31m-            ngx_memzero(tf, sizeof(ngx_temp_file_t));[m
[31m-[m
[31m-            tf->file.fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-            dd("temp file cleaned: %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-    r->headers_in.content_length_n = 0;[m
[31m-[m
[31m-    rb->buf = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (rb->buf == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-    if (rb->bufs == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    rb->bufs->buf = rb->buf;[m
[31m-    rb->bufs->next = NULL;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_append_body(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    ngx_str_t                    body;[m
[31m-    size_t                       size, rest;[m
[31m-    size_t                       offset = 0;[m
[31m-    ngx_chain_t                  chain;[m
[31m-    ngx_buf_t                    buf;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "expecting 1 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    body.data = (u_char *) luaL_checklstring(L, 1, &body.len);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->buf == NULL[m
[31m-        || r->request_body->bufs == NULL)[m
[31m-    {[m
[31m-        return luaL_error(L, "request_body not initialized");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body_in_file_only) {[m
[31m-        buf.start = body.data;[m
[31m-        buf.pos = buf.start;[m
[31m-        buf.last = buf.start + body.len;[m
[31m-        buf.end = buf.last;[m
[31m-        buf.temporary = 1;[m
[31m-[m
[31m-        chain.buf = &buf;[m
[31m-        chain.next = NULL;[m
[31m-[m
[31m-        if (ngx_http_lua_write_request_body(r, &chain) != NGX_OK) {[m
[31m-            return luaL_error(L, "fail to write file");[m
[31m-        }[m
[31m-[m
[31m-        r->headers_in.content_length_n += body.len;[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    rest = body.len;[m
[31m-[m
[31m-    while (rest > 0) {[m
[31m-        if (rb->buf->last == rb->buf->end) {[m
[31m-            if (ngx_http_lua_write_request_body(r, rb->bufs) != NGX_OK) {[m
[31m-                return luaL_error(L, "fail to write file");[m
[31m-            }[m
[31m-[m
[31m-            rb->buf->last = rb->buf->start;[m
[31m-        }[m
[31m-[m
[31m-        size = rb->buf->end - rb->buf->last;[m
[31m-[m
[31m-        if (size > rest) {[m
[31m-            size = rest;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(rb->buf->last, body.data + offset, size);[m
[31m-[m
[31m-        rb->buf->last += size;[m
[31m-        rest -= size;[m
[31m-        offset += size;[m
[31m-        r->headers_in.content_length_n += size;[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_body_finish(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    size_t                       size;[m
[31m-    ngx_str_t                    value;[m
[31m-    ngx_str_t                    key;[m
[31m-    ngx_int_t                    rc;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "expecting 0 argument but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->request_body == NULL[m
[31m-        || r->request_body->buf == NULL[m
[31m-        || r->request_body->bufs == NULL)[m
[31m-    {[m
[31m-        return luaL_error(L, "request_body not initialized");[m
[31m-    }[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->temp_file) {[m
[31m-[m
[31m-        /* save the last part */[m
[31m-[m
[31m-        if (ngx_http_lua_write_request_body(r, rb->bufs) != NGX_OK) {[m
[31m-            return luaL_error(L, "fail to write file");[m
[31m-        }[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        b->in_file = 1;[m
[31m-        b->file_pos = 0;[m
[31m-        b->file_last = rb->temp_file->file.offset;[m
[31m-        b->file = &rb->temp_file->file;[m
[31m-[m
[31m-        if (rb->bufs->next) {[m
[31m-            rb->bufs->next->buf = b;[m
[31m-[m
[31m-        } else {[m
[31m-            rb->bufs->buf = b;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    /* override input header Content-Length (value must be null terminated) */[m
[31m-[m
[31m-    value.data = ngx_palloc(r->pool, NGX_SIZE_T_LEN + 1);[m
[31m-    if (value.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    size = (size_t) r->headers_in.content_length_n;[m
[31m-[m
[31m-    value.len = ngx_sprintf(value.data, "%uz", size) - value.data;[m
[31m-    value.data[value.len] = '\0';[m
[31m-[m
[31m-    dd("setting request Content-Length to %.*s (%d)", (int) value.len,[m
[31m-       value.data, (int) size);[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length->value.data = value.data;[m
[31m-        r->headers_in.content_length->value.len = value.len;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_str_set(&key, "Content-Length");[m
[31m-[m
[31m-        rc = ngx_http_lua_set_input_header(r, key, value, 1 /* override */);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L, "failed to reset the Content-Length "[m
[31m-                              "input header");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_pool_cleanup_file(ngx_pool_t *p, ngx_fd_t fd)[m
[31m-{[m
[31m-    ngx_pool_cleanup_t       *c;[m
[31m-    ngx_pool_cleanup_file_t  *cf;[m
[31m-[m
[31m-    for (c = p->cleanup; c; c = c->next) {[m
[31m-        if (c->handler == ngx_pool_cleanup_file[m
[31m-            || c->handler == ngx_pool_delete_file)[m
[31m-        {[m
[31m-            cf = c->data;[m
[31m-[m
[31m-            if (cf->fd == fd) {[m
[31m-                c->handler(cf);[m
[31m-                c->handler = NULL;[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_body_file(lua_State *L)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          n;[m
[31m-    ngx_http_request_body_t     *rb;[m
[31m-    ngx_temp_file_t             *tf;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_int_t                    rc;[m
[31m-    int                          clean;[m
[31m-    ngx_open_file_info_t         of;[m
[31m-    ngx_str_t                    key, value;[m
[31m-    ngx_pool_cleanup_t          *cln;[m
[31m-    ngx_pool_cleanup_file_t     *clnf;[m
[31m-    ngx_err_t                    err;[m
[31m-    ngx_chain_t                 *cl;[m
[31m-    ngx_buf_tag_t                tag;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &name.len);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    if (r->discard_body) {[m
[31m-        return luaL_error(L, "request body already discarded asynchronously");[m
[31m-    }[m
[31m-[m
[31m-    if (r->request_body == NULL) {[m
[31m-        return luaL_error(L, "request body not read yet");[m
[31m-    }[m
[31m-[m
[31m-    name.data = ngx_palloc(r->pool, name.len + 1);[m
[31m-    if (name.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(name.data, p, name.len);[m
[31m-    name.data[name.len] = '\0';[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        luaL_checktype(L, 2, LUA_TBOOLEAN);[m
[31m-        clean = lua_toboolean(L, 2);[m
[31m-[m
[31m-    } else {[m
[31m-        clean = 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("clean: %d", (int) clean);[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    /* clean up existing r->request_body->bufs (if any) */[m
[31m-[m
[31m-    tag = (ngx_buf_tag_t) &ngx_http_lua_module;[m
[31m-[m
[31m-    if (rb->bufs) {[m
[31m-        dd("XXX reusing buf");[m
[31m-[m
[31m-        for (cl = rb->bufs; cl; cl = cl->next) {[m
[31m-            if (cl->buf->tag == tag && cl->buf->temporary) {[m
[31m-                dd("free old request body buffer: size:%d",[m
[31m-                   (int) ngx_buf_size(cl->buf));[m
[31m-[m
[31m-                ngx_pfree(r->pool, cl->buf->start);[m
[31m-                cl->buf->tag = (ngx_buf_tag_t) NULL;[m
[31m-                cl->buf->temporary = 0;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rb->bufs->next = NULL;[m
[31m-        b = rb->bufs->buf;[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        b->tag = tag;[m
[31m-        rb->buf = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        dd("XXX creating new buf");[m
[31m-[m
[31m-        rb->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-        if (rb->bufs == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-        rb->bufs->next = NULL;[m
[31m-[m
[31m-        b = ngx_calloc_buf(r->pool);[m
[31m-        if (b == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        b->tag = tag;[m
[31m-[m
[31m-        rb->bufs->buf = b;[m
[31m-        rb->buf = NULL;[m
[31m-    }[m
[31m-[m
[31m-    b->last_in_chain = 1;[m
[31m-[m
[31m-    /* just make r->request_body->temp_file a bare stub */[m
[31m-[m
[31m-    tf = rb->temp_file;[m
[31m-[m
[31m-    if (tf) {[m
[31m-        if (tf->file.fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-            dd("cleaning temp file %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-[m
[31m-            ngx_http_lua_pool_cleanup_file(r->pool, tf->file.fd);[m
[31m-[m
[31m-            ngx_memzero(tf, sizeof(ngx_temp_file_t));[m
[31m-[m
[31m-            tf->file.fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-            dd("temp file cleaned: %.*s", (int) tf->file.name.len,[m
[31m-               tf->file.name.data);[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        rb->temp_file = tf;[m
[31m-    }[m
[31m-[m
[31m-    /* read the file info and construct an in-file buf */[m
[31m-[m
[31m-    ngx_memzero(&of, sizeof(ngx_open_file_info_t));[m
[31m-[m
[31m-    of.directio = NGX_OPEN_FILE_DIRECTIO_OFF;[m
[31m-[m
[31m-    if (ngx_http_lua_open_and_stat_file(name.data, &of, r->connection->log)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return luaL_error(L, "%s \"%s\" failed", of.failed, name.data);[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX new body file fd: %d", of.fd);[m
[31m-[m
[31m-    tf->file.fd = of.fd;[m
[31m-    tf->file.name = name;[m
[31m-    tf->file.log = r->connection->log;[m
[31m-    tf->file.directio = 0;[m
[31m-[m
[31m-    if (of.size == 0) {[m
[31m-        if (clean) {[m
[31m-            if (ngx_delete_file(name.data) == NGX_FILE_ERROR) {[m
[31m-                err = ngx_errno;[m
[31m-[m
[31m-                if (err != NGX_ENOENT) {[m
[31m-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,[m
[31m-                                  ngx_delete_file_n " \"%s\" failed",[m
[31m-                                  name.data);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", name.data);[m
[31m-        }[m
[31m-[m
[31m-        r->request_body->bufs = NULL;[m
[31m-        r->request_body->buf = NULL;[m
[31m-[m
[31m-        goto set_header;[m
[31m-    }[m
[31m-[m
[31m-    /* register file cleanup hook */[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(r->pool,[m
[31m-                               sizeof(ngx_pool_cleanup_file_t));[m
[31m-[m
[31m-    if (cln == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = clean ? ngx_pool_delete_file : ngx_pool_cleanup_file;[m
[31m-    clnf = cln->data;[m
[31m-[m
[31m-    clnf->fd = of.fd;[m
[31m-    clnf->name = name.data;[m
[31m-    clnf->log = r->pool->log;[m
[31m-[m
[31m-    b->file = &tf->file;[m
[31m-    if (b->file == NULL) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("XXX file size: %d", (int) of.size);[m
[31m-[m
[31m-    b->file_pos = 0;[m
[31m-    b->file_last = of.size;[m
[31m-[m
[31m-    b->in_file = 1;[m
[31m-[m
[31m-    dd("buf file: %p, f:%u", b->file, b->in_file);[m
[31m-[m
[31m-set_header:[m
[31m-[m
[31m-    /* override input header Content-Length (value must be null terminated) */[m
[31m-[m
[31m-    value.data = ngx_palloc(r->pool, NGX_OFF_T_LEN + 1);[m
[31m-    if (value.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    value.len = ngx_sprintf(value.data, "%O", of.size) - value.data;[m
[31m-    value.data[value.len] = '\0';[m
[31m-[m
[31m-    r->headers_in.content_length_n = of.size;[m
[31m-[m
[31m-    if (r->headers_in.content_length) {[m
[31m-        r->headers_in.content_length->value.data = value.data;[m
[31m-        r->headers_in.content_length->value.len = value.len;[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        ngx_str_set(&key, "Content-Length");[m
[31m-[m
[31m-        rc = ngx_http_lua_set_input_header(r, key, value, 1 /* override */);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L, "failed to reset the Content-Length "[m
[31m-                              "input header");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_write_request_body(ngx_http_request_t *r, ngx_chain_t *body)[m
[31m-{[m
[31m-    ssize_t                    n;[m
[31m-    ngx_temp_file_t           *tf;[m
[31m-    ngx_http_request_body_t   *rb;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-[m
[31m-    rb = r->request_body;[m
[31m-[m
[31m-    if (rb->temp_file == NULL) {[m
[31m-        tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-        if (tf == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        tf->file.fd = NGX_INVALID_FILE;[m
[31m-        tf->file.log = r->connection->log;[m
[31m-        tf->path = clcf->client_body_temp_path;[m
[31m-        tf->pool = r->pool;[m
[31m-        tf->warn = "a client request body is buffered to a temporary file";[m
[31m-        tf->log_level = r->request_body_file_log_level;[m
[31m-        tf->persistent = 1;[m
[31m-        tf->clean = 1;[m
[31m-[m
[31m-        if (r->request_body_file_group_access) {[m
[31m-            tf->access = 0660;[m
[31m-        }[m
[31m-[m
[31m-        rb->temp_file = tf;[m
[31m-[m
[31m-        if (body == NULL) {[m
[31m-            /* empty body with r->request_body_in_file_only */[m
[31m-[m
[31m-            if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,[m
[31m-                                     tf->persistent, tf->clean, tf->access)[m
[31m-                != NGX_OK)[m
[31m-            {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    n = ngx_write_chain_to_temp_file(rb->temp_file, body);[m
[31m-[m
[31m-    /* TODO: n == 0 or not complete and level event */[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rb->temp_file->offset += n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_read_body_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_req_body_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx = data;[m
[31m-[m
[31m-    r = coctx->data;[m
[31m-    if (r == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->read->timer_set) {[m
[31m-        ngx_del_timer(r->connection->read);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->waiting_more_body = 0;[m
[31m-    r->keepalive = 0;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_body.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_body.h[m
[1mdeleted file mode 100644[m
[1mindex 38b0e72..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_body.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_REQ_BODY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_REQ_BODY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_req_body_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_REQ_BODY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_method.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_method.c[m
[1mdeleted file mode 100644[m
[1mindex 0a2a154..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_method.c[m
[1m+++ /dev/null[m
[36m@@ -1,252 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#include "ddebug.h"[m
[31m-#include "ngx_http_lua_req_method.h"[m
[31m-#include "ngx_http_lua_subrequest.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_get_method(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_set_method(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_method_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_get_method);[m
[31m-    lua_setfield(L, -2, "get_method");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_method);[m
[31m-    lua_setfield(L, -2, "set_method");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_get_method(lua_State *L)[m
[31m-{[m
[31m-    int                      n;[m
[31m-    ngx_http_request_t      *r;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 0) {[m
[31m-        return luaL_error(L, "only one argument expected but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) r->method_name.data, r->method_name.len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_method(lua_State *L)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    int                  method;[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "only one argument expected but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    method = luaL_checkint(L, 1);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    switch (method) {[m
[31m-        case NGX_HTTP_GET:[m
[31m-            r->method_name = ngx_http_lua_get_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST:[m
[31m-            r->method_name = ngx_http_lua_post_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PUT:[m
[31m-            r->method_name = ngx_http_lua_put_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_HEAD:[m
[31m-            r->method_name = ngx_http_lua_head_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_DELETE:[m
[31m-            r->method_name = ngx_http_lua_delete_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_OPTIONS:[m
[31m-            r->method_name = ngx_http_lua_options_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MKCOL:[m
[31m-            r->method_name = ngx_http_lua_mkcol_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_COPY:[m
[31m-            r->method_name = ngx_http_lua_copy_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MOVE:[m
[31m-            r->method_name = ngx_http_lua_move_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPFIND:[m
[31m-            r->method_name = ngx_http_lua_propfind_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPPATCH:[m
[31m-            r->method_name = ngx_http_lua_proppatch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_LOCK:[m
[31m-            r->method_name = ngx_http_lua_lock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UNLOCK:[m
[31m-            r->method_name = ngx_http_lua_unlock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PATCH:[m
[31m-            r->method_name = ngx_http_lua_patch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_TRACE:[m
[31m-            r->method_name = ngx_http_lua_trace_method;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return luaL_error(L, "unsupported HTTP method: %d", method);[m
[31m-    }[m
[31m-[m
[31m-    r->method = method;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_method(ngx_http_request_t *r)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    return r->method;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_get_method_name(ngx_http_request_t *r, char *buf,[m
[31m-    size_t *len)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    *len = ngx_min(r->method_name.len, *len);[m
[31m-    ngx_memcpy(buf, r->method_name.data, *len);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_req_set_method(ngx_http_request_t *r, int method)[m
[31m-{[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        return NGX_HTTP_LUA_FFI_BAD_CONTEXT;[m
[31m-    }[m
[31m-[m
[31m-    switch (method) {[m
[31m-        case NGX_HTTP_GET:[m
[31m-            r->method_name = ngx_http_lua_get_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST:[m
[31m-            r->method_name = ngx_http_lua_post_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PUT:[m
[31m-            r->method_name = ngx_http_lua_put_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_HEAD:[m
[31m-            r->method_name = ngx_http_lua_head_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_DELETE:[m
[31m-            r->method_name = ngx_http_lua_delete_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_OPTIONS:[m
[31m-            r->method_name = ngx_http_lua_options_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MKCOL:[m
[31m-            r->method_name = ngx_http_lua_mkcol_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_COPY:[m
[31m-            r->method_name = ngx_http_lua_copy_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MOVE:[m
[31m-            r->method_name = ngx_http_lua_move_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPFIND:[m
[31m-            r->method_name = ngx_http_lua_propfind_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPPATCH:[m
[31m-            r->method_name = ngx_http_lua_proppatch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_LOCK:[m
[31m-            r->method_name = ngx_http_lua_lock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UNLOCK:[m
[31m-            r->method_name = ngx_http_lua_unlock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PATCH:[m
[31m-            r->method_name = ngx_http_lua_patch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_TRACE:[m
[31m-            r->method_name = ngx_http_lua_trace_method;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    r->method = method;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_method.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_method.h[m
[1mdeleted file mode 100644[m
[1mindex f8aa1af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_req_method.h[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_METHOD_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_METHOD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_req_method_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_METHOD_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.c[m
[1mdeleted file mode 100644[m
[1mindex 2ef59c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.c[m
[1m+++ /dev/null[m
[36m@@ -1,362 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_http_lua_rewriteby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_rewrite_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_rewrite_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    /* XXX we need to take into account ngx_rewrite's location dump */[m
[31m-    if (r->uri_changed) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua rewrite handler, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (!lmcf->postponed_to_rewrite_phase_end) {[m
[31m-        ngx_http_core_main_conf_t       *cmcf;[m
[31m-        ngx_http_phase_handler_t        tmp;[m
[31m-        ngx_http_phase_handler_t        *ph;[m
[31m-        ngx_http_phase_handler_t        *cur_ph;[m
[31m-        ngx_http_phase_handler_t        *last_ph;[m
[31m-[m
[31m-        lmcf->postponed_to_rewrite_phase_end = 1;[m
[31m-[m
[31m-        cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ph = cmcf->phase_engine.handlers;[m
[31m-        cur_ph = &ph[r->phase_handler];[m
[31m-        last_ph = &ph[cur_ph->next - 1];[m
[31m-[m
[31m-#if 0[m
[31m-        if (cur_ph == last_ph) {[m
[31m-            dd("XXX our handler is already the last rewrite phase handler");[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (cur_ph < last_ph) {[m
[31m-            dd("swaping the contents of cur_ph and last_ph...");[m
[31m-[m
[31m-            tmp      = *cur_ph;[m
[31m-[m
[31m-            memmove(cur_ph, cur_ph + 1,[m
[31m-                    (last_ph - cur_ph) * sizeof (ngx_http_phase_handler_t));[m
[31m-[m
[31m-            *last_ph = tmp;[m
[31m-[m
[31m-            r->phase_handler--; /* redo the current ph */[m
[31m-[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->rewrite_handler == NULL) {[m
[31m-        dd("no rewrite handler found");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("entered? %d", (int) ctx->entered_rewrite_phase);[m
[31m-[m
[31m-    if (ctx->entered_rewrite_phase) {[m
[31m-        dd("rewriteby: calling wev handler");[m
[31m-        rc = ctx->resume_handler(r);[m
[31m-        dd("rewriteby: wev handler returns %d", (int) rc);[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DECLINED) {[m
[31m-            if (r->header_sent) {[m
[31m-                dd("header already sent");[m
[31m-[m
[31m-                /* response header was already generated in access_by_lua*,[m
[31m-                 * so it is no longer safe to proceed to later phases[m
[31m-                 * which may generate responses again */[m
[31m-[m
[31m-                if (!ctx->eof) {[m
[31m-                    dd("eof not yet sent");[m
[31m-[m
[31m-                    rc = ngx_http_lua_send_chain_link(r, ctx, NULL[m
[31m-                                                     /* indicate last_buf */);[m
[31m-                    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                        return rc;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                return NGX_HTTP_OK;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (llcf->force_read_body && !ctx->read_body_done) {[m
[31m-        r->request_body_in_single_buf = 1;[m
[31m-        r->request_body_in_persistent_file = 1;[m
[31m-        r->request_body_in_clean_file = 1;[m
[31m-[m
[31m-        rc = ngx_http_read_client_request_body(r,[m
[31m-                                       ngx_http_lua_generic_phase_post_read);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-#if (nginx_version < 1002006) ||                                             \[m
[31m-        (nginx_version >= 1003000 && nginx_version < 1003009)[m
[31m-            r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            ctx->waiting_more_body = 1;[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("calling rewrite handler");[m
[31m-    return llcf->rewrite_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_rewrite_handler_inline(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    dd("rewrite by lua inline");[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua inline script (w/ cache) sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       llcf->rewrite_src.value.data,[m
[31m-                                       llcf->rewrite_src.value.len,[m
[31m-                                       llcf->rewrite_src_key,[m
[31m-                                       (const char *)[m
[31m-                                       llcf->rewrite_chunkname);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_rewrite_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_rewrite_handler_file(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    u_char                          *script_path;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_str_t                        eval_src;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_http_complex_value(r, &llcf->rewrite_src, &eval_src) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data,[m
[31m-                                           eval_src.len);[m
[31m-[m
[31m-    if (script_path == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    /*  load Lua script file (w/ cache)        sp = 1 */[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path,[m
[31m-                                     llcf->rewrite_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc < NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_rewrite_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_rewrite_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                      co_ref;[m
[31m-    lua_State               *co;[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_event_t             *rev;[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_cleanup_t      *cln;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    /*  {{{ new coroutine to handle request */[m
[31m-    co = ngx_http_lua_new_thread(r, L, &co_ref);[m
[31m-[m
[31m-    if (co == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua: failed to create new coroutine to handle request");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  move code closure to new coroutine */[m
[31m-    lua_xmove(L, co, 1);[m
[31m-[m
[31m-    /*  set closure's env table to new coroutine's globals table */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /*  save nginx request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(co, r);[m
[31m-[m
[31m-    /*  {{{ initialize request context */[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-[m
[31m-    ctx->entered_rewrite_phase = 1;[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-    ctx->cur_co_ctx->co = co;[m
[31m-    ctx->cur_co_ctx->co_ref = co_ref;[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    /*  {{{ register request cleanup hooks */[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_REWRITE;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->check_client_abort) {[m
[31m-        r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if (!rev->active) {[m
[31m-            if (ngx_add_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        rc = ngx_http_lua_run_posted_threads(c, L, r, ctx);[m
[31m-[m
[31m-    } else if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        rc = ngx_http_lua_run_posted_threads(c, L, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DECLINED) {[m
[31m-        if (r->header_sent) {[m
[31m-            dd("header already sent");[m
[31m-[m
[31m-            /* response header was already generated in access_by_lua*,[m
[31m-             * so it is no longer safe to proceed to later phases[m
[31m-             * which may generate responses again */[m
[31m-[m
[31m-            if (!ctx->eof) {[m
[31m-                dd("eof not yet sent");[m
[31m-[m
[31m-                rc = ngx_http_lua_send_chain_link(r, ctx, NULL[m
[31m-                                                  /* indicate last_buf */);[m
[31m-                if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.h[m
[1mdeleted file mode 100644[m
[1mindex 172c295..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_rewriteby.h[m
[1m+++ /dev/null[m
[36m@@ -1,22 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_REWRITEBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_REWRITEBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_rewrite_handler(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_rewrite_handler_inline(ngx_http_request_t *r);[m
[31m-ngx_int_t ngx_http_lua_rewrite_handler_file(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_REWRITEBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_script.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_script.c[m
[1mdeleted file mode 100644[m
[1mindex 95ebadf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_script.c[m
[1m+++ /dev/null[m
[36m@@ -1,538 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_script.h"[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_lua_script_add_code(ngx_array_t *codes, size_t size);[m
[31m-static size_t ngx_http_lua_script_copy_len_code([m
[31m-    ngx_http_lua_script_engine_t *e);[m
[31m-static void ngx_http_lua_script_copy_code(ngx_http_lua_script_engine_t *e);[m
[31m-static ngx_int_t ngx_http_lua_script_add_copy_code([m
[31m-    ngx_http_lua_script_compile_t *sc, ngx_str_t *value, ngx_uint_t last);[m
[31m-static ngx_int_t ngx_http_lua_script_compile(ngx_http_lua_script_compile_t *sc);[m
[31m-static ngx_int_t ngx_http_lua_script_add_capture_code([m
[31m-    ngx_http_lua_script_compile_t *sc, ngx_uint_t n);[m
[31m-static size_t ngx_http_lua_script_copy_capture_len_code([m
[31m-    ngx_http_lua_script_engine_t *e);[m
[31m-static void ngx_http_lua_script_copy_capture_code([m
[31m-    ngx_http_lua_script_engine_t *e);[m
[31m-static ngx_int_t ngx_http_lua_script_done(ngx_http_lua_script_compile_t *sc);[m
[31m-static ngx_int_t ngx_http_lua_script_init_arrays([m
[31m-    ngx_http_lua_script_compile_t *sc);[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_compile_complex_value(ngx_http_lua_compile_complex_value_t *ccv)[m
[31m-{[m
[31m-    ngx_str_t                  *v;[m
[31m-    ngx_uint_t                  i, n, nv;[m
[31m-    ngx_array_t                 lengths, values, *pl, *pv;[m
[31m-[m
[31m-    ngx_http_lua_script_compile_t   sc;[m
[31m-[m
[31m-    v = ccv->value;[m
[31m-[m
[31m-    nv = 0;[m
[31m-[m
[31m-    for (i = 0; i < v->len; i++) {[m
[31m-        if (v->data[i] == '$') {[m
[31m-            nv++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ccv->complex_value->value = *v;[m
[31m-    ccv->complex_value->lengths = NULL;[m
[31m-    ccv->complex_value->values = NULL;[m
[31m-[m
[31m-    if (nv == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    n = nv * (2 * sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-              + sizeof(ngx_http_lua_script_capture_code_t))[m
[31m-        + sizeof(uintptr_t);[m
[31m-[m
[31m-    if (ngx_array_init(&lengths, ccv->pool, n, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    n = (nv * (2 * sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-                   + sizeof(ngx_http_lua_script_capture_code_t))[m
[31m-                + sizeof(uintptr_t)[m
[31m-                + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-    if (ngx_array_init(&values, ccv->pool, n, 1) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pl = &lengths;[m
[31m-    pv = &values;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_lua_script_compile_t));[m
[31m-[m
[31m-    sc.pool = ccv->pool;[m
[31m-    sc.log = ccv->log;[m
[31m-    sc.source = v;[m
[31m-    sc.lengths = &pl;[m
[31m-    sc.values = &pv;[m
[31m-    sc.complete_lengths = 1;[m
[31m-    sc.complete_values = 1;[m
[31m-[m
[31m-    if (ngx_http_lua_script_compile(&sc) != NGX_OK) {[m
[31m-        ngx_array_destroy(&lengths);[m
[31m-        ngx_array_destroy(&values);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ccv->complex_value->lengths = lengths.elts;[m
[31m-    ccv->complex_value->values = values.elts;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_complex_value(ngx_http_request_t *r, ngx_str_t *subj,[m
[31m-    size_t offset, ngx_int_t count, int *cap,[m
[31m-    ngx_http_lua_complex_value_t *val, luaL_Buffer *luabuf)[m
[31m-{[m
[31m-    size_t                            len;[m
[31m-    u_char                           *p;[m
[31m-    ngx_http_lua_script_code_pt       code;[m
[31m-    ngx_http_lua_script_len_code_pt   lcode;[m
[31m-    ngx_http_lua_script_engine_t      e;[m
[31m-[m
[31m-    if (val->lengths == NULL) {[m
[31m-        luaL_addlstring(luabuf, (char *) &subj->data[offset], cap[0] - offset);[m
[31m-        luaL_addlstring(luabuf, (char *) val->value.data, val->value.len);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&e, sizeof(ngx_http_lua_script_engine_t));[m
[31m-[m
[31m-    e.log = r->connection->log;[m
[31m-    e.ncaptures = count * 2;[m
[31m-    e.captures = cap;[m
[31m-    e.captures_data = subj->data;[m
[31m-[m
[31m-    e.ip = val->lengths;[m
[31m-[m
[31m-    len = 0;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        lcode = *(ngx_http_lua_script_len_code_pt *) e.ip;[m
[31m-        len += lcode(&e);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    e.ip = val->values;[m
[31m-    e.pos = p;[m
[31m-[m
[31m-    while (*(uintptr_t *) e.ip) {[m
[31m-        code = *(ngx_http_lua_script_code_pt *) e.ip;[m
[31m-        code((ngx_http_lua_script_engine_t *) &e);[m
[31m-    }[m
[31m-[m
[31m-    luaL_addlstring(luabuf, (char *) &subj->data[offset], cap[0] - offset);[m
[31m-    luaL_addlstring(luabuf, (char *) p, len);[m
[31m-[m
[31m-    ngx_pfree(r->pool, p);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_compile(ngx_http_lua_script_compile_t *sc)[m
[31m-{[m
[31m-    u_char       ch;[m
[31m-    ngx_str_t    name;[m
[31m-    ngx_uint_t   i, bracket;[m
[31m-    unsigned     num_var;[m
[31m-    ngx_uint_t   n = 0;[m
[31m-[m
[31m-    if (ngx_http_lua_script_init_arrays(sc) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 0; i < sc->source->len; /* void */ ) {[m
[31m-[m
[31m-        name.len = 0;[m
[31m-[m
[31m-        if (sc->source->data[i] == '$') {[m
[31m-[m
[31m-            if (++i == sc->source->len) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            if (sc->source->data[i] == '$') {[m
[31m-                name.data = &sc->source->data[i];[m
[31m-                i++;[m
[31m-                name.len++;[m
[31m-[m
[31m-                if (ngx_http_lua_script_add_copy_code(sc, &name,[m
[31m-                                                      (i == sc->source->len))[m
[31m-                    != NGX_OK)[m
[31m-                {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (sc->source->data[i] >= '0' && sc->source->data[i] <= '9') {[m
[31m-                num_var = 1;[m
[31m-                n = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                num_var = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (sc->source->data[i] == '{') {[m
[31m-                bracket = 1;[m
[31m-[m
[31m-                if (++i == sc->source->len) {[m
[31m-                    goto invalid_variable;[m
[31m-                }[m
[31m-[m
[31m-                if (sc->source->data[i] >= '0' && sc->source->data[i] <= '9') {[m
[31m-                    num_var = 1;[m
[31m-                    n = 0;[m
[31m-                }[m
[31m-[m
[31m-                name.data = &sc->source->data[i];[m
[31m-[m
[31m-            } else {[m
[31m-                bracket = 0;[m
[31m-                name.data = &sc->source->data[i];[m
[31m-            }[m
[31m-[m
[31m-            for ( /* void */ ; i < sc->source->len; i++, name.len++) {[m
[31m-                ch = sc->source->data[i];[m
[31m-[m
[31m-                if (ch == '}' && bracket) {[m
[31m-                    i++;[m
[31m-                    bracket = 0;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (num_var) {[m
[31m-                    if (ch >= '0' && ch <= '9') {[m
[31m-                        n = n * 10 + (ch - '0');[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                /* not a number variable like $1, $2, etc */[m
[31m-[m
[31m-                if ((ch >= 'A' && ch <= 'Z')[m
[31m-                    || (ch >= 'a' && ch <= 'z')[m
[31m-                    || (ch >= '0' && ch <= '9')[m
[31m-                    || ch == '_')[m
[31m-                {[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (bracket) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, sc->log, 0,[m
[31m-                              "the closing bracket in \"%V\" "[m
[31m-                              "variable is missing", &name);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (name.len == 0) {[m
[31m-                goto invalid_variable;[m
[31m-            }[m
[31m-[m
[31m-            if (!num_var) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, sc->log, 0,[m
[31m-                              "attempt to use named capturing variable "[m
[31m-                              "\"%V\" (named captures not supported yet)",[m
[31m-                              &name);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            sc->variables++;[m
[31m-[m
[31m-            if (ngx_http_lua_script_add_capture_code(sc, n) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        name.data = &sc->source->data[i];[m
[31m-[m
[31m-        while (i < sc->source->len) {[m
[31m-[m
[31m-            if (sc->source->data[i] == '$') {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-            name.len++;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_lua_script_add_copy_code(sc, &name, (i == sc->source->len))[m
[31m-            != NGX_OK)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_script_done(sc);[m
[31m-[m
[31m-invalid_variable:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, sc->log, 0,[m
[31m-                  "lua script: invalid capturing variable name found in \"%V\"",[m
[31m-                  sc->source);[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_add_copy_code(ngx_http_lua_script_compile_t *sc,[m
[31m-    ngx_str_t *value, ngx_uint_t last)[m
[31m-{[m
[31m-    size_t                            size, len;[m
[31m-    ngx_http_lua_script_copy_code_t  *code;[m
[31m-[m
[31m-    len = value->len;[m
[31m-[m
[31m-    code = ngx_http_lua_script_add_code(*sc->lengths,[m
[31m-                                    sizeof(ngx_http_lua_script_copy_code_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_lua_script_code_pt)[m
[31m-                 ngx_http_lua_script_copy_len_code;[m
[31m-    code->len = len;[m
[31m-[m
[31m-    size = (sizeof(ngx_http_lua_script_copy_code_t) + len +[m
[31m-            sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-    code = ngx_http_lua_script_add_code(*sc->values, size);[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_lua_script_copy_code;[m
[31m-    code->len = len;[m
[31m-[m
[31m-    ngx_memcpy((u_char *) code + sizeof(ngx_http_lua_script_copy_code_t),[m
[31m-               value->data, value->len);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_lua_script_copy_len_code(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_http_lua_script_copy_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_lua_script_copy_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_lua_script_copy_code_t);[m
[31m-[m
[31m-    return code->len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_script_copy_code(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    u_char                           *p;[m
[31m-    ngx_http_lua_script_copy_code_t  *code;[m
[31m-[m
[31m-    code = (ngx_http_lua_script_copy_code_t *) e->ip;[m
[31m-[m
[31m-    p = e->pos;[m
[31m-[m
[31m-    if (!e->skip) {[m
[31m-        e->pos = ngx_copy(p, e->ip + sizeof(ngx_http_lua_script_copy_code_t),[m
[31m-                          code->len);[m
[31m-    }[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-          + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1));[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->log, 0,[m
[31m-                   "lua script copy: \"%*s\"", e->pos - p, p);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_add_capture_code(ngx_http_lua_script_compile_t *sc,[m
[31m-    ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_http_lua_script_capture_code_t  *code;[m
[31m-[m
[31m-    code = ngx_http_lua_script_add_code(*sc->lengths,[m
[31m-                                  sizeof(ngx_http_lua_script_capture_code_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = (ngx_http_lua_script_code_pt)[m
[31m-                 ngx_http_lua_script_copy_capture_len_code;[m
[31m-    code->n = 2 * n;[m
[31m-[m
[31m-    code = ngx_http_lua_script_add_code(*sc->values,[m
[31m-                                  sizeof(ngx_http_lua_script_capture_code_t));[m
[31m-    if (code == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    code->code = ngx_http_lua_script_copy_capture_code;[m
[31m-    code->n = 2 * n;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_lua_script_copy_capture_len_code(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    int                                  *cap;[m
[31m-    ngx_uint_t                            n;[m
[31m-    ngx_http_lua_script_capture_code_t   *code;[m
[31m-[m
[31m-    code = (ngx_http_lua_script_capture_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_lua_script_capture_code_t);[m
[31m-[m
[31m-    n = code->n;[m
[31m-[m
[31m-    if (n < e->ncaptures) {[m
[31m-        cap = e->captures;[m
[31m-        return cap[n + 1] - cap[n];[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_script_copy_capture_code(ngx_http_lua_script_engine_t *e)[m
[31m-{[m
[31m-    int                                  *cap;[m
[31m-    u_char                               *p, *pos;[m
[31m-    ngx_uint_t                            n;[m
[31m-    ngx_http_lua_script_capture_code_t   *code;[m
[31m-[m
[31m-    code = (ngx_http_lua_script_capture_code_t *) e->ip;[m
[31m-[m
[31m-    e->ip += sizeof(ngx_http_lua_script_capture_code_t);[m
[31m-[m
[31m-    n = code->n;[m
[31m-[m
[31m-    pos = e->pos;[m
[31m-[m
[31m-    if (n < e->ncaptures) {[m
[31m-[m
[31m-        cap = e->captures;[m
[31m-        p = e->captures_data;[m
[31m-[m
[31m-        e->pos = ngx_copy(pos, &p[cap[n]], cap[n + 1] - cap[n]);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->log, 0,[m
[31m-                   "lua script capture: \"%*s\"", e->pos - pos, pos);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_init_arrays(ngx_http_lua_script_compile_t *sc)[m
[31m-{[m
[31m-    ngx_uint_t   n;[m
[31m-[m
[31m-    if (*sc->lengths == NULL) {[m
[31m-        n = sc->variables * (2 * sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-                             + sizeof(ngx_http_lua_script_capture_code_t))[m
[31m-            + sizeof(uintptr_t);[m
[31m-[m
[31m-        *sc->lengths = ngx_array_create(sc->pool, n, 1);[m
[31m-        if (*sc->lengths == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (*sc->values == NULL) {[m
[31m-        n = (sc->variables * (2 * sizeof(ngx_http_lua_script_copy_code_t)[m
[31m-                              + sizeof(ngx_http_lua_script_capture_code_t))[m
[31m-                + sizeof(uintptr_t)[m
[31m-                + sizeof(uintptr_t) - 1)[m
[31m-            & ~(sizeof(uintptr_t) - 1);[m
[31m-[m
[31m-        *sc->values = ngx_array_create(sc->pool, n, 1);[m
[31m-        if (*sc->values == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sc->variables = 0;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_script_done(ngx_http_lua_script_compile_t *sc)[m
[31m-{[m
[31m-    uintptr_t   *code;[m
[31m-[m
[31m-    if (sc->complete_lengths) {[m
[31m-        code = ngx_http_lua_script_add_code(*sc->lengths, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (sc->complete_values) {[m
[31m-        code = ngx_http_lua_script_add_code(*sc->values, sizeof(uintptr_t));[m
[31m-        if (code == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *code = (uintptr_t) NULL;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void *[m
[31m-ngx_http_lua_script_add_code(ngx_array_t *codes, size_t size)[m
[31m-{[m
[31m-    return ngx_array_push_n(codes, size);[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_script.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_script.h[m
[1mdeleted file mode 100644[m
[1mindex 9fdca96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_script.h[m
[1m+++ /dev/null[m
[36m@@ -1,86 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_log_t                  *log;[m
[31m-    ngx_pool_t                 *pool;[m
[31m-    ngx_str_t                  *source;[m
[31m-[m
[31m-    ngx_array_t               **lengths;[m
[31m-    ngx_array_t               **values;[m
[31m-[m
[31m-    ngx_uint_t                  variables;[m
[31m-[m
[31m-    unsigned                    complete_lengths:1;[m
[31m-    unsigned                    complete_values:1;[m
[31m-} ngx_http_lua_script_compile_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                   value;[m
[31m-    void                       *lengths;[m
[31m-    void                       *values;[m
[31m-} ngx_http_lua_complex_value_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_log_t                       *log;[m
[31m-    ngx_pool_t                      *pool;[m
[31m-    ngx_str_t                       *value;[m
[31m-    ngx_http_lua_complex_value_t    *complex_value;[m
[31m-} ngx_http_lua_compile_complex_value_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                     *ip;[m
[31m-    u_char                     *pos;[m
[31m-[m
[31m-    ngx_str_t                   buf;[m
[31m-[m
[31m-    int                        *captures;[m
[31m-    ngx_uint_t                  ncaptures;[m
[31m-    u_char                     *captures_data;[m
[31m-[m
[31m-    unsigned                    skip:1;[m
[31m-[m
[31m-    ngx_log_t                  *log;[m
[31m-} ngx_http_lua_script_engine_t;[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_lua_script_code_pt) (ngx_http_lua_script_engine_t *e);[m
[31m-typedef size_t (*ngx_http_lua_script_len_code_pt)[m
[31m-    (ngx_http_lua_script_engine_t *e);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_script_code_pt     code;[m
[31m-    uintptr_t                       len;[m
[31m-} ngx_http_lua_script_copy_code_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_script_code_pt     code;[m
[31m-    uintptr_t                       n;[m
[31m-} ngx_http_lua_script_capture_code_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_compile_complex_value([m
[31m-    ngx_http_lua_compile_complex_value_t *ccv);[m
[31m-ngx_int_t ngx_http_lua_complex_value(ngx_http_request_t *r, ngx_str_t *subj,[m
[31m-    size_t offset, ngx_int_t count, int *cap,[m
[31m-    ngx_http_lua_complex_value_t *val, luaL_Buffer *luabuf);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SCRIPT_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.c[m
[1mdeleted file mode 100644[m
[1mindex 8a3f832..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.c[m
[1m+++ /dev/null[m
[36m@@ -1,573 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- * Copyright (C) cuiweixie[m
[31m- * I hereby assign copyright in this code to the lua-nginx-module project,[m
[31m- * to be licensed under the same terms as the rest of the code.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_semaphore.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_sema_mm_init(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_main_conf_t *lmcf);[m
[31m-void ngx_http_lua_sema_mm_cleanup(void *data);[m
[31m-static ngx_http_lua_sema_t *ngx_http_lua_alloc_sema(void);[m
[31m-static void ngx_http_lua_free_sema(ngx_http_lua_sema_t *sem);[m
[31m-static ngx_int_t ngx_http_lua_sema_resume(ngx_http_request_t *r);[m
[31m-int ngx_http_lua_ffi_sema_new(ngx_http_lua_sema_t **psem,[m
[31m-    int n, char **errmsg);[m
[31m-int ngx_http_lua_ffi_sema_post(ngx_http_lua_sema_t *sem, int n);[m
[31m-int ngx_http_lua_ffi_sema_wait(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_sema_t *sem, int wait_ms, u_char *err, size_t *errlen);[m
[31m-static void ngx_http_lua_sema_cleanup(void *data);[m
[31m-static void ngx_http_lua_sema_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_sema_timeout_handler(ngx_event_t *ev);[m
[31m-void ngx_http_lua_ffi_sema_gc(ngx_http_lua_sema_t *sem);[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SEMAPHORE_WAIT_SUCC = 0,[m
[31m-    SEMAPHORE_WAIT_TIMEOUT = 1[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_sema_mm_init(ngx_conf_t *cf, ngx_http_lua_main_conf_t *lmcf)[m
[31m-{[m
[31m-    ngx_http_lua_sema_mm_t *mm;[m
[31m-[m
[31m-    mm = ngx_palloc(cf->pool, sizeof(ngx_http_lua_sema_mm_t));[m
[31m-    if (mm == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lmcf->sema_mm = mm;[m
[31m-    mm->lmcf = lmcf;[m
[31m-[m
[31m-    ngx_queue_init(&mm->free_queue);[m
[31m-    mm->cur_epoch = 0;[m
[31m-    mm->total = 0;[m
[31m-    mm->used = 0;[m
[31m-[m
[31m-    /* it's better to be 4096, but it needs some space for[m
[31m-     * ngx_http_lua_sema_mm_block_t, one is enough, so it is 4095[m
[31m-     */[m
[31m-    mm->num_per_block = 4095;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_lua_sema_t *[m
[31m-ngx_http_lua_alloc_sema(void)[m
[31m-{[m
[31m-    ngx_uint_t                           i, n;[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_http_lua_sema_t                 *sem, *iter;[m
[31m-    ngx_http_lua_sema_mm_t              *mm;[m
[31m-    ngx_http_lua_main_conf_t            *lmcf;[m
[31m-    ngx_http_lua_sema_mm_block_t        *block;[m
[31m-[m
[31m-    ngx_http_lua_assert(ngx_cycle && ngx_cycle->conf_ctx);[m
[31m-[m
[31m-    lmcf = ngx_http_cycle_get_module_main_conf(ngx_cycle,[m
[31m-                                               ngx_http_lua_module);[m
[31m-[m
[31m-    mm = lmcf->sema_mm;[m
[31m-[m
[31m-    if (!ngx_queue_empty(&mm->free_queue)) {[m
[31m-        q = ngx_queue_head(&mm->free_queue);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        sem = ngx_queue_data(q, ngx_http_lua_sema_t, chain);[m
[31m-[m
[31m-        sem->block->used++;[m
[31m-[m
[31m-        ngx_memzero(&sem->sem_event, sizeof(ngx_event_t));[m
[31m-[m
[31m-        sem->sem_event.handler = ngx_http_lua_sema_handler;[m
[31m-        sem->sem_event.data = sem;[m
[31m-        sem->sem_event.log = ngx_cycle->log;[m
[31m-[m
[31m-        mm->used++;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "from head of free queue, alloc semaphore: %p", sem);[m
[31m-[m
[31m-        return sem;[m
[31m-    }[m
[31m-[m
[31m-    /* free_queue is empty */[m
[31m-[m
[31m-    n = sizeof(ngx_http_lua_sema_mm_block_t)[m
[31m-        + mm->num_per_block * sizeof(ngx_http_lua_sema_t);[m
[31m-[m
[31m-    dd("block size: %d, item size: %d",[m
[31m-       (int) sizeof(ngx_http_lua_sema_mm_block_t),[m
[31m-       (int) sizeof(ngx_http_lua_sema_t));[m
[31m-[m
[31m-    block = ngx_alloc(n, ngx_cycle->log);[m
[31m-    if (block == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    mm->cur_epoch++;[m
[31m-    mm->total += mm->num_per_block;[m
[31m-    mm->used++;[m
[31m-[m
[31m-    block->mm = mm;[m
[31m-    block->epoch = mm->cur_epoch;[m
[31m-[m
[31m-    sem = (ngx_http_lua_sema_t *) (block + 1);[m
[31m-    sem->block = block;[m
[31m-    sem->block->used = 1;[m
[31m-[m
[31m-    ngx_memzero(&sem->sem_event, sizeof(ngx_event_t));[m
[31m-[m
[31m-    sem->sem_event.handler = ngx_http_lua_sema_handler;[m
[31m-    sem->sem_event.data = sem;[m
[31m-    sem->sem_event.log = ngx_cycle->log;[m
[31m-[m
[31m-    for (iter = sem + 1, i = 1; i < mm->num_per_block; i++, iter++) {[m
[31m-        iter->block = block;[m
[31m-        ngx_queue_insert_tail(&mm->free_queue, &iter->chain);[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "new block, alloc semaphore: %p block: %p", sem, block);[m
[31m-[m
[31m-    return sem;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_sema_mm_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_http_lua_sema_t                 *sem, *iter;[m
[31m-    ngx_http_lua_sema_mm_t              *mm;[m
[31m-    ngx_http_lua_main_conf_t            *lmcf;[m
[31m-    ngx_http_lua_sema_mm_block_t        *block;[m
[31m-[m
[31m-    lmcf = (ngx_http_lua_main_conf_t *) data;[m
[31m-    mm = lmcf->sema_mm;[m
[31m-[m
[31m-    while (!ngx_queue_empty(&mm->free_queue)) {[m
[31m-        q = ngx_queue_head(&mm->free_queue);[m
[31m-[m
[31m-        sem = ngx_queue_data(q, ngx_http_lua_sema_t, chain);[m
[31m-        block = sem->block;[m
[31m-[m
[31m-        if (block->used == 0) {[m
[31m-            iter = (ngx_http_lua_sema_t *) (block + 1);[m
[31m-[m
[31m-            for (i = 0; i < block->mm->num_per_block; i++, iter++) {[m
[31m-                ngx_queue_remove(&iter->chain);[m
[31m-            }[m
[31m-[m
[31m-            dd("free sema block: %p at final", block);[m
[31m-[m
[31m-            ngx_free(block);[m
[31m-[m
[31m-        } else {[m
[31m-            /* just return directly when some thing goes wrong */[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "lua sema mm: freeing a block %p that is still "[m
[31m-                          " used by someone", block);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("lua sema mm cleanup done");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_free_sema(ngx_http_lua_sema_t *sem)[m
[31m-{[m
[31m-    ngx_http_lua_sema_t            *iter;[m
[31m-    ngx_uint_t                      i, mid_epoch;[m
[31m-    ngx_http_lua_sema_mm_block_t   *block;[m
[31m-    ngx_http_lua_sema_mm_t         *mm;[m
[31m-[m
[31m-    block = sem->block;[m
[31m-    block->used--;[m
[31m-[m
[31m-    mm = block->mm;[m
[31m-    mm->used--;[m
[31m-[m
[31m-    mid_epoch = mm->cur_epoch - ((mm->total / mm->num_per_block) >> 1);[m
[31m-[m
[31m-    if (block->epoch < mid_epoch) {[m
[31m-        ngx_queue_insert_tail(&mm->free_queue, &sem->chain);[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "add to free queue tail semaphore: %p epoch: %d"[m
[31m-                       "mid_epoch: %d cur_epoch: %d", sem, (int) block->epoch,[m
[31m-                       (int) mid_epoch, (int) mm->cur_epoch);[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_queue_insert_head(&mm->free_queue, &sem->chain);[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "add to free queue head semaphore: %p epoch: %d"[m
[31m-                       "mid_epoch: %d cur_epoch: %d", sem, (int) block->epoch,[m
[31m-                       (int) mid_epoch, (int) mm->cur_epoch);[m
[31m-    }[m
[31m-[m
[31m-    dd("used: %d", (int) block->used);[m
[31m-[m
[31m-    if (block->used == 0[m
[31m-        && mm->used <= (mm->total >> 1)[m
[31m-        && block->epoch < mid_epoch)[m
[31m-    {[m
[31m-        /* load <= 50% and it's on the older side */[m
[31m-        iter = (ngx_http_lua_sema_t *) (block + 1);[m
[31m-[m
[31m-        for (i = 0; i < mm->num_per_block; i++, iter++) {[m
[31m-            ngx_queue_remove(&iter->chain);[m
[31m-        }[m
[31m-[m
[31m-        mm->total -= mm->num_per_block;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "free semaphore block: %p", block);[m
[31m-[m
[31m-        ngx_free(block);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_sema_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    if (ctx->cur_co_ctx->sem_resume_status == SEMAPHORE_WAIT_SUCC) {[m
[31m-        lua_pushboolean(ctx->cur_co_ctx->co, 1);[m
[31m-        lua_pushnil(ctx->cur_co_ctx->co);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushboolean(ctx->cur_co_ctx->co, 0);[m
[31m-        lua_pushliteral(ctx->cur_co_ctx->co, "timeout");[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, 2);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc >= NGX_OK */[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sema_new(ngx_http_lua_sema_t **psem,[m
[31m-    int n, char **errmsg)[m
[31m-{[m
[31m-    ngx_http_lua_sema_t    *sem;[m
[31m-[m
[31m-    sem = ngx_http_lua_alloc_sema();[m
[31m-    if (sem == NULL) {[m
[31m-        *errmsg = "no memory";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_init(&sem->wait_queue);[m
[31m-[m
[31m-    sem->resource_count = n;[m
[31m-    sem->wait_count = 0;[m
[31m-    *psem = sem;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore new: %p, resources: %d",[m
[31m-                   sem, sem->resource_count);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sema_post(ngx_http_lua_sema_t *sem, int n)[m
[31m-{[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore post: %p, n: %d, resources: %d",[m
[31m-                   sem, n, sem->resource_count);[m
[31m-[m
[31m-    sem->resource_count += n;[m
[31m-[m
[31m-    if (!ngx_queue_empty(&sem->wait_queue)) {[m
[31m-        /* we need the extra paranthese around the first argument of[m
[31m-         * ngx_post_event() just to work around macro issues in nginx[m
[31m-         * cores older than nginx 1.7.12 (exclusive).[m
[31m-         */[m
[31m-        ngx_post_event((&sem->sem_event), &ngx_posted_events);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sema_wait(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_sema_t *sem, int wait_ms, u_char *err, size_t *errlen)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t           *ctx;[m
[31m-    ngx_http_lua_co_ctx_t        *wait_co_ctx;[m
[31m-    ngx_int_t                     rc;[m
[31m-[m
[31m-    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore wait: %p, timeout: %d, "[m
[31m-                   "resources: %d, event posted: %d",[m
[31m-                   sem, wait_ms, sem->resource_count,[m
[31m-#if (nginx_version >= 1007005)[m
[31m-                   (int) sem->sem_event.posted[m
[31m-#else[m
[31m-                   sem->sem_event.prev ? 1 : 0[m
[31m-#endif[m
[31m-                   );[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        *errlen = ngx_snprintf(err, *errlen, "no request ctx found") - err;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_ffi_check_context(ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                                        | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                                        | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                                        | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                                        | NGX_HTTP_LUA_CONTEXT_SSL_CERT,[m
[31m-                                        err, errlen);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* we keep the order, will resume the older waited firtly[m
[31m-     * in ngx_http_lua_sema_handler[m
[31m-     */[m
[31m-[m
[31m-    if (ngx_queue_empty(&sem->wait_queue) && sem->resource_count > 0) {[m
[31m-        sem->resource_count--;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (wait_ms == 0) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    sem->wait_count++;[m
[31m-    wait_co_ctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    wait_co_ctx->sleep.handler = ngx_http_lua_sema_timeout_handler;[m
[31m-    wait_co_ctx->sleep.data = ctx->cur_co_ctx;[m
[31m-    wait_co_ctx->sleep.log = r->connection->log;[m
[31m-[m
[31m-    ngx_add_timer(&wait_co_ctx->sleep, (ngx_msec_t) wait_ms);[m
[31m-[m
[31m-    dd("ngx_http_lua_ffi_sema_wait add timer coctx:%p wait: %d(ms)",[m
[31m-       wait_co_ctx, wait_ms);[m
[31m-[m
[31m-    ngx_queue_insert_tail(&sem->wait_queue, &wait_co_ctx->sem_wait_queue);[m
[31m-[m
[31m-    wait_co_ctx->data = sem;[m
[31m-    wait_co_ctx->cleanup = ngx_http_lua_sema_cleanup;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore wait yielding");[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sema_count(ngx_http_lua_sema_t *sem)[m
[31m-{[m
[31m-    return sem->resource_count - sem->wait_count;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_sema_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t          *coctx = data;[m
[31m-    ngx_queue_t                    *q;[m
[31m-    ngx_http_lua_sema_t            *sem;[m
[31m-[m
[31m-    sem = coctx->data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "http lua semaphore cleanup");[m
[31m-[m
[31m-    if (coctx->sleep.timer_set) {[m
[31m-        ngx_del_timer(&coctx->sleep);[m
[31m-    }[m
[31m-[m
[31m-    q = &coctx->sem_wait_queue;[m
[31m-[m
[31m-    ngx_queue_remove(q);[m
[31m-    sem->wait_count--;[m
[31m-    coctx->cleanup = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_sema_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_lua_sema_t         *sem;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *wait_co_ctx;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_queue_t                 *q;[m
[31m-[m
[31m-    sem = ev->data;[m
[31m-[m
[31m-    while (!ngx_queue_empty(&sem->wait_queue) && sem->resource_count > 0) {[m
[31m-[m
[31m-        q = ngx_queue_head(&sem->wait_queue);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        sem->wait_count--;[m
[31m-[m
[31m-        wait_co_ctx = ngx_queue_data(q, ngx_http_lua_co_ctx_t, sem_wait_queue);[m
[31m-        wait_co_ctx->cleanup = NULL;[m
[31m-[m
[31m-        if (wait_co_ctx->sleep.timer_set) {[m
[31m-            ngx_del_timer(&wait_co_ctx->sleep);[m
[31m-        }[m
[31m-[m
[31m-        r = ngx_http_lua_get_req(wait_co_ctx->co);[m
[31m-        c = r->connection;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        ngx_http_lua_assert(ctx != NULL);[m
[31m-[m
[31m-        sem->resource_count--;[m
[31m-[m
[31m-        ctx->cur_co_ctx = wait_co_ctx;[m
[31m-[m
[31m-        wait_co_ctx->sem_resume_status = SEMAPHORE_WAIT_SUCC;[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            (void) ngx_http_lua_sema_resume(r);[m
[31m-[m
[31m-        } else {[m
[31m-            ctx->resume_handler = ngx_http_lua_sema_resume;[m
[31m-            ngx_http_core_run_phases(r);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_sema_timeout_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t       *wait_co_ctx;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_sema_t         *sem;[m
[31m-[m
[31m-    wait_co_ctx = ev->data;[m
[31m-    wait_co_ctx->cleanup = NULL;[m
[31m-[m
[31m-    dd("ngx_http_lua_sema_timeout_handler timeout coctx:%p", wait_co_ctx);[m
[31m-[m
[31m-    sem = wait_co_ctx->data;[m
[31m-[m
[31m-    ngx_queue_remove(&wait_co_ctx->sem_wait_queue);[m
[31m-    sem->wait_count--;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(wait_co_ctx->co);[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    ngx_http_lua_assert(ctx != NULL);[m
[31m-[m
[31m-    ctx->cur_co_ctx = wait_co_ctx;[m
[31m-[m
[31m-    wait_co_ctx->sem_resume_status = SEMAPHORE_WAIT_TIMEOUT;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        (void) ngx_http_lua_sema_resume(r);[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->resume_handler = ngx_http_lua_sema_resume;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_sema_gc(ngx_http_lua_sema_t *sem)[m
[31m-{[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "in lua gc, semaphore %p", sem);[m
[31m-[m
[31m-    if (sem == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (!ngx_queue_empty(&sem->wait_queue)) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, 0,[m
[31m-                      "in lua semaphore gc wait queue is"[m
[31m-                      " not empty while the semaphore %p is being "[m
[31m-                      "destroyed", sem);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_free_sema(sem);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.h[m
[1mdeleted file mode 100644[m
[1mindex 65ba8ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_semaphore.h[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- * Copyright (C) cuiweixie[m
[31m- * I hereby assign copyright in this code to the lua-nginx-module project,[m
[31m- * to be licensed under the same terms as the rest of the code.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SEMAPHORE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SEMAPHORE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_sema_mm_block_s {[m
[31m-    ngx_uint_t                       used;[m
[31m-    ngx_http_lua_sema_mm_t          *mm;[m
[31m-    ngx_uint_t                       epoch;[m
[31m-} ngx_http_lua_sema_mm_block_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_sema_mm_s {[m
[31m-    ngx_queue_t                  free_queue;[m
[31m-    ngx_uint_t                   total;[m
[31m-    ngx_uint_t                   used;[m
[31m-    ngx_uint_t                   num_per_block;[m
[31m-    ngx_uint_t                   cur_epoch;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_sema_s {[m
[31m-    ngx_queue_t                          wait_queue;[m
[31m-    ngx_queue_t                          chain;[m
[31m-    ngx_event_t                          sem_event;[m
[31m-    ngx_http_lua_sema_mm_block_t        *block;[m
[31m-    int                                  resource_count;[m
[31m-    unsigned                             wait_count;[m
[31m-} ngx_http_lua_sema_t;[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-void ngx_http_lua_sema_mm_cleanup(void *data);[m
[31m-ngx_int_t ngx_http_lua_sema_mm_init(ngx_conf_t *cf,[m
[31m-    ngx_http_lua_main_conf_t *lmcf);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SEMAPHORE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_setby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_setby.c[m
[1mdeleted file mode 100644[m
[1mindex ed9ccc4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_setby.c[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_setby.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static void ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r,[m
[31m-    size_t nargs, ngx_http_variable_value_t *args);[m
[31m-[m
[31m-[m
[31m-/* keys in Lua thread for fetching args and nargs in set_by_lua* */[m
[31m-[m
[31m-#define ngx_http_lua_nargs_key  "__ngx_nargs"[m
[31m-[m
[31m-#define ngx_http_lua_args_key  "__ngx_args"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r, ngx_str_t *val,[m
[31m-    ngx_http_variable_value_t *args, size_t nargs, ngx_str_t *script)[m
[31m-{[m
[31m-    size_t           i;[m
[31m-    ngx_int_t        rc;[m
[31m-    u_char          *err_msg;[m
[31m-    size_t           len;[m
[31m-    u_char          *data;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t      *old_pool;[m
[31m-#endif[m
[31m-[m
[31m-    dd("nargs: %d", (int) nargs);[m
[31m-[m
[31m-    dd("set Lua VM panic handler");[m
[31m-[m
[31m-    lua_atpanic(L, ngx_http_lua_atpanic);[m
[31m-[m
[31m-    NGX_LUA_EXCEPTION_TRY {[m
[31m-        dd("initialize nginx context in Lua VM, code chunk at "[m
[31m-           "stack top    sp = 1");[m
[31m-        ngx_http_lua_set_by_lua_env(L, r, nargs, args);[m
[31m-[m
[31m-        /*  passing directive arguments to the user code */[m
[31m-        for (i = 0; i < nargs; i++) {[m
[31m-            lua_pushlstring(L, (const char *) args[i].data, args[i].len);[m
[31m-        }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        /* XXX: work-around to nginx regex subsystem */[m
[31m-        old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_traceback);[m
[31m-        lua_insert(L, 1);  /* put it under chunk and args */[m
[31m-[m
[31m-        dd("protected call user code");[m
[31m-[m
[31m-        rc = lua_pcall(L, nargs, 1, 1);[m
[31m-[m
[31m-        dd("after protected call user code");[m
[31m-[m
[31m-        lua_remove(L, 1);  /* remove traceback function */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-        /* XXX: work-around to nginx regex subsystem */[m
[31m-        ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-        if (rc != 0) {[m
[31m-            /*  error occured when running loaded code */[m
[31m-            err_msg = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-            if (err_msg == NULL) {[m
[31m-                err_msg = (u_char *) "unknown reason";[m
[31m-                len = sizeof("unknown reason") - 1;[m
[31m-            }[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "failed to run set_by_lua*: %*s", len, err_msg);[m
[31m-[m
[31m-            lua_settop(L, 0);    /*  clear remaining elems on stack */[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        data = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-        if (data) {[m
[31m-            val->data = ngx_palloc(r->pool, len);[m
[31m-            if (val->data == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(val->data, data, len);[m
[31m-            val->len = len;[m
[31m-[m
[31m-        } else {[m
[31m-            val->data = NULL;[m
[31m-            val->len = 0;[m
[31m-        }[m
[31m-[m
[31m-    } NGX_LUA_EXCEPTION_CATCH {[m
[31m-[m
[31m-        dd("nginx execution restored");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  clear Lua stack */[m
[31m-    lua_settop(L, 0);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_setby_param_get(lua_State *L)[m
[31m-{[m
[31m-    int         idx;[m
[31m-    int         n;[m
[31m-[m
[31m-    ngx_http_variable_value_t       *v;[m
[31m-[m
[31m-    idx = luaL_checkint(L, 2);[m
[31m-    idx--;[m
[31m-[m
[31m-    /*  get number of args from globals */[m
[31m-    lua_getglobal(L, ngx_http_lua_nargs_key);[m
[31m-    n = (int) lua_tointeger(L, -1);[m
[31m-[m
[31m-    /*  get args from globals */[m
[31m-    lua_getglobal(L, ngx_http_lua_args_key);[m
[31m-    v = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (idx < 0 || idx > n - 1) {[m
[31m-        lua_pushnil(L);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushlstring(L, (const char *) (v[idx].data), v[idx].len);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Set environment table for the given code closure.[m
[31m- *[m
[31m- * Before:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- *[m
[31m- * After:[m
[31m- *         | code closure | <- top[m
[31m- *         |      ...     |[m
[31m- * */[m
[31m-static void[m
[31m-ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r, size_t nargs,[m
[31m-    ngx_http_variable_value_t *args)[m
[31m-{[m
[31m-    /*  set nginx request pointer to current lua thread's globals table */[m
[31m-    ngx_http_lua_set_req(L, r);[m
[31m-[m
[31m-    lua_pushinteger(L, nargs);[m
[31m-    lua_setglobal(L, ngx_http_lua_nargs_key);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, args);[m
[31m-    lua_setglobal(L, ngx_http_lua_args_key);[m
[31m-[m
[31m-    /**[m
[31m-     * we want to create empty environment for current script[m
[31m-     *[m
[31m-     * newt = {}[m
[31m-     * newt["_G"] = newt[m
[31m-     * setmetatable(newt, {__index = _G})[m
[31m-     *[m
[31m-     * if a function or symbol is not defined in our env, __index will lookup[m
[31m-     * in the global env.[m
[31m-     *[m
[31m-     * all variables created in the script-env will be thrown away at the end[m
[31m-     * of the script run.[m
[31m-     * */[m
[31m-    ngx_http_lua_create_new_globals_table(L, 0 /* narr */, 1 /* nrec */);[m
[31m-[m
[31m-    /*  {{{ make new env inheriting main thread's globals table */[m
[31m-    /* the metatable for the new env */[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */);[m
[31m-    ngx_http_lua_get_globals_table(L);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_setmetatable(L, -2);    /*  setmetatable(newt, {__index = _G}) */[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    lua_setfenv(L, -2);    /*  set new running env for the code closure */[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_setby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_setby.h[m
[1mdeleted file mode 100644[m
[1mindex da71753..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_setby.h[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m-#ifndef _NGX_HTTP_LUA_SET_BY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SET_BY_H_INCLUDED_[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_str_t *val, ngx_http_variable_value_t *args, size_t nargs,[m
[31m-    ngx_str_t *script);[m
[31m-int ngx_http_lua_setby_param_get(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SET_BY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_shdict.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_shdict.c[m
[1mdeleted file mode 100644[m
[1mindex 43f5f9e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_shdict.c[m
[1m+++ /dev/null[m
[36m@@ -1,1886 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_api.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_shdict_set(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_safe_set(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_get(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_get_stale(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_get_helper(lua_State *L, int get_stale);[m
[31m-static int ngx_http_lua_shdict_expire(ngx_http_lua_shdict_ctx_t *ctx,[m
[31m-    ngx_uint_t n);[m
[31m-static ngx_int_t ngx_http_lua_shdict_lookup(ngx_shm_zone_t *shm_zone,[m
[31m-    ngx_uint_t hash, u_char *kdata, size_t klen,[m
[31m-    ngx_http_lua_shdict_node_t **sdp);[m
[31m-static int ngx_http_lua_shdict_set_helper(lua_State *L, int flags);[m
[31m-static int ngx_http_lua_shdict_add(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_safe_add(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_replace(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_incr(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_delete(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_flush_all(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_flush_expired(lua_State *L);[m
[31m-static int ngx_http_lua_shdict_get_keys(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_shm_zone_t *ngx_http_lua_shdict_get_zone(lua_State *L,[m
[31m-                                                               int index);[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LUA_SHDICT_ADD         0x0001[m
[31m-#define NGX_HTTP_LUA_SHDICT_REPLACE     0x0002[m
[31m-#define NGX_HTTP_LUA_SHDICT_SAFE_STORE  0x0004[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SHDICT_USERDATA_INDEX = 1,[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data)[m
[31m-{[m
[31m-    ngx_http_lua_shdict_ctx_t  *octx = data;[m
[31m-[m
[31m-    size_t                      len;[m
[31m-    ngx_int_t                   rc;[m
[31m-    volatile ngx_cycle_t       *saved_cycle;[m
[31m-    ngx_http_lua_shdict_ctx_t  *ctx;[m
[31m-    ngx_http_lua_main_conf_t   *lmcf;[m
[31m-[m
[31m-    dd("init zone");[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    if (octx) {[m
[31m-        ctx->sh = octx->sh;[m
[31m-        ctx->shpool = octx->shpool;[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;[m
[31m-[m
[31m-    if (shm_zone->shm.exists) {[m
[31m-        ctx->sh = ctx->shpool->data;[m
[31m-[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_lua_shdict_shctx_t));[m
[31m-    if (ctx->sh == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->shpool->data = ctx->sh;[m
[31m-[m
[31m-    ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel,[m
[31m-                    ngx_http_lua_shdict_rbtree_insert_value);[m
[31m-[m
[31m-    ngx_queue_init(&ctx->sh->queue);[m
[31m-[m
[31m-    len = sizeof(" in lua_shared_dict zone \"\"") + shm_zone->shm.name.len;[m
[31m-[m
[31m-    ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len);[m
[31m-    if (ctx->shpool->log_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_sprintf(ctx->shpool->log_ctx, " in lua_shared_dict zone \"%V\"%Z",[m
[31m-                &shm_zone->shm.name);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1005013[m
[31m-    ctx->shpool->log_nomem = 0;[m
[31m-#endif[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    dd("get lmcf");[m
[31m-[m
[31m-    lmcf = ctx->main_conf;[m
[31m-[m
[31m-    dd("lmcf->lua: %p", lmcf->lua);[m
[31m-[m
[31m-    lmcf->shm_zones_inited++;[m
[31m-[m
[31m-    if (lmcf->shm_zones_inited == lmcf->shm_zones->nelts[m
[31m-        && lmcf->init_handler)[m
[31m-    {[m
[31m-        saved_cycle = ngx_cycle;[m
[31m-        ngx_cycle = ctx->cycle;[m
[31m-[m
[31m-        rc = lmcf->init_handler(ctx->log, lmcf, lmcf->lua);[m
[31m-[m
[31m-        ngx_cycle = saved_cycle;[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            /* an error happened */[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)[m
[31m-{[m
[31m-    ngx_rbtree_node_t           **p;[m
[31m-    ngx_http_lua_shdict_node_t   *sdn, *sdnt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        if (node->key < temp->key) {[m
[31m-[m
[31m-            p = &temp->left;[m
[31m-[m
[31m-        } else if (node->key > temp->key) {[m
[31m-[m
[31m-            p = &temp->right;[m
[31m-[m
[31m-        } else { /* node->key == temp->key */[m
[31m-[m
[31m-            sdn = (ngx_http_lua_shdict_node_t *) &node->color;[m
[31m-            sdnt = (ngx_http_lua_shdict_node_t *) &temp->color;[m
[31m-[m
[31m-            p = ngx_memn2cmp(sdn->data, sdnt->data, sdn->key_len,[m
[31m-                             sdnt->key_len) < 0 ? &temp->left : &temp->right;[m
[31m-        }[m
[31m-[m
[31m-        if (*p == sentinel) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        temp = *p;[m
[31m-    }[m
[31m-[m
[31m-    *p = node;[m
[31m-    node->parent = temp;[m
[31m-    node->left = sentinel;[m
[31m-    node->right = sentinel;[m
[31m-    ngx_rbt_red(node);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, ngx_uint_t hash,[m
[31m-    u_char *kdata, size_t klen, ngx_http_lua_shdict_node_t **sdp)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    uint64_t                     now;[m
[31m-    int64_t                      ms;[m
[31m-    ngx_rbtree_node_t           *node, *sentinel;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-[m
[31m-    ctx = shm_zone->data;[m
[31m-[m
[31m-    node = ctx->sh->rbtree.root;[m
[31m-    sentinel = ctx->sh->rbtree.sentinel;[m
[31m-[m
[31m-    while (node != sentinel) {[m
[31m-[m
[31m-        if (hash < node->key) {[m
[31m-            node = node->left;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (hash > node->key) {[m
[31m-            node = node->right;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* hash == node->key */[m
[31m-[m
[31m-        sd = (ngx_http_lua_shdict_node_t *) &node->color;[m
[31m-[m
[31m-        rc = ngx_memn2cmp(kdata, sd->data, klen, (size_t) sd->key_len);[m
[31m-[m
[31m-        if (rc == 0) {[m
[31m-            ngx_queue_remove(&sd->queue);[m
[31m-            ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-            *sdp = sd;[m
[31m-[m
[31m-            dd("node expires: %lld", (long long) sd->expires);[m
[31m-[m
[31m-            if (sd->expires != 0) {[m
[31m-                tp = ngx_timeofday();[m
[31m-[m
[31m-                now = (uint64_t) tp->sec * 1000 + tp->msec;[m
[31m-                ms = sd->expires - now;[m
[31m-[m
[31m-                dd("time to live: %lld", (long long) ms);[m
[31m-[m
[31m-                if (ms < 0) {[m
[31m-                    dd("node already expired");[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        node = (rc < 0) ? node->left : node->right;[m
[31m-    }[m
[31m-[m
[31m-    *sdp = NULL;[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_expire(ngx_http_lua_shdict_ctx_t *ctx, ngx_uint_t n)[m
[31m-{[m
[31m-    ngx_time_t                  *tp;[m
[31m-    uint64_t                     now;[m
[31m-    ngx_queue_t                 *q;[m
[31m-    int64_t                      ms;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    int                          freed = 0;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    now = (uint64_t) tp->sec * 1000 + tp->msec;[m
[31m-[m
[31m-    /*[m
[31m-     * n == 1 deletes one or two expired entries[m
[31m-     * n == 0 deletes oldest entry by force[m
[31m-     *        and one or two zero rate entries[m
[31m-     */[m
[31m-[m
[31m-    while (n < 3) {[m
[31m-[m
[31m-        if (ngx_queue_empty(&ctx->sh->queue)) {[m
[31m-            return freed;[m
[31m-        }[m
[31m-[m
[31m-        q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-[m
[31m-        if (n++ != 0) {[m
[31m-[m
[31m-            if (sd->expires == 0) {[m
[31m-                return freed;[m
[31m-            }[m
[31m-[m
[31m-            ms = sd->expires - now;[m
[31m-            if (ms > 0) {[m
[31m-                return freed;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        node = (ngx_rbtree_node_t *)[m
[31m-                   ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-        ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-        ngx_slab_free_locked(ctx->shpool, node);[m
[31m-[m
[31m-        freed++;[m
[31m-    }[m
[31m-[m
[31m-    return freed;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_shdict_api(ngx_http_lua_main_conf_t *lmcf, lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_shm_zone_t             **zone;[m
[31m-[m
[31m-    if (lmcf->shm_zones != NULL) {[m
[31m-        lua_createtable(L, 0, lmcf->shm_zones->nelts /* nrec */);[m
[31m-                /* ngx.shared */[m
[31m-[m
[31m-        lua_createtable(L, 0 /* narr */, 13 /* nrec */); /* shared mt */[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_get);[m
[31m-        lua_setfield(L, -2, "get");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_get_stale);[m
[31m-        lua_setfield(L, -2, "get_stale");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_set);[m
[31m-        lua_setfield(L, -2, "set");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_safe_set);[m
[31m-        lua_setfield(L, -2, "safe_set");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_add);[m
[31m-        lua_setfield(L, -2, "add");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_safe_add);[m
[31m-        lua_setfield(L, -2, "safe_add");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_replace);[m
[31m-        lua_setfield(L, -2, "replace");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_incr);[m
[31m-        lua_setfield(L, -2, "incr");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_delete);[m
[31m-        lua_setfield(L, -2, "delete");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_flush_all);[m
[31m-        lua_setfield(L, -2, "flush_all");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_flush_expired);[m
[31m-        lua_setfield(L, -2, "flush_expired");[m
[31m-[m
[31m-        lua_pushcfunction(L, ngx_http_lua_shdict_get_keys);[m
[31m-        lua_setfield(L, -2, "get_keys");[m
[31m-[m
[31m-        lua_pushvalue(L, -1); /* shared mt mt */[m
[31m-        lua_setfield(L, -2, "__index"); /* shared mt */[m
[31m-[m
[31m-        zone = lmcf->shm_zones->elts;[m
[31m-[m
[31m-        for (i = 0; i < lmcf->shm_zones->nelts; i++) {[m
[31m-            ctx = zone[i]->data;[m
[31m-[m
[31m-            lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len);[m
[31m-                /* shared mt key */[m
[31m-[m
[31m-            lua_createtable(L, 1 /* narr */, 0 /* nrec */);[m
[31m-                /* table of zone[i] */[m
[31m-            lua_pushlightuserdata(L, zone[i]); /* shared mt key ud */[m
[31m-            lua_rawseti(L, -2, SHDICT_USERDATA_INDEX); /* {zone[i]} */[m
[31m-            lua_pushvalue(L, -3); /* shared mt key ud mt */[m
[31m-            lua_setmetatable(L, -2); /* shared mt key ud */[m
[31m-            lua_rawset(L, -4); /* shared mt */[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1); /* shared */[m
[31m-[m
[31m-    } else {[m
[31m-        lua_newtable(L);    /* ngx.shared */[m
[31m-    }[m
[31m-[m
[31m-    lua_setfield(L, -2, "shared");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_get(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_get_helper(L, 0 /* stale */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_get_stale(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_get_helper(L, 1 /* stale */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_shm_zone_t *[m
[31m-ngx_http_lua_shdict_get_zone(lua_State *L, int index)[m
[31m-{[m
[31m-    ngx_shm_zone_t      *zone;[m
[31m-[m
[31m-    lua_rawgeti(L, index, SHDICT_USERDATA_INDEX);[m
[31m-    zone = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    return zone;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_get_helper(lua_State *L, int get_stale)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_str_t                    key;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_str_t                    value;[m
[31m-    int                          value_type;[m
[31m-    double                       num;[m
[31m-    u_char                       c;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    uint32_t                     user_flags = 0;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 2) {[m
[31m-        return luaL_error(L, "expecting exactly two arguments, "[m
[31m-                          "but only seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 1) != LUA_TTABLE) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-    name = ctx->name;[m
[31m-[m
[31m-    if (lua_isnil(L, 2)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nil key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    key.data = (u_char *) luaL_checklstring(L, 2, &key.len);[m
[31m-[m
[31m-    if (key.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "empty key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (key.len > 65535) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "key too long");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "fetching key \"%V\" in shared dict \"%V\"", &key, &name);[m
[31m-#endif /* NGX_DEBUG */[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    if (!get_stale) {[m
[31m-        ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returns %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || (rc == NGX_DONE && !get_stale)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || (rc == NGX_DONE && get_stale) */[m
[31m-[m
[31m-    value_type = sd->value_type;[m
[31m-[m
[31m-    dd("data: %p", sd->data);[m
[31m-    dd("key len: %d", (int) sd->key_len);[m
[31m-[m
[31m-    value.data = sd->data + sd->key_len;[m
[31m-    value.len = (size_t) sd->value_len;[m
[31m-[m
[31m-    switch (value_type) {[m
[31m-    case LUA_TSTRING:[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) value.data, value.len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-[m
[31m-        if (value.len != sizeof(double)) {[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            return luaL_error(L, "bad lua number value size found for key %s "[m
[31m-                              "in shared_dict %s: %lu", key.data, name.data,[m
[31m-                              (unsigned long) value.len);[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(&num, value.data, sizeof(double));[m
[31m-[m
[31m-        lua_pushnumber(L, num);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-[m
[31m-        if (value.len != sizeof(u_char)) {[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            return luaL_error(L, "bad lua boolean value size found for key %s "[m
[31m-                              "in shared_dict %s: %lu", key.data, name.data,[m
[31m-                              (unsigned long) value.len);[m
[31m-        }[m
[31m-[m
[31m-        c = *value.data;[m
[31m-[m
[31m-        lua_pushboolean(L, c ? 1 : 0);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        return luaL_error(L, "bad value type found for key %s in "[m
[31m-                          "shared_dict %s: %d", key.data, name.data,[m
[31m-                          value_type);[m
[31m-    }[m
[31m-[m
[31m-    user_flags = sd->user_flags;[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    if (get_stale) {[m
[31m-[m
[31m-        /* always return value, flags, stale */[m
[31m-[m
[31m-        if (user_flags) {[m
[31m-            lua_pushinteger(L, (lua_Integer) user_flags);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushnil(L);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushboolean(L, rc == NGX_DONE);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-    if (user_flags) {[m
[31m-        lua_pushinteger(L, (lua_Integer) user_flags);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_delete(lua_State *L)[m
[31m-{[m
[31m-    int             n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 2) {[m
[31m-        return luaL_error(L, "expecting 2 arguments, "[m
[31m-                          "but only seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-[m
[31m-    return ngx_http_lua_shdict_set_helper(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_flush_all(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                 *q;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    int                          n;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument, but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    for (q = ngx_queue_head(&ctx->sh->queue);[m
[31m-         q != ngx_queue_sentinel(&ctx->sh->queue);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-        sd->expires = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_shdict_expire(ctx, 0);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_flush_expired(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                 *q, *prev;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    int                          freed = 0;[m
[31m-    int                          attempts = 0;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    uint64_t                     now;[m
[31m-    int                          n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 argument(s), but saw %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        attempts = luaL_checkint(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    if (ngx_queue_empty(&ctx->sh->queue)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        lua_pushnumber(L, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    now = (uint64_t) tp->sec * 1000 + tp->msec;[m
[31m-[m
[31m-    q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-    while (q != ngx_queue_sentinel(&ctx->sh->queue)) {[m
[31m-        prev = ngx_queue_prev(q);[m
[31m-[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-[m
[31m-        if (sd->expires != 0 && sd->expires <= now) {[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            node = (ngx_rbtree_node_t *)[m
[31m-                ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-            ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-            ngx_slab_free_locked(ctx->shpool, node);[m
[31m-            freed++;[m
[31m-[m
[31m-            if (attempts && freed == attempts) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        q = prev;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    lua_pushnumber(L, freed);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * This trades CPU for memory. This is potentially slow. O(2n)[m
[31m- */[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_get_keys(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                 *q, *prev;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    int                          total = 0;[m
[31m-    int                          attempts = 1024;[m
[31m-    uint64_t                     now;[m
[31m-    int                          n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 argument(s), "[m
[31m-                          "but saw %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        attempts = luaL_checkint(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    if (ngx_queue_empty(&ctx->sh->queue)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        lua_createtable(L, 0, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    now = (uint64_t) tp->sec * 1000 + tp->msec;[m
[31m-[m
[31m-    /* first run through: get total number of elements we need to allocate */[m
[31m-[m
[31m-    q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-    while (q != ngx_queue_sentinel(&ctx->sh->queue)) {[m
[31m-        prev = ngx_queue_prev(q);[m
[31m-[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-[m
[31m-        if (sd->expires == 0 || sd->expires > now) {[m
[31m-            total++;[m
[31m-            if (attempts && total == attempts) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        q = prev;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, total, 0);[m
[31m-[m
[31m-    /* second run through: add keys to table */[m
[31m-[m
[31m-    total = 0;[m
[31m-    q = ngx_queue_last(&ctx->sh->queue);[m
[31m-[m
[31m-    while (q != ngx_queue_sentinel(&ctx->sh->queue)) {[m
[31m-        prev = ngx_queue_prev(q);[m
[31m-[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-[m
[31m-        if (sd->expires == 0 || sd->expires > now) {[m
[31m-            lua_pushlstring(L, (char *) sd->data, sd->key_len);[m
[31m-            lua_rawseti(L, -2, ++total);[m
[31m-            if (attempts && total == attempts) {[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        q = prev;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    /* table is at top of stack */[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_add(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_ADD);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_safe_add(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_ADD[m
[31m-                                          |NGX_HTTP_LUA_SHDICT_SAFE_STORE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_replace(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_REPLACE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_set(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_safe_set(lua_State *L)[m
[31m-{[m
[31m-    return ngx_http_lua_shdict_set_helper(L, NGX_HTTP_LUA_SHDICT_SAFE_STORE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_set_helper(lua_State *L, int flags)[m
[31m-{[m
[31m-    int                          i, n;[m
[31m-    ngx_str_t                    key;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_str_t                    value;[m
[31m-    int                          value_type;[m
[31m-    double                       num;[m
[31m-    u_char                       c;[m
[31m-    lua_Number                   exptime = 0;[m
[31m-    u_char                      *p;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    int                          forcible = 0;[m
[31m-                         /* indicates whether to foricibly override other[m
[31m-                          * valid entries */[m
[31m-    int32_t                      user_flags = 0;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 3 && n != 4 && n != 5) {[m
[31m-        return luaL_error(L, "expecting 3, 4 or 5 arguments, "[m
[31m-                          "but only seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 1) != LUA_TTABLE) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    if (lua_isnil(L, 2)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nil key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    key.data = (u_char *) luaL_checklstring(L, 2, &key.len);[m
[31m-[m
[31m-    if (key.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "empty key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (key.len > 65535) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "key too long");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-    value_type = lua_type(L, 3);[m
[31m-[m
[31m-    switch (value_type) {[m
[31m-    case LUA_TSTRING:[m
[31m-        value.data = (u_char *) lua_tolstring(L, 3, &value.len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-        value.len = sizeof(double);[m
[31m-        num = lua_tonumber(L, 3);[m
[31m-        value.data = (u_char *) &num;[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-        value.len = sizeof(u_char);[m
[31m-        c = lua_toboolean(L, 3) ? 1 : 0;[m
[31m-        value.data = &c;[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNIL:[m
[31m-        if (flags & (NGX_HTTP_LUA_SHDICT_ADD|NGX_HTTP_LUA_SHDICT_REPLACE)) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "attempt to add or replace nil values");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ngx_str_null(&value);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "bad value type");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (n >= 4) {[m
[31m-        exptime = luaL_checknumber(L, 4);[m
[31m-        if (exptime < 0) {[m
[31m-            return luaL_error(L, "bad \"exptime\" argument");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n == 5) {[m
[31m-        user_flags = (uint32_t) luaL_checkinteger(L, 5);[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returned %d", (int) rc);[m
[31m-[m
[31m-    if (flags & NGX_HTTP_LUA_SHDICT_REPLACE) {[m
[31m-[m
[31m-        if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            lua_pushboolean(L, 0);[m
[31m-            lua_pushliteral(L, "not found");[m
[31m-            lua_pushboolean(L, forcible);[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_OK */[m
[31m-[m
[31m-        goto replace;[m
[31m-    }[m
[31m-[m
[31m-    if (flags & NGX_HTTP_LUA_SHDICT_ADD) {[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            lua_pushboolean(L, 0);[m
[31m-            lua_pushliteral(L, "exists");[m
[31m-            lua_pushboolean(L, forcible);[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            /* exists but expired */[m
[31m-[m
[31m-            dd("go to replace");[m
[31m-            goto replace;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_DECLINED */[m
[31m-[m
[31m-        dd("go to insert");[m
[31m-        goto insert;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DONE) {[m
[31m-[m
[31m-        if (value_type == LUA_TNIL) {[m
[31m-            goto remove;[m
[31m-        }[m
[31m-[m
[31m-replace:[m
[31m-[m
[31m-        if (value.data && value.len == (size_t) sd->value_len) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                           "lua shared dict set: found old entry and value "[m
[31m-                           "size matched, reusing it");[m
[31m-[m
[31m-            ngx_queue_remove(&sd->queue);[m
[31m-            ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-            sd->key_len = (u_short) key.len;[m
[31m-[m
[31m-            if (exptime > 0) {[m
[31m-                tp = ngx_timeofday();[m
[31m-                sd->expires = (uint64_t) tp->sec * 1000 + tp->msec[m
[31m-                              + (uint64_t) (exptime * 1000);[m
[31m-[m
[31m-            } else {[m
[31m-                sd->expires = 0;[m
[31m-            }[m
[31m-[m
[31m-            sd->user_flags = user_flags;[m
[31m-[m
[31m-            sd->value_len = (uint32_t) value.len;[m
[31m-[m
[31m-            dd("setting value type to %d", value_type);[m
[31m-[m
[31m-            sd->value_type = (uint8_t) value_type;[m
[31m-[m
[31m-            p = ngx_copy(sd->data, key.data, key.len);[m
[31m-            ngx_memcpy(p, value.data, value.len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            lua_pushboolean(L, 1);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushboolean(L, forcible);[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                       "lua shared dict set: found old entry but value size "[m
[31m-                       "NOT matched, removing it first");[m
[31m-[m
[31m-remove:[m
[31m-[m
[31m-        ngx_queue_remove(&sd->queue);[m
[31m-[m
[31m-        node = (ngx_rbtree_node_t *)[m
[31m-                   ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-        ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-        ngx_slab_free_locked(ctx->shpool, node);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-insert:[m
[31m-[m
[31m-    /* rc == NGX_DECLINED or value size unmatch */[m
[31m-[m
[31m-    if (value.data == NULL) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        lua_pushboolean(L, 1);[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushboolean(L, 0);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "lua shared dict set: creating a new entry");[m
[31m-[m
[31m-    n = offsetof(ngx_rbtree_node_t, color)[m
[31m-        + offsetof(ngx_http_lua_shdict_node_t, data)[m
[31m-        + key.len[m
[31m-        + value.len;[m
[31m-[m
[31m-    node = ngx_slab_alloc_locked(ctx->shpool, n);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-[m
[31m-        if (flags & NGX_HTTP_LUA_SHDICT_SAFE_STORE) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            lua_pushboolean(L, 0);[m
[31m-            lua_pushliteral(L, "no memory");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                       "lua shared dict set: overriding non-expired items "[m
[31m-                       "due to memory shortage for entry \"%V\"", &key);[m
[31m-[m
[31m-        for (i = 0; i < 30; i++) {[m
[31m-            if (ngx_http_lua_shdict_expire(ctx, 0) == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            forcible = 1;[m
[31m-[m
[31m-            node = ngx_slab_alloc_locked(ctx->shpool, n);[m
[31m-            if (node != NULL) {[m
[31m-                goto allocated;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        lua_pushboolean(L, 0);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-        lua_pushboolean(L, forcible);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-allocated:[m
[31m-[m
[31m-    sd = (ngx_http_lua_shdict_node_t *) &node->color;[m
[31m-[m
[31m-    node->key = hash;[m
[31m-    sd->key_len = (u_short) key.len;[m
[31m-[m
[31m-    if (exptime > 0) {[m
[31m-        tp = ngx_timeofday();[m
[31m-        sd->expires = (uint64_t) tp->sec * 1000 + tp->msec[m
[31m-                      + (uint64_t) (exptime * 1000);[m
[31m-[m
[31m-    } else {[m
[31m-        sd->expires = 0;[m
[31m-    }[m
[31m-[m
[31m-    sd->user_flags = user_flags;[m
[31m-[m
[31m-    sd->value_len = (uint32_t) value.len;[m
[31m-[m
[31m-    dd("setting value type to %d", value_type);[m
[31m-[m
[31m-    sd->value_type = (uint8_t) value_type;[m
[31m-[m
[31m-    p = ngx_copy(sd->data, key.data, key.len);[m
[31m-    ngx_memcpy(p, value.data, value.len);[m
[31m-[m
[31m-    ngx_rbtree_insert(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushboolean(L, forcible);[m
[31m-    return 3;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_shdict_incr(lua_State *L)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_str_t                    key;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    double                       num;[m
[31m-    u_char                      *p;[m
[31m-    ngx_shm_zone_t              *zone;[m
[31m-    double                       value;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 3) {[m
[31m-        return luaL_error(L, "expecting 3 arguments, but only seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 1) != LUA_TTABLE) {[m
[31m-        return luaL_error(L, "bad \"zone\" argument");[m
[31m-    }[m
[31m-[m
[31m-    zone = ngx_http_lua_shdict_get_zone(L, 1);[m
[31m-    if (zone == NULL) {[m
[31m-        return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer");[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    if (lua_isnil(L, 2)) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nil key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    key.data = (u_char *) luaL_checklstring(L, 2, &key.len);[m
[31m-[m
[31m-    if (key.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "empty key");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (key.len > 65535) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "key too long");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key.data, key.len);[m
[31m-[m
[31m-    value = luaL_checknumber(L, 3);[m
[31m-[m
[31m-    dd("looking up key %.*s in shared dict %.*s", (int) key.len, key.data,[m
[31m-       (int) ctx->name.len, ctx->name.data);[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key.data, key.len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    if (sd->value_type != LUA_TNUMBER || sd->value_len != sizeof(double)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "not a number");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(&sd->queue);[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-    dd("setting value type to %d", (int) sd->value_type);[m
[31m-[m
[31m-    p = sd->data + key.len;[m
[31m-[m
[31m-    ngx_memcpy(&num, p, sizeof(double));[m
[31m-    num += value;[m
[31m-[m
[31m-    ngx_memcpy(p, (double *) &num, sizeof(double));[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    lua_pushnumber(L, num);[m
[31m-    lua_pushnil(L);[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_shared_dict_get(ngx_shm_zone_t *zone, u_char *key_data,[m
[31m-    size_t key_len, ngx_http_lua_value_t *value)[m
[31m-{[m
[31m-    u_char                      *data;[m
[31m-    size_t                       len;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-[m
[31m-    if (zone == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_crc32_short(key_data, key_len);[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key_data, key_len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    value->type = sd->value_type;[m
[31m-[m
[31m-    dd("type: %d", (int) value->type);[m
[31m-[m
[31m-    data = sd->data + sd->key_len;[m
[31m-    len = (size_t) sd->value_len;[m
[31m-[m
[31m-    switch (value->type) {[m
[31m-    case LUA_TSTRING:[m
[31m-[m
[31m-        if (value->value.s.data == NULL || value->value.s.len == 0) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "no string buffer "[m
[31m-                          "initialized");[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (len > value->value.s.len) {[m
[31m-            len = value->value.s.len;[m
[31m-[m
[31m-        } else {[m
[31m-            value->value.s.len = len;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(value->value.s.data, data, len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-[m
[31m-        if (len != sizeof(double)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua number "[m
[31m-                          "value size found for key %*s: %lu", key_len,[m
[31m-                          key_data, (unsigned long) len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(&value->value.b, data, len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-[m
[31m-        if (len != sizeof(u_char)) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua boolean "[m
[31m-                          "value size found for key %*s: %lu", key_len,[m
[31m-                          key_data, (unsigned long) len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        value->value.b = *data;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua value type "[m
[31m-                      "found for key %*s: %d", key_len, key_data,[m
[31m-                      (int) value->type);[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_shm_zone_t *[m
[31m-ngx_http_lua_find_zone(u_char *name_data, size_t name_len)[m
[31m-{[m
[31m-    ngx_str_t                       *name;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_shm_zone_t                  *zone;[m
[31m-    volatile ngx_list_part_t        *part;[m
[31m-[m
[31m-    part = &ngx_cycle->shared_memory.part;[m
[31m-    zone = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */ ; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            zone = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        name = &zone[i].shm.name;[m
[31m-[m
[31m-        dd("name: [%.*s] %d", (int) name->len, name->data, (int) name->len);[m
[31m-        dd("name2: [%.*s] %d", (int) name_len, name_data, (int) name_len);[m
[31m-[m
[31m-        if (name->len == name_len[m
[31m-            && ngx_strncmp(name->data, name_data, name_len) == 0)[m
[31m-        {[m
[31m-            return &zone[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key,[m
[31m-    size_t key_len, int value_type, u_char *str_value_buf,[m
[31m-    size_t str_value_len, double num_value, int exptime, int user_flags,[m
[31m-    char **errmsg, int *forcible)[m
[31m-{[m
[31m-    int                          i, n;[m
[31m-    u_char                       c, *p;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_time_t                  *tp;[m
[31m-    ngx_rbtree_node_t           *node;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-[m
[31m-    if (zone == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("exptime: %d", exptime);[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    *forcible = 0;[m
[31m-[m
[31m-    hash = ngx_crc32_short(key, key_len);[m
[31m-[m
[31m-    switch (value_type) {[m
[31m-    case LUA_TSTRING:[m
[31m-        /* do nothing */[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-        dd("num value: %lf", num_value);[m
[31m-        str_value_buf = (u_char *) &num_value;[m
[31m-        str_value_len = sizeof(double);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-        c = num_value ? 1 : 0;[m
[31m-        str_value_buf = &c;[m
[31m-        str_value_len = sizeof(u_char);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNIL:[m
[31m-        if (op & (NGX_HTTP_LUA_SHDICT_ADD|NGX_HTTP_LUA_SHDICT_REPLACE)) {[m
[31m-            *errmsg = "attempt to add or replace nil values";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        str_value_buf = NULL;[m
[31m-        str_value_len = 0;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        *errmsg = "unsupported value type";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);[m
[31m-[m
[31m-    dd("lookup returns %d", (int) rc);[m
[31m-[m
[31m-    if (op & NGX_HTTP_LUA_SHDICT_REPLACE) {[m
[31m-[m
[31m-        if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            *errmsg = "not found";[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-        /* rc == NGX_OK */[m
[31m-[m
[31m-        goto replace;[m
[31m-    }[m
[31m-[m
[31m-    if (op & NGX_HTTP_LUA_SHDICT_ADD) {[m
[31m-[m
[31m-        if (rc == NGX_OK) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            *errmsg = "exists";[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            /* exists but expired */[m
[31m-[m
[31m-            dd("go to replace");[m
[31m-            goto replace;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_DECLINED */[m
[31m-[m
[31m-        dd("go to insert");[m
[31m-        goto insert;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK || rc == NGX_DONE) {[m
[31m-[m
[31m-        if (value_type == LUA_TNIL) {[m
[31m-            goto remove;[m
[31m-        }[m
[31m-[m
[31m-replace:[m
[31m-[m
[31m-        if (str_value_buf && str_value_len == (size_t) sd->value_len) {[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                           "lua shared dict set: found old entry and value "[m
[31m-                           "size matched, reusing it");[m
[31m-[m
[31m-            ngx_queue_remove(&sd->queue);[m
[31m-            ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-            sd->key_len = (u_short) key_len;[m
[31m-[m
[31m-            if (exptime > 0) {[m
[31m-                tp = ngx_timeofday();[m
[31m-                sd->expires = (uint64_t) tp->sec * 1000 + tp->msec[m
[31m-                              + (uint64_t) exptime;[m
[31m-[m
[31m-            } else {[m
[31m-                sd->expires = 0;[m
[31m-            }[m
[31m-[m
[31m-            sd->user_flags = user_flags;[m
[31m-[m
[31m-            sd->value_len = (uint32_t) str_value_len;[m
[31m-[m
[31m-            dd("setting value type to %d", value_type);[m
[31m-[m
[31m-            sd->value_type = (uint8_t) value_type;[m
[31m-[m
[31m-            p = ngx_copy(sd->data, key, key_len);[m
[31m-            ngx_memcpy(p, str_value_buf, str_value_len);[m
[31m-[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                       "lua shared dict set: found old entry but value size "[m
[31m-                       "NOT matched, removing it first");[m
[31m-[m
[31m-remove:[m
[31m-[m
[31m-        ngx_queue_remove(&sd->queue);[m
[31m-[m
[31m-        node = (ngx_rbtree_node_t *)[m
[31m-                   ((u_char *) sd - offsetof(ngx_rbtree_node_t, color));[m
[31m-[m
[31m-        ngx_rbtree_delete(&ctx->sh->rbtree, node);[m
[31m-[m
[31m-        ngx_slab_free_locked(ctx->shpool, node);[m
[31m-[m
[31m-    }[m
[31m-[m
[31m-insert:[m
[31m-[m
[31m-    /* rc == NGX_DECLINED or value size unmatch */[m
[31m-[m
[31m-    if (str_value_buf == NULL) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "lua shared dict set: creating a new entry");[m
[31m-[m
[31m-    n = offsetof(ngx_rbtree_node_t, color)[m
[31m-        + offsetof(ngx_http_lua_shdict_node_t, data)[m
[31m-        + key_len[m
[31m-        + str_value_len;[m
[31m-[m
[31m-    node = ngx_slab_alloc_locked(ctx->shpool, n);[m
[31m-[m
[31m-    if (node == NULL) {[m
[31m-[m
[31m-        if (op & NGX_HTTP_LUA_SHDICT_SAFE_STORE) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-            *errmsg = "no memory";[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                       "lua shared dict set: overriding non-expired items "[m
[31m-                       "due to memory shortage for entry \"%*s\"", key_len,[m
[31m-                       key);[m
[31m-[m
[31m-        for (i = 0; i < 30; i++) {[m
[31m-            if (ngx_http_lua_shdict_expire(ctx, 0) == 0) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *forcible = 1;[m
[31m-[m
[31m-            node = ngx_slab_alloc_locked(ctx->shpool, n);[m
[31m-            if (node != NULL) {[m
[31m-                goto allocated;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-        *errmsg = "no memory";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-allocated:[m
[31m-[m
[31m-    sd = (ngx_http_lua_shdict_node_t *) &node->color;[m
[31m-[m
[31m-    node->key = hash;[m
[31m-    sd->key_len = (u_short) key_len;[m
[31m-[m
[31m-    if (exptime > 0) {[m
[31m-        tp = ngx_timeofday();[m
[31m-        sd->expires = (uint64_t) tp->sec * 1000 + tp->msec[m
[31m-                      + (uint64_t) exptime;[m
[31m-[m
[31m-    } else {[m
[31m-        sd->expires = 0;[m
[31m-    }[m
[31m-[m
[31m-    sd->user_flags = user_flags;[m
[31m-    sd->value_len = (uint32_t) str_value_len;[m
[31m-    dd("setting value type to %d", value_type);[m
[31m-    sd->value_type = (uint8_t) value_type;[m
[31m-[m
[31m-    p = ngx_copy(sd->data, key, key_len);[m
[31m-    ngx_memcpy(p, str_value_buf, str_value_len);[m
[31m-[m
[31m-    ngx_rbtree_insert(&ctx->sh->rbtree, node);[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_shdict_get(ngx_shm_zone_t *zone, u_char *key,[m
[31m-    size_t key_len, int *value_type, u_char **str_value_buf,[m
[31m-    size_t *str_value_len, double *num_value, int *user_flags,[m
[31m-    int get_stale, int *is_stale)[m
[31m-{[m
[31m-    ngx_str_t                    name;[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_str_t                    value;[m
[31m-[m
[31m-    if (zone == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-    name = ctx->name;[m
[31m-[m
[31m-    hash = ngx_crc32_short(key, key_len);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ctx->log, 0,[m
[31m-                   "fetching key \"%*s\" in shared dict \"%V\"", key_len,[m
[31m-                   key, &name);[m
[31m-#endif /* NGX_DEBUG */[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-#if 1[m
[31m-    if (!get_stale) {[m
[31m-        ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returns %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || (rc == NGX_DONE && !get_stale)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        *value_type = LUA_TNIL;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || (rc == NGX_DONE && get_stale) */[m
[31m-[m
[31m-    *value_type = sd->value_type;[m
[31m-[m
[31m-    dd("data: %p", sd->data);[m
[31m-    dd("key len: %d", (int) sd->key_len);[m
[31m-[m
[31m-    value.data = sd->data + sd->key_len;[m
[31m-    value.len = (size_t) sd->value_len;[m
[31m-[m
[31m-    if (*str_value_len < (size_t) value.len) {[m
[31m-        if (*value_type == LUA_TBOOLEAN) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (*value_type == LUA_TSTRING) {[m
[31m-            *str_value_buf = malloc(value.len);[m
[31m-            if (*str_value_buf == NULL) {[m
[31m-                ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    switch (*value_type) {[m
[31m-    case LUA_TSTRING:[m
[31m-        *str_value_len = value.len;[m
[31m-        ngx_memcpy(*str_value_buf, value.data, value.len);[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNUMBER:[m
[31m-[m
[31m-        if (value.len != sizeof(double)) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                          "bad lua number value size found for key %*s "[m
[31m-                          "in shared_dict %V: %z", key_len, key,[m
[31m-                          &name, value.len);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        *str_value_len = value.len;[m
[31m-        ngx_memcpy(num_value, value.data, sizeof(double));[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TBOOLEAN:[m
[31m-[m
[31m-        if (value.len != sizeof(u_char)) {[m
[31m-            ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                          "bad lua boolean value size found for key %*s "[m
[31m-                          "in shared_dict %V: %z", key_len, key, &name,[m
[31m-                          value.len);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(*str_value_buf, value.data, value.len);[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,[m
[31m-                      "bad value type found for key %*s in "[m
[31m-                      "shared_dict %V: %d", key_len, key, &name,[m
[31m-                      *value_type);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    *user_flags = sd->user_flags;[m
[31m-    dd("user flags: %d", *user_flags);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    if (get_stale) {[m
[31m-[m
[31m-        /* always return value, flags, stale */[m
[31m-[m
[31m-        *is_stale = (rc == NGX_DONE);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key,[m
[31m-    size_t key_len, double *value, char **err)[m
[31m-{[m
[31m-    uint32_t                     hash;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    double                       num;[m
[31m-    u_char                      *p;[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-    hash = ngx_crc32_short(key, key_len);[m
[31m-[m
[31m-    dd("looking up key %.*s in shared dict %.*s", (int) key_len, key,[m
[31m-       (int) ctx->name.len, ctx->name.data);[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-#if 1[m
[31m-    ngx_http_lua_shdict_expire(ctx, 1);[m
[31m-#endif[m
[31m-    rc = ngx_http_lua_shdict_lookup(zone, hash, key, key_len, &sd);[m
[31m-[m
[31m-    dd("shdict lookup returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_DECLINED || rc == NGX_DONE) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        *err = "not found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    if (sd->value_type != LUA_TNUMBER || sd->value_len != sizeof(double)) {[m
[31m-        ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-        *err = "not a number";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_remove(&sd->queue);[m
[31m-    ngx_queue_insert_head(&ctx->sh->queue, &sd->queue);[m
[31m-[m
[31m-    dd("setting value type to %d", (int) sd->value_type);[m
[31m-[m
[31m-    p = sd->data + key_len;[m
[31m-[m
[31m-    ngx_memcpy(&num, p, sizeof(double));[m
[31m-    num += *value;[m
[31m-[m
[31m-    ngx_memcpy(p, (double *) &num, sizeof(double));[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    *value = num;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_shdict_flush_all(ngx_shm_zone_t *zone)[m
[31m-{[m
[31m-    ngx_queue_t                 *q;[m
[31m-    ngx_http_lua_shdict_node_t  *sd;[m
[31m-    ngx_http_lua_shdict_ctx_t   *ctx;[m
[31m-[m
[31m-    ctx = zone->data;[m
[31m-[m
[31m-    ngx_shmtx_lock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    for (q = ngx_queue_head(&ctx->sh->queue);[m
[31m-         q != ngx_queue_sentinel(&ctx->sh->queue);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        sd = ngx_queue_data(q, ngx_http_lua_shdict_node_t, queue);[m
[31m-        sd->expires = 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_shdict_expire(ctx, 0);[m
[31m-[m
[31m-    ngx_shmtx_unlock(&ctx->shpool->mutex);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_shdict.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_shdict.h[m
[1mdeleted file mode 100644[m
[1mindex aa1bb58..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_shdict.h[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SHDICT_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SHDICT_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    u_char                       color;[m
[31m-    u_char                       dummy;[m
[31m-    u_short                      key_len;[m
[31m-    ngx_queue_t                  queue;[m
[31m-    uint64_t                     expires;[m
[31m-    uint8_t                      value_type;[m
[31m-    uint32_t                     value_len;[m
[31m-    uint32_t                     user_flags;[m
[31m-    u_char                       data[1];[m
[31m-} ngx_http_lua_shdict_node_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_rbtree_t                  rbtree;[m
[31m-    ngx_rbtree_node_t             sentinel;[m
[31m-    ngx_queue_t                   queue;[m
[31m-} ngx_http_lua_shdict_shctx_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_shdict_shctx_t  *sh;[m
[31m-    ngx_slab_pool_t              *shpool;[m
[31m-    ngx_str_t                     name;[m
[31m-    ngx_http_lua_main_conf_t     *main_conf;[m
[31m-    ngx_log_t                    *log;[m
[31m-    ngx_cycle_t                  *cycle;[m
[31m-} ngx_http_lua_shdict_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data);[m
[31m-void ngx_http_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp,[m
[31m-    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);[m
[31m-void ngx_http_lua_inject_shdict_api(ngx_http_lua_main_conf_t *lmcf,[m
[31m-    lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SHDICT_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_sleep.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_sleep.c[m
[1mdeleted file mode 100644[m
[1mindex a887c3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_sleep.c[m
[1m+++ /dev/null[m
[36m@@ -1,192 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_sleep.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_sleep(lua_State *L);[m
[31m-static void ngx_http_lua_sleep_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_sleep_cleanup(void *data);[m
[31m-static ngx_int_t ngx_http_lua_sleep_resume(ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_sleep(lua_State *L)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_int_t                    delay; /* in msec */[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "attempt to pass %d arguments, but accepted 1", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    delay = (ngx_int_t) (luaL_checknumber(L, 1) * 1000);[m
[31m-[m
[31m-    if (delay < 0) {[m
[31m-        return luaL_error(L, "invalid sleep duration \"%d\"", delay);[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_sleep_cleanup;[m
[31m-    coctx->data = r;[m
[31m-[m
[31m-    coctx->sleep.handler = ngx_http_lua_sleep_handler;[m
[31m-    coctx->sleep.data = coctx;[m
[31m-    coctx->sleep.log = r->connection->log;[m
[31m-[m
[31m-    dd("adding timer with delay %lu ms, r:%.*s", (unsigned long) delay,[m
[31m-       (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    ngx_add_timer(&coctx->sleep, (ngx_msec_t) delay);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua ready to sleep for %d ms", delay);[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_sleep_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_log_ctx_t      *log_ctx;[m
[31m-    ngx_http_lua_co_ctx_t   *coctx;[m
[31m-[m
[31m-    coctx = ev->data;[m
[31m-[m
[31m-    r = coctx->data;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->fd != (ngx_socket_t) -1) {  /* not a fake connection */[m
[31m-        log_ctx = c->log->data;[m
[31m-        log_ctx->current_request = r;[m
[31m-    }[m
[31m-[m
[31m-    coctx->cleanup = NULL;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua sleep timer expired: \"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        (void) ngx_http_lua_sleep_resume(r);[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->resume_handler = ngx_http_lua_sleep_resume;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_sleep_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_sleep);[m
[31m-    lua_setfield(L, -2, "sleep");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_sleep_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t          *coctx = data;[m
[31m-[m
[31m-    if (coctx->sleep.timer_set) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "lua clean up the timer for pending ngx.sleep");[m
[31m-[m
[31m-        ngx_del_timer(&coctx->sleep);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_sleep_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_sleep.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_sleep.h[m
[1mdeleted file mode 100644[m
[1mindex 80c79b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_sleep.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SLEEP_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SLEEP_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_sleep_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SLEEP_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.c[m
[1mdeleted file mode 100644[m
[1mindex 2bfdbd3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.c[m
[1m+++ /dev/null[m
[36m@@ -1,5322 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_socket_tcp.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_uthread.h"[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_socket_tcp(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_connect(lua_State *L);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static int ngx_http_lua_socket_tcp_sslhandshake(lua_State *L);[m
[31m-#endif[m
[31m-static int ngx_http_lua_socket_tcp_receive(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_send(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_close(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_setoption(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_settimeout(lua_State *L);[m
[31m-static void ngx_http_lua_socket_tcp_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_get_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data);[m
[31m-static void ngx_http_lua_socket_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_send_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_connected_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_tcp_cleanup(void *data);[m
[31m-static void ngx_http_lua_socket_tcp_finalize(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_tcp_finalize_read_part(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_tcp_finalize_write_part(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_socket_send(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_socket_test_connect(ngx_http_request_t *r,[m
[31m-    ngx_connection_t *c);[m
[31m-static void ngx_http_lua_socket_handle_conn_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_lua_socket_handle_read_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_lua_socket_handle_write_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_lua_socket_handle_conn_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_handle_read_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_handle_write_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static int ngx_http_lua_socket_tcp_send_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_conn_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static void ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_read(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static int ngx_http_lua_socket_tcp_receive_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_read_line(void *data, ssize_t bytes);[m
[31m-static void ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static int ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static int ngx_http_lua_socket_conn_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static int ngx_http_lua_socket_read_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static int ngx_http_lua_socket_write_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_read_all(void *data, ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_lua_socket_read_until(void *data, ssize_t bytes);[m
[31m-static ngx_int_t ngx_http_lua_socket_read_chunk(void *data, ssize_t bytes);[m
[31m-static int ngx_http_lua_socket_tcp_receiveuntil(lua_State *L);[m
[31m-static int ngx_http_lua_socket_receiveuntil_iterator(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_compile_pattern(u_char *data, size_t len,[m
[31m-    ngx_http_lua_socket_compiled_pattern_t *cp, ngx_log_t *log);[m
[31m-static int ngx_http_lua_socket_cleanup_compiled_pattern(lua_State *L);[m
[31m-static int ngx_http_lua_req_socket(lua_State *L);[m
[31m-static void ngx_http_lua_req_socket_rev_handler(ngx_http_request_t *r);[m
[31m-static int ngx_http_lua_socket_tcp_getreusedtimes(lua_State *L);[m
[31m-static int ngx_http_lua_socket_tcp_setkeepalive(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_get_keepalive_peer(ngx_http_request_t *r,[m
[31m-    lua_State *L, int key_index,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_keepalive_dummy_handler(ngx_event_t *ev);[m
[31m-static ngx_int_t ngx_http_lua_socket_keepalive_close_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_socket_keepalive_rev_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_socket_free_pool(ngx_log_t *log,[m
[31m-    ngx_http_lua_socket_pool_t *spool);[m
[31m-static int ngx_http_lua_socket_tcp_upstream_destroy(lua_State *L);[m
[31m-static int ngx_http_lua_socket_downstream_destroy(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_push_input_data(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_socket_tcp_upstream_t *u,[m
[31m-    lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_add_pending_data(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, u_char *pos, size_t len, u_char *pat,[m
[31m-    int prefix, int old_state);[m
[31m-static ngx_int_t ngx_http_lua_socket_add_input_buffer(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_socket_insert_buffer(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, u_char *pat, size_t prefix);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_conn_resume(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_read_resume(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_write_resume(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_socket_tcp_resume_helper(ngx_http_request_t *r,[m
[31m-    int socket_op);[m
[31m-static void ngx_http_lua_tcp_resolve_cleanup(void *data);[m
[31m-static void ngx_http_lua_coctx_cleanup(void *data);[m
[31m-static int ngx_http_lua_socket_shutdown_pool(lua_State *L);[m
[31m-static void[m
[31m-    ngx_http_lua_socket_empty_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static int ngx_http_lua_socket_prepare_error_retvals(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L, ngx_uint_t ft_type);[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static int ngx_http_lua_ssl_handshake_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-static void ngx_http_lua_ssl_handshake_handler(ngx_connection_t *c);[m
[31m-static int ngx_http_lua_ssl_free_session(lua_State *L);[m
[31m-#endif[m
[31m-static void ngx_http_lua_socket_tcp_close_connection(ngx_connection_t *c);[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SOCKET_CTX_INDEX = 1,[m
[31m-    SOCKET_TIMEOUT_INDEX = 2,[m
[31m-    SOCKET_KEY_INDEX = 3[m
[31m-};[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SOCKET_OP_CONNECT,[m
[31m-    SOCKET_OP_READ,[m
[31m-    SOCKET_OP_WRITE[m
[31m-};[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_socket_check_busy_connecting(r, u, L)                   \[m
[31m-    if ((u)->conn_waiting) {                                                 \[m
[31m-        lua_pushnil(L);                                                      \[m
[31m-        lua_pushliteral(L, "socket busy connecting");                        \[m
[31m-        return 2;                                                            \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_socket_check_busy_reading(r, u, L)                      \[m
[31m-    if ((u)->read_waiting) {                                                 \[m
[31m-        lua_pushnil(L);                                                      \[m
[31m-        lua_pushliteral(L, "socket busy reading");                           \[m
[31m-        return 2;                                                            \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_socket_check_busy_writing(r, u, L)                      \[m
[31m-    if ((u)->write_waiting) {                                                \[m
[31m-        lua_pushnil(L);                                                      \[m
[31m-        lua_pushliteral(L, "socket busy writing");                           \[m
[31m-        return 2;                                                            \[m
[31m-    }                                                                        \[m
[31m-    if ((u)->raw_downstream                                                  \[m
[31m-        && ((r)->connection->buffered & NGX_HTTP_LOWLEVEL_BUFFERED))         \[m
[31m-    {                                                                        \[m
[31m-        lua_pushnil(L);                                                      \[m
[31m-        lua_pushliteral(L, "socket busy writing");                           \[m
[31m-        return 2;                                                            \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-static char ngx_http_lua_req_socket_metatable_key;[m
[31m-static char ngx_http_lua_raw_req_socket_metatable_key;[m
[31m-static char ngx_http_lua_tcp_socket_metatable_key;[m
[31m-static char ngx_http_lua_upstream_udata_metatable_key;[m
[31m-static char ngx_http_lua_downstream_udata_metatable_key;[m
[31m-static char ngx_http_lua_pool_udata_metatable_key;[m
[31m-static char ngx_http_lua_pattern_udata_metatable_key;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-static char ngx_http_lua_ssl_session_metatable_key;[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_socket_tcp_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t         rc;[m
[31m-[m
[31m-    lua_createtable(L, 0, 4 /* nrec */);    /* ngx.socket */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -3, "tcp");[m
[31m-    lua_setfield(L, -2, "stream");[m
[31m-[m
[31m-    {[m
[31m-        const char  buf[] = "local sock = ngx.socket.tcp()"[m
[31m-                            " local ok, err = sock:connect(...)"[m
[31m-                            " if ok then return sock else return nil, err end";[m
[31m-[m
[31m-        rc = luaL_loadbuffer(L, buf, sizeof(buf) - 1, "=ngx.socket.connect");[m
[31m-    }[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, 0,[m
[31m-                      "failed to load Lua code for ngx.socket.connect(): %i",[m
[31m-                      rc);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_setfield(L, -2, "connect");[m
[31m-    }[m
[31m-[m
[31m-    lua_setfield(L, -2, "socket");[m
[31m-[m
[31m-    /* {{{req socket object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_req_socket_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 4 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receive);[m
[31m-    lua_setfield(L, -2, "receive");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receiveuntil);[m
[31m-    lua_setfield(L, -2, "receiveuntil");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_settimeout);[m
[31m-    lua_setfield(L, -2, "settimeout"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{raw req socket object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_raw_req_socket_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 5 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receive);[m
[31m-    lua_setfield(L, -2, "receive");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receiveuntil);[m
[31m-    lua_setfield(L, -2, "receiveuntil");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_send);[m
[31m-    lua_setfield(L, -2, "send");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_settimeout);[m
[31m-    lua_setfield(L, -2, "settimeout"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{tcp object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_tcp_socket_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 11 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_connect);[m
[31m-    lua_setfield(L, -2, "connect");[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_sslhandshake);[m
[31m-    lua_setfield(L, -2, "sslhandshake");[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receive);[m
[31m-    lua_setfield(L, -2, "receive");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_receiveuntil);[m
[31m-    lua_setfield(L, -2, "receiveuntil");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_send);[m
[31m-    lua_setfield(L, -2, "send");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_close);[m
[31m-    lua_setfield(L, -2, "close");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_setoption);[m
[31m-    lua_setfield(L, -2, "setoption");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_settimeout);[m
[31m-    lua_setfield(L, -2, "settimeout"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_getreusedtimes);[m
[31m-    lua_setfield(L, -2, "getreusedtimes");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_setkeepalive);[m
[31m-    lua_setfield(L, -2, "setkeepalive");[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{upstream userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_upstream_udata_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_tcp_upstream_destroy);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{downstream userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_downstream_udata_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_downstream_destroy);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{socket pool userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_pool_udata_metatable_key);[m
[31m-    lua_createtable(L, 0, 1); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_shutdown_pool);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* {{{socket compiled pattern userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_pattern_udata_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_cleanup_compiled_pattern);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    /* {{{ssl session userdata metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_ssl_session_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ssl_free_session);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_socket_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_req_socket);[m
[31m-    lua_setfield(L, -2, "socket");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    if (lua_gettop(L) != 0) {[m
[31m-        return luaL_error(L, "expecting zero arguments, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    lua_createtable(L, 3 /* narr */, 1 /* nrec */);[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_tcp_socket_metatable_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    dd("top: %d", lua_gettop(L));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_connect(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_str_t                    host;[m
[31m-    int                          port;[m
[31m-    ngx_resolver_ctx_t          *rctx, temp;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    int                          saved_top;[m
[31m-    int                          n;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_url_t                    url;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_peer_connection_t       *pc;[m
[31m-    int                          timeout;[m
[31m-    unsigned                     custom_pool;[m
[31m-    int                          key_index;[m
[31m-    const char                  *msg;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 2 && n != 3 && n != 4) {[m
[31m-        return luaL_error(L, "ngx.socket connect: expecting 2, 3, or 4 "[m
[31m-                          "arguments (including the object), but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    key_index = 2;[m
[31m-    custom_pool = 0;[m
[31m-[m
[31m-    if (lua_type(L, n) == LUA_TTABLE) {[m
[31m-[m
[31m-        /* found the last optional option table */[m
[31m-[m
[31m-        lua_getfield(L, n, "pool");[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-        case LUA_TNUMBER:[m
[31m-            lua_tostring(L, -1);[m
[31m-[m
[31m-        case LUA_TSTRING:[m
[31m-            custom_pool = 1;[m
[31m-[m
[31m-            lua_pushvalue(L, -1);[m
[31m-            lua_rawseti(L, 1, SOCKET_KEY_INDEX);[m
[31m-[m
[31m-            key_index = n + 1;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TNIL:[m
[31m-            lua_pop(L, 2);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "bad \"pool\" option type: %s",[m
[31m-                                  luaL_typename(L, -1));[m
[31m-            luaL_argerror(L, n, msg);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        n--;[m
[31m-    }[m
[31m-[m
[31m-    if (n == 3) {[m
[31m-        port = luaL_checkinteger(L, 3);[m
[31m-[m
[31m-        if (port < 0 || port > 65536) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "bad port number: %d", port);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (!custom_pool) {[m
[31m-            lua_pushliteral(L, ":");[m
[31m-            lua_insert(L, 3);[m
[31m-            lua_concat(L, 3);[m
[31m-        }[m
[31m-[m
[31m-        dd("socket key: %s", lua_tostring(L, -1));[m
[31m-[m
[31m-    } else { /* n == 2 */[m
[31m-        port = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (!custom_pool) {[m
[31m-        /* the key's index is 2 */[m
[31m-[m
[31m-        lua_pushvalue(L, 2);[m
[31m-        lua_rawseti(L, 1, SOCKET_KEY_INDEX);[m
[31m-    }[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u) {[m
[31m-        if (u->request && u->request != r) {[m
[31m-            return luaL_error(L, "bad request");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-        ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-        ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-        if (u->body_downstream || u->raw_downstream) {[m
[31m-            return luaL_error(L, "attempt to re-connect a request socket");[m
[31m-        }[m
[31m-[m
[31m-        if (u->peer.connection) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua tcp socket reconnect without shutting down");[m
[31m-[m
[31m-            ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua reuse socket upstream ctx");[m
[31m-[m
[31m-    } else {[m
[31m-        u = lua_newuserdata(L, sizeof(ngx_http_lua_socket_tcp_upstream_t));[m
[31m-        if (u == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_upstream_udata_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-#endif[m
[31m-[m
[31m-        lua_rawseti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u, sizeof(ngx_http_lua_socket_tcp_upstream_t));[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    u->request = r; /* set the controlling request */[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    u->conf = llcf;[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-[m
[31m-    pc->log = r->connection->log;[m
[31m-    pc->log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    dd("lua peer connection log: %p", pc->log);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_TIMEOUT_INDEX);[m
[31m-    timeout = (ngx_int_t) lua_tointeger(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (timeout > 0) {[m
[31m-        u->send_timeout = (ngx_msec_t) timeout;[m
[31m-        u->read_timeout = (ngx_msec_t) timeout;[m
[31m-        u->connect_timeout = (ngx_msec_t) timeout;[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_timeout = u->conf->read_timeout;[m
[31m-        u->send_timeout = u->conf->send_timeout;[m
[31m-        u->connect_timeout = u->conf->connect_timeout;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_get_keepalive_peer(r, L, key_index, u);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        lua_pushinteger(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "error in get keepalive peer");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DECLINED */[m
[31m-[m
[31m-    /* TODO: we should avoid this in-pool allocation */[m
[31m-[m
[31m-    host.data = ngx_palloc(r->pool, len + 1);[m
[31m-    if (host.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    host.len = len;[m
[31m-[m
[31m-    ngx_memcpy(host.data, p, len);[m
[31m-    host.data[len] = '\0';[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.len = host.len;[m
[31m-    url.url.data = host.data;[m
[31m-    url.default_port = (in_port_t) port;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        lua_pushnil(L);[m
[31m-[m
[31m-        if (url.err) {[m
[31m-            lua_pushfstring(L, "failed to parse host name \"%s\": %s",[m
[31m-                            host.data, url.err);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushfstring(L, "failed to parse host name \"%s\"", host.data);[m
[31m-        }[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket connect timeout: %M", u->connect_timeout);[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket network address given directly");[m
[31m-[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = host;[m
[31m-        u->resolved->port = (in_port_t) port;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved->sockaddr) {[m
[31m-        rc = ngx_http_lua_socket_resolve_retval_handler(r, u, L);[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return lua_yield(L, 0);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    temp.name = host;[m
[31m-    rctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-    if (rctx == NULL) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to start the resolver");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (rctx == NGX_NO_RESOLVER) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "no resolver defined to resolve \"%s\"", host.data);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    rctx->name = host;[m
[31m-#if !defined(nginx_version) || nginx_version < 1005008[m
[31m-    rctx->type = NGX_RESOLVE_A;[m
[31m-#endif[m
[31m-    rctx->handler = ngx_http_lua_socket_resolve_handler;[m
[31m-    rctx->data = u;[m
[31m-    rctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-    u->resolved->ctx = rctx;[m
[31m-    u->write_co_ctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_tcp_resolve_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    saved_top = lua_gettop(L);[m
[31m-[m
[31m-    if (ngx_resolve_name(rctx) != NGX_OK) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket fail to run resolver immediately");[m
[31m-[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-[m
[31m-        u->resolved->ctx = NULL;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "%s could not be resolved", host.data);[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->conn_waiting) {[m
[31m-        dd("resolved and already connecting");[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    n = lua_gettop(L) - saved_top;[m
[31m-    if (n) {[m
[31m-        dd("errors occurred during resolving or connecting"[m
[31m-           "or already connected");[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    /* still resolving */[m
[31m-[m
[31m-    u->conn_waiting = 1;[m
[31m-    u->write_prepare_retvals = ngx_http_lua_socket_resolve_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_empty_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    /* do nothing */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_upstream_resolved_t        *ur;[m
[31m-    ngx_http_lua_ctx_t                  *lctx;[m
[31m-    lua_State                           *L;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-#if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    socklen_t                            socklen;[m
[31m-    struct sockaddr                     *sockaddr;[m
[31m-#else[m
[31m-    struct sockaddr_in                  *sin;[m
[31m-#endif[m
[31m-    ngx_uint_t                           i;[m
[31m-    unsigned                             waiting;[m
[31m-[m
[31m-    u = ctx->data;[m
[31m-    r = u->request;[m
[31m-    c = r->connection;[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua tcp socket resolve handler");[m
[31m-[m
[31m-    lctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (lctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lctx->cur_co_ctx = u->write_co_ctx;[m
[31m-[m
[31m-    u->write_co_ctx->cleanup = NULL;[m
[31m-[m
[31m-    L = lctx->cur_co_ctx->co;[m
[31m-[m
[31m-    waiting = u->conn_waiting;[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "lua tcp socket resolver error: %s "[m
[31m-                       "(connect waiting: %d)",[m
[31m-                       ngx_resolver_strerror(ctx->state), (int) waiting);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len);[m
[31m-        lua_pushfstring(L, " could not be resolved (%d: %s)",[m
[31m-                        (int) ctx->state,[m
[31m-                        ngx_resolver_strerror(ctx->state));[m
[31m-        lua_concat(L, 2);[m
[31m-[m
[31m-        u->write_prepare_retvals =[m
[31m-                                ngx_http_lua_socket_conn_error_retval_handler;[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_RESOLVER);[m
[31m-[m
[31m-        if (waiting) {[m
[31m-            ngx_http_run_posted_requests(c);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ur->naddrs = ctx->naddrs;[m
[31m-    ur->addrs = ctx->addrs;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-#   if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    u_char      text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t   addr;[m
[31m-#   else[m
[31m-    in_addr_t   addr;[m
[31m-#   endif[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-#   if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-    }[m
[31m-#   else[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        dd("addr i: %d %p", (int) i,  &ctx->addrs[i]);[m
[31m-[m
[31m-        addr = ntohl(ctx->addrs[i]);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "name was resolved to %ud.%ud.%ud.%ud",[m
[31m-                       (addr >> 24) & 0xff, (addr >> 16) & 0xff,[m
[31m-                       (addr >> 8) & 0xff, addr & 0xff);[m
[31m-    }[m
[31m-#   endif[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_assert(ur->naddrs > 0);[m
[31m-[m
[31m-    if (ur->naddrs == 1) {[m
[31m-        i = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        i = ngx_random() % ur->naddrs;[m
[31m-    }[m
[31m-[m
[31m-    dd("selected addr index: %d", (int) i);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    socklen = ur->addrs[i].socklen;[m
[31m-[m
[31m-    sockaddr = ngx_palloc(r->pool, socklen);[m
[31m-    if (sockaddr == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);[m
[31m-[m
[31m-    switch (sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        ((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);[m
[31m-        break;[m
[31m-#endif[m
[31m-    default: /* AF_INET */[m
[31m-        ((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);[m
[31m-    ur->sockaddr = sockaddr;[m
[31m-    ur->socklen = socklen;[m
[31m-[m
[31m-#else[m
[31m-    /* for nginx older than 1.5.8 */[m
[31m-[m
[31m-    len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    sin = (struct sockaddr_in *) &p[len];[m
[31m-    ngx_memzero(sin, sizeof(struct sockaddr_in));[m
[31m-[m
[31m-    len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);[m
[31m-    len = ngx_sprintf(&p[len], ":%d", ur->port) - p;[m
[31m-[m
[31m-    sin->sin_family = AF_INET;[m
[31m-    sin->sin_port = htons(ur->port);[m
[31m-    sin->sin_addr.s_addr = ur->addrs[i];[m
[31m-[m
[31m-    ur->sockaddr = (struct sockaddr *) sin;[m
[31m-    ur->socklen = sizeof(struct sockaddr_in);[m
[31m-#endif[m
[31m-[m
[31m-    ur->host.data = p;[m
[31m-    ur->host.len = len;[m
[31m-    ur->naddrs = 1;[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-    ur->ctx = NULL;[m
[31m-[m
[31m-    u->conn_waiting = 0;[m
[31m-    u->write_co_ctx = NULL;[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        lctx->resume_handler = ngx_http_lua_socket_tcp_conn_resume;[m
[31m-        r->write_event_handler(r);[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    } else {[m
[31m-        (void) ngx_http_lua_socket_resolve_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    if (ur->ctx) {[m
[31m-        ngx_resolve_name_done(ctx);[m
[31m-        ur->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    u->write_prepare_retvals = ngx_http_lua_socket_conn_error_retval_handler;[m
[31m-    ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                          NGX_HTTP_LUA_SOCKET_FT_NOMEM);[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        dd("run posted requests");[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_peer_connection_t           *pc;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_cleanup_t              *cln;[m
[31m-    ngx_http_upstream_resolved_t    *ur;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_lua_co_ctx_t           *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket resolve retval handler");[m
[31m-[m
[31m-    if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_RESOLVER) {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    if (ur->sockaddr) {[m
[31m-        pc->sockaddr = ur->sockaddr;[m
[31m-        pc->socklen = ur->socklen;[m
[31m-        pc->name = &ur->host;[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "resolver not working");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    pc->get = ngx_http_lua_socket_tcp_get_peer;[m
[31m-[m
[31m-    rc = ngx_event_connect_peer(pc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup == NULL) {[m
[31m-        cln = ngx_http_lua_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "no memory");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_socket_tcp_cleanup;[m
[31m-        cln->data = u;[m
[31m-        u->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket connect: %i", rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return ngx_http_lua_socket_conn_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_BUSY) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no live connection");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        dd("socket errno: %d", (int) ngx_socket_errno);[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-        return ngx_http_lua_socket_conn_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK || rc == NGX_AGAIN */[m
[31m-[m
[31m-    c = pc->connection;[m
[31m-[m
[31m-    c->data = u;[m
[31m-[m
[31m-    c->write->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-    c->read->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_lua_socket_connected_handler;[m
[31m-    u->read_event_handler = ngx_http_lua_socket_connected_handler;[m
[31m-[m
[31m-    c->sendfile &= r->connection->sendfile;[m
[31m-[m
[31m-    if (c->pool == NULL) {[m
[31m-[m
[31m-        /* we need separate pool here to be able to cache SSL connections */[m
[31m-[m
[31m-        c->pool = ngx_create_pool(128, r->connection->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            return ngx_http_lua_socket_prepare_error_retvals(r, u, L,[m
[31m-                                                NGX_HTTP_LUA_SOCKET_FT_NOMEM);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    c->log = r->connection->log;[m
[31m-    c->pool->log = c->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */[m
[31m-[m
[31m-#if 0[m
[31m-    u->writer.out = NULL;[m
[31m-    u->writer.last = &u->writer.out;[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket connected: fd:%d", (int) c->fd);[m
[31m-[m
[31m-        /* We should delete the current write/read event[m
[31m-         * here because the socket object may not be used immediately[m
[31m-         * on the Lua land, thus causing hot spin around level triggered[m
[31m-         * event poll and wasting CPU cycles. */[m
[31m-[m
[31m-        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-            ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                                  NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "failed to handle write event");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                                  NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "failed to handle read event");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-        u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-        lua_pushinteger(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    ngx_add_timer(c->write, u->connect_timeout);[m
[31m-[m
[31m-    u->write_co_ctx = ctx->cur_co_ctx;[m
[31m-    u->conn_waiting = 1;[m
[31m-    u->write_prepare_retvals = ngx_http_lua_socket_tcp_conn_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_conn_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_uint_t      ft_type;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket error retval handler");[m
[31m-[m
[31m-    if (u->write_co_ctx) {[m
[31m-        u->write_co_ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-[m
[31m-    ft_type = u->ft_type;[m
[31m-    u->ft_type = 0;[m
[31m-    return ngx_http_lua_socket_prepare_error_retvals(r, u, L, ft_type);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_sslhandshake(lua_State *L)[m
[31m-{[m
[31m-    int                      n, top;[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_str_t                name = ngx_null_string;[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_ssl_session_t      **psession;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_lua_co_ctx_t   *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    /* Lua function arguments: self [,session] [,host] [,verify] */[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n < 1 || n > 5) {[m
[31m-        return luaL_error(L, "ngx.socket connect: expecting 1 ~ 5 "[m
[31m-                          "arguments (including the object), but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket ssl handshake");[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u == NULL[m
[31m-        || u->peer.connection == NULL[m
[31m-        || u->read_closed[m
[31m-        || u->write_closed)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "not supported for downstream");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    u->ssl_session_reuse = 1;[m
[31m-[m
[31m-    if (c->ssl && c->ssl->handshaked) {[m
[31m-        switch (lua_type(L, 2)) {[m
[31m-        case LUA_TUSERDATA:[m
[31m-            lua_pushvalue(L, 2);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TBOOLEAN:[m
[31m-            if (!lua_toboolean(L, 2)) {[m
[31m-                /* avoid generating the ssl session */[m
[31m-                lua_pushboolean(L, 1);[m
[31m-                break;[m
[31m-            }[m
[31m-            /* fall through */[m
[31m-[m
[31m-        default:[m
[31m-            ngx_http_lua_ssl_handshake_retval_handler(r, u, L);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_ssl_create_connection(u->conf->ssl, c,[m
[31m-                                  NGX_SSL_BUFFER|NGX_SSL_CLIENT)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to create ssl connection");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    c->sendfile = 0;[m
[31m-[m
[31m-    if (n >= 2) {[m
[31m-        if (lua_type(L, 2) == LUA_TBOOLEAN) {[m
[31m-            u->ssl_session_reuse = lua_toboolean(L, 2);[m
[31m-[m
[31m-        } else {[m
[31m-            psession = lua_touserdata(L, 2);[m
[31m-[m
[31m-            if (psession != NULL && *psession != NULL) {[m
[31m-                if (ngx_ssl_set_session(c, *psession) != NGX_OK) {[m
[31m-                    lua_pushnil(L);[m
[31m-                    lua_pushliteral(L, "lua ssl set session failed");[m
[31m-                    return 2;[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                               "lua ssl set session: %p:%d",[m
[31m-                               *psession, (*psession)->references);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (n >= 3) {[m
[31m-            name.data = (u_char *) lua_tolstring(L, 3, &name.len);[m
[31m-[m
[31m-            if (name.data) {[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua ssl server name: \"%*s\"", name.len,[m
[31m-                               name.data);[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-                if (SSL_set_tlsext_host_name(c->ssl->connection, name.data)[m
[31m-                    == 0)[m
[31m-                {[m
[31m-                    lua_pushnil(L);[m
[31m-                    lua_pushliteral(L, "SSL_set_tlsext_host_name failed");[m
[31m-                    return 2;[m
[31m-                }[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-               ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                              "lua socket SNI disabled because the current "[m
[31m-                              "version of OpenSSL lacks the support");[m
[31m-[m
[31m-#endif[m
[31m-            }[m
[31m-[m
[31m-            if (n >= 4) {[m
[31m-                u->ssl_verify = lua_toboolean(L, 4);[m
[31m-[m
[31m-                if (n >= 5) {[m
[31m-                    if (lua_toboolean(L, 5)) {[m
[31m-#ifdef NGX_HTTP_LUA_USE_OCSP[m
[31m-                        SSL_set_tlsext_status_type(c->ssl->connection,[m
[31m-                                                   TLSEXT_STATUSTYPE_ocsp);[m
[31m-#else[m
[31m-                        return luaL_error(L, "no OCSP support");[m
[31m-#endif[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("found sni name: %.*s %p", (int) name.len, name.data, name.data);[m
[31m-[m
[31m-    if (name.len == 0) {[m
[31m-        u->ssl_name.len = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        if (u->ssl_name.data) {[m
[31m-            /* buffer already allocated */[m
[31m-[m
[31m-            if (u->ssl_name.len >= name.len) {[m
[31m-                /* reuse it */[m
[31m-                ngx_memcpy(u->ssl_name.data, name.data, name.len);[m
[31m-                u->ssl_name.len = name.len;[m
[31m-[m
[31m-            } else {[m
[31m-                ngx_free(u->ssl_name.data);[m
[31m-                goto new_ssl_name;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-new_ssl_name:[m
[31m-[m
[31m-            u->ssl_name.data = ngx_alloc(name.len, ngx_cycle->log);[m
[31m-            if (u->ssl_name.data == NULL) {[m
[31m-                u->ssl_name.len = 0;[m
[31m-[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushliteral(L, "no memory");[m
[31m-                return 2;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(u->ssl_name.data, name.data, name.len);[m
[31m-            u->ssl_name.len = name.len;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    u->write_co_ctx = coctx;[m
[31m-[m
[31m-#if 0[m
[31m-#ifdef NGX_HTTP_LUA_USE_OCSP[m
[31m-    SSL_set_tlsext_status_type(c->ssl->connection, TLSEXT_STATUSTYPE_ocsp);[m
[31m-#endif[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_ssl_handshake(c);[m
[31m-[m
[31m-    dd("ngx_ssl_handshake returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        ngx_add_timer(c->read, u->connect_timeout);[m
[31m-[m
[31m-        u->conn_waiting = 1;[m
[31m-        u->write_prepare_retvals = ngx_http_lua_ssl_handshake_retval_handler;[m
[31m-[m
[31m-        ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-        coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-        coctx->data = u;[m
[31m-[m
[31m-        c->ssl->handler = ngx_http_lua_ssl_handshake_handler;[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-        } else {[m
[31m-            r->write_event_handler = ngx_http_core_run_phases;[m
[31m-        }[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    top = lua_gettop(L);[m
[31m-    ngx_http_lua_ssl_handshake_handler(c);[m
[31m-    return lua_gettop(L) - top;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ssl_handshake_handler(ngx_connection_t *c)[m
[31m-{[m
[31m-    const char                  *err;[m
[31m-    int                          waiting;[m
[31m-    lua_State                   *L;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *dc;  /* downstream connection */[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    u = c->data;[m
[31m-    r = u->request;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-    c->read->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-[m
[31m-    waiting = u->conn_waiting;[m
[31m-[m
[31m-    dc = r->connection;[m
[31m-    L = u->write_co_ctx->co;[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "timeout");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->ssl->handshaked) {[m
[31m-[m
[31m-        if (u->ssl_verify) {[m
[31m-            rc = SSL_get_verify_result(c->ssl->connection);[m
[31m-[m
[31m-            if (rc != X509_V_OK) {[m
[31m-                lua_pushnil(L);[m
[31m-                err = lua_pushfstring(L, "%d: %s", (int) rc,[m
[31m-                                      X509_verify_cert_error_string(rc));[m
[31m-[m
[31m-                llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-                if (llcf->log_socket_errors) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, dc->log, 0, "lua ssl "[m
[31m-                                  "certificate verify error: (%s)", err);[m
[31m-                }[m
[31m-[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007000[m
[31m-[m
[31m-            if (u->ssl_name.len[m
[31m-                && ngx_ssl_check_host(c, &u->ssl_name) != NGX_OK)[m
[31m-            {[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushliteral(L, "certificate host mismatch");[m
[31m-[m
[31m-                llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-                if (llcf->log_socket_errors) {[m
[31m-                    ngx_log_error(NGX_LOG_ERR, dc->log, 0, "lua ssl "[m
[31m-                                  "certificate does not match host \"%V\"",[m
[31m-                                  &u->ssl_name);[m
[31m-                }[m
[31m-[m
[31m-                goto failed;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-        }[m
[31m-[m
[31m-        if (waiting) {[m
[31m-            ngx_http_lua_socket_handle_conn_success(r, u);[m
[31m-[m
[31m-        } else {[m
[31m-            (void) ngx_http_lua_ssl_handshake_retval_handler(r, u, L);[m
[31m-        }[m
[31m-[m
[31m-        if (waiting) {[m
[31m-            ngx_http_run_posted_requests(dc);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    lua_pushliteral(L, "handshake failed");[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        u->write_prepare_retvals =[m
[31m-                                ngx_http_lua_socket_conn_error_retval_handler;[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_SSL);[m
[31m-        ngx_http_run_posted_requests(dc);[m
[31m-[m
[31m-    } else {[m
[31m-        (void) ngx_http_lua_socket_conn_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ssl_handshake_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_ssl_session_t           *ssl_session, **ud;[m
[31m-[m
[31m-    if (!u->ssl_session_reuse) {[m
[31m-        lua_pushboolean(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ud = lua_newuserdata(L, sizeof(ngx_ssl_session_t *));[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ssl_session = ngx_ssl_get_session(c);[m
[31m-    if (ssl_session == NULL) {[m
[31m-        *ud = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        *ud = ssl_session;[m
[31m-[m
[31m-       ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                      "lua ssl save session: %p:%d", ssl_session,[m
[31m-                      ssl_session->references);[m
[31m-[m
[31m-        /* set up the __gc metamethod */[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_ssl_session_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_read_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_uint_t          ft_type;[m
[31m-[m
[31m-    if (u->read_co_ctx) {[m
[31m-        u->read_co_ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ft_type = u->ft_type;[m
[31m-    u->ft_type = 0;[m
[31m-[m
[31m-    if (u->no_close) {[m
[31m-        u->no_close = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        ngx_http_lua_socket_tcp_finalize_read_part(r, u);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_socket_prepare_error_retvals(r, u, L, ft_type);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_write_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_uint_t          ft_type;[m
[31m-[m
[31m-    if (u->write_co_ctx) {[m
[31m-        u->write_co_ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize_write_part(r, u);[m
[31m-[m
[31m-    ft_type = u->ft_type;[m
[31m-    u->ft_type = 0;[m
[31m-    return ngx_http_lua_socket_prepare_error_retvals(r, u, L, ft_type);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_prepare_error_retvals(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    u_char           errstr[NGX_MAX_ERROR_STR];[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    if (ft_type & (NGX_HTTP_LUA_SOCKET_FT_RESOLVER[m
[31m-                   | NGX_HTTP_LUA_SOCKET_FT_SSL))[m
[31m-    {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-[m
[31m-    if (ft_type & NGX_HTTP_LUA_SOCKET_FT_TIMEOUT) {[m
[31m-        lua_pushliteral(L, "timeout");[m
[31m-[m
[31m-    } else if (ft_type & NGX_HTTP_LUA_SOCKET_FT_CLOSED) {[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-[m
[31m-    } else if (ft_type & NGX_HTTP_LUA_SOCKET_FT_BUFTOOSMALL) {[m
[31m-        lua_pushliteral(L, "buffer too small");[m
[31m-[m
[31m-    } else if (ft_type & NGX_HTTP_LUA_SOCKET_FT_NOMEM) {[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-[m
[31m-    } else if (ft_type & NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT) {[m
[31m-        lua_pushliteral(L, "client aborted");[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (u->socket_errno) {[m
[31m-#if defined(nginx_version) && nginx_version >= 9000[m
[31m-            p = ngx_strerror(u->socket_errno, errstr, sizeof(errstr));[m
[31m-#else[m
[31m-            p = ngx_strerror_r(u->socket_errno, errstr, sizeof(errstr));[m
[31m-#endif[m
[31m-            /* for compatibility with LuaSocket */[m
[31m-            ngx_strlow(errstr, errstr, p - errstr);[m
[31m-            lua_pushlstring(L, (char *) errstr, p - errstr);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushliteral(L, "error");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_conn_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    if (u->ft_type) {[m
[31m-        return ngx_http_lua_socket_conn_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_receive(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    int                                  n;[m
[31m-    ngx_str_t                            pat;[m
[31m-    lua_Integer                          bytes;[m
[31m-    char                                *p;[m
[31m-    int                                  typ;[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments "[m
[31m-                          "(including the object), but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket calling receive() method");[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u == NULL || u->peer.connection == NULL || u->read_closed) {[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to receive data on a closed socket: u:%p, "[m
[31m-                          "c:%p, ft:%d eof:%d",[m
[31m-                          u, u ? u->peer.connection : NULL,[m
[31m-                          u ? (int) u->ft_type : 0, u ? (int) u->eof : 0);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read timeout: %M", u->read_timeout);[m
[31m-[m
[31m-    if (n > 1) {[m
[31m-        if (lua_isnumber(L, 2)) {[m
[31m-            typ = LUA_TNUMBER;[m
[31m-[m
[31m-        } else {[m
[31m-            typ = lua_type(L, 2);[m
[31m-        }[m
[31m-[m
[31m-        switch (typ) {[m
[31m-        case LUA_TSTRING:[m
[31m-            pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-            if (pat.len != 2 || pat.data[0] != '*') {[m
[31m-                p = (char *) lua_pushfstring(L, "bad pattern argument: %s",[m
[31m-                                             (char *) pat.data);[m
[31m-[m
[31m-                return luaL_argerror(L, 2, p);[m
[31m-            }[m
[31m-[m
[31m-            switch (pat.data[1]) {[m
[31m-            case 'l':[m
[31m-                u->input_filter = ngx_http_lua_socket_read_line;[m
[31m-                break;[m
[31m-[m
[31m-            case 'a':[m
[31m-                u->input_filter = ngx_http_lua_socket_read_all;[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_argerror(L, 2, "bad pattern argument");[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            u->length = 0;[m
[31m-            u->rest = 0;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TNUMBER:[m
[31m-            bytes = lua_tointeger(L, 2);[m
[31m-            if (bytes < 0) {[m
[31m-                return luaL_argerror(L, 2, "bad pattern argument");[m
[31m-            }[m
[31m-[m
[31m-#if 1[m
[31m-            if (bytes == 0) {[m
[31m-                lua_pushliteral(L, "");[m
[31m-                return 1;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            u->input_filter = ngx_http_lua_socket_read_chunk;[m
[31m-            u->length = (size_t) bytes;[m
[31m-            u->rest = u->length;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return luaL_argerror(L, 2, "bad pattern argument");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        u->input_filter = ngx_http_lua_socket_read_line;[m
[31m-        u->length = 0;[m
[31m-        u->rest = 0;[m
[31m-    }[m
[31m-[m
[31m-    u->input_filter_ctx = u;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (u->bufs_in == NULL) {[m
[31m-        u->bufs_in =[m
[31m-            ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                            &ctx->free_recv_bufs,[m
[31m-                                            u->conf->buffer_size);[m
[31m-[m
[31m-        if (u->bufs_in == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        u->buf_in = u->bufs_in;[m
[31m-        u->buffer = *u->buf_in->buf;[m
[31m-    }[m
[31m-[m
[31m-    dd("tcp receive: buf_in: %p, bufs_in: %p", u->buf_in, u->bufs_in);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        r->read_event_handler = ngx_http_lua_req_socket_rev_handler;[m
[31m-    }[m
[31m-[m
[31m-    u->read_waiting = 0;[m
[31m-    u->read_co_ctx = NULL;[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_tcp_read(r, u);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("read failed: %d", (int) u->ft_type);[m
[31m-        rc = ngx_http_lua_socket_tcp_receive_retval_handler(r, u, L);[m
[31m-        dd("tcp receive retval returned: %d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket receive done in a single run");[m
[31m-[m
[31m-        return ngx_http_lua_socket_tcp_receive_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_read_handler;[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    u->read_co_ctx = coctx;[m
[31m-    u->read_waiting = 1;[m
[31m-    u->read_prepare_retvals = ngx_http_lua_socket_tcp_receive_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p, coctx:%p", u, coctx);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        ctx->downstream = u;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_read_chunk(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u = data;[m
[31m-[m
[31m-    ngx_buf_t                   *b;[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = u->request;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read chunk %z", bytes);[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_CLOSED;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (bytes >= (ssize_t) u->rest) {[m
[31m-[m
[31m-        u->buf_in->buf->last += u->rest;[m
[31m-        b->pos += u->rest;[m
[31m-        u->rest = 0;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* bytes < u->rest */[m
[31m-[m
[31m-    u->buf_in->buf->last += bytes;[m
[31m-    b->pos += bytes;[m
[31m-    u->rest -= bytes;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_read_all(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u = data;[m
[31m-[m
[31m-    ngx_buf_t                   *b;[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = u->request;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read all");[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    u->buf_in->buf->last += bytes;[m
[31m-    b->pos += bytes;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_read_line(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u = data;[m
[31m-[m
[31m-    ngx_buf_t                   *b;[m
[31m-    u_char                      *dst;[m
[31m-    u_char                       c;[m
[31m-#if (NGX_DEBUG)[m
[31m-    u_char                      *begin;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, u->request->connection->log, 0,[m
[31m-                   "lua tcp socket read line");[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_CLOSED;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    begin = b->pos;[m
[31m-#endif[m
[31m-[m
[31m-    dd("already read: %p: %.*s", u->buf_in,[m
[31m-       (int) (u->buf_in->buf->last - u->buf_in->buf->pos),[m
[31m-       u->buf_in->buf->pos);[m
[31m-[m
[31m-    dd("data read: %.*s", (int) bytes, b->pos);[m
[31m-[m
[31m-    dst = u->buf_in->buf->last;[m
[31m-[m
[31m-    while (bytes--) {[m
[31m-[m
[31m-        c = *b->pos++;[m
[31m-[m
[31m-        switch (c) {[m
[31m-        case '\n':[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, u->request->connection->log, 0,[m
[31m-                           "lua tcp socket read the final line part: \"%*s\"",[m
[31m-                           b->pos - 1 - begin, begin);[m
[31m-[m
[31m-            u->buf_in->buf->last = dst;[m
[31m-[m
[31m-            dd("read a line: %p: %.*s", u->buf_in,[m
[31m-               (int) (u->buf_in->buf->last - u->buf_in->buf->pos),[m
[31m-               u->buf_in->buf->pos);[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-[m
[31m-        case '\r':[m
[31m-            /* ignore it */[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            *dst++ = c;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, u->request->connection->log, 0,[m
[31m-                   "lua tcp socket read partial line data: %*s",[m
[31m-                   dst - begin, begin);[m
[31m-#endif[m
[31m-[m
[31m-    u->buf_in->buf->last = dst;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_read(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_buf_t                   *b;[m
[31m-    ngx_event_t                 *rev;[m
[31m-    size_t                       size;[m
[31m-    ssize_t                      n;[m
[31m-    unsigned                     read;[m
[31m-    off_t                        preread = 0;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua tcp socket read data: wait:%d",[m
[31m-                   (int) u->read_waiting);[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-    read = 0;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        size = b->last - b->pos;[m
[31m-[m
[31m-        if (size || u->eof) {[m
[31m-[m
[31m-            rc = u->input_filter(u->input_filter_ctx, size);[m
[31m-[m
[31m-            if (rc == NGX_OK) {[m
[31m-[m
[31m-                ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua tcp socket receive done: wait:%d, eof:%d, "[m
[31m-                               "uri:\"%V?%V\"", (int) u->read_waiting,[m
[31m-                               (int) u->eof, &r->uri, &r->args);[m
[31m-[m
[31m-                if (u->body_downstream[m
[31m-                    && b->last == b->pos[m
[31m-                    && r->request_body->rest == 0)[m
[31m-                {[m
[31m-[m
[31m-                    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-                    if (llcf->check_client_abort) {[m
[31m-                        rc = ngx_http_lua_check_broken_connection(r, rev);[m
[31m-[m
[31m-                        if (rc == NGX_OK) {[m
[31m-                            goto success;[m
[31m-                        }[m
[31m-[m
[31m-                        if (rc == NGX_HTTP_CLIENT_CLOSED_REQUEST) {[m
[31m-                            ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                          NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT);[m
[31m-[m
[31m-                        } else {[m
[31m-                            ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-                        }[m
[31m-[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-#if 1[m
[31m-                if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-                    ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                     NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-#endif[m
[31m-[m
[31m-success:[m
[31m-[m
[31m-                ngx_http_lua_socket_handle_read_success(r, u);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                dd("input filter error: ft_type:%d wait:%d",[m
[31m-                   (int) u->ft_type, (int) u->read_waiting);[m
[31m-[m
[31m-                ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                                NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* rc == NGX_AGAIN */[m
[31m-[m
[31m-            if (u->body_downstream && r->request_body->rest == 0) {[m
[31m-                u->eof = 1;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (read && !rev->ready) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        size = b->end - b->last;[m
[31m-[m
[31m-        if (size == 0) {[m
[31m-            rc = ngx_http_lua_socket_add_input_buffer(r, u);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                                NGX_HTTP_LUA_SOCKET_FT_NOMEM);[m
[31m-[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            b = &u->buffer;[m
[31m-            size = (size_t) (b->end - b->last);[m
[31m-        }[m
[31m-[m
[31m-        if (u->raw_downstream) {[m
[31m-            preread = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-            if (preread) {[m
[31m-[m
[31m-                if ((off_t) size > preread) {[m
[31m-                    size = (size_t) preread;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_probe_req_socket_consume_preread(r,[m
[31m-                                                              r->header_in->pos,[m
[31m-                                                              size);[m
[31m-[m
[31m-                b->last = ngx_copy(b->last, r->header_in->pos, size);[m
[31m-                r->header_in->pos += size;[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-        } else if (u->body_downstream) {[m
[31m-[m
[31m-            if (r->request_body->rest == 0) {[m
[31m-[m
[31m-                dd("request body rest is zero");[m
[31m-[m
[31m-                u->eof = 1;[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua request body exhausted");[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* try to process the preread body */[m
[31m-[m
[31m-            preread = r->header_in->last - r->header_in->pos;[m
[31m-[m
[31m-            if (preread) {[m
[31m-[m
[31m-                /* there is the pre-read part of the request body */[m
[31m-[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "http client request body preread %O", preread);[m
[31m-[m
[31m-                if (preread >= r->request_body->rest) {[m
[31m-                    preread = r->request_body->rest;[m
[31m-                }[m
[31m-[m
[31m-                if ((off_t) size > preread) {[m
[31m-                    size = (size_t) preread;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_probe_req_socket_consume_preread(r,[m
[31m-                                                              r->header_in->pos,[m
[31m-                                                              size);[m
[31m-[m
[31m-                b->last = ngx_copy(b->last, r->header_in->pos, size);[m
[31m-[m
[31m-                r->header_in->pos += size;[m
[31m-                r->request_length += size;[m
[31m-[m
[31m-                if (r->request_body->rest) {[m
[31m-                    r->request_body->rest -= size;[m
[31m-                }[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (size > (size_t) r->request_body->rest) {[m
[31m-                size = (size_t) r->request_body->rest;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        if (rev->active && !rev->ready) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            break;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket try to recv data %uz: \"%V?%V\"",[m
[31m-                       size, &r->uri, &r->args);[m
[31m-[m
[31m-        n = c->recv(c, b->last, size);[m
[31m-[m
[31m-        dd("read event ready: %d", (int) c->read->ready);[m
[31m-[m
[31m-        read = 1;[m
[31m-[m
[31m-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket recv returned %d: \"%V?%V\"",[m
[31m-                       (int) n, &r->uri, &r->args);[m
[31m-[m
[31m-        if (n == NGX_AGAIN) {[m
[31m-            rc = NGX_AGAIN;[m
[31m-            dd("socket recv busy");[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        if (n == 0) {[m
[31m-[m
[31m-            if (u->raw_downstream || u->body_downstream) {[m
[31m-[m
[31m-                llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-                if (llcf->check_client_abort) {[m
[31m-[m
[31m-                    ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                          NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                /* llcf->check_client_abort == 0 */[m
[31m-[m
[31m-                if (u->body_downstream && r->request_body->rest) {[m
[31m-                    ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                          NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            u->eof = 1;[m
[31m-[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua tcp socket closed");[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            u->socket_errno = ngx_socket_errno;[m
[31m-            ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                                  NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        b->last += n;[m
[31m-[m
[31m-        if (u->body_downstream) {[m
[31m-            r->request_length += n;[m
[31m-            r->request_body->rest -= n;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        ngx_add_timer(rev, u->read_timeout);[m
[31m-[m
[31m-    } else if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_send(lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-    ngx_chain_t                         *cl;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    int                                  type;[m
[31m-    int                                  tcp_nodelay;[m
[31m-    const char                          *msg;[m
[31m-    ngx_buf_t                           *b;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-    ngx_http_core_loc_conf_t            *clcf;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx;[m
[31m-[m
[31m-    /* TODO: add support for the optional "i" and "j" arguments */[m
[31m-[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expecting 2 arguments (including the object), "[m
[31m-                          "but got %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    dd("tcp send: u=%p, u->write_closed=%d", u, (unsigned) u->write_closed);[m
[31m-[m
[31m-    if (u == NULL || u->peer.connection == NULL || u->write_closed) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to send data on a closed socket: u:%p, "[m
[31m-                          "c:%p, ft:%d eof:%d",[m
[31m-                          u, u ? u->peer.connection : NULL,[m
[31m-                          u ? (int) u->ft_type : 0, u ? (int) u->eof : 0);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-    if (u->body_downstream) {[m
[31m-        return luaL_error(L, "attempt to write to request sockets");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket send timeout: %M", u->send_timeout);[m
[31m-[m
[31m-    type = lua_type(L, 2);[m
[31m-    switch (type) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            lua_tolstring(L, 2, &len);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            len = ngx_http_lua_calc_strlen_in_table(L, 2, 2, 1 /* strict */);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "string, number, boolean, nil, "[m
[31m-                                  "or array table expected, got %s",[m
[31m-                                  lua_typename(L, type));[m
[31m-[m
[31m-            return luaL_argerror(L, 2, msg);[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        lua_pushinteger(L, 0);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, len);[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    switch (type) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            p = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-            b->last = ngx_copy(b->last, (u_char *) p, len);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            b->last = ngx_http_lua_copy_str_in_table(L, -1, b->last);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return luaL_error(L, "impossible to reach here");[m
[31m-    }[m
[31m-[m
[31m-    u->request_bufs = cl;[m
[31m-[m
[31m-    u->request_len = len;[m
[31m-[m
[31m-    /* mimic ngx_http_upstream_init_request here */[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "lua socket tcp_nodelay");[m
[31m-[m
[31m-        tcp_nodelay = 1;[m
[31m-[m
[31m-        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,[m
[31m-                       (const void *) &tcp_nodelay, sizeof(int))[m
[31m-            == -1)[m
[31m-        {[m
[31m-            llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-            if (llcf->log_socket_errors) {[m
[31m-                ngx_connection_error(c, ngx_socket_errno,[m
[31m-                                     "setsockopt(TCP_NODELAY) "[m
[31m-                                     "failed");[m
[31m-            }[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "setsocketopt tcp_nodelay failed");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        c->tcp_nodelay = NGX_TCP_NODELAY_SET;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    u->write_waiting = 0;[m
[31m-    u->write_co_ctx = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_probe_socket_tcp_send_start(r, u, b->pos, len);[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_send(r, u);[m
[31m-[m
[31m-    dd("socket send returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return ngx_http_lua_socket_write_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        lua_pushinteger(L, len);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (u->raw_downstream) {[m
[31m-        ctx->writing_raw_req_socket = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    u->write_co_ctx = coctx;[m
[31m-    u->write_waiting = 1;[m
[31m-    u->write_prepare_retvals = ngx_http_lua_socket_tcp_send_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_send_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket send return value handler");[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-        return ngx_http_lua_socket_write_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, u->request_len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_receive_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    int                          n;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_event_t                 *ev;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket receive return value handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-#if 1[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->check_client_abort) {[m
[31m-[m
[31m-            r->read_event_handler = ngx_http_lua_rd_check_broken_connection;[m
[31m-[m
[31m-            ev = r->connection->read;[m
[31m-[m
[31m-            dd("rev active: %d", ev->active);[m
[31m-[m
[31m-            if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && !ev->active) {[m
[31m-                if (ngx_add_event(ev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                    lua_pushnil(L);[m
[31m-                    lua_pushliteral(L, "failed to add event");[m
[31m-                    return 2;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            /* llcf->check_client_abort == 0 */[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-[m
[31m-        if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_TIMEOUT) {[m
[31m-            u->no_close = 1;[m
[31m-        }[m
[31m-[m
[31m-        dd("u->bufs_in: %p", u->bufs_in);[m
[31m-[m
[31m-        if (u->bufs_in) {[m
[31m-            rc = ngx_http_lua_socket_push_input_data(r, ctx, u, L);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushliteral(L, "no memory");[m
[31m-                return 2;[m
[31m-            }[m
[31m-[m
[31m-            (void) ngx_http_lua_socket_read_error_retval_handler(r, u, L);[m
[31m-[m
[31m-            lua_pushvalue(L, -3);[m
[31m-            lua_remove(L, -4);[m
[31m-            return 3;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_http_lua_socket_read_error_retval_handler(r, u, L);[m
[31m-        lua_pushliteral(L, "");[m
[31m-        return n + 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_push_input_data(r, ctx, u, L);[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_close(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument "[m
[31m-                          "(including the object) but seen %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL[m
[31m-        || u->peer.connection == NULL[m
[31m-        || (u->read_closed && u->write_closed))[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "attempt to close a request socket");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_setoption(lua_State *L)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_settimeout(lua_State *L)[m
[31m-{[m
[31m-    int                     n;[m
[31m-    ngx_int_t               timeout;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 2) {[m
[31m-        return luaL_error(L, "ngx.socket settimout: expecting at least 2 "[m
[31m-                          "arguments (including the object) but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    timeout = (ngx_int_t) lua_tonumber(L, 2);[m
[31m-[m
[31m-    lua_rawseti(L, 1, SOCKET_TIMEOUT_INDEX);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u) {[m
[31m-        if (timeout > 0) {[m
[31m-            u->read_timeout = (ngx_msec_t) timeout;[m
[31m-            u->send_timeout = (ngx_msec_t) timeout;[m
[31m-            u->connect_timeout = (ngx_msec_t) timeout;[m
[31m-[m
[31m-        } else {[m
[31m-            u->read_timeout = u->conf->read_timeout;[m
[31m-            u->send_timeout = u->conf->send_timeout;[m
[31m-            u->connect_timeout = u->conf->connect_timeout;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_request_t              *r;[m
[31m-    ngx_http_log_ctx_t              *ctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    u = c->data;[m
[31m-    r = u->request;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->fd != (ngx_socket_t) -1) {  /* not a fake connection */[m
[31m-        ctx = c->log->data;[m
[31m-        ctx->current_request = r;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua tcp socket handler for \"%V?%V\", wev %d", &r->uri,[m
[31m-                   &r->args, (int) ev->write);[m
[31m-[m
[31m-    if (ev->write) {[m
[31m-        u->write_event_handler(r, u);[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    /* empty */[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read handler");[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        c->read->timedout = 0;[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua tcp socket read timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_handle_read_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (u->buffer.start != NULL) {[m
[31m-        (void) ngx_http_lua_socket_tcp_read(r, u);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_send_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket send handler");[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua tcp socket write timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                               NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request_bufs) {[m
[31m-        (void) ngx_http_lua_socket_send(r, u);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_send(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                    n;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_buf_t                   *b;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket send data");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                               NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = u->request_bufs->buf;[m
[31m-[m
[31m-    for (;;) {[m
[31m-        n = c->send(c, b->pos, b->last - b->pos);[m
[31m-[m
[31m-        if (n >= 0) {[m
[31m-            b->pos += n;[m
[31m-[m
[31m-            if (b->pos == b->last) {[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                               "lua tcp socket sent all the data");[m
[31m-[m
[31m-                if (c->write->timer_set) {[m
[31m-                    ngx_del_timer(c->write);[m
[31m-                }[m
[31m-[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-                ngx_chain_update_chains(r->pool,[m
[31m-#else[m
[31m-                ngx_chain_update_chains([m
[31m-#endif[m
[31m-                                        &ctx->free_bufs, &ctx->busy_bufs,[m
[31m-                                        &u->request_bufs,[m
[31m-                                        (ngx_buf_tag_t) &ngx_http_lua_module);[m
[31m-[m
[31m-                u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-                if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-                    ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                                NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_socket_handle_write_success(r, u);[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            /* keep sending more data */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* NGX_ERROR || NGX_AGAIN */[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        c->error = 1;[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-        ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                               NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* n == NGX_AGAIN */[m
[31m-[m
[31m-    if (u->raw_downstream) {[m
[31m-        ctx->writing_raw_req_socket = 1;[m
[31m-    }[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_lua_socket_send_handler;[m
[31m-[m
[31m-    ngx_add_timer(c->write, u->send_timeout);[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_handle_write_error(r, u,[m
[31m-                                               NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_conn_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-#if 1[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-    u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->conn_waiting) {[m
[31m-        u->conn_waiting = 0;[m
[31m-[m
[31m-        coctx = u->write_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->write_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_conn_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request (conn)");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_read_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-#if 1[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->read_waiting) {[m
[31m-        u->read_waiting = 0;[m
[31m-[m
[31m-        coctx = u->read_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->read_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_read_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request (read)");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_write_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-#if 1[m
[31m-    u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-#endif[m
[31m-[m
[31m-    if (u->write_waiting) {[m
[31m-        u->write_waiting = 0;[m
[31m-[m
[31m-        coctx = u->write_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->write_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_write_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request (read)");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_conn_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket handle connect error");[m
[31m-[m
[31m-    u->ft_type |= ft_type;[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-    u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    dd("connection waiting: %d", (int) u->conn_waiting);[m
[31m-[m
[31m-    coctx = u->write_co_ctx;[m
[31m-[m
[31m-    if (u->conn_waiting) {[m
[31m-        u->conn_waiting = 0;[m
[31m-[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->write_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_conn_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_read_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket handle read error");[m
[31m-[m
[31m-    u->ft_type |= ft_type;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    if (u->read_waiting) {[m
[31m-        u->read_waiting = 0;[m
[31m-[m
[31m-        coctx = u->read_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->read_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_read_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_handle_write_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket handle write error");[m
[31m-[m
[31m-    u->ft_type |= ft_type;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    if (u->write_waiting) {[m
[31m-        u->write_waiting = 0;[m
[31m-[m
[31m-        coctx = u->write_co_ctx;[m
[31m-        coctx->cleanup = NULL;[m
[31m-        u->write_co_ctx = NULL;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_tcp_write_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_http_lua_assert(coctx && (!ngx_http_lua_is_thread(ctx)[m
[31m-                            || coctx->co_ref >= 0));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_connected_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c->write->timedout) {[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua tcp socket connect timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_test_connect(r, c);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        if (rc > 0) {[m
[31m-            u->socket_errno = (ngx_err_t) rc;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket connected");[m
[31m-[m
[31m-    /* We should delete the current write/read event[m
[31m-     * here because the socket object may not be used immediately[m
[31m-     * on the Lua land, thus causing hot spin around level triggered[m
[31m-     * event poll and wasting CPU cycles. */[m
[31m-[m
[31m-    if (ngx_handle_write_event(c->write, 0) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_handle_conn_error(r, u,[m
[31m-                                              NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_handle_conn_success(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u = data;[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = u->request;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup lua tcp socket request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_finalize_read_part(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_chain_t                         *cl;[m
[31m-    ngx_chain_t                        **ll;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-[m
[31m-    if (u->read_closed) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->read_closed = 1;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx && u->bufs_in) {[m
[31m-[m
[31m-        ll = &u->bufs_in;[m
[31m-        for (cl = u->bufs_in; cl; cl = cl->next) {[m
[31m-            dd("bufs_in chain: %p, next %p", cl, cl->next);[m
[31m-            cl->buf->pos = cl->buf->last;[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-        dd("ctx: %p", ctx);[m
[31m-        dd("free recv bufs: %p", ctx->free_recv_bufs);[m
[31m-        *ll = ctx->free_recv_bufs;[m
[31m-        ctx->free_recv_bufs = u->bufs_in;[m
[31m-        u->bufs_in = NULL;[m
[31m-        u->buf_in = NULL;[m
[31m-        ngx_memzero(&u->buffer, sizeof(ngx_buf_t));[m
[31m-    }[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        if (r->connection->read->timer_set) {[m
[31m-            ngx_del_timer(r->connection->read);[m
[31m-        }[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c) {[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        if (c->read->active || c->read->disabled) {[m
[31m-            ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (c->read->posted) {[m
[31m-#else[m
[31m-        if (c->read->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(c->read);[m
[31m-        }[m
[31m-[m
[31m-        c->read->closed = 1;[m
[31m-[m
[31m-        /* TODO: shutdown the reading part of the connection */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_finalize_write_part(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-[m
[31m-    if (u->write_closed) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u->write_closed = 1;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        if (ctx && ctx->writing_raw_req_socket) {[m
[31m-            ctx->writing_raw_req_socket = 0;[m
[31m-            if (r->connection->write->timer_set) {[m
[31m-                ngx_del_timer(r->connection->write);[m
[31m-            }[m
[31m-[m
[31m-            r->connection->write->error = 1;[m
[31m-        }[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-[m
[31m-    if (c) {[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        if (c->write->active || c->write->disabled) {[m
[31m-            ngx_del_event(c->write, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (c->write->posted) {[m
[31m-#else[m
[31m-        if (c->write->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(c->write);[m
[31m-        }[m
[31m-[m
[31m-        c->write->closed = 1;[m
[31m-[m
[31m-        /* TODO: shutdown the writing part of the connection */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_finalize(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t               *c;[m
[31m-    ngx_http_lua_socket_pool_t     *spool;[m
[31m-[m
[31m-    dd("request: %p, u: %p, u->cleanup: %p", r, u, u->cleanup);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua finalize socket");[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-        ngx_http_lua_cleanup_free(r, u->cleanup);[m
[31m-        u->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize_read_part(r, u);[m
[31m-    ngx_http_lua_socket_tcp_finalize_write_part(r, u);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        u->peer.connection = NULL;[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.free) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    if (u->ssl_name.data) {[m
[31m-        ngx_free(u->ssl_name.data);[m
[31m-        u->ssl_name.data = NULL;[m
[31m-        u->ssl_name.len = 0;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    c = u->peer.connection;[m
[31m-    if (c) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua close socket connection");[m
[31m-[m
[31m-        ngx_http_lua_socket_tcp_close_connection(c);[m
[31m-        u->peer.connection = NULL;[m
[31m-[m
[31m-        if (!u->reused) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        spool = u->socket_pool;[m
[31m-        if (spool == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        spool->active_connections--;[m
[31m-[m
[31m-        if (spool->active_connections == 0) {[m
[31m-            ngx_http_lua_socket_free_pool(r->connection->log, spool);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_tcp_close_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-    if (c->ssl) {[m
[31m-        c->ssl->no_wait_shutdown = 1;[m
[31m-        c->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-        (void) ngx_ssl_shutdown(c);[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    if (c->pool) {[m
[31m-        ngx_destroy_pool(c->pool);[m
[31m-        c->pool = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_close_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_test_connect(ngx_http_request_t *r, ngx_connection_t *c)[m
[31m-{[m
[31m-    int              err;[m
[31m-    socklen_t        len;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    ngx_event_t     *ev;[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        dd("pending eof: (%p)%d (%p)%d", c->write, c->write->pending_eof,[m
[31m-           c->read, c->read->pending_eof);[m
[31m-[m
[31m-        if (c->write->pending_eof) {[m
[31m-            ev = c->write;[m
[31m-[m
[31m-        } else if (c->read->pending_eof) {[m
[31m-            ev = c->read;[m
[31m-[m
[31m-        } else {[m
[31m-            ev = NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (ev) {[m
[31m-            llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-            if (llcf->log_socket_errors) {[m
[31m-                (void) ngx_connection_error(c, ev->kq_errno,[m
[31m-                                            "kevent() reported that "[m
[31m-                                            "connect() failed");[m
[31m-            }[m
[31m-            return ev->kq_errno;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)[m
[31m-            == -1)[m
[31m-        {[m
[31m-            err = ngx_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-            if (llcf->log_socket_errors) {[m
[31m-                (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-            }[m
[31m-            return err;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_receiveuntil(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    int                                  n;[m
[31m-    ngx_str_t                            pat;[m
[31m-    ngx_int_t                            rc;[m
[31m-    size_t                               size;[m
[31m-    unsigned                             inclusive = 0;[m
[31m-[m
[31m-    ngx_http_lua_socket_compiled_pattern_t     *cp;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 2 && n != 3) {[m
[31m-        return luaL_error(L, "expecting 2 or 3 arguments "[m
[31m-                          "(including the object), but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 3) {[m
[31m-        /* check out the options table */[m
[31m-[m
[31m-        luaL_checktype(L, 3, LUA_TTABLE);[m
[31m-[m
[31m-        lua_getfield(L, 3, "inclusive");[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    inclusive = 1;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "bad \"inclusive\" option value type: %s",[m
[31m-                                  luaL_typename(L, -1));[m
[31m-[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket calling receiveuntil() method");[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);[m
[31m-    if (pat.len == 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "pattern is empty");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    size = sizeof(ngx_http_lua_socket_compiled_pattern_t);[m
[31m-[m
[31m-    cp = lua_newuserdata(L, size);[m
[31m-    if (cp == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_pattern_udata_metatable_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    ngx_memzero(cp, size);[m
[31m-[m
[31m-    cp->inclusive = inclusive;[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_compile_pattern(pat.data, pat.len, cp,[m
[31m-                                             r->connection->log);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to compile pattern");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushcclosure(L, ngx_http_lua_socket_receiveuntil_iterator, 3);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_receiveuntil_iterator(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    lua_Integer                          bytes;[m
[31m-    int                                  n;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_compiled_pattern_t     *cp;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n > 1) {[m
[31m-        return luaL_error(L, "expecting 0 or 1 arguments, "[m
[31m-                          "but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    if (n >= 1) {[m
[31m-        bytes = luaL_checkinteger(L, 1);[m
[31m-        if (bytes < 0) {[m
[31m-            bytes = 0;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        bytes = 0;[m
[31m-    }[m
[31m-[m
[31m-    lua_rawgeti(L, lua_upvalueindex(1), SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL || u->peer.connection == NULL || u->read_closed) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket receiveuntil iterator");[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read timeout: %M", u->read_timeout);[m
[31m-[m
[31m-    u->input_filter = ngx_http_lua_socket_read_until;[m
[31m-[m
[31m-    cp = lua_touserdata(L, lua_upvalueindex(3));[m
[31m-[m
[31m-    dd("checking existing state: %d", cp->state);[m
[31m-[m
[31m-    if (cp->state == -1) {[m
[31m-        cp->state = 0;[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushnil(L);[m
[31m-        return 3;[m
[31m-    }[m
[31m-[m
[31m-    cp->upstream = u;[m
[31m-[m
[31m-    cp->pattern.data =[m
[31m-        (u_char *) lua_tolstring(L, lua_upvalueindex(2),[m
[31m-                                 &cp->pattern.len);[m
[31m-[m
[31m-    u->input_filter_ctx = cp;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (u->bufs_in == NULL) {[m
[31m-        u->bufs_in =[m
[31m-            ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                            &ctx->free_recv_bufs,[m
[31m-                                            u->conf->buffer_size);[m
[31m-[m
[31m-        if (u->bufs_in == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        u->buf_in = u->bufs_in;[m
[31m-        u->buffer = *u->buf_in->buf;[m
[31m-    }[m
[31m-[m
[31m-    u->length = (size_t) bytes;[m
[31m-    u->rest = u->length;[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        r->read_event_handler = ngx_http_lua_req_socket_rev_handler;[m
[31m-    }[m
[31m-[m
[31m-    u->read_waiting = 0;[m
[31m-    u->read_co_ctx = NULL;[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_tcp_read(r, u);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("read failed: %d", (int) u->ft_type);[m
[31m-        rc = ngx_http_lua_socket_tcp_receive_retval_handler(r, u, L);[m
[31m-        dd("tcp receive retval returned: %d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket receive done in a single run");[m
[31m-[m
[31m-        return ngx_http_lua_socket_tcp_receive_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_AGAIN */[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_read_handler;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_coctx_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    u->read_co_ctx = coctx;[m
[31m-    u->read_waiting = 1;[m
[31m-    u->read_prepare_retvals = ngx_http_lua_socket_tcp_receive_retval_handler;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    if (u->raw_downstream || u->body_downstream) {[m
[31m-        ctx->downstream = u;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_compile_pattern(u_char *data, size_t len,[m
[31m-    ngx_http_lua_socket_compiled_pattern_t *cp, ngx_log_t *log)[m
[31m-{[m
[31m-    size_t              i;[m
[31m-    size_t              prefix_len;[m
[31m-    size_t              size;[m
[31m-    unsigned            found;[m
[31m-    int                 cur_state, new_state;[m
[31m-[m
[31m-    ngx_http_lua_dfa_edge_t         *edge;[m
[31m-    ngx_http_lua_dfa_edge_t        **last = NULL;[m
[31m-[m
[31m-    cp->pattern.len = len;[m
[31m-[m
[31m-    if (len <= 2) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < len; i++) {[m
[31m-        prefix_len = 1;[m
[31m-[m
[31m-        while (prefix_len <= len - i - 1) {[m
[31m-[m
[31m-            if (ngx_memcmp(data, &data[i], prefix_len) == 0) {[m
[31m-                if (data[prefix_len] == data[i + prefix_len]) {[m
[31m-                    prefix_len++;[m
[31m-                    continue;[m
[31m-                }[m
[31m-[m
[31m-                cur_state = i + prefix_len;[m
[31m-                new_state = prefix_len + 1;[m
[31m-[m
[31m-                if (cp->recovering == NULL) {[m
[31m-                    size = sizeof(void *) * (len - 2);[m
[31m-                    cp->recovering = ngx_alloc(size, log);[m
[31m-                    if (cp->recovering == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_memzero(cp->recovering, size);[m
[31m-                }[m
[31m-[m
[31m-                edge = cp->recovering[cur_state - 2];[m
[31m-[m
[31m-                found = 0;[m
[31m-[m
[31m-                if (edge == NULL) {[m
[31m-                    last = &cp->recovering[cur_state - 2];[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    for (; edge; edge = edge->next) {[m
[31m-                        last = &edge->next;[m
[31m-[m
[31m-                        if (edge->chr == data[prefix_len]) {[m
[31m-                            found = 1;[m
[31m-[m
[31m-                            if (edge->new_state < new_state) {[m
[31m-                                edge->new_state = new_state;[m
[31m-                            }[m
[31m-[m
[31m-                            break;[m
[31m-                        }[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (!found) {[m
[31m-                    ngx_log_debug7(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                                   "lua tcp socket read until recovering point:"[m
[31m-                                   " on state %d (%*s), if next is '%c', then "[m
[31m-                                   "recover to state %d (%*s)", cur_state,[m
[31m-                                   (size_t) cur_state, data, data[prefix_len],[m
[31m-                                   new_state, (size_t) new_state, data);[m
[31m-[m
[31m-                    edge = ngx_alloc(sizeof(ngx_http_lua_dfa_edge_t), log);[m
[31m-                    if (edge == NULL) {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    edge->chr = data[prefix_len];[m
[31m-                    edge->new_state = new_state;[m
[31m-                    edge->next = NULL;[m
[31m-[m
[31m-                    *last = edge;[m
[31m-                }[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_read_until(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_lua_socket_compiled_pattern_t     *cp = data;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-    ngx_http_request_t                      *r;[m
[31m-    ngx_buf_t                               *b;[m
[31m-    u_char                                   c;[m
[31m-    u_char                                  *pat;[m
[31m-    size_t                                   pat_len;[m
[31m-    int                                      i;[m
[31m-    int                                      state;[m
[31m-    int                                      old_state = 0; /* just to make old[m
[31m-                                                               gcc happy */[m
[31m-    ngx_http_lua_dfa_edge_t                 *edge;[m
[31m-    unsigned                                 matched;[m
[31m-    ngx_int_t                                rc;[m
[31m-[m
[31m-    u = cp->upstream;[m
[31m-    r = u->request;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket read until");[m
[31m-[m
[31m-    if (bytes == 0) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_CLOSED;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    pat = cp->pattern.data;[m
[31m-    pat_len = cp->pattern.len;[m
[31m-    state = cp->state;[m
[31m-[m
[31m-    i = 0;[m
[31m-    while (i < bytes) {[m
[31m-        c = b->pos[i];[m
[31m-[m
[31m-        dd("%d: read char %d, state: %d", i, c, state);[m
[31m-[m
[31m-        if (c == pat[state]) {[m
[31m-            i++;[m
[31m-            state++;[m
[31m-[m
[31m-            if (state == (int) pat_len) {[m
[31m-                /* already matched the whole pattern */[m
[31m-                dd("pat len: %d", (int) pat_len);[m
[31m-[m
[31m-                b->pos += i;[m
[31m-[m
[31m-                if (u->length) {[m
[31m-                    cp->state = -1;[m
[31m-[m
[31m-                } else {[m
[31m-                    cp->state = 0;[m
[31m-                }[m
[31m-[m
[31m-                if (cp->inclusive) {[m
[31m-                    rc = ngx_http_lua_socket_add_pending_data(r, u, b->pos, 0,[m
[31m-                                                              pat, state,[m
[31m-                                                              state);[m
[31m-[m
[31m-                    if (rc != NGX_OK) {[m
[31m-                        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (state == 0) {[m
[31m-            u->buf_in->buf->last++;[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            if (u->length && --u->rest == 0) {[m
[31m-                cp->state = state;[m
[31m-                b->pos += i;[m
[31m-                return NGX_OK;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        matched = 0;[m
[31m-[m
[31m-        if (cp->recovering && state >= 2) {[m
[31m-            dd("accessing state: %d, index: %d", state, state - 2);[m
[31m-            for (edge = cp->recovering[state - 2]; edge; edge = edge->next) {[m
[31m-[m
[31m-                if (edge->chr == c) {[m
[31m-                    dd("matched '%c' and jumping to state %d", c,[m
[31m-                       edge->new_state);[m
[31m-[m
[31m-                    old_state = state;[m
[31m-                    state = edge->new_state;[m
[31m-                    matched = 1;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (!matched) {[m
[31m-#if 1[m
[31m-            dd("adding pending data: %.*s", state, pat);[m
[31m-            rc = ngx_http_lua_socket_add_pending_data(r, u, b->pos, i, pat,[m
[31m-                                                      state, state);[m
[31m-[m
[31m-            if (rc != NGX_OK) {[m
[31m-                u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-            if (u->length) {[m
[31m-                if (u->rest <= (size_t) state) {[m
[31m-                    u->rest = 0;[m
[31m-                    cp->state = 0;[m
[31m-                    b->pos += i;[m
[31m-                    return NGX_OK;[m
[31m-[m
[31m-                } else {[m
[31m-                    u->rest -= state;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            state = 0;[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* matched */[m
[31m-[m
[31m-        dd("adding pending data: %.*s", (int) (old_state + 1 - state),[m
[31m-           (char *) pat);[m
[31m-[m
[31m-        rc = ngx_http_lua_socket_add_pending_data(r, u, b->pos, i, pat,[m
[31m-                                                  old_state + 1 - state,[m
[31m-                                                  old_state);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        i++;[m
[31m-[m
[31m-        if (u->length) {[m
[31m-            if (u->rest <= (size_t) state) {[m
[31m-                u->rest = 0;[m
[31m-                cp->state = state;[m
[31m-                b->pos += i;[m
[31m-                return NGX_OK;[m
[31m-[m
[31m-            } else {[m
[31m-                u->rest -= state;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        continue;[m
[31m-    }[m
[31m-[m
[31m-    b->pos += i;[m
[31m-    cp->state = state;[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_cleanup_compiled_pattern(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_compiled_pattern_t      *cp;[m
[31m-[m
[31m-    ngx_http_lua_dfa_edge_t         *edge, *p;[m
[31m-    unsigned                         i;[m
[31m-[m
[31m-    dd("cleanup compiled pattern");[m
[31m-[m
[31m-    cp = lua_touserdata(L, 1);[m
[31m-    if (cp == NULL || cp->recovering == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    dd("pattern len: %d", (int) cp->pattern.len);[m
[31m-[m
[31m-    for (i = 0; i < cp->pattern.len - 2; i++) {[m
[31m-        edge = cp->recovering[i];[m
[31m-[m
[31m-        while (edge) {[m
[31m-            p = edge;[m
[31m-            edge = edge->next;[m
[31m-[m
[31m-            dd("freeing edge %p", p);[m
[31m-[m
[31m-            ngx_free(p);[m
[31m-[m
[31m-            dd("edge: %p", edge);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_free(cp->recovering);[m
[31m-    cp->recovering = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_req_socket(lua_State *L)[m
[31m-{[m
[31m-    int                              n, raw;[m
[31m-    ngx_peer_connection_t           *pc;[m
[31m-    ngx_http_lua_loc_conf_t         *llcf;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_request_t              *r;[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_http_request_body_t         *rb;[m
[31m-    ngx_http_cleanup_t              *cln;[m
[31m-    ngx_http_lua_co_ctx_t           *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n == 0) {[m
[31m-        raw = 0;[m
[31m-[m
[31m-    } else if (n == 1) {[m
[31m-        raw = lua_toboolean(L, 1);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        return luaL_error(L, "expecting zero arguments, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-[m
[31m-    if (r != r->main) {[m
[31m-        return luaL_error(L, "attempt to read the request body in a "[m
[31m-                          "subrequest");[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HTTP_SPDY)[m
[31m-    if (r->spdy_stream) {[m
[31m-        return luaL_error(L, "spdy not supported yet");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    if (r->stream) {[m
[31m-        return luaL_error(L, "http v2 not supported yet");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-#if nginx_version >= 1003009[m
[31m-    if (!raw && r->headers_in.chunked) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "chunked request bodies not supported yet");[m
[31m-        return 2;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (raw) {[m
[31m-#if !defined(nginx_version) || nginx_version < 1003013[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "nginx version too old");[m
[31m-        return 2;[m
[31m-#else[m
[31m-        if (r->request_body) {[m
[31m-            if (r->request_body->rest > 0) {[m
[31m-                lua_pushnil(L);[m
[31m-                lua_pushliteral(L, "pending request body reading in some "[m
[31m-                                "other thread");[m
[31m-                return 2;[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-            if (rb == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-            r->request_body = rb;[m
[31m-        }[m
[31m-[m
[31m-        if (c->buffered & NGX_HTTP_LOWLEVEL_BUFFERED) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "pending data to write");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->buffering) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "http 1.0 buffering");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (!r->header_sent) {[m
[31m-            /* prevent other parts of nginx from sending out[m
[31m-             * the response header */[m
[31m-            r->header_sent = 1;[m
[31m-        }[m
[31m-[m
[31m-        ctx->header_sent = 1;[m
[31m-[m
[31m-        dd("ctx acquired raw req socket: %d", ctx->acquired_raw_req_socket);[m
[31m-[m
[31m-        if (ctx->acquired_raw_req_socket) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "duplicate call");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ctx->acquired_raw_req_socket = 1;[m
[31m-        r->keepalive = 0;[m
[31m-        r->lingering_close = 1;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        /* request body reader */[m
[31m-[m
[31m-        if (r->request_body) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "request body already exists");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (r->discard_body) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "request body discarded");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        dd("req content length: %d", (int) r->headers_in.content_length_n);[m
[31m-[m
[31m-        if (r->headers_in.content_length_n <= 0) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "no body");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_lua_test_expect(r) != NGX_OK) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "test expect failed");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        /* prevent other request body reader from running */[m
[31m-[m
[31m-        rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-        if (rb == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        rb->rest = r->headers_in.content_length_n;[m
[31m-[m
[31m-        r->request_body = rb;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 3 /* narr */, 1 /* nrec */); /* the object */[m
[31m-[m
[31m-    if (raw) {[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_raw_req_socket_metatable_key);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_req_socket_metatable_key);[m
[31m-    }[m
[31m-[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    u = lua_newuserdata(L, sizeof(ngx_http_lua_socket_tcp_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_downstream_udata_metatable_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-#endif[m
[31m-[m
[31m-    lua_rawseti(L, 1, SOCKET_CTX_INDEX);[m
[31m-[m
[31m-    ngx_memzero(u, sizeof(ngx_http_lua_socket_tcp_upstream_t));[m
[31m-[m
[31m-    if (raw) {[m
[31m-        u->raw_downstream = 1;[m
[31m-[m
[31m-    } else {[m
[31m-        u->body_downstream = 1;[m
[31m-    }[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    u->request = r;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    u->conf = llcf;[m
[31m-[m
[31m-    u->read_timeout = u->conf->read_timeout;[m
[31m-    u->connect_timeout = u->conf->connect_timeout;[m
[31m-    u->send_timeout = u->conf->send_timeout;[m
[31m-[m
[31m-    cln = ngx_http_lua_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_socket_tcp_cleanup;[m
[31m-    cln->data = u;[m
[31m-    u->cleanup = &cln->handler;[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-[m
[31m-    pc->log = c->log;[m
[31m-    pc->log_error = NGX_ERROR_ERR;[m
[31m-[m
[31m-    pc->connection = c;[m
[31m-[m
[31m-    dd("setting data to %p", u);[m
[31m-[m
[31m-    coctx->data = u;[m
[31m-    ctx->downstream = u;[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (raw) {[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_settop(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_req_socket_rev_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua request socket read event handler");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    u = ctx->downstream;[m
[31m-    if (u) {[m
[31m-        u->read_event_handler(r, u);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_getreusedtimes(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t    *u;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument "[m
[31m-                          "(including the object), but got %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u == NULL[m
[31m-        || u->peer.connection == NULL[m
[31m-        || (u->read_closed && u->write_closed))[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, u->reused);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_setkeepalive(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *u;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-    size_t                               size, key_len;[m
[31m-    ngx_str_t                            key;[m
[31m-    ngx_uint_t                           i;[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_peer_connection_t               *pc;[m
[31m-    u_char                              *p;[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_msec_t                           timeout;[m
[31m-    ngx_uint_t                           pool_size;[m
[31m-    int                                  n;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_buf_t                           *b;[m
[31m-[m
[31m-    ngx_http_lua_socket_pool_item_t     *items, *item;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n < 1 || n > 3) {[m
[31m-        return luaL_error(L, "expecting 1 to 3 arguments "[m
[31m-                          "(including the object), but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_KEY_INDEX);[m
[31m-    key.data = (u_char *) lua_tolstring(L, -1, &key.len);[m
[31m-    if (key.data == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "key not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    /* stack: obj cache key */[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-    c = pc->connection;[m
[31m-[m
[31m-    if (c == NULL || u->read_closed || u->write_closed) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_check_busy_connecting(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_reading(r, u, L);[m
[31m-    ngx_http_lua_socket_check_busy_writing(r, u, L);[m
[31m-[m
[31m-    b = &u->buffer;[m
[31m-[m
[31m-    if (b->start && ngx_buf_size(b)) {[m
[31m-        ngx_http_lua_probe_socket_tcp_setkeepalive_buf_unread(r, u, b->pos,[m
[31m-                                                              b->last - b->pos);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "unread data in buffer");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->eof[m
[31m-        || c->read->error[m
[31m-        || c->read->timedout[m
[31m-        || c->write->error[m
[31m-        || c->write->timedout)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "invalid connection");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to handle read event");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua tcp socket set keepalive: saving connection %p", c);[m
[31m-[m
[31m-    dd("saving connection to key %s", lua_tostring(L, -1));[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_rawget(L, -3);[m
[31m-    spool = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    /* stack: obj timeout? size? cache key */[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (spool == NULL) {[m
[31m-        /* create a new socket pool for the current peer key */[m
[31m-[m
[31m-        if (n == 3) {[m
[31m-            pool_size = luaL_checkinteger(L, 3);[m
[31m-[m
[31m-        } else {[m
[31m-            pool_size = llcf->pool_size;[m
[31m-        }[m
[31m-[m
[31m-        if (pool_size == 0) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "zero pool size");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket connection pool size: %ui", pool_size);[m
[31m-[m
[31m-        key_len = ngx_align(key.len + 1, sizeof(void *));[m
[31m-[m
[31m-        size = sizeof(ngx_http_lua_socket_pool_t) + key_len - 1[m
[31m-               + sizeof(ngx_http_lua_socket_pool_item_t)[m
[31m-               * pool_size;[m
[31m-[m
[31m-        spool = lua_newuserdata(L, size);[m
[31m-        if (spool == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_pool_udata_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "lua tcp socket keepalive create connection pool for key"[m
[31m-                       " \"%s\"", lua_tostring(L, -2));[m
[31m-[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        spool->active_connections = 0;[m
[31m-        spool->lua_vm = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-        ngx_queue_init(&spool->cache);[m
[31m-        ngx_queue_init(&spool->free);[m
[31m-[m
[31m-        p = ngx_copy(spool->key, key.data, key.len);[m
[31m-        *p++ = '\0';[m
[31m-[m
[31m-        items = (ngx_http_lua_socket_pool_item_t *) (spool->key + key_len);[m
[31m-[m
[31m-        dd("items: %p", items);[m
[31m-[m
[31m-        ngx_http_lua_assert((void *) items == ngx_align_ptr(items,[m
[31m-                                                            sizeof(void *)));[m
[31m-[m
[31m-        for (i = 0; i < pool_size; i++) {[m
[31m-            ngx_queue_insert_head(&spool->free, &items[i].queue);[m
[31m-            items[i].socket_pool = spool;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_queue_empty(&spool->free)) {[m
[31m-[m
[31m-        q = ngx_queue_last(&spool->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-        spool->active_connections--;[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-[m
[31m-        ngx_http_lua_socket_tcp_close_connection(item->connection);[m
[31m-[m
[31m-    } else {[m
[31m-        q = ngx_queue_head(&spool->free);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-    }[m
[31m-[m
[31m-    item->connection = c;[m
[31m-    ngx_queue_insert_head(&spool->cache, q);[m
[31m-[m
[31m-    if (!u->reused) {[m
[31m-        spool->active_connections++;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua tcp socket clear current socket connection");[m
[31m-[m
[31m-    pc->connection = NULL;[m
[31m-[m
[31m-#if 0[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-        u->cleanup = NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    if (n >= 2) {[m
[31m-        timeout = (ngx_msec_t) luaL_checkinteger(L, 2);[m
[31m-[m
[31m-    } else {[m
[31m-        timeout = llcf->keepalive_timeout;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    if (timeout == 0) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket keepalive timeout: unlimited");[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (timeout) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua tcp socket keepalive timeout: %M ms", timeout);[m
[31m-[m
[31m-        ngx_add_timer(c->read, timeout);[m
[31m-    }[m
[31m-[m
[31m-    c->write->handler = ngx_http_lua_socket_keepalive_dummy_handler;[m
[31m-    c->read->handler = ngx_http_lua_socket_keepalive_rev_handler;[m
[31m-[m
[31m-    c->data = item;[m
[31m-    c->idle = 1;[m
[31m-    c->log = ngx_cycle->log;[m
[31m-    c->pool->log = ngx_cycle->log;[m
[31m-    c->read->log = ngx_cycle->log;[m
[31m-    c->write->log = ngx_cycle->log;[m
[31m-[m
[31m-    item->socklen = pc->socklen;[m
[31m-    ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);[m
[31m-    item->reused = u->reused;[m
[31m-[m
[31m-    if (c->read->ready) {[m
[31m-        rc = ngx_http_lua_socket_keepalive_close_handler(c->read);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "connection in dubious state");[m
[31m-            return 2;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_http_lua_socket_tcp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_get_keepalive_peer(ngx_http_request_t *r, lua_State *L,[m
[31m-    int key_index, ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_socket_pool_item_t     *item;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-    ngx_http_cleanup_t                  *cln;[m
[31m-    ngx_queue_t                         *q;[m
[31m-    int                                  top;[m
[31m-    ngx_peer_connection_t               *pc;[m
[31m-    ngx_connection_t                    *c;[m
[31m-[m
[31m-    top = lua_gettop(L);[m
[31m-[m
[31m-    if (key_index < 0) {[m
[31m-        key_index = top + key_index + 1;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket pool get keepalive peer");[m
[31m-[m
[31m-    pc = &u->peer;[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-    lua_pushvalue(L, key_index); /* key */[m
[31m-    lua_rawget(L, -2);[m
[31m-[m
[31m-    spool = lua_touserdata(L, -1);[m
[31m-    if (spool == NULL) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "lua tcp socket keepalive connection pool not found");[m
[31m-        lua_settop(L, top);[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    u->socket_pool = spool;[m
[31m-[m
[31m-    if (!ngx_queue_empty(&spool->cache)) {[m
[31m-        q = ngx_queue_head(&spool->cache);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-        ngx_queue_insert_head(&spool->free, q);[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "lua tcp socket get keepalive peer: using connection %p,"[m
[31m-                       " fd:%d", c, c->fd);[m
[31m-[m
[31m-        c->idle = 0;[m
[31m-        c->log = pc->log;[m
[31m-        c->pool->log = pc->log;[m
[31m-        c->read->log = pc->log;[m
[31m-        c->write->log = pc->log;[m
[31m-        c->data = u;[m
[31m-[m
[31m-#if 1[m
[31m-        c->write->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-        c->read->handler = ngx_http_lua_socket_tcp_handler;[m
[31m-#endif[m
[31m-[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        pc->connection = c;[m
[31m-        pc->cached = 1;[m
[31m-[m
[31m-        u->reused = item->reused + 1;[m
[31m-[m
[31m-#if 1[m
[31m-        u->write_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-        u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-#endif[m
[31m-[m
[31m-        if (u->cleanup == NULL) {[m
[31m-            cln = ngx_http_lua_cleanup_add(r, 0);[m
[31m-            if (cln == NULL) {[m
[31m-                u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-                lua_settop(L, top);[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            cln->handler = ngx_http_lua_socket_tcp_cleanup;[m
[31m-            cln->data = u;[m
[31m-            u->cleanup = &cln->handler;[m
[31m-        }[m
[31m-[m
[31m-        lua_settop(L, top);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "lua tcp socket keepalive: connection pool empty");[m
[31m-[m
[31m-    lua_settop(L, top);[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_keepalive_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "keepalive dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_keepalive_rev_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    (void) ngx_http_lua_socket_keepalive_close_handler(ev);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_keepalive_close_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_http_lua_socket_pool_item_t     *item;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-[m
[31m-    int                n;[m
[31m-    char               buf[1];[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                       "lua tcp socket keepalive max idle timeout");[m
[31m-[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    dd("read event ready: %d", (int) c->read->ready);[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "lua tcp socket keepalive close handler check stale events");[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {[m
[31m-        /* stale event */[m
[31m-[m
[31m-        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {[m
[31m-            goto close;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-close:[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "lua tcp socket keepalive close handler: fd:%d", c->fd);[m
[31m-[m
[31m-    item = c->data;[m
[31m-    spool = item->socket_pool;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_close_connection(c);[m
[31m-[m
[31m-    ngx_queue_remove(&item->queue);[m
[31m-    ngx_queue_insert_head(&spool->free, &item->queue);[m
[31m-    spool->active_connections--;[m
[31m-[m
[31m-    dd("keepalive: active connections: %u",[m
[31m-       (unsigned) spool->active_connections);[m
[31m-[m
[31m-    if (spool->active_connections == 0) {[m
[31m-        ngx_http_lua_socket_free_pool(ev->log, spool);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_free_pool(ngx_log_t *log, ngx_http_lua_socket_pool_t *spool)[m
[31m-{[m
[31m-    lua_State                           *L;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua tcp socket keepalive: free connection pool for \"%s\"",[m
[31m-                   spool->key);[m
[31m-[m
[31m-    L = spool->lua_vm;[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_pushstring(L, (char *) spool->key);[m
[31m-    lua_pushnil(L);[m
[31m-    lua_rawset(L, -3);[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_shutdown_pool(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-    ngx_http_lua_socket_pool_item_t     *item;[m
[31m-[m
[31m-    spool = lua_touserdata(L, 1);[m
[31m-    if (spool == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    while (!ngx_queue_empty(&spool->cache)) {[m
[31m-        q = ngx_queue_head(&spool->cache);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        ngx_http_lua_socket_tcp_close_connection(c);[m
[31m-[m
[31m-        ngx_queue_remove(q);[m
[31m-        ngx_queue_insert_head(&spool->free, q);[m
[31m-    }[m
[31m-[m
[31m-    spool->active_connections = 0;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_tcp_upstream_destroy(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-[m
[31m-    dd("upstream destroy triggered by Lua GC");[m
[31m-[m
[31m-    u = lua_touserdata(L, 1);[m
[31m-    if (u == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        ngx_http_lua_socket_tcp_cleanup(u); /* it will clear u->cleanup */[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_downstream_destroy(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t     *u;[m
[31m-[m
[31m-    dd("downstream destory");[m
[31m-[m
[31m-    u = lua_touserdata(L, 1);[m
[31m-    if (u == NULL) {[m
[31m-        dd("u is NULL");[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        ngx_http_lua_socket_tcp_cleanup(u); /* it will clear u->cleanup */[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_push_input_data(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_socket_tcp_upstream_t *u,[m
[31m-    lua_State *L)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_chain_t            **ll;[m
[31m-#if (DDEBUG) || (NGX_DTRACE)[m
[31m-    size_t                   size = 0;[m
[31m-#endif[m
[31m-    size_t                   chunk_size;[m
[31m-    ngx_buf_t               *b;[m
[31m-    size_t                   nbufs;[m
[31m-    luaL_Buffer              luabuf;[m
[31m-[m
[31m-    dd("bufs_in: %p, buf_in: %p", u->bufs_in, u->buf_in);[m
[31m-[m
[31m-    nbufs = 0;[m
[31m-    ll = NULL;[m
[31m-[m
[31m-    luaL_buffinit(L, &luabuf);[m
[31m-[m
[31m-    for (cl = u->bufs_in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-        chunk_size = b->last - b->pos;[m
[31m-[m
[31m-        dd("copying input data chunk from %p: \"%.*s\"", cl,[m
[31m-           (int) chunk_size, b->pos);[m
[31m-[m
[31m-        luaL_addlstring(&luabuf, (char *) b->pos, chunk_size);[m
[31m-[m
[31m-        if (cl->next) {[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-#if (DDEBUG) || (NGX_DTRACE)[m
[31m-        size += chunk_size;[m
[31m-#endif[m
[31m-[m
[31m-        nbufs++;[m
[31m-    }[m
[31m-[m
[31m-    luaL_pushresult(&luabuf);[m
[31m-[m
[31m-#if (DDEBUG)[m
[31m-    dd("size: %d, nbufs: %d", (int) size, (int) nbufs);[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_DTRACE)[m
[31m-    ngx_http_lua_probe_socket_tcp_receive_done(r, u,[m
[31m-                                               (u_char *) lua_tostring(L, -1),[m
[31m-                                               size);[m
[31m-#endif[m
[31m-[m
[31m-    if (nbufs > 1 && ll) {[m
[31m-        dd("recycle buffers: %d", (int) (nbufs - 1));[m
[31m-[m
[31m-        *ll = ctx->free_recv_bufs;[m
[31m-        ctx->free_recv_bufs = u->bufs_in;[m
[31m-        u->bufs_in = u->buf_in;[m
[31m-    }[m
[31m-[m
[31m-    if (u->buffer.pos == u->buffer.last) {[m
[31m-        dd("resetting u->buffer pos & last");[m
[31m-        u->buffer.pos = u->buffer.start;[m
[31m-        u->buffer.last = u->buffer.start;[m
[31m-    }[m
[31m-[m
[31m-    if (u->bufs_in) {[m
[31m-        u->buf_in->buf->last = u->buffer.pos;[m
[31m-        u->buf_in->buf->pos = u->buffer.pos;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_add_input_buffer(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_chain_t             *cl;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_recv_bufs,[m
[31m-                                         u->conf->buffer_size);[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->buf_in->next = cl;[m
[31m-    u->buf_in = cl;[m
[31m-    u->buffer = *cl->buf;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_add_pending_data(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, u_char *pos, size_t len, u_char *pat,[m
[31m-    int prefix, int old_state)[m
[31m-{[m
[31m-    u_char          *last;[m
[31m-    ngx_buf_t       *b;[m
[31m-[m
[31m-    dd("resuming data: %d: [%.*s]", prefix, prefix, pat);[m
[31m-[m
[31m-    last = &pos[len];[m
[31m-[m
[31m-    b = u->buf_in->buf;[m
[31m-[m
[31m-    if (last - b->last == old_state) {[m
[31m-        b->last += prefix;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    dd("need more buffers because %d != %d", (int) (last - b->last),[m
[31m-       (int) old_state);[m
[31m-[m
[31m-    if (ngx_http_lua_socket_insert_buffer(r, u, pat, prefix) != NGX_OK) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b->pos = last;[m
[31m-    b->last = last;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_socket_insert_buffer(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u, u_char *pat, size_t prefix)[m
[31m-{[m
[31m-    ngx_chain_t             *cl, *new_cl, **ll;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    size_t                   size;[m
[31m-    ngx_buf_t               *b;[m
[31m-[m
[31m-    if (prefix <= u->conf->buffer_size) {[m
[31m-        size = u->conf->buffer_size;[m
[31m-[m
[31m-    } else {[m
[31m-        size = prefix;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    new_cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                             &ctx->free_recv_bufs,[m
[31m-                                             size);[m
[31m-[m
[31m-    if (new_cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    b = new_cl->buf;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, pat, prefix);[m
[31m-[m
[31m-    dd("copy resumed data to %p: %d: \"%.*s\"",[m
[31m-       new_cl, (int) (b->last - b->pos), (int) (b->last - b->pos), b->pos);[m
[31m-[m
[31m-    dd("before resuming data: bufs_in %p, buf_in %p, buf_in next %p",[m
[31m-       u->bufs_in, u->buf_in, u->buf_in->next);[m
[31m-[m
[31m-    ll = &u->bufs_in;[m
[31m-    for (cl = u->bufs_in; cl->next; cl = cl->next) {[m
[31m-        ll = &cl->next;[m
[31m-    }[m
[31m-[m
[31m-    *ll = new_cl;[m
[31m-    new_cl->next = u->buf_in;[m
[31m-[m
[31m-    dd("after resuming data: bufs_in %p, buf_in %p, buf_in next %p",[m
[31m-       u->bufs_in, u->buf_in, u->buf_in->next);[m
[31m-[m
[31m-#if (DDEBUG)[m
[31m-    for (cl = u->bufs_in; cl; cl = cl->next) {[m
[31m-        b = cl->buf;[m
[31m-[m
[31m-        dd("result buf after resuming data: %p: %.*s", cl,[m
[31m-           (int) ngx_buf_size(b), b->pos);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_conn_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return ngx_http_lua_socket_tcp_resume_helper(r, SOCKET_OP_CONNECT);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_read_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return ngx_http_lua_socket_tcp_resume_helper(r, SOCKET_OP_READ);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_write_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return ngx_http_lua_socket_tcp_resume_helper(r, SOCKET_OP_WRITE);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_tcp_resume_helper(ngx_http_request_t *r, int socket_op)[m
[31m-{[m
[31m-    int                          nret;[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_retval_handler  prepare_retvals;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp operation done, resuming lua thread");[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    dd("coctx: %p", coctx);[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-[m
[31m-    switch (socket_op) {[m
[31m-    case SOCKET_OP_CONNECT:[m
[31m-    case SOCKET_OP_WRITE:[m
[31m-        prepare_retvals = u->write_prepare_retvals;[m
[31m-        break;[m
[31m-[m
[31m-    case SOCKET_OP_READ:[m
[31m-        prepare_retvals = u->read_prepare_retvals;[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        /* impossible to reach here */[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua tcp socket calling prepare retvals handler %p, "[m
[31m-                   "u:%p", prepare_retvals, u);[m
[31m-[m
[31m-    nret = prepare_retvals(r, u, ctx->cur_co_ctx->co);[m
[31m-    if (nret == NGX_AGAIN) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, nret);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_tcp_resolve_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t                      *rctx;[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua tcp socket abort resolver");[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-    if (u == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rctx = u->resolved->ctx;[m
[31m-    if (rctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* just to be safer */[m
[31m-    rctx->handler = ngx_http_lua_socket_empty_resolve_handler;[m
[31m-[m
[31m-    ngx_resolve_name_done(rctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_coctx_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_socket_tcp_upstream_t      *u;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    dd("running coctx cleanup");[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-    if (u == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_finalize(u->request, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ssl_free_session(lua_State *L)[m
[31m-{[m
[31m-    ngx_ssl_session_t      **psession;[m
[31m-[m
[31m-    psession = lua_touserdata(L, 1);[m
[31m-    if (psession && *psession != NULL) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "lua ssl free session: %p:%d", *psession,[m
[31m-                       (*psession)->references);[m
[31m-[m
[31m-        ngx_ssl_free_session(*psession);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_cleanup_conn_pools(lua_State *L)[m
[31m-{[m
[31m-    ngx_queue_t                         *q;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_lua_socket_pool_t          *spool;[m
[31m-    ngx_http_lua_socket_pool_item_t     *item;[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX); /* table */[m
[31m-[m
[31m-    lua_pushnil(L);  /* first key */[m
[31m-    while (lua_next(L, -2) != 0) {[m
[31m-        /* tb key val */[m
[31m-        spool = lua_touserdata(L, -1);[m
[31m-[m
[31m-        if (!ngx_queue_empty(&spool->cache)) {[m
[31m-            q = ngx_queue_head(&spool->cache);[m
[31m-            item = ngx_queue_data(q, ngx_http_lua_socket_pool_item_t, queue);[m
[31m-            c = item->connection;[m
[31m-[m
[31m-            ngx_http_lua_socket_tcp_close_connection(c);[m
[31m-[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                           "lua tcp socket keepalive: free connection pool "[m
[31m-                           "for \"%s\"", spool->key);[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.h[m
[1mdeleted file mode 100644[m
[1mindex dbdee41..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_tcp.h[m
[1m+++ /dev/null[m
[36m@@ -1,156 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_ERROR         0x0001[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_TIMEOUT       0x0002[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_CLOSED        0x0004[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_RESOLVER      0x0008[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_BUFTOOSMALL   0x0010[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_NOMEM         0x0020[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE  0x0040[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_CLIENTABORT   0x0080[m
[31m-#define NGX_HTTP_LUA_SOCKET_FT_SSL           0x0100[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_socket_tcp_upstream_s[m
[31m-        ngx_http_lua_socket_tcp_upstream_t;[m
[31m-[m
[31m-[m
[31m-typedef[m
[31m-    int (*ngx_http_lua_socket_tcp_retval_handler)(ngx_http_request_t *r,[m
[31m-        ngx_http_lua_socket_tcp_upstream_t *u, lua_State *L);[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_lua_socket_tcp_upstream_handler_pt)[m
[31m-    (ngx_http_request_t *r, ngx_http_lua_socket_tcp_upstream_t *u);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    lua_State                         *lua_vm;[m
[31m-[m
[31m-    /* active connections == out-of-pool reused connections[m
[31m-     *                       + in-pool connections */[m
[31m-    ngx_uint_t                         active_connections;[m
[31m-[m
[31m-    /* queues of ngx_http_lua_socket_pool_item_t: */[m
[31m-    ngx_queue_t                        cache;[m
[31m-    ngx_queue_t                        free;[m
[31m-[m
[31m-    u_char                             key[1];[m
[31m-[m
[31m-} ngx_http_lua_socket_pool_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_socket_tcp_upstream_s {[m
[31m-    ngx_http_lua_socket_tcp_retval_handler          read_prepare_retvals;[m
[31m-    ngx_http_lua_socket_tcp_retval_handler          write_prepare_retvals;[m
[31m-    ngx_http_lua_socket_tcp_upstream_handler_pt     read_event_handler;[m
[31m-    ngx_http_lua_socket_tcp_upstream_handler_pt     write_event_handler;[m
[31m-[m
[31m-    ngx_http_lua_socket_pool_t      *socket_pool;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t         *conf;[m
[31m-    ngx_http_cleanup_pt             *cleanup;[m
[31m-    ngx_http_request_t              *request;[m
[31m-    ngx_peer_connection_t            peer;[m
[31m-[m
[31m-    ngx_msec_t                       read_timeout;[m
[31m-    ngx_msec_t                       send_timeout;[m
[31m-    ngx_msec_t                       connect_timeout;[m
[31m-[m
[31m-    ngx_http_upstream_resolved_t    *resolved;[m
[31m-[m
[31m-    ngx_chain_t                     *bufs_in; /* input data buffers */[m
[31m-    ngx_chain_t                     *buf_in; /* last input data buffer */[m
[31m-    ngx_buf_t                        buffer; /* receive buffer */[m
[31m-[m
[31m-    size_t                           length;[m
[31m-    size_t                           rest;[m
[31m-[m
[31m-    ngx_err_t                        socket_errno;[m
[31m-[m
[31m-    ngx_int_t                      (*input_filter)(void *data, ssize_t bytes);[m
[31m-    void                            *input_filter_ctx;[m
[31m-[m
[31m-    size_t                           request_len;[m
[31m-    ngx_chain_t                     *request_bufs;[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t           *read_co_ctx;[m
[31m-    ngx_http_lua_co_ctx_t           *write_co_ctx;[m
[31m-[m
[31m-    ngx_uint_t                       reused;[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_str_t                        ssl_name;[m
[31m-#endif[m
[31m-[m
[31m-    unsigned                         ft_type:16;[m
[31m-    unsigned                         no_close:1;[m
[31m-    unsigned                         conn_waiting:1;[m
[31m-    unsigned                         read_waiting:1;[m
[31m-    unsigned                         write_waiting:1;[m
[31m-    unsigned                         eof:1;[m
[31m-    unsigned                         body_downstream:1;[m
[31m-    unsigned                         raw_downstream:1;[m
[31m-    unsigned                         read_closed:1;[m
[31m-    unsigned                         write_closed:1;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    unsigned                         ssl_verify:1;[m
[31m-    unsigned                         ssl_session_reuse:1;[m
[31m-#endif[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_dfa_edge_s  ngx_http_lua_dfa_edge_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_dfa_edge_s {[m
[31m-    u_char                           chr;[m
[31m-    int                              new_state;[m
[31m-    ngx_http_lua_dfa_edge_t         *next;[m
[31m-};[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_socket_tcp_upstream_t  *upstream;[m
[31m-[m
[31m-    ngx_str_t                            pattern;[m
[31m-    int                                  state;[m
[31m-    ngx_http_lua_dfa_edge_t            **recovering;[m
[31m-[m
[31m-    unsigned                             inclusive:1;[m
[31m-} ngx_http_lua_socket_compiled_pattern_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_socket_pool_t      *socket_pool;[m
[31m-[m
[31m-    ngx_queue_t                      queue;[m
[31m-    ngx_connection_t                *connection;[m
[31m-[m
[31m-    socklen_t                        socklen;[m
[31m-    struct sockaddr_storage          sockaddr;[m
[31m-[m
[31m-    ngx_uint_t                       reused;[m
[31m-[m
[31m-} ngx_http_lua_socket_pool_item_t;[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_socket_tcp_api(ngx_log_t *log, lua_State *L);[m
[31m-void ngx_http_lua_inject_req_socket_api(lua_State *L);[m
[31m-void ngx_http_lua_cleanup_conn_pools(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SOCKET_TCP_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.c[m
[1mdeleted file mode 100644[m
[1mindex 1ec0c00..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.c[m
[1m+++ /dev/null[m
[36m@@ -1,1615 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_socket_udp.h"[m
[31m-#include "ngx_http_lua_socket_tcp.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-#if 1[m
[31m-#undef ngx_http_lua_probe_info[m
[31m-#define ngx_http_lua_probe_info(msg)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define UDP_MAX_DATAGRAM_SIZE 8192[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_socket_udp(lua_State *L);[m
[31m-static int ngx_http_lua_socket_udp_setpeername(lua_State *L);[m
[31m-static int ngx_http_lua_socket_udp_send(lua_State *L);[m
[31m-static int ngx_http_lua_socket_udp_receive(lua_State *L);[m
[31m-static int ngx_http_lua_socket_udp_settimeout(lua_State *L);[m
[31m-static void ngx_http_lua_socket_udp_finalize(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static int ngx_http_lua_socket_udp_upstream_destroy(lua_State *L);[m
[31m-static int ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);[m
[31m-static void ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx);[m
[31m-static int ngx_http_lua_socket_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);[m
[31m-static void ngx_http_lua_socket_udp_handle_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, ngx_uint_t ft_type);[m
[31m-static void ngx_http_lua_socket_udp_cleanup(void *data);[m
[31m-static void ngx_http_lua_socket_udp_handler(ngx_event_t *ev);[m
[31m-static void ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static int ngx_http_lua_socket_udp_receive_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_udp_read(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_udp_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static void ngx_http_lua_socket_udp_handle_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-static ngx_int_t ngx_http_lua_udp_connect(ngx_http_lua_udp_connection_t *uc);[m
[31m-static int ngx_http_lua_socket_udp_close(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_socket_udp_resume(ngx_http_request_t *r);[m
[31m-static void ngx_http_lua_udp_resolve_cleanup(void *data);[m
[31m-static void ngx_http_lua_udp_socket_cleanup(void *data);[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    SOCKET_CTX_INDEX = 1,[m
[31m-    SOCKET_TIMEOUT_INDEX = 2[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static char ngx_http_lua_socket_udp_metatable_key;[m
[31m-static char ngx_http_lua_udp_udata_metatable_key;[m
[31m-static u_char ngx_http_lua_socket_udp_buffer[UDP_MAX_DATAGRAM_SIZE];[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_socket_udp_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    lua_getfield(L, -1, "socket"); /* ngx socket */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp);[m
[31m-    lua_setfield(L, -2, "udp"); /* ngx socket */[m
[31m-[m
[31m-    /* udp socket object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_udp_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 6 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_setpeername);[m
[31m-    lua_setfield(L, -2, "setpeername"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_send);[m
[31m-    lua_setfield(L, -2, "send");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_receive);[m
[31m-    lua_setfield(L, -2, "receive");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_settimeout);[m
[31m-    lua_setfield(L, -2, "settimeout"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_close);[m
[31m-    lua_setfield(L, -2, "close"); /* ngx socket mt */[m
[31m-[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* udp socket object metatable */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_udp_udata_metatable_key);[m
[31m-    lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_socket_udp_upstream_destroy);[m
[31m-    lua_setfield(L, -2, "__gc");[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    if (lua_gettop(L) != 0) {[m
[31m-        return luaL_error(L, "expecting zero arguments, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    lua_createtable(L, 3 /* narr */, 1 /* nrec */);[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_udp_metatable_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    dd("top: %d", lua_gettop(L));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_setpeername(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_str_t                    host;[m
[31m-    int                          port;[m
[31m-    ngx_resolver_ctx_t          *rctx, temp;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-    int                          saved_top;[m
[31m-    int                          n;[m
[31m-    u_char                      *p;[m
[31m-    size_t                       len;[m
[31m-    ngx_url_t                    url;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    int                          timeout;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_http_lua_udp_connection_t           *uc;[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-[m
[31m-    /*[m
[31m-     * TODO: we should probably accept an extra argument to setpeername()[m
[31m-     * to allow the user bind the datagram unix domain socket himself,[m
[31m-     * which is necessary for systems without autobind support.[m
[31m-     */[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 2 && n != 3) {[m
[31m-        return luaL_error(L, "ngx.socket.udp setpeername: expecting 2 or 3 "[m
[31m-                          "arguments (including the object), but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 2, &len);[m
[31m-[m
[31m-    host.data = ngx_palloc(r->pool, len + 1);[m
[31m-    if (host.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    host.len = len;[m
[31m-[m
[31m-    ngx_memcpy(host.data, p, len);[m
[31m-    host.data[len] = '\0';[m
[31m-[m
[31m-    if (n == 3) {[m
[31m-        port = luaL_checkinteger(L, 3);[m
[31m-[m
[31m-        if (port < 0 || port > 65536) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushfstring(L, "bad port number: %d", port);[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-    } else { /* n == 2 */[m
[31m-        port = 0;[m
[31m-    }[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u) {[m
[31m-        if (u->request && u->request != r) {[m
[31m-            return luaL_error(L, "bad request");[m
[31m-        }[m
[31m-[m
[31m-        if (u->waiting) {[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "socket busy");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        if (u->udp_connection.connection) {[m
[31m-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua udp socket reconnect without shutting down");[m
[31m-[m
[31m-            ngx_http_lua_socket_udp_finalize(r, u);[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua reuse socket upstream ctx");[m
[31m-[m
[31m-    } else {[m
[31m-        u = lua_newuserdata(L, sizeof(ngx_http_lua_socket_udp_upstream_t));[m
[31m-        if (u == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_udp_udata_metatable_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        lua_setmetatable(L, -2);[m
[31m-#endif[m
[31m-[m
[31m-        lua_rawseti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(u, sizeof(ngx_http_lua_socket_udp_upstream_t));[m
[31m-[m
[31m-    u->request = r; /* set the controlling request */[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    u->conf = llcf;[m
[31m-[m
[31m-    uc = &u->udp_connection;[m
[31m-[m
[31m-    uc->log = *r->connection->log;[m
[31m-[m
[31m-    dd("lua peer connection log: %p", &uc->log);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_TIMEOUT_INDEX);[m
[31m-    timeout = (ngx_int_t) lua_tointeger(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (timeout > 0) {[m
[31m-        u->read_timeout = (ngx_msec_t) timeout;[m
[31m-[m
[31m-    } else {[m
[31m-        u->read_timeout = u->conf->read_timeout;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-    url.url.len = host.len;[m
[31m-    url.url.data = host.data;[m
[31m-    url.default_port = (in_port_t) port;[m
[31m-    url.no_resolve = 1;[m
[31m-[m
[31m-    if (ngx_parse_url(r->pool, &url) != NGX_OK) {[m
[31m-        lua_pushnil(L);[m
[31m-[m
[31m-        if (url.err) {[m
[31m-            lua_pushfstring(L, "failed to parse host name \"%s\": %s",[m
[31m-                            host.data, url.err);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushfstring(L, "failed to parse host name \"%s\"", host.data);[m
[31m-        }[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));[m
[31m-    if (u->resolved == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    if (url.addrs && url.addrs[0].sockaddr) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket network address given directly");[m
[31m-[m
[31m-        u->resolved->sockaddr = url.addrs[0].sockaddr;[m
[31m-        u->resolved->socklen = url.addrs[0].socklen;[m
[31m-        u->resolved->naddrs = 1;[m
[31m-        u->resolved->host = url.addrs[0].name;[m
[31m-[m
[31m-    } else {[m
[31m-        u->resolved->host = host;[m
[31m-        u->resolved->port = (in_port_t) port;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved->sockaddr) {[m
[31m-        rc = ngx_http_lua_socket_resolve_retval_handler(r, u, L);[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            return lua_yield(L, 0);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    temp.name = host;[m
[31m-    rctx = ngx_resolve_start(clcf->resolver, &temp);[m
[31m-    if (rctx == NULL) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "failed to start the resolver");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (rctx == NGX_NO_RESOLVER) {[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "no resolver defined to resolve \"%s\"", host.data);[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    rctx->name = host;[m
[31m-#if !defined(nginx_version) || nginx_version < 1005008[m
[31m-    rctx->type = NGX_RESOLVE_A;[m
[31m-#endif[m
[31m-    rctx->handler = ngx_http_lua_socket_resolve_handler;[m
[31m-    rctx->data = u;[m
[31m-    rctx->timeout = clcf->resolver_timeout;[m
[31m-[m
[31m-    u->co_ctx = ctx->cur_co_ctx;[m
[31m-    u->resolved->ctx = rctx;[m
[31m-[m
[31m-    saved_top = lua_gettop(L);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_udp_resolve_cleanup;[m
[31m-[m
[31m-    if (ngx_resolve_name(rctx) != NGX_OK) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket fail to run resolver immediately");[m
[31m-[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;[m
[31m-[m
[31m-        u->resolved->ctx = NULL;[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushfstring(L, "%s could not be resolved", host.data);[m
[31m-[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting == 1) {[m
[31m-        /* resolved and already connecting */[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    n = lua_gettop(L) - saved_top;[m
[31m-    if (n) {[m
[31m-        /* errors occurred during resolving or connecting[m
[31m-         * or already connected */[m
[31m-        return n;[m
[31m-    }[m
[31m-[m
[31m-    /* still resolving */[m
[31m-[m
[31m-    u->waiting = 1;[m
[31m-    u->prepare_retvals = ngx_http_lua_socket_resolve_retval_handler;[m
[31m-[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_connection_t                    *c;[m
[31m-    ngx_http_upstream_resolved_t        *ur;[m
[31m-    ngx_http_lua_ctx_t                  *lctx;[m
[31m-    lua_State                           *L;[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-#if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    socklen_t                            socklen;[m
[31m-    struct sockaddr                     *sockaddr;[m
[31m-#else[m
[31m-    struct sockaddr_in                  *sin;[m
[31m-#endif[m
[31m-    ngx_uint_t                           i;[m
[31m-    unsigned                             waiting;[m
[31m-[m
[31m-    u = ctx->data;[m
[31m-    r = u->request;[m
[31m-    c = r->connection;[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua udp socket resolve handler");[m
[31m-[m
[31m-    lctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (lctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    lctx->cur_co_ctx = u->co_ctx;[m
[31m-[m
[31m-    u->co_ctx->cleanup = NULL;[m
[31m-[m
[31m-    L = lctx->cur_co_ctx->co;[m
[31m-[m
[31m-    dd("setting socket_ready to 1");[m
[31m-[m
[31m-    waiting = u->waiting;[m
[31m-[m
[31m-    if (ctx->state) {[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "lua udp socket resolver error: %s (waiting: %d)",[m
[31m-                       ngx_resolver_strerror(ctx->state), (int) u->waiting);[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len);[m
[31m-        lua_pushfstring(L, " could not be resolved (%d: %s)",[m
[31m-                        (int) ctx->state,[m
[31m-                        ngx_resolver_strerror(ctx->state));[m
[31m-        lua_concat(L, 2);[m
[31m-[m
[31m-#if 1[m
[31m-        ngx_resolve_name_done(ctx);[m
[31m-        ur->ctx = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        u->prepare_retvals = ngx_http_lua_socket_error_retval_handler;[m
[31m-        ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_RESOLVER);[m
[31m-[m
[31m-        if (waiting) {[m
[31m-            ngx_http_run_posted_requests(c);[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ur->naddrs = ctx->naddrs;[m
[31m-    ur->addrs = ctx->addrs;[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    {[m
[31m-#   if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    u_char      text[NGX_SOCKADDR_STRLEN];[m
[31m-    ngx_str_t   addr;[m
[31m-#   else[m
[31m-    in_addr_t   addr;[m
[31m-#   endif[m
[31m-    ngx_uint_t  i;[m
[31m-[m
[31m-#   if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    addr.data = text;[m
[31m-[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,[m
[31m-                                 text, NGX_SOCKADDR_STRLEN, 0);[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "name was resolved to %V", &addr);[m
[31m-    }[m
[31m-#   else[m
[31m-    for (i = 0; i < ctx->naddrs; i++) {[m
[31m-        dd("addr i: %d %p", (int) i,  &ctx->addrs[i]);[m
[31m-[m
[31m-        addr = ntohl(ctx->addrs[i]);[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "name was resolved to %ud.%ud.%ud.%ud",[m
[31m-                       (addr >> 24) & 0xff, (addr >> 16) & 0xff,[m
[31m-                       (addr >> 8) & 0xff, addr & 0xff);[m
[31m-    }[m
[31m-#   endif[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_assert(ur->naddrs > 0);[m
[31m-[m
[31m-    if (ur->naddrs == 1) {[m
[31m-        i = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        i = ngx_random() % ur->naddrs;[m
[31m-    }[m
[31m-[m
[31m-    dd("selected addr index: %d", (int) i);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1005008[m
[31m-    socklen = ur->addrs[i].socklen;[m
[31m-[m
[31m-    sockaddr = ngx_palloc(r->pool, socklen);[m
[31m-    if (sockaddr == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);[m
[31m-[m
[31m-    switch (sockaddr->sa_family) {[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        ((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);[m
[31m-        break;[m
[31m-#endif[m
[31m-    default: /* AF_INET */[m
[31m-        ((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);[m
[31m-    ur->sockaddr = sockaddr;[m
[31m-    ur->socklen = socklen;[m
[31m-[m
[31m-#else[m
[31m-    /* for nginx older than 1.5.8 */[m
[31m-[m
[31m-    len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;[m
[31m-[m
[31m-    p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    sin = (struct sockaddr_in *) &p[len];[m
[31m-    ngx_memzero(sin, sizeof(struct sockaddr_in));[m
[31m-[m
[31m-    len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);[m
[31m-    len = ngx_sprintf(&p[len], ":%d", ur->port) - p;[m
[31m-[m
[31m-    sin->sin_family = AF_INET;[m
[31m-    sin->sin_port = htons(ur->port);[m
[31m-    sin->sin_addr.s_addr = ur->addrs[i];[m
[31m-[m
[31m-    ur->sockaddr = (struct sockaddr *) sin;[m
[31m-    ur->socklen = sizeof(struct sockaddr_in);[m
[31m-#endif[m
[31m-[m
[31m-    ur->host.data = p;[m
[31m-    ur->host.len = len;[m
[31m-    ur->naddrs = 1;[m
[31m-[m
[31m-    ngx_resolve_name_done(ctx);[m
[31m-    ur->ctx = NULL;[m
[31m-[m
[31m-    u->waiting = 0;[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        lctx->resume_handler = ngx_http_lua_socket_udp_resume;[m
[31m-        r->write_event_handler(r);[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    } else {[m
[31m-        (void) ngx_http_lua_socket_resolve_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    return;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    if (ur->ctx) {[m
[31m-        ngx_resolve_name_done(ctx);[m
[31m-        ur->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    u->prepare_retvals = ngx_http_lua_socket_error_retval_handler;[m
[31m-    ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                         NGX_HTTP_LUA_SOCKET_FT_NOMEM);[m
[31m-[m
[31m-    if (waiting) {[m
[31m-        ngx_http_run_posted_requests(c);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_resolve_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_http_lua_co_ctx_t           *coctx;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_cleanup_t              *cln;[m
[31m-    ngx_http_upstream_resolved_t    *ur;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_lua_udp_connection_t   *uc;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket resolve retval handler");[m
[31m-[m
[31m-    if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_RESOLVER) {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    uc = &u->udp_connection;[m
[31m-[m
[31m-    ur = u->resolved;[m
[31m-[m
[31m-    if (ur->sockaddr) {[m
[31m-        uc->sockaddr = ur->sockaddr;[m
[31m-        uc->socklen = ur->socklen;[m
[31m-        uc->server = ur->host;[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "resolver not working");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_udp_connect(uc);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_ERROR;[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "no memory");[m
[31m-            return 2;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_socket_udp_cleanup;[m
[31m-        cln->data = u;[m
[31m-        u->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket connect: %i", rc);[m
[31m-[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return ngx_http_lua_socket_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_OK */[m
[31m-[m
[31m-    c = uc->connection;[m
[31m-[m
[31m-    c->data = u;[m
[31m-[m
[31m-    c->write->handler = NULL;[m
[31m-    c->read->handler = ngx_http_lua_socket_udp_handler;[m
[31m-    c->read->resolver = 0;[m
[31m-[m
[31m-    c->pool = r->pool;[m
[31m-    c->log = r->connection->log;[m
[31m-    c->read->log = c->log;[m
[31m-    c->write->log = c->log;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_error_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    u_char           errstr[NGX_MAX_ERROR_STR];[m
[31m-    u_char          *p;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket error retval handler");[m
[31m-[m
[31m-    if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_RESOLVER) {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-[m
[31m-    if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE) {[m
[31m-        lua_pushliteral(L, "partial write");[m
[31m-[m
[31m-    } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_TIMEOUT) {[m
[31m-        lua_pushliteral(L, "timeout");[m
[31m-[m
[31m-    } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_CLOSED) {[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-[m
[31m-    } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_BUFTOOSMALL) {[m
[31m-        lua_pushliteral(L, "buffer too small");[m
[31m-[m
[31m-    } else if (u->ft_type & NGX_HTTP_LUA_SOCKET_FT_NOMEM) {[m
[31m-        lua_pushliteral(L, "no memory");[m
[31m-[m
[31m-    } else {[m
[31m-[m
[31m-        if (u->socket_errno) {[m
[31m-#if defined(nginx_version) && nginx_version >= 9000[m
[31m-            p = ngx_strerror(u->socket_errno, errstr, sizeof(errstr));[m
[31m-#else[m
[31m-            p = ngx_strerror_r(u->socket_errno, errstr, sizeof(errstr));[m
[31m-#endif[m
[31m-            /* for compatibility with LuaSocket */[m
[31m-            ngx_strlow(errstr, errstr, p - errstr);[m
[31m-            lua_pushlstring(L, (char *) errstr, p - errstr);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushliteral(L, "error");[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 2;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_send(lua_State *L)[m
[31m-{[m
[31m-    ssize_t                              n;[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-    int                                  type;[m
[31m-    const char                          *msg;[m
[31m-    ngx_str_t                            query;[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expecting 2 arguments (including the object), "[m
[31m-                          "but got %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "request object not found");[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL || u->udp_connection.connection == NULL) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to send data on a closed socket: u:%p, c:%p",[m
[31m-                          u, u ? u->udp_connection.connection : NULL);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-        u->ft_type = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "socket busy");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    type = lua_type(L, 2);[m
[31m-    switch (type) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            lua_tolstring(L, 2, &len);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            len = ngx_http_lua_calc_strlen_in_table(L, 2, 2, 1 /* strict */);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            msg = lua_pushfstring(L, "string, number, boolean, nil, "[m
[31m-                                  "or array table expected, got %s",[m
[31m-                                  lua_typename(L, type));[m
[31m-[m
[31m-            return luaL_argerror(L, 2, msg);[m
[31m-    }[m
[31m-[m
[31m-    query.data = lua_newuserdata(L, len);[m
[31m-    query.len = len;[m
[31m-[m
[31m-    switch (type) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            p = (u_char *) lua_tolstring(L, 2, &len);[m
[31m-            ngx_memcpy(query.data, (u_char *) p, len);[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-            (void) ngx_http_lua_copy_str_in_table(L, 2, query.data);[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            return luaL_error(L, "impossible to reach here");[m
[31m-    }[m
[31m-[m
[31m-    u->ft_type = 0;[m
[31m-[m
[31m-    /* mimic ngx_http_upstream_init_request here */[m
[31m-[m
[31m-#if 1[m
[31m-    u->waiting = 0;[m
[31m-#endif[m
[31m-[m
[31m-    dd("sending query %.*s", (int) query.len, query.data);[m
[31m-[m
[31m-    n = ngx_send(u->udp_connection.connection, query.data, query.len);[m
[31m-[m
[31m-    dd("ngx_send returns %d (query len %d)", (int) n, (int) query.len);[m
[31m-[m
[31m-    if (n == NGX_ERROR || n == NGX_AGAIN) {[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-[m
[31m-        return ngx_http_lua_socket_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    if (n != (ssize_t) query.len) {[m
[31m-        dd("not the while query was sent");[m
[31m-[m
[31m-        u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_PARTIALWRITE;[m
[31m-        return ngx_http_lua_socket_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    dd("n == len");[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_receive(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-    ngx_int_t                            rc;[m
[31m-    ngx_http_lua_ctx_t                  *ctx;[m
[31m-    ngx_http_lua_co_ctx_t               *coctx;[m
[31m-    size_t                               size;[m
[31m-    int                                  nargs;[m
[31m-    ngx_http_lua_loc_conf_t             *llcf;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-    if (nargs != 1 && nargs != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments "[m
[31m-                          "(including the object), but got %d", nargs);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket calling receive() method");[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL || u->udp_connection.connection == NULL) {[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "attempt to receive data on a closed socket: u:%p, "[m
[31m-                          "c:%p", u, u ? u->udp_connection.connection : NULL);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-        u->ft_type = 0;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (u->waiting) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "socket busy");[m
[31m-        return 2;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket read timeout: %M", u->read_timeout);[m
[31m-[m
[31m-    size = (size_t) luaL_optnumber(L, 2, UDP_MAX_DATAGRAM_SIZE);[m
[31m-    size = ngx_min(size, UDP_MAX_DATAGRAM_SIZE);[m
[31m-[m
[31m-    u->recv_buf_size = size;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket receive buffer size: %uz", u->recv_buf_size);[m
[31m-[m
[31m-    rc = ngx_http_lua_socket_udp_read(r, u);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        dd("read failed: %d", (int) u->ft_type);[m
[31m-        rc = ngx_http_lua_socket_udp_receive_retval_handler(r, u, L);[m
[31m-        dd("udp receive retval returned: %d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket receive done in a single run");[m
[31m-[m
[31m-        return ngx_http_lua_socket_udp_receive_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    /* n == NGX_AGAIN */[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_udp_read_handler;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-    coctx->cleanup = ngx_http_lua_udp_socket_cleanup;[m
[31m-    coctx->data = u;[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    u->co_ctx = coctx;[m
[31m-    u->waiting = 1;[m
[31m-    u->prepare_retvals = ngx_http_lua_socket_udp_receive_retval_handler;[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_receive_retval_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, lua_State *L)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket receive return value handler");[m
[31m-[m
[31m-    if (u->ft_type) {[m
[31m-        return ngx_http_lua_socket_error_retval_handler(r, u, L);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) ngx_http_lua_socket_udp_buffer, u->received);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_settimeout(lua_State *L)[m
[31m-{[m
[31m-    int                     n;[m
[31m-    ngx_int_t               timeout;[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 2) {[m
[31m-        return luaL_error(L, "ngx.socket settimout: expecting at least 2 "[m
[31m-                          "arguments (including the object) but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    timeout = (ngx_int_t) lua_tonumber(L, 2);[m
[31m-[m
[31m-    lua_rawseti(L, 1, SOCKET_TIMEOUT_INDEX);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-[m
[31m-    if (u) {[m
[31m-        if (timeout > 0) {[m
[31m-            u->read_timeout = (ngx_msec_t) timeout;[m
[31m-[m
[31m-        } else {[m
[31m-            u->read_timeout = u->conf->read_timeout;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_finalize(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua finalize socket");[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-        u->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->udp_connection.connection) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua close socket connection");[m
[31m-[m
[31m-        ngx_close_connection(u->udp_connection.connection);[m
[31m-        u->udp_connection.connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        u->waiting = 0;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_upstream_destroy(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-[m
[31m-    dd("upstream destroy triggered by Lua GC");[m
[31m-[m
[31m-    u = lua_touserdata(L, 1);[m
[31m-    if (u == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        ngx_http_lua_socket_udp_cleanup(u); /* it will clear u->cleanup */[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_dummy_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket dummy handler");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_udp_read(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_event_t                 *rev;[m
[31m-    ssize_t                      n;[m
[31m-[m
[31m-    c = u->udp_connection.connection;[m
[31m-    rev = c->read;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua udp socket read data: waiting: %d", (int) u->waiting);[m
[31m-[m
[31m-    n = ngx_udp_recv(u->udp_connection.connection,[m
[31m-                     ngx_http_lua_socket_udp_buffer, u->recv_buf_size);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua udp recv returned %z", n);[m
[31m-[m
[31m-    if (n >= 0) {[m
[31m-        u->received = n;[m
[31m-        ngx_http_lua_socket_udp_handle_success(r, u);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (n == NGX_ERROR) {[m
[31m-        u->socket_errno = ngx_socket_errno;[m
[31m-        ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* n == NGX_AGAIN */[m
[31m-[m
[31m-#if 1[m
[31m-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {[m
[31m-        ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_ERROR);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (rev->active) {[m
[31m-        ngx_add_timer(rev, u->read_timeout);[m
[31m-[m
[31m-    } else if (rev->timer_set) {[m
[31m-        ngx_del_timer(rev);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_AGAIN;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_read_handler(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    c = u->udp_connection.connection;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket read handler");[m
[31m-[m
[31m-    if (c->read->timedout) {[m
[31m-        c->read->timedout = 0;[m
[31m-[m
[31m-        llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        if (llcf->log_socket_errors) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua udp socket read timed out");[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_socket_udp_handle_error(r, u,[m
[31m-                                             NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    (void) ngx_http_lua_socket_udp_read(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_handle_error(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u, ngx_uint_t ft_type)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket handle error");[m
[31m-[m
[31m-    u->ft_type |= ft_type;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_socket_udp_finalize(r, u);[m
[31m-#endif[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    coctx = u->co_ctx;[m
[31m-[m
[31m-    if (coctx) {[m
[31m-        coctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        u->waiting = 0;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_udp_resume;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u = data;[m
[31m-[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = u->request;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "cleanup lua udp socket upstream request: \"%V\"", &r->uri);[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_finalize(r, u);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_request_t              *r;[m
[31m-    ngx_http_log_ctx_t              *ctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    u = c->data;[m
[31m-    r = u->request;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->fd != (ngx_socket_t) -1) {  /* not a fake connection */[m
[31m-        ctx = c->log->data;[m
[31m-        ctx->current_request = r;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua udp socket handler for \"%V?%V\", wev %d", &r->uri,[m
[31m-                   &r->args, (int) ev->write);[m
[31m-[m
[31m-    u->read_event_handler(r, u);[m
[31m-[m
[31m-    ngx_http_run_posted_requests(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_socket_udp_handle_success(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_socket_udp_upstream_t *u)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    u->read_event_handler = ngx_http_lua_socket_dummy_handler;[m
[31m-[m
[31m-    if (u->co_ctx) {[m
[31m-        u->co_ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        u->waiting = 0;[m
[31m-[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-        if (ctx == NULL) {[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        ctx->resume_handler = ngx_http_lua_socket_udp_resume;[m
[31m-        ctx->cur_co_ctx = u->co_ctx;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua udp socket waking up the current request");[m
[31m-[m
[31m-        r->write_event_handler(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_udp_connect(ngx_http_lua_udp_connection_t *uc)[m
[31m-{[m
[31m-    int                rc;[m
[31m-    ngx_int_t          event;[m
[31m-    ngx_event_t       *rev, *wev;[m
[31m-    ngx_socket_t       s;[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    s = ngx_socket(uc->sockaddr->sa_family, SOCK_DGRAM, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "UDP socket %d", s);[m
[31m-[m
[31m-    if (s == (ngx_socket_t) -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,[m
[31m-                      ngx_socket_n " failed");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(s, &uc->log);[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n "failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_nonblocking(s) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,[m
[31m-                      ngx_nonblocking_n " failed");[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        if (ngx_close_socket(s) == -1) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,[m
[31m-                          ngx_close_socket_n " failed");[m
[31m-        }[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rev = c->read;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    rev->log = &uc->log;[m
[31m-    wev->log = &uc->log;[m
[31m-[m
[31m-    uc->connection = c;[m
[31m-[m
[31m-    c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-#if (NGX_HTTP_LUA_HAVE_SO_PASSCRED)[m
[31m-    if (uc->sockaddr->sa_family == AF_UNIX) {[m
[31m-        struct sockaddr         addr;[m
[31m-[m
[31m-        addr.sa_family = AF_UNIX;[m
[31m-[m
[31m-        /* just to make valgrind happy */[m
[31m-        ngx_memzero(addr.sa_data, sizeof(addr.sa_data));[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "datagram unix "[m
[31m-                       "domain socket autobind");[m
[31m-[m
[31m-        if (bind(uc->connection->fd, &addr, sizeof(sa_family_t)) != 0) {[m
[31m-            ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,[m
[31m-                          "bind() failed");[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &uc->log, 0,[m
[31m-                   "connect to %V, fd:%d #%d", &uc->server, s, c->number);[m
[31m-[m
[31m-    rc = connect(s, uc->sockaddr, uc->socklen);[m
[31m-[m
[31m-    /* TODO: aio, iocp */[m
[31m-[m
[31m-    if (rc == -1) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,[m
[31m-                      "connect() failed");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* UDP sockets are always ready to write */[m
[31m-    wev->ready = 1;[m
[31m-[m
[31m-    if (ngx_add_event) {[m
[31m-[m
[31m-        event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ?[m
[31m-                    /* kqueue, epoll */                 NGX_CLEAR_EVENT:[m
[31m-                    /* select, poll, /dev/poll */       NGX_LEVEL_EVENT;[m
[31m-                    /* eventport event type has no meaning: oneshot only */[m
[31m-[m
[31m-        if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        /* rtsig */[m
[31m-[m
[31m-        if (ngx_add_conn(c) == NGX_ERROR) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_socket_udp_close(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                  *r;[m
[31m-    ngx_http_lua_socket_udp_upstream_t  *u;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument "[m
[31m-                          "(including the object) but seen %d", lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    lua_rawgeti(L, 1, SOCKET_CTX_INDEX);[m
[31m-    u = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (u == NULL || u->udp_connection.connection == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "closed");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request != r) {[m
[31m-        return luaL_error(L, "bad request");[m
[31m-    }[m
[31m-[m
[31m-    if (u->waiting) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "socket busy");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_finalize(r, u);[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_socket_udp_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                          nret;[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp operation done, resuming lua thread");[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_probe_info("udp resume");[m
[31m-#endif[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua udp socket calling prepare retvals handler %p, "[m
[31m-                   "u:%p", u->prepare_retvals, u);[m
[31m-[m
[31m-    nret = u->prepare_retvals(r, u, ctx->cur_co_ctx->co);[m
[31m-    if (nret == NGX_AGAIN) {[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, nret);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_udp_resolve_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_resolver_ctx_t                      *rctx;[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-    if (u == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rctx = u->resolved->ctx;[m
[31m-    if (rctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_resolve_name_done(rctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_udp_socket_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_socket_udp_upstream_t      *u;[m
[31m-    ngx_http_lua_co_ctx_t                   *coctx = data;[m
[31m-[m
[31m-    u = coctx->data;[m
[31m-    if (u == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (u->request == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_socket_udp_finalize(u->request, u);[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.h[m
[1mdeleted file mode 100644[m
[1mindex 8333346..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_socket_udp.h[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_socket_udp_upstream_s[m
[31m-    ngx_http_lua_socket_udp_upstream_t;[m
[31m-[m
[31m-[m
[31m-typedef[m
[31m-    int (*ngx_http_lua_socket_udp_retval_handler)(ngx_http_request_t *r,[m
[31m-        ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);[m
[31m-[m
[31m-[m
[31m-typedef void (*ngx_http_lua_socket_udp_upstream_handler_pt)[m
[31m-    (ngx_http_request_t *r, ngx_http_lua_socket_udp_upstream_t *u);[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_connection_t         *connection;[m
[31m-    struct sockaddr          *sockaddr;[m
[31m-    socklen_t                 socklen;[m
[31m-    ngx_str_t                 server;[m
[31m-    ngx_log_t                 log;[m
[31m-} ngx_http_lua_udp_connection_t;[m
[31m-[m
[31m-[m
[31m-struct ngx_http_lua_socket_udp_upstream_s {[m
[31m-    ngx_http_lua_socket_udp_retval_handler          prepare_retvals;[m
[31m-    ngx_http_lua_socket_udp_upstream_handler_pt     read_event_handler;[m
[31m-[m
[31m-    ngx_http_lua_loc_conf_t         *conf;[m
[31m-    ngx_http_cleanup_pt             *cleanup;[m
[31m-    ngx_http_request_t              *request;[m
[31m-    ngx_http_lua_udp_connection_t    udp_connection;[m
[31m-[m
[31m-    ngx_msec_t                       read_timeout;[m
[31m-[m
[31m-    ngx_http_upstream_resolved_t    *resolved;[m
[31m-[m
[31m-    ngx_uint_t                       ft_type;[m
[31m-    ngx_err_t                        socket_errno;[m
[31m-    size_t                           received; /* for receive */[m
[31m-    size_t                           recv_buf_size;[m
[31m-[m
[31m-    ngx_http_lua_co_ctx_t           *co_ctx;[m
[31m-[m
[31m-    unsigned                         waiting; /* :1 */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_socket_udp_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.c[m
[1mdeleted file mode 100644[m
[1mindex c06bc8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.c[m
[1m+++ /dev/null[m
[36m@@ -1,958 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_cache.h"[m
[31m-#include "ngx_http_lua_initworkerby.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_ssl_module.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_ssl_certby.h"[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-[m
[31m-[m
[31m-enum {[m
[31m-    NGX_HTTP_LUA_ADDR_TYPE_UNIX  = 0,[m
[31m-    NGX_HTTP_LUA_ADDR_TYPE_INET  = 1,[m
[31m-    NGX_HTTP_LUA_ADDR_TYPE_INET6 = 2[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static void ngx_http_lua_ssl_cert_done(void *data);[m
[31m-static void ngx_http_lua_ssl_cert_aborted(void *data);[m
[31m-static u_char *ngx_http_lua_log_ssl_cert_error(ngx_log_t *log, u_char *buf,[m
[31m-    size_t len);[m
[31m-static ngx_int_t ngx_http_lua_ssl_cert_by_chunk(lua_State *L,[m
[31m-    ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-int  ngx_http_lua_ssl_ctx_index = -1;[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_ssl_cert_handler_file(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_loadfile(r->connection->log, L,[m
[31m-                                     lscf->ssl.cert_src.data,[m
[31m-                                     lscf->ssl.cert_src_key);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_ssl_cert_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_ssl_cert_handler_inline(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    rc = ngx_http_lua_cache_loadbuffer(r->connection->log, L,[m
[31m-                                       lscf->ssl.cert_src.data,[m
[31m-                                       lscf->ssl.cert_src.len,[m
[31m-                                       lscf->ssl.cert_src_key,[m
[31m-                                       "=ssl_certificate_by_lua");[m
[31m-    if (rc != NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /*  make sure we have a valid code chunk */[m
[31m-    ngx_http_lua_assert(lua_isfunction(L, -1));[m
[31m-[m
[31m-    return ngx_http_lua_ssl_cert_by_chunk(L, r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_ssl_cert_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-    char        *rv;[m
[31m-    ngx_conf_t   save;[m
[31m-[m
[31m-    save = *cf;[m
[31m-    cf->handler = ngx_http_lua_ssl_cert_by_lua;[m
[31m-    cf->handler_conf = conf;[m
[31m-[m
[31m-    rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);[m
[31m-[m
[31m-    *cf = save;[m
[31m-[m
[31m-    return rv;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-char *[m
[31m-ngx_http_lua_ssl_cert_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf)[m
[31m-{[m
[31m-#if OPENSSL_VERSION_NUMBER < 0x1000205fL[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_EMERG, cf->log, 0,[m
[31m-                  "at least OpenSSL 1.0.2e required but found "[m
[31m-                  OPENSSL_VERSION_TEXT);[m
[31m-[m
[31m-    return NGX_CONF_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u_char                      *p;[m
[31m-    u_char                      *name;[m
[31m-    ngx_str_t                   *value;[m
[31m-    ngx_http_lua_srv_conf_t    *lscf = conf;[m
[31m-[m
[31m-    /*  must specifiy a concrete handler */[m
[31m-    if (cmd->post == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (lscf->ssl.cert_handler) {[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_lua_ssl_ctx_index == -1) {[m
[31m-        ngx_http_lua_ssl_ctx_index = SSL_get_ex_new_index(0, NULL, NULL,[m
[31m-                                                          NULL, NULL);[m
[31m-[m
[31m-        if (ngx_ssl_connection_index == -1) {[m
[31m-            ngx_ssl_error(NGX_LOG_ALERT, cf->log, 0,[m
[31m-                          "lua: SSL_get_ex_new_index() failed");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    value = cf->args->elts;[m
[31m-[m
[31m-    lscf->ssl.cert_handler = (ngx_http_lua_srv_conf_handler_pt) cmd->post;[m
[31m-[m
[31m-    if (cmd->post == ngx_http_lua_ssl_cert_handler_file) {[m
[31m-        /* Lua code in an external file */[m
[31m-[m
[31m-        name = ngx_http_lua_rebase_path(cf->pool, value[1].data,[m
[31m-                                        value[1].len);[m
[31m-        if (name == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->ssl.cert_src.data = name;[m
[31m-        lscf->ssl.cert_src.len = ngx_strlen(name);[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->ssl.cert_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-[m
[31m-    } else {[m
[31m-        /* inlined Lua code */[m
[31m-[m
[31m-        lscf->ssl.cert_src = value[1];[m
[31m-[m
[31m-        p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        lscf->ssl.cert_src_key = p;[m
[31m-[m
[31m-        p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN);[m
[31m-        p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len);[m
[31m-        *p = '\0';[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-[m
[31m-#endif  /* OPENSSL_VERSION_NUMBER < 0x1000205fL */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ssl_cert_handler(ngx_ssl_conn_t *ssl_conn, void *data)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_connection_t                *c, *fc;[m
[31m-    ngx_http_request_t              *r = NULL;[m
[31m-    ngx_pool_cleanup_t              *cln;[m
[31m-    ngx_http_connection_t           *hc;[m
[31m-    ngx_http_lua_srv_conf_t         *lscf;[m
[31m-    ngx_http_lua_ssl_cert_ctx_t     *cctx;[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    dd("c = %p", c);[m
[31m-[m
[31m-    cctx = ngx_http_lua_ssl_get_ctx(c->ssl->connection);[m
[31m-[m
[31m-    dd("ssl cert handler, cert-ctx=%p", cctx);[m
[31m-[m
[31m-    if (cctx) {[m
[31m-        /* not the first time */[m
[31m-[m
[31m-        if (cctx->done) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "lua_certificate_by_lua: cert cb exit code: %d",[m
[31m-                           cctx->exit_code);[m
[31m-[m
[31m-            dd("lua ssl cert done, finally");[m
[31m-            return cctx->exit_code;[m
[31m-        }[m
[31m-[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    /* cctx == NULL */[m
[31m-[m
[31m-    dd("first time");[m
[31m-[m
[31m-    hc = c->data;[m
[31m-[m
[31m-    fc = ngx_http_lua_create_fake_connection(NULL);[m
[31m-    if (fc == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    fc->log->handler = ngx_http_lua_log_ssl_cert_error;[m
[31m-    fc->log->data = fc;[m
[31m-[m
[31m-    fc->addr_text = c->addr_text;[m
[31m-    fc->listening = c->listening;[m
[31m-[m
[31m-    r = ngx_http_lua_create_fake_request(fc);[m
[31m-    if (r == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    r->main_conf = hc->conf_ctx->main_conf;[m
[31m-    r->srv_conf = hc->conf_ctx->srv_conf;[m
[31m-    r->loc_conf = hc->conf_ctx->loc_conf;[m
[31m-[m
[31m-    fc->log->file = c->log->file;[m
[31m-    fc->log->log_level = c->log->log_level;[m
[31m-    fc->ssl = c->ssl;[m
[31m-[m
[31m-    cctx = ngx_pcalloc(c->pool, sizeof(ngx_http_lua_ssl_cert_ctx_t));[m
[31m-    if (cctx == NULL) {[m
[31m-        goto failed;  /* error */[m
[31m-    }[m
[31m-[m
[31m-    cctx->exit_code = 1;  /* successful by default */[m
[31m-    cctx->connection = c;[m
[31m-    cctx->request = r;[m
[31m-[m
[31m-    dd("setting cctx");[m
[31m-[m
[31m-    if (SSL_set_ex_data(c->ssl->connection, ngx_http_lua_ssl_ctx_index, cctx)[m
[31m-        == 0)[m
[31m-    {[m
[31m-        ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_ex_data() failed");[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    lscf = ngx_http_get_module_srv_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    /* TODO honor lua_code_cache off */[m
[31m-    L = ngx_http_lua_get_lua_vm(r, NULL);[m
[31m-[m
[31m-    c->log->action = "loading SSL certificate by lua";[m
[31m-[m
[31m-    rc = lscf->ssl.cert_handler(r, lscf, L);[m
[31m-[m
[31m-    if (rc >= NGX_OK || rc == NGX_ERROR) {[m
[31m-        cctx->done = 1;[m
[31m-[m
[31m-        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                       "lua_certificate_by_lua: handler return value: %i, "[m
[31m-                       "cert cb exit code: %d", rc, cctx->exit_code);[m
[31m-[m
[31m-        c->log->action = "SSL handshaking";[m
[31m-        return cctx->exit_code;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_DONE */[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(fc->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_ssl_cert_done;[m
[31m-    cln->data = cctx;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(c->pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_ssl_cert_aborted;[m
[31m-    cln->data = cctx;[m
[31m-[m
[31m-    return -1;[m
[31m-[m
[31m-#if 1[m
[31m-failed:[m
[31m-[m
[31m-    if (r && r->pool) {[m
[31m-        ngx_http_lua_free_fake_request(r);[m
[31m-    }[m
[31m-[m
[31m-    if (fc) {[m
[31m-        ngx_http_lua_close_fake_connection(fc);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ssl_cert_done(void *data)[m
[31m-{[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_lua_ssl_cert_ctx_t     *cctx = data;[m
[31m-[m
[31m-    dd("lua ssl cert done");[m
[31m-[m
[31m-    if (cctx->aborted) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_assert(cctx->done == 0);[m
[31m-[m
[31m-    cctx->done = 1;[m
[31m-[m
[31m-    c = cctx->connection;[m
[31m-[m
[31m-    c->log->action = "SSL handshaking";[m
[31m-[m
[31m-    ngx_post_event(c->write, &ngx_posted_events);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_ssl_cert_aborted(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_ssl_cert_ctx_t     *cctx = data;[m
[31m-[m
[31m-    dd("lua ssl cert done");[m
[31m-[m
[31m-    if (cctx->done) {[m
[31m-        /* completed successfully already */[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cctx->connection->log, 0,[m
[31m-                   "lua_certificate_by_lua: cert cb aborted");[m
[31m-[m
[31m-    cctx->aborted = 1;[m
[31m-    cctx->request->connection->ssl = NULL;[m
[31m-[m
[31m-    ngx_http_lua_finalize_fake_request(cctx->request, NGX_ERROR);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_log_ssl_cert_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_connection_t    *c;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", context: ssl_certificate_by_lua*");[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    c = log->data;[m
[31m-[m
[31m-    if (c->addr_text.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", client: %V", &c->addr_text);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (c && c->listening && c->listening->addr_text.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", server: %V", &c->listening->addr_text);[m
[31m-        /* len -= p - buf; */[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_ssl_cert_by_chunk(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    int                      co_ref;[m
[31m-    ngx_int_t                rc;[m
[31m-    lua_State               *co;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_cleanup_t      *cln;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_lua_create_ctx(r);[m
[31m-        if (ctx == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        dd("reset ctx");[m
[31m-        ngx_http_lua_reset_ctx(r, L, ctx);[m
[31m-    }[m
[31m-[m
[31m-    ctx->entered_content_phase = 1;[m
[31m-[m
[31m-    /*  {{{ new coroutine to handle request */[m
[31m-    co = ngx_http_lua_new_thread(r, L, &co_ref);[m
[31m-[m
[31m-    if (co == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua: failed to create new coroutine to handle request");[m
[31m-[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*  move code closure to new coroutine */[m
[31m-    lua_xmove(L, co, 1);[m
[31m-[m
[31m-    /*  set closure's env table to new coroutine's globals table */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /* save nginx request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(co, r);[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-    ctx->cur_co_ctx->co = co;[m
[31m-    ctx->cur_co_ctx->co_ref = co_ref;[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    /* register request cleanup hooks */[m
[31m-    if (ctx->cleanup == NULL) {[m
[31m-        cln = ngx_http_cleanup_add(r, 0);[m
[31m-        if (cln == NULL) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-        cln->data = ctx;[m
[31m-        ctx->cleanup = &cln->handler;[m
[31m-    }[m
[31m-[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_SSL_CERT;[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-        /* do nothing */[m
[31m-[m
[31m-    } else if (rc == NGX_AGAIN) {[m
[31m-        rc = ngx_http_lua_content_run_posted_threads(L, r, ctx, 0);[m
[31m-[m
[31m-    } else if (rc == NGX_DONE) {[m
[31m-        rc = ngx_http_lua_content_run_posted_threads(L, r, ctx, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        rc = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_finalize_request(r, rc);[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_get_tls1_version(ngx_http_request_t *r, char **err)[m
[31m-{[m
[31m-#ifndef TLS1_get_version[m
[31m-[m
[31m-    *err = "no TLS1 support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("tls1 ver: %d", (int) TLS1_get_version(ssl_conn));[m
[31m-[m
[31m-    return (int) TLS1_get_version(ssl_conn);[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_clear_certs(ngx_http_request_t *r, char **err)[m
[31m-{[m
[31m-#ifdef LIBRESSL_VERSION_NUMBER[m
[31m-[m
[31m-    *err = "LibreSSL not supported";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if OPENSSL_VERSION_NUMBER < 0x1000205fL[m
[31m-[m
[31m-    *err = "at least OpenSSL 1.0.2e required but found " OPENSSL_VERSION_TEXT;[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    SSL_certs_clear(ssl_conn);[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#   endif  /* OPENSSL_VERSION_NUMBER < 0x1000205fL */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_set_der_certificate(ngx_http_request_t *r,[m
[31m-    const char *data, size_t len, char **err)[m
[31m-{[m
[31m-#ifdef LIBRESSL_VERSION_NUMBER[m
[31m-[m
[31m-    *err = "LibreSSL not supported";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if OPENSSL_VERSION_NUMBER < 0x1000205fL[m
[31m-[m
[31m-    *err = "at least OpenSSL 1.0.2e required but found " OPENSSL_VERSION_TEXT;[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-    BIO               *bio = NULL;[m
[31m-    X509              *x509 = NULL;[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) data, len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    x509 = d2i_X509_bio(bio, NULL);[m
[31m-    if (x509 == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_use_certificate(ssl_conn, x509) == 0) {[m
[31m-        *err = "SSL_use_certificate() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (SSL_set_ex_data(ssl_conn, ngx_ssl_certificate_index, x509) == 0) {[m
[31m-        *err = "SSL_set_ex_data() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    X509_free(x509);[m
[31m-    x509 = NULL;[m
[31m-[m
[31m-    /* read rest of the chain */[m
[31m-[m
[31m-    while (!BIO_eof(bio)) {[m
[31m-[m
[31m-        x509 = d2i_X509_bio(bio, NULL);[m
[31m-        if (x509 == NULL) {[m
[31m-            *err = "d2i_X509_bio() failed";[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (SSL_add0_chain_cert(ssl_conn, x509) == 0) {[m
[31m-            *err = "SSL_add0_chain_cert() failed";[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    *err = NULL;[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    if (x509) {[m
[31m-        X509_free(x509);[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#   endif  /* OPENSSL_VERSION_NUMBER < 0x1000205fL */[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_set_der_private_key(ngx_http_request_t *r,[m
[31m-    const char *data, size_t len, char **err)[m
[31m-{[m
[31m-    BIO               *bio = NULL;[m
[31m-    EVP_PKEY          *pkey = NULL;[m
[31m-    ngx_ssl_conn_t    *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) data, len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    pkey = d2i_PrivateKey_bio(bio, NULL);[m
[31m-    if (pkey == NULL) {[m
[31m-        *err = "d2i_PrivateKey_bio() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (SSL_use_PrivateKey(ssl_conn, pkey) == 0) {[m
[31m-        *err = "SSL_CTX_use_PrivateKey() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    EVP_PKEY_free(pkey);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (pkey) {[m
[31m-        EVP_PKEY_free(pkey);[m
[31m-    }[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_raw_server_addr(ngx_http_request_t *r, char **addr,[m
[31m-    size_t *addrlen, int *addrtype, char **err)[m
[31m-{[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    struct sockaddr_un   *saun;[m
[31m-#endif[m
[31m-    ngx_ssl_conn_t       *ssl_conn;[m
[31m-    ngx_connection_t     *c;[m
[31m-    struct sockaddr_in   *sin;[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    struct sockaddr_in6  *sin6;[m
[31m-#endif[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-    if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    switch (c->local_sockaddr->sa_family) {[m
[31m-[m
[31m-#if (NGX_HAVE_INET6)[m
[31m-    case AF_INET6:[m
[31m-        sin6 = (struct sockaddr_in6 *) c->local_sockaddr;[m
[31m-        *addrlen = 16;[m
[31m-        *addr = (char *) &sin6->sin6_addr.s6_addr;[m
[31m-        *addrtype = NGX_HTTP_LUA_ADDR_TYPE_INET6;[m
[31m-[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HAVE_UNIX_DOMAIN)[m
[31m-    case AF_UNIX:[m
[31m-        saun = (struct sockaddr_un *) c->local_sockaddr;[m
[31m-[m
[31m-        /* on Linux sockaddr might not include sun_path at all */[m
[31m-        if (c->local_socklen <= (socklen_t)[m
[31m-            offsetof(struct sockaddr_un, sun_path))[m
[31m-        {[m
[31m-            *addr = "";[m
[31m-            *addrlen = 0;[m
[31m-[m
[31m-        } else {[m
[31m-            *addr = saun->sun_path;[m
[31m-            *addrlen = ngx_strlen(saun->sun_path);[m
[31m-        }[m
[31m-[m
[31m-        *addrtype = NGX_HTTP_LUA_ADDR_TYPE_UNIX;[m
[31m-        break;[m
[31m-#endif[m
[31m-[m
[31m-    default: /* AF_INET */[m
[31m-        sin = (struct sockaddr_in *) c->local_sockaddr;[m
[31m-        *addr = (char *) &sin->sin_addr.s_addr;[m
[31m-        *addrlen = 4;[m
[31m-        *addrtype = NGX_HTTP_LUA_ADDR_TYPE_INET;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_server_name(ngx_http_request_t *r, char **name,[m
[31m-    size_t *namelen, char **err)[m
[31m-{[m
[31m-    ngx_ssl_conn_t          *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME[m
[31m-[m
[31m-    *name = (char *) SSL_get_servername(ssl_conn, TLSEXT_NAMETYPE_host_name);[m
[31m-[m
[31m-    if (*name) {[m
[31m-        *namelen = ngx_strlen(*name);[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DECLINED;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    *err = "no TLS extension support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_cert_pem_to_der(const u_char *pem, size_t pem_len, u_char *der,[m
[31m-    char **err)[m
[31m-{[m
[31m-    int       total, len;[m
[31m-    BIO      *bio;[m
[31m-    X509     *x509;[m
[31m-    u_long    n;[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) pem, (int) pem_len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL);[m
[31m-    if (x509 == NULL) {[m
[31m-        *err = "PEM_read_bio_X509_AUX() failed";[m
[31m-        BIO_free(bio);[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    total = i2d_X509(x509, &der);[m
[31m-    if (total < 0) {[m
[31m-        *err = "i2d_X509() failed";[m
[31m-        X509_free(x509);[m
[31m-        BIO_free(bio);[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    X509_free(x509);[m
[31m-[m
[31m-    /* read rest of the chain */[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-[m
[31m-        x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);[m
[31m-        if (x509 == NULL) {[m
[31m-            n = ERR_peek_last_error();[m
[31m-[m
[31m-            if (ERR_GET_LIB(n) == ERR_LIB_PEM[m
[31m-                && ERR_GET_REASON(n) == PEM_R_NO_START_LINE)[m
[31m-            {[m
[31m-                /* end of file */[m
[31m-                ERR_clear_error();[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* some real error */[m
[31m-[m
[31m-            *err = "PEM_read_bio_X509() failed";[m
[31m-            BIO_free(bio);[m
[31m-            ERR_clear_error();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        len = i2d_X509(x509, &der);[m
[31m-        if (len < 0) {[m
[31m-            *err = "i2d_X509() failed";[m
[31m-            X509_free(x509);[m
[31m-            BIO_free(bio);[m
[31m-            ERR_clear_error();[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        total += len;[m
[31m-[m
[31m-        X509_free(x509);[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return total;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_priv_key_pem_to_der(const u_char *pem, size_t pem_len,[m
[31m-    u_char *der, char **err)[m
[31m-{[m
[31m-    int          len;[m
[31m-    BIO         *in;[m
[31m-    EVP_PKEY    *pkey;[m
[31m-[m
[31m-    in = BIO_new_mem_buf((char *) pem, (int) pem_len);[m
[31m-    if (in == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pkey = PEM_read_bio_PrivateKey(in, NULL, NULL, NULL);[m
[31m-    if (pkey == NULL) {[m
[31m-        BIO_free(in);[m
[31m-        *err = "PEM_read_bio_PrivateKey failed";[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    BIO_free(in);[m
[31m-[m
[31m-    len = i2d_PrivateKey(pkey, &der);[m
[31m-    if (len < 0) {[m
[31m-        EVP_PKEY_free(pkey);[m
[31m-        *err = "i2d_PrivateKey failed";[m
[31m-        ERR_clear_error();[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    EVP_PKEY_free(pkey);[m
[31m-[m
[31m-    return len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#endif  /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-#endif /* NGX_HTTP_SSL */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.h[m
[1mdeleted file mode 100644[m
[1mindex 11cb963..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_certby.h[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SSL_CERTBY_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SSL_CERTBY_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_connection_t        *connection; /* original true connection */[m
[31m-    ngx_http_request_t      *request;    /* fake request */[m
[31m-    int                      exit_code;  /* exit code for openssl's[m
[31m-                                            set_cert_cb callback */[m
[31m-    unsigned                 done;       /* :1 */[m
[31m-    unsigned                 aborted;    /* :1 */[m
[31m-} ngx_http_lua_ssl_cert_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_ssl_cert_handler_inline(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_ssl_cert_handler_file(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_srv_conf_t *lscf, lua_State *L);[m
[31m-[m
[31m-char *ngx_http_lua_ssl_cert_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-char *ngx_http_lua_ssl_cert_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,[m
[31m-    void *conf);[m
[31m-[m
[31m-int ngx_http_lua_ssl_cert_handler(ngx_ssl_conn_t *ssl_conn, void *data);[m
[31m-[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SSL_CERTBY_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_ocsp.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_ocsp.c[m
[1mdeleted file mode 100644[m
[1mindex 1bf4335..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_ssl_ocsp.c[m
[1m+++ /dev/null[m
[36m@@ -1,503 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-[m
[31m-#ifdef NGX_HTTP_LUA_USE_OCSP[m
[31m-static int ngx_http_lua_ssl_empty_status_callback(ngx_ssl_conn_t *ssl_conn,[m
[31m-    void *data);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_get_ocsp_responder_from_der_chain([m
[31m-    const char *chain_data, size_t chain_len, unsigned char *out,[m
[31m-    size_t *out_size, char **err)[m
[31m-{[m
[31m-#ifndef NGX_HTTP_LUA_USE_OCSP[m
[31m-[m
[31m-    *err = "no OCSP support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    int                        rc = NGX_OK;[m
[31m-    BIO                       *bio = NULL;[m
[31m-    char                      *s;[m
[31m-    X509                      *cert = NULL, *issuer = NULL;[m
[31m-    size_t                     len;[m
[31m-    STACK_OF(OPENSSL_STRING)  *aia = NULL;[m
[31m-[m
[31m-    /* certificate */[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) chain_data, chain_len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    cert = d2i_X509_bio(bio, NULL);[m
[31m-    if (cert == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /* responder */[m
[31m-[m
[31m-    aia = X509_get1_ocsp(cert);[m
[31m-    if (aia == NULL) {[m
[31m-        rc = NGX_DECLINED;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-#if OPENSSL_VERSION_NUMBER >= 0x10000000L[m
[31m-    s = sk_OPENSSL_STRING_value(aia, 0);[m
[31m-#else[m
[31m-    s = sk_value(aia, 0);[m
[31m-#endif[m
[31m-    if (s == NULL) {[m
[31m-        rc = NGX_DECLINED;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    len = ngx_strlen(s);[m
[31m-    if (len > *out_size) {[m
[31m-        len = *out_size;[m
[31m-        rc = NGX_BUSY;[m
[31m-[m
[31m-    } else {[m
[31m-        rc = NGX_OK;[m
[31m-        *out_size = len;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(out, s, len);[m
[31m-[m
[31m-    X509_email_free(aia);[m
[31m-    aia = NULL;[m
[31m-[m
[31m-    /* issuer */[m
[31m-[m
[31m-    if (BIO_eof(bio)) {[m
[31m-        *err = "no issuer certificate in chain";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    issuer = d2i_X509_bio(bio, NULL);[m
[31m-    if (issuer == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (X509_check_issued(issuer, cert) != X509_V_OK) {[m
[31m-        *err = "issuer certificate not next to leaf";[m
[31m-        rc = NGX_ERROR;[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    X509_free(issuer);[m
[31m-    X509_free(cert);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (aia) {[m
[31m-        X509_email_free(aia);[m
[31m-    }[m
[31m-[m
[31m-    if (issuer) {[m
[31m-        X509_free(issuer);[m
[31m-    }[m
[31m-[m
[31m-    if (cert) {[m
[31m-        X509_free(cert);[m
[31m-    }[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        ERR_clear_error();[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-#endif  /* NGX_HTTP_LUA_USE_OCSP */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_create_ocsp_request(const char *chain_data,[m
[31m-    size_t chain_len, unsigned char *out, size_t *out_size, char **err)[m
[31m-{[m
[31m-#ifndef NGX_HTTP_LUA_USE_OCSP[m
[31m-[m
[31m-    *err = "no OCSP support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    int                        rc = NGX_ERROR;[m
[31m-    BIO                       *bio = NULL;[m
[31m-    X509                      *cert = NULL, *issuer = NULL;[m
[31m-    size_t                     len;[m
[31m-    OCSP_CERTID               *id;[m
[31m-    OCSP_REQUEST              *ocsp = NULL;[m
[31m-[m
[31m-    /* certificate */[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) chain_data, chain_len);[m
[31m-    if (bio == NULL) {[m
[31m-        *err = "BIO_new_mem_buf() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cert = d2i_X509_bio(bio, NULL);[m
[31m-    if (cert == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (BIO_eof(bio)) {[m
[31m-        *err = "no issuer certificate in chain";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    issuer = d2i_X509_bio(bio, NULL);[m
[31m-    if (issuer == NULL) {[m
[31m-        *err = "d2i_X509_bio() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ocsp = OCSP_REQUEST_new();[m
[31m-    if (ocsp == NULL) {[m
[31m-        *err = "OCSP_REQUEST_new() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    id = OCSP_cert_to_id(NULL, cert, issuer);[m
[31m-    if (id == NULL) {[m
[31m-        *err = "OCSP_cert_to_id() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_request_add0_id(ocsp, id) == NULL) {[m
[31m-        *err = "OCSP_request_add0_id() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = i2d_OCSP_REQUEST(ocsp, NULL);[m
[31m-    if (len <= 0) {[m
[31m-        *err = "i2d_OCSP_REQUEST() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (len > *out_size) {[m
[31m-        *err = "output buffer too small";[m
[31m-        *out_size = len;[m
[31m-        rc = NGX_BUSY;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    len = i2d_OCSP_REQUEST(ocsp, &out);[m
[31m-    if (len <=  0) {[m
[31m-        *err = "i2d_OCSP_REQUEST() failed";[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    *out_size = len;[m
[31m-[m
[31m-    OCSP_REQUEST_free(ocsp);[m
[31m-    X509_free(issuer);[m
[31m-    X509_free(cert);[m
[31m-    BIO_free(bio);[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (ocsp) {[m
[31m-        OCSP_REQUEST_free(ocsp);[m
[31m-    }[m
[31m-[m
[31m-    if (issuer) {[m
[31m-        X509_free(issuer);[m
[31m-    }[m
[31m-[m
[31m-    if (cert) {[m
[31m-        X509_free(cert);[m
[31m-    }[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-[m
[31m-#endif  /* NGX_HTTP_LUA_USE_OCSP */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_validate_ocsp_response(const u_char *resp,[m
[31m-    size_t resp_len, const char *chain_data, size_t chain_len,[m
[31m-    u_char *errbuf, size_t *errbuf_size)[m
[31m-{[m
[31m-#ifndef NGX_HTTP_LUA_USE_OCSP[m
[31m-[m
[31m-    *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                "no OCSP support") - errbuf;[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    int                    n;[m
[31m-    BIO                   *bio = NULL;[m
[31m-    X509                  *cert = NULL, *issuer = NULL;[m
[31m-    OCSP_CERTID           *id = NULL;[m
[31m-    OCSP_RESPONSE         *ocsp = NULL;[m
[31m-    OCSP_BASICRESP        *basic = NULL;[m
[31m-    STACK_OF(X509)        *chain = NULL;[m
[31m-    ASN1_GENERALIZEDTIME  *thisupdate, *nextupdate;[m
[31m-[m
[31m-    ocsp = d2i_OCSP_RESPONSE(NULL, &resp, resp_len);[m
[31m-    if (ocsp == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "d2i_OCSP_RESPONSE() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    n = OCSP_response_status(ocsp);[m
[31m-[m
[31m-    if (n != OCSP_RESPONSE_STATUS_SUCCESSFUL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP response not successful (%d: %s)",[m
[31m-                                    n, OCSP_response_status_str(n)) - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    basic = OCSP_response_get1_basic(ocsp);[m
[31m-    if (basic == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP_response_get1_basic() failed")[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    /* get issuer certificate from chain */[m
[31m-[m
[31m-    bio = BIO_new_mem_buf((char *) chain_data, chain_len);[m
[31m-    if (bio == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "BIO_new_mem_buf() failed")[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    cert = d2i_X509_bio(bio, NULL);[m
[31m-    if (cert == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "d2i_X509_bio() failed")[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (BIO_eof(bio)) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "no issuer certificate in chain")[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    issuer = d2i_X509_bio(bio, NULL);[m
[31m-    if (issuer == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "d2i_X509_bio() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    chain = sk_X509_new_null();[m
[31m-    if (chain == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "sk_X509_new_null() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    (void) sk_X509_push(chain, issuer);[m
[31m-[m
[31m-    if (OCSP_basic_verify(basic, chain, NULL, OCSP_NOVERIFY) != 1) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP_basic_verify() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    id = OCSP_cert_to_id(NULL, cert, issuer);[m
[31m-    if (id == NULL) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP_cert_to_id() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_resp_find_status(basic, id, &n, NULL, NULL,[m
[31m-                              &thisupdate, &nextupdate)[m
[31m-        != 1)[m
[31m-    {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "certificate status not found in the "[m
[31m-                                    "OCSP response") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (n != V_OCSP_CERTSTATUS_GOOD) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "certificate status \"%s\" in the OCSP "[m
[31m-                                    "response", OCSP_cert_status_str(n))[m
[31m-                       - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    if (OCSP_check_validity(thisupdate, nextupdate, 300, -1) != 1) {[m
[31m-        *errbuf_size = ngx_snprintf(errbuf, *errbuf_size,[m
[31m-                                    "OCSP_check_validity() failed") - errbuf;[m
[31m-        goto error;[m
[31m-    }[m
[31m-[m
[31m-    sk_X509_free(chain);[m
[31m-    X509_free(cert);[m
[31m-    X509_free(issuer);[m
[31m-    BIO_free(bio);[m
[31m-    OCSP_CERTID_free(id);[m
[31m-    OCSP_BASICRESP_free(basic);[m
[31m-    OCSP_RESPONSE_free(ocsp);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-error:[m
[31m-[m
[31m-    if (chain) {[m
[31m-        sk_X509_free(chain);[m
[31m-    }[m
[31m-[m
[31m-    if (id) {[m
[31m-        OCSP_CERTID_free(id);[m
[31m-    }[m
[31m-[m
[31m-    if (basic) {[m
[31m-        OCSP_BASICRESP_free(basic);[m
[31m-    }[m
[31m-[m
[31m-    if (ocsp) {[m
[31m-        OCSP_RESPONSE_free(ocsp);[m
[31m-    }[m
[31m-[m
[31m-    if (cert) {[m
[31m-        X509_free(cert);[m
[31m-    }[m
[31m-[m
[31m-    if (issuer) {[m
[31m-        X509_free(issuer);[m
[31m-    }[m
[31m-[m
[31m-    if (bio) {[m
[31m-        BIO_free(bio);[m
[31m-    }[m
[31m-[m
[31m-    ERR_clear_error();[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#endif  /* NGX_HTTP_LUA_USE_OCSP */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifdef NGX_HTTP_LUA_USE_OCSP[m
[31m-static int[m
[31m-ngx_http_lua_ssl_empty_status_callback(ngx_ssl_conn_t *ssl_conn, void *data)[m
[31m-{[m
[31m-    return SSL_TLSEXT_ERR_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_ssl_set_ocsp_status_resp(ngx_http_request_t *r,[m
[31m-    const u_char *resp, size_t resp_len, char **err)[m
[31m-{[m
[31m-#ifndef NGX_HTTP_LUA_USE_OCSP[m
[31m-[m
[31m-    *err = "no OCSP support";[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    u_char                  *p;[m
[31m-    SSL_CTX                 *ctx;[m
[31m-    ngx_ssl_conn_t          *ssl_conn;[m
[31m-[m
[31m-    if (r->connection == NULL || r->connection->ssl == NULL) {[m
[31m-        *err = "bad request";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ssl_conn = r->connection->ssl->connection;[m
[31m-    if (ssl_conn == NULL) {[m
[31m-        *err = "bad ssl conn";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ssl_conn->tlsext_status_type == -1) {[m
[31m-        dd("no ocsp status req from client");[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    /* we have to register an empty status callback here otherwise[m
[31m-     * OpenSSL won't send the response staple. */[m
[31m-[m
[31m-    ctx = SSL_get_SSL_CTX(ssl_conn);[m
[31m-    SSL_CTX_set_tlsext_status_cb(ctx,[m
[31m-                                 ngx_http_lua_ssl_empty_status_callback);[m
[31m-[m
[31m-    p = OPENSSL_malloc(resp_len);[m
[31m-    if (p == NULL) {[m
[31m-        *err = "OPENSSL_malloc() failed";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(p, resp, resp_len);[m
[31m-[m
[31m-    dd("set ocsp resp: resp_len=%d", (int) resp_len);[m
[31m-    (void) SSL_set_tlsext_status_ocsp_resp(ssl_conn, p, resp_len);[m
[31m-    ssl_conn->tlsext_status_expected = 1;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-#endif  /* NGX_HTTP_LUA_USE_OCSP */[m
[31m-}[m
[31m-[m
[31m-#endif  /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-#endif  /* NGX_HTTP_SSL */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_string.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_string.c[m
[1mdeleted file mode 100644[m
[1mindex 241b969..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_string.c[m
[1m+++ /dev/null[m
[36m@@ -1,766 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_args.h"[m
[31m-#include "ngx_crc32.h"[m
[31m-[m
[31m-#if NGX_HAVE_SHA1[m
[31m-#include "ngx_sha1.h"[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_md5.h"[m
[31m-[m
[31m-#if (NGX_OPENSSL)[m
[31m-#include <openssl/evp.h>[m
[31m-#include <openssl/hmac.h>[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef SHA_DIGEST_LENGTH[m
[31m-#define SHA_DIGEST_LENGTH 20[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static uintptr_t ngx_http_lua_ngx_escape_sql_str(u_char *dst, u_char *src,[m
[31m-        size_t size);[m
[31m-static int ngx_http_lua_ngx_escape_uri(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_unescape_uri(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_quote_sql_str(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_md5(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_md5_bin(lua_State *L);[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-static int ngx_http_lua_ngx_sha1_bin(lua_State *L);[m
[31m-#endif[m
[31m-[m
[31m-static int ngx_http_lua_ngx_decode_base64(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_encode_base64(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_crc32_short(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_crc32_long(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_encode_args(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_decode_args(lua_State *L);[m
[31m-#if (NGX_OPENSSL)[m
[31m-static int ngx_http_lua_ngx_hmac_sha1(lua_State *L);[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_string_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_escape_uri);[m
[31m-    lua_setfield(L, -2, "escape_uri");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_unescape_uri);[m
[31m-    lua_setfield(L, -2, "unescape_uri");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_encode_args);[m
[31m-    lua_setfield(L, -2, "encode_args");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_decode_args);[m
[31m-    lua_setfield(L, -2, "decode_args");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_quote_sql_str);[m
[31m-    lua_setfield(L, -2, "quote_sql_str");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_decode_base64);[m
[31m-    lua_setfield(L, -2, "decode_base64");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_encode_base64);[m
[31m-    lua_setfield(L, -2, "encode_base64");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_md5_bin);[m
[31m-    lua_setfield(L, -2, "md5_bin");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_md5);[m
[31m-    lua_setfield(L, -2, "md5");[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_sha1_bin);[m
[31m-    lua_setfield(L, -2, "sha1_bin");[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_crc32_short);[m
[31m-    lua_setfield(L, -2, "crc32_short");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_crc32_long);[m
[31m-    lua_setfield(L, -2, "crc32_long");[m
[31m-[m
[31m-#if (NGX_OPENSSL)[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_hmac_sha1);[m
[31m-    lua_setfield(L, -2, "hmac_sha1");[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_escape_uri(lua_State *L)[m
[31m-{[m
[31m-    size_t                   len, dlen;[m
[31m-    uintptr_t                escape;[m
[31m-    u_char                  *src, *dst;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        lua_pushliteral(L, "");[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    src = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    escape = 2 * ngx_http_lua_escape_uri(NULL, src, len, NGX_ESCAPE_URI);[m
[31m-[m
[31m-    if (escape) {[m
[31m-        dlen = escape + len;[m
[31m-        dst = lua_newuserdata(L, dlen);[m
[31m-        ngx_http_lua_escape_uri(dst, src, len, NGX_ESCAPE_URI);[m
[31m-        lua_pushlstring(L, (char *) dst, dlen);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_unescape_uri(lua_State *L)[m
[31m-{[m
[31m-    size_t                   len, dlen;[m
[31m-    u_char                  *p;[m
[31m-    u_char                  *src, *dst;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        lua_pushliteral(L, "");[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    src = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    /* the unescaped string can only be smaller */[m
[31m-    dlen = len;[m
[31m-[m
[31m-    p = lua_newuserdata(L, dlen);[m
[31m-[m
[31m-    dst = p;[m
[31m-[m
[31m-    ngx_http_lua_unescape_uri(&dst, &src, len, NGX_UNESCAPE_URI_COMPONENT);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) p, dst - p);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_quote_sql_str(lua_State *L)[m
[31m-{[m
[31m-    size_t                   len, dlen, escape;[m
[31m-    u_char                  *p;[m
[31m-    u_char                  *src, *dst;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    src = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        dst = (u_char *) "''";[m
[31m-        dlen = sizeof("''") - 1;[m
[31m-        lua_pushlstring(L, (char *) dst, dlen);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    escape = ngx_http_lua_ngx_escape_sql_str(NULL, src, len);[m
[31m-[m
[31m-    dlen = sizeof("''") - 1 + len + escape;[m
[31m-[m
[31m-    p = lua_newuserdata(L, dlen);[m
[31m-[m
[31m-    dst = p;[m
[31m-[m
[31m-    *p++ = '\'';[m
[31m-[m
[31m-    if (escape == 0) {[m
[31m-        p = ngx_copy(p, src, len);[m
[31m-[m
[31m-    } else {[m
[31m-        p = (u_char *) ngx_http_lua_ngx_escape_sql_str(p, src, len);[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '\'';[m
[31m-[m
[31m-    if (p != dst + dlen) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) dst, p - dst);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static uintptr_t[m
[31m-ngx_http_lua_ngx_escape_sql_str(u_char *dst, u_char *src, size_t size)[m
[31m-{[m
[31m-    ngx_uint_t               n;[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-        /* find the number of chars to be escaped */[m
[31m-        n = 0;[m
[31m-        while (size) {[m
[31m-            /* the highest bit of all the UTF-8 chars[m
[31m-             * is always 1 */[m
[31m-            if ((*src & 0x80) == 0) {[m
[31m-                switch (*src) {[m
[31m-                    case '\0':[m
[31m-                    case '\b':[m
[31m-                    case '\n':[m
[31m-                    case '\r':[m
[31m-                    case '\t':[m
[31m-                    case 26:  /* \Z */[m
[31m-                    case '\\':[m
[31m-                    case '\'':[m
[31m-                    case '"':[m
[31m-                        n++;[m
[31m-                        break;[m
[31m-                    default:[m
[31m-                        break;[m
[31m-                }[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if ((*src & 0x80) == 0) {[m
[31m-            switch (*src) {[m
[31m-                case '\0':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '0';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\b':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'b';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\n':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'n';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\r':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'r';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\t':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 't';[m
[31m-                    break;[m
[31m-[m
[31m-                case 26:[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = 'Z';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\\':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '\\';[m
[31m-                    break;[m
[31m-[m
[31m-                case '\'':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '\'';[m
[31m-                    break;[m
[31m-[m
[31m-                case '"':[m
[31m-                    *dst++ = '\\';[m
[31m-                    *dst++ = '"';[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    *dst++ = *src;[m
[31m-                    break;[m
[31m-            }[m
[31m-        } else {[m
[31m-            *dst++ = *src;[m
[31m-        }[m
[31m-        src++;[m
[31m-        size--;[m
[31m-    } /* while (size) */[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_md5(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *src;[m
[31m-    size_t                   slen;[m
[31m-[m
[31m-    ngx_md5_t                md5;[m
[31m-    u_char                   md5_buf[MD5_DIGEST_LENGTH];[m
[31m-    u_char                   hex_buf[2 * sizeof(md5_buf)];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        src = (u_char *) "";[m
[31m-        slen = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        src = (u_char *) luaL_checklstring(L, 1, &slen);[m
[31m-    }[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, src, slen);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    ngx_hex_dump(hex_buf, md5_buf, sizeof(md5_buf));[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) hex_buf, sizeof(hex_buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_md5_bin(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *src;[m
[31m-    size_t                   slen;[m
[31m-[m
[31m-    ngx_md5_t                md5;[m
[31m-    u_char                   md5_buf[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        src     = (u_char *) "";[m
[31m-        slen    = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        src = (u_char *) luaL_checklstring(L, 1, &slen);[m
[31m-    }[m
[31m-[m
[31m-    dd("slen: %d", (int) slen);[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, src, slen);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) md5_buf, sizeof(md5_buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_HAVE_SHA1)[m
[31m-static int[m
[31m-ngx_http_lua_ngx_sha1_bin(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *src;[m
[31m-    size_t                   slen;[m
[31m-[m
[31m-    ngx_sha1_t               sha;[m
[31m-    u_char                   sha_buf[SHA_DIGEST_LENGTH];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        src     = (u_char *) "";[m
[31m-        slen    = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        src = (u_char *) luaL_checklstring(L, 1, &slen);[m
[31m-    }[m
[31m-[m
[31m-    dd("slen: %d", (int) slen);[m
[31m-[m
[31m-    ngx_sha1_init(&sha);[m
[31m-    ngx_sha1_update(&sha, src, slen);[m
[31m-    ngx_sha1_final(sha_buf, &sha);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) sha_buf, sizeof(sha_buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_decode_base64(lua_State *L)[m
[31m-{[m
[31m-    ngx_str_t                p, src;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_type(L, 1) != LUA_TSTRING) {[m
[31m-        return luaL_error(L, "string argument only");[m
[31m-    }[m
[31m-[m
[31m-    src.data = (u_char *) luaL_checklstring(L, 1, &src.len);[m
[31m-[m
[31m-    p.len = ngx_base64_decoded_length(src.len);[m
[31m-[m
[31m-    p.data = lua_newuserdata(L, p.len);[m
[31m-[m
[31m-    if (ngx_decode_base64(&p, &src) == NGX_OK) {[m
[31m-        lua_pushlstring(L, (char *) p.data, p.len);[m
[31m-[m
[31m-    } else {[m
[31m-        lua_pushnil(L);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_encode_base64(ngx_str_t *dst, ngx_str_t *src, int no_padding)[m
[31m-{[m
[31m-    u_char         *d, *s;[m
[31m-    size_t          len;[m
[31m-    static u_char   basis[] =[m
[31m-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";[m
[31m-[m
[31m-    len = src->len;[m
[31m-    s = src->data;[m
[31m-    d = dst->data;[m
[31m-[m
[31m-    while (len > 2) {[m
[31m-        *d++ = basis[(s[0] >> 2) & 0x3f];[m
[31m-        *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];[m
[31m-        *d++ = basis[((s[1] & 0x0f) << 2) | (s[2] >> 6)];[m
[31m-        *d++ = basis[s[2] & 0x3f];[m
[31m-[m
[31m-        s += 3;[m
[31m-        len -= 3;[m
[31m-    }[m
[31m-[m
[31m-    if (len) {[m
[31m-        *d++ = basis[(s[0] >> 2) & 0x3f];[m
[31m-[m
[31m-        if (len == 1) {[m
[31m-            *d++ = basis[(s[0] & 3) << 4];[m
[31m-            if (!no_padding) {[m
[31m-                *d++ = '=';[m
[31m-            }[m
[31m-[m
[31m-        } else {[m
[31m-            *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];[m
[31m-            *d++ = basis[(s[1] & 0x0f) << 2];[m
[31m-        }[m
[31m-[m
[31m-        if (!no_padding) {[m
[31m-            *d++ = '=';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dst->len = d - dst->data;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static size_t[m
[31m-ngx_http_lua_base64_encoded_length(size_t n, int no_padding)[m
[31m-{[m
[31m-    return no_padding ? (n * 8 + 5) / 6 : ngx_base64_encoded_length(n);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_encode_base64(lua_State *L)[m
[31m-{[m
[31m-    int                      n;[m
[31m-    int                      no_padding = 0;[m
[31m-    ngx_str_t                p, src;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting one or two arguments");[m
[31m-    }[m
[31m-[m
[31m-    if (lua_isnil(L, 1)) {[m
[31m-        src.data = (u_char *) "";[m
[31m-        src.len = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        src.data = (u_char *) luaL_checklstring(L, 1, &src.len);[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        /* get the 2nd optional argument */[m
[31m-        luaL_checktype(L, 2, LUA_TBOOLEAN);[m
[31m-        no_padding = lua_toboolean(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    p.len = ngx_http_lua_base64_encoded_length(src.len, no_padding);[m
[31m-[m
[31m-    p.data = lua_newuserdata(L, p.len);[m
[31m-[m
[31m-    ngx_http_lua_encode_base64(&p, &src, no_padding);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) p.data, p.len);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_crc32_short(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *p;[m
[31m-    size_t                   len;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) ngx_crc32_short(p, len));[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_crc32_long(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *p;[m
[31m-    size_t                   len;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) ngx_crc32_long(p, len));[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_encode_args(lua_State *L)[m
[31m-{[m
[31m-    ngx_str_t                    args;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting 1 argument but seen %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-    ngx_http_lua_process_args_option(NULL, L, 1, &args);[m
[31m-    lua_pushlstring(L, (char *) args.data, args.len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_decode_args(lua_State *L)[m
[31m-{[m
[31m-    u_char                      *buf;[m
[31m-    u_char                      *tmp;[m
[31m-    size_t                       len = 0;[m
[31m-    int                          n;[m
[31m-    int                          max;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    buf = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-        max = luaL_checkint(L, 2);[m
[31m-        lua_pop(L, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        max = NGX_HTTP_LUA_MAX_ARGS;[m
[31m-    }[m
[31m-[m
[31m-    tmp = lua_newuserdata(L, len);[m
[31m-    ngx_memcpy(tmp, buf, len);[m
[31m-[m
[31m-    lua_createtable(L, 0, 4);[m
[31m-[m
[31m-    return ngx_http_lua_parse_args(L, tmp, tmp + len, max);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#if (NGX_OPENSSL)[m
[31m-static int[m
[31m-ngx_http_lua_ngx_hmac_sha1(lua_State *L)[m
[31m-{[m
[31m-    u_char                  *sec, *sts;[m
[31m-    size_t                   lsec, lsts;[m
[31m-    unsigned int             md_len;[m
[31m-    unsigned char            md[EVP_MAX_MD_SIZE];[m
[31m-    const EVP_MD            *evp_md;[m
[31m-[m
[31m-    if (lua_gettop(L) != 2) {[m
[31m-        return luaL_error(L, "expecting 2 arguments, but got %d",[m
[31m-                          lua_gettop(L));[m
[31m-    }[m
[31m-[m
[31m-    sec = (u_char *) luaL_checklstring(L, 1, &lsec);[m
[31m-    sts = (u_char *) luaL_checklstring(L, 2, &lsts);[m
[31m-[m
[31m-    evp_md = EVP_sha1();[m
[31m-[m
[31m-    HMAC(evp_md, sec, lsec, sts, lsts, md, &md_len);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) md, md_len);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-void[m
[31m-ngx_http_lua_ffi_md5_bin(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-    ngx_md5_t     md5;[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, src, len);[m
[31m-    ngx_md5_final(dst, &md5);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_md5(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-    ngx_md5_t           md5;[m
[31m-    u_char              md5_buf[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, src, len);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    ngx_hex_dump(dst, md5_buf, sizeof(md5_buf));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_sha1_bin(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-#if NGX_HAVE_SHA1[m
[31m-    ngx_sha1_t               sha;[m
[31m-[m
[31m-    ngx_sha1_init(&sha);[m
[31m-    ngx_sha1_update(&sha, src, len);[m
[31m-    ngx_sha1_final(dst, &sha);[m
[31m-[m
[31m-    return 1;[m
[31m-#else[m
[31m-    return 0;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_encode_base64(const u_char *src, size_t slen, u_char *dst,[m
[31m-    int no_padding)[m
[31m-{[m
[31m-    ngx_str_t      in, out;[m
[31m-[m
[31m-    in.data = (u_char *) src;[m
[31m-    in.len = slen;[m
[31m-[m
[31m-    out.data = dst;[m
[31m-[m
[31m-    ngx_http_lua_encode_base64(&out, &in, no_padding);[m
[31m-[m
[31m-    return out.len;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_decode_base64(const u_char *src, size_t slen, u_char *dst,[m
[31m-    size_t *dlen)[m
[31m-{[m
[31m-    ngx_int_t      rc;[m
[31m-    ngx_str_t      in, out;[m
[31m-[m
[31m-    in.data = (u_char *) src;[m
[31m-    in.len = slen;[m
[31m-[m
[31m-    out.data = dst;[m
[31m-[m
[31m-    rc = ngx_decode_base64(&out, &in);[m
[31m-[m
[31m-    *dlen = out.len;[m
[31m-[m
[31m-    return rc == NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_unescape_uri(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-    u_char      *p = dst;[m
[31m-[m
[31m-    ngx_http_lua_unescape_uri(&p, (u_char **) &src, len,[m
[31m-                              NGX_UNESCAPE_URI_COMPONENT);[m
[31m-    return p - dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-size_t[m
[31m-ngx_http_lua_ffi_uri_escaped_length(const u_char *src, size_t len)[m
[31m-{[m
[31m-    return len + 2 * ngx_http_lua_escape_uri(NULL, (u_char *) src, len,[m
[31m-                                             NGX_ESCAPE_URI);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_ffi_escape_uri(const u_char *src, size_t len, u_char *dst)[m
[31m-{[m
[31m-    ngx_http_lua_escape_uri(dst, (u_char *) src, len, NGX_ESCAPE_URI);[m
[31m-}[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_string.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_string.h[m
[1mdeleted file mode 100644[m
[1mindex b54cbdf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_string.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_STRING_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_STRING_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_string_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_STRING_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.c[m
[1mdeleted file mode 100644[m
[1mindex 4f8a753..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.c[m
[1m+++ /dev/null[m
[36m@@ -1,1774 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_subrequest.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_ctx.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_headers_in.h"[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-#include "ngx_http_probe.h"[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define NGX_HTTP_LUA_SHARE_ALL_VARS     0x01[m
[31m-#define NGX_HTTP_LUA_COPY_ALL_VARS      0x02[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_method_name(m) { sizeof(m) - 1, (u_char *) m " " }[m
[31m-[m
[31m-ngx_str_t  ngx_http_lua_get_method = ngx_http_lua_method_name("GET");[m
[31m-ngx_str_t  ngx_http_lua_put_method = ngx_http_lua_method_name("PUT");[m
[31m-ngx_str_t  ngx_http_lua_post_method = ngx_http_lua_method_name("POST");[m
[31m-ngx_str_t  ngx_http_lua_head_method = ngx_http_lua_method_name("HEAD");[m
[31m-ngx_str_t  ngx_http_lua_delete_method =[m
[31m-        ngx_http_lua_method_name("DELETE");[m
[31m-ngx_str_t  ngx_http_lua_options_method =[m
[31m-        ngx_http_lua_method_name("OPTIONS");[m
[31m-ngx_str_t  ngx_http_lua_copy_method = ngx_http_lua_method_name("COPY");[m
[31m-ngx_str_t  ngx_http_lua_move_method = ngx_http_lua_method_name("MOVE");[m
[31m-ngx_str_t  ngx_http_lua_lock_method = ngx_http_lua_method_name("LOCK");[m
[31m-ngx_str_t  ngx_http_lua_mkcol_method =[m
[31m-        ngx_http_lua_method_name("MKCOL");[m
[31m-ngx_str_t  ngx_http_lua_propfind_method =[m
[31m-        ngx_http_lua_method_name("PROPFIND");[m
[31m-ngx_str_t  ngx_http_lua_proppatch_method =[m
[31m-        ngx_http_lua_method_name("PROPPATCH");[m
[31m-ngx_str_t  ngx_http_lua_unlock_method =[m
[31m-        ngx_http_lua_method_name("UNLOCK");[m
[31m-ngx_str_t  ngx_http_lua_patch_method =[m
[31m-        ngx_http_lua_method_name("PATCH");[m
[31m-ngx_str_t  ngx_http_lua_trace_method =[m
[31m-        ngx_http_lua_method_name("TRACE");[m
[31m-[m
[31m-[m
[31m-static ngx_str_t  ngx_http_lua_content_length_header_key =[m
[31m-    ngx_string("Content-Length");[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_set_content_length_header(ngx_http_request_t *r,[m
[31m-    off_t len);[m
[31m-static ngx_int_t ngx_http_lua_adjust_subrequest(ngx_http_request_t *sr,[m
[31m-    ngx_uint_t method, int forward_body,[m
[31m-    ngx_http_request_body_t *body, unsigned vars_action,[m
[31m-    ngx_array_t *extra_vars);[m
[31m-static int ngx_http_lua_ngx_location_capture(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_location_capture_multi(lua_State *L);[m
[31m-static void ngx_http_lua_process_vars_option(ngx_http_request_t *r,[m
[31m-    lua_State *L, int table, ngx_array_t **varsp);[m
[31m-static ngx_int_t ngx_http_lua_subrequest_add_extra_vars(ngx_http_request_t *r,[m
[31m-    ngx_array_t *extra_vars);[m
[31m-static ngx_int_t ngx_http_lua_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,[m
[31m-    ngx_http_post_subrequest_t *ps, ngx_uint_t flags);[m
[31m-static ngx_int_t ngx_http_lua_subrequest_resume(ngx_http_request_t *r);[m
[31m-static void ngx_http_lua_handle_subreq_responses(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static void ngx_http_lua_cancel_subreq(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_post_request_to_head(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_copy_in_file_request_body(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_copy_request_headers(ngx_http_request_t *sr,[m
[31m-    ngx_http_request_t *r);[m
[31m-[m
[31m-[m
[31m-/* ngx.location.capture is just a thin wrapper around[m
[31m- * ngx.location.capture_multi */[m
[31m-static int[m
[31m-ngx_http_lua_ngx_location_capture(lua_State *L)[m
[31m-{[m
[31m-    int                 n;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting one or two arguments");[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, n, 0); /* uri opts? table  */[m
[31m-    lua_insert(L, 1); /* table uri opts? */[m
[31m-    if (n == 1) { /* table uri */[m
[31m-        lua_rawseti(L, 1, 1); /* table */[m
[31m-[m
[31m-    } else { /* table uri opts */[m
[31m-        lua_rawseti(L, 1, 2); /* table uri */[m
[31m-        lua_rawseti(L, 1, 1); /* table */[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 1, 0); /* table table' */[m
[31m-    lua_insert(L, 1);   /* table' table */[m
[31m-    lua_rawseti(L, 1, 1); /* table' */[m
[31m-[m
[31m-    return ngx_http_lua_ngx_location_capture_multi(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_location_capture_multi(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t              *r;[m
[31m-    ngx_http_request_t              *sr = NULL; /* subrequest object */[m
[31m-    ngx_http_post_subrequest_t      *psr;[m
[31m-    ngx_http_lua_ctx_t              *sr_ctx;[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-    ngx_array_t                     *extra_vars;[m
[31m-    ngx_str_t                        uri;[m
[31m-    ngx_str_t                        args;[m
[31m-    ngx_str_t                        extra_args;[m
[31m-    ngx_uint_t                       flags;[m
[31m-    u_char                          *p;[m
[31m-    u_char                          *q;[m
[31m-    size_t                           len;[m
[31m-    size_t                           nargs;[m
[31m-    int                              rc;[m
[31m-    int                              n;[m
[31m-    int                              always_forward_body = 0;[m
[31m-    ngx_uint_t                       method;[m
[31m-    ngx_http_request_body_t         *body;[m
[31m-    int                              type;[m
[31m-    ngx_buf_t                       *b;[m
[31m-    unsigned                         vars_action;[m
[31m-    ngx_uint_t                       nsubreqs;[m
[31m-    ngx_uint_t                       index;[m
[31m-    size_t                           sr_statuses_len;[m
[31m-    size_t                           sr_headers_len;[m
[31m-    size_t                           sr_bodies_len;[m
[31m-    size_t                           sr_flags_len;[m
[31m-    size_t                           ofs1, ofs2;[m
[31m-    unsigned                         custom_ctx;[m
[31m-    ngx_http_lua_co_ctx_t           *coctx;[m
[31m-[m
[31m-    ngx_http_lua_post_subrequest_data_t      *psr_data;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-    if (n != 1) {[m
[31m-        return luaL_error(L, "only one argument is expected, but got %d", n);[m
[31m-    }[m
[31m-[m
[31m-    luaL_checktype(L, 1, LUA_TTABLE);[m
[31m-[m
[31m-    nsubreqs = lua_objlen(L, 1);[m
[31m-    if (nsubreqs == 0) {[m
[31m-        return luaL_error(L, "at least one subrequest should be specified");[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    if (coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua location capture, uri:\"%V\" c:%ud", &r->uri,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    sr_statuses_len = nsubreqs * sizeof(ngx_int_t);[m
[31m-    sr_headers_len  = nsubreqs * sizeof(ngx_http_headers_out_t *);[m
[31m-    sr_bodies_len   = nsubreqs * sizeof(ngx_str_t);[m
[31m-    sr_flags_len    = nsubreqs * sizeof(uint8_t);[m
[31m-[m
[31m-    p = ngx_pcalloc(r->pool, sr_statuses_len + sr_headers_len +[m
[31m-                    sr_bodies_len + sr_flags_len);[m
[31m-[m
[31m-    if (p == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    coctx->sr_statuses = (void *) p;[m
[31m-    p += sr_statuses_len;[m
[31m-[m
[31m-    coctx->sr_headers = (void *) p;[m
[31m-    p += sr_headers_len;[m
[31m-[m
[31m-    coctx->sr_bodies = (void *) p;[m
[31m-    p += sr_bodies_len;[m
[31m-[m
[31m-    coctx->sr_flags = (void *) p;[m
[31m-[m
[31m-    coctx->nsubreqs = nsubreqs;[m
[31m-[m
[31m-    coctx->pending_subreqs = 0;[m
[31m-[m
[31m-    extra_vars = NULL;[m
[31m-[m
[31m-    for (index = 0; index < nsubreqs; index++) {[m
[31m-        coctx->pending_subreqs++;[m
[31m-[m
[31m-        lua_rawgeti(L, 1, index + 1);[m
[31m-        if (lua_isnil(L, -1)) {[m
[31m-            return luaL_error(L, "only array-like tables are allowed");[m
[31m-        }[m
[31m-[m
[31m-        dd("queries query: top %d", lua_gettop(L));[m
[31m-[m
[31m-        if (lua_type(L, -1) != LUA_TTABLE) {[m
[31m-            return luaL_error(L, "the query argument %d is not a table, "[m
[31m-                              "but a %s",[m
[31m-                              index, lua_typename(L, lua_type(L, -1)));[m
[31m-        }[m
[31m-[m
[31m-        nargs = lua_objlen(L, -1);[m
[31m-[m
[31m-        if (nargs != 1 && nargs != 2) {[m
[31m-            return luaL_error(L, "query argument %d expecting one or "[m
[31m-                              "two arguments", index);[m
[31m-        }[m
[31m-[m
[31m-        lua_rawgeti(L, 2, 1); /* queries query uri */[m
[31m-[m
[31m-        dd("queries query uri: %d", lua_gettop(L));[m
[31m-[m
[31m-        dd("first arg in first query: %s", lua_typename(L, lua_type(L, -1)));[m
[31m-[m
[31m-        body = NULL;[m
[31m-[m
[31m-        ngx_str_null(&extra_args);[m
[31m-[m
[31m-        if (extra_vars != NULL) {[m
[31m-            /* flush out existing elements in the array */[m
[31m-            extra_vars->nelts = 0;[m
[31m-        }[m
[31m-[m
[31m-        vars_action = 0;[m
[31m-[m
[31m-        custom_ctx = 0;[m
[31m-[m
[31m-        if (nargs == 2) {[m
[31m-            /* check out the options table */[m
[31m-[m
[31m-            lua_rawgeti(L, 2, 2); /* queries query uri opts */[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            if (lua_type(L, 4) != LUA_TTABLE) {[m
[31m-                return luaL_error(L, "expecting table as the 2nd argument for "[m
[31m-                                  "subrequest %d, but got %s", index,[m
[31m-                                  luaL_typename(L, 4));[m
[31m-            }[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the args option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "args");[m
[31m-[m
[31m-            type = lua_type(L, -1);[m
[31m-[m
[31m-            switch (type) {[m
[31m-            case LUA_TTABLE:[m
[31m-                ngx_http_lua_process_args_option(r, L, -1, &extra_args);[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNUMBER:[m
[31m-            case LUA_TSTRING:[m
[31m-                extra_args.data = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-                extra_args.len = len;[m
[31m-[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "Bad args option value");[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the vars option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "vars");[m
[31m-[m
[31m-            switch (lua_type(L, -1)) {[m
[31m-            case LUA_TTABLE:[m
[31m-                ngx_http_lua_process_vars_option(r, L, -1, &extra_vars);[m
[31m-[m
[31m-                dd("post process vars top: %d", lua_gettop(L));[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "Bad vars option value");[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the share_all_vars option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "share_all_vars");[m
[31m-[m
[31m-            switch (lua_type(L, -1)) {[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    vars_action |= NGX_HTTP_LUA_SHARE_ALL_VARS;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "Bad share_all_vars option value");[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the copy_all_vars option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "copy_all_vars");[m
[31m-[m
[31m-            switch (lua_type(L, -1)) {[m
[31m-            case LUA_TNIL:[m
[31m-                /* do nothing */[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_TBOOLEAN:[m
[31m-                if (lua_toboolean(L, -1)) {[m
[31m-                    vars_action |= NGX_HTTP_LUA_COPY_ALL_VARS;[m
[31m-                }[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                return luaL_error(L, "Bad copy_all_vars option value");[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the "forward_body" option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "always_forward_body");[m
[31m-            always_forward_body = lua_toboolean(L, -1);[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("always foward body: %d", always_forward_body);[m
[31m-[m
[31m-            /* check the "method" option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "method");[m
[31m-[m
[31m-            type = lua_type(L, -1);[m
[31m-[m
[31m-            if (type == LUA_TNIL) {[m
[31m-                method = NGX_HTTP_GET;[m
[31m-[m
[31m-            } else {[m
[31m-                if (type != LUA_TNUMBER) {[m
[31m-                    return luaL_error(L, "Bad http request method");[m
[31m-                }[m
[31m-[m
[31m-                method = (ngx_uint_t) lua_tonumber(L, -1);[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1);[m
[31m-[m
[31m-            dd("queries query uri opts: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the "ctx" option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "ctx");[m
[31m-[m
[31m-            type = lua_type(L, -1);[m
[31m-[m
[31m-            if (type != LUA_TNIL) {[m
[31m-                if (type != LUA_TTABLE) {[m
[31m-                    return luaL_error(L, "Bad ctx option value type %s, "[m
[31m-                                      "expected a Lua table",[m
[31m-                                      lua_typename(L, type));[m
[31m-                }[m
[31m-[m
[31m-                custom_ctx = 1;[m
[31m-[m
[31m-            } else {[m
[31m-                lua_pop(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            dd("queries query uri opts ctx?: %d", lua_gettop(L));[m
[31m-[m
[31m-            /* check the "body" option */[m
[31m-[m
[31m-            lua_getfield(L, 4, "body");[m
[31m-[m
[31m-            type = lua_type(L, -1);[m
[31m-[m
[31m-            if (type != LUA_TNIL) {[m
[31m-                if (type != LUA_TSTRING && type != LUA_TNUMBER) {[m
[31m-                    return luaL_error(L, "Bad http request body");[m
[31m-                }[m
[31m-[m
[31m-                body = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-[m
[31m-                if (body == NULL) {[m
[31m-                    return luaL_error(L, "no memory");[m
[31m-                }[m
[31m-[m
[31m-                q = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-                dd("request body: [%.*s]", (int) len, q);[m
[31m-[m
[31m-                if (len) {[m
[31m-                    b = ngx_create_temp_buf(r->pool, len);[m
[31m-                    if (b == NULL) {[m
[31m-                        return luaL_error(L, "no memory");[m
[31m-                    }[m
[31m-[m
[31m-                    b->last = ngx_copy(b->last, q, len);[m
[31m-[m
[31m-                    body->bufs = ngx_alloc_chain_link(r->pool);[m
[31m-                    if (body->bufs == NULL) {[m
[31m-                        return luaL_error(L, "no memory");[m
[31m-                    }[m
[31m-[m
[31m-                    body->bufs->buf = b;[m
[31m-                    body->bufs->next = NULL;[m
[31m-[m
[31m-                    body->buf = b;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            lua_pop(L, 1); /* pop the body */[m
[31m-[m
[31m-            /* stack: queries query uri opts ctx? */[m
[31m-[m
[31m-            lua_remove(L, 4);[m
[31m-[m
[31m-            /* stack: queries query uri ctx? */[m
[31m-[m
[31m-            dd("queries query uri ctx?: %d", lua_gettop(L));[m
[31m-[m
[31m-        } else {[m
[31m-            method = NGX_HTTP_GET;[m
[31m-        }[m
[31m-[m
[31m-        /* stack: queries query uri ctx? */[m
[31m-[m
[31m-        p = (u_char *) luaL_checklstring(L, 3, &len);[m
[31m-[m
[31m-        uri.data = ngx_palloc(r->pool, len);[m
[31m-        if (uri.data == NULL) {[m
[31m-            return luaL_error(L, "memory allocation error");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(uri.data, p, len);[m
[31m-[m
[31m-        uri.len = len;[m
[31m-[m
[31m-        ngx_str_null(&args);[m
[31m-[m
[31m-        flags = 0;[m
[31m-[m
[31m-        rc = ngx_http_parse_unsafe_uri(r, &uri, &args, &flags);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            dd("rc = %d", (int) rc);[m
[31m-[m
[31m-            return luaL_error(L, "unsafe uri in argument #1: %s", p);[m
[31m-        }[m
[31m-[m
[31m-        if (args.len == 0) {[m
[31m-            if (extra_args.len) {[m
[31m-                p = ngx_palloc(r->pool, extra_args.len);[m
[31m-                if (p == NULL) {[m
[31m-                    return luaL_error(L, "no memory");[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(p, extra_args.data, extra_args.len);[m
[31m-[m
[31m-                args.data = p;[m
[31m-                args.len = extra_args.len;[m
[31m-            }[m
[31m-[m
[31m-        } else if (extra_args.len) {[m
[31m-            /* concatenate the two parts of args together */[m
[31m-            len = args.len + (sizeof("&") - 1) + extra_args.len;[m
[31m-[m
[31m-            p = ngx_palloc(r->pool, len);[m
[31m-            if (p == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-[m
[31m-            q = ngx_copy(p, args.data, args.len);[m
[31m-            *q++ = '&';[m
[31m-            ngx_memcpy(q, extra_args.data, extra_args.len);[m
[31m-[m
[31m-            args.data = p;[m
[31m-            args.len = len;[m
[31m-        }[m
[31m-[m
[31m-        ofs1 = ngx_align(sizeof(ngx_http_post_subrequest_t), sizeof(void *));[m
[31m-        ofs2 = ngx_align(sizeof(ngx_http_lua_ctx_t), sizeof(void *));[m
[31m-[m
[31m-        p = ngx_palloc(r->pool, ofs1 + ofs2[m
[31m-                       + sizeof(ngx_http_lua_post_subrequest_data_t));[m
[31m-        if (p == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        psr = (ngx_http_post_subrequest_t *) p;[m
[31m-[m
[31m-        p += ofs1;[m
[31m-[m
[31m-        sr_ctx = (ngx_http_lua_ctx_t *) p;[m
[31m-[m
[31m-        ngx_http_lua_assert((void *) sr_ctx == ngx_align_ptr(sr_ctx,[m
[31m-                                                             sizeof(void *)));[m
[31m-[m
[31m-        p += ofs2;[m
[31m-[m
[31m-        psr_data = (ngx_http_lua_post_subrequest_data_t *) p;[m
[31m-[m
[31m-        ngx_http_lua_assert((void *) psr_data == ngx_align_ptr(psr_data,[m
[31m-                                                               sizeof(void *)));[m
[31m-[m
[31m-        ngx_memzero(sr_ctx, sizeof(ngx_http_lua_ctx_t));[m
[31m-[m
[31m-        /* set by ngx_memzero:[m
[31m-         *      sr_ctx->run_post_subrequest = 0[m
[31m-         *      sr_ctx->free = NULL[m
[31m-         *      sr_ctx->body = NULL[m
[31m-         */[m
[31m-[m
[31m-        psr_data->ctx = sr_ctx;[m
[31m-        psr_data->pr_co_ctx = coctx;[m
[31m-[m
[31m-        psr->handler = ngx_http_lua_post_subrequest;[m
[31m-        psr->data = psr_data;[m
[31m-[m
[31m-        rc = ngx_http_lua_subrequest(r, &uri, &args, &sr, psr, 0);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return luaL_error(L, "failed to issue subrequest: %d", (int) rc);[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_init_ctx(sr, sr_ctx);[m
[31m-[m
[31m-        sr_ctx->capture = 1;[m
[31m-        sr_ctx->index = index;[m
[31m-        sr_ctx->last_body = &sr_ctx->body;[m
[31m-        sr_ctx->vm_state = ctx->vm_state;[m
[31m-[m
[31m-        ngx_http_set_ctx(sr, sr_ctx, ngx_http_lua_module);[m
[31m-[m
[31m-        rc = ngx_http_lua_adjust_subrequest(sr, method, always_forward_body,[m
[31m-                                            body, vars_action, extra_vars);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            ngx_http_lua_cancel_subreq(sr);[m
[31m-            return luaL_error(L, "failed to adjust the subrequest: %d",[m
[31m-                              (int) rc);[m
[31m-        }[m
[31m-[m
[31m-        dd("queries query uri opts ctx? %d", lua_gettop(L));[m
[31m-[m
[31m-        /* stack: queries query uri ctx? */[m
[31m-[m
[31m-        if (custom_ctx) {[m
[31m-            ngx_http_lua_ngx_set_ctx_helper(L, sr, sr_ctx, -1);[m
[31m-            lua_pop(L, 3);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pop(L, 2);[m
[31m-        }[m
[31m-[m
[31m-        /* stack: queries */[m
[31m-    }[m
[31m-[m
[31m-    if (extra_vars) {[m
[31m-        ngx_array_destroy(extra_vars);[m
[31m-    }[m
[31m-[m
[31m-    ctx->no_abort = 1;[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_adjust_subrequest(ngx_http_request_t *sr, ngx_uint_t method,[m
[31m-    int always_forward_body, ngx_http_request_body_t *body,[m
[31m-    unsigned vars_action, ngx_array_t *extra_vars)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-    size_t                       size;[m
[31m-[m
[31m-    r = sr->parent;[m
[31m-[m
[31m-    sr->header_in = r->header_in;[m
[31m-[m
[31m-    if (body) {[m
[31m-        sr->request_body = body;[m
[31m-[m
[31m-        rc = ngx_http_lua_set_content_length_header(sr,[m
[31m-                                                    body->buf[m
[31m-                                                    ? ngx_buf_size(body->buf)[m
[31m-                                                    : 0);[m
[31m-[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else if (!always_forward_body[m
[31m-               && method != NGX_HTTP_PUT[m
[31m-               && method != NGX_HTTP_POST[m
[31m-               && r->headers_in.content_length_n > 0)[m
[31m-    {[m
[31m-        rc = ngx_http_lua_set_content_length_header(sr, 0);[m
[31m-        if (rc != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-#if 1[m
[31m-        sr->request_body = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    } else {[m
[31m-        if (ngx_http_lua_copy_request_headers(sr, r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (sr->request_body) {[m
[31m-[m
[31m-            /* deep-copy the request body */[m
[31m-[m
[31m-            if (sr->request_body->temp_file) {[m
[31m-                if (ngx_http_lua_copy_in_file_request_body(sr) != NGX_OK) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    sr->method = method;[m
[31m-[m
[31m-    switch (method) {[m
[31m-        case NGX_HTTP_GET:[m
[31m-            sr->method_name = ngx_http_lua_get_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_POST:[m
[31m-            sr->method_name = ngx_http_lua_post_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PUT:[m
[31m-            sr->method_name = ngx_http_lua_put_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_HEAD:[m
[31m-            sr->method_name = ngx_http_lua_head_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_DELETE:[m
[31m-            sr->method_name = ngx_http_lua_delete_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_OPTIONS:[m
[31m-            sr->method_name = ngx_http_lua_options_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MKCOL:[m
[31m-            sr->method_name = ngx_http_lua_mkcol_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_COPY:[m
[31m-            sr->method_name = ngx_http_lua_copy_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_MOVE:[m
[31m-            sr->method_name = ngx_http_lua_move_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPFIND:[m
[31m-            sr->method_name = ngx_http_lua_propfind_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PROPPATCH:[m
[31m-            sr->method_name = ngx_http_lua_proppatch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_LOCK:[m
[31m-            sr->method_name = ngx_http_lua_lock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UNLOCK:[m
[31m-            sr->method_name = ngx_http_lua_unlock_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_PATCH:[m
[31m-            sr->method_name = ngx_http_lua_patch_method;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_TRACE:[m
[31m-            sr->method_name = ngx_http_lua_trace_method;[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "unsupported HTTP method: %u", (unsigned) method);[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (!(vars_action & NGX_HTTP_LUA_SHARE_ALL_VARS)) {[m
[31m-        /* we do not inherit the parent request's variables */[m
[31m-        cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-[m
[31m-        size = cmcf->variables.nelts * sizeof(ngx_http_variable_value_t);[m
[31m-[m
[31m-        if (vars_action & NGX_HTTP_LUA_COPY_ALL_VARS) {[m
[31m-[m
[31m-            sr->variables = ngx_palloc(sr->pool, size);[m
[31m-            if (sr->variables == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            ngx_memcpy(sr->variables, r->variables, size);[m
[31m-[m
[31m-        } else {[m
[31m-[m
[31m-            /* we do not inherit the parent request's variables */[m
[31m-[m
[31m-            sr->variables = ngx_pcalloc(sr->pool, size);[m
[31m-            if (sr->variables == NULL) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_subrequest_add_extra_vars(sr, extra_vars);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_subrequest_add_extra_vars(ngx_http_request_t *sr,[m
[31m-    ngx_array_t *extra_vars)[m
[31m-{[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-    ngx_http_variable_t         *v;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-    u_char                      *val;[m
[31m-    u_char                      *p;[m
[31m-    ngx_uint_t                   i, hash;[m
[31m-    ngx_str_t                    name;[m
[31m-    size_t                       len;[m
[31m-    ngx_hash_t                  *variables_hash;[m
[31m-    ngx_keyval_t                *var;[m
[31m-[m
[31m-    /* set any extra variables that were passed to the subrequest */[m
[31m-[m
[31m-    if (extra_vars == NULL || extra_vars->nelts == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(sr, ngx_http_core_module);[m
[31m-[m
[31m-    variables_hash = &cmcf->variables_hash;[m
[31m-[m
[31m-    var = extra_vars->elts;[m
[31m-[m
[31m-    for (i = 0; i < extra_vars->nelts; i++, var++) {[m
[31m-        /* copy the variable's name and value because they are allocated[m
[31m-         * by the lua VM */[m
[31m-[m
[31m-        len = var->key.len + var->value.len;[m
[31m-[m
[31m-        p = ngx_pnalloc(sr->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        name.data = p;[m
[31m-        name.len = var->key.len;[m
[31m-[m
[31m-        p = ngx_copy(p, var->key.data, var->key.len);[m
[31m-[m
[31m-        hash = ngx_hash_strlow(name.data, name.data, name.len);[m
[31m-[m
[31m-        val = p;[m
[31m-        len = var->value.len;[m
[31m-[m
[31m-        ngx_memcpy(p, var->value.data, len);[m
[31m-[m
[31m-        v = ngx_hash_find(variables_hash, hash, name.data, name.len);[m
[31m-[m
[31m-        if (v) {[m
[31m-            if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, sr->connection->log, 0,[m
[31m-                              "variable \"%V\" not changeable", &name);[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            if (v->set_handler) {[m
[31m-                vv = ngx_palloc(sr->pool, sizeof(ngx_http_variable_value_t));[m
[31m-                if (vv == NULL) {[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = val;[m
[31m-                vv->len = len;[m
[31m-[m
[31m-                v->set_handler(sr, vv, v->data);[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sr->connection->log, 0,[m
[31m-                               "variable \"%V\" set to value \"%v\"", &name,[m
[31m-                               vv);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            if (v->flags & NGX_HTTP_VAR_INDEXED) {[m
[31m-                vv = &sr->variables[v->index];[m
[31m-[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = val;[m
[31m-                vv->len = len;[m
[31m-[m
[31m-                ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sr->connection->log, 0,[m
[31m-                               "variable \"%V\" set to value \"%v\"",[m
[31m-                               &name, vv);[m
[31m-[m
[31m-                continue;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, sr->connection->log, 0,[m
[31m-                      "variable \"%V\" cannot be assigned a value (maybe you "[m
[31m-                      "forgot to define it first?) ", &name);[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_process_vars_option(ngx_http_request_t *r, lua_State *L,[m
[31m-    int table, ngx_array_t **varsp)[m
[31m-{[m
[31m-    ngx_array_t         *vars;[m
[31m-    ngx_keyval_t        *var;[m
[31m-[m
[31m-    if (table < 0) {[m
[31m-        table = lua_gettop(L) + table + 1;[m
[31m-    }[m
[31m-[m
[31m-    vars = *varsp;[m
[31m-[m
[31m-    if (vars == NULL) {[m
[31m-[m
[31m-        vars = ngx_array_create(r->pool, 4, sizeof(ngx_keyval_t));[m
[31m-        if (vars == NULL) {[m
[31m-            dd("here");[m
[31m-            luaL_error(L, "no memory");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        *varsp = vars;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnil(L);[m
[31m-    while (lua_next(L, table) != 0) {[m
[31m-[m
[31m-        if (lua_type(L, -2) != LUA_TSTRING) {[m
[31m-            luaL_error(L, "attempt to use a non-string key in the "[m
[31m-                       "\"vars\" option table");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        if (!lua_isstring(L, -1)) {[m
[31m-            luaL_error(L, "attempt to use bad variable value type %s",[m
[31m-                       luaL_typename(L, -1));[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        var = ngx_array_push(vars);[m
[31m-        if (var == NULL) {[m
[31m-            dd("here");[m
[31m-            luaL_error(L, "no memory");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        var->key.data = (u_char *) lua_tolstring(L, -2, &var->key.len);[m
[31m-        var->value.data = (u_char *) lua_tolstring(L, -1, &var->value.len);[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_post_subrequest(ngx_http_request_t *r, void *data, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_request_t            *pr;[m
[31m-    ngx_http_lua_ctx_t            *pr_ctx;[m
[31m-    ngx_http_lua_ctx_t            *ctx; /* subrequest ctx */[m
[31m-    ngx_http_lua_co_ctx_t         *pr_coctx;[m
[31m-    size_t                         len;[m
[31m-    ngx_str_t                     *body_str;[m
[31m-    u_char                        *p;[m
[31m-    ngx_chain_t                   *cl;[m
[31m-[m
[31m-    ngx_http_lua_post_subrequest_data_t    *psr_data = data;[m
[31m-[m
[31m-    ctx = psr_data->ctx;[m
[31m-[m
[31m-    if (ctx->run_post_subrequest) {[m
[31m-        if (r != r->connection->data) {[m
[31m-            r->connection->data = r;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run post subrequest handler, rc:%i c:%ud", rc,[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    ctx->run_post_subrequest = 1;[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    pr_ctx = ngx_http_get_module_ctx(pr, ngx_http_lua_module);[m
[31m-    if (pr_ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr_coctx = psr_data->pr_co_ctx;[m
[31m-    pr_coctx->pending_subreqs--;[m
[31m-[m
[31m-    if (pr_coctx->pending_subreqs == 0) {[m
[31m-        dd("all subrequests are done");[m
[31m-[m
[31m-        pr_ctx->no_abort = 0;[m
[31m-        pr_ctx->resume_handler = ngx_http_lua_subrequest_resume;[m
[31m-        pr_ctx->cur_co_ctx = pr_coctx;[m
[31m-    }[m
[31m-[m
[31m-    if (pr_ctx->entered_content_phase) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua restoring write event handler");[m
[31m-[m
[31m-        pr->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        pr->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    dd("status rc = %d", (int) rc);[m
[31m-    dd("status headers_out.status = %d", (int) r->headers_out.status);[m
[31m-    dd("uri: %.*s", (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-    /*  capture subrequest response status */[m
[31m-[m
[31m-    pr_coctx->sr_statuses[ctx->index] = r->headers_out.status;[m
[31m-[m
[31m-    if (pr_coctx->sr_statuses[ctx->index] == 0) {[m
[31m-        if (rc == NGX_OK) {[m
[31m-            rc = NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_ERROR) {[m
[31m-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (rc >= 100) {[m
[31m-            pr_coctx->sr_statuses[ctx->index] = rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!ctx->seen_last_for_subreq) {[m
[31m-        pr_coctx->sr_flags[ctx->index] |= NGX_HTTP_LUA_SUBREQ_TRUNCATED;[m
[31m-    }[m
[31m-[m
[31m-    dd("pr_coctx status: %d", (int) pr_coctx->sr_statuses[ctx->index]);[m
[31m-[m
[31m-    /* copy subrequest response headers */[m
[31m-[m
[31m-    pr_coctx->sr_headers[ctx->index] = &r->headers_out;[m
[31m-[m
[31m-    /* copy subrequest response body */[m
[31m-[m
[31m-    body_str = &pr_coctx->sr_bodies[ctx->index];[m
[31m-[m
[31m-    len = 0;[m
[31m-    for (cl = ctx->body; cl; cl = cl->next) {[m
[31m-        /*  ignore all non-memory buffers */[m
[31m-        len += cl->buf->last - cl->buf->pos;[m
[31m-    }[m
[31m-[m
[31m-    body_str->len = len;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        body_str->data = NULL;[m
[31m-[m
[31m-    } else {[m
[31m-        p = ngx_palloc(r->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        body_str->data = p;[m
[31m-[m
[31m-        /* copy from and then free the data buffers */[m
[31m-[m
[31m-        for (cl = ctx->body; cl; cl = cl->next) {[m
[31m-            p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);[m
[31m-[m
[31m-            cl->buf->last = cl->buf->pos;[m
[31m-[m
[31m-#if 0[m
[31m-            dd("free body chain link buf ASAP");[m
[31m-            ngx_pfree(r->pool, cl->buf->start);[m
[31m-#endif[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->body) {[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1001004[m
[31m-        ngx_chain_update_chains(r->pool,[m
[31m-#else[m
[31m-        ngx_chain_update_chains([m
[31m-#endif[m
[31m-                                &pr_ctx->free_bufs, &pr_ctx->busy_bufs,[m
[31m-                                &ctx->body,[m
[31m-                                (ngx_buf_tag_t) &ngx_http_lua_module);[m
[31m-[m
[31m-        dd("free bufs: %p", pr_ctx->free_bufs);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_post_request_to_head(pr);[m
[31m-[m
[31m-    if (r != r->connection->data) {[m
[31m-        r->connection->data = r;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR[m
[31m-        || rc == NGX_HTTP_CREATED[m
[31m-        || rc == NGX_HTTP_NO_CONTENT[m
[31m-        || (rc >= NGX_HTTP_SPECIAL_RESPONSE[m
[31m-            && rc != NGX_HTTP_CLOSE[m
[31m-            && rc != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-            && rc != NGX_HTTP_CLIENT_CLOSED_REQUEST))[m
[31m-    {[m
[31m-        /* emulate ngx_http_special_response_handler */[m
[31m-[m
[31m-        if (rc > NGX_OK) {[m
[31m-            r->err_status = rc;[m
[31m-[m
[31m-            r->expect_tested = 1;[m
[31m-            r->headers_out.content_type.len = 0;[m
[31m-            r->headers_out.content_length_n = 0;[m
[31m-[m
[31m-            ngx_http_clear_accept_ranges(r);[m
[31m-            ngx_http_clear_last_modified(r);[m
[31m-[m
[31m-            rc = ngx_http_lua_send_header_if_needed(r, ctx);[m
[31m-            if (rc == NGX_ERROR) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_set_content_length_header(ngx_http_request_t *r, off_t len)[m
[31m-{[m
[31m-    ngx_table_elt_t                 *h, *header;[m
[31m-    u_char                          *p;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_http_request_t              *pr;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    r->headers_in.content_length_n = len;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t)) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h = ngx_list_push(&r->headers_in.headers);[m
[31m-    if (h == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->key = ngx_http_lua_content_length_header_key;[m
[31m-    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);[m
[31m-    if (h->lowcase_key == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);[m
[31m-[m
[31m-    r->headers_in.content_length = h;[m
[31m-[m
[31m-    p = ngx_palloc(r->pool, NGX_OFF_T_LEN);[m
[31m-    if (p == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    h->value.data = p;[m
[31m-[m
[31m-    h->value.len = ngx_sprintf(h->value.data, "%O", len) - h->value.data;[m
[31m-[m
[31m-    h->hash = ngx_http_lua_content_length_hash;[m
[31m-[m
[31m-#if 0[m
[31m-    dd("content length hash: %lu == %lu", (unsigned long) h->hash,[m
[31m-       ngx_hash_key_lc((u_char *) "Content-Length",[m
[31m-                       sizeof("Content-Length") - 1));[m
[31m-#endif[m
[31m-[m
[31m-    dd("r content length: %.*s",[m
[31m-       (int) r->headers_in.content_length->value.len,[m
[31m-       r->headers_in.content_length->value.data);[m
[31m-[m
[31m-    pr = r->parent;[m
[31m-[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* forward the parent request's all other request headers */[m
[31m-[m
[31m-    part = &pr->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (header[i].key.len == sizeof("Content-Length") - 1[m
[31m-            && ngx_strncasecmp(header[i].key.data, (u_char *) "Content-Length",[m
[31m-                               sizeof("Content-Length") - 1) == 0)[m
[31m-        {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_http_lua_set_input_header(r, header[i].key,[m
[31m-                                          header[i].value, 0) == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_handle_subreq_responses(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t                   i, count;[m
[31m-    ngx_uint_t                   index;[m
[31m-    lua_State                   *co;[m
[31m-    ngx_str_t                   *body_str;[m
[31m-    ngx_table_elt_t             *header;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_http_headers_out_t      *sr_headers;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    u_char                  buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua handle subrequest responses");[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-    co = coctx->co;[m
[31m-[m
[31m-    for (index = 0; index < coctx->nsubreqs; index++) {[m
[31m-        dd("summary: reqs %d, subquery %d, pending %d, req %.*s",[m
[31m-           (int) coctx->nsubreqs,[m
[31m-           (int) index,[m
[31m-           (int) coctx->pending_subreqs,[m
[31m-           (int) r->uri.len, r->uri.data);[m
[31m-[m
[31m-        /*  {{{ construct ret value */[m
[31m-        lua_createtable(co, 0 /* narr */, 4 /* nrec */);[m
[31m-[m
[31m-        /*  copy captured status */[m
[31m-        lua_pushinteger(co, coctx->sr_statuses[index]);[m
[31m-        lua_setfield(co, -2, "status");[m
[31m-[m
[31m-        dd("captured subrequest flags: %d", (int) coctx->sr_flags[index]);[m
[31m-[m
[31m-        /* set truncated flag if truncation happens */[m
[31m-        if (coctx->sr_flags[index] & NGX_HTTP_LUA_SUBREQ_TRUNCATED) {[m
[31m-            lua_pushboolean(co, 1);[m
[31m-            lua_setfield(co, -2, "truncated");[m
[31m-[m
[31m-        } else {[m
[31m-            lua_pushboolean(co, 0);[m
[31m-            lua_setfield(co, -2, "truncated");[m
[31m-        }[m
[31m-[m
[31m-        /*  copy captured body */[m
[31m-[m
[31m-        body_str = &coctx->sr_bodies[index];[m
[31m-[m
[31m-        lua_pushlstring(co, (char *) body_str->data, body_str->len);[m
[31m-        lua_setfield(co, -2, "body");[m
[31m-[m
[31m-        if (body_str->data) {[m
[31m-            dd("free body buffer ASAP");[m
[31m-            ngx_pfree(r->pool, body_str->data);[m
[31m-        }[m
[31m-[m
[31m-        /* copy captured headers */[m
[31m-[m
[31m-        sr_headers = coctx->sr_headers[index];[m
[31m-[m
[31m-        part = &sr_headers->headers.part;[m
[31m-        count = part->nelts;[m
[31m-        while (part->next) {[m
[31m-            part = part->next;[m
[31m-            count += part->nelts;[m
[31m-        }[m
[31m-[m
[31m-        lua_createtable(co, 0, count + 5); /* res.header */[m
[31m-[m
[31m-        dd("saving subrequest response headers");[m
[31m-[m
[31m-        part = &sr_headers->headers.part;[m
[31m-        header = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                header = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            dd("checking sr header %.*s", (int) header[i].key.len,[m
[31m-               header[i].key.data);[m
[31m-[m
[31m-#if 1[m
[31m-            if (header[i].hash == 0) {[m
[31m-                continue;[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            header[i].hash = 0;[m
[31m-[m
[31m-            dd("pushing sr header %.*s", (int) header[i].key.len,[m
[31m-               header[i].key.data);[m
[31m-[m
[31m-            lua_pushlstring(co, (char *) header[i].key.data,[m
[31m-                            header[i].key.len); /* header key */[m
[31m-            lua_pushvalue(co, -1); /* stack: table key key */[m
[31m-[m
[31m-            /* check if header already exists */[m
[31m-            lua_rawget(co, -3); /* stack: table key value */[m
[31m-[m
[31m-            if (lua_isnil(co, -1)) {[m
[31m-                lua_pop(co, 1); /* stack: table key */[m
[31m-[m
[31m-                lua_pushlstring(co, (char *) header[i].value.data,[m
[31m-                                header[i].value.len);[m
[31m-                    /* stack: table key value */[m
[31m-[m
[31m-                lua_rawset(co, -3); /* stack: table */[m
[31m-[m
[31m-            } else {[m
[31m-[m
[31m-                if (!lua_istable(co, -1)) { /* already inserted one value */[m
[31m-                    lua_createtable(co, 4, 0);[m
[31m-                        /* stack: table key value table */[m
[31m-[m
[31m-                    lua_insert(co, -2); /* stack: table key table value */[m
[31m-                    lua_rawseti(co, -2, 1); /* stack: table key table */[m
[31m-[m
[31m-                    lua_pushlstring(co, (char *) header[i].value.data,[m
[31m-                                    header[i].value.len);[m
[31m-                        /* stack: table key table value */[m
[31m-[m
[31m-                    lua_rawseti(co, -2, lua_objlen(co, -2) + 1);[m
[31m-                        /* stack: table key table */[m
[31m-[m
[31m-                    lua_rawset(co, -3); /* stack: table */[m
[31m-[m
[31m-                } else {[m
[31m-                    lua_pushlstring(co, (char *) header[i].value.data,[m
[31m-                                    header[i].value.len);[m
[31m-                        /* stack: table key table value */[m
[31m-[m
[31m-                    lua_rawseti(co, -2, lua_objlen(co, -2) + 1);[m
[31m-                        /* stack: table key table */[m
[31m-[m
[31m-                    lua_pop(co, 2); /* stack: table */[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (sr_headers->content_type.len) {[m
[31m-            lua_pushliteral(co, "Content-Type"); /* header key */[m
[31m-            lua_pushlstring(co, (char *) sr_headers->content_type.data,[m
[31m-                            sr_headers->content_type.len); /* head key value */[m
[31m-            lua_rawset(co, -3); /* head */[m
[31m-        }[m
[31m-[m
[31m-        if (sr_headers->content_length == NULL[m
[31m-            && sr_headers->content_length_n >= 0)[m
[31m-        {[m
[31m-            lua_pushliteral(co, "Content-Length"); /* header key */[m
[31m-[m
[31m-            lua_pushnumber(co, (lua_Number) sr_headers->content_length_n);[m
[31m-                /* head key value */[m
[31m-[m
[31m-            lua_rawset(co, -3); /* head */[m
[31m-        }[m
[31m-[m
[31m-        /* to work-around an issue in ngx_http_static_module[m
[31m-         * (github issue #41) */[m
[31m-        if (sr_headers->location && sr_headers->location->value.len) {[m
[31m-            lua_pushliteral(co, "Location"); /* header key */[m
[31m-            lua_pushlstring(co, (char *) sr_headers->location->value.data,[m
[31m-                            sr_headers->location->value.len);[m
[31m-            /* head key value */[m
[31m-            lua_rawset(co, -3); /* head */[m
[31m-        }[m
[31m-[m
[31m-        if (sr_headers->last_modified_time != -1) {[m
[31m-            if (sr_headers->status != NGX_HTTP_OK[m
[31m-                && sr_headers->status != NGX_HTTP_PARTIAL_CONTENT[m
[31m-                && sr_headers->status != NGX_HTTP_NOT_MODIFIED[m
[31m-                && sr_headers->status != NGX_HTTP_NO_CONTENT)[m
[31m-            {[m
[31m-                sr_headers->last_modified_time = -1;[m
[31m-                sr_headers->last_modified = NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (sr_headers->last_modified == NULL[m
[31m-            && sr_headers->last_modified_time != -1)[m
[31m-        {[m
[31m-            (void) ngx_http_time(buf, sr_headers->last_modified_time);[m
[31m-[m
[31m-            lua_pushliteral(co, "Last-Modified"); /* header key */[m
[31m-            lua_pushlstring(co, (char *) buf, sizeof(buf)); /* head key value */[m
[31m-            lua_rawset(co, -3); /* head */[m
[31m-        }[m
[31m-[m
[31m-        lua_setfield(co, -2, "header");[m
[31m-[m
[31m-        /*  }}} */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_subrequest_api(lua_State *L)[m
[31m-{[m
[31m-    lua_createtable(L, 0 /* narr */, 2 /* nrec */); /* .location */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_location_capture);[m
[31m-    lua_setfield(L, -2, "capture");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_location_capture_multi);[m
[31m-    lua_setfield(L, -2, "capture_multi");[m
[31m-[m
[31m-    lua_setfield(L, -2, "location");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_subrequest(ngx_http_request_t *r,[m
[31m-    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,[m
[31m-    ngx_http_post_subrequest_t *ps, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_time_t                    *tp;[m
[31m-    ngx_connection_t              *c;[m
[31m-    ngx_http_request_t            *sr;[m
[31m-    ngx_http_core_srv_conf_t      *cscf;[m
[31m-[m
[31m-#if nginx_version >= 1009005[m
[31m-[m
[31m-    if (r->subrequests == 0) {[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-        ngx_http_probe_subrequest_cycle(r, uri, args);[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua subrequests cycle while processing \"%V\"", uri);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#else  /* nginx_version <= 1009004 */[m
[31m-[m
[31m-    r->main->subrequests--;[m
[31m-[m
[31m-    if (r->main->subrequests == 0) {[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-        ngx_http_probe_subrequest_cycle(r, uri, args);[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "lua subrequests cycle while processing \"%V\"", uri);[m
[31m-        r->main->subrequests = 1;[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    sr = ngx_pcalloc(r->pool, sizeof(ngx_http_request_t));[m
[31m-    if (sr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    sr->signature = NGX_HTTP_MODULE;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    sr->connection = c;[m
[31m-[m
[31m-    sr->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (sr->ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&sr->headers_out.headers, r->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);[m
[31m-    sr->main_conf = cscf->ctx->main_conf;[m
[31m-    sr->srv_conf = cscf->ctx->srv_conf;[m
[31m-    sr->loc_conf = cscf->ctx->loc_conf;[m
[31m-[m
[31m-    sr->pool = r->pool;[m
[31m-[m
[31m-    sr->headers_in.content_length_n = -1;[m
[31m-    sr->headers_in.keep_alive_n = -1;[m
[31m-[m
[31m-    ngx_http_clear_content_length(sr);[m
[31m-    ngx_http_clear_accept_ranges(sr);[m
[31m-    ngx_http_clear_last_modified(sr);[m
[31m-[m
[31m-    sr->request_body = r->request_body;[m
[31m-[m
[31m-#if (NGX_HTTP_SPDY)[m
[31m-    sr->spdy_stream = r->spdy_stream;[m
[31m-#endif[m
[31m-[m
[31m-#if (NGX_HTTP_V2)[m
[31m-    sr->stream = r->stream;[m
[31m-#endif[m
[31m-[m
[31m-#ifdef HAVE_ALLOW_REQUEST_BODY_UPDATING_PATCH[m
[31m-    sr->content_length_n = -1;[m
[31m-#endif[m
[31m-[m
[31m-    sr->method = NGX_HTTP_GET;[m
[31m-    sr->http_version = r->http_version;[m
[31m-[m
[31m-    sr->request_line = r->request_line;[m
[31m-    sr->uri = *uri;[m
[31m-[m
[31m-    if (args) {[m
[31m-        sr->args = *args;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua http subrequest \"%V?%V\"", uri, &sr->args);[m
[31m-[m
[31m-    sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;[m
[31m-    sr->waited = (flags & NGX_HTTP_SUBREQUEST_WAITED) != 0;[m
[31m-[m
[31m-    sr->unparsed_uri = r->unparsed_uri;[m
[31m-    sr->method_name = ngx_http_core_get_method;[m
[31m-    sr->http_protocol = r->http_protocol;[m
[31m-[m
[31m-    ngx_http_set_exten(sr);[m
[31m-[m
[31m-    sr->main = r->main;[m
[31m-    sr->parent = r;[m
[31m-    sr->post_subrequest = ps;[m
[31m-    sr->read_event_handler = ngx_http_request_empty_handler;[m
[31m-    sr->write_event_handler = ngx_http_handler;[m
[31m-[m
[31m-    sr->variables = r->variables;[m
[31m-[m
[31m-    sr->log_handler = r->log_handler;[m
[31m-[m
[31m-    sr->internal = 1;[m
[31m-[m
[31m-    sr->discard_body = r->discard_body;[m
[31m-    sr->expect_tested = 1;[m
[31m-    sr->main_filter_need_in_memory = r->main_filter_need_in_memory;[m
[31m-[m
[31m-    sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-[m
[31m-#if nginx_version >= 1009005[m
[31m-    sr->subrequests = r->subrequests - 1;[m
[31m-#endif[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-    sr->start_sec = tp->sec;[m
[31m-    sr->start_msec = tp->msec;[m
[31m-[m
[31m-    r->main->count++;[m
[31m-[m
[31m-    *psr = sr;[m
[31m-[m
[31m-#if defined(NGX_DTRACE) && NGX_DTRACE[m
[31m-    ngx_http_probe_subrequest_start(sr);[m
[31m-#endif[m
[31m-[m
[31m-    return ngx_http_post_request(sr, NULL);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_subrequest_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run subrequests done, resuming lua thread");[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    dd("nsubreqs: %d", (int) coctx->nsubreqs);[m
[31m-[m
[31m-    ngx_http_lua_handle_subreq_responses(r, ctx);[m
[31m-[m
[31m-    dd("free sr_statues/headers/bodies memory ASAP");[m
[31m-[m
[31m-#if 1[m
[31m-    ngx_pfree(r->pool, coctx->sr_statuses);[m
[31m-[m
[31m-    coctx->sr_statuses = NULL;[m
[31m-    coctx->sr_headers = NULL;[m
[31m-    coctx->sr_bodies = NULL;[m
[31m-    coctx->sr_flags = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, coctx->nsubreqs);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc >= NGX_OK */[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_cancel_subreq(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_posted_request_t   *pr;[m
[31m-    ngx_http_posted_request_t  **p;[m
[31m-[m
[31m-#if 1[m
[31m-    r->main->count--;[m
[31m-    r->main->subrequests++;[m
[31m-#endif[m
[31m-[m
[31m-    p = &r->main->posted_requests;[m
[31m-    for (pr = r->main->posted_requests; pr->next; pr = pr->next) {[m
[31m-        p = &pr->next;[m
[31m-    }[m
[31m-[m
[31m-    *p = NULL;[m
[31m-[m
[31m-    r->connection->data = r->parent;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_post_request_to_head(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_posted_request_t  *pr;[m
[31m-[m
[31m-    pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t));[m
[31m-    if (pr == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pr->request = r;[m
[31m-    pr->next = r->main->posted_requests;[m
[31m-    r->main->posted_requests = pr;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_copy_in_file_request_body(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_temp_file_t     *tf;[m
[31m-[m
[31m-    ngx_http_request_body_t   *body;[m
[31m-[m
[31m-    tf = r->request_body->temp_file;[m
[31m-[m
[31m-    if (!tf->persistent || !tf->clean) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "the request body was not read by ngx_lua");[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    body = ngx_palloc(r->pool, sizeof(ngx_http_request_body_t));[m
[31m-    if (body == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(body, r->request_body, sizeof(ngx_http_request_body_t));[m
[31m-[m
[31m-    body->temp_file = ngx_palloc(r->pool, sizeof(ngx_temp_file_t));[m
[31m-    if (body->temp_file == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(body->temp_file, tf, sizeof(ngx_temp_file_t));[m
[31m-    dd("file fd: %d", body->temp_file->file.fd);[m
[31m-[m
[31m-    r->request_body = body;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_copy_request_headers(ngx_http_request_t *sr, ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_table_elt_t                 *header;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    if (ngx_list_init(&sr->headers_in.headers, sr->pool, 20,[m
[31m-                      sizeof(ngx_table_elt_t)) != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("before: parent req headers count: %d",[m
[31m-       (int) r->headers_in.headers.part.nelts);[m
[31m-[m
[31m-    part = &r->headers_in.headers.part;[m
[31m-    header = part->elts;[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            header = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        dd("setting request header %.*s: %.*s", (int) header[i].key.len,[m
[31m-           header[i].key.data, (int) header[i].value.len,[m
[31m-           header[i].value.data);[m
[31m-[m
[31m-        if (ngx_http_lua_set_input_header(sr, header[i].key,[m
[31m-                                          header[i].value, 0) == NGX_ERROR)[m
[31m-        {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("after: parent req headers count: %d",[m
[31m-       (int) r->headers_in.headers.part.nelts);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.h[m
[1mdeleted file mode 100644[m
[1mindex aad4236..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_subrequest.h[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_SUBREQUEST_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_SUBREQUEST_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_subrequest_api(lua_State *L);[m
[31m-ngx_int_t ngx_http_lua_post_subrequest(ngx_http_request_t *r, void *data,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-[m
[31m-extern ngx_str_t  ngx_http_lua_get_method;[m
[31m-extern ngx_str_t  ngx_http_lua_put_method;[m
[31m-extern ngx_str_t  ngx_http_lua_post_method;[m
[31m-extern ngx_str_t  ngx_http_lua_head_method;[m
[31m-extern ngx_str_t  ngx_http_lua_delete_method;[m
[31m-extern ngx_str_t  ngx_http_lua_options_method;[m
[31m-extern ngx_str_t  ngx_http_lua_copy_method;[m
[31m-extern ngx_str_t  ngx_http_lua_move_method;[m
[31m-extern ngx_str_t  ngx_http_lua_lock_method;[m
[31m-extern ngx_str_t  ngx_http_lua_mkcol_method;[m
[31m-extern ngx_str_t  ngx_http_lua_propfind_method;[m
[31m-extern ngx_str_t  ngx_http_lua_proppatch_method;[m
[31m-extern ngx_str_t  ngx_http_lua_unlock_method;[m
[31m-extern ngx_str_t  ngx_http_lua_patch_method;[m
[31m-extern ngx_str_t  ngx_http_lua_trace_method;[m
[31m-[m
[31m-[m
[31m-typedef struct ngx_http_lua_post_subrequest_data_s {[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *pr_co_ctx;[m
[31m-[m
[31m-} ngx_http_lua_post_subrequest_data_t;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_SUBREQUEST_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_time.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_time.c[m
[1mdeleted file mode 100644[m
[1mindex 3272a75..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_time.c[m
[1m+++ /dev/null[m
[36m@@ -1,278 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_today(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_now(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_localtime(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_utctime(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_cookie_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_http_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_parse_http_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_update_time(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_req_start_time(lua_State *L);[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_today(lua_State *L)[m
[31m-{[m
[31m-    time_t                   now;[m
[31m-    ngx_tm_t                 tm;[m
[31m-    u_char                   buf[sizeof("2010-11-19") - 1];[m
[31m-[m
[31m-    now = ngx_time();[m
[31m-    ngx_gmtime(now + ngx_cached_time->gmtoff * 60, &tm);[m
[31m-[m
[31m-    ngx_sprintf(buf, "%04d-%02d-%02d", tm.ngx_tm_year, tm.ngx_tm_mon,[m
[31m-                tm.ngx_tm_mday);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, sizeof(buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_localtime(lua_State *L)[m
[31m-{[m
[31m-    ngx_tm_t                 tm;[m
[31m-[m
[31m-    u_char buf[sizeof("2010-11-19 20:56:31") - 1];[m
[31m-[m
[31m-    ngx_gmtime(ngx_time() + ngx_cached_time->gmtoff * 60, &tm);[m
[31m-[m
[31m-    ngx_sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tm.ngx_tm_year,[m
[31m-                tm.ngx_tm_mon, tm.ngx_tm_mday, tm.ngx_tm_hour, tm.ngx_tm_min,[m
[31m-                tm.ngx_tm_sec);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, sizeof(buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_time(lua_State *L)[m
[31m-{[m
[31m-    lua_pushnumber(L, (lua_Number) ngx_time());[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_now(lua_State *L)[m
[31m-{[m
[31m-    ngx_time_t              *tp;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) (tp->sec + tp->msec / 1000.0L));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_update_time(lua_State *L)[m
[31m-{[m
[31m-    ngx_time_update();[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_utctime(lua_State *L)[m
[31m-{[m
[31m-    ngx_tm_t       tm;[m
[31m-    u_char         buf[sizeof("2010-11-19 20:56:31") - 1];[m
[31m-[m
[31m-    ngx_gmtime(ngx_time(), &tm);[m
[31m-[m
[31m-    ngx_sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tm.ngx_tm_year,[m
[31m-                tm.ngx_tm_mon, tm.ngx_tm_mday, tm.ngx_tm_hour, tm.ngx_tm_min,[m
[31m-                tm.ngx_tm_sec);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, sizeof(buf));[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_cookie_time(lua_State *L)[m
[31m-{[m
[31m-    time_t                               t;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    u_char   buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    t = (time_t) luaL_checknumber(L, 1);[m
[31m-[m
[31m-    p = buf;[m
[31m-    p = ngx_http_cookie_time(p, t);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, p - buf);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_http_time(lua_State *L)[m
[31m-{[m
[31m-    time_t                               t;[m
[31m-    u_char                              *p;[m
[31m-[m
[31m-    u_char   buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    t = (time_t) luaL_checknumber(L, 1);[m
[31m-[m
[31m-    p = buf;[m
[31m-    p = ngx_http_time(p, t);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) buf, p - buf);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_parse_http_time(lua_State *L)[m
[31m-{[m
[31m-    u_char                              *p;[m
[31m-    size_t                               len;[m
[31m-    time_t                               time;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "expecting one argument");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    time = ngx_http_parse_time(p, len);[m
[31m-    if (time == NGX_ERROR) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) time);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_start_time(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t  *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    lua_pushnumber(L, (lua_Number) (r->start_sec + r->start_msec / 1000.0L));[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_time_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_utctime);[m
[31m-    lua_setfield(L, -2, "utctime");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_time);[m
[31m-    lua_setfield(L, -2, "get_now_ts"); /* deprecated */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_localtime);[m
[31m-    lua_setfield(L, -2, "get_now"); /* deprecated */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_localtime);[m
[31m-    lua_setfield(L, -2, "localtime");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_time);[m
[31m-    lua_setfield(L, -2, "time");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_now);[m
[31m-    lua_setfield(L, -2, "now");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_update_time);[m
[31m-    lua_setfield(L, -2, "update_time");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_today);[m
[31m-    lua_setfield(L, -2, "get_today"); /* deprecated */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_today);[m
[31m-    lua_setfield(L, -2, "today");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_cookie_time);[m
[31m-    lua_setfield(L, -2, "cookie_time");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_http_time);[m
[31m-    lua_setfield(L, -2, "http_time");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_parse_http_time);[m
[31m-    lua_setfield(L, -2, "parse_http_time");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_time_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_start_time);[m
[31m-    lua_setfield(L, -2, "start_time");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-double[m
[31m-ngx_http_lua_ffi_now(void)[m
[31m-{[m
[31m-    ngx_time_t              *tp;[m
[31m-[m
[31m-    tp = ngx_timeofday();[m
[31m-[m
[31m-    return tp->sec + tp->msec / 1000.0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-double[m
[31m-ngx_http_lua_ffi_req_start_time(ngx_http_request_t *r)[m
[31m-{[m
[31m-    return r->start_sec + r->start_msec / 1000.0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-long[m
[31m-ngx_http_lua_ffi_time(void)[m
[31m-{[m
[31m-    return (long) ngx_time();[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_time.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_time.h[m
[1mdeleted file mode 100644[m
[1mindex 291f784..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_time.h[m
[1m+++ /dev/null[m
[36m@@ -1,21 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_TIME_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_TIME_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_time_api(lua_State *L);[m
[31m-void ngx_http_lua_inject_req_time_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_TIME_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_timer.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_timer.c[m
[1mdeleted file mode 100644[m
[1mindex 96c0ace..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_timer.c[m
[1m+++ /dev/null[m
[36m@@ -1,714 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_timer.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    void        **main_conf;[m
[31m-    void        **srv_conf;[m
[31m-    void        **loc_conf;[m
[31m-[m
[31m-    /* event ident must be after 3 words (i.e. 3 pointers' size) as in[m
[31m-     * ngx_connection_t. and we use the Lua coroutine reference number as[m
[31m-     * the event ident */[m
[31m-    int           co_ref;[m
[31m-    unsigned      premature;  /* :1 */[m
[31m-    lua_State    *co;[m
[31m-[m
[31m-    ngx_pool_t   *pool;[m
[31m-[m
[31m-    ngx_listening_t                   *listening;[m
[31m-    ngx_str_t                          client_addr_text;[m
[31m-[m
[31m-    ngx_http_lua_main_conf_t          *lmcf;[m
[31m-    ngx_http_lua_vm_state_t           *vm_state;[m
[31m-[m
[31m-} ngx_http_lua_timer_ctx_t;[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_timer_at(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_timer_running_count(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_timer_pending_count(lua_State *L);[m
[31m-static void ngx_http_lua_timer_handler(ngx_event_t *ev);[m
[31m-static u_char *ngx_http_lua_log_timer_error(ngx_log_t *log, u_char *buf,[m
[31m-    size_t len);[m
[31m-static void ngx_http_lua_abort_pending_timers(ngx_event_t *ev);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_timer_api(lua_State *L)[m
[31m-{[m
[31m-    lua_createtable(L, 0 /* narr */, 3 /* nrec */);    /* ngx.timer. */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_timer_at);[m
[31m-    lua_setfield(L, -2, "at");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_timer_running_count);[m
[31m-    lua_setfield(L, -2, "running_count");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_timer_pending_count);[m
[31m-    lua_setfield(L, -2, "pending_count");[m
[31m-[m
[31m-    lua_setfield(L, -2, "timer");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_timer_running_count(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request");[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    lua_pushnumber(L, lmcf->running_timers);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_timer_pending_count(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request");[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    lua_pushnumber(L, lmcf->pending_timers);[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_timer_at(lua_State *L)[m
[31m-{[m
[31m-    int                      nargs, co_ref;[m
[31m-    u_char                  *p;[m
[31m-    lua_State               *vm;  /* the main thread */[m
[31m-    lua_State               *co;[m
[31m-    ngx_msec_t               delay;[m
[31m-    ngx_event_t             *ev = NULL;[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_connection_t        *saved_c = NULL;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-#if 0[m
[31m-    ngx_http_connection_t   *hc;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_timer_ctx_t      *tctx = NULL;[m
[31m-    ngx_http_lua_main_conf_t      *lmcf;[m
[31m-#if 0[m
[31m-    ngx_http_core_main_conf_t     *cmcf;[m
[31m-#endif[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-    if (nargs < 2) {[m
[31m-        return luaL_error(L, "expecting at least 2 arguments but got %d",[m
[31m-                          nargs);[m
[31m-    }[m
[31m-[m
[31m-    delay = (ngx_msec_t) (luaL_checknumber(L, 1) * 1000);[m
[31m-[m
[31m-    luaL_argcheck(L, lua_isfunction(L, 2) && !lua_iscfunction(L, 2), 2,[m
[31m-                  "Lua function expected");[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (ngx_exiting && delay > 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "process exiting");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (lmcf->pending_timers >= lmcf->max_pending_timers) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "too many pending timers");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->watcher == NULL) {[m
[31m-        /* create the watcher fake connection */[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "lua creating fake watcher connection");[m
[31m-[m
[31m-        if (ngx_cycle->files) {[m
[31m-            saved_c = ngx_cycle->files[0];[m
[31m-        }[m
[31m-[m
[31m-        lmcf->watcher = ngx_get_connection(0, ngx_cycle->log);[m
[31m-[m
[31m-        if (ngx_cycle->files) {[m
[31m-            ngx_cycle->files[0] = saved_c;[m
[31m-        }[m
[31m-[m
[31m-        if (lmcf->watcher == NULL) {[m
[31m-            return luaL_error(L, "no memory");[m
[31m-        }[m
[31m-[m
[31m-        /* to work around the -1 check in ngx_worker_process_cycle: */[m
[31m-        lmcf->watcher->fd = (ngx_socket_t) -2;[m
[31m-[m
[31m-        lmcf->watcher->idle = 1;[m
[31m-        lmcf->watcher->read->handler = ngx_http_lua_abort_pending_timers;[m
[31m-        lmcf->watcher->data = lmcf;[m
[31m-    }[m
[31m-[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    co = lua_newthread(vm);[m
[31m-[m
[31m-    /* L stack: time func [args] thread */[m
[31m-[m
[31m-    ngx_http_lua_probe_user_coroutine_create(r, L, co);[m
[31m-[m
[31m-    lua_createtable(co, 0, 0);  /* the new globals table */[m
[31m-[m
[31m-    /* co stack: global_tb */[m
[31m-[m
[31m-    lua_createtable(co, 0, 1);  /* the metatable */[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfield(co, -2, "__index");[m
[31m-    lua_setmetatable(co, -2);[m
[31m-[m
[31m-    /* co stack: global_tb */[m
[31m-[m
[31m-    ngx_http_lua_set_globals_table(co);[m
[31m-[m
[31m-    /* co stack: <empty> */[m
[31m-[m
[31m-    dd("stack top: %d", lua_gettop(L));[m
[31m-[m
[31m-    lua_xmove(vm, L, 1);    /* move coroutine from main thread to L */[m
[31m-[m
[31m-    /* L stack: time func [args] thread */[m
[31m-    /* vm stack: empty */[m
[31m-[m
[31m-    lua_pushvalue(L, 2);    /* copy entry function to top of L*/[m
[31m-[m
[31m-    /* L stack: time func [args] thread func */[m
[31m-[m
[31m-    lua_xmove(L, co, 1);    /* move entry function from L to co */[m
[31m-[m
[31m-    /* L stack: time func [args] thread */[m
[31m-    /* co stack: func */[m
[31m-[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfenv(co, -2);[m
[31m-[m
[31m-    /* co stack: func */[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    /* L stack: time func [args] thread corountines */[m
[31m-[m
[31m-    lua_pushvalue(L, -2);[m
[31m-[m
[31m-    /* L stack: time func [args] thread coroutines thread */[m
[31m-[m
[31m-    co_ref = luaL_ref(L, -2);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    /* L stack: time func [args] thread */[m
[31m-[m
[31m-    if (nargs > 2) {[m
[31m-        lua_pop(L, 1);  /* L stack: time func [args] */[m
[31m-        lua_xmove(L, co, nargs - 2);  /* L stack: time func */[m
[31m-[m
[31m-        /* co stack: func [args] */[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_alloc(sizeof(ngx_event_t) + sizeof(ngx_http_lua_timer_ctx_t),[m
[31m-                  r->connection->log);[m
[31m-    if (p == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    ev = (ngx_event_t *) p;[m
[31m-[m
[31m-    ngx_memzero(ev, sizeof(ngx_event_t));[m
[31m-[m
[31m-    p += sizeof(ngx_event_t);[m
[31m-[m
[31m-    tctx = (ngx_http_lua_timer_ctx_t *) p;[m
[31m-[m
[31m-    tctx->premature = 0;[m
[31m-    tctx->co_ref = co_ref;[m
[31m-    tctx->co = co;[m
[31m-    tctx->main_conf = r->main_conf;[m
[31m-    tctx->srv_conf = r->srv_conf;[m
[31m-    tctx->loc_conf = r->loc_conf;[m
[31m-    tctx->lmcf = lmcf;[m
[31m-[m
[31m-    tctx->pool = ngx_create_pool(128, ngx_cycle->log);[m
[31m-    if (tctx->pool == NULL) {[m
[31m-        goto nomem;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection) {[m
[31m-        tctx->listening = r->connection->listening;[m
[31m-[m
[31m-    } else {[m
[31m-        tctx->listening = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->addr_text.len) {[m
[31m-        tctx->client_addr_text.data = ngx_palloc(tctx->pool,[m
[31m-                                                 r->connection->addr_text.len);[m
[31m-        if (tctx->client_addr_text.data == NULL) {[m
[31m-            goto nomem;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(tctx->client_addr_text.data, r->connection->addr_text.data,[m
[31m-                   r->connection->addr_text.len);[m
[31m-        tctx->client_addr_text.len = r->connection->addr_text.len;[m
[31m-[m
[31m-    } else {[m
[31m-        tctx->client_addr_text.len = 0;[m
[31m-        tctx->client_addr_text.data = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx && ctx->vm_state) {[m
[31m-        tctx->vm_state = ctx->vm_state;[m
[31m-        tctx->vm_state->count++;[m
[31m-[m
[31m-    } else {[m
[31m-        tctx->vm_state = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ev->handler = ngx_http_lua_timer_handler;[m
[31m-    ev->data = tctx;[m
[31m-    ev->log = ngx_cycle->log;[m
[31m-[m
[31m-    lmcf->pending_timers++;[m
[31m-[m
[31m-    ngx_add_timer(ev, delay);[m
[31m-[m
[31m-    lua_pushinteger(L, 1);[m
[31m-    return 1;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    if (tctx && tctx->pool) {[m
[31m-        ngx_destroy_pool(tctx->pool);[m
[31m-    }[m
[31m-[m
[31m-    if (ev) {[m
[31m-        ngx_free(ev);[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    luaL_unref(L, -1, co_ref);[m
[31m-[m
[31m-    return luaL_error(L, "no memory");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_timer_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    int                      n;[m
[31m-    lua_State               *L;[m
[31m-    ngx_int_t                rc;[m
[31m-    ngx_connection_t        *c = NULL;[m
[31m-    ngx_http_request_t      *r = NULL;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-    ngx_http_cleanup_t      *cln;[m
[31m-    ngx_pool_cleanup_t      *pcln;[m
[31m-[m
[31m-    ngx_http_lua_timer_ctx_t         tctx;[m
[31m-    ngx_http_lua_main_conf_t        *lmcf;[m
[31m-    ngx_http_core_loc_conf_t        *clcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua ngx.timer expired");[m
[31m-[m
[31m-    ngx_memcpy(&tctx, ev->data, sizeof(ngx_http_lua_timer_ctx_t));[m
[31m-    ngx_free(ev);[m
[31m-[m
[31m-    lmcf = tctx.lmcf;[m
[31m-[m
[31m-    lmcf->pending_timers--;[m
[31m-[m
[31m-    if (lmcf->running_timers >= lmcf->max_running_timers) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "%i lua_max_running_timers are not enough",[m
[31m-                      lmcf->max_running_timers);[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_http_lua_create_fake_connection(tctx.pool);[m
[31m-    if (c == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c->log->handler = ngx_http_lua_log_timer_error;[m
[31m-    c->log->data = c;[m
[31m-[m
[31m-    c->listening = tctx.listening;[m
[31m-    c->addr_text = tctx.client_addr_text;[m
[31m-[m
[31m-    r = ngx_http_lua_create_fake_request(c);[m
[31m-    if (r == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    r->main_conf = tctx.main_conf;[m
[31m-    r->srv_conf = tctx.srv_conf;[m
[31m-    r->loc_conf = tctx.loc_conf;[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1003014[m
[31m-[m
[31m-#   if nginx_version >= 1009000[m
[31m-[m
[31m-    ngx_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-    ngx_http_set_connection_log(r->connection, clcf->error_log);[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-    c->log->file = clcf->error_log->file;[m
[31m-[m
[31m-    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {[m
[31m-        c->log->log_level = clcf->error_log->log_level;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    dd("lmcf: %p", lmcf);[m
[31m-[m
[31m-    ctx = ngx_http_lua_create_ctx(r);[m
[31m-    if (ctx == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (tctx.vm_state) {[m
[31m-        ctx->vm_state = tctx.vm_state;[m
[31m-[m
[31m-        pcln = ngx_pool_cleanup_add(r->pool, 0);[m
[31m-        if (pcln == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        pcln->handler = ngx_http_lua_cleanup_vm;[m
[31m-        pcln->data = tctx.vm_state;[m
[31m-    }[m
[31m-[m
[31m-    ctx->cur_co_ctx = &ctx->entry_co_ctx;[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    cln = ngx_http_cleanup_add(r, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    cln->handler = ngx_http_lua_request_cleanup_handler;[m
[31m-    cln->data = ctx;[m
[31m-    ctx->cleanup = &cln->handler;[m
[31m-[m
[31m-    ctx->entered_content_phase = 1;[m
[31m-    ctx->context = NGX_HTTP_LUA_CONTEXT_TIMER;[m
[31m-[m
[31m-    r->read_event_handler = ngx_http_block_reading;[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_ref = tctx.co_ref;[m
[31m-    ctx->cur_co_ctx->co = tctx.co;[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-    dd("r connection: %p, log %p", r->connection, r->connection->log);[m
[31m-[m
[31m-    /*  save the request in coroutine globals table */[m
[31m-    ngx_http_lua_set_req(tctx.co, r);[m
[31m-[m
[31m-    lmcf->running_timers++;[m
[31m-[m
[31m-    lua_pushboolean(tctx.co, tctx.premature);[m
[31m-[m
[31m-    n = lua_gettop(tctx.co);[m
[31m-    if (n > 2) {[m
[31m-        lua_insert(tctx.co, 2);[m
[31m-    }[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    ctx->cur_co_ctx->co_top = 1;[m
[31m-#endif[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(L, r, ctx, n - 1);[m
[31m-[m
[31m-    dd("timer lua run thread: %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-        /* do nothing */[m
[31m-[m
[31m-    } else if (rc == NGX_AGAIN) {[m
[31m-        rc = ngx_http_lua_content_run_posted_threads(L, r, ctx, 0);[m
[31m-[m
[31m-    } else if (rc == NGX_DONE) {[m
[31m-        rc = ngx_http_lua_content_run_posted_threads(L, r, ctx, 1);[m
[31m-[m
[31m-    } else {[m
[31m-        rc = NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_finalize_request(r, rc);[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    if (tctx.co_ref && tctx.co) {[m
[31m-        lua_pushlightuserdata(tctx.co, &ngx_http_lua_coroutines_key);[m
[31m-        lua_rawget(tctx.co, LUA_REGISTRYINDEX);[m
[31m-        luaL_unref(tctx.co, -1, tctx.co_ref);[m
[31m-        lua_settop(tctx.co, 0);[m
[31m-    }[m
[31m-[m
[31m-    if (tctx.vm_state) {[m
[31m-        ngx_http_lua_cleanup_vm(tctx.vm_state);[m
[31m-    }[m
[31m-[m
[31m-    if (c) {[m
[31m-        ngx_http_lua_close_fake_connection(c);[m
[31m-[m
[31m-    } else if (tctx.pool) {[m
[31m-        ngx_destroy_pool(tctx.pool);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static u_char *[m
[31m-ngx_http_lua_log_timer_error(ngx_log_t *log, u_char *buf, size_t len)[m
[31m-{[m
[31m-    u_char              *p;[m
[31m-    ngx_connection_t    *c;[m
[31m-[m
[31m-    if (log->action) {[m
[31m-        p = ngx_snprintf(buf, len, " while %s", log->action);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    c = log->data;[m
[31m-[m
[31m-    dd("ctx = %p", c);[m
[31m-[m
[31m-    p = ngx_snprintf(buf, len, ", context: ngx.timer");[m
[31m-    len -= p - buf;[m
[31m-    buf = p;[m
[31m-[m
[31m-    if (c->addr_text.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", client: %V", &c->addr_text);[m
[31m-        len -= p - buf;[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    if (c && c->listening && c->listening->addr_text.len) {[m
[31m-        p = ngx_snprintf(buf, len, ", server: %V", &c->listening->addr_text);[m
[31m-        /* len -= p - buf; */[m
[31m-        buf = p;[m
[31m-    }[m
[31m-[m
[31m-    return buf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_abort_pending_timers(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_int_t                    i, n;[m
[31m-    ngx_event_t                **events;[m
[31m-    ngx_connection_t            *c, *saved_c = NULL;[m
[31m-    ngx_rbtree_node_t           *cur, *prev, *next, *sentinel, *temp;[m
[31m-    ngx_http_lua_timer_ctx_t    *tctx;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua abort pending timers");[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    lmcf = c->data;[m
[31m-[m
[31m-    dd("lua connection fd: %d", (int) c->fd);[m
[31m-[m
[31m-    if (!c->close) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    c->read->closed = 1;[m
[31m-    c->write->closed = 1;[m
[31m-[m
[31m-    /* we temporarily use a valid fd (0) to make ngx_free_connection happy */[m
[31m-[m
[31m-    c->fd = 0;[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        saved_c = ngx_cycle->files[0];[m
[31m-    }[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        ngx_cycle->files[0] = saved_c;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->pending_timers == 0) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* expire pending timers immediately */[m
[31m-[m
[31m-    sentinel = ngx_event_timer_rbtree.sentinel;[m
[31m-[m
[31m-    cur = ngx_event_timer_rbtree.root;[m
[31m-[m
[31m-    /* XXX nginx does not guarentee the parent of root is meaningful,[m
[31m-     * so we temporarily override it to simplify tree traversal. */[m
[31m-    temp = cur->parent;[m
[31m-    cur->parent = NULL;[m
[31m-[m
[31m-    prev = NULL;[m
[31m-[m
[31m-    events = ngx_pcalloc(ngx_cycle->pool,[m
[31m-                         lmcf->pending_timers * sizeof(ngx_event_t));[m
[31m-    if (events == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    dd("root: %p, root parent: %p, sentinel: %p", cur, cur->parent, sentinel);[m
[31m-[m
[31m-    while (n < lmcf->pending_timers) {[m
[31m-        if  (cur == sentinel || cur == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                          "lua pending timer counter got out of sync: %i",[m
[31m-                          lmcf->pending_timers);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        dd("prev: %p, cur: %p, cur parent: %p, cur left: %p, cur right: %p",[m
[31m-           prev, cur, cur->parent, cur->left, cur->right);[m
[31m-[m
[31m-        if (prev == cur->parent) {[m
[31m-            /* neither of the children has been accessed yet */[m
[31m-[m
[31m-            next = cur->left;[m
[31m-            if (next == sentinel) {[m
[31m-                ev = (ngx_event_t *)[m
[31m-                    ((char *) cur - offsetof(ngx_event_t, timer));[m
[31m-[m
[31m-                if (ev->handler == ngx_http_lua_timer_handler) {[m
[31m-                    dd("found node: %p", cur);[m
[31m-                    events[n++] = ev;[m
[31m-                }[m
[31m-[m
[31m-                next = (cur->right != sentinel) ? cur->right : cur->parent;[m
[31m-            }[m
[31m-[m
[31m-        } else if (prev == cur->left) {[m
[31m-            /* just accessed the left child */[m
[31m-[m
[31m-            ev = (ngx_event_t *)[m
[31m-                ((char *) cur - offsetof(ngx_event_t, timer));[m
[31m-[m
[31m-            if (ev->handler == ngx_http_lua_timer_handler) {[m
[31m-                dd("found node 2: %p", cur);[m
[31m-                events[n++] = ev;[m
[31m-            }[m
[31m-[m
[31m-            next = (cur->right != sentinel) ? cur->right : cur->parent;[m
[31m-[m
[31m-        } else if (prev == cur->right) {[m
[31m-            /* already accessed both children */[m
[31m-            next = cur->parent;[m
[31m-[m
[31m-        } else {[m
[31m-            /* not reacheable */[m
[31m-            next = NULL;[m
[31m-        }[m
[31m-[m
[31m-        prev = cur;[m
[31m-        cur = next;[m
[31m-    }[m
[31m-[m
[31m-    /* restore the old tree root's parent */[m
[31m-    ngx_event_timer_rbtree.root->parent = temp;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                   "lua found %i pending timers to be aborted prematurely",[m
[31m-                   n);[m
[31m-[m
[31m-    for (i = 0; i < n; i++) {[m
[31m-        ev = events[i];[m
[31m-[m
[31m-        ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-        ev->timer.left = NULL;[m
[31m-        ev->timer.right = NULL;[m
[31m-        ev->timer.parent = NULL;[m
[31m-#endif[m
[31m-[m
[31m-        ev->timer_set = 0;[m
[31m-[m
[31m-        ev->timedout = 1;[m
[31m-[m
[31m-        tctx = ev->data;[m
[31m-        tctx->premature = 1;[m
[31m-[m
[31m-        dd("calling timer handler prematurely");[m
[31m-        ev->handler(ev);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (pending_timers) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,[m
[31m-                      "lua pending timer counter got out of sync: %i",[m
[31m-                      pending_timers);[m
[31m-    }[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_timer.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_timer.h[m
[1mdeleted file mode 100644[m
[1mindex 0addb18..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_timer.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_TIMER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_TIMER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_timer_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_TIMER_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uri.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uri.c[m
[1mdeleted file mode 100644[m
[1mindex 3559b5c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uri.c[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_uri.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_req_set_uri(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_uri_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_req_set_uri);[m
[31m-    lua_setfield(L, -2, "set_uri");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_req_set_uri(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    size_t                       len;[m
[31m-    u_char                      *p;[m
[31m-    int                          n;[m
[31m-    int                          jump = 0;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    if (n != 1 && n != 2) {[m
[31m-        return luaL_error(L, "expecting 1 or 2 arguments but seen %d", n);[m
[31m-    }[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    p = (u_char *) luaL_checklstring(L, 1, &len);[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return luaL_error(L, "attempt to use zero-length uri");[m
[31m-    }[m
[31m-[m
[31m-    if (n == 2) {[m
[31m-[m
[31m-        luaL_checktype(L, 2, LUA_TBOOLEAN);[m
[31m-        jump = lua_toboolean(L, 2);[m
[31m-[m
[31m-        if (jump) {[m
[31m-[m
[31m-            ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-            if (ctx == NULL) {[m
[31m-                return luaL_error(L, "no ctx found");[m
[31m-            }[m
[31m-[m
[31m-            dd("rewrite: %d, access: %d, content: %d",[m
[31m-               (int) ctx->entered_rewrite_phase,[m
[31m-               (int) ctx->entered_access_phase,[m
[31m-               (int) ctx->entered_content_phase);[m
[31m-[m
[31m-            ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE);[m
[31m-[m
[31m-            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua set uri jump to \"%*s\"", len, p);[m
[31m-[m
[31m-            ngx_http_lua_check_if_abortable(L, ctx);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    r->uri.data = ngx_palloc(r->pool, len);[m
[31m-    if (r->uri.data == NULL) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(r->uri.data, p, len);[m
[31m-[m
[31m-    r->uri.len = len;[m
[31m-[m
[31m-    r->internal = 1;[m
[31m-    r->valid_unparsed_uri = 0;[m
[31m-[m
[31m-    ngx_http_set_exten(r);[m
[31m-[m
[31m-    if (jump) {[m
[31m-        r->uri_changed = 1;[m
[31m-[m
[31m-        return lua_yield(L, 0);[m
[31m-    }[m
[31m-[m
[31m-    r->valid_location = 0;[m
[31m-    r->uri_changed = 0;[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uri.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uri.h[m
[1mdeleted file mode 100644[m
[1mindex 9c6e066..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uri.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_URI_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_URI_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_req_uri_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_URI_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uthread.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uthread.c[m
[1mdeleted file mode 100644[m
[1mindex 8195ec0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uthread.c[m
[1m+++ /dev/null[m
[36m@@ -1,285 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_uthread.h"[m
[31m-#include "ngx_http_lua_coroutine.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-[m
[31m-[m
[31m-#if 1[m
[31m-#undef ngx_http_lua_probe_info[m
[31m-#define ngx_http_lua_probe_info(msg)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_uthread_spawn(lua_State *L);[m
[31m-static int ngx_http_lua_uthread_wait(lua_State *L);[m
[31m-static int ngx_http_lua_uthread_kill(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_uthread_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    /* new thread table */[m
[31m-    lua_createtable(L, 0 /* narr */, 3 /* nrec */);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_uthread_spawn);[m
[31m-    lua_setfield(L, -2, "spawn");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_uthread_wait);[m
[31m-    lua_setfield(L, -2, "wait");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_uthread_kill);[m
[31m-    lua_setfield(L, -2, "kill");[m
[31m-[m
[31m-    lua_setfield(L, -2, "thread");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_uthread_spawn(lua_State *L)[m
[31m-{[m
[31m-    int                           n;[m
[31m-    ngx_http_request_t           *r;[m
[31m-    ngx_http_lua_ctx_t           *ctx;[m
[31m-    ngx_http_lua_co_ctx_t        *coctx = NULL;[m
[31m-[m
[31m-    n = lua_gettop(L);[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_coroutine_create_helper(L, r, ctx, &coctx);[m
[31m-[m
[31m-    /* anchor the newly created coroutine into the Lua registry */[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-    lua_pushvalue(L, -2);[m
[31m-    coctx->co_ref = luaL_ref(L, -2);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    if (n > 1) {[m
[31m-        lua_replace(L, 1);[m
[31m-        lua_xmove(L, coctx->co, n - 1);[m
[31m-    }[m
[31m-[m
[31m-    coctx->is_uthread = 1;[m
[31m-    ctx->uthreads++;[m
[31m-[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-    ctx->co_op = NGX_HTTP_LUA_USER_THREAD_RESUME;[m
[31m-[m
[31m-    ctx->cur_co_ctx->thread_spawn_yielded = 1;[m
[31m-[m
[31m-    if (ngx_http_lua_post_thread(r, ctx, ctx->cur_co_ctx) != NGX_OK) {[m
[31m-        return luaL_error(L, "no memory");[m
[31m-    }[m
[31m-[m
[31m-    coctx->parent_co_ctx = ctx->cur_co_ctx;[m
[31m-    ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-    ngx_http_lua_probe_user_thread_spawn(r, L, coctx->co);[m
[31m-[m
[31m-    dd("yielding with arg %s, top=%d, index-1:%s", luaL_typename(L, -1),[m
[31m-       (int) lua_gettop(L), luaL_typename(L, 1));[m
[31m-    return lua_yield(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_uthread_wait(lua_State *L)[m
[31m-{[m
[31m-    int                          i, nargs, nrets;[m
[31m-    lua_State                   *sub_co;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx, *sub_coctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    nargs = lua_gettop(L);[m
[31m-[m
[31m-    for (i = 1; i <= nargs; i++) {[m
[31m-        sub_co = lua_tothread(L, i);[m
[31m-[m
[31m-        luaL_argcheck(L, sub_co, i, "lua thread expected");[m
[31m-[m
[31m-        sub_coctx = ngx_http_lua_get_co_ctx(sub_co, ctx);[m
[31m-        if (sub_coctx == NULL) {[m
[31m-            return luaL_error(L, "no co ctx found");[m
[31m-        }[m
[31m-[m
[31m-        if (!sub_coctx->is_uthread) {[m
[31m-            return luaL_error(L, "attempt to wait on a coroutine that is "[m
[31m-                              "not a user thread");[m
[31m-        }[m
[31m-[m
[31m-        if (sub_coctx->parent_co_ctx != coctx) {[m
[31m-            return luaL_error(L, "only the parent coroutine can wait on the "[m
[31m-                              "thread");[m
[31m-        }[m
[31m-[m
[31m-        switch (sub_coctx->co_status) {[m
[31m-        case NGX_HTTP_LUA_CO_ZOMBIE:[m
[31m-[m
[31m-            ngx_http_lua_probe_info("found zombie child");[m
[31m-[m
[31m-            nrets = lua_gettop(sub_coctx->co);[m
[31m-[m
[31m-            dd("child retval count: %d, %s: %s", (int) nrets,[m
[31m-               luaL_typename(sub_coctx->co, -1),[m
[31m-               lua_tostring(sub_coctx->co, -1));[m
[31m-[m
[31m-            if (nrets) {[m
[31m-                lua_xmove(sub_coctx->co, L, nrets);[m
[31m-            }[m
[31m-[m
[31m-#if 1[m
[31m-            ngx_http_lua_del_thread(r, L, ctx, sub_coctx);[m
[31m-            ctx->uthreads--;[m
[31m-#endif[m
[31m-[m
[31m-            return nrets;[m
[31m-[m
[31m-        case NGX_HTTP_LUA_CO_DEAD:[m
[31m-            dd("uthread already waited: %p (parent %p)", sub_coctx,[m
[31m-               coctx);[m
[31m-[m
[31m-            if (i < nargs) {[m
[31m-                /* just ignore it if it is not the last one */[m
[31m-                continue;[m
[31m-            }[m
[31m-[m
[31m-            /* being the last one */[m
[31m-            lua_pushnil(L);[m
[31m-            lua_pushliteral(L, "already waited or killed");[m
[31m-            return 2;[m
[31m-[m
[31m-        default:[m
[31m-            dd("uthread %p still alive, status: %d, parent %p", sub_coctx,[m
[31m-               sub_coctx->co_status, coctx);[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_probe_user_thread_wait(L, sub_coctx->co);[m
[31m-        sub_coctx->waited_by_parent = 1;[m
[31m-    }[m
[31m-[m
[31m-    return lua_yield(L, 0);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_uthread_kill(lua_State *L)[m
[31m-{[m
[31m-    lua_State                   *sub_co;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx, *sub_coctx;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request found");[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "no request ctx found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_ACCESS[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_CONTENT[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_TIMER[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_SSL_CERT);[m
[31m-[m
[31m-    coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-    sub_co = lua_tothread(L, 1);[m
[31m-    luaL_argcheck(L, sub_co, 1, "lua thread expected");[m
[31m-[m
[31m-    sub_coctx = ngx_http_lua_get_co_ctx(sub_co, ctx);[m
[31m-[m
[31m-    if (sub_coctx == NULL) {[m
[31m-        return luaL_error(L, "no co ctx found");[m
[31m-    }[m
[31m-[m
[31m-    if (!sub_coctx->is_uthread) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "not user thread");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (sub_coctx->parent_co_ctx != coctx) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "killer not parent");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (sub_coctx->pending_subreqs > 0) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "pending subrequests");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    switch (sub_coctx->co_status) {[m
[31m-    case NGX_HTTP_LUA_CO_ZOMBIE:[m
[31m-        ngx_http_lua_del_thread(r, L, ctx, sub_coctx);[m
[31m-        ctx->uthreads--;[m
[31m-[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "already terminated");[m
[31m-        return 2;[m
[31m-[m
[31m-    case NGX_HTTP_LUA_CO_DEAD:[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "already waited or killed");[m
[31m-        return 2;[m
[31m-[m
[31m-    default:[m
[31m-        ngx_http_lua_cleanup_pending_operation(sub_coctx);[m
[31m-        ngx_http_lua_del_thread(r, L, ctx, sub_coctx);[m
[31m-        ctx->uthreads--;[m
[31m-[m
[31m-        lua_pushinteger(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    /* not reacheable */[m
[31m-}[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uthread.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uthread.h[m
[1mdeleted file mode 100644[m
[1mindex 9c3e2d4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_uthread.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_UTHREAD_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_UTHREAD_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_is_thread(ctx)                                          \[m
[31m-    ((ctx)->cur_co_ctx->is_uthread || (ctx)->cur_co_ctx == &(ctx)->entry_co_ctx)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_is_entry_thread(ctx)                                    \[m
[31m-    ((ctx)->cur_co_ctx == &(ctx)->entry_co_ctx)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_entry_thread_alive(ctx)                                 \[m
[31m-    ((ctx)->entry_co_ctx.co_ref != LUA_NOREF)[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_coroutine_alive(coctx)                                  \[m
[31m-    ((coctx)->co_status != NGX_HTTP_LUA_CO_DEAD                              \[m
[31m-     && (coctx)->co_status != NGX_HTTP_LUA_CO_ZOMBIE)[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_uthread_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_UTHREAD_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_util.c[m
[1mdeleted file mode 100644[m
[1mindex 1bd1388..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,4100 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "nginx.h"[m
[31m-#include "ngx_http_lua_directive.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-#include "ngx_http_lua_exception.h"[m
[31m-#include "ngx_http_lua_pcrefix.h"[m
[31m-#include "ngx_http_lua_regex.h"[m
[31m-#include "ngx_http_lua_args.h"[m
[31m-#include "ngx_http_lua_uri.h"[m
[31m-#include "ngx_http_lua_req_body.h"[m
[31m-#include "ngx_http_lua_headers.h"[m
[31m-#include "ngx_http_lua_output.h"[m
[31m-#include "ngx_http_lua_time.h"[m
[31m-#include "ngx_http_lua_control.h"[m
[31m-#include "ngx_http_lua_ndk.h"[m
[31m-#include "ngx_http_lua_subrequest.h"[m
[31m-#include "ngx_http_lua_log.h"[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_string.h"[m
[31m-#include "ngx_http_lua_misc.h"[m
[31m-#include "ngx_http_lua_consts.h"[m
[31m-#include "ngx_http_lua_req_method.h"[m
[31m-#include "ngx_http_lua_shdict.h"[m
[31m-#include "ngx_http_lua_coroutine.h"[m
[31m-#include "ngx_http_lua_socket_tcp.h"[m
[31m-#include "ngx_http_lua_socket_udp.h"[m
[31m-#include "ngx_http_lua_sleep.h"[m
[31m-#include "ngx_http_lua_setby.h"[m
[31m-#include "ngx_http_lua_headerfilterby.h"[m
[31m-#include "ngx_http_lua_bodyfilterby.h"[m
[31m-#include "ngx_http_lua_logby.h"[m
[31m-#include "ngx_http_lua_phase.h"[m
[31m-#include "ngx_http_lua_probe.h"[m
[31m-#include "ngx_http_lua_uthread.h"[m
[31m-#include "ngx_http_lua_contentby.h"[m
[31m-#include "ngx_http_lua_timer.h"[m
[31m-#include "ngx_http_lua_config.h"[m
[31m-#include "ngx_http_lua_worker.h"[m
[31m-#include "ngx_http_lua_socket_tcp.h"[m
[31m-#include "ngx_http_lua_ssl_certby.h"[m
[31m-[m
[31m-[m
[31m-#if 1[m
[31m-#undef ngx_http_lua_probe_info[m
[31m-#define ngx_http_lua_probe_info(msg)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_BT_DEPTH[m
[31m-#define NGX_HTTP_LUA_BT_DEPTH  22[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_LUA_BT_MAX_COROS[m
[31m-#define NGX_HTTP_LUA_BT_MAX_COROS  5[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-char ngx_http_lua_code_cache_key;[m
[31m-char ngx_http_lua_regex_cache_key;[m
[31m-char ngx_http_lua_socket_pool_key;[m
[31m-char ngx_http_lua_coroutines_key;[m
[31m-char ngx_http_lua_headers_metatable_key;[m
[31m-[m
[31m-[m
[31m-ngx_uint_t  ngx_http_lua_location_hash = 0;[m
[31m-ngx_uint_t  ngx_http_lua_content_length_hash = 0;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_send_http10_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static void ngx_http_lua_init_registry(lua_State *L, ngx_log_t *log);[m
[31m-static void ngx_http_lua_init_globals(lua_State *L, ngx_cycle_t *cycle,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log);[m
[31m-static void ngx_http_lua_set_path(ngx_cycle_t *cycle, lua_State *L, int tab_idx,[m
[31m-    const char *fieldname, const char *path, const char *default_path,[m
[31m-    ngx_log_t *log);[m
[31m-static ngx_int_t ngx_http_lua_handle_exec(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_lua_handle_exit(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static ngx_int_t ngx_http_lua_handle_rewrite_jump(lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx);[m
[31m-static int ngx_http_lua_thread_traceback(lua_State *L, lua_State *co,[m
[31m-    ngx_http_lua_co_ctx_t *coctx);[m
[31m-static void ngx_http_lua_inject_ngx_api(lua_State *L,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log);[m
[31m-static void ngx_http_lua_inject_arg_api(lua_State *L);[m
[31m-static int ngx_http_lua_param_get(lua_State *L);[m
[31m-static int ngx_http_lua_param_set(lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_output_filter(ngx_http_request_t *r,[m
[31m-    ngx_chain_t *in);[m
[31m-static ngx_int_t ngx_http_lua_send_special(ngx_http_request_t *r,[m
[31m-    ngx_uint_t flags);[m
[31m-static void ngx_http_lua_finalize_threads(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, lua_State *L);[m
[31m-static ngx_int_t ngx_http_lua_post_zombie_thread(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_co_ctx_t *parent, ngx_http_lua_co_ctx_t *thread);[m
[31m-static void ngx_http_lua_cleanup_zombie_child_uthreads(ngx_http_request_t *r,[m
[31m-    lua_State *L, ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx);[m
[31m-static ngx_int_t ngx_http_lua_on_abort_resume(ngx_http_request_t *r);[m
[31m-static void ngx_http_lua_close_fake_request(ngx_http_request_t *r);[m
[31m-static ngx_int_t ngx_http_lua_flush_pending_output(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static ngx_int_t[m
[31m-    ngx_http_lua_process_flushing_coroutines(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-static lua_State *ngx_http_lua_new_state(lua_State *parent_vm,[m
[31m-    ngx_cycle_t *cycle, ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log);[m
[31m-static int ngx_http_lua_get_raw_phase_context(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#ifndef LUA_PATH_SEP[m
[31m-#define LUA_PATH_SEP ";"[m
[31m-#endif[m
[31m-[m
[31m-#define AUX_MARK "\1"[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_set_path(ngx_cycle_t *cycle, lua_State *L, int tab_idx,[m
[31m-    const char *fieldname, const char *path, const char *default_path,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    const char          *tmp_path;[m
[31m-    const char          *prefix;[m
[31m-[m
[31m-    /* XXX here we use some hack to simplify string manipulation */[m
[31m-    tmp_path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,[m
[31m-                         LUA_PATH_SEP AUX_MARK LUA_PATH_SEP);[m
[31m-[m
[31m-    lua_pushlstring(L, (char *) cycle->prefix.data, cycle->prefix.len);[m
[31m-    prefix = lua_tostring(L, -1);[m
[31m-    tmp_path = luaL_gsub(L, tmp_path, "$prefix", prefix);[m
[31m-    tmp_path = luaL_gsub(L, tmp_path, "${prefix}", prefix);[m
[31m-    lua_pop(L, 3);[m
[31m-[m
[31m-    dd("tmp_path path: %s", tmp_path);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    tmp_path =[m
[31m-#else[m
[31m-    (void)[m
[31m-#endif[m
[31m-        luaL_gsub(L, tmp_path, AUX_MARK, default_path);[m
[31m-[m
[31m-#if (NGX_DEBUG)[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua setting lua package.%s to \"%s\"", fieldname, tmp_path);[m
[31m-#endif[m
[31m-[m
[31m-    lua_remove(L, -2);[m
[31m-[m
[31m-    /* fix negative index as there's new data on stack */[m
[31m-    tab_idx = (tab_idx < 0) ? (tab_idx - 1) : tab_idx;[m
[31m-    lua_setfield(L, tab_idx, fieldname);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Create new table and set _G field to itself.[m
[31m- *[m
[31m- * After:[m
[31m- *         | new table | <- top[m
[31m- *         |    ...    |[m
[31m- * */[m
[31m-void[m
[31m-ngx_http_lua_create_new_globals_table(lua_State *L, int narr, int nrec)[m
[31m-{[m
[31m-    lua_createtable(L, narr, nrec + 1);[m
[31m-    lua_pushvalue(L, -1);[m
[31m-    lua_setfield(L, -2, "_G");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static lua_State *[m
[31m-ngx_http_lua_new_state(lua_State *parent_vm, ngx_cycle_t *cycle,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log)[m
[31m-{[m
[31m-    lua_State       *L;[m
[31m-    const char      *old_path;[m
[31m-    const char      *new_path;[m
[31m-    size_t           old_path_len;[m
[31m-    const char      *old_cpath;[m
[31m-    const char      *new_cpath;[m
[31m-    size_t           old_cpath_len;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "lua creating new vm state");[m
[31m-[m
[31m-    L = luaL_newstate();[m
[31m-    if (L == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    luaL_openlibs(L);[m
[31m-[m
[31m-    lua_getglobal(L, "package");[m
[31m-[m
[31m-    if (!lua_istable(L, -1)) {[m
[31m-        ngx_log_error(NGX_LOG_EMERG, log, 0,[m
[31m-                      "the \"package\" table does not exist");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (parent_vm) {[m
[31m-        lua_getglobal(parent_vm, "package");[m
[31m-        lua_getfield(parent_vm, -1, "path");[m
[31m-        old_path = lua_tolstring(parent_vm, -1, &old_path_len);[m
[31m-        lua_pop(parent_vm, 1);[m
[31m-[m
[31m-        lua_pushlstring(L, old_path, old_path_len);[m
[31m-        lua_setfield(L, -2, "path");[m
[31m-[m
[31m-        lua_getfield(parent_vm, -1, "cpath");[m
[31m-        old_path = lua_tolstring(parent_vm, -1, &old_path_len);[m
[31m-        lua_pop(parent_vm, 2);[m
[31m-[m
[31m-        lua_pushlstring(L, old_path, old_path_len);[m
[31m-        lua_setfield(L, -2, "cpath");[m
[31m-[m
[31m-    } else {[m
[31m-#ifdef LUA_DEFAULT_PATH[m
[31m-#   define LUA_DEFAULT_PATH_LEN (sizeof(LUA_DEFAULT_PATH) - 1)[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "lua prepending default package.path with %s",[m
[31m-                       LUA_DEFAULT_PATH);[m
[31m-[m
[31m-        lua_pushliteral(L, LUA_DEFAULT_PATH ";"); /* package default */[m
[31m-        lua_getfield(L, -2, "path"); /* package default old */[m
[31m-        old_path = lua_tolstring(L, -1, &old_path_len);[m
[31m-        lua_concat(L, 2); /* package new */[m
[31m-        lua_setfield(L, -2, "path"); /* package */[m
[31m-#endif[m
[31m-[m
[31m-#ifdef LUA_DEFAULT_CPATH[m
[31m-#   define LUA_DEFAULT_CPATH_LEN (sizeof(LUA_DEFAULT_CPATH) - 1)[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "lua prepending default package.cpath with %s",[m
[31m-                       LUA_DEFAULT_CPATH);[m
[31m-[m
[31m-        lua_pushliteral(L, LUA_DEFAULT_CPATH ";"); /* package default */[m
[31m-        lua_getfield(L, -2, "cpath"); /* package default old */[m
[31m-        old_cpath = lua_tolstring(L, -1, &old_cpath_len);[m
[31m-        lua_concat(L, 2); /* package new */[m
[31m-        lua_setfield(L, -2, "cpath"); /* package */[m
[31m-#endif[m
[31m-[m
[31m-        if (lmcf->lua_path.len != 0) {[m
[31m-            lua_getfield(L, -1, "path"); /* get original package.path */[m
[31m-            old_path = lua_tolstring(L, -1, &old_path_len);[m
[31m-[m
[31m-            dd("old path: %s", old_path);[m
[31m-[m
[31m-            lua_pushlstring(L, (char *) lmcf->lua_path.data,[m
[31m-                            lmcf->lua_path.len);[m
[31m-            new_path = lua_tostring(L, -1);[m
[31m-[m
[31m-            ngx_http_lua_set_path(cycle, L, -3, "path", new_path, old_path,[m
[31m-                                  log);[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-        }[m
[31m-[m
[31m-        if (lmcf->lua_cpath.len != 0) {[m
[31m-            lua_getfield(L, -1, "cpath"); /* get original package.cpath */[m
[31m-            old_cpath = lua_tolstring(L, -1, &old_cpath_len);[m
[31m-[m
[31m-            dd("old cpath: %s", old_cpath);[m
[31m-[m
[31m-            lua_pushlstring(L, (char *) lmcf->lua_cpath.data,[m
[31m-                            lmcf->lua_cpath.len);[m
[31m-            new_cpath = lua_tostring(L, -1);[m
[31m-[m
[31m-            ngx_http_lua_set_path(cycle, L, -3, "cpath", new_cpath, old_cpath,[m
[31m-                                  log);[m
[31m-[m
[31m-[m
[31m-            lua_pop(L, 2);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    lua_pop(L, 1); /* remove the "package" table */[m
[31m-[m
[31m-    ngx_http_lua_init_registry(L, log);[m
[31m-    ngx_http_lua_init_globals(L, cycle, lmcf, log);[m
[31m-[m
[31m-    return L;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-lua_State *[m
[31m-ngx_http_lua_new_thread(ngx_http_request_t *r, lua_State *L, int *ref)[m
[31m-{[m
[31m-    int              base;[m
[31m-    lua_State       *co;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua creating new thread");[m
[31m-[m
[31m-    base = lua_gettop(L);[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    co = lua_newthread(L);[m
[31m-[m
[31m-    /*  {{{ inherit coroutine's globals to main thread's globals table[m
[31m-     *  for print() function will try to find tostring() in current[m
[31m-     *  globals table.[m
[31m-     */[m
[31m-    /*  new globals table for coroutine */[m
[31m-    ngx_http_lua_create_new_globals_table(co, 0, 0);[m
[31m-[m
[31m-    lua_createtable(co, 0, 1);[m
[31m-    ngx_http_lua_get_globals_table(co);[m
[31m-    lua_setfield(co, -2, "__index");[m
[31m-    lua_setmetatable(co, -2);[m
[31m-[m
[31m-    ngx_http_lua_set_globals_table(co);[m
[31m-    /*  }}} */[m
[31m-[m
[31m-    *ref = luaL_ref(L, -2);[m
[31m-[m
[31m-    if (*ref == LUA_NOREF) {[m
[31m-        lua_settop(L, base);  /* restore main thread stack */[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    lua_settop(L, base);[m
[31m-    return co;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_del_thread(ngx_http_request_t *r, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    if (coctx->co_ref == LUA_NOREF) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua deleting light thread");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    ngx_http_lua_probe_thread_delete(r, coctx->co, ctx);[m
[31m-[m
[31m-    luaL_unref(L, -1, coctx->co_ref);[m
[31m-    coctx->co_ref = LUA_NOREF;[m
[31m-    coctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    lua_pop(L, 1);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_lua_rebase_path(ngx_pool_t *pool, u_char *src, size_t len)[m
[31m-{[m
[31m-    u_char            *p, *dst;[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (src[0] == '/') {[m
[31m-        /* being an absolute path already */[m
[31m-        dst = ngx_palloc(pool, len + 1);[m
[31m-        if (dst == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        p = ngx_copy(dst, src, len);[m
[31m-[m
[31m-        *p = '\0';[m
[31m-[m
[31m-        return dst;[m
[31m-    }[m
[31m-[m
[31m-    dst = ngx_palloc(pool, ngx_cycle->prefix.len + len + 1);[m
[31m-    if (dst == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    p = ngx_copy(dst, ngx_cycle->prefix.data, ngx_cycle->prefix.len);[m
[31m-    p = ngx_copy(p, src, len);[m
[31m-[m
[31m-    *p = '\0';[m
[31m-[m
[31m-    return dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_send_header_if_needed(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-[m
[31m-    dd("send header if needed: %d", r->header_sent || ctx->header_sent);[m
[31m-[m
[31m-    if (!r->header_sent && !ctx->header_sent) {[m
[31m-        if (r->headers_out.status == 0) {[m
[31m-            r->headers_out.status = NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (!ctx->headers_set && ngx_http_lua_set_content_type(r) != NGX_OK) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (!ctx->headers_set) {[m
[31m-            ngx_http_clear_content_length(r);[m
[31m-            ngx_http_clear_accept_ranges(r);[m
[31m-        }[m
[31m-[m
[31m-        if (!ctx->buffering) {[m
[31m-            dd("sending headers");[m
[31m-            rc = ngx_http_send_header(r);[m
[31m-            ctx->header_sent = 1;[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_send_chain_link(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx,[m
[31m-    ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t                     rc;[m
[31m-    ngx_chain_t                  *cl;[m
[31m-    ngx_chain_t                 **ll;[m
[31m-    ngx_http_lua_loc_conf_t      *llcf;[m
[31m-[m
[31m-#if 1[m
[31m-    if (ctx->acquired_raw_req_socket || ctx->eof) {[m
[31m-        dd("ctx->eof already set or raw req socket already acquired");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if ((r->method & NGX_HTTP_HEAD) && !r->header_only) {[m
[31m-        r->header_only = 1;[m
[31m-    }[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-    if (llcf->http10_buffering[m
[31m-        && !ctx->buffering[m
[31m-        && !r->header_sent[m
[31m-        && !ctx->header_sent[m
[31m-        && r->http_version < NGX_HTTP_VERSION_11[m
[31m-        && r->headers_out.content_length_n < 0)[m
[31m-    {[m
[31m-        ctx->buffering = 1;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_send_header_if_needed(r, ctx);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        ctx->eof = 1;[m
[31m-[m
[31m-        if (ctx->buffering) {[m
[31m-            return ngx_http_lua_send_http10_headers(r, ctx);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (in == NULL) {[m
[31m-        dd("last buf to be sent");[m
[31m-[m
[31m-#if 1[m
[31m-        if (!r->request_body && r == r->main) {[m
[31m-            if (ngx_http_discard_request_body(r) != NGX_OK) {[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        if (ctx->buffering) {[m
[31m-            rc = ngx_http_lua_send_http10_headers(r, ctx);[m
[31m-            if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                return rc;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->out) {[m
[31m-[m
[31m-                rc = ngx_http_lua_output_filter(r, ctx->out);[m
[31m-[m
[31m-                if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                ctx->out = NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version <= 8004[m
[31m-[m
[31m-        /* earlier versions of nginx does not allow subrequests[m
[31m-           to send last_buf themselves */[m
[31m-        if (r != r->main) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ctx->eof = 1;[m
[31m-[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua sending last buf of the response body");[m
[31m-[m
[31m-        rc = ngx_http_lua_send_special(r, NGX_HTTP_LAST);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* in != NULL */[m
[31m-[m
[31m-    if (ctx->buffering) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "lua buffering output bufs for the HTTP 1.0 request");[m
[31m-[m
[31m-        for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {[m
[31m-            ll = &cl->next;[m
[31m-        }[m
[31m-[m
[31m-        *ll = in;[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_lua_output_filter(r, in);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_send_special(ngx_http_request_t *r, ngx_uint_t flags)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_http_request_t  *ar; /* active request */[m
[31m-[m
[31m-    ar = r->connection->data;[m
[31m-[m
[31m-    if (ar != r) {[m
[31m-[m
[31m-        /* bypass ngx_http_postpone_filter_module */[m
[31m-[m
[31m-        r->connection->data = r;[m
[31m-        rc = ngx_http_send_special(r, flags);[m
[31m-        r->connection->data = ar;[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_send_special(r, flags);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_output_filter(ngx_http_request_t *r, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_int_t            rc;[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-    ngx_http_request_t  *ar; /* active request */[m
[31m-[m
[31m-    ar = r->connection->data;[m
[31m-[m
[31m-    if (ar != r) {[m
[31m-[m
[31m-        /* bypass ngx_http_postpone_filter_module */[m
[31m-[m
[31m-        r->connection->data = r;[m
[31m-        rc = ngx_http_output_filter(r, in);[m
[31m-        r->connection->data = ar;[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, in);[m
[31m-[m
[31m-    if (rc == NGX_ERROR) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-#if nginx_version >= 1001004[m
[31m-    ngx_chain_update_chains(r->pool,[m
[31m-#else[m
[31m-    ngx_chain_update_chains([m
[31m-#endif[m
[31m-                            &ctx->free_bufs, &ctx->busy_bufs, &in,[m
[31m-                            (ngx_buf_tag_t) &ngx_http_lua_module);[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_send_http10_headers(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    off_t                size;[m
[31m-    ngx_chain_t         *cl;[m
[31m-    ngx_int_t            rc;[m
[31m-[m
[31m-    if (r->header_sent || ctx->header_sent) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua sending HTTP 1.0 response headers");[m
[31m-[m
[31m-    if (r->header_only) {[m
[31m-        goto send;[m
[31m-    }[m
[31m-[m
[31m-    if (r->headers_out.content_length == NULL) {[m
[31m-        for (size = 0, cl = ctx->out; cl; cl = cl->next) {[m
[31m-            size += ngx_buf_size(cl->buf);[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_length_n = size;[m
[31m-[m
[31m-        if (r->headers_out.content_length) {[m
[31m-            r->headers_out.content_length->hash = 0;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-send:[m
[31m-[m
[31m-    rc = ngx_http_send_header(r);[m
[31m-    ctx->header_sent = 1;[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_init_registry(lua_State *L, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua initializing lua registry");[m
[31m-[m
[31m-    /* {{{ register a table to anchor lua coroutines reliably:[m
[31m-     * {([int]ref) = [cort]} */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-    lua_createtable(L, 0, 32 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-[m
[31m-    /* create the registry entry for the Lua request ctx data table */[m
[31m-    lua_pushliteral(L, ngx_http_lua_ctx_tables_key);[m
[31m-    lua_createtable(L, 0, 32 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-    /* create the registry entry for the Lua socket connection pool table */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_socket_pool_key);[m
[31m-    lua_createtable(L, 0, 8 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    /* create the registry entry for the Lua precompiled regex object cache */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);[m
[31m-    lua_createtable(L, 0, 16 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-#endif[m
[31m-[m
[31m-    /* {{{ register table to cache user code:[m
[31m-     * { [(string)cache_key] = <code closure> } */[m
[31m-    lua_pushlightuserdata(L, &ngx_http_lua_code_cache_key);[m
[31m-    lua_createtable(L, 0, 8 /* nrec */);[m
[31m-    lua_rawset(L, LUA_REGISTRYINDEX);[m
[31m-    /* }}} */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_init_globals(lua_State *L, ngx_cycle_t *cycle,[m
[31m-    ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua initializing lua globals");[m
[31m-[m
[31m-    lua_pushlightuserdata(L, cycle);[m
[31m-    lua_setglobal(L, "__ngx_cycle");[m
[31m-[m
[31m-#if defined(NDK) && NDK[m
[31m-    ngx_http_lua_inject_ndk_api(L);[m
[31m-#endif /* defined(NDK) && NDK */[m
[31m-[m
[31m-    ngx_http_lua_inject_ngx_api(L, lmcf, log);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_inject_ngx_api(lua_State *L, ngx_http_lua_main_conf_t *lmcf,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    lua_createtable(L, 0 /* narr */, 116 /* nrec */);    /* ngx.* */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_get_raw_phase_context);[m
[31m-    lua_setfield(L, -2, "_phase_ctx");[m
[31m-[m
[31m-    ngx_http_lua_inject_arg_api(L);[m
[31m-[m
[31m-    ngx_http_lua_inject_http_consts(L);[m
[31m-    ngx_http_lua_inject_core_consts(L);[m
[31m-[m
[31m-    ngx_http_lua_inject_log_api(L);[m
[31m-    ngx_http_lua_inject_output_api(L);[m
[31m-    ngx_http_lua_inject_time_api(L);[m
[31m-    ngx_http_lua_inject_string_api(L);[m
[31m-    ngx_http_lua_inject_control_api(log, L);[m
[31m-    ngx_http_lua_inject_subrequest_api(L);[m
[31m-    ngx_http_lua_inject_sleep_api(L);[m
[31m-    ngx_http_lua_inject_phase_api(L);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_lua_inject_regex_api(L);[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_lua_inject_req_api(log, L);[m
[31m-    ngx_http_lua_inject_resp_header_api(L);[m
[31m-    ngx_http_lua_create_headers_metatable(log, L);[m
[31m-    ngx_http_lua_inject_variable_api(L);[m
[31m-    ngx_http_lua_inject_shdict_api(lmcf, L);[m
[31m-    ngx_http_lua_inject_socket_tcp_api(log, L);[m
[31m-    ngx_http_lua_inject_socket_udp_api(log, L);[m
[31m-    ngx_http_lua_inject_uthread_api(log, L);[m
[31m-    ngx_http_lua_inject_timer_api(L);[m
[31m-    ngx_http_lua_inject_config_api(L);[m
[31m-    ngx_http_lua_inject_worker_api(L);[m
[31m-[m
[31m-    ngx_http_lua_inject_misc_api(L);[m
[31m-[m
[31m-    lua_getglobal(L, "package"); /* ngx package */[m
[31m-    lua_getfield(L, -1, "loaded"); /* ngx package loaded */[m
[31m-    lua_pushvalue(L, -3); /* ngx package loaded ngx */[m
[31m-    lua_setfield(L, -2, "ngx"); /* ngx package loaded */[m
[31m-    lua_pop(L, 2);[m
[31m-[m
[31m-    lua_setglobal(L, "ngx");[m
[31m-[m
[31m-    ngx_http_lua_inject_coroutine_api(log, L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in)[m
[31m-{[m
[31m-    ngx_chain_t         *cl;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        cl->buf->pos = cl->buf->last;[m
[31m-        cl->buf->file_pos = cl->buf->file_last;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_add_copy_chain(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx,[m
[31m-    ngx_chain_t ***plast, ngx_chain_t *in, ngx_int_t *eof)[m
[31m-{[m
[31m-    ngx_chain_t     *cl;[m
[31m-    size_t           len;[m
[31m-    ngx_buf_t       *b;[m
[31m-[m
[31m-    len = 0;[m
[31m-    *eof = 0;[m
[31m-[m
[31m-    for (cl = in; cl; cl = cl->next) {[m
[31m-        if (ngx_buf_in_memory(cl->buf)) {[m
[31m-            len += cl->buf->last - cl->buf->pos;[m
[31m-        }[m
[31m-[m
[31m-        if (cl->buf->last_in_chain || cl->buf->last_buf) {[m
[31m-            *eof = 1;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (len == 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, len);[m
[31m-    if (cl == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("chains get free buf: %d == %d", (int) (cl->buf->end - cl->buf->start),[m
[31m-       (int) len);[m
[31m-[m
[31m-    b = cl->buf;[m
[31m-[m
[31m-    while (in) {[m
[31m-        if (ngx_buf_in_memory(in->buf)) {[m
[31m-            b->last = ngx_copy(b->last, in->buf->pos,[m
[31m-                               in->buf->last - in->buf->pos);[m
[31m-        }[m
[31m-[m
[31m-        in = in->next;[m
[31m-    }[m
[31m-[m
[31m-    **plast = cl;[m
[31m-    *plast = &cl->next;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_reset_ctx(ngx_http_request_t *r, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua reset ctx");[m
[31m-[m
[31m-    ngx_http_lua_finalize_threads(r, ctx, L);[m
[31m-[m
[31m-#if 0[m
[31m-    if (ctx->user_co_ctx) {[m
[31m-        /* no way to destroy a list but clean up the whole pool */[m
[31m-        ctx->user_co_ctx = NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    ngx_memzero(&ctx->entry_co_ctx, sizeof(ngx_http_lua_co_ctx_t));[m
[31m-[m
[31m-    ctx->entry_co_ctx.co_ref = LUA_NOREF;[m
[31m-[m
[31m-    ctx->entered_rewrite_phase = 0;[m
[31m-    ctx->entered_access_phase = 0;[m
[31m-    ctx->entered_content_phase = 0;[m
[31m-[m
[31m-    ctx->exit_code = 0;[m
[31m-    ctx->exited = 0;[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_str_null(&ctx->exec_uri);[m
[31m-    ngx_str_null(&ctx->exec_args);[m
[31m-[m
[31m-    ctx->co_op = 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* post read callback for rewrite and access phases */[m
[31m-void[m
[31m-ngx_http_lua_generic_phase_post_read(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua post read for rewrite/access phases");[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-    ctx->read_body_done = 1;[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 8011[m
[31m-    r->main->count--;[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->waiting_more_body) {[m
[31m-        ctx->waiting_more_body = 0;[m
[31m-        ngx_http_core_run_phases(r);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_request_cleanup_handler(void *data)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx = data;[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 0 /* forcible */);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_request_cleanup(ngx_http_lua_ctx_t *ctx, int forcible)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    /*  force coroutine handling the request quit */[m
[31m-    if (ctx == NULL) {[m
[31m-        dd("ctx is NULL");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r = ctx->request;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua request cleanup: forcible=%d", forcible);[m
[31m-[m
[31m-    if (ctx->cleanup) {[m
[31m-        *ctx->cleanup = NULL;[m
[31m-        ctx->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-#if 1[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {[m
[31m-        /* being a fake request */[m
[31m-        lmcf->running_timers--;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    L = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    ngx_http_lua_finalize_threads(r, ctx, L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * description:[m
[31m- *  run a Lua coroutine specified by ctx->cur_co_ctx->co[m
[31m- * return value:[m
[31m- *  NGX_AGAIN:      I/O interruption: r->main->count intact[m
[31m- *  NGX_DONE:       I/O interruption: r->main->count already incremented by 1[m
[31m- *  NGX_ERROR:      error[m
[31m- *  >= 200          HTTP status code[m
[31m- */[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_run_thread(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, volatile int nrets)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t   *next_coctx, *parent_coctx, *orig_coctx;[m
[31m-    int                      rv, success = 1;[m
[31m-    lua_State               *next_co;[m
[31m-    lua_State               *old_co;[m
[31m-    const char              *err, *msg, *trace;[m
[31m-    ngx_int_t                rc;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t              *old_pool = NULL;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread, top:%d c:%ud", lua_gettop(L),[m
[31m-                   r->main->count);[m
[31m-[m
[31m-    /* set Lua VM panic handler */[m
[31m-    lua_atpanic(L, ngx_http_lua_atpanic);[m
[31m-[m
[31m-    dd("ctx = %p", ctx);[m
[31m-[m
[31m-    NGX_LUA_EXCEPTION_TRY {[m
[31m-[m
[31m-        if (ctx->cur_co_ctx->thread_spawn_yielded) {[m
[31m-            ngx_http_lua_probe_info("thread spawn yielded");[m
[31m-[m
[31m-            ctx->cur_co_ctx->thread_spawn_yielded = 0;[m
[31m-            nrets = 1;[m
[31m-        }[m
[31m-[m
[31m-        for ( ;; ) {[m
[31m-[m
[31m-            dd("calling lua_resume: vm %p, nret %d", ctx->cur_co_ctx->co,[m
[31m-               (int) nrets);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            /* XXX: work-around to nginx regex subsystem */[m
[31m-            old_pool = ngx_http_lua_pcre_malloc_init(r->pool);[m
[31m-#endif[m
[31m-[m
[31m-            /*  run code */[m
[31m-            dd("ctx: %p", ctx);[m
[31m-            dd("cur co: %p", ctx->cur_co_ctx->co);[m
[31m-            dd("cur co status: %d", ctx->cur_co_ctx->co_status);[m
[31m-[m
[31m-            orig_coctx = ctx->cur_co_ctx;[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-            dd("%p: saved co top: %d, nrets: %d, true top: %d",[m
[31m-               orig_coctx->co,[m
[31m-               (int) orig_coctx->co_top, (int) nrets,[m
[31m-               (int) lua_gettop(orig_coctx->co));[m
[31m-#endif[m
[31m-[m
[31m-#if DDEBUG[m
[31m-            if (lua_gettop(orig_coctx->co) > 0) {[m
[31m-                dd("top elem: %s", luaL_typename(orig_coctx->co, -1));[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            ngx_http_lua_assert(orig_coctx->co_top + nrets[m
[31m-                                == lua_gettop(orig_coctx->co));[m
[31m-[m
[31m-            rv = lua_resume(orig_coctx->co, nrets);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-            /* XXX: work-around to nginx regex subsystem */[m
[31m-            ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-#if 0[m
[31m-            /* test the longjmp thing */[m
[31m-            if (rand() % 2 == 0) {[m
[31m-                NGX_LUA_EXCEPTION_THROW(1);[m
[31m-            }[m
[31m-#endif[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua resume returned %d", rv);[m
[31m-[m
[31m-            switch (rv) {[m
[31m-            case LUA_YIELD:[m
[31m-                /*  yielded, let event handler do the rest job */[m
[31m-                /*  FIXME: add io cmd dispatcher here */[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua thread yielded");[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                dd("%p: saving curr top after yield: %d (co-op: %d)",[m
[31m-                   orig_coctx->co,[m
[31m-                   (int) lua_gettop(orig_coctx->co), (int) ctx->co_op);[m
[31m-                orig_coctx->co_top = lua_gettop(orig_coctx->co);[m
[31m-#endif[m
[31m-[m
[31m-                if (r->uri_changed) {[m
[31m-                    return ngx_http_lua_handle_rewrite_jump(L, r, ctx);[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->exited) {[m
[31m-                    return ngx_http_lua_handle_exit(L, r, ctx);[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->exec_uri.len) {[m
[31m-                    return ngx_http_lua_handle_exec(L, r, ctx);[m
[31m-                }[m
[31m-[m
[31m-                /*[m
[31m-                 * check if coroutine.resume or coroutine.yield called[m
[31m-                 * lua_yield()[m
[31m-                 */[m
[31m-                switch(ctx->co_op) {[m
[31m-                case NGX_HTTP_LUA_USER_CORO_NOP:[m
[31m-                    dd("hit! it is the API yield");[m
[31m-[m
[31m-                    ngx_http_lua_assert(lua_gettop(ctx->cur_co_ctx->co) == 0);[m
[31m-[m
[31m-                    ctx->cur_co_ctx = NULL;[m
[31m-[m
[31m-                    return NGX_AGAIN;[m
[31m-[m
[31m-                case NGX_HTTP_LUA_USER_THREAD_RESUME:[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "lua user thread resume");[m
[31m-[m
[31m-                    ctx->co_op = NGX_HTTP_LUA_USER_CORO_NOP;[m
[31m-                    nrets = lua_gettop(ctx->cur_co_ctx->co) - 1;[m
[31m-                    dd("nrets = %d", nrets);[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                    /* ignore the return value (the thread) already pushed */[m
[31m-                    orig_coctx->co_top--;[m
[31m-#endif[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                case NGX_HTTP_LUA_USER_CORO_RESUME:[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "lua coroutine: resume");[m
[31m-[m
[31m-                    /*[m
[31m-                     * the target coroutine lies at the base of the[m
[31m-                     * parent's stack[m
[31m-                     */[m
[31m-                    ctx->co_op = NGX_HTTP_LUA_USER_CORO_NOP;[m
[31m-[m
[31m-                    old_co = ctx->cur_co_ctx->parent_co_ctx->co;[m
[31m-[m
[31m-                    nrets = lua_gettop(old_co);[m
[31m-                    if (nrets) {[m
[31m-                        dd("moving %d return values to parent", nrets);[m
[31m-                        lua_xmove(old_co, ctx->cur_co_ctx->co, nrets);[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                        ctx->cur_co_ctx->parent_co_ctx->co_top -= nrets;[m
[31m-#endif[m
[31m-                    }[m
[31m-[m
[31m-                    break;[m
[31m-[m
[31m-                default:[m
[31m-                    /* ctx->co_op == NGX_HTTP_LUA_USER_CORO_YIELD */[m
[31m-[m
[31m-                    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                                   "lua coroutine: yield");[m
[31m-[m
[31m-                    ctx->co_op = NGX_HTTP_LUA_USER_CORO_NOP;[m
[31m-[m
[31m-                    if (ngx_http_lua_is_thread(ctx)) {[m
[31m-                        ngx_http_lua_probe_thread_yield(r, ctx->cur_co_ctx->co);[m
[31m-[m
[31m-                        /* discard any return values from user[m
[31m-                         * coroutine.yield()'s arguments */[m
[31m-                        lua_settop(ctx->cur_co_ctx->co, 0);[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                        ctx->cur_co_ctx->co_top = 0;[m
[31m-#endif[m
[31m-[m
[31m-                        ngx_http_lua_probe_info("set co running");[m
[31m-                        ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-                        if (ctx->posted_threads) {[m
[31m-                            ngx_http_lua_post_thread(r, ctx, ctx->cur_co_ctx);[m
[31m-                            ctx->cur_co_ctx = NULL;[m
[31m-                            return NGX_AGAIN;[m
[31m-                        }[m
[31m-[m
[31m-                        /* no pending threads, so resume the thread[m
[31m-                         * immediately */[m
[31m-[m
[31m-                        nrets = 0;[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                    /* being a user coroutine that has a parent */[m
[31m-[m
[31m-                    nrets = lua_gettop(ctx->cur_co_ctx->co);[m
[31m-[m
[31m-                    next_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-                    next_co = next_coctx->co;[m
[31m-[m
[31m-                    /*[m
[31m-                     * prepare return values for coroutine.resume[m
[31m-                     * (true plus any retvals)[m
[31m-                     */[m
[31m-                    lua_pushboolean(next_co, 1);[m
[31m-[m
[31m-                    if (nrets) {[m
[31m-                        dd("moving %d return values to next co", nrets);[m
[31m-                        lua_xmove(ctx->cur_co_ctx->co, next_co, nrets);[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-                        ctx->cur_co_ctx->co_top -= nrets;[m
[31m-#endif[m
[31m-                    }[m
[31m-[m
[31m-                    nrets++;  /* add the true boolean value */[m
[31m-[m
[31m-                    ctx->cur_co_ctx = next_coctx;[m
[31m-[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                /* try resuming on the new coroutine again */[m
[31m-                continue;[m
[31m-[m
[31m-            case 0:[m
[31m-[m
[31m-                ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-                ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-                ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-                if (ctx->cur_co_ctx->zombie_child_threads) {[m
[31m-                    ngx_http_lua_cleanup_zombie_child_uthreads(r, L, ctx,[m
[31m-                                                               ctx->cur_co_ctx);[m
[31m-                }[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua light thread ended normally");[m
[31m-[m
[31m-                if (ngx_http_lua_is_entry_thread(ctx)) {[m
[31m-[m
[31m-                    lua_settop(L, 0);[m
[31m-[m
[31m-                    ngx_http_lua_del_thread(r, L, ctx, ctx->cur_co_ctx);[m
[31m-[m
[31m-                    dd("uthreads: %d", (int) ctx->uthreads);[m
[31m-[m
[31m-                    if (ctx->uthreads) {[m
[31m-[m
[31m-                        ctx->cur_co_ctx = NULL;[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    /* all user threads terminated already */[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->cur_co_ctx->is_uthread) {[m
[31m-                    /* being a user thread */[m
[31m-[m
[31m-                    lua_settop(L, 0);[m
[31m-[m
[31m-                    parent_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-[m
[31m-                    if (ngx_http_lua_coroutine_alive(parent_coctx)) {[m
[31m-                        if (ctx->cur_co_ctx->waited_by_parent) {[m
[31m-                            ngx_http_lua_probe_info("parent already waiting");[m
[31m-                            ctx->cur_co_ctx->waited_by_parent = 0;[m
[31m-                            success = 1;[m
[31m-                            goto user_co_done;[m
[31m-                        }[m
[31m-[m
[31m-                        ngx_http_lua_probe_info("parent still alive");[m
[31m-[m
[31m-                        if (ngx_http_lua_post_zombie_thread(r, parent_coctx,[m
[31m-                                                            ctx->cur_co_ctx)[m
[31m-                            != NGX_OK)[m
[31m-                        {[m
[31m-                            return NGX_ERROR;[m
[31m-                        }[m
[31m-[m
[31m-                        lua_pushboolean(ctx->cur_co_ctx->co, 1);[m
[31m-                        lua_insert(ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-                        ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_ZOMBIE;[m
[31m-                        ctx->cur_co_ctx = NULL;[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    ngx_http_lua_del_thread(r, L, ctx, ctx->cur_co_ctx);[m
[31m-                    ctx->uthreads--;[m
[31m-[m
[31m-                    if (ctx->uthreads == 0) {[m
[31m-                        if (ngx_http_lua_entry_thread_alive(ctx)) {[m
[31m-                            ctx->cur_co_ctx = NULL;[m
[31m-                            return NGX_AGAIN;[m
[31m-                        }[m
[31m-[m
[31m-                        /* all threads terminated already */[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    /* some other user threads still running */[m
[31m-                    ctx->cur_co_ctx = NULL;[m
[31m-                    return NGX_AGAIN;[m
[31m-                }[m
[31m-[m
[31m-                /* being a user coroutine that has a parent */[m
[31m-[m
[31m-                success = 1;[m
[31m-[m
[31m-user_co_done:[m
[31m-[m
[31m-                nrets = lua_gettop(ctx->cur_co_ctx->co);[m
[31m-[m
[31m-                next_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-[m
[31m-                if (next_coctx == NULL) {[m
[31m-                    /* being a light thread */[m
[31m-                    goto no_parent;[m
[31m-                }[m
[31m-[m
[31m-                next_co = next_coctx->co;[m
[31m-[m
[31m-                /*[m
[31m-                 * ended successful, coroutine.resume returns true plus[m
[31m-                 * any return values[m
[31m-                 */[m
[31m-                lua_pushboolean(next_co, success);[m
[31m-[m
[31m-                if (nrets) {[m
[31m-                    lua_xmove(ctx->cur_co_ctx->co, next_co, nrets);[m
[31m-                }[m
[31m-[m
[31m-                if (ctx->cur_co_ctx->is_uthread) {[m
[31m-                    ngx_http_lua_del_thread(r, L, ctx, ctx->cur_co_ctx);[m
[31m-                    ctx->uthreads--;[m
[31m-                }[m
[31m-[m
[31m-                nrets++;[m
[31m-                ctx->cur_co_ctx = next_coctx;[m
[31m-[m
[31m-                ngx_http_lua_probe_info("set parent running");[m
[31m-[m
[31m-                next_coctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                               "lua coroutine: lua user thread ended normally");[m
[31m-[m
[31m-                continue;[m
[31m-[m
[31m-            case LUA_ERRRUN:[m
[31m-                err = "runtime error";[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_ERRSYNTAX:[m
[31m-                err = "syntax error";[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_ERRMEM:[m
[31m-                err = "memory allocation error";[m
[31m-                ngx_quit = 1;[m
[31m-                break;[m
[31m-[m
[31m-            case LUA_ERRERR:[m
[31m-                err = "error handler error";[m
[31m-                break;[m
[31m-[m
[31m-            default:[m
[31m-                err = "unknown error";[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ctx->cur_co_ctx != orig_coctx) {[m
[31m-                ctx->cur_co_ctx = orig_coctx;[m
[31m-            }[m
[31m-[m
[31m-            if (lua_isstring(ctx->cur_co_ctx->co, -1)) {[m
[31m-                dd("user custom error msg");[m
[31m-                msg = lua_tostring(ctx->cur_co_ctx->co, -1);[m
[31m-[m
[31m-            } else {[m
[31m-                msg = "unknown reason";[m
[31m-            }[m
[31m-[m
[31m-            ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-            ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 0);[m
[31m-[m
[31m-            ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-            ngx_http_lua_thread_traceback(L, ctx->cur_co_ctx->co,[m
[31m-                                          ctx->cur_co_ctx);[m
[31m-            trace = lua_tostring(L, -1);[m
[31m-[m
[31m-            if (ctx->cur_co_ctx->is_uthread) {[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "lua user thread aborted: %s: %s\n%s",[m
[31m-                              err, msg, trace);[m
[31m-[m
[31m-                lua_settop(L, 0);[m
[31m-[m
[31m-                parent_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-[m
[31m-                if (ngx_http_lua_coroutine_alive(parent_coctx)) {[m
[31m-                    if (ctx->cur_co_ctx->waited_by_parent) {[m
[31m-                        ctx->cur_co_ctx->waited_by_parent = 0;[m
[31m-                        success = 0;[m
[31m-                        goto user_co_done;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ngx_http_lua_post_zombie_thread(r, parent_coctx,[m
[31m-                                                        ctx->cur_co_ctx)[m
[31m-                        != NGX_OK)[m
[31m-                    {[m
[31m-                        return NGX_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    lua_pushboolean(ctx->cur_co_ctx->co, 0);[m
[31m-                    lua_insert(ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-                    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_ZOMBIE;[m
[31m-                    ctx->cur_co_ctx = NULL;[m
[31m-                    return NGX_AGAIN;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_del_thread(r, L, ctx, ctx->cur_co_ctx);[m
[31m-                ctx->uthreads--;[m
[31m-[m
[31m-                if (ctx->uthreads == 0) {[m
[31m-                    if (ngx_http_lua_entry_thread_alive(ctx)) {[m
[31m-                        ctx->cur_co_ctx = NULL;[m
[31m-                        return NGX_AGAIN;[m
[31m-                    }[m
[31m-[m
[31m-                    /* all threads terminated already */[m
[31m-                    goto done;[m
[31m-                }[m
[31m-[m
[31m-                /* some other user threads still running */[m
[31m-                ctx->cur_co_ctx = NULL;[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            if (ngx_http_lua_is_entry_thread(ctx)) {[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "lua entry thread aborted: %s: %s\n%s",[m
[31m-                              err, msg, trace);[m
[31m-[m
[31m-                lua_settop(L, 0);[m
[31m-[m
[31m-                /* being the entry thread aborted */[m
[31m-[m
[31m-                if (r->filter_finalize) {[m
[31m-                    ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-[m
[31m-                dd("headers sent? %d", r->header_sent || ctx->header_sent);[m
[31m-[m
[31m-                if (ctx->no_abort) {[m
[31m-                    ctx->no_abort = 0;[m
[31m-                    return NGX_ERROR;[m
[31m-                }[m
[31m-[m
[31m-                return (r->header_sent || ctx->header_sent) ? NGX_ERROR :[m
[31m-                       NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            /* being a user coroutine that has a parent */[m
[31m-[m
[31m-            next_coctx = ctx->cur_co_ctx->parent_co_ctx;[m
[31m-            if (next_coctx == NULL) {[m
[31m-                goto no_parent;[m
[31m-            }[m
[31m-[m
[31m-            next_co = next_coctx->co;[m
[31m-[m
[31m-            ngx_http_lua_probe_info("set parent running");[m
[31m-[m
[31m-            next_coctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-[m
[31m-            /*[m
[31m-             * ended with error, coroutine.resume returns false plus[m
[31m-             * err msg[m
[31m-             */[m
[31m-            lua_pushboolean(next_co, 0);[m
[31m-            lua_xmove(ctx->cur_co_ctx->co, next_co, 1);[m
[31m-            nrets = 2;[m
[31m-[m
[31m-            ctx->cur_co_ctx = next_coctx;[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "lua coroutine: %s: %s\n%s", err, msg, trace);[m
[31m-[m
[31m-            /* try resuming on the new coroutine again */[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-    } NGX_LUA_EXCEPTION_CATCH {[m
[31m-        dd("nginx execution restored");[m
[31m-    }[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-no_parent:[m
[31m-[m
[31m-    lua_settop(L, 0);[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    if (r->filter_finalize) {[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "lua handler aborted: "[m
[31m-                  "user coroutine has no parent");[m
[31m-[m
[31m-    return (r->header_sent || ctx->header_sent) ?[m
[31m-                NGX_ERROR : NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    if (ctx->entered_content_phase[m
[31m-        && r->connection->fd != (ngx_socket_t) -1)[m
[31m-    {[m
[31m-        rc = ngx_http_lua_send_chain_link(r, ctx,[m
[31m-                                          NULL /* last_buf */);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_wev_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_event_t                 *wev;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-[m
[31m-    ngx_http_lua_socket_tcp_upstream_t *u;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua run write event handler: timedout:%ud, ready:%ud, "[m
[31m-                   "writing_raw_req_socket:%ud",[m
[31m-                   wev->timedout, wev->ready, ctx->writing_raw_req_socket);[m
[31m-[m
[31m-    clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);[m
[31m-[m
[31m-    if (wev->timedout && !ctx->writing_raw_req_socket) {[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,[m
[31m-                          "client timed out");[m
[31m-            c->timedout = 1;[m
[31m-[m
[31m-            goto flush_coros;[m
[31m-        }[m
[31m-[m
[31m-        wev->timedout = 0;[m
[31m-        wev->delayed = 0;[m
[31m-[m
[31m-        if (!wev->ready) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-[m
[31m-            if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-                if (ctx->entered_content_phase) {[m
[31m-                    ngx_http_lua_finalize_request(r, NGX_ERROR);[m
[31m-                }[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!wev->ready && !wev->timedout) {[m
[31m-        goto useless;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->writing_raw_req_socket) {[m
[31m-        ctx->writing_raw_req_socket = 0;[m
[31m-[m
[31m-        u = ctx->downstream;[m
[31m-        if (u == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        u->write_event_handler(r, u);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (c->buffered & NGX_HTTP_LOWLEVEL_BUFFERED) {[m
[31m-        rc = ngx_http_lua_flush_pending_output(r, ctx);[m
[31m-[m
[31m-        dd("flush pending output returned %d, c->error: %d", (int) rc,[m
[31m-           c->error);[m
[31m-[m
[31m-        if (rc != NGX_ERROR && rc != NGX_OK) {[m
[31m-            goto useless;[m
[31m-        }[m
[31m-[m
[31m-        /* when rc == NGX_ERROR, c->error must be set */[m
[31m-    }[m
[31m-[m
[31m-flush_coros:[m
[31m-[m
[31m-    dd("ctx->flushing_coros: %d", (int) ctx->flushing_coros);[m
[31m-[m
[31m-    if (ctx->flushing_coros) {[m
[31m-        return ngx_http_lua_process_flushing_coroutines(r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    /* ctx->flushing_coros == 0 */[m
[31m-[m
[31m-useless:[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "useless lua write event handler");[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_process_flushing_coroutines(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                    rc, n;[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    dd("processing flushing coroutines");[m
[31m-[m
[31m-    coctx = &ctx->entry_co_ctx;[m
[31m-    n = ctx->flushing_coros;[m
[31m-[m
[31m-    if (coctx->flushing) {[m
[31m-        coctx->flushing = 0;[m
[31m-[m
[31m-        ctx->flushing_coros--;[m
[31m-        n--;[m
[31m-        ctx->cur_co_ctx = coctx;[m
[31m-[m
[31m-        rc = ngx_http_lua_flush_resume_helper(r, ctx);[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_DONE */[m
[31m-    }[m
[31m-[m
[31m-    if (n) {[m
[31m-[m
[31m-        if (ctx->user_co_ctx == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        part = &ctx->user_co_ctx->part;[m
[31m-        coctx = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                coctx = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            if (coctx[i].flushing) {[m
[31m-                coctx[i].flushing = 0;[m
[31m-                ctx->flushing_coros--;[m
[31m-                n--;[m
[31m-                ctx->cur_co_ctx = &coctx[i];[m
[31m-[m
[31m-                rc = ngx_http_lua_flush_resume_helper(r, ctx);[m
[31m-                if (rc == NGX_ERROR || rc >= NGX_OK) {[m
[31m-                    return rc;[m
[31m-                }[m
[31m-[m
[31m-                /* rc == NGX_DONE */[m
[31m-[m
[31m-                if (n == 0) {[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (n) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_flush_pending_output(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-    ngx_chain_t        *cl;[m
[31m-    ngx_event_t        *wev;[m
[31m-    ngx_connection_t   *c;[m
[31m-[m
[31m-    ngx_http_core_loc_conf_t    *clcf;[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    wev = c->write;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "lua flushing output: buffered 0x%uxd",[m
[31m-                   c->buffered);[m
[31m-[m
[31m-    if (ctx->busy_bufs) {[m
[31m-        /* FIXME since cosockets also share this busy_bufs chain, this condition[m
[31m-         * might not be strong enough. better use separate busy_bufs chains. */[m
[31m-        rc = ngx_http_lua_output_filter(r, NULL);[m
[31m-[m
[31m-    } else {[m
[31m-        cl = ngx_http_lua_get_flush_chain(r, ctx);[m
[31m-        if (cl == NULL) {[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        rc = ngx_http_lua_output_filter(r, cl);[m
[31m-    }[m
[31m-[m
[31m-    dd("output filter returned %d", (int) rc);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    if (c->buffered & NGX_HTTP_LOWLEVEL_BUFFERED) {[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);[m
[31m-[m
[31m-        if (!wev->delayed) {[m
[31m-            ngx_add_timer(wev, clcf->send_timeout);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {[m
[31m-            if (ctx->entered_content_phase) {[m
[31m-                ngx_http_lua_finalize_request(r, NGX_ERROR);[m
[31m-            }[m
[31m-[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->flushing_coros) {[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                           "lua flush still waiting: buffered 0x%uxd",[m
[31m-                           c->buffered);[m
[31m-[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-#if 1[m
[31m-        if (wev->timer_set && !wev->delayed) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-u_char *[m
[31m-ngx_http_lua_digest_hex(u_char *dest, const u_char *buf, int buf_len)[m
[31m-{[m
[31m-    ngx_md5_t                     md5;[m
[31m-    u_char                        md5_buf[MD5_DIGEST_LENGTH];[m
[31m-[m
[31m-    ngx_md5_init(&md5);[m
[31m-    ngx_md5_update(&md5, buf, buf_len);[m
[31m-    ngx_md5_final(md5_buf, &md5);[m
[31m-[m
[31m-    return ngx_hex_dump(dest, md5_buf, sizeof(md5_buf));[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_set_multi_value_table(lua_State *L, int index)[m
[31m-{[m
[31m-    if (index < 0) {[m
[31m-        index = lua_gettop(L) + index + 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushvalue(L, -2); /* stack: table key value key */[m
[31m-    lua_rawget(L, index);[m
[31m-    if (lua_isnil(L, -1)) {[m
[31m-        lua_pop(L, 1); /* stack: table key value */[m
[31m-        lua_rawset(L, index); /* stack: table */[m
[31m-[m
[31m-    } else {[m
[31m-        if (!lua_istable(L, -1)) {[m
[31m-            /* just inserted one value */[m
[31m-            lua_createtable(L, 4, 0);[m
[31m-                /* stack: table key value value table */[m
[31m-            lua_insert(L, -2);[m
[31m-                /* stack: table key value table value */[m
[31m-            lua_rawseti(L, -2, 1);[m
[31m-                /* stack: table key value table */[m
[31m-            lua_insert(L, -2);[m
[31m-                /* stack: table key table value */[m
[31m-[m
[31m-            lua_rawseti(L, -2, 2); /* stack: table key table */[m
[31m-[m
[31m-            lua_rawset(L, index); /* stack: table */[m
[31m-[m
[31m-        } else {[m
[31m-            /* stack: table key value table */[m
[31m-            lua_insert(L, -2); /* stack: table key table value */[m
[31m-[m
[31m-            lua_rawseti(L, -2, lua_objlen(L, -2) + 1);[m
[31m-                /* stack: table key table  */[m
[31m-            lua_pop(L, 2); /* stack: table */[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-uintptr_t[m
[31m-ngx_http_lua_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)[m
[31m-{[m
[31m-    ngx_uint_t      n;[m
[31m-    uint32_t       *escape;[m
[31m-    static u_char   hex[] = "0123456789ABCDEF";[m
[31m-[m
[31m-                    /* " ", "#", "%", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   uri[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0xfc00886d, /* 1111 1100 0000 0000  1000 1000 0110 1101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x78000000, /* 0111 1000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0xa8000000, /* 1010 1000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", "%", "+", "?", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   args[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x80000829, /* 1000 0000 0000 0000  0000 1000 0010 1001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "#", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   html[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x000000ad, /* 0000 0000 0000 0000  0000 0000 1010 1101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", """, "%", "'", %00-%1F, %7F-%FF */[m
[31m-[m
[31m-    static uint32_t   refresh[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000085, /* 0000 0000 0000 0000  0000 0000 1000 0101 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-        0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-    };[m
[31m-[m
[31m-                    /* " ", "%", %00-%1F */[m
[31m-[m
[31m-    static uint32_t   memcached[] = {[m
[31m-        0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */[m
[31m-[m
[31m-                    /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */[m
[31m-        0x00000021, /* 0000 0000 0000 0000  0000 0000 0010 0001 */[m
[31m-[m
[31m-                    /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-                    /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-        0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */[m
[31m-    };[m
[31m-[m
[31m-                    /* mail_auth is the same as memcached */[m
[31m-[m
[31m-    static uint32_t  *map[] =[m
[31m-        { uri, args, html, refresh, memcached, memcached };[m
[31m-[m
[31m-[m
[31m-    escape = map[type];[m
[31m-[m
[31m-    if (dst == NULL) {[m
[31m-[m
[31m-        /* find the number of the characters to be escaped */[m
[31m-[m
[31m-        n = 0;[m
[31m-[m
[31m-        while (size) {[m
[31m-            if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-                n++;[m
[31m-            }[m
[31m-            src++;[m
[31m-            size--;[m
[31m-        }[m
[31m-[m
[31m-        return (uintptr_t) n;[m
[31m-    }[m
[31m-[m
[31m-    while (size) {[m
[31m-        if (escape[*src >> 5] & (1 << (*src & 0x1f))) {[m
[31m-            *dst++ = '%';[m
[31m-            *dst++ = hex[*src >> 4];[m
[31m-            *dst++ = hex[*src & 0xf];[m
[31m-            src++;[m
[31m-[m
[31m-        } else {[m
[31m-            *dst++ = *src++;[m
[31m-        }[m
[31m-        size--;[m
[31m-    }[m
[31m-[m
[31m-    return (uintptr_t) dst;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* XXX we also decode '+' to ' ' */[m
[31m-void[m
[31m-ngx_http_lua_unescape_uri(u_char **dst, u_char **src, size_t size,[m
[31m-    ngx_uint_t type)[m
[31m-{[m
[31m-    u_char  *d, *s, ch, c, decoded;[m
[31m-    enum {[m
[31m-        sw_usual = 0,[m
[31m-        sw_quoted,[m
[31m-        sw_quoted_second[m
[31m-    } state;[m
[31m-[m
[31m-    d = *dst;[m
[31m-    s = *src;[m
[31m-[m
[31m-    state = 0;[m
[31m-    decoded = 0;[m
[31m-[m
[31m-    while (size--) {[m
[31m-[m
[31m-        ch = *s++;[m
[31m-[m
[31m-        switch (state) {[m
[31m-        case sw_usual:[m
[31m-            if (ch == '?'[m
[31m-                && (type & (NGX_UNESCAPE_URI|NGX_UNESCAPE_REDIRECT)))[m
[31m-            {[m
[31m-                *d++ = ch;[m
[31m-                goto done;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '%') {[m
[31m-                state = sw_quoted;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            if (ch == '+') {[m
[31m-                *d++ = ' ';[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted:[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                decoded = (u_char) (ch - '0');[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                decoded = (u_char) (c - 'a' + 10);[m
[31m-                state = sw_quoted_second;[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            *d++ = ch;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case sw_quoted_second:[m
[31m-[m
[31m-            state = sw_usual;[m
[31m-[m
[31m-            if (ch >= '0' && ch <= '9') {[m
[31m-                ch = (u_char) ((decoded << 4) + ch - '0');[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            c = (u_char) (ch | 0x20);[m
[31m-            if (c >= 'a' && c <= 'f') {[m
[31m-                ch = (u_char) ((decoded << 4) + c - 'a' + 10);[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_URI) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = ch;[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                if (type & NGX_UNESCAPE_REDIRECT) {[m
[31m-                    if (ch == '?') {[m
[31m-                        *d++ = ch;[m
[31m-                        goto done;[m
[31m-                    }[m
[31m-[m
[31m-                    if (ch > '%' && ch < 0x7f) {[m
[31m-                        *d++ = ch;[m
[31m-                        break;[m
[31m-                    }[m
[31m-[m
[31m-                    *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                *d++ = ch;[m
[31m-[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            /* the invalid quoted character */[m
[31m-[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    *dst = d;[m
[31m-    *src = s;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_req_api(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    /* ngx.req table */[m
[31m-[m
[31m-    lua_createtable(L, 0 /* narr */, 24 /* nrec */);    /* .req */[m
[31m-[m
[31m-    ngx_http_lua_inject_req_header_api(L);[m
[31m-    ngx_http_lua_inject_req_uri_api(log, L);[m
[31m-    ngx_http_lua_inject_req_args_api(L);[m
[31m-    ngx_http_lua_inject_req_body_api(L);[m
[31m-    ngx_http_lua_inject_req_socket_api(L);[m
[31m-    ngx_http_lua_inject_req_method_api(L);[m
[31m-    ngx_http_lua_inject_req_time_api(L);[m
[31m-    ngx_http_lua_inject_req_misc_api(L);[m
[31m-[m
[31m-    lua_setfield(L, -2, "req");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_handle_exec(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t               rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua thread initiated internal redirect to %V",[m
[31m-                   &ctx->exec_uri);[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-    ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    if (r->filter_finalize) {[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 1 /* forcible */);[m
[31m-[m
[31m-    if (ctx->exec_uri.data[0] == '@') {[m
[31m-        if (ctx->exec_args.len > 0) {[m
[31m-            ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                          "query strings %V ignored when exec'ing "[m
[31m-                          "named location %V",[m
[31m-                          &ctx->exec_args, &ctx->exec_uri);[m
[31m-        }[m
[31m-[m
[31m-        r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-#if 1[m
[31m-        if (r->read_event_handler == ngx_http_lua_rd_check_broken_connection) {[m
[31m-            /* resume the read event handler */[m
[31m-[m
[31m-            r->read_event_handler = ngx_http_block_reading;[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if 1[m
[31m-        /* clear the modules contexts */[m
[31m-        ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);[m
[31m-#endif[m
[31m-[m
[31m-        rc = ngx_http_named_location(r, &ctx->exec_uri);[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-        {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-#if 0[m
[31m-        if (!ctx->entered_content_phase) {[m
[31m-            /* XXX ensure the main request ref count[m
[31m-             * is decreased because the current[m
[31m-             * request will be quit */[m
[31m-            r->main->count--;[m
[31m-            dd("XXX decrement main count: c:%d", (int) r->main->count);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    dd("internal redirect to %.*s", (int) ctx->exec_uri.len,[m
[31m-       ctx->exec_uri.data);[m
[31m-[m
[31m-    r->write_event_handler = ngx_http_request_empty_handler;[m
[31m-[m
[31m-    if (r->read_event_handler == ngx_http_lua_rd_check_broken_connection) {[m
[31m-        /* resume the read event handler */[m
[31m-[m
[31m-        r->read_event_handler = ngx_http_block_reading;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_internal_redirect(r, &ctx->exec_uri, &ctx->exec_args);[m
[31m-[m
[31m-    dd("internal redirect returned %d when in content phase? "[m
[31m-       "%d", (int) rc, ctx->entered_content_phase);[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (!ctx->entered_content_phase) {[m
[31m-        /* XXX ensure the main request ref count[m
[31m-         * is decreased because the current[m
[31m-         * request will be quit */[m
[31m-        dd("XXX decrement main count");[m
[31m-        r->main->count--;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_handle_exit(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t           rc;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua thread aborting request with status %d",[m
[31m-                   ctx->exit_code);[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-    ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    if (r->filter_finalize) {[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-[m
[31m-    if (r->connection->fd == (ngx_socket_t) -1) {  /* fake request */[m
[31m-        return ctx->exit_code;[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if (!r->header_sent[m
[31m-        && !ctx->header_sent[m
[31m-        && r->headers_out.status == 0[m
[31m-        && ctx->exit_code >= NGX_HTTP_OK)[m
[31m-    {[m
[31m-        r->headers_out.status = ctx->exit_code;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->buffering[m
[31m-        && r->headers_out.status[m
[31m-        && ctx->exit_code != NGX_ERROR[m
[31m-        && ctx->exit_code != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && ctx->exit_code != NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        && ctx->exit_code != NGX_HTTP_CLOSE)[m
[31m-    {[m
[31m-        rc = ngx_http_lua_send_chain_link(r, ctx, NULL /* indicate last_buf */);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-[m
[31m-        if (ctx->exit_code >= NGX_HTTP_OK) {[m
[31m-            return NGX_HTTP_OK;[m
[31m-        }[m
[31m-[m
[31m-        return ctx->exit_code;[m
[31m-    }[m
[31m-[m
[31m-    if ((ctx->exit_code == NGX_OK[m
[31m-         && ctx->entered_content_phase)[m
[31m-        || (ctx->exit_code >= NGX_HTTP_OK[m
[31m-            && ctx->exit_code < NGX_HTTP_SPECIAL_RESPONSE[m
[31m-            && ctx->exit_code != NGX_HTTP_NO_CONTENT))[m
[31m-    {[m
[31m-        rc = ngx_http_lua_send_chain_link(r, ctx, NULL /* indicate last_buf */);[m
[31m-[m
[31m-        if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-#if 1[m
[31m-    if ((r->header_sent || ctx->header_sent)[m
[31m-        && ctx->exit_code > NGX_OK[m
[31m-        && ctx->exit_code != NGX_HTTP_REQUEST_TIME_OUT[m
[31m-        && ctx->exit_code != NGX_HTTP_CLIENT_CLOSED_REQUEST[m
[31m-        && ctx->exit_code != NGX_HTTP_CLOSE)[m
[31m-    {[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    return ctx->exit_code;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_process_args_option(ngx_http_request_t *r, lua_State *L,[m
[31m-    int table, ngx_str_t *args)[m
[31m-{[m
[31m-    u_char              *key;[m
[31m-    size_t               key_len;[m
[31m-    u_char              *value;[m
[31m-    size_t               value_len;[m
[31m-    size_t               len = 0;[m
[31m-    size_t               key_escape = 0;[m
[31m-    uintptr_t            total_escape = 0;[m
[31m-    int                  n;[m
[31m-    int                  i;[m
[31m-    u_char              *p;[m
[31m-[m
[31m-    if (table < 0) {[m
[31m-        table = lua_gettop(L) + table + 1;[m
[31m-    }[m
[31m-[m
[31m-    n = 0;[m
[31m-    lua_pushnil(L);[m
[31m-    while (lua_next(L, table) != 0) {[m
[31m-        if (lua_type(L, -2) != LUA_TSTRING) {[m
[31m-            luaL_error(L, "attempt to use a non-string key in the "[m
[31m-                       "\"args\" option table");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        key = (u_char *) lua_tolstring(L, -2, &key_len);[m
[31m-[m
[31m-        key_escape = 2 * ngx_http_lua_escape_uri(NULL, key, key_len,[m
[31m-                                                 NGX_ESCAPE_URI);[m
[31m-        total_escape += key_escape;[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-            value = (u_char *) lua_tolstring(L, -1, &value_len);[m
[31m-[m
[31m-            total_escape += 2 * ngx_http_lua_escape_uri(NULL, value, value_len,[m
[31m-                                                        NGX_ESCAPE_URI);[m
[31m-[m
[31m-            len += key_len + value_len + (sizeof("=") - 1);[m
[31m-            n++;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TBOOLEAN:[m
[31m-            if (lua_toboolean(L, -1)) {[m
[31m-                len += key_len;[m
[31m-                n++;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-[m
[31m-            i = 0;[m
[31m-            lua_pushnil(L);[m
[31m-            while (lua_next(L, -2) != 0) {[m
[31m-                if (lua_isboolean(L, -1)) {[m
[31m-                    if (lua_toboolean(L, -1)) {[m
[31m-                        len += key_len;[m
[31m-[m
[31m-                    } else {[m
[31m-                        lua_pop(L, 1);[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-                    value = (u_char *) lua_tolstring(L, -1, &value_len);[m
[31m-[m
[31m-                    if (value == NULL) {[m
[31m-                        luaL_error(L, "attempt to use %s as query arg value",[m
[31m-                                   luaL_typename(L, -1));[m
[31m-                        return;[m
[31m-                    }[m
[31m-[m
[31m-                    total_escape +=[m
[31m-                        2 * ngx_http_lua_escape_uri(NULL, value,[m
[31m-                                                    value_len,[m
[31m-                                                    NGX_ESCAPE_URI);[m
[31m-[m
[31m-                    len += key_len + value_len + (sizeof("=") - 1);[m
[31m-                }[m
[31m-[m
[31m-                if (i++ > 0) {[m
[31m-                    total_escape += key_escape;[m
[31m-                }[m
[31m-[m
[31m-                n++;[m
[31m-                lua_pop(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            luaL_error(L, "attempt to use %s as query arg value",[m
[31m-                       luaL_typename(L, -1));[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    len += (size_t) total_escape;[m
[31m-[m
[31m-    if (n > 1) {[m
[31m-        len += (n - 1) * (sizeof("&") - 1);[m
[31m-    }[m
[31m-[m
[31m-    dd("len 1: %d", (int) len);[m
[31m-[m
[31m-    if (r) {[m
[31m-        p = ngx_palloc(r->pool, len);[m
[31m-        if (p == NULL) {[m
[31m-            luaL_error(L, "no memory");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        p = lua_newuserdata(L, len);[m
[31m-    }[m
[31m-[m
[31m-    args->data = p;[m
[31m-    args->len = len;[m
[31m-[m
[31m-    i = 0;[m
[31m-    lua_pushnil(L);[m
[31m-    while (lua_next(L, table) != 0) {[m
[31m-        key = (u_char *) lua_tolstring(L, -2, &key_len);[m
[31m-[m
[31m-        switch (lua_type(L, -1)) {[m
[31m-        case LUA_TNUMBER:[m
[31m-        case LUA_TSTRING:[m
[31m-[m
[31m-            if (total_escape) {[m
[31m-                p = (u_char *) ngx_http_lua_escape_uri(p, key, key_len,[m
[31m-                                                       NGX_ESCAPE_URI);[m
[31m-[m
[31m-            } else {[m
[31m-                dd("shortcut: no escape required");[m
[31m-[m
[31m-                p = ngx_copy(p, key, key_len);[m
[31m-            }[m
[31m-[m
[31m-            *p++ = '=';[m
[31m-[m
[31m-            value = (u_char *) lua_tolstring(L, -1, &value_len);[m
[31m-[m
[31m-            if (total_escape) {[m
[31m-                p = (u_char *) ngx_http_lua_escape_uri(p, value, value_len,[m
[31m-                                                       NGX_ESCAPE_URI);[m
[31m-[m
[31m-            } else {[m
[31m-                p = ngx_copy(p, value, value_len);[m
[31m-            }[m
[31m-[m
[31m-            if (i != n - 1) {[m
[31m-                /* not the last pair */[m
[31m-                *p++ = '&';[m
[31m-            }[m
[31m-[m
[31m-            i++;[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TBOOLEAN:[m
[31m-            if (lua_toboolean(L, -1)) {[m
[31m-                if (total_escape) {[m
[31m-                    p = (u_char *) ngx_http_lua_escape_uri(p, key, key_len,[m
[31m-                                                           NGX_ESCAPE_URI);[m
[31m-[m
[31m-                } else {[m
[31m-                    dd("shortcut: no escape required");[m
[31m-[m
[31m-                    p = ngx_copy(p, key, key_len);[m
[31m-                }[m
[31m-[m
[31m-                if (i != n - 1) {[m
[31m-                    /* not the last pair */[m
[31m-                    *p++ = '&';[m
[31m-                }[m
[31m-[m
[31m-                i++;[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        case LUA_TTABLE:[m
[31m-[m
[31m-            lua_pushnil(L);[m
[31m-            while (lua_next(L, -2) != 0) {[m
[31m-[m
[31m-                if (lua_isboolean(L, -1)) {[m
[31m-                    if (lua_toboolean(L, -1)) {[m
[31m-                        if (total_escape) {[m
[31m-                            p = (u_char *) ngx_http_lua_escape_uri(p, key,[m
[31m-    key_len,[m
[31m-    NGX_ESCAPE_URI);[m
[31m-[m
[31m-                        } else {[m
[31m-                            dd("shortcut: no escape required");[m
[31m-[m
[31m-                            p = ngx_copy(p, key, key_len);[m
[31m-                        }[m
[31m-[m
[31m-                    } else {[m
[31m-                        lua_pop(L, 1);[m
[31m-                        continue;[m
[31m-                    }[m
[31m-[m
[31m-                } else {[m
[31m-[m
[31m-                    if (total_escape) {[m
[31m-                        p = (u_char *)[m
[31m-                                ngx_http_lua_escape_uri(p, key,[m
[31m-                                                        key_len,[m
[31m-                                                        NGX_ESCAPE_URI);[m
[31m-[m
[31m-                    } else {[m
[31m-                        dd("shortcut: no escape required");[m
[31m-[m
[31m-                        p = ngx_copy(p, key, key_len);[m
[31m-                    }[m
[31m-[m
[31m-                    *p++ = '=';[m
[31m-[m
[31m-                    value = (u_char *) lua_tolstring(L, -1, &value_len);[m
[31m-[m
[31m-                    if (total_escape) {[m
[31m-                        p = (u_char *)[m
[31m-                                ngx_http_lua_escape_uri(p, value,[m
[31m-                                                        value_len,[m
[31m-                                                        NGX_ESCAPE_URI);[m
[31m-[m
[31m-                    } else {[m
[31m-                        p = ngx_copy(p, value, value_len);[m
[31m-                    }[m
[31m-                }[m
[31m-[m
[31m-                if (i != n - 1) {[m
[31m-                    /* not the last pair */[m
[31m-                    *p++ = '&';[m
[31m-                }[m
[31m-[m
[31m-                i++;[m
[31m-                lua_pop(L, 1);[m
[31m-            }[m
[31m-[m
[31m-            break;[m
[31m-[m
[31m-        default:[m
[31m-            luaL_error(L, "should not reach here");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    if (p - args->data != (ssize_t) len) {[m
[31m-        luaL_error(L, "buffer error: %d != %d",[m
[31m-                   (int) (p - args->data), (int) len);[m
[31m-        return;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_handle_rewrite_jump(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua thread aborting request with URI rewrite jump: "[m
[31m-                   "\"%V?%V\"", &r->uri, &r->args);[m
[31m-[m
[31m-    ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-[m
[31m-    ngx_http_lua_probe_coroutine_done(r, ctx->cur_co_ctx->co, 1);[m
[31m-[m
[31m-    ctx->cur_co_ctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-[m
[31m-    if (r->filter_finalize) {[m
[31m-        ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_request_cleanup(ctx, 1 /* forcible */);[m
[31m-    ngx_http_lua_init_ctx(r, ctx);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* XXX ngx_open_and_stat_file is static in the core. sigh. */[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_open_and_stat_file(u_char *name, ngx_open_file_info_t *of,[m
[31m-    ngx_log_t *log)[m
[31m-{[m
[31m-    ngx_fd_t         fd;[m
[31m-    ngx_file_info_t  fi;[m
[31m-[m
[31m-    if (of->fd != NGX_INVALID_FILE) {[m
[31m-[m
[31m-        if (ngx_file_info(name, &fi) == NGX_FILE_ERROR) {[m
[31m-            of->failed = ngx_file_info_n;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (of->uniq == ngx_file_uniq(&fi)) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-    } else if (of->test_dir) {[m
[31m-[m
[31m-        if (ngx_file_info(name, &fi) == NGX_FILE_ERROR) {[m
[31m-            of->failed = ngx_file_info_n;[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_is_dir(&fi)) {[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (!of->log) {[m
[31m-[m
[31m-        /*[m
[31m-         * Use non-blocking open() not to hang on FIFO files, etc.[m
[31m-         * This flag has no effect on a regular files.[m
[31m-         */[m
[31m-[m
[31m-        fd = ngx_open_file(name, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,[m
[31m-                           NGX_FILE_OPEN, 0);[m
[31m-[m
[31m-    } else {[m
[31m-        fd = ngx_open_file(name, NGX_FILE_APPEND, NGX_FILE_CREATE_OR_OPEN,[m
[31m-                           NGX_FILE_DEFAULT_ACCESS);[m
[31m-    }[m
[31m-[m
[31m-    if (fd == NGX_INVALID_FILE) {[m
[31m-        of->failed = ngx_open_file_n;[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {[m
[31m-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,[m
[31m-                      ngx_fd_info_n " \"%s\" failed", name);[m
[31m-[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_is_dir(&fi)) {[m
[31m-        if (ngx_close_file(fd) == NGX_FILE_ERROR) {[m
[31m-            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                          ngx_close_file_n " \"%s\" failed", name);[m
[31m-        }[m
[31m-[m
[31m-        of->fd = NGX_INVALID_FILE;[m
[31m-[m
[31m-    } else {[m
[31m-        of->fd = fd;[m
[31m-[m
[31m-        if (of->directio <= ngx_file_size(&fi)) {[m
[31m-            if (ngx_directio_on(fd) == NGX_FILE_ERROR) {[m
[31m-                ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,[m
[31m-                              ngx_directio_on_n " \"%s\" failed", name);[m
[31m-[m
[31m-            } else {[m
[31m-                of->is_directio = 1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    of->uniq = ngx_file_uniq(&fi);[m
[31m-    of->mtime = ngx_file_mtime(&fi);[m
[31m-    of->size = ngx_file_size(&fi);[m
[31m-#if defined(nginx_version) && nginx_version >= 1000001[m
[31m-    of->fs_size = ngx_file_fs_size(&fi);[m
[31m-#endif[m
[31m-    of->is_dir = ngx_is_dir(&fi);[m
[31m-    of->is_file = ngx_is_file(&fi);[m
[31m-    of->is_link = ngx_is_link(&fi);[m
[31m-    of->is_exec = ngx_is_exec(&fi);[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    of->fd = NGX_INVALID_FILE;[m
[31m-    of->err = ngx_errno;[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_http_lua_chain_get_free_buf(ngx_log_t *log, ngx_pool_t *p,[m
[31m-    ngx_chain_t **free, size_t len)[m
[31m-{[m
[31m-    ngx_buf_t    *b;[m
[31m-    ngx_chain_t  *cl;[m
[31m-    u_char       *start, *end;[m
[31m-[m
[31m-    const ngx_buf_tag_t  tag = (ngx_buf_tag_t) &ngx_http_lua_module;[m
[31m-[m
[31m-    if (*free) {[m
[31m-        cl = *free;[m
[31m-        *free = cl->next;[m
[31m-        cl->next = NULL;[m
[31m-[m
[31m-        b = cl->buf;[m
[31m-        start = b->start;[m
[31m-        end = b->end;[m
[31m-        if (start && (size_t) (end - start) >= len) {[m
[31m-            ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                           "lua reuse free buf memory %O >= %uz, cl:%p, p:%p",[m
[31m-                           (off_t) (end - start), len, cl, start);[m
[31m-[m
[31m-            ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-            b->start = start;[m
[31m-            b->pos = start;[m
[31m-            b->last = start;[m
[31m-            b->end = end;[m
[31m-            b->tag = tag;[m
[31m-[m
[31m-            if (len) {[m
[31m-                b->temporary = 1;[m
[31m-            }[m
[31m-[m
[31m-            return cl;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                       "lua reuse free buf chain, but reallocate memory "[m
[31m-                       "because %uz >= %O, cl:%p, p:%p", len,[m
[31m-                       (off_t) (b->end - b->start), cl, b->start);[m
[31m-[m
[31m-        if (ngx_buf_in_memory(b) && b->start) {[m
[31m-            ngx_pfree(p, b->start);[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(b, sizeof(ngx_buf_t));[m
[31m-[m
[31m-        if (len == 0) {[m
[31m-            return cl;[m
[31m-        }[m
[31m-[m
[31m-        b->start = ngx_palloc(p, len);[m
[31m-        if (b->start == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        b->end = b->start + len;[m
[31m-[m
[31m-        dd("buf start: %p", cl->buf->start);[m
[31m-[m
[31m-        b->pos = b->start;[m
[31m-        b->last = b->start;[m
[31m-        b->tag = tag;[m
[31m-        b->temporary = 1;[m
[31m-[m
[31m-        return cl;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(p);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0,[m
[31m-                   "lua allocate new chainlink and new buf of size %uz, cl:%p",[m
[31m-                   len, cl);[m
[31m-[m
[31m-    cl->buf = len ? ngx_create_temp_buf(p, len) : ngx_calloc_buf(p);[m
[31m-    if (cl->buf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("buf start: %p", cl->buf->start);[m
[31m-[m
[31m-    cl->buf->tag = tag;[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_thread_traceback(lua_State *L, lua_State *co,[m
[31m-    ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    int         base;[m
[31m-    int         level, coid;[m
[31m-    lua_Debug   ar;[m
[31m-[m
[31m-    base = lua_gettop(L);[m
[31m-    lua_checkstack(L, 3);[m
[31m-    lua_pushliteral(L, "stack traceback:");[m
[31m-    coid = 0;[m
[31m-[m
[31m-    while (co) {[m
[31m-[m
[31m-        if (coid >= NGX_HTTP_LUA_BT_MAX_COROS) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        lua_checkstack(L, 2);[m
[31m-        lua_pushfstring(L, "\ncoroutine %d:", coid++);[m
[31m-[m
[31m-        level = 0;[m
[31m-[m
[31m-        while (lua_getstack(co, level++, &ar)) {[m
[31m-[m
[31m-            lua_checkstack(L, 5);[m
[31m-[m
[31m-            if (level > NGX_HTTP_LUA_BT_DEPTH) {[m
[31m-                lua_pushliteral(L, "\n\t...");[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            lua_pushliteral(L, "\n\t");[m
[31m-            lua_getinfo(co, "Snl", &ar);[m
[31m-            lua_pushfstring(L, "%s:", ar.short_src);[m
[31m-[m
[31m-            if (ar.currentline > 0) {[m
[31m-                lua_pushfstring(L, "%d:", ar.currentline);[m
[31m-            }[m
[31m-[m
[31m-            if (*ar.namewhat != '\0') {  /* is there a name? */[m
[31m-                lua_pushfstring(L, " in function " LUA_QS, ar.name);[m
[31m-[m
[31m-            } else {[m
[31m-                if (*ar.what == 'm') {  /* main? */[m
[31m-                    lua_pushliteral(L, " in main chunk");[m
[31m-[m
[31m-                } else if (*ar.what == 'C' || *ar.what == 't') {[m
[31m-                    lua_pushliteral(L, " ?");  /* C function or tail call */[m
[31m-[m
[31m-                } else {[m
[31m-                    lua_pushfstring(L, " in function <%s:%d>",[m
[31m-                                    ar.short_src, ar.linedefined);[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (lua_gettop(L) - base >= 15) {[m
[31m-            lua_concat(L, lua_gettop(L) - base);[m
[31m-        }[m
[31m-[m
[31m-        /* check if the coroutine has a parent coroutine*/[m
[31m-        coctx = coctx->parent_co_ctx;[m
[31m-        if (!coctx || coctx->co_status == NGX_HTTP_LUA_CO_DEAD) {[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        co = coctx->co;[m
[31m-    }[m
[31m-[m
[31m-    lua_concat(L, lua_gettop(L) - base);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_traceback(lua_State *L)[m
[31m-{[m
[31m-    if (!lua_isstring(L, 1)) { /* 'message' not a string? */[m
[31m-        return 1;  /* keep it intact */[m
[31m-    }[m
[31m-[m
[31m-    lua_getglobal(L, "debug");[m
[31m-    if (!lua_istable(L, -1)) {[m
[31m-        lua_pop(L, 1);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_getfield(L, -1, "traceback");[m
[31m-    if (!lua_isfunction(L, -1)) {[m
[31m-        lua_pop(L, 2);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushvalue(L, 1);  /* pass error message */[m
[31m-    lua_pushinteger(L, 2);  /* skip this function and traceback */[m
[31m-    lua_call(L, 2, 1);  /* call debug.traceback */[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_inject_arg_api(lua_State *L)[m
[31m-{[m
[31m-    lua_pushliteral(L, "arg");[m
[31m-    lua_newtable(L);    /*  .arg table aka {} */[m
[31m-[m
[31m-    lua_createtable(L, 0 /* narr */, 2 /* nrec */);    /*  the metatable */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_param_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_param_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-[m
[31m-    lua_setmetatable(L, -2);    /*  tie the metatable to param table */[m
[31m-[m
[31m-    dd("top: %d, type -1: %s", lua_gettop(L), luaL_typename(L, -1));[m
[31m-[m
[31m-    lua_rawset(L, -3);    /*  set ngx.arg table */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_param_get(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "ctx not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_SET[m
[31m-                               | NGX_HTTP_LUA_CONTEXT_BODY_FILTER);[m
[31m-[m
[31m-    if (ctx->context & (NGX_HTTP_LUA_CONTEXT_SET)) {[m
[31m-        return ngx_http_lua_setby_param_get(L);[m
[31m-    }[m
[31m-[m
[31m-    /* ctx->context & (NGX_HTTP_LUA_CONTEXT_BODY_FILTER) */[m
[31m-[m
[31m-    return ngx_http_lua_body_filter_param_get(L);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_param_set(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_http_request_t          *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return luaL_error(L, "ctx not found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_BODY_FILTER);[m
[31m-[m
[31m-    return ngx_http_lua_body_filter_param_set(L, r, ctx);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_lua_co_ctx_t *[m
[31m-ngx_http_lua_get_co_ctx(lua_State *L, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_uint_t                   i;[m
[31m-    ngx_list_part_t             *part;[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    if (L == ctx->entry_co_ctx.co) {[m
[31m-        return &ctx->entry_co_ctx;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->user_co_ctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    part = &ctx->user_co_ctx->part;[m
[31m-    coctx = part->elts;[m
[31m-[m
[31m-    /* FIXME: we should use rbtree here to prevent O(n) lookup overhead */[m
[31m-[m
[31m-    for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-        if (i >= part->nelts) {[m
[31m-            if (part->next == NULL) {[m
[31m-                break;[m
[31m-            }[m
[31m-[m
[31m-            part = part->next;[m
[31m-            coctx = part->elts;[m
[31m-            i = 0;[m
[31m-        }[m
[31m-[m
[31m-        if (coctx[i].co == L) {[m
[31m-            return &coctx[i];[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_lua_co_ctx_t *[m
[31m-ngx_http_lua_create_co_ctx(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_lua_co_ctx_t       *coctx;[m
[31m-[m
[31m-    if (ctx->user_co_ctx == NULL) {[m
[31m-        ctx->user_co_ctx = ngx_list_create(r->pool, 4,[m
[31m-                                           sizeof(ngx_http_lua_co_ctx_t));[m
[31m-        if (ctx->user_co_ctx == NULL) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    coctx = ngx_list_push(ctx->user_co_ctx);[m
[31m-    if (coctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(coctx, sizeof(ngx_http_lua_co_ctx_t));[m
[31m-[m
[31m-    coctx->co_ref = LUA_NOREF;[m
[31m-[m
[31m-    return coctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* this is for callers other than the content handler */[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_run_posted_threads(ngx_connection_t *c, lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_int_t                        rc;[m
[31m-    ngx_http_lua_posted_thread_t    *pt;[m
[31m-[m
[31m-    for ( ;; ) {[m
[31m-        if (c->destroyed) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        pt = ctx->posted_threads;[m
[31m-        if (pt == NULL) {[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-[m
[31m-        ctx->posted_threads = pt->next;[m
[31m-[m
[31m-        ngx_http_lua_probe_run_posted_thread(r, pt->co_ctx->co,[m
[31m-                                             (int) pt->co_ctx->co_status);[m
[31m-[m
[31m-        if (pt->co_ctx->co_status != NGX_HTTP_LUA_CO_RUNNING) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ctx->cur_co_ctx = pt->co_ctx;[m
[31m-[m
[31m-        rc = ngx_http_lua_run_thread(L, r, ctx, 0);[m
[31m-[m
[31m-        if (rc == NGX_AGAIN) {[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (rc == NGX_DONE) {[m
[31m-            ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        /* rc == NGX_ERROR || rc >= NGX_OK */[m
[31m-[m
[31m-        if (ctx->entered_content_phase) {[m
[31m-            ngx_http_lua_finalize_request(r, rc);[m
[31m-        }[m
[31m-[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    /* impossible to reach here */[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_post_thread(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx,[m
[31m-    ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    ngx_http_lua_posted_thread_t  **p;[m
[31m-    ngx_http_lua_posted_thread_t   *pt;[m
[31m-[m
[31m-    pt = ngx_palloc(r->pool, sizeof(ngx_http_lua_posted_thread_t));[m
[31m-    if (pt == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pt->co_ctx = coctx;[m
[31m-    pt->next = NULL;[m
[31m-[m
[31m-    for (p = &ctx->posted_threads; *p; p = &(*p)->next) { /* void */ }[m
[31m-[m
[31m-    *p = pt;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_finalize_threads(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, lua_State *L)[m
[31m-{[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    int                              top;[m
[31m-#endif[m
[31m-    int                              inited = 0, ref;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_list_part_t                 *part;[m
[31m-    ngx_http_lua_co_ctx_t           *cc, *coctx;[m
[31m-[m
[31m-#ifdef NGX_LUA_USE_ASSERT[m
[31m-    top = lua_gettop(L);[m
[31m-#endif[m
[31m-[m
[31m-#if 1[m
[31m-    coctx = ctx->on_abort_co_ctx;[m
[31m-    if (coctx && coctx->co_ref != LUA_NOREF) {[m
[31m-        if (coctx->co_status != NGX_HTTP_LUA_CO_SUSPENDED) {[m
[31m-            /* the on_abort thread contributes to the coctx->uthreads[m
[31m-             * counter only when it actually starts running */[m
[31m-            ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-            ctx->uthreads--;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_probe_thread_delete(r, coctx->co, ctx);[m
[31m-[m
[31m-        lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-        lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-        inited = 1;[m
[31m-[m
[31m-        luaL_unref(L, -1, coctx->co_ref);[m
[31m-        coctx->co_ref = LUA_NOREF;[m
[31m-[m
[31m-        coctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-        ctx->on_abort_co_ctx = NULL;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (ctx->user_co_ctx) {[m
[31m-        part = &ctx->user_co_ctx->part;[m
[31m-        cc = part->elts;[m
[31m-[m
[31m-        for (i = 0; /* void */; i++) {[m
[31m-[m
[31m-            if (i >= part->nelts) {[m
[31m-                if (part->next == NULL) {[m
[31m-                    break;[m
[31m-                }[m
[31m-[m
[31m-                part = part->next;[m
[31m-                cc = part->elts;[m
[31m-                i = 0;[m
[31m-            }[m
[31m-[m
[31m-            coctx = &cc[i];[m
[31m-[m
[31m-            ref = coctx->co_ref;[m
[31m-[m
[31m-            if (ref != LUA_NOREF) {[m
[31m-                ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-[m
[31m-                ngx_http_lua_probe_thread_delete(r, coctx->co, ctx);[m
[31m-[m
[31m-                if (!inited) {[m
[31m-                    lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-                    lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-                    inited = 1;[m
[31m-                }[m
[31m-[m
[31m-                ngx_http_lua_assert(lua_gettop(L) - top == 1);[m
[31m-[m
[31m-                luaL_unref(L, -1, ref);[m
[31m-                coctx->co_ref = LUA_NOREF;[m
[31m-[m
[31m-                coctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-                ctx->uthreads--;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ctx->user_co_ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_assert(ctx->uthreads == 0);[m
[31m-[m
[31m-    coctx = &ctx->entry_co_ctx;[m
[31m-[m
[31m-    ref = coctx->co_ref;[m
[31m-    if (ref != LUA_NOREF) {[m
[31m-        ngx_http_lua_cleanup_pending_operation(coctx);[m
[31m-[m
[31m-        ngx_http_lua_probe_thread_delete(r, coctx->co, ctx);[m
[31m-[m
[31m-        if (!inited) {[m
[31m-            lua_pushlightuserdata(L, &ngx_http_lua_coroutines_key);[m
[31m-            lua_rawget(L, LUA_REGISTRYINDEX);[m
[31m-            inited = 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_http_lua_assert(lua_gettop(L) - top == 1);[m
[31m-[m
[31m-        luaL_unref(L, -1, coctx->co_ref);[m
[31m-        coctx->co_ref = LUA_NOREF;[m
[31m-        coctx->co_status = NGX_HTTP_LUA_CO_DEAD;[m
[31m-    }[m
[31m-[m
[31m-    if (inited) {[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_post_zombie_thread(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_co_ctx_t *parent, ngx_http_lua_co_ctx_t *thread)[m
[31m-{[m
[31m-    ngx_http_lua_posted_thread_t  **p;[m
[31m-    ngx_http_lua_posted_thread_t   *pt;[m
[31m-[m
[31m-    pt = ngx_palloc(r->pool, sizeof(ngx_http_lua_posted_thread_t));[m
[31m-    if (pt == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pt->co_ctx = thread;[m
[31m-    pt->next = NULL;[m
[31m-[m
[31m-    for (p = &parent->zombie_child_threads; *p; p = &(*p)->next) { /* void */ }[m
[31m-[m
[31m-    *p = pt;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_cleanup_zombie_child_uthreads(ngx_http_request_t *r,[m
[31m-    lua_State *L, ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    ngx_http_lua_posted_thread_t   *pt;[m
[31m-[m
[31m-    for (pt = coctx->zombie_child_threads; pt; pt = pt->next) {[m
[31m-        if (pt->co_ctx->co_ref != LUA_NOREF) {[m
[31m-            ngx_http_lua_del_thread(r, L, ctx, pt->co_ctx);[m
[31m-            ctx->uthreads--;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    coctx->zombie_child_threads = NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_check_broken_connection(ngx_http_request_t *r, ngx_event_t *ev)[m
[31m-{[m
[31m-    int                  n;[m
[31m-    char                 buf[1];[m
[31m-    ngx_err_t            err;[m
[31m-    ngx_int_t            event;[m
[31m-    ngx_connection_t     *c;[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,[m
[31m-                   "http lua check client, write event:%d, \"%V\"",[m
[31m-                   ev->write, &r->uri);[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    if (c->error) {[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-[m
[31m-            event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-            if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-                return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return NGX_HTTP_CLIENT_CLOSED_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {[m
[31m-[m
[31m-        if (!ev->pending_eof) {[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ev->eof = 1;[m
[31m-[m
[31m-        if (ev->kq_errno) {[m
[31m-            ev->error = 1;[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,[m
[31m-                      "kevent() reported that client prematurely closed "[m
[31m-                      "connection");[m
[31m-[m
[31m-        return NGX_HTTP_CLIENT_CLOSED_REQUEST;[m
[31m-    }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-    n = recv(c->fd, buf, 1, MSG_PEEK);[m
[31m-[m
[31m-    err = ngx_socket_errno;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,[m
[31m-                   "http lua recv(): %d", n);[m
[31m-[m
[31m-    if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {[m
[31m-        dd("event is active");[m
[31m-[m
[31m-        event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT;[m
[31m-[m
[31m-#if 1[m
[31m-        if (ngx_del_event(ev, event, 0) != NGX_OK) {[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dd("HERE %d", (int) n);[m
[31m-[m
[31m-    if (n > 0) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    if (n == -1) {[m
[31m-        if (err == NGX_EAGAIN) {[m
[31m-            dd("HERE");[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ev->error = 1;[m
[31m-[m
[31m-    } else { /* n == 0 */[m
[31m-        err = 0;[m
[31m-    }[m
[31m-[m
[31m-    ev->eof = 1;[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_INFO, ev->log, err,[m
[31m-                  "client prematurely closed connection");[m
[31m-[m
[31m-    return NGX_HTTP_CLIENT_CLOSED_REQUEST;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_rd_check_broken_connection(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t                   rc;[m
[31m-    ngx_event_t                *rev;[m
[31m-    ngx_http_lua_ctx_t         *ctx;[m
[31m-[m
[31m-    if (r->done) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_lua_check_broken_connection(r, r->connection->read);[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* rc == NGX_ERROR || rc > NGX_OK */[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->on_abort_co_ctx == NULL) {[m
[31m-        r->connection->error = 1;[m
[31m-        ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->on_abort_co_ctx->co_status != NGX_HTTP_LUA_CO_SUSPENDED) {[m
[31m-[m
[31m-        /* on_abort already run for the current request handler */[m
[31m-[m
[31m-        rev = r->connection->read;[m
[31m-[m
[31m-        if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && rev->active) {[m
[31m-            if (ngx_del_event(rev, NGX_READ_EVENT, 0) != NGX_OK) {[m
[31m-                ngx_http_lua_request_cleanup(ctx, 0);[m
[31m-                ngx_http_lua_finalize_request(r,[m
[31m-                                              NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ctx->uthreads++;[m
[31m-    ctx->resume_handler = ngx_http_lua_on_abort_resume;[m
[31m-    ctx->on_abort_co_ctx->co_status = NGX_HTTP_LUA_CO_RUNNING;[m
[31m-    ctx->cur_co_ctx = ctx->on_abort_co_ctx;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua waking up the on_abort callback thread");[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        r->write_event_handler = ngx_http_lua_content_wev_handler;[m
[31m-[m
[31m-    } else {[m
[31m-        r->write_event_handler = ngx_http_core_run_phases;[m
[31m-    }[m
[31m-[m
[31m-    r->write_event_handler(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_on_abort_resume(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *vm;[m
[31m-    ngx_int_t                    rc;[m
[31m-    ngx_connection_t            *c;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua resuming the on_abort callback thread");[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_lua_probe_info("tcp resume");[m
[31m-#endif[m
[31m-[m
[31m-    c = r->connection;[m
[31m-    vm = ngx_http_lua_get_lua_vm(r, ctx);[m
[31m-[m
[31m-    rc = ngx_http_lua_run_thread(vm, r, ctx, 0);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "lua run thread returned %d", rc);[m
[31m-[m
[31m-    if (rc == NGX_AGAIN) {[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_finalize_request(r, NGX_DONE);[m
[31m-        return ngx_http_lua_run_posted_threads(c, vm, r, ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx->entered_content_phase) {[m
[31m-        ngx_http_lua_finalize_request(r, rc);[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_test_expect(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_int_t   n;[m
[31m-    ngx_str_t  *expect;[m
[31m-[m
[31m-    if (r->expect_tested[m
[31m-        || r->headers_in.expect == NULL[m
[31m-        || r->http_version < NGX_HTTP_VERSION_11)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    r->expect_tested = 1;[m
[31m-[m
[31m-    expect = &r->headers_in.expect->value;[m
[31m-[m
[31m-    if (expect->len != sizeof("100-continue") - 1[m
[31m-        || ngx_strncasecmp(expect->data, (u_char *) "100-continue",[m
[31m-                           sizeof("100-continue") - 1)[m
[31m-           != 0)[m
[31m-    {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "send 100 Continue");[m
[31m-[m
[31m-    n = r->connection->send(r->connection,[m
[31m-                            (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF,[m
[31m-                            sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1);[m
[31m-[m
[31m-    if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) {[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    /* we assume that such small packet should be send successfully */[m
[31m-[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_http_lua_ctx_t              *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx && ctx->cur_co_ctx) {[m
[31m-        ngx_http_lua_cleanup_pending_operation(ctx->cur_co_ctx);[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->fd != (ngx_socket_t) -1) {[m
[31m-        ngx_http_finalize_request(r, rc);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_finalize_fake_request(r, rc);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_finalize_fake_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_connection_t          *c;[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-    ngx_ssl_conn_t            *ssl_conn;[m
[31m-[m
[31m-    ngx_http_lua_ssl_cert_ctx_t     *cctx;[m
[31m-#endif[m
[31m-[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lua finalize fake request: %d, a:%d, c:%d",[m
[31m-                   rc, r == c->data, r->main->count);[m
[31m-[m
[31m-    if (rc == NGX_DONE) {[m
[31m-        ngx_http_lua_close_fake_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-[m
[31m-#if (NGX_HTTP_SSL)[m
[31m-[m
[31m-        if (r->connection->ssl) {[m
[31m-            ssl_conn = r->connection->ssl->connection;[m
[31m-            if (ssl_conn) {[m
[31m-                c = ngx_ssl_get_connection(ssl_conn);[m
[31m-[m
[31m-                if (c && c->ssl) {[m
[31m-                    cctx = ngx_http_lua_ssl_get_ctx(c->ssl->connection);[m
[31m-                    if (cctx != NULL) {[m
[31m-                        cctx->exit_code = 0;[m
[31m-                    }[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-        ngx_http_lua_close_fake_request(r);[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        c->write->delayed = 0;[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_close_fake_request(r);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static void[m
[31m-ngx_http_lua_close_fake_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_connection_t  *c;[m
[31m-[m
[31m-    r = r->main;[m
[31m-    c = r->connection;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lua fake request count:%d", r->count);[m
[31m-[m
[31m-    if (r->count == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http lua fake request "[m
[31m-                      "count is zero");[m
[31m-    }[m
[31m-[m
[31m-    r->count--;[m
[31m-[m
[31m-    if (r->count) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_free_fake_request(r);[m
[31m-    ngx_http_lua_close_fake_connection(c);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_free_fake_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_log_t                 *log;[m
[31m-    ngx_http_cleanup_t        *cln;[m
[31m-[m
[31m-    log = r->connection->log;[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http lua close fake "[m
[31m-                   "request");[m
[31m-[m
[31m-    if (r->pool == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ALERT, log, 0, "http lua fake request "[m
[31m-                      "already closed");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    cln = r->cleanup;[m
[31m-    r->cleanup = NULL;[m
[31m-[m
[31m-    while (cln) {[m
[31m-        if (cln->handler) {[m
[31m-            cln->handler(cln->data);[m
[31m-        }[m
[31m-[m
[31m-        cln = cln->next;[m
[31m-    }[m
[31m-[m
[31m-    r->request_line.len = 0;[m
[31m-[m
[31m-    r->connection->destroyed = 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_close_fake_connection(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_pool_t          *pool;[m
[31m-    ngx_connection_t    *saved_c = NULL;[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,[m
[31m-                   "http lua close fake http connection %p", c);[m
[31m-[m
[31m-    c->destroyed = 1;[m
[31m-[m
[31m-    pool = c->pool;[m
[31m-[m
[31m-    if (c->read->timer_set) {[m
[31m-        ngx_del_timer(c->read);[m
[31m-    }[m
[31m-[m
[31m-    if (c->write->timer_set) {[m
[31m-        ngx_del_timer(c->write);[m
[31m-    }[m
[31m-[m
[31m-    c->read->closed = 1;[m
[31m-    c->write->closed = 1;[m
[31m-[m
[31m-    /* we temporarily use a valid fd (0) to make ngx_free_connection happy */[m
[31m-[m
[31m-    c->fd = 0;[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        saved_c = ngx_cycle->files[0];[m
[31m-    }[m
[31m-[m
[31m-    ngx_free_connection(c);[m
[31m-[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        ngx_cycle->files[0] = saved_c;[m
[31m-    }[m
[31m-[m
[31m-    if (pool) {[m
[31m-        ngx_destroy_pool(pool);[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-lua_State *[m
[31m-ngx_http_lua_init_vm(lua_State *parent_vm, ngx_cycle_t *cycle,[m
[31m-    ngx_pool_t *pool, ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log,[m
[31m-    ngx_pool_cleanup_t **pcln)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_uint_t                       i;[m
[31m-    ngx_pool_cleanup_t              *cln;[m
[31m-    ngx_http_lua_preload_hook_t     *hook;[m
[31m-    ngx_http_lua_vm_state_t         *state;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(pool, 0);[m
[31m-    if (cln == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /* create new Lua VM instance */[m
[31m-    L = ngx_http_lua_new_state(parent_vm, cycle, lmcf, log);[m
[31m-    if (L == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "lua initialize the "[m
[31m-                   "global Lua VM %p", L);[m
[31m-[m
[31m-    /* register cleanup handler for Lua VM */[m
[31m-    cln->handler = ngx_http_lua_cleanup_vm;[m
[31m-[m
[31m-    state = ngx_alloc(sizeof(ngx_http_lua_vm_state_t), log);[m
[31m-    if (state == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-    state->vm = L;[m
[31m-    state->count = 1;[m
[31m-[m
[31m-    cln->data = state;[m
[31m-[m
[31m-    if (pcln) {[m
[31m-        *pcln = cln;[m
[31m-    }[m
[31m-[m
[31m-    if (lmcf->preload_hooks) {[m
[31m-[m
[31m-        /* register the 3rd-party module's preload hooks */[m
[31m-[m
[31m-        lua_getglobal(L, "package");[m
[31m-        lua_getfield(L, -1, "preload");[m
[31m-[m
[31m-        hook = lmcf->preload_hooks->elts;[m
[31m-[m
[31m-        for (i = 0; i < lmcf->preload_hooks->nelts; i++) {[m
[31m-[m
[31m-            ngx_http_lua_probe_register_preload_package(L, hook[i].package);[m
[31m-[m
[31m-            lua_pushcfunction(L, hook[i].loader);[m
[31m-            lua_setfield(L, -2, (char *) hook[i].package);[m
[31m-        }[m
[31m-[m
[31m-        lua_pop(L, 2);[m
[31m-    }[m
[31m-[m
[31m-    return L;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_cleanup_vm(void *data)[m
[31m-{[m
[31m-    lua_State                       *L;[m
[31m-    ngx_http_lua_vm_state_t         *state = data;[m
[31m-[m
[31m-#if (DDEBUG)[m
[31m-    if (state) {[m
[31m-        dd("cleanup VM: c:%d, s:%p", (int) state->count, state->vm);[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (state) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                       "lua decrementing the reference count for Lua VM: %i",[m
[31m-                       state->count);[m
[31m-[m
[31m-        if (--state->count == 0) {[m
[31m-            L = state->vm;[m
[31m-            ngx_http_lua_cleanup_conn_pools(L);[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,[m
[31m-                           "lua close the global Lua VM %p", L);[m
[31m-            lua_close(L);[m
[31m-            ngx_free(state);[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_connection_t *[m
[31m-ngx_http_lua_create_fake_connection(ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_log_t               *log;[m
[31m-    ngx_connection_t        *c;[m
[31m-    ngx_connection_t        *saved_c = NULL;[m
[31m-[m
[31m-    /* (we temporarily use a valid fd (0) to make ngx_get_connection happy) */[m
[31m-    if (ngx_cycle->files) {[m
[31m-        saved_c = ngx_cycle->files[0];[m
[31m-    }[m
[31m-[m
[31m-    c = ngx_get_connection(0, ngx_cycle->log);[m
[31m-[m
[31m-    if (ngx_cycle->files) {[m
[31m-        ngx_cycle->files[0] = saved_c;[m
[31m-    }[m
[31m-[m
[31m-    if (c == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    c->fd = (ngx_socket_t) -1;[m
[31m-[m
[31m-    if (pool) {[m
[31m-        c->pool = pool;[m
[31m-[m
[31m-    } else {[m
[31m-        c->pool = ngx_create_pool(128, c->log);[m
[31m-        if (c->pool == NULL) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    log = ngx_pcalloc(c->pool, sizeof(ngx_log_t));[m
[31m-    if (log == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c->log = log;[m
[31m-    c->log->connection = c->number;[m
[31m-    c->log->action = NULL;[m
[31m-    c->log->data = NULL;[m
[31m-[m
[31m-    c->log_error = NGX_ERROR_INFO;[m
[31m-[m
[31m-#if 0[m
[31m-    c->buffer = ngx_create_temp_buf(c->pool, 2);[m
[31m-    if (c->buffer == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    c->buffer->start[0] = CR;[m
[31m-    c->buffer->start[1] = LF;[m
[31m-#endif[m
[31m-[m
[31m-    c->error = 1;[m
[31m-[m
[31m-    dd("created fake connection: %p", c);[m
[31m-[m
[31m-    return c;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_http_lua_close_fake_connection(c);[m
[31m-    return NULL;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_request_t *[m
[31m-ngx_http_lua_create_fake_request(ngx_connection_t *c)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-[m
[31m-    r = ngx_pcalloc(c->pool, sizeof(ngx_http_request_t));[m
[31m-    if (r == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    c->requests++;[m
[31m-[m
[31m-    r->pool = c->pool;[m
[31m-[m
[31m-    dd("r pool allocated: %d", (int) (sizeof(ngx_http_lua_ctx_t)[m
[31m-       + sizeof(void *) * ngx_http_max_module + sizeof(ngx_http_cleanup_t)));[m
[31m-[m
[31m-#if 0[m
[31m-    hc = ngx_pcalloc(c->pool, sizeof(ngx_http_connection_t));[m
[31m-    if (hc == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    r->header_in = c->buffer;[m
[31m-    r->header_end = c->buffer->start;[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_out.headers, r->pool, 0,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_list_init(&r->headers_in.headers, r->pool, 0,[m
[31m-                      sizeof(ngx_table_elt_t))[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);[m
[31m-    if (r->ctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    r->variables = ngx_pcalloc(r->pool, cmcf->variables.nelts[m
[31m-                               * sizeof(ngx_http_variable_value_t));[m
[31m-    if (r->variables == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    r->connection = c;[m
[31m-[m
[31m-    r->headers_in.content_length_n = 0;[m
[31m-    c->data = r;[m
[31m-#if 0[m
[31m-    hc->request = r;[m
[31m-    r->http_connection = hc;[m
[31m-#endif[m
[31m-    r->signature = NGX_HTTP_MODULE;[m
[31m-    r->main = r;[m
[31m-    r->count = 1;[m
[31m-[m
[31m-    r->method = NGX_HTTP_UNKNOWN;[m
[31m-[m
[31m-    r->headers_in.keep_alive_n = -1;[m
[31m-    r->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;[m
[31m-    r->subrequests = NGX_HTTP_MAX_SUBREQUESTS + 1;[m
[31m-[m
[31m-    r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;[m
[31m-    r->discard_body = 1;[m
[31m-[m
[31m-    dd("created fake request %p", r);[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_http_lua_report(ngx_log_t *log, lua_State *L, int status,[m
[31m-    const char *prefix)[m
[31m-{[m
[31m-    const char      *msg;[m
[31m-[m
[31m-    if (status && !lua_isnil(L, -1)) {[m
[31m-        msg = lua_tostring(L, -1);[m
[31m-        if (msg == NULL) {[m
[31m-            msg = "unknown error";[m
[31m-        }[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, log, 0, "%s error: %s", prefix, msg);[m
[31m-        lua_pop(L, 1);[m
[31m-    }[m
[31m-[m
[31m-    /* force a full garbage-collection cycle */[m
[31m-    lua_gc(L, LUA_GCCOLLECT, 0);[m
[31m-[m
[31m-    return status == 0 ? NGX_OK : NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_do_call(ngx_log_t *log, lua_State *L)[m
[31m-{[m
[31m-    int                 status, base;[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_pool_t         *old_pool;[m
[31m-#endif[m
[31m-[m
[31m-    base = lua_gettop(L);  /* function index */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_traceback);  /* push traceback function */[m
[31m-    lua_insert(L, base);  /* put it under chunk and args */[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    old_pool = ngx_http_lua_pcre_malloc_init(ngx_cycle->pool);[m
[31m-#endif[m
[31m-[m
[31m-    status = lua_pcall(L, 0, 0, base);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    ngx_http_lua_pcre_malloc_done(old_pool);[m
[31m-#endif[m
[31m-[m
[31m-    lua_remove(L, base);[m
[31m-[m
[31m-    return status;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_get_raw_phase_context(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t      *r;[m
[31m-    ngx_http_lua_ctx_t      *ctx;[m
[31m-[m
[31m-    r = lua_touserdata(L, 1);[m
[31m-    if (r == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return 0;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, (int) ctx->context);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-ngx_http_cleanup_t *[m
[31m-ngx_http_lua_cleanup_add(ngx_http_request_t *r, size_t size)[m
[31m-{[m
[31m-    ngx_http_cleanup_t  *cln;[m
[31m-    ngx_http_lua_ctx_t  *ctx;[m
[31m-[m
[31m-    if (size == 0) {[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-[m
[31m-        r = r->main;[m
[31m-[m
[31m-        if (ctx != NULL && ctx->free_cleanup) {[m
[31m-            cln = ctx->free_cleanup;[m
[31m-            ctx->free_cleanup = cln->next;[m
[31m-[m
[31m-            dd("reuse cleanup: %p", cln);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua http cleanup reuse: %p", cln);[m
[31m-[m
[31m-            cln->handler = NULL;[m
[31m-            cln->next = r->cleanup;[m
[31m-[m
[31m-            r->cleanup = cln;[m
[31m-[m
[31m-            return cln;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_cleanup_add(r, size);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_cleanup_free(ngx_http_request_t *r, ngx_http_cleanup_pt *cleanup)[m
[31m-{[m
[31m-    ngx_http_cleanup_t  **last;[m
[31m-    ngx_http_cleanup_t   *cln;[m
[31m-    ngx_http_lua_ctx_t   *ctx;[m
[31m-[m
[31m-    ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    if (ctx == NULL) {[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r = r->main;[m
[31m-[m
[31m-    cln = (ngx_http_cleanup_t *)[m
[31m-              ((u_char *) cleanup - offsetof(ngx_http_cleanup_t, handler));[m
[31m-[m
[31m-    dd("cln: %p, cln->handler: %p, &cln->handler: %p",[m
[31m-       cln, cln->handler, &cln->handler);[m
[31m-[m
[31m-    last = &r->cleanup;[m
[31m-[m
[31m-    while (*last) {[m
[31m-        if (*last == cln) {[m
[31m-            *last = cln->next;[m
[31m-[m
[31m-            cln->next = ctx->free_cleanup;[m
[31m-            ctx->free_cleanup = cln;[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                           "lua http cleanup free: %p", cln);[m
[31m-[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        last = &(*last)->next;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_util.h[m
[1mdeleted file mode 100644[m
[1mindex f0e8923..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,441 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_UTIL_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_UTIL_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_UNESCAPE_URI_COMPONENT[m
[31m-#define NGX_UNESCAPE_URI_COMPONENT  0[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-typedef struct {[m
[31m-    int          len;[m
[31m-    /* this padding hole on 64-bit systems is expected */[m
[31m-    u_char      *data;[m
[31m-} ngx_http_lua_ffi_str_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_lua_ffi_str_t   key;[m
[31m-    ngx_http_lua_ffi_str_t   value;[m
[31m-} ngx_http_lua_ffi_table_elt_t;[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* char whose address we use as the key in Lua vm registry for[m
[31m- * user code cache table */[m
[31m-extern char ngx_http_lua_code_cache_key;[m
[31m-[m
[31m-[m
[31m-/* key in Lua vm registry for all the "ngx.ctx" tables */[m
[31m-#define ngx_http_lua_ctx_tables_key  "ngx_lua_ctx_tables"[m
[31m-[m
[31m-[m
[31m-/* char whose address we use as the key in Lua vm registry for[m
[31m- * regex cache table  */[m
[31m-extern char ngx_http_lua_regex_cache_key;[m
[31m-[m
[31m-/* char whose address we use as the key in Lua vm registry for[m
[31m- * socket connection pool table */[m
[31m-extern char ngx_http_lua_socket_pool_key;[m
[31m-[m
[31m-/* char whose address we use as the key for the coroutine parent relationship */[m
[31m-extern char ngx_http_lua_coroutine_parents_key;[m
[31m-[m
[31m-/* coroutine anchoring table key in Lua VM registry */[m
[31m-extern char ngx_http_lua_coroutines_key;[m
[31m-[m
[31m-/* key to the metatable for ngx.req.get_headers() and ngx.resp.get_headers() */[m
[31m-extern char ngx_http_lua_headers_metatable_key;[m
[31m-[m
[31m-[m
[31m-#ifndef ngx_str_set[m
[31m-#define ngx_str_set(str, text)                                               \[m
[31m-    (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_HTTP_SWITCHING_PROTOCOLS[m
[31m-#define NGX_HTTP_SWITCHING_PROTOCOLS 101[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version < 1000000[m
[31m-#define ngx_memmove(dst, src, n)   (void) memmove(dst, src, n)[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_context_name(c)                                         \[m
[31m-    ((c) == NGX_HTTP_LUA_CONTEXT_SET ? "set_by_lua*"                         \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_REWRITE ? "rewrite_by_lua*"               \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_ACCESS ? "access_by_lua*"                 \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_CONTENT ? "content_by_lua*"               \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_LOG ? "log_by_lua*"                       \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_HEADER_FILTER ? "header_filter_by_lua*"   \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_BODY_FILTER ? "body_filter_by_lua*"       \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_TIMER ? "ngx.timer"                       \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_INIT_WORKER ? "init_worker_by_lua*"       \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_BALANCER ? "balancer_by_lua*"             \[m
[31m-     : (c) == NGX_HTTP_LUA_CONTEXT_SSL_CERT ? "ssl_certificate_by_lua*"      \[m
[31m-     : "(unknown)")[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_check_context(L, ctx, flags)                            \[m
[31m-    if (!((ctx)->context & (flags))) {                                       \[m
[31m-        return luaL_error(L, "API disabled in the context of %s",            \[m
[31m-                          ngx_http_lua_context_name((ctx)->context));        \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_lua_ffi_check_context(ngx_http_lua_ctx_t *ctx, unsigned flags,[m
[31m-    u_char *err, size_t *errlen)[m
[31m-{[m
[31m-    if (!(ctx->context & flags)) {[m
[31m-        *errlen = ngx_snprintf(err, *errlen,[m
[31m-                               "API disabled in the context of %s",[m
[31m-                               ngx_http_lua_context_name((ctx)->context))[m
[31m-                  - err;[m
[31m-[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_check_fake_request(L, r)                                \[m
[31m-    if ((r)->connection->fd == (ngx_socket_t) -1) {                          \[m
[31m-        return luaL_error(L, "API disabled in the current context");         \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_check_fake_request2(L, r, ctx)                          \[m
[31m-    if ((r)->connection->fd == (ngx_socket_t) -1) {                          \[m
[31m-        return luaL_error(L, "API disabled in the context of %s",            \[m
[31m-                          ngx_http_lua_context_name((ctx)->context));        \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_ssl_get_ctx(ssl_conn)                                   \[m
[31m-    SSL_get_ex_data(ssl_conn, ngx_http_lua_ssl_ctx_index)[m
[31m-[m
[31m-[m
[31m-lua_State *ngx_http_lua_init_vm(lua_State *parent_vm, ngx_cycle_t *cycle,[m
[31m-    ngx_pool_t *pool, ngx_http_lua_main_conf_t *lmcf, ngx_log_t *log,[m
[31m-    ngx_pool_cleanup_t **pcln);[m
[31m-[m
[31m-lua_State *ngx_http_lua_new_thread(ngx_http_request_t *r, lua_State *l,[m
[31m-    int *ref);[m
[31m-[m
[31m-u_char *ngx_http_lua_rebase_path(ngx_pool_t *pool, u_char *src, size_t len);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_send_header_if_needed(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_send_chain_link(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_chain_t *cl);[m
[31m-[m
[31m-void ngx_http_lua_discard_bufs(ngx_pool_t *pool, ngx_chain_t *in);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_add_copy_chain(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_chain_t ***plast, ngx_chain_t *in,[m
[31m-    ngx_int_t *eof);[m
[31m-[m
[31m-void ngx_http_lua_reset_ctx(ngx_http_request_t *r, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-void ngx_http_lua_generic_phase_post_read(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_lua_request_cleanup(ngx_http_lua_ctx_t *ctx, int foricible);[m
[31m-[m
[31m-void ngx_http_lua_request_cleanup_handler(void *data);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_run_thread(lua_State *L, ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, volatile int nret);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_wev_handler(ngx_http_request_t *r);[m
[31m-[m
[31m-u_char *ngx_http_lua_digest_hex(u_char *dest, const u_char *buf,[m
[31m-    int buf_len);[m
[31m-[m
[31m-void ngx_http_lua_set_multi_value_table(lua_State *L, int index);[m
[31m-[m
[31m-void ngx_http_lua_unescape_uri(u_char **dst, u_char **src, size_t size,[m
[31m-    ngx_uint_t type);[m
[31m-[m
[31m-uintptr_t ngx_http_lua_escape_uri(u_char *dst, u_char *src,[m
[31m-    size_t size, ngx_uint_t type);[m
[31m-[m
[31m-void ngx_http_lua_inject_req_api(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-void ngx_http_lua_process_args_option(ngx_http_request_t *r,[m
[31m-    lua_State *L, int table, ngx_str_t *args);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_open_and_stat_file(u_char *name,[m
[31m-    ngx_open_file_info_t *of, ngx_log_t *log);[m
[31m-[m
[31m-ngx_chain_t *ngx_http_lua_chain_get_free_buf(ngx_log_t *log, ngx_pool_t *p,[m
[31m-    ngx_chain_t **free, size_t len);[m
[31m-[m
[31m-void ngx_http_lua_create_new_globals_table(lua_State *L, int narr, int nrec);[m
[31m-[m
[31m-int ngx_http_lua_traceback(lua_State *L);[m
[31m-[m
[31m-ngx_http_lua_co_ctx_t *ngx_http_lua_get_co_ctx(lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-ngx_http_lua_co_ctx_t *ngx_http_lua_create_co_ctx(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_run_posted_threads(ngx_connection_t *c, lua_State *L,[m
[31m-    ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_post_thread(ngx_http_request_t *r,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx);[m
[31m-[m
[31m-void ngx_http_lua_del_thread(ngx_http_request_t *r, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx, ngx_http_lua_co_ctx_t *coctx);[m
[31m-[m
[31m-void ngx_http_lua_rd_check_broken_connection(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_test_expect(ngx_http_request_t *r);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_check_broken_connection(ngx_http_request_t *r,[m
[31m-    ngx_event_t *ev);[m
[31m-[m
[31m-void ngx_http_lua_finalize_request(ngx_http_request_t *r, ngx_int_t rc);[m
[31m-[m
[31m-void ngx_http_lua_finalize_fake_request(ngx_http_request_t *r,[m
[31m-    ngx_int_t rc);[m
[31m-[m
[31m-void ngx_http_lua_close_fake_connection(ngx_connection_t *c);[m
[31m-[m
[31m-void ngx_http_lua_free_fake_request(ngx_http_request_t *r);[m
[31m-[m
[31m-void ngx_http_lua_release_ngx_ctx_table(ngx_log_t *log, lua_State *L,[m
[31m-    ngx_http_lua_ctx_t *ctx);[m
[31m-[m
[31m-void ngx_http_lua_cleanup_vm(void *data);[m
[31m-[m
[31m-ngx_connection_t *ngx_http_lua_create_fake_connection(ngx_pool_t *pool);[m
[31m-[m
[31m-ngx_http_request_t *ngx_http_lua_create_fake_request(ngx_connection_t *c);[m
[31m-[m
[31m-ngx_int_t ngx_http_lua_report(ngx_log_t *log, lua_State *L, int status,[m
[31m-    const char *prefix);[m
[31m-[m
[31m-int ngx_http_lua_do_call(ngx_log_t *log, lua_State *L);[m
[31m-[m
[31m-ngx_http_cleanup_t *ngx_http_lua_cleanup_add(ngx_http_request_t *r,[m
[31m-    size_t size);[m
[31m-[m
[31m-void ngx_http_lua_cleanup_free(ngx_http_request_t *r,[m
[31m-    ngx_http_cleanup_pt *cleanup);[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_check_if_abortable(L, ctx)                             \[m
[31m-    if ((ctx)->no_abort) {                                                  \[m
[31m-        return luaL_error(L, "attempt to abort with pending subrequests");  \[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_init_ctx(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_memzero(ctx, sizeof(ngx_http_lua_ctx_t));[m
[31m-    ctx->ctx_ref = LUA_NOREF;[m
[31m-    ctx->entry_co_ctx.co_ref = LUA_NOREF;[m
[31m-    ctx->resume_handler = ngx_http_lua_wev_handler;[m
[31m-    ctx->request = r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_http_lua_ctx_t *[m
[31m-ngx_http_lua_create_ctx(ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_State                   *L;[m
[31m-    ngx_http_lua_ctx_t          *ctx;[m
[31m-    ngx_pool_cleanup_t          *cln;[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    ctx = ngx_palloc(r->pool, sizeof(ngx_http_lua_ctx_t));[m
[31m-    if (ctx == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_init_ctx(r, ctx);[m
[31m-    ngx_http_set_ctx(r, ctx, ngx_http_lua_module);[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (!llcf->enable_code_cache && r->connection->fd != (ngx_socket_t) -1) {[m
[31m-        lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-[m
[31m-        dd("lmcf: %p", lmcf);[m
[31m-[m
[31m-        L = ngx_http_lua_init_vm(lmcf->lua, lmcf->cycle, r->pool, lmcf,[m
[31m-                                 r->connection->log, &cln);[m
[31m-        if (L == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "failed to initialize Lua VM");[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        if (lmcf->init_handler) {[m
[31m-            if (lmcf->init_handler(r->connection->log, lmcf, L) != NGX_OK) {[m
[31m-                /* an error happened */[m
[31m-                return NULL;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        ctx->vm_state = cln->data;[m
[31m-[m
[31m-    } else {[m
[31m-        ctx->vm_state = NULL;[m
[31m-    }[m
[31m-[m
[31m-    return ctx;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline lua_State *[m
[31m-ngx_http_lua_get_lua_vm(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_http_lua_main_conf_t    *lmcf;[m
[31m-[m
[31m-    if (ctx == NULL) {[m
[31m-        ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);[m
[31m-    }[m
[31m-[m
[31m-    if (ctx && ctx->vm_state) {[m
[31m-        return ctx->vm_state->vm;[m
[31m-    }[m
[31m-[m
[31m-    lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);[m
[31m-    dd("lmcf->lua: %p", lmcf->lua);[m
[31m-    return lmcf->lua;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_req_key  "__ngx_req"[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_http_request_t *[m
[31m-ngx_http_lua_get_req(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t    *r;[m
[31m-[m
[31m-    lua_getglobal(L, ngx_http_lua_req_key);[m
[31m-    r = lua_touserdata(L, -1);[m
[31m-    lua_pop(L, 1);[m
[31m-[m
[31m-    return r;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_set_req(lua_State *L, ngx_http_request_t *r)[m
[31m-{[m
[31m-    lua_pushlightuserdata(L, r);[m
[31m-    lua_setglobal(L, ngx_http_lua_req_key);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_get_globals_table(lua_State *L)[m
[31m-{[m
[31m-    lua_pushvalue(L, LUA_GLOBALSINDEX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_set_globals_table(lua_State *L)[m
[31m-{[m
[31m-    lua_replace(L, LUA_GLOBALSINDEX);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#define ngx_http_lua_hash_literal(s)                                        \[m
[31m-    ngx_http_lua_hash_str((u_char *) s, sizeof(s) - 1)[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_uint_t[m
[31m-ngx_http_lua_hash_str(u_char *src, size_t n)[m
[31m-{[m
[31m-    ngx_uint_t  key;[m
[31m-[m
[31m-    key = 0;[m
[31m-[m
[31m-    while (n--) {[m
[31m-        key = ngx_hash(key, *src);[m
[31m-        src++;[m
[31m-    }[m
[31m-[m
[31m-    return key;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_int_t[m
[31m-ngx_http_lua_set_content_type(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_lua_loc_conf_t     *llcf;[m
[31m-[m
[31m-    llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);[m
[31m-    if (llcf->use_default_type[m
[31m-        && r->headers_out.status != NGX_HTTP_NOT_MODIFIED)[m
[31m-    {[m
[31m-        return ngx_http_set_content_type(r);[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline void[m
[31m-ngx_http_lua_cleanup_pending_operation(ngx_http_lua_co_ctx_t *coctx)[m
[31m-{[m
[31m-    if (coctx->cleanup) {[m
[31m-        coctx->cleanup(coctx);[m
[31m-        coctx->cleanup = NULL;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_inline ngx_chain_t *[m
[31m-ngx_http_lua_get_flush_chain(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-[m
[31m-    cl = ngx_http_lua_chain_get_free_buf(r->connection->log, r->pool,[m
[31m-                                         &ctx->free_bufs, 0);[m
[31m-    if (cl == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf->flush = 1;[m
[31m-[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-extern ngx_uint_t  ngx_http_lua_location_hash;[m
[31m-extern ngx_uint_t  ngx_http_lua_content_length_hash;[m
[31m-extern int         ngx_http_lua_ssl_ctx_index;[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_UTIL_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_variable.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_variable.c[m
[1mdeleted file mode 100644[m
[1mindex b26c862..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_variable.c[m
[1m+++ /dev/null[m
[36m@@ -1,500 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_variable.h"[m
[31m-#include "ngx_http_lua_util.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_var_get(lua_State *L);[m
[31m-static int ngx_http_lua_var_set(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_variable_api(lua_State *L)[m
[31m-{[m
[31m-    /* {{{ register reference maps */[m
[31m-    lua_newtable(L);    /* ngx.var */[m
[31m-[m
[31m-    lua_createtable(L, 0, 2 /* nrec */); /* metatable for .var */[m
[31m-    lua_pushcfunction(L, ngx_http_lua_var_get);[m
[31m-    lua_setfield(L, -2, "__index");[m
[31m-    lua_pushcfunction(L, ngx_http_lua_var_set);[m
[31m-    lua_setfield(L, -2, "__newindex");[m
[31m-    lua_setmetatable(L, -2);[m
[31m-[m
[31m-    lua_setfield(L, -2, "var");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Get nginx internal variables content[m
[31m- *[m
[31m- * @retval Always return a string or nil on Lua stack. Return nil when failed[m
[31m- * to get content, and actual content string when found the specified variable.[m
[31m- * @seealso ngx_http_lua_var_set[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_var_get(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t          *r;[m
[31m-    u_char                      *p, *lowcase;[m
[31m-    size_t                       len;[m
[31m-    ngx_uint_t                   hash;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    u_char                      *val;[m
[31m-    ngx_uint_t                   n;[m
[31m-    LUA_NUMBER                   index;[m
[31m-    int                         *cap;[m
[31m-#endif[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (lua_type(L, -1) == LUA_TNUMBER) {[m
[31m-        /* it is a regex capturing variable */[m
[31m-[m
[31m-        index = lua_tonumber(L, -1);[m
[31m-[m
[31m-        if (index <= 0) {[m
[31m-            lua_pushnil(L);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        n = (ngx_uint_t) index * 2;[m
[31m-[m
[31m-        dd("n = %d, ncaptures = %d", (int) n, (int) r->ncaptures);[m
[31m-[m
[31m-        if (r->captures == NULL[m
[31m-            || r->captures_data == NULL[m
[31m-            || n >= r->ncaptures)[m
[31m-        {[m
[31m-            lua_pushnil(L);[m
[31m-            return 1;[m
[31m-        }[m
[31m-[m
[31m-        /* n >= 0 && n < r->ncaptures */[m
[31m-[m
[31m-        cap = r->captures;[m
[31m-[m
[31m-        p = r->captures_data;[m
[31m-[m
[31m-        val = &p[cap[n]];[m
[31m-[m
[31m-        lua_pushlstring(L, (const char *) val, (size_t) (cap[n + 1] - cap[n]));[m
[31m-[m
[31m-        return 1;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    if (lua_type(L, -1) != LUA_TSTRING) {[m
[31m-        return luaL_error(L, "bad variable name");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) lua_tolstring(L, -1, &len);[m
[31m-[m
[31m-    lowcase = lua_newuserdata(L, len);[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase, p, len);[m
[31m-[m
[31m-    name.len = len;[m
[31m-    name.data = lowcase;[m
[31m-[m
[31m-    vv = ngx_http_get_variable(r, &name, hash);[m
[31m-[m
[31m-    if (vv == NULL || vv->not_found) {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushlstring(L, (const char *) vv->data, (size_t) vv->len);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/**[m
[31m- * Set nginx internal variable content[m
[31m- *[m
[31m- * @retval Always return a boolean on Lua stack. Return true when variable[m
[31m- * content was modified successfully, false otherwise.[m
[31m- * @seealso ngx_http_lua_var_get[m
[31m- * */[m
[31m-static int[m
[31m-ngx_http_lua_var_set(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_variable_t         *v;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-    u_char                      *p, *lowcase, *val;[m
[31m-    size_t                       len;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_uint_t                   hash;[m
[31m-    ngx_http_request_t          *r;[m
[31m-    int                          value_type;[m
[31m-    const char                  *msg;[m
[31m-[m
[31m-    r = ngx_http_lua_get_req(L);[m
[31m-    if (r == NULL) {[m
[31m-        return luaL_error(L, "no request object found");[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_lua_check_fake_request(L, r);[m
[31m-[m
[31m-    /* we skip the first argument that is the table */[m
[31m-[m
[31m-    /* we read the variable name */[m
[31m-[m
[31m-    if (lua_type(L, 2) != LUA_TSTRING) {[m
[31m-        return luaL_error(L, "bad variable name");[m
[31m-    }[m
[31m-[m
[31m-    p = (u_char *) lua_tolstring(L, 2, &len);[m
[31m-[m
[31m-    lowcase = lua_newuserdata(L, len + 1);[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase, p, len);[m
[31m-    lowcase[len] = '\0';[m
[31m-[m
[31m-    name.len = len;[m
[31m-    name.data = lowcase;[m
[31m-[m
[31m-    /* we read the variable new value */[m
[31m-[m
[31m-    value_type = lua_type(L, 3);[m
[31m-    switch (value_type) {[m
[31m-    case LUA_TNUMBER:[m
[31m-    case LUA_TSTRING:[m
[31m-        p = (u_char *) luaL_checklstring(L, 3, &len);[m
[31m-[m
[31m-        val = ngx_palloc(r->pool, len);[m
[31m-        if (val == NULL) {[m
[31m-            return luaL_error(L, "memory allocation error");[m
[31m-        }[m
[31m-[m
[31m-        ngx_memcpy(val, p, len);[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    case LUA_TNIL:[m
[31m-        /* undef the variable */[m
[31m-[m
[31m-        val = NULL;[m
[31m-        len = 0;[m
[31m-[m
[31m-        break;[m
[31m-[m
[31m-    default:[m
[31m-        msg = lua_pushfstring(L, "string, number, or nil expected, "[m
[31m-                              "but got %s", lua_typename(L, value_type));[m
[31m-        return luaL_argerror(L, 1, msg);[m
[31m-    }[m
[31m-[m
[31m-    /* we fetch the variable itself */[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v = ngx_hash_find(&cmcf->variables_hash, hash, name.data, name.len);[m
[31m-[m
[31m-    if (v) {[m
[31m-        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {[m
[31m-            return luaL_error(L, "variable \"%s\" not changeable", lowcase);[m
[31m-        }[m
[31m-[m
[31m-        if (v->set_handler) {[m
[31m-[m
[31m-            dd("set variables with set_handler");[m
[31m-[m
[31m-            vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));[m
[31m-            if (vv == NULL) {[m
[31m-                return luaL_error(L, "no memory");[m
[31m-            }[m
[31m-[m
[31m-            if (value_type == LUA_TNIL) {[m
[31m-                vv->valid = 0;[m
[31m-                vv->not_found = 1;[m
[31m-                vv->no_cacheable = 0;[m
[31m-                vv->data = NULL;[m
[31m-                vv->len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = val;[m
[31m-                vv->len = len;[m
[31m-            }[m
[31m-[m
[31m-            v->set_handler(r, vv, v->data);[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        if (v->flags & NGX_HTTP_VAR_INDEXED) {[m
[31m-            vv = &r->variables[v->index];[m
[31m-[m
[31m-            dd("set indexed variable");[m
[31m-[m
[31m-            if (value_type == LUA_TNIL) {[m
[31m-                vv->valid = 0;[m
[31m-                vv->not_found = 1;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = NULL;[m
[31m-                vv->len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = val;[m
[31m-                vv->len = len;[m
[31m-            }[m
[31m-[m
[31m-            return 0;[m
[31m-        }[m
[31m-[m
[31m-        return luaL_error(L, "variable \"%s\" cannot be assigned a value",[m
[31m-                          lowcase);[m
[31m-    }[m
[31m-[m
[31m-    /* variable not found */[m
[31m-[m
[31m-    return luaL_error(L, "variable \"%s\" not found for writing; "[m
[31m-                      "maybe it is a built-in variable that is not changeable "[m
[31m-                      "or you forgot to use \"set $%s '';\" "[m
[31m-                      "in the config file to define it first",[m
[31m-                      lowcase, lowcase);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_var_get(ngx_http_request_t *r, u_char *name_data,[m
[31m-    size_t name_len, u_char *lowcase_buf, int capture_id, u_char **value,[m
[31m-    size_t *value_len, char **err)[m
[31m-{[m
[31m-    ngx_uint_t                   hash;[m
[31m-    ngx_str_t                    name;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    u_char                      *p;[m
[31m-    ngx_uint_t                   n;[m
[31m-    int                         *cap;[m
[31m-#endif[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        *err = "no request object found";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((r)->connection->fd == (ngx_socket_t) -1) {[m
[31m-        *err = "API disabled in the current context";[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-#if (NGX_PCRE)[m
[31m-    if (name_data == 0) {[m
[31m-        if (capture_id <= 0) {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        /* it is a regex capturing variable */[m
[31m-[m
[31m-        n = (ngx_uint_t) capture_id * 2;[m
[31m-[m
[31m-        dd("n = %d, ncaptures = %d", (int) n, (int) r->ncaptures);[m
[31m-[m
[31m-        if (r->captures == NULL[m
[31m-            || r->captures_data == NULL[m
[31m-            || n >= r->ncaptures)[m
[31m-        {[m
[31m-            return NGX_DECLINED;[m
[31m-        }[m
[31m-[m
[31m-        /* n >= 0 && n < r->ncaptures */[m
[31m-[m
[31m-        cap = r->captures;[m
[31m-        p = r->captures_data;[m
[31m-[m
[31m-        *value = &p[cap[n]];[m
[31m-        *value_len = (size_t) (cap[n + 1] - cap[n]);[m
[31m-[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase_buf, name_data, name_len);[m
[31m-[m
[31m-    name.data = lowcase_buf;[m
[31m-    name.len = name_len;[m
[31m-[m
[31m-    dd("variable name: %.*s", (int) name_len, lowcase_buf);[m
[31m-[m
[31m-    vv = ngx_http_get_variable(r, &name, hash);[m
[31m-    if (vv == NULL || vv->not_found) {[m
[31m-        return NGX_DECLINED;[m
[31m-    }[m
[31m-[m
[31m-    *value = vv->data;[m
[31m-    *value_len = vv->len;[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_var_set(ngx_http_request_t *r, u_char *name_data,[m
[31m-    size_t name_len, u_char *lowcase_buf, u_char *value, size_t value_len,[m
[31m-    u_char *errbuf, size_t errlen)[m
[31m-{[m
[31m-    u_char                      *p;[m
[31m-    ngx_uint_t                   hash;[m
[31m-    ngx_http_variable_t         *v;[m
[31m-    ngx_http_variable_value_t   *vv;[m
[31m-    ngx_http_core_main_conf_t   *cmcf;[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        ngx_snprintf(errbuf, errlen, "no request object found");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if ((r)->connection->fd == (ngx_socket_t) -1) {[m
[31m-        ngx_snprintf(errbuf, errlen, "API disabled in the current context");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    hash = ngx_hash_strlow(lowcase_buf, name_data, name_len);[m
[31m-[m
[31m-    dd("variable name: %.*s", (int) name_len, lowcase_buf);[m
[31m-[m
[31m-    /* we fetch the variable itself */[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    v = ngx_hash_find(&cmcf->variables_hash, hash, lowcase_buf, name_len);[m
[31m-[m
[31m-    if (v) {[m
[31m-        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {[m
[31m-            dd("variable not changeable");[m
[31m-            ngx_snprintf(errbuf, errlen, "variable \"%*s\" not changeable",[m
[31m-                         name_len, lowcase_buf);[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (v->set_handler) {[m
[31m-[m
[31m-            dd("set variables with set_handler");[m
[31m-[m
[31m-            if (value != NULL && value_len) {[m
[31m-                vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t)[m
[31m-                                + value_len);[m
[31m-                if (vv == NULL) {[m
[31m-                    goto nomem;[m
[31m-                }[m
[31m-[m
[31m-                p = (u_char *) vv + sizeof(ngx_http_variable_value_t);[m
[31m-                ngx_memcpy(p, value, value_len);[m
[31m-                value = p;[m
[31m-[m
[31m-            } else {[m
[31m-                vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));[m
[31m-                if (vv == NULL) {[m
[31m-                    goto nomem;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (value == NULL) {[m
[31m-                vv->valid = 0;[m
[31m-                vv->not_found = 1;[m
[31m-                vv->no_cacheable = 0;[m
[31m-                vv->data = NULL;[m
[31m-                vv->len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = value;[m
[31m-                vv->len = value_len;[m
[31m-            }[m
[31m-[m
[31m-            v->set_handler(r, vv, v->data);[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        if (v->flags & NGX_HTTP_VAR_INDEXED) {[m
[31m-            vv = &r->variables[v->index];[m
[31m-[m
[31m-            dd("set indexed variable");[m
[31m-[m
[31m-            if (value == NULL) {[m
[31m-                vv->valid = 0;[m
[31m-                vv->not_found = 1;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = NULL;[m
[31m-                vv->len = 0;[m
[31m-[m
[31m-            } else {[m
[31m-                p = ngx_palloc(r->pool, value_len);[m
[31m-                if (p == NULL) {[m
[31m-                    goto nomem;[m
[31m-                }[m
[31m-[m
[31m-                ngx_memcpy(p, value, value_len);[m
[31m-                value = p;[m
[31m-[m
[31m-                vv->valid = 1;[m
[31m-                vv->not_found = 0;[m
[31m-                vv->no_cacheable = 0;[m
[31m-[m
[31m-                vv->data = value;[m
[31m-                vv->len = value_len;[m
[31m-            }[m
[31m-[m
[31m-            return NGX_OK;[m
[31m-        }[m
[31m-[m
[31m-        ngx_snprintf(errbuf, errlen, "variable \"%*s\" cannot be assigned "[m
[31m-                     "a value", name_len, lowcase_buf);[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* variable not found */[m
[31m-[m
[31m-    ngx_snprintf(errbuf, errlen, "variable \"%*s\" not found for writing; "[m
[31m-                 "maybe it is a built-in variable that is not changeable "[m
[31m-                 "or you forgot to use \"set $%*s '';\" "[m
[31m-                 "in the config file to define it first",[m
[31m-                 name_len, lowcase_buf, name_len, lowcase_buf);[m
[31m-    return NGX_ERROR;[m
[31m-[m
[31m-nomem:[m
[31m-[m
[31m-    ngx_snprintf(errbuf, errlen, "no memory");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-#endif /* NGX_LUA_NO_FFI_API */[m
[31m-[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_variable.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_variable.h[m
[1mdeleted file mode 100644[m
[1mindex 550e4d3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_variable.h[m
[1m+++ /dev/null[m
[36m@@ -1,20 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Xiaozhe Wang (chaoslawful)[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_VARIABLE_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_VARIABLE_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_variable_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_VARIABLE_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_worker.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_worker.c[m
[1mdeleted file mode 100644[m
[1mindex ff09b5b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_worker.c[m
[1m+++ /dev/null[m
[36m@@ -1,133 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_worker.h"[m
[31m-[m
[31m-[m
[31m-static int ngx_http_lua_ngx_worker_exiting(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_worker_pid(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_worker_id(lua_State *L);[m
[31m-static int ngx_http_lua_ngx_worker_count(lua_State *L);[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_http_lua_inject_worker_api(lua_State *L)[m
[31m-{[m
[31m-    lua_createtable(L, 0 /* narr */, 4 /* nrec */);    /* ngx.worker. */[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_worker_exiting);[m
[31m-    lua_setfield(L, -2, "exiting");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_worker_pid);[m
[31m-    lua_setfield(L, -2, "pid");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_worker_id);[m
[31m-    lua_setfield(L, -2, "id");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_ngx_worker_count);[m
[31m-    lua_setfield(L, -2, "count");[m
[31m-[m
[31m-    lua_setfield(L, -2, "worker");[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_worker_exiting(lua_State *L)[m
[31m-{[m
[31m-    lua_pushboolean(L, ngx_exiting);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_worker_pid(lua_State *L)[m
[31m-{[m
[31m-    lua_pushinteger(L, (lua_Integer) ngx_pid);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_worker_id(lua_State *L)[m
[31m-{[m
[31m-#if (nginx_version >= 1009001)[m
[31m-    if (ngx_process != NGX_PROCESS_WORKER[m
[31m-        && ngx_process != NGX_PROCESS_SINGLE)[m
[31m-    {[m
[31m-        lua_pushnil(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_pushinteger(L, (lua_Integer) ngx_worker);[m
[31m-#else[m
[31m-    lua_pushnil(L);[m
[31m-#endif[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_ngx_worker_count(lua_State *L)[m
[31m-{[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    lua_pushinteger(L, (lua_Integer) ccf->worker_processes);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-#ifndef NGX_LUA_NO_FFI_API[m
[31m-int[m
[31m-ngx_http_lua_ffi_worker_pid(void)[m
[31m-{[m
[31m-    return (int) ngx_pid;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_worker_id(void)[m
[31m-{[m
[31m-#if (nginx_version >= 1009001)[m
[31m-    if (ngx_process != NGX_PROCESS_WORKER[m
[31m-        && ngx_process != NGX_PROCESS_SINGLE)[m
[31m-    {[m
[31m-        return -1;[m
[31m-    }[m
[31m-[m
[31m-    return (int) ngx_worker;[m
[31m-#else[m
[31m-    return -1;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_worker_exiting(void)[m
[31m-{[m
[31m-    return (int) ngx_exiting;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-int[m
[31m-ngx_http_lua_ffi_worker_count(void)[m
[31m-{[m
[31m-    ngx_core_conf_t   *ccf;[m
[31m-[m
[31m-    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,[m
[31m-                                           ngx_core_module);[m
[31m-[m
[31m-    return (int) ccf->worker_processes;[m
[31m-}[m
[31m-#endif[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_worker.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_worker.h[m
[1mdeleted file mode 100644[m
[1mindex 3080394..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/src/ngx_http_lua_worker.h[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _NGX_HTTP_LUA_WORKER_H_INCLUDED_[m
[31m-#define _NGX_HTTP_LUA_WORKER_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include "ngx_http_lua_common.h"[m
[31m-[m
[31m-[m
[31m-void ngx_http_lua_inject_worker_api(lua_State *L);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_LUA_WORKER_H_INCLUDED_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 3170741..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,2 +0,0 @@[m
[31m-servroot[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/000--init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/000--init.t[m
[1mdeleted file mode 100644[m
[1mindex 364334f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/000--init.t[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: conv_uid - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "DROP TABLE IF EXISTS conv_uid";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: conv_uid - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "CREATE TABLE conv_uid(id serial primary key, new_uid integer, old_uid integer)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: conv_uid - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        drizzle_pass   database;[m
[31m-        drizzle_query  "INSERT INTO conv_uid(old_uid,new_uid) VALUES(32,56),(35,78)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush data from memcached[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /flush[m
[31m---- error_code: 200[m
[31m---- response_body eval[m
[31m-"OK\r[m
[31m-"[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/000-sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/000-sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 3f66752..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/000-sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,34 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity (integer)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo 2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo "helloworld";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-helloworld[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/001-set.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/001-set.t[m
[1mdeleted file mode 100644[m
[1mindex 2295a2d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/001-set.t[m
[1m+++ /dev/null[m
[36m@@ -1,798 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 4);[m
[31m-[m
[31m-#log_level("warn");[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple set (integer)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "return 1+1";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple set (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "return 'hello' .. 'world'";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-helloworld[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: internal only[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "function fib(n) if n > 2 then return fib(n-1)+fib(n-2) else return 1 end end return fib(10)";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-55[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: inlined script with arguments[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "return ngx.arg[1] + ngx.arg[2]" $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: fib by arg[m
[31m---- config[m
[31m-    location /fib {[m
[31m-        set_by_lua $res "function fib(n) if n > 2 then return fib(n-1)+fib(n-2) else return 1 end end return fib(tonumber(ngx.arg[1]))" $arg_n;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /fib?n=10[m
[31m---- response_body[m
[31m-55[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: adder[m
[31m---- config[m
[31m-    location = /adder {[m
[31m-        set_by_lua $res[m
[31m-            "local a = tonumber(ngx.arg[1])[m
[31m-             local b = tonumber(ngx.arg[2])[m
[31m-             return a + b" $arg_a $arg_b;[m
[31m-[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /adder?a=25&b=75[m
[31m---- response_body[m
[31m-100[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read nginx variables directly from within Lua[m
[31m---- config[m
[31m-    location = /set-both {[m
[31m-        set $b 32;[m
[31m-        set_by_lua $a "return tonumber(ngx.var.b) + 1";[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m---- request[m
[31m-GET /set-both[m
[31m---- response_body[m
[31m-a = 33[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set nginx variables directly from within Lua[m
[31m---- config[m
[31m-    location = /set-both {[m
[31m-        set $b "";[m
[31m-        set_by_lua $a "ngx.var.b = 32; return 7";[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-        echo "b = $b";[m
[31m-    }[m
[31m---- request[m
[31m-GET /set-both[m
[31m---- response_body[m
[31m-a = 7[m
[31m-b = 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set non-existent nginx variables[m
[31m---- config[m
[31m-    location = /set-both {[m
[31m-        #set $b "";[m
[31m-        set_by_lua $a "ngx.var.b = 32; return 7";[m
[31m-[m
[31m-        echo "a = $a";[m
[31m-    }[m
[31m---- request[m
[31m-GET /set-both[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-variable "b" not found for writing; maybe it is a built-in variable that is not changeable or you forgot to use "set $b '';" in the config file to define it first[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set quote sql str[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        set $a "";[m
[31m-        set_by_lua $a "return ngx.quote_sql_str(ngx.var.a)";[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-''[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set md5[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        set_by_lua $a 'return ngx.md5("hello")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: no ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.print(32) return 1";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.say(32) return 1";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: no ngx.flush[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.flush()";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: no ngx.eof[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.eof()";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: no ngx.send_headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "ngx.send_headers()";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: no ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.location.capture("/sub")';[m
[31m-        echo $res;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: no ngx.location.capture_multi[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.location.capture_multi{{"/sub"}}';[m
[31m-        echo $res;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: no ngx.exit[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.exit(0)';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: no ngx.redirect[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.redirect("/blah")';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: no ngx.exec[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.exec("/blah")';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: no ngx.req.set_uri(uri, true)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.req.set_uri("/blah", true)';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.req.set_uri(uri) exists[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.req.set_uri("/blah") return 1';[m
[31m-        echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/blah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: no ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'ngx.req.read_body()';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: no ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'return ngx.req.socket()';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: no ngx.socket.tcp()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'return ngx.socket.tcp()';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: no ngx.socket.connect()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'return ngx.socket.connect("127.0.0.1", 80)';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: set $limit_rate (variables with set_handler)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $limit_rate 1000;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.limit_rate = 180;[m
[31m-        ';[m
[31m-        echo "limit rate = $limit_rate";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-limit rate = 180[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: set $args and read $query_string[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.args = "world";[m
[31m-        ';[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: set $arg_xxx[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.arg_foo = "world";[m
[31m-        ';[m
[31m-        echo $arg_foo;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua?foo=3[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-variable "arg_foo" not found for writing; maybe it is a built-in variable that is not changeable or you forgot to use "set $arg_foo '';" in the config file to define it first[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: symbol $ in lua code of set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'return "$unknown"';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-$unknown[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: symbol $ in lua code of set_by_lua_file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $res html/a.lua;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return "$unknown"[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-$unknown[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: external script files with arguments[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $res html/a.lua $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return ngx.arg[1] + ngx.arg[2][m
[31m---- request[m
[31m-GET /lua?a=5&b=2[m
[31m---- response_body[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: variables in set_by_lua_file's file path[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $path "html/a.lua";[m
[31m-        set_by_lua_file $res $path $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return ngx.arg[1] + ngx.arg[2][m
[31m---- request[m
[31m-GET /lua?a=5&b=2[m
[31m---- response_body[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: lua error (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'error("Bad")';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-failed to run set_by_lua*: set_by_lua:1: Bad[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: lua error (nil)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'error(nil)';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-failed to run set_by_lua*: unknown reason[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: globals get cleared for every single request[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res '[m
[31m-            if not foo then[m
[31m-                foo = 1[m
[31m-            else[m
[31m-                foo = foo + 1[m
[31m-            end[m
[31m-            return foo[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: user modules using ngx.arg[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res 'local foo = require "foo" return foo.go()' $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    return ngx.arg[1] + ngx.arg[2][m
[31m-end[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: server scope (inline)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $a "[$res]";[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    set_by_lua $res "return 1+1";[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: server if scope (inline)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $a "[$res]";[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    if ($arg_name = "jim") {[m
[31m-        set_by_lua $res "return 1+1";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?name=jim[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: location if scope (inline)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        if ($arg_name = "jim") {[m
[31m-            set_by_lua $res "return 1+1";[m
[31m-            set $a "[$res]";[m
[31m-            echo $a;[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?name=jim[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: server scope (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $a "[$res]";[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    set_by_lua_file $res html/a.lua;[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return 1+1[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: server if scope (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $a "[$res]";[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    if ($arg_name = "jim") {[m
[31m-        set_by_lua_file $res html/a.lua;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?name=jim[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return 1+1[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: location if scope (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        if ($arg_name = "jim") {[m
[31m-            set_by_lua_file $res html/a.lua;[m
[31m-            set $a "[$res]";[m
[31m-            echo $a;[m
[31m-        }[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return 1+1[m
[31m---- request[m
[31m-GET /lua?name=jim[m
[31m---- response_body[m
[31m-[2][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: backtrace[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set_by_lua $a '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                error("something bad happened")[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-        ';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-something bad happened[m
[31m-stack traceback:[m
[31m-in function 'error'[m
[31m-in function 'bar'[m
[31m-in function 'foo'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $a html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/002-content.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/002-content.t[m
[1mdeleted file mode 100644[m
[1mindex e6cb62d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/002-content.t[m
[1m+++ /dev/null[m
[36m@@ -1,839 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 19);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.print("Hello, Lua!\\n")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "print failed: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic say[m
[31m---- config[m
[31m-    location /say {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.say("Hello, Lua!")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "say failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.say("Yay! ", 123)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "say failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /say[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-Yay! 123[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no ngx.echo[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.echo("Hello, Lua!\\n")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/content_by_lua\(nginx\.conf:\d+\):1: attempt to call field 'echo' \(a nil value\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: variable[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua 'v = ngx.var["request_uri"] ngx.print("request_uri: ", v, "\\n")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variable (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: calc expression[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/calc.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> calc.lua[m
[31m-local function uri_unescape(uri)[m
[31m-    local function convert(hex)[m
[31m-        return string.char(tonumber("0x"..hex))[m
[31m-    end[m
[31m-    local s = string.gsub(uri, "%%([0-9a-fA-F][0-9a-fA-F])", convert)[m
[31m-    return s[m
[31m-end[m
[31m-[m
[31m-local function eval_exp(str)[m
[31m-    return loadstring("return "..str)()[m
[31m-end[m
[31m-[m
[31m-local exp_str = ngx.var["arg_exp"][m
[31m--- print("exp: '", exp_str, "'\n")[m
[31m-local status, res[m
[31m-status, res = pcall(uri_unescape, exp_str)[m
[31m-if not status then[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-    return[m
[31m-end[m
[31m-status, res = pcall(eval_exp, res)[m
[31m-if status then[m
[31m-    ngx.print("result: ", res, "\n")[m
[31m-else[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua?exp=1%2B2*math.sin(3)%2Fmath.exp(4)-math.sqrt(2)[m
[31m---- response_body[m
[31m-result: -0.4090441561579[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read $arg_xxx[m
[31m---- config[m
[31m-    location = /lua {[m
[31m-        content_by_lua 'who = ngx.var.arg_who[m
[31m-            ngx.print("Hello, ", who, "!")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?who=agentzh[m
[31m---- response_body chomp[m
[31m-Hello, agentzh![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: capture location[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua 'res = ngx.location.capture("/other"); ngx.print("status=", res.status, " "); ngx.print("body=", res.body)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-status=200 body=hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-ei= TEST 9: capture non-existed location[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'res = ngx.location.capture("/other"); ngx.print("status=", res.status)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body: status=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: invalid capture location (not as expected...)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'res = ngx.location.capture("*(#*"); ngx.say("res=", res.status)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-res=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nil is "nil"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say(nil)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: write boolean[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say(true, " ", false)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-true false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: bad argument type to ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.location.capture(nil)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: capture location (default 0);[m
[31m---- config[m
[31m- location /recur {[m
[31m-       content_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body, "\\n");[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur[m
[31m---- response_body[m
[31m-num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: capture location[m
[31m---- config[m
[31m- location /recur {[m
[31m-       content_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body);[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur?num=3[m
[31m---- response_body[m
[31m-num is: 3[m
[31m-status=200 body=num is: 2[m
[31m-status=200 body=num is: 1[m
[31m-status=200 body=num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: setting nginx variables from within Lua[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a "";[m
[31m-       content_by_lua 'ngx.var.a = 32; ngx.say(ngx.var.a)';[m
[31m-       add_header Foo $a;[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_headers[m
[31m-Foo: 32[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: nginx quote sql string 1[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a 'hello\n\r\'"\\';[m
[31m-       content_by_lua 'ngx.say(ngx.quote_sql_str(ngx.var.a))';[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: nginx quote sql string 2[m
[31m---- config[m
[31m-location /set {[m
[31m-    set $a "hello\n\r'\"\\";[m
[31m-    content_by_lua 'ngx.say(ngx.quote_sql_str(ngx.var.a))';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: use dollar[m
[31m---- config[m
[31m-location /set {[m
[31m-    content_by_lua '[m
[31m-        local s = "hello 112";[m
[31m-        ngx.say(string.find(s, "%d+$"))';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-79[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: subrequests do not share variables of main requests by default[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a 12;[m
[31m-    content_by_lua 'res = ngx.location.capture("/sub"); ngx.print(res.body)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: subrequests can share variables of main requests[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a 12;[m
[31m-    content_by_lua '[m
[31m-        res = ngx.location.capture([m
[31m-            "/sub",[m
[31m-            { share_all_vars = true }[m
[31m-        );[m
[31m-        ngx.print(res.body)[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: main requests use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-}[m
[31m-location /parent {[m
[31m-    content_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = true });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: main requests do NOT use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-}[m
[31m-location /parent {[m
[31m-    content_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = false });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body_like eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: capture location multi-value headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        #echo "hello, world";[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Set-Cookie"] = {"a", "hello, world", "foo"}[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", type(res.header["Set-Cookie"]));[m
[31m-            ngx.say("len: ", #res.header["Set-Cookie"]);[m
[31m-            ngx.say("value: ", table.concat(res.header["Set-Cookie"], "|"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: table[m
[31m-len: 3[m
[31m-value: a|hello, world|foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"]);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: Bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-            ngx.header.Bar = nil;[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"] or "nil");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: HTTP 1.0 response[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            data = "hello, world"[m
[31m-            -- ngx.header["Content-Length"] = #data[m
[31m-            -- ngx.header.content_length = #data[m
[31m-            ngx.print(data)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/lua;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_headers[m
[31m-Content-Length: 12[m
[31m---- response_body chop[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multiple eof[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Hi")[m
[31m-[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-eof failed: seen eof[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: nginx vars in script path[m
[31m---- config[m
[31m-    location ~ ^/lua/(.+)$ {[m
[31m-        content_by_lua_file html/$1.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> calc.lua[m
[31m-local a,b = ngx.var.arg_a, ngx.var.arg_b[m
[31m-ngx.say(a+b)[m
[31m---- request[m
[31m-GET /lua/calc?a=19&b=81[m
[31m---- response_body[m
[31m-100[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: nginx vars in script path[m
[31m---- config[m
[31m-    location ~ ^/lua/(.+)$ {[m
[31m-        content_by_lua_file html/$1.lua;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua/sum a=3&b=2;[m
[31m-        echo_location /lua/diff a=3&b=2;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> sum.lua[m
[31m-local a,b = ngx.var.arg_a, ngx.var.arg_b[m
[31m-ngx.say(a+b)[m
[31m->>> diff.lua[m
[31m-local a,b = ngx.var.arg_a, ngx.var.arg_b[m
[31m-ngx.say(a-b)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-5[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: basic print (HEAD + HTTP 1.1)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua 'ngx.print("Hello, Lua!\\n")';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: basic print (HEAD + HTTP 1.0)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        content_by_lua '[m
[31m-            ngx.print("Hello, Lua!\\n")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /lua HTTP/1.0[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: headers_sent & HEAD[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-            local ok, err = ngx.flush()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "failed to flush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /lua[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to flush: header only[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: HEAD & ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            local ok, err = ngx.say(ngx.headers_sent)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "failed to say: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /lua[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to say: header only[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: ngx.eof before ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = ngx.say(ngx.headers_sent)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "failed to say: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to say: seen eof[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: headers_sent + GET[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- print("headers sent: ", ngx.headers_sent)[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-            -- ngx.flush()[m
[31m-            ngx.say(ngx.headers_sent)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-false[m
[31m-true[m
[31m-true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: HTTP 1.0 response with Content-Length[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            data = "hello,\\nworld\\n"[m
[31m-            ngx.header["Content-Length"] = #data[m
[31m-            ngx.say("hello,")[m
[31m-            ngx.flush()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.say("world")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        echo_sleep 2;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/lua;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_headers[m
[31m-Content-Length: 13[m
[31m---- response_body[m
[31m-hello,[m
[31m-world[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: ngx.print table arguments (github issue #54)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua 'ngx.print({10, {0, 5}, 15}, 32)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body chop[m
[31m-10051532[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: ngx.say table arguments (github issue #54)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua 'ngx.say({10, {0, "5"}, 15}, 32)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-10051532[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: .lua file with shebang[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-#!/bin/lua[m
[31m-[m
[31m-ngx.say("line ", debug.getinfo(1).currentline)[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-line 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: syntax error in inlined Lua code[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'for end';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/failed to load inlined Lua code: /[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/003-errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/003-errors.t[m
[1mdeleted file mode 100644[m
[1mindex 764300a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/003-errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,129 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: syntax error in lua code chunk[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "local a[m
[31m-            a = a+;[m
[31m-            return a";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: syntax error in lua file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $res 'html/test.lua';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local a[m
[31m-a = 3 +;[m
[31m-return a[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: syntax error in lua file (from Guang Feng)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $res '[{"a":32},{"b":64}]';[m
[31m-        #set $res '[{"friend_userid":1750146},{"friend_userid":1750150},{"friend_userid":1750153},{"friend_userid":1750166},{"friend_userid":1750181},{"friend_userid":1750186},{"friend_userid":1750195},{"friend_userid":1750232}]';[m
[31m-        set_by_lua_file $list 'html/test.lua' $res;[m
[31m-        #set_by_lua_file $list 'html/feed.lua' $res;[m
[31m-        echo $list;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m--- local j = require('json')[m
[31m-local p = ngx.arg[1][m
[31m-return p[m
[31m->>> feed.lua[m
[31m-local s = require("json")[m
[31m-local function explode(d,p)[m
[31m-   local t, ll[m
[31m-   t={}[m
[31m-   ll=0[m
[31m-   if(#p == 1) then return p end[m
[31m-       while true do[m
[31m-       l=string.find(p,d,ll+1,true) [m
[31m-           if l~=nil then [m
[31m-         table.insert(t, string.sub(p,ll,l-1)) [m
[31m-         ll=l+1 [m
[31m-           else[m
[31m-         table.insert(t, string.sub(p,ll)) [m
[31m-         break [m
[31m-         end[m
[31m-     end[m
[31m-return t[m
[31m- end[m
[31m-[m
[31m-local a = explode(',', string.sub(ngx.arg[1], 2, -1))[m
[31m-local x = {}[m
[31m-for i,v in ipairs(a) do table.insert(x,s.decode(v).friend_userid) end[m
[31m-return table.concat(x,',')[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[{"a":32},{"b":64}][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: 500 in subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/err")[m
[31m-            ngx.say(res.status);[m
[31m-        ';[m
[31m-    }[m
[31m-    location /err {[m
[31m-        return 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: drizzle_pass 500 in subrequest[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/err")[m
[31m-            ngx.say(res.status);[m
[31m-        ';[m
[31m-    }[m
[31m-    location /err {[m
[31m-        set $back 'blah-blah';[m
[31m-        drizzle_pass $back;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-500[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/004-require.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/004-require.t[m
[1mdeleted file mode 100644[m
[1mindex 3250b2f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/004-require.t[m
[1m+++ /dev/null[m
[36m@@ -1,211 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#master_on();[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-#warn $html_dir;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = "$html_dir/?.lua";[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /load;[m
[31m-        echo_location /check;[m
[31m-        echo_location /check;[m
[31m-    }[m
[31m-[m
[31m-    location /load {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.foo = nil;[m
[31m-            local foo = require "foo";[m
[31m-            foo.hi()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /check {[m
[31m-        content_by_lua '[m
[31m-            local foo = package.loaded.foo[m
[31m-            if foo then[m
[31m-                ngx.say("found")[m
[31m-                foo.hi()[m
[31m-            else[m
[31m-                ngx.say("not found")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall);[m
[31m-[m
[31m-ngx.say("loading");[m
[31m-[m
[31m-function hi ()[m
[31m-    ngx.say("hello, foo")[m
[31m-end;[m
[31m---- response_body[m
[31m-loading[m
[31m-hello, foo[m
[31m-found[m
[31m-hello, foo[m
[31m-found[m
[31m-hello, foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_cpath '$::HtmlDir/?.so';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.cpath);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- user_files[m
[31m---- response_body_like: ^[^;]+/servroot/html/\?.so$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: expand default path (after)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;;';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.path);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: ^[^;]+/servroot/html/\?.lua;.+\.lua;$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: expand default cpath (after)[m
[31m---- http_config eval[m
[31m-    "lua_package_cpath '$::HtmlDir/?.so;;';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.cpath);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: ^[^;]+/servroot/html/\?.so;.+\.so;$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: expand default path (before)[m
[31m---- http_config eval[m
[31m-    "lua_package_path ';;$::HtmlDir/?.lua';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.path);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: ^.+\.lua;[^;]+/servroot/html/\?.lua$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: expand default cpath (before)[m
[31m---- http_config eval[m
[31m-    "lua_package_cpath ';;$::HtmlDir/?.so';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(package.cpath);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: ^.+\.so;[^;]+/servroot/html/\?.so$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: require "ngx" (content_by_lua)[m
[31m---- config[m
[31m-    location /ngx {[m
[31m-        content_by_lua '[m
[31m-            local ngx = require "ngx"[m
[31m-            ngx.say("hello, world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ngx[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: require "ngx" (set_by_lua)[m
[31m---- config[m
[31m-    location /ngx {[m
[31m-        set_by_lua $res '[m
[31m-            local ngx = require "ngx"[m
[31m-            return ngx.escape_uri(" ")[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /ngx[m
[31m---- response_body[m
[31m-%20[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: require "ndk" (content_by_lua)[m
[31m---- config[m
[31m-    location /ndk {[m
[31m-        content_by_lua '[m
[31m-            local ndk = require "ndk"[m
[31m-            local res = ndk.set_var.set_escape_uri(" ")[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /ndk[m
[31m---- response_body[m
[31m-%20[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: require "ndk" (set_by_lua)[m
[31m---- config[m
[31m-    location /ndk {[m
[31m-        set_by_lua $res '[m
[31m-            local ndk = require "ndk"[m
[31m-            return ndk.set_var.set_escape_uri(" ")[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /ndk[m
[31m---- response_body[m
[31m-%20[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/005-exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/005-exit.t[m
[1mdeleted file mode 100644[m
[1mindex 781531f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/005-exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,726 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#repeat_each(20000);[m
[31m-repeat_each(2);[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#log_level('debug');[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1024);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: throw 403[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "ngx.exit(403);ngx.say('hi')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: throw 404[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "ngx.exit(404);ngx.say('hi');";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 404[m
[31m---- response_body_like: 404 Not Found[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: throw 404 after sending the header and partial body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "ngx.say('hi');ngx.exit(404);ngx.say(', you')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_log[m
[31m-attempt to set status 404 via ngx.exit after sending out the response status 200[m
[31m---- no_error_log[m
[31m-alert[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: working with ngx_auth_request (succeeded)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        content_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentzh[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Logged in[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: working with ngx_auth_request (failed)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        content_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentz[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: working with ngx_auth_request (simplest form, w/o ngx_memc)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m--- print('just have run sr: ' .. res.body)[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: working with ngx_auth_request (simplest form)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: working with ngx_auth_request[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_b {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream_list memc_cluster memc_a memc_b;[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: working with ngx_auth_request[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 300;[m
[31m-    }[m
[31m-[m
[31m-    #upstream_list memc_cluster memc_a memc_b;[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        #set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass memc_a;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uri-$query_string";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        set_quote_sql_str $seo_uri $query_string;[m
[31m-        drizzle_query "select url from my_url_map where seo_url=$seo_uri";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /baz {[m
[31m-        set $my_uri $uri;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo_exec /jump $my_uri;[m
[31m-    }[m
[31m-[m
[31m-    location /jump {[m
[31m-        internal;[m
[31m-        rewrite ^ $query_string? redirect;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local seo_uri = ngx.var.my_uri[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-mysql?' .. seo_uri)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].url) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.my_uri = res[1].url;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /baz[m
[31m---- response_body_like: 302[m
[31m---- error_code: 302[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/foo/bar[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: throw 0[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "ngx.say('Hi'); ngx.eof(); ngx.exit(0);ngx.say('world')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: pcall safe[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f ()[m
[31m-                ngx.say("hello")[m
[31m-                ngx.exit(200)[m
[31m-            end[m
[31m-[m
[31m-            pcall(f)[m
[31m-            ngx.say("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: 501 Method Not Implemented[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(501)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 501[m
[31m---- response_body_like: 501 (?:Method )?Not Implemented[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: 501 Method Not Implemented[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(ngx.HTTP_METHOD_NOT_IMPLEMENTED)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 501[m
[31m---- response_body_like: 501 (?:Method )?Not Implemented[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: throw 403 after sending out headers with 200[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("Hello World")[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello World[m
[31m---- error_log[m
[31m-attempt to set status 403 via ngx.exit after sending out the response status 200[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: throw 403 after sending out headers with 403[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.status = 403[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("Hello World")[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello World[m
[31m---- error_code: 403[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: throw 403 after sending out headers with 403 (HTTP 1.0 buffering)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.status = 403[m
[31m-            ngx.say("Hello World")[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-Hello World[m
[31m---- error_code: 403[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: throw 444 after sending out responses (HTTP 1.0)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "[m
[31m-            ngx.say('ok');[m
[31m-            return ngx.exit(444)[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua HTTP/1.0[m
[31m---- ignore_response[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua sending HTTP 1.0 response headers[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: throw 499 after sending out responses (HTTP 1.0)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "[m
[31m-            ngx.say('ok');[m
[31m-            return ngx.exit(499)[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua HTTP/1.0[m
[31m---- ignore_response[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua sending HTTP 1.0 response headers[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: throw 408 after sending out responses (HTTP 1.0)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua "[m
[31m-            ngx.say('ok');[m
[31m-            return ngx.exit(408)[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua HTTP/1.0[m
[31m---- ignore_response[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua sending HTTP 1.0 response headers[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: exit(201) with custom response body[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "[m
[31m-            ngx.status = 201[m
[31m-            ngx.say('ok');[m
[31m-            return ngx.exit(201)[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua sending HTTP 1.0 response headers[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: exit 403 in header filter[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "ngx.say('hi');";[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exit 201 in header filter[m
[31m---- config[m
[31m-    lingering_close always;[m
[31m-    location = /t {[m
[31m-        content_by_lua "ngx.say('hi');";[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 201[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: exit both in header filter and content handler[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "ngx.status = 201 ngx.say('hi') ngx.exit(201)";[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 201[m
[31m---- stap2[m
[31m-/*[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("=== %d\n", $r->headers_out->status)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-*/[m
[31m-F(ngx_http_lua_header_filter_inline) {[m
[31m-    printf("=== %d\n", $r->headers_out->status)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_header_filter_by_chunk).return {[m
[31m-    if ($return == -1) {[m
[31m-        printf("====== header filter by chunk\n")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m---- stap_out[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: exit 444 in header filter[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "ngx.say('hello world');";[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(444)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 444[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/006-escape.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/006-escape.t[m
[1mdeleted file mode 100644[m
[1mindex 7b26bba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/006-escape.t[m
[1m+++ /dev/null[m
[36m@@ -1,183 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: escape uri in set_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('a 你')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-a%20%E4%BD%A0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unescape uri in set_by_lua[m
[31m---- config[m
[31m-    location /unescape {[m
[31m-        set_by_lua $res "return ngx.unescape_uri('a%20%e4%bd%a0')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /unescape[m
[31m---- response_body[m
[31m-a 你[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: escape uri in content_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        content_by_lua "ngx.say(ngx.escape_uri('a 你'))";[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-a%20%E4%BD%A0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: unescape uri in content_by_lua[m
[31m---- config[m
[31m-    location /unescape {[m
[31m-        content_by_lua "ngx.say(ngx.unescape_uri('a%20%e4%bd%a0'))";[m
[31m-    }[m
[31m---- request[m
[31m-GET /unescape[m
[31m---- response_body[m
[31m-a 你[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: escape uri in set_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('a+b')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-a%2Bb[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: escape uri in set_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('\"a/b={}:<>;&[]\\\\^')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-%22a%2Fb%3D%7B%7D%3A%3C%3E%3B%26%5B%5D%5C%5E[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: escape uri in set_by_lua[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.baz = ngx.escape_uri(" ")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_headers[m
[31m-baz: %20[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: escape a string that cannot be escaped[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('abc')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: escape an empty string that cannot be escaped[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri('')";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: escape nil[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri(nil)";[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: escape numbers[m
[31m---- config[m
[31m-    location /escape {[m
[31m-        set_by_lua $res "return ngx.escape_uri(32)";[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /escape[m
[31m---- response_body[m
[31m-[32][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: unescape nil[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $res "return ngx.unescape_uri(nil)";[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: unescape numbers[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $res "return ngx.unescape_uri(32)";[m
[31m-        echo "[$res]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-[32][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/007-md5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/007-md5.t[m
[1mdeleted file mode 100644[m
[1mindex 501e3af..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/007-md5.t[m
[1m+++ /dev/null[m
[36m@@ -1,103 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set md5 hello[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua 'ngx.say(ngx.md5("hello"))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nil string to ngx.md5[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua 'ngx.say(ngx.md5(nil))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: null string to ngx.md5[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        content_by_lua 'ngx.say(ngx.md5(""))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: use ngx.md5 in set_by_lua[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        set_by_lua $a 'return ngx.md5("hello")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: use ngx.md5 in set_by_lua (nil)[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        set_by_lua $a 'return ngx.md5(nil)';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: use ngx.md5 in set_by_lua (null string)[m
[31m---- config[m
[31m-    location /md5 {[m
[31m-        set_by_lua $a 'return ngx.md5("")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: md5(number)[m
[31m---- config[m
[31m-    location = /md5 {[m
[31m-        content_by_lua 'ngx.say(ngx.md5(45))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5[m
[31m---- response_body[m
[31m-6c8349cc7260ae62e3b1396831a8398f[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/008-today.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/008-today.t[m
[1mdeleted file mode 100644[m
[1mindex 54bd949..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/008-today.t[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: use ngx.today in content_by_lua[m
[31m---- config[m
[31m-    location = /today {[m
[31m-        content_by_lua 'ngx.say(ngx.today())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /today[m
[31m---- response_body_like: ^\d{4}-\d{2}-\d{2}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: use ngx.today in set_by_lua[m
[31m---- config[m
[31m-    location = /today {[m
[31m-        set_by_lua $a 'return ngx.today()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /today[m
[31m---- response_body_like: ^\d{4}-\d{2}-\d{2}$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/009-log.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/009-log.t[m
[1mdeleted file mode 100644[m
[1mindex 053dd45..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/009-log.t[m
[1m+++ /dev/null[m
[36m@@ -1,545 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('debug'); # to ensure any log-level can be outputed[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 4);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test log-level STDERR[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.STDERR, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test log-level EMERG[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.EMERG, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test log-level ALERT[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.ALERT, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: test log-level CRIT[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.CRIT, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[crit\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test log-level ERR[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.ERR, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test log-level WARN[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.WARN, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[warn\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test log-level NOTICE[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.NOTICE, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[notice\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: test log-level INFO[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.INFO, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[info\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: test log-level DEBUG[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            ngx.log(ngx.DEBUG, "hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[debug\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: regression test print()[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("before log")[m
[31m-            print("hello, log", 1234, 3.14159)[m
[31m-            ngx.say("after log")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[notice\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):3: hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: print(nil)[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            print()[m
[31m-            print(nil)[m
[31m-            print("nil: ", nil)[m
[31m-            ngx.say("hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):2: ,/,[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):3: nil,/,[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):4: nil: nil,/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.log in set_by_lua[m
[31m---- config[m
[31m-    location /log {[m
[31m-        set_by_lua $a '[m
[31m-            ngx.log(ngx.ERR, "HELLO")[m
[31m-            return 32;[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-32[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] set_by_lua:2: HELLO,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: test booleans and nil[m
[31m---- config[m
[31m-    location /log {[m
[31m-        set_by_lua $a '[m
[31m-            ngx.log(ngx.ERR, true, false, nil)[m
[31m-            return 32;[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-32[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] set_by_lua:2: truefalsenil,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: test table with metamethod[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("before log")[m
[31m-            local t = setmetatable({v = "value"}, {[m
[31m-                __tostring = function(self)[m
[31m-                    return "tostring "..self.v[m
[31m-                end[m
[31m-            })[m
[31m-            ngx.log(ngx.ERR, t)[m
[31m-            ngx.say("after log")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):8: tostring value,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: test table without metamethod[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.log(ngx.ERR, {})[m
[31m-            ngx.say("done")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'log' (expected table to have __tostring metamethod)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: test tables mixed with other types[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("before log")[m
[31m-            local t = setmetatable({v = "value"}, {[m
[31m-                __tostring = function(self)[m
[31m-                    return "tostring: "..self.v[m
[31m-                end[m
[31m-            })[m
[31m-            ngx.log(ngx.ERR, t, " hello ", t)[m
[31m-            ngx.say("after log")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):8: tostring: value hello tostring: value,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: test print with tables[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("before log")[m
[31m-            local t = setmetatable({v = "value"}, {[m
[31m-                __tostring = function(self)[m
[31m-                    return "tostring: "..self.v[m
[31m-                end[m
[31m-            })[m
[31m-            print(t, " hello ", t)[m
[31m-            ngx.say("after log")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-before log[m
[31m-after log[m
[31m---- error_log eval[m
[31m-qr/\[notice\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):8: tostring: value hello tostring: value,/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: print() in header filter[m
[31m---- config[m
[31m-    location /log {[m
[31m-        header_filter_by_lua '[m
[31m-            print("hello world")[m
[31m-            ngx.header.foo = 32[m
[31m-        ';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_headers[m
[31m-foo: 32[m
[31m---- error_log eval[m
[31m-qr/\[notice\] .*? \[lua\] header_filter_by_lua:2: hello world/[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.log in header filter[m
[31m---- config[m
[31m-    location /log {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.log(ngx.ERR, "howdy, lua!")[m
[31m-            ngx.header.foo = 32[m
[31m-        ';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_headers[m
[31m-foo: 32[m
[31m---- response_body[m
[31m-hi[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? \[lua\] header_filter_by_lua:2: howdy, lua!/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.log big data[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.ERR, "a" .. string.rep("h", 1970) .. "b")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_headers[m
[31m---- error_log eval[m
[31m-[qr/ah{1970}b/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.log in Lua function calls & inlined lua[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                ngx.log(ngx.ERR, "hello, log", 1234, 3.14159)[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):7: bar\(\): hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx.log in Lua function tail-calls & inlined lua[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            function foo()[m
[31m-                return bar(5)[m
[31m-            end[m
[31m-[m
[31m-            function bar(n)[m
[31m-                if n < 1 then[m
[31m-                    ngx.log(ngx.ERR, "hello, log", 1234, 3.14159)[m
[31m-                    return n[m
[31m-                end[m
[31m-[m
[31m-                return bar(n - 1)[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] content_by_lua\(nginx\.conf:\d+\):8:(?: foo\(\):)? hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.log in Lua files[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-function foo()[m
[31m-    bar()[m
[31m-end[m
[31m-[m
[31m-function bar()[m
[31m-    ngx.log(ngx.ERR, "hello, log", 1234, 3.14159)[m
[31m-end[m
[31m-[m
[31m-foo()[m
[31m-ngx.say("done")[m
[31m-[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log eval[m
[31m-qr/\[error\] \S+: \S+ \[lua\] test.lua:6: bar\(\): hello, log12343.14159/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx.log with bad levels (ngx.ERROR, -1)[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.ERROR, "hello lua")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad log level: -1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx.log with bad levels (9)[m
[31m---- config[m
[31m-    location /log {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(9, "hello lua")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /log[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad log level: 9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: \0 in the log message[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.log(ngx.WARN, "hello\\0world")[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-"2: hello\0world, client: "[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/010-request_body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/010-request_body.t[m
[1mdeleted file mode 100644[m
[1mindex d200495..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/010-request_body.t[m
[1m+++ /dev/null[m
[36m@@ -1,273 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('debug'); # to ensure any log-level can be outputed[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test not reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test default setting (not reading request body)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: test main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test override main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test override server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: test override server conf[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-            local res = ngx.location.capture([m
[31m-                "/proxy",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = ngx.var.request_body })[m
[31m-[m
[31m-            ngx.say(res.status)[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-"[m
[31m---- response_body[m
[31m-nil[m
[31m-200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: empty POST body[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-            local res = ngx.location.capture([m
[31m-                "/proxy",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = ngx.var.request_body })[m
[31m-[m
[31m-            ngx.say(res.status)[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-"[m
[31m---- response_body[m
[31m-nil[m
[31m-200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: on disk request body[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 1;[m
[31m-        sendfile on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture([m
[31m-                "/proxy",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = ngx.var.request_body })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-" . ('a' x 1024)[m
[31m---- response_body chomp[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: no modify main request content-length[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/other", {body = "hello"})[m
[31m-            ngx.say(ngx.req.get_headers()["Content-Length"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /other {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-POST /foo[m
[31m-hi[m
[31m---- response_body[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: Expect: 100-Continue[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo_body[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-http finalize request: 500, "/echo_body?" a:1, c:2[m
[31m-http finalize request: 500, "/echo_body?" a:1, c:0[m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/011-md5_bin.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/011-md5_bin.t[m
[1mdeleted file mode 100644[m
[1mindex ae7c974..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/011-md5_bin.t[m
[1m+++ /dev/null[m
[36m@@ -1,170 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-[m
[31m-#md5_bin_bin is hard to test, so convert it to hex mode[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set md5_bin hello ????xxoo[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua 'local a = string.gsub(ngx.md5_bin("hello"), ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end); ngx.say(a)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set md5_bin hello ????xxoo[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua 'ngx.say(string.len(ngx.md5_bin("hello")))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-16[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set md5_bin hello[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s = ngx.md5_bin("hello")[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: nil string to ngx.md5_bin[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s = ngx.md5_bin(nil)[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: null string to ngx.md5_bin[m
[31m---- config[m
[31m-    location /md5_bin {[m
[31m-        content_by_lua '[m
[31m-            local s = ngx.md5_bin("")[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: use ngx.md5_bin in set_by_lua[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        set_by_lua $a 'return string.gsub(ngx.md5_bin("hello"), ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-5d41402abc4b2a76b9719d911017c592[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: use ngx.md5_bin in set_by_lua (nil)[m
[31m---- config[m
[31m-    location = /md5_bin {[m
[31m-        set_by_lua $a '[m
[31m-            local s = ngx.md5_bin(nil)[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: use ngx.md5_bin in set_by_lua (null string)[m
[31m---- config[m
[31m-    location /md5_bin {[m
[31m-        set_by_lua $a '[m
[31m-            local s = ngx.md5_bin("")[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /md5_bin[m
[31m---- response_body[m
[31m-d41d8cd98f00b204e9800998ecf8427e[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: md5_bin(number)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            s = ngx.md5_bin(45)[m
[31m-            s = string.gsub(s, ".", function (c)[m
[31m-                    return string.format("%02x", string.byte(c))[m
[31m-                end)[m
[31m-            ngx.say(s)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-6c8349cc7260ae62e3b1396831a8398f[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/012-now.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/012-now.t[m
[1mdeleted file mode 100644[m
[1mindex abcb735..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/012-now.t[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: use ngx.localtime in content_by_lua[m
[31m---- config[m
[31m-    location = /now {[m
[31m-        content_by_lua 'ngx.say(ngx.localtime())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /now[m
[31m---- response_body_like: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: use ngx.localtime in set_by_lua[m
[31m---- config[m
[31m-    location = /now {[m
[31m-        set_by_lua $a 'return ngx.localtime()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /now[m
[31m---- response_body_like: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: use ngx.time in set_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        set_by_lua $a 'return ngx.time()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: use ngx.time in content_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        content_by_lua 'ngx.say(ngx.time())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: use ngx.time in content_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.time())[m
[31m-            ngx.say(ngx.localtime())[m
[31m-            ngx.say(ngx.utctime())[m
[31m-            ngx.say(ngx.cookie_time(ngx.time()))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like chomp[m
[31m-^\d{10,}[m
[31m-\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}[m
[31m-\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}[m
[31m-\w+, .*? GMT$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: use ngx.now in set_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        set_by_lua $a 'return ngx.now()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}(\.\d{1,3})?$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: use ngx.now in content_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        content_by_lua 'ngx.say(ngx.now())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}(\.\d{1,3})?$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: use ngx.update_time & ngx.now in content_by_lua[m
[31m---- config[m
[31m-    location = /time {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            ngx.say(ngx.now())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /time[m
[31m---- response_body_like: ^\d{10,}(\.\d{1,3})?$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/013-base64.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/013-base64.t[m
[1mdeleted file mode 100644[m
[1mindex 1cc27de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/013-base64.t[m
[1m+++ /dev/null[m
[36m@@ -1,245 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: base64 encode hello[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("hello"))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-aGVsbG8=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nil string to ngx.encode_base64[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        content_by_lua 'ngx.say("left" .. ngx.encode_base64(nil) .. "right")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: null string to ngx.encode_base64[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        content_by_lua 'ngx.say("left" .. ngx.encode_base64("") .. "right")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: use ngx.encode_base64 in set_by_lua[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        set_by_lua $a 'return ngx.encode_base64("hello")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-aGVsbG8=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: use ngx.encode_base64 in set_by_lua (nil)[m
[31m---- config[m
[31m-    location = /encode_base64 {[m
[31m-        set_by_lua $a 'return "left" .. ngx.encode_base64(nil) .. "right"';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: use ngx.encode_base64 in set_by_lua (null string)[m
[31m---- config[m
[31m-    location /encode_base64 {[m
[31m-        set_by_lua $a 'return "left" .. ngx.encode_base64("") .. "right"';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /encode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: base64 encode hello[m
[31m---- config[m
[31m-    location = /decode_base64 {[m
[31m-        content_by_lua 'ngx.say(ngx.decode_base64("aGVsbG8="))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: null string to ngx.decode_base64[m
[31m---- config[m
[31m-    location = /decode_base64 {[m
[31m-        content_by_lua 'ngx.say("left" .. ngx.decode_base64("") .. "right")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: use ngx.decode_base64 in set_by_lua[m
[31m---- config[m
[31m-    location = /decode_base64 {[m
[31m-        set_by_lua $a 'return ngx.decode_base64("aGVsbG8=")';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: use ngx.decode_base64 in set_by_lua (nil)[m
[31m---- config[m
[31m-    location = /decode_base64 {[m
[31m-        set_by_lua $a 'return "left" .. ngx.decode_base64(nil) .. "right"';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-string argument only[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: use ngx.decode_base64 in set_by_lua (null string)[m
[31m---- config[m
[31m-    location /decode_base64 {[m
[31m-        set_by_lua $a 'return "left" .. ngx.decode_base64("") .. "right"';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /decode_base64[m
[31m---- response_body[m
[31m-leftright[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: base64 encode number[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(32))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-MzI=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: base64 decode number[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.decode_base64(32))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-string argument only[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: base64 decode error[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.decode_base64("^*~"))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: base64 encode without padding (explicit true to no_padding)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("hello", true))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-aGVsbG8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: base64 encode short string[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("w"))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dw==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: base64 encode short string with padding (explicit false to no_padding)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("w", false))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-dw==[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: base64 encode with wrong 2nd parameter[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64("w", 0))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/bad argument \#2 to 'encode_base64' \(boolean expected, got number\)|\[error\] .*? boolean argument only/[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/014-bugs.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/014-bugs.t[m
[1mdeleted file mode 100644[m
[1mindex 44337e3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/014-bugs.t[m
[1m+++ /dev/null[m
[36m@@ -1,1021 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 30);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-#warn $html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-[m
[31m-sub read_file {[m
[31m-    my $infile = shift;[m
[31m-    open my $in, $infile[m
[31m-        or die "cannot open $infile for reading: $!";[m
[31m-    my $cert = do { local $/; <$in> };[m
[31m-    close $in;[m
[31m-    $cert;[m
[31m-}[m
[31m-[m
[31m-our $TestCertificate = read_file("t/cert/test.crt");[m
[31m-our $TestCertificateKey = read_file("t/cert/test.key");[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /load {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.foo = nil;[m
[31m-            local foo = require "foo";[m
[31m-            foo.hi()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /load[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall);[m
[31m-[m
[31m-function foo ()[m
[31m-    return 1[m
[31m-    return 2[m
[31m-end[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity[m
[31m---- http_config[m
[31m-lua_package_path '/home/agentz/rpm/BUILD/lua-yajl-1.1/build/?.so;/home/lz/luax/?.so;./?.so';[m
[31m---- config[m
[31m-    location = '/report/listBidwordPrices4lzExtra.htm' {[m
[31m-        content_by_lua '[m
[31m-            local yajl = require "yajl"[m
[31m-            local w = ngx.var.arg_words[m
[31m-            w = ngx.unescape_uri(w)[m
[31m-            local r = {}[m
[31m-            print("start for")[m
[31m-            for id in string.gmatch(w, "%d+") do[m
[31m-                 r[id] = -1[m
[31m-            end[m
[31m-            print("end for, start yajl")[m
[31m-            ngx.print(yajl.to_string(r))[m
[31m-            print("end yajl")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /report/listBidwordPrices4lzExtra.htm?words=123,156,2532[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity[m
[31m---- config[m
[31m-    location = /memc {[m
[31m-        #set $memc_value 'hello';[m
[31m-        set $memc_value $arg_v;[m
[31m-        set $memc_cmd $arg_c;[m
[31m-        set $memc_key $arg_k;[m
[31m-        #set $memc_value hello;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #echo $memc_value;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_location '/memc?c=get&k=foo';[m
[31m-        echo_location '/memc?c=set&k=foo&v=hello';[m
[31m-        echo_location '/memc?c=get&k=foo';[m
[31m-    }[m
[31m-    location = /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/memc?c=get&k=foo&v=")[m
[31m-            ngx.say("1: ", res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/memc?c=set&k=foo&v=bar");[m
[31m-            ngx.say("2: ", res.body);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc?c=get&k=foo")[m
[31m-            ngx.say("3: ", res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: 3: bar$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: capture works for subrequests with internal redirects[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/")[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body_like chop[m
[31m-200[m
[31m-.*It works[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: disk file bufs not working[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/test.lua")[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-print("Hello, world")[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-200[m
[31m-print("Hello, world")[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: print lua empty strings[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.print("") ngx.flush() ngx.print("Hi")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chop[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: say lua empty strings[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say("") ngx.flush() ngx.print("Hi")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval[m
[31m-"[m
[31m-Hi"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: github issue 37: header bug[m
[31m-https://github.com/chaoslawful/lua-nginx-module/issues/37[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Set-Cookie"] = {"TestCookie1=foo", "TestCookie2=bar"};[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local yajl = require "yajl"[m
[31m-            ngx.header["Set-Cookie"] = {}[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-[m
[31m-            for i,j in pairs(res.header) do[m
[31m-                ngx.header[i] = j[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.say("set-cookie: ", yajl.to_string(res.header["Set-Cookie"]))[m
[31m-[m
[31m-            ngx.send_headers()[m
[31m-            ngx.print("body: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- raw_response_headers_like eval[m
[31m-".*Set-Cookie: TestCookie1=foo\r[m
[31m-Set-Cookie: TestCookie2=bar.*"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: memory leak[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-res = {}[m
[31m-res = {'good 1', 'good 2', 'good 3'}[m
[31m-return ngx.redirect("/somedir/" .. ngx.escape_uri(res[math.random(1,#res)]))[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: capturing locations with internal redirects (no lua redirect)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo Bar;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #content_by_lua '[m
[31m-        #ngx.exec("/bar")[m
[31m-        #';[m
[31m-        echo_exec /bar;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: capturing locations with internal redirects (lua redirect)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        content_by_lua 'ngx.say("Bar")';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/bar")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-Bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: capturing locations with internal redirects (simple index)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: capturing locations with internal redirects (more lua statements)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.say("world")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #content_by_lua '[m
[31m-        #ngx.exec("/bar")[m
[31m-        #';[m
[31m-        echo_exec /bar;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: capturing locations with internal redirects (post subrequest with internal redirect)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        lua_need_request_body on;[m
[31m-        client_body_in_single_buffer on;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #content_by_lua '[m
[31m-        #ngx.exec("/bar")[m
[31m-        #';[m
[31m-        echo_exec /bar;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo", { method = ngx.HTTP_POST, body = "hello" })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: nginx rewrite works in subrequests[m
[31m---- config[m
[31m-    rewrite /foo /foo/ permanent;[m
[31m-    location = /foo/ {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo")[m
[31m-            ngx.say("status = ", res.status)[m
[31m-            ngx.say("Location: ", res.header["Location"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-status = 301[m
[31m-Location: /foo/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: nginx rewrite works in subrequests[m
[31m---- config[m
[31m-    access_by_lua '[m
[31m-        local res = ngx.location.capture(ngx.var.uri)[m
[31m-        ngx.say("status = ", res.status)[m
[31m-        ngx.say("Location: ", res.header["Location"] or "nil")[m
[31m-        ngx.exit(200)[m
[31m-    ';[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- user_files[m
[31m->>> foo/index.html[m
[31m-It works![m
[31m---- response_body[m
[31m-status = 301[m
[31m-Location: /foo/[m
[31m---- no_check_leak[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: set content-type header with charset[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        charset GBK;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = "text/xml; charset=UTF-8"[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hi[m
[31m---- response_headers[m
[31m-Content-Type: text/xml; charset=UTF-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set response header content-type with charset[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        charset GBK;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = "text/xml"[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hi[m
[31m---- response_headers[m
[31m-Content-Type: text/xml; charset=GBK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: get by-position capturing variables[m
[31m---- config[m
[31m-    location ~ '^/lua/(.*)' {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var[1] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua/hello[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: get by-position capturing variables ($0)[m
[31m---- config[m
[31m-    location ~ '^/lua/(.*)' {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var[0] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua/hello[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: get by-position capturing variables (exceeding captures)[m
[31m---- config[m
[31m-    location ~ '^/lua/(.*)' {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var[2] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua/hello[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: get by-position capturing variables ($1, $2)[m
[31m---- config[m
[31m-    location ~ '^/lua/(.*)/(.*)' {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var[-1] or "nil")[m
[31m-            ngx.say(ngx.var[0] or "nil")[m
[31m-            ngx.say(ngx.var[1] or "nil")[m
[31m-            ngx.say(ngx.var[2] or "nil")[m
[31m-            ngx.say(ngx.var[3] or "nil")[m
[31m-            ngx.say(ngx.var[4] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua/hello/world[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-hello[m
[31m-world[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: set special variables[m
[31m---- config[m
[31m-    location /main {[m
[31m-        #set_unescape_uri $cookie_a "hello";[m
[31m-        set $http_a "hello";[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.http_a)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: set special variables[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            dofile(ngx.var.realpath_root .. "/a.lua")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.location.capture("/echo")[m
[31m---- response_body[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: set 20+ headers[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Authorization")[m
[31m-        ';[m
[31m-        echo $http_a1;[m
[31m-        echo $http_authorization;[m
[31m-        echo $http_a2;[m
[31m-        echo $http_a3;[m
[31m-        echo $http_a23;[m
[31m-        echo $http_a24;[m
[31m-        echo $http_a25;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers eval[m
[31m-my $i = 1;[m
[31m-my $s;[m
[31m-while ($i <= 25) {[m
[31m-    $s .= "A$i: $i\n";[m
[31m-    if ($i == 22) {[m
[31m-        $s .= "Authorization: blah\n";[m
[31m-    }[m
[31m-    $i++;[m
[31m-}[m
[31m-#warn $s;[m
[31m-$s[m
[31m---- response_body[m
[31m-1[m
[31m-[m
[31m-2[m
[31m-3[m
[31m-23[m
[31m-24[m
[31m-25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: unexpected globals sharing by using _G[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            ngx.print(t)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-["0", "0", "0"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: unexpected globals sharing by using _G (set_by_lua*)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set_by_lua $a '[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            return t[m
[31m-        ';[m
[31m-        echo -n $a;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-["0", "0", "0"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: unexpected globals sharing by using _G (log_by_lua*)[m
[31m---- http_config[m
[31m-    lua_shared_dict log_dict 100k;[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local log_dict = ngx.shared.log_dict[m
[31m-            ngx.print(log_dict:get("cnt") or 0)[m
[31m-        ';[m
[31m-[m
[31m-        log_by_lua '[m
[31m-            local log_dict = ngx.shared.log_dict[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            log_dict:set("cnt", t)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-["0", "0", "0"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: unexpected globals sharing by using _G (header_filter_by_lua*)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        header_filter_by_lua '[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            ngx.ctx.cnt = tostring(t)[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.print(ngx.ctx.cnt or 0)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-["0", "0", "0"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: unexpected globals sharing by using _G (body_filter_by_lua*)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        body_filter_by_lua '[m
[31m-            if _G.t then[m
[31m-                _G.t = _G.t + 1[m
[31m-            else[m
[31m-                _G.t = 0[m
[31m-            end[m
[31m-            ngx.ctx.cnt = _G.t[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.print("a")[m
[31m-            ngx.say(ngx.ctx.cnt or 0)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-a0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: set content-type header with charset and default_type[m
[31m---- http_config[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        default_type application/json;[m
[31m-        charset utf-8;[m
[31m-        charset_types application/json;[m
[31m-        content_by_lua 'ngx.say("hi")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hi[m
[31m---- response_headers[m
[31m-Content-Type: application/json; charset=utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: hang on upstream_next (from kindy)[m
[31m---- no_check_leak[m
[31m---- http_config[m
[31m-    upstream xx {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT max_fails=5;[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT max_fails=5;[m
[31m-    }[m
[31m-[m
[31m-    server {[m
[31m-        server_name "xx";[m
[31m-        listen $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        return 444;[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_next_upstream off;[m
[31m-        proxy_pass http://xx;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- timeout: 1[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log[m
[31m-upstream prematurely closed connection while reading response header from upstream[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: last_in_chain is set properly in subrequests[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua '[m
[31m-            local eof = ngx.arg[2][m
[31m-            if eof then[m
[31m-                print("eof found in body stream")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m---- log_level: notice[m
[31m---- error_log[m
[31m-eof found in body stream[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: testing a segfault when using ngx_poll_module + ngx_resolver[m
[31m-See more details here: http://mailman.nginx.org/pipermail/nginx-devel/2013-January/003275.html[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $myserver nginx.org;[m
[31m-        proxy_pass http://$myserver/;[m
[31m-        resolver 127.0.0.1:6789;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- abort[m
[31m---- timeout: 0.3[m
[31m---- log_level: notice[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- error_log eval[m
[31m-qr/(?:send|recv)\(\) failed \(\d+: Connection refused\) while resolving/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: github issue #218: ngx.location.capture hangs when querying a remote host that does not exist or is really slow to respond[m
[31m---- config[m
[31m-    set $myurl "https://not-exist.agentzh.org";[m
[31m-    location /toto {[m
[31m-        content_by_lua '[m
[31m-                local proxyUrl = "/myproxy/entity"[m
[31m-                local res = ngx.location.capture( proxyUrl,  { method = ngx.HTTP_GET })[m
[31m-                ngx.say("Hello, ", res.status)[m
[31m-            ';[m
[31m-    }[m
[31m-    location ~ /myproxy {[m
[31m-[m
[31m-        rewrite    ^/myproxy/(.*)  /$1  break;[m
[31m-        resolver_timeout 3s;[m
[31m-        #resolver 172.16.0.23; #  AWS DNS resolver address is the same in all regions - 172.16.0.23[m
[31m-        resolver 8.8.8.8;[m
[31m-        proxy_read_timeout 1s;[m
[31m-        proxy_send_timeout 1s;[m
[31m-        proxy_connect_timeout 1s;[m
[31m-        proxy_pass $myurl:443;[m
[31m-        proxy_pass_request_body off;[m
[31m-        proxy_set_header Content-Length 0;[m
[31m-        proxy_set_header  Accept-Encoding  "";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /toto[m
[31m-[m
[31m---- stap2[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    println("lua post subrequest")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-Hello, 502[m
[31m-[m
[31m---- error_log[m
[31m-not-exist.agentzh.org could not be resolved[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: line comments in the last line of the inlined Lua code[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say("ok") -- blah';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: resolving names with a trailing dot[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        resolver $TEST_NGINX_RESOLVER;[m
[31m-        set $myhost 'agentzh.org.';[m
[31m-        proxy_pass http://$myhost/misc/.vimrc;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: An example for a vimrc file[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: resolving names with a trailing dot[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen 12354;[m
[31m-[m
[31m-        location = /t {[m
[31m-            echo 'args: \$args';[m
[31m-        }[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $args "foo=1&bar=2";[m
[31m-        proxy_pass http://127.0.0.1:12354;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-args: foo=1&bar=2[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- no_check_leak[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: lua_code_cache off + setkeepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        set $port $TEST_NGINX_REDIS_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local sock2 = ngx.socket.tcp()[m
[31m-[m
[31m-    sock:settimeout(1000)[m
[31m-    sock2:settimeout(6000000)[m
[31m-[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock2:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive(100, 100)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock2:setkeepalive(200, 100)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("done")[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_close_connection) {[m
[31m-    println("=== close connection")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- response_body[m
[31m-done[m
[31m---- wait: 0.5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: .lua file of exactly N*1024 bytes (github issue #385)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-my $s = "ngx.say('ok')\n";[m
[31m-">>> a.lua\n" . (" " x (8192 - length($s))) . $s;[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: https proxy has no timeout protection for ssl handshake[m
[31m---- http_config[m
[31m-    # to suppress a valgrind false positive in the nginx core:[m
[31m-    proxy_ssl_session_reuse off;[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        location /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    upstream local {[m
[31m-        server unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass https://local/foo;[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-probe process("nginx").function("ngx_http_upstream_ssl_handshake") {[m
[31m-    printf("read timer set: %d\n", $c->read->timer_set)[m
[31m-    printf("write timer set: %d\n", $c->write->timer_set)[m
[31m-}[m
[31m---- stap_out[m
[31m-read timer set: 0[m
[31m-write timer set: 1[m
[31m-[m
[31m---- response_body eval[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/015-status.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/015-status.t[m
[1mdeleted file mode 100644[m
[1mindex 666dae7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/015-status.t[m
[1m+++ /dev/null[m
[36m@@ -1,293 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-#repeat_each(120);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 9);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no key found[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.blah_blah == nil and "nil" or "not nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: .status found[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.status == nil and "nil" or "not nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body[m
[31m-not nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: default to 0[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.status);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: default to 0[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("blah");[m
[31m-            ngx.say(ngx.status);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body[m
[31m-blah[m
[31m-200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set 201[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 201;[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body[m
[31m-created[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set "201"[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = "201";[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body[m
[31m-created[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set "201.7"[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = "201.7";[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body[m
[31m-created[m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set "abc"[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = "abc";[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set blah[m
[31m---- config[m
[31m-    location /201 {[m
[31m-        content_by_lua '[m
[31m-            ngx.blah = 201;[m
[31m-            ngx.say("created");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /201[m
[31m---- response_body[m
[31m-created[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set ngx.status before headers are sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("ok")[m
[31m-            ngx.status = 201[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_code: 200[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? attempt to set ngx\.status after sending out response headers/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: http 1.0 and ngx.status[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = ngx.HTTP_UNAUTHORIZED[m
[31m-            ngx.say("invalid request")[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil HTTP/1.0[m
[31m---- response_body[m
[31m-invalid request[m
[31m---- error_code: 401[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #221: cannot modify ngx.status for responses from ngx_proxy[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/;[m
[31m-        header_filter_by_lua '[m
[31m-            if ngx.status == 206 then[m
[31m-                ngx.status = ngx.HTTP_OK[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-Range: bytes=0-4[m
[31m-[m
[31m---- response_body chop[m
[31m-<html[m
[31m-[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: 101 response has a complete status line[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- raw_response_headers_like: ^HTTP/1.1 101 Switching Protocols\r\n[m
[31m---- error_code: 101[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: reading error status code[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'ngx.say("status = ", ngx.status)';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t\r\n"[m
[31m---- http09[m
[31m---- response_body[m
[31m-status = 9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: err status[m
[31m---- config[m
[31m-    location /nil {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(502)[m
[31m-        ';[m
[31m-        body_filter_by_lua '[m
[31m-            if ngx.arg[2] then[m
[31m-                ngx.log(ngx.WARN, "ngx.status = ", ngx.status)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /nil[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log[m
[31m-ngx.status = 502[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.status assignmnt should clear r->err_status[m
[31m---- config[m
[31m-location = /t {[m
[31m-    return 502;[m
[31m-    header_filter_by_lua_block {[m
[31m-        if ngx.status == 502 then[m
[31m-            ngx.status = 654[m
[31m-            ngx.log(ngx.WARN, "ngx.status: ", ngx.status)[m
[31m-        end[m
[31m-    }[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: Bad Gateway[m
[31m---- error_log[m
[31m-ngx.status: 654[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 654[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/016-resp-header.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/016-resp-header.t[m
[1mdeleted file mode 100644[m
[1mindex b1f5e2a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/016-resp-header.t[m
[1m+++ /dev/null[m
[36m@@ -1,1443 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 38);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = "text/my-plain";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = "text/my-plain";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 3[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Length: 3[m
[31m---- response_body chop[m
[31m-Hel[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 302;[m
[31m-            ngx.header["Location"] = "http://agentzh.org/foo";[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 3[m
[31m-            ngx.header.content_length = nil[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set multi response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["X-Foo"] = {"a", "bc"}[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like chomp[m
[31m-X-Foo: a\r\n.*?X-Foo: bc\r\n[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = {"a", "bc"}[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: bc[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set multi response content-type header and clears it[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["X-Foo"] = {"a", "bc"}[m
[31m-            ngx.header["X-Foo"] = {}[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!X-Foo[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set multi response content-type header and clears it[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["X-Foo"] = {"a", "bc"}[m
[31m-            ngx.header["X-Foo"] = nil[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!X-Foo[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set multi response content-type header (multiple times)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["X-Foo"] = {"a", "bc"}[m
[31m-            ngx.header["X-Foo"] = {"a", "abc"}[m
[31m-            ngx.say("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like chomp[m
[31m-X-Foo: a\r\n.*?X-Foo: abc\r\n[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: clear first, then add[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = {}[m
[31m-            ngx.header["Foo"] = {"a", "b"}[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- raw_response_headers_like eval[m
[31m-".*Foo: a\r[m
[31m-Foo: b.*"[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: first add, then clear, then add again[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = {"c", "d"}[m
[31m-            ngx.header["Foo"] = {}[m
[31m-            ngx.header["Foo"] = {"a", "b"}[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- raw_response_headers_like eval[m
[31m-".*Foo: a\r[m
[31m-Foo: b.*"[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: names are the same in the beginning (one value per key)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foox"] = "barx"[m
[31m-            ngx.header["Fooy"] = "bary"[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Foox: barx[m
[31m-Fooy: bary[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: names are the same in the beginning (multiple values per key)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foox"] = {"conx1", "conx2" }[m
[31m-            ngx.header["Fooy"] = {"cony1", "cony2" }[m
[31m-            ngx.send_headers()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Foox: conx1, conx2[m
[31m-Fooy: cony1, cony2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set header after ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        default_type "text/plain";[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hello")[m
[31m-            ngx.header.content_type = "text/foo"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body chop[m
[31m-hello[m
[31m---- error_log[m
[31m-attempt to set ngx.header.HEADER after sending out response headers[m
[31m---- no_error_log eval[m
[31m-["alert", "warn"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: get content-type header after ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        default_type "text/my-plain";[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hello, ")[m
[31m-            ngx.say(ngx.header.content_type)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-hello, text/my-plain[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: get content-length header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 2;[m
[31m-            ngx.say(ngx.header.content_length);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Content-Length: 2[m
[31m---- response_body[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: get content-length header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo = "bar";[m
[31m-            ngx.say(ngx.header.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-foo: bar[m
[31m---- response_body[m
[31m-bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: get content-length header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = ngx.header.content_length[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua 'ngx.print("Hello")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-Hello5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: set and get content-length header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_length = 27[m
[31m-            ngx.var.footer = ngx.header.content_length[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua 'ngx.print("Hello")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- response_body[m
[31m-Hello27[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: get content-type header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = ngx.header.content_type[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        default_type 'abc/foo';[m
[31m-        content_by_lua 'ngx.print("Hello")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-Content-Type: abc/foo[m
[31m---- response_body[m
[31m-Helloabc/foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: set and get content-type header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_type = "text/blah"[m
[31m-            ngx.var.footer = ngx.header.content_type[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        default_type 'abc/foo';[m
[31m-        content_by_lua 'ngx.print("Hello")';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-Content-Type: text/blah[m
[31m---- response_body[m
[31m-Hellotext/blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: get user header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = ngx.header.baz[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.baz = "bah"[m
[31m-            ngx.print("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-baz: bah[m
[31m---- response_body[m
[31m-Hellobah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: set and get user header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.baz = "foo"[m
[31m-            ngx.var.footer = ngx.header.baz[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.baz = "bah"[m
[31m-            ngx.print("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-baz: foo[m
[31m---- response_body[m
[31m-Hellofoo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: get multiple user header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.footer = table.concat(ngx.header.baz, ", ")[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.baz = {"bah", "blah"}[m
[31m-            ngx.print("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- raw_response_headers_like eval[m
[31m-"baz: bah\r[m
[31m-.*?baz: blah"[m
[31m---- response_body[m
[31m-Hellobah, blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: set and get multiple user header (proxy)[m
[31m---- config[m
[31m-    location /main {[m
[31m-        set $footer '';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.baz = {"foo", "baz"}[m
[31m-            ngx.var.footer = table.concat(ngx.header.baz, ", ")[m
[31m-        ';[m
[31m-        echo_after_body $footer;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.baz = {"bah", "hah"}[m
[31m-            ngx.print("Hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- raw_response_headers_like eval[m
[31m-"baz: foo\r[m
[31m-.*?baz: baz"[m
[31m---- response_body[m
[31m-Hellofoo, baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: get non-existant header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.header.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-!foo[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: get non-existant header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo = {"bah", "baz", "blah"}[m
[31m-            ngx.header.foo = nil[m
[31m-            ngx.say(ngx.header.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-!foo[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: override domains in the cookie[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo hello;[m
[31m-        add_header Set-Cookie 'foo=bar; Domain=backend.int';[m
[31m-        add_header Set-Cookie 'baz=bah; Domain=backend.int';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-        header_filter_by_lua '[m
[31m-            local cookies = ngx.header.set_cookie[m
[31m-            if not cookies then return end[m
[31m-            if type(cookies) ~= "table" then cookies = {cookies} end[m
[31m-            local newcookies = {}[m
[31m-            for i, val in ipairs(cookies) do[m
[31m-                local newval = string.gsub(val, "([dD]omain)=[%w_-\\\\.]+",[m
[31m-                          "%1=external.domain.com")[m
[31m-                table.insert(newcookies, newval)[m
[31m-            end[m
[31m-            ngx.header.set_cookie = newcookies[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_headers[m
[31m-Set-Cookie: foo=bar; Domain=external.domain.com, baz=bah; Domain=external.domain.com[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: set single value to cache-control[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = "private"[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: private[m
[31m---- response_body[m
[31m-Cache-Control: private[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: set multi values to cache-control[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store" }[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: private, no-store[m
[31m---- response_body_like chop[m
[31m-^Cache-Control: private[;,] no-store$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: set multi values to cache-control and override it with a single value[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store" }[m
[31m-            ngx.header.cache_control = { "no-cache" }[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-            ngx.say("Cache-Control: ", ngx.header.cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: no-cache[m
[31m---- response_body[m
[31m-Cache-Control: no-cache[m
[31m-Cache-Control: no-cache[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: set multi values to cache-control and override it with multiple values[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store" }[m
[31m-            ngx.header.cache_control = { "no-cache", "blah", "foo" }[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-            ngx.say("Cache-Control: ", table.concat(ngx.header.cache_control, ", "))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: no-cache, blah, foo[m
[31m---- response_body_like chop[m
[31m-^Cache-Control: no-cache[;,] blah[;,] foo[m
[31m-Cache-Control: no-cache[;,] blah[;,] foo$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: set the www-authenticate response header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.www_authenticate = "blah"[m
[31m-            ngx.say("WWW-Authenticate: ", ngx.var.sent_http_www_authenticate)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-WWW-Authenticate: blah[m
[31m---- response_body[m
[31m-WWW-Authenticate: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: set and clear the www-authenticate response header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo = "blah"[m
[31m-            ngx.header.foo = nil[m
[31m-            ngx.say("Foo: ", ngx.var.sent_http_foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-!Foo[m
[31m---- response_body[m
[31m-Foo: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: set multi values to cache-control and override it with multiple values (to reproduce a bug)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.cache_control = { "private", "no-store", "foo", "bar", "baz" }[m
[31m-            ngx.header.cache_control = {}[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-        add_header Cache-Control "blah";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-Cache-Control: blah[m
[31m---- response_body[m
[31m-Cache-Control: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: set last-modified and return 304[m
[31m---- config[m
[31m-  location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Last-Modified"] = ngx.http_time(1290079655)[m
[31m-            ngx.say(ngx.header["Last-Modified"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 18 Nov 2010 11:27:35 GMT[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 18 Nov 2010 11:27:35 GMT[m
[31m---- error_code: 304[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: set last-modified and return 200[m
[31m---- config[m
[31m-  location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Last-Modified"] = ngx.http_time(1290079655)[m
[31m-            ngx.say(ngx.header["Last-Modified"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 18 Nov 2010 11:27:34 GMTT[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 18 Nov 2010 11:27:35 GMT[m
[31m---- response_body[m
[31m-Thu, 18 Nov 2010 11:27:35 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: set response content-encoding header should bypass ngx_http_gzip_filter_module[m
[31m---- config[m
[31m-    default_type text/plain;[m
[31m-    gzip             on;[m
[31m-    gzip_min_length  1;[m
[31m-    gzip_types       text/plain;[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_encoding = "gzip";[m
[31m-            ngx.say("Hello, world, my dear friend!");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Hello, world, my dear friend![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: no transform underscores (write)[m
[31m---- config[m
[31m-    lua_transform_underscores_in_response_headers off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo_bar = "Hello"[m
[31m-            ngx.say(ngx.header.foo_bar)[m
[31m-            ngx.say(ngx.header["foo-bar"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- raw_response_headers_like eval[m
[31m-"\r\nfoo_bar: Hello\r\n"[m
[31m---- response_body[m
[31m-Hello[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: with transform underscores (write)[m
[31m---- config[m
[31m-    lua_transform_underscores_in_response_headers on;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo_bar = "Hello"[m
[31m-            ngx.say(ngx.header.foo_bar)[m
[31m-            ngx.say(ngx.header["foo-bar"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- raw_response_headers_like eval[m
[31m-"\r\nfoo-bar: Hello\r\n"[m
[31m---- response_body[m
[31m-Hello[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: github issue #199: underscores in lua variables[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-          ngx.header.content_type = "text/my-plain"[m
[31m-[m
[31m-          local results = {}[m
[31m-          results.something = "hello"[m
[31m-          results.content_type = "anything"[m
[31m-          results.somehing_else = "hi"[m
[31m-[m
[31m-          local arr = {}[m
[31m-          for k in pairs(results) do table.insert(arr, k) end[m
[31m-          table.sort(arr)[m
[31m-          for i, k in ipairs(arr) do[m
[31m-            ngx.say(k .. ": " .. results[k])[m
[31m-          end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m-[m
[31m---- response_body[m
[31m-content_type: anything[m
[31m-somehing_else: hi[m
[31m-something: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: set multiple response header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 50 do[m
[31m-                ngx.header["X-Direct-" .. i] = "text/my-plain-" .. i;[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(ngx.header["X-Direct-50"]);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-text/my-plain-50[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: set multiple response header and then reset and then clear[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 50 do[m
[31m-                ngx.header["X-Direct-" .. i] = "text/my-plain-" .. i;[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 50 do[m
[31m-                ngx.header["X-Direct-" .. i] = "text/my-plain"[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 50 do[m
[31m-                ngx.header["X-Direct-" .. i] = nil[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: set response content-type header for multiple times[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_type = "text/my-plain";[m
[31m-            ngx.header.content_type = "text/my-plain-2";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain-2[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: set Last-Modified response header for multiple times[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = ngx.http_time(1290079655)[m
[31m-            ngx.header.last_modified = ngx.http_time(1290079654)[m
[31m-            ngx.say("ok");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Last-Modified: Thu, 18 Nov 2010 11:27:34 GMT[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: set Last-Modified response header and then clear[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = ngx.http_time(1290079655)[m
[31m-            ngx.header.last_modified = nil[m
[31m-            ngx.say("ok");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Last-Modified[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: github #20: segfault caused by the nasty optimization in the nginx core (write)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.foo = 1[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/t/[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: github #20: segfault caused by the nasty optimization in the nginx core (read)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        header_filter_by_lua '[m
[31m-            local v = ngx.header.foo[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/t/[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: github #20: segfault caused by the nasty optimization in the nginx core (read Location)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.Foo = ngx.header.location[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/t/[m
[31m-Foo: /t/[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: github #20: segfault caused by the nasty optimization in the nginx core (set Foo and read Location)[m
[31m---- config[m
[31m-    location = /t/ {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.Foo = 3[m
[31m-            ngx.header.Foo = ngx.header.location[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bah: baz[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/t/[m
[31m-Foo: /t/[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: case sensitive cache-control header[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["cache-Control"] = "private"[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- raw_response_headers_like chop[m
[31m-cache-Control: private[m
[31m---- response_body[m
[31m-Cache-Control: private[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: clear Cache-Control when there was no Cache-Control[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Cache-Control"] = nil[m
[31m-            ngx.say("Cache-Control: ", ngx.var.sent_http_cache_control)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- raw_response_headers_unlike eval[m
[31m-qr/Cache-Control/i[m
[31m---- response_body[m
[31m-Cache-Control: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            local s = "content_type"[m
[31m-            local v = ngx.header[s][m
[31m-            ngx.say("s = ", s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-s = content_type[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: set a number header name[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header[32] = "private"[m
[31m-            ngx.say("32: ", ngx.var.sent_http_32)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-32: private[m
[31m---- response_body[m
[31m-32: private[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: set a number header name (in a table value)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.foo = {32}[m
[31m-            ngx.say("foo: ", ngx.var.sent_http_foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_headers[m
[31m-foo: 32[m
[31m---- response_body[m
[31m-foo: 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 57: random access resp headers[m
[31m---- config[m
[31m-    location /resp-header {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = "bar"[m
[31m-            ngx.header["Bar"] = "baz"[m
[31m-            ngx.say("Foo: ", ngx.resp.get_headers()["Foo"] or "nil")[m
[31m-            ngx.say("foo: ", ngx.resp.get_headers()["foo"] or "nil")[m
[31m-            ngx.say("Bar: ", ngx.resp.get_headers()["Bar"] or "nil")[m
[31m-            ngx.say("bar: ", ngx.resp.get_headers()["bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /resp-header[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: bar[m
[31m-foo: bar[m
[31m-Bar: baz[m
[31m-bar: baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 58: iterating through raw resp headers[m
[31m---- config[m
[31m-    location /resp-header {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = "bar"[m
[31m-            ngx.header["Bar"] = "baz"[m
[31m-            local h = {}[m
[31m-            for k, v in pairs(ngx.resp.get_headers(nil, true)) do[m
[31m-                h[k] = v[m
[31m-            end[m
[31m-            ngx.say("Foo: ", h["Foo"] or "nil")[m
[31m-            ngx.say("foo: ", h["foo"] or "nil")[m
[31m-            ngx.say("Bar: ", h["Bar"] or "nil")[m
[31m-            ngx.say("bar: ", h["bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /resp-header[m
[31m---- response_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: bar[m
[31m-foo: nil[m
[31m-Bar: baz[m
[31m-bar: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 59: removed response headers[m
[31m---- config[m
[31m-    location /resp-header {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Foo"] = "bar"[m
[31m-            ngx.header["Foo"] = nil[m
[31m-            ngx.header["Bar"] = "baz"[m
[31m-            ngx.say("Foo: ", ngx.resp.get_headers()["Foo"] or "nil")[m
[31m-            ngx.say("foo: ", ngx.resp.get_headers()["foo"] or "nil")[m
[31m-            ngx.say("Bar: ", ngx.resp.get_headers()["Bar"] or "nil")[m
[31m-            ngx.say("bar: ", ngx.resp.get_headers()["bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /resp-header[m
[31m---- response_headers[m
[31m-!Foo[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: nil[m
[31m-foo: nil[m
[31m-Bar: baz[m
[31m-bar: baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 60: built-in Content-Type header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Content-Type: ", hs["Content-Type"])[m
[31m-            print("my content-type: ", hs["content-type"])[m
[31m-            print("my content_type: ", hs["content_type"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Content-Type: text/plain[m
[31m-my content-type: text/plain[m
[31m-my content_type: text/plain[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 61: built-in Content-Length header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Content-Length: ", hs["Content-Length"])[m
[31m-            print("my content-length: ", hs["content-length"])[m
[31m-            print("my content_length: ", hs.content_length)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Content-Length: 3[m
[31m-my content-length: 3[m
[31m-my content_length: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 62: built-in Connection header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Connection: ", hs["Connection"])[m
[31m-            print("my connection: ", hs["connection"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Connection: close[m
[31m-my connection: close[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 63: built-in Transfer-Encoding header (chunked)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Transfer-Encoding: ", hs["Transfer-Encoding"])[m
[31m-            print("my transfer-encoding: ", hs["transfer-encoding"])[m
[31m-            print("my transfer_encoding: ", hs.transfer_encoding)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Transfer-Encoding: chunked[m
[31m-my transfer-encoding: chunked[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 64: built-in Transfer-Encoding header (none)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local hs = ngx.resp.get_headers()[m
[31m-            print("my Transfer-Encoding: ", hs["Transfer-Encoding"])[m
[31m-            print("my transfer-encoding: ", hs["transfer-encoding"])[m
[31m-            print("my transfer_encoding: ", hs.transfer_encoding)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-my Transfer-Encoding: nil[m
[31m-my transfer-encoding: nil[m
[31m-my transfer_encoding: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 65: set Location (no host)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.location = "/foo/bar"[m
[31m-            return ngx.exit(301)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-Location: /foo/bar[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 66: set Location (with host)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.location = "http://test.com/foo/bar"[m
[31m-            return ngx.exit(301)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-Location: http://test.com/foo/bar[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 67: ngx.header["Content-Type"] with ngx_gzip[m
[31m---- config[m
[31m-    gzip             on;[m
[31m-    gzip_min_length  1;[m
[31m-    location = /test2 {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Content-Type"] = "text/html; charset=utf-8"[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test2[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m-Content-Type: text/html; charset=utf-8[m
[31m---- response_body_like chomp[m
[31m-[^[:ascii:]]+[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 68: ngx.header["Content-Type"] with "; blah"[m
[31m---- config[m
[31m-    location = /test2 {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["Content-Type"] = "; blah"[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test2[m
[31m---- response_headers[m
[31m-!Content-Encoding[m
[31m-Content-Type: ; blah[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/017-exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/017-exec.t[m
[1mdeleted file mode 100644[m
[1mindex 4c7a918..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/017-exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,575 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_shuffle();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/hi");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty uri arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec();[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: too many args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec(1, 2, 3, 4);[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: null uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec(nil)[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/hi", "Yichun Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello Yichun Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: args in uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/hi?agentzh")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello agentzh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello a=Yichun&b=Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-    }[m
[31m-    location @hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exec after location capture (simple echo)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('/b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exec after location capture (memc)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        set $memc_key 'hello world';[m
[31m-        set $memc_value 'hello hello hello world world world';[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        set $memc_key 'hello world';[m
[31m-        set $memc_cmd get;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('/b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body: hello hello hello world world world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exec after named location capture (simple echo)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location @b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('@b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exec after named location capture (memc)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        set $memc_key 'hello world';[m
[31m-        set $memc_value 'hello hello hello world world world';[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location @b {[m
[31m-        set $memc_key 'hello world';[m
[31m-        set $memc_cmd get;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('@b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body: hello hello hello world world world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (content)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-        #echo hello;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (content + named location)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-        #echo hello;[m
[31m-    }[m
[31m-    location @p {[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (content + post subrequest)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-        #echo hello;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/blah")[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: pcall safe[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f ()[m
[31m-                ngx.exec("/hi")[m
[31m-            end[m
[31m-[m
[31m-            pcall(f)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: lua table as "args" parameter[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = { foo = 3, bar = 4 }[m
[31m-            ngx.exec("/hi", args)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "foo = $arg_foo";[m
[31m-        echo "bar = $arg_bar";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-foo = 3[m
[31m-bar = 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: jump to internal locations requires ctx cleared[m
[31m---- config[m
[31m-    location @proxy {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: exec + rewrite + named locations[m
[31m---- config[m
[31m-    location @proxy {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: exec(named location) in subrequests[m
[31m---- config[m
[31m-    location /entry {[m
[31m-        echo_location /foo;[m
[31m-        echo_location /foo2;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      content_by_lua '[m
[31m-          ngx.exec("@bar")[m
[31m-      ';[m
[31m-  }[m
[31m-  location /foo2 {[m
[31m-      content_by_lua '[m
[31m-          ngx.exec("@bar")[m
[31m-      ';[m
[31m-  }[m
[31m-[m
[31m-  location @bar {[m
[31m-      proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-  }[m
[31m-  location /bar {[m
[31m-      echo hello;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /entry[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exec(normal location) in subrequests[m
[31m---- config[m
[31m-    location /entry {[m
[31m-        echo_location /foo;[m
[31m-        echo_location /foo2;[m
[31m-    }[m
[31m-  location /foo {[m
[31m-      content_by_lua '[m
[31m-          ngx.exec("/baz")[m
[31m-      ';[m
[31m-  }[m
[31m-  location /foo2 {[m
[31m-      content_by_lua '[m
[31m-          ngx.exec("/baz")[m
[31m-      ';[m
[31m-  }[m
[31m-[m
[31m-  location /baz {[m
[31m-      proxy_pass http://127.0.0.1:$server_port/bar;[m
[31m-  }[m
[31m-  location /bar {[m
[31m-      echo hello;[m
[31m-  }[m
[31m---- request[m
[31m-    GET /entry[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: content_by_lua + ngx.exec + subrequest capture[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/test_loc");[m
[31m-            ngx.print("hello, ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /test_loc {[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m-    location @proxy {[m
[31m-        #echo proxy;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #echo_status 201;[m
[31m-        echo bah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: jump to an internal location[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            return ngx.exec("/proxy", ngx.var.args)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/dummy;[m
[31m-    }[m
[31m-[m
[31m-    location = /dummy {[m
[31m-        echo -n dummy;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t?foo"][m
[31m---- response_body eval[m
[31m-["dummy", "dummy"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/018-ndk.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/018-ndk.t[m
[1mdeleted file mode 100644[m
[1mindex d68306b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/018-ndk.t[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            local s = ndk.set_var.set_escape_uri(" :")[m
[31m-            local r = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(r)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-%20%3A[m
[31m-a b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: directive not found[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            local s = ndk.set_var.set_escape_uri_blah_blah(" :")[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: directive not found[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            local s = ndk.set_var.content_by_lua(" :")[m
[31m-            ngx.say(s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: directive not found[m
[31m---- config[m
[31m-    location /read {[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.Foo = ndk.set_var.set_escape_uri(" %")[m
[31m-        ';[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Foo: %20%25[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bug: ndk.set_var not initialize ngx_http_variable_value_t variable properly[m
[31m---- config[m
[31m-   location /luaset {[m
[31m-     content_by_lua "[m
[31m-[m
[31m-       local version = '2011.10.13+0000'[m
[31m-       local e_version = ndk.set_var.set_encode_base32(version)[m
[31m-       local s_version= ndk.set_var.set_quote_sql_str(version)[m
[31m-       ngx.say(e_version)[m
[31m-       ngx.say(s_version)[m
[31m-     ";[m
[31m-   }[m
[31m---- request[m
[31m-GET /luaset[m
[31m---- response_body[m
[31m-68o32c9e64o2sc9j5co30c1g[m
[31m-'2011.10.13+0000'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set_by_lua[m
[31m---- config[m
[31m-    location /read {[m
[31m-        set_by_lua $r '[m
[31m-            return ndk.set_var.set_unescape_uri("a%20b")[m
[31m-        ';[m
[31m-        echo $r;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-a b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: header_filter_by_lua[m
[31m---- config[m
[31m-    location /read {[m
[31m-        set $foo '';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say(ngx.var.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.var.foo = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-a b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: log_by_lua[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            local foo = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-            ngx.log(ngx.WARN, "foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-ok[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-foo = a b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.timer.*[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            ngx.timer.at(0, function ()[m
[31m-                local foo = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-                ngx.log(ngx.WARN, "foo = ", foo)[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-ok[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-foo = a b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/019-const.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/019-const.t[m
[1mdeleted file mode 100644[m
[1mindex fe79bfb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/019-const.t[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.OK)[m
[31m-            ngx.say(ngx.AGAIN)[m
[31m-            ngx.say(ngx.DONE)[m
[31m-            ngx.say(ngx.ERROR)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-0[m
[31m--2[m
[31m--4[m
[31m--1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http constants[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.HTTP_GATEWAY_TIMEOUT)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-504[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/020-subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/020-subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 88ac1b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/020-subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,2875 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#worker_connections(1014);[m
[31m-#log_level('warn');[m
[31m-#master_process_enabled(1);[m
[31m-[m
[31m-no_root_location;[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 23);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: DELETE[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m---- error_log[m
[31m-lua http subrequest "/other?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: DELETE (proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: POST (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-POST[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: HEAD[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_HEAD });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: explicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: implicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: implicit GET (empty option table)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo", {})[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: PUT (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-        #echo "[$http_content_length]";[m
[31m-        echo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo $echo_request_method;[m
[31m-        echo -n "[$http_content_length]";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-            ngx.say(res.body)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-PUT[m
[31m-hello[m
[31m-GET[m
[31m-[][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: POST (with body, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-POST[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd "";[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush",[m
[31m-                { share_all_vars = true });[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { share_all_vars = true });[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello", share_all_vars = true });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc", { share_all_vars = true });[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: emtpy args option table[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = {} })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval: "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: non-empty args option table (1 pair)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-fo%3D=%3D%3E[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: non-empty args option table (2 pairs)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>",[m
[31m-                    ["="] = ":" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:fo%3D=%3D%3E\&%3D=%3A|%3D=%3A\&fo%3D=%3D%3E)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: non-empty args option table (2 pairs, no special chars)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { foo = 3,[m
[31m-                    bar = "hello" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:bar=hello\&foo=3|foo=3\&bar=hello)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: non-empty args option table (number key)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { [57] = "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-attempt to use a non-string key in the "args" option table[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: non-empty args option table (plain arrays)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-attempt to use a non-string key in the "args" option table[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = { b = 4 } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = "b=4" })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: is_subrequest in main request[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            if ngx.is_subrequest then[m
[31m-                ngx.say("sub req")[m
[31m-            else[m
[31m-                ngx.say("main req")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-main req[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: is_subrequest in sub request[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            if ngx.is_subrequest then[m
[31m-                ngx.say("sub req")[m
[31m-            else[m
[31m-                ngx.say("main req")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub req[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: is_subrequest in sub request in set_by_lua[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set_by_lua $a '[m
[31m-            if ngx.is_subrequest then[m
[31m-                return "sub req"[m
[31m-            else[m
[31m-                return "main req"[m
[31m-            end[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-sub req[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: header inheritance bug (without body) (github issue 38)[m
[31m-https://github.com/chaoslawful/lua-nginx-module/issues/38[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo -n $http_foo;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-            ngx.say("header foo: [", res.body, "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body[m
[31m-header foo: [bar][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: header inheritance bug (with body) (github issue 38)[m
[31m-https://github.com/chaoslawful/lua-nginx-module/issues/38[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo -n $http_foo;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { body = "abc" });[m
[31m-            ngx.say("header foo: [", res.body, "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body[m
[31m-header foo: [bar][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: lua calls lua via subrequests[m
[31m---- config[m
[31m-    location /a {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, a");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /b {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, b");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /c {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, c");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res1, res2 = ngx.location.capture_multi({{"/a"}, {"/b"}})[m
[31m-            res3 = ngx.location.capture("/c")[m
[31m-            ngx.print(res1.body, res2.body, res3.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, a[m
[31m-hello, b[m
[31m-hello, c[m
[31m---- error_log[m
[31m-lua reuse free buf memory[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: POST (with body, proxy method, main request is a POST too)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hi[m
[31m---- response_body chomp[m
[31m-POST[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: Last-Modified response header for static file subrequest[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo.html")[m
[31m-[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.say(res.header["Last-Modified"])[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- user_files[m
[31m->>> foo.html[m
[31m-hello, static file[m
[31m---- response_body_like chomp[m
[31m-^200[m
[31m-[A-Za-z]+, \d{1,2} [A-Za-z]+ \d{4} \d{2}:\d{2}:\d{2} GMT[m
[31m-hello, static file$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: custom ctx table for subrequest[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = "bar";[m
[31m-        ';[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            res = ngx.location.capture("/sub", { ctx = ctx })[m
[31m-[m
[31m-            ngx.say(ctx.foo);[m
[31m-            ngx.say(ngx.ctx.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-bar[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: share the ctx with the parent[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = "bar";[m
[31m-        ';[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub", { ctx = ngx.ctx })[m
[31m-            ngx.say(ngx.ctx.foo);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: test memcached with subrequests[m
[31m---- http_config[m
[31m-    upstream memc {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 100;[m
[31m-    }[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_key some_key;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass memc;[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello 1234" });[m
[31m-            -- ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("some_key: " .. res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-some_key: hello 1234[m
[31m---- error_log[m
[31m-lua reuse free buf chain, but reallocate memory because[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: main POST, sub GET (main does not read the body)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_method)[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-        #proxy_pass http://127.0.0.1:8892/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello, world[m
[31m---- response_body[m
[31m-GET[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: main POST, sub GET (main has read the body)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_method)[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-        #proxy_pass http://127.0.0.1:8892/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello, world[m
[31m---- response_body[m
[31m-GET[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: main POST, sub POST (inherit bodies directly)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_method)[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-        #proxy_pass http://127.0.0.1:8892/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello, world[m
[31m---- response_body[m
[31m-POST[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: main POST, sub PUT (inherit bodies directly)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_method)[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-        #proxy_pass http://127.0.0.1:8892/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_PUT });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello, world[m
[31m---- response_body[m
[31m-PUT[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: recursive calls[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/t")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-lua subrequests cycle while processing "/t"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: OPTIONS[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_OPTIONS });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-OPTIONS[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: OPTIONS with a body[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_OPTIONS, body = "hello world" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chop[m
[31m-OPTIONS[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: encode args table with a multi-value arg.[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local res = ngx.location.capture("/sub", { args = args })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t?r[]=http%3A%2F%2Fajax.googleapis.com%3A80%2Fajax%2Flibs%2Fjquery%2F1.7.2%2Fjquery.min.js&r[]=http%3A%2F%2Fajax.googleapis.com%3A80%2Fajax%2Flibs%2Fdojo%2F1.7.2%2Fdojo%2Fdojo.js.uncompressed.js[m
[31m---- response_body[m
[31m-r%5B%5D=http%3A%2F%2Fajax.googleapis.com%3A80%2Fajax%2Flibs%2Fjquery%2F1.7.2%2Fjquery.min.js&r%5B%5D=http%3A%2F%2Fajax.googleapis.com%3A80%2Fajax%2Flibs%2Fdojo%2F1.7.2%2Fdojo%2Fdojo.js.uncompressed.js[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: subrequests finalized with NGX_ERROR[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-status: 500[m
[31m-body: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: subrequests finalized with 500[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-status: 500[m
[31m-body: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: subrequests with an output body filter returning NGX_ERROR[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        echo hello world;[m
[31m-        body_filter_by_lua '[m
[31m-            return ngx.ERROR[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- stap2[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m---- response_body[m
[31m---- error_code[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: subrequests truncated in its response body due to premature connection close (nonbuffered)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key 'foo';[m
[31m-        #set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:19112; #$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/memc")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19112[m
[31m---- tcp_query_len: 9[m
[31m---- tcp_reply eval[m
[31m-"VALUE foo 0 1024\r\nhello world"[m
[31m-[m
[31m---- stap2[m
[31m-F(ngx_http_lua_capture_body_filter) {[m
[31m-    if (pid() == target() && $r != $r->main) {[m
[31m-        printf("lua capture body output: %s\n", ngx_chain_dump($in))[m
[31m-        if ($in->buf->last_in_chain) {[m
[31m-            print_ubacktrace()[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: subrequests truncated in its response body due to upstream read timeout (nonbuffered)[m
[31m---- config[m
[31m-    memc_read_timeout 100ms;[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key 'foo';[m
[31m-        #set $memc_exptime 300;[m
[31m-        memc_pass 127.0.0.1:19112; #$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/memc")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19112[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"VALUE foo 0 1024\r\nhello world"[m
[31m-[m
[31m---- stap2[m
[31m-F(ngx_http_lua_capture_body_filter) {[m
[31m-    if (pid() == target() && $r != $r->main) {[m
[31m-        printf("lua capture body output: %s\n", ngx_chain_dump($in))[m
[31m-        //if ($in->buf->last_in_chain) {[m
[31m-            print_ubacktrace()[m
[31m-        //}[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=504[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^status: 200[m
[31m-body: [^\n]*[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: subrequests truncated in its response body due to premature connection close (buffered)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\nContent-Length: 1024\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: subrequests truncated in its response body due to read timeout (buffered)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\nContent-Length: 1024\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: [m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: subrequests truncated in its response body due to premature connection close (buffered, no content-length)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=0[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: false[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: subrequests truncated in its response body due to read timeout (buffered, no content-length)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: [m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: subrequests truncated in its response body due to premature connection close (nonbuffered, no content-length)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=0[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: false[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: subrequests truncated in its response body due to read timeout (nonbuffered, no content-length)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_read_timeout 500ms;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=504[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: forwarding in-memory request bodies to multiple subrequests[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res = ngx.location.capture("/other",[m
[31m-                    { method = ngx.HTTP_POST });[m
[31m-[m
[31m-                ngx.say(res.body)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request eval[m
[31m-"POST /lua[m
[31m-" . "hello world"[m
[31m-[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: forwarding in-file request bodies to multiple subrequests (client_body_in_file_only)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    client_body_in_file_only on;[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res = ngx.location.capture("/other",[m
[31m-                    { method = ngx.HTTP_POST });[m
[31m-[m
[31m-                ngx.say(res.body)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request eval[m
[31m-"POST /lua[m
[31m-" . "hello world"[m
[31m-[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: forwarding in-file request bodies to multiple subrequests (exceeding client_body_buffer_size)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        #client_body_in_file_only on;[m
[31m-        client_body_buffer_size 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                res = ngx.location.capture("/other",[m
[31m-                    { method = ngx.HTTP_POST });[m
[31m-[m
[31m-                ngx.say(res.body)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /lua[m
[31m-" . ("hello world" x 100)[m
[31m-[m
[31m---- stap2[m
[31m-global valid = 0[m
[31m-global fds[m
[31m-[m
[31m-F(ngx_http_handler) { valid = 1  }[m
[31m-[m
[31m-probe syscall.open {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        print(name, "(", argstr, ")")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.close {[m
[31m-    if (valid && pid() == target() && fds[sprintf("%d", $fd)]) {[m
[31m-        println(name, "(", argstr, ")")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.unlink {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(name, "(", argstr, ")")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.open.return {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(" = ", retstr)[m
[31m-        fds[retstr] = 1[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_subrequest) {[m
[31m-    println("lua subrequest")[m
[31m-}[m
[31m-[m
[31m-F(ngx_output_chain) {[m
[31m-    printf("output chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_pool_run_cleanup_file) {[m
[31m-    println("clean up file: ", $fd)[m
[31m-}[m
[31m-[m
[31m---- response_body eval[m
[31m-("hello world" x 100) . "\n"[m
[31m-. ("hello world" x 100) . "\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: subrequests truncated in its response body due to premature connection close (buffered + chunked)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\nb\r\nhello world\r"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: subrequests truncated in its response body due to premature connection close (nonbuffered + chunked)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\nb\r\nhello world\r"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 57: subrequests truncated in its response body due to read timeout (buffered + chunked)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\nb\r\nhello world\r"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-conn err: 110: upstream timed out[m
[31m-upstream fin req: error=0 eof=0 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: [m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 58: good chunked response (buffered)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering on;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n0\r\n\r\n"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=0 rc=0[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello[m
[31m-truncated: false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 59: good chunked response (nonbuffered)[m
[31m---- config[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_no_close[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n0\r\n\r\n"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=0 rc=0[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello[m
[31m-truncated: false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 60: subrequests truncated in its response body due to premature connection close (nonbuffered + proxy)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-[m
[31m-        #proxy_read_timeout 100ms;[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:19113;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/proxy")[m
[31m-            ngx.say("status: ", res.status)[m
[31m-            ngx.say("body: ", res.body)[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- tcp_listen: 19113[m
[31m---- tcp_query_len: 65[m
[31m---- tcp_reply eval[m
[31m-"HTTP/1.0 200 OK\r\nContent-Length: 1024\r\n\r\nhello world"[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_upstream_finalize_request) {[m
[31m-    printf("upstream fin req: error=%d eof=%d rc=%d\n",[m
[31m-        $r->upstream->peer->connection->read->error,[m
[31m-        $r->upstream->peer->connection->read->eof,[m
[31m-        $rc)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_connection_error) {[m
[31m-    printf("conn err: %d: %s\n", $err, user_string($text))[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: rc=%d, status=%d\n", $rc, $r->headers_out->status)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize: %d\n", $rc)[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-upstream fin req: error=0 eof=1 rc=502[m
[31m-post subreq: rc=0, status=200[m
[31m-[m
[31m---- response_body[m
[31m-status: 200[m
[31m-body: hello world[m
[31m-truncated: true[m
[31m-[m
[31m---- error_log[m
[31m-upstream prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 61: WebDAV methods[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "method: $echo_request_method";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local methods = {[m
[31m-                ngx.HTTP_MKCOL,[m
[31m-                ngx.HTTP_COPY,[m
[31m-                ngx.HTTP_MOVE,[m
[31m-                ngx.HTTP_PROPFIND,[m
[31m-                ngx.HTTP_PROPPATCH,[m
[31m-                ngx.HTTP_LOCK,[m
[31m-                ngx.HTTP_UNLOCK,[m
[31m-                ngx.HTTP_PATCH,[m
[31m-                ngx.HTTP_TRACE,[m
[31m-            }[m
[31m-[m
[31m-            for i, method in ipairs(methods) do[m
[31m-                res = ngx.location.capture("/other",[m
[31m-                    { method = method })[m
[31m-                ngx.print(res.body)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-method: MKCOL[m
[31m-method: COPY[m
[31m-method: MOVE[m
[31m-method: PROPFIND[m
[31m-method: PROPPATCH[m
[31m-method: LOCK[m
[31m-method: UNLOCK[m
[31m-method: PATCH[m
[31m-method: TRACE[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 62: by default DELETE subrequests don't forward request bodies[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-DELETE /lua[m
[31m-hello world[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 63: DELETE subrequests do forward request bodies when always_forward_body == true[m
[31m---- config[m
[31m-    location = /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE, always_forward_body = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-DELETE /lua[m
[31m-hello world[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 64: DELETE subrequests do forward request bodies when always_forward_body == true (on disk)[m
[31m---- config[m
[31m-    location = /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE, always_forward_body = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-DELETE /lua[m
[31m-hello world[m
[31m---- stap2[m
[31m-global c[m
[31m-probe process("$LIBLUA_PATH").function("rehashtab") {[m
[31m-    c++[m
[31m-    //print_ubacktrace()[m
[31m-    printf("rehash: %d\n", c)[m
[31m-}[m
[31m---- stap_out2[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 65: DELETE[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sub {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- stap[m
[31m-F(ngx_http_lua_capture_header_filter) {[m
[31m-    println("capture header filter")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_capture_body_filter) {[m
[31m-    println("capture body filter")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-capture header filter[m
[31m-capture body filter[m
[31m-capture body filter[m
[31m-capture body filter[m
[31m-capture header filter[m
[31m-capture body filter[m
[31m-capture body filter[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 66: leafo test case 1 for assertion failures[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-        rewrite_by_lua "[m
[31m-          local req = ngx.req[m
[31m-          print(ngx.var._url)[m
[31m-[m
[31m-          for k,v in pairs(req.get_headers()) do[m
[31m-            if k ~= 'content-length' then[m
[31m-              req.clear_header(k)[m
[31m-            end[m
[31m-          end[m
[31m-[m
[31m-          if ngx.ctx.headers then[m
[31m-            for k,v in pairs(ngx.ctx.headers) do[m
[31m-              req.set_header(k, v)[m
[31m-            end[m
[31m-          end[m
[31m-        ";[m
[31m-[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass $_url;[m
[31m-    }[m
[31m-[m
[31m-    location /first {[m
[31m-      set $_url "";[m
[31m-      content_by_lua '[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          ctx = {[m
[31m-            headers = {[m
[31m-              ["Content-type"] = "application/x-www-form-urlencoded"[m
[31m-            }[m
[31m-          },[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          ctx = {[m
[31m-            headers = {[m
[31m-              ["x-some-date"] = "Sun, 01 Dec 2013 11:47:41 GMT",[m
[31m-              ["x-hello-world-header"] = "123412341234",[m
[31m-              ["Authorization"] = "Hello"[m
[31m-            }[m
[31m-          },[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-      ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /first[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-qr/Assertion .*? failed/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 67: leafo test case 2 for assertion failures[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        internal;[m
[31m-        rewrite_by_lua "[m
[31m-          local req = ngx.req[m
[31m-          print(ngx.var._url)[m
[31m-[m
[31m-          for k,v in pairs(req.get_headers()) do[m
[31m-            if k ~= 'content-length' then[m
[31m-              req.clear_header(k)[m
[31m-            end[m
[31m-          end[m
[31m-[m
[31m-          if ngx.ctx.headers then[m
[31m-            for k,v in pairs(ngx.ctx.headers) do[m
[31m-              req.set_header(k, v)[m
[31m-            end[m
[31m-          end[m
[31m-        ";[m
[31m-[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_pass $_url;[m
[31m-    }[m
[31m-[m
[31m-    location /second {[m
[31m-      set $_url "";[m
[31m-      content_by_lua '[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          method = ngx.HTTP_POST,[m
[31m-          body = ("x"):rep(600),[m
[31m-          ctx = {[m
[31m-            headers = {[m
[31m-              ["Content-type"] = "application/x-www-form-urlencoded"[m
[31m-            }[m
[31m-          },[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          ctx = {[m
[31m-            headers = {[m
[31m-              ["x-some-date"] = "Sun, 01 Dec 2013 11:47:41 GMT",[m
[31m-              ["x-hello-world-header"] = "123412341234",[m
[31m-              ["Authorization"] = "Hello"[m
[31m-            }[m
[31m-          },[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-[m
[31m-        local res = ngx.location.capture("/proxy", {[m
[31m-          vars = { _url = "http://127.0.0.1:" .. ngx.var.server_port .. "/t" }[m
[31m-        })[m
[31m-[m
[31m-        ngx.print(res.body)[m
[31m-      ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /second[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-hello[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-"[error]",[m
[31m-qr/Assertion .*? failed/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 68: fetch subrequest's builtin request headers[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo "sr: User-Agent: $http_user_agent";[m
[31m-        echo "sr: Host: $http_host";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: User-Agent: ", ngx.var.http_user_agent)[m
[31m-            ngx.say("pr: Host: ", ngx.var.http_host)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-User-Agent: foo[m
[31m---- response_body[m
[31m-sr: User-Agent: foo[m
[31m-sr: Host: localhost[m
[31m-pr: User-Agent: foo[m
[31m-pr: Host: localhost[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 69: modify subrequest's builtin request headers[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "bar")[m
[31m-        ';[m
[31m-        echo "sr: User-Agent: $http_user_agent";[m
[31m-        echo "sr: Host: $http_host";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: User-Agent: ", ngx.var.http_user_agent)[m
[31m-            ngx.say("pr: Host: ", ngx.var.http_host)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-User-Agent: foo[m
[31m---- response_body[m
[31m-sr: User-Agent: bar[m
[31m-sr: Host: localhost[m
[31m-pr: User-Agent: foo[m
[31m-pr: Host: localhost[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 70: modify subrequest's builtin request headers (main req is POST)[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "bar")[m
[31m-        ';[m
[31m-        echo "sr: User-Agent: $http_user_agent";[m
[31m-        echo "sr: Host: $http_host";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: User-Agent: ", ngx.var.http_user_agent)[m
[31m-            ngx.say("pr: Host: ", ngx.var.http_host)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-User-Agent: foo[m
[31m---- response_body[m
[31m-sr: User-Agent: bar[m
[31m-sr: Host: localhost[m
[31m-pr: User-Agent: foo[m
[31m-pr: Host: localhost[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 71: duplicate request headers (main req is POST)[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo "sr: Cookie: $http_cookie";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: Cookie: ", ngx.var.http_cookie)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Cookie: foo[m
[31m-Cookie: bar[m
[31m---- response_body[m
[31m-sr: Cookie: foo; bar[m
[31m-pr: Cookie: foo; bar[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 72: duplicate request headers (main req is GET)[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo "sr: Cookie: $http_cookie";[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("pr: Cookie: ", ngx.var.http_cookie)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo[m
[31m-Cookie: bar[m
[31m---- response_body[m
[31m-sr: Cookie: foo; bar[m
[31m-pr: Cookie: foo; bar[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 73: HEAD subrequest (github #347)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/index.html",[m
[31m-                { method = ngx.HTTP_HEAD });[m
[31m-            ngx.say("content-length: ", res.header["Content-Length"])[m
[31m-            ngx.say("body: [", res.body, "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^content-length: \d+[m
[31m-body: \[\][m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 74: image_filter + ngx.location.capture[m
[31m-ngx_http_image_filter_module's header filter intercepts[m
[31m-the header filter chain so the r->header_sent flag won't[m
[31m-get set right after the header filter chain is first invoked.[m
[31m-[m
[31m---- config[m
[31m-[m
[31m-location = /back {[m
[31m-    empty_gif;[m
[31m-}[m
[31m-[m
[31m-location = /t {[m
[31m-    image_filter rotate 90;[m
[31m-[m
[31m-    content_by_lua '[m
[31m-        local res = ngx.location.capture("/back")[m
[31m-        for k, v in pairs(res.header) do[m
[31m-            ngx.header[k] = v[m
[31m-        end[m
[31m-        ngx.status = res.status[m
[31m-        ngx.print(res.body)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: .[m
[31m---- stap[m
[31m-F(ngx_http_image_header_filter) {[m
[31m-    println("image header filter")[m
[31m-}[m
[31m---- stap_out[m
[31m-image header filter[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 75: WebDAV + MOVE[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local file1 = "/file1.txt"[m
[31m-            local file2 = "/file2.txt"[m
[31m-            ngx.req.set_header( "Destination", file2 )[m
[31m-            local res = ngx.location.capture([m
[31m-                file1, { method = ngx.HTTP_MOVE }[m
[31m-            )[m
[31m-[m
[31m-            ngx.say([m
[31m-                "MOVE ", file1, " -> ", file2,[m
[31m-                ", response status: ", res.status[m
[31m-            )[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location / {[m
[31m-        dav_methods MOVE;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> file1.txt[m
[31m-hello, world![m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-MOVE /file1.txt -> /file2.txt, response status: 204[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 76: WebDAV + DELETE[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local file = "/file.txt"[m
[31m-            local res = ngx.location.capture([m
[31m-                file, { method = ngx.HTTP_DELETE }[m
[31m-            )[m
[31m-[m
[31m-            ngx.say([m
[31m-                "DELETE ", file,[m
[31m-                ", response status: ", res.status[m
[31m-            )[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location / {[m
[31m-        dav_methods DELETE;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> file.txt[m
[31m-hello, world![m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-DELETE /file.txt, response status: 204[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 200[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/021-cookie-time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/021-cookie-time.t[m
[1mdeleted file mode 100644[m
[1mindex c00bbea..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/021-cookie-time.t[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cookie_time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.cookie_time(1290079655))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Thu, 18-Nov-10 11:27:35 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cookie_time in set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $a '[m
[31m-            return ngx.cookie_time(1290079655)[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Thu, 18-Nov-10 11:27:35 GMT[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/022-redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/022-redirect.t[m
[1mdeleted file mode 100644[m
[1mindex 57c7add..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/022-redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,220 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo");[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: explicit 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo", ngx.HTTP_MOVED_TEMPORARILY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: explicit 301[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo", ngx.HTTP_MOVED_PERMANENTLY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad rc[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo", 404);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-only ngx.HTTP_MOVED_TEMPORARILY, ngx.HTTP_MOVED_PERMANENTLY, and ngx.HTTP_TEMPORARY_REDIRECT are allowed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: no args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect()[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: relative uri[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello, world;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT/echo;[m
[31m-    }[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/proxy")[m
[31m-            ngx.redirect("/echo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like: Location: /echo\r\n[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: default 302 (with uri args)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo?bar=3");[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo?bar=3[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: location.capture + ngx.redirect[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        echo hello, world;[m
[31m-    }[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT/echo;[m
[31m-    }[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/proxy")[m
[31m-            ngx.location.capture("/proxy")[m
[31m-            ngx.redirect("/echo")[m
[31m-            ngx.exit(403)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /read/1", "GET /read/2"][m
[31m---- error_code eval[m
[31m-[302, 302][m
[31m---- response_body eval[m
[31m-[qr/302 Found/, qr/302 Found/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: explicit 307[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo", ngx.HTTP_TEMPORARY_REDIRECT);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo[m
[31m---- response_body_like: 307 Temporary Redirect[m
[31m---- error_code: 307[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: explicit 307 with args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo?a=b&c=d", ngx.HTTP_TEMPORARY_REDIRECT);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo?a=b&c=d[m
[31m---- response_body_like: 307 Temporary Redirect[m
[31m---- error_code: 307[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: explicit 307[m
[31m---- config[m
[31m-    location /read {[m
[31m-        content_by_lua '[m
[31m-            ngx.redirect("http://agentzh.org/foo?a=b&c=d", 307);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://agentzh.org/foo?a=b&c=d[m
[31m---- response_body_like: 307 Temporary Redirect[m
[31m---- error_code: 307[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/client-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/client-abort.t[m
[1mdeleted file mode 100644[m
[1mindex e970802..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/client-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,851 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: subrequest + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: subrequest + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: fail[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad things happen[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: subrequest + stop (proxy, ignore client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: subrequest + stop (proxy, check client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort off;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: need body on + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        lua_need_request_body on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.req.socket + receive() + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.req.socket + receive(N) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(5)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.req.socket + receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:lua check broken conn[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup|lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.req.socket + m * receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(1)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.req.socket + receiveuntil + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.req.socket + receiveuntil + it(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it(2)[m
[31m-            it(3)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: cosocket + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "failed to get socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("blpop nonexist 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.log(ngx.ERR, "about to receive")[m
[31m-[m
[31m-            local res, err = sock:receive()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to receive query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "res: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.req.socket + receive n < content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 100\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to receive: client aborted[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.req.socket + receive n == content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.sleep(1)[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.req.socket + receive n == content-length + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: exec to lua + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exec to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: exec (named location) to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location @t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/exec.t[m
[1mdeleted file mode 100644[m
[1mindex a063b5b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,379 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/hi");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty uri arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec();[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: too many args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec(1, 2, 3, 4);[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: null uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec(nil)[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/hi", "Yichun Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello Yichun Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: args in uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/hi?agentzh")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello agentzh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello a=Yichun&b=Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location @hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exec after location capture[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua_file 'html/test.lua';[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('/b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exec after (named) location capture[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location @b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('@b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (rewrite)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-        #local res = ngx.location.capture("/sub")[m
[31m-        #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (rewrite + named location)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location @p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (rewrite + post subrequest)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/blah")[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: rewrite_by_lua + ngx.exec + subrequest capture[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/test_loc");[m
[31m-            ngx.print("hello, ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /test_loc {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m-    location @proxy {[m
[31m-        #echo proxy;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo bah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: rewrite_by_lua_file + ngx.exec + subrequest capture[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/test_loc");[m
[31m-            ngx.print("hello, ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /test_loc {[m
[31m-        rewrite_by_lua_file html/jump.lua;[m
[31m-    }[m
[31m-    location @proxy {[m
[31m-        #echo proxy;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo bah;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> jump.lua[m
[31m-ngx.exec("@proxy")[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, bah[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/exit.t[m
[1mdeleted file mode 100644[m
[1mindex 9d292f7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,598 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#repeat_each(20000);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#log_level('debug');[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1024);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: throw 403[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.exit(403);ngx.say('hi')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: throw 404[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.exit(404);ngx.say('hi');";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 404[m
[31m---- response_body_like: 404 Not Found[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: throw 404 after sending the header and partial body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.say('hi');ngx.exit(404);ngx.say(', you')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_log[m
[31m-attempt to set status 404 via ngx.exit after sending out the response status 200[m
[31m---- response_body[m
[31m-hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: working with ngx_auth_request (succeeded)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        rewrite_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentzh[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Logged in[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: working with ngx_auth_request (failed)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        rewrite_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentz[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: working with ngx_auth_request (simplest form, w/o ngx_memc)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        rewrite_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m-print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m-print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    -- ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: working with ngx_auth_request (simplest form)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        rewrite_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: working with ngx_auth_request[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_b {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream_list memc_cluster memc_a memc_b;[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        rewrite_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: working with ngx_auth_request[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 300;[m
[31m-    }[m
[31m-[m
[31m-    #upstream_list memc_cluster memc_a memc_b;[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        #set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass memc_a;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uri-$query_string";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        set_quote_sql_str $seo_uri $query_string;[m
[31m-        drizzle_query "select url from my_url_map where seo_url=$seo_uri";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        rewrite_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /baz {[m
[31m-        set $my_uri $uri;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo_exec /jump $my_uri;[m
[31m-    }[m
[31m-[m
[31m-    location /jump {[m
[31m-        internal;[m
[31m-        rewrite ^ $query_string? redirect;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local seo_uri = ngx.var.my_uri[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-mysql?' .. seo_uri)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].url) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.my_uri = res[1].url;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /baz[m
[31m---- response_body_like: 302[m
[31m---- error_code: 302[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/foo/bar[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: throw 0[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.say('Hi'); ngx.eof(); ngx.exit(0);ngx.say('world')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: throw ngx.OK does *not* skip other rewrite phase handlers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.exit(ngx.OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by inlined code)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.exit(ngx.HTTP_OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by inlined code + partial output)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.say('hiya') ngx.exit(ngx.HTTP_OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/foo.lua;[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by file + partial output)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/foo.lua;[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.say("morning")[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-morning[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: error page with custom body[m
[31m---- config[m
[31m-    error_page 410 @err;[m
[31m-    location @err {[m
[31m-        echo blah blah;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.status = ngx.HTTP_GONE[m
[31m-            ngx.say("This is our own content")[m
[31m-            -- to cause quit the whole request rather than the current phase handler[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-        echo Hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-This is our own content[m
[31m---- error_code: 410[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exit with 204 (HTTP 1.1)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exit(204)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/blah;[m
[31m-    }[m
[31m-[m
[31m-    location = /blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers2[m
[31m---- stap2[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("send header\n")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- response_body[m
[31m---- error_code: 204[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: exit with 204 (HTTP 1.0)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exit(204)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/blah;[m
[31m-    }[m
[31m-[m
[31m-    location = /blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t HTTP/1.0[m
[31m---- more_headers2[m
[31m---- stap2[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("send header\n")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- response_body[m
[31m---- error_code: 204[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/mixed.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/mixed.t[m
[1mdeleted file mode 100644[m
[1mindex 1156567..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/mixed.t[m
[1m+++ /dev/null[m
[36m@@ -1,170 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rewrite I/O with content I/O[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("rewrite GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            print("rewrite PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("rewrite cached: " .. res.body);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("content PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content cached: " .. res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-content GET: 404[m
[31m-content PUT: 201[m
[31m-content cached: hello[m
[31m---- grep_error_log eval: qr/rewrite .+?(?= while )/[m
[31m---- grep_error_log_out[m
[31m-rewrite GET: 404[m
[31m-rewrite PUT: 201[m
[31m-rewrite cached: hello[m
[31m-[m
[31m---- log_level: info[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: share data via nginx variables[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.foo = 32[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say(tonumber(ngx.var.foo) * 2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-64[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: share the request body (need request body explicitly off)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        set $res '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: share the request body (need request body off by default)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        #lua_need_request_body off;[m
[31m-        set $res '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: share the request body (need request body on)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        set $res '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/multi-capture.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/multi-capture.t[m
[1mdeleted file mode 100644[m
[1mindex 44629b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/multi-capture.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(10);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/([a-d])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = c[m
[31m-res4.status = 200[m
[31m-res4.body = d[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: capture multi in series[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("2 res1.status = " .. res1.status)[m
[31m-            ngx.say("2 res1.body = " .. res1.body)[m
[31m-            ngx.say("2 res2.status = " .. res2.status)[m
[31m-            ngx.say("2 res2.body = " .. res2.body)[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-2 res1.status = 200[m
[31m-2 res1.body = a[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: capture multi in subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo?n=1")[m
[31m-            ngx.say("top res.status = " .. res.status)[m
[31m-            ngx.say("top res.body = [" .. res.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res.status = 200[m
[31m-top res.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: capture multi in parallel[m
[31m---- config[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("top res1.status = " .. res1.status)[m
[31m-            ngx.say("top res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("top res2.status = " .. res2.status)[m
[31m-            ngx.say("top res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([abcd])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res1.status = 200[m
[31m-top res1.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-top res2.status = 200[m
[31m-top res2.body = [2 res1.status = 200[m
[31m-2 res1.body = c[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = d[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: memc sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[ab]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: memc muti + multi[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-            print("args: " .. ngx.var.args)[m
[31m-            local n = ngx.var.arg_n[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[abcd]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = [1 res1.status = 201[m
[31m-1 res1.body = STORED\r[m
[31m-[m
[31m-1 res2.status = 201[m
[31m-1 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-res2.status = 200[m
[31m-res2.body = [2 res1.status = 201[m
[31m-2 res1.body = STORED\r[m
[31m-[m
[31m-2 res2.status = 201[m
[31m-2 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: memc 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[a-d]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-res3.status = 201[m
[31m-res3.body = STORED\r[m
[31m-[m
[31m-res4.status = 201[m
[31m-res4.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/on-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/on-abort.t[m
[1mdeleted file mode 100644[m
[1mindex aca2ab6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/on-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,657 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 15);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ignore the client abort event in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: abort in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.exit(499) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exit(408) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(408)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(-1) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(-1)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(0) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(0)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.log(ngx.ERR, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.7;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like eval[m
[31m-qr/^create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: fail[m
[31m-(?:lua check broken conn[m
[31m-)?terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-$/[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.6[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-'client prematurely closed connection',[m
[31m-'on abort called',[m
[31m-qr/lua user thread aborted: runtime error: rewrite_by_lua\(nginx\.conf:\d+\):4: attempt to abort with pending subrequests/,[m
[31m-'main handler done',[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: accessing cosocket in callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flushall\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive()[m
[31m-                if not res then[m
[31m-                    ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                ngx.log(ngx.NOTICE, "callback done: ", res)[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.5[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-callback done: +OK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ignore the client abort event in the user callback (no check)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("cannot set on_abort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- response_body[m
[31m-cannot set on_abort: lua_check_client_abort is off[m
[31m---- no_error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: regsiter on_abort callback but no client abortion[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ignore the client abort event in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abort in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: regsiter on_abort callback but no client abortion (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.5[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: regsiter on_abort callback multiple times[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("1: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("2: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-2: cannot set on_abort: duplicate call[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/redirect.t[m
[1mdeleted file mode 100644[m
[1mindex 8843f1a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,125 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 3;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo");[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: explicit 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", ngx.HTTP_MOVED_TEMPORARILY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: explicit 301[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", ngx.HTTP_MOVED_PERMANENTLY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad rc[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", 404);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: no args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect()[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: relative uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.redirect("/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like: Location: /foo\r\n[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/req-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/req-body.t[m
[1mdeleted file mode 100644[m
[1mindex 2f42e0a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/req-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,224 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 5);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read buffered body[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read buffered body (timed out)[m
[31m---- config[m
[31m-    client_body_timeout 1ms;[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /test HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 100\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-hello, world"[m
[31m---- response_body:[m
[31m---- error_code_like: ^(?:500)?$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read buffered body and then subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: first subrequest and then read buffered body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: failed to write 100 continue[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-http finalize request: 500, "/test?" a:1, c:0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: not discard body (exit 200)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not discard body (exit 201)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: not discard body (exit 302)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            -- ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.redirect("/blah")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-[qr/302 Found/,[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[302, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/req-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/req-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 34aedaa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/req-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,535 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-received: hello[m
[31m-received:  worl[m
[31m-failed to receive: closed [d][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multipart rfc sample (just partial streaming)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local boundary[m
[31m-            local header = ngx.var.http_content_type[m
[31m-            local m = ngx.re.match(header, [[; +boundary=(?:"(.*?)"|(\\w+))]], "jo")[m
[31m-            if m then[m
[31m-                boundary = m[1] or m[2][m
[31m-[m
[31m-            else[m
[31m-                ngx.say("invalid content-type header")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local read_to_boundary = sock:receiveuntil("\\r\\n--" .. boundary)[m
[31m-            local read_line = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-            local data, err, part = read_to_boundary()[m
[31m-            if data then[m
[31m-                ngx.say("preamble: [" .. data .. "]")[m
[31m-            else[m
[31m-                ngx.say("failed to read the first boundary: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local i = 1[m
[31m-            while true do[m
[31m-                local line, err = read_line()[m
[31m-[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to read post-boundary line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                m = ngx.re.match(line, "--$", "jo")[m
[31m-                if m then[m
[31m-                    ngx.say("found the end of the stream")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = read_line()[m
[31m-                    if not line then[m
[31m-                        ngx.say("failed to read part ", i, " header: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if line == "" then[m
[31m-                        -- the header part completes[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("part ", i, " header: [", line, "]")[m
[31m-                end[m
[31m-[m
[31m-                local data, err, part = read_to_boundary()[m
[31m-                if data then[m
[31m-                    ngx.say("part ", i, " body: [" .. data .. "]")[m
[31m-                else[m
[31m-                    ngx.say("failed to read part ", i + 1, " boundary: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.\r[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-"[m
[31m---- more_headers[m
[31m-Content-Type: multipart/mixed; boundary="simple boundary"[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-preamble: [This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.][m
[31m-part 1 body: [This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.][m
[31m-part 2 header: [Content-type: text/plain; charset=us-ascii][m
[31m-part 2 body: [This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-][m
[31m-found the end of the stream[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multipart rfc sample (completely streaming)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local boundary[m
[31m-            local header = ngx.var.http_content_type[m
[31m-            local m = ngx.re.match(header, [[; +boundary=(?:"(.*?)"|(\\w+))]], "jo")[m
[31m-            if m then[m
[31m-                boundary = m[1] or m[2][m
[31m-[m
[31m-            else[m
[31m-                ngx.say("invalid content-type header")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local read_to_boundary = sock:receiveuntil("\\r\\n--" .. boundary)[m
[31m-            local read_line = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-            local preamble = ""[m
[31m-            while true do[m
[31m-                local data, err, part = read_to_boundary(1)[m
[31m-                if data then[m
[31m-                    preamble = preamble .. data[m
[31m-[m
[31m-                elseif not err then[m
[31m-                    break[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read the first boundary: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("preamble: [" .. preamble .. "]")[m
[31m-[m
[31m-            local i = 1[m
[31m-            while true do[m
[31m-                local line, err = read_line(50)[m
[31m-[m
[31m-                if not line and err then[m
[31m-                    ngx.say("1: failed to read post-boundary line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if line then[m
[31m-                    local dummy[m
[31m-                    dummy, err = read_line(1)[m
[31m-                    if err then[m
[31m-                        ngx.say("2: failed to read post-boundary line: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if dummy then[m
[31m-                        ngx.say("bad post-boundary line: ", dummy)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    m = ngx.re.match(line, "--$", "jo")[m
[31m-                    if m then[m
[31m-                        ngx.say("found the end of the stream")[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = read_line(50)[m
[31m-                    if not line and err then[m
[31m-                        ngx.say("failed to read part ", i, " header: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if line then[m
[31m-                        local line, err = read_line(1)[m
[31m-                        if line or err then[m
[31m-                            ngx.say("error")[m
[31m-                            return[m
[31m-                        end[m
[31m-                    end[m
[31m-[m
[31m-                    if line == "" then[m
[31m-                        -- the header part completes[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("part ", i, " header: [", line, "]")[m
[31m-                end[m
[31m-[m
[31m-                local body = ""[m
[31m-[m
[31m-                while true do[m
[31m-                    local data, err, part = read_to_boundary(1)[m
[31m-                    if data then[m
[31m-                        body = body .. data[m
[31m-[m
[31m-                    elseif err then[m
[31m-                        ngx.say("failed to read part ", i + 1, " boundary: ", err)[m
[31m-                        return[m
[31m-[m
[31m-                    else[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("part ", i, " body: [" .. body .. "]")[m
[31m-[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.\r[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-"[m
[31m---- more_headers[m
[31m-Content-Type: multipart/mixed; boundary="simple boundary"[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-preamble: [This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.][m
[31m-part 1 body: [This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.][m
[31m-part 2 header: [Content-type: text/plain; charset=us-ascii][m
[31m-part 2 body: [This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-][m
[31m-found the end of the stream[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: attempt to use the req socket across request boundary[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock, err[m
[31m-[m
[31m-function go()[m
[31m-    if not sock then[m
[31m-        sock, err = ngx.req.socket()[m
[31m-        if sock then[m
[31m-            ngx.say("got the request socket")[m
[31m-        else[m
[31m-            ngx.say("failed to get the request socket: ", err)[m
[31m-        end[m
[31m-    else[m
[31m-        for i = 1, 3 do[m
[31m-            local data, err, part = sock:receive(5)[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body_like[m
[31m-(?:got the request socket[m
[31m-|failed to receive: closed [d][m
[31m-)?done[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: receive until on request_body - receiveuntil(1) on the last byte of the body[m
[31m-See https://groups.google.com/group/openresty/browse_thread/thread/43cf01da3c681aba for details[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-   local sock, err = ngx.req.socket()[m
[31m-   if sock then[m
[31m-      ngx.say("got the request socket")[m
[31m-   else[m
[31m-      ngx.say("failed to get the request socket: ", err)[m
[31m-      return[m
[31m-   end[m
[31m-[m
[31m-   local data, err, part = sock:receive(56)[m
[31m-   if data then[m
[31m-      ngx.say("received: ", data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-[m
[31m-   local discard_line = sock:receiveuntil('\r\n')[m
[31m-[m
[31m-   local data, err, part = discard_line(8192)[m
[31m-   if data then[m
[31m-      ngx.say("received len: ", #data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-[m
[31m-   local data, err, part = discard_line(1)[m
[31m-   if data then[m
[31m-      ngx.say("received: ", data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-end[m
[31m---- request[m
[31m-POST /t[m
[31m------------------------------820127721219505131303151179################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################$[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-received: -----------------------------820127721219505131303151179[m
[31m-received len: 8192[m
[31m-received: $[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: pipelined POST requests[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-   local sock, err = ngx.req.socket()[m
[31m-   if sock then[m
[31m-      ngx.say("got the request socket")[m
[31m-   else[m
[31m-      ngx.say("failed to get the request socket: ", err)[m
[31m-      return[m
[31m-   end[m
[31m-[m
[31m-   while true do[m
[31m-       local data, err, part = sock:receive(4)[m
[31m-       if data then[m
[31m-          ngx.say("received: ", data)[m
[31m-       else[m
[31m-          ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-          return[m
[31m-       end[m
[31m-   end[m
[31m-end[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello, world",[m
[31m-"POST /t[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["got the request socket[m
[31m-received: hell[m
[31m-received: o, w[m
[31m-received: orld[m
[31m-failed to receive: closed [][m
[31m-done[m
[31m-",[m
[31m-"got the request socket[m
[31m-received: hiya[m
[31m-received: , wo[m
[31m-failed to receive: closed [rld][m
[31m-done[m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: Expect & 100 Continue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- error_code: 100[m
[31m---- response_body_like chomp[m
[31m-\breceived: hello\b.*?\breceived:  worl\b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/request_body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/request_body.t[m
[1mdeleted file mode 100644[m
[1mindex 665d6de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/request_body.t[m
[1m+++ /dev/null[m
[36m@@ -1,173 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('debug'); # to ensure any log-level can be outputed[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test not reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test default setting (not reading request body)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: test main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test override main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test override server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: Expect: 100-Continue[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo_body[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-http finalize request: 500, "/echo_body?" a:1, c:2[m
[31m-http finalize request: 500, "/echo_body?" a:1, c:0[m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 20b00e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,802 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#no_nginx_manager();[m
[31m-#log_level('warn');[m
[31m-#master_on();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 12);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        rewrite_by_lua 'ngx.print("Hello, Lua!\\n")';[m
[31m-        content_by_lua return;[m
[31m-        #content_by_lua 'ngx.say("Hi")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic say[m
[31m---- config[m
[31m-    location /say {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say("Hello, Lua!")[m
[31m-            ngx.say("Yay! ", 123)';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /say[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-Yay! 123[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no ngx.echo[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.echo("Hello, Lua!\\n")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: variable[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        rewrite_by_lua 'v = ngx.var["request_uri"] ngx.print("request_uri: ", v, "\\n")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variable (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/test.lua;[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: calc expression[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/calc.lua;[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> calc.lua[m
[31m-local function uri_unescape(uri)[m
[31m-    local function convert(hex)[m
[31m-        return string.char(tonumber("0x"..hex))[m
[31m-    end[m
[31m-    local s = string.gsub(uri, "%%([0-9a-fA-F][0-9a-fA-F])", convert)[m
[31m-    return s[m
[31m-end[m
[31m-[m
[31m-local function eval_exp(str)[m
[31m-    return loadstring("return "..str)()[m
[31m-end[m
[31m-[m
[31m-local exp_str = ngx.var["arg_exp"][m
[31m--- print("exp: '", exp_str, "'\n")[m
[31m-local status, res[m
[31m-status, res = pcall(uri_unescape, exp_str)[m
[31m-if not status then[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-    return[m
[31m-end[m
[31m-status, res = pcall(eval_exp, res)[m
[31m-if status then[m
[31m-    ngx.print("result: ", res, "\n")[m
[31m-else[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua?exp=1%2B2*math.sin(3)%2Fmath.exp(4)-math.sqrt(2)[m
[31m---- response_body[m
[31m-result: -0.4090441561579[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read $arg_xxx[m
[31m---- config[m
[31m-    location = /lua {[m
[31m-        rewrite_by_lua 'who = ngx.var.arg_who[m
[31m-            ngx.print("Hello, ", who, "!")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?who=agentzh[m
[31m---- response_body chomp[m
[31m-Hello, agentzh![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: capture location[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-res = ngx.location.capture("/other")[m
[31m-ngx.print("status=", res.status, " ")[m
[31m-ngx.print("body=", res.body)[m
[31m-';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-status=200 body=hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: capture non-existed location[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'res = ngx.location.capture("/other"); ngx.print("status=", res.status)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body: status=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: invalid capture location (not as expected...)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'res = ngx.location.capture("*(#*"); ngx.say("res=", res.status)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-res=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nil is "nil"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.say(nil)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: write boolean[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.say(true, " ", false)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-true false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: bad argument type to ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.location.capture(nil)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: capture location (default 0);[m
[31m---- config[m
[31m- location /recur {[m
[31m-       rewrite_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body, "\\n");[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-[m
[31m-           content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur[m
[31m---- response_body[m
[31m-num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: capture location[m
[31m---- config[m
[31m- location /recur {[m
[31m-       rewrite_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body);[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-[m
[31m-           content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur?num=3[m
[31m---- response_body[m
[31m-num is: 3[m
[31m-status=200 body=num is: 2[m
[31m-status=200 body=num is: 1[m
[31m-status=200 body=num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: setting nginx variables from within Lua[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a "";[m
[31m-       rewrite_by_lua 'ngx.var.a = 32; ngx.say(ngx.var.a)';[m
[31m-       content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-       add_header Foo $a;[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_headers[m
[31m-Foo: 32[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: nginx quote sql string 1[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a 'hello\n\r\'"\\'; # this runs after rewrite_by_lua[m
[31m-       rewrite_by_lua 'ngx.say(ngx.quote_sql_str(ngx.var.a))';[m
[31m-       content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: nginx quote sql string 2[m
[31m---- config[m
[31m-location /set {[m
[31m-    #set $a "hello\n\r'\"\\";[m
[31m-    rewrite_by_lua 'ngx.say(ngx.quote_sql_str("hello\\n\\r\'\\"\\\\"))';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: use dollar[m
[31m---- config[m
[31m-location /set {[m
[31m-    rewrite_by_lua '[m
[31m-        local s = "hello 112";[m
[31m-        ngx.say(string.find(s, "%d+$"))';[m
[31m-[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-79[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: subrequests do not share variables of main requests by default[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a 12;[m
[31m-    rewrite_by_lua 'res = ngx.location.capture("/sub"); ngx.print(res.body)';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: subrequests can share variables of main requests[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a '';[m
[31m-    rewrite_by_lua '[m
[31m-        ngx.var.a = 12;[m
[31m-        res = ngx.location.capture([m
[31m-            "/sub",[m
[31m-            { share_all_vars = true }[m
[31m-        );[m
[31m-        ngx.print(res.body)[m
[31m-    ';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: main requests use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-}[m
[31m-location /parent {[m
[31m-    rewrite_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = true });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: main requests do NOT use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-    content_by_lua return;[m
[31m-}[m
[31m-[m
[31m-location /parent {[m
[31m-    rewrite_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = false });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-    content_by_lua return;[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body_like eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"]);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: Bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-            ngx.header.Bar = nil;[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"] or "nil");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: rewrite_by_lua runs before ngx_access[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        deny all;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: rewrite_by_lua shouldn't send headers automatically (on simple return)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'return';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        default_type 'text/css';[m
[31m-        add_header Bar Baz;[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-Bar: Baz[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: rewrite_by_lua shouldn't send headers automatically (on simple exit)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua 'ngx.exit(ngx.OK)';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        default_type 'text/css';[m
[31m-        add_header Bar Baz;[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-Bar: Baz[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: short circuit[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say("Hi")[m
[31m-            ngx.eof()[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            print("HERE")[m
[31m-            ngx.print("BAD")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: nginx vars in script path[m
[31m---- config[m
[31m-    location ~ /lua/(.+)$ {[m
[31m-        rewrite_by_lua_file html/$1.lua;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            print("HERE")[m
[31m-            ngx.print("BAD")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> hi.lua[m
[31m-ngx.say("Hi")[m
[31m-ngx.eof()[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua/hi[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: phase postponing works for various locations[m
[31m---- config[m
[31m-    location ~ '^/lua/(.+)' {[m
[31m-        set $path $1;[m
[31m-        rewrite_by_lua 'ngx.say(ngx.var.path)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/lua2/(.+)' {[m
[31m-        set $path $1;[m
[31m-        rewrite_by_lua 'ngx.say(ngx.var.path)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua/foo;[m
[31m-        echo_location /lua/bar;[m
[31m-        echo_location /lua2/baz;[m
[31m-        echo_location /lua2/bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-foo[m
[31m-bar[m
[31m-baz[m
[31m-bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: server rewrite_by_lua[m
[31m---- config[m
[31m-    rewrite_by_lua 'ngx.header["X-Foo"] = "bar" -- ngx.send_headers()';[m
[31m---- request[m
[31m-GET /[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m---- response_headers[m
[31m-X-Foo: bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: server rewrite_by_lua_file[m
[31m---- config[m
[31m-    rewrite_by_lua_file html/foo.lua;[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header["X-Foo"] = "bar" -- ngx.send_headers()[m
[31m---- request[m
[31m-GET /[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m---- response_headers[m
[31m-X-Foo: bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: rewrite last before rewrite_by_lua[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite ^/main/xyz\.html$ /abc.html last;[m
[31m-        rewrite_by_lua 'ngx.exit(503)';[m
[31m-    }[m
[31m-    location ~ /abc.html {[m
[31m-        echo abc;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main/xyz.html[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: rewrite last before rewrite_by_lua_file[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite ^/main/xyz\.html$ /abc.html last;[m
[31m-        rewrite_by_lua_file html/exit.lua;[m
[31m-    }[m
[31m-    location ~ /abc.html {[m
[31m-        echo abc;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> exit.lua[m
[31m-ngx.exit(503)[m
[31m---- request[m
[31m-    GET /main/xyz.html[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: rewrite before rewrite_by_lua[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite ^/main/xyz\.html$ /abc.html;[m
[31m-        rewrite_by_lua 'ngx.exit(503)';[m
[31m-    }[m
[31m-    location ~ /abc.html {[m
[31m-        echo abc;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main/xyz.html[m
[31m---- response_body[m
[31m-abc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: rewrite break before rewrite_by_lua[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite ^/main/xyz\.html$ /abc.html break;[m
[31m-        rewrite_by_lua 'ngx.exit(503)';[m
[31m-    }[m
[31m-    location ~ /abc.html {[m
[31m-        echo abc;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main/xyz.html[m
[31m---- response_body_like: 503 Service Temporarily Unavailable[m
[31m---- error_code: 503[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?\btest2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: use of ngx.say() in rewrite_by_lua without exiting with 200+.[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua "ngx.say('test')";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: use of ngx.say() in rewrite_by_lua without exiting with 200+. (with explicit ngx.eof())[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua "ngx.say('test') ngx.eof()";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: use of ngx.say() in rewrite_by_lua without exiting with 200+. (with IO)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua "ngx.say('test') ngx.sleep(0.001)";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/sleep.t[m
[1mdeleted file mode 100644[m
[1mindex 1719784..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,222 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 33;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep 0.5[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep(0.5)[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-9]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep ag[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep("a")[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep 0.5 in subrequest[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            local now = ngx.now()[m
[31m-            local delay = now - before[m
[31m-            ngx.say(delay)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        rewrite_by_lua 'ngx.sleep(0.5) ngx.exit(200)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-9]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/sleep?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sleep a in subrequest with bad argument[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/sleep");[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        rewrite_by_lua 'ngx.sleep("a") ngx.exit(200)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-500[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sleep 0.5 - multi-times[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local start = ngx.now()[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say(ngx.now() - start)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:8[5-9]\d*|9[0-9]\d*|9)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: sleep 0.5 - interleaved by ngx.say() - ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(1)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m---- error_log[m
[31m-lua ready to sleep[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sleep 0.5 - interleaved by ngx.say() - not ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(0.5)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m-hiya[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.location.capture before and after ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /hello {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m-    location = /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/socket-keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/socket-keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex 50de0b3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/socket-keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,1010 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 4);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-#$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-$ENV{LUA_PATH} ||=[m
[31m-    '/usr/local/openresty-debug/lualib/?.lua;/usr/local/openresty/lualib/?.lua;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^connected: 1, reused: \d+[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-connected: 1, reused: [1-9]\d*[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- grep_error_log eval[m
[31m-qr/lua tcp socket get keepalive peer: using connection|lua tcp socket keepalive create connection pool for key "[^"]+"/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-qq{lua tcp socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-},[m
[31m-"lua tcp socket get keepalive peer: using connection[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: free up the whole connection pool if no active connections[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port, true)[m
[31m-            test.go(port, false)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, keepalive)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    if keepalive then[m
[31m-        local ok, err = sock:setkeepalive()[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to set reusable: ", err)[m
[31m-        end[m
[31m-[m
[31m-    else[m
[31m-        sock:close()[m
[31m-    end[m
[31m-end[m
[31m---- response_body_like[m
[31m-^connected: 1, reused: \d+[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-connected: 1, reused: [1-9]\d*[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket get keepalive peer: using connection",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: upstream sockets close prematurely[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   keepalive_timeout 100ms;[m
[31m-   location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, err = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: http keepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-        keepalive_timeout 60s;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, err = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive close handler: fd:",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: lua_socket_keepalive_timeout[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 100 ms",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_socket_pool_size[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-       lua_socket_pool_size 1;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 100 ms",[m
[31m-qr/lua tcp socket connection pool size: 1\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: "lua_socket_keepalive_timeout 0" means unlimited[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 0;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval[m
[31m-qr/lua tcp socket keepalive timeout: unlimited|lua tcp socket connection pool size: \d+/[m
[31m---- grep_error_log_out eval[m
[31m-["lua tcp socket connection pool size: 30[m
[31m-lua tcp socket keepalive timeout: unlimited[m
[31m-",[m
[31m-"lua tcp socket keepalive timeout: unlimited[m
[31m-"][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: setkeepalive(timeout) overrides lua_socket_keepalive_timeout[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-        keepalive_timeout 60s;[m
[31m-        lua_socket_keepalive_timeout 60s;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(123)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 123 ms",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sock:setkeepalive(timeout, size) overrides lua_socket_pool_size[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-       lua_socket_pool_size 100;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(101, 25)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 101 ms",[m
[31m-qr/lua tcp socket connection pool size: 25\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sock:keepalive_timeout(0) means unlimited[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 1000ms;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(0)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval[m
[31m-qr/lua tcp socket keepalive timeout: unlimited|lua tcp socket connection pool size: \d+/[m
[31m---- grep_error_log_out eval[m
[31m-["lua tcp socket connection pool size: 30[m
[31m-lua tcp socket keepalive timeout: unlimited[m
[31m-",[m
[31m-"lua tcp socket keepalive timeout: unlimited[m
[31m-"[m
[31m-][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: sanity (uds)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen unix:$::HtmlDir/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            echo foo;[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local path = "$TEST_NGINX_HTML_DIR/nginx.sock";[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(path, port)[m
[31m-            test.go(path, port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(path, port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("unix:" .. path)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "GET /foo HTTP/1.1\r\nHost: localhost\r\nConnection: keepalive\r\n\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local reader = sock:receiveuntil("\r\n0\r\n\r\n")[m
[31m-    local data, err = reader()[m
[31m-[m
[31m-    if not data then[m
[31m-        ngx.say("failed to receive response body: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- response_body_like[m
[31m-^connected: 1, reused: \d+[m
[31m-request sent: 61[m
[31m-received response of 119 bytes[m
[31m-connected: 1, reused: [1-9]\d*[m
[31m-request sent: 61[m
[31m-received response of 119 bytes[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- grep_error_log eval[m
[31m-qr/lua tcp socket get keepalive peer: using connection|lua tcp socket keepalive create connection pool for key "unix:/[m
[31m---- grep_error_log_out eval[m
[31m-[qq{lua tcp socket keepalive create connection pool for key "unix:[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-},[m
[31m-"lua tcp socket get keepalive peer: using connection[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #108: ngx.locaiton.capture + redis.set_keepalive[m
[31m---- http_config eval[m
[31m-    qq{[m
[31m-        lua_package_path "$::HtmlDir/?.lua;;";[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        default_type text/html;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #lua_code_cache off;[m
[31m-        lua_need_request_body on;[m
[31m-        rewrite_by_lua_file html/t.lua;[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /anyurl {[m
[31m-        internal;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/dummy;[m
[31m-    }[m
[31m-[m
[31m-    location = /dummy {[m
[31m-        echo dummy;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> t.lua[m
[31m-local sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)[m
[31m-if not sock then ngx.say(err) return end[m
[31m-sock:send("flush_all\r\n")[m
[31m-sock:receive()[m
[31m-sock:setkeepalive()[m
[31m-[m
[31m-sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)[m
[31m-if not sock then ngx.say(err) return end[m
[31m-local res = ngx.location.capture("/anyurl") --3[m
[31m-[m
[31m-ngx.say("ok")[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #110: ngx.exit with HTTP_NOT_FOUND causes worker process to exit[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    error_page 404 /404.html;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        access_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 404.html[m
[31m-Not found, dear...[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.log(ngx.ERR, "failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if not line then[m
[31m-        ngx.log(ngx.ERR, "failed to receive a line: ", err, " [", part, "]")[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    -- local ok, err = sock:setkeepalive()[m
[31m-    -- if not ok then[m
[31m-        -- ngx.log(ngx.ERR, "failed to set reusable: ", err)[m
[31m-        -- return[m
[31m-    -- end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Not found, dear...[m
[31m---- error_code: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 3c206a8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,642 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: DELETE[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: DELETE (proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: POST (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-POST[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: HEAD[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_HEAD });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: explicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: implicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: implicit GET (empty option table)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo", {})[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: PUT (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-        #echo "[$http_content_length]";[m
[31m-        echo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo $echo_request_method;[m
[31m-        echo -n "[$http_content_length]";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-            ngx.say(res.body)[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-PUT[m
[31m-hello[m
[31m-GET[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: POST (with body, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-POST[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd "";[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/flush",[m
[31m-                { share_all_vars = true });[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { share_all_vars = true });[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello", share_all_vars = true });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc", { share_all_vars = true });[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: emtpy args option table[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = {} })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: non-empty args option table (1 pair)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-fo%3D=%3D%3E[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: non-empty args option table (2 pairs)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>",[m
[31m-                    ["="] = ":" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:fo%3D=%3D%3E\&%3D=%3A|%3D=%3A\&fo%3D=%3D%3E)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: non-empty args option table (2 pairs, no special chars)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { foo = 3,[m
[31m-                    bar = "hello" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:bar=hello\&foo=3|foo=3\&bar=hello)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: non-empty args option table (number key)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { [57] = "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: non-empty args option table (plain arrays)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = { b = 4 } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = "b=4" })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: more args[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        set $memc_cmd get;[m
[31m-        set $memc_key $arg_key;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc_set {[m
[31m-        #set $memc_cmd set;[m
[31m-        #set $memc_key $arg_key;[m
[31m-        #memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        echo OK;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            print("HELLO")[m
[31m-            local memc_key = "hello"[m
[31m-            local res = ngx.location.capture("/memc?key=" .. memc_key )[m
[31m-            ngx.say("copass: res " .. res.status)[m
[31m-[m
[31m-            if res.status == 404 then[m
[31m-                   ngx.say("copas: capture /memc_set")[m
[31m-                   res = ngx.location.capture("/memc_set?key=" .. memc_key)[m
[31m-                   ngx.say("copss: status " .. res.status);[m
[31m-            end[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-        #echo Hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-copass: res 404[m
[31m-copas: capture /memc_set[m
[31m-copss: status 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: I/O in named location[m
[31m-the nginx core requires the patch https://github.com/agentzh/ngx_openresty/blob/master/patches/nginx-1.0.15-reset_wev_handler_in_named_locations.patch[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_exec @named;[m
[31m-    }[m
[31m-[m
[31m-    location @named {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/hello")[m
[31m-        ';[m
[31m-        echo done;[m
[31m-    }[m
[31m-[m
[31m-    location /hello {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/tcp-socket-timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/tcp-socket-timeout.t[m
[1mdeleted file mode 100644[m
[1mindex 79cd0b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/tcp-socket-timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,615 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'get helloworld';[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 14);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-no_long_string();[m
[31m-no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: lua_socket_connect_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t1 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t1[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 100[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sock:settimeout() overrides lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 60s;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t2 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(150)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t2[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 150[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sock:settimeout(nil) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    #resolver_timeout 3s;[m
[31m-    location /t3 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(nil)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t3[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sock:settimeout(0) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t4 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(0)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t4[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sock:settimeout(-1) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t5 {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(-1)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t5[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_socket_read_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sock:settimeout() overrides lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 60s;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(150)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 150[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sock:settimeout(nil) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(nil)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sock:settimeout(0) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(0)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sock:settimeout(-1) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(-1)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: lua_socket_send_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: sock:settimeout() overrides lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 60s;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(150)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 150[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: sock:settimeout(nil) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(nil)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: sock:settimeout(0) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(0)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: sock:settimeout(-1) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(-1)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/tcp-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/tcp-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 9b39ba1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/tcp-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,2393 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 107;[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no trailing newline[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 1234;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            sock:close()[m
[31m-            ngx.say("closed")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.print("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 3[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-failed to receive a line: closed [foo][m
[31m-closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no resolver defined[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 1234;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: no resolver defined to resolve "agentzh.org"[m
[31m-connected: nil[m
[31m-failed to send request: closed[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: with resolver[m
[31m---- timeout: 10[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("first line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive the first line: ", err)[m
[31m-            end[m
[31m-[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("second line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive the second line: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 56[m
[31m-first line received: HTTP/1.1 200 OK[m
[31m-second line received: Server: openresty[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: connection refused (tcp)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil connection refused[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: connection timeout (tcp)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil timeout[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not closed manually[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: resolver error (host not found)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)[m
[31m-            print("connected: ", ok, " ", err, " ", not ok)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(3: Host not found\))?[m
[31m-connected: nil[m
[31m-failed to send request: closed$[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: resolver error (timeout)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver 8.8.8.8;[m
[31m-    resolver_timeout 1ms;[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)[m
[31m-            print("connected: ", ok, " ", err, " ", not ok)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(\d+: Operation timed out\))?[m
[31m-connected: nil[m
[31m-failed to send request: closed$[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: explicit *l pattern for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err = sock:receive("*l")[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: *a pattern for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err = sock:receive("*a")[m
[31m-            if data then[m
[31m-                ngx.say("receive: ", data)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-receive: HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-foo[m
[31m-[m
[31m-err: nil[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: mixing *a and *l patterns for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive("*l")[m
[31m-            if line then[m
[31m-                ngx.say("receive: ", line)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local data[m
[31m-            data, err = sock:receive("*a")[m
[31m-            if data then[m
[31m-                ngx.say("receive: ", data)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-receive: HTTP/1.1 200 OK[m
[31m-err: nil[m
[31m-receive: Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-foo[m
[31m-[m
[31m-err: nil[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: receive by chunks[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(10)[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: receive by chunks (very small buffer)[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(10)[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: line reading (very small buffer)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.socket.connect (working)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-            local sock, err = ngx.socket.connect("127.0.0.1", port)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected.")[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected.[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.socket.connect() shortcut (connection refused)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local sock, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-failed to connect: connection refused[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: receive by chunks (stringified size)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive("10")[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: cannot survive across request boundary (send)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-"^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to send request: closed)\$"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: cannot survive across request boundary (receive)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local line, err, part = sock:receive()[m
[31m-        if line then[m
[31m-            ngx.say("received: ", line)[m
[31m-[m
[31m-        else[m
[31m-            ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to receive a line: closed \[nil\])$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: cannot survive across request boundary (close)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local ok, err = sock:close()[m
[31m-        if ok then[m
[31m-            ngx.say("successfully closed")[m
[31m-[m
[31m-        else[m
[31m-            ngx.say("failed to close: ", err)[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to close: closed)$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: cannot survive across request boundary (connect)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect again: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected again: ", ok)[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected(?: again)?: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-){2}$/[m
[31m---- error_log[m
[31m-lua reuse socket upstream ctx[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: connect again immediately[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected again: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-connected again: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua reuse socket upstream", "lua tcp socket reconnect without shutting down"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: two sockets mix together[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port1 $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        set $port2 $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock1 = ngx.socket.tcp()[m
[31m-            local sock2 = ngx.socket.tcp()[m
[31m-[m
[31m-            local port1 = ngx.var.port1[m
[31m-            local port2 = ngx.var.port2[m
[31m-[m
[31m-            local ok, err = sock1:connect("127.0.0.1", port1)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock2:connect("127.0.0.1", port2)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: connected: ", ok)[m
[31m-[m
[31m-            local req1 = "flush_all\\r\\n"[m
[31m-            local bytes, err = sock1:send(req1)[m
[31m-            if not bytes then[m
[31m-                ngx.say("1: failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("1: request sent: ", bytes)[m
[31m-[m
[31m-            local req2 = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            local bytes, err = sock2:send(req2)[m
[31m-            if not bytes then[m
[31m-                ngx.say("2: failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("2: request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock1:receive()[m
[31m-            if line then[m
[31m-                ngx.say("1: received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("1: failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            line, err, part = sock2:receive()[m
[31m-            if line then[m
[31m-                ngx.say("2: received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("2: failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock1:close()[m
[31m-            ngx.say("1: close: ", ok, " ", err)[m
[31m-[m
[31m-            ok, err = sock2:close()[m
[31m-            ngx.say("2: close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: connected: 1[m
[31m-2: connected: 1[m
[31m-1: request sent: 11[m
[31m-2: request sent: 57[m
[31m-1: received: OK[m
[31m-2: received: HTTP/1.1 200 OK[m
[31m-1: close: 1 nil[m
[31m-2: close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: send tables of string fragments[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: send tables of string fragments (bad type "nil")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", nil, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type nil found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: send tables of string fragments (bad type "boolean")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", true, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type boolean found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: send tables of string fragments (bad type ngx.null)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", ngx.null, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type userdata found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: cosocket before location capture (tcpsock:send did not clear u->waiting)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-            local resp = ngx.location.capture("/memc")[m
[31m-            if type(resp) ~= "table" then[m
[31m-                ngx.say("bad resp: type ", type(resp), ": ", resp)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.print("subrequest: ", resp.status, ", ", resp.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m-subrequest: 200, OK\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: CR in a line[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo\\r\\rbar\\rbaz")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 13[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foobarbaz[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: receive(0)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err, part = sock:receive(0)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive(0): ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("receive(0): [", data, "]")[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-receive(0): [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: send("")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local bytes, err = sock:send("")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("send(\\"\\"): ", bytes)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-send(""): 0[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: bad request tries to connect[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                test.new_sock()[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            else[m
[31m-                ngx.say("connected")[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):7: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: bad request tries to receive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:receive()[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: bad request tries to send[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:send("a")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: bad request tries to close[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: bad request tries to set keepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:setkeepalive()[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: bad request tries to receiveuntil[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        rewrite_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            local it, err = sock:receiveuntil("abc")[m
[31m-            if it then[m
[31m-                it()[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: rewrite_by_lua\(nginx\.conf:\d+\):16: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/unix-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/unix-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 098dd67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/unix-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,153 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: connection refused (unix domain socket)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("unix:/tmp/nosuchfile.sock")[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil no such file or directory[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log eval[m
[31m-qr{\[crit\] .*? connect\(\) to unix:/tmp/nosuchfile\.sock failed}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: invalid host argument[m
[31m---- http_server[m
[31m-    server {[m
[31m-        listen /tmp/test-nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            content_by_lua 'ngx.say("foo")';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("/tmp/test-nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-failed to connect: failed to parse host name "/tmp/test-nginx.sock": invalid host[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            content_by_lua 'ngx.say("foo")';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                print("calling receive")[m
[31m-                local line, err = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-exec.t[m
[1mdeleted file mode 100644[m
[1mindex 2bea7e7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,345 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exec in user thread (entry still pending)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exec in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exec in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exec in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exec in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-exit.t[m
[1mdeleted file mode 100644[m
[1mindex 266d5ab..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,1331 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exit in user thread (entry thread is still pending to run)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-                ngx.say("g")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m-f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exit in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("exiting the user thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-exiting the user thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.tcp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_resolve_start) {[m
[31m-    println("resolver started")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_socket_resolve_handler) {[m
[31m-    println("resolver done")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_tcp_resolve_cleanup) {[m
[31m-    println("lua tcp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolver started[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.udp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        #resolver 127.0.0.1;[m
[31m-        resolver_timeout 12s;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_resolve_start) {[m
[31m-    println("resolver started")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_socket_resolve_handler) {[m
[31m-    println("resolver done")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_resolve_cleanup) {[m
[31m-    println("lua udp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolver started[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: exit in user thread (entry thread is still pending on tcpsock:connect)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(12000)[m
[31m-            local ok, err = sock:connect("106.187.41.147", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: exit in user thread (entry thread is still pending on tcpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: exit in user thread (entry thread is still pending on tcpsock:receiveuntil's iterator)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local it, err = sock:receiveuntil("\\r\\n")[m
[31m-            if not it then[m
[31m-                ngx.say("failed to receive until: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = it()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exit in user thread (entry thread is still pending on udpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_socket_cleanup) {[m
[31m-    println("lua udp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exit in user thread (entry thread is still pending on reqsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.req.socket()[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive(1024)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exit in user thread (entry thread is still pending on ngx.req.read_body)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_req_body_cleanup) {[m
[31m-    println("lua req body cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req body cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exit in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: exit in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: exit in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-redirect.t[m
[1mdeleted file mode 100644[m
[1mindex 0f125e0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,189 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.redirect() in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: redirect in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-spawn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-spawn.t[m
[1mdeleted file mode 100644[m
[1mindex 58af7d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/023-rewrite/uthread-spawn.t[m
[1m+++ /dev/null[m
[36m@@ -1,1452 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple user thread without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval[m
[31m-<<'_EOC_' . $::StapScript;[m
[31m-[m
[31m-F(ngx_http_lua_send_chain_link) {[m
[31m-    printf("send link %p\n", $in)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    println("core content phase")[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: two simple user threads without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("in thread 1")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("in thread 2")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before 1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after 1")[m
[31m-[m
[31m-            ngx.say("before 2")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after 2")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before 1[m
[31m-in thread 1[m
[31m-after 1[m
[31m-before 2[m
[31m-in thread 2[m
[31m-after 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple user thread with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before sleep[m
[31m-after thread create[m
[31m-after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: two simple user threads with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("1: before sleep")[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("1: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("2: before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("2: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("1: after thread create")[m
[31m-[m
[31m-            ngx.say("2: before thread create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("2: after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-1: before thread create[m
[31m-1: before sleep[m
[31m-1: after thread create[m
[31m-2: before thread create[m
[31m-2: before sleep[m
[31m-2: after thread create[m
[31m-2: after sleep[m
[31m-1: after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: error in user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.blah()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-after[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: rewrite_by_lua\(nginx\.conf:\d+\):3: attempt to call field 'blah' \(a nil value\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple user threads doing a single subrequest (entry quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple user threads doing a single subrequest (entry also does a subrequest and quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-capture: hello bar[m
[31m-after capture: hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple user threads doing a single subrequest (entry also does a subrequest and quits late)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello foo[m
[31m-capture: hello bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: two simple user threads doing single subrequests (entry also does a subrequest and quits between)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("f: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("f: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("g: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?bah")[m
[31m-                ngx.say("g: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread 1 create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread 1 create")[m
[31m-[m
[31m-            ngx.say("before thread 2 create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after thread 2 create")[m
[31m-[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bah {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n hello bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before thread 1 create[m
[31m-f: before capture[m
[31m-after thread 1 create[m
[31m-before thread 2 create[m
[31m-g: before capture[m
[31m-after thread 2 create[m
[31m-f: after capture: hello foo[m
[31m-capture: hello bar[m
[31m-g: after capture: hello bah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nested user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after f[m
[31m-after g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nested user threads (with I/O)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-after f[m
[31m-after g[m
[31m-hello in g()[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: coroutine status of a running user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: running[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: coroutine status of a dead user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-status: zombie[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: coroutine status of a "normal" user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                local co2 = coroutine.create(g)[m
[31m-                coroutine.resume(co2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: normal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: creating user threads in a user coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after g[m
[31m-after f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: manual time slicing between a user thread and the entry thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            local self = coroutine.running()[m
[31m-            ngx.say("0")[m
[31m-            yield(self)[m
[31m-            ngx.say("1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("2")[m
[31m-            yield(self)[m
[31m-            ngx.say("3")[m
[31m-            yield(self)[m
[31m-            ngx.say("4")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-0[m
[31m-1[m
[31m-f 1[m
[31m-2[m
[31m-f 2[m
[31m-3[m
[31m-f 3[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: manual time slicing between two user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("g 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 3")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-f 2[m
[31m-done[m
[31m-g 2[m
[31m-f 3[m
[31m-g 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entry thread and a user thread flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                coroutine.yield(coroutine.running)[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.flush(true)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: two user threads flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello from g")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- response_body[m
[31m-hello from f[m
[31m-hello from g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: user threads + ngx.socket.tcp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flush_all\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: user threads + ngx.socket.udp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.udp()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", 12345)[m
[31m-                local bytes, err = sock:send("blah")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- udp_listen: 12345[m
[31m---- udp_query: blah[m
[31m---- udp_reply: hello udp[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-after[m
[31m-received: hello udp[m
[31m-|before[m
[31m-received: hello udp[m
[31m-after)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: simple user thread with ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.req.read_body()[m
[31m-                local body = ngx.req.get_body_data()[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: simple user thread with ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.req.socket()[m
[31m-                local body, err = sock:receive(11)[m
[31m-                if not body then[m
[31m-                    ngx.say("failed to read body: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: multiple user threads + subrequests returning 404 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-finalize request /proxy/1: rc:404 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=404, status=0 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-finalize request /proxy/2: rc:404 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=404, status=0 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:200 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 404[m
[31m-status: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: multiple user threads + subrequests returning 404 remotely (no wait)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 5 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/d/$1;[m
[31m-    }[m
[31m-[m
[31m-    location /d {[m
[31m-        return 404;[m
[31m-        #echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-create 5 in 1[m
[31m-spawn user thread 5 in 1[m
[31m-create 6 in 1[m
[31m-spawn user thread 6 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-(?:terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 6: ok[m
[31m-delete thread 6|terminate 6: ok[m
[31m-delete thread 6[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: multiple user threads + subrequests returning 201 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        content_by_lua 'ngx.exit(201)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-F(ngx_http_send_header) {[m
[31m-    printf("send header main_req=%d, r=%p\n", $r == $r->main, $r)[m
[31m-    print_ubacktrace()[m
[31m-    printf("========================================")[m
[31m-}[m
[31m---- stap_out3[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-finalize request /proxy/1: rc:0 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=0, status=201 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-finalize request /proxy/2: rc:0 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=0, status=201 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:200 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 201[m
[31m-status: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: multiple user threads + subrequests returning 204 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        content_by_lua 'ngx.exit(204)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-finalize request /proxy/1: rc:204 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=204, status=204 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-finalize request /proxy/2: rc:204 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=204, status=204 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:200 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 204[m
[31m-status: 204[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/auth.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/auth.t[m
[1mdeleted file mode 100644[m
[1mindex 5da09cb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/auth.t[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-#no_nginx_manager();[m
[31m-[m
[31m-#repeat_each(1);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic test passing[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 100k;[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            -- check the client IP addr is in our black list[m
[31m-            if ngx.var.remote_addr == "132.5.72.3" then[m
[31m-                ngx.exit(ngx.HTTP_FORBIDDEN)[m
[31m-            end[m
[31m-[m
[31m-            -- check if the request body contains bad words[m
[31m-            if ngx.var.request_body and string.match(ngx.var.request_body, "fuck") then[m
[31m-                return ngx.redirect("/terms_of_use.html")[m
[31m-            end[m
[31m-[m
[31m-            -- tests passed[m
[31m-        ';[m
[31m-[m
[31m-        echo Logged in;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Logged in[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: bad words in request body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 100k;[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            -- check the client IP addr is in our black list[m
[31m-            if ngx.var.remote_addr == "132.5.72.3" then[m
[31m-                ngx.exit(ngx.HTTP_FORBIDDEN)[m
[31m-            end[m
[31m-[m
[31m-            -- check if the request body contains bad words[m
[31m-            if ngx.var.request_body and string.match(ngx.var.request_body, "fuck") then[m
[31m-                return ngx.redirect("/terms_of_use.html")[m
[31m-            end[m
[31m-[m
[31m-            -- tests passed[m
[31m-        ';[m
[31m-[m
[31m-        echo Logged in;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-He fucks himself![m
[31m---- response_body_like: 302 Found[m
[31m---- response_headers_like[m
[31m-Location: /terms_of_use\.html[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: client IP[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 100k;[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            -- check the client IP addr is in our black list[m
[31m-            if ngx.var.remote_addr == "127.0.0.1" then[m
[31m-                ngx.exit(ngx.HTTP_FORBIDDEN)[m
[31m-            end[m
[31m-[m
[31m-            -- check if the request body contains bad words[m
[31m-            if ngx.var.request_body and string.match(ngx.var.request_body, "fuck") then[m
[31m-                return ngx.redirect("/terms_of_use.html")[m
[31m-            end[m
[31m-[m
[31m-            -- tests passed[m
[31m-        ';[m
[31m-[m
[31m-        echo Logged in;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/client-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/client-abort.t[m
[1mdeleted file mode 100644[m
[1mindex a94f822..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/client-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,853 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- wait: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: subrequest + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: subrequest + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: fail[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad things happen[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: subrequest + stop (proxy, ignore client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: subrequest + stop (proxy, check client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort off;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: need body on + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        lua_need_request_body on;[m
[31m-        access_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.req.socket + receive() + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.req.socket + receive(N) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(5)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.req.socket + receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:lua check broken conn[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup|lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.req.socket + m * receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(1)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.req.socket + receiveuntil + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.req.socket + receiveuntil + it(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it(2)[m
[31m-            it(3)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: cosocket + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "failed to get socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("blpop nonexist 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.log(ngx.ERR, "about to receive")[m
[31m-[m
[31m-            local res, err = sock:receive()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to receive query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "res: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.req.socket + receive n < content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 100\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to receive: client aborted[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.req.socket + receive n == content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.sleep(1)[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.req.socket + receive n == content-length + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: exec to lua + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exec to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: exec (named location) to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("@t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location @t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/exec.t[m
[1mdeleted file mode 100644[m
[1mindex 8bf638f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,351 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/hi");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty uri arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("");[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no arg[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec();[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: too many args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec(1, 2, 3, 4);[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: null uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec(nil)[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo "Hello";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/hi", "Yichun Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello Yichun Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: args in uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/hi?agentzh")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello agentzh[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello a=Yichun&b=Zhang[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: args in uri and user args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("@hi?a=Yichun", "b=Zhang")[m
[31m-            ngx.say("Hi")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location @hi {[m
[31m-        echo Hello $query_string;[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-Hello [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exec after location capture[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua_file 'html/test.lua';[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('/b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exec after (named) location capture[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua_file 'html/test.lua';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m-    location @b {[m
[31m-        echo "hello";[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.location.capture('/a')[m
[31m-[m
[31m-ngx.exec('@b')[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (named location)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location @p {[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.exec("@p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: github issue #40: 2 Subrequest calls when using access_by_lua, ngx.exec and echo_location (post subrequest)[m
[31m---- config[m
[31m-    location = /hi {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hi;[m
[31m-    }[m
[31m-    location /p{[m
[31m-        #content_by_lua '[m
[31m-            #local res = ngx.location.capture("/sub")[m
[31m-            #ngx.print(res.body)[m
[31m-        #';[m
[31m-        echo_location /sub;[m
[31m-    }[m
[31m-    location /blah {[m
[31m-        echo blah;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/blah")[m
[31m-            ngx.exec("/p")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: access_by_lua + ngx.exec + subrequest capture[m
[31m---- config[m
[31m-    location /main {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/test_loc");[m
[31m-            ngx.print("hello, ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /test_loc {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.exec("@proxy")[m
[31m-        ';[m
[31m-    }[m
[31m-    location @proxy {[m
[31m-        #echo proxy;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        echo bah;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-hello, bah[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/exit.t[m
[1mdeleted file mode 100644[m
[1mindex 8470ab9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,548 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#repeat_each(20000);[m
[31m-repeat_each(2);[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#log_level('debug');[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1024);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: throw 403[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.exit(403);ngx.say('hi')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: throw 404[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.exit(404);ngx.say('hi');";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 404[m
[31m---- response_body_like: 404 Not Found[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: throw 404 after sending the header and partial body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.say('hi');ngx.exit(404);ngx.say(', you')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hi[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- error_log[m
[31m-attempt to set status 404 via ngx.exit after sending out the response status 200[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: working with ngx_auth_request (succeeded)[m
[31m---- config[m
[31m-    location /auth {[m
[31m-        access_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentzh[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Logged in[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: working with ngx_auth_request (failed)[m
[31m---- config[m
[31m-    location /api {[m
[31m-        set $user $arg_user;[m
[31m-        access_by_lua "[m
[31m-            if ngx.var.user == 'agentzh' then[m
[31m-                ngx.eof();[m
[31m-            else[m
[31m-                ngx.exit(403)[m
[31m-            end";[m
[31m-[m
[31m-        echo "Logged in";[m
[31m-    }[m
[31m---- request[m
[31m-GET /api?user=agentz[m
[31m---- error_code: 403[m
[31m---- response_body_like: 403 Forbidden[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: working with ngx_auth_request (simplest form, w/o ngx_memc)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        access_by_lua_file 'html/foo.lua';[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m-print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m-print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    -- ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: working with ngx_auth_request (simplest form)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        access_by_lua_file html/foo.lua;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: working with ngx_auth_request[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:\$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_b {[m
[31m-        server 127.0.0.1:\$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    upstream_list memc_cluster memc_a memc_b;[m
[31m-"[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uid-$arg_uid";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        drizzle_query "select new_uid as uid from conv_uid where old_uid=$arg_uid";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /api {[m
[31m-        set $uid $arg_uid;[m
[31m-        access_by_lua_file html/foo.lua;[m
[31m-[m
[31m-        echo "Logged in $uid";[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local old_uid = ngx.var.uid[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-uid-mysql?uid=' .. old_uid)[m
[31m--- print('just have run sr' .. res.body)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].uid or[m
[31m-        not string.match(res[1].uid, '^%d+$')) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.uid = res[1].uid;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /api?uid=32[m
[31m---- response_body[m
[31m-Logged in 56[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: working with ngx_auth_request[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m-[m
[31m-    upstream memc_a {[m
[31m-        server 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-        keepalive 300;[m
[31m-    }[m
[31m-[m
[31m-    #upstream_list memc_cluster memc_a memc_b;[m
[31m-[m
[31m---- config[m
[31m-    location /memc {[m
[31m-        internal;[m
[31m-[m
[31m-        set $memc_key $arg_key;[m
[31m-        set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-        #set_hashed_upstream $backend memc_cluster $arg_key;[m
[31m-        memc_pass memc_a;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-mysql {[m
[31m-        internal;[m
[31m-[m
[31m-        set $key "conv-uri-$query_string";[m
[31m-[m
[31m-        #srcache_fetch GET /memc key=$key;[m
[31m-        #srcache_store PUT /memc key=$key;[m
[31m-[m
[31m-        default_type 'application/json';[m
[31m-[m
[31m-        set_quote_sql_str $seo_uri $query_string;[m
[31m-        drizzle_query "select url from my_url_map where seo_url=$seo_uri";[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        rds_json on;[m
[31m-    }[m
[31m-[m
[31m-    location /conv-uid {[m
[31m-        internal;[m
[31m-        access_by_lua_file 'html/foo.lua';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /baz {[m
[31m-        set $my_uri $uri;[m
[31m-        auth_request /conv-uid;[m
[31m-[m
[31m-        echo_exec /jump $my_uri;[m
[31m-    }[m
[31m-[m
[31m-    location /jump {[m
[31m-        internal;[m
[31m-        rewrite ^ $query_string? redirect;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-local cjson = require('cjson');[m
[31m-local seo_uri = ngx.var.my_uri[m
[31m--- print('about to run sr')[m
[31m-local res = ngx.location.capture('/conv-mysql?' .. seo_uri)[m
[31m-if (res.status ~= ngx.HTTP_OK) then[m
[31m-    ngx.exit(res.status)[m
[31m-end[m
[31m-res = cjson.decode(res.body)[m
[31m-if (not res or not res[1] or not res[1].url) then[m
[31m-    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-end[m
[31m-ngx.var.my_uri = res[1].url;[m
[31m--- print('done')[m
[31m---- request[m
[31m-GET /baz[m
[31m---- response_body_like: 302[m
[31m---- error_code: 302[m
[31m---- response_headers[m
[31m-Location: http://localhost:$ServerPort/foo/bar[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: throw 0[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.say('Hi'); ngx.eof(); ngx.exit(0);ngx.say('world')";[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: throw ngx.OK does *not* skip other later phase handlers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.exit(ngx.OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: throw ngx.HTTP_OK *does* skip other later phase handlers (by inlined code)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua "ngx.exit(ngx.HTTP_OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by inlined code + partial output)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua "ngx.say('hiya') ngx.exit(ngx.HTTP_OK)";[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: throw ngx.HTTP_OK *does* skip other later phase handlers (by file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua_file html/foo.lua;[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: throw ngx.HTTP_OK *does* skip other rewrite phase handlers (by file + partial output)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua_file html/foo.lua;[m
[31m-        set $foo hello;[m
[31m-        echo $foo;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.say("morning")[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-morning[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: error page with custom body[m
[31m---- config[m
[31m-    error_page 410 @err;[m
[31m-    location @err {[m
[31m-        echo blah blah;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            ngx.status = ngx.HTTP_GONE[m
[31m-            ngx.say("This is our own content")[m
[31m-            -- to cause quit the whole request rather than the current phase handler[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-        echo Hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-This is our own content[m
[31m---- error_code: 410[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exit(404) after I/O[m
[31m---- config[m
[31m-    error_page 400 /400.html;[m
[31m-    error_page 404 /404.html;[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.exit(ngx.HTTP_NOT_FOUND)[m
[31m-        ';[m
[31m-        echo Hello;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.002;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 400.html[m
[31m-Bad request, dear...[m
[31m->>> 404.html[m
[31m-Not found, dear...[m
[31m---- request[m
[31m-    GET /bah[m
[31m---- response_body[m
[31m-Not found, dear...[m
[31m---- error_code: 404[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/mixed.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/mixed.t[m
[1mdeleted file mode 100644[m
[1mindex a9f8039..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/mixed.t[m
[1m+++ /dev/null[m
[36m@@ -1,261 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: access I/O with content I/O[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("access GET: ", res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            print("access PUT: ", res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("access cached: ", res.body);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("content PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content cached: " .. res.body);[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-content GET: 404[m
[31m-content PUT: 201[m
[31m-content cached: hello[m
[31m---- grep_error_log eval: qr/access .+?(?= while )/[m
[31m---- grep_error_log_out[m
[31m-access GET: 404[m
[31m-access PUT: 201[m
[31m-access cached: hello[m
[31m-[m
[31m---- log_level: info[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: share data via nginx variables[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        set $foo '';[m
[31m-        access_by_lua '[m
[31m-            ngx.var.foo = 32[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.say(tonumber(ngx.var.foo) * 2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-64[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: share the request body (need request body explicitly off)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        set $res '';[m
[31m-        access_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: share the request body (need request body off by default)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        #lua_need_request_body off;[m
[31m-        set $res '';[m
[31m-        access_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: share the request body (need request body on)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        set $res '';[m
[31m-        access_by_lua '[m
[31m-            ngx.var.res = ngx.var.request_body or "nil"[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.res or "nil")[m
[31m-            ngx.say(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: rewrite I/O with access I/O with content I/O[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("rewrite GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            print("rewrite PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("rewrite cached: " .. res.body);[m
[31m-        ';[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("access GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            print("access PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            print("access cached: " .. res.body);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("content PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("content cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-content GET: 404[m
[31m-content PUT: 201[m
[31m-content cached: hello[m
[31m-[m
[31m---- grep_error_log eval: qr/(?:rewrite|access) .+?(?= while )/[m
[31m---- grep_error_log_out[m
[31m-rewrite GET: 404[m
[31m-rewrite PUT: 201[m
[31m-rewrite cached: hello[m
[31m-access GET: 404[m
[31m-access PUT: 201[m
[31m-access cached: hello[m
[31m-[m
[31m---- log_level: info[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: I/O in access shortcuts content automatically[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_by_lua_block {[m
[31m-            ngx.print("")[m
[31m-        }[m
[31m-[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/multi-capture.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/multi-capture.t[m
[1mdeleted file mode 100644[m
[1mindex 368d401..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/multi-capture.t[m
[1m+++ /dev/null[m
[36m@@ -1,395 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(10);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 2;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/([a-d])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = c[m
[31m-res4.status = 200[m
[31m-res4.body = d[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: capture multi in series[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("2 res1.status = " .. res1.status)[m
[31m-            ngx.say("2 res1.body = " .. res1.body)[m
[31m-            ngx.say("2 res2.status = " .. res2.status)[m
[31m-            ngx.say("2 res2.body = " .. res2.body)[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-2 res1.status = 200[m
[31m-2 res1.body = a[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: capture multi in subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo?n=1")[m
[31m-            ngx.say("top res.status = " .. res.status)[m
[31m-            ngx.say("top res.body = [" .. res.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res.status = 200[m
[31m-top res.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: capture multi in parallel[m
[31m---- config[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("top res1.status = " .. res1.status)[m
[31m-            ngx.say("top res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("top res2.status = " .. res2.status)[m
[31m-            ngx.say("top res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([abcd])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res1.status = 200[m
[31m-top res1.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-top res2.status = 200[m
[31m-top res2.body = [2 res1.status = 200[m
[31m-2 res1.body = c[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = d[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: memc sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[ab]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: memc muti + multi[m
[31m---- config[m
[31m-    location /main {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        rewrite_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-            print("args: " .. ngx.var.args)[m
[31m-            local n = ngx.var.arg_n[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[abcd]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = [1 res1.status = 201[m
[31m-1 res1.body = STORED\r[m
[31m-[m
[31m-1 res2.status = 201[m
[31m-1 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-res2.status = 200[m
[31m-res2.body = [2 res1.status = 201[m
[31m-2 res1.body = STORED\r[m
[31m-[m
[31m-2 res2.status = 201[m
[31m-2 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: memc 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        access_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/[a-d]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-res3.status = 201[m
[31m-res3.body = STORED\r[m
[31m-[m
[31m-res4.status = 201[m
[31m-res4.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/on-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/on-abort.t[m
[1mdeleted file mode 100644[m
[1mindex 0c17b55..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/on-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,652 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 15);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ignore the client abort event in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: abort in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.exit(499) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exit(408) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(408)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(-1) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(-1)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(0) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(0)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.log(ngx.ERR, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.7;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.6[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-'client prematurely closed connection',[m
[31m-'on abort called',[m
[31m-qr/lua user thread aborted: runtime error: access_by_lua\(nginx\.conf:\d+\):4: attempt to abort with pending subrequests/,[m
[31m-'main handler done',[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: accessing cosocket in callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flushall\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive()[m
[31m-                if not res then[m
[31m-                    ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                ngx.log(ngx.NOTICE, "callback done: ", res)[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-lua check broken conn[m
[31m-(?:lua check broken conn[m
[31m-)?terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-$[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.2[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-callback done: +OK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ignore the client abort event in the user callback (no check)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("cannot set on_abort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- response_body[m
[31m-cannot set on_abort: lua_check_client_abort is off[m
[31m---- no_error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: regsiter on_abort callback but no client abortion[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ignore the client abort event in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abort in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: regsiter on_abort callback but no client abortion (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: regsiter on_abort callback multiple times[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        access_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("1: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("2: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-2: cannot set on_abort: duplicate call[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/redirect.t[m
[1mdeleted file mode 100644[m
[1mindex c7ce512..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,125 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 3;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo");[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: explicit 302[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", ngx.HTTP_MOVED_TEMPORARILY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: explicit 301[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", ngx.HTTP_MOVED_PERMANENTLY);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 301 Moved Permanently[m
[31m---- error_code: 301[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad rc[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo", 404);[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: no args[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect()[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-!Location[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: relative uri[m
[31m---- config[m
[31m-    location /read {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- raw_response_headers_like: Location: /foo\r\n[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/req-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/req-body.t[m
[1mdeleted file mode 100644[m
[1mindex fd33aff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/req-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,221 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 19);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read buffered body[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read buffered body (timed out)[m
[31m---- config[m
[31m-    client_body_timeout 1ms;[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /test HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 100\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-hello, world"[m
[31m---- response_body:[m
[31m---- error_code_like: ^(?:500)?$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read buffered body and then subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: first subrequest and then read buffered body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: failed to write 100 continue[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-http finalize request: 500, "/test?" a:1, c:0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: not discard body (exit 200)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        access_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not discard body (exit 201)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        access_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: not discard body (exit 302)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        access_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            -- ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.redirect("/blah")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-[qr/302 Found/,[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[302, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/request_body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/request_body.t[m
[1mdeleted file mode 100644[m
[1mindex e4ac161..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/request_body.t[m
[1m+++ /dev/null[m
[36m@@ -1,173 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('debug'); # to ensure any log-level can be outputed[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: test reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: test not reading request body[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: test default setting (not reading request body)[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: test main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: test server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: test override main conf[m
[31m---- http_config[m
[31m-    lua_need_request_body on;[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: test override server conf[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body off;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /echo_body[m
[31m-hello\x00\x01\x02[m
[31m-world\x03\x04\xff"[m
[31m---- response_body eval[m
[31m-"nil"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: Expect: 100-Continue[m
[31m---- config[m
[31m-    location /echo_body {[m
[31m-        lua_need_request_body on;[m
[31m-        access_by_lua '[m
[31m-            ngx.print(ngx.var.request_body or "nil")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /echo_body[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-http finalize request: 500, "/echo_body?" a:1, c:2[m
[31m-http finalize request: 500, "/echo_body?" a:1, c:0[m
[31m---- log_level: debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex de63a68..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,744 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#log_level('warn');[m
[31m-#no_nginx_manager();[m
[31m-#master_on();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 11);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        access_by_lua 'ngx.print("Hello, Lua!\\n")';[m
[31m-        content_by_lua return;[m
[31m-        #content_by_lua 'ngx.say("Hi")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic say[m
[31m---- config[m
[31m-    location /say {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        access_by_lua '[m
[31m-            ngx.say("Hello, Lua!")[m
[31m-            ngx.say("Yay! ", 123)';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /say[m
[31m---- response_body[m
[31m-Hello, Lua![m
[31m-Yay! 123[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no ngx.echo[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.echo("Hello, Lua!\\n")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: variable[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        # NOTE: the newline escape sequence must be double-escaped, as nginx config[m
[31m-        # parser will unescape first![m
[31m-        access_by_lua 'v = ngx.var["request_uri"] ngx.print("request_uri: ", v, "\\n")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variable (file)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua_file html/test.lua;[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-request_uri: /lua?a=1&b=2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: calc expression[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua_file html/calc.lua;[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> calc.lua[m
[31m-local function uri_unescape(uri)[m
[31m-    local function convert(hex)[m
[31m-        return string.char(tonumber("0x"..hex))[m
[31m-    end[m
[31m-    local s = string.gsub(uri, "%%([0-9a-fA-F][0-9a-fA-F])", convert)[m
[31m-    return s[m
[31m-end[m
[31m-[m
[31m-local function eval_exp(str)[m
[31m-    return loadstring("return "..str)()[m
[31m-end[m
[31m-[m
[31m-local exp_str = ngx.var["arg_exp"][m
[31m--- print("exp: '", exp_str, "'\n")[m
[31m-local status, res[m
[31m-status, res = pcall(uri_unescape, exp_str)[m
[31m-if not status then[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-    return[m
[31m-end[m
[31m-status, res = pcall(eval_exp, res)[m
[31m-if status then[m
[31m-    ngx.print("result: ", res, "\n")[m
[31m-else[m
[31m-    ngx.print("error: ", res, "\n")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua?exp=1%2B2*math.sin(3)%2Fmath.exp(4)-math.sqrt(2)[m
[31m---- response_body[m
[31m-result: -0.4090441561579[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read $arg_xxx[m
[31m---- config[m
[31m-    location = /lua {[m
[31m-        access_by_lua 'who = ngx.var.arg_who[m
[31m-            ngx.print("Hello, ", who, "!")';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?who=agentzh[m
[31m---- response_body chomp[m
[31m-Hello, agentzh![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: capture location[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-res = ngx.location.capture("/other")[m
[31m-ngx.print("status=", res.status, " ")[m
[31m-ngx.print("body=", res.body)[m
[31m-';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-status=200 body=hello, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: capture non-existed location[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'res = ngx.location.capture("/other"); ngx.print("status=", res.status)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body: status=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: invalid capture location (not as expected...)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'res = ngx.location.capture("*(#*"); ngx.say("res=", res.status)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-res=404[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nil is "nil"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.say(nil)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: write boolean[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.say(true, " ", false)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-true false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: bad argument type to ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.location.capture(nil)';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: capture location (default 0);[m
[31m---- config[m
[31m- location /recur {[m
[31m-       access_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body, "\\n");[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-[m
[31m-           content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur[m
[31m---- response_body[m
[31m-num is: 0[m
[31m-end[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: capture location[m
[31m-access phase not running in subrequests[m
[31m---- config[m
[31m- location /recur {[m
[31m-       access_by_lua '[m
[31m-           local num = tonumber(ngx.var.arg_num) or 0;[m
[31m-           ngx.print("num is: ", num, "\\n");[m
[31m-[m
[31m-           if (num > 0) then[m
[31m-               res = ngx.location.capture("/recur?num="..tostring(num - 1));[m
[31m-               ngx.print("status=", res.status, " ");[m
[31m-               ngx.print("body=", res.body);[m
[31m-           else[m
[31m-               ngx.print("end\\n");[m
[31m-           end[m
[31m-           ';[m
[31m-[m
[31m-           content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /recur?num=3[m
[31m---- response_body chomp[m
[31m-num is: 3[m
[31m-status=200 body=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: setting nginx variables from within Lua[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a "";[m
[31m-       access_by_lua 'ngx.var.a = 32; ngx.say(ngx.var.a)';[m
[31m-       content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-       add_header Foo $a;[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_headers[m
[31m-Foo: 32[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: nginx quote sql string 1[m
[31m---- config[m
[31m- location /set {[m
[31m-       set $a 'hello\n\r\'"\\'; # this runs after access_by_lua[m
[31m-       access_by_lua 'ngx.say(ngx.quote_sql_str(ngx.var.a))';[m
[31m-       content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-   }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: nginx quote sql string 2[m
[31m---- config[m
[31m-location /set {[m
[31m-    #set $a "hello\n\r'\"\\";[m
[31m-    access_by_lua 'ngx.say(ngx.quote_sql_str("hello\\n\\r\'\\"\\\\"))';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'hello\n\r\'\"\\'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: use dollar[m
[31m---- config[m
[31m-location /set {[m
[31m-    access_by_lua '[m
[31m-        local s = "hello 112";[m
[31m-        ngx.say(string.find(s, "%d+$"))';[m
[31m-[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-79[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: subrequests do not share variables of main requests by default[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a 12;[m
[31m-    access_by_lua 'res = ngx.location.capture("/sub"); ngx.print(res.body)';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: subrequests can share variables of main requests[m
[31m---- config[m
[31m-location /sub {[m
[31m-    echo $a;[m
[31m-}[m
[31m-location /parent {[m
[31m-    set $a '';[m
[31m-    access_by_lua '[m
[31m-        ngx.var.a = 12;[m
[31m-        res = ngx.location.capture([m
[31m-            "/sub",[m
[31m-            { share_all_vars = true }[m
[31m-        );[m
[31m-        ngx.print(res.body)[m
[31m-    ';[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: main requests use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-}[m
[31m-location /parent {[m
[31m-    access_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = true });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-[m
[31m-    content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: main requests do NOT use subrequests' variables[m
[31m---- config[m
[31m-location /sub {[m
[31m-    set $a 12;[m
[31m-    content_by_lua return;[m
[31m-}[m
[31m-[m
[31m-location /parent {[m
[31m-    access_by_lua '[m
[31m-        res = ngx.location.capture("/sub", { share_all_vars = false });[m
[31m-        ngx.say(ngx.var.a)[m
[31m-    ';[m
[31m-    content_by_lua return;[m
[31m-}[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_body_like eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo "hello, world";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"]);[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: Bah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: capture location headers[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        access_by_lua '[m
[31m-            ngx.header.Bar = "Bah";[m
[31m-            ngx.header.Bar = nil;[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other");[m
[31m-            ngx.say("type: ", res.header["Content-Type"]);[m
[31m-            ngx.say("Bar: ", res.header["Bar"] or "nil");[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-type: foo/bar[m
[31m-Bar: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: access_by_lua runs after ngx_access[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        deny all;[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: auth_request runs before ngx_access[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        deny all;[m
[31m-[m
[31m-        auth_request /auth;[m
[31m-[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: access_by_lua shouldn't send headers automatically (on simple return)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'return';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        default_type 'text/css';[m
[31m-        add_header Bar Baz;[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-Bar: Baz[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: access_by_lua shouldn't send headers automatically (on simple exit)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua 'ngx.exit(ngx.OK)';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        default_type 'text/css';[m
[31m-        add_header Bar Baz;[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-Bar: Baz[m
[31m-Content-Type: text/css[m
[31m---- response_body[m
[31m-foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: short circuit[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.say("Hi")[m
[31m-            ngx.eof()[m
[31m-            ngx.exit(ngx.HTTP_OK)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            print("HERE")[m
[31m-            ngx.print("BAD")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: nginx vars in script path[m
[31m---- config[m
[31m-    location ~ ^/lua/(.+)$ {[m
[31m-        access_by_lua_file html/$1.lua;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            print("HERE")[m
[31m-            ngx.print("BAD")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> hi.lua[m
[31m-ngx.say("Hi")[m
[31m-ngx.eof()[m
[31m-ngx.exit(ngx.HTTP_OK)[m
[31m---- request[m
[31m-GET /lua/hi[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: phase postponing works for various locations (access phase not running in subrequest)[m
[31m---- config[m
[31m-    location ~ '^/lua/(.+)' {[m
[31m-        set $path $1;[m
[31m-        access_by_lua 'ngx.say(ngx.var.path)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location ~ '^/lua2/(.+)' {[m
[31m-        set $path $1;[m
[31m-        access_by_lua 'ngx.say(ngx.var.path)';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua/foo;[m
[31m-        echo_location /lua/bar;[m
[31m-        echo_location /lua2/baz;[m
[31m-        echo_location /lua2/bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: server access_by_lua[m
[31m---- config[m
[31m-    access_by_lua 'ngx.header["X-Foo"] = "bar" -- ngx.send_headers()';[m
[31m---- request[m
[31m-GET /[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m---- response_headers[m
[31m-X-Foo: bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: server access_by_lua_file[m
[31m---- config[m
[31m-    access_by_lua_file html/foo.lua;[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header["X-Foo"] = "bar" -- ngx.send_headers()[m
[31m---- request[m
[31m-GET /[m
[31m---- response_body chop[m
[31m-<html><head><title>It works!</title></head><body>It works!</body></html>[m
[31m---- response_headers[m
[31m-X-Foo: bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: use of ngx.say() in access_by_lua without exiting with 200+.[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua "ngx.say('test')";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: use of ngx.say() in access_by_lua without exiting with 200+. (with explicit ngx.eof())[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua "ngx.say('test') ngx.eof()";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: use of ngx.say() in access_by_lua without exiting with 200+. (with IO)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua "ngx.say('test') ngx.sleep(0.001)";[m
[31m-        echo_exec /t2;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/satisfy.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/satisfy.t[m
[1mdeleted file mode 100644[m
[1mindex 10d3ece..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/satisfy.t[m
[1m+++ /dev/null[m
[36m@@ -1,212 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(4);[m
[31m-#log_level('warn');[m
[31m-no_root_location();[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: satisfy any[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        allow all;[m
[31m-        access_by_lua 'ngx.exit(403)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: satisfy any[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.exit(403)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: satisfy any (explicit ngx.exit(0))[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.exit(0)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: satisfy any (simple return)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua return;[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: satisfy any (declined)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.exit(ngx.DECLINED)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: satisfy any (declined, with I/O)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.location.capture("/echo") ngx.exit(ngx.DECLINED)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-        #echo_sleep 0.01;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: satisfy any (simple return, with I/O)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.location.capture("/echo") return';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: satisfy any - with I/O[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.location.capture("/echo") ngx.exit(403)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: satisfy any (explicit ngx.exit(0), with I/O)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        satisfy any;[m
[31m-        deny all;[m
[31m-        access_by_lua 'ngx.location.capture("/echo") ngx.exit(0)';[m
[31m-[m
[31m-        echo something important;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo hi;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-something important[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/sleep.t[m
[1mdeleted file mode 100644[m
[1mindex 2eb0822..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,222 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 33;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep 0.5[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep(0.5)[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-5]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep ag[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep("a")[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep 0.5 in subrequest[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            local now = ngx.now()[m
[31m-            local delay = now - before[m
[31m-            ngx.say(delay)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        content_by_lua 'ngx.sleep(0.5)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-9]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/sleep?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sleep a in subrequest with bad argument[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            local res = ngx.location.capture("/sleep");[m
[31m-            ngx.say(res.status)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        content_by_lua 'ngx.sleep("a")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-500[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sleep 0.5 - multi-times[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local start = ngx.now()[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say(ngx.now() - start)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:8[5-9]\d*|9[0-9]\d*|9)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: sleep 0.5 - interleaved by ngx.say() - ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(1)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m---- error_log[m
[31m-lua ready to sleep[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sleep 0.5 - interleaved by ngx.say() - not ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(0.5)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m-hiya[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.location.capture before and after ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        access_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /hello {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m-    location = /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/subrequest.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/subrequest.t[m
[1mdeleted file mode 100644[m
[1mindex 00c56b8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/subrequest.t[m
[1m+++ /dev/null[m
[36m@@ -1,602 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: DELETE[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: DELETE (proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_DELETE });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-DELETE[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: POST (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-POST[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: HEAD[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_HEAD });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: explicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_GET });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: implicit GET[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: implicit GET (empty option table)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo $echo_request_method;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo", {})[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: PUT (nobody, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-PUT[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: PUT (nobody, no proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        #echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        #echo $echo_request_body;[m
[31m-        echo_request_body;[m
[31m-        #echo "[$http_content_length]";[m
[31m-        echo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo $echo_request_method;[m
[31m-        echo -n "[$http_content_length]";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/foo")[m
[31m-            ngx.say(res.body)[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-PUT[m
[31m-hello[m
[31m-GET[m
[31m-[][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: POST (with body, proxy method)[m
[31m---- config[m
[31m-    location /other {[m
[31m-        default_type 'foo/bar';[m
[31m-        echo_read_request_body;[m
[31m-[m
[31m-        echo $echo_request_method;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/other;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { method = ngx.HTTP_POST, body = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chomp[m
[31m-POST[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/flush");[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello" });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc");[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: POST (with body, memc method)[m
[31m---- config[m
[31m-    location /flush {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd "";[m
[31m-        set $memc_key $echo_request_uri;[m
[31m-        set $memc_exptime 600;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/flush",[m
[31m-                { share_all_vars = true });[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { share_all_vars = true });[m
[31m-            ngx.say("GET: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc",[m
[31m-                { method = ngx.HTTP_PUT, body = "hello", share_all_vars = true });[m
[31m-            ngx.say("PUT: " .. res.status);[m
[31m-[m
[31m-            res = ngx.location.capture("/memc", { share_all_vars = true });[m
[31m-            ngx.say("cached: " .. res.body);[m
[31m-[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-GET: 404[m
[31m-PUT: 201[m
[31m-cached: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: emtpy args option table[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = {} })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval: "\n"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: non-empty args option table (1 pair)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-fo%3D=%3D%3E[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: non-empty args option table (2 pairs)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { ["fo="] = "=>",[m
[31m-                    ["="] = ":" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:fo%3D=%3D%3E\&%3D=%3A|%3D=%3A\&fo%3D=%3D%3E)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: non-empty args option table (2 pairs, no special chars)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { foo = 3,[m
[31m-                    bar = "hello" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^(?:bar=hello\&foo=3|foo=3\&bar=hello)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: non-empty args option table (number key)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { [57] = "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: non-empty args option table (plain arrays)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo",[m
[31m-                { args = { "hi" } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = { b = 4 } })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: more args[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            res = ngx.location.capture("/foo?a=3",[m
[31m-                { args = "b=4" })[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-        content_by_lua 'ngx.exit(ngx.OK)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=3&b=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: I/O in named location[m
[31m-the nginx core requires the patch https://github.com/agentzh/ngx_openresty/blob/master/patches/nginx-1.0.15-reset_wev_handler_in_named_locations.patch[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_exec @named;[m
[31m-    }[m
[31m-[m
[31m-    location @named {[m
[31m-        access_by_lua '[m
[31m-            ngx.location.capture("/hello")[m
[31m-        ';[m
[31m-        echo done;[m
[31m-    }[m
[31m-[m
[31m-    location /hello {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-exec.t[m
[1mdeleted file mode 100644[m
[1mindex d7c2321..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,347 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exec in user thread (entry still pending)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exec in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exec in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exec in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exec in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-exit.t[m
[1mdeleted file mode 100644[m
[1mindex c08fefc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,1314 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exit in user thread (entry thread is still pending to run)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-                ngx.say("g")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m-f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exit in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("exiting the user thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-exiting the user thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.tcp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_tcp_resolve_cleanup) {[m
[31m-    println("lua tcp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.udp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_resolve_cleanup) {[m
[31m-    println("lua udp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: exit in user thread (entry thread is still pending on tcpsock:connect)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(12000)[m
[31m-            local ok, err = sock:connect("106.187.41.147", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: exit in user thread (entry thread is still pending on tcpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: exit in user thread (entry thread is still pending on tcpsock:receiveuntil's iterator)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local it, err = sock:receiveuntil("\\r\\n")[m
[31m-            if not it then[m
[31m-                ngx.say("failed to receive until: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = it()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exit in user thread (entry thread is still pending on udpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_socket_cleanup) {[m
[31m-    println("lua udp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exit in user thread (entry thread is still pending on reqsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.req.socket()[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive(1024)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exit in user thread (entry thread is still pending on ngx.req.read_body)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_req_body_cleanup) {[m
[31m-    println("lua req body cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req body cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exit in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: exit in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: exit in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-redirect.t[m
[1mdeleted file mode 100644[m
[1mindex 8b030ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.redirect() in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: redirect in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-spawn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-spawn.t[m
[1mdeleted file mode 100644[m
[1mindex 415e4c0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/024-access/uthread-spawn.t[m
[1m+++ /dev/null[m
[36m@@ -1,1119 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple user thread without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval[m
[31m-<<'_EOC_' . $::StapScript;[m
[31m-[m
[31m-F(ngx_http_lua_send_chain_link) {[m
[31m-    printf("send link %p\n", $in)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    println("core content phase")[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: two simple user threads without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("in thread 1")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("in thread 2")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before 1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after 1")[m
[31m-[m
[31m-            ngx.say("before 2")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after 2")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before 1[m
[31m-in thread 1[m
[31m-after 1[m
[31m-before 2[m
[31m-in thread 2[m
[31m-after 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple user thread with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before sleep[m
[31m-after thread create[m
[31m-after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: two simple user threads with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("1: before sleep")[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("1: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("2: before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("2: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("1: after thread create")[m
[31m-[m
[31m-            ngx.say("2: before thread create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("2: after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-1: before thread create[m
[31m-1: before sleep[m
[31m-1: after thread create[m
[31m-2: before thread create[m
[31m-2: before sleep[m
[31m-2: after thread create[m
[31m-2: after sleep[m
[31m-1: after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: error in user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.blah()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-after[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: access_by_lua\(nginx\.conf:\d+\):3: attempt to call field 'blah' \(a nil value\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple user threads doing a single subrequest (entry quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple user threads doing a single subrequest (entry also does a subrequest and quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-capture: hello bar[m
[31m-after capture: hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple user threads doing a single subrequest (entry also does a subrequest and quits late)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello foo[m
[31m-capture: hello bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: two simple user threads doing single subrequests (entry also does a subrequest and quits between)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("f: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("f: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("g: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?bah")[m
[31m-                ngx.say("g: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread 1 create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread 1 create")[m
[31m-[m
[31m-            ngx.say("before thread 2 create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after thread 2 create")[m
[31m-[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bah {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n hello bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before thread 1 create[m
[31m-f: before capture[m
[31m-after thread 1 create[m
[31m-before thread 2 create[m
[31m-g: before capture[m
[31m-after thread 2 create[m
[31m-f: after capture: hello foo[m
[31m-capture: hello bar[m
[31m-g: after capture: hello bah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nested user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after f[m
[31m-after g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nested user threads (with I/O)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-after f[m
[31m-after g[m
[31m-hello in g()[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: coroutine status of a running user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: running[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: coroutine status of a dead user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-status: zombie[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: coroutine status of a "normal" user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                local co2 = coroutine.create(g)[m
[31m-                coroutine.resume(co2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: normal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: creating user threads in a user coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after g[m
[31m-after f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: manual time slicing between a user thread and the entry thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            local self = coroutine.running()[m
[31m-            ngx.say("0")[m
[31m-            yield(self)[m
[31m-            ngx.say("1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("2")[m
[31m-            yield(self)[m
[31m-            ngx.say("3")[m
[31m-            yield(self)[m
[31m-            ngx.say("4")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-0[m
[31m-1[m
[31m-f 1[m
[31m-2[m
[31m-f 2[m
[31m-3[m
[31m-f 3[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: manual time slicing between two user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("g 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 3")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-f 2[m
[31m-done[m
[31m-g 2[m
[31m-f 3[m
[31m-g 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entry thread and a user thread flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                coroutine.yield(coroutine.running)[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.flush(true)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: two user threads flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello from g")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- response_body[m
[31m-hello from f[m
[31m-hello from g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: user threads + ngx.socket.tcp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flush_all\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: user threads + ngx.socket.udp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.udp()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", 12345)[m
[31m-                local bytes, err = sock:send("blah")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- udp_listen: 12345[m
[31m---- udp_query: blah[m
[31m---- udp_reply: hello udp[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-after[m
[31m-received: hello udp[m
[31m-|before[m
[31m-received: hello udp[m
[31m-after)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: simple user thread with ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                ngx.req.read_body()[m
[31m-                local body = ngx.req.get_body_data()[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: simple user thread with ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.req.socket()[m
[31m-                local body, err = sock:receive(11)[m
[31m-                if not body then[m
[31m-                    ngx.say("failed to read body: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/025-codecache.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/025-codecache.t[m
[1mdeleted file mode 100644[m
[1mindex f33452a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/025-codecache.t[m
[1m+++ /dev/null[m
[36m@@ -1,1247 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 155;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: code cache on by default[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: code cache explicitly on[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache on;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: code cache explicitly off[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-101[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: code cache explicitly off (server level)[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-101[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: code cache explicitly off (server level) but be overridden in the location[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m-    location /lua {[m
[31m-        lua_code_cache on;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("ngx.say(101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(32)[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: code cache explicitly off (affects require) + content_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo";[m
[31m-        ';[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/foo.lua", "w"))[m
[31m-            f:write("module(..., package.seeall); ngx.say(102);")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall); ngx.say(32);[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-102[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: code cache explicitly off (affects require) + content_by_lua_file[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/foo.lua", "w"))[m
[31m-            f:write("module(..., package.seeall); ngx.say(102);")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local foo = require "foo";[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall); ngx.say(32);[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-102[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: code cache explicitly off (affects require) + set_by_lua_file[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        set_by_lua_file $a html/test.lua;[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/foo.lua", "w"))[m
[31m-            f:write("module(..., package.seeall); return 102;")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-return require "foo"[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall); return 32;[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-102[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: code cache explicitly on (affects require) + set_by_lua_file[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache on;[m
[31m-        set_by_lua_file $a html/test.lua;[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/foo.lua", "w"))[m
[31m-            f:write("module(..., package.seeall); return 102;")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-return require "foo"[m
[31m->>> foo.lua[m
[31m-module(..., package.seeall); return 32;[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: code cache explicitly off + set_by_lua_file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        set_by_lua_file $a html/test.lua;[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("return 101")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-return 32[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-101[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: code cache explicitly on + set_by_lua_file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache on;[m
[31m-        set_by_lua_file $a html/test.lua;[m
[31m-        echo $a;[m
[31m-    }[m
[31m-    location /update {[m
[31m-        content_by_lua '[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("return 101")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /update;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-return 32[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-32[m
[31m-updated[m
[31m-32[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: no clear builtin lib "string"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua_file html/test.lua;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-ngx.say(string.len("hello"))[m
[31m-ngx.say(table.concat({1,2,3}, ", "))[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-5[m
[31m-1, 2, 3[m
[31m-5[m
[31m-1, 2, 3[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no clear builtin lib "string"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_code_cache off;[m
[31m-        content_by_lua '[m
[31m-            ngx.say(string.len("hello"))[m
[31m-            ngx.say(table.concat({1,2,3}, ", "))[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-5[m
[31m-1, 2, 3[m
[31m-5[m
[31m-1, 2, 3[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: no clear builtin lib "string"[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local test = require("test")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        echo_location /lua;[m
[31m-        echo_location /lua;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-string = require("string")[m
[31m-math = require("math")[m
[31m-io = require("io")[m
[31m-os = require("os")[m
[31m-table = require("table")[m
[31m-coroutine = require("coroutine")[m
[31m-package = require("package")[m
[31m-ngx.say("OK")[m
[31m---- response_body[m
[31m-OK[m
[31m-OK[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: do not skip luarocks[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-     lua_code_cache off;"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /load;[m
[31m-        echo_location /check;[m
[31m-        echo_location /check;[m
[31m-    }[m
[31m-[m
[31m-    location /load {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.luarocks = nil;[m
[31m-            local foo = require "luarocks";[m
[31m-            foo.hi()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /check {[m
[31m-        content_by_lua '[m
[31m-            local foo = package.loaded.luarocks[m
[31m-            if foo then[m
[31m-                ngx.say("found")[m
[31m-            else[m
[31m-                ngx.say("not found")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- user_files[m
[31m->>> luarocks.lua[m
[31m-module(..., package.seeall);[m
[31m-[m
[31m-ngx.say("loading");[m
[31m-[m
[31m-function hi ()[m
[31m-    ngx.say("hello, foo")[m
[31m-end;[m
[31m---- response_body[m
[31m-loading[m
[31m-hello, foo[m
[31m-not found[m
[31m-not found[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: do not skip luarocks*[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-     lua_code_cache off;"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        echo_location /load;[m
[31m-        echo_location /check;[m
[31m-        echo_location /check;[m
[31m-    }[m
[31m-[m
[31m-    location /load {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.luarocks2 = nil;[m
[31m-            local foo = require "luarocks2";[m
[31m-            foo.hi()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /check {[m
[31m-        content_by_lua '[m
[31m-            local foo = package.loaded.luarocks2[m
[31m-            if foo then[m
[31m-                ngx.say("found")[m
[31m-            else[m
[31m-                ngx.say("not found")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- user_files[m
[31m->>> luarocks2.lua[m
[31m-module(..., package.seeall);[m
[31m-[m
[31m-ngx.say("loading");[m
[31m-[m
[31m-function hi ()[m
[31m-    ngx.say("hello, foo")[m
[31m-end;[m
[31m---- response_body[m
[31m-loading[m
[31m-hello, foo[m
[31m-not found[m
[31m-not found[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: clear _G table[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            if not _G.foo then[m
[31m-                _G.foo = 1[m
[31m-            else[m
[31m-                _G.foo = _G.foo + 1[m
[31m-            end[m
[31m-            ngx.say("_G.foo: ", _G.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-_G.foo: 1[m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: github #257: globals cleared when code cache off[m
[31m---- http_config[m
[31m-    lua_code_cache off;[m
[31m-    init_by_lua '[m
[31m-      test = setfenv([m
[31m-        function()[m
[31m-          ngx.say(tostring(table))[m
[31m-        end,[m
[31m-        setmetatable({},[m
[31m-        {[m
[31m-          __index = function(self, key)[m
[31m-          return rawget(self, key) or _G[key][m
[31m-        end[m
[31m-      }))';[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua 'test()';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^table: 0x\d*?[1-9a-fA-F][m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: lua_code_cache off + FFI-based Lua modules[m
[31m---- http_config[m
[31m-    lua_code_cache off;[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            if not jit then[m
[31m-                ngx.say("skipped for non-LuaJIT")[m
[31m-            else[m
[31m-                local test = require("test")[m
[31m-                ngx.say("test module loaded: ", test and true or false)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local ffi = require "ffi"[m
[31m-[m
[31m-ffi.cdef[[[m
[31m-    int my_test_function_here(void *p);[m
[31m-    int my_test_function_here2(void *p);[m
[31m-    int my_test_function_here3(void *p);[m
[31m-]][m
[31m-[m
[31m-return {[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^(?:skipped for non-LuaJIT|test module loaded: true)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.timer.* + ndk[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /read {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            ngx.timer.at(0, function ()[m
[31m-                local foo = ndk.set_var.set_unescape_uri("a%20b")[m
[31m-                ngx.log(ngx.WARN, "foo = ", foo)[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body[m
[31m-ok[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["foo = a b",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: set ngx.ctx before internal redirects performed by other nginx modules (with log_by_lua)[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = "hello world";[m
[31m-        ';[m
[31m-        echo_exec /foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello;[m
[31m-        log_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log eval[m
[31m-["lua release ngx.ctx at ref",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: set by lua file[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /lua {[m
[31m-        set_by_lua_file $res html/a.lua $arg_a $arg_b;[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return ngx.arg[1] + ngx.arg[2][m
[31m---- request[m
[31m-GET /lua?a=5&b=2[m
[31m---- response_body[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-[qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: simple set by lua[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /lua {[m
[31m-        set_by_lua $res "return 1+1";[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: lua_max_pending_timers - chained timers (non-zero delay) - not exceeding[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 1;[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0.01, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-decrementing the reference count for Lua VM: 3[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"trace: [m][f][g]",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: lua variable sharing via upvalue[m
[31m---- http_config[m
[31m-    lua_code_cache off;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local foo[m
[31m-            local function f()[m
[31m-                foo = 3[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.06)[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-registered timer[m
[31m-foo = 3[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-decrementing the reference count for Lua VM: 3[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: lua_max_running_timers (just not enough)[m
[31m---- http_config[m
[31m-    lua_max_running_timers 1;[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"1 lua_max_running_timers are not enough",[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"decrementing the reference count for Lua VM: 3",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: GC issue with the on_abort thread object[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.on_abort(function () end)[m
[31m-            collectgarbage()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- abort[m
[31m---- timeout: 0.2[m
[31m---- wait: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-decrementing the reference count for Lua VM: 2[m
[31m-decrementing the reference count for Lua VM: 3[m
[31m---- error_log eval[m
[31m-["decrementing the reference count for Lua VM: 1",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multiple parallel timers[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                fail("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, g)[m
[31m-            if not ok then[m
[31m-                fail("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-decrementing the reference count for Lua VM: 4[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"trace: [m][f][g]",[m
[31m-"decrementing the reference count for Lua VM: 3",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: cosocket connection pool timeout (after Lua VM destroys)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive(1)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-lua tcp socket keepalive max idle timeout[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qq{lua tcp socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"},[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: cosocket connection pool timeout (before Lua VM destroys)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive(1)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-    ngx.sleep(0.01)[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-[[m
[31m-qq{lua tcp socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"},[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive max idle timeout",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: lua_max_running_timers (just not enough, also low lua_max_pending_timers)[m
[31m---- http_config[m
[31m-    lua_max_running_timers 1;[m
[31m-    lua_max_pending_timers 10;[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-                collectgarbage()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"1 lua_max_running_timers are not enough",[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/\[alert\] \S+ lua_code_cache is off; this will hurt performance/,[m
[31m-"decrementing the reference count for Lua VM: 3",[m
[31m-"decrementing the reference count for Lua VM: 2",[m
[31m-"decrementing the reference count for Lua VM: 1",[m
[31m-"lua close the global Lua VM",[m
[31m-][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/026-mysql.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/026-mysql.t[m
[1mdeleted file mode 100644[m
[1mindex e14ffb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/026-mysql.t[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => blocks() * repeat_each() * 3;[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: when mysql query timed out, kill that query by Lua[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m---- config[m
[31m-    location = /mysql {[m
[31m-        #internal;[m
[31m-        drizzle_send_query_timeout 100ms;[m
[31m-        #drizzle_send_query_timeout 1s;[m
[31m-        drizzle_query $echo_request_body;[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        #error_page 504 /ret/504;[m
[31m-        rds_json on;[m
[31m-        more_set_headers -s 504 "X-Mysql-Tid: $drizzle_thread_id";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local sql = "select sleep(5)"[m
[31m-            local res = ngx.location.capture("/mysql",[m
[31m-                { method = ngx.HTTP_POST, body = sql })[m
[31m-[m
[31m-            ngx.say("status = " .. res.status)[m
[31m-[m
[31m-            local tid = res.header["X-Mysql-Tid"][m
[31m-            if tid == nil then[m
[31m-                ngx.say("thread id = nil")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            tid = tonumber(tid)[m
[31m-            ngx.say("thread id = " .. tid)[m
[31m-[m
[31m-            res = ngx.location.capture("/mysql",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = "kill query " .. tid })[m
[31m-[m
[31m-            ngx.say("kill status = " .. res.status)[m
[31m-            ngx.say("kill body = " .. res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body_like[m
[31m-^status = 504[m
[31m-thread id = \d+[m
[31m-kill status = 200[m
[31m-kill body = {"errcode":0}$[m
[31m---- error_log eval[m
[31m-qr{upstream timed out \(\d+: Connection timed out\) while sending query to drizzle upstream}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no error pages[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        drizzle_server 127.0.0.1:$TEST_NGINX_MYSQL_PORT protocol=mysql[m
[31m-                       dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        drizzle_keepalive max=300 mode=single overflow=ignore;[m
[31m-    }[m
[31m---- config[m
[31m-    location @err { echo Hi; }[m
[31m-    error_page 504 = @err;[m
[31m-    location = /mysql {[m
[31m-        #internal;[m
[31m-        drizzle_send_query_timeout 100ms;[m
[31m-        #drizzle_send_query_timeout 1s;[m
[31m-        drizzle_query $echo_request_body;[m
[31m-        drizzle_pass backend;[m
[31m-[m
[31m-        no_error_pages;[m
[31m-[m
[31m-        rds_json on;[m
[31m-        more_set_headers -s 504 "X-Mysql-Tid: $drizzle_thread_id";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local sql = "select sleep(3)"[m
[31m-            local res = ngx.location.capture("/mysql",[m
[31m-                { method = ngx.HTTP_POST, body = sql })[m
[31m-[m
[31m-            ngx.say("status = " .. res.status)[m
[31m-[m
[31m-            local tid = res.header["X-Mysql-Tid"][m
[31m-            if tid == nil then[m
[31m-                ngx.say("thread id = nil")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            tid = tonumber(tid)[m
[31m-            ngx.say("thread id = " .. tid)[m
[31m-[m
[31m-            res = ngx.location.capture("/mysql",[m
[31m-                { method = ngx.HTTP_POST,[m
[31m-                  body = "kill query " .. tid })[m
[31m-[m
[31m-            ngx.say("kill status = " .. res.status)[m
[31m-            ngx.say("kill body = " .. res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /lua[m
[31m---- response_body_like[m
[31m-^status = 504[m
[31m-thread id = \d+[m
[31m-kill status = 200[m
[31m-kill body = {"errcode":0}$[m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/027-multi-capture.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/027-multi-capture.t[m
[1mdeleted file mode 100644[m
[1mindex 3588c69..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/027-multi-capture.t[m
[1m+++ /dev/null[m
[36m@@ -1,755 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(10);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/([a-d])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = c[m
[31m-res4.status = 200[m
[31m-res4.body = d[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: capture multi in series[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("2 res1.status = " .. res1.status)[m
[31m-            ngx.say("2 res1.body = " .. res1.body)[m
[31m-            ngx.say("2 res2.status = " .. res2.status)[m
[31m-            ngx.say("2 res2.body = " .. res2.body)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-2 res1.status = 200[m
[31m-2 res1.body = a[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: capture multi in subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/foo?n=1")[m
[31m-            ngx.say("top res.status = " .. res.status)[m
[31m-            ngx.say("top res.body = [" .. res.body .. "]")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res.status = 200[m
[31m-top res.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: capture multi in parallel[m
[31m---- config[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-[m
[31m-            local n = ngx.var.arg_n[m
[31m-[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("top res1.status = " .. res1.status)[m
[31m-            ngx.say("top res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("top res2.status = " .. res2.status)[m
[31m-            ngx.say("top res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([abcd])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-top res1.status = 200[m
[31m-top res1.body = [1 res1.status = 200[m
[31m-1 res1.body = a[m
[31m-1 res2.status = 200[m
[31m-1 res2.body = b[m
[31m-][m
[31m-top res2.status = 200[m
[31m-top res2.body = [2 res1.status = 200[m
[31m-2 res1.body = c[m
[31m-2 res2.status = 200[m
[31m-2 res2.body = d[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: memc sanity[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/[ab]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: memc muti + multi[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo?n=1" },[m
[31m-                { "/bar?n=2" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = [" .. res1.body .. "]")[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = [" .. res2.body .. "]")[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/(foo|bar)$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            local res1, res2[m
[31m-            if ngx.var.tag == "foo" then[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/a" },[m
[31m-                    { "/b" },[m
[31m-                }[m
[31m-            else[m
[31m-                res1, res2 = ngx.location.capture_multi{[m
[31m-                    { "/c" },[m
[31m-                    { "/d" },[m
[31m-                }[m
[31m-            end[m
[31m-            print("args: " .. ngx.var.args)[m
[31m-            local n = ngx.var.arg_n[m
[31m-            ngx.say(n .. " res1.status = " .. res1.status)[m
[31m-            ngx.say(n .. " res1.body = " .. res1.body)[m
[31m-            ngx.say(n .. " res2.status = " .. res2.status)[m
[31m-            ngx.say(n .. " res2.body = " .. res2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/[abcd]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = [1 res1.status = 201[m
[31m-1 res1.body = STORED\r[m
[31m-[m
[31m-1 res2.status = 201[m
[31m-1 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-res2.status = 200[m
[31m-res2.body = [2 res1.status = 201[m
[31m-2 res1.body = STORED\r[m
[31m-[m
[31m-2 res2.status = 201[m
[31m-2 res2.body = STORED\r[m
[31m-[m
[31m-][m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: memc 4 concurrent requests[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2, res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/[a-d]$' {[m
[31m-        set $memc_key $uri;[m
[31m-        set $memc_value hello;[m
[31m-        set $memc_cmd set;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body eval[m
[31m-"res1.status = 201[m
[31m-res1.body = STORED\r[m
[31m-[m
[31m-res2.status = 201[m
[31m-res2.body = STORED\r[m
[31m-[m
[31m-res3.status = 201[m
[31m-res3.body = STORED\r[m
[31m-[m
[31m-res4.status = 201[m
[31m-res4.body = STORED\r[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: capture multi in series (more complex)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            local res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m-    location /a {[m
[31m-        echo -n a;[m
[31m-    }[m
[31m-    location /b {[m
[31m-        echo -n b;[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo" },[m
[31m-                { "/foo" },[m
[31m-            }[m
[31m-            local res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/foo" },[m
[31m-                { "/foo" },[m
[31m-            }[m
[31m-            ngx.print(res1.body)[m
[31m-            ngx.print(res2.body)[m
[31m-            ngx.print(res3.body)[m
[31m-            ngx.print(res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = a[m
[31m-res4.status = 200[m
[31m-res4.body = b[m
[31m-" x 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: capture multi in series (more complex, using memc)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/a" },[m
[31m-                { "/b" },[m
[31m-            }[m
[31m-            local res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/c" },[m
[31m-                { "/d" },[m
[31m-            }[m
[31m-            res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/e" },[m
[31m-                { "/f" },[m
[31m-            }[m
[31m-[m
[31m-            ngx.say("res1.status = " .. res1.status)[m
[31m-            ngx.say("res1.body = " .. res1.body)[m
[31m-            ngx.say("res2.status = " .. res2.status)[m
[31m-            ngx.say("res2.body = " .. res2.body)[m
[31m-            ngx.say("res3.status = " .. res3.status)[m
[31m-            ngx.say("res3.body = " .. res3.body)[m
[31m-            ngx.say("res4.status = " .. res4.status)[m
[31m-            ngx.say("res4.body = " .. res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_val;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([a-f])$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/memc?cmd=set&val=" .. ngx.var.tag)[m
[31m-            local res = ngx.location.capture("/memc?cmd=get&val=" .. ngx.var.tag)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/foo" },[m
[31m-                { "/foo" },[m
[31m-            }[m
[31m-            local res3, res4 = ngx.location.capture_multi{[m
[31m-                { "/foo" },[m
[31m-                { "/foo" },[m
[31m-            }[m
[31m-            ngx.print(res1.body)[m
[31m-            ngx.print(res2.body)[m
[31m-            ngx.print(res3.body)[m
[31m-            ngx.print(res4.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body2[m
[31m---- response_body eval[m
[31m-"res1.status = 200[m
[31m-res1.body = a[m
[31m-res2.status = 200[m
[31m-res2.body = b[m
[31m-res3.status = 200[m
[31m-res3.body = e[m
[31m-res4.status = 200[m
[31m-res4.body = f[m
[31m-" x 4[m
[31m---- no_error_log eval[m
[31m-["[error]", "[alert]"][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: a mixture of rewrite, access, content phases[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/a")[m
[31m-            print("rewrite a: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/b")[m
[31m-            print("rewrite b: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/c")[m
[31m-            print("rewrite c: " .. res.body)[m
[31m-        ';[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            local res = ngx.location.capture("/A")[m
[31m-            print("access A: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/B")[m
[31m-            print("access B: " .. res.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/d")[m
[31m-            ngx.say("content d: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/e")[m
[31m-            ngx.say("content e: " .. res.body)[m
[31m-[m
[31m-            res = ngx.location.capture("/f")[m
[31m-            ngx.say("content f: " .. res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_val;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([A-F])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([a-f])$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/memc?cmd=set&val=" .. ngx.var.tag)[m
[31m-            local res = ngx.location.capture("/memc?cmd=get&val=" .. ngx.var.tag)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-content d: d[m
[31m-content e: e[m
[31m-content f: f[m
[31m-[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/rewrite .+?(?= while )|access .+?(?=,)/[m
[31m---- grep_error_log_out[m
[31m-rewrite a: a[m
[31m-rewrite b: b[m
[31m-rewrite c: c[m
[31m-access A: A[m
[31m-access B: B[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: a mixture of rewrite, access, content phases[m
[31m---- config[m
[31m-    location /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local a, b, c = ngx.location.capture_multi{[m
[31m-                {"/a"}, {"/b"}, {"/c"},[m
[31m-            }[m
[31m-            print("rewrite a: " .. a.body)[m
[31m-            print("rewrite b: " .. b.body)[m
[31m-            print("rewrite c: " .. c.body)[m
[31m-        ';[m
[31m-[m
[31m-        access_by_lua '[m
[31m-            local A, B = ngx.location.capture_multi{[m
[31m-                {"/A"}, {"/B"},[m
[31m-            }[m
[31m-            print("access A: " .. A.body)[m
[31m-            print("access B: " .. B.body)[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local d, e, f = ngx.location.capture_multi{[m
[31m-                {"/d"}, {"/e"}, {"/f"},[m
[31m-            }[m
[31m-            ngx.say("content d: " .. d.body)[m
[31m-            ngx.say("content e: " .. e.body)[m
[31m-            ngx.say("content f: " .. f.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_key $arg_val;[m
[31m-        set $memc_value $arg_val;[m
[31m-        set $memc_cmd $arg_cmd;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([A-F])$' {[m
[31m-        echo -n $1;[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/([a-f])$' {[m
[31m-        set $tag $1;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/memc?cmd=set&val=" .. ngx.var.tag)[m
[31m-            local res = ngx.location.capture("/memc?cmd=get&val=" .. ngx.var.tag)[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- stap2[m
[31m-global delta = "  "[m
[31m-[m
[31m-M(http-subrequest-start) {[m
[31m-    r = $arg1[m
[31m-    n = ngx_http_subreq_depth(r)[m
[31m-    pr = ngx_http_req_parent(r)[m
[31m-    printf("%sbegin %s -> %s (%d)\n", ngx_indent(n, delta),[m
[31m-        ngx_http_req_uri(pr),[m
[31m-        ngx_http_req_uri(r),[m
[31m-        n)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    r = $r[m
[31m-    uri = ngx_http_req_uri(r)[m
[31m-    if (uri == "/main") {[m
[31m-        printf("run thread %s: %d\n", uri, $nret)[m
[31m-        #print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(http-lua-info) {[m
[31m-    uri = ngx_http_req_uri($r)[m
[31m-    #if (uri == "/main") {[m
[31m-    printf("XXX info: %s: %s", uri, user_string($arg1))[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    r = $r[m
[31m-    n = ngx_http_subreq_depth(r)[m
[31m-    pr = ngx_http_req_parent(r)[m
[31m-[m
[31m-    printf("%send %s -> %s (%d)\n", ngx_indent(n, delta),[m
[31m-        ngx_http_req_uri(r),[m
[31m-        ngx_http_req_uri(pr),[m
[31m-        n)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_handle_subreq_responses) {[m
[31m-    r = $r[m
[31m-    n = ngx_http_subreq_depth(r)[m
[31m-    printf("%shandle res %s (%d)\n", ngx_indent(n, delta), ngx_http_req_uri(r), n)[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-content d: d[m
[31m-content e: e[m
[31m-content f: f[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/rewrite .+?(?= while )|access .+?(?=,)/[m
[31m---- grep_error_log_out[m
[31m-rewrite a: a[m
[31m-rewrite b: b[m
[31m-rewrite c: c[m
[31m-access A: A[m
[31m-access B: B[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: proxy_cache_lock in subrequests[m
[31m---- http_config[m
[31m-proxy_cache_lock on;[m
[31m-proxy_cache_lock_timeout 100ms;[m
[31m-proxy_connect_timeout 300ms;[m
[31m-[m
[31m-proxy_cache_path conf/cache levels=1:2 keys_zone=STATIC:10m inactive=10m max_size=1m;[m
[31m-[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/proxy" },[m
[31m-                { "/proxy" },[m
[31m-                { "/proxy" },[m
[31m-                { "/proxy" },[m
[31m-            }[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /proxy {[m
[31m-            proxy_cache STATIC;[m
[31m-            proxy_pass http://agentzh.org:12345;[m
[31m-            proxy_cache_key $proxy_host$uri$args;[m
[31m-            proxy_cache_valid any 1s;[m
[31m-            #proxy_http_version 1.1;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/028-req-header.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/028-req-header.t[m
[1mdeleted file mode 100644[m
[1mindex fd13cba..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/028-req-header.t[m
[1m+++ /dev/null[m
[36m@@ -1,1584 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (2 * blocks() + 28);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: random access req headers[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Foo: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-            ngx.say("Bar: ", ngx.req.get_headers()["Bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-lua exceeding request header limit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: iterating through headers[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        content_by_lua '[m
[31m-            local h = {}[m
[31m-            for k, v in pairs(ngx.req.get_headers(nil, true)) do[m
[31m-                h[k] = v[m
[31m-            end[m
[31m-            ngx.say("Foo: ", h["Foo"] or "nil")[m
[31m-            ngx.say("Bar: ", h["Bar"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set input header[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Foo", "new value");[m
[31m-        ';[m
[31m-[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: new value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: clear input header[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Foo", nil);[m
[31m-        ';[m
[31m-[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Foo: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: rewrite content length[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Content-Length", 2048)[m
[31m-        ';[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /bar\n" .[m
[31m-"a" x 4096[m
[31m---- response_body eval[m
[31m-"a" x 2048[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: rewrite content length (normalized form)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("content-length", 2048)[m
[31m-        ';[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /bar\n" .[m
[31m-"a" x 4096[m
[31m---- response_body eval[m
[31m-"a" x 2048[m
[31m---- timeout: 15[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: rewrite host and user-agent[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Host", "foo")[m
[31m-            ngx.req.set_header("User-Agent", "blah")[m
[31m-        ';[m
[31m-        echo "Host: $host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Host: foo[m
[31m-User-Agent: blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear host and user-agent[m
[31m-$host always has a default value and cannot be really cleared.[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Host", nil)[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-        ';[m
[31m-        echo "Host: $host";[m
[31m-        echo "Host (2): $http_host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Host: localhost[m
[31m-Host (2): [m
[31m-User-Agent: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: clear host and user-agent (the other way)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Host")[m
[31m-            ngx.req.clear_header("User-Agent")[m
[31m-            ngx.req.clear_header("X-Foo")[m
[31m-        ';[m
[31m-        echo "Host: $host";[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-        echo "X-Foo: $http_x_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- more_headers[m
[31m-X-Foo: bar[m
[31m---- response_body[m
[31m-Host: localhost[m
[31m-User-Agent: [m
[31m-X-Foo: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: clear content-length[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.clear_header("Content-Length")[m
[31m-        ';[m
[31m-        echo "Content-Length: $http_content_length";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m---- response_body[m
[31m-Content-Length: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: rewrite type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.set_header("Content-Type", "text/css")[m
[31m-        ';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: text/css[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: clear type[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.clear_header("Content-Type")[m
[31m-        ';[m
[31m-        echo "Content-Type: $content_type";[m
[31m-    }[m
[31m---- request[m
[31m-POST /bar[m
[31m-hello[m
[31m---- more_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-Content-Type: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: add multiple request headers[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.set_header("Foo", {"a", "b"})[m
[31m-        ';[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-Foo: a[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: add multiple request headers[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        access_by_lua '[m
[31m-            ngx.req.set_header("Foo", {"a", "abc"})[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body_like chomp[m
[31m-\bFoo: a\r\n.*?\bFoo: abc\b[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set_header and clear_header should refresh ngx.req.get_headers() automatically[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Foo: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-[m
[31m-            ngx.req.set_header("Foo", 32)[m
[31m-            ngx.say("Foo 1: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-[m
[31m-            ngx.req.set_header("Foo", "abc")[m
[31m-            ngx.say("Foo 2: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-[m
[31m-            ngx.req.clear_header("Foo")[m
[31m-            ngx.say("Foo 3: ", ngx.req.get_headers()["Foo"] or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-Foo: foo[m
[31m-Foo 1: 32[m
[31m-Foo 2: abc[m
[31m-Foo 3: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: duplicate req headers[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage()[m
[31m-            local vals = ngx.req.get_headers()["Foo"][m
[31m-            ngx.say("value is of type ", type(vals), ".")[m
[31m-            if type(vals) == "table" then[m
[31m-                ngx.say("Foo takes ", #vals or "nil", " values.")[m
[31m-                ngx.say("They are ", table.concat(vals, ", "), ".")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Foo: bar[m
[31m-Foo: baz[m
[31m---- request[m
[31m-    GET /foo[m
[31m---- response_body[m
[31m-value is of type table.[m
[31m-Foo takes 3 values.[m
[31m-They are foo, bar, baz.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: Accept-Encoding (scalar)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        default_type 'text/plain';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Accept-Encoding", "gzip")[m
[31m-        ';[m
[31m-        gzip on;[m
[31m-        gzip_min_length  1;[m
[31m-        gzip_buffers     4 8k;[m
[31m-        gzip_types       text/plain;[m
[31m-    }[m
[31m---- user_files[m
[31m-">>> bar[m
[31m-" . ("hello" x 512)[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- response_body_like: .{20}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: Accept-Encoding (table)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        default_type 'text/plain';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Accept-Encoding", {"gzip"})[m
[31m-        ';[m
[31m-        gzip on;[m
[31m-        gzip_min_length  1;[m
[31m-        gzip_buffers     4 8k;[m
[31m-        gzip_types       text/plain;[m
[31m-    }[m
[31m---- user_files[m
[31m-">>> bar[m
[31m-" . ("hello" x 512)[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- response_body_like: .{20}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: default max 100 headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(headers) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, ": ", headers[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers eval[m
[31m-my $i = 1;[m
[31m-my $s;[m
[31m-while ($i <= 102) {[m
[31m-    $s .= "X-$i:$i\n";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 98) {[m
[31m-    push @k, "x-$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-push @k, "connection: close\n";[m
[31m-push @k, "host: localhost\n";[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= ": $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua exceeding request header limit 100[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: custom max 102 headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers(102)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(headers) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, ": ", headers[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers eval[m
[31m-my $i = 1;[m
[31m-my $s;[m
[31m-while ($i <= 103) {[m
[31m-    $s .= "X-$i:$i\n";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 100) {[m
[31m-    push @k, "x-$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-push @k, "connection: close\n";[m
[31m-push @k, "host: localhost\n";[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= ": $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua exceeding request header limit 102[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: custom unlimited headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers(0)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(headers) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, ": ", headers[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers eval[m
[31m-my $s;[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    $s .= "X-$i:$i\n";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    push @k, "x-$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-push @k, "connection: close\n";[m
[31m-push @k, "host: localhost\n";[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= ": $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: modify subrequest req headers should not affect the parent[m
[31m---- config[m
[31m-    location = /main {[m
[31m-        rewrite_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            print("subrequest: ", res.status)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("foo121", 121)[m
[31m-            ngx.req.set_header("foo122", 122)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        #echo $echo_client_request_headers;[m
[31m-        echo "foo121: [$http_foo121]";[m
[31m-        echo "foo122: [$http_foo122]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Bar: bar[m
[31m-Foo1: foo1[m
[31m-Foo2: foo2[m
[31m-Foo3: foo3[m
[31m-Foo4: foo4[m
[31m-Foo5: foo5[m
[31m-Foo6: foo6[m
[31m-Foo7: foo7[m
[31m-Foo8: foo8[m
[31m-Foo9: foo9[m
[31m-Foo10: foo10[m
[31m-Foo11: foo11[m
[31m-Foo12: foo12[m
[31m-Foo13: foo13[m
[31m-Foo14: foo14[m
[31m-Foo15: foo15[m
[31m-Foo16: foo16[m
[31m-Foo17: foo17[m
[31m-Foo18: foo18[m
[31m-Foo19: foo19[m
[31m-Foo20: foo20[m
[31m---- response_body[m
[31m-Foo: [][m
[31m-Bar: [][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: clear_header should clear all the instances of the user custom header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Foo")[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo "Foo: [$http_foo]";[m
[31m-        echo "Test-Header: [$http_test_header]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Foo: foo[m
[31m-Foo: bah[m
[31m-Test-Header: 1[m
[31m---- response_body[m
[31m-Foo: [][m
[31m-Test-Header: [1][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: clear_header should clear all the instances of the builtin header[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Content-Type")[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo "Content-Type: [$http_content_type]";[m
[31m-        echo "Test-Header: [$http_test_header]";[m
[31m-        #echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Content-Type: foo[m
[31m-Content-Type: bah[m
[31m-Test-Header: 1[m
[31m---- response_body[m
[31m-Content-Type: [][m
[31m-Test-Header: [1][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: Converting POST to GET - clearing headers (bug found by Matthieu Tourne, 411 error page)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Content-Type")[m
[31m-            ngx.req.clear_header("Content-Length")[m
[31m-        ';[m
[31m-[m
[31m-        #proxy_pass http://127.0.0.1:8888;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Content-Type: application/ocsp-request[m
[31m-Test-Header: 1[m
[31m---- response_body_like eval[m
[31m-qr/Connection: close\r[m
[31m-Test-Header: 1\r[m
[31m-\r[m
[31m-$/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: clear_header() does not duplicate subsequent headers (old bug)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("Foo")[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Bah: bah[m
[31m-Foo: foo[m
[31m-Test-Header: 1[m
[31m-Foo1: foo1[m
[31m-Foo2: foo2[m
[31m-Foo3: foo3[m
[31m-Foo4: foo4[m
[31m-Foo5: foo5[m
[31m-Foo6: foo6[m
[31m-Foo7: foo7[m
[31m-Foo8: foo8[m
[31m-Foo9: foo9[m
[31m-Foo10: foo10[m
[31m-Foo11: foo11[m
[31m-Foo12: foo12[m
[31m-Foo13: foo13[m
[31m-Foo14: foo14[m
[31m-Foo15: foo15[m
[31m-Foo16: foo16[m
[31m-Foo17: foo17[m
[31m-Foo18: foo18[m
[31m-Foo19: foo19[m
[31m-Foo20: foo20[m
[31m-Foo21: foo21[m
[31m-Foo22: foo22[m
[31m---- response_body_like eval[m
[31m-qr/Bah: bah\r[m
[31m-Test-Header: 1\r[m
[31m-Foo1: foo1\r[m
[31m-Foo2: foo2\r[m
[31m-Foo3: foo3\r[m
[31m-Foo4: foo4\r[m
[31m-Foo5: foo5\r[m
[31m-Foo6: foo6\r[m
[31m-Foo7: foo7\r[m
[31m-Foo8: foo8\r[m
[31m-Foo9: foo9\r[m
[31m-Foo10: foo10\r[m
[31m-Foo11: foo11\r[m
[31m-Foo12: foo12\r[m
[31m-Foo13: foo13\r[m
[31m-Foo14: foo14\r[m
[31m-Foo15: foo15\r[m
[31m-Foo16: foo16\r[m
[31m-Foo17: foo17\r[m
[31m-Foo18: foo18\r[m
[31m-Foo19: foo19\r[m
[31m-Foo20: foo20\r[m
[31m-Foo21: foo21\r[m
[31m-Foo22: foo22\r[m
[31m-/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: iterating through headers (raw form)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local h = {}[m
[31m-            local arr = {}[m
[31m-            for k, v in pairs(ngx.req.get_headers(nil, true)) do[m
[31m-                h[k] = v[m
[31m-                table.insert(arr, k)[m
[31m-            end[m
[31m-            table.sort(arr)[m
[31m-            for i, k in ipairs(arr) do[m
[31m-                ngx.say(k, ": ", h[k])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-My-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Bar: baz[m
[31m-Connection: close[m
[31m-Host: localhost[m
[31m-My-Foo: bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: __index metamethod not working for "raw" mode[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local h = ngx.req.get_headers(nil, true)[m
[31m-            ngx.say("My-Foo-Header: ", h.my_foo_header)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-My-Foo-Header: Hello World[m
[31m---- response_body[m
[31m-My-Foo-Header: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: __index metamethod not working for the default mode[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local h = ngx.req.get_headers()[m
[31m-            ngx.say("My-Foo-Header: ", h.my_foo_header)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-My-Foo-Header: Hello World[m
[31m---- response_body[m
[31m-My-Foo-Header: Hello World[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: clear input header (just more than 20 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua 'ngx.req.clear_header("R")';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-Q: q\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: clear input header (just more than 20 headers, and add more)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("R")[m
[31m-            for i = 1, 21 do[m
[31m-                ngx.req.set_header("foo-" .. i, i)[m
[31m-            end[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-Q: q\r[m
[31m-foo-1: 1\r[m
[31m-foo-2: 2\r[m
[31m-foo-3: 3\r[m
[31m-foo-4: 4\r[m
[31m-foo-5: 5\r[m
[31m-foo-6: 6\r[m
[31m-foo-7: 7\r[m
[31m-foo-8: 8\r[m
[31m-foo-9: 9\r[m
[31m-foo-10: 10\r[m
[31m-foo-11: 11\r[m
[31m-foo-12: 12\r[m
[31m-foo-13: 13\r[m
[31m-foo-14: 14\r[m
[31m-foo-15: 15\r[m
[31m-foo-16: 16\r[m
[31m-foo-17: 17\r[m
[31m-foo-18: 18\r[m
[31m-foo-19: 19\r[m
[31m-foo-20: 20\r[m
[31m-foo-21: 21\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: clear input header (just more than 21 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("R")[m
[31m-            ngx.req.clear_header("Q")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: clear input header (just more than 21 headers)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.clear_header("R")[m
[31m-            ngx.req.clear_header("Q")[m
[31m-            for i = 1, 21 do[m
[31m-                ngx.req.set_header("foo-" .. i, i)[m
[31m-            end[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Host foo;[m
[31m-        #proxy_pass http://127.0.0.1:1234/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-[m
[31m-for my $i ('a' .. 'r') {[m
[31m-    $s .= uc($i) . ": " . "$i\n"[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /back HTTP/1.0\r[m
[31m-Host: foo\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-A: a\r[m
[31m-B: b\r[m
[31m-C: c\r[m
[31m-D: d\r[m
[31m-E: e\r[m
[31m-F: f\r[m
[31m-G: g\r[m
[31m-H: h\r[m
[31m-I: i\r[m
[31m-J: j\r[m
[31m-K: k\r[m
[31m-L: l\r[m
[31m-M: m\r[m
[31m-N: n\r[m
[31m-O: o\r[m
[31m-P: p\r[m
[31m-foo-1: 1\r[m
[31m-foo-2: 2\r[m
[31m-foo-3: 3\r[m
[31m-foo-4: 4\r[m
[31m-foo-5: 5\r[m
[31m-foo-6: 6\r[m
[31m-foo-7: 7\r[m
[31m-foo-8: 8\r[m
[31m-foo-9: 9\r[m
[31m-foo-10: 10\r[m
[31m-foo-11: 11\r[m
[31m-foo-12: 12\r[m
[31m-foo-13: 13\r[m
[31m-foo-14: 14\r[m
[31m-foo-15: 15\r[m
[31m-foo-16: 16\r[m
[31m-foo-17: 17\r[m
[31m-foo-18: 18\r[m
[31m-foo-19: 19\r[m
[31m-foo-20: 20\r[m
[31m-foo-21: 21\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: raw form[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-           -- get ALL the raw headers (0 == no limit, not recommended)[m
[31m-           local h = {}[m
[31m-           local arr = {}[m
[31m-           for k, v in pairs(ngx.req.get_headers(0, true)) do[m
[31m-               h[k] = v[m
[31m-               table.insert(arr, k)[m
[31m-           end[m
[31m-           table.sort(arr)[m
[31m-           for i, k in ipairs(arr) do[m
[31m-               ngx.say(k, ": ", h[k])[m
[31m-           end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-My-Foo: bar[m
[31m-Bar: baz[m
[31m---- response_body[m
[31m-Bar: baz[m
[31m-Connection: close[m
[31m-Host: localhost[m
[31m-My-Foo: bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: clear X-Real-IP[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("X-Real-IP", nil)[m
[31m-        ';[m
[31m-        echo "X-Real-IP: $http_x_real_ip";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-X-Real-IP: 8.8.8.8[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("rewrite: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("content: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("content: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: x-real-ip: 8.8.8.8[m
[31m-content: no x-real-ip[m
[31m-[m
[31m---- response_body[m
[31m-X-Real-IP: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: set custom X-Real-IP[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("X-Real-IP", "8.8.4.4")[m
[31m-        ';[m
[31m-        echo "X-Real-IP: $http_x_real_ip";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("rewrite: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no x-real-ip")[m
[31m-    }[m
[31m-[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->x_real_ip) && $r->headers_in->x_real_ip) {[m
[31m-        printf("content: x-real-ip: %s\n",[m
[31m-               user_string_n($r->headers_in->x_real_ip->value->data,[m
[31m-                             $r->headers_in->x_real_ip->value->len))[m
[31m-    } else {[m
[31m-        println("content: no x-real-ip")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: no x-real-ip[m
[31m-content: x-real-ip: 8.8.4.4[m
[31m-[m
[31m---- response_body[m
[31m-X-Real-IP: 8.8.4.4[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: clear Via[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Via", nil)[m
[31m-        ';[m
[31m-        echo "Via: $http_via";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("rewrite: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("content: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("content: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-content: no via[m
[31m-[m
[31m---- response_body[m
[31m-Via: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: set custom Via[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Via", "1.0 fred, 1.1 nowhere.com (Apache/1.1)")[m
[31m-        ';[m
[31m-        echo "Via: $http_via";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("rewrite: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("rewrite: no via")[m
[31m-    }[m
[31m-[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    if (@defined($r->headers_in->via) && $r->headers_in->via) {[m
[31m-        printf("content: via: %s\n",[m
[31m-               user_string_n($r->headers_in->via->value->data,[m
[31m-                             $r->headers_in->via->value->len))[m
[31m-    } else {[m
[31m-        println("content: no via")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: no via[m
[31m-content: via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- response_body[m
[31m-Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: set input header (with underscores in the header name)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("foo_bar", "some value");[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-    location = /back {[m
[31m-        echo -n $echo_client_request_headers;[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m---- response_body_like eval[m
[31m-qr{^GET /back HTTP/1.0\r[m
[31m-Host: 127.0.0.1:\d+\r[m
[31m-Connection: close\r[m
[31m-foo_bar: some value\r[m
[31m-\r[m
[31m-$}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: HTTP 0.9 (set & get)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("X-Foo", "howdy");[m
[31m-            ngx.say("X-Foo: ", ngx.req.get_headers()["X-Foo"])[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-X-Foo: nil[m
[31m---- http09[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: HTTP 0.9 (clear)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("X-Foo", "howdy");[m
[31m-            ngx.say("X-Foo: ", ngx.req.get_headers()["X-Foo"])[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /foo\r\n"[m
[31m---- response_headers[m
[31m-! X-Foo[m
[31m---- response_body[m
[31m-X-Foo: nil[m
[31m---- http09[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: Host header with port and $host (github issue #292)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Host", "agentzh.org:1984")[m
[31m-        ';[m
[31m-        echo "host var: $host";[m
[31m-        echo "http_host var: $http_host";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-host var: agentzh.org[m
[31m-http_host var: agentzh.org:1984[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: Host header with upper case letters and $host (github issue #292)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Host", "agentZH.org:1984")[m
[31m-        ';[m
[31m-        echo "host var: $host";[m
[31m-        echo "http_host var: $http_host";[m
[31m-    }[m
[31m---- request[m
[31m-GET /bar[m
[31m---- response_body[m
[31m-host var: agentzh.org[m
[31m-http_host var: agentZH.org:1984[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: clear all and re-insert[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local headers = ngx.req.get_headers(100, true)[m
[31m-            local n = 0[m
[31m-            for header, _ in pairs(headers) do[m
[31m-                n = n + 1[m
[31m-                ngx.req.clear_header(header)[m
[31m-            end[m
[31m-            ngx.say("got ", n, " headers")[m
[31m-            local i = 0[m
[31m-            for header, value in pairs(headers) do[m
[31m-                i = i + 1[m
[31m-                print("1: reinsert header ", header, ": ", i)[m
[31m-                ngx.req.set_header(header, value)[m
[31m-            end[m
[31m-            local headers = ngx.req.get_headers(100, true)[m
[31m-            n = 0[m
[31m-            for header, _ in pairs(headers) do[m
[31m-                n = n + 1[m
[31m-                ngx.req.clear_header(header)[m
[31m-            end[m
[31m-            ngx.say("got ", n, " headers")[m
[31m-            -- do return end[m
[31m-            local i = 0[m
[31m-            for header, value in pairs(headers) do[m
[31m-                i = i + 1[m
[31m-                if i > 8 then[m
[31m-                    break[m
[31m-                end[m
[31m-                print("2: reinsert header ", header, ": ", i)[m
[31m-                ngx.req.set_header(header, value)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Cache-Control: max-age=0\r[m
[31m-Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36\r[m
[31m-Accept-Encoding: gzip,deflate,sdch\r[m
[31m-Accept-Language: en-US,en;q=0.8\r[m
[31m-Cookie: test=cookie;\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body[m
[31m-got 8 headers[m
[31m-got 8 headers[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: github issue #314: ngx.req.set_header does not override request headers with multiple values[m
[31m---- config[m
[31m-    #lua_code_cache off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_header("AAA", "111")[m
[31m-            local headers = ngx.req.get_headers()[m
[31m-            ngx.say(headers["AAA"])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-AAA: 123[m
[31m-AAA: 456[m
[31m-AAA: 678[m
[31m-[m
[31m---- response_body[m
[31m-111[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: clear If-Match req header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.clear_header("if-match")[m
[31m-            if not ngx.send_headers() then[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-Match: abc[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: clear If-Unmodified-Since req header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.clear_header("if-unmodified-since")[m
[31m-            ngx.header["Last-Modified"] = "Tue, 30 Jun 2011 12:16:36 GMT"[m
[31m-            if not ngx.send_headers() then[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Tue, 28 Jun 2011 12:16:36 GMT[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: clear If-None-Match req header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.clear_header("if-none-match")[m
[31m-            -- ngx.header["etags"] = "abc"[m
[31m-            if not ngx.send_headers() then[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("test")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: *[m
[31m---- response_body[m
[31m-test[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: set the Destination request header for WebDav[m
[31m---- config[m
[31m-    location = /a.txt {[m
[31m-        rewrite_by_lua_block {[m
[31m-            ngx.req.set_header("Destination", "/b.txt")[m
[31m-        }[m
[31m-        dav_methods MOVE;[m
[31m-        dav_access            all:rw;[m
[31m-        root                  html;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-hello, world![m
[31m-[m
[31m---- request[m
[31m-MOVE /a.txt[m
[31m-[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-client sent no "Destination" header[m
[31m-[error][m
[31m---- error_code: 204[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: X-Forwarded-For[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_by_lua_block {[m
[31m-            ngx.req.set_header("X-Forwarded-For", "8.8.8.8")[m
[31m-        }[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Foo $proxy_add_x_forwarded_for;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-Foo: 8.8.8.8, 127.0.0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: X-Forwarded-For[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        access_by_lua_block {[m
[31m-            ngx.req.clear_header("X-Forwarded-For")[m
[31m-        }[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        proxy_set_header Foo $proxy_add_x_forwarded_for;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo "Foo: $http_foo";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-X-Forwarded-For: 8.8.8.8[m
[31m---- response_body[m
[31m-Foo: 127.0.0.1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/029-http-time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/029-http-time.t[m
[1mdeleted file mode 100644[m
[1mindex 71a7758..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/029-http-time.t[m
[1m+++ /dev/null[m
[36m@@ -1,88 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: http_time in content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.http_time(1290079655))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Thu, 18 Nov 2010 11:27:35 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http_time in set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $a '[m
[31m-            return ngx.http_time(1290079655)[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Thu, 18 Nov 2010 11:27:35 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: parse_http_time in set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $a '[m
[31m-            return ngx.parse_http_time("Thu, 18 Nov 2010 11:27:35 GMT")[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1290079655[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: parse_http_time in content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.parse_http_time("Thu, 18 Nov 2010 11:27:35 GMT"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1290079655[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad arg for parse_http_time in content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.parse_http_time("abc") or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/030-uri-args.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/030-uri-args.t[m
[1mdeleted file mode 100644[m
[1mindex 2f18ba7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/030-uri-args.t[m
[1m+++ /dev/null[m
[36m@@ -1,1392 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 17);[m
[31m-[m
[31m-no_root_location();[m
[31m-[m
[31m-#no_shuffle();[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=3&b=4&c[m
[31m---- response_body[m
[31m-a = 3[m
[31m-b = 4[m
[31m-c = true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: args take no value[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo&baz=&bar=42[m
[31m---- response_body[m
[31m-bar = 42[m
[31m-baz = [m
[31m-foo = true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: arg key and value escaped[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("again...")[m
[31m-[m
[31m-            args = ngx.req.get_uri_args()[m
[31m-            keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?%3d&b%20r=4%61+2[m
[31m---- response_body[m
[31m-= = true[m
[31m-b r = 4a 2[m
[31m-again...[m
[31m-= = true[m
[31m-b r = 4a 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: empty[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: empty arg, but with = and &[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?=&&[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multi-value keys[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                local val = args[key][m
[31m-                if type(val) == "table" then[m
[31m-                    ngx.say(key, " = [", table.concat(val, ", "), "]")[m
[31m-                else[m
[31m-                    ngx.say(key, " = ", val)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=32&foo==&foo=baz[m
[31m---- response_body[m
[31m-foo = [32, =, baz][m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multi-value keys[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                local val = args[key][m
[31m-                if type(val) == "table" then[m
[31m-                    ngx.say(key, " = [", table.concat(val, ", "), "]")[m
[31m-                else[m
[31m-                    ngx.say(key, " = ", val)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=32&foo==&bar=baz[m
[31m---- response_body[m
[31m-bar = baz[m
[31m-foo = [32, =][m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: empty arg[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            -- ngx.say(args)[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?&=[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: = in value[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            -- ngx.say(args)[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo===[m
[31m---- response_body[m
[31m-foo = ==[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: empty key, but non-emtpy values[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?=hello&=world[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: updating args with $args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("updating args...")[m
[31m-[m
[31m-            ngx.var.args = "a=3&b=4"[m
[31m-[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=bar[m
[31m---- response_body[m
[31m-foo = bar[m
[31m-updating args...[m
[31m-a = 3[m
[31m-b = 4[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: rewrite uri and args[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar", true);[m
[31m-        ';[m
[31m-        proxy_pass http://agentzh.org:12345;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua set uri jump to "/bar"[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: rewrite args (not break cycle by default)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo "bar: $uri?$args";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar", true)[m
[31m-        ';[m
[31m-        echo "foo: $uri?$args";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-bar: /bar?hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: rewrite (not break cycle explicitly)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo "bar: $uri?$args";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar", true)[m
[31m-        ';[m
[31m-        echo "foo: $uri?$args";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-bar: /bar?hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: rewrite (break cycle explicitly)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo "bar: $uri?$args";[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-        ';[m
[31m-        echo "foo: $uri?$args";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-foo: /bar?hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: rewrite uri (zero-length)[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            local res, err = pcall(ngx.req.set_uri, "")[m
[31m-            print("rewrite: err: ", err)[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo: ", ngx.var.uri, "?", ngx.var.args)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-foo: /foo?world[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/rewrite: .+?(?=,)/[m
[31m---- grep_error_log_out[m
[31m-rewrite: err: attempt to use zero-length uri[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: rewrite uri and args[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-HTTP/1.0 hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: rewrite uri and args (table args)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-            ngx.req.set_uri_args({["ca t"] = "%"})[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-HTTP/1.0 ca%20t=%25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: rewrite uri and args (never returns)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args("hello")[m
[31m-            ngx.req.set_uri("/bar", true);[m
[31m-            ngx.exit(503)[m
[31m-        ';[m
[31m-        proxy_pass http://agentzh.org:12345;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.req.set_uri with jump not allowed in access phase[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        set $err '';[m
[31m-        access_by_lua '[m
[31m-            res, err = pcall(ngx.req.set_uri, "/bar", true);[m
[31m-            ngx.var.err = err[m
[31m-        ';[m
[31m-        echo "err: $err";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-err: API disabled in the context of access_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.req.set_uri without jump allowed in access phase[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        set $err '';[m
[31m-        access_by_lua '[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        echo "uri: $uri";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-uri: /bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx.req.set_uri with jump not allowed in content phase[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        content_by_lua '[m
[31m-            res, err = pcall(ngx.req.set_uri, "/bar", true);[m
[31m-            ngx.say("err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-err: API disabled in the context of content_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.req.set_uri without jump allowed in content phase[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        set $err '';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-            ngx.say("uri: ", ngx.var.uri)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-uri: /bar[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx.req.set_uri with jump not allowed in set_by_lua[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #set $args 'hello';[m
[31m-        set_by_lua $err '[m
[31m-            res, err = pcall(ngx.req.set_uri, "/bar", true);[m
[31m-            return err[m
[31m-        ';[m
[31m-        echo "err: $err";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-err: API disabled in the context of set_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx.encode_args (sanity)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {a = "bar", b = "foo"}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a=bar&b=foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: ngx.encode_args (empty table)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {a = nil}[m
[31m-            ngx.say("args:" .. ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-args:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx.encode_args (value is table)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {a = {9, 2}, b = 3}[m
[31m-            ngx.say("args:" .. ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^args:[m
[31m-    (?= .*? \b a=9 \b )  # 3 chars[m
[31m-    (?= .*? \b a=2 \b )  # 3 chars[m
[31m-    (?= .*? \b b=3 \b )  # 3 chars[m
[31m-    (?= (?: [^&]+ & ){2} [^&]+ $ )  # requires exactly 2 &'s[m
[31m-    (?= .{11} $ )  # requires for total 11 chars (exactly) in the string[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx.encode_args (boolean values)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {a = true, foo = 3}[m
[31m-            ngx.say("args: " .. ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-^args: (?:a&foo=3|foo=3&a)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: ngx.encode_args (boolean values, false)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {a = false, foo = 3}[m
[31m-            ngx.say("args: " .. ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-args: foo=3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: boolean values in ngx.encode_args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {bar = {32, true}, foo = 3}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b bar=32 \b )     # 6 chars[m
[31m-    (?= .*? \b bar (?!=) \b )  # 3 chars[m
[31m-    (?= .*? \b foo=3 \b )      # 5 chars[m
[31m-    (?= (?: [^&]+ & ){2} [^&]+ $ )  # requires exactly 2 &'s[m
[31m-    (?= .{16} $ )  # requires for total 16 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: ngx.encode_args (bad user data value)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {bar = ngx.shared.dogs, foo = 3}[m
[31m-            rc, err = pcall(ngx.encode_args, t)[m
[31m-            ngx.say("rc: ", rc, ", err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-rc: false, err: attempt to use userdata as query arg value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: ngx.encode_args (empty table)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t = {}[m
[31m-            ngx.say("args: ", ngx.encode_args(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-args: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: ngx.encode_args (bad arg)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local rc, err = pcall(ngx.encode_args, true)[m
[31m-            ngx.say("rc: ", rc, ", err: ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-rc: false, err: bad argument #1 to '?' (table expected, got boolean)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: max args (limited after normal key=value)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=3&bar=4&baz=2[m
[31m---- response_body[m
[31m-bar = 4[m
[31m-foo = 3[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: max args (limited after an orphan key)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=3&bar&baz=2[m
[31m---- response_body[m
[31m-bar = true[m
[31m-foo = 3[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: max args (limited after an empty key, but non-emtpy values)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?foo=3&=hello&=world[m
[31m---- response_body[m
[31m-foo = 3[m
[31m-done[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: default max 100 args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "GET /lua?";[m
[31m-my $i = 1;[m
[31m-while ($i <= 102) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 100) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua hit query args limit 100[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: custom max 102 args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(102)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "GET /lua?";[m
[31m-my $i = 1;[m
[31m-while ($i <= 103) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 102) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua hit query args limit 102[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: custom unlimited args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_uri_args(0)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "GET /lua?";[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: rewrite uri and args (multi-value args)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args({a = 3, b = {5, 6}})[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body[m
[31m-HTTP/1.0 a=3&b=5&b=6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: ngx.decode_args (sanity)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=bar&b=foo"[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = bar[m
[31m-b = foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: ngx.decode_args (multi-value)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=bar&b=foo&a=baz"[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("a = ", table.concat(args.a, ", "))[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = bar, baz[m
[31m-b = foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: ngx.decode_args (empty string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = ""[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("n = ", #args)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-n = 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: ngx.decode_args (boolean args)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a&b"[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = true[m
[31m-b = true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: ngx.decode_args (empty value args)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=&b="[m
[31m-            args = ngx.decode_args(args)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = [m
[31m-b = [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: ngx.decode_args (max_args = 1)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=bar&b=foo"[m
[31m-            args = ngx.decode_args(args, 1)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = bar[m
[31m-b = nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: ngx.decode_args (max_args = -1)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local args = "a=bar&b=foo"[m
[31m-            args = ngx.decode_args(args, -1)[m
[31m-            ngx.say("a = ", args.a)[m
[31m-            ngx.say("b = ", args.b)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-a = bar[m
[31m-b = foo[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: ngx.decode_args should not modify lua strings in place[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local s = "f+f=bar&B=foo"[m
[31m-            args = ngx.decode_args(s)[m
[31m-            local arr = {}[m
[31m-            for k, v in pairs(args) do[m
[31m-                table.insert(arr, k)[m
[31m-            end[m
[31m-            table.sort(arr)[m
[31m-            for i, k in ipairs(arr) do[m
[31m-                ngx.say("key: ", k)[m
[31m-            end[m
[31m-            ngx.say("s = ", s)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-key: B[m
[31m-key: f f[m
[31m-s = f+f=bar&B=foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: ngx.decode_args should not modify lua strings in place (sample from Xu Jian)[m
[31m---- config[m
[31m-    lua_need_request_body on;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            function split(s, delimiter)[m
[31m-                local result = {}[m
[31m-                local from = 1[m
[31m-                local delim_from, delim_to = string.find(s, delimiter, from)[m
[31m-                while delim_from do[m
[31m-                    table.insert(result, string.sub(s, from, delim_from - 1))[m
[31m-                    from = delim_to + 1[m
[31m-                    delim_from, delim_to = string.find(s, delimiter, from)[m
[31m-                end[m
[31m-                table.insert(result, string.sub(s, from))[m
[31m-                return result[m
[31m-            end[m
[31m-[m
[31m-            local post_data = ngx.req.get_body_data()[m
[31m-[m
[31m-            local commands = split(post_data, "||")[m
[31m-            for _, command in pairs(commands) do[m
[31m-                --command = ngx.unescape_uri(command)[m
[31m-                local request_args = ngx.decode_args(command, 0)[m
[31m-                local arr = {}[m
[31m-                for k, v in pairs(request_args) do[m
[31m-                    table.insert(arr, k)[m
[31m-                end[m
[31m-                table.sort(arr)[m
[31m-                for i, k in ipairs(arr) do[m
[31m-                    ngx.say(k, ": ", request_args[k])[m
[31m-                end[m
[31m-                ngx.say(" ===============")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-method=zadd&key=User%3A1227713%3Alikes%3Atwitters&arg1=1356514698&arg2=780984852||method=zadd&key=User%3A1227713%3Alikes%3Atwitters&arg1=1356514698&arg2=780984852||method=zadd&key=User%3A1227713%3Alikes%3Atwitters&arg1=1356514698&arg2=780984852[m
[31m---- response_body[m
[31m-arg1: 1356514698[m
[31m-arg2: 780984852[m
[31m-key: User:1227713:likes:twitters[m
[31m-method: zadd[m
[31m- ===============[m
[31m-arg1: 1356514698[m
[31m-arg2: 780984852[m
[31m-key: User:1227713:likes:twitters[m
[31m-method: zadd[m
[31m- ===============[m
[31m-arg1: 1356514698[m
[31m-arg2: 780984852[m
[31m-key: User:1227713:likes:twitters[m
[31m-method: zadd[m
[31m- ===============[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: recursive rewrite[m
[31m---- config[m
[31m-    rewrite_by_lua '[m
[31m-        local args = ngx.var.args[m
[31m-        if args == "jump" then[m
[31m-            ngx.req.set_uri("/jump",true)[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m-    location /jump {[m
[31m-        echo "Jump around!";[m
[31m-    }[m
[31m-[m
[31m-    location / {[m
[31m-        echo "$scheme://$http_host$request_uri";[m
[31m-    }[m
[31m---- request[m
[31m-GET /?jump[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m---- error_log[m
[31m-rewrite or internal redirection cycle while processing "/jump"[m
[31m---- timeout: 10[m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: boolean values in ngx.encode_args (trailing arg)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {a = {32, true}, foo = 3, bar = 5}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b a=32 \b )       # 4 chars[m
[31m-    (?= .*? \b a (?=&|$) \b )  # 1 chars[m
[31m-    (?= .*? \b foo=3 \b )      # 5 chars[m
[31m-    (?= .*? \b bar=5 \b )      # 5 chars[m
[31m-    (?= (?: [^&]+ & ){3} [^&]+ $ )  # requires exactly 3 &'s[m
[31m-    (?= .{18} $ )  # requires for total 18 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: false boolean values in ngx.encode_args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {a = {32, false}, foo = 3, bar = 5}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b a=32 \b )   # 4 chars[m
[31m-    (?= .*? \b foo=3 \b )  # 5 chars[m
[31m-    (?= .*? \b bar=5 \b )  # 5 chars[m
[31m-    (?= (?: [^&]+ & ){2} [^&]+ $ )  # requires exactly 2 &'s[m
[31m-    (?= .{16} $ )  # requires for total 16 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: false boolean values in ngx.encode_args (escaping)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {["a b"] = {32, false}, foo = 3, bar = 5}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b a%20b=32 \b )  # 8 chars[m
[31m-    (?= .*? \b foo=3 \b )     # 5 chars[m
[31m-    (?= .*? \b bar=5 \b )     # 5 chars[m
[31m-    (?= (?: [^&]+ & ){2} [^&]+ $ )  # requires exactly 2 &'s[m
[31m-    (?= .{20} $ )  # requires for total 20 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: true boolean values in ngx.encode_args (escaping)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $args_str '[m
[31m-            local t = {["a b"] = {32, true}, foo = 3, bar = 5}[m
[31m-            return ngx.encode_args(t)[m
[31m-        ';[m
[31m-        echo $args_str;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-(?x) ^[m
[31m-    (?= .*? \b a%20b=32 \b )     # 8 chars[m
[31m-    (?= .*? \b a%20b (?!=) \b )  # 5 chars[m
[31m-    (?= .*? \b foo=3 \b )        # 5 chars[m
[31m-    (?= .*? \b bar=5 \b )        # 5 chars[m
[31m-    (?= (?: [^&]+ & ){3} [^&]+ $ )  # requires exactly 3 &'s[m
[31m-    (?= .{26} $ )  # requires for total 26 chars (exactly) in the string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: rewrite uri and args (boolean in multi-value args)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args({a = 3, b = {5, true, 6}})[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body_like[m
[31m-(?x) ^HTTP/1.0 \s[m
[31m-    (?= .*? \b a=3 \b )      # 3 chars[m
[31m-    (?= .*? \b b=5 \b )      # 3 chars[m
[31m-    (?= .*? \b b (?!=) \b )  # 1 chars[m
[31m-    (?= .*? \b b=6 \b )      # 3 chars[m
[31m-    (?= (?: [^&]+ & ){3} [^&]+ $ )  # requires exactly 3 &'s[m
[31m-    (?= .{13} $ )  # requires for total 13 chars (exactly) in the string[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: rewrite uri and args (boolean value)[m
[31m---- config[m
[31m-    location /bar {[m
[31m-        echo $server_protocol $query_string;[m
[31m-    }[m
[31m-    location /foo {[m
[31m-        #rewrite ^ /bar?hello? break;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_uri_args({a = 3, b = true})[m
[31m-            ngx.req.set_uri("/bar")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /foo?world[m
[31m---- response_body_like[m
[31m-^HTTP/1.0 (a=3&b|b&a=3)$[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/031-post-args.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/031-post-args.t[m
[1mdeleted file mode 100644[m
[1mindex 4f8b9d7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/031-post-args.t[m
[1m+++ /dev/null[m
[36m@@ -1,356 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 6);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_post_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-a=3&b=4&c[m
[31m---- response_body[m
[31m-a = 3[m
[31m-b = 4[m
[31m-c = true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: lua_need_request_body off[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body off;[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_post_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-a=3&b=4&c[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: empty request body[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            local args = ngx.req.get_post_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                local val = args[key][m
[31m-                if type(val) == "table" then[m
[31m-                    ngx.say(key, ": ", table.concat(val, ", "))[m
[31m-                else[m
[31m-                    ngx.say(key, ": ", val)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: max args (limited after normal key=value)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local args = ngx.req.get_post_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-foo=3&bar=4&baz=2[m
[31m---- response_body[m
[31m-bar = 4[m
[31m-foo = 3[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: max args (limited after an orphan key)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local args = ngx.req.get_post_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-foo=3&bar&baz=2[m
[31m---- response_body[m
[31m-bar = true[m
[31m-foo = 3[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: max args (limited after an empty key, but non-emtpy values)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local args = ngx.req.get_post_args(2)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-foo=3&=hello&=world[m
[31m---- response_body[m
[31m-foo = 3[m
[31m-done[m
[31m---- error_log[m
[31m-lua hit query args limit 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: default max 100 args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local args = ngx.req.get_post_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "POST /lua\n";[m
[31m-my $i = 1;[m
[31m-while ($i <= 102) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 100) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua hit query args limit 100[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: custom max 102 args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local args = ngx.req.get_post_args(102)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "POST /lua\n";[m
[31m-my $i = 1;[m
[31m-while ($i <= 103) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 102) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m---- error_log[m
[31m-lua hit query args limit 102[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: custom unlimited args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local args = ngx.req.get_post_args(0)[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                ngx.say(key, " = ", args[key])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-my $s = "POST /lua\n";[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    if ($i != 1) {[m
[31m-        $s .= '&';[m
[31m-    }[m
[31m-    $s .= "a$i=$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-$s[m
[31m---- response_body eval[m
[31m-my @k;[m
[31m-my $i = 1;[m
[31m-while ($i <= 105) {[m
[31m-    push @k, "a$i";[m
[31m-    $i++;[m
[31m-}[m
[31m-@k = sort @k;[m
[31m-for my $k (@k) {[m
[31m-    if ($k =~ /\d+/) {[m
[31m-        $k .= " = $&\n";[m
[31m-    }[m
[31m-}[m
[31m-CORE::join("", @k);[m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: request body in temp file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        lua_need_request_body on;[m
[31m-        client_body_in_file_only clean;[m
[31m-        content_by_lua_block {[m
[31m-            local args, err = ngx.req.get_post_args()[m
[31m-[m
[31m-            if not args then[m
[31m-                ngx.say(err)[m
[31m-            else[m
[31m-                local keys = {}[m
[31m-                for key, val in pairs(args) do[m
[31m-                    table.insert(keys, key)[m
[31m-                end[m
[31m-[m
[31m-                table.sort(keys)[m
[31m-                for i, key in ipairs(keys) do[m
[31m-                    ngx.say(key, " = ", args[key])[m
[31m-                end[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-a=3&b=4&c[m
[31m---- response_body[m
[31m-requesty body in temp file not supported[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/032-iolist.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/032-iolist.t[m
[1mdeleted file mode 100644[m
[1mindex ddf3d7f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/032-iolist.t[m
[1m+++ /dev/null[m
[36m@@ -1,79 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local table = {"hello", nil, true, false, 32.5, 56}[m
[31m-            ngx.say(table)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-helloniltruefalse32.556[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nested table[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local table = {"hello", nil, true, false, 32.5, 56}[m
[31m-            local table2 = {table, "--", table}[m
[31m-            ngx.say(table2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-helloniltruefalse32.556--helloniltruefalse32.556[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: non-array table[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local table = {foo = 3}[m
[31m-            ngx.say(table)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad data type in table[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local f = function () return end[m
[31m-            local table = {1, 3, f}[m
[31m-            ngx.say(table)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/033-ctx.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/033-ctx.t[m
[1mdeleted file mode 100644[m
[1mindex eefb216..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/033-ctx.t[m
[1m+++ /dev/null[m
[36m@@ -1,443 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 8);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rewrite, access, and content[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            print("foo = ", ngx.ctx.foo)[m
[31m-            ngx.ctx.foo = 76[m
[31m-        ';[m
[31m-        access_by_lua '[m
[31m-            ngx.ctx.foo = ngx.ctx.foo + 3[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-79[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/foo = [^,]+/[m
[31m---- log_level: info[m
[31m---- grep_error_log_out[m
[31m-foo = nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: interal redirect clears ngx.ctx[m
[31m---- config[m
[31m-    location /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = ngx.var.arg_data[m
[31m-            -- ngx.say(ngx.ctx.foo)[m
[31m-            ngx.exec("/echo")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?data=hello[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: subrequest has its own ctx[m
[31m---- config[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("sub pre: ", ngx.ctx.blah)[m
[31m-            ngx.ctx.blah = 32[m
[31m-            ngx.say("sub post: ", ngx.ctx.blah)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.blah = 73[m
[31m-            ngx.say("main pre: ", ngx.ctx.blah)[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say("main post: ", ngx.ctx.blah)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-main pre: 73[m
[31m-sub pre: nil[m
[31m-sub post: 32[m
[31m-main post: 73[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: overriding ctx[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx = { foo = 32, bar = 54 };[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-            ngx.say(ngx.ctx.bar)[m
[31m-[m
[31m-            ngx.ctx = { baz = 56  };[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-            ngx.say(ngx.ctx.baz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-32[m
[31m-54[m
[31m-nil[m
[31m-56[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: header filter[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.blah = ngx.ctx.foo + 1[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-blah: 33[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: capture_multi[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.ctx.dog)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'blah';[m
[31m-        set $cat 'foo';[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/other/1",[m
[31m-                    { ctx = { dog = "hello" }}[m
[31m-                },[m
[31m-                {"/other/2",[m
[31m-                    { ctx = { dog = "hiya" }}[m
[31m-                }[m
[31m-            };[m
[31m-[m
[31m-            ngx.print(res1.body)[m
[31m-            ngx.print(res2.body)[m
[31m-            ngx.say("parent: ", ngx.ctx.dog)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-dog = hello[m
[31m-dog = hiya[m
[31m-parent: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua $bar 'ngx.ctx.foo = 3 return 4';[m
[31m-        set_by_lua $foo 'return ngx.ctx.foo';[m
[31m-        echo "foo = $foo, bar = $bar";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-foo = 3, bar = 4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.ctx leaks with ngx.exec + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.exec("/f")[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)';[m
[31m-    }[m
[31m-    location = /f {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-ctx.foo = [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: memory leaks with ngx.ctx + ngx.req.set_uri + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.req.set_uri("/f", true)[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)';[m
[31m-    }[m
[31m-    location = /f {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-ctx.foo = [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.ctx + ngx.exit(ngx.ERROR) + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ngx.ctx = ", ngx.ctx.foo)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-ngx.ctx = 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.ctx + ngx.exit(200) + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-ctx.foo = 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.ctx + ngx.redirect + log_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.redirect("/f")[m
[31m-        ';[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "ngx.ctx.foo = ", 32)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- error_log[m
[31m-ctx.foo = 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set ngx.ctx before internal redirects performed by other nginx modules[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = "hello world";[m
[31m-        ';[m
[31m-        echo_exec /foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua release ngx.ctx at ref[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set ngx.ctx before internal redirects performed by other nginx modules (with log_by_lua)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = "hello world";[m
[31m-        ';[m
[31m-        echo_exec /foo;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello;[m
[31m-        log_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua release ngx.ctx at ref[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set ngx.ctx before simple uri rewrite performed by other nginx modules[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $a 'ngx.ctx.foo = "hello world"; return 1';[m
[31m-        rewrite ^ /foo last;[m
[31m-        echo blah;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua release ngx.ctx at ref[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.ctx gets prematurely released ngx.exit()[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 3[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            -- if ngx.headers_sent ~= true then ngx.send_headers() end[m
[31m-            return ngx.exit(200)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            if ngx.ctx.foo ~= 3 then[m
[31m-                ngx.log(ngx.ERR, "bad ngx.ctx.foo: ", ngx.ctx.foo)[m
[31m-            end[m
[31m-        ';[m
[31m-        }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.ctx gets prematurely released ngx.exit() (lua_code_cache off)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_code_cache off;[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.ctx.foo = 3[m
[31m-        ';[m
[31m-        content_by_lua '[m
[31m-            -- if ngx.headers_sent ~= true then ngx.send_headers() end[m
[31m-            return ngx.exit(200)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            if ngx.ctx.foo ~= 3 then[m
[31m-                ngx.log(ngx.ERR, "bad ngx.ctx.foo: ", ngx.ctx.foo)[m
[31m-            end[m
[31m-        ';[m
[31m-        }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/034-match.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/034-match.t[m
[1mdeleted file mode 100644[m
[1mindex 35149f1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/034-match.t[m
[1m+++ /dev/null[m
[36m@@ -1,1192 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 15);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: escaping sequences[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "(\\\\d+)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: escaping sequences (bad)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "(\\d+)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\('/][m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: escaping sequences in [[ ... ]][m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "[[\\d+]]")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\[\['/][m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: single capture[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]{2})[0-9]+")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([a-z]+).*?([0-9]{2})[0-9]+", "")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: multiple captures (with o)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([a-z]+).*?([0-9]{2})[0-9]+", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "foo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: case sensitive by default[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "HELLO")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: case insensitive[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "HELLO", "i")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: UTF-8 mode[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            rc, err = pcall(ngx.re.match, "hello章亦春", "HELLO.{2}", "iu")[m
[31m-            if not rc then[m
[31m-                ngx.say("FAIL: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local m = err[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-^(?:FAIL: bad argument \#2 to '\?' \(pcre_compile\(\) failed: this version of PCRE is not compiled with PCRE_UTF8 support in "HELLO\.\{2\}" at "HELLO\.\{2\}"\)|hello章亦)$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: multi-line mode (^ at line head)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "^world", "m")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: multi-line mode (. does not match \n)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", ".*", "m")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: single-line mode (^ as normal)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "^world", "s")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: single-line mode (dot all)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", ".*", "s")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "\\\\w     \\\\w", "x")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-he[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.match("hello\\nworld", "(abc")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad option[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            rc, m = pcall(ngx.re.match, "hello\\nworld", ".*", "Hm")[m
[31m-            if rc then[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            else[m
[31m-                ngx.say("error: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-error: .*?unknown flag "H" \(flags "Hm"\)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, world", "(world)|(hello)", "x")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-false[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: optional trailing captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)(h?)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-"1234[m
[31m-1234[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: anchored match (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "a")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "a")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: match with ctx but no pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "", ctx)[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say(ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: match with ctx and a pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = { pos = 3 }[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "", ctx)[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say(ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-34[m
[31m-5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: sanity (set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)")[m
[31m-            if m then[m
[31m-                return m[0][m
[31m-            else[m
[31m-                return "not matched!"[m
[31m-            end[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: match (look-behind assertion)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local m = ngx.re.match("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: escaping sequences[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-m = ngx.re.match("hello, 1234", "(\\\s+)")[m
[31m-if m then[m
[31m-    ngx.say("[", m[0], "]")[m
[31m-else[m
[31m-    ngx.say("not matched!")[m
[31m-end[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\(\\'/][m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: escaping sequences[m
[31m---- config[m
[31m-    location /re {[m
[31m-        access_by_lua_file html/a.lua;[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local uri = "<impact>2</impact>"[m
[31m-local regex = '(?:>[\\w\\s]*</?\\w{2,}>)';[m
[31m-ngx.say("regex: ", regex)[m
[31m-m = ngx.re.match(uri, regex, "oi")[m
[31m-if m then[m
[31m-    ngx.say("[", m[0], "]")[m
[31m-else[m
[31m-    ngx.say("not matched!")[m
[31m-end[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-regex: (?:>[\w\s]*</?\w{2,}>)[m
[31m-[>2</impact>][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: long brackets[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", [[\\d+]])[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.match("hello, 1234", "([0-9]+")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched!")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "([0-9]+"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: long brackets containing [...][m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", [[([0-9]+)]])[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: bug report (github issue #72)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.re.match("hello", "hello", "j")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.re.match("hello", "world", "j")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: bug report (github issue #72)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.re.match("hello", "hello", "j")[m
[31m-            ngx.exec("/foo")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.re.match("hello", "world", "j")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: non-empty subject, empty pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local m = ngx.re.match("hello, 1234", "", "", ctx)[m
[31m-            if m then[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-                ngx.say("m: ", m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-pos: 1[m
[31m-m: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "(?<first>[a-z]+), [0-9]+")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-hello[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: duplicate named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "(?<first>[a-z]+), (?<first>[0-9]+)", "D")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-1234[m
[31m-hello-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: named captures are empty strings[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("1234", "(?<first>[a-z]*)([0-9]+)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: named captures are false[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, world", "(world)|(hello)|(?<named>howdy)")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-                ngx.say(m["named"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-false[m
[31m-hello[m
[31m-false[m
[31m-false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: duplicate named subpatterns[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, world",[m
[31m-                                   "(?<named>\\\\w+), (?<named>\\\\w+)",[m
[31m-                                   "D")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.named,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hello[m
[31m-world[m
[31m-hello-world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: Javascript compatible mode[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("章", [[\\u7AE0]], "uJ")[m
[31m-            if m then[m
[31m-                ngx.say("matched: ", m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-matched: 章[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: empty duplicate captures[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua "[m
[31m-            local target = 'test'[m
[31m-            local regex = '^(?:(?<group1>(?:foo))|(?<group2>(?:bar))|(?<group3>(?:test)))$'[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local m = ngx.re.match(target, regex, 'D')[m
[31m-[m
[31m-            ngx.say(type(m.group1))[m
[31m-            ngx.say(type(m.group2))[m
[31m-        ";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local m, err = ngx.re.match(string.sub(target, 1, 4), regex, "u")[m
[31m-[m
[31m-            if err then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say("matched: ", m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^error: pcre_exec\(\) failed: -10$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("你好", ".", "U")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("你好", ".", "u")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, err = ngx.re.match(s, re, "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, err = ngx.re.match(s, re, "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-failed to match[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: extra table argument[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local res = {}[m
[31m-            local s = "hello, 1234"[m
[31m-            m = ngx.re.match(s, [[(\\d)(\\d)]], "o", nil, res)[m
[31m-            if m then[m
[31m-                ngx.say("1: m size: ", #m)[m
[31m-                ngx.say("1: res size: ", #res)[m
[31m-            else[m
[31m-                ngx.say("1: not matched!")[m
[31m-            end[m
[31m-            m = ngx.re.match(s, [[(\\d)]], "o", nil, res)[m
[31m-            if m then[m
[31m-                ngx.say("2: m size: ", #m)[m
[31m-                ngx.say("2: res size: ", #res)[m
[31m-            else[m
[31m-                ngx.say("2: not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1: m size: 2[m
[31m-1: res size: 2[m
[31m-2: m size: 2[m
[31m-2: res size: 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        m = ngx.re.match("hello, 1234", "(\\\\d+)")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: trailing captures are false[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello", "(hello)(.+)?")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-hello[m
[31m-false[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: the 5th argument hides the 4th (GitHub #719)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx, m = { pos = 5 }, {};[m
[31m-            local _, err = ngx.re.match("20172016-11-3 03:07:09", [=[(\d\d\d\d)]=], "", ctx, m);[m
[31m-            if m then[m
[31m-                ngx.say(m[0], " ", _[0], " ", ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-2016 2016 9[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/035-gmatch.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/035-gmatch.t[m
[1mdeleted file mode 100644[m
[1mindex 69b9512..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/035-gmatch.t[m
[1m+++ /dev/null[m
[36m@@ -1,904 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(5);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 7);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: gmatch[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, world", "[a-z]+") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: fail to match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: match but iterate more times (not just match at the end)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world!", "[a-z]+")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: match but iterate more times (just matched at the end)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: anchored match (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            it = ngx.re.gmatch("hello, 1234", "([0-9]+)", "a")[m
[31m-            ngx.say(it())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]", "a")[m
[31m-            local m = it()[m
[31m-            ngx.say(m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m[0])[m
[31m-            ngx.say(it())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: non-anchored gmatch (without regex cache)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: non-anchored gmatch (with regex cache)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]", "o")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-4[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]", "a")[m
[31m-            local m = it()[m
[31m-            ngx.say(m[0])[m
[31m-            m = it()[m
[31m-            ngx.say(m[0])[m
[31m-            ngx.say(it())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-2[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: anchored match (succeeded, set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local it = ngx.re.gmatch("12 hello 34", "[0-9]", "a")[m
[31m-            local m = it()[m
[31m-            return m[0][m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: gmatch (look-behind assertion)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("{foobar}, {foobaz}", "(?<=foo)ba[rz]") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: gmatch (look-behind assertion 2)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: with regex cache[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, 1234", "([A-Z]+)", "io")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("1234, okay", "([A-Z]+)", "io")[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("hi, 1234", "([A-Z]+)", "o")[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- stap2[m
[31m-F(ngx_http_lua_ngx_re_gmatch_iterator) { println("iterator") }[m
[31m-F(ngx_http_lua_ngx_re_gmatch_gc) { println("gc") }[m
[31m-F(ngx_http_lua_ngx_re_gmatch_cleanup) { println("cleanup") }[m
[31m---- response_body[m
[31m-hello[m
[31m-okay[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: exceeding regex cache max entries[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 2;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, 1234", "([0-9]+)", "o")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("howdy, 567", "([0-9]+)", "oi")[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("hiya, 98", "([0-9]+)", "ox")[m
[31m-            m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-567[m
[31m-98[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: disable regex cache completely[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 0;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, 1234", "([0-9]+)", "o")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("howdy, 567", "([0-9]+)", "oi")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            it = ngx.re.gmatch("hiya, 98", "([0-9]+)", "ox")[m
[31m-            local m = it()[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-567[m
[31m-98[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: gmatch matched but no iterate[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: gmatch matched but only iterate once and still matches remain[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: gmatch matched but no iterate and early forced GC[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local a = {}[m
[31m-            for i = 1, 3 do[m
[31m-                it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-                it()[m
[31m-                collectgarbage()[m
[31m-                table.insert(a, {"hello", "world"})[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: gmatch iterator used by another request[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;;';"[m
[31m---- config[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.foo = nil[m
[31m-[m
[31m-            local res = ngx.location.capture("/t")[m
[31m-            if res.status == 200 then[m
[31m-                ngx.print(res.body)[m
[31m-            else[m
[31m-                ngx.say("sr failed: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            res = ngx.location.capture("/t")[m
[31m-            if res.status == 200 then[m
[31m-                ngx.print(res.body)[m
[31m-            else[m
[31m-                ngx.say("sr failed: ", res.status)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            local m = foo.go()[m
[31m-            ngx.say(m and "matched" or "no")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-local it[m
[31m-[m
[31m-function go()[m
[31m-    if not it then[m
[31m-        it = ngx.re.gmatch("hello, world", "[a-z]+")[m
[31m-    end[m
[31m-[m
[31m-    return it()[m
[31m-end[m
[31m---- request[m
[31m-    GET /main[m
[31m---- response_body[m
[31m-matched[m
[31m-sr failed: 500[m
[31m---- error_log[m
[31m-attempt to use ngx.re.gmatch iterator in a request that did not create it[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: gmatch (empty matched string)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello", "a|") do[m
[31m-                if m then[m
[31m-                    ngx.say("matched: [", m[0], "]")[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-matched: [][m
[31m-matched: [][m
[31m-matched: [][m
[31m-matched: [][m
[31m-matched: [][m
[31m-matched: [][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: gmatch with named pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("1234, 1234", "(?<first>[0-9]+)")[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m["first"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m["first"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-1234[m
[31m-1234[m
[31m-1234[m
[31m-1234[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: gmatch with multiple named pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("1234, abcd, 1234", "(?<first>[0-9]+)|(?<second>[a-z]+)")[m
[31m-[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m["first"])[m
[31m-                ngx.say(m["second"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m["first"])[m
[31m-                ngx.say(m["second"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-1234[m
[31m-false[m
[31m-1234[m
[31m-false[m
[31m-abcd[m
[31m-false[m
[31m-abcd[m
[31m-false[m
[31m-abcd[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: gmatch with duplicate named pattern w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, 1234", "(?<first>[a-z]+), (?<first>[0-9]+)", "D")[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-[m
[31m-            m = it()[m
[31m-            if m then[m
[31m-             ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-1234[m
[31m-hello-1234[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: named captures are empty[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("1234", "(?<first>[a-z]*)([0-9]+)", "")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: named captures are empty (with regex cache)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("1234", "(?<first>[a-z]*)([0-9]+)", "o")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it, err = ngx.re.gmatch("hello\\nworld", "(abc")[m
[31m-            if not err then[m
[31m-                ngx.say("good")[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local it, err = ngx.re.gmatch(string.sub(target, 1, 4), regex, "u")[m
[31m-[m
[31m-            if err then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local m, err = it()[m
[31m-            if err then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say("matched: ", m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-error: pcre_exec\(\) failed: -10[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("你好", ".", "U")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("你好", ".", "u")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local it, err = ngx.re.gmatch(s, re, "o")[m
[31m-if not it then[m
[31m-    ngx.say("failed to gen iterator: ", err)[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m-local res, err = it()[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local it, err = ngx.re.gmatch(s, re, "o")[m
[31m-if not it then[m
[31m-    ngx.say("failed to gen iterator: ", err)[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m-res, err = it()[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-failed to match[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/036-sub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/036-sub.t[m
[1mdeleted file mode 100644[m
[1mindex f08c50f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/036-sub.t[m
[1m+++ /dev/null[m
[36m@@ -1,757 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 19);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched but w/o variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, world[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[A-Z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched and with variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(b) (c)", "[$0] [$1] [$2] [$3] [$134]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: matched and with named variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("a b c d",[m
[31m-                "(b) (c)", "[$0] [$1] [$2] [$3] [$hello]")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-attempt to use named capturing variable "hello" (named captures not supported yet)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: matched and with named variables (bracketed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("a b c d",[m
[31m-                "(b) (c)", "[$0] [$1] [$2] [$3] [${hello}]")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-attempt to use named capturing variable "hello" (named captures not supported yet)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: matched and with bracketed variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134}]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134]")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-the closing bracket in "134" variable is missing[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-the closing bracket in "134" variable is missing[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-lua script: invalid capturing variable name found in "[$0] [$1] [${2}] [$3] [${"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: trailing $[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [$")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-lua script: invalid capturing variable name found in "[$0] [$1] [${2}] [$3] [$"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: matched but w/o variables and with literal $[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "ho$$wdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-ho$wdy, world[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: non-anchored match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "[0-9]", "x")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, x234[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: anchored match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "[0-9]", "x", "a")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: function replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([0-9])", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [3] [3]4[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: function replace (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([A-Z])", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 34[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad repl arg type[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([A-Z])", true)[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-false[m
[31m-bad argument #3 to '?' (string, number, or function expected, got boolean)[m
[31m-nil[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: use number to replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([0-9])", 72)[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-true[m
[31m-hello, 724[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad function return value type[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m) end[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([0-9])", f)[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-false[m
[31m-bad argument #3 to '?' (string or number expected to be returned by the replace function, got nil)[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: matched but w/o variables (set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "howdy")[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: matched and with variables w/o using named patterns in sub[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", "[$0] [$1] [$2] [$3] [$134]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: matched and with variables using named patterns in func[m
[31m---- config[m
[31m-    error_log /tmp/nginx_error debug;[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m["first"] .. "] [" .. m[2] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] d[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: matched and with variables w/ using named patterns in sub[m
[31m-This is still a TODO[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", "[$0] [${first}] [${second}] [$3] [$134]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: $0 without parens[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", [[\w]], "[$0]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[a] b c d[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("hello\\nworld", "(abc", "")[m
[31m-            if s then[m
[31m-                ngx.say("subs: ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local s, n, err = ngx.re.sub(string.sub(target, 1, 4), regex, "", "u")[m
[31m-[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-error: pcre_exec\(\) failed: -10[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("你好", ".", "a", "U")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: a好[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("你好", ".", "a", "u")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: a好[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, cnt, err = ngx.re.sub(s, re, "", "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if err then[m
[31m-    ngx.say("error: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ngx.say("sub: ", cnt)[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-local s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, cnt, err = ngx.re.sub(s, re, "", "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if err then[m
[31m-    ngx.say("error: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ngx.say("sub: ", cnt)[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-sub: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: bug: sub incorrectly swallowed a character is the first character[m
[31m-Original bad result: estCase[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("TestCase", "^ *", "", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-TestCase[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: bug: sub incorrectly swallowed a character is not the first character[m
[31m-Original bad result: .b.d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("abcd", "(?=c)", ".")[m
[31m-            if s then[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-ab.cd[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: ngx.re.gsub: recursive calling (github #445)[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        function test()[m
[31m-            local data = [[[m
[31m-                OUTER {FIRST}[m
[31m-]][m
[31m-[m
[31m-            local p1 = "(OUTER)(.+)"[m
[31m-            local p2 = "{([A-Z]+)}"[m
[31m-[m
[31m-            ngx.print(data)[m
[31m-[m
[31m-            local res =  ngx.re.gsub(data, p1, function(m)[m
[31m-                -- ngx.say("pre: m[1]: [", m[1], "]")[m
[31m-                -- ngx.say("pre: m[2]: [", m[2], "]")[m
[31m-[m
[31m-                local res = ngx.re.gsub(m[2], p2, function(_)[m
[31m-                    return "REPLACED"[m
[31m-                end, "")[m
[31m-[m
[31m-                -- ngx.say("post: m[1]: [", m[1], "]")[m
[31m-                -- ngx.say("post m[2]: [", m[2], "]")[m
[31m-                return m[1] .. res[m
[31m-            end, "")[m
[31m-[m
[31m-            ngx.print(res)[m
[31m-        end[m
[31m-[m
[31m-        test()[m
[31m-    ';[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-                OUTER {FIRST}[m
[31m-                OUTER REPLACED[m
[31m---- no_error_log[m
[31m-[error][m
[31m-bad argument type[m
[31m-NYI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: function replace (false for groups)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                print("group 1: ", m[2])[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([0-9])|(world)", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [3] [3]4[m
[31m-1[m
[31m---- error_log[m
[31m-group 1: false[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/037-gsub.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/037-gsub.t[m
[1mdeleted file mode 100644[m
[1mindex 2a1e00f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/037-gsub.t[m
[1m+++ /dev/null[m
[36m@@ -1,699 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 17);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("[hello, world]", "[a-z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[howdy, howdy][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: trimmed[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[a-z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, howdy[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[A-Z]+", "howdy")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: replace by function (trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, world", "([a-z])[a-z]+", f)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: replace by function (not trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", f)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: replace by script (trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "([a-z])[a-z]+", "[$0,$1]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: replace by script (not trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", "[$0,$1]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set_by_lua[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", f)[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: look-behind assertion[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "h$0")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{foohbarhbaz}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: gsub with a patch matching an empty substring (string template)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello", "a|", "b")[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: bhbeblblbob[m
[31m-n: 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: gsub with a patch matching an empty substring (string template, empty subj)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("", "a|", "b")[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: b[m
[31m-n: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: gsub with a patch matching an empty substring (func)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello", "a|", function () return "b" end)[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: bhbeblblbob[m
[31m-n: 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: gsub with a patch matching an empty substring (func, empty subj)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("", "a|", function () return "b" end)[m
[31m-            ngx.say("s: ", s)[m
[31m-            ngx.say("n: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: b[m
[31m-n: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: big subject string exceeding the luabuf chunk size (with trailing unmatched data, func repl)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local subj = string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. "aaa"[m
[31m-[m
[31m-            local function repl(m)[m
[31m-                return string.rep("c", string.len(m[0]))[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub(subj, "b+", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-("a" x 8000) . ("c" x 1000) . ("a" x 8000) . ("c" x 1000)[m
[31m-. "aaa[m
[31m-2[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: big subject string exceeding the luabuf chunk size (without trailing unmatched data, func repl)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local subj = string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-[m
[31m-            local function repl(m)[m
[31m-                return string.rep("c", string.len(m[0]))[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub(subj, "b+", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-("a" x 8000) . ("c" x 1000) . ("a" x 8000) . ("c" x 1000)[m
[31m-. "\n2\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: big subject string exceeding the luabuf chunk size (with trailing unmatched data, str repl)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local subj = string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. "aaa"[m
[31m-[m
[31m-            local s, n = ngx.re.gsub(subj, "b(b+)(b)", "$1 $2")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-("a" x 8000) . ("b" x 998) . " b" . ("a" x 8000) . ("b" x 998) . " baaa[m
[31m-2[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: big subject string exceeding the luabuf chunk size (without trailing unmatched data, str repl)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local subj = string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-                .. string.rep("a", 8000)[m
[31m-                .. string.rep("b", 1000)[m
[31m-[m
[31m-            local s, n = ngx.re.gsub(subj, "b(b+)(b)", "$1 $2")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-("a" x 8000) . ("b" x 998) . " b" . ("a" x 8000) . ("b" x 998) . " b\n2\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: named pattern repl w/ callback[m
[31m---- config[m
[31m-    location /re {[m
[31m-       content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m["first"] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, world", "(?<first>[a-z])[a-z]+", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: $0 without parens[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("a b c d", [[\w]], "[$0]")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[a] [b] [c] [d][m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            -- Note the D here[m
[31m-            local s, n, err = ngx.re.gsub(string.sub(target, 1, 4), regex, "", "u")[m
[31m-[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-       ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-error: pcre_exec\(\) failed: -10[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("你好", ".", "a", "U")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-exec opts: 2000[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: aa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("你好", ".", "a", "u")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-exec opts: 0[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: aa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, cnt, err = ngx.re.gsub(s, re, "", "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if err then[m
[31m-    ngx.say("error: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ngx.say("gsub: ", cnt)[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-local s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, cnt, err = ngx.re.gsub(s, re, "", "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if err then[m
[31m-    ngx.say("error: ", err)[m
[31m-    return[m
[31m-end[m
[31m-ngx.say("gsub: ", cnt)[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-gsub: 0[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: bug: gsub incorrectly swallowed a character is the first character[m
[31m-Original bad result: estCase[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("TestCase", "^ *", "", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-TestCase[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: bug: gsub incorrectly swallowed a character is not the first character[m
[31m-Original bad result: .b.d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("abcd", "a|(?=c)", ".")[m
[31m-            if s then[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-.b.cd[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: use of ngx.req.get_headers in the user callback[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        local data = [[[m
[31m-            INNER[m
[31m-            INNER[m
[31m-]][m
[31m-[m
[31m-        -- ngx.say(data)[m
[31m-[m
[31m-        local res =  ngx.re.gsub(data, "INNER", function(inner_matches)[m
[31m-            local header = ngx.req.get_headers()["Host"][m
[31m-            -- local header = ngx.var["http_HEADER"][m
[31m-            return "INNER_REPLACED"[m
[31m-        end, "s")[m
[31m-[m
[31m-        ngx.print(res)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-            INNER_REPLACED[m
[31m-            INNER_REPLACED[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: use of ngx.var in the user callback[m
[31m---- config[m
[31m-[m
[31m-location = /t {[m
[31m-    content_by_lua '[m
[31m-        local data = [[[m
[31m-            INNER[m
[31m-            INNER[m
[31m-]][m
[31m-[m
[31m-        -- ngx.say(data)[m
[31m-[m
[31m-        local res =  ngx.re.gsub(data, "INNER", function(inner_matches)[m
[31m-            -- local header = ngx.req.get_headers()["Host"][m
[31m-            local header = ngx.var["http_HEADER"][m
[31m-            return "INNER_REPLACED"[m
[31m-        end, "s")[m
[31m-[m
[31m-        ngx.print(res)[m
[31m-    ';[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-            INNER_REPLACED[m
[31m-            INNER_REPLACED[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: function replace (false for groups)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                print("group 1: ", m[2])[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, 34", "([0-9])|(world)", repl)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [3] [3][4] [4][m
[31m-2[m
[31m---- error_log[m
[31m-group 1: false[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/038-match-o.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/038-match-o.t[m
[1mdeleted file mode 100644[m
[1mindex 628e27f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/038-match-o.t[m
[1m+++ /dev/null[m
[36m@@ -1,743 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: escaping sequences[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "(\\\\d+)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: escaping sequences (bad)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "(\\d+)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\('/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: escaping sequences in [[ ... ]][m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "[[\\d+]]", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-[qr/invalid escape sequence near '"\[\['/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: single capture[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]{2})[0-9]+", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: multiple captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([a-z]+).*?([0-9]{2})[0-9]+", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-12[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "foo", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: case sensitive by default[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "HELLO", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: case sensitive by default[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "HELLO", "oi")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: UTF-8 mode[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, m = pcall(ngx.re.match, "hello章亦春", "HELLO.{2}", "iou")[m
[31m-            if not rc then[m
[31m-                ngx.say("error: ", m)[m
[31m-                return[m
[31m-            end[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-this version of PCRE is not compiled with PCRE_UTF8 support|^hello章亦$[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: multi-line mode (^ at line head)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "^world", "mo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: multi-line mode (. does not match \n)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", ".*", "om")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: single-line mode (^ as normal)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "^world", "so")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: single-line mode (dot all)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", ".*", "os")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello\\nworld", "\\\\w     \\\\w", "xo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-he[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.match("hello\\nworld", "(abc", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad option[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            rc, m = pcall(ngx.re.match, "hello\\nworld", ".*", "Ho")[m
[31m-            if rc then[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            else[m
[31m-                ngx.say("error: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-^error: .*?unknown flag "H"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, world", "(world)|(hello)", "xo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched: ", m)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-false[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: optional trailing captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)(h?)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body eval[m
[31m-"1234[m
[31m-1234[m
[31m-[m
[31m-"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: anchored match (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "oa")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "ao")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: match with ctx but no pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "o", ctx)[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say(ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: match with ctx and a pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = { pos = 3 }[m
[31m-            m = ngx.re.match("1234, hello", "([0-9]+)", "o", ctx)[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say(ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-34[m
[31m-5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: sanity (set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "o")[m
[31m-            if m then[m
[31m-                return m[0][m
[31m-            else[m
[31m-                return "not matched!"[m
[31m-            end[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: match (look-behind assertion)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local m = ngx.re.match("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "o", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "o", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-bar[m
[31m-baz[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: match (with regex cache)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "([A-Z]+)", "io")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("1234, okay", "([A-Z]+)", "io")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("hello, 1234", "([A-Z]+)", "o")[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-okay[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: match (with regex cache and ctx)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local m = ngx.re.match("hello, 1234", "([A-Z]+)", "io", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-            ngx.say(ctx.pos)[m
[31m-[m
[31m-            m = ngx.re.match("1234, okay", "([A-Z]+)", "io", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-            ngx.say(ctx.pos)[m
[31m-[m
[31m-            ctx.pos = 1[m
[31m-            m = ngx.re.match("hi, 1234", "([A-Z]+)", "o", ctx)[m
[31m-            ngx.say(m and m[0])[m
[31m-            ngx.say(ctx.pos)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-6[m
[31m-okay[m
[31m-11[m
[31m-nil[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: exceeding regex cache max entries[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 2;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "([0-9]+)", "o")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("howdy, 567", "([0-9]+)", "oi")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("hiya, 98", "([0-9]+)", "ox")[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-567[m
[31m-98[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: disable regex cache completely[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 0;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "([0-9]+)", "o")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("howdy, 567", "([0-9]+)", "oi")[m
[31m-            ngx.say(m and m[0])[m
[31m-[m
[31m-            m = ngx.re.match("hiya, 98", "([0-9]+)", "ox")[m
[31m-            ngx.say(m and m[0])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-567[m
[31m-98[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "(?<first>[a-z]+), [0-9]+", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m.second)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-hello[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: duplicate named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, 1234", "(?<first>[a-z]+), (?<first>[0-9]+)", "Do")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(table.concat(m.first,"-"))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-hello[m
[31m-1234[m
[31m-hello-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: named captures are empty strings[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("1234", "(?<first>[a-z]*)([0-9]+)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m.first)[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-1234[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: named captures are false[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("hello, world", "(world)|(hello)|(?<named>howdy)", "o")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-                ngx.say(m[3])[m
[31m-                ngx.say(m["named"])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-false[m
[31m-hello[m
[31m-false[m
[31m-false[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/039-sub-o.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/039-sub-o.t[m
[1mdeleted file mode 100644[m
[1mindex a861b6c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/039-sub-o.t[m
[1m+++ /dev/null[m
[36m@@ -1,581 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 6);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched but w/o variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, world[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[A-Z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched and with variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(b) (c)", "[$0] [$1] [$2] [$3] [$134]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: matched and with named variables (bad template)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("a b c d",[m
[31m-                                         "(b) (c)",[m
[31m-                                         "[$0] [$1] [$2] [$3] [$hello]",[m
[31m-                                         "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-attempt to use named capturing variable "hello" (named captures not supported yet)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: matched and with named variables (bracketed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("a b c d",[m
[31m-                                         "(b) (c)",[m
[31m-                                         "[$0] [$1] [$2] [$3] [${hello}]",[m
[31m-                                         "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-attempt to use named capturing variable "hello" (named captures not supported yet)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: matched and with bracketed variables[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134}]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134]", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-the closing bracket in "134" variable is missing[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${134", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-the closing bracket in "134" variable is missing[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: matched and with bracketed variables (unmatched brackets)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [${", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-lua script: invalid capturing variable name found in "[$0] [$1] [${2}] [$3] [${"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: trailing $[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("b c d", "(b) (c)", "[$0] [$1] [${2}] [$3] [$", "o")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: failed to compile the replacement template[m
[31m---- error_log[m
[31m-lua script: invalid capturing variable name found in "[$0] [$1] [${2}] [$3] [$"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: matched but w/o variables and with literal $[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "ho$$wdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-ho$wdy, world[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: non-anchored match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", " [0-9] ", "x", "xo")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, x234[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: anchored match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "[0-9]", "x", "ao")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 1234[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: function replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([0-9])", repl, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [3] [3]4[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: function replace (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hello, 34", "([A-Z])", repl, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, 34[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad repl arg type[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([A-Z])", true, "o")[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-false[m
[31m-bad argument #3 to '?' (string, number, or function expected, got boolean)[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: use number to replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([0-9])", 72, "o")[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-true[m
[31m-hello, 724[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad function return value type[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m) end[m
[31m-            local rc, s, n = pcall(ngx.re.sub, "hello, 34", "([0-9])", f, "o")[m
[31m-            ngx.say(rc)[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-false[m
[31m-bad argument #3 to '?' (string or number expected to be returned by the replace function, got nil)[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: matched but w/o variables (set_by_lua)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[a-z]+", "howdy", "o")[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: with regex cache (with text replace)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([A-Z]+)", "baz", "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            local s, n = ngx.re.sub("howdy, 1234", "([A-Z]+)", "baz", "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-[m
[31m-            s, n = ngx.re.sub("1234, okay", "([A-Z]+)", "blah", "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("hi, 1234", "([A-Z]+)", "hello", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-baz, 1234[m
[31m-1[m
[31m-baz, 1234[m
[31m-1[m
[31m-1234, blah[m
[31m-1[m
[31m-hi, 1234[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: with regex cache (with func replace)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([A-Z]+)", "baz", "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            local s, n = ngx.re.sub("howdy, 1234", "([A-Z]+)", function () return "bah" end, "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("1234, okay", "([A-Z]+)", function () return "blah" end, "io")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("hi, 1234", "([A-Z]+)", "hello", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-baz, 1234[m
[31m-1[m
[31m-bah, 1234[m
[31m-1[m
[31m-1234, blah[m
[31m-1[m
[31m-hi, 1234[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exceeding regex cache max entries[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 2;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([0-9]+)", "hello", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("howdy, 567", "([0-9]+)", "hello", "oi")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("hiya, 98", "([0-9]+)", "hello", "ox")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, hello[m
[31m-1[m
[31m-howdy, hello[m
[31m-1[m
[31m-hiya, hello[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: disable regex cache completely[m
[31m---- http_config[m
[31m-    lua_regex_cache_max_entries 0;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([0-9]+)", "hello", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("howdy, 567", "([0-9]+)", "hello", "oi")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            s, n = ngx.re.sub("hiya, 98", "([0-9]+)", "hello", "ox")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, hello[m
[31m-1[m
[31m-howdy, hello[m
[31m-1[m
[31m-hiya, hello[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: empty replace[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234", "([0-9]+)", "", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-[m
[31m-            local s, n = ngx.re.sub("hi, 5432", "([0-9]+)", "", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, [m
[31m-1[m
[31m-hi, [m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: matched and with variables w/o using named patterns in sub[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", "[$0] [$1] [$2] [$3] [$134]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] [] [] d[m
[31m-1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: matched and with variables using named patterns in func[m
[31m---- config[m
[31m-    error_log /tmp/nginx_error debug;[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "] [" .. m["first"] .. "] [" .. m[2] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.sub("a b c d", "(?<first>b) (?<second>c)", repl, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-a [b c] [b] [c] d[m
[31m-1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/040-gsub-o.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/040-gsub-o.t[m
[1mdeleted file mode 100644[m
[1mindex 90619b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/040-gsub-o.t[m
[1m+++ /dev/null[m
[36m@@ -1,201 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("[hello, world]", "[a-z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[howdy, howdy][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: trimmed[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[a-z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-howdy, howdy[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[A-Z]+", "howdy", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world[m
[31m-0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: replace by function (trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, world", "([a-z])[a-z]+", f, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: replace by function (not trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", f, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: replace by script (trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "([a-z])[a-z]+", "[$0,$1]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: replace by script (not trimmed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", "[$0,$1]", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set_by_lua[m
[31m---- config[m
[31m-    location /re {[m
[31m-        set_by_lua $res '[m
[31m-            local f = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m[1] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("{hello, world}", "([a-z])[a-z]+", f, "o")[m
[31m-            return s[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{[hello,h], [world,w]}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: look-behind assertion[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("{foobarbaz}", "(?<=foo)bar|(?<=bar)baz", "h$0", "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-{foohbarhbaz}[m
[31m-2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: named pattern repl w/ callback[m
[31m---- config[m
[31m-    location /re {[m
[31m-       content_by_lua '[m
[31m-            local repl = function (m)[m
[31m-                return "[" .. m[0] .. "," .. m["first"] .. "]"[m
[31m-            end[m
[31m-[m
[31m-            local s, n = ngx.re.gsub("hello, world", "(?<first>[a-z])[a-z]+", repl, "o")[m
[31m-            ngx.say(s)[m
[31m-            ngx.say(n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-[hello,h], [world,w][m
[31m-2[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/041-header-filter.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/041-header-filter.t[m
[1mdeleted file mode 100644[m
[1mindex 553ee43..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/041-header-filter.t[m
[1m+++ /dev/null[m
[36m@@ -1,793 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 94;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_type = "text/my-plain";[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: server config[m
[31m---- config[m
[31m-    header_filter_by_lua '[m
[31m-        ngx.header.content_type = "text/my-plain";[m
[31m-    ';[m
[31m-[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set in http[m
[31m---- http_config[m
[31m-    header_filter_by_lua '[m
[31m-        ngx.header.content_type = "text/my-plain";[m
[31m-    ';[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: overriding config[m
[31m---- config[m
[31m-    header_filter_by_lua '[m
[31m-        ngx.header.content_type = "text/my-plain";[m
[31m-    ';[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_type = "text/read-plain";[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/read-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set response content-type header[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_type = "text/my-plain";[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua code run failed[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.content_length = "text/my-plain";[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- error_code[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: use variable generated by content phrase[m
[31m---- config[m
[31m-   location /read {[m
[31m-        set $strvar '1';[m
[31m-        content_by_lua '[m
[31m-            ngx.var.strvar = "127.0.0.1:8080";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = ngx.var.strvar;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_headers[m
[31m-uid: 127.0.0.1:8080[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: use variable generated by content phrase for HEAD[m
[31m---- config[m
[31m-   location /read {[m
[31m-        set $strvar '1';[m
[31m-        content_by_lua '[m
[31m-            ngx.var.strvar = "127.0.0.1:8080";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = ngx.var.strvar;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /read[m
[31m---- response_headers[m
[31m-uid: 127.0.0.1:8080[m
[31m---- response_body[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: use variable generated by content phrase for HTTP 1.0[m
[31m---- config[m
[31m-   location /read {[m
[31m-        set $strvar '1';[m
[31m-        content_by_lua '[m
[31m-            ngx.var.strvar = "127.0.0.1:8080";[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = ngx.var.strvar;[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- request[m
[31m-GET /read HTTP/1.0[m
[31m---- response_headers[m
[31m-uid: 127.0.0.1:8080[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: use capture and header_filter_by[m
[31m---- config[m
[31m-   location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = "sub";[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /parent {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            if res.status == 200 then[m
[31m-                ngx.say(res.header.uid)[m
[31m-            else[m
[31m-                ngx.say("parent")[m
[31m-            end[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = "parent";[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /parent[m
[31m---- response_headers[m
[31m-uid: parent[m
[31m---- response_body[m
[31m-sub[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: overriding ctx[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.foo = 32;[m
[31m-            ngx.say(ngx.ctx.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.ctx.foo = ngx.ctx.foo + 1;[m
[31m-            ngx.header.uid = ngx.ctx.foo;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-uid: 33[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: use req[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua '[m
[31m-            local str = "";[m
[31m-            local args = ngx.req.get_uri_args()[m
[31m-            local keys = {}[m
[31m-            for key, val in pairs(args) do[m
[31m-                table.insert(keys, key)[m
[31m-            end[m
[31m-            table.sort(keys)[m
[31m-            for i, key in ipairs(keys) do[m
[31m-                local val = args[key][m
[31m-                if type(val) == "table" then[m
[31m-                    str = str .. table.concat(val, ", ")[m
[31m-                else[m
[31m-                    str = str .. ":" .. val[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.header.uid = str;[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_headers[m
[31m-uid: :1:2[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: use ngx md5 function[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("Hi");[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.uid = ngx.md5("Hi");[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-uid: c1a5298f939e87e8f962a5edfc206918[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set response content-type header (by file)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua_file 'html/foo.lua';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header.content_type = "text/my-plain";[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: by_lua_file server config[m
[31m---- config[m
[31m-    header_filter_by_lua_file 'html/foo.lua';[m
[31m-[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header.content_type = "text/my-plain";[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: by_lua_file set in http[m
[31m---- http_config[m
[31m-    header_filter_by_lua_file 'html/foo.lua';[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header.content_type = "text/my-plain";[m
[31m---- response_headers[m
[31m-Content-Type: text/my-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: by_lua_file overriding config[m
[31m---- config[m
[31m-    header_filter_by_lua 'html/foo.lua';[m
[31m-    location /read {[m
[31m-        echo "Hi";[m
[31m-        header_filter_by_lua_file 'html/bar.lua';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-ngx.header.content_type = "text/my-plain";[m
[31m->>> bar.lua[m
[31m-ngx.header.content_type = "text/read-plain";[m
[31m---- response_headers[m
[31m-Content-Type: text/read-plain[m
[31m---- response_body[m
[31m-Hi[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.ctx available in header_filter_by_lua (already defined)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.ctx.counter = 3 ngx.say(ngx.ctx.counter)';[m
[31m-        header_filter_by_lua 'ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-3[m
[31m---- error_log[m
[31m-ngx.ctx.counter: 3[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.ctx available in header_filter_by_lua (not defined yet)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)[m
[31m-            ngx.ctx.counter = "hello world"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-ngx.ctx.counter: nil[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: global got cleared for each single request[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $foo '';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say(ngx.var.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            if not foo then[m
[31m-                foo = 1[m
[31m-            else[m
[31m-                foo = foo + 1[m
[31m-            end[m
[31m-            ngx.var.foo = foo[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: lua error (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $foo '';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say(ngx.var.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            error("Something bad")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to run header_filter_by_lua*: header_filter_by_lua:2: Something bad[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: lua error (nil)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $foo '';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say(ngx.var.foo)[m
[31m-        ';[m
[31m-        header_filter_by_lua '[m
[31m-            error(nil)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to run header_filter_by_lua*: unknown reason[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: no ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.print(32) return 1";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: no ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.say(32) return 1";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: no ngx.flush[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.flush()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: no ngx.eof[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.eof()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: no ngx.send_headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua "ngx.send_headers()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: no ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.location.capture("/sub")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: no ngx.location.capture_multi[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.location.capture_multi{{"/sub"}}';[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: no ngx.redirect[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.redirect("/blah")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: no ngx.exec[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.exec("/blah")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: no ngx.req.set_uri(uri, true)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.req.set_uri("/blah", true)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: ngx.req.set_uri(uri) exists[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.req.set_uri("/blah") return 1';[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.say("uri: ", ngx.var.uri)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-uri: /blah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: no ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'ngx.req.read_body()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: no ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'return ngx.req.socket()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: no ngx.socket.tcp()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'return ngx.socket.tcp()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: no ngx.socket.connect()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        header_filter_by_lua 'return ngx.socket.connect("127.0.0.1", 80)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: clear content-length[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 12[m
[31m-            ngx.say("hello world")[m
[31m-        ';[m
[31m-        header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_headers[m
[31m-!content-length[m
[31m---- response_body[m
[31m-hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: backtrace[m
[31m---- config[m
[31m-    location /t {[m
[31m-        header_filter_by_lua '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                error("something bad happened")[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-        ';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-something bad happened[m
[31m-stack traceback:[m
[31m-in function 'error'[m
[31m-in function 'bar'[m
[31m-in function 'foo'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        header_filter_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: filter finalize[m
[31m---- config[m
[31m-    error_page 582 = /bar;[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(582)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /bar {[m
[31m-        echo hi;[m
[31m-        header_filter_by_lua '[m
[31m-            return ngx.exit(302)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/042-crc32.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/042-crc32.t[m
[1mdeleted file mode 100644[m
[1mindex 86d9201..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/042-crc32.t[m
[1m+++ /dev/null[m
[36m@@ -1,57 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: short sanity[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.crc32_short("hello, world"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-4289425978[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: long sanity[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.crc32_long("hello, world"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-4289425978[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: long sanity (empty)[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.crc32_long(""))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-0[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/043-shdict.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/043-shdict.t[m
[1mdeleted file mode 100644[m
[1mindex cd160f7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/043-shdict.t[m
[1m+++ /dev/null[m
[36m@@ -1,2450 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 18);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: string key, int value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: string key, floating-point value[m
[31m---- http_config[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local cats = ngx.shared.cats[m
[31m-            cats:set("foo", 3.14159)[m
[31m-            cats:set("baz", 1.28)[m
[31m-            cats:set("baz", 3.96)[m
[31m-            local val = cats:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = cats:get("baz")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-3.14159 number[m
[31m-3.96 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: string key, boolean value[m
[31m---- http_config[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local cats = ngx.shared.cats[m
[31m-            cats:set("foo", true)[m
[31m-            cats:set("bar", false)[m
[31m-            local val = cats:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = cats:get("bar")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-true boolean[m
[31m-false boolean[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: number keys, string values[m
[31m---- http_config[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local cats = ngx.shared.cats[m
[31m-            ngx.say(cats:set(1234, "cat"))[m
[31m-            ngx.say(cats:set("1234", "dog"))[m
[31m-            ngx.say(cats:set(256, "bird"))[m
[31m-            ngx.say(cats:get(1234))[m
[31m-            ngx.say(cats:get("1234"))[m
[31m-            local val = cats:get("256")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-truenilfalse[m
[31m-truenilfalse[m
[31m-truenilfalse[m
[31m-dog[m
[31m-dog[m
[31m-bird string[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: different-size values set to the same key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "hello")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello[m
[31m-hello, world[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: expired entries (can be auto-removed by get)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0.01)[m
[31m-            ngx.location.capture("/sleep/0.01")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/sleep/(.+)' {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: expired entries (can NOT be auto-removed by get)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 56, 0.001)[m
[31m-            dogs:set("baz", 78, 0.001)[m
[31m-            dogs:set("foo", 32, 0.01)[m
[31m-            ngx.location.capture("/sleep/0.012")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/sleep/(.+)' {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: not yet expired entries[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0.5)[m
[31m-            ngx.location.capture("/sleep/0.01")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/sleep/(.+)' {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: forcibly override other valid entries[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep(" hello", 10) .. i[m
[31m-                local res, err, forcible = dogs:set("key_" .. i, val)[m
[31m-                if not res or forcible then[m
[31m-                    ngx.say(res, " ", err, " ", forcible)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-            ngx.say("cur value: ", dogs:get("key_" .. i))[m
[31m-            if i > 1 then[m
[31m-                ngx.say("1st value: ", dogs:get("key_1"))[m
[31m-            end[m
[31m-            if i > 2 then[m
[31m-                ngx.say("2nd value: ", dogs:get("key_2"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-my $a = "true nil true\nabort at (353|705)\ncur value: " . (" hello" x 10) . "\\1\n1st value: nil\n2nd value: " . (" hello" x 10) . "2\n";[m
[31m-[qr/$a/,[m
[31m-"true nil true\nabort at 1\ncur value: " . (" hello" x 10) . "1\n"[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: forcibly override other valid entries and test LRU[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep(" hello", 10) .. i[m
[31m-                if i == 10 then[m
[31m-                    dogs:get("key_1")[m
[31m-                end[m
[31m-                local res, err, forcible = dogs:set("key_" .. i, val)[m
[31m-                if not res or forcible then[m
[31m-                    ngx.say(res, " ", err, " ", forcible)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-            ngx.say("cur value: ", dogs:get("key_" .. i))[m
[31m-            if i > 1 then[m
[31m-                ngx.say("1st value: ", dogs:get("key_1"))[m
[31m-            end[m
[31m-            if i > 2 then[m
[31m-                ngx.say("2nd value: ", dogs:get("key_2"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-my $a = "true nil true\nabort at (353|705)\ncur value: " . (" hello" x 10) . "\\1\n1st value: " . (" hello" x 10) . "1\n2nd value: nil\n";[m
[31m-[qr/$a/,[m
[31m-"true nil true\nabort at 2\ncur value: " . (" hello" x 10) . "2\n1st value: " . (" hello" x 10) . "1\n"[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: dogs and cats dicts[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local cats = ngx.shared.cats[m
[31m-            dogs:set("foo", 32)[m
[31m-            cats:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            ngx.say(cats:get("foo"))[m
[31m-            dogs:set("foo", 56)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            ngx.say(cats:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m-hello, world[m
[31m-56[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: get non-existent keys[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: not feed the object into the call[m
[31m---- SKIP[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local rc, err = pcall(dogs.set, "foo", 3, 0.01)[m
[31m-            ngx.say(rc, " ", err)[m
[31m-            rc, err = pcall(dogs.set, "foo", 3)[m
[31m-            ngx.say(rc, " ", err)[m
[31m-            rc, err = pcall(dogs.get, "foo")[m
[31m-            ngx.say(rc, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-false bad argument #1 to '?' (userdata expected, got string)[m
[31m-false expecting 3, 4 or 5 arguments, but only seen 2[m
[31m-false expecting exactly two arguments, but only seen 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: too big value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 50k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage("collect")[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local res, err, forcible = dogs:set("foo", string.rep("helloworld", 10000))[m
[31m-            ngx.say(res, " ", err, " ", forcible)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-false no memory false[m
[31m---- log_level: info[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[31m-ngx_slab_alloc() failed: no memory in lua_shared_dict zone[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: set too large key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local key = string.rep("a", 65535)[m
[31m-            local rc, err = dogs:set(key, "hello")[m
[31m-            ngx.say(rc, " ", err)[m
[31m-            ngx.say(dogs:get(key))[m
[31m-[m
[31m-            key = string.rep("a", 65536)[m
[31m-            ok, err = dogs:set(key, "world")[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-true nil[m
[31m-hello[m
[31m-not ok: key too long[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad value type[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", dogs)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: bad value type[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: delete after setting values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:delete("foo")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m-nil[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: delete at first[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:delete("foo")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: set nil after setting values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", nil)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m-nil[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: set nil at first[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", nil)[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-            dogs:set("foo", "hello, world")[m
[31m-            ngx.say(dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-nil[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: fail to allocate memory[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep("hello", i )[m
[31m-                local res, err, forcible = dogs:set("key_" .. i, val)[m
[31m-                if not res or forcible then[m
[31m-                    ngx.say(res, " ", err, " ", forcible)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like[m
[31m-^true nil true\nabort at (?:139|140)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: string key, int value (write_by_lua)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: string key, int value (access_by_lua)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        access_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: string key, int value (set_by_lua)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set_by_lua $res '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            return dogs:get("foo")[m
[31m-        ';[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: string key, int value (header_by_lua)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            ngx.header["X-Foo"] = dogs:get("foo")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_headers[m
[31m-X-Foo: 32[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: too big value (forcible)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 50k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage("collect")[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bah", "hello")[m
[31m-            local res, err, forcible = dogs:set("foo", string.rep("helloworld", 10000))[m
[31m-            ngx.say(res, " ", err, " ", forcible)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-false no memory true[m
[31m---- log_level: info[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[31m-ngx_slab_alloc() failed: no memory in lua_shared_dict zone[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: add key (key exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err, forcible = dogs:add("foo", 10502)[m
[31m-            ngx.say("add: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-add: false exists false[m
[31m-foo = 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: add key (key not exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bah", 32)[m
[31m-            local res, err, forcible = dogs:add("foo", 10502)[m
[31m-            ngx.say("add: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-add: true nil false[m
[31m-foo = 10502[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: add key (key expired)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 32, 0.001)[m
[31m-            dogs:set("baz", 32, 0.001)[m
[31m-            dogs:set("foo", 32, 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local res, err, forcible = dogs:add("foo", 10502)[m
[31m-            ngx.say("add: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-add: true nil false[m
[31m-foo = 10502[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: add key (key expired and value size unmatched)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 32, 0.001)[m
[31m-            dogs:set("baz", 32, 0.001)[m
[31m-            dogs:set("foo", "hi", 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local res, err, forcible = dogs:add("foo", "hello")[m
[31m-            ngx.say("add: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-add: true nil false[m
[31m-foo = hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: incr key (key exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err, forcible = dogs:replace("foo", 10502)[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-[m
[31m-            local res, err, forcible = dogs:replace("foo", "hello")[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-replace: true nil false[m
[31m-foo = 10502[m
[31m-replace: true nil false[m
[31m-foo = hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: replace key (key not exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bah", 32)[m
[31m-            local res, err, forcible = dogs:replace("foo", 10502)[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-replace: false not found false[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: replace key (key expired)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 3, 0.001)[m
[31m-            dogs:set("baz", 2, 0.001)[m
[31m-            dogs:set("foo", 32, 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local res, err, forcible = dogs:replace("foo", 10502)[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-replace: false not found false[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: replace key (key expired and value size unmatched)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 32, 0.001)[m
[31m-            dogs:set("baz", 32, 0.001)[m
[31m-            dogs:set("foo", "hi", 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local rc, err, forcible = dogs:replace("foo", "hello")[m
[31m-            ngx.say("replace: ", rc, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-replace: false not found false[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: incr key (key exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err = dogs:incr("foo", 10502)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: 10534 nil[m
[31m-foo = 10534[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: replace key (key not exists)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bah", 32)[m
[31m-            local res, err = dogs:incr("foo", 2)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: nil not found[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: replace key (key expired)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("bar", 3, 0.001)[m
[31m-            dogs:set("baz", 2, 0.001)[m
[31m-            dogs:set("foo", 32, 0.001)[m
[31m-            ngx.location.capture("/sleep/0.002")[m
[31m-            local res, err = dogs:incr("foo", 10502)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: nil not found[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: incr key (incr by 0)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err = dogs:incr("foo", 0)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: 32 nil[m
[31m-foo = 32[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: incr key (incr by floating point number)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err = dogs:incr("foo", 0.14)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: 32.14 nil[m
[31m-foo = 32.14[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: incr key (incr by negative numbers)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            local res, err = dogs:incr("foo", -0.14)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: 31.86 nil[m
[31m-foo = 31.86[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: incr key (original value is not number)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", true)[m
[31m-            local res, err = dogs:incr("foo", -0.14)[m
[31m-            ngx.say("incr: ", res, " ", err)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-incr: nil not a number[m
[31m-foo = true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: get and set with flags[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0, 199)[m
[31m-            dogs:set("bah", 10502, 202)[m
[31m-            local val, flags = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            ngx.say(flags, " ", type(flags))[m
[31m-            val, flags = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            ngx.say(flags, " ", type(flags))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-199 number[m
[31m-10502 number[m
[31m-nil nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: expired entries (can be auto-removed by get), with flags set[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0.01, 255)[m
[31m-            ngx.location.capture("/sleep/0.01")[m
[31m-            local res, flags = dogs:get("foo")[m
[31m-            ngx.say("res = ", res, ", flags = ", flags)[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ '^/sleep/(.+)' {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-res = nil, flags = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: flush_all[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-[m
[31m-            dogs:flush_all()[m
[31m-[m
[31m-            val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m-nil nil[m
[31m-nil nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: flush_expires[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "x", 1)[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 100)[m
[31m-[m
[31m-            ngx.sleep(1.5)[m
[31m-[m
[31m-            local num = dogs:flush_expired()[m
[31m-            ngx.say(num)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: flush_expires with number[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            for i=1,100 do[m
[31m-                dogs:set(tostring(i), "x", 1)[m
[31m-            end[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 100)[m
[31m-[m
[31m-            ngx.sleep(1.5)[m
[31m-[m
[31m-            local num = dogs:flush_expired(42)[m
[31m-            ngx.say(num)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-42[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: flush_expires an empty dict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local num = dogs:flush_expired()[m
[31m-            ngx.say(num)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: flush_expires a dict without expired items[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 100)[m
[31m-[m
[31m-            local num = dogs:flush_expired()[m
[31m-            ngx.say(num)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: list all keys in a shdict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 0)[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-            table.sort(keys)[m
[31m-            for _,k in ipairs(keys) do[m
[31m-                ngx.say(k)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-2[m
[31m-bah[m
[31m-bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: list keys in a shdict with limit[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 0)[m
[31m-            local keys = dogs:get_keys(1)[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: list all keys in a shdict with expires[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "x", 1)[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 100)[m
[31m-[m
[31m-            ngx.sleep(1.5)[m
[31m-[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: list keys in a shdict with limit larger than number of keys[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            dogs:set("bah", "y", 0)[m
[31m-            dogs:set("bar", "z", 0)[m
[31m-            local keys = dogs:get_keys(3)[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: list keys in an empty shdict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: list keys in an empty shdict with a limit[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local keys = dogs:get_keys(4)[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: list all keys in a shdict with all keys expired[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "x", 1)[m
[31m-            dogs:set("bah", "y", 1)[m
[31m-            dogs:set("bar", "z", 1)[m
[31m-[m
[31m-            ngx.sleep(1.5)[m
[31m-[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: list all keys in a shdict with more than 1024 keys with no limit set[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            for i=1,2048 do[m
[31m-                dogs:set(tostring(i), i)[m
[31m-            end[m
[31m-            local keys = dogs:get_keys()[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1024[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 57: list all keys in a shdict with more than 1024 keys with 0 limit set[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            for i=1,2048 do[m
[31m-                dogs:set(tostring(i), i)[m
[31m-            end[m
[31m-            local keys = dogs:get_keys(0)[m
[31m-            ngx.say(#keys)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-2048[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 58: safe_set[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep(" hello", 10) .. i[m
[31m-                local res, err = dogs:safe_set("key_" .. i, val)[m
[31m-                if not res then[m
[31m-                    ngx.say(res, " ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-            ngx.say("cur value: ", dogs:get("key_" .. i))[m
[31m-            if i > 1 then[m
[31m-                ngx.say("1st value: ", dogs:get("key_1"))[m
[31m-            end[m
[31m-            if i > 2 then[m
[31m-                ngx.say("2nd value: ", dogs:get("key_2"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-my $a = "false no memory\nabort at (353|705)\ncur value: nil\n1st value: " . (" hello" x 10) . "1\n2nd value: " . (" hello" x 10) . "2\n";[m
[31m-[qr/$a/, qr/$a/][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 59: safe_add[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 100k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local i = 0[m
[31m-            while i < 1000 do[m
[31m-                i = i + 1[m
[31m-                local val = string.rep(" hello", 10) .. i[m
[31m-                local res, err = dogs:safe_add("key_" .. i, val)[m
[31m-                if not res then[m
[31m-                    ngx.say(res, " ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("abort at ", i)[m
[31m-            ngx.say("cur value: ", dogs:get("key_" .. i))[m
[31m-            if i > 1 then[m
[31m-                ngx.say("1st value: ", dogs:get("key_1"))[m
[31m-            end[m
[31m-            if i > 2 then[m
[31m-                ngx.say("2nd value: ", dogs:get("key_2"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /test", "GET /test"][m
[31m---- response_body eval[m
[31m-my $a = "false no memory\nabort at (353|705)\ncur value: nil\n1st value: " . (" hello" x 10) . "1\n2nd value: " . (" hello" x 10) . "2\n";[m
[31m-[qr/$a/,[m
[31m-q{false exists[m
[31m-abort at 1[m
[31m-cur value:  hello hello hello hello hello hello hello hello hello hello1[m
[31m-}[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 60: get_stale: expired entries can still be fetched[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, 0.01)[m
[31m-            dogs:set("blah", 33, 0.3)[m
[31m-            ngx.sleep(0.02)[m
[31m-            local val, flags, stale = dogs:get_stale("foo")[m
[31m-            ngx.say(val, ", ", flags, ", ", stale)[m
[31m-            local val, flags, stale = dogs:get_stale("blah")[m
[31m-            ngx.say(val, ", ", flags, ", ", stale)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32, nil, true[m
[31m-33, nil, false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 61: set nil key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set(nil, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 62: set bad zone argument[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs.set(nil, "foo", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 63: set empty string keys[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: empty key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 64: get bad zone argument[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs.get(nil, "foo")[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 65: get nil key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get(nil)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 66: get empty key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get("")[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: empty key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 67: get a too-long key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get(string.rep("a", 65536))[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: key too long[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 68: set & get large values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", string.rep("helloworld", 1024))[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err = dogs:get("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get ok: ", #data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get ok: 10240[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 69: get_stale nil key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get_stale(nil)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 70: get_stale empty key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get_stale("")[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: empty key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 71: get_stale number key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set(1024, "hello")[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-            local data, err = dogs:get_stale(1024)[m
[31m-            if not ok then[m
[31m-                ngx.say("get_stale not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get_stale: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 72: get_stale a too-long key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:get_stale(string.rep("a", 65536))[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: key too long[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 73: get_stale a non-existent key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local data, err = dogs:get_stale("not_found")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get ok: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-get ok: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 74: set & get_stale large values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", string.rep("helloworld", 1024))[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err, stale = dogs:get_stale("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get_stale ok: ", #data, ", stale: ", stale)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale ok: 10240, stale: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 75: set & get_stale boolean values (true)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", true)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err, stale = dogs:get_stale("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get_stale ok: ", data, ", stale: ", stale)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale ok: true, stale: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 76: set & get_stale boolean values (false)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", false)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err, stale = dogs:get_stale("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("get_stale ok: ", data, ", stale: ", stale)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale ok: false, stale: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 77: set & get_stale with a flag[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:set("foo", false, 0, 325)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-[m
[31m-            local data, err, stale = dogs:get_stale("foo")[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            flags = err[m
[31m-            ngx.say("get_stale ok: ", data, ", flags: ", flags,[m
[31m-                    ", stale: ", stale)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-get_stale ok: false, flags: 325, stale: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 78: incr nil key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:incr(nil, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: nil key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 79: incr bad zone argument[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs.incr(nil, "foo", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 80: incr empty string keys[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:incr("", 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: empty key[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 81: incr too long key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local key = string.rep("a", 65536)[m
[31m-            local ok, err = dogs:incr(key, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: key too long[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 82: incr number key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local key = 56[m
[31m-            local ok, err = dogs:set(key, 1)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-            ok, err = dogs:incr(key, 32)[m
[31m-            if not ok then[m
[31m-                ngx.say("incr not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("incr ok")[m
[31m-            local data, err = dogs:get(key)[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local flags = err[m
[31m-            ngx.say("get ok: ", data, ", flags: ", flags)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-incr ok[m
[31m-get ok: 33, flags: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 83: incr a number-like string key[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local key = 56[m
[31m-            local ok, err = dogs:set(key, 1)[m
[31m-            if not ok then[m
[31m-                ngx.say("set not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("set ok")[m
[31m-            ok, err = dogs:incr(key, "32")[m
[31m-            if not ok then[m
[31m-                ngx.say("incr not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("incr ok")[m
[31m-            local data, err = dogs:get(key)[m
[31m-            if data == nil and err then[m
[31m-                ngx.say("get not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local flags = err[m
[31m-            ngx.say("get ok: ", data, ", flags: ", flags)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-set ok[m
[31m-incr ok[m
[31m-get ok: 33, flags: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 84: add nil values[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local ok, err = dogs:add("foo", nil)[m
[31m-            if not ok then[m
[31m-                ngx.say("not ok: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not ok: attempt to add or replace nil values[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 85: replace key with exptime[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 2, 0)[m
[31m-            dogs:replace("foo", 32, 0.01)[m
[31m-            local data = dogs:get("foo")[m
[31m-            ngx.say("get foo: ", data)[m
[31m-            ngx.location.capture("/sleep/0.02")[m
[31m-            local res, err, forcible = dogs:replace("foo", 10502)[m
[31m-            ngx.say("replace: ", res, " ", err, " ", forcible)[m
[31m-            ngx.say("foo = ", dogs:get("foo"))[m
[31m-        ';[m
[31m-    }[m
[31m-    location ~ ^/sleep/(.+) {[m
[31m-        echo_sleep $1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-get foo: 32[m
[31m-replace: false not found false[m
[31m-foo = nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 86: the lightuserdata ngx.null has no methods of shared dicts.[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local lightuserdata = ngx.null[m
[31m-            lightuserdata:set("foo", 1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- grep_error_log chop[m
[31m-attempt to index local 'lightuserdata' (a userdata value)[m
[31m---- grep_error_log_out[m
[31m-attempt to index local 'lightuserdata' (a userdata value)[m
[31m---- error_log[m
[31m-[error][m
[31m---- no_error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 87: set bad zone table[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs.set({1}, "foo", 1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 88: get bad zone table[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs.get({1}, "foo")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "zone" argument[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 89: incr bad zone table[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs.incr({1}, "foo", 32)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 90: check the type of the shdict object[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("type: ", type(ngx.shared.dogs))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-type: table[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 91: dogs, cat mixing[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-[m
[31m-            local cats = ngx.shared.cats[m
[31m-            val = cats:get("foo")[m
[31m-            ngx.say(val or "nil")[m
[31m-            val = cats:get("bah")[m
[31m-            ngx.say(val or "nil")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m-nil[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 92: invalid expire time[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32, -1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad "exptime" argument[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/044-req-body.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/044-req-body.t[m
[1mdeleted file mode 100644[m
[1mindex 28fa818..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/044-req-body.t[m
[1m+++ /dev/null[m
[36m@@ -1,1740 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 52 );[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read buffered body[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read buffered body (timed out)[m
[31m---- config[m
[31m-    client_body_timeout 1ms;[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /test HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 100\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-hello, world"[m
[31m---- response_body:[m
[31m---- error_code_like: ^(?:500)?$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read buffered body and then subrequest[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: first subrequest and then read buffered body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        echo -n foo;[m
[31m-    }[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/foo");[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub: foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: discard body[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: not discard body (content_by_lua falls through)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: read buffered body and retrieve the data[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: read buffered body to file and call get_body_data[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: read buffered body to file and call get_body_file[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_file())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body_like: client_body_temp/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: read buffered body to memory and retrieve the file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_file())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: read buffered body to memory and reset it with data in memory[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear")[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            ngx.say(ngx.var.echo_request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hiya, dear[m
[31m-hiya, dear[m
[31m-hiya, dear[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: read body to file and then override it with data in memory[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hello, baby")[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-yeah[m
[31m---- response_body[m
[31m-hello, baby[m
[31m-hello, baby[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: do not read the current request body but replace it with our own in memory[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_body_data("hello, baby")[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-yeah[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/lua entry thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):2: request body not read yet/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: read buffered body to file and reset it to a new file[m
[31m---- config[m
[31m-[m
[31m-    location = /test {[m
[31m-        client_body_in_file_only on;[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.var.old = ngx.req.get_body_file()[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-            ngx.var.new = ngx.req.get_body_file()[m
[31m-        ';[m
[31m-        #echo_request_body;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        #proxy_pass http://127.0.0.1:7890/echo;[m
[31m-        add_header X-Old $old;[m
[31m-        add_header X-New $new;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- raw_response_headers_like[m
[31m-X-Old: \S+/client_body_temp/\d+\r[m
[31m-.*?X-New: \S+/html/a\.txt\r[m
[31m---- response_body[m
[31m-Will you change this world?[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: read buffered body to file and reset it to a new file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        client_body_in_file_only on;[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.var.old = ngx.req.get_body_file() or ""[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-            ngx.var.new = ngx.req.get_body_file()[m
[31m-        ';[m
[31m-        #echo_request_body;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        #proxy_pass http://127.0.0.1:7890/echo;[m
[31m-        add_header X-Old $old;[m
[31m-        add_header X-New $new;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world![m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- raw_response_headers_like[m
[31m-X-Old: \S+/client_body_temp/\d+\r[m
[31m-.*?X-New: \S+/html/a\.txt\r[m
[31m---- response_body[m
[31m-Will you change this world?[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: read buffered body to file and reset it to a new file (auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only on;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.var.old = ngx.req.get_body_file()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, true)[m
[31m-            local b_file = ngx.var.realpath_root .. "/b.txt"[m
[31m-            ngx.req.set_body_file(b_file, true)[m
[31m-            ngx.say("a.txt exists: ", io.open(a_file) and "yes" or "no")[m
[31m-            ngx.say("b.txt exists: ", io.open(b_file) and "yes" or "no")[m
[31m-        ';[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m->>> b.txt[m
[31m-Sure I will![m
[31m---- response_body[m
[31m-a.txt exists: no[m
[31m-b.txt exists: yes[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: read buffered body to memoary and reset it to a new file (auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, true)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hey, you"][m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- response_body eval[m
[31m-["Will you change this world?\n",[m
[31m-qr/500 Internal Server Error/][m
[31m---- error_code eval[m
[31m-[200, 500][m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: read buffered body to memoary and reset it to a new file (no auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, false)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hey, you"][m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- response_body eval[m
[31m-["Will you change this world?\n",[m
[31m-"Will you change this world?\n"][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: request body discarded and reset it to a new file (auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-    client_header_buffer_size 80;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, false)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: no request body and reset it to a new file (no auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, true)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/lua entry thread aborted: runtime error: rewrite_by_lua\(nginx\.conf:\d+\):3: request body not read yet/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: read buffered body to memory and reset it with data in memory + proxy[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear dear friend!")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body chomp[m
[31m-hiya, dear dear friend![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: discard request body and reset it to a new file (no auto-clean)[m
[31m---- config[m
[31m-    client_body_in_file_only off;[m
[31m-[m
[31m-    location = /test {[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-            local a_file = ngx.var.realpath_root .. "/a.txt"[m
[31m-            ngx.req.set_body_file(a_file, true)[m
[31m-        ';[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m-[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: discard body and then read[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hello, world"][m
[31m---- response_body eval[m
[31m-["nil","nil"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: set empty request body in memory[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: [", ngx.req.get_body_data(), "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hello, world"][m
[31m---- response_body eval[m
[31m-["body: [nil]\n","body: [nil]\n"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: set empty request body in file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: [", ngx.req.get_body_data(), "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m---- pipelined_requests eval[m
[31m-["POST /test[m
[31m-hello, world",[m
[31m-"POST /test[m
[31m-hello, world"][m
[31m---- response_body eval[m
[31m-["body: [nil]\n","body: [nil]\n"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: read and set body[m
[31m---- config[m
[31m-    location /test {[m
[31m-        lua_need_request_body on;[m
[31m-        access_by_lua_file html/myscript.lua;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> myscript.lua[m
[31m-    local data, data2 = ngx.req.get_post_args(), {}[m
[31m-    for k, v in pairs(data) do[m
[31m-        if type(v) == "table" then[m
[31m-            for i, val in ipairs(v) do[m
[31m-                local s = ngx.escape_uri(string.upper(k)) .. '='[m
[31m-                        .. ngx.escape_uri(string.upper(val))[m
[31m-                table.insert(data2, s)[m
[31m-            end[m
[31m-        else[m
[31m-            local s = ngx.escape_uri(string.upper(k)) .. '='[m
[31m-                    .. ngx.escape_uri(string.upper(v))[m
[31m-            table.insert(data2, s)[m
[31m-        end[m
[31m-    end[m
[31m-    ngx.req.set_body_data(table.concat(data2, "&"))[m
[31m---- request[m
[31m-POST /test[m
[31m-a=1&a=2&b=hello&c=world[m
[31m---- response_body[m
[31m-B=HELLO&A=1&A=2&C=WORLD[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: read buffered body to memory and reset it with data in memory + proxy twice[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear dear friend!")[m
[31m-            ngx.req.set_body_data("howdy, my dear little sister!")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body chomp[m
[31m-howdy, my dear little sister![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: read buffered body to memory and reset it with data in memory and then reset it to file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear dear friend!")[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-howdy, my dear little sister![m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-howdy, my dear little sister![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: read buffered body to memory and reset it with empty string + proxy twice[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_data("hiya, dear dear friend!")[m
[31m-            ngx.req.set_body_data("")[m
[31m-        ';[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-    location = /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body chomp[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: multi-buffer request body[m
[31m---- config[m
[31m-    location /foo {[m
[31m-        default_type text/css;[m
[31m-        srcache_store POST /store;[m
[31m-[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-    }[m
[31m-[m
[31m-    location /store {[m
[31m-        content_by_lua '[m
[31m-            local body = ngx.req.get_body_data()[m
[31m-            ngx.log(ngx.WARN, "srcache_store: request body len: ", #body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /foo[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- error_log[m
[31m-srcache_store: request body len: 55[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: init & append & finish (just in buffer)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_write_request_body) {[m
[31m-    b = ngx_chain_buf($body)[m
[31m-    println("buf: ", b,[m
[31m-        ", in-mem: ", ngx_buf_in_memory(b),[m
[31m-        ", size: ", ngx_buf_size(b),[m
[31m-        ", data: ", ngx_buf_data(b))[m
[31m-}[m
[31m---- response_body[m
[31m-content length: 4[m
[31m-body: hell[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: init & append & finish (exceeding the buffer size)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.append_body("o")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-            local file = ngx.req.get_body_file()[m
[31m-            if not file then[m
[31m-                ngx.say("body file: ", file)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f, err = io.open(file, "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open file: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = f:read("*a")[m
[31m-            f:close()[m
[31m-            ngx.say("body file: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_write_request_body) {[m
[31m-    b = ngx_chain_buf($body)[m
[31m-    println("buf: ", b,[m
[31m-        ", in-mem: ", ngx_buf_in_memory(b),[m
[31m-        ", size: ", ngx_buf_size(b),[m
[31m-        ", data: ", ngx_buf_data(b))[m
[31m-}[m
[31m-F(ngx_open_tempfile) {[m
[31m-    println("open temp file ", user_string($name), ", persist: ", $persistent)[m
[31m-}[m
[31m-F(ngx_pool_delete_file) {[m
[31m-    println("delete ", ngx_pool_cleanup_file_name($data))[m
[31m-}[m
[31m---- response_body[m
[31m-content length: 5[m
[31m-body: nil[m
[31m-body file: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: init & append & finish (use default buffer size) - body not read yet[m
[31m---- config[m
[31m-    location /t {[m
[31m-        client_body_buffer_size 4;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.init_body()[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/lua entry thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):2: request body not read yet/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: init & append & finish (use default buffer size)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        client_body_buffer_size 4;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body()[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-content length: 4[m
[31m-body: hell[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: init & append & finish (exceeding the buffer size, proxy)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.append_body("o\\n")[m
[31m-            ngx.req.finish_body()[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-i do like the sky[m
[31m-[m
[31m---- stap[m
[31m-global valid = 0[m
[31m-[m
[31m-F(ngx_http_handler) { valid = 1  }[m
[31m-[m
[31m-probe syscall.unlink {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(name, "(", argstr, ")")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-^unlink\(".*?client_body_temp/\d+"\)$[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: init & append & finish (just in buffer, proxy)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.finish_body()[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-i do like the sky[m
[31m---- response_body chop[m
[31m-hell[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: init & append & finish (exceeding buffer size, discard on-disk buffer)[m
[31m---- config[m
[31m-    client_header_buffer_size 100;[m
[31m-    location /t {[m
[31m-        client_body_buffer_size 4;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            -- ngx.say("original body: ", ngx.req.get_body_data())[m
[31m-            -- ngx.say("original body file: ", ngx.req.get_body_file())[m
[31m-[m
[31m-            ngx.req.init_body(4)[m
[31m-            ngx.req.append_body("h")[m
[31m-            ngx.req.append_body("ell")[m
[31m-            ngx.req.append_body("o")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-            local file = ngx.req.get_body_file()[m
[31m-            if not file then[m
[31m-                ngx.say("body file: ", file)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local f, err = io.open(file, "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open file: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = f:read("*a")[m
[31m-            f:close()[m
[31m-            ngx.say("body file: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-" . ("howdyworld" x 15)[m
[31m---- stap[m
[31m-/*[m
[31m-F(ngx_http_read_client_request_body) { T() }[m
[31m-M(http-read-body-abort) { println("read body aborted: ", user_string($arg2)) }[m
[31m-M(http-read-req-header-done) { println("req header: ", ngx_table_elt_key($arg2), ": ", ngx_table_elt_value($arg2)) }[m
[31m-#probe syscall.open { if (isinstr(argstr, "temp")) { println(name, ": ", argstr) } }[m
[31m-[m
[31m-probe syscall.unlink {[m
[31m-    println(name, ": ", argstr, " :", target(), " == ", pid(), ": ", execname())[m
[31m-    system(sprintf("ps aux|grep %d|grep -v grep > /dev/stderr", target()))[m
[31m-    system(sprintf("ps aux|grep %d|grep -v grep  > /dev/stderr", pid()))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-global valid = 0[m
[31m-[m
[31m-F(ngx_http_handler) { valid = 1  }[m
[31m-#F(ngx_http_free_request) { valid = 0 }[m
[31m-[m
[31m-probe syscall.unlink {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(name, "(", argstr, ")")[m
[31m-        #print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-probe syscall.close, syscall.open, syscall.unlink {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        print(name, "(", argstr, ")")[m
[31m-        #print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.close.return, syscall.open.return, syscall.unlink.return {[m
[31m-    if (valid && pid() == target()) {[m
[31m-        println(" = ", retstr)[m
[31m-    }[m
[31m-}[m
[31m-*/[m
[31m---- stap_out_like chop[m
[31m-^unlink\(".*?client_body_temp/\d+"\)[m
[31m-unlink\(".*?client_body_temp/\d+"\)$[m
[31m---- response_body[m
[31m-content length: 5[m
[31m-body: nil[m
[31m-body file: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: ngx.req.socket + init & append & finish (requests)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        client_body_buffer_size 1;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-        content_by_lua '[m
[31m-            local sock,err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.init_body(100)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err = sock:receive(1)[m
[31m-                if not data then[m
[31m-                    if err == "closed" then[m
[31m-                        break[m
[31m-                    else[m
[31m-                        ngx.say("failed to read body: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-                ngx.req.append_body(data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello, my dear friend![m
[31m---- response_body[m
[31m-content length: 22[m
[31m-body: hello, my dear friend![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: ngx.req.socket + init & append & finish (pipelined requests, small buffer size)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        client_body_buffer_size 1;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-        content_by_lua '[m
[31m-            local sock,err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.init_body(100)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err = sock:receive(1)[m
[31m-                if not data then[m
[31m-                    if err == "closed" then[m
[31m-                        break[m
[31m-                    else[m
[31m-                        ngx.say("failed to read body: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-                ngx.req.append_body(data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello, my dear friend!",[m
[31m-"POST /t[m
[31m-blah blah blah"][m
[31m---- response_body eval[m
[31m-["content length: 22[m
[31m-body: hello, my dear friend![m
[31m-","content length: 14[m
[31m-body: blah blah blah[m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: ngx.req.socket + init & append & finish (pipelined requests, big buffer size)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        client_body_buffer_size 100;[m
[31m-        lua_socket_buffer_size 100;[m
[31m-        content_by_lua '[m
[31m-            local sock,err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.init_body(100)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(100)[m
[31m-                if not data then[m
[31m-                    if err == "closed" then[m
[31m-                        ngx.req.append_body(partial)[m
[31m-                        break[m
[31m-                    else[m
[31m-                        ngx.say("failed to read body: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-                ngx.req.append_body(data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            ngx.say("body: ", data)[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello, my dear friend!",[m
[31m-"POST /t[m
[31m-blah blah blah"][m
[31m---- response_body eval[m
[31m-["content length: 22[m
[31m-body: hello, my dear friend![m
[31m-","content length: 14[m
[31m-body: blah blah blah[m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: calling ngx.req.socket after ngx.req.read_body[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        client_body_buffer_size 100;[m
[31m-        lua_socket_buffer_size 100;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello, my dear friend![m
[31m---- response_body[m
[31m-failed to get req socket: request body already exists[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- no_error_log[m
[31m-a client request body is buffered to a temporary file[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: failed to write 100 continue[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-http finalize request: 500, "/test?" a:1, c:0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: chunked support in ngx.req.read_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-5\r[m
[31m-hello\r[m
[31m-1\r[m
[31m-,\r[m
[31m-1\r[m
[31m- \r[m
[31m-5\r[m
[31m-world\r[m
[31m-0\r[m
[31m-\r[m
[31m-"[m
[31m-[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- skip_nginx: 4: <1.3.9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: zero size request body and reset it to a new file[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        client_body_in_file_only on;[m
[31m-        set $old '';[m
[31m-        set $new '';[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.set_body_file(ngx.var.realpath_root .. "/a.txt")[m
[31m-            ngx.var.new = ngx.req.get_body_file()[m
[31m-        ';[m
[31m-        #echo_request_body;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        #proxy_pass http://127.0.0.1:7890/echo;[m
[31m-        add_header X-Old $old;[m
[31m-        add_header X-New $new;[m
[31m-    }[m
[31m-    location /echo {[m
[31m-        echo_read_request_body;[m
[31m-        echo_request_body;[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m---- user_files[m
[31m->>> a.txt[m
[31m-Will you change this world?[m
[31m-[m
[31m---- stap[m
[31m-probe syscall.fcntl {[m
[31m-    O_DIRECT = 0x4000[m
[31m-    if (pid() == target() && ($arg & O_DIRECT)) {[m
[31m-        println("fcntl(O_DIRECT)")[m
[31m-    }[m
[31m-}[m
[31m---- stap_out_unlike[m
[31m-fcntl\(O_DIRECT\)[m
[31m-[m
[31m---- raw_response_headers_like[m
[31m-.*?X-New: \S+/html/a\.txt\r[m
[31m---- response_body[m
[31m-Will you change this world?[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: not discard body (content_by_lua exit 200)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: not discard body (content_by_lua exit 201)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.exit(201)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["body: nil\n",[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[200, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: not discard body (content_by_lua exit 302)[m
[31m---- config[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.discard_body()[m
[31m-            -- ngx.say("body: ", ngx.var.request_body)[m
[31m-            ngx.redirect("/blah")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /bar {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say("body: ", ngx.var.request_body)[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /bar[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-[qr/302 Found/,[m
[31m-"body: hiya, world\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[302, 200][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: not discard body (custom error page)[m
[31m---- config[m
[31m-    error_page 404 = /err;[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /err {[m
[31m-        content_by_lua 'ngx.say("error")';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["POST /foo[m
[31m-hello, world",[m
[31m-"POST /foo[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["error\n",[m
[31m-"error\n",[m
[31m-][m
[31m---- error_code eval[m
[31m-[404, 404][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: get body data at log phase[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        }[m
[31m-        log_by_lua_block {[m
[31m-            ngx.log(ngx.WARN, "request body:", ngx.req.get_body_data())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello, world[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- error_log[m
[31m-request body:hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: init & append & finish (content_length = 0)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local old_http_content_length = ngx.var.http_content_length[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body()[m
[31m-            ngx.req.append_body("he")[m
[31m-            ngx.req.append_body("llo")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("old content length: ", old_http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            local data_file = ngx.req.get_body_file()[m
[31m-[m
[31m-            if not data and data_file then[m
[31m-                ngx.say("no data in buf, go to data file")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Content-Length: 0[m
[31m---- response_body[m
[31m-old content length: 0[m
[31m-content length: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: init & append & finish (init_body(0))[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local old_http_content_length = ngx.var.http_content_length[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body(0)[m
[31m-            ngx.req.append_body("he")[m
[31m-            ngx.req.append_body("llo")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            ngx.say("old content length: ", old_http_content_length)[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            local data_file = ngx.req.get_body_file()[m
[31m-[m
[31m-            if not data and data_file then[m
[31m-                ngx.say("no data in buf, go to data file")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Content-Length: 0[m
[31m---- response_body[m
[31m-old content length: 0[m
[31m-no data in buf, go to data file[m
[31m-content length: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: init & append & finish (client_body_buffer_size = 0)[m
[31m---- http_config[m
[31m-    client_body_buffer_size 0;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.req.init_body()[m
[31m-            ngx.req.append_body("he")[m
[31m-            ngx.req.append_body("llo")[m
[31m-            ngx.req.finish_body()[m
[31m-[m
[31m-            local data = ngx.req.get_body_data()[m
[31m-            local data_file = ngx.req.get_body_file()[m
[31m-[m
[31m-            if not data and data_file then[m
[31m-                ngx.say("no data in buf, go to data file")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("content length: ", ngx.var.http_content_length)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-no data in buf, go to data file[m
[31m-content length: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/045-ngx-var.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/045-ngx-var.t[m
[1mdeleted file mode 100644[m
[1mindex 8f2dcb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/045-ngx-var.t[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 7);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set indexed variables to nil[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $var 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("old: ", ngx.var.var)[m
[31m-            ngx.var.var = nil[m
[31m-            ngx.say("new: ", ngx.var.var)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-old: 32[m
[31m-new: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set variables with set_handler to nil[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("old: ", ngx.var.args)[m
[31m-            ngx.var.args = nil[m
[31m-            ngx.say("new: ", ngx.var.args)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?hello=world[m
[31m---- response_body[m
[31m-old: hello=world[m
[31m-new: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: reference nonexistent variable[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $var 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("value: ", ngx.var.notfound)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-value: nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: no-hash variables[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["X-My-Host"] = ngx.var.proxy_host[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_headers[m
[31m-X-My-Host: foo[m
[31m---- response_body[m
[31m-foo[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variable name is caseless[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $Var 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("value: ", ngx.var.VAR)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-value: 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: true $invalid_referer variable value in Lua[m
[31m-github issue #239[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        valid_referers www.foo.com;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("invalid referer: ", ngx.var.invalid_referer)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-        #echo $invalid_referer;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Referer: http://www.foo.com/[m
[31m-[m
[31m---- response_body[m
[31m-invalid referer: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: false $invalid_referer variable value in Lua[m
[31m-github issue #239[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        valid_referers www.foo.com;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("invalid referer: ", ngx.var.invalid_referer)[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-        #echo $invalid_referer;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Referer: http://www.bar.com[m
[31m-[m
[31m---- response_body[m
[31m-invalid referer: 1[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: $proxy_host & $proxy_port[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/back;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header["Proxy-Host"] = ngx.var.proxy_host[m
[31m-            ngx.header["Proxy-Port"] = ngx.var.proxy_port[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- raw_response_headers_like[m
[31m-Proxy-Host: 127.0.0.1\:\d+\r[m
[31m-Proxy-Port: \d+\r[m
[31m---- response_body[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get a bad variable name[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $true 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("value: ", ngx.var[true])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad variable name[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set a bad variable name[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        set $true 32;[m
[31m-        content_by_lua '[m
[31m-            ngx.var[true] = 56[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad variable name[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set a variable that is not changeable[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.var.query_string = 56[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?hello[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-variable "query_string" not changeable[m
[31m---- error_code: 500[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/046-hmac.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/046-hmac.t[m
[1mdeleted file mode 100644[m
[1mindex 686b479..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/046-hmac.t[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local digest = ngx.hmac_sha1("thisisverysecretstuff", "some string we want to sign")[m
[31m-            ngx.say(ngx.encode_base64(digest))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-R/pvxzHC4NLtj7S+kXFg/NePTmk=[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/047-match-jit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/047-match-jit.t[m
[1mdeleted file mode 100644[m
[1mindex 077ebb6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/047-match-jit.t[m
[1m+++ /dev/null[m
[36m@@ -1,215 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 5);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "j")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, world", "([0-9]+)", "j")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, 1234", "([0-9]+)", "jo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-1234[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello, world", "([0-9]+)", "jo")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.match("hello\\nworld", "(abc", "j")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 2940;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 21)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, err = ngx.re.match(s, re, "jo")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 2950;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 21)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local res, err = ngx.re.match(s, re, "jo")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not res then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-failed to match[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/048-match-dfa.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/048-match-dfa.t[m
[1mdeleted file mode 100644[m
[1mindex 8a0a328..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/048-match-dfa.t[m
[1m+++ /dev/null[m
[36m@@ -1,210 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 4);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello", "(he|hell)", "d")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: matched with d + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello", "(he|hell)", "do")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with d + j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello", "(he|hell)", "jd")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("world", "(he|hell)", "d")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("hello", "he|hell", "do")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-                ngx.say(m[1])[m
[31m-                ngx.say(m[2])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: not matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            m = ngx.re.match("world", "([0-9]+)", "do")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("你好", ".", "Ud")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m = ngx.re.match("你好", ".", "ud")[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/049-gmatch-jit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/049-gmatch-jit.t[m
[1mdeleted file mode 100644[m
[1mindex 614c440..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/049-gmatch-jit.t[m
[1m+++ /dev/null[m
[36m@@ -1,229 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 9);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: gmatch matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, world", "[a-z]+", "j") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: fail to match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]", "j")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: gmatch matched but no iterate[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "j")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: gmatch matched but only iterate once and still matches remain[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "j")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: gmatch matched + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, world", "[a-z]+", "jo") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: fail to match + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]", "jo")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: gmatch matched but no iterate + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "jo")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: gmatch matched but only iterate once and still matches remain + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "jo")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local m, err = ngx.re.gmatch("hello\\nworld", "(abc", "j")[m
[31m-            if not m then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("success")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/050-gmatch-dfa.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/050-gmatch-dfa.t[m
[1mdeleted file mode 100644[m
[1mindex d2ac2bc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/050-gmatch-dfa.t[m
[1m+++ /dev/null[m
[36m@@ -1,338 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 5);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: gmatch matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, halo", "h[a-z]|h[a-z][a-z]", "d") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                    ngx.say(m[1])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hel[m
[31m-nil[m
[31m-hal[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: d + j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, halo", "h[a-z]|h[a-z][a-z]", "dj") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hel[m
[31m-hal[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: fail to match[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]", "d")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: gmatch matched but no iterate[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "d")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: gmatch matched but only iterate once and still matches remain[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "d")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: gmatch matched + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in ngx.re.gmatch("hello, world", "[a-z]+", "do") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                else[m
[31m-                    ngx.say("not matched: ", m)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: fail to match + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[0-9]", "do")[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-[m
[31m-            local m = it()[m
[31m-            if m then ngx.say(m[0]) else ngx.say(m) end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-nil[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: gmatch matched but no iterate + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "do")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: gmatch matched but only iterate once and still matches remain + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("hello, world", "[a-z]+", "do")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it, err = ngx.re.gmatch("hello\\nworld", "(abc", "d")[m
[31m-            if not it then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("success")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("你好", ".", "Ud")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local it = ngx.re.gmatch("你好", ".", "ud")[m
[31m-            local m = it()[m
[31m-            if m then[m
[31m-                ngx.say(m[0])[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: gmatched with submatch captures[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in  ngx.re.gmatch("hello", "(he|hell)", "d") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                    ngx.say(m[1])[m
[31m-                    ngx.say(m[2])[m
[31m-                else[m
[31m-                    ngx.say("not matched!")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: gmatched with submatch captures (compile once)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            for m in  ngx.re.gmatch("hello", "(he|hell)", "od") do[m
[31m-                if m then[m
[31m-                    ngx.say(m[0])[m
[31m-                    ngx.say(m[1])[m
[31m-                    ngx.say(m[2])[m
[31m-                else[m
[31m-                    ngx.say("not matched!")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-nil[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/051-sub-jit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/051-sub-jit.t[m
[1mdeleted file mode 100644[m
[1mindex 789e897..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/051-sub-jit.t[m
[1m+++ /dev/null[m
[36m@@ -1,150 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 6);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234 5678", "([0-9]+)", "world", "j")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world 5678: 1[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[0-9]+", "hiya", "j")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234 5678", "([0-9]+)", "world", "jo")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world 5678: 1[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[0-9]+", "hiya", "jo")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("hello\\nworld", "(abc", "world", "j")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad pattern + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub( "hello\\nworld", "(abc", "world", "jo")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/052-sub-dfa.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/052-sub-dfa.t[m
[1mdeleted file mode 100644[m
[1mindex 254913b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/052-sub-dfa.t[m
[1m+++ /dev/null[m
[36m@@ -1,235 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 8);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234 5678", "[0-9]|[0-9][0-9]", "world", "d")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world34 5678: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[0-9]+", "hiya", "d")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, 1234 5678", "[0-9]|[0-9][0-9]", "world", "do")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world34 5678: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.sub("hello, world", "[0-9]+", "hiya", "do")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("hello\\nworld", "(abc", "world", "j")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad pattern + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("hello\\nworld", "(abc", "world", "jo")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("你好", ".", "a", "Ud")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: a好[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.sub("你好", ".", "a", "ud")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: a好[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sub with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.re.sub("hello", "(he|hell)", function (m) ngx.say(m[0]) ngx.say(m[1]) return "x" end, "d"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-xo1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sub with d + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.re.sub("hello", "(he|hell)", function (m) ngx.say(m[0]) ngx.say(m[1]) return "x" end, "do"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-xo1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/053-gsub-jit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/053-gsub-jit.t[m
[1mdeleted file mode 100644[m
[1mindex 3a2a1aa..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/053-gsub-jit.t[m
[1m+++ /dev/null[m
[36m@@ -1,150 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 6);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, 1234 5678", "([0-9]+)", "world", "j")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world world: 2[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with j[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[0-9]+", "hiya", "j")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m---- error_log[m
[31m-pcre JIT compiling result: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, 1234 5678", "([0-9]+)", "world", "jo")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world world: 2[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with jo[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[0-9]+", "hiya", "jo")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m---- grep_error_log eval[m
[31m-qr/pcre JIT compiling result: \d+/[m
[31m-[m
[31m---- grep_error_log_out eval[m
[31m-["pcre JIT compiling result: 1\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("hello\\nworld", "(abc", "world", "j")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad pattern + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("hello\\nworld", "(abc", "world", "jo")[m
[31m-            if s then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/054-gsub-dfa.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/054-gsub-dfa.t[m
[1mdeleted file mode 100644[m
[1mindex 937aa1c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/054-gsub-dfa.t[m
[1m+++ /dev/null[m
[36m@@ -1,236 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 7);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, 1234 5678", "[0-9]|[0-9][0-9]", "world", "d")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, worldworld worldworld: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: not matched with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[0-9]+", "hiya", "d")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, 1234 5678", "[0-9]|[0-9][0-9]", "world", "do")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, worldworld worldworld: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched with do[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n = ngx.re.gsub("hello, world", "[0-9]+", "hiya", "do")[m
[31m-            if n then[m
[31m-                ngx.say(s, ": ", n)[m
[31m-            else[m
[31m-                ngx.say(s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hello, world: 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("hello\\nworld", "(abc", "world", "j")[m
[31m-            if s then[m
[31m-                ngx.say("gsub: ", n)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: bad pattern + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("hello\\nworld", "(abc", "world", "jo")[m
[31m-            if s then[m
[31m-                ngx.say("gsub: ", n)[m
[31m-            else[m
[31m-                ngx.say("error: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("你好", ".", "a", "Ud")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-exec opts: 2000[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: aa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: UTF-8 mode with UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s, n, err = ngx.re.gsub("你好", ".", "a", "ud")[m
[31m-            if s then[m
[31m-                ngx.say("s: ", s)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_dfa_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 0[m
[31m-exec opts: 0[m
[31m-exec opts: 0[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-s: aa[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: gsub with d[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.re.gsub("hello", "(he|hell)", function (m) ngx.say(m[0]) ngx.say(m[1]) return "x" end, "d"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-xo1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: gsub with d + o[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.re.gsub("hello", "(he|hell)", function (m) ngx.say(m[0]) ngx.say(m[1]) return "x" end, "do"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-hell[m
[31m-nil[m
[31m-xo1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/055-subreq-vars.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/055-subreq-vars.t[m
[1mdeleted file mode 100644[m
[1mindex 2fc6960..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/055-subreq-vars.t[m
[1m+++ /dev/null[m
[36m@@ -1,339 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set non-existent variables via "vars" option[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { dog = "hello", cat = 32 }});[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- stap2[m
[31m-[m
[31m-global delta = "  "[m
[31m-[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    uri = ngx_http_req_uri($r)[m
[31m-    printf("finalize req %s: %d\n", uri, $rc)[m
[31m-    if ($rc == 500) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    uri = ngx_http_req_uri($r)[m
[31m-    printf("lua run thread %s\n", uri)[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-start) {[m
[31m-    r = $arg1[m
[31m-    n = ngx_http_subreq_depth(r)[m
[31m-    pr = ngx_http_req_parent(r)[m
[31m-    printf("%sbegin %s -> %s (%d)\n", ngx_indent(n, delta),[m
[31m-        ngx_http_req_uri(pr),[m
[31m-        ngx_http_req_uri(r),[m
[31m-        n)[m
[31m-}[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log eval[m
[31m-qr/variable "(dog|cat)" cannot be assigned a value \(maybe you forgot to define it first\?\)/[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set non-existent variables via "vars" option[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog '';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { dog = "hello", cat = 32 }});[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log chop[m
[31m-variable "cat" cannot be assigned a value (maybe you forgot to define it first?)[m
[31m---- error_code: 500[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: good "vars" option: user variables[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog '';[m
[31m-        set $cat '';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { dog = "hello", cat = 32 }});[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-dog = hello[m
[31m-cat = 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bad "vars" option value[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog '';[m
[31m-        set $cat '';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = "hello" });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log chop[m
[31m-Bad vars option value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: bad "vars" option value value[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog '';[m
[31m-        set $cat '';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { cat = true } });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log chop[m
[31m-attempt to use bad variable value type boolean[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: good "vars" option: builtin variables[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "args: $args";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { args = "a=hello&b=32" }});[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-args: a=hello&b=32[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: setting non-changeable vars[m
[31m---- config[m
[31m-    location /other {[m
[31m-        echo "query string: $query_string";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { query_string = "hello" } });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log chop[m
[31m-variable "query_string" not changeable[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: copy all vars[m
[31m---- config[m
[31m-    location /other {[m
[31m-        set $dog "$dog world";[m
[31m-        echo "$uri dog: $dog";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'hello';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { copy_all_vars = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say(ngx.var.uri, ": ", ngx.var.dog)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/other dog: hello world[m
[31m-/lua: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: share all vars[m
[31m---- config[m
[31m-    location /other {[m
[31m-        set $dog "$dog world";[m
[31m-        echo "$uri dog: $dog";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'hello';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { share_all_vars = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say(ngx.var.uri, ": ", ngx.var.dog)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/other dog: hello world[m
[31m-/lua: hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: vars takes priority over copy_all_vars[m
[31m---- config[m
[31m-    location /other {[m
[31m-        set $dog "$dog world";[m
[31m-        echo "$uri dog: $dog";[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'hello';[m
[31m-        content_by_lua '[m
[31m-            res = ngx.location.capture("/other",[m
[31m-                { vars = { dog = "hiya" }, copy_all_vars = true });[m
[31m-[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.say(ngx.var.uri, ": ", ngx.var.dog)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/other dog: hiya world[m
[31m-/lua: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: capture_multi: good "vars" option: user variables[m
[31m---- config[m
[31m-    location /other {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("dog = ", ngx.var.dog)[m
[31m-            ngx.say("cat = ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /lua {[m
[31m-        set $dog 'blah';[m
[31m-        set $cat 'foo';[m
[31m-        content_by_lua '[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                {"/other/1",[m
[31m-                    { vars = { dog = "hello", cat = 32 }}[m
[31m-                },[m
[31m-                {"/other/2",[m
[31m-                    { vars = { dog = "hiya", cat = 56 }}[m
[31m-                }[m
[31m-            };[m
[31m-[m
[31m-            ngx.print(res1.body)[m
[31m-            ngx.print(res2.body)[m
[31m-            ngx.say("parent dog: ", ngx.var.dog)[m
[31m-            ngx.say("parent cat: ", ngx.var.cat)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-dog = hello[m
[31m-cat = 32[m
[31m-dog = hiya[m
[31m-cat = 56[m
[31m-parent dog: blah[m
[31m-parent cat: foo[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/056-flush.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/056-flush.t[m
[1mdeleted file mode 100644[m
[1mindex d189cd5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/056-flush.t[m
[1m+++ /dev/null[m
[36m@@ -1,523 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    $ENV{TEST_NGINX_POSTPONE_OUTPUT} = 1;[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 60;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush wait - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua reuse free buf chain, but reallocate memory because 5 >= 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: flush no wait - content[m
[31m---- config[m
[31m-    send_timeout 500ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(false)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: flush wait - rewrite[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush no wait - rewrite[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: http 1.0 (sync)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-Content-Length: 23[m
[31m---- timeout: 5[m
[31m---- error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: http 1.0 (async)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(false)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "1: failed to flush: ", err)[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-            local ok, err = ngx.flush(false)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "2: failed to flush: ", err)[m
[31m-            end[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-Content-Length: 23[m
[31m---- error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m-1: failed to flush: buffering[m
[31m-2: failed to flush: buffering[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: flush wait - big data[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(string.rep("a", 1024 * 64))[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: flush wait - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-            ngx.flush(true)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello, world[m
[31m-sub[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: http 1.0 (sync + buffering off)[m
[31m---- config[m
[31m-    lua_http10_buffering off;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- timeout: 5[m
[31m---- no_error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: http 1.0 (async)[m
[31m---- config[m
[31m-    lua_http10_buffering on;[m
[31m-    location /test {[m
[31m-        lua_http10_buffering off;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-!Content-Length[m
[31m---- no_error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: http 1.0 (sync) - buffering explicitly off[m
[31m---- config[m
[31m-    location /test {[m
[31m-        lua_http10_buffering on;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-Content-Length: 23[m
[31m---- timeout: 5[m
[31m---- error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: http 1.0 (async) - buffering explicitly off[m
[31m---- config[m
[31m-    location /test {[m
[31m-        lua_http10_buffering on;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("hiya")[m
[31m-            ngx.flush(false)[m
[31m-            ngx.say("blah")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test HTTP/1.0[m
[31m---- response_body[m
[31m-hello, world[m
[31m-hiya[m
[31m-blah[m
[31m---- response_headers[m
[31m-Content-Length: 23[m
[31m---- error_log[m
[31m-lua buffering output bufs for the HTTP 1.0 request[m
[31m-lua http 1.0 buffering makes ngx.flush() a no-op[m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: flush wait in a user coroutine[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello, world")[m
[31m-                ngx.flush(true)[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("hiya")[m
[31m-            end[m
[31m-            local c = coroutine.create(f)[m
[31m-            ngx.say(coroutine.resume(c))[m
[31m-            ngx.say(coroutine.resume(c))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap2[m
[31m-F(ngx_http_lua_wev_handler) {[m
[31m-    printf("wev handler: wev:%d\n", $r->connection->write->ready)[m
[31m-}[m
[31m-[m
[31m-global ids, cur[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    delete ids[m
[31m-    cur = 0[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    id = gen_id($ctx->cur_co)[m
[31m-    printf("run thread %d\n", id)[m
[31m-}[m
[31m-[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("lua resume %d\n", id)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-resume) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("resume %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-entry-coroutine-yield) {[m
[31m-    println("entry coroutine yield")[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_coroutine_yield) {[m
[31m-    printf("yield %x\n", gen_id($L))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-yield) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("yield %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_atpanic) {[m
[31m-    printf("lua atpanic(%d):", gen_id($L))[m
[31m-    print_ubacktrace();[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exec) { println("exec") }[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) { println("exit") }[m
[31m-[m
[31m-F(ngx_http_writer) { println("http writer") }[m
[31m-[m
[31m---- response_body[m
[31m-hello, world[m
[31m-true[m
[31m-hiya[m
[31m-true[m
[31m---- error_log[m
[31m-lua reuse free buf memory 13 >= 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: flush before sending out the header[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.flush()[m
[31m-            ngx.status = 404[m
[31m-            ngx.say("not found")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-not found[m
[31m---- error_code: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: flush wait - gzip[m
[31m---- config[m
[31m-    gzip             on;[m
[31m-    gzip_min_length  1;[m
[31m-    gzip_types       text/plain;[m
[31m-[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- more_headers[m
[31m-Accept-Encoding: gzip[m
[31m---- response_body_like: .{15}[m
[31m---- response_headers[m
[31m-Content-Encoding: gzip[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: flush wait - gunzip[m
[31m---- config[m
[31m-    location /test {[m
[31m-        gunzip on;[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open(ngx.var.document_root .. "/gzip.bin", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open file: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local data = f:read(100)[m
[31m-            ngx.header.content_encoding = "gzip"[m
[31m-            ngx.print(data)[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            data = f:read("*a")[m
[31m-            ngx.print(data)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files eval[m
[31m-">>> gzip.bin[m
[31m-\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x62\x64\x62\x62\x61\x62\x64\x63\x61\xe4\xe0\xe2\xe6\xe4\x61\xe4\xe4\xe7\x63\x12\xe4\xe1\xe0\x60\x14\x12\xe3\x91\xe4\xe4\xe4\x13\x60\xe3\x95\x12\x90\x15\xe0\x11\x50\x92\xd1\x16\x17\xe2\xd3\x17\x14\x11\x95\x95\x57\x96\x63\x37\xd2\x36\xd6\x51\x34\xb1\xe6\x62\x17\x95\xb0\x77\x60\xe3\x96\x33\x95\xb6\x91\x75\x97\x30\xe4\x66\x0c\xd0\xe3\xe0\xb5\xd3\x33\xf6\x90\x16\xb2\x90\x77\x56\x31\xe7\x55\x32\x11\x74\xe0\x02\x00\x00\x00\xff\xff\xcb\xc8\xac\x4c\xe4\x02\x00\x19\x15\xa9\x77\x6a\x00\x00\x00"[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: limit_rate[m
[31m---- config[m
[31m-    location /test {[m
[31m-        limit_rate 150;[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            for i = 1, 2 do[m
[31m-                ngx.print(string.rep("a", 100))[m
[31m-                local ok, err = ngx.flush(true)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to flush: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            local elapsed = ngx.now() - begin[m
[31m-            ngx.log(ngx.WARN, "lua writes elapsed ", elapsed, " sec")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-"a" x 200[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/lua writes elapsed [12](?:\.\d+)? sec/,[m
[31m-qr/lua flush requires waiting: buffered 0x[0-9a-f]+, delayed:1/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 4[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/057-flush-timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/057-flush-timeout.t[m
[1mdeleted file mode 100644[m
[1mindex d6e0f86..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/057-flush-timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,321 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'hello, world';[m
[31m-    $ENV{TEST_NGINX_POSTPONE_OUTPUT} = 1;[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 17;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: flush wait - timeout[m
[31m---- config[m
[31m-    send_timeout 100ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/client timed out \(\d+: .*?timed out\)/[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: send timeout timer got removed in time[m
[31m---- config[m
[31m-    send_timeout 1234ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(string.rep("blah blah blah", 10))[m
[31m-            -- ngx.flush(true)[m
[31m-            ngx.eof()[m
[31m-            for i = 1, 20 do[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global evtime[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    delete evtime[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1234) {[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-        evtime[$arg1] = $arg2[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    time = evtime[$arg1][m
[31m-    if (time == 1234) {[m
[31m-        printf("del timer %d\n", time)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    time = evtime[$arg1][m
[31m-    if (time == 1234) {[m
[31m-        printf("expire timer %d\n", time)[m
[31m-        #print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-/*[m
[31m-probe syscall.writev.return {[m
[31m-    if (pid() == target()) {[m
[31m-        printf("writev: %s\n", retstr)[m
[31m-    }[m
[31m-}[m
[31m-*/[m
[31m---- stap_out[m
[31m-add timer 1234[m
[31m-del timer 1234[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit in user thread (entry thread is still pending on ngx.flush)[m
[31m---- config[m
[31m-    send_timeout 200ms;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.say("hello, world!")[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request: c:%d, a:%d, cb:%d, rb:%d\n", $r->main->count,[m
[31m-        $r == $r->connection->data, $r->connection->buffered, $r->buffered)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_set_write_handler) {[m
[31m-    println("set write handler")[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-F(ngx_http_lua_flush_cleanup) {[m
[31m-    println("lua flush cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua flush cleanup[m
[31m-delete timer 200[m
[31m-delete thread 1[m
[31m-add timer 200[m
[31m-expire timer 200[m
[31m-free request[m
[31m-[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: flush wait - return "timeout" error[m
[31m---- config[m
[31m-    send_timeout 100ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to flush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/client timed out \(\d+: .*?timed out\)/,[m
[31m-'failed to flush: timeout',[m
[31m-][m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: flush wait in multiple user threads - return "timeout" error[m
[31m---- config[m
[31m-    send_timeout 100ms;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, world")[m
[31m-[m
[31m-            local function run(tag)[m
[31m-                local ok, err = ngx.flush(true)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "thread ", tag, ": failed to flush: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("hiya")[m
[31m-            end[m
[31m-[m
[31m-            local function new_thread(tag)[m
[31m-                local ok, err = ngx.thread.spawn(run, tag)[m
[31m-                if not ok then[m
[31m-                    return error("failed to spawn thread: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            new_thread("A")[m
[31m-            new_thread("B")[m
[31m-            run("main")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/client timed out \(\d+: .*?timed out\)/,[m
[31m-'thread main: failed to flush: timeout',[m
[31m-'thread A: failed to flush: timeout',[m
[31m-'thread B: failed to flush: timeout',[m
[31m-][m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: flush wait - client abort connection prematurely[m
[31m---- config[m
[31m-    #send_timeout 100ms;[m
[31m-    location /test {[m
[31m-        limit_rate 2;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello, lua")[m
[31m-            local ok, err = ngx.flush(true)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to flush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/writev\(\) failed .*? Broken pipe/i,[m
[31m-qr/failed to flush: client aborted/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/058-tcp-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/058-tcp-socket.t[m
[1mdeleted file mode 100644[m
[1mindex acf69f0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/058-tcp-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,3642 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 187;[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no trailing newline[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 1234;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            sock:close()[m
[31m-            ngx.say("closed")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.print("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 3[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-failed to receive a line: closed [foo][m
[31m-closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no resolver defined[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 1234;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: no resolver defined to resolve "agentzh.org"[m
[31m-connected: nil[m
[31m-failed to send request: closed[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket:[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: with resolver[m
[31m---- timeout: 10[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("first line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive the first line: ", err)[m
[31m-            end[m
[31m-[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("second line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive the second line: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 56[m
[31m-first line received: HTTP/1.1 200 OK[m
[31m-second line received: Server: openresty[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: connection refused (tcp)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil connection refused[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: connection timeout (tcp)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil timeout[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: not closed manually[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: resolver error (host not found)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)[m
[31m-            print("connected: ", ok, " ", err, " ", not ok)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(3: Host not found\))?[m
[31m-connected: nil[m
[31m-failed to send request: closed$[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: resolver error (timeout)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 1ms;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)[m
[31m-            print("connected: ", ok, " ", err, " ", not ok)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like[m
[31m-^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(\d+: (?:Operation timed out|Host not found)\))?[m
[31m-connected: nil[m
[31m-failed to send request: closed$[m
[31m---- error_log[m
[31m-attempt to send data on a closed socket[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: explicit *l pattern for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err = sock:receive("*l")[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: *a pattern for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err = sock:receive("*a")[m
[31m-            if data then[m
[31m-                ngx.say("receive: ", data)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-receive: HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-foo[m
[31m-[m
[31m-err: nil[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: mixing *a and *l patterns for receive[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive("*l")[m
[31m-            if line then[m
[31m-                ngx.say("receive: ", line)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local data[m
[31m-            data, err = sock:receive("*a")[m
[31m-            if data then[m
[31m-                ngx.say("receive: ", data)[m
[31m-                ngx.say("err: ", err)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-receive: HTTP/1.1 200 OK[m
[31m-err: nil[m
[31m-receive: Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-foo[m
[31m-[m
[31m-err: nil[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: receive by chunks[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(10)[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: receive by chunks (very small buffer)[m
[31m---- timeout: 5[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive(10)[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: line reading (very small buffer)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.socket.connect (working)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-            local sock, err = ngx.socket.connect("127.0.0.1", port)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected.")[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected.[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.socket.connect() shortcut (connection refused)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local sock, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m-[m
[31m---- stap2[m
[31m-M(http-lua-info) {[m
[31m-    printf("tcp resume: %p\n", $coctx)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-failed to connect: connection refused[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: receive by chunks (stringified size)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local data, err, partial = sock:receive("10")[m
[31m-                if data then[m
[31m-                    local len = string.len(data)[m
[31m-                    if len == 10 then[m
[31m-                        ngx.print("[", data, "]")[m
[31m-                    else[m
[31m-                        ngx.say("ERROR: returned invalid length of data: ", len)[m
[31m-                    end[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", partial, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 57[m
[31m-[HTTP/1.1 2][00 OK\r[m
[31m-Ser][ver: nginx][\r[m
[31m-Content-][Type: text][/plain\r[m
[31m-Co][ntent-Leng][th: 4\r[m
[31m-Con][nection: c][lose\r[m
[31m-\r[m
[31m-fo]failed to receive a line: closed [o[m
[31m-][m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: cannot survive across request boundary (send)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-"^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to send request: closed)\$"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: cannot survive across request boundary (receive)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local line, err, part = sock:receive()[m
[31m-        if line then[m
[31m-            ngx.say("received: ", line)[m
[31m-[m
[31m-        else[m
[31m-            ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- stap2[m
[31m-M(http-lua-info) {[m
[31m-    printf("tcp resume\n")[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to receive a line: closed \[nil\])$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: cannot survive across request boundary (close)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local ok, err = sock:close()[m
[31m-        if ok then[m
[31m-            ngx.say("successfully closed")[m
[31m-[m
[31m-        else[m
[31m-            ngx.say("failed to close: ", err)[m
[31m-        end[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected: 1[m
[31m-request sent: 11[m
[31m-received: OK|failed to close: closed)$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: cannot survive across request boundary (connect)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go(ngx.var.port)[m
[31m-            test.go(ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function go(port)[m
[31m-    if not sock then[m
[31m-        sock = ngx.socket.tcp()[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected: ", ok)[m
[31m-[m
[31m-    else[m
[31m-        local port = ngx.var.port[m
[31m-        local ok, err = sock:connect("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect again: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        ngx.say("connected again: ", ok)[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr/^(?:connected(?: again)?: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-){2}$/[m
[31m---- error_log[m
[31m-lua reuse socket upstream ctx[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: connect again immediately[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected again: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-connected again: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua reuse socket upstream", "lua tcp socket reconnect without shutting down"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: two sockets mix together[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port1 $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        set $port2 $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock1 = ngx.socket.tcp()[m
[31m-            local sock2 = ngx.socket.tcp()[m
[31m-[m
[31m-            local port1 = ngx.var.port1[m
[31m-            local port2 = ngx.var.port2[m
[31m-[m
[31m-            local ok, err = sock1:connect("127.0.0.1", port1)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock2:connect("127.0.0.1", port2)[m
[31m-            if not ok then[m
[31m-                ngx.say("2: failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("2: connected: ", ok)[m
[31m-[m
[31m-            local req1 = "flush_all\\r\\n"[m
[31m-            local bytes, err = sock1:send(req1)[m
[31m-            if not bytes then[m
[31m-                ngx.say("1: failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("1: request sent: ", bytes)[m
[31m-[m
[31m-            local req2 = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            local bytes, err = sock2:send(req2)[m
[31m-            if not bytes then[m
[31m-                ngx.say("2: failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("2: request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock1:receive()[m
[31m-            if line then[m
[31m-                ngx.say("1: received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("1: failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            line, err, part = sock2:receive()[m
[31m-            if line then[m
[31m-                ngx.say("2: received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("2: failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock1:close()[m
[31m-            ngx.say("1: close: ", ok, " ", err)[m
[31m-[m
[31m-            ok, err = sock2:close()[m
[31m-            ngx.say("2: close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: connected: 1[m
[31m-2: connected: 1[m
[31m-1: request sent: 11[m
[31m-2: request sent: 57[m
[31m-1: received: OK[m
[31m-2: received: HTTP/1.1 200 OK[m
[31m-1: close: 1 nil[m
[31m-2: close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: send tables of string fragments[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: send tables of string fragments (bad type "nil")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", nil, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type nil found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: send tables of string fragments (bad type "boolean")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", true, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type boolean found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: send tables of string fragments (bad type ngx.null)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = {"GET", " ", "/foo", " HTTP/", ngx.null, 1, ".", 0, "\\r\\n",[m
[31m-                         "Host: localhost\\r\\n", "Connection: close\\r\\n",[m
[31m-                         "\\r\\n"}[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (bad data type userdata found)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: cosocket before location capture (tcpsock:send did not clear u->waiting)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-            local resp = ngx.location.capture("/memc")[m
[31m-            if type(resp) ~= "table" then[m
[31m-                ngx.say("bad resp: type ", type(resp), ": ", resp)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.print("subrequest: ", resp.status, ", ", resp.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /memc {[m
[31m-        set $memc_cmd flush_all;[m
[31m-        memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m-subrequest: 200, OK\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: CR in a line[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "foo\r\rbar\rbaz";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 13[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foobarbaz[m
[31m-failed to receive a line: closed [][m
[31m-close: nil closed[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: receive(0)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err, part = sock:receive(0)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive(0): ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("receive(0): [", data, "]")[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-receive(0): [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: send("")[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local bytes, err = sock:send("")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("send(\\"\\"): ", bytes)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-send(""): 0[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: github issue #215: Handle the posted requests in lua cosocket api (failed to resolve)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-[m
[31m-    location = /sub {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("xxx", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect to xxx: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("successfully connected to xxx!")[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_resolve_name_done) {[m
[31m-    println("resolve name done")[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-resolve name done[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^failed to connect to xxx: xxx could not be resolved.*?Host not found[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: github issue #215: Handle the posted requests in lua cosocket api (successfully resolved)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-    location = /sub {[m
[31m-        content_by_lua '[m
[31m-            if not package.i then[m
[31m-                package.i = 1[m
[31m-            end[m
[31m-[m
[31m-            local servers = {"openresty.org", "agentzh.org", "sregex.org"}[m
[31m-            local server = servers[package.i][m
[31m-            package.i = package.i + 1[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect(server, 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect to ", server, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("successfully connected to xxx!")[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to xxx![m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_socket_resolve_handler) {[m
[31m-    println("lua socket resolve handler")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_socket_tcp_conn_retval_handler) {[m
[31m-    println("lua socket tcp connect retval handler")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_run_posted_requests) {[m
[31m-    println("run posted requests")[m
[31m-}[m
[31m-[m
[31m---- stap_out_like[m
[31m-run posted requests[m
[31m-lua socket resolve handler[m
[31m-run posted requests[m
[31m-lua socket tcp connect retval handler[m
[31m-run posted requests[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: connection refused (tcp) - lua_socket_log_errors off[m
[31m---- config[m
[31m-    location /test {[m
[31m-        lua_socket_log_errors off;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil connection refused[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- no_error_log eval[m
[31m-[qr/connect\(\) failed \(\d+: Connection refused\)/][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: reread after a read time out happen (receive -> receive)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-[m
[31m-                line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 37: successful reread after a read time out happen (receive -> receive)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("GET /back HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to read the response header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local data, err, partial = sock:receive(100)[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, ", partial: ", partial)[m
[31m-[m
[31m-                sock:settimeout(123)[m
[31m-                ngx.sleep(0.1)[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hi")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.print("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"failed to receive: timeout, partial: 2\r[m
[31m-hi\r[m
[31m-[m
[31m-received: 5[m
[31m-received: world[m
[31m-"[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 38: successful reread after a read time out happen (receive -> receiveuntil)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("GET /back HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to read the response header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local data, err, partial = sock:receive(100)[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, ", partial: ", partial)[m
[31m-[m
[31m-                ngx.sleep(0.1)[m
[31m-[m
[31m-                sock:settimeout(123)[m
[31m-                local reader = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-                local line, err = reader()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local line, err = reader()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hi")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.print("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"failed to receive: timeout, partial: 2\r[m
[31m-hi\r[m
[31m-[m
[31m-received: 5[m
[31m-received: world[m
[31m-"[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 39: successful reread after a read time out happen (receiveuntil -> receiveuntil)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("GET /back HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to read the response header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("no-such-terminator")[m
[31m-            local data, err, partial = reader()[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, ", partial: ", partial)[m
[31m-[m
[31m-                ngx.sleep(0.1)[m
[31m-[m
[31m-                sock:settimeout(123)[m
[31m-[m
[31m-                local reader = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-                local line, err = reader()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local line, err = reader()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hi")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.print("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"failed to receive: timeout, partial: 2\r[m
[31m-hi\r[m
[31m-[m
[31m-received: 5[m
[31m-received: world[m
[31m-"[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 40: successful reread after a read time out happen (receiveuntil -> receive)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("GET /back HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to read the response header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("no-such-terminator")[m
[31m-            local data, err, partial = reader()[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, ", partial: ", partial)[m
[31m-[m
[31m-                ngx.sleep(0.1)[m
[31m-[m
[31m-                sock:settimeout(123)[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.print("hi")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.print("world")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"failed to receive: timeout, partial: 2\r[m
[31m-hi\r[m
[31m-[m
[31m-received: 5[m
[31m-received: world[m
[31m-"[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 41: receive(0)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local data, err = sock:receive(0)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-received: [m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 42: empty options table[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port, {})[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 43: u->coctx left over bug[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local ready = false[m
[31m-            local fatal = false[m
[31m-[m
[31m-            function f()[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive the 1st line: ", err, " [", part, "]")[m
[31m-                    fatal = true[m
[31m-                    return[m
[31m-                end[m
[31m-                ready = true[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            local st = ngx.thread.spawn(f)[m
[31m-            while true do[m
[31m-                if fatal then[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if not ready then[m
[31m-                    ngx.sleep(0.01)[m
[31m-                else[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    -- ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    -- ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-            ngx.exit(0)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.sleep(0.1) ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua clean up the timer for pending ngx.sleep[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 44: bad request tries to connect[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                test.new_sock()[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-            else[m
[31m-                ngx.say("connected")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):7: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 45: bad request tries to receive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:receive()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 46: bad request tries to send[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:send("a")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 47: bad request tries to close[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 48: bad request tries to set keepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:setkeepalive()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 49: bad request tries to receiveuntil[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                else[m
[31m-                    ngx.say("connected")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            local it, err = sock:receiveuntil("abc")[m
[31m-            if it then[m
[31m-                it()[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.tcp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^connected[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):16: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 50: cosocket resolving aborted by coroutine yielding failures (require)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            package.loaded.myfoo = nil[m
[31m-            require "myfoo"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- user_files[m
[31m->>> myfoo.lua[m
[31m-local sock = ngx.socket.tcp()[m
[31m-local ok, err = sock:connect("agentzh.org")[m
[31m-if not ok then[m
[31m-    ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- wait: 0.3[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-resolve name done[m
[31m-runtime error: attempt to yield across C-call boundary[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 51: cosocket resolving aborted by coroutine yielding failures (xpcall err)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                return error(1)[m
[31m-            end[m
[31m-            local function err()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("agentzh.org")[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            xpcall(f, err)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- wait: 0.3[m
[31m---- error_log[m
[31m-resolve name done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-could not cancel[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 52: tcp_nodelay on[m
[31m---- config[m
[31m-    tcp_nodelay on;[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- error_log[m
[31m-lua socket tcp_nodelay[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 53: tcp_nodelay off[m
[31m---- config[m
[31m-    tcp_nodelay off;[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-lua socket tcp_nodelay[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 54: IPv6[m
[31m---- http_config[m
[31m-    server_tokens off;[m
[31m-[m
[31m-    server {[m
[31m-        listen [::1]:$TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        location /foo {[m
[31m-            content_by_lua 'ngx.say("foo")';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("[::1]", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- skip_eval: 3: system("ping6 -c 1 ::1 >/dev/null 2>&1") ne 0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 55: kill a thread with a connecting socket[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 1s;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock[m
[31m-[m
[31m-            local thr = ngx.thread.spawn(function ()[m
[31m-                sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-            end)[m
[31m-[m
[31m-            ngx.sleep(0.002)[m
[31m-            ngx.thread.kill(thr)[m
[31m-            ngx.sleep(0.001)[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to setkeepalive: ", err)[m
[31m-            else[m
[31m-                ngx.say("setkeepalive: ", ok)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to setkeepalive: closed[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 100[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 56: reuse cleanup[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if not line then[m
[31m-                        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- error_log[m
[31m-lua http cleanup reuse[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 57: reuse cleanup in ngx.timer (fake_request)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            local total_send_bytes = 0[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local function network()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                total_send_bytes = total_send_bytes + bytes[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if not line then[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local done = false[m
[31m-[m
[31m-            local function double_network()[m
[31m-                network()[m
[31m-                network()[m
[31m-                done = true[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.timer.at(0, double_network)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to create timer: ", err)[m
[31m-            end[m
[31m-[m
[31m-            i = 1[m
[31m-            while not done do[m
[31m-                local time = 0.005 * i[m
[31m-                if time > 0.1 then[m
[31m-                    time = 0.1[m
[31m-                end[m
[31m-                ngx.sleep(time)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage("collect")[m
[31m-[m
[31m-            ngx.say("total_send_bytes: ", total_send_bytes)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-total_send_bytes: 114[m
[31m---- error_log[m
[31m-lua http cleanup reuse[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 58: free cleanup in ngx.timer (without sock:close)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            local total_send_bytes = 0[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local function network()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                total_send_bytes = total_send_bytes + bytes[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if not line then[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local done = false[m
[31m-[m
[31m-            local function double_network()[m
[31m-                network()[m
[31m-                network()[m
[31m-                done = true[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.timer.at(0, double_network)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to create timer: ", err)[m
[31m-            end[m
[31m-[m
[31m-            i = 1[m
[31m-            while not done do[m
[31m-                local time = 0.005 * i[m
[31m-                if time > 0.1 then[m
[31m-                    time = 0.1[m
[31m-                end[m
[31m-                ngx.sleep(time)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage("collect")[m
[31m-[m
[31m-            ngx.say("total_send_bytes: ", total_send_bytes)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-total_send_bytes: 114[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 59: reuse cleanup in subrequest[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        echo_location /tt;[m
[31m-    }[m
[31m-[m
[31m-    location /tt {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if not line then[m
[31m-                        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- error_log[m
[31m-lua http cleanup reuse[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/059-unix-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/059-unix-socket.t[m
[1mdeleted file mode 100644[m
[1mindex b06ba6e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/059-unix-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,203 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: connection refused (unix domain socket)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("unix:/tmp/nosuchfile.sock")[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("hello")[m
[31m-            ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            ngx.say("receive: ", line, " ", err)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connect: nil no such file or directory[m
[31m-send: nil closed[m
[31m-receive: nil closed[m
[31m-close: nil closed[m
[31m---- error_log eval[m
[31m-qr{\[crit\] .*? connect\(\) to unix:/tmp/nosuchfile\.sock failed}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: invalid host argument[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("/tmp/test-nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-failed to connect: failed to parse host name "/tmp/test-nginx.sock": invalid host[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sanity[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            content_by_lua 'ngx.say("foo")';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                print("calling receive")[m
[31m-                local line, err = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.socket.stream[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            content_by_lua_block { ngx.say("foo") }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua_block {[m
[31m-            local sock = ngx.socket.stream()[m
[31m-            local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                print("calling receive")[m
[31m-                local line, err = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed[m
[31m-close: 1 nil[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/060-lua-memcached.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/060-lua-memcached.t[m
[1mdeleted file mode 100644[m
[1mindex e1ebb92..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/060-lua-memcached.t[m
[1m+++ /dev/null[m
[36m@@ -1,169 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-my $pwd = `pwd`;[m
[31m-chomp $pwd;[m
[31m-$ENV{TEST_NGINX_PWD} ||= $pwd;[m
[31m-[m
[31m-#master_on();[m
[31m-workers(1);[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1014);[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    lua_package_path '$TEST_NGINX_PWD/t/lib/?.lua;;';[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            package.loaded["socket"] = ngx.socket[m
[31m-            local Memcached = require "Memcached"[m
[31m-            Memcached.socket = ngx.socket[m
[31m-[m
[31m-            local memc = Memcached.Connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-[m
[31m-            memc:set("some_key", "hello 1234")[m
[31m-            local data = memc:get("some_key")[m
[31m-            ngx.say("some_key: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-some_key: hello 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: raw memcached[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;;';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local memcached = require "resty.memcached"[m
[31m-            local memc, err = memcached.connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-[m
[31m-            local ok, err = memc:set("some_key", "hello 1234")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set some_key: ", err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            local data, err = memc:get("some_key")[m
[31m-            if not data and err then[m
[31m-                ngx.log(ngx.ERR, "failed to get some_key: ", err)[m
[31m-                ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("some_key: ", data)[m
[31m-[m
[31m-            local res, err = memc:set_keepalive()[m
[31m-            if not res then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> resty/memcached.lua[m
[31m-module("resty.memcached", package.seeall)[m
[31m-[m
[31m-local mt = { __index = resty.memcached }[m
[31m-local sub = string.sub[m
[31m-local escape_uri = ngx.escape_uri[m
[31m-local socket_connect = ngx.socket.connect[m
[31m-local match = string.match[m
[31m-[m
[31m-function connect(...)[m
[31m-    local sock, err = socket_connect(...)[m
[31m-    return setmetatable({ sock = sock }, mt)[m
[31m-end[m
[31m-[m
[31m-function get(self, key)[m
[31m-    local cmd = "get " .. escape_uri(key) .. "\r\n"[m
[31m-    local bytes, err = self.sock:send(cmd)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local line, err = self.sock:receive()[m
[31m-    if line == 'END' then[m
[31m-        return nil, nil[m
[31m-    end[m
[31m-[m
[31m-    local flags, len = match(line, [[^VALUE %S+ (%d+) (%d+)]])[m
[31m-    if not flags then[m
[31m-        return nil, "bad response: " .. line[m
[31m-    end[m
[31m-[m
[31m-    print("size: ", size, ", flags: ", len)[m
[31m-[m
[31m-    local data, err = self.sock:receive(len)[m
[31m-    if not data then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    line, err = self.sock:receive(2) -- discard the trailing CRLF[m
[31m-    if not line then[m
[31m-        return nil, nil, "failed to receive CRLF: " .. (err or "")[m
[31m-    end[m
[31m-[m
[31m-    line, err = self.sock:receive() -- discard "END\r\n"[m
[31m-    if not line then[m
[31m-        return nil, nil, "failed to receive END CRLF: " .. (err or "")[m
[31m-    end[m
[31m-[m
[31m-    return data[m
[31m-end[m
[31m-[m
[31m-function set(self, key, value, exptime, flags)[m
[31m-    if not exptime then[m
[31m-        exptime = 0[m
[31m-    end[m
[31m-[m
[31m-    if not flags then[m
[31m-        flags = 0[m
[31m-    end[m
[31m-[m
[31m-    local cmd = table.concat({"set ", escape_uri(key), " ", flags, " ", exptime, " ", #value, "\r\n", value, "\r\n"}, "")[m
[31m-[m
[31m-    local bytes, err = self.sock:send(cmd)[m
[31m-    if not bytes then[m
[31m-        return nil, err[m
[31m-    end[m
[31m-[m
[31m-    local data, err = self.sock:receive()[m
[31m-    if sub(data, 1, 6) == "STORED" then[m
[31m-        return true[m
[31m-    end[m
[31m-[m
[31m-    return false, err[m
[31m-end[m
[31m-[m
[31m-function set_keepalive(self)[m
[31m-    return self.sock:setkeepalive(0, 100)[m
[31m-end[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-some_key: hello 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua reuse free buf memory[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/061-lua-redis.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/061-lua-redis.t[m
[1mdeleted file mode 100644[m
[1mindex d7b1876..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/061-lua-redis.t[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-#log_level "warn";[m
[31m-#worker_connections(1024);[m
[31m-#master_on();[m
[31m-[m
[31m-my $pwd = `pwd`;[m
[31m-chomp $pwd;[m
[31m-$ENV{TEST_NGINX_PWD} ||= $pwd;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    lua_package_path '$TEST_NGINX_PWD/t/lib/?.lua;;';[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            package.loaded["socket"] = ngx.socket[m
[31m-            local Redis = require "Redis"[m
[31m-[m
[31m-            local redis = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-[m
[31m-            redis:set("some_key", "hello 1234")[m
[31m-            local data = redis:get("some_key")[m
[31m-            ngx.say("some_key: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-some_key: hello 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: coroutine-based pub/sub[m
[31m---- http_config eval[m
[31m-qq{[m
[31m-    lua_package_path '\$TEST_NGINX_PWD/t/lib/?.lua;;';[m
[31m-    lua_package_cpath '$::LuaCpath';[m
[31m-}[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            package.loaded["socket"] = ngx.socket[m
[31m-            local Redis = require "Redis"[m
[31m-[m
[31m-            local ljson = require "ljson"[m
[31m-[m
[31m-            local r1 = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-[m
[31m-            local r2 = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-[m
[31m-            local loop = r2:pubsub({ subscribe = "foo" })[m
[31m-            local msg, abort = loop()[m
[31m-            ngx.say("msg type: ", type(msg))[m
[31m-            ngx.say("abort: ", type(abort))[m
[31m-[m
[31m-            if msg then[m
[31m-                ngx.say("msg: ", ljson.encode(msg))[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                r1:publish("foo", "test " .. i)[m
[31m-                msg, abort = loop()[m
[31m-                if msg then[m
[31m-                    ngx.say("msg: ", ljson.encode(msg))[m
[31m-                end[m
[31m-                ngx.say("abort: ", type(abort))[m
[31m-            end[m
[31m-[m
[31m-            abort()[m
[31m-[m
[31m-            msg, abort = loop()[m
[31m-            ngx.say("msg type: ", type(msg))[m
[31m-        ';[m
[31m-    }[m
[31m---- stap2[m
[31m-global ids, cur[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    delete ids[m
[31m-    cur = 0[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_yield") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("raw lua yield %d\n", id)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("raw lua resume %d\n", id)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    id = gen_id($ctx->cur_co)[m
[31m-    printf("run thread %d\n", id)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-resume) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("resume %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-entry-coroutine-yield) {[m
[31m-    println("entry coroutine yield")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coroutine_yield) {[m
[31m-    printf("yield %x\n", gen_id($L))[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_coroutine_resume) {[m
[31m-    printf("resume %x\n", gen_id($L))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-yield) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("yield %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_atpanic) {[m
[31m-    printf("lua atpanic(%d):", gen_id($L))[m
[31m-    print_ubacktrace();[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exec) { println("exec") }[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) { println("exit") }[m
[31m-[m
[31m---- request[m
[31m-    GET /test[m
[31m---- response_body[m
[31m-msg type: table[m
[31m-abort: function[m
[31m-msg: {"channel":"foo","kind":"subscribe","payload":1}[m
[31m-msg: {"channel":"foo","kind":"message","payload":"test 1"}[m
[31m-abort: function[m
[31m-msg: {"channel":"foo","kind":"message","payload":"test 2"}[m
[31m-abort: function[m
[31m-msg: {"channel":"foo","kind":"message","payload":"test 3"}[m
[31m-abort: function[m
[31m-msg type: nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/062-count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/062-count.t[m
[1mdeleted file mode 100644[m
[1mindex a24611c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/062-count.t[m
[1m+++ /dev/null[m
[36m@@ -1,496 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(4);[m
[31m-#log_level('warn');[m
[31m-no_root_location();[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{LUA_CPATH} = "/usr/local/openresty/lualib/?.so;" . $ENV{LUA_CPATH};[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: entries under ngx. (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("ngx: ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-ngx: 116[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: entries under ngx. (set by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            set_by_lua $n '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                return n;[m
[31m-            ';[m
[31m-            echo $n;[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-116[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: entries under ngx. (header filter by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            set $n '';[m
[31m-[m
[31m-            content_by_lua '[m
[31m-                ngx.send_headers()[m
[31m-                ngx.say("n = ", ngx.var.n)[m
[31m-            ';[m
[31m-[m
[31m-            header_filter_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-[m
[31m-                ngx.var.n = n[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 116[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: entries under ndk. (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ndk) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: entries under ngx.req (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.req) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 24[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: entries under ngx.req (set by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            set_by_lua $n '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.req) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                return n[m
[31m-            ';[m
[31m-[m
[31m-            echo "n = $n";[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 24[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: entries under ngx.req (header filter by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            set $n '';[m
[31m-[m
[31m-            header_filter_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.req) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.var.n = n[m
[31m-            ';[m
[31m-[m
[31m-            content_by_lua '[m
[31m-                ngx.send_headers()[m
[31m-                ngx.say("n = ", ngx.var.n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 24[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: entries under ngx.location[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.location) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: entries under ngx.socket[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.socket) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: entries under ngx._tcp_meta[m
[31m---- SKIP[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx._tcp_meta) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: entries under the metatable of req sockets[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                local sock, err = ngx.req.socket()[m
[31m-                if not sock then[m
[31m-                    ngx.say("failed to get the request socket: ", err)[m
[31m-                end[m
[31m-[m
[31m-                for k, v in pairs(getmetatable(sock)) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-POST /test[m
[31m-hello world[m
[31m---- response_body[m
[31m-n = 4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: shdict metatable[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local mt = dogs.__index[m
[31m-            local n = 0[m
[31m-            for k, v in pairs(mt) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.say("n = ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 13[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: entries under ngx. (log by lua)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        log_by_lua '[m
[31m-            local n = 0[m
[31m-            for k, v in pairs(ngx) do[m
[31m-                n = n + 1[m
[31m-            end[m
[31m-            ngx.log(ngx.ERR, "ngx. entry count: ", n)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 404 Not Found[m
[31m---- error_code: 404[m
[31m---- error_log[m
[31m-ngx. entry count: 116[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: entries under ngx.timer[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.timer) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: entries under ngx.config[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.config) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: entries under ngx.re[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.re) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: entries under coroutine. (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(coroutine) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("coroutine: ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap2[m
[31m-global c[m
[31m-probe process("$LIBLUA_PATH").function("rehashtab") {[m
[31m-    c++[m
[31m-    printf("rehash: %d\n", c)[m
[31m-}[m
[31m---- stap_out2[m
[31m-3[m
[31m---- response_body[m
[31m-coroutine: 14[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entries under ngx.thread. (content by lua)[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.thread) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("thread: ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap2[m
[31m-global c[m
[31m-probe process("$LIBLUA_PATH").function("rehashtab") {[m
[31m-    c++[m
[31m-    printf("rehash: %d\n", c)[m
[31m-}[m
[31m---- stap_out2[m
[31m---- response_body[m
[31m-thread: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: entries under ngx.worker[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                for k, v in pairs(ngx.worker) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("worker: ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-worker: 4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: entries under the metatable of udp sockets[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                local sock = ngx.socket.udp()[m
[31m-                for k, v in pairs(getmetatable(sock)) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-                ngx.say("n = ", n)[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: entries under the metatable of req raw sockets[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local n = 0[m
[31m-                ngx.req.read_body()[m
[31m-                local sock, err = ngx.req.socket(true)[m
[31m-                if not sock then[m
[31m-                    ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                for k, v in pairs(getmetatable(sock)) do[m
[31m-                    n = n + 1[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 6\\r\\n\\r\\nn = "..n.."\\n")[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to send: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-n = 5[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/063-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/063-abort.t[m
[1mdeleted file mode 100644[m
[1mindex c112ee1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/063-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,1020 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(4);[m
[31m-#log_level('warn');[m
[31m-no_root_location();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{LUA_CPATH} = "/usr/local/openresty/lualib/?.so;" . $ENV{LUA_CPATH};[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.exit(400) should abort print[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /memc_query {[m
[31m-            internal;[m
[31m-            set               $memc_cmd     $arg_cmd;[m
[31m-            set_unescape_uri  $memc_key     $arg_key;[m
[31m-            set_unescape_uri  $memc_value   $arg_value;[m
[31m-            set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-            memc_cmds_allowed get set add delete;[m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-        }[m
[31m-[m
[31m-        location = /test {[m
[31m-            content_by_lua_file html/test.lua;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local memd = require 'memd'[m
[31m-ngx.exit(400)[m
[31m-local res = memd.query( { cmd = 'get', key = id } )[m
[31m->>> memd.lua[m
[31m-module('memd', package.seeall)[m
[31m-[m
[31m-local URL = '/memc_query'[m
[31m-local capture = ngx.location.capture[m
[31m-[m
[31m-function query(arg)[m
[31m-    if type(arg) ~= 'table' then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    print("HELLO WORLD")[m
[31m-    return capture(URL, { args = arg } )[m
[31m-end[m
[31m---- request[m
[31m-GET /test?a[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log eval[m
[31m-["lua print: HELLO WORLD", q{the "$memc_key" variable is not set}][m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.exit(400) should abort ngx.log[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /memc_query {[m
[31m-            internal;[m
[31m-            set               $memc_cmd     $arg_cmd;[m
[31m-            set_unescape_uri  $memc_key     $arg_key;[m
[31m-            set_unescape_uri  $memc_value   $arg_value;[m
[31m-            set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-            memc_cmds_allowed get set add delete;[m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-        }[m
[31m-[m
[31m-        location = /test {[m
[31m-            content_by_lua_file html/test.lua;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local memd = require 'memd'[m
[31m-ngx.exit(400)[m
[31m-local res = memd.query( { cmd = 'get', key = id } )[m
[31m->>> memd.lua[m
[31m-module('memd', package.seeall)[m
[31m-[m
[31m-local URL = '/memc_query'[m
[31m-local capture = ngx.location.capture[m
[31m-local log = ngx.log[m
[31m-local level = ngx.ERR[m
[31m-[m
[31m-function query(arg)[m
[31m-    if type(arg) ~= 'table' then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    log(level, "HELLO WORLD")[m
[31m-    return capture(URL, { args = arg } )[m
[31m-end[m
[31m---- request[m
[31m-GET /test?a[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log eval[m
[31m-["HELLO WORLD", q{the "$memc_key" variable is not set}][m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.exit(400) should abort ngx.location.capture[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /memc_query {[m
[31m-            internal;[m
[31m-            set               $memc_cmd     $arg_cmd;[m
[31m-            set_unescape_uri  $memc_key     $arg_key;[m
[31m-            set_unescape_uri  $memc_value   $arg_value;[m
[31m-            set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-            memc_cmds_allowed get set add delete;[m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-        }[m
[31m-[m
[31m-        location = /test {[m
[31m-            content_by_lua_file html/test.lua;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local memd = require 'memd'[m
[31m-ngx.exit(400)[m
[31m-local res = memd.query( { cmd = 'get', key = id } )[m
[31m->>> memd.lua[m
[31m-module('memd', package.seeall)[m
[31m-[m
[31m-local URL = '/memc_query'[m
[31m-local capture = ngx.location.capture[m
[31m-[m
[31m-function query(arg)[m
[31m-    if type(arg) ~= 'table' then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return capture(URL, { args = arg } )[m
[31m-end[m
[31m---- request[m
[31m-GET /test?a[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-the "$memc_key" variable is not set[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exit(400) should abort ngx.location.capture_multi[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /memc_query {[m
[31m-            internal;[m
[31m-            set               $memc_cmd     $arg_cmd;[m
[31m-            set_unescape_uri  $memc_key     $arg_key;[m
[31m-            set_unescape_uri  $memc_value   $arg_value;[m
[31m-            set $memc_exptime $arg_exptime;[m
[31m-[m
[31m-            memc_cmds_allowed get set add delete;[m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-        }[m
[31m-[m
[31m-        location = /test {[m
[31m-            content_by_lua_file html/test.lua;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local memd = require 'memd'[m
[31m-ngx.exit(400)[m
[31m-local res = memd.query( { cmd = 'get', key = id } )[m
[31m->>> memd.lua[m
[31m-module('memd', package.seeall)[m
[31m-[m
[31m-local URL = '/memc_query'[m
[31m-local capture_multi = ngx.location.capture_multi[m
[31m-[m
[31m-function query(arg)[m
[31m-    if type(arg) ~= 'table' then[m
[31m-        return nil[m
[31m-    end[m
[31m-[m
[31m-    return capture_multi{ {URL, { args = arg }} }[m
[31m-end[m
[31m---- request[m
[31m-GET /test?a[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-the "$memc_key" variable is not set[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(400) should abort ngx.redirect[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.redirect("/blah")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua redirect to "/blah" with code 302[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(400) should abort ngx.exit[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.exit(503)[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua exit with code 503[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.exit(400) should abort ngx.exec[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.exec("/blah")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua exec "/blah?"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.exit(400) should abort ngx.send_headers[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.send_headers()[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua send headers[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.exit(400) should abort ngx.print[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.print("HELLO WORLD")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua print response[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.exit(400) should abort ngx.say[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("HELLO WORLD")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua say response[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.exit(400) should abort ngx.flush[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.flush()[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua flush asynchronously[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.exit(400) should abort ngx.eof[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.eof()[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua send eof[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.exit(400) should abort ngx.re.match[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.re.match("a", "a", "jo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua compiling match regex "a" with options "jo"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.exit(400) should abort ngx.re.gmatch[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.re.gmatch("a", "a", "jo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua compiling gmatch regex "a" with options "jo"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.exit(400) should abort ngx.re.sub[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.re.sub("a", "a", "", "jo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua compiling sub regex "a" with options "jo"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.exit(400) should abort ngx.re.gsub[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.re.gsub("a", "a", "", "jo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-lua compiling gsub regex "a" with options "jo"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.exit(400) should abort ngx.shared.DICT (set)[m
[31m---- http_config eval[m
[31m-    "lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                print("foo = ", dogs:get("foo"))[m
[31m-                dogs:set("foo", 32)[m
[31m-                ngx.exit(400)[m
[31m-                test.go(dogs)[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go(dogs)[m
[31m-    dogs:set("foo", 56)[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-foo = 56[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.exit(400) should abort ngx.shared.DICT (replace)[m
[31m---- http_config eval[m
[31m-    "lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                print("foo = ", dogs:get("foo"))[m
[31m-                dogs:set("foo", 32)[m
[31m-                ngx.exit(400)[m
[31m-                test.go(dogs)[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go(dogs)[m
[31m-    dogs:replace("foo", 56)[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-foo = 56[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.exit(400) should abort ngx.shared.DICT (incr)[m
[31m---- http_config eval[m
[31m-    "lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                print("foo = ", dogs:get("foo"))[m
[31m-                dogs:set("foo", 32)[m
[31m-                ngx.exit(400)[m
[31m-                test.go(dogs)[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go(dogs)[m
[31m-    dogs:incr("foo", 56)[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-foo = 88[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.exit(400) should abort ngx.shared.DICT (get)[m
[31m---- http_config eval[m
[31m-    "lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                dogs:set("foo", 32)[m
[31m-                ngx.exit(400)[m
[31m-                test.go(dogs)[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-function go(dogs)[m
[31m-    dogs:get("foo")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-fetching key "foo" in shared dict "dogs"[m
[31m---- error_code: 400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.exit(400) should skip os.execute[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                ngx.exit(400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx.exit(400) should break pcall and skip os.execute[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                pcall(ngx.exit, 400)[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- no_error_log[m
[31m-fetching key "foo" in shared dict "dogs"[m
[31m---- error_code: 400[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.exit(400) should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    pcall(ngx.exit, 400)[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx.redirect() should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    pcall(ngx.redirect, "/blah")[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 302 Found[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 302[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx.redirect() should skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    ngx.redirect("/blah")[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 302 Found[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 302[m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: ngx.exec() should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    pcall(ngx.exec, "/foo")[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx.exec() should skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    ngx.exec("/foo")[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx.set_uri(uri, true) should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            rewrite_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-            echo hello;[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function go()[m
[31m-    local ok, err = pcall(ngx.req.set_uri, "/foo", true)[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "error: ", err)[m
[31m-    end[m
[31m-[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: abort does not affect following coroutines[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            rewrite_by_lua 'ngx.exit(0)';[m
[31m-            content_by_lua '[m
[31m-                pcall(ngx.say, "hello world")[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: ngx.exit(400) should break xpcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module('test', package.seeall)[m
[31m-[m
[31m-local exec = os.execute[m
[31m-[m
[31m-function myexit()[m
[31m-    ngx.exit(400)[m
[31m-end[m
[31m-[m
[31m-function go()[m
[31m-    xpcall(myexit, function () end)[m
[31m-    exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like: 400 Bad Request[m
[31m---- error_code: 400[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: ngx.exec() should skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local os_exec = os.execute[m
[31m-local ngx_exec = ngx.exec[m
[31m-module('test')[m
[31m-[m
[31m-function go()[m
[31m-    ngx_exec("/foo")[m
[31m-    os_exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: ngx.exec() should break pcall and skip os.execute (all in user module)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                local test = require "test"[m
[31m-                test.go()[m
[31m-            ';[m
[31m-        }[m
[31m-        location = /foo {[m
[31m-            echo foo;[m
[31m-        }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-local os_exec = os.execute[m
[31m-local ngx_exec = ngx.exec[m
[31m-local pcall = pcall[m
[31m-module('test')[m
[31m-[m
[31m-function go()[m
[31m-    pcall(ngx_exec, "/foo")[m
[31m-    os_exec("sleep 5")[m
[31m-end[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 2[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/064-pcall.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/064-pcall.t[m
[1mdeleted file mode 100644[m
[1mindex cf90a07..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/064-pcall.t[m
[1m+++ /dev/null[m
[36m@@ -1,107 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(4);[m
[31m-#log_level('warn');[m
[31m-no_root_location();[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{LUA_CPATH} = "/usr/local/openresty/lualib/?.so;" . $ENV{LUA_CPATH};[m
[31m-[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: pcall works[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                function f(a, b)[m
[31m-                    if a == 0 and b == 0 then[m
[31m-                        error("zero error")[m
[31m-                    end[m
[31m-[m
[31m-                    return 23, "hello", true[m
[31m-                end[m
[31m-[m
[31m-                local res = {pcall(f, 0, 0)}[m
[31m-                ngx.say("res len: ", #res)[m
[31m-                ngx.say("res: ", unpack(res))[m
[31m-[m
[31m-                res = {pcall(f, 0)}[m
[31m-                ngx.say("res len: ", #res)[m
[31m-                ngx.say("res: ", unpack(res))[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qr/^res len: 2[m
[31m-res: falsecontent_by_lua\(nginx\.conf:\d+\):4: zero error[m
[31m-res len: 4[m
[31m-res: true23hellotrue[m
[31m-$/s[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: xpcall works[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-        location = /test {[m
[31m-            content_by_lua '[m
[31m-                function f(a, b)[m
[31m-                    if a == 0 and b == 0 then[m
[31m-                        error("zero error")[m
[31m-                    end[m
[31m-[m
[31m-                    return 23, "hello", true[m
[31m-                end[m
[31m-[m
[31m-                function g()[m
[31m-                    return f(0, 0)[m
[31m-                end[m
[31m-[m
[31m-                function h()[m
[31m-                    return f(0)[m
[31m-                end[m
[31m-[m
[31m-                function err(...)[m
[31m-                    ngx.say("error handler called: ", ...)[m
[31m-                    return "this is the new err"[m
[31m-                end[m
[31m-[m
[31m-                local res = {xpcall(g, err)}[m
[31m-                ngx.say("res len: ", #res)[m
[31m-                ngx.say("res: ", unpack(res))[m
[31m-[m
[31m-                res = {xpcall(h, err)}[m
[31m-                ngx.say("res len: ", #res)[m
[31m-                ngx.say("res: ", unpack(res))[m
[31m-            ';[m
[31m-        }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body eval[m
[31m-qr/^error handler called: content_by_lua\(nginx\.conf:\d+\):4: zero error[m
[31m-res len: 2[m
[31m-res: falsethis is the new err[m
[31m-res len: 4[m
[31m-res: true23hellotrue[m
[31m-$/[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/065-tcp-socket-timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/065-tcp-socket-timeout.t[m
[1mdeleted file mode 100644[m
[1mindex ec79891..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/065-tcp-socket-timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,997 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'get helloworld';[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 12);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-log_level("debug");[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: lua_socket_connect_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 100[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sock:settimeout() overrides lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 60s;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(150)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 150[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sock:settimeout(nil) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(nil)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m-lua tcp socket connect timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sock:settimeout(0) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(0)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sock:settimeout(-1) does not override lua_socket_connect_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 102ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(-1)[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to connect: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 102[m
[31m-lua tcp socket connect timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_socket_read_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sock:settimeout() overrides lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 60s;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(150)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 150[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: sock:settimeout(nil) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(nil)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sock:settimeout(0) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(0)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sock:settimeout(-1) does not override lua_socket_read_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(-1)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 102[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: lua_socket_send_timeout only[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-F(ngx_http_lua_socket_send) {[m
[31m-    active = 1[m
[31m-    println(probefunc())[m
[31m-}[m
[31m-probe syscall.send,[m
[31m-    syscall.sendto,[m
[31m-    syscall.writev[m
[31m-{[m
[31m-    if (active && pid() == target()) {[m
[31m-        println(probefunc())[m
[31m-    }[m
[31m-}[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: sock:settimeout() overrides lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 60s;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(150)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 150[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: sock:settimeout(nil) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(nil)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: sock:settimeout(0) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(0)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: sock:settimeout(-1) does not override lua_socket_send_timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 102ms;[m
[31m-    #resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(-1)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 102[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: exit in user thread (entry thread is still pending on tcpsock:send)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local bytes, ok = sock:send("get helloworld!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: re-connect after timed out[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_connect_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("1: failed to connect: ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("2: failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("2: connected: ", ok)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: connected: ", ok)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1: failed to connect: timeout[m
[31m-2: connected: 1[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 100[m
[31m-lua tcp socket connect timed out[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: re-send on the same object after a send timeout happens[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_send_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                bytes, err = sock:send("blah")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send again: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-F(ngx_http_lua_socket_send) {[m
[31m-    active = 1[m
[31m-    println(probefunc())[m
[31m-}[m
[31m-probe syscall.send,[m
[31m-    syscall.sendto,[m
[31m-    syscall.writev[m
[31m-{[m
[31m-    if (active && pid() == target()) {[m
[31m-        println(probefunc())[m
[31m-    }[m
[31m-}[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to send: timeout[m
[31m-failed to send again: closed[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: abort when upstream sockets pending on writes[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-            ngx.thread.spawn(function () ngx.sleep(0.001) ngx.say("done") ngx.exit(200) end)[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("get helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-F(ngx_http_lua_socket_send) {[m
[31m-    active = 1[m
[31m-    println(probefunc())[m
[31m-}[m
[31m-probe syscall.send,[m
[31m-    syscall.sendto,[m
[31m-    syscall.writev[m
[31m-{[m
[31m-    if (active && pid() == target()) {[m
[31m-        println(probefunc())[m
[31m-    }[m
[31m-}[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-done[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-lua tcp socket connect timeout: 60000[m
[31m---- no_error_log[m
[31m-lua tcp socket write timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: abort when downstream socket pending on writes[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to acquire the req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.log(ngx.WARN, "quitting request now")[m
[31m-                ngx.exit(200)[m
[31m-            end)[m
[31m-            local bytes[m
[31m-            bytes, err = sock:send("e\\r\\nget helloworld!")[m
[31m-            if bytes then[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            else[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active = 0[m
[31m-F(ngx_http_lua_socket_send) {[m
[31m-    active = 1[m
[31m-    println(probefunc())[m
[31m-}[m
[31m-probe syscall.send,[m
[31m-    syscall.sendto,[m
[31m-    syscall.writev[m
[31m-{[m
[31m-    if (active && pid() == target()) {[m
[31m-        println(probefunc())[m
[31m-    }[m
[31m-}[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-lua tcp socket send timeout: 100[m
[31m-quitting request now[m
[31m---- no_error_log[m
[31m-lua tcp socket write timed out[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: read timeout on receive(N)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_read_timeout 100ms;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            sock:settimeout(10)[m
[31m-[m
[31m-            local line[m
[31m-            line, err = sock:receive(3)[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua tcp socket read timeout: 10[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: concurrent operations while writing[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ready = false[m
[31m-[m
[31m-            local function f()[m
[31m-                while not ready do[m
[31m-                    ngx.sleep(0.001)[m
[31m-                end[m
[31m-[m
[31m-                local bytes, err = sock:send("flush_all")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-                sock:settimeout(1)[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            ready = true[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local bytes, err = sock:send("get helloworld!")[m
[31m-            if not bytes then[m
[31m-                ngx.say("send failed: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connect: 1 nil[m
[31m-send: nil socket busy writing[m
[31m-close: nil socket busy writing[m
[31m-getreusedtimes: 0 nil[m
[31m-setkeepalive: nil socket busy writing[m
[31m-connect: nil socket busy writing[m
[31m-receive: nil timeout[m
[31m-send failed: timeout[m
[31m-close: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/066-socket-receiveuntil.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/066-socket-receiveuntil.t[m
[1mdeleted file mode 100644[m
[1mindex 3bf5229..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/066-socket-receiveuntil.t[m
[1m+++ /dev/null[m
[36m@@ -1,1332 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: memcached read lines[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local readline = sock:receiveuntil("\\r\\n")[m
[31m-            local line, err, part = readline()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: http read lines[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local readline = sock:receiveuntil("\\r\\n")[m
[31m-            local line, err, part[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = readline()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: HTTP/1.1 200 OK[m
[31m-read: Server: nginx[m
[31m-read: Content-Type: text/plain[m
[31m-read: Content-Length: 4[m
[31m-read: Connection: close[m
[31m-read: [m
[31m-failed to read a line: closed [foo[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: http read all the headers in a single run[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local line, err, part[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = read_headers()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Content-Length: 4\r[m
[31m-Connection: close[m
[31m-failed to read a line: closed [foo[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ambiguous boundary patterns (abcabd)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabd")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("abcabcabd")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abc[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ambiguous boundary patterns (aa)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua 'ngx.say("abcabcaad")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabc[m
[31m-failed to read a line: closed [d[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ambiguous boundary patterns (aaa)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aaa")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abaabcaaaef;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abaabc[m
[31m-failed to read a line: closed [ef[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ambiguous boundary patterns (aaaaad)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aaaaad")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo baaaaaaaaeaaaaaaadf;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: baaaaaaaaeaa[m
[31m-failed to read a line: closed [f[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ambiguous boundary patterns (aaaaad), small buffer, 2 bytes[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 2;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aaaaad")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo baaaaaaaaeaaaaaaadf;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: baaaaaaaaeaa[m
[31m-failed to read a line: closed [f[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ambiguous boundary patterns (aaaaad), small buffer, 1 byte[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aaaaad")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo baaaaaaaaeaaaaaaadf;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: baaaaaaaaeaa[m
[31m-failed to read a line: closed [f[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ambiguous boundary patterns (abcabdabcabe)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabdabcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabd[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ambiguous boundary patterns (abcabdabcabe 2)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabdabcabcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabdabc[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ambiguous boundary patterns (abcabdabcabe 3)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abc[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ambiguous boundary patterns (abcabdabcabe 4)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo ababcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: ab[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ambiguous boundary patterns (--abc)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo -- ----abc;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: --[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ambiguous boundary patterns (--abc)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc")[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read: o, w[m
[31m-read: orld[m
[31m-read:  --[m
[31m-read: [m
[31m-failed to read a line: nil [nil][m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ambiguous boundary patterns (--abc), small buffer[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc")[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read: o, w[m
[31m-read: orld[m
[31m-read:  --[m
[31m-read: [m
[31m-failed to read a line: nil [nil][m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ambiguous boundary patterns (--abc), small buffer, mixed by other reading calls[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc")[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a chunk: ", err, " [", part, "]")[m
[31m-                end[m
[31m-[m
[31m-                local data, err, part = sock:receive(1)[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to read a byte: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                else[m
[31m-                    ngx.say("read one byte: ", data)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read one byte: o[m
[31m-read: , wo[m
[31m-read one byte: r[m
[31m-read: ld -[m
[31m-read one byte: -[m
[31m-read: [m
[31m-read one byte: [m
[31m-[m
[31m-failed to read a chunk: nil [nil][m
[31m-failed to read a byte: closed [][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ambiguous boundary patterns (abcabd), small buffer[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 3;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabd")[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcabd;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abc[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: long patterns[m
[31m-this exposed a memory leak in receiveuntil[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if not sock then[m
[31m-                ngx.say("failed to get req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local reader, err = sock:receiveuntil("------------------------------------------- abcdefghijklmnopqrstuvwxyz")[m
[31m-            if not reader then[m
[31m-                ngx.say("failed to get reader: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    POST /t[m
[31m-[m
[31m---- more_headers: Content-Length: 1024[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/067-req-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/067-req-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 30a653a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/067-req-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,1099 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 9);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-received: hello[m
[31m-received:  worl[m
[31m-failed to receive: closed [d][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multipart rfc sample (just partial streaming)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local boundary[m
[31m-            local header = ngx.var.http_content_type[m
[31m-            local m = ngx.re.match(header, [[; +boundary=(?:"(.*?)"|(\\w+))]], "jo")[m
[31m-            if m then[m
[31m-                boundary = m[1] or m[2][m
[31m-[m
[31m-            else[m
[31m-                ngx.say("invalid content-type header")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local read_to_boundary = sock:receiveuntil("\\r\\n--" .. boundary)[m
[31m-            local read_line = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-            local data, err, part = read_to_boundary()[m
[31m-            if data then[m
[31m-                ngx.say("preamble: [" .. data .. "]")[m
[31m-            else[m
[31m-                ngx.say("failed to read the first boundary: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local i = 1[m
[31m-            while true do[m
[31m-                local line, err = read_line()[m
[31m-[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to read post-boundary line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                m = ngx.re.match(line, "--$", "jo")[m
[31m-                if m then[m
[31m-                    ngx.say("found the end of the stream")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = read_line()[m
[31m-                    if not line then[m
[31m-                        ngx.say("failed to read part ", i, " header: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if line == "" then[m
[31m-                        -- the header part completes[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("part ", i, " header: [", line, "]")[m
[31m-                end[m
[31m-[m
[31m-                local data, err, part = read_to_boundary()[m
[31m-                if data then[m
[31m-                    ngx.say("part ", i, " body: [" .. data .. "]")[m
[31m-                else[m
[31m-                    ngx.say("failed to read part ", i + 1, " boundary: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.\r[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-"[m
[31m---- more_headers[m
[31m-Content-Type: multipart/mixed; boundary="simple boundary"[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-preamble: [This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.][m
[31m-part 1 body: [This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.][m
[31m-part 2 header: [Content-type: text/plain; charset=us-ascii][m
[31m-part 2 body: [This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-][m
[31m-found the end of the stream[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multipart rfc sample (completely streaming)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            local boundary[m
[31m-            local header = ngx.var.http_content_type[m
[31m-            local m = ngx.re.match(header, [[; +boundary=(?:"(.*?)"|(\\w+))]], "jo")[m
[31m-            if m then[m
[31m-                boundary = m[1] or m[2][m
[31m-[m
[31m-            else[m
[31m-                ngx.say("invalid content-type header")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local read_to_boundary = sock:receiveuntil("\\r\\n--" .. boundary)[m
[31m-            local read_line = sock:receiveuntil("\\r\\n")[m
[31m-[m
[31m-            local preamble = ""[m
[31m-            while true do[m
[31m-                local data, err, part = read_to_boundary(1)[m
[31m-                if data then[m
[31m-                    preamble = preamble .. data[m
[31m-[m
[31m-                elseif not err then[m
[31m-                    break[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read the first boundary: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("preamble: [" .. preamble .. "]")[m
[31m-[m
[31m-            local i = 1[m
[31m-            while true do[m
[31m-                local line, err = read_line(50)[m
[31m-[m
[31m-                if not line and err then[m
[31m-                    ngx.say("1: failed to read post-boundary line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if line then[m
[31m-                    local dummy[m
[31m-                    dummy, err = read_line(1)[m
[31m-                    if err then[m
[31m-                        ngx.say("2: failed to read post-boundary line: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if dummy then[m
[31m-                        ngx.say("bad post-boundary line: ", dummy)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    m = ngx.re.match(line, "--$", "jo")[m
[31m-                    if m then[m
[31m-                        ngx.say("found the end of the stream")[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = read_line(50)[m
[31m-                    if not line and err then[m
[31m-                        ngx.say("failed to read part ", i, " header: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    if line then[m
[31m-                        local line, err = read_line(1)[m
[31m-                        if line or err then[m
[31m-                            ngx.say("error")[m
[31m-                            return[m
[31m-                        end[m
[31m-                    end[m
[31m-[m
[31m-                    if line == "" then[m
[31m-                        -- the header part completes[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("part ", i, " header: [", line, "]")[m
[31m-                end[m
[31m-[m
[31m-                local body = ""[m
[31m-[m
[31m-                while true do[m
[31m-                    local data, err, part = read_to_boundary(1)[m
[31m-                    if data then[m
[31m-                        body = body .. data[m
[31m-[m
[31m-                    elseif err then[m
[31m-                        ngx.say("failed to read part ", i + 1, " boundary: ", err)[m
[31m-                        return[m
[31m-[m
[31m-                    else[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("part ", i, " body: [" .. body .. "]")[m
[31m-[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /t[m
[31m-This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.\r[m
[31m---simple boundary\r[m
[31m-\r[m
[31m-This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.\r[m
[31m---simple boundary\r[m
[31m-Content-type: text/plain; charset=us-ascii\r[m
[31m-\r[m
[31m-This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-\r[m
[31m---simple boundary--\r[m
[31m-This is the epilogue.  It is also to be ignored.[m
[31m-"[m
[31m---- more_headers[m
[31m-Content-Type: multipart/mixed; boundary="simple boundary"[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-preamble: [This is the preamble.  It is to be ignored, though it[m
[31m-is a handy place for mail composers to include an[m
[31m-explanatory note to non-MIME compliant readers.][m
[31m-part 1 body: [This is implicitly typed plain ASCII text.[m
[31m-It does NOT end with a linebreak.][m
[31m-part 2 header: [Content-type: text/plain; charset=us-ascii][m
[31m-part 2 body: [This is explicitly typed plain ASCII text.[m
[31m-It DOES end with a linebreak.[m
[31m-][m
[31m-found the end of the stream[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: attempt to use the req socket across request boundary[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock, err[m
[31m-[m
[31m-function go()[m
[31m-    if not sock then[m
[31m-        sock, err = ngx.req.socket()[m
[31m-        if sock then[m
[31m-            ngx.say("got the request socket")[m
[31m-        else[m
[31m-            ngx.say("failed to get the request socket: ", err)[m
[31m-        end[m
[31m-    else[m
[31m-        for i = 1, 3 do[m
[31m-            local data, err, part = sock:receive(5)[m
[31m-            if data then[m
[31m-                ngx.say("received: ", data)[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body_like[m
[31m-(?:got the request socket[m
[31m-|failed to receive: closed [d][m
[31m-)?done[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: receive until on request_body - receiveuntil(1) on the last byte of the body[m
[31m-See https://groups.google.com/group/openresty/browse_thread/thread/43cf01da3c681aba for details[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-   local sock, err = ngx.req.socket()[m
[31m-   if sock then[m
[31m-      ngx.say("got the request socket")[m
[31m-   else[m
[31m-      ngx.say("failed to get the request socket: ", err)[m
[31m-      return[m
[31m-   end[m
[31m-[m
[31m-   local data, err, part = sock:receive(56)[m
[31m-   if data then[m
[31m-      ngx.say("received: ", data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-[m
[31m-   local discard_line = sock:receiveuntil('\r\n')[m
[31m-[m
[31m-   local data, err, part = discard_line(8192)[m
[31m-   if data then[m
[31m-      ngx.say("received len: ", #data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-[m
[31m-   local data, err, part = discard_line(1)[m
[31m-   if data then[m
[31m-      ngx.say("received: ", data)[m
[31m-   else[m
[31m-      ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-   end[m
[31m-end[m
[31m---- request[m
[31m-POST /t[m
[31m------------------------------820127721219505131303151179################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################$[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-received: -----------------------------820127721219505131303151179[m
[31m-received len: 8192[m
[31m-received: $[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: pipelined POST requests[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            test.go()[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-   local sock, err = ngx.req.socket()[m
[31m-   if sock then[m
[31m-      ngx.say("got the request socket")[m
[31m-   else[m
[31m-      ngx.say("failed to get the request socket: ", err)[m
[31m-      return[m
[31m-   end[m
[31m-[m
[31m-   while true do[m
[31m-       local data, err, part = sock:receive(4)[m
[31m-       if data then[m
[31m-          ngx.say("received: ", data)[m
[31m-       else[m
[31m-          ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-          return[m
[31m-       end[m
[31m-   end[m
[31m-end[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello, world",[m
[31m-"POST /t[m
[31m-hiya, world"][m
[31m---- response_body eval[m
[31m-["got the request socket[m
[31m-received: hell[m
[31m-received: o, w[m
[31m-received: orld[m
[31m-failed to receive: closed [][m
[31m-done[m
[31m-",[m
[31m-"got the request socket[m
[31m-received: hiya[m
[31m-received: , wo[m
[31m-failed to receive: closed [rld][m
[31m-done[m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: Expect & 100 Continue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- more_headers[m
[31m-Expect: 100-Continue[m
[31m---- error_code: 100[m
[31m---- response_body_like chomp[m
[31m-\breceived: hello\b.*?\breceived:  worl\b[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: pipelined requests, big buffer, small steps[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_buffer_size 5;[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 6 do[m
[31m-                local data, err, part = sock:receive(2)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap2[m
[31m-M(http-lua-req-socket-consume-preread) {[m
[31m-    println("preread: ", user_string_n($arg2, $arg3))[m
[31m-}[m
[31m-[m
[31m---- pipelined_requests eval[m
[31m-["POST /t[m
[31m-hello world","POST /t[m
[31m-hiya globe"][m
[31m---- response_body eval[m
[31m-["got the request socket[m
[31m-received: he[m
[31m-received: ll[m
[31m-received: o [m
[31m-received: wo[m
[31m-received: rl[m
[31m-failed to receive: closed [d][m
[31m-","got the request socket[m
[31m-received: hi[m
[31m-received: ya[m
[31m-received:  g[m
[31m-received: lo[m
[31m-received: be[m
[31m-failed to receive: closed [][m
[31m-"][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: chunked support is still a TODO[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            if sock then[m
[31m-                ngx.say("got the request socket")[m
[31m-            else[m
[31m-                ngx.req.read_body()[m
[31m-                ngx.say("failed to get the request socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local data, err, part = sock:receive(5)[m
[31m-                if data then[m
[31m-                    ngx.say("received: ", data)[m
[31m-                else[m
[31m-                    ngx.say("failed to receive: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-b\r[m
[31m-hello world\r[m
[31m-0\r[m
[31m-\r[m
[31m-"[m
[31m---- stap2[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    if ($r->main->count == 2) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-F(ngx_http_free_request) {[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-*/[m
[31m---- response_body[m
[31m-failed to get the request socket: chunked request bodies not supported yet[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- skip_nginx: 4: <1.3.9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: chunked support in ngx.req.read_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.say(ngx.req.get_body_data())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-b\r[m
[31m-hello world\r[m
[31m-0\r[m
[31m-\r[m
[31m-"[m
[31m---- stap2[m
[31m-/*[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    if ($r->main->count == 2) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-F(ngx_http_free_request) {[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-*/[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- skip_nginx: 4: <1.3.9[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: downstream cosocket for GET requests (w/o request bodies)[m
[31m---- config[m
[31m-    #resolver 8.8.8.8;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-           local sock, err = ngx.req.socket()[m
[31m-[m
[31m-           if not sock then[m
[31m-              ngx.say("failed to get socket: ", err)[m
[31m-              return nil[m
[31m-           end[m
[31m-[m
[31m-           while true do[m
[31m-              local data, err, partial = sock:receive(4096)[m
[31m-[m
[31m-              ngx.log(ngx.INFO, "Received data")[m
[31m-[m
[31m-              if err then[m
[31m-                 ngx.say("err: ", err)[m
[31m-                 if partial then[m
[31m-                    ngx.print(partial)[m
[31m-                 end[m
[31m-[m
[31m-                 break[m
[31m-              end[m
[31m-[m
[31m-              if data then[m
[31m-                 ngx.print(data)[m
[31m-              end[m
[31m-           end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-failed to get socket: no body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: downstream cosocket for POST requests with 0 size bodies[m
[31m---- config[m
[31m-    #resolver 8.8.8.8;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-           local sock, err = ngx.req.socket()[m
[31m-[m
[31m-           if not sock then[m
[31m-              ngx.say("failed to get socket: ", err)[m
[31m-              return nil[m
[31m-           end[m
[31m-[m
[31m-           while true do[m
[31m-              local data, err, partial = sock:receive(4096)[m
[31m-[m
[31m-              ngx.log(ngx.INFO, "Received data")[m
[31m-[m
[31m-              if err then[m
[31m-                 ngx.say("err: ", err)[m
[31m-                 if partial then[m
[31m-                    ngx.print(partial)[m
[31m-                 end[m
[31m-[m
[31m-                 break[m
[31m-              end[m
[31m-[m
[31m-              if data then[m
[31m-                 ngx.print(data)[m
[31m-              end[m
[31m-           end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /t[m
[31m---- more_headers[m
[31m-Content-Length: 0[m
[31m---- response_body[m
[31m-failed to get socket: no body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: failing reread after reading timeout happens[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-[m
[31m-            if not sock then[m
[31m-               ngx.say("failed to get socket: ", err)[m
[31m-               return nil[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100);[m
[31m-[m
[31m-            local data, err, partial = sock:receive(4096)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            end[m
[31m-[m
[31m-            local data, err, partial = sock:receive(4096)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-               return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 10245\r[m
[31m-\r[m
[31m-hello"[m
[31m---- response_body[m
[31m-err: timeout, partial: hello[m
[31m-err: timeout, partial: [m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: successful reread after reading timeout happens (receive -> receive)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("POST /back HTTP/1.0\\r\\nHost: localhost\\r\\nContent-Length: 1024\\r\\n\\r\\nabc")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = sock:send("hello world")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to receive header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-[m
[31m-            if not sock then[m
[31m-               ngx.say("failed to get socket: ", err)[m
[31m-               return nil[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100);[m
[31m-[m
[31m-            local data, err, partial = sock:receive(4096)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            local data, err, partial = sock:receive(11)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sent: 65[m
[31m-sent: 11[m
[31m-received: err: timeout, partial: abc[m
[31m-received: received: hello world[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: successful reread after reading timeout happens (receive -> receiveuntil)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("POST /back HTTP/1.0\\r\\nHost: localhost\\r\\nContent-Length: 1024\\r\\n\\r\\nabc")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = sock:send("hello world\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to receive header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-[m
[31m-            if not sock then[m
[31m-               ngx.say("failed to get socket: ", err)[m
[31m-               return nil[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100);[m
[31m-[m
[31m-            local data, err, partial = sock:receive(4096)[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sent: 65[m
[31m-sent: 12[m
[31m-received: err: timeout, partial: abc[m
[31m-received: received: hello world[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: successful reread after reading timeout happens (receiveuntil -> receive)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", ngx.var.server_port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("POST /back HTTP/1.0\\r\\nHost: localhost\\r\\nContent-Length: 1024\\r\\n\\r\\nabc")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.2)[m
[31m-[m
[31m-            local bytes, err = sock:send("hello world\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-            else[m
[31m-                ngx.say("sent: ", bytes)[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local header, err = reader()[m
[31m-            if not header then[m
[31m-                ngx.say("failed to receive header: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-[m
[31m-            if not sock then[m
[31m-               ngx.say("failed to get socket: ", err)[m
[31m-               return nil[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100);[m
[31m-[m
[31m-            local reader = sock:receiveuntil("no-such-terminator")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            local data, err, partial = sock:receive()[m
[31m-            if err then[m
[31m-               ngx.say("err: ", err, ", partial: ", partial)[m
[31m-            else[m
[31m-                ngx.say("received: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sent: 65[m
[31m-sent: 12[m
[31m-received: err: timeout, partial: abc[m
[31m-received: received: hello world[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: req socket GC'd[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock, err = ngx.req.socket()[m
[31m-                if sock then[m
[31m-                    ngx.say("got the request socket")[m
[31m-                else[m
[31m-                    ngx.say("failed to get the request socket: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            collectgarbage()[m
[31m-            ngx.log(ngx.WARN, "GC cycle done")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-got the request socket[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/lua finalize socket|GC cycle done/[m
[31m---- grep_error_log_out[m
[31m-lua finalize socket[m
[31m-GC cycle done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/068-socket-keepalive.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/068-socket-keepalive.t[m
[1mdeleted file mode 100644[m
[1mindex a005620..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/068-socket-keepalive.t[m
[1m+++ /dev/null[m
[36m@@ -1,1478 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 7);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;[m
[31m-[m
[31m-$ENV{LUA_PATH} ||=[m
[31m-    '/usr/local/openresty-debug/lualib/?.lua;/usr/local/openresty/lualib/?.lua;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-connected: 1, reused: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- error_log eval[m
[31m-qq{lua tcp socket get keepalive peer: using connection[m
[31m-lua tcp socket keepalive create connection pool for key "127.0.0.1:$ENV{TEST_NGINX_MEMCACHED_PORT}"[m
[31m-}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: free up the whole connection pool if no active connections[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port, true)[m
[31m-            test.go(port, false)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, keepalive)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    if keepalive then[m
[31m-        local ok, err = sock:setkeepalive()[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to set reusable: ", err)[m
[31m-        end[m
[31m-[m
[31m-    else[m
[31m-        sock:close()[m
[31m-    end[m
[31m-end[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-connected: 1, reused: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket get keepalive peer: using connection",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: upstream sockets close prematurely[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   keepalive_timeout 100ms;[m
[31m-   location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, err = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: http keepalive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-        keepalive_timeout 60s;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, err = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive close handler: fd:",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: lua_socket_keepalive_timeout[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 100 ms",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_socket_pool_size[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-       lua_socket_pool_size 1;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 100 ms",[m
[31m-qr/lua tcp socket connection pool size: 1\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: "lua_socket_keepalive_timeout 0" means unlimited[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 0;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive timeout: unlimited",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: setkeepalive(timeout) overrides lua_socket_keepalive_timeout[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-        keepalive_timeout 60s;[m
[31m-        lua_socket_keepalive_timeout 60s;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(123)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 123 ms",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sock:setkeepalive(timeout, size) overrides lua_socket_pool_size[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 100ms;[m
[31m-       lua_socket_pool_size 100;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(101, 25)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive close handler",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket keepalive timeout: 101 ms",[m
[31m-qr/lua tcp socket connection pool size: 25\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: sock:keepalive_timeout(0) means unlimited[m
[31m---- config[m
[31m-   server_tokens off;[m
[31m-   location /t {[m
[31m-       keepalive_timeout 60s;[m
[31m-       lua_socket_keepalive_timeout 1000ms;[m
[31m-[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: keepalive\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n0\\r\\n\\r\\n")[m
[31m-            local data, res = reader()[m
[31m-[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive response body: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive(0)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set reusable: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 61[m
[31m-received response of 156 bytes[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua tcp socket keepalive timeout: unlimited",[m
[31m-qr/lua tcp socket connection pool size: 30\b/][m
[31m---- timeout: 4[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: sanity (uds)[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen unix:$::HtmlDir/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            echo foo;[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local path = "$TEST_NGINX_HTML_DIR/nginx.sock";[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(path, port)[m
[31m-            test.go(path, port)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(path, port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("unix:" .. path)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "GET /foo HTTP/1.1\r\nHost: localhost\r\nConnection: keepalive\r\n\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-    local reader = sock:receiveuntil("\r\n0\r\n\r\n")[m
[31m-    local data, err = reader()[m
[31m-[m
[31m-    if not data then[m
[31m-        ngx.say("failed to receive response body: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("received response of ", #data, " bytes")[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-request sent: 61[m
[31m-received response of 119 bytes[m
[31m-connected: 1, reused: 1[m
[31m-request sent: 61[m
[31m-received response of 119 bytes[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for "][m
[31m---- error_log eval[m
[31m-["lua tcp socket get keepalive peer: using connection",[m
[31m-'lua tcp socket keepalive create connection pool for key "unix:'][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #108: ngx.locaiton.capture + redis.set_keepalive[m
[31m---- http_config eval[m
[31m-    qq{[m
[31m-        lua_package_path "$::HtmlDir/?.lua;;";[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        default_type text/html;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #lua_code_cache off;[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua_file html/t.lua;[m
[31m-    }[m
[31m-[m
[31m-    location /anyurl {[m
[31m-        internal;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/dummy;[m
[31m-    }[m
[31m-[m
[31m-    location = /dummy {[m
[31m-        echo dummy;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> t.lua[m
[31m-local sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)[m
[31m-if not sock then ngx.say(err) return end[m
[31m-sock:send("flush_all\r\n")[m
[31m-sock:receive()[m
[31m-sock:setkeepalive()[m
[31m-[m
[31m-sock, err = ngx.socket.connect("127.0.0.1", ngx.var.port)[m
[31m-if not sock then ngx.say(err) return end[m
[31m-local res = ngx.location.capture("/anyurl") --3[m
[31m-[m
[31m-ngx.say("ok")[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #110: ngx.exit with HTTP_NOT_FOUND causes worker process to exit[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    error_page 404 /404.html;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        access_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-            ngx.exit(404)[m
[31m-        ';[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> 404.html[m
[31m-Not found, dear...[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.log(ngx.ERR, "failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if not line then[m
[31m-        ngx.log(ngx.ERR, "failed to receive a line: ", err, " [", part, "]")[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    -- local ok, err = sock:setkeepalive()[m
[31m-    -- if not ok then[m
[31m-        -- ngx.log(ngx.ERR, "failed to set reusable: ", err)[m
[31m-        -- return[m
[31m-    -- end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Not found, dear...[m
[31m---- error_code: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: custom pools (different pool for the same host:port) - tcp[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port, "A")[m
[31m-            test.go(port, "B")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 0[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket get keepalive peer: using connection"[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "A"[m
[31m-lua tcp socket keepalive create connection pool for key "B"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: custom pools (same pool for different host:port) - tcp[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, "foo")[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, "foo")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 1[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "foo"[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: custom pools (different pool for the same host:port) - unix[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen unix:$::HtmlDir/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            echo foo;[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local path = "$TEST_NGINX_HTML_DIR/nginx.sock";[m
[31m-            test.go(path, "A")[m
[31m-            test.go(path, "B")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(path, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("unix:" .. path, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 0[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-"lua tcp socket get keepalive peer: using connection"[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "A"[m
[31m-lua tcp socket keepalive create connection pool for key "B"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: custom pools (same pool for the same path) - unix[m
[31m---- http_config eval[m
[31m-"[m
[31m-    lua_package_path '$::HtmlDir/?.lua;./?.lua';[m
[31m-    server {[m
[31m-        listen unix:$::HtmlDir/nginx.sock;[m
[31m-        default_type 'text/plain';[m
[31m-[m
[31m-        server_tokens off;[m
[31m-    }[m
[31m-"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local path = "$TEST_NGINX_HTML_DIR/nginx.sock";[m
[31m-            test.go(path, "A")[m
[31m-            test.go(path, "A")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(path, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("unix:" .. path, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 1[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "A"[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: numeric pool option value[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, 3.14)[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, 3.14)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 1[m
[31m---- no_error_log eval[m
[31m-["[error]",[m
[31m-"lua tcp socket keepalive: free connection pool for ",[m
[31m-][m
[31m---- error_log[m
[31m-lua tcp socket keepalive create connection pool for key "3.14"[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: nil pool option value[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, nil)[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, nil)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1, reused: 0[m
[31m-connected: 1, reused: 0[m
[31m---- error_code: 200[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: (bad) table pool option value[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, {})[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, {})[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #3 to 'connect' (bad "pool" option type: table)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: (bad) boolean pool option value[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go($TEST_NGINX_MEMCACHED_PORT, true)[m
[31m-            test.go($TEST_NGINX_SERVER_PORT, false)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port, pool)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port, {pool = pool})[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #3 to 'connect' (bad "pool" option type: boolean)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: clear the redis store[m
[31m---- config[m
[31m-    location /t {[m
[31m-        redis2_query flushall;[m
[31m-        redis2_pass 127.0.0.1:$TEST_NGINX_REDIS_PORT;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body eval[m
[31m-"+OK\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: bug in send(): clear the chain writer ctx[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_REDIS_PORT;[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            local port = ngx.var.port[m
[31m-            test.go(port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local bytes, err = sock:send({})[m
[31m-    if err then[m
[31m-        ngx.say("failed to send empty request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "*2\r\n$3\r\nget\r\n$3\r\ndog\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        ngx.say("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        ngx.say("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        ngx.say("failed to set reusable: ", err)[m
[31m-    end[m
[31m-[m
[31m-    ngx.say("done")[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-global active[m
[31m-M(http-lua-socket-tcp-send-start) {[m
[31m-    active = 1[m
[31m-    printf("send [%s] %d\n", text_str(user_string_n($arg3, $arg4)), $arg4)[m
[31m-}[m
[31m-M(http-lua-socket-tcp-receive-done) {[m
[31m-    printf("receive [%s]\n", text_str(user_string_n($arg3, $arg4)))[m
[31m-}[m
[31m-F(ngx_output_chain) {[m
[31m-    #printf("ctx->in: %s\n", ngx_chain_dump($ctx->in))[m
[31m-    #printf("ctx->busy: %s\n", ngx_chain_dump($ctx->busy))[m
[31m-    printf("output chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_linux_sendfile_chain) {[m
[31m-    printf("linux sendfile chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_chain_writer) {[m
[31m-    printf("chain writer ctx out: %p\n", $data)[m
[31m-    printf("nginx chain writer: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_http_lua_socket_tcp_setkeepalive) {[m
[31m-    delete active[m
[31m-}[m
[31m-M(http-lua-socket-tcp-setkeepalive-buf-unread) {[m
[31m-    printf("setkeepalive unread: [%s]\n", text_str(user_string_n($arg3, $arg4)))[m
[31m-}[m
[31m-probe syscall.recvfrom {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf("recvfrom(%s)", argstr)[m
[31m-    }[m
[31m-}[m
[31m-probe syscall.recvfrom.return {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf(" = %s, data [%s]\n", retstr, text_str(user_string_n($ubuf, $size)))[m
[31m-    }[m
[31m-}[m
[31m-probe syscall.writev {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf("writev(%s)", ngx_iovec_dump($vec, $vlen))[m
[31m-        /*[m
[31m-        for (i = 0; i < $vlen; i++) {[m
[31m-            printf(" %p [%s]", $vec[i]->iov_base, text_str(user_string_n($vec[i]->iov_base, $vec[i]->iov_len)))[m
[31m-        }[m
[31m-        */[m
[31m-    }[m
[31m-}[m
[31m-probe syscall.writev.return {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf(" = %s\n", retstr)[m
[31m-    }[m
[31m-}[m
[31m---- response_body[m
[31m-received: $-1[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/069-null.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/069-null.t[m
[1mdeleted file mode 100644[m
[1mindex 7761c91..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/069-null.t[m
[1m+++ /dev/null[m
[36m@@ -1,96 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#log_level('debug');[m
[31m-#log_level('warn');[m
[31m-#worker_connections(1024);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;[m
[31m-[m
[31m-our $LuaCpath = $ENV{LUA_CPATH} ||[m
[31m-    '/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';[m
[31m-[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: compare ngx.null with cjson.null[m
[31m---- http_config eval[m
[31m-    "lua_package_cpath '$::LuaCpath';";[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local cjson = require "cjson"[m
[31m-            ngx.say(cjson.null == ngx.null)[m
[31m-            ngx.say(cjson.encode(ngx.null))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-true[m
[31m-null[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: output ngx.null[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("ngx.null: ", ngx.null)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ngx.null: null[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: output ngx.null in a table[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say({"ngx.null: ", ngx.null})[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ngx.null: null[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: log ngx.null[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            print("ngx.null: ", ngx.null)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-done[m
[31m---- error_log[m
[31m-ngx.null: null[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/070-sha1.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/070-sha1.t[m
[1mdeleted file mode 100644[m
[1mindex 8648a8c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/070-sha1.t[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set sha1 hello[m
[31m---- config[m
[31m-    location = /sha1 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(ngx.sha1_bin("hello")))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-qvTGHdzF6KLavt4PO0gs2a6pQ00=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set sha1 ""[m
[31m---- config[m
[31m-    location = /sha1 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(ngx.sha1_bin("")))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-2jmj7l5rSw0yVb/vlWAYkK/YBwk=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set sha1 nil[m
[31m---- config[m
[31m-    location = /sha1 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(ngx.sha1_bin(nil)))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-2jmj7l5rSw0yVb/vlWAYkK/YBwk=[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set sha1 number[m
[31m---- config[m
[31m-    location = /sha1 {[m
[31m-        content_by_lua 'ngx.say(ngx.encode_base64(ngx.sha1_bin(512)))';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sha1[m
[31m---- response_body[m
[31m-zgmxJ9SPg4aKRWReJG07UvS97L4=[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/071-idle-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/071-idle-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 55d25c6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/071-idle-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,434 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read events come when socket is idle[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("foofoo\\r\\n")[m
[31m-            local line, err, part = reader()[m
[31m-            if line then[m
[31m-                ngx.print("read: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local data, err, part = sock:receive("*a")[m
[31m-            if not data then[m
[31m-                ngx.say("failed to read the 2nd part: ", err)[m
[31m-            else[m
[31m-                ngx.say("2nd part: [", data, "]")[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo -n foofoo;[m
[31m-        echo_flush;[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n barbar;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: HTTP/1.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-6\r[m
[31m-2nd part: [6\r[m
[31m-barbar\r[m
[31m-0\r[m
[31m-\r[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read timer cleared in time[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            sock:settimeout(400)[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent again: ", bytes)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-request sent again: 11[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: connect timer cleared in time[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 11[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: send timer cleared in time[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 11[m
[31m-received: OK[m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set keepalive when system socket recv buffer has unread data[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local reader = sock:receiveuntil("foofoo\\r\\n")[m
[31m-            local line, err, part = reader()[m
[31m-            if line then[m
[31m-                ngx.print("read: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sleep {[m
[31m-        echo_sleep 0.5;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo -n foofoo;[m
[31m-        echo_flush;[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n barbar;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-qr{connected: 1[m
[31m-request sent: 57[m
[31m-read: HTTP/1\.1 200 OK\r[m
[31m-Server: nginx\r[m
[31m-Content-Type: text/plain\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-6\r[m
[31m-failed to set keepalive: (?:unread data in buffer|connection in dubious state)[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set keepalive when cosocket recv buffer has unread data[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local data, err = sock:receive(1)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to read the 1st byte: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("read: ", data)[m
[31m-[m
[31m-            local ok, err = sock:setkeepalive()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set keepalive: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 11[m
[31m-read: O[m
[31m-failed to set keepalive: unread data in buffer[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/072-conditional-get.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/072-conditional-get.t[m
[1mdeleted file mode 100644[m
[1mindex 4bb567a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/072-conditional-get.t[m
[1m+++ /dev/null[m
[36m@@ -1,91 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: If-Modified-Since true[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m---- error_code: 304[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: If-Modified-Since true[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        if_modified_since before;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:48 GMT"[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m---- error_code: 304[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: If-Unmodified-Since false[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        #if_modified_since before;[m
[31m-        content_by_lua '[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:48 GMT"[m
[31m-            local ok, err = ngx.say("hello")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "say failed: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- more_headers[m
[31m-If-Unmodified-Since: Thu, 10 May 2012 07:50:47 GMT[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body_like: 412 Precondition Failed[m
[31m---- error_code: 412[m
[31m---- error_log[m
[31m-say failed: nginx output filter error[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/073-backtrace.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/073-backtrace.t[m
[1mdeleted file mode 100644[m
[1mindex aae4bae..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/073-backtrace.t[m
[1m+++ /dev/null[m
[36m@@ -1,190 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 51;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua[m
[31m-        '   function bar()[m
[31m-                return lua_concat(3)[m
[31m-            end[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-            foo()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to call global 'lua_concat'[m
[31m-: in function 'bar'[m
[31m-:5: in function 'foo'[m
[31m-:7: in function[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: error(nil)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua[m
[31m-        '   function bar()[m
[31m-                error(nil)[m
[31m-            end[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-            foo()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua entry thread aborted: runtime error: unknown reason',[m
[31m-'stack traceback:',[m
[31m-" in function 'error'",[m
[31m-": in function 'bar'",[m
[31m-":5: in function 'foo'",[m
[31m-qr/:7: in function <content_by_lua\(nginx\.conf:\d+\):1>/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: deep backtrace in a single coroutine (more than 15)[m
[31m---- config eval[m
[31m-my $s = "[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-";[m
[31m-my $prev;[m
[31m-for my $i (1..18) {[m
[31m-    if (!defined $prev) {[m
[31m-        $s .= "[m
[31m-            local function func$i()[m
[31m-                return error([[blah]])[m
[31m-            end";[m
[31m-    } else {[m
[31m-        $s .= "[m
[31m-            local function func$i()[m
[31m-                local v = func$prev()[m
[31m-                return v[m
[31m-            end";[m
[31m-    }[m
[31m-    $prev = $i;[m
[31m-}[m
[31m-$s .= "[m
[31m-            func$prev()[m
[31m-        ';[m
[31m-    }[m
[31m-";[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2[m
[31m-probe process("$LIBLUA_PATH").function("lua_concat") {[m
[31m-    println("lua concat")[m
[31m-    //print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-: blah[m
[31m-: in function 'func1'[m
[31m-:7: in function 'func2'[m
[31m-:11: in function 'func3'[m
[31m-:15: in function 'func4'[m
[31m-:19: in function 'func5'[m
[31m-:23: in function 'func6'[m
[31m-:27: in function 'func7'[m
[31m-:31: in function 'func8'[m
[31m-:35: in function 'func9'[m
[31m-:39: in function 'func10'[m
[31m-:43: in function 'func11'[m
[31m-:47: in function 'func12'[m
[31m-:51: in function 'func13'[m
[31m-:55: in function 'func14'[m
[31m-:59: in function 'func15'[m
[31m-:63: in function 'func16'[m
[31m-:67: in function 'func17'[m
[31m-:71: in function 'func18'[m
[31m-:74: in function[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: deep backtrace in a single coroutine (more than 22)[m
[31m---- config eval[m
[31m-my $s = "[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-";[m
[31m-my $prev;[m
[31m-for my $i (1..23) {[m
[31m-    if (!defined $prev) {[m
[31m-        $s .= "[m
[31m-            local function func$i()[m
[31m-                return error([[blah]])[m
[31m-            end";[m
[31m-    } else {[m
[31m-        $s .= "[m
[31m-            local function func$i()[m
[31m-                local v = func$prev()[m
[31m-                return v[m
[31m-            end";[m
[31m-    }[m
[31m-    $prev = $i;[m
[31m-}[m
[31m-$s .= "[m
[31m-            func$prev()[m
[31m-        ';[m
[31m-    }[m
[31m-";[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2[m
[31m-probe process("$LIBLUA_PATH").function("lua_concat") {[m
[31m-    println("lua concat")[m
[31m-    //print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-: blah[m
[31m-: in function 'func1'[m
[31m-:7: in function 'func2'[m
[31m-:11: in function 'func3'[m
[31m-:15: in function 'func4'[m
[31m-:19: in function 'func5'[m
[31m-:23: in function 'func6'[m
[31m-:27: in function 'func7'[m
[31m-:31: in function 'func8'[m
[31m-:35: in function 'func9'[m
[31m-:39: in function 'func10'[m
[31m-:43: in function 'func11'[m
[31m-:47: in function 'func12'[m
[31m-:59: in function 'func15'[m
[31m-:63: in function 'func16'[m
[31m-:67: in function 'func17'[m
[31m-:71: in function 'func18'[m
[31m-:75: in function 'func19'[m
[31m-:79: in function 'func20'[m
[31m-:83: in function 'func21'[m
[31m-...[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/074-prefix-var.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/074-prefix-var.t[m
[1mdeleted file mode 100644[m
[1mindex 3cc4587..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/074-prefix-var.t[m
[1m+++ /dev/null[m
[36m@@ -1,67 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: $prefix[m
[31m---- http_config: lua_package_path "$prefix/html/?.lua;;";[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            foo.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("Greetings from module foo.")[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Greetings from module foo.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ${prefix}[m
[31m---- http_config: lua_package_path "${prefix}html/?.lua;;";[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            foo.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("Greetings from module foo.")[m
[31m-end[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-Greetings from module foo.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/075-logby.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/075-logby.t[m
[1mdeleted file mode 100644[m
[1mindex f987c8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/075-logby.t[m
[1m+++ /dev/null[m
[36m@@ -1,584 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 10);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: log_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        log_by_lua 'ngx.log(ngx.ERR, "Hello from log_by_lua: ", ngx.var.uri)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-Hello from log_by_lua: /lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: log_by_lua_file[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        log_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.log(ngx.ERR, "Hello from log_by_lua: ", ngx.var.uri)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-Hello from log_by_lua: /lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: log_by_lua_file & content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set $counter 3;[m
[31m-        content_by_lua 'ngx.var.counter = ngx.var.counter + 1 ngx.say(ngx.var.counter)';[m
[31m-        log_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.log(ngx.ERR, "Hello from log_by_lua: ", ngx.var.counter * 2)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-4[m
[31m---- error_log[m
[31m-Hello from log_by_lua: 8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.ctx available in log_by_lua (already defined)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.ctx.counter = 3 ngx.say(ngx.ctx.counter)';[m
[31m-        log_by_lua 'ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-3[m
[31m---- error_log[m
[31m-ngx.ctx.counter: 3[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.ctx available in log_by_lua (not defined yet)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)[m
[31m-            ngx.ctx.counter = "hello world"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-ngx.ctx.counter: nil[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: log_by_lua + shared dict[m
[31m---- http_config[m
[31m-    lua_shared_dict foo 100k;[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            local foo = ngx.shared.foo[m
[31m-            local key = ngx.var.uri .. ngx.status[m
[31m-            local newval, err = foo:incr(key, 1)[m
[31m-            if not newval then[m
[31m-                if err == "not found" then[m
[31m-                    foo:add(key, 0)[m
[31m-                    newval, err = foo:incr(key, 1)[m
[31m-                    if not newval then[m
[31m-                        ngx.log(ngx.ERR, "failed to incr ", key, ": ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.log(ngx.ERR, "failed to incr ", key, ": ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            print(key, ": ", foo:get(key))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log eval[m
[31m-qr{/lua200: [12]}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.ctx used in different locations and different ctx (1)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t2 {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.counter = 32[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-ngx.ctx.counter: nil[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.ctx used in different locations and different ctx (2)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.ERR, "ngx.ctx.counter: ", ngx.ctx.counter)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t2 {[m
[31m-        content_by_lua '[m
[31m-            ngx.ctx.counter = 32[m
[31m-            ngx.say(ngx.ctx.counter)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t2[m
[31m---- response_body[m
[31m-32[m
[31m---- error_log[m
[31m-lua release ngx.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: lua error (string)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'error("Bad")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/failed to run log_by_lua\*: log_by_lua\(nginx\.conf:\d+\):1: Bad/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: lua error (nil)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'error(nil)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-failed to run log_by_lua*: unknown reason[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: globals get cleared for every single request[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            if not foo then[m
[31m-                foo = 1[m
[31m-            else[m
[31m-                foo = foo + 1[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-foo = 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: no ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.print(32) return 1";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no ngx.say[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.say(32) return 1";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: no ngx.flush[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.flush()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: no ngx.eof[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.eof()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: no ngx.send_headers[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua "ngx.send_headers()";[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: no ngx.location.capture[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.location.capture("/sub")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: no ngx.location.capture_multi[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.location.capture_multi{{"/sub"}}';[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo sub;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: no ngx.exit[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.exit(0)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: no ngx.redirect[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.redirect("/blah")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: no ngx.exec[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.exec("/blah")';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: no ngx.req.set_uri(uri, true)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.req.set_uri("/blah", true)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.req.set_uri(uri) exists[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.req.set_uri("/blah") print("log_by_lua: uri: ", ngx.var.uri)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-log_by_lua: uri: /blah[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: no ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'ngx.req.read_body()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: no ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'return ngx.req.socket()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: no ngx.socket.tcp()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'return ngx.socket.tcp()';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: no ngx.socket.connect()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        log_by_lua 'return ngx.socket.connect("127.0.0.1", 80)';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: backtrace[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-        log_by_lua '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                error("something bad happened")[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-something bad happened[m
[31m-stack traceback:[m
[31m-in function 'error'[m
[31m-in function 'bar'[m
[31m-in function 'foo'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        log_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: log_by_lua runs before access logging (github issue #254)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        access_log logs/foo.log;[m
[31m-        log_by_lua 'print("hello")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap[m
[31m-F(ngx_http_log_handler) {[m
[31m-    println("log handler")[m
[31m-}[m
[31m-F(ngx_http_lua_log_handler) {[m
[31m-    println("lua log handler")[m
[31m-}[m
[31m---- stap_out[m
[31m-lua log handler[m
[31m-log handler[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: reading ngx.header.HEADER in log_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "content-type: ", ngx.header.content_type)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log eval[m
[31m-qr{log_by_lua\(nginx\.conf:\d+\):1: content-type: text/plain}[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/076-no-postpone.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/076-no-postpone.t[m
[1mdeleted file mode 100644[m
[1mindex 94da63a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/076-no-postpone.t[m
[1m+++ /dev/null[m
[36m@@ -1,146 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rewrite no postpone on[m
[31m---- http_config[m
[31m-    rewrite_by_lua_no_postpone on;[m
[31m---- config[m
[31m-    set $foo '';[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.foo = 1[m
[31m-        ';[m
[31m-        if ($foo = 1) {[m
[31m-            echo "foo: $foo";[m
[31m-        }[m
[31m-        echo "no foo: $foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-foo: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rewrite no postpone explicitly off[m
[31m---- http_config[m
[31m-    rewrite_by_lua_no_postpone off;[m
[31m---- config[m
[31m-    set $foo '';[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.foo = 1[m
[31m-        ';[m
[31m-        if ($foo = 1) {[m
[31m-            echo "foo: $foo";[m
[31m-        }[m
[31m-        echo "no foo: $foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-no foo: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rewrite no postpone off by default[m
[31m---- config[m
[31m-    set $foo '';[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.var.foo = 1[m
[31m-        ';[m
[31m-        if ($foo = 1) {[m
[31m-            echo "foo: $foo";[m
[31m-        }[m
[31m-        echo "no foo: $foo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-no foo: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: access no postpone on[m
[31m---- http_config[m
[31m-    access_by_lua_no_postpone on;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-        deny all;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-Location: http://www.taobao.com/foo[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: access no postpone explicitly off[m
[31m---- http_config[m
[31m-    access_by_lua_no_postpone off;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-        deny all;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: access no postpone off by default[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua '[m
[31m-            ngx.redirect("http://www.taobao.com/foo")[m
[31m-            ngx.say("hi")[m
[31m-        ';[m
[31m-        content_by_lua 'return';[m
[31m-        deny all;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- error_log[m
[31m-access forbidden by rule[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/077-sleep.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/077-sleep.t[m
[1mdeleted file mode 100644[m
[1mindex a7c251a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/077-sleep.t[m
[1m+++ /dev/null[m
[36m@@ -1,407 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 63;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep 0.5 - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep(0.5)[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-5]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m-lua sleep timer expired: "/test?"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep a - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep("a")[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say(now - before)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 500[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep 0.5 in subrequest - content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            local now = ngx.now()[m
[31m-            local delay = now - before[m
[31m-            ngx.say(delay)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        content_by_lua 'ngx.sleep(0.5)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^0\.(?:4[5-9]\d*|5[0-9]\d*|5)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/sleep?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sleep a in subrequest with bad argument[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sleep");[m
[31m-        ';[m
[31m-    }[m
[31m-    location /sleep {[m
[31m-        content_by_lua 'ngx.sleep("a")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like:[m
[31m---- error_log[m
[31m-bad argument #1 to 'sleep'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: sleep 0.33 - multi-times in content[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local start = ngx.now()[m
[31m-            ngx.sleep(0.33)[m
[31m-            ngx.sleep(0.33)[m
[31m-            ngx.sleep(0.33)[m
[31m-            ngx.say(ngx.now() - start)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-^(?:0\.9\d*|1\.[0-2]\d*|1)$[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: sleep 0.5 - interleaved by ngx.say() - ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(1)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m---- error_log[m
[31m-lua ready to sleep[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: sleep 0.5 - interleaved by ngx.say() - not ended by ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.sleep(0.3)[m
[31m-            ngx.say("blah")[m
[31m-            ngx.sleep(0.5)[m
[31m-            -- ngx.location.capture("/sleep")[m
[31m-            ngx.say("hiya")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-blah[m
[31m-hiya[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.location.capture before and after ngx.sleep[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /hello {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m-    location = /sub {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-hello world[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: sleep 0[m
[31m---- config[m
[31m-    location /test {[m
[31m-        content_by_lua '[m
[31m-            ngx.update_time()[m
[31m-            local before = ngx.now()[m
[31m-            ngx.sleep(0)[m
[31m-            local now = ngx.now()[m
[31m-            ngx.say("elapsed: ", now - before)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body_like chop[m
[31m-elapsed: 0[m
[31m---- error_log[m
[31m-lua ready to sleep for[m
[31m-lua sleep timer expired: "/test?"[m
[31m-lua sleep timer expired: "/test?"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.sleep unavailable in log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            ngx.sleep(0.1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-API disabled in the context of log_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.sleep() fails to yield (xpcall err handler)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                return error(1)[m
[31m-            end[m
[31m-            local function err()[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-            xpcall(f, err)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-lua clean up the timer for pending ngx.sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.sleep() fails to yield (require)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            package.loaded["foosleep"] = nil[m
[31m-            require "foosleep";[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- user_files[m
[31m->>> foosleep.lua[m
[31m-ngx.sleep(0.001)[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- wait: 0.2[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua clean up the timer for pending ngx.sleep",[m
[31m-qr{runtime error: attempt to yield across (?:metamethod/)?C-call boundary},[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: sleep coctx handler did not get called in ngx.exit().[m
[31m---- config[m
[31m-    location /t {[m
[31m-         content_by_lua "[m
[31m-            local function sleep(t)[m
[31m-                --- nginx return reply to client without waiting[m
[31m-                ngx.sleep(t)[m
[31m-            end[m
[31m-[m
[31m-            local function wait()[m
[31m-                 --- worker would crash afterwards[m
[31m-                 xpcall(function () error(1) end, function() return sleep(0.001) end)[m
[31m-                 --- ngx.exit was required to crash worker[m
[31m-                 ngx.exit(200)[m
[31m-            end[m
[31m-[m
[31m-            wait()[m
[31m-         ";[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: sleep coctx handler did not get called in ngx.exec().[m
[31m---- config[m
[31m-    location /t {[m
[31m-         content_by_lua '[m
[31m-            local function sleep(t)[m
[31m-                --- nginx return reply to client without waiting[m
[31m-                ngx.sleep(t)[m
[31m-            end[m
[31m-[m
[31m-            local function wait()[m
[31m-                 --- worker would crash afterwards[m
[31m-                 xpcall(function () error(1) end, function() return sleep(0.001) end)[m
[31m-                 --- ngx.exit was required to crash worker[m
[31m-                 ngx.exec("/dummy")[m
[31m-            end[m
[31m-[m
[31m-            wait()[m
[31m-         ';[m
[31m-    }[m
[31m-[m
[31m-    location /dummy {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: sleep coctx handler did not get called in ngx.req.set_uri(uri, true).[m
[31m---- config[m
[31m-    location /t {[m
[31m-         rewrite_by_lua '[m
[31m-            local function sleep(t)[m
[31m-                --- nginx return reply to client without waiting[m
[31m-                ngx.sleep(t)[m
[31m-            end[m
[31m-[m
[31m-            local function wait()[m
[31m-                 --- worker would crash afterwards[m
[31m-                 xpcall(function () error(1) end, function() return sleep(0.001) end)[m
[31m-                 --- ngx.exit was required to crash worker[m
[31m-                 ngx.req.set_uri("/dummy", true)[m
[31m-            end[m
[31m-[m
[31m-            wait()[m
[31m-         ';[m
[31m-    }[m
[31m-[m
[31m-    location /dummy {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/078-hup-vars.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/078-hup-vars.t[m
[1mdeleted file mode 100644[m
[1mindex 8acc346..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/078-hup-vars.t[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-our $SkipReason;[m
[31m-[m
[31m-BEGIN {[m
[31m-    if ($ENV{TEST_NGINX_CHECK_LEAK}) {[m
[31m-        $SkipReason = "unavailable for the hup tests";[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{TEST_NGINX_USE_HUP} = 1;[m
[31m-        undef $ENV{TEST_NGINX_USE_STAP};[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua $SkipReason ? (skip_all => $SkipReason) : ();[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: nginx variable hup bug (step 1)[m
[31m-http://mailman.nginx.org/pipermail/nginx-devel/2012-May/002223.html[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $vv $http_host;[m
[31m-        set_by_lua $i 'return ngx.var.http_host';[m
[31m-        echo $i;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-localhost[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: nginx variable hup bug (step 2)[m
[31m-http://mailman.nginx.org/pipermail/nginx-devel/2012-May/002223.html[m
[31m---- config[m
[31m-    location /t {[m
[31m-        #set $vv $http_host;[m
[31m-        set_by_lua $i 'return ngx.var.http_host';[m
[31m-        echo $i;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-localhost[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/079-unused-directives.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/079-unused-directives.t[m
[1mdeleted file mode 100644[m
[1mindex cba0e41..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/079-unused-directives.t[m
[1m+++ /dev/null[m
[36m@@ -1,343 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 110;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rewrite_by_lua unused[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set_by_lua $i 'return 32';[m
[31m-        #rewrite_by_lua return;[m
[31m-        echo $i;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-32[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rewrite_by_lua used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m---- no_error_log[m
[31m-lua access handler, uri:"/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: access_by_lua used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        access_by_lua return;[m
[31m-        echo hello;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua access handler, uri:"/t" c:1[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m---- no_error_log[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: content_by_lua used[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua 'ngx.say("hello")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua content handler, uri:"/t" c:1[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m---- no_error_log[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: header_filter_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua log handler, uri:"/t"[m
[31m---- no_error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: body_filter_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: header_filter_by_lua_file[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-return[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua log handler, uri:"/t"[m
[31m---- no_error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: body_filter_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log[m
[31m-lua header filter for user lua code, uri "/t"[m
[31m-lua body filter for user lua code, uri "/t"[m
[31m---- no_error_log[m
[31m-lua capture header filter, uri "/t"[m
[31m-lua content handler, uri:"/t"[m
[31m-lua access handler, uri:"/t"[m
[31m-lua rewrite handler, uri:"/t"[m
[31m-lua capture body filter, uri "/t"[m
[31m-lua log handler, uri:"/t"[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: header_filter_by_lua with multiple http blocks (github issue #294)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.status = 201[m
[31m-            ngx.header.Foo = "foo"[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_headers[m
[31m-Foo: foo[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_code: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: body_filter_by_lua in multiple http blocks (github issue #294)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo -n ok;[m
[31m-        body_filter_by_lua '[m
[31m-            if ngx.arg[2] then[m
[31m-                ngx.arg[1] = ngx.arg[1] .. "ay\\n"[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-okay[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: capture filter with multiple http blocks (github issue #294)[m
[31m-This test case won't run with nginx 1.9.3+ since duplicate http {} blocks[m
[31m-have been prohibited since then.[m
[31m---- SKIP[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.say("sub: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        echo -n sub;[m
[31m-    }[m
[31m---- post_main_config[m
[31m-    http {[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-sub: sub[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/080-hup-shdict.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/080-hup-shdict.t[m
[1mdeleted file mode 100644[m
[1mindex f9a0278..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/080-hup-shdict.t[m
[1m+++ /dev/null[m
[36m@@ -1,85 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-our $SkipReason;[m
[31m-[m
[31m-BEGIN {[m
[31m-    if ($ENV{TEST_NGINX_CHECK_LEAK}) {[m
[31m-        $SkipReason = "unavailable for the hup tests";[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{TEST_NGINX_USE_HUP} = 1;[m
[31m-        undef $ENV{TEST_NGINX_USE_STAP};[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua $SkipReason ? (skip_all => $SkipReason) : ();[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: initialize the fields in shdict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 32)[m
[31m-            dogs:set("bah", 10502)[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: retrieve the fields in shdict after HUP reload[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            -- dogs:set("foo", 32)[m
[31m-            -- dogs:set("bah", 10502)[m
[31m-[m
[31m-            local val = dogs:get("foo")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-            val = dogs:get("bah")[m
[31m-            ngx.say(val, " ", type(val))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-32 number[m
[31m-10502 number[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/081-bytecode.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/081-bytecode.t[m
[1mdeleted file mode 100644[m
[1mindex cb50e94..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/081-bytecode.t[m
[1m+++ /dev/null[m
[36m@@ -1,373 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bytecode ("ngx.say('hello');")[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            if jit then[m
[31m-                if not string.find(jit.version, "LuaJIT 2.0") then[m
[31m-                    ngx.say("test skipped")[m
[31m-                    return[m
[31m-                end[m
[31m-                f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x01\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x02\x29\x02\x00\x02\x00\x03\x00\x05\x34\x00\x00\x00\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body_like chop[m
[31m-^(?:hello|test skipped)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: luajit load lua bytecode or lua load luajit bytecode[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            if not package.loaded["jit"] then[m
[31m-                f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            if res.status == 200 then[m
[31m-                ngx.print(res.body)[m
[31m-            else[m
[31m-                ngx.say("error")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x01\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x02\x29\x02\x00\x02\x00\x03\x00\x05\x34\x00\x00\x00\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body[m
[31m-error[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test\.lua": bad byte-code header/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unknown bytecode version[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            if package.loaded["jit"] then[m
[31m-                f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            if res.status == 200 then[m
[31m-                ngx.print(res.body)[m
[31m-            else[m
[31m-                ngx.say("error")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x52\x00\x01\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x80\x02\x29\x02\x00\x02\x00\x03\x00\x05\x34\x00\x00\x00\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body[m
[31m-error[m
[31m---- error_log[m
[31m-bytecode format version unsupported[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: bytecode (big endian)[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            local do_jit[m
[31m-            if jit then[m
[31m-                if not string.find(jit.version, "LuaJIT 2.0") then[m
[31m-                    ngx.say("test skipped")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                do_jit = true; f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            if do_jit and res.status == 200 then[m
[31m-                ngx.say("ok")[m
[31m-            elseif not do_jit and res.status == 500 then[m
[31m-                ngx.say("ok")[m
[31m-            else[m
[31m-                ngx.say("error")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x00\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x03\x29\x02\x00\x02\x00\x03\x00\x05\x00\x00\x00\x34\x00\x01\x00\x37\x00\x02\x01\x25\x01\x02\x00\x3e\x00\x01\x00\x47\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body_like chop[m
[31m-^(?:ok|test skipped)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: good header but bad body[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            local jit;[m
[31m-            if package.loaded["jit"] then[m
[31m-                jit = true;[m
[31m-                f:write(string.sub(b, 149));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 147));[m
[31m-            end[m
[31m-            if not jit then[m
[31m-                f:close(); res = ngx.location.capture("/call");[m
[31m-                if res.status == 200 then[m
[31m-                    ngx.print("ok")[m
[31m-                else[m
[31m-                    ngx.say("error")[m
[31m-                end[m
[31m-            else[m
[31m-            -- luajit will get a segmentation fault with bad bytecode,[m
[31m-            -- so here just skip this case for luajit[m
[31m-                ngx.say("error")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x01\x04\x08\x04\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\xff\xff\xff\xff\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x02\x29\x02\x00\x02\x00\x03\x00\x05\xff\xff\xff\xff\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x00"[m
[31m---- response_body[m
[31m-error[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: stripped(lua) & no stripped(luajit)[m
[31m---- config[m
[31m-    root html;[m
[31m-    location /save_call {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body();[m
[31m-            local b = ngx.req.get_body_data();[m
[31m-            f = io.open(ngx.var.realpath_root.."/test.lua", "w");[m
[31m-            -- luajit bytecode: sub(149,-1), lua bytecode: sub(1,147)[m
[31m-            if jit then[m
[31m-                if not string.find(jit.version, "LuaJIT 2.0") then[m
[31m-                    ngx.say("test skipped")[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                f:write(string.sub(b, 119));[m
[31m-            else[m
[31m-                f:write(string.sub(b, 1, 117));[m
[31m-            end[m
[31m-            f:close(); res = ngx.location.capture("/call");[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /call {[m
[31m-        content_by_lua_file $realpath_root/test.lua;[m
[31m-    }[m
[31m---- request eval[m
[31m-"POST /save_call[m
[31m-\x1b\x4c\x75\x61\x51\x00\x01\x04\x08\x04\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x05\x00\x00\x00\x05\x00\x00\x00\x06\x40\x40\x00\x41\x80\x00\x00\x1c\x40\x00\x01\x1e\x00\x80\x00\x03\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x6e\x67\x78\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x73\x61\x79\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x68\x65\x6c\x6c\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[m
[31m-\x1b\x4c\x4a\x01\x00\x09\x40\x74\x65\x73\x74\x2e\x6c\x75\x61\x32\x02\x00\x02\x00\x03\x00\x05\x06\x00\x02\x34\x00\x00\x00\x37\x00\x01\x00\x25\x01\x02\x00\x3e\x00\x02\x01\x47\x00\x01\x00\x0a\x68\x65\x6c\x6c\x6f\x08\x73\x61\x79\x08\x6e\x67\x78\x01\x01\x01\x01\x01\x00\x00"[m
[31m---- response_body_like chop[m
[31m-^(?:hello|test skipped)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: generate & load bytecode for LuaJIT (stripped)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local bcsave = require "jit.bcsave"[m
[31m-            if jit then[m
[31m-                local prefix = ngx.config.prefix()[m
[31m-                local infile = prefix .. "html/a.lua"[m
[31m-                local outfile = prefix .. "html/a.luac"[m
[31m-                bcsave.start("-s", infile, outfile)[m
[31m-                return ngx.exec("/call")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("test skipped!")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /call {[m
[31m-        content_by_lua_file html/a.luac;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.status = 201 ngx.say("hello from Lua!")[m
[31m---- response_body_like chop[m
[31m-^(?:hello from Lua!|test skipped!)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: generate & load bytecode for LuaJIT (not stripped)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local bcsave = require "jit.bcsave"[m
[31m-            if jit then[m
[31m-                local prefix = ngx.config.prefix()[m
[31m-                local infile = prefix .. "html/a.lua"[m
[31m-                local outfile = prefix .. "html/a.luac"[m
[31m-                bcsave.start("-g", infile, outfile)[m
[31m-                return ngx.exec("/call")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("test skipped!")[m
[31m-        ';[m
[31m-    }[m
[31m-    location = /call {[m
[31m-        content_by_lua_file html/a.luac;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-ngx.status = 201 ngx.say("hello from Lua!")[m
[31m---- response_body_like chop[m
[31m-^(?:hello from Lua!|test skipped!)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 201[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: bytecode (not stripped)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local f = assert(loadstring("a = a and a + 1 or 1 ngx.say('a = ', a)", "=code"))[m
[31m-            local bc = string.dump(f)[m
[31m-            local f = assert(io.open("t/servroot/html/a.luac", "w"))[m
[31m-            f:write(bc)[m
[31m-            f:close()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        content_by_lua_file html/a.luac;[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        echo_location /t;[m
[31m-        echo_location /t2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-a = 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: bytecode (stripped)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local f = assert(loadstring("a = a and a + 1 or 1 ngx.say('a = ', a)", "=code"))[m
[31m-            local bc = string.dump(f, true)[m
[31m-            local f = assert(io.open("t/servroot/html/a.luac", "w"))[m
[31m-            f:write(bc)[m
[31m-            f:close()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        content_by_lua_file html/a.luac;[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        echo_location /t;[m
[31m-        echo_location /t2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body[m
[31m-a = 1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/082-body-filter.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/082-body-filter.t[m
[1mdeleted file mode 100644[m
[1mindex 98efa84..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/082-body-filter.t[m
[1m+++ /dev/null[m
[36m@@ -1,839 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 11);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: read chunks (inline)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo -n hello world;[m
[31m-        echo -n hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            print("chunk: [", chunk, "], eof: ", eof)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body chop[m
[31m-hello worldhiya globe[m
[31m---- error_log[m
[31m-chunk: [hello world], eof: false[m
[31m-chunk: [hiya globe], eof: false[m
[31m-chunk: [], eof: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read chunks (file)[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo -n hello world;[m
[31m-        echo -n hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-print("chunk: [", chunk, "], eof: ", eof)[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body chop[m
[31m-hello worldhiya globe[m
[31m---- error_log[m
[31m-chunk: [hello world], eof: false[m
[31m-chunk: [hiya globe], eof: false[m
[31m-chunk: [], eof: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: read chunks (user module)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m---- config[m
[31m-    location /read {[m
[31m-        echo -n hello world;[m
[31m-        echo -n hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local foo = require "foo"[m
[31m-            foo.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    -- ngx.say("Hello")[m
[31m-    local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-    print("chunk: [", chunk, "], eof: ", eof)[m
[31m-end[m
[31m---- request[m
[31m-GET /read[m
[31m---- response_body chop[m
[31m-hello worldhiya globe[m
[31m---- error_log[m
[31m-chunk: [hello world], eof: false[m
[31m-chunk: [hiya globe], eof: false[m
[31m-chunk: [], eof: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rewrite chunks (upper all)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = string.upper(ngx.arg[1])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-HELLO WORLD[m
[31m-HIYA GLOBE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: rewrite chunks (truncate data)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk = ngx.arg[1][m
[31m-            if string.match(chunk, "hello") then[m
[31m-                ngx.arg[1] = string.upper(chunk)[m
[31m-                ngx.arg[2] = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-HELLO WORLD[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set eof back and forth[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk = ngx.arg[1][m
[31m-            if string.match(chunk, "hello") then[m
[31m-                ngx.arg[1] = string.upper(chunk)[m
[31m-                ngx.arg[2] = true[m
[31m-                ngx.arg[2] = false[m
[31m-                ngx.arg[2] = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-            ngx.arg[2] = true[m
[31m-            ngx.arg[2] = false[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-HELLO WORLD[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set eof to original[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            ngx.arg[2] = eof[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m-hiya globe[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set eof to original[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            ngx.arg[2] = eof[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m-hiya globe[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: fully buffered output (string scalar)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            local buf = ngx.ctx.buf[m
[31m-[m
[31m-            if eof then[m
[31m-                if buf then[m
[31m-                    ngx.arg[1] = "[" .. buf .. chunk .. "]"[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if buf then[m
[31m-                ngx.ctx.buf = buf .. chunk[m
[31m-            else[m
[31m-                ngx.ctx.buf = chunk[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chop[m
[31m-[hello world[m
[31m-hiya globe[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: fully buffered output (string table)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            local buf = ngx.ctx.buf[m
[31m-[m
[31m-            if eof then[m
[31m-                if buf then[m
[31m-                    ngx.arg[1] = {"[", buf, chunk, "]"}[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if buf then[m
[31m-                ngx.ctx.buf = {buf, chunk}[m
[31m-            else[m
[31m-                ngx.ctx.buf = chunk[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chop[m
[31m-[hello world[m
[31m-hiya globe[m
[31m-][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abort via user error (string)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo_flush;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            if eof then[m
[31m-                error("something bad happened!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to run body_filter_by_lua*: body_filter_by_lua:4: something bad happened![m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: abort via user error (nil)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo_flush;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            if eof then[m
[31m-                error(nil)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to run body_filter_by_lua*: unknown reason[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: abort via return NGX_ERROR[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo_flush;[m
[31m-        echo hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            if eof then[m
[31m-                return ngx.ERROR[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: using body_filter_by_lua and header_filter_by_lua at the same time[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header.content_length = 12[m
[31m-            ngx.say("Hello World")[m
[31m-        ';[m
[31m-[m
[31m-        header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = ngx.arg[1] .. "aaa"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chop[m
[31m-Hello World[m
[31m-aaaaaa[m
[31m---- response_headers[m
[31m-!content-length[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: table arguments to ngx.arg[1] (github issue #54)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo -n hello;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            if ngx.arg[1] ~= "" then[m
[31m-                ngx.arg[1] = {{ngx.arg[1]}, "!", "\\n"}[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: fully buffered output (string scalar, buffering to disk by ngx_proxy)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/stub;[m
[31m-        proxy_buffers 2 256;[m
[31m-        proxy_busy_buffers_size 256;[m
[31m-        proxy_buffer_size 256;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            local buf = ngx.ctx.buf[m
[31m-[m
[31m-            if eof then[m
[31m-                if buf then[m
[31m-                    ngx.arg[1] = "[" .. buf .. chunk .. "]"[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if buf then[m
[31m-                ngx.ctx.buf = buf .. chunk[m
[31m-            else[m
[31m-                ngx.ctx.buf = chunk[m
[31m-            end[m
[31m-[m
[31m-            ngx.arg[1] = nil[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /stub {[m
[31m-        echo_duplicate 512 "a";[m
[31m-        echo_duplicate 512 "b";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"[" . ("a" x 512) . ("b" x 512) . "]";[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: backtrace[m
[31m---- config[m
[31m-    location /t {[m
[31m-        body_filter_by_lua '[m
[31m-            function foo()[m
[31m-                bar()[m
[31m-            end[m
[31m-[m
[31m-            function bar()[m
[31m-                error("something bad happened")[m
[31m-            end[m
[31m-[m
[31m-            foo()[m
[31m-        ';[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-something bad happened[m
[31m-stack traceback:[m
[31m-in function 'error'[m
[31m-in function 'bar'[m
[31m-in function 'foo'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: setting "eof" in subrequests[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_location /read;[m
[31m-        echo_location /read;[m
[31m-    }[m
[31m-[m
[31m-    location /read {[m
[31m-        echo -n hello world;[m
[31m-        echo -n hiya globe;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[2] = 1[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chop[m
[31m-hello worldhello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: Lua file does not exist[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        body_filter_by_lua_file html/test2.lua;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-v = ngx.var["request_uri"][m
[31m-ngx.print("request_uri: ", v, "\n")[m
[31m---- request[m
[31m-GET /lua?a=1&b=2[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/failed to load external Lua file ".*?test2\.lua": cannot open .*? No such file or directory/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: overwrite eof[m
[31m---- config[m
[31m-    location /read {[m
[31m-        return 200 "hello world";[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            local chunk, eof = ngx.arg[1], ngx.arg[2][m
[31m-            if eof then[m
[31m-                ngx.arg[2] = false[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/read")[m
[31m-            ngx.say("truncated: ", res.truncated)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-truncated: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: zero-size bufs[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = ""[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: body filter + ngx.say() (github issue #386)[m
[31m---- config[m
[31m-    postpone_output 1;[m
[31m-    location = /t {[m
[31m-        header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            -- do return end[m
[31m-            if not ngx.ctx.chunks then[m
[31m-                ngx.ctx.chunks = {}[m
[31m-            end[m
[31m-[m
[31m-            table.insert(ngx.ctx.chunks, ngx.arg[1])[m
[31m-            print("got chunk ", ngx.arg[1])[m
[31m-            ngx.arg[1] = nil[m
[31m-[m
[31m-            if ngx.arg[2] then[m
[31m-                print("seen eof: ", string.upper(table.concat(ngx.ctx.chunks)))[m
[31m-                ngx.arg[1] = string.upper(table.concat(ngx.ctx.chunks))[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 10 do[m
[31m-                assert(ngx.say("hello world"))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"HELLO WORLD\n" x 10[m
[31m-[m
[31m---- stap2[m
[31m-global active = 1[m
[31m-F(ngx_http_lua_body_filter_by_chunk) {[m
[31m-    printf("body filter by lua: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_write_filter) {[m
[31m-    printf("write filter: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_output_chain) {[m
[31m-    #printf("ctx->in: %s\n", ngx_chain_dump($ctx->in))[m
[31m-    #printf("ctx->busy: %s\n", ngx_chain_dump($ctx->busy))[m
[31m-    printf("output chain %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_linux_sendfile_chain) {[m
[31m-    printf("linux sendfile chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-F(ngx_chain_writer) {[m
[31m-    printf("chain writer ctx out: %p\n", $data)[m
[31m-    printf("nginx chain writer: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-probe syscall.writev {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf("writev(%s)", ngx_iovec_dump($vec, $vlen))[m
[31m-        /*[m
[31m-        for (i = 0; i < $vlen; i++) {[m
[31m-            printf(" %p [%s]", $vec[i]->iov_base, text_str(user_string_n($vec[i]->iov_base, $vec[i]->iov_len)))[m
[31m-        }[m
[31m-        */[m
[31m-    }[m
[31m-}[m
[31m-probe syscall.writev.return {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf(" = %s\n", retstr)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: body filter + ngx.say() (github issue #386), with flush[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            -- do return end[m
[31m-            if not ngx.ctx.chunks then[m
[31m-                ngx.ctx.chunks = {}[m
[31m-            end[m
[31m-[m
[31m-            table.insert(ngx.ctx.chunks, ngx.arg[1])[m
[31m-            print("got chunk ", ngx.arg[1])[m
[31m-            ngx.arg[1] = nil[m
[31m-[m
[31m-            if ngx.arg[2] then[m
[31m-                print("seen eof: ", string.upper(table.concat(ngx.ctx.chunks)))[m
[31m-                ngx.arg[1] = string.upper(table.concat(ngx.ctx.chunks))[m
[31m-            end[m
[31m-        ';[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            for i = 1, 10 do[m
[31m-                assert(ngx.say("hello world"))[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"HELLO WORLD\n" x 10[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_write_filter) {[m
[31m-    for (cl = $in; cl; cl = @cast(cl, "ngx_chain_t")->next) {[m
[31m-        if (@cast(cl, "ngx_chain_t")->buf->flush) {[m
[31m-            printf("seen flush buf.\n")[m
[31m-        }[m
[31m-[m
[31m-        if (@cast(cl, "ngx_chain_t")->buf->last_buf) {[m
[31m-            printf("seen last buf.\n")[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out_like eval[m
[31m-qr/^(?:seen flush buf\.[m
[31m-){10,}seen last buf\.[m
[31m-$/[m
[31m-[m
[31m---- stap2[m
[31m-global active = 1[m
[31m-F(ngx_http_lua_body_filter_by_chunk) {[m
[31m-    printf("body filter by lua: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_write_filter) {[m
[31m-    printf("write filter: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_charset_body_filter) {[m
[31m-    printf("charset body filter: %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_output_chain) {[m
[31m-    #printf("ctx->in: %s\n", ngx_chain_dump($ctx->in))[m
[31m-    #printf("ctx->busy: %s\n", ngx_chain_dump($ctx->busy))[m
[31m-    printf("output chain %p: %s\n", $in, ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_linux_sendfile_chain) {[m
[31m-    printf("linux sendfile chain: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-F(ngx_chain_writer) {[m
[31m-    printf("chain writer ctx out: %p\n", $data)[m
[31m-    printf("nginx chain writer: %s\n", ngx_chain_dump($in))[m
[31m-}[m
[31m-[m
[31m-probe syscall.writev {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf("writev(%s)", ngx_iovec_dump($vec, $vlen))[m
[31m-        /*[m
[31m-        for (i = 0; i < $vlen; i++) {[m
[31m-            printf(" %p [%s]", $vec[i]->iov_base, text_str(user_string_n($vec[i]->iov_base, $vec[i]->iov_len)))[m
[31m-        }[m
[31m-        */[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-probe syscall.writev.return {[m
[31m-    if (active && pid() == target()) {[m
[31m-        printf(" = %s\n", retstr)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap_out2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: clear ngx.arg[1] and then read it[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = nil[m
[31m-            local data = ngx.arg[1][m
[31m-            print([[data chunk: "]], data, [["]])[m
[31m-[m
[31m-            ngx.arg[1] = ""[m
[31m-            data = ngx.arg[1][m
[31m-            print([[data chunk 2: "]], data, [["]])[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/data chunk(?: \d+)?: [^,]+/[m
[31m---- grep_error_log_out[m
[31m-data chunk: ""[m
[31m-data chunk 2: ""[m
[31m-data chunk: ""[m
[31m-data chunk 2: ""[m
[31m-data chunk: ""[m
[31m-data chunk 2: ""[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: clear ngx.arg[1] and then read ngx.arg[2][m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello;[m
[31m-        echo world;[m
[31m-[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = nil[m
[31m-            local eof = ngx.arg[2][m
[31m-            print([[eof: ]], eof)[m
[31m-[m
[31m-            ngx.arg[1] = ""[m
[31m-            eof = ngx.arg[2][m
[31m-            print([[eof 2: ]], eof)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- log_level: info[m
[31m---- grep_error_log eval: qr/eof(?: \d+)?: [^,]+/[m
[31m---- grep_error_log_out[m
[31m-eof: false[m
[31m-eof 2: false[m
[31m-eof: false[m
[31m-eof 2: false[m
[31m-eof: true[m
[31m-eof 2: true[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: no ngx.print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-        body_filter_by_lua "ngx.print(32) return 1";[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of body_filter_by_lua*[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/083-bad-sock-self.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/083-bad-sock-self.t[m
[1mdeleted file mode 100644[m
[1mindex b93849f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/083-bad-sock-self.t[m
[1m+++ /dev/null[m
[36m@@ -1,139 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-#$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: receive[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            sock.receive("l")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    POST /t[m
[31m---- more_headers: Content-Length: 1024[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'receive' (table expected, got string)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: receiveuntil[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket()[m
[31m-            sock.receiveuntil(32, "ab")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    POST /t[m
[31m---- more_headers: Content-Length: 1024[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'receiveuntil' (table expected, got number)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: send (bad arg number)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.send("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-expecting 2 arguments (including the object), but got 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: send (bad self)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.send("hello", 32)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'send' (table expected, got string)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: getreusedtimes (bad self)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.getreusedtimes(2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'getreusedtimes' (table expected, got number)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: close (bad self)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.close(2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'close' (table expected, got number)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: setkeepalive (bad self)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            sock.setkeepalive(2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-bad argument #1 to 'setkeepalive' (table expected, got number)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/084-inclusive-receiveuntil.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/084-inclusive-receiveuntil.t[m
[1mdeleted file mode 100644[m
[1mindex c966015..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/084-inclusive-receiveuntil.t[m
[1m+++ /dev/null[m
[36m@@ -1,746 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#log_level 'warn';[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ambiguous boundary patterns (abcabd) - inclusive mode[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabd", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcabdabcabd;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabcabd[m
[31m-read: abcabd[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ambiguous boundary patterns (abcabdabcabe 4) - inclusive mode[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabdabcabe", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo ababcabdabcabe;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: ababcabdabcabe[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ambiguous boundary patterns (abcabd) - inclusive mode - small buffers[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_buffer_size 1;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("abcabd", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcabdabcabd;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabcabd[m
[31m-read: abcabd[m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: inclusive option value nil[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = nil })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabc[m
[31m-failed to read a line: closed [d[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: inclusive option value false[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = false })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabc[m
[31m-failed to read a line: closed [d[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: inclusive option value true (aa)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: abcabcaa[m
[31m-failed to read a line: closed [d[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: bad inclusive option value type[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = "true" })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad "inclusive" option value type: string[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: bad option table[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("aa", { inclusive = "true" })[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                line, err, part = reader()[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo abcabcaad;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad "inclusive" option value type: string[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ambiguous boundary patterns (--abc), small buffer[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a line: ", err, " [", part, "]")[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read: o, w[m
[31m-read: orld[m
[31m-read:  --[m
[31m-read: --abc[m
[31m-failed to read a line: nil [nil][m
[31m-failed to read a line: closed [[m
[31m-][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ambiguous boundary patterns (--abc), small buffer, mixed by other reading calls[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        lua_socket_buffer_size 1;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- collectgarbage("collect")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            local read_headers = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local headers, err, part = read_headers()[m
[31m-            if not headers then[m
[31m-                ngx.say("failed to read headers: ", err, " [", part, "]")[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("--abc", { inclusive = true })[m
[31m-[m
[31m-            for i = 1, 7 do[m
[31m-                line, err, part = reader(4)[m
[31m-                if line then[m
[31m-                    ngx.say("read: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to read a chunk: ", err, " [", part, "]")[m
[31m-                end[m
[31m-[m
[31m-                local data, err, part = sock:receive(1)[m
[31m-                if not data then[m
[31m-                    ngx.say("failed to read a byte: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                else[m
[31m-                    ngx.say("read one byte: ", data)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo "hello, world ----abc";[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{connected: 1[m
[31m-request sent: 57[m
[31m-read: hell[m
[31m-read one byte: o[m
[31m-read: , wo[m
[31m-read one byte: r[m
[31m-read: ld -[m
[31m-read one byte: -[m
[31m-read: --abc[m
[31m-read one byte: [m
[31m-[m
[31m-failed to read a chunk: nil [nil][m
[31m-failed to read a byte: closed [][m
[31m-close: 1 nil[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/085-if.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/085-if.t[m
[1mdeleted file mode 100644[m
[1mindex e08b43c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/085-if.t[m
[1m+++ /dev/null[m
[36m@@ -1,201 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set_by_lua (if fails)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true $arg_a;[m
[31m-        if ($true) {[m
[31m-            set_by_lua $true 'return tonumber(ngx.var["true"]) + 1';[m
[31m-            break;[m
[31m-        }[m
[31m-        set $true "empty";[m
[31m-[m
[31m-        echo "[$true]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-[empty][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set_by_lua (if true)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true $arg_a;[m
[31m-        if ($true) {[m
[31m-            set_by_lua $true 'return tonumber(ngx.var["true"]) + 1';[m
[31m-            break;[m
[31m-        }[m
[31m-        set $true "blah";[m
[31m-[m
[31m-        echo "[$true]";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t?a=2[m
[31m---- response_body[m
[31m-[3][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: content_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        content_by_lua 'ngx.say("hello world")';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rewrite_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        rewrite_by_lua 'ngx.say("hello world") ngx.exit(200)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: access_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        access_by_lua 'ngx.say("hello world") ngx.exit(200)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: log_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        log_by_lua 'ngx.log(ngx.WARN, "from log by lua")';[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-from log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: header_filter_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        header_filter_by_lua 'ngx.header.Foo = "bah"';[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- response_headers[m
[31m-Foo: bah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: body_filter_by_lua inherited by location if[m
[31m---- config[m
[31m-    location /t {[m
[31m-        set $true 1;[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-[m
[31m-        body_filter_by_lua 'ngx.arg[1] = string.upper(ngx.arg[1])';[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-HELLO WORLD[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: if is evil for ngx_proxy[m
[31m-This test case requires the following patch for the nginx core:[m
[31m-http://mailman.nginx.org/pipermail/nginx-devel/2012-June/002374.html[m
[31m---- config[m
[31m-    location /proxy-pass-uri {[m
[31m-        proxy_pass http://127.0.0.1:$TEST_NGINX_SERVER_PORT/;[m
[31m-[m
[31m-        set $true 1;[m
[31m-[m
[31m-        if ($true) {[m
[31m-            # nothing[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /proxy-pass-uri[m
[31m---- response_body_like: It works![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/086-init-by.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/086-init-by.t[m
[1mdeleted file mode 100644[m
[1mindex 3a474fe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/086-init-by.t[m
[1m+++ /dev/null[m
[36m@@ -1,306 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity (inline)[m
[31m---- http_config[m
[31m-    init_by_lua 'foo = "hello, FOO"';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say(foo)';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello, FOO[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (file)[m
[31m---- http_config[m
[31m-    init_by_lua_file html/init.lua;[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua 'ngx.say(foo)';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> init.lua[m
[31m-foo = "hello, FOO"[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello, FOO[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: require[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-    init_by_lua 'require "blah"';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            blah.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.lua[m
[31m-module(..., package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("hello, blah")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello, blah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: shdict (single)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    init_by_lua '[m
[31m-        local dogs = ngx.shared.dogs[m
[31m-        dogs:set("Jim", 6)[m
[31m-        dogs:get("Jim")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            ngx.say("Jim: ", dogs:get("Jim"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Jim: 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: shdict (multi)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m-    init_by_lua '[m
[31m-        local dogs = ngx.shared.dogs[m
[31m-        dogs:set("Jim", 6)[m
[31m-        dogs:get("Jim")[m
[31m-        local cats = ngx.shared.cats[m
[31m-        cats:set("Tom", 2)[m
[31m-        dogs:get("Tom")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            ngx.say("Jim: ", dogs:get("Jim"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-Jim: 6[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: print[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m-    init_by_lua '[m
[31m-        print("log from init_by_lua")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log chop[m
[31m-log from init_by_lua[m
[31m---- grep_error_log_out eval[m
[31m-["log from init_by_lua\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.log[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m-    init_by_lua '[m
[31m-        ngx.log(ngx.NOTICE, "log from init_by_lua")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log chop[m
[31m-log from init_by_lua[m
[31m---- grep_error_log_out eval[m
[31m-["log from init_by_lua\n", ""][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: require (with shm defined)[m
[31m---- http_config[m
[31m-    lua_package_path "$prefix/html/?.lua;;";[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    init_by_lua 'require "blah"';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            blah.go()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> blah.lua[m
[31m-module(..., package.seeall)[m
[31m-[m
[31m-function go()[m
[31m-    ngx.say("hello, blah")[m
[31m-end[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello, blah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: coroutine API (inlined init_by_lua)[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        local function f()[m
[31m-            foo = 32[m
[31m-            coroutine.yield(78)[m
[31m-            bar = coroutine.status(coroutine.running())[m
[31m-        end[m
[31m-        local co = coroutine.create(f)[m
[31m-        local ok, err = coroutine.resume(co)[m
[31m-        if not ok then[m
[31m-            print("Failed to resume our co: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        baz = err[m
[31m-        coroutine.resume(co)[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-            ngx.say("bar = ", bar)[m
[31m-            ngx.say("baz = ", baz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-foo = 32[m
[31m-bar = running[m
[31m-baz = 78[m
[31m---- no_error_log[m
[31m-[error][m
[31m-Failed to resume our co: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: coroutine API (init_by_lua_file)[m
[31m---- http_config[m
[31m-    init_by_lua_file html/init.lua;[m
[31m-[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-            ngx.say("bar = ", bar)[m
[31m-            ngx.say("baz = ", baz)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- user_files[m
[31m->>> init.lua[m
[31m-local function f()[m
[31m-    foo = 32[m
[31m-    coroutine.yield(78)[m
[31m-    bar = coroutine.status(coroutine.running())[m
[31m-end[m
[31m-local co = coroutine.create(f)[m
[31m-local ok, err = coroutine.resume(co)[m
[31m-if not ok then[m
[31m-    print("Failed to resume our co: ", err)[m
[31m-    return[m
[31m-end[m
[31m-baz = err[m
[31m-coroutine.resume(co)[m
[31m-[m
[31m---- response_body[m
[31m-foo = 32[m
[31m-bar = running[m
[31m-baz = 78[m
[31m---- no_error_log[m
[31m-[error][m
[31m-Failed to resume our co: [m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: access a field in the ngx. table[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        print("INIT 1: foo = ", ngx.foo)[m
[31m-        ngx.foo = 3[m
[31m-        print("INIT 2: foo = ", ngx.foo)[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/INIT \d+: foo = \S+/[m
[31m---- grep_error_log_out eval[m
[31m-[[m
[31m-"INIT 1: foo = nil[m
[31m-INIT 2: foo = 3[m
[31m-",[m
[31m-"",[m
[31m-][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/087-udp-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/087-udp-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 79ba452..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/087-udp-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,1103 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (3 * blocks() + 13);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-log_level 'warn';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-#no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected\nreceived 12 bytes: \x{00}\x{01}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua udp socket receive buffer size: 8192[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multiple parallel queries[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            req = "\\0\\2\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.05)[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("1: received ", #data, " bytes: ", data)[m
[31m-[m
[31m-            data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("2: received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like eval[m
[31m-"^connected\n"[m
[31m-."1: received 12 bytes: "[m
[31m-."\x{00}[\1\2]\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m-."2: received 12 bytes: "[m
[31m-."\x{00}[\1\2]\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}\$"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: access a TCP interface[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected[m
[31m-failed to receive data: connection refused[m
[31m---- error_log eval[m
[31m-qr/recv\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: access conflicts of connect() on shared udp objects[m
[31m---- http_config[m
[31m-    lua_package_path '$prefix/html/?.lua;;';[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local reqs = {}[m
[31m-            for i = 1, 170 do[m
[31m-                table.insert(reqs, {"/t"})[m
[31m-            end[m
[31m-            local resps = {ngx.location.capture_multi(reqs)}[m
[31m-            for i = 1, 170 do[m
[31m-                ngx.say(resps[i].status)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-            local foo = require "foo"[m
[31m-            local udp = foo.get_udp()[m
[31m-[m
[31m-            udp:settimeout(100) -- 100 ms[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-local udp[m
[31m-[m
[31m-function get_udp()[m
[31m-    if not udp then[m
[31m-        udp = ngx.socket.udp()[m
[31m-    end[m
[31m-[m
[31m-    return udp[m
[31m-end[m
[31m-[m
[31m---- stap2[m
[31m-M(http-lua-info) {[m
[31m-    printf("udp resume: %p\n", $coctx)[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: \b500\b[m
[31m---- error_log eval[m
[31m-qr/content_by_lua\(nginx\.conf:\d+\):8: bad request/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: access conflicts of receive() on shared udp objects[m
[31m---- http_config[m
[31m-    lua_package_path '$prefix/html/?.lua;;';[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local reqs = {}[m
[31m-            for i = 1, 170 do[m
[31m-                table.insert(reqs, {"/t"})[m
[31m-            end[m
[31m-            local resps = {ngx.location.capture_multi(reqs)}[m
[31m-            for i = 1, 170 do[m
[31m-                ngx.say(resps[i].status)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-            local foo = require "foo"[m
[31m-            local udp = foo.get_udp(port)[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive data: ", err)[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-module("foo", package.seeall)[m
[31m-[m
[31m-local udp[m
[31m-[m
[31m-function get_udp(port)[m
[31m-    if not udp then[m
[31m-        udp = ngx.socket.udp()[m
[31m-[m
[31m-        udp:settimeout(100) -- 100ms[m
[31m-[m
[31m-        local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-            return ngx.exit(500)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    return udp[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like: \b500\b[m
[31m---- error_log eval[m
[31m-qr/content_by_lua\(nginx\.conf:\d+\):6: bad request/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: connect again immediately[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local ok, err = sock:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            ok, err = sock:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected again: ", ok)[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = sock:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("request sent: ", ok)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected: 1[m
[31m-connected again: 1[m
[31m-request sent: 1[m
[31m-received: \0\1\0\0\0\1\0\0OK\r\n[m
[31m-close: 1 nil[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-["lua reuse socket upstream", "lua udp socket reconnect without shutting down"][m
[31m---- log_level: debug[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: recv timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local port = ngx.var.port[m
[31m-[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            sock:settimeout(100) -- 100 ms[m
[31m-[m
[31m-            local ok, err = sock:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-            end[m
[31m-[m
[31m-            -- ok, err = sock:close()[m
[31m-            -- ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo foo;[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: timeout[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: with an explicit receive buffer size argument[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive(1400)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"connected\nreceived 12 bytes: \x{00}\x{01}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua udp socket receive buffer size: 1400[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: read timeout and re-receive[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local udp = ngx.socket.udp()[m
[31m-            udp:settimeout(30)[m
[31m-            local ok, err = udp:setpeername("127.0.0.1", 19232)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to setpeername: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = udp:send("blah")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            for i = 1, 2 do[m
[31m-                local data, err = udp:receive()[m
[31m-                if err == "timeout" then[m
[31m-                    -- continue[m
[31m-                else[m
[31m-                    if not data then[m
[31m-                        ngx.say("failed to receive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    ngx.say("received: ", data)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("timed out")[m
[31m-        ';[m
[31m-    }[m
[31m---- udp_listen: 19232[m
[31m---- udp_reply: hello world[m
[31m---- udp_reply_delay: 45ms[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-received: hello world[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: access the google DNS server (using IP addr)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            udp:settimeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("$TEST_NGINX_RESOLVER", 53)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "\\0}\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\3www\\6google\\3com\\0\\0\\1\\0\\1"[m
[31m-[m
[31m-            -- ngx.print(req)[m
[31m-            -- do return end[m
[31m-[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if string.match(data, "\\3www\\6google\\3com") then[m
[31m-                ngx.say("received a good response.")[m
[31m-            else[m
[31m-                ngx.say("received a bad response: ", #data, " bytes: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-received a good response.[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua udp socket receive buffer size: 8192[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: access the google DNS server (using domain names)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER ipv6=off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            -- avoid flushing google in "check leak" testing mode:[m
[31m-            local counter = package.loaded.counter[m
[31m-            if not counter then[m
[31m-                counter = 1[m
[31m-            elseif counter >= 2 then[m
[31m-                return ngx.exit(503)[m
[31m-            else[m
[31m-                counter = counter + 1[m
[31m-            end[m
[31m-            package.loaded.counter = counter[m
[31m-[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            udp:settimeout(2000) -- 2 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("google-public-dns-a.google.com", 53)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "\\0}\\1\\0\\0\\1\\0\\0\\0\\0\\0\\0\\3www\\6google\\3com\\0\\0\\1\\0\\1"[m
[31m-[m
[31m-            -- ngx.print(req)[m
[31m-            -- do return end[m
[31m-[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if string.match(data, "\\3www\\6google\\3com") then[m
[31m-                ngx.say("received a good response.")[m
[31m-            else[m
[31m-                ngx.say("received a bad response: ", #data, " bytes: ", data)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-received a good response.[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua udp socket receive buffer size: 8192[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: github issue #215: Handle the posted requests in lua cosocket api (failed to resolve)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-[m
[31m-    location = /sub {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("xxx", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect to xxx: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("successfully connected to xxx!")[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /sub[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_resolve_name_done) {[m
[31m-    println("resolve name done")[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-resolve name done[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^failed to connect to xxx: xxx could not be resolved.*?Host not found[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: github issue #215: Handle the posted requests in lua cosocket api (successfully resolved)[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-    location = /sub {[m
[31m-        content_by_lua '[m
[31m-            if not package.i then[m
[31m-                package.i = 1[m
[31m-            end[m
[31m-[m
[31m-            local servers = {"openresty.org", "agentzh.org", "sregex.org"}[m
[31m-            local server = servers[package.i][m
[31m-            package.i = package.i + 1[m
[31m-[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername(server, 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect to ", server, ": ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("successfully connected to xxx!")[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/sub")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to xxx![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: datagram unix domain socket[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-        #set $port 1234;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local socket = ngx.socket[m
[31m-            -- local socket = require "socket"[m
[31m-[m
[31m-            local udp = socket.udp()[m
[31m-[m
[31m-            local port = ngx.var.port[m
[31m-            udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-            local ok, err = udp:setpeername("unix:a.sock")[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected")[m
[31m-[m
[31m-            local req = "hello,\\nserver"[m
[31m-            local ok, err = udp:send(req)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = udp:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive data: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.print("received ", #data, " bytes: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- udp_listen: a.sock[m
[31m---- udp_reply[m
[31m-hello,[m
[31m-client[m
[31m-[m
[31m---- response_body[m
[31m-connected[m
[31m-received 14 bytes: hello,[m
[31m-client[m
[31m-[m
[31m---- stap2[m
[31m-probe syscall.socket, syscall.connect {[m
[31m-    print(name, "(", argstr, ")")[m
[31m-}[m
[31m-[m
[31m-probe syscall.socket.return, syscall.connect.return {[m
[31m-    println(" = ", retstr)[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[crit][m
[31m---- skip_eval: 3: $^O ne 'linux'[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: bad request tries to setpeer[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: bad request tries to send[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:send("a")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: bad request tries to receive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:receive()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: bad request tries to close[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:send("a")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: bad request tries to receive[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /main {[m
[31m-        echo_location /t?reset=1;[m
[31m-        echo_location /t;[m
[31m-    }[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local test = require "test"[m
[31m-            if ngx.var.arg_reset then[m
[31m-                local sock = test.new_sock()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", ngx.var.port)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set peer: ", err)[m
[31m-                else[m
[31m-                    ngx.say("peer set")[m
[31m-                end[m
[31m-                return[m
[31m-            end[m
[31m-            local sock = test.get_sock()[m
[31m-            sock:close()[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local sock[m
[31m-[m
[31m-function new_sock()[m
[31m-    sock = ngx.socket.udp()[m
[31m-    return sock[m
[31m-end[m
[31m-[m
[31m-function get_sock()[m
[31m-    return sock[m
[31m-end[m
[31m---- request[m
[31m-GET /main[m
[31m---- response_body_like eval[m
[31m-qr/^peer set[m
[31m-<html.*?500 Internal Server Error/ms[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/runtime error: content_by_lua\(nginx\.conf:\d+\):14: bad request/[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/088-req-method.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/088-req-method.t[m
[1mdeleted file mode 100644[m
[1mindex 9ced40c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/088-req-method.t[m
[1m+++ /dev/null[m
[36m@@ -1,265 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get method name in main request[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("method: [", ngx.req.get_method(), "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-method: [GET][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get method name in subrequest[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_subrequest POST /sub;[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("method: [", ngx.req.get_method(), "]")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-method: [POST][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set GET to POST[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_POST)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-POST[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set POST to GET[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_GET)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set POST to DELETE[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_DELETE)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-DELETE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set POST to PUT[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_PUT)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-PUT[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set POST to PUT (using $requeset_method)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_PUT)[m
[31m-        ';[m
[31m-[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body[m
[31m-PUT[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: set GET to HEAD[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_HEAD)[m
[31m-        ';[m
[31m-[m
[31m-        proxy_pass http://127.0.0.1:$server_port/echo;[m
[31m-        #proxy_pass http://127.0.0.1:8888/;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo $request_method;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set method name in subrequest[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo_subrequest POST /sub;[m
[31m-        echo "main: $echo_request_method";[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_PUT)[m
[31m-            ngx.say("sub: ", ngx.var.echo_request_method)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-sub: PUT[m
[31m-main: GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set HEAD to GET[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_method(ngx.HTTP_GET)[m
[31m-        ';[m
[31m-[m
[31m-        echo "method: $echo_request_method";[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /t[m
[31m---- response_body[m
[31m-method: GET[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set GET to WebDAV methods[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local methods = {[m
[31m-                ngx.HTTP_MKCOL,[m
[31m-                ngx.HTTP_COPY,[m
[31m-                ngx.HTTP_MOVE,[m
[31m-                ngx.HTTP_PROPFIND,[m
[31m-                ngx.HTTP_PROPPATCH,[m
[31m-                ngx.HTTP_LOCK,[m
[31m-                ngx.HTTP_UNLOCK,[m
[31m-                ngx.HTTP_PATCH,[m
[31m-                ngx.HTTP_TRACE,[m
[31m-            }[m
[31m-[m
[31m-            for i, method in ipairs(methods) do[m
[31m-                ngx.req.set_method(method)[m
[31m-                ngx.say("method: ", ngx.var.echo_request_method)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    HEAD /t[m
[31m---- response_body[m
[31m-method: MKCOL[m
[31m-method: COPY[m
[31m-method: MOVE[m
[31m-method: PROPFIND[m
[31m-method: PROPPATCH[m
[31m-method: LOCK[m
[31m-method: UNLOCK[m
[31m-method: PATCH[m
[31m-method: TRACE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/089-phase.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/089-phase.t[m
[1mdeleted file mode 100644[m
[1mindex 57921fc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/089-phase.t[m
[1m+++ /dev/null[m
[36m@@ -1,179 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get_phase in init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua 'phase = ngx.get_phase()';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(phase)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-init[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get_phase in set_by_lua[m
[31m---- config[m
[31m-    set_by_lua $phase 'return ngx.get_phase()';[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.var.phase)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-set[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get_phase in rewrite_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.say(ngx.get_phase())[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-rewrite[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: get_phase in access_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        access_by_lua '[m
[31m-            ngx.say(ngx.get_phase())[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-access[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get_phase in content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.get_phase())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-content[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: get_phase in header_filter_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo "OK";[m
[31m-        header_filter_by_lua '[m
[31m-            ngx.header.Phase = ngx.get_phase()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_header[m
[31m-Phase: header_filter[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get_phase in body_filter_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-        body_filter_by_lua '[m
[31m-            ngx.arg[1] = ngx.get_phase()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body chop[m
[31m-body_filter[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: get_phase in log_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo "OK";[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.ERR, ngx.get_phase())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_log[m
[31m-log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get_phase in ngx.timer callback[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo "OK";[m
[31m-        log_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.log(ngx.WARN, "current phase: ", ngx.get_phase())[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to add timer: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-current phase: timer[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: get_phase in init_worker_by_lua[m
[31m---- http_config[m
[31m-    init_worker_by_lua 'phase = ngx.get_phase()';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(phase)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-init_worker[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/090-log-socket-errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/090-log-socket-errors.t[m
[1mdeleted file mode 100644[m
[1mindex a5943c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/090-log-socket-errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,99 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: log socket errors off (tcp)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_connect_timeout 1ms;[m
[31m-        lua_socket_log_errors off;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("8.8.8.8", 80)[m
[31m-            ngx.say(err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timeout[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: log socket errors on (tcp)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_connect_timeout 1ms;[m
[31m-        lua_socket_log_errors on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("8.8.8.8", 80)[m
[31m-            ngx.say(err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timeout[m
[31m---- error_log[m
[31m-lua tcp socket connect timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: log socket errors on (udp)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_log_errors on;[m
[31m-        lua_socket_read_timeout 1ms;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 80)[m
[31m-            ok, err = sock:receive()[m
[31m-            ngx.say(err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timeout[m
[31m---- error_log[m
[31m-lua udp socket read timed out[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: log socket errors off (udp)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_socket_log_errors off;[m
[31m-        lua_socket_read_timeout 1ms;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 80)[m
[31m-            ok, err = sock:receive()[m
[31m-            ngx.say(err)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timeout[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/091-coroutine.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/091-coroutine.t[m
[1mdeleted file mode 100644[m
[1mindex b047ccb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/091-coroutine.t[m
[1m+++ /dev/null[m
[36m@@ -1,1318 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-our $StapScript = <<'_EOC_';[m
[31m-global ids, cur[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    delete ids[m
[31m-    cur = 0[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    id = gen_id($ctx->cur_co)[m
[31m-    printf("run thread %d\n", id)[m
[31m-}[m
[31m-[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("lua resume %d\n", id)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-resume) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("resume %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-thread-yield) {[m
[31m-    println("thread yield")[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_coroutine_yield) {[m
[31m-    printf("yield %x\n", gen_id($L))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-yield) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("yield %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_atpanic) {[m
[31m-    printf("lua atpanic(%d):", gen_id($L))[m
[31m-    print_ubacktrace();[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exec) { println("exec") }[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) { println("exit") }[m
[31m-F(ngx_http_lua_ffi_exit) { println("exit") }[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: basic coroutine print[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    ngx.say("Hello, ", cnt)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i=1,3 do[m
[31m-                cr(c)[m
[31m-                ngx.say("***")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-Hello, 0[m
[31m-***[m
[31m-Hello, 1[m
[31m-***[m
[31m-Hello, 2[m
[31m-***[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: basic coroutine2[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f(fid)[m
[31m-                local cnt = 0[m
[31m-                while true do[m
[31m-                    ngx.say("cc", fid, ": ", cnt)[m
[31m-                    coroutine.yield()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local ccs = {}[m
[31m-            for i=1,3 do[m
[31m-                ccs[#ccs+1] = coroutine.create(function() f(i) end)[m
[31m-            end[m
[31m-[m
[31m-            for i=1,9 do[m
[31m-                local cc = table.remove(ccs, 1)[m
[31m-                coroutine.resume(cc)[m
[31m-                ccs[#ccs+1] = cc[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-cc1: 0[m
[31m-cc2: 0[m
[31m-cc3: 0[m
[31m-cc1: 1[m
[31m-cc2: 1[m
[31m-cc3: 1[m
[31m-cc1: 2[m
[31m-cc2: 2[m
[31m-cc3: 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: basic coroutine and cosocket[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function worker(url)[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect(url, 80)[m
[31m-                coroutine.yield()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect to: ", url, " error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("successfully connected to: ", url)[m
[31m-                sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local urls = {[m
[31m-                "agentzh.org",[m
[31m-                "iscribblet.org",[m
[31m-                "openresty.org"[m
[31m-            }[m
[31m-[m
[31m-            local ccs = {}[m
[31m-            for i, url in ipairs(urls) do[m
[31m-                local cc = coroutine.create(function() worker(url) end)[m
[31m-                ccs[#ccs+1] = cc[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                if #ccs == 0 then break end[m
[31m-                local cc = table.remove(ccs, 1)[m
[31m-                local ok = coroutine.resume(cc)[m
[31m-                if ok then[m
[31m-                    ccs[#ccs+1] = cc[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("*** All Done ***")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to: agentzh.org[m
[31m-successfully connected to: iscribblet.org[m
[31m-successfully connected to: openresty.org[m
[31m-*** All Done ***[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: coroutine.wrap(generate prime numbers)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- generate all the numbers from 2 to n[m
[31m-            function gen (n)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                for i=2,n do coroutine.yield(i) end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            -- filter the numbers generated by g, removing multiples of p[m
[31m-            function filter (p, g)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                while 1 do[m
[31m-                  local n = g()[m
[31m-                  if n == nil then return end[m
[31m-                  if math.fmod(n, p) ~= 0 then coroutine.yield(n) end[m
[31m-                end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            N = 10[m
[31m-            x = gen(N)		-- generate primes up to N[m
[31m-            while 1 do[m
[31m-              local n = x()		-- pick a number until done[m
[31m-              if n == nil then break end[m
[31m-              ngx.say(n)		-- must be a prime number[m
[31m-              x = filter(n, x)	-- now remove its multiples[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m-3[m
[31m-5[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: coroutine.wrap(generate prime numbers,reset create and resume)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            coroutine.create = nil[m
[31m-            coroutine.resume = nil[m
[31m-            -- generate all the numbers from 2 to n[m
[31m-            function gen (n)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                for i=2,n do coroutine.yield(i) end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            -- filter the numbers generated by g, removing multiples of p[m
[31m-            function filter (p, g)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                while 1 do[m
[31m-                  local n = g()[m
[31m-                  if n == nil then return end[m
[31m-                  if math.fmod(n, p) ~= 0 then coroutine.yield(n) end[m
[31m-                end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            N = 10 [m
[31m-            x = gen(N)		-- generate primes up to N[m
[31m-            while 1 do[m
[31m-              local n = x()		-- pick a number until done[m
[31m-              if n == nil then break end[m
[31m-              ngx.say(n)		-- must be a prime number[m
[31m-              x = filter(n, x)	-- now remove its multiples[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m-3[m
[31m-5[m
[31m-7[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: coroutine.wrap(generate fib)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function generatefib (n)[m
[31m-              return coroutine.wrap(function ()[m
[31m-                local a,b = 1, 1[m
[31m-                while a <= n do[m
[31m-                  coroutine.yield(a)[m
[31m-                  a, b = b, a+b[m
[31m-                end[m
[31m-              end)[m
[31m-            end[m
[31m-[m
[31m-            -- In lua, because OP_TFORLOOP uses luaD_call to execute the iterator function,[m
[31m-            -- and luaD_call is a C function, so we can not yield in the iterator function.[m
[31m-            -- So the following case(using for loop) will be failed.[m
[31m-            -- Luajit is OK.[m
[31m-            if package.loaded["jit"] then[m
[31m-                for i in generatefib(1000) do ngx.say(i) end[m
[31m-            else[m
[31m-                local gen = generatefib(1000)[m
[31m-                while true do[m
[31m-                    local i = gen()[m
[31m-                    if not i then break end[m
[31m-                    ngx.say(i)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1[m
[31m-1[m
[31m-2[m
[31m-3[m
[31m-5[m
[31m-8[m
[31m-13[m
[31m-21[m
[31m-34[m
[31m-55[m
[31m-89[m
[31m-144[m
[31m-233[m
[31m-377[m
[31m-610[m
[31m-987[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: coroutine wrap and cosocket[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function worker(url)[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect(url, 80)[m
[31m-                coroutine.yield()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect to: ", url, " error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("successfully connected to: ", url)[m
[31m-                sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local urls = {[m
[31m-                "agentzh.org",[m
[31m-                "iscribblet.org",[m
[31m-                "openresty.org"[m
[31m-            }[m
[31m-[m
[31m-            local cfs = {}[m
[31m-            for i, url in ipairs(urls) do[m
[31m-                local cf = coroutine.wrap(function() worker(url) end)[m
[31m-                cfs[#cfs+1] = cf[m
[31m-            end[m
[31m-[m
[31m-            for i=1,3 do cfs[i]() end[m
[31m-            for i=1,3 do cfs[i]() end[m
[31m-            for i=1,3 do cfs[i]() end[m
[31m-[m
[31m-            ngx.say("*** All Done ***")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to: agentzh.org[m
[31m-successfully connected to: iscribblet.org[m
[31m-successfully connected to: openresty.org[m
[31m-*** All Done ***[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: coroutine status, running[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-            local st, rn = coroutine.status, coroutine.running[m
[31m-[m
[31m-            function f(self)[m
[31m-                local cnt = 0[m
[31m-                if rn() ~= self then ngx.say("error"); return end[m
[31m-                ngx.say("running: ", st(self)) --running[m
[31m-                cy()[m
[31m-                local c = cc(function(father)[m
[31m-                    ngx.say("normal: ", st(father))[m
[31m-                end) -- normal[m
[31m-                cr(c, self)[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            ngx.say("suspended: ", st(c)) -- suspended[m
[31m-            cr(c, c)[m
[31m-            ngx.say("suspended: ", st(c)) -- suspended[m
[31m-            cr(c, c)[m
[31m-            ngx.say("dead: ", st(c)) -- dead[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-suspended: suspended[m
[31m-running: running[m
[31m-suspended: suspended[m
[31m-normal: normal[m
[31m-dead: dead[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: entry coroutine yielded will be resumed immediately[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("[", {coroutine.yield()}, "]")[m
[31m-            ngx.say("[", {coroutine.yield(1, "a")}, "]")[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-[][m
[31m-[][m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: thread traceback (multi-thread)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local f = function(cr) coroutine.resume(cr) end[m
[31m-            -- emit a error[m
[31m-            local g = function() unknown.unknown = 1 end[m
[31m-            local l1 = coroutine.create(f)[m
[31m-            local l2 = coroutine.create(g)[m
[31m-            coroutine.resume(l1, l2)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- error_log eval[m
[31m-["stack traceback:", "coroutine 0:", "coroutine 1:", "coroutine 2:"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: thread traceback (only the entry thread)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- emit a error[m
[31m-            unknown.unknown = 1[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-["stack traceback:", "coroutine 0:"][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: bug: resume dead coroutine with args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function print(...)[m
[31m-                local args = {...}[m
[31m-                local is_first = true[m
[31m-                for i,v in ipairs(args) do[m
[31m-                    if is_first then[m
[31m-                        is_first = false[m
[31m-                    else[m
[31m-                        ngx.print(" ")[m
[31m-                    end[m
[31m-                    ngx.print(v)[m
[31m-                end[m
[31m-                ngx.print("\\\n")[m
[31m-            end[m
[31m-[m
[31m-            function foo (a)[m
[31m-                print("foo", a)[m
[31m-                return coroutine.yield(2*a)[m
[31m-            end[m
[31m-[m
[31m-            co = coroutine.create(function (a,b)[m
[31m-                    print("co-body", a, b)[m
[31m-                    local r = foo(a+1)[m
[31m-                    print("co-body", r)[m
[31m-                    local r, s = coroutine.yield(a+b, a-b)[m
[31m-                    print("co-body", r, s)[m
[31m-                    return b, "end"[m
[31m-                end)[m
[31m-[m
[31m-            print("main", coroutine.resume(co, 1, 10))[m
[31m-            print("main", coroutine.resume(co, "r"))[m
[31m-            print("main", coroutine.resume(co, "x", "y"))[m
[31m-            print("main", coroutine.resume(co, "x", "y"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-co-body 1 10[m
[31m-foo 2[m
[31m-main true 4[m
[31m-co-body r[m
[31m-main true 11 -9[m
[31m-co-body x y[m
[31m-main true 10 end[m
[31m-main false cannot resume dead coroutine[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: deeply nested coroutines[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local create = coroutine.create[m
[31m-            local resume = coroutine.resume[m
[31m-            local yield = coroutine.yield[m
[31m-            function f()[m
[31m-                ngx.say("f begin")[m
[31m-                yield()[m
[31m-                local c2 = create(g)[m
[31m-                ngx.say("1: resuming c2")[m
[31m-                resume(c2)[m
[31m-                ngx.say("2: resuming c2")[m
[31m-                resume(c2)[m
[31m-                yield()[m
[31m-                ngx.say("3: resuming c2")[m
[31m-                resume(c2)[m
[31m-                ngx.say("f done")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("g begin")[m
[31m-                yield()[m
[31m-                ngx.say("g going")[m
[31m-                yield()[m
[31m-                ngx.say("g done")[m
[31m-            end[m
[31m-[m
[31m-            local c1 = create(f)[m
[31m-            ngx.say("1: resuming c1")[m
[31m-            resume(c1)[m
[31m-            ngx.say("2: resuming c1")[m
[31m-            resume(c1)[m
[31m-            ngx.say("3: resuming c1")[m
[31m-            resume(c1)[m
[31m-            ngx.say("main done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1: resuming c1[m
[31m-f begin[m
[31m-2: resuming c1[m
[31m-1: resuming c2[m
[31m-g begin[m
[31m-2: resuming c2[m
[31m-g going[m
[31m-3: resuming c1[m
[31m-3: resuming c2[m
[31m-g done[m
[31m-f done[m
[31m-main done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: using ngx.exit in user coroutines[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local create = coroutine.create[m
[31m-            local resume = coroutine.resume[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            local code = 400[m
[31m-[m
[31m-            function f()[m
[31m-                local c2 = create(g)[m
[31m-                yield()[m
[31m-                code = code + 1[m
[31m-                resume(c2)[m
[31m-                yield()[m
[31m-                resume(c2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                code = code + 1[m
[31m-                yield()[m
[31m-                code = code + 1[m
[31m-                ngx.exit(code)[m
[31m-            end[m
[31m-[m
[31m-            local c1 = create(f)[m
[31m-            resume(c1)[m
[31m-            resume(c1)[m
[31m-            resume(c1)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap eval: $::StapScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-resume 2 in 1[m
[31m-create 3 in 2[m
[31m-yield 2 in 1[m
[31m-resume 2 in 1[m
[31m-resume 3 in 2[m
[31m-yield 3 in 2[m
[31m-yield 2 in 1[m
[31m-resume 2 in 1[m
[31m-resume 3 in 2[m
[31m-exit[m
[31m-[m
[31m---- response_body_like: 403 Forbidden[m
[31m---- error_code: 403[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: using ngx.exec in user coroutines[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local create = coroutine.create[m
[31m-            local resume = coroutine.resume[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            local code = 0[m
[31m-[m
[31m-            function f()[m
[31m-                local c2 = create(g)[m
[31m-                yield()[m
[31m-                code = code + 1[m
[31m-                resume(c2)[m
[31m-                yield()[m
[31m-                resume(c2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                code = code + 1[m
[31m-                yield()[m
[31m-                code = code + 1[m
[31m-                ngx.exec("/n/" .. code)[m
[31m-            end[m
[31m-[m
[31m-            local c1 = create(f)[m
[31m-            resume(c1)[m
[31m-            resume(c1)[m
[31m-            resume(c1)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/n/(\d+)' {[m
[31m-        echo "num: $1";[m
[31m-    }[m
[31m-[m
[31m---- stap eval: $::StapScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-resume 2 in 1[m
[31m-create 3 in 2[m
[31m-yield 2 in 1[m
[31m-resume 2 in 1[m
[31m-resume 3 in 2[m
[31m-yield 3 in 2[m
[31m-yield 2 in 1[m
[31m-resume 2 in 1[m
[31m-resume 3 in 2[m
[31m-exec[m
[31m-[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-num: 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: coroutine.create in header_filter_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            function f()[m
[31m-                yield()[m
[31m-            end[m
[31m-[m
[31m-            local c1 = coroutine.create(f)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-API disabled in the context of header_filter_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: resume coroutines from within another one that is not its parent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local print = ngx.say[m
[31m-[m
[31m-            local c1, c2[m
[31m-[m
[31m-            function f()[m
[31m-                print("f 1")[m
[31m-                print(coroutine.resume(c2))[m
[31m-                print("f 2")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                print("g 1")[m
[31m-                -- print(coroutine.resume(c1))[m
[31m-                print("g 2")[m
[31m-            end[m
[31m-[m
[31m-            c1 = coroutine.create(f)[m
[31m-            c2 = coroutine.create(g)[m
[31m-[m
[31m-            coroutine.resume(c1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-g 2[m
[31m-true[m
[31m-f 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: infinite recursive calls of coroutine.resume[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local print = ngx.say[m
[31m-[m
[31m-            local c1, c2[m
[31m-[m
[31m-            function f()[m
[31m-                print("f 1")[m
[31m-                print(coroutine.resume(c2))[m
[31m-                print("f 2")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                print("g 1")[m
[31m-                print(coroutine.resume(c1))[m
[31m-                print("g 2")[m
[31m-            end[m
[31m-[m
[31m-            c1 = coroutine.create(f)[m
[31m-            c2 = coroutine.create(g)[m
[31m-[m
[31m-            coroutine.resume(c1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-falsecannot resume normal coroutine[m
[31m-g 2[m
[31m-true[m
[31m-f 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: resume running (entry) coroutines[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(coroutine.status(coroutine.running()))[m
[31m-            ngx.say(coroutine.resume(coroutine.running()))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-running[m
[31m-falsecannot resume running coroutine[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: resume running (user) coroutines[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                ngx.say("f: ", coroutine.status(co))[m
[31m-                ngx.say("f: ", coroutine.resume(co))[m
[31m-            end[m
[31m-            co = coroutine.create(f)[m
[31m-            ngx.say("chunk: ", coroutine.status(co))[m
[31m-            ngx.say("chunk: ", coroutine.resume(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-chunk: suspended[m
[31m-f: running[m
[31m-f: falsecannot resume running coroutine[m
[31m-chunk: true[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: user coroutine end with errors, and the parent coroutine gets the right status[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                error("bad")[m
[31m-            end[m
[31m-            co = coroutine.create(f)[m
[31m-            ngx.say("child: resume: ", coroutine.resume(co))[m
[31m-            ngx.say("child: status: ", coroutine.status(co))[m
[31m-            ngx.say("parent: status: ", coroutine.status(coroutine.running()))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qr/^child: resume: falsecontent_by_lua\(nginx\.conf:\d+\):4: bad[m
[31m-child: status: dead[m
[31m-parent: status: running[m
[31m-$/s[m
[31m---- error_log eval[m
[31m-qr/lua coroutine: runtime error: content_by_lua\(nginx\.conf:\d+\):4: bad/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: entry coroutine is yielded by hand and still gets the right status[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local co = coroutine.running()[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-            coroutine.yield(co)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-status: running[m
[31m-status: running[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: github issue #208: coroutine as iterator doesn't work[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local say = ngx.say[m
[31m-            local wrap, yield = coroutine.wrap, coroutine.yield[m
[31m-[m
[31m-            local function it(it_state)[m
[31m-              for i = 1, it_state.i do[m
[31m-                yield(it_state.path, tostring(i))[m
[31m-              end[m
[31m-              return nil[m
[31m-            end[m
[31m-[m
[31m-            local function it_factory(path)[m
[31m-              local it_state = { i = 10, path = path }[m
[31m-              return wrap(it), it_state[m
[31m-            end[m
[31m-[m
[31m-            --[[[m
[31m-            for path, value in it_factory("test") do[m
[31m-              say(path, value)[m
[31m-            end[m
[31m-            ]][m
[31m-[m
[31m-            do[m
[31m-              local f, s, var = it_factory("test")[m
[31m-              while true do[m
[31m-                local path, value = f(s, var)[m
[31m-                var = path[m
[31m-                if var == nil then break end[m
[31m-                say(path, value)[m
[31m-              end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Cookie: abc=32[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-test1[m
[31m-test2[m
[31m-test3[m
[31m-test4[m
[31m-test5[m
[31m-test6[m
[31m-test7[m
[31m-test8[m
[31m-test9[m
[31m-test10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: init_by_lua + our own coroutines in content_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua 'return';[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function worker(url)[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect(url, 80)[m
[31m-                coroutine.yield()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect to: ", url, " error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("successfully connected to: ", url)[m
[31m-                sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local urls = {[m
[31m-                "agentzh.org",[m
[31m-            }[m
[31m-[m
[31m-            local ccs = {}[m
[31m-            for i, url in ipairs(urls) do[m
[31m-                local cc = coroutine.create(function() worker(url) end)[m
[31m-                ccs[#ccs+1] = cc[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                if #ccs == 0 then break end[m
[31m-                local cc = table.remove(ccs, 1)[m
[31m-                local ok = coroutine.resume(cc)[m
[31m-                if ok then[m
[31m-                    ccs[#ccs+1] = cc[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("*** All Done ***")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to: agentzh.org[m
[31m-*** All Done ***[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: init_by_lua_file + our own coroutines in content_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua_file html/init.lua;[m
[31m-[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function worker(url)[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect(url, 80)[m
[31m-                coroutine.yield()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect to: ", url, " error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                coroutine.yield()[m
[31m-                ngx.say("successfully connected to: ", url)[m
[31m-                sock:close()[m
[31m-            end[m
[31m-[m
[31m-            local urls = {[m
[31m-                "agentzh.org"[m
[31m-            }[m
[31m-[m
[31m-            local ccs = {}[m
[31m-            for i, url in ipairs(urls) do[m
[31m-                local cc = coroutine.create(function() worker(url) end)[m
[31m-                ccs[#ccs+1] = cc[m
[31m-            end[m
[31m-[m
[31m-            while true do[m
[31m-                if #ccs == 0 then break end[m
[31m-                local cc = table.remove(ccs, 1)[m
[31m-                local ok = coroutine.resume(cc)[m
[31m-                if ok then[m
[31m-                    ccs[#ccs+1] = cc[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("*** All Done ***")[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> init.lua[m
[31m-return[m
[31m-[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-successfully connected to: agentzh.org[m
[31m-*** All Done ***[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: mixing coroutine.* API between init_by_lua and other contexts (github #304) - init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-          co_wrap = coroutine.wrap[m
[31m-          co_yield = coroutine.yield[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location /cotest {[m
[31m-        content_by_lua '[m
[31m-            function generator()[m
[31m-                return co_wrap(function()[m
[31m-                    co_yield("data")[m
[31m-                end)[m
[31m-            end[m
[31m-[m
[31m-            local co = generator()[m
[31m-            local data = co()[m
[31m-            ngx.say(data)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /cotest[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-data[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: mixing coroutine.* API between init_by_lua and other contexts (github #304) - init_by_lua_file[m
[31m---- http_config[m
[31m-    init_by_lua_file html/init.lua;[m
[31m-[m
[31m---- config[m
[31m-    location /cotest {[m
[31m-        content_by_lua '[m
[31m-            function generator()[m
[31m-                return co_wrap(function()[m
[31m-                    co_yield("data")[m
[31m-                end)[m
[31m-            end[m
[31m-[m
[31m-            local co = generator()[m
[31m-            local data = co()[m
[31m-            ngx.say(data)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> init.lua[m
[31m-co_wrap = coroutine.wrap[m
[31m-co_yield = coroutine.yield[m
[31m-[m
[31m---- request[m
[31m-GET /cotest[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-data[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: coroutine context collicisions[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                return 3[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 10 do[m
[31m-                collectgarbage()[m
[31m-                local c = cc(f)[m
[31m-                if coroutine.status(c) == "dead" then[m
[31m-                    ngx.say("found a dead coroutine")[m
[31m-                    return[m
[31m-                end[m
[31m-                cr(c)[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: require "coroutine"[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local coroutine = require "coroutine"[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    ngx.say("Hello, ", cnt)[m
[31m-                    ngx.sleep(0.001)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i=1,3 do[m
[31m-                cr(c)[m
[31m-                ngx.say("***")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-Hello, 0[m
[31m-***[m
[31m-Hello, 1[m
[31m-***[m
[31m-Hello, 2[m
[31m-***[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: basic coroutine in header_filter_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        header_filter_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    print("co yield: ", cnt)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i = 1, 3 do[m
[31m-                print("co resume.")[m
[31m-                cr(c)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/co (?:yield: \d+|resume\.)/[m
[31m---- grep_error_log_out[m
[31m-co resume.[m
[31m-co yield: 0[m
[31m-co resume.[m
[31m-co yield: 1[m
[31m-co resume.[m
[31m-co yield: 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: basic coroutine in body_filter_by_lua[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo ok;[m
[31m-        body_filter_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    print("co yield: ", cnt)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i = 1, 3 do[m
[31m-                print("co resume.")[m
[31m-                cr(c)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/co (?:yield: \d+|resume\.)/[m
[31m---- grep_error_log_out[m
[31m-co resume.[m
[31m-co yield: 0[m
[31m-co resume.[m
[31m-co yield: 1[m
[31m-co resume.[m
[31m-co yield: 2[m
[31m-co resume.[m
[31m-co yield: 0[m
[31m-co resume.[m
[31m-co yield: 1[m
[31m-co resume.[m
[31m-co yield: 2[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/092-eof.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/092-eof.t[m
[1mdeleted file mode 100644[m
[1mindex a75711f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/092-eof.t[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 6);[m
[31m-[m
[31m-master_on();[m
[31m-workers(2);[m
[31m-no_root_location();[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: 404 parallel subrequests after ngx.eof()[m
[31m---- config[m
[31m-    location = /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(1)[m
[31m-            ngx.eof()[m
[31m-            local res1, res2 = ngx.location.capture_multi{[m
[31m-                { "/bad1" },[m
[31m-                { "/bad2" }[m
[31m-            }[m
[31m-            ngx.log(ngx.WARN, "res1: ", res1.status)[m
[31m-            ngx.log(ngx.WARN, "res2: ", res2.status)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- error_log[m
[31m-res1: 404[m
[31m-res2: 404[m
[31m-No such file or directory[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: parallel normal subrequests after ngx.eof()[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(1)[m
[31m-            ngx.eof()[m
[31m-            local r1, r2 = ngx.location.capture_multi{[m
[31m-                { "/proxy/tom" },[m
[31m-                { "/proxy/jim" }[m
[31m-            }[m
[31m-            ngx.log(ngx.WARN, r1.body)[m
[31m-            ngx.log(ngx.WARN, r2.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ '^/proxy/(\w+)' {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/hello?a=$1;[m
[31m-    }[m
[31m-[m
[31m-    location = /hello {[m
[31m-        echo_sleep 0.5;[m
[31m-        echo -n "hello, $arg_a";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m---- error_log[m
[31m-hello, tom[m
[31m-hello, jim[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/093-uthread-spawn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/093-uthread-spawn.t[m
[1mdeleted file mode 100644[m
[1mindex 772e866..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/093-uthread-spawn.t[m
[1m+++ /dev/null[m
[36m@@ -1,1675 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-worker_connections(256);[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple user thread without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: two simple user threads without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("in thread 1")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("in thread 2")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before 1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after 1")[m
[31m-[m
[31m-            ngx.say("before 2")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after 2")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before 1[m
[31m-in thread 1[m
[31m-after 1[m
[31m-before 2[m
[31m-in thread 2[m
[31m-after 2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: simple user thread with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before sleep[m
[31m-after thread create[m
[31m-after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: two simple user threads with sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("1: before sleep")[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("1: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("2: before sleep")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("2: after sleep")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("1: before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("1: after thread create")[m
[31m-[m
[31m-            ngx.say("2: before thread create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("2: after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-1: before thread create[m
[31m-1: before sleep[m
[31m-1: after thread create[m
[31m-2: before thread create[m
[31m-2: before sleep[m
[31m-2: after thread create[m
[31m-2: after sleep[m
[31m-1: after sleep[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: error in user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.blah()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-after[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):3: attempt to call field 'blah' \(a nil value\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple user threads doing a single subrequest (entry quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                res = ngx.location.capture("/proxy")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/foo;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello world;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple user threads doing a single subrequest (entry also does a subrequest and quits early)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-capture: hello bar[m
[31m-after capture: hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple user threads doing a single subrequest (entry also does a subrequest and quits late)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread create")[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before thread create[m
[31m-before capture[m
[31m-after thread create[m
[31m-after capture: hello foo[m
[31m-capture: hello bar[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: two simple user threads doing single subrequests (entry also does a subrequest and quits between)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("f: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?foo")[m
[31m-                ngx.say("f: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("g: before capture")[m
[31m-                local res = ngx.location.capture("/proxy?bah")[m
[31m-                ngx.say("g: after capture: ", res.body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before thread 1 create")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after thread 1 create")[m
[31m-[m
[31m-            ngx.say("before thread 2 create")[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("after thread 2 create")[m
[31m-[m
[31m-            local res = ngx.location.capture("/proxy?bar")[m
[31m-            ngx.say("capture: ", res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /proxy {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/$args;[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo_sleep 0.1;[m
[31m-        echo -n hello foo;[m
[31m-    }[m
[31m-[m
[31m-    location /bar {[m
[31m-        echo_sleep 0.2;[m
[31m-        echo -n hello bar;[m
[31m-    }[m
[31m-[m
[31m-    location /bah {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo -n hello bah;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before thread 1 create[m
[31m-f: before capture[m
[31m-after thread 1 create[m
[31m-before thread 2 create[m
[31m-g: before capture[m
[31m-after thread 2 create[m
[31m-f: after capture: hello foo[m
[31m-capture: hello bar[m
[31m-g: after capture: hello bah[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: nested user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after f[m
[31m-after g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: nested user threads (with I/O)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-after f[m
[31m-after g[m
[31m-hello in g()[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: coroutine status of a running user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: running[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: coroutine status of a dead user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-status: zombie[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: coroutine status of a "normal" user thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local co[m
[31m-            function f()[m
[31m-                co = coroutine.running()[m
[31m-                local co2 = coroutine.create(g)[m
[31m-                coroutine.resume(co2)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("status: ", coroutine.status(co))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-status: normal[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: creating user threads in a user coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("before g")[m
[31m-                ngx.thread.spawn(g)[m
[31m-                ngx.say("after g")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello in g()")[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before f")[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-            ngx.say("after f")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-terminate 2: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before f[m
[31m-before g[m
[31m-hello in g()[m
[31m-after g[m
[31m-after f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: manual time slicing between a user thread and the entry thread[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            local self = coroutine.running()[m
[31m-            ngx.say("0")[m
[31m-            yield(self)[m
[31m-            ngx.say("1")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("2")[m
[31m-            yield(self)[m
[31m-            ngx.say("3")[m
[31m-            yield(self)[m
[31m-            ngx.say("4")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-0[m
[31m-1[m
[31m-f 1[m
[31m-2[m
[31m-f 2[m
[31m-3[m
[31m-f 3[m
[31m-4[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: manual time slicing between two user threads[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local yield = coroutine.yield[m
[31m-[m
[31m-            function f()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("f 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("f 3")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                local self = coroutine.running()[m
[31m-                ngx.say("g 1")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 2")[m
[31m-                yield(self)[m
[31m-                ngx.say("g 3")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-f 1[m
[31m-g 1[m
[31m-f 2[m
[31m-done[m
[31m-g 2[m
[31m-f 3[m
[31m-g 3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entry thread and a user thread flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                coroutine.yield(coroutine.running)[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.flush(true)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: two user threads flushing at the same time[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.say("hello from g")[m
[31m-                ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- response_body[m
[31m-hello from f[m
[31m-hello from g[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: user threads + ngx.socket.tcp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flush_all\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-received: OK[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: user threads + ngx.socket.udp[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.udp()[m
[31m-                local ok, err = sock:setpeername("127.0.0.1", 12345)[m
[31m-                local bytes, err = sock:send("blah")[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send query: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-)$[m
[31m-[m
[31m---- udp_listen: 12345[m
[31m---- udp_query: blah[m
[31m---- udp_reply: hello udp[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-after[m
[31m-received: hello udp[m
[31m-|before[m
[31m-received: hello udp[m
[31m-after)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: simple user thread with ngx.req.read_body()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.req.read_body()[m
[31m-                local body = ngx.req.get_body_data()[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: simple user thread with ngx.req.socket()[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.req.socket()[m
[31m-                local body, err = sock:receive(11)[m
[31m-                if not body then[m
[31m-                    ngx.say("failed to read body: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("body: ", body)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m-hello world[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^(?:create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1|create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^(?:before[m
[31m-body: hello world[m
[31m-after|before[m
[31m-after[m
[31m-body: hello world)$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: simple user thread with args[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f(a, b)[m
[31m-                ngx.say("hello ", a, " and ", b)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f, "foo", 3.14)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello foo and 3.14[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: multiple user threads + subrequests returning 404 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-finalize request /t: rc:-4 c:4 a:1[m
[31m-finalize request /proxy/1: rc:404 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=404, status=0 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-finalize request /proxy/2: rc:404 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=404, status=0 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:0 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 404[m
[31m-status: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: multiple user threads + subrequests returning 404 remotely (no wait)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 5 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/d/$1;[m
[31m-    }[m
[31m-[m
[31m-    location /d {[m
[31m-        return 404;[m
[31m-        #echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-create 5 in 1[m
[31m-spawn user thread 5 in 1[m
[31m-create 6 in 1[m
[31m-spawn user thread 6 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-(?:terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 6: ok[m
[31m-delete thread 6[m
[31m-|terminate 6: ok[m
[31m-delete thread 6[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m-status: 404[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: multiple user threads + subrequests returning 201 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        content_by_lua 'ngx.exit(201)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-finalize request /t: rc:-4 c:4 a:1[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-finalize request /proxy/1: rc:0 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=0, status=201 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-finalize request /proxy/2: rc:0 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=0, status=201 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:0 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 201[m
[31m-status: 201[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: multiple user threads + subrequests returning 204 immediately[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                ngx.say("status: ", res.status)[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, 2 do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        content_by_lua 'ngx.exit(204)';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-"$::GCScript"[m
[31m-.[m
[31m-'[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-'[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-finalize request /t: rc:-4 c:4 a:1[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-finalize request /proxy/1: rc:204 c:3 a:0[m
[31m-post subreq: /proxy/1 rc=204, status=204 a=0[m
[31m-subrequest /proxy/1 done[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-finalize request /proxy/2: rc:204 c:2 a:0[m
[31m-post subreq: /proxy/2 rc=204, status=204 a=0[m
[31m-subrequest /proxy/2 done[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-finalize request /t: rc:0 c:1 a:1[m
[31m-(?:finalize request /t: rc:0 c:1 a:1)?$[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-status: 204[m
[31m-status: 204[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: multiple user threads + subrequests returning 404 remotely (wait)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local n = 5[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                return res.status[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, n do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                local ok, res = ngx.thread.wait(threads[i])[m
[31m-                ngx.say(i, ": ", res)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/d/$1;[m
[31m-    }[m
[31m-[m
[31m-    location /d {[m
[31m-        return 404;[m
[31m-        #echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3 eval: $::GCScript[m
[31m---- stap_out3[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-create 5 in 1[m
[31m-spawn user thread 5 in 1[m
[31m-create 6 in 1[m
[31m-spawn user thread 6 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 6: ok[m
[31m-delete thread 6[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-1: 404[m
[31m-2: 404[m
[31m-3: 404[m
[31m-4: 404[m
[31m-5: 404[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: multiple user threads + subrequests remotely (wait)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local n = 20[m
[31m-            local capture = ngx.location.capture[m
[31m-            local insert = table.insert[m
[31m-[m
[31m-            local function f(i)[m
[31m-                local res = capture("/proxy/" .. i)[m
[31m-                return res.status[m
[31m-            end[m
[31m-[m
[31m-            local threads = {}[m
[31m-            for i = 1, n do[m
[31m-                local co = ngx.thread.spawn(f, i)[m
[31m-                insert(threads, co)[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, n do[m
[31m-                local ok, res = ngx.thread.wait(threads[i])[m
[31m-                ngx.say(i, ": ", res)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location ~ ^/proxy/(\d+) {[m
[31m-        proxy_pass http://127.0.0.1:$server_port/d/$1;[m
[31m-    }[m
[31m-[m
[31m-    location /d {[m
[31m-        echo_sleep 0.001;[m
[31m-        echo $uri;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3 eval: $::GCScript[m
[31m---- stap_out3[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-create 5 in 1[m
[31m-spawn user thread 5 in 1[m
[31m-create 6 in 1[m
[31m-spawn user thread 6 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-terminate 5: ok[m
[31m-delete thread 5[m
[31m-terminate 6: ok[m
[31m-delete thread 6[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-1: 200[m
[31m-2: 200[m
[31m-3: 200[m
[31m-4: 200[m
[31m-5: 200[m
[31m-6: 200[m
[31m-7: 200[m
[31m-8: 200[m
[31m-9: 200[m
[31m-10: 200[m
[31m-11: 200[m
[31m-12: 200[m
[31m-13: 200[m
[31m-14: 200[m
[31m-15: 200[m
[31m-16: 200[m
[31m-17: 200[m
[31m-18: 200[m
[31m-19: 200[m
[31m-20: 200[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: simple user thread without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/094-uthread-exit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/094-uthread-exit.t[m
[1mdeleted file mode 100644[m
[1mindex 4d1d316..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/094-uthread-exit.t[m
[1m+++ /dev/null[m
[36m@@ -1,1651 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exit in user thread (entry thread is still pending to run)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-                ngx.say("g")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m-f[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exit in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("exiting the user thread")[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-after[m
[31m-exiting the user thread[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.tcp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_tcp_resolve_cleanup) {[m
[31m-    println("lua tcp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: exit in user thread (entry thread is still pending on the DNS resolver for ngx.socket.udp)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        resolver agentzh.org;[m
[31m-        resolver_timeout 12s;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.001)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-            local ok, err = sock:setpeername("agentzh.org", 80)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-F(ngx_resolve_name) {[m
[31m-    printf("resolving %s\n", user_string_n($ctx->name->data, $ctx->name->len))[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 1) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 1) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_resolve_cleanup) {[m
[31m-    println("lua udp resolve cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 1[m
[31m-resolving agentzh.org[m
[31m-add timer 12000[m
[31m-expire timer 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp resolve cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: exit in user thread (entry thread is still pending on tcpsock:connect)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(12000)[m
[31m-            local ok, err = sock:connect("106.187.41.147", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 12000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: exit in user thread (entry thread is still pending on tcpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: exit in user thread (entry thread is still pending on tcpsock:receiveuntil's iterator)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, ok = sock:send("blpop not_exists 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local it, err = sock:receiveuntil("\\r\\n")[m
[31m-            if not it then[m
[31m-                ngx.say("failed to receive until: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = it()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: exit in user thread (entry thread is still pending on udpsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.socket.udp()[m
[31m-[m
[31m-            local ok, err = sock:setpeername("8.8.8.8", 12345)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_udp_socket_cleanup) {[m
[31m-    println("lua udp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua udp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: exit in user thread (entry thread is still pending on reqsock:receive)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-            local sock = ngx.req.socket()[m
[31m-[m
[31m-            sock:settimeout(12000)[m
[31m-[m
[31m-            local data, err = sock:receive(1024)[m
[31m-            if not data then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_coctx_cleanup) {[m
[31m-    println("lua tcp socket cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua tcp socket cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: exit in user thread (entry thread is still pending on ngx.req.read_body)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 12000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 12000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_req_body_cleanup) {[m
[31m-    println("lua req body cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 12000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req body cleanup[m
[31m-delete timer 12000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-before[m
[31m-hello in thread[m
[31m-after[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: exit(0) in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: exit in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: exit in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(0)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: exit in entry thread (user thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture_multi{[m
[31m-                    {"/echo"},[m
[31m-                    {"/sleep"}[m
[31m-                }[m
[31m-                ngx.say("end")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-            ngx.exit(0)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 1: fail[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exit(444) in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: exit(408) in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(408)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: exit(499) in user thread (entry thread is still pending on ngx.location.capture), with pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exit(499)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("before")[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("after")[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[warn][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/095-uthread-exec.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/095-uthread-exec.t[m
[1mdeleted file mode 100644[m
[1mindex 4459360..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/095-uthread-exec.t[m
[1m+++ /dev/null[m
[36m@@ -1,426 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: exec in user thread (entry still pending)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exec in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exec in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: exec in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: exec in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: exec in entry thread (user thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture("/sleep")[m
[31m-                ngx.say("end")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-            ngx.exec("/foo")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 1: fail[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/096-uthread-redirect.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/096-uthread-redirect.t[m
[1mdeleted file mode 100644[m
[1mindex b0258fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/096-uthread-redirect.t[m
[1m+++ /dev/null[m
[36m@@ -1,280 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.redirect() in user thread (entry thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture_multi{[m
[31m-                {"/echo"},[m
[31m-                {"/sleep"}[m
[31m-            }[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: redirect in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.redirect(301)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body_like: 302 Found[m
[31m---- error_code: 302[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.redirect() in entry thread (user thread is still pending on ngx.location.capture_multi), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture_multi{[m
[31m-                    {"/echo"},[m
[31m-                    {"/sleep"}[m
[31m-                }[m
[31m-                ngx.say("end")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-            ngx.redirect(301)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /echo {[m
[31m-        echo hello;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- more_headers[m
[31m-Content-Length: 1024[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-post subreq /echo[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 1: fail[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-delete timer 200[m
[31m-free request[m
[31m-[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[warn][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/097-uthread-rewrite.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/097-uthread-rewrite.t[m
[1mdeleted file mode 100644[m
[1mindex 178a374..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/097-uthread-rewrite.t[m
[1m+++ /dev/null[m
[36m@@ -1,347 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: rewrite in user thread (entry still pending)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: rewrite in user thread (entry already quits)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        echo i am foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-i am foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: rewrite in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rewrite in a user thread (another user thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.thread.spawn(g)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello foo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-add timer 1000[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-expire timer 100[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 3[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-hello foo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: rewrite in user thread (entry thread is still pending on ngx.location.capture), without pending output[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        client_body_timeout 12000ms;[m
[31m-        rewrite_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.req.set_uri("/foo", true)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.say("end")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.2;[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        echo hello world;[m
[31m-    }[m
[31m---- request[m
[31m-POST /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 200 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 200 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq %s\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-add timer 100[m
[31m-add timer 200[m
[31m-expire timer 100[m
[31m-terminate 2: fail[m
[31m-expire timer 200[m
[31m-post subreq /sleep[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-end[m
[31m---- error_log[m
[31m-attempt to abort with pending subrequests[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/098-uthread-wait.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/098-uthread-wait.t[m
[1mdeleted file mode 100644[m
[1mindex aaf020a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/098-uthread-wait.t[m
[1m+++ /dev/null[m
[36m@@ -1,1324 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple user thread wait without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple user thread wait with I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-hello in thread[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: wait on uthreads on the reversed order of their termination[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("g: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait g: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g: ", res)[m
[31m-[m
[31m-            ngx.say("f thread status: ", coroutine.status(tf))[m
[31m-[m
[31m-            ok, res = ngx.thread.wait(tf)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait f: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f thread created: running[m
[31m-g thread created: running[m
[31m-f: hello[m
[31m-g: hello[m
[31m-g: done[m
[31m-f thread status: zombie[m
[31m-f: done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: wait on uthreads on the exact order of their termination[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("g: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-[m
[31m-            ok, res = ngx.thread.wait(tf)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait f: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f: ", res)[m
[31m-[m
[31m-            ngx.say("g thread status: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait g: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- response_body[m
[31m-f thread created: running[m
[31m-g thread created: running[m
[31m-f: hello[m
[31m-f: done[m
[31m-g thread status: running[m
[31m-g: hello[m
[31m-g: done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: simple user thread wait without I/O (return multiple values)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done", 3.14[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res1, res2 = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res1)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("res: ", res1, " ", res2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-res: done 3.14[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: simple user thread wait with I/O, return multiple values[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done", 3.14[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            local ok, res1, res2 = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait thread: ", res1)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("res: ", res1, " ", res2)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-hello in thread[m
[31m-res: done 3.14[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple user thread wait without I/O, throw errors[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                error("bad bad!")[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-failed to wait thread: bad bad![m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):4: bad bad!/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple user thread wait with I/O, throw errors[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in thread")[m
[31m-                error("bad bad!")[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-hello in thread[m
[31m-failed to wait thread: bad bad![m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):5: bad bad!/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: simple user thread wait without I/O (in a user coroutine)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function g()[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function f()[m
[31m-                local t, err = ngx.thread.spawn(g)[m
[31m-                if not t then[m
[31m-                    ngx.say("failed to spawn thread: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to run thread: ", res)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say(res)[m
[31m-            end[m
[31m-[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: simple user thread wait with I/O (in a user coroutine)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function f()[m
[31m-                local t, err = ngx.thread.spawn(g)[m
[31m-                if not t then[m
[31m-                    ngx.say("failed to spawn thread: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to run thread: ", res)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say(res)[m
[31m-            end[m
[31m-[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-hello in thread[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: waiting on two simple user threads without I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                out("f: hello")[m
[31m-                return "f done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                out("g: hello")[m
[31m-                return "g done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("res: ", res)[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f: hello[m
[31m-thread f created: zombie[m
[31m-g: hello[m
[31m-thread g created: zombie[m
[31m-res: f done[m
[31m-f status: dead[m
[31m-g status: zombie[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: waiting on two simple user threads with I/O[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                out("f: hello")[m
[31m-                return "f done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                out("g: hello")[m
[31m-                return "g done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("res: ", res)[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-thread f created: running[m
[31m-thread g created: running[m
[31m-f: hello[m
[31m-res: f done[m
[31m-f status: dead[m
[31m-g status: running[m
[31m-g: hello[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: waiting on two simple user threads with I/O (uthreads completed in reversed order)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                ngx.sleep(0.2)[m
[31m-                out("f: hello")[m
[31m-                return "f done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                out("g: hello")[m
[31m-                return "g done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("res: ", res)[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-thread f created: running[m
[31m-thread g created: running[m
[31m-g: hello[m
[31m-res: g done[m
[31m-f status: running[m
[31m-g status: dead[m
[31m-f: hello[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: waiting on two simple user threads without I/O, both aborted by errors[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                out("f: hello")[m
[31m-                error("f done")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                out("g: hello")[m
[31m-                error("g done")[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-            else[m
[31m-                out("res: ", res)[m
[31m-            end[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: fail[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: fail[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f: hello[m
[31m-thread f created: zombie[m
[31m-g: hello[m
[31m-thread g created: zombie[m
[31m-failed to wait thread: f done[m
[31m-f status: dead[m
[31m-g status: zombie[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):7: f done/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: waiting on two simple user threads with I/O, both aborted by errors[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            -- local out = function (...) ngx.log(ngx.ERR, ...) end[m
[31m-            local out = ngx.say[m
[31m-[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                out("f: hello")[m
[31m-                error("f done")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                out("g: hello")[m
[31m-                error("g done")[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                out("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                out("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            out("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                out("failed to wait thread: ", res)[m
[31m-            else[m
[31m-                out("res: ", res)[m
[31m-            end[m
[31m-[m
[31m-            out("f status: ", coroutine.status(tf))[m
[31m-            out("g status: ", coroutine.status(tg))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: fail[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: fail[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-thread f created: running[m
[31m-thread g created: running[m
[31m-f: hello[m
[31m-failed to wait thread: f done[m
[31m-f status: dead[m
[31m-g status: running[m
[31m-g: hello[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):8: f done/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: wait on uthreads on the exact order of their termination, but exit the world early[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("f: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("g: hello")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-[m
[31m-            ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("res: ", res)[m
[31m-[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f thread created: running[m
[31m-g thread created: running[m
[31m-f: hello[m
[31m-res: done[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: wait on uthreads on the reversed order of their termination, but exit the world early[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.2)[m
[31m-                ngx.say("f: hello")[m
[31m-                return "f done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("g: hello")[m
[31m-                return "g done"[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("f thread created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("g thread created: ", coroutine.status(tg))[m
[31m-[m
[31m-            ok, res = ngx.thread.wait(tf, tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to wait: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("res: ", res)[m
[31m-[m
[31m-            ngx.exit(200)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-f thread created: running[m
[31m-g thread created: running[m
[31m-g: hello[m
[31m-res: g done[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: entry coroutine waiting on a thread not created by itself[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local t[m
[31m-[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                t = ngx.thread.spawn(f)[m
[31m-            end[m
[31m-[m
[31m-            local co = coroutine.create(g)[m
[31m-            coroutine.resume(co)[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 2: ok[m
[31m-terminate 1: fail[m
[31m-delete thread 3[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-only the parent coroutine can wait on the thread[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: entry coroutine waiting on a user coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                coroutine.yield()[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local co = coroutine.create(f)[m
[31m-            coroutine.resume(co)[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(co)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: fail[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/lua entry thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):11: attempt to wait on a coroutine that is not a user thread/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: lua backtrace dumper may access dead parent coroutines[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.sleep(0.1)[m
[31m-                collectgarbage()[m
[31m-                error("f done")[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(f)[m
[31m-            ngx.say("ok")[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: fail[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- error_log eval[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):5: f done/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: waiting on a dead coroutine[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to run thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello in thread[m
[31m-thread created: zombie[m
[31m-failed to run thread: already waited or killed[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: spawn and wait uthreads for many times[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                -- ngx.say("hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 100 do[m
[31m-                local t, err = ngx.thread.spawn(f)[m
[31m-                if not t then[m
[31m-                    ngx.say("failed to spawn thread: ", err)[m
[31m-                    break[m
[31m-                end[m
[31m-[m
[31m-                -- ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to run thread: ", res)[m
[31m-                    break[m
[31m-                end[m
[31m-[m
[31m-                ngx.say(i, ": ", res)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body eval[m
[31m-my $s = '';[m
[31m-for my $i (1..100) {[m
[31m-    $s .= "$i: done\n";[m
[31m-}[m
[31m-$s;[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/099-c-api.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/099-c-api.t[m
[1mdeleted file mode 100644[m
[1mindex a0b375c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/099-c-api.t[m
[1m+++ /dev/null[m
[36m@@ -1,397 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: find zone[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-            ]][m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local zone = ffi.C.ngx_http_lua_find_zone(buf, 3)[m
[31m-            ngx.say("foo zone: ", tonumber(ffi.cast("long", zone)) ~= 0 and "defined" or "undef")[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-            ngx.say("dogs zone: ", tonumber(ffi.cast("long", zone)) ~= 0 and "defined" or "undef")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo zone: undef[m
[31m-dogs zone: defined[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: number typed value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", 1234567)[m
[31m-            dogs:set("bar", 3.14159)[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc),[m
[31m-                ", type=", val[0].type,[m
[31m-                ", val=", tonumber(val[0].value.n))[m
[31m-[m
[31m-            ffi.copy(buf, "bar", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("bar: rc=", tonumber(rc),[m
[31m-                ", type=", val[0].type,[m
[31m-                ", val=", tonumber(val[0].value.n))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=0, type=3, val=1234567[m
[31m-bar: rc=0, type=3, val=3.14159[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: boolean typed value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", true)[m
[31m-            dogs:set("bar", false)[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc),[m
[31m-                ", type=", tonumber(val[0].type),[m
[31m-                ", val=", tonumber(val[0].value.b))[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-            ffi.copy(buf, "bar", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("bar: rc=", tonumber(rc),[m
[31m-                ", type=", tonumber(val[0].type),[m
[31m-                ", val=", tonumber(val[0].value.b))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=0, type=1, val=1[m
[31m-bar: rc=0, type=1, val=0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: key not found[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:flush_all()[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc))[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-            ffi.copy(buf, "bar", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("bar: rc=", tonumber(rc))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=-5[m
[31m-bar: rc=-5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: string typed value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", "hello world")[m
[31m-            dogs:set("bar", "")[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local s = ffi.new("char[?]", 20)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-            val[0].value.s.len = 20[m
[31m-            val[0].value.s.data = s[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc),[m
[31m-                ", type=", tonumber(val[0].type),[m
[31m-                ", val=", ffi.string(val[0].value.s.data, val[0].value.s.len),[m
[31m-                ", len=", tonumber(val[0].value.s.len))[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-            val[0].value.s.len = 20[m
[31m-            val[0].value.s.data = s[m
[31m-[m
[31m-            ffi.copy(buf, "bar", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("bar: rc=", tonumber(rc),[m
[31m-                ", type=", tonumber(val[0].type),[m
[31m-                ", val=", ffi.string(val[0].value.s.data, val[0].value.s.len),[m
[31m-                ", len=", tonumber(val[0].value.s.len))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=0, type=4, val=hello world, len=11[m
[31m-bar: rc=0, type=4, val=, len=0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: nil typed value[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                typedef struct {[m
[31m-                    size_t  len;[m
[31m-                    char   *data;[m
[31m-                } ngx_str_t;[m
[31m-[m
[31m-                typedef struct {[m
[31m-                    uint8_t         type;[m
[31m-[m
[31m-                    union {[m
[31m-                        int         b; /* boolean */[m
[31m-                        double      n; /* number */[m
[31m-                        ngx_str_t   s; /* string */[m
[31m-                    } value;[m
[31m-[m
[31m-                } ngx_http_lua_value_t;[m
[31m-[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-                intptr_t ngx_http_lua_shared_dict_get(void *zone, char *kdata, size_t klen, ngx_http_lua_value_t *val);[m
[31m-            ]][m
[31m-[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            dogs:set("foo", nil)[m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-[m
[31m-            local val = ffi.new("ngx_http_lua_value_t[?]", 1)[m
[31m-[m
[31m-            ffi.copy(buf, "foo", 3)[m
[31m-            local rc = ffi.C.ngx_http_lua_shared_dict_get(zone, buf, 3, val)[m
[31m-            ngx.say("foo: rc=", tonumber(rc))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-foo: rc=-5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: find zone (multiple zones)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m-    lua_shared_dict cats 1m;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                void *ngx_http_lua_find_zone(char *data, size_t len);[m
[31m-            ]][m
[31m-[m
[31m-            local buf = ffi.new("char[?]", 4)[m
[31m-            ffi.copy(buf, "cats", 4)[m
[31m-            local zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-            local cats = tostring(zone)[m
[31m-[m
[31m-            ffi.copy(buf, "dogs", 4)[m
[31m-            zone = ffi.C.ngx_http_lua_find_zone(buf, 4)[m
[31m-            local dogs = tostring(zone)[m
[31m-[m
[31m-            ngx.say("dogs == cats ? ", dogs == cats)[m
[31m-            -- ngx.say("dogs: ", dogs)[m
[31m-            -- ngx.say("cats ", cats)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-dogs == cats ? false[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/100-client-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/100-client-abort.t[m
[1mdeleted file mode 100644[m
[1mindex cd46859..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/100-client-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,1067 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: sleep + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: subrequest + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: subrequest + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /sub {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: fail[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-bad things happen[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: subrequest + stop (proxy, ignore client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: subrequest + stop (proxy, check client abort)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.location.capture("/sub")[m
[31m-            error("bad things happen")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sub {[m
[31m-        proxy_ignore_client_abort off;[m
[31m-        proxy_pass http://agentzh.org:12345/;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: need body on + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        lua_need_request_body on;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        log_by_lua '[m
[31m-            ngx.log(ngx.NOTICE, "here in log by lua")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-here in log by lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.req.socket + receive() + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.req.socket + receive(N) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(5)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.req.socket + receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:lua check broken conn[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup|lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.req.socket + m * receive(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(2)[m
[31m-            sock:receive(1)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.req.socket + receiveuntil + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it()[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.req.socket + receiveuntil + it(n) + sleep + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local it = sock:receiveuntil("\\n")[m
[31m-            it(2)[m
[31m-            it(3)[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- wait: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: cosocket + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.discard_body()[m
[31m-[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "failed to get socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("blpop nonexist 2\\r\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            -- ngx.log(ngx.ERR, "about to receive")[m
[31m-[m
[31m-            local res, err = sock:receive()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to receive query: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "res: ", res)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.req.socket + receive n < content-length + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err, part = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err, ": ", part)[m
[31m-                return[m
[31m-            end[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 100\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to receive: client aborted: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.req.socket + receive n < content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err, part = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err, ": ", part)[m
[31m-                return[m
[31m-            end[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 100\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-failed to receive: client aborted: hello[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.req.socket + receive n == content-length + stop[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.sleep(0.1)[m
[31m-            error("bad")[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like[m
[31m-^(?:lua check broken conn[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup|lua check broken conn[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1)$[m
[31m-[m
[31m---- shutdown[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.req.socket + receive n == content-length + ignore[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local res, err = sock:receive("*a")[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.NOTICE, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"POST /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.req.read_body + sleep + stop (log handler still gets called)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.sleep(0.1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-lua check broken conn[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- shutdown: 1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m---- SKIP[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: exec to lua + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: exec to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("/t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: exec (named location) to proxy + ignore[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.exec("@t2")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location @t2 {[m
[31m-        proxy_ignore_client_abort on;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/sleep;[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-lua req cleanup[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: bug in ngx_http_upstream_test_connect for kqueue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        proxy_pass http://127.0.0.1:1234/;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-qr{connect\(\) failed \(\d+: Connection refused\) while connecting to upstream}[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: sleep (default off)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- wait: 1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx.say[m
[31m---- config[m
[31m-    location /t {[m
[31m-        postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.say("hello")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "say failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-say failed: nginx output filter error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx.print[m
[31m---- config[m
[31m-    location /t {[m
[31m-        postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.print("hello")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "print failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-print failed: nginx output filter error[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: ngx.send_headers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.send_headers()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "send headers failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "send headers succeeded")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-send headers succeeded[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: ngx.flush[m
[31m---- config[m
[31m-    location /t {[m
[31m-        #postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.flush()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "flush failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "flush succeeded")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-flush succeeded[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: ngx.eof[m
[31m---- config[m
[31m-    location /t {[m
[31m-        postpone_output 1;[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.2)[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.WARN, "eof failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.log(ngx.WARN, "eof succeeded")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- timeout: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-eof succeeded[m
[31m---- error_log[m
[31m-eof failed: nginx output filter error[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/101-on-abort.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/101-on-abort.t[m
[1mdeleted file mode 100644[m
[1mindex 81cec78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/101-on-abort.t[m
[1m+++ /dev/null[m
[36m@@ -1,849 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = <<_EOC_;[m
[31m-$t::StapThread::GCScript[m
[31m-[m
[31m-F(ngx_http_lua_check_broken_connection) {[m
[31m-    println("lua check broken conn")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_request_cleanup) {[m
[31m-    println("lua req cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 19);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-$ENV{TEST_NGINX_REDIS_PORT} ||= '6379';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ignore the client abort event in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-^create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-(?:lua check broken conn[m
[31m-)?terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: abort in the user callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: ngx.exit(499) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.exit(408) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(408)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(-1) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(-1)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 1;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(0) with pending subrequest[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(0)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.location.capture("/sleep")[m
[31m-            ngx.log(ngx.ERR, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /sleep {[m
[31m-        echo_sleep 0.7;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: fail[m
[31m-terminate 1: ok[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-[[m
[31m-'client prematurely closed connection',[m
[31m-'on abort called',[m
[31m-qr/lua user thread aborted: runtime error: content_by_lua\(nginx\.conf:\d+\):4: attempt to abort with pending subrequests/,[m
[31m-'main handler done',[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: accessing cosocket in callback[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to connect to redis: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                local bytes, err = sock:send("flushall\\r\\n")[m
[31m-                if not bytes then[m
[31m-                    ngx.log(ngx.ERR, "failed to send query: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive()[m
[31m-                if not res then[m
[31m-                    ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                    ngx.exit(499)[m
[31m-                end[m
[31m-                ngx.log(ngx.NOTICE, "callback done: ", res)[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.5[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-callback done: +OK[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ignore the client abort event in the user callback (no check)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort off;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("cannot set on_abort: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- response_body[m
[31m-cannot set on_abort: lua_check_client_abort is off[m
[31m---- no_error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: regsiter on_abort callback but no client abortion[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ignore the client abort event in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- wait: 0.7[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: abort in the user callback (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.7)[m
[31m-                ngx.log(ngx.NOTICE, "main handler done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- wait: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: regsiter on_abort callback but no client abortion (uthread)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: regsiter on_abort callback multiple times[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("1: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                ngx.say("2: cannot set on_abort: " .. err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-            end)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-2: cannot set on_abort: duplicate call[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: abort with 499 in the user callback, but the header is already sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(499)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.send_headers()[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: abort with 444 in the user callback, but the header is already sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(444)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.send_headers()[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: abort with 408 in the user callback, but the header is already sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-                ngx.exit(408)[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.send_headers()[m
[31m-            ngx.sleep(0.7)[m
[31m-            ngx.log(ngx.NOTICE, "main handler done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-lua check broken conn[m
[31m-terminate 2: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 1[m
[31m-[m
[31m---- timeout: 0.2[m
[31m---- wait: 0.1[m
[31m---- abort[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-main handler done[m
[31m---- error_log[m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: GC issue with the on_abort thread object[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        content_by_lua '[m
[31m-            ngx.on_abort(function () end)[m
[31m-            collectgarbage()[m
[31m-            ngx.sleep(60)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- abort[m
[31m---- timeout: 0.2[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: regsiter on_abort callback but no client abortion (2 uthreads and 1 pending)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        lua_check_client_abort on;[m
[31m-        rewrite_by_lua '[m
[31m-            local ok, err = ngx.on_abort(function ()[m
[31m-                ngx.log(ngx.NOTICE, "on abort called")[m
[31m-            end)[m
[31m-[m
[31m-            if not ok then[m
[31m-                error("cannot set on_abort: " .. err)[m
[31m-            end[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(0.1)[m
[31m-                ngx.say("done")[m
[31m-                ngx.exit(200)[m
[31m-            end)[m
[31m-[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.sleep(100)[m
[31m-            end)[m
[31m-        ';[m
[31m-        content_by_lua return;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-spawn user thread 3 in 1[m
[31m-create 4 in 1[m
[31m-spawn user thread 4 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-lua req cleanup[m
[31m-delete thread 2[m
[31m-delete thread 3[m
[31m-delete thread 4[m
[31m-[m
[31m---- wait: 0.5[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-client prematurely closed connection[m
[31m-on abort called[m
[31m-main handler done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/102-req-start-time.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/102-req-start-time.t[m
[1mdeleted file mode 100644[m
[1mindex 1d5fe28..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/102-req-start-time.t[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-# -*- mode: conf -*-[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: start time[m
[31m---- config[m
[31m-    location = /start {[m
[31m-        content_by_lua 'ngx.say(ngx.req.start_time())';[m
[31m-    }[m
[31m---- request[m
[31m-GET /start[m
[31m---- response_body_like: ^\d{10,}(\.\d+)?$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: start time in set_by_lua[m
[31m---- config[m
[31m-    location = /start {[m
[31m-        set_by_lua $a 'return ngx.req.start_time()';[m
[31m-        echo $a;[m
[31m-    }[m
[31m---- request[m
[31m-GET /start[m
[31m---- response_body_like: ^\d{10,}(\.\d+)?$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: request time[m
[31m---- config[m
[31m-    location = /req_time {[m
[31m-        content_by_lua '[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            local req_time = ngx.now() - ngx.req.start_time()[m
[31m-[m
[31m-            ngx.say(req_time)[m
[31m-            ngx.say(ngx.req.start_time() < ngx.now())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /req_time[m
[31m---- response_body_like chop[m
[31m-^(?:0\.[12]|0\.099)\d*[m
[31m-true$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: request time update[m
[31m---- config[m
[31m-    location = /req_time {[m
[31m-            content_by_lua '[m
[31m-               ngx.sleep(0.1)[m
[31m-[m
[31m-               local req_time = ngx.now() - ngx.req.start_time()[m
[31m-[m
[31m-               ngx.sleep(0.1)[m
[31m-[m
[31m-               ngx.update_time()[m
[31m-[m
[31m-               local req_time_updated = ngx.now() - ngx.req.start_time()[m
[31m-[m
[31m-               ngx.say(req_time)[m
[31m-               ngx.say(req_time_updated)[m
[31m-               ngx.say(req_time_updated > req_time)[m
[31m-            ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /req_time[m
[31m---- response_body_like chomp[m
[31m-^(?:0\.[12]|0\.099)\d*[m
[31m-0\.\d+[m
[31m-true$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        time = ngx.req.start_time()[m
[31m-    ';[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(time)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- SKIP[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/103-req-http-ver.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/103-req-http-ver.t[m
[1mdeleted file mode 100644[m
[1mindex 6ded75a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/103-req-http-ver.t[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: HTTP 1.1[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.req.http_version())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-1.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: HTTP 1.0[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.req.http_version())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t HTTP/1.0[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/104-req-raw-header.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/104-req-raw-header.t[m
[1mdeleted file mode 100644[m
[1mindex 439b9de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/104-req-raw-header.t[m
[1m+++ /dev/null[m
[36m@@ -1,879 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 15);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: small header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: large header[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: large header (no request line)[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: small header (no request line)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: small header (no request line, with leading CRLF)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: small header, with leading CRLF[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: large header, with leading CRLF[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-".[m
[31m-(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: large header, with leading CRLF, excluding request line[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"\r\nGET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-".[m
[31m-(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: large header, with lots of leading CRLF, excluding request line[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-("\r\n" x 534) . "GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-".[m
[31m-(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: small header, pipelined[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /th"][m
[31m-[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-}, qq{GET /th HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: large header, pipelined[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m-[m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-my $headers = (CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\n\r\n";[m
[31m-[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-$headers},[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-$headers}][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: small header, multi-line header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar baz\r[m
[31m-  blah\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar baz\r[m
[31m-  blah\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: large header, multi-line header[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 50 567;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-my $headers = (CORE::join "\r\n", map { "Header$_: value-$_\r\n hello $_ world blah blah" } 1..512) . "\r\n\r\n";[m
[31m-[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-$headers}[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_\r\n hello $_ world blah blah" } 1..512) . "\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: small header (POST body)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: small header (POST body) - in subrequests[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/t")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: large header (POST body)[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join"\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: large header (POST body) - in subrequests[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 561;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location /main {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/t")[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /main[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join"\n", map { "Header$_: value-$_" } 1..512[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /main HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..512) . "\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: large header (POST body) - r->header_end is outside r->header_in[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 564;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join("\n", map { "Header$_: value-$_" } 1..80) . "\nA: abcdefghijklmnopqrs\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..80)[m
[31m-. "\r\nA: abcdefghijklmnopqrs\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: large header (POST body) - r->header_end is outside r->header_in (2)[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 30 564;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.req.read_body()[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-POST /t[m
[31m-hello[m
[31m---- more_headers eval[m
[31m-CORE::join("\n", map { "Header$_: value-$_" } 1..52) . "\nA: abcdefghijklmnopqrs\n"[m
[31m-[m
[31m---- response_body eval[m
[31m-qq{POST /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..52)[m
[31m-. "\r\nA: abcdefghijklmnopqrs\r\nContent-Length: 5\r\n\r\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: raw_header (the default header buffer can hold the request line, but not the header entries) - without request line)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-           ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-$s .= "Accept: */*\n";[m
[31m-$s .= "Cookie: " . "C" x 1200 . "\n";[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"Host: localhost\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-Accept: */*\r[m
[31m-Cookie: " . ("C" x 1200) . "\r\n\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: raw_header (the default header buffer can hold the request line, but not the header entries) - with request line)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-           ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers eval[m
[31m-my $s = "User-Agent: curl\nBah: bah\n";[m
[31m-$s .= "Accept: */*\n";[m
[31m-$s .= "Cookie: " . "C" x 1200 . "\n";[m
[31m-$s[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-User-Agent: curl\r[m
[31m-Bah: bah\r[m
[31m-Accept: */*\r[m
[31m-Cookie: " . ("C" x 1200) . "\r\n\r\n"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (exclusive LF in the request data)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (exclusive LF in the request data, and no status line)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1[m
[31m-Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"Host: localhost[m
[31m-Connection: close[m
[31m-Content-Length: 5[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (mixed LF and CRLF in the request data, and no status line)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5\r[m
[31m-[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: ngx_proxy/ngx_fastcgi/etc change r->header_end to point to their own buffers (another way of mixing LF and CRLF in the request data, and no status line)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_buffering off;[m
[31m-        proxy_pass http://127.0.0.1:$server_port/bad;[m
[31m-        proxy_intercept_errors on;[m
[31m-        error_page 500 = /500;[m
[31m-    }[m
[31m-[m
[31m-    location = /bad {[m
[31m-        return 500;[m
[31m-    }[m
[31m-[m
[31m-    location = /500 {[m
[31m-        internal;[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header(true))[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5[m
[31m-\r[m
[31m-hello"[m
[31m---- response_body eval[m
[31m-"Host: localhost[m
[31m-Connection: close\r[m
[31m-Content-Length: 5[m
[31m-\r[m
[31m-"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: two pipelined requests with large headers[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 3 5610;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m---- more_headers eval[m
[31m-CORE::join "\n", map { "Header$_: value-$_" } 1..585[m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..585) . "\r\n\r\n",[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..585) . "\r\n\r\n",[m
[31m-,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: a request with large header and a smaller pipelined request following[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 2 1921;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t"][m
[31m---- more_headers eval[m
[31m-[CORE::join("\n", map { "Header$_: value-$_" } 1..170), "Foo: bar\n"][m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..170) . "\r\n\r\n",[m
[31m-qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-},[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: a request with large header and a smaller pipelined request following[m
[31m---- config[m
[31m-    client_header_buffer_size 10;[m
[31m-    large_client_header_buffers 2 1921;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.print(ngx.req.raw_header())[m
[31m-        ';[m
[31m-    }[m
[31m---- pipelined_requests eval[m
[31m-["GET /t", "GET /t" . ("a" x 512)][m
[31m---- more_headers eval[m
[31m-[CORE::join("\n", map { "Header$_: value-$_" } 1..170), "Foo: bar\n"][m
[31m-[m
[31m---- response_body eval[m
[31m-[qq{GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: keep-alive\r[m
[31m-}[m
[31m-.(CORE::join "\r\n", map { "Header$_: value-$_" } 1..170) . "\r\n\r\n",[m
[31m-qq{GET /t} . ("a" x 512) . qq{ HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Connection: close\r[m
[31m-Foo: bar\r[m
[31m-\r[m
[31m-},[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 5[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/105-pressure.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/105-pressure.t[m
[1mdeleted file mode 100644[m
[1mindex 10f495e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/105-pressure.t[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#log_level('debug');[m
[31m-[m
[31m-repeat_each(20);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-#warn $html_dir;[m
[31m-[m
[31m-our $Id;[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: memory issue in the "args" string option for ngx.location.capture[m
[31m---- config[m
[31m-    location /test1 {[m
[31m-        content_by_lua '[m
[31m-            local res = ngx.location.capture("/test2/auth", {args = ngx.var.args})[m
[31m-            ngx.print(res.body)[m
[31m-        ';[m
[31m-    }[m
[31m-    location /test2 {[m
[31m-        content_by_lua '[m
[31m-            collectgarbage()[m
[31m-            ngx.say(ngx.var.args)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request eval[m
[31m-$::Id = int rand 10000;[m
[31m-"GET /test1?parent=$::Id&name=2013031816214284300707&footprint=dsfasfwefklds"[m
[31m-[m
[31m---- response_body eval[m
[31m-"parent=$::Id&name=2013031816214284300707&footprint=dsfasfwefklds\n"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/106-timer.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/106-timer.t[m
[1mdeleted file mode 100644[m
[1mindex d0f6f36..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/106-timer.t[m
[1m+++ /dev/null[m
[36m@@ -1,2196 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 8 + 72);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-[m
[31m-worker_connections(1024);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple at[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f(premature)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-timer prematurely expired: true[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])\d*, context: ngx\.timer, client: \d+\.\d+\.\d+\.\d+, server: 0\.0\.0\.0:\d+/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"timer prematurely expired: false",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: separated global env[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                foo = 3[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.06)[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-foo = nil[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: lua variable sharing via upvalue[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local foo[m
[31m-            local function f()[m
[31m-                foo = 3[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.06)[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-foo = 3[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: simple at (sleep in the timer callback)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                ngx.sleep(0.02)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.12[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:6[4-9]|7[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: tcp cosocket in timer handler (short connections)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local port = $TEST_NGINX_SERVER_PORT[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    fail("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("connected: ", ok)[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                -- req = "OK"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    fail("failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("request sent: ", bytes)[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if line then[m
[31m-                        print("received: ", line)[m
[31m-[m
[31m-                    else[m
[31m-                        if err == "closed" then[m
[31m-                            break[m
[31m-                        end[m
[31m-                        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-                print("close: ", ok, " ", err)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"connected: 1",[m
[31m-"request sent: 57",[m
[31m-"received: HTTP/1.1 200 OK",[m
[31m-qr/received: Server: \S+/,[m
[31m-"received: Content-Type: text/plain",[m
[31m-"received: Content-Length: 4",[m
[31m-"received: Connection: close",[m
[31m-"received: foo",[m
[31m-"close: 1 nil",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: tcp cosocket in timer handler (keep-alive connections)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: 0 timer[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0(?:[^.]|\.00)/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: udp cosocket in timer handler[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                local socket = ngx.socket[m
[31m-                -- local socket = require "socket"[m
[31m-[m
[31m-                local udp = socket.udp()[m
[31m-[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-                local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    fail("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("connected: ", ok)[m
[31m-[m
[31m-                local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-                local ok, err = udp:send(req)[m
[31m-                if not ok then[m
[31m-                    fail("failed to send: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data, err = udp:receive()[m
[31m-                if not data then[m
[31m-                    fail("failed to receive data: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                print("received ", #data, " bytes: ", data)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"connected: 1",[m
[31m-"received 12 bytes: \x{00}\x{01}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: simple at (sleep in the timer callback) - log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        log_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                ngx.sleep(0.02)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello world[m
[31m-[m
[31m---- wait: 0.12[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-qr/\[lua\] log_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:6[4-9]|7[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: tcp cosocket in timer handler (keep-alive connections) - log_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        log_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: tcp cosocket in timer handler (keep-alive connections) - header_filter_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        header_filter_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: tcp cosocket in timer handler (keep-alive connections) - body_filter_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set keep alive: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-(?:terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-|terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: tcp cosocket in timer handler (keep-alive connections) - set_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $a '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-            return 32[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: coroutine API[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-            local function f()[m
[31m-                function f()[m
[31m-                    local cnt = 0[m
[31m-                    for i = 1, 20 do[m
[31m-                        print("cnt = ", cnt)[m
[31m-                        cy()[m
[31m-                        cnt = cnt + 1[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                local c = cc(f)[m
[31m-                for i=1,3 do[m
[31m-                    cr(c)[m
[31m-                    print("after resume, i = ", i)[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"cnt = 0",[m
[31m-"after resume, i = 1",[m
[31m-"cnt = 1",[m
[31m-"after resume, i = 2",[m
[31m-"cnt = 2",[m
[31m-"after resume, i = 3",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.thread API[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function fail (...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function handle()[m
[31m-                function f()[m
[31m-                    print("hello in thread")[m
[31m-                    return "done"[m
[31m-                end[m
[31m-[m
[31m-                local t, err = ngx.thread.spawn(f)[m
[31m-                if not t then[m
[31m-                    fail("failed to spawn thread: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    fail("failed to run thread: ", res)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("wait result: ", res)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, handle)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"hello in thread",[m
[31m-"thread created: zombie",[m
[31m-"wait result: done",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: shared dict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                dogs:set("foo", 32)[m
[31m-                dogs:set("bah", 10502)[m
[31m-                local val = dogs:get("foo")[m
[31m-                print("get foo: ", val, " ", type(val))[m
[31m-                val = dogs:get("bah")[m
[31m-                print("get bah: ", val, " ", type(val))[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"get foo: 32 number",[m
[31m-"get bah: 10502 number",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.exit(0)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local function g()[m
[31m-                    print("BEFORE ngx.exit")[m
[31m-                    ngx.exit(0)[m
[31m-                end[m
[31m-                g()[m
[31m-                print("CANNOT REACH HERE")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE ngx.exit",[m
[31m-][m
[31m---- no_error_log[m
[31m-CANNOT REACH HERE[m
[31m-API disabled[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.exit(403)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local function g()[m
[31m-                    print("BEFORE ngx.exit")[m
[31m-                    ngx.exit(403)[m
[31m-                end[m
[31m-                g()[m
[31m-                print("CANNOT REACH HERE")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-CANNOT REACH HERE[m
[31m-API disabled[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE ngx.exit",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function handle()[m
[31m-                local function f()[m
[31m-                    print("hello in thread")[m
[31m-                    ngx.sleep(0.1)[m
[31m-                    ngx.exit(0)[m
[31m-                end[m
[31m-[m
[31m-                print("BEFORE thread spawn")[m
[31m-                ngx.thread.spawn(f)[m
[31m-                print("AFTER thread spawn")[m
[31m-                ngx.sleep(1)[m
[31m-                print("entry thread END")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, handle)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out_like chop[m
[31m-(?:create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-free request[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 2|create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-free request[m
[31m-expire timer 100[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-API disabled[m
[31m-entry thread END[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE thread spawn",[m
[31m-"hello in thread",[m
[31m-"AFTER thread spawn",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: chained timers (0 delay)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua ngx.timer expired',[m
[31m-'http lua close fake http connection',[m
[31m-qr/trace: \[m\]\[f\]\[g\], context: ngx\.timer, client: \d+\.\d+\.\d+\.\d+, server: 0\.0\.0\.0:\d+/,[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: chained timers (non-zero delay)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0.01, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: multiple parallel timers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                fail("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, g)[m
[31m-            if not ok then[m
[31m-                fail("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: lua_max_pending_timers[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 1;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-failed to set timer g: too many pending timers[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: lua_max_pending_timers (just not exceeding)[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 2;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: lua_max_pending_timers - chained timers (non-zero delay) - not exceeding[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 1;[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0.01, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: lua_max_pending_timers - chained timers (zero delay) - not exceeding[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 1;[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: lua_max_running_timers (just not enough)[m
[31m---- http_config[m
[31m-    lua_max_running_timers 1;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[alert\] .*? 1 lua_max_running_timers are not enough/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: lua_max_running_timers (just enough)[m
[31m---- http_config[m
[31m-    lua_max_running_timers 2;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: lua_max_running_timers (just enough) - 2[m
[31m---- http_config[m
[31m-    lua_max_running_timers 2;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local f, g[m
[31m-[m
[31m-            g = function ()[m
[31m-                ngx.timer.at(0.02, f)[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-[m
[31m-            f = function ()[m
[31m-                ngx.sleep(0.01)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer f: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, g)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-create 4 in 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 4: ok[m
[31m-delete thread 4[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[error][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: user args[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f(premature, a, b, c)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-                print("timer user args: ", a, " ", b, " ", c)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f, 1, "hello", true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-timer prematurely expired: true[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])\d*, context: ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"timer prematurely expired: false",[m
[31m-"timer user args: 1 hello true",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: use of ngx.ctx[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f(premature)[m
[31m-                ngx.ctx.s = "hello"[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-timer prematurely expired: true[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: .*?, context: ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"timer prematurely expired: false",[m
[31m-"lua release ngx.ctx at ref ",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: syslog error log[m
[31m---- http_config[m
[31m-    #error_log syslog:server=127.0.0.1:12345 error;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.log(ngx.ERR, "Bad bad bad")[m
[31m-            end[m
[31m-            ngx.timer.at(0, f)[m
[31m-            ngx.sleep(0.001)[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- log_level: error[m
[31m---- error_log_file: syslog:server=127.0.0.1:12345[m
[31m---- udp_listen: 12345[m
[31m---- udp_query eval: qr/Bad bad bad/[m
[31m---- udp_reply: hello[m
[31m---- wait: 0.1[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-Bad bad bad[m
[31m---- skip_nginx: 4: < 1.7.1[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/107-timer-errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/107-timer-errors.t[m
[1mdeleted file mode 100644[m
[1mindex 9ed1334..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/107-timer-errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,1423 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 7);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: accessing nginx variables[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                print("uri: ", ngx.var.uri)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: reading ngx.status[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                print("uri: ", ngx.status)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: writing ngx.status[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.status = 200[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.req.raw_header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                print("raw header: ", ngx.req.raw_header())[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.req.get_headers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_headers()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.req.set_header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_header("Foo", 32)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.req.clear_header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.clear_header("Foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.req.set_uri[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_uri("/foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ngx.req.set_uri_args[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_uri_args("foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.redirect()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.redirect("/foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.exec()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.exec("/foo")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.say()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.say("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.print()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.print("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: ngx.flush()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.flush()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.send_headers()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.send_headers()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.req.get_uri_args()[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_uri_args()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: ngx.req.read_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.read_body()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: ngx.req.discard_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.discard_body()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ngx.req.init_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.init_body()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: ngx.header[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.header.Foo = 3[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: ngx.on_abort[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.on_abort(f)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: ngx.location.capture[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.location.capture("/")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: ngx.location.capture_multi[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.location.capture_multi{{"/"}}[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: ngx.req.get_method[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_method()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: ngx.req.set_method[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_method(ngx.HTTP_POST)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: ngx.req.http_version[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.http_version()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: ngx.req.get_post_args[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_post_args()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: ngx.req.get_body_data[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_body_data()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: ngx.req.get_body_file[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.get_body_file()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: ngx.req.set_body_data[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_body_data("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: ngx.req.set_body_file[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.set_body_file("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: ngx.req.append_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.append_body("hello")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 33: ngx.req.finish_body[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.req.finish_body()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 34: ngx.headers_sent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.headers_sent()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the current context/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 35: ngx.eof[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                ngx.eof()[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 36: ngx.req.socket[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local sock, err = ngx.req.socket()[m
[31m-                if not sock then[m
[31m-                    ngx.log(ngx.ERR, "failed to get req sock: ", err)[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[error\] .*? runtime error: content_by_lua\(nginx\.conf:\d+\):3: API disabled in the context of ngx\.timer/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/108-timer-safe.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/108-timer-safe.t[m
[1mdeleted file mode 100644[m
[1mindex 19c9f6d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/108-timer-safe.t[m
[1m+++ /dev/null[m
[36m@@ -1,1398 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 8 + 60);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-[m
[31m-worker_connections(1024);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple at[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.05)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:4[4-9]|5[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: simple at (sleep in the timer callback)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                ngx.sleep(0.02)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.05)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:6[4-9]|7[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: tcp cosocket in timer handler (short connections)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                local port = $TEST_NGINX_SERVER_PORT[m
[31m-                local ok, err = sock:connect("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    fail("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("connected: ", ok)[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                -- req = "OK"[m
[31m-[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    fail("failed to send request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("request sent: ", bytes)[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err, part = sock:receive()[m
[31m-                    if line then[m
[31m-                        print("received: ", line)[m
[31m-[m
[31m-                    else[m
[31m-                        if err == "closed" then[m
[31m-                            break[m
[31m-                        end[m
[31m-                        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-                        break[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                ok, err = sock:close()[m
[31m-                print("close: ", ok, " ", err)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.02)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3 eval: $::GCScript[m
[31m---- stap_out2[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"connected: 1",[m
[31m-"request sent: 57",[m
[31m-"received: HTTP/1.1 200 OK",[m
[31m-qr/received: Server: \S+/,[m
[31m-"received: Content-Type: text/plain",[m
[31m-"received: Content-Length: 4",[m
[31m-"received: Connection: close",[m
[31m-"received: foo",[m
[31m-"close: 1 nil",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: tcp cosocket in timer handler (keep-alive connections)[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.02)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3 eval: $::GCScript[m
[31m---- stap_out2[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: 0 timer[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.02[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] content_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0(?:[^.]|\.00)/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: udp cosocket in timer handler[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                local socket = ngx.socket[m
[31m-                -- local socket = require "socket"[m
[31m-[m
[31m-                local udp = socket.udp()[m
[31m-[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                udp:settimeout(1000) -- 1 sec[m
[31m-[m
[31m-                local ok, err = udp:setpeername("127.0.0.1", port)[m
[31m-                if not ok then[m
[31m-                    fail("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("connected: ", ok)[m
[31m-[m
[31m-                local req = "\\0\\1\\0\\0\\0\\1\\0\\0flush_all\\r\\n"[m
[31m-                local ok, err = udp:send(req)[m
[31m-                if not ok then[m
[31m-                    fail("failed to send: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                local data, err = udp:receive()[m
[31m-                if not data then[m
[31m-                    fail("failed to receive data: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                print("received ", #data, " bytes: ", data)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.05)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /foo {[m
[31m-        content_by_lua 'ngx.say("foo")';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"connected: 1",[m
[31m-"received 12 bytes: \x{00}\x{01}\x{00}\x{00}\x{00}\x{01}\x{00}\x{00}OK\x{0d}\x{0a}"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: simple at (sleep in the timer callback) - log_by_lua[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo hello world;[m
[31m-        echo_sleep 0.07;[m
[31m-        log_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-                ngx.sleep(0.02)[m
[31m-                print("elapsed: ", ngx.now() - begin)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.05, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello world[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-qr/\[lua\] log_by_lua\(nginx\.conf:\d+\):\d+: elapsed: 0\.0(?:6[4-9]|7[0-6])/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection"[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: tcp cosocket in timer handler (keep-alive connections) - log_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        echo_sleep 0.01;[m
[31m-        log_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: tcp cosocket in timer handler (keep-alive connections) - header_filter_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo hello;[m
[31m-        echo_sleep 0.01;[m
[31m-        header_filter_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: tcp cosocket in timer handler (keep-alive connections) - body_filter_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo_sleep 0.01;[m
[31m-        echo hello;[m
[31m-        body_filter_by_lua '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out_like chop[m
[31m-create 2 in 1[m
[31m-create 3 in 1[m
[31m-(?:terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-|terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2)$[m
[31m-[m
[31m---- response_body[m
[31m-hello[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: tcp cosocket in timer handler (keep-alive connections) - set_by_lua[m
[31m---- http_config eval[m
[31m-    "lua_package_path '$::HtmlDir/?.lua;./?.lua';"[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set_by_lua $a '[m
[31m-            local begin = ngx.now()[m
[31m-            local function f()[m
[31m-                print("my lua timer handler")[m
[31m-[m
[31m-                local test = require "test"[m
[31m-                local port = $TEST_NGINX_MEMCACHED_PORT[m
[31m-                test.go(port)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            print("registered timer")[m
[31m-            return 32[m
[31m-        ';[m
[31m-        echo $a;[m
[31m-        echo_sleep 0.01;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-module("test", package.seeall)[m
[31m-[m
[31m-local function fail(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-[m
[31m-function go(port)[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1", port)[m
[31m-    if not ok then[m
[31m-        fail("failed to connect: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    print("connected: ", ok, ", reused: ", sock:getreusedtimes())[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        fail("failed to send request: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    print("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        print("received: ", line)[m
[31m-[m
[31m-    else[m
[31m-        fail("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-[m
[31m-    local ok, err = sock:setkeepalive()[m
[31m-    if not ok then[m
[31m-        fail("failed to set reusable: ", err)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap3[m
[31m-global count = 0[m
[31m-F(ngx_http_lua_header_filter) {[m
[31m-    if (count++ == 10) {[m
[31m-        println("header filter")[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-[m
[31m---- response_body[m
[31m-32[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"registered timer",[m
[31m-qr/\[lua\] .*? my lua timer handler/,[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-qr/go\(\): connected: 1, reused: \d+/,[m
[31m-"go(): request sent: 11",[m
[31m-"go(): received: OK",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: coroutine API[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-            local function f()[m
[31m-                function f()[m
[31m-                    local cnt = 0[m
[31m-                    for i = 1, 20 do[m
[31m-                        print("cnt = ", cnt)[m
[31m-                        cy()[m
[31m-                        cnt = cnt + 1[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                local c = cc(f)[m
[31m-                for i=1,3 do[m
[31m-                    cr(c)[m
[31m-                    print("after resume, i = ", i)[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.01)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"cnt = 0",[m
[31m-"after resume, i = 1",[m
[31m-"cnt = 1",[m
[31m-"after resume, i = 2",[m
[31m-"cnt = 2",[m
[31m-"after resume, i = 3",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: ngx.thread API[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function fail (...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-            local function handle()[m
[31m-                function f()[m
[31m-                    print("hello in thread")[m
[31m-                    return "done"[m
[31m-                end[m
[31m-[m
[31m-                local t, err = ngx.thread.spawn(f)[m
[31m-                if not t then[m
[31m-                    fail("failed to spawn thread: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-                collectgarbage()[m
[31m-[m
[31m-                local ok, res = ngx.thread.wait(t)[m
[31m-                if not ok then[m
[31m-                    fail("failed to run thread: ", res)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                print("wait result: ", res)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, handle)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.02)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"hello in thread",[m
[31m-"thread created: zombie",[m
[31m-"wait result: done",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: shared dict[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 1m;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local dogs = ngx.shared.dogs[m
[31m-                dogs:set("foo", 32)[m
[31m-                dogs:set("bah", 10502)[m
[31m-                local val = dogs:get("foo")[m
[31m-                print("get foo: ", val, " ", type(val))[m
[31m-                val = dogs:get("bah")[m
[31m-                print("get bah: ", val, " ", type(val))[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.02)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"get foo: 32 number",[m
[31m-"get bah: 10502 number",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: ngx.exit(0)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local function g()[m
[31m-                    print("BEFORE ngx.exit")[m
[31m-                    ngx.exit(0)[m
[31m-                end[m
[31m-                g()[m
[31m-                print("CANNOT REACH HERE")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.01)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE ngx.exit",[m
[31m-][m
[31m---- no_error_log[m
[31m-CANNOT REACH HERE[m
[31m-API disabled[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: ngx.exit(403)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function f()[m
[31m-                local function g()[m
[31m-                    print("BEFORE ngx.exit")[m
[31m-                    ngx.exit(403)[m
[31m-                end[m
[31m-                g()[m
[31m-                print("CANNOT REACH HERE")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.01)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2[m
[31m-F(ngx_http_lua_timer_handler) {[m
[31m-    println("lua timer handler")[m
[31m-}[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-CANNOT REACH HERE[m
[31m-API disabled[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE ngx.exit",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: exit in user thread (entry thread is still pending on ngx.sleep)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function handle()[m
[31m-                local function f()[m
[31m-                    print("hello in thread")[m
[31m-                    ngx.sleep(0.1)[m
[31m-                    ngx.exit(0)[m
[31m-                end[m
[31m-[m
[31m-                print("BEFORE thread spawn")[m
[31m-                ngx.thread.spawn(f)[m
[31m-                print("AFTER thread spawn")[m
[31m-                ngx.sleep(1)[m
[31m-                print("entry thread END")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, handle)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            ngx.sleep(0.12)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap eval[m
[31m-<<'_EOC_' . $::GCScript;[m
[31m-[m
[31m-global timers[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    println("free request")[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    if ($arg2 == 1000 || $arg2 == 100) {[m
[31m-        timers[$arg1] = $arg2[m
[31m-        printf("add timer %d\n", $arg2)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("delete timer %d\n", tm)[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-    /*[m
[31m-    if (tm == 1000) {[m
[31m-        print_ubacktrace()[m
[31m-    }[m
[31m-    */[m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    tm = timers[$arg1][m
[31m-    if (tm == 1000 || tm == 100) {[m
[31m-        printf("expire timer %d\n", timers[$arg1])[m
[31m-        delete timers[$arg1][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_cleanup) {[m
[31m-    println("lua sleep cleanup")[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-spawn user thread 3 in 2[m
[31m-add timer 100[m
[31m-add timer 1000[m
[31m-expire timer 100[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-lua sleep cleanup[m
[31m-delete timer 1000[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-free request[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-API disabled[m
[31m-entry thread END[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-"lua ngx.timer expired",[m
[31m-"http lua close fake http connection",[m
[31m-"BEFORE thread spawn",[m
[31m-"hello in thread",[m
[31m-"AFTER thread spawn",[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: chained timers (non-zero delay)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local s = ""[m
[31m-[m
[31m-            local function fail(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-            end[m
[31m-[m
[31m-            local function g()[m
[31m-                s = s .. "[g]"[m
[31m-                print("trace: ", s)[m
[31m-            end[m
[31m-[m
[31m-            local function f()[m
[31m-                local ok, err = ngx.timer.at(0.01, g)[m
[31m-                if not ok then[m
[31m-                    fail("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                s = s .. "[f]"[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0.01, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            s = "[m]"[m
[31m-            ngx.sleep(0.03)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-create 3 in 2[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 3: ok[m
[31m-delete thread 3[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-[m
[31m---- error_log[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-trace: [m][f][g][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/109-timer-hup.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/109-timer-hup.t[m
[1mdeleted file mode 100644[m
[1mindex 15aaa0e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/109-timer-hup.t[m
[1m+++ /dev/null[m
[36m@@ -1,503 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-our $SkipReason;[m
[31m-[m
[31m-BEGIN {[m
[31m-    if ($ENV{TEST_NGINX_CHECK_LEAK}) {[m
[31m-        $SkipReason = "unavailable for the hup tests";[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{TEST_NGINX_USE_HUP} = 1;[m
[31m-        undef $ENV{TEST_NGINX_USE_STAP};[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua $SkipReason ? (skip_all => $SkipReason) : ();[m
[31m-[m
[31m-[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 81;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_HTML_DIR} = $HtmlDir;[m
[31m-[m
[31m-worker_connections(1024);[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: single timer[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local i = 0[m
[31m-            local function f(premature)[m
[31m-                i = i + 1[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-                print("in callback: hello, ", i)[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(3, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-timer prematurely expired: false[m
[31m-[m
[31m---- error_log[m
[31m-lua abort pending timers[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-in callback: hello, 1[m
[31m-timer prematurely expired: true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: multiple timers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local i = 0[m
[31m-            local function f(premature)[m
[31m-                i = i + 1[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-                print("in callback: hello, ", i, "!")[m
[31m-            end[m
[31m-            for i = 1, 10 do[m
[31m-                local ok, err = ngx.timer.at(3, f)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("registered timers")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timers[m
[31m-[m
[31m---- wait: 0.3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 11![m
[31m-timer prematurely expired: false[m
[31m-[m
[31m---- error_log[m
[31m-lua abort pending timers[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-in callback: hello, 1![m
[31m-in callback: hello, 2![m
[31m-in callback: hello, 3![m
[31m-in callback: hello, 4![m
[31m-in callback: hello, 5![m
[31m-in callback: hello, 6![m
[31m-in callback: hello, 7![m
[31m-in callback: hello, 8![m
[31m-in callback: hello, 9![m
[31m-in callback: hello, 10![m
[31m-timer prematurely expired: true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: trying to add new timer after HUP reload[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local function f(premature)[m
[31m-                print("timer prematurely expired: ", premature)[m
[31m-                local ok, err = ngx.timer.at(3, f)[m
[31m-                if not ok then[m
[31m-                    print("failed to register a new timer after reload: ", err)[m
[31m-                else[m
[31m-                    print("registered a new timer after reload")[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(3, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-timer prematurely expired: false[m
[31m-[m
[31m---- error_log[m
[31m-lua abort pending timers[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-timer prematurely expired: true[m
[31m-failed to register a new timer after reload: process exiting, context: ngx.timer[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: trying to add new timer after HUP reload[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local function g(premature)[m
[31m-                print("g: timer prematurely expired: ", premature)[m
[31m-                print("g: exiting=", ngx.worker.exiting())[m
[31m-            end[m
[31m-[m
[31m-            local function f(premature)[m
[31m-                print("f: timer prematurely expired: ", premature)[m
[31m-                print("f: exiting=", ngx.worker.exiting())[m
[31m-                local ok, err = ngx.timer.at(0, g)[m
[31m-                if not ok then[m
[31m-                    print("f: failed to register a new timer after reload: ", err)[m
[31m-                else[m
[31m-                    print("f: registered a new timer after reload")[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(3, f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("registered timer")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-registered timer[m
[31m-[m
[31m---- wait: 0.2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-failed to register a new timer after reload[m
[31m-[m
[31m---- error_log[m
[31m-lua abort pending timers[m
[31m-lua ngx.timer expired[m
[31m-http lua close fake http connection[m
[31m-f: timer prematurely expired: true[m
[31m-f: registered a new timer after reload[m
[31m-f: exiting=true[m
[31m-g: timer prematurely expired: false[m
[31m-g: exiting=true[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: HUP reload should abort pending timers[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-            if not f then[m
[31m-                ngx.say("failed to open nginx.pid: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pid = f:read()[m
[31m-            -- ngx.say("master pid: [", pid, "]")[m
[31m-[m
[31m-            f:close()[m
[31m-[m
[31m-            local function f(premature)[m
[31m-                print("f: timer prematurely expired: ", premature)[m
[31m-                print("f: exiting=", ngx.worker.exiting())[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 100 do[m
[31m-                local ok, err = ngx.timer.at(3 + i, f)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set timer: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-            os.execute("kill -HUP " .. pid)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- wait: 0.5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-failed to register a new timer after reload[m
[31m-[m
[31m---- grep_error_log eval: qr/lua found \d+ pending timers/[m
[31m---- grep_error_log_out[m
[31m-lua found 100 pending timers[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: HUP reload should abort pending timers (coroutine + cosocket)[m
[31m---- http_config[m
[31m-    lua_shared_dict test_dict 1m;[m
[31m-[m
[31m-    server {[m
[31m-        listen 12355;[m
[31m-        location = /foo {[m
[31m-            echo 'foo';[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local http_req = {"GET /foo HTTP/1.1", "Host: localhost:1234", "", ""}[m
[31m-            http_req = table.concat(http_req, "\\r\\n")[m
[31m-[m
[31m-            -- Connect the socket[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok,err = sock:connect("127.0.0.1", 12355)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, err)[m
[31m-            end[m
[31m-[m
[31m-            -- Send the request[m
[31m-            local ok,err = sock:send(http_req)[m
[31m-[m
[31m-            -- Get Headers[m
[31m-            repeat[m
[31m-                local line, err = sock:receive("*l")[m
[31m-            until not line or string.find(line, "^%s*$")[m
[31m-[m
[31m-            function foo()[m
[31m-                repeat[m
[31m-                    -- Get and read chunk[m
[31m-                    local line, err = sock:receive("*l")[m
[31m-                    local len = tonumber(line)[m
[31m-                    if len > 0 then[m
[31m-                        local chunk, err = sock:receive(len)[m
[31m-                        coroutine.yield(chunk)[m
[31m-                        sock:receive(2)[m
[31m-                    else[m
[31m-                        -- Read last newline[m
[31m-                        sock:receive(2)[m
[31m-                    end[m
[31m-                until len == 0[m
[31m-            end[m
[31m-[m
[31m-            co = coroutine.create(foo)[m
[31m-            repeat[m
[31m-                local chunk = select(2,coroutine.resume(co))[m
[31m-            until chunk == nil[m
[31m-[m
[31m-            -- Breaks the timer[m
[31m-            sock:setkeepalive()[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-[m
[31m-        log_by_lua '[m
[31m-            local background_thread[m
[31m-            background_thread = function(premature)[m
[31m-                ngx.log(ngx.DEBUG, premature)[m
[31m-                if premature then[m
[31m-                    ngx.shared["test_dict"]:delete("background_flag")[m
[31m-                    return[m
[31m-                end[m
[31m-                local ok, err = ngx.timer.at(1, background_thread)[m
[31m-[m
[31m-                local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-                if not f then[m
[31m-                    ngx.say("failed to open nginx.pid: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                local pid = f:read()[m
[31m-                -- ngx.say("master pid: [", pid, "]")[m
[31m-                f:close()[m
[31m-[m
[31m-                os.execute("kill -HUP " .. pid)[m
[31m-            end[m
[31m-            local dict = ngx.shared["test_dict"][m
[31m-[m
[31m-            if dict:get("background_flag") == nil then[m
[31m-                local ok, err = ngx.timer.at(0, background_thread)[m
[31m-                if ok then[m
[31m-                    dict:set("test_dict", 1)[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- wait: 0.3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[crit][m
[31m-in callback: hello, 2[m
[31m-failed to register a new timer after reload[m
[31m-[m
[31m---- grep_error_log eval: qr/lua found \d+ pending timers/[m
[31m---- grep_error_log_out[m
[31m-lua found 1 pending timers[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: HUP reload should abort pending timers (fuzz test)[m
[31m---- http_config[m
[31m-    lua_max_pending_timers 8192;[m
[31m-[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local job = function(premature, kill)[m
[31m-                if premature then[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                if kill then[m
[31m-                    local f, err = io.open("t/servroot/logs/nginx.pid", "r")[m
[31m-                    if not f then[m
[31m-                        ngx.log(ngx.ERR, "failed to open nginx.pid: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    local pid = f:read()[m
[31m-                    -- ngx.say("master pid: [", pid, "]")[m
[31m-                    f:close()[m
[31m-[m
[31m-                    os.execute("kill -HUP " .. pid)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            math.randomseed(ngx.time())[m
[31m-            local rand = math.random[m
[31m-            local newtimer = ngx.timer.at[m
[31m-            for i = 1, 8191 do[m
[31m-                local delay = rand(4096)[m
[31m-                local ok, err = newtimer(delay, job, false)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to create timer at ", delay, ": ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            local ok, err = newtimer(0, job, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to create the killer timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- wait: 0.3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m---- grep_error_log eval: qr/lua found \d+ pending timers/[m
[31m---- grep_error_log_out[m
[31m-lua found 8191 pending timers[m
[31m---- timeout: 20[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/110-etag.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/110-etag.t[m
[1mdeleted file mode 100644[m
[1mindex 351fec4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/110-etag.t[m
[1m+++ /dev/null[m
[36m@@ -1,84 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: If-None-Match true[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.header["ETag"] = "123456789"[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.say(ngx.var.http_if_none_match)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: 123456789[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m---- error_code: 304[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: If-None-Match false[m
[31m---- config[m
[31m-    location /t {[m
[31m-        etag on;[m
[31m-        content_by_lua '[m
[31m-            ngx.header["ETag"] = "123456789"[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.say(ngx.var.http_if_none_match)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: 123456780[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m-123456780[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- skip_nginx: 3: < 1.3.3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: Etag clear[m
[31m---- config[m
[31m-    location /t {[m
[31m-        etag on;[m
[31m-        content_by_lua '[m
[31m-            ngx.header["ETag"] = "123456789"[m
[31m-            ngx.header.last_modified = "Thu, 10 May 2012 07:50:59 GMT"[m
[31m-            ngx.header["ETag"] = nil[m
[31m-            ngx.say(ngx.var.http_if_none_match)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-If-None-Match: 123456789[m
[31m-If-Modified-Since: Thu, 10 May 2012 07:50:59 GMT[m
[31m---- response_body[m
[31m-123456789[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- skip_nginx: 3: < 1.3.3[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/111-req-header-ua.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/111-req-header-ua.t[m
[1mdeleted file mode 100644[m
[1mindex 7c980d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/111-req-header-ua.t[m
[1m+++ /dev/null[m
[36m@@ -1,676 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear Opera user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.62[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: opera: %d\n", $r->headers_in->opera)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: opera: %d\n", $r->headers_in->opera)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: opera: 1[m
[31m-content: opera: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear MSIE 4 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set custom MSIE 4 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: clear MSIE 5 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set custom MSIE 5 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: clear MSIE 6 (without SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=1[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: set custom MSIE 6 (without SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: clear MSIE 6 (with SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=1 msie6=0[m
[31m-content: msie=0 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set custom MSIE 6 (with SV1) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set custom MSIE 7 user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; winfx; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Zune 2.0)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: msie=%d msie6=%d\n",[m
[31m-           $r->headers_in->msie,[m
[31m-           $r->headers_in->msie6)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: msie=0 msie6=0[m
[31m-content: msie=1 msie6=0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; winfx; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Zune 2.0)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: clear Gecko user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: gecko: 1[m
[31m-content: gecko: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set custom Gecko user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0")[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: gecko: %d\n", $r->headers_in->gecko)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: gecko: 0[m
[31m-content: gecko: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: clear Chrome user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: chrome: 1[m
[31m-content: chrome: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: set custom Chrome user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19")[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: chrome: %d\n", $r->headers_in->chrome)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: chrome: 0[m
[31m-content: chrome: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: clear Safari (Mac OS X) user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: safari: 1[m
[31m-content: safari: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: set custom Safari user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: safari: %d\n", $r->headers_in->safari)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: safari: 0[m
[31m-content: safari: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: clear Konqueror user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", nil)[m
[31m-[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- more_headers[m
[31m-User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: konqueror: 1[m
[31m-content: konqueror: 0[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: set custom Konqueror user-agent[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("User-Agent", "Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)")[m
[31m-        ';[m
[31m-        echo "User-Agent: $http_user_agent";[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: konqueror: %d\n", $r->headers_in->konqueror)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: konqueror: 0[m
[31m-content: konqueror: 1[m
[31m-[m
[31m---- response_body[m
[31m-User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Kubuntu)[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/112-req-header-conn.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/112-req-header-conn.t[m
[1mdeleted file mode 100644[m
[1mindex 51df730..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/112-req-header-conn.t[m
[1m+++ /dev/null[m
[36m@@ -1,149 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear the Connection req header[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Connection", nil);[m
[31m-        ';[m
[31m-[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 0[m
[31m-[m
[31m---- response_body[m
[31m-connection: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: set custom Connection req header (close)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Connection", "CLOSE");[m
[31m-        ';[m
[31m-[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 1[m
[31m-[m
[31m---- response_body[m
[31m-connection: CLOSE[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set custom Connection req header (keep-alive)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Connection", "keep-alive");[m
[31m-        ';[m
[31m-[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 2[m
[31m-[m
[31m---- response_body[m
[31m-connection: keep-alive[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set custom Connection req header (bad)[m
[31m---- config[m
[31m-    location /req-header {[m
[31m-        rewrite_by_lua '[m
[31m-            ngx.req.set_header("Connection", "bad");[m
[31m-        ';[m
[31m-[m
[31m-        echo "connection: $http_connection";[m
[31m-    }[m
[31m---- request[m
[31m-GET /req-header[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: conn type: %d\n", $r->headers_in->connection_type)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: conn type: 1[m
[31m-content: conn type: 0[m
[31m-[m
[31m---- response_body[m
[31m-connection: bad[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/113-req-header-cookie.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/113-req-header-cookie.t[m
[1mdeleted file mode 100644[m
[1mindex b26b709..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/113-req-header-cookie.t[m
[1m+++ /dev/null[m
[36m@@ -1,250 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (4 * blocks());[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clear cookie (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", nil)[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 0[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: clear cookie (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", nil)[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 0[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie: [m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: set one custom cookie (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", "boo=123")[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 1[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: set one custom cookie (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", "boo=123")[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 1[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: [m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: set multiple custom cookies (with existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", {"boo=123","foo=78"})[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- more_headers[m
[31m-Cookie: foo=bar[m
[31m-Cookie: baz=blah[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 2[m
[31m-content: cookies: 2[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: 78[m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123; foo=78[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: set multiple custom cookies (without existing cookies)[m
[31m---- config[m
[31m-    location /t {[m
[31m-        rewrite_by_lua '[m
[31m-           ngx.req.set_header("Cookie", {"boo=123", "foo=bar"})[m
[31m-        ';[m
[31m-        echo "Cookie foo: $cookie_foo";[m
[31m-        echo "Cookie baz: $cookie_baz";[m
[31m-        echo "Cookie boo: $cookie_boo";[m
[31m-        echo "Cookie: $http_cookie";[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- stap[m
[31m-F(ngx_http_lua_rewrite_by_chunk) {[m
[31m-    printf("rewrite: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_core_content_phase) {[m
[31m-    printf("content: cookies: %d\n", $r->headers_in->cookies->nelts)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-rewrite: cookies: 0[m
[31m-content: cookies: 2[m
[31m-[m
[31m---- response_body[m
[31m-Cookie foo: bar[m
[31m-Cookie baz: [m
[31m-Cookie boo: 123[m
[31m-Cookie: boo=123; foo=bar[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/114-config.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/114-config.t[m
[1mdeleted file mode 100644[m
[1mindex 9d6680d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/114-config.t[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: ngx.config.debug[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("debug: ", ngx.config.debug)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^debug: (?:true|false)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx.config.subystem[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("subsystem: ", ngx.config.subsystem)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-subsystem: http[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/115-quote-sql-str.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/115-quote-sql-str.t[m
[1mdeleted file mode 100644[m
[1mindex 0c20dfb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/115-quote-sql-str.t[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#log_level("warn");[m
[31m-no_long_string();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: \0[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.quote_sql_str("a\\0b\\0"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'a\0b\0'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: \t[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.quote_sql_str("a\\tb\\t"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'a\tb\t'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: \b[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.quote_sql_str("a\\bb\\b"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'a\bb\b'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: \Z[m
[31m---- config[m
[31m-    location = /set {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.quote_sql_str("a\\026b\\026"))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /set[m
[31m---- response_body[m
[31m-'a\Zb\Z'[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/116-raw-req-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/116-raw-req-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 6518f0e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/116-raw-req-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,879 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 40;[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-                ngx.say("no response header found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local msg, err = sock:receive()[m
[31m-            if not msg then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("msg: ", msg)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /mysock {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("1: received: " .. data .. "\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-msg: 1: received: hello[m
[31m---- grep_error_log: lua socket tcp_nodelay[m
[31m---- grep_error_log_out[m
[31m-lua socket tcp_nodelay[m
[31m-lua socket tcp_nodelay[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: header not sent yet[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\nhello")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- response_headers[m
[31m-Content-Length: 5[m
[31m---- response_body chop[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: http 1.0 buffering[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2[m
[31m-F(ngx_http_header_filter) {[m
[31m-    println("header filter")[m
[31m-}[m
[31m-F(ngx_http_lua_req_socket) {[m
[31m-    println("lua req socket")[m
[31m-}[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-server: failed to get raw req socket: http 1.0 buffering[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple raw req sockets[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local sock2, err = ngx.req.socket(true)[m
[31m-            if not sock2 then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket2: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- stap2[m
[31m-F(ngx_http_header_filter) {[m
[31m-    println("header filter")[m
[31m-}[m
[31m-F(ngx_http_lua_req_socket) {[m
[31m-    println("lua req socket")[m
[31m-}[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-server: failed to get raw req socket2: duplicate call[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.say after ngx.req.socket(true)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.say("ok")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to say: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to say: raw request socket acquired[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.print after ngx.req.socket(true)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.print("ok")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to print: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to print: raw request socket acquired[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.eof after ngx.req.socket(true)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.eof()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to eof: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to eof: raw request socket acquired[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.flush after ngx.req.socket(true)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = ngx.flush()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to flush: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-\r[m
[31m-hello"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-failed to flush: raw request socket acquired[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: receive timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    postpone_output 1;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.flush(true)[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(100)[m
[31m-[m
[31m-            local data, err, partial = sock:receive(10)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: 1: failed to receive: ", err, ", received: ", partial)[m
[31m-            end[m
[31m-[m
[31m-            data, err, partial = sock:receive(10)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: 2: failed to receive: ", err, ", received: ", partial)[m
[31m-            end[m
[31m-[m
[31m-            ngx.exit(444)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-ab"[m
[31m---- ignore_response[m
[31m---- wait: 0.1[m
[31m---- error_log[m
[31m-lua tcp socket read timed out[m
[31m-server: 1: failed to receive: timeout, received: ab,[m
[31m-server: 2: failed to receive: timeout, received: ,[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: on_abort called during ngx.sleep()[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_check_client_abort on;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-                ngx.say("no response header found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local msg, err = sock:receive()[m
[31m-            if not msg then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("msg: ", msg)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /mysock {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function (premature) ngx.log(ngx.WARN, "mysock handler aborted") end)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set on_abort handler: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("1: received: " .. data .. "\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.sleep(1)[m
[31m-        ';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-msg: 1: received: hello[m
[31m---- error_log[m
[31m-mysock handler aborted[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- wait: 1.1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: on_abort called during sock:receive()[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_check_client_abort on;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-                ngx.say("no response header found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local msg, err = sock:receive()[m
[31m-            if not msg then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("msg: ", msg)[m
[31m-[m
[31m-            ngx.sleep(0.1)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /mysock {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-[m
[31m-            local ok, err = ngx.on_abort(function (premature) ngx.log(ngx.WARN, "mysock handler aborted") end)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set on_abort handler: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("1: received: " .. data .. "\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.WARN, "failed to receive a line: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-msg: 1: received: hello[m
[31m---- error_log[m
[31m-failed to receive a line: client aborted[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- wait: 0.1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: receiveuntil[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_SERVER_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send(", ")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send packet 1: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("world")[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send packet 2: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("\\r\\n\\r\\n")[m
[31m-            local data, err, partial = reader()[m
[31m-            if not data then[m
[31m-                ngx.say("no response header found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local msg, err = sock:receive()[m
[31m-            if not msg then[m
[31m-                ngx.say("failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("msg: ", msg)[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to close socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m-    location = /mysock {[m
[31m-        content_by_lua '[m
[31m-            ngx.status = 101[m
[31m-            ngx.send_headers()[m
[31m-            ngx.flush(true)[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local reader = sock:receiveuntil("rld")[m
[31m-            local data, err = reader()[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "server: failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("1: received: " .. data .. "\\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-msg: 1: received: hello, wo[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: request body not read yet[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\n" .. data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hello"[m
[31m---- response_headers[m
[31m-Content-Length: 5[m
[31m---- response_body chop[m
[31m-hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: pending request body reading[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.thread.spawn(function ()[m
[31m-                ngx.req.read_body()[m
[31m-            end)[m
[31m-[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.WARN, "server: failed to get raw req socket: ", err)[m
[31m-                return ngx.exit(444)[m
[31m-            end[m
[31m-[m
[31m-            local data, err = sock:receive(5)[m
[31m-            if not data then[m
[31m-                ngx.log(ngx.ERR, "failed to receive: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\n" .. data)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to send: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.0\r[m
[31m-Host: localhost\r[m
[31m-Content-Length: 5\r[m
[31m-\r[m
[31m-hell"[m
[31m---- ignore_response[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- error_log[m
[31m-server: failed to get raw req socket: pending request body reading in some other thread[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: read chunked request body with raw req socket[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "failed to new: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local function err(...)[m
[31m-                ngx.log(ngx.ERR, ...)[m
[31m-                return ngx.exit(400)[m
[31m-            end[m
[31m-            local num = tonumber[m
[31m-            local MAX_CHUNKS = 1000[m
[31m-            local eof = false[m
[31m-            local chunks = {}[m
[31m-            for i = 1, MAX_CHUNKS do[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    err("failed to receive chunk size: ", err)[m
[31m-                end[m
[31m-[m
[31m-                local size = num(line, 16)[m
[31m-                if not size then[m
[31m-                    err("bad chunk size: ", line)[m
[31m-                end[m
[31m-[m
[31m-                if size == 0 then -- last chunk[m
[31m-                    -- receive the last line[m
[31m-                    line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        err("failed to receive last chunk: ", err)[m
[31m-                    end[m
[31m-[m
[31m-                    if line ~= "" then[m
[31m-                        err("bad last chunk: ", line)[m
[31m-                    end[m
[31m-[m
[31m-                    eof = true[m
[31m-                    break[m
[31m-                end[m
[31m-[m
[31m-                local chunk, err = sock:receive(size)[m
[31m-                if not chunk then[m
[31m-                    err("failed to receive chunk of size ", size, ": ", err)[m
[31m-                end[m
[31m-[m
[31m-                local data, err = sock:receive(2)[m
[31m-                if not data then[m
[31m-                    err("failed to receive chunk terminator: ", err)[m
[31m-                end[m
[31m-[m
[31m-                if data ~= "\\r\\n" then[m
[31m-                    err("bad chunk terminator: ", data)[m
[31m-                end[m
[31m-[m
[31m-                chunks[i] = chunk[m
[31m-            end[m
[31m-[m
[31m-            if not eof then[m
[31m-                err("too many chunks (more than ", MAX_CHUNKS, ")")[m
[31m-            end[m
[31m-[m
[31m-            local concat = table.concat[m
[31m-            local body = concat{"got ", #chunks, " chunks.\\nrequest body: "}[m
[31m-                         .. concat(chunks) .. "\\n"[m
[31m-            local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nConnection: close\\r\\nContent-Length: "[m
[31m-                            .. #body .. "\\r\\n\\r\\n" .. body)[m
[31m-            if not ok then[m
[31m-                err("failed to send response: ", err)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Transfer-Encoding: chunked\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-5\r[m
[31m-hey, \r[m
[31m-b\r[m
[31m-hello world\r[m
[31m-0\r[m
[31m-\r[m
[31m-"[m
[31m---- response_body[m
[31m-got 2 chunks.[m
[31m-request body: hey, hello world[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/117-raw-req-socket-timeout.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/117-raw-req-socket-timeout.t[m
[1mdeleted file mode 100644[m
[1mindex 4e3929b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/117-raw-req-socket-timeout.t[m
[1m+++ /dev/null[m
[36m@@ -1,117 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'hello, world';[m
[31m-    $ENV{TEST_NGINX_POSTPONE_OUTPUT} = 1;[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: pending response header data[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    postpone_output 1;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.req.read_body()[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- stap2[m
[31m-F(ngx_http_header_filter) {[m
[31m-    println("header filter")[m
[31m-}[m
[31m-F(ngx_http_lua_req_socket) {[m
[31m-    println("lua req socket")[m
[31m-}[m
[31m---- response_body[m
[31m---- error_log[m
[31m-server: failed to get raw req socket: pending data to write[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: send timeout[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    postpone_output 1;[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.send_headers()[m
[31m-            ngx.req.read_body()[m
[31m-            ngx.flush(true)[m
[31m-            local sock, err = ngx.req.socket(true)[m
[31m-            if not sock then[m
[31m-                ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            sock:settimeout(100)[m
[31m-            local ok, err = sock:send("hello, world!")[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "server: failed to send: ", err)[m
[31m-            end[m
[31m-            ngx.exit(444)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- raw_request eval[m
[31m-"GET /t HTTP/1.1\r[m
[31m-Host: localhost\r[m
[31m-Upgrade: mysocket\r[m
[31m-Connection: close\r[m
[31m-\r[m
[31m-"[m
[31m---- ignore_response[m
[31m---- error_log[m
[31m-lua tcp socket write timed out[m
[31m-server: failed to send: timeout[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/118-use-default-type.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/118-use-default-type.t[m
[1mdeleted file mode 100644[m
[1mindex 6008d65..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/118-use-default-type.t[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-#no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: lua_use_default_type default on[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: lua_use_default_type explicitly on[m
[31m---- config[m
[31m-    lua_use_default_type on;[m
[31m-    location /lua {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: lua_use_default_type off[m
[31m---- config[m
[31m-    lua_use_default_type off;[m
[31m-    location /lua {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: overriding lua_use_default_type off[m
[31m---- config[m
[31m-    lua_use_default_type off;[m
[31m-    location /lua {[m
[31m-        lua_use_default_type on;[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: overriding lua_use_default_type on[m
[31m---- config[m
[31m-    lua_use_default_type on;[m
[31m-    location /lua {[m
[31m-        lua_use_default_type off;[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.say("hello")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-hello[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: lua_use_default_type on does not set content type on 304[m
[31m---- config[m
[31m-    lua_use_default_type on;[m
[31m-    location /lua {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            ngx.status = ngx.HTTP_NOT_MODIFIED[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m---- response_headers[m
[31m-!Content-Type[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_code: 304[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/119-config-prefix.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/119-config-prefix.t[m
[1mdeleted file mode 100644[m
[1mindex 4581aa1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/119-config-prefix.t[m
[1m+++ /dev/null[m
[36m@@ -1,33 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("prefix: ", ngx.config.prefix())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^prefix: \/\S+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/120-re-find.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/120-re-find.t[m
[1mdeleted file mode 100644[m
[1mindex 34c0207..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/120-re-find.t[m
[1m+++ /dev/null[m
[36m@@ -1,893 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9]+)", "jo")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 8[m
[31m-to: 11[m
[31m-matched: 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: empty matched string[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, world"[m
[31m-            local from, to, err = ngx.re.find(s, "[0-9]*")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 0[m
[31m-matched: [m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: multiple captures (with o)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([a-z]+).*?([0-9]{2})[0-9]+", "o")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 11[m
[31m-matched: hello, 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: not matched[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "foo")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: case sensitive by default[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local from = ngx.re.find("hello, 1234", "HELLO")[m
[31m-            if from then[m
[31m-                ngx.say(from)[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: case insensitive[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "HELLO", "i")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 5[m
[31m-matched: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: UTF-8 mode[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello章亦春"[m
[31m-            local from, to, err = ngx.re.find(s, "HELLO.{2}", "iu")[m
[31m-            if not from then[m
[31m-                ngx.say("FAIL: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say(string.sub(s, from, to))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like chop[m
[31m-^(?:FAIL: bad argument \#2 to '\?' \(pcre_compile\(\) failed: this version of PCRE is not compiled with PCRE_UTF8 support in "HELLO\.\{2\}" at "HELLO\.\{2\}"\)|hello章亦)$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: multi-line mode (^ at line head)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, "^world", "m")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 7[m
[31m-to: 11[m
[31m-matched: world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: multi-line mode (. does not match \n)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, ".*", "m")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 5[m
[31m-matched: hello[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: single-line mode (^ as normal)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, "^world", "s")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: single-line mode (dot all)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, ".*", "s")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 11[m
[31m-matched: hello[m
[31m-world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: extended mode (ignore whitespaces)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, "\\\\w     \\\\w", "x")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 2[m
[31m-matched: he[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: bad pattern[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, "(abc")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("not matched.")[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_compile() failed: missing ) in "(abc"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: bad option[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello\\nworld"[m
[31m-            local from, to, err = ngx.re.find(s, ".*", "H")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-unknown flag "H"[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: anchored match (failed)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9]+)", "a")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: anchored match (succeeded)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "1234, hello"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9]+)", "a")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 4[m
[31m-matched: 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: match with ctx but no pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = {}[m
[31m-            local from, to = ngx.re.find("1234, hello", "([0-9]+)", "", ctx)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 4[m
[31m-pos: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: match with ctx and a pos[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local ctx = { pos = 3 }[m
[31m-            local from, to, err = ngx.re.find("1234, hello", "([0-9]+)", "", ctx)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-            else[m
[31m-                ngx.say("not matched!")[m
[31m-                ngx.say("pos: ", ctx.pos)[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 3[m
[31m-to: 4[m
[31m-pos: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: named subpatterns w/ extraction[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "(?<first>[a-z]+), [0-9]+")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 11[m
[31m-matched: hello, 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: bad UTF-8[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local target = "你好"[m
[31m-            local regex = "你好"[m
[31m-[m
[31m-            local from, to, err = ngx.re.find(string.sub(target, 1, 4), regex, "u")[m
[31m-[m
[31m-            if err then[m
[31m-                ngx.say("error: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            if m then[m
[31m-                ngx.say("matched: ", from)[m
[31m-            else[m
[31m-                ngx.say("not matched")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^error: pcre_exec\(\) failed: -10$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: UTF-8 mode without UTF-8 sequence checks[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "你好"[m
[31m-            local from, to, err = ngx.re.find(s, ".", "U")[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-[m
[31m-            else[m
[31m-                ngx.say("not matched.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- stap[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_compile") {[m
[31m-    printf("compile opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m-probe process("$LIBPCRE_PATH").function("pcre_exec") {[m
[31m-    printf("exec opts: %x\n", $options)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-compile opts: 800[m
[31m-exec opts: 2000[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 1[m
[31m-to: 3[m
[31m-matched: 你[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: just hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5600;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local from, to, err = ngx.re.find(s, re, "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not from then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match.")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: pcre_exec() failed: -8[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: just not hit match limit[m
[31m---- http_config[m
[31m-    lua_regex_match_limit 5700;[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua_file html/a.lua;[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-local re = [==[(?i:([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*)?\2|([\s'\"`´’‘\(\)]*)?([\d\w]+)([\s'\"`´’‘\(\)]*)?(?:!=|<=|>=|<>|<|>|\^|is\s+not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*)?(?!\6)([\d\w]+))]==][m
[31m-[m
[31m-s = string.rep([[ABCDEFG]], 10)[m
[31m-[m
[31m-local start = ngx.now()[m
[31m-[m
[31m-local from, to, err = ngx.re.find(s, re, "o")[m
[31m-[m
[31m---[[[m
[31m-ngx.update_time()[m
[31m-local elapsed = ngx.now() - start[m
[31m-ngx.say(elapsed, " sec elapsed.")[m
[31m-]][m
[31m-[m
[31m-if not from then[m
[31m-    if err then[m
[31m-        ngx.say("error: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    ngx.say("failed to match")[m
[31m-    return[m
[31m-end[m
[31m-[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-failed to match[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: specify the group (1)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 1)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 8[m
[31m-to: 8[m
[31m-matched: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: specify the group (0)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 0)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 8[m
[31m-to: 11[m
[31m-matched: 1234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: specify the group (2)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 2)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-from: 9[m
[31m-to: 11[m
[31m-matched: 234[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: specify the group (3)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 3)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: nth out of bound[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: specify the group (4)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])([0-9]+)", "jo", nil, 4)[m
[31m-            if from then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-error: nth out of bound[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: nil submatch (2nd)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "([0-9])|(hello world)", "jo", nil, 2)[m
[31m-            if from or to then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: nil submatch (1st)[m
[31m---- config[m
[31m-    location /re {[m
[31m-        content_by_lua '[m
[31m-            local s = "hello, 1234"[m
[31m-            local from, to, err = ngx.re.find(s, "(hello world)|([0-9])", "jo", nil, 1)[m
[31m-            if from or to then[m
[31m-                ngx.say("from: ", from)[m
[31m-                ngx.say("to: ", to)[m
[31m-                ngx.say("matched: ", string.sub(s, from, to))[m
[31m-            else[m
[31m-                if err then[m
[31m-                    ngx.say("error: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say("not matched!")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /re[m
[31m---- response_body[m
[31m-not matched![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/121-version.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/121-version.t[m
[1mdeleted file mode 100644[m
[1mindex 2b7a306..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/121-version.t[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: nginx version[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("version: ", ngx.config.nginx_version)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^version: \d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ngx_lua_version[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("version: ", ngx.config.ngx_lua_version)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^version: \d+$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/122-worker.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/122-worker.t[m
[1mdeleted file mode 100644[m
[1mindex fa42b1d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/122-worker.t[m
[1m+++ /dev/null[m
[36m@@ -1,82 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: content_by_lua + ngx.worker.exiting[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("worker exiting: ", ngx.worker.exiting())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-worker exiting: false[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: content_by_lua + ngx.worker.pid[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local pid = ngx.worker.pid()[m
[31m-            ngx.say("worker pid: ", pid)[m
[31m-            if pid ~= tonumber(ngx.var.pid) then[m
[31m-                ngx.say("worker pid is wrong.")[m
[31m-            else[m
[31m-                ngx.say("worker pid is correct.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-worker pid: \d+[m
[31m-worker pid is correct\.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: init_worker_by_lua + ngx.worker.pid[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        my_pid = ngx.worker.pid()[m
[31m-    ';[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("worker pid: ", my_pid)[m
[31m-            if my_pid ~= tonumber(ngx.var.pid) then[m
[31m-                ngx.say("worker pid is wrong.")[m
[31m-            else[m
[31m-                ngx.say("worker pid is correct.")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like[m
[31m-worker pid: \d+[m
[31m-worker pid is correct\.[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/123-lua-path.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/123-lua-path.t[m
[1mdeleted file mode 100644[m
[1mindex da97909..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/123-lua-path.t[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-$ENV{LUA_PATH} = "/foo/bar/baz";[m
[31m-$ENV{LUA_CPATH} = "/baz/bar/foo";[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-master_on();[m
[31m-no_shuffle();[m
[31m-check_accum_error_log();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: LUA_PATH & LUA_CPATH env (code cache on)[m
[31m---- main_config[m
[31m-env LUA_PATH;[m
[31m-env LUA_CPATH;[m
[31m-[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(package.path)[m
[31m-            ngx.say(package.cpath)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/foo/bar/baz[m
[31m-/baz/bar/foo[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: LUA_PATH & LUA_CPATH env (code cache off)[m
[31m---- main_config[m
[31m-env LUA_PATH;[m
[31m-env LUA_CPATH;[m
[31m-[m
[31m---- config[m
[31m-    lua_code_cache off;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(package.path)[m
[31m-            ngx.say(package.cpath)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-/foo/bar/baz[m
[31m-/baz/bar/foo[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log eval[m
[31m-qr/\[alert\] .*? lua_code_cache is off/[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/124-init-worker.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/124-init-worker.t[m
[1mdeleted file mode 100644[m
[1mindex d6ea675..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/124-init-worker.t[m
[1m+++ /dev/null[m
[36m@@ -1,758 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-our $ServerRoot = server_root();[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: set a global lua var[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        foo = ngx.md5("hello world")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo = 5eb63bbbe01eeed093cb22bb8f5acdc3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no ngx.say()[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        ngx.say("hello")[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo = nil[m
[31m---- error_log[m
[31m-API disabled in the context of init_worker_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: timer.at[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        _G.my_counter = 0[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-        local function handler(premature)[m
[31m-            warn("timer expired (premature: ", premature, "; counter: ",[m
[31m-                 _G.my_counter, ")")[m
[31m-            _G.my_counter = _G.my_counter + 1[m
[31m-        end[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to create timer: ", err)[m
[31m-        end[m
[31m-        warn("created timer: ", ok)[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            -- ngx.sleep(0.001)[m
[31m-            ngx.say("my_counter = ", _G.my_counter)[m
[31m-            _G.my_counter = _G.my_counter + 1[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-my_counter = 1[m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): created timer: 1[m
[31m-warn(): timer expired (premature: false; counter: 0)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: timer.at + cosocket[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        _G.done = false[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-        local function error(...)[m
[31m-            ngx.log(ngx.ERR, ...)[m
[31m-        end[m
[31m-        local function handler(premature)[m
[31m-            warn("timer expired (premature: ", premature, ")")[m
[31m-[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                error("failed to connect: ", err)[m
[31m-                _G.done = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                error("failed to send request: ", err)[m
[31m-                _G.done = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            warn("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err, part = sock:receive()[m
[31m-            if line then[m
[31m-                warn("received: ", line)[m
[31m-            else[m
[31m-                error("failed to receive a line: ", err, " [", part, "]")[m
[31m-            end[m
[31m-            _G.done = true[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            error("failed to create timer: ", err)[m
[31m-        end[m
[31m-        warn("created timer: ", ok)[m
[31m-    ';[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local waited = 0[m
[31m-            local sleep = ngx.sleep[m
[31m-            while not _G.done do[m
[31m-                local delay = 0.001[m
[31m-                sleep(delay)[m
[31m-                waited = waited + delay[m
[31m-                if waited > 1 then[m
[31m-                    ngx.say("timed out")[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): created timer: 1[m
[31m-warn(): timer expired (premature: false)[m
[31m-warn(): request sent: 11[m
[31m-warn(): received: OK[m
[31m-[m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 60000[m
[31m-lua tcp socket read timeout: 60000[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: init_worker_by_lua_file (simple global var)[m
[31m---- http_config[m
[31m-    init_worker_by_lua_file html/foo.lua;[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            ngx.say("foo = ", foo)[m
[31m-        ';[m
[31m-    }[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-foo = ngx.md5("hello world")[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo = 5eb63bbbe01eeed093cb22bb8f5acdc3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: timer.at + cosocket (by_lua_file)[m
[31m---- main_config[m
[31m-env TEST_NGINX_MEMCACHED_PORT;[m
[31m---- http_config[m
[31m-    init_worker_by_lua_file html/foo.lua;[m
[31m---- user_files[m
[31m->>> foo.lua[m
[31m-_G.done = false[m
[31m-local function warn(...)[m
[31m-    ngx.log(ngx.WARN, ...)[m
[31m-end[m
[31m-local function error(...)[m
[31m-    ngx.log(ngx.ERR, ...)[m
[31m-end[m
[31m-local function handler(premature)[m
[31m-    warn("timer expired (premature: ", premature, ")")[m
[31m-[m
[31m-    local sock = ngx.socket.tcp()[m
[31m-    local ok, err = sock:connect("127.0.0.1",[m
[31m-                                 os.getenv("TEST_NGINX_MEMCACHED_PORT"))[m
[31m-    if not ok then[m
[31m-        error("failed to connect: ", err)[m
[31m-        _G.done = true[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    local req = "flush_all\r\n"[m
[31m-[m
[31m-    local bytes, err = sock:send(req)[m
[31m-    if not bytes then[m
[31m-        error("failed to send request: ", err)[m
[31m-        _G.done = true[m
[31m-        return[m
[31m-    end[m
[31m-[m
[31m-    warn("request sent: ", bytes)[m
[31m-[m
[31m-    local line, err, part = sock:receive()[m
[31m-    if line then[m
[31m-        warn("received: ", line)[m
[31m-    else[m
[31m-        error("failed to receive a line: ", err, " [", part, "]")[m
[31m-    end[m
[31m-    _G.done = true[m
[31m-end[m
[31m-[m
[31m-local ok, err = ngx.timer.at(0, handler)[m
[31m-if not ok then[m
[31m-    error("failed to create timer: ", err)[m
[31m-end[m
[31m-warn("created timer: ", ok)[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local waited = 0[m
[31m-            local sleep = ngx.sleep[m
[31m-            while not _G.done do[m
[31m-                local delay = 0.001[m
[31m-                sleep(delay)[m
[31m-                waited = waited + delay[m
[31m-                if waited > 1 then[m
[31m-                    ngx.say("timed out")[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): created timer: 1[m
[31m-warn(): timer expired (premature: false)[m
[31m-warn(): request sent: 11[m
[31m-warn(): received: OK[m
[31m-[m
[31m---- log_level: debug[m
[31m---- error_log[m
[31m-lua tcp socket connect timeout: 60000[m
[31m-lua tcp socket send timeout: 60000[m
[31m-lua tcp socket read timeout: 60000[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.ctx[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        ngx.ctx.foo = "hello world"[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-        warn("foo = ", ngx.ctx.foo)[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): foo = hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: print[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        print("md5 = ", ngx.md5("hello world"))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-md5 = 5eb63bbbe01eeed093cb22bb8f5acdc3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: unescape_uri[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-[m
[31m-        warn(ngx.unescape_uri("hello%20world"))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): hello world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: escape_uri[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-[m
[31m-        warn(ngx.escape_uri("hello world"))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): hello%20world[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: ngx.re[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-[m
[31m-        warn((ngx.re.sub("hello world", "world", "XXX", "jo")))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/warn\(\): [^,]*/[m
[31m---- grep_error_log_out[m
[31m-warn(): hello XXX[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: ngx.http_time[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        local function warn(...)[m
[31m-            ngx.log(ngx.WARN, ...)[m
[31m-        end[m
[31m-[m
[31m-        warn(ngx.http_time(5678))[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- grep_error_log eval: qr/warn\(\): .*?(?=, context)/[m
[31m---- grep_error_log_out[m
[31m-warn(): Thu, 01 Jan 1970 01:34:38 GMT[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: cosocket with resolver[m
[31m---- timeout: 10[m
[31m---- http_config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    resolver_timeout 3s;[m
[31m-    init_worker_by_lua '[m
[31m-        -- global[m
[31m-        logs = ""[m
[31m-        done = false[m
[31m-        local function say(...)[m
[31m-            logs = logs .. table.concat({...}) .. "\\n"[m
[31m-        end[m
[31m-[m
[31m-        local function handler()[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = 80[m
[31m-            local ok, err = sock:connect("agentzh.org", port)[m
[31m-            if not ok then[m
[31m-                say("failed to connect: ", err)[m
[31m-                done = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            say("connected: ", ok)[m
[31m-[m
[31m-            local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                say("failed to send request: ", err)[m
[31m-                done = true[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            say("request sent: ", bytes)[m
[31m-[m
[31m-            local line, err = sock:receive()[m
[31m-            if line then[m
[31m-                say("first line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                say("failed to receive the first line: ", err)[m
[31m-            end[m
[31m-[m
[31m-            line, err = sock:receive()[m
[31m-            if line then[m
[31m-                say("second line received: ", line)[m
[31m-[m
[31m-            else[m
[31m-                say("failed to receive the second line: ", err)[m
[31m-            end[m
[31m-[m
[31m-            done = true[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            say("failed to create timer: ", err)[m
[31m-        else[m
[31m-            say("timer created")[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local i = 0[m
[31m-            while not done and i < 3000 do[m
[31m-                ngx.sleep(0.001)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-            ngx.print(logs)[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-timer created[m
[31m-connected: 1[m
[31m-request sent: 56[m
[31m-first line received: HTTP/1.1 200 OK[m
[31m-second line received: Server: openresty[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: connection refused (tcp) - log_errors on by default[m
[31m---- http_config[m
[31m-    init_worker_by_lua '[m
[31m-        logs = ""[m
[31m-        done = false[m
[31m-        local function say(...)[m
[31m-            logs = logs .. table.concat{...} .. "\\n"[m
[31m-        end[m
[31m-[m
[31m-        local function handler()[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not ok then[m
[31m-                say("failed to connect: ", err)[m
[31m-            else[m
[31m-                say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            say("failed to create timer: ", err)[m
[31m-        else[m
[31m-            say("timer created")[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local i = 0[m
[31m-            while not done and i < 1000 do[m
[31m-                ngx.sleep(0.001)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-            ngx.print(logs)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-timer created[m
[31m-failed to connect: connection refused[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\), context: ngx\.timer$/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: connection refused (tcp) - log_errors explicitly on[m
[31m---- http_config[m
[31m-    lua_socket_log_errors on;[m
[31m-    init_worker_by_lua '[m
[31m-        logs = ""[m
[31m-        done = false[m
[31m-        local function say(...)[m
[31m-            logs = logs .. table.concat{...} .. "\\n"[m
[31m-        end[m
[31m-[m
[31m-        local function handler()[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not ok then[m
[31m-                say("failed to connect: ", err)[m
[31m-            else[m
[31m-                say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            say("failed to create timer: ", err)[m
[31m-        else[m
[31m-            say("timer created")[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local i = 0[m
[31m-            while not done and i < 1000 do[m
[31m-                ngx.sleep(0.001)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-            ngx.print(logs)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-timer created[m
[31m-failed to connect: connection refused[m
[31m---- error_log eval[m
[31m-qr/connect\(\) failed \(\d+: Connection refused\)/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: connection refused (tcp) - log_errors explicitly off[m
[31m---- http_config[m
[31m-    lua_socket_log_errors off;[m
[31m-    init_worker_by_lua '[m
[31m-        logs = ""[m
[31m-        done = false[m
[31m-        local function say(...)[m
[31m-            logs = logs .. table.concat{...} .. "\\n"[m
[31m-        end[m
[31m-[m
[31m-        local function handler()[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ok, err = sock:connect("127.0.0.1", 16787)[m
[31m-            if not ok then[m
[31m-                say("failed to connect: ", err)[m
[31m-            else[m
[31m-                say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local ok, err = ngx.timer.at(0, handler)[m
[31m-        if not ok then[m
[31m-            say("failed to create timer: ", err)[m
[31m-        else[m
[31m-            say("timer created")[m
[31m-        end[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local i = 0[m
[31m-            while not done and i < 1000 do[m
[31m-                ngx.sleep(0.001)[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-            ngx.print(logs)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-timer created[m
[31m-failed to connect: connection refused[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-'qr/connect\(\) failed \(\d+: Connection refused\)/',[m
[31m-'[error]',[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: init_by_lua + proxy_temp_path which has side effects in cf->cycle->paths[m
[31m---- http_config eval[m
[31m-qq{[m
[31m-    proxy_temp_path $::ServerRoot/proxy_temp;[m
[31m-    init_worker_by_lua '[m
[31m-        local a = 2 + 3[m
[31m-    ';[m
[31m-}[m
[31m---- config[m
[31m-    location /t {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: syslog error log[m
[31m---- http_config[m
[31m-    #error_log syslog:server=127.0.0.1:12345 error;[m
[31m-    init_worker_by_lua '[m
[31m-        done = false[m
[31m-        os.execute("sleep 0.1")[m
[31m-        ngx.log(ngx.ERR, "Bad bad bad")[m
[31m-        done = true[m
[31m-    ';[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            while not done do[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-        ';[m
[31m-    }[m
[31m---- log_level: error[m
[31m---- error_log_file: syslog:server=127.0.0.1:12345[m
[31m---- udp_listen: 12345[m
[31m---- udp_query eval: qr/Bad bad bad/[m
[31m---- udp_reply: hello[m
[31m---- wait: 0.1[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- error_log[m
[31m-Bad bad bad[m
[31m---- skip_nginx: 4: < 1.7.1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: fake module calls ngx_http_conf_get_module_srv_conf in its merge_srv_conf callback (GitHub issue #554)[m
[31m-This also affects merge_loc_conf[m
[31m---- http_config[m
[31m-    init_worker_by_lua return;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        return 200 ok;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body chomp[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/125-configure-args.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/125-configure-args.t[m
[1mdeleted file mode 100644[m
[1mindex adec129..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/125-configure-args.t[m
[1m+++ /dev/null[m
[36m@@ -1,32 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: nginx configure[m
[31m---- config[m
[31m-    location /configure_args {[m
[31m-        content_by_lua '[m
[31m-            ngx.say(ngx.config.nginx_configure())[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /configure_args[m
[31m---- response_body_like chop[m
[31m-^\s*\-\-[^-]+[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/126-shdict-frag.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/126-shdict-frag.t[m
[1mdeleted file mode 100644[m
[1mindex 94422fb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/126-shdict-frag.t[m
[1m+++ /dev/null[m
[36m@@ -1,1267 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 39;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: merge 2 single-page free blocks (forcibly evicted, merge forward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                set_key("baz", string.rep("c", 8102))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-alloc pages: 1 NOT OK[m
[31m-free pages: 2[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-successfully set baz with force.[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 8102[m
[31m-successfully set foo with force.[m
[31m-successfully set bar.[m
[31m-successfully set baz with force.[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 8102[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: merge 2 single-page free slabs (forcibly evicted, merge backward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                check_key("foo")[m
[31m-                set_key("baz", string.rep("c", 8102))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-alloc pages: 1 NOT OK[m
[31m-free pages: 2[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-found foo: 4000[m
[31m-successfully set baz with force.[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 8102[m
[31m-successfully set foo with force.[m
[31m-successfully set bar.[m
[31m-found foo: 4000[m
[31m-successfully set baz with force.[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 8102[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: merge 3 single-page free slabs (actively deleted, merge backward AND forward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 25k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 2 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                set_key("baz", string.rep("c", 4002))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-[m
[31m-                dogs:delete("foo")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                dogs:delete("baz")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                dogs:delete("bar")[m
[31m-                safe_set_key("blah", string.rep("a", 12010))[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 5[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 3 ok[m
[31m-alloc pages: 1 NOT OK[m
[31m-free pages: 3[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 3 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-successfully set baz.[m
[31m-found foo: 4000[m
[31m-found bar: 4001[m
[31m-found baz: 4002[m
[31m-failed to safe set blah: no memory[m
[31m-failed to safe set blah: no memory[m
[31m-successfully safe set blah[m
[31m-successfully set foo with force.[m
[31m-successfully set bar.[m
[31m-successfully set baz.[m
[31m-found foo: 4000[m
[31m-found bar: 4001[m
[31m-found baz: 4002[m
[31m-failed to safe set blah: no memory[m
[31m-failed to safe set blah: no memory[m
[31m-successfully safe set blah[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: merge one single-page block backward, but no more[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 25k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                set_key("baz", string.rep("c", 4002))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-[m
[31m-                dogs:delete("bar")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                dogs:delete("baz")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                check_key("foo")[m
[31m-                dogs:delete("foo")[m
[31m-                check_key("blah")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 5[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-free pages: 1[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-successfully set baz.[m
[31m-found foo: 4000[m
[31m-found bar: 4001[m
[31m-found baz: 4002[m
[31m-failed to safe set blah: no memory[m
[31m-successfully safe set blah[m
[31m-found foo: 4000[m
[31m-found blah: 8100[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: merge one single-page block forward, but no more[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 25k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                set_key("foo", string.rep("a", 4000))[m
[31m-                set_key("bar", string.rep("b", 4001))[m
[31m-                set_key("baz", string.rep("c", 4002))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-[m
[31m-                dogs:delete("bar")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                dogs:delete("foo")[m
[31m-                safe_set_key("blah", string.rep("a", 8100))[m
[31m-                check_key("baz")[m
[31m-                dogs:delete("baz")[m
[31m-                check_key("blah")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 5[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-free pages: 1[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-successfully set baz.[m
[31m-found foo: 4000[m
[31m-found bar: 4001[m
[31m-found baz: 4002[m
[31m-failed to safe set blah: no memory[m
[31m-successfully safe set blah[m
[31m-found baz: 4002[m
[31m-found blah: 8100[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: merge 2 multi-page blocks (forcibly evicted, merge backward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 30k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                set_key("foo", string.rep("a", 8100))[m
[31m-                set_key("bar", string.rep("b", 8101))[m
[31m-                check_key("foo")[m
[31m-                safe_set_key("baz", string.rep("c", 16300))[m
[31m-                dogs:delete("foo")[m
[31m-                check_key("bar")[m
[31m-                dogs:delete("bar")[m
[31m-                safe_set_key("baz", string.rep("c", 16300))[m
[31m-[m
[31m-                check_key("foo")[m
[31m-                check_key("bar")[m
[31m-                check_key("baz")[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 6[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 2 ok[m
[31m-alloc pages: 2 ok[m
[31m-alloc pages: 4 NOT OK[m
[31m-free pages: 2[m
[31m-free pages: 2[m
[31m-alloc pages: 4 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set foo.[m
[31m-successfully set bar.[m
[31m-found foo: 8100[m
[31m-failed to safe set baz: no memory[m
[31m-found bar: 8101[m
[31m-successfully safe set baz[m
[31m-foo not found[m
[31m-bar not found[m
[31m-found baz: 16300[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: merge big slabs (less than max slab size) backward[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:set("foo" .. j, string.rep("a", 5))[m
[31m-                end[m
[31m-                set_key("bar", string.rep("a", 4000))[m
[31m-[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:delete("foo" .. j)[m
[31m-                end[m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-                check_key("bar")[m
[31m-[m
[31m-                ngx.say("delete bar")[m
[31m-                dogs:delete("bar")[m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        //printf("slab max size: %d\n", @var("ngx_slab_max_size"))[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 ok[m
[31m-[m
[31m---- response_body[m
[31m-successfully set bar.[m
[31m-failed to safe set baz: no memory[m
[31m-found bar: 4000[m
[31m-delete bar[m
[31m-successfully safe set baz[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: cannot merge in-used big slabs page (backward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                for j = 1, 63 do[m
[31m-                    dogs:set("foo" .. j, string.rep("a", 5))[m
[31m-                end[m
[31m-                set_key("bar", string.rep("a", 4000))[m
[31m-[m
[31m-                --[[[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:delete("foo" .. j)[m
[31m-                end[m
[31m-                ]][m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-                check_key("bar")[m
[31m-[m
[31m-                ngx.say("delete bar")[m
[31m-                dogs:delete("bar")[m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        //printf("slab max size: %d\n", @var("ngx_slab_max_size"))[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-[m
[31m---- response_body[m
[31m-successfully set bar.[m
[31m-failed to safe set baz: no memory[m
[31m-found bar: 4000[m
[31m-delete bar[m
[31m-failed to safe set baz: no memory[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: cannot merge in-used big slabs page (forward)[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 20k;[m
[31m---- config[m
[31m-    location = /test {[m
[31m-        content_by_lua '[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-[m
[31m-            local function check_key(key)[m
[31m-                local res, err = dogs:get(key)[m
[31m-                if res then[m
[31m-                    ngx.say("found ", key, ": ", #res)[m
[31m-                else[m
[31m-                    if not err then[m
[31m-                        ngx.say(key, " not found")[m
[31m-                    else[m
[31m-                        ngx.say("failed to fetch key: ", err)[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function set_key(key, value)[m
[31m-                local ok, err, force = dogs:set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.print("successfully set ", key)[m
[31m-                    if force then[m
[31m-                        ngx.say(" with force.")[m
[31m-                    else[m
[31m-                        ngx.say(".")[m
[31m-                    end[m
[31m-                else[m
[31m-                    ngx.say("failed to set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local function safe_set_key(key, value)[m
[31m-                local ok, err = dogs:safe_set(key, value)[m
[31m-                if ok then[m
[31m-                    ngx.say("successfully safe set ", key)[m
[31m-                else[m
[31m-                    ngx.say("failed to safe set ", key, ": ", err)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 1 do[m
[31m-                set_key("bar", string.rep("a", 4000))[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:set("foo" .. j, string.rep("a", 5))[m
[31m-                end[m
[31m-[m
[31m-                --[[[m
[31m-                for j = 1, 50 do[m
[31m-                    dogs:delete("foo" .. j)[m
[31m-                end[m
[31m-                ]][m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-                check_key("bar")[m
[31m-[m
[31m-                ngx.say("delete bar")[m
[31m-                dogs:delete("bar")[m
[31m-[m
[31m-                safe_set_key("baz", string.rep("b", 8100))[m
[31m-            end[m
[31m-[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- stap[m
[31m-global first_time = 1[m
[31m-global active = 1[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone) {[m
[31m-    active = 0[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_shdict_init_zone).return {[m
[31m-    active = 1[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages) {[m
[31m-    if (first_time) {[m
[31m-        //printf("slab max size: %d\n", @var("ngx_slab_max_size"))[m
[31m-        printf("total pages: %d\n", $pool->pages->slab)[m
[31m-        first_time = 0[m
[31m-    }[m
[31m-    if (active) {[m
[31m-        printf("alloc pages: %d", $pages)[m
[31m-        //print_ubacktrace()[m
[31m-    } else {[m
[31m-        printf("init zone alloc pages: %d", $pages)[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_alloc_pages).return {[m
[31m-    if ($return) {[m
[31m-        printf(" ok\n")[m
[31m-[m
[31m-    } else {[m
[31m-        printf(" NOT OK\n")[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_slab_free_pages) {[m
[31m-    printf("free pages: %d\n", $pages)[m
[31m-}[m
[31m-[m
[31m---- stap_out[m
[31m-total pages: 4[m
[31m-init zone alloc pages: 1 ok[m
[31m-init zone alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 1 ok[m
[31m-alloc pages: 2 NOT OK[m
[31m-free pages: 1[m
[31m-alloc pages: 2 NOT OK[m
[31m-[m
[31m---- response_body[m
[31m-successfully set bar.[m
[31m-failed to safe set baz: no memory[m
[31m-found bar: 4000[m
[31m-delete bar[m
[31m-failed to safe set baz: no memory[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: fuzz testing[m
[31m---- http_config[m
[31m-    lua_shared_dict dogs 200k;[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local rand = math.random[m
[31m-            local dogs = ngx.shared.dogs[m
[31m-            local maxsz = 9000[m
[31m-            local maxkeyidx = 30[m
[31m-            local rep = string.rep[m
[31m-[m
[31m-            math.randomseed(ngx.time())[m
[31m-            for i = 1, 30000 do[m
[31m-                local key = "mylittlekey" .. rand(maxkeyidx)[m
[31m-                local ok, err = dogs:get(key)[m
[31m-                if not ok or rand() > 0.6 then[m
[31m-                    sz = rand(maxsz)[m
[31m-                    val = rep("a", sz)[m
[31m-                    local ok, err, forcible = dogs:set(key, val)[m
[31m-                    if err then[m
[31m-                        ngx.log(ngx.ERR, "failed to set key: ", err)[m
[31m-                        -- return[m
[31m-                    end[m
[31m-                    if forcible then[m
[31m-                        -- error("forcible")[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("ok")[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- timeout: 60[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/127-uthread-kill.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/127-uthread-kill.t[m
[1mdeleted file mode 100644[m
[1mindex 2ab8abe..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/127-uthread-kill.t[m
[1m+++ /dev/null[m
[36m@@ -1,508 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-use t::StapThread;[m
[31m-[m
[31m-our $GCScript = $t::StapThread::GCScript;[m
[31m-our $StapScript = $t::StapThread::StapScript;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5 + 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= '11211';[m
[31m-[m
[31m-#no_shuffle();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: kill pending sleep[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f()")[m
[31m-                ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello from f()[m
[31m-thread created: running[m
[31m-killed[m
[31m-failed to kill thread: already waited or killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua clean up the timer for pending ngx.sleep[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: already waited[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.say("hello from f()")[m
[31m-                ngx.sleep(0.001)[m
[31m-                return 32[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("waited: ", res)[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-terminate 2: ok[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-hello from f()[m
[31m-thread created: running[m
[31m-waited: 32[m
[31m-failed to kill thread: already waited or killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-lua clean up the timer for pending ngx.sleep[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: kill pending resolver[m
[31m---- config[m
[31m-    resolver agentzh.org:12345;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:connect("some.agentzh.org", 12345)[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-lua tcp socket abort resolver[m
[31m-resolve name done: -2[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: kill pending connect[m
[31m---- config[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            local ready = false[m
[31m-            function f()[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:connect("agentzh.org", 80)[m
[31m-                sock:close()[m
[31m-                ready = true[m
[31m-                sock:settimeout(10000)[m
[31m-                sock:connect("agentzh.org", 12345)[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            while not ready do[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- stap2 eval: $::StapScript[m
[31m---- stap eval: $::GCScript[m
[31m---- stap_out[m
[31m-create 2 in 1[m
[31m-spawn user thread 2 in 1[m
[31m-delete thread 2[m
[31m-terminate 1: ok[m
[31m-delete thread 1[m
[31m-[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-lua tcp socket abort resolver[m
[31m---- grep_error_log: lua finalize socket[m
[31m---- grep_error_log_out[m
[31m-lua finalize socket[m
[31m-lua finalize socket[m
[31m-[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: cannot kill a pending subrequest[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture("/sub")[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-failed to kill thread: pending subrequests[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: cannot kill a pending subrequest not in the thread being killed[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo_sleep 0.3;[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                ngx.location.capture("/sub")[m
[31m-            end[m
[31m-[m
[31m-            function g()[m
[31m-                ngx.sleep(0.3)[m
[31m-            end[m
[31m-[m
[31m-            local tf, err = ngx.thread.spawn(f)[m
[31m-            if not tf then[m
[31m-                ngx.say("failed to spawn thread 1: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread f created: ", coroutine.status(tf))[m
[31m-[m
[31m-            local tg, err = ngx.thread.spawn(g)[m
[31m-            if not tg then[m
[31m-                ngx.say("failed to spawn thread g: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread g created: ", coroutine.status(tg))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(tf)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread f: ", err)[m
[31m-            else[m
[31m-                ngx.say("killed f")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(tg)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread g: ", err)[m
[31m-            else[m
[31m-                ngx.say("killed g")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-thread f created: running[m
[31m-thread g created: running[m
[31m-failed to kill thread f: pending subrequests[m
[31m-killed g[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: kill a thread that has done a subrequest but no pending ones[m
[31m---- config[m
[31m-    location = /sub {[m
[31m-        echo ok;[m
[31m-    }[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ready = false[m
[31m-            function f()[m
[31m-                ngx.location.capture("/sub")[m
[31m-                ready = true[m
[31m-                ngx.sleep(0.5)[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            while not ready do[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-thread created: running[m
[31m-killed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: kill a thread already terminated[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            function f()[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ok, err = ngx.thread.kill(t)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("killed")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-thread created: zombie[m
[31m-failed to kill thread: already terminated[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: kill self[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ok, err = ngx.thread.kill(coroutine.running())[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to kill main thread: ", err)[m
[31m-            else[m
[31m-                ngx.say("killed main thread.")[m
[31m-            end[m
[31m-[m
[31m-            function f()[m
[31m-                local ok, err = ngx.thread.kill(coroutine.running())[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to kill user thread: ", err)[m
[31m-                else[m
[31m-                    ngx.say("user thread thread.")[m
[31m-                end[m
[31m-[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.say("failed to spawn thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("thread created: ", coroutine.status(t))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- stap2 eval: $::StapScript[m
[31m---- response_body[m
[31m-failed to kill main thread: not user thread[m
[31m-failed to kill user thread: killer not parent[m
[31m-thread created: zombie[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-lua tcp socket abort resolver[m
[31m---- error_log[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/128-duplex-tcp-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/128-duplex-tcp-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 0bf38d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/128-duplex-tcp-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,626 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 2);[m
[31m-[m
[31m-our $HtmlDir = html_dir;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: pipelined memcached requests (sent one byte at a time)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\nget foo\\r\\nget bar\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-            local send_idx = 1[m
[31m-[m
[31m-            local function writer()[m
[31m-                local sub = string.sub[m
[31m-                while send_idx <= #req do[m
[31m-                    local bytes, err = sock:send(sub(req, send_idx, send_idx))[m
[31m-                    if not bytes then[m
[31m-                        ngx.say("failed to send request: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    -- if send_idx % 2 == 0 then[m
[31m-                        ngx.sleep(0.001)[m
[31m-                    -- end[m
[31m-                    send_idx = send_idx + 1[m
[31m-                end[m
[31m-                -- ngx.say("request sent.")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(writer)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:setkeepalive()[m
[31m-            ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-received: OK[m
[31m-received: END[m
[31m-received: END[m
[31m-setkeepalive: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: read timeout errors won't affect writing[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-            local send_idx = 1[m
[31m-[m
[31m-            sock:settimeout(1)[m
[31m-[m
[31m-            local function writer()[m
[31m-                local sub = string.sub[m
[31m-                while send_idx <= #req do[m
[31m-                    local bytes, err = sock:send(sub(req, send_idx, send_idx))[m
[31m-                    if not bytes then[m
[31m-                        ngx.say("failed to send request: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    ngx.sleep(0.001)[m
[31m-                    send_idx = send_idx + 1[m
[31m-                end[m
[31m-                -- ngx.say("request sent.")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(writer)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = ""[m
[31m-            local ntm = 0[m
[31m-            local done = false[m
[31m-            for i = 1, 300 do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if not line then[m
[31m-                    if part then[m
[31m-                        data = data .. part[m
[31m-                    end[m
[31m-                    if err ~= "timeout" then[m
[31m-                        ngx.say("failed to receive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    ntm = ntm + 1[m
[31m-[m
[31m-                else[m
[31m-                    data = data .. line[m
[31m-                    ngx.say("received: ", data)[m
[31m-                    done = true[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            if not done then[m
[31m-                ngx.say("partial read: ", data)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("read timed out: ", ntm)[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected: 1[m
[31m-(?:received: OK|failed to send request: timeout[m
[31m-partial read: )[m
[31m-read timed out: [1-9]\d*[m
[31m-close: 1 nil$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: writes are rejected while reads are not[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port 7658;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-            local send_idx = 1[m
[31m-[m
[31m-            local function writer()[m
[31m-                local sub = string.sub[m
[31m-                while send_idx <= #req do[m
[31m-                    local bytes, err = sock:send(sub(req, send_idx, send_idx))[m
[31m-                    if not bytes then[m
[31m-                        ngx.say("failed to send request: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    ngx.sleep(0.001)[m
[31m-                    send_idx = send_idx + 1[m
[31m-                end[m
[31m-                -- ngx.say("request sent.")[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(writer)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = ""[m
[31m-            local ntm = 0[m
[31m-            local done = false[m
[31m-            for i = 1, 3 do[m
[31m-                local res, err, part = sock:receive(1)[m
[31m-                if not res then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                else[m
[31m-                    data = data .. res[m
[31m-                end[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data)[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-^connected: 1[m
[31m-received: OK![m
[31m-close: (?:nil socket busy writing|1 nil[m
[31m-failed to send request: closed)$[m
[31m-[m
[31m---- tcp_listen: 7658[m
[31m---- tcp_shutdown: 0[m
[31m---- tcp_reply: OK![m
[31m---- tcp_no_close: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: reads are rejected while writes are not[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port 7658;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect("127.0.0.1", port)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local req = "flush_all\\r\\n"[m
[31m-            -- req = "OK"[m
[31m-            local send_idx = 1[m
[31m-[m
[31m-            local function writer()[m
[31m-                local sub = string.sub[m
[31m-                while send_idx <= #req do[m
[31m-                    local bytes, err = sock:send(sub(req, send_idx, send_idx))[m
[31m-                    if not bytes then[m
[31m-                        ngx.say("failed to send request: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-                    -- ngx.say("sent: ", bytes)[m
[31m-                    ngx.sleep(0.001)[m
[31m-                    send_idx = send_idx + 1[m
[31m-                end[m
[31m-                ngx.say("request sent.")[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(writer)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local data = ""[m
[31m-            local ntm = 0[m
[31m-            local done = false[m
[31m-            for i = 1, 3 do[m
[31m-                local res, err, part = sock:receive(1)[m
[31m-                if not res then[m
[31m-                    ngx.say("failed to receive: ", err)[m
[31m-                    return[m
[31m-                else[m
[31m-                    data = data .. res[m
[31m-                end[m
[31m-                ngx.sleep(0.001)[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("received: ", data)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to receive: closed[m
[31m-request sent.[m
[31m-close: 1 nil[m
[31m-[m
[31m---- stap2[m
[31m-F(ngx_http_lua_socket_tcp_finalize_write_part) {[m
[31m-    print_ubacktrace()[m
[31m-}[m
[31m---- stap_out2[m
[31m---- tcp_listen: 7658[m
[31m---- tcp_shutdown: 1[m
[31m---- tcp_query eval: "flush_all\r\n"[m
[31m---- tcp_query_len: 11[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: concurrent socket operations while connecting[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local function f()[m
[31m-                ngx.sleep(0.001)[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-                local bytes, err = sock:send("hello")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local ok, err = sock:connect("106.187.41.147", 12345)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-receive: nil socket busy connecting[m
[31m-send: nil socket busy connecting[m
[31m-close: nil socket busy connecting[m
[31m-getreusedtimes: 0 nil[m
[31m-setkeepalive: nil socket busy connecting[m
[31m-connect: nil socket busy connecting[m
[31m-connect: nil timeout[m
[31m-close: nil closed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: concurrent operations while resolving[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    resolver agentzh.org:12345;[m
[31m-    resolver_timeout 300ms;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local function f()[m
[31m-                ngx.sleep(0.001)[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-                local bytes, err = sock:send("hello")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local ok, err = sock:connect("some2.agentzh.org", 12345)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-receive: nil closed[m
[31m-send: nil closed[m
[31m-close: nil closed[m
[31m-getreusedtimes: nil closed[m
[31m-setkeepalive: nil closed[m
[31m-connect: nil socket busy connecting[m
[31m-connect: nil some2.agentzh.org could not be resolved (110: Operation timed out)[m
[31m-close: nil closed[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: concurrent operations while reading (receive)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local ready = false[m
[31m-[m
[31m-            local function f()[m
[31m-                while not ready do[m
[31m-                    ngx.sleep(0.001)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-                local bytes, err = sock:send("flush_all")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            ready = true[m
[31m-[m
[31m-            local res, err = sock:receive(1)[m
[31m-            ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connect: 1 nil[m
[31m-receive: nil socket busy reading[m
[31m-send: 9 nil[m
[31m-close: nil socket busy reading[m
[31m-getreusedtimes: 0 nil[m
[31m-setkeepalive: nil socket busy reading[m
[31m-connect: nil socket busy reading[m
[31m-receive: nil timeout[m
[31m-close: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: concurrent operations while reading (receiveuntil)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local ready = false[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            local function f()[m
[31m-                while not ready do[m
[31m-                    ngx.sleep(0.001)[m
[31m-                end[m
[31m-[m
[31m-                local res, err = sock:receive(1)[m
[31m-                ngx.say("receive: ", res, " ", err)[m
[31m-[m
[31m-                local bytes, err = sock:send("flush_all")[m
[31m-                ngx.say("send: ", bytes, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:getreusedtimes()[m
[31m-                ngx.say("getreusedtimes: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("setkeepalive: ", ok, " ", err)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-                ngx.say("connect: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            local ok, err = ngx.thread.spawn(f)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to spawn writer thread: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            sock:settimeout(300)[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            ngx.say("connect: ", ok, " ", err)[m
[31m-[m
[31m-            ready = true[m
[31m-[m
[31m-            local it, err = sock:receiveuntil("\\r\\n")[m
[31m-            if not it then[m
[31m-                ngx.say("receiveuntil() failed: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = it()[m
[31m-            ngx.say("receiveuntil() iterator: ", res, " ", err)[m
[31m-[m
[31m-            local ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connect: 1 nil[m
[31m-receive: nil socket busy reading[m
[31m-send: 9 nil[m
[31m-close: nil socket busy reading[m
[31m-getreusedtimes: 0 nil[m
[31m-setkeepalive: nil socket busy reading[m
[31m-connect: nil socket busy reading[m
[31m-receiveuntil() iterator: nil timeout[m
[31m-close: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/129-ssl-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/129-ssl-socket.t[m
[1mdeleted file mode 100644[m
[1mindex c19853d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/129-ssl-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,2620 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 219;[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-$ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-sub read_file {[m
[31m-    my $infile = shift;[m
[31m-    open my $in, $infile[m
[31m-        or die "cannot open $infile for reading: $!";[m
[31m-    my $cert = do { local $/; <$in> };[m
[31m-    close $in;[m
[31m-    $cert;[m
[31m-}[m
[31m-[m
[31m-our $StartComRootCertificate = read_file("t/cert/startcom.crt");[m
[31m-our $EquifaxRootCertificate = read_file("t/cert/equifax.crt");[m
[31m-our $TestCertificate = read_file("t/cert/test.crt");[m
[31m-our $TestCertificateKey = read_file("t/cert/test.key");[m
[31m-our $TestCRL = read_file("t/cert/test.crl");[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: www.google.com[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER ipv6=off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- avoid flushing google in "check leak" testing mode:[m
[31m-            local counter = package.loaded.counter[m
[31m-            if not counter then[m
[31m-                counter = 1[m
[31m-            elseif counter >= 2 then[m
[31m-                return ngx.exit(503)[m
[31m-            else[m
[31m-                counter = counter + 1[m
[31m-            end[m
[31m-            package.loaded.counter = counter[m
[31m-[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(2000)[m
[31m-                local ok, err = sock:connect("www.google.com", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake()[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: www.google.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-\Aconnected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 (?:200 OK|302 Found)[m
[31m-close: 1 nil[m
[31m-\z[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no SNI, no verify[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("g.sregex.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake()[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: g.sregex.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 57 bytes.[m
[31m-received: HTTP/1.1 401 Unauthorized[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: SNI, no verify[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ssl session reuse[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-[m
[31m-            local session[m
[31m-            for i = 1, 2 do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                session, err = sock:sslhandshake(session, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end[m
[31m-[m
[31m-            end -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl set session: \1:2[m
[31m-lua ssl save session: \1:3[m
[31m-lua ssl free session: \1:2[m
[31m-lua ssl free session: \1:1[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-SSL reused session[m
[31m-lua ssl free session[m
[31m-[m
[31m---- log_level: debug[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: certificate does not match host name (verify)[m
[31m-The certificate for "blah.agentzh.org" does not contain the name "blah.agentzh.org".[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 5;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("agentzh.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "blah.agentzh.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: certificate host mismatch[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "blah.agentzh.org"[m
[31m-lua ssl certificate does not match host "blah.agentzh.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: certificate does not match host name (verify, no log socket errors)[m
[31m-The certificate for "blah.agentzh.org" does not contain the name "blah.agentzh.org".[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_socket_log_errors off;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("agentzh.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "blah.agentzh.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: blah.agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: certificate host mismatch[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "blah.agentzh.org"[m
[31m---- no_error_log[m
[31m-lua ssl certificate does not match host[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: certificate does not match host name (no verify)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("agentzh.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "agentzh.org", false)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "agentzh.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: iscribblet.org: passing SSL verify[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: ssl verify depth not enough (with automatic error logging)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 20: unable to get local issuer certificate[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m-lua ssl certificate verify error: (20: unable to get local issuer certificate)[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ssl verify depth not enough (without automatic error logging)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 1;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 20: unable to get local issuer certificate[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-lua ssl certificate verify error[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 7[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: www.google.com  (SSL verify passes)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER ipv6=off;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- avoid flushing google in "check leak" testing mode:[m
[31m-            local counter = package.loaded.counter[m
[31m-            if not counter then[m
[31m-                counter = 1[m
[31m-            elseif counter >= 2 then[m
[31m-                return ngx.exit(503)[m
[31m-            else[m
[31m-                counter = counter + 1[m
[31m-            end[m
[31m-            package.loaded.counter = counter[m
[31m-[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(2000)[m
[31m-                local ok, err = sock:connect("www.google.com", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "www.google.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: www.google.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::EquifaxRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body_like chop[m
[31m-\Aconnected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 (?:200 OK|302 Found)[m
[31m-close: 1 nil[m
[31m-\z[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "www.google.com"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: www.google.com  (SSL verify enabled and no corresponding trusted certificates)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER ipv6=off;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            -- avoid flushing google in "check leak" testing mode:[m
[31m-            local counter = package.loaded.counter[m
[31m-            if not counter then[m
[31m-                counter = 1[m
[31m-            elseif counter >= 2 then[m
[31m-                return ngx.exit(503)[m
[31m-            else[m
[31m-                counter = counter + 1[m
[31m-            end[m
[31m-            package.loaded.counter = counter[m
[31m-[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(2000)[m
[31m-                local ok, err = sock:connect("www.google.com", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "www.google.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: www.google.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 20: unable to get local issuer certificate[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "www.google.com"[m
[31m-lua ssl certificate verify error: (20: unable to get local issuer certificate)[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: iscribblet.org: passing SSL verify with multiple certificates[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::EquifaxRootCertificate[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: default cipher[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m-SSL: TLSv1.2, cipher: "ECDHE-RSA-RC4-SHA SSLv3[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: explicit cipher configuration[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_ciphers RC4-SHA;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m-SSL: TLSv1.2, cipher: "RC4-SHA SSLv3[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: explicit ssl protocol configuration[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_protocols TLSv1;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m-SSL: TLSv1, cipher: "ECDHE-RSA-RC4-SHA SSLv3[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: unsupported ssl protocol[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_protocols SSLv2;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log eval[m
[31m-[[m
[31m-qr/\[crit\] .*?SSL_do_handshake\(\) failed .*?unsupported protocol/,[m
[31m-'lua ssl server name: "iscribblet.org"',[m
[31m-][m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: iscribblet.org: passing SSL verify: keepalive (reuse the ssl session)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-[m
[31m-            local session[m
[31m-            for i = 1, 3 do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                session, err = sock:sslhandshake(session, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("set keepalive: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-[m
[31m-            end[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: \1:2[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: iscribblet.org: passing SSL verify: keepalive (no reusing the ssl session)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-[m
[31m-            for i = 1, 3 do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org", true)[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                ngx.say("set keepalive: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-[m
[31m-            end[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-set keepalive: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl save session: \1:3[m
[31m-lua ssl save session: \1:4[m
[31m-lua ssl free session: \1:4[m
[31m-lua ssl free session: \1:3[m
[31m-lua ssl free session: \1:2[m
[31m-$/[m
[31m-[m
[31m---- error_log[m
[31m-lua tcp socket get keepalive peer: using connection[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: downstream cosockets do not support ssl handshake[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/trusted.crt;[m
[31m-    lua_ssl_verify_depth 2;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.req.socket()[m
[31m-            local sess, err = sock:sslhandshake()[m
[31m-            if not sess then[m
[31m-                ngx.say("failed to do ssl handshake: ", err)[m
[31m-            else[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> trusted.crt[m
[31m-$::StartComRootCertificate"[m
[31m-[m
[31m---- request[m
[31m-POST /t[m
[31m-hello world[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-attempt to call method 'sslhandshake' (a nil value)[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: unix domain ssl cosocket (no verify)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake()[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: unix domain ssl cosocket (verify)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 23: unix domain ssl cosocket (no ssl on server)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock;[m
[31m-        server_name   test.com;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake()[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log eval[m
[31m-qr/SSL_do_handshake\(\) failed .*?unknown protocol/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 24: lua_ssl_crl[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_crl ../html/test.crl;[m
[31m-    lua_ssl_trusted_certificate ../html/test.crt;[m
[31m-    lua_socket_log_errors off;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(3000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                else[m
[31m-                    ngx.say("ssl handshake: ", type(sess))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 12: CRL has expired[m
[31m-failed to send http request: closed[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate[m
[31m->>> test.crl[m
[31m-$::TestCRL"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 25: multiple handshake calls[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                for i = 1, 2 do[m
[31m-                    local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                    if not session then[m
[31m-                        ngx.say("failed to do SSL handshake: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("ssl handshake: ", type(session))[m
[31m-                end[m
[31m-[m
[31m-                local req = "GET / HTTP/1.1\\r\\nHost: iscribblet.org\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                local line, err = sock:receive()[m
[31m-                if not line then[m
[31m-                    ngx.say("failed to recieve response status line: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("received: ", line)[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 59 bytes.[m
[31m-received: HTTP/1.1 200 OK[m
[31m-close: 1 nil[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl save session: ([0-9A-F]+):3[m
[31m-lua ssl free session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 26: handshake timed out[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            do[m
[31m-                local ok, err = sock:connect("iscribblet.org", 443)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                sock:settimeout(1);  -- should timeout immediately[m
[31m-                local session, err = sock:sslhandshake(nil, "iscribblet.org")[m
[31m-                if not session then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(session))[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: timeout[m
[31m-[m
[31m---- log_level: debug[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl server name: "iscribblet.org"[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 27: unix domain ssl cosocket (no gen session)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", sess)[m
[31m-[m
[31m-                sock:close()[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: true[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 28: unix domain ssl cosocket (gen session, true)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                sock:close()[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 29: unix domain ssl cosocket (keepalive)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(3000)[m
[31m-            for i = 1, 2 do[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", sess)[m
[31m-[m
[31m-                local ok, err = sock:setkeepalive()[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to set keepalive: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: true[m
[31m-connected: 1[m
[31m-ssl handshake: true[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- no_error_log[m
[31m-lua ssl server name:[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 30: unix domain ssl cosocket (verify cert but no host name check, passed)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    lua_ssl_trusted_certificate ../html/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, nil, true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out eval[m
[31m-qr/^lua ssl save session: ([0-9A-F]+):2[m
[31m-lua ssl free session: ([0-9A-F]+):1[m
[31m-$/[m
[31m---- error_log[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[error][m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 31: unix domain ssl cosocket (verify cert but no host name check, NOT passed)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate ../html/test.crt;[m
[31m-        ssl_certificate_key ../html/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua 'ngx.status = 201 ngx.say("foo") ngx.exit(201)';[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    #lua_ssl_trusted_certificate ../html/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua '[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-                sock:settimeout(3000)[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, nil, true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\\r\\nHost: test.com\\r\\nConnection: close\\r\\n\\r\\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            collectgarbage()[m
[31m-        ';[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: 18: self signed certificate[m
[31m-[m
[31m---- user_files eval[m
[31m-">>> test.key[m
[31m-$::TestCertificateKey[m
[31m->>> test.crt[m
[31m-$::TestCertificate"[m
[31m-[m
[31m---- grep_error_log eval: qr/lua ssl (?:set|save|free) session: [0-9A-F]+:\d+/[m
[31m---- grep_error_log_out[m
[31m---- error_log[m
[31m-lua ssl certificate verify error: (18: self signed certificate)[m
[31m---- no_error_log[m
[31m-SSL reused session[m
[31m-[alert][m
[31m---- timeout: 5[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 32: handshake, too many arguments[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    resolver $TEST_NGINX_RESOLVER;[m
[31m-    location /t {[m
[31m-        #set $port 5000;[m
[31m-        set $port $TEST_NGINX_MEMCACHED_PORT;[m
[31m-[m
[31m-        content_by_lua_block {[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            local ok, err = sock:connect("g.sregex.org", 443)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("connected: ", ok)[m
[31m-[m
[31m-            local session, err = sock.sslhandshake()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- ignore_response[m
[31m---- error_log eval[m
[31m-qr/\[error\] .* ngx.socket connect: expecting 1 ~ 5 arguments \(including the object\), but seen 0/[m
[31m---- no_error_log[m
[31m-[alert][m
[31m---- timeout: 5[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/130-internal-api.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/130-internal-api.t[m
[1mdeleted file mode 100644[m
[1mindex d641ab5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/130-internal-api.t[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_process_enabled(1);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * 3;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: __ngx_req and __ngx_cycle[m
[31m---- http_config[m
[31m-    init_by_lua '[m
[31m-        my_cycle = __ngx_cycle[m
[31m-    ';[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua '[m
[31m-            local ffi = require "ffi"[m
[31m-            local function tonum(ud)[m
[31m-                return tonumber(ffi.cast("uintptr_t", ud))[m
[31m-            end[m
[31m-            ngx.say(string.format("init: cycle=%#x", tonum(my_cycle)))[m
[31m-            ngx.say(string.format("content cycle=%#x", tonum(__ngx_cycle)))[m
[31m-            ngx.say(string.format("content req=%#x", tonum(__ngx_req)))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body_like chop[m
[31m-^init: cycle=(0x[a-f0-9]{4,})[m
[31m-content cycle=\1[m
[31m-content req=0x[a-f0-9]{4,}[m
[31m-$[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/131-duplex-req-socket.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/131-duplex-req-socket.t[m
[1mdeleted file mode 100644[m
[1mindex 5d698b9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/131-duplex-req-socket.t[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-BEGIN {[m
[31m-    if (!defined $ENV{LD_PRELOAD}) {[m
[31m-        $ENV{LD_PRELOAD} = '';[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {[m
[31m-        $ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";[m
[31m-    }[m
[31m-[m
[31m-    if ($ENV{MOCKEAGAIN} eq 'r') {[m
[31m-        $ENV{MOCKEAGAIN} = 'rw';[m
[31m-[m
[31m-    } else {[m
[31m-        $ENV{MOCKEAGAIN} = 'w';[m
[31m-    }[m
[31m-[m
[31m-    $ENV{TEST_NGINX_EVENT_TYPE} = 'poll';[m
[31m-    $ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'slow';[m
[31m-}[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-log_level('debug');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: raw downstream cosocket used in two different threads. See issue #481[m
[31m---- config[m
[31m-    lua_socket_read_timeout 1ms;[m
[31m-    lua_socket_send_timeout 1s;[m
[31m-    lua_socket_log_errors off;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function reader(req_socket)[m
[31m-               -- First we receive in a blocking fashion so that ctx->downstream_co_ctx will be changed[m
[31m-               local data, err, partial = req_socket:receive(1)[m
[31m-               if err ~= "timeout" then[m
[31m-                  ngx.log(ngx.ERR, "Did not get timeout in the receiving thread!")[m
[31m-                  return[m
[31m-               end[m
[31m-[m
[31m-               -- Now, sleep so that coctx->data is changed to sleep handler[m
[31m-               ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            local function writer(req_socket)[m
[31m-               -- send in a slow manner with a low timeout, so that the timeout handler will be[m
[31m-               local bytes, err = req_socket:send("slow!!!")[m
[31m-               if err ~= "timeout" then[m
[31m-                  return error("Did not get timeout in the sending thread!")[m
[31m-               end[m
[31m-            end[m
[31m-[m
[31m-            local req_socket, err = ngx.req.socket(true)[m
[31m-            if req_socket == nil then[m
[31m-               ngx.status = 500[m
[31m-               return error("Unable to get request socket:" .. (err or "nil"))[m
[31m-            end[m
[31m-[m
[31m-            local writer_thread = ngx.thread.spawn(writer, req_socket)[m
[31m-            local reader_thread = ngx.thread.spawn(reader, req_socket)[m
[31m-[m
[31m-            ngx.thread.wait(writer_thread)[m
[31m-            ngx.thread.wait(reader_thread)[m
[31m-            print("The two threads finished")[m
[31m-';[m
[31m-        }[m
[31m---- request[m
[31m-POST /t[m
[31m---- more_headers[m
[31m-Content-Length: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log: The two threads finished[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: normal downstream cosocket used in two different threads. See issue #481[m
[31m---- config[m
[31m-    lua_socket_read_timeout 1ms;[m
[31m-    lua_socket_send_timeout 1s;[m
[31m-    lua_socket_log_errors off;[m
[31m-    send_timeout 1s;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local function reader(req_socket)[m
[31m-               -- First we receive in a blocking fashion so that ctx->downstream_co_ctx will be changed[m
[31m-               local data, err, partial = req_socket:receive(1)[m
[31m-               if err ~= "timeout" then[m
[31m-                  ngx.log(ngx.ERR, "Did not get timeout in the receiving thread!")[m
[31m-                  return[m
[31m-               end[m
[31m-[m
[31m-               -- Now, sleep so that coctx->data is changed to sleep handler[m
[31m-               ngx.sleep(1)[m
[31m-            end[m
[31m-[m
[31m-            local function writer(req_socket)[m
[31m-               -- send in a slow manner with a low timeout, so that the timeout handler will be[m
[31m-               ngx.sleep(0.3)[m
[31m-               ngx.say("slow!!!")[m
[31m-               ngx.flush(true)[m
[31m-            end[m
[31m-[m
[31m-            local req_socket, err = ngx.req.socket()[m
[31m-            if req_socket == nil then[m
[31m-               ngx.status = 500[m
[31m-               return error("Unable to get request socket:" .. (err or "nil"))[m
[31m-            end[m
[31m-[m
[31m-            local writer_thread = ngx.thread.spawn(writer, req_socket)[m
[31m-            local reader_thread = ngx.thread.spawn(reader, req_socket)[m
[31m-[m
[31m-            ngx.thread.wait(writer_thread)[m
[31m-            ngx.thread.wait(reader_thread)[m
[31m-            print("The two threads finished")[m
[31m-';[m
[31m-        }[m
[31m---- request[m
[31m-POST /t[m
[31m---- more_headers[m
[31m-Content-Length: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log: The two threads finished[m
[31m---- wait: 0.1[m
[31m---- ignore_response[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/132-lua-blocks.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/132-lua-blocks.t[m
[1mdeleted file mode 100644[m
[1mindex e2933e9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/132-lua-blocks.t[m
[1m+++ /dev/null[m
[36m@@ -1,590 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-#repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: content_by_lua_block (simplest)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: content_by_lua_block (nested curly braces)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local a = {[m
[31m-                dogs = {32, 78, 96},[m
[31m-                cat = "kitty",[m
[31m-            }[m
[31m-            ngx.say("a.dogs[1] = ", a.dogs[1])[m
[31m-            ngx.say("a.dogs[2] = ", a.dogs[2])[m
[31m-            ngx.say("a.dogs[3] = ", a.dogs[3])[m
[31m-            ngx.say("a.cat = ", a.cat)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-a.dogs[1] = 32[m
[31m-a.dogs[2] = 78[m
[31m-a.dogs[3] = 96[m
[31m-a.cat = kitty[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: content_by_lua_block (curly braces in strings)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("}1, 2)")[m
[31m-            ngx.say('{1, 2)')[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-}1, 2)[m
[31m-{1, 2)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: content_by_lua_block (curly braces in strings, with escaped terminators)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("\"}1, 2)")[m
[31m-            ngx.say('\'{1, 2)')[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-"}1, 2)[m
[31m-'{1, 2)[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: content_by_lua_block (curly braces in long brackets)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            --[[[m
[31m-                {{{[m
[31m-[m
[31m-                        }[m
[31m-            ]][m
[31m-            --[==[[m
[31m-                }}}[m
[31m-[m
[31m-                        {[m
[31m-            ]==][m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: content_by_lua_block ("nested" long brackets)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            --[[[m
[31m-                ]=][m
[31m-            '  "[m
[31m-                        }[m
[31m-            ]][m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: content_by_lua_block (curly braces in line comments)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            --}} {}[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: content_by_lua_block (cosockets)[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-            local port = ngx.var.port[m
[31m-            local ok, err = sock:connect('127.0.0.1', tonumber(ngx.var.server_port))[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to connect: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say('connected: ', ok)[m
[31m-[m
[31m-            local req = "GET /foo HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"[m
[31m-            -- req = "OK"[m
[31m-[m
[31m-            local bytes, err = sock:send(req)[m
[31m-            if not bytes then[m
[31m-                ngx.say("failed to send request: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ngx.say("request sent: ", bytes)[m
[31m-[m
[31m-            while true do[m
[31m-                local line, err, part = sock:receive()[m
[31m-                if line then[m
[31m-                    ngx.say("received: ", line)[m
[31m-[m
[31m-                else[m
[31m-                    ngx.say("failed to receive a line: ", err, " [", part, "]")[m
[31m-                    break[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            ok, err = sock:close()[m
[31m-            ngx.say("close: ", ok, " ", err)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location /foo {[m
[31m-        content_by_lua_block { ngx.say("foo") }[m
[31m-        more_clear_headers Date;[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-request sent: 57[m
[31m-received: HTTP/1.1 200 OK[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-failed to receive a line: closed [][m
[31m-close: 1 nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: all in one[m
[31m---- http_config[m
[31m-    init_by_lua_block {[m
[31m-        glob = "init by lua }here{"[m
[31m-    }[m
[31m-[m
[31m-    init_worker_by_lua_block {[m
[31m-        glob = glob .. ", init worker }here{"[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $a '';[m
[31m-        rewrite_by_lua_block {[m
[31m-            local s = ngx.var.a[m
[31m-            s = s .. "}rewrite{\n"[m
[31m-            ngx.var.a = s[m
[31m-        }[m
[31m-        access_by_lua_block {[m
[31m-            local s = ngx.var.a[m
[31m-            s = s .. '}access{\n'[m
[31m-            ngx.var.a = s[m
[31m-        }[m
[31m-        content_by_lua_block {[m
[31m-            local s = ngx.var.a[m
[31m-            s = s .. [[}content{]][m
[31m-            ngx.say(s)[m
[31m-            ngx.say("glob: ", glob)[m
[31m-        }[m
[31m-        log_by_lua_block {[m
[31m-            print("log by lua running \"}{!\"")[m
[31m-        }[m
[31m-        header_filter_by_lua_block {[m
[31m-            ngx.header["Foo"] = "\"Hello, world\""[m
[31m-            ngx.header["Content-Length"] = nil[m
[31m-        }[m
[31m-        body_filter_by_lua_block {[m
[31m-            local data, eof = ngx.arg[1], ngx.arg[2][m
[31m-            print("eof = ", eof)[m
[31m-            if eof then[m
[31m-                if not data then[m
[31m-                    data = ""[m
[31m-                end[m
[31m-                data = data .. "}body filter{\n"[m
[31m-                print("data: ", data)[m
[31m-                ngx.arg[1] = data[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-}rewrite{[m
[31m-}access{[m
[31m-}content{[m
[31m-glob: init by lua }here{, init worker }here{[m
[31m-}body filter{[m
[31m-[m
[31m---- response_headers[m
[31m-Foo: "Hello, world"[m
[31m---- error_log[m
[31m-log by lua running "}{!"[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: missing ]] (string)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say([[hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? Lua code block missing the closing long bracket "]]" in .*?\bnginx\.conf:41/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: missing ]==] (string)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say([==[hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? Lua code block missing the closing long bracket "]==]" in .*?\bnginx\.conf:41/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: missing ]] (comment)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say(--[[hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? Lua code block missing the closing long bracket "]]" in .*?\bnginx\.conf:41/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: missing ]=] (comment)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say(--[=[hello, world")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- must_die[m
[31m---- error_log eval[m
[31m-qr/\[emerg\] .*? Lua code block missing the closing long bracket "]=]" in .*?\bnginx\.conf:41/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: missing }[m
[31m-FIXME: we need better diagnostics by actually loading the inlined Lua code while parsing[m
[31m-the *_by_lua_block directive.[m
[31m-[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("hello")[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- error_log[m
[31m-"events" directive is not allowed here[m
[31m---- must_die[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: content_by_lua_block (compact)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {ngx.say("hello, world", {"!"})}[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello, world![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: content_by_lua_block unexpected closing long brackets must FAIL[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ]=][m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr{\[error\] .*? unexpected symbol near ']'}[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: content_by_lua_block unexpected closing long brackets ignored (GitHub #748)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local t1, t2 = {"hello world"}, {1}[m
[31m-            ngx.say(t1[t2[1]])[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-hello world[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: simple set_by_lua_block (integer)[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        set_by_lua_block $res { return 1+1 }[m
[31m-        echo $res;[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-2[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: ambiguous line comments inside a long bracket string (GitHub #596)[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say([[ok--]])[m
[31m-            ngx.say([==[ok--]==])[m
[31m-            ngx.say([==[ok-- ]==])[m
[31m-            --[[ --]] ngx.say("done")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok--[m
[31m-ok--[m
[31m-ok-- [m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: double quotes in long brackets[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua_block { print([[Hey, it is "!]]) } content_by_lua_block { ngx.say([["]]) }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-"[m
[31m---- error_log[m
[31m-Hey, it is "![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 21: single quotes in long brackets[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        rewrite_by_lua_block { print([[Hey, it is '!]]) } content_by_lua_block { ngx.say([[']]) }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-'[m
[31m---- error_log[m
[31m-Hey, it is '![m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 22: lexer no match due to incomplete data chunks in a fixed size buffer[m
[31m---- config[m
[31m-        location /test1 {[m
[31m-            content_by_lua_block {[m
[31m-                ngx.say("1: this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error")[m
[31m-            }[m
[31m-        }[m
[31m-        location /test2 {[m
[31m-            content_by_lua_block {[m
[31m-                ngx.say("2: this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error")[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        location /test3 {[m
[31m-            content_by_lua_block {[m
[31m-                ngx.say("3: this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error",[m
[31m-                "this is just some random filler to cause an error")[m
[31m-            }[m
[31m-        }[m
[31m---- request[m
[31m-GET /test3[m
[31m---- response_body eval[m
[31m-"3: " . ("this is just some random filler to cause an error" x 20) . "\n"[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/133-worker-count.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/133-worker-count.t[m
[1mdeleted file mode 100644[m
[1mindex c97f6b4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/133-worker-count.t[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: content_by_lua[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("workers: ", ngx.worker.count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-workers: 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua_block {[m
[31m-        package.loaded.count = ngx.worker.count()[m
[31m-    }[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("workers: ", package.loaded.count)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-workers: 1[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/134-worker-count-5.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/134-worker-count-5.t[m
[1mdeleted file mode 100644[m
[1mindex b257c12..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/134-worker-count-5.t[m
[1m+++ /dev/null[m
[36m@@ -1,78 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-workers(5);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("worker count: ", ngx.worker.count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-worker count: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: init_by_lua[m
[31m---- http_config[m
[31m-    init_by_lua_block {[m
[31m-        package.loaded.count = ngx.worker.count()[m
[31m-    }[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("workers: ", package.loaded.count)[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-workers: 5[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: init_by_lua + module (github #681)[m
[31m---- http_config[m
[31m-    lua_package_path "t/servroot/html/?.lua;;";[m
[31m-[m
[31m-    init_by_lua_block {[m
[31m-        local blah = require "file"[m
[31m-    }[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("ok")[m
[31m-        }[m
[31m-    }[m
[31m---- user_files[m
[31m->>> file.lua[m
[31m-local timer_interval = 1[m
[31m-local time_factor = timer_interval / (ngx.worker.count() * 60)[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-ok[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/135-worker-id.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/135-worker-id.t[m
[1mdeleted file mode 100644[m
[1mindex 3c1f24d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/135-worker-id.t[m
[1m+++ /dev/null[m
[36m@@ -1,93 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-master_on();[m
[31m-workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-#repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- config[m
[31m-    location /lua {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.say("worker id: ", ngx.worker.id())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body_like chop[m
[31m-^worker id: [0-1]$[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- skip_nginx: 3: <=1.9.0[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: worker id should be nil for non-worker processes[m
[31m---- http_config[m
[31m-    proxy_cache_path conf/cache levels=1:2 keys_zone=my-cache:8m max_size=10m inactive=60m;[m
[31m-    proxy_temp_path conf/temp;[m
[31m-[m
[31m-    lua_shared_dict counters 1m;[m
[31m-[m
[31m-    init_by_lua_block {[m
[31m-        ngx.shared.counters:set("c", 0)[m
[31m-    }[m
[31m-[m
[31m-    init_worker_by_lua_block {[m
[31m-        ngx.shared.counters:incr("c", 1)[m
[31m-        ngx.log(ngx.INFO, ngx.worker.pid(), ": worker id ", ngx.worker.id());[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local counters = ngx.shared.counters[m
[31m-            local ok, c[m
[31m-            for i = 1, 45 do[m
[31m-                c = counters:get("c")[m
[31m-                if c >= 4 then[m
[31m-                    ok = true[m
[31m-                    break[m
[31m-                end[m
[31m-                local delay = 0.001 * i[m
[31m-                if delay > 0.1 then[m
[31m-                    delay = 0.1[m
[31m-                end[m
[31m-                ngx.sleep(delay)[m
[31m-            end[m
[31m-            if ok then[m
[31m-                ngx.say("ok")[m
[31m-            else[m
[31m-                ngx.say("not ok: c=", c)[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m-    location /cache {[m
[31m-        proxy_pass http://127.0.0.1:$server_port;[m
[31m-        proxy_cache my-cache;[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m---- grep_error_log eval: qr/worker id nil/[m
[31m---- grep_error_log_out[m
[31m-worker id nil[m
[31m-worker id nil[m
[31m---- no_error_log[m
[31m-[error][m
[31m---- wait: 0.1[m
[31m---- skip_nginx: 3: <=1.9.0[m
[31m---- log_level: info[m
[31m---- timeout: 6[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/136-timer-counts.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/136-timer-counts.t[m
[1mdeleted file mode 100644[m
[1mindex 8f5329b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/136-timer-counts.t[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => blocks() * (repeat_each() * 3);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: running count with no running timers[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block { ngx.say(ngx.timer.running_count()) }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: running count with no pending timers[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block { ngx.say(ngx.timer.pending_count()) }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-0[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: pending count with one pending timer[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.timer.at(3, function() end)[m
[31m-            ngx.say(ngx.timer.pending_count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: pending count with 3 pending timers[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.timer.at(4, function() end)[m
[31m-            ngx.timer.at(2, function() end)[m
[31m-            ngx.timer.at(1, function() end)[m
[31m-            ngx.say(ngx.timer.pending_count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-3[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: one running timer[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.timer.at(0.1, function() ngx.sleep(0.3) end)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.say(ngx.timer.running_count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: 3 running timers[m
[31m---- config[m
[31m-    location /timers {[m
[31m-        content_by_lua_block {[m
[31m-            ngx.timer.at(0.1, function() ngx.sleep(0.3) end)[m
[31m-            ngx.timer.at(0.11, function() ngx.sleep(0.3) end)[m
[31m-            ngx.timer.at(0.09, function() ngx.sleep(0.3) end)[m
[31m-            ngx.sleep(0.2)[m
[31m-            ngx.say(ngx.timer.running_count())[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /timers[m
[31m---- response_body[m
[31m-3[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/137-req-misc.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/137-req-misc.t[m
[1mdeleted file mode 100644[m
[1mindex 20ada3c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/137-req-misc.t[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#master_on();[m
[31m-#workers(1);[m
[31m-#worker_connections(1014);[m
[31m-#log_level('warn');[m
[31m-#master_process_enabled(1);[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks() * 2;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-#no_shuffle();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: not internal request[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite ^/test$ /lua last;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            if ngx.req.is_internal() then[m
[31m-                ngx.say("internal")[m
[31m-            else[m
[31m-                ngx.say("not internal")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /lua[m
[31m---- response_body[m
[31m-not internal[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: internal request[m
[31m---- config[m
[31m-    location /test {[m
[31m-        rewrite ^/test$ /lua last;[m
[31m-    }[m
[31m-    location /lua {[m
[31m-        content_by_lua '[m
[31m-            if ngx.req.is_internal() then[m
[31m-                ngx.say("internal")[m
[31m-            else[m
[31m-                ngx.say("not internal")[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- response_body[m
[31m-internal[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/138-balancer.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/138-balancer.t[m
[1mdeleted file mode 100644[m
[1mindex e44cf8e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/138-balancer.t[m
[1m+++ /dev/null[m
[36m@@ -1,407 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 4 + 8);[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple logging[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: exit 403[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            ngx.exit(403)[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log[m
[31m-[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,[m
[31m---- no_error_log eval[m
[31m-[[m
[31m-'[warn]',[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"},[m
[31m-][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: exit OK[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("hello from balancer by lua!")[m
[31m-            ngx.exit(ngx.OK)[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] balancer_by_lua:2: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: ngx.var works[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("1: variable foo = ", ngx.var.foo)[m
[31m-            ngx.var.foo = tonumber(ngx.var.foo) + 1[m
[31m-            print("2: variable foo = ", ngx.var.foo)[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        set $foo 32;[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-"1: variable foo = 32",[m
[31m-"2: variable foo = 33",[m
[31m-qr/\[crit\] .* connect\(\) .*? failed/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.req.get_headers works[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("header foo: ", ngx.req.get_headers()["foo"])[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-"header foo: bar",[m
[31m-qr/\[crit\] .* connect\(\) .*? failed/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.req.get_uri_args() works[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("arg foo: ", ngx.req.get_uri_args()["foo"])[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t?baz=blah&foo=bar[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-["arg foo: bar",[m
[31m-qr/\[crit\] .* connect\(\) .*? failed/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.req.get_method() works[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("method: ", ngx.req.get_method())[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- more_headers[m
[31m-Foo: bar[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-"method: GET",[m
[31m-qr/\[crit\] .* connect\(\) .*? failed/,[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: simple logging (by_lua_file)[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_file html/a.lua;[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-print("hello from balancer by lua!")[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- error_log eval[m
[31m-[[m
[31m-'[lua] a.lua:1: hello from balancer by lua! while connecting to upstream,',[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"},[m
[31m-][m
[31m---- no_error_log[m
[31m-[warn][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: cosockets are disabled[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            local sock, err = ngx.socket.tcp()[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? failed to run balancer_by_lua\*: balancer_by_lua:2: API disabled in the context of balancer_by_lua\*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: ngx.sleep is disabled[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            ngx.sleep(0.1)[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 500 Internal Server Error[m
[31m---- error_code: 500[m
[31m---- error_log eval[m
[31m-qr/\[error\] .*? failed to run balancer_by_lua\*: balancer_by_lua:2: API disabled in the context of balancer_by_lua\*/[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: get_phase[m
[31m---- http_config[m
[31m-    upstream backend {[m
[31m-        server 0.0.0.1;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("I am in phase ", ngx.get_phase())[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like: 502 Bad Gateway[m
[31m---- error_code: 502[m
[31m---- grep_error_log eval: qr/I am in phase \w+/[m
[31m---- grep_error_log_out[m
[31m-I am in phase balancer[m
[31m---- error_log eval[m
[31m-qr{\[crit\] .*? connect\(\) to 0\.0\.0\.1:80 failed .*?, upstream: "http://0\.0\.0\.1:80/t"}[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: code cache off[m
[31m---- http_config[m
[31m-    lua_package_path "t/servroot/html/?.lua;;";[m
[31m-[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            require("test")[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        echo_location /main;[m
[31m-        echo_location /update;[m
[31m-        echo_location /main;[m
[31m-    }[m
[31m-[m
[31m-    location = /update {[m
[31m-        content_by_lua_block {[m
[31m-            -- os.execute("(echo HERE; pwd) > /dev/stderr")[m
[31m-            local f = assert(io.open("t/servroot/html/test.lua", "w"))[m
[31m-            f:write("print('me: ', 101)")[m
[31m-            f:close()[m
[31m-            ngx.say("updated")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- user_files[m
[31m->>> test.lua[m
[31m-print("me: ", 32)[m
[31m-return {}[m
[31m---- response_body[m
[31m-ok[m
[31m-updated[m
[31m-ok[m
[31m---- grep_error_log eval: qr/\bme: \w+/[m
[31m---- grep_error_log_out[m
[31m-me: 32[m
[31m-me: 101[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: lua subrequests[m
[31m---- http_config[m
[31m-    lua_package_path "t/servroot/html/?.lua;;";[m
[31m-[m
[31m-    lua_code_cache off;[m
[31m-[m
[31m-    upstream backend {[m
[31m-        server 127.0.0.1:$TEST_NGINX_SERVER_PORT;[m
[31m-        balancer_by_lua_block {[m
[31m-            print("ctx counter: ", ngx.ctx.count)[m
[31m-            if not ngx.ctx.count then[m
[31m-                ngx.ctx.count = 1[m
[31m-            else[m
[31m-                ngx.ctx.count = ngx.ctx.count + 1[m
[31m-            end[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local res = ngx.location.capture("/main")[m
[31m-            ngx.print(res.body)[m
[31m-            res = ngx.location.capture("/main")[m
[31m-            ngx.print(res.body)[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    location = /main {[m
[31m-        proxy_pass http://backend/back;[m
[31m-    }[m
[31m-[m
[31m-    location = /back {[m
[31m-        echo ok;[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-ok[m
[31m-ok[m
[31m---- grep_error_log eval: qr/\bctx counter: \w+/[m
[31m---- grep_error_log_out[m
[31m-ctx counter: nil[m
[31m-ctx counter: nil[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/139-ssl-cert-by.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/139-ssl-cert-by.t[m
[1mdeleted file mode 100644[m
[1mindex 9297a0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/139-ssl-cert-by.t[m
[1m+++ /dev/null[m
[36m@@ -1,1477 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-# All these tests need to have new openssl[m
[31m-my $NginxBinary = $ENV{'TEST_NGINX_BINARY'} || 'nginx';[m
[31m-my $openssl_version = eval { `$NginxBinary -V 2>&1` };[m
[31m-[m
[31m-if ($openssl_version =~ m/built with OpenSSL (0|1\.0\.(?:0|1[^\d]|2[a-d]).*)/) {[m
[31m-    plan(skip_all => "too old OpenSSL, need 1.0.2e, was $1");[m
[31m-} else {[m
[31m-    plan tests => repeat_each() * (blocks() * 6 + 10);[m
[31m-}[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple logging[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block { print("ssl cert by lua is running!") }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ssl_certificate_by_lua:1: ssl cert by lua is running![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sleep[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local begin = ngx.now()[m
[31m-            ngx.sleep(0.1)[m
[31m-            print("elapsed in ssl cert by lua: ", ngx.now() - begin)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua ssl server name: "test.com"',[m
[31m-qr/elapsed in ssl cert by lua: 0.(?:09|1[01])\d+,/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: timer[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local function f()[m
[31m-                print("my timer run!")[m
[31m-            end[m
[31m-            local ok, err = ngx.timer.at(0, f)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to create timer: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-my timer run![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cosocket[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local sock = ngx.socket.tcp()[m
[31m-[m
[31m-            sock:settimeout(2000)[m
[31m-[m
[31m-            local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to connect to memc: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local bytes, err = sock:send("flush_all\r\n")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send flush_all command: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local res, err = sock:receive()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "failed to receive memc reply: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            print("received memc reply: ", res)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-received memc reply: OK[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: ngx.exit(0) - no yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.exit(0)[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-lua exit with code 0[m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: ngx.exit(ngx.ERROR) - no yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua_certificate_by_lua: handler return value: -1, cert cb exit code: 0',[m
[31m-qr/\[crit\] .*? SSL_do_handshake\(\) failed .*?cert cb error/,[m
[31m-'lua exit with code -1',[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: ngx.exit(0) -  yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.sleep(0.001)[m
[31m-            ngx.exit(0)[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: boolean[m
[31m-[m
[31m---- error_log[m
[31m-lua exit with code 0[m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[error][m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: ngx.exit(ngx.ERROR) - yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.sleep(0.001)[m
[31m-            ngx.exit(ngx.ERROR)[m
[31m-[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua_certificate_by_lua: cert cb exit code: 0',[m
[31m-qr/\[crit\] .*? SSL_do_handshake\(\) failed .*?cert cb error/,[m
[31m-'lua exit with code -1',[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: lua exception - no yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            error("bad bad bad")[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'runtime error: ssl_certificate_by_lua:2: bad bad bad',[m
[31m-'lua_certificate_by_lua: handler return value: 500, cert cb exit code: 0',[m
[31m-qr/\[crit\] .*? SSL_do_handshake\(\) failed .*?cert cb error/,[m
[31m-qr/context: ssl_certificate_by_lua\*, client: \d+\.\d+\.\d+\.\d+, server: \d+\.\d+\.\d+\.\d+:\d+/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: lua exception - yield[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen 127.0.0.2:8080 ssl;[m
[31m-        server_name test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.sleep(0.001)[m
[31m-            error("bad bad bad")[m
[31m-            ngx.log(ngx.ERR, "should never reached here...")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-    lua_ssl_verify_depth 3;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("127.0.0.2", 8080)[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, nil, true, false)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'runtime error: ssl_certificate_by_lua:3: bad bad bad',[m
[31m-'lua_certificate_by_lua: cert cb exit code: 0',[m
[31m-qr/\[crit\] .*? SSL_do_handshake\(\) failed .*?cert cb error/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-should never reached here[m
[31m-[alert][m
[31m-[emerg][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: get phase[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {print("get_phase: ", ngx.get_phase())}[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end[m
[31m-            collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-get_phase: ssl_cert[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: connection aborted prematurely[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            ngx.sleep(0.3)[m
[31m-            -- local ssl = require "ngx.ssl"[m
[31m-            -- ssl.clear_certs()[m
[31m-            print("ssl-cert-by-lua: after sleeping")[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(150)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(false, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m-[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: timeout[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ssl-cert-by-lua: after sleeping[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- wait: 0.6[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: subrequests disabled[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {ngx.location.capture("/foo")}[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-failed to do SSL handshake: handshake failed[m
[31m-[m
[31m---- error_log eval[m
[31m-[[m
[31m-'lua ssl server name: "test.com"',[m
[31m-'ssl_certificate_by_lua:1: API disabled in the context of ssl_certificate_by_lua*',[m
[31m-qr/\[crit\] .*?cert cb error/,[m
[31m-][m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: simple logging (by_lua_file)[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_file html/a.lua;[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block {ngx.status = 201 ngx.say("foo") ngx.exit(201)}[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- user_files[m
[31m->>> a.lua[m
[31m-print("ssl cert by lua is running!")[m
[31m-[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-a.lua:1: ssl cert by lua is running![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: coroutine API[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local cc, cr, cy = coroutine.create, coroutine.resume, coroutine.yield[m
[31m-[m
[31m-            local function f()[m
[31m-                local cnt = 0[m
[31m-                for i = 1, 20 do[m
[31m-                    print("co yield: ", cnt)[m
[31m-                    cy()[m
[31m-                    cnt = cnt + 1[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            local c = cc(f)[m
[31m-            for i = 1, 3 do[m
[31m-                print("co resume, status: ", coroutine.status(c))[m
[31m-                cr(c)[m
[31m-            end[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- grep_error_log eval: qr/co (?:yield: \d+|resume, status: \w+)/[m
[31m---- grep_error_log_out[m
[31m-co resume, status: suspended[m
[31m-co yield: 0[m
[31m-co resume, status: suspended[m
[31m-co yield: 1[m
[31m-co resume, status: suspended[m
[31m-co yield: 2[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: simple user thread wait with yielding[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            function f()[m
[31m-                ngx.sleep(0.01)[m
[31m-                print("uthread: hello in thread")[m
[31m-                return "done"[m
[31m-            end[m
[31m-[m
[31m-            local t, err = ngx.thread.spawn(f)[m
[31m-            if not t then[m
[31m-                ngx.log(ngx.ERR, "uthread: failed to spawn thread: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-[m
[31m-            print("uthread: thread created: ", coroutine.status(t))[m
[31m-[m
[31m-            local ok, res = ngx.thread.wait(t)[m
[31m-            if not ok then[m
[31m-                print("uthread: failed to wait thread: ", res)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            print("uthread: ", res)[m
[31m-        }[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m---- grep_error_log eval: qr/uthread: [^.,]+/[m
[31m---- grep_error_log_out[m
[31m-uthread: thread created: running[m
[31m-uthread: hello in thread[m
[31m-uthread: done[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: simple logging - use ssl_certificiate_by_lua* on the http {} level[m
[31m-GitHub openresty/lua-resty-core#42[m
[31m---- http_config[m
[31m-    ssl_certificate_by_lua_block { print("ssl cert by lua is running!") }[m
[31m-    ssl_certificate ../../cert/test.crt;[m
[31m-    ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-ssl_certificate_by_lua:1: ssl cert by lua is running![m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/140-ssl-c-api.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/140-ssl-c-api.t[m
[1mdeleted file mode 100644[m
[1mindex 4ecc2cd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/140-ssl-c-api.t[m
[1m+++ /dev/null[m
[36m@@ -1,499 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-repeat_each(3);[m
[31m-[m
[31m-# All these tests need to have new openssl[m
[31m-my $NginxBinary = $ENV{'TEST_NGINX_BINARY'} || 'nginx';[m
[31m-my $openssl_version = eval { `$NginxBinary -V 2>&1` };[m
[31m-[m
[31m-if ($openssl_version =~ m/built with OpenSSL (0|1\.0\.(?:0|1[^\d]|2[a-d]).*)/) {[m
[31m-    plan(skip_all => "too old OpenSSL, need 1.0.2e, was $1");[m
[31m-} else {[m
[31m-    plan tests => repeat_each() * (blocks() * 5 + 1);[m
[31m-}[m
[31m-[m
[31m-$ENV{TEST_NGINX_HTML_DIR} ||= html_dir();[m
[31m-[m
[31m-#log_level 'warn';[m
[31m-log_level 'debug';[m
[31m-[m
[31m-no_long_string();[m
[31m-#no_diff();[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: simple cert + private key[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_set_der_certificate(void *r,[m
[31m-                    const char *data, size_t len, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_set_der_private_key(void *r,[m
[31m-                    const char *data, size_t len, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_clear_certs(void *r, char **err);[m
[31m-            ]][m
[31m-[m
[31m-            local errmsg = ffi.new("char *[1]")[m
[31m-[m
[31m-            local r = getfenv(0).__ngx_req[m
[31m-            if not r then[m
[31m-                ngx.log(ngx.ERR, "no request found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ffi.C.ngx_http_lua_ffi_ssl_clear_certs(r, errmsg)[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/test.crt", "rb"))[m
[31m-            local cert = f:read("*all")[m
[31m-            f:close()[m
[31m-[m
[31m-            local out = ffi.new("char [?]", #cert)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_cert_pem_to_der(cert, #cert, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cert_der = ffi.string(out, rc)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_certificate(r, cert_der, #cert_der, errmsg)[m
[31m-            if rc ~= 0 then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            f = assert(io.open("t/cert/test.key", "rb"))[m
[31m-            local pkey = f:read("*all")[m
[31m-            f:close()[m
[31m-[m
[31m-            out = ffi.new("char [?]", #pkey)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pkey_der = ffi.string(out, rc)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_private_key(r, pkey_der, #pkey_der, errmsg)[m
[31m-            if rc ~= 0 then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: ECDSA cert + private key[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_set_der_certificate(void *r,[m
[31m-                    const char *data, size_t len, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_set_der_private_key(void *r,[m
[31m-                    const char *data, size_t len, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_ssl_clear_certs(void *r, char **err);[m
[31m-            ]][m
[31m-[m
[31m-            local errmsg = ffi.new("char *[1]")[m
[31m-[m
[31m-            local r = getfenv(0).__ngx_req[m
[31m-            if not r then[m
[31m-                ngx.log(ngx.ERR, "no request found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            ffi.C.ngx_http_lua_ffi_ssl_clear_certs(r, errmsg)[m
[31m-[m
[31m-            local f = assert(io.open("t/cert/test_ecdsa.crt", "rb"))[m
[31m-            local cert = f:read("*all")[m
[31m-            f:close()[m
[31m-[m
[31m-            local out = ffi.new("char [?]", #cert)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_cert_pem_to_der(cert, #cert, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cert_der = ffi.string(out, rc)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_certificate(r, cert_der, #cert_der, errmsg)[m
[31m-            if rc ~= 0 then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            f = assert(io.open("t/cert/test_ecdsa.key", "rb"))[m
[31m-            local pkey = f:read("*all")[m
[31m-            f:close()[m
[31m-[m
[31m-            out = ffi.new("char [?]", #pkey)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local pkey_der = ffi.string(out, rc)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_private_key(r, pkey_der, #pkey_der, errmsg)[m
[31m-            if rc ~= 0 then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-                return[m
[31m-            end[m
[31m-        }[m
[31m-[m
[31m-        ssl_certificate ../../cert/test2.crt;[m
[31m-        ssl_certificate_key ../../cert/test2.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test_ecdsa.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[alert][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: Handshake continue when cert_pem_to_der errors[m
[31m---- http_config[m
[31m-    server {[m
[31m-        listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;[m
[31m-        server_name   test.com;[m
[31m-[m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            collectgarbage()[m
[31m-[m
[31m-            local ffi = require "ffi"[m
[31m-[m
[31m-            ffi.cdef[[[m
[31m-                int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-[m
[31m-                int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,[m
[31m-                    size_t pem_len, unsigned char *der, char **err);[m
[31m-            ]][m
[31m-[m
[31m-            local errmsg = ffi.new("char *[1]")[m
[31m-[m
[31m-            local r = getfenv(0).__ngx_req[m
[31m-            if not r then[m
[31m-                ngx.log(ngx.ERR, "no request found")[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local cert = "garbage data"[m
[31m-[m
[31m-            local out = ffi.new("char [?]", #cert)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_cert_pem_to_der(cert, #cert, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM cert: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-            end[m
[31m-[m
[31m-            local pkey = "garbage key data"[m
[31m-[m
[31m-            out = ffi.new("char [?]", #pkey)[m
[31m-[m
[31m-            local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)[m
[31m-            if rc < 1 then[m
[31m-                ngx.log(ngx.ERR, "failed to parse PEM priv key: ",[m
[31m-                        ffi.string(errmsg[0]))[m
[31m-            end[m
[31m-        }[m
[31m-[m
[31m-        ssl_certificate ../../cert/test.crt;[m
[31m-        ssl_certificate_key ../../cert/test.key;[m
[31m-[m
[31m-        server_tokens off;[m
[31m-        location /foo {[m
[31m-            default_type 'text/plain';[m
[31m-            content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }[m
[31m-            more_clear_headers Date;[m
[31m-        }[m
[31m-    }[m
[31m---- config[m
[31m-    server_tokens off;[m
[31m-    lua_ssl_trusted_certificate ../../cert/test.crt;[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua_block {[m
[31m-            do[m
[31m-                local sock = ngx.socket.tcp()[m
[31m-[m
[31m-                sock:settimeout(2000)[m
[31m-[m
[31m-                local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")[m
[31m-                if not ok then[m
[31m-                    ngx.say("failed to connect: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("connected: ", ok)[m
[31m-[m
[31m-                local sess, err = sock:sslhandshake(nil, "test.com", true)[m
[31m-                if not sess then[m
[31m-                    ngx.say("failed to do SSL handshake: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("ssl handshake: ", type(sess))[m
[31m-[m
[31m-                local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"[m
[31m-                local bytes, err = sock:send(req)[m
[31m-                if not bytes then[m
[31m-                    ngx.say("failed to send http request: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-[m
[31m-                ngx.say("sent http request: ", bytes, " bytes.")[m
[31m-[m
[31m-                while true do[m
[31m-                    local line, err = sock:receive()[m
[31m-                    if not line then[m
[31m-                        -- ngx.say("failed to recieve response status line: ", err)[m
[31m-                        break[m
[31m-                    end[m
[31m-[m
[31m-                    ngx.say("received: ", line)[m
[31m-                end[m
[31m-[m
[31m-                local ok, err = sock:close()[m
[31m-                ngx.say("close: ", ok, " ", err)[m
[31m-            end  -- do[m
[31m-            -- collectgarbage()[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-connected: 1[m
[31m-ssl handshake: userdata[m
[31m-sent http request: 56 bytes.[m
[31m-received: HTTP/1.1 201 Created[m
[31m-received: Server: nginx[m
[31m-received: Content-Type: text/plain[m
[31m-received: Content-Length: 4[m
[31m-received: Connection: close[m
[31m-received: [m
[31m-received: foo[m
[31m-close: 1 nil[m
[31m-[m
[31m---- error_log[m
[31m-lua ssl server name: "test.com"[m
[31m-failed to parse PEM cert: PEM_read_bio_X509_AUX()[m
[31m-failed to parse PEM priv key: PEM_read_bio_PrivateKey failed[m
[31m-[m
[31m---- no_error_log[m
[31m-[alert][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/141-luajit.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/141-luajit.t[m
[1mdeleted file mode 100644[m
[1mindex be03fe3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/141-luajit.t[m
[1m+++ /dev/null[m
[36m@@ -1,47 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-#no_diff();[m
[31m-#no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: avoid the data segment from growing on Linux[m
[31m-This is to maximize the address space that can be used by LuaJIT.[m
[31m---- config[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local ffi = require "ffi"[m
[31m-            ffi.cdef[[[m
[31m-                void *malloc(size_t size);[m
[31m-                void free(void *p);[m
[31m-            ]][m
[31m-            local p = ffi.C.malloc(1);[m
[31m-            local num = tonumber(ffi.cast("uintptr_t", p))[m
[31m-            ffi.C.free(p)[m
[31m-            if ffi.abi("64bit") then[m
[31m-                if num < 2^31 then[m
[31m-                    ngx.say("fail: ", string.format("p = %#x", num))[m
[31m-                    return[m
[31m-                end[m
[31m-            end[m
[31m-            ngx.say("pass")[m
[31m-        }[m
[31m-    }[m
[31m---- request[m
[31m-GET /t[m
[31m---- response_body[m
[31m-pass[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/StapThread.pm b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/StapThread.pm[m
[1mdeleted file mode 100644[m
[1mindex e958863..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/StapThread.pm[m
[1m+++ /dev/null[m
[36m@@ -1,282 +0,0 @@[m
[31m-package t::StapThread;[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-our $GCScript = <<'_EOC_';[m
[31m-global ids, cur[m
[31m-global in_req = 0[m
[31m-global alive_reqs[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    if (!alive_reqs[$r] && $r == $r->main) {[m
[31m-        in_req++[m
[31m-        alive_reqs[$r] = 1[m
[31m-[m
[31m-        if (in_req == 1) {[m
[31m-            delete ids[m
[31m-            cur = 0[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    if (alive_reqs[$r]) {[m
[31m-        in_req--[m
[31m-        delete alive_reqs[$r][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_terminate_request) {[m
[31m-    if (alive_reqs[$r]) {[m
[31m-        in_req--[m
[31m-        delete alive_reqs[$r][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-thread-spawn) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("spawn user thread %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-thread-delete) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("delete thread %x\n", t)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-coroutine-done) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("terminate %d: %s\n", t, $arg3 ? "ok" : "fail")[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m-_EOC_[m
[31m-[m
[31m-our $StapScript = <<'_EOC_';[m
[31m-global ids, cur[m
[31m-global timers[m
[31m-global in_req = 0[m
[31m-global co_status[m
[31m-global alive_reqs[m
[31m-[m
[31m-function gen_id(k) {[m
[31m-    if (ids[k]) return ids[k][m
[31m-    ids[k] = ++cur[m
[31m-    return cur[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_handler) {[m
[31m-    if (!alive_reqs[$r] && $r == $r->main) {[m
[31m-        in_req++[m
[31m-        alive_reqs[$r] = 1[m
[31m-[m
[31m-        printf("in req: %d\n", in_req)[m
[31m-[m
[31m-        if (in_req == 1) {[m
[31m-            delete ids[m
[31m-            cur = 0[m
[31m-            co_status[0] = "running"[m
[31m-            co_status[1] = "suspended"[m
[31m-            co_status[2] = "normal"[m
[31m-            co_status[3] = "dead"[m
[31m-        }[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_free_request) {[m
[31m-    if (alive_reqs[$r]) {[m
[31m-        in_req--[m
[31m-        println("free request")[m
[31m-        delete alive_reqs[$r][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_terminate_request) {[m
[31m-    if (alive_reqs[$r]) {[m
[31m-        in_req--[m
[31m-        println("terminate request")[m
[31m-        delete alive_reqs[$r][m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_post_thread) {[m
[31m-    id = gen_id($coctx->co)[m
[31m-    printf("post thread %d\n", id)[m
[31m-}[m
[31m-[m
[31m-M(timer-add) {[m
[31m-    timers[$arg1] = $arg2[m
[31m-    printf("add timer %d\n", $arg2)[m
[31m-}[m
[31m-[m
[31m-M(timer-del) {[m
[31m-    printf("delete timer %d\n", timers[$arg1])[m
[31m-    delete timers[$arg1][m
[31m-}[m
[31m-[m
[31m-M(timer-expire) {[m
[31m-    printf("expire timer %d\n", timers[$arg1])[m
[31m-    delete timers[$arg1][m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_handler) {[m
[31m-    printf("sleep handler called\n")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_run_thread) {[m
[31m-    id = gen_id($ctx->cur_co_ctx->co)[m
[31m-    printf("run thread %d\n", id)[m
[31m-    #if (id == 1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-[m
[31m-probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {[m
[31m-    id = gen_id($L)[m
[31m-    printf("lua resume %d\n", id)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-thread-spawn) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("spawn uthread %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-thread-delete) {[m
[31m-    t = gen_id($arg2)[m
[31m-    uthreads = @cast($arg3, "ngx_http_lua_ctx_t")->uthreads[m
[31m-    printf("delete thread %x (uthreads %d)\n", t, uthreads)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m-M(http-lua-run-posted-thread) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("run posted thread %d (status %s)\n", t, co_status[$arg3])[m
[31m-}[m
[31m-[m
[31m-M(http-lua-user-coroutine-resume) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("resume %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-M(http-lua-thread-yield) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("thread %d yield\n", t)[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-F(ngx_http_lua_coroutine_yield) {[m
[31m-    printf("yield %x\n", gen_id($L))[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-coroutine-yield) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("yield %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_atpanic) {[m
[31m-    printf("lua atpanic(%d):", gen_id($L))[m
[31m-    print_ubacktrace();[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_run_posted_threads) {[m
[31m-    printf("run posted threads\n")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_finalize_request) {[m
[31m-    printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);[m
[31m-    #if ($rc == -1) {[m
[31m-        #print_ubacktrace()[m
[31m-    #}[m
[31m-}[m
[31m-F(ngx_http_lua_post_subrequest) {[m
[31m-    printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,[m
[31m-         $r->headers_out->status, $r == $r->main)[m
[31m-    #print_ubacktrace()[m
[31m-}[m
[31m-M(http-subrequest-done) {[m
[31m-    printf("subrequest %s done\n", ngx_http_req_uri($r))[m
[31m-}[m
[31m-M(http-subrequest-wake-parent) {[m
[31m-    printf("subrequest wake parent %s\n", ngx_http_req_uri($r->parent))[m
[31m-}[m
[31m-M(http-lua-user-coroutine-create) {[m
[31m-    p = gen_id($arg2)[m
[31m-    c = gen_id($arg3)[m
[31m-    printf("create %x in %x\n", c, p)[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exec) { println("exec") }[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) { println("exit") }[m
[31m-F(ngx_http_lua_ffi_exit) { println("exit") }[m
[31m-[m
[31m-F(ngx_http_lua_req_body_cleanup) {[m
[31m-    println("lua req body cleanup")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_read_client_request_body) {[m
[31m-    println("read client request body")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_finalize_coroutines) {[m
[31m-    println("finalize coroutines")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_exit) {[m
[31m-    println("ngx.exit() called")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ffi_exit) {[m
[31m-    println("ngx.exit() called")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_sleep_resume) {[m
[31m-    println("lua sleep resume")[m
[31m-}[m
[31m-[m
[31m-M(http-lua-coroutine-done) {[m
[31m-    t = gen_id($arg2)[m
[31m-    printf("terminate coro %d: %s, waited by parent:%d, child cocotx: %p\n", t, $arg3 ? "ok" : "fail", $ctx->cur_co_ctx->waited_by_parent, $ctx->cur_co_ctx)[m
[31m-    //print_ubacktrace()[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_ngx_echo) {[m
[31m-    println("ngx.print or ngx.say")[m
[31m-}[m
[31m-[m
[31m-F(ngx_http_lua_del_all_threads) {[m
[31m-    println("del all threads")[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m-M(http-lua-info) {[m
[31m-    msg = user_string($arg1)[m
[31m-    printf("lua info: %s\n", msg)[m
[31m-}[m
[31m-*/[m
[31m-[m
[31m-M(http-lua-user-thread-wait) {[m
[31m-    p = gen_id($arg1)[m
[31m-    c = gen_id($arg2)[m
[31m-    printf("lua thread %d waiting on %d, child coctx: %p\n", p, c, $sub_coctx)[m
[31m-}[m
[31m-_EOC_[m
[31m-[m
[31m-1;[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/equifax.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/equifax.crt[m
[1mdeleted file mode 100644[m
[1mindex f300652..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/equifax.crt[m
[1m+++ /dev/null[m
[36m@@ -1,19 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV[m
[31m-UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy[m
[31m-dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1[m
[31m-MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx[m
[31m-dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B[m
[31m-AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f[m
[31m-BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A[m
[31m-cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC[m
[31m-AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ[m
[31m-MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm[m
[31m-aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw[m
[31m-ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj[m
[31m-IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF[m
[31m-MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA[m
[31m-A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y[m
[31m-7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh[m
[31m-1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/startcom.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/startcom.crt[m
[1mdeleted file mode 100644[m
[1mindex a5185ca..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/startcom.crt[m
[1m+++ /dev/null[m
[36m@@ -1,87 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW[m
[31m-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg[m
[31m-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh[m
[31m-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9[m
[31m-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi[m
[31m-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh[m
[31m-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA[m
[31m-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk[m
[31m-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf[m
[31m-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C[m
[31m-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT[m
[31m-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi[m
[31m-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM[m
[31m-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w[m
[31m-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+[m
[31m-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3[m
[31m-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B[m
[31m-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID[m
[31m-AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD[m
[31m-VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul[m
[31m-F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC[m
[31m-ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w[m
[31m-ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk[m
[31m-aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0[m
[31m-YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg[m
[31m-c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0[m
[31m-aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93[m
[31m-d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG[m
[31m-CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1[m
[31m-dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF[m
[31m-wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS[m
[31m-Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst[m
[31m-0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc[m
[31m-pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl[m
[31m-CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF[m
[31m-P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK[m
[31m-1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm[m
[31m-KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE[m
[31m-JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ[m
[31m-8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm[m
[31m-fyWl8kgAwKQB2j8=[m
[31m------END CERTIFICATE-----[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW[m
[31m-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg[m
[31m-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh[m
[31m-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9[m
[31m-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi[m
[31m-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh[m
[31m-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA[m
[31m-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk[m
[31m-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf[m
[31m-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C[m
[31m-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT[m
[31m-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi[m
[31m-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM[m
[31m-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w[m
[31m-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+[m
[31m-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3[m
[31m-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B[m
[31m-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID[m
[31m-AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE[m
[31m-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j[m
[31m-ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js[m
[31m-LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM[m
[31m-BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0[m
[31m-Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy[m
[31m-dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh[m
[31m-cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh[m
[31m-YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg[m
[31m-dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp[m
[31m-bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ[m
[31m-YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT[m
[31m-TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ[m
[31m-9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8[m
[31m-jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW[m
[31m-FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz[m
[31m-ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1[m
[31m-ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L[m
[31m-EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu[m
[31m-L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq[m
[31m-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC[m
[31m-O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V[m
[31m-um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh[m
[31m-NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.crl b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.crl[m
[1mdeleted file mode 100644[m
[1mindex 098fd54..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.crl[m
[1m+++ /dev/null[m
[36m@@ -1,11 +0,0 @@[m
[31m------BEGIN X509 CRL-----[m
[31m-MIIBjzCB+QIBATANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMCVVMxEzARBgNV[m
[31m-BAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoM[m
[31m-CU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQDDAh0ZXN0LmNv[m
[31m-bTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20XDTE0MDcyMTIxNDEy[m
[31m-MloXDTE0MDgyMDIxNDEyMlowHDAaAgkApQ5tVpK3luIXDTE0MDcyMTIxNDEwMlqg[m
[31m-DzANMAsGA1UdFAQEAgIQATANBgkqhkiG9w0BAQUFAAOBgQBDZ6UY0Qg7qDoLrXXl[m
[31m-gJElFilZ7LiKPqjE3+Rfx7XkgdbPxjGCr77TfMm+smdvawk7WHv1AOvRH7kGrgGT[m
[31m-kGJZwqJ4vKa/NpEWJIMAZ1Gq9BIH/Ig6ffmPk+S9ozcVHKJDW7x4nMuotyj1hILN[m
[31m-EePv78DZCYMZgf8WwMElNgz6Hw==[m
[31m------END X509 CRL-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.crt[m
[1mdeleted file mode 100644[m
[1mindex a69a011..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.crt[m
[1m+++ /dev/null[m
[36m@@ -1,17 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIICqTCCAhICCQClDm1WkreW4jANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UECwwJT3BlblJlc3R5MREwDwYDVQQD[m
[31m-DAh0ZXN0LmNvbTEgMB4GCSqGSIb3DQEJARYRYWdlbnR6aEBnbWFpbC5jb20wIBcN[m
[31m-MTQwNzIxMDMyMzQ3WhgPMjE1MTA2MTMwMzIzNDdaMIGXMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MRIwEAYDVQQLDAlPcGVuUmVzdHkxETAPBgNVBAMMCHRl[m
[31m-c3QuY29tMSAwHgYJKoZIhvcNAQkBFhFhZ2VudHpoQGdtYWlsLmNvbTCBnzANBgkq[m
[31m-hkiG9w0BAQEFAAOBjQAwgYkCgYEA6P18zUvtmaKQK2xePy8ZbFwSyTLw+jW6t9eZ[m
[31m-aiTec8X3ibN9WemrxHzkTRikxP3cAQoITRuZiQvF4Q7DO6wMkz/b0zwfgX5uedGq[m
[31m-047AJP6n/mwlDOjGSNomBLoXQzo7tVe60ikEm3ZyDUqnJPJMt3hImO5XSop4MPMu[m
[31m-Za9WhFcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQA4OBb9bOyWB1//93nSXX1mdENZ[m
[31m-IQeyTK0Dd6My76lnZxnZ4hTWrvvd0b17KLDU6JnS2N5ee3ATVkojPidRLWLIhnh5[m
[31m-0eXrcKalbO2Ce6nShoFvQCQKXN2Txmq2vO/Mud2bHAWwJALg+qi1Iih/gVYB9sct[m
[31m-FLg8zFOzRlYiU+6Mmw==[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.key b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.key[m
[1mdeleted file mode 100644[m
[1mindex 6c13527..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXgIBAAKBgQDo/XzNS+2ZopArbF4/LxlsXBLJMvD6Nbq315lqJN5zxfeJs31Z[m
[31m-6avEfORNGKTE/dwBCghNG5mJC8XhDsM7rAyTP9vTPB+Bfm550arTjsAk/qf+bCUM[m
[31m-6MZI2iYEuhdDOju1V7rSKQSbdnINSqck8ky3eEiY7ldKingw8y5lr1aEVwIDAQAB[m
[31m-AoGBANgB66sKMga2SKN5nQdHS3LDCkevCutu1OWM5ZcbB4Kej5kC57xsf+tzPtab[m
[31m-emeIVGhCPOAALqB4YcT+QtMX967oM1MjcFbtH7si5oq6UYyp3i0G9Si6jIoVHz3+[m
[31m-8yOUaqwKbK+bRX8VS0YsHZmBsPK5ryN50iUwsU08nemoA94BAkEA9GS9Q5OPeFkM[m
[31m-tFxsIQ1f2FSsZAuN/1cpZgJqY+YaAN7MSPGTWyfd7nWG/Zgk3GO9/2ihh4gww+7B[m
[31m-To09GkmW4QJBAPQOHC2V+t2TA98+6Lj6+TYwcGEkhOENfVpH25mQ+kXgF/1Bd6rA[m
[31m-nosT1bdAY+SnmWXbSw6Kv5C20Em+bEX8WjcCQCSRRjhsRdVODbaW9Z7kb2jhEoJN[m
[31m-sEt6cTlQNzcHYPCsZYisjM3g4zYg47fiIfHQAsfKkhDDcfh/KvFj9LaQOEECQQCH[m
[31m-eBWYEDpSJ7rsfqT7mQQgWj7nDThdG/nK1TxGP71McBmg0Gg2dfkLRhVJRQqt74Is[m
[31m-kc9V4Rp4n6F6baL4Lh19AkEA6pZZer0kg3Kv9hjhaITIKUYdfIp9vYnDRWbQlBmR[m
[31m-atV8V9u9q2ETZvqfHpN+9Lu6NYR4yXIEIRf1bnIZ/mr9eQ==[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test2.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test2.crt[m
[1mdeleted file mode 100644[m
[1mindex edc3b0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test2.crt[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIChzCCAfACCQDjCkJpJUtZmjANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMC[m
[31m-VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x[m
[31m-EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZI[m
[31m-hvcNAQkBFhNvcGVucmVzdHlAZ21haWwuY29tMCAXDTE0MDkxMzAwMTgxMFoYDzIx[m
[31m-MTQwODIwMDAxODEwWjCBhjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3Ju[m
[31m-aWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCU9wZW5SZXN0eTES[m
[31m-MBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZIhvcNAQkBFhNvcGVucmVzdHlAZ21h[m
[31m-aWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDy+OVI2u5NBOeB2Cyz[m
[31m-Gnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7f[m
[31m-JrKFziJxMy4g4Kdn9G659vE7CWu/UAVjRUtc+mTBAEfjdbumizmHLG7DmnNhGl3R[m
[31m-NGiVNLsUInSMGfUlJRzZJXhI4QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAEMmRvyN[m
[31m-N7uE24Tc6TR19JadNHK8g3YGktRoXWiqd/y0HY4NRPgvnK/nX7CY/wXa1j+uDO8K[m
[31m-e6/Ldm5RZrjtvfHJmTSAu8zkqTJz8bqRDH7kzL5Ni2Ky2x8r9dtB0ImpOiSlwvZN[m
[31m-snMvbrxEdwBiqlC9prV2f9aG+ACo1KnPL0j6[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test2.key b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test2.key[m
[1mdeleted file mode 100644[m
[1mindex 82ce6ce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test2.key[m
[1m+++ /dev/null[m
[36m@@ -1,15 +0,0 @@[m
[31m------BEGIN RSA PRIVATE KEY-----[m
[31m-MIICXAIBAAKBgQDy+OVI2u5NBOeB2CyzGnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4[m
[31m-PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7fJrKFziJxMy4g4Kdn9G659vE7CWu/UAVj[m
[31m-RUtc+mTBAEfjdbumizmHLG7DmnNhGl3RNGiVNLsUInSMGfUlJRzZJXhI4QIDAQAB[m
[31m-AoGAEqBB83PVENJvbOTFiHVfUAjGtr3R/Wnwd4jOcjHHZB3fZ9sjVoxJntxfp3s1[m
[31m-dwZir2rxlqVS6i3VAFiGiVTOGo2Vvzhw2J7f58twCECmnLb2f863AkGEYe4dAndD[m
[31m-GHGD0WI0CBMD1sT18YCj561o0Wol5deWH0gM9pr2N3HkeIECQQD6hUKFlFhrpaHP[m
[31m-WNJsl6BxgE6pB5kxLcMcpIQ7P+kHUvtyvCJl5QZJqPrpPGjRsAI5Ph92rpsp/zDp[m
[31m-/IZNWGVjAkEA+Ele31Rt+XbV32MrLKZgBDBk+Pzss5LTn9fZ5v1k/7hrMk2VVWvk[m
[31m-AD6n5QiGe/g59woANpPb1T9l956SBf0d6wJABTXOS17pc9uvANP1FGMW6CVl/Wf2[m
[31m-DKrJ+weE5IKQwyE7r4gwIvRfbBrClSU3fNzvPueG2f4JphbzmnoxBNzIxwJAYivY[m
[31m-mGNwzHehXx99/byXMHDWK+EN0n8WsBgP75Z3rekEcbJdfpYXY8Via1vwmOnwOW65[m
[31m-4NqbzHix37PSNw37GwJBALxaGNpREO2Tk+oWOvsD2QyviMVae3mXAJHc6nLVdKDM[m
[31m-q0YvDT6VdeNYYFTkAuzJacsVXOpn6AnUMFj0OBedMhc=[m
[31m------END RSA PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test_ecdsa.crt b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test_ecdsa.crt[m
[1mdeleted file mode 100644[m
[1mindex b3e1e9f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test_ecdsa.crt[m
[1m+++ /dev/null[m
[36m@@ -1,12 +0,0 @@[m
[31m------BEGIN CERTIFICATE-----[m
[31m-MIIBtDCCAVoCCQD0QJnL8zpA0jAKBggqhkjOPQQDAjBhMQswCQYDVQQGEwJVUzET[m
[31m-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAG[m
[31m-A1UECgwJT3BlblJlc3R5MREwDwYDVQQDDAh0ZXN0LmNvbTAgFw0xNTA3MTcyMTUx[m
[31m-NDFaGA8yMTE1MDYyMzIxNTE0MVowYTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh[m
[31m-bGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCU9wZW5S[m
[31m-ZXN0eTERMA8GA1UEAwwIdGVzdC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC[m
[31m-AAT/OtGmlIlbtvvJ3OP0dm5lyEMCrMnpDTDjwBPnUZ2f+16LCmNsdtEJ0r0Sd4GM[m
[31m-o4Lss2JpwzPy2SLGEj3KwGKSMAoGCCqGSM49BAMCA0gAMEUCIQDbNwDkq1FiqcRD[m
[31m-XdbP1MPAc33N2IK9EDIfMgJ0nTL82wIgNZiL4xvCQe9UA0zC+JqHLnVCQHYAM9kI[m
[31m-BbvzNrt0hEM=[m
[31m------END CERTIFICATE-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test_ecdsa.key b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test_ecdsa.key[m
[1mdeleted file mode 100644[m
[1mindex 46eb72c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/cert/test_ecdsa.key[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m------BEGIN PRIVATE KEY-----[m
[31m-MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0vwBPGgv1hE6RnQo[m
[31m-3imyoceR+5dLsKegodOlBwnWtbuhRANCAAT/OtGmlIlbtvvJ3OP0dm5lyEMCrMnp[m
[31m-DTDjwBPnUZ2f+16LCmNsdtEJ0r0Sd4GMo4Lss2JpwzPy2SLGEj3KwGKS[m
[31m------END PRIVATE KEY-----[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/data/fake-module/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/data/fake-module/config[m
[1mdeleted file mode 100644[m
[1mindex 00cc8e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/data/fake-module/config[m
[1m+++ /dev/null[m
[36m@@ -1,3 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_fake_module[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_http_fake_module"[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fake_module.c"[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/data/fake-module/ngx_http_fake_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/data/fake-module/ngx_http_fake_module.c[m
[1mdeleted file mode 100644[m
[1mindex 42cde55..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/data/fake-module/ngx_http_fake_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,119 +0,0 @@[m
[31m-/* Copyright (C) ZHANG Heng (chiyouhen)[m
[31m- *[m
[31m- * This fake module was used to reproduce a bug in ngx_lua's[m
[31m- * init_worker_by_lua implementation.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t a;[m
[31m-} ngx_http_fake_srv_conf_t;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t a;[m
[31m-} ngx_http_fake_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-static void *ngx_http_fake_create_srv_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_fake_merge_srv_conf(ngx_conf_t *cf, void *prev, void *conf);[m
[31m-static void *ngx_http_fake_create_loc_conf(ngx_conf_t *cf);[m
[31m-static char *ngx_http_fake_merge_loc_conf(ngx_conf_t *cf, void *prev, void *conf);[m
[31m-[m
[31m-[m
[31m-/* flow identify module configure struct */[m
[31m-static ngx_http_module_t  ngx_http_fake_module_ctx = {[m
[31m-    NULL,                           /* preconfiguration */[m
[31m-    NULL,                           /* postconfiguration */[m
[31m-[m
[31m-    NULL,                           /* create main configuration */[m
[31m-    NULL,                           /* init main configuration */[m
[31m-[m
[31m-    ngx_http_fake_create_srv_conf,  /* create server configuration */[m
[31m-    ngx_http_fake_merge_srv_conf,   /* merge server configuration */[m
[31m-[m
[31m-    ngx_http_fake_create_loc_conf,  /* create location configuration */[m
[31m-    ngx_http_fake_merge_loc_conf    /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-/* flow identify module struct */[m
[31m-ngx_module_t  ngx_http_fake_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_fake_module_ctx,      /* module context */[m
[31m-    NULL,                           /* module directives */[m
[31m-    NGX_HTTP_MODULE,                /* module type */[m
[31m-    NULL,                           /* init master */[m
[31m-    NULL,                           /* init module */[m
[31m-    NULL,                           /* init process */[m
[31m-    NULL,                           /* init thread */[m
[31m-    NULL,                           /* exit thread */[m
[31m-    NULL,                           /* exit process */[m
[31m-    NULL,                           /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-/* create server configure */[m
[31m-static void *ngx_http_fake_create_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_fake_srv_conf_t   *fscf;[m
[31m-[m
[31m-    fscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fake_srv_conf_t));[m
[31m-    if (fscf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return fscf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* merge server configure */[m
[31m-static char *ngx_http_fake_merge_srv_conf(ngx_conf_t *cf, void *prev, void *conf)[m
[31m-{[m
[31m-    ngx_http_fake_srv_conf_t   *fscf;[m
[31m-[m
[31m-    fscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_fake_module);[m
[31m-    if (fscf == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, 0,[m
[31m-                           "get module srv conf failed in merge srv conf");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* create location configure */[m
[31m-static void *ngx_http_fake_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_fake_loc_conf_t   *flcf;[m
[31m-[m
[31m-    flcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fake_loc_conf_t));[m
[31m-    if (flcf == NULL) {[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return flcf;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-/* merge location configure */[m
[31m-static char *ngx_http_fake_merge_loc_conf(ngx_conf_t *cf, void *prev, void *conf)[m
[31m-{[m
[31m-    ngx_http_fake_loc_conf_t   *flcf;[m
[31m-[m
[31m-    flcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_fake_module);[m
[31m-    if (flcf == NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_ALERT, cf, 0,[m
[31m-                           "get module loc conf failed in merge loc conf");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/CRC32.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/CRC32.lua[m
[1mdeleted file mode 100755[m
[1mindex 70f4215..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/CRC32.lua[m
[1m+++ /dev/null[m
[36m@@ -1,173 +0,0 @@[m
[31m---Copyright (c) 2007-2008 Neil Richardson (nrich@iinet.net.au)[m
[31m---[m
[31m---Permission is hereby granted, free of charge, to any person obtaining a copy [m
[31m---of this software and associated documentation files (the "Software"), to deal[m
[31m---in the Software without restriction, including without limitation the rights [m
[31m---to use, copy, modify, merge, publish, distribute, sublicense, and/or sell [m
[31m---copies of the Software, and to permit persons to whom the Software is [m
[31m---furnished to do so, subject to the following conditions:[m
[31m---[m
[31m---The above copyright notice and this permission notice shall be included in all[m
[31m---copies or substantial portions of the Software.[m
[31m---[m
[31m---THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR [m
[31m---IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, [m
[31m---FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE [m
[31m---AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER [m
[31m---LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, [m
[31m---OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS [m
[31m---IN THE SOFTWARE.[m
[31m-[m
[31m-module('CRC32', package.seeall)[m
[31m-[m
[31m-local max = 2^32 -1[m
[31m-[m
[31m-local CRC32 = {[m
[31m-    0,79764919,159529838,222504665,319059676,[m
[31m-    398814059,445009330,507990021,638119352,[m
[31m-    583659535,797628118,726387553,890018660,[m
[31m-    835552979,1015980042,944750013,1276238704,[m
[31m-    1221641927,1167319070,1095957929,1595256236,[m
[31m-    1540665371,1452775106,1381403509,1780037320,[m
[31m-    1859660671,1671105958,1733955601,2031960084,[m
[31m-    2111593891,1889500026,1952343757,2552477408,[m
[31m-    2632100695,2443283854,2506133561,2334638140,[m
[31m-    2414271883,2191915858,2254759653,3190512472,[m
[31m-    3135915759,3081330742,3009969537,2905550212,[m
[31m-    2850959411,2762807018,2691435357,3560074640,[m
[31m-    3505614887,3719321342,3648080713,3342211916,[m
[31m-    3287746299,3467911202,3396681109,4063920168,[m
[31m-    4143685023,4223187782,4286162673,3779000052,[m
[31m-    3858754371,3904687514,3967668269,881225847,[m
[31m-    809987520,1023691545,969234094,662832811,[m
[31m-    591600412,771767749,717299826,311336399,[m
[31m-    374308984,453813921,533576470,25881363,[m
[31m-    88864420,134795389,214552010,2023205639,[m
[31m-    2086057648,1897238633,1976864222,1804852699,[m
[31m-    1867694188,1645340341,1724971778,1587496639,[m
[31m-    1516133128,1461550545,1406951526,1302016099,[m
[31m-    1230646740,1142491917,1087903418,2896545431,[m
[31m-    2825181984,2770861561,2716262478,3215044683,[m
[31m-    3143675388,3055782693,3001194130,2326604591,[m
[31m-    2389456536,2200899649,2280525302,2578013683,[m
[31m-    2640855108,2418763421,2498394922,3769900519,[m
[31m-    3832873040,3912640137,3992402750,4088425275,[m
[31m-    4151408268,4197601365,4277358050,3334271071,[m
[31m-    3263032808,3476998961,3422541446,3585640067,[m
[31m-    3514407732,3694837229,3640369242,1762451694,[m
[31m-    1842216281,1619975040,1682949687,2047383090,[m
[31m-    2127137669,1938468188,2001449195,1325665622,[m
[31m-    1271206113,1183200824,1111960463,1543535498,[m
[31m-    1489069629,1434599652,1363369299,622672798,[m
[31m-    568075817,748617968,677256519,907627842,[m
[31m-    853037301,1067152940,995781531,51762726,[m
[31m-    131386257,177728840,240578815,269590778,[m
[31m-    349224269,429104020,491947555,4046411278,[m
[31m-    4126034873,4172115296,4234965207,3794477266,[m
[31m-    3874110821,3953728444,4016571915,3609705398,[m
[31m-    3555108353,3735388376,3664026991,3290680682,[m
[31m-    3236090077,3449943556,3378572211,3174993278,[m
[31m-    3120533705,3032266256,2961025959,2923101090,[m
[31m-    2868635157,2813903052,2742672763,2604032198,[m
[31m-    2683796849,2461293480,2524268063,2284983834,[m
[31m-    2364738477,2175806836,2238787779,1569362073,[m
[31m-    1498123566,1409854455,1355396672,1317987909,[m
[31m-    1246755826,1192025387,1137557660,2072149281,[m
[31m-    2135122070,1912620623,1992383480,1753615357,[m
[31m-    1816598090,1627664531,1707420964,295390185,[m
[31m-    358241886,404320391,483945776,43990325,[m
[31m-    106832002,186451547,266083308,932423249,[m
[31m-    861060070,1041341759,986742920,613929101,[m
[31m-    542559546,756411363,701822548,3316196985,[m
[31m-    3244833742,3425377559,3370778784,3601682597,[m
[31m-    3530312978,3744426955,3689838204,3819031489,[m
[31m-    3881883254,3928223919,4007849240,4037393693,[m
[31m-    4100235434,4180117107,4259748804,2310601993,[m
[31m-    2373574846,2151335527,2231098320,2596047829,[m
[31m-    2659030626,2470359227,2550115596,2947551409,[m
[31m-    2876312838,2788305887,2733848168,3165939309,[m
[31m-    3094707162,3040238851,2985771188,[m
[31m-}[m
[31m-[m
[31m-local function xor(a, b)[m
[31m-    local calc = 0    [m
[31m-[m
[31m-    for i = 32, 0, -1 do[m
[31m-	local val = 2 ^ i[m
[31m-	local aa = false[m
[31m-	local bb = false[m
[31m-[m
[31m-	if a == 0 then[m
[31m-	    calc = calc + b[m
[31m-	    break[m
[31m-	end[m
[31m-[m
[31m-	if b == 0 then[m
[31m-	    calc = calc + a[m
[31m-	    break[m
[31m-	end[m
[31m-[m
[31m-	if a >= val then[m
[31m-	    aa = true[m
[31m-	    a = a - val[m
[31m-	end[m
[31m-[m
[31m-	if b >= val then[m
[31m-	    bb = true[m
[31m-	    b = b - val[m
[31m-	end[m
[31m-[m
[31m-	if not (aa and bb) and (aa or bb) then[m
[31m-	    calc = calc + val[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    return calc[m
[31m-end[m
[31m-[m
[31m-local function lshift(num, left)[m
[31m-    local res = num * (2 ^ left)[m
[31m-    return res % (2 ^ 32)[m
[31m-end[m
[31m-[m
[31m-local function rshift(num, right)[m
[31m-    local res = num / (2 ^ right)[m
[31m-    return math.floor(res)[m
[31m-end[m
[31m-[m
[31m-function Hash(str)[m
[31m-    local count = string.len(tostring(str))[m
[31m-    local crc = max[m
[31m-    [m
[31m-    local i = 1[m
[31m-    while count > 0 do[m
[31m-	local byte = string.byte(str, i)[m
[31m-[m
[31m-	crc = xor(lshift(crc, 8), CRC32[xor(rshift(crc, 24), byte) + 1])[m
[31m-[m
[31m-	i = i + 1[m
[31m-	count = count - 1[m
[31m-    end[m
[31m-[m
[31m-    return crc[m
[31m-end[m
[31m-[m
[31m-[m
[31m---[m
[31m--- CRC32.lua[m
[31m---[m
[31m--- A pure Lua implementation of a CRC32 hashing algorithm. Slower than using a C implemtation,[m
[31m--- but useful having no other dependancies.[m
[31m---[m
[31m---[m
[31m--- Synopsis[m
[31m---[m
[31m--- require('CRC32')[m
[31m---[m
[31m--- crchash = CRC32.Hash('a string')[m
[31m---[m
[31m--- Methods:[m
[31m---[m
[31m--- hashval = CRC32.Hash(val)[m
[31m---    Calculates and returns (as an integer) the CRC32 hash of the parameter 'val'. [m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/Memcached.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/Memcached.lua[m
[1mdeleted file mode 100755[m
[1mindex e3288ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/Memcached.lua[m
[1m+++ /dev/null[m
[36m@@ -1,567 +0,0 @@[m
[31m---Copyright (c) 2006-2008 Neil Richardson (nrich@iinet.net.au)[m
[31m---[m
[31m---Permission is hereby granted, free of charge, to any person obtaining a copy [m
[31m---of this software and associated documentation files (the "Software"), to deal[m
[31m---in the Software without restriction, including without limitation the rights [m
[31m---to use, copy, modify, merge, publish, distribute, sublicense, and/or sell [m
[31m---copies of the Software, and to permit persons to whom the Software is [m
[31m---furnished to do so, subject to the following conditions:[m
[31m---[m
[31m---The above copyright notice and this permission notice shall be included in all[m
[31m---copies or substantial portions of the Software.[m
[31m---[m
[31m---THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR [m
[31m---IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, [m
[31m---FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE [m
[31m---AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER [m
[31m---LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, [m
[31m---OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS [m
[31m---IN THE SOFTWARE.[m
[31m-[m
[31m-module('Memcached', package.seeall)[m
[31m-[m
[31m-require('socket')[m
[31m-require('CRC32')[m
[31m-[m
[31m-local SERVER_RETRIES = 10[m
[31m-[m
[31m-local STATS_KEYS = {[m
[31m-    malloc = true,[m
[31m-    sizes = true,[m
[31m-    slabs = true,[m
[31m-    items = true,[m
[31m-}[m
[31m-[m
[31m-local FLAGS = {[m
[31m-    'STORABLE',[m
[31m-    'COMPRESSED',[m
[31m-    'SERIALISED',[m
[31m-}[m
[31m-[m
[31m-local function warn(str)[m
[31m-    io.stderr:write(string.format('Warning: %s\n', tostring(str)))[m
[31m-end[m
[31m-[m
[31m-local function _select_server(cache, key)[m
[31m-    local server_count = #cache.servers[m
[31m-[m
[31m-    local hashfunc = cache.hash or CRC32.Hash[m
[31m-[m
[31m-    if server_count == 1 then[m
[31m-	return cache.servers[1].socket[m
[31m-    else[m
[31m-	local serverhash = hashfunc(key)[m
[31m-[m
[31m-	for i = 0, SERVER_RETRIES do[m
[31m-	    local index = (serverhash % server_count) + 1[m
[31m-	    local server = cache.servers[index].socket[m
[31m-[m
[31m-	    if not server then[m
[31m-		serverhash = hashfunc(serverhash .. i)[m
[31m-	    else[m
[31m-		return server[m
[31m-	    end[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    error('No servers found')[m
[31m-    return nil[m
[31m-end[m
[31m-[m
[31m-local function _retrieve(cache, key, str)[m
[31m-    local server = _select_server(cache, key)[m
[31m-[m
[31m-    server:send(str .. '\r\n')[m
[31m-[m
[31m-    local function toboolean(value)[m
[31m-	if type(value) == 'string' then[m
[31m-	    if value == 'true' then[m
[31m-		return true[m
[31m-	    elseif value == 'false' then[m
[31m-		return false [m
[31m-	    end[m
[31m-	end[m
[31m-[m
[31m-	return nil[m
[31m-    end[m
[31m-[m
[31m-    local function extract_flags(str)[m
[31m-	local num = tonumber(str)[m
[31m-	local flags = {}[m
[31m-[m
[31m-	for i = table.maxn(FLAGS), 1, -1 do[m
[31m-	    local bf = 2 ^ (i - 1)[m
[31m-[m
[31m-	    if num >= bf then[m
[31m-		flags[FLAGS[i]] = true[m
[31m-		num = num - bf[m
[31m-	    end[m
[31m-	end[m
[31m-[m
[31m-	return flags[m
[31m-    end[m
[31m-[m
[31m-    local returndata = {}[m
[31m-    while true do[m
[31m-	local line, err = server:receive()[m
[31m-[m
[31m-	if line == 'END' then[m
[31m-	    break[m
[31m-	elseif string.sub(line, 1, 5) == 'VALUE' then[m
[31m-	    local key,flagstr,size,cas = string.match(line, 'VALUE (%S+) (%d+) (%d+)')[m
[31m-	    flags = extract_flags(flagstr)[m
[31m-[m
[31m-	    local data = server:receive(size)[m
[31m-[m
[31m-	    if flags.COMPRESSED and cache.compress_enabled then[m
[31m-		data = cache.decompress(data)[m
[31m-	    end[m
[31m-[m
[31m-            if flags.SERIALISED then[m
[31m-                returndata[key] = cache.decode(data)[m
[31m-            else[m
[31m-                local ldata = tonumber(data) or toboolean(data) [m
[31m-[m
[31m-                if ldata == nil then[m
[31m-                    if data == 'nil' then[m
[31m-                        returndata[key] = nil[m
[31m-                    else[m
[31m-                        returndata[key] = data[m
[31m-                    end[m
[31m-                else[m
[31m-                    returndata[key] = ldata[m
[31m-                end[m
[31m-            end[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    return returndata[m
[31m-end[m
[31m-[m
[31m-local function _send(cache, key, str)[m
[31m-    local server = _select_server(cache, key)[m
[31m-[m
[31m-    server:send(str .. "\r\n")[m
[31m-    local line, err = server:receive()[m
[31m-    [m
[31m-    if not err then return line end[m
[31m-end[m
[31m-[m
[31m-local function _store(cache, op, key, value, expiry)[m
[31m-    local str[m
[31m-    local flags = 0[m
[31m-[m
[31m-    if type(value) == 'table' then[m
[31m-	str = cache.encode(value)    [m
[31m-	-- TODO lookup rather than hard code [m
[31m-        flags = flags + 4[m
[31m-    else[m
[31m-	str = tostring(value)[m
[31m-    end[m
[31m-[m
[31m-    if cache.compress_enabled and string.len(str) > cache.compress_threshold then[m
[31m-	local cstr = cache.compress(str)[m
[31m-[m
[31m-	if string.len(cstr) < (string.len(str) * 0.8) then[m
[31m-	    str = cstr[m
[31m-[m
[31m-	    -- TODO lookup rather than hard code [m
[31m-	    flags = flags + 2[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    local len = string.len(str)[m
[31m-[m
[31m-    expiry = expiry or 0[m
[31m-[m
[31m-    local cmd = op .. ' ' .. key .. ' ' .. flags .. ' ' .. expiry .. ' ' .. len .. '\r\n' .. str[m
[31m-[m
[31m-    local res = _send(cache, key, cmd)[m
[31m-[m
[31m-    if res ~= 'STORED' then[m
[31m-	return false, res[m
[31m-    end[m
[31m-[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local function set(cache, key, value, expiry)[m
[31m-    return _store(cache, 'set', key, value, expiry)[m
[31m-end[m
[31m-[m
[31m-local function add(cache, key, value, expiry)[m
[31m-    return _store(cache, 'add', key, value, expiry)[m
[31m-end[m
[31m-[m
[31m-local function replace(cache, key, value, expiry)[m
[31m-    return _store(cache, 'replace', key, value, expiry)[m
[31m-end[m
[31m-[m
[31m-local function get(cache, key)[m
[31m-    local dataset = _retrieve(cache, key, 'get ' .. key)[m
[31m-    return dataset[key][m
[31m-end[m
[31m-[m
[31m-local function delete(cache, key)[m
[31m-    local res = _send(cache, key, 'delete ' .. key)[m
[31m-[m
[31m-    if res == 'NOT_FOUND' then[m
[31m-	return false[m
[31m-    end[m
[31m-[m
[31m-    if res ~= 'DELETED' then[m
[31m-	return false, res[m
[31m-    end[m
[31m-[m
[31m-    return true[m
[31m-end[m
[31m-[m
[31m-local function incr(cache, key, val)[m
[31m-    val = val or 1[m
[31m-	[m
[31m-    local res = _send(cache, key, 'incr ' .. key .. ' ' .. val)[m
[31m-[m
[31m-    if res == 'ERROR' or res == 'CLIENT_ERROR' then[m
[31m-        return false, res[m
[31m-    end[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-local function decr(cache, key, val)[m
[31m-    val = val or 1[m
[31m-[m
[31m-    local res = _send(cache, key, 'decr ' .. key .. ' ' .. val)[m
[31m-[m
[31m-    if res == 'ERROR' or res == 'CLIENT_ERROR' then[m
[31m-        return false, res[m
[31m-    end[m
[31m-[m
[31m-    return res[m
[31m-end[m
[31m-[m
[31m-local function stats(cache, key)[m
[31m-    local servers = {}[m
[31m-[m
[31m-    key = key or ''[m
[31m-[m
[31m-    if string.len(key) > 0 and not STATS_KEYS[key] then[m
[31m-	error(string.format("Unknown stats key '%s'", key))[m
[31m-    end[m
[31m-[m
[31m-    for i,server in pairs(cache.servers) do[m
[31m-	server.socket:send('stats ' .. key .. '\r\n')[m
[31m-[m
[31m-	local stats = {}[m
[31m-[m
[31m-	while true do[m
[31m-	    local line, err = server.socket:receive()[m
[31m-[m
[31m-	    if line == 'END' or line == 'ERROR' then[m
[31m-		break[m
[31m-	    end[m
[31m-[m
[31m-	    local k,v = string.match(line, 'STAT (%S+) (%S+)')[m
[31m-[m
[31m-	    if k then[m
[31m-		stats[k] = v[m
[31m-	    end[m
[31m-	end[m
[31m-[m
[31m-	servers[server.name] = stats[m
[31m-    end[m
[31m-[m
[31m-    return servers[m
[31m-end [m
[31m-[m
[31m-local function get_multi(cache, ...)[m
[31m-    local dataset = nil[m
[31m-[m
[31m-    if table.maxn(cache.servers) > 1 then[m
[31m-	dataset = {}[m
[31m-[m
[31m-	for i,k in ipairs(arg) do[m
[31m-	    local data = _retrieve(cache, k, 'get ' .. k)[m
[31m-	    dataset[k] = data[k][m
[31m-	end[m
[31m-    else[m
[31m-	local keys = table.concat(arg, ' ')[m
[31m-	dataset = _retrieve(cache, keys, 'get ' .. keys)[m
[31m-    end[m
[31m-[m
[31m-    return dataset[m
[31m-end[m
[31m-[m
[31m-local function flush_all(cache)[m
[31m-    local success = true[m
[31m-[m
[31m-    for i,server in ipairs(cache.servers) do[m
[31m-	server.socket:send('flush_all\r\n')[m
[31m-	local res = assert(server.socket:receive())[m
[31m-[m
[31m-	if res ~= 'OK' then[m
[31m-	    success = false[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    return success[m
[31m-end[m
[31m-[m
[31m-local function disconnect_all(cache)[m
[31m-    while true do[m
[31m-	local server = table.remove(cache.servers)[m
[31m-[m
[31m-	if not server then[m
[31m-	    break[m
[31m-	end[m
[31m-[m
[31m-	server.socket:close()[m
[31m-    end    [m
[31m-end[m
[31m-[m
[31m-local function set_hash(cache, hashfunc)[m
[31m-    cache.hash = hashfunc[m
[31m-end[m
[31m-[m
[31m-local function set_encode(cache, func)[m
[31m-    cache.encode = func[m
[31m-end[m
[31m-[m
[31m-local function set_decode(cache, func)[m
[31m-    cache.decode = func[m
[31m-end[m
[31m-[m
[31m-local function set_compress(cache, func)[m
[31m-    cache.compress = func[m
[31m-end[m
[31m-[m
[31m-local function set_decompress(cache, func)[m
[31m-    cache.decompress = func[m
[31m-end[m
[31m-[m
[31m-function Connect(hostlist, port)[m
[31m-    local servers = {}[m
[31m-[m
[31m-    if type(hostlist) == 'table' then[m
[31m-	for i,host in pairs(hostlist) do[m
[31m-	    local h, p[m
[31m-[m
[31m-	    if type(host) == 'table' then[m
[31m-		h = host[1][m
[31m-		p = host[2][m
[31m-	    elseif type(host) == 'string' then[m
[31m-		h = host[m
[31m-	    elseif type(host) == 'number' then[m
[31m-		p = host[m
[31m-		h = nil[m
[31m-	    end[m
[31m-[m
[31m-	    if not h then[m
[31m-		h = '127.0.0.1'[m
[31m-	    end[m
[31m-[m
[31m-	    if not p then [m
[31m-		p = 11211[m
[31m-	    end[m
[31m-[m
[31m-	    local server = socket.connect(h, p)[m
[31m-[m
[31m-	    if not server then[m
[31m-		warn('Could not connect to ' .. h .. ':' .. p)[m
[31m-	    else[m
[31m-		table.insert(servers, {socket = server, name = string.format('%s:%d', h, p)})[m
[31m-	    end[m
[31m-	end[m
[31m-    else[m
[31m-	local address = hostlist[m
[31m-[m
[31m-	if type(address) == 'number' then[m
[31m-	    port = address[m
[31m-	    address = nil[m
[31m-	end[m
[31m-[m
[31m-	if address == nil then[m
[31m-	    address = '127.0.0.1'[m
[31m-	end[m
[31m-[m
[31m-	if port == nil then[m
[31m-	    port = 11211[m
[31m-	end[m
[31m-[m
[31m-	local server = socket.connect(address, port)[m
[31m-[m
[31m-	if not server then[m
[31m-	    warn('Could not connect to ' .. address .. ':' .. port)[m
[31m-	else[m
[31m-	    servers = {{socket = server, name = string.format('%s:%d', address, port)}}[m
[31m-	end[m
[31m-    end[m
[31m-[m
[31m-    if table.maxn(servers) < 1 then[m
[31m-	error('No servers available')[m
[31m-    end[m
[31m-[m
[31m-    local cache = {[m
[31m-	servers = servers,[m
[31m-[m
[31m-	set_hash = set_hash,[m
[31m-	set_encode = set_encode,[m
[31m-	set_decode = set_decode,[m
[31m-	set_decompress = set_decompress,[m
[31m-	set_compress = set_compress,[m
[31m-[m
[31m-	compress_enabled = false,[m
[31m-	enable_compression = function(self, on)[m
[31m-	    self.compress_enabled = on[m
[31m-	end,[m
[31m-[m
[31m-	hash = nil,[m
[31m-	encode = function()[m
[31m-	    error('No encode function set')[m
[31m-	end,[m
[31m-[m
[31m-	decode = function()[m
[31m-	    error('No decode function set')[m
[31m-	end,[m
[31m-[m
[31m-	compress = function()[m
[31m-	    error('No compress function set')[m
[31m-	end,[m
[31m-[m
[31m-	decompress = function()[m
[31m-	    error('No decompress function set')[m
[31m-	end,[m
[31m-[m
[31m-	-- 10K default[m
[31m-	compress_threshold = 10240,[m
[31m-	set_compress_threshold = function(self, threshold)[m
[31m-	    if threshold == nil then[m
[31m-		self:enable_compression(false)[m
[31m-	    else[m
[31m-		self.compress_threshold = threshold[m
[31m-	    end[m
[31m-	end,[m
[31m-[m
[31m-	set = set,[m
[31m-	add = add,[m
[31m-	replace = replace,[m
[31m-	get = get,[m
[31m-	delete = delete,[m
[31m-	incr = incr,[m
[31m-	decr = decr,[m
[31m-[m
[31m-	get_multi = get_multi,[m
[31m-	stats = stats,[m
[31m-	flush_all = flush_all,[m
[31m-	disconnect_all = disconnect_all,[m
[31m-    }[m
[31m-[m
[31m-    return cache[m
[31m-end[m
[31m-[m
[31m-function New(hostlist, port)[m
[31m-    return Connect(hostlist, port)[m
[31m-end[m
[31m-[m
[31m--- [m
[31m--- Memcached.lua[m
[31m--- [m
[31m--- A pure Lua implementation of a simple memcached client. 1 or more memcached server(s) are currently supported. Requires the luasocket library.[m
[31m--- See http://www.danga.com/memcached/ for more information about memcached.[m
[31m---[m
[31m---[m
[31m---[m
[31m--- Synopsis[m
[31m---[m
[31m--- require('Memcached')[m
[31m---[m
[31m--- memcache = Memcached.Connect('some.host.com', 11000)[m
[31m---    OR[m
[31m--- memcache = Memcached.New('some.host.com', 11000)[m
[31m---[m
[31m--- memcache:set('some_key', 1234)[m
[31m--- memcache:add('new_key', 'add new value')[m
[31m--- memcache:replace('existing_key', 'replace old value')[m
[31m---[m
[31m--- cached_data = memcache:get('some_key')[m
[31m---[m
[31m--- memcache:delete('old_key')[m
[31m---[m
[31m---[m
[31m---[m
[31m--- Methods:[m
[31m---[m
[31m--- memcache = Memcached.Connect()[m
[31m---    Connect to memcached server at localhost on port number 11211. [m
[31m---[m
[31m--- memcache = Memcached.Connect(host[, port])[m
[31m---    Connect to memcached server at 'host' on port number 'port'. If port is not provided, port 11211 is used.  [m
[31m---[m
[31m----memcache = Memcached.Connect(port)[m
[31m---    Connect to memcached server at localhost on port number 'port'.[m
[31m---[m
[31m--- memcache = Memcached.Connect({{'host', port}, 'host', port})  [m
[31m---    Connect to multiple memcached servers.[m
[31m---[m
[31m--- memcache:set(key, value[, expiry])[m
[31m---    Unconditionally sets a key to a given value in the memcache. The value for 'expiry' is the expiration[m
[31m---    time (default is 0, never expire).[m
[31m---     [m
[31m--- memcache:add(key, value[, expiry])[m
[31m---    Like set, but only stores in memcache if the key doesn't already exist.[m
[31m---    [m
[31m--- memcache:replace(key, value[, expiry])[m
[31m---    Like set, but only stores in memcache if the key already exists. The opposite of add.[m
[31m---    [m
[31m--- value = memcache:get(key)[m
[31m---    Retrieves a key from the memcache. Returns the value or nil[m
[31m---    [m
[31m--- values = memcache:get_multi(...)[m
[31m---    Retrieves multiple keys from the memcache doing just one query.  Returns a table of key/value pairs that were available.[m
[31m---    [m
[31m--- memcache:delete(key)[m
[31m---    Deletes a key. Returns true on deletion, false if the key was not found.[m
[31m---    [m
[31m--- value = memcache:incr(key[, value])[m
[31m---    Sends a command to the server to atomically increment the value for key by value, or by 1 if value is nil. [m
[31m---    Returns nil if key doesn't exist on server, otherwise it returns the new value after incrementing. Value should be zero or greater.[m
[31m---    [m
[31m--- value = memcache:decr(key[, value])[m
[31m---    Like incr, but decrements. Unlike incr, underflow is checked and new values are capped at 0. If server value is 1, a decrement of 2 returns 0, not -1.[m
[31m---[m
[31m--- servers = memcache:stats([key])[m
[31m---    Returns a table of statistical data regarding the memcache server(s). Allowed keys are:[m
[31m---	'', 'malloc', 'sizes', 'slabs', 'items'[m
[31m---[m
[31m---  success = memcache:flush_all()[m
[31m---     Runs the memcached "flush_all" command on all configured hosts, emptying all their caches. [m
[31m---[m
[31m---  memcache:disconnect_all()[m
[31m---     Closes all cached sockets to all memcached servers.[m
[31m---[m
[31m---  memcache:set_hash(hashfunc)[m
[31m---     Sets a custom hash function for key values. The default is a CRC32 hashing function.[m
[31m---     'hashfunc' should be defined receiving a single string parameter and returing a single integer value.[m
[31m---[m
[31m---  memcache:set_encode(func)[m
[31m---     Sets a custom encode function for serialising table values. 'func' should be defined receiving a single[m
[31m---     table value and returning a single string value.[m
[31m---[m
[31m---  memcache:set_decode(func)[m
[31m---     Sets a custom decode function for deserialising table values. 'func' should be defined receiving a [m
[31m---     single single and returning a single table value[m
[31m---[m
[31m---  memcache:enable_compression(onflag)[m
[31m---     Turns data compression support on or off.[m
[31m---[m
[31m---  memcache:set_compress_threshold(size)[m
[31m---     Set the compression threshold. If the value to be stored is larger than `size' bytes (and compression [m
[31m---     is enabled), compress before storing.[m
[31m---[m
[31m---  memcache:set_compress(func)[m
[31m---     Sets a custom data compression function. 'func' should be defined receiving a single string value and[m
[31m---     returning a single string value.[m
[31m---[m
[31m---  memcache:set_decompress(func)[m
[31m---     Sets a custom data decompression function. 'func' should be defined receiving a single string value and[m
[31m---     returning a single string value.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/Redis.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/Redis.lua[m
[1mdeleted file mode 100644[m
[1mindex 8bc2804..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/Redis.lua[m
[1m+++ /dev/null[m
[36m@@ -1,1120 +0,0 @@[m
[31m---[[[m
[31m-Copyright (c) 2009-2011 Daniele Alessandri[m
[31m- [m
[31m-Permission is hereby granted, free of charge, to any person obtaining[m
[31m-a copy of this software and associated documentation files (the[m
[31m-"Software"), to deal in the Software without restriction, including[m
[31m-without limitation the rights to use, copy, modify, merge, publish,[m
[31m-distribute, sublicense, and/or sell copies of the Software, and to[m
[31m-permit persons to whom the Software is furnished to do so, subject to[m
[31m-the following conditions:[m
[31m- [m
[31m-The above copyright notice and this permission notice shall be[m
[31m-included in all copies or substantial portions of the Software.[m
[31m- [m
[31m-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,[m
[31m-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF[m
[31m-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND[m
[31m-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE[m
[31m-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION[m
[31m-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION[m
[31m-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.[m
[31m-]][m
[31m-[m
[31m-module('Redis', package.seeall)[m
[31m-[m
[31m-local commands, network, request, response = {}, {}, {}, {}[m
[31m-[m
[31m-local defaults = {[m
[31m-    host        = '127.0.0.1',[m
[31m-    port        = 6379,[m
[31m-    tcp_nodelay = true,[m
[31m-    path        = nil[m
[31m-}[m
[31m-[m
[31m-local protocol = {[m
[31m-    newline = '\r\n',[m
[31m-    ok      = 'OK',[m
[31m-    err     = 'ERR',[m
[31m-    queued  = 'QUEUED',[m
[31m-    null    = 'nil'[m
[31m-}[m
[31m-[m
[31m-local lua_error = error[m
[31m-local function default_error_fn(message, level)[m
[31m-    lua_error(message, (level or 1) + 1)[m
[31m-end[m
[31m-[m
[31m-local function merge_defaults(parameters)[m
[31m-    if parameters == nil then[m
[31m-        parameters = {}[m
[31m-    end[m
[31m-    for k, v in pairs(defaults) do[m
[31m-        if parameters[k] == nil then[m
[31m-            parameters[k] = defaults[k][m
[31m-        end[m
[31m-    end[m
[31m-    return parameters[m
[31m-end[m
[31m-[m
[31m-local function parse_boolean(v)[m
[31m-    if v == '1' or v == 'true' or v == 'TRUE' then[m
[31m-        return true[m
[31m-    elseif v == '0' or v == 'false' or v == 'FALSE' then[m
[31m-        return false[m
[31m-    else[m
[31m-        return nil[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function toboolean(value) return value == 1 end[m
[31m-[m
[31m-local function fire_and_forget(client, command)[m
[31m-    -- let's fire and forget! the connection is closed as soon[m
[31m-    -- as the SHUTDOWN command is received by the server.[m
[31m-    client.network.write(client, command .. protocol.newline)[m
[31m-    return false[m
[31m-end[m
[31m-[m
[31m-local function zset_range_request(client, command, ...)[m
[31m-    local args, opts = {...}, { }[m
[31m-[m
[31m-    if #args >= 1 and type(args[#args]) == 'table' then[m
[31m-        local options = table.remove(args, #args)[m
[31m-        if options.withscores then[m
[31m-            table.insert(opts, 'WITHSCORES')[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    for _, v in pairs(opts) do table.insert(args, v) end[m
[31m-    request.multibulk(client, command, args)[m
[31m-end[m
[31m-[m
[31m-local function zset_range_byscore_request(client, command, ...)[m
[31m-    local args, opts = {...}, { }[m
[31m-[m
[31m-    if #args >= 1 and type(args[#args]) == 'table' then[m
[31m-        local options = table.remove(args, #args)[m
[31m-        if options.limit then[m
[31m-            table.insert(opts, 'LIMIT')[m
[31m-            table.insert(opts, options.limit.offset or options.limit[1])[m
[31m-            table.insert(opts, options.limit.count or options.limit[2])[m
[31m-        end[m
[31m-        if options.withscores then[m
[31m-            table.insert(opts, 'WITHSCORES')[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    for _, v in pairs(opts) do table.insert(args, v) end[m
[31m-    request.multibulk(client, command, args)[m
[31m-end[m
[31m-[m
[31m-local function zset_range_reply(reply, command, ...)[m
[31m-    local args = {...}[m
[31m-    local opts = args[4][m
[31m-    if opts and (opts.withscores or string.lower(tostring(opts)) == 'withscores') then[m
[31m-        local new_reply = { }[m
[31m-        for i = 1, #reply, 2 do[m
[31m-            table.insert(new_reply, { reply[i], reply[i + 1] })[m
[31m-        end[m
[31m-        return new_reply[m
[31m-    else[m
[31m-        return reply[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function zset_store_request(client, command, ...)[m
[31m-    local args, opts = {...}, { }[m
[31m-[m
[31m-    if #args >= 1 and type(args[#args]) == 'table' then[m
[31m-        local options = table.remove(args, #args)[m
[31m-        if options.weights and type(options.weights) == 'table' then[m
[31m-            table.insert(opts, 'WEIGHTS')[m
[31m-            for _, weight in ipairs(options.weights) do[m
[31m-                table.insert(opts, weight)[m
[31m-            end[m
[31m-        end[m
[31m-        if options.aggregate then[m
[31m-            table.insert(opts, 'AGGREGATE')[m
[31m-            table.insert(opts, options.aggregate)[m
[31m-        end[m
[31m-    end[m
[31m-[m
[31m-    for _, v in pairs(opts) do table.insert(args, v) end[m
[31m-    request.multibulk(client, command, args)[m
[31m-end[m
[31m-[m
[31m-local function mset_filter_args(client, command, ...)[m
[31m-    local args, arguments = {...}, {}[m
[31m-    if (#args == 1 and type(args[1]) == 'table') then[m
[31m-        for k,v in pairs(args[1]) do[m
[31m-            table.insert(arguments, k)[m
[31m-            table.insert(arguments, v)[m
[31m-        end[m
[31m-    else[m
[31m-        arguments = args[m
[31m-    end[m
[31m-    request.multibulk(client, command, arguments)[m
[31m-end[m
[31m-[m
[31m-local function hash_multi_request_builder(builder_callback)[m
[31m-    return function(client, command, ...)[m
[31m-        local args, arguments = {...}, { }[m
[31m-        if #args == 2 then[m
[31m-            table.insert(arguments, args[1])[m
[31m-            for k, v in pairs(args[2]) do[m
[31m-                builder_callback(arguments, k, v)[m
[31m-            end[m
[31m-        else[m
[31m-            arguments = args[m
[31m-        end[m
[31m-        request.multibulk(client, command, arguments)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local function parse_info(response)[m
[31m-    local info = {}[m
[31m-    response:gsub('([^\r\n]*)\r\n', function(kv)[m
[31m-        local k,v = kv:match(('([^:]*):([^:]*)'):rep(1))[m
[31m-        if (k:match('db%d+')) then[m
[31m-            info[k] = {}[m
[31m-            v:gsub(',', function(dbkv)[m
[31m-                local dbk,dbv = kv:match('([^:]*)=([^:]*)')[m
[31m-                info[k][dbk] = dbv[m
[31m-            end)[m
[31m-        else[m
[31m-            info[k] = v[m
[31m-        end[m
[31m-    end)[m
[31m-    return info[m
[31m-end[m
[31m-[m
[31m-local function parse_info_new(response)[m
[31m-    local info, current = {}, nil[m
[31m-    response:gsub('([^\r\n]*)\r\n', function(kv)[m
[31m-        if kv == '' then return end[m
[31m-[m
[31m-        local section = kv:match(('^# (%w+)'):rep(1))[m
[31m-        if section then[m
[31m-            current = section:lower()[m
[31m-            info[current] = {}[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-        local k,v = kv:match(('([^:]*):([^:]*)'):rep(1))[m
[31m-        if (k:match('db%d+')) then[m
[31m-            info[current][k] = {}[m
[31m-            v:gsub(',', function(dbkv)[m
[31m-                local dbk,dbv = kv:match('([^:]*)=([^:]*)')[m
[31m-                info[current][dbk] = dbv[m
[31m-            end)[m
[31m-        else[m
[31m-            info[current][k] = v[m
[31m-        end[m
[31m-    end)[m
[31m-    return info[m
[31m-end[m
[31m-[m
[31m-local function load_methods(proto, methods)[m
[31m-    local redis = setmetatable ({}, getmetatable(proto))[m
[31m-    for i, v in pairs(proto) do redis[i] = v end[m
[31m-    for i, v in pairs(methods) do redis[i] = v end[m
[31m-    return redis[m
[31m-end[m
[31m-[m
[31m-local function create_client(proto, client_socket, methods)[m
[31m-    local redis = load_methods(proto, methods)[m
[31m-    redis.network = {[m
[31m-        socket = client_socket,[m
[31m-        read   = network.read,[m
[31m-        write  = network.write,[m
[31m-    }[m
[31m-    redis.requests = {[m
[31m-        multibulk = request.multibulk,[m
[31m-    }[m
[31m-    return redis[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-function network.write(client, buffer)[m
[31m-    local _, err = client.network.socket:send(buffer)[m
[31m-    if err then client.error(err) end[m
[31m-end[m
[31m-[m
[31m-function network.read(client, len)[m
[31m-    if len == nil then len = '*l' end[m
[31m-    local line, err = client.network.socket:receive(len)[m
[31m-    if not err then return line else client.error('connection error: ' .. err) end[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-function response.read(client)[m
[31m-    local res = client.network.read(client)[m
[31m-    local prefix  = res:sub(1, -#res)[m
[31m-    local handler = protocol.prefixes[prefix][m
[31m-    if not handler then[m
[31m-        client.error('unknown response prefix: '..prefix)[m
[31m-    end[m
[31m-    return handler(client, res)[m
[31m-end[m
[31m-[m
[31m-function response.status(client, data)[m
[31m-    local sub = data:sub(2)[m
[31m-[m
[31m-    if sub == protocol.ok then[m
[31m-        return true[m
[31m-    elseif sub == protocol.queued then[m
[31m-        return { queued = true }[m
[31m-    else[m
[31m-        return sub[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function response.error(client, data)[m
[31m-    local err_line = data:sub(2)[m
[31m-[m
[31m-    if err_line:sub(1, 3) == protocol.err then[m
[31m-        client.error('redis error: ' .. err_line:sub(5))[m
[31m-    else[m
[31m-        client.error('redis error: ' .. err_line)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function response.bulk(client, data)[m
[31m-    local str = data:sub(2)[m
[31m-    local len = tonumber(str)[m
[31m-    if not len then[m
[31m-        client.error('cannot parse ' .. str .. ' as data length')[m
[31m-    end[m
[31m-[m
[31m-    if len == -1 then return nil end[m
[31m-    local next_chunk = client.network.read(client, len + 2)[m
[31m-    return next_chunk:sub(1, -3);[m
[31m-end[m
[31m-[m
[31m-function response.multibulk(client, data)[m
[31m-    local str = data:sub(2)[m
[31m-    local list_count = tonumber(str)[m
[31m-[m
[31m-    if list_count == -1 then[m
[31m-        return nil[m
[31m-    else[m
[31m-        local list = {}[m
[31m-        if list_count > 0 then[m
[31m-            for i = 1, list_count do[m
[31m-                table.insert(list, i, response.read(client))[m
[31m-            end[m
[31m-        end[m
[31m-        return list[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function response.integer(client, data)[m
[31m-    local res = data:sub(2)[m
[31m-    local number = tonumber(res)[m
[31m-[m
[31m-    if not number then[m
[31m-        if res == protocol.null then[m
[31m-            return nil[m
[31m-        end[m
[31m-        client.error('cannot parse '..res..' as a numeric response.')[m
[31m-    end[m
[31m-[m
[31m-    return number[m
[31m-end[m
[31m-[m
[31m-protocol.prefixes = {[m
[31m-    ['+'] = response.status,[m
[31m-    ['-'] = response.error,[m
[31m-    ['$'] = response.bulk,[m
[31m-    ['*'] = response.multibulk,[m
[31m-    [':'] = response.integer,[m
[31m-}[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-function request.raw(client, buffer)[m
[31m-    local bufferType = type(buffer)[m
[31m-[m
[31m-    if bufferType == 'table' then[m
[31m-        client.network.write(client, table.concat(buffer))[m
[31m-    elseif bufferType == 'string' then[m
[31m-        client.network.write(client, buffer)[m
[31m-    else[m
[31m-        client.error('argument error: ' .. bufferType)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function request.multibulk(client, command, ...)[m
[31m-    local args      = {...}[m
[31m-    local args_len  = #args[m
[31m-    local buffer    = { true, true }[m
[31m-    local proto_nl  = protocol.newline[m
[31m-[m
[31m-    if args_len == 1 and type(args[1]) == 'table' then[m
[31m-        args_len, args = #args[1], args[1][m
[31m-    end[m
[31m-[m
[31m-    buffer[1] = '*' .. tostring(args_len + 1) .. proto_nl[m
[31m-    buffer[2] = '$' .. #command .. proto_nl .. command .. proto_nl[m
[31m-[m
[31m-    for _, argument in pairs(args) do[m
[31m-        s_argument = tostring(argument)[m
[31m-        table.insert(buffer, '$' .. #s_argument .. proto_nl .. s_argument .. proto_nl)[m
[31m-    end[m
[31m-[m
[31m-    request.raw(client, buffer)[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-local function custom(command, send, parse)[m
[31m-    return function(client, ...)[m
[31m-        local has_reply = send(client, command, ...)[m
[31m-        if has_reply == false then return end[m
[31m-        local reply = response.read(client)[m
[31m-[m
[31m-        if type(reply) == 'table' and reply.queued then[m
[31m-            reply.parser = parse[m
[31m-            return reply[m
[31m-        else[m
[31m-            if parse then[m
[31m-                return parse(reply, command, ...)[m
[31m-            else[m
[31m-                return reply[m
[31m-            end[m
[31m-        end[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-function command(command, opts)[m
[31m-    if opts == nil or type(opts) == 'function' then[m
[31m-        return custom(command, request.multibulk, opts)[m
[31m-    else[m
[31m-        return custom(command, opts.request or request.multibulk, opts.response)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m-local define_command_impl = function(target, name, opts)[m
[31m-    local opts = opts or {}[m
[31m-    target[string.lower(name)] = custom([m
[31m-        opts.command or string.upper(name),[m
[31m-        opts.request or request.multibulk,[m
[31m-        opts.response or nil[m
[31m-    )[m
[31m-end[m
[31m-[m
[31m-function define_command(name, opts)[m
[31m-    define_command_impl(commands, name, opts)[m
[31m-end[m
[31m-[m
[31m-local undefine_command_impl = function(target, name)[m
[31m-    target[string.lower(name)] = nil[m
[31m-end[m
[31m-[m
[31m-function undefine_command(name)[m
[31m-    undefine_command_impl(commands, name)[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-local client_prototype = {}[m
[31m-[m
[31m-client_prototype.raw_cmd = function(client, buffer)[m
[31m-    request.raw(client, buffer .. protocol.newline)[m
[31m-    return response.read(client)[m
[31m-end[m
[31m-[m
[31m-client_prototype.define_command = function(client, name, opts)[m
[31m-    define_command_impl(client, name, opts)[m
[31m-end[m
[31m-[m
[31m-client_prototype.undefine_command = function(client, name)[m
[31m-    undefine_command_impl(client, name)[m
[31m-end[m
[31m-[m
[31m--- Command pipelining[m
[31m-[m
[31m-client_prototype.pipeline = function(client, block)[m
[31m-    local requests, replies, parsers = {}, {}, {}[m
[31m-    local socket_write, socket_read = client.network.write, client.network.read[m
[31m-[m
[31m-    client.network.write = function(_, buffer)[m
[31m-        table.insert(requests, buffer)[m
[31m-    end[m
[31m-[m
[31m-    -- TODO: this hack is necessary to temporarily reuse the current[m
[31m-    --       request -> response handling implementation of redis-lua[m
[31m-    --       without further changes in the code, but it will surely[m
[31m-    --       disappear when the new command-definition infrastructure[m
[31m-    --       will finally be in place.[m
[31m-    client.network.read = function() return '+QUEUED' end[m
[31m-[m
[31m-    local pipeline = setmetatable({}, {[m
[31m-        __index = function(env, name)[m
[31m-            local cmd = client[name][m
[31m-            if not cmd then[m
[31m-                client.error('unknown redis command: ' .. name, 2)[m
[31m-            end[m
[31m-            return function(self, ...)[m
[31m-                local reply = cmd(client, ...)[m
[31m-                table.insert(parsers, #requests, reply.parser)[m
[31m-                return reply[m
[31m-            end[m
[31m-        end[m
[31m-    })[m
[31m-[m
[31m-    local success, retval = pcall(block, pipeline)[m
[31m-[m
[31m-    client.network.write, client.network.read = socket_write, socket_read[m
[31m-    if not success then client.error(retval, 0) end[m
[31m-[m
[31m-    client.network.write(client, table.concat(requests, ''))[m
[31m-[m
[31m-    for i = 1, #requests do[m
[31m-        local reply, parser = response.read(client), parsers[i][m
[31m-        if parser then[m
[31m-            reply = parser(reply)[m
[31m-        end[m
[31m-        table.insert(replies, i, reply)[m
[31m-    end[m
[31m-[m
[31m-    return replies, #requests[m
[31m-end[m
[31m-[m
[31m--- Publish/Subscribe[m
[31m-[m
[31m-do[m
[31m-    local channels = function(channels)[m
[31m-        if type(channels) == 'string' then[m
[31m-            channels = { channels }[m
[31m-        end[m
[31m-        return channels[m
[31m-    end[m
[31m-[m
[31m-    local subscribe = function(client, ...)[m
[31m-        request.multibulk(client, 'subscribe', ...)[m
[31m-    end[m
[31m-    local psubscribe = function(client, ...)[m
[31m-        request.multibulk(client, 'psubscribe', ...)[m
[31m-    end[m
[31m-    local unsubscribe = function(client, ...)[m
[31m-        request.multibulk(client, 'unsubscribe')[m
[31m-    end[m
[31m-    local punsubscribe = function(client, ...)[m
[31m-        request.multibulk(client, 'punsubscribe')[m
[31m-    end[m
[31m-[m
[31m-    local consumer_loop = function(client)[m
[31m-        local aborting, subscriptions = false, 0[m
[31m-[m
[31m-        local abort = function()[m
[31m-            if not aborting then[m
[31m-                unsubscribe(client)[m
[31m-                punsubscribe(client)[m
[31m-                aborting = true[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        return coroutine.wrap(function()[m
[31m-            while true do[m
[31m-                local message[m
[31m-                local response = response.read(client)[m
[31m-[m
[31m-                if response[1] == 'pmessage' then[m
[31m-                    message = {[m
[31m-                        kind    = response[1],[m
[31m-                        pattern = response[2],[m
[31m-                        channel = response[3],[m
[31m-                        payload = response[4],[m
[31m-                    }[m
[31m-                else[m
[31m-                    message = {[m
[31m-                        kind    = response[1],[m
[31m-                        channel = response[2],[m
[31m-                        payload = response[3],[m
[31m-                    }[m
[31m-                end[m
[31m-[m
[31m-                if string.match(message.kind, '^p?subscribe$') then[m
[31m-                    subscriptions = subscriptions + 1[m
[31m-                end[m
[31m-                if string.match(message.kind, '^p?unsubscribe$') then[m
[31m-                    subscriptions = subscriptions - 1[m
[31m-                end[m
[31m-[m
[31m-                if aborting and subscriptions == 0 then[m
[31m-                    break[m
[31m-                end[m
[31m-                coroutine.yield(message, abort)[m
[31m-            end[m
[31m-        end)[m
[31m-    end[m
[31m-[m
[31m-    client_prototype.pubsub = function(client, subscriptions)[m
[31m-        if type(subscriptions) == 'table' then[m
[31m-            if subscriptions.subscribe then[m
[31m-                subscribe(client, channels(subscriptions.subscribe))[m
[31m-            end[m
[31m-            if subscriptions.psubscribe then[m
[31m-                psubscribe(client, channels(subscriptions.psubscribe))[m
[31m-            end[m
[31m-        end[m
[31m-        return consumer_loop(client)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- Redis transactions (MULTI/EXEC)[m
[31m-[m
[31m-do[m
[31m-    local function identity(...) return ... end[m
[31m-    local emptytable = {}[m
[31m-[m
[31m-    local function initialize_transaction(client, options, block, queued_parsers)[m
[31m-        local coro = coroutine.create(block)[m
[31m-[m
[31m-        if options.watch then[m
[31m-            local watch_keys = {}[m
[31m-            for _, key in pairs(options.watch) do[m
[31m-                table.insert(watch_keys, key)[m
[31m-            end[m
[31m-            if #watch_keys > 0 then[m
[31m-                client:watch(unpack(watch_keys))[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        local transaction_client = setmetatable({}, {__index=client})[m
[31m-        transaction_client.exec  = function(...)[m
[31m-            client.error('cannot use EXEC inside a transaction block')[m
[31m-        end[m
[31m-        transaction_client.multi = function(...)[m
[31m-            coroutine.yield()[m
[31m-        end[m
[31m-        transaction_client.commands_queued = function()[m
[31m-            return #queued_parsers[m
[31m-        end[m
[31m-[m
[31m-        assert(coroutine.resume(coro, transaction_client))[m
[31m-[m
[31m-        transaction_client.multi = nil[m
[31m-        transaction_client.discard = function(...)[m
[31m-            local reply = client:discard()[m
[31m-            for i, v in pairs(queued_parsers) do[m
[31m-                queued_parsers[i]=nil[m
[31m-            end[m
[31m-            coro = initialize_transaction(client, options, block, queued_parsers)[m
[31m-            return reply[m
[31m-        end[m
[31m-        transaction_client.watch = function(...)[m
[31m-            client.error('WATCH inside MULTI is not allowed')[m
[31m-        end[m
[31m-        setmetatable(transaction_client, { __index = function(t, k)[m
[31m-                local cmd = client[k][m
[31m-                if type(cmd) == "function" then[m
[31m-                    local function queuey(self, ...)[m
[31m-                        local reply = cmd(client, ...)[m
[31m-                        assert((reply or emptytable).queued == true, 'a QUEUED reply was expected')[m
[31m-                        table.insert(queued_parsers, reply.parser or identity)[m
[31m-                        return reply[m
[31m-                    end[m
[31m-                    t[k]=queuey[m
[31m-                    return queuey[m
[31m-                else[m
[31m-                    return cmd[m
[31m-                end[m
[31m-            end[m
[31m-        })[m
[31m-        client:multi()[m
[31m-        return coro[m
[31m-    end[m
[31m-[m
[31m-    local function transaction(client, options, coroutine_block, attempts)[m
[31m-        local queued_parsers, replies = {}, {}[m
[31m-        local retry = tonumber(attempts) or tonumber(options.retry) or 2[m
[31m-        local coro = initialize_transaction(client, options, coroutine_block, queued_parsers)[m
[31m-[m
[31m-        local success, retval[m
[31m-        if coroutine.status(coro) == 'suspended' then[m
[31m-            success, retval = coroutine.resume(coro)[m
[31m-        else[m
[31m-            -- do not fail if the coroutine has not been resumed (missing t:multi() with CAS)[m
[31m-            success, retval = true, 'empty transaction'[m
[31m-        end[m
[31m-        if #queued_parsers == 0 or not success then[m
[31m-            client:discard()[m
[31m-            assert(success, retval)[m
[31m-            return replies, 0[m
[31m-        end[m
[31m-[m
[31m-        local raw_replies = client:exec()[m
[31m-        if not raw_replies then[m
[31m-            if (retry or 0) <= 0 then[m
[31m-                client.error("MULTI/EXEC transaction aborted by the server")[m
[31m-            else[m
[31m-                --we're not quite done yet[m
[31m-                return transaction(client, options, coroutine_block, retry - 1)[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        for i, parser in pairs(queued_parsers) do[m
[31m-            table.insert(replies, i, parser(raw_replies[i]))[m
[31m-        end[m
[31m-[m
[31m-        return replies, #queued_parsers[m
[31m-    end[m
[31m-[m
[31m-    client_prototype.transaction = function(client, arg1, arg2)[m
[31m-        local options, block[m
[31m-        if not arg2 then[m
[31m-            options, block = {}, arg1[m
[31m-        elseif arg1 then --and arg2, implicitly[m
[31m-            options, block = type(arg1)=="table" and arg1 or { arg1 }, arg2[m
[31m-        else[m
[31m-            client.error("Invalid parameters for redis transaction.")[m
[31m-        end[m
[31m-[m
[31m-        if not options.watch then[m
[31m-            watch_keys = { }[m
[31m-            for i, v in pairs(options) do[m
[31m-                if tonumber(i) then[m
[31m-                    table.insert(watch_keys, v)[m
[31m-                    options[i] = nil[m
[31m-                end[m
[31m-            end[m
[31m-            options.watch = watch_keys[m
[31m-        elseif not (type(options.watch) == 'table') then[m
[31m-            options.watch = { options.watch }[m
[31m-        end[m
[31m-[m
[31m-        if not options.cas then[m
[31m-            local tx_block = block[m
[31m-            block = function(client, ...)[m
[31m-                client:multi()[m
[31m-                return tx_block(client, ...) --can't wrap this in pcall because we're in a coroutine.[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-        return transaction(client, options, block)[m
[31m-    end[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-local function connect_tcp(socket, parameters)[m
[31m-    local host, port = parameters.host, tonumber(parameters.port)[m
[31m-    local ok, err = socket:connect(host, port)[m
[31m-    if not ok then[m
[31m-        default_error_fn('could not connect to '..host..':'..port..' ['..err..']')[m
[31m-    end[m
[31m-    socket:setoption('tcp-nodelay', parameters.tcp_nodelay)[m
[31m-    return socket[m
[31m-end[m
[31m-[m
[31m-local function connect_unix(socket, parameters)[m
[31m-    local ok, err = socket:connect(parameters.path)[m
[31m-    if not ok then[m
[31m-        default_error_fn('could not connect to '..parameters.path..' ['..err..']')[m
[31m-    end[m
[31m-    return socket[m
[31m-end[m
[31m-[m
[31m-local function create_connection(parameters)[m
[31m-    local perform_connection, socket[m
[31m-[m
[31m-    if parameters.scheme == 'unix' then[m
[31m-        perform_connection, socket = connect_unix, require('socket.unix')[m
[31m-        assert(socket, 'your build of LuaSocket does not support UNIX domain sockets')[m
[31m-    else[m
[31m-        if parameters.scheme then[m
[31m-            local scheme = parameters.scheme[m
[31m-            assert(scheme == 'redis' or scheme == 'tcp', 'invalid scheme: '..scheme)[m
[31m-        end[m
[31m-        perform_connection, socket = connect_tcp, require('socket').tcp[m
[31m-    end[m
[31m-[m
[31m-    return perform_connection(socket(), parameters)[m
[31m-end[m
[31m-[m
[31m-function connect(...)[m
[31m-    local args, parameters = {...}, nil[m
[31m-[m
[31m-    if #args == 1 then[m
[31m-        if type(args[1]) == 'table' then[m
[31m-            parameters = args[1][m
[31m-        else[m
[31m-            local uri = require('socket.url')[m
[31m-            parameters = uri.parse(select(1, ...))[m
[31m-            if parameters.scheme then[m
[31m-                if parameters.query then[m
[31m-                    for k, v in parameters.query:gmatch('([-_%w]+)=([-_%w]+)') do[m
[31m-                        if k == 'tcp_nodelay' or k == 'tcp-nodelay' then[m
[31m-                            parameters.tcp_nodelay = parse_boolean(v)[m
[31m-                        end[m
[31m-                    end[m
[31m-                end[m
[31m-            else[m
[31m-                parameters.host = parameters.path[m
[31m-            end[m
[31m-        end[m
[31m-    elseif #args > 1 then[m
[31m-        local host, port = unpack(args)[m
[31m-        parameters = { host = host, port = port }[m
[31m-    end[m
[31m-[m
[31m-    local socket = create_connection(merge_defaults(parameters))[m
[31m-    local client = create_client(client_prototype, socket, commands)[m
[31m-    [m
[31m-    client.error = default_error_fn[m
[31m-[m
[31m-    return client[m
[31m-end[m
[31m-[m
[31m--- ############################################################################[m
[31m-[m
[31m-commands = {[m
[31m-    -- commands operating on the key space[m
[31m-    exists           = command('EXISTS', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    del              = command('DEL'),[m
[31m-    type             = command('TYPE'),[m
[31m-    rename           = command('RENAME'),[m
[31m-    renamenx         = command('RENAMENX', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    expire           = command('EXPIRE', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    pexpire          = command('PEXPIRE', {     -- >= 2.6[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    expireat         = command('EXPIREAT', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    pexpireat        = command('PEXPIREAT', {   -- >= 2.6[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    ttl              = command('TTL'),[m
[31m-    pttl             = command('PTTL'),         -- >= 2.6[m
[31m-    move             = command('MOVE', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    dbsize           = command('DBSIZE'),[m
[31m-    persist          = command('PERSIST', {     -- >= 2.2[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    keys             = command('KEYS', {[m
[31m-        response = function(response)[m
[31m-            if type(response) == 'string' then[m
[31m-                -- backwards compatibility path for Redis < 2.0[m
[31m-                local keys = {}[m
[31m-                response:gsub('[^%s]+', function(key)[m
[31m-                    table.insert(keys, key)[m
[31m-                end)[m
[31m-                response = keys[m
[31m-            end[m
[31m-            return response[m
[31m-        end[m
[31m-    }),[m
[31m-    randomkey        = command('RANDOMKEY', {[m
[31m-        response = function(response)[m
[31m-            if response == '' then[m
[31m-                return nil[m
[31m-            else[m
[31m-                return response[m
[31m-            end[m
[31m-        end[m
[31m-    }),[m
[31m-    sort             = command('SORT', {[m
[31m-        request = function(client, command, key, params)[m
[31m-            --[[ params = {[m
[31m-                    by    = 'weight_*',[m
[31m-                    get   = 'object_*',[m
[31m-                    limit = { 0, 10 },[m
[31m-                    sort  = 'desc',[m
[31m-                    alpha = true,[m
[31m-                } --]][m
[31m-            local query = { key }[m
[31m-[m
[31m-            if params then[m
[31m-                if params.by then[m
[31m-                    table.insert(query, 'BY')[m
[31m-                    table.insert(query, params.by)[m
[31m-                end[m
[31m-[m
[31m-                if type(params.limit) == 'table' then[m
[31m-                    -- TODO: check for lower and upper limits[m
[31m-                    table.insert(query, 'LIMIT')[m
[31m-                    table.insert(query, params.limit[1])[m
[31m-                    table.insert(query, params.limit[2])[m
[31m-                end[m
[31m-[m
[31m-                if params.get then[m
[31m-                    if (type(params.get) == 'table') then[m
[31m-                        for _, getarg in pairs(params.get) do[m
[31m-                            table.insert(query, 'GET')[m
[31m-                            table.insert(query, getarg)[m
[31m-                        end[m
[31m-                    else[m
[31m-                        table.insert(query, 'GET')[m
[31m-                        table.insert(query, params.get)[m
[31m-                    end[m
[31m-                end[m
[31m-[m
[31m-                if params.sort then[m
[31m-                    table.insert(query, params.sort)[m
[31m-                end[m
[31m-[m
[31m-                if params.alpha == true then[m
[31m-                    table.insert(query, 'ALPHA')[m
[31m-                end[m
[31m-[m
[31m-                if params.store then[m
[31m-                    table.insert(query, 'STORE')[m
[31m-                    table.insert(query, params.store)[m
[31m-                end[m
[31m-            end[m
[31m-[m
[31m-            request.multibulk(client, command, query)[m
[31m-        end[m
[31m-    }),[m
[31m-[m
[31m-    -- commands operating on string values[m
[31m-    set              = command('SET'),[m
[31m-    setnx            = command('SETNX', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    setex            = command('SETEX'),        -- >= 2.0[m
[31m-    psetex           = command('PSETEX'),       -- >= 2.6[m
[31m-    mset             = command('MSET', {[m
[31m-        request = mset_filter_args[m
[31m-    }),[m
[31m-    msetnx           = command('MSETNX', {[m
[31m-        request  = mset_filter_args,[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    get              = command('GET'),[m
[31m-    mget             = command('MGET'),[m
[31m-    getset           = command('GETSET'),[m
[31m-    incr             = command('INCR'),[m
[31m-    incrby           = command('INCRBY'),[m
[31m-    incrbyfloat      = command('INCRBYFLOAT', { -- >= 2.6[m
[31m-        response = function(reply, command, ...)[m
[31m-            return tonumber(reply)[m
[31m-        end,[m
[31m-    }),[m
[31m-    decr             = command('DECR'),[m
[31m-    decrby           = command('DECRBY'),[m
[31m-    append           = command('APPEND'),       -- >= 2.0[m
[31m-    substr           = command('SUBSTR'),       -- >= 2.0[m
[31m-    strlen           = command('STRLEN'),       -- >= 2.2[m
[31m-    setrange         = command('SETRANGE'),     -- >= 2.2[m
[31m-    getrange         = command('GETRANGE'),     -- >= 2.2[m
[31m-    setbit           = command('SETBIT'),       -- >= 2.2[m
[31m-    getbit           = command('GETBIT'),       -- >= 2.2[m
[31m-[m
[31m-    -- commands operating on lists[m
[31m-    rpush            = command('RPUSH'),[m
[31m-    lpush            = command('LPUSH'),[m
[31m-    llen             = command('LLEN'),[m
[31m-    lrange           = command('LRANGE'),[m
[31m-    ltrim            = command('LTRIM'),[m
[31m-    lindex           = command('LINDEX'),[m
[31m-    lset             = command('LSET'),[m
[31m-    lrem             = command('LREM'),[m
[31m-    lpop             = command('LPOP'),[m
[31m-    rpop             = command('RPOP'),[m
[31m-    rpoplpush        = command('RPOPLPUSH'),[m
[31m-    blpop            = command('BLPOP'),        -- >= 2.0[m
[31m-    brpop            = command('BRPOP'),        -- >= 2.0[m
[31m-    rpushx           = command('RPUSHX'),       -- >= 2.2[m
[31m-    lpushx           = command('LPUSHX'),       -- >= 2.2[m
[31m-    linsert          = command('LINSERT'),      -- >= 2.2[m
[31m-    brpoplpush       = command('BRPOPLPUSH'),   -- >= 2.2[m
[31m-[m
[31m-    -- commands operating on sets[m
[31m-    sadd             = command('SADD', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    srem             = command('SREM', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    spop             = command('SPOP'),[m
[31m-    smove            = command('SMOVE', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    scard            = command('SCARD'),[m
[31m-    sismember        = command('SISMEMBER', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    sinter           = command('SINTER'),[m
[31m-    sinterstore      = command('SINTERSTORE'),[m
[31m-    sunion           = command('SUNION'),[m
[31m-    sunionstore      = command('SUNIONSTORE'),[m
[31m-    sdiff            = command('SDIFF'),[m
[31m-    sdiffstore       = command('SDIFFSTORE'),[m
[31m-    smembers         = command('SMEMBERS'),[m
[31m-    srandmember      = command('SRANDMEMBER'),[m
[31m-[m
[31m-    -- commands operating on sorted sets[m
[31m-    zadd             = command('ZADD', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    zincrby          = command('ZINCRBY'),[m
[31m-    zrem             = command('ZREM', {[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    zrange           = command('ZRANGE', {[m
[31m-        request  = zset_range_request,[m
[31m-        response = zset_range_reply,[m
[31m-    }),[m
[31m-    zrevrange        = command('ZREVRANGE', {[m
[31m-        request  = zset_range_request,[m
[31m-        response = zset_range_reply,[m
[31m-    }),[m
[31m-    zrangebyscore    = command('ZRANGEBYSCORE', {[m
[31m-        request  = zset_range_byscore_request,[m
[31m-        response = zset_range_reply,[m
[31m-    }),[m
[31m-    zrevrangebyscore = command('ZREVRANGEBYSCORE', {    -- >= 2.2[m
[31m-        request  = zset_range_byscore_request,[m
[31m-        response = zset_range_reply,[m
[31m-    }),[m
[31m-    zunionstore      = command('ZUNIONSTORE', {         -- >= 2.0[m
[31m-        request = zset_store_request[m
[31m-    }),[m
[31m-    zinterstore      = command('ZINTERSTORE', {         -- >= 2.0[m
[31m-        request = zset_store_request[m
[31m-    }),[m
[31m-    zcount           = command('ZCOUNT'),[m
[31m-    zcard            = command('ZCARD'),[m
[31m-    zscore           = command('ZSCORE'),[m
[31m-    zremrangebyscore = command('ZREMRANGEBYSCORE'),[m
[31m-    zrank            = command('ZRANK'),                -- >= 2.0[m
[31m-    zrevrank         = command('ZREVRANK'),             -- >= 2.0[m
[31m-    zremrangebyrank  = command('ZREMRANGEBYRANK'),      -- >= 2.0[m
[31m-[m
[31m-    -- commands operating on hashes[m
[31m-    hset             = command('HSET', {        -- >= 2.0[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    hsetnx           = command('HSETNX', {      -- >= 2.0[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    hmset            = command('HMSET', {       -- >= 2.0[m
[31m-        request  = hash_multi_request_builder(function(args, k, v)[m
[31m-            table.insert(args, k)[m
[31m-            table.insert(args, v)[m
[31m-        end),[m
[31m-    }),[m
[31m-    hincrby          = command('HINCRBY'),      -- >= 2.0[m
[31m-    hincrbyfloat     = command('HINCRBYFLOAT', {-- >= 2.6[m
[31m-        response = function(reply, command, ...)[m
[31m-            return tonumber(reply)[m
[31m-        end,[m
[31m-    }),[m
[31m-    hget             = command('HGET'),         -- >= 2.0[m
[31m-    hmget            = command('HMGET', {       -- >= 2.0[m
[31m-        request  = hash_multi_request_builder(function(args, k, v)[m
[31m-            table.insert(args, v)[m
[31m-        end),[m
[31m-    }),[m
[31m-    hdel             = command('HDEL', {        -- >= 2.0[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    hexists          = command('HEXISTS', {     -- >= 2.0[m
[31m-        response = toboolean[m
[31m-    }),[m
[31m-    hlen             = command('HLEN'),         -- >= 2.0[m
[31m-    hkeys            = command('HKEYS'),        -- >= 2.0[m
[31m-    hvals            = command('HVALS'),        -- >= 2.0[m
[31m-    hgetall          = command('HGETALL', {     -- >= 2.0[m
[31m-        response = function(reply, command, ...)[m
[31m-            local new_reply = { }[m
[31m-            for i = 1, #reply, 2 do new_reply[reply[i]] = reply[i + 1] end[m
[31m-            return new_reply[m
[31m-        end[m
[31m-    }),[m
[31m-[m
[31m-    -- connection related commands[m
[31m-    ping             = command('PING', {[m
[31m-        response = function(response) return response == 'PONG' end[m
[31m-    }),[m
[31m-    echo             = command('ECHO'),[m
[31m-    auth             = command('AUTH'),[m
[31m-    select           = command('SELECT'),[m
[31m-    quit             = command('QUIT', {[m
[31m-        request = fire_and_forget[m
[31m-    }),[m
[31m-[m
[31m-    -- transactions[m
[31m-    multi            = command('MULTI'),        -- >= 2.0[m
[31m-    exec             = command('EXEC'),         -- >= 2.0[m
[31m-    discard          = command('DISCARD'),      -- >= 2.0[m
[31m-    watch            = command('WATCH'),        -- >= 2.2[m
[31m-    unwatch          = command('UNWATCH'),      -- >= 2.2[m
[31m-[m
[31m-    -- publish - subscribe[m
[31m-    subscribe        = command('SUBSCRIBE'),    -- >= 2.0[m
[31m-    unsubscribe      = command('UNSUBSCRIBE'),  -- >= 2.0[m
[31m-    psubscribe       = command('PSUBSCRIBE'),   -- >= 2.0[m
[31m-    punsubscribe     = command('PUNSUBSCRIBE'), -- >= 2.0[m
[31m-    publish          = command('PUBLISH'),      -- >= 2.0[m
[31m-[m
[31m-    -- redis scripting[m
[31m-    eval             = command('EVAL'),         -- >= 2.6[m
[31m-    evalsha          = command('EVALSHA'),      -- >= 2.6[m
[31m-    script           = command('SCRIPT'),       -- >= 2.6[m
[31m-[m
[31m-    -- remote server control commands[m
[31m-    bgrewriteaof     = command('BGREWRITEAOF'),[m
[31m-    config           = command('CONFIG', {     -- >= 2.0[m
[31m-        response = function(reply, command, ...)[m
[31m-            if (type(reply) == 'table') then[m
[31m-                local new_reply = { }[m
[31m-                for i = 1, #reply, 2 do new_reply[reply[i]] = reply[i + 1] end[m
[31m-                return new_reply[m
[31m-            end[m
[31m-[m
[31m-            return reply[m
[31m-        end[m
[31m-    }),[m
[31m-    client           = command('CLIENT'),       -- >= 2.4[m
[31m-    slaveof          = command('SLAVEOF'),[m
[31m-    save             = command('SAVE'),[m
[31m-    bgsave           = command('BGSAVE'),[m
[31m-    lastsave         = command('LASTSAVE'),[m
[31m-    flushdb          = command('FLUSHDB'),[m
[31m-    flushall         = command('FLUSHALL'),[m
[31m-    shutdown         = command('SHUTDOWN', {[m
[31m-        request = fire_and_forget[m
[31m-    }),[m
[31m-    slowlog          = command('SLOWLOG', {     -- >= 2.2.13[m
[31m-        response = function(reply, command, ...)[m
[31m-            if (type(reply) == 'table') then[m
[31m-                local structured = { }[m
[31m-                for index, entry in ipairs(reply) do[m
[31m-                    structured[index] = {[m
[31m-                        id = tonumber(entry[1]),[m
[31m-                        timestamp = tonumber(entry[2]),[m
[31m-                        duration = tonumber(entry[3]),[m
[31m-                        command = entry[4],[m
[31m-                    }[m
[31m-                end[m
[31m-                return structured[m
[31m-            end[m
[31m-[m
[31m-            return reply[m
[31m-        end[m
[31m-    }),[m
[31m-    info             = command('INFO', {[m
[31m-        response = function(response)[m
[31m-            if string.find(response, '^# ') then[m
[31m-                return parse_info_new(response)[m
[31m-            end[m
[31m-            return parse_info(response)[m
[31m-        end[m
[31m-    }),[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/tapset/ngx_lua.stp b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/tapset/ngx_lua.stp[m
[1mdeleted file mode 100644[m
[1mindex 04fecb5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/tapset/ngx_lua.stp[m
[1m+++ /dev/null[m
[36m@@ -1,5 +0,0 @@[m
[31m-function ngx_http_lua_ctx_context(r)[m
[31m-{[m
[31m-[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex 17841ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,60 +0,0 @@[m
[31m-#!/usr/bin/env bash[m
[31m-[m
[31m-# this script is for developers only.[m
[31m-# dependent on the ngx-build script from the nginx-devel-utils repostory:[m
[31m-#   https://github.com/openresty/nginx-devel-utils/blob/master/ngx-build[m
[31m-# the resulting nginx is located at ./work/nginx/sbin/nginx[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=${1:-1.4.1}[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-# the ngx-build script is from https://github.com/agentzh/nginx-devel-utils[m
[31m-[m
[31m-            #--add-module=$home/work/nginx_upload_module-2.2.0 \[m
[31m-[m
[31m-            #--without-pcre \[m
[31m-            #--without-http_rewrite_module \[m
[31m-            #--without-http_autoindex_module \[m
[31m-            #--with-cc=gcc46 \[m
[31m-            #--with-cc=clang \[m
[31m-            #--without-http_referer_module \[m
[31m-            #--with-http_v2_module \[m
[31m-            #--with-http_spdy_module \[m
[31m-[m
[31m-time ngx-build $force $version \[m
[31m-            --with-ipv6 \[m
[31m-            --with-cc-opt="-I$PCRE_INC -I$OPENSSL_INC" \[m
[31m-            --with-http_realip_module \[m
[31m-            --with-http_ssl_module \[m
[31m-            --add-module=$root/../ndk-nginx-module \[m
[31m-            --add-module=$root/../set-misc-nginx-module \[m
[31m-            --with-ld-opt="-L$PCRE_LIB -L$OPENSSL_LIB -Wl,-rpath,$PCRE_LIB:$LIBDRIZZLE_LIB:$OPENSSL_LIB" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --with-http_image_filter_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_memcached_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-            --with-http_auth_request_module \[m
[31m-                --add-module=$root/../echo-nginx-module \[m
[31m-                --add-module=$root/../memc-nginx-module \[m
[31m-                --add-module=$root/../srcache-nginx-module \[m
[31m-                --add-module=$root \[m
[31m-                --add-module=$root/../lua-upstream-nginx-module \[m
[31m-              --add-module=$root/../headers-more-nginx-module \[m
[31m-                --add-module=$root/../drizzle-nginx-module \[m
[31m-                --add-module=$root/../rds-json-nginx-module \[m
[31m-                --add-module=$root/../coolkit-nginx-module \[m
[31m-                --add-module=$root/../redis2-nginx-module \[m
[31m-                --add-module=$root/t/data/fake-module \[m
[31m-                --with-http_gunzip_module \[m
[31m-                --with-http_dav_module \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-                $opts \[m
[31m-                --with-debug[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/fix-comments b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/fix-comments[m
[1mdeleted file mode 100644[m
[1mindex bcf1d5d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/fix-comments[m
[1m+++ /dev/null[m
[36m@@ -1,27 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-for my $infile (@ARGV) {[m
[31m-    warn "Processing $infile...\n";[m
[31m-    open my $in, $infile or[m
[31m-        die "Cannot open $infile for reading: $!\n";[m
[31m-    my $s;[m
[31m-    my $changed = 0;[m
[31m-    while (<$in>) {[m
[31m-        $changed += s{//(.*)}{/* $1 */};[m
[31m-        $s .= $_;[m
[31m-    }[m
[31m-    close $in;[m
[31m-[m
[31m-    if ($changed) {[m
[31m-        my $outfile = $infile;[m
[31m-        open my $out, ">$outfile" or[m
[31m-            die "Cannot open $outfile for writing: $!\n";[m
[31m-        print $out $s;[m
[31m-        close $out;[m
[31m-        warn "Wrote $outfile\n";[m
[31m-    }[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/gdbinit b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/gdbinit[m
[1mdeleted file mode 100644[m
[1mindex 1508c64..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/gdbinit[m
[1m+++ /dev/null[m
[36m@@ -1,415 +0,0 @@[m
[31m-# This gdb script provides several useful routines for debugging ngx_lua or[m
[31m-# standalone Lua/LuaJIT.[m
[31m-#[m
[31m-# You need gdb >= v7.3 to make this script working correctly.[m
[31m-#[m
[31m-# Installation: place it at $HOME/.gdbinit[m
[31m-#[m
[31m-# -- chaoslawful <at> gmail <dot> com[m
[31m-[m
[31m-#### Lua type defines ####[m
[31m-[m
[31m-set $__LUA_TNONE = -1[m
[31m-set $__LUA_TNIL = 0[m
[31m-set $__LUA_TBOOLEAN = 1[m
[31m-set $__LUA_TLIGHTUSERDATA = 2[m
[31m-set $__LUA_TNUMBER = 3[m
[31m-set $__LUA_TSTRING = 4[m
[31m-set $__LUA_TTABLE = 5[m
[31m-set $__LUA_TFUNCTION = 6[m
[31m-set $__LUA_TUSERDATA = 7[m
[31m-set $__LUA_TTHREAD = 8[m
[31m-[m
[31m-#### Lua constants ####[m
[31m-[m
[31m-set $__LUA_GLOBALSINDEX = -10002[m
[31m-set $__LUA_ENVIRONINDEX = -10001[m
[31m-set $__LUA_REGISTRYINDEX = -10000[m
[31m-[m
[31m-#### Auxiliary methods ####[m
[31m-[m
[31m-define __lua_debug_instance[m
[31m-	if !$__lua_debug_instance[m
[31m-		set $__lua_debug_instance = (lua_Debug*)malloc(sizeof(lua_Debug))[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __free_lua_debug_instance[m
[31m-	if $__lua_debug_instance[m
[31m-		set $rc = free($__lua_debug_instance)[m
[31m-		set $__lua_debug_instance = 0[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-set $__BUCKET_SIZE = 16[m
[31m-define __set_instance[m
[31m-	if !$__set_instance[m
[31m-		set $__set_instance = (void*(*(*))[2])malloc($__BUCKET_SIZE*sizeof(void*(*)[2]))[m
[31m-		set $rc = memset($__set_instance, 0, $__BUCKET_SIZE*sizeof(void*(*)[2]))[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __free_set_instance[m
[31m-	if $__set_instance[m
[31m-		__set_clean[m
[31m-		set $rc = free($__set_instance)[m
[31m-		set $__set_instance = 0[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __set_add[m
[31m-	set $p = (void*)$arg0[m
[31m-	set $__bkt_idx = (int)$p%$__BUCKET_SIZE[m
[31m-[m
[31m-	__set_instance[m
[31m-	set $__elem = (void*(*)[2])$__set_instance[$__bkt_idx][m
[31m-	set $__found = 0[m
[31m-	while $__elem[m
[31m-		if (*$__elem)[0] == $p[m
[31m-			set $__found = 1[m
[31m-			loop_break[m
[31m-		end[m
[31m-		set $__elem = (void*(*)[2])(*$__elem)[1][m
[31m-	end[m
[31m-	if $__found[m
[31m-		set $existed_in_set = 1[m
[31m-	else[m
[31m-		set $existed_in_set = 0[m
[31m-[m
[31m-		set $rc = (void*(*)[2])calloc(1, sizeof(void*)*2)[m
[31m-		set (*$rc)[0] = $p[m
[31m-		set (*$rc)[1] = $__set_instance[$__bkt_idx][m
[31m-		set $__set_instance[$__bkt_idx] = $rc[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __set_is_exist[m
[31m-	set $p = (void*)$arg0[m
[31m-	set $__bkt_idx = (int)$p%$__BUCKET_SIZE[m
[31m-[m
[31m-	__set_instance[m
[31m-	set $__elem = (void*(*)[2])$__set_instance[$__bkt_idx][m
[31m-	set $__found = 0[m
[31m-	while $__elem[m
[31m-		if (*$__elem)[0] == $p[m
[31m-			set $__found = 1[m
[31m-			loop_break[m
[31m-		end[m
[31m-		set $__elem = (void*(*)[2])(*$__elem)[1][m
[31m-	end[m
[31m-	if $__found[m
[31m-		set $existed_in_set = 1[m
[31m-	else[m
[31m-		set $existed_in_set = 0[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define __set_clean[m
[31m-	__set_instance[m
[31m-[m
[31m-	set $__bkt_idx = 0[m
[31m-	while $__bkt_idx < $__BUCKET_SIZE[m
[31m-		set $__elem = (void*(*)[2])$__set_instance[$__bkt_idx][m
[31m-		while $__elem[m
[31m-			set $__next = (void*(*)[2])(*$__elem)[1][m
[31m-			set $rc = free($__elem)[m
[31m-			set $__elem = $__next[m
[31m-		end[m
[31m-		set $__set_instance[$__bkt_idx] = 0[m
[31m-		set $__bkt_idx = $__bkt_idx+1[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-define hook-quit[m
[31m-	__free_lua_debug_instance[m
[31m-	__free_set_instance[m
[31m-end[m
[31m-[m
[31m-define hook-detach[m
[31m-	__free_lua_debug_instance[m
[31m-	__free_set_instance[m
[31m-end[m
[31m-[m
[31m-define hook-disconnect[m
[31m-	__free_lua_debug_instance[m
[31m-	__free_set_instance[m
[31m-end[m
[31m-[m
[31m-define _lua_pop[m
[31m-	set $l = (lua_State*)$arg0[m
[31m-	set $_n = (int)$arg1[m
[31m-	set $_rc = lua_settop($l, -$_n-1)[m
[31m-end[m
[31m-[m
[31m-define _lua_dump_locals[m
[31m-	set $l = (lua_State*)$arg0[m
[31m-	set $dbg = (lua_Debug*)$arg1[m
[31m-	set $idx = 1[m
[31m-[m
[31m-	set $rc = lua_getlocal($l, $dbg, $idx)[m
[31m-	if $rc[m
[31m-		printf "\t----[[ Locals ]]----\n"[m
[31m-		while $rc[m
[31m-			printf "\t%d:\t'%s' = ", $idx, $rc[m
[31m-			__lua_dump_stack $l -1[m
[31m-			printf "\n"[m
[31m-[m
[31m-			_lua_pop $l 1[m
[31m-			set $idx = $idx + 1[m
[31m-			set $rc = lua_getlocal($l, $dbg, $idx)[m
[31m-		end[m
[31m-	else[m
[31m-		printf "\tNo locals!\n"[m
[31m-	end[m
[31m-	printf "\n"[m
[31m-end[m
[31m-[m
[31m-define _lua_dump_upvalues[m
[31m-	set $l = (lua_State*)$arg0[m
[31m-	set $dbg = (lua_Debug*)$arg1[m
[31m-	set $idx = 1[m
[31m-[m
[31m-	set $rc = lua_getinfo($l, "f", $dbg)[m
[31m-	if $rc[m
[31m-		set $rc = lua_getupvalue($l, -1, $idx)[m
[31m-		if $rc[m
[31m-			printf "\t----[[ Upvalues ]]----\n"[m
[31m-			while $rc[m
[31m-				printf "\t%d:\t'%s' = ", $idx, $rc[m
[31m-				__lua_dump_stack $l -1[m
[31m-				printf "\n"[m
[31m-[m
[31m-				_lua_pop $l 1[m
[31m-				set $idx = $idx + 1[m
[31m-				set $rc = lua_getupvalue($l, -1, $idx)[m
[31m-			end[m
[31m-		else[m
[31m-			printf "\tNo upvalues!\n"[m
[31m-		end[m
[31m-		_lua_pop $l 1[m
[31m-	else[m
[31m-		printf "\tFailed to get function closure!\n"[m
[31m-	end[m
[31m-	printf "\n"[m
[31m-end[m
[31m-[m
[31m-define __lua_dump_stack[m
[31m-	__set_clean[m
[31m-	__lua_dump_stack_aux $arg0 $arg1 0[m
[31m-end[m
[31m-[m
[31m-define __lua_dump_stack_aux[m
[31m-	set $l = (lua_State*)$arg0[m
[31m-	set $nidx_$arg2 = (int)$arg1[m
[31m-	set $cidx_$arg2 = (int)$arg2+1[m
[31m-[m
[31m-	# relative stack index to absolute index[m
[31m-	if $nidx_$arg2 < 0 && $nidx_$arg2 > $__LUA_REGISTRYINDEX[m
[31m-		set $nidx_$arg2 = $nidx_$arg2 + (int)lua_gettop($l) + 1[m
[31m-	end[m
[31m-[m
[31m-	set $vt_$arg2 = (int)lua_type($l, $nidx_$arg2)[m
[31m-[m
[31m-	if $vt_$arg2 == $__LUA_TNONE[m
[31m-		echo <invalid index>[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TNIL[m
[31m-		echo (nil)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TBOOLEAN[m
[31m-		printf "(bool) %d", lua_toboolean($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TLIGHTUSERDATA[m
[31m-		printf "(ludata) %p", lua_touserdata($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TNUMBER[m
[31m-		printf "%g", lua_tonumber($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TSTRING[m
[31m-		set $tmplen = (size_t*)malloc(sizeof(size_t))[m
[31m-		set $tmp = lua_pushvalue($l, $nidx_$arg2)[m
[31m-		set $tmp = lua_tolstring($l, -1, $tmplen)[m
[31m-#printf "(string:%d) ", *$tmplen[m
[31m-		eval "output/r *(const char (*)[%d])$tmp", *$tmplen[m
[31m-		_lua_pop $l 1[m
[31m-		set $tmp = free($tmplen)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TTABLE[m
[31m-		set $rc = lua_topointer($l, $nidx_$arg2)[m
[31m-#printf "(table) %p { ", $rc[m
[31m-		printf "{ "[m
[31m-		__set_add $rc[m
[31m-		if $existed_in_set[m
[31m-			printf "... "[m
[31m-		else[m
[31m-			set $rc = lua_pushnil($l)[m
[31m-			set $rc = lua_next($l, $nidx_$arg2)[m
[31m-			while $rc != 0[m
[31m-				printf "["[m
[31m-				__lua_dump_stack_aux $l -2 $cidx_$arg2[m
[31m-				printf "]"[m
[31m-				printf " = "[m
[31m-				__lua_dump_stack_aux $l -1 $cidx_$arg2[m
[31m-				printf ", "[m
[31m-				_lua_pop $l 1[m
[31m-				set $rc = lua_next($l, $nidx_$arg2)[m
[31m-			end[m
[31m-		end[m
[31m-		printf "}"[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TFUNCTION[m
[31m-		printf "(func) %p", lua_topointer($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TUSERDATA[m
[31m-		printf "(udata) %p", lua_topointer($l, $nidx_$arg2)[m
[31m-	end[m
[31m-	if $vt_$arg2 == $__LUA_TTHREAD[m
[31m-		printf "(thread) %p", lua_topointer($l, $nidx_$arg2)[m
[31m-	else[m
[31m-		if $vt_$arg2 > $__LUA_TTHREAD || $vt_$arg2 < 0[m
[31m-			echo <unknown type>[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-#### Command methods ####[m
[31m-[m
[31m-define lbt [m
[31m-	if $argc < 1[m
[31m-		echo Please specify Lua state and/or dump flag!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		if $argc > 1[m
[31m-			set $dump_local = ($arg1&1)==1[m
[31m-			set $dump_upvalue = ($arg1&2)==2[m
[31m-		else[m
[31m-			set $dump_local = 0[m
[31m-			set $dump_upvalue = 0[m
[31m-		end[m
[31m-[m
[31m-		__lua_debug_instance[m
[31m-		set $dbg = $__lua_debug_instance[m
[31m-[m
[31m-		set $level = 0[m
[31m-		set $rc = lua_getstack($l, $level, $dbg)[m
[31m-		while $rc > 0[m
[31m-			set $rc = lua_getinfo($l, "Sln", $dbg)[m
[31m-			set $name = $dbg->name[m
[31m-			if !$name[m
[31m-				set $name = "???"[m
[31m-			end[m
[31m-[m
[31m-			printf "#%d\t%s\t[%s]\tat %s:%d\n", $level, $name, $dbg->what, $dbg->source, $dbg->currentline[m
[31m-[m
[31m-			if $dump_local[m
[31m-				_lua_dump_locals $l $dbg[m
[31m-			end[m
[31m-			if $dump_upvalue[m
[31m-				_lua_dump_upvalues $l $dbg[m
[31m-			end[m
[31m-[m
[31m-			set $level = $level+1[m
[31m-			set $rc = lua_getstack($l, $level, $dbg)[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document lbt[m
[31m-lbt <lua state> [<dump>]: Dump the backtrace of the specified Lua state. <dump> is a mask value, whose bit 1/2 controls the dump of locals/upvalues at each stack frame correspondingly. So set <dump> to 1 dumps only locals; set to 2 dumps only upvalues; and set to 3 dumps both locals and upvalues.[m
[31m-end[m
[31m-[m
[31m-define ll[m
[31m-	if $argc != 2[m
[31m-		echo Please specify Lua state and stack frame number (0-based)!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		set $level = (int)$arg1[m
[31m-[m
[31m-		__lua_debug_instance[m
[31m-		set $dbg = $__lua_debug_instance[m
[31m-[m
[31m-		set $rc = lua_getstack($l, $level, $dbg)[m
[31m-		if $rc > 0[m
[31m-			_lua_dump_locals $l $dbg[m
[31m-		else[m
[31m-			echo Failed to get Lua stack frame!\n[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document ll[m
[31m-ll <lua state> <frameno>: Dump all local vars in the specified Lua stack frame (0-based).[m
[31m-end[m
[31m-[m
[31m-define lu[m
[31m-	if $argc != 2[m
[31m-		echo Please specify Lua state and stack frame number (0-based)!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		set $level = (int)$arg1[m
[31m-[m
[31m-		__lua_debug_instance[m
[31m-		set $dbg = $__lua_debug_instance[m
[31m-[m
[31m-		set $rc = lua_getstack($l, $level, $dbg)[m
[31m-		if $rc > 0[m
[31m-			_lua_dump_upvalues $l $dbg[m
[31m-		else[m
[31m-			echo Failed to get Lua stack frame!\n[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document lu[m
[31m-lu <lua state> <frameno>: Dump all upvalues in the specified Lua stack frame (0-based).[m
[31m-end[m
[31m-[m
[31m-define lg[m
[31m-	if $argc != 1[m
[31m-		echo Please specify Lua state!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		__lua_dump_stack $l $__LUA_GLOBALSINDEX[m
[31m-		printf "\n"[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document lg[m
[31m-lg <lua state>: Dump all entries in Lua global table.[m
[31m-end[m
[31m-[m
[31m-define lr[m
[31m-	if $argc != 1[m
[31m-		echo Please specify Lua state!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		__lua_dump_stack $l $__LUA_REGISTRYINDEX[m
[31m-		printf "\n"[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document lr[m
[31m-lr <lua state>: Dump all entries in Lua registry table.[m
[31m-end[m
[31m-[m
[31m-define ls[m
[31m-	if $argc != 1[m
[31m-		echo Please specify Lua state!\n[m
[31m-	else[m
[31m-		set $l = (lua_State*)$arg0[m
[31m-		set $idx = lua_gettop($l)[m
[31m-		while $idx >= 1[m
[31m-			printf "#%d ", $idx[m
[31m-			__lua_dump_stack $l $idx[m
[31m-			printf "\n"[m
[31m-			set $idx = $idx - 1[m
[31m-		end[m
[31m-	end[m
[31m-end[m
[31m-[m
[31m-document ls[m
[31m-ls <lua state>: Dump all entries in call stack.[m
[31m-end[m
[31m-[m
[31m-# vi:ft=gdb ts=4 sw=4[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/gen-lexer-c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/gen-lexer-c[m
[1mdeleted file mode 100755[m
[1mindex dfed3fc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/gen-lexer-c[m
[1m+++ /dev/null[m
[36m@@ -1,18 +0,0 @@[m
[31m-#!/usr/bin/env bash[m
[31m-[m
[31m-if [ -z "$1" ]; then[m
[31m-    level=0[m
[31m-else[m
[31m-    level="$1"[m
[31m-fi[m
[31m-[m
[31m-#echo '{' '}' '\[=*\[' '--\[=*\[' '\]=*\]' '--[^\n]*' '"(?:\\[^\n]|[^"\n\\])*"' $'\'(?:\\\\[^\\n]|[^\'\\n\\\\])*\''[m
[31m-[m
[31m-# we need the re.pl script here:[m
[31m-#   https://github.com/openresty/sregex/blob/dfa-multi-re/re.pl[m
[31m-re.pl -W --no-main -c --cc="clang -O2" \[m
[31m-    --func-name ngx_http_lua_lex \[m
[31m-    --header ngx_http_lua_lex.h -o src/ngx_http_lua_lex.c \[m
[31m-    --debug=$level -n 8 \[m
[31m-    -- '{' '}' '\[=*\[' '--\[=*\[' '\]=*\]' '--[^\n]*' '"(?:\\[^\n]|[^"\n\\])*"' $'\'(?:\\\\[^\\n]|[^\'\\n\\\\])*\'' \[m
[31m-    || exit 1[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/ngx-links b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/ngx-links[m
[1mdeleted file mode 100755[m
[1mindex bf54f46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/ngx-links[m
[1m+++ /dev/null[m
[36m@@ -1,62 +0,0 @@[m
[31m-#!/usr/bin/env perl[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-[m
[31m-use Cwd qw( cwd );[m
[31m-use Getopt::Std;[m
[31m-[m
[31m-my %opts;[m
[31m-getopts('f', \%opts) or[m
[31m-    die "Usage: $0 [-f][m
[31m-Options:[m
[31m-    -f          Override exising symbolic links with force[m
[31m-";[m
[31m-[m
[31m-my $root = shift || 'src';[m
[31m-[m
[31m-my $force = $opts{f};[m
[31m-[m
[31m-opendir my $dir, $root[m
[31m-    or die "Can't open directory src/ for reading: $!\n";[m
[31m-[m
[31m-my @links;[m
[31m-[m
[31m-while (my $entry = readdir $dir) {[m
[31m-    my ($base, $ext);[m
[31m-[m
[31m-    my $source = "$root/$entry";[m
[31m-[m
[31m-    if (-l $source || -d $source) {[m
[31m-        warn "skipping $source\n";[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    if ($entry =~ m{ ^ ngx_ (?: \w+ _ )+ (\w+) \. ([ch]|rl) $}x) {[m
[31m-        ($base, $ext) = ($1, $2);[m
[31m-    } else {[m
[31m-        next;[m
[31m-    }[m
[31m-[m
[31m-    my $target = "$root/$base.$ext";[m
[31m-    if (-e $target && ! -l $target) {[m
[31m-        die "target $target already exists, and not a symlink, not overriding...Abort.\n";[m
[31m-    } elsif (-l $target) {[m
[31m-        #warn "it's a link";[m
[31m-        if ( ! $force ) {[m
[31m-            die "target $target already exists, not overriding...Abort.\n";[m
[31m-        }[m
[31m-        warn "overriding existing symlink $target\n";[m
[31m-    }[m
[31m-    #warn "creating $target --> $root/$entry\n";[m
[31m-    system("ln -svf `pwd`/$source $target") == 0 or[m
[31m-        die "Failed to create the symlink\n";;[m
[31m-[m
[31m-    push @links, $target;[m
[31m-}[m
[31m-[m
[31m-print join("\n", @links), "\n";[m
[31m-[m
[31m-close $dir;[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/retab b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/retab[m
[1mdeleted file mode 100755[m
[1mindex 89cd1b0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/retab[m
[1m+++ /dev/null[m
[36m@@ -1,8 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-for f in $*; do[m
[31m-	if [ -f "$f" ]; then[m
[31m-		vim -c retab -c x $f[m
[31m-	fi[m
[31m-done[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/revim b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/revim[m
[1mdeleted file mode 100755[m
[1mindex aa14da2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/revim[m
[1m+++ /dev/null[m
[36m@@ -1,102 +0,0 @@[m
[31m-#!/usr/bin/perl[m
[31m-# vim:set ft=perl ts=4 sw=4 et fdm=marker:[m
[31m-#[m
[31m-# revim - add customized vim modeline for given files[m
[31m-# Copyright (c) 2010 chaoslawful[m
[31m-[m
[31m-use strict;[m
[31m-use warnings;[m
[31m-use Getopt::Std;[m
[31m-[m
[31m-my %opts;[m
[31m-[m
[31m-getopts('hm:', \%opts);[m
[31m-[m
[31m-if($opts{h} or !@ARGV) {[m
[31m-    die <<EOT;[m
[31m-Usage: revim [-m <vim modeline>] src/*[m
[31m-[m
[31m-In <vim modeline>, the following placeholder(s) can be used:[m
[31m-[m
[31m-    * %t - Expands to vim file type. E.g. 'c' for .c files, 'perl' for .pl files.[m
[31m-EOT[m
[31m-}[m
[31m-[m
[31m-my $vim_ml = $opts{m} || "vim:set ft=%t ts=4 sw=4 et fdm=marker:";[m
[31m-my @files = map glob, @ARGV;[m
[31m-for my $file (@files) {[m
[31m-    next if -d $file;[m
[31m-    my ($ft, $ml) = detect_filetype($file, $vim_ml);[m
[31m-    next if !defined($ft);[m
[31m-    revim($file, $ml);[m
[31m-}[m
[31m-[m
[31m-sub detect_filetype[m
[31m-{[m
[31m-    my ($f, $tmpl) = @_;[m
[31m-    my ($ft, $lcmt, $rcmt);[m
[31m-    my %phs;[m
[31m-[m
[31m-    if($f =~ /.([cC]|[hH])$/) {[m
[31m-        $ft = "c";[m
[31m-        ($lcmt, $rcmt) = ("/* ", " */");[m
[31m-    } elsif($f =~ /.(pl|pm)$/) {[m
[31m-        $ft = "perl";[m
[31m-        ($lcmt, $rcmt) = ("# ", "");[m
[31m-    } elsif($f =~ /.t_?$/) {[m
[31m-        # assuming tests are written in perl[m
[31m-        $ft = "perl";[m
[31m-        ($lcmt, $rcmt) = ("# ", "");[m
[31m-    } else {[m
[31m-        $ft = undef;[m
[31m-    }[m
[31m-[m
[31m-    if(defined($ft)) {[m
[31m-        %phs = ([m
[31m-            "%t" => $ft,[m
[31m-        );[m
[31m-[m
[31m-        $tmpl =~ s/(%[a-z])/$phs{$1}/ge;[m
[31m-        $tmpl =~ s/^/$lcmt/;[m
[31m-        $tmpl =~ s/$/$rcmt/;[m
[31m-[m
[31m-        return ($ft, $tmpl);[m
[31m-    }[m
[31m-[m
[31m-    return (undef, undef);[m
[31m-}[m
[31m-[m
[31m-sub revim[m
[31m-{[m
[31m-    my ($f, $ml) = @_;[m
[31m-    my @lines;[m
[31m-[m
[31m-    open my $in, $f[m
[31m-        or die "Can't open $f for reading: $!";[m
[31m-    while(<$in>) {[m
[31m-        push(@lines, $_);[m
[31m-    }[m
[31m-    close $in;[m
[31m-[m
[31m-    my @nlines = grep {!/\bvim?:/} @lines;[m
[31m-    warn "revim: $f:\tremoved existing vim modeline.\n"[m
[31m-        if(@nlines != @lines);[m
[31m-[m
[31m-    if($nlines[0] =~ /^#!/) {    # has shebang line[m
[31m-        my $shebang = shift @nlines;[m
[31m-        unshift(@nlines, $shebang, "$ml\n");[m
[31m-    } else {[m
[31m-        unshift(@nlines, "$ml\n");[m
[31m-    }[m
[31m-[m
[31m-    my $text = join '', @nlines;[m
[31m-[m
[31m-    open my $out, "> $f"[m
[31m-        or die "Can't open $f for writing: $!";[m
[31m-    binmode $out;[m
[31m-    print $out $text;[m
[31m-    close $out;[m
[31m-[m
[31m-    warn "revim: $f:\tdone.\n";[m
[31m-}[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/run_test.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/run_test.sh[m
[1mdeleted file mode 100755[m
[1mindex 1f5b12f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/run_test.sh[m
[1m+++ /dev/null[m
[36m@@ -1,10 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-script_dir=$(dirname $0)[m
[31m-root=$(readlink -f $script_dir/..)[m
[31m-testfile=${1:-$root/t/*.t $root/t/*/*.t}[m
[31m-cd $root[m
[31m-$script_dir/reindex $testfile[m
[31m-export PATH=$root/work/sbin:$PATH[m
[31m-killall nginx[m
[31m-prove -I$root/../test-nginx/lib $testfile[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/update-readme.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/update-readme.sh[m
[1mdeleted file mode 100755[m
[1mindex cf71f25..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/util/update-readme.sh[m
[1m+++ /dev/null[m
[36m@@ -1,4 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-perl util/wiki2pod.pl doc/manpage.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex fe161e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua-0.10.5/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,151 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr1[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Param[m
[31m-    sendmsg(mmsg[0].msg_hdr)[m
[31m-    fun:sendmmsg[m
[31m-    fun:__libc_res_nsend[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   sendmsg(msg.msg_iov[0])[m
[31m-   fun:__sendmsg_nocancel[m
[31m-   fun:ngx_write_channel[m
[31m-   fun:ngx_pass_open_channel[m
[31m-   fun:ngx_start_cache_manager_processes[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Cond[m
[31m-    fun:ngx_init_cycle[m
[31m-    fun:ngx_master_process_cycle[m
[31m-    fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-   fun:_dl_sysdep_start[m
[31m-   fun:_dl_start[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   sendmsg(mmsg[0].msg_hdr)[m
[31m-   fun:sendmmsg[m
[31m-   fun:__libc_res_nsend[m
[31m-   fun:__libc_res_nquery[m
[31m-   fun:__libc_res_nquerydomain[m
[31m-   fun:__libc_res_nsearch[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/.gitattributes b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/.gitattributes[m
[1mdeleted file mode 100644[m
[1mindex 6fe6f35..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/.gitattributes[m
[1m+++ /dev/null[m
[36m@@ -1 +0,0 @@[m
[31m-*.t linguist-language=Text[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex f361f79..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,61 +0,0 @@[m
[31m-*.mobi[m
[31m-genmobi.sh[m
[31m-.libs[m
[31m-*.swp[m
[31m-*.slo[m
[31m-*.la[m
[31m-*.swo[m
[31m-*.lo[m
[31m-*~[m
[31m-*.o[m
[31m-print.txt[m
[31m-.rsync[m
[31m-*.tar.gz[m
[31m-dist[m
[31m-build[78][m
[31m-build[m
[31m-tags[m
[31m-update-readme[m
[31m-*.tmp[m
[31m-test/Makefile[m
[31m-test/blib[m
[31m-test.sh[m
[31m-t/t.sh[m
[31m-test/t/servroot/[m
[31m-releng[m
[31m-reset[m
[31m-*.t_[m
[31m-src/handler.h[m
[31m-src/util.c[m
[31m-src/module.h[m
[31m-src/module.c[m
[31m-src/drizzle.c[m
[31m-src/processor.h[m
[31m-src/handler.c[m
[31m-src/util.h[m
[31m-src/drizzle.h[m
[31m-src/processor.c[m
[31m-src/output.c[m
[31m-src/output.h[m
[31m-libdrizzle[m
[31m-ctags[m
[31m-src/stream.h[m
[31m-nginx[m
[31m-keepalive[m
[31m-reindex[m
[31m-util/bench[m
[31m-*.html[m
[31m-trace.out*[m
[31m-try.sh[m
[31m-build9[m
[31m-src/module.[ch][m
[31m-t/servroot/[m
[31m-headers.[ch][m
[31m-buildroot/[m
[31m-build1[0-9][m
[31m-go[m
[31m-all[m
[31m-analyze[m
[31m-addr2line[m
[31m-*.plist[m
[31m-Makefile[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/config[m
[1mdeleted file mode 100644[m
[1mindex 9e2bc08..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/config[m
[1m+++ /dev/null[m
[36m@@ -1,16 +0,0 @@[m
[31m-ngx_addon_name=ngx_http_lua_upstream_module[m
[31m-HTTP_LUA_UPSTREAM_SRCS="$ngx_addon_dir/src/ngx_http_lua_upstream_module.c"[m
[31m-[m
[31m-if test -n "$ngx_module_link"; then[m
[31m-    ngx_module_type=HTTP[m
[31m-    ngx_module_name=$ngx_addon_name[m
[31m-    ngx_module_srcs="$HTTP_LUA_UPSTREAM_SRCS"[m
[31m-[m
[31m-    . auto/module[m
[31m-else[m
[31m-    HTTP_MODULES="$HTTP_MODULES $ngx_addon_name"[m
[31m-    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $HTTP_LUA_UPSTREAM_SRCS"[m
[31m-[m
[31m-    CORE_INCS="$CORE_INCS $ngx_module_incs"[m
[31m-    CORE_LIBS="$CORE_LIBS $ngx_module_libs"[m
[31m-fi[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/src/ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/src/ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex dc18430..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/src/ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef _DDEBUG_H_INCLUDED_[m
[31m-#define _DDEBUG_H_INCLUDED_[m
[31m-[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "lua-upstream *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " at %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char *fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void dd(const char *fmt, ...) {[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)   \[m
[31m-    dd("r->read_event_handler = %s", \[m
[31m-        r->read_event_handler == ngx_http_block_reading ? \[m
[31m-            "ngx_http_block_reading" : \[m
[31m-        r->read_event_handler == ngx_http_test_reading ? \[m
[31m-            "ngx_http_test_reading" : \[m
[31m-        r->read_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#define dd_check_write_event_handler(r)   \[m
[31m-    dd("r->write_event_handler = %s", \[m
[31m-        r->write_event_handler == ngx_http_handler ? \[m
[31m-            "ngx_http_handler" : \[m
[31m-        r->write_event_handler == ngx_http_core_run_phases ? \[m
[31m-            "ngx_http_core_run_phases" : \[m
[31m-        r->write_event_handler == ngx_http_request_empty_handler ? \[m
[31m-            "ngx_http_request_empty_handler" : "UNKNOWN")[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#define dd_check_read_event_handler(r)[m
[31m-#define dd_check_write_event_handler(r)[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-[m
[31m-#endif /* _DDEBUG_H_INCLUDED_ */[m
[31m-[m
[31m-/* vi:set ft=c ts=4 sw=4 et fdm=marker: */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/src/ngx_http_lua_upstream_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/src/ngx_http_lua_upstream_module.c[m
[1mdeleted file mode 100644[m
[1mindex b299457..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/src/ngx_http_lua_upstream_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,548 +0,0 @@[m
[31m-[m
[31m-/*[m
[31m- * Copyright (C) Yichun Zhang (agentzh)[m
[31m- */[m
[31m-[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-#include "ddebug.h"[m
[31m-[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <lauxlib.h>[m
[31m-#include "ngx_http_lua_api.h"[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_lua_upstream_module;[m
[31m-[m
[31m-[m
[31m-static ngx_int_t ngx_http_lua_upstream_init(ngx_conf_t *cf);[m
[31m-static int ngx_http_lua_upstream_create_module(lua_State * L);[m
[31m-static int ngx_http_lua_upstream_get_upstreams(lua_State * L);[m
[31m-static int ngx_http_lua_upstream_get_servers(lua_State * L);[m
[31m-static ngx_http_upstream_main_conf_t *[m
[31m-    ngx_http_lua_upstream_get_upstream_main_conf(lua_State *L);[m
[31m-static int ngx_http_lua_upstream_get_primary_peers(lua_State * L);[m
[31m-static int ngx_http_lua_upstream_get_backup_peers(lua_State * L);[m
[31m-static int ngx_http_lua_get_peer(lua_State *L,[m
[31m-    ngx_http_upstream_rr_peer_t *peer, ngx_uint_t id);[m
[31m-static ngx_http_upstream_srv_conf_t *[m
[31m-    ngx_http_lua_upstream_find_upstream(lua_State *L, ngx_str_t *host);[m
[31m-static ngx_http_upstream_rr_peer_t *[m
[31m-    ngx_http_lua_upstream_lookup_peer(lua_State *L);[m
[31m-static int ngx_http_lua_upstream_set_peer_down(lua_State * L);[m
[31m-[m
[31m-[m
[31m-static ngx_http_module_t ngx_http_lua_upstream_ctx = {[m
[31m-    NULL,                           /* preconfiguration */[m
[31m-    ngx_http_lua_upstream_init,     /* postconfiguration */[m
[31m-    NULL,                           /* create main configuration */[m
[31m-    NULL,                           /* init main configuration */[m
[31m-    NULL,                           /* create server configuration */[m
[31m-    NULL,                           /* merge server configuration */[m
[31m-    NULL,                           /* create location configuration */[m
[31m-    NULL                            /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_module_t ngx_http_lua_upstream_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_http_lua_upstream_ctx,  /* module context */[m
[31m-    NULL,                        /* module directives */[m
[31m-    NGX_HTTP_MODULE,             /* module type */[m
[31m-    NULL,                        /* init master */[m
[31m-    NULL,                        /* init module */[m
[31m-    NULL,                        /* init process */[m
[31m-    NULL,                        /* init thread */[m
[31m-    NULL,                        /* exit thread */[m
[31m-    NULL,                        /* exit process */[m
[31m-    NULL,                        /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-[m
[31m-static ngx_int_t[m
[31m-ngx_http_lua_upstream_init(ngx_conf_t *cf)[m
[31m-{[m
[31m-    if (ngx_http_lua_add_package_preload(cf, "ngx.upstream",[m
[31m-                                         ngx_http_lua_upstream_create_module)[m
[31m-        != NGX_OK)[m
[31m-    {[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_create_module(lua_State * L)[m
[31m-{[m
[31m-    lua_createtable(L, 0, 1);[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_get_upstreams);[m
[31m-    lua_setfield(L, -2, "get_upstreams");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_get_servers);[m
[31m-    lua_setfield(L, -2, "get_servers");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_get_primary_peers);[m
[31m-    lua_setfield(L, -2, "get_primary_peers");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_get_backup_peers);[m
[31m-    lua_setfield(L, -2, "get_backup_peers");[m
[31m-[m
[31m-    lua_pushcfunction(L, ngx_http_lua_upstream_set_peer_down);[m
[31m-    lua_setfield(L, -2, "set_peer_down");[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_get_upstreams(lua_State * L)[m
[31m-{[m
[31m-    ngx_uint_t                            i;[m
[31m-    ngx_http_upstream_srv_conf_t        **uscfp, *uscf;[m
[31m-    ngx_http_upstream_main_conf_t        *umcf;[m
[31m-[m
[31m-    if (lua_gettop(L) != 0) {[m
[31m-        return luaL_error(L, "no argument expected");[m
[31m-    }[m
[31m-[m
[31m-    umcf = ngx_http_lua_upstream_get_upstream_main_conf(L);[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    lua_createtable(L, umcf->upstreams.nelts, 0);[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        lua_pushlstring(L, (char *) uscf->host.data, uscf->host.len);[m
[31m-        if (uscf->port) {[m
[31m-            lua_pushfstring(L, ":%d", (int) uscf->port);[m
[31m-            lua_concat(L, 2);[m
[31m-[m
[31m-            /* XXX maybe we should also take "default_port" into account[m
[31m-             * here? */[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, -2, i + 1);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_get_servers(lua_State * L)[m
[31m-{[m
[31m-    ngx_str_t                             host;[m
[31m-    ngx_uint_t                            i, j, n;[m
[31m-    ngx_http_upstream_server_t           *server;[m
[31m-    ngx_http_upstream_srv_conf_t         *us;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "exactly one argument expected");[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) luaL_checklstring(L, 1, &host.len);[m
[31m-[m
[31m-    us = ngx_http_lua_upstream_find_upstream(L, &host);[m
[31m-    if (us == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "upstream not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    if (us->servers == NULL || us->servers->nelts == 0) {[m
[31m-        lua_newtable(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    server = us->servers->elts;[m
[31m-[m
[31m-    lua_createtable(L, us->servers->nelts, 0);[m
[31m-[m
[31m-    for (i = 0; i < us->servers->nelts; i++) {[m
[31m-[m
[31m-        n = 4;[m
[31m-[m
[31m-        if (server[i].name.len) {[m
[31m-            n++;[m
[31m-        }[m
[31m-[m
[31m-        if (server[i].backup) {[m
[31m-            n++;[m
[31m-        }[m
[31m-[m
[31m-        if (server[i].down) {[m
[31m-            n++;[m
[31m-        }[m
[31m-[m
[31m-        lua_createtable(L, 0, n);[m
[31m-[m
[31m-        if (server[i].name.len) {[m
[31m-            lua_pushliteral(L, "name");[m
[31m-            lua_pushlstring(L, (char *) server[i].name.data,[m
[31m-                            server[i].name.len);[m
[31m-            lua_rawset(L, -3);[m
[31m-        }[m
[31m-[m
[31m-        lua_pushliteral(L, "addr");[m
[31m-[m
[31m-        if (server[i].naddrs == 1) {[m
[31m-            lua_pushlstring(L, (char *) server[i].addrs->name.data,[m
[31m-                            server[i].addrs->name.len);[m
[31m-[m
[31m-        } else {[m
[31m-            lua_createtable(L, server[i].naddrs, 0);[m
[31m-[m
[31m-            for (j = 0; j < server[i].naddrs; j++) {[m
[31m-                lua_pushlstring(L, (char *) server[i].addrs[j].name.data,[m
[31m-                                server[i].addrs[j].name.len);[m
[31m-                lua_rawseti(L, -2, j + 1);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        lua_pushliteral(L, "weight");[m
[31m-        lua_pushinteger(L, (lua_Integer) server[i].weight);[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        lua_pushliteral(L, "max_fails");[m
[31m-        lua_pushinteger(L, (lua_Integer) server[i].max_fails);[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        lua_pushliteral(L, "fail_timeout");[m
[31m-        lua_pushinteger(L, (lua_Integer) server[i].fail_timeout);[m
[31m-        lua_rawset(L, -3);[m
[31m-[m
[31m-        if (server[i].backup) {[m
[31m-            lua_pushliteral(L, "backup");[m
[31m-            lua_pushboolean(L, 1);[m
[31m-            lua_rawset(L, -3);[m
[31m-        }[m
[31m-[m
[31m-        if (server[i].down) {[m
[31m-            lua_pushliteral(L, "down");[m
[31m-            lua_pushboolean(L, 1);[m
[31m-            lua_rawset(L, -3);[m
[31m-        }[m
[31m-[m
[31m-        lua_rawseti(L, -2, i + 1);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_get_primary_peers(lua_State * L)[m
[31m-{[m
[31m-    ngx_str_t                             host;[m
[31m-    ngx_uint_t                            i;[m
[31m-    ngx_http_upstream_rr_peers_t         *peers;[m
[31m-    ngx_http_upstream_srv_conf_t         *us;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "exactly one argument expected");[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) luaL_checklstring(L, 1, &host.len);[m
[31m-[m
[31m-    us = ngx_http_lua_upstream_find_upstream(L, &host);[m
[31m-    if (us == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "upstream not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no peer data");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, peers->number, 0);[m
[31m-[m
[31m-    for (i = 0; i < peers->number; i++) {[m
[31m-        ngx_http_lua_get_peer(L, &peers->peer[i], i);[m
[31m-        lua_rawseti(L, -2, i + 1);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_get_backup_peers(lua_State * L)[m
[31m-{[m
[31m-    ngx_str_t                             host;[m
[31m-    ngx_uint_t                            i;[m
[31m-    ngx_http_upstream_rr_peers_t         *peers;[m
[31m-    ngx_http_upstream_srv_conf_t         *us;[m
[31m-[m
[31m-    if (lua_gettop(L) != 1) {[m
[31m-        return luaL_error(L, "exactly one argument expected");[m
[31m-    }[m
[31m-[m
[31m-    host.data = (u_char *) luaL_checklstring(L, 1, &host.len);[m
[31m-[m
[31m-    us = ngx_http_lua_upstream_find_upstream(L, &host);[m
[31m-    if (us == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "upstream not found");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no peer data");[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    peers = peers->next;[m
[31m-    if (peers == NULL) {[m
[31m-        lua_newtable(L);[m
[31m-        return 1;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, peers->number, 0);[m
[31m-[m
[31m-    for (i = 0; i < peers->number; i++) {[m
[31m-        ngx_http_lua_get_peer(L, &peers->peer[i], i);[m
[31m-        lua_rawseti(L, -2, i + 1);[m
[31m-    }[m
[31m-[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_upstream_set_peer_down(lua_State * L)[m
[31m-{[m
[31m-    ngx_http_upstream_rr_peer_t          *peer;[m
[31m-[m
[31m-    if (lua_gettop(L) != 4) {[m
[31m-        return luaL_error(L, "exactly 4 arguments expected");[m
[31m-    }[m
[31m-[m
[31m-    peer = ngx_http_lua_upstream_lookup_peer(L);[m
[31m-    if (peer == NULL) {[m
[31m-        return 2;[m
[31m-    }[m
[31m-[m
[31m-    peer->down = lua_toboolean(L, 4);[m
[31m-[m
[31m-    lua_pushboolean(L, 1);[m
[31m-    return 1;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_rr_peer_t *[m
[31m-ngx_http_lua_upstream_lookup_peer(lua_State *L)[m
[31m-{[m
[31m-    int                                   id, backup;[m
[31m-    ngx_str_t                             host;[m
[31m-    ngx_http_upstream_srv_conf_t         *us;[m
[31m-    ngx_http_upstream_rr_peers_t         *peers;[m
[31m-[m
[31m-    host.data = (u_char *) luaL_checklstring(L, 1, &host.len);[m
[31m-[m
[31m-    us = ngx_http_lua_upstream_find_upstream(L, &host);[m
[31m-    if (us == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "upstream not found");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    peers = us->peer.data;[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no peer data");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    backup = lua_toboolean(L, 2);[m
[31m-    if (backup) {[m
[31m-        peers = peers->next;[m
[31m-    }[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "no backup peers");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    id = luaL_checkint(L, 3);[m
[31m-    if (id < 0 || (ngx_uint_t) id >= peers->number) {[m
[31m-        lua_pushnil(L);[m
[31m-        lua_pushliteral(L, "bad peer id");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    return &peers->peer[id];[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static int[m
[31m-ngx_http_lua_get_peer(lua_State *L, ngx_http_upstream_rr_peer_t *peer,[m
[31m-    ngx_uint_t id)[m
[31m-{[m
[31m-    ngx_uint_t     n;[m
[31m-[m
[31m-    n = 8;[m
[31m-[m
[31m-    if (peer->down) {[m
[31m-        n++;[m
[31m-    }[m
[31m-[m
[31m-    if (peer->accessed) {[m
[31m-        n++;[m
[31m-    }[m
[31m-[m
[31m-    if (peer->checked) {[m
[31m-        n++;[m
[31m-    }[m
[31m-[m
[31m-    lua_createtable(L, 0, n);[m
[31m-[m
[31m-    lua_pushliteral(L, "id");[m
[31m-    lua_pushinteger(L, (lua_Integer) id);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "name");[m
[31m-    lua_pushlstring(L, (char *) peer->name.data, peer->name.len);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "weight");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->weight);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "current_weight");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->current_weight);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "effective_weight");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->effective_weight);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-#if (nginx_version >= 1009000)[m
[31m-    lua_pushliteral(L, "conns");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->conns);[m
[31m-    lua_rawset(L, -3);[m
[31m-#endif[m
[31m-[m
[31m-    lua_pushliteral(L, "fails");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->fails);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "max_fails");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->max_fails);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    lua_pushliteral(L, "fail_timeout");[m
[31m-    lua_pushinteger(L, (lua_Integer) peer->fail_timeout);[m
[31m-    lua_rawset(L, -3);[m
[31m-[m
[31m-    if (peer->accessed) {[m
[31m-        lua_pushliteral(L, "accessed");[m
[31m-        lua_pushinteger(L, (lua_Integer) peer->accessed);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    if (peer->checked) {[m
[31m-        lua_pushliteral(L, "checked");[m
[31m-        lua_pushinteger(L, (lua_Integer) peer->checked);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    if (peer->down) {[m
[31m-        lua_pushliteral(L, "down");[m
[31m-        lua_pushboolean(L, 1);[m
[31m-        lua_rawset(L, -3);[m
[31m-    }[m
[31m-[m
[31m-    return 0;[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_main_conf_t *[m
[31m-ngx_http_lua_upstream_get_upstream_main_conf(lua_State *L)[m
[31m-{[m
[31m-    ngx_http_request_t                   *r;[m
[31m-[m
[31m-    r = ngx_http_lua_get_request(L);[m
[31m-[m
[31m-    if (r == NULL) {[m
[31m-        return ngx_http_cycle_get_module_main_conf(ngx_cycle,[m
[31m-                                                   ngx_http_upstream_module);[m
[31m-    }[m
[31m-[m
[31m-    return ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-}[m
[31m-[m
[31m-[m
[31m-static ngx_http_upstream_srv_conf_t *[m
[31m-ngx_http_lua_upstream_find_upstream(lua_State *L, ngx_str_t *host)[m
[31m-{[m
[31m-    u_char                               *port;[m
[31m-    size_t                                len;[m
[31m-    ngx_int_t                             n;[m
[31m-    ngx_uint_t                            i;[m
[31m-    ngx_http_upstream_srv_conf_t        **uscfp, *uscf;[m
[31m-    ngx_http_upstream_main_conf_t        *umcf;[m
[31m-[m
[31m-    umcf = ngx_http_lua_upstream_get_upstream_main_conf(L);[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        uscf = uscfp[i];[m
[31m-[m
[31m-        if (uscf->host.len == host->len[m
[31m-            && ngx_memcmp(uscf->host.data, host->data, host->len) == 0)[m
[31m-        {[m
[31m-            return uscf;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    port = ngx_strlchr(host->data, host->data + host->len, ':');[m
[31m-    if (port) {[m
[31m-        port++;[m
[31m-        n = ngx_atoi(port, host->data + host->len - port);[m
[31m-        if (n < 1 || n > 65535) {[m
[31m-            return NULL;[m
[31m-        }[m
[31m-[m
[31m-        /* try harder with port */[m
[31m-[m
[31m-        len = port - host->data - 1;[m
[31m-[m
[31m-        for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-            uscf = uscfp[i];[m
[31m-[m
[31m-            if (uscf->port[m
[31m-                && uscf->port == n[m
[31m-                && uscf->host.len == len[m
[31m-                && ngx_memcmp(uscf->host.data, host->data, len) == 0)[m
[31m-            {[m
[31m-                return uscf;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    return NULL;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/t/lib/ljson.lua b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/t/lib/ljson.lua[m
[1mdeleted file mode 100644[m
[1mindex 1084724..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/t/lib/ljson.lua[m
[1m+++ /dev/null[m
[36m@@ -1,89 +0,0 @@[m
[31m-local ngx_null = ngx.null[m
[31m-local tostring = tostring[m
[31m-local byte = string.byte[m
[31m-local gsub = string.gsub[m
[31m-local sort = table.sort[m
[31m-local pairs = pairs[m
[31m-local ipairs = ipairs[m
[31m-local concat = table.concat[m
[31m-[m
[31m-local ok, new_tab = pcall(require, "table.new")[m
[31m-if not ok then[m
[31m-    new_tab = function (narr, nrec) return {} end[m
[31m-end[m
[31m-[m
[31m-local _M = {}[m
[31m-[m
[31m-local metachars = {[m
[31m-    ['\t'] = '\\t',[m
[31m-    ["\\"] = "\\\\",[m
[31m-    ['"'] = '\\"',[m
[31m-    ['\r'] = '\\r',[m
[31m-    ['\n'] = '\\n',[m
[31m-}[m
[31m-[m
[31m-local function encode_str(s)[m
[31m-    -- XXX we will rewrite this when string.buffer is implemented[m
[31m-    -- in LuaJIT 2.1 because string.gsub cannot be JIT compiled.[m
[31m-    return gsub(s, '["\\\r\n\t]', metachars)[m
[31m-end[m
[31m-[m
[31m-local function is_arr(t)[m
[31m-    local exp = 1[m
[31m-    for k, _ in pairs(t) do[m
[31m-        if k ~= exp then[m
[31m-            return nil[m
[31m-        end[m
[31m-        exp = exp + 1[m
[31m-    end[m
[31m-    return exp - 1[m
[31m-end[m
[31m-[m
[31m-local encode[m
[31m-[m
[31m-encode = function (v)[m
[31m-    if v == nil or v == ngx_null then[m
[31m-        return "null"[m
[31m-    end[m
[31m-[m
[31m-    local typ = type(v)[m
[31m-    if typ == 'string' then[m
[31m-        return '"' .. encode_str(v) .. '"'[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'number' or typ == 'boolean' then[m
[31m-        return tostring(v)[m
[31m-    end[m
[31m-[m
[31m-    if typ == 'table' then[m
[31m-        local n = is_arr(v)[m
[31m-        if n then[m
[31m-            local bits = new_tab(n, 0)[m
[31m-            for i, elem in ipairs(v) do[m
[31m-                bits[i] = encode(elem)[m
[31m-            end[m
[31m-            return "[" .. concat(bits, ",") .. "]"[m
[31m-        end[m
[31m-[m
[31m-        local keys = {}[m
[31m-        local i = 0[m
[31m-        for key, _ in pairs(v) do[m
[31m-            i = i + 1[m
[31m-            keys[i] = key[m
[31m-        end[m
[31m-        sort(keys)[m
[31m-[m
[31m-        local bits = new_tab(0, i)[m
[31m-        i = 0[m
[31m-        for _, key in ipairs(keys) do[m
[31m-            i = i + 1[m
[31m-            bits[i] = encode(key) .. ":" .. encode(v[key])[m
[31m-        end[m
[31m-        return "{" .. concat(bits, ",") .. "}"[m
[31m-    end[m
[31m-[m
[31m-    return '"<' .. typ .. '>"'[m
[31m-end[m
[31m-_M.encode = encode[m
[31m-[m
[31m-return _M[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex b6142a4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,566 +0,0 @@[m
[31m-# vim:set ft= ts=4 sw=4 et fdm=marker:[m
[31m-[m
[31m-use Test::Nginx::Socket::Lua;[m
[31m-[m
[31m-#worker_connections(1014);[m
[31m-#master_on();[m
[31m-#workers(2);[m
[31m-#log_level('warn');[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;[m
[31m-[m
[31m-$ENV{TEST_NGINX_MY_INIT_CONFIG} = <<_EOC_;[m
[31m-lua_package_path "t/lib/?.lua;;";[m
[31m-_EOC_[m
[31m-[m
[31m-#no_diff();[m
[31m-no_long_string();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: get upstream names[m
[31m---- http_config[m
[31m-    upstream foo.com:1234 {[m
[31m-        server 127.0.0.1;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local us = upstream.get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                ngx.say(u)[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo.com:1234[m
[31m-bar[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: get upstream names (no upstream)[m
[31m---- http_config[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local us = upstream.get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                ngx.say(u)[m
[31m-            end[m
[31m-            ngx.say("done")[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-done[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: get servers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-[m
[31m-    upstream foo.com:1234 {[m
[31m-        server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-        server agentzh.org:81 backup;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            for _, host in pairs{ "foo.com:1234", "bar", "blah" } do[m
[31m-                local srvs, err = upstream.get_servers(host)[m
[31m-                if not srvs then[m
[31m-                    ngx.say("failed to get servers: ", err)[m
[31m-                else[m
[31m-                    ngx.say(host, ": ", ljson.encode(srvs))[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-foo.com:1234: [{"addr":"127.0.0.1:80","fail_timeout":53,"max_fails":100,"name":"127.0.0.1","weight":4},{"addr":"106.184.1.99:81","backup":true,"fail_timeout":10,"max_fails":1,"name":"agentzh.org:81","weight":1}][m
[31m-bar: [{"addr":"127.0.0.2:80","fail_timeout":10,"max_fails":1,"name":"127.0.0.2","weight":1}][m
[31m-failed to get servers: upstream not found[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: sample in README[m
[31m---- http_config[m
[31m-    upstream foo.com {[m
[31m-        server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-        server agentzh.org:81;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-    }[m
[31m-[m
[31m---- config[m
[31m-    location = /upstreams {[m
[31m-        default_type text/plain;[m
[31m-        content_by_lua '[m
[31m-            local concat = table.concat[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local get_servers = upstream.get_servers[m
[31m-            local get_upstreams = upstream.get_upstreams[m
[31m-[m
[31m-            local us = get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                ngx.say("upstream ", u, ":")[m
[31m-                local srvs, err = get_servers(u)[m
[31m-                if not srvs then[m
[31m-                    ngx.say("failed to get servers in upstream ", u)[m
[31m-                else[m
[31m-                    for _, srv in ipairs(srvs) do[m
[31m-                        local first = true[m
[31m-                        for k, v in pairs(srv) do[m
[31m-                            if first then[m
[31m-                                first = false[m
[31m-                                ngx.print("    ")[m
[31m-                            else[m
[31m-                                ngx.print(", ")[m
[31m-                            end[m
[31m-                            if type(v) == "table" then[m
[31m-                                ngx.print(k, " = {", concat(v, ", "), "}")[m
[31m-                            else[m
[31m-                                ngx.print(k, " = ", v)[m
[31m-                            end[m
[31m-                        end[m
[31m-                        ngx.print("\\n")[m
[31m-                    end[m
[31m-                end[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /upstreams[m
[31m---- response_body[m
[31m-upstream foo.com:[m
[31m-    addr = 127.0.0.1:80, weight = 4, fail_timeout = 53, name = 127.0.0.1, max_fails = 100[m
[31m-    addr = 106.184.1.99:81, weight = 1, fail_timeout = 10, name = agentzh.org:81, max_fails = 1[m
[31m-upstream bar:[m
[31m-    addr = 127.0.0.2:80, weight = 1, fail_timeout = 10, name = 127.0.0.2, max_fails = 1[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: multi-peer servers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream test {[m
[31m-        server multi-ip-test.openresty.com;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local srvs, err = upstream.get_servers("test")[m
[31m-            if not srvs then[m
[31m-                ngx.say("failed to get test ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(srvs))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\[\{"addr":\["\d{1,3}(?:\.\d{1,3}){3}:80"(?:,"\d{1,3}(?:\.\d{1,3}){3}:80")+\],"fail_timeout":10,"max_fails":1,"name":"multi-ip-test\.openresty\.com","weight":1\}\]$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: get primary peers: multi-peer servers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream test {[m
[31m-        server multi-ip-test.openresty.com;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local peers, err = upstream.get_primary_peers("test")[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get primary peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body_like chop[m
[31m-^\[\{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"\d{1,3}(?:\.\d{1,3}){3}:80","weight":1\}(?:,\{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":\d+,"max_fails":1,"name":"\d{1,3}(?:\.\d{1,3}){3}:80","weight":1\})+\]$[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: get primary peers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream foo.com:1234 {[m
[31m-        server 127.0.0.6 fail_timeout=5 backup;[m
[31m-        server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-        server agentzh.org:81;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            us = upstream.get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                local peers, err = upstream.get_primary_peers(u)[m
[31m-                if not peers then[m
[31m-                    ngx.say("failed to get peers: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say(ljson.encode(peers))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"effective_weight":4,"fail_timeout":53,"fails":0,"id":0,"max_fails":100,"name":"127.0.0.1:80","weight":4},{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":1,"max_fails":1,"name":"106.184.1.99:81","weight":1}][m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.2:80","weight":1}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: get backup peers[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream foo.com:1234 {[m
[31m-        server 127.0.0.6 fail_timeout=5 backup;[m
[31m-        server 127.0.0.1 fail_timeout=53 weight=4 max_fails=100;[m
[31m-        server agentzh.org:81;[m
[31m-    }[m
[31m-[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            us = upstream.get_upstreams()[m
[31m-            for _, u in ipairs(us) do[m
[31m-                local peers, err = upstream.get_backup_peers(u)[m
[31m-                if not peers then[m
[31m-                    ngx.say("failed to get peers: ", err)[m
[31m-                    return[m
[31m-                end[m
[31m-                ngx.say(ljson.encode(peers))[m
[31m-            end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":5,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.6:80","weight":1}][m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.3:80","weight":1},{"conns":0,"current_weight":0,"effective_weight":7,"fail_timeout":23,"fails":0,"id":1,"max_fails":200,"name":"127.0.0.4:80","weight":7}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: set primary peer down (0)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, false, 0, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local peers, err = upstream.get_primary_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"down":true,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.2:80","weight":1}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: set primary peer down (1, bad index)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, false, 1, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local peers, err = upstream.get_primary_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-failed to set peer down: bad peer id[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: set backup peer down (index 0)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, true, 0, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local peers, err = upstream.get_backup_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"down":true,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.3:80","weight":1},{"conns":0,"current_weight":0,"effective_weight":7,"fail_timeout":23,"fails":0,"id":1,"max_fails":200,"name":"127.0.0.4:80","weight":7}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: set backup peer down (toggle twice, index 0)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, true, 0, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local ok, err = upstream.set_peer_down(u, true, 0, false)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local peers, err = upstream.get_backup_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.3:80","weight":1},{"conns":0,"current_weight":0,"effective_weight":7,"fail_timeout":23,"fails":0,"id":1,"max_fails":200,"name":"127.0.0.4:80","weight":7}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: set backup peer down (index 1)[m
[31m---- http_config[m
[31m-    $TEST_NGINX_MY_INIT_CONFIG[m
[31m-    upstream bar {[m
[31m-        server 127.0.0.2;[m
[31m-        server 127.0.0.3 backup;[m
[31m-        server 127.0.0.4 fail_timeout=23 weight=7 max_fails=200 backup;[m
[31m-    }[m
[31m---- config[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-            local upstream = require "ngx.upstream"[m
[31m-            local ljson = require "ljson"[m
[31m-            local u = "bar"[m
[31m-            local ok, err = upstream.set_peer_down(u, true, 1, true)[m
[31m-            if not ok then[m
[31m-                ngx.say("failed to set peer down: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-[m
[31m-            local peers, err = upstream.get_backup_peers(u)[m
[31m-            if not peers then[m
[31m-                ngx.say("failed to get peers: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            ngx.say(ljson.encode(peers))[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-[{"conns":0,"current_weight":0,"effective_weight":1,"fail_timeout":10,"fails":0,"id":0,"max_fails":1,"name":"127.0.0.3:80","weight":1},{"conns":0,"current_weight":0,"down":true,"effective_weight":7,"fail_timeout":23,"fails":0,"id":1,"max_fails":200,"name":"127.0.0.4:80","weight":7}][m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: upstream names with ports (github #2)[m
[31m---- http_config[m
[31m---- config[m
[31m-    location /upstream1 {[m
[31m-        proxy_pass http://127.0.0.1:1190;[m
[31m-    }[m
[31m-[m
[31m-    location /upstream2{[m
[31m-        proxy_pass http://127.0.0.2:1110;[m
[31m-    }[m
[31m-[m
[31m-    location /upstream3{[m
[31m-        proxy_pass http://127.0.0.1:1130;[m
[31m-    }[m
[31m-[m
[31m-    location /t {[m
[31m-        content_by_lua '[m
[31m-                local concat = table.concat[m
[31m-                local upstream = require "ngx.upstream"[m
[31m-                local get_servers = upstream.get_servers[m
[31m-                local get_upstreams = upstream.get_upstreams[m
[31m-[m
[31m-                local us = get_upstreams()[m
[31m-                for _, u in ipairs(us) do[m
[31m-                    ngx.say("upstream ", u, ":")[m
[31m-                    local srvs, err = get_servers(u)[m
[31m-                    if not srvs then[m
[31m-                        ngx.say("failed to get servers in upstream ", u)[m
[31m-                    else[m
[31m-                        for _, srv in ipairs(srvs) do[m
[31m-                            local first = true[m
[31m-                            for k, v in pairs(srv) do[m
[31m-                                if first then[m
[31m-                                    first = false[m
[31m-                                    ngx.print("    ")[m
[31m-                                else[m
[31m-                                    ngx.print(", ")[m
[31m-                                end[m
[31m-                                if type(v) == "table" then[m
[31m-                                    ngx.print(k, " = {", concat(v, ", "), "}")[m
[31m-                                else[m
[31m-                                    ngx.print(k, " = ", v)[m
[31m-                                end[m
[31m-                            end[m
[31m-                            ngx.print("\\n")[m
[31m-                        end[m
[31m-                    end[m
[31m-                end[m
[31m-        ';[m
[31m-    }[m
[31m---- request[m
[31m-    GET /t[m
[31m---- response_body[m
[31m-upstream 127.0.0.1:1190:[m
[31m-    addr = 127.0.0.1:1190, weight = 0, fail_timeout = 0, max_fails = 0[m
[31m-upstream 127.0.0.2:1110:[m
[31m-    addr = 127.0.0.2:1110, weight = 0, fail_timeout = 0, max_fails = 0[m
[31m-upstream 127.0.0.1:1130:[m
[31m-    addr = 127.0.0.1:1130, weight = 0, fail_timeout = 0, max_fails = 0[m
[31m-[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/util/build.sh b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/util/build.sh[m
[1mdeleted file mode 100755[m
[1mindex f0f1e82..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/util/build.sh[m
[1m+++ /dev/null[m
[36m@@ -1,46 +0,0 @@[m
[31m-#!/bin/bash[m
[31m-[m
[31m-# this file is mostly meant to be used by the author himself.[m
[31m-[m
[31m-root=`pwd`[m
[31m-version=$1[m
[31m-home=~[m
[31m-force=$2[m
[31m-[m
[31m-ngx_redis_version=0.3.7[m
[31m-ngx_redis_path=$home/work/nginx/ngx_http_redis-$ngx_redis_version[m
[31m-[m
[31m-cd $ngx_redis_path || exit 1[m
[31m-patch --forward -p1 < $root/../ngx_openresty/patches/ngx_http_redis-$ngx_redis_version-variables_in_redis_pass.patch[m
[31m-cd $root || exit 1[m
[31m-[m
[31m-            #--without-http_memcached_module \[m
[31m-ngx-build $force $version \[m
[31m-            --with-cc-opt="-O0" \[m
[31m-            --with-ld-opt="-Wl,-rpath,/opt/postgres/lib:/opt/drizzle/lib:/usr/local/lib" \[m
[31m-            --without-mail_pop3_module \[m
[31m-            --without-mail_imap_module \[m
[31m-            --without-mail_smtp_module \[m
[31m-            --without-http_upstream_ip_hash_module \[m
[31m-            --without-http_empty_gif_module \[m
[31m-            --without-http_referer_module \[m
[31m-            --without-http_autoindex_module \[m
[31m-            --without-http_auth_basic_module \[m
[31m-            --without-http_userid_module \[m
[31m-            --add-module=$root/../ndk-nginx-module \[m
[31m-            --add-module=$root/../set-misc-nginx-module \[m
[31m-          --add-module=$ngx_redis_path \[m
[31m-          --add-module=$root/../echo-nginx-module \[m
[31m-          --add-module=$root $opts \[m
[31m-          --add-module=$root/../lua-nginx-module \[m
[31m-            --add-module=$home/work/nginx/ngx_http_upstream_keepalive-0.7 \[m
[31m-          --with-select_module \[m
[31m-          --with-poll_module \[m
[31m-          --with-debug[m
[31m-          #--add-module=/home/agentz/git/dodo/utils/dodo-hook \[m
[31m-          #--add-module=$home/work/ngx_http_auth_request-0.1 #\[m
[31m-          #--with-rtsig_module[m
[31m-          #--with-cc-opt="-g3 -O0"[m
[31m-          #--add-module=$root/../echo-nginx-module \[m
[31m-  #--without-http_ssi_module  # we cannot disable ssi because echo_location_async depends on it (i dunno why?!)[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex 5b1a07d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_lua_upstream-0.05/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,132 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr1[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Addr1[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_snprintf[m
[31m-   fun:ngx_sock_ntop[m
[31m-   fun:ngx_event_accept[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_lua_ndk_set_var_get[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_conf_parse[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   exp-sgcheck:SorG[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:memcpy[m
[31m-   fun:ngx_vslprintf[m
[31m-   fun:ngx_log_error_core[m
[31m-   fun:ngx_http_charset_header_filter[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   socketcall.setsockopt(optval)[m
[31m-   fun:setsockopt[m
[31m-   fun:drizzle_state_connect[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:ngx_conf_flush_files[m
[31m-   fun:ngx_single_process_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   sendmsg(msg.msg_iov[0])[m
[31m-   fun:__sendmsg_nocancel[m
[31m-   fun:ngx_write_channel[m
[31m-   fun:ngx_pass_open_channel[m
[31m-   fun:ngx_start_cache_manager_processes[m
[31m-}[m
[31m-{[m
[31m-    <insert_a_suppression_name_here>[m
[31m-    Memcheck:Cond[m
[31m-    fun:ngx_init_cycle[m
[31m-    fun:ngx_master_process_cycle[m
[31m-    fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/.gitignore b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/.gitignore[m
[1mdeleted file mode 100644[m
[1mindex 5001bac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/.gitignore[m
[1m+++ /dev/null[m
[36m@@ -1,35 +0,0 @@[m
[31m-.svn[m
[31m-t/servroot/[m
[31m-*~[m
[31m-*.swp[m
[31m-src/ddebug.h[m
[31m-src/handler.c[m
[31m-src/handler.h[m
[31m-src/keepalive.c[m
[31m-src/keepalive.h[m
[31m-src/module.c[m
[31m-src/module.h[m
[31m-src/output.h[m
[31m-src/processor.c[m
[31m-src/processor.h[m
[31m-src/upstream.c[m
[31m-src/upstream.h[m
[31m-src/util.c[m
[31m-src/util.h[m
[31m-reindex[m
[31m-src/escape.c[m
[31m-src/escape.h[m
[31m-src/output.c[m
[31m-src/rewrite.c[m
[31m-src/rewrite.h[m
[31m-src/variable.c[m
[31m-src/variable.h[m
[31m-build[m
[31m-build[789][m
[31m-build10[m
[31m-go[m
[31m-genmobi.sh[m
[31m-tags[m
[31m-*.mobi[m
[31m-all[m
[31m-releng[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/CHANGES b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/CHANGES[m
[1mdeleted file mode 100644[m
[1mindex 18e6ea8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/CHANGES[m
[1m+++ /dev/null[m
[36m@@ -1,155 +0,0 @@[m
[31m-2011-12-27    VERSION 0.9[m
[31m-    * Improve debug logging.[m
[31m-      From Yichun Zhang (agentzh).[m
[31m-[m
[31m-2011-12-23[m
[31m-    * Fix compatibility with poll, select and /dev/poll event models.[m
[31m-      Reported by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2011-11-10[m
[31m-    * Fix compatibility with PostgreSQL 9.x.[m
[31m-      Reported by Yichun Zhang (agentzh).[m
[31m-[m
[31m-    * Fix compatibility with nginx-1.1.4+.[m
[31m-      From Yichun Zhang (agentzh).[m
[31m-[m
[31m-2011-06-21[m
[31m-    * Enforce writing of proper SQL queries by replacing "row <row>"[m
[31m-      output format with "text" and returning whole result-set with[m
[31m-      values separated by newlines when using "postgres_output"[m
[31m-      directive.[m
[31m-[m
[31m-    * Enforce writing of proper SQL queries by requiring result-set[m
[31m-      to contain exactly single value when using "binary_value" or[m
[31m-      "value" output formats when using "postgres_output" directive.[m
[31m-[m
[31m-2011-06-17[m
[31m-    * Fix "duplicated last chunk" issue.[m
[31m-      Reported by Silly Sad, diagnosed by Maxim Dounin.[m
[31m-[m
[31m-    * Improve build-time PostgreSQL client library discovery process[m
[31m-      by using PostgreSQL's pg_config.[m
[31m-      Patch from Silly Sad.[m
[31m-[m
[31m-2010-12-23    VERSION 0.8[m
[31m-    * Add option to return content in binary format using[m
[31m-      "binary_value" output format in "postgres_output" directive.[m
[31m-      Mostly done by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-11-01[m
[31m-    * Support "postgres_pass", "postgres_query", "postgres_rewrite"[m
[31m-      and "postgres_output" directives in "if" pseudo-locations.[m
[31m-      From Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-10-02[m
[31m-    * Major rewrite of "postgres_escape" directive.[m
[31m-[m
[31m-2010-09-30    VERSION 0.7[m
[31m-    * Add option to send original response body with error responses[m
[31m-      set by "postgres_rewrite" directive.[m
[31m-[m
[31m-2010-08-25[m
[31m-    * Fix error that could lead to failed connection to the database.[m
[31m-[m
[31m-    * Log more details on failed connection to the database.[m
[31m-[m
[31m-2010-08-15    VERSION 0.6[m
[31m-    * Fix linking issue that manifested itself when nginx was build[m
[31m-      with both: ngx_postgres and ngx_supervisord modules.[m
[31m-      Reported by Sergey A. Osokin.[m
[31m-[m
[31m-2010-08-09[m
[31m-    * Fix pointer signedness mismatch, which broke build on Darwin[m
[31m-      and probably few other operating systems.[m
[31m-      Reported by sahuguet, fixed by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-08-03    VERSION 0.5[m
[31m-    * Fix compatibility with nginx-0.8.47+.[m
[31m-[m
[31m-2010-07-20[m
[31m-    * Add "postgres_escape" directive.[m
[31m-[m
[31m-2010-07-05    VERSION 0.4[m
[31m-    * Optimize generation of RDS output.[m
[31m-[m
[31m-2010-07-02[m
[31m-    * Fix serious bug that under certain conditions (query evaluated[m
[31m-      to empty string, failed connection to the database, etc) would[m
[31m-      lead to segmentation fault on versions older than nginx-0.8.17[m
[31m-      (including nginx-0.7.x).[m
[31m-[m
[31m-2010-06-30[m
[31m-    * When returning row or value, use Content-Type specified by[m
[31m-      "default_type" directive instead of "text/plain".[m
[31m-[m
[31m-    * Allow column to be specified by its name instead of its number[m
[31m-      (in "postgres_output" and "postgres_set" directives).[m
[31m-[m
[31m-2010-06-23[m
[31m-    * Add "postgres_rewrite" directive.[m
[31m-[m
[31m-    * Add "$postgres_affected" variable.[m
[31m-[m
[31m-2010-06-22[m
[31m-    * Fix issue that would stop gzip filter from processing[m
[31m-      responses in RDS format.[m
[31m-      Found by Qing Lin (kindy), fixed by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-06-21[m
[31m-    * Add "postgres_output" directive.[m
[31m-[m
[31m-2010-06-18[m
[31m-    * Add "$postgres_query" variable.[m
[31m-[m
[31m-2010-06-16[m
[31m-    * Add "postgres_set" directive.[m
[31m-[m
[31m-    * Add "$postgres_columns" and "$postgres_rows" variables.[m
[31m-[m
[31m-2010-06-13    VERSION 0.3[m
[31m-    * Allow configuration of method-specific queries.[m
[31m-[m
[31m-    * Restrict "postgres_pass" directive to "location" context.[m
[31m-[m
[31m-2010-06-07[m
[31m-    * Free keepalive connections on nginx shutdown.[m
[31m-      Requested by Yichun Zhang (agentzh).[m
[31m-[m
[31m-    * Fix memory leak that was happening when nginx was configured[m
[31m-      to use non-existing database tables, etc.[m
[31m-      Found by Valgrind, reported by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-06-04[m
[31m-    * Use recently standardized error codes in RDS format.[m
[31m-[m
[31m-2010-06-03[m
[31m-    * Allow request methods other than GET and HEAD.[m
[31m-      From Yichun Zhang (agentzh) via ngx_drizzle.[m
[31m-[m
[31m-2010-05-12    VERSION 0.2[m
[31m-    * Add various improvements to build and testing infrastructures.[m
[31m-      Mostly done by Yichun Zhang (agentzh).[m
[31m-[m
[31m-    * Put more restrictions on "postgres_pass" and "postgres_query"[m
[31m-      directives. Handle their bad configuration properly.[m
[31m-[m
[31m-2010-05-10[m
[31m-    * Log PostgreSQL errors into error.log.[m
[31m-      Reminded by Yichun Zhang (agentzh).[m
[31m-[m
[31m-2010-05-06[m
[31m-    * Remove connection timeout from re-used keepalive connection.[m
[31m-[m
[31m-    * Fix libpq headers detection on Debian.[m
[31m-      Patch from Weibin Yao.[m
[31m-[m
[31m-    * Add "postgres_get_value" directive.[m
[31m-      Requested by Johan Bergstroem.[m
[31m-[m
[31m-    * Bring back fail-safe check that got lost during pre-release[m
[31m-      refactorization. Without this check performance was reduced[m
[31m-      few times under high load, because about 1% of keepalive[m
[31m-      connections got disconnected.[m
[31m-[m
[31m-2010-05-05    VERSION 0.1[m
[31m-    * Initial release.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/LICENSE b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/LICENSE[m
[1mdeleted file mode 100644[m
[1mindex 98c3bcf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/LICENSE[m
[1m+++ /dev/null[m
[36m@@ -1,25 +0,0 @@[m
[31m-Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m-Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m-Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-1. Redistributions of source code must retain the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer.[m
[31m-2. Redistributions in binary form must reproduce the above copyright[m
[31m-   notice, this list of conditions and the following disclaimer in the[m
[31m-   documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/config b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/config[m
[1mdeleted file mode 100644[m
[1mindex 4b4caa4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/config[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-ngx_feature_name=[m
[31m-ngx_feature_run=no[m
[31m-ngx_feature_incs="#include <libpq-fe.h>"[m
[31m-ngx_feature_test="(void) PQconndefaults();"[m
[31m-[m
[31m-if [ -n "$LIBPQ_INC" -o -n "$LIBPQ_LIB" ]; then[m
[31m-    # specified by LIBPQ_INC and LIBPQ_LIB[m
[31m-    ngx_feature="libpq library in directories specified by LIBPQ_INC ($LIBPQ_INC) and LIBPQ_LIB ($LIBPQ_LIB)"[m
[31m-    ngx_feature_path="$LIBPQ_INC"[m
[31m-    if [ $NGX_RPATH = YES ]; then[m
[31m-        ngx_feature_libs="-R$LIBPQ_LIB -L$LIBPQ_LIB -lpq"[m
[31m-    else[m
[31m-        ngx_feature_libs="-L$LIBPQ_LIB -lpq"[m
[31m-    fi[m
[31m-    . auto/feature[m
[31m-else[m
[31m-    if [ -z "$PG_CONFIG" ]; then[m
[31m-        PG_CONFIG=pg_config[m
[31m-    fi[m
[31m-[m
[31m-    if type $PG_CONFIG >/dev/null 2>&1; then[m
[31m-        # based on information from pg_config[m
[31m-        ngx_feature="libpq library (via $PG_CONFIG)"[m
[31m-        ngx_feature_path="`$PG_CONFIG --includedir`"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R`$PG_CONFIG --libdir` -L`$PG_CONFIG --libdir` -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L`$PG_CONFIG --libdir` -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    # auto-discovery[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # system-wide[m
[31m-        ngx_feature="libpq library"[m
[31m-        ngx_feature_path=[m
[31m-        ngx_feature_libs="-lpq"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # Debian[m
[31m-        ngx_feature="libpq library in /usr/../postgresql/"[m
[31m-        ngx_feature_path="/usr/include/postgresql"[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # FreeBSD[m
[31m-        ngx_feature="libpq library in /usr/local/"[m
[31m-        ngx_feature_path="/usr/local/include"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/local/lib -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # OpenBSD[m
[31m-        ngx_feature="libpq library in /usr/local/../postgresql/"[m
[31m-        ngx_feature_path="/usr/local/include/postgresql"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/local/lib -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # NetBSD[m
[31m-        ngx_feature="libpq library in /usr/pkg/"[m
[31m-        ngx_feature_path="/usr/pkg/include"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/usr/pkg/lib -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-[m
[31m-    if [ $ngx_found = no ]; then[m
[31m-        # MacPorts[m
[31m-        ngx_feature="libpq library in /opt/local/"[m
[31m-        ngx_feature_path="/opt/local/include"[m
[31m-        if [ $NGX_RPATH = YES ]; then[m
[31m-            ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lpq"[m
[31m-        else[m
[31m-            ngx_feature_libs="-L/opt/local/lib -lpq"[m
[31m-        fi[m
[31m-        . auto/feature[m
[31m-    fi[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-   cat << END[m
[31m- $0: error: ngx_postgres addon was unable to find the libpq library.[m
[31m-END[m
[31m-   exit 1[m
[31m-fi[m
[31m-[m
[31m-ngx_version=`grep nginx_version src/core/nginx.h | sed -e 's/^.* \(.*\)$/\1/'`[m
[31m-[m
[31m-if [ -z "$ngx_version" ]; then[m
[31m-   cat << END[m
[31m- $0: error: ngx_postgres addon was unable to detect version of nginx.[m
[31m-END[m
[31m-   exit 1[m
[31m-fi[m
[31m-[m
[31m-# work-around for versions of nginx older than nginx-0.9.0[m
[31m-if [ $ngx_version -ge 9000 ]; then[m
[31m-    ngx_feature_name="NGX_POSTGRES_LIBRARY_VERSION"[m
[31m-    ngx_feature_run=value[m
[31m-else[m
[31m-    ngx_feature_name="NGX_POSTGRES_LIBRARY_VERSION_DETECTED"[m
[31m-    ngx_feature_run=no[m
[31m-fi[m
[31m-[m
[31m-lib_version=90100[m
[31m-ngx_feature="libpq library version 9.1"[m
[31m-ngx_feature_test="printf(\"%d\", PQlibVersion())"[m
[31m-. auto/feature[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=90000[m
[31m-    ngx_feature="libpq library version 9.0"[m
[31m-    ngx_feature_test="(void) PQescapeLiteral(NULL, NULL, 0);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80400[m
[31m-    ngx_feature="libpq library version 8.4"[m
[31m-    ngx_feature_test="PQinitOpenSSL(0, 0);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80300[m
[31m-    ngx_feature="libpq library version 8.3"[m
[31m-    ngx_feature_test="(void) PQconnectionNeedsPassword(NULL);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80200[m
[31m-    ngx_feature="libpq library version 8.2"[m
[31m-    ngx_feature_test="(void) PQsendDescribePortal(NULL, NULL);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80104[m
[31m-    ngx_feature="libpq library version 8.1.4"[m
[31m-    ngx_feature_test="(void) PQescapeByteaConn(NULL, NULL, 0, 0);[m
[31m-                      (void) PQregisterThreadLock(NULL);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80100[m
[31m-    ngx_feature="libpq library version 8.1.0"[m
[31m-    ngx_feature_test="(void) PQregisterThreadLock(NULL);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80008[m
[31m-    ngx_feature="libpq library version 8.0.8"[m
[31m-    ngx_feature_test="(void) PQescapeByteaConn(NULL, NULL, 0, 0);[m
[31m-                      (void) PQcancel(NULL, NULL, 0);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-    lib_version=80000[m
[31m-    ngx_feature="libpq library version 8.0.0"[m
[31m-    ngx_feature_test="(void) PQcancel(NULL, NULL, 0);[m
[31m-                      printf(\"$lib_version\")"[m
[31m-    . auto/feature[m
[31m-fi[m
[31m-[m
[31m-if [ $ngx_found = no ]; then[m
[31m-   cat << END[m
[31m- $0: error: ngx_postgres addon was unable to detect version of the libpq library.[m
[31m-END[m
[31m-   exit 1[m
[31m-fi[m
[31m-[m
[31m-# work-around for versions of nginx older than nginx-0.9.0[m
[31m-if [ $ngx_version -lt 9000 ]; then[m
[31m-    have=NGX_POSTGRES_LIBRARY_VERSION value=$lib_version . auto/define[m
[31m-fi[m
[31m-[m
[31m-ngx_addon_name=ngx_postgres[m
[31m-[m
[31m-HTTP_MODULES="$HTTP_MODULES ngx_postgres_module"[m
[31m-[m
[31m-CORE_INCS="$CORE_INCS $ngx_feature_path"[m
[31m-CORE_LIBS="$CORE_LIBS $ngx_feature_libs"[m
[31m-[m
[31m-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_postgres_escape.c $ngx_addon_dir/src/ngx_postgres_handler.c $ngx_addon_dir/src/ngx_postgres_keepalive.c $ngx_addon_dir/src/ngx_postgres_module.c $ngx_addon_dir/src/ngx_postgres_output.c $ngx_addon_dir/src/ngx_postgres_processor.c $ngx_addon_dir/src/ngx_postgres_rewrite.c $ngx_addon_dir/src/ngx_postgres_upstream.c $ngx_addon_dir/src/ngx_postgres_util.c $ngx_addon_dir/src/ngx_postgres_variable.c"[m
[31m-NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ngx_postgres_escape.h $ngx_addon_dir/src/ngx_postgres_handler.h $ngx_addon_dir/src/ngx_postgres_keepalive.h $ngx_addon_dir/src/ngx_postgres_module.h $ngx_addon_dir/src/ngx_postgres_output.h $ngx_addon_dir/src/ngx_postgres_processor.h $ngx_addon_dir/src/ngx_postgres_rewrite.h $ngx_addon_dir/src/ngx_postgres_upstream.h $ngx_addon_dir/src/ngx_postgres_util.h $ngx_addon_dir/src/ngx_postgres_variable.h $ngx_addon_dir/src/ngx_postgres_ddebug.h $ngx_addon_dir/src/resty_dbd_stream.h"[m
[31m-[m
[31m-have=NGX_POSTGRES_MODULE . auto/have[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_ddebug.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_ddebug.h[m
[1mdeleted file mode 100644[m
[1mindex 38253fc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_ddebug.h[m
[1m+++ /dev/null[m
[36m@@ -1,77 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_DDEBUG_H_[m
[31m-#define _NGX_POSTGRES_DDEBUG_H_[m
[31m-[m
[31m-#include <ngx_config.h>[m
[31m-#include <ngx_core.h>[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...) fprintf(stderr, "postgres *** %s: ", __func__); \[m
[31m-            fprintf(stderr, __VA_ARGS__); \[m
[31m-            fprintf(stderr, " *** %s line %d.\n", __FILE__, __LINE__)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-#include <stdio.h>[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void[m
[31m-dd(const char * fmt, ...)[m
[31m-{[m
[31m-    /* TODO */[m
[31m-}[m
[31m-[m
[31m-#    endif[m
[31m-[m
[31m-#else[m
[31m-[m
[31m-#   if (NGX_HAVE_VARIADIC_MACROS)[m
[31m-[m
[31m-#       define dd(...)[m
[31m-[m
[31m-#   else[m
[31m-[m
[31m-#include <stdarg.h>[m
[31m-[m
[31m-static void[m
[31m-dd(const char * fmt, ...)[m
[31m-{[m
[31m-}[m
[31m-[m
[31m-#   endif[m
[31m-[m
[31m-#endif[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_DDEBUG_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_escape.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_escape.c[m
[1mdeleted file mode 100644[m
[1mindex dd78194..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_escape.c[m
[1m+++ /dev/null[m
[36m@@ -1,97 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_escape.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-[m
[31m-uintptr_t ngx_postgres_script_exit_code = (uintptr_t) NULL;[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_escape_string(ngx_http_script_engine_t *e)[m
[31m-{[m
[31m-    ngx_postgres_escape_t      *pge;[m
[31m-    ngx_http_variable_value_t  *v;[m
[31m-    u_char                     *p, *s;[m
[31m-[m
[31m-    v = e->sp - 1;[m
[31m-[m
[31m-    dd("entering: \"%.*s\"", (int) v->len, v->data);[m
[31m-[m
[31m-    pge = (ngx_postgres_escape_t *) e->ip;[m
[31m-    e->ip += sizeof(ngx_postgres_escape_t);[m
[31m-[m
[31m-    if ((v == NULL) || (v->not_found)) {[m
[31m-        v->data = (u_char *) "NULL";[m
[31m-        v->len = sizeof("NULL") - 1;[m
[31m-        dd("returning (NULL)");[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    if (v->len == 0) {[m
[31m-        if (pge->empty) {[m
[31m-            v->data = (u_char *) "''";[m
[31m-            v->len = 2;[m
[31m-            dd("returning (empty/empty)");[m
[31m-            goto done;[m
[31m-        } else {[m
[31m-            v->data = (u_char *) "NULL";[m
[31m-            v->len = sizeof("NULL") - 1;[m
[31m-            dd("returning (empty/NULL)");[m
[31m-            goto done;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    s = p = ngx_pnalloc(e->request->pool, 2 * v->len + 2);[m
[31m-    if (p == NULL) {[m
[31m-        e->ip = (u_char *) &ngx_postgres_script_exit_code;[m
[31m-        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        dd("returning (NGX_HTTP_INTERNAL_SERVER_ERROR)");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    *p++ = '\'';[m
[31m-    v->len = PQescapeString((char *) p, (const char *) v->data, v->len);[m
[31m-    p[v->len] = '\'';[m
[31m-    v->len += 2;[m
[31m-    v->data = s;[m
[31m-[m
[31m-    dd("returning");[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_escape.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_escape.h[m
[1mdeleted file mode 100644[m
[1mindex 4312de6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_escape.h[m
[1m+++ /dev/null[m
[36m@@ -1,36 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_ESCAPE_H_[m
[31m-#define _NGX_POSTGRES_ESCAPE_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-void       ngx_postgres_escape_string(ngx_http_script_engine_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_ESCAPE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_handler.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_handler.c[m
[1mdeleted file mode 100644[m
[1mindex cf8c1bb..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_handler.c[m
[1m+++ /dev/null[m
[36m@@ -1,410 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_handler.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_output.h"[m
[31m-#include "ngx_postgres_processor.h"[m
[31m-#include "ngx_postgres_util.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_handler(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t   *pglcf;[m
[31m-    ngx_postgres_ctx_t        *pgctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_http_upstream_t       *u;[m
[31m-    ngx_connection_t          *c;[m
[31m-    ngx_str_t                  host;[m
[31m-    ngx_url_t                  url;[m
[31m-    ngx_int_t                  rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (r->subrequest_in_memory) {[m
[31m-        /* TODO: add support for subrequest in memory by[m
[31m-         * emitting output into u->buffer instead */[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: ngx_postgres module does not support"[m
[31m-                      " subrequests in memory");[m
[31m-[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pglcf->query.def == NULL) && !(pglcf->query.methods_set & r->method)) {[m
[31m-        if (pglcf->query.methods_set != 0) {[m
[31m-            dd("returning NGX_HTTP_NOT_ALLOWED");[m
[31m-            return NGX_HTTP_NOT_ALLOWED;[m
[31m-        }[m
[31m-[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: missing \"postgres_query\" in location \"%V\"",[m
[31m-                      &clcf->name);[m
[31m-[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_discard_request_body(r);[m
[31m-    if (rc != NGX_OK) {[m
[31m-        dd("returning rc:%d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) \[m
[31m-    && (((nginx_version >= 7063) && (nginx_version < 8000)) \[m
[31m-        || (nginx_version >= 8007))[m
[31m-[m
[31m-    if (ngx_http_upstream_create(r) != NGX_OK) {[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-#else /* 0.7.x < 0.7.63, 0.8.x < 0.8.7 */[m
[31m-[m
[31m-    u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));[m
[31m-    if (u == NULL) {[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    u->peer.log = r->connection->log;[m
[31m-    u->peer.log_error = NGX_ERROR_ERR;[m
[31m-#  if (NGX_THREADS)[m
[31m-    u->peer.lock = &r->connection->lock;[m
[31m-#  endif[m
[31m-    r->upstream = u;[m
[31m-#endif[m
[31m-[m
[31m-    if (pglcf->upstream_cv) {[m
[31m-        /* use complex value */[m
[31m-        if (ngx_http_complex_value(r, pglcf->upstream_cv, &host) != NGX_OK) {[m
[31m-            dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        if (host.len == 0) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: empty \"postgres_pass\" (was: \"%V\")"[m
[31m-                          " in location \"%V\"", &pglcf->upstream_cv->value,[m
[31m-                          &clcf->name);[m
[31m-[m
[31m-            dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-        url.host = host;[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        pglcf->upstream.upstream = ngx_postgres_find_upstream(r, &url);[m
[31m-        if (pglcf->upstream.upstream == NULL) {[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: upstream name \"%V\" not found", &host);[m
[31m-[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgctx = ngx_pcalloc(r->pool, sizeof(ngx_postgres_ctx_t));[m
[31m-    if (pgctx == NULL) {[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     pgctx->response = NULL[m
[31m-     *     pgctx->var_query = { 0, NULL }[m
[31m-     *     pgctx->variables = NULL[m
[31m-     *     pgctx->status = 0[m
[31m-     */[m
[31m-[m
[31m-    pgctx->var_cols = NGX_ERROR;[m
[31m-    pgctx->var_rows = NGX_ERROR;[m
[31m-    pgctx->var_affected = NGX_ERROR;[m
[31m-[m
[31m-    if (pglcf->variables != NULL) {[m
[31m-        pgctx->variables = ngx_array_create(r->pool, pglcf->variables->nelts,[m
[31m-                                            sizeof(ngx_str_t));[m
[31m-        if (pgctx->variables == NULL) {[m
[31m-            dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-            return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        /* fake ngx_array_push'ing */[m
[31m-        pgctx->variables->nelts = pglcf->variables->nelts;[m
[31m-[m
[31m-        ngx_memzero(pgctx->variables->elts,[m
[31m-                    pgctx->variables->nelts * pgctx->variables->size);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_set_ctx(r, pgctx, ngx_postgres_module);[m
[31m-[m
[31m-    u->schema.len = sizeof("postgres://") - 1;[m
[31m-    u->schema.data = (u_char *) "postgres://";[m
[31m-[m
[31m-    u->output.tag = (ngx_buf_tag_t) &ngx_postgres_module;[m
[31m-[m
[31m-    u->conf = &pglcf->upstream;[m
[31m-[m
[31m-    u->create_request = ngx_postgres_create_request;[m
[31m-    u->reinit_request = ngx_postgres_reinit_request;[m
[31m-    u->process_header = ngx_postgres_process_header;[m
[31m-    u->abort_request = ngx_postgres_abort_request;[m
[31m-    u->finalize_request = ngx_postgres_finalize_request;[m
[31m-[m
[31m-    /* we bypass the upstream input filter mechanism in[m
[31m-     * ngx_http_upstream_process_headers */[m
[31m-[m
[31m-    u->input_filter_init = ngx_postgres_input_filter_init;[m
[31m-    u->input_filter = ngx_postgres_input_filter;[m
[31m-    u->input_filter_ctx = NULL;[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8011)[m
[31m-    r->main->count++;[m
[31m-#endif[m
[31m-[m
[31m-    ngx_http_upstream_init(r);[m
[31m-[m
[31m-    /* override the read/write event handler to our own */[m
[31m-    u->write_event_handler = ngx_postgres_wev_handler;[m
[31m-    u->read_event_handler = ngx_postgres_rev_handler;[m
[31m-[m
[31m-    /* a bit hack-ish way to return error response (clean-up part) */[m
[31m-    if ((u->peer.connection) && (u->peer.connection->fd == 0)) {[m
[31m-        c = u->peer.connection;[m
[31m-        u->peer.connection = NULL;[m
[31m-[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        if (c->pool) {[m
[31m-            ngx_destroy_pool(c->pool);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        ngx_postgres_upstream_finalize_request(r, u,[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-                                               NGX_HTTP_SERVICE_UNAVAILABLE);[m
[31m-#else[m
[31m-            pgctx->status ? pgctx->status : NGX_HTTP_INTERNAL_SERVER_ERROR);[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_wev_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *pgxc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    u->request_sent = 1;[m
[31m-[m
[31m-    pgxc = u->peer.connection;[m
[31m-[m
[31m-    if (pgxc->write->timedout) {[m
[31m-        dd("postgres connection write timeout");[m
[31m-[m
[31m-        ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_postgres_upstream_test_connect(pgxc) != NGX_OK) {[m
[31m-        dd("postgres connection is broken");[m
[31m-[m
[31m-        ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_postgres_process_events(r);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_rev_handler(ngx_http_request_t *r, ngx_http_upstream_t *u)[m
[31m-{[m
[31m-    ngx_connection_t  *pgxc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* just to ensure u->reinit_request always gets called for[m
[31m-     * upstream_next */[m
[31m-    u->request_sent = 1;[m
[31m-[m
[31m-    pgxc = u->peer.connection;[m
[31m-[m
[31m-    if (pgxc->read->timedout) {[m
[31m-        dd("postgres connection read timeout");[m
[31m-[m
[31m-        ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_postgres_upstream_test_connect(pgxc) != NGX_OK) {[m
[31m-        dd("postgres connection is broken");[m
[31m-[m
[31m-        ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    ngx_postgres_process_events(r);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_create_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    dd("entering");[m
[31m-[m
[31m-    r->upstream->request_bufs = NULL;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_reinit_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_http_upstream_t  *u;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    /* override the read/write event handler to our own */[m
[31m-    u->write_event_handler = ngx_postgres_wev_handler;[m
[31m-    u->read_event_handler = ngx_postgres_rev_handler;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_abort_request(ngx_http_request_t *r)[m
[31m-{[m
[31m-    dd("entering & returning (dummy function)");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_finalize_request(ngx_http_request_t *r, ngx_int_t rc)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (rc == NGX_OK) {[m
[31m-        pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-        ngx_postgres_output_chain(r, pgctx->response);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_process_header(ngx_http_request_t *r)[m
[31m-{[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "postgres: ngx_postgres_process_header should not"[m
[31m-                  " be called by the upstream");[m
[31m-[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_input_filter_init(void *data)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "postgres: ngx_postgres_input_filter_init should not"[m
[31m-                  " be called by the upstream");[m
[31m-[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_input_filter(void *data, ssize_t bytes)[m
[31m-{[m
[31m-    ngx_http_request_t  *r = data;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                  "postgres: ngx_postgres_input_filter should not"[m
[31m-                  " be called by the upstream");[m
[31m-[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_handler.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_handler.h[m
[1mdeleted file mode 100644[m
[1mindex 1b6715b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_handler.h[m
[1m+++ /dev/null[m
[36m@@ -1,49 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_HANDLER_H_[m
[31m-#define _NGX_POSTGRES_HANDLER_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_postgres_handler(ngx_http_request_t *);[m
[31m-void       ngx_postgres_wev_handler(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *);[m
[31m-void       ngx_postgres_rev_handler(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *);[m
[31m-ngx_int_t  ngx_postgres_create_request(ngx_http_request_t *);[m
[31m-ngx_int_t  ngx_postgres_reinit_request(ngx_http_request_t *);[m
[31m-void       ngx_postgres_abort_request(ngx_http_request_t *);[m
[31m-void       ngx_postgres_finalize_request(ngx_http_request_t *, ngx_int_t);[m
[31m-ngx_int_t  ngx_postgres_process_header(ngx_http_request_t *);[m
[31m-ngx_int_t  ngx_postgres_input_filter_init(void *);[m
[31m-ngx_int_t  ngx_postgres_input_filter(void *, ssize_t);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_HANDLER_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.c[m
[1mdeleted file mode 100644[m
[1mindex 6575338..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.c[m
[1m+++ /dev/null[m
[36m@@ -1,344 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * Copyright (C) 2008, Maxim Dounin[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_keepalive.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_keepalive_init(ngx_pool_t *pool,[m
[31m-    ngx_postgres_upstream_srv_conf_t *pgscf)[m
[31m-{[m
[31m-    ngx_postgres_keepalive_cache_t  *cached;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    cached = ngx_pcalloc(pool,[m
[31m-                 sizeof(ngx_postgres_keepalive_cache_t) * pgscf->max_cached);[m
[31m-    if (cached == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_queue_init(&pgscf->cache);[m
[31m-    ngx_queue_init(&pgscf->free);[m
[31m-[m
[31m-    for (i = 0; i < pgscf->max_cached; i++) {[m
[31m-        ngx_queue_insert_head(&pgscf->free, &cached[i].queue);[m
[31m-        cached[i].srv_conf = pgscf;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_keepalive_get_peer_single(ngx_peer_connection_t *pc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgp,[m
[31m-    ngx_postgres_upstream_srv_conf_t *pgscf)[m
[31m-{[m
[31m-    ngx_postgres_keepalive_cache_t  *item;[m
[31m-    ngx_queue_t                     *q;[m
[31m-    ngx_connection_t                *c;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (!ngx_queue_empty(&pgscf->cache)) {[m
[31m-        dd("non-empty queue");[m
[31m-[m
[31m-        q = ngx_queue_head(&pgscf->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        ngx_queue_insert_head(&pgscf->free, q);[m
[31m-[m
[31m-        c->idle = 0;[m
[31m-        c->log = pc->log;[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        c->pool->log = pc->log;[m
[31m-#endif[m
[31m-        c->read->log = pc->log;[m
[31m-        c->write->log = pc->log;[m
[31m-[m
[31m-        pgp->name.data = item->name.data;[m
[31m-        pgp->name.len = item->name.len;[m
[31m-[m
[31m-        pgp->sockaddr = item->sockaddr;[m
[31m-[m
[31m-        pgp->pgconn = item->pgconn;[m
[31m-[m
[31m-        pc->connection = c;[m
[31m-        pc->cached = 1;[m
[31m-[m
[31m-        pc->name = &pgp->name;[m
[31m-[m
[31m-        pc->sockaddr = &pgp->sockaddr;[m
[31m-        pc->socklen = item->socklen;[m
[31m-[m
[31m-        dd("returning NGX_DONE");[m
[31m-[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_keepalive_get_peer_multi(ngx_peer_connection_t *pc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgp,[m
[31m-    ngx_postgres_upstream_srv_conf_t *pgscf)[m
[31m-{[m
[31m-    ngx_postgres_keepalive_cache_t  *item;[m
[31m-    ngx_queue_t                     *q, *cache;[m
[31m-    ngx_connection_t                *c;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    cache = &pgscf->cache;[m
[31m-[m
[31m-    for (q = ngx_queue_head(cache);[m
[31m-         q != ngx_queue_sentinel(cache);[m
[31m-         q = ngx_queue_next(q))[m
[31m-    {[m
[31m-        item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t, queue);[m
[31m-        c = item->connection;[m
[31m-[m
[31m-        if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr,[m
[31m-                item->socklen, pc->socklen) == 0)[m
[31m-        {[m
[31m-            ngx_queue_remove(q);[m
[31m-            ngx_queue_insert_head(&pgscf->free, q);[m
[31m-[m
[31m-            c->idle = 0;[m
[31m-            c->log = pc->log;[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-            c->pool->log = pc->log;[m
[31m-#endif[m
[31m-            c->read->log = pc->log;[m
[31m-            c->write->log = pc->log;[m
[31m-[m
[31m-            pc->connection = c;[m
[31m-            pc->cached = 1;[m
[31m-[m
[31m-            /* we do not need to resume the peer name[m
[31m-             * because we already take the right value outside */[m
[31m-[m
[31m-            pgp->pgconn = item->pgconn;[m
[31m-[m
[31m-            dd("returning NGX_DONE");[m
[31m-            return NGX_DONE;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_keepalive_free_peer(ngx_peer_connection_t *pc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgp,[m
[31m-    ngx_postgres_upstream_srv_conf_t *pgscf, ngx_uint_t  state)[m
[31m-{[m
[31m-    ngx_postgres_keepalive_cache_t  *item;[m
[31m-    ngx_queue_t                     *q;[m
[31m-    ngx_connection_t                *c;[m
[31m-    ngx_http_upstream_t             *u;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "postgres: free keepalive peer");[m
[31m-[m
[31m-    if (state & NGX_PEER_FAILED) {[m
[31m-        pgp->failed = 1;[m
[31m-    }[m
[31m-[m
[31m-    u = pgp->upstream;[m
[31m-[m
[31m-    if ((!pgp->failed) && (pc->connection != NULL)[m
[31m-        && (u->headers_in.status_n == NGX_HTTP_OK))[m
[31m-    {[m
[31m-        c = pc->connection;[m
[31m-[m
[31m-        if (c->read->timer_set) {[m
[31m-            ngx_del_timer(c->read);[m
[31m-        }[m
[31m-[m
[31m-        if (c->write->timer_set) {[m
[31m-            ngx_del_timer(c->write);[m
[31m-        }[m
[31m-[m
[31m-        if (c->write->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {[m
[31m-            if (ngx_del_event(c->write, NGX_WRITE_EVENT, 0) != NGX_OK) {[m
[31m-                return;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        pc->connection = NULL;[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                       "postgres: free keepalive peer: saving connection %p",[m
[31m-                       c);[m
[31m-[m
[31m-        if (ngx_queue_empty(&pgscf->free)) {[m
[31m-            /* connection pool is already full */[m
[31m-[m
[31m-            q = ngx_queue_last(&pgscf->cache);[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t,[m
[31m-                                  queue);[m
[31m-[m
[31m-            ngx_postgres_upstream_free_connection(pc->log, item->connection,[m
[31m-                                                  item->pgconn, pgscf);[m
[31m-[m
[31m-        } else {[m
[31m-            q = ngx_queue_head(&pgscf->free);[m
[31m-            ngx_queue_remove(q);[m
[31m-[m
[31m-            item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t,[m
[31m-                                  queue);[m
[31m-        }[m
[31m-[m
[31m-        item->connection = c;[m
[31m-        ngx_queue_insert_head(&pgscf->cache, q);[m
[31m-[m
[31m-        c->write->handler = ngx_postgres_keepalive_dummy_handler;[m
[31m-        c->read->handler = ngx_postgres_keepalive_close_handler;[m
[31m-[m
[31m-        c->data = item;[m
[31m-        c->idle = 1;[m
[31m-        c->log = ngx_cycle->log;[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        c->pool->log = ngx_cycle->log;[m
[31m-#endif[m
[31m-        c->read->log = ngx_cycle->log;[m
[31m-        c->write->log = ngx_cycle->log;[m
[31m-[m
[31m-        item->socklen = pc->socklen;[m
[31m-        ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);[m
[31m-[m
[31m-        item->pgconn = pgp->pgconn;[m
[31m-[m
[31m-        item->name.data = pgp->name.data;[m
[31m-        item->name.len = pgp->name.len;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_keepalive_dummy_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    dd("entering & returning (dummy handler)");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_keepalive_close_handler(ngx_event_t *ev)[m
[31m-{[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf;[m
[31m-    ngx_postgres_keepalive_cache_t    *item;[m
[31m-    ngx_connection_t                  *c;[m
[31m-    PGresult                          *res;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    c = ev->data;[m
[31m-    item = c->data;[m
[31m-[m
[31m-    if (c->close) {[m
[31m-        goto close;[m
[31m-    }[m
[31m-[m
[31m-    if (PQconsumeInput(item->pgconn) && !PQisBusy(item->pgconn)) {[m
[31m-        res = PQgetResult(item->pgconn);[m
[31m-        if (res == NULL) {[m
[31m-            dd("returning");[m
[31m-            return;[m
[31m-        }[m
[31m-[m
[31m-        PQclear(res);[m
[31m-[m
[31m-        dd("received result on idle keepalive connection");[m
[31m-        ngx_log_error(NGX_LOG_ERR, c->log, 0,[m
[31m-                      "postgres: received result on idle keepalive connection");[m
[31m-    }[m
[31m-[m
[31m-close:[m
[31m-[m
[31m-    pgscf = item->srv_conf;[m
[31m-[m
[31m-    ngx_postgres_upstream_free_connection(ev->log, c, item->pgconn, pgscf);[m
[31m-[m
[31m-    ngx_queue_remove(&item->queue);[m
[31m-    ngx_queue_insert_head(&pgscf->free, &item->queue);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_keepalive_cleanup(void *data)[m
[31m-{[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf = data;[m
[31m-    ngx_postgres_keepalive_cache_t    *item;[m
[31m-    ngx_queue_t                       *q;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* ngx_queue_empty is broken when used on unitialized queue */[m
[31m-    if (pgscf->cache.prev == NULL) {[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    /* just to be on the safe-side */[m
[31m-    pgscf->max_cached = 0;[m
[31m-[m
[31m-    while (!ngx_queue_empty(&pgscf->cache)) {[m
[31m-        q = ngx_queue_head(&pgscf->cache);[m
[31m-        ngx_queue_remove(q);[m
[31m-[m
[31m-        item = ngx_queue_data(q, ngx_postgres_keepalive_cache_t,[m
[31m-                              queue);[m
[31m-[m
[31m-        dd("postgres: disconnecting %p", item->connection);[m
[31m-[m
[31m-        ngx_postgres_upstream_free_connection(item->connection->log,[m
[31m-                                              item->connection,[m
[31m-                                              item->pgconn, pgscf);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.h[m
[1mdeleted file mode 100644[m
[1mindex 31e024a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_keepalive.h[m
[1m+++ /dev/null[m
[36m@@ -1,65 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * Copyright (C) 2008, Maxim Dounin[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_KEEPALIVE_H_[m
[31m-#define _NGX_POSTGRES_KEEPALIVE_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_upstream.h"[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_queue_t                        queue;[m
[31m-    ngx_postgres_upstream_srv_conf_t  *srv_conf;[m
[31m-    ngx_connection_t                  *connection;[m
[31m-    PGconn                            *pgconn;[m
[31m-    struct sockaddr                    sockaddr;[m
[31m-    socklen_t                          socklen;[m
[31m-    ngx_str_t                          name;[m
[31m-} ngx_postgres_keepalive_cache_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_postgres_keepalive_init(ngx_pool_t *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *);[m
[31m-ngx_int_t   ngx_postgres_keepalive_get_peer_single(ngx_peer_connection_t *,[m
[31m-                ngx_postgres_upstream_peer_data_t *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *);[m
[31m-ngx_int_t   ngx_postgres_keepalive_get_peer_multi(ngx_peer_connection_t *,[m
[31m-                ngx_postgres_upstream_peer_data_t *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *);[m
[31m-void        ngx_postgres_keepalive_free_peer(ngx_peer_connection_t *,[m
[31m-                ngx_postgres_upstream_peer_data_t *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *, ngx_uint_t);[m
[31m-void        ngx_postgres_keepalive_dummy_handler(ngx_event_t *);[m
[31m-void        ngx_postgres_keepalive_close_handler(ngx_event_t *);[m
[31m-void        ngx_postgres_keepalive_cleanup(void *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_KEEPALIVE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_module.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_module.c[m
[1mdeleted file mode 100644[m
[1mindex 365de00..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_module.c[m
[1m+++ /dev/null[m
[36m@@ -1,1336 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_escape.h"[m
[31m-#include "ngx_postgres_handler.h"[m
[31m-#include "ngx_postgres_keepalive.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_output.h"[m
[31m-#include "ngx_postgres_upstream.h"[m
[31m-#include "ngx_postgres_util.h"[m
[31m-#include "ngx_postgres_variable.h"[m
[31m-#include "ngx_postgres_rewrite.h"[m
[31m-[m
[31m-[m
[31m-#define NGX_CONF_TAKE34  (NGX_CONF_TAKE3|NGX_CONF_TAKE4)[m
[31m-[m
[31m-[m
[31m-static ngx_command_t ngx_postgres_module_commands[] = {[m
[31m-[m
[31m-    { ngx_string("postgres_server"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_postgres_conf_server,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_keepalive"),[m
[31m-      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_postgres_conf_keepalive,[m
[31m-      NGX_HTTP_SRV_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_pass"),[m
[31m-      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_postgres_conf_pass,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_query"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|[m
[31m-          NGX_HTTP_LIF_CONF|NGX_CONF_1MORE,[m
[31m-      ngx_postgres_conf_query,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_rewrite"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|[m
[31m-          NGX_HTTP_LIF_CONF|NGX_CONF_2MORE,[m
[31m-      ngx_postgres_conf_rewrite,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_output"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|[m
[31m-          NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_postgres_conf_output,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_set"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE34,[m
[31m-      ngx_postgres_conf_set,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_escape"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,[m
[31m-      ngx_postgres_conf_escape,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      0,[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_connect_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_postgres_loc_conf_t, upstream.connect_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-    { ngx_string("postgres_result_timeout"),[m
[31m-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,[m
[31m-      ngx_conf_set_msec_slot,[m
[31m-      NGX_HTTP_LOC_CONF_OFFSET,[m
[31m-      offsetof(ngx_postgres_loc_conf_t, upstream.read_timeout),[m
[31m-      NULL },[m
[31m-[m
[31m-      ngx_null_command[m
[31m-};[m
[31m-[m
[31m-static ngx_http_variable_t ngx_postgres_module_variables[] = {[m
[31m-[m
[31m-    { ngx_string("postgres_columns"), NULL,[m
[31m-      ngx_postgres_variable_columns, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("postgres_rows"), NULL,[m
[31m-      ngx_postgres_variable_rows, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("postgres_affected"), NULL,[m
[31m-      ngx_postgres_variable_affected, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_string("postgres_query"), NULL,[m
[31m-      ngx_postgres_variable_query, 0,[m
[31m-      NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },[m
[31m-[m
[31m-    { ngx_null_string, NULL, NULL, 0, 0, 0 }[m
[31m-};[m
[31m-[m
[31m-static ngx_http_module_t ngx_postgres_module_ctx = {[m
[31m-    ngx_postgres_add_variables,             /* preconfiguration */[m
[31m-    NULL,                                   /* postconfiguration */[m
[31m-[m
[31m-    NULL,                                   /* create main configuration */[m
[31m-    NULL,                                   /* init main configuration */[m
[31m-[m
[31m-    ngx_postgres_create_upstream_srv_conf,  /* create server configuration */[m
[31m-    NULL,                                   /* merge server configuration */[m
[31m-[m
[31m-    ngx_postgres_create_loc_conf,           /* create location configuration */[m
[31m-    ngx_postgres_merge_loc_conf             /* merge location configuration */[m
[31m-};[m
[31m-[m
[31m-ngx_module_t ngx_postgres_module = {[m
[31m-    NGX_MODULE_V1,[m
[31m-    &ngx_postgres_module_ctx,      /* module context */[m
[31m-    ngx_postgres_module_commands,  /* module directives */[m
[31m-    NGX_HTTP_MODULE,               /* module type */[m
[31m-    NULL,                          /* init master */[m
[31m-    NULL,                          /* init module */[m
[31m-    NULL,                          /* init process */[m
[31m-    NULL,                          /* init thread */[m
[31m-    NULL,                          /* exit thread */[m
[31m-    NULL,                          /* exit process */[m
[31m-    NULL,                          /* exit master */[m
[31m-    NGX_MODULE_V1_PADDING[m
[31m-};[m
[31m-[m
[31m-ngx_conf_bitmask_t ngx_postgres_http_methods[] = {[m
[31m-   { ngx_string("GET"),       NGX_HTTP_GET },[m
[31m-   { ngx_string("HEAD"),      NGX_HTTP_HEAD },[m
[31m-   { ngx_string("POST"),      NGX_HTTP_POST },[m
[31m-   { ngx_string("PUT"),       NGX_HTTP_PUT },[m
[31m-   { ngx_string("DELETE"),    NGX_HTTP_DELETE },[m
[31m-   { ngx_string("MKCOL"),     NGX_HTTP_MKCOL },[m
[31m-   { ngx_string("COPY"),      NGX_HTTP_COPY },[m
[31m-   { ngx_string("MOVE"),      NGX_HTTP_MOVE },[m
[31m-   { ngx_string("OPTIONS"),   NGX_HTTP_OPTIONS },[m
[31m-   { ngx_string("PROPFIND"),  NGX_HTTP_PROPFIND },[m
[31m-   { ngx_string("PROPPATCH"), NGX_HTTP_PROPPATCH },[m
[31m-   { ngx_string("LOCK"),      NGX_HTTP_LOCK },[m
[31m-   { ngx_string("UNLOCK"),    NGX_HTTP_UNLOCK },[m
[31m-#if defined(nginx_version) && (nginx_version >= 8041)[m
[31m-   { ngx_string("PATCH"),     NGX_HTTP_PATCH },[m
[31m-#endif[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-ngx_conf_enum_t ngx_postgres_upstream_mode_options[] = {[m
[31m-    { ngx_string("multi"),  0 },[m
[31m-    { ngx_string("single"), 1 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-ngx_conf_enum_t ngx_postgres_upstream_overflow_options[] = {[m
[31m-    { ngx_string("ignore"), 0 },[m
[31m-    { ngx_string("reject"), 1 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-ngx_conf_enum_t ngx_postgres_requirement_options[] = {[m
[31m-    { ngx_string("optional"), 0 },[m
[31m-    { ngx_string("required"), 1 },[m
[31m-    { ngx_null_string, 0 }[m
[31m-};[m
[31m-[m
[31m-ngx_postgres_rewrite_enum_t ngx_postgres_rewrite_handlers[] = {[m
[31m-    { ngx_string("no_changes"), 0, ngx_postgres_rewrite_changes },[m
[31m-    { ngx_string("changes"),    1, ngx_postgres_rewrite_changes },[m
[31m-    { ngx_string("no_rows"),    2, ngx_postgres_rewrite_rows },[m
[31m-    { ngx_string("rows"),       3, ngx_postgres_rewrite_rows },[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-ngx_postgres_output_enum_t ngx_postgres_output_handlers[] = {[m
[31m-    { ngx_string("none"),         0, NULL },[m
[31m-    { ngx_string("rds"),          0, ngx_postgres_output_rds },[m
[31m-    { ngx_string("text") ,        0, ngx_postgres_output_text },[m
[31m-    { ngx_string("value"),        0, ngx_postgres_output_value },[m
[31m-    { ngx_string("binary_value"), 1, ngx_postgres_output_value },[m
[31m-    { ngx_null_string, 0, NULL }[m
[31m-};[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_add_variables(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_http_variable_t  *var, *v;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    for (v = ngx_postgres_module_variables; v->name.len; v++) {[m
[31m-        var = ngx_http_add_variable(cf, &v->name, v->flags);[m
[31m-        if (var == NULL) {[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        var->get_handler = v->get_handler;[m
[31m-        var->data = v->data;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-void *[m
[31m-ngx_postgres_create_upstream_srv_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_postgres_upstream_srv_conf_t  *conf;[m
[31m-    ngx_pool_cleanup_t                *cln;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_postgres_upstream_srv_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->peers = NULL[m
[31m-     *     conf->current = 0[m
[31m-     *     conf->servers = NULL[m
[31m-     *     conf->free = { NULL, NULL }[m
[31m-     *     conf->cache = { NULL, NULL }[m
[31m-     *     conf->active_conns = 0[m
[31m-     *     conf->reject = 0[m
[31m-     */[m
[31m-[m
[31m-    conf->pool = cf->pool;[m
[31m-[m
[31m-    /* enable keepalive (single) by default */[m
[31m-    conf->max_cached = 10;[m
[31m-    conf->single = 1;[m
[31m-[m
[31m-    cln = ngx_pool_cleanup_add(cf->pool, 0);[m
[31m-    cln->handler = ngx_postgres_keepalive_cleanup;[m
[31m-    cln->data = conf;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-void *[m
[31m-ngx_postgres_create_loc_conf(ngx_conf_t *cf)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t  *conf;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_postgres_loc_conf_t));[m
[31m-    if (conf == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * set by ngx_pcalloc():[m
[31m-     *[m
[31m-     *     conf->upstream.* = 0 / NULL[m
[31m-     *     conf->upstream_cv = NULL[m
[31m-     *     conf->query.methods_set = 0[m
[31m-     *     conf->query.methods = NULL[m
[31m-     *     conf->query.def = NULL[m
[31m-     *     conf->output_binary = 0[m
[31m-     */[m
[31m-[m
[31m-    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;[m
[31m-[m
[31m-    conf->rewrites = NGX_CONF_UNSET_PTR;[m
[31m-    conf->output_handler = NGX_CONF_UNSET_PTR;[m
[31m-    conf->variables = NGX_CONF_UNSET_PTR;[m
[31m-[m
[31m-    /* the hardcoded values */[m
[31m-    conf->upstream.cyclic_temp_file = 0;[m
[31m-    conf->upstream.buffering = 1;[m
[31m-    conf->upstream.ignore_client_abort = 1;[m
[31m-    conf->upstream.send_lowat = 0;[m
[31m-    conf->upstream.bufs.num = 0;[m
[31m-    conf->upstream.busy_buffers_size = 0;[m
[31m-    conf->upstream.max_temp_file_size = 0;[m
[31m-    conf->upstream.temp_file_write_size = 0;[m
[31m-    conf->upstream.intercept_errors = 1;[m
[31m-    conf->upstream.intercept_404 = 1;[m
[31m-    conf->upstream.pass_request_headers = 0;[m
[31m-    conf->upstream.pass_request_body = 0;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return conf;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t  *prev = parent;[m
[31m-    ngx_postgres_loc_conf_t  *conf = child;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,[m
[31m-                              prev->upstream.connect_timeout, 10000);[m
[31m-[m
[31m-    ngx_conf_merge_msec_value(conf->upstream.read_timeout,[m
[31m-                              prev->upstream.read_timeout, 30000);[m
[31m-[m
[31m-    if ((conf->upstream.upstream == NULL) && (conf->upstream_cv == NULL)) {[m
[31m-        conf->upstream.upstream = prev->upstream.upstream;[m
[31m-        conf->upstream_cv = prev->upstream_cv;[m
[31m-    }[m
[31m-[m
[31m-    if ((conf->query.def == NULL) && (conf->query.methods == NULL)) {[m
[31m-        conf->query.methods_set = prev->query.methods_set;[m
[31m-        conf->query.methods = prev->query.methods;[m
[31m-        conf->query.def = prev->query.def;[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->rewrites, prev->rewrites, NULL);[m
[31m-[m
[31m-    if (conf->output_handler == NGX_CONF_UNSET_PTR) {[m
[31m-        if (prev->output_handler == NGX_CONF_UNSET_PTR) {[m
[31m-            /* default */[m
[31m-            conf->output_handler = ngx_postgres_output_rds;[m
[31m-            conf->output_binary = 0;[m
[31m-        } else {[m
[31m-            /* merge */[m
[31m-            conf->output_handler = prev->output_handler;[m
[31m-            conf->output_binary = prev->output_binary;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    ngx_conf_merge_ptr_value(conf->variables, prev->variables, NULL);[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m- * Based on: ngx_http_upstream.c/ngx_http_upstream_server[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- */[m
[31m-char *[m
[31m-ngx_postgres_conf_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf = conf;[m
[31m-    ngx_postgres_upstream_server_t    *pgs;[m
[31m-    ngx_http_upstream_srv_conf_t      *uscf;[m
[31m-    ngx_url_t                          u;[m
[31m-    ngx_uint_t                         i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);[m
[31m-[m
[31m-    if (pgscf->servers == NULL) {[m
[31m-        pgscf->servers = ngx_array_create(cf->pool, 4,[m
[31m-                             sizeof(ngx_postgres_upstream_server_t));[m
[31m-        if (pgscf->servers == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        uscf->servers = pgscf->servers;[m
[31m-    }[m
[31m-[m
[31m-    pgs = ngx_array_push(pgscf->servers);[m
[31m-    if (pgs == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(pgs, sizeof(ngx_postgres_upstream_server_t));[m
[31m-[m
[31m-    /* parse the first name:port argument */[m
[31m-[m
[31m-    ngx_memzero(&u, sizeof(ngx_url_t));[m
[31m-[m
[31m-    u.url = value[1];[m
[31m-    u.default_port = 5432; /* PostgreSQL default */[m
[31m-[m
[31m-    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {[m
[31m-        if (u.err) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "postgres: %s in upstream \"%V\"",[m
[31m-                               u.err, &u.url);[m
[31m-        }[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgs->addrs = u.addrs;[m
[31m-    pgs->naddrs = u.naddrs;[m
[31m-    pgs->port = u.port;[m
[31m-[m
[31m-    /* parse various options */[m
[31m-    for (i = 2; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "dbname=", sizeof("dbname=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            pgs->dbname.len = value[i].len - (sizeof("dbname=") - 1);[m
[31m-            pgs->dbname.data = &value[i].data[sizeof("dbname=") - 1];[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "user=", sizeof("user=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            pgs->user.len = value[i].len - (sizeof("user=") - 1);[m
[31m-            pgs->user.data = &value[i].data[sizeof("user=") - 1];[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "password=", sizeof("password=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            pgs->password.len = value[i].len - (sizeof("password=") - 1);[m
[31m-            pgs->password.data = &value[i].data[sizeof("password=") - 1];[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid parameter \"%V\" in"[m
[31m-                           " \"postgres_server\"", &value[i]);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    uscf->peer.init_upstream = ngx_postgres_upstream_init;[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf = conf;[m
[31m-    ngx_conf_enum_t                   *e;[m
[31m-    ngx_uint_t                         i, j;[m
[31m-    ngx_int_t                          n;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (pgscf->max_cached != 10 /* default */) {[m
[31m-        dd("returning");[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if ((cf->args->nelts == 2) && (ngx_strcmp(value[1].data, "off") == 0)) {[m
[31m-        pgscf->max_cached = 0;[m
[31m-[m
[31m-        dd("returning NGX_CONF_OK");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    for (i = 1; i < cf->args->nelts; i++) {[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "max=", sizeof("max=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            value[i].len = value[i].len - (sizeof("max=") - 1);[m
[31m-            value[i].data = &value[i].data[sizeof("max=") - 1];[m
[31m-[m
[31m-            n = ngx_atoi(value[i].data, value[i].len);[m
[31m-            if (n == NGX_ERROR) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid \"max\" value \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            pgscf->max_cached = (ngx_uint_t) n;[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "mode=", sizeof("mode=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            value[i].len = value[i].len - (sizeof("mode=") - 1);[m
[31m-            value[i].data = &value[i].data[sizeof("mode=") - 1];[m
[31m-[m
[31m-            e = ngx_postgres_upstream_mode_options;[m
[31m-            for (j = 0; e[j].name.len; j++) {[m
[31m-                if ((e[j].name.len == value[i].len)[m
[31m-                    && (ngx_strcasecmp(e[j].name.data, value[i].data) == 0))[m
[31m-                {[m
[31m-                    pgscf->single = e[j].value;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (e[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid \"mode\" value \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_strncmp(value[i].data, "overflow=", sizeof("overflow=") - 1)[m
[31m-                == 0)[m
[31m-        {[m
[31m-            value[i].len = value[i].len - (sizeof("overflow=") - 1);[m
[31m-            value[i].data = &value[i].data[sizeof("overflow=") - 1];[m
[31m-[m
[31m-            e = ngx_postgres_upstream_overflow_options;[m
[31m-            for (j = 0; e[j].name.len; j++) {[m
[31m-                if ((e[j].name.len == value[i].len)[m
[31m-                    && (ngx_strcasecmp(e[j].name.data, value[i].data) == 0))[m
[31m-                {[m
[31m-                    pgscf->reject = e[j].value;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (e[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid \"overflow\" value \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid parameter \"%V\" in"[m
[31m-                           " \"%V\" directive",[m
[31m-                           &value[i], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_postgres_loc_conf_t           *pglcf = conf;[m
[31m-    ngx_http_core_loc_conf_t          *clcf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_url_t                          url;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if ((pglcf->upstream.upstream != NULL) || (pglcf->upstream_cv != NULL)) {[m
[31m-        dd("returning");[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty upstream in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);[m
[31m-[m
[31m-    clcf->handler = ngx_postgres_handler;[m
[31m-[m
[31m-    if (clcf->name.data[clcf->name.len - 1] == '/') {[m
[31m-        clcf->auto_redirect = 1;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_variables_count(&value[1])) {[m
[31m-        /* complex value */[m
[31m-        dd("complex value");[m
[31m-[m
[31m-        pglcf->upstream_cv = ngx_palloc(cf->pool,[m
[31m-                                        sizeof(ngx_http_complex_value_t));[m
[31m-        if (pglcf->upstream_cv == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &value[1];[m
[31m-        ccv.complex_value = pglcf->upstream_cv;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("returning NGX_CONF_OK");[m
[31m-        return NGX_CONF_OK;[m
[31m-    } else {[m
[31m-        /* simple value */[m
[31m-        dd("simple value");[m
[31m-[m
[31m-        ngx_memzero(&url, sizeof(ngx_url_t));[m
[31m-[m
[31m-        url.url = value[1];[m
[31m-        url.no_resolve = 1;[m
[31m-[m
[31m-        pglcf->upstream.upstream = ngx_http_upstream_add(cf, &url, 0);[m
[31m-        if (pglcf->upstream.upstream == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        dd("returning NGX_CONF_OK");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_query(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                         *value = cf->args->elts;[m
[31m-    ngx_str_t                          sql = value[cf->args->nelts - 1];[m
[31m-    ngx_postgres_loc_conf_t           *pglcf = conf;[m
[31m-    ngx_http_compile_complex_value_t   ccv;[m
[31m-    ngx_postgres_mixed_t              *query;[m
[31m-    ngx_conf_bitmask_t                *b;[m
[31m-    ngx_uint_t                         methods, i, j;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (sql.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty query in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        /* default query */[m
[31m-        dd("default query");[m
[31m-[m
[31m-        if (pglcf->query.def != NULL) {[m
[31m-            dd("returning");[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-[m
[31m-        pglcf->query.def = ngx_palloc(cf->pool, sizeof(ngx_postgres_mixed_t));[m
[31m-        if (pglcf->query.def == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        methods = 0xFFFF;[m
[31m-        query = pglcf->query.def;[m
[31m-    } else {[m
[31m-        /* method-specific query */[m
[31m-        dd("method-specific query");[m
[31m-[m
[31m-        methods = 0;[m
[31m-[m
[31m-        for (i = 1; i < cf->args->nelts - 1; i++) {[m
[31m-            b = ngx_postgres_http_methods;[m
[31m-            for (j = 0; b[j].name.len; j++) {[m
[31m-                if ((b[j].name.len == value[i].len)[m
[31m-                    && (ngx_strcasecmp(b[j].name.data, value[i].data) == 0))[m
[31m-                {[m
[31m-                    if (pglcf->query.methods_set & b[j].mask) {[m
[31m-                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                           "postgres: method \"%V\" is"[m
[31m-                                           " duplicate in \"%V\" directive",[m
[31m-                                           &value[i], &cmd->name);[m
[31m-[m
[31m-                        dd("returning NGX_CONF_ERROR");[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    methods |= b[j].mask;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid method \"%V\""[m
[31m-                                   " in \"%V\" directive",[m
[31m-                                   &value[i], &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (pglcf->query.methods == NULL) {[m
[31m-            pglcf->query.methods = ngx_array_create(cf->pool, 4,[m
[31m-                                       sizeof(ngx_postgres_mixed_t));[m
[31m-            if (pglcf->query.methods == NULL) {[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        query = ngx_array_push(pglcf->query.methods);[m
[31m-        if (query == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pglcf->query.methods_set |= methods;[m
[31m-    }[m
[31m-[m
[31m-    if (ngx_http_script_variables_count(&sql)) {[m
[31m-        /* complex value */[m
[31m-        dd("complex value");[m
[31m-[m
[31m-        query->key = methods;[m
[31m-[m
[31m-        query->cv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));[m
[31m-        if (query->cv == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));[m
[31m-[m
[31m-        ccv.cf = cf;[m
[31m-        ccv.value = &sql;[m
[31m-        ccv.complex_value = query->cv;[m
[31m-[m
[31m-        if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* simple value */[m
[31m-        dd("simple value");[m
[31m-[m
[31m-        query->key = methods;[m
[31m-        query->sv = sql;[m
[31m-        query->cv = NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                    *value = cf->args->elts;[m
[31m-    ngx_str_t                     what = value[cf->args->nelts - 2];[m
[31m-    ngx_str_t                     to = value[cf->args->nelts - 1];[m
[31m-    ngx_postgres_loc_conf_t      *pglcf = conf;[m
[31m-    ngx_postgres_rewrite_conf_t  *pgrcf;[m
[31m-    ngx_postgres_rewrite_t       *rewrite;[m
[31m-    ngx_postgres_rewrite_enum_t  *e;[m
[31m-    ngx_conf_bitmask_t           *b;[m
[31m-    ngx_uint_t                    methods, keep_body, i, j;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    e = ngx_postgres_rewrite_handlers;[m
[31m-    for (i = 0; e[i].name.len; i++) {[m
[31m-        if ((e[i].name.len == what.len)[m
[31m-            && (ngx_strcasecmp(e[i].name.data, what.data) == 0))[m
[31m-        {[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (e[i].name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid condition \"%V\""[m
[31m-                           " in \"%V\" directive", &what, &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->rewrites == NGX_CONF_UNSET_PTR) {[m
[31m-        pglcf->rewrites = ngx_array_create(cf->pool, 2,[m
[31m-                                           sizeof(ngx_postgres_rewrite_conf_t));[m
[31m-        if (pglcf->rewrites == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    } else {[m
[31m-        pgrcf = pglcf->rewrites->elts;[m
[31m-        for (j = 0; j < pglcf->rewrites->nelts; j++) {[m
[31m-            if (pgrcf[j].key == e[i].key) {[m
[31m-                pgrcf = &pgrcf[j];[m
[31m-                goto found;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgrcf = ngx_array_push(pglcf->rewrites);[m
[31m-    if (pgrcf == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memzero(pgrcf, sizeof(ngx_postgres_rewrite_conf_t));[m
[31m-[m
[31m-    pgrcf->key = e[i].key;[m
[31m-    pgrcf->handler = e[i].handler;[m
[31m-[m
[31m-found:[m
[31m-[m
[31m-    if (cf->args->nelts == 3) {[m
[31m-        /* default rewrite */[m
[31m-        dd("default rewrite");[m
[31m-[m
[31m-        if (pgrcf->def != NULL) {[m
[31m-            dd("returning");[m
[31m-            return "is duplicate";[m
[31m-        }[m
[31m-[m
[31m-        pgrcf->def = ngx_palloc(cf->pool, sizeof(ngx_postgres_rewrite_t));[m
[31m-        if (pgrcf->def == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        methods = 0xFFFF;[m
[31m-        rewrite = pgrcf->def;[m
[31m-    } else {[m
[31m-        /* method-specific rewrite */[m
[31m-        dd("method-specific rewrite");[m
[31m-[m
[31m-        methods = 0;[m
[31m-[m
[31m-        for (i = 1; i < cf->args->nelts - 2; i++) {[m
[31m-            b = ngx_postgres_http_methods;[m
[31m-            for (j = 0; b[j].name.len; j++) {[m
[31m-                if ((b[j].name.len == value[i].len)[m
[31m-                    && (ngx_strcasecmp(b[j].name.data, value[i].data) == 0))[m
[31m-                {[m
[31m-                    if (pgrcf->methods_set & b[j].mask) {[m
[31m-                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                           "postgres: method \"%V\" for"[m
[31m-                                           " condition \"%V\" is duplicate"[m
[31m-                                           " in \"%V\" directive",[m
[31m-                                           &value[i], &what, &cmd->name);[m
[31m-[m
[31m-                        dd("returning NGX_CONF_ERROR");[m
[31m-                        return NGX_CONF_ERROR;[m
[31m-                    }[m
[31m-[m
[31m-                    methods |= b[j].mask;[m
[31m-                    break;[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if (b[j].name.len == 0) {[m
[31m-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                                   "postgres: invalid method \"%V\" for"[m
[31m-                                   " condition \"%V\" in \"%V\" directive",[m
[31m-                                   &value[i], &what, &cmd->name);[m
[31m-[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (pgrcf->methods == NULL) {[m
[31m-            pgrcf->methods = ngx_array_create(cf->pool, 4,[m
[31m-                                              sizeof(ngx_postgres_rewrite_t));[m
[31m-            if (pgrcf->methods == NULL) {[m
[31m-                dd("returning NGX_CONF_ERROR");[m
[31m-                return NGX_CONF_ERROR;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        rewrite = ngx_array_push(pgrcf->methods);[m
[31m-        if (rewrite == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        pgrcf->methods_set |= methods;[m
[31m-    }[m
[31m-[m
[31m-    if (to.data[0] == '=') {[m
[31m-        keep_body = 1;[m
[31m-        to.len--;[m
[31m-        to.data++;[m
[31m-    } else {[m
[31m-        keep_body = 0;[m
[31m-    }[m
[31m-[m
[31m-    rewrite->key = methods;[m
[31m-    rewrite->status = ngx_atoi(to.data, to.len);[m
[31m-    if ((rewrite->status == NGX_ERROR)[m
[31m-        || (rewrite->status < NGX_HTTP_OK)[m
[31m-        || (rewrite->status > NGX_HTTP_INSUFFICIENT_STORAGE)[m
[31m-        || ((rewrite->status >= NGX_HTTP_SPECIAL_RESPONSE)[m
[31m-            && (rewrite->status < NGX_HTTP_BAD_REQUEST)))[m
[31m-    {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid status value \"%V\" for"[m
[31m-                           " condition \"%V\" in \"%V\" directive",[m
[31m-                           &to, &what, &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (keep_body) {[m
[31m-        rewrite->status = -rewrite->status;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_output(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                   *value = cf->args->elts;[m
[31m-    ngx_postgres_loc_conf_t     *pglcf = conf;[m
[31m-    ngx_postgres_output_enum_t  *e;[m
[31m-    ngx_uint_t                   i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (pglcf->output_handler != NGX_CONF_UNSET_PTR) {[m
[31m-        dd("returning");[m
[31m-        return "is duplicate";[m
[31m-    }[m
[31m-[m
[31m-    e = ngx_postgres_output_handlers;[m
[31m-    for (i = 0; e[i].name.len; i++) {[m
[31m-        if ((e[i].name.len == value[1].len)[m
[31m-            && (ngx_strcasecmp(e[i].name.data, value[1].data) == 0))[m
[31m-        {[m
[31m-            pglcf->output_handler = e[i].handler;[m
[31m-            break;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (e[i].name.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid output format \"%V\""[m
[31m-                           " in \"%V\" directive", &value[1], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pglcf->output_binary = e[i].binary;[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_conf_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                *value = cf->args->elts;[m
[31m-    ngx_postgres_loc_conf_t  *pglcf = conf;[m
[31m-    ngx_postgres_variable_t  *pgvar;[m
[31m-    ngx_conf_enum_t          *e;[m
[31m-    ngx_int_t                 idx;[m
[31m-    ngx_uint_t                i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (value[1].len < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty variable name in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (value[1].data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid variable name \"%V\""[m
[31m-                           " in \"%V\" directive", &value[1], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    value[1].len--;[m
[31m-    value[1].data++;[m
[31m-[m
[31m-    if (value[3].len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty column in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->variables == NGX_CONF_UNSET_PTR) {[m
[31m-        pglcf->variables = ngx_array_create(cf->pool, 4,[m
[31m-                                            sizeof(ngx_postgres_variable_t));[m
[31m-        if (pglcf->variables == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgvar = ngx_array_push(pglcf->variables);[m
[31m-    if (pgvar == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgvar->idx = pglcf->variables->nelts - 1;[m
[31m-[m
[31m-    pgvar->var = ngx_http_add_variable(cf, &value[1], 0);[m
[31m-    if (pgvar->var == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    idx = ngx_http_get_variable_index(cf, &value[1]);[m
[31m-    if (idx == NGX_ERROR) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /*[m
[31m-     * Check if "$variable" was previously defined,[m
[31m-     * back-off even if it was marked as "CHANGEABLE".[m
[31m-     */[m
[31m-    if (pgvar->var->get_handler != NULL) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: variable \"$%V\" is duplicate"[m
[31m-                           " in \"%V\" directive", &value[1], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgvar->var->get_handler = ngx_postgres_variable_get_custom;[m
[31m-    pgvar->var->data = (uintptr_t) pgvar;[m
[31m-[m
[31m-    pgvar->value.row = ngx_atoi(value[2].data, value[2].len);[m
[31m-    if (pgvar->value.row == NGX_ERROR) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid row number \"%V\""[m
[31m-                           " in \"%V\" directive", &value[2], &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgvar->value.column = ngx_atoi(value[3].data, value[3].len);[m
[31m-    if (pgvar->value.column == NGX_ERROR) {[m
[31m-        /* get column by name */[m
[31m-        pgvar->value.col_name = ngx_pnalloc(cf->pool, value[3].len + 1);[m
[31m-        if (pgvar->value.col_name == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        (void) ngx_cpystrn(pgvar->value.col_name,[m
[31m-                           value[3].data, value[3].len + 1);[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 4) {[m
[31m-        /* default value */[m
[31m-        pgvar->value.required = 0;[m
[31m-    } else {[m
[31m-        /* user-specified value */[m
[31m-        e = ngx_postgres_requirement_options;[m
[31m-        for (i = 0; e[i].name.len; i++) {[m
[31m-            if ((e[i].name.len == value[4].len)[m
[31m-                && (ngx_strcasecmp(e[i].name.data, value[4].data) == 0))[m
[31m-            {[m
[31m-                pgvar->value.required = e[i].value;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (e[i].name.len == 0) {[m
[31m-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                               "postgres: invalid requirement option \"%V\""[m
[31m-                               " in \"%V\" directive", &value[4], &cmd->name);[m
[31m-[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-/*[m
[31m- * Based on: ngx_http_rewrite_module.c/ngx_http_rewrite_set[m
[31m- * Copyright (C) Igor Sysoev[m
[31m- */[m
[31m-char *[m
[31m-ngx_postgres_conf_escape(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)[m
[31m-{[m
[31m-    ngx_str_t                           *value = cf->args->elts;[m
[31m-    ngx_str_t                            src = value[cf->args->nelts - 1];[m
[31m-    ngx_int_t                            index;[m
[31m-    ngx_http_variable_t                 *v;[m
[31m-    ngx_http_script_var_code_t          *vcode;[m
[31m-    ngx_http_script_var_handler_code_t  *vhcode;[m
[31m-    ngx_postgres_rewrite_loc_conf_t     *rlcf;[m
[31m-    ngx_postgres_escape_t               *pge;[m
[31m-    ngx_str_t                            dst;[m
[31m-    ngx_uint_t                           empty;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if ((src.len != 0) && (src.data[0] == '=')) {[m
[31m-        empty = 1;[m
[31m-        src.len--;[m
[31m-        src.data++;[m
[31m-    } else {[m
[31m-        empty = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (src.len == 0) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty value in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (cf->args->nelts == 2) {[m
[31m-        dst = src;[m
[31m-    } else {[m
[31m-        dst = value[1];[m
[31m-    }[m
[31m-[m
[31m-    if (dst.len < 2) {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: empty variable name in \"%V\" directive",[m
[31m-                           &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (dst.data[0] != '$') {[m
[31m-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,[m
[31m-                           "postgres: invalid variable name \"%V\""[m
[31m-                           " in \"%V\" directive", &dst, &cmd->name);[m
[31m-[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dst.len--;[m
[31m-    dst.data++;[m
[31m-[m
[31m-    v = ngx_http_add_variable(cf, &dst, NGX_HTTP_VAR_CHANGEABLE);[m
[31m-    if (v == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    index = ngx_http_get_variable_index(cf, &dst);[m
[31m-    if (index == NGX_ERROR) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (v->get_handler == NULL[m
[31m-        && ngx_strncasecmp(dst.data, (u_char *) "http_", 5) != 0[m
[31m-        && ngx_strncasecmp(dst.data, (u_char *) "sent_http_", 10) != 0[m
[31m-        && ngx_strncasecmp(dst.data, (u_char *) "upstream_http_", 14) != 0)[m
[31m-    {[m
[31m-        v->get_handler = ngx_postgres_rewrite_var;[m
[31m-        v->data = index;[m
[31m-    }[m
[31m-[m
[31m-    rlcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (ngx_postgres_rewrite_value(cf, rlcf, &src) != NGX_CONF_OK) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pge = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                     sizeof(ngx_postgres_escape_t));[m
[31m-    if (pge == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pge->code = ngx_postgres_escape_string;[m
[31m-    pge->empty = empty;[m
[31m-[m
[31m-    if (v->set_handler) {[m
[31m-        vhcode = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                   sizeof(ngx_http_script_var_handler_code_t));[m
[31m-        if (vhcode == NULL) {[m
[31m-            dd("returning NGX_CONF_ERROR");[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        vhcode->code = ngx_http_script_var_set_handler_code;[m
[31m-        vhcode->handler = v->set_handler;[m
[31m-        vhcode->data = v->data;[m
[31m-[m
[31m-        dd("returning NGX_CONF_OK");[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    vcode = ngx_http_script_start_code(cf->pool, &rlcf->codes,[m
[31m-                                       sizeof(ngx_http_script_var_code_t));[m
[31m-    if (vcode == NULL) {[m
[31m-        dd("returning NGX_CONF_ERROR");[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    vcode->code = ngx_http_script_set_var_code;[m
[31m-    vcode->index = (uintptr_t) index;[m
[31m-[m
[31m-    dd("returning NGX_CONF_OK");[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t *[m
[31m-ngx_postgres_find_upstream(ngx_http_request_t *r, ngx_url_t *url)[m
[31m-{[m
[31m-    ngx_http_upstream_main_conf_t   *umcf;[m
[31m-    ngx_http_upstream_srv_conf_t   **uscfp;[m
[31m-    ngx_uint_t                       i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);[m
[31m-[m
[31m-    uscfp = umcf->upstreams.elts;[m
[31m-[m
[31m-    for (i = 0; i < umcf->upstreams.nelts; i++) {[m
[31m-[m
[31m-        if ((uscfp[i]->host.len != url->host.len)[m
[31m-            || (ngx_strncasecmp(uscfp[i]->host.data, url->host.data,[m
[31m-                                url->host.len) != 0))[m
[31m-        {[m
[31m-            dd("host doesn't match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->port != url->port) {[m
[31m-            dd("port doesn't match: %d != %d",[m
[31m-               (int) uscfp[i]->port, (int) url->port);[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        if (uscfp[i]->default_port && url->default_port[m
[31m-            && (uscfp[i]->default_port != url->default_port))[m
[31m-        {[m
[31m-            dd("default_port doesn't match");[m
[31m-            continue;[m
[31m-        }[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return uscfp[i];[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NULL");[m
[31m-    return NULL;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_module.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_module.h[m
[1mdeleted file mode 100644[m
[1mindex 03f49fd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_module.h[m
[1m+++ /dev/null[m
[36m@@ -1,193 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_MODULE_H_[m
[31m-#define _NGX_POSTGRES_MODULE_H_[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_postgres_module;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_http_script_code_pt             code;[m
[31m-    ngx_uint_t                          empty;[m
[31m-} ngx_postgres_escape_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_str_t                           sv;[m
[31m-    ngx_http_complex_value_t           *cv;[m
[31m-} ngx_postgres_mixed_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_int_t                           status;[m
[31m-} ngx_postgres_rewrite_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_int_t                           row;[m
[31m-    ngx_int_t                           column;[m
[31m-    u_char                             *col_name;[m
[31m-    ngx_uint_t                          required;[m
[31m-} ngx_postgres_value_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          idx;[m
[31m-    ngx_http_variable_t                *var;[m
[31m-    ngx_postgres_value_t                value;[m
[31m-} ngx_postgres_variable_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          methods_set;[m
[31m-    ngx_array_t                        *methods; /* method-specific */[m
[31m-    ngx_postgres_mixed_t               *def;     /* default */[m
[31m-} ngx_postgres_query_conf_t;[m
[31m-[m
[31m-typedef struct ngx_postgres_rewrite_conf_s ngx_postgres_rewrite_conf_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_postgres_rewrite_handler_pt)[m
[31m-    (ngx_http_request_t *, ngx_postgres_rewrite_conf_t *);[m
[31m-[m
[31m-struct ngx_postgres_rewrite_conf_s {[m
[31m-    /* condition */[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_postgres_rewrite_handler_pt     handler;[m
[31m-    /* methods */[m
[31m-    ngx_uint_t                          methods_set;[m
[31m-    ngx_array_t                        *methods; /* method-specific */[m
[31m-    ngx_postgres_rewrite_t             *def;     /* default */[m
[31m-};[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                           name;[m
[31m-    ngx_uint_t                          key;[m
[31m-    ngx_postgres_rewrite_handler_pt     handler;[m
[31m-} ngx_postgres_rewrite_enum_t;[m
[31m-[m
[31m-typedef ngx_int_t (*ngx_postgres_output_handler_pt)[m
[31m-    (ngx_http_request_t *, PGresult *);[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_str_t                           name;[m
[31m-    unsigned                            binary:1;[m
[31m-    ngx_postgres_output_handler_pt      handler;[m
[31m-} ngx_postgres_output_enum_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-#if defined(nginx_version) && (nginx_version >= 8022)[m
[31m-    ngx_addr_t                         *addrs;[m
[31m-#else[m
[31m-    ngx_peer_addr_t                    *addrs;[m
[31m-#endif[m
[31m-    ngx_uint_t                          naddrs;[m
[31m-    in_port_t                           port;[m
[31m-    ngx_str_t                           dbname;[m
[31m-    ngx_str_t                           user;[m
[31m-    ngx_str_t                           password;[m
[31m-} ngx_postgres_upstream_server_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    struct sockaddr                    *sockaddr;[m
[31m-    socklen_t                           socklen;[m
[31m-    ngx_str_t                           name;[m
[31m-    ngx_str_t                           host;[m
[31m-    in_port_t                           port;[m
[31m-    ngx_str_t                           dbname;[m
[31m-    ngx_str_t                           user;[m
[31m-    ngx_str_t                           password;[m
[31m-} ngx_postgres_upstream_peer_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_uint_t                          single;[m
[31m-    ngx_uint_t                          number;[m
[31m-    ngx_str_t                          *name;[m
[31m-    ngx_postgres_upstream_peer_t        peer[1];[m
[31m-} ngx_postgres_upstream_peers_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_postgres_upstream_peers_t      *peers;[m
[31m-    ngx_uint_t                          current;[m
[31m-    ngx_array_t                        *servers;[m
[31m-    ngx_pool_t                         *pool;[m
[31m-    /* keepalive */[m
[31m-    ngx_flag_t                          single;[m
[31m-    ngx_queue_t                         free;[m
[31m-    ngx_queue_t                         cache;[m
[31m-    ngx_uint_t                          active_conns;[m
[31m-    ngx_uint_t                          max_cached;[m
[31m-    ngx_uint_t                          reject;[m
[31m-} ngx_postgres_upstream_srv_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    /* upstream */[m
[31m-    ngx_http_upstream_conf_t            upstream;[m
[31m-    ngx_http_complex_value_t           *upstream_cv;[m
[31m-    /* queries */[m
[31m-    ngx_postgres_query_conf_t           query;[m
[31m-    /* rewrites */[m
[31m-    ngx_array_t                        *rewrites;[m
[31m-    /* output */[m
[31m-    ngx_postgres_output_handler_pt      output_handler;[m
[31m-    unsigned                            output_binary:1;[m
[31m-    /* custom variables */[m
[31m-    ngx_array_t                        *variables;[m
[31m-} ngx_postgres_loc_conf_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_chain_t                        *response;[m
[31m-    ngx_int_t                           var_cols;[m
[31m-    ngx_int_t                           var_rows;[m
[31m-    ngx_int_t                           var_affected;[m
[31m-    ngx_str_t                           var_query;[m
[31m-    ngx_array_t                        *variables;[m
[31m-    ngx_int_t                           status;[m
[31m-} ngx_postgres_ctx_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_postgres_add_variables(ngx_conf_t *);[m
[31m-void       *ngx_postgres_create_upstream_srv_conf(ngx_conf_t *);[m
[31m-void       *ngx_postgres_create_loc_conf(ngx_conf_t *);[m
[31m-char       *ngx_postgres_merge_loc_conf(ngx_conf_t *, void *, void *);[m
[31m-char       *ngx_postgres_conf_server(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_keepalive(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_pass(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_query(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_rewrite(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_output(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_set(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-char       *ngx_postgres_conf_escape(ngx_conf_t *, ngx_command_t *, void *);[m
[31m-[m
[31m-ngx_http_upstream_srv_conf_t  *ngx_postgres_find_upstream(ngx_http_request_t *,[m
[31m-                                   ngx_url_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_MODULE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_output.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_output.c[m
[1mdeleted file mode 100644[m
[1mindex 9fa5481..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_output.c[m
[1m+++ /dev/null[m
[36m@@ -1,648 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_output.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_output_value(ngx_http_request_t *r, PGresult *res)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t        *pgctx;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    size_t                     size;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx->var_rows != 1) || (pgctx->var_cols != 1)) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: \"postgres_output value\" received %d value(s)"[m
[31m-                      " instead of expected single value in location \"%V\"",[m
[31m-                      pgctx->var_rows * pgctx->var_cols, &clcf->name);[m
[31m-[m
[31m-        dd("returning NGX_DONE, status NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        pgctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    if (PQgetisnull(res, 0, 0)) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: \"postgres_output value\" received NULL value"[m
[31m-                      " in location \"%V\"", &clcf->name);[m
[31m-[m
[31m-        dd("returning NGX_DONE, status NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        pgctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    size = PQgetlength(res, 0, 0);[m
[31m-    if (size == 0) {[m
[31m-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                      "postgres: \"postgres_output value\" received empty value"[m
[31m-                      " in location \"%V\"", &clcf->name);[m
[31m-[m
[31m-        dd("returning NGX_DONE, status NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        pgctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    b->last = ngx_copy(b->last, PQgetvalue(res, 0, 0), size);[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    /* set output response */[m
[31m-    pgctx->response = cl;[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_output_text(ngx_http_request_t *r, PGresult *res)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t        *pgctx;[m
[31m-    ngx_chain_t               *cl;[m
[31m-    ngx_buf_t                 *b;[m
[31m-    size_t                     size;[m
[31m-    ngx_int_t                  col_count, row_count, col, row;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    col_count = pgctx->var_cols;[m
[31m-    row_count = pgctx->var_rows;[m
[31m-[m
[31m-    /* pre-calculate total length up-front for single buffer allocation */[m
[31m-    size = 0;[m
[31m-[m
[31m-    for (row = 0; row < row_count; row++) {[m
[31m-        for (col = 0; col < col_count; col++) {[m
[31m-            if (PQgetisnull(res, row, col)) {[m
[31m-                size += sizeof("(null)") - 1;[m
[31m-            } else {[m
[31m-                size += PQgetlength(res, row, col);  /* field string data */[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    size += row_count * col_count - 1;               /* delimiters */[m
[31m-[m
[31m-    if ((row_count == 0) || (size == 0)) {[m
[31m-        dd("returning NGX_DONE (empty result)");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(r->pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(r->pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-    for (row = 0; row < row_count; row++) {[m
[31m-        for (col = 0; col < col_count; col++) {[m
[31m-            if (PQgetisnull(res, row, col)) {[m
[31m-                b->last = ngx_copy(b->last, "(null)", sizeof("(null)") - 1);[m
[31m-            } else {[m
[31m-                size = PQgetlength(res, row, col);[m
[31m-                if (size) {[m
[31m-                    b->last = ngx_copy(b->last, PQgetvalue(res, row, col),[m
[31m-                                       size);[m
[31m-                }[m
[31m-            }[m
[31m-[m
[31m-            if ((row != row_count - 1) || (col != col_count - 1)) {[m
[31m-                b->last = ngx_copy(b->last, "\n", 1);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    cl->next = NULL;[m
[31m-[m
[31m-    /* set output response */[m
[31m-    pgctx->response = cl;[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_output_rds(ngx_http_request_t *r, PGresult *res)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-    ngx_chain_t         *first, *last;[m
[31m-    ngx_int_t            col_count, row_count, aff_count, row;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    col_count = pgctx->var_cols;[m
[31m-    row_count = pgctx->var_rows;[m
[31m-    aff_count = (pgctx->var_affected == NGX_ERROR) ? 0 : pgctx->var_affected;[m
[31m-[m
[31m-    /* render header */[m
[31m-    first = last = ngx_postgres_render_rds_header(r, r->pool, res, col_count,[m
[31m-                                                  aff_count);[m
[31m-    if (last == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PQresultStatus(res) != PGRES_TUPLES_OK) {[m
[31m-        goto done;[m
[31m-    }[m
[31m-[m
[31m-    /* render columns */[m
[31m-    last->next = ngx_postgres_render_rds_columns(r, r->pool, res, col_count);[m
[31m-    if (last->next == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-    last = last->next;[m
[31m-[m
[31m-    /* render rows */[m
[31m-    for (row = 0; row < row_count; row++) {[m
[31m-        last->next = ngx_postgres_render_rds_row(r, r->pool, res, col_count,[m
[31m-                                                 row, (row == row_count - 1));[m
[31m-        if (last->next == NULL) {[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        last = last->next;[m
[31m-    }[m
[31m-[m
[31m-    /* render row terminator (for empty result-set only) */[m
[31m-    if (row == 0) {[m
[31m-        last->next = ngx_postgres_render_rds_row_terminator(r, r->pool);[m
[31m-        if (last->next == NULL) {[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-        last = last->next;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    last->next = NULL;[m
[31m-[m
[31m-    /* set output response */[m
[31m-    pgctx->response = first;[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_postgres_render_rds_header(ngx_http_request_t *r, ngx_pool_t *pool,[m
[31m-    PGresult *res, ngx_int_t col_count, ngx_int_t aff_count)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_buf_t    *b;[m
[31m-    size_t        size;[m
[31m-    char         *errstr;[m
[31m-    size_t        errstr_len;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    errstr = PQresultErrorMessage(res);[m
[31m-    errstr_len = ngx_strlen(errstr);[m
[31m-[m
[31m-    size = sizeof(uint8_t)        /* endian type */[m
[31m-         + sizeof(uint32_t)       /* format version */[m
[31m-         + sizeof(uint8_t)        /* result type */[m
[31m-         + sizeof(uint16_t)       /* standard error code */[m
[31m-         + sizeof(uint16_t)       /* driver-specific error code */[m
[31m-         + sizeof(uint16_t)       /* driver-specific error string length */[m
[31m-         + (uint16_t) errstr_len  /* driver-specific error string data */[m
[31m-         + sizeof(uint64_t)       /* rows affected */[m
[31m-         + sizeof(uint64_t)       /* insert id */[m
[31m-         + sizeof(uint16_t)       /* column count */[m
[31m-         ;[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-#if NGX_HAVE_LITTLE_ENDIAN[m
[31m-    *b->last++ = 0;[m
[31m-#else[m
[31m-    *b->last++ = 1;[m
[31m-#endif[m
[31m-[m
[31m-    *(uint32_t *) b->last = (uint32_t) resty_dbd_stream_version;[m
[31m-    b->last += sizeof(uint32_t);[m
[31m-[m
[31m-    *b->last++ = 0;[m
[31m-[m
[31m-    *(uint16_t *) b->last = (uint16_t) 0;[m
[31m-    b->last += sizeof(uint16_t);[m
[31m-[m
[31m-    *(uint16_t *) b->last = (uint16_t) PQresultStatus(res);[m
[31m-    b->last += sizeof(uint16_t);[m
[31m-[m
[31m-    *(uint16_t *) b->last = (uint16_t) errstr_len;[m
[31m-    b->last += sizeof(uint16_t);[m
[31m-[m
[31m-    if (errstr_len) {[m
[31m-        b->last = ngx_copy(b->last, (u_char *) errstr, errstr_len);[m
[31m-    }[m
[31m-[m
[31m-    *(uint64_t *) b->last = (uint64_t) aff_count;[m
[31m-    b->last += sizeof(uint64_t);[m
[31m-[m
[31m-    *(uint64_t *) b->last = (uint64_t) PQoidValue(res);[m
[31m-    b->last += sizeof(uint64_t);[m
[31m-[m
[31m-    *(uint16_t *) b->last = (uint16_t) col_count;[m
[31m-    b->last += sizeof(uint16_t);[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_postgres_render_rds_columns(ngx_http_request_t *r, ngx_pool_t *pool,[m
[31m-    PGresult *res, ngx_int_t col_count)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_buf_t    *b;[m
[31m-    size_t        size;[m
[31m-    ngx_int_t     col;[m
[31m-    Oid           col_type;[m
[31m-    char         *col_name;[m
[31m-    size_t        col_name_len;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* pre-calculate total length up-front for single buffer allocation */[m
[31m-    size = col_count[m
[31m-         * (sizeof(uint16_t)    /* standard column type */[m
[31m-            + sizeof(uint16_t)  /* driver-specific column type */[m
[31m-            + sizeof(uint16_t)  /* column name string length */[m
[31m-           )[m
[31m-         ;[m
[31m-[m
[31m-    for (col = 0; col < col_count; col++) {[m
[31m-        size += ngx_strlen(PQfname(res, col));  /* column name string data */[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-    for (col = 0; col < col_count; col++) {[m
[31m-        col_type = PQftype(res, col);[m
[31m-        col_name = PQfname(res, col);[m
[31m-        col_name_len = (uint16_t) ngx_strlen(col_name);[m
[31m-[m
[31m-        *(uint16_t *) b->last = (uint16_t) ngx_postgres_rds_col_type(col_type);[m
[31m-        b->last += sizeof(uint16_t);[m
[31m-[m
[31m-        *(uint16_t *) b->last = col_type;[m
[31m-        b->last += sizeof(uint16_t);[m
[31m-[m
[31m-        *(uint16_t *) b->last = col_name_len;[m
[31m-        b->last += sizeof(uint16_t);[m
[31m-[m
[31m-        b->last = ngx_copy(b->last, col_name, col_name_len);[m
[31m-    }[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_postgres_render_rds_row(ngx_http_request_t *r, ngx_pool_t *pool,[m
[31m-    PGresult *res, ngx_int_t col_count, ngx_int_t row, ngx_int_t last_row)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_buf_t    *b;[m
[31m-    size_t        size;[m
[31m-    ngx_int_t     col;[m
[31m-[m
[31m-    dd("entering, row:%d", (int) row);[m
[31m-[m
[31m-    /* pre-calculate total length up-front for single buffer allocation */[m
[31m-    size = sizeof(uint8_t)                 /* row number */[m
[31m-         + (col_count * sizeof(uint32_t))  /* field string length */[m
[31m-         ;[m
[31m-[m
[31m-    if (last_row) {[m
[31m-        size += sizeof(uint8_t);[m
[31m-    }[m
[31m-[m
[31m-    for (col = 0; col < col_count; col++) {[m
[31m-        size += PQgetlength(res, row, col);  /* field string data */[m
[31m-    }[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, size);[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-    *b->last++ = (uint8_t) 1; /* valid row */[m
[31m-[m
[31m-    for (col = 0; col < col_count; col++) {[m
[31m-        if (PQgetisnull(res, row, col)) {[m
[31m-            *(uint32_t *) b->last = (uint32_t) -1;[m
[31m-             b->last += sizeof(uint32_t);[m
[31m-        } else {[m
[31m-            size = PQgetlength(res, row, col);[m
[31m-            *(uint32_t *) b->last = (uint32_t) size;[m
[31m-            b->last += sizeof(uint32_t);[m
[31m-[m
[31m-            if (size) {[m
[31m-                b->last = ngx_copy(b->last, PQgetvalue(res, row, col), size);[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (last_row) {[m
[31m-        *b->last++ = (uint8_t) 0; /* row terminator */[m
[31m-    }[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-ngx_chain_t *[m
[31m-ngx_postgres_render_rds_row_terminator(ngx_http_request_t *r, ngx_pool_t *pool)[m
[31m-{[m
[31m-    ngx_chain_t  *cl;[m
[31m-    ngx_buf_t    *b;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    b = ngx_create_temp_buf(pool, sizeof(uint8_t));[m
[31m-    if (b == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl = ngx_alloc_chain_link(pool);[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    cl->buf = b;[m
[31m-    b->memory = 1;[m
[31m-    b->tag = r->upstream->output.tag;[m
[31m-[m
[31m-    /* fill data */[m
[31m-    *b->last++ = (uint8_t) 0; /* row terminator */[m
[31m-[m
[31m-    if (b->last != b->end) {[m
[31m-        dd("returning NULL");[m
[31m-        return NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return cl;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_output_chain(ngx_http_request_t *r, ngx_chain_t *cl)[m
[31m-{[m
[31m-    ngx_http_upstream_t       *u = r->upstream;[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_postgres_loc_conf_t   *pglcf;[m
[31m-    ngx_postgres_ctx_t        *pgctx;[m
[31m-    ngx_int_t                  rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (!r->header_sent) {[m
[31m-        ngx_http_clear_content_length(r);[m
[31m-[m
[31m-        pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-        pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-        r->headers_out.status = pgctx->status ? ngx_abs(pgctx->status)[m
[31m-                                              : NGX_HTTP_OK;[m
[31m-[m
[31m-        if (pglcf->output_handler == &ngx_postgres_output_rds) {[m
[31m-            /* RDS for output rds */[m
[31m-            r->headers_out.content_type.data = (u_char *) rds_content_type;[m
[31m-            r->headers_out.content_type.len = rds_content_type_len;[m
[31m-            r->headers_out.content_type_len = rds_content_type_len;[m
[31m-        } else if (pglcf->output_handler != NULL) {[m
[31m-            /* default type for output value|row */[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            r->headers_out.content_type = clcf->default_type;[m
[31m-            r->headers_out.content_type_len = clcf->default_type.len;[m
[31m-        }[m
[31m-[m
[31m-        r->headers_out.content_type_lowcase = NULL;[m
[31m-[m
[31m-        rc = ngx_http_send_header(r);[m
[31m-        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {[m
[31m-            dd("returning rc:%d", (int) rc);[m
[31m-            return rc;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (cl == NULL) {[m
[31m-        dd("returning NGX_DONE");[m
[31m-        return NGX_DONE;[m
[31m-    }[m
[31m-[m
[31m-    rc = ngx_http_output_filter(r, cl);[m
[31m-    if (rc == NGX_ERROR || rc > NGX_OK) {[m
[31m-        dd("returning rc:%d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-    ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs, &cl,[m
[31m-                            u->output.tag);[m
[31m-#else[m
[31m-    ngx_chain_update_chains(&u->free_bufs, &u->busy_bufs, &cl, u->output.tag);[m
[31m-#endif[m
[31m-[m
[31m-    dd("returning rc:%d", (int) rc);[m
[31m-    return rc;[m
[31m-}[m
[31m-[m
[31m-rds_col_type_t[m
[31m-ngx_postgres_rds_col_type(Oid col_type)[m
[31m-{[m
[31m-    switch (col_type) {[m
[31m-    case 20: /* int8 */[m
[31m-        return rds_col_type_bigint;[m
[31m-    case 1560: /* bit */[m
[31m-        return rds_col_type_bit;[m
[31m-    case 1562: /* varbit */[m
[31m-        return rds_col_type_bit_varying;[m
[31m-    case 16: /* bool */[m
[31m-        return rds_col_type_bool;[m
[31m-    case 18: /* char */[m
[31m-        return rds_col_type_char;[m
[31m-    case 19: /* name */[m
[31m-        /* FALLTROUGH */[m
[31m-    case 25: /* text */[m
[31m-        /* FALLTROUGH */[m
[31m-    case 1043: /* varchar */[m
[31m-        return rds_col_type_varchar;[m
[31m-    case 1082: /* date */[m
[31m-        return rds_col_type_date;[m
[31m-    case 701: /* float8 */[m
[31m-        return rds_col_type_double;[m
[31m-    case 23: /* int4 */[m
[31m-        return rds_col_type_integer;[m
[31m-    case 1186: /* interval */[m
[31m-        return rds_col_type_interval;[m
[31m-    case 1700: /* numeric */[m
[31m-        return rds_col_type_decimal;[m
[31m-    case 700: /* float4 */[m
[31m-        return rds_col_type_real;[m
[31m-    case 21: /* int2 */[m
[31m-        return rds_col_type_smallint;[m
[31m-    case 1266: /* timetz */[m
[31m-        return rds_col_type_time_with_time_zone;[m
[31m-    case 1083: /* time */[m
[31m-        return rds_col_type_time;[m
[31m-    case 1184: /* timestamptz */[m
[31m-        return rds_col_type_timestamp_with_time_zone;[m
[31m-    case 1114: /* timestamp */[m
[31m-        return rds_col_type_timestamp;[m
[31m-    case 142: /* xml */[m
[31m-        return rds_col_type_xml;[m
[31m-    case 17: /* bytea */[m
[31m-        return rds_col_type_blob;[m
[31m-    default:[m
[31m-        return rds_col_type_unknown;[m
[31m-    }[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_output.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_output.h[m
[1mdeleted file mode 100644[m
[1mindex a5115c2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_output.h[m
[1m+++ /dev/null[m
[36m@@ -1,54 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_OUTPUT_H_[m
[31m-#define _NGX_POSTGRES_OUTPUT_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "resty_dbd_stream.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t        ngx_postgres_output_value(ngx_http_request_t *, PGresult *);[m
[31m-ngx_int_t        ngx_postgres_output_text(ngx_http_request_t *, PGresult *);[m
[31m-ngx_int_t        ngx_postgres_output_rds(ngx_http_request_t *, PGresult *);[m
[31m-ngx_chain_t     *ngx_postgres_render_rds_header(ngx_http_request_t *,[m
[31m-                     ngx_pool_t *, PGresult *, ngx_int_t, ngx_int_t);[m
[31m-ngx_chain_t     *ngx_postgres_render_rds_columns(ngx_http_request_t *,[m
[31m-                     ngx_pool_t *, PGresult *, ngx_int_t);[m
[31m-ngx_chain_t     *ngx_postgres_render_rds_row(ngx_http_request_t *, ngx_pool_t *,[m
[31m-                     PGresult *, ngx_int_t, ngx_int_t, ngx_int_t);[m
[31m-ngx_chain_t     *ngx_postgres_render_rds_row_terminator(ngx_http_request_t *,[m
[31m-                     ngx_pool_t *);[m
[31m-ngx_int_t        ngx_postgres_output_chain(ngx_http_request_t *, ngx_chain_t *);[m
[31m-rds_col_type_t   ngx_postgres_rds_col_type(Oid);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_OUTPUT_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_processor.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_processor.c[m
[1mdeleted file mode 100644[m
[1mindex d25c054..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_processor.c[m
[1m+++ /dev/null[m
[36m@@ -1,514 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_output.h"[m
[31m-#include "ngx_postgres_processor.h"[m
[31m-#include "ngx_postgres_util.h"[m
[31m-#include "ngx_postgres_variable.h"[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_process_events(ngx_http_request_t *r)[m
[31m-{[m
[31m-    ngx_postgres_upstream_peer_data_t  *pgdt;[m
[31m-    ngx_connection_t                   *pgxc;[m
[31m-    ngx_http_upstream_t                *u;[m
[31m-    ngx_int_t                           rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-    pgxc = u->peer.connection;[m
[31m-    pgdt = u->peer.data;[m
[31m-[m
[31m-    if (!ngx_postgres_upstream_is_my_peer(&u->peer)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: trying to connect to something that"[m
[31m-                      " is not PostgreSQL database");[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: process events");[m
[31m-[m
[31m-    switch (pgdt->state) {[m
[31m-    case state_db_connect:[m
[31m-        dd("state_db_connect");[m
[31m-        rc = ngx_postgres_upstream_connect(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    case state_db_send_query:[m
[31m-        dd("state_db_send_query");[m
[31m-        rc = ngx_postgres_upstream_send_query(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    case state_db_get_result:[m
[31m-        dd("state_db_get_result");[m
[31m-        rc = ngx_postgres_upstream_get_result(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    case state_db_get_ack:[m
[31m-        dd("state_db_get_ack");[m
[31m-        rc = ngx_postgres_upstream_get_ack(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    case state_db_idle:[m
[31m-        dd("state_db_idle, re-using keepalive connection");[m
[31m-        pgxc->log->action = "sending query to PostgreSQL database";[m
[31m-        pgdt->state = state_db_send_query;[m
[31m-        rc = ngx_postgres_upstream_send_query(r, pgxc, pgdt);[m
[31m-        break;[m
[31m-    default:[m
[31m-        dd("unknown state:%d", pgdt->state);[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: unknown state:%d", pgdt->state);[m
[31m-[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_postgres_upstream_finalize_request(r, u, rc);[m
[31m-    } else if (rc == NGX_ERROR) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    ngx_postgres_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_connect(ngx_http_request_t *r, ngx_connection_t *pgxc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    PostgresPollingStatusType  pgrc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgrc = PQconnectPoll(pgdt->pgconn);[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: polling while connecting, rc:%d", (int) pgrc);[m
[31m-[m
[31m-    if (pgrc == PGRES_POLLING_READING || pgrc == PGRES_POLLING_WRITING) {[m
[31m-[m
[31m-        /*[m
[31m-         * Fix for Linux issue found by chaoslawful (via agentzh):[m
[31m-         * "According to the source of libpq (around fe-connect.c:1215), during[m
[31m-         *  the state switch from CONNECTION_STARTED to CONNECTION_MADE, there's[m
[31m-         *  no socket read/write operations (just a plain getsockopt call and a[m
[31m-         *  getsockname call). Therefore, for edge-triggered event model, we[m
[31m-         *  have to call PQconnectPoll one more time (immediately) when we see[m
[31m-         *  CONNECTION_MADE is returned, or we're very likely to wait for a[m
[31m-         *  writable event that has already appeared and will never appear[m
[31m-         *  again :)"[m
[31m-         */[m
[31m-        if (PQstatus(pgdt->pgconn) == CONNECTION_MADE && pgxc->write->ready) {[m
[31m-            dd("re-polling on connection made");[m
[31m-[m
[31m-            pgrc = PQconnectPoll(pgdt->pgconn);[m
[31m-            dd("re-polling rc:%d", (int) pgrc);[m
[31m-[m
[31m-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                           "postgres: re-polling while connecting, rc:%d",[m
[31m-                           (int) pgrc);[m
[31m-[m
[31m-            if (pgrc == PGRES_POLLING_READING || pgrc == PGRES_POLLING_WRITING)[m
[31m-            {[m
[31m-                ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                               "postgres: busy while connecting, rc:%d",[m
[31m-                               (int) pgrc);[m
[31m-[m
[31m-                dd("returning NGX_AGAIN");[m
[31m-                return NGX_AGAIN;[m
[31m-            }[m
[31m-[m
[31m-            goto done;[m
[31m-        }[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG)[m
[31m-        switch (PQstatus(pgdt->pgconn)) {[m
[31m-        case CONNECTION_NEEDED:[m
[31m-             dd("connecting (waiting for connect()))");[m
[31m-             break;[m
[31m-        case CONNECTION_STARTED:[m
[31m-             dd("connecting (waiting for connection to be made)");[m
[31m-             break;[m
[31m-        case CONNECTION_MADE:[m
[31m-             dd("connecting (connection established)");[m
[31m-             break;[m
[31m-        case CONNECTION_AWAITING_RESPONSE:[m
[31m-             dd("connecting (credentials sent, waiting for response)");[m
[31m-             break;[m
[31m-        case CONNECTION_AUTH_OK:[m
[31m-             dd("connecting (authenticated)");[m
[31m-             break;[m
[31m-        case CONNECTION_SETENV:[m
[31m-             dd("connecting (negotiating envinroment)");[m
[31m-             break;[m
[31m-        case CONNECTION_SSL_STARTUP:[m
[31m-             dd("connecting (negotiating SSL)");[m
[31m-             break;[m
[31m-        default:[m
[31m-             /*[m
[31m-              * This cannot happen, PQconnectPoll would return[m
[31m-              * PGRES_POLLING_FAILED in that case.[m
[31m-              */[m
[31m-             dd("connecting (unknown state:%d)", (int) PQstatus(pgdt->pgconn));[m
[31m-[m
[31m-             dd("returning NGX_ERROR");[m
[31m-             return NGX_ERROR;[m
[31m-        }[m
[31m-#endif /* DDEBUG */[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                       "postgres: busy while connecting, rc:%d", (int) pgrc);[m
[31m-[m
[31m-        dd("returning NGX_AGAIN");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-done:[m
[31m-[m
[31m-    /* remove connection timeout from new connection */[m
[31m-    if (pgxc->write->timer_set) {[m
[31m-        ngx_del_timer(pgxc->write);[m
[31m-    }[m
[31m-[m
[31m-    if (pgrc != PGRES_POLLING_OK) {[m
[31m-        dd("connection failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: connection failed: %s",[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("connected successfully");[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: connected successfully");[m
[31m-[m
[31m-    pgxc->log->action = "sending query to PostgreSQL database";[m
[31m-    pgdt->state = state_db_send_query;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return ngx_postgres_upstream_send_query(r, pgxc, pgdt);[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_send_query(ngx_http_request_t *r, ngx_connection_t *pgxc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t  *pglcf;[m
[31m-    ngx_int_t                 pgrc;[m
[31m-    u_char                   *query;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-[m
[31m-    query = ngx_pnalloc(r->pool, pgdt->query.len + 1);[m
[31m-    if (query == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    (void) ngx_cpystrn(query, pgdt->query.data, pgdt->query.len + 1);[m
[31m-[m
[31m-    dd("sending query: %s", query);[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: sending query: \"%s\"", query);[m
[31m-[m
[31m-    if (pglcf->output_binary) {[m
[31m-        pgrc = PQsendQueryParams(pgdt->pgconn, (const char *) query,[m
[31m-                                 0, NULL, NULL, NULL, NULL, /* binary */ 1);[m
[31m-    } else {[m
[31m-        pgrc = PQsendQuery(pgdt->pgconn, (const char *) query);[m
[31m-    }[m
[31m-[m
[31m-    if (pgrc == 0) {[m
[31m-        dd("sending query failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: sending query failed: %s",[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* set result timeout */[m
[31m-    ngx_add_timer(pgxc->read, r->upstream->conf->read_timeout);[m
[31m-[m
[31m-    dd("query sent successfully");[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: query sent successfully");[m
[31m-[m
[31m-    pgxc->log->action = "waiting for result from PostgreSQL database";[m
[31m-    pgdt->state = state_db_get_result;[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_get_result(ngx_http_request_t *r, ngx_connection_t *pgxc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    ExecStatusType   pgrc;[m
[31m-    PGresult        *res;[m
[31m-    ngx_int_t        rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* remove connection timeout from re-used keepalive connection */[m
[31m-    if (pgxc->write->timer_set) {[m
[31m-        ngx_del_timer(pgxc->write);[m
[31m-    }[m
[31m-[m
[31m-    if (!PQconsumeInput(pgdt->pgconn)) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: failed to consume input: %s",[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PQisBusy(pgdt->pgconn)) {[m
[31m-        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                       "postgres: busy while receiving result");[m
[31m-[m
[31m-        dd("returning NGX_AGAIN");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    dd("receiving result");[m
[31m-[m
[31m-    res = PQgetResult(pgdt->pgconn);[m
[31m-    if (res == NULL) {[m
[31m-        dd("receiving result failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: failed to receive result: %s",[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    pgrc = PQresultStatus(res);[m
[31m-    if ((pgrc != PGRES_COMMAND_OK) && (pgrc != PGRES_TUPLES_OK)) {[m
[31m-        dd("receiving result failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: failed to receive result: %s: %s",[m
[31m-                      PQresStatus(pgrc),[m
[31m-                      PQerrorMessage(pgdt->pgconn));[m
[31m-[m
[31m-        PQclear(res);[m
[31m-[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("result received successfully, cols:%d rows:%d",[m
[31m-       PQnfields(res), PQntuples(res));[m
[31m-[m
[31m-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pgxc->log, 0,[m
[31m-                   "postgres: result received successfully, cols:%d rows:%d",[m
[31m-                   PQnfields(res), PQntuples(res));[m
[31m-[m
[31m-    pgxc->log->action = "processing result from PostgreSQL database";[m
[31m-    rc = ngx_postgres_process_response(r, res);[m
[31m-[m
[31m-    PQclear(res);[m
[31m-[m
[31m-    if (rc != NGX_DONE) {[m
[31m-        dd("returning rc:%d", (int) rc);[m
[31m-        return rc;[m
[31m-    }[m
[31m-[m
[31m-    dd("result processed successfully");[m
[31m-[m
[31m-    pgxc->log->action = "waiting for ACK from PostgreSQL database";[m
[31m-    pgdt->state = state_db_get_ack;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return ngx_postgres_upstream_get_ack(r, pgxc, pgdt);[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_process_response(ngx_http_request_t *r, PGresult *res)[m
[31m-{[m
[31m-    ngx_postgres_loc_conf_t      *pglcf;[m
[31m-    ngx_postgres_ctx_t           *pgctx;[m
[31m-    ngx_postgres_rewrite_conf_t  *pgrcf;[m
[31m-    ngx_postgres_variable_t      *pgvar;[m
[31m-    ngx_str_t                    *store;[m
[31m-    char                         *affected;[m
[31m-    size_t                        affected_len;[m
[31m-    ngx_uint_t                    i;[m
[31m-    ngx_int_t                     rc;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    /* set $postgres_columns */[m
[31m-    pgctx->var_cols = PQnfields(res);[m
[31m-[m
[31m-    /* set $postgres_rows */[m
[31m-    pgctx->var_rows = PQntuples(res);[m
[31m-[m
[31m-    /* set $postgres_affected */[m
[31m-    if (ngx_strncmp(PQcmdStatus(res), "SELECT", sizeof("SELECT") - 1)) {[m
[31m-        affected = PQcmdTuples(res);[m
[31m-        affected_len = ngx_strlen(affected);[m
[31m-        if (affected_len) {[m
[31m-            pgctx->var_affected = ngx_atoi((u_char *) affected, affected_len);[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->rewrites) {[m
[31m-        /* process rewrites */[m
[31m-        pgrcf = pglcf->rewrites->elts;[m
[31m-        for (i = 0; i < pglcf->rewrites->nelts; i++) {[m
[31m-            rc = pgrcf[i].handler(r, &pgrcf[i]);[m
[31m-            if (rc != NGX_DECLINED) {[m
[31m-                if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-                    dd("returning NGX_DONE, status %d", (int) rc);[m
[31m-                    pgctx->status = rc;[m
[31m-                    return NGX_DONE;[m
[31m-                }[m
[31m-[m
[31m-                pgctx->status = rc;[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->variables) {[m
[31m-        /* set custom variables */[m
[31m-        pgvar = pglcf->variables->elts;[m
[31m-        store = pgctx->variables->elts;[m
[31m-[m
[31m-        for (i = 0; i < pglcf->variables->nelts; i++) {[m
[31m-            store[i] = ngx_postgres_variable_set_custom(r, res, &pgvar[i]);[m
[31m-            if ((store[i].len == 0) && (pgvar[i].value.required)) {[m
[31m-                dd("returning NGX_DONE, status NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-                pgctx->status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-                return NGX_DONE;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (pglcf->output_handler) {[m
[31m-        /* generate output */[m
[31m-        dd("returning");[m
[31m-        return pglcf->output_handler(r, res);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_get_ack(ngx_http_request_t *r, ngx_connection_t *pgxc,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    PGresult  *res;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (!PQconsumeInput(pgdt->pgconn)) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    if (PQisBusy(pgdt->pgconn)) {[m
[31m-        dd("returning NGX_AGAIN");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* remove result timeout */[m
[31m-    if (pgxc->read->timer_set) {[m
[31m-        ngx_del_timer(pgxc->read);[m
[31m-    }[m
[31m-[m
[31m-    dd("receiving ACK (ready for next query)");[m
[31m-[m
[31m-    res = PQgetResult(pgdt->pgconn);[m
[31m-    if (res != NULL) {[m
[31m-        dd("receiving ACK failed");[m
[31m-        ngx_log_error(NGX_LOG_ERR, pgxc->log, 0,[m
[31m-                      "postgres: receiving ACK failed: multiple queries(?)");[m
[31m-[m
[31m-        PQclear(res);[m
[31m-[m
[31m-        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");[m
[31m-        return NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("ACK received successfully");[m
[31m-[m
[31m-    pgxc->log->action = "being idle on PostgreSQL database";[m
[31m-    pgdt->state = state_db_idle;[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return ngx_postgres_upstream_done(r, r->upstream, pgdt);[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_done(ngx_http_request_t *r, ngx_http_upstream_t *u,[m
[31m-    ngx_postgres_upstream_peer_data_t *pgdt)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    /* flag for keepalive */[m
[31m-    u->headers_in.status_n = NGX_HTTP_OK;[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if (pgctx->status >= NGX_HTTP_SPECIAL_RESPONSE) {[m
[31m-        ngx_postgres_upstream_finalize_request(r, u, pgctx->status);[m
[31m-    } else {[m
[31m-        ngx_postgres_upstream_finalize_request(r, u, NGX_OK);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DONE");[m
[31m-    return NGX_DONE;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_processor.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_processor.h[m
[1mdeleted file mode 100644[m
[1mindex ee818f8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_processor.h[m
[1m+++ /dev/null[m
[36m@@ -1,52 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_PROCESSOR_H_[m
[31m-#define _NGX_POSTGRES_PROCESSOR_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_upstream.h"[m
[31m-[m
[31m-[m
[31m-void       ngx_postgres_process_events(ngx_http_request_t *);[m
[31m-ngx_int_t  ngx_postgres_upstream_connect(ngx_http_request_t *,[m
[31m-               ngx_connection_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-ngx_int_t  ngx_postgres_upstream_send_query(ngx_http_request_t *,[m
[31m-               ngx_connection_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-ngx_int_t  ngx_postgres_upstream_get_result(ngx_http_request_t *,[m
[31m-               ngx_connection_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-ngx_int_t  ngx_postgres_process_response(ngx_http_request_t *, PGresult *);[m
[31m-ngx_int_t  ngx_postgres_upstream_get_ack(ngx_http_request_t *,[m
[31m-               ngx_connection_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-ngx_int_t  ngx_postgres_upstream_done(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *, ngx_postgres_upstream_peer_data_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_PROCESSOR_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.c[m
[1mdeleted file mode 100644[m
[1mindex 44f3e7e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.c[m
[1m+++ /dev/null[m
[36m@@ -1,114 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_rewrite.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_rewrite(ngx_http_request_t *r,[m
[31m-    ngx_postgres_rewrite_conf_t *pgrcf)[m
[31m-{[m
[31m-    ngx_postgres_rewrite_t  *rewrite;[m
[31m-    ngx_uint_t               i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    if (pgrcf->methods_set & r->method) {[m
[31m-        /* method-specific */[m
[31m-        rewrite = pgrcf->methods->elts;[m
[31m-        for (i = 0; i < pgrcf->methods->nelts; i++) {[m
[31m-            if (rewrite[i].key & r->method) {[m
[31m-                dd("returning status:%d", (int) rewrite[i].status);[m
[31m-                return rewrite[i].status;[m
[31m-            }[m
[31m-        }[m
[31m-    } else if (pgrcf->def) {[m
[31m-        /* default */[m
[31m-        dd("returning status:%d", (int) pgrcf->def->status);[m
[31m-        return pgrcf->def->status;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_rewrite_changes(ngx_http_request_t *r,[m
[31m-    ngx_postgres_rewrite_conf_t *pgrcf)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgrcf->key % 2 == 0) && (pgctx->var_affected == 0)) {[m
[31m-        /* no_changes */[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_rewrite(r, pgrcf);[m
[31m-    }[m
[31m-[m
[31m-    if ((pgrcf->key % 2 == 1) && (pgctx->var_affected > 0)) {[m
[31m-        /* changes */[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_rewrite(r, pgrcf);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_rewrite_rows(ngx_http_request_t *r,[m
[31m-    ngx_postgres_rewrite_conf_t *pgrcf)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgrcf->key % 2 == 0) && (pgctx->var_rows == 0)) {[m
[31m-        /* no_rows */[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_rewrite(r, pgrcf);[m
[31m-    }[m
[31m-[m
[31m-    if ((pgrcf->key % 2 == 1) && (pgctx->var_rows > 0)) {[m
[31m-        /* rows */[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_rewrite(r, pgrcf);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_DECLINED");[m
[31m-    return NGX_DECLINED;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.h[m
[1mdeleted file mode 100644[m
[1mindex 54afa6c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_rewrite.h[m
[1m+++ /dev/null[m
[36m@@ -1,43 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_REWRITE_H_[m
[31m-#define _NGX_POSTGRES_REWRITE_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_postgres_rewrite(ngx_http_request_t *,[m
[31m-               ngx_postgres_rewrite_conf_t *);[m
[31m-ngx_int_t  ngx_postgres_rewrite_changes(ngx_http_request_t *,[m
[31m-               ngx_postgres_rewrite_conf_t *);[m
[31m-ngx_int_t  ngx_postgres_rewrite_rows(ngx_http_request_t *,[m
[31m-               ngx_postgres_rewrite_conf_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_REWRITE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.c[m
[1mdeleted file mode 100644[m
[1mindex 919029b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.c[m
[1m+++ /dev/null[m
[36m@@ -1,598 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_keepalive.h"[m
[31m-#include "ngx_postgres_processor.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_init(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_postgres_upstream_srv_conf_t  *pgscf;[m
[31m-    ngx_postgres_upstream_server_t    *server;[m
[31m-    ngx_postgres_upstream_peers_t     *peers;[m
[31m-    ngx_uint_t                         i, j, n;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    uscf->peer.init = ngx_postgres_upstream_init_peer;[m
[31m-[m
[31m-    pgscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_postgres_module);[m
[31m-[m
[31m-    if (pgscf->servers == NULL || pgscf->servers->nelts == 0) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, cf->log, 0,[m
[31m-                      "postgres: no \"postgres_server\" defined"[m
[31m-                      " in upstream \"%V\" in %s:%ui",[m
[31m-                      &uscf->host, uscf->file_name, uscf->line);[m
[31m-[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    /* pgscf->servers != NULL */[m
[31m-[m
[31m-    server = uscf->servers->elts;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < uscf->servers->nelts; i++) {[m
[31m-        n += server[i].naddrs;[m
[31m-    }[m
[31m-[m
[31m-    peers = ngx_pcalloc(cf->pool, sizeof(ngx_postgres_upstream_peers_t)[m
[31m-            + sizeof(ngx_postgres_upstream_peer_t) * (n - 1));[m
[31m-[m
[31m-    if (peers == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    peers->single = (n == 1);[m
[31m-    peers->number = n;[m
[31m-    peers->name = &uscf->host;[m
[31m-[m
[31m-    n = 0;[m
[31m-[m
[31m-    for (i = 0; i < uscf->servers->nelts; i++) {[m
[31m-        for (j = 0; j < server[i].naddrs; j++) {[m
[31m-            peers->peer[n].sockaddr = server[i].addrs[j].sockaddr;[m
[31m-            peers->peer[n].socklen = server[i].addrs[j].socklen;[m
[31m-            peers->peer[n].name = server[i].addrs[j].name;[m
[31m-            peers->peer[n].port = server[i].port;[m
[31m-            peers->peer[n].dbname = server[i].dbname;[m
[31m-            peers->peer[n].user = server[i].user;[m
[31m-            peers->peer[n].password = server[i].password;[m
[31m-[m
[31m-            peers->peer[n].host.data = ngx_pnalloc(cf->pool,[m
[31m-                                                   NGX_SOCKADDR_STRLEN);[m
[31m-            if (peers->peer[n].host.data == NULL) {[m
[31m-                dd("returning NGX_ERROR");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            peers->peer[n].host.len = ngx_sock_ntop(peers->peer[n].sockaddr,[m
[31m-#if defined(nginx_version) && (nginx_version >= 1005003)[m
[31m-                                          peers->peer[n].socklen,[m
[31m-#endif[m
[31m-                                          peers->peer[n].host.data,[m
[31m-                                          NGX_SOCKADDR_STRLEN, 0);[m
[31m-            if (peers->peer[n].host.len == 0) {[m
[31m-                dd("returning NGX_ERROR");[m
[31m-                return NGX_ERROR;[m
[31m-            }[m
[31m-[m
[31m-            n++;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgscf->peers = peers;[m
[31m-    pgscf->active_conns = 0;[m
[31m-[m
[31m-    if (pgscf->max_cached) {[m
[31m-        dd("returning");[m
[31m-        return ngx_postgres_keepalive_init(cf->pool, pgscf);[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_init_peer(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_srv_conf_t *uscf)[m
[31m-{[m
[31m-    ngx_postgres_upstream_peer_data_t  *pgdt;[m
[31m-    ngx_postgres_upstream_srv_conf_t   *pgscf;[m
[31m-    ngx_postgres_loc_conf_t            *pglcf;[m
[31m-    ngx_postgres_ctx_t                 *pgctx;[m
[31m-    ngx_http_core_loc_conf_t           *clcf;[m
[31m-    ngx_http_upstream_t                *u;[m
[31m-    ngx_postgres_mixed_t               *query;[m
[31m-    ngx_str_t                           sql;[m
[31m-    ngx_uint_t                          i;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    pgdt = ngx_pcalloc(r->pool, sizeof(ngx_postgres_upstream_peer_data_t));[m
[31m-    if (pgdt == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    u = r->upstream;[m
[31m-[m
[31m-    pgdt->upstream = u;[m
[31m-    pgdt->request = r;[m
[31m-[m
[31m-    pgscf = ngx_http_conf_upstream_srv_conf(uscf, ngx_postgres_module);[m
[31m-    pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    pgdt->srv_conf = pgscf;[m
[31m-    pgdt->loc_conf = pglcf;[m
[31m-[m
[31m-    u->peer.data = pgdt;[m
[31m-    u->peer.get = ngx_postgres_upstream_get_peer;[m
[31m-    u->peer.free = ngx_postgres_upstream_free_peer;[m
[31m-[m
[31m-    if (pglcf->query.methods_set & r->method) {[m
[31m-        /* method-specific query */[m
[31m-        dd("using method-specific query");[m
[31m-[m
[31m-        query = pglcf->query.methods->elts;[m
[31m-        for (i = 0; i < pglcf->query.methods->nelts; i++) {[m
[31m-            if (query[i].key & r->method) {[m
[31m-                query = &query[i];[m
[31m-                break;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-        if (i == pglcf->query.methods->nelts) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-    } else {[m
[31m-        /* default query */[m
[31m-        dd("using default query");[m
[31m-[m
[31m-        query = pglcf->query.def;[m
[31m-    }[m
[31m-[m
[31m-    if (query->cv) {[m
[31m-        /* complex value */[m
[31m-        dd("using complex value");[m
[31m-[m
[31m-        if (ngx_http_complex_value(r, query->cv, &sql) != NGX_OK) {[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        if (sql.len == 0) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: empty \"postgres_query\" (was: \"%V\")"[m
[31m-                          " in location \"%V\"", &query->cv->value,[m
[31m-                          &clcf->name);[m
[31m-[m
[31m-            goto failed;[m
[31m-        }[m
[31m-[m
[31m-        pgdt->query = sql;[m
[31m-    } else {[m
[31m-        /* simple value */[m
[31m-        dd("using simple value");[m
[31m-[m
[31m-        pgdt->query = query->sv;[m
[31m-    }[m
[31m-[m
[31m-    /* set $postgres_query */[m
[31m-    pgctx->var_query = pgdt->query;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-#else[m
[31m-    r->upstream->peer.data = NULL;[m
[31m-[m
[31m-    dd("returning NGX_OK (NGX_ERROR)");[m
[31m-    return NGX_OK;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_get_peer(ngx_peer_connection_t *pc, void *data)[m
[31m-{[m
[31m-    ngx_postgres_upstream_peer_data_t  *pgdt = data;[m
[31m-    ngx_postgres_upstream_srv_conf_t   *pgscf;[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    ngx_postgres_ctx_t                 *pgctx;[m
[31m-#endif[m
[31m-    ngx_postgres_upstream_peers_t      *peers;[m
[31m-    ngx_postgres_upstream_peer_t       *peer;[m
[31m-    ngx_connection_t                   *pgxc = NULL;[m
[31m-    int                                 fd;[m
[31m-    ngx_event_t                        *rev, *wev;[m
[31m-    ngx_int_t                           rc;[m
[31m-    u_char                             *connstring, *last;[m
[31m-    size_t                              len;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    if (data == NULL) {[m
[31m-        goto failed;[m
[31m-    }[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(pgdt->request, ngx_postgres_module);[m
[31m-#endif[m
[31m-[m
[31m-    pgscf = pgdt->srv_conf;[m
[31m-[m
[31m-    pgdt->failed = 0;[m
[31m-[m
[31m-    if (pgscf->max_cached && pgscf->single) {[m
[31m-        rc = ngx_postgres_keepalive_get_peer_single(pc, pgdt, pgscf);[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            /* re-use keepalive peer */[m
[31m-            dd("re-using keepalive peer (single)");[m
[31m-[m
[31m-            pgdt->state = state_db_send_query;[m
[31m-[m
[31m-            ngx_postgres_process_events(pgdt->request);[m
[31m-[m
[31m-            dd("returning NGX_AGAIN");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    peers = pgscf->peers;[m
[31m-[m
[31m-    if (pgscf->current > peers->number - 1) {[m
[31m-        pgscf->current = 0;[m
[31m-    }[m
[31m-[m
[31m-    peer = &peers->peer[pgscf->current++];[m
[31m-[m
[31m-    pgdt->name.len = peer->name.len;[m
[31m-    pgdt->name.data = peer->name.data;[m
[31m-[m
[31m-    pgdt->sockaddr = *peer->sockaddr;[m
[31m-[m
[31m-    pc->name = &pgdt->name;[m
[31m-    pc->sockaddr = &pgdt->sockaddr;[m
[31m-    pc->socklen = peer->socklen;[m
[31m-    pc->cached = 0;[m
[31m-[m
[31m-    if ((pgscf->max_cached) && (!pgscf->single)) {[m
[31m-        rc = ngx_postgres_keepalive_get_peer_multi(pc, pgdt, pgscf);[m
[31m-        if (rc != NGX_DECLINED) {[m
[31m-            /* re-use keepalive peer */[m
[31m-            dd("re-using keepalive peer (multi)");[m
[31m-[m
[31m-            pgdt->state = state_db_send_query;[m
[31m-[m
[31m-            ngx_postgres_process_events(pgdt->request);[m
[31m-[m
[31m-            dd("returning NGX_AGAIN");[m
[31m-            return NGX_AGAIN;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((pgscf->reject) && (pgscf->active_conns >= pgscf->max_cached)) {[m
[31m-        ngx_log_error(NGX_LOG_INFO, pc->log, 0,[m
[31m-                      "postgres: keepalive connection pool is full,"[m
[31m-                      " rejecting request to upstream \"%V\"", &peer->name);[m
[31m-[m
[31m-        /* a bit hack-ish way to return error response (setup part) */[m
[31m-        pc->connection = ngx_get_connection(0, pc->log);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-        pgctx->status = NGX_HTTP_SERVICE_UNAVAILABLE;[m
[31m-#endif[m
[31m-[m
[31m-        dd("returning NGX_AGAIN (NGX_HTTP_SERVICE_UNAVAILABLE)");[m
[31m-        return NGX_AGAIN;[m
[31m-    }[m
[31m-[m
[31m-    /* sizeof("...") - 1 + 1 (for spaces and '\0' omitted */[m
[31m-    len = sizeof("hostaddr=") + peer->host.len[m
[31m-        + sizeof("port=") + sizeof("65535") - 1[m
[31m-        + sizeof("dbname=") + peer->dbname.len[m
[31m-        + sizeof("user=") + peer->user.len[m
[31m-        + sizeof("password=") + peer->password.len[m
[31m-        + sizeof("sslmode=disable");[m
[31m-[m
[31m-    connstring = ngx_pnalloc(pgdt->request->pool, len);[m
[31m-    if (connstring == NULL) {[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-#else[m
[31m-        goto failed;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-    /* TODO add unix sockets */[m
[31m-    last = ngx_snprintf(connstring, len - 1,[m
[31m-                        "hostaddr=%V port=%d dbname=%V user=%V password=%V"[m
[31m-                        " sslmode=disable",[m
[31m-                        &peer->host, peer->port, &peer->dbname, &peer->user,[m
[31m-                        &peer->password);[m
[31m-    *last = '\0';[m
[31m-[m
[31m-    dd("PostgreSQL connection string: %s", connstring);[m
[31m-[m
[31m-    /*[m
[31m-     * internal checks in PQsetnonblocking are taking care of any[m
[31m-     * PQconnectStart failures, so we don't need to check them here.[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "postgres: connecting");[m
[31m-[m
[31m-    pgdt->pgconn = PQconnectStart((const char *)connstring);[m
[31m-    if (PQsetnonblocking(pgdt->pgconn, 1) == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                      "postgres: connection failed: %s in upstream \"%V\"",[m
[31m-                      PQerrorMessage(pgdt->pgconn), &peer->name);[m
[31m-[m
[31m-        PQfinish(pgdt->pgconn);[m
[31m-        pgdt->pgconn = NULL;[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-        dd("returning NGX_DECLINED");[m
[31m-        return NGX_DECLINED;[m
[31m-#else[m
[31m-        pgctx->status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        goto failed;[m
[31m-#endif[m
[31m-    }[m
[31m-[m
[31m-#if defined(DDEBUG) && (DDEBUG > 1)[m
[31m-    PQtrace(pgdt->pgconn, stderr);[m
[31m-#endif[m
[31m-[m
[31m-    dd("connection status:%d", (int) PQstatus(pgdt->pgconn));[m
[31m-[m
[31m-    /* take spot in keepalive connection pool */[m
[31m-    pgscf->active_conns++;[m
[31m-[m
[31m-    /* add the file descriptor (fd) into an nginx connection structure */[m
[31m-[m
[31m-    fd = PQsocket(pgdt->pgconn);[m
[31m-    if (fd == -1) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                      "postgres: failed to get connection fd");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,[m
[31m-                   "postgres: connection fd:%d", fd);[m
[31m-[m
[31m-    pgxc = pc->connection = ngx_get_connection(fd, pc->log);[m
[31m-[m
[31m-    if (pgxc == NULL) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                      "postgres: failed to get a free nginx connection");[m
[31m-[m
[31m-        goto invalid;[m
[31m-    }[m
[31m-[m
[31m-    pgxc->log = pc->log;[m
[31m-    pgxc->log_error = pc->log_error;[m
[31m-    pgxc->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);[m
[31m-[m
[31m-    rev = pgxc->read;[m
[31m-    wev = pgxc->write;[m
[31m-[m
[31m-    rev->log = pc->log;[m
[31m-    wev->log = pc->log;[m
[31m-[m
[31m-    /* register the connection with postgres connection fd into the[m
[31m-     * nginx event model */[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {[m
[31m-        dd("NGX_USE_RTSIG_EVENT");[m
[31m-        if (ngx_add_conn(pgxc) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-[m
[31m-    } else if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {[m
[31m-        dd("NGX_USE_CLEAR_EVENT");[m
[31m-        if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_CLEAR_EVENT) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-[m
[31m-    } else {[m
[31m-        dd("NGX_USE_LEVEL_EVENT");[m
[31m-        if (ngx_add_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT) != NGX_OK) {[m
[31m-            goto bad_add;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    pgxc->log->action = "connecting to PostgreSQL database";[m
[31m-    pgdt->state = state_db_connect;[m
[31m-[m
[31m-    dd("returning NGX_AGAIN");[m
[31m-    return NGX_AGAIN;[m
[31m-[m
[31m-bad_add:[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_ERR, pc->log, 0,[m
[31m-                  "postgres: failed to add nginx connection");[m
[31m-[m
[31m-invalid:[m
[31m-[m
[31m-    ngx_postgres_upstream_free_connection(pc->log, pc->connection,[m
[31m-                                          pgdt->pgconn, pgscf);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 8017)[m
[31m-    dd("returning NGX_ERROR");[m
[31m-    return NGX_ERROR;[m
[31m-#else[m
[31m-[m
[31m-failed:[m
[31m-[m
[31m-    /* a bit hack-ish way to return error response (setup part) */[m
[31m-    pc->connection = ngx_get_connection(0, pc->log);[m
[31m-[m
[31m-    dd("returning NGX_AGAIN (NGX_ERROR)");[m
[31m-    return NGX_AGAIN;[m
[31m-#endif[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_upstream_free_peer(ngx_peer_connection_t *pc,[m
[31m-    void *data, ngx_uint_t state)[m
[31m-{[m
[31m-    ngx_postgres_upstream_peer_data_t  *pgdt = data;[m
[31m-    ngx_postgres_upstream_srv_conf_t   *pgscf;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version < 8017)[m
[31m-    if (data == NULL) {[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    pgscf = pgdt->srv_conf;[m
[31m-[m
[31m-    if (pgscf->max_cached) {[m
[31m-        ngx_postgres_keepalive_free_peer(pc, pgdt, pgscf, state);[m
[31m-    }[m
[31m-[m
[31m-    if (pc->connection) {[m
[31m-        dd("free connection to PostgreSQL database");[m
[31m-[m
[31m-        ngx_postgres_upstream_free_connection(pc->log, pc->connection,[m
[31m-                pgdt->pgconn, pgscf);[m
[31m-[m
[31m-        pgdt->pgconn = NULL;[m
[31m-        pc->connection = NULL;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-ngx_flag_t[m
[31m-ngx_postgres_upstream_is_my_peer(const ngx_peer_connection_t *peer)[m
[31m-{[m
[31m-    dd("entering & returning");[m
[31m-    return (peer->get == ngx_postgres_upstream_get_peer);[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_upstream_free_connection(ngx_log_t *log, ngx_connection_t *c,[m
[31m-    PGconn *pgconn, ngx_postgres_upstream_srv_conf_t *pgscf)[m
[31m-{[m
[31m-    ngx_event_t  *rev, *wev;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    PQfinish(pgconn);[m
[31m-[m
[31m-    if (c) {[m
[31m-        rev = c->read;[m
[31m-        wev = c->write;[m
[31m-[m
[31m-        if (rev->timer_set) {[m
[31m-            ngx_del_timer(rev);[m
[31m-        }[m
[31m-[m
[31m-        if (wev->timer_set) {[m
[31m-            ngx_del_timer(wev);[m
[31m-        }[m
[31m-[m
[31m-        if (ngx_del_conn) {[m
[31m-           ngx_del_conn(c, NGX_CLOSE_EVENT);[m
[31m-        } else {[m
[31m-            if (rev->active || rev->disabled) {[m
[31m-                ngx_del_event(rev, NGX_READ_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-[m
[31m-            if (wev->active || wev->disabled) {[m
[31m-                ngx_del_event(wev, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (rev->posted) {[m
[31m-#else[m
[31m-        if (rev->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(rev);[m
[31m-        }[m
[31m-[m
[31m-#if defined(nginx_version) && nginx_version >= 1007005[m
[31m-        if (wev->posted) {[m
[31m-#else[m
[31m-        if (wev->prev) {[m
[31m-#endif[m
[31m-            ngx_delete_posted_event(wev);[m
[31m-        }[m
[31m-[m
[31m-        rev->closed = 1;[m
[31m-        wev->closed = 1;[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        if (c->pool) {[m
[31m-            ngx_destroy_pool(c->pool);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_free_connection(c);[m
[31m-[m
[31m-        c->fd = (ngx_socket_t) -1;[m
[31m-    }[m
[31m-[m
[31m-    /* free spot in keepalive connection pool */[m
[31m-    pgscf->active_conns--;[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.h[m
[1mdeleted file mode 100644[m
[1mindex 9ad46ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_upstream.h[m
[1m+++ /dev/null[m
[36m@@ -1,74 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Xiaozhe Wang <chaoslawful@gmail.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_HTTP_UPSTREAM_POSTGRES_H_[m
[31m-#define _NGX_HTTP_UPSTREAM_POSTGRES_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    state_db_connect,[m
[31m-    state_db_send_query,[m
[31m-    state_db_get_result,[m
[31m-    state_db_get_ack,[m
[31m-    state_db_idle[m
[31m-} ngx_postgres_state_t;[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_postgres_upstream_srv_conf_t  *srv_conf;[m
[31m-    ngx_postgres_loc_conf_t           *loc_conf;[m
[31m-    ngx_http_upstream_t               *upstream;[m
[31m-    ngx_http_request_t                *request;[m
[31m-    PGconn                            *pgconn;[m
[31m-    ngx_postgres_state_t               state;[m
[31m-    ngx_str_t                          query;[m
[31m-    ngx_str_t                          name;[m
[31m-    struct sockaddr                    sockaddr;[m
[31m-    unsigned                           failed;[m
[31m-} ngx_postgres_upstream_peer_data_t;[m
[31m-[m
[31m-[m
[31m-ngx_int_t   ngx_postgres_upstream_init(ngx_conf_t *,[m
[31m-                ngx_http_upstream_srv_conf_t *);[m
[31m-ngx_int_t   ngx_postgres_upstream_init_peer(ngx_http_request_t *,[m
[31m-                ngx_http_upstream_srv_conf_t *);[m
[31m-ngx_int_t   ngx_postgres_upstream_get_peer(ngx_peer_connection_t *, void *);[m
[31m-void        ngx_postgres_upstream_free_peer(ngx_peer_connection_t *, void *,[m
[31m-                ngx_uint_t);[m
[31m-ngx_flag_t  ngx_postgres_upstream_is_my_peer(const ngx_peer_connection_t *);[m
[31m-void        ngx_postgres_upstream_free_connection(ngx_log_t *,[m
[31m-                ngx_connection_t *, PGconn *,[m
[31m-                ngx_postgres_upstream_srv_conf_t *);[m
[31m-[m
[31m-[m
[31m-#endif /* _NGX_HTTP_UPSTREAM_POSTGRES_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_util.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_util.c[m
[1mdeleted file mode 100644[m
[1mindex ae7de38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_util.c[m
[1m+++ /dev/null[m
[36m@@ -1,406 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * Copyright (C) 2002-2010, Igor Sysoev[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include <nginx.h>[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_util.h"[m
[31m-[m
[31m-[m
[31m-/*[m
[31m- * All functions in this file are copied directly from ngx_http_upstream.c,[m
[31m- * beacuse they are declared as static there.[m
[31m- */[m
[31m-[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_upstream_finalize_request(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t rc)[m
[31m-{[m
[31m-#if defined(nginx_version) && (nginx_version < 1009001)[m
[31m-    ngx_time_t  *tp;[m
[31m-#endif[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "finalize http upstream request: %i", rc);[m
[31m-[m
[31m-    if (u->cleanup) {[m
[31m-        *u->cleanup = NULL;[m
[31m-    }[m
[31m-[m
[31m-    if (u->resolved && u->resolved->ctx) {[m
[31m-        ngx_resolve_name_done(u->resolved->ctx);[m
[31m-        u->resolved->ctx = NULL;[m
[31m-    }[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1009001)[m
[31m-    if (u->state && u->state->response_time) {[m
[31m-        u->state->response_time = ngx_current_msec - u->state->response_time;[m
[31m-#else[m
[31m-    if (u->state && u->state->response_sec) {[m
[31m-        tp = ngx_timeofday();[m
[31m-        u->state->response_sec = tp->sec - u->state->response_sec;[m
[31m-        u->state->response_msec = tp->msec - u->state->response_msec;[m
[31m-#endif[m
[31m-[m
[31m-        if (u->pipe) {[m
[31m-            u->state->response_length = u->pipe->read_length;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->finalize_request) {[m
[31m-        u->finalize_request(r, rc);[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.free) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, 0);[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-[m
[31m-#if 0 /* we don't support SSL at this time, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-        /* TODO: do not shutdown persistent connection */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-[m
[31m-            /*[m
[31m-             * We send the "close notify" shutdown alert to the upstream only[m
[31m-             * and do not wait its "close notify" shutdown alert.[m
[31m-             * It is acceptable according to the TLS standard.[m
[31m-             */[m
[31m-[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-    u->peer.connection = NULL;[m
[31m-[m
[31m-    if (u->pipe && u->pipe->temp_file) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "http upstream temp fd: %d",[m
[31m-                       u->pipe->temp_file->file.fd);[m
[31m-    }[m
[31m-[m
[31m-    if (u->header_sent[m
[31m-        && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))[m
[31m-    {[m
[31m-        rc = 0;[m
[31m-    }[m
[31m-[m
[31m-    if (rc == NGX_DECLINED) {[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    r->connection->log->action = "sending to client";[m
[31m-[m
[31m-    if (rc == 0) {[m
[31m-        rc = ngx_http_send_special(r, NGX_HTTP_LAST);[m
[31m-    }[m
[31m-[m
[31m-    ngx_http_finalize_request(r, rc);[m
[31m-[m
[31m-    dd("returning");[m
[31m-}[m
[31m-[m
[31m-void[m
[31m-ngx_postgres_upstream_next(ngx_http_request_t *r,[m
[31m-    ngx_http_upstream_t *u, ngx_int_t ft_type)[m
[31m-{[m
[31m-    ngx_uint_t  status, state;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                   "http next upstream, %xi", ft_type);[m
[31m-[m
[31m-#if 0[m
[31m-    ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);[m
[31m-#endif[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {[m
[31m-        state = NGX_PEER_NEXT;[m
[31m-    } else {[m
[31m-        state = NGX_PEER_FAILED;[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type != NGX_HTTP_UPSTREAM_FT_NOLIVE) {[m
[31m-        u->peer.free(&u->peer, u->peer.data, state);[m
[31m-    }[m
[31m-[m
[31m-    if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {[m
[31m-        ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,[m
[31m-                      "upstream timed out");[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {[m
[31m-        status = 0;[m
[31m-[m
[31m-    } else {[m
[31m-        switch(ft_type) {[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_TIMEOUT:[m
[31m-            status = NGX_HTTP_GATEWAY_TIME_OUT;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_HTTP_500:[m
[31m-            status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-            break;[m
[31m-[m
[31m-        case NGX_HTTP_UPSTREAM_FT_HTTP_404:[m
[31m-            status = NGX_HTTP_NOT_FOUND;[m
[31m-            break;[m
[31m-[m
[31m-        /*[m
[31m-         * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING[m
[31m-         * never reach here[m
[31m-         */[m
[31m-[m
[31m-        default:[m
[31m-            status = NGX_HTTP_BAD_GATEWAY;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (r->connection->error) {[m
[31m-        ngx_postgres_upstream_finalize_request(r, u,[m
[31m-                                               NGX_HTTP_CLIENT_CLOSED_REQUEST);[m
[31m-[m
[31m-        dd("returning");[m
[31m-        return;[m
[31m-    }[m
[31m-[m
[31m-    if (status) {[m
[31m-        u->state->status = status;[m
[31m-[m
[31m-        if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type)) {[m
[31m-            ngx_postgres_upstream_finalize_request(r, u, status);[m
[31m-[m
[31m-            dd("returning");[m
[31m-            return;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if (u->peer.connection) {[m
[31m-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,[m
[31m-                       "close http upstream connection: %d",[m
[31m-                       u->peer.connection->fd);[m
[31m-[m
[31m-#if 0 /* we don't support SSL at this time, was: (NGX_HTTP_SSL) */[m
[31m-[m
[31m-        if (u->peer.connection->ssl) {[m
[31m-            u->peer.connection->ssl->no_wait_shutdown = 1;[m
[31m-            u->peer.connection->ssl->no_send_shutdown = 1;[m
[31m-[m
[31m-            (void) ngx_ssl_shutdown(u->peer.connection);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-#if defined(nginx_version) && (nginx_version >= 1001004)[m
[31m-        if (u->peer.connection->pool) {[m
[31m-            ngx_destroy_pool(u->peer.connection->pool);[m
[31m-        }[m
[31m-#endif[m
[31m-[m
[31m-        ngx_close_connection(u->peer.connection);[m
[31m-    }[m
[31m-[m
[31m-#if 0[m
[31m-    if (u->conf->busy_lock && !u->busy_locked) {[m
[31m-        ngx_http_upstream_busy_lock(p);[m
[31m-        return;[m
[31m-    }[m
[31m-#endif[m
[31m-[m
[31m-    /* TODO: ngx_http_upstream_connect(r, u); */[m
[31m-    if (status == 0) {[m
[31m-        status = NGX_HTTP_INTERNAL_SERVER_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    dd("returning");[m
[31m-    return ngx_postgres_upstream_finalize_request(r, u, status);[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_upstream_test_connect(ngx_connection_t *c)[m
[31m-{[m
[31m-    int        err;[m
[31m-    socklen_t  len;[m
[31m-[m
[31m-    dd("entering");[m
[31m-[m
[31m-#if (NGX_HAVE_KQUEUE)[m
[31m-[m
[31m-    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {[m
[31m-        if (c->write->pending_eof) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, c->write->kq_errno,[m
[31m-                       "kevent() reported that connect() failed");[m
[31m-[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-[m
[31m-    } else[m
[31m-#endif[m
[31m-    {[m
[31m-        err = 0;[m
[31m-        len = sizeof(int);[m
[31m-[m
[31m-        /*[m
[31m-         * BSDs and Linux return 0 and set a pending error in err[m
[31m-         * Solaris returns -1 and sets errno[m
[31m-         */[m
[31m-[m
[31m-        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len) == -1)[m
[31m-        {[m
[31m-            err = ngx_errno;[m
[31m-        }[m
[31m-[m
[31m-        if (err) {[m
[31m-            c->log->action = "connecting to upstream";[m
[31m-            (void) ngx_connection_error(c, err, "connect() failed");[m
[31m-[m
[31m-            dd("returning NGX_ERROR");[m
[31m-            return NGX_ERROR;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v,[m
[31m-    uintptr_t data)[m
[31m-{[m
[31m-    ngx_http_variable_t              *var;[m
[31m-    ngx_http_core_main_conf_t        *cmcf;[m
[31m-    ngx_postgres_rewrite_loc_conf_t  *rlcf;[m
[31m-[m
[31m-    rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module);[m
[31m-[m
[31m-    if (rlcf->uninitialized_variable_warn == 0) {[m
[31m-        *v = ngx_http_variable_null_value;[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-    var = cmcf->variables.elts;[m
[31m-[m
[31m-    /*[m
[31m-     * the ngx_http_rewrite_module sets variables directly in r->variables,[m
[31m-     * and they should be handled by ngx_http_get_indexed_variable(),[m
[31m-     * so the handler is called only if the variable is not initialized[m
[31m-     */[m
[31m-[m
[31m-    ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,[m
[31m-                  "using uninitialized \"%V\" variable", &var[data].name);[m
[31m-[m
[31m-    *v = ngx_http_variable_null_value;[m
[31m-[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-char *[m
[31m-ngx_postgres_rewrite_value(ngx_conf_t *cf, ngx_postgres_rewrite_loc_conf_t *lcf,[m
[31m-    ngx_str_t *value)[m
[31m-{[m
[31m-    ngx_int_t                              n;[m
[31m-    ngx_http_script_compile_t              sc;[m
[31m-    ngx_http_script_value_code_t          *val;[m
[31m-    ngx_http_script_complex_value_code_t  *complex;[m
[31m-[m
[31m-    n = ngx_http_script_variables_count(value);[m
[31m-[m
[31m-    if (n == 0) {[m
[31m-        val = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                         sizeof(ngx_http_script_value_code_t));[m
[31m-        if (val == NULL) {[m
[31m-            return NGX_CONF_ERROR;[m
[31m-        }[m
[31m-[m
[31m-        n = ngx_atoi(value->data, value->len);[m
[31m-[m
[31m-        if (n == NGX_ERROR) {[m
[31m-            n = 0;[m
[31m-        }[m
[31m-[m
[31m-        val->code = ngx_http_script_value_code;[m
[31m-        val->value = (uintptr_t) n;[m
[31m-        val->text_len = (uintptr_t) value->len;[m
[31m-        val->text_data = (uintptr_t) value->data;[m
[31m-[m
[31m-        return NGX_CONF_OK;[m
[31m-    }[m
[31m-[m
[31m-    complex = ngx_http_script_start_code(cf->pool, &lcf->codes,[m
[31m-                                 sizeof(ngx_http_script_complex_value_code_t));[m
[31m-    if (complex == NULL) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    complex->code = ngx_http_script_complex_value_code;[m
[31m-    complex->lengths = NULL;[m
[31m-[m
[31m-    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));[m
[31m-[m
[31m-    sc.cf = cf;[m
[31m-    sc.source = value;[m
[31m-    sc.lengths = &complex->lengths;[m
[31m-    sc.values = &lcf->codes;[m
[31m-    sc.variables = n;[m
[31m-    sc.complete_lengths = 1;[m
[31m-[m
[31m-    if (ngx_http_script_compile(&sc) != NGX_OK) {[m
[31m-        return NGX_CONF_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    return NGX_CONF_OK;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_util.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_util.h[m
[1mdeleted file mode 100644[m
[1mindex 02938a9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_util.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * Copyright (c) 2009-2010, Yichun Zhang <agentzh@gmail.com>[m
[31m- * Copyright (C) 2002-2010, Igor Sysoev[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND[m
[31m- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE[m
[31m- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE[m
[31m- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE[m
[31m- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL[m
[31m- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS[m
[31m- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)[m
[31m- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT[m
[31m- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY[m
[31m- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF[m
[31m- * SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_UTIL_H_[m
[31m-#define _NGX_POSTGRES_UTIL_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-[m
[31m-[m
[31m-extern ngx_module_t  ngx_http_rewrite_module;[m
[31m-[m
[31m-[m
[31m-typedef struct {[m
[31m-    ngx_array_t  *codes;        /* uintptr_t */[m
[31m-[m
[31m-    ngx_uint_t    stack_size;[m
[31m-[m
[31m-    ngx_flag_t    log;[m
[31m-    ngx_flag_t    uninitialized_variable_warn;[m
[31m-} ngx_postgres_rewrite_loc_conf_t;[m
[31m-[m
[31m-[m
[31m-void       ngx_postgres_upstream_finalize_request(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *, ngx_int_t);[m
[31m-void       ngx_postgres_upstream_next(ngx_http_request_t *,[m
[31m-               ngx_http_upstream_t *, ngx_int_t);[m
[31m-ngx_int_t  ngx_postgres_upstream_test_connect(ngx_connection_t *);[m
[31m-[m
[31m-ngx_int_t  ngx_postgres_rewrite_var(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-char      *ngx_postgres_rewrite_value(ngx_conf_t *,[m
[31m-               ngx_postgres_rewrite_loc_conf_t *, ngx_str_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_UTIL_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_variable.c b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_variable.c[m
[1mdeleted file mode 100644[m
[1mindex e7f4f38..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_variable.c[m
[1m+++ /dev/null[m
[36m@@ -1,288 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef DDEBUG[m
[31m-#define DDEBUG 0[m
[31m-#endif[m
[31m-[m
[31m-#include "ngx_postgres_ddebug.h"[m
[31m-#include "ngx_postgres_module.h"[m
[31m-#include "ngx_postgres_variable.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_columns(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering: \"$postgres_columns\"");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->var_cols == NGX_ERROR)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%i", pgctx->var_cols) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_rows(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering: \"$postgres_rows\"");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->var_rows == NGX_ERROR)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%i", pgctx->var_rows) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_affected(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering: \"$postgres_affected\"");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->var_affected == NGX_ERROR)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN);[m
[31m-    if (v->data == NULL) {[m
[31m-        dd("returning NGX_ERROR");[m
[31m-        return NGX_ERROR;[m
[31m-    }[m
[31m-[m
[31m-    v->len = ngx_sprintf(v->data, "%i", pgctx->var_affected) - v->data;[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_query(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_ctx_t  *pgctx;[m
[31m-[m
[31m-    dd("entering: \"$postgres_query\"");[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->var_query.len == 0)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = pgctx->var_query.len;[m
[31m-    v->data = pgctx->var_query.data;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_int_t[m
[31m-ngx_postgres_variable_get_custom(ngx_http_request_t *r,[m
[31m-    ngx_http_variable_value_t *v, uintptr_t data)[m
[31m-{[m
[31m-    ngx_postgres_variable_t  *pgvar = (ngx_postgres_variable_t *) data;[m
[31m-    ngx_postgres_ctx_t       *pgctx;[m
[31m-    ngx_str_t                *store;[m
[31m-[m
[31m-    dd("entering: \"$%.*s\"", (int) pgvar->var->name.len,[m
[31m-                              pgvar->var->name.data);[m
[31m-[m
[31m-    pgctx = ngx_http_get_module_ctx(r, ngx_postgres_module);[m
[31m-[m
[31m-    if ((pgctx == NULL) || (pgctx->variables == NULL)) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    store = pgctx->variables->elts;[m
[31m-[m
[31m-    /* idx is always valid */[m
[31m-    if (store[pgvar->idx].len == 0) {[m
[31m-        v->not_found = 1;[m
[31m-        dd("returning NGX_OK (not_found)");[m
[31m-        return NGX_OK;[m
[31m-    }[m
[31m-[m
[31m-    v->valid = 1;[m
[31m-    v->no_cacheable = 0;[m
[31m-    v->not_found = 0;[m
[31m-    v->len = store[pgvar->idx].len;[m
[31m-    v->data = store[pgvar->idx].data;[m
[31m-[m
[31m-    dd("returning NGX_OK");[m
[31m-    return NGX_OK;[m
[31m-}[m
[31m-[m
[31m-ngx_str_t[m
[31m-ngx_postgres_variable_set_custom(ngx_http_request_t *r, PGresult *res,[m
[31m-    ngx_postgres_variable_t *pgvar)[m
[31m-{[m
[31m-    ngx_http_core_loc_conf_t  *clcf;[m
[31m-    ngx_postgres_value_t      *pgv;[m
[31m-    ngx_int_t                  col_count, row_count, col, len;[m
[31m-    ngx_str_t                  value = ngx_null_string;[m
[31m-[m
[31m-    dd("entering: \"$%.*s\"", (int) pgvar->var->name.len,[m
[31m-                              pgvar->var->name.data);[m
[31m-[m
[31m-    col_count = PQnfields(res);[m
[31m-    row_count = PQntuples(res);[m
[31m-[m
[31m-    pgv = &pgvar->value;[m
[31m-[m
[31m-    if (pgv->column != NGX_ERROR) {[m
[31m-        /* get column by number */[m
[31m-        col = pgv->column;[m
[31m-    } else {[m
[31m-        /* get column by name */[m
[31m-        col = PQfnumber(res, (char const *) pgv->col_name);[m
[31m-        if (col == NGX_ERROR) {[m
[31m-            if (pgv->required) {[m
[31m-                clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                              "postgres: \"postgres_set\" for variable \"$%V\""[m
[31m-                              " requires value from column \"%s\" that wasn't"[m
[31m-                              " found in the received result-set in location"[m
[31m-                              " \"%V\"",[m
[31m-                              &pgvar->var->name, pgv->col_name, &clcf->name);[m
[31m-            }[m
[31m-[m
[31m-            dd("returning empty value");[m
[31m-            return value;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-    if ((pgv->row >= row_count) || (col >= col_count)) {[m
[31m-        if (pgv->required) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: \"postgres_set\" for variable \"$%V\""[m
[31m-                          " requires value out of range of the received"[m
[31m-                          " result-set (rows:%d cols:%d) in location \"%V\"",[m
[31m-                          &pgvar->var->name, row_count, col_count, &clcf->name);[m
[31m-        }[m
[31m-[m
[31m-        dd("returning empty value");[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    if (PQgetisnull(res, pgv->row, col)) {[m
[31m-        if (pgv->required) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: \"postgres_set\" for variable \"$%V\""[m
[31m-                          " requires non-NULL value in location \"%V\"",[m
[31m-                          &pgvar->var->name, &clcf->name);[m
[31m-        }[m
[31m-[m
[31m-        dd("returning empty value");[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    len = PQgetlength(res, pgv->row, col);[m
[31m-    if (len == 0) {[m
[31m-        if (pgv->required) {[m
[31m-            clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);[m
[31m-[m
[31m-            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,[m
[31m-                          "postgres: \"postgres_set\" for variable \"$%V\""[m
[31m-                          " requires non-zero length value in location \"%V\"",[m
[31m-                          &pgvar->var->name, &clcf->name);[m
[31m-        }[m
[31m-[m
[31m-        dd("returning empty value");[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    value.data = ngx_pnalloc(r->pool, len);[m
[31m-    if (value.data == NULL) {[m
[31m-        dd("returning empty value");[m
[31m-        return value;[m
[31m-    }[m
[31m-[m
[31m-    ngx_memcpy(value.data, PQgetvalue(res, pgv->row, col), len);[m
[31m-    value.len = len;[m
[31m-[m
[31m-    dd("returning non-empty value");[m
[31m-    return value;[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_variable.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_variable.h[m
[1mdeleted file mode 100644[m
[1mindex abdb199..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/ngx_postgres_variable.h[m
[1m+++ /dev/null[m
[36m@@ -1,50 +0,0 @@[m
[31m-/*[m
[31m- * Copyright (c) 2010, FRiCKLE Piotr Sikora <info@frickle.com>[m
[31m- * All rights reserved.[m
[31m- *[m
[31m- * Redistribution and use in source and binary forms, with or without[m
[31m- * modification, are permitted provided that the following conditions[m
[31m- * are met:[m
[31m- * 1. Redistributions of source code must retain the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer.[m
[31m- * 2. Redistributions in binary form must reproduce the above copyright[m
[31m- *    notice, this list of conditions and the following disclaimer in the[m
[31m- *    documentation and/or other materials provided with the distribution.[m
[31m- *[m
[31m- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT[m
[31m- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,[m
[31m- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY[m
[31m- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT[m
[31m- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE[m
[31m- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m- */[m
[31m-[m
[31m-#ifndef _NGX_POSTGRES_VARIABLE_H_[m
[31m-#define _NGX_POSTGRES_VARIABLE_H_[m
[31m-[m
[31m-#include <ngx_core.h>[m
[31m-#include <ngx_http.h>[m
[31m-#include <libpq-fe.h>[m
[31m-[m
[31m-#include "ngx_postgres_module.h"[m
[31m-[m
[31m-[m
[31m-ngx_int_t  ngx_postgres_variable_columns(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_postgres_variable_rows(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_postgres_variable_affected(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_postgres_variable_query(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_int_t  ngx_postgres_variable_get_custom(ngx_http_request_t *,[m
[31m-               ngx_http_variable_value_t *, uintptr_t);[m
[31m-ngx_str_t  ngx_postgres_variable_set_custom(ngx_http_request_t *r,[m
[31m-               PGresult *, ngx_postgres_variable_t *);[m
[31m-[m
[31m-#endif /* _NGX_POSTGRES_VARIABLE_H_ */[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/resty_dbd_stream.h b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/resty_dbd_stream.h[m
[1mdeleted file mode 100644[m
[1mindex ebb0cb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/src/resty_dbd_stream.h[m
[1m+++ /dev/null[m
[36m@@ -1,59 +0,0 @@[m
[31m-#ifndef RESTY_DBD_STREAME_H[m
[31m-#define RESTY_DBD_STREAME_H[m
[31m-[m
[31m-#define resty_dbd_stream_version 3[m
[31m-#define resty_dbd_stream_version_string "0.0.3"[m
[31m-[m
[31m-#define rds_content_type \[m
[31m-    "application/x-resty-dbd-stream"[m
[31m-[m
[31m-#define rds_content_type_len \[m
[31m-    (sizeof(rds_content_type) - 1)[m
[31m-[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_rough_col_type_int = 0 << 14,[m
[31m-    rds_rough_col_type_float = 1 << 14,[m
[31m-    rds_rough_col_type_str = 2 << 14,[m
[31m-    rds_rough_col_type_bool = 3 << 14[m
[31m-[m
[31m-} rds_rough_col_type_t;[m
[31m-[m
[31m-[m
[31m-/* The following types (or spellings thereof) are specified[m
[31m- * by SQL:[m
[31m- * bigint, bit, bit varying, boolean, char, character varying,[m
[31m- * character, varchar, date, double precision, integer,[m
[31m- * interval, numeric, decimal, real, smallint,[m
[31m- * time (with or without time zone),[m
[31m- * timestamp (with or without time zone), xml */[m
[31m-[m
[31m-typedef enum {[m
[31m-    rds_col_type_unknown = 0 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bigint = 1 | rds_rough_col_type_int,[m
[31m-    rds_col_type_bit = 2 | rds_rough_col_type_str,[m
[31m-    rds_col_type_bit_varying = 3 | rds_rough_col_type_str,[m
[31m-[m
[31m-    rds_col_type_bool = 4 | rds_rough_col_type_bool,[m
[31m-    rds_col_type_char = 5 | rds_rough_col_type_str,[m
[31m-    rds_col_type_varchar = 6 | rds_rough_col_type_str,[m
[31m-    rds_col_type_date = 7 | rds_rough_col_type_str,[m
[31m-    rds_col_type_double = 8 | rds_rough_col_type_float,[m
[31m-    rds_col_type_integer = 9 | rds_rough_col_type_int,[m
[31m-    rds_col_type_interval = 10 | rds_rough_col_type_float,[m
[31m-    rds_col_type_decimal = 11 | rds_rough_col_type_float,[m
[31m-    rds_col_type_real = 12 | rds_rough_col_type_float,[m
[31m-    rds_col_type_smallint = 13 | rds_rough_col_type_int,[m
[31m-    rds_col_type_time_with_time_zone = 14 | rds_rough_col_type_str,[m
[31m-    rds_col_type_time = 15 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp_with_time_zone = 16 | rds_rough_col_type_str,[m
[31m-    rds_col_type_timestamp = 17 | rds_rough_col_type_str,[m
[31m-    rds_col_type_xml = 18 | rds_rough_col_type_str,[m
[31m-[m
[31m-    /* our additions */[m
[31m-    rds_col_type_blob = 19 | rds_rough_col_type_str[m
[31m-[m
[31m-} rds_col_type_t;[m
[31m-[m
[31m-#endif /* RESTY_DBD_STREAME_H */[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/000_init.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/000_init.t[m
[1mdeleted file mode 100644[m
[1mindex 832244e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/000_init.t[m
[1m+++ /dev/null[m
[36m@@ -1,174 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * 2 * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: cats - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "DROP TABLE cats";[m
[31m-        error_page 500  = /ignore;[m
[31m-    }[m
[31m-[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: cats - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "CREATE TABLE cats (id integer, name text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO cats (id) VALUES (2)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: cats - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO cats (id, name) VALUES (3, 'bob')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: numbers - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "DROP TABLE numbers";[m
[31m-        error_page 500  = /ignore;[m
[31m-    }[m
[31m-[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: numbers - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "CREATE TABLE numbers (number integer)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: users - drop table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "DROP TABLE users";[m
[31m-        error_page 500  = /ignore;[m
[31m-    }[m
[31m-[m
[31m-    location /ignore { echo "ignore"; }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: users - create table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "CREATE TABLE users (login text, pass text)";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: users - insert value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /init {[m
[31m-        postgres_pass   database;[m
[31m-        postgres_query  "INSERT INTO users (login, pass) VALUES ('ngx_test', 'ngx_test')";[m
[31m-    }[m
[31m---- request[m
[31m-GET /init[m
[31m---- error_code: 200[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/auth.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/auth.t[m
[1mdeleted file mode 100644[m
[1mindex 40468e4..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/auth.t[m
[1m+++ /dev/null[m
[36m@@ -1,110 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 2 * 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: authorized (auth basic)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select login from users where login=$user and pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_set        $login 0 0 required;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        auth_request        /auth;[m
[31m-        auth_request_set    $auth_user $login;[m
[31m-        echo -n             "hi, $auth_user!";[m
[31m-    }[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-hi, ngx_test![m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: unauthorized (auth basic)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select login from users where login=$user and pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_set        $login 0 0 required;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        auth_request        /auth;[m
[31m-        auth_request_set    $auth_user $login;[m
[31m-        echo -n             "hi, $auth_user!";[m
[31m-    }[m
[31m---- more_headers[m
[31m-Authorization: Basic bW9udHk6c29tZV9wYXNz[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 403[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: unauthorized (no authorization header)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select login from users where login=$user and pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_set        $login 0 0 required;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location /test {[m
[31m-        auth_request        /auth;[m
[31m-        auth_request_set    $auth_user $login;[m
[31m-        echo -n             "hi, $auth_user!";[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 403[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/bigpipe.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/bigpipe.t[m
[1mdeleted file mode 100644[m
[1mindex 4ee951d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/bigpipe.t[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: synchronous[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-        location /bigpipe {[m
[31m-            echo                 "<html>(...template with javascript and divs...)";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location        /_query1;[m
[31m-            echo                 ")</script>";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location        /_query2;[m
[31m-            echo                 ")</script>";[m
[31m-            echo                 "</html>";[m
[31m-        }[m
[31m-[m
[31m-        location /_query1 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id ASC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m-[m
[31m-        location /_query2 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id DESC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m---- request[m
[31m-GET /bigpipe[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-<html>(...template with javascript and divs...)[m
[31m-<script type="text/javascript">loader.load([{"id":2,"name":null},{"id":3,"name":"bob"}])</script>[m
[31m-<script type="text/javascript">loader.load([{"id":3,"name":"bob"},{"id":2,"name":null}])</script>[m
[31m-</html>[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: asynchronous (without echo filter)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-        location /bigpipe {[m
[31m-            echo                 "<html>(...template with javascript and divs...)";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location_async  /_query1;[m
[31m-            echo                 ")</script>";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location_async  /_query2;[m
[31m-            echo                 ")</script>";[m
[31m-            echo                 "</html>";[m
[31m-        }[m
[31m-[m
[31m-        location /_query1 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id ASC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m-[m
[31m-        location /_query2 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id DESC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m---- request[m
[31m-GET /bigpipe[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-<html>(...template with javascript and divs...)[m
[31m-<script type="text/javascript">loader.load([{"id":2,"name":null},{"id":3,"name":"bob"}])</script>[m
[31m-<script type="text/javascript">loader.load([{"id":3,"name":"bob"},{"id":2,"name":null}])</script>[m
[31m-</html>[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 2: < 0.7.46[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: asynchronous (with echo filter)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-        location /bigpipe {[m
[31m-            echo_before_body     "<html>(...template with javascript and divs...)";[m
[31m-            echo_before_body -n  "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo -n              " "; # XXX we need this to help our echo filters[m
[31m-            echo_location_async  /_query1;[m
[31m-            echo                 ")</script>";[m
[31m-            echo -n              "<script type=\"text/javascript\">loader.load(";[m
[31m-            echo_location_async  /_query2;[m
[31m-            echo_after_body      ")</script>";[m
[31m-            echo_after_body      "</html>";[m
[31m-        }[m
[31m-[m
[31m-        location /_query1 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id ASC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m-[m
[31m-        location /_query2 {[m
[31m-            internal;[m
[31m-            postgres_pass        database;[m
[31m-            postgres_query       "SELECT * FROM cats ORDER BY id DESC";[m
[31m-            rds_json             on;[m
[31m-        }[m
[31m---- request[m
[31m-GET /bigpipe[m
[31m---- error_code: 200[m
[31m---- response_body[m
[31m-<html>(...template with javascript and divs...)[m
[31m-<script type="text/javascript">loader.load( [{"id":2,"name":null},{"id":3,"name":"bob"}])</script>[m
[31m-<script type="text/javascript">loader.load([{"id":3,"name":"bob"},{"id":2,"name":null}])</script>[m
[31m-</html>[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 2: < 0.7.46[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/errors.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/errors.t[m
[1mdeleted file mode 100644[m
[1mindex a502203..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/errors.t[m
[1m+++ /dev/null[m
[36m@@ -1,141 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * blocks();[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: bad query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "i'm bad";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: wrong credentials[m
[31m---- http_config[m
[31m-    upstream database {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=wrong_pass;[m
[31m-    }[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 502[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: no database[m
[31m---- http_config[m
[31m-    upstream database {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:1 dbname=ngx_test[m
[31m-                            user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 502[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: multiple queries[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats; select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: missing query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: empty query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        set $query          "";[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      $query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: empty pass[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        set $database       "";[m
[31m-        postgres_pass       $database;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: non-existing table[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update table_that_doesnt_exist set name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/escape.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/escape.t[m
[1mdeleted file mode 100644[m
[1mindex 8dad7f0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/escape.t[m
[1m+++ /dev/null[m
[36m@@ -1,361 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: '[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "he'llo";[m
[31m-        postgres_escape     $escaped $test;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'he''llo'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: \[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "he\\llo";[m
[31m-        postgres_escape     $escaped $test;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'he\\llo'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: \'[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "he\\'llo";[m
[31m-        postgres_escape     $escaped $test;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'he\\''llo'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: NULL[m
[31m---- config[m
[31m-    location /test {[m
[31m-        postgres_escape     $escaped $remote_user;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-NULL[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: empty string[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set $empty          "";[m
[31m-        postgres_escape     $escaped $empty;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-NULL[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: UTF-8[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set $utf8           "你好";[m
[31m-        postgres_escape     $escaped $utf8;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'你好'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: user arg[m
[31m---- config[m
[31m-    location /test {[m
[31m-        postgres_escape     $escaped $arg_say;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test?say=he'llo![m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'he''llo!'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: NULL (empty)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        postgres_escape     $escaped =$remote_user;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-''[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: empty string (empty)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set $empty          "";[m
[31m-        postgres_escape     $escaped =$empty;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-''[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: in-place escape[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "t'\\est";[m
[31m-        postgres_escape     $test;[m
[31m-        echo                $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'t''\\est'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: re-useable variable name (test1)[m
[31m---- config[m
[31m-    location /test1 {[m
[31m-        set                 $a "a";[m
[31m-        postgres_escape     $escaped $a;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m-    location /test2 {[m
[31m-        set                 $b "b";[m
[31m-        postgres_escape     $escaped $b;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test1[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'a'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: re-useable variable name (test2)[m
[31m---- config[m
[31m-    location /test1 {[m
[31m-        set                 $a "a";[m
[31m-        postgres_escape     $escaped $a;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m-    location /test2 {[m
[31m-        set                 $b "b";[m
[31m-        postgres_escape     $escaped $b;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test2[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'b'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: concatenate multiple sources[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "t'\\est";[m
[31m-        set                 $hello " he'llo";[m
[31m-        postgres_escape     $escaped "$test$hello world!";[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'t''\\est he''llo world!'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: concatenate multiple empty sources[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $a "";[m
[31m-        set                 $b "";[m
[31m-        postgres_escape     $escaped "$a$b";[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-NULL[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: concatenate multiple empty sources (empty)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $a "";[m
[31m-        set                 $b "";[m
[31m-        postgres_escape     $escaped "=$a$b";[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-''[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: in-place escape on empty string[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "";[m
[31m-        postgres_escape     $test;[m
[31m-        echo                $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-NULL[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: in-place escape on empty string (empty)[m
[31m---- config[m
[31m-    location /test {[m
[31m-        set                 $test "";[m
[31m-        postgres_escape     =$test;[m
[31m-        echo                $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-''[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: escape anonymous regex capture[m
[31m---- config[m
[31m-    location ~ /(.*) {[m
[31m-        postgres_escape     $escaped $1;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'test'[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: escape named regex capture[m
[31m---- config[m
[31m-    location ~ /(?<test>.*) {[m
[31m-        postgres_escape     $escaped $test;[m
[31m-        echo                $escaped;[m
[31m-    }[m
[31m---- request[m
[31m-GET /test[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body[m
[31m-'test'[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.25[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/eval.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/eval.t[m
[1mdeleted file mode 100644[m
[1mindex c87761d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/eval.t[m
[1m+++ /dev/null[m
[36m@@ -1,75 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /eval {[m
[31m-        eval_subrequest_in_memory  off;[m
[31m-[m
[31m-        eval $backend {[m
[31m-            postgres_pass    database;[m
[31m-            postgres_query   "select '$scheme://127.0.0.1:$server_port/echo'";[m
[31m-            postgres_output  value;[m
[31m-        }[m
[31m-[m
[31m-        proxy_pass $backend;[m
[31m-    }[m
[31m-[m
[31m-    location /echo {[m
[31m-        echo -n  "it works!";[m
[31m-    }[m
[31m---- request[m
[31m-GET /eval[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-it works![m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.25[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: sanity (simple case)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /eval {[m
[31m-        eval_subrequest_in_memory  off;[m
[31m-[m
[31m-        eval $echo {[m
[31m-            postgres_pass    database;[m
[31m-            postgres_query   "select 'test' as echo";[m
[31m-            postgres_output  value;[m
[31m-        }[m
[31m-[m
[31m-        echo -n  $echo;[m
[31m-    }[m
[31m---- request[m
[31m-GET /eval[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/form.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/form.t[m
[1mdeleted file mode 100644[m
[1mindex 4771232..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/form.t[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        set_form_input      $sql 'sql';[m
[31m-        set_unescape_uri    $sql;[m
[31m-        postgres_query      $sql;[m
[31m-    }[m
[31m---- more_headers[m
[31m-Content-Type: application/x-www-form-urlencoded[m
[31m---- request[m
[31m-POST /postgres[m
[31m-sql=select%20*%20from%20cats;[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/methods.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/methods.t[m
[1mdeleted file mode 100644[m
[1mindex 93b80e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/methods.t[m
[1m+++ /dev/null[m
[36m@@ -1,335 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 2 * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: default query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: method-specific query[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select 'GET' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: method-specific complex query (check 1)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: method-specific complex query (check 2)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-LOCK /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{04}\x{00}\x{00}\x{00}".  # field len[m
[31m-"LOCK".          # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: method-specific complex query (using not allowed method)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /postgres[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: method-specific query and default query (using defined method)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: method-specific query and default query (using other method)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-POST /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: inheritance[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_query      "select 'default' as echo";[m
[31m-    postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"GET".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inheritance (mixed, don't inherit)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_query      "select 'default' as echo";[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      LOCK GET UNLOCK "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /postgres[m
[31m---- error_code: 405[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: HTTP PATCH request method[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      PATCH "select '$request_method' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-PATCH /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{05}\x{00}\x{00}\x{00}".  # field len[m
[31m-"PATCH".         # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 3: < 0.8.41[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/output.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/output.t[m
[1mdeleted file mode 100644[m
[1mindex b4ba503..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/output.t[m
[1m+++ /dev/null[m
[36m@@ -1,447 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 - 4 * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: none - sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: value - sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: value - sanity (with different default_type)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/html;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: value - NULL value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: value - empty value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '' as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: text - sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'a', 'b', 'c', 'd'";[m
[31m-        postgres_output     text;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-"a".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"b".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"c".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"d"[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: rds - sanity (configured)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-        postgres_output     rds;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: rds - sanity (default)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'default' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{07}\x{00}\x{00}\x{00}".  # field len[m
[31m-"default".       # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: inheritance[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type     text/plain;[m
[31m-    postgres_output  value;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: inheritance (mixed, don't inherit)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_output  text;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: value - sanity (request with known extension)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres.jpg[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: value - bytea returned in text format[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select E'\\001'::bytea as res";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body_like chomp[m
[31m-^(?:\\001|\\x01)$[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: binary value - bytea returned in binary format[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select E'\\001'::bytea as res";[m
[31m-        postgres_output     binary_value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-"\1"[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: binary value - int2 returned in binary format[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 3::int2 as res";[m
[31m-        postgres_output     binary_value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-"\0\3"[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: value - "if" pseudo-location[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        if ($arg_foo) {[m
[31m-            postgres_pass       database;[m
[31m-            postgres_query      "select id from cats order by id limit 1";[m
[31m-            postgres_output     value;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres?foo=1[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body chomp[m
[31m-2[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: text - NULL value[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats order by id";[m
[31m-        postgres_output     text;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-"2".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"(null)".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"3".[m
[31m-"\x{0a}".  # new line - delimiter[m
[31m-"bob"[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: text - empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats where id=1";[m
[31m-        postgres_output     text;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: value - empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats where id=1";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: value - too many values[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    default_type  text/plain;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_output     value;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/restful.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/restful.t[m
[1mdeleted file mode 100644[m
[1mindex 74b111b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/restful.t[m
[1m+++ /dev/null[m
[36m@@ -1,338 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $config = <<'_EOC_';[m
[31m-    set $random  123;[m
[31m-[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "SELECT login FROM users WHERE login=$user AND pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location = /numbers/ {[m
[31m-        auth_request        /auth;[m
[31m-        postgres_pass       database;[m
[31m-[m
[31m-        postgres_query      HEAD GET  "SELECT * FROM numbers";[m
[31m-[m
[31m-        postgres_query      POST      "INSERT INTO numbers VALUES('$random') RETURNING *";[m
[31m-        postgres_rewrite    POST      changes 201;[m
[31m-[m
[31m-        postgres_query      DELETE    "DELETE FROM numbers";[m
[31m-        postgres_rewrite    DELETE    no_changes 204;[m
[31m-        postgres_rewrite    DELETE    changes 204;[m
[31m-    }[m
[31m-[m
[31m-    location ~ /numbers/(\d+) {[m
[31m-        auth_request        /auth;[m
[31m-        postgres_pass       database;[m
[31m-[m
[31m-        postgres_query      HEAD GET  "SELECT * FROM numbers WHERE number='$1'";[m
[31m-        postgres_rewrite    HEAD GET  no_rows 410;[m
[31m-[m
[31m-        postgres_query      PUT       "UPDATE numbers SET number='$1' WHERE number='$1' RETURNING *";[m
[31m-        postgres_rewrite    PUT       no_changes 410;[m
[31m-[m
[31m-        postgres_query      DELETE    "DELETE FROM numbers WHERE number='$1'";[m
[31m-        postgres_rewrite    DELETE    no_changes 410;[m
[31m-        postgres_rewrite    DELETE    changes 204;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $request_headers = <<'_EOC_';[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clean collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/[m
[31m---- error_code: 204[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: list empty collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: insert resource into collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-POST /numbers/[m
[31m---- error_code: 201[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"123".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: list collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"123".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/123[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"123".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: update resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-Content-Length: 0[m
[31m---- request[m
[31m-PUT /numbers/123[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"123".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: remove resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/123[m
[31m---- error_code: 204[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: update non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-Content-Length: 0[m
[31m---- request[m
[31m-PUT /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: remove non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: list empty collection (done)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{06}\x{00}".  # col name len[m
[31m-"number".        # col name data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/restful_json.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/restful_json.t[m
[1mdeleted file mode 100644[m
[1mindex aae262b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/restful_json.t[m
[1m+++ /dev/null[m
[36m@@ -1,244 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(1);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $config = <<'_EOC_';[m
[31m-    set $random  123;[m
[31m-[m
[31m-    location = /auth {[m
[31m-        internal;[m
[31m-[m
[31m-        postgres_escape     $user $remote_user;[m
[31m-        postgres_escape     $pass $remote_passwd;[m
[31m-[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "SELECT login FROM users WHERE login=$user AND pass=$pass";[m
[31m-        postgres_rewrite    no_rows 403;[m
[31m-        postgres_output     none;[m
[31m-    }[m
[31m-[m
[31m-    location = /numbers/ {[m
[31m-        auth_request        /auth;[m
[31m-        postgres_pass       database;[m
[31m-        rds_json            on;[m
[31m-[m
[31m-        postgres_query      HEAD GET  "SELECT * FROM numbers";[m
[31m-[m
[31m-        postgres_query      POST      "INSERT INTO numbers VALUES('$random') RETURNING *";[m
[31m-        postgres_rewrite    POST      changes 201;[m
[31m-[m
[31m-        postgres_query      DELETE    "DELETE FROM numbers";[m
[31m-        postgres_rewrite    DELETE    no_changes 204;[m
[31m-        postgres_rewrite    DELETE    changes 204;[m
[31m-    }[m
[31m-[m
[31m-    location ~ /numbers/(\d+) {[m
[31m-        auth_request        /auth;[m
[31m-        postgres_pass       database;[m
[31m-        rds_json            on;[m
[31m-[m
[31m-        postgres_query      HEAD GET  "SELECT * FROM numbers WHERE number='$1'";[m
[31m-        postgres_rewrite    HEAD GET  no_rows 410;[m
[31m-[m
[31m-        postgres_query      PUT       "UPDATE numbers SET number='$1' WHERE number='$1' RETURNING *";[m
[31m-        postgres_rewrite    PUT       no_changes 410;[m
[31m-[m
[31m-        postgres_query      DELETE    "DELETE FROM numbers WHERE number='$1'";[m
[31m-        postgres_rewrite    DELETE    no_changes 410;[m
[31m-        postgres_rewrite    DELETE    changes 204;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-our $request_headers = <<'_EOC_';[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-_EOC_[m
[31m-[m
[31m-no_shuffle();[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: clean collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/[m
[31m---- error_code: 204[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: list empty collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[][m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: insert resource into collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-POST /numbers/[m
[31m---- error_code: 201[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"number":123}][m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: list collection[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"number":123}][m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: get resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/123[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"number":123}][m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: update resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-Content-Length: 0[m
[31m---- request[m
[31m-PUT /numbers/123[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[{"number":123}][m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: remove resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/123[m
[31m---- error_code: 204[m
[31m---- response_headers[m
[31m-! Content-Type[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: update non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers[m
[31m-Authorization: Basic bmd4X3Rlc3Q6bmd4X3Rlc3Q=[m
[31m-Content-Length: 0[m
[31m---- request[m
[31m-PUT /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m---- skip_slave: 3: CentOS[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: get non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: remove non-existing resource[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-DELETE /numbers/123[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- response_body_like: 410 Gone[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: list empty collection (done)[m
[31m---- http_config eval: $::http_config[m
[31m---- config eval: $::config[m
[31m---- more_headers eval: $::request_headers[m
[31m---- request[m
[31m-GET /numbers/[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/json[m
[31m---- response_body chomp[m
[31m-[][m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/rewrites.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/rewrites.t[m
[1mdeleted file mode 100644[m
[1mindex 3cc191e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/rewrites.t[m
[1m+++ /dev/null[m
[36m@@ -1,348 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 2 + 1 * 1);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: no changes (SELECT)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: no changes (UPDATE)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        postgres_rewrite    no_changes 206;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: one change[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='bob'";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: rows[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: no rows[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats where name='noone'";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 410[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: inheritance[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_rewrite  no_changes 500;[m
[31m-    postgres_rewrite  changes 500;[m
[31m-    postgres_rewrite  no_rows 410;[m
[31m-    postgres_rewrite  rows 206;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: inheritance (mixed, don't inherit)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_rewrite  no_changes 500;[m
[31m-    postgres_rewrite  changes 500;[m
[31m-    postgres_rewrite  no_rows 410;[m
[31m-    postgres_rewrite  rows 206;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: rows (method-specific)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    POST PUT rows 201;[m
[31m-        postgres_rewrite    HEAD GET rows 206;[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: rows (default)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    POST PUT rows 201;[m
[31m-        postgres_rewrite    rows 206;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: rows (none)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_changes 500;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-        postgres_rewrite    no_rows 410;[m
[31m-        postgres_rewrite    POST PUT rows 201;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: no changes (UPDATE) with 202 response[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        postgres_rewrite    no_changes 202;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 202[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m---- skip_nginx: 2: < 0.8.41[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: no changes (UPDATE) with 409 response[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        postgres_rewrite    no_changes 409;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 409[m
[31m---- response_headers[m
[31m-Content-Type: text/html[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: no changes (UPDATE) with 409 status and our body[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        postgres_rewrite    no_changes =409;[m
[31m-        postgres_rewrite    changes 500;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 409[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: rows with 409 status and our body (with integrity check)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-        postgres_rewrite    no_rows 500;[m
[31m-        postgres_rewrite    rows =409;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 409[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: rows - "if" pseudo-location[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        if ($arg_foo) {[m
[31m-            postgres_pass       database;[m
[31m-            postgres_query      "select * from cats";[m
[31m-            postgres_rewrite    no_changes 500;[m
[31m-            postgres_rewrite    changes 500;[m
[31m-            postgres_rewrite    no_rows 410;[m
[31m-            postgres_rewrite    rows 206;[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres?foo=1[m
[31m---- error_code: 206[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/sanity.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/sanity.t[m
[1mdeleted file mode 100644[m
[1mindex 25c3d7e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/sanity.t[m
[1m+++ /dev/null[m
[36m@@ -1,298 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 5);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config[m
[31m-    upstream database {[m
[31m-        postgres_server     $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                            dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-        postgres_keepalive  off;[m
[31m-    }[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: keep-alive[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: update[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{01}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"   # col count[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: select empty result[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats where name='tom'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: variables in postgres_pass[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        set                 $backend  database;[m
[31m-        postgres_pass       $backend;[m
[31m-        postgres_query      "update cats set name='bob' where name='bob'";[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{01}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{00}\x{00}"   # col count[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: HEAD request[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select * from cats";[m
[31m-    }[m
[31m---- request[m
[31m-HEAD /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-""[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: "if" pseudo-location[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        if ($arg_foo) {[m
[31m-            postgres_pass       database;[m
[31m-            postgres_query      "select * from cats";[m
[31m-            break;[m
[31m-        }[m
[31m-[m
[31m-        return 404;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres?foo=1[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{02}\x{00}".  # col count[m
[31m-"\x{09}\x{00}".  # std col type (integer/int)[m
[31m-"\x{17}\x{00}".  # driver col type[m
[31m-"\x{02}\x{00}".  # col name len[m
[31m-"id".            # col name data[m
[31m-"\x{06}\x{80}".  # std col type (varchar/str)[m
[31m-"\x{19}\x{00}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"name".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"2".             # field data[m
[31m-"\x{ff}\x{ff}\x{ff}\x{ff}".  # field len[m
[31m-"".              # field data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{01}\x{00}\x{00}\x{00}".  # field len[m
[31m-"3".             # field data[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # field len[m
[31m-"bob".           # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m---- no_error_log[m
[31m-[alert][m
[31m-[error][m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/variables.t b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/variables.t[m
[1mdeleted file mode 100644[m
[1mindex 8938411..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/t/variables.t[m
[1m+++ /dev/null[m
[36m@@ -1,407 +0,0 @@[m
[31m-# vi:filetype=perl[m
[31m-[m
[31m-use lib 'lib';[m
[31m-use Test::Nginx::Socket;[m
[31m-[m
[31m-repeat_each(2);[m
[31m-[m
[31m-plan tests => repeat_each() * (blocks() * 3 + 1 * 4 + 1 * 1 - 5 * 2);[m
[31m-[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_HOST} ||= '127.0.0.1';[m
[31m-$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;[m
[31m-[m
[31m-our $http_config = <<'_EOC_';[m
[31m-    upstream database {[m
[31m-        postgres_server  $TEST_NGINX_POSTGRESQL_HOST:$TEST_NGINX_POSTGRESQL_PORT[m
[31m-                         dbname=ngx_test user=ngx_test password=ngx_test;[m
[31m-    }[m
[31m-_EOC_[m
[31m-[m
[31m-run_tests();[m
[31m-[m
[31m-__DATA__[m
[31m-[m
[31m-=== TEST 1: sanity[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 0;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Test: test[m
[31m---- response_body eval[m
[31m-"\x{00}".        # endian[m
[31m-"\x{03}\x{00}\x{00}\x{00}".  # format version 0.0.3[m
[31m-"\x{00}".        # result type[m
[31m-"\x{00}\x{00}".  # std errcode[m
[31m-"\x{02}\x{00}".  # driver errcode[m
[31m-"\x{00}\x{00}".  # driver errstr len[m
[31m-"".              # driver errstr data[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # rows affected[m
[31m-"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".  # insert id[m
[31m-"\x{01}\x{00}".  # col count[m
[31m-"\x{00}\x{80}".  # std col type (unknown/str)[m
[31m-"\x{c1}\x{02}".  # driver col type[m
[31m-"\x{04}\x{00}".  # col name len[m
[31m-"echo".          # col name data[m
[31m-"\x{01}".        # valid row flag[m
[31m-"\x{04}\x{00}\x{00}\x{00}".  # field len[m
[31m-"test".          # field data[m
[31m-"\x{00}"         # row list terminator[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 2: out-of-range value (optional)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 1;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 3: NULL value (optional)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        postgres_set        $test 0 0;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 4: zero-length value (optional)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '' as echo";[m
[31m-        postgres_set        $test 0 0;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 5: out-of-range value (required)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 1 required;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 6: NULL value (required)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        postgres_set        $test 0 0 required;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 7: zero-length value (required)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '' as echo";[m
[31m-        postgres_set        $test 0 0 required;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 8: $postgres_columns[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'a', 'b', 'c'";[m
[31m-        add_header          "X-Columns" $postgres_columns;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Columns: 3[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 9: $postgres_rows[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'a', 'b', 'c'";[m
[31m-        add_header          "X-Rows" $postgres_rows;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Rows: 1[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 10: $postgres_query (simple value)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        add_header          "X-Query" $postgres_query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Query: select 'test' as echo[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 11: $postgres_query (simple value)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '$request_method' as echo";[m
[31m-        add_header          "X-Query" $postgres_query;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Query: select 'GET' as echo[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 12: variables used in non-ngx_postgres location[m
[31m---- http_config[m
[31m---- config[m
[31m-    location /etc {[m
[31m-        root                /;[m
[31m-        add_header          "X-Columns" $postgres_columns;[m
[31m-        add_header          "X-Rows" $postgres_rows;[m
[31m-        add_header          "X-Affected" $postgres_affected;[m
[31m-        add_header          "X-Query" $postgres_query;[m
[31m-        postgres_set        $pg 0 0 required;[m
[31m-        add_header          "X-Custom" $pg;[m
[31m-    }[m
[31m---- request[m
[31m-GET /etc/passwd[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: text/plain[m
[31m-! X-Columns[m
[31m-! X-Rows[m
[31m-! X-Affected[m
[31m-! X-Query[m
[31m-! X-Custom[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 13: $postgres_affected (SELECT)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select '$request_method' as echo";[m
[31m-        add_header          "X-Affected" $postgres_affected;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Affected[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 14: $postgres_affected (UPDATE, no changes)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='noone'";[m
[31m-        add_header          "X-Affected" $postgres_affected;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Affected: 0[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 15: $postgres_affected (UPDATE, one change)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "update cats set id=3 where name='bob'";[m
[31m-        add_header          "X-Affected" $postgres_affected;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Affected: 1[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 16: inheritance[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_set  $test 0 0 required;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 17: inheritance (mixed, don't inherit)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    postgres_set  $test 0 0 required;[m
[31m-[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select NULL as echo";[m
[31m-        postgres_set        $test2 2 2;[m
[31m-        add_header          "X-Test" $test2;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 18: column by name (existing)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 "echo";[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-X-Test: test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 19: column by name (not existing, optional)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 "test" optional;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 200[m
[31m---- response_headers[m
[31m-Content-Type: application/x-resty-dbd-stream[m
[31m-! X-Test[m
[31m---- timeout: 10[m
[31m-[m
[31m-[m
[31m-[m
[31m-=== TEST 20: column by name (not existing, required)[m
[31m---- http_config eval: $::http_config[m
[31m---- config[m
[31m-    location /postgres {[m
[31m-        postgres_pass       database;[m
[31m-        postgres_query      "select 'test' as echo";[m
[31m-        postgres_set        $test 0 "test" required;[m
[31m-        add_header          "X-Test" $test;[m
[31m-    }[m
[31m---- request[m
[31m-GET /postgres[m
[31m---- error_code: 500[m
[31m---- timeout: 10[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/valgrind.suppress b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/valgrind.suppress[m
[1mdeleted file mode 100644[m
[1mindex e0b8e89..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/ngx_postgres-1.0rc7/valgrind.suppress[m
[1m+++ /dev/null[m
[36m@@ -1,331 +0,0 @@[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_event_process_posted[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_create_pool[m
[31m-fun:ngx_http_init_request[m
[31m-fun:ngx_event_process_posted[m
[31m-fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_pnalloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Leak[m
[31m-fun:malloc[m
[31m-fun:ngx_alloc[m
[31m-fun:ngx_malloc[m
[31m-fun:ngx_palloc[m
[31m-}[m
[31m-{[m
[31m-<insert_a_suppression_name_here>[m
[31m-Memcheck:Addr4[m
[31m-fun:ngx_init_cycle[m
[31m-fun:ngx_master_process_cycle[m
[31m-fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Param[m
[31m-   epoll_ctl(event)[m
[31m-   fun:epoll_ctl[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:(below main)[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_calloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_variables_init_vars[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_hash_keys_array_init[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_echo_add_variables[m
[31m-   fun:ngx_http_echo_handler_init[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_core_server[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_upstream[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_upstream_drizzle_create_srv_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_variables_add_core_vars[m
[31m-   fun:ngx_http_core_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_hash_init[m
[31m-   fun:ngx_http_upstream_init_main_conf[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   nginx-core-process-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_event_process_init[m
[31m-}[m
[31m-{[m
[31m-   nginx-core-crc32-init[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_crc32_table_init[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_init_request[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_pcalloc[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   palloc_large_for_create_temp_buf[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_create_temp_buf[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   accept_create_pool[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_event_accept[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_for_init_req[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:ngx_http_init_request[m
[31m-   fun:ngx_epoll_process_events[m
[31m-   fun:ngx_process_events_and_timers[m
[31m-}[m
[31m-{[m
[31m-   create_pool_posix_memalign[m
[31m-   Memcheck:Leak[m
[31m-   fun:memalign[m
[31m-   fun:posix_memalign[m
[31m-   fun:ngx_memalign[m
[31m-   fun:ngx_create_pool[m
[31m-   fun:main[m
[31m-}[m
[31m-[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Leak[m
[31m-   fun:malloc[m
[31m-   fun:ngx_alloc[m
[31m-   fun:ngx_palloc_large[m
[31m-   fun:ngx_palloc[m
[31m-   fun:ngx_array_push[m
[31m-   fun:ngx_hash_add_key[m
[31m-   fun:ngx_http_add_variable[m
[31m-   fun:ngx_http_ssi_preconfiguration[m
[31m-   fun:ngx_http_block[m
[31m-   fun:ngx_conf_parse[m
[31m-   fun:ngx_init_cycle[m
[31m-   fun:main[m
[31m-}[m
[31m-{[m
[31m-   <insert_a_suppression_name_here>[m
[31m-   Memcheck:Cond[m
[31m-   fun:index[m
[31m-   fun:expand_dynamic_string_token[m
[31m-   fun:_dl_map_object[m
[31m-   fun:map_doit[m
[31m-   fun:_dl_catch_error[m
[31m-   fun:do_preload[m
[31m-   fun:dl_main[m
[31m-}[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/array-var-nginx-module-0.05/array-var-nginx-module-0.05.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/array-var-nginx-module-0.05/array-var-nginx-module-0.05.pod[m
[1mdeleted file mode 100644[m
[1mindex 9dc6866..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/array-var-nginx-module-0.05/array-var-nginx-module-0.05.pod[m
[1m+++ /dev/null[m
[36m@@ -1,471 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-array-var-nginx-module - Add support for array-typed variables to nginx config files[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See the[m
[31m-installation instructions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_files to=$array;[m
[31m-    [m
[31m-        # use the set_quote_sql_str directive in the ngx_set_misc[m
[31m-        # module to map to each element in the array $array:[m
[31m-        array_map_op set_quote_sql_str $array;[m
[31m-    [m
[31m-        array_map "name = $array_it" $array;[m
[31m-    [m
[31m-        array_join ' or ' $array to=$sql_condition;[m
[31m-    [m
[31m-        # well, we could feed it to ngx_drizzle to talk to MySQL, for example ;)[m
[31m-        echo "select * from files where $sql_condition";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module provides array typed nginx variables to C<nginx.conf>.[m
[31m-[m
[31m-Under the hood, this module just "abuses" the nginx string values to hold binary pointers[m
[31m-to C data structures (NGINX core's C<ngx_array_t> struct on the C land).[m
[31m-[m
[31m-The array type gives C<nginx.onf> wonderful capabilities of handling value lists. Nowadays, however,[m
[31m-you are highly recommended to use the L<ngx_lua|https://github.com/openresty/lua-nginx-module> module[m
[31m-so as to have the full scripting power provided by the Lua language in nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_split[m
[31m-[m
[31m-B<syntax:> I<array_split E<lt>separatorE<gt> E<lt>subjectE<gt> to=$target_variable>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Splits the string value in the C<subject> argument with the separator string specified by the[m
[31m-C<separator> argument. The result is an array-typed value saved to the nginx variable specified by the C<to=VAR> option.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    array_split "," $arg_names to=$names;[m
[31m-[m
[31m-will split the string values in the URI query argument C<names> into an array-typed value saved to the custom nginx variable[m
[31m-C<$names>.[m
[31m-[m
[31m-This directive creates an array-typed variable. Array-typed variables cannot be used outside[m
[31m-the directives offered by this module. If you want to use the values in an array-typed variable[m
[31m-in other contexts,[m
[31m-you must use the L<array_join> directive to produce a normal string value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_join[m
[31m-[m
[31m-B<syntax:> I<array_split E<lt>separatorE<gt> $array_var>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Joins the elements in the array-typed nginx variable (C<$array_var>) into a single string value[m
[31m-with the separator specified by the first argument.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_join '+' $names;[m
[31m-        echo $names;[m
[31m-    }[m
[31m-[m
[31m-Then request C<GET /foo?names=Bob,Marry,John> will yield the response body[m
[31m-[m
[31m-[m
[31m-    Bob+Marry+John[m
[31m-[m
[31m-In the example above, we use the L<ngx_echo|https://github.com/openresty/echo-nginx-module> module's L<echo|https://github.com/openresty/echo-nginx-module#echo> directive to output[m
[31m-the final result.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_map[m
[31m-[m
[31m-B<syntax:> I<array_map E<lt>templateE<gt> $array_var>[m
[31m-[m
[31m-B<syntax:> I<array_map E<lt>templateE<gt> $array_var to=$new_array_var>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Maps the string template to each element in the array-typed nginx variable specified. Within[m
[31m-the string template, you can use the special iterator variable C<$array_it> to reference the current[m
[31m-array element in the array being mapped.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    array_map "[$array_it]" $names;[m
[31m-[m
[31m-will change each element in the array variable C<$names> by putting the square brackets around[m
[31m-each element's string value. The modification is in-place in this case.[m
[31m-[m
[31m-If you do not want in-place modifications, you can use the C<to=$var> option to specify a new nginx variable to hold the results. For instance,[m
[31m-[m
[31m-[m
[31m-    array_map "[$array_it]" $names to=$new_names;[m
[31m-[m
[31m-where the results are saved into another (array-typed) nginx variable named C<$new_names> while[m
[31m-the C<$names> variable keeps intact.[m
[31m-[m
[31m-Below is a complete example for this:[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map '[$array_it]' $names;[m
[31m-        array_join '+' $names;[m
[31m-        echo "$names";[m
[31m-    }[m
[31m-[m
[31m-Then request C<GET /foo?names=bob,marry,nomas> will yield the response body[m
[31m-[m
[31m-[m
[31m-    [bob]+[marry]+[nomas][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_map_op[m
[31m-[m
[31m-B<syntax:> I<array_map_op E<lt>directiveE<gt> $array_var>[m
[31m-[m
[31m-B<syntax:> I<array_map_op E<lt>directiveE<gt> $array_var to=$new_array_var>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Similar to the L<array_map> directive but maps the specified nginx configuration directive instead of[m
[31m-a string template to each element in the array-typed nginx variable specified. The result[m
[31m-of applying the specified configuration directive becomes the result of the mapping.[m
[31m-[m
[31m-The nginx configuration directive being used as the iterator must be implemented by L<Nginx Devel Kit|https://github.com/simpl/ngx_devel_kit> (NDK)'s set_var submodule's C<ndk_set_var_value>.[m
[31m-For example, the following L<set-misc-nginx-module|http://github.com/openresty/set-misc-nginx-module> directives can be invoked this way:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_sql_str|http://github.com/openresty/set-misc-nginx-module#set_quote_sql_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_pgsql_str|http://github.com/openresty/set-misc-nginx-module#set_quote_pgsql_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_quote_json_str|http://github.com/openresty/set-misc-nginx-module#set_quote_json_str>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_unescape_uri|http://github.com/openresty/set-misc-nginx-module#set_unescape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_escape_uri|http://github.com/openresty/set-misc-nginx-module#set_escape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_base32|http://github.com/openresty/set-misc-nginx-module#set_encode_base32>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_base32|http://github.com/openresty/set-misc-nginx-module#set_decode_base32>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_base64|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_base64|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_encode_hex|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_decode_hex|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_sha1|http://github.com/openresty/set-misc-nginx-module#set_encode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_md5|http://github.com/openresty/set-misc-nginx-module#set_decode_base64>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This is a higher-order operation where other nginx configuration directives can be used[m
[31m-as arguments for this C<map_array_op> directive.[m
[31m-[m
[31m-Consider the following example,[m
[31m-[m
[31m-[m
[31m-    array_map_op set_quote_sql_str $names;[m
[31m-[m
[31m-This line changes each element in the array-typed nginx variable C<$names> by applying the[m
[31m-L<set_quote_sql_str|https://github.com/openresty/set-misc-nginx-module#set_quote_sql_str>[m
[31m-directive provided by the L<ngx_set_misc|https://github.com/openresty/set-misc-nginx-module>[m
[31m-module one by one. The result is that each element in the array C<$names> has been escaped as SQL string literal values.[m
[31m-[m
[31m-You can also specify the C<to=$var> option if you do not want in-place modifications of the input arrays. For instance,[m
[31m-[m
[31m-[m
[31m-    array_map_op set_quote_sql_str $names to=$quoted_names;[m
[31m-[m
[31m-will save the escaped elements into a new (array-typed) nginx variable named C<$quoted_names> with C<$names> intact.[m
[31m-[m
[31m-The following is a relatively complete example:[m
[31m-[m
[31m-[m
[31m-    location /foo {[m
[31m-        array_split ',' $arg_names to=$names;[m
[31m-        array_map_op set_quote_sql_str $names;[m
[31m-        array_join '+' $names to=$res;[m
[31m-        echo $res;[m
[31m-    }[m
[31m-[m
[31m-Then request C<GET /foo?names=bob,marry,nomas> will yield the response body[m
[31m-[m
[31m-[m
[31m-    'bob'+'marry'+'nomas'[m
[31m-[m
[31m-Pretty cool, huh?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<OpenResty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing OpenResty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.7 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     $ wget 'http://nginx.org/download/nginx-1.9.7.tar.gz'[m
[31m-     $ tar -xzvf nginx-1.9.7.tar.gz[m
[31m-     $ cd nginx-1.9.7/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     $ ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/array-var-nginx-module[m
[31m-    [m
[31m-     $ make -j2[m
[31m-     $ make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<array-var-nginx-module file list|https://github.com/openresty/array-var-nginx-module/tags>.[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<OpenResty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_array_var_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x> (last tested: 1.9.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x> (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x> (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x> (last tested: 1.4.2)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x> (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x> (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x> (last tested: 1.0.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x> (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x> (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.44> (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.44 does not[m
[31m-work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>array-var-nginx-module|https://github.com/openresty/array-var-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the author or just ask for[m
[31m-a commit bit to the source repository on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2009-2016, Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are[m
[31m-met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS[m
[31m-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED[m
[31m-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A[m
[31m-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<NDK|https://github.com/simpl/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_set_misc|https://github.com/openresty/set-misc-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/drizzle-nginx-module-0.1.9/drizzle-nginx-module-0.1.9.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/drizzle-nginx-module-0.1.9/drizzle-nginx-module-0.1.9.pod[m
[1mdeleted file mode 100644[m
[1mindex c4836e8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/drizzle-nginx-module-0.1.9/drizzle-nginx-module-0.1.9.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1090 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-drizzle-nginx-module - Upstream module for talking to MySQL and Drizzle directly[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is already production ready and is powering L<the Taobao LineZing site|http://lz.taobao.com>.[m
[31m-[m
[31m-[m
[31m-=head1 Version[m
[31m-[m
[31m-This document describes ngx_drizzle L<v0.1.9|https://github.com/openresty/drizzle-nginx-module/tags> released on 22 June 2015.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     http {[m
[31m-         ...[m
[31m-    [m
[31m-         upstream cluster {[m
[31m-             # simple round-robin[m
[31m-             drizzle_server 127.0.0.1:3306 dbname=test[m
[31m-                  password=some_pass user=monty protocol=mysql;[m
[31m-             drizzle_server 127.0.0.1:1234 dbname=test2[m
[31m-                  password=pass user=bob protocol=drizzle;[m
[31m-         }[m
[31m-    [m
[31m-         upstream backend {[m
[31m-             drizzle_server 127.0.0.1:3306 dbname=test[m
[31m-                  password=some_pass user=monty protocol=mysql;[m
[31m-         }[m
[31m-    [m
[31m-         server {[m
[31m-             location /mysql {[m
[31m-                 set $my_sql 'select * from cats';[m
[31m-                 drizzle_query $my_sql;[m
[31m-    [m
[31m-                 drizzle_pass backend;[m
[31m-    [m
[31m-                 drizzle_connect_timeout    500ms; # default 60s[m
[31m-                 drizzle_send_query_timeout 2s;    # default 60s[m
[31m-                 drizzle_recv_cols_timeout  1s;    # default 60s[m
[31m-                 drizzle_recv_rows_timeout  1s;    # default 60s[m
[31m-             }[m
[31m-    [m
[31m-             ...[m
[31m-    [m
[31m-             # for connection pool monitoring[m
[31m-             location /mysql-pool-status {[m
[31m-                 allow 127.0.0.1;[m
[31m-                 deny all;[m
[31m-    [m
[31m-                 drizzle_status;[m
[31m-             }[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This is an nginx upstream module integrating L<libdrizzle|https://launchpad.net/drizzle> into Nginx in a non-blocking and streamming way.[m
[31m-[m
[31m-Essentially it provides a very efficient and flexible way for nginx internals to access MySQL, Drizzle, as well as other RDBMS's that support the Drizzle or MySQL wired protocol. Also it can serve as a direct REST interface to those RDBMS backends.[m
[31m-[m
[31m-This module does not generate human-readable outputs, rather, in a binary format called Resty-DBD-Stream (RDS) designed by ourselves. You usually need other components, like L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module>, L<rds-csv-nginx-module|http://github.com/openresty/rds-csv-nginx-module>, or L<lua-rds-parser|http://github.com/openresty/lua-rds-parser>, to work with this module. See L<Output Format> for details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Keepalive connection pool[m
[31m-[m
[31m-This module also provides a builtin per-worker connection pool mechanism for MySQL or Drizzle TCP connections.[m
[31m-[m
[31m-Here's a sample configuration:[m
[31m-[m
[31m-[m
[31m-     upstream backend {[m
[31m-         drizzle_server 127.0.0.1:3306 dbname=test[m
[31m-              password=some_pass user=monty protocol=mysql;[m
[31m-         drizzle_keepalive max=100 mode=single overflow=reject;[m
[31m-     }[m
[31m-[m
[31m-For now, the connection pool uses a simple LIFO algorithm to assign idle connections in the pool. That is, most recently (successfully) used connections will be reused first the next time. And new idle connections will always replace the oldest idle connections in the pool even if the pool is already full.[m
[31m-[m
[31m-See the L<drizzle_keepalive> directive for more details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Last Insert ID[m
[31m-[m
[31m-If you want to get LAST_INSERT_ID, then ngx_drizzle already returns that automatically for you when you're doing a SQL insert query. Consider the following sample C<nginx.conf> snippet:[m
[31m-[m
[31m-     location /test {[m
[31m-         echo_location /mysql "drop table if exists foo";[m
[31m-         echo;[m
[31m-         echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";[m
[31m-         echo;[m
[31m-         echo_location /mysql "insert into foo (val) values (3.1415926);";[m
[31m-         echo;[m
[31m-         echo_location /mysql "select * from foo;";[m
[31m-         echo;[m
[31m-     }[m
[31m-    [m
[31m-     location /mysql {[m
[31m-         drizzle_pass backend;[m
[31m-         drizzle_module_header off;[m
[31m-         drizzle_query $query_string;[m
[31m-         rds_json on;[m
[31m-     }[m
[31m-[m
[31m-Then request C<GET /test> gives the following outputs:[m
[31m-[m
[31m-     {"errcode":0}[m
[31m-     {"errcode":0}[m
[31m-     {"errcode":0,"insert_id":1,"affected_rows":1}[m
[31m-     [{"id":1,"val":3.1415926}][m
[31m-[m
[31m-You can see the C<insert_id> field (as well as the C<affected_rows> field in the 3rd JSON response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_server[m
[31m-[m
[31m-B<syntax:> I<drizzle_server E<lt>hostE<gt> user=E<lt>userE<gt> password=E<lt>passE<gt> dbname=E<lt>databaseE<gt>>[m
[31m-[m
[31m-B<syntax:> I<drizzle_server E<lt>hostE<gt>:E<lt>portE<gt> user=E<lt>userE<gt> password=E<lt>passE<gt> dbname=E<lt>databaseE<gt> protocol=E<lt>protocolE<gt> charset=E<lt>charsetE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-Directive assigns the name and the parameters of server. For the name it is possible to use a domain name, an address, with an optional port (default: 3306). If domain name resolves to several addresses, then all are used.[m
[31m-[m
[31m-The following options are supported:[m
[31m-[m
[31m-B<user=>C<< <user> >>[m
[31m-MySQL/Drizzle user name C<< <user> >> for login.[m
[31m-[m
[31m-B<password=>C<< <pass> >>[m
[31m-Specify mysql password C<< <pass> >>for login. If you have special characters like C<#> or spaces in your password text, then you'll have to quote the whole key-value pair with either single-quotes or double-quotes, as in[m
[31m-[m
[31m-[m
[31m-     drizzle_server 127.0.0.1:3306 user=monty "password=a b#1"[m
[31m-             dbname=test protocol=mysql;[m
[31m-[m
[31m-B<dbname=>C<< <database> >>[m
[31m-Specify default MySQL database C<< <database> >> for the connection. Note that MySQL does allow referencing tables belonging to different databases by qualifying table names with database names in SQL queries.[m
[31m-[m
[31m-B<protocol=>C<< <protocol> >>[m
[31m-Specify which wire protocol to use, C<drizzle> or C<mysql>. Default to C<drizzle>.[m
[31m-[m
[31m-B<charset=>C<< <charset> >>[m
[31m-Explicitly specify the character set for the MySQL connections. Setting this option to a non-empty value will make this module send out a C<< set names '<charset>' >> query right after the mysql connection is established.[m
[31m-If the default character encoding of the MySQL connection is already what you want, you needn't set this option because it has extra runtime cost.[m
[31m-Here is a small example:[m
[31m-[m
[31m-     drizzle_server foo.bar.com:3306 user=monty password=some_pass[m
[31m-                                     dbname=test protocol=mysql[m
[31m-                                     charset=utf8;[m
[31m-[m
[31m-Please note that for the mysql server, "utf-8" is not a valid encoding name while C<utf8> is.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_keepalive[m
[31m-[m
[31m-B<syntax:> I<drizzle_keepalive max=E<lt>sizeE<gt> mode=E<lt>modeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_keepalive max=0 mode=single>[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-Configures the keep-alive connection pool for MySQL/Drizzle connections.[m
[31m-[m
[31m-The following options are supported:[m
[31m-[m
[31m-B<max=>C<< <num> >>[m
[31m-Specify the capacity of the connection pool for the current upstream block. The E<lt>numE<gt> value I<must> be non-zero. If set to C<0>, it effectively disables the connection pool. This option is default to C<0>.[m
[31m-[m
[31m-B<mode=>C<< <mode> >>[m
[31m-This supports two values, C<single> and C<multi>. The C<single> mode means the pool does not distinguish various drizzle servers in the current upstream block while C<multi> means the pool will merely reuse connections which have identical server host names and ports. Note that even under C<multi>, differences between C<dbname> or C<user> parameters will be silently ignored. Default to C<single>.[m
[31m-[m
[31m-B<overflow=>C<< <action> >>[m
[31m-This option specifies what to do when the connection pool is already full while new database connection is required. Either C<reject> or C<ignore> can be specified. In case of C<reject>, it will reject the current request, and returns the C<503 Service Unavailable> error page. For C<ignore>, this module will go on creating a new database connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_query[m
[31m-[m
[31m-B<syntax:> I<drizzle_query E<lt>sqlE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the SQL queries sent to the Drizzle/MySQL backend.[m
[31m-[m
[31m-Nginx variable interpolation is supported, but you must be careful with SQL injection attacks. You can use the L<set_quote_sql_str|http://github.com/openresty/set-misc-nginx-module#set_quote_sql_str> directive, for example, to quote values for SQL interpolation:[m
[31m-[m
[31m-[m
[31m-     location /cat {[m
[31m-         set_unescape_uri $name $arg_name;[m
[31m-         set_quote_sql_str $quoted_name $name;[m
[31m-    [m
[31m-         drizzle_query "select * from cats where name = $quoted_name";[m
[31m-         drizzle_pass my_backend;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_pass[m
[31m-[m
[31m-B<syntax:> I<drizzle_pass E<lt>remoteE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This directive specifies the Drizzle or MySQL upstream name to be queried in the current location. The C<< <remote> >> argument can be any upstream name defined with the L<drizzle_server> directive.[m
[31m-[m
[31m-Nginx variables can also be interpolated into the C<< <remote> >> argument, so as to do dynamic backend routing, for example:[m
[31m-[m
[31m-     upstream moon { drizzle_server ...; }[m
[31m-    [m
[31m-     server {[m
[31m-         location /cat {[m
[31m-             set $backend 'moon';[m
[31m-    [m
[31m-             drizzle_query ...;[m
[31m-             drizzle_pass $backend;[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_connect_timeout[m
[31m-[m
[31m-B<syntax:> I<drizzle_connect_time E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_connect_time 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the (total) timeout for connecting to a remote Drizzle or MySQL server.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_send_query_timeout[m
[31m-[m
[31m-B<syntax:> I<drizzle_send_query_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_send_query_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the (total) timeout for sending a SQL query to a remote Drizzle or MySQL server.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, ie, "second". The default setting is C<60s>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_recv_cols_timeout[m
[31m-[m
[31m-B<syntax:> I<drizzle_recv_cols_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_recv_cols_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the (total) timeout for receiving the columns metadata of the result-set to a remote Drizzle or MySQL server.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, ie, "second". The default setting is C<60s>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_recv_rows_timeout[m
[31m-[m
[31m-B<syntax:> I<drizzle_recv_rows_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_recv_rows_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the (total) timeout for receiving the rows data of the result-set (if any) to a remote Drizzle or MySQL server.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, ie, "second". The default setting is C<60s>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_buffer_size[m
[31m-[m
[31m-B<syntax:> I<drizzle_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<drizzle_buffer_size 4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specify the buffer size for drizzle outputs. Default to the page size (4k/8k). The larger the buffer, the less streammy the outputing process will be.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_module_header[m
[31m-[m
[31m-B<syntax:> I<drizzle_module_header on|off>[m
[31m-[m
[31m-B<default:> I<drizzle_module_header on>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Controls whether to output the drizzle header in the response. Default on.[m
[31m-[m
[31m-The drizzle module header looks like this:[m
[31m-[m
[31m-    X-Resty-DBD-Module: ngx_drizzle 0.1.0[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 drizzle_status[m
[31m-[m
[31m-B<syntax:> I<drizzle_status>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-When specified, the current Nginx location will output a status report for all the drizzle upstream servers in the virtual server of the current Nginx worker process.[m
[31m-[m
[31m-The output looks like this:[m
[31m-[m
[31m-    worker process: 15231[m
[31m-[m
[31m-    upstream backend[m
[31m-      active connections: 0[m
[31m-      connection pool capacity: 10[m
[31m-      overflow: reject[m
[31m-      cached connection queue: 0[m
[31m-      free'd connection queue: 10[m
[31m-      cached connection successfully used count:[m
[31m-      free'd connection successfully used count: 3 0 0 0 0 0 0 0 0 0[m
[31m-      servers: 1[m
[31m-      peers: 1[m
[31m-[m
[31m-    upstream backend2[m
[31m-      active connections: 0[m
[31m-      connection pool capacity: 0[m
[31m-      servers: 1[m
[31m-      peers: 1[m
[31m-[m
[31m-Note that, this is I<not> the global statistics if you do have multiple Nginx worker processes configured in your C<nginx.conf>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Variables[m
[31m-[m
[31m-This module creates the following Nginx variables:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $drizzle_thread_id[m
[31m-[m
[31m-This variable will be assigned a textual number of the underlying MySQL or Drizzle query thread ID when the current SQL query times out. This thread ID can be further used in a SQL kill command to cancel the timed-out query.[m
[31m-[m
[31m-Here's an example:[m
[31m-[m
[31m-     drizzle_connect_timeout 1s;[m
[31m-     drizzle_send_query_timeout 2s;[m
[31m-     drizzle_recv_cols_timeout 1s;[m
[31m-     drizzle_recv_rows_timeout 1s;[m
[31m-    [m
[31m-     location /query {[m
[31m-         drizzle_query 'select sleep(10)';[m
[31m-         drizzle_pass my_backend;[m
[31m-         rds_json on;[m
[31m-    [m
[31m-         more_set_headers -s 504 'X-Mysql-Tid: $drizzle_thread_id';[m
[31m-     }[m
[31m-    [m
[31m-     location /kill {[m
[31m-         drizzle_query "kill query $arg_tid";[m
[31m-         drizzle_pass my_backend;[m
[31m-         rds_json on;[m
[31m-     }[m
[31m-    [m
[31m-     location /main {[m
[31m-         content_by_lua '[m
[31m-             local res = ngx.location.capture("/query")[m
[31m-             if res.status ~= ngx.HTTP_OK then[m
[31m-                 local tid = res.header["X-Mysql-Tid"][m
[31m-                 if tid and tid ~= "" then[m
[31m-                     ngx.location.capture("/kill", { args = {tid = tid} })[m
[31m-                 end[m
[31m-                 return ngx.HTTP_INTERNAL_SERVER_ERROR;[m
[31m-             end[m
[31m-             ngx.print(res.body)[m
[31m-         '[m
[31m-     }[m
[31m-[m
[31m-where we make use of L<headers-more-nginx-module|http://github.com/openresty/headers-more-nginx-module>, L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>, and L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module> too. When the SQL query timed out, we'll explicitly cancel it immediately. One pitfall here is that you have to add these modules in this order while building Nginx:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<headers-more-nginx-module|http://github.com/openresty/headers-more-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Such that, their output filters will work in the I<reversed> order, i.e., first convert RDS to JSON, and then add our C<X-Mysql-Tid> custom header, and finally capture the whole (subrequest) response with the Lua module. You're recommended to use the L<OpenResty bundle|http://openresty.org/> though, it ensures the module building order automatically for you.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Output Format[m
[31m-[m
[31m-This module generates binary query results in a format that is shared among the various Nginx database driver modules like L<ngx_postgres|http://github.com/FRiCKLE/ngx_postgres/>. This data format is named C<Resty DBD Stream> (RDS).[m
[31m-[m
[31m-If you're a web app developer, you may be more interested in[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-using L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module> to obtain JSON output,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-using L<rds-csv-nginx-module|http://github.com/openresty/rds-csv-nginx-module> to obain Comma-Separated-Value (CSV) output,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-or using L<lua-rds-parser|http://github.com/openresty/lua-rds-parser> to parse the RDS data into Lua data structures.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-For the HTTP response header part, the C<200 OK> status code should always be returned. The C<Content-Type> header I<must> be set to C<application/x-resty-dbd-stream>. And the driver generating this response also sets a C<X-Resty-DBD> header. For instance, this module adds the following output header:[m
[31m-[m
[31m-    X-Resty-DBD-Module: drizzle 0.1.0[m
[31m-[m
[31m-where C<0.1.0> is this module's own version number. This C<X-Resty-DBD-Module> header is optional though.[m
[31m-[m
[31m-Below is the HTTP response body format (version 0.0.3):[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 RDS Header Part[m
[31m-[m
[31m-The RDS Header Part consists of the following fields:[m
[31m-[m
[31m-B<uint8_t>[m
[31m-endian type (1 means big-endian and little endian otherwise)[m
[31m-[m
[31m-B<uint32_t>[m
[31m-format version (v1.2.3 is represented as 1002003 in decimal)[m
[31m-[m
[31m-B<uint8_t>[m
[31m-result type (0 means normal SQL result type, fixed for now)[m
[31m-[m
[31m-B<uint16_t>[m
[31m-standard error code[m
[31m-[m
[31m-B<uint16_t>[m
[31m-driver-specific error code[m
[31m-[m
[31m-B<uint16_t>[m
[31m-driver-specific error string length[m
[31m-[m
[31m-B<u_char >*[m
[31m-driver-specific error string data[m
[31m-[m
[31m-B<uint64_t>[m
[31m-database rows affected[m
[31m-[m
[31m-B<uint64_t>[m
[31m-insert id (if none, 0)[m
[31m-[m
[31m-B<uint16_t>[m
[31m-column count[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 RDS Body Part[m
[31m-[m
[31m-When the C<column count> field in the L<RDS Header Part> is zero, then the whole RDS Body Part is omitted.[m
[31m-[m
[31m-The RDS Body Part consists of two sections, L<Columns> and L<Rows>.[m
[31m-[m
[31m-[m
[31m-=head3 Columns[m
[31m-[m
[31m-[m
[31m-The columns part consists of zero or more column data. The number of columns is determined by C<column count> field in L<RDS Header Part>.[m
[31m-[m
[31m-Each column consists of the following fields[m
[31m-[m
[31m-B<uint16_t>[m
[31m-non-zero value for standard column type code and for the column list terminator and zero otherwise.[m
[31m-[m
[31m-B<uint16_t>[m
[31m-driver-specific column type code[m
[31m-[m
[31m-B<uint16_t>[m
[31m-column name length[m
[31m-[m
[31m-B<u_char >*[m
[31m-column name data[m
[31m-[m
[31m-[m
[31m-=head3 Rows[m
[31m-[m
[31m-[m
[31m-The rows part consists of zero or more row data, terminated by a 8-bit zero.[m
[31m-[m
[31m-Each row data consists of a L<Row Flag> and an optional L<Fields Data> part.[m
[31m-[m
[31m-[m
[31m-=head4 Row Flag[m
[31m-[m
[31m-[m
[31m-B<uint8_t>[m
[31m-valid row (1 means valid, and 0 means the row list terminator)[m
[31m-[m
[31m-[m
[31m-=head4 Fields Data[m
[31m-[m
[31m-[m
[31m-The Fields Data consists zero or more fields of data. The field count is predetermined by the E<lt>codeE<gt>column numberE<lt>/code) specified in L<RDS Header Part>.[m
[31m-[m
[31m-B<uint32_t>[m
[31m-field length ((uint32_t) -1 represents NULL)[m
[31m-[m
[31m-B<u_char >*[m
[31m-field data in textual representation), is empty (0) if field length == (uint32_t) -1[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 RDS buffer Limitations[m
[31m-[m
[31m-On the nginx output chain link level, the following components should be put into a single C<ngx_buf_t> struct:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the header[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-each column and the column list terminator[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-each row's valid flag byte and row list terminator[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-each field in each row (if any) but the field data can span multiple bufs.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Status Code[m
[31m-[m
[31m-If the MySQL error code in MySQL's query result is not OK, then a 500 error page is returned by this module, except for the table non-existent error, which results in the C<410 Gone> error page.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Caveats[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Other usptream modules like C<upstream_hash> and L<HttpUpstreamKeepaliveModule|http://wiki.nginx.org/HttpUpstreamKeepaliveModule> I<must not> be used with this module in a single upstream block.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Directives like L<server|http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server> I<must not> be mixed with L<drizzle_server> either.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Upstream backends that don't use L<drizzle_server> to define server entries I<must not> be used in the L<drizzle_pass> directive.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Trouble Shooting[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When you see the following error message in C<error.log>:[m
[31m-[m
[31m-failed to connect: 15: drizzle_state_handshake_result_read:[m
[31m-old insecure authentication mechanism not supported in upstream, ...[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-then you may checkout if your MySQL is too old (at least 5.x is required) or your mysql config file explicitly forces the use of old authentication method (you should remove the C<old-passwords> line from your C<my.cnf> and add the line C<secure_auth 1>).[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When you see the following error message in C<error.log>:[m
[31m-[m
[31m-failed to connect: 23: Access denied for user 'root'@'ubuntu'[m
[31m-(using password: YES) while connecting to drizzle upstream, ...[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-You should check if your MySQL account does have got TCP login access on your MySQL server side. A quick check is to use MySQL's official client to connect to your server:[m
[31m-[m
[31m-         mysql --protocol=tcp -u user --password=password -h foo.bar.com dbname[m
[31m-[m
[31m-Note that the C<--protocol=tcp> option is required here, or your MySQL client may use Unix Domain Socket to connect to your MySQL server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Calling mysql procedures are currently not supported because the underlying libdrizzle library does not support the C<CLIENT_MULTI_RESULTS> flag yet :( But we'll surely work on it.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Multiple SQL statements in a single query are not supported due to the lack of C<CLIENT_MULTI_STATEMENTS> support in the underlying libdrizzle library.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This module does not (yet) work with the C<RTSIG> event model.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module as well as L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module> via the ngx_openresty bundle:[m
[31m-[m
[31m-E<lt>http://openresty.orgE<gt>[m
[31m-[m
[31m-The installation steps are usually as simple as C<./configure --with-http_drizzle_module && make && make install> (But you still need to install the libdrizzle library manually, see [E<lt>http://openresty.org/#DrizzleNginxModule]E<gt>(http://openresty.org/#DrizzleNginxModule) for detailed instructions.[m
[31m-[m
[31m-Alternatively, you can compile this module with Nginx core's source by hand:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-You should first install libdrizzle 1.0 which is now distributed with the drizzle project and can be obtained from [E<lt>https://launchpad.net/drizzle]E<gt>(https://launchpad.net/drizzle). The latest drizzle7 release does not support building libdrizzle 1.0 separately and requires a lot of external dependencies like Boost and Protobuf which are painful to install. The last version supporting building libdrizzle 1.0 separately is C<2011.07.21>. You can download it from E<lt>http://agentzh.org/misc/nginx/drizzle7-2011.07.21.tar.gzE<gt> . Which this version of drizzle7, installation of libdrizzle 1.0 is usually as simple as[m
[31m-[m
[31m-         tar xzvf drizzle7-2011.07.21.tar.gz[m
[31m-         cd drizzle7-2011.07.21/[m
[31m-         ./configure --without-server[m
[31m-         make libdrizzle-1.0[m
[31m-         make install-libdrizzle-1.0[m
[31m-[m
[31m-Ensure that you have the C<python> command point to a C<python2> interpreter. It's known that on recent : Arch Linux distribution, C<python> is linked to C<python3> by default, and while running C<make libdrizzle-1.0> will yield the error[m
[31m-[m
[31m-         File "config/pandora-plugin", line 185[m
[31m-             print "Dependency loop detected with %s" % plugin['name'][m
[31m-                                                      ^[m
[31m-         SyntaxError: invalid syntax[m
[31m-         make: *** [.plugin.scan] Error 1[m
[31m-[m
[31m-You can fix this by pointing C<python> to C<python2>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from drizzle-nginx-module L<file list|http://github.com/openresty/drizzle-nginx-module/tags>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example, the version 1.7.10 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-         wget 'http://nginx.org/download/nginx-1.7.10.tar.gz'[m
[31m-         tar -xzvf nginx-1.7.10.tar.gz[m
[31m-         cd nginx-1.7.10/[m
[31m-    [m
[31m-         # if you have installed libdrizzle to the prefix /opt/drizzle, then[m
[31m-         # specify the following environments:[m
[31m-         # export LIBDRIZZLE_INC=/opt/drizzle/include/libdrizzle-1.0[m
[31m-         # export LIBDRIZZLE_LIB=/opt/drizzle/lib[m
[31m-    [m
[31m-         # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-         ./configure --prefix=/opt/nginx \[m
[31m-                     --add-module=/path/to/drizzle-nginx-module[m
[31m-    [m
[31m-         make -j2[m
[31m-         make install[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-You usually also need L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module> to obtain JSON output from the binary RDS output generated by this upstream module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-If you're using MySQL, then MySQL C<5.0 ~ 5.5> is required. We're not sure if MySQL C<5.6+> work; reports welcome![m
[31m-[m
[31m-This module has been tested on Linux and Mac OS X. Reports on other POSIX-compliant systems will be highly appreciated.[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.5.x (last tested: 1.5.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.4.x (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.3.x (last tested: 1.3.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.2.x (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (last tested: 1.0.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x (last tested: 0.8.55)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.7.x E<gt>= 0.7.44 (last tested version is 0.7.67)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like C<0.6.x> and C<0.5.x> will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above C<0.7.44> does not work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<issue tracking interface|http://github.com/openresty/drizzle-nginx-module/issues> provided by GitHub,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or sending an email to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>drizzle-nginx-module|http://github.com/openresty/drizzle-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|http://github.com/openresty/drizzle-nginx-module/tree/master/t/> are[m
[31m-L<declarative|http://github.com/openresty/drizzle-nginx-module/blob/master/t/sanity.t> too. Thanks to the L<Test::Nginx|http://search.cpan.org/perldoc?Test::Nginx> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-echo-module:$PATH prove -r t[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add the MySQL transaction support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add multi-statement MySQL query support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the "drizzle_max_output_size" directive. When the RDS data is larger then the size specified, the module will try to terminate the output as quickly as possible but will still ensure the resulting response body is still in valid RDS format.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the C<drizzle_upstream_next> mechanism for failover support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add support for multiple "drizzle_query" directives in a single location.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement I<weighted> round-robin algorithm for the upstream server clusters.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add the C<max_idle_time> option to the L<drizzle_server> directive, so that the connection pool will automatically release idle connections for the timeout you specify.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add the C<min> option to the "drizzle_server" directive so that the connection pool will automatically create that number of connections and put them into the pool.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add Unix domain socket support in the C<drizzle_server> directive.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-make the L<drizzle_query> directive reject variables that have not been processed by a L<drizzle_process> directive. This will pretect us from SQL injections. There will also be an option ("strict=no") to disable such checks.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the ngx_openresty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Authors[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-chaoslawful (王晓哲) E<lt>chaoslawful at gmail dot comE<gt>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh at gmail dot comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Piotr Sikora E<lt>piotr.sikora at frickle dot comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This module is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2009-2014, by Xiaozhe Wang (chaoslawful) E<lt>chaoslawful@gmail.comE<gt>.[m
[31m-[m
[31m-Copyright (C) 2009-2014, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-Copyright (C) 2010-2014, by FRiCKLE Piotr Sikora E<lt>info@frickle.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rds-json-nginx-module|http://github.com/openresty/rds-json-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rds-csv-nginx-module|http://github.com/openresty/rds-csv-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-rds-parser|http://github.com/openresty/lua-rds-parser>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<The ngx_openresty bundle|http://openresty.org>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<DrizzleNginxModule bundled by ngx_openresty|http://openresty.org/#DrizzleNginxModule>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<postgres-nginx-module|http://github.com/FRiCKLE/ngx_postgres>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<lua-resty-mysql|https://github.com/openresty/lua-resty-mysql> library based on the L<lua-nginx-module|http://github.com/openresty/lua-nginx-module> cosocket API.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/echo-nginx-module-0.59/echo-nginx-module-0.59.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/echo-nginx-module-0.59/echo-nginx-module-0.59.pod[m
[1mdeleted file mode 100644[m
[1mindex 32aaaf1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/echo-nginx-module-0.59/echo-nginx-module-0.59.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1870 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-B<ngx_echo> - Brings "echo", "sleep", "time", "exec" and more shell-style goodies to Nginx config file.[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Version[m
[31m-[m
[31m-This document describes ngx_echo L<v0.59|https://github.com/openresty/echo-nginx-module/tags> released on 15 May 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-       location /hello {[m
[31m-         echo "hello, world!";[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       location /hello {[m
[31m-         echo -n "hello, ";[m
[31m-         echo "world!";[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       location /timed_hello {[m
[31m-         echo_reset_timer;[m
[31m-         echo hello world;[m
[31m-         echo "'hello world' takes about $echo_timer_elapsed sec.";[m
[31m-         echo hiya igor;[m
[31m-         echo "'hiya igor' takes about $echo_timer_elapsed sec.";[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       location /echo_with_sleep {[m
[31m-         echo hello;[m
[31m-         echo_flush;  # ensure the client can see previous output immediately[m
[31m-         echo_sleep   2.5;  # in sec[m
[31m-         echo world;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # in the following example, accessing /echo yields[m
[31m-       #   hello[m
[31m-       #   world[m
[31m-       #   blah[m
[31m-       #   hiya[m
[31m-       #   igor[m
[31m-       location /echo {[m
[31m-           echo_before_body hello;[m
[31m-           echo_before_body world;[m
[31m-           proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;[m
[31m-           echo_after_body hiya;[m
[31m-           echo_after_body igor;[m
[31m-       }[m
[31m-       location /echo/more {[m
[31m-           echo blah;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # the output of /main might be[m
[31m-       #   hello[m
[31m-       #   world[m
[31m-       #   took 0.000 sec for total.[m
[31m-       # and the whole request would take about 2 sec to complete.[m
[31m-       location /main {[m
[31m-           echo_reset_timer;[m
[31m-    [m
[31m-           # subrequests in parallel[m
[31m-           echo_location_async /sub1;[m
[31m-           echo_location_async /sub2;[m
[31m-    [m
[31m-           echo "took $echo_timer_elapsed sec for total.";[m
[31m-       }[m
[31m-       location /sub1 {[m
[31m-           echo_sleep 2;[m
[31m-           echo hello;[m
[31m-       }[m
[31m-       location /sub2 {[m
[31m-           echo_sleep 1;[m
[31m-           echo world;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # the output of /main might be[m
[31m-       #   hello[m
[31m-       #   world[m
[31m-       #   took 3.003 sec for total.[m
[31m-       # and the whole request would take about 3 sec to complete.[m
[31m-       location /main {[m
[31m-           echo_reset_timer;[m
[31m-    [m
[31m-           # subrequests in series (chained by CPS)[m
[31m-           echo_location /sub1;[m
[31m-           echo_location /sub2;[m
[31m-    [m
[31m-           echo "took $echo_timer_elapsed sec for total.";[m
[31m-       }[m
[31m-       location /sub1 {[m
[31m-           echo_sleep 2;[m
[31m-           echo hello;[m
[31m-       }[m
[31m-       location /sub2 {[m
[31m-           echo_sleep 1;[m
[31m-           echo world;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # Accessing /dup gives[m
[31m-       #   ------ END ------[m
[31m-       location /dup {[m
[31m-         echo_duplicate 3 "--";[m
[31m-         echo_duplicate 1 " END ";[m
[31m-         echo_duplicate 3 "--";[m
[31m-         echo;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # /bighello will generate 1000,000,000 hello's.[m
[31m-       location /bighello {[m
[31m-         echo_duplicate 1000_000_000 'hello';[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # echo back the client request[m
[31m-       location /echoback {[m
[31m-         echo_duplicate 1 $echo_client_request_headers;[m
[31m-         echo "\r";[m
[31m-    [m
[31m-         echo_read_request_body;[m
[31m-    [m
[31m-         echo_request_body;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # GET /multi will yields[m
[31m-       #   querystring: foo=Foo[m
[31m-       #   method: POST[m
[31m-       #   body: hi[m
[31m-       #   content length: 2[m
[31m-       #   ///[m
[31m-       #   querystring: bar=Bar[m
[31m-       #   method: PUT[m
[31m-       #   body: hello[m
[31m-       #   content length: 5[m
[31m-       #   ///[m
[31m-       location /multi {[m
[31m-           echo_subrequest_async POST '/sub' -q 'foo=Foo' -b 'hi';[m
[31m-           echo_subrequest_async PUT '/sub' -q 'bar=Bar' -b 'hello';[m
[31m-       }[m
[31m-       location /sub {[m
[31m-           echo "querystring: $query_string";[m
[31m-           echo "method: $echo_request_method";[m
[31m-           echo "body: $echo_request_body";[m
[31m-           echo "content length: $http_content_length";[m
[31m-           echo '///';[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # GET /merge?/foo.js&/bar/blah.js&/yui/baz.js will merge the .js resources together[m
[31m-       location /merge {[m
[31m-           default_type 'text/javascript';[m
[31m-           echo_foreach_split '&' $query_string;[m
[31m-               echo "/* JS File $echo_it */";[m
[31m-               echo_location_async $echo_it;[m
[31m-               echo;[m
[31m-           echo_end;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-       # accessing /if?val=abc yields the "hit" output[m
[31m-       # while /if?val=bcd yields "miss":[m
[31m-       location ^~ /if {[m
[31m-           set $res miss;[m
[31m-           if ($arg_val ~* '^a') {[m
[31m-               set $res hit;[m
[31m-               echo $res;[m
[31m-           }[m
[31m-           echo $res;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module wraps lots of Nginx internal APIs for streaming input and output, parallel/sequential subrequests, timers and sleeping, as well as various meta data accessing.[m
[31m-[m
[31m-Basically it provides various utilities that help testing and debugging of other modules by trivially emulating different kinds of faked subrequest locations.[m
[31m-[m
[31m-People will also find it useful in real-world applications that need to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-serve static contents directly from memory (loading from the Nginx config file).[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-wrap the upstream response with custom header and footer (kinda like the L<addition module|http://nginx.org/en/docs/http/ngx_http_addition_module.html> but with contents read directly from the config file and Nginx variables).[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-merge contents of various "Nginx locations" (i.e., subrequests) together in a single main request (using L<echo_location> and its friends).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This is a special dual-role module that can I<lazily> serve as a content handler or register itself as an output filter only upon demand. By default, this module does not do anything at all.[m
[31m-[m
[31m-Technially, this module has also demonstrated the following techniques that might be helpful for module writers:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Issue parallel subreqeusts directly from content handler.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Issue chained subrequests directly from content handler, by passing continuation along the subrequest chain.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Issue subrequests with all HTTP 1.1 methods and even an optional faked HTTP request body.[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-Interact with the Nginx event model directly from content handler using custom events and timers, and resume the content handler back if necessary.[m
[31m-[m
[31m-=item 5.[m
[31m-[m
[31m-Dual-role module that can (lazily) serve as a content handler or an output filter or both.[m
[31m-[m
[31m-=item 6.[m
[31m-[m
[31m-Nginx config file variable creation and interpolation.[m
[31m-[m
[31m-=item 7.[m
[31m-[m
[31m-Streaming output control using output_chain, flush and its friends.[m
[31m-[m
[31m-=item 8.[m
[31m-[m
[31m-Read client request body from the content handler, and returns back (asynchronously) to the content handler after completion.[m
[31m-[m
[31m-=item 9.[m
[31m-[m
[31m-Use Perl-based declarative L<test suite> to drive the development of Nginx C modules.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Content Handler Directives[m
[31m-[m
[31m-Use of the following directives register this module to the current Nginx location as a content handler. If you want to use another module, like the L<standard proxy module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>, as the content handler, use the L<filter directives> provided by this module.[m
[31m-[m
[31m-All the content handler directives can be mixed together in a single Nginx location and they're supposed to run sequentially just as in the Bash scripting language.[m
[31m-[m
[31m-Every content handler directive supports variable interpolation in its arguments (if any).[m
[31m-[m
[31m-The MIME type set by the L<standard default_type directive|http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type> is respected by this module, as in:[m
[31m-[m
[31m-[m
[31m-       location /hello {[m
[31m-         default_type text/plain;[m
[31m-         echo hello;[m
[31m-       }[m
[31m-[m
[31m-Then on the client side:[m
[31m-[m
[31m-[m
[31m-       $ curl -I 'http://localhost/echo'[m
[31m-       HTTP/1.1 200 OK[m
[31m-       Server: nginx/0.8.20[m
[31m-       Date: Sat, 17 Oct 2009 03:40:19 GMT[m
[31m-       Content-Type: text/plain[m
[31m-       Connection: keep-alive[m
[31m-[m
[31m-Since the L<v0.22> release, all of the directives are allowed in the L<rewrite module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s L<if|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if> directive block, for instance:[m
[31m-[m
[31m-[m
[31m-     location ^~ /if {[m
[31m-         set $res miss;[m
[31m-         if ($arg_val ~* '^a') {[m
[31m-             set $res hit;[m
[31m-             echo $res;[m
[31m-         }[m
[31m-         echo $res;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo[m
[31m-[m
[31m-B<syntax:> I<echo [options] E<lt>stringE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Sends arguments joined by spaces, along with a trailing newline, out to the client.[m
[31m-[m
[31m-Note that the data might be buffered by Nginx's underlying buffer. To force the output data flushed immediately, use the L<echo_flush> command just after C<echo>, as in[m
[31m-[m
[31m-[m
[31m-        echo hello world;[m
[31m-        echo_flush;[m
[31m-[m
[31m-When no argument is specified, I<echo> emits the trailing newline alone, just like the I<echo> command in shell.[m
[31m-[m
[31m-Variables may appear in the arguments. An example is[m
[31m-[m
[31m-[m
[31m-        echo The current request uri is $request_uri;[m
[31m-[m
[31m-where L<$request_uri|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri> is a variable exposed by the L<ngx_http_core_module|http://nginx.org/en/docs/http/ngx_http_core_module.html>.[m
[31m-[m
[31m-This command can be used multiple times in a single location configuration, as in[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo hello;[m
[31m-         echo world;[m
[31m-     }[m
[31m-[m
[31m-The output on the client side looks like this[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/echo'[m
[31m-     hello[m
[31m-     world[m
[31m-[m
[31m-Special characters like newlines (C<\n>) and tabs (C<\t>) can be escaped using C-style escaping sequences. But a notable exception is the dollar sign (C<$>). As of Nginx 0.8.20, there's still no clean way to esacpe this characters. (A work-around might be to use a C<$echo_dollor> variable that is always evaluated to the constant C<$> character. This feature will possibly be introduced in a future version of this module.)[m
[31m-[m
[31m-As of the echo L<v0.28> release, one can suppress the trailing newline character in the output by using the C<-n> option, as in[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo -n "hello, ";[m
[31m-         echo "world";[m
[31m-     }[m
[31m-[m
[31m-Accessing C</echo> gives[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/echo'[m
[31m-     hello, world[m
[31m-[m
[31m-Leading C<-n> in variable values won't take effect and will be emitted literally, as in[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         set $opt -n;[m
[31m-         echo $opt "hello,";[m
[31m-         echo "world";[m
[31m-     }[m
[31m-[m
[31m-This gives the following output[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/echo'[m
[31m-     -n hello,[m
[31m-     world[m
[31m-[m
[31m-One can output leading C<-n> literals and other options using the special C<--> option like this[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo -- -n is an option;[m
[31m-     }[m
[31m-[m
[31m-which yields[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/echo'[m
[31m-     -n is an option[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_duplicate[m
[31m-[m
[31m-B<syntax:> I<echo_duplicate E<lt>countE<gt> E<lt>stringE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Outputs duplication of a string indicated by the second argument, using the count specified in the first argument.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-       location /dup {[m
[31m-           echo_duplicate 3 "abc";[m
[31m-       }[m
[31m-[m
[31m-will lead to the output of C<"abcabcabc">.[m
[31m-[m
[31m-Underscores are allowed in the count number, just like in Perl. For example, to emit 1000,000,000 instances of C<"hello, world">:[m
[31m-[m
[31m-[m
[31m-       location /many_hellos {[m
[31m-           echo_duplicate 1000_000_000 "hello, world";[m
[31m-       }[m
[31m-[m
[31m-The C<count> argument could be zero, but not negative. The second C<string> argument could be an empty string ("") likewise.[m
[31m-[m
[31m-Unlike the L<echo> directive, no trailing newline is appended to the result. So it's possible to "abuse" this directive as a no-trailing-newline version of L<echo> by using "count" 1, as in[m
[31m-[m
[31m-[m
[31m-       location /echo_art {[m
[31m-           echo_duplicate 2 '---';[m
[31m-           echo_duplicate 1 ' END ';  # we don't want a trailing newline here[m
[31m-           echo_duplicate 2 '---';[m
[31m-           echo;  # we want a trailing newline here...[m
[31m-       }[m
[31m-[m
[31m-You get[m
[31m-[m
[31m-[m
[31m-       ------ END ------[m
[31m-[m
[31m-But use of the C<-n> option in L<echo> is more appropriate for this purpose.[m
[31m-[m
[31m-This directive was first introduced in L<version 0.11>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_flush[m
[31m-[m
[31m-B<syntax:> I<echo_flush>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Forces the data potentially buffered by underlying Nginx output filters to send immediately to the client side via socket.[m
[31m-[m
[31m-Note that techically the command just emits a ngx_buf_t object with C<flush> slot set to 1, so certain weird third-party output filter module could still block it before it reaches Nginx's (last) write filter.[m
[31m-[m
[31m-This directive does not take any argument.[m
[31m-[m
[31m-Consider the following example:[m
[31m-[m
[31m-[m
[31m-       location /flush {[m
[31m-          echo hello;[m
[31m-    [m
[31m-          echo_flush;[m
[31m-    [m
[31m-          echo_sleep 1;[m
[31m-          echo world;[m
[31m-       }[m
[31m-[m
[31m-Then on the client side, using curl to access C</flush>, you'll see the "hello" line immediately, but only after 1 second, the last "world" line. Without calling C<echo_flush> in the example above, you'll most likely see no output until 1 second is elapsed due to the internal buffering of Nginx.[m
[31m-[m
[31m-This directive will fail to flush the output buffer in case of subrequests get involved. Consider the following example:[m
[31m-[m
[31m-[m
[31m-       location /main {[m
[31m-           echo_location_async /sub;[m
[31m-           echo hello;[m
[31m-           echo_flush;[m
[31m-       }[m
[31m-       location /sub {[m
[31m-           echo_sleep 1;[m
[31m-       }[m
[31m-[m
[31m-Then the client won't see "hello" appear even if C<echo_flush> has been executed before the subrequest to C</sub> has actually started executing. The outputs of C</main> that are sent I<after> L<echo_location_async> will be postponed and buffered firmly.[m
[31m-[m
[31m-This does I<not> apply to outputs sent before the subrequest initiated. For a modified version of the example given above:[m
[31m-[m
[31m-[m
[31m-       location /main {[m
[31m-           echo hello;[m
[31m-           echo_flush;[m
[31m-           echo_location_async /sub;[m
[31m-       }[m
[31m-       location /sub {[m
[31m-           echo_sleep 1;[m
[31m-       }[m
[31m-[m
[31m-The client will immediately see "hello" before C</sub> enters sleeping.[m
[31m-[m
[31m-See also L<echo>, L<echo_sleep>, and L<echo_location_async>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_sleep[m
[31m-[m
[31m-B<syntax:> I<echo_sleep E<lt>secondsE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Sleeps for the time period specified by the argument, which is in seconds.[m
[31m-[m
[31m-This operation is non-blocking on server side, so unlike the L<echo_blocking_sleep> directive, it won't block the whole Nginx worker process.[m
[31m-[m
[31m-The period might takes three digits after the decimal point and must be greater than 0.001.[m
[31m-[m
[31m-An example is[m
[31m-[m
[31m-[m
[31m-        location /echo_after_sleep {[m
[31m-            echo_sleep 1.234;[m
[31m-            echo resumed!;[m
[31m-        }[m
[31m-[m
[31m-Behind the scene, it sets up a per-request "sleep" ngx_event_t object, and adds a timer using that custom event to the Nginx event model and just waits for a timeout on that event. Because the "sleep" event is per-request, this directive can work in parallel subrequests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_blocking_sleep[m
[31m-[m
[31m-B<syntax:> I<echo_blocking_sleep E<lt>secondsE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This is a blocking version of the L<echo_sleep> directive.[m
[31m-[m
[31m-See the documentation of L<echo_sleep> for more detail.[m
[31m-[m
[31m-Behind the curtain, it calls the ngx_msleep macro provided by the Nginx core which maps to usleep on POSIX-compliant systems.[m
[31m-[m
[31m-Note that this directive will block the current Nginx worker process completely while being executed, so never use it in production environment.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_reset_timer[m
[31m-[m
[31m-B<syntax:> I<echo_reset_timer>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Reset the timer begin time to I<now>, i.e., the time when this command is executed during request.[m
[31m-[m
[31m-The timer begin time is default to the starting time of the current request and can be overridden by this directive, potentially multiple times in a single location. For example:[m
[31m-[m
[31m-[m
[31m-       location /timed_sleep {[m
[31m-           echo_sleep 0.03;[m
[31m-           echo "$echo_timer_elapsed sec elapsed.";[m
[31m-    [m
[31m-           echo_reset_timer;[m
[31m-    [m
[31m-           echo_sleep 0.02;[m
[31m-           echo "$echo_timer_elapsed sec elapsed.";[m
[31m-       }[m
[31m-[m
[31m-The output on the client side might be[m
[31m-[m
[31m-[m
[31m-     $ curl 'http://localhost/timed_sleep'[m
[31m-     0.032 sec elapsed.[m
[31m-     0.020 sec elapsed.[m
[31m-[m
[31m-The actual figures you get on your side may vary a bit due to your system's current activities.[m
[31m-[m
[31m-Invocation of this directive will force the underlying Nginx timer to get updated to the current system time (regardless the timer resolution specified elsewhere in the config file). Furthermore, references of the L<$echo_timer_elapsed> variable will also trigger timer update forcibly.[m
[31m-[m
[31m-See also L<echo_sleep> and L<$echo_timer_elapsed>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_read_request_body[m
[31m-[m
[31m-B<syntax:> I<echo_read_request_body>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Explicitly reads request body so that the L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> variable will always have non-empty values (unless the body is so big that it has been saved by Nginx to a local temporary file).[m
[31m-[m
[31m-Note that this might not be the original client request body because the current request might be a subrequest with a "artificial" body specified by its parent.[m
[31m-[m
[31m-This directive does not generate any output itself, just like L<echo_sleep>.[m
[31m-[m
[31m-Here's an example for echo'ing back the original HTTP client request (both headers and body are included):[m
[31m-[m
[31m-[m
[31m-       location /echoback {[m
[31m-         echo_duplicate 1 $echo_client_request_headers;[m
[31m-         echo "\r";[m
[31m-         echo_read_request_body;[m
[31m-         echo $request_body;[m
[31m-       }[m
[31m-[m
[31m-The content of C</echoback> looks like this on my side (I was using Perl's LWP utility to access this location on the server):[m
[31m-[m
[31m-[m
[31m-       $ (echo hello; echo world) | lwp-request -m POST 'http://localhost/echoback'[m
[31m-       POST /echoback HTTP/1.1[m
[31m-       TE: deflate,gzip;q=0.3[m
[31m-       Connection: TE, close[m
[31m-       Host: localhost[m
[31m-       User-Agent: lwp-request/5.818 libwww-perl/5.820[m
[31m-       Content-Length: 12[m
[31m-       Content-Type: application/x-www-form-urlencoded[m
[31m-    [m
[31m-       hello[m
[31m-       world[m
[31m-[m
[31m-Because C</echoback> is the main request, L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> holds the original client request body.[m
[31m-[m
[31m-Before Nginx 0.7.56, it makes no sense to use this directive because L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> was first introduced in Nginx 0.7.58.[m
[31m-[m
[31m-This directive itself was first introduced in the echo module's L<v0.14 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_location_async[m
[31m-[m
[31m-B<syntax:> I<echo_location_async E<lt>locationE<gt> [E<lt>url_argsE<gt>]>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Issue GET subrequest to the location specified (first argument) with optional url arguments specified in the second argument.[m
[31m-[m
[31m-As of Nginx 0.8.20, the C<location> argument does I<not> support named location, due to a limitation in the C<ngx_http_subrequest> function. The same is true for its brother, the L<echo_location> directive.[m
[31m-[m
[31m-A very simple example is[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_location_async /sub;[m
[31m-         echo world;[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         echo hello;[m
[31m-     }[m
[31m-[m
[31m-Accessing C</main> gets[m
[31m-[m
[31m-[m
[31m-       hello[m
[31m-       world[m
[31m-[m
[31m-Calling multiple locations in parallel is also possible:[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_reset_timer;[m
[31m-         echo_location_async /sub1;[m
[31m-         echo_location_async /sub2;[m
[31m-         echo "took $echo_timer_elapsed sec for total.";[m
[31m-     }[m
[31m-     location /sub1 {[m
[31m-         echo_sleep 2; # sleeps 2 sec[m
[31m-         echo hello;[m
[31m-     }[m
[31m-     location /sub2 {[m
[31m-         echo_sleep 1; # sleeps 1 sec[m
[31m-         echo world;[m
[31m-     }[m
[31m-[m
[31m-Accessing C</main> yields[m
[31m-[m
[31m-[m
[31m-       $ time curl 'http://localhost/main'[m
[31m-       hello[m
[31m-       world[m
[31m-       took 0.000 sec for total.[m
[31m-    [m
[31m-       real  0m2.006s[m
[31m-       user  0m0.000s[m
[31m-       sys   0m0.004s[m
[31m-[m
[31m-You can see that the main handler C</main> does I<not> wait the subrequests C</sub1> and C</sub2> to complete and quickly goes on, hence the "0.000 sec" timing result. The whole request, however takes approximately 2 sec in total to complete because C</sub1> and C</sub2> run in parallel (or "concurrently" to be more accurate).[m
[31m-[m
[31m-If you use L<echo_blocking_sleep> in the previous example instead, then you'll get the same output, but with 3 sec total response time, because "blocking sleep" blocks the whole Nginx worker process.[m
[31m-[m
[31m-Locations can also take an optional querystring argument, for instance[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_location_async /sub 'foo=Foo&bar=Bar';[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         echo $arg_foo $arg_bar;[m
[31m-     }[m
[31m-[m
[31m-Accessing C</main> yields[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/main'[m
[31m-       Foo Bar[m
[31m-[m
[31m-Querystrings is I<not> allowed to be concatenated onto the C<location> argument with "?" directly, for example, C</sub?foo=Foo&bar=Bar> is an invalid location, and shouldn't be fed as the first argument to this directive.[m
[31m-[m
[31m-Technically speaking, this directive is an example that Nginx content handler issues one or more subrequests directly. AFAIK, the L<fancyindex module|https://connectical.com/projects/ngx-fancyindex/wiki> also does such kind of things ;)[m
[31m-[m
[31m-Nginx named locations like C<@foo> is I<not> supported here.[m
[31m-[m
[31m-This directive is logically equivalent to the GET version of L<echo_subrequest_async>. For example,[m
[31m-[m
[31m-[m
[31m-       echo_location_async /foo 'bar=Bar';[m
[31m-[m
[31m-is logically equivalent to[m
[31m-[m
[31m-[m
[31m-       echo_subrequest_async GET /foo -q 'bar=Bar';[m
[31m-[m
[31m-But calling this directive is slightly faster than calling L<echo_subrequest_async> using C<GET> because we don't have to parse the HTTP method names like C<GET> and options like C<-q>.[m
[31m-[m
[31m-This directive is first introduced in L<version 0.09> of this module and requires at least Nginx 0.7.46.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_location[m
[31m-[m
[31m-B<syntax:> I<echo_location E<lt>locationE<gt> [E<lt>url_argsE<gt>]>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Just like the L<echo_location_async> directive, but C<echo_location> issues subrequests I<in series> rather than in parallel. That is, the content handler directives following this directive won't be executed until the subrequest issued by this directive completes.[m
[31m-[m
[31m-The final response body is almost always equivalent to the case when L<echo_location_async> is used instead, only if timing variables is used in the outputs.[m
[31m-[m
[31m-Consider the following example:[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_reset_timer;[m
[31m-         echo_location /sub1;[m
[31m-         echo_location /sub2;[m
[31m-         echo "took $echo_timer_elapsed sec for total.";[m
[31m-     }[m
[31m-     location /sub1 {[m
[31m-         echo_sleep 2;[m
[31m-         echo hello;[m
[31m-     }[m
[31m-     location /sub2 {[m
[31m-         echo_sleep 1;[m
[31m-         echo world;[m
[31m-     }[m
[31m-[m
[31m-The location C</main> above will take for total 3 sec to complete (compared to 2 sec if L<echo_location_async> is used instead here). Here's the result in action on my machine:[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/main'[m
[31m-       hello[m
[31m-       world[m
[31m-       took 3.003 sec for total.[m
[31m-    [m
[31m-       real  0m3.027s[m
[31m-       user  0m0.020s[m
[31m-       sys   0m0.004s[m
[31m-[m
[31m-This directive is logically equivalent to the GET version of L<echo_subrequest>. For example,[m
[31m-[m
[31m-[m
[31m-       echo_location /foo 'bar=Bar';[m
[31m-[m
[31m-is logically equivalent to[m
[31m-[m
[31m-[m
[31m-       echo_subrequest GET /foo -q 'bar=Bar';[m
[31m-[m
[31m-But calling this directive is slightly faster than calling L<echo_subrequest> using C<GET> because we don't have to parse the HTTP method names like C<GET> and options like C<-q>.[m
[31m-[m
[31m-Behind the scene, it creates an C<ngx_http_post_subrequest_t> object as a I<continuation> and passes it into the C<ngx_http_subrequest> function call. Nginx will later reopen this "continuation" in the subrequest's C<ngx_http_finalize_request> function call. We resumes the execution of the parent-request's content handler and starts to run the next directive (command) if any.[m
[31m-[m
[31m-Nginx named locations like C<@foo> is I<not> supported here.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.12>.[m
[31m-[m
[31m-See also L<echo_location_async> for more details about the meaning of the arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_subrequest_async[m
[31m-[m
[31m-B<syntax:> I<echo_subrequest_async E<lt>HTTP_methodE<gt> E<lt>locationE<gt> [-q E<lt>url_argsE<gt>] [-b E<lt>request_bodyE<gt>] [-f E<lt>request_body_pathE<gt>]>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Initiate an asynchronous subrequest using HTTP method, an optional url arguments (or querystring) and an optional request body which can be defined as a string or as a path to a file which contains the body.[m
[31m-[m
[31m-This directive is very much like a generalized version of the L<echo_location_async> directive.[m
[31m-[m
[31m-Here's a small example demonstrating its usage:[m
[31m-[m
[31m-[m
[31m-     location /multi {[m
[31m-         # body defined as string[m
[31m-         echo_subrequest_async POST '/sub' -q 'foo=Foo' -b 'hi';[m
[31m-         # body defined as path to a file, relative to nginx prefix path if not absolute[m
[31m-         echo_subrequest_async PUT '/sub' -q 'bar=Bar' -f '/tmp/hello.txt';[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         echo "querystring: $query_string";[m
[31m-         echo "method: $echo_request_method";[m
[31m-         echo "body: $echo_request_body";[m
[31m-         echo "content length: $http_content_length";[m
[31m-         echo '///';[m
[31m-     }[m
[31m-[m
[31m-Then on the client side:[m
[31m-[m
[31m-[m
[31m-       $ echo -n hello > /tmp/hello.txt[m
[31m-       $ curl 'http://localhost/multi'[m
[31m-       querystring: foo=Foo[m
[31m-       method: POST[m
[31m-       body: hi[m
[31m-       content length: 2[m
[31m-       ///[m
[31m-       querystring: bar=Bar[m
[31m-       method: PUT[m
[31m-       body: hello[m
[31m-       content length: 5[m
[31m-       ///[m
[31m-[m
[31m-Here's more funny example using the standard L<proxy module> to handle the subrequest:[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo_subrequest_async POST /sub -b 'hello, world';[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         proxy_pass $scheme://127.0.0.1:$server_port/proxied;[m
[31m-     }[m
[31m-     location /proxied {[m
[31m-         echo "method: $echo_request_method.";[m
[31m-    [m
[31m-         # we need to read body explicitly here...or $echo_request_body[m
[31m-         #   will evaluate to empty ("")[m
[31m-         echo_read_request_body;[m
[31m-    [m
[31m-         echo "body: $echo_request_body.";[m
[31m-     }[m
[31m-[m
[31m-Then on the client side, we can see that[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/main'[m
[31m-       method: POST.[m
[31m-       body: hello, world.[m
[31m-[m
[31m-Nginx named locations like C<@foo> is I<not> supported here.[m
[31m-[m
[31m-This directive takes several options:[m
[31m-[m
[31m-    -q <url_args>        Specify the URL arguments (or URL querystring) for the subrequest.[m
[31m-[m
[31m-    -f <path>            Specify the path for the file whose content will be serve as the[m
[31m-                         subrequest's request body.[m
[31m-[m
[31m-    -b <data>            Specify the request body data[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.15>.[m
[31m-[m
[31m-The C<-f> option to define a file path for the body was introduced in the L<release v0.35>.[m
[31m-[m
[31m-See also the L<echo_subrequest> and L<echo_location_async> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_subrequest[m
[31m-[m
[31m-B<syntax:> I<echo_subrequest E<lt>HTTP_methodE<gt> E<lt>locationE<gt> [-q E<lt>url_argsE<gt>] [-b E<lt>request_bodyE<gt>] [-f E<lt>request_body_pathE<gt>]>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This is the synchronous version of the L<echo_subrequest_async> directive. And just like L<echo_location>, it does not block the Nginx worker process (while L<echo_blocking_sleep> does), rather, it uses continuation to pass control along the subrequest chain.[m
[31m-[m
[31m-See L<echo_subrequest_async> for more details.[m
[31m-[m
[31m-Nginx named locations like C<@foo> is I<not> supported here.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.15>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_foreach_split[m
[31m-[m
[31m-B<syntax:> I<echo_foreach_split E<lt>delimiterE<gt> E<lt>stringE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Split the second argument C<string> using the delimiter specified in the first argument, and then iterate through the resulting items. For instance:[m
[31m-[m
[31m-[m
[31m-       location /loop {[m
[31m-         echo_foreach_split ',' $arg_list;[m
[31m-           echo "item: $echo_it";[m
[31m-         echo_end;[m
[31m-       }[m
[31m-[m
[31m-Accessing /main yields[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/loop?list=cat,dog,mouse'[m
[31m-       item: cat[m
[31m-       item: dog[m
[31m-       item: mouse[m
[31m-[m
[31m-As seen in the previous example, this directive should always be accompanied by an L<echo_end> directive.[m
[31m-[m
[31m-Parallel C<echo_foreach_split> loops are allowed, but nested ones are currently forbidden.[m
[31m-[m
[31m-The C<delimiter> argument could contain I<multiple> arbitrary characters, like[m
[31m-[m
[31m-[m
[31m-       # this outputs "cat\ndog\nmouse\n"[m
[31m-       echo_foreach_split -- '-a-' 'cat-a-dog-a-mouse';[m
[31m-         echo $echo_it;[m
[31m-       echo_end;[m
[31m-[m
[31m-Logically speaking, this looping structure is just the C<foreach> loop combined with a C<split> function call in Perl (using the previous example):[m
[31m-[m
[31m-[m
[31m-        foreach (split ',', $arg_list) {[m
[31m-            print "item $_\n";[m
[31m-        }[m
[31m-[m
[31m-People will also find it useful in merging multiple C<.js> or C<.css> resources into a whole. Here's an example:[m
[31m-[m
[31m-[m
[31m-       location /merge {[m
[31m-           default_type 'text/javascript';[m
[31m-    [m
[31m-           echo_foreach_split '&' $query_string;[m
[31m-               echo "/* JS File $echo_it */";[m
[31m-               echo_location_async $echo_it;[m
[31m-               echo;[m
[31m-           echo_end;[m
[31m-       }[m
[31m-[m
[31m-Then accessing /merge to merge the C<.js> resources specified in the query string:[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/merge?/foo/bar.js&/yui/blah.js&/baz.js'[m
[31m-[m
[31m-One can also use third-party Nginx cache module to cache the merged response generated by the C</merge> location in the previous example.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.17>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_end[m
[31m-[m
[31m-B<syntax:> I<echo_end>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This directive is used to terminate the body of looping and conditional control structures like L<echo_foreach_split>.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.17>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_request_body[m
[31m-[m
[31m-B<syntax:> I<echo_request_body>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Outputs the contents of the request body previous read.[m
[31m-[m
[31m-Behind the scene, it's implemented roughly like this:[m
[31m-[m
[31m-[m
[31m-       if (r->request_body && r->request_body->bufs) {[m
[31m-           return ngx_http_output_filter(r, r->request_body->bufs);[m
[31m-       }[m
[31m-[m
[31m-Unlike the L<$echo_request_body> and $request_body variables, this directive will show the whole request body even if some parts or all parts of it are saved in temporary files on the disk.[m
[31m-[m
[31m-It is a "no-op" if no request body has been read yet.[m
[31m-[m
[31m-This directive was first introduced in the L<release v0.18>.[m
[31m-[m
[31m-See also L<echo_read_request_body> and the L<chunkin module|http://github.com/agentzh/chunkin-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_exec[m
[31m-[m
[31m-B<syntax:> I<echo_exec E<lt>locationE<gt> [E<lt>query_stringE<gt>]>[m
[31m-[m
[31m-B<syntax:> I<echo_exec E<lt>named_locationE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Does an internal redirect to the location specified. An optional query string can be specified for normal locations, as in[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           echo_exec /bar weight=5;[m
[31m-       }[m
[31m-       location /bar {[m
[31m-           echo $arg_weight;[m
[31m-       }[m
[31m-[m
[31m-Or equivalently[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           echo_exec /bar?weight=5;[m
[31m-       }[m
[31m-       location /bar {[m
[31m-           echo $arg_weight;[m
[31m-       }[m
[31m-[m
[31m-Named locations are also supported. Here's an example:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           echo_exec @bar;[m
[31m-       }[m
[31m-       location @bar {[m
[31m-           # you'll get /foo rather than @bar[m
[31m-           #  due to a potential bug in nginx.[m
[31m-           echo $echo_request_uri;[m
[31m-       }[m
[31m-[m
[31m-But query string (if any) will always be ignored for named location redirects due to a limitation in the C<ngx_http_named_location> function.[m
[31m-[m
[31m-Never try to echo things before the C<echo_exec> directive or you won't see the proper response of the location you want to redirect to. Because any echoing will cause the original location handler to send HTTP headers before the redirection happens.[m
[31m-[m
[31m-Technically speaking, this directive exposes the Nginx internal API functions C<ngx_http_internal_redirect> and C<ngx_http_named_location>.[m
[31m-[m
[31m-This directive was first introduced in the L<v0.21 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_status[m
[31m-[m
[31m-B<syntax:> I<echo_status E<lt>status-numE<gt>>[m
[31m-[m
[31m-B<default:> I<echo_status 200>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Specify the default response status code. Default to C<200>. This directive is declarative and the relative order with other echo-like directives is not important.[m
[31m-[m
[31m-Here is an example,[m
[31m-[m
[31m-[m
[31m-     location = /bad {[m
[31m-         echo_status 404;[m
[31m-         echo "Something is missing...";[m
[31m-     }[m
[31m-[m
[31m-then we get a response like this:[m
[31m-[m
[31m-    HTTP/1.1 404 Not Found[m
[31m-    Server: nginx/1.2.1[m
[31m-    Date: Sun, 24 Jun 2012 03:58:18 GMT[m
[31m-    Content-Type: text/plain[m
[31m-    Transfer-Encoding: chunked[m
[31m-    Connection: keep-alive[m
[31m-[m
[31m-    Something is missing...[m
[31m-[m
[31m-This directive was first introduced in the C<v0.40> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Filter Directives[m
[31m-[m
[31m-Use of the following directives trigger the filter registration of this module. By default, no filter will be registered by this module.[m
[31m-[m
[31m-Every filter directive supports variable interpolation in its arguments (if any).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_before_body[m
[31m-[m
[31m-B<syntax:> I<echo_before_body [options] [argument]...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<output filter>[m
[31m-[m
[31m-It's the filter version of the L<echo> directive, and prepends its output to the beginning of the original outputs generated by the underlying content handler.[m
[31m-[m
[31m-An example is[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo_before_body hello;[m
[31m-         proxy_pass $scheme://127.0.0.1:$server_port$request_uri/more;[m
[31m-     }[m
[31m-     location /echo/more {[m
[31m-         echo world[m
[31m-     }[m
[31m-[m
[31m-Accessing C</echo> from the client side yields[m
[31m-[m
[31m-[m
[31m-       hello[m
[31m-       world[m
[31m-[m
[31m-In the previous sample, we borrow the L<standard proxy module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html> to serve as the underlying content handler that generates the "main contents".[m
[31m-[m
[31m-Multiple instances of this filter directive are also allowed, as in:[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo_before_body hello;[m
[31m-         echo_before_body world;[m
[31m-         echo !;[m
[31m-     }[m
[31m-[m
[31m-On the client side, the output is like[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/echo'[m
[31m-       hello[m
[31m-       world[m
[31m-       ![m
[31m-[m
[31m-In this example, we also use the L<content handler directives> provided by this module as the underlying content handler.[m
[31m-[m
[31m-This directive also supports the C<-n> and C<--> options like the L<echo> directive.[m
[31m-[m
[31m-This directive can be mixed with its brother directive L<echo_after_body>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 echo_after_body[m
[31m-[m
[31m-B<syntax:> I<echo_after_body [argument]...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<output filter>[m
[31m-[m
[31m-It's very much like the L<echo_before_body> directive, but I<appends> its output to the end of the original outputs generated by the underlying content handler.[m
[31m-[m
[31m-Here's a simple example:[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo_after_body hello;[m
[31m-         proxy_pass http://127.0.0.1:$server_port$request_uri/more;[m
[31m-     }[m
[31m-     location /echo/more {[m
[31m-         echo world[m
[31m-     }[m
[31m-[m
[31m-Accessing C</echo> from the client side yields[m
[31m-[m
[31m-      world[m
[31m-      hello[m
[31m-[m
[31m-Multiple instances are allowed, as in:[m
[31m-[m
[31m-[m
[31m-     location /echo {[m
[31m-         echo_after_body hello;[m
[31m-         echo_after_body world;[m
[31m-         echo i;[m
[31m-         echo say;[m
[31m-     }[m
[31m-[m
[31m-The output on the client side while accessing the C</echo> location looks like[m
[31m-[m
[31m-      i[m
[31m-      say[m
[31m-      hello[m
[31m-      world[m
[31m-[m
[31m-This directive also supports the C<-n> and C<--> options like the L<echo> directive.[m
[31m-[m
[31m-This directive can be mixed with its brother directive L<echo_before_body>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_it[m
[31m-[m
[31m-This is a "topic variable" used by L<echo_foreach_split>, just like the C<$_> variable in Perl.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_timer_elapsed[m
[31m-[m
[31m-This variable holds the seconds elapsed since the start of the current request (might be a subrequest though) or the last invocation of the L<echo_reset_timer> command.[m
[31m-[m
[31m-The timing result takes three digits after the decimal point.[m
[31m-[m
[31m-References of this variable will force the underlying Nginx timer to update to the current system time, regardless the timer resolution settings elsewhere in the config file, just like the L<echo_reset_timer> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_request_body[m
[31m-[m
[31m-Evaluates to the current (sub)request's request body previously read if no part of the body has been saved to a temporary file. To always show the request body even if it's very large, use the L<echo_request_body> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_request_method[m
[31m-[m
[31m-Evaluates to the HTTP request method of the current request (it can be a subrequest).[m
[31m-[m
[31m-Behind the scene, it just takes the string data stored in C<< r->method_name >>.[m
[31m-[m
[31m-Compare it to the L<$echo_client_request_method> variable.[m
[31m-[m
[31m-At least for Nginx 0.8.20 and older, the L<$request_method|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_method> variable provided by the L<http core module|http://nginx.org/en/docs/http/ngx_http_core_module.html> is actually doing what our L<$echo_client_request_method> is doing.[m
[31m-[m
[31m-This variable was first introduced in our L<v0.15 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_client_request_method[m
[31m-[m
[31m-Always evaluates to the main request's HTTP method even if the current request is a subrequest.[m
[31m-[m
[31m-Behind the scene, it just takes the string data stored in C<< r->main->method_name >>.[m
[31m-[m
[31m-Compare it to the L<$echo_request_method> variable.[m
[31m-[m
[31m-This variable was first introduced in our L<v0.15 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_client_request_headers[m
[31m-[m
[31m-Evaluates to the original client request's headers.[m
[31m-[m
[31m-Just as the name suggests, it will always take the main request (or the client request) even if it's currently executed in a subrequest.[m
[31m-[m
[31m-A simple example is below:[m
[31m-[m
[31m-[m
[31m-       location /echoback {[m
[31m-          echo "headers are:"[m
[31m-          echo $echo_client_request_headers;[m
[31m-       }[m
[31m-[m
[31m-Accessing C</echoback> yields[m
[31m-[m
[31m-[m
[31m-       $ curl 'http://localhost/echoback'[m
[31m-       headers are[m
[31m-       GET /echoback HTTP/1.1[m
[31m-       User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g[m
[31m-       Host: localhost:1984[m
[31m-       Accept: */*[m
[31m-[m
[31m-Behind the scene, it recovers C<< r->main->header_in >> (or the large header buffers, if any) on the C level and does not construct the headers itself by traversing parsed results in the request object.[m
[31m-[m
[31m-This variable was first introduced in L<version 0.15>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_cacheable_request_uri[m
[31m-[m
[31m-Evaluates to the parsed form of the URI (usually led by C</>) of the current (sub-)request. Unlike the L<$echo_request_uri> variable, it is cacheable.[m
[31m-[m
[31m-See L<$echo_request_uri> for more details.[m
[31m-[m
[31m-This variable was first introduced in L<version 0.17>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_request_uri[m
[31m-[m
[31m-Evaluates to the parsed form of the URI (usually led by C</>) of the current (sub-)request. Unlike the L<$echo_cacheable_request_uri> variable, it is I<not> cacheable.[m
[31m-[m
[31m-This is quite different from the L<$request_uri|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri> variable exported by the L<ngx_http_core_module|http://nginx.org/en/docs/http/ngx_http_core_module.html>, because C<$request_uri> is the I<unparsed> form of the current request's URI.[m
[31m-[m
[31m-This variable was first introduced in L<version 0.17>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_incr[m
[31m-[m
[31m-It is a counter that always generate the current counting number, starting from 1. The counter is always associated with the main request even if it is accessed within a subrequest.[m
[31m-[m
[31m-Consider the following example[m
[31m-[m
[31m-[m
[31m-     location /main {[m
[31m-         echo "main pre: $echo_incr";[m
[31m-         echo_location_async /sub;[m
[31m-         echo_location_async /sub;[m
[31m-         echo "main post: $echo_incr";[m
[31m-     }[m
[31m-     location /sub {[m
[31m-         echo "sub: $echo_incr";[m
[31m-     }[m
[31m-[m
[31m-Accessing C</main> yields[m
[31m-[m
[31m-    main pre: 1[m
[31m-    sub: 3[m
[31m-    sub: 4[m
[31m-    main post: 2[m
[31m-[m
[31m-This directive was first introduced in the L<v0.18 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 $echo_response_status[m
[31m-[m
[31m-Evaluates to the status code of the current (sub)request, null if not any.[m
[31m-[m
[31m-Behind the scene, it's just the textual representation of C<< r->headers_out->status >>.[m
[31m-[m
[31m-This directive was first introduced in the L<v0.23 release>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<OpenResty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing OpenResty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.15 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     $ wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     $ tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     $ cd nginx-1.9.15/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     $ ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/echo-nginx-module[m
[31m-    [m
[31m-     $ make -j2[m
[31m-     $ make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<echo-nginx-module file list|https://github.com/openresty/echo-nginx-module/tags>.[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_echo_module.so;[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<OpenResty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x>                       (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x>                       (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>                       (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x>                       (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.3.x>                       (last tested: 1.3.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x>                       (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x>                       (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x>                       (last tested: 1.0.11)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x>                       (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x>                       (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.21>             (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-In particular,[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the directive L<echo_location_async> and its brother L<echo_subrequest_async> do I<not> work with B<0.7.x E<lt> 0.7.46>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<echo_after_body> directive does I<not> work at all with nginx B<E<lt> 0.8.7>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<echo_sleep> directive cannot be used after L<echo_location> or L<echo_subrequest> for nginx B<E<lt> 0.8.11>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work at all.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.21 does not work with this module, please consider L<reporting a bug>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Modules that use this module for testing[m
[31m-[m
[31m-The following modules take advantage of this C<echo> module in their test suite:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<memc|http://github.com/openresty/memc-nginx-module> module that supports almost the whole memcached TCP protocol.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<chunkin|http://github.com/agentzh/chunkin-nginx-module> module that adds HTTP 1.1 chunked input support to Nginx.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<headers_more|http://github.com/openresty/headers-more-nginx-module> module that allows you to add, set, and clear input and output headers under the conditions that you specify.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<echo> module itself.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Please mail me other modules that use C<echo> in any form and I'll add them to the list above :)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-create a ticket on the L<issue tracking interface|https://github.com/openresty/echo-nginx-module/issues> provided by GitHub,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or send a bug report, questions, or even patches to the L<OpenResty Community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>echo-nginx-module|https://github.com/openresty/echo-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|https://github.com/openresty/echo-nginx-module/tree/master/t/> are[m
[31m-L<declarative|https://github.com/openresty/echo-nginx-module/blob/master/t/echo.t> too. Thanks to the L<Test::Nginx|http://search.cpan.org/perldoc?Test::Nginx> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-echo-module:$PATH prove -r t[m
[31m-[m
[31m-You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary.[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-Some parts of the test suite requires standard modules L<proxy|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>, L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html> and L<SSI|http://nginx.org/en/docs/http/ngx_http_ssi_module.html> to be enabled as well when building Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Fix the L<echo_after_body> directive in subrequests.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add directives I<echo_read_client_request_body> and I<echo_request_headers>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new directive I<echo_log> to use Nginx's logging facility directly from the config file and specific loglevel can be specified, as in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_log debug "I am being called.";[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add support for options C<-h> and C<-t> to L<echo_subrequest_async> and L<echo_subrequest>. For example[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_subrequest POST /sub -q 'foo=Foo&bar=Bar' -b 'hello' -t 'text/plan' -h 'X-My-Header: blah blah'[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add options to control whether a subrequest should inherit cached variables from its parent request (i.e. the current request that is calling the subrequest in question). Currently none of the subrequests issued by this module inherit the cached variables from the parent request.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new variable I<$echo_active_subrequests> to show C<< r->main->count - 1 >>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add the I<echo_file> and I<echo_cached_file> directives.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new varaible I<$echo_request_headers> to accompany the existing L<$echo_client_request_headers> variable.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new directive I<echo_foreach>, as in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_foreach 'cat' 'dog' 'mouse';[m
[31m-         echo_location_async "/animals/$echo_it";[m
[31m-       echo_end;[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new directive I<echo_foreach_range>, as in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_foreach_range '[1..100]' '[a-zA-z0-9]';[m
[31m-         echo_location_async "/item/$echo_it";[m
[31m-       echo_end;[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new directive I<echo_repeat>, as in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_repeat 10 $i {[m
[31m-           echo "Page $i";[m
[31m-           echo_location "/path/to/page/$i";[m
[31m-       }[m
[31m-[m
[31m-This is just another way of saying[m
[31m-[m
[31m-[m
[31m-       echo_foreach_range $i [1..10];[m
[31m-           echo "Page $i";[m
[31m-           echo_location "/path/to/page/$i";[m
[31m-       echo_end;[m
[31m-[m
[31m-Thanks Marcus Clyne for providing this idea.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Add new variable $echo_random which always returns a random non-negative integer with the lower/upper limit specified by the new directives C<echo_random_min> and C<echo_random_max>. For example,[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-       echo_random_min  10[m
[31m-       echo_random_max  200[m
[31m-       echo "random number: $echo_random";[m
[31m-[m
[31m-Thanks Marcus Clyne for providing this idea.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the L<author> or just ask for a commit bit to the L<source repository> on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) I<E<lt>agentzh@gmail.comE<gt>>, CloudFlare Inc.[m
[31m-[m
[31m-This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2009-2016, Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original L<blog post|http://agentzh.blogspot.com/2009/10/hacking-on-nginx-echo-module.html> about this module's initial development.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<addition filter module|http://nginx.org/en/docs/http/ngx_http_addition_module.html>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<proxy module|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<OpenResty|http://openresty.org> bundle.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/encrypted-session-nginx-module-0.05/encrypted-session-nginx-module-0.05.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/encrypted-session-nginx-module-0.05/encrypted-session-nginx-module-0.05.pod[m
[1mdeleted file mode 100644[m
[1mindex 3a3f761..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/encrypted-session-nginx-module-0.05/encrypted-session-nginx-module-0.05.pod[m
[1m+++ /dev/null[m
[36m@@ -1,415 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-encrypted-session-nginx-module - encrypt and decrypt nginx variable values[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See the[m
[31m-installation instructions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    # key must be of 32 bytes long[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-    [m
[31m-    # iv must not be longer than 16 bytes[m
[31m-    #   default: "deadbeefdeadbeef" (w/o quotes)[m
[31m-    encrypted_session_iv "1234567812345678";[m
[31m-    [m
[31m-    # default: 1d (1 day)[m
[31m-    encrypted_session_expires 2; # in sec[m
[31m-    [m
[31m-    location /encrypt {[m
[31m-        set $raw 'text to encrypted'; # from the ngx_rewrite module[m
[31m-        set_encrypt_session $session $raw;[m
[31m-        set_encode_base32 $session; # from the ngx_set_misc module[m
[31m-    [m
[31m-        add_header Set-Cookie 'my_login=$session';  # from the ngx_headers module[m
[31m-    [m
[31m-        # your content handler goes here...[m
[31m-    }[m
[31m-    [m
[31m-    location /decrypt {[m
[31m-        set_decode_base32 $session $cookie_my_login; # from the ngx_set_misc module[m
[31m-        set_decrypt_session $raw $session;[m
[31m-    [m
[31m-        if ($raw = '') {[m
[31m-            # bad session[m
[31m-        }[m
[31m-    [m
[31m-        # your content handler goes here...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module provides encryption and decryption support for[m
[31m-nginx variables based on AES-256 with Mac.[m
[31m-[m
[31m-This module is usually used with the L<ngx_set_misc module|http://github.com/agentzh/set-misc-nginx-module>[m
[31m-and the standard rewrite module's directives.[m
[31m-[m
[31m-This module can be used to implement simple user login and ACL.[m
[31m-[m
[31m-Usually, you just decrypt data in nginx level, and pass the unencrypted[m
[31m-data to your FastCGI/HTTP backend, as in[m
[31m-[m
[31m-[m
[31m-    location /blah {[m
[31m-        set_decrypt_session $raw_text $encrypted;[m
[31m-    [m
[31m-        # this directive is from the ngx_set_misc module[m
[31m-        set_escape_uri $escaped_raw_text $raw_text;[m
[31m-    [m
[31m-        fastcgi_param QUERY_STRING "uid=$uid";[m
[31m-        fastcgi_pass unix:/path/to/my/php/or/python/fastcgi.sock;[m
[31m-    }[m
[31m-[m
[31m-Lua web applications running directly on L<ngx_lua|https://github.com/openresty/lua-nginx-module> can call[m
[31m-this module's directives directly from within Lua code:[m
[31m-[m
[31m-[m
[31m-    local raw_text = ndk.set_var.set_decrypt_session(encrypted_text)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 encrypted_session_key[m
[31m-[m
[31m-B<syntax:> I<encrypted_session_key E<lt>keyE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Sets the key for the cipher (must be 32 bytes long). For example,[m
[31m-[m
[31m-[m
[31m-    encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 encrypted_session_iv[m
[31m-[m
[31m-B<syntax:> I<encrypted_session_iv E<lt>ivE<gt>>[m
[31m-[m
[31m-B<default:> I<encrypted_session_iv "deadbeefdeadbeef";>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Sets the initial vector used for the cipher (must be I<no longer> than 16 bytes).[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    encrypted_session_iv "12345678";[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 encrypted_session_expires[m
[31m-[m
[31m-B<syntax:> I<encrypted_session_expires E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<encrypted_session_expires 1d;>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Sets expiration time difference (in seconds by default).[m
[31m-[m
[31m-For example, consider the following configuration:[m
[31m-[m
[31m-[m
[31m-    encypted_session_expires 1d;[m
[31m-[m
[31m-When your session is being generated, ngx_encrypted_session will plant[m
[31m-an expiration time (1 day in the future in this example) into the[m
[31m-encrypted session string, such that when the session is being decrypted[m
[31m-later, the server can pull the expiration time out of the session and[m
[31m-compare it with the server's current system time. No matter how you[m
[31m-transfer and store your session, like using cookies, or URI query arguments,[m
[31m-or whatever.[m
[31m-[m
[31m-People may confuse this setting with the expiration date of HTTP[m
[31m-cookies. This directive simply controls when the session gets expired;[m
[31m-it knows nothing about HTTP cookies. Even if the end user intercepted[m
[31m-this session from cookie by himself and uses it later manually, the[m
[31m-server will still reject it when the expiration time gets passed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_encrypt_session[m
[31m-[m
[31m-B<syntax:> I<set_encrypt_session $target E<lt>valueE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Encrypts the string value specified by the C<value> argument and saves the result into[m
[31m-the variable specified by C<$target>.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    set_encrypt_session $res $value;[m
[31m-[m
[31m-will encrypts the value in the variable $value into the target variable C<$res>.[m
[31m-[m
[31m-The C<value> argument can also be an nginx string value, for example,[m
[31m-[m
[31m-[m
[31m-    set_encrypt_session $res "my value = $value";[m
[31m-[m
[31m-The resulting data can later be decrypted via the L<set_decrypt_session> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_decrypt_session[m
[31m-[m
[31m-B<syntax:> I<set_decrypt_session $target E<lt>valueE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, server if, location, location if>[m
[31m-[m
[31m-Similar to L<set_encrypt_session>, but performs the inverse operation, that is,[m
[31m-to decrypt things.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<ngx_openresty bundle|http://openresty.org>. See L<the detailed instructions|http://openresty.org/#Installation> for downloading and installing ngx_openresty into your system. This is the easiest and most safe way to set things up.[m
[31m-[m
[31m-Alternatively, you can install this module manually with the Nginx source:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.15 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-    wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-    tar -xzvf nginx-1.9.15.tar.gz[m
[31m-    cd nginx-1.9.15/[m
[31m-    [m
[31m-    Here we assume you would install you nginx under /opt/nginx/.[m
[31m-    ./configure --prefix=/opt/nginx \[m
[31m-      --add-module=/path/to/encrypted-session-nginx-module[m
[31m-    [m
[31m-    make -j2[m
[31m-    make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<encrypted-session-nginx-module file list|https://github.com/openresty/encrypted-session-nginx-module/tags>.[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<ngx_openresty bundle|http://openresty.org>.[m
[31m-[m
[31m-OpenSSL should not be disabled in your Nginx build.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_encrypted_session_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x> (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x> (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x> (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x> (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x> (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x> (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x> (last tested: 1.0.11)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x> (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x> (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.46> (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.44 does not[m
[31m-work with this module, please consider reporting a bug.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning,[m
[31m-there must be some serious bugs lurking somewhere in this module. So[m
[31m-whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-send a bug report or even patches to E<lt>agentzh@gmail.comE<gt>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or create a ticket on the L<issue tracking interface|http://github.com/openresty/encrypted-session-nginx-module/issues>[m
[31m-provided by GitHub.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>encrypted-session-nginx-module|http://github.com/openresty/encrypted-session-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the author or just ask for[m
[31m-a commit bit to the source repository on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2009-2016, Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, Cloud Flare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are[m
[31m-met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS[m
[31m-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED[m
[31m-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A[m
[31m-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<NDK|http://github.com/simpl-it/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_set_misc module|http://github.com/agentzh/set-misc-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/form-input-nginx-module-0.12/form-input-nginx-module-0.12.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/form-input-nginx-module-0.12/form-input-nginx-module-0.12.pod[m
[1mdeleted file mode 100644[m
[1mindex ffe2394..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/form-input-nginx-module-0.12/form-input-nginx-module-0.12.pod[m
[1m+++ /dev/null[m
[36m@@ -1,206 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-form-input-nginx-module - NGINX module that reads HTTP POST and PUT request body encoded in "application/x-www-form-urlencoded" and parses the arguments into nginx variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This is a nginx module that reads HTTP POST and PUT request body encoded[m
[31m-in "application/x-www-form-urlencoded", and parse the arguments in[m
[31m-request body into nginx variables.[m
[31m-[m
[31m-This module depends on the ngx_devel_kit (NDK) module.[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.7 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-    wget 'http://nginx.org/download/nginx-1.9.7.tar.gz'[m
[31m-    tar -xzvf nginx-1.9.7.tar.gz[m
[31m-    cd nginx-1.9.7/[m
[31m-    [m
[31m-    ./configure --add-module=/path/to/ngx_devel_kit \[m
[31m-        --add-module=/path/to/form-input-nginx-module[m
[31m-    [m
[31m-    make -j2[m
[31m-    make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<form-input-nginx-module file list|http://github.com/calio/form-input-nginx-module/tags>, and the latest tarball for L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit> from its L<file list|https://github.com/simpl/ngx_devel_kit/tags>.[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_form_input_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Usage[m
[31m-[m
[31m-[m
[31m-    set_form_input $variable;[m
[31m-    set_form_input $variable argument;[m
[31m-    [m
[31m-    set_form_input_multi $variable;[m
[31m-    set_form_input_multi $variable argument;[m
[31m-[m
[31m-example:[m
[31m-[m
[31m-[m
[31m-    #nginx.conf[m
[31m-    [m
[31m-    location /foo {[m
[31m-        # ensure client_max_body_size == client_body_buffer_size[m
[31m-        client_max_body_size 100k;[m
[31m-        client_body_buffer_size 100k;[m
[31m-    [m
[31m-        set_form_input $data;    # read "data" field into $data[m
[31m-        set_form_input $foo foo; # read "foo" field into $foo[m
[31m-    }[m
[31m-    [m
[31m-    location /bar {[m
[31m-        # ensure client_max_body_size == client_body_buffer_size[m
[31m-        client_max_body_size 1m;[m
[31m-        client_body_buffer_size 1m;[m
[31m-    [m
[31m-        set_form_input_multi $data; # read all "data" field into $data[m
[31m-        set_form_input_multi $foo data; # read all "data" field into $foo[m
[31m-    [m
[31m-        array_join ' ' $data; # now $data is an string[m
[31m-        array_join ' ' $foo;  # now $foo is an string[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ngx_form_input will discard request bodies that are buffered[m
[31m-to disk files. When the client_max_body_size setting is larger than[m
[31m-client_body_buffer_size, request bodies that are larger[m
[31m-than client_body_buffer_size (but no larger than[m
[31m-client_max_body_size) will be buffered to disk files.[m
[31m-So it's important to ensure these two config settings take[m
[31m-the same values to avoid confustion.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.9.x (last tested: 1.9.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.8.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x (last tested: 1.7.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.5.x (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.4.x (last tested: 1.4.6)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (last tested: 1.0.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.9.x (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x E<gt>= 0.8.54[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-Copyright (c) 2010, 2011, Jiale "calio" Zhi E<lt>vipcalio@gmail.comE<gt>.[m
[31m-[m
[31m-Copyright (c) 2010-2016, Yichun "agentzh" Zhang E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions are[m
[31m-met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS[m
[31m-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED[m
[31m-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A[m
[31m-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/headers-more-nginx-module-0.30/headers-more-nginx-module-0.30.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/headers-more-nginx-module-0.30/headers-more-nginx-module-0.30.pod[m
[1mdeleted file mode 100644[m
[1mindex c463fe0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/headers-more-nginx-module-0.30/headers-more-nginx-module-0.30.pod[m
[1m+++ /dev/null[m
[36m@@ -1,603 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-B<ngx_headers_more> - Set and clear input and output headers...more than "add"![m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This document describes headers-more-nginx-module L<v0.30|https://github.com/openresty/headers-more-nginx-module/tags> released on 15 May 2015.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     # set the Server output header[m
[31m-     more_set_headers 'Server: my-server';[m
[31m-    [m
[31m-     # set and clear output headers[m
[31m-     location /bar {[m
[31m-         more_set_headers 'X-MyHeader: blah' 'X-MyHeader2: foo';[m
[31m-         more_set_headers -t 'text/plain text/css' 'Content-Type: text/foo';[m
[31m-         more_set_headers -s '400 404 500 503' -s 413 'Foo: Bar';[m
[31m-         more_clear_headers 'Content-Type';[m
[31m-    [m
[31m-         # your proxy_pass/memcached_pass/or any other config goes here...[m
[31m-     }[m
[31m-    [m
[31m-     # set output headers[m
[31m-     location /type {[m
[31m-         more_set_headers 'Content-Type: text/plain';[m
[31m-         # ...[m
[31m-     }[m
[31m-    [m
[31m-     # set input headers[m
[31m-     location /foo {[m
[31m-         set $my_host 'my dog';[m
[31m-         more_set_input_headers 'Host: $my_host';[m
[31m-         more_set_input_headers -t 'text/plain' 'X-Foo: bah';[m
[31m-    [m
[31m-         # now $host and $http_host have their new values...[m
[31m-         # ...[m
[31m-     }[m
[31m-    [m
[31m-     # replace input header X-Foo *only* if it already exists[m
[31m-     more_set_input_headers -r 'X-Foo: howdy';[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module allows you to add, set, or clear any output[m
[31m-or input header that you specify.[m
[31m-[m
[31m-This is an enhanced version of the standard[m
[31m-L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module because it provides more utilities like[m
[31m-resetting or clearing "builtin headers" like C<Content-Type>,[m
[31m-C<Content-Length>, and C<Server>.[m
[31m-[m
[31m-It also allows you to specify an optional HTTP status code[m
[31m-criteria using the C<-s> option and an optional content[m
[31m-type criteria using the C<-t> option while modifying the[m
[31m-output headers with the L<more_set_headers> and[m
[31m-L<more_clear_headers> directives. For example,[m
[31m-[m
[31m-[m
[31m-     more_set_headers -s 404 -t 'text/html' 'X-Foo: Bar';[m
[31m-[m
[31m-You can also specify multiple MIME types to filter out in a single C<-t> option.[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-    more_set_headers -t 'text/html text/plain' 'X-Foo: Bar';[m
[31m-[m
[31m-Never use other paramemters like C<charset=utf-8> in the C<-t> option values; they will not[m
[31m-work as you would expect.[m
[31m-[m
[31m-Input headers can be modified as well. For example[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         more_set_input_headers 'Host: foo' 'User-Agent: faked';[m
[31m-         # now $host, $http_host, $user_agent, and[m
[31m-         #   $http_user_agent all have their new values.[m
[31m-     }[m
[31m-[m
[31m-The option C<-t> is also available in the[m
[31m-L<more_set_input_headers> and[m
[31m-L<more_clear_input_headers> directives (for request header filtering) while the C<-s> option[m
[31m-is not allowed.[m
[31m-[m
[31m-Unlike the standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module, this module's directives will by[m
[31m-default apply to all the status codes, including C<4xx> and C<5xx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 more_set_headers[m
[31m-[m
[31m-B<syntax:> I<more_set_headers [-t E<lt>content-type listE<gt>]... [-s E<lt>status-code listE<gt>]... E<lt>new-headerE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Replaces (if any) or adds (if not any) the specified output headers when the response status code matches the codes specified by the C<-s> option I<AND> the response content type matches the types specified by the C<-t> option.[m
[31m-[m
[31m-If either C<-s> or C<-t> is not specified or has an empty list value, then no match is required. Therefore, the following directive set the C<Server> output header to the custom value for I<any> status code and I<any> content type:[m
[31m-[m
[31m-[m
[31m-       more_set_headers    "Server: my_server";[m
[31m-[m
[31m-Existing response headers with the same name are always overridden. If you want to add headers incrementally, use the standard L<add_header|http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header> directive instead.[m
[31m-[m
[31m-A single directive can set/add multiple output headers. For example[m
[31m-[m
[31m-[m
[31m-       more_set_headers 'Foo: bar' 'Baz: bah';[m
[31m-[m
[31m-Multiple occurrences of the options are allowed in a single directive. Their values will be merged together. For instance[m
[31m-[m
[31m-[m
[31m-       more_set_headers -s 404 -s '500 503' 'Foo: bar';[m
[31m-[m
[31m-is equivalent to[m
[31m-[m
[31m-[m
[31m-       more_set_headers -s '404 500 503' 'Foo: bar';[m
[31m-[m
[31m-The new header should be the one of the forms:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-C<Name: Value>[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-C<Name: >[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-C<Name>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The last two effectively clear the value of the header C<Name>.[m
[31m-[m
[31m-Nginx variables are allowed in header values. For example:[m
[31m-[m
[31m-[m
[31m-        set $my_var "dog";[m
[31m-        more_set_headers "Server: $my_var";[m
[31m-[m
[31m-But variables won't work in header keys due to performance considerations.[m
[31m-[m
[31m-Multiple set/clear header directives are allowed in a single location, and they're executed sequentially.[m
[31m-[m
[31m-Directives inherited from an upper level scope (say, http block or server blocks) are executed before the directives in the location block.[m
[31m-[m
[31m-Note that although C<more_set_headers> is allowed in I<location> if blocks, it is I<not> allowed in the I<server> if blocks, as in[m
[31m-[m
[31m-[m
[31m-       ?  # This is NOT allowed![m
[31m-       ?  server {[m
[31m-       ?      if ($args ~ 'download') {[m
[31m-       ?          more_set_headers 'Foo: Bar';[m
[31m-       ?      }[m
[31m-       ?      ...[m
[31m-       ?  }[m
[31m-[m
[31m-Behind the scene, use of this directive and its friend L<more_clear_headers> will (lazily) register an ouput header filter that modifies C<< r->headers_out >> the way you specify.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 more_clear_headers[m
[31m-[m
[31m-B<syntax:> I<more_clear_headers [-t E<lt>content-type listE<gt>]... [-s E<lt>status-code listE<gt>]... E<lt>new-headerE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Clears the specified output headers.[m
[31m-[m
[31m-In fact,[m
[31m-[m
[31m-[m
[31m-        more_clear_headers -s 404 -t 'text/plain' Foo Baz;[m
[31m-[m
[31m-is exactly equivalent to[m
[31m-[m
[31m-[m
[31m-        more_set_headers -s 404 -t 'text/plain' "Foo: " "Baz: ";[m
[31m-[m
[31m-or[m
[31m-[m
[31m-[m
[31m-        more_set_headers -s 404 -t 'text/plain' Foo Baz[m
[31m-[m
[31m-See L<more_set_headers> for more details.[m
[31m-[m
[31m-Wildcard C<*> can also be used to specify a header name pattern. For example, the following directive effectively clears I<any> output headers starting by "C<X-Hidden->":[m
[31m-[m
[31m-[m
[31m-     more_clear_headers 'X-Hidden-*';[m
[31m-[m
[31m-The C<*> wildcard support was first introduced in L<v0.09>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 more_set_input_headers[m
[31m-[m
[31m-B<syntax:> I<more_set_input_headers [-r] [-t E<lt>content-type listE<gt>]... E<lt>new-headerE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-Very much like L<more_set_headers> except that it operates on input headers (or request headers) and it only supports the C<-t> option.[m
[31m-[m
[31m-Note that using the C<-t> option in this directive means filtering by the C<Content-Type> I<request> header, rather than the response header.[m
[31m-[m
[31m-Behind the scene, use of this directive and its friend L<more_clear_input_headers> will (lazily) register a C<rewrite phase> handler that modifies C<< r->headers_in >> the way you specify. Note that it always run at the I<end> of the C<rewrite> so that it runs I<after> the standard L<rewrite module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html> and works in subrequests as well.[m
[31m-[m
[31m-If the C<-r> option is specified, then the headers will be replaced to the new values I<only if> they already exist.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 more_clear_input_headers[m
[31m-[m
[31m-B<syntax:> I<more_clear_input_headers [-t E<lt>content-type listE<gt>]... E<lt>new-headerE<gt>...>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-Clears the specified input headers.[m
[31m-[m
[31m-In fact,[m
[31m-[m
[31m-[m
[31m-        more_clear_input_headers -s 404 -t 'text/plain' Foo Baz;[m
[31m-[m
[31m-is exactly equivalent to[m
[31m-[m
[31m-[m
[31m-        more_set_input_headers -s 404 -t 'text/plain' "Foo: " "Baz: ";[m
[31m-[m
[31m-or[m
[31m-[m
[31m-[m
[31m-        more_set_input_headers -s 404 -t 'text/plain' Foo Baz[m
[31m-[m
[31m-See L<more_set_input_headers> for more details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Unlike the standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module, this module does not automatically take care of the constraint among the C<Expires>, C<Cache-Control>, and C<Last-Modified> headers. You have to get them right yourself or use the L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module together with this module.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-You cannot remove the C<Connection> response header using this module because the C<Connection> response header is generated by the standard C<ngx_http_header_filter_module> in the Nginx core, whose output header filter runs always I<after> the filter of this module. The only way to actually remove the C<Connection> header is to patch the Nginx core, that is, editing the C function C<ngx_http_header_filter> in the C<src/http/ngx_http_header_filter_module.c> file.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.15 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/headers-more-nginx-module[m
[31m-    [m
[31m-     make[m
[31m-     make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<headers-more-nginx-module file list|https://github.com/openresty/headers-more-nginx-module/tags>.[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_headers_more_filter_module.so;[m
[31m-[m
[31m-Also, this module is included and enabled by default in the L<OpenResty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x>                       (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x>                       (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>                       (last tested: 1.6.2)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>                       (last tested: 1.5.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x>                       (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.3.x>                       (last tested: 1.3.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x>                       (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x>                       (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x>                       (last tested: 1.0.11)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x>                       (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x>                       (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.44>             (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.44 does not work with this module, please consider L<reporting a bug>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/chaoslawful/lua-nginx-module/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>headers-more-nginx-module|https://github.com/openresty/headers-more-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|https://github.com/openresty/headers-more-nginx-module/tree/master/t/> are[m
[31m-L<declarative|https://github.com/openresty/headers-more-nginx-module/blob/master/t/sanity.t> too. Thanks to the L<Test::Nginx|http://search.cpan.org/perldoc?Test::Nginx> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-headers-more-module:$PATH prove -r t[m
[31m-[m
[31m-To run the test suite with valgrind's memcheck, use the following commands:[m
[31m-[m
[31m-[m
[31m-     $ export PATH=/path/to/your/nginx-with-headers-more-module:$PATH[m
[31m-     $ TEST_NGINX_USE_VALGRIND=1 prove -r t[m
[31m-[m
[31m-You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary.[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-Some parts of the test suite requires modules L<proxy|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>, L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>, and L<echo|https://github.com/openresty/echo-nginx-module> to be enabled as well when building Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Support variables in new headers' keys.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the L<author> or just ask for a commit bit to the L<source repository> on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Authors[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) I<E<lt>agentzh@gmail.comE<gt>>, CloudFlare Inc.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Bernd Dorn ( E<lt>http://www.lovelysystems.com/E<gt> )[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-The code base is borrowed directly from the standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module in Nginx 0.8.24. This part of code is copyrighted by Igor Sysoev.[m
[31m-[m
[31m-Copyright (c) 2009-2014, Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-Copyright (c) 2010-2013, Bernd Dorn.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original thread on the Nginx mailing list that inspires this module's development: L<"A question about add_header replication"|http://forum.nginx.org/read.php?2,11206,11738>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The orginal announcement thread on the Nginx mailing list: L<"The "headers_more" module: Set and clear output headers...more than 'add'!"|http://forum.nginx.org/read.php?2,23460>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original L<blog post|http://agentzh.blogspot.com/2009/11/headers-more-module-scripting-input-and.html> about this module's initial development.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<echo module|https://github.com/openresty/echo-nginx-module> for Nginx module's automated testing.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/iconv-nginx-module-0.14/iconv-nginx-module-0.14.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/iconv-nginx-module-0.14/iconv-nginx-module-0.14.pod[m
[1mdeleted file mode 100644[m
[1mindex c0d8415..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/iconv-nginx-module-0.14/iconv-nginx-module-0.14.pod[m
[1m+++ /dev/null[m
[36m@@ -1,242 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-iconv-nginx-module[m
[31m-[m
[31m-[m
[31m-[m
[31m-This is a nginx module that uses libiconv to convert characters of different[m
[31m-encoding. It brings the 'set_iconv' command to nginx.[m
[31m-[m
[31m-This module depends on the ngx_devel_kit(NDK) module.[m
[31m-[m
[31m-[m
[31m-=head1 Usage[m
[31m-[m
[31m-[m
[31m-=head2 set_iconv[m
[31m-[m
[31m-B<syntax:> I<set_iconv E<lt>destination_variableE<gt> E<lt>from_variableE<gt> from=E<lt>from_encodingE<gt> to=E<lt>to_encodingE<gt>>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 iconv_buffer_size[m
[31m-[m
[31m-B<syntax:> I<iconv_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<iconv_buffer_size E<lt>pagesizeE<gt>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 iconv_filter[m
[31m-[m
[31m-B<syntax:> I<iconv_filter from=E<lt>from_encodingE<gt> to=E<lt>to_encodingE<gt>>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<phase:> I<output-filter>[m
[31m-[m
[31m-Here is a basic example:[m
[31m-[m
[31m-[m
[31m-     #nginx.conf[m
[31m-    [m
[31m-     location /foo {[m
[31m-         set $src '你好'; #in UTF-8[m
[31m-         set_iconv $dst $src from=utf8 to=gbk; #now $dst holds 你好 in GBK[m
[31m-     }[m
[31m-    [m
[31m-     #everything generated from /foo will be converted from utf8 to gbk[m
[31m-     location /bar {[m
[31m-         iconv_filter from=utf-8 to=gbk;[m
[31m-         iconv_buffer_size 1k;[m
[31m-         #content handler here[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.9.x (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.8.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.5.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.4.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.3.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.2.x (last tested: 1.2.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.1.x (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.0.x (last tested: 1.0.8)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.9.x (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.8.x (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-0.7.x (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-Get the nginx source code from L<nginx.org|http://nginx.org/>.[m
[31m-Untar the source code and build nginx with this module.[m
[31m-[m
[31m-[m
[31m-     wget 'http://sysoev.ru/nginx/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     git-clone http://github.com/simpl-it/ngx_devel_kit.git[m
[31m-     git-clone http://github.com/calio/form-input-module.git[m
[31m-    [m
[31m-     ./configure --add-module=/path/to/iconv-nginx-module/ --add-module=/path/to/ngx_devel_kit[m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_iconv_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This program is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (c) 2010-2016, Calio E<lt>vipcalio@gmail.comE<gt>.[m
[31m-[m
[31m-Copyright (c) 2010-2016, Yichun Zhang E<lt>agentzh@gmail.comE<gt>.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright[m
[31m-notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright[m
[31m-notice, this list of conditions and the following disclaimer in the[m
[31m-documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Neither the name of the Taobao Inc. nor the names of its[m
[31m-contributors may be used to endorse or promote products derived from[m
[31m-this software without specific prior written permission.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changelog[m
[31m-[m
[31m-This module's change logs are part of the OpenResty bundle's change logs. Please see[m
[31m-See E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<OpenResty|https://openresty.org> bundle.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-cjson-2.1.0.4/lua-cjson-2.1.0.4.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-cjson-2.1.0.4/lua-cjson-2.1.0.4.pod[m
[1mdeleted file mode 100644[m
[1mindex 26615d8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-cjson-2.1.0.4/lua-cjson-2.1.0.4.pod[m
[1m+++ /dev/null[m
[36m@@ -1,113 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-cjson - Fast JSON encoding/parsing[m
[31m-[m
[31m-[m
[31m-[m
[31m-This fork of L<mpxE<sol>lua-cjson|https://github.com/mpx/lua-cjson> is included in[m
[31m-the L<OpenResty|https://openresty.org/> bundle and includes a few bugfixes and[m
[31m-improvements, especially to facilitate the encoding of empty tables as JSON Arrays.[m
[31m-[m
[31m-Please refer to the L<lua-cjson documentation|http://www.kyne.com.au/~mark/software/lua-cjson.php>[m
[31m-for standard usage, this README only provides informations regarding this fork's additions.[m
[31m-[m
[31m-See L<`mpxE<sol>master..openrestyE<sol>master`|https://github.com/mpx/lua-cjson/compare/master...openresty:master>[m
[31m-for the complete history of changes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Additions[m
[31m-[m
[31m-[m
[31m-=head2 encode_empty_table_as_object[m
[31m-[m
[31m-B<syntax:> C<cjson.encode_empty_table_as_object(true|false|"on"|"off")>[m
[31m-[m
[31m-Change the default behavior when encoding an empty Lua table.[m
[31m-[m
[31m-By default, empty Lua tables are encoded as empty JSON Objects (C<{}>). If this is set to false,[m
[31m-empty Lua tables will be encoded as empty JSON Arrays instead (C<[]>).[m
[31m-[m
[31m-This method either accepts a boolean or a string (C<"on">, C<"off">).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 empty_array[m
[31m-[m
[31m-B<syntax:> C<cjson.empty_array>[m
[31m-[m
[31m-A lightuserdata, similar to C<cjson.null>, which will be encoded as an empty JSON Array by[m
[31m-C<cjson.encode()>.[m
[31m-[m
[31m-For example, since C<encode_empty_table_as_object> is C<true> by default:[m
[31m-[m
[31m-[m
[31m-    local cjson = require "cjson"[m
[31m-    [m
[31m-    local json = cjson.encode({[m
[31m-        foo = "bar",[m
[31m-        some_object = {},[m
[31m-        some_array = cjson.empty_array[m
[31m-    })[m
[31m-[m
[31m-This will generate:[m
[31m-[m
[31m-[m
[31m-    {[m
[31m-        "foo": "bar",[m
[31m-        "some_object": {},[m
[31m-        "some_array": [][m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 empty_array_mt[m
[31m-[m
[31m-B<syntax:> C<setmetatable({}, cjson.empty_array_mt)>[m
[31m-[m
[31m-A metatable which can "tag" a table as a JSON Array in case it is empty (that is, if the[m
[31m-table has no elements, C<cjson.encode()> will encode it as an empty JSON Array).[m
[31m-[m
[31m-Instead of:[m
[31m-[m
[31m-[m
[31m-    local function serialize(arr)[m
[31m-        if #arr < 1 then[m
[31m-            arr = cjson.empty_array[m
[31m-        end[m
[31m-    [m
[31m-        return cjson.encode({some_array = arr})[m
[31m-    end[m
[31m-[m
[31m-This is more concise:[m
[31m-[m
[31m-[m
[31m-    local function serialize(arr)[m
[31m-        setmetatable(arr, cjson.empty_array_mt)[m
[31m-    [m
[31m-        return cjson.encode({some_array = arr})[m
[31m-    end[m
[31m-[m
[31m-Both will generate:[m
[31m-[m
[31m-[m
[31m-    {[m
[31m-        "some_array": [][m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 encode_number_precision[m
[31m-[m
[31m-B<syntax:> C<cjson.encode_number_precision(precision)>[m
[31m-[m
[31m-This fork allows encoding of numbers with a C<precision> up to 16 decimals (vs. 14 in mpx/lua-cjson).[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-redis-parser-0.12/lua-redis-parser-0.12.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-redis-parser-0.12/lua-redis-parser-0.12.pod[m
[1mdeleted file mode 100644[m
[1mindex ff8c734..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-redis-parser-0.12/lua-redis-parser-0.12.pod[m
[1m+++ /dev/null[m
[36m@@ -1,373 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-lua-redis-parser - Redis reply parser and request constructor library for Lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-This document describes lua-redis-parser L<v0.09rc5|https://github.com/agentzh/lua-redis-parser/tags> released on 28 August 2011.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This lua library implements a thin and fast redis raw response parser[m
[31m-that constructs corresponding lua data strucutres, as well as a[m
[31m-function that constructs redis raw requests.[m
[31m-[m
[31m-To maximize speed, this module is implemented in pure C.[m
[31m-[m
[31m-This library is usually used by Lua code running atop L<lua-nginx-module|http://github.com/chaoslawful/lua-nginx-module> to access[m
[31m-redis backends though L<redis2-nginx-module|http://github.com/agentzh/redis2-nginx-module>.[m
[31m-[m
[31m-[m
[31m-=head1 Functions[m
[31m-[m
[31m-The C<parser> variable used below is referring to the variable holding the return value of C<require "redis.parser">. In other words, we assume you have written the following code first:[m
[31m-[m
[31m-[m
[31m-        local parser = require "redis.parser"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 parse_reply[m
[31m-[m
[31m-B<syntax:> I<res, typ = parser.parse_reply(raw_reply)>[m
[31m-[m
[31m-Parses the single (or the first) raw redis reply from the C<raw_reply> string and returns the Lua data structure C<res>, as well as the reply type C<typ>.[m
[31m-[m
[31m-Here is an example:[m
[31m-[m
[31m-[m
[31m-        local parser = require 'redis.parser'[m
[31m-    [m
[31m-        -- assuming the reply variable holds the (single) redis response[m
[31m-        --  to be parsed:[m
[31m-        local res, typ = parser.parse_reply(reply)[m
[31m-    [m
[31m-        if typ == parser.BAD_REPLY then[m
[31m-            -- res is the textual error message from the parser[m
[31m-        elseif typ == parser.INTEGER_REPLY then[m
[31m-            -- res is an integer, like 3, returned from the redis server[m
[31m-        elseif typ == parser.ERROR_REPLY then[m
[31m-            -- res is the error message from the redis2 server[m
[31m-        elseif typ == parser.STATUS_REPLY then[m
[31m-            -- res is the textual message from the redis server[m
[31m-        elseif typ == parser.BULK_REPLY then[m
[31m-            --- res is a string for the bulk data[m
[31m-        elseif typ == parser.MULTI_BULK_REPLY then[m
[31m-            -- res is a lua (array) table that holds the individual bulks[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 parse_replies[m
[31m-[m
[31m-B<syntax:> I<results = parser.parse_replies(raw_replies)>[m
[31m-[m
[31m-Similar to the L<parse_reply> method, but parse multiple pipelined redis replies in the C<raw_replies> string argument. Returns a table of all the parsed results where each result is an array-like table consists of two elements, C<res> and C<typ>, which have exactly the same meaning as the return values of the L<parse_reply> function.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-        local parser = require "redis.parser"[m
[31m-    [m
[31m-        -- assuming the replies variable holds n redis responses[m
[31m-        --  to be parsed:[m
[31m-        local results = parser.parse_replies(replies, n)[m
[31m-        for i, result in ipairs(results) do[m
[31m-            local res = result[1][m
[31m-            local typ = result[2][m
[31m-    [m
[31m-            -- res and typ have exactly the same meaning as in[m
[31m-            --  the parse_reply method documented above[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 typename[m
[31m-[m
[31m-B<syntax:> I<str = parser.typename(typ)>[m
[31m-[m
[31m-Returns the textual representation of the reply type values returned by the L<parse_reply> and L<parse_replies> functions. Here's the correspondence:[m
[31m-[m
[31m-[m
[31m-        parser.typename(parser.BAD_REPLY)        == "bad reply"[m
[31m-        parser.typename(parser.INTEGER_REPLY)    == "integer reply"[m
[31m-        parser.typename(parser.ERROR_REPLY)      == "error reply"[m
[31m-        parser.typename(parser.STATUS_REPLY)     == "status reply"[m
[31m-        parser.typename(parser.BULK_REPLY)       == "bulk reply"[m
[31m-        parser.typename(parser.MULTI_BULK_REPLY) == "multi-bulk reply"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 build_query[m
[31m-[m
[31m-B<syntax:> I<raw_request = parser.build_query(args)>[m
[31m-[m
[31m-Constructs a raw Redis request from simple Lua values. It simply accepts a Lua array-like table, a list of parameters including[m
[31m-the command name.[m
[31m-[m
[31m-Please check out the complete list of redis 2.0 commands,[m
[31m-[m
[31m-E<lt>http://redis.io/commandsE<gt>[m
[31m-[m
[31m-The first command in that list, "APPEND   key value", for example, we can just use[m
[31m-[m
[31m-[m
[31m-        local parser = require "redis.parser"[m
[31m-    [m
[31m-        local req = parser.build_query({'APPEND', 'some-key', 'some-value'})[m
[31m-[m
[31m-to construct a binary request in the return value. Because the Redis command is case insensitive, I usually just use 'append', the lower case form, as the first element of that list, as in[m
[31m-[m
[31m-[m
[31m-        local parser = require "redis.parser"[m
[31m-    [m
[31m-        local req = parser.build_query({'set', 'foo', 'some value'})[m
[31m-            -- req is the raw TCP request ready to send to the remote redis server[m
[31m-            -- over the TCP connection[m
[31m-[m
[31m-Null values should be specified by C<parser.null> rather than Lua's C<nil> value.[m
[31m-[m
[31m-Boolean values will be converted to C<1> or C<0>, for C<true> and C<false>, respectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Constants[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 BAD_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.BAD_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 INTEGER_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.INTEGER_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ERROR_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.ERROR_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 STATUS_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.STATUS_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 BULK_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.BULK_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 MULTI_BULK_REPLY[m
[31m-[m
[31m-B<syntax:> I<typ = parser.MULTI_BULK_REPLY>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 null[m
[31m-[m
[31m-B<syntax:> I<val = parser.null>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Background[m
[31m-[m
[31m-This module is originally written for L<lua-nginx-module|http://github.com/chaoslawful/lua-nginx-module> and L<redis2-nginx-module|http://github.com/agentzh/redis2-nginx-module>:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-create a ticket on the L<issue tracking interface|http://github.com/agentzh/lua-redis-parser/issues> provided by GitHub,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or send a bug report or even patches to C<agentzh@gmail.com>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on GitHub at L<agentzhE<sol>lua-redis-parser|http://github.com/agentzh/lua-redis-parser>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Build requirements[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Lua (http://www.lua.org/)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-or LuaJIT (http://www.luajit.org/)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Latest source tarball of this library downloaded from E<lt>https://github.com/agentzh/lua-redis-parser/tagsE<gt>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Gnu make and gcc is required to build this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Linux/BSD/Solaris[m
[31m-[m
[31m-[m
[31m-        gmake CC=gcc[m
[31m-        gmake install CC=gcc[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Mac OS X[m
[31m-[m
[31m-[m
[31m-        make LDFLAGS='-bundle -undefined dynamic_lookup' CC=gcc[m
[31m-        make install[m
[31m-[m
[31m-If your Lua or LuaJIT is not installed into the system, specify its include directory like this:[m
[31m-[m
[31m-[m
[31m-        make LUA_INCLUDE_DIR=/opt/luajit/include/luajit-2.0[m
[31m-[m
[31m-You can specify a custom path for the installation target:[m
[31m-[m
[31m-[m
[31m-        make install LUA_LIB_DIR=/opt/lualib[m
[31m-[m
[31m-The C<DESTDIR> variable is also supported, to ease RPM packaging.[m
[31m-[m
[31m-This library is included and enabled by default in the L<ngx_openresty bundle|http://openresty.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-This module is licenced under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2009-2015, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SEE ALSO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Use case: L<Dynamic Routing Based On Redis|http://openresty.org/#DynamicRoutingBasedOnRedis>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-nginx-module|http://github.com/chaoslawful/lua-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<redis2-nginx-module|http://github.com/agentzh/redis2-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Redis official site|http://redis.io/>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/lua-resty-core-0.1.6.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/lua-resty-core-0.1.6.pod[m
[1mdeleted file mode 100644[m
[1mindex 9de8740..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/lua-resty-core-0.1.6.pod[m
[1m+++ /dev/null[m
[36m@@ -1,529 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-core - New FFI-based Lua API for the ngx_lua module[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is production ready and under active development.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-    [m
[31m-        http {[m
[31m-            # you do NOT need to configure the following line when you[m
[31m-            # are using the OpenResty bundle 1.4.3.9+.[m
[31m-            lua_package_path "/path/to/lua-resty-core/lib/?.lua;;";[m
[31m-    [m
[31m-            init_by_lua '[m
[31m-                require "resty.core"[m
[31m-            ';[m
[31m-    [m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This pure Lua library reimplements part of the L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme> module's[m
[31m-L<Nginx API for Lua|https://github.com/openresty/lua-nginx-module#nginx-api-for-lua>[m
[31m-with LuaJIT FFI and installs the new FFI-based Lua API into the ngx.I< and ndk.> namespaces[m
[31m-used by the ngx_lua module.[m
[31m-[m
[31m-In addition, this Lua library implements any significant new Lua APIs of[m
[31m-the L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme> module[m
[31m-as proper Lua modules, like L<ngx.semaphore> and L<ngx.balancer>.[m
[31m-[m
[31m-The FFI-based Lua API can work with LuaJIT's JIT compiler. ngx_lua's default API is based on the standard[m
[31m-Lua C API, which will never be JIT compiled and the user Lua code is always interpreted (slowly).[m
[31m-[m
[31m-This library is shipped with the OpenResty bundle by default. So you do not really need to worry about the dependencies[m
[31m-and requirements.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Prerequisites[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-LuaJIT 2.1 (for now, it is the v2.1 git branch in the official luajit-2.0 git repository: http://luajit.org/download.html )[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/openresty/lua-nginx-module> v0.10.3 or later.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-lrucache|https://github.com/openresty/lua-resty-lrucache>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 API Implemented[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.hash[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.md5|https://github.com/openresty/lua-nginx-module#ngxmd5>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.md5_bin|https://github.com/openresty/lua-nginx-module#ngxmd5_bin>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.sha1_bin|https://github.com/openresty/lua-nginx-module#ngxsha1_bin>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.base64[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.encode_base64|https://github.com/openresty/lua-nginx-module#ngxencode_base64>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.decode_base64|https://github.com/openresty/lua-nginx-module#ngxdecode_base64>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.uri[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.escape_uri|https://github.com/openresty/lua-nginx-module#ngxescape_uri>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.unescape_uri|https://github.com/openresty/lua-nginx-module#ngxunescape_uri>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.regex[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.match|https://github.com/openresty/lua-nginx-module#ngxrematch>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.find|https://github.com/openresty/lua-nginx-module#ngxrefind>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.sub|https://github.com/openresty/lua-nginx-module#ngxresub>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.re.gsub|https://github.com/openresty/lua-nginx-module#ngxregsub>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.exit[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.exit|https://github.com/openresty/lua-nginx-module#ngxexit>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.shdict[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.get|https://github.com/openresty/lua-nginx-module#ngxshareddictget>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.get_stale|https://github.com/openresty/lua-nginx-module#ngxshareddictget_stale>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.incr|https://github.com/openresty/lua-nginx-module#ngxshareddictincr>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.set|https://github.com/openresty/lua-nginx-module#ngxshareddictset>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.safe_set|https://github.com/openresty/lua-nginx-module#ngxshareddictsafe_set>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.add|https://github.com/openresty/lua-nginx-module#ngxshareddictadd>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.safe_add|https://github.com/openresty/lua-nginx-module#ngxshareddictsafe_add>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.replace|https://github.com/openresty/lua-nginx-module#ngxshareddictreplace>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.delete|https://github.com/openresty/lua-nginx-module#ngxshareddictdelete>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.shared.DICT.flush_all|https://github.com/openresty/lua-nginx-module#ngxshareddictflush_all>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.var[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.var.VARIABLE|https://github.com/openresty/lua-nginx-module#ngxvarvariable>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.ctx[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.ctx|https://github.com/openresty/lua-nginx-module#ngxctx>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_headers|https://github.com/openresty/lua-nginx-module#ngxreqget_headers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_uri_args|https://github.com/openresty/lua-nginx-module#ngxreqget_uri_args>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.start_time|https://github.com/openresty/lua-nginx-module#ngxreqstart_time>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.get_method|https://github.com/openresty/lua-nginx-module#ngxreqget_method>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_method|https://github.com/openresty/lua-nginx-module#ngxreqset_method>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.set_header|https://github.com/openresty/lua-nginx-module#ngxreqset_header>  (partial: table-typed header values not supported yet)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.req.clear_header|https://github.com/openresty/lua-nginx-module#ngxreqclear_header>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.response[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.header.HEADER|https://github.com/openresty/lua-nginx-module#ngxheaderheader>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.misc[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.status|https://github.com/openresty/lua-nginx-module#ngxstatus>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.is_subrequest|https://github.com/openresty/lua-nginx-module#ngxis_subrequest>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.headers_sent|https://github.com/openresty/lua-nginx-module#ngxheaders_sent>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.time[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.time|https://github.com/openresty/lua-nginx-module#ngxtime>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.now|https://github.com/openresty/lua-nginx-module#ngxnow>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.core.worker[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.exiting|https://github.com/openresty/lua-nginx-module#ngxworkerexiting>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.pid|https://github.com/openresty/lua-nginx-module#ngxworkerpid>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.id|https://github.com/openresty/lua-nginx-module#ngxworkerid>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx.worker.count|https://github.com/openresty/lua-nginx-module#ngxworkercount>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.semaphore[m
[31m-[m
[31m-[m
[31m-This Lua module implements a semaphore API for efficient "light thread" synchronization,[m
[31m-which can work across different requests (but not across nginx worker processes).[m
[31m-[m
[31m-See the L<documentation|./lib/ngx/semaphore.md> for this Lua module for more details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ngx.balancer[m
[31m-[m
[31m-[m
[31m-This Lua module implements for defining dynamic upstream balancers in Lua.[m
[31m-[m
[31m-See the L<documentation|./lib/ngx/balancer.md> for this Lua module for more details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Caveat[m
[31m-[m
[31m-If the user Lua code is not JIT compiled, then use of this library may[m
[31m-lead to performance drop in interpreted mode. You will only observe[m
[31m-speedup when you get a good part of your user Lua code JIT compiled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Re-implement C<ngx_lua>'s cosocket API with FFI.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Re-implement C<ngx_lua>'s C<ngx.get_phase> API function with FFI.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Re-implement C<ngx_lua>'s C<ngx.eof> and C<ngx.flush> API functions with FFI.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2013-2016, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module#readme[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-LuaJIT FFI: http://luajit.org/ext_ffi.html[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.balancer.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.balancer.pod[m
[1mdeleted file mode 100644[m
[1mindex 5d94fd6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.balancer.pod[m
[1m+++ /dev/null[m
[36m@@ -1,266 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx.balancer - Lua API for defining dynamic upstream balancers in Lua[m
[31m-[m
[31m-[m
[31m-[m
[31m-This Lua module is currently considered experimental.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    http {[m
[31m-        upstream backend {[m
[31m-            server 0.0.0.1;   # just an invalid address as a place holder[m
[31m-    [m
[31m-            balancer_by_lua_block {[m
[31m-                local balancer = require "ngx.balancer"[m
[31m-    [m
[31m-                -- well, usually we calculate the peer's host and port[m
[31m-                -- according to some balancing policies instead of using[m
[31m-                -- hard-coded values like below[m
[31m-                local host = "127.0.0.2"[m
[31m-                local port = 8080[m
[31m-    [m
[31m-                local ok, err = balancer.set_current_peer(host, port)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to set the current peer: ", err)[m
[31m-                    return ngx.exit(500)[m
[31m-                end[m
[31m-            }[m
[31m-    [m
[31m-            keepalive 10;  # connection pool[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            # this is the real entry point[m
[31m-            listen 80;[m
[31m-    [m
[31m-            location / {[m
[31m-                # make use of the upstream named "backend" defined above:[m
[31m-                proxy_pass http://backend/fake;[m
[31m-            }[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            # this server is just for mocking up a backend peer here...[m
[31m-            listen 127.0.0.2:8080;[m
[31m-    [m
[31m-            location = /fake {[m
[31m-                echo "this is the fake backend peer...";[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua module provides API functions to allow defining highly dynamic NGINX load balancers for[m
[31m-any existing nginx upstream modules like [http://nginx.org/en/docs/http/ngx_http_proxy_module.html ngx_proxy] and[m
[31m-[http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html ngx_fastcgi].[m
[31m-[m
[31m-It allows you to dynamically select a backend peer to connect to (or retry) on a per-request[m
[31m-basis from a list of backend peers which may also be dynamic.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-All the methods of this module are static (or module-level). That is, you do not need an object (or instance)[m
[31m-to call these methods.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_current_peer[m
[31m-[m
[31m-B<syntax:> I<ok, err = balancer.set_current_peer(host, port)>[m
[31m-[m
[31m-B<context:> I<balancer_by_luaE<42>>[m
[31m-[m
[31m-Sets the peer address (host and port) for the current backend query (which may be a retry).[m
[31m-[m
[31m-Domain names in C<host> do not make sense. You need to use OpenResty libraries like[m
[31m-L<lua-resty-dns|https://github.com/openresty/lua-resty-dns> to obtain IP address(es) from[m
[31m-all the domain names before entering the C<balancer_by_lua*> handler (for example,[m
[31m-you can perform DNS lookups in an earlier phase like L<access_by_lua*|https://github.com/openresty/lua-nginx-module#access_by_lua>[m
[31m-and pass the results to the C<balancer_by_lua*> handler via L<ngx.ctx|https://github.com/openresty/lua-nginx-module#ngxctx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_more_tries[m
[31m-[m
[31m-B<syntax:> I<ok, err = balancer.set_more_tries(count)>[m
[31m-[m
[31m-B<context:> I<balancer_by_luaE<42>>[m
[31m-[m
[31m-Sets the tries performed when the current attempt (which may be a retry) fails (as determined[m
[31m-by directives like L<proxy_next_upstream|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream>, depending on what[m
[31m-particular nginx uptream module you are currently using. Note that the current attempt is I<excluded> in the C<count> number set here.[m
[31m-[m
[31m-Please note that, the total number of tries in a single downstream request cannot exceed the[m
[31m-hard limit configured by directives like L<proxy_next_upstream_tries|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream_tries>,[m
[31m-depending on what concrete nginx upstream module you are using. When exceeding this limit,[m
[31m-the C<count> value will get reduced to meet the limit and the second return value will be[m
[31m-the string C<"reduced tries due to limit">, which is a warning, while the first return value[m
[31m-is still a C<true> value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_last_failure[m
[31m-[m
[31m-B<syntax:> I<state_name, status_code = balancer.get_last_failure()>[m
[31m-[m
[31m-B<context:> I<balancer_by_luaE<42>>[m
[31m-[m
[31m-Retrieves the failure details about the previous failed attempt (if any) when the C<next_upstream> retrying[m
[31m-mechanism is in action. When there was indeed a failed previous attempt, it returned a string descrbing[m
[31m-that attempt's state name, as well as an integer describing the status code of that attempt.[m
[31m-[m
[31m-Possible state names are as follows:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<"next">[m
[31m-Failures due to bad status codes sent from the backend server. The origin's response is sane though, which means the backend connection[m
[31m-can still be reused for future requests.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<"failed">[m
[31m-Fatal errors while communicating to the backend server (like connection timeouts, connection resets, and etc). In this case,[m
[31m-the backend connection must be aborted and cannot get reused.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Possible status codes are those HTTP error status codes like C<502> and C<504>.[m
[31m-[m
[31m-When the current attempt is the first attempt for the current downstream request (which means[m
[31m-there is no previous attempts at all), this[m
[31m-method always returns a single C<nil> value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-resty-core/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun Zhang E<lt>agentzh@gmail.comE<gt> (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<balancer_by_lua*|https://github.com/openresty/lua-nginx-module#balancer_by_lua_block> directive.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-library L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.ocsp.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.ocsp.pod[m
[1mdeleted file mode 100644[m
[1mindex 23d69ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.ocsp.pod[m
[1m+++ /dev/null[m
[36m@@ -1,333 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx.ocsp - Lua API for implementing OCSP stapling in ssl_certificate_by_lua*[m
[31m-[m
[31m-[m
[31m-[m
[31m-This Lua module is currently considered experimental.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    # Note: you do not need the following line if you are using[m
[31m-    # OpenResty 1.9.7.2+.[m
[31m-    lua_package_path "/path/to/lua-resty-core/lib/?.lua;;";[m
[31m-    [m
[31m-    server {[m
[31m-        listen 443 ssl;[m
[31m-        server_name   test.com;[m
[31m-    [m
[31m-        # useless placeholders: just to shut up NGINX configuration[m
[31m-        # loader errors:[m
[31m-        ssl_certificate /path/to/fallback.crt;[m
[31m-        ssl_certificate_key /path/to/fallback.key;[m
[31m-    [m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-            local ocsp = require "ngx.ocsp"[m
[31m-            local http = require "resty.http.simple"[m
[31m-    [m
[31m-            -- assuming the user already defines the my_load_certificate_chain()[m
[31m-            -- herself.[m
[31m-            local pem_cert_chain = assert(my_load_certificate_chain())[m
[31m-    [m
[31m-            local der_cert_chain, err = ssl.cert_pem_to_der(pem_cert_chain)[m
[31m-            if not der_cert_chain then[m
[31m-                ngx.log(ngx.ERR, "failed to convert certificate chain ",[m
[31m-                        "from PEM to DER: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local ocsp_url, err = ocsp.get_ocsp_responder_from_der_chain(der_cert_chain)[m
[31m-            if not ocsp_url then[m
[31m-                ngx.log(ngx.ERR, "failed to get OCSP responder: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            print("ocsp_url: ", ocsp_url)[m
[31m-    [m
[31m-            -- use cosocket-based HTTP client libraries like lua-resty-http-simple[m
[31m-            -- to send the request (url + ocsp_req as POST params or URL args) to[m
[31m-            -- CA's OCSP server. assuming the server returns the OCSP response[m
[31m-            -- in the Lua varaible, resp.[m
[31m-    [m
[31m-            local schema, host, port, ocsp_uri, err = parse_url(ocsp_url)[m
[31m-    [m
[31m-            local ocsp_req, err = ocsp.create_ocsp_request(der_cert_chain)[m
[31m-            if not ocsp_req then[m
[31m-                ngx.log(ngx.ERR, "failed to create OCSP request: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local res, err = http.request(host, port, {[m
[31m-                path = ocsp_uri,[m
[31m-                headers = { Host = host,[m
[31m-                            ["Content-Type"] = "application/ocsp-request" },[m
[31m-                timeout = 10000,  -- 10 sec[m
[31m-                method = "POST",[m
[31m-                body = ocsp_req,[m
[31m-                maxsize = 102400,  -- 100KB[m
[31m-            })[m
[31m-    [m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "OCSP responder query failed: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local http_status = res.status[m
[31m-    [m
[31m-            if http_status ~= 200 then[m
[31m-                ngx.log(ngx.ERR, "OCSP responder returns bad HTTP status code ",[m
[31m-                        http_status)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local ocsp_resp = res.body[m
[31m-    [m
[31m-            if ocsp_resp and #ocsp_resp > 0 then[m
[31m-                local ok, err = ocsp.validate_ocsp_response(ocsp_resp, der_cert_chain)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to validate OCSP response: ", err)[m
[31m-                    return ngx.exit(ngx.ERROR)[m
[31m-                end[m
[31m-    [m
[31m-                -- set the OCSP stapling[m
[31m-                ok, err = ocsp.set_ocsp_status_resp(resp)[m
[31m-                if not ok then[m
[31m-                    ngx.log(ngx.ERR, "failed to set ocsp status resp: ", err)[m
[31m-                    return ngx.exit(ngx.ERROR)[m
[31m-                end[m
[31m-            end[m
[31m-        }[m
[31m-    [m
[31m-        location / {[m
[31m-            root html;[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua module provides API to perform OCSP queries, OCSP response validations, and[m
[31m-OCSP stapling planting.[m
[31m-[m
[31m-Usually, this module is used together with the L<ngx.ssl|ssl.md> module in the[m
[31m-context of L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block>[m
[31m-(of the L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme> module).[m
[31m-[m
[31m-To load the C<ngx.ocsp> module in Lua, just write[m
[31m-[m
[31m-[m
[31m-    local ocsp = require "ngx.ocsp"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-=head2 get_ocsp_responder_from_der_chain[m
[31m-[m
[31m-B<syntax:> I<ocsp_url, err = ocsp.get_ocsp_responder_from_der_chain(der_cert_chain, max_len)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Extracts the OCSP responder URL (like C<"http://test.com/ocsp/">) from the SSL server certificate chain in the DER format.[m
[31m-[m
[31m-Usually the SSL server certificate chain is originally formatted in PEM. You can use the Lua API[m
[31m-provided by the L<ngx.ssl|ssl.md> module to do the PEM to DER conversion.[m
[31m-[m
[31m-The optional C<max_len> argument specifies the maximum length of OCSP URL allowed. This determines[m
[31m-the buffer size; so do not specify an unnecessarily large value here. It defaults to the internal[m
[31m-string buffer size used throughout this C<lua-resty-core> library (usually default to 4KB).[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 create_ocsp_request[m
[31m-[m
[31m-B<syntax:> I<ocsp_req, err = ocsp.create_ocsp_request(der_cert_chain, max_len)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Builds an OCSP request from the SSL server certificate chain in the DER format, which[m
[31m-can be used to send to the OCSP server for validation.[m
[31m-[m
[31m-The optional C<max_len> argument specifies the maximum length of the OCSP request allowed.[m
[31m-This value determines the size of the internal buffer allocated, so do not specify an[m
[31m-unnecessarily large value here. It defaults to the internal string buffer size used[m
[31m-throughout this C<lua-resty-core> library (usually defaults to 4KB).[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The raw OCSP response data can be used as the request body directly if the POST method[m
[31m-is used for the OCSP request. But for GET requests, you need to do base64 encoding and[m
[31m-then URL encoding on the data yourself before appending it to the OCSP URL obtained[m
[31m-by the L<get_ocsp_responder_from_der_chain> function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 validate_ocsp_response[m
[31m-[m
[31m-B<syntax:> I<ok, err = ocsp.validate_ocsp_response(ocsp_resp, der_cert_chain, max_err_msg_len)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Validates the raw OCSP response data specified by the C<ocsp_resp> argument using the SSL[m
[31m-server certificate chain in DER format as specified in the C<der_cert_chain> argument.[m
[31m-[m
[31m-Returns true when the validation is successful.[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string[m
[31m-describing the failure. The maximum[m
[31m-length of the error string is controlled by the optional C<max_err_msg> argument (which defaults[m
[31m-to the default internal string buffer size used throughout this C<lua-resty-core> library, usually[m
[31m-being 4KB).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_ocsp_status_resp[m
[31m-[m
[31m-B<syntax:> I<ok, err = ocsp.set_ocsp_status_resp(ocsp_resp)>[m
[31m-[m
[31m-B<context:> I<ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sets the OCSP response as the OCSP stapling for the current SSL connection.[m
[31m-[m
[31m-Returns C<true> in case of successes. If the SSL client does not send a "status request"[m
[31m-at all, then this method still returns C<true> but also with a string as the warning[m
[31m-C<"no status req">.[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The OCSP response is returned from CA's OCSP server. See the L<create_ocsp_request>[m
[31m-function for how to create an OCSP request and also L<validate_ocsp_response>[m
[31m-for how to validate the OCSP response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-resty-core/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun Zhang E<lt>agentzh@gmail.comE<gt> (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ngx.ssl|ssl.md> module.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block> directive.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-library L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.semaphore.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.semaphore.pod[m
[1mdeleted file mode 100644[m
[1mindex 9cc877d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.semaphore.pod[m
[1m+++ /dev/null[m
[36m@@ -1,376 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx.semaphore - light thread semaphore for OpenResty/ngx_lua.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This Lua module is currently considered experimental.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-=head2 Synchronizing threads in the same context[m
[31m-[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sema = semaphore.new()[m
[31m-    [m
[31m-            local function handler()[m
[31m-                ngx.say("sub thread: waiting on sema...")[m
[31m-    [m
[31m-                local ok, err = sema:wait(1)  -- wait for a second at most[m
[31m-                if not ok then[m
[31m-                    ngx.say("sub thread: failed to wait on sema: ", err)[m
[31m-                else[m
[31m-                    ngx.say("sub thread: waited successfully.")[m
[31m-                end[m
[31m-            end[m
[31m-    [m
[31m-            local co = ngx.thread.spawn(handler)[m
[31m-    [m
[31m-            ngx.say("main thread: sleeping for a little while...")[m
[31m-    [m
[31m-            ngx.sleep(0.1)  -- wait a bit[m
[31m-    [m
[31m-            ngx.say("main thread: posting to sema...")[m
[31m-    [m
[31m-            sema:post(1)[m
[31m-    [m
[31m-            ngx.say("main thread: end.")[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-The example location above produces a response output like this:[m
[31m-[m
[31m-[m
[31m-    sub thread: waiting on sema...[m
[31m-    main thread: sleeping for a little while...[m
[31m-    main thread: posting to sema...[m
[31m-    main thread: end.[m
[31m-    sub thread: waited successfully.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Synchronizing threads in different contexts[m
[31m-[m
[31m-[m
[31m-    location = /t {[m
[31m-        content_by_lua_block {[m
[31m-            local semaphore = require "ngx.semaphore"[m
[31m-            local sema = semaphore.new()[m
[31m-    [m
[31m-            local outputs = {}[m
[31m-            local i = 1[m
[31m-    [m
[31m-            local function out(s)[m
[31m-                outputs[i] = s[m
[31m-                i = i + 1[m
[31m-            end[m
[31m-    [m
[31m-            local function handler()[m
[31m-                out("timer thread: sleeping for a little while...")[m
[31m-    [m
[31m-                ngx.sleep(0.1)  -- wait a bit[m
[31m-    [m
[31m-                out("timer thread: posting on sema...")[m
[31m-    [m
[31m-                sema:post(1)[m
[31m-            end[m
[31m-    [m
[31m-            assert(ngx.timer.at(0, handler))[m
[31m-    [m
[31m-            out("main thread: waiting on sema...")[m
[31m-    [m
[31m-            local ok, err = sema:wait(1)  -- wait for a second at most[m
[31m-            if not ok then[m
[31m-                out("main thread: failed to wait on sema: ", err)[m
[31m-            else[m
[31m-                out("main thread: waited successfully.")[m
[31m-            end[m
[31m-    [m
[31m-            out("main thread: end.")[m
[31m-    [m
[31m-            ngx.say(table.concat(outputs, "\n"))[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-The example location above produces a response body like this[m
[31m-[m
[31m-[m
[31m-    main thread: waiting on sema...[m
[31m-    timer thread: sleeping for a little while...[m
[31m-    timer thread: posting on sema...[m
[31m-    main thread: waited successfully.[m
[31m-    main thread: end.[m
[31m-[m
[31m-The same applies to different request contexts as long as these requests are served[m
[31m-by the same nginx worker process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module provides an efficient semaphore API for the OpenResty/ngx_lua module. With[m
[31m-semaphores, "light threads" (created by L<ngx.thread.spawn|https://github.com/openresty/lua-nginx-module#ngxthreadspawn>,[m
[31m-L<ngx.timer.at|https://github.com/openresty/lua-nginx-module#ngxtimerat>, and etc.) can[m
[31m-synchronize among each other very efficiently without constant polling and sleeping.[m
[31m-[m
[31m-"Light threads" in different contexts (like in different requests) can share the same[m
[31m-semaphore instance as long as these "light threads" reside in the same NGINX worker[m
[31m-process and the L<lua_code_cache|https://github.com/openresty/lua-nginx-module#lua_code_cache>[m
[31m-directive is turned on (which is the default). For inter-process "light thread" synchronization,[m
[31m-it is recommended to use the L<lua-resty-lock|https://github.com/openresty/lua-resty-lock> library instead[m
[31m-(which is a bit less efficient than this semaphore API though).[m
[31m-[m
[31m-This semaphore API has a pure userland implementation which does not involve any system calls nor[m
[31m-block any operating system threads. It works closely with the event model of NGINX without[m
[31m-introducing any extra delay.[m
[31m-[m
[31m-Like other APIs provided by this C<lua-resty-core> library, the LuaJIT FFI feature is required.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-B<syntax:> I<sema, err = semaphore_module.new(n?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>>[m
[31m-[m
[31m-Creates and returns a new semaphore instance that has C<n> (default to C<0>) resources.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     local semaphore = require "ngx.semaphore"[m
[31m-     local sema, err = semaphore.new()[m
[31m-     if not sema then[m
[31m-         ngx.say("create semaphore failed: ", err)[m
[31m-     end[m
[31m-[m
[31m-Often the semaphore object created is shared on the NGINX worker process by mounting in a custom Lua module, as[m
[31m-documented below:[m
[31m-[m
[31m-https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 post[m
[31m-[m
[31m-B<syntax:> I<sema:post(n?)>[m
[31m-[m
[31m-B<context:> I<init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>>[m
[31m-[m
[31m-Releases C<n> (default to C<1>) "resources" to the semaphore instance.[m
[31m-[m
[31m-This will not yield the current running "light thread".[m
[31m-[m
[31m-At most C<n> "light threads" will be waken up when the current running "light thread" later yields (or terminates).[m
[31m-[m
[31m-[m
[31m-    -- typically, we get the semaphore instance from upvalue or globally shared data[m
[31m-    -- See https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker[m
[31m-    [m
[31m-    local semaphore = require "ngx.semaphore"[m
[31m-    local sema = semaphore.new()[m
[31m-    [m
[31m-    sema:post(2)  -- releases 2 resources[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 wait[m
[31m-[m
[31m-B<syntax:> I<ok, err = sema:wait(timeout)>[m
[31m-[m
[31m-B<context:> I<rewrite_by_luaE<42>, access_by_luaE<42>, content_by_luaE<42>, ngx.timer.E<42>>[m
[31m-[m
[31m-Requests a resource from the semaphore instance.[m
[31m-[m
[31m-Returns C<true> immediately when there is resources available for the current running "light thread".[m
[31m-Otherwise the current "light thread" will enter the waiting queue and yield execution.[m
[31m-The current "light thread" will be automatically waken up and the C<wait> function call[m
[31m-will return C<true> when there is resources available for it, or return C<nil> and a string describing[m
[31m-the error in case of failure (like C<"timeout">).[m
[31m-[m
[31m-The C<timeout> argument specifies the maximum time this function call should wait for (in seconds).[m
[31m-[m
[31m-When the C<timeout> argument is 0, it means "no wait", that is, when there is no readily available[m
[31m-"resources" for the current running "light thread", this C<wait> function call returns immediately[m
[31m-C<nil> and the error string C<"timeout">.[m
[31m-[m
[31m-"Light threads" created by different contexts (like request handlers) can wait on the[m
[31m-same semaphore instance without problem.[m
[31m-[m
[31m-See L<Synopsis> for code examples.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 count[m
[31m-[m
[31m-B<syntax:> I<count = sema:count()>[m
[31m-[m
[31m-B<context:> *init_by_luaE<42>, init_worker_by_luaE<42>, set_by_luaE<42>, rewrite_by_luaE<42>, access_by_luaE<42>,[m
[31m-content_by_luaE<42>, header_filter_by_luaE<42>, body_filter_by_luaE<42>, log_by_luaE<42>, ngx.timer.E<42>*[m
[31m-[m
[31m-Returns the number of resources readily available in the C<sema> semaphore instance (if any).[m
[31m-[m
[31m-When the returned number is negative, it means the number of "light threads" waiting on[m
[31m-this semaphore.[m
[31m-[m
[31m-Consider the following example,[m
[31m-[m
[31m-[m
[31m-    local semaphore = require "ngx.semaphore"[m
[31m-    local sema = semaphore.new(0)[m
[31m-    [m
[31m-    ngx.say("count: ", sema:count())  -- count: 0[m
[31m-    [m
[31m-    local function handler(id)[m
[31m-        local ok, err = sema:wait(1)[m
[31m-        if not ok then[m
[31m-            ngx.say("err: ", err)[m
[31m-        else[m
[31m-            ngx.say("wait success")[m
[31m-        end[m
[31m-    end[m
[31m-    [m
[31m-    local co1 = ngx.thread.spawn(handler)[m
[31m-    local co2 = ngx.thread.spawn(handler)[m
[31m-    [m
[31m-    ngx.say("count: ", sema:count())  -- count: -2[m
[31m-    [m
[31m-    sema:post(1)[m
[31m-    [m
[31m-    ngx.say("count: ", sema:count())  -- count: -1[m
[31m-    [m
[31m-    sema:post(2)[m
[31m-    [m
[31m-    ngx.say("count: ", sema:count())  -- count: 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-resty-core/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Weixie Cui, Kugou Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-library L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.ssl.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.ssl.pod[m
[1mdeleted file mode 100644[m
[1mindex d2231ec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-core-0.1.6/ngx.ssl.pod[m
[1m+++ /dev/null[m
[36m@@ -1,439 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx.ssl - Lua API for controling NGINX downstream SSL handshakes[m
[31m-[m
[31m-[m
[31m-[m
[31m-This Lua module is currently considered experimental.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    # Note: you do not need the following line if you are using[m
[31m-    # OpenResty 1.9.7.2+.[m
[31m-    lua_package_path "/path/to/lua-resty-core/lib/?.lua;;";[m
[31m-    [m
[31m-    server {[m
[31m-        listen 443 ssl;[m
[31m-        server_name   test.com;[m
[31m-    [m
[31m-        # useless placeholders: just to shut up NGINX configuration[m
[31m-        # loader errors:[m
[31m-        ssl_certificate /path/to/fallback.crt;[m
[31m-        ssl_certificate_key /path/to/fallback.key;[m
[31m-    [m
[31m-        ssl_certificate_by_lua_block {[m
[31m-            local ssl = require "ngx.ssl"[m
[31m-    [m
[31m-            -- clear the fallback certificates and private keys[m
[31m-            -- set by the ssl_certificate and ssl_certificate_key[m
[31m-            -- directives above:[m
[31m-            local ok, err = ssl.clear_certs()[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to clear existing (fallback) certificates")[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            -- assuming the user already defines the my_load_certificate_chain()[m
[31m-            -- herself.[m
[31m-            local pem_cert_chain = assert(my_load_certificate_chain())[m
[31m-    [m
[31m-            local der_cert_chain, err = ssl.cert_pem_to_der(pem_cert_chain)[m
[31m-            if not der_cert_chain then[m
[31m-                ngx.log(ngx.ERR, "failed to convert certificate chain ",[m
[31m-                        "from PEM to DER: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            local ok, err = ssl.set_der_cert(der_cert_chain)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER cert: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-    [m
[31m-            -- assuming the user already defines the my_load_private_key()[m
[31m-            -- function herself.[m
[31m-            local der_pkey = assert(my_load_private_key())[m
[31m-    [m
[31m-            local ok, err = ssl.set_der_priv_key(der_pkey)[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to set DER private key: ", err)[m
[31m-                return ngx.exit(ngx.ERROR)[m
[31m-            end[m
[31m-        }[m
[31m-    [m
[31m-        location / {[m
[31m-            root html;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua module provides API functions to control the SSL handshake process in contexts like[m
[31m-L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block>[m
[31m-(of the L<ngx_lua|https://github.com/openresty/lua-nginx-module#readme> module).[m
[31m-[m
[31m-For web servers serving many (like millions of) https sites, it is often desired to lazily[m
[31m-load and cache the SSL certificate chain and private key data for the https sites actually[m
[31m-being served by a particular server. This Lua module provides API to support such use cases[m
[31m-in the context of the L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block>[m
[31m-directive.[m
[31m-[m
[31m-To load the C<ngx.ssl> module in Lua, just write[m
[31m-[m
[31m-[m
[31m-    local ssl = require "ngx.ssl"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-=head2 clear_certs[m
[31m-[m
[31m-B<syntax:> I<ok, err = ssl.clear_certs()>[m
[31m-[m
[31m-B<context:> I<ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Clears any existing SSL certificates and/or private keys set on the current SSL connection.[m
[31m-[m
[31m-Returns C<true> on success, or a C<nil> value and a string describing the error otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 cert_pem_to_der[m
[31m-[m
[31m-B<syntax:> I<der_cert_chain, err = ssl.cert_pem_to_der(pem_cert_chain)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Converts the PEM-formatted SSL certificate chain data into the DER format (for later uses[m
[31m-in the L<set_der_cert>[m
[31m-function, for example).[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-It is known that the C<openssl> command-line utility may not convert the whole SSL[m
[31m-certificate chain from PEM to DER correctly. So always use this Lua function to do[m
[31m-the conversion. You can always use libraries like L<lua-resty-lrucache|https://github.com/openresty/lua-resty-lrucache#readme>[m
[31m-and/or ngx_lua APIs like L<lua_shared_dict|https://github.com/openresty/lua-nginx-module#lua_shared_dict>[m
[31m-to do the caching of the DER-formatted results, for example.[m
[31m-[m
[31m-This function can be called in whatever contexts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_der_cert[m
[31m-[m
[31m-B<syntax:> I<ok, err = ssl.set_der_cert(der_cert_chain)>[m
[31m-[m
[31m-B<context:> I<ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sets the DER-formatted SSL certificate chain data for the current SSL connection. Note that[m
[31m-the DER data is[m
[31m-directly in the Lua string argument. I<No> external file names are supported here.[m
[31m-[m
[31m-Returns C<true> on success, or a C<nil> value and a string describing the error otherwise.[m
[31m-[m
[31m-Note that, the SSL certificate chain is usually encoded in the PEM format. So you need[m
[31m-to use the L<cert_pem_to_der>[m
[31m-function to do the conversion first.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 priv_key_pem_to_der[m
[31m-[m
[31m-B<syntax:> I<der_priv_key, err = ssl.priv_key_pem_to_der(pem_priv_key)>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Converts the PEM-formatted SSL private key data into the DER format (for later uses[m
[31m-in the L<set_der_priv_key>[m
[31m-function, for example).[m
[31m-[m
[31m-In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-Alternatively, you can do the PEM to DER conversion I<offline> with the C<openssl> command-line utility, like below[m
[31m-[m
[31m-[m
[31m-    openssl rsa -in key.pem -outform DER -out key.der[m
[31m-[m
[31m-This function can be called in whatever contexts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_der_priv_key[m
[31m-[m
[31m-B<syntax:> I<ok, err = ssl.set_der_priv_key(der_cert_chain)>[m
[31m-[m
[31m-B<context:> I<ssl_certificate_by_luaE<42>>[m
[31m-[m
[31m-Sets the DER-formatted prviate key for the current SSL connection.[m
[31m-[m
[31m-Returns C<true> on success, or a C<nil> value and a string describing the error otherwise.[m
[31m-[m
[31m-Usually, the private keys are encoded in the PEM format. You can either use the[m
[31m-L<priv_key_pem_to_der> function[m
[31m-to do the PEM to DER conversion or just use[m
[31m-the C<openssl> command-line utility offline, like below[m
[31m-[m
[31m-[m
[31m-    openssl rsa -in key.pem -outform DER -out key.der[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_name[m
[31m-[m
[31m-B<syntax:> I<name, err = ssl.server_name()>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Returns the TLS SNI (Server Name Indication) name set by the client. Returns C<nil>[m
[31m-when the client does not set it.[m
[31m-[m
[31m-In case of failures, it returns C<nil> I<and> a string describing the error.[m
[31m-[m
[31m-Usually we use this SNI name as the domain name (like C<www.openresty.org>) to[m
[31m-identify the current web site while loading the corresponding SSL certificate[m
[31m-chain and private key for the site.[m
[31m-[m
[31m-Please note that not all https clients set the SNI name, so when the SNI name is[m
[31m-missing from the client handshake request, we use the server IP address accessed[m
[31m-by the client to identify the site. See the L<raw_server_addr> method[m
[31m-for more details.[m
[31m-[m
[31m-This function can be called in whatever contexts where downstream https is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 raw_server_addr[m
[31m-[m
[31m-B<syntax:> I<addr_data, addr_type, err = ssl.raw_server_addr()>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Returns the raw server address actually accessed by the client in the current SSL connection.[m
[31m-[m
[31m-The first two return values are strings representing the address data and the address type, respectively.[m
[31m-The address values are interpreted differently according to the address type values:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<unix>[m
[31m-: The address data is a file path for the UNIX domain socket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<inet>[m
[31m-: The address data is a binary IPv4 address of 4 bytes long.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<inet6>[m
[31m-: The address data is a binary IPv6 address of 16 bytes long.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Returns two C<nil> values and a Lua string describing the error.[m
[31m-[m
[31m-The following code snippet shows how to print out the UNIX domain socket address and[m
[31m-the IPv4 address as human-readable strings:[m
[31m-[m
[31m-[m
[31m-    local ssl = require "ngx.ssl"[m
[31m-    local byte = string.byte[m
[31m-    [m
[31m-    local addr, addrtyp, err = ssl.raw_server_addr()[m
[31m-    if not addr then[m
[31m-        ngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)[m
[31m-        return[m
[31m-    end[m
[31m-    [m
[31m-    if addrtyp == "inet" then  -- IPv4[m
[31m-        ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),[m
[31m-                           byte(addr, 3), byte(addr, 4))[m
[31m-        print("Using IPv4 address: ", ip)[m
[31m-    [m
[31m-    elseif addrtyp == "unix" then  -- UNIX[m
[31m-        print("Using unix socket file ", addr)[m
[31m-    [m
[31m-    else  -- IPv6[m
[31m-        -- leave as an exercise for the readers[m
[31m-    end[m
[31m-[m
[31m-This function can be called in whatever contexts where downstream https is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_tls1_version[m
[31m-[m
[31m-B<syntax:> I<ver, err = ssl.get_tls1_version()>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Returns the TLS 1.x version number used by the current SSL connection. Returns C<nil> and[m
[31m-a string describing the error otherwise.[m
[31m-[m
[31m-Typical return values are[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<SSLv3>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<TLSv1>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<TLSv1.1>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<TLSv1.2>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This function can be called in whatever contexts where downstream https is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-resty-core/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun Zhang E<lt>agentzh@gmail.comE<gt> (agentzh), CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ngx.ocsp|ocsp.md> module.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ssl_certificate_by_lua*|https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block> directive.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-library L<lua-resty-core|https://github.com/openresty/lua-resty-core>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-dns-0.16/lua-resty-dns-0.16.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-dns-0.16/lua-resty-dns-0.16.pod[m
[1mdeleted file mode 100644[m
[1mindex 2b28927..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-dns-0.16/lua-resty-dns-0.16.pod[m
[1m+++ /dev/null[m
[36m@@ -1,640 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-dns - Lua DNS resolver for the ngx_lua based on the cosocket API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library provies a DNS resolver for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.5.12|https://github.com/chaoslawful/lua-nginx-module/tags> or L<OpenResty 1.2.1.11|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-Also, the L<bit library|http://bitop.luajit.org/> is also required. If you're using LuaJIT 2.0 with ngx_lua, then the C<bit> library is already available by default.[m
[31m-[m
[31m-Note that, this library is bundled and enabled by default in the L<OpenResty bundle|http://openresty.org/>.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        lua_package_path "/path/to/lua-resty-dns/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location = /dns {[m
[31m-                content_by_lua '[m
[31m-                    local resolver = require "resty.dns.resolver"[m
[31m-                    local r, err = resolver:new{[m
[31m-                        nameservers = {"8.8.8.8", {"8.8.4.4", 53} },[m
[31m-                        retrans = 5,  -- 5 retransmissions on receive timeout[m
[31m-                        timeout = 2000,  -- 2 sec[m
[31m-                    }[m
[31m-    [m
[31m-                    if not r then[m
[31m-                        ngx.say("failed to instantiate the resolver: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local answers, err = r:query("www.google.com")[m
[31m-                    if not answers then[m
[31m-                        ngx.say("failed to query the DNS server: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    if answers.errcode then[m
[31m-                        ngx.say("server returned error code: ", answers.errcode,[m
[31m-                                ": ", answers.errstr)[m
[31m-                    end[m
[31m-    [m
[31m-                    for i, ans in ipairs(answers) do[m
[31m-                        ngx.say(ans.name, " ", ans.address or ans.cname,[m
[31m-                                " type:", ans.type, " class:", ans.class,[m
[31m-                                " ttl:", ans.ttl)[m
[31m-                    end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: r, err = class:new(opts)>[m
[31m-[m
[31m-Creates a dns.resolver object. Returns C<nil> and an message string on error.[m
[31m-[m
[31m-It accepts a C<opts> table argument. The following options are supported:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<nameservers>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-a list of nameservers to be used. Each nameserver entry can be either a single hostname string or a table holding both the hostname string and the port number. The nameserver is picked up by a simple round-robin algorithm for each C<query> method call. This option is required.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<retrans>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-the total number of times of retransmitting the DNS request when receiving a DNS response times out according to the C<timeout> setting. Default to C<5> times. When trying to retransmit the query, the next nameserver according to the round-robin algorithm will be picked up.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timeout>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-the time in milliseconds for waiting for the respond for a single attempt of request transmition. note that this is ''not'' the maximal total waiting time before giving up, the maximal total waiting time can be calculated by the expression C<timeout x retrans>. The C<timeout> setting can also be changed by calling the C<set_timeout> method. The default C<timeout> setting is 2000 milliseconds, or 2 seconds.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<no_recurse>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-a boolean flag controls whether to disable the "recursion desired" (RD) flag in the UDP request. Default to C<false>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 query[m
[31m-[m
[31m-C<syntax: answers, err = r:query(name, options?)>[m
[31m-[m
[31m-Performs a DNS standard query to the nameservers specified by the C<new> method,[m
[31m-and returns all the answer records in an array-like Lua table. In case of errors, it will[m
[31m-return C<nil> and a string describing the error instead.[m
[31m-[m
[31m-If the server returns a non-zero error code, the fields C<errcode> and C<errstr> will be set accordingly in the Lua table returned.[m
[31m-[m
[31m-Each entry in the C<answers> returned table value is also a hash-like Lua table[m
[31m-which usually takes some of the following fields:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<name>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The resource record name.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<type>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The current resource record type, possible values are C<1> (C<TYPE_A>), C<5> (C<TYPE_CNAME>), C<28> (C<TYPE_AAAA>), and any other values allowed by RFC 1035.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<address>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The IPv4 or IPv6 address in their textual representations when the resource record type is either C<1> (C<TYPE_A>) or C<28> (C<TYPE_AAAA>), respectively. Secussesive 16-bit zero groups in IPv6 addresses will not be compressed by default, if you want that, you need to call the C<compress_ipv6_addr> static method instead.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<cname>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The (decoded) record data value for C<CNAME> resource records. Only present for C<CNAME> records.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ttl>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The time-to-live (TTL) value in seconds for the current resource record.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<class>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The current resource record class, possible values are C<1> (C<CLASS_IN>) or any other values allowed by RFC 1035.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<preference>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The preference integer number for C<MX> resource records. Only present for C<MX> type records.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<exchange>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The exchange domain name for C<MX> resource records. Only present for C<MX> type records.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<nsdname>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-A domain-name which specifies a host which should be authoritative for the specified class and domain. Usually present for C<NS> type records.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<rdata>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The raw resource data (RDATA) for resource records that are not recognized.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<txt>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The record value for C<TXT> records. When there is only one character string in this record, then this field takes a single Lua string. Otherwise this field takes a Lua table holding all the strings.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ptrdname>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The record value for C<PTR> records.[m
[31m-[m
[31m-This method also takes an optional C<options> argument table, which takes the following fields:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<qtype>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The type of the question. Possible values are C<1> (C<TYPE_A>), C<5> (C<TYPE_CNAME>), C<28> (C<TYPE_AAAA>), or any other QTYPE value specified by RFC 1035 and RFC 3596. Default to C<1> (C<TYPE_A>).[m
[31m-[m
[31m-When data truncation happens, the resolver will automatically retry using the TCP transport mode[m
[31m-to query the current nameserver. All TCP connections are short lived.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcp_query[m
[31m-[m
[31m-C<syntax: answers, err = r:tcp_query(name, options?)>[m
[31m-[m
[31m-Just like the C<query> method, but enforce the TCP transport mode instead of UDP.[m
[31m-[m
[31m-All TCP connections are short lived.[m
[31m-[m
[31m-Here is an example:[m
[31m-[m
[31m-[m
[31m-        local resolver = require "resty.dns.resolver"[m
[31m-    [m
[31m-        local r, err = resolver:new{[m
[31m-            nameservers = { "8.8.8.8" }[m
[31m-        }[m
[31m-        if not r then[m
[31m-            ngx.say("failed to instantiate resolver: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local ans, err = r:tcp_query("www.google.com", { qtype = r.TYPE_A })[m
[31m-        if not ans then[m
[31m-            ngx.say("failed to query: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local cjson = require "cjson"[m
[31m-        ngx.say("records: ", cjson.encode(ans))[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_timeout[m
[31m-[m
[31m-C<syntax: r:set_timeout(time)>[m
[31m-[m
[31m-Overrides the current C<timeout> setting by the C<time> argument in milliseconds for all the nameserver peers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 compress_ipv6_addr[m
[31m-[m
[31m-C<syntax: compressed = resty.dns.resolver.compress_ipv6_addr(address)>[m
[31m-[m
[31m-Compresses the successive 16-bit zero groups in the textual format of the IPv6 address.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-        local resolver = require "resty.dns.resolver"[m
[31m-        local compress = resolver.compress_ipv6_addr[m
[31m-        local new_addr = compress("FF01:0:0:0:0:0:0:101")[m
[31m-[m
[31m-will yield C<FF01::101> in the C<new_addr> return value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 expand_ipv6_addr[m
[31m-[m
[31m-C<syntax: expanded = resty.dns.resolver.expand_ipv6_addr(address)>[m
[31m-[m
[31m-Expands the successive 16-bit zero groups in the textual format of the IPv6 address.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-        local resolver = require "resty.dns.resolver"[m
[31m-        local expand = resolver.expand_ipv6_addr[m
[31m-        local new_addr = expand("FF01::101")[m
[31m-[m
[31m-will yield C<FF01:0:0:0:0:0:0:101> in the C<new_addr> return value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 arpa_str[m
[31m-[m
[31m-C<syntax: arpa_record = resty.dns.resolver.arpa_str(address)>[m
[31m-[m
[31m-Generates the reverse domain name for PTR lookups for both IPv4 and IPv6 addresses. Compressed IPv6 addresses[m
[31m-will be automatically expanded.[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-        local resolver = require "resty.dns.resolver"[m
[31m-        local ptr4 = resolver.arpa_str("1.2.3.4")[m
[31m-        local ptr6 = resolver.arpa_str("FF01::101")[m
[31m-[m
[31m-will yield C<4.3.2.1.in-addr.arpa> for C<ptr4> and C<1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.F.F.ip6.arpa> for C<ptr6>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 reverse_query[m
[31m-[m
[31m-C<syntax: answers, err = r:reverse_query(address)>[m
[31m-[m
[31m-Performs a PTR lookup for both IPv4 and IPv6 addresses. This function is basically a wrapper for the C<query> command[m
[31m-which uses the C<arpa_str> command to convert the IP address on the fly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Constants[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_A[m
[31m-[m
[31m-The C<A> resource record type, equal to the decimal number C<1>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_NS[m
[31m-[m
[31m-The C<NS> resource record type, equal to the decimal number C<2>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_CNAME[m
[31m-[m
[31m-The C<CNAME> resource record type, equal to the decimal number C<5>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_PTR[m
[31m-[m
[31m-The C<PTR> resource record type, equal to the decimal number C<12>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_MX[m
[31m-[m
[31m-The C<MX> resource record type, equal to the decimal number C<15>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_TXT[m
[31m-[m
[31m-The C<TXT> resource record type, equal to the decimal number C<16>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_AAAA[m
[31m-[m
[31m-C<syntax: typ = r.TYPE_AAAA>[m
[31m-[m
[31m-The C<AAAA> resource record type, equal to the decimal number C<28>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_SRV[m
[31m-[m
[31m-C<syntax: typ = r.TYPE_SRV>[m
[31m-[m
[31m-The C<SRV> resource record type, equal to the decimal number C<33>.[m
[31m-[m
[31m-See RFC 2782 for details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TYPE_SPF[m
[31m-[m
[31m-C<syntax: typ = r.TYPE_SPF>[m
[31m-[m
[31m-The C<SPF> resource record type, equal to the decimal number C<99>.[m
[31m-[m
[31m-See RFC 4408 for details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 CLASS_IN[m
[31m-[m
[31m-C<syntax: class = r.CLASS_IN>[m
[31m-[m
[31m-The C<Internet> resource record type, equal to the decimal number C<1>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like set_by_luaI<, log_by_lua>, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.dns.resolver> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.dns.resolver> instance.[m
[31m-You should always initiate C<resty.dns.resolver> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Concurrent (or parallel) query mode[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Better support for other resource record types like C<TLSA>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2016, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-lock-0.04/lua-resty-lock-0.04.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-lock-0.04/lua-resty-lock-0.04.pod[m
[1mdeleted file mode 100644[m
[1mindex c9e7e46..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-lock-0.04/lua-resty-lock-0.04.pod[m
[1m+++ /dev/null[m
[36m@@ -1,504 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-lock - Simple shm-based nonblocking lock API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is still under early development and is production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    # nginx.conf[m
[31m-    [m
[31m-    http {[m
[31m-        # you do not need the following line if you are using the[m
[31m-        #   ngx_openresty bundle:[m
[31m-        lua_package_path "/path/to/lua-resty-lock/lib/?.lua;;";[m
[31m-    [m
[31m-        lua_shared_dict my_locks 100k;[m
[31m-    [m
[31m-        server {[m
[31m-            ...[m
[31m-    [m
[31m-            location = /t {[m
[31m-                content_by_lua '[m
[31m-                    local lock = require "resty.lock"[m
[31m-                    for i = 1, 2 do[m
[31m-                        local lock = lock:new("my_locks")[m
[31m-    [m
[31m-                        local elapsed, err = lock:lock("my_key")[m
[31m-                        ngx.say("lock: ", elapsed, ", ", err)[m
[31m-    [m
[31m-                        local ok, err = lock:unlock()[m
[31m-                        if not ok then[m
[31m-                            ngx.say("failed to unlock: ", err)[m
[31m-                        end[m
[31m-                        ngx.say("unlock: ", ok)[m
[31m-                    end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This library implements a simple mutex lock in a similar way to ngx_proxy module's L<proxy_cache_lock directive|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock>.[m
[31m-[m
[31m-Under the hood, this library uses L<ngx_lua|https://github.com/chaoslawful/lua-nginx-module> module's shared memory dictionaries. The lock waiting is nonblocking because we use stepwise L<ngx.sleep|https://github.com/chaoslawful/lua-nginx-module#ngxsleep> to poll the lock periodically.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-To load this library,[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-you need to specify this library's path in ngx_lua's L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path> directive. For example, C<lua_package_path "/path/to/lua-resty-lock/lib/?.lua;;";>.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-you use C<require> to load the library into a local Lua variable:[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-        local lock = require "resty.lock"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: obj = lock:new(dict_name)>[m
[31m-[m
[31m-C<syntax: obj = lock:new(dict_name, opts)>[m
[31m-[m
[31m-Creates a new lock object instance by specifying the shared dictionary name (created by L<lua_shared_dict|http://https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict>) and an optional options table C<opts>.[m
[31m-[m
[31m-The options table accepts the following options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<exptime>[m
[31m-Specifies expiration time (in seconds) for the lock entry in the shared memory dictionary. You can specify up to C<0.001> seconds. Default to 30 (seconds). Even if the invoker does not call C<unlock> or the object holding the lock is not GC'd, the lock will be released after this time. So deadlock won't happen even when the worker process holding the lock crashes.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timeout>[m
[31m-Specifies the maximal waiting time (in seconds) for the L<lock> method calls on the current object instance. You can specify up to C<0.001> seconds. Default to 5 (seconds). This option value cannot be bigger than C<exptime>. This timeout is to prevent a L<lock> method call from waiting forever.[m
[31m-You can specify C<0> to make the L<lock> method return immediately without waiting if it cannot acquire the lock right away.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<step>[m
[31m-Specifies the initial step (in seconds) of sleeping when waiting for the lock. Default to C<0.001> (seconds). When the L<lock> method is waiting on a busy lock, it sleeps by steps. The step size is increased by a ratio (specified by the C<ratio> option) until reaching the step size limit (specified by the C<max_step> option).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ratio>[m
[31m-Specifies the step increasing ratio. Default to 2, that is, the step size doubles at each waiting iteration.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max_step>[m
[31m-Specifies the maximal step size (i.e., sleep interval, in seconds) allowed. See also the C<step> and C<ratio> options). Default to 0.5 (seconds).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lock[m
[31m-[m
[31m-C<syntax: elapsed, err = obj:lock(key)>[m
[31m-[m
[31m-Tries to lock a key across all the Nginx worker processes in the current Nginx server instance. Different keys are different locks.[m
[31m-[m
[31m-The length of the key string must not be larger than 65535 bytes.[m
[31m-[m
[31m-Returns the waiting time (in seconds) if the lock is successfully acquired. Otherwise returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The waiting time is not from the wallclock, but rather is from simply adding up all the waiting "steps". A nonzero C<elapsed> return value indicates that someone else has just hold this lock. But a zero return value cannot gurantee that no one else has just acquired and released the lock.[m
[31m-[m
[31m-When this method is waiting on fetching the lock, no operating system threads will be blocked and the current Lua "light thread" will be automatically yielded behind the scene.[m
[31m-[m
[31m-It is strongly recommended to always call the L<unlock()> method to actively release the lock as soon as possible.[m
[31m-[m
[31m-If the L<unlock()> method is never called after this method call, the lock will get released when[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-the current C<resty.lock> object instance is collected automatically by the Lua GC.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-the C<exptime> for the lock entry is reached.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Common errors for this method call is[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-"timeout"[m
[31m-: The timeout threshold specified by the C<timeout> option of the L<new> method is exceeded.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-"locked"[m
[31m-: The current C<resty.lock> object instance is already holding a lock (not necessarily of the same key).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Other possible errors are from ngx_lua's shared dictionary API.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 unlock[m
[31m-[m
[31m-C<syntax: ok, err = obj:unlock()>[m
[31m-[m
[31m-Releases the lock held by the current C<resty.lock> object instance.[m
[31m-[m
[31m-Returns C<1> on success. Returns C<nil> and a string describing the error otherwise.[m
[31m-[m
[31m-If you call C<unlock> when no lock is currently held, the error "unlocked" will be returned.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 For Multiple Lua Light Threads[m
[31m-[m
[31m-It is always a bad idea to share a single C<resty.lock> object instance across multiple ngx_lua "light threads" because the object itself is stateful and is vulnerable to race conditions. It is highly recommended to always allocate a separate C<resty.lock> object instance for each "light thread" that needs one.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 For Cache Locks[m
[31m-[m
[31m-One common use case for this library is avoid the so-called "dog-pile effect", that is, to limit concurrent backend queries for the same key when a cache miss happens. This usage is similar to the standard ngx_proxy module's L<proxy_cache_lock|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock> directive.[m
[31m-[m
[31m-The basic workflow for a cache lock is as follows:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Check the cache for a hit with the key. If a cache miss happens, proceed to step 2.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Instantiate a C<resty.lock> object, call the L<lock> method on the key, and check the 1st return value, i.e., the lock waiting time. If it is C<nil>, handle the error; otherwise proceed to step 3.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Check the cache again for a hit. If it is still a miss, proceed to step 4; otherwise release the lock by calling L<unlock> and then return the cached value.[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-Query the backend (the data source) for the value, put the result into the cache, and then release the lock currently held by calling L<unlock>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Below is a kinda complete code example that demonstrates the idea.[m
[31m-[m
[31m-[m
[31m-        local resty_lock = require "resty.lock"[m
[31m-        local cache = ngx.shared.my_cache[m
[31m-    [m
[31m-        -- step 1:[m
[31m-        local val, err = cache:get(key)[m
[31m-        if val then[m
[31m-            ngx.say("result: ", val)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        if err then[m
[31m-            return fail("failed to get key from shm: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        -- cache miss![m
[31m-        -- step 2:[m
[31m-        local lock = resty_lock:new("my_locks")[m
[31m-        local elapsed, err = lock:lock(key)[m
[31m-        if not elapsed then[m
[31m-            return fail("failed to acquire the lock: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        -- lock successfully acquired![m
[31m-    [m
[31m-        -- step 3:[m
[31m-        -- someone might have already put the value into the cache[m
[31m-        -- so we check it here again:[m
[31m-        val, err = cache:get(key)[m
[31m-        if val then[m
[31m-            local ok, err = lock:unlock()[m
[31m-            if not ok then[m
[31m-                return fail("failed to unlock: ", err)[m
[31m-            end[m
[31m-    [m
[31m-            ngx.say("result: ", val)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        --- step 4:[m
[31m-        local val = fetch_redis(key)[m
[31m-        if not val then[m
[31m-            local ok, err = lock:unlock()[m
[31m-            if not ok then[m
[31m-                return fail("failed to unlock: ", err)[m
[31m-            end[m
[31m-    [m
[31m-            -- FIXME: we should handle the backend miss more carefully[m
[31m-            -- here, like inserting a stub value into the cache.[m
[31m-    [m
[31m-            ngx.say("no value found")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        -- update the shm cache with the newly fetched value[m
[31m-        local ok, err = cache:set(key, val, 1)[m
[31m-        if not ok then[m
[31m-            local ok, err = lock:unlock()[m
[31m-            if not ok then[m
[31m-                return fail("failed to unlock: ", err)[m
[31m-            end[m
[31m-    [m
[31m-            return fail("failed to update shm cache: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        local ok, err = lock:unlock()[m
[31m-        if not ok then[m
[31m-            return fail("failed to unlock: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("result: ", val)[m
[31m-[m
[31m-Here we assume that we use the ngx_lua shared memory dictionary to cache the Redis query results and we have the following configurations in C<nginx.conf>:[m
[31m-[m
[31m-[m
[31m-        # you may want to change the dictionary size for your cases.[m
[31m-        lua_shared_dict my_cache 10m;[m
[31m-        lua_shared_dict my_locks 1m;[m
[31m-[m
[31m-The C<my_cache> dictionary is for the data cache while the C<my_locks> dictionary is for C<resty.lock> itself.[m
[31m-[m
[31m-Several important things to note in the example above:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-You need to release the lock as soon as possible, even when some other unrelated errors happen.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-You need to update the cache with the result got from the backend I<before> releasing the lock so other threads already waiting on the lock can get cached value when they get the lock afterwards.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-When the backend returns no value at all, we should handle the case carefully by inserting some stub value into the cache.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Prerequisites[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<LuaJIT|http://luajit.org> 2.0+[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/chaoslawful/lua-nginx-module> 0.8.10+[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is recommended to use the latest L<ngx_openresty bundle|http://openresty.org> directly where this library[m
[31m-is bundled and enabled by default. At least ngx_openresty 1.4.2.9 is required. And you need to enable LuaJIT when building your ngx_openresty[m
[31m-bundle by passing the C<--with-luajit> option to its C<./configure> script. No extra Nginx configuration is required.[m
[31m-[m
[31m-If you want to use this library with your own Nginx build (with ngx_lua), then you need to[m
[31m-ensure you are using at least ngx_lua 0.8.10. Also, You need to configure[m
[31m-the L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path> directive to[m
[31m-add the path of your lua-resty-lock source tree to ngx_lua's Lua module search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-lock/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-and then load the library in Lua:[m
[31m-[m
[31m-[m
[31m-        local lock = require "resty.lock"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-We should simplify the current implementation when LuaJIT 2.1 gets support for C<__gc> metamethod on normal Lua tables. Right now we are using an FFI cdata and a ref/unref memo table to work around this, which is rather ugly and a bit inefficient.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/openresty/lua-resty-lock/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2013-2014, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/chaoslawful/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-lrucache-0.04/lua-resty-lrucache-0.04.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-lrucache-0.04/lua-resty-lrucache-0.04.pod[m
[1mdeleted file mode 100644[m
[1mindex d41c04d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-lrucache-0.04/lua-resty-lrucache-0.04.pod[m
[1m+++ /dev/null[m
[36m@@ -1,348 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-lrucache - in-Lua LRU Cache based on LuaJIT FFI[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is still under active development and is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    -- file myapp.lua: example "myapp" module[m
[31m-    [m
[31m-    local _M = {}[m
[31m-    [m
[31m-    -- alternatively: local lrucache = require "resty.lrucache.pureffi"[m
[31m-    local lrucache = require "resty.lrucache"[m
[31m-    [m
[31m-    -- we need to initialize the cache on the lua module level so that[m
[31m-    -- it can be shared by all the requests served by each nginx worker process:[m
[31m-    local c = lrucache.new(200)  -- allow up to 200 items in the cache[m
[31m-    if not c then[m
[31m-        return error("failed to create the cache: " .. (err or "unknown"))[m
[31m-    end[m
[31m-    [m
[31m-    function _M.go()[m
[31m-        c:set("dog", 32)[m
[31m-        c:set("cat", 56)[m
[31m-        ngx.say("dog: ", c:get("dog"))[m
[31m-        ngx.say("cat: ", c:get("cat"))[m
[31m-    [m
[31m-        c:set("dog", { age = 10 }, 0.1)  -- expire in 0.1 sec[m
[31m-        c:delete("dog")[m
[31m-    end[m
[31m-    [m
[31m-    return _M[m
[31m-[m
[31m-[m
[31m-    # nginx.conf[m
[31m-    [m
[31m-    http {[m
[31m-        lua_package_path "/path/to/lua-resty-lrucache/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            listen 8080;[m
[31m-    [m
[31m-            location = /t {[m
[31m-                content_by_lua '[m
[31m-                    require("myapp").go()[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This library implements a simple LRU cache for L<OpenResty|http://openresty.org> and the L<ngx_lua|https://github.com/chaoslawful/lua-nginx-module> module.[m
[31m-[m
[31m-This cache also supports expiration time.[m
[31m-[m
[31m-The LRU cache resides completely in the Lua VM and is subject to Lua GC. So do not expect[m
[31m-it to get shared across the OS process boundary. The upside is that you can cache[m
[31m-arbitrary complex Lua values (like deep nested Lua tables) without the overhead of[m
[31m-serialization (as with C<ngx_lua>'s[m
[31m-L<shared dictionary API|https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict>).[m
[31m-The downside is that your cache is always limited to the current OS process[m
[31m-(like the current nginx worker process). It does not really make much sense to use this[m
[31m-library in the context of L<init_by_lua|https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict>[m
[31m-because the cache will not get shared by any of the worker processes[m
[31m-(unless you just want to "warm up" the cache with predefined items which will get[m
[31m-inherited by the workers via C<fork>).[m
[31m-[m
[31m-There are two different implementations included in this library, in the form of[m
[31m-two classes: C<resty.lrucache> and C<resty.lrucache.pureffi>. They share exactly the same API. The only difference is that the latter[m
[31m-is a pure FFI implementation that also implements an FFI-based hash table[m
[31m-for the cache lookup while the former uses native Lua tables for it.[m
[31m-[m
[31m-If the cache hit rate is relatively high, you should use the C<resty.lrucache> class which is faster than C<resty.lrucache.pureffi>.[m
[31m-[m
[31m-But if the cache hit rate is relatively low and there can be a I<lot> of[m
[31m-variations of keys inserted into and removed from the cache, then you should use the C<resty.lrucache.pureffi> instead, because[m
[31m-Lua tables are not good at removing keys frequently by design and you[m
[31m-would see the C<resizetab> function call in the LuaJIT runtime being very hot in[m
[31m-L<on-CPU flame graphs|https://github.com/openresty/stapxx#lj-lua-stacks> if[m
[31m-you use the C<resty.lrucache> class instead of C<resty.lrucache.pureffi> in this use case.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-To load this library,[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-you need to specify this library's path in ngx_lua's L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path> directive. For example, C<lua_package_path "/path/to/lua-resty-lrucache/lib/?.lua;;";>.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-you use C<require> to load the library into a local Lua variable:[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-        local lrucache = require "resty.lrucache"[m
[31m-[m
[31m-or[m
[31m-[m
[31m-[m
[31m-        local lrucache = require "resty.lrucache.pureffi"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: cache, err = lrucache.new(max_items [, load_factor])>[m
[31m-[m
[31m-Creates a new cache instance. If failed, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-The C<max_items> argument specifies the maximal number of items held in the cache.[m
[31m-[m
[31m-The C<load-factor> argument designates the "load factor" of the FFI-based hash-table used internally by C<resty.lrucache.pureffi>;[m
[31m-the default value is 0.5 (i.e. 50%); if the load factor is specified, it will be clamped[m
[31m-to the range of C<[0.1, 1]> (i.e. if load factor is greater than 1, it will be saturated to[m
[31m-1; likewise, if load-factor is smaller than C<0.1>, it will be clamped to C<0.1>). This argument is only meaningful for C<resty.lrucache.pureffi>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set[m
[31m-[m
[31m-C<syntax: cache:set(key, value, ttl)>[m
[31m-[m
[31m-Sets a key with a value and an expiration time.[m
[31m-[m
[31m-The C<ttl> argument specifies the expiration time period. The time value is in seconds, but you can also specify the fraction number part, like C<0.25>. A nil C<ttl> argument value means never expired (which is the default).[m
[31m-[m
[31m-When the cache is full, the cache will automatically evict the least recently used item.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get[m
[31m-[m
[31m-C<syntax: data, stale_data = cache:get(key)>[m
[31m-[m
[31m-Fetches a value with the key. If the key does not exist in the cache or has already expired, a C<nil> value will be returned.[m
[31m-[m
[31m-Starting from C<v0.03>, the stale data is also returned as the second return value if available.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 delete[m
[31m-[m
[31m-C<syntax: cache:delete(key)>[m
[31m-[m
[31m-Removes an item specified by the key from the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Prerequisites[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<LuaJIT|http://luajit.org> 2.0+[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua|https://github.com/chaoslawful/lua-nginx-module> 0.8.10+[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is recommended to use the latest L<ngx_openresty bundle|http://openresty.org> directly. At least ngx_openresty 1.4.2.9 is required. And you need to enable LuaJIT when building your ngx_openresty[m
[31m-bundle by passing the C<--with-luajit> option to its C<./configure> script. No extra Nginx configuration is required.[m
[31m-[m
[31m-If you want to use this library with your own Nginx build (with ngx_lua), then you need to[m
[31m-ensure you are using at least ngx_lua 0.8.10.[m
[31m-[m
[31m-Also, You need to configure[m
[31m-the L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path> directive to[m
[31m-add the path of your lua-resty-lrucache source tree to ngx_lua's Lua module search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-lrucache/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-and then load the library in Lua:[m
[31m-[m
[31m-[m
[31m-        local lrucache = require "resty.lrucache"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add new method C<get_stale> for fetching already expired items.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add new method C<flush_all> for flushing out everything in the cache.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/agentzh/lua-resty-lrucache/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-Shuxin Yang, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2014-2015, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-Copyright (C) 2014-2015, by Shuxin Yang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/chaoslawful/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-memcached-0.14/lua-resty-memcached-0.14.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-memcached-0.14/lua-resty-memcached-0.14.pod[m
[1mdeleted file mode 100644[m
[1mindex 47c9f7e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-memcached-0.14/lua-resty-memcached-0.14.pod[m
[1m+++ /dev/null[m
[36m@@ -1,617 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-memcached - Lua memcached client driver for the ngx_lua based on the cosocket API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library is a memcached client driver for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.5.0rc29|https://github.com/chaoslawful/lua-nginx-module/tags> or L<OpenResty 1.0.15.7|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        lua_package_path "/path/to/lua-resty-memcached/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location /test {[m
[31m-                content_by_lua '[m
[31m-                    local memcached = require "resty.memcached"[m
[31m-                    local memc, err = memcached:new()[m
[31m-                    if not memc then[m
[31m-                        ngx.say("failed to instantiate memc: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    memc:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-                    -- or connect to a unix domain socket file listened[m
[31m-                    -- by a memcached server:[m
[31m-                    --     local ok, err = memc:connect("unix:/path/to/memc.sock")[m
[31m-    [m
[31m-                    local ok, err = memc:connect("127.0.0.1", 11211)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to connect: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local ok, err = memc:flush_all()[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to flush all: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local ok, err = memc:set("dog", 32)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to set dog: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local res, flags, err = memc:get("dog")[m
[31m-                    if err then[m
[31m-                        ngx.say("failed to get dog: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    if not res then[m
[31m-                        ngx.say("dog not found")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("dog: ", res)[m
[31m-    [m
[31m-                    -- put it into the connection pool of size 100,[m
[31m-                    -- with 10 seconds max idle timeout[m
[31m-                    local ok, err = memc:set_keepalive(10000, 100)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("cannot set keepalive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    -- or just close the connection right away:[m
[31m-                    -- local ok, err = memc:close()[m
[31m-                    -- if not ok then[m
[31m-                    --     ngx.say("failed to close: ", err)[m
[31m-                    --     return[m
[31m-                    -- end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-The C<key> argument provided in the following methods will be automatically escaped according to the URI escaping rules before sending to the memcached server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: memc, err = memcached:new(opts?)>[m
[31m-[m
[31m-Creates a memcached object. In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-It accepts an optional C<opts> table argument. The following options are supported:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<key_transform>[m
[31m-[m
[31m-an array table containing two functions for escaping and unescaping the[m
[31m-memcached keys, respectively. By default,[m
[31m-the memcached keys will be escaped and unescaped as URI components, that is[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-        memached:new{[m
[31m-            key_transform = { ngx.escape_uri, ngx.unescape_uri }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 connect[m
[31m-[m
[31m-C<syntax: ok, err = memc:connect(host, port)>[m
[31m-[m
[31m-C<syntax: ok, err = memc:connect("unix:/path/to/unix.sock")>[m
[31m-[m
[31m-Attempts to connect to the remote host and port that the memcached server is listening to or a local unix domain socket file listened by the memcached server.[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set[m
[31m-[m
[31m-C<syntax: ok, err = memc:set(key, value, exptime, flags)>[m
[31m-[m
[31m-Inserts an entry into memcached unconditionally. If the key already exists, overrides it.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:set("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:set("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_timeout[m
[31m-[m
[31m-C<syntax: ok, err = memc:set_timeout(time)>[m
[31m-[m
[31m-Sets the timeout (in ms) protection for subsequent operations, including the C<connect> method.[m
[31m-[m
[31m-Returns 1 when successful and nil plus a string describing the error otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_keepalive[m
[31m-[m
[31m-C<syntax: ok, err = memc:set_keepalive(max_idle_timeout, pool_size)>[m
[31m-[m
[31m-Puts the current memcached connection immediately into the ngx_lua cosocket connection pool.[m
[31m-[m
[31m-You can specify the max idle timeout (in ms) when the connection is in the pool and the maximal size of the pool every nginx worker process.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-Only call this method in the place you would have called the C<close> method instead. Calling this method will immediately turn the current memcached object into the C<closed> state. Any subsequent operations other than C<connect()> on the current objet will return the C<closed> error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_reused_times[m
[31m-[m
[31m-C<syntax: times, err = memc:get_reused_times()>[m
[31m-[m
[31m-This method returns the (successfully) reused times for the current connection. In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-If the current connection does not come from the built-in connection pool, then this method always returns C<0>, that is, the connection has never been reused (yet). If the connection comes from the connection pool, then the return value is always non-zero. So this method can also be used to determine if the current connection comes from the pool.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 close[m
[31m-[m
[31m-C<syntax: ok, err = memc:close()>[m
[31m-[m
[31m-Closes the current memcached connection and returns the status.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 add[m
[31m-[m
[31m-C<syntax: ok, err = memc:add(key, value, exptime, flags)>[m
[31m-[m
[31m-Inserts an entry into memcached if and only if the key does not exist.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:add("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:add("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 replace[m
[31m-[m
[31m-C<syntax: ok, err = memc:replace(key, value, exptime, flags)>[m
[31m-[m
[31m-Inserts an entry into memcached if and only if the key does exist.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:replace("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:replace("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 append[m
[31m-[m
[31m-C<syntax: ok, err = memc:append(key, value, exptime, flags)>[m
[31m-[m
[31m-Appends the value to an entry with the same key that already exists in memcached.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:append("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:append("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 prepend[m
[31m-[m
[31m-C<syntax: ok, err = memc:prepend(key, value, exptime, flags)>[m
[31m-[m
[31m-Prepends the value to an entry with the same key that already exists in memcached.[m
[31m-[m
[31m-The C<value> argument could also be a Lua table holding multiple Lua[m
[31m-strings that are supposed to be concatenated as a whole[m
[31m-(without any delimiters). For example,[m
[31m-[m
[31m-[m
[31m-        memc:prepend("dog", {"a ", {"kind of"}, " animal"})[m
[31m-[m
[31m-is functionally equivalent to[m
[31m-[m
[31m-[m
[31m-        memc:prepend("dog", "a kind of animal")[m
[31m-[m
[31m-The C<exptime> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-The C<flags> parameter is optional, defaults to C<0>.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get[m
[31m-[m
[31m-C<syntax: value, flags, err = memc:get(key)>[m
[31m-C<syntax: results, err = memc:get(keys)>[m
[31m-[m
[31m-Get a single entry or multiple entries in the memcached server via a single key or a talbe of keys.[m
[31m-[m
[31m-Let us first discuss the case When the key is a single string.[m
[31m-[m
[31m-The key's value and associated flags value will be returned if the entry is found and no error happens.[m
[31m-[m
[31m-In case of errors, C<nil> values will be turned for C<value> and C<flags> and a 3rd (string) value will also be returned for describing the error.[m
[31m-[m
[31m-If the entry is not found, then three C<nil> values will be returned.[m
[31m-[m
[31m-Then let us discuss the case when the a Lua table of multiple keys are provided.[m
[31m-[m
[31m-In this case, a Lua table holding the key-result pairs will be always returned in case of success. Each value corresponding each key in the table is also a table holding two values, the key's value and the key's flags. If a key does not exist, then there is no responding entries in the C<results> table.[m
[31m-[m
[31m-In case of errors, C<nil> will be returned, and the second return value will be a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gets[m
[31m-[m
[31m-C<syntax: value, flags, cas_unique, err = memc:gets(key)>[m
[31m-[m
[31m-C<syntax: results, err = memc:gets(keys)>[m
[31m-[m
[31m-Just like the C<get> method, but will also return the CAS unique value associated with the entry in addition to the key's value and flags.[m
[31m-[m
[31m-This method is usually used together with the C<cas> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 cas[m
[31m-[m
[31m-C<syntax: ok, err = memc:cas(key, value, cas_unique, exptime?, flags?)>[m
[31m-[m
[31m-Just like the C<set> method but does a check and set operation, which means "store this data but[m
[31m-only if no one else has updated since I last fetched it."[m
[31m-[m
[31m-The C<cas_unique> argument can be obtained from the C<gets> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 touch[m
[31m-[m
[31m-C<syntax: ok, err = memc:touch(key, exptime)>[m
[31m-[m
[31m-Update the expiration time of an existing key.[m
[31m-[m
[31m-Returns C<1> for success or C<nil> with a string describing the error otherwise.[m
[31m-[m
[31m-This method was first introduced in the C<v0.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 flush_all[m
[31m-[m
[31m-C<syntax: ok, err = memc:flush_all(time?)>[m
[31m-[m
[31m-Flushes (or invalidates) all the existing entries in the memcached server immediately (by default) or after the expiration[m
[31m-specified by the C<time> argument (in seconds).[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 delete[m
[31m-[m
[31m-C<syntax: ok, err = memc:delete(key)>[m
[31m-[m
[31m-Deletes the key from memcached immediately.[m
[31m-[m
[31m-The key to be deleted must already exist in memcached.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 incr[m
[31m-[m
[31m-C<syntax: new_value, err = memc:incr(key, delta)>[m
[31m-[m
[31m-Increments the value of the specified key by the integer value specified in the C<delta> argument.[m
[31m-[m
[31m-Returns the new value after incrementation in success, and C<nil> with a string describing the error in case of failures.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 decr[m
[31m-[m
[31m-C<syntax: new_value, err = memc:decr(key, value)>[m
[31m-[m
[31m-Decrements the value of the specified key by the integer value specified in the C<delta> argument.[m
[31m-[m
[31m-Returns the new value after decrementation in success, and C<nil> with a string describing the error in case of failures.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 stats[m
[31m-[m
[31m-C<syntax: lines, err = memc:stats(args?)>[m
[31m-[m
[31m-Returns memcached server statistics information with an optional C<args> argument.[m
[31m-[m
[31m-In case of success, this method returns a lua table holding all of the lines of the output; in case of failures, it returns C<nil> with a string describing the error.[m
[31m-[m
[31m-If the C<args> argument is omitted, general server statistics is returned. Possible C<args> argument values are C<items>, C<sizes>, C<slabs>, among others.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 version[m
[31m-[m
[31m-C<syntax: version, err = memc:version(args?)>[m
[31m-[m
[31m-Returns the server version number, like C<1.2.8>.[m
[31m-[m
[31m-In case of error, it returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 quit[m
[31m-[m
[31m-C<syntax: ok, err = memc:quit()>[m
[31m-[m
[31m-Tells the server to close the current memcached connection.[m
[31m-[m
[31m-Returns C<1> in case of success and C<nil> other wise. In case of failures, another string value will also be returned to describe the error.[m
[31m-[m
[31m-Generally you can just directly call the C<close> method to achieve the same effect.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 verbosity[m
[31m-[m
[31m-C<syntax: ok, err = memc:verbosity(level)>[m
[31m-[m
[31m-Sets the verbosity level used by the memcached server. The C<level> argument should be given integers only.[m
[31m-[m
[31m-Returns C<1> in case of success and C<nil> other wise. In case of failures, another string value will also be returned to describe the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like set_by_luaI<, log_by_lua>, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.memcached> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.memcached> instance.[m
[31m-You should always initiate C<resty.memcached> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the memcached pipelining API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the UDP part of the memcached ascii protocol.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2016, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the memcached wired protocol specification: http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-mysql-0.16/lua-resty-mysql-0.16.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-mysql-0.16/lua-resty-mysql-0.16.pod[m
[1mdeleted file mode 100644[m
[1mindex 9574f61..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-mysql-0.16/lua-resty-mysql-0.16.pod[m
[1m+++ /dev/null[m
[36m@@ -1,673 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-mysql - Lua MySQL client driver for ngx_lua based on the cosocket API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library is a MySQL client driver for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.9.11|https://github.com/chaoslawful/lua-nginx-module/tags> or L<ngx_openresty 1.7.4.1|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-Also, the L<bit library|http://bitop.luajit.org/> is also required. If you're using LuaJIT 2.0 with ngx_lua, then the C<bit> library is already available by default.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        # you do not need the following line if you are using[m
[31m-        # the ngx_openresty bundle:[m
[31m-        lua_package_path "/path/to/lua-resty-mysql/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location /test {[m
[31m-                content_by_lua '[m
[31m-                    local mysql = require "resty.mysql"[m
[31m-                    local db, err = mysql:new()[m
[31m-                    if not db then[m
[31m-                        ngx.say("failed to instantiate mysql: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    db:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-                    -- or connect to a unix domain socket file listened[m
[31m-                    -- by a mysql server:[m
[31m-                    --     local ok, err, errno, sqlstate =[m
[31m-                    --           db:connect{[m
[31m-                    --              path = "/path/to/mysql.sock",[m
[31m-                    --              database = "ngx_test",[m
[31m-                    --              user = "ngx_test",[m
[31m-                    --              password = "ngx_test" }[m
[31m-    [m
[31m-                    local ok, err, errno, sqlstate = db:connect{[m
[31m-                        host = "127.0.0.1",[m
[31m-                        port = 3306,[m
[31m-                        database = "ngx_test",[m
[31m-                        user = "ngx_test",[m
[31m-                        password = "ngx_test",[m
[31m-                        max_packet_size = 1024 * 1024 }[m
[31m-    [m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("connected to mysql.")[m
[31m-    [m
[31m-                    local res, err, errno, sqlstate =[m
[31m-                        db:query("drop table if exists cats")[m
[31m-                    if not res then[m
[31m-                        ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    res, err, errno, sqlstate =[m
[31m-                        db:query("create table cats "[m
[31m-                                 .. "(id serial primary key, "[m
[31m-                                 .. "name varchar(5))")[m
[31m-                    if not res then[m
[31m-                        ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("table cats created.")[m
[31m-    [m
[31m-                    res, err, errno, sqlstate =[m
[31m-                        db:query("insert into cats (name) "[m
[31m-                                 .. "values (\'Bob\'),(\'\'),(null)")[m
[31m-                    if not res then[m
[31m-                        ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say(res.affected_rows, " rows inserted into table cats ",[m
[31m-                            "(last insert id: ", res.insert_id, ")")[m
[31m-    [m
[31m-                    -- run a select query, expected about 10 rows in[m
[31m-                    -- the result set:[m
[31m-                    res, err, errno, sqlstate =[m
[31m-                        db:query("select * from cats order by id asc", 10)[m
[31m-                    if not res then[m
[31m-                        ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    local cjson = require "cjson"[m
[31m-                    ngx.say("result: ", cjson.encode(res))[m
[31m-    [m
[31m-                    -- put it into the connection pool of size 100,[m
[31m-                    -- with 10 seconds max idle timeout[m
[31m-                    local ok, err = db:set_keepalive(10000, 100)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to set keepalive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    -- or just close the connection right away:[m
[31m-                    -- local ok, err = db:close()[m
[31m-                    -- if not ok then[m
[31m-                    --     ngx.say("failed to close: ", err)[m
[31m-                    --     return[m
[31m-                    -- end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: db, err = mysql:new()>[m
[31m-[m
[31m-Creates a MySQL connection object. In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 connect[m
[31m-[m
[31m-C<syntax: ok, err = db:connect(options)>[m
[31m-[m
[31m-Attempts to connect to the remote MySQL server.[m
[31m-[m
[31m-The C<options> argument is a Lua table holding the following keys:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<host>[m
[31m-[m
[31m-the host name for the MySQL server.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<port>[m
[31m-[m
[31m-the port that the MySQL server is listening on. Default to 3306.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<path>[m
[31m-[m
[31m-the path of the unix socket file listened by the MySQL server.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<database>[m
[31m-[m
[31m-the MySQL database name.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<user>[m
[31m-[m
[31m-MySQL account name for login.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<password>[m
[31m-[m
[31m-MySQL account password for login (in clear text).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max_packet_size>[m
[31m-[m
[31m-the upper limit for the reply packets sent from the MySQL server (default to 1MB).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ssl>[m
[31m-[m
[31m-If set to C<true>, then uses SSL to connect to MySQL (default to C<false>). If the MySQL[m
[31m-server does not have SSL support[m
[31m-(or just disabled), the error string "ssl disabled on server" will be returned.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ssl_verify>[m
[31m-[m
[31m-If set to C<true>, then verifies the validity of the server SSL certificate (default to C<false>).[m
[31m-Note that you need to configure the L<lua_ssl_trusted_certificate|https://github.com/openresty/lua-nginx-module#lua_ssl_trusted_certificate>[m
[31m-to specify the CA (or server) certificate used by your MySQL server. You may also[m
[31m-need to configure L<lua_ssl_verify_depth|https://github.com/openresty/lua-nginx-module#lua_ssl_verify_depth>[m
[31m-accordingly.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pool>[m
[31m-[m
[31m-the name for the MySQL connection pool. if omitted, an ambiguous pool name will be generated automatically with the string template C<user:database:host:port> or C<user:database:path>. (this option was first introduced in C<v0.08>.)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<compact_arrays>[m
[31m-[m
[31m-when this option is set to true, then the L<query> and L<read_result> methods will return the array-of-arrays structure for the resultset, rather than the default array-of-hashes structure.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_timeout[m
[31m-[m
[31m-C<syntax: db:set_timeout(time)>[m
[31m-[m
[31m-Sets the timeout (in ms) protection for subsequent operations, including the C<connect> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_keepalive[m
[31m-[m
[31m-C<syntax: ok, err = db:set_keepalive(max_idle_timeout, pool_size)>[m
[31m-[m
[31m-Puts the current MySQL connection immediately into the ngx_lua cosocket connection pool.[m
[31m-[m
[31m-You can specify the max idle timeout (in ms) when the connection is in the pool and the maximal size of the pool every nginx worker process.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-Only call this method in the place you would have called the C<close> method instead. Calling this method will immediately turn the current C<resty.mysql> object into the C<closed> state. Any subsequent operations other than C<connect()> on the current objet will return the C<closed> error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_reused_times[m
[31m-[m
[31m-C<syntax: times, err = db:get_reused_times()>[m
[31m-[m
[31m-This method returns the (successfully) reused times for the current connection. In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-If the current connection does not come from the built-in connection pool, then this method always returns C<0>, that is, the connection has never been reused (yet). If the connection comes from the connection pool, then the return value is always non-zero. So this method can also be used to determine if the current connection comes from the pool.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 close[m
[31m-[m
[31m-C<syntax: ok, err = db:close()>[m
[31m-[m
[31m-Closes the current mysql connection and returns the status.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 send_query[m
[31m-[m
[31m-C<syntax: bytes, err = db:send_query(query)>[m
[31m-[m
[31m-Sends the query to the remote MySQL server without waiting for its replies.[m
[31m-[m
[31m-Returns the bytes successfully sent out in success and otherwise returns C<nil> and a string describing the error.[m
[31m-[m
[31m-You should use the L<read_result> method to read the MySQL replies afterwards.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 read_result[m
[31m-[m
[31m-C<syntax: res, err, errno, sqlstate = db:read_result()>[m
[31m-[m
[31m-C<syntax: res, err, errno, sqlstate = db:read_result(nrows)>[m
[31m-[m
[31m-Reads in one result returned from the MySQL server.[m
[31m-[m
[31m-It returns a Lua table (C<res>) describing the MySQL C<OK packet> or C<result set packet> for the query result.[m
[31m-[m
[31m-For queries corresponding to a result set, it returns an array holding all the rows. Each row holds key-value apirs for each data fields. For instance,[m
[31m-[m
[31m-[m
[31m-        {[m
[31m-            { name = "Bob", age = 32, phone = ngx.null },[m
[31m-            { name = "Marry", age = 18, phone = "10666372"}[m
[31m-        }[m
[31m-[m
[31m-For queries that do not correspond to a result set, it returns a Lua table like this:[m
[31m-[m
[31m-[m
[31m-        {[m
[31m-            insert_id = 0,[m
[31m-            server_status = 2,[m
[31m-            warning_count = 1,[m
[31m-            affected_rows = 32,[m
[31m-            message = nil[m
[31m-        }[m
[31m-[m
[31m-If more results are following the current result, a second C<err> return value will be given the string C<again>. One should always check this (second) return value and if it is C<again>, then she should call this method again to retrieve more results. This usually happens when the original query contains multiple statements (separated by semicolon in the same query string) or calling a MySQL procedure. See also L<Multi-Resultset Support>.[m
[31m-[m
[31m-In case of errors, this method returns at most 4 values: C<nil>, C<err>, C<errcode>, and C<sqlstate>. The C<err> return value contains a string describing the error, the C<errcode> return value holds the MySQL error code (a numerical value), and finally, the C<sqlstate> return value contains the standard SQL error code that consists of 5 characters. Note that, the C<errcode> and C<sqlstate> might be C<nil> if MySQL does not return them.[m
[31m-[m
[31m-The optional argument C<nrows> can be used to specify an approximate number of rows for the result set. This value can be used[m
[31m-to pre-allocate space in the resulting Lua table for the result set. By default, it takes the value 4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 query[m
[31m-[m
[31m-C<syntax: res, err, errcode, sqlstate = db:query(query)>[m
[31m-[m
[31m-C<syntax: res, err, errcode, sqlstate = db:query(query, nrows)>[m
[31m-[m
[31m-This is a shortcut for combining the L<send_query> call and the first L<read_result> call.[m
[31m-[m
[31m-You should always check if the C<err> return value  is C<again> in case of success because this method will only call L<read_result> only once for you. See also L<Multi-Resultset Support>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_ver[m
[31m-[m
[31m-C<syntax: str = db:server_ver()>[m
[31m-[m
[31m-Returns the MySQL server version string, like C<"5.1.64">.[m
[31m-[m
[31m-You should only call this method after successfully connecting to a MySQL server, otherwise C<nil> will be returned.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_compact_arrays[m
[31m-[m
[31m-C<syntax: db:set_compact_arrays(boolean)>[m
[31m-[m
[31m-Sets whether to use the "compact-arrays" structure for the resultsets returned by subsequent queries. See the C<compact_arrays> option for the C<connect> method for more details.[m
[31m-[m
[31m-This method was first introduced in the C<v0.09> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SQL Literal Quoting[m
[31m-[m
[31m-It is always important to quote SQL literals properly to prevent SQL injection attacks. You can use the[m
[31m-L<ngx.quote_sql_str|http://wiki.nginx.org/HttpLuaModule#ngx.quote_sql_str> function provided by ngx_lua to quote values.[m
[31m-Here is an example:[m
[31m-[m
[31m-[m
[31m-        local name = ngx.unescape_uri(ngx.var.arg_name)[m
[31m-        local quoted_name = ngx.quote_sql_str(name)[m
[31m-        local sql = "select * from users where name = " .. quoted_name[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Multi-Resultset Support[m
[31m-[m
[31m-For a SQL query that produces multiple result-sets, it is always your duty to check the "again" error message returned by the L<query> or L<read_result> method calls, and keep pulling more result sets by calling the L<read_result> method until no "again" error message returned (or some other errors happen).[m
[31m-[m
[31m-Below is a trivial example for this:[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        local mysql = require "resty.mysql"[m
[31m-    [m
[31m-        local db = mysql:new()[m
[31m-        local ok, err, errno, sqlstate = db:connect({[m
[31m-            host = "127.0.0.1",[m
[31m-            port = 3306,[m
[31m-            database = "world",[m
[31m-            user = "monty",[m
[31m-            password = "pass"})[m
[31m-    [m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errno, " ", sqlstate)[m
[31m-            return ngx.exit(500)[m
[31m-        end[m
[31m-    [m
[31m-        res, err, errno, sqlstate = db:query("select 1; select 2; select 3;")[m
[31m-        if not res then[m
[31m-            ngx.log(ngx.ERR, "bad result #1: ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-            return ngx.exit(500)[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("result #1: ", cjson.encode(res))[m
[31m-    [m
[31m-        local i = 2[m
[31m-        while err == "again" do[m
[31m-            res, err, errno, sqlstate = db:read_result()[m
[31m-            if not res then[m
[31m-                ngx.log(ngx.ERR, "bad result #", i, ": ", err, ": ", errno, ": ", sqlstate, ".")[m
[31m-                return ngx.exit(500)[m
[31m-            end[m
[31m-    [m
[31m-            ngx.say("result #", i, ": ", cjson.encode(res))[m
[31m-            i = i + 1[m
[31m-        end[m
[31m-    [m
[31m-        local ok, err = db:set_keepalive(10000, 50)[m
[31m-        if not ok then[m
[31m-            ngx.log(ngx.ERR, "failed to set keepalive: ", err)[m
[31m-            ngx.exit(500)[m
[31m-        end[m
[31m-[m
[31m-This code snippet will produce the following response body data:[m
[31m-[m
[31m-    result #1: [{"1":"1"}][m
[31m-    result #2: [{"2":"2"}][m
[31m-    result #3: [{"3":"3"}][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Debugging[m
[31m-[m
[31m-It is usually convenient to use the L<lua-cjson|http://www.kyne.com.au/~mark/software/lua-cjson.php> library to encode the return values of the MySQL query methods to JSON. For example,[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        ...[m
[31m-        local res, err, errcode, sqlstate = db:query("select * from cats")[m
[31m-        if res then[m
[31m-            print("res: ", cjson.encode(res))[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like init_by_luaI<, set_by_lua>, log_by_lua*, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.mysql> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.mysql> instance.[m
[31m-You should always initiate C<resty.mysql> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-If you are using the ngx_openresty bundle (http://openresty.org ), then[m
[31m-you do not need to do anything because it already includes and enables[m
[31m-lua-resty-mysql by default. And you can just use it in your Lua code,[m
[31m-as in[m
[31m-[m
[31m-[m
[31m-        local mysql = require "resty.mysql"[m
[31m-        ...[m
[31m-[m
[31m-If you are using your own nginx + ngx_lua build, then you need to configure[m
[31m-the lua_package_path directive to add the path of your lua-resty-mysql source[m
[31m-tree to ngx_lua's LUA_PATH search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-mysql/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-Ensure that the system account running your Nginx ''worker'' proceses have[m
[31m-enough permission to read the C<.lua> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/agentzh/lua-resty-mysql/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community|http://wiki.nginx.org/HttpLuaModule#Community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-improve the MySQL connection pool support.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the MySQL binary row data packets.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement MySQL's old pre-4.0 authentication method.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement MySQL server prepare and execute packets.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-implement the data compression support in the protocol.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2013, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the MySQL wired protocol specification: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_drizzle module: http://wiki.nginx.org/HttpDrizzleModule[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-redis-0.24/lua-resty-redis-0.24.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-redis-0.24/lua-resty-redis-0.24.pod[m
[1mdeleted file mode 100644[m
[1mindex 7eb01c5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-redis-0.24/lua-resty-redis-0.24.pod[m
[1m+++ /dev/null[m
[36m@@ -1,753 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-redis - Lua redis client driver for the ngx_lua based on the cosocket API[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library is a Redis client driver for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.5.14|https://github.com/chaoslawful/lua-nginx-module/tags> or L<OpenResty 1.2.1.14|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        # you do not need the following line if you are using[m
[31m-        # the OpenResty bundle:[m
[31m-        lua_package_path "/path/to/lua-resty-redis/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location /test {[m
[31m-                content_by_lua '[m
[31m-                    local redis = require "resty.redis"[m
[31m-                    local red = redis:new()[m
[31m-    [m
[31m-                    red:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-                    -- or connect to a unix domain socket file listened[m
[31m-                    -- by a redis server:[m
[31m-                    --     local ok, err = red:connect("unix:/path/to/redis.sock")[m
[31m-    [m
[31m-                    local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to connect: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ok, err = red:set("dog", "an animal")[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to set dog: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("set result: ", ok)[m
[31m-    [m
[31m-                    local res, err = red:get("dog")[m
[31m-                    if not res then[m
[31m-                        ngx.say("failed to get dog: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    if res == ngx.null then[m
[31m-                        ngx.say("dog not found.")[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    ngx.say("dog: ", res)[m
[31m-    [m
[31m-                    red:init_pipeline()[m
[31m-                    red:set("cat", "Marry")[m
[31m-                    red:set("horse", "Bob")[m
[31m-                    red:get("cat")[m
[31m-                    red:get("horse")[m
[31m-                    local results, err = red:commit_pipeline()[m
[31m-                    if not results then[m
[31m-                        ngx.say("failed to commit the pipelined requests: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    for i, res in ipairs(results) do[m
[31m-                        if type(res) == "table" then[m
[31m-                            if res[1] == false then[m
[31m-                                ngx.say("failed to run command ", i, ": ", res[2])[m
[31m-                            else[m
[31m-                                -- process the table value[m
[31m-                            end[m
[31m-                        else[m
[31m-                            -- process the scalar value[m
[31m-                        end[m
[31m-                    end[m
[31m-    [m
[31m-                    -- put it into the connection pool of size 100,[m
[31m-                    -- with 10 seconds max idle time[m
[31m-                    local ok, err = red:set_keepalive(10000, 100)[m
[31m-                    if not ok then[m
[31m-                        ngx.say("failed to set keepalive: ", err)[m
[31m-                        return[m
[31m-                    end[m
[31m-    [m
[31m-                    -- or just close the connection right away:[m
[31m-                    -- local ok, err = red:close()[m
[31m-                    -- if not ok then[m
[31m-                    --     ngx.say("failed to close: ", err)[m
[31m-                    --     return[m
[31m-                    -- end[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-All of the Redis commands have their own methods with the same name except all in lower case.[m
[31m-[m
[31m-You can find the complete list of Redis commands here:[m
[31m-[m
[31m-http://redis.io/commands[m
[31m-[m
[31m-You need to check out this Redis command reference to see what Redis command accepts what arguments.[m
[31m-[m
[31m-The Redis command arguments can be directly fed into the corresponding method call. For example, the "GET" redis command accepts a single key argument, then you can just call the "get" method like this:[m
[31m-[m
[31m-[m
[31m-        local res, err = red:get("key")[m
[31m-[m
[31m-Similarly, the "LRANGE" redis command accepts threee arguments, then you should call the "lrange" method like this:[m
[31m-[m
[31m-[m
[31m-        local res, err = red:lrange("nokey", 0, 1)[m
[31m-[m
[31m-For example, "SET", "GET", "LRANGE", and "BLPOP" commands correspond to the methods "set", "get", "lrange", and "blpop".[m
[31m-[m
[31m-Here are some more examples:[m
[31m-[m
[31m-[m
[31m-        -- HMGET myhash field1 field2 nofield[m
[31m-        local res, err = red:hmget("myhash", "field1", "field2", "nofield")[m
[31m-[m
[31m-[m
[31m-        -- HMSET myhash field1 "Hello" field2 "World"[m
[31m-        local res, err = red:hmset("myhash", "field1", "Hello", "field2", "World")[m
[31m-[m
[31m-All these command methods returns a single result in success and C<nil> otherwise. In case of errors or failures, it will also return a second value which is a string describing the error.[m
[31m-[m
[31m-A Redis "status reply" results in a string typed return value with the "+" prefix stripped.[m
[31m-[m
[31m-A Redis "integer reply" results in a Lua number typed return value.[m
[31m-[m
[31m-A Redis "error reply" results in a C<false> value I<and> a string describing the error.[m
[31m-[m
[31m-A non-nil Redis "bulk reply" results in a Lua string as the return value. A nil bulk reply results in a C<ngx.null> return value.[m
[31m-[m
[31m-A non-nil Redis "multi-bulk reply" results in a Lua table holding all the composing values (if any). If any of the composing value is a valid redis error value, then it will be a two element table C<{false, err}>.[m
[31m-[m
[31m-A nil multi-bulk reply returns in a C<ngx.null> value.[m
[31m-[m
[31m-See http://redis.io/topics/protocol for details regarding various Redis reply types.[m
[31m-[m
[31m-In addition to all those redis command methods, the following methods are also provided:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 new[m
[31m-[m
[31m-C<syntax: red, err = redis:new()>[m
[31m-[m
[31m-Creates a redis object. In case of failures, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 connect[m
[31m-[m
[31m-C<syntax: ok, err = red:connect(host, port, options_table?)>[m
[31m-[m
[31m-C<syntax: ok, err = red:connect("unix:/path/to/unix.sock", options_table?)>[m
[31m-[m
[31m-Attempts to connect to the remote host and port that the redis server is listening to or a local unix domain socket file listened by the redis server.[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method.[m
[31m-[m
[31m-An optional Lua table can be specified as the last argument to this method to specify various connect options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pool>[m
[31m-[m
[31m-Specifies a custom name for the connection pool being used. If omitted, then the connection pool name will be generated from the string template C<< <host>:<port> >> or C<< <unix-socket-path> >>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_timeout[m
[31m-[m
[31m-C<syntax: red:set_timeout(time)>[m
[31m-[m
[31m-Sets the timeout (in ms) protection for subsequent operations, including the C<connect> method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_keepalive[m
[31m-[m
[31m-C<syntax: ok, err = red:set_keepalive(max_idle_timeout, pool_size)>[m
[31m-[m
[31m-Puts the current Redis connection immediately into the ngx_lua cosocket connection pool.[m
[31m-[m
[31m-You can specify the max idle timeout (in ms) when the connection is in the pool and the maximal size of the pool every nginx worker process.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-Only call this method in the place you would have called the C<close> method instead. Calling this method will immediately turn the current redis object into the C<closed> state. Any subsequent operations other than C<connect()> on the current object will return the C<closed> error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get_reused_times[m
[31m-[m
[31m-C<syntax: times, err = red:get_reused_times()>[m
[31m-[m
[31m-This method returns the (successfully) reused times for the current connection. In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-If the current connection does not come from the built-in connection pool, then this method always returns C<0>, that is, the connection has never been reused (yet). If the connection comes from the connection pool, then the return value is always non-zero. So this method can also be used to determine if the current connection comes from the pool.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 close[m
[31m-[m
[31m-C<syntax: ok, err = red:close()>[m
[31m-[m
[31m-Closes the current redis connection and returns the status.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_pipeline[m
[31m-[m
[31m-C<syntax: red:init_pipeline()>[m
[31m-[m
[31m-C<syntax: red:init_pipeline(n)>[m
[31m-[m
[31m-Enable the redis pipelining mode. All subsequent calls to Redis command methods will automatically get cached and will send to the server in one run when the C<commit_pipeline> method is called or get cancelled by calling the C<cancel_pipeline> method.[m
[31m-[m
[31m-This method always succeeds.[m
[31m-[m
[31m-If the redis object is already in the Redis pipelining mode, then calling this method will discard existing cached Redis queries.[m
[31m-[m
[31m-The optional C<n> argument specifies the (approximate) number of commands that are going to add to this pipeline, which can make things a little faster.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 commit_pipeline[m
[31m-[m
[31m-C<syntax: results, err = red:commit_pipeline()>[m
[31m-[m
[31m-Quits the pipelining mode by committing all the cached Redis queries to the remote server in a single run. All the replies for these queries will be collected automatically and are returned as if a big multi-bulk reply at the highest level.[m
[31m-[m
[31m-This method returns C<nil> and a Lua string describing the error upon failures.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 cancel_pipeline[m
[31m-[m
[31m-C<syntax: red:cancel_pipeline()>[m
[31m-[m
[31m-Quits the pipelining mode by discarding all existing cached Redis commands since the last call to the C<init_pipeline> method.[m
[31m-[m
[31m-This method always succeeds.[m
[31m-[m
[31m-If the redis object is not in the Redis pipelining mode, then this method is a no-op.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hmset[m
[31m-[m
[31m-C<syntax: red:hmset(myhash, field1, value1, field2, value2, ...)>[m
[31m-[m
[31m-C<syntax: red:hmset(myhash, { field1 = value1, field2 = value2, ... })>[m
[31m-[m
[31m-Special wrapper for the Redis "hmset" command.[m
[31m-[m
[31m-When there are only three arguments (including the "red" object[m
[31m-itself), then the last argument must be a Lua table holding all the field/value pairs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 array_to_hash[m
[31m-[m
[31m-C<syntax: hash = red:array_to_hash(array)>[m
[31m-[m
[31m-Auxiliary function that converts an array-like Lua table into a hash-like table.[m
[31m-[m
[31m-This method was first introduced in the C<v0.11> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 read_reply[m
[31m-[m
[31m-C<syntax: res, err = red:read_reply()>[m
[31m-[m
[31m-Reading a reply from the redis server. This method is mostly useful for the L<Redis PubE<sol>Sub API|http://redis.io/topics/pubsub/>, for example,[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        local redis = require "resty.redis"[m
[31m-    [m
[31m-        local red = redis:new()[m
[31m-        local red2 = redis:new()[m
[31m-    [m
[31m-        red:set_timeout(1000) -- 1 sec[m
[31m-        red2:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-        local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("1: failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ok, err = red2:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("2: failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local res, err = red:subscribe("dog")[m
[31m-        if not res then[m
[31m-            ngx.say("1: failed to subscribe: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("1: subscribe: ", cjson.encode(res))[m
[31m-    [m
[31m-        res, err = red2:publish("dog", "Hello")[m
[31m-        if not res then[m
[31m-            ngx.say("2: failed to publish: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("2: publish: ", cjson.encode(res))[m
[31m-    [m
[31m-        res, err = red:read_reply()[m
[31m-        if not res then[m
[31m-            ngx.say("1: failed to read reply: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("1: receive: ", cjson.encode(res))[m
[31m-    [m
[31m-        red:close()[m
[31m-        red2:close()[m
[31m-[m
[31m-Running this example gives the output like this:[m
[31m-[m
[31m-    1: subscribe: ["subscribe","dog",1][m
[31m-    2: publish: 1[m
[31m-    1: receive: ["message","dog","Hello"][m
[31m-[m
[31m-The following class methods are provieded:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 add_commands[m
[31m-[m
[31m-C<syntax: hash = redis.add_commands(cmd_name1, cmd_name2, ...)>[m
[31m-[m
[31m-Adds new redis commands to the C<resty.redis> class. Here is an example:[m
[31m-[m
[31m-[m
[31m-        local redis = require "resty.redis"[m
[31m-    [m
[31m-        redis.add_commands("foo", "bar")[m
[31m-    [m
[31m-        local red = redis:new()[m
[31m-    [m
[31m-        red:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-        local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local res, err = red:foo("a")[m
[31m-        if not res then[m
[31m-            ngx.say("failed to foo: ", err)[m
[31m-        end[m
[31m-    [m
[31m-        res, err = red:bar()[m
[31m-        if not res then[m
[31m-            ngx.say("failed to bar: ", err)[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Redis Authentication[m
[31m-[m
[31m-Redis uses the C<AUTH> command to do authentication: http://redis.io/commands/auth[m
[31m-[m
[31m-There is nothing special for this command as compared to other Redis[m
[31m-commands like C<GET> and C<SET>. So one can just invoke the C<auth> method on your C<resty.redis> instance. Here is an example:[m
[31m-[m
[31m-[m
[31m-        local redis = require "resty.redis"[m
[31m-        local red = redis:new()[m
[31m-    [m
[31m-        red:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-        local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local res, err = red:auth("foobared")[m
[31m-        if not res then[m
[31m-            ngx.say("failed to authenticate: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-where we assume that the Redis server is configured with the[m
[31m-password C<foobared> in the C<redis.conf> file:[m
[31m-[m
[31m-    requirepass foobared[m
[31m-[m
[31m-If the password specified is wrong, then the sample above will output the[m
[31m-following to the HTTP client:[m
[31m-[m
[31m-    failed to authenticate: ERR invalid password[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Redis Transactions[m
[31m-[m
[31m-This library supports the L<Redis transactions|http://redis.io/topics/transactions/>. Here is an example:[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        local redis = require "resty.redis"[m
[31m-        local red = redis:new()[m
[31m-    [m
[31m-        red:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-        local ok, err = red:connect("127.0.0.1", 6379)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local ok, err = red:multi()[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to run multi: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        ngx.say("multi ans: ", cjson.encode(ok))[m
[31m-    [m
[31m-        local ans, err = red:set("a", "abc")[m
[31m-        if not ans then[m
[31m-            ngx.say("failed to run sort: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        ngx.say("set ans: ", cjson.encode(ans))[m
[31m-    [m
[31m-        local ans, err = red:lpop("a")[m
[31m-        if not ans then[m
[31m-            ngx.say("failed to run sort: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-        ngx.say("set ans: ", cjson.encode(ans))[m
[31m-    [m
[31m-        ans, err = red:exec()[m
[31m-        ngx.say("exec ans: ", cjson.encode(ans))[m
[31m-    [m
[31m-        red:close()[m
[31m-[m
[31m-Then the output will be[m
[31m-[m
[31m-    multi ans: "OK"[m
[31m-    set ans: "QUEUED"[m
[31m-    set ans: "QUEUED"[m
[31m-    exec ans: ["OK",[false,"ERR Operation against a key holding the wrong kind of value"]][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Load Balancing and Failover[m
[31m-[m
[31m-You can trivially implement your own Redis load balancing logic yourself in Lua. Just keep a Lua table of all available Redis backend information (like host name and port numbers) and pick one server according to some rule (like round-robin or key-based hashing) from the Lua table at every request. You can keep track of the current rule state in your own Lua module's data, see http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker[m
[31m-[m
[31m-Similarly, you can implement automatic failover logic in Lua at great flexibility.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Debugging[m
[31m-[m
[31m-It is usually convenient to use the L<lua-cjson|http://www.kyne.com.au/~mark/software/lua-cjson.php> library to encode the return values of the redis command methods to JSON. For example,[m
[31m-[m
[31m-[m
[31m-        local cjson = require "cjson"[m
[31m-        ...[m
[31m-        local res, err = red:mget("h1234", "h5678")[m
[31m-        if res then[m
[31m-            print("res: ", cjson.encode(res))[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Check List for Issues[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Ensure you configure the connection pool size properly in the L<set_keepalive> . Basically if your NGINX handle C<n> concurrent requests and your NGINX has C<m> workers, then the connection pool size should be configured as C<n/m>. For example, if your NGINX usually handles 1000 concurrent requests and you have 10 NGINX workers, then the connection pool size should be 100.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Ensure the backlog setting on the Redis side is large enough. For Redis 2.8+, you can directly tune the C<tcp-backlog> parameter in the C<redis.conf> file (and also tune the kernel parameter C<SOMAXCONN> accordingly at least on Linux). You may also want to tune the C<maxclients> parameter in C<redis.conf>.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Ensure you are not using too short timeout setting in the L<set_timeout> method. If you have to, try redoing the operation upon timeout and turning off L<automatic error logging> (because you are already doing proper error handling in your own Lua code).[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-If your NGINX worker processes' CPU usage is very high under load, then the NGINX event loop might be blocked by the CPU computation too much. Try sampling a L<C-land on-CPU Flame Graph|https://github.com/agentzh/nginx-systemtap-toolkit#sample-bt> and L<Lua-land on-CPU Flame Graph|https://github.com/agentzh/stapxx#ngx-lj-lua-stacks> for a typical NGINX worker process. You can optimize the CPU-bound things according to these Flame Graphs.[m
[31m-[m
[31m-=item 5.[m
[31m-[m
[31m-If your NGINX worker processes' CPU usage is very low under load, then the NGINX event loop might be blocked by some blocking system calls (like file IO system calls). You can confirm the issue by running the L<epoll-loop-blocking-distr|https://github.com/agentzh/stapxx#epoll-loop-blocking-distr> tool against a typical NGINX worker process. If it is indeed the case, then you can further sample a L<C-land off-CPU Flame Graph|https://github.com/agentzh/nginx-systemtap-toolkit#sample-bt-off-cpu> for a NGINX worker process to analyze the actual blockers.[m
[31m-[m
[31m-=item 6.[m
[31m-[m
[31m-If your C<redis-server> process is running near 100% CPU usage, then you should consider scale your Redis backend by multiple nodes or use the L<C-land on-CPU Flame Graph tool|https://github.com/agentzh/nginx-systemtap-toolkit#sample-bt> to analyze the internal bottlenecks within the Redis server process.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like init_by_luaI<, set_by_lua>, log_by_lua*, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.redis> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.redis> instance[m
[31m-(you would see the "bad request" or "socket busy" error to be returned from the method calls).[m
[31m-You should always initiate C<resty.redis> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-If you are using the OpenResty bundle (http://openresty.org ), then[m
[31m-you do not need to do anything because it already includes and enables[m
[31m-lua-resty-redis by default. And you can just use it in your Lua code,[m
[31m-as in[m
[31m-[m
[31m-[m
[31m-        local redis = require "resty.redis"[m
[31m-        ...[m
[31m-[m
[31m-If you are using your own nginx + ngx_lua build, then you need to configure[m
[31m-the lua_package_path directive to add the path of your lua-resty-redis source[m
[31m-tree to ngx_lua's LUA_PATH search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-redis/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-Ensure that the system account running your Nginx ''worker'' proceses have[m
[31m-enough permission to read the C<.lua> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/agentzh/lua-resty-redis/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2016, by Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the redis wired protocol specification: http://redis.io/topics/protocol[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-string-0.09/lua-resty-string-0.09.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-string-0.09/lua-resty-string-0.09.pod[m
[1mdeleted file mode 100644[m
[1mindex d66dc1d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-string-0.09/lua-resty-string-0.09.pod[m
[1m+++ /dev/null[m
[36m@@ -1,213 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-string - String utilities and common hash functions for ngx_lua and LuaJIT[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered experimental and still under active development.[m
[31m-[m
[31m-The API is still in flux and may change without notice.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This library requires an nginx build with OpenSSL,[m
[31m-the L<ngx_lua module|http://wiki.nginx.org/HttpLuaModule>, and L<LuaJIT 2.0|http://luajit.org/luajit.html>.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        # nginx.conf:[m
[31m-    [m
[31m-        lua_package_path "/path/to/lua-resty-string/lib/?.lua;;"[m
[31m-    [m
[31m-        server {[m
[31m-            location = /test {[m
[31m-                content_by_lua_file conf/test.lua;[m
[31m-            }[m
[31m-        }[m
[31m-    [m
[31m-        -- conf/test.lua:[m
[31m-    [m
[31m-        local resty_sha1 = require "resty.sha1"[m
[31m-    [m
[31m-        local sha1 = resty_sha1:new()[m
[31m-        if not sha1 then[m
[31m-            ngx.say("failed to create the sha1 object")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local ok = sha1:update("hello, ")[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to add data")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ok = sha1:update("world")[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to add data")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local digest = sha1:final()  -- binary digest[m
[31m-    [m
[31m-        local str = require "resty.string"[m
[31m-        ngx.say("sha1: ", str.to_hex(digest))[m
[31m-            -- output: "sha1: b7e23ec29af22b0b4e41da31e868d57226121c84"[m
[31m-    [m
[31m-        local resty_md5 = require "resty.md5"[m
[31m-        local md5 = resty_md5:new()[m
[31m-        if not md5 then[m
[31m-            ngx.say("failed to create md5 object")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local ok = md5:update("hel")[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to add data")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ok = md5:update("lo")[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to add data")[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local digest = md5:final()[m
[31m-    [m
[31m-        local str = require "resty.string"[m
[31m-        ngx.say("md5: ", str.to_hex(digest))[m
[31m-            -- yield "md5: 5d41402abc4b2a76b9719d911017c592"[m
[31m-    [m
[31m-        local resty_sha224 = require "resty.sha224"[m
[31m-        local str = require "resty.string"[m
[31m-        local sha224 = resty_sha224:new()[m
[31m-        ngx.say(sha224:update("hello"))[m
[31m-        local digest = sha224:final()[m
[31m-        ngx.say("sha224: ", str.to_hex(digest))[m
[31m-    [m
[31m-        local resty_sha256 = require "resty.sha256"[m
[31m-        local str = require "resty.string"[m
[31m-        local sha256 = resty_sha256:new()[m
[31m-        ngx.say(sha256:update("hello"))[m
[31m-        local digest = sha256:final()[m
[31m-        ngx.say("sha256: ", str.to_hex(digest))[m
[31m-    [m
[31m-        local resty_sha512 = require "resty.sha512"[m
[31m-        local str = require "resty.string"[m
[31m-        local sha512 = resty_sha512:new()[m
[31m-        ngx.say(sha512:update("hello"))[m
[31m-        local digest = sha512:final()[m
[31m-        ngx.say("sha512: ", str.to_hex(digest))[m
[31m-    [m
[31m-        local resty_sha384 = require "resty.sha384"[m
[31m-        local str = require "resty.string"[m
[31m-        local sha384 = resty_sha384:new()[m
[31m-        ngx.say(sha384:update("hel"))[m
[31m-        ngx.say(sha384:update("lo"))[m
[31m-        local digest = sha384:final()[m
[31m-        ngx.say("sha384: ", str.to_hex(digest))[m
[31m-    [m
[31m-        local resty_random = require "resty.random"[m
[31m-        local str = require "resty.string"[m
[31m-        local random = resty_random.bytes(16)[m
[31m-            -- generate 16 bytes of pseudo-random data[m
[31m-        ngx.say("pseudo-random: ", str.to_hex(random))[m
[31m-    [m
[31m-        local resty_random = require "resty.random"[m
[31m-        local str = require "resty.string"[m
[31m-        local strong_random = resty_random.bytes(16,true)[m
[31m-            -- attempt to generate 16 bytes of[m
[31m-            -- cryptographically strong random data[m
[31m-        while strong_random == nil do[m
[31m-            strong_random = resty_random.bytes(16,true)[m
[31m-        end[m
[31m-        ngx.say("random: ", str.to_hex(strong_random))[m
[31m-    [m
[31m-        local aes = require "resty.aes"[m
[31m-        local str = require "resty.string"[m
[31m-        local aes_128_cbc_md5 = aes:new("AKeyForAES")[m
[31m-            -- the default cipher is AES 128 CBC with 1 round of MD5[m
[31m-            -- for the key and a nil salt[m
[31m-        local encrypted = aes_128_cbc_md5:encrypt("Secret message!")[m
[31m-        ngx.say("AES 128 CBC (MD5) Encrypted HEX: ", str.to_hex(encrypted))[m
[31m-        ngx.say("AES 128 CBC (MD5) Decrypted: ", aes_128_cbc_md5:decrypt(encrypted))[m
[31m-    [m
[31m-        local aes = require "resty.aes"[m
[31m-        local str = require "resty.string"[m
[31m-        local aes_256_cbc_sha512x5 = aes:new("AKeyForAES-256-CBC",[m
[31m-            "MySalt!", aes.cipher(256,"cbc"), aes.hash.sha512, 5)[m
[31m-            -- AES 256 CBC with 5 rounds of SHA-512 for the key[m
[31m-            -- and a salt of "MySalt!"[m
[31m-        local encrypted = aes_256_cbc_sha512x5:encrypt("Really secret message!")[m
[31m-        ngx.say("AES 256 CBC (SHA-512, salted) Encrypted HEX: ", str.to_hex(encrypted))[m
[31m-        ngx.say("AES 256 CBC (SHA-512, salted) Decrypted: ",[m
[31m-            aes_256_cbc_sha512x5:decrypt(encrypted))[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2014, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-upload-0.09/lua-resty-upload-0.09.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-upload-0.09/lua-resty-upload-0.09.pod[m
[1mdeleted file mode 100644[m
[1mindex c604a62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-upload-0.09/lua-resty-upload-0.09.pod[m
[1m+++ /dev/null[m
[36m@@ -1,227 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-upload - Streaming reader and parser for HTTP file uploading based on ngx_lua cosocket[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library is a streaming file uploading API for the ngx_lua nginx module:[m
[31m-[m
[31m-http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-The multipart/form-data MIME type is supported.[m
[31m-[m
[31m-The API of this library just returns tokens one by one. The user just needs to call the C<read> method repeatedly until a nil token type is returned. For each token returned from the C<read> method, just check the first return value for the current token type. The token type can be C<header>, C<body>, and C<part end>. Each C<multipart/form-data> form field parsed consists of several C<header> tokens holding each field header, several C<body> tokens holding each body data chunk, and a C<part end> flag indicating the field end.[m
[31m-[m
[31m-This is how streaming reading works. Even for giga bytes of file data input, the memory used in the lua land can be small and constant, as long as the user does not accumulate the input data chunks herself.[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that at least L<ngx_lua 0.7.9|https://github.com/chaoslawful/lua-nginx-module/tags> or L<ngx_openresty 1.2.4.14|http://openresty.org/#Download> is required.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        lua_package_path "/path/to/lua-resty-redis/lib/?.lua;;";[m
[31m-    [m
[31m-        server {[m
[31m-            location /test {[m
[31m-                content_by_lua '[m
[31m-                    local upload = require "resty.upload"[m
[31m-                    local cjson = require "cjson"[m
[31m-    [m
[31m-                    local chunk_size = 5 -- should be set to 4096 or 8192[m
[31m-                                         -- for real-world settings[m
[31m-    [m
[31m-                    local form, err = upload:new(chunk_size)[m
[31m-                    if not form then[m
[31m-                        ngx.log(ngx.ERR, "failed to new upload: ", err)[m
[31m-                        ngx.exit(500)[m
[31m-                    end[m
[31m-    [m
[31m-                    form:set_timeout(1000) -- 1 sec[m
[31m-    [m
[31m-                    while true do[m
[31m-                        local typ, res, err = form:read()[m
[31m-                        if not typ then[m
[31m-                            ngx.say("failed to read: ", err)[m
[31m-                            return[m
[31m-                        end[m
[31m-    [m
[31m-                        ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-    [m
[31m-                        if typ == "eof" then[m
[31m-                            break[m
[31m-                        end[m
[31m-                    end[m
[31m-    [m
[31m-                    local typ, res, err = form:read()[m
[31m-                    ngx.say("read: ", cjson.encode({typ, res}))[m
[31m-                ';[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-A typical output of the /test location defined above is:[m
[31m-[m
[31m-    read: ["header",["Content-Disposition","form-data; name=\"file1\"; filename=\"a.txt\"","Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\""]][m
[31m-    read: ["header",["Content-Type","text\/plain","Content-Type: text\/plain"]][m
[31m-    read: ["body","Hello"][m
[31m-    read: ["body",", wor"][m
[31m-    read: ["body","ld"][m
[31m-    read: ["part_end"][m
[31m-    read: ["header",["Content-Disposition","form-data; name=\"test\"","Content-Disposition: form-data; name=\"test\""]][m
[31m-    read: ["body","value"][m
[31m-    read: ["body","\r\n"][m
[31m-    read: ["part_end"][m
[31m-    read: ["eof"][m
[31m-    read: ["eof"][m
[31m-[m
[31m-You can use the L<lua-resty-string|https://github.com/agentzh/lua-resty-string> library to compute SHA-1 and MD5 digest of the file data incrementally. Here is such an example:[m
[31m-[m
[31m-[m
[31m-        local resty_sha1 = require "resty.sha1"[m
[31m-        local upload = require "resty.upload"[m
[31m-    [m
[31m-        local chunk_size = 4096[m
[31m-        local form = upload:new(chunk_size)[m
[31m-        local sha1 = resty_sha1:new()[m
[31m-        local file[m
[31m-        while true do[m
[31m-            local typ, res, err = form:read()[m
[31m-    [m
[31m-            if not typ then[m
[31m-                 ngx.say("failed to read: ", err)[m
[31m-                 return[m
[31m-            end[m
[31m-    [m
[31m-            if typ == "header" then[m
[31m-                local file_name = my_get_file_name(res)[m
[31m-                if file_name then[m
[31m-                    file = io.open(file_name, "w+")[m
[31m-                    if not file then[m
[31m-                        ngx.say("failed to open file ", file_name)[m
[31m-                        return[m
[31m-                    end[m
[31m-                end[m
[31m-    [m
[31m-             elseif typ == "body" then[m
[31m-                if file then[m
[31m-                    file:write(res)[m
[31m-                    sha1:update(res)[m
[31m-                end[m
[31m-    [m
[31m-            elseif typ == "part_end" then[m
[31m-                file:close()[m
[31m-                file = nil[m
[31m-                local sha1_sum = sha1:final()[m
[31m-                sha1:reset()[m
[31m-                my_save_sha1_sum(sha1_sum)[m
[31m-    [m
[31m-            elseif typ == "eof" then[m
[31m-                break[m
[31m-    [m
[31m-            else[m
[31m-                -- do nothing[m
[31m-            end[m
[31m-        end[m
[31m-[m
[31m-If you want to copmute MD5 sums for the uploaded files, just use the[m
[31m-resty.md5 module shipped by the L<lua-resty-string|https://github.com/agentzh/lua-resty-string> library. It has[m
[31m-a similar API as resty.sha1.[m
[31m-[m
[31m-For big file uploading, it is important not to buffer all the data in memory.[m
[31m-That is, you should never accumulate data chunks either in a huge Lua string or[m
[31m-in a huge Lua table. You must write the data chunk into files as soon as possible and[m
[31m-throw away the data chunk immediately (to let the Lua GC free it up).[m
[31m-[m
[31m-Instead of writing the data chunk into files (as shown in the example above),[m
[31m-you can also write the data chunks to upstream cosocket connections if you do[m
[31m-not want to save the data on local file systems.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2012-2013, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ngx_lua module|http://wiki.nginx.org/HttpLuaModule>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-string|https://github.com/agentzh/lua-resty-string> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-upstream-healthcheck-0.04/lua-resty-upstream-healthcheck-0.04.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-upstream-healthcheck-0.04/lua-resty-upstream-healthcheck-0.04.pod[m
[1mdeleted file mode 100644[m
[1mindex 81ed065..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-upstream-healthcheck-0.04/lua-resty-upstream-healthcheck-0.04.pod[m
[1m+++ /dev/null[m
[36m@@ -1,332 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-upstream-healthcheck - Health-checker for Nginx upstream servers[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is still under early development but is already production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-    http {[m
[31m-        lua_package_path "/path/to/lua-resty-upstream-healthcheck/lib/?.lua;;";[m
[31m-    [m
[31m-        # sample upstream block:[m
[31m-        upstream foo.com {[m
[31m-            server 127.0.0.1:12354;[m
[31m-            server 127.0.0.1:12355;[m
[31m-            server 127.0.0.1:12356 backup;[m
[31m-        }[m
[31m-    [m
[31m-        # the size depends on the number of servers in upstream {}:[m
[31m-        lua_shared_dict healthcheck 1m;[m
[31m-    [m
[31m-        lua_socket_log_errors off;[m
[31m-    [m
[31m-        init_worker_by_lua_block {[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-    [m
[31m-            local ok, err = hc.spawn_checker{[m
[31m-                shm = "healthcheck",  -- defined by "lua_shared_dict"[m
[31m-                upstream = "foo.com", -- defined by "upstream"[m
[31m-                type = "http",[m
[31m-    [m
[31m-                http_req = "GET /status HTTP/1.0\r\nHost: foo.com\r\n\r\n",[m
[31m-                        -- raw HTTP request for checking[m
[31m-    [m
[31m-                interval = 2000,  -- run the check cycle every 2 sec[m
[31m-                timeout = 1000,   -- 1 sec is the timeout for network operations[m
[31m-                fall = 3,  -- # of successive failures before turning a peer down[m
[31m-                rise = 2,  -- # of successive successes before turning a peer up[m
[31m-                valid_statuses = {200, 302},  -- a list valid HTTP status code[m
[31m-                concurrency = 10,  -- concurrency level for test requests[m
[31m-            }[m
[31m-            if not ok then[m
[31m-                ngx.log(ngx.ERR, "failed to spawn health checker: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-    [m
[31m-            -- Just call hc.spawn_checker() for more times here if you have[m
[31m-            -- more upstream groups to monitor. One call for one upstream group.[m
[31m-            -- They can all share the same shm zone without conflicts but they[m
[31m-            -- need a bigger shm zone for obvious reasons.[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            ...[m
[31m-    [m
[31m-            # status page for all the peers:[m
[31m-            location = /status {[m
[31m-                access_log off;[m
[31m-                allow 127.0.0.1;[m
[31m-                deny all;[m
[31m-    [m
[31m-                default_type text/plain;[m
[31m-                content_by_lua_block {[m
[31m-                    local hc = require "resty.upstream.healthcheck"[m
[31m-                    ngx.say("Nginx Worker PID: ", ngx.worker.pid())[m
[31m-                    ngx.print(hc.status_page())[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This library performs healthcheck for server peers defined in NGINX C<upstream> groups specified by names.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Methods[m
[31m-[m
[31m-[m
[31m-=head2 spawn_checker[m
[31m-[m
[31m-B<syntax:> C<ok, err = healthcheck.spawn_checker(options)>[m
[31m-[m
[31m-B<context:> I<init_worker_by_luaE<42>>[m
[31m-[m
[31m-Spawns background timer-based "light threads" to perform periodic healthchecks on[m
[31m-the specified NGINX upstream group with the specified shm storage.[m
[31m-[m
[31m-The healthchecker does not need any client traffic to function. The checks are performed actively[m
[31m-and periodically.[m
[31m-[m
[31m-This method call is asynchronous and returns immediately.[m
[31m-[m
[31m-Returns true on success, or C<nil> and a string describing an error otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 status_page[m
[31m-[m
[31m-B<syntax:> C<str, err = healthcheck.status_page()>[m
[31m-[m
[31m-B<context:> I<any>[m
[31m-[m
[31m-Generates a detailed status report for all the upstreams defined in the current NGINX server.[m
[31m-[m
[31m-One typical output is[m
[31m-[m
[31m-[m
[31m-    Upstream foo.com[m
[31m-        Primary Peers[m
[31m-            127.0.0.1:12354 up[m
[31m-            127.0.0.1:12355 DOWN[m
[31m-        Backup Peers[m
[31m-            127.0.0.1:12356 up[m
[31m-    [m
[31m-    Upstream bar.com[m
[31m-        Primary Peers[m
[31m-            127.0.0.1:12354 up[m
[31m-            127.0.0.1:12355 DOWN[m
[31m-            127.0.0.1:12357 DOWN[m
[31m-        Backup Peers[m
[31m-            127.0.0.1:12356 up[m
[31m-[m
[31m-If an upstream has no health checkers, then it will be marked by C<(NO checkers)>, as in[m
[31m-[m
[31m-[m
[31m-    Upstream foo.com (NO checkers)[m
[31m-        Primary Peers[m
[31m-            127.0.0.1:12354 up[m
[31m-            127.0.0.1:12355 up[m
[31m-        Backup Peers[m
[31m-            127.0.0.1:12356 up[m
[31m-[m
[31m-If you indeed have spawned a healthchecker in C<init_worker_by_lua*>, then you should really[m
[31m-check out the NGINX error log file to see if there is any fatal errors aborting the healthchecker threads.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Multiple Upstreams[m
[31m-[m
[31m-One can perform healchchecks on multiple C<upstream> groups by calling the L<spawn_checker> method[m
[31m-multiple times in the C<init_worker_by_lua*> handler. For example,[m
[31m-[m
[31m-[m
[31m-    upstream foo {[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    upstream bar {[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    lua_shared_dict healthcheck 1m;[m
[31m-    [m
[31m-    lua_socket_log_errors off;[m
[31m-    [m
[31m-    init_worker_by_lua_block {[m
[31m-        init_worker_by_lua_block {[m
[31m-            local hc = require "resty.upstream.healthcheck"[m
[31m-    [m
[31m-            local ok, err = hc.spawn_checker{[m
[31m-                shm = "healthcheck",[m
[31m-                upstream = "foo",[m
[31m-                ...[m
[31m-            }[m
[31m-    [m
[31m-            ...[m
[31m-    [m
[31m-            ok, err = hc.spawn_checker{[m
[31m-                shm = "healthcheck",[m
[31m-                upstream = "bar",[m
[31m-                ...[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-Different upstreams' healthcheckers use different keys (by always prefixing the keys with the[m
[31m-upstream name), so sharing a single C<lua_shared_dict> among multiple checkers should not have[m
[31m-any issues at all. But you need to compensate the size of the shared dict for multiple users (i.e., multiple checkers).[m
[31m-If you have many upstreams (thousands or even more), then it is more optimal to use separate shm zones[m
[31m-for each (group) of the upstreams.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-If you are using L<OpenResty|http://openresty.org> 1.9.3.2 or later, then you should already have this library (and all of its dependencies) installed by default (and this is also the recommended way of using this library). Otherwise continue reading:[m
[31m-[m
[31m-You need to compile both the L<ngx_lua|https://github.com/openresty/lua-nginx-module> and L<ngx_lua_upstream|https://github.com/openresty/lua-upstream-nginx-module> modules into your Nginx.[m
[31m-[m
[31m-The latest git master branch of L<ngx_lua|https://github.com/openresty/lua-nginx-module> is required.[m
[31m-[m
[31m-You need to configure[m
[31m-the L<lua_package_path|https://github.com/openresty/lua-nginx-module#lua_package_path> directive to[m
[31m-add the path of your C<lua-resty-upstream-healthcheck> source tree to L<ngx_lua|https://github.com/openresty/lua-nginx-module>'s Lua module search path, as in[m
[31m-[m
[31m-[m
[31m-    # nginx.conf[m
[31m-    http {[m
[31m-        lua_package_path "/path/to/lua-resty-upstream-healthcheck/lib/?.lua;;";[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/openresty/lua-resty-upstream-healthcheck/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2014-2016, by Yichun "agentzh" Zhang, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: https://github.com/openresty/lua-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua_upstream module: https://github.com/openresty/lua-upstream-nginx-module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-OpenResty: http://openresty.org[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-websocket-0.05/lua-resty-websocket-0.05.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-websocket-0.05/lua-resty-websocket-0.05.pod[m
[1mdeleted file mode 100644[m
[1mindex 7621c29..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/lua-resty-websocket-0.05/lua-resty-websocket-0.05.pod[m
[1m+++ /dev/null[m
[36m@@ -1,759 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-lua-resty-websocket - Lua WebSocket implementation for the ngx_lua module[m
[31m-[m
[31m-[m
[31m-[m
[31m-This library is considered production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This Lua library implements a WebSocket server and client libraries based on the L<ngx_lua module|http://wiki.nginx.org/HttpLuaModule>.[m
[31m-[m
[31m-This Lua library takes advantage of ngx_lua's cosocket API, which ensures[m
[31m-100% nonblocking behavior.[m
[31m-[m
[31m-Note that only L<RFC 6455|http://tools.ietf.org/html/rfc6455> is supported. Earlier protocol revisions like "hybi-10", "hybi-07", and "hybi-00" are not and will not be considered.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-        local server = require "resty.websocket.server"[m
[31m-    [m
[31m-        local wb, err = server:new{[m
[31m-            timeout = 5000,  -- in milliseconds[m
[31m-            max_payload_len = 65535,[m
[31m-        }[m
[31m-        if not wb then[m
[31m-            ngx.log(ngx.ERR, "failed to new websocket: ", err)[m
[31m-            return ngx.exit(444)[m
[31m-        end[m
[31m-    [m
[31m-        local data, typ, err = wb:recv_frame()[m
[31m-    [m
[31m-        if not data then[m
[31m-            ngx.log(ngx.ERR, "failed to receive a frame: ", err)[m
[31m-            return ngx.exit(444)[m
[31m-        end[m
[31m-    [m
[31m-        if typ == "close" then[m
[31m-            -- send a close frame back:[m
[31m-    [m
[31m-            local bytes, err = wb:send_close(1000, "enough, enough!")[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send the close frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-            local code = err[m
[31m-            ngx.log(ngx.INFO, "closing with status code ", code, " and message ", data)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        if typ == "ping" then[m
[31m-            -- send a pong frame back:[m
[31m-    [m
[31m-            local bytes, err = wb:send_pong(data)[m
[31m-            if not bytes then[m
[31m-                ngx.log(ngx.ERR, "failed to send frame: ", err)[m
[31m-                return[m
[31m-            end[m
[31m-        elseif typ == "pong" then[m
[31m-            -- just discard the incoming pong frame[m
[31m-    [m
[31m-        else[m
[31m-            ngx.log(ngx.INFO, "received a frame of type ", typ, " and payload ", data)[m
[31m-        end[m
[31m-    [m
[31m-        wb:set_timeout(1000)  -- change the network timeout to 1 second[m
[31m-    [m
[31m-        bytes, err = wb:send_text("Hello world")[m
[31m-        if not bytes then[m
[31m-            ngx.log(ngx.ERR, "failed to send a text frame: ", err)[m
[31m-            return ngx.exit(444)[m
[31m-        end[m
[31m-    [m
[31m-        bytes, err = wb:send_binary("blah blah blah...")[m
[31m-        if not bytes then[m
[31m-            ngx.log(ngx.ERR, "failed to send a binary frame: ", err)[m
[31m-            return ngx.exit(444)[m
[31m-        end[m
[31m-    [m
[31m-        local bytes, err = wb:send_close(1000, "enough, enough!")[m
[31m-        if not bytes then[m
[31m-            ngx.log(ngx.ERR, "failed to send the close frame: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Modules[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.websocket.server[m
[31m-[m
[31m-To load this module, just do this[m
[31m-[m
[31m-[m
[31m-        local server = require "resty.websocket.server"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head3 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 new[m
[31m-[m
[31m-C<syntax: wb, err = server:new()>[m
[31m-[m
[31m-C<syntax: wb, err = server:new(opts)>[m
[31m-[m
[31m-Performs the websocket handshake process on the server side and returns a WebSocket server object.[m
[31m-[m
[31m-In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-An optional options table can be specified. The following options are as follows:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max_payload_len>[m
[31m-[m
[31m-Specifies the maximal length of payload allowed when sending and receiving WebSocket frames.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<send_masked>[m
[31m-[m
[31m-Specifies whether to send out masked WebSocket frames. When it is C<true>, masked frames are always sent. Default to C<false>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timeout>[m
[31m-[m
[31m-Specifies the network timeout threshold in milliseconds. You can change this setting later via the C<set_timeout> method call. Note that this timeout setting does not affect the HTTP response header sending process for the websocket handshake; you need to configure the L<send_timeout|http://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout> directive at the same time.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 set_timeout[m
[31m-[m
[31m-C<syntax: wb:set_timeout(ms)>[m
[31m-[m
[31m-Sets the timeout delay (in milliseconds) for the network-related operations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_text[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_text(text)>[m
[31m-[m
[31m-Sends the C<text> argument out as an unfragmented data frame of the C<text> type. Returns the number of bytes that have actually been sent on the TCP level.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_binary[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_binary(data)>[m
[31m-[m
[31m-Sends the C<data> argument out as an unfragmented data frame of the C<binary> type. Returns the number of bytes that have actually been sent on the TCP level.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_ping[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_ping()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_ping(msg)>[m
[31m-[m
[31m-Sends out a C<ping> frame with an optional message specified by the C<msg> argument. Returns the number of bytes that have actually been sent on the TCP level.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-Note that this method does not wait for a pong frame from the remote end.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_pong[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_pong()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_pong(msg)>[m
[31m-[m
[31m-Sends out a C<pong> frame with an optional message specified by the C<msg> argument. Returns the number of bytes that have actually been sent on the TCP level.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_close[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_close()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_close(code, msg)>[m
[31m-[m
[31m-Sends out a C<close> frame with an optional status code and a message.[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-For a list of valid status code, see the following document:[m
[31m-[m
[31m-http://tools.ietf.org/html/rfc6455#section-7.4.1[m
[31m-[m
[31m-Note that this method does not wait for a C<close> frame from the remote end.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_frame[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_frame(fin, opcode, payload)>[m
[31m-[m
[31m-Sends out a raw websocket frame by specifying the C<fin> field (boolean value), the opcode, and the payload.[m
[31m-[m
[31m-For a list of valid opcode, see[m
[31m-[m
[31m-http://tools.ietf.org/html/rfc6455#section-5.2[m
[31m-[m
[31m-In case of errors, returns C<nil> and a string describing the error.[m
[31m-[m
[31m-To control the maximal payload length allowed, you can pass the C<max_payload_len> option to the C<new> constructor.[m
[31m-[m
[31m-To control whether to send masked frames, you can pass C<true> to the C<send_masked> option in the C<new> constructor method. By default, unmasked frames are sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 recv_frame[m
[31m-[m
[31m-C<syntax: data, typ, err = wb:recv_frame()>[m
[31m-[m
[31m-Receives a WebSocket frame from the wire.[m
[31m-[m
[31m-In case of an error, returns two C<nil> values and a string describing the error.[m
[31m-[m
[31m-The second return value is always the frame type, which could be one of C<continuation>, C<text>, C<binary>, C<close>, C<ping>, C<pong>, or C<nil> (for unknown types).[m
[31m-[m
[31m-For C<close> frames, returns 3 values: the extra status message (which could be an empty string), the string "close", and a Lua number for the status code (if any). For possible closing status codes, see[m
[31m-[m
[31m-http://tools.ietf.org/html/rfc6455#section-7.4.1[m
[31m-[m
[31m-For other types of frames, just returns the payload and the type.[m
[31m-[m
[31m-For fragmented frames, the C<err> return value is the Lua string "again".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.websocket.client[m
[31m-[m
[31m-To load this module, just do this[m
[31m-[m
[31m-[m
[31m-        local client = require "resty.websocket.client"[m
[31m-[m
[31m-A simple example to demonstrate the usage:[m
[31m-[m
[31m-[m
[31m-        local client = require "resty.websocket.client"[m
[31m-        local wb, err = client:new()[m
[31m-        local uri = "ws://127.0.0.1:" .. ngx.var.server_port .. "/s"[m
[31m-        local ok, err = wb:connect(uri)[m
[31m-        if not ok then[m
[31m-            ngx.say("failed to connect: " .. err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local data, typ, err = wb:recv_frame()[m
[31m-        if not data then[m
[31m-            ngx.say("failed to receive the frame: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        ngx.say("received: ", data, " (", typ, "): ", err)[m
[31m-    [m
[31m-        local bytes, err = wb:send_text("copy: " .. data)[m
[31m-        if not bytes then[m
[31m-            ngx.say("failed to send frame: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-    [m
[31m-        local bytes, err = wb:send_close()[m
[31m-        if not bytes then[m
[31m-            ngx.say("failed to send frame: ", err)[m
[31m-            return[m
[31m-        end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head3 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:new[m
[31m-[m
[31m-C<syntax: wb, err = client:new()>[m
[31m-[m
[31m-C<syntax: wb, err = client:new(opts)>[m
[31m-[m
[31m-Instantiates a WebSocket client object.[m
[31m-[m
[31m-In case of error, it returns C<nil> and a string describing the error.[m
[31m-[m
[31m-An optional options table can be specified. The following options are as follows:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<max_payload_len>[m
[31m-[m
[31m-Specifies the maximal length of payload allowed when sending and receiving WebSocket frames.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<send_unmasked>[m
[31m-[m
[31m-Specifies whether to send out an unmasked WebSocket frames. When it is C<true>, unmasked frames are always sent. Default to C<false>. RFC 6455 requires, however, that the client MUST send masked frames to the server, so never set this option to C<true> unless you know what you are doing.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timeout>[m
[31m-[m
[31m-Specifies the default network timeout threshold in milliseconds. You can change this setting later via the C<set_timeout> method call.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:connect[m
[31m-[m
[31m-C<< syntax: ok, err = wb:connect("ws://<host>:<port>/<path>") >>[m
[31m-[m
[31m-C<< syntax: ok, err = wb:connect("wss://<host>:<port>/<path>") >>[m
[31m-[m
[31m-C<< syntax: ok, err = wb:connect("ws://<host>:<port>/<path>", options) >>[m
[31m-[m
[31m-C<< syntax: ok, err = wb:connect("wss://<host>:<port>/<path>", options) >>[m
[31m-[m
[31m-Connects to the remote WebSocket service port and performs the websocket handshake process on the client side.[m
[31m-[m
[31m-Before actually resolving the host name and connecting to the remote backend, this method will always look up the connection pool for matched idle connections created by previous calls of this method.[m
[31m-[m
[31m-An optional Lua table can be specified as the last argument to this method to specify various connect options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<protocols>[m
[31m-[m
[31m-Specifies all the subprotocols used for the current WebSocket session. It could be a Lua table holding all the subprotocol names or just a single Lua string.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<origin>[m
[31m-[m
[31m-Specifies the value of the C<Origin> request header.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pool>[m
[31m-[m
[31m-Specifies a custom name for the connection pool being used. If omitted, then the connection pool name will be generated from the string template C<< <host>:<port> >>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<ssl_verify>[m
[31m-[m
[31m-Specifies whether to perform SSL certificate verfication during the[m
[31m-SSL handshake if the C<wss://> scheme is used.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The SSL connection mode (C<wss://>) requires at least ngx_lua 0.9.11 or OpenResty 1.7.4.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:close[m
[31m-[m
[31m-C<syntax: ok, err = wb:close()>[m
[31m-[m
[31m-Closes the current WebSocket connection. If no C<close> frame is sent yet, then the C<close> frame will be automatically sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:set_keepalive[m
[31m-[m
[31m-C<syntax: ok, err = wb:set_keepalive(max_idle_timeout, pool_size)>[m
[31m-[m
[31m-Puts the current Redis connection immediately into the ngx_lua cosocket connection pool.[m
[31m-[m
[31m-You can specify the max idle timeout (in ms) when the connection is in the pool and the maximal size of the pool every nginx worker process.[m
[31m-[m
[31m-In case of success, returns C<1>. In case of errors, returns C<nil> with a string describing the error.[m
[31m-[m
[31m-Only call this method in the place you would have called the C<close> method instead. Calling this method will immediately turn the current redis object into the C<closed> state. Any subsequent operations other than C<connect()> on the current objet will return the C<closed> error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:set_timeout[m
[31m-[m
[31m-C<syntax: wb:set_timeout(ms)>[m
[31m-[m
[31m-Identical to the C<set_timeout> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_text[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_text(text)>[m
[31m-[m
[31m-Identical to the L<send_text> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_binary[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_binary(data)>[m
[31m-[m
[31m-Identical to the L<send_binary> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_ping[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_ping()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_ping(msg)>[m
[31m-[m
[31m-Identical to the L<send_ping> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_pong[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_pong()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_pong(msg)>[m
[31m-[m
[31m-Identical to the L<send_pong> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_close[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_close()>[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_close(code, msg)>[m
[31m-[m
[31m-Identical to the L<send_close> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:send_frame[m
[31m-[m
[31m-C<syntax: bytes, err = wb:send_frame(fin, opcode, payload)>[m
[31m-[m
[31m-Identical to the L<send_frame> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-To control whether to send unmasked frames, you can pass C<true> to the C<send_unmasked> option in the C<new> constructor method. By default, masked frames are sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 client:recv_frame[m
[31m-[m
[31m-C<syntax: data, typ, err = wb:recv_frame()>[m
[31m-[m
[31m-Identical to the L<recv_frame> method of the C<resty.websocket.server> objects.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resty.websocket.protocol[m
[31m-[m
[31m-To load this module, just do this[m
[31m-[m
[31m-[m
[31m-        local protocol = require "resty.websocket.protocol"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head3 Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 recv_frame[m
[31m-[m
[31m-C<syntax: data, typ, err = protocol.recv_frame(socket, max_payload_len, force_masking)>[m
[31m-[m
[31m-Receives a WebSocket frame from the wire.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 build_frame[m
[31m-[m
[31m-C<syntax: frame = protocol.build_frame(fin, opcode, payload_len, payload, masking)>[m
[31m-[m
[31m-Builds a raw WebSocket frame.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head4 send_frame[m
[31m-[m
[31m-C<syntax: bytes, err = protocol.send_frame(socket, fin, opcode, payload, max_payload_len, masking)>[m
[31m-[m
[31m-Sends a raw WebSocket frame.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Automatic Error Logging[m
[31m-[m
[31m-By default the underlying L<ngx_lua|http://wiki.nginx.org/HttpLuaModule> module[m
[31m-does error logging when socket errors happen. If you are already doing proper error[m
[31m-handling in your own Lua code, then you are recommended to disable this automatic error logging by turning off L<ngx_lua|http://wiki.nginx.org/HttpLuaModule>'s L<lua_socket_log_errors|http://wiki.nginx.org/HttpLuaModule#lua_socket_log_errors> directive, that is,[m
[31m-[m
[31m-[m
[31m-        lua_socket_log_errors off;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Limitations[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-This library cannot be used in code contexts like init_by_luaI<, set_by_lua>, log_by_lua*, and[m
[31m-header_filter_by_lua* where the ngx_lua cosocket API is not available.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<resty.websocket> object instance cannot be stored in a Lua variable at the Lua module level,[m
[31m-because it will then be shared by all the concurrent requests handled by the same nginx[m
[31m-worker process (see[m
[31m-http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker ) and[m
[31m-result in bad race conditions when concurrent requests are trying to use the same C<resty.websocket> instance.[m
[31m-You should always initiate C<resty.websocket> objects in function local[m
[31m-variables or in the C<ngx.ctx> table. These places all have their own data copies for[m
[31m-each request.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is recommended to use the latest L<ngx_openresty bundle|http://openresty.org> directly where this library[m
[31m-is bundled and enabled by default. At least ngx_openresty 1.4.2.9 is required. And you need to enable LuaJIT when building your ngx_openresty[m
[31m-bundle by passing the C<--with-luajit> option to its C<./configure> script. No extra Nginx configuration is required.[m
[31m-[m
[31m-If you want to use this library with your own Nginx build (with ngx_lua), then[m
[31m-you need to ensure you are using at least ngx_lua 0.9.0[m
[31m-(and L<lua-bitop|http://bitop.luajit.org/> library if you are not using LuaJIT).[m
[31m-Also, You need to configure the[m
[31m-L<lua_package_path|https://github.com/chaoslawful/lua-nginx-module#lua_package_path>[m
[31m-directive to add the path of your lua-resty-websocket source tree to ngx_lua's[m
[31m-Lua module search path, as in[m
[31m-[m
[31m-[m
[31m-        # nginx.conf[m
[31m-        http {[m
[31m-            lua_package_path "/path/to/lua-resty-websocket/lib/?.lua;;";[m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-and then load the library in Lua:[m
[31m-[m
[31m-[m
[31m-        local server = require "resty.websocket.server"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please report bugs or submit patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|http://github.com/agentzh/lua-resty-websocket/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community|http://wiki.nginx.org/HttpLuaModule#Community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2013-2014, by Yichun Zhang (agentzh) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Blog post L<WebSockets with OpenResty|https://medium.com/p/1778601c9e05> by Aapo Talvensaari.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the ngx_lua module: http://wiki.nginx.org/HttpLuaModule[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the websocket protocol: http://tools.ietf.org/html/rfc6455[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-upload|https://github.com/agentzh/lua-resty-upload> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-redis|https://github.com/agentzh/lua-resty-redis> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-memcached|https://github.com/agentzh/lua-resty-memcached> library[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<lua-resty-mysql|https://github.com/agentzh/lua-resty-mysql> library[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/memc-nginx-module-0.17/memc-nginx-module-0.17.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/memc-nginx-module-0.17/memc-nginx-module-0.17.pod[m
[1mdeleted file mode 100644[m
[1mindex 029fd67..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/memc-nginx-module-0.17/memc-nginx-module-0.17.pod[m
[1m+++ /dev/null[m
[36m@@ -1,844 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-B<ngx_memc> - An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands.[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This document describes ngx_memc L<v0.17|http://github.com/openresty/memc-nginx-module/tags> released on 15 May 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     # GET /foo?key=dog[m
[31m-     #[m
[31m-     # POST /foo?key=cat[m
[31m-     # Cat's value...[m
[31m-     #[m
[31m-     # PUT /foo?key=bird[m
[31m-     # Bird's value...[m
[31m-     #[m
[31m-     # DELETE /foo?key=Tiger[m
[31m-     location /foo {[m
[31m-         set $memc_key $arg_key;[m
[31m-    [m
[31m-         # $memc_cmd defaults to get for GET,[m
[31m-         #   add for POST, set for PUT, and[m
[31m-         #   delete for the DELETE request method.[m
[31m-    [m
[31m-         memc_pass 127.0.0.1:11211;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     # GET /bar?cmd=get&key=cat[m
[31m-     #[m
[31m-     # POST /bar?cmd=set&key=dog[m
[31m-     # My value for the "dog" key...[m
[31m-     #[m
[31m-     # DELETE /bar?cmd=delete&key=dog[m
[31m-     # GET /bar?cmd=delete&key=dog[m
[31m-     location /bar {[m
[31m-         set $memc_cmd $arg_cmd;[m
[31m-         set $memc_key $arg_key;[m
[31m-         set $memc_flags $arg_flags; # defaults to 0[m
[31m-         set $memc_exptime $arg_exptime; # defaults to 0[m
[31m-    [m
[31m-         memc_pass 127.0.0.1:11211;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     # GET /bar?cmd=get&key=cat[m
[31m-     # GET /bar?cmd=set&key=dog&val=animal&flags=1234&exptime=2[m
[31m-     # GET /bar?cmd=delete&key=dog[m
[31m-     # GET /bar?cmd=flush_all[m
[31m-     location /bar {[m
[31m-         set $memc_cmd $arg_cmd;[m
[31m-         set $memc_key $arg_key;[m
[31m-         set $memc_value $arg_val;[m
[31m-         set $memc_flags $arg_flags; # defaults to 0[m
[31m-         set $memc_exptime $arg_exptime; # defaults to 0[m
[31m-    [m
[31m-         memc_cmds_allowed get set add delete flush_all;[m
[31m-    [m
[31m-         memc_pass 127.0.0.1:11211;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-       http {[m
[31m-         ...[m
[31m-         upstream backend {[m
[31m-            server 127.0.0.1:11984;[m
[31m-            server 127.0.0.1:11985;[m
[31m-         }[m
[31m-         server {[m
[31m-             location /stats {[m
[31m-                 set $memc_cmd stats;[m
[31m-                 memc_pass backend;[m
[31m-             }[m
[31m-             ...[m
[31m-         }[m
[31m-       }[m
[31m-       ...[m
[31m-[m
[31m-[m
[31m-     # read the memcached flags into the Last-Modified header[m
[31m-     # to respond 304 to conditional GET[m
[31m-     location /memc {[m
[31m-         set $memc_key $arg_key;[m
[31m-    [m
[31m-         memc_pass 127.0.0.1:11984;[m
[31m-    [m
[31m-         memc_flags_to_last_modified on;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     location /memc {[m
[31m-         set $memc_key foo;[m
[31m-         set $memc_cmd get;[m
[31m-    [m
[31m-         # access the unix domain socket listend by memcached[m
[31m-         memc_pass unix:/tmp/memcached.sock;[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module extends the standard L<memcached module|http://nginx.org/en/docs/http/ngx_http_memcached_module.html> to support almost the whole L<memcached ascii protocol|http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt>.[m
[31m-[m
[31m-It allows you to define a custom L<REST|http://en.wikipedia.org/wiki/REST> interface to your memcached servers or access memcached in a very efficient way from within the nginx server by means of subrequests or L<independent fake requests|http://github.com/srlindsay/nginx-independent-subrequest>.[m
[31m-[m
[31m-This module is not supposed to be merged into the Nginx core because I've used L<Ragel|http://www.complang.org/ragel/> to generate the memcached response parsers (in C) for joy :)[m
[31m-[m
[31m-If you are going to use this module to cache location responses out of the box, try L<srcache-nginx-module|http://github.com/openresty/srcache-nginx-module> with this module to achieve that.[m
[31m-[m
[31m-When used in conjunction with L<lua-nginx-module|http://github.com/openresty/lua-nginx-module>, it is recommended to use the L<lua-resty-memcached|http://github.com/openresty/lua-resty-memcached> library instead of this module though, because the former is much more flexible and memory-efficient.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Keep-alive connections to memcached servers[m
[31m-[m
[31m-You need L<HttpUpstreamKeepaliveModule|http://wiki.nginx.org/HttpUpstreamKeepaliveModule> together with this module for keep-alive TCP connections to your backend memcached servers.[m
[31m-[m
[31m-Here's a sample configuration:[m
[31m-[m
[31m-[m
[31m-       http {[m
[31m-         upstream backend {[m
[31m-           server 127.0.0.1:11211;[m
[31m-    [m
[31m-           # a pool with at most 1024 connections[m
[31m-           # and do not distinguish the servers:[m
[31m-           keepalive 1024;[m
[31m-         }[m
[31m-    [m
[31m-         server {[m
[31m-             ...[m
[31m-             location /memc {[m
[31m-                 set $memc_cmd get;[m
[31m-                 set $memc_key $arg_key;[m
[31m-                 memc_pass backend;[m
[31m-             }[m
[31m-         }[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 How it works[m
[31m-[m
[31m-It implements the memcached TCP protocol all by itself, based upon the C<upstream> mechanism. Everything involving I/O is non-blocking.[m
[31m-[m
[31m-The module itself does not keep TCP connections to the upstream memcached servers across requests, just like other upstream modules. For a working solution, see section L<Keep-alive connections to memcached servers>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Memcached commands supported[m
[31m-[m
[31m-The memcached storage commands L<set>, L<add>, L<replace>, L<prepend>, and L<append> uses the C<$memc_key> as the key, C<$memc_exptime> as the expiration time (or delay) (defaults to 0), C<$memc_flags> as the flags (defaults to 0), to build the corresponding memcached queries.[m
[31m-[m
[31m-If C<$memc_value> is not defined at all, then the request body will be used as the value of the C<$memc_value> except for the L<incr> and L<decr> commands. Note that if C<$memc_value> is defined as an empty string (C<"">), that empty string will still be used as the value as is.[m
[31m-[m
[31m-The following memcached commands have been implemented and tested (with their parameters marked by corresponding[m
[31m-nginx variables defined by this module):[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 get $memc_key[m
[31m-[m
[31m-Retrieves the value using a key.[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd 'get';[m
[31m-           set $memc_key 'my_key';[m
[31m-    [m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-    [m
[31m-           add_header X-Memc-Flags $memc_flags;[m
[31m-       }[m
[31m-[m
[31m-Returns C<200 OK> with the value put into the response body if the key is found, or C<404 Not Found> otherwise. The C<flags> number will be set into the C<$memc_flags> variable so it's often desired to put that info into the response headers by means of the standard L<add_header directive|http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header>.[m
[31m-[m
[31m-It returns C<502> for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-To use the request body as the memcached value, just avoid setting the C<$memc_value> variable:[m
[31m-[m
[31m-[m
[31m-       # POST /foo[m
[31m-       # my value...[m
[31m-       location /foo {[m
[31m-           set $memc_cmd 'set';[m
[31m-           set $memc_key 'my_key';[m
[31m-           set $memc_flags 12345;[m
[31m-           set $memc_exptime 24;[m
[31m-    [m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Or let the C<$memc_value> hold the value:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd 'set';[m
[31m-           set $memc_key 'my_key';[m
[31m-           set $memc_flags 12345;[m
[31m-           set $memc_exptime 24;[m
[31m-           set $memc_value 'my_value';[m
[31m-    [m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Returns C<201 Created> if the upstream memcached server replies C<STORED>, C<200> for C<NOT_STORED>, C<404> for C<NOT_FOUND>, C<502> for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-The original memcached responses are returned as the response body except for C<404 NOT FOUND>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 add $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-Similar to the L<set command>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 replace $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-Similar to the L<set command>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 append $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-Similar to the L<set command>.[m
[31m-[m
[31m-Note that at least memcached version 1.2.2 does not support the "append" and "prepend" commands. At least 1.2.4 and later versions seem to supports these two commands.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 prepend $memc_key $memc_flags $memc_exptime $memc_value[m
[31m-[m
[31m-Similar to the L<append command>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 delete $memc_key[m
[31m-[m
[31m-Deletes the memcached entry using a key.[m
[31m-[m
[31m-[m
[31m-       location /foo[m
[31m-           set $memc_cmd delete;[m
[31m-           set $memc_key my_key;[m
[31m-    [m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Returns C<200 OK> if deleted successfully, C<404 Not Found> for C<NOT_FOUND>, or C<502> for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-The original memcached responses are returned as the response body except for C<404 NOT FOUND>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 delete $memc_key $memc_exptime[m
[31m-[m
[31m-Similar to the L<delete $memc_key> command except it accepts an optional C<expiration> time specified by the C<$memc_exptime> variable.[m
[31m-[m
[31m-This command is no longer available in the latest memcached version 1.4.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 incr $memc_key $memc_value[m
[31m-[m
[31m-Increments the existing value of C<$memc_key> by the amount specified by C<$memc_value>:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_key my_key;[m
[31m-           set $memc_value 2;[m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-In the preceding example, every time we access C</foo> will cause the value of C<my_key> increments by C<2>.[m
[31m-[m
[31m-Returns C<200 OK> with the new value associated with that key as the response body if successful, or C<404 Not Found> if the key is not found.[m
[31m-[m
[31m-It returns C<502> for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 decr $memc_key $memc_value[m
[31m-[m
[31m-Similar to L<incr $memc_key $memc_value>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 flush_all[m
[31m-[m
[31m-Mark all the keys on the memcached server as expired:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd flush_all;[m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 flush_all $memc_exptime[m
[31m-[m
[31m-Just like L<flush_all> but also accepts an expiration time specified by the C<$memc_exptime> variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 stats[m
[31m-[m
[31m-Causes the memcached server to output general-purpose statistics and settings[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd stats;[m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Returns C<200 OK> if the request succeeds, or 502 for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-The raw C<stats> command output from the upstream memcached server will be put into the response body. [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 version[m
[31m-[m
[31m-Queries the memcached server's version number:[m
[31m-[m
[31m-[m
[31m-       location /foo {[m
[31m-           set $memc_cmd version;[m
[31m-           memc_pass 127.0.0.1:11211;[m
[31m-       }[m
[31m-[m
[31m-Returns C<200 OK> if the request succeeds, or 502 for C<ERROR>, C<CLIENT_ERROR>, or C<SERVER_ERROR>.[m
[31m-[m
[31m-The raw C<version> command output from the upstream memcached server will be put into the response body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-All the standard L<memcached module|http://nginx.org/en/docs/http/ngx_http_memcached_module.html> directives in nginx 0.8.28 are directly inherited, with the C<memcached_> prefixes replaced by C<memc_>. For example, the C<memcached_pass> directive is spelled C<memc_pass>.[m
[31m-[m
[31m-Here we only document the most important two directives (the latter is a new directive introduced by this module).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_pass[m
[31m-[m
[31m-B<syntax:> I<memc_pass E<lt>memcached server IP addressE<gt>:E<lt>memcached server portE<gt>>[m
[31m-[m
[31m-B<syntax:> I<memc_pass E<lt>memcached server hostnameE<gt>:E<lt>memcached server portE<gt>>[m
[31m-[m
[31m-B<syntax:> I<memc_pass E<lt>upstream_backend_nameE<gt>>[m
[31m-[m
[31m-B<syntax:> I<memc_pass unix:E<lt>path_to_unix_domain_socketE<gt>>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<context:> I<http, server, location, if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Specify the memcached server backend.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_cmds_allowed[m
[31m-[m
[31m-B<syntax:> I<memc_cmds_allowed E<lt>cmdE<gt>...>[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-B<context:> I<http, server, location, if>[m
[31m-[m
[31m-Lists memcached commands that are allowed to access. By default, all the memcached commands supported by this module are accessible.[m
[31m-An example is[m
[31m-[m
[31m-[m
[31m-        location /foo {[m
[31m-            set $memc_cmd $arg_cmd;[m
[31m-            set $memc_key $arg_key;[m
[31m-            set $memc_value $arg_val;[m
[31m-    [m
[31m-            memc_pass 127.0.0.1:11211;[m
[31m-    [m
[31m-            memc_cmds_allowed get;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_flags_to_last_modified[m
[31m-[m
[31m-B<syntax:> I<memc_flags_to_last_modified on|off>[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-B<context:> I<http, server, location, if>[m
[31m-[m
[31m-Read the memcached flags as epoch seconds and set it as the value of the C<Last-Modified> header. For conditional GET, it will signal nginx to return C<304 Not Modified> response to save bandwidth.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_connect_timeout[m
[31m-[m
[31m-B<syntax:> I<memc_connect_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for connecting to the memcached server, in seconds by default.[m
[31m-[m
[31m-It's wise to always explicitly specify the time unit to avoid confusion. Time units supported are "s"(seconds), "ms"(milliseconds), "y"(years), "M"(months), "w"(weeks), "d"(days), "h"(hours), and "m"(minutes).[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_send_timeout[m
[31m-[m
[31m-B<syntax:> I<memc_send_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for sending TCP requests to the memcached server, in seconds by default.[m
[31m-[m
[31m-It is wise to always explicitly specify the time unit to avoid confusion. Time units supported are "s"(seconds), "ms"(milliseconds), "y"(years), "M"(months), "w"(weeks), "d"(days), "h"(hours), and "m"(minutes).[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_read_timeout[m
[31m-[m
[31m-B<syntax:> I<memc_read_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-The timeout for reading TCP responses from the memcached server, in seconds by default.[m
[31m-[m
[31m-It's wise to always explicitly specify the time unit to avoid confusion. Time units supported are "s"(seconds), "ms"(milliseconds), "y"(years), "M"(months), "w"(weeks), "d"(days), "h"(hours), and "m"(minutes).[m
[31m-[m
[31m-This time must be less than 597 hours.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_buffer_size[m
[31m-[m
[31m-B<syntax:> I<memc_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This buffer size is used for the memory buffer to hold[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the complete response for memcached commands other than C<get>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the complete response header (i.e., the first line of the response) for the C<get> memcached command.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This default size is the page size, may be C<4k> or C<8k>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memc_ignore_client_abort[m
[31m-[m
[31m-B<syntax:> I<memc_ignore_client_abort on|off>[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-Determines whether the connection with a memcache server should be closed when a client closes a connection without waiting for a response.[m
[31m-[m
[31m-This directive was first added in the C<v0.14> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-You're recommended to install this module (as well as the Nginx core and many other goodies) via the L<OpenResty bundle|http://openresty.org>. See the L<installation steps|http://openresty.org/#Installation> for C<OpenResty>.[m
[31m-[m
[31m-Alternatively, you can compile this module into the standard Nginx source distribution by hand:[m
[31m-[m
[31m-Grab the nginx source code from L<nginx.org|http://nginx.org/>, for example,[m
[31m-the version 1.9.15 (see L<nginx compatibility>), and then build the source with this module:[m
[31m-[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     # Here we assume you would install you nginx under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-         --add-module=/path/to/memc-nginx-module[m
[31m-    [m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-Download the latest version of the release tarball of this module from L<memc-nginx-module file list|http://github.com/openresty/memc-nginx-module/tags>.[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ngx_http_memc_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 For Developers[m
[31m-[m
[31m-The memached response parsers were generated by L<Ragel|http://www.complang.org/ragel/>. If you want to[m
[31m-regenerate the parser's C file, i.e., L<srcE<sol>ngx_http_memc_response.c|http://github.com/openresty/memc-nginx-module/blob/master/src/ngx_http_memc_response.c>, use the following command from the root of the memc module's source tree:[m
[31m-[m
[31m-[m
[31m-     $ ragel -G2 src/ngx_http_memc_response.rl[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-The following versions of Nginx should work with this module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.9.x>                       (last tested: 1.9.7)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.8.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.7.x>                       (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.6.x>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.5.x>                       (last tested: 1.5.12)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.4.x>                       (last tested: 1.4.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.2.x>                       (last tested: 1.2.9)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.1.x>                       (last tested: 1.1.5)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<1.0.x>                       (last tested: 1.0.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.9.x>                       (last tested: 0.9.4)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.8.x>                       (last tested: 0.8.54)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-B<0.7.x E<gt>= 0.7.46>             (last tested: 0.7.68)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-It's worth mentioning that some 0.7.x versions older than 0.7.46 might also work, but I can't easily test them because the test suite makes extensive use of the L<echo module|http://github.com/openresty/echo-nginx-module>'s L<echo_location directive|http://github.com/openresty/echo-nginx-module#echo_location>, which requires at least nginx 0.7.46 :)[m
[31m-[m
[31m-Earlier versions of Nginx like 0.6.x and 0.5.x will I<not> work.[m
[31m-[m
[31m-If you find that any particular version of Nginx above 0.7.46 does not work with this module, please consider L<reporting a bug>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Report Bugs[m
[31m-[m
[31m-Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-create a ticket on the L<issue tracking interface|http://github.com/openresty/memc-nginx-module/issues> provided by GitHub,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or send a bug report or even patches to the L<nginx mailing list|http://mailman.nginx.org/mailman/listinfo/nginx>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Source Repository[m
[31m-[m
[31m-Available on github at L<openrestyE<sol>memc-nginx-module|http://github.com/openresty/memc-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-This module comes with a Perl-driven test suite. The L<test cases|http://github.com/openresty/memc-nginx-module/tree/master/t/> are[m
[31m-L<declarative|http://github.com/openresty/memc-nginx-module/blob/master/t/storage.t> too. Thanks to the L<Test::Base|http://search.cpan.org/perldoc?Test::Base> module in the Perl world.[m
[31m-[m
[31m-To run it on your side:[m
[31m-[m
[31m-[m
[31m-     $ PATH=/path/to/your/nginx-with-memc-module:$PATH prove -r t[m
[31m-[m
[31m-You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary.[m
[31m-[m
[31m-Either L<LWP::UserAgent|http://search.cpan.org/perldoc?LWP::UserAgent> or L<IO::Socket|http://search.cpan.org/perldoc?IO::Socket> is used by the L<test scaffold|http://github.com/openresty/memc-nginx-module/blob/master/test/lib/Test/Nginx/LWP.pm>.[m
[31m-[m
[31m-Because a single nginx server (by default, C<localhost:1984>) is used across all the test scripts (C<.t> files), it's meaningless to run the test suite in parallel by specifying C<-jN> when invoking the C<prove> utility.[m
[31m-[m
[31m-You should also keep a memcached server listening on the C<11211> port at localhost before running the test suite.[m
[31m-[m
[31m-Some parts of the test suite requires modules L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html> and L<echo|http://github.com/openresty/echo-nginx-module> to be enabled as well when building Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add support for the memcached commands C<cas>, C<gets> and C<stats $memc_value>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add support for the C<noreply> option.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Getting involved[m
[31m-[m
[31m-You'll be very welcomed to submit patches to the L<author> or just ask for a commit bit to the L<source repository> on GitHub.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Yichun "agentzh" Zhang (章亦春) I<E<lt>agentzh@gmail.comE<gt>>, CloudFlare Inc.[m
[31m-[m
[31m-This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright & License[m
[31m-[m
[31m-The code base is borrowed directly from the standard L<memcached module|http://nginx.org/en/docs/http/ngx_http_memcached_module.html> in the Nginx core. This part of code is copyrighted by Igor Sysoev and Nginx Inc.[m
[31m-[m
[31m-Copyright (c) 2009-2016, Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-This module is licensed under the terms of the BSD license.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without[m
[31m-modification, are permitted provided that the following conditions[m
[31m-are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS[m
[31m-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT[m
[31m-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR[m
[31m-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT[m
[31m-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,[m
[31m-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED[m
[31m-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR[m
[31m-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF[m
[31m-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS[m
[31m-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The original announcement email on the nginx mailing list: L<ngx_memc: "an extended version of ngx_memcached that supports set, add, delete, and many more commands"|http://forum.nginx.org/read.php?2,28359>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-My slides demonstrating various ngx_memc usage: E<lt>http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#34E<gt> (use the arrow or pageup/pagedown keys on the keyboard to swith pages)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The latest L<memcached TCP protocol|http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<ngx_srcache|http://github.com/openresty/srcache-nginx-module> module[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<lua-resty-memcached|https://github.com/openresty/lua-resty-memcached> library based on the L<lua-nginx-module|http://github.com/openresty/lua-nginx-module> cosocket API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<memcached|http://nginx.org/en/docs/http/ngx_http_memcached_module.html> module.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L<echo module|http://github.com/openresty/echo-nginx-module> for Nginx module's automated testing.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The standard L<headers|http://nginx.org/en/docs/http/ngx_http_headers_module.html> module and the 3rd-parth L<headers-more|http://github.com/openresty/headers-more-nginx-module> module.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/accept_failed.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/accept_failed.pod[m
[1mdeleted file mode 100644[m
[1mindex 1dfab32..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/accept_failed.pod[m
[1m+++ /dev/null[m
[36m@@ -1,40 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-accept_failed[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-What does the following error mean in the log file: "accept() failed (53:[m
[31m-Software caused connection abort) while accepting new[m
[31m-connection on 0.0.0.0:80"?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-Such errors stem from the connections that the clients managed[m
[31m-to close before nginx was able to process them. For instance, this can[m
[31m-happen in a situation when the user didn’t wait for a page[m
[31m-heavily populated with images to load fully, and clicked on a[m
[31m-different link. In this case user’s browser would close all of[m
[31m-the prior connections which aren’t longer necessary.[m
[31m-It is a non-critical error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/beginners_guide.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/beginners_guide.pod[m
[1mdeleted file mode 100644[m
[1mindex 3393538..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/beginners_guide.pod[m
[1m+++ /dev/null[m
[36m@@ -1,563 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-beginners_guide - Beginner’s Guide[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-This guide gives a basic introduction to nginx and describes some[m
[31m-simple tasks that can be done with it.[m
[31m-It is supposed that nginx is already installed on the reader’s machine.[m
[31m-If it is not, see the L<install> page.[m
[31m-This guide describes how to start and stop nginx, and reload its[m
[31m-configuration, explains the structure[m
[31m-of the configuration file and describes how to set up nginx[m
[31m-to serve out static content, how to configure nginx as a proxy[m
[31m-server, and how to connect it with a FastCGI application.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx has one master process and several worker processes.[m
[31m-The main purpose of the master process is to read and evaluate configuration,[m
[31m-and maintain worker processes.[m
[31m-Worker processes do actual processing of requests.[m
[31m-nginx employs event-based model and OS-dependent mechanisms to efficiently[m
[31m-distribute requests among worker processes.[m
[31m-The number of worker processes is defined in the configuration file and[m
[31m-may be fixed for a given configuration or automatically adjusted to the[m
[31m-number of available CPU cores (see[m
[31m-L<ngx_core_module>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The way nginx and its modules work is determined in the configuration file.[m
[31m-By default, the configuration file is named F<nginx.conf>[m
[31m-and placed in the directory[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>conf>,[m
[31m-F<E<sol>etcE<sol>nginx>, or[m
[31m-F<E<sol>usrE<sol>localE<sol>etcE<sol>nginx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Starting, Stopping, and Reloading Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-To start nginx, run the executable file.[m
[31m-Once nginx is started, it can be controlled by invoking the executable[m
[31m-with the C<-s> parameter.[m
[31m-Use the following syntax:[m
[31m-[m
[31m-    [m
[31m-    nginx -s <i>signal</i>[m
[31m-[m
[31m-[m
[31m-Where I<signal> may be one of the following:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<stop>E<mdash>fast shutdown[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<quit>E<mdash>graceful shutdown[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<reload>E<mdash>reloading the configuration file[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<reopen>E<mdash>reopening the log files[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-For example, to stop nginx processes with waiting for the worker processes[m
[31m-to finish serving current requests, the following command can be executed:[m
[31m-[m
[31m-    [m
[31m-    nginx -s quit[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-This command should be executed under the same user that[m
[31m-started nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Changes made in the configuration file[m
[31m-will not be applied until the command to reload configuration is[m
[31m-sent to nginx or it is restarted.[m
[31m-To reload configuration, execute:[m
[31m-[m
[31m-    [m
[31m-    nginx -s reload[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Once the master process receives the signal to reload configuration,[m
[31m-it checks the syntax validity[m
[31m-of the new configuration file and tries to apply the configuration provided[m
[31m-in it.[m
[31m-If this is a success, the master process starts new worker processes[m
[31m-and sends messages to old worker processes, requesting them to[m
[31m-shut down.[m
[31m-Otherwise, the master process rolls back the changes and[m
[31m-continues to work with the old configuration.[m
[31m-Old worker processes, receiving a command to shut down,[m
[31m-stop accepting new connections and continue to service current requests until[m
[31m-all such requests are serviced.[m
[31m-After that, the old worker processes exit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A signal may also be sent to nginx processes with the help of Unix tools[m
[31m-such as the C<kill> utility.[m
[31m-In this case a signal is sent directly to a process with a given process ID.[m
[31m-The process ID of the nginx master process is written, by default, to the[m
[31m-F<nginx.pid> in the directory[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>logs> or[m
[31m-F<E<sol>varE<sol>run>.[m
[31m-For example, if the master process ID is 1628, to send the QUIT signal[m
[31m-resulting in nginx’s graceful shutdown, execute:[m
[31m-[m
[31m-    [m
[31m-    kill -s QUIT 1628[m
[31m-[m
[31m-[m
[31m-For getting the list of all running nginx processes, the C<ps>[m
[31m-utility may be used, for example, in the following way:[m
[31m-[m
[31m-    [m
[31m-    ps -ax | grep nginx[m
[31m-[m
[31m-[m
[31m-For more information on sending signals to nginx, see[m
[31m-L<control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Configuration File’s Structure[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx consists of modules which are controlled by directives specified[m
[31m-in the configuration file.[m
[31m-Directives are divided into simple directives and block directives.[m
[31m-A simple directive consists of the name and parameters separated by spaces[m
[31m-and ends with a semicolon (C<;>).[m
[31m-A block directive has the same structure as a simple directive, but[m
[31m-instead of the semicolon it ends with a set of additional instructions[m
[31m-surrounded by braces (C<{> and C<}>).[m
[31m-If a block directive can have other directives inside braces,[m
[31m-it is called a context (examples:[m
[31m-L<ngx_core_module>,[m
[31m-L<ngx_http_core_module>,[m
[31m-L<ngx_http_core_module>,[m
[31m-and[m
[31m-L<ngx_http_core_module>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Directives placed in the configuration file outside[m
[31m-of any contexts are considered to be in the[m
[31m-L<main|ngx_core_module> context.[m
[31m-The C<events> and C<http> directives[m
[31m-reside in the C<main> context, C<server>[m
[31m-in C<http>, and C<location> in[m
[31m-C<server>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The rest of a line after the C<#> sign is considered a comment.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Serving Static Content[m
[31m-[m
[31m-[m
[31m-[m
[31m-An important web server task is serving out[m
[31m-files (such as images or static HTML pages).[m
[31m-You will implement an example where, depending on the request,[m
[31m-files will be served from different local directories: F<E<sol>dataE<sol>www>[m
[31m-(which may contain HTML files) and F<E<sol>dataE<sol>images>[m
[31m-(containing images).[m
[31m-This will require editing of the configuration file and setting up of a[m
[31m-L<ngx_http_core_module>[m
[31m-block inside the L<ngx_http_core_module>[m
[31m-block with two L<ngx_http_core_module>[m
[31m-blocks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-First, create the F<E<sol>dataE<sol>www> directory and put an[m
[31m-F<index.html> file with any text content into it and[m
[31m-create the F<E<sol>dataE<sol>images> directory and place some[m
[31m-images in it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Next, open the configuration file.[m
[31m-The default configuration file already includes several examples of[m
[31m-the C<server> block, mostly commented out.[m
[31m-For now comment out all such blocks and start a new[m
[31m-C<server> block:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        server {[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Generally, the configuration file may include several[m
[31m-C<server> blocks[m
[31m-L<distinguished|request_processing> by ports on which[m
[31m-they L<listen|ngx_http_core_module> to[m
[31m-and by[m
[31m-L<server names|server_names>.[m
[31m-Once nginx decides which C<server> processes a request,[m
[31m-it tests the URI specified in the request’s header against the parameters of the[m
[31m-C<location> directives defined inside the[m
[31m-C<server> block.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Add the following C<location> block to the[m
[31m-C<server> block:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        root /data/www;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This C<location> block specifies the[m
[31m-“F<E<sol>>” prefix compared with the URI from the request.[m
[31m-For matching requests, the URI will be added to the path specified in the[m
[31m-L<ngx_http_core_module>[m
[31m-directive, that is, to F<E<sol>dataE<sol>www>,[m
[31m-to form the path to the requested file on the local file system.[m
[31m-If there are several matching C<location> blocks nginx[m
[31m-selects the one with the longest prefix.[m
[31m-The C<location> block above provides the shortest[m
[31m-prefix, of length one,[m
[31m-and so only if all other C<location>[m
[31m-blocks fail to provide a match, this block will be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Next, add the second C<location> block:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root /data;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-It will be a match for requests starting with C<E<sol>imagesE<sol>>[m
[31m-(C<location E<sol>> also matches such requests,[m
[31m-but has shorter prefix).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The resulting configuration of the C<server> block should[m
[31m-look like this:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            root /data/www;[m
[31m-        }[m
[31m-    [m
[31m-        location /images/ {[m
[31m-            root /data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This is already a working configuration of a server that listens[m
[31m-on the standard port 80 and is accessible on the local machine at[m
[31m-C<http:E<sol>E<sol>localhostE<sol>>.[m
[31m-In response to requests with URIs starting with C<E<sol>imagesE<sol>>,[m
[31m-the server will send files from the F<E<sol>dataE<sol>images> directory.[m
[31m-For example, in response to the[m
[31m-C<http:E<sol>E<sol>localhostE<sol>imagesE<sol>example.png> request nginx will[m
[31m-send the F<E<sol>dataE<sol>imagesE<sol>example.png> file.[m
[31m-If such file does not exist, nginx will send a response[m
[31m-indicating the 404 error.[m
[31m-Requests with URIs not starting with C<E<sol>imagesE<sol>> will be[m
[31m-mapped onto the F<E<sol>dataE<sol>www> directory.[m
[31m-For example, in response to the[m
[31m-C<http:E<sol>E<sol>localhostE<sol>someE<sol>example.html> request nginx will[m
[31m-send the F<E<sol>dataE<sol>wwwE<sol>someE<sol>example.html> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To apply the new configuration, start nginx if it is not yet started or[m
[31m-send the C<reload> signal to the nginx’s master process,[m
[31m-by executing:[m
[31m-[m
[31m-    [m
[31m-    nginx -s reload[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In case something does not work as expected, you may try to find out[m
[31m-the reason in F<access.log> and[m
[31m-F<error.log> files in the directory[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>logs> or[m
[31m-F<E<sol>varE<sol>logE<sol>nginx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Setting Up a Simple Proxy Server[m
[31m-[m
[31m-[m
[31m-[m
[31m-One of the frequent uses of nginx is setting it up as a proxy server, which[m
[31m-means a server that receives requests, passes them to the proxied servers,[m
[31m-retrieves responses from them, and sends them to the clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-We will configure a basic proxy server, which serves requests of[m
[31m-images with files from the local directory and sends all other requests to a[m
[31m-proxied server.[m
[31m-In this example, both servers will be defined on a single nginx instance.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-First, define the proxied server by adding one more C<server>[m
[31m-block to the nginx’s configuration file with the following contents:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen 8080;[m
[31m-        root /data/up1;[m
[31m-    [m
[31m-        location / {[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This will be a simple server that listens on the port 8080[m
[31m-(previously, the C<listen> directive has not been specified[m
[31m-since the standard port 80 was used) and maps[m
[31m-all requests to the F<E<sol>dataE<sol>up1> directory on the local[m
[31m-file system.[m
[31m-Create this directory and put the F<index.html> file into it.[m
[31m-Note that the C<root> directive is placed in the[m
[31m-C<server> context.[m
[31m-Such C<root> directive is used when the[m
[31m-C<location> block selected for serving a request does not[m
[31m-include own C<root> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Next, use the server configuration from the previous section[m
[31m-and modify it to make it a proxy server configuration.[m
[31m-In the first C<location> block, put the[m
[31m-L<ngx_http_proxy_module>[m
[31m-directive with the protocol, name and port of the proxied server specified[m
[31m-in the parameter (in our case, it is C<http:E<sol>E<sol>localhost:8080>):[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            proxy_pass http://localhost:8080;[m
[31m-        }[m
[31m-    [m
[31m-        location /images/ {[m
[31m-            root /data;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-We will modify the second C<location>[m
[31m-block, which currently maps requests with the C<E<sol>imagesE<sol>>[m
[31m-prefix to the files under the F<E<sol>dataE<sol>images> directory,[m
[31m-to make it match the requests of images with typical file extensions.[m
[31m-The modified C<location> block looks like this:[m
[31m-[m
[31m-    [m
[31m-    location ~ \.(gif|jpg|png)$ {[m
[31m-        root /data/images;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The parameter is a regular expression matching all URIs ending[m
[31m-with F<.gif>, F<.jpg>, or F<.png>.[m
[31m-A regular expression should be preceded with C<~>.[m
[31m-The corresponding requests will be mapped to the F<E<sol>dataE<sol>images>[m
[31m-directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When nginx selects a C<location> block to serve a request[m
[31m-it first checks L<ngx_http_core_module>[m
[31m-directives that specify prefixes, remembering C<location>[m
[31m-with the longest prefix, and then checks regular expressions.[m
[31m-If there is a match with a regular expression, nginx picks this[m
[31m-C<location> or, otherwise, it picks the one remembered earlier.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The resulting configuration of a proxy server will look like this:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            proxy_pass http://localhost:8080/;[m
[31m-        }[m
[31m-    [m
[31m-        location ~ \.(gif|jpg|png)$ {[m
[31m-            root /data/images;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This server will filter requests ending with F<.gif>,[m
[31m-F<.jpg>, or F<.png>[m
[31m-and map them to the F<E<sol>dataE<sol>images> directory (by adding URI to the[m
[31m-C<root> directive’s parameter) and pass all other requests[m
[31m-to the proxied server configured above.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To apply new configuration, send the C<reload> signal to[m
[31m-nginx as described in the previous sections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There are many L<more|ngx_http_proxy_module>[m
[31m-directives that may be used to further configure a proxy connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Setting Up FastCGI Proxying[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx can be used to route requests to FastCGI servers which run[m
[31m-applications built with various frameworks and programming languages[m
[31m-such as PHP.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The most basic nginx configuration to work with a FastCGI server[m
[31m-includes using the[m
[31m-L<ngx_http_fastcgi_module>[m
[31m-directive instead of the C<proxy_pass> directive,[m
[31m-and L<ngx_http_fastcgi_module>[m
[31m-directives to set parameters passed to a FastCGI server.[m
[31m-Suppose the FastCGI server is accessible on C<localhost:9000>.[m
[31m-Taking the proxy configuration from the previous section as a basis,[m
[31m-replace the C<proxy_pass> directive with the[m
[31m-C<fastcgi_pass> directive and change the parameter to[m
[31m-C<localhost:9000>.[m
[31m-In PHP, the C<SCRIPT_FILENAME> parameter is used for[m
[31m-determining the script name, and the C<QUERY_STRING>[m
[31m-parameter is used to pass request parameters.[m
[31m-The resulting configuration would be:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            fastcgi_pass  localhost:9000;[m
[31m-            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;[m
[31m-            fastcgi_param QUERY_STRING    $query_string;[m
[31m-        }[m
[31m-    [m
[31m-        location ~ \.(gif|jpg|png)$ {[m
[31m-            root /data/images;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This will set up a server that will route all requests except for[m
[31m-requests for static images to the proxied server operating on[m
[31m-C<localhost:9000> through the FastCGI protocol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/chunked_encoding_from_backend.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/chunked_encoding_from_backend.pod[m
[1mdeleted file mode 100644[m
[1mindex e9738de..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/chunked_encoding_from_backend.pod[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-chunked_encoding_from_backend[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-My backend server appears to send HTTPE<sol>1.0 responses using[m
[31m-chunked encoding but nginx doesn’t handle it correctly.[m
[31m-For instance, I’m using nginx as a frontend to my node.js[m
[31m-application and instead of pure JSON from backend, nginx[m
[31m-returns something framed in decimal numbers like[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    47[m
[31m-    {"error":"query error","message":"Parameter(s) missing: user,password"}[m
[31m-    0[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-Your backend violates HTTP specification (see[m
[31m-L<RFC 2616,[m
[31m-"3.6 Transfer Codings"|http://tools.ietf.org/html/rfc2616#section-3.6>).[m
[31m-The "chunked" transfer-codings must not be used with HTTPE<sol>1.0.[m
[31m-You’d need to either fix your backend application or upgrade[m
[31m-to nginx version 1.1.4 and newer, where an additional code[m
[31m-was introduced to handle such erratic backend behavior.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/configure.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/configure.pod[m
[1mdeleted file mode 100644[m
[1mindex 97781b6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/configure.pod[m
[1m+++ /dev/null[m
[36m@@ -1,350 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-configure - Building nginx from Sources[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The build is configured using the C<configure> command.[m
[31m-It defines various aspects of the system, including the methods nginx[m
[31m-is allowed to use for connection processing.[m
[31m-At the end it creates a F<Makefile>.[m
[31m-The C<configure> command supports the following parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--prefix=I<C<path>>>E<mdash>defines[m
[31m-a directory that will keep server files.[m
[31m-This same directory will also be used for all relative paths set by[m
[31m-C<configure> (except for paths to libraries sources)[m
[31m-and in the F<nginx.conf> configuration file.[m
[31m-It is set to the F<E<sol>usrE<sol>localE<sol>nginx> directory by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--sbin-path=I<C<path>>>E<mdash>sets[m
[31m-the name of an nginx executable file.[m
[31m-This name is used only during installation.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>sbinE<sol>nginx>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--conf-path=I<C<path>>>E<mdash>sets[m
[31m-the name of an F<nginx.conf> configuration file.[m
[31m-If needs be, nginx can always be started with a different configuration file,[m
[31m-by specifying it in the command-line parameter[m
[31m-C<-c I<C<file>>>.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>confE<sol>nginx.conf>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--pid-path=I<C<path>>>E<mdash>sets[m
[31m-the name of an nginx.pid file that will store the process ID[m
[31m-of the main process.[m
[31m-After installation, the file name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_core_module> directive.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>logsE<sol>nginx.pid>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--error-log-path=I<C<path>>>E<mdash>sets[m
[31m-the name of the primary error, warnings, and diagnostic file.[m
[31m-After installation, the file name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_core_module> directive.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>logsE<sol>error.log>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--http-log-path=I<C<path>>>E<mdash>sets[m
[31m-the name of the primary request log file of the HTTP server.[m
[31m-After installation, the file name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_http_log_module> directive.[m
[31m-By default the file is named[m
[31m-F<I<C<prefix>>E<sol>logsE<sol>access.log>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--user=I<C<name>>>E<mdash>sets[m
[31m-the name of an unprivileged user whose credentials will be used[m
[31m-by worker processes.[m
[31m-After installation, the name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_core_module> directive.[m
[31m-The default user name is nobody.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--group=I<C<name>>>E<mdash>sets[m
[31m-the name of a group whose credentials will be used[m
[31m-by worker processes.[m
[31m-After installation, the name can always be changed in the[m
[31m-F<nginx.conf> configuration file using the[m
[31m-L<ngx_core_module> directive.[m
[31m-By default, a group name is set to the name of an unprivileged user.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-select_module>[m
[31m-[m
[31m-[m
[31m-C<--without-select_module>E<mdash>enables or disables[m
[31m-building a module that allows the server to work with the[m
[31m-C<select> method.[m
[31m-This module is built automatically if the platform does not appear[m
[31m-to support more appropriate methods such as kqueue, epoll, or E<sol>devE<sol>poll.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-poll_module>[m
[31m-[m
[31m-[m
[31m-C<--without-poll_module>E<mdash>enables or disables[m
[31m-building a module that allows the server to work with the[m
[31m-C<poll> method.[m
[31m-This module is built automatically if the platform does not appear[m
[31m-to support more appropriate methods such as kqueue, epoll, or E<sol>devE<sol>poll.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--without-http_gzip_module>E<mdash>disables building a module[m
[31m-that L<compresses responses|ngx_http_gzip_module>[m
[31m-of an HTTP server.[m
[31m-The zlib library is required to build and run this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--without-http_rewrite_module>E<mdash>disables building a[m
[31m-module that allows an HTTP server to[m
[31m-L<redirect requests and change URI[m
[31m-of requests|ngx_http_rewrite_module>.[m
[31m-The PCRE library is required to build and run this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--without-http_proxy_module>E<mdash>disables building an[m
[31m-HTTP server L<proxying module|ngx_http_proxy_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-http_ssl_module>E<mdash>enables building a module[m
[31m-that adds the L<HTTPS protocol[m
[31m-support|ngx_http_ssl_module> to an HTTP server.[m
[31m-This module is not built by default.[m
[31m-The OpenSSL library is required to build and run this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-pcre=I<C<path>>>E<mdash>sets[m
[31m-the path to the sources of the PCRE library.[m
[31m-The library distribution (version[m
[31m-4.4E<mdash>8.38) needs to be downloaded from the[m
[31m-L<PCRE|http://www.pcre.org> site and extracted.[m
[31m-The rest is done by nginx’s C<.E<sol>configure> and[m
[31m-C<make>.[m
[31m-The library is required for regular expressions support in the[m
[31m-L<ngx_http_core_module> directive[m
[31m-and for the[m
[31m-L<ngx_http_rewrite_module|ngx_http_rewrite_module>[m
[31m-module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-pcre-jit>E<mdash>builds the PCRE library with[m
[31m-“just-in-time compilation” support (1.1.12, the[m
[31m-L<ngx_core_module> directive).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-zlib=I<C<path>>>E<mdash>sets[m
[31m-the path to the sources of the zlib library.[m
[31m-The library distribution (version[m
[31m-1.1.3E<mdash>1.2.8) needs to be downloaded from the[m
[31m-L<zlib|http://zlib.net> site and extracted.[m
[31m-The rest is done by nginx’s C<.E<sol>configure> and[m
[31m-C<make>.[m
[31m-The library is required for the[m
[31m-L<ngx_http_gzip_module|ngx_http_gzip_module> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-cc-opt=I<C<parameters>>>E<mdash>sets[m
[31m-additional parameters that will be added to the CFLAGS variable.[m
[31m-When using the system PCRE library under FreeBSD,[m
[31m-C<--with-cc-opt="-I E<sol>usrE<sol>localE<sol>include">[m
[31m-should be specified.[m
[31m-If the number of files supported by C<select> needs to be[m
[31m-increased it can also be specified here such as this:[m
[31m-C<--with-cc-opt="-D FD_SETSIZE=2048">.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<--with-ld-opt=I<C<parameters>>>E<mdash>sets[m
[31m-additional parameters that will be used during linking.[m
[31m-When using the system PCRE library under FreeBSD,[m
[31m-C<--with-ld-opt="-L E<sol>usrE<sol>localE<sol>lib">[m
[31m-should be specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example of parameters usage (all of this needs to be typed in one line):[m
[31m-[m
[31m-    [m
[31m-    ./configure[m
[31m-        --sbin-path=/usr/local/nginx/nginx[m
[31m-        --conf-path=/usr/local/nginx/nginx.conf[m
[31m-        --pid-path=/usr/local/nginx/nginx.pid[m
[31m-        --with-http_ssl_module[m
[31m-        --with-pcre=../pcre-8.38[m
[31m-        --with-zlib=../zlib-1.2.8[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-After configuration,[m
[31m-nginx is compiled and installed using C<make>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/configuring_https_servers.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/configuring_https_servers.pod[m
[1mdeleted file mode 100644[m
[1mindex 9c60a44..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/configuring_https_servers.pod[m
[1m+++ /dev/null[m
[36m@@ -1,610 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-configuring_https_servers - Configuring HTTPS servers[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-To configure an HTTPS server, the C<ssl> parameter[m
[31m-must be enabled on[m
[31m-L<listening sockets|ngx_http_core_module>[m
[31m-in the L<ngx_http_core_module> block,[m
[31m-and the locations of the server certificate[m
[31m-and private key files should be specified:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen              443 <b>ssl</b>;[m
[31m-        server_name         www.example.com;[m
[31m-        ssl_certificate     <b>www.example.com.crt</b>;[m
[31m-        ssl_certificate_key <b>www.example.com.key</b>;[m
[31m-        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-        ssl_ciphers         HIGH:!aNULL:!MD5;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-The server certificate is a public entity.[m
[31m-It is sent to every client that connects to the server.[m
[31m-The private key is a secure entity and should be stored in a file with[m
[31m-restricted access, however, it must be readable by nginx’s master process.[m
[31m-The private key may alternately be stored in the same file as the certificate:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-        ssl_certificate     www.example.com.cert;[m
[31m-        ssl_certificate_key www.example.com.cert;[m
[31m-[m
[31m-[m
[31m-[m
[31m-in which case the file access rights should also be restricted.[m
[31m-Although the certificate and the key are stored in one file,[m
[31m-only the certificate is sent to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directives L<ngx_http_ssl_module> and[m
[31m-L<ngx_http_ssl_module>[m
[31m-can be used to limit connections[m
[31m-to include only the strong versions and ciphers of SSLE<sol>TLS.[m
[31m-By default nginx uses[m
[31m-“C<ssl_protocols TLSv1 TLSv1.1 TLSv1.2>”[m
[31m-and “C<ssl_ciphers HIGH:!aNULL:!MD5>”,[m
[31m-so configuring them explicitly is generally not needed.[m
[31m-Note that default values of these directives were[m
[31m-changed several times.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 HTTPS server optimization[m
[31m-[m
[31m-[m
[31m-[m
[31m-SSL operations consume extra CPU resources.[m
[31m-On multi-processor systems several worker processes should be run,[m
[31m-no less than the number of available CPU cores.[m
[31m-The most CPU-intensive operation is the SSL handshake.[m
[31m-There are two ways to minimize the number of these operations per client:[m
[31m-the first is by enabling keepalive connections to send several[m
[31m-requests via one connection and the second is to reuse SSL session[m
[31m-parameters to avoid SSL handshakes for parallel and subsequent connections.[m
[31m-The sessions are stored in an SSL session cache shared between workers[m
[31m-and configured by the[m
[31m-L<ngx_http_ssl_module>[m
[31m-directive.[m
[31m-One megabyte of the cache contains about 4000 sessions.[m
[31m-The default cache timeout is 5 minutes.[m
[31m-It can be increased by using the[m
[31m-L<ngx_http_ssl_module>[m
[31m-directive.[m
[31m-Here is a sample configuration optimized for a multi-core system[m
[31m-with 10 megabyte shared session cache:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    <b>worker_processes auto</b>;[m
[31m-    [m
[31m-    http {[m
[31m-        <b>ssl_session_cache   shared:SSL:10m</b>;[m
[31m-        <b>ssl_session_timeout 10m</b>;[m
[31m-    [m
[31m-        server {[m
[31m-            listen              443 ssl;[m
[31m-            server_name         www.example.com;[m
[31m-            <b>keepalive_timeout   70</b>;[m
[31m-    [m
[31m-            ssl_certificate     www.example.com.crt;[m
[31m-            ssl_certificate_key www.example.com.key;[m
[31m-            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-            ssl_ciphers         HIGH:!aNULL:!MD5;[m
[31m-            ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SSL certificate chains[m
[31m-[m
[31m-[m
[31m-[m
[31m-Some browsers may complain about a certificate signed by a well-known[m
[31m-certificate authority, while other browsers may accept the certificate[m
[31m-without issues.[m
[31m-This occurs because the issuing authority has signed the server certificate[m
[31m-using an intermediate certificate that is not present in the certificate[m
[31m-base of well-known trusted certificate authorities which is distributed[m
[31m-with a particular browser.[m
[31m-In this case the authority provides a bundle of chained certificates[m
[31m-which should be concatenated to the signed server certificate.[m
[31m-The server certificate must appear before the chained certificates[m
[31m-in the combined file:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    $ cat www.example.com.crt bundle.crt > www.example.com.chained.crt[m
[31m-[m
[31m-[m
[31m-[m
[31m-The resulting file should be used in the[m
[31m-L<ngx_http_ssl_module> directive:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen              443 ssl;[m
[31m-        server_name         www.example.com;[m
[31m-        ssl_certificate     www.example.com.chained.crt;[m
[31m-        ssl_certificate_key www.example.com.key;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the server certificate and the bundle have been concatenated in the wrong[m
[31m-order, nginx will fail to start and will display the error message:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed[m
[31m-       (SSL: error:0B080074:x509 certificate routines:[m
[31m-        X509_check_private_key:key values mismatch)[m
[31m-[m
[31m-[m
[31m-[m
[31m-because nginx has tried to use the private key with the bundle’s[m
[31m-first certificate instead of the server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Browsers usually store intermediate certificates which they receive[m
[31m-and which are signed by trusted authorities, so actively used browsers[m
[31m-may already have the required intermediate certificates and[m
[31m-may not complain about a certificate sent without a chained bundle.[m
[31m-To ensure the server sends the complete certificate chain,[m
[31m-the C<openssl> command-line utility may be used, for example:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    $ openssl s_client -connect www.godaddy.com:443[m
[31m-    ...[m
[31m-    Certificate chain[m
[31m-     0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US[m
[31m-         /1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc[m
[31m-         /OU=MIS Department/<b>CN=www.GoDaddy.com</b>[m
[31m-         /serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)[m
[31m-       i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.[m
[31m-         /OU=http://certificates.godaddy.com/repository[m
[31m-         /CN=Go Daddy Secure Certification Authority[m
[31m-         /serialNumber=07969287[m
[31m-     1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.[m
[31m-         /OU=http://certificates.godaddy.com/repository[m
[31m-         /CN=Go Daddy Secure Certification Authority[m
[31m-         /serialNumber=07969287[m
[31m-       i:/C=US/O=The Go Daddy Group, Inc.[m
[31m-         /OU=Go Daddy Class 2 Certification Authority[m
[31m-     2 s:/C=US/O=The Go Daddy Group, Inc.[m
[31m-         /OU=Go Daddy Class 2 Certification Authority[m
[31m-       i:/L=ValiCert Validation Network/O=<b>ValiCert, Inc.</b>[m
[31m-         /OU=ValiCert Class 2 Policy Validation Authority[m
[31m-         /CN=http://www.valicert.com//emailAddress=info@valicert.com[m
[31m-    ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this example the subject (“I<s>”) of the[m
[31m-C<www.GoDaddy.com> server certificate #0 is signed by an issuer[m
[31m-(“I<i>”) which itself is the subject of the certificate #1,[m
[31m-which is signed by an issuer which itself is the subject of the certificate #2,[m
[31m-which signed by the well-known issuer I<ValiCert, Inc.>[m
[31m-whose certificate is stored in the browsers’ built-in[m
[31m-certificate base (that lay in the house that Jack built).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a certificate bundle has not been added, only the server certificate #0[m
[31m-will be shown.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 A single HTTP/HTTPS server[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is possible to configure a single server that handles both HTTP[m
[31m-and HTTPS requests:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen              80;[m
[31m-        listen              443 ssl;[m
[31m-        server_name         www.example.com;[m
[31m-        ssl_certificate     www.example.com.crt;[m
[31m-        ssl_certificate_key www.example.com.key;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to 0.7.14 SSL could not be enabled selectively for[m
[31m-individual listening sockets, as shown above.[m
[31m-SSL could only be enabled for the entire server using the[m
[31m-L<ngx_http_ssl_module> directive,[m
[31m-making it impossible to set up a single HTTPE<sol>HTTPS server.[m
[31m-The C<ssl> parameter of the[m
[31m-L<ngx_http_core_module> directive[m
[31m-was added to solve this issue.[m
[31m-The use of the[m
[31m-L<ngx_http_ssl_module> directive[m
[31m-in modern versions is thus discouraged.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name-based HTTPS servers[m
[31m-[m
[31m-[m
[31m-[m
[31m-A common issue arises when configuring two or more HTTPS servers[m
[31m-listening on a single IP address:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen          443 ssl;[m
[31m-        server_name     www.example.com;[m
[31m-        ssl_certificate www.example.com.crt;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen          443 ssl;[m
[31m-        server_name     www.example.org;[m
[31m-        ssl_certificate www.example.org.crt;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-With this configuration a browser receives the default server’s certificate,[m
[31m-i.e. C<www.example.com> regardless of the requested server name.[m
[31m-This is caused by SSL protocol behaviour.[m
[31m-The SSL connection is established before the browser sends an HTTP request[m
[31m-and nginx does not know the name of the requested server.[m
[31m-Therefore, it may only offer the default server’s certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The oldest and most robust method to resolve the issue[m
[31m-is to assign a separate IP address for every HTTPS server:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen          192.168.1.1:443 ssl;[m
[31m-        server_name     www.example.com;[m
[31m-        ssl_certificate www.example.com.crt;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen          192.168.1.2:443 ssl;[m
[31m-        server_name     www.example.org;[m
[31m-        ssl_certificate www.example.org.crt;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 An SSL certificate with several names[m
[31m-[m
[31m-[m
[31m-[m
[31m-There are other ways that allow sharing a single IP address[m
[31m-between several HTTPS servers.[m
[31m-However, all of them have their drawbacks.[m
[31m-One way is to use a certificate with several names in[m
[31m-the SubjectAltName certificate field, for example,[m
[31m-C<www.example.com> and C<www.example.org>.[m
[31m-However, the SubjectAltName field length is limited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Another way is to use a certificate with a wildcard name, for example,[m
[31m-C<*.example.org>.[m
[31m-A wildcard certificate secures all subdomains of the specified domain,[m
[31m-but only on one level.[m
[31m-This certificate matches C<www.example.org>, but does not match[m
[31m-C<example.org> and C<www.sub.example.org>.[m
[31m-These two methods can also be combined.[m
[31m-A certificate may contain exact and wildcard names in the[m
[31m-SubjectAltName field, for example,[m
[31m-C<example.org> and C<*.example.org>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is better to place a certificate file with several names and[m
[31m-its private key file at the I<http> level of configuration[m
[31m-to inherit their single memory copy in all servers:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    ssl_certificate     common.crt;[m
[31m-    ssl_certificate_key common.key;[m
[31m-    [m
[31m-    server {[m
[31m-        listen          443 ssl;[m
[31m-        server_name     www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen          443 ssl;[m
[31m-        server_name     www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Server Name Indication[m
[31m-[m
[31m-[m
[31m-[m
[31m-A more generic solution for running several HTTPS servers on a single[m
[31m-IP address is[m
[31m-L<TLS[m
[31m-Server Name Indication extension|http://en.wikipedia.org/wiki/Server_Name_Indication> (SNI, RFC 6066),[m
[31m-which allows a browser to pass a requested server name during the SSL handshake[m
[31m-and, therefore, the server will know which certificate it should use[m
[31m-for the connection.[m
[31m-However, SNI has limited browser support.[m
[31m-Currently it is supported starting with the following browsers versions:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Opera 8.0;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-MSIE 7.0 (but only on Windows Vista or higher);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Firefox 2.0 and other browsers using Mozilla Platform rv:1.8.1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Safari 3.2.1 (Windows version supports SNI on Vista or higher);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and Chrome (Windows version supports SNI on Vista or higher, too).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Only domain names can be passed in SNI,[m
[31m-however some browsers may erroneously pass an IP address of the server[m
[31m-as its name if a request includes literal IP address.[m
[31m-One should not rely on this.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order to use SNI in nginx, it must be supported in both the[m
[31m-OpenSSL library with which the nginx binary has been built as well as[m
[31m-the library to which it is being dynamically linked at run time.[m
[31m-OpenSSL supports SNI since 0.9.8f version if it was built with config option[m
[31m-“--enable-tlsext”.[m
[31m-Since OpenSSL 0.9.8j this option is enabled by default.[m
[31m-If nginx was built with SNI support, then nginx will show this[m
[31m-when run with the “-V” switch:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    $ nginx -V[m
[31m-    ...[m
[31m-    TLS SNI support enabled[m
[31m-    ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, if the SNI-enabled nginx is linked dynamically to[m
[31m-an OpenSSL library without SNI support, nginx displays the warning:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    nginx was built with SNI support, however, now it is linked[m
[31m-    dynamically to an OpenSSL library which has no tlsext support,[m
[31m-    therefore SNI is not available[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The SNI support status has been shown by the “-V” switch[m
[31m-since 0.8.21 and 0.7.62.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<ssl> parameter of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive has been supported since 0.7.14.[m
[31m-Prior to 0.8.21 it could only be specified along with the[m
[31m-C<default> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-SNI has been supported since 0.5.32.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The shared SSL session cache has been supported since 0.5.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 1.9.1 and later: the default SSL protocols are TLSv1,[m
[31m-TLSv1.1, and TLSv1.2 (if supported by the OpenSSL library).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.7.65, 0.8.19 and later: the default SSL protocols are SSLv3, TLSv1,[m
[31m-TLSv1.1, and TLSv1.2 (if supported by the OpenSSL library).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.7.64, 0.8.18 and earlier: the default SSL protocols are SSLv2,[m
[31m-SSLv3, and TLSv1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 1.0.5 and later: the default SSL ciphers are[m
[31m-“C<HIGH:!aNULL:!MD5>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.7.65, 0.8.20 and later: the default SSL ciphers are[m
[31m-“C<HIGH:!ADH:!MD5>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.8.19: the default SSL ciphers are[m
[31m-“C<ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Version 0.7.64, 0.8.18 and earlier: the default SSL ciphers are[m
[31m-[m
[31m-[m
[31m-“C<ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/contributing_changes.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/contributing_changes.pod[m
[1mdeleted file mode 100644[m
[1mindex 7c3dd78..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/contributing_changes.pod[m
[1m+++ /dev/null[m
[36m@@ -1,192 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-contributing_changes - Contributing Changes[m
[31m-[m
[31m-[m
[31m-=head1 Getting Sources[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Mercurial|http://mercurial.selenic.com> is used[m
[31m-to store source code.[m
[31m-The L<repository|http://hg.nginx.org/nginx> can be cloned[m
[31m-with the following command:[m
[31m-[m
[31m-    [m
[31m-    hg clone http://hg.nginx.org/nginx[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Formatting Changes[m
[31m-[m
[31m-[m
[31m-[m
[31m-Changes should be formatted according to the code style used by nginx.[m
[31m-Code formatting should not rely on such editor features like syntax[m
[31m-highlighting or automatic line breaking.[m
[31m-Below are some basic rules:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-maximum text width is 80 characters[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-indentation is four spaces[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-no tabs[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-logical code blocks in a file are separated with two empty lines[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Examine how existing nginx sources are formatted and mimic this style[m
[31m-in your code.[m
[31m-Changes will more likely be accepted if style corresponds to the surrounding[m
[31m-code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Commit the changes to create a Mercurial[m
[31m-L<changeset|http://mercurial.selenic.com/wiki/ChangeSet>.[m
[31m-Please ensure that the specified[m
[31m-L<e-mail|http://mercurial.selenic.com/wiki/QuickStart#Setting_a_username>[m
[31m-address and real name of the change’s author are correct.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The commit message should have a single-line synopsis followed by verbose[m
[31m-description after an empty line.[m
[31m-It is desirable that the first line is no longer than 67 symbols.[m
[31m-The resulting changeset as a patch can be obtained using the[m
[31m-C<hg export> command:[m
[31m-[m
[31m-    [m
[31m-    # HG changeset patch[m
[31m-    # User Filipe Da Silva <username@example.com>[m
[31m-    # Date 1368089668 -7200[m
[31m-    #      Thu May 09 10:54:28 2013 +0200[m
[31m-    # Node ID 2220de0521ca2c0b664a8ea1e201ce1cb90fd7a2[m
[31m-    # Parent  822b82191940ef309cd1e6502f94d50d811252a1[m
[31m-    Mail: removed surplus ngx_close_connection() call.[m
[31m-    [m
[31m-    It is already called for a peer connection a few lines above.[m
[31m-    [m
[31m-    diff -r 822b82191940 -r 2220de0521ca src/mail/ngx_mail_auth_http_module.c[m
[31m-    --- a/src/mail/ngx_mail_auth_http_module.c      Wed May 15 15:04:49 2013 +0400[m
[31m-    +++ b/src/mail/ngx_mail_auth_http_module.c      Thu May 09 10:54:28 2013 +0200[m
[31m-    @@ -699,7 +699,6 @@ ngx_mail_auth_http_process_headers(ngx_m[m
[31m-    [m
[31m-                         p = ngx_pnalloc(s->connection->pool, ctx->err.len);[m
[31m-                         if (p == NULL) {[m
[31m-    -                        ngx_close_connection(ctx->peer.connection);[m
[31m-                             ngx_destroy_pool(ctx->pool);[m
[31m-                             ngx_mail_session_internal_server_error(s);[m
[31m-                             return;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Before Submitting[m
[31m-[m
[31m-[m
[31m-[m
[31m-Several points are worth to consider before submitting changes:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The proposed changes should work properly on a wide range of[m
[31m-L<supported[m
[31m-platforms|index>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Try to make it clear why the suggested change is needed, and provide a use[m
[31m-case, if possible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Passing your changes through the test suite is a good way to ensure[m
[31m-that they do not cause a regression.[m
[31m-The L<repository|http://hg.nginx.org/nginx-tests> with[m
[31m-tests can be cloned with the following command:[m
[31m-[m
[31m-    [m
[31m-    hg clone http://hg.nginx.org/nginx-tests[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Submitting Changes[m
[31m-[m
[31m-[m
[31m-[m
[31m-The proposed changes should be sent to the[m
[31m-L<nginx development|support>[m
[31m-mailing list.[m
[31m-The preferred and convenient method of submitting changesets[m
[31m-is with the[m
[31m-L<patchbomb|http://mercurial.selenic.com/wiki/PatchbombExtension>[m
[31m-extension.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 License[m
[31m-[m
[31m-[m
[31m-[m
[31m-Submitting changes implies granting project a permission to use it under[m
[31m-an appropriate L<license|../../LICENSE>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/control.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/control.pod[m
[1mdeleted file mode 100644[m
[1mindex 906dd10..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/control.pod[m
[1m+++ /dev/null[m
[36m@@ -1,279 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-control - Controlling nginx[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx can be controlled with signals.[m
[31m-The process ID of the master process is written to the file[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>logsE<sol>nginx.pid> by default.[m
[31m-This name may be changed at configuration time, or in[m
[31m-F<nginx.conf> using the[m
[31m-L<ngx_core_module>[m
[31m-directive.[m
[31m-The master process supports the following signals:[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-[m
[31m-TERM, INT                          fast shutdown[m
[31m-     QUIT                      graceful shutdown[m
[31m-     USR1                   re-opening log files[m
[31m-     USR2           upgrading an executable file[m
[31m-    WINCH  graceful shutdown of worker processes[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Individual worker processes can be controlled with signals as well,[m
[31m-though it is not required.[m
[31m-The supported signals are:[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-[m
[31m-TERM, INT         fast shutdown[m
[31m-     QUIT     graceful shutdown[m
[31m-     USR1  re-opening log files[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changing Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order for nginx to re-read the configuration file, a HUP[m
[31m-signal should be sent to the master process.[m
[31m-The master process first checks the syntax validity, then tries[m
[31m-to apply new configuration, that is, to open log files and new[m
[31m-listen sockets.[m
[31m-If this fails, it rolls back changes and continues to work[m
[31m-with old configuration.[m
[31m-If this succeeds, it starts new worker processes, and[m
[31m-sends messages to old worker processes requesting them to[m
[31m-shut down gracefully.[m
[31m-Old worker processes close listen sockets and continue to service[m
[31m-old clients.[m
[31m-After all clients are serviced, old worker processes are shut down.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Let’s illustrate this by example.[m
[31m-Imagine that nginx is run on FreeBSD 4.x and the command[m
[31m-[m
[31m-    [m
[31m-    ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'[m
[31m-[m
[31m-[m
[31m-produces the following output:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33127 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)[m
[31m-    33128 33126 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    33129 33126 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If HUP is sent to the master process, the output becomes:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33129 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)[m
[31m-    33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33135 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One of the old worker processes with PID 33129 still continues to work.[m
[31m-After some time it exits:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33135 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Rotating Log-files[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order to rotate log files, they need to be renamed first.[m
[31m-After that USR1 signal should be sent to the master process.[m
[31m-The master process will then re-open all currently open log files and[m
[31m-assign them an unprivileged user under which the worker processes[m
[31m-are running, as an owner.[m
[31m-After successful re-opening, the master process closes all open files and[m
[31m-sends the message to worker process to ask them to re-open files.[m
[31m-Worker processes also open new files and close old files right away.[m
[31m-As a result, old files are almost immediately available for post[m
[31m-processing, such as compression.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Upgrading Executable on the Fly[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order to upgrade the server executable, the new executable file[m
[31m-should be put in place of an old file first.[m
[31m-After that USR2 signal should be sent to the master process.[m
[31m-The master process first renames its file with the process ID to a[m
[31m-new file with the F<.oldbin> suffix, e.g.[m
[31m-F<E<sol>usrE<sol>localE<sol>nginxE<sol>logsE<sol>nginx.pid.oldbin>,[m
[31m-then starts a new executable file that in turn starts new[m
[31m-worker processes:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)[m
[31m-    33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)[m
[31m-    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-After that all worker processes (old and new ones) continue to accept requests.[m
[31m-If the WINCH signal is sent to the first master process, it will[m
[31m-send messages to its worker processes, requesting them to shut[m
[31m-down gracefully, and they will start to exit:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    33135 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)[m
[31m-    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-After some time, only the new worker processes will process requests:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be noted that the old master process does not close its listen[m
[31m-sockets, and it can be managed to start its worker processes again if needed.[m
[31m-If for some reason the new executable file works unacceptably, one of the[m
[31m-following can be done:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-Send the HUP signal to the old master process.[m
[31m-The old master process will start new worker processes[m
[31m-without re-reading the configuration.[m
[31m-After that, all new processes can be shut down gracefully,[m
[31m-by sending the QUIT signal to the new master process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-Send the TERM signal to the new master process.[m
[31m-It will then send a message to its worker processes requesting them[m
[31m-to exit immediately, and they will all exit almost immediately.[m
[31m-(If new processes do not exit for some reason,[m
[31m-the KILL signal should be sent to them to force them to exit.)[m
[31m-When the new master process exits, the old master process will start new[m
[31m-worker processes automatically.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the new master process exits then the old master process discards[m
[31m-the F<.oldbin> suffix from the file name with the process ID.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If upgrade was successful, then the old master process should be sent[m
[31m-the QUIT signal, and only new processes will stay:[m
[31m-[m
[31m-    [m
[31m-      PID  PPID USER    %CPU   VSZ WCHAN  COMMAND[m
[31m-    36264     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx[m
[31m-    36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-    36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/converting_rewrite_rules.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/converting_rewrite_rules.pod[m
[1mdeleted file mode 100644[m
[1mindex 18440dc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/converting_rewrite_rules.pod[m
[1m+++ /dev/null[m
[36m@@ -1,175 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-converting_rewrite_rules - Converting rewrite rules[m
[31m-[m
[31m-[m
[31m-=head1 A redirect to a main site[m
[31m-[m
[31m-[m
[31m-[m
[31m-People who during their shared hosting life used to configure[m
[31m-I<everything> using I<only> ApacheE<rsquo>s .htaccess files,[m
[31m-usually translate the following rules:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    RewriteCond  %{HTTP_HOST}  example.org[m
[31m-    RewriteRule  (.*)          http://www.example.org$1[m
[31m-[m
[31m-[m
[31m-[m
[31m-to something like this:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  www.example.org  example.org;[m
[31m-        if ($http_host = example.org) {[m
[31m-            rewrite  (.*)  http://www.example.org$1;[m
[31m-        }[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This is a wrong, cumbersome, and ineffective way.[m
[31m-The right way is to define a separate server for C<example.org>:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org;[m
[31m-        return       301 http://www.example.org$request_uri;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-On versions prior to 0.9.1, redirects can be made with:[m
[31m-[m
[31m-    [m
[31m-        rewrite      ^ http://www.example.org$request_uri?;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-Another example.[m
[31m-Instead of the E<ldquo>upside-downE<rdquo> logic E<ldquo>all that is not[m
[31m-C<example.com> and is not C<www.example.com>E<rdquo>:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    RewriteCond  %{HTTP_HOST}  !example.com[m
[31m-    RewriteCond  %{HTTP_HOST}  !www.example.com[m
[31m-    RewriteRule  (.*)          http://www.example.com$1[m
[31m-[m
[31m-[m
[31m-[m
[31m-one should simply define C<example.com>, C<www.example.com>,[m
[31m-and E<ldquo>everything elseE<rdquo>:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.com www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80 default_server;[m
[31m-        server_name  _;[m
[31m-        return       301 http://example.com$request_uri;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-On versions prior to 0.9.1, redirects can be made with:[m
[31m-[m
[31m-    [m
[31m-        rewrite      ^ http://example.com$request_uri?;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Converting Mongrel rules[m
[31m-[m
[31m-[m
[31m-[m
[31m-Typical Mongrel rules:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    DocumentRoot /var/www/myapp.com/current/public[m
[31m-    [m
[31m-    RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f[m
[31m-    RewriteCond %{SCRIPT_FILENAME} !maintenance.html[m
[31m-    RewriteRule ^.*$ %{DOCUMENT_ROOT}/system/maintenance.html [L][m
[31m-    [m
[31m-    RewriteCond %{REQUEST_FILENAME} -f[m
[31m-    RewriteRule ^(.*)$ $1 [QSA,L][m
[31m-    [m
[31m-    RewriteCond %{REQUEST_FILENAME}/index.html -f[m
[31m-    RewriteRule ^(.*)$ $1/index.html [QSA,L][m
[31m-    [m
[31m-    RewriteCond %{REQUEST_FILENAME}.html -f[m
[31m-    RewriteRule ^(.*)$ $1.html [QSA,L][m
[31m-    [m
[31m-    RewriteRule ^/(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L][m
[31m-[m
[31m-[m
[31m-[m
[31m-should be converted to[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        root       /var/www/myapp.com/current/public;[m
[31m-    [m
[31m-        try_files  /system/maintenance.html[m
[31m-                   $uri  $uri/index.html $uri.html[m
[31m-                   @mongrel;[m
[31m-    }[m
[31m-    [m
[31m-    location @mongrel {[m
[31m-        proxy_pass  http://mongrel;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/daemon_master_process_off.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/daemon_master_process_off.pod[m
[1mdeleted file mode 100644[m
[1mindex 5729fef..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/daemon_master_process_off.pod[m
[1m+++ /dev/null[m
[36m@@ -1,53 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-daemon_master_process_off[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-Can I run nginx with "daemon off" or "master_process off" settings[m
[31m-in a production environment?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-First of all, both "daemon onE<verbar>off" and "master_process onE<verbar>off" directives were[m
[31m-intended to be used primarily for nginx code development.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-While many people use "daemon off" in production it wasn’t really meant for[m
[31m-that. Since version 1.0.9 it is now quite safe to run nginx in production[m
[31m-with "daemon off", though. Bear in mind that non-stop upgrade is not an[m
[31m-option with "daemon off".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In a development environment, using "master_process off", nginx can run in[m
[31m-the foreground without the master process and can be terminated simply[m
[31m-with ^C (SIGINT). This is somewhat similar to running Apache with[m
[31m-an 'X' command-line option. However you should NEVER run nginx in production[m
[31m-with "master_process off".[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/debugging_log.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/debugging_log.pod[m
[1mdeleted file mode 100644[m
[1mindex f14f054..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/debugging_log.pod[m
[1m+++ /dev/null[m
[36m@@ -1,145 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-debugging_log - A debugging log[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-To enable a debugging log, nginx needs to be configured to support[m
[31m-debugging during the build:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    ./configure --with-debug ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-Then the C<debug> level should be set with the[m
[31m-L<ngx_core_module> directive:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    error_log /path/to/log debug;[m
[31m-[m
[31m-[m
[31m-[m
[31m-To verify that nginx is configured to support debugging,[m
[31m-run the C<nginx -V> command:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    configure arguments: --with-debug ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-Pre-built L<Linux|linux_packages> packages[m
[31m-provide out-of-the-box support for debugging log with[m
[31m-the C<nginx-debug> binary (1.9.8)[m
[31m-which can be run using commands[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    service nginx stop[m
[31m-    service nginx-debug start[m
[31m-[m
[31m-[m
[31m-[m
[31m-and then set the C<debug> level.[m
[31m-The nginx binary version for Windows is always built with the debugging log[m
[31m-support, so only setting the C<debug> level will suffice.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that redefining the log without also specifying the[m
[31m-C<debug>[m
[31m-level will disable the debugging log.[m
[31m-In the example below, redefining the log on the[m
[31m-L<ngx_http_core_module>[m
[31m-level disables the debugging log for this server:[m
[31m-[m
[31m-    [m
[31m-    error_log /path/to/log debug;[m
[31m-    [m
[31m-    http {[m
[31m-        server {[m
[31m-            error_log /path/to/log;[m
[31m-            ...[m
[31m-[m
[31m-[m
[31m-To avoid this, either the line redefining the log should be[m
[31m-commented out, or the C<debug> level specification should[m
[31m-also be added:[m
[31m-[m
[31m-    [m
[31m-    error_log /path/to/log debug;[m
[31m-    [m
[31m-    http {[m
[31m-        server {[m
[31m-            error_log /path/to/log debug;[m
[31m-            ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Debugging log for selected clients[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to enable the debugging log for[m
[31m-L<selected[m
[31m-client addresses|ngx_core_module> only:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    error_log /path/to/log;[m
[31m-    [m
[31m-    events {[m
[31m-        debug_connection 192.168.1.1;[m
[31m-        debug_connection 192.168.10.0/24;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Logging to a cyclic memory buffer[m
[31m-[m
[31m-[m
[31m-[m
[31m-The debugging log can be written to a cyclic memory buffer:[m
[31m-[m
[31m-    [m
[31m-    error_log memory:32m debug;[m
[31m-[m
[31m-[m
[31m-Logging to the memory buffer on the C<debug> level[m
[31m-does not have significant impact on performance even under high load.[m
[31m-In this case, the log can be extracted using[m
[31m-a C<gdb> script like the following one:[m
[31m-[m
[31m-    [m
[31m-    set $log = ngx_cycle->log[m
[31m-    [m
[31m-    while $log->writer != ngx_log_memory_writer[m
[31m-        set $log = $log->next[m
[31m-    end[m
[31m-    [m
[31m-    set $buf = (ngx_log_memory_buf_t *) $log->wdata[m
[31m-    dump binary memory debug_log.txt $buf->start $buf->end[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/events.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/events.pod[m
[1mdeleted file mode 100644[m
[1mindex 53bb4ad..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/events.pod[m
[1m+++ /dev/null[m
[36m@@ -1,120 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-events - Connection processing methods[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx supports a variety of connection processing methods.[m
[31m-The availability of a particular method depends on the platform used.[m
[31m-On platforms that support several methods nginx will normally[m
[31m-select the most efficient method automatically.[m
[31m-However, if needed, a connection processing method can be selected[m
[31m-explicitly with the[m
[31m-L<ngx_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following connection processing methods are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<select>E<mdash>standard method.[m
[31m-The supporting module is built automatically on platforms that lack[m
[31m-more efficient methods.[m
[31m-The C<--with-select_module> and[m
[31m-C<--without-select_module> configuration parameters[m
[31m-can be used to forcibly enable or disable the build of this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<poll>E<mdash>standard method.[m
[31m-The supporting module is built automatically on platforms that lack[m
[31m-more efficient methods.[m
[31m-The C<--with-poll_module> and[m
[31m-C<--without-poll_module> configuration parameters[m
[31m-can be used to forcibly enable or disable the build of this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<kqueue>E<mdash>efficient method used on[m
[31m-FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0, and Mac OS X.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<epoll>E<mdash>efficient method used on[m
[31m-Linux 2.6+.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Some older distributions like SuSE 8.2 provide patches[m
[31m-that add epoll support to 2.4 kernels.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<E<sol>devE<sol>poll>E<mdash>efficient method used on[m
[31m-Solaris 7 11E<sol>99+, HPE<sol>UX 11.22+ (eventport), IRIX 6.5.15+,[m
[31m-and Tru64 UNIX 5.1A+.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<eventport>E<mdash>event ports, efficient method[m
[31m-used on Solaris 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/example.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/example.pod[m
[1mdeleted file mode 100644[m
[1mindex f41d001..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/example.pod[m
[1m+++ /dev/null[m
[36m@@ -1,158 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-example - Example nginx configuration[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-An example site configuration that passes all requests to the backend except[m
[31m-images and requests starting with "E<sol>downloadE<sol>".[m
[31m-[m
[31m-    [m
[31m-    user  www www;[m
[31m-    [m
[31m-    worker_processes  2;[m
[31m-    [m
[31m-    pid /var/run/nginx.pid;[m
[31m-    [m
[31m-    #                          [ debug | info | notice | warn | error | crit ][m
[31m-    [m
[31m-    error_log  /var/log/nginx.error_log  info;[m
[31m-    [m
[31m-    events {[m
[31m-        worker_connections   2000;[m
[31m-    [m
[31m-        # use [ kqueue | epoll | /dev/poll | select | poll ];[m
[31m-        use kqueue;[m
[31m-    }[m
[31m-    [m
[31m-    http {[m
[31m-    [m
[31m-        include       conf/mime.types;[m
[31m-        default_type  application/octet-stream;[m
[31m-    [m
[31m-    [m
[31m-        log_format main      '$remote_addr - $remote_user [$time_local] '[m
[31m-                             '"$request" $status $bytes_sent '[m
[31m-                             '"$http_referer" "$http_user_agent" '[m
[31m-                             '"$gzip_ratio"';[m
[31m-    [m
[31m-        log_format download  '$remote_addr - $remote_user [$time_local] '[m
[31m-                             '"$request" $status $bytes_sent '[m
[31m-                             '"$http_referer" "$http_user_agent" '[m
[31m-                             '"$http_range" "$sent_http_content_range"';[m
[31m-    [m
[31m-        client_header_timeout  3m;[m
[31m-        client_body_timeout    3m;[m
[31m-        send_timeout           3m;[m
[31m-    <!--[m
[31m-        connection_pool_size         256;[m
[31m-    -->[m
[31m-        client_header_buffer_size    1k;[m
[31m-        large_client_header_buffers  4 4k;[m
[31m-    <!--[m
[31m-        request_pool_size            4k;[m
[31m-    -->[m
[31m-        gzip on;[m
[31m-        gzip_min_length  1100;[m
[31m-        gzip_buffers     4 8k;[m
[31m-        gzip_types       text/plain;[m
[31m-    [m
[31m-        output_buffers   1 32k;[m
[31m-        postpone_output  1460;[m
[31m-    [m
[31m-        sendfile         on;[m
[31m-        tcp_nopush       on;[m
[31m-        tcp_nodelay      on;[m
[31m-        send_lowat       12000;[m
[31m-    [m
[31m-        keepalive_timeout  75 20;[m
[31m-    [m
[31m-        #lingering_time     30;[m
[31m-        #lingering_timeout  10;[m
[31m-        #reset_timedout_connection  on;[m
[31m-    [m
[31m-    [m
[31m-        server {[m
[31m-            listen        one.example.com;[m
[31m-            server_name   one.example.com  www.one.example.com;[m
[31m-    [m
[31m-            access_log   /var/log/nginx.access_log  main;[m
[31m-    [m
[31m-            location / {[m
[31m-                proxy_pass         http://127.0.0.1/;[m
[31m-                proxy_redirect     off;[m
[31m-    [m
[31m-                proxy_set_header   Host             $host;[m
[31m-                proxy_set_header   X-Real-IP        $remote_addr;[m
[31m-                #proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;[m
[31m-    [m
[31m-                client_max_body_size       10m;[m
[31m-                client_body_buffer_size    128k;[m
[31m-    [m
[31m-                client_body_temp_path      /var/nginx/client_body_temp;[m
[31m-    [m
[31m-                proxy_connect_timeout      70;[m
[31m-                proxy_send_timeout         90;[m
[31m-                proxy_read_timeout         90;[m
[31m-                proxy_send_lowat           12000;[m
[31m-    [m
[31m-                proxy_buffer_size          4k;[m
[31m-                proxy_buffers              4 32k;[m
[31m-                proxy_busy_buffers_size    64k;[m
[31m-                proxy_temp_file_write_size 64k;[m
[31m-    [m
[31m-                proxy_temp_path            /var/nginx/proxy_temp;[m
[31m-    [m
[31m-                charset  koi8-r;[m
[31m-            }[m
[31m-    [m
[31m-            error_page  404  /404.html;[m
[31m-    [m
[31m-            location /404.html {[m
[31m-                root  /spool/www;[m
[31m-            }[m
[31m-    [m
[31m-            location /old_stuff/ {[m
[31m-                rewrite   ^/old_stuff/(.*)$  /new_stuff/$1  permanent;[m
[31m-            }[m
[31m-    [m
[31m-            location /download/ {[m
[31m-    [m
[31m-                valid_referers  none  blocked  server_names  *.example.com;[m
[31m-    [m
[31m-                if ($invalid_referer) {[m
[31m-                    #rewrite   ^/   http://www.example.com/;[m
[31m-                    return   403;[m
[31m-                }[m
[31m-    [m
[31m-                #rewrite_log  on;[m
[31m-    [m
[31m-                # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3[m
[31m-                rewrite ^/(download/.*)/mp3/(.*)\..*$[m
[31m-                        /$1/mp3/$2.mp3                   break;[m
[31m-    [m
[31m-                root         /spool/www;[m
[31m-                #autoindex    on;[m
[31m-                access_log   /var/log/nginx-download.access_log  download;[m
[31m-            }[m
[31m-    [m
[31m-            location ~* \.(jpg|jpeg|gif)$ {[m
[31m-                root         /spool/www;[m
[31m-                access_log   off;[m
[31m-                expires      30d;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/faq.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/faq.pod[m
[1mdeleted file mode 100644[m
[1mindex 4a38d5f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/faq.pod[m
[1m+++ /dev/null[m
[36m@@ -1,68 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-faq - FAQ[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<welcome_nginx_facebook>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<license_copyright>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<accept_failed>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<variables_in_config>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<daemon_master_process_off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<chunked_encoding_from_backend>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<sys_errlist>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/freebsd_tuning.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/freebsd_tuning.pod[m
[1mdeleted file mode 100644[m
[1mindex 39f44c1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/freebsd_tuning.pod[m
[1m+++ /dev/null[m
[36m@@ -1,332 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-freebsd_tuning - Tuning FreeBSD for the highload[m
[31m-[m
[31m-[m
[31m-=head1 Syncache and syncookies[m
[31m-[m
[31m-[m
[31m-[m
[31m-We look at how various kernel settings affect ability of the kernel[m
[31m-to process requests. LetE<rsquo>s start with TCPE<sol>IP connection establishment.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[ syncache, syncookies ][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Listen queues[m
[31m-[m
[31m-[m
[31m-[m
[31m-After the connection has been established it is placed in the listen queue[m
[31m-of the listen socket.[m
[31m-To see the current listen queues state, you may run the command[m
[31m-“C<netstat -Lan>”:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    Current listen queue sizes (qlen/incqlen/maxqlen)[m
[31m-    Proto Listen         Local Address[m
[31m-    tcp4  <b>10</b>/0/128       *.80[m
[31m-    tcp4  0/0/128        *.22[m
[31m-[m
[31m-[m
[31m-[m
[31m-This is a normal case: the listen queue of the port *:80 contains[m
[31m-just 10 unaccepted connections.[m
[31m-If the web server is not able to handle the load, you may see[m
[31m-something like this:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    Current listen queue sizes (qlen/incqlen/maxqlen)[m
[31m-    Proto Listen         Local Address[m
[31m-    tcp4  <b>192/</b>0/<b>128</b>      *.80[m
[31m-    tcp4  0/0/128        *.22[m
[31m-[m
[31m-[m
[31m-[m
[31m-Here are 192 unaccepted connections and most likely new coming connections[m
[31m-are discarding. Although the limit is 128 connections, FreeBSD allows[m
[31m-receiving 1.5 times connections than the limit before it starts to discard[m
[31m-the new connections. You may increase the limit using[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    sysctl kern.ipc.somaxconn=4096[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, note that the queue is only a damper to quench bursts.[m
[31m-If it is always overflowed, this means that you need to improve the web server,[m
[31m-but not to continue to increase the limit.[m
[31m-You may also change the listen queue maximum size in nginx configuration:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    listen  80  backlog=1024;[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, you may not set it more than the current[m
[31m-F<kern.ipc.somaxconn> value.[m
[31m-By default nginx uses the maximum value of FreeBSD kernel.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Sockets and files[m
[31m-[m
[31m-[m
[31m-[m
[31m-[ sockets, files ][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Socket buffers[m
[31m-[m
[31m-[m
[31m-[m
[31m-When a client sends a data, the data first is received by the kernel[m
[31m-which places the data in the socket receiving buffer.[m
[31m-Then an application such as the web server[m
[31m-may call C<recv> or C<read> system calls[m
[31m-to get the data from the buffer.[m
[31m-When the application wants to send a data, it calls[m
[31m-C<send> or C<write>[m
[31m-system calls to place the data in the socket sending buffer.[m
[31m-Then the kernel manages to send the data from the buffer to the client.[m
[31m-In modern FreeBSD versions the default sizes of the socket receiving[m
[31m-and sending buffers are respectively 64K and 32K.[m
[31m-You may change them on the fly using the sysctls[m
[31m-F<net.inet.tcp.recvspace> and[m
[31m-F<net.inet.tcp.sendspace>.[m
[31m-Of course the bigger buffer sizes may increase throughput,[m
[31m-because connections may use bigger TCP sliding windows sizes.[m
[31m-And on the Internet you may see recommendations to increase[m
[31m-the buffer sizes to one or even several megabytes.[m
[31m-However, such large buffer sizes are suitable for local networks[m
[31m-or for networks under your control.[m
[31m-Since on the Internet a slow modem client may ask a large file[m
[31m-and then it will download the file during several minutes if not hours.[m
[31m-All this time the megabyte buffer will be bound to the slow client,[m
[31m-although we may devote just several kilobytes to it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is one more advantage of the large sending buffers for[m
[31m-the web servers such as Apache which use the blocking IE<sol>O system calls.[m
[31m-The server may place a whole large response in the sending buffer, then may[m
[31m-close the connection, and let the kernel to send the response to a slow client,[m
[31m-while the server is ready to serve other requests.[m
[31m-You should decide what is it better to bind to a client in your case:[m
[31m-a tens megabytes ApacheE<sol>mod_perl process[m
[31m-or the hundreds kilobytes socket sending buffer.[m
[31m-Note that nginx uses non-blocking IE<sol>O system calls[m
[31m-and devotes just tens kilobytes to connections,[m
[31m-therefore it does not require the large buffer sizes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[ dynamic buffers ][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 mbufs, mbuf clusters, etc.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Inside the kernel the buffers are stored in the form of chains of[m
[31m-memory chunks linked using the I<mbuf> structures.[m
[31m-The mbuf size is 256 bytes and it can be used to store a small amount[m
[31m-of data, for example, TCPE<sol>IP header. However, the mbufs point mostly[m
[31m-to other data stored in the I<mbuf clusters> or I<jumbo clusters>,[m
[31m-and in this kind they are used as the chain links only.[m
[31m-The mbuf cluster size is 2K.[m
[31m-The jumbo cluster size can be equal to a CPU page size (4K for i386 and amd64),[m
[31m-9K, or 16K.[m
[31m-The 9K and 16K jumbo clusters are used mainly in local networks with Ethernet[m
[31m-frames larger than usual 1500 bytes, and they are beyond the scope of[m
[31m-this article.[m
[31m-The page size jumbo clusters are usually used for sending only,[m
[31m-while the mbuf clusters are used for both sending and receiving.[m
[31m-[m
[31m-To see the current usage of the mbufs and clusters and their limits,[m
[31m-you may run the command “C<netstat -m>”.[m
[31m-Here is a sample from FreeBSD 7.2E<sol>amd64 with the default settings:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    1477/<b>3773/5250 mbufs</b> in use (current/cache/total)[m
[31m-    771/2203/<b>2974/25600 mbuf clusters</b> in use (current/cache/total/max)[m
[31m-    771/1969 mbuf+clusters out of packet secondary zone in use[m
[31m-       (current/cache)[m
[31m-    296/863/<b>1159/12800 4k (page size) jumbo clusters</b> in use[m
[31m-       (current/cache/total/max)[m
[31m-    0/0/0/6400 9k jumbo clusters in use (current/cache/total/max)[m
[31m-    0/0/0/3200 16k jumbo clusters in use (current/cache/total/max)[m
[31m-    3095K/8801K/11896K bytes allocated to network(current/cache/total)[m
[31m-    0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters)[m
[31m-    0/0/0 requests for jumbo clusters denied (4k/9k/16k)[m
[31m-    0/0/0 sfbufs in use (current/peak/max)[m
[31m-    0 requests for sfbufs denied[m
[31m-    0 requests for sfbufs delayed[m
[31m-    523590 requests for I/O initiated by sendfile[m
[31m-    0 calls to protocol drain routines[m
[31m-[m
[31m-[m
[31m-[m
[31m-There are 12800 page size jumbo clusters,[m
[31m-therefore they can store only 50M of data.[m
[31m-If you set the F<net.inet.tcp.sendspace> to 1M,[m
[31m-then merely 50 slow clients will take all jumbo clusters[m
[31m-requesting large files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-You may increase the clusters limits on the fly using:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    sysctl kern.ipc.nmbclusters=200000[m
[31m-    sysctl kern.ipc.nmbjumbop=100000[m
[31m-[m
[31m-[m
[31m-[m
[31m-The former command increases the mbuf clusters limit[m
[31m-and the latter increases page size jumbo clusters limit.[m
[31m-Note that all allocated mbufs clusters will take about 440M physical memory:[m
[31m-(200000 E<times> (2048 + 256)) because each mbuf cluster requires also the mbuf.[m
[31m-All allocated page size jumbo clusters will take yet about 415M physical memory:[m
[31m-(100000 E<times> (4096 + 256)).[m
[31m-And together they may take 845M.[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The page size jumbo clusters have been introduced in FreeBSD 7.0.[m
[31m-In earlier versions you should tune only 2K mbuf clusters.[m
[31m-Prior to FreeBSD 6.2, the F<kern.ipc.nmbclusters> value can be[m
[31m-set only on the boot time via loader tunable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On the amd64 architecture FreeBSD kernel can use for sockets buffers[m
[31m-almost all physical memory,[m
[31m-while on the i386 architecture no more than 2G memory can be used,[m
[31m-regardless of the available physical memory.[m
[31m-We will discuss the i386 specific tuning later.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is way not to use the jumbo clusters while serving static files:[m
[31m-the I<sendfile()> system call.[m
[31m-The sendfile allows sending a file or its part to a socket directly[m
[31m-without reading the parts in an application buffer.[m
[31m-It creates the mbufs chain where the mbufs point to the file pages that are[m
[31m-already present in FreeBSD cache memory, and passes the chain to[m
[31m-the TCPE<sol>IP stack.[m
[31m-Thus, sendfile decreases both CPU usage by omitting two memory copy operations,[m
[31m-and memory usage by using the cached file pages.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-And again, the amd64 sendfile implementation is the best:[m
[31m-the zeros in the “C<netstat -m>” output[m
[31m-[m
[31m-    [m
[31m-    ...[m
[31m-    <b>0/0/0</b> sfbufs in use (current/peak/max)[m
[31m-    ...[m
[31m-[m
[31m-[m
[31m-mean that there is no I<sfbufs> limit,[m
[31m-while on i386 architecture you should to tune them.[m
[31m-[m
[31m-[m
[31m-=head1 Proxying[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    net.inet.ip.portrange.randomized=0[m
[31m-    net.inet.ip.portrange.first=1024[m
[31m-    net.inet.ip.portrange.last=65535[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Finalizing connection[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    net.inet.tcp.fast_finwait2_recycle=1[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 i386 specific tuning[m
[31m-[m
[31m-[m
[31m-[m
[31m-[ KVA, KVM, nsfbufs ][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Minor optimizations[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    sysctl kern.random.sys.harvest.ethernet=0[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/hash.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/hash.pod[m
[1mdeleted file mode 100644[m
[1mindex 058f0ff..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/hash.pod[m
[1m+++ /dev/null[m
[36m@@ -1,48 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-hash - Setting up hashes[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-To quickly process static sets of data such as server names,[m
[31m-L<ngx_http_map_module> directive’s values,[m
[31m-MIME types, names of request header strings,[m
[31m-nginx uses hash tables.[m
[31m-During the start and each re-configuration nginx selects the[m
[31m-minimum possible sizes of hash tables such that the bucket size[m
[31m-that stores keys with identical hash values does not exceed the[m
[31m-configured parameter (hash bucket size).[m
[31m-The size of a table is expressed in buckets.[m
[31m-The adjustment is continued until the table size exceeds the[m
[31m-hash max size parameter.[m
[31m-Most hashes have the corresponding directives that allow changing[m
[31m-these parameters, for example, for the server names hash they are[m
[31m-L<ngx_http_core_module>[m
[31m-and L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The hash bucket size parameter is aligned to the size that is a[m
[31m-multiple of the processor’s cache line size.  This speeds up[m
[31m-key search in a hash on modern processors by reducing the number[m
[31m-of memory accesses.[m
[31m-If hash bucket size is equal to one processor’s cache line size[m
[31m-then the number of memory accesses during the key search will be[m
[31m-two in the worst caseE<mdash>first to compute the bucket address,[m
[31m-and second during the key search inside the bucket.[m
[31m-Therefore, if nginx emits the message requesting to increase[m
[31m-either hash max size or hash bucket size then the first parameter[m
[31m-should first be increased.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/howto_build_on_win32.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/howto_build_on_win32.pod[m
[1mdeleted file mode 100644[m
[1mindex 40936d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/howto_build_on_win32.pod[m
[1m+++ /dev/null[m
[36m@@ -1,178 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-howto_build_on_win32 - Building nginx on the Win32 platform with Visual C[m
[31m-[m
[31m-[m
[31m-=head1 Prerequisites[m
[31m-[m
[31m-[m
[31m-[m
[31m-To build nginx on the Microsoft Win32 E<copy> platform you need:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Microsoft Visual C compiler. Microsoft Visual Studio E<copy>[m
[31m-8 and 10 are known to work.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<MSYS|http://www.mingw.org/wiki/MSYS>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Perl, if you want to build OpenSSL E<copy> and nginx with SSL support.[m
[31m-For example L<ActivePerl|http://www.activestate.com/activeperl>[m
[31m-or L<Strawberry Perl|http://strawberryperl.com>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Mercurial|http://mercurial.selenic.com/> client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<PCRE|http://www.pcre.org>, L<zlib|http://zlib.net>[m
[31m-and L<OpenSSL|http://www.openssl.org> libraries sources.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Build steps[m
[31m-[m
[31m-[m
[31m-[m
[31m-Ensure that paths to Perl, Mercurial and MSYS bin directories are added to[m
[31m-PATH environment variable before you start build. To set Visual C environment[m
[31m-run vcvarsall.bat script from Visual C directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To build nginx:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Start MSYS bash.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Check out nginx sources from the hg.nginx.org repository. For example:[m
[31m-[m
[31m-    [m
[31m-    hg clone http://hg.nginx.org/nginx[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Create a build and lib directories, and unpack zlib, PCRE and OpenSSL libraries[m
[31m-sources into lib directory:[m
[31m-[m
[31m-    [m
[31m-    mkdir objs[m
[31m-    mkdir objs/lib[m
[31m-    cd objs/lib[m
[31m-    tar -xzf ../../pcre-8.32.tar.gz[m
[31m-    tar -xzf ../../zlib-1.2.7.tar.gz[m
[31m-    tar -xzf ../../openssl-1.0.1e.tar.gz[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Run configure script:[m
[31m-[m
[31m-    [m
[31m-    auto/configure --with-cc=cl --builddir=objs --prefix= \[m
[31m-    --conf-path=conf/nginx.conf --pid-path=logs/nginx.pid \[m
[31m-    --http-log-path=logs/access.log --error-log-path=logs/error.log \[m
[31m-    --sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp \[m
[31m-    --http-proxy-temp-path=temp/proxy_temp \[m
[31m-    --http-fastcgi-temp-path=temp/fastcgi_temp \[m
[31m-    --with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=objs/lib/pcre-8.32 \[m
[31m-    --with-zlib=objs/lib/zlib-1.2.7 --with-openssl=objs/lib/openssl-1.0.1e \[m
[31m-    --with-select_module --with-http_ssl_module --with-ipv6[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Run make:[m
[31m-[m
[31m-    [m
[31m-    nmake -f objs/Makefile[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See also[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<windows>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/install.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/install.pod[m
[1mdeleted file mode 100644[m
[1mindex 6a03dce..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/install.pod[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-install - Installing nginx[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx can be installed differently, depending on the operating system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation on Linux[m
[31m-[m
[31m-[m
[31m-[m
[31m-For Linux, nginx L<packages|linux_packages>[m
[31m-from nginx.org can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation on FreeBSD[m
[31m-[m
[31m-[m
[31m-[m
[31m-On FreeBSD, nginx can be installed either from the L<packages|http://www.freebsd.org/doc/handbook/pkgng-intro.html>[m
[31m-or through the[m
[31m-L<ports|http://www.freebsd.org/doc/handbook/ports-using.html>[m
[31m-system.[m
[31m-The ports system provides greater flexibility, allowing selection among[m
[31m-a wide range of options.[m
[31m-The port will compile nginx with the specified options and install it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Building from Sources[m
[31m-[m
[31m-[m
[31m-[m
[31m-If some special functionality is required, not available with packages and[m
[31m-ports, nginx can also be compiled from source files.[m
[31m-While more flexible, this approach may be complex for a beginner.[m
[31m-For more information, see L<configure>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/license_copyright.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/license_copyright.pod[m
[1mdeleted file mode 100644[m
[1mindex 1718ef6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/license_copyright.pod[m
[1m+++ /dev/null[m
[36m@@ -1,51 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-license_copyright[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-I’d like to use nginx distribution as part of my proprietary[m
[31m-software package. How can nginx copyright be acknowledged[m
[31m-when using nginx as part of a proprietary software distribution?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-The text below should be added to your license conditions,[m
[31m-followed by the text of the applicable 2-clause BSD license described[m
[31m-L<here|http://nginx.org/LICENSE>.[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    This product contains software provided by Nginx, Inc. and its contributors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Also, if your build of nginx includes any of the following 3rd party[m
[31m-products: zlib, PCRE, OpenSSL E<8212> it’s worth including their[m
[31m-copyright acknowledgements and disclaimers as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/load_balancing.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/load_balancing.pod[m
[1mdeleted file mode 100644[m
[1mindex b2b8118..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/load_balancing.pod[m
[1m+++ /dev/null[m
[36m@@ -1,372 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-load_balancing - Using nginx as HTTP load balancer[m
[31m-[m
[31m-[m
[31m-=head1 Introduction[m
[31m-[m
[31m-[m
[31m-[m
[31m-Load balancing across multiple application instances is a commonly used[m
[31m-technique for optimizing resource utilization, maximizing throughput,[m
[31m-reducing latency, and ensuring fault-tolerant configurations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is possible to use nginx as a very efficient HTTP load balancer to[m
[31m-distribute traffic to several application servers and to improve[m
[31m-performance, scalability and reliability of web applications with nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Load balancing methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following load balancing mechanisms (or methods) are supported in[m
[31m-nginx:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-round-robin — requests to the application servers are distributed[m
[31m-in a round-robin fashion,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-least-connected — next request is assigned to the server with the[m
[31m-least number of active connections,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ip-hash — a hash-function is used to determine what server should[m
[31m-be selected for the next request (based on the client’s IP address).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Default load balancing configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-The simplest configuration for load balancing with nginx may look[m
[31m-like the following:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        upstream myapp1 {[m
[31m-            server srv1.example.com;[m
[31m-            server srv2.example.com;[m
[31m-            server srv3.example.com;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 80;[m
[31m-    [m
[31m-            location / {[m
[31m-                proxy_pass http://myapp1;[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In the example above, there are 3 instances of the same application[m
[31m-running on srv1-srv3.[m
[31m-When the load balancing method is not specifically configured,[m
[31m-it defaults to round-robin.[m
[31m-All requests are[m
[31m-L<proxied|ngx_http_proxy_module> to the server group myapp1, and nginx applies HTTP load[m
[31m-balancing to distribute the requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Reverse proxy implementation in nginx includes load balancing for HTTP,[m
[31m-HTTPS, FastCGI, uwsgi, SCGI, and memcached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To configure load balancing for HTTPS instead of HTTP, just use “https”[m
[31m-as the protocol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When setting up load balancing for FastCGI, uwsgi, SCGI, or memcached, use[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-L<ngx_http_scgi_module>, and[m
[31m-L<ngx_http_memcached_module>[m
[31m-directives respectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Least connected load balancing[m
[31m-[m
[31m-[m
[31m-[m
[31m-Another load balancing discipline is least-connected.[m
[31m-Least-connected allows controlling the load on application[m
[31m-instances more fairly in a situation when some of the requests[m
[31m-take longer to complete.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With the least-connected load balancing, nginx will try not to overload a[m
[31m-busy application server with excessive requests, distributing the new[m
[31m-requests to a less busy server instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Least-connected load balancing in nginx is activated when the[m
[31m-L<least_conn|ngx_http_upstream_module> directive is used as part of the server group configuration:[m
[31m-[m
[31m-    [m
[31m-        upstream myapp1 {[m
[31m-            least_conn;[m
[31m-            server srv1.example.com;[m
[31m-            server srv2.example.com;[m
[31m-            server srv3.example.com;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Session persistence[m
[31m-[m
[31m-[m
[31m-[m
[31m-Please note that with round-robin or least-connected load[m
[31m-balancing, each subsequent client’s request can be potentially[m
[31m-distributed to a different server.[m
[31m-There is no guarantee that the same client will be always[m
[31m-directed to the same server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If there is the need to tie a client to a particular application server —[m
[31m-in other words, make the client’s session “sticky” or “persistent” in[m
[31m-terms of always trying to select a particular server — the ip-hash load[m
[31m-balancing mechanism can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With ip-hash, the client’s IP address is used as a hashing key to[m
[31m-determine what server in a server group should be selected for the[m
[31m-client’s requests.[m
[31m-This method ensures that the requests from the same client[m
[31m-will always be directed to the same server[m
[31m-except when this server is unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To configure ip-hash load balancing, just add the[m
[31m-L<ngx_http_upstream_module>[m
[31m-directive to the server (upstream) group configuration:[m
[31m-[m
[31m-    [m
[31m-    upstream myapp1 {[m
[31m-        ip_hash;[m
[31m-        server srv1.example.com;[m
[31m-        server srv2.example.com;[m
[31m-        server srv3.example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Weighted load balancing[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to influence nginx load balancing algorithms even[m
[31m-further by using server weights.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In the examples above, the server weights are not configured which means[m
[31m-that all specified servers are treated as equally qualified for a[m
[31m-particular load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With the round-robin in particular it also means a more or less equal[m
[31m-distribution of requests across the servers — provided there are enough[m
[31m-requests, and when the requests are processed in a uniform manner and[m
[31m-completed fast enough.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the[m
[31m-L<weight|ngx_http_upstream_module>[m
[31m-parameter is specified for a server, the weight is accounted as part[m
[31m-of the load balancing decision.[m
[31m-[m
[31m-    [m
[31m-        upstream myapp1 {[m
[31m-            server srv1.example.com weight=3;[m
[31m-            server srv2.example.com;[m
[31m-            server srv3.example.com;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With this configuration, every 5 new requests will be distributed across[m
[31m-the application instances as the following: 3 requests will be directed[m
[31m-to srv1, one request will go to srv2, and another one — to srv3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is similarly possible to use weights with the least-connected and[m
[31m-ip-hash load balancing in the recent versions of nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Health checks[m
[31m-[m
[31m-[m
[31m-[m
[31m-Reverse proxy implementation in nginx includes in-band (or passive)[m
[31m-server health checks.[m
[31m-If the response from a particular server fails with an error,[m
[31m-nginx will mark this server as failed, and will try to[m
[31m-avoid selecting this server for subsequent inbound requests for a while.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The[m
[31m-L<max_fails|ngx_http_upstream_module>[m
[31m-directive sets the number of consecutive unsuccessful attempts to[m
[31m-communicate with the server that should happen during[m
[31m-L<fail_timeout|ngx_http_upstream_module>.[m
[31m-By default,[m
[31m-L<max_fails|ngx_http_upstream_module>[m
[31m-is set to 1.[m
[31m-When it is set to 0, health checks are disabled for this server.[m
[31m-The[m
[31m-L<fail_timeout|ngx_http_upstream_module>[m
[31m-parameter also defines how long the server will be marked as failed.[m
[31m-After[m
[31m-L<fail_timeout|ngx_http_upstream_module>[m
[31m-interval following the server failure, nginx will start to gracefully[m
[31m-probe the server with the live client’s requests.[m
[31m-If the probes have been successful, the server is marked as a live one.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Further reading[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, there are more directives and parameters that control server[m
[31m-load balancing in nginx, e.g.[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<backup|ngx_http_upstream_module>,[m
[31m-L<down|ngx_http_upstream_module>, and[m
[31m-L<ngx_http_upstream_module>.[m
[31m-For more information please check our[m
[31m-L<reference documentation|..>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Last but not least,[m
[31m-L<application load balancing|https://www.nginx.com/products/application-load-balancing/>,[m
[31m-L<application health checks|https://www.nginx.com/products/application-health-checks/>,[m
[31m-L<activity monitoring|https://www.nginx.com/products/live-activity-monitoring/> and[m
[31m-L<on-the-fly reconfiguration|https://www.nginx.com/products/on-the-fly-reconfiguration/> of server groups are available[m
[31m-as part of our paid NGINX Plus subscriptions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following articles describe load balancing with NGINX Plus[m
[31m-in more detail:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Load Balancing with NGINX and NGINX Plus|https://www.nginx.com/blog/load-balancing-with-nginx-plus/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Load Balancing with NGINX and NGINX Plus part 2|https://www.nginx.com/blog/load-balancing-with-nginx-plus-part2/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/nginx.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/nginx.pod[m
[1mdeleted file mode 100644[m
[1mindex 4423c56..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/nginx.pod[m
[1m+++ /dev/null[m
[36m@@ -1,704 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-index - nginx documentation[m
[31m-[m
[31m-[m
[31m-=head1 Introduction[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<install>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<beginners_guide>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Admin’s Guide|https://www.nginx.com/resources/admin-guide/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<control>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<hash>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<debugging_log>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<syslog>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<syntax>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<switches>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<windows>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<request_processing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<server_names>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<load_balancing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<configuring_https_servers>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Chapter “nginx” in[m
[31m-“The Architecture of Open Source Applications”|http://www.aosabook.org/en/nginx.html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 How-To[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<configure>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<howto_build_on_win32>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Setting up NGINX Plus environment on Amazon EC2|https://www.nginx.com/resources/admin-guide/setting-nginx-plus-environment-amazon-ec2/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<nginx_dtrace_pid_provider>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<converting_rewrite_rules>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<websocket>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Development[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<contributing_changes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Modules reference[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<dirindex>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<varindex>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_core_module|ngx_http_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_access_module|ngx_http_access_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_addition_module|ngx_http_addition_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_auth_basic_module|ngx_http_auth_basic_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_auth_request_module|ngx_http_auth_request_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_autoindex_module|ngx_http_autoindex_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_browser_module|ngx_http_browser_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_charset_module|ngx_http_charset_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_dav_module|ngx_http_dav_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_empty_gif_module|ngx_http_empty_gif_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_f4f_module|ngx_http_f4f_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_fastcgi_module|ngx_http_fastcgi_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_flv_module|ngx_http_flv_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_geo_module|ngx_http_geo_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_geoip_module|ngx_http_geoip_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_gunzip_module|ngx_http_gunzip_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_gzip_module|ngx_http_gzip_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_gzip_static_module|ngx_http_gzip_static_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_headers_module|ngx_http_headers_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_hls_module|ngx_http_hls_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_image_filter_module|ngx_http_image_filter_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_index_module|ngx_http_index_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_limit_conn_module|ngx_http_limit_conn_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_limit_req_module|ngx_http_limit_req_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_log_module|ngx_http_log_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_map_module|ngx_http_map_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_memcached_module|ngx_http_memcached_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_mp4_module|ngx_http_mp4_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_perl_module|ngx_http_perl_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_proxy_module|ngx_http_proxy_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_random_index_module|ngx_http_random_index_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_realip_module|ngx_http_realip_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_referer_module|ngx_http_referer_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_rewrite_module|ngx_http_rewrite_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_scgi_module|ngx_http_scgi_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_secure_link_module|ngx_http_secure_link_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_session_log_module|ngx_http_session_log_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_slice_module|ngx_http_slice_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_spdy_module|ngx_http_spdy_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_split_clients_module|ngx_http_split_clients_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_ssi_module|ngx_http_ssi_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_ssl_module|ngx_http_ssl_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_status_module|ngx_http_status_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_stub_status_module|ngx_http_stub_status_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_sub_module|ngx_http_sub_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_upstream_module|ngx_http_upstream_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_upstream_conf_module|ngx_http_upstream_conf_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_userid_module|ngx_http_userid_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_uwsgi_module|ngx_http_uwsgi_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_v2_module|ngx_http_v2_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_xslt_module|ngx_http_xslt_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_core_module|ngx_mail_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_auth_http_module|ngx_mail_auth_http_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_proxy_module|ngx_mail_proxy_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_ssl_module|ngx_mail_ssl_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_imap_module|ngx_mail_imap_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_pop3_module|ngx_mail_pop3_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_mail_smtp_module|ngx_mail_smtp_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_core_module|ngx_stream_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_access_module|ngx_stream_access_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_limit_conn_module|ngx_stream_limit_conn_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_proxy_module|ngx_stream_proxy_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_ssl_module|ngx_stream_ssl_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_upstream_module|ngx_stream_upstream_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/nginx_dtrace_pid_provider.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/nginx_dtrace_pid_provider.pod[m
[1mdeleted file mode 100644[m
[1mindex 4651850..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/nginx_dtrace_pid_provider.pod[m
[1m+++ /dev/null[m
[36m@@ -1,217 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-nginx_dtrace_pid_provider - Debugging nginx with DTrace pid provider[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-This article assumes the reader has a general knowledge of nginx internals and[m
[31m-DTrace.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Although nginx built with the L<--with-debug|debugging_log>[m
[31m-option already provides a lot of information about request processing,[m
[31m-it is sometimes desirable to trace particular parts of code path more[m
[31m-thoroughly and at the same time omit the rest of debugging output.[m
[31m-DTrace pid provider (available on Solaris, Mac OS X) is a useful tool to[m
[31m-explore userland program’s internals, since it doesn’t require any code[m
[31m-changes and it can help with the task.[m
[31m-A simple DTrace script to trace and print nginx function calls[m
[31m-may look like this:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    #pragma D option flowindent[m
[31m-    [m
[31m-    pid$target:nginx::entry {[m
[31m-    }[m
[31m-    [m
[31m-    pid$target:nginx::return {[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-DTrace capabilities for function calls tracing provide only a limited amount[m
[31m-of useful information, though.[m
[31m-Real-time inspection of function arguments is typically more interesting,[m
[31m-but also a bit more complicated.[m
[31m-Examples below are intended to help the reader become more familiar with[m
[31m-DTrace and the process of analyzing nginx behavior using DTrace.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One of the common scenarios for using DTrace with nginx is the following:[m
[31m-attach to the nginx worker process to log request lines and request start times.[m
[31m-The corresponding function to attach is[m
[31m-C<ngx_http_process_request>, and the argument in question[m
[31m-is a pointer to the C<ngx_http_request_t> structure.[m
[31m-DTrace script for such request logging can be as simple as:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    pid$target::*ngx_http_process_request:entry[m
[31m-    {[m
[31m-        this->request = (ngx_http_request_t *)copyin(arg0, sizeof(ngx_http_request_t));[m
[31m-        this->request_line = stringof(copyin((uintptr_t)this->request->request_line.data,[m
[31m-                                             this->request->request_line.len));[m
[31m-        printf("request line = %s\n", this->request_line);[m
[31m-        printf("request start sec = %d\n", this->request->start_sec);[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be noted that in the example above DTrace requires some knowledge[m
[31m-about the C<ngx_http_process_request> structure.[m
[31m-Unfortunately while it is possible to use a specific C<#include>[m
[31m-directive in the DTrace script and then pass it to a C preprocessor[m
[31m-(with the C<-C> flag), that doesn’t really work.[m
[31m-Due to a lot of cross dependencies, almost all nginx header files[m
[31m-have to be included.[m
[31m-In turn, based on C<configure> script settings,[m
[31m-nginx headers will include PCRE,[m
[31m-OpenSSL and a variety of system header files.[m
[31m-While in theory all those header files related to a specific nginx build[m
[31m-might be included in DTrace script preprocessing and compilation, in reality[m
[31m-DTrace script most probably will fail to compile because of unknown syntax in[m
[31m-some header files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The problem above can be solved by including only the relevant and[m
[31m-necessary structure and type definitions in the DTrace script.[m
[31m-DTrace has to know sizes of structures, types, and fields offsets.[m
[31m-Thus dependencies can be further reduced by manually optimizing[m
[31m-structure definitions for use with DTrace.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Let’s use DTrace script example above and see what structure definitions[m
[31m-it needs to work properly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-First of all C<objsE<sol>ngx_auto_config.h> file generated by[m
[31m-configure should be included, because it defines a number of constants[m
[31m-affecting various C<#ifdef>’s.[m
[31m-After that, some basic types and definitions[m
[31m-like C<ngx_str_t>, C<ngx_table_elt_t>,[m
[31m-C<ngx_uint_t> etc. should be put at the beginning of the[m
[31m-DTrace script.[m
[31m-These definitions are compact, commonly used and unlikely to be[m
[31m-frequently changed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Then there’s the C<ngx_http_process_request_t> structure that[m
[31m-contains a lot of pointers to other structures.[m
[31m-Because these pointers are really irrelevant to this script, and because they[m
[31m-have the same size, it is possible to just replace them with void pointers.[m
[31m-Instead of changing definitions, it is better to add appropriate typedefs,[m
[31m-though:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    typedef ngx_http_upstream_t     void;[m
[31m-    typedef ngx_http_request_body_t void;[m
[31m-[m
[31m-[m
[31m-[m
[31m-Last but not least it is necessary to add definitions of two member structures[m
[31m-(C<ngx_http_headers_in_t>,[m
[31m-C<ngx_http_headers_out_t>),[m
[31m-declarations of callback functions and definitions of constants.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The final DTrace script can be downloaded from[m
[31m-L<here|http://nginx.org/download/trace_process_request.d>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following example shows the output of running this script:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    # dtrace -C -I ./objs -s trace_process_request.d -p 4848[m
[31m-    dtrace: script 'trace_process_request.d' matched 1 probe[m
[31m-    CPU     ID                    FUNCTION:NAME[m
[31m-      1      4 .XAbmO.ngx_http_process_request:entry request line = GET / HTTP/1.1[m
[31m-    request start sec = 1349162898[m
[31m-    [m
[31m-      0      4 .XAbmO.ngx_http_process_request:entry request line = GET /en/docs/nginx_dtrace_pid_provider.html HTTP/1.1[m
[31m-    request start sec = 1349162899[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Using similar techniques the reader should be able to trace other[m
[31m-nginx function calls.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See also[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Solaris Dynamic Tracing Guide|http://docs.oracle.com/cd/E19253-01/817-6223/index.html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Introduction article on DTrace pid provider|http://dtrace.org/blogs/brendan/2011/02/09/dtrace-pid-provider/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_core_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_core_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 747b5cf..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_core_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1114 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_core_module - Core functionality[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    user www www;[m
[31m-    worker_processes 2;[m
[31m-    [m
[31m-    error_log /var/log/nginx-error.log info;[m
[31m-    [m
[31m-    events {[m
[31m-        use kqueue;[m
[31m-        worker_connections 2048;[m
[31m-    }[m
[31m-    [m
[31m-    ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 accept_mutex[m
[31m-[m
[31m-[m
[31m-B<syntax:> accept_mutex I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<accept_mutex> is enabled,[m
[31m-worker processes will accept new connections by turn.[m
[31m-Otherwise, all worker processes will be notified about new connections,[m
[31m-and if volume of new connections is low, some of the worker processes[m
[31m-may just waste system resources.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 accept_mutex_delay[m
[31m-[m
[31m-[m
[31m-B<syntax:> accept_mutex_delay I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<500ms>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If L</accept_mutex> is enabled, specifies the maximum time[m
[31m-during which a worker process will try to restart accepting new[m
[31m-connections if another worker process is currently accepting[m
[31m-new connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 daemon[m
[31m-[m
[31m-[m
[31m-B<syntax:> daemon I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether nginx should become a daemon.[m
[31m-Mainly used during development.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 debug_connection[m
[31m-[m
[31m-[m
[31m-B<syntax:> debug_connection I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables debugging log for selected client connections.[m
[31m-Other connections will use logging level set by the[m
[31m-L</error_log> directive.[m
[31m-Debugged connections are specified by IPv4 or IPv6 (1.3.0, 1.2.1)[m
[31m-address or network.[m
[31m-A connection may also be specified using a hostname.[m
[31m-For connections using UNIX-domain sockets (1.3.0, 1.2.1),[m
[31m-debugging log is enabled by the “C<unix:>” parameter.[m
[31m-[m
[31m-    [m
[31m-    events {[m
[31m-        debug_connection 127.0.0.1;[m
[31m-        debug_connection localhost;[m
[31m-        debug_connection 192.0.2.0/24;[m
[31m-        debug_connection ::1;[m
[31m-        debug_connection 2001:0db8::/32;[m
[31m-        debug_connection unix:;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-For this directive to work, nginx needs to[m
[31m-be built with C<--with-debug>,[m
[31m-see “L<debugging_log>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 debug_points[m
[31m-[m
[31m-[m
[31m-B<syntax:> debug_points I<C<abort> E<verbar> C<stop>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is used for debugging.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When internal error is detected, e.g. the leak of sockets on[m
[31m-restart of working processes, enabling C<debug_points>[m
[31m-leads to a core file creation (C<abort>)[m
[31m-or to stopping of a process (C<stop>) for further[m
[31m-analysis using a system debugger.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 error_log[m
[31m-[m
[31m-[m
[31m-B<syntax:> error_log I<I<C<file>> [I<C<level>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<logsE<sol>error.log error>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures logging.[m
[31m-Several logs can be specified on the same level (1.5.2).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first parameter defines a I<C<file>> that will store the log.[m
[31m-The special value C<stderr> selects the standard error file.[m
[31m-Logging to L<syslog|syslog> can be configured by specifying[m
[31m-the “C<syslog:>” prefix.[m
[31m-Logging to a[m
[31m-L<cyclic memory buffer|debugging_log>[m
[31m-can be configured by specifying the “C<memory:>” prefix and[m
[31m-buffer I<C<size>>, and is generally used for debugging (1.7.11).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The second parameter determines the I<C<level>> of logging,[m
[31m-and can be one of the following:[m
[31m-C<debug>, C<info>, C<notice>,[m
[31m-C<warn>, C<error>, C<crit>,[m
[31m-C<alert>, or C<emerg>.[m
[31m-Log levels above are listed in the order of increasing severity.[m
[31m-Setting a certain log level will cause all messages of[m
[31m-the specified and more severe log levels to be logged.[m
[31m-For example, the default level C<error> will[m
[31m-cause C<error>, C<crit>,[m
[31m-C<alert>, and C<emerg> messages[m
[31m-to be logged.[m
[31m-If this parameter is omitted then C<error> is used.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-For C<debug> logging to work, nginx needs to[m
[31m-be built with C<--with-debug>,[m
[31m-see “L<debugging_log>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The directive can be specified on the[m
[31m-C<stream> level[m
[31m-starting from version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The directive can be specified on the[m
[31m-C<mail> level[m
[31m-starting from version 1.9.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 env[m
[31m-[m
[31m-[m
[31m-B<syntax:> env I<I<C<variable>>[=I<C<value>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TZ>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, nginx removes all environment variables inherited[m
[31m-from its parent process except the TZ variable.[m
[31m-This directive allows preserving some of the inherited variables,[m
[31m-changing their values, or creating new environment variables.[m
[31m-These variables are then:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-inherited during a L<live upgrade|control>[m
[31m-of an executable file;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-used by the[m
[31m-L<ngx_http_perl_module|ngx_http_perl_module> module;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-used by worker processes.[m
[31m-One should bear in mind that controlling system libraries in this way[m
[31m-is not always possible as it is common for libraries to check[m
[31m-variables only during initialization, well before they can be set[m
[31m-using this directive.[m
[31m-An exception from this is an above mentioned[m
[31m-L<live upgrade|control>[m
[31m-of an executable file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The TZ variable is always inherited and available to the[m
[31m-L<ngx_http_perl_module|ngx_http_perl_module>[m
[31m-module, unless it is configured explicitly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    env MALLOC_OPTIONS;[m
[31m-    env PERL5LIB=/data/site/modules;[m
[31m-    env OPENSSL_ALLOW_PROXY_CERTS=1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The NGINX environment variable is used internally by nginx[m
[31m-and should not be set directly by the user.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 events[m
[31m-[m
[31m-[m
[31m-events { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Provides the configuration file context in which the directives that[m
[31m-affect connection processing are specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 include[m
[31m-[m
[31m-[m
[31m-B<syntax:> include I<I<C<file>> E<verbar> I<C<mask>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Includes another I<C<file>>, or files matching the[m
[31m-specified I<C<mask>>, into configuration.[m
[31m-Included files should consist of[m
[31m-syntactically correct directives and blocks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    include mime.types;[m
[31m-    include vhosts/*.conf;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 load_module[m
[31m-[m
[31m-[m
[31m-B<syntax:> load_module I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Loads a dynamic module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    load_module modules/ngx_mail_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lock_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> lock_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<logsE<sol>nginx.lock>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx uses the locking mechanism to implement L</accept_mutex>[m
[31m-and serialize access to shared memory.[m
[31m-On most systems the locks are implemented using atomic operations,[m
[31m-and this directive is ignored.[m
[31m-On other systems the “lock file” mechanism is used.[m
[31m-This directive specifies a prefix for the names of lock files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 master_process[m
[31m-[m
[31m-[m
[31m-B<syntax:> master_process I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether worker processes are started.[m
[31m-This directive is intended for nginx developers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 multi_accept[m
[31m-[m
[31m-[m
[31m-B<syntax:> multi_accept I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<multi_accept> is disabled, a worker process[m
[31m-will accept one new connection at a time.[m
[31m-Otherwise, a worker process[m
[31m-will accept all new connections at a time.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The directive is ignored if L<events>[m
[31m-connection processing method is used, because it reports[m
[31m-the number of new connections waiting to be accepted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 pcre_jit[m
[31m-[m
[31m-[m
[31m-B<syntax:> pcre_jit I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of “just-in-time compilation” (PCRE JIT)[m
[31m-for the regular expressions known by the time of configuration parsing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-PCRE JIT can speed up processing of regular expressions significantly.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The JIT is available in PCRE libraries starting from version 8.20[m
[31m-built with the C<--enable-jit> configuration parameter.[m
[31m-When the PCRE library is built with nginx (C<--with-pcre=>),[m
[31m-the JIT support is enabled via the[m
[31m-C<--with-pcre-jit> configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 pid[m
[31m-[m
[31m-[m
[31m-B<syntax:> pid I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<nginx.pid>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a I<C<file>> that will store the process ID of the main process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_engine[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_engine I<I<C<device>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the name of the hardware SSL accelerator.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 thread_pool[m
[31m-[m
[31m-[m
[31m-B<syntax:> thread_pool I<[m
[31m-    I<C<name>>[m
[31m-    C<threads>=I<C<number>>[m
[31m-    [C<max_queue>=I<C<number>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<default threads=32 max_queue=65536>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines named thread pools[m
[31m-used for multi-threaded reading and sending of files[m
[31m-L<without blocking|ngx_http_core_module>[m
[31m-worker processes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<threads> parameter[m
[31m-defines the number of threads in the pool.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In the event that all threads in the pool are busy,[m
[31m-a new task will wait in the queue.[m
[31m-The C<max_queue> parameter limits the number[m
[31m-of tasks allowed to be waiting in the queue.[m
[31m-By default, up to 65536 tasks can wait in the queue.[m
[31m-When the queue overflows, the task is completed with an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 timer_resolution[m
[31m-[m
[31m-[m
[31m-B<syntax:> timer_resolution I<I<C<interval>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Reduces timer resolution in worker processes, thus reducing the[m
[31m-number of C<gettimeofday> system calls made.[m
[31m-By default, C<gettimeofday> is called each time[m
[31m-a kernel event is received.[m
[31m-With reduced resolution, C<gettimeofday> is only[m
[31m-called once per specified I<C<interval>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    timer_resolution 100ms;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Internal implementation of the interval depends on the method used:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the C<EVFILT_TIMER> filter if C<kqueue> is used;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<timer_create> if C<eventport> is used;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<setitimer> otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 use[m
[31m-[m
[31m-[m
[31m-B<syntax:> use I<I<C<method>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the L<connection processing|events>[m
[31m-I<C<method>> to use.[m
[31m-There is normally no need to specify it explicitly, because nginx will[m
[31m-by default use the most efficient method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 user[m
[31m-[m
[31m-[m
[31m-B<syntax:> user I<I<C<user>> [I<C<group>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<nobody nobody>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines I<C<user>> and I<C<group>>[m
[31m-credentials used by worker processes.[m
[31m-If I<C<group>> is omitted, a group whose name equals[m
[31m-that of I<C<user>> is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_aio_requests[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_aio_requests I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using L<ngx_http_core_module>[m
[31m-with the L<events>[m
[31m-connection processing method, sets the maximum I<C<number>> of[m
[31m-outstanding asynchronous IE<sol>O operations[m
[31m-for a single worker process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_connections[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_connections I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<events>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum number of simultaneous connections that[m
[31m-can be opened by a worker process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be kept in mind that this number includes all connections[m
[31m-(e.g. connections with proxied servers, among others),[m
[31m-not only connections with clients.[m
[31m-Another consideration is that the actual number of simultaneous[m
[31m-connections cannot exceed the current limit on[m
[31m-the maximum number of open files, which can be changed by[m
[31m-L</worker_rlimit_nofile>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_cpu_affinity[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_cpu_affinity I<I<C<cpumask>> ...>[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_cpu_affinity I<C<auto> [I<C<cpumask>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Binds worker processes to the sets of CPUs.[m
[31m-Each CPU set is represented by a bitmask of allowed CPUs.[m
[31m-There should be a separate set defined for each of the worker processes.[m
[31m-By default, worker processes are not bound to any specific CPUs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-    [m
[31m-    worker_processes    4;[m
[31m-    worker_cpu_affinity 0001 0010 0100 1000;[m
[31m-[m
[31m-[m
[31m-binds each worker process to a separate CPU, while[m
[31m-[m
[31m-    [m
[31m-    worker_processes    2;[m
[31m-    worker_cpu_affinity 0101 1010;[m
[31m-[m
[31m-[m
[31m-binds the first worker process to CPU0E<sol>CPU2,[m
[31m-and the second worker process to CPU1E<sol>CPU3.[m
[31m-The second example is suitable for hyper-threading.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<auto> (1.9.10) allows[m
[31m-binding worker processes automatically to available CPUs:[m
[31m-[m
[31m-    [m
[31m-    worker_processes auto;[m
[31m-    worker_cpu_affinity auto;[m
[31m-[m
[31m-[m
[31m-The optional mask parameter can be used to limit the CPUs[m
[31m-available for automatic binding:[m
[31m-[m
[31m-    [m
[31m-    worker_cpu_affinity auto 01010101;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The directive is only available on FreeBSD and Linux.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_priority[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_priority I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the scheduling priority for worker processes like it is[m
[31m-done by the C<nice> command: a negative[m
[31m-I<C<number>>[m
[31m-means higher priority.[m
[31m-Allowed range normally varies from -20 to 20.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    worker_priority -10;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_processes[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_processes I<I<C<number>> E<verbar> C<auto>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the number of worker processes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The optimal value depends on many factors including (but not[m
[31m-limited to) the number of CPU cores, the number of hard disk[m
[31m-drives that store data, and load pattern.[m
[31m-When one is in doubt, setting it to the number of available CPU cores[m
[31m-would be a good start (the value “C<auto>”[m
[31m-will try to autodetect it).[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The C<auto> parameter is supported starting from[m
[31m-versions 1.3.8 and 1.2.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_rlimit_core[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_rlimit_core I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Changes the limit on the largest size of a core file[m
[31m-(C<RLIMIT_CORE>) for worker processes.[m
[31m-Used to increase the limit without restarting the main process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 worker_rlimit_nofile[m
[31m-[m
[31m-[m
[31m-B<syntax:> worker_rlimit_nofile I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Changes the limit on the maximum number of open files[m
[31m-(C<RLIMIT_NOFILE>) for worker processes.[m
[31m-Used to increase the limit without restarting the main process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 working_directory[m
[31m-[m
[31m-[m
[31m-B<syntax:> working_directory I<I<C<directory>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the current working directory for a worker process.[m
[31m-It is primarily used when writing a core-file, in which case[m
[31m-a worker process should have write permission for the[m
[31m-specified directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_access_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_access_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 7cf9d60..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_access_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_access_module - Module ngx_http_access_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_access_module> module allows[m
[31m-limiting access to certain client addresses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Access can also be limited by[m
[31m-L<password|ngx_http_auth_basic_module> or by the[m
[31m-L<result of subrequest|ngx_http_auth_request_module>.[m
[31m-Simultaneous limitation of access by address and by password is controlled[m
[31m-by the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        deny  192.168.1.1;[m
[31m-        allow 192.168.1.0/24;[m
[31m-        allow 10.1.1.0/16;[m
[31m-        allow 2001:0db8::/32;[m
[31m-        deny  all;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The rules are checked in sequence until the first match is found.[m
[31m-In this example, access is allowed only for IPv4 networks[m
[31m-C<10.1.1.0E<sol>16> and C<192.168.1.0E<sol>24>[m
[31m-excluding the address C<192.168.1.1>,[m
[31m-and for IPv6 network C<2001:0db8::E<sol>32>.[m
[31m-In case of a lot of rules, the use of the[m
[31m-L<ngx_http_geo_module|ngx_http_geo_module>[m
[31m-module variables is preferable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 allow[m
[31m-[m
[31m-[m
[31m-B<syntax:> allow I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:> E<verbar>[m
[31m-    C<all>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows access for the specified network or address.[m
[31m-If the special value C<unix:> is specified (1.5.1),[m
[31m-allows access for all UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 deny[m
[31m-[m
[31m-[m
[31m-B<syntax:> deny I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:> E<verbar>[m
[31m-    C<all>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Denies access for the specified network or address.[m
[31m-If the special value C<unix:> is specified (1.5.1),[m
[31m-denies access for all UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_addition_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_addition_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 674ee3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_addition_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_addition_module - Module ngx_http_addition_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_addition_module> module is a filter[m
[31m-that adds text before and after a response.[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_addition_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        add_before_body /before_action;[m
[31m-        add_after_body  /after_action;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 add_before_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> add_before_body I<I<C<uri>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the text returned as a result of processing a given subrequest[m
[31m-before the response body.[m
[31m-An empty string (C<"">) as a parameter cancels addition[m
[31m-inherited from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 add_after_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> add_after_body I<I<C<uri>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the text returned as a result of processing a given subrequest[m
[31m-after the response body.[m
[31m-An empty string (C<"">) as a parameter cancels addition[m
[31m-inherited from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 addition_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> addition_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows adding text in responses with the specified MIME types,[m
[31m-in addition to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_auth_basic_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_auth_basic_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 5b0fd88..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_auth_basic_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,179 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_auth_basic_module - Module ngx_http_auth_basic_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_auth_basic_module> module allows[m
[31m-limiting access to resources by validating the user name and password[m
[31m-using the “HTTP Basic Authentication” protocol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Access can also be limited by[m
[31m-L<address|ngx_http_access_module> or by the[m
[31m-L<result of subrequest|ngx_http_auth_request_module>.[m
[31m-Simultaneous limitation of access by address and by password is controlled[m
[31m-by the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        auth_basic           "closed site";[m
[31m-        auth_basic_user_file conf/htpasswd;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 auth_basic[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_basic I<I<C<string>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables validation of user name and password using the[m
[31m-“HTTP Basic Authentication” protocol.[m
[31m-The specified parameter is used as a I<C<realm>>.[m
[31m-Parameter value can contain variables (1.3.10, 1.2.7).[m
[31m-The special value C<off> allows cancelling the effect[m
[31m-of the C<auth_basic> directive[m
[31m-inherited from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_basic_user_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_basic_user_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a file that keeps user names and passwords,[m
[31m-in the following format:[m
[31m-[m
[31m-    [m
[31m-    # comment[m
[31m-    name1:password1[m
[31m-    name2:password2:comment[m
[31m-    name3:password3[m
[31m-[m
[31m-[m
[31m-The I<C<file>> name can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following password types are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-encrypted with the C<crypt> function; can be generated using[m
[31m-the “C<htpasswd>” utility from the Apache HTTP Server[m
[31m-distribution or the “C<openssl passwd>” command;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-hashed with the Apache variant of the MD5-based password algorithm (apr1);[m
[31m-can be generated with the same tools;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-specified by the[m
[31m-“C<{>I<C<scheme>>C<}>I<C<data>>”[m
[31m-syntax (1.0.3+) as described in[m
[31m-L<RFC 2307|http://tools.ietf.org/html/rfc2307#section-5.3>;[m
[31m-currently implemented schemes include C<PLAIN> (an example one,[m
[31m-should not be used), C<SHA> (1.3.13) (plain SHA-1[m
[31m-hashing, should not be used) and C<SSHA> (salted SHA-1 hashing,[m
[31m-used by some software packages, notably OpenLDAP and Dovecot).[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Support for C<SHA> scheme was added only to aid[m
[31m-in migration from other web servers.[m
[31m-It should not be used for new passwords, since unsalted SHA-1 hashing[m
[31m-that it employs is vulnerable to[m
[31m-L<rainbow table|http://en.wikipedia.org/wiki/Rainbow_attack>[m
[31m-attacks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_auth_request_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_auth_request_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a32518d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_auth_request_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,140 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_auth_request_module - Module ngx_http_auth_request_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_auth_request_module> module (1.5.4+) implements[m
[31m-client authorization based on the result of a subrequest.[m
[31m-If the subrequest returns a 2xx response code, the access is allowed.[m
[31m-If it returns 401 or 403,[m
[31m-the access is denied with the corresponding error code.[m
[31m-Any other response code returned by the subrequest is considered an error.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the 401 error, the client also receives the[m
[31m-C<WWW-Authenticate> header from the subrequest response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_auth_request_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module may be combined with[m
[31m-other access modules, such as[m
[31m-L<ngx_http_access_module|ngx_http_access_module> and[m
[31m-L<ngx_http_auth_basic_module|ngx_http_auth_basic_module>,[m
[31m-via the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.7.3, responses to authorization subrequests could not be cached[m
[31m-(using L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_proxy_module>, etc.).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /private/ {[m
[31m-        auth_request /auth;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    location = /auth {[m
[31m-        proxy_pass ...[m
[31m-        proxy_pass_request_body off;[m
[31m-        proxy_set_header Content-Length "";[m
[31m-        proxy_set_header X-Original-URI $request_uri;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 auth_request[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_request I<I<C<uri>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables authorization based on the result of a subrequest and sets[m
[31m-the URI to which the subrequest will be sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_request_set[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_request_set I<I<C<variable>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the request I<C<variable>> to the given[m
[31m-I<C<value>> after the authorization request completes.[m
[31m-The value may contain variables from the authorization request,[m
[31m-such as C<$upstream_http_*>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_autoindex_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_autoindex_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 49f16f2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_autoindex_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,185 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_autoindex_module - Module ngx_http_autoindex_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_autoindex_module> module processes requests[m
[31m-ending with the slash character (‘C<E<sol>>’) and produces[m
[31m-a directory listing.[m
[31m-Usually a request is passed to the C<ngx_http_autoindex_module>[m
[31m-module when the[m
[31m-L<ngx_http_index_module|ngx_http_index_module> module[m
[31m-cannot find an index file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        autoindex on;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 autoindex[m
[31m-[m
[31m-[m
[31m-B<syntax:> autoindex I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the directory listing output.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 autoindex_exact_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> autoindex_exact_size I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the HTML format,[m
[31m-specifies whether exact file sizes should be output in the directory listing,[m
[31m-or rather rounded to kilobytes, megabytes, and gigabytes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 autoindex_format[m
[31m-[m
[31m-[m
[31m-B<syntax:> autoindex_format I<[m
[31m-    C<html> E<verbar>[m
[31m-    C<xml> E<verbar>[m
[31m-    C<json> E<verbar>[m
[31m-    C<jsonp>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the format of a directory listing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the JSONP format is used, the name of a callback function is set[m
[31m-with the C<callback> request argument.[m
[31m-If the argument is missing or has an empty value,[m
[31m-then the JSON format is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The XML output can be transformed using the[m
[31m-L<ngx_http_xslt_module|ngx_http_xslt_module> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 autoindex_localtime[m
[31m-[m
[31m-[m
[31m-B<syntax:> autoindex_localtime I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the HTML format,[m
[31m-specifies whether times in the directory listing should be[m
[31m-output in the local time zone or UTC.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_browser_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_browser_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 19fa40c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_browser_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,247 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_browser_module - Module ngx_http_browser_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_browser_module> module creates variables[m
[31m-whose values depend on the value of the C<User-Agent>[m
[31m-request header field:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$modern_browser>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-equals the value set by the L</modern_browser_value> directive,[m
[31m-if a browser was identified as modern;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ancient_browser>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-equals the value set by the L</ancient_browser_value> directive,[m
[31m-if a browser was identified as ancient;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$msie>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-equals “1” if a browser was identified as MSIE of any version.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-Choosing an index file:[m
[31m-[m
[31m-    [m
[31m-    modern_browser_value "modern.";[m
[31m-    [m
[31m-    modern_browser msie      5.5;[m
[31m-    modern_browser gecko     1.0.0;[m
[31m-    modern_browser opera     9.0;[m
[31m-    modern_browser safari    413;[m
[31m-    modern_browser konqueror 3.0;[m
[31m-    [m
[31m-    index index.${modern_browser}html index.html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Redirection for old browsers:[m
[31m-[m
[31m-    [m
[31m-    modern_browser msie      5.0;[m
[31m-    modern_browser gecko     0.9.1;[m
[31m-    modern_browser opera     8.0;[m
[31m-    modern_browser safari    413;[m
[31m-    modern_browser konqueror 3.0;[m
[31m-    [m
[31m-    modern_browser unlisted;[m
[31m-    [m
[31m-    ancient_browser Links Lynx netscape4;[m
[31m-    [m
[31m-    if ($ancient_browser) {[m
[31m-        rewrite ^ /ancient.html;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ancient_browser[m
[31m-[m
[31m-[m
[31m-B<syntax:> ancient_browser I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any of the specified substrings is found in the C<User-Agent>[m
[31m-request header field, the browser will be considered ancient.[m
[31m-The special string “C<netscape4>” corresponds to the[m
[31m-regular expression “C<^MozillaE<sol>[1-4]>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ancient_browser_value[m
[31m-[m
[31m-[m
[31m-B<syntax:> ancient_browser_value I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a value for the C<$ancient_browser> variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 modern_browser[m
[31m-[m
[31m-[m
[31m-B<syntax:> modern_browser I<I<C<browser>> I<C<version>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> modern_browser I<C<unlisted>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a version starting from which a browser is considered modern.[m
[31m-A browser can be any one of the following: C<msie>,[m
[31m-C<gecko> (browsers based on Mozilla),[m
[31m-C<opera>, C<safari>,[m
[31m-or C<konqueror>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Versions can be specified in the following formats: X, X.X, X.X.X, or X.X.X.X.[m
[31m-The maximum values for each of the format are[m
[31m-4000, 4000.99, 4000.99.99, and 4000.99.99.99, respectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<unlisted> specifies to consider[m
[31m-a browser as modern if it was not listed by the[m
[31m-C<modern_browser> and L</ancient_browser>[m
[31m-directives.[m
[31m-Otherwise such a browser is considered ancient.[m
[31m-If a request does not provide the C<User-Agent> field[m
[31m-in the header, the browser is treated as not being listed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 modern_browser_value[m
[31m-[m
[31m-[m
[31m-B<syntax:> modern_browser_value I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a value for the C<$modern_browser> variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_charset_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_charset_module.pod[m
[1mdeleted file mode 100644[m
[1mindex c460729..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_charset_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,343 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_charset_module - Module ngx_http_charset_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_charset_module> module adds the specified[m
[31m-charset to the C<Content-Type> response header field.[m
[31m-In addition, the module can convert data from one charset to another,[m
[31m-with some limitations:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-conversion is performed one way — from server to client,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-only single-byte charsets can be converted[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-or single-byte charsets toE<sol>from UTF-8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    include        conf/koi-win;[m
[31m-    [m
[31m-    charset        windows-1251;[m
[31m-    source_charset koi8-r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 charset[m
[31m-[m
[31m-[m
[31m-B<syntax:> charset I<I<C<charset>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the specified charset to the C<Content-Type>[m
[31m-response header field.[m
[31m-If this charset is different from the charset specified[m
[31m-in the L</source_charset> directive, a conversion is performed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The parameter C<off> cancels the addition of charset[m
[31m-to the C<Content-Type> response header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A charset can be defined with a variable:[m
[31m-[m
[31m-    [m
[31m-    charset $charset;[m
[31m-[m
[31m-[m
[31m-In such a case, all possible values of a variable need to be present[m
[31m-in the configuration at least once in the form of the[m
[31m-L</charset_map>, L</charset>, or[m
[31m-L</source_charset> directives.[m
[31m-For C<utf-8>, C<windows-1251>, and[m
[31m-C<koi8-r> charsets, it is sufficient to include the files[m
[31m-F<confE<sol>koi-win>, F<confE<sol>koi-utf>, and[m
[31m-F<confE<sol>win-utf> into configuration.[m
[31m-For other charsets, simply making a fictitious conversion table works,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    charset_map iso-8859-5 _ { }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, a charset can be set in the[m
[31m-C<X-Accel-Charset> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 charset_map[m
[31m-[m
[31m-[m
[31m-B<syntax:> charset_map I<I<C<charset1>> I<C<charset2>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Describes the conversion table from one charset to another.[m
[31m-A reverse conversion table is built using the same data.[m
[31m-Character codes are given in hexadecimal.[m
[31m-Missing characters in the range 80-FF are replaced with “C<?>”.[m
[31m-When converting from UTF-8, characters missing in a one-byte charset[m
[31m-are replaced with “C<E<amp>#XXXX;>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    charset_map koi8-r windows-1251 {[m
[31m-        C0 FE ; # small yu[m
[31m-        C1 E0 ; # small a[m
[31m-        C2 E1 ; # small b[m
[31m-        C3 F6 ; # small ts[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When describing a conversion table to UTF-8, codes for the UTF-8 charset should[m
[31m-be given in the second column, for example:[m
[31m-[m
[31m-    [m
[31m-    charset_map koi8-r utf-8 {[m
[31m-        C0 D18E ; # small yu[m
[31m-        C1 D0B0 ; # small a[m
[31m-        C2 D0B1 ; # small b[m
[31m-        C3 D186 ; # small ts[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Full conversion tables from C<koi8-r> to[m
[31m-C<windows-1251>, and from C<koi8-r> and[m
[31m-C<windows-1251> to C<utf-8>[m
[31m-are provided in the distribution files F<confE<sol>koi-win>,[m
[31m-F<confE<sol>koi-utf>, and F<confE<sol>win-utf>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 charset_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> charset_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html textE<sol>xml textE<sol>plain textE<sol>vnd.wap.wml[m
[31m-applicationE<sol>javascript applicationE<sol>rss+xml>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables module processing in responses with the specified MIME types[m
[31m-in addition to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Until version 1.5.4, “C<applicationE<sol>x-javascript>” was used[m
[31m-as the default MIME type instead of “C<applicationE<sol>javascript>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 override_charset[m
[31m-[m
[31m-[m
[31m-B<syntax:> override_charset I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether a conversion should be performed for answers[m
[31m-received from a proxied or a FastCGIE<sol>uwsgiE<sol>SCGI server[m
[31m-when the answers already carry a charset in the C<Content-Type>[m
[31m-response header field.[m
[31m-If conversion is enabled, a charset specified in the received[m
[31m-response is used as a source charset.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-It should be noted that if a response is received in a subrequest[m
[31m-then the conversion from the response charset to the main request charset[m
[31m-is always performed, regardless of the C<override_charset>[m
[31m-directive setting.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 source_charset[m
[31m-[m
[31m-[m
[31m-B<syntax:> source_charset I<I<C<charset>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the source charset of a response.[m
[31m-If this charset is different from the charset specified[m
[31m-in the L</charset> directive, a conversion is performed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_core_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_core_module.pod[m
[1mdeleted file mode 100644[m
[1mindex ca6a160..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_core_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,4894 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_core_module - Module ngx_http_core_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 aio[m
[31m-[m
[31m-[m
[31m-B<syntax:> aio I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    C<threads>[C<=>I<C<pool>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of asynchronous file IE<sol>O (AIO)[m
[31m-on FreeBSD and Linux:[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        aio            on;[m
[31m-        output_buffers 1 64k;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On FreeBSD, AIO can be used starting from FreeBSDE<nbsp>4.3.[m
[31m-AIO can either be linked statically into a kernel:[m
[31m-[m
[31m-    [m
[31m-    options VFS_AIO[m
[31m-[m
[31m-[m
[31m-or loaded dynamically as a kernel loadable module:[m
[31m-[m
[31m-    [m
[31m-    kldload aio[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On Linux, AIO can be used starting from kernel version 2.6.22.[m
[31m-Also, it is necessary to enable[m
[31m-L</directio>,[m
[31m-or otherwise reading will be blocking:[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        aio            on;[m
[31m-        directio       512;[m
[31m-        output_buffers 1 128k;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On Linux,[m
[31m-L</directio>[m
[31m-can only be used for reading blocks that are aligned on 512-byte[m
[31m-boundaries (or 4K for XFS).[m
[31m-File’s unaligned end is read in blocking mode.[m
[31m-The same holds true for byte range requests and for FLV requests[m
[31m-not from the beginning of a file: reading of unaligned data at the[m
[31m-beginning and end of a file will be blocking.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When both AIO and L</sendfile> are enabled on Linux,[m
[31m-AIO is used for files that are larger than or equal to[m
[31m-the size specified in the L</directio> directive,[m
[31m-while L</sendfile> is used for files of smaller sizes[m
[31m-or when L</directio> is disabled.[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        sendfile       on;[m
[31m-        aio            on;[m
[31m-        directio       8m;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Finally, files can be read and sent[m
[31m-using multi-threading (1.7.11),[m
[31m-without blocking a worker process:[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        sendfile       on;[m
[31m-        aio            threads;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Read and send file operations are offloaded to threads of the specified[m
[31m-L<pool|ngx_core_module>.[m
[31m-If the pool name is omitted,[m
[31m-the pool with the name “C<default>” is used.[m
[31m-The pool name can also be set with variables:[m
[31m-[m
[31m-    [m
[31m-    aio threads=pool$disk;[m
[31m-[m
[31m-[m
[31m-By default, multi-threading is disabled, it should be[m
[31m-enabled with the[m
[31m-C<--with-threads> configuration parameter.[m
[31m-Currently, multi-threading is compatible only with the[m
[31m-L<events>,[m
[31m-L<events>,[m
[31m-and[m
[31m-L<events> methods.[m
[31m-Multi-threaded sending of files is only supported on Linux.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the L</sendfile> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 aio_write[m
[31m-[m
[31m-[m
[31m-B<syntax:> aio_write I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If L</aio> is enabled, specifies whether it is used for writing files.[m
[31m-Currently, this only works when using[m
[31m-C<aio threads>[m
[31m-and is limited to writing temporary files[m
[31m-with data received from proxied servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 alias[m
[31m-[m
[31m-[m
[31m-B<syntax:> alias I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a replacement for the specified location.[m
[31m-For example, with the following configuration[m
[31m-[m
[31m-    [m
[31m-    location /i/ {[m
[31m-        alias /data/w3/images/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-on request of[m
[31m-“C<E<sol>iE<sol>top.gif>”, the file[m
[31m-F<E<sol>dataE<sol>w3E<sol>imagesE<sol>top.gif> will be sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<path>> value can contain variables,[m
[31m-except C<$document_root> and C<$realpath_root>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<alias> is used inside a location defined[m
[31m-with a regular expression then such regular expression should[m
[31m-contain captures and C<alias> should refer to[m
[31m-these captures (0.7.40), for example:[m
[31m-[m
[31m-    [m
[31m-    location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {[m
[31m-        alias /data/w3/images/$1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When location matches the last part of the directive’s value:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        alias /data/w3/images/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-it is better to use the[m
[31m-L</root>[m
[31m-directive instead:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root /data/w3;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 chunked_transfer_encoding[m
[31m-[m
[31m-[m
[31m-B<syntax:> chunked_transfer_encoding I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows disabling chunked transfer encoding in HTTPE<sol>1.1.[m
[31m-It may come in handy when using a software failing to support[m
[31m-chunked encoding despite the standard’s requirement.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_buffer_size[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets buffer size for reading client request body.[m
[31m-In case the request body is larger than the buffer,[m
[31m-the whole body or only its part is written to a[m
[31m-temporary file.[m
[31m-By default, buffer size is equal to two memory pages.[m
[31m-This is 8K on x86, other 32-bit platforms, and x86-64.[m
[31m-It is usually 16K on other 64-bit platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_in_file_only[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_in_file_only I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<clean> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether nginx should save the entire client request body[m
[31m-into a file.[m
[31m-This directive can be used during debugging, or when using the[m
[31m-C<$request_body_file>[m
[31m-variable, or the[m
[31m-L<$r-E<gt>request_body_file|ngx_http_perl_module>[m
[31m-method of the module[m
[31m-L<ngx_http_perl_module|ngx_http_perl_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When set to the value C<on>, temporary files are not[m
[31m-removed after request processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value C<clean> will cause the temporary files[m
[31m-left after request processing to be removed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_in_single_buffer[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_in_single_buffer I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether nginx should save the entire client request body[m
[31m-in a single buffer.[m
[31m-The directive is recommended when using the[m
[31m-C<$request_body>[m
[31m-variable, to save the number of copy operations involved.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<client_body_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files holding client request bodies.[m
[31m-Up to three-level subdirectory hierarchy can be used under the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    client_body_temp_path /spool/nginx/client_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a path to a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/client_temp/7/45/00000123457[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_body_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_body_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading client request body.[m
[31m-The timeout is set only for a period between two successive read operations,[m
[31m-not for the transmission of the whole request body.[m
[31m-If a client does not transmit anything within this time, the[m
[31m-C<408> (C<Request Time-out>)[m
[31m-error is returned to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_header_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_header_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets buffer size for reading client request header.[m
[31m-For most requests, a buffer of 1K bytes is enough.[m
[31m-However, if a request includes long cookies, or comes from a WAP client,[m
[31m-it may not fit into 1K.[m
[31m-If a request line or a request header field does not fit into[m
[31m-this buffer then larger buffers, configured by the[m
[31m-L</large_client_header_buffers> directive,[m
[31m-are allocated.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_header_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_header_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading client request header.[m
[31m-If a client does not transmit the entire header within this time, the[m
[31m-C<408> (C<Request Time-out>)[m
[31m-error is returned to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 client_max_body_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> client_max_body_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum allowed size of the client request body,[m
[31m-specified in the[m
[31m-C<Content-Length>[m
[31m-request header field.[m
[31m-If the size in a request exceeds the configured value, the[m
[31m-C<413> (C<Request Entity Too Large>)[m
[31m-error is returned to the client.[m
[31m-Please be aware that[m
[31m-browsers cannot correctly display[m
[31m-this error.[m
[31m-Setting I<C<size>> to 0 disables checking of client[m
[31m-request body size.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 connection_pool_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> connection_pool_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<256E<verbar>512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows accurate tuning of per-connection memory allocations.[m
[31m-This directive has minimal impact on performance[m
[31m-and should not generally be used.[m
[31m-By default, the size is equal to[m
[31m-256 bytes on 32-bit platforms and 512 bytes on 64-bit platforms.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.9.8, the default value was 256 on all platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 default_type[m
[31m-[m
[31m-[m
[31m-B<syntax:> default_type I<I<C<mime-type>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>plain>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the default MIME type of a response.[m
[31m-Mapping of file name extensions to MIME types can be set[m
[31m-with the L</types> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 directio[m
[31m-[m
[31m-[m
[31m-B<syntax:> directio I<I<C<size>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the use of[m
[31m-the C<O_DIRECT> flag (FreeBSD, Linux),[m
[31m-the C<F_NOCACHE> flag (Mac OS X),[m
[31m-or the C<directio> function (Solaris),[m
[31m-when reading files that are larger than or equal to[m
[31m-the specified I<C<size>>.[m
[31m-The directive automatically disables (0.7.15) the use of[m
[31m-L</sendfile>[m
[31m-for a given request.[m
[31m-It can be useful for serving large files:[m
[31m-[m
[31m-    [m
[31m-    directio 4m;[m
[31m-[m
[31m-[m
[31m-or when using L</aio> on Linux.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 directio_alignment[m
[31m-[m
[31m-[m
[31m-B<syntax:> directio_alignment I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the alignment for[m
[31m-L</directio>.[m
[31m-In most cases, a 512-byte alignment is enough.[m
[31m-However, when using XFS under Linux, it needs to be increased to 4K.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 disable_symlinks[m
[31m-[m
[31m-[m
[31m-B<syntax:> disable_symlinks I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> disable_symlinks I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<if_not_owner>[m
[31m-    [C<from>=I<C<part>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines how symbolic links should be treated when opening files:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Symbolic links in the pathname are allowed and not checked.[m
[31m-This is the default behavior.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<on>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any component of the pathname is a symbolic link,[m
[31m-access to a file is denied.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<if_not_owner>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Access to a file is denied if any component of the pathname[m
[31m-is a symbolic link, and the link and object that the link[m
[31m-points to have different owners.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<from>=I<C<part>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When checking symbolic links[m
[31m-(parameters C<on> and C<if_not_owner>),[m
[31m-all components of the pathname are normally checked.[m
[31m-Checking of symbolic links in the initial part of the pathname[m
[31m-may be avoided by specifying additionally the[m
[31m-C<from>=I<C<part>> parameter.[m
[31m-In this case, symbolic links are checked only from[m
[31m-the pathname component that follows the specified initial part.[m
[31m-If the value is not an initial part of the pathname checked, the whole[m
[31m-pathname is checked as if this parameter was not specified at all.[m
[31m-If the value matches the whole file name,[m
[31m-symbolic links are not checked.[m
[31m-The parameter value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    disable_symlinks on from=$document_root;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is only available on systems that have the[m
[31m-C<openat> and C<fstatat> interfaces.[m
[31m-Such systems include modern versions of FreeBSD, Linux, and Solaris.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters C<on> and C<if_not_owner>[m
[31m-add a processing overhead.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-On systems that do not support opening of directories only for search,[m
[31m-to use these parameters it is required that worker processes[m
[31m-have read permissions for all directories being checked.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The[m
[31m-L<ngx_http_autoindex_module|ngx_http_autoindex_module>,[m
[31m-L<ngx_http_random_index_module|ngx_http_random_index_module>,[m
[31m-and L<ngx_http_dav_module|ngx_http_dav_module>[m
[31m-modules currently ignore this directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 error_page[m
[31m-[m
[31m-[m
[31m-B<syntax:> error_page I<[m
[31m-    I<C<code>> ...[m
[31m-    [C<=>[I<C<response>>]][m
[31m-    I<C<uri>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the URI that will be shown for the specified errors.[m
[31m-C<error_page> directives are inherited from the previous[m
[31m-level only if there are no C<error_page>[m
[31m-directives defined on the current level.[m
[31m-A C<uri> value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    error_page 404             /404.html;[m
[31m-    error_page 500 502 503 504 /50x.html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Furthermore, it is possible to change the response code to another[m
[31m-using the “C<=>I<C<response>>” syntax, for example:[m
[31m-[m
[31m-    [m
[31m-    error_page 404 =200 /empty.gif;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If an error response is processed by a proxied server[m
[31m-or a FastCGIE<sol>uwsgiE<sol>SCGI server,[m
[31m-and the server may return different response codes (e.g., 200, 302, 401[m
[31m-or 404), it is possible to respond with the code it returns:[m
[31m-[m
[31m-    [m
[31m-    error_page 404 = /404.php;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to use redirects for error processing:[m
[31m-[m
[31m-    [m
[31m-    error_page 403      http://example.com/forbidden.html;[m
[31m-    error_page 404 =301 http://example.com/notfound.html;[m
[31m-[m
[31m-[m
[31m-In this case, by default, the response code 302 is returned to the client.[m
[31m-It can only be changed to one of the redirect status[m
[31m-codes (301, 302, 303, and 307).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If there is no need to change URI during internal redirection it is[m
[31m-possible to pass error processing into a named location:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        error_page 404 = @fallback;[m
[31m-    }[m
[31m-    [m
[31m-    location @fallback {[m
[31m-        proxy_pass http://backend;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-If C<uri> processing leads to an error,[m
[31m-the status code of the last occurred error is returned to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 etag[m
[31m-[m
[31m-[m
[31m-B<syntax:> etag I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables automatic generation of the C<ETag>[m
[31m-response header field for static resources.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http[m
[31m-[m
[31m-[m
[31m-http { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Provides the configuration file context in which the HTTP server directives[m
[31m-are specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 if_modified_since[m
[31m-[m
[31m-[m
[31m-B<syntax:> if_modified_since I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<exact> E<verbar>[m
[31m-    C<before>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<exact>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.24.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies how to compare modification time of a response[m
[31m-with the time in the[m
[31m-C<If-Modified-Since>[m
[31m-request header field:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the[m
[31m-C<If-Modified-Since> request header field is ignored (0.7.34);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<exact>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-exact match;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<before>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-modification time of a response is[m
[31m-less than or equal to the time in the C<If-Modified-Since>[m
[31m-request header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ignore_invalid_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ignore_invalid_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Controls whether header fields with invalid names should be ignored.[m
[31m-Valid names are composed of English letters, digits, hyphens, and possibly[m
[31m-underscores (as controlled by the L</underscores_in_headers>[m
[31m-directive).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is specified on the L</server> level,[m
[31m-its value is only used if a server is a default one.[m
[31m-The value specified also applies to all virtual servers[m
[31m-listening on the same address and port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 internal[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a given location can only be used for internal requests.[m
[31m-For external requests, the client error[m
[31m-C<404> (C<Not Found>)[m
[31m-is returned.[m
[31m-Internal requests are the following:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-requests redirected by the[m
[31m-L</error_page>,[m
[31m-L<ngx_http_index_module>,[m
[31m-L<ngx_http_random_index_module>, and[m
[31m-L</try_files> directives;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-requests redirected by the C<X-Accel-Redirect>[m
[31m-response header field from an upstream server;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-subrequests formed by the[m
[31m-“C<include virtual>”[m
[31m-command of the[m
[31m-L<ngx_http_ssi_module|ngx_http_ssi_module>[m
[31m-module and by the[m
[31m-L<ngx_http_addition_module|ngx_http_addition_module>[m
[31m-module directives;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-requests changed by the[m
[31m-L<ngx_http_rewrite_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    error_page 404 /404.html;[m
[31m-    [m
[31m-    location /404.html {[m
[31m-        internal;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-There is a limit of 10 internal redirects per request to prevent[m
[31m-request processing cycles that can occur in incorrect configurations.[m
[31m-If this limit is reached, the error[m
[31m-C<500> (C<Internal Server Error>) is returned.[m
[31m-In such cases, the “rewrite or internal redirection cycle” message[m
[31m-can be seen in the error log.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 keepalive_disable[m
[31m-[m
[31m-[m
[31m-B<syntax:> keepalive_disable I<C<none> E<verbar> I<C<browser>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<msie6>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables keep-alive connections with misbehaving browsers.[m
[31m-The I<C<browser>> parameters specify which[m
[31m-browsers will be affected.[m
[31m-The value C<msie6> disables keep-alive connections[m
[31m-with old versions of MSIE, once a POST request is received.[m
[31m-The value C<safari> disables keep-alive connections[m
[31m-with Safari and Safari-like browsers on Mac OS X and Mac OS X-like[m
[31m-operating systems.[m
[31m-The value C<none> enables keep-alive connections[m
[31m-with all browsers.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.1.18, the value C<safari> matched[m
[31m-all Safari and Safari-like browsers on all operating systems, and[m
[31m-keep-alive connections with them were disabled by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 keepalive_requests[m
[31m-[m
[31m-[m
[31m-B<syntax:> keepalive_requests I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<100>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum number of requests that can be[m
[31m-served through one keep-alive connection.[m
[31m-After the maximum number of requests are made, the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 keepalive_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> keepalive_timeout I<[m
[31m-    I<C<timeout>>[m
[31m-    [I<C<header_timeout>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<75s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first parameter sets a timeout during which a keep-alive[m
[31m-client connection will stay open on the server side.[m
[31m-The zero value disables keep-alive client connections.[m
[31m-The optional second parameter sets a value in the[m
[31m-C<Keep-Alive: timeout=I<C<time>>>[m
[31m-response header field.[m
[31m-Two parameters may differ.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The[m
[31m-C<Keep-Alive: timeout=I<C<time>>>[m
[31m-header field is recognized by Mozilla and Konqueror.[m
[31m-MSIE closes keep-alive connections by itself in about 60 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 large_client_header_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> large_client_header_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4 8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<number>> and I<C<size>> of[m
[31m-buffers used for reading large client request header.[m
[31m-A request line cannot exceed the size of one buffer, or the[m
[31m-C<414> (C<Request-URI Too Large>)[m
[31m-error is returned to the client.[m
[31m-A request header field cannot exceed the size of one buffer as well, or the[m
[31m-C<400> (C<Bad Request>)[m
[31m-error is returned to the client.[m
[31m-Buffers are allocated only on demand.[m
[31m-By default, the buffer size is equal to 8K bytes.[m
[31m-If after the end of request processing a connection is transitioned[m
[31m-into the keep-alive state, these buffers are released.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_except[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_except I<I<C<method>> ... { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits allowed HTTP methods inside a location.[m
[31m-The I<C<method>> parameter can be one of the following:[m
[31m-C<GET>,[m
[31m-C<HEAD>,[m
[31m-C<POST>,[m
[31m-C<PUT>,[m
[31m-C<DELETE>,[m
[31m-C<MKCOL>,[m
[31m-C<COPY>,[m
[31m-C<MOVE>,[m
[31m-C<OPTIONS>,[m
[31m-C<PROPFIND>,[m
[31m-C<PROPPATCH>,[m
[31m-C<LOCK>,[m
[31m-C<UNLOCK>,[m
[31m-or[m
[31m-C<PATCH>.[m
[31m-Allowing the C<GET> method makes the[m
[31m-C<HEAD> method also allowed.[m
[31m-Access to other methods can be limited using the[m
[31m-L<ngx_http_access_module|ngx_http_access_module>[m
[31m-and[m
[31m-L<ngx_http_auth_basic_module|ngx_http_auth_basic_module>[m
[31m-modules directives:[m
[31m-[m
[31m-    [m
[31m-    limit_except GET {[m
[31m-        allow 192.168.1.0/32;[m
[31m-        deny  all;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Please note that this will limit access to all methods[m
[31m-I<except> GET and HEAD.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the rate of response transmission to a client.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if a client simultaneously opens[m
[31m-two connections, the overall rate will be twice as much[m
[31m-as the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Rate limit can also be set in the C<$limit_rate> variable.[m
[31m-It may be useful in cases where rate should be limited[m
[31m-depending on a certain condition:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-    [m
[31m-        if ($slow) {[m
[31m-            set $limit_rate 4k;[m
[31m-        }[m
[31m-    [m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Rate limit can also be set in the[m
[31m-C<X-Accel-Limit-Rate> header field of a proxied server response.[m
[31m-This capability can be disabled using the[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_rate_after[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_rate_after I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the initial amount after which the further transmission[m
[31m-of a response to a client will be rate limited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    location /flv/ {[m
[31m-        flv;[m
[31m-        limit_rate_after 500k;[m
[31m-        limit_rate       50k;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lingering_close[m
[31m-[m
[31m-[m
[31m-B<syntax:> lingering_close I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<on> E<verbar>[m
[31m-    C<always>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Controls how nginx closes client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The default value “C<on>” instructs nginx to[m
[31m-wait for and[m
[31m-process additional data from a client[m
[31m-before fully closing a connection, but only[m
[31m-if heuristics suggests that a client may be sending more data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value “C<always>” will cause nginx to unconditionally[m
[31m-wait for and process additional client data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value “C<off>” tells nginx to never wait for[m
[31m-more data and close the connection immediately.[m
[31m-This behavior breaks the protocol and should not be used under normal[m
[31m-circumstances.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lingering_time[m
[31m-[m
[31m-[m
[31m-B<syntax:> lingering_time I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When L</lingering_close> is in effect,[m
[31m-this directive specifies the maximum time during which nginx[m
[31m-will process (read and ignore) additional data coming from a client.[m
[31m-After that, the connection will be closed, even if there will be[m
[31m-more data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lingering_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> lingering_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When L</lingering_close> is in effect, this directive specifies[m
[31m-the maximum waiting time for more client data to arrive.[m
[31m-If data are not received during this time, the connection is closed.[m
[31m-Otherwise, the data are read and ignored, and nginx starts waiting[m
[31m-for more data again.[m
[31m-The “wait-read-ignore” cycle is repeated, but no longer than specified by the[m
[31m-L</lingering_time> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 listen[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    I<C<address>>[:I<C<port>>][m
[31m-    [C<default_server>][m
[31m-    [C<ssl>][m
[31m-    [C<http2> E<verbar> C<spdy>][m
[31m-    [C<proxy_protocol>][m
[31m-    [C<setfib>=I<C<number>>][m
[31m-    [C<fastopen>=I<C<number>>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<rcvbuf>=I<C<size>>][m
[31m-    [C<sndbuf>=I<C<size>>][m
[31m-    [C<accept_filter>=I<C<filter>>][m
[31m-    [C<deferred>][m
[31m-    [C<bind>][m
[31m-    [C<ipv6only>=C<on>E<verbar>C<off>][m
[31m-    [C<reuseport>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    I<C<port>>[m
[31m-    [C<default_server>][m
[31m-    [C<ssl>][m
[31m-    [C<http2> E<verbar> C<spdy>][m
[31m-    [C<proxy_protocol>][m
[31m-    [C<setfib>=I<C<number>>][m
[31m-    [C<fastopen>=I<C<number>>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<rcvbuf>=I<C<size>>][m
[31m-    [C<sndbuf>=I<C<size>>][m
[31m-    [C<accept_filter>=I<C<filter>>][m
[31m-    [C<deferred>][m
[31m-    [C<bind>][m
[31m-    [C<ipv6only>=C<on>E<verbar>C<off>][m
[31m-    [C<reuseport>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    C<unix:>I<C<path>>[m
[31m-    [C<default_server>][m
[31m-    [C<ssl>][m
[31m-    [C<http2> E<verbar> C<spdy>][m
[31m-    [C<proxy_protocol>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<rcvbuf>=I<C<size>>][m
[31m-    [C<sndbuf>=I<C<size>>][m
[31m-    [C<accept_filter>=I<C<filter>>][m
[31m-    [C<deferred>][m
[31m-    [C<bind>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<*:80 E<verbar> *:8000>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<address>> and I<C<port>> for IP,[m
[31m-or the I<C<path>> for a UNIX-domain socket on which[m
[31m-the server will accept requests.[m
[31m-Both I<C<address>> and I<C<port>>,[m
[31m-or only I<C<address>> or only I<C<port>> can be specified.[m
[31m-An I<C<address>> may also be a hostname, for example:[m
[31m-[m
[31m-    [m
[31m-    listen 127.0.0.1:8000;[m
[31m-    listen 127.0.0.1;[m
[31m-    listen 8000;[m
[31m-    listen *:8000;[m
[31m-    listen localhost:8000;[m
[31m-[m
[31m-[m
[31m-IPv6 addresses (0.7.36) are specified in square brackets:[m
[31m-[m
[31m-    [m
[31m-    listen [::]:8000;[m
[31m-    listen [::1];[m
[31m-[m
[31m-[m
[31m-UNIX-domain sockets (0.8.21) are specified with the “C<unix:>”[m
[31m-prefix:[m
[31m-[m
[31m-    [m
[31m-    listen unix:/var/run/nginx.sock;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only I<C<address>> is given, the port 80 is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is not present then either C<*:80> is used[m
[31m-if nginx runs with the superuser privileges, or C<*:8000>[m
[31m-otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<default_server> parameter, if present,[m
[31m-will cause the server to become the default server for the specified[m
[31m-I<C<address>>:I<C<port>> pair.[m
[31m-If none of the directives have the C<default_server>[m
[31m-parameter then the first server with the[m
[31m-I<C<address>>:I<C<port>> pair will be[m
[31m-the default server for this pair.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In versions prior to 0.8.21 this parameter is named simply[m
[31m-C<default>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ssl> parameter (0.7.14) allows specifying that all[m
[31m-connections accepted on this port should work in SSL mode.[m
[31m-This allows for a more compact L<configuration|configuring_https_servers> for the server that[m
[31m-handles both HTTP and HTTPS requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<http2> parameter (1.9.5) configures the port to accept[m
[31m-L<HTTPE<sol>2|ngx_http_v2_module> connections.[m
[31m-Normally, for this to work the C<ssl> parameter should be[m
[31m-specified as well, but nginx can also be configured to accept HTTPE<sol>2[m
[31m-connections without SSL.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<spdy> parameter (1.3.15-1.9.4) allows accepting[m
[31m-L<SPDY|ngx_http_spdy_module> connections on this port.[m
[31m-Normally, for this to work the C<ssl> parameter should be[m
[31m-specified as well, but nginx can also be configured to accept SPDY[m
[31m-connections without SSL.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<proxy_protocol> parameter (1.5.12)[m
[31m-allows specifying that all connections accepted on this port should use the[m
[31m-L<PROXY[m
[31m-protocol|http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<listen> directive[m
[31m-can have several additional parameters specific to socket-related system calls.[m
[31m-These parameters can be specified in any[m
[31m-C<listen> directive, but only once for a given[m
[31m-I<C<address>>:I<C<port>> pair.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In versions prior to 0.8.21, they could only be[m
[31m-specified in the C<listen> directive together with the[m
[31m-C<default> parameter.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<setfib>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (0.8.44) sets the associated routing table, FIB[m
[31m-(the C<SO_SETFIB> option) for the listening socket.[m
[31m-This currently works only on FreeBSD.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fastopen>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables[m
[31m-“L<TCP Fast Open|http://en.wikipedia.org/wiki/TCP_Fast_Open>”[m
[31m-for the listening socket (1.5.8) and[m
[31m-L<limits|http://tools.ietf.org/html/rfc7413#section-5.1>[m
[31m-the maximum length for the queue of connections that have not yet completed[m
[31m-the three-way handshake.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Do not enable this feature unless the server can handle[m
[31m-receiving the[m
[31m-L<same SYN packet with data|http://tools.ietf.org/html/rfc7413#section-6.1> more than once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backlog>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the C<backlog> parameter in the[m
[31m-C<listen> call that limits[m
[31m-the maximum length for the queue of pending connections.[m
[31m-By default,[m
[31m-C<backlog> is set to -1 on FreeBSD, DragonFly BSD, and Mac OS X,[m
[31m-and to 511 on other platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<rcvbuf>=I<C<size>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the receive buffer size[m
[31m-(the C<SO_RCVBUF> option) for the listening socket.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<sndbuf>=I<C<size>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the send buffer size[m
[31m-(the C<SO_SNDBUF> option) for the listening socket.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<accept_filter>=I<C<filter>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the name of accept filter[m
[31m-(the C<SO_ACCEPTFILTER> option) for the listening socket[m
[31m-that filters incoming connections before passing them to[m
[31m-C<accept>.[m
[31m-This works only on FreeBSD and NetBSD 5.0+.[m
[31m-Possible values are[m
[31m-L<dataready|http://man.freebsd.org/accf_data>[m
[31m-and[m
[31m-L<httpready|http://man.freebsd.org/accf_http>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<deferred>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-instructs to use a deferred C<accept>[m
[31m-(the C<TCP_DEFER_ACCEPT> socket option) on Linux.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<bind>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-instructs to make a separate C<bind> call for a given[m
[31m-I<C<address>>:I<C<port>> pair.[m
[31m-This is useful because if there are several C<listen>[m
[31m-directives with the same port but different addresses, and one of the[m
[31m-C<listen> directives listens on all addresses[m
[31m-for the given port (C<*:>I<C<port>>), nginx[m
[31m-will C<bind> only to C<*:>I<C<port>>.[m
[31m-It should be noted that the C<getsockname> system call will be[m
[31m-made in this case to determine the address that accepted the connection.[m
[31m-If the C<setfib>,[m
[31m-C<backlog>, C<rcvbuf>,[m
[31m-C<sndbuf>, C<accept_filter>,[m
[31m-C<deferred>, C<ipv6only>,[m
[31m-or C<so_keepalive> parameters[m
[31m-are used then for a given[m
[31m-I<C<address>>:I<C<port>> pair[m
[31m-a separate C<bind> call will always be made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<ipv6only>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (0.7.42) determines[m
[31m-(via the C<IPV6_V6ONLY> socket option)[m
[31m-whether an IPv6 socket listening on a wildcard address C<[::]>[m
[31m-will accept only IPv6 connections or both IPv6 and IPv4 connections.[m
[31m-This parameter is turned on by default.[m
[31m-It can only be set once on start.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.3.4,[m
[31m-if this parameter was omitted then the operating system’s settings were[m
[31m-in effect for the socket.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<reuseport>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (1.9.1) instructs to create an individual listening socket[m
[31m-for each worker process[m
[31m-(using the C<SO_REUSEPORT> socket option), allowing a kernel[m
[31m-to distribute incoming connections between worker processes.[m
[31m-This currently works only on Linux 3.9+ and DragonFly BSD.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Inappropriate use of this option may have its security[m
[31m-L<implications|http://man7.org/linux/man-pages/man7/socket.7.html>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (1.1.11) configures the “TCP keepalive” behavior[m
[31m-for the listening socket.[m
[31m-If this parameter is omitted then the operating system’s settings will be[m
[31m-in effect for the socket.[m
[31m-If it is set to the value “C<on>”, the[m
[31m-C<SO_KEEPALIVE> option is turned on for the socket.[m
[31m-If it is set to the value “C<off>”, the[m
[31m-C<SO_KEEPALIVE> option is turned off for the socket.[m
[31m-Some operating systems support setting of TCP keepalive parameters on[m
[31m-a per-socket basis using the C<TCP_KEEPIDLE>,[m
[31m-C<TCP_KEEPINTVL>, and C<TCP_KEEPCNT> socket options.[m
[31m-On such systems (currently, Linux 2.4+, NetBSD 5+, and[m
[31m-FreeBSD 9.0-STABLE), they can be configured[m
[31m-using the I<C<keepidle>>, I<C<keepintvl>>, and[m
[31m-I<C<keepcnt>> parameters.[m
[31m-One or two parameters may be omitted, in which case the system default setting[m
[31m-for the corresponding socket option will be in effect.[m
[31m-For example,[m
[31m-[m
[31m-    so_keepalive=30m::10[m
[31m-[m
[31m-will set the idle timeout (C<TCP_KEEPIDLE>) to 30 minutes,[m
[31m-leave the probe interval (C<TCP_KEEPINTVL>) at its system default,[m
[31m-and set the probes count (C<TCP_KEEPCNT>) to 10 probes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 location[m
[31m-[m
[31m-[m
[31m-B<syntax:> location I<[[m
[31m-    C<=> E<verbar>[m
[31m-    C<~> E<verbar>[m
[31m-    C<~*> E<verbar>[m
[31m-    C<^~>[m
[31m-    ] I<C<uri>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-B<syntax:> location I<C<@>I<C<name>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets configuration depending on a request URI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The matching is performed against a normalized URI,[m
[31m-after decoding the text encoded in the “C<%XX>” form,[m
[31m-resolving references to relative path components “C<.>”[m
[31m-and “C<..>”, and possible[m
[31m-compression of two or more[m
[31m-adjacent slashes into a single slash.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A location can either be defined by a prefix string, or by a regular expression.[m
[31m-Regular expressions are specified with the preceding[m
[31m-“C<~*>” modifier (for case-insensitive matching), or the[m
[31m-“C<~>” modifier (for case-sensitive matching).[m
[31m-To find location matching a given request, nginx first checks[m
[31m-locations defined using the prefix strings (prefix locations).[m
[31m-Among them, the location with the longest matching[m
[31m-prefix is selected and remembered.[m
[31m-Then regular expressions are checked, in the order of their appearance[m
[31m-in the configuration file.[m
[31m-The search of regular expressions terminates on the first match,[m
[31m-and the corresponding configuration is used.[m
[31m-If no match with a regular expression is found then the[m
[31m-configuration of the prefix location remembered earlier is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<location> blocks can be nested, with some exceptions[m
[31m-mentioned below.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For case-insensitive operating systems such as Mac OS X and Cygwin,[m
[31m-matching with prefix strings ignores a case (0.7.7).[m
[31m-However, comparison is limited to one-byte locales.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Regular expressions can contain captures (0.7.40) that can later[m
[31m-be used in other directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the longest matching prefix location has the “C<^~>” modifier[m
[31m-then regular expressions are not checked.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Also, using the “C<=>” modifier it is possible to define[m
[31m-an exact match of URI and location.[m
[31m-If an exact match is found, the search terminates.[m
[31m-For example, if a “C<E<sol>>” request happens frequently,[m
[31m-defining “C<location = E<sol>>” will speed up the processing[m
[31m-of these requests, as search terminates right after the first[m
[31m-comparison.[m
[31m-Such a location cannot obviously contain nested locations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In versions from 0.7.1 to 0.8.41, if a request matched the prefix[m
[31m-location without the “C<=>” and “C<^~>”[m
[31m-modifiers, the search also terminated and regular expressions were[m
[31m-not checked.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Let’s illustrate the above by an example:[m
[31m-[m
[31m-    [m
[31m-    location = / {[m
[31m-        [ configuration A ][m
[31m-    }[m
[31m-    [m
[31m-    location / {[m
[31m-        [ configuration B ][m
[31m-    }[m
[31m-    [m
[31m-    location /documents/ {[m
[31m-        [ configuration C ][m
[31m-    }[m
[31m-    [m
[31m-    location ^~ /images/ {[m
[31m-        [ configuration D ][m
[31m-    }[m
[31m-    [m
[31m-    location ~* \.(gif|jpg|jpeg)$ {[m
[31m-        [ configuration E ][m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The “C<E<sol>>” request will match configuration A,[m
[31m-the “C<E<sol>index.html>” request will match configuration B,[m
[31m-the “C<E<sol>documentsE<sol>document.html>” request will match[m
[31m-configuration C,[m
[31m-the “C<E<sol>imagesE<sol>1.gif>” request will match configuration D, and[m
[31m-the “C<E<sol>documentsE<sol>1.jpg>” request will match configuration E.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The “C<@>” prefix defines a named location.[m
[31m-Such a location is not used for a regular request processing, but instead[m
[31m-used for request redirection.[m
[31m-They cannot be nested, and cannot contain nested locations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a location is defined by a prefix string that ends with the slash character,[m
[31m-and requests are processed by one of[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-L<ngx_http_scgi_module>, or[m
[31m-L<ngx_http_memcached_module>,[m
[31m-then the special processing is performed.[m
[31m-In response to a request with URI equal to this string,[m
[31m-but without the trailing slash,[m
[31m-a permanent redirect with the code 301 will be returned to the requested URI[m
[31m-with the slash appended.[m
[31m-If this is not desired, an exact match of the URI and location could be[m
[31m-defined like this:[m
[31m-[m
[31m-    [m
[31m-    location /user/ {[m
[31m-        proxy_pass http://user.example.com;[m
[31m-    }[m
[31m-    [m
[31m-    location = /user {[m
[31m-        proxy_pass http://login.example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_not_found[m
[31m-[m
[31m-[m
[31m-B<syntax:> log_not_found I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables logging of errors about not found files into[m
[31m-L<ngx_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_subrequest[m
[31m-[m
[31m-[m
[31m-B<syntax:> log_subrequest I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables logging of subrequests into[m
[31m-L<ngx_http_log_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 max_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> max_ranges I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the maximum allowed number of ranges in byte-range requests.[m
[31m-Requests that exceed the limit are processed as if there were no[m
[31m-byte ranges specified.[m
[31m-By default, the number of ranges is not limited.[m
[31m-The zero value disables the byte-range support completely.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 merge_slashes[m
[31m-[m
[31m-[m
[31m-B<syntax:> merge_slashes I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables compression of two or more adjacent slashes[m
[31m-in a URI into a single slash.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that compression is essential for the correct matching of prefix string[m
[31m-and regular expression locations.[m
[31m-Without it, the “C<E<sol>E<sol>scriptsE<sol>one.php>” request would not match[m
[31m-[m
[31m-    [m
[31m-    location /scripts/ {[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-and might be processed as a static file.[m
[31m-So it gets converted to “C<E<sol>scriptsE<sol>one.php>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turning the compression C<off> can become necessary if a URI[m
[31m-contains base64-encoded names, since base64 uses the “C<E<sol>>”[m
[31m-character internally.[m
[31m-However, for security considerations, it is better to avoid turning[m
[31m-the compression off.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is specified on the L</server> level,[m
[31m-its value is only used if a server is a default one.[m
[31m-The value specified also applies to all virtual servers[m
[31m-listening on the same address and port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 msie_padding[m
[31m-[m
[31m-[m
[31m-B<syntax:> msie_padding I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables adding comments to responses for MSIE clients with status[m
[31m-greater than 400 to increase the response size to 512 bytes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 msie_refresh[m
[31m-[m
[31m-[m
[31m-B<syntax:> msie_refresh I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables issuing refreshes instead of redirects for MSIE clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_file_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache I<[m
[31m-C<max>=I<C<N>>[m
[31m-[C<inactive>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures a cache that can store:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-open file descriptors, their sizes and modification times;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-information on existence of directories;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-file lookup errors, such as “file not found”, “no read permission”,[m
[31m-and so on.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Caching of errors should be enabled separately by the[m
[31m-L</open_file_cache_errors>[m
[31m-directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive has the following parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the maximum number of elements in the cache;[m
[31m-on cache overflow the least recently used (LRU) elements are removed;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<inactive>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines a time after which an element is removed from the cache[m
[31m-if it has not been accessed during this time;[m
[31m-by default, it is 60 seconds;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    open_file_cache          max=1000 inactive=20s;[m
[31m-    open_file_cache_valid    30s;[m
[31m-    open_file_cache_min_uses 2;[m
[31m-    open_file_cache_errors   on;<!--[m
[31m-    open_file_cache_events   on;[m
[31m-    -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_file_cache_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables caching of file lookup errors by[m
[31m-L</open_file_cache>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_file_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the minimum I<C<number>> of file accesses during[m
[31m-the period configured by the C<inactive> parameter[m
[31m-of the L</open_file_cache> directive, required for a file[m
[31m-descriptor to remain open in the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_file_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_file_cache_valid I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a time after which[m
[31m-L</open_file_cache>[m
[31m-elements should be validated.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 output_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> output_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<2 32k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from a disk.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.9.5, the default value was 1 32k.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 port_in_redirect[m
[31m-[m
[31m-[m
[31m-B<syntax:> port_in_redirect I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables specifying the port in redirects issued by nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The use of the primary server name in redirects is controlled by[m
[31m-the L</server_name_in_redirect> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 postpone_output[m
[31m-[m
[31m-[m
[31m-B<syntax:> postpone_output I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1460>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If possible, the transmission of client data will be postponed until[m
[31m-nginx has at least I<C<size>> bytes of data to send.[m
[31m-The zero value disables postponing data transmission.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 read_ahead[m
[31m-[m
[31m-[m
[31m-B<syntax:> read_ahead I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the amount of pre-reading for the kernel when working with file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On Linux, the[m
[31m-C<posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL)>[m
[31m-system call is used, and so the I<C<size>> parameter is ignored.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On FreeBSD, the[m
[31m-C<fcntl(O_READAHEAD,>[m
[31m-I<C<size>>C<)>[m
[31m-system call, supported since FreeBSDE<nbsp>9.0-CURRENT, is used.[m
[31m-FreeBSDE<nbsp>7 has to be[m
[31m-L<patched|http://sysoev.ru/freebsd/patch.readahead.txt>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 recursive_error_pages[m
[31m-[m
[31m-[m
[31m-B<syntax:> recursive_error_pages I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables doing several redirects using the[m
[31m-L</error_page>[m
[31m-directive.[m
[31m-The number of such redirects is limited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 request_pool_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> request_pool_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows accurate tuning of per-request memory allocations.[m
[31m-This directive has minimal impact on performance[m
[31m-and should not generally be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 reset_timedout_connection[m
[31m-[m
[31m-[m
[31m-B<syntax:> reset_timedout_connection I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables resetting timed out connections.[m
[31m-The reset is performed as follows.[m
[31m-Before closing a socket, the[m
[31m-C<SO_LINGER>[m
[31m-option is set on it with a timeout value of 0.[m
[31m-When the socket is closed, TCP RST is sent to the client, and all memory[m
[31m-occupied by this socket is released.[m
[31m-This helps avoid keeping an already closed socket with filled buffers[m
[31m-in a FIN_WAIT1 state for a long time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be noted that timed out keep-alive connections are[m
[31m-closed normally.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver I<[m
[31m-    I<C<address>> ...[m
[31m-    [C<valid>=I<C<time>>][m
[31m-    [C<ipv6>=C<on>E<verbar>C<off>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures name servers used to resolve names of upstream servers[m
[31m-into addresses, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353;[m
[31m-[m
[31m-[m
[31m-An address can be specified as a domain name or IP address,[m
[31m-and an optional port (1.3.1, 1.2.2).[m
[31m-If port is not specified, the port 53 is used.[m
[31m-Name servers are queried in a round-robin fashion.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.7, only a single name server could be configured.[m
[31m-Specifying name servers using IPv6 addresses is supported[m
[31m-starting from versions 1.3.1 and 1.2.2.[m
[31m-[m
[31m-By default, nginx will look up both IPv4 and IPv6 addresses while resolving.[m
[31m-If looking up of IPv6 addresses is not desired,[m
[31m-the C<ipv6=off> parameter can be specified.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Resolving of names into IPv6 addresses is supported[m
[31m-starting from version 1.5.8.[m
[31m-[m
[31m-By default, nginx caches answers using the TTL value of a response.[m
[31m-An optional C<valid> parameter allows overriding it:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353 valid=30s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.9, tuning of caching time was not possible,[m
[31m-and nginx always cached answers for the duration of 5 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for name resolution, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 root[m
[31m-[m
[31m-[m
[31m-B<syntax:> root I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the root directory for requests.[m
[31m-For example, with the following configuration[m
[31m-[m
[31m-    [m
[31m-    location /i/ {[m
[31m-        root /data/w3;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The F<E<sol>dataE<sol>w3E<sol>iE<sol>top.gif> file will be sent in response to[m
[31m-the “C<E<sol>iE<sol>top.gif>” request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<path>> value can contain variables,[m
[31m-except C<$document_root> and C<$realpath_root>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A path to the file is constructed by merely adding a URI to the value[m
[31m-of the C<root> directive.[m
[31m-If a URI has to be modified, the[m
[31m-L</alias> directive should be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 satisfy[m
[31m-[m
[31m-[m
[31m-B<syntax:> satisfy I<C<all> E<verbar> C<any>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<all>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows access if all (C<all>) or at least one[m
[31m-(C<any>) of the[m
[31m-L<ngx_http_access_module|ngx_http_access_module>,[m
[31m-L<ngx_http_auth_basic_module|ngx_http_auth_basic_module> or[m
[31m-L<ngx_http_auth_request_module|ngx_http_auth_request_module>[m
[31m-modules allow access.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        satisfy any;[m
[31m-    [m
[31m-        allow 192.168.1.0/32;[m
[31m-        deny  all;[m
[31m-    [m
[31m-        auth_basic           "closed site";[m
[31m-        auth_basic_user_file conf/htpasswd;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 send_lowat[m
[31m-[m
[31m-[m
[31m-B<syntax:> send_lowat I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is set to a non-zero value, nginx will try to minimize[m
[31m-the number of send operations on client sockets by using either[m
[31m-C<NOTE_LOWAT> flag of the[m
[31m-L<events> method[m
[31m-or the C<SO_SNDLOWAT> socket option.[m
[31m-In both cases the specified I<C<size>> is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is ignored on Linux, Solaris, and Windows.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a response to the client.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the client does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sendfile[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> sendfile I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of[m
[31m-C<sendfile>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Starting from nginxE<nbsp>0.8.12 and FreeBSDE<nbsp>5.2.1,[m
[31m-L</aio> can be used to pre-load data[m
[31m-for C<sendfile>:[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        sendfile       on;[m
[31m-        tcp_nopush     on;[m
[31m-        aio            on;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-In this configuration, C<sendfile> is called with[m
[31m-the C<SF_NODISKIO> flag which causes it not to block on disk IE<sol>O,[m
[31m-but, instead, report back that the data are not in memory.[m
[31m-nginx then initiates an asynchronous data load by reading one byte.[m
[31m-On the first read, the FreeBSD kernel loads the first 128K bytes[m
[31m-of a file into memory, although next reads will only load data in 16K chunks.[m
[31m-This can be changed using the[m
[31m-L</read_ahead> directive.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.7.11, pre-loading could be enabled with[m
[31m-C<aio sendfile;>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sendfile_max_chunk[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> sendfile_max_chunk I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When set to a non-zero value, limits the amount of data that can be[m
[31m-transferred in a single C<sendfile> call.[m
[31m-Without the limit, one fast connection may seize the worker process entirely.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-server { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets configuration for a virtual server.[m
[31m-There is no clear separation between IP-based (based on the IP address)[m
[31m-and name-based (based on the C<Host> request header field)[m
[31m-virtual servers.[m
[31m-Instead, the L</listen> directives describe all[m
[31m-addresses and ports that should accept connections for the server, and the[m
[31m-L</server_name> directive lists all server names.[m
[31m-Example configurations are provided in the[m
[31m-“L<request_processing>” document.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_name I<I<C<name>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<"">[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets names of a virtual server, for example:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name example.com www.example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first name becomes the primary server name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Server names can include an asterisk (“C<*>”)[m
[31m-replacing the first or last part of a name:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name example.com *.example.com www.example.*;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Such names are called wildcard names.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first two of the names mentioned above can be combined in one:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name .example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to use regular expressions in server names,[m
[31m-preceding the name with a tilde (“C<~>”):[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name www.example.com ~^www\d+\.example\.com$;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Regular expressions can contain captures (0.7.40) that can later[m
[31m-be used in other directives:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name ~^(www\.)?(.+)$;[m
[31m-    [m
[31m-        location / {[m
[31m-            root /sites/$2;[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        server_name _;[m
[31m-    [m
[31m-        location / {[m
[31m-            root /sites/default;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Named captures in regular expressions create variables (0.8.25)[m
[31m-that can later be used in other directives:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name ~^(www\.)?(?<domain>.+)$;[m
[31m-    [m
[31m-        location / {[m
[31m-            root /sites/$domain;[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        server_name _;[m
[31m-    [m
[31m-        location / {[m
[31m-            root /sites/default;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive’s parameter is set to “C<$hostname>” (0.9.4), the[m
[31m-machine’s hostname is inserted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is also possible to specify an empty server name (0.7.11):[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name www.example.com "";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-It allows this server to process requests without the C<Host>[m
[31m-header field — instead of the default server — for the given address:port pair.[m
[31m-This is the default setting.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 0.8.48, the machine’s hostname was used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-During searching for a virtual server by name,[m
[31m-if the name matches more than one of the specified variants,[m
[31m-(e.g. both a wildcard name and regular expression match), the first matching[m
[31m-variant will be chosen, in the following order of priority:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-the exact name[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-the longest wildcard name starting with an asterisk,[m
[31m-e.g. “C<*.example.com>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-the longest wildcard name ending with an asterisk,[m
[31m-e.g. “C<mail.*>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-the first matching regular expression[m
[31m-(in order of appearance in the configuration file)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Detailed description of server names is provided in a separate[m
[31m-L<server_names> document.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_name_in_redirect[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_name_in_redirect I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of the primary server name, specified by the[m
[31m-L</server_name>[m
[31m-directive, in redirects issued by nginx.[m
[31m-When the use of the primary server name is disabled, the name from the[m
[31m-C<Host> request header field is used.[m
[31m-If this field is not present, the IP address of the server is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The use of a port in redirects is controlled by[m
[31m-the L</port_in_redirect> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_names_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_names_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32E<verbar>64E<verbar>128>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the server names hash tables.[m
[31m-The default value depends on the size of the processor’s cache line.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_names_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_names_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the server names hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_tokens[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_tokens I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables emitting nginx version in error messages and in the[m
[31m-C<Server> response header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, as part of our[m
[31m-commercial subscription,[m
[31m-starting from version 1.9.13[m
[31m-the signature in error messages and[m
[31m-the C<Server> response header field value[m
[31m-can be set explicitly using the I<C<string>> with variables.[m
[31m-An empty string disables the emission of the C<Server> field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcp_nodelay[m
[31m-[m
[31m-[m
[31m-B<syntax:> tcp_nodelay I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of the C<TCP_NODELAY> option.[m
[31m-The option is enabled only when a connection is transitioned into the[m
[31m-keep-alive state.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcp_nopush[m
[31m-[m
[31m-[m
[31m-B<syntax:> tcp_nopush I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of[m
[31m-the C<TCP_NOPUSH> socket option on FreeBSD[m
[31m-or the C<TCP_CORK> socket option on Linux.[m
[31m-The options are enabled only when L</sendfile> is used.[m
[31m-Enabling the option allows[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-sending the response header and the beginning of a file in one packet,[m
[31m-on Linux and FreeBSDE<nbsp>4.*;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-sending a file in full packets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 try_files[m
[31m-[m
[31m-[m
[31m-B<syntax:> try_files I<I<C<file>> ... I<C<uri>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> try_files I<I<C<file>> ... =I<C<code>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Checks the existence of files in the specified order and uses[m
[31m-the first found file for request processing; the processing[m
[31m-is performed in the current context.[m
[31m-The path to a file is constructed from the[m
[31m-I<C<file>> parameter[m
[31m-according to the[m
[31m-L</root> and L</alias> directives.[m
[31m-It is possible to check directory’s existence by specifying[m
[31m-a slash at the end of a name, e.g. “C<$uriE<sol>>”.[m
[31m-If none of the files were found, an internal redirect to the[m
[31m-I<C<uri>> specified in the last parameter is made.[m
[31m-For example:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        try_files $uri /images/default.gif;[m
[31m-    }[m
[31m-    [m
[31m-    location = /images/default.gif {[m
[31m-        expires 30s;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The last parameter can also point to a named location,[m
[31m-as shown in examples below.[m
[31m-Starting from version 0.7.51, the last parameter can also be a[m
[31m-I<C<code>>:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files $uri $uri/index.html $uri.html =404;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example in proxying Mongrel:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files /system/maintenance.html[m
[31m-                  $uri $uri/index.html $uri.html[m
[31m-                  @mongrel;[m
[31m-    }[m
[31m-    [m
[31m-    location @mongrel {[m
[31m-        proxy_pass http://mongrel;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example for DrupalE<sol>FastCGI:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files $uri $uri/ @drupal;[m
[31m-    }[m
[31m-    [m
[31m-    location ~ \.php$ {[m
[31m-        try_files $uri @drupal;[m
[31m-    [m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;[m
[31m-        fastcgi_param SCRIPT_NAME     $fastcgi_script_name;[m
[31m-        fastcgi_param QUERY_STRING    $args;[m
[31m-    [m
[31m-        ... other fastcgi_param's[m
[31m-    }[m
[31m-    [m
[31m-    location @drupal {[m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to/index.php;[m
[31m-        fastcgi_param SCRIPT_NAME     /index.php;[m
[31m-        fastcgi_param QUERY_STRING    q=$uri&$args;[m
[31m-    [m
[31m-        ... other fastcgi_param's[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-In the following example,[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files $uri $uri/ @drupal;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-the C<try_files> directive is equivalent to[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        error_page 404 = @drupal;[m
[31m-        log_not_found off;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-And here,[m
[31m-[m
[31m-    [m
[31m-    location ~ \.php$ {[m
[31m-        try_files $uri @drupal;[m
[31m-    [m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;[m
[31m-    [m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-C<try_files> checks the existence of the PHP file[m
[31m-before passing the request to the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example for Wordpress and Joomla:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        try_files $uri $uri/ @wordpress;[m
[31m-    }[m
[31m-    [m
[31m-    location ~ \.php$ {[m
[31m-        try_files $uri @wordpress;[m
[31m-    [m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;[m
[31m-        ... other fastcgi_param's[m
[31m-    }[m
[31m-    [m
[31m-    location @wordpress {[m
[31m-        fastcgi_pass ...;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to/index.php;[m
[31m-        ... other fastcgi_param's[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 types[m
[31m-[m
[31m-[m
[31m-types { B<...> }[m
[31m-[m
[31m-[m
[31m-B<default:> I<[m
[31m-    textE<sol>html  html;[m
[31m-    imageE<sol>gif  gif;[m
[31m-    imageE<sol>jpeg jpg;[m
[31m->[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Maps file name extensions to MIME types of responses.[m
[31m-Extensions are case-insensitive.[m
[31m-Several extensions can be mapped to one type, for example:[m
[31m-[m
[31m-    [m
[31m-    types {[m
[31m-        application/octet-stream bin exe dll;[m
[31m-        application/octet-stream deb;[m
[31m-        application/octet-stream dmg;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A sufficiently full mapping table is distributed with nginx in the[m
[31m-F<confE<sol>mime.types> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To make a particular location emit the[m
[31m-“C<applicationE<sol>octet-stream>”[m
[31m-MIME type for all requests, the following configuration can be used:[m
[31m-[m
[31m-    [m
[31m-    location /download/ {[m
[31m-        types        { }[m
[31m-        default_type application/octet-stream;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 types_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> types_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the types hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.5.13,[m
[31m-the default value depended on the size of the processor’s cache line.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 types_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> types_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the types hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 underscores_in_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> underscores_in_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of underscores in client request header fields.[m
[31m-When the use of underscores is disabled, request header fields whose names[m
[31m-contain underscores are[m
[31m-marked as invalid and become subject to the[m
[31m-L</ignore_invalid_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is specified on the L</server> level,[m
[31m-its value is only used if a server is a default one.[m
[31m-The value specified also applies to all virtual servers[m
[31m-listening on the same address and port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 variables_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> variables_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the variables hash table.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 variables_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> variables_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the variables hash table.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.5.13, the default value was 512.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_core_module> module supports embedded variables[m
[31m-with names matching the Apache Server variables.[m
[31m-First of all, these are variables representing client request header[m
[31m-fields, such as C<$http_user_agent>, C<$http_cookie>,[m
[31m-and so on.[m
[31m-Also there are other variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$arg_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-argument I<C<name>> in the request line[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$args>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-arguments in the request line[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$binary_remote_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client address in a binary form, value’s length is always 4 bytes[m
[31m-for IPv4 addresses or 16 bytes for IPv6 addresses[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$body_bytes_sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-number of bytes sent to a client, not counting the response header;[m
[31m-this variable is compatible with the “C<%B>” parameter of the[m
[31m-C<mod_log_config>[m
[31m-Apache module[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$bytes_sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-number of bytes sent to a client (1.3.8, 1.2.5)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connection>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-connection serial number (1.3.8, 1.2.5)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connection_requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current number of requests made through a connection (1.3.8, 1.2.5)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$content_length>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<Content-Length> request header field[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$content_type>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-C<Content-Type> request header field[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$cookie_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the I<C<name>> cookie[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$document_root>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L</root> or L</alias> directive’s value[m
[31m-for the current request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$document_uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as C<$uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$host>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-in this order of precedence:[m
[31m-host name from the request line, or[m
[31m-host name from the C<Host> request header field, or[m
[31m-the server name matching a request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$hostname>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-host name[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$http_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-arbitrary request header field;[m
[31m-the last part of a variable name is the field name converted[m
[31m-to lower case with dashes replaced by underscores[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$https>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<on>”[m
[31m-if connection operates in SSL mode,[m
[31m-or an empty string otherwise[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$is_args>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<?>” if a request line has arguments,[m
[31m-or an empty string otherwise[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$limit_rate>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-setting this variable enables response rate limiting;[m
[31m-see L</limit_rate>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$msec>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current time in seconds with the milliseconds resolution (1.3.9, 1.2.6)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$nginx_version>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx version[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$pid>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-PID of the worker process[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$pipe>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<p>” if request was pipelined, “C<.>”[m
[31m-otherwise (1.3.12, 1.2.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$proxy_protocol_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client address from the PROXY protocol header, or an empty string otherwise[m
[31m-(1.5.12)[m
[31m-[m
[31m-[m
[31m-The PROXY protocol must be previously enabled by setting the[m
[31m-C<proxy_protocol> parameter[m
[31m-in the L</listen> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$proxy_protocol_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client port from the PROXY protocol header, or an empty string otherwise[m
[31m-(1.11.0)[m
[31m-[m
[31m-[m
[31m-The PROXY protocol must be previously enabled by setting the[m
[31m-C<proxy_protocol> parameter[m
[31m-in the L</listen> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$query_string>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as C<$args>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$realpath_root>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-an absolute pathname corresponding to the[m
[31m-L</root> or L</alias> directive’s value[m
[31m-for the current request,[m
[31m-with all symbolic links resolved to real paths[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$remote_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client address[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$remote_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-client port[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$remote_user>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-user name supplied with the Basic authentication[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-full original request line[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_body>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request body[m
[31m-[m
[31m-[m
[31m-The variable’s value is made available in locations[m
[31m-processed by the[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_body_file>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-name of a temporary file with the request body[m
[31m-[m
[31m-[m
[31m-At the end of processing, the file needs to be removed.[m
[31m-To always write the request body to a file,[m
[31m-L</client_body_in_file_only> needs to be enabled.[m
[31m-When the name of a temporary file is passed in a proxied request[m
[31m-or in a request to a FastCGIE<sol>uwsgiE<sol>SCGI server,[m
[31m-passing the request body should be disabled by the[m
[31m-L<proxy_pass_request_body off|ngx_http_proxy_module>,[m
[31m-L<fastcgi_pass_request_body off|ngx_http_fastcgi_module>,[m
[31m-L<uwsgi_pass_request_body off|ngx_http_uwsgi_module>, or[m
[31m-L<scgi_pass_request_body off|ngx_http_scgi_module>[m
[31m-directives, respectively.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_completion>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<OK>” if a request has completed,[m
[31m-or an empty string otherwise[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_filename>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-file path for the current request, based on the[m
[31m-L</root> or L</alias>[m
[31m-directives, and the request URI[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-unique request identifier (1.11.0)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_length>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request length (including request line, header, and request body)[m
[31m-(1.3.12, 1.2.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_method>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request method, usually[m
[31m-“C<GET>” or “C<POST>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request processing time in seconds with a milliseconds resolution[m
[31m-(1.3.9, 1.2.6);[m
[31m-time elapsed since the first bytes were read from the client[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-full original request URI (with arguments)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$scheme>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request scheme, “C<http>” or “C<https>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$sent_http_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-arbitrary response header field;[m
[31m-the last part of a variable name is the field name converted[m
[31m-to lower case with dashes replaced by underscores[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$server_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-an address of the server which accepted a request[m
[31m-[m
[31m-[m
[31m-Computing a value of this variable usually requires one system call.[m
[31m-To avoid a system call, the L</listen> directives[m
[31m-must specify addresses and use the C<bind> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$server_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-name of the server which accepted a request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$server_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-port of the server which accepted a request[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$server_protocol>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request protocol, usually[m
[31m-“C<HTTPE<sol>1.0>”,[m
[31m-“C<HTTPE<sol>1.1>”,[m
[31m-or[m
[31m-“L<HTTPE<sol>2.0|ngx_http_v2_module>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$status>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-response status (1.3.2, 1.2.2)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<$tcpinfo_rtt>,[m
[31m-C<$tcpinfo_rttvar>,[m
[31m-C<$tcpinfo_snd_cwnd>,[m
[31m-C<$tcpinfo_rcv_space>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-information about the client TCP connection; available on systems[m
[31m-that support the C<TCP_INFO> socket option[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$time_iso8601>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-local time in the ISO 8601 standard format (1.3.12, 1.2.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$time_local>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-local time in the Common Log Format (1.3.12, 1.2.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current URI in request, normalized[m
[31m-[m
[31m-[m
[31m-The value of C<$uri> may change during request processing,[m
[31m-e.g. when doing internal redirects, or when using index files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_dav_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_dav_module.pod[m
[1mdeleted file mode 100644[m
[1mindex dbdf576..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_dav_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,255 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_dav_module - Module ngx_http_dav_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_dav_module> module is intended for file[m
[31m-management automation via the WebDAV protocol.[m
[31m-The module processes HTTP and WebDAV[m
[31m-methods PUT, DELETE, MKCOL, COPY, and MOVE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_dav_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-WebDAV clients that require additional WebDAV methods to operate[m
[31m-will not work with this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        root                  /data/www;[m
[31m-    [m
[31m-        client_body_temp_path /data/client_temp;[m
[31m-    [m
[31m-        dav_methods PUT DELETE MKCOL COPY MOVE;[m
[31m-    [m
[31m-        create_full_put_path  on;[m
[31m-        dav_access            group:rw  all:r;[m
[31m-    [m
[31m-        limit_except GET {[m
[31m-            allow 192.168.1.0/32;[m
[31m-            deny  all;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 dav_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> dav_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    dav_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    dav_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 dav_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> dav_methods I<[m
[31m-    C<off> E<verbar> I<C<method>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows the specified HTTP and WebDAV methods.[m
[31m-The parameter C<off> denies all methods processed[m
[31m-by this module.[m
[31m-The following methods are supported:[m
[31m-C<PUT>, C<DELETE>, C<MKCOL>,[m
[31m-C<COPY>, and C<MOVE>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A file uploaded with the PUT method is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the[m
[31m-L<ngx_http_core_module>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When creating a file with the PUT method, it is possible to specify[m
[31m-the modification date by passing it in the C<Date>[m
[31m-header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 create_full_put_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> create_full_put_path I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The WebDAV specification only allows creating files in already[m
[31m-existing directories.[m
[31m-This directive allows creating all needed intermediate directories.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 min_delete_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> min_delete_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows the DELETE method to remove files provided that[m
[31m-the number of elements in a request path is not less than the specified[m
[31m-number.[m
[31m-For example, the directive[m
[31m-[m
[31m-    [m
[31m-    min_delete_depth 4;[m
[31m-[m
[31m-[m
[31m-allows removing files on requests[m
[31m-[m
[31m-    [m
[31m-    /users/00/00/name[m
[31m-    /users/00/00/name/pic.jpg[m
[31m-    /users/00/00/page.html[m
[31m-[m
[31m-[m
[31m-and denies the removal of[m
[31m-[m
[31m-    [m
[31m-    /users/00/00[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_empty_gif_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_empty_gif_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a992c8f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_empty_gif_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,55 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_empty_gif_module - Module ngx_http_empty_gif_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_empty_gif_module> module emits[m
[31m-single-pixel transparent GIF.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location = /_.gif {[m
[31m-        empty_gif;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 empty_gif[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_f4f_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_f4f_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a3a8141..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_f4f_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,115 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_f4f_module - Module ngx_http_f4f_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_f4f_module> module provides[m
[31m-server-side support for Adobe HTTP Dynamic Streaming (HDS).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module implements handling of HTTP Dynamic Streaming requests in the[m
[31m-“C<E<sol>videoSeg1-Frag1>” form — extracting the needed fragment[m
[31m-from the F<videoSeg1.f4f> file using the F<videoSeg1.f4x>[m
[31m-index file.[m
[31m-This module is an alternative to the Adobe’s f4f module (HTTP Origin Module)[m
[31m-for Apache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usual pre-processing with Adobe’s f4fpackager is required, see relevant[m
[31m-documentation for details.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        f4f;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 f4f[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on module processing in the surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 f4f_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> f4f_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for[m
[31m-reading the F<.f4x> index file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_fastcgi_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_fastcgi_module.pod[m
[1mdeleted file mode 100644[m
[1mindex e7bea5c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_fastcgi_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,2495 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_fastcgi_module - Module ngx_http_fastcgi_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_fastcgi_module> module allows passing[m
[31m-requests to a FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        fastcgi_pass  localhost:9000;[m
[31m-        fastcgi_index index.php;[m
[31m-    [m
[31m-        fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;[m
[31m-        fastcgi_param QUERY_STRING    $query_string;[m
[31m-        fastcgi_param REQUEST_METHOD  $request_method;[m
[31m-        fastcgi_param CONTENT_TYPE    $content_type;[m
[31m-        fastcgi_param CONTENT_LENGTH  $content_length;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 fastcgi_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.22.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a FastCGI server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<fastcgi_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a FastCGI server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the first part[m
[31m-of the response received from the FastCGI server.[m
[31m-This part usually contains a small response header.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-It can be made smaller, however.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of responses from the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, nginx receives a response from the FastCGI server[m
[31m-as soon as possible, saving it into the buffers set by the[m
[31m-L</fastcgi_buffer_size> and L</fastcgi_buffers> directives.[m
[31m-If the whole response does not fit into memory, a part of it can be saved[m
[31m-to a temporary file on the disk.[m
[31m-Writing to temporary files is controlled by the[m
[31m-L</fastcgi_max_temp_file_size> and[m
[31m-L</fastcgi_temp_file_write_size> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the response is passed to a client synchronously,[m
[31m-immediately as it is received.[m
[31m-nginx will not try to read the whole response from the FastCGI server.[m
[31m-The maximum size of the data that nginx can receive from the server[m
[31m-at a time is set by the L</fastcgi_buffer_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering can also be enabled or disabled by passing[m
[31m-“C<yes>” or “C<no>” in the[m
[31m-C<X-Accel-Buffering> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L</fastcgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from the FastCGI server,[m
[31m-for a single connection.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_busy_buffers_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_busy_buffers_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the FastCGI[m
[31m-server is enabled, limits the total I<C<size>> of buffers that[m
[31m-can be busy sending a response to the client while the response is not[m
[31m-yet fully read.[m
[31m-In the meantime, the rest of the buffers can be used for reading the response[m
[31m-and, if needed, buffering part of the response to a temporary file.[m
[31m-By default, I<C<size>> is limited by the size of two buffers set by the[m
[31m-L</fastcgi_buffer_size> and L</fastcgi_buffers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache I<I<C<zone>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a shared memory zone used for caching.[m
[31m-The same zone can be used in several places.[m
[31m-Parameter value can contain variables (1.7.9).[m
[31m-The C<off> parameter disables caching inherited[m
[31m-from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_bypass[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_bypass I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be taken from a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be taken from the cache:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_bypass $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    fastcgi_cache_bypass $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</fastcgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_key I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for caching, for example[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_key localhost:9000$request_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_lock[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_lock I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When enabled, only one request at a time will be allowed to populate[m
[31m-a new cache element identified according to the L</fastcgi_cache_key>[m
[31m-directive by passing a request to a FastCGI server.[m
[31m-Other requests of the same cache element will either wait[m
[31m-for a response to appear in the cache or the cache lock for[m
[31m-this element to be released, up to the time set by the[m
[31m-L</fastcgi_cache_lock_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_lock_age[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_lock_age I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the last request passed to the FastCGI server[m
[31m-for populating a new cache element[m
[31m-has not completed for the specified I<C<time>>,[m
[31m-one more request may be passed to the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_lock_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_lock_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for L</fastcgi_cache_lock>.[m
[31m-When the I<C<time>> expires,[m
[31m-the request will be passed to the FastCGI server,[m
[31m-however, the response will not be cached.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 1.7.8, the response could be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_methods I<[m
[31m-    C<GET> E<verbar>[m
[31m-    C<HEAD> E<verbar>[m
[31m-    C<POST>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<GET HEAD>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.59.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the client request method is listed in this directive then[m
[31m-the response will be cached.[m
[31m-“C<GET>” and “C<HEAD>” methods are always[m
[31m-added to the list, though it is recommended to specify them explicitly.[m
[31m-See also the L</fastcgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> of requests after which the response[m
[31m-will be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_path I<[m
[31m-    I<C<path>>[m
[31m-    [C<levels>=I<C<levels>>][m
[31m-    [C<use_temp_path>=C<on>E<verbar>C<off>][m
[31m-    C<keys_zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<inactive>=I<C<time>>][m
[31m-    [C<max_size>=I<C<size>>][m
[31m-    [C<loader_files>=I<C<number>>][m
[31m-    [C<loader_sleep>=I<C<time>>][m
[31m-    [C<loader_threshold>=I<C<time>>][m
[31m-    [C<purger>=C<on>E<verbar>C<off>][m
[31m-    [C<purger_files>=I<C<number>>][m
[31m-    [C<purger_sleep>=I<C<time>>][m
[31m-    [C<purger_threshold>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path and other parameters of a cache.[m
[31m-Cache data are stored in files.[m
[31m-Both the key and file name in a cache are a result of[m
[31m-applying the MD5 function to the proxied URL.[m
[31m-[m
[31m-The C<levels> parameter defines hierarchy levels of a cache.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;[m
[31m-[m
[31m-[m
[31m-file names in a cache will look like this:[m
[31m-[m
[31m-    [m
[31m-    /data/nginx/cache/<emphasis>c</emphasis>/<emphasis>29</emphasis>/b7f54b2df7773722d382f4809d650<emphasis>29c</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A cached response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the cache can be put on[m
[31m-different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both cache and a directory[m
[31m-holding temporary files[m
[31m-are put on the same file system.[m
[31m-A directory for temporary files is set based on[m
[31m-the C<use_temp_path> parameter (1.7.10).[m
[31m-If this parameter is omitted or set to the value C<on>,[m
[31m-the directory set by the L</fastcgi_temp_path> directive[m
[31m-for the given location will be used.[m
[31m-If the value is set to C<off>,[m
[31m-temporary files will be put directly in the cache directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, all active keys and information about data are stored[m
[31m-in a shared memory zone, whose I<C<name>> and I<C<size>>[m
[31m-are configured by the C<keys_zone> parameter.[m
[31m-One megabyte zone can store about 8 thousand keys.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Cached data that are not accessed during the time specified by the[m
[31m-C<inactive> parameter get removed from the cache[m
[31m-regardless of their freshness.[m
[31m-By default, C<inactive> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special “cache manager” process monitors the maximum cache size set[m
[31m-by the C<max_size> parameter.[m
[31m-When this size is exceeded, it removes the least recently used data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A minute after the start the special “cache loader” process is activated.[m
[31m-It loads information about previously cached data stored on file system[m
[31m-into a cache zone.[m
[31m-The loading is done in iterations.[m
[31m-During one iteration no more than C<loader_files> items[m
[31m-are loaded (by default, 100).[m
[31m-Besides, the duration of one iteration is limited by the[m
[31m-C<loader_threshold> parameter (by default, 200 milliseconds).[m
[31m-Between iterations, a pause configured by the C<loader_sleep>[m
[31m-parameter (by default, 50 milliseconds) is made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Instructs whether cache entries that match a[m
[31m-wildcard key[m
[31m-will be removed from the disk by the cache purger (1.7.12).[m
[31m-Setting the parameter to C<on>[m
[31m-(default is C<off>)[m
[31m-will activate the “cache purger” process that[m
[31m-permanently iterates through all cache entries[m
[31m-and deletes the entries that match the wildcard key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_files>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of items that will be scanned during one iteration (1.7.12).[m
[31m-By default, C<purger_files> is set to 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_threshold>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the duration of one iteration (1.7.12).[m
[31m-By default, C<purger_threshold> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_sleep>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a pause between iterations (1.7.12).[m
[31m-By default, C<purger_sleep> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_purge[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_purge I<string ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the request will be considered a cache[m
[31m-purge request.[m
[31m-If at least one value of the string parameters is not empty and is not equal[m
[31m-to “0” then the cache entry with a corresponding[m
[31m-cache key is removed.[m
[31m-The result of successful operation is indicated by returning[m
[31m-the C<204> (C<No Content>) response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the cache key of a purge request ends[m
[31m-with an asterisk (“C<*>”), all cache entries matching the[m
[31m-wildcard key will be removed from the cache.[m
[31m-However, these entries will remain on the disk until they are deleted[m
[31m-for either inactivity,[m
[31m-or processed by the cache purger (1.7.12),[m
[31m-or a client attempts to access them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m;[m
[31m-    [m
[31m-    map $request_method $purge_method {[m
[31m-        PURGE   1;[m
[31m-        default 0;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        location / {[m
[31m-            fastcgi_pass        backend;[m
[31m-            fastcgi_cache       cache_zone;[m
[31m-            fastcgi_cache_key   $uri;[m
[31m-            fastcgi_cache_purge $purge_method;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This functionality is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_revalidate[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_revalidate I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables revalidation of expired cache items using conditional requests with[m
[31m-the C<If-Modified-Since> and C<If-None-Match>[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_use_stale[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_use_stale I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<updating> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines in which cases a stale cached response can be used[m
[31m-when an error occurs during communication with the FastCGI server.[m
[31m-The directive’s parameters match the parameters of the[m
[31m-L</fastcgi_next_upstream> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<error> parameter also permits[m
[31m-using a stale cached response if a FastCGI server to process a request[m
[31m-cannot be selected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, the C<updating> parameter permits[m
[31m-using a stale cached response if it is currently being updated.[m
[31m-This allows minimizing the number of accesses to FastCGI servers[m
[31m-when updating cached data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To minimize the number of accesses to FastCGI servers when[m
[31m-populating a new cache element, the L</fastcgi_cache_lock>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_cache_valid I<[I<C<code>> ...] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets caching time for different response codes.[m
[31m-For example, the following directives[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_valid 200 302 10m;[m
[31m-    fastcgi_cache_valid 404      1m;[m
[31m-[m
[31m-[m
[31m-set 10 minutes of caching for responses with codes 200 and 302[m
[31m-and 1 minute for responses with code 404.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only caching I<C<time>> is specified[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_valid 5m;[m
[31m-[m
[31m-[m
[31m-then only 200, 301, and 302 responses are cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the C<any> parameter can be specified[m
[31m-to cache any responses:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_cache_valid 200 302 10m;[m
[31m-    fastcgi_cache_valid 301      1h;[m
[31m-    fastcgi_cache_valid any      1m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters of caching can also be set directly[m
[31m-in the response header.[m
[31m-This has higher priority than setting of caching time using the directive.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<X-Accel-Expires> header field sets caching time of a[m
[31m-response in seconds.[m
[31m-The zero value disables caching for a response.[m
[31m-If the value starts with the C<@> prefix, it sets an absolute[m
[31m-time in seconds since Epoch, up to which the response may be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header does not include the C<X-Accel-Expires> field,[m
[31m-parameters of caching may be set in the header fields[m
[31m-C<Expires> or C<Cache-Control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Set-Cookie> field, such a[m
[31m-response will not be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Vary> field[m
[31m-with the special value “C<*>”, such a[m
[31m-response will not be cached (1.7.7).[m
[31m-If the header includes the C<Vary> field[m
[31m-with another value, such a response will be cached[m
[31m-taking into account the corresponding request header fields (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Processing of one or more of these response header fields can be disabled[m
[31m-using the L</fastcgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_catch_stderr[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_catch_stderr I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a string to search for in the error stream of a response[m
[31m-received from a FastCGI server.[m
[31m-If the I<C<string>> is found then it is considered that the FastCGI[m
[31m-server has returned an invalid response.[m
[31m-This allows handling application errors in nginx, for example:[m
[31m-[m
[31m-    [m
[31m-    location /php {[m
[31m-        fastcgi_pass backend:9000;[m
[31m-        ...[m
[31m-        fastcgi_catch_stderr "PHP Fatal error";[m
[31m-        fastcgi_next_upstream error timeout invalid_header;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a FastCGI server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the FastCGI server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_hide_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_hide_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default,[m
[31m-nginx does not pass the header fields C<Status> and[m
[31m-C<X-Accel-...> from the response of a FastCGI[m
[31m-server to a client.[m
[31m-The C<fastcgi_hide_header> directive sets additional fields[m
[31m-that will not be passed.[m
[31m-If, on the contrary, the passing of fields needs to be permitted,[m
[31m-the L</fastcgi_pass_header> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_ignore_client_abort[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_ignore_client_abort I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether the connection with a FastCGI server should be[m
[31m-closed when a client closes the connection without waiting[m
[31m-for a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_ignore_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_ignore_headers I<I<C<field>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables processing of certain response header fields from the FastCGI server.[m
[31m-The following fields can be ignored: C<X-Accel-Redirect>,[m
[31m-C<X-Accel-Expires>, C<X-Accel-Limit-Rate> (1.1.6),[m
[31m-C<X-Accel-Buffering> (1.1.6),[m
[31m-C<X-Accel-Charset> (1.1.6), C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie> (0.8.44),[m
[31m-and C<Vary> (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If not disabled, processing of these header fields has the following[m
[31m-effect:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Expires>, C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie>,[m
[31m-and C<Vary>[m
[31m-set the parameters of response caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Redirect> performs an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> to the specified URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Limit-Rate> sets the[m
[31m-L<rate[m
[31m-limit|ngx_http_core_module> for transmission of a response to a client;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Buffering> enables or disables[m
[31m-buffering of a response;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Charset> sets the desired[m
[31m-L<ngx_http_charset_module>[m
[31m-of a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_index[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_index I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a file name that will be appended after a URI that ends with[m
[31m-a slash, in the value of the C<$fastcgi_script_name> variable.[m
[31m-For example, with these settings[m
[31m-[m
[31m-    [m
[31m-    fastcgi_index index.php;[m
[31m-    fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;[m
[31m-[m
[31m-[m
[31m-and the “C<E<sol>page.php>” request,[m
[31m-the C<SCRIPT_FILENAME> parameter will be equal to[m
[31m-“C<E<sol>homeE<sol>wwwE<sol>scriptsE<sol>phpE<sol>page.php>”,[m
[31m-and with the “C<E<sol>>” request it will be equal to[m
[31m-“C<E<sol>homeE<sol>wwwE<sol>scriptsE<sol>phpE<sol>index.php>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_intercept_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_intercept_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether FastCGI server responses with codes greater than or equal[m
[31m-to 300 should be passed to a client or be redirected to nginx for processing[m
[31m-with the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_keep_conn[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_keep_conn I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, a FastCGI server will close a connection right after[m
[31m-sending the response.[m
[31m-However, when this directive is set to the value C<on>,[m
[31m-nginx will instruct a FastCGI server to keep connections open.[m
[31m-This is necessary, in particular, for[m
[31m-L<ngx_http_upstream_module>[m
[31m-connections to FastCGI servers to function.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the response from the FastCGI server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if nginx simultaneously opens[m
[31m-two connections to the FastCFI server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-The limitation works only if[m
[31m-buffering of responses from the FastCGI[m
[31m-server is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_max_temp_file_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_max_temp_file_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the FastCGI[m
[31m-server is enabled, and the whole response does not fit into the buffers[m
[31m-set by the L</fastcgi_buffer_size> and L</fastcgi_buffers>[m
[31m-directives, a part of the response can be saved to a temporary file.[m
[31m-This directive sets the maximum I<C<size>> of the temporary file.[m
[31m-The size of data written to the temporary file at a time is set[m
[31m-by the L</fastcgi_temp_file_write_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The zero value disables buffering of responses to temporary files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This restriction does not apply to responses[m
[31m-that will be cached[m
[31m-or stored on disk.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<non_idempotent> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_header>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<http_500>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 500;[m
[31m-[m
[31m-[m
[31m-=item C<http_503>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 503;[m
[31m-[m
[31m-[m
[31m-=item C<http_403>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 403;[m
[31m-[m
[31m-[m
[31m-=item C<http_404>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 404;[m
[31m-[m
[31m-[m
[31m-=item C<non_idempotent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-normally, requests with a[m
[31m-L<non-idempotent|http://tools.ietf.org/html/rfc7231#section-4.2.2>[m
[31m-method[m
[31m-(C<POST>, C<LOCK>, C<PATCH>)[m
[31m-are not passed to the next server[m
[31m-if a request has been sent to an upstream server (1.9.13);[m
[31m-enabling this option explicitly allows retrying such requests;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The cases of C<http_500> and C<http_503> are[m
[31m-considered unsuccessful attempts only if they are specified in the directive.[m
[31m-The cases of C<http_403> and C<http_404>[m
[31m-are never considered unsuccessful attempts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_no_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_no_cache I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be saved to a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be saved:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_no_cache $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    fastcgi_no_cache $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</fastcgi_cache_bypass> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_param I<[m
[31m-    I<C<parameter>> I<C<value>>[m
[31m-    [C<if_not_empty>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<parameter>> that should be passed to the FastCGI server.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<fastcgi_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following example shows the minimum required settings for PHP:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;[m
[31m-    fastcgi_param QUERY_STRING    $query_string;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<SCRIPT_FILENAME> parameter is used in PHP for[m
[31m-determining the script name, and the C<QUERY_STRING>[m
[31m-parameter is used to pass request parameters.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For scripts that process C<POST> requests, the[m
[31m-following three parameters are also required:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_param REQUEST_METHOD  $request_method;[m
[31m-    fastcgi_param CONTENT_TYPE    $content_type;[m
[31m-    fastcgi_param CONTENT_LENGTH  $content_length;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If PHP was built with the C<--enable-force-cgi-redirect>[m
[31m-configuration parameter, the C<REDIRECT_STATUS> parameter[m
[31m-should also be passed with the value “200”:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_param REDIRECT_STATUS 200;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a directive is specified with C<if_not_empty> (1.1.11) then[m
[31m-such a parameter will not be passed to the server until its value is not empty:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_param HTTPS           $https if_not_empty;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_pass I<I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the address of a FastCGI server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_pass localhost:9000;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_pass unix:/tmp/fastcgi.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_pass_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_pass_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Permits passing otherwise disabled header[m
[31m-fields from a FastCGI server to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_pass_request_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_pass_request_body I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the original request body is passed[m
[31m-to the FastCGI server.[m
[31m-See also the L</fastcgi_pass_request_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_pass_request_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_pass_request_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the header fields of the original request are passed[m
[31m-to the FastCGI server.[m
[31m-See also the L</fastcgi_pass_request_body> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the FastCGI server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the FastCGI server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_request_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_request_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of a client request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the entire request body is[m
[31m-L<read|ngx_http_core_module>[m
[31m-from the client before sending the request to a FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the request body is sent to the FastCGI server[m
[31m-immediately as it is received.[m
[31m-In this case, the request cannot be passed to the[m
[31m-next server[m
[31m-if nginx already started sending the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_send_lowat[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_send_lowat I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is set to a non-zero value, nginx will try to[m
[31m-minimize the number[m
[31m-of send operations on outgoing connections to a FastCGI server by using either[m
[31m-C<NOTE_LOWAT> flag of the[m
[31m-L<events> method,[m
[31m-or the C<SO_SNDLOWAT> socket option,[m
[31m-with the specified I<C<size>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is ignored on Linux, Solaris, and Windows.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the FastCGI server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the FastCGI server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_split_path_info[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_split_path_info I<I<C<regex>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a regular expression that captures a value for the[m
[31m-C<$fastcgi_path_info> variable.[m
[31m-The regular expression should have two captures: the first becomes[m
[31m-a value of the C<$fastcgi_script_name> variable, the second[m
[31m-becomes a value of the C<$fastcgi_path_info> variable.[m
[31m-For example, with these settings[m
[31m-[m
[31m-    [m
[31m-    location ~ ^(.+\.php)(.*)$ {[m
[31m-        fastcgi_split_path_info       ^(.+\.php)(.*)$;[m
[31m-        fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;[m
[31m-        fastcgi_param PATH_INFO       $fastcgi_path_info;[m
[31m-[m
[31m-[m
[31m-and the “C<E<sol>show.phpE<sol>articleE<sol>0001>” request,[m
[31m-the C<SCRIPT_FILENAME> parameter will be equal to[m
[31m-“C<E<sol>pathE<sol>toE<sol>phpE<sol>show.php>”, and the[m
[31m-C<PATH_INFO> parameter will be equal to[m
[31m-“C<E<sol>articleE<sol>0001>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_store[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_store I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables saving of files to a disk.[m
[31m-The C<on> parameter saves files with paths[m
[31m-corresponding to the directives[m
[31m-L<ngx_http_core_module> or[m
[31m-L<ngx_http_core_module>.[m
[31m-The C<off> parameter disables saving of files.[m
[31m-In addition, the file name can be set explicitly using the[m
[31m-I<C<string>> with variables:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_store /data/www$original_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The modification time of files is set according to the received[m
[31m-C<Last-Modified> response header field.[m
[31m-The response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the L</fastcgi_temp_path>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive can be used to create local copies of static unchangeable[m
[31m-files, e.g.:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root                 /data/www;[m
[31m-        error_page           404 = /fetch$uri;[m
[31m-    }[m
[31m-    [m
[31m-    location /fetch/ {[m
[31m-        internal;[m
[31m-    [m
[31m-        fastcgi_pass         backend:9000;[m
[31m-        ...[m
[31m-    [m
[31m-        fastcgi_store        on;[m
[31m-        fastcgi_store_access user:rw group:rw all:r;[m
[31m-        fastcgi_temp_path    /data/temp;[m
[31m-    [m
[31m-        alias                /data/www/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_store_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_store_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_store_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    fastcgi_store_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_temp_file_write_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_temp_file_write_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the I<C<size>> of data written to a temporary file[m
[31m-at a time, when buffering of responses from the FastCGI server[m
[31m-to temporary files is enabled.[m
[31m-By default, I<C<size>> is limited by two buffers set by the[m
[31m-L</fastcgi_buffer_size> and L</fastcgi_buffers> directives.[m
[31m-The maximum size of a temporary file is set by the[m
[31m-L</fastcgi_max_temp_file_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 fastcgi_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> fastcgi_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<fastcgi_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files[m
[31m-with data received from FastCGI servers.[m
[31m-Up to three-level subdirectory hierarchy can be used underneath the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    fastcgi_temp_path /spool/nginx/fastcgi_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/fastcgi_temp/<emphasis>7</emphasis>/<emphasis>45</emphasis>/00000123<emphasis>457</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the C<use_temp_path> parameter of the[m
[31m-L</fastcgi_cache_path> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Parameters Passed to a FastCGI Server[m
[31m-[m
[31m-[m
[31m-[m
[31m-HTTP request header fields are passed to a FastCGI server as parameters.[m
[31m-In applications and scripts running as FastCGI servers,[m
[31m-these parameters are usually made available as environment variables.[m
[31m-For example, the C<User-Agent> header field is passed as the[m
[31m-C<HTTP_USER_AGENT> parameter.[m
[31m-In addition to HTTP request header fields, it is possible to pass arbitrary[m
[31m-parameters using the L</fastcgi_param> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_fastcgi_module> module supports embedded[m
[31m-variables that can be used to set parameters using the[m
[31m-L</fastcgi_param> directive:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$fastcgi_script_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request URI or, if a URI ends with a slash, request URI with an index file[m
[31m-name configured by the L</fastcgi_index> directive appended to it.[m
[31m-This variable can be used to set the[m
[31m-C<SCRIPT_FILENAME> and C<PATH_TRANSLATED>[m
[31m-parameters that determine the script name in PHP.[m
[31m-For example, for the “C<E<sol>infoE<sol>>” request with the[m
[31m-following directives[m
[31m-[m
[31m-    [m
[31m-    fastcgi_index index.php;[m
[31m-    fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;[m
[31m-[m
[31m-[m
[31m-the C<SCRIPT_FILENAME> parameter will be equal to[m
[31m-“C<E<sol>homeE<sol>wwwE<sol>scriptsE<sol>phpE<sol>infoE<sol>index.php>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using the L</fastcgi_split_path_info> directive,[m
[31m-the C<$fastcgi_script_name> variable equals the value of[m
[31m-the first capture set by the directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$fastcgi_path_info>[m
[31m-[m
[31m-[m
[31m-[m
[31m-the value of the second capture set by the[m
[31m-L</fastcgi_split_path_info> directive.[m
[31m-This variable can be used to set the[m
[31m-C<PATH_INFO> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_flv_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_flv_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d0574e6..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_flv_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,72 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_flv_module - Module ngx_http_flv_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_flv_module> module provides pseudo-streaming[m
[31m-server-side support for Flash Video (FLV) files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It handles requests with the C<start> argument in[m
[31m-the request URI’s query string specially, by sending back the contents[m
[31m-of a file starting from the requested byte offset and with the prepended FLV[m
[31m-header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_flv_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location ~ \.flv$ {[m
[31m-        flv;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 flv[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_geo_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_geo_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 2dab484..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_geo_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,260 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_geo_module - Module ngx_http_geo_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_geo_module> module creates variables[m
[31m-with values depending on the client IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    geo $geo {[m
[31m-        default        0;[m
[31m-    [m
[31m-        127.0.0.1      2;[m
[31m-        192.168.1.0/24 1;[m
[31m-        10.1.0.0/16    1;[m
[31m-    [m
[31m-        ::1            2;[m
[31m-        2001:0db8::/32 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 geo[m
[31m-[m
[31m-[m
[31m-B<syntax:> geo I<[I<C<$address>>] I<C<$variable>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Describes the dependency of values of the specified variable[m
[31m-on the client IP address.[m
[31m-By default, the address is taken from the C<$remote_addr> variable,[m
[31m-but it can also be taken from another variable (0.7.27), for example:[m
[31m-[m
[31m-    [m
[31m-    geo $arg_remote_addr $geo {[m
[31m-        ...;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Since variables are evaluated only when used, the mere existence[m
[31m-of even a large number of declared “C<geo>” variables[m
[31m-does not cause any extra costs for request processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the value of a variable does not represent a valid IP address[m
[31m-then the “C<255.255.255.255>” address is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Addresses are specified either as prefixes in CIDR notation[m
[31m-(including individual addresses) or as ranges (0.7.23).[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-IPv6 prefixes are supported starting from versions 1.3.10 and 1.2.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following special parameters are also supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<delete>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-deletes the specified network (0.7.23).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<default>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a value set to the variable if the client address does not[m
[31m-match any of the specified addresses.[m
[31m-When addresses are specified in CIDR notation,[m
[31m-“C<0.0.0.0E<sol>0>” and “C<::E<sol>0>”[m
[31m-can be used instead of C<default>.[m
[31m-When C<default> is not specified, the default[m
[31m-value will be an empty string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<include>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-includes a file with addresses and values.[m
[31m-There can be several inclusions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<proxy>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines trusted addresses (0.8.7, 0.7.63).[m
[31m-When a request comes from a trusted address,[m
[31m-an address from the C<X-Forwarded-For> request[m
[31m-header field will be used instead.[m
[31m-In contrast to the regular addresses, trusted addresses are[m
[31m-checked sequentially.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Trusted IPv6 addresses are supported starting from versions 1.3.0 and 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<proxy_recursive>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables recursive address search (1.3.0, 1.2.1).[m
[31m-If recursive search is disabled then instead of the original client[m
[31m-address that matches one of the trusted addresses, the last[m
[31m-address sent in C<X-Forwarded-For> will be used.[m
[31m-If recursive search is enabled then instead of the original client[m
[31m-address that matches one of the trusted addresses, the last[m
[31m-non-trusted address sent in C<X-Forwarded-For> will be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<ranges>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-indicates that addresses are specified as ranges (0.7.23).[m
[31m-This parameter should be the first.[m
[31m-To speed up loading of a geo base, addresses should be put in ascending order.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    geo $country {[m
[31m-        default        ZZ;[m
[31m-        include        conf/geo.conf;[m
[31m-        delete         127.0.0.0/16;[m
[31m-        proxy          192.168.100.0/24;[m
[31m-        proxy          2001:0db8::/32;[m
[31m-    [m
[31m-        127.0.0.0/24   US;[m
[31m-        127.0.0.1/32   RU;[m
[31m-        10.1.0.0/16    RU;[m
[31m-        192.168.1.0/24 UK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The F<confE<sol>geo.conf> file could contain the following lines:[m
[31m-[m
[31m-    [m
[31m-    10.2.0.0/16    RU;[m
[31m-    192.168.2.0/24 RU;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A value of the most specific match is used.[m
[31m-For example, for the 127.0.0.1 address the value “C<RU>”[m
[31m-will be chosen, not “C<US>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example with ranges:[m
[31m-[m
[31m-    [m
[31m-    geo $country {[m
[31m-        ranges;[m
[31m-        default                   ZZ;[m
[31m-        127.0.0.0-127.0.0.0       US;[m
[31m-        127.0.0.1-127.0.0.1       RU;[m
[31m-        127.0.0.1-127.0.0.255     US;[m
[31m-        10.1.0.0-10.1.255.255     RU;[m
[31m-        192.168.1.0-192.168.1.255 UK;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_geoip_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_geoip_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d0a3601..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_geoip_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,393 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_geoip_module - Module ngx_http_geoip_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_geoip_module> module (0.8.6+) creates variables[m
[31m-with values depending on the client IP address, using the precompiled[m
[31m-L<MaxMind|http://www.maxmind.com> databases.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using the databases with IPv6 support (1.3.12, 1.2.7),[m
[31m-IPv4 addresses are looked up as IPv4-mapped IPv6 addresses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_geoip_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires the[m
[31m-L<MaxMind GeoIP|http://www.maxmind.com/app/c> library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        geoip_country         GeoIP.dat;[m
[31m-        geoip_city            GeoLiteCity.dat;[m
[31m-        geoip_proxy           192.168.100.0/24;[m
[31m-        geoip_proxy           2001:0db8::/32;[m
[31m-        geoip_proxy_recursive on;[m
[31m-        ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 geoip_country[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_country I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a database used to determine the country[m
[31m-depending on the client IP address.[m
[31m-The following variables are available when using this database:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_country_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-two-letter country code, for example,[m
[31m-“C<RU>”, “C<US>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_country_code3>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-three-letter country code, for example,[m
[31m-“C<RUS>”, “C<USA>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_country_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-country name, for example,[m
[31m-“C<Russian Federation>”, “C<United States>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 geoip_city[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_city I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a database used to determine the country, region, and city[m
[31m-depending on the client IP address.[m
[31m-The following variables are available when using this database:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_area_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-telephone area code (US only).[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This variable may contain outdated information since[m
[31m-the corresponding database field is deprecated.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<$geoip_city_continent_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-two-letter continent code, for example,[m
[31m-“C<EU>”, “C<NA>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_city_country_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-two-letter country code, for example,[m
[31m-“C<RU>”, “C<US>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_city_country_code3>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-three-letter country code, for example,[m
[31m-“C<RUS>”, “C<USA>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_city_country_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-country name, for example,[m
[31m-“C<Russian Federation>”, “C<United States>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_dma_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-DMA region code in US (also known as “metro code”), according to the[m
[31m-L<geotargeting|https://developers.google.com/adwords/api/docs/appendix/cities-DMAregions>[m
[31m-in Google AdWords API.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_latitude>[m
[31m-[m
[31m-[m
[31m-[m
[31m-latitude.[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_longitude>[m
[31m-[m
[31m-[m
[31m-[m
[31m-longitude.[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_region>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-two-symbol country region code (region, territory, state, province, federal land[m
[31m-and the like), for example,[m
[31m-“C<48>”, “C<DC>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_region_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-country region name (region, territory, state, province, federal land[m
[31m-and the like), for example,[m
[31m-“C<Moscow City>”, “C<District of Columbia>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_city>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-city name, for example,[m
[31m-“C<Moscow>”, “C<Washington>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_postal_code>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-postal code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 geoip_org[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_org I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a database used to determine the organization[m
[31m-depending on the client IP address.[m
[31m-The following variable is available when using this database:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$geoip_org>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-organization name, for example, “The University of Melbourne”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 geoip_proxy[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_proxy I<I<C<address>> E<verbar> I<C<CIDR>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines trusted addresses.[m
[31m-When a request comes from a trusted address,[m
[31m-an address from the C<X-Forwarded-For> request[m
[31m-header field will be used instead.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 geoip_proxy_recursive[m
[31m-[m
[31m-[m
[31m-B<syntax:> geoip_proxy_recursive I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If recursive search is disabled then instead of the original client[m
[31m-address that matches one of the trusted addresses, the last[m
[31m-address sent in C<X-Forwarded-For> will be used.[m
[31m-If recursive search is enabled then instead of the original client[m
[31m-address that matches one of the trusted addresses, the last[m
[31m-non-trusted address sent in C<X-Forwarded-For> will be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gunzip_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gunzip_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 0cebda0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gunzip_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,116 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_gunzip_module - Module ngx_http_gunzip_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_gunzip_module> module is a filter that[m
[31m-decompresses responses with “C<Content-Encoding: gzip>”[m
[31m-for clients that do not support “gzip” encoding method.[m
[31m-The module will be useful when it is desirable to store[m
[31m-data compressed to save space and reduce IE<sol>O costs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_gunzip_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /storage/ {[m
[31m-        gunzip on;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 gunzip[m
[31m-[m
[31m-[m
[31m-B<syntax:> gunzip I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables decompression of gzipped responses[m
[31m-for clients that lack gzip support.[m
[31m-If enabled, the following directives are also taken into account[m
[31m-when determining if clients support gzip:[m
[31m-L<ngx_http_gzip_module>,[m
[31m-L<ngx_http_gzip_module>, and[m
[31m-L<ngx_http_gzip_module>.[m
[31m-See also the L<ngx_http_gzip_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gunzip_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> gunzip_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32 4kE<verbar>16 8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of buffers[m
[31m-used to decompress a response.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gzip_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gzip_module.pod[m
[1mdeleted file mode 100644[m
[1mindex e096eec..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gzip_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,482 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_gzip_module - Module ngx_http_gzip_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_gzip_module> module is a filter[m
[31m-that compresses responses using the “gzip” method.[m
[31m-This often helps to reduce the size of transmitted data by half or even more.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    gzip            on;[m
[31m-    gzip_min_length 1000;[m
[31m-    gzip_proxied    expired no-cache no-store private auth;[m
[31m-    gzip_types      text/plain application/xml;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<$gzip_ratio> variable can be used to log the[m
[31m-achieved compression ratio.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 gzip[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables gzipping of responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32 4kE<verbar>16 8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of buffers[m
[31m-used to compress a response.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Until version 0.7.28, four 4K or 8K buffers were used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_comp_level[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_comp_level I<I<C<level>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a gzip compression I<C<level>> of a response.[m
[31m-Acceptable values are in the range from 1 to 9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_disable[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_disable I<I<C<regex>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.6.23.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables gzipping of responses for requests with[m
[31m-C<User-Agent> header fields matching[m
[31m-any of the specified regular expressions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special mask “C<msie6>” (0.7.12) corresponds to[m
[31m-the regular expression “C<MSIE [4-6]\.>”, but works faster.[m
[31m-Starting from version 0.8.11, “C<MSIE 6.0; ... SV1>”[m
[31m-is excluded from this mask.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_min_length[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_min_length I<I<C<length>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<20>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the minimum length of a response that will be gzipped.[m
[31m-The length is determined only from the C<Content-Length>[m
[31m-response header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_http_version[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_http_version I<C<1.0> E<verbar> C<1.1>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1.1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the minimum HTTP version of a request required to compress a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_proxied[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_proxied I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<expired> E<verbar>[m
[31m-    C<no-cache> E<verbar>[m
[31m-    C<no-store> E<verbar>[m
[31m-    C<private> E<verbar>[m
[31m-    C<no_last_modified> E<verbar>[m
[31m-    C<no_etag> E<verbar>[m
[31m-    C<auth> E<verbar>[m
[31m-    C<any>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables gzipping of responses for proxied[m
[31m-requests depending on the request and response.[m
[31m-The fact that the request is proxied is determined by[m
[31m-the presence of the C<Via> request header field.[m
[31m-The directive accepts multiple parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables compression for all proxied requests,[m
[31m-ignoring other parameters;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<expired>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header includes the[m
[31m-C<Expires> field with a value that disables caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<no-cache>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header includes the[m
[31m-C<Cache-Control> field with the[m
[31m-“C<no-cache>” parameter;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<no-store>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header includes the[m
[31m-C<Cache-Control> field with the[m
[31m-“C<no-store>” parameter;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<private>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header includes the[m
[31m-C<Cache-Control> field with the[m
[31m-“C<private>” parameter;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<no_last_modified>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header does not include the[m
[31m-C<Last-Modified> field;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<no_etag>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a response header does not include the[m
[31m-C<ETag> field;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<auth>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression if a request header includes the[m
[31m-C<Authorization> field;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<any>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables compression for all proxied requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables gzipping of responses for the specified MIME types in addition[m
[31m-to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-Responses with the “C<textE<sol>html>” type are always compressed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 gzip_vary[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_vary I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables inserting the C<Vary: Accept-Encoding>[m
[31m-response header field if the directives[m
[31m-L</gzip>,[m
[31m-L<ngx_http_gzip_static_module>, or[m
[31m-L<ngx_http_gunzip_module>[m
[31m-are active.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$gzip_ratio>[m
[31m-[m
[31m-[m
[31m-[m
[31m-achieved compression ratio, computed as the ratio between the[m
[31m-original and compressed response sizes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gzip_static_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gzip_static_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d1e9b89..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_gzip_static_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,101 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_gzip_static_module - Module ngx_http_gzip_static_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_gzip_static_module> module allows[m
[31m-sending precompressed files with the “C<.gz>”[m
[31m-filename extension instead of regular files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_gzip_static_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    gzip_static  on;[m
[31m-    gzip_proxied expired no-cache no-store private auth;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 gzip_static[m
[31m-[m
[31m-[m
[31m-B<syntax:> gzip_static I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    C<always>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables (“C<on>”) or disables (“C<off>”)[m
[31m-checking the existence of precompressed files.[m
[31m-The following directives are also taken into account:[m
[31m-L<ngx_http_gzip_module>,[m
[31m-L<ngx_http_gzip_module>,[m
[31m-L<ngx_http_gzip_module>,[m
[31m-and L<ngx_http_gzip_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With the “C<always>” value (1.3.6), gzipped file is used[m
[31m-in all cases, without checking if the client supports it.[m
[31m-It is useful if there are no uncompressed files on the disk anyway[m
[31m-or the L<ngx_http_gunzip_module|ngx_http_gunzip_module>[m
[31m-is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The files can be compressed using the C<gzip> command,[m
[31m-or any other compatible one.[m
[31m-It is recommended that the modification date and time of original and[m
[31m-compressed files be the same.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_headers_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_headers_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 8cff85a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_headers_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,222 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_headers_module - Module ngx_http_headers_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_headers_module> module allows adding[m
[31m-the C<Expires> and C<Cache-Control> header[m
[31m-fields, and arbitrary fields, to a response header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    expires    24h;[m
[31m-    expires    modified +24h;[m
[31m-    expires    @24h;[m
[31m-    expires    0;[m
[31m-    expires    -1;[m
[31m-    expires    epoch;[m
[31m-    expires    $expires;[m
[31m-    add_header Cache-Control private;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 add_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> add_header I<[m
[31m-I<C<name>> I<C<value>>[m
[31m-[C<always>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the specified field to a response header provided that[m
[31m-the response code equals 200, 201, 204, 206, 301, 302, 303, 304, or 307.[m
[31m-A value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<add_header> directives.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<add_header>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<always> parameter is specified (1.7.5),[m
[31m-the header field will be added regardless of the response code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 expires[m
[31m-[m
[31m-[m
[31m-B<syntax:> expires I<[C<modified>] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> expires I<[m
[31m-    C<epoch> E<verbar>[m
[31m-    C<max> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables adding or modifying the C<Expires>[m
[31m-and C<Cache-Control> response header fields provided that[m
[31m-the response code equals 200, 201, 204, 206, 301, 302, 303, 304, or 307.[m
[31m-A parameter can be a positive or negative[m
[31m-L<time|syntax>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A time in the C<Expires> field is computed as a sum of the[m
[31m-current time and I<C<time>> specified in the directive.[m
[31m-If the C<modified> parameter is used (0.7.0, 0.6.32)[m
[31m-then time is computed as a sum of the file’s modification time and[m
[31m-I<C<time>> specified in the directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, it is possible to specify a time of the day using[m
[31m-the “C<@>” prefix (0.7.9, 0.6.34):[m
[31m-[m
[31m-    [m
[31m-    expires @15h30m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<epoch> parameter corresponds to the absolute time[m
[31m-“C<Thu, 01 Jan 1970 00:00:01 GMT>”.[m
[31m-The contents of the C<Cache-Control> field depends[m
[31m-on the sign of the specified time:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-time is negative — C<Cache-Control: no-cache>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-time is positive or zero —[m
[31m-C<Cache-Control: max-age=I<C<t>>>,[m
[31m-where I<C<t>> is a time specified in the directive, in seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<max> parameter sets C<Expires>[m
[31m-to the value “C<Thu, 31 Dec 2037 23:55:55 GMT>”,[m
[31m-and C<Cache-Control> to 10 years.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<off> parameter disables adding or modifying the[m
[31m-C<Expires> and C<Cache-Control> response[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The last parameter value can contain variables (1.7.9):[m
[31m-[m
[31m-    [m
[31m-    map $sent_http_content_type $expires {[m
[31m-        default         off;[m
[31m-        application/pdf 42d;[m
[31m-        ~image/         max;[m
[31m-    }[m
[31m-    [m
[31m-    expires $expires;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_hls_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_hls_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 327cfa5..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_hls_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,407 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_hls_module - Module ngx_http_hls_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_hls_module> module provides HTTP Live Streaming[m
[31m-(HLS) server-side support for MP4 and MOV media files.[m
[31m-Such files typically have the F<.mp4>, F<.m4v>,[m
[31m-F<.m4a>, F<.mov>, or F<.qt> filename extensions.[m
[31m-The module supports H.264 video codec, AAC and MP3 audio codecs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each media file, two URIs are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A playlist URI with the “C<.m3u8>” filename extension.[m
[31m-The URI can accept optional arguments:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-“C<start>” and “C<end>”[m
[31m-define playlist boundaries in seconds (1.9.0).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-“C<offset>” shifts an initial playback position[m
[31m-to the time offset in seconds (1.9.0).[m
[31m-A positive value sets a time offset from the beginning of the playlist.[m
[31m-A negative value sets a time offset[m
[31m-from the end of the last fragment in the playlist.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-“C<len>” defines the fragment length in seconds.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A fragment URI with the “C<.ts>” filename extension.[m
[31m-The URI can accept optional arguments:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-“C<start>” and “C<end>”[m
[31m-define fragment boundaries in seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        hls;[m
[31m-        hls_fragment            5s;[m
[31m-        hls_buffers             10 10m;[m
[31m-        hls_mp4_buffer_size     1m;[m
[31m-        hls_mp4_max_buffer_size 5m;[m
[31m-        root /var/video/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-With this configuration, the following URIs are supported for[m
[31m-the “F<E<sol>varE<sol>videoE<sol>test.mp4>” file:[m
[31m-[m
[31m-    [m
[31m-    http://hls.example.com/test.mp4.m3u8?offset=1.000&start=1.000&end=2.200[m
[31m-    http://hls.example.com/test.mp4.m3u8?len=8.000[m
[31m-    http://hls.example.com/test.mp4.ts?start=1.000&end=2.200[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 hls[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on HLS streaming in the surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 2m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<number>> and I<C<size>> of buffers[m
[31m-that are used for reading and writing data frames.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_forward_args[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_forward_args I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds arguments from a playlist request to URIs of fragments.[m
[31m-This may be useful for performing client authorization at the moment of[m
[31m-requesting a fragment, or when protecting an HLS stream with the[m
[31m-L<ngx_http_secure_link_module|ngx_http_secure_link_module>[m
[31m-module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, if a client requests a playlist[m
[31m-C<http:E<sol>E<sol>example.comE<sol>hlsE<sol>test.mp4.m3u8?a=1E<amp>b=2>,[m
[31m-the arguments C<a=1> and C<b=2>[m
[31m-will be added to URIs of fragments after the arguments[m
[31m-C<start> and C<end>:[m
[31m-[m
[31m-    [m
[31m-    #EXTM3U[m
[31m-    #EXT-X-VERSION:3[m
[31m-    #EXT-X-TARGETDURATION:15[m
[31m-    #EXT-X-PLAYLIST-TYPE:VOD[m
[31m-    [m
[31m-    #EXTINF:9.333,[m
[31m-    test.mp4.ts?start=0.000&end=9.333&a=1&b=2[m
[31m-    #EXTINF:7.167,[m
[31m-    test.mp4.ts?start=9.333&end=16.500&a=1&b=2[m
[31m-    #EXTINF:5.416,[m
[31m-    test.mp4.ts?start=16.500&end=21.916&a=1&b=2[m
[31m-    #EXTINF:5.500,[m
[31m-    test.mp4.ts?start=21.916&end=27.416&a=1&b=2[m
[31m-    #EXTINF:15.167,[m
[31m-    test.mp4.ts?start=27.416&end=42.583&a=1&b=2[m
[31m-    #EXTINF:9.626,[m
[31m-    test.mp4.ts?start=42.583&end=52.209&a=1&b=2[m
[31m-    [m
[31m-    #EXT-X-ENDLIST[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If an HLS stream is protected with the[m
[31m-L<ngx_http_secure_link_module|ngx_http_secure_link_module>[m
[31m-module, C<$uri> should not be used in the[m
[31m-L<ngx_http_secure_link_module>[m
[31m-expression because this will cause errors when requesting the fragments.[m
[31m-L<Base URI|ngx_http_map_module> should be used[m
[31m-instead of C<$uri>[m
[31m-(C<$hls_uri> in the example):[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        ...[m
[31m-    [m
[31m-        map $uri $hls_uri {[m
[31m-            ~^(?<base_uri>.*).m3u8$ $base_uri;[m
[31m-            ~^(?<base_uri>.*).ts$   $base_uri;[m
[31m-            default                 $uri;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            ...[m
[31m-    [m
[31m-            location /hls {[m
[31m-                hls;[m
[31m-                hls_forward_args on;[m
[31m-    [m
[31m-                alias /var/videos;[m
[31m-    [m
[31m-                secure_link $arg_md5,$arg_expires;[m
[31m-                secure_link_md5 "$secure_link_expires$hls_uri$remote_addr secret";[m
[31m-    [m
[31m-                if ($secure_link = "") {[m
[31m-                    return 403;[m
[31m-                }[m
[31m-    [m
[31m-                if ($secure_link = "0") {[m
[31m-                    return 410;[m
[31m-                }[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_fragment[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_fragment I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the default fragment length for playlist URIs requested without the[m
[31m-“C<len>” argument.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_mp4_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_mp4_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the initial I<C<size>> of the buffer used for[m
[31m-processing MP4 and MOV files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hls_mp4_max_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> hls_mp4_max_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<10m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-During metadata processing, a larger buffer may become necessary.[m
[31m-Its size cannot exceed the specified I<C<size>>,[m
[31m-or else nginx will return the server error[m
[31m-C<500> (C<Internal Server Error>),[m
[31m-and log the following message:[m
[31m-[m
[31m-    [m
[31m-    "/some/movie/file.mp4" mp4 moov atom is too large:[m
[31m-    12583268, you may want to increase hls_mp4_max_buffer_size[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_image_filter_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_image_filter_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 47bd541..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_image_filter_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,370 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_image_filter_module - Module ngx_http_image_filter_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_image_filter_module> module (0.7.54+) is a filter[m
[31m-that transforms images in JPEG, GIF, and PNG formats.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_image_filter_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module utilizes the[m
[31m-L<libgd|http://libgd.org> library.[m
[31m-It is recommended to use the latest available version of the library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /img/ {[m
[31m-        proxy_pass   http://backend;[m
[31m-        image_filter resize 150 100;[m
[31m-        image_filter rotate 90;[m
[31m-        error_page   415 = /empty;[m
[31m-    }[m
[31m-    [m
[31m-    location = /empty {[m
[31m-        empty_gif;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 image_filter[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<C<test>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<C<size>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<[m
[31m-    C<rotate>[m
[31m-    C<90> E<verbar> C<180> E<verbar>[m
[31m-    C<270>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<[m
[31m-    C<resize>[m
[31m-    I<C<width>>[m
[31m-    I<C<height>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter I<[m
[31m-    C<crop>[m
[31m-    I<C<width>>[m
[31m-    I<C<height>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the type of transformation to perform on images:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-turns off module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<test>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-ensures that responses are images in either JPEG, GIF, or PNG format.[m
[31m-Otherwise, the[m
[31m-C<415> (C<Unsupported Media Type>)[m
[31m-error is returned.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-outputs information about images in a JSON format, e.g.:[m
[31m-[m
[31m-    [m
[31m-    { "img" : { "width": 100, "height": 100, "type": "gif" } }[m
[31m-[m
[31m-[m
[31m-In case of an error, the output is as follows:[m
[31m-[m
[31m-    [m
[31m-    {}[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<rotate>[m
[31m-C<90>E<verbar>C<180>E<verbar>C<270>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-rotates images counter-clockwise by the specified number of degrees.[m
[31m-Parameter value can contain variables.[m
[31m-This mode can be used either alone or along with the[m
[31m-C<resize> and C<crop> transformations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<resize>[m
[31m-I<C<width>>[m
[31m-I<C<height>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-proportionally reduces an image to the specified sizes.[m
[31m-To reduce by only one dimension, another dimension can be specified as[m
[31m-“C<->”.[m
[31m-In case of an error, the server will return code[m
[31m-C<415> (C<Unsupported Media Type>).[m
[31m-Parameter values can contain variables.[m
[31m-When used along with the C<rotate> parameter,[m
[31m-the rotation happens I<after> reduction.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<crop>[m
[31m-I<C<width>>[m
[31m-I<C<height>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-proportionally reduces an image to the larger side size[m
[31m-and crops extraneous edges by another side.[m
[31m-To reduce by only one dimension, another dimension can be specified as[m
[31m-“C<->”.[m
[31m-In case of an error, the server will return code[m
[31m-C<415> (C<Unsupported Media Type>).[m
[31m-Parameter values can contain variables.[m
[31m-When used along with the C<rotate> parameter,[m
[31m-the rotation happens I<before> reduction.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_buffer[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_buffer I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1M>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum size of the buffer used for reading images.[m
[31m-When the size is exceeded the server returns error[m
[31m-C<415> (C<Unsupported Media Type>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_interlace[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_interlace I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If enabled, final images will be interlaced.[m
[31m-For JPEG, final images will be in “progressive JPEG” format.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_jpeg_quality[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_jpeg_quality I<I<C<quality>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<75>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the desired I<C<quality>> of the transformed JPEG images.[m
[31m-Acceptable values are in the range from 1 to 100.[m
[31m-Lesser values usually imply both lower image quality and less data to transfer.[m
[31m-The maximum recommended value is 95.[m
[31m-Parameter value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_sharpen[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_sharpen I<I<C<percent>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Increases sharpness of the final image.[m
[31m-The sharpness percentage can exceed 100.[m
[31m-The zero value disables sharpening.[m
[31m-Parameter value can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 image_filter_transparency[m
[31m-[m
[31m-[m
[31m-B<syntax:> image_filter_transparency I<C<on>E<verbar>C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines whether transparency should be preserved when transforming[m
[31m-GIF images or PNG images with colors specified by a palette.[m
[31m-The loss of transparency results in images of a better quality.[m
[31m-The alpha channel transparency in PNG is always preserved.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_index_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_index_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 841a709..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_index_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,100 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_index_module - Module ngx_http_index_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_index_module> module processes requests[m
[31m-ending with the slash character (‘C<E<sol>>’).[m
[31m-Such requests can also be processed by the[m
[31m-L<ngx_http_autoindex_module|ngx_http_autoindex_module>[m
[31m-and[m
[31m-L<ngx_http_random_index_module|ngx_http_random_index_module>[m
[31m-modules.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        index index.$geo.html index.html;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 index[m
[31m-[m
[31m-[m
[31m-B<syntax:> index I<I<C<file>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<index.html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines files that will be used as an index.[m
[31m-The I<C<file>> name can contain variables.[m
[31m-Files are checked in the specified order.[m
[31m-The last element of the list can be a file with an absolute path.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    index index.$geo.html index.0.html /index.html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be noted that using an index file causes an internal redirect,[m
[31m-and the request can be processed in a different location.[m
[31m-For example, with the following configuration:[m
[31m-[m
[31m-    [m
[31m-    location = / {[m
[31m-        index index.html;[m
[31m-    }[m
[31m-    [m
[31m-    location / {[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-a “C<E<sol>>” request will actually be processed in the[m
[31m-second location as “C<E<sol>index.html>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_limit_conn_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_limit_conn_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d5749e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_limit_conn_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,293 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_limit_conn_module - Module ngx_http_limit_conn_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_limit_conn_module> module is used to[m
[31m-limit the number of connections per the defined key, in[m
[31m-particular, the number of connections from a single IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Not all connections are counted.[m
[31m-A connection is counted only if it has a request processed by the server[m
[31m-and the whole request header has already been read.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-    [m
[31m-            ...[m
[31m-    [m
[31m-            location /download/ {[m
[31m-                limit_conn addr 1;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 limit_conn[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn I<I<C<zone>> I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the shared memory zone[m
[31m-and the maximum allowed number of connections for a given key value.[m
[31m-When this limit is exceeded, the server will return the[m
[31m-C<503> (C<Service Temporarily Unavailable>)[m
[31m-error in reply to a request.[m
[31m-For example, the directives[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-    [m
[31m-    server {[m
[31m-        location /download/ {[m
[31m-            limit_conn addr 1;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-allow only one connection per an IP address at a time.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In HTTPE<sol>2 and SPDY, each concurrent request is considered a separate connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<limit_conn> directives.[m
[31m-For example, the following configuration will limit the number[m
[31m-of connections to the server per a client IP and, at the same time,[m
[31m-the total number of connections to the virtual server:[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=perip:10m;[m
[31m-    limit_conn_zone $server_name zone=perserver:10m;[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        limit_conn perip 10;[m
[31m-        limit_conn perserver 100;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<limit_conn>[m
[31m-directives on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_log_level[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_log_level I<[m
[31m-C<info> E<verbar>[m
[31m-C<notice> E<verbar>[m
[31m-C<warn> E<verbar>[m
[31m-C<error>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the desired logging level for cases when the server[m
[31m-limits the number of connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_status[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_status I<I<C<code>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<503>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the status code to return in response to rejected requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_zone I<[m
[31m-    I<C<key>>[m
[31m-    C<zone>=I<C<name>>:I<C<size>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets parameters for a shared memory zone[m
[31m-that will keep states for various keys.[m
[31m-In particular, the state includes the current number of connections.[m
[31m-The I<C<key>> can contain text, variables, and their combination.[m
[31m-Requests with an empty key value are not accounted.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.7.6, a I<C<key>> could contain exactly one variable.[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-[m
[31m-[m
[31m-Here, a client IP address serves as a key.[m
[31m-Note that instead of C<$remote_addr>, the[m
[31m-C<$binary_remote_addr> variable is used here.[m
[31m-The C<$remote_addr> variable’s size can[m
[31m-vary from 7 to 15 bytes.[m
[31m-The stored state occupies either[m
[31m-32 or 64 bytes of memory on 32-bit platforms and always 64[m
[31m-bytes on 64-bit platforms.[m
[31m-The C<$binary_remote_addr> variable’s size[m
[31m-is always 4 bytes for IPv4 addresses or 16 bytes for IPv6 addresses.[m
[31m-The stored state always occupies 32 or 64 bytes[m
[31m-on 32-bit platforms and 64 bytes on 64-bit platforms.[m
[31m-One megabyte zone can keep about 32 thousand 32-byte states[m
[31m-or about 16 thousand 64-byte states.[m
[31m-If the zone storage is exhausted, the server will return the[m
[31m-C<503> (C<Service Temporarily Unavailable>)[m
[31m-error to all further requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_zone I<[m
[31m-    I<C<name>>[m
[31m-    I<C<$variable>>[m
[31m-    I<C<size>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive was made obsolete in version 1.1.8[m
[31m-and was removed in version 1.7.6.[m
[31m-An equivalent L</limit_conn_zone> directive[m
[31m-with a changed syntax should be used instead:[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-C<limit_conn_zone>[m
[31m-I<C<$variable>>[m
[31m-C<zone>=I<C<name>>:I<C<size>>;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_limit_req_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_limit_req_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 493c8cc..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_limit_req_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,292 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_limit_req_module - Module ngx_http_limit_req_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_limit_req_module> module (0.7.21) is used[m
[31m-to limit the request processing rate per a defined key,[m
[31m-in particular, the processing rate of requests coming[m
[31m-from a single IP address.[m
[31m-The limitation is done using the “leaky bucket” method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-    [m
[31m-            ...[m
[31m-    [m
[31m-            location /search/ {[m
[31m-                limit_req zone=one burst=5;[m
[31m-            }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 limit_req[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_req I<[m
[31m-    C<zone>=I<C<name>>[m
[31m-    [C<burst>=I<C<number>>][m
[31m-    [C<nodelay>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the shared memory zone[m
[31m-and the maximum burst size of requests.[m
[31m-If the requests rate exceeds the rate configured for a zone,[m
[31m-their processing is delayed such that requests are processed[m
[31m-at a defined rate.[m
[31m-Excessive requests are delayed until their number exceeds the[m
[31m-maximum burst size[m
[31m-in which case the request is terminated with an error[m
[31m-C<503> (C<Service Temporarily Unavailable>).[m
[31m-By default, the maximum burst size is equal to zero.[m
[31m-For example, the directives[m
[31m-[m
[31m-    [m
[31m-    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;[m
[31m-    [m
[31m-    server {[m
[31m-        location /search/ {[m
[31m-            limit_req zone=one burst=5;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-allow not more than 1 request per second at an average,[m
[31m-with bursts not exceeding 5 requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If delaying of excessive requests while requests are being limited is not[m
[31m-desired, the parameter C<nodelay> should be used:[m
[31m-[m
[31m-    [m
[31m-    limit_req zone=one burst=5 nodelay;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<limit_req> directives.[m
[31m-For example, the following configuration will limit the processing rate[m
[31m-of requests coming from a single IP address and, at the same time,[m
[31m-the request processing rate by the virtual server:[m
[31m-[m
[31m-    [m
[31m-    limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;[m
[31m-    limit_req_zone $server_name zone=perserver:10m rate=10r/s;[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        limit_req zone=perip burst=5 nodelay;[m
[31m-        limit_req zone=perserver burst=10;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<limit_req>[m
[31m-directives on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_req_log_level[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_req_log_level I<[m
[31m-C<info> E<verbar>[m
[31m-C<notice> E<verbar>[m
[31m-C<warn> E<verbar>[m
[31m-C<error>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the desired logging level[m
[31m-for cases when the server refuses to process requests[m
[31m-due to rate exceeding,[m
[31m-or delays request processing.[m
[31m-Logging level for delays is one point less than for refusals; for example,[m
[31m-if “C<limit_req_log_level notice>” is specified,[m
[31m-delays are logged with the C<info> level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_req_status[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_req_status I<I<C<code>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<503>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the status code to return in response to rejected requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_req_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_req_zone I<[m
[31m-    I<C<key>>[m
[31m-    C<zone>=I<C<name>>:I<C<size>>[m
[31m-    C<rate>=I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets parameters for a shared memory zone[m
[31m-that will keep states for various keys.[m
[31m-In particular, the state stores the current number of excessive requests.[m
[31m-The I<C<key>> can contain text, variables, and their combination.[m
[31m-Requests with an empty key value are not accounted.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.7.6, a I<C<key>> could contain exactly one variable.[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Here, the states are kept in a 10 megabyte zone “one”, and an[m
[31m-average request processing rate for this zone cannot exceed[m
[31m-1 request per second.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A client IP address serves as a key.[m
[31m-Note that instead of C<$remote_addr>, the[m
[31m-C<$binary_remote_addr> variable is used here.[m
[31m-The C<$binary_remote_addr> variable’s size[m
[31m-is always 4 bytes for IPv4 addresses or 16 bytes for IPv6 addresses.[m
[31m-The stored state always occupies[m
[31m-64 bytes on 32-bit platforms and 128 bytes on 64-bit platforms.[m
[31m-One megabyte zone can keep about 16 thousand 64-byte states[m
[31m-or about 8 thousand 128-byte states.[m
[31m-If the zone storage is exhausted, the server will return the[m
[31m-C<503> (C<Service Temporarily Unavailable>)[m
[31m-error to all further requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The rate is specified in requests per second (rE<sol>s).[m
[31m-If a rate of less than one request per second is desired,[m
[31m-it is specified in request per minute (rE<sol>m).[m
[31m-For example, half-request per second is 30rE<sol>m.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_log_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_log_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 83bb3da..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_log_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,561 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_log_module - Module ngx_http_log_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_log_module> module writes request logs[m
[31m-in the specified format.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Requests are logged in the context of a location where processing ends.[m
[31m-It may be different from the original location, if an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> happens during request processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    log_format compression '$remote_addr - $remote_user [$time_local] '[m
[31m-                           '"$request" $status $bytes_sent '[m
[31m-                           '"$http_referer" "$http_user_agent" "$gzip_ratio"';[m
[31m-    [m
[31m-    access_log /spool/logs/nginx-access.log compression buffer=32k;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 access_log[m
[31m-[m
[31m-[m
[31m-B<syntax:> access_log I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<format>>[m
[31m-    [C<buffer>=I<C<size>>][m
[31m-    [C<gzip[=I<C<level>>]>][m
[31m-    [C<flush>=I<C<time>>][m
[31m-    [C<if>=I<C<condition>>]]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> access_log I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<logsE<sol>access.log combined>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path, format, and configuration for a buffered log write.[m
[31m-Several logs can be specified on the same level.[m
[31m-Logging to L<syslog|syslog>[m
[31m-can be configured by specifying[m
[31m-the “C<syslog:>” prefix in the first parameter.[m
[31m-The special value C<off> cancels all[m
[31m-C<access_log> directives on the current level.[m
[31m-If the format is not specified then the predefined[m
[31m-“C<combined>” format is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If either the C<buffer> or C<gzip>[m
[31m-(1.3.10, 1.2.7)[m
[31m-parameter is used, writes to log will be buffered.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The buffer size must not exceed the size of an atomic write to a disk file.[m
[31m-For FreeBSD this size is unlimited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the data will be written to the file:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-if the next log line does not fit into the buffer;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-if the buffered data is older than specified by the C<flush>[m
[31m-parameter (1.3.10, 1.2.7);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-when a worker process is L<re-opening|control> log[m
[31m-files or is shutting down.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<gzip> parameter is used, then the buffered data will[m
[31m-be compressed before writing to the file.[m
[31m-The compression level can be set between 1 (fastest, less compression)[m
[31m-and 9 (slowest, best compression).[m
[31m-By default, the buffer size is equal to 64K bytes, and the compression level[m
[31m-is set to 1.[m
[31m-Since the data is compressed in atomic blocks, the log file can be decompressed[m
[31m-or read by “C<zcat>” at any time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    access_log /path/to/log.gz combined gzip flush=5m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-For gzip compression to work, nginx must be built with the zlib library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The file path can contain variables (0.7.6+),[m
[31m-but such logs have some constraints:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the L<ngx_core_module>[m
[31m-whose credentials are used by worker processes should[m
[31m-have permissions to create files in a directory with[m
[31m-such logs;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-buffered writes do not work;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the file is opened and closed for each log write.[m
[31m-However, since the descriptors of frequently used files can be stored[m
[31m-in a cache, writing to the old file[m
[31m-can continue during the time specified by the L</open_log_file_cache>[m
[31m-directive’s C<valid> parameter[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-during each log write the existence of the request’s[m
[31m-L<root directory|ngx_http_core_module>[m
[31m-is checked, and if it does not exist the log is not[m
[31m-created.[m
[31m-It is thus a good idea to specify both[m
[31m-L<ngx_http_core_module>[m
[31m-and C<access_log> on the same level:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        root       /spool/vhost/data/$host;[m
[31m-        access_log /spool/vhost/logs/$host;[m
[31m-        ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<if> parameter (1.7.0) enables conditional logging.[m
[31m-A request will not be logged if the I<C<condition>> evaluates to “0”[m
[31m-or an empty string.[m
[31m-In the following example, the requests with response codes 2xx and 3xx[m
[31m-will not be logged:[m
[31m-[m
[31m-    [m
[31m-    map $status $loggable {[m
[31m-        ~^[23]  0;[m
[31m-        default 1;[m
[31m-    }[m
[31m-    [m
[31m-    access_log /path/to/access.log combined if=$loggable;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_format[m
[31m-[m
[31m-[m
[31m-B<syntax:> log_format I<[m
[31m-    I<C<name>>[m
[31m-    I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<combined "...">[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies log format.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The log format can contain common variables, and variables that[m
[31m-exist only at the time of a log write:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$bytes_sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the number of bytes sent to a client[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connection>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-connection serial number[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connection_requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the current number of requests made through a connection (1.1.18)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$msec>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-time in seconds with a milliseconds resolution at the time of the log write[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$pipe>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-“C<p>” if request was pipelined, “C<.>”[m
[31m-otherwise[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_length>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request length (including request line, header, and request body)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$request_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request processing time in seconds with a milliseconds resolution;[m
[31m-time elapsed between the first bytes were read from the client and[m
[31m-the log write after the last bytes were sent to the client[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$status>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-response status[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$time_iso8601>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-local time in the ISO 8601 standard format[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$time_local>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-local time in the Common Log Format[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In the modern nginx versions variables[m
[31m-L<$status|ngx_http_core_module>[m
[31m-(1.3.2, 1.2.2),[m
[31m-L<$bytes_sent|ngx_http_core_module>[m
[31m-(1.3.8, 1.2.5),[m
[31m-L<$connection|ngx_http_core_module>[m
[31m-(1.3.8, 1.2.5),[m
[31m-L<$connection_requests|ngx_http_core_module>[m
[31m-(1.3.8, 1.2.5),[m
[31m-L<$msec|ngx_http_core_module>[m
[31m-(1.3.9, 1.2.6),[m
[31m-L<$request_time|ngx_http_core_module>[m
[31m-(1.3.9, 1.2.6),[m
[31m-L<$pipe|ngx_http_core_module>[m
[31m-(1.3.12, 1.2.7),[m
[31m-L<$request_length|ngx_http_core_module>[m
[31m-(1.3.12, 1.2.7),[m
[31m-L<$time_iso8601|ngx_http_core_module>[m
[31m-(1.3.12, 1.2.7),[m
[31m-and[m
[31m-L<$time_local|ngx_http_core_module>[m
[31m-(1.3.12, 1.2.7)[m
[31m-are also available as common variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Header lines sent to a client have the prefix[m
[31m-“C<sent_http_>”, for example,[m
[31m-C<$sent_http_content_range>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The configuration always includes the predefined[m
[31m-“C<combined>” format:[m
[31m-[m
[31m-    [m
[31m-    log_format combined '$remote_addr - $remote_user [$time_local] '[m
[31m-                        '"$request" $status $body_bytes_sent '[m
[31m-                        '"$http_referer" "$http_user_agent"';[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 open_log_file_cache[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_log_file_cache I<[m
[31m-C<max>=I<C<N>>[m
[31m-[C<inactive>=I<C<time>>][m
[31m-[C<min_uses>=I<C<N>>][m
[31m-[C<valid>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> open_log_file_cache I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a cache that stores the file descriptors of frequently used logs[m
[31m-whose names contain variables.[m
[31m-The directive has the following parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<max>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the maximum number of descriptors in a cache;[m
[31m-if the cache becomes full the least recently used (LRU)[m
[31m-descriptors are closed[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<inactive>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the time after which the cached descriptor is closed[m
[31m-if there were no access during this time;[m
[31m-by default, 10 seconds[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<min_uses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the minimum number of file uses during the time[m
[31m-defined by the C<inactive> parameter[m
[31m-to let the descriptor stay open in a cache;[m
[31m-by default, 1[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<valid>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the time after which it should be checked that the file[m
[31m-still exists with the same name; by default, 60 seconds[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables caching[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_map_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_map_module.pod[m
[1mdeleted file mode 100644[m
[1mindex f55197c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_map_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,304 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_map_module - Module ngx_http_map_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_map_module> module creates variables[m
[31m-whose values depend on values of other variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    map $http_host $name {[m
[31m-        hostnames;[m
[31m-    [m
[31m-        default       0;[m
[31m-    [m
[31m-        example.com   1;[m
[31m-        *.example.com 1;[m
[31m-        example.org   2;[m
[31m-        *.example.org 2;[m
[31m-        .example.net  3;[m
[31m-        wap.*         4;[m
[31m-    }[m
[31m-    [m
[31m-    map $http_user_agent $mobile {[m
[31m-        default       0;[m
[31m-        "~Opera Mini" 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 map[m
[31m-[m
[31m-[m
[31m-B<syntax:> map I<[m
[31m-    I<C<string>>[m
[31m-    I<C<$variable>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Creates a new variable whose value[m
[31m-depends on values of one or more of the source variables[m
[31m-specified in the first parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 0.9.0 only a single variable could be[m
[31m-specified in the first parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Since variables are evaluated only when they are used, the mere declaration[m
[31m-even of a large number of “C<map>” variables[m
[31m-does not add any extra costs to request processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters inside the C<map> block specify a mapping[m
[31m-between source and resulting values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Source values are specified as strings or regular expressions (0.9.6).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Strings are matched ignoring the case.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A regular expression should either start from the “C<~>”[m
[31m-symbol for a case-sensitive matching, or from the “C<~*>”[m
[31m-symbols (1.0.4) for case-insensitive matching.[m
[31m-A regular expression can contain named and positional captures[m
[31m-that can later be used in other directives along with the[m
[31m-resulting variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a source value matches one of the names of special parameters[m
[31m-described below, it should be prefixed with the “C<\>” symbol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The resulting value can contain text,[m
[31m-variable (0.9.0), and their combination (1.11.0).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also supports three special parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<default> I<C<value>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the resulting value if the source value matches none[m
[31m-of the specified variants.[m
[31m-When C<default> is not specified, the default[m
[31m-resulting value will be an empty string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<hostnames>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-indicates that source values can be hostnames with a prefix or suffix mask:[m
[31m-[m
[31m-    [m
[31m-    *.example.com 1;[m
[31m-    example.*     1;[m
[31m-[m
[31m-[m
[31m-The following two records[m
[31m-[m
[31m-    [m
[31m-    example.com   1;[m
[31m-    *.example.com 1;[m
[31m-[m
[31m-[m
[31m-can be combined:[m
[31m-[m
[31m-    [m
[31m-    .example.com  1;[m
[31m-[m
[31m-[m
[31m-This parameter should be specified before the list of values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<include> I<C<file>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-includes a file with values.[m
[31m-There can be several inclusions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the source value matches more than one of the specified variants,[m
[31m-e.g. both a mask and a regular expression match, the first matching[m
[31m-variant will be chosen, in the following order of priority:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-string value without a mask[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-longest string value with a prefix mask,[m
[31m-e.g. “C<*.example.com>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-longest string value with a suffix mask,[m
[31m-e.g. “C<mail.*>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-first matching regular expression[m
[31m-(in order of appearance in a configuration file)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 5.[m
[31m-[m
[31m-default value[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 map_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> map_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<32E<verbar>64E<verbar>128>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the L</map> variables hash tables.[m
[31m-Default value depends on the processor’s cache line size.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 map_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> map_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<2048>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the L</map> variables[m
[31m-hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_memcached_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_memcached_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 0a58e8c..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_memcached_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,554 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_memcached_module - Module ngx_http_memcached_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_memcached_module> module is used to obtain[m
[31m-responses from a memcached server.[m
[31m-The key is set in the C<$memcached_key> variable.[m
[31m-A response should be put in memcached in advance by means[m
[31m-external to nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            set            $memcached_key "$uri?$args";[m
[31m-            memcached_pass host:11211;[m
[31m-            error_page     404 502 504 = @fallback;[m
[31m-        }[m
[31m-    [m
[31m-        location @fallback {[m
[31m-            proxy_pass     http://backend;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 memcached_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.22.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a memcached server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<memcached_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a memcached server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    memcached_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the memcached server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the response[m
[31m-received from the memcached server.[m
[31m-The response is passed to the client synchronously, as soon as it is received.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a memcached server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the memcached server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_gzip_flag[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_gzip_flag I<I<C<flag>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the test for the I<C<flag>> presence in the memcached[m
[31m-server response and sets the “C<Content-Encoding>”[m
[31m-response header field to “C<gzip>”[m
[31m-if the flag is set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_response> E<verbar>[m
[31m-    C<not_found> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_response>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<not_found>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a response was not found on the server;[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The case of C<not_found>[m
[31m-is never considered an unsuccessful attempt.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_pass I<I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the memcached server address.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    memcached_pass localhost:11211;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    memcached_pass unix:/tmp/memcached.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the memcached server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the memcached server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 memcached_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> memcached_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the memcached server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the memcached server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$memcached_key>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for obtaining response from a memcached server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_mp4_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_mp4_module.pod[m
[1mdeleted file mode 100644[m
[1mindex d4b98f8..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_mp4_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,329 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_mp4_module - Module ngx_http_mp4_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_mp4_module> module provides pseudo-streaming[m
[31m-server-side support for MP4 files.[m
[31m-Such files typically have the F<.mp4>, F<.m4v>,[m
[31m-or F<.m4a> filename extensions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Pseudo-streaming works in alliance with a compatible Flash player.[m
[31m-The player sends an HTTP request to the server with the start time[m
[31m-specified in the query string argument (named simply[m
[31m-C<start>[m
[31m-and specified in seconds), and the server responds with the stream[m
[31m-such that its start position corresponds to the requested time,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    http://example.com/elephants_dream.mp4?start=238.88[m
[31m-[m
[31m-[m
[31m-This allows performing a random seeking at any time, or starting playback[m
[31m-in the middle of the timeline.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To support seeking, H.264-based formats store metadata[m
[31m-in a so-called “moov atom”.[m
[31m-It is a part of the file that holds the index information for the[m
[31m-whole file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To start playback, the player first needs to read metadata.[m
[31m-This is done by sending a special request with the[m
[31m-C<start=0> argument.[m
[31m-A lot of encoding software insert the metadata at[m
[31m-the end of the file.[m
[31m-This is suboptimal for pseudo-streaming, because the player[m
[31m-has to download the entire file before starting playback.[m
[31m-If the metadata are located at the beginning of the file,[m
[31m-it is enough for nginx to simply start sending back the file contents.[m
[31m-If the metadata are located at the end of the file,[m
[31m-nginx must read the entire file and prepare a new stream so that[m
[31m-the metadata come before the media data.[m
[31m-This involves some CPU, memory, and disk IE<sol>O overhead,[m
[31m-so it is a good idea to[m
[31m-L<prepare an original file for pseudo-streaming|http://flowplayer.org/plugins/streaming/pseudostreaming.html#prepare> in advance,[m
[31m-rather than having nginx do this on every such request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module also supports the C<end> argument of an HTTP request[m
[31m-(1.5.13) which sets the end point of playback.[m
[31m-The C<end> argument can be specified with the[m
[31m-C<start> argument[m
[31m-or separately:[m
[31m-[m
[31m-    [m
[31m-    http://example.com/elephants_dream.mp4?start=238.88&end=555.55[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For a matching request with a non-zero[m
[31m-C<start> or C<end>[m
[31m-argument, nginx will read the metadata from the file, prepare the[m
[31m-stream with the requested time range, and send it to the client.[m
[31m-This has the same overhead as described above.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a matching request does not include the[m
[31m-C<start> and C<end>[m
[31m-arguments, there is no overhead, and the file is sent simply as a static[m
[31m-resource.[m
[31m-Some players also support byte-range requests, and thus do not require[m
[31m-this module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_mp4_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-If a third-party mp4 module was previously used, it should be disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A similar pseudo-streaming support for FLV files is provided by the[m
[31m-L<ngx_http_flv_module|ngx_http_flv_module> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /video/ {[m
[31m-        mp4;[m
[31m-        mp4_buffer_size       1m;[m
[31m-        mp4_max_buffer_size   5m;[m
[31m-        mp4_limit_rate        on;[m
[31m-        mp4_limit_rate_after  30s;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 mp4[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mp4_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> mp4_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512K>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the initial I<C<size>> of the buffer used for[m
[31m-processing MP4 files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mp4_max_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> mp4_max_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<10M>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-During metadata processing, a larger buffer may become necessary.[m
[31m-Its size cannot exceed the specified I<C<size>>,[m
[31m-or else nginx will return the[m
[31m-C<500> (C<Internal Server Error>) server error,[m
[31m-and log the following message:[m
[31m-[m
[31m-    [m
[31m-    "/some/movie/file.mp4" mp4 moov atom is too large:[m
[31m-    12583268, you may want to increase mp4_max_buffer_size[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mp4_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> mp4_limit_rate I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<factor>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the rate of response transmission to a client.[m
[31m-The rate is limited based on the average bitrate of the[m
[31m-MP4 file served.[m
[31m-To calculate the rate, the bitrate is multiplied by the specified[m
[31m-I<C<factor>>.[m
[31m-The special value “C<on>” corresponds to the factor of 1.1.[m
[31m-The special value “C<off>” disables rate limiting.[m
[31m-The limit is set per a request, and so if a client simultaneously opens[m
[31m-two connections, the overall rate will be twice as much[m
[31m-as the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mp4_limit_rate_after[m
[31m-[m
[31m-[m
[31m-B<syntax:> mp4_limit_rate_after I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the initial amount of media data (measured in playback time)[m
[31m-after which the further transmission of the response to a client[m
[31m-will be rate limited.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_perl_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_perl_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a372a3e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_perl_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,620 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_perl_module - Module ngx_http_perl_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_perl_module> module is used to implement[m
[31m-location and variable handlers in Perl and insert Perl calls into SSI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_perl_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires[m
[31m-L<Perl|https://www.perl.org/get.html> version 5.6.1 or higher.[m
[31m-The C compiler should be compatible with the one used to build Perl.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module is experimental, caveat emptor applies.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order for Perl to recompile the modified modules during[m
[31m-reconfiguration, it should be built with the[m
[31m-C<-Dusemultiplicity=yes> or[m
[31m-C<-Dusethreads=yes> parameters.[m
[31m-Also, to make Perl leak less memory at run time,[m
[31m-it should be built with the[m
[31m-C<-Dusemymalloc=no> parameter.[m
[31m-To check the values of these parameters in an already built[m
[31m-Perl (preferred values are specified in the example), run:[m
[31m-[m
[31m-    [m
[31m-    $ perl -V:usemultiplicity -V:usemymalloc[m
[31m-    usemultiplicity='define';[m
[31m-    usemymalloc='n';[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that after rebuilding Perl with the new[m
[31m-C<-Dusemultiplicity=yes> or[m
[31m-C<-Dusethreads=yes> parameters,[m
[31m-all binary Perl modules will have to be rebuilt as well —[m
[31m-they will just stop working with the new Perl.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is a possibility that the main process and then worker processes will[m
[31m-grow in size after every reconfiguration.[m
[31m-If the main process grows to an unacceptable size, the[m
[31m-L<live upgrade|control>[m
[31m-procedure can be applied without changing the executable file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-While the Perl module is performing a long-running operation, such as[m
[31m-resolving a domain name, connecting to another server, or querying a database,[m
[31m-other requests assigned to the current worker process will not be processed.[m
[31m-It is thus recommended to perform only such operations[m
[31m-that have predictable and short execution time, such as[m
[31m-accessing the local file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-    [m
[31m-        perl_modules perl/lib;[m
[31m-        perl_require hello.pm;[m
[31m-    [m
[31m-        perl_set $msie6 '[m
[31m-    [m
[31m-            sub {[m
[31m-                my $r = shift;[m
[31m-                my $ua = $r->header_in("User-Agent");[m
[31m-    [m
[31m-                return "" if $ua =~ /Opera/;[m
[31m-                return "1" if $ua =~ / MSIE [6-9]\.\d+/;[m
[31m-                return "";[m
[31m-            }[m
[31m-    [m
[31m-        ';[m
[31m-    [m
[31m-        server {[m
[31m-            location / {[m
[31m-                perl hello::handler;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The F<perlE<sol>libE<sol>hello.pm> module:[m
[31m-[m
[31m-    [m
[31m-    package hello;[m
[31m-    [m
[31m-    use nginx;[m
[31m-    [m
[31m-    sub handler {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        $r->send_http_header("text/html");[m
[31m-        return OK if $r->header_only;[m
[31m-    [m
[31m-        $r->print("hello!\n<br/>");[m
[31m-    [m
[31m-        if (-f $r->filename or -d _) {[m
[31m-            $r->print($r->uri, " exists!\n");[m
[31m-        }[m
[31m-    [m
[31m-        return OK;[m
[31m-    }[m
[31m-    [m
[31m-    1;[m
[31m-    __END__[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 perl[m
[31m-[m
[31m-[m
[31m-B<syntax:> perl I<I<C<module>>::I<C<function>>E<verbar>'sub { ... }'>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a Perl handler for the given location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 perl_modules[m
[31m-[m
[31m-[m
[31m-B<syntax:> perl_modules I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets an additional path for Perl modules.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 perl_require[m
[31m-[m
[31m-[m
[31m-B<syntax:> perl_require I<I<C<module>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the name of a module that will be loaded during each[m
[31m-reconfiguration.[m
[31m-Several C<perl_require> directives can be present.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 perl_set[m
[31m-[m
[31m-[m
[31m-B<syntax:> perl_set I<[m
[31m-    I<C<$variable>>[m
[31m-    I<C<module>>::I<C<function>>E<verbar>'sub { ... }'>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Installs a Perl handler for the specified variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Calling Perl from SSI[m
[31m-[m
[31m-[m
[31m-[m
[31m-An SSI command calling Perl has the following format:[m
[31m-[m
[31m-    [m
[31m-    <!--# perl sub="<value>module</value>::<value>function</value>" arg="<value>parameter1</value>" arg="<value>parameter2</value>" ...[m
[31m-    -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 The $r Request Object Methods[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>args>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns request arguments.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>filename>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns a filename corresponding to the request URI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>has_request_body(I<C<handler>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns 0 if there is no body in a request.[m
[31m-If there is a body, the specified handler is set for the request[m
[31m-and 1 is returned.[m
[31m-After reading the request body, nginx will call the specified handler.[m
[31m-Note that the handler function should be passed by reference.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    package hello;[m
[31m-    [m
[31m-    use nginx;[m
[31m-    [m
[31m-    sub handler {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        if ($r->request_method ne "POST") {[m
[31m-            return DECLINED;[m
[31m-        }[m
[31m-    [m
[31m-        if ($r->has_request_body(<emphasis>\&post</emphasis>)) {[m
[31m-            return OK;[m
[31m-        }[m
[31m-    [m
[31m-        return HTTP_BAD_REQUEST;[m
[31m-    }[m
[31m-    [m
[31m-    sub <emphasis>post</emphasis> {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        $r->send_http_header;[m
[31m-    [m
[31m-        $r->print("request_body: \"", $r->request_body, "\"<br/>");[m
[31m-        $r->print("request_body_file: \"", $r->request_body_file, "\"<br/>\n");[m
[31m-    [m
[31m-        return OK;[m
[31m-    }[m
[31m-    [m
[31m-    1;[m
[31m-    [m
[31m-    __END__[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>allow_ranges>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables the use of byte ranges when sending responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>discard_request_body>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-instructs nginx to discard the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>header_in(I<C<field>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the value of the specified client request header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>header_only>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-determines whether the whole response or only its header should be sent to[m
[31m-the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>header_out(I<C<field>>,[m
[31m-    I<C<value>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets a value for the specified response header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>internal_redirect(I<C<uri>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-does an internal redirect to the specified I<C<uri>>.[m
[31m-An actual redirect happens after the Perl handler execution is completed.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Redirections to named locations are currently not supported.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>log_error(I<C<errno>>,[m
[31m-I<C<message>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-writes the specified I<C<message>> into the[m
[31m-L<ngx_core_module>.[m
[31m-If I<C<errno>> is non-zero, an error code and its description[m
[31m-will be appended to the message.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>print(I<C<text>>, ...)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-passes data to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>request_body>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client request body if it has not been[m
[31m-written to a temporary file.[m
[31m-To ensure that the client request body is in memory,[m
[31m-its size should be limited by[m
[31m-L<ngx_http_core_module>,[m
[31m-and a sufficient buffer size should be set using[m
[31m-L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>request_body_file>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the name of the file with the client request body.[m
[31m-After the processing, the file should be removed.[m
[31m-To always write a request body to a file,[m
[31m-L<ngx_http_core_module>[m
[31m-should be enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>request_method>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client request HTTP method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>remote_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>flush>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-immediately sends data to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>sendfile(I<C<name>>[,[m
[31m-    I<C<offset>>[,[m
[31m-    I<C<length>>]])>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sends the specified file content to the client.[m
[31m-Optional parameters[m
[31m-specify the initial offset and length of the data to be transmitted.[m
[31m-The actual data transmission happens after the Perl handler[m
[31m-has completed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>send_http_header([I<C<type>>])>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sends the response header to the client.[m
[31m-The optional I<C<type>> parameter sets the value of[m
[31m-the C<Content-Type> response header field.[m
[31m-If the value is an empty string, the C<Content-Type>[m
[31m-header field will not be sent.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>status(I<C<code>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets a response code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>sleep(I<C<milliseconds>>,[m
[31m-    I<C<handler>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the specified handler[m
[31m-and stops request processing for the specified time.[m
[31m-In the meantime, nginx continues to process other requests.[m
[31m-After the specified time has elapsed, nginx will call the installed handler.[m
[31m-Note that the handler function should be passed by reference.[m
[31m-In order to pass data between handlers,[m
[31m-C<$r-E<gt>variable()> should be used.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    package hello;[m
[31m-    [m
[31m-    use nginx;[m
[31m-    [m
[31m-    sub handler {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        $r->discard_request_body;[m
[31m-        $r->variable("var", "OK");[m
[31m-        $r->sleep(1000, <emphasis>\&next</emphasis>);[m
[31m-    [m
[31m-        return OK;[m
[31m-    }[m
[31m-    [m
[31m-    sub <emphasis>next</emphasis> {[m
[31m-        my $r = shift;[m
[31m-    [m
[31m-        $r->send_http_header;[m
[31m-        $r->print($r->variable("var"));[m
[31m-    [m
[31m-        return OK;[m
[31m-    }[m
[31m-    [m
[31m-    1;[m
[31m-    [m
[31m-    __END__[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>unescape(I<C<text>>)>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-decodes a text encoded in the “%XX” form.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$r-E<gt>uri>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns a request URI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<$r-E<gt>variable(I<C<name>>[,[m
[31m-    I<C<value>>])>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns or sets the value of the specified variable.[m
[31m-Variables are local to each request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_proxy_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_proxy_module.pod[m
[1mdeleted file mode 100644[m
[1mindex df57bc0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_proxy_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,3544 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_proxy_module - Module ngx_http_proxy_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_proxy_module> module allows passing[m
[31m-requests to another server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        proxy_pass       http://localhost:8000;[m
[31m-        proxy_set_header Host      $host;[m
[31m-        proxy_set_header X-Real-IP $remote_addr;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 proxy_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.22.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a proxied server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<proxy_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a proxied server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    proxy_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the first part[m
[31m-of the response received from the proxied server.[m
[31m-This part usually contains a small response header.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-It can be made smaller, however.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of responses from the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, nginx receives a response from the proxied server[m
[31m-as soon as possible, saving it into the buffers set by the[m
[31m-L</proxy_buffer_size> and L</proxy_buffers> directives.[m
[31m-If the whole response does not fit into memory, a part of it can be saved[m
[31m-to a temporary file on the disk.[m
[31m-Writing to temporary files is controlled by the[m
[31m-L</proxy_max_temp_file_size> and[m
[31m-L</proxy_temp_file_write_size> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the response is passed to a client synchronously,[m
[31m-immediately as it is received.[m
[31m-nginx will not try to read the whole response from the proxied server.[m
[31m-The maximum size of the data that nginx can receive from the server[m
[31m-at a time is set by the L</proxy_buffer_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering can also be enabled or disabled by passing[m
[31m-“C<yes>” or “C<no>” in the[m
[31m-C<X-Accel-Buffering> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L</proxy_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from the proxied server,[m
[31m-for a single connection.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_busy_buffers_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_busy_buffers_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the proxied[m
[31m-server is enabled, limits the total I<C<size>> of buffers that[m
[31m-can be busy sending a response to the client while the response is not[m
[31m-yet fully read.[m
[31m-In the meantime, the rest of the buffers can be used for reading the response[m
[31m-and, if needed, buffering part of the response to a temporary file.[m
[31m-By default, I<C<size>> is limited by the size of two buffers set by the[m
[31m-L</proxy_buffer_size> and L</proxy_buffers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache I<I<C<zone>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a shared memory zone used for caching.[m
[31m-The same zone can be used in several places.[m
[31m-Parameter value can contain variables (1.7.9).[m
[31m-The C<off> parameter disables caching inherited[m
[31m-from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_bypass[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_bypass I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be taken from a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be taken from the cache:[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    proxy_cache_bypass $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</proxy_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_convert_head[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_convert_head I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the conversion of the “C<HEAD>” method[m
[31m-to “C<GET>” for caching.[m
[31m-When the conversion is disabled, the[m
[31m-cache key should be configured[m
[31m-to include the C<$request_method>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_key I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<$scheme$proxy_host$request_uri>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for caching, for example[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_key "$host$request_uri $cookie_user";[m
[31m-[m
[31m-[m
[31m-By default, the directive’s value is close to the string[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_key $scheme$proxy_host$uri$is_args$args;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_lock[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_lock I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When enabled, only one request at a time will be allowed to populate[m
[31m-a new cache element identified according to the L</proxy_cache_key>[m
[31m-directive by passing a request to a proxied server.[m
[31m-Other requests of the same cache element will either wait[m
[31m-for a response to appear in the cache or the cache lock for[m
[31m-this element to be released, up to the time set by the[m
[31m-L</proxy_cache_lock_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_lock_age[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_lock_age I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the last request passed to the proxied server[m
[31m-for populating a new cache element[m
[31m-has not completed for the specified I<C<time>>,[m
[31m-one more request may be passed to the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_lock_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_lock_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for L</proxy_cache_lock>.[m
[31m-When the I<C<time>> expires,[m
[31m-the request will be passed to the proxied server,[m
[31m-however, the response will not be cached.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 1.7.8, the response could be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_methods I<[m
[31m-    C<GET> E<verbar>[m
[31m-    C<HEAD> E<verbar>[m
[31m-    C<POST>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<GET HEAD>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.59.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the client request method is listed in this directive then[m
[31m-the response will be cached.[m
[31m-“C<GET>” and “C<HEAD>” methods are always[m
[31m-added to the list, though it is recommended to specify them explicitly.[m
[31m-See also the L</proxy_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> of requests after which the response[m
[31m-will be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_path I<[m
[31m-    I<C<path>>[m
[31m-    [C<levels>=I<C<levels>>][m
[31m-    [C<use_temp_path>=C<on>E<verbar>C<off>][m
[31m-    C<keys_zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<inactive>=I<C<time>>][m
[31m-    [C<max_size>=I<C<size>>][m
[31m-    [C<loader_files>=I<C<number>>][m
[31m-    [C<loader_sleep>=I<C<time>>][m
[31m-    [C<loader_threshold>=I<C<time>>][m
[31m-    [C<purger>=C<on>E<verbar>C<off>][m
[31m-    [C<purger_files>=I<C<number>>][m
[31m-    [C<purger_sleep>=I<C<time>>][m
[31m-    [C<purger_threshold>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path and other parameters of a cache.[m
[31m-Cache data are stored in files.[m
[31m-The file name in a cache is a result of[m
[31m-applying the MD5 function to the[m
[31m-cache key.[m
[31m-The C<levels> parameter defines hierarchy levels of a cache.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;[m
[31m-[m
[31m-[m
[31m-file names in a cache will look like this:[m
[31m-[m
[31m-    [m
[31m-    /data/nginx/cache/<emphasis>c</emphasis>/<emphasis>29</emphasis>/b7f54b2df7773722d382f4809d650<emphasis>29c</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A cached response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the cache can be put on[m
[31m-different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both cache and a directory[m
[31m-holding temporary files[m
[31m-are put on the same file system.[m
[31m-The directory for temporary files is set based on[m
[31m-the C<use_temp_path> parameter (1.7.10).[m
[31m-If this parameter is omitted or set to the value C<on>,[m
[31m-the directory set by the L</proxy_temp_path> directive[m
[31m-for the given location will be used.[m
[31m-If the value is set to C<off>,[m
[31m-temporary files will be put directly in the cache directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, all active keys and information about data are stored[m
[31m-in a shared memory zone, whose I<C<name>> and I<C<size>>[m
[31m-are configured by the C<keys_zone> parameter.[m
[31m-One megabyte zone can store about 8 thousand keys.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Cached data that are not accessed during the time specified by the[m
[31m-C<inactive> parameter get removed from the cache[m
[31m-regardless of their freshness.[m
[31m-By default, C<inactive> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special “cache manager” process monitors the maximum cache size set[m
[31m-by the C<max_size> parameter.[m
[31m-When this size is exceeded, it removes the least recently used data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A minute after the start the special “cache loader” process is activated.[m
[31m-It loads information about previously cached data stored on file system[m
[31m-into a cache zone.[m
[31m-The loading is done in iterations.[m
[31m-During one iteration no more than C<loader_files> items[m
[31m-are loaded (by default, 100).[m
[31m-Besides, the duration of one iteration is limited by the[m
[31m-C<loader_threshold> parameter (by default, 200 milliseconds).[m
[31m-Between iterations, a pause configured by the C<loader_sleep>[m
[31m-parameter (by default, 50 milliseconds) is made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Instructs whether cache entries that match a[m
[31m-wildcard key[m
[31m-will be removed from the disk by the cache purger (1.7.12).[m
[31m-Setting the parameter to C<on>[m
[31m-(default is C<off>)[m
[31m-will activate the “cache purger” process that[m
[31m-permanently iterates through all cache entries[m
[31m-and deletes the entries that match the wildcard key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_files>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of items that will be scanned during one iteration (1.7.12).[m
[31m-By default, C<purger_files> is set to 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_threshold>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the duration of one iteration (1.7.12).[m
[31m-By default, C<purger_threshold> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_sleep>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a pause between iterations (1.7.12).[m
[31m-By default, C<purger_sleep> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_purge[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_purge I<string ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the request will be considered a cache[m
[31m-purge request.[m
[31m-If at least one value of the string parameters is not empty and is not equal[m
[31m-to “0” then the cache entry with a corresponding[m
[31m-cache key is removed.[m
[31m-The result of successful operation is indicated by returning[m
[31m-the C<204> (C<No Content>) response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the cache key of a purge request ends[m
[31m-with an asterisk (“C<*>”), all cache entries matching the[m
[31m-wildcard key will be removed from the cache.[m
[31m-However, these entries will remain on the disk until they are deleted[m
[31m-for either inactivity,[m
[31m-or processed by the cache purger (1.7.12),[m
[31m-or a client attempts to access them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration:[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m;[m
[31m-    [m
[31m-    map $request_method $purge_method {[m
[31m-        PURGE   1;[m
[31m-        default 0;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        location / {[m
[31m-            proxy_pass http://backend;[m
[31m-            proxy_cache cache_zone;[m
[31m-            proxy_cache_key $uri;[m
[31m-            proxy_cache_purge $purge_method;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This functionality is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_revalidate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_revalidate I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables revalidation of expired cache items using conditional requests with[m
[31m-the C<If-Modified-Since> and C<If-None-Match>[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_use_stale[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_use_stale I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<updating> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_502> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_504> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines in which cases a stale cached response can be used[m
[31m-when an error occurs during communication with the proxied server.[m
[31m-The directive’s parameters match the parameters of the[m
[31m-L</proxy_next_upstream> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<error> parameter also permits[m
[31m-using a stale cached response if a proxied server to process a request[m
[31m-cannot be selected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, the C<updating> parameter permits[m
[31m-using a stale cached response if it is currently being updated.[m
[31m-This allows minimizing the number of accesses to proxied servers[m
[31m-when updating cached data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To minimize the number of accesses to proxied servers when[m
[31m-populating a new cache element, the L</proxy_cache_lock>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cache_valid I<[I<C<code>> ...] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets caching time for different response codes.[m
[31m-For example, the following directives[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_valid 200 302 10m;[m
[31m-    proxy_cache_valid 404      1m;[m
[31m-[m
[31m-[m
[31m-set 10 minutes of caching for responses with codes 200 and 302[m
[31m-and 1 minute for responses with code 404.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only caching I<C<time>> is specified[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_valid 5m;[m
[31m-[m
[31m-[m
[31m-then only 200, 301, and 302 responses are cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the C<any> parameter can be specified[m
[31m-to cache any responses:[m
[31m-[m
[31m-    [m
[31m-    proxy_cache_valid 200 302 10m;[m
[31m-    proxy_cache_valid 301      1h;[m
[31m-    proxy_cache_valid any      1m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters of caching can also be set directly[m
[31m-in the response header.[m
[31m-This has higher priority than setting of caching time using the directive.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<X-Accel-Expires> header field sets caching time of a[m
[31m-response in seconds.[m
[31m-The zero value disables caching for a response.[m
[31m-If the value starts with the C<@> prefix, it sets an absolute[m
[31m-time in seconds since Epoch, up to which the response may be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header does not include the C<X-Accel-Expires> field,[m
[31m-parameters of caching may be set in the header fields[m
[31m-C<Expires> or C<Cache-Control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Set-Cookie> field, such a[m
[31m-response will not be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Vary> field[m
[31m-with the special value “C<*>”, such a[m
[31m-response will not be cached (1.7.7).[m
[31m-If the header includes the C<Vary> field[m
[31m-with another value, such a response will be cached[m
[31m-taking into account the corresponding request header fields (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Processing of one or more of these response header fields can be disabled[m
[31m-using the L</proxy_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a proxied server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cookie_domain[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cookie_domain I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cookie_domain I<I<C<domain>> I<C<replacement>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a text that should be changed in the C<domain>[m
[31m-attribute of the C<Set-Cookie> header fields of a[m
[31m-proxied server response.[m
[31m-Suppose a proxied server returned the C<Set-Cookie>[m
[31m-header field with the attribute[m
[31m-“C<domain=localhost>”.[m
[31m-The directive[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain localhost example.org;[m
[31m-[m
[31m-[m
[31m-will rewrite this attribute to[m
[31m-“C<domain=example.org>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A dot at the beginning of the I<C<domain>> and[m
[31m-I<C<replacement>> strings and the C<domain>[m
[31m-attribute is ignored.[m
[31m-Matching is case-insensitive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<domain>> and I<C<replacement>> strings[m
[31m-can contain variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain www.$host $host;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive can also be specified using regular expressions.[m
[31m-In this case, I<C<domain>> should start from[m
[31m-the “C<~>” symbol.[m
[31m-A regular expression can contain named and positional captures,[m
[31m-and I<C<replacement>> can reference them:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<proxy_cookie_domain> directives:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain localhost example.org;[m
[31m-    proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<off> parameter cancels the effect of all[m
[31m-C<proxy_cookie_domain> directives on the current level:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_domain off;[m
[31m-    proxy_cookie_domain localhost example.org;[m
[31m-    proxy_cookie_domain www.example.org example.org;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_cookie_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cookie_path I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_cookie_path I<I<C<path>> I<C<replacement>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.15.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a text that should be changed in the C<path>[m
[31m-attribute of the C<Set-Cookie> header fields of a[m
[31m-proxied server response.[m
[31m-Suppose a proxied server returned the C<Set-Cookie>[m
[31m-header field with the attribute[m
[31m-“C<path=E<sol>twoE<sol>someE<sol>uriE<sol>>”.[m
[31m-The directive[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path /two/ /;[m
[31m-[m
[31m-[m
[31m-will rewrite this attribute to[m
[31m-“C<path=E<sol>someE<sol>uriE<sol>>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<path>> and I<C<replacement>> strings[m
[31m-can contain variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path $uri /some$uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive can also be specified using regular expressions.[m
[31m-In this case, I<C<path>> should either start from[m
[31m-the “C<~>” symbol for a case-sensitive matching,[m
[31m-or from the “C<~*>” symbols for case-insensitive[m
[31m-matching.[m
[31m-The regular expression can contain named and positional captures,[m
[31m-and I<C<replacement>> can reference them:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path ~*^/user/([^/]+) /u/$1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<proxy_cookie_path> directives:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path /one/ /;[m
[31m-    proxy_cookie_path / /two/;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<off> parameter cancels the effect of all[m
[31m-C<proxy_cookie_path> directives on the current level:[m
[31m-[m
[31m-    [m
[31m-    proxy_cookie_path off;[m
[31m-    proxy_cookie_path /two/ /;[m
[31m-    proxy_cookie_path ~*^/user/([^/]+) /u/$1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the proxied server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_headers_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_headers_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket I<C<size>> for hash tables[m
[31m-used by the L</proxy_hide_header> and L</proxy_set_header>[m
[31m-directives.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_headers_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_headers_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<512>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of hash tables[m
[31m-used by the L</proxy_hide_header> and L</proxy_set_header>[m
[31m-directives.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_hide_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_hide_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default,[m
[31m-nginx does not pass the header fields C<Date>,[m
[31m-C<Server>, C<X-Pad>, and[m
[31m-C<X-Accel-...> from the response of a proxied[m
[31m-server to a client.[m
[31m-The C<proxy_hide_header> directive sets additional fields[m
[31m-that will not be passed.[m
[31m-If, on the contrary, the passing of fields needs to be permitted,[m
[31m-the L</proxy_pass_header> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_http_version[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_http_version I<C<1.0> E<verbar> C<1.1>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1.0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the HTTP protocol version for proxying.[m
[31m-By default, version 1.0 is used.[m
[31m-Version 1.1 is recommended for use with[m
[31m-L<ngx_http_upstream_module>[m
[31m-connections and[m
[31m-L<NTLM authentication|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ignore_client_abort[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ignore_client_abort I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether the connection with a proxied server should be[m
[31m-closed when a client closes the connection without waiting[m
[31m-for a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ignore_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ignore_headers I<I<C<field>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables processing of certain response header fields from the proxied server.[m
[31m-The following fields can be ignored: C<X-Accel-Redirect>,[m
[31m-C<X-Accel-Expires>, C<X-Accel-Limit-Rate> (1.1.6),[m
[31m-C<X-Accel-Buffering> (1.1.6),[m
[31m-C<X-Accel-Charset> (1.1.6), C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie> (0.8.44),[m
[31m-and C<Vary> (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If not disabled, processing of these header fields has the following[m
[31m-effect:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Expires>, C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie>,[m
[31m-and C<Vary>[m
[31m-set the parameters of response caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Redirect> performs an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> to the specified URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Limit-Rate> sets the[m
[31m-L<rate[m
[31m-limit|ngx_http_core_module> for transmission of a response to a client;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Buffering> enables or disables[m
[31m-buffering of a response;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Charset> sets the desired[m
[31m-L<ngx_http_charset_module>[m
[31m-of a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_intercept_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_intercept_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether proxied responses with codes greater than or equal[m
[31m-to 300 should be passed to a client or be redirected to nginx for processing[m
[31m-with the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the response from the proxied server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if nginx simultaneously opens[m
[31m-two connections to the proxied server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-The limitation works only if[m
[31m-buffering of responses from the proxied[m
[31m-server is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_max_temp_file_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_max_temp_file_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the proxied[m
[31m-server is enabled, and the whole response does not fit into the buffers[m
[31m-set by the L</proxy_buffer_size> and L</proxy_buffers>[m
[31m-directives, a part of the response can be saved to a temporary file.[m
[31m-This directive sets the maximum I<C<size>> of the temporary file.[m
[31m-The size of data written to the temporary file at a time is set[m
[31m-by the L</proxy_temp_file_write_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The zero value disables buffering of responses to temporary files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This restriction does not apply to responses[m
[31m-that will be cached[m
[31m-or stored on disk.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_method[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_method I<I<C<method>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the HTTP I<C<method>> to use in requests forwarded[m
[31m-to the proxied server instead of the method from the client request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_502> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_504> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<non_idempotent> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_header>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<http_500>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 500;[m
[31m-[m
[31m-[m
[31m-=item C<http_502>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 502;[m
[31m-[m
[31m-[m
[31m-=item C<http_503>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 503;[m
[31m-[m
[31m-[m
[31m-=item C<http_504>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 504;[m
[31m-[m
[31m-[m
[31m-=item C<http_403>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 403;[m
[31m-[m
[31m-[m
[31m-=item C<http_404>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 404;[m
[31m-[m
[31m-[m
[31m-=item C<non_idempotent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-normally, requests with a[m
[31m-L<non-idempotent|http://tools.ietf.org/html/rfc7231#section-4.2.2>[m
[31m-method[m
[31m-(C<POST>, C<LOCK>, C<PATCH>)[m
[31m-are not passed to the next server[m
[31m-if a request has been sent to an upstream server (1.9.13);[m
[31m-enabling this option explicitly allows retrying such requests;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The cases of C<http_500>, C<http_502>,[m
[31m-C<http_503> and C<http_504> are[m
[31m-considered unsuccessful attempts only if they are specified in the directive.[m
[31m-The cases of C<http_403> and C<http_404>[m
[31m-are never considered unsuccessful attempts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_no_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_no_cache I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be saved to a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be saved:[m
[31m-[m
[31m-    [m
[31m-    proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    proxy_no_cache $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</proxy_cache_bypass> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass I<I<C<URL>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<limit_except>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the protocol and address of a proxied server and an optional URI[m
[31m-to which a location should be mapped.[m
[31m-As a protocol, “C<http>” or “C<https>”[m
[31m-can be specified.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and an optional port:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass http://localhost:8000/uri/;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path specified after the word[m
[31m-“C<unix>” and enclosed in colons:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass http://unix:/tmp/backend.socket:/uri/;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A request URI is passed to the server as follows:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the C<proxy_pass> directive is specified with a URI,[m
[31m-then when a request is passed to the server, the part of a[m
[31m-L<normalized|ngx_http_core_module>[m
[31m-request URI matching the location is replaced by a URI[m
[31m-specified in the directive:[m
[31m-[m
[31m-    [m
[31m-    location /name/ {[m
[31m-        proxy_pass http://127.0.0.1/remote/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If C<proxy_pass> is specified without a URI,[m
[31m-the request URI is passed to the server in the same form[m
[31m-as sent by a client when the original request is processed,[m
[31m-or the full normalized request URI is passed[m
[31m-when processing the changed URI:[m
[31m-[m
[31m-    [m
[31m-    location /some/path/ {[m
[31m-        proxy_pass http://127.0.0.1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.12,[m
[31m-if C<proxy_pass> is specified without a URI,[m
[31m-the original request URI might be passed[m
[31m-instead of the changed URI in some cases.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In some cases, the part of a request URI to be replaced cannot be determined:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When location is specified using a regular expression.[m
[31m-[m
[31m-[m
[31m-In this case, the directive should be specified without a URI.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-When the URI is changed inside a proxied location using the[m
[31m-L<ngx_http_rewrite_module> directive,[m
[31m-and this same configuration will be used to process a request[m
[31m-(C<break>):[m
[31m-[m
[31m-    [m
[31m-    location /name/ {[m
[31m-        rewrite    /name/([^/]+) /users?name=$1 break;[m
[31m-        proxy_pass http://127.0.0.1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this case, the URI specified in the directive is ignored and[m
[31m-the full changed request URI is passed to the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A server name, its port and the passed URI can also be specified using[m
[31m-variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass http://$host$uri;[m
[31m-[m
[31m-[m
[31m-or even like this:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass $request;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this case, the server name is searched among the described[m
[31m-L<server groups|ngx_http_upstream_module>,[m
[31m-and, if not found, is determined using a[m
[31m-L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<WebSocket|websocket> proxying requires special[m
[31m-configuration and is supported since version 1.3.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Permits passing otherwise disabled header[m
[31m-fields from a proxied server to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass_request_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass_request_body I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the original request body is passed[m
[31m-to the proxied server.[m
[31m-[m
[31m-    [m
[31m-    location /x-accel-redirect-here/ {[m
[31m-        proxy_method GET;[m
[31m-        proxy_pass_request_body off;[m
[31m-        proxy_set_header Content-Length "";[m
[31m-    [m
[31m-        proxy_pass ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-See also the L</proxy_set_header> and[m
[31m-L</proxy_pass_request_headers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass_request_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass_request_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the header fields of the original request are passed[m
[31m-to the proxied server.[m
[31m-[m
[31m-    [m
[31m-    location /x-accel-redirect-here/ {[m
[31m-        proxy_method GET;[m
[31m-        proxy_pass_request_headers off;[m
[31m-        proxy_pass_request_body off;[m
[31m-    [m
[31m-        proxy_pass ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-See also the L</proxy_set_header> and[m
[31m-L</proxy_pass_request_body> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the proxied server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the proxied server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_redirect[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_redirect I<C<default>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_redirect I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_redirect I<I<C<redirect>> I<C<replacement>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<default>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the text that should be changed in the C<Location>[m
[31m-and C<Refresh> header fields of a proxied server response.[m
[31m-Suppose a proxied server returned the header field[m
[31m-“C<Location: http:E<sol>E<sol>localhost:8000E<sol>twoE<sol>someE<sol>uriE<sol>>”.[m
[31m-The directive[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect http://localhost:8000/two/ http://frontend/one/;[m
[31m-[m
[31m-[m
[31m-will rewrite this string to[m
[31m-“C<Location: http:E<sol>E<sol>frontendE<sol>oneE<sol>someE<sol>uriE<sol>>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A server name may be omitted in the I<C<replacement>> string:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect http://localhost:8000/two/ /;[m
[31m-[m
[31m-[m
[31m-then the primary server’s name and port, if different from 80,[m
[31m-will be inserted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The default replacement specified by the C<default> parameter[m
[31m-uses the parameters of the[m
[31m-L<ngx_http_core_module> and[m
[31m-L</proxy_pass> directives.[m
[31m-Hence, the two configurations below are equivalent:[m
[31m-[m
[31m-    [m
[31m-    location /one/ {[m
[31m-        proxy_pass     http://upstream:port/two/;[m
[31m-        proxy_redirect default;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /one/ {[m
[31m-        proxy_pass     http://upstream:port/two/;[m
[31m-        proxy_redirect http://upstream:port/two/ /one/;[m
[31m-[m
[31m-[m
[31m-The C<default> parameter is not permitted if[m
[31m-L</proxy_pass> is specified using variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A I<C<replacement>> string can contain variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect http://localhost:8000/ http://$host:$server_port/;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A I<C<redirect>> can also contain (1.1.11) variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect http://$proxy_host:8000/ /;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive can be specified (1.1.11) using regular expressions.[m
[31m-In this case, I<C<redirect>> should either start with[m
[31m-the “C<~>” symbol for a case-sensitive matching,[m
[31m-or with the “C<~*>” symbols for case-insensitive[m
[31m-matching.[m
[31m-The regular expression can contain named and positional captures,[m
[31m-and I<C<replacement>> can reference them:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;[m
[31m-    proxy_redirect ~*/user/([^/]+)/(.+)$      http://$1.example.com/$2;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<proxy_redirect> directives:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect default;[m
[31m-    proxy_redirect http://localhost:8000/  /;[m
[31m-    proxy_redirect http://www.example.com/ /;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<off> parameter cancels the effect of all[m
[31m-C<proxy_redirect> directives on the current level:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect off;[m
[31m-    proxy_redirect default;[m
[31m-    proxy_redirect http://localhost:8000/  /;[m
[31m-    proxy_redirect http://www.example.com/ /;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Using this directive, it is also possible to add host names to relative[m
[31m-redirects issued by a proxied server:[m
[31m-[m
[31m-    [m
[31m-    proxy_redirect / /;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_request_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_request_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of a client request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the entire request body is[m
[31m-L<read|ngx_http_core_module>[m
[31m-from the client before sending the request to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the request body is sent to the proxied server[m
[31m-immediately as it is received.[m
[31m-In this case, the request cannot be passed to the[m
[31m-next server[m
[31m-if nginx already started sending the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When HTTPE<sol>1.1 chunked transfer encoding is used[m
[31m-to send the original request body,[m
[31m-the request body will be buffered regardless of the directive value unless[m
[31m-HTTPE<sol>1.1 is enabled for proxying.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_send_lowat[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_send_lowat I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is set to a non-zero value, nginx will try to[m
[31m-minimize the number[m
[31m-of send operations on outgoing connections to a proxied server by using either[m
[31m-C<NOTE_LOWAT> flag of the[m
[31m-L<events> method,[m
[31m-or the C<SO_SNDLOWAT> socket option,[m
[31m-with the specified I<C<size>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is ignored on Linux, Solaris, and Windows.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the proxied server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the proxied server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_set_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_set_body I<I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows redefining the request body passed to the proxied server.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_set_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_set_header I<I<C<field>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<Host $proxy_host>[m
[31m-[m
[31m-[m
[31m-B<default:> I<Connection close>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows redefining or appending fields to the request header[m
[31m-passed to the proxied server.[m
[31m-The I<C<value>> can contain text, variables, and their combinations.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<proxy_set_header>[m
[31m-directives defined on the current level.[m
[31m-By default, only two fields are redefined:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Host       $proxy_host;[m
[31m-    proxy_set_header Connection close;[m
[31m-[m
[31m-[m
[31m-If caching is enabled, the header fields[m
[31m-C<If-Modified-Since>,[m
[31m-C<If-Unmodified-Since>,[m
[31m-C<If-None-Match>,[m
[31m-C<If-Match>,[m
[31m-C<Range>,[m
[31m-and[m
[31m-C<If-Range>[m
[31m-from the original request are not passed to the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-An unchanged C<Host> request header field can be passed like this:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Host       $http_host;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, if this field is not present in a client request header then[m
[31m-nothing will be passed.[m
[31m-In such a case it is better to use the C<$host> variableE<mdash>its[m
[31m-value equals the server name in the C<Host> request header[m
[31m-field or the primary server name if this field is not present:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Host       $host;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the server name can be passed together with the port of the[m
[31m-proxied server:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Host       $host:$proxy_port;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the value of a header field is an empty string then this[m
[31m-field will not be passed to a proxied server:[m
[31m-[m
[31m-    [m
[31m-    proxy_set_header Accept-Encoding "";[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-used for authentication to a proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-used for authentication to a proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>> (1.7.9),[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<DEFAULT>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers for requests to a proxied HTTPS server.[m
[31m-The ciphers are specified in the format understood by the OpenSSL library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-the certificate of the proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<$proxy_host>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows overriding the server name used to[m
[31m-verify[m
[31m-the certificate of the proxied HTTPS server and to be[m
[31m-passed through SNI[m
[31m-when establishing a connection with the proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the host part of the L</proxy_pass> URL is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_server_name I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables passing of the server name through[m
[31m-L<TLS[m
[31m-Server Name Indication extension|http://en.wikipedia.org/wiki/Server_Name_Indication> (SNI, RFC 6066)[m
[31m-when establishing a connection with the proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_session_reuse[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_session_reuse I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether SSL sessions can be reused when working with[m
[31m-the proxied server.[m
[31m-If the errors[m
[31m-“C<SSL3_GET_FINISHED:digest check failed>”[m
[31m-appear in the logs, try disabling session reuse.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols for requests to a proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify[m
[31m-the certificate of the proxied HTTPS server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_verify[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_verify I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables verification of the proxied HTTPS server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the proxied HTTPS server certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_store[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_store I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables saving of files to a disk.[m
[31m-The C<on> parameter saves files with paths[m
[31m-corresponding to the directives[m
[31m-L<ngx_http_core_module> or[m
[31m-L<ngx_http_core_module>.[m
[31m-The C<off> parameter disables saving of files.[m
[31m-In addition, the file name can be set explicitly using the[m
[31m-I<C<string>> with variables:[m
[31m-[m
[31m-    [m
[31m-    proxy_store /data/www$original_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The modification time of files is set according to the received[m
[31m-C<Last-Modified> response header field.[m
[31m-The response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the L</proxy_temp_path>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive can be used to create local copies of static unchangeable[m
[31m-files, e.g.:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root               /data/www;[m
[31m-        error_page         404 = /fetch$uri;[m
[31m-    }[m
[31m-    [m
[31m-    location /fetch/ {[m
[31m-        internal;[m
[31m-    [m
[31m-        proxy_pass         http://backend/;[m
[31m-        proxy_store        on;[m
[31m-        proxy_store_access user:rw group:rw all:r;[m
[31m-        proxy_temp_path    /data/temp;[m
[31m-    [m
[31m-        alias              /data/www/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-or like this:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root               /data/www;[m
[31m-        error_page         404 = @fetch;[m
[31m-    }[m
[31m-    [m
[31m-    location @fetch {[m
[31m-        internal;[m
[31m-    [m
[31m-        proxy_pass         http://backend;[m
[31m-        proxy_store        on;[m
[31m-        proxy_store_access user:rw group:rw all:r;[m
[31m-        proxy_temp_path    /data/temp;[m
[31m-    [m
[31m-        root               /data/www;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_store_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_store_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    proxy_store_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    proxy_store_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_temp_file_write_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_temp_file_write_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the I<C<size>> of data written to a temporary file[m
[31m-at a time, when buffering of responses from the proxied server[m
[31m-to temporary files is enabled.[m
[31m-By default, I<C<size>> is limited by two buffers set by the[m
[31m-L</proxy_buffer_size> and L</proxy_buffers> directives.[m
[31m-The maximum size of a temporary file is set by the[m
[31m-L</proxy_max_temp_file_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<proxy_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files[m
[31m-with data received from proxied servers.[m
[31m-Up to three-level subdirectory hierarchy can be used underneath the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    proxy_temp_path /spool/nginx/proxy_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/proxy_temp/<emphasis>7</emphasis>/<emphasis>45</emphasis>/00000123<emphasis>457</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the C<use_temp_path> parameter of the[m
[31m-L</proxy_cache_path> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_proxy_module> module supports embedded variables[m
[31m-that can be used to compose headers using the[m
[31m-L</proxy_set_header> directive:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$proxy_host>[m
[31m-[m
[31m-[m
[31m-[m
[31m-name and port of a proxied server as specified in the[m
[31m-L</proxy_pass> directive;[m
[31m-[m
[31m-[m
[31m-=item C<$proxy_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-port of a proxied server as specified in the[m
[31m-L</proxy_pass> directive, or the protocol’s default port;[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<$proxy_add_x_forwarded_for>[m
[31m-[m
[31m-[m
[31m-[m
[31m-the C<X-Forwarded-For> client request header field[m
[31m-with the C<$remote_addr> variable appended to it, separated by a comma.[m
[31m-If the C<X-Forwarded-For> field is not present in the client[m
[31m-request header, the C<$proxy_add_x_forwarded_for> variable is equal[m
[31m-to the C<$remote_addr> variable.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_random_index_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_random_index_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 9337872..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_random_index_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,71 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_random_index_module - Module ngx_http_random_index_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_random_index_module> module processes requests[m
[31m-ending with the slash character (‘C<E<sol>>’) and picks a random[m
[31m-file in a directory to serve as an index file.[m
[31m-The module is processed before the[m
[31m-L<ngx_http_index_module|ngx_http_index_module>[m
[31m-module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_random_index_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        random_index on;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 random_index[m
[31m-[m
[31m-[m
[31m-B<syntax:> random_index I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables module processing in a surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_realip_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_realip_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 689f9d9..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_realip_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_realip_module - Module ngx_http_realip_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_realip_module> module is used[m
[31m-to change the client address and optional port[m
[31m-to the one sent in the specified header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_realip_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    set_real_ip_from  192.168.1.0/24;[m
[31m-    set_real_ip_from  192.168.2.1;[m
[31m-    set_real_ip_from  2001:0db8::/32;[m
[31m-    real_ip_header    X-Forwarded-For;[m
[31m-    real_ip_recursive on;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 set_real_ip_from[m
[31m-[m
[31m-[m
[31m-B<syntax:> set_real_ip_from I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines trusted addresses that are known to send correct[m
[31m-replacement addresses.[m
[31m-If the special value C<unix:> is specified,[m
[31m-all UNIX-domain sockets will be trusted.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-IPv6 addresses are supported starting from versions 1.3.0 and 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 real_ip_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> real_ip_header I<[m
[31m-    I<C<field>> E<verbar>[m
[31m-    C<X-Real-IP> E<verbar>[m
[31m-    C<X-Forwarded-For> E<verbar>[m
[31m-    C<proxy_protocol>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<X-Real-IP>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the request header field[m
[31m-whose value will be used to replace the client address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<X-Real-IP> and C<X-Forwarded-For>[m
[31m-parameters may contain an optional port (1.11.0).[m
[31m-The address and port should be specified according to[m
[31m-L<RFC 3986|http://tools.ietf.org/html/3986>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<proxy_protocol> parameter (1.5.12) changes[m
[31m-the client address to the one from the PROXY protocol header.[m
[31m-The PROXY protocol must be previously enabled by setting the[m
[31m-C<proxy_protocol> parameter[m
[31m-in the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 real_ip_recursive[m
[31m-[m
[31m-[m
[31m-B<syntax:> real_ip_recursive I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.2.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If recursive search is disabled, the original client address that[m
[31m-matches one of the trusted addresses is replaced by the last[m
[31m-address sent in the request header field defined by the[m
[31m-L</real_ip_header> directive.[m
[31m-If recursive search is enabled, the original client address that[m
[31m-matches one of the trusted addresses is replaced by the last[m
[31m-non-trusted address sent in the request header field.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$realip_remote_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the original client address (1.9.7)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$realip_remote_port>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the original client port (1.11.0)[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_referer_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_referer_module.pod[m
[1mdeleted file mode 100644[m
[1mindex ce2315b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_referer_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,255 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_referer_module - Module ngx_http_referer_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_referer_module> module is used to block[m
[31m-access to a site for requests with invalid values in the[m
[31m-C<Referer> header field.[m
[31m-It should be kept in mind that fabricating a request with an appropriate[m
[31m-C<Referer> field value is quite easy, and so the intended[m
[31m-purpose of this module is not to block such requests thoroughly but to block[m
[31m-the mass flow of requests sent by regular browsers.[m
[31m-It should also be taken into consideration that regular browsers may[m
[31m-not send the C<Referer> field even for valid requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    valid_referers none blocked server_names[m
[31m-                   *.example.com example.* www.example.org/galleries/[m
[31m-                   ~\.google\.;[m
[31m-    [m
[31m-    if ($invalid_referer) {[m
[31m-        return 403;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 referer_hash_bucket_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> referer_hash_bucket_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the bucket size for the valid referers hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 referer_hash_max_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> referer_hash_max_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<2048>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum I<C<size>> of the valid referers hash tables.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 valid_referers[m
[31m-[m
[31m-[m
[31m-B<syntax:> valid_referers I<[m
[31m-    C<none> E<verbar>[m
[31m-    C<blocked> E<verbar>[m
[31m-    C<server_names> E<verbar>[m
[31m-    I<C<string>>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the C<Referer> request header field values[m
[31m-that will cause the embedded C<$invalid_referer> variable to[m
[31m-be set to an empty string.[m
[31m-Otherwise, the variable will be set to “C<1>”.[m
[31m-Search for a match is case-insensitive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters can be as follows:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the C<Referer> field is missing in the request header;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<blocked>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the C<Referer> field is present in the request header,[m
[31m-but its value has been deleted by a firewall or proxy server;[m
[31m-such values are strings that do not start with[m
[31m-“C<http:E<sol>E<sol>>” or “C<https:E<sol>E<sol>>”;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server_names>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the C<Referer> request header field contains[m
[31m-one of the server names;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item arbitrary string[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines a server name and an optional URI prefix.[m
[31m-A server name can have an “C<*>” at the beginning or end.[m
[31m-During the checking, the server’s port in the C<Referer> field[m
[31m-is ignored;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item regular expression[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the first symbol should be a “C<~>”.[m
[31m-It should be noted that an expression will be matched against[m
[31m-the text starting after the “C<http:E<sol>E<sol>>”[m
[31m-or “C<https:E<sol>E<sol>>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    valid_referers none blocked server_names[m
[31m-                   *.example.com example.* www.example.org/galleries/[m
[31m-                   ~\.google\.;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$invalid_referer>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Empty string, if the C<Referer> request header field[m
[31m-value is considered[m
[31m-valid, otherwise “C<1>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_rewrite_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_rewrite_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 043266f..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_rewrite_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,700 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_rewrite_module - Module ngx_http_rewrite_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_rewrite_module> module is used to[m
[31m-change request URI using regular expressions, return redirects, and[m
[31m-conditionally select configurations.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_rewrite_module> module directives are[m
[31m-processed in the following order:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the directives of this module specified on the[m
[31m-L<ngx_http_core_module> level[m
[31m-are executed sequentially;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-repeatedly:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-a[m
[31m-L<ngx_http_core_module>[m
[31m-is searched based on a request URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the directives of this module specified inside the found location[m
[31m-are executed sequentially;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the loop is repeated if a request URI was rewritten,[m
[31m-but not more than[m
[31m-L<10 times|ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 break[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Stops processing the current set of[m
[31m-C<ngx_http_rewrite_module> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a directive is specified inside the[m
[31m-L<ngx_http_core_module>,[m
[31m-further processing of the request continues in this location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    if ($slow) {[m
[31m-        limit_rate 10k;[m
[31m-        break;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 if[m
[31m-[m
[31m-[m
[31m-B<syntax:> if I<(I<C<condition>>) { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The specified I<C<condition>> is evaluated.[m
[31m-If true, this module directives specified inside the braces are[m
[31m-executed, and the request is assigned the configuration inside the[m
[31m-C<if> directive.[m
[31m-Configurations inside the C<if> directives are[m
[31m-inherited from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A condition may be any of the following:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-a variable name; false if the value of a variable is an empty string[m
[31m-or “C<0>”;[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.0.1, any string starting with “C<0>”[m
[31m-was considered a false value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-comparison of a variable with a string using the[m
[31m-“C<=>” and “C<!=>” operators;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-matching of a variable against a regular expression using the[m
[31m-“C<~>” (for case-sensitive matching) and[m
[31m-“C<~*>” (for case-insensitive matching) operators.[m
[31m-Regular expressions can contain captures that are made available for[m
[31m-later reuse in the C<$1>..C<$9> variables.[m
[31m-Negative operators “C<!~>” and “C<!~*>”[m
[31m-are also available.[m
[31m-If a regular expression includes the “C<}>”[m
[31m-or “C<;>” characters, the whole expressions should be enclosed[m
[31m-in single or double quotes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checking of a file existence with the “C<-f>” and[m
[31m-“C<!-f>” operators;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checking of a directory existence with the “C<-d>” and[m
[31m-“C<!-d>” operators;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checking of a file, directory, or symbolic link existence with the[m
[31m-“C<-e>” and “C<!-e>” operators;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-checking for an executable file with the “C<-x>”[m
[31m-and “C<!-x>” operators.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Examples:[m
[31m-[m
[31m-    [m
[31m-    if ($http_user_agent ~ MSIE) {[m
[31m-        rewrite ^(.*)$ /msie/$1 break;[m
[31m-    }[m
[31m-    [m
[31m-    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {[m
[31m-        set $id $1;[m
[31m-    }[m
[31m-    [m
[31m-    if ($request_method = POST) {[m
[31m-        return 405;[m
[31m-    }[m
[31m-    [m
[31m-    if ($slow) {[m
[31m-        limit_rate 10k;[m
[31m-    }[m
[31m-    [m
[31m-    if ($invalid_referer) {[m
[31m-        return 403;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-A value of the C<$invalid_referer> embedded variable is set by the[m
[31m-L<ngx_http_referer_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 return[m
[31m-[m
[31m-[m
[31m-B<syntax:> return I<I<C<code>> [I<C<text>>]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> return I<I<C<code>> I<C<URL>>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> return I<I<C<URL>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Stops processing and returns the specified I<C<code>> to a client.[m
[31m-The non-standard code 444 closes a connection without sending[m
[31m-a response header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Starting from version 0.8.42, it is possible to specify[m
[31m-either a redirect URL (for codes 301, 302, 303, and 307),[m
[31m-or the response body I<C<text>> (for other codes).[m
[31m-A response body text and redirect URL can contain variables.[m
[31m-As a special case, a redirect URL can be specified as a URI[m
[31m-local to this server, in which case the full redirect URL[m
[31m-is formed according to the request scheme (C<$scheme>) and the[m
[31m-L<ngx_http_core_module> and[m
[31m-L<ngx_http_core_module> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, a I<C<URL>> for temporary redirect with the code 302[m
[31m-can be specified as the sole parameter.[m
[31m-Such a parameter should start with the “C<http:E<sol>E<sol>>”,[m
[31m-“C<https:E<sol>E<sol>>”, or “C<$scheme>” string.[m
[31m-A I<C<URL>> can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Only the following codes could be returned before version 0.7.51:[m
[31m-204, 400, 402 — 406, 408, 410, 411, 413, 416, and 500 — 504.[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The code 307 was not treated as a redirect until versions 1.1.16 and 1.0.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite[m
[31m-[m
[31m-[m
[31m-B<syntax:> rewrite I<[m
[31m-    I<C<regex>>[m
[31m-    I<C<replacement>>[m
[31m-    [I<C<flag>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the specified regular expression matches a request URI, URI is changed[m
[31m-as specified in the I<C<replacement>> string.[m
[31m-The C<rewrite> directives are executed sequentially[m
[31m-in order of their appearance in the configuration file.[m
[31m-It is possible to terminate further processing of the directives using flags.[m
[31m-If a replacement string starts with “C<http:E<sol>E<sol>>”[m
[31m-or “C<https:E<sol>E<sol>>”, the processing stops and the[m
[31m-redirect is returned to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-An optional I<C<flag>> parameter can be one of:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<last>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-stops processing the current set of[m
[31m-C<ngx_http_rewrite_module> directives and starts[m
[31m-a search for a new location matching the changed URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<break>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-stops processing the current set of[m
[31m-C<ngx_http_rewrite_module> directives[m
[31m-as with the L</break> directive;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<redirect>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns a temporary redirect with the 302 code;[m
[31m-used if a replacement string does not start with[m
[31m-“C<http:E<sol>E<sol>>” or “C<https:E<sol>E<sol>>”;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<permanent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns a permanent redirect with the 301 code.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-The full redirect URL is formed according to the[m
[31m-request scheme (C<$scheme>) and the[m
[31m-L<ngx_http_core_module> and[m
[31m-L<ngx_http_core_module> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;[m
[31m-        rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;[m
[31m-        return  403;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-But if these directives are put inside the “C<E<sol>downloadE<sol>>”[m
[31m-location, the C<last> flag should be replaced by[m
[31m-C<break>, or otherwise nginx will make 10 cycles and[m
[31m-return the 500 error:[m
[31m-[m
[31m-    [m
[31m-    location /download/ {[m
[31m-        rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;[m
[31m-        rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;[m
[31m-        return  403;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a I<C<replacement>> string includes the new request arguments,[m
[31m-the previous request arguments are appended after them.[m
[31m-If this is undesired, putting a question mark at the end of a replacement[m
[31m-string avoids having them appended, for example:[m
[31m-[m
[31m-    [m
[31m-    rewrite ^/users/(.*)$ /show?user=$1? last;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a regular expression includes the “C<}>”[m
[31m-or “C<;>” characters, the whole expressions should be enclosed[m
[31m-in single or double quotes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_log[m
[31m-[m
[31m-[m
[31m-B<syntax:> rewrite_log I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables logging of C<ngx_http_rewrite_module>[m
[31m-module directives processing results[m
[31m-into the L<ngx_core_module> at[m
[31m-the C<notice> level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set[m
[31m-[m
[31m-[m
[31m-B<syntax:> set I<I<C<$variable>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<value>> for the specified I<C<variable>>.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uninitialized_variable_warn[m
[31m-[m
[31m-[m
[31m-B<syntax:> uninitialized_variable_warn I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Controls whether warnings about uninitialized variables are logged.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Internal Implementation[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_rewrite_module> module directives[m
[31m-are compiled at the configuration stage into internal instructions[m
[31m-that are interpreted during request processing.[m
[31m-An interpreter is a simple virtual stack machine.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, the directives[m
[31m-[m
[31m-    [m
[31m-    location /download/ {[m
[31m-        if ($forbidden) {[m
[31m-            return 403;[m
[31m-        }[m
[31m-    [m
[31m-        if ($slow) {[m
[31m-            limit_rate 10k;[m
[31m-        }[m
[31m-    [m
[31m-        rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-will be translated into these instructions:[m
[31m-[m
[31m-    [m
[31m-    variable $forbidden[m
[31m-    check against zero[m
[31m-        return 403[m
[31m-        end of code[m
[31m-    variable $slow[m
[31m-    check against zero[m
[31m-    match of regular expression[m
[31m-    copy "/"[m
[31m-    copy $1[m
[31m-    copy "/mp3/"[m
[31m-    copy $2[m
[31m-    copy ".mp3"[m
[31m-    end of regular expression[m
[31m-    end of code[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that there are no instructions for the[m
[31m-L<ngx_http_core_module>[m
[31m-directive above as it is unrelated to the[m
[31m-C<ngx_http_rewrite_module> module.[m
[31m-A separate configuration is created for the L</if> block.[m
[31m-If the condition holds true, a request is assigned this configuration[m
[31m-where C<limit_rate> equals to 10k.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive[m
[31m-[m
[31m-    [m
[31m-    rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;[m
[31m-[m
[31m-[m
[31m-can be made smaller by one instruction if the first slash in the regular expression[m
[31m-is put inside the parentheses:[m
[31m-[m
[31m-    [m
[31m-    rewrite ^(<emphasis>/</emphasis>download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;[m
[31m-[m
[31m-[m
[31m-The corresponding instructions will then look like this:[m
[31m-[m
[31m-    [m
[31m-    match of regular expression[m
[31m-    copy $1[m
[31m-    copy "/mp3/"[m
[31m-    copy $2[m
[31m-    copy ".mp3"[m
[31m-    end of regular expression[m
[31m-    end of code[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_scgi_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_scgi_module.pod[m
[1mdeleted file mode 100644[m
[1mindex f590f54..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_scgi_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,2178 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_scgi_module - Module ngx_http_scgi_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_scgi_module> module allows passing[m
[31m-requests to an SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        include   scgi_params;[m
[31m-        scgi_pass localhost:9000;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 scgi_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to an SCGI server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<scgi_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to an SCGI server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    scgi_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the first part[m
[31m-of the response received from the SCGI server.[m
[31m-This part usually contains a small response header.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-It can be made smaller, however.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of responses from the SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, nginx receives a response from the SCGI server[m
[31m-as soon as possible, saving it into the buffers set by the[m
[31m-L</scgi_buffer_size> and L</scgi_buffers> directives.[m
[31m-If the whole response does not fit into memory, a part of it can be saved[m
[31m-to a temporary file on the disk.[m
[31m-Writing to temporary files is controlled by the[m
[31m-L</scgi_max_temp_file_size> and[m
[31m-L</scgi_temp_file_write_size> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the response is passed to a client synchronously,[m
[31m-immediately as it is received.[m
[31m-nginx will not try to read the whole response from the SCGI server.[m
[31m-The maximum size of the data that nginx can receive from the server[m
[31m-at a time is set by the L</scgi_buffer_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering can also be enabled or disabled by passing[m
[31m-“C<yes>” or “C<no>” in the[m
[31m-C<X-Accel-Buffering> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L</scgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from the SCGI server,[m
[31m-for a single connection.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_busy_buffers_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_busy_buffers_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the SCGI[m
[31m-server is enabled, limits the total I<C<size>> of buffers that[m
[31m-can be busy sending a response to the client while the response is not[m
[31m-yet fully read.[m
[31m-In the meantime, the rest of the buffers can be used for reading the response[m
[31m-and, if needed, buffering part of the response to a temporary file.[m
[31m-By default, I<C<size>> is limited by the size of two buffers set by the[m
[31m-L</scgi_buffer_size> and L</scgi_buffers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache I<I<C<zone>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a shared memory zone used for caching.[m
[31m-The same zone can be used in several places.[m
[31m-Parameter value can contain variables (1.7.9).[m
[31m-The C<off> parameter disables caching inherited[m
[31m-from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_bypass[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_bypass I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be taken from a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be taken from the cache:[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_bypass $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    scgi_cache_bypass $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</scgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_key I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for caching, for example[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_key localhost:9000$request_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_lock[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_lock I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When enabled, only one request at a time will be allowed to populate[m
[31m-a new cache element identified according to the L</scgi_cache_key>[m
[31m-directive by passing a request to an SCGI server.[m
[31m-Other requests of the same cache element will either wait[m
[31m-for a response to appear in the cache or the cache lock for[m
[31m-this element to be released, up to the time set by the[m
[31m-L</scgi_cache_lock_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_lock_age[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_lock_age I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the last request passed to the SCGI server[m
[31m-for populating a new cache element[m
[31m-has not completed for the specified I<C<time>>,[m
[31m-one more request may be passed to the SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_lock_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_lock_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for L</scgi_cache_lock>.[m
[31m-When the I<C<time>> expires,[m
[31m-the request will be passed to the SCGI server,[m
[31m-however, the response will not be cached.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 1.7.8, the response could be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_methods I<[m
[31m-    C<GET> E<verbar>[m
[31m-    C<HEAD> E<verbar>[m
[31m-    C<POST>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<GET HEAD>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the client request method is listed in this directive then[m
[31m-the response will be cached.[m
[31m-“C<GET>” and “C<HEAD>” methods are always[m
[31m-added to the list, though it is recommended to specify them explicitly.[m
[31m-See also the L</scgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> of requests after which the response[m
[31m-will be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_path I<[m
[31m-    I<C<path>>[m
[31m-    [C<levels>=I<C<levels>>][m
[31m-    [C<use_temp_path>=C<on>E<verbar>C<off>][m
[31m-    C<keys_zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<inactive>=I<C<time>>][m
[31m-    [C<max_size>=I<C<size>>][m
[31m-    [C<loader_files>=I<C<number>>][m
[31m-    [C<loader_sleep>=I<C<time>>][m
[31m-    [C<loader_threshold>=I<C<time>>][m
[31m-    [C<purger>=C<on>E<verbar>C<off>][m
[31m-    [C<purger_files>=I<C<number>>][m
[31m-    [C<purger_sleep>=I<C<time>>][m
[31m-    [C<purger_threshold>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path and other parameters of a cache.[m
[31m-Cache data are stored in files.[m
[31m-The file name in a cache is a result of[m
[31m-applying the MD5 function to the[m
[31m-cache key.[m
[31m-The C<levels> parameter defines hierarchy levels of a cache.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;[m
[31m-[m
[31m-[m
[31m-file names in a cache will look like this:[m
[31m-[m
[31m-    [m
[31m-    /data/nginx/cache/<emphasis>c</emphasis>/<emphasis>29</emphasis>/b7f54b2df7773722d382f4809d650<emphasis>29c</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A cached response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the cache can be put on[m
[31m-different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both cache and a directory[m
[31m-holding temporary files[m
[31m-are put on the same file system.[m
[31m-A directory for temporary files is set based on[m
[31m-the C<use_temp_path> parameter (1.7.10).[m
[31m-If this parameter is omitted or set to the value C<on>,[m
[31m-the directory set by the L</scgi_temp_path> directive[m
[31m-for the given location will be used.[m
[31m-If the value is set to C<off>,[m
[31m-temporary files will be put directly in the cache directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, all active keys and information about data are stored[m
[31m-in a shared memory zone, whose I<C<name>> and I<C<size>>[m
[31m-are configured by the C<keys_zone> parameter.[m
[31m-One megabyte zone can store about 8 thousand keys.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Cached data that are not accessed during the time specified by the[m
[31m-C<inactive> parameter get removed from the cache[m
[31m-regardless of their freshness.[m
[31m-By default, C<inactive> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special “cache manager” process monitors the maximum cache size set[m
[31m-by the C<max_size> parameter.[m
[31m-When this size is exceeded, it removes the least recently used data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A minute after the start the special “cache loader” process is activated.[m
[31m-It loads information about previously cached data stored on file system[m
[31m-into a cache zone.[m
[31m-The loading is done in iterations.[m
[31m-During one iteration no more than C<loader_files> items[m
[31m-are loaded (by default, 100).[m
[31m-Besides, the duration of one iteration is limited by the[m
[31m-C<loader_threshold> parameter (by default, 200 milliseconds).[m
[31m-Between iterations, a pause configured by the C<loader_sleep>[m
[31m-parameter (by default, 50 milliseconds) is made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Instructs whether cache entries that match a[m
[31m-wildcard key[m
[31m-will be removed from the disk by the cache purger (1.7.12).[m
[31m-Setting the parameter to C<on>[m
[31m-(default is C<off>)[m
[31m-will activate the “cache purger” process that[m
[31m-permanently iterates through all cache entries[m
[31m-and deletes the entries that match the wildcard key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_files>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of items that will be scanned during one iteration (1.7.12).[m
[31m-By default, C<purger_files> is set to 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_threshold>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the duration of one iteration (1.7.12).[m
[31m-By default, C<purger_threshold> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_sleep>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a pause between iterations (1.7.12).[m
[31m-By default, C<purger_sleep> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_purge[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_purge I<string ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the request will be considered a cache[m
[31m-purge request.[m
[31m-If at least one value of the string parameters is not empty and is not equal[m
[31m-to “0” then the cache entry with a corresponding[m
[31m-cache key is removed.[m
[31m-The result of successful operation is indicated by returning[m
[31m-the C<204> (C<No Content>) response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the cache key of a purge request ends[m
[31m-with an asterisk (“C<*>”), all cache entries matching the[m
[31m-wildcard key will be removed from the cache.[m
[31m-However, these entries will remain on the disk until they are deleted[m
[31m-for either inactivity,[m
[31m-or processed by the cache purger (1.7.12),[m
[31m-or a client attempts to access them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration:[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m;[m
[31m-    [m
[31m-    map $request_method $purge_method {[m
[31m-        PURGE   1;[m
[31m-        default 0;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        location / {[m
[31m-            scgi_pass        backend;[m
[31m-            scgi_cache       cache_zone;[m
[31m-            scgi_cache_key   $uri;[m
[31m-            scgi_cache_purge $purge_method;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This functionality is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_revalidate[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_revalidate I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables revalidation of expired cache items using conditional requests with[m
[31m-the C<If-Modified-Since> and C<If-None-Match>[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_use_stale[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_use_stale I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<updating> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines in which cases a stale cached response can be used[m
[31m-when an error occurs during communication with the SCGI server.[m
[31m-The directive’s parameters match the parameters of the[m
[31m-L</scgi_next_upstream> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<error> parameter also permits[m
[31m-using a stale cached response if an SCGI server to process a request[m
[31m-cannot be selected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, the C<updating> parameter permits[m
[31m-using a stale cached response if it is currently being updated.[m
[31m-This allows minimizing the number of accesses to SCGI servers[m
[31m-when updating cached data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To minimize the number of accesses to SCGI servers when[m
[31m-populating a new cache element, the L</scgi_cache_lock>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_cache_valid I<[I<C<code>> ...] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets caching time for different response codes.[m
[31m-For example, the following directives[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_valid 200 302 10m;[m
[31m-    scgi_cache_valid 404      1m;[m
[31m-[m
[31m-[m
[31m-set 10 minutes of caching for responses with codes 200 and 302[m
[31m-and 1 minute for responses with code 404.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only caching I<C<time>> is specified[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_valid 5m;[m
[31m-[m
[31m-[m
[31m-then only 200, 301, and 302 responses are cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the C<any> parameter can be specified[m
[31m-to cache any responses:[m
[31m-[m
[31m-    [m
[31m-    scgi_cache_valid 200 302 10m;[m
[31m-    scgi_cache_valid 301      1h;[m
[31m-    scgi_cache_valid any      1m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters of caching can also be set directly[m
[31m-in the response header.[m
[31m-This has higher priority than setting of caching time using the directive.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<X-Accel-Expires> header field sets caching time of a[m
[31m-response in seconds.[m
[31m-The zero value disables caching for a response.[m
[31m-If the value starts with the C<@> prefix, it sets an absolute[m
[31m-time in seconds since Epoch, up to which the response may be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header does not include the C<X-Accel-Expires> field,[m
[31m-parameters of caching may be set in the header fields[m
[31m-C<Expires> or C<Cache-Control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Set-Cookie> field, such a[m
[31m-response will not be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Vary> field[m
[31m-with the special value “C<*>”, such a[m
[31m-response will not be cached (1.7.7).[m
[31m-If the header includes the C<Vary> field[m
[31m-with another value, such a response will be cached[m
[31m-taking into account the corresponding request header fields (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Processing of one or more of these response header fields can be disabled[m
[31m-using the L</scgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with an SCGI server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the SCGI server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_hide_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_hide_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default,[m
[31m-nginx does not pass the header fields C<Status> and[m
[31m-C<X-Accel-...> from the response of an SCGI[m
[31m-server to a client.[m
[31m-The C<scgi_hide_header> directive sets additional fields[m
[31m-that will not be passed.[m
[31m-If, on the contrary, the passing of fields needs to be permitted,[m
[31m-the L</scgi_pass_header> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_ignore_client_abort[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_ignore_client_abort I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether the connection with an SCGI server should be[m
[31m-closed when a client closes the connection without waiting[m
[31m-for a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_ignore_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_ignore_headers I<I<C<field>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables processing of certain response header fields from the SCGI server.[m
[31m-The following fields can be ignored: C<X-Accel-Redirect>,[m
[31m-C<X-Accel-Expires>, C<X-Accel-Limit-Rate> (1.1.6),[m
[31m-C<X-Accel-Buffering> (1.1.6),[m
[31m-C<X-Accel-Charset> (1.1.6), C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie> (0.8.44),[m
[31m-and C<Vary> (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If not disabled, processing of these header fields has the following[m
[31m-effect:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Expires>, C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie>,[m
[31m-and C<Vary>[m
[31m-set the parameters of response caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Redirect> performs an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> to the specified URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Limit-Rate> sets the[m
[31m-L<rate[m
[31m-limit|ngx_http_core_module> for transmission of a response to a client;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Buffering> enables or disables[m
[31m-buffering of a response;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Charset> sets the desired[m
[31m-L<ngx_http_charset_module>[m
[31m-of a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_intercept_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_intercept_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether an SCGI server responses with codes greater than or equal[m
[31m-to 300 should be passed to a client or be redirected to nginx for processing[m
[31m-with the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the response from the SCGI server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if nginx simultaneously opens[m
[31m-two connections to the SCGI server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-The limitation works only if[m
[31m-buffering of responses from the SCGI[m
[31m-server is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_max_temp_file_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_max_temp_file_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the SCGI[m
[31m-server is enabled, and the whole response does not fit into the buffers[m
[31m-set by the L</scgi_buffer_size> and L</scgi_buffers>[m
[31m-directives, a part of the response can be saved to a temporary file.[m
[31m-This directive sets the maximum I<C<size>> of the temporary file.[m
[31m-The size of data written to the temporary file at a time is set[m
[31m-by the L</scgi_temp_file_write_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The zero value disables buffering of responses to temporary files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This restriction does not apply to responses[m
[31m-that will be cached[m
[31m-or stored on disk.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<non_idempotent> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_header>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<http_500>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 500;[m
[31m-[m
[31m-[m
[31m-=item C<http_503>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 503;[m
[31m-[m
[31m-[m
[31m-=item C<http_403>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 403;[m
[31m-[m
[31m-[m
[31m-=item C<http_404>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 404;[m
[31m-[m
[31m-[m
[31m-=item C<non_idempotent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-normally, requests with a[m
[31m-L<non-idempotent|http://tools.ietf.org/html/rfc7231#section-4.2.2>[m
[31m-method[m
[31m-(C<POST>, C<LOCK>, C<PATCH>)[m
[31m-are not passed to the next server[m
[31m-if a request has been sent to an upstream server (1.9.13);[m
[31m-enabling this option explicitly allows retrying such requests;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The cases of C<http_500> and C<http_503> are[m
[31m-considered unsuccessful attempts only if they are specified in the directive.[m
[31m-The cases of C<http_403> and C<http_404>[m
[31m-are never considered unsuccessful attempts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_no_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_no_cache I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be saved to a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be saved:[m
[31m-[m
[31m-    [m
[31m-    scgi_no_cache $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    scgi_no_cache $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</scgi_cache_bypass> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_param I<[m
[31m-    I<C<parameter>> I<C<value>>[m
[31m-    [C<if_not_empty>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<parameter>> that should be passed to the SCGI server.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<scgi_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Standard[m
[31m-L<CGI[m
[31m-environment variables|http://tools.ietf.org/html/rfc3875#section-4.1>[m
[31m-should be provided as SCGI headers, see the F<scgi_params> file[m
[31m-provided in the distribution:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        include scgi_params;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a directive is specified with C<if_not_empty> (1.1.11) then[m
[31m-such a parameter will not be passed to the server until its value is not empty:[m
[31m-[m
[31m-    [m
[31m-    scgi_param HTTPS $https if_not_empty;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_pass I<I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the address of an SCGI server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    scgi_pass localhost:9000;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    scgi_pass unix:/tmp/scgi.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_pass_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_pass_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Permits passing otherwise disabled header[m
[31m-fields from an SCGI server to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_pass_request_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_pass_request_body I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the original request body is passed[m
[31m-to the SCGI server.[m
[31m-See also the L</scgi_pass_request_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_pass_request_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_pass_request_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the header fields of the original request are passed[m
[31m-to the SCGI server.[m
[31m-See also the L</scgi_pass_request_body> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the SCGI server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the SCGI server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_request_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_request_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of a client request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the entire request body is[m
[31m-L<read|ngx_http_core_module>[m
[31m-from the client before sending the request to an SCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the request body is sent to the SCGI server[m
[31m-immediately as it is received.[m
[31m-In this case, the request cannot be passed to the[m
[31m-next server[m
[31m-if nginx already started sending the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When HTTPE<sol>1.1 chunked transfer encoding is used[m
[31m-to send the original request body,[m
[31m-the request body will be buffered regardless of the directive value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the SCGI server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the SCGI server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_store[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_store I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables saving of files to a disk.[m
[31m-The C<on> parameter saves files with paths[m
[31m-corresponding to the directives[m
[31m-L<ngx_http_core_module> or[m
[31m-L<ngx_http_core_module>.[m
[31m-The C<off> parameter disables saving of files.[m
[31m-In addition, the file name can be set explicitly using the[m
[31m-I<C<string>> with variables:[m
[31m-[m
[31m-    [m
[31m-    scgi_store /data/www$original_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The modification time of files is set according to the received[m
[31m-C<Last-Modified> response header field.[m
[31m-The response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the L</scgi_temp_path>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive can be used to create local copies of static unchangeable[m
[31m-files, e.g.:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root              /data/www;[m
[31m-        error_page        404 = /fetch$uri;[m
[31m-    }[m
[31m-    [m
[31m-    location /fetch/ {[m
[31m-        internal;[m
[31m-    [m
[31m-        scgi_pass         backend:9000;[m
[31m-        ...[m
[31m-    [m
[31m-        scgi_store        on;[m
[31m-        scgi_store_access user:rw group:rw all:r;[m
[31m-        scgi_temp_path    /data/temp;[m
[31m-    [m
[31m-        alias             /data/www/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_store_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_store_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    scgi_store_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    scgi_store_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_temp_file_write_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_temp_file_write_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the I<C<size>> of data written to a temporary file[m
[31m-at a time, when buffering of responses from the SCGI server[m
[31m-to temporary files is enabled.[m
[31m-By default, I<C<size>> is limited by two buffers set by the[m
[31m-L</scgi_buffer_size> and L</scgi_buffers> directives.[m
[31m-The maximum size of a temporary file is set by the[m
[31m-L</scgi_max_temp_file_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 scgi_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> scgi_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<scgi_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files[m
[31m-with data received from SCGI servers.[m
[31m-Up to three-level subdirectory hierarchy can be used underneath the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    scgi_temp_path /spool/nginx/scgi_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/scgi_temp/<emphasis>7</emphasis>/<emphasis>45</emphasis>/00000123<emphasis>457</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the C<use_temp_path> parameter of the[m
[31m-L</scgi_cache_path> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_secure_link_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_secure_link_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 4420b97..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_secure_link_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,328 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_secure_link_module - Module ngx_http_secure_link_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_secure_link_module> module (0.7.18)[m
[31m-is used to check authenticity of requested links,[m
[31m-protect resources from unauthorized access,[m
[31m-and limit link lifetime.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The authenticity of a requested link is verified by comparing the[m
[31m-checksum value passed in a request with the value computed[m
[31m-for the request.[m
[31m-If a link has a limited lifetime and the time has expired,[m
[31m-the link is considered outdated.[m
[31m-The status of these checks is made available in the[m
[31m-C<$secure_link> variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module provides two alternative operation modes.[m
[31m-The first mode is enabled by the L</secure_link_secret>[m
[31m-directive and is used to check authenticity of requested links[m
[31m-as well as protect resources from unauthorized access.[m
[31m-The second mode (0.8.50) is enabled by the[m
[31m-L</secure_link> and L</secure_link_md5>[m
[31m-directives and is also used to limit lifetime of links.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_secure_link_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 secure_link[m
[31m-[m
[31m-[m
[31m-B<syntax:> secure_link I<I<C<expression>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a string with variables from which the[m
[31m-checksum value and lifetime of a link will be extracted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Variables used in an I<C<expression>> are usually associated[m
[31m-with a request; see example below.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The checksum value extracted from the string is compared with[m
[31m-the MD5 hash value of the expression defined by the[m
[31m-L</secure_link_md5> directive.[m
[31m-If the checksums are different, the C<$secure_link> variable[m
[31m-is set to an empty string.[m
[31m-If the checksums are the same, the link lifetime is checked.[m
[31m-If the link has a limited lifetime and the time has expired,[m
[31m-the C<$secure_link> variable is set to “C<0>”.[m
[31m-Otherwise, it is set to “C<1>”.[m
[31m-The MD5 hash value passed in a request is encoded in[m
[31m-L<base64url|http://tools.ietf.org/html/rfc4648#section-5>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a link has a limited lifetime, the expiration time[m
[31m-is set in seconds since Epoch (Thu, 01 Jan 1970 00:00:00 GMT).[m
[31m-The value is specified in the expression after the MD5 hash,[m
[31m-and is separated by a comma.[m
[31m-The expiration time passed in a request is available through[m
[31m-the C<$secure_link_expires> variable for a use in[m
[31m-the L</secure_link_md5> directive.[m
[31m-If the expiration time is not specified, a link has the unlimited[m
[31m-lifetime.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 secure_link_md5[m
[31m-[m
[31m-[m
[31m-B<syntax:> secure_link_md5 I<I<C<expression>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines an expression for which the MD5 hash value will[m
[31m-be computed and compared with the value passed in a request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The expression should contain the secured part of a link (resource)[m
[31m-and a secret ingredient.[m
[31m-If the link has a limited lifetime,[m
[31m-the expression should also contain C<$secure_link_expires>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To prevent unauthorized access, the expression may contain some[m
[31m-information about the client, such as its address and browser version.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    location /s/ {[m
[31m-        secure_link $arg_md5,$arg_expires;[m
[31m-        secure_link_md5 "$secure_link_expires$uri$remote_addr secret";[m
[31m-    [m
[31m-        if ($secure_link = "") {[m
[31m-            return 403;[m
[31m-        }[m
[31m-    [m
[31m-        if ($secure_link = "0") {[m
[31m-            return 410;[m
[31m-        }[m
[31m-    [m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The[m
[31m-“C<E<sol>sE<sol>link?md5=_e4Nc3iduzkWRm01TBBNYwE<amp>expires=2147483647>”[m
[31m-link[m
[31m-restricts access to “C<E<sol>sE<sol>link>” for the client with the[m
[31m-IP address 127.0.0.1.[m
[31m-The link also has the limited lifetime until January 19, 2038 (GMT).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On UNIX, the I<C<md5>> request argument value can be obtained as:[m
[31m-[m
[31m-    [m
[31m-    echo -n '2147483647/s/link127.0.0.1 secret' | \[m
[31m-        openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 secure_link_secret[m
[31m-[m
[31m-[m
[31m-B<syntax:> secure_link_secret I<I<C<word>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a secret I<C<word>> used to check authenticity[m
[31m-of requested links.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full URI of a requested link looks as follows:[m
[31m-[m
[31m-    [m
[31m-    /<value>prefix</value>/<value>hash</value>/<value>link</value>[m
[31m-[m
[31m-[m
[31m-where I<C<hash>> is a hexadecimal representation of the[m
[31m-MD5 hash computed for the concatenation of the link and secret word,[m
[31m-and I<C<prefix>> is an arbitrary string without slashes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the requested link passes the authenticity check,[m
[31m-the C<$secure_link> variable is set to the link[m
[31m-extracted from the request URI.[m
[31m-Otherwise, the C<$secure_link> variable[m
[31m-is set to an empty string.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    location /p/ {[m
[31m-        secure_link_secret secret;[m
[31m-    [m
[31m-        if ($secure_link = "") {[m
[31m-            return 403;[m
[31m-        }[m
[31m-    [m
[31m-        rewrite ^ /secure/$secure_link;[m
[31m-    }[m
[31m-    [m
[31m-    location /secure/ {[m
[31m-        internal;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-A request of “C<E<sol>pE<sol>5e814704a28d9bc1914ff19fa0c4a00aE<sol>link>”[m
[31m-will be internally redirected to[m
[31m-“C<E<sol>secureE<sol>link>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-On UNIX, the hash value for this example can be obtained as:[m
[31m-[m
[31m-    [m
[31m-    echo -n 'linksecret' | openssl md5 -hex[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$secure_link>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The status of a link check.[m
[31m-The specific value depends on the selected operation mode.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$secure_link_expires>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The lifetime of a link passed in a request;[m
[31m-intended to be used only in the[m
[31m-L</secure_link_md5> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_session_log_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_session_log_module.pod[m
[1mdeleted file mode 100644[m
[1mindex ffffb0e..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_session_log_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,216 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_session_log_module - Module ngx_http_session_log_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_session_log_module> module enables logging[m
[31m-sessions (that is, aggregates of multiple HTTP requests) instead of[m
[31m-individual HTTP requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following configuration sets up a session log and maps requests to[m
[31m-sessions according to the request client address and C<User-Agent>[m
[31m-request header field:[m
[31m-[m
[31m-    [m
[31m-        session_log_zone /path/to/log format=combined[m
[31m-                         zone=one:1m timeout=30s[m
[31m-                         md5=$binary_remote_addr$http_user_agent;[m
[31m-    [m
[31m-        location /media/ {[m
[31m-            session_log one;[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 session_log_format[m
[31m-[m
[31m-[m
[31m-B<syntax:> session_log_format I<[m
[31m-    I<C<name>>[m
[31m-    I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<combined "...">[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the output format of a log.[m
[31m-The value of the C<$body_bytes_sent> variable is aggregated across[m
[31m-all requests in a session.[m
[31m-The values of all other variables available for logging correspond to the[m
[31m-first request in a session.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 session_log_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> session_log_zone I<[m
[31m-    I<C<path>>[m
[31m-    C<zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<format>=I<C<format>>][m
[31m-    [C<timeout>=I<C<time>>][m
[31m-    [C<id>=I<C<id>>][m
[31m-    [C<md5>=I<C<md5>>][m
[31m->[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path to a log file and configures the shared memory zone that is used[m
[31m-to store currently active sessions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A session is considered active for as long as the time elapsed since[m
[31m-the last request in the session does not exceed the specified[m
[31m-C<timeout> (by default, 30 seconds).[m
[31m-Once a session is no longer active, it is written to the log.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<id> parameter identifies the[m
[31m-session to which a request is mapped.[m
[31m-The C<id> parameter is set to the hexadecimal representation[m
[31m-of an MD5 hash (for example, obtained from a cookie using variables).[m
[31m-If this parameter is not specified or does not represent the valid[m
[31m-MD5 hash, nginx computes the MD5 hash from the value of[m
[31m-the C<md5> parameter and creates a new session using this hash.[m
[31m-Both the C<id> and C<md5> parameters[m
[31m-can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<format> parameter sets the custom session log[m
[31m-format configured by the L</session_log_format> directive.[m
[31m-If C<format> is not specified, the predefined[m
[31m-“C<combined>” format is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 session_log[m
[31m-[m
[31m-[m
[31m-B<syntax:> session_log I<I<C<name>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the use of the specified session log.[m
[31m-The special value C<off> cancels all[m
[31m-C<session_log> directives inherited from the previous[m
[31m-configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_session_log_module> module supports[m
[31m-two embedded variables:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$session_log_id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current session ID;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$session_log_binary_id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current session ID in binary form (16 bytes).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_slice_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_slice_module.pod[m
[1mdeleted file mode 100644[m
[1mindex c46d5b1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_slice_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,132 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_slice_module - Module ngx_http_slice_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_slice_module> module (1.9.8) is a filter[m
[31m-that splits a request into subrequests,[m
[31m-each returning a certain range of response.[m
[31m-The filter provides more effective caching of big responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_slice_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        <emphasis>slice</emphasis>             1m;[m
[31m-        proxy_cache       cache;[m
[31m-        proxy_cache_key   $uri$is_args$args<emphasis>$slice_range</emphasis>;[m
[31m-        proxy_set_header  Range <emphasis>$slice_range</emphasis>;[m
[31m-        proxy_cache_valid 200 206 1h;[m
[31m-        proxy_pass        http://localhost:8000;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-In this example,[m
[31m-the response is split into 1-megabyte cacheable slices.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 slice[m
[31m-[m
[31m-[m
[31m-B<syntax:> slice I<C<size>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the slice.[m
[31m-The zero value disables splitting responses into slices.[m
[31m-Note that a too low value may result in excessive memory usage[m
[31m-and a large number of file descriptors.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order for a subrequest to return the required range,[m
[31m-the C<$slice_range> variable should be[m
[31m-L<passed|ngx_http_proxy_module> to[m
[31m-the proxied server as the C<Range> request header field.[m
[31m-If[m
[31m-L<caching|ngx_http_proxy_module>[m
[31m-is enabled, C<$slice_range> should be added to the[m
[31m-L<cache key|ngx_http_proxy_module>[m
[31m-and caching of responses with 206 status code should be[m
[31m-L<enabled|ngx_http_proxy_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_slice_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$slice_range>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the current slice range in[m
[31m-L<HTTP[m
[31m-byte range|https://tools.ietf.org/html/rfc7233#section-2.1> format,[m
[31m-for example, C<bytes=0-1048575>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_spdy_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_spdy_module.pod[m
[1mdeleted file mode 100644[m
[1mindex a694191..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_spdy_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,220 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_spdy_module - Module ngx_http_spdy_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_spdy_module> module provides experimental[m
[31m-support for L<SPDY|http://www.chromium.org/spdy/spdy-protocol>.[m
[31m-Currently,[m
[31m-L<draft[m
[31m-3.1|http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1> of SPDY protocol is implemented.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.5.10,[m
[31m-L<draft[m
[31m-2|http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2> of SPDY protocol was implemented.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with[m
[31m-the C<--with-http_spdy_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module was superseded by the[m
[31m-L<ngx_http_v2_module|ngx_http_v2_module> module[m
[31m-in 1.9.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module is experimental, caveat emptor applies.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Current implementation of SPDY protocol does not support “server push”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In versions prior to 1.5.9, responses in SPDY connections could not be[m
[31m-L<rate limited|ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering of a client request body cannot be disabled[m
[31m-regardless of[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>, and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directive values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen 443 ssl spdy;[m
[31m-    [m
[31m-        ssl_certificate server.crt;[m
[31m-        ssl_certificate_key server.key;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Note that in order to accept both[m
[31m-L<HTTPS|ngx_http_ssl_module> and SPDY connections[m
[31m-simultaneously on the same port,[m
[31m-L<OpenSSL|http://www.openssl.org> library used should support[m
[31m-“Next Protocol Negotiation” TLS extension, available since OpenSSL[m
[31m-version 1.0.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 spdy_chunk_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> spdy_chunk_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum size of chunks[m
[31m-into which the response body is[m
[31m-L<sliced|http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Data-frames>.[m
[31m-A too low value results in higher overhead.[m
[31m-A too high value impairs prioritization due to[m
[31m-L<HOL blocking|http://en.wikipedia.org/wiki/Head-of-line_blocking>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 spdy_headers_comp[m
[31m-[m
[31m-[m
[31m-B<syntax:> spdy_headers_comp I<I<C<level>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the header compression I<C<level>> of a response in a range from[m
[31m-1 (fastest, less compression) to 9 (slowest, best compression).[m
[31m-The special value 0 turns off the header compression.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_spdy_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$spdy>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-SPDY protocol version for SPDY connections,[m
[31m-or an empty string otherwise;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$spdy_request_priority>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-request priority for SPDY connections,[m
[31m-or an empty string otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_split_clients_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_split_clients_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 79b847d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_split_clients_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,83 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_split_clients_module - Module ngx_http_split_clients_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_split_clients_module> module creates[m
[31m-variables suitable for AE<sol>B testing, also known as split testing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        split_clients "${remote_addr}AAA" $variant {[m
[31m-                       0.5%               .one;[m
[31m-                       2.0%               .two;[m
[31m-                       *                  "";[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            location / {[m
[31m-                index index${variant}.html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 split_clients[m
[31m-[m
[31m-[m
[31m-B<syntax:> split_clients I<[m
[31m-    I<C<string>>[m
[31m-    I<C<$variable>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Creates a variable for AE<sol>B testing, for example:[m
[31m-[m
[31m-    [m
[31m-    split_clients "${remote_addr}AAA" $variant {[m
[31m-                   0.5%               .one;[m
[31m-                   2.0%               .two;[m
[31m-                   *                  "";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-The value of the original string is hashed using MurmurHash2.[m
[31m-In the example given, hash values from 0 to 21474835 (0.5%)[m
[31m-correspond to the[m
[31m-value C<".one"> of the C<$variant> variable,[m
[31m-hash values from 21474836 to 107374180 (2%) correspond to[m
[31m-the value C<".two">,[m
[31m-and hash values from 107374181 to 4294967295 correspond to[m
[31m-the value C<""> (an empty string).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_ssi_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_ssi_module.pod[m
[1mdeleted file mode 100644[m
[1mindex fe379ed..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_ssi_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,710 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_ssi_module - Module ngx_http_ssi_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssi_module> module is a filter[m
[31m-that processes SSI (Server Side Includes) commands in responses[m
[31m-passing through it.[m
[31m-Currently, the list of supported SSI commands is incomplete.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        ssi on;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ssi[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables processing of SSI commands in responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_last_modified[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_last_modified I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows preserving the C<Last-Modified> header field[m
[31m-from the original response during SSI processing[m
[31m-to facilitate response caching.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the header field is removed as contents of the response[m
[31m-are modified during processing and may contain dynamically generated elements[m
[31m-or parts that are changed independently of the original response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_min_file_chunk[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_min_file_chunk I<C<size>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the minimum I<C<size>> for parts of a response stored on disk,[m
[31m-starting from which it makes sense to send them using[m
[31m-L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_silent_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_silent_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If enabled, suppresses the output of the[m
[31m-“C<[an error occurred while processing the directive]>”[m
[31m-string if an error occurred during SSI processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables processing of SSI commands in responses with the specified MIME types[m
[31m-in addition to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssi_value_length[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssi_value_length I<I<C<length>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<256>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum length of parameter values in SSI commands.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 SSI Commands[m
[31m-[m
[31m-[m
[31m-[m
[31m-SSI commands have the following generic format:[m
[31m-[m
[31m-    [m
[31m-    <!--# command parameter1=value1 parameter2=value2 ... -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following commands are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<block>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a block that can be used as a stub[m
[31m-in the C<include> command.[m
[31m-The block can contain other SSI commands.[m
[31m-The command has the following parameter:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-block name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    <!--# block name="one" -->[m
[31m-    stub[m
[31m-    <!--# endblock -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<config>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets some parameters used during SSI processing, namely:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<errmsg>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a string that is output if an error occurs during SSI processing.[m
[31m-By default, the following string is output:[m
[31m-[m
[31m-    [m
[31m-    [an error occurred while processing the directive][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<timefmt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a format string passed to the C<strftime> function[m
[31m-used to output date and time.[m
[31m-By default, the following format is used:[m
[31m-[m
[31m-    [m
[31m-    "%A, %d-%b-%Y %H:%M:%S %Z"[m
[31m-[m
[31m-[m
[31m-The “C<%s>” format is suitable to output time in seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<echo>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Outputs the value of a variable.[m
[31m-The command has the following parameters:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<var>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the variable name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<encoding>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the encoding method.[m
[31m-Possible values include C<none>, C<url>, and[m
[31m-C<entity>.[m
[31m-By default, C<entity> is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<default>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a non-standard parameter that sets a string to be output[m
[31m-if a variable is undefined.[m
[31m-By default, “C<none>” is output.[m
[31m-The command[m
[31m-[m
[31m-    [m
[31m-    <!--# echo var="name" default="<emphasis>no</emphasis>" -->[m
[31m-[m
[31m-[m
[31m-replaces the following sequence of commands:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name" --><!--# echo var="name" --><!--#[m
[31m-           else --><emphasis>no</emphasis><!--# endif -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<if>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Performs a conditional inclusion.[m
[31m-The following commands are supported:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="..." -->[m
[31m-    ...[m
[31m-    <!--# elif expr="..." -->[m
[31m-    ...[m
[31m-    <!--# else -->[m
[31m-    ...[m
[31m-    <!--# endif -->[m
[31m-[m
[31m-[m
[31m-Only one level of nesting is currently supported.[m
[31m-The command has the following parameter:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<expr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-expression.[m
[31m-An expression can be:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-variable existence check:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-comparison of a variable with a text:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name = <value>text</value>" -->[m
[31m-    <!--# if expr="$name != <value>text</value>" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-comparison of a variable with a regular expression:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name = /<value>text</value>/" -->[m
[31m-    <!--# if expr="$name != /<value>text</value>/" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a I<C<text>> contains variables,[m
[31m-their values are substituted.[m
[31m-A regular expression can contain positional and named captures[m
[31m-that can later be used through variables, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# if expr="$name = /(.+)@(?P<domain>.+)/" -->[m
[31m-        <!--# echo var="1" -->[m
[31m-        <!--# echo var="domain" -->[m
[31m-    <!--# endif -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<include>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Includes the result of another request into a response.[m
[31m-The command has the following parameters:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<file>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies an included file, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# include file="footer.html" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<virtual>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies an included request, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# include virtual="/remote/body.php?argument=value" -->[m
[31m-[m
[31m-[m
[31m-Several requests specified on one page and processed by proxied or[m
[31m-FastCGIE<sol>uwsgiE<sol>SCGI servers run in parallel.[m
[31m-If sequential processing is desired, the C<wait>[m
[31m-parameter should be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<stub>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a non-standard parameter that names the block whose[m
[31m-content will be output if the included request results in an empty[m
[31m-body or if an error occurs during the request processing, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# block name="one" -->&nbsp;<!--# endblock -->[m
[31m-    <!--# include virtual="/remote/body.php?argument=value" stub="one" -->[m
[31m-[m
[31m-[m
[31m-The replacement block content is processed in the included request context.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<wait>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a non-standard parameter that instructs to wait for a request to fully[m
[31m-complete before continuing with SSI processing, for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# include virtual="/remote/body.php?argument=value" wait="yes" -->[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<set>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a non-standard parameter that instructs to write a successful result[m
[31m-of request processing to the specified variable,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    <!--# include virtual="/remote/body.php?argument=value" set="one" -->[m
[31m-[m
[31m-[m
[31m-It should be noted that only the results of responses obtained using the[m
[31m-L<ngx_http_proxy_module|ngx_http_proxy_module>,[m
[31m-L<ngx_http_memcached_module|ngx_http_memcached_module>,[m
[31m-L<ngx_http_fastcgi_module|ngx_http_fastcgi_module> (1.5.6),[m
[31m-L<ngx_http_uwsgi_module|ngx_http_uwsgi_module> (1.5.6),[m
[31m-and L<ngx_http_scgi_module|ngx_http_scgi_module> (1.5.6)[m
[31m-modules can be written into variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<set>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a value of a variable.[m
[31m-The command has the following parameters:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<var>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the variable name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<value>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the variable value.[m
[31m-If an assigned value contains variables,[m
[31m-their values are substituted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssi_module> module supports[m
[31m-two embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$date_local>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current time in the local time zone.[m
[31m-The format is set by the C<config> command[m
[31m-with the C<timefmt> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$date_gmt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-current time in GMT.[m
[31m-The format is set by the C<config> command[m
[31m-with the C<timefmt> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_ssl_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_ssl_module.pod[m
[1mdeleted file mode 100644[m
[1mindex e9db67d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_ssl_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1300 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_ssl_module - Module ngx_http_ssl_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssl_module> module provides the[m
[31m-necessary support for HTTPS.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_ssl_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires the[m
[31m-L<OpenSSL|http://www.openssl.org> library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-To reduce the processor load it is recommended to[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-set the number of worker processes equal to the number of processors,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-enable keep-alive connections,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-enable the shared session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-disable the built-in session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and possibly increase the session lifetime (by default, 5 minutes):[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    <emphasis>worker_processes auto;</emphasis>[m
[31m-    [m
[31m-    http {[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            listen              443 ssl;[m
[31m-            <emphasis>keepalive_timeout   70;</emphasis>[m
[31m-    [m
[31m-            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-            ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;[m
[31m-            ssl_certificate     /usr/local/nginx/conf/cert.pem;[m
[31m-            ssl_certificate_key /usr/local/nginx/conf/cert.key;[m
[31m-            <emphasis>ssl_session_cache   shared:SSL:10m;</emphasis>[m
[31m-            <emphasis>ssl_session_timeout 10m;</emphasis>[m
[31m-    [m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ssl[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the HTTPS protocol for the given virtual server.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-It is recommended to use the C<ssl> parameter of the[m
[31m-L<ngx_http_core_module> directive instead[m
[31m-of this directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the size of the buffer used for sending data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the buffer size is 16k, which corresponds to minimal[m
[31m-overhead when sending big responses.[m
[31m-To minimize Time To First Byte it may be beneficial to use smaller values,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_buffer_size 4k;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-for the given virtual server.[m
[31m-If intermediate certificates should be specified in addition to a primary[m
[31m-certificate, they should be specified in the same file in the following[m
[31m-order: the primary certificate comes first, then the intermediate certificates.[m
[31m-A secret key in the PEM format may be placed in the same file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It should be kept in mind that due to the HTTPS protocol limitations[m
[31m-virtual servers should listen on different IP addresses:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen          192.168.1.1:443;[m
[31m-        server_name     one.example.com;[m
[31m-        ssl_certificate /usr/local/nginx/conf/one.example.com.cert;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen          192.168.1.2:443;[m
[31m-        server_name     two.example.com;[m
[31m-        ssl_certificate /usr/local/nginx/conf/two.example.com.cert;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-otherwise[m
[31m-L<the first server’s certificate|configuring_https_servers>[m
[31m-will be issued for the second site.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-for the given virtual server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>> (1.7.9),[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<HIGH:!aNULL:!MD5>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers.[m
[31m-The ciphers are specified in the format understood by the[m
[31m-OpenSSL library, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The previous versions of nginx used[m
[31m-L<different|configuring_https_servers>[m
[31m-ciphers by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_client_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_client_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify client certificates and[m
[31m-OCSP responses if L</ssl_stapling> is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The list of certificates will be sent to clients.[m
[31m-If this is not desired, the L</ssl_trusted_certificate>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.8.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-client certificates.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_dhparam[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_dhparam I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with DH parameters for DHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ecdh_curve[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ecdh_curve I<I<C<curve>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<auto>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<curve>> for ECDHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using OpenSSL 1.0.2 or higher,[m
[31m-it is possible to specify multiple curves (1.11.0), for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ecdh_curve prime256v1:secp384r1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<auto> (1.11.0) instructs nginx to use[m
[31m-a list built into the OpenSSL library when using OpenSSL 1.0.2 or higher,[m
[31m-or C<prime256v1> with older versions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.11.0,[m
[31m-the C<prime256v1> curve was used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        ssl_password_file /etc/keys/global.pass;[m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            server_name www1.example.com;[m
[31m-            ssl_certificate_key /etc/keys/first.key;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            server_name www2.example.com;[m
[31m-    [m
[31m-            # named pipe can also be used instead of a file[m
[31m-            ssl_password_file /etc/keys/fifo;[m
[31m-            ssl_certificate_key /etc/keys/second.key;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_prefer_server_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_prefer_server_ciphers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that server ciphers should be preferred over client[m
[31m-ciphers when using the SSLv3 and TLS protocols.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols.[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters work[m
[31m-only when the OpenSSL library of version 1.0.1 or higher is used.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters are[m
[31m-supported starting from versions 1.1.13 and 1.0.12,[m
[31m-so when the OpenSSL version 1.0.1 or higher[m
[31m-is used on older nginx versions, these protocols work, but cannot[m
[31m-be disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_cache I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<none> E<verbar>[m
[31m-    [C<builtin>[:I<C<size>>]][m
[31m-    [C<shared>:I<C<name>>:I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the types and sizes of caches that store session parameters.[m
[31m-A cache can be of any of the following types:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is strictly prohibited:[m
[31m-nginx explicitly tells a client that sessions may not be reused.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is gently disallowed:[m
[31m-nginx tells a client that sessions may be reused, but does not[m
[31m-actually store session parameters in the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<builtin>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache built in OpenSSL; used by one worker process only.[m
[31m-The cache size is specified in sessions.[m
[31m-If size is not given, it is equal to 20480 sessions.[m
[31m-Use of the built-in cache can cause memory fragmentation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<shared>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache shared between all worker processes.[m
[31m-The cache size is specified in bytes; one megabyte can store[m
[31m-about 4000 sessions.[m
[31m-Each shared cache should have an arbitrary name.[m
[31m-A cache with the same name can be used in several virtual servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Both cache types can be used simultaneously, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_cache builtin:1000 shared:SSL:10m;[m
[31m-[m
[31m-[m
[31m-but using only shared cache without the built-in cache should[m
[31m-be more efficient.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_ticket_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_ticket_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<file>> with the secret key used to encrypt[m
[31m-and decrypt TLS session tickets.[m
[31m-The directive is necessary if the same key has to be shared between[m
[31m-multiple servers.[m
[31m-By default, a randomly generated key is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several keys are specified, only the first key is[m
[31m-used to encrypt TLS session tickets.[m
[31m-This allows configuring key rotation, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_ticket_key current.key;[m
[31m-    ssl_session_ticket_key previous.key;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<file>> must contain 48 bytes of random data and can[m
[31m-be created using the following command:[m
[31m-[m
[31m-    [m
[31m-    openssl rand 48 > ticket.key[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_tickets[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_tickets I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables session resumption through[m
[31m-L<TLS session tickets|http://tools.ietf.org/html/rfc5077>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a time during which a client may reuse the[m
[31m-session parameters stored in a cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_stapling[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_stapling I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables[m
[31m-L<stapling[m
[31m-of OCSP responses|http://tools.ietf.org/html/rfc4366#section-3.6> by the server.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    ssl_stapling on;[m
[31m-    resolver 192.0.2.1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the OCSP stapling to work, the certificate of the server certificate[m
[31m-issuer should be known.[m
[31m-If the L</ssl_certificate> file does[m
[31m-not contain intermediate certificates,[m
[31m-the certificate of the server certificate issuer should be[m
[31m-present in the[m
[31m-L</ssl_trusted_certificate> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For a resolution of the OCSP responder hostname,[m
[31m-the L<ngx_http_core_module> directive[m
[31m-should also be specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_stapling_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_stapling_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When set, the stapled OCSP response will be taken from the[m
[31m-specified I<C<file>> instead of querying[m
[31m-the OCSP responder specified in the server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The file should be in the DER format as produced by the[m
[31m-“C<openssl ocsp>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_stapling_responder[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_stapling_responder I<I<C<url>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Overrides the URL of the OCSP responder specified in the[m
[31m-“L<Authority[m
[31m-Information Access|http://tools.ietf.org/html/rfc5280#section-4.2.2.1>” certificate extension.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Only “C<http:E<sol>E<sol>>” OCSP responders are supported:[m
[31m-[m
[31m-    [m
[31m-    ssl_stapling_responder http://ocsp.example.com/;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_stapling_verify[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_stapling_verify I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables verification of OCSP responses by the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For verification to work, the certificate of the server certificate[m
[31m-issuer, the root certificate, and all intermediate certificates[m
[31m-should be configured as trusted using the[m
[31m-L</ssl_trusted_certificate> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify client certificates and[m
[31m-OCSP responses if L</ssl_stapling> is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In contrast to the certificate set by L</ssl_client_certificate>,[m
[31m-the list of these certificates will not be sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_verify_client[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_verify_client I<[m
[31m-    C<on> E<verbar> C<off> E<verbar>[m
[31m-    C<optional> E<verbar> C<optional_no_ca>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables verification of client certificates.[m
[31m-The verification result is stored in the[m
[31m-C<$ssl_client_verify> variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<optional> parameter (0.8.7+) requests the client[m
[31m-certificate and verifies it if the certificate is present.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<optional_no_ca> parameter (1.3.8, 1.2.5)[m
[31m-requests the client[m
[31m-certificate but does not require it to be signed by a trusted CA certificate.[m
[31m-This is intended for the use in cases when a service that is external to nginx[m
[31m-performs the actual certificate verification.[m
[31m-The contents of the certificate is accessible through the[m
[31m-C<$ssl_client_cert> variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the client certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Error Processing[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssl_module> module supports several[m
[31m-non-standard error codes that can be used for redirects using the[m
[31m-L<ngx_http_core_module> directive:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<495>[m
[31m-an error has occurred during the client certificate verification;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<496>[m
[31m-a client has not presented the required certificate;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<497>[m
[31m-a regular request has been sent to the HTTPS port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The redirection happens after the request is fully parsed and[m
[31m-the variables, such as C<$request_uri>,[m
[31m-C<$uri>, C<$args> and others, are available.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_ssl_module> module supports[m
[31m-several embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_cipher>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the string of ciphers used[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_cert>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client certificate in the PEM format[m
[31m-for an established SSL connection, with each line except the first[m
[31m-prepended with the tab character;[m
[31m-this is intended for the use in the[m
[31m-L<ngx_http_proxy_module> directive;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_fingerprint>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the SHA1 fingerprint of the client certificate[m
[31m-for an established SSL connection (1.7.1);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_raw_cert>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the client certificate in the PEM format[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_serial>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the serial number of the client certificate[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_s_dn>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the “subject DN” string of the client certificate[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_i_dn>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the “issuer DN” string of the client certificate[m
[31m-for an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_client_verify>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the result of client certificate verification:[m
[31m-“C<SUCCESS>”, “C<FAILED>”, and[m
[31m-“C<NONE>” if a certificate was not present;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_protocol>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the protocol of an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_server_name>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the server name requested through[m
[31m-L<SNI|http://en.wikipedia.org/wiki/Server_Name_Indication>[m
[31m-(1.7.0);[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_session_id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns the session identifier of an established SSL connection;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$ssl_session_reused>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-returns “C<r>” if an SSL session was reused,[m
[31m-or “C<.>” otherwise (1.5.11).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_status_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_status_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 1924e3a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_status_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1598 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_status_module - Module ngx_http_status_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_status_module> module provides[m
[31m-access to various status information.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        upstream <emphasis>backend</emphasis> {[m
[31m-            <emphasis>zone</emphasis> http_backend 64k;[m
[31m-    [m
[31m-            server backend1.example.com weight=5;[m
[31m-            server backend2.example.com;[m
[31m-        }[m
[31m-    [m
[31m-        proxy_cache_path /data/nginx/cache_backend keys_zone=<emphasis>cache_backend</emphasis>:10m;[m
[31m-    [m
[31m-        server {[m
[31m-            server_name backend.example.com;[m
[31m-    [m
[31m-            location / {[m
[31m-                proxy_pass  http://backend;[m
[31m-                proxy_cache cache_backend;[m
[31m-    [m
[31m-                health_check;[m
[31m-            }[m
[31m-    [m
[31m-            <emphasis>status_zone server_backend;</emphasis>[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 127.0.0.1;[m
[31m-    [m
[31m-            location /upstream_conf {[m
[31m-                upstream_conf;[m
[31m-            }[m
[31m-    [m
[31m-            location /status {[m
[31m-                status;[m
[31m-            }[m
[31m-    [m
[31m-            location = /status.html {[m
[31m-            }[m
[31m-        }[m
[31m-    }[m
[31m-    [m
[31m-    stream {[m
[31m-        upstream <emphasis>backend</emphasis> {[m
[31m-            <emphasis>zone</emphasis> stream_backend 64k;[m
[31m-    [m
[31m-            server backend1.example.com:12345 weight=5;[m
[31m-            server backend2.example.com:12345;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen      127.0.0.1:12345;[m
[31m-            proxy_pass  backend;[m
[31m-            <emphasis>status_zone server_backend;</emphasis>[m
[31m-            health_check;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Examples of status requests with this configuration:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/status[m
[31m-    http://127.0.0.1/status/nginx_version[m
[31m-    http://127.0.0.1/status/caches/cache_backend[m
[31m-    http://127.0.0.1/status/upstreams[m
[31m-    http://127.0.0.1/status/upstreams/backend[m
[31m-    http://127.0.0.1/status/upstreams/backend/peers/1[m
[31m-    http://127.0.0.1/status/upstreams/backend/peers/1/weight[m
[31m-    http://127.0.0.1/status/stream[m
[31m-    http://127.0.0.1/status/stream/upstreams[m
[31m-    http://127.0.0.1/status/stream/upstreams/backend[m
[31m-    http://127.0.0.1/status/stream/upstreams/backend/peers/1[m
[31m-    http://127.0.0.1/status/stream/upstreams/backend/peers/1/weight[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The simple monitoring page is shipped with this distribution,[m
[31m-accessible as “C<E<sol>status.html>” in the default configuration.[m
[31m-It requires the locations “C<E<sol>status>” and[m
[31m-“C<E<sol>status.html>” to be configured as shown above.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 status[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The status information will be accessible from the surrounding location.[m
[31m-Access to this location should be[m
[31m-L<limited|ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 status_format[m
[31m-[m
[31m-[m
[31m-B<syntax:> status_format I<C<json>>[m
[31m-[m
[31m-[m
[31m-B<syntax:> status_format I<C<jsonp> [I<C<callback>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<json>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, status information is output in the JSON format.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Alternatively, data may be output as JSONP.[m
[31m-The I<C<callback>> parameter specifies the name of a callback function.[m
[31m-The value can contain variables.[m
[31m-If parameter is omitted, or the computed value is an empty string,[m
[31m-then “C<ngx_status_jsonp_callback>” is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 status_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> status_zone I<I<C<zone>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables collection of virtual[m
[31m-L<http|ngx_http_core_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_core_module>[m
[31m-(1.7.11) server status information in the specified I<C<zone>>.[m
[31m-Several servers may share the same zone.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Data[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following status information is provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<version>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Version of the provided data set.[m
[31m-The current version is 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<nginx_version>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Version of nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<address>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The address of the server that accepted status request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<generation>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of configuration[m
[31m-L<reloads|control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<load_timestamp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Time of the last reload of configuration, in milliseconds since Epoch.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<timestamp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Current time in milliseconds since Epoch.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<pid>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The ID of the worker process that handled status request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<processes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<respawned>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of abnormally terminated and respawned[m
[31m-child processes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<connections>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<accepted>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of accepted client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<dropped>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of dropped client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<active>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of active client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<idle>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of idle client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<ssl>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<handshakes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of successful SSL handshakes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<handshakes_failed>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of failed SSL handshakes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<session_reuses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of session reuses during SSL handshake.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<total>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of client requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<current>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of client requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server_zones>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each L</status_zone>:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<processing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of[m
[31m-client requests that are currently being processed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-client requests received from clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<total>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-responses sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<1xx>,[m
[31m-C<2xx>,[m
[31m-C<3xx>,[m
[31m-C<4xx>,[m
[31m-C<5xx>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of responses with status codes 1xx, 2xx, 3xx, 4xx, and 5xx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<discarded>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of requests completed without sending a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<received>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes received from clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<upstreams>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each[m
[31m-L<dynamically[m
[31m-configurable|ngx_http_upstream_module>[m
[31m-L<group|ngx_http_upstream_module>,[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<peers>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each[m
[31m-L<ngx_http_upstream_module>,[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The ID of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-An[m
[31m-L<address|ngx_http_upstream_module>[m
[31m-of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<backup>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A boolean value indicating whether the server is a[m
[31m-L<ngx_http_upstream_module>[m
[31m-server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<weight>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Weight|ngx_http_upstream_module>[m
[31m-of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<state>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Current state, which may be one of[m
[31m-“C<up>”,[m
[31m-“C<draining>”,[m
[31m-“C<down>”,[m
[31m-“C<unavail>”,[m
[31m-or[m
[31m-“C<unhealthy>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<active>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of active connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<max_conns>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The L<ngx_http_upstream_module> limit[m
[31m-for the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-client requests forwarded to this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<total>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-responses obtained from this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<1xx>,[m
[31m-C<2xx>,[m
[31m-C<3xx>,[m
[31m-C<4xx>,[m
[31m-C<5xx>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of responses with status codes 1xx, 2xx, 3xx, 4xx, and 5xx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes sent to this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<received>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes received from this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<fails>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-unsuccessful attempts to communicate with the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<unavail>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-How many times[m
[31m-the server became unavailable for client requests[m
[31m-(state “C<unavail>”)[m
[31m-due to the number of unsuccessful attempts reaching the[m
[31m-L<ngx_http_upstream_module>[m
[31m-threshold.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<health_checks>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<checks>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-L<health check|ngx_http_upstream_module>[m
[31m-requests made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<fails>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of failed health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<unhealthy>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-How many times[m
[31m-the server became unhealthy (state “C<unhealthy>”).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<last_passed>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Boolean indicating[m
[31m-if the last health check request was successful and passed[m
[31m-L<tests|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<downtime>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Total time[m
[31m-the server was in the “C<unavail>”[m
[31m-and “C<unhealthy>” states.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<downstart>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The time (in milliseconds since Epoch)[m
[31m-when the server became[m
[31m-“C<unavail>”[m
[31m-or “C<unhealthy>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<selected>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The time (in milliseconds since Epoch)[m
[31m-when the server was last selected to process a request (1.7.5).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to get the[m
[31m-L<response[m
[31m-header|ngx_http_upstream_module> from the server (1.7.10).[m
[31m-The field is available when using the[m
[31m-L<ngx_http_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<response_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to get the[m
[31m-L<full[m
[31m-response|ngx_http_upstream_module> from the server (1.7.10).[m
[31m-The field is available when using the[m
[31m-L<ngx_http_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<keepalive>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of[m
[31m-idle L<ngx_http_upstream_module> connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<queue>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the requests L<ngx_http_upstream_module>,[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of requests in the queue.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<max_size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The maximum number of requests that can be in the queue at the same time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<overflows>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of requests rejected due to the queue overflow.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<caches>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each cache (configured by[m
[31m-L<ngx_http_proxy_module> and the likes):[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current size of the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<max_size>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The limit on the maximum size of the cache specified in the configuration.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<cold>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A boolean value indicating whether the “cache loader” process is still loading[m
[31m-data from disk into the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<hit>,[m
[31m-    C<stale>,[m
[31m-    C<updating>,[m
[31m-    C<revalidated>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of responses read from the cache (hits, or stale responses[m
[31m-due to L<ngx_http_proxy_module>[m
[31m-and the likes).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<bytes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes read from the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-    C<miss>,[m
[31m-    C<expired>,[m
[31m-    C<bypass>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of responses not taken from the cache (misses, expires, or[m
[31m-bypasses due to[m
[31m-L<ngx_http_proxy_module>[m
[31m-and the likes).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<bytes>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes read from the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<responses_written>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of responses written to the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<bytes_written>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes written to the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<server_zones>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each L</status_zone>:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<processing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of[m
[31m-client connections that are currently being processed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<connections>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-connections accepted from clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<received>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes received from clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<upstreams>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each[m
[31m-L<dynamically[m
[31m-configurable|ngx_stream_upstream_module>[m
[31m-L<group|ngx_stream_upstream_module>,[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<peers>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For each[m
[31m-L<ngx_stream_upstream_module>[m
[31m-the following data are provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<id>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The ID of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-An[m
[31m-L<address|ngx_stream_upstream_module>[m
[31m-of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<backup>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A boolean value indicating whether the server is a[m
[31m-L<ngx_stream_upstream_module>[m
[31m-server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<weight>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Weight|ngx_stream_upstream_module>[m
[31m-of the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<state>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Current state, which may be one of[m
[31m-“C<up>”,[m
[31m-“C<down>”,[m
[31m-“C<unavail>”,[m
[31m-or[m
[31m-“C<unhealthy>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<active>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<connections>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-client connections forwarded to this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<connect_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to connect to the upstream server.[m
[31m-The field is available when using the[m
[31m-L<ngx_stream_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<first_byte_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to receive the first byte of data.[m
[31m-The field is available when using the[m
[31m-L<ngx_stream_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<response_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The average time to receive the last byte of data.[m
[31m-The field is available when using the[m
[31m-L<ngx_stream_upstream_module>[m
[31m-load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<sent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes sent to this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<received>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of bytes received from this server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<fails>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-unsuccessful attempts to communicate with the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<unavail>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-How many times[m
[31m-the server became unavailable for client connections[m
[31m-(state “C<unavail>”)[m
[31m-due to the number of unsuccessful attempts reaching the[m
[31m-L<ngx_stream_upstream_module>[m
[31m-threshold.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<health_checks>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<checks>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of[m
[31m-L<health check|ngx_stream_upstream_module>[m
[31m-requests made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<fails>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The number of failed health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<unhealthy>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-How many times[m
[31m-the server became unhealthy (state “C<unhealthy>”).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<last_passed>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Boolean indicating[m
[31m-if the last health check request was successful and passed[m
[31m-L<tests|ngx_stream_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<downtime>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Total time[m
[31m-the server was in the “C<unavail>”[m
[31m-and “C<unhealthy>” states.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<downstart>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The time (in milliseconds since Epoch)[m
[31m-when the server became[m
[31m-“C<unavail>”[m
[31m-or “C<unhealthy>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<selected>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The time (in milliseconds since Epoch)[m
[31m-when the server was last selected to process a connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L</ssl> status data[m
[31m-were added in L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</discarded> field in[m
[31m-L</server_zones>[m
[31m-was added in L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L</queue> status data[m
[31m-were added in L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</pid> field[m
[31m-was added in L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The list of servers in L</upstreams>[m
[31m-was moved into L</peers> in[m
[31m-L</version> 6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<keepalive> field of an upstream server[m
[31m-was removed in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The stream status data[m
[31m-were added in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</generation> field[m
[31m-was added in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</respawned> field in[m
[31m-L</processes>[m
[31m-was added in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</header_time> and L</response_time> fields in[m
[31m-L</upstreams>[m
[31m-were added in L</version> 5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</selected> field in[m
[31m-L</upstreams>[m
[31m-was added in L</version> 4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The draining state in[m
[31m-L</upstreams>[m
[31m-was added in L</version> 4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The[m
[31m-L</id> and L</max_conns> fields in[m
[31m-L</upstreams>[m
[31m-were added in L</version> 3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<revalidated> field in[m
[31m-L</caches>[m
[31m-was added in L</version> 3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The L</server_zones>, L</caches>,[m
[31m-and L</load_timestamp> status data[m
[31m-were added in L</version> 2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_stub_status_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_stub_status_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 8ada5a1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_stub_status_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,230 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_stub_status_module - Module ngx_http_stub_status_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_stub_status_module> module provides[m
[31m-access to basic status information.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_stub_status_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location /basic_status {[m
[31m-        stub_status;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This configuration creates a simple web page[m
[31m-with basic status data which may look like as follows:[m
[31m-[m
[31m-    [m
[31m-    Active connections: 291 [m
[31m-    server accepts handled requests[m
[31m-     16630948 16630948 31070465 [m
[31m-    Reading: 6 Writing: 179 Waiting: 106 [m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 stub_status[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The basic status information will be accessible from the surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-In versions prior to 1.7.5,[m
[31m-the directive syntax required an arbitrary argument, for example,[m
[31m-“C<stub_status on>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Data[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following status information is provided:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<Active connections>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of active client connections[m
[31m-including C<Waiting> connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<accepts>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of accepted client connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<handled>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of handled connections.[m
[31m-Generally, the parameter value is the same as C<accepts>[m
[31m-unless some resource limits have been reached[m
[31m-(for example, the[m
[31m-L<ngx_core_module> limit).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<requests>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The total number of client requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<Reading>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of connections where nginx is reading the request header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<Writing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of connections[m
[31m-where nginx is writing the response back to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<Waiting>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current number of idle client connections waiting for a request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_stub_status_module> module[m
[31m-supports the following embedded variables (1.3.14):[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connections_active>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as the C<Active connections> value;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connections_reading>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as the C<Reading> value;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connections_writing>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as the C<Writing> value;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$connections_waiting>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-same as the C<Waiting> value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_sub_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_sub_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 4f240d1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_sub_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,180 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_sub_module - Module ngx_http_sub_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_sub_module> module is a filter[m
[31m-that modifies a response by replacing one specified string by another.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_sub_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        sub_filter '<a href="http://127.0.0.1:8080/'  '<a href="https://$host/';[m
[31m-        sub_filter '<img src="http://127.0.0.1:8080/' '<img src="https://$host/';[m
[31m-        sub_filter_once on;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 sub_filter[m
[31m-[m
[31m-[m
[31m-B<syntax:> sub_filter I<I<C<string>> I<C<replacement>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a string to replace and a replacement string.[m
[31m-The string to replace is matched ignoring the case.[m
[31m-The string to replace (1.9.4) and replacement string can contain variables.[m
[31m-Several C<sub_filter> directives[m
[31m-can be specified on one configuration level (1.9.4).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sub_filter_last_modified[m
[31m-[m
[31m-[m
[31m-B<syntax:> sub_filter_last_modified I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows preserving the C<Last-Modified> header field[m
[31m-from the original response during replacement[m
[31m-to facilitate response caching.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the header field is removed as contents of the response[m
[31m-are modified during processing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sub_filter_once[m
[31m-[m
[31m-[m
[31m-B<syntax:> sub_filter_once I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether to look for each string to replace[m
[31m-once or repeatedly.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sub_filter_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> sub_filter_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables string replacement in responses with the specified MIME types[m
[31m-in addition to “C<textE<sol>html>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_upstream_conf_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_upstream_conf_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 63ebbd1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_upstream_conf_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,494 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_upstream_conf_module - Module ngx_http_upstream_conf_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_upstream_conf_module> module[m
[31m-allows configuring upstream server groups on-the-fly[m
[31m-via a simple HTTP interface without the need of restarting nginx.[m
[31m-The[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-server group must reside in the shared memory.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        zone upstream_backend 64k;[m
[31m-    [m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        location /upstream_conf {[m
[31m-            <emphasis>upstream_conf</emphasis>;[m
[31m-            allow 127.0.0.1;[m
[31m-            deny all;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 upstream_conf[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Turns on the HTTP interface of upstream configuration in the surrounding[m
[31m-location.[m
[31m-Access to this location should be[m
[31m-L<limited|ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configuration commands can be used to:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-view the group configuration;[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-view, modify, or remove a server;[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-add a new server.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Since addresses in a group are not required to be unique, specific[m
[31m-servers in a group are referenced by their IDs.[m
[31m-IDs are assigned automatically and shown when adding a new server[m
[31m-or viewing the group configuration.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A configuration command consists of parameters passed as request arguments,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following parameters are supported:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<stream=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Selects a[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server group.[m
[31m-Without this parameter, selects an[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-upstream server group.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<upstream=>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Selects a group to work with.[m
[31m-This parameter is mandatory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<id=>I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Selects a server for viewing, modifying, or removing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<remove=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Removes a server from the group.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<add=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds a new server to the group.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backup=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Required to add a backup server.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.7.2, C<backup=>[m
[31m-was also required to view, modify, or remove existing backup servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<server=>I<C<address>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<address>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-When adding a server, it is possible to specify it as a domain name.[m
[31m-In this case, changes of the IP addresses that correspond to a domain name[m
[31m-will be monitored and automatically applied to the upstream[m
[31m-configuration without the need of restarting nginx (1.7.2).[m
[31m-This requires the “C<resolver>” directive in the[m
[31m-L<http|ngx_http_core_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_core_module>[m
[31m-block.[m
[31m-See also the “C<resolve>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<service=>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<service>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server (1.9.13).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<weight=>I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<weight>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_conns=>I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<max_conns>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_fails=>I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<max_fails>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fail_timeout=>I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<fail_timeout>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<slow_start=>I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<slow_start>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<down=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<down>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<drain=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Puts the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-upstream server in the “draining” mode (1.7.5).[m
[31m-In this mode, only requests of the[m
[31m-L<bound|ngx_http_upstream_module> to the server[m
[31m-will be proxied to it.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<up=>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The opposite of the “C<down>” parameter[m
[31m-of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<route=>I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Same as the “C<route>” parameter of the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-upstream server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first three parameters select an object.[m
[31m-This can be either the whole http or stream upstream server group,[m
[31m-or a specific server.[m
[31m-Without other parameters, the configuration of the selected[m
[31m-group or server is shown.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, to view the configuration of the whole group, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend[m
[31m-[m
[31m-[m
[31m-[m
[31m-To view the configuration of a specific server, also specify its ID:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend&id=42[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To add a new server,[m
[31m-specify its address in the “C<server=>” parameter.[m
[31m-Without other parameters specified, a server will be added with other[m
[31m-parameters set to their default values (see the[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-or[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-“C<server>” directive).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, to add a new primary server, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?add=&upstream=backend&server=127.0.0.1:8080[m
[31m-[m
[31m-[m
[31m-[m
[31m-To add a new backup server, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?add=&upstream=backend&backup=&server=127.0.0.1:8080[m
[31m-[m
[31m-[m
[31m-[m
[31m-To add a new primary server,[m
[31m-set its parameters to non-default values[m
[31m-and mark it as “C<down>”, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?add=&upstream=backend&server=127.0.0.1:8080&weight=2&down=[m
[31m-[m
[31m-[m
[31m-[m
[31m-To remove a server, specify its ID:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?remove=&upstream=backend&id=42[m
[31m-[m
[31m-[m
[31m-[m
[31m-To mark an existing server as “C<down>”, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend&id=42&down=[m
[31m-[m
[31m-[m
[31m-[m
[31m-To modify the address of an existing server, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend&id=42&server=192.0.2.3:8123[m
[31m-[m
[31m-[m
[31m-[m
[31m-To modify other parameters of an existing server, send:[m
[31m-[m
[31m-    [m
[31m-    http://127.0.0.1/upstream_conf?upstream=backend&id=42&max_fails=3&weight=4[m
[31m-[m
[31m-[m
[31m-[m
[31m-The above examples are for an[m
[31m-L<http|ngx_http_upstream_module>[m
[31m-upstream server group.[m
[31m-Similar examples for a[m
[31m-L<stream|ngx_stream_upstream_module>[m
[31m-upstream server group require the “C<stream=>” parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_upstream_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_upstream_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 0f92e08..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_upstream_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,1940 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_upstream_module - Module ngx_http_upstream_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_upstream_module> module[m
[31m-is used to define groups of servers that can be referenced[m
[31m-by the L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-L<ngx_http_scgi_module>, and[m
[31m-L<ngx_http_memcached_module> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    upstream <emphasis>backend</emphasis> {[m
[31m-        server backend1.example.com       weight=5;[m
[31m-        server backend2.example.com:8080;[m
[31m-        server unix:/tmp/backend3;[m
[31m-    [m
[31m-        server backup1.example.com:8080   backup;[m
[31m-        server backup2.example.com:8080   backup;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            proxy_pass http://<emphasis>backend</emphasis>;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Dynamically configurable group,[m
[31m-available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-    [m
[31m-    resolver 10.0.0.1;[m
[31m-    [m
[31m-    upstream <emphasis>dynamic</emphasis> {[m
[31m-        zone upstream_dynamic 64k;[m
[31m-    [m
[31m-        server backend1.example.com      weight=5;[m
[31m-        server backend2.example.com:8080 fail_timeout=5s slow_start=30s;[m
[31m-        server 192.0.2.1                 max_fails=3;[m
[31m-        server backend3.example.com      resolve;[m
[31m-        server backend4.example.com      service=http resolve;[m
[31m-    [m
[31m-        server backup1.example.com:8080  backup;[m
[31m-        server backup2.example.com:8080  backup;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        location / {[m
[31m-            proxy_pass http://<emphasis>dynamic</emphasis>;[m
[31m-            health_check;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> upstream I<I<C<name>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a group of servers.[m
[31m-Servers can listen on different ports.[m
[31m-In addition, servers listening on TCP and UNIX-domain sockets[m
[31m-can be mixed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        server backend1.example.com weight=5;[m
[31m-        server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;[m
[31m-        server unix:/tmp/backend3;[m
[31m-    [m
[31m-        server backup1.example.com  backup;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, requests are distributed between the servers using a[m
[31m-weighted round-robin balancing method.[m
[31m-In the above example, each 7 requests will be distributed as follows:[m
[31m-5 requests go to C<backend1.example.com>[m
[31m-and one request to each of the second and third servers.[m
[31m-If an error occurs during communication with a server, the request will[m
[31m-be passed to the next server, and so on until all of the functioning[m
[31m-servers will be tried.[m
[31m-If a successful response could not be obtained from any of the servers,[m
[31m-the client will receive the result of the communication with the last server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-B<syntax:> server I<I<C<address>> [I<C<parameters>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<address>> and other I<C<parameters>>[m
[31m-of a server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-with an optional port, or as a UNIX-domain socket path[m
[31m-specified after the “C<unix:>” prefix.[m
[31m-If a port is not specified, the port 80 is used.[m
[31m-A domain name that resolves to several IP addresses defines[m
[31m-multiple servers at once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following parameters can be defined:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<weight>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the weight of the server, by default, 1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_fails>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of unsuccessful attempts to communicate with the server[m
[31m-that should happen in the duration set by the C<fail_timeout>[m
[31m-parameter to consider the server unavailable for a duration also set by the[m
[31m-C<fail_timeout> parameter.[m
[31m-By default, the number of unsuccessful attempts is set to 1.[m
[31m-The zero value disables the accounting of attempts.[m
[31m-What is considered an unsuccessful attempt is defined by the[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>,[m
[31m-L<ngx_http_scgi_module>, and[m
[31m-L<ngx_http_memcached_module>[m
[31m-directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fail_timeout>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the time during which the specified number of unsuccessful attempts to[m
[31m-communicate with the server should happen to consider the server unavailable;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and the period of time the server will be considered unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-By default, the parameter is set to 10 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backup>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-marks the server as a backup server.[m
[31m-It will be passed requests when the primary servers are unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<down>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-marks the server as permanently unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_conns>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-limits the maximum I<C<number>> of simultaneous active[m
[31m-connections to the proxied server (1.5.9).[m
[31m-Default value is zero, meaning there is no limit.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-When L</keepalive> connections and multiple[m
[31m-L<workers|ngx_core_module>[m
[31m-are enabled,[m
[31m-the total number of connections to the proxied server[m
[31m-may exceed the C<max_conns> value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<resolve>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-monitors changes of the IP addresses[m
[31m-that correspond to a domain name of the server,[m
[31m-and automatically modifies the upstream configuration[m
[31m-without the need of restarting nginx (1.5.12).[m
[31m-The server group must reside in the shared memory.[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-the L<ngx_http_core_module> directive[m
[31m-must be specified in the[m
[31m-L<ngx_http_core_module> block.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        resolver 10.0.0.1;[m
[31m-    [m
[31m-        upstream u {[m
[31m-            zone ...;[m
[31m-            ...[m
[31m-            server example.com resolve;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<route>=I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the server route name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<service>=I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables resolving of DNS[m
[31m-L<SRV|https://tools.ietf.org/html/rfc2782>[m
[31m-records and sets the service I<C<name>> (1.9.13).[m
[31m-In order for this parameter to work, it is necessary to specify[m
[31m-the L</resolve> parameter for the server[m
[31m-and specify a hostname without a port number.[m
[31m-[m
[31m-[m
[31m-If the service name does not contain a dot (“C<.>”), then[m
[31m-the L<RFC|https://tools.ietf.org/html/rfc2782>-compliant name[m
[31m-is constructed[m
[31m-and the TCP protocol is added to the service prefix.[m
[31m-For example, to look up the[m
[31m-C<_http._tcp.backend.example.com> SRV record,[m
[31m-it is necessary to specify the directive:[m
[31m-[m
[31m-    [m
[31m-    server backend.example.com service=http resolve;[m
[31m-[m
[31m-[m
[31m-If the service name contains one or more dots, then the name is constructed[m
[31m-by joining the service prefix and the server name.[m
[31m-For example, to look up the C<_http._tcp.backend.example.com>[m
[31m-and C<server1.backend.example.com> SRV records,[m
[31m-it is necessary to specify the directives:[m
[31m-[m
[31m-    [m
[31m-    server backend.example.com service=_http._tcp resolve;[m
[31m-    server example.com service=server1.backend resolve;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Highest-priority SRV records[m
[31m-(records with the same lowest-number priority value)[m
[31m-are resolved as primary servers,[m
[31m-the rest of SRV records are resolved as backup servers.[m
[31m-If the L</backup> parameter is specified for the server,[m
[31m-high-priority SRV records are resolved as backup servers,[m
[31m-the rest of SRV records are ignored.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<slow_start>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the I<C<time>> during which the server will recover its weight[m
[31m-from zero to a nominal value, when unhealthy server becomes[m
[31m-healthy,[m
[31m-or when the server becomes available after a period of time[m
[31m-it was considered unavailable.[m
[31m-Default value is zero, i.e. slow start is disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-If there is only a single server in a group, C<max_fails>,[m
[31m-C<fail_timeout> and C<slow_start> parameters[m
[31m-are ignored, and such a server will never be considered unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> zone I<I<C<name>> [I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<name>> and I<C<size>> of the shared[m
[31m-memory zone that keeps the group’s configuration and run-time state that are[m
[31m-shared between worker processes.[m
[31m-Several groups may share the same zone.[m
[31m-In this case, it is enough to specify the I<C<size>> only once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-as part of our commercial subscription,[m
[31m-such groups allow changing the group membership[m
[31m-or modifying the settings of a particular server[m
[31m-without the need of restarting nginx.[m
[31m-The configuration is accessible via a special location[m
[31m-handled by[m
[31m-L<ngx_http_upstream_conf_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 state[m
[31m-[m
[31m-[m
[31m-B<syntax:> state I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> that keeps the state[m
[31m-of the dynamically configurable group.[m
[31m-The state is currently limited to the list of servers with their parameters.[m
[31m-The file is read when parsing the configuration and is updated each time[m
[31m-the upstream configuration is[m
[31m-L<changed|ngx_http_upstream_conf_module>.[m
[31m-Changing the file content directly should be avoided.[m
[31m-The directive cannot be used[m
[31m-along with the L</server> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Changes made during[m
[31m-L<configuration reload|control>[m
[31m-or L<binary upgrade|control>[m
[31m-can be lost.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hash[m
[31m-[m
[31m-[m
[31m-B<syntax:> hash I<I<C<key>> [C<consistent>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a load balancing method for a server group[m
[31m-where the client-server mapping is based on the hashed I<C<key>> value.[m
[31m-The I<C<key>> can contain text, variables, and their combinations.[m
[31m-Note that adding or removing a server from the group[m
[31m-may result in remapping most of the keys to different servers.[m
[31m-The method is compatible with the[m
[31m-L<Cache::Memcached|http://search.cpan.org/perldoc?Cache%3A%3AMemcached>[m
[31m-Perl library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<consistent> parameter is specified[m
[31m-the L<ketama|http://www.last.fm/user/RJ/journal/2007/04/10/392555/>[m
[31m-consistent hashing method will be used instead.[m
[31m-The method ensures that only a few keys[m
[31m-will be remapped to different servers[m
[31m-when a server is added to or removed from the group.[m
[31m-This helps to achieve a higher cache hit ratio for caching servers.[m
[31m-The method is compatible with the[m
[31m-L<Cache::Memcached::Fast|http://search.cpan.org/perldoc?Cache%3A%3AMemcached%3A%3AFast>[m
[31m-Perl library with the I<C<ketama_points>> parameter set to 160.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ip_hash[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a group should use a load balancing method where requests[m
[31m-are distributed between servers based on client IP addresses.[m
[31m-The first three octets of the client IPv4 address, or the entire IPv6 address,[m
[31m-are used as a hashing key.[m
[31m-The method ensures that requests from the same client will always be[m
[31m-passed to the same server except when this server is unavailable.[m
[31m-In the latter case client requests will be passed to another server.[m
[31m-Most probably, it will always be the same server as well.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-IPv6 addresses are supported starting from versions 1.3.2 and 1.2.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If one of the servers needs to be temporarily removed, it should[m
[31m-be marked with the C<down> parameter in[m
[31m-order to preserve the current hashing of client IP addresses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        ip_hash;[m
[31m-    [m
[31m-        server backend1.example.com;[m
[31m-        server backend2.example.com;[m
[31m-        server backend3.example.com <emphasis>down</emphasis>;[m
[31m-        server backend4.example.com;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Until versions 1.3.1 and 1.2.2, it was not possible to specify a weight for[m
[31m-servers using the C<ip_hash> load balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 keepalive[m
[31m-[m
[31m-[m
[31m-B<syntax:> keepalive I<I<C<connections>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Activates the cache for connections to upstream servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<connections>> parameter sets the maximum number of[m
[31m-idle keepalive connections to upstream servers that are preserved in[m
[31m-the cache of each worker process.[m
[31m-When this number is exceeded, the least recently used connections[m
[31m-are closed.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-It should be particularly noted that the C<keepalive> directive[m
[31m-does not limit the total number of connections to upstream servers[m
[31m-that an nginx worker process can open.[m
[31m-The I<C<connections>> parameter should be set to a number small enough[m
[31m-to let upstream servers process new incoming connections as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration of memcached upstream with keepalive connections:[m
[31m-[m
[31m-    [m
[31m-    upstream memcached_backend {[m
[31m-        server 127.0.0.1:11211;[m
[31m-        server 10.0.0.2:11211;[m
[31m-    [m
[31m-        keepalive 32;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-    [m
[31m-        location /memcached/ {[m
[31m-            set $memcached_key $uri;[m
[31m-            memcached_pass memcached_backend;[m
[31m-        }[m
[31m-    [m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For HTTP, the L<ngx_http_proxy_module>[m
[31m-directive should be set to “C<1.1>”[m
[31m-and the C<Connection> header field should be cleared:[m
[31m-[m
[31m-    [m
[31m-    upstream http_backend {[m
[31m-        server 127.0.0.1:8080;[m
[31m-    [m
[31m-        keepalive 16;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-    [m
[31m-        location /http/ {[m
[31m-            proxy_pass http://http_backend;[m
[31m-            proxy_http_version 1.1;[m
[31m-            proxy_set_header Connection "";[m
[31m-            ...[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Alternatively, HTTPE<sol>1.0 persistent connections can be used by passing the[m
[31m-C<Connection: Keep-Alive> header field to an upstream server,[m
[31m-though this method is not recommended.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For FastCGI servers, it is required to set[m
[31m-L<ngx_http_fastcgi_module>[m
[31m-for keepalive connections to work:[m
[31m-[m
[31m-    [m
[31m-    upstream fastcgi_backend {[m
[31m-        server 127.0.0.1:9000;[m
[31m-    [m
[31m-        keepalive 8;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-    [m
[31m-        location /fastcgi/ {[m
[31m-            fastcgi_pass fastcgi_backend;[m
[31m-            fastcgi_keep_conn on;[m
[31m-            ...[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-When using load balancer methods other than the default[m
[31m-round-robin method, it is necessary to activate them before[m
[31m-the C<keepalive> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-SCGI and uwsgi protocols do not have a notion of keepalive connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ntlm[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows proxying requests with[m
[31m-L<NTLM[m
[31m-Authentication|https://en.wikipedia.org/wiki/Integrated_Windows_Authentication>.[m
[31m-The upstream connection is bound to the client connection[m
[31m-once the client sends a request with the C<Authorization>[m
[31m-header field value[m
[31m-starting with “C<Negotiate>” or “C<NTLM>”.[m
[31m-Further client requests will be proxied through the same upstream connection,[m
[31m-keeping the authentication context.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In order for NTLM authentication to work,[m
[31m-it is necessary to enable keepalive connections to upstream servers.[m
[31m-The L<ngx_http_proxy_module>[m
[31m-directive should be set to “C<1.1>”[m
[31m-and the C<Connection> header field should be cleared:[m
[31m-[m
[31m-    [m
[31m-    upstream http_backend {[m
[31m-        server 127.0.0.1:8080;[m
[31m-    [m
[31m-        ntlm;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-    [m
[31m-        location /http/ {[m
[31m-            proxy_pass http://http_backend;[m
[31m-            proxy_http_version 1.1;[m
[31m-            proxy_set_header Connection "";[m
[31m-            ...[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-When using load balancer methods other than the default[m
[31m-round-robin method, it is necessary to activate them before[m
[31m-the C<ntlm> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 least_conn[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.3.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.2.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a group should use a load balancing method where a request[m
[31m-is passed to the server with the least number of active connections,[m
[31m-taking into account weights of servers.[m
[31m-If there are several such servers, they are tried in turn using a[m
[31m-weighted round-robin balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 least_time[m
[31m-[m
[31m-[m
[31m-B<syntax:> least_time I<C<header> E<verbar> C<last_byte>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a group should use a load balancing method where a request[m
[31m-is passed to the server with the least average response time and[m
[31m-least number of active connections, taking into account weights of servers.[m
[31m-If there are several such servers, they are tried in turn using a[m
[31m-weighted round-robin balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<header> parameter is specified,[m
[31m-time to receive the[m
[31m-response header is used.[m
[31m-If the C<last_byte> parameter is specified,[m
[31m-time to receive the full response[m
[31m-is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 health_check[m
[31m-[m
[31m-[m
[31m-B<syntax:> health_check I<[I<C<parameters>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables periodic health checks of the servers in a[m
[31m-group referenced in the surrounding location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following optional parameters are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<interval>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the interval between two consecutive health checks,[m
[31m-by default, 5 seconds;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fails>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of consecutive failed health checks of a particular server[m
[31m-after which this server will be considered unhealthy,[m
[31m-by default, 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<passes>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of consecutive passed health checks of a particular server[m
[31m-after which the server will be considered healthy,[m
[31m-by default, 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<uri>=I<C<uri>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines the URI used in health check requests,[m
[31m-by default, “C<E<sol>>”;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<match>=I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies the C<match> block configuring the tests that a[m
[31m-response should pass in order for a health check to pass;[m
[31m-by default, the response should have status code 2xx or 3xx;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<port>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines the port used when connecting to a server[m
[31m-to perform a health check (1.9.7);[m
[31m-by default, equals the L</server> port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        proxy_pass http://backend;[m
[31m-        health_check;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-will send “C<E<sol>>” requests to each[m
[31m-server in the C<backend> group every five seconds.[m
[31m-If any communication error or timeout occurs, or a[m
[31m-proxied server responds with the status code other than[m
[31m-2xx or 3xx, the health check will fail, and the server will[m
[31m-be considered unhealthy.[m
[31m-Client requests are not passed to unhealthy servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Health checks can be configured to test the status code of a response,[m
[31m-presence of certain header fields and their values,[m
[31m-and the body contents.[m
[31m-Tests are configured separately using the L</match> directive[m
[31m-and referenced in the C<match> parameter.[m
[31m-For example:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        server {[m
[31m-        ...[m
[31m-            location / {[m
[31m-                proxy_pass http://backend;[m
[31m-                health_check match=welcome;[m
[31m-            }[m
[31m-        }[m
[31m-    [m
[31m-        match welcome {[m
[31m-            status 200;[m
[31m-            header Content-Type = text/html;[m
[31m-            body ~ "Welcome to nginx!";[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-This configuration tells that for a health check to pass, the response to a[m
[31m-health check request should succeed,[m
[31m-have status 200, content type “C<textE<sol>html>”,[m
[31m-and contain “C<Welcome to nginx!>” in the body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The server group must reside in the shared memory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several health checks are defined for the same group of servers,[m
[31m-a single failure of any check will make the corresponding server be[m
[31m-considered unhealthy.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Please note that most of the variables will have empty values[m
[31m-when used with health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 match[m
[31m-[m
[31m-[m
[31m-B<syntax:> match I<I<C<name>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the named test set used to verify responses to health check requests.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following items can be tested in a response:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<status 200;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is 200[m
[31m-[m
[31m-[m
[31m-=item C<status ! 500;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is not 500[m
[31m-[m
[31m-[m
[31m-=item C<status 200 204;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is 200 or 204[m
[31m-[m
[31m-[m
[31m-=item C<status ! 301 302;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is neither 301 nor 302[m
[31m-[m
[31m-[m
[31m-=item C<status 200-399;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is in the range from 200 to 399[m
[31m-[m
[31m-[m
[31m-=item C<status ! 400-599;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is not in the range from 400 to 599[m
[31m-[m
[31m-[m
[31m-=item C<status 301-303 307;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-status is either 301, 302, 303, or 307[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Content-Type = textE<sol>html;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Content-Type>[m
[31m-with value C<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Content-Type != textE<sol>html;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Content-Type>[m
[31m-with value other than C<textE<sol>html>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Connection ~ close;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Connection>[m
[31m-with value matching regular expression C<close>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Connection !~ close;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Connection>[m
[31m-with value not matching regular expression C<close>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<header Host;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-header contains C<Host>[m
[31m-[m
[31m-[m
[31m-=item C<header ! X-Accel-Redirect;>[m
[31m-[m
[31m-[m
[31m-[m
[31m-header lacks C<X-Accel-Redirect>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<body ~ "Welcome to nginx!";>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-body matches regular expression “C<Welcome to nginx!>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<body !~ "Welcome to nginx!";>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-body does not match regular expression “C<Welcome to nginx!>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several tests are specified,[m
[31m-the response matches only if it matches all tests.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Only the first 256k of the response body are examined.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Examples:[m
[31m-[m
[31m-    [m
[31m-    # status is 200, content type is "text/html",[m
[31m-    # and body contains "Welcome to nginx!"[m
[31m-    match welcome {[m
[31m-        status 200;[m
[31m-        header Content-Type = text/html;[m
[31m-        body ~ "Welcome to nginx!";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    # status is not one of 301, 302, 303, or 307, and header does not have "Refresh:"[m
[31m-    match not_redirect {[m
[31m-        status ! 301-303 307;[m
[31m-        header ! Refresh;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    # status ok and not in maintenance mode[m
[31m-    match server_ok {[m
[31m-        status 200-399;[m
[31m-        body !~ "maintenance mode";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 queue[m
[31m-[m
[31m-[m
[31m-B<syntax:> queue I<[m
[31m-I<C<number>>[m
[31m-[C<timeout>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If an upstream server cannot be selected immediately[m
[31m-while processing a request,[m
[31m-and there are the servers in the group that have reached the[m
[31m-L</max_conns> limit,[m
[31m-the request will be placed into the queue.[m
[31m-The directive specifies the maximum number of requests that can be in the queue[m
[31m-at the same time.[m
[31m-If the queue is filled up,[m
[31m-or the server to pass the request to cannot be selected within[m
[31m-the time period specified in the C<timeout> parameter,[m
[31m-the C<502> (C<Bad Gateway>)[m
[31m-error will be returned to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The default value of the C<timeout> parameter is 60 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sticky[m
[31m-[m
[31m-[m
[31m-B<syntax:> sticky I<[m
[31m-    C<cookie> I<C<name>>[m
[31m-    [C<expires=>I<C<time>>][m
[31m-    [C<domain=>I<C<domain>>][m
[31m-    [C<httponly>][m
[31m-    [C<secure>][m
[31m-    [C<path=>I<C<path>>]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> sticky I<[m
[31m-    C<route> I<C<$variable>> ...>[m
[31m-[m
[31m-[m
[31m-B<syntax:> sticky I<[m
[31m-    C<learn>[m
[31m-    C<create=>I<C<$variable>>[m
[31m-    C<lookup=>I<C<$variable>>[m
[31m-    C<zone=>I<C<name>>:I<C<size>>[m
[31m-    [C<timeout=>I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables session affinity, which causes requests from the same client to be[m
[31m-passed to the same server in a group of servers.[m
[31m-Three methods are available:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item C<cookie>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the C<cookie> method is used, information about the[m
[31m-designated server is passed in an HTTP cookie generated by nginx:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        server backend1.example.com;[m
[31m-        server backend2.example.com;[m
[31m-    [m
[31m-        sticky cookie srv_id expires=1h domain=.example.com path=/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A request that comes from a client not yet bound to a particular server[m
[31m-is passed to the server selected by the configured balancing method.[m
[31m-Further requests with this cookie will be passed to the designated server.[m
[31m-If the designated server cannot process a request, the new server is[m
[31m-selected as if the client has not been bound yet.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The first parameter sets the name of the cookie to be set or inspected.[m
[31m-Additional parameters may be as follows:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<expires=>I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<time>> for which a browser should keep the cookie.[m
[31m-The special value C<max> will cause the cookie to expire on[m
[31m-“C<31 Dec 2037 23:55:55 GMT>”.[m
[31m-If the parameter is not specified, it will cause the cookie to expire at[m
[31m-the end of a browser session.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<domain=>I<C<domain>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<domain>> for which the cookie is set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<httponly>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the C<HttpOnly> attribute to the cookie (1.7.11).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<secure>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Adds the C<Secure> attribute to the cookie (1.7.11).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<path=>I<C<path>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<path>> for which the cookie is set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-If any parameters are omitted, the corresponding cookie fields are not set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<route>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the C<route> method is used, proxied server assigns[m
[31m-client a route on receipt of the first request.[m
[31m-All subsequent requests from this client will carry routing information[m
[31m-in a cookie or URI.[m
[31m-This information is compared with the “C<route>” parameter[m
[31m-of the L</server> directive to identify the server to which the[m
[31m-request should be proxied.[m
[31m-If the designated server cannot process a request, the new server is[m
[31m-selected by the configured balancing method as if there is no routing[m
[31m-information in the request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The parameters of the C<route> method specify variables that[m
[31m-may contain routing information.[m
[31m-The first non-empty variable is used to find the matching server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    map $cookie_jsessionid $route_cookie {[m
[31m-        ~.+\.(?P<route>\w+)$ $route;[m
[31m-    }[m
[31m-    [m
[31m-    map $request_uri $route_uri {[m
[31m-        ~jsessionid=.+\.(?P<route>\w+)$ $route;[m
[31m-    }[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        server backend1.example.com route=a;[m
[31m-        server backend2.example.com route=b;[m
[31m-    [m
[31m-        sticky route $route_cookie $route_uri;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Here, the route is taken from the “C<JSESSIONID>” cookie[m
[31m-if present in a request.[m
[31m-Otherwise, the route from the URI is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<learn>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the C<learn> method (1.7.1) is used, nginx[m
[31m-analyzes upstream server responses and learns server-initiated sessions[m
[31m-usually passed in an HTTP cookie.[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-       server backend1.example.com:8080;[m
[31m-       server backend2.example.com:8081;[m
[31m-    [m
[31m-       sticky learn[m
[31m-              create=$upstream_cookie_examplecookie[m
[31m-              lookup=$cookie_examplecookie[m
[31m-              zone=client_sessions:1m;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-In the example, the upstream server creates a session by setting the[m
[31m-cookie “C<EXAMPLECOOKIE>” in the response.[m
[31m-Further requests with this cookie will be passed to the same server.[m
[31m-If the server cannot process the request, the new server is[m
[31m-selected as if the client has not been bound yet.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The parameters C<create> and C<lookup>[m
[31m-specify variables that indicate how new sessions are created and existing[m
[31m-sessions are searched, respectively.[m
[31m-Both parameters may be specified more than once, in which case the first[m
[31m-non-empty variable is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sessions are stored in a shared memory zone, whose I<C<name>> and[m
[31m-I<C<size>> are configured by the C<zone> parameter.[m
[31m-One megabyte zone can store about 8000 sessions on the 64-bit platform.[m
[31m-The sessions that are not accessed during the time specified by the[m
[31m-C<timeout> parameter get removed from the zone.[m
[31m-By default, C<timeout> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 sticky_cookie_insert[m
[31m-[m
[31m-[m
[31m-B<syntax:> sticky_cookie_insert I<I<C<name>>[m
[31m-[C<expires=>I<C<time>>][m
[31m-[C<domain=>I<C<domain>>][m
[31m-[C<path=>I<C<path>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive is obsolete since version 1.5.7.[m
[31m-An equivalent[m
[31m-L</sticky> directive with a new syntax should be used instead:[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-C<sticky cookie> I<C<name>>[m
[31m-[C<expires=>I<C<time>>][m
[31m-[C<domain=>I<C<domain>>][m
[31m-[C<path=>I<C<path>>];[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_upstream_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_addr>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the IP address and port,[m
[31m-or the path to the UNIX-domain socket of the upstream server.[m
[31m-If several servers were contacted during request processing,[m
[31m-their addresses are separated by commas, e.g.[m
[31m-“C<192.168.1.1:80, 192.168.1.2:80, unix:E<sol>tmpE<sol>sock>”.[m
[31m-If an internal redirect from one server group to another happens,[m
[31m-initiated by[m
[31m-C<X-Accel-Redirect> or[m
[31m-L<ngx_http_core_module>,[m
[31m-then the server addresses from different groups are separated by colons, e.g.[m
[31m-“C<192.168.1.1:80, 192.168.1.2:80, unix:E<sol>tmpE<sol>sock : 192.168.10.1:80, 192.168.10.2:80>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_cache_status>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the status of accessing a response cache (0.8.3).[m
[31m-The status can be either “C<MISS>”,[m
[31m-“C<BYPASS>”, “C<EXPIRED>”,[m
[31m-“C<STALE>”, “C<UPDATING>”,[m
[31m-“C<REVALIDATED>”, or “C<HIT>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_connect_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps time spent on establishing a connection with the upstream server (1.9.1);[m
[31m-the time is kept in seconds with millisecond resolution.[m
[31m-In case of SSL, includes time spent on handshake.[m
[31m-Times of several connections[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_cookie_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-cookie with the specified I<C<name>> sent by the upstream server[m
[31m-in the C<Set-Cookie> response header field (1.7.1).[m
[31m-Only the cookies from the response of the last server are saved.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_header_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps time[m
[31m-spent on receiving the response header from the upstream server (1.7.10);[m
[31m-the time is kept in seconds with millisecond resolution.[m
[31m-Times of several responses[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_http_>I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keep server response header fields.[m
[31m-For example, the C<Server> response header field[m
[31m-is available through the C<$upstream_http_server> variable.[m
[31m-The rules of converting header field names to variable names are the same[m
[31m-as for the variables that start with the[m
[31m-“L<$http_|ngx_http_core_module>” prefix.[m
[31m-Only the header fields from the response of the last server are saved.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_response_length>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps the length of the response obtained from the upstream server (0.7.27);[m
[31m-the length is kept in bytes.[m
[31m-Lengths of several responses[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_response_time>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps time spent on receiving the response from the upstream server;[m
[31m-the time is kept in seconds with millisecond resolution.[m
[31m-Times of several responses[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$upstream_status>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-keeps status code of the response obtained from the upstream server.[m
[31m-Status codes of several responses[m
[31m-are separated by commas and colons like addresses in the[m
[31m-$upstream_addr variable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_userid_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_userid_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 524ff16..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_userid_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,412 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_userid_module - Module ngx_http_userid_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_userid_module> module sets cookies[m
[31m-suitable for client identification.[m
[31m-Received and set cookies can be logged using the embedded variables[m
[31m-$uid_got and[m
[31m-$uid_set.[m
[31m-This module is compatible with the[m
[31m-L<mod_uid|http://www.lexa.ru/programs/mod-uid-eng.html>[m
[31m-module for Apache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    userid         on;[m
[31m-    userid_name    uid;[m
[31m-    userid_domain  example.com;[m
[31m-    userid_path    /;[m
[31m-    userid_expires 365d;[m
[31m-    userid_p3p     'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 userid[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<v1> E<verbar>[m
[31m-    C<log> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables setting cookies and logging the received cookies:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<on>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables the setting of version 2 cookies[m
[31m-and logging of the received cookies;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<v1>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables the setting of version 1 cookies[m
[31m-and logging of the received cookies;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<log>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables the setting of cookies,[m
[31m-but enables logging of the received cookies;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables the setting of cookies and logging of the received cookies.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_domain[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_domain I<I<C<name>> E<verbar> C<none>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a domain for which the cookie is set.[m
[31m-The C<none> parameter disables setting of a domain for the[m
[31m-cookie.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_expires[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_expires I<I<C<time>> E<verbar> C<max> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a time during which a browser should keep the cookie.[m
[31m-The parameter C<max> will cause the cookie to expire on[m
[31m-“C<31 Dec 2037 23:55:55 GMT>”.[m
[31m-The parameter C<off> will cause the cookie to expire at[m
[31m-the end of a browser session.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_mark[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_mark I<[m
[31m-    I<C<letter>> E<verbar> I<C<digit>> E<verbar>[m
[31m-    C<=> E<verbar>[m
[31m-    C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the parameter is not C<off>, enables the cookie marking[m
[31m-mechanism and sets the character used as a mark.[m
[31m-This mechanism is used to add or change[m
[31m-L</userid_p3p> andE<sol>or a cookie expiration time while[m
[31m-preserving the client identifier.[m
[31m-A mark can be any letter of the English alphabet (case-sensitive),[m
[31m-digit, or the “C<=>” character.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the mark is set, it is compared with the first padding symbol[m
[31m-in the base64 representation of the client identifier passed in a cookie.[m
[31m-If they do not match, the cookie is resent with the specified mark,[m
[31m-expiration time, and C<P3P> header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<uid>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the cookie name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_p3p[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_p3p I<I<C<string>> E<verbar> C<none>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a value for the C<P3P> header field that will be[m
[31m-sent along with the cookie.[m
[31m-If the directive is set to the special value C<none>,[m
[31m-the C<P3P> header will not be sent in a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_path I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<E<sol>>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a path for which the cookie is set.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 userid_service[m
[31m-[m
[31m-[m
[31m-B<syntax:> userid_service I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<IP address of the server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If identifiers are issued by multiple servers (services),[m
[31m-each service should be assigned its own I<C<number>>[m
[31m-to ensure that client identifiers are unique.[m
[31m-For version 1 cookies, the default value is zero.[m
[31m-For version 2 cookies, the default value is the number composed from the last[m
[31m-four octets of the server’s IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_userid_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$uid_got>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The cookie name and received client identifier.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$uid_reset>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the variable is set to a non-empty string that is not “C<0>”,[m
[31m-the client identifiers are reset.[m
[31m-The special value “C<log>” additionally leads to the output of[m
[31m-messages about the reset identifiers to the[m
[31m-L<ngx_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$uid_set>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The cookie name and sent client identifier.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_uwsgi_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_uwsgi_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 1ad1143..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_uwsgi_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,2689 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_uwsgi_module - Module ngx_http_uwsgi_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_uwsgi_module> module allows passing[m
[31m-requests to a uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        include    uwsgi_params;[m
[31m-        uwsgi_pass localhost:9000;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 uwsgi_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a uwsgi server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-Parameter value can contain variables (1.3.12).[m
[31m-The special value C<off> (1.3.12) cancels the effect[m
[31m-of the C<uwsgi_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a uwsgi server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading the first part[m
[31m-of the response received from the uwsgi server.[m
[31m-This part usually contains a small response header.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-It can be made smaller, however.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of responses from the uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, nginx receives a response from the uwsgi server[m
[31m-as soon as possible, saving it into the buffers set by the[m
[31m-L</uwsgi_buffer_size> and L</uwsgi_buffers> directives.[m
[31m-If the whole response does not fit into memory, a part of it can be saved[m
[31m-to a temporary file on the disk.[m
[31m-Writing to temporary files is controlled by the[m
[31m-L</uwsgi_max_temp_file_size> and[m
[31m-L</uwsgi_temp_file_write_size> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the response is passed to a client synchronously,[m
[31m-immediately as it is received.[m
[31m-nginx will not try to read the whole response from the uwsgi server.[m
[31m-The maximum size of the data that nginx can receive from the server[m
[31m-at a time is set by the L</uwsgi_buffer_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Buffering can also be enabled or disabled by passing[m
[31m-“C<yes>” or “C<no>” in the[m
[31m-C<X-Accel-Buffering> response header field.[m
[31m-This capability can be disabled using the[m
[31m-L</uwsgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_buffers[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_buffers I<I<C<number>> I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8 4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> and I<C<size>> of the[m
[31m-buffers used for reading a response from the uwsgi server,[m
[31m-for a single connection.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_busy_buffers_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_busy_buffers_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the uwsgi[m
[31m-server is enabled, limits the total I<C<size>> of buffers that[m
[31m-can be busy sending a response to the client while the response is not[m
[31m-yet fully read.[m
[31m-In the meantime, the rest of the buffers can be used for reading the response[m
[31m-and, if needed, buffering part of the response to a temporary file.[m
[31m-By default, I<C<size>> is limited by the size of two buffers set by the[m
[31m-L</uwsgi_buffer_size> and L</uwsgi_buffers> directives.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache I<I<C<zone>> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a shared memory zone used for caching.[m
[31m-The same zone can be used in several places.[m
[31m-Parameter value can contain variables (1.7.9).[m
[31m-The C<off> parameter disables caching inherited[m
[31m-from the previous configuration level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_bypass[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_bypass I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be taken from a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be taken from the cache:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_bypass $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    uwsgi_cache_bypass $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</uwsgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_key I<I<C<string>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a key for caching, for example[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_key localhost:9000$request_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_lock[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_lock I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When enabled, only one request at a time will be allowed to populate[m
[31m-a new cache element identified according to the L</uwsgi_cache_key>[m
[31m-directive by passing a request to a uwsgi server.[m
[31m-Other requests of the same cache element will either wait[m
[31m-for a response to appear in the cache or the cache lock for[m
[31m-this element to be released, up to the time set by the[m
[31m-L</uwsgi_cache_lock_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_lock_age[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_lock_age I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the last request passed to the uwsgi server[m
[31m-for populating a new cache element[m
[31m-has not completed for the specified I<C<time>>,[m
[31m-one more request may be passed to the uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_lock_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_lock_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for L</uwsgi_cache_lock>.[m
[31m-When the I<C<time>> expires,[m
[31m-the request will be passed to the uwsgi server,[m
[31m-however, the response will not be cached.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before 1.7.8, the response could be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_methods[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_methods I<[m
[31m-    C<GET> E<verbar>[m
[31m-    C<HEAD> E<verbar>[m
[31m-    C<POST>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<GET HEAD>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the client request method is listed in this directive then[m
[31m-the response will be cached.[m
[31m-“C<GET>” and “C<HEAD>” methods are always[m
[31m-added to the list, though it is recommended to specify them explicitly.[m
[31m-See also the L</uwsgi_no_cache> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_min_uses[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_min_uses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<number>> of requests after which the response[m
[31m-will be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_path I<[m
[31m-    I<C<path>>[m
[31m-    [C<levels>=I<C<levels>>][m
[31m-    [C<use_temp_path>=C<on>E<verbar>C<off>][m
[31m-    C<keys_zone>=I<C<name>>:I<C<size>>[m
[31m-    [C<inactive>=I<C<time>>][m
[31m-    [C<max_size>=I<C<size>>][m
[31m-    [C<loader_files>=I<C<number>>][m
[31m-    [C<loader_sleep>=I<C<time>>][m
[31m-    [C<loader_threshold>=I<C<time>>][m
[31m-    [C<purger>=C<on>E<verbar>C<off>][m
[31m-    [C<purger_files>=I<C<number>>][m
[31m-    [C<purger_sleep>=I<C<time>>][m
[31m-    [C<purger_threshold>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the path and other parameters of a cache.[m
[31m-Cache data are stored in files.[m
[31m-The file name in a cache is a result of[m
[31m-applying the MD5 function to the[m
[31m-cache key.[m
[31m-The C<levels> parameter defines hierarchy levels of a cache.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;[m
[31m-[m
[31m-[m
[31m-file names in a cache will look like this:[m
[31m-[m
[31m-    [m
[31m-    /data/nginx/cache/<emphasis>c</emphasis>/<emphasis>29</emphasis>/b7f54b2df7773722d382f4809d650<emphasis>29c</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A cached response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the cache can be put on[m
[31m-different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both cache and a directory[m
[31m-holding temporary files[m
[31m-are put on the same file system.[m
[31m-A directory for temporary files is set based on[m
[31m-the C<use_temp_path> parameter (1.7.10).[m
[31m-If this parameter is omitted or set to the value C<on>,[m
[31m-the directory set by the L</uwsgi_temp_path> directive[m
[31m-for the given location will be used.[m
[31m-If the value is set to C<off>,[m
[31m-temporary files will be put directly in the cache directory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, all active keys and information about data are stored[m
[31m-in a shared memory zone, whose I<C<name>> and I<C<size>>[m
[31m-are configured by the C<keys_zone> parameter.[m
[31m-One megabyte zone can store about 8 thousand keys.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Cached data that are not accessed during the time specified by the[m
[31m-C<inactive> parameter get removed from the cache[m
[31m-regardless of their freshness.[m
[31m-By default, C<inactive> is set to 10 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special “cache manager” process monitors the maximum cache size set[m
[31m-by the C<max_size> parameter.[m
[31m-When this size is exceeded, it removes the least recently used data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A minute after the start the special “cache loader” process is activated.[m
[31m-It loads information about previously cached data stored on file system[m
[31m-into a cache zone.[m
[31m-The loading is done in iterations.[m
[31m-During one iteration no more than C<loader_files> items[m
[31m-are loaded (by default, 100).[m
[31m-Besides, the duration of one iteration is limited by the[m
[31m-C<loader_threshold> parameter (by default, 200 milliseconds).[m
[31m-Between iterations, a pause configured by the C<loader_sleep>[m
[31m-parameter (by default, 50 milliseconds) is made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Instructs whether cache entries that match a[m
[31m-wildcard key[m
[31m-will be removed from the disk by the cache purger (1.7.12).[m
[31m-Setting the parameter to C<on>[m
[31m-(default is C<off>)[m
[31m-will activate the “cache purger” process that[m
[31m-permanently iterates through all cache entries[m
[31m-and deletes the entries that match the wildcard key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_files>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of items that will be scanned during one iteration (1.7.12).[m
[31m-By default, C<purger_files> is set to 10.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_threshold>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the duration of one iteration (1.7.12).[m
[31m-By default, C<purger_threshold> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<purger_sleep>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a pause between iterations (1.7.12).[m
[31m-By default, C<purger_sleep> is set to 50 milliseconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_purge[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_purge I<string ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the request will be considered a cache[m
[31m-purge request.[m
[31m-If at least one value of the string parameters is not empty and is not equal[m
[31m-to “0” then the cache entry with a corresponding[m
[31m-cache key is removed.[m
[31m-The result of successful operation is indicated by returning[m
[31m-the C<204> (C<No Content>) response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the cache key of a purge request ends[m
[31m-with an asterisk (“C<*>”), all cache entries matching the[m
[31m-wildcard key will be removed from the cache.[m
[31m-However, these entries will remain on the disk until they are deleted[m
[31m-for either inactivity,[m
[31m-or processed by the cache purger (1.7.12),[m
[31m-or a client attempts to access them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example configuration:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m;[m
[31m-    [m
[31m-    map $request_method $purge_method {[m
[31m-        PURGE   1;[m
[31m-        default 0;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        location / {[m
[31m-            uwsgi_pass        backend;[m
[31m-            uwsgi_cache       cache_zone;[m
[31m-            uwsgi_cache_key   $uri;[m
[31m-            uwsgi_cache_purge $purge_method;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This functionality is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_revalidate[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_revalidate I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables revalidation of expired cache items using conditional requests with[m
[31m-the C<If-Modified-Since> and C<If-None-Match>[m
[31m-header fields.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_use_stale[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_use_stale I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<updating> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines in which cases a stale cached response can be used[m
[31m-when an error occurs during communication with the uwsgi server.[m
[31m-The directive’s parameters match the parameters of the[m
[31m-L</uwsgi_next_upstream> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<error> parameter also permits[m
[31m-using a stale cached response if a uwsgi server to process a request[m
[31m-cannot be selected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally, the C<updating> parameter permits[m
[31m-using a stale cached response if it is currently being updated.[m
[31m-This allows minimizing the number of accesses to uwsgi servers[m
[31m-when updating cached data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To minimize the number of accesses to uwsgi servers when[m
[31m-populating a new cache element, the L</uwsgi_cache_lock>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_cache_valid[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_cache_valid I<[I<C<code>> ...] I<C<time>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets caching time for different response codes.[m
[31m-For example, the following directives[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_valid 200 302 10m;[m
[31m-    uwsgi_cache_valid 404      1m;[m
[31m-[m
[31m-[m
[31m-set 10 minutes of caching for responses with codes 200 and 302[m
[31m-and 1 minute for responses with code 404.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If only caching I<C<time>> is specified[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_valid 5m;[m
[31m-[m
[31m-[m
[31m-then only 200, 301, and 302 responses are cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In addition, the C<any> parameter can be specified[m
[31m-to cache any responses:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_cache_valid 200 302 10m;[m
[31m-    uwsgi_cache_valid 301      1h;[m
[31m-    uwsgi_cache_valid any      1m;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters of caching can also be set directly[m
[31m-in the response header.[m
[31m-This has higher priority than setting of caching time using the directive.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The C<X-Accel-Expires> header field sets caching time of a[m
[31m-response in seconds.[m
[31m-The zero value disables caching for a response.[m
[31m-If the value starts with the C<@> prefix, it sets an absolute[m
[31m-time in seconds since Epoch, up to which the response may be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header does not include the C<X-Accel-Expires> field,[m
[31m-parameters of caching may be set in the header fields[m
[31m-C<Expires> or C<Cache-Control>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Set-Cookie> field, such a[m
[31m-response will not be cached.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-If the header includes the C<Vary> field[m
[31m-with the special value “C<*>”, such a[m
[31m-response will not be cached (1.7.7).[m
[31m-If the header includes the C<Vary> field[m
[31m-with another value, such a response will be cached[m
[31m-taking into account the corresponding request header fields (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Processing of one or more of these response header fields can be disabled[m
[31m-using the L</uwsgi_ignore_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a uwsgi server.[m
[31m-It should be noted that this timeout cannot usually exceed 75 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_force_ranges[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_force_ranges I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables byte-range support[m
[31m-for both cached and uncached responses from the uwsgi server[m
[31m-regardless of the C<Accept-Ranges> field in these responses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_hide_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_hide_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default,[m
[31m-nginx does not pass the header fields C<Status> and[m
[31m-C<X-Accel-...> from the response of a uwsgi[m
[31m-server to a client.[m
[31m-The C<uwsgi_hide_header> directive sets additional fields[m
[31m-that will not be passed.[m
[31m-If, on the contrary, the passing of fields needs to be permitted,[m
[31m-the L</uwsgi_pass_header> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ignore_client_abort[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ignore_client_abort I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether the connection with a uwsgi server should be[m
[31m-closed when a client closes the connection without waiting[m
[31m-for a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ignore_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ignore_headers I<I<C<field>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables processing of certain response header fields from the uwsgi server.[m
[31m-The following fields can be ignored: C<X-Accel-Redirect>,[m
[31m-C<X-Accel-Expires>, C<X-Accel-Limit-Rate> (1.1.6),[m
[31m-C<X-Accel-Buffering> (1.1.6),[m
[31m-C<X-Accel-Charset> (1.1.6), C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie> (0.8.44),[m
[31m-and C<Vary> (1.7.7).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If not disabled, processing of these header fields has the following[m
[31m-effect:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Expires>, C<Expires>,[m
[31m-C<Cache-Control>, C<Set-Cookie>,[m
[31m-and C<Vary>[m
[31m-set the parameters of response caching;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Redirect> performs an[m
[31m-L<internal[m
[31m-redirect|ngx_http_core_module> to the specified URI;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Limit-Rate> sets the[m
[31m-L<rate[m
[31m-limit|ngx_http_core_module> for transmission of a response to a client;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Buffering> enables or disables[m
[31m-buffering of a response;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<X-Accel-Charset> sets the desired[m
[31m-L<ngx_http_charset_module>[m
[31m-of a response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_intercept_errors[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_intercept_errors I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether a uwsgi server responses with codes greater than or equal[m
[31m-to 300 should be passed to a client or be redirected to nginx for processing[m
[31m-with the L<ngx_http_core_module> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_limit_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_limit_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the response from the uwsgi server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a request, and so if nginx simultaneously opens[m
[31m-two connections to the uwsgi server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-The limitation works only if[m
[31m-buffering of responses from the uwsgi[m
[31m-server is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_max_temp_file_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_max_temp_file_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1024m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering of responses from the uwsgi[m
[31m-server is enabled, and the whole response does not fit into the buffers[m
[31m-set by the L</uwsgi_buffer_size> and L</uwsgi_buffers>[m
[31m-directives, a part of the response can be saved to a temporary file.[m
[31m-This directive sets the maximum I<C<size>> of the temporary file.[m
[31m-The size of data written to the temporary file at a time is set[m
[31m-by the L</uwsgi_temp_file_write_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The zero value disables buffering of responses to temporary files.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This restriction does not apply to responses[m
[31m-that will be cached[m
[31m-or stored on disk.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_modifier1[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_modifier1 I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the value of the C<modifier1> field in the[m
[31m-L<uwsgi[m
[31m-packet header|http://uwsgi-docs.readthedocs.org/en/latest/Protocol.html#uwsgi-packet-header>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_modifier2[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_modifier2 I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the value of the C<modifier2> field in the[m
[31m-L<uwsgi[m
[31m-packet header|http://uwsgi-docs.readthedocs.org/en/latest/Protocol.html#uwsgi-packet-header>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_next_upstream I<[m
[31m-    C<error> E<verbar>[m
[31m-    C<timeout> E<verbar>[m
[31m-    C<invalid_header> E<verbar>[m
[31m-    C<http_500> E<verbar>[m
[31m-    C<http_503> E<verbar>[m
[31m-    C<http_403> E<verbar>[m
[31m-    C<http_404> E<verbar>[m
[31m-    C<non_idempotent> E<verbar>[m
[31m-    C<off>[m
[31m-    ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error timeout>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies in which cases a request should be passed to the next server:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<error>[m
[31m-[m
[31m-[m
[31m-[m
[31m-an error occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<timeout>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a timeout has occurred while establishing a connection with the[m
[31m-server, passing a request to it, or reading the response header;[m
[31m-[m
[31m-[m
[31m-=item C<invalid_header>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned an empty or invalid response;[m
[31m-[m
[31m-[m
[31m-=item C<http_500>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 500;[m
[31m-[m
[31m-[m
[31m-=item C<http_503>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 503;[m
[31m-[m
[31m-[m
[31m-=item C<http_403>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 403;[m
[31m-[m
[31m-[m
[31m-=item C<http_404>[m
[31m-[m
[31m-[m
[31m-[m
[31m-a server returned a response with the code 404;[m
[31m-[m
[31m-[m
[31m-=item C<non_idempotent>[m
[31m-[m
[31m-[m
[31m-[m
[31m-normally, requests with a[m
[31m-L<non-idempotent|http://tools.ietf.org/html/rfc7231#section-4.2.2>[m
[31m-method[m
[31m-(C<POST>, C<LOCK>, C<PATCH>)[m
[31m-are not passed to the next server[m
[31m-if a request has been sent to an upstream server (1.9.13);[m
[31m-enabling this option explicitly allows retrying such requests;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-disables passing a request to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-One should bear in mind that passing a request to the next server is[m
[31m-only possible if nothing has been sent to a client yet.[m
[31m-That is, if an error or timeout occurs in the middle of the[m
[31m-transferring of a response, fixing this is impossible.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directive also defines what is considered an[m
[31m-L<unsuccessful[m
[31m-attempt|ngx_http_upstream_module> of communication with a server.[m
[31m-The cases of C<error>, C<timeout> and[m
[31m-C<invalid_header> are always considered unsuccessful attempts,[m
[31m-even if they are not specified in the directive.[m
[31m-The cases of C<http_500> and C<http_503> are[m
[31m-considered unsuccessful attempts only if they are specified in the directive.[m
[31m-The cases of C<http_403> and C<http_404>[m
[31m-are never considered unsuccessful attempts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a request to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time during which a request can be passed to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.5.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a request to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_no_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_no_cache I<I<C<string>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines conditions under which the response will not be saved to a cache.[m
[31m-If at least one value of the string parameters is not empty and is not[m
[31m-equal to “0” then the response will not be saved:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_no_cache $cookie_nocache $arg_nocache$arg_comment;[m
[31m-    uwsgi_no_cache $http_pragma    $http_authorization;[m
[31m-[m
[31m-[m
[31m-Can be used along with the L</uwsgi_cache_bypass> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_param I<[m
[31m-    I<C<parameter>> I<C<value>>[m
[31m-    [C<if_not_empty>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<parameter>> that should be passed to the uwsgi server.[m
[31m-The I<C<value>> can contain text, variables, and their combination.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<uwsgi_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Standard[m
[31m-L<CGI[m
[31m-environment variables|http://tools.ietf.org/html/rfc3875#section-4.1>[m
[31m-should be provided as uwsgi headers, see the F<uwsgi_params> file[m
[31m-provided in the distribution:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        include uwsgi_params;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a directive is specified with C<if_not_empty> (1.1.11) then[m
[31m-such a parameter will not be passed to the server until its value is not empty:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_param HTTPS $https if_not_empty;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_pass I<[I<C<protocol>>:E<sol>E<sol>]I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-B<context:> I<if in location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the protocol and address of a uwsgi server.[m
[31m-As a I<C<protocol>>,[m
[31m-“C<uwsgi>” or “C<suwsgi>”[m
[31m-(secured uwsgi, uwsgi over SSL) can be specified.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_pass localhost:9000;[m
[31m-    uwsgi_pass uwsgi://localhost:9000;[m
[31m-    uwsgi_pass suwsgi://[2001:db8::1]:9090;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_pass unix:/tmp/uwsgi.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_http_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Secured uwsgi protocol is supported since version 1.5.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_pass_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_pass_header I<I<C<field>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Permits passing otherwise disabled header[m
[31m-fields from a uwsgi server to a client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_pass_request_body[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_pass_request_body I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the original request body is passed[m
[31m-to the uwsgi server.[m
[31m-See also the L</uwsgi_pass_request_headers> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_pass_request_headers[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_pass_request_headers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether the header fields of the original request are passed[m
[31m-to the uwsgi server.[m
[31m-See also the L</uwsgi_pass_request_body> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_read_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_read_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for reading a response from the uwsgi server.[m
[31m-The timeout is set only between two successive read operations,[m
[31m-not for the transmission of the whole response.[m
[31m-If the uwsgi server does not transmit anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_request_buffering[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_request_buffering I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables buffering of a client request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is enabled, the entire request body is[m
[31m-L<read|ngx_http_core_module>[m
[31m-from the client before sending the request to a uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When buffering is disabled, the request body is sent to the uwsgi server[m
[31m-immediately as it is received.[m
[31m-In this case, the request cannot be passed to the[m
[31m-next server[m
[31m-if nginx already started sending the request body.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When HTTPE<sol>1.1 chunked transfer encoding is used[m
[31m-to send the original request body,[m
[31m-the request body will be buffered regardless of the directive value.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_send_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_send_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for transmitting a request to the uwsgi server.[m
[31m-The timeout is set only between two successive write operations,[m
[31m-not for the transmission of the whole request.[m
[31m-If the uwsgi server does not receive anything within this time,[m
[31m-the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-used for authentication to a secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-used for authentication to a secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>> (1.7.9),[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<DEFAULT>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers for requests to a secured uwsgi server.[m
[31m-The ciphers are specified in the format understood by the OpenSSL library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-the certificate of the secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<host from uwsgi_pass>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows overriding the server name used to[m
[31m-verify[m
[31m-the certificate of the secured uwsgi server and to be[m
[31m-passed through SNI[m
[31m-when establishing a connection with the secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the host part from L</uwsgi_pass> is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols for requests to a secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_server_name I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables passing of the server name through[m
[31m-L<TLS[m
[31m-Server Name Indication extension|http://en.wikipedia.org/wiki/Server_Name_Indication> (SNI, RFC 6066)[m
[31m-when establishing a connection with the secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_session_reuse[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_session_reuse I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.8.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether SSL sessions can be reused when working with[m
[31m-a secured uwsgi server.[m
[31m-If the errors[m
[31m-“C<SSL3_GET_FINISHED:digest check failed>”[m
[31m-appear in the logs, try disabling session reuse.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify[m
[31m-the certificate of the secured uwsgi server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_verify[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_verify I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables verification of the secured uwsgi server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the secured uwsgi server certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_store[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_store I<[m
[31m-    C<on> E<verbar>[m
[31m-    C<off> E<verbar>[m
[31m-    I<C<string>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables saving of files to a disk.[m
[31m-The C<on> parameter saves files with paths[m
[31m-corresponding to the directives[m
[31m-L<ngx_http_core_module> or[m
[31m-L<ngx_http_core_module>.[m
[31m-The C<off> parameter disables saving of files.[m
[31m-In addition, the file name can be set explicitly using the[m
[31m-I<C<string>> with variables:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_store /data/www$original_uri;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The modification time of files is set according to the received[m
[31m-C<Last-Modified> response header field.[m
[31m-The response is first written to a temporary file,[m
[31m-and then the file is renamed.[m
[31m-Starting from version 0.8.9, temporary files and the persistent store[m
[31m-can be put on different file systems.[m
[31m-However, be aware that in this case a file is copied[m
[31m-across two file systems instead of the cheap renaming operation.[m
[31m-It is thus recommended that for any given location both saved files and a[m
[31m-directory holding temporary files, set by the L</uwsgi_temp_path>[m
[31m-directive, are put on the same file system.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive can be used to create local copies of static unchangeable[m
[31m-files, e.g.:[m
[31m-[m
[31m-    [m
[31m-    location /images/ {[m
[31m-        root               /data/www;[m
[31m-        error_page         404 = /fetch$uri;[m
[31m-    }[m
[31m-    [m
[31m-    location /fetch/ {[m
[31m-        internal;[m
[31m-    [m
[31m-        uwsgi_pass         backend:9000;[m
[31m-        ...[m
[31m-    [m
[31m-        uwsgi_store        on;[m
[31m-        uwsgi_store_access user:rw group:rw all:r;[m
[31m-        uwsgi_temp_path    /data/temp;[m
[31m-    [m
[31m-        alias              /data/www/;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_store_access[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_store_access I<I<C<users>>:I<C<permissions>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<user:rw>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets access permissions for newly created files and directories, e.g.:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_store_access user:rw group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If any C<group> or C<all> access permissions[m
[31m-are specified then C<user> permissions may be omitted:[m
[31m-[m
[31m-    [m
[31m-    uwsgi_store_access group:rw all:r;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_temp_file_write_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_temp_file_write_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8kE<verbar>16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the I<C<size>> of data written to a temporary file[m
[31m-at a time, when buffering of responses from the uwsgi server[m
[31m-to temporary files is enabled.[m
[31m-By default, I<C<size>> is limited by two buffers set by the[m
[31m-L</uwsgi_buffer_size> and L</uwsgi_buffers> directives.[m
[31m-The maximum size of a temporary file is set by the[m
[31m-L</uwsgi_max_temp_file_size> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 uwsgi_temp_path[m
[31m-[m
[31m-[m
[31m-B<syntax:> uwsgi_temp_path I<[m
[31m-    I<C<path>>[m
[31m-    [I<C<level1>>[m
[31m-    [I<C<level2>>[m
[31m-    [I<C<level3>>]]]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<uwsgi_temp>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a directory for storing temporary files[m
[31m-with data received from uwsgi servers.[m
[31m-Up to three-level subdirectory hierarchy can be used underneath the specified[m
[31m-directory.[m
[31m-For example, in the following configuration[m
[31m-[m
[31m-    [m
[31m-    uwsgi_temp_path /spool/nginx/uwsgi_temp 1 2;[m
[31m-[m
[31m-[m
[31m-a temporary file might look like this:[m
[31m-[m
[31m-    [m
[31m-    /spool/nginx/uwsgi_temp/<emphasis>7</emphasis>/<emphasis>45</emphasis>/00000123<emphasis>457</emphasis>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-See also the C<use_temp_path> parameter of the[m
[31m-L</uwsgi_cache_path> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_v2_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_v2_module.pod[m
[1mdeleted file mode 100644[m
[1mindex f81542b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_v2_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,350 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_v2_module - Module ngx_http_v2_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_v2_module> module (1.9.5) provides[m
[31m-support for L<HTTPE<sol>2|https://tools.ietf.org/html/rfc7540>[m
[31m-and supersedes the[m
[31m-L<ngx_http_spdy_module|ngx_http_spdy_module> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with[m
[31m-the C<--with-http_v2_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-[m
[31m-The module is experimental, caveat emptor applies.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Before version 1.9.14,[m
[31m-buffering of a client request body could not be disabled[m
[31m-regardless of[m
[31m-L<ngx_http_proxy_module>,[m
[31m-L<ngx_http_fastcgi_module>,[m
[31m-L<ngx_http_uwsgi_module>, and[m
[31m-L<ngx_http_scgi_module>[m
[31m-directive values.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen 443 ssl http2;[m
[31m-    [m
[31m-        ssl_certificate server.crt;[m
[31m-        ssl_certificate_key server.key;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Note that accepting HTTPE<sol>2 connections over TLS requires[m
[31m-the “Application-Layer Protocol Negotiation” (ALPN) TLS extension[m
[31m-support, which is available only since[m
[31m-L<OpenSSL|http://www.openssl.org> version 1.0.2.[m
[31m-Using the “Next Protocol Negotiation” (NPN) TLS extension for this purpose[m
[31m-(available since OpenSSL version 1.0.1) is not guaranteed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Also note that if the[m
[31m-L<ngx_http_ssl_module> directive[m
[31m-is set to the value “C<on>”,[m
[31m-the L<ciphers|ngx_http_ssl_module>[m
[31m-should be configured to comply with[m
[31m-L<RFC 7540, Appendix A|https://tools.ietf.org/html/rfc7540#appendix-A>[m
[31m-black list and supported by clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 http2_chunk_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_chunk_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum size of chunks[m
[31m-into which the response body is sliced.[m
[31m-A too low value results in higher overhead.[m
[31m-A too high value impairs prioritization due to[m
[31m-L<HOL blocking|http://en.wikipedia.org/wiki/Head-of-line_blocking>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_body_preread_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_body_preread_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<64k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.11.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer per each request[m
[31m-in which the request body may be saved[m
[31m-before it is started to be processed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_idle_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_idle_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<3m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the timeout of inactivity after which the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_max_concurrent_streams[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_max_concurrent_streams I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<128>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the maximum number of concurrent HTTPE<sol>2 streams[m
[31m-in a connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_max_field_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_max_field_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the maximum size of[m
[31m-an L<HPACK|http://tools.ietf.org/html/rfc7541>-compressed[m
[31m-request header field.[m
[31m-The limit applies equally to both name and value.[m
[31m-Note that if Huffman encoding is applied,[m
[31m-the actual size of decompressed name and value strings may be larger.[m
[31m-For most requests, the default limit should be enough.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_max_header_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_max_header_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the maximum size of the entire request header list after[m
[31m-L<HPACK|http://tools.ietf.org/html/rfc7541> decompression.[m
[31m-For most requests, the default limit should be enough.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_recv_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_recv_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<256k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the size of the per[m
[31m-L<worker|ngx_core_module>[m
[31m-input buffer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 http2_recv_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> http2_recv_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the timeout for expecting more data from the client,[m
[31m-after which the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Embedded Variables[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_v2_module> module[m
[31m-supports the following embedded variables:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<$http2>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-negotiated protocol identifier:[m
[31m-“C<h2>” for HTTPE<sol>2 over TLS,[m
[31m-“C<h2c>” for HTTPE<sol>2 over cleartext TCP,[m
[31m-or an empty string otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_xslt_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_xslt_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 9170756..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_http_xslt_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,320 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_http_xslt_module - Module ngx_http_xslt_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_http_xslt_module> (0.7.8+) is a filter[m
[31m-that transforms XML responses using one or more XSLT stylesheets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-http_xslt_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires the[m
[31m-L<libxml2|http://xmlsoft.org> and[m
[31m-L<libxslt|http://xmlsoft.org/XSLT/> libraries.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        xml_entities    /site/dtd/entities.dtd;[m
[31m-        xslt_stylesheet /site/xslt/one.xslt param=value;[m
[31m-        xslt_stylesheet /site/xslt/two.xslt;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 xml_entities[m
[31m-[m
[31m-[m
[31m-B<syntax:> xml_entities I<I<C<path>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the DTD file that declares character entities.[m
[31m-This file is compiled at the configuration stage.[m
[31m-For technical reasons, the module is unable to use the[m
[31m-external subset declared in the processed XML, so it is[m
[31m-ignored and a specially defined file is used instead.[m
[31m-This file should not describe the XML structure.[m
[31m-It is enough to declare just the required character entities, for example:[m
[31m-[m
[31m-    [m
[31m-    <!ENTITY nbsp "&#xa0;">[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_last_modified[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_last_modified I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows preserving the C<Last-Modified> header field[m
[31m-from the original response during XSLT transformations[m
[31m-to facilitate response caching.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the header field is removed as contents of the response[m
[31m-are modified during transformations and may contain dynamically generated[m
[31m-elements or parts that are changed independently of the original response.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_param I<I<C<parameter>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the parameters for XSLT stylesheets.[m
[31m-The I<C<value>> is treated as an XPath expression.[m
[31m-The I<C<value>> can contain variables.[m
[31m-To pass a string value to a stylesheet,[m
[31m-the L</xslt_string_param> directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<xslt_param> directives.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<xslt_param> and L</xslt_string_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_string_param[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_string_param I<I<C<parameter>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the string parameters for XSLT stylesheets.[m
[31m-XPath expressions in the I<C<value>> are not interpreted.[m
[31m-The I<C<value>> can contain variables.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There could be several C<xslt_string_param> directives.[m
[31m-These directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-L</xslt_param> and C<xslt_string_param>[m
[31m-directives defined on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_stylesheet[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_stylesheet I<[m
[31m-    I<C<stylesheet>>[m
[31m-    [I<C<parameter>>=I<C<value>> ...]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the XSLT stylesheet and its optional parameters.[m
[31m-A stylesheet is compiled at the configuration stage.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Parameters can either be specified separately, or grouped in a[m
[31m-single line using the “C<:>” delimiter.[m
[31m-If a parameter includes the “C<:>” character,[m
[31m-it should be escaped as “C<%3A>”.[m
[31m-Also, C<libxslt> requires to enclose parameters[m
[31m-that contain non-alphanumeric characters into single or double quotes,[m
[31m-for example:[m
[31m-[m
[31m-    [m
[31m-    param1='http%3A//www.example.com':param2=value2[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The parameters description can contain variables, for example,[m
[31m-the whole line of parameters can be taken from a single variable:[m
[31m-[m
[31m-    [m
[31m-    location / {[m
[31m-        xslt_stylesheet /site/xslt/one.xslt[m
[31m-                        $arg_xslt_params[m
[31m-                        param1='$value1':param2=value2[m
[31m-                        param3=value3;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It is possible to specify several stylesheets.[m
[31m-They will be applied sequentially in the specified order.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xslt_types[m
[31m-[m
[31m-[m
[31m-B<syntax:> xslt_types I<I<C<mime-type>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<textE<sol>xml>[m
[31m-[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-B<context:> I<location>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables transformations in responses with the specified MIME types[m
[31m-in addition to “C<textE<sol>xml>”.[m
[31m-The special value “C<*>” matches any MIME type (0.8.29).[m
[31m-If the transformation result is an HTML response, its MIME type[m
[31m-is changed to “C<textE<sol>html>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_auth_http_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_auth_http_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 8ad8824..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_auth_http_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,323 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_auth_http_module - Module ngx_mail_auth_http_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 auth_http[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_http I<I<C<URL>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the URL of the HTTP authentication server.[m
[31m-The protocol is described below.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_http_header[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_http_header I<I<C<header>> I<C<value>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Appends the specified header to requests sent to the authentication server.[m
[31m-This header can be used as the shared secret to verify[m
[31m-that the request comes from nginx.[m
[31m-For example:[m
[31m-[m
[31m-    [m
[31m-    auth_http_header X-Auth-Key "secret_string";[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_http_pass_client_cert[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_http_pass_client_cert I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Appends the C<Auth-SSL-Cert> header with the[m
[31m-L<client|ngx_mail_ssl_module>[m
[31m-certificate in the PEM format (urlencoded)[m
[31m-to requests sent to the authentication server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auth_http_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> auth_http_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the timeout for communication with the authentication server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Protocol[m
[31m-[m
[31m-[m
[31m-[m
[31m-The HTTP protocol is used to communicate with the authentication server.[m
[31m-The data in the response body is ignored, the information is passed only in[m
[31m-the headers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Examples of requests and responses:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Request:[m
[31m-[m
[31m-    [m
[31m-    GET /auth HTTP/1.0[m
[31m-    Host: localhost[m
[31m-    Auth-Method: plain # plain/apop/cram-md5[m
[31m-    Auth-User: user[m
[31m-    Auth-Pass: password[m
[31m-    Auth-Protocol: imap # imap/pop3/smtp[m
[31m-    Auth-Login-Attempt: 1[m
[31m-    Client-IP: 192.0.2.42[m
[31m-    Client-Host: client.example.org[m
[31m-[m
[31m-[m
[31m-Good response:[m
[31m-[m
[31m-    [m
[31m-    HTTP/1.0 200 OK[m
[31m-    Auth-Status: OK[m
[31m-    Auth-Server: 198.51.100.1[m
[31m-    Auth-Port: 143[m
[31m-[m
[31m-[m
[31m-Bad response:[m
[31m-[m
[31m-    [m
[31m-    HTTP/1.0 200 OK[m
[31m-    Auth-Status: Invalid login or password[m
[31m-    Auth-Wait: 3[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If there is no C<Auth-Wait> header,[m
[31m-an error will be returned and the connection will be closed.[m
[31m-The current implementation allocates memory for each authentication attempt.[m
[31m-The memory is freed only at the end of a session.[m
[31m-Therefore, the number of invalid authentication attempts in a single session[m
[31m-must be limited — the server must respond without[m
[31m-the C<Auth-Wait> header after 10-20 attempts[m
[31m-(the attempt number is passed in the C<Auth-Login-Attempt>[m
[31m-header).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When the APOP or CRAM-MD5 are used, request-response will look as follows:[m
[31m-[m
[31m-    [m
[31m-    GET /auth HTTP/1.0[m
[31m-    Host: localhost[m
[31m-    Auth-Method: apop[m
[31m-    Auth-User: user[m
[31m-    Auth-Salt: <238188073.1163692009@mail.example.com>[m
[31m-    Auth-Pass: auth_response[m
[31m-    Auth-Protocol: imap[m
[31m-    Auth-Login-Attempt: 1[m
[31m-    Client-IP: 192.0.2.42[m
[31m-    Client-Host: client.example.org[m
[31m-[m
[31m-[m
[31m-Good response:[m
[31m-[m
[31m-    [m
[31m-    HTTP/1.0 200 OK[m
[31m-    Auth-Status: OK[m
[31m-    Auth-Server: 198.51.100.1[m
[31m-    Auth-Port: 143[m
[31m-    Auth-Pass: plain-text-pass[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<Auth-User> header exists in the response,[m
[31m-it overrides the username used to authenticate with the backend.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the SMTP, the response additionally takes into account[m
[31m-the C<Auth-Error-Code> header — if exists, it is used[m
[31m-as a response code in case of an error.[m
[31m-Otherwise, the 535 5.7.0 code will be added to[m
[31m-the C<Auth-Status> header.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example, if the following response is received[m
[31m-from the authentication server:[m
[31m-[m
[31m-    [m
[31m-    HTTP/1.0 200 OK[m
[31m-    Auth-Status: Temporary server problem, try again later[m
[31m-    Auth-Error-Code: 451 4.3.0[m
[31m-    Auth-Wait: 3[m
[31m-[m
[31m-[m
[31m-then the SMTP client will receive an error[m
[31m-[m
[31m-    [m
[31m-    451 4.3.0 Temporary server problem, try again later[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If proxying SMTP does not require authentication,[m
[31m-the request will look as follows:[m
[31m-[m
[31m-    [m
[31m-    GET /auth HTTP/1.0[m
[31m-    Host: localhost[m
[31m-    Auth-Method: none[m
[31m-    Auth-User:[m
[31m-    Auth-Pass:[m
[31m-    Auth-Protocol: smtp[m
[31m-    Auth-Login-Attempt: 1[m
[31m-    Client-IP: 192.0.2.42[m
[31m-    Client-Host: client.example.org[m
[31m-    Auth-SMTP-Helo: client.example.org[m
[31m-    Auth-SMTP-From: MAIL FROM: <>[m
[31m-    Auth-SMTP-To: RCPT TO: <postmaster@mail.example.com>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For the SSLE<sol>TLS client connection (1.7.11),[m
[31m-the C<Auth-SSL> header is added, and[m
[31m-C<Auth-SSL-Verify> will contain[m
[31m-the result of client certificate verification, if[m
[31m-L<enabled|ngx_mail_ssl_module>:[m
[31m-“C<SUCCESS>”, “C<FAILED>”, and[m
[31m-“C<NONE>” if a certificate was not present.[m
[31m-When the client certificate was present,[m
[31m-its details are passed in the following request headers:[m
[31m-C<Auth-SSL-Subject>, C<Auth-SSL-Issuer>,[m
[31m-C<Auth-SSL-Serial>, and C<Auth-SSL-Fingerprint>.[m
[31m-If L</auth_http_pass_client_cert> is enabled,[m
[31m-the certificate itself is passed in the[m
[31m-C<Auth-SSL-Cert> header.[m
[31m-The request will look as follows:[m
[31m-[m
[31m-    [m
[31m-    GET /auth HTTP/1.0[m
[31m-    Host: localhost[m
[31m-    Auth-Method: plain[m
[31m-    Auth-User: user[m
[31m-    Auth-Pass: password[m
[31m-    Auth-Protocol: imap[m
[31m-    Auth-Login-Attempt: 1[m
[31m-    Client-IP: 192.0.2.42[m
[31m-    Auth-SSL: on[m
[31m-    Auth-SSL-Verify: SUCCESS[m
[31m-    Auth-SSL-Subject: /CN=example.com[m
[31m-    Auth-SSL-Issuer: /CN=example.com[m
[31m-    Auth-SSL-Serial: C07AD56B846B5BFF[m
[31m-    Auth-SSL-Fingerprint: 29d6a80a123d13355ed16b4b04605e29cb55a5ad[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_core_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_core_module.pod[m
[1mdeleted file mode 100644[m
[1mindex ffd7a4d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_core_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,553 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_core_module - Module ngx_mail_core_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be[m
[31m-enabled with[m
[31m-the C<--with-mail> configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    worker_processes 1;[m
[31m-    [m
[31m-    error_log /var/log/nginx/error.log info;[m
[31m-    [m
[31m-    events {[m
[31m-        worker_connections  1024;[m
[31m-    }[m
[31m-    [m
[31m-    mail {[m
[31m-        server_name       mail.example.com;[m
[31m-        auth_http         localhost:9000/cgi-bin/nginxauth.cgi;[m
[31m-    [m
[31m-        imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA;[m
[31m-    [m
[31m-        pop3_auth         plain apop cram-md5;[m
[31m-        pop3_capabilities LAST TOP USER PIPELINING UIDL;[m
[31m-    [m
[31m-        smtp_auth         login plain cram-md5;[m
[31m-        smtp_capabilities "SIZE 10485760" ENHANCEDSTATUSCODES 8BITMIME DSN;[m
[31m-        xclient           off;[m
[31m-    [m
[31m-        server {[m
[31m-            listen   25;[m
[31m-            protocol smtp;[m
[31m-        }[m
[31m-        server {[m
[31m-            listen   110;[m
[31m-            protocol pop3;[m
[31m-            proxy_pass_error_message on;[m
[31m-        }[m
[31m-        server {[m
[31m-            listen   143;[m
[31m-            protocol imap;[m
[31m-        }[m
[31m-        server {[m
[31m-            listen   587;[m
[31m-            protocol smtp;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 listen[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    I<C<address>>:I<C<port>>[m
[31m-    [C<ssl>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<bind>][m
[31m-    [C<ipv6only>=C<on>E<verbar>C<off>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<address>> and I<C<port>> for the socket[m
[31m-on which the server will accept requests.[m
[31m-It is possible to specify just the port.[m
[31m-The address can also be a hostname, for example:[m
[31m-[m
[31m-    [m
[31m-    listen 127.0.0.1:110;[m
[31m-    listen *:110;[m
[31m-    listen 110;     # same as *:110[m
[31m-    listen localhost:110;[m
[31m-[m
[31m-[m
[31m-IPv6 addresses (0.7.58) are specified in square brackets:[m
[31m-[m
[31m-    [m
[31m-    listen [::1]:110;[m
[31m-    listen [::]:110;[m
[31m-[m
[31m-[m
[31m-UNIX-domain sockets (1.3.5) are specified with the “C<unix:>”[m
[31m-prefix:[m
[31m-[m
[31m-    [m
[31m-    listen unix:/var/run/nginx.sock;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Different servers must listen on different[m
[31m-I<C<address>>:I<C<port>> pairs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ssl> parameter allows specifying that all[m
[31m-connections accepted on this port should work in SSL mode.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<listen> directive[m
[31m-can have several additional parameters specific to socket-related system calls.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backlog>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the C<backlog> parameter in the[m
[31m-C<listen> call that limits[m
[31m-the maximum length for the queue of pending connections (1.9.2).[m
[31m-By default,[m
[31m-C<backlog> is set to -1 on FreeBSD, DragonFly BSD, and Mac OS X,[m
[31m-and to 511 on other platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<bind>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter instructs to make a separate C<bind>[m
[31m-call for a given address:port pair.[m
[31m-The fact is that if there are several C<listen> directives with[m
[31m-the same port but different addresses, and one of the[m
[31m-C<listen> directives listens on all addresses[m
[31m-for the given port (C<*:>I<C<port>>), nginx will[m
[31m-C<bind> only to C<*:>I<C<port>>.[m
[31m-It should be noted that the C<getsockname> system call will be[m
[31m-made in this case to determine the address that accepted the connection.[m
[31m-If the C<ipv6only>[m
[31m-or C<so_keepalive> parameters[m
[31m-are used then for a given[m
[31m-I<C<address>>:I<C<port>> pair[m
[31m-a separate C<bind> call will always be made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<ipv6only>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter determines[m
[31m-(via the C<IPV6_V6ONLY> socket option)[m
[31m-whether an IPv6 socket listening on a wildcard address C<[::]>[m
[31m-will accept only IPv6 connections or both IPv6 and IPv4 connections.[m
[31m-This parameter is turned on by default.[m
[31m-It can only be set once on start.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter configures the “TCP keepalive” behavior[m
[31m-for the listening socket.[m
[31m-If this parameter is omitted then the operating system’s settings will be[m
[31m-in effect for the socket.[m
[31m-If it is set to the value “C<on>”, the[m
[31m-C<SO_KEEPALIVE> option is turned on for the socket.[m
[31m-If it is set to the value “C<off>”, the[m
[31m-C<SO_KEEPALIVE> option is turned off for the socket.[m
[31m-Some operating systems support setting of TCP keepalive parameters on[m
[31m-a per-socket basis using the C<TCP_KEEPIDLE>,[m
[31m-C<TCP_KEEPINTVL>, and C<TCP_KEEPCNT> socket options.[m
[31m-On such systems (currently, Linux 2.4+, NetBSD 5+, and[m
[31m-FreeBSD 9.0-STABLE), they can be configured[m
[31m-using the I<C<keepidle>>, I<C<keepintvl>>, and[m
[31m-I<C<keepcnt>> parameters.[m
[31m-One or two parameters may be omitted, in which case the system default setting[m
[31m-for the corresponding socket option will be in effect.[m
[31m-For example,[m
[31m-[m
[31m-    so_keepalive=30m::10[m
[31m-[m
[31m-will set the idle timeout (C<TCP_KEEPIDLE>) to 30 minutes,[m
[31m-leave the probe interval (C<TCP_KEEPINTVL>) at its system default,[m
[31m-and set the probes count (C<TCP_KEEPCNT>) to 10 probes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 mail[m
[31m-[m
[31m-[m
[31m-mail { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Provides the configuration file context in which the mail server directives[m
[31m-are specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 protocol[m
[31m-[m
[31m-[m
[31m-B<syntax:> protocol I<[m
[31m-  C<imap> E<verbar>[m
[31m-  C<pop3> E<verbar>[m
[31m-  C<smtp>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the protocol for a proxied server.[m
[31m-Supported protocols are[m
[31m-L<IMAP|ngx_mail_imap_module>,[m
[31m-L<POP3|ngx_mail_pop3_module>, and[m
[31m-L<SMTP|ngx_mail_smtp_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is not set, the protocol can be detected automatically[m
[31m-based on the well-known port specified in the L</listen>[m
[31m-directive:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<imap>: 143, 993[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<pop3>: 110, 995[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<smtp>: 25, 587, 465[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Unnecessary protocols can be disabled using the[m
[31m-L<configuration|configure>[m
[31m-parameters C<--without-mail_imap_module>,[m
[31m-C<--without-mail_pop3_module>, and[m
[31m-C<--without-mail_smtp_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver I<[m
[31m-I<C<address>> ...[m
[31m-[C<valid>=I<C<time>>]>[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver I<C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures name servers used to find the client’s hostname[m
[31m-to pass it to the[m
[31m-L<authentication server|ngx_mail_auth_http_module>,[m
[31m-and in the[m
[31m-L<XCLIENT|ngx_mail_proxy_module>[m
[31m-command when proxying SMTP.[m
[31m-For example:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353;[m
[31m-[m
[31m-[m
[31m-An address can be specified as a domain name or IP address,[m
[31m-and an optional port (1.3.1, 1.2.2).[m
[31m-If port is not specified, the port 53 is used.[m
[31m-Name servers are queried in a round-robin fashion.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.7, only a single name server could be configured.[m
[31m-Specifying name servers using IPv6 addresses is supported[m
[31m-starting from versions 1.3.1 and 1.2.2.[m
[31m-[m
[31m-By default, nginx caches answers using the TTL value of a response.[m
[31m-An optional C<valid> parameter allows overriding it:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353 valid=30s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Before version 1.1.9, tuning of caching time was not possible,[m
[31m-and nginx always cached answers for the duration of 5 minutes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<off> disables resolving.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for DNS operations, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-server { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the configuration for a server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> server_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<hostname>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the server name that is used:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-in the initial POP3E<sol>SMTP server greeting;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-in the salt during the SASL CRAM-MD5 authentication;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-in the C<EHLO> command when connecting to the SMTP backend,[m
[31m-if the passing of the[m
[31m-L<XCLIENT|ngx_mail_proxy_module> command[m
[31m-is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the directive is not specified, the machine’s hostname is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the timeout that is used before proxying to the backend starts.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_imap_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_imap_module.pod[m
[1mdeleted file mode 100644[m
[1mindex b50c10a..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_imap_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,153 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_imap_module - Module ngx_mail_imap_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 imap_auth[m
[31m-[m
[31m-[m
[31m-B<syntax:> imap_auth I<I<C<method>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<plain>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets permitted methods of authentication for IMAP clients.[m
[31m-Supported methods are:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<login>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH=LOGIN|http://tools.ietf.org/html/draft-murchison-sasl-login-00>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<plain>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH=PLAIN|http://tools.ietf.org/html/rfc4616>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<cram-md5>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH=CRAM-MD5|http://tools.ietf.org/html/rfc2195>.[m
[31m-In order for this method to work, the password must be stored unencrypted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 imap_capabilities[m
[31m-[m
[31m-[m
[31m-B<syntax:> imap_capabilities I<I<C<extension>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<IMAP4 IMAP4rev1 UIDPLUS>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the[m
[31m-L<IMAP protocol|http://tools.ietf.org/html/rfc3501>[m
[31m-extensions list that is passed to the client in response to[m
[31m-the C<CAPABILITY> command.[m
[31m-The authentication methods specified in the L</imap_auth> and[m
[31m-L<STARTTLS|http://tools.ietf.org/html/rfc2595> directives[m
[31m-are automatically added to this list if the[m
[31m-L<ngx_mail_ssl_module> directive is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It makes sense to specify the extensions[m
[31m-supported by the IMAP backends[m
[31m-to which the clients are proxied (if these extensions are related to commands[m
[31m-used after the authentication, when nginx transparently proxies a client[m
[31m-connection to the backend).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current list of standardized extensions is published at[m
[31m-L<www.iana.org|http://www.iana.org/assignments/imap4-capabilities>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 imap_client_buffer[m
[31m-[m
[31m-[m
[31m-B<syntax:> imap_client_buffer I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the IMAP commands read buffer size.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-This is either 4K or 8K, depending on a platform.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_pop3_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_pop3_module.pod[m
[1mdeleted file mode 100644[m
[1mindex df24f39..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_pop3_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_pop3_module - Module ngx_mail_pop3_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 pop3_auth[m
[31m-[m
[31m-[m
[31m-B<syntax:> pop3_auth I<I<C<method>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<plain>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets permitted methods of authentication for POP3 clients.[m
[31m-Supported methods are:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<plain>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<USERE<sol>PASS|http://tools.ietf.org/html/rfc1939>,[m
[31m-L<AUTH PLAIN|http://tools.ietf.org/html/rfc4616>,[m
[31m-L<AUTH LOGIN|http://tools.ietf.org/html/draft-murchison-sasl-login-00>.[m
[31m-It is not possible to disable these methods.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<apop>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<APOP|http://tools.ietf.org/html/rfc1939>.[m
[31m-In order for this method to work, the password must be stored unencrypted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<cram-md5>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH CRAM-MD5|http://tools.ietf.org/html/rfc2195>.[m
[31m-In order for this method to work, the password must be stored unencrypted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 pop3_capabilities[m
[31m-[m
[31m-[m
[31m-B<syntax:> pop3_capabilities I<I<C<extension>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TOP USER UIDL>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the[m
[31m-L<POP3 protocol|http://tools.ietf.org/html/rfc2449>[m
[31m-extensions list that is passed to the client in response to[m
[31m-the C<CAPA> command.[m
[31m-[m
[31m-The authentication methods specified in the L</pop3_auth> and[m
[31m-(L<SASL|http://tools.ietf.org/html/rfc2449> extension) and[m
[31m-L<STLS|http://tools.ietf.org/html/rfc2595> directives,[m
[31m-are automatically added to this list if the[m
[31m-L<ngx_mail_ssl_module> directive is enabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It makes sense to specify the extensions[m
[31m-supported by the POP3 backends[m
[31m-to which the clients are proxied (if these extensions are related to commands[m
[31m-used after the authentication, when nginx transparently proxies the client[m
[31m-connection to the backend).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current list of standardized extensions is published at[m
[31m-L<www.iana.org|http://www.iana.org/assignments/pop3-extension-mechanism>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_proxy_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_proxy_module.pod[m
[1mdeleted file mode 100644[m
[1mindex fa1f6f1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_proxy_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,211 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_proxy_module - Module ngx_mail_proxy_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 proxy_buffer[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffer I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<4kE<verbar>8k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the size of the buffer used for proxying.[m
[31m-By default, the buffer size is equal to one memory page.[m
[31m-Depending on a platform, it is either 4K or 8K.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass_error_message[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass_error_message I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Indicates whether to pass the error message obtained during[m
[31m-the authentication on the backend to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Usually, if the authentication in nginx is a success,[m
[31m-the backend cannot return an error.[m
[31m-If it nevertheless returns an error,[m
[31m-it means some internal error has occurred.[m
[31m-In such case the backend message can contain information[m
[31m-that should not be shown to the client.[m
[31m-However, responding with an error for the correct password[m
[31m-is a normal behavior for some POP3 servers.[m
[31m-For example, CommuniGatePro informs a user about[m
[31m-L<mailbox[m
[31m-overflow|http://www.stalker.com/CommuniGatePro/Alerts.html#Quota> or other events by periodically outputting the[m
[31m-L<authentication[m
[31m-error|http://www.stalker.com/CommuniGatePro/POP.html#Alerts>.[m
[31m-The directive should be enabled in this case.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_timeout I<I<C<timeout>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<24h>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<timeout>> between two successive[m
[31m-read or write operations on client or proxied server connections.[m
[31m-If no data is transmitted within this time, the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 xclient[m
[31m-[m
[31m-[m
[31m-B<syntax:> xclient I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the passing of the[m
[31m-L<XCLIENT|http://www.postfix.org/XCLIENT_README.html>[m
[31m-command with client parameters when connecting to the SMTP backend.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-With C<XCLIENT>, the MTA is able to write client information[m
[31m-to the log and apply various limitations based on this data.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<XCLIENT> is enabled[m
[31m-then nginx passes the following commands when connecting to the backend:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<EHLO> with the[m
[31m-L<server name|ngx_mail_core_module>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<[m
[31m-XCLIENT[m
[31m->[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<EHLO> or C<HELO>,[m
[31m-as passed by the client[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the name[m
[31m-L<found|ngx_mail_core_module>[m
[31m-by the client IP address points to the same address,[m
[31m-it is passed in the C<NAME> parameter[m
[31m-of the C<XCLIENT> command.[m
[31m-If the name could not be found, points to a different address,[m
[31m-or L<ngx_mail_core_module> is not specified,[m
[31m-the C<[UNAVAILABLE]> is passed[m
[31m-in the C<NAME> parameter.[m
[31m-If an error has occurred in the process of resolving,[m
[31m-the C<[TEMPUNAVAIL]> value is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If C<XCLIENT> is disabled[m
[31m-then nginx passes the C<EHLO> command with the[m
[31m-L<server name|ngx_mail_core_module>[m
[31m-when connecting to the backend if the client has passed[m
[31m-C<EHLO>,[m
[31m-or C<HELO> with the server name, otherwise.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_smtp_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_smtp_module.pod[m
[1mdeleted file mode 100644[m
[1mindex c13f764..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_smtp_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,131 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_smtp_module - Module ngx_mail_smtp_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 smtp_auth[m
[31m-[m
[31m-[m
[31m-B<syntax:> smtp_auth I<I<C<method>> ...>[m
[31m-[m
[31m-[m
[31m-B<default:> I<login plain>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets permitted methods of[m
[31m-L<SASL authentication|http://tools.ietf.org/html/rfc2554>[m
[31m-for SMTP clients.[m
[31m-Supported methods are:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<login>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH LOGIN|http://tools.ietf.org/html/draft-murchison-sasl-login-00>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<plain>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH PLAIN|http://tools.ietf.org/html/rfc4616>[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<cram-md5>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<AUTH CRAM-MD5|http://tools.ietf.org/html/rfc2195>.[m
[31m-In order for this method to work, the password must be stored unencrypted.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Authentication is not required.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 smtp_capabilities[m
[31m-[m
[31m-[m
[31m-B<syntax:> smtp_capabilities I<I<C<extension>> ...>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the SMTP protocol extensions list[m
[31m-that is passed to the client in response to the[m
[31m-C<EHLO> command.[m
[31m-Authentication methods specified in the L</smtp_auth> directive[m
[31m-are automatically added to this list.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-It makes sense to specify the extensions[m
[31m-supported by the MTA[m
[31m-to which the clients are proxied (if these extensions are related to commands[m
[31m-used after the authentication, when nginx transparently proxies the client[m
[31m-connection to the backend).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The current list of standardized extensions is published at[m
[31m-L<www.iana.org|http://www.iana.org/assignments/mail-parameters>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_ssl_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_ssl_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 88121b7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_mail_ssl_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,933 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_mail_ssl_module - Module ngx_mail_ssl_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_mail_ssl_module> module provides the necessary[m
[31m-support for a mail proxy server to work with the SSLE<sol>TLS protocol.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-This module is not built by default, it should be enabled with[m
[31m-the C<--with-mail_ssl_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This module requires the L<OpenSSL|http://www.openssl.org>[m
[31m-library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-To reduce the processor load, it is recommended to[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-set the number of worker processes equal to the number of processors,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-enable the shared session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-disable the built-in session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and possibly increase the session lifetime (by default, 5 minutes):[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    <emphasis>worker_processes auto;</emphasis>[m
[31m-    [m
[31m-    mail {[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            listen              993 ssl;[m
[31m-    [m
[31m-            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-            ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;[m
[31m-            ssl_certificate     /usr/local/nginx/conf/cert.pem;[m
[31m-            ssl_certificate_key /usr/local/nginx/conf/cert.key;[m
[31m-            <emphasis>ssl_session_cache   shared:SSL:10m;</emphasis>[m
[31m-            <emphasis>ssl_session_timeout 10m;</emphasis>[m
[31m-    [m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ssl[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the SSLE<sol>TLS protocol for the given server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-for the given server.[m
[31m-If intermediate certificates should be specified in addition to a primary[m
[31m-certificate, they should be specified in the same file in the following[m
[31m-order: the primary certificate comes first, then the intermediate certificates.[m
[31m-A secret key in the PEM format may be placed in the same file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-for the given server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>> (1.7.9),[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<HIGH:!aNULL:!MD5>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers.[m
[31m-The ciphers are specified in the format understood by the[m
[31m-OpenSSL library, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The previous versions of nginx used[m
[31m-L<different|configuring_https_servers>[m
[31m-ciphers by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_client_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_client_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify client certificates.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The list of certificates will be sent to clients.[m
[31m-If this is not desired, the L</ssl_trusted_certificate>[m
[31m-directive can be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-client certificates.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_dhparam[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_dhparam I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 0.7.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with DH parameters for DHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ecdh_curve[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ecdh_curve I<I<C<curve>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<auto>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.1.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.0.6.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<curve>> for ECDHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using OpenSSL 1.0.2 or higher,[m
[31m-it is possible to specify multiple curves (1.11.0), for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ecdh_curve prime256v1:secp384r1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<auto> (1.11.0) instructs nginx to use[m
[31m-a list built into the OpenSSL library when using OpenSSL 1.0.2 or higher,[m
[31m-or C<prime256v1> with older versions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.11.0,[m
[31m-the C<prime256v1> curve was used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    mail {[m
[31m-        ssl_password_file /etc/keys/global.pass;[m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            server_name mail1.example.com;[m
[31m-            ssl_certificate_key /etc/keys/first.key;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            server_name mail2.example.com;[m
[31m-    [m
[31m-            # named pipe can also be used instead of a file[m
[31m-            ssl_password_file /etc/keys/fifo;[m
[31m-            ssl_certificate_key /etc/keys/second.key;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_prefer_server_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_prefer_server_ciphers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that server ciphers should be preferred over client ciphers[m
[31m-when the SSLv3 and TLS protocols are used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols.[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters work[m
[31m-only when the OpenSSL library of version 1.0.1 or higher is used.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters are[m
[31m-supported starting from versions 1.1.13 and 1.0.12[m
[31m-so when the OpenSSL version 1.0.1 or higher[m
[31m-is used on older nginx versions, these protocols work, but cannot[m
[31m-be disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_cache I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<none> E<verbar>[m
[31m-    [C<builtin>[:I<C<size>>]][m
[31m-    [C<shared>:I<C<name>>:I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the types and sizes of caches that store session parameters.[m
[31m-A cache can be of any of the following types:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is strictly prohibited:[m
[31m-nginx explicitly tells a client that sessions may not be reused.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is gently disallowed:[m
[31m-nginx tells a client that sessions may be reused, but does not[m
[31m-actually store session parameters in the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<builtin>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache built in OpenSSL; used by one worker process only.[m
[31m-The cache size is specified in sessions.[m
[31m-If size is not given, it is equal to 20480 sessions.[m
[31m-Use of the built-in cache can cause memory fragmentation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<shared>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache shared between all worker processes.[m
[31m-The cache size is specified in bytes; one megabyte can store[m
[31m-about 4000 sessions.[m
[31m-Each shared cache should have an arbitrary name.[m
[31m-A cache with the same name can be used in several[m
[31m-servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Both cache types can be used simultaneously, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_cache builtin:1000 shared:SSL:10m;[m
[31m-[m
[31m-[m
[31m-but using only shared cache without the built-in cache should[m
[31m-be more efficient.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_ticket_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_ticket_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<file>> with the secret key used to encrypt[m
[31m-and decrypt TLS session tickets.[m
[31m-The directive is necessary if the same key has to be shared between[m
[31m-multiple servers.[m
[31m-By default, a randomly generated key is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several keys are specified, only the first key is[m
[31m-used to encrypt TLS session tickets.[m
[31m-This allows configuring key rotation, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_ticket_key current.key;[m
[31m-    ssl_session_ticket_key previous.key;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<file>> must contain 48 bytes of random data and can[m
[31m-be created using the following command:[m
[31m-[m
[31m-    [m
[31m-    openssl rand 48 > ticket.key[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_tickets[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_tickets I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.5.9.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables session resumption through[m
[31m-L<TLS session tickets|http://tools.ietf.org/html/rfc5077>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a time during which a client may reuse the[m
[31m-session parameters stored in a cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify client certificates.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In contrast to the certificate set by L</ssl_client_certificate>,[m
[31m-the list of these certificates will not be sent to clients.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_verify_client[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_verify_client I<[m
[31m-    C<on> E<verbar> C<off> E<verbar>[m
[31m-    C<optional> E<verbar> C<optional_no_ca>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables verification of client certificates.[m
[31m-The verification result is passed in the[m
[31m-C<Auth-SSL-Verify> header of the[m
[31m-L<authentication|ngx_mail_auth_http_module>[m
[31m-request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<optional> parameter requests the client[m
[31m-certificate and verifies it if the certificate is present.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<optional_no_ca> parameter[m
[31m-requests the client[m
[31m-certificate but does not require it to be signed by a trusted CA certificate.[m
[31m-This is intended for the use in cases when a service that is external to nginx[m
[31m-performs the actual certificate verification.[m
[31m-The contents of the certificate is accessible through requests[m
[31m-L<sent|ngx_mail_auth_http_module>[m
[31m-to the authentication server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.7.11.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the client certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 starttls[m
[31m-[m
[31m-[m
[31m-B<syntax:> starttls I<[m
[31m-  C<on> E<verbar>[m
[31m-  C<off> E<verbar>[m
[31m-  C<only>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<mail>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<on>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-allow usage of the C<STLS> command for the POP3[m
[31m-and the C<STARTTLS> command for the IMAP;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-deny usage of the C<STLS>[m
[31m-and C<STARTTLS> commands;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<only>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-require preliminary TLS transition.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_access_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_access_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 9880032..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_access_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,111 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_access_module - Module ngx_stream_access_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_access_module> module (1.9.2) allows[m
[31m-limiting access to certain client addresses.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        deny  192.168.1.1;[m
[31m-        allow 192.168.1.0/24;[m
[31m-        allow 10.1.1.0/16;[m
[31m-        allow 2001:0db8::/32;[m
[31m-        deny  all;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The rules are checked in sequence until the first match is found.[m
[31m-In this example, access is allowed only for IPv4 networks[m
[31m-C<10.1.1.0E<sol>16> and C<192.168.1.0E<sol>24>[m
[31m-excluding the address C<192.168.1.1>,[m
[31m-and for IPv6 network C<2001:0db8::E<sol>32>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 allow[m
[31m-[m
[31m-[m
[31m-B<syntax:> allow I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:> E<verbar>[m
[31m-    C<all>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows access for the specified network or address.[m
[31m-If the special value C<unix:> is specified,[m
[31m-allows access for all UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 deny[m
[31m-[m
[31m-[m
[31m-B<syntax:> deny I<[m
[31m-    I<C<address>> E<verbar>[m
[31m-    I<C<CIDR>> E<verbar>[m
[31m-    C<unix:> E<verbar>[m
[31m-    C<all>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Denies access for the specified network or address.[m
[31m-If the special value C<unix:> is specified,[m
[31m-denies access for all UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_core_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_core_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 6acea88..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_core_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,454 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_core_module - Module ngx_stream_core_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_core_module> module[m
[31m-is available since version 1.9.0.[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-stream>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    worker_processes auto;[m
[31m-    [m
[31m-    error_log /var/log/nginx/error.log info;[m
[31m-    [m
[31m-    events {[m
[31m-        worker_connections  1024;[m
[31m-    }[m
[31m-    [m
[31m-    stream {[m
[31m-        upstream backend {[m
[31m-            hash $remote_addr consistent;[m
[31m-    [m
[31m-            server backend1.example.com:12345 weight=5;[m
[31m-            server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;[m
[31m-            server unix:/tmp/backend3;[m
[31m-        }[m
[31m-    [m
[31m-        upstream dns {[m
[31m-           server 192.168.0.1:53535;[m
[31m-           server dns.example.com:53;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 12345;[m
[31m-            proxy_connect_timeout 1s;[m
[31m-            proxy_timeout 3s;[m
[31m-            proxy_pass backend;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 127.0.0.1:53 udp;[m
[31m-            proxy_responses 1;[m
[31m-            proxy_timeout 20s;[m
[31m-            proxy_pass dns;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen [::1]:12345;[m
[31m-            proxy_pass unix:/tmp/stream.socket;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 listen[m
[31m-[m
[31m-[m
[31m-B<syntax:> listen I<[m
[31m-    I<C<address>>:I<C<port>>[m
[31m-    [C<ssl>][m
[31m-    [C<udp>][m
[31m-    [C<backlog>=I<C<number>>][m
[31m-    [C<bind>][m
[31m-    [C<ipv6only>=C<on>E<verbar>C<off>][m
[31m-    [C<reuseport>][m
[31m-    [C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>]]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<address>> and I<C<port>> for the socket[m
[31m-on which the server will accept connections.[m
[31m-It is possible to specify just the port.[m
[31m-The address can also be a hostname, for example:[m
[31m-[m
[31m-    [m
[31m-    listen 127.0.0.1:12345;[m
[31m-    listen *:12345;[m
[31m-    listen 12345;     # same as *:12345[m
[31m-    listen localhost:12345;[m
[31m-[m
[31m-[m
[31m-IPv6 addresses are specified in square brackets:[m
[31m-[m
[31m-    [m
[31m-    listen [::1]:12345;[m
[31m-    listen [::]:12345;[m
[31m-[m
[31m-[m
[31m-UNIX-domain sockets are specified with the “C<unix:>”[m
[31m-prefix:[m
[31m-[m
[31m-    [m
[31m-    listen unix:/var/run/nginx.sock;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ssl> parameter allows specifying that all[m
[31m-connections accepted on this port should work in SSL mode.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<udp> parameter configures a listening socket[m
[31m-for working with datagrams (1.9.13).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<listen> directive[m
[31m-can have several additional parameters specific to socket-related system calls.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backlog>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the C<backlog> parameter in the[m
[31m-C<listen> call that limits[m
[31m-the maximum length for the queue of pending connections (1.9.2).[m
[31m-By default,[m
[31m-C<backlog> is set to -1 on FreeBSD, DragonFly BSD, and Mac OS X,[m
[31m-and to 511 on other platforms.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<bind>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter instructs to make a separate C<bind>[m
[31m-call for a given address:port pair.[m
[31m-The fact is that if there are several C<listen> directives with[m
[31m-the same port but different addresses, and one of the[m
[31m-C<listen> directives listens on all addresses[m
[31m-for the given port (C<*:>I<C<port>>), nginx will[m
[31m-C<bind> only to C<*:>I<C<port>>.[m
[31m-It should be noted that the C<getsockname> system call will be[m
[31m-made in this case to determine the address that accepted the connection.[m
[31m-If the C<ipv6only>[m
[31m-or C<so_keepalive> parameters[m
[31m-are used then for a given[m
[31m-I<C<address>>:I<C<port>> pair[m
[31m-a separate C<bind> call will always be made.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<ipv6only>=C<on>E<verbar>C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter determines[m
[31m-(via the C<IPV6_V6ONLY> socket option)[m
[31m-whether an IPv6 socket listening on a wildcard address C<[::]>[m
[31m-will accept only IPv6 connections or both IPv6 and IPv4 connections.[m
[31m-This parameter is turned on by default.[m
[31m-It can only be set once on start.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<reuseport>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter (1.9.1) instructs to create an individual listening socket[m
[31m-for each worker process[m
[31m-(using the C<SO_REUSEPORT> socket option), allowing a kernel[m
[31m-to distribute incoming connections between worker processes.[m
[31m-This currently works only on Linux 3.9+ and DragonFly BSD.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Inappropriate use of this option may have its security[m
[31m-L<implications|http://man7.org/linux/man-pages/man7/socket.7.html>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<so_keepalive>=C<on>E<verbar>C<off>E<verbar>[I<C<keepidle>>]:[I<C<keepintvl>>]:[I<C<keepcnt>>][m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-this parameter configures the “TCP keepalive” behavior[m
[31m-for the listening socket.[m
[31m-If this parameter is omitted then the operating system’s settings will be[m
[31m-in effect for the socket.[m
[31m-If it is set to the value “C<on>”, the[m
[31m-C<SO_KEEPALIVE> option is turned on for the socket.[m
[31m-If it is set to the value “C<off>”, the[m
[31m-C<SO_KEEPALIVE> option is turned off for the socket.[m
[31m-Some operating systems support setting of TCP keepalive parameters on[m
[31m-a per-socket basis using the C<TCP_KEEPIDLE>,[m
[31m-C<TCP_KEEPINTVL>, and C<TCP_KEEPCNT> socket options.[m
[31m-On such systems (currently, Linux 2.4+, NetBSD 5+, and[m
[31m-FreeBSD 9.0-STABLE), they can be configured[m
[31m-using the I<C<keepidle>>, I<C<keepintvl>>, and[m
[31m-I<C<keepcnt>> parameters.[m
[31m-One or two parameters may be omitted, in which case the system default setting[m
[31m-for the corresponding socket option will be in effect.[m
[31m-For example,[m
[31m-[m
[31m-    so_keepalive=30m::10[m
[31m-[m
[31m-will set the idle timeout (C<TCP_KEEPIDLE>) to 30 minutes,[m
[31m-leave the probe interval (C<TCP_KEEPINTVL>) at its system default,[m
[31m-and set the probes count (C<TCP_KEEPCNT>) to 10 probes.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Different servers must listen on different[m
[31m-I<C<address>>:I<C<port>> pairs.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver I<[m
[31m-    I<C<address>> ...[m
[31m-    [C<valid>=I<C<time>>][m
[31m-    [C<ipv6>=C<on>E<verbar>C<off>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Configures name servers used to resolve names of upstream servers[m
[31m-into addresses, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353;[m
[31m-[m
[31m-[m
[31m-An address can be specified as a domain name or IP address,[m
[31m-and an optional port.[m
[31m-If port is not specified, the port 53 is used.[m
[31m-Name servers are queried in a round-robin fashion.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, nginx will look up both IPv4 and IPv6 addresses while resolving.[m
[31m-If looking up of IPv6 addresses is not desired,[m
[31m-the C<ipv6=off> parameter can be specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, nginx caches answers using the TTL value of a response.[m
[31m-The optional C<valid> parameter allows overriding it:[m
[31m-[m
[31m-    [m
[31m-    resolver 127.0.0.1 [::1]:5353 valid=30s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 resolver_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> resolver_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<30s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a timeout for name resolution, for example:[m
[31m-[m
[31m-    [m
[31m-    resolver_timeout 5s;[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-server { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the configuration for a server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 stream[m
[31m-[m
[31m-[m
[31m-stream { B<...> }[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<main>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Provides the configuration file context in which the stream server directives[m
[31m-are specified.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 tcp_nodelay[m
[31m-[m
[31m-[m
[31m-B<syntax:> tcp_nodelay I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables the use of the C<TCP_NODELAY> option.[m
[31m-The option is enabled for both client and proxied server connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_limit_conn_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_limit_conn_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 113becd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_limit_conn_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,177 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_limit_conn_module - Module ngx_stream_limit_conn_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_limit_conn_module> module (1.9.3) is used to[m
[31m-limit the number of connections per the defined key, in[m
[31m-particular, the number of connections from a single IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    stream {[m
[31m-        limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-    [m
[31m-            ...[m
[31m-    [m
[31m-            limit_conn           addr 1;[m
[31m-            limit_conn_log_level error;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 limit_conn[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn I<I<C<zone>> I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the shared memory zone[m
[31m-and the maximum allowed number of connections for a given key value.[m
[31m-When this limit is exceeded, the server will close the connection.[m
[31m-For example, the directives[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-    [m
[31m-    server {[m
[31m-        ...[m
[31m-        limit_conn addr 1;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-allow only one connection per an IP address at a time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When several C<limit_conn> directives are specified,[m
[31m-any configured limit will apply.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The directives are inherited from the previous level if and[m
[31m-only if there are no[m
[31m-C<limit_conn>[m
[31m-directives on the current level.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_log_level[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_log_level I<[m
[31m-C<info> E<verbar>[m
[31m-C<notice> E<verbar>[m
[31m-C<warn> E<verbar>[m
[31m-C<error>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<error>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the desired logging level for cases when the server[m
[31m-limits the number of connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 limit_conn_zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> limit_conn_zone I<[m
[31m-    I<C<key>>[m
[31m-    C<zone>=I<C<name>>:I<C<size>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets parameters for a shared memory zone[m
[31m-that will keep states for various keys.[m
[31m-In particular, the state includes the current number of connections.[m
[31m-Currently, the supported value for the I<C<key>> is[m
[31m-the client address in the binary form specified as[m
[31m-C<$binary_remote_addr>.[m
[31m-Connections with an empty key value are not accounted.[m
[31m-Usage example:[m
[31m-[m
[31m-    [m
[31m-    limit_conn_zone $binary_remote_addr zone=addr:10m;[m
[31m-[m
[31m-[m
[31m-Here, the key is a client IP address set by the[m
[31m-C<$binary_remote_addr> key.[m
[31m-The size of C<$binary_remote_addr>[m
[31m-is 4 bytes for IPv4 addresses or 16 bytes for IPv6 addresses.[m
[31m-The stored state always occupies 32 or 64 bytes[m
[31m-on 32-bit platforms and 64 bytes on 64-bit platforms.[m
[31m-One megabyte zone can keep about 32 thousand 32-byte states[m
[31m-or about 16 thousand 64-byte states.[m
[31m-If the zone storage is exhausted, the server will close the connection.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_proxy_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_proxy_module.pod[m
[1mdeleted file mode 100644[m
[1mindex fc4fdc7..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_proxy_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,832 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_proxy_module - Module ngx_stream_proxy_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_proxy_module> module (1.9.0) allows proxying[m
[31m-data streams over TCP, UDP (1.9.13), and UNIX-domain sockets.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen 127.0.0.1:12345;[m
[31m-        proxy_pass 127.0.0.1:8080;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen 12345;[m
[31m-        proxy_connect_timeout 1s;[m
[31m-        proxy_timeout 1m;[m
[31m-        proxy_pass example.com:12345;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen 53 udp;[m
[31m-        proxy_responses 1;[m
[31m-        proxy_timeout 20s;[m
[31m-        proxy_pass dns.example.com:53;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen [::1]:12345;[m
[31m-        proxy_pass unix:/tmp/stream.socket;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 proxy_bind[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_bind I<I<C<address>> [transparent] E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Makes outgoing connections to a proxied server originate[m
[31m-from the specified local IP I<C<address>>.[m
[31m-The special value C<off> cancels the effect[m
[31m-of the C<proxy_bind> directive[m
[31m-inherited from the previous configuration level, which allows the[m
[31m-system to auto-assign the local IP address.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<transparent> parameter (1.11.0) allows[m
[31m-outgoing connections to a proxied server originate[m
[31m-from a non-local IP address,[m
[31m-for example, from a real IP address of a client:[m
[31m-[m
[31m-    [m
[31m-    proxy_bind $remote_addr transparent;[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-it is necessary to run nginx worker processes with the[m
[31m-L<superuser|ngx_core_module> privileges[m
[31m-and configure kernel routing table[m
[31m-to intercept network traffic from the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_buffer_size[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_buffer_size I<I<C<size>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<16k>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<size>> of the buffer used for reading data[m
[31m-from the proxied server.[m
[31m-Also sets the I<C<size>> of the buffer used for reading data[m
[31m-from the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_connect_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_connect_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a timeout for establishing a connection with a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_download_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_download_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the data from the proxied server.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a connection, so if nginx simultaneously opens[m
[31m-two connections to the proxied server,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When a connection to the proxied server cannot be established, determines[m
[31m-whether a client connection will be passed to the next server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Passing a connection to the next server can be limited by[m
[31m-the number of tries[m
[31m-and by time.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the time allowed to pass a connection to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_next_upstream_tries[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_next_upstream_tries I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the number of possible tries for passing a connection to the[m
[31m-next server.[m
[31m-The C<0> value turns off this limitation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_pass[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_pass I<I<C<address>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the address of a proxied server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-and a port:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass localhost:12345;[m
[31m-[m
[31m-[m
[31m-or as a UNIX-domain socket path:[m
[31m-[m
[31m-    [m
[31m-    proxy_pass unix:/tmp/stream.socket;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a domain name resolves to several addresses, all of them will be[m
[31m-used in a round-robin fashion.[m
[31m-In addition, an address can be specified as a[m
[31m-L<server group|ngx_stream_upstream_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_protocol[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_protocol I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.2.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the[m
[31m-L<PROXY[m
[31m-protocol|http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt> for connections to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_responses[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_responses I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the number of datagrams expected from the proxied server[m
[31m-in response to the client request[m
[31m-if the L<UDP|ngx_stream_core_module>[m
[31m-protocol is used.[m
[31m-By default, the number of datagrams is not limited:[m
[31m-the response datagrams will be sent[m
[31m-until the L</proxy_timeout> value expires.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the SSLE<sol>TLS protocol for connections to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-used for authentication to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-used for authentication to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<DEFAULT>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers for connections to a proxied server.[m
[31m-The ciphers are specified in the format understood by the OpenSSL library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_crl[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_crl I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with revoked certificates (CRL)[m
[31m-in the PEM format used to verify[m
[31m-the certificate of the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_name I<I<C<name>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<host from proxy_pass>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Allows overriding the server name used to[m
[31m-verify[m
[31m-the certificate of the proxied server and to be[m
[31m-passed through SNI[m
[31m-when establishing a connection with the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the host part of the L</proxy_pass> address is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_server_name[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_server_name I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables passing of the server name through[m
[31m-L<TLS[m
[31m-Server Name Indication extension|http://en.wikipedia.org/wiki/Server_Name_Indication> (SNI, RFC 6066)[m
[31m-when establishing a connection with the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_session_reuse[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_session_reuse I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Determines whether SSL sessions can be reused when working with[m
[31m-the proxied server.[m
[31m-If the errors[m
[31m-“C<SSL3_GET_FINISHED:digest check failed>”[m
[31m-appear in the logs, try disabling session reuse.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols for connections to a proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_trusted_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_trusted_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with trusted CA certificates in the PEM format[m
[31m-used to verify[m
[31m-the certificate of the proxied server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_verify[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_verify I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables verification of the proxied server certificate.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_ssl_verify_depth[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_ssl_verify_depth I<I<C<number>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<1>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the verification depth in the proxied server certificates chain.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_timeout I<I<C<timeout>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<10m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the I<C<timeout>> between two successive[m
[31m-read or write operations on client or proxied server connections.[m
[31m-If no data is transmitted within this time, the connection is closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 proxy_upload_rate[m
[31m-[m
[31m-[m
[31m-B<syntax:> proxy_upload_rate I<I<C<rate>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<0>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Limits the speed of reading the data from the client.[m
[31m-The I<C<rate>> is specified in bytes per second.[m
[31m-The zero value disables rate limiting.[m
[31m-The limit is set per a connection, so if the client simultaneously opens[m
[31m-two connections,[m
[31m-the overall rate will be twice as much as the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_ssl_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_ssl_module.pod[m
[1mdeleted file mode 100644[m
[1mindex fad7fb3..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_ssl_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,623 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_ssl_module - Module ngx_stream_ssl_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_ssl_module> module (1.9.0)[m
[31m-provides the necessary support for a stream proxy server to work with[m
[31m-the SSLE<sol>TLS protocol.[m
[31m-This module is not built by default, it should be enabled with the[m
[31m-C<--with-stream_ssl_module>[m
[31m-configuration parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-To reduce the processor load, it is recommended to[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-set the number of worker processes equal to the number of processors,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-enable the shared session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-disable the built-in session cache,[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and possibly increase the session lifetime (by default, 5 minutes):[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    <emphasis>worker_processes auto;</emphasis>[m
[31m-    [m
[31m-    stream {[m
[31m-    [m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            listen              12345 ssl;[m
[31m-    [m
[31m-            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;[m
[31m-            ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;[m
[31m-            ssl_certificate     /usr/local/nginx/conf/cert.pem;[m
[31m-            ssl_certificate_key /usr/local/nginx/conf/cert.key;[m
[31m-            <emphasis>ssl_session_cache   shared:SSL:10m;</emphasis>[m
[31m-            <emphasis>ssl_session_timeout 10m;</emphasis>[m
[31m-    [m
[31m-            ...[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 ssl_certificate[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the certificate in the PEM format[m
[31m-for the given server.[m
[31m-If intermediate certificates should be specified in addition to a primary[m
[31m-certificate, they should be specified in the same file in the following[m
[31m-order: the primary certificate comes first, then the intermediate certificates.[m
[31m-A secret key in the PEM format may be placed in the same file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_certificate_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with the secret key in the PEM format[m
[31m-for the given server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The value[m
[31m-C<engine>:I<C<name>>:I<C<id>>[m
[31m-can be specified instead of the I<C<file>>,[m
[31m-which loads a secret key with a specified I<C<id>>[m
[31m-from the OpenSSL engine I<C<name>>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ciphers I<I<C<ciphers>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<HIGH:!aNULL:!MD5>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies the enabled ciphers.[m
[31m-The ciphers are specified in the format understood by the[m
[31m-OpenSSL library, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The full list can be viewed using the[m
[31m-“C<openssl ciphers>” command.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_dhparam[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_dhparam I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with DH parameters for DHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_ecdh_curve[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_ecdh_curve I<I<C<curve>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<auto>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<curve>> for ECDHE ciphers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When using OpenSSL 1.0.2 or higher,[m
[31m-it is possible to specify multiple curves (1.11.0), for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_ecdh_curve prime256v1:secp384r1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The special value C<auto> (1.11.0) instructs nginx to use[m
[31m-a list built into the OpenSSL library when using OpenSSL 1.0.2 or higher,[m
[31m-or C<prime256v1> with older versions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Prior to version 1.11.0,[m
[31m-the C<prime256v1> curve was used by default.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_handshake_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_handshake_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<60s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a timeout for the SSL handshake to complete.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_password_file[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_password_file I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> with passphrases for[m
[31m-secret keys[m
[31m-where each passphrase is specified on a separate line.[m
[31m-Passphrases are tried in turn when loading the key.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    stream {[m
[31m-        ssl_password_file /etc/keys/global.pass;[m
[31m-        ...[m
[31m-    [m
[31m-        server {[m
[31m-            listen 127.0.0.1:12345;[m
[31m-            ssl_certificate_key /etc/keys/first.key;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            listen 127.0.0.1:12346;[m
[31m-    [m
[31m-            # named pipe can also be used instead of a file[m
[31m-            ssl_password_file /etc/keys/fifo;[m
[31m-            ssl_certificate_key /etc/keys/second.key;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_prefer_server_ciphers[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_prefer_server_ciphers I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that server ciphers should be preferred over client ciphers[m
[31m-when the SSLv3 and TLS protocols are used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_protocols[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_protocols I<[m
[31m-    [C<SSLv2>][m
[31m-    [C<SSLv3>][m
[31m-    [C<TLSv1>][m
[31m-    [C<TLSv1.1>][m
[31m-    [C<TLSv1.2>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<TLSv1 TLSv1.1 TLSv1.2>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables the specified protocols.[m
[31m-The C<TLSv1.1> and C<TLSv1.2> parameters work[m
[31m-only when the OpenSSL library of version 1.0.1 or higher is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_cache[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_cache I<[m
[31m-    C<off> E<verbar>[m
[31m-    C<none> E<verbar>[m
[31m-    [C<builtin>[:I<C<size>>]][m
[31m-    [C<shared>:I<C<name>>:I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-B<default:> I<none>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the types and sizes of caches that store session parameters.[m
[31m-A cache can be of any of the following types:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<off>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is strictly prohibited:[m
[31m-nginx explicitly tells a client that sessions may not be reused.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<none>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-the use of a session cache is gently disallowed:[m
[31m-nginx tells a client that sessions may be reused, but does not[m
[31m-actually store session parameters in the cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<builtin>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache built in OpenSSL; used by one worker process only.[m
[31m-The cache size is specified in sessions.[m
[31m-If size is not given, it is equal to 20480 sessions.[m
[31m-Use of the built-in cache can cause memory fragmentation.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<shared>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a cache shared between all worker processes.[m
[31m-The cache size is specified in bytes; one megabyte can store[m
[31m-about 4000 sessions.[m
[31m-Each shared cache should have an arbitrary name.[m
[31m-A cache with the same name can be used in several[m
[31m-servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Both cache types can be used simultaneously, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_cache builtin:1000 shared:SSL:10m;[m
[31m-[m
[31m-[m
[31m-but using only shared cache without the built-in cache should[m
[31m-be more efficient.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_ticket_key[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_ticket_key I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets a I<C<file>> with the secret key used to encrypt[m
[31m-and decrypt TLS session tickets.[m
[31m-The directive is necessary if the same key has to be shared between[m
[31m-multiple servers.[m
[31m-By default, a randomly generated key is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several keys are specified, only the first key is[m
[31m-used to encrypt TLS session tickets.[m
[31m-This allows configuring key rotation, for example:[m
[31m-[m
[31m-    [m
[31m-    ssl_session_ticket_key current.key;[m
[31m-    ssl_session_ticket_key previous.key;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The I<C<file>> must contain 48 bytes of random data and can[m
[31m-be created using the following command:[m
[31m-[m
[31m-    [m
[31m-    openssl rand 48 > ticket.key[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_tickets[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_tickets I<C<on> E<verbar> C<off>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<on>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables or disables session resumption through[m
[31m-L<TLS session tickets|http://tools.ietf.org/html/rfc5077>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_session_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> ssl_session_timeout I<I<C<time>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5m>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a time during which a client may reuse the[m
[31m-session parameters stored in a cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_upstream_module.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_upstream_module.pod[m
[1mdeleted file mode 100644[m
[1mindex 135f0a2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/ngx_stream_upstream_module.pod[m
[1m+++ /dev/null[m
[36m@@ -1,992 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-=head1 NAME[m
[31m-[m
[31m-ngx_stream_upstream_module - Module ngx_stream_upstream_module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The C<ngx_stream_upstream_module> module (1.9.0)[m
[31m-is used to define groups of servers that can be referenced[m
[31m-by the L<ngx_stream_proxy_module>[m
[31m-directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Example Configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    upstream <emphasis>backend</emphasis> {[m
[31m-        hash $remote_addr consistent;[m
[31m-    [m
[31m-        server backend1.example.com:12345  weight=5;[m
[31m-        server backend2.example.com:12345;[m
[31m-        server unix:/tmp/backend3;[m
[31m-    [m
[31m-        server backup1.example.com:12345   backup;[m
[31m-        server backup2.example.com:12345   backup;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen 12346;[m
[31m-        proxy_pass <emphasis>backend</emphasis>;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Dynamically configurable group,[m
[31m-available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-    [m
[31m-    resolver 10.0.0.1;[m
[31m-    [m
[31m-    upstream <emphasis>dynamic</emphasis> {[m
[31m-        zone upstream_dynamic 64k;[m
[31m-    [m
[31m-        server backend1.example.com:12345 weight=5;[m
[31m-        server backend2.example.com:12345 fail_timeout=5s slow_start=30s;[m
[31m-        server 192.0.2.1:12345            max_fails=3;[m
[31m-        server backend3.example.com:12345 resolve;[m
[31m-        server backend4.example.com       service=http resolve;[m
[31m-    [m
[31m-        server backup1.example.com:12345  backup;[m
[31m-        server backup2.example.com:12345  backup;[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen 12346;[m
[31m-        proxy_pass <emphasis>dynamic</emphasis>;[m
[31m-        health_check;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-=head2 upstream[m
[31m-[m
[31m-[m
[31m-B<syntax:> upstream I<I<C<name>> { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines a group of servers.[m
[31m-Servers can listen on different ports.[m
[31m-In addition, servers listening on TCP and UNIX-domain sockets[m
[31m-can be mixed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        server backend1.example.com:12345 weight=5;[m
[31m-        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;[m
[31m-        server unix:/tmp/backend2;[m
[31m-        server backend3.example.com:12345 resolve;[m
[31m-    [m
[31m-        server backup1.example.com:12345  backup;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, connections are distributed between the servers using a[m
[31m-weighted round-robin balancing method.[m
[31m-In the above example, each 7 connections will be distributed as follows:[m
[31m-5 connections go to C<backend1.example.com:12345>[m
[31m-and one connection to each of the second and third servers.[m
[31m-If an error occurs during communication with a server, the connection will[m
[31m-be passed to the next server, and so on until all of the functioning[m
[31m-servers will be tried.[m
[31m-If communication with all servers fails, the connection will be closed.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 server[m
[31m-[m
[31m-[m
[31m-B<syntax:> server I<I<C<address>> [I<C<parameters>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<address>> and other I<C<parameters>>[m
[31m-of a server.[m
[31m-The address can be specified as a domain name or IP address[m
[31m-with an obligatory port, or as a UNIX-domain socket path[m
[31m-specified after the “C<unix:>” prefix.[m
[31m-A domain name that resolves to several IP addresses defines[m
[31m-multiple servers at once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following parameters can be defined:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<weight>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the weight of the server, by default, 1.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_fails>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of unsuccessful attempts to communicate with the server[m
[31m-that should happen in the duration set by the C<fail_timeout>[m
[31m-parameter to consider the server unavailable for a duration also set by the[m
[31m-C<fail_timeout> parameter.[m
[31m-By default, the number of unsuccessful attempts is set to 1.[m
[31m-The zero value disables the accounting of attempts.[m
[31m-Here, an unsuccessful attempt is an error or timeout[m
[31m-while establishing a connection with the server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fail_timeout>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the time during which the specified number of unsuccessful attempts to[m
[31m-communicate with the server should happen to consider the server unavailable;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-and the period of time the server will be considered unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-By default, the parameter is set to 10 seconds.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<backup>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-marks the server as a backup server.[m
[31m-Connections to the backup server will be passed[m
[31m-when the primary servers are unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<down>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-marks the server as permanently unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-the following parameters are available as part of our[m
[31m-commercial subscription:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<max_conns>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-limits the maximum I<C<number>> of simultaneous connections to the[m
[31m-proxied server.[m
[31m-Default value is zero, meaning there is no limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<resolve>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-monitors changes of the IP addresses[m
[31m-that correspond to a domain name of the server,[m
[31m-and automatically modifies the upstream configuration[m
[31m-without the need of restarting nginx.[m
[31m-The server group must reside in the shared memory.[m
[31m-[m
[31m-[m
[31m-In order for this parameter to work,[m
[31m-the L<ngx_stream_core_module> directive[m
[31m-must be specified in the[m
[31m-L<ngx_stream_core_module> block.[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    stream {[m
[31m-        resolver 10.0.0.1;[m
[31m-    [m
[31m-        upstream u {[m
[31m-            zone ...;[m
[31m-            ...[m
[31m-            server example.com:12345 resolve;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<service>=I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-enables resolving of DNS[m
[31m-L<SRV|https://tools.ietf.org/html/rfc2782>[m
[31m-records and sets the service I<C<name>> (1.9.13).[m
[31m-In order for this parameter to work, it is necessary to specify[m
[31m-the L</resolve> parameter for the server[m
[31m-and specify a hostname without a port number.[m
[31m-[m
[31m-[m
[31m-If the service name does not contain a dot (“C<.>”), then[m
[31m-the L<RFC|https://tools.ietf.org/html/rfc2782>-compliant name[m
[31m-is constructed[m
[31m-and the TCP protocol is added to the service prefix.[m
[31m-For example, to look up the[m
[31m-C<_http._tcp.backend.example.com> SRV record,[m
[31m-it is necessary to specify the directive:[m
[31m-[m
[31m-    [m
[31m-    server backend.example.com service=http resolve;[m
[31m-[m
[31m-[m
[31m-If the service name contains one or more dots, then the name is constructed[m
[31m-by joining the service prefix and the server name.[m
[31m-For example, to look up the C<_http._tcp.backend.example.com>[m
[31m-and C<server1.backend.example.com> SRV records,[m
[31m-it is necessary to specify the directives:[m
[31m-[m
[31m-    [m
[31m-    server backend.example.com service=_http._tcp resolve;[m
[31m-    server example.com service=server1.backend resolve;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Highest-priority SRV records[m
[31m-(records with the same lowest-number priority value)[m
[31m-are resolved as primary servers,[m
[31m-the rest of SRV records are resolved as backup servers.[m
[31m-If the L</backup> parameter is specified for the server,[m
[31m-high-priority SRV records are resolved as backup servers,[m
[31m-the rest of SRV records are ignored.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<slow_start>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the I<C<time>> during which the server will recover its weight[m
[31m-from zero to a nominal value,[m
[31m-or when the server becomes available after a period of time[m
[31m-it was considered unavailable.[m
[31m-Default value is zero, i.e. slow start is disabled.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-If there is only a single server in a group, C<max_fails>,[m
[31m-C<fail_timeout> and C<slow_start> parameters[m
[31m-are ignored, and such a server will never be considered unavailable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 zone[m
[31m-[m
[31m-[m
[31m-B<syntax:> zone I<I<C<name>> [I<C<size>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the I<C<name>> and I<C<size>> of the shared[m
[31m-memory zone that keeps the group’s configuration and run-time state that are[m
[31m-shared between worker processes.[m
[31m-Several groups may share the same zone.[m
[31m-In this case, it is enough to specify the zone size only once.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additionally,[m
[31m-as part of our commercial subscription,[m
[31m-such groups allow changing the group membership[m
[31m-or modifying the settings of a particular server[m
[31m-without the need of restarting nginx.[m
[31m-The configuration is accessible via a special location[m
[31m-handled by[m
[31m-L<ngx_http_upstream_conf_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 state[m
[31m-[m
[31m-[m
[31m-B<syntax:> state I<I<C<file>>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-This directive appeared in version 1.9.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a I<C<file>> that keeps the state[m
[31m-of the dynamically configurable group.[m
[31m-The state is currently limited to the list of servers with their parameters.[m
[31m-The file is read when parsing the configuration and is updated each time[m
[31m-the upstream configuration is[m
[31m-L<changed|ngx_http_upstream_conf_module>.[m
[31m-Changing the file content directly should be avoided.[m
[31m-The directive cannot be used[m
[31m-along with the L</server> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Changes made during[m
[31m-L<configuration reload|control>[m
[31m-or L<binary upgrade|control>[m
[31m-can be lost.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 hash[m
[31m-[m
[31m-[m
[31m-B<syntax:> hash I<I<C<key>> [C<consistent>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies a load balancing method for a server group[m
[31m-where client-server mapping is based on the hashed I<C<key>> value.[m
[31m-Currently, the only supported value for the C<key>[m
[31m-is the client remote address specified as C<$remote_addr>.[m
[31m-Note that adding or removing a server from the group[m
[31m-may result in remapping most of the keys to different servers.[m
[31m-The method is compatible with the[m
[31m-L<Cache::Memcached|http://search.cpan.org/perldoc?Cache%3A%3AMemcached>[m
[31m-Perl library.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<consistent> parameter is specified,[m
[31m-the L<ketama|http://www.last.fm/user/RJ/journal/2007/04/10/392555/>[m
[31m-consistent hashing method will be used instead.[m
[31m-The method ensures that only a few keys[m
[31m-will be remapped to different servers[m
[31m-when a server is added to or removed from the group.[m
[31m-This helps to achieve a higher cache hit ratio for caching servers.[m
[31m-The method is compatible with the[m
[31m-L<Cache::Memcached::Fast|http://search.cpan.org/perldoc?Cache%3A%3AMemcached%3A%3AFast>[m
[31m-Perl library with the I<C<ketama_points>> parameter set to 160.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 least_conn[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a server group should use a load balancing method[m
[31m-where a connection[m
[31m-is passed to the server with the least number of active connections,[m
[31m-taking into account weights of servers.[m
[31m-If there are several such servers, they are tried in turn using a[m
[31m-weighted round-robin balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 least_time[m
[31m-[m
[31m-[m
[31m-B<syntax:> least_time I<C<connect> E<verbar>[m
[31m-     C<first_byte> E<verbar>[m
[31m-     C<last_byte>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Specifies that a group should use a load balancing method where a connection[m
[31m-is passed to the server with the least average time and[m
[31m-least number of active connections, taking into account weights of servers.[m
[31m-If there are several such servers, they are tried in turn using a[m
[31m-weighted round-robin balancing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If the C<connect> parameter is specified,[m
[31m-time to connect to the upstream server is used.[m
[31m-If the C<first_byte> parameter is specified,[m
[31m-time to receive the first byte of data is used.[m
[31m-If the C<last_byte> is specified,[m
[31m-time to receive the last byte of data is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 health_check[m
[31m-[m
[31m-[m
[31m-B<syntax:> health_check I<[I<C<parameters>>]>[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Enables periodic health checks of the servers in a[m
[31m-group.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following optional parameters are supported:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<interval>=I<C<time>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the interval between two consecutive health checks,[m
[31m-by default, 5 seconds;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<fails>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of consecutive failed health checks of a particular server[m
[31m-after which this server will be considered unhealthy,[m
[31m-by default, 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<passes>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sets the number of consecutive passed health checks of a particular server[m
[31m-after which the server will be considered healthy,[m
[31m-by default, 1;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<match>=I<C<name>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies the C<match> block configuring the tests that a[m
[31m-successful connection should pass in order for a health check to pass.[m
[31m-By default,[m
[31m-only the ability to establish a TCP connection with the server is checked;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<port>=I<C<number>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-defines the port used when connecting to a server[m
[31m-to perform a health check (1.9.7);[m
[31m-by default, equals the L</server> port;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<udp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-specifies that the C<UDP> protocol should be used for[m
[31m-health checks instead of the default C<TCP> protocol (1.9.13);[m
[31m-requires a match block with the[m
[31m-send and expect[m
[31m-parameters.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        proxy_pass backend;[m
[31m-        health_check;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-will check the ability to establish a TCP connection to each server[m
[31m-in the C<backend> group every five seconds.[m
[31m-When a connection to the server cannot be established,[m
[31m-the health check will fail, and the server will[m
[31m-be considered unhealthy.[m
[31m-Client connections are not passed to unhealthy servers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Health checks can also be configured to test data obtained from the server.[m
[31m-Tests are configured separately using the L</match> directive[m
[31m-and referenced in the C<match> parameter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The server group must reside in the shared memory.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If several health checks are defined for the same group of servers,[m
[31m-a single failure of any check will make the corresponding server be[m
[31m-considered unhealthy.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 health_check_timeout[m
[31m-[m
[31m-[m
[31m-B<syntax:> health_check_timeout I<I<C<timeout>>>[m
[31m-[m
[31m-[m
[31m-B<default:> I<5s>[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Overrides the[m
[31m-L<ngx_stream_proxy_module>[m
[31m-value for health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 match[m
[31m-[m
[31m-[m
[31m-B<syntax:> match I<I<C<name>>  { B<...> } >[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<context:> I<stream>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the named test set used to verify server responses to health checks.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The following parameters can be configured:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<send> I<C<string>>;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-sends a I<C<string>> to the server;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item [m
[31m-C<expect> I<C<string>> E<verbar>[m
[31m-C<~> I<C<regex>>;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-a literal string (1.9.12) or a regular expression[m
[31m-that the data obtained from the server should match.[m
[31m-The regular expression is specified with the preceding[m
[31m-“C<~*>” modifier (for case-insensitive matching), or the[m
[31m-“C<~>” modifier (for case-sensitive matching).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Both C<send> and C<expect> parameters[m
[31m-can contain hexadecimal literals with the prefix “C<\x>”[m
[31m-followed by two hex digits, for example, “C<\x80>” (1.9.12).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Health check is passed if:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the TCP connection was successfully established;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the I<C<string>> from the C<send> parameter,[m
[31m-if specified, was sent;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the data obtained from the server matched the string or regular expression[m
[31m-from the C<expect> parameter, if specified;[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-the time elapsed does not exceed the value specified[m
[31m-in the L</health_check_timeout> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Example:[m
[31m-[m
[31m-    [m
[31m-    upstream backend {[m
[31m-        zone     upstream_backend 10m;[m
[31m-        server   127.0.0.1:12345;[m
[31m-    }[m
[31m-    [m
[31m-    match http {[m
[31m-        send     "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n";[m
[31m-        expect ~ "200 OK";[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       12346;[m
[31m-        proxy_pass   backend;[m
[31m-        health_check match=http;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Only the first[m
[31m-L<ngx_stream_proxy_module>[m
[31m-bytes of data obtained from the server are examined.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-This directive is available as part of our[m
[31m-commercial subscription.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/request_processing.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/request_processing.pod[m
[1mdeleted file mode 100644[m
[1mindex 5baa1ac..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/request_processing.pod[m
[1m+++ /dev/null[m
[36m@@ -1,339 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-request_processing - How nginx processes a request[m
[31m-[m
[31m-[m
[31m-=head1 Name-based virtual servers[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx first decides which I<server> should process the request.[m
[31m-Let’s start with a simple configuration[m
[31m-where all three virtual servers listen on port *:80:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name example.org www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name example.net www.example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name example.com www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this configuration nginx tests only the request’s header field[m
[31m-C<Host> to determine which server the request should be routed to.[m
[31m-If its value does not match any server name,[m
[31m-or the request does not contain this header field at all,[m
[31m-then nginx will route the request to the default server for this port.[m
[31m-In the configuration above, the default server is the first[m
[31m-oneE<mdash>which is nginx’s standard default behaviour.[m
[31m-It can also be set explicitly which server should be default,[m
[31m-with the C<default_server> parameter[m
[31m-in the L<ngx_http_core_module> directive:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80 <b>default_server</b>;[m
[31m-        server_name example.net www.example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-The C<default_server> parameter has been available since[m
[31m-version 0.8.21.[m
[31m-In earlier versions the C<default> parameter should be used[m
[31m-instead.[m
[31m-[m
[31m-Note that the default server is a property of the listen port[m
[31m-and not of the server name.[m
[31m-More about this later.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 How to prevent processing requests with undefined server names[m
[31m-[m
[31m-[m
[31m-[m
[31m-If requests without the C<Host> header field should not be[m
[31m-allowed, a server that just drops the requests can be defined:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name "";[m
[31m-        return      444;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-Here, the server name is set to an empty string that will match[m
[31m-requests without the C<Host> header field,[m
[31m-and a special nginx’s non-standard code 444[m
[31m-is returned that closes the connection.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Since version 0.8.48, this is the default setting for the[m
[31m-server name, so the C<server_name ""> can be omitted.[m
[31m-In earlier versions, the machine’s I<hostname> was used as[m
[31m-a default server name.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Mixed name-based and IP-based virtual servers[m
[31m-[m
[31m-[m
[31m-[m
[31m-Let’s look at a more complex configuration[m
[31m-where some virtual servers listen on different addresses:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.1:80;[m
[31m-        server_name example.org www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.1:80;[m
[31m-        server_name example.net www.example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.2:80;[m
[31m-        server_name example.com www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-In this configuration, nginx first tests the IP address and port[m
[31m-of the request against the[m
[31m-L<ngx_http_core_module> directives[m
[31m-of the[m
[31m-L<ngx_http_core_module> blocks.[m
[31m-It then tests the C<Host>[m
[31m-header field of the request against the[m
[31m-L<ngx_http_core_module>[m
[31m-entries of the[m
[31m-L<ngx_http_core_module>[m
[31m-blocks that matched[m
[31m-the IP address and port.[m
[31m-If the server name is not found, the request will be processed by[m
[31m-the default server.[m
[31m-For example, a request for C<www.example.com> received on[m
[31m-the 192.168.1.1:80 port will be handled by the default server[m
[31m-of the 192.168.1.1:80 port, i.e., by the first server,[m
[31m-since there is no C<www.example.com> defined for this port.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-As already stated, a default server is a property of the listen port,[m
[31m-and different default servers may be defined for different ports:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.1:80;[m
[31m-        server_name example.org www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.1:80 <b>default_server</b>;[m
[31m-        server_name example.net www.example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen      192.168.1.2:80 <b>default_server</b>;[m
[31m-        server_name example.com www.example.com;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 A simple PHP site configuration[m
[31m-[m
[31m-[m
[31m-[m
[31m-Now let’s look at how nginx chooses a I<location> to process a request[m
[31m-for a typical, simple PHP site:[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen      80;[m
[31m-        server_name example.org www.example.org;[m
[31m-        root        /data/www;[m
[31m-    [m
[31m-        location / {[m
[31m-            index   index.html index.php;[m
[31m-        }[m
[31m-    [m
[31m-        location ~* \.(gif|jpg|png)$ {[m
[31m-            expires 30d;[m
[31m-        }[m
[31m-    [m
[31m-        location ~ \.php$ {[m
[31m-            fastcgi_pass  localhost:9000;[m
[31m-            fastcgi_param SCRIPT_FILENAME[m
[31m-                          $document_root$fastcgi_script_name;[m
[31m-            include       fastcgi_params;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx first searches for the most specific prefix location given by[m
[31m-literal strings regardless of the listed order.[m
[31m-In the configuration above[m
[31m-the only prefix location is “C<E<sol>>” and since it matches[m
[31m-any request it will be used as a last resort.[m
[31m-Then nginx checks locations given by[m
[31m-regular expression in the order listed in the configuration file.[m
[31m-The first matching expression stops the search and nginx will use this[m
[31m-location.[m
[31m-If no regular expression matches a request, then nginx uses[m
[31m-the most specific prefix location found earlier.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Note that locations of all types test only a URI part of request line[m
[31m-without arguments.[m
[31m-This is done because arguments in the query string may be given in[m
[31m-several ways, for example:[m
[31m-[m
[31m-    [m
[31m-    /index.php?user=john&page=1[m
[31m-    /index.php?page=1&user=john[m
[31m-[m
[31m-[m
[31m-Besides, anyone may request anything in the query string:[m
[31m-[m
[31m-    [m
[31m-    /index.php?page=1&something+else&user=john[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Now let’s look at how requests would be processed[m
[31m-in the configuration above:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A request “C<E<sol>logo.gif>” is matched by the prefix location[m
[31m-“C<E<sol>>” first and then by the regular expression[m
[31m-“C<\.(gifE<verbar>jpgE<verbar>png)$>”,[m
[31m-therefore, it is handled by the latter location.[m
[31m-Using the directive “C<rootE<nbsp>E<sol>dataE<sol>www>” the request[m
[31m-is mapped to the file F<E<sol>dataE<sol>wwwE<sol>logo.gif>, and the file[m
[31m-is sent to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A request “C<E<sol>index.php>” is also matched by the prefix location[m
[31m-“C<E<sol>>” first and then by the regular expression[m
[31m-“C<\.(php)$>”.[m
[31m-Therefore, it is handled by the latter location[m
[31m-and the request is passed to a FastCGI server listening on localhost:9000.[m
[31m-The[m
[31m-L<ngx_http_fastcgi_module>[m
[31m-directive sets the FastCGI parameter[m
[31m-C<SCRIPT_FILENAME> to “C<E<sol>dataE<sol>wwwE<sol>index.php>”,[m
[31m-and the FastCGI server executes the file.[m
[31m-The variable C<$document_root> is equal to[m
[31m-the value of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive and the variable C<$fastcgi_script_name> is equal to[m
[31m-the request URI, i.e. “C<E<sol>index.php>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A request “C<E<sol>about.html>” is matched by the prefix location[m
[31m-“C<E<sol>>” only, therefore, it is handled in this location.[m
[31m-Using the directive “C<root E<sol>dataE<sol>www>” the request is mapped[m
[31m-to the file F<E<sol>dataE<sol>wwwE<sol>about.html>, and the file is sent[m
[31m-to the client.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Handling a request “C<E<sol>>” is more complex.[m
[31m-It is matched by the prefix location “C<E<sol>>” only,[m
[31m-therefore, it is handled by this location.[m
[31m-Then the[m
[31m-L<ngx_http_index_module>[m
[31m-directive tests for the existence[m
[31m-of index files according to its parameters and[m
[31m-the “C<root E<sol>dataE<sol>www>” directive.[m
[31m-If the file F<E<sol>dataE<sol>wwwE<sol>index.html> does not exist,[m
[31m-and the file F<E<sol>dataE<sol>wwwE<sol>index.php> exists,[m
[31m-then the directive does an internal redirect to “C<E<sol>index.php>”,[m
[31m-and nginx searches the locations again[m
[31m-as if the request had been sent by a client.[m
[31m-As we saw before, the redirected request will eventually be handled[m
[31m-by the FastCGI server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/server_names.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/server_names.pod[m
[1mdeleted file mode 100644[m
[1mindex 217b7e2..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/server_names.pod[m
[1m+++ /dev/null[m
[36m@@ -1,562 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-server_names - Server names[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-Server names are defined using the[m
[31m-L<ngx_http_core_module>[m
[31m-directive[m
[31m-and determine which L<ngx_http_core_module> block[m
[31m-is used for a given request.[m
[31m-See also “L<request_processing>”.[m
[31m-They may be defined using exact names, wildcard names, or regular expressions:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org  www.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  *.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  mail.*;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  ~^(?<user>.+)\.example\.net$;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-When searching for a virtual server by name, if name matches more than one of[m
[31m-the specified variants, e.g. both wildcard name and regular expression match,[m
[31m-the first matching variant will be chosen, in the following order of precedence:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-exact name[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-longest wildcard name starting with an asterisk, e.g.[m
[31m-“C<*.example.org>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-longest wildcard name ending with an asterisk, e.g. “C<mail.*>”[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-first matching regular expression[m
[31m-(in order of appearance in a configuration file)[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Wildcard names[m
[31m-[m
[31m-[m
[31m-[m
[31m-A wildcard name may contain an asterisk only on the name’s start or end,[m
[31m-and only on a dot border. The names “C<www.*.example.org>”[m
[31m-and “C<w*.example.org>” are invalid.[m
[31m-However, these names can be specified using regular expressions,[m
[31m-for example, “C<~^www\..+\.example\.org$>” and[m
[31m-“C<~^w.*\.example\.org$>”.[m
[31m-An asterisk can match several name parts.[m
[31m-The name “C<*.example.org>” matches not only[m
[31m-C<www.example.org> but C<www.sub.example.org> as well.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-A special wildcard name in the form “C<.example.org>” can be[m
[31m-used to match both the exact name “C<example.org>”[m
[31m-and the wildcard name “C<*.example.org>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Regular expressions names[m
[31m-[m
[31m-[m
[31m-[m
[31m-The regular expressions used by nginx are compatible with those used[m
[31m-by the Perl programming language (PCRE).[m
[31m-To use a regular expression, the server name must start with the tilde[m
[31m-character:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server_name  ~^www\d+\.example\.net$;[m
[31m-[m
[31m-[m
[31m-[m
[31m-otherwise it will be treated as an exact name, or if the expression contains[m
[31m-an asterisk, as a wildcard name (and most likely as an invalid one).[m
[31m-Do not forget to set “C<^>” and “C<$>” anchors.[m
[31m-They are not required syntactically, but logically.[m
[31m-Also note that domain name dots should be escaped with a backslash.[m
[31m-A regular expression containing the characters “C<{>”[m
[31m-and “C<}>” should be quoted:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server_name  "~^(?<name>\w\d<b>{</b>1,3<b>}</b>+)\.example\.net$";[m
[31m-[m
[31m-[m
[31m-[m
[31m-otherwise nginx will fail to start and display the error message:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    directive "server_name" is not terminated by ";" in ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-A named regular expression capture can be used later as a variable:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name   ~^(www\.)?(<b>?<domain></b>.+)$;[m
[31m-    [m
[31m-        location / {[m
[31m-            root   /sites/<b>$domain</b>;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-The PCRE library supports named captures using the following syntax:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If nginx fails to start and displays the error message:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    pcre_compile() failed: unrecognized character after (?< in ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-this means that the PCRE library is old and the syntax[m
[31m-“C<?PE<lt>I<C<name>>E<gt>>” should be tried instead.[m
[31m-The captures can also be used in digital form:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        server_name   ~^(www\.)?(.+)$;[m
[31m-    [m
[31m-        location / {[m
[31m-            root   /sites/<b>$2</b>;[m
[31m-        }[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-However, such usage should be limited to simple cases (like the above),[m
[31m-since the digital references can easily be overwritten.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Miscellaneous names[m
[31m-[m
[31m-[m
[31m-[m
[31m-There are some server names that are treated specially.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If it is required to process requests without the C<Host>[m
[31m-header field in a L<ngx_http_core_module>[m
[31m-block which is not the default, an empty name should be specified:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org  www.example.org  "";[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If no[m
[31m-L<ngx_http_core_module>[m
[31m-is defined in a L<ngx_http_core_module> block[m
[31m-then nginx uses the empty name as the server name.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-nginx versions up to 0.8.48 used the machine’s hostname as the server name[m
[31m-in this case.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a server name is defined as “C<$hostname>” (0.9.4), the[m
[31m-machine’s hostname is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If someone makes a request using an IP address instead of a server name,[m
[31m-the C<Host> request header field will contain the IP address[m
[31m-and the request can be handled using the IP address as the server name:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org[m
[31m-                     www.example.org[m
[31m-                     ""[m
[31m-                     <b>192.168.1.1</b>[m
[31m-                     ;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-In catch-all server examples the strange name “C<_>” can[m
[31m-be seen:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80  default_server;[m
[31m-        server_name  _;[m
[31m-        return       444;[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is nothing special about this name, it is just one of a myriad[m
[31m-of invalid domain names which never intersect with any real name.[m
[31m-Other invalid names like “C<-->” and “C<!@#>”[m
[31m-may equally be used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx versions up to 0.6.25 supported the special name “C<*>”[m
[31m-which was erroneously interpreted to be a catch-all name.[m
[31m-It never functioned as a catch-all or wildcard server name.[m
[31m-Instead, it supplied the functionality that is now provided[m
[31m-by the[m
[31m-L<ngx_http_core_module>[m
[31m-directive.[m
[31m-The special name “C<*>” is now deprecated[m
[31m-and the[m
[31m-L<ngx_http_core_module>[m
[31m-directive should be used.[m
[31m-Note that there is no way to specify the catch-all name or[m
[31m-the default server using the[m
[31m-L<ngx_http_core_module>[m
[31m-directive.[m
[31m-This is a property of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive[m
[31m-and not of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive.[m
[31m-See also “L<request_processing>”.[m
[31m-It is possible to define servers listening on ports *:80 and *:8080,[m
[31m-and direct that one will be the default server for port *:8080,[m
[31m-while the other will be the default for port *:80:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        listen       8080  default_server;[m
[31m-        server_name  example.net;[m
[31m-        ...[m
[31m-    }[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80  default_server;[m
[31m-        listen       8080;[m
[31m-        server_name  example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Optimization[m
[31m-[m
[31m-[m
[31m-[m
[31m-Exact names, wildcard names starting with an asterisk,[m
[31m-and wildcard names ending with an asterisk are stored[m
[31m-in three hash tables bound to the listen ports.[m
[31m-The sizes of hash tables are optimized at the configuration phase[m
[31m-so that a name can be found with the fewest CPU cache misses.[m
[31m-The details of setting up hash tables are provided in a separate[m
[31m-L<document|hash>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-The exact names hash table is searched first.[m
[31m-If a name is not found, the hash table with wildcard names[m
[31m-starting with an asterisk is searched.[m
[31m-If the name is not found there, the hash table with wildcard names[m
[31m-ending with an asterisk is searched.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Searching wildcard names hash table is slower than searching exact names hash[m
[31m-table because names are searched by domain parts.[m
[31m-Note that the special wildcard form “C<.example.org>”[m
[31m-is stored in a wildcard names hash table and not in an exact names hash table.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Regular expressions are tested sequentially[m
[31m-and therefore are the slowest method and are non-scalable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-For these reasons, it is better to use exact names where possible.[m
[31m-For example, if the most frequently requested names of a server[m
[31m-are C<example.org> and C<www.example.org>,[m
[31m-it is more efficient to define them explicitly:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  example.org  www.example.org  *.example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-than to use the simplified form:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    server {[m
[31m-        listen       80;[m
[31m-        server_name  .example.org;[m
[31m-        ...[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a large number of server names are defined,[m
[31m-or unusually long server names are defined, tuning[m
[31m-the L<ngx_http_core_module>[m
[31m-and L<ngx_http_core_module>[m
[31m-directives at the I<http> level may become necessary.[m
[31m-The default value of the[m
[31m-L<ngx_http_core_module>[m
[31m-directive may be equal to 32, or 64, or another value,[m
[31m-depending on CPU cache line size.[m
[31m-If the default value is 32 and server name is defined as[m
[31m-“C<too.long.server.name.example.org>”[m
[31m-then nginx will fail to start and display the error message:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    could not build the server_names_hash,[m
[31m-    you should increase server_names_hash_bucket_size: 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-In this case, the directive value should be increased to the next power of two:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        server_names_hash_bucket_size  64;[m
[31m-        ...[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a large number of server names are defined,[m
[31m-another error message will appear:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    could not build the server_names_hash,[m
[31m-    you should increase either server_names_hash_max_size: 512[m
[31m-    or server_names_hash_bucket_size: 32[m
[31m-[m
[31m-[m
[31m-[m
[31m-In such a case, first try to set[m
[31m-L<ngx_http_core_module>[m
[31m-to a number close to the number of server names.[m
[31m-Only if this does not help,[m
[31m-or if nginx’s start time is unacceptably long, try to increase[m
[31m-L<ngx_http_core_module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If a server is the only server for a listen port, then nginx will not test[m
[31m-server names at all (and will not build the hash tables for the listen port).[m
[31m-However, there is one exception.[m
[31m-If a server name is a regular expression with captures,[m
[31m-then nginx has to execute the expression to get the captures.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Compatibility[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The special server name “C<$hostname>” has been supported[m
[31m-since 0.9.4.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A default server name value is an empty name “” since 0.8.48.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Named regular expression server name captures have been supported since 0.8.25.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Regular expression server name captures have been supported since 0.7.40.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-An empty server name “” has been supported since 0.7.12.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A wildcard server name or regular expression has been supported for use[m
[31m-as the first server name since 0.6.25.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Regular expression server names have been supported since 0.6.7.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Wildcard form C<example.*> has been supported since 0.6.0.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The special form C<.example.org> has been supported since 0.3.18.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Wildcard form C<*.example.org> has been supported since 0.1.13.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/switches.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/switches.pod[m
[1mdeleted file mode 100644[m
[1mindex e0e755b..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/switches.pod[m
[1m+++ /dev/null[m
[36m@@ -1,135 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-switches - Command-line parameters[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginx supports the following command-line parameters:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-?> E<verbar> C<-h>E<mdash>print help[m
[31m-for command-line parameters.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-c I<C<file>>>E<mdash>use an alternative[m
[31m-configuration I<C<file>> instead of a default file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-g I<C<directives>>>E<mdash>set[m
[31m-L<global configuration directives|ngx_core_module>,[m
[31m-for example,[m
[31m-[m
[31m-    [m
[31m-    nginx -g "pid /var/run/nginx.pid; worker_processes `sysctl -n hw.ncpu`;"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-p I<C<prefix>>>E<mdash>set nginx path prefix,[m
[31m-i.e. a directory that will keep server files[m
[31m-(default value is I<C<E<sol>usrE<sol>localE<sol>nginx>>).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-q>E<mdash>suppress non-error messages[m
[31m-during configuration testing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-s I<C<signal>>>E<mdash>send a I<signal>[m
[31m-to the master process.[m
[31m-The argument I<signal> can be one of:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<stop>E<mdash>shut down quickly[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<quit>E<mdash>shut down gracefully[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<reload>E<mdash>reload configuration,[m
[31m-start the new worker process with a new configuration,[m
[31m-gracefully shut down old worker processes.[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<reopen>E<mdash>reopen log files[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-t>E<mdash>test the configuration file: nginx checks the[m
[31m-configuration for correct syntax, and then tries to open files[m
[31m-referred in the configuration.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-T>E<mdash>same as C<-t>,[m
[31m-but additionally dump configuration files to standard output (1.9.2).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-v>E<mdash>print nginx version.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<-V>E<mdash>print nginx version, compiler version,[m
[31m-and configure parameters.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/syntax.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/syntax.pod[m
[1mdeleted file mode 100644[m
[1mindex ef6e8d0..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/syntax.pod[m
[1m+++ /dev/null[m
[36m@@ -1,56 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-syntax - Configuration file measurement units[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sizes can be specified in bytes, kilobytes[m
[31m-(suffixes C<k> and C<K>) or megabytes[m
[31m-(suffixes C<m> and C<M>), for example,[m
[31m-“C<1024>”, “C<8k>”, “C<1m>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Time intervals can be specified in milliseconds, seconds,[m
[31m-minutes, hours, days and so on, using the following suffixes:[m
[31m-[m
[31m-ms     milliseconds[m
[31m- s          seconds[m
[31m- m          minutes[m
[31m- h            hours[m
[31m- d             days[m
[31m- w            weeks[m
[31m- M  months, 30 days[m
[31m- y  years, 365 days[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Multiple units can be combined in a single value[m
[31m-by specifying them in the order from the most to the least significant,[m
[31m-and optionally separated by whitespace.[m
[31m-For example, “C<1h 30m>” specifies the same time[m
[31m-as “C<90m>” or “C<5400s>”.[m
[31m-A value without a suffix means seconds.[m
[31m-It is recommended to always specify a suffix.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Some of the time intervals can be specified only with a seconds resolution.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/sys_errlist.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/sys_errlist.pod[m
[1mdeleted file mode 100644[m
[1mindex abc5e96..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/sys_errlist.pod[m
[1m+++ /dev/null[m
[36m@@ -1,39 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-sys_errlist[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-While building nginx version 0.7.66, 0.8.35 or higher on Linux[m
[31m-the following warning messages are issued:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    warning: `sys_errlist' is deprecated;[m
[31m-        use `strerror' or `strerror_r' instead[m
[31m-    warning: `sys_nerr' is deprecated;[m
[31m-        use `strerror' or `strerror_r' instead[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-This is normal: nginx has to use the deprecated sys_errlist[] and sys_nerr[m
[31m-in signal handlers because strerror() and strerror_r() functions[m
[31m-are not Async-Signal-Safe.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/syslog.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/syslog.pod[m
[1mdeleted file mode 100644[m
[1mindex 8cf5546..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/syslog.pod[m
[1m+++ /dev/null[m
[36m@@ -1,126 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-syslog - Logging to syslog[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-The[m
[31m-L<ngx_core_module>[m
[31m-and[m
[31m-L<ngx_http_log_module>[m
[31m-directives support logging to syslog.[m
[31m-The following parameters configure logging to syslog:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<server=>I<C<address>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Defines the address of a syslog server.[m
[31m-The address can be specified as a domain name or IP address,[m
[31m-with an optional port, or as a UNIX-domain socket path[m
[31m-specified after the “C<unix:>” prefix.[m
[31m-If port is not specified, the UDP port 514 is used.[m
[31m-If a domain name resolves to several IP addresses, the first resolved[m
[31m-address is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<facility=>I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets facility of syslog messages, as defined in[m
[31m-L<RFC 3164|http://tools.ietf.org/html/rfc3164#section-4.1.1>.[m
[31m-Facility can be one of “C<kern>”, “C<user>”,[m
[31m-“C<mail>”, “C<daemon>”,[m
[31m-“C<auth>”, “C<intern>”,[m
[31m-“C<lpr>”, “C<news>”, “C<uucp>”,[m
[31m-“C<clock>”, “C<authpriv>”,[m
[31m-“C<ftp>”, “C<ntp>”, “C<audit>”,[m
[31m-“C<alert>”, “C<cron>”,[m
[31m-“C<local0>”..“C<local7>”.[m
[31m-Default is “C<local7>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<severity=>I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets severity of syslog messages for[m
[31m-L<ngx_http_log_module>,[m
[31m-as defined in[m
[31m-L<RFC 3164|http://tools.ietf.org/html/rfc3164#section-4.1.1>.[m
[31m-Possible values are the same as for the second parameter (level) of the[m
[31m-L<ngx_core_module> directive.[m
[31m-Default is “C<info>”.[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Severity of error messages is determined by nginx, thus the parameter[m
[31m-is ignored in the C<error_log> directive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<tag=>I<C<string>>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Sets the tag of syslog messages.[m
[31m-Default is “C<nginx>”.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item C<nohostname>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Disables adding the “hostname” field into the syslog message header (1.9.7).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-Example syslog configuration:[m
[31m-[m
[31m-    [m
[31m-    error_log syslog:server=192.168.1.1 debug;[m
[31m-    [m
[31m-    access_log syslog:server=unix:/var/log/nginx.sock,nohostname;[m
[31m-    access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<NOTE>[m
[31m-[m
[31m-Logging to syslog is available since version 1.7.1.[m
[31m-As part of our[m
[31m-commercial subscription[m
[31m-logging to syslog is available since version 1.5.3.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/variables_in_config.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/variables_in_config.pod[m
[1mdeleted file mode 100644[m
[1mindex b22ade1..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/variables_in_config.pod[m
[1m+++ /dev/null[m
[36m@@ -1,41 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-variables_in_config[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-Is there a proper way to use nginx variables to make sections of[m
[31m-the configuration shorter, using them as macros for making[m
[31m-parts of configuration work as templates?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-Variables should not be used as template macros. Variables are[m
[31m-evaluated in the run-time during the processing of each[m
[31m-request, so they are rather costly compared to plain static[m
[31m-configuration. Using variables to store static strings is also[m
[31m-a bad idea. Instead, a macro expansion and "include" directives[m
[31m-should be used to generate configs more easily and it can be[m
[31m-done with the external tools, e.g. sed + make or any other[m
[31m-common template mechanism.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/websocket.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/websocket.pod[m
[1mdeleted file mode 100644[m
[1mindex e6bfe62..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/websocket.pod[m
[1m+++ /dev/null[m
[36m@@ -1,101 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-websocket - WebSocket proxying[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-To turn a connection between a client and server from HTTPE<sol>1.1 into WebSocket,[m
[31m-the L<protocol[m
[31m-switch|http://tools.ietf.org/html/rfc2616#section-14.42> mechanism available in HTTPE<sol>1.1 is used.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-There is one subtlety however: since the C<Upgrade> is a[m
[31m-L<hop-by-hop|http://tools.ietf.org/html/rfc2616#section-13.5.1>[m
[31m-header, it is not passed from a client to proxied server.[m
[31m-With forward proxying, clients may use the C<CONNECT>[m
[31m-method to circumvent this issue.[m
[31m-This does not work with reverse proxying however,[m
[31m-since clients are not aware of any proxy servers,[m
[31m-and special processing on a proxy server is required.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Since version 1.3.13,[m
[31m-nginx implements special mode of operation[m
[31m-that allows setting up a tunnel between a client and proxied[m
[31m-server if the proxied server returned a response with the code[m
[31m-C<101> (C<Switching Protocols>),[m
[31m-and the client asked for a protocol switch via the C<Upgrade>[m
[31m-header in a request.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-As noted above, hop-by-hop headers including C<Upgrade>[m
[31m-and C<Connection> are not passed from a client to proxied[m
[31m-server, therefore in order for the proxied server to know about the client’s[m
[31m-intention to switch a protocol to WebSocket, these headers have to be[m
[31m-passed explicitly:[m
[31m-[m
[31m-    [m
[31m-    location /chat/ {[m
[31m-        proxy_pass http://backend;[m
[31m-        proxy_http_version 1.1;[m
[31m-        proxy_set_header Upgrade $http_upgrade;[m
[31m-        proxy_set_header Connection "upgrade";[m
[31m-    }[m
[31m-[m
[31m-[m
[31m-A more sophisticated example[m
[31m-in which a value of the C<Connection> header field[m
[31m-in a request to the proxied server depends on the presence of[m
[31m-the C<Upgrade> field in the client request header:[m
[31m-[m
[31m-    [m
[31m-    http {[m
[31m-        map $http_upgrade $connection_upgrade {[m
[31m-            default upgrade;[m
[31m-            ''      close;[m
[31m-        }[m
[31m-    [m
[31m-        server {[m
[31m-            ...[m
[31m-    [m
[31m-            location /chat/ {[m
[31m-                proxy_pass http://backend;[m
[31m-                proxy_http_version 1.1;[m
[31m-                proxy_set_header Upgrade $http_upgrade;[m
[31m-                proxy_set_header Connection $connection_upgrade;[m
[31m-            }[m
[31m-        }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-By default, the connection will be closed[m
[31m-if the proxied server does not transmit any data within 60 seconds.[m
[31m-This timeout can be increased with the[m
[31m-L<ngx_http_proxy_module> directive.[m
[31m-Alternatively, the proxied server can be configured[m
[31m-to periodically send WebSocket ping frames to reset the timeout[m
[31m-and check if the connection is still alive.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/welcome_nginx_facebook.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/welcome_nginx_facebook.pod[m
[1mdeleted file mode 100644[m
[1mindex 9038cbd..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/welcome_nginx_facebook.pod[m
[1m+++ /dev/null[m
[36m@@ -1,245 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-welcome_nginx_facebook[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<Q:>[m
[31m-I am trying to open Facebook, Yahoo!, Yandex, Google, or some[m
[31m-other well known web site and instead I am getting a blank web page[m
[31m-with a message referring to nginx: E<ldquo>Welcome to nginx!E<rdquo> or[m
[31m-E<ldquo>404 Not Found E<sol> nginxE<rdquo>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-I suspect something is wrong and there is probably a malicious attempt[m
[31m-to direct me to a rogue web page (to break into my computer, do[m
[31m-phishing etc.). Why is that, and what has nginx to do with my attempts[m
[31m-to connect to Facebook (Yahoo!, Google, etc.) ?[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-E<nbsp>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-B<A:>[m
[31m-First of all, the E<ldquo>Welcome to nginx!E<rdquo> page you see is[m
[31m-NOT our website. At nginx, we write and distribute a B<free>[m
[31m-L<open source|http://en.wikipedia.org/wiki/Open-source_software> web server software. A web page saying[m
[31m-E<ldquo>Welcome to nginx!E<rdquo> is just a diagnostics response that[m
[31m-can be produced by any of the websites out there, running nginx[m
[31m-web server. Currently, nginx is the 2nd most popular open source[m
[31m-web server in the world, it’s being used by over 126,000,000 (or[m
[31m-14% of the Internet) websites. Most of these websites are[m
[31m-legitimate, but some aren’t. Our software was created with a good[m
[31m-reason of enabling performance and scalability on the Internet,[m
[31m-it is licensed under L<popular open source license|http://nginx.org/LICENSE>, and has nothing to do with any[m
[31m-kind of threatening or malicious activity per se E<8212>[m
[31m-nginx is NOT a malware, and it is NOT on your computer. But someone’s[m
[31m-malware could have indeed tampered with your computer or router,[m
[31m-redirecting you to a fraudulent Internet server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-We recommend running an anti-virus check on your computer, and[m
[31m-we recommend to check and verify your entire system setup with the[m
[31m-help of your ISP, or another support personnel:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-(Disclaimer: at nginx we are not responsible for any negative[m
[31m-impact or effects that the actions below might cause. Use the[m
[31m-following recommendations at your own risk, especially if[m
[31m-you aren’t an experienced user of your operating system andE<sol>or[m
[31m-Internet applications. In no event shall nginx be liable for[m
[31m-any direct, indirect, incidental, special, exemplary, or[m
[31m-consequential damages, including, but not limited to loss of[m
[31m-use, data, or profits; or business interruption).[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Check your TCPE<sol>IP settings and see if the DNS servers[m
[31m-configuration matches the valid one (suggested by your Internet[m
[31m-service provider or IT support personnel).[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Use L<Google[m
[31m-Public DNS|http://developers.google.com/speed/public-dns/>, and see if it fixes the problem. From Google’s[m
[31m-description of its Public DNS E<8212> "Google Public DNS is a free,[m
[31m-global Domain Name System (DNS) resolution service,[m
[31m-that you can use as an alternative to your current DNS[m
[31m-provider. [..] By using Google Public DNS you can: Speed up your[m
[31m-browsing experience. B<Improve your security>."[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Clear your DNS resolver cache. On Microsoft Windows XP go to[m
[31m-Start E<gt> Run, and then type the following command:[m
[31m-"ipconfig E<sol>flushdns". On Microsoft Vista, Windows 7, and[m
[31m-Windows 8 click on Start logo, follow All Programs E<gt> Accessories,[m
[31m-right-click on Command Prompt, choose "Run As Administrator",[m
[31m-type in "ipconfig E<sol>flushdns" and hit Enter.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Click the "page reload" button in your browser. Clear browser[m
[31m-data (cache, cookies etc.). E.g. with Chrome find and click[m
[31m-"Clear Browsing Data" (Settings E<gt> Under the Hood). With Internet[m
[31m-Explorer find Tools E<gt> Internet Options E<gt> General.[m
[31m-B<Caution:> you may be deleting saved passwords information[m
[31m-here, so do it carefully and check what exact actions you are[m
[31m-performing.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Check if the "hosts" file doesn’t contain entries other[m
[31m-than "127.0.0.1 localhost", and if so E<8212> if these entries are for[m
[31m-the web site you’re trying to reach. The "hosts" files is located in[m
[31m-C:\WINDOWS\system32\drivers\etc directory. Typically there should[m
[31m-be just one entry in it, for "127.0.0.1 localhost", that’s it. The[m
[31m-"hosts" file can be viewed and edited with your standard[m
[31m-Notepad application.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Check the plugins and extensions installed with your browser.[m
[31m-Re-install your browser or try an alternative one if possible.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Something must be wrong with your B<operating[m
[31m-system> settings, B<home router> setup, or B<browser>[m
[31m-configuration, if you are trying to access a well known web site[m
[31m-and what you get instead is E<ldquo>Welcome to nginx!E<rdquo>.[m
[31m-This should NOT happen if your computers and network are[m
[31m-clean and safe.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-If changing DNS servers to Google Public DNS, flushing DNS resolver[m
[31m-cache, fixing your browser configuration, or cleaning "hosts" file[m
[31m-(when applicable) have helped, it might be that there’s a malware[m
[31m-somewhere on your PC or around. Find and clean it using[m
[31m-your preferred anti-virus and anti-malware tools.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Additional articles that might be helpful:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-DCWG.org:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<How can you detect if your computer has been violated and infected[m
[31m-with DNS Changer?|http://www.dcwg.org/detect/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<How to clean up or fix malicious software (E<amp>ldquo;malwareE<amp>rdquo;)[m
[31m-associated with DNS Changer|http://www.dcwg.org/fix/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Microsoft:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Malicious Software Removal Tool|http://www.microsoft.com/security/pc-security/malware-removal.aspx>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<How can I reset the Hosts file back to the default?|http://support.microsoft.com/kb/972034>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<How to reset Internet Protocol (TCPE<sol>IP)|http://support.microsoft.com/kb/299357>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Firefox Help:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<Disable or remove Add-ons|http://support.mozilla.org/en-US/kb/disable-or-remove-add-ons>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-Tech-Recipes:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-L<DNS Cache Flush, Clear, or Reset in Vista,[m
[31m-Windows 7, and Windows 8|http://www.tech-recipes.com/rx/1600/vista_dns_cache_flush/>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/windows.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/windows.pod[m
[1mdeleted file mode 100644[m
[1mindex 1e82f0d..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/nginx/windows.pod[m
[1m+++ /dev/null[m
[36m@@ -1,168 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-[m
[31m-windows - nginx for Windows[m
[31m-[m
[31m-[m
[31m-=head1[m
[31m-[m
[31m-[m
[31m-[m
[31m-Version of nginx for Windows uses the native Win32 API (not the Cygwin emulation[m
[31m-layer).[m
[31m-Only the C<select> connection processing method is currently used,[m
[31m-so high performance and scalability should not be expected.[m
[31m-Due to this and some other known issues version of nginx for Windows[m
[31m-is considered to be a I<beta> version.[m
[31m-At this time, it provides almost the same functionality as a UNIX version[m
[31m-of nginx except for[m
[31m-XSLT filter, image filter, GeoIP module, and embedded Perl language.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-To install nginxE<sol>Windows, L<download|download>[m
[31m-the latest mainline version distribution (1.9.7),[m
[31m-since the mainline branch of nginx contains all known fixes.[m
[31m-Then unpack the distribution, go to the[m
[31m-nginx-1.9.7[m
[31m-directory, and run C<nginx>.[m
[31m-Here is an example for the drive C: root directory:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    cd c:\[m
[31m-    unzip nginx-<mainline_version/>.zip[m
[31m-    cd nginx-<mainline_version/>[m
[31m-    start nginx[m
[31m-[m
[31m-[m
[31m-[m
[31m-Run the C<tasklist> command-line utility[m
[31m-to see nginx processes:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    C:\nginx-<mainline_version/>>tasklist /fi "imagename eq nginx.exe"[m
[31m-    [m
[31m-    Image Name           PID Session Name     Session#    Mem Usage[m
[31m-    =============== ======== ============== ========== ============[m
[31m-    nginx.exe            652 Console                 0      2 780 K[m
[31m-    nginx.exe           1332 Console                 0      3 112 K[m
[31m-[m
[31m-[m
[31m-[m
[31m-One of the processes is the master process and another is the worker process.[m
[31m-If nginx does not start, look for the reason in[m
[31m-the error log file F<logs\error.log>.[m
[31m-If the log file has not been created, the reason for this should be reported[m
[31m-in the Windows Event Log.[m
[31m-If an error page is displayed instead of the expected page, also look[m
[31m-for the reason in the F<logs\error.log> file.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginxE<sol>Windows uses the directory where it has been run as the prefix[m
[31m-for relative paths in the configuration.[m
[31m-In the example above, the prefix is[m
[31m-F<C:\nginx-1.9.7\>.[m
[31m-Paths in a configuration file must be specified in UNIX-style using[m
[31m-forward slashes:[m
[31m-[m
[31m-[m
[31m-    [m
[31m-    access_log   logs/site.log;[m
[31m-    root         C:/web/html;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-nginxE<sol>Windows runs as a standard console application (not a service),[m
[31m-and it can be managed using the following commands:[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known issues[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Although several workers can be started, only one of them[m
[31m-actually does any work.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-A worker can handle no more than 1024 simultaneous connections.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The cache and other modules which require shared memory support do not work[m
[31m-on Windows Vista and later versions due to[m
[31m-address space layout randomization being enabled in these Windows versions.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-The UDP proxy functionality is not supported.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Possible future enhancements[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Running as a service.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Using the IE<sol>O completion ports as a connection processing method.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Using multiple worker threads inside a single worker process.[m
[31m-[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/ngx_devel_kit-0.3.0/ngx_devel_kit-0.3.0.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/ngx_devel_kit-0.3.0/ngx_devel_kit-0.3.0.pod[m
[1mdeleted file mode 100644[m
[1mindex 5213b29..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/ngx_devel_kit-0.3.0/ngx_devel_kit-0.3.0.pod[m
[1m+++ /dev/null[m
[36m@@ -1,321 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-NDK - Nginx Development Kit[m
[31m-[m
[31m-[m
[31m-[m
[31m-The NDK is an Nginx module that is designed to extend the core functionality of the[m
[31m-excellent Nginx webserver in a way that can be used as a basis of other Nginx modules.[m
[31m-[m
[31m-It has functions and macros to deal with generic tasks that don't currently have[m
[31m-generic code as part of the core distribution.  The NDK itself adds few features[m
[31m-that are seen from a user's point of view - it's just designed to help reduce the[m
[31m-code that Nginx module developers need to write.[m
[31m-[m
[31m-Nginx module developers wishing to use any of the features in the NDK should specify[m
[31m-that the NDK is a dependency of their module, and that users will need to compile[m
[31m-it as well when they compile their own modules.  They will also need to declare in[m
[31m-their own modules which features of the NDK they wish to use (explained below).[m
[31m-[m
[31m-If you are not an Nginx module developer, then the only useful part of this project[m
[31m-will be the 'usage for users' section below.[m
[31m-[m
[31m-[m
[31m-=head1 Status[m
[31m-[m
[31m-The NDK is now considered to be stable. It is already being used in quite a few third[m
[31m-party modules.[m
[31m-[m
[31m-[m
[31m-=head1 Features[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-additional conf_set functions for regexes, complex/script values, paths...[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-macros to simplify tasks like checking for NULL values when doing ngx_array_push[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-patches to the main source code[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ngx_auto_lib_core generic external library handler is included (see separate readme)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Design[m
[31m-[m
[31m-[m
[31m-=head2 modular[m
[31m-[m
[31m-The kit itself is designed in a modular way, so that only the required code is compiled.[m
[31m-It's possible to add just a single NDK module, a few or all of them.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 auto-generated & easily extensible[m
[31m-[m
[31m-Many of the macros available in the NDK are auto-generated from simple configuration[m
[31m-files.  This makes creating similar macros for your own code very simple - it's usually[m
[31m-just the case of adding an extra line to a config file and re-running the build script.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Usage for users[m
[31m-[m
[31m-If another Nginx module you wish to use specifies that the NDK is a dependency, you[m
[31m-will need to do the following :[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-download the source (https://github.com/simpl/ngx_devel_kit)[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-unpack the source (tar -xzf $name)[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-compile Nginx with the following extra option C<--add-module=/path/to/ngx_devel_kit>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-e.g.[m
[31m-[m
[31m-[m
[31m-    ./configure --add-module=/path/to/ngx_devel_kit \[m
[31m-                --add-module=/path/to/another/module[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;[m
[31m-    load_module /path/to/another/module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Usage for developers[m
[31m-[m
[31m-To use the NDK in your own module, you need to add the following:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-add this line to your module[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-    #include    <ndk.h>[m
[31m-[m
[31m-Note: since the NDK includes the following lines[m
[31m-[m
[31m-[m
[31m-    #include    <ngx_config.h>[m
[31m-    #include    <ngx_core.h>[m
[31m-    #include    <ngx_http.h>[m
[31m-[m
[31m-you can replace these with the single include above.[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-add the following line in the config file for your module:[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-    have=NDK_[module_name]  . auto/have[m
[31m-[m
[31m-for each NDK module that you wish to use (you need to include auto/have multiple[m
[31m-times if you wish to use multiple NDK modules.[m
[31m-[m
[31m-Note: the old method of setting[m
[31m-[m
[31m-[m
[31m-    CFLAGS="$CFLAGS -DNDK_[module_name]"[m
[31m-[m
[31m-is now deprecated. It will still work, but results in unnecessary lines being[m
[31m-displayed when compiling Nginx.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Warning: using NDK_ALL[m
[31m-[m
[31m-You can also set C<NDK_ALL> to include all the NDK modules.  This is primarily as[m
[31m-a convenience in the early stages of development of another module. However,[m
[31m-[m
[31m-DO NOT LEAVE C<NDK_ALL> IN YOUR CONFIG FILE WHEN PUBLISHING[m
[31m-[m
[31m-Although the NDK is fairly small now, it could in time become a large repository[m
[31m-of code that would, if using NDK_ALL, result in considerably more code being compiled[m
[31m-than is necessary.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Modules using NDK[m
[31m-[m
[31m-The following 3rd-party modules make use of NDK.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_lua_module|https://github.com/openresty/lua-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_set_misc_module|https://github.com/openresty/set-misc-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_encrypted_session_module|https://github.com/openresty/encrypted-session-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_form_input_module|https://github.com/calio/form-input-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_iconv_module|https://github.com/calio/iconv-nginx-module#readme>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_http_array_var_module|https://github.com/openresty/array-var-nginx-module#readme>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-documentation for modules that don't already have it[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-additional phase-handler functions[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-generically testing for needing to add a handler[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-remove dependency of set_var on OpenSSL being compiled in[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 License[m
[31m-[m
[31m-Copyright (c) 2010-2016, Marcus Clyne[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are[m
[31m-permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of[m
[31m-conditions and the following disclaimer.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of[m
[31m-conditions and the following disclaimer in the documentation and/or other materials[m
[31m-provided with the distribution.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Neither the name of the copyright holder nor the names of its contributors may be used[m
[31m-to endorse or promote products derived from this software without specific prior[m
[31m-written permission.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS[m
[31m-OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF[m
[31m-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE[m
[31m-COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,[m
[31m-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE[m
[31m-GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED[m
[31m-AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING[m
[31m-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF[m
[31m-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Contributing / Feedback[m
[31m-[m
[31m-If you are an Nginx module developer, and have developed some functions that are[m
[31m-generic in nature (or would be easily adapted to be so), then please send them to[m
[31m-me at the address below, and I'll add them to the kit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Author[m
[31m-[m
[31m-Marcus Clyne (contact at simpl dot it)[m
[31m-[m
[31m-[m
[31m-[m
[1mdiff --git a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/ngx_lua-0.10.5/ngx_lua-0.10.5.pod b/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/ngx_lua-0.10.5/ngx_lua-0.10.5.pod[m
[1mdeleted file mode 100644[m
[1mindex b9bdf86..0000000[m
[1m--- a/qa_shell_script/TEMP/openresty-1.9.15.1/bundle/pod/ngx_lua-0.10.5/ngx_lua-0.10.5.pod[m
[1m+++ /dev/null[m
[36m@@ -1,8869 +0,0 @@[m
[31m-=encoding utf-8[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Name[m
[31m-[m
[31m-ngx_http_lua_module - Embed the power of Lua into Nginx HTTP Servers.[m
[31m-[m
[31m-I<This module is not distributed with the Nginx source.> See L<the installation instructions>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-Production ready.[m
[31m-[m
[31m-[m
[31m-=head1 Version[m
[31m-[m
[31m-This document describes ngx_lua L<v0.10.5|https://github.com/openresty/lua-nginx-module/tags> released on 25 May 2016.[m
[31m-[m
[31m-[m
[31m-=head1 Synopsis[m
[31m-[m
[31m-[m
[31m-     # set search paths for pure Lua external libraries (';;' is the default path):[m
[31m-     lua_package_path '/foo/bar/?.lua;/blah/?.lua;;';[m
[31m-    [m
[31m-     # set search paths for Lua external libraries written in C (can also use ';;'):[m
[31m-     lua_package_cpath '/bar/baz/?.so;/blah/blah/?.so;;';[m
[31m-    [m
[31m-     server {[m
[31m-         location /lua_content {[m
[31m-             # MIME type determined by default_type:[m
[31m-             default_type 'text/plain';[m
[31m-    [m
[31m-             content_by_lua_block {[m
[31m-                 ngx.say('Hello,world!')[m
[31m-             }[m
[31m-         }[m
[31m-    [m
[31m-         location /nginx_var {[m
[31m-             # MIME type determined by default_type:[m
[31m-             default_type 'text/plain';[m
[31m-    [m
[31m-             # try access /nginx_var?a=hello,world[m
[31m-             content_by_lua_block {[m
[31m-                 ngx.say(ngx.var.arg_a)[m
[31m-             }[m
[31m-         }[m
[31m-    [m
[31m-         location = /request_body {[m
[31m-             client_max_body_size 50k;[m
[31m-             client_body_buffer_size 50k;[m
[31m-    [m
[31m-             content_by_lua_block {[m
[31m-                 ngx.req.read_body()  -- explicitly read the req body[m
[31m-                 local data = ngx.req.get_body_data()[m
[31m-                 if data then[m
[31m-                     ngx.say("body data:")[m
[31m-                     ngx.print(data)[m
[31m-                     return[m
[31m-                 end[m
[31m-    [m
[31m-                 -- body may get buffered in a temp file:[m
[31m-                 local file = ngx.req.get_body_file()[m
[31m-                 if file then[m
[31m-                     ngx.say("body is in file ", file)[m
[31m-                 else[m
[31m-                     ngx.say("no body found")[m
[31m-                 end[m
[31m-             }[m
[31m-         }[m
[31m-    [m
[31m-         # transparent non-blocking I/O in Lua via subrequests[m
[31m-         # (well, a better way is to use cosockets)[m
[31m-         location = /lua {[m
[31m-             # MIME type determined by default_type:[m
[31m-             default_type 'text/plain';[m
[31m-    [m
[31m-             content_by_lua_block {[m
[31m-                 local res = ngx.location.capture("/some_other_location")[m
[31m-                 if res then[m
[31m-                     ngx.say("status: ", res.status)[m
[31m-                     ngx.say("body:")[m
[31m-                     ngx.print(res.body)[m
[31m-                 end[m
[31m-             }[m
[31m-         }[m
[31m-    [m
[31m-         location = /foo {[m
[31m-             rewrite_by_lua_block {[m
[31m-                 res = ngx.location.capture("/memc",[m
[31m-                     { args = { cmd = "incr", key = ngx.var.uri } }[m
[31m-                 )[m
[31m-             }[m
[31m-    [m
[31m-             proxy_pass http://blah.blah.com;[m
[31m-         }[m
[31m-    [m
[31m-         location = /mixed {[m
[31m-             rewrite_by_lua_file /path/to/rewrite.lua;[m
[31m-             access_by_lua_file /path/to/access.lua;[m
[31m-             content_by_lua_file /path/to/content.lua;[m
[31m-         }[m
[31m-    [m
[31m-         # use nginx var in code path[m
[31m-         # WARNING: contents in nginx var must be carefully filtered,[m
[31m-         # otherwise there'll be great security risk![m
[31m-         location ~ ^/app/([-_a-zA-Z0-9/]+) {[m
[31m-             set $path $1;[m
[31m-             content_by_lua_file /path/to/lua/app/root/$path.lua;[m
[31m-         }[m
[31m-    [m
[31m-         location / {[m
[31m-            client_max_body_size 100k;[m
[31m-            client_body_buffer_size 100k;[m
[31m-    [m
[31m-            access_by_lua_block {[m
[31m-                -- check the client IP address is in our black list[m
[31m-                if ngx.var.remote_addr == "132.5.72.3" then[m
[31m-                    ngx.exit(ngx.HTTP_FORBIDDEN)[m
[31m-                end[m
[31m-    [m
[31m-                -- check if the URI contains bad words[m
[31m-                if ngx.var.uri and[m
[31m-                       string.match(ngx.var.request_body, "evil")[m
[31m-                then[m
[31m-                    return ngx.redirect("/terms_of_use.html")[m
[31m-                end[m
[31m-    [m
[31m-                -- tests passed[m
[31m-            }[m
[31m-    [m
[31m-            # proxy_pass/fastcgi_pass/etc settings[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Description[m
[31m-[m
[31m-This module embeds Lua, via the standard Lua 5.1 interpreter or L<LuaJIT 2.0E<sol>2.1|http://luajit.org/luajit.html>, into Nginx and by leveraging Nginx's subrequests, allows the integration of the powerful Lua threads (Lua coroutines) into the Nginx event model.[m
[31m-[m
[31m-Unlike L<Apache's mod_lua|https://httpd.apache.org/docs/trunk/mod/mod_lua.html> and L<Lighttpd's mod_magnet|http://redmine.lighttpd.net/wiki/1/Docs:ModMagnet>, Lua code executed using this module can be I<100% non-blocking> on network traffic as long as the L<Nginx API for Lua> provided by this module is used to handle[m
[31m-requests to upstream services such as MySQL, PostgreSQL, Memcached, Redis, or upstream HTTP web services.[m
[31m-[m
[31m-At least the following Lua libraries and Nginx modules can be used with this ngx_lua module:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-memcached|https://github.com/openresty/lua-resty-memcached>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-mysql|https://github.com/openresty/lua-resty-mysql>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-redis|https://github.com/openresty/lua-resty-redis>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-dns|https://github.com/openresty/lua-resty-dns>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-upload|https://github.com/openresty/lua-resty-upload>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-websocket|https://github.com/openresty/lua-resty-websocket>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-lock|https://github.com/openresty/lua-resty-lock>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-logger-socket|https://github.com/cloudflare/lua-resty-logger-socket>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-lrucache|https://github.com/openresty/lua-resty-lrucache>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-string|https://github.com/openresty/lua-resty-string>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_memc|http://github.com/openresty/memc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_postgres|https://github.com/FRiCKLE/ngx_postgres>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_redis2|http://github.com/openresty/redis2-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_redis|http://wiki.nginx.org/HttpRedisModule>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_proxy|http://nginx.org/en/docs/http/ngx_http_proxy_module.html>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_fastcgi|http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Almost all the Nginx modules can be used with this ngx_lua module by means of L<ngx.location.capture> or L<ngx.location.capture_multi> but it is recommended to use those C<lua-resty-*> libraries instead of creating subrequests to access the Nginx upstream modules because the former is usually much more flexible and memory-efficient.[m
[31m-[m
[31m-The Lua interpreter or LuaJIT instance is shared across all the requests in a single nginx worker process but request contexts are segregated using lightweight Lua coroutines.[m
[31m-[m
[31m-Loaded Lua modules persist in the nginx worker process level resulting in a small memory footprint in Lua even when under heavy loads.[m
[31m-[m
[31m-This module is plugged into NGINX's "http" subsystem so it can only speaks downstream communication protocols in the HTTP family (HTTP 0.9/1.0/1.1/2.0, WebSockets, and etc).[m
[31m-If you want to do generic TCP communications with the downstream clients, then you should use the L<ngx_stream_lua|https://github.com/openresty/stream-lua-nginx-module#readme> module instead[m
[31m-which has a compatible Lua API.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Typical Uses[m
[31m-[m
[31m-Just to name a few:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Mashup'ing and processing outputs of various nginx upstream outputs (proxy, drizzle, postgres, redis, memcached, and etc) in Lua,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-doing arbitrarily complex access control and security checks in Lua before requests actually reach the upstream backends,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-manipulating response headers in an arbitrary way (by Lua)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-fetching backend information from external storage backends (like redis, memcached, mysql, postgresql) and use that information to choose which upstream backend to access on-the-fly,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-coding up arbitrarily complex web applications in a content handler using synchronous but still non-blocking access to the database backends and other storage,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-doing very complex URL dispatch in Lua at rewrite phase,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-using Lua to implement advanced caching mechanism for Nginx's subrequests and arbitrary locations.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The possibilities are unlimited as the module allows bringing together various elements within Nginx as well as exposing the power of the Lua language to the user. The module provides the full flexibility of scripting while offering performance levels comparable with native C language programs both in terms of CPU time as well as memory footprint. This is particularly the case when LuaJIT 2.x is enabled.[m
[31m-[m
[31m-Other scripting language implementations typically struggle to match this performance level.[m
[31m-[m
[31m-The Lua state (Lua VM instance) is shared across all the requests handled by a single nginx worker process to minimize memory use.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Nginx Compatibility[m
[31m-[m
[31m-The latest version of this module is compatible with the following versions of Nginx:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.9.x (last tested: 1.9.15)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.8.x[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.7.x (last tested: 1.7.10)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-1.6.x[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Nginx cores older than 1.6.0 (exclusive) are I<not> supported.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Installation[m
[31m-[m
[31m-It is highly recommended to use the L<OpenResty bundle|http://openresty.org> that bundles Nginx, ngx_lua,  LuaJIT 2.0/2.1 (or the optional standard Lua 5.1 interpreter), as well as a package of powerful companion Nginx modules. The basic installation step is a simple command: C<./configure --with-luajit && make && make install>.[m
[31m-[m
[31m-Alternatively, ngx_lua can be manually compiled into Nginx:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Install LuaJIT 2.0 or 2.1 (recommended) or Lua 5.1 (Lua 5.2 is I<not> supported yet). LuaJIT can be downloaded from the L<LuaJIT project website|http://luajit.org/download.html> and Lua 5.1, from the L<Lua project website|http://www.lua.org/>.  Some distribution package managers also distribute LuaJIT and/or Lua.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Download the latest version of the ngx_devel_kit (NDK) module L<HERE|https://github.com/simpl/ngx_devel_kit/tags>.[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Download the latest version of ngx_lua L<HERE|https://github.com/openresty/lua-nginx-module/tags>.[m
[31m-[m
[31m-=item 4.[m
[31m-[m
[31m-Download the latest version of Nginx L<HERE|http://nginx.org/> (See L<Nginx Compatibility>)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Build the source with this module:[m
[31m-[m
[31m-[m
[31m-     wget 'http://nginx.org/download/nginx-1.9.15.tar.gz'[m
[31m-     tar -xzvf nginx-1.9.15.tar.gz[m
[31m-     cd nginx-1.9.15/[m
[31m-    [m
[31m-     # tell nginx's build system where to find LuaJIT 2.0:[m
[31m-     export LUAJIT_LIB=/path/to/luajit/lib[m
[31m-     export LUAJIT_INC=/path/to/luajit/include/luajit-2.0[m
[31m-    [m
[31m-     # tell nginx's build system where to find LuaJIT 2.1:[m
[31m-     export LUAJIT_LIB=/path/to/luajit/lib[m
[31m-     export LUAJIT_INC=/path/to/luajit/include/luajit-2.1[m
[31m-    [m
[31m-     # or tell where to find Lua if using Lua instead:[m
[31m-     #export LUA_LIB=/path/to/lua/lib[m
[31m-     #export LUA_INC=/path/to/lua/include[m
[31m-    [m
[31m-     # Here we assume Nginx is to be installed under /opt/nginx/.[m
[31m-     ./configure --prefix=/opt/nginx \[m
[31m-             --with-ld-opt="-Wl,-rpath,/path/to/luajit-or-lua/lib" \[m
[31m-             --add-module=/path/to/ngx_devel_kit \[m
[31m-             --add-module=/path/to/lua-nginx-module[m
[31m-    [m
[31m-     make -j2[m
[31m-     make install[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Building as a dynamic module[m
[31m-[m
[31m-Starting from NGINX 1.9.11, you can also compile this module as a dynamic module, by using the C<--add-dynamic-module=PATH> option instead of C<--add-module=PATH> on the[m
[31m-C<./configure> command line above. And then you can explicitly load the module in your C<nginx.conf> via the L<load_module|http://nginx.org/en/docs/ngx_core_module.html#load_module>[m
[31m-directive, for example,[m
[31m-[m
[31m-[m
[31m-    load_module /path/to/modules/ndk_http_module.so;  # assuming NDK is built as a dynamic module too[m
[31m-    load_module /path/to/modules/ngx_http_lua_module.so;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 C Macro Configurations[m
[31m-[m
[31m-While building this module either via OpenResty or with the NGINX core, you can define the following C macros via the C compiler options:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<NGX_LUA_USE_ASSERT>[m
[31m-When defined, will enable assertions in the ngx_lua C code base. Recommended for debugging or testing builds. It can introduce some (small) runtime overhead when enabled. This macro was first introduced in the C<v0.9.10> release.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<NGX_LUA_ABORT_AT_PANIC>[m
[31m-When the Lua/LuaJIT VM panics, ngx_lua will instruct the current nginx worker process to quit gracefully by default. By specifying this C macro, ngx_lua will abort the current nginx worker process (which usually result in a core dump file) immediately. This option is useful for debugging VM panics. This option was first introduced in the C<v0.9.8> release.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-C<NGX_LUA_NO_FFI_API>[m
[31m-Excludes pure C API functions for FFI-based Lua API for NGINX (as required by L<lua-resty-core|https://github.com/openresty/lua-resty-core#readme>, for example). Enabling this macro can make the resulting binary code size smaller.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-To enable one or more of these macros, just pass extra C compiler options to the C<./configure> script of either NGINX or OpenResty. For instance,[m
[31m-[m
[31m-    ./configure --with-cc-opt="-DNGX_LUA_USE_ASSERT -DNGX_LUA_ABORT_AT_PANIC"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Installation on Ubuntu 11.10[m
[31m-[m
[31m-Note that it is recommended to use LuaJIT 2.0 or LuaJIT 2.1 instead of the standard Lua 5.1 interpreter wherever possible.[m
[31m-[m
[31m-If the standard Lua 5.1 interpreter is required however, run the following command to install it from the Ubuntu repository:[m
[31m-[m
[31m-[m
[31m-     apt-get install -y lua5.1 liblua5.1-0 liblua5.1-0-dev[m
[31m-[m
[31m-Everything should be installed correctly, except for one small tweak.[m
[31m-[m
[31m-Library name C<liblua.so> has been changed in liblua5.1 package, it only comes with C<liblua5.1.so>, which needs to be symlinked to C</usr/lib> so it could be found during the configuration process.[m
[31m-[m
[31m-[m
[31m-     ln -s /usr/lib/x86_64-linux-gnu/liblua5.1.so /usr/lib/liblua.so[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Community[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 English Mailing List[m
[31m-[m
[31m-The L<openresty-en|https://groups.google.com/group/openresty-en> mailing list is for English speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Chinese Mailing List[m
[31m-[m
[31m-The L<openresty|https://groups.google.com/group/openresty> mailing list is for Chinese speakers.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Code Repository[m
[31m-[m
[31m-The code repository of this project is hosted on github at L<openrestyE<sol>lua-nginx-module|https://github.com/openresty/lua-nginx-module>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Bugs and Patches[m
[31m-[m
[31m-Please submit bug reports, wishlists, or patches by[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-creating a ticket on the L<GitHub Issue Tracker|https://github.com/openresty/lua-nginx-module/issues>,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-or posting to the L<OpenResty community>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Lua/LuaJIT bytecode support[m
[31m-[m
[31m-As from the C<v0.5.0rc32> release, all C<*_by_lua_file> configure directives (such as L<content_by_lua_file>) support loading Lua 5.1 and LuaJIT 2.0/2.1 raw bytecode files directly.[m
[31m-[m
[31m-Please note that the bytecode format used by LuaJIT 2.0/2.1 is not compatible with that used by the standard Lua 5.1 interpreter. So if using LuaJIT 2.0/2.1 with ngx_lua, LuaJIT compatible bytecode files must be generated as shown:[m
[31m-[m
[31m-[m
[31m-     /path/to/luajit/bin/luajit -b /path/to/input_file.lua /path/to/output_file.luac[m
[31m-[m
[31m-The C<-bg> option can be used to include debug information in the LuaJIT bytecode file:[m
[31m-[m
[31m-[m
[31m-     /path/to/luajit/bin/luajit -bg /path/to/input_file.lua /path/to/output_file.luac[m
[31m-[m
[31m-Please refer to the official LuaJIT documentation on the C<-b> option for more details:[m
[31m-[m
[31m-E<lt>http://luajit.org/running.html#opt_bE<gt>[m
[31m-[m
[31m-Also, the bytecode files generated by LuaJIT 2.1 is I<not> compatible with LuaJIT 2.0, and vice versa. The support for LuaJIT 2.1 bytecode was first added in ngx_lua v0.9.3.[m
[31m-[m
[31m-Similarly, if using the standard Lua 5.1 interpreter with ngx_lua, Lua compatible bytecode files must be generated using the C<luac> commandline utility as shown:[m
[31m-[m
[31m-[m
[31m-     luac -o /path/to/output_file.luac /path/to/input_file.lua[m
[31m-[m
[31m-Unlike as with LuaJIT, debug information is included in standard Lua 5.1 bytecode files by default. This can be striped out by specifying the C<-s> option as shown:[m
[31m-[m
[31m-[m
[31m-     luac -s -o /path/to/output_file.luac /path/to/input_file.lua[m
[31m-[m
[31m-Attempts to load standard Lua 5.1 bytecode files into ngx_lua instances linked to LuaJIT 2.0/2.1 or vice versa, will result in an error message, such as that below, being logged into the Nginx C<error.log> file:[m
[31m-[m
[31m-    [error] 13909#0: *1 failed to load Lua inlined code: bad byte-code header in /path/to/test_file.luac[m
[31m-[m
[31m-Loading bytecode files via the Lua primitives like C<require> and C<dofile> should always work as expected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 System Environment Variable Support[m
[31m-[m
[31m-If you want to access the system environment variable, say, C<foo>, in Lua via the standard Lua API L<os.getenv|http://www.lua.org/manual/5.1/manual.html#pdf-os.getenv>, then you should also list this environment variable name in your C<nginx.conf> file via the L<env directive|http://nginx.org/en/docs/ngx_core_module.html#env>. For example,[m
[31m-[m
[31m-[m
[31m-     env foo;[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 HTTP 1.0 support[m
[31m-[m
[31m-The HTTP 1.0 protocol does not support chunked output and requires an explicit C<Content-Length> header when the response body is not empty in order to support the HTTP 1.0 keep-alive.[m
[31m-So when a HTTP 1.0 request is made and the L<lua_http10_buffering> directive is turned C<on>, ngx_lua will buffer the[m
[31m-output of L<ngx.say> and L<ngx.print> calls and also postpone sending response headers until all the response body output is received.[m
[31m-At that time ngx_lua can calculate the total length of the body and construct a proper C<Content-Length> header to return to the HTTP 1.0 client.[m
[31m-If the C<Content-Length> response header is set in the running Lua code, however, this buffering will be disabled even if the L<lua_http10_buffering> directive is turned C<on>.[m
[31m-[m
[31m-For large streaming output responses, it is important to disable the L<lua_http10_buffering> directive to minimise memory usage.[m
[31m-[m
[31m-Note that common HTTP benchmark tools such as C<ab> and C<http_load> issue HTTP 1.0 requests by default.[m
[31m-To force C<curl> to send HTTP 1.0 requests, use the C<-0> option.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Statically Linking Pure Lua Modules[m
[31m-[m
[31m-When LuaJIT 2.x is used, it is possible to statically link the bytecode of pure Lua modules into the Nginx executable.[m
[31m-[m
[31m-Basically you use the C<luajit> executable to compile C<.lua> Lua module files to C<.o> object files containing the exported bytecode data, and then link the C<.o> files directly in your Nginx build.[m
[31m-[m
[31m-Below is a trivial example to demonstrate this. Consider that we have the following C<.lua> file named C<foo.lua>:[m
[31m-[m
[31m-[m
[31m-     -- foo.lua[m
[31m-     local _M = {}[m
[31m-    [m
[31m-     function _M.go()[m
[31m-         print("Hello from foo")[m
[31m-     end[m
[31m-    [m
[31m-     return _M[m
[31m-[m
[31m-And then we compile this C<.lua> file to C<foo.o> file:[m
[31m-[m
[31m-    /path/to/luajit/bin/luajit -bg foo.lua foo.o[m
[31m-[m
[31m-What matters here is the name of the C<.lua> file, which determines how you use this module later on the Lua land. The file name C<foo.o> does not matter at all except the C<.o> file extension (which tells C<luajit> what output format is used). If you want to strip the Lua debug information from the resulting bytecode, you can just specify the C<-b> option above instead of C<-bg>.[m
[31m-[m
[31m-Then when building Nginx or OpenResty, pass the C<--with-ld-opt="foo.o"> option to the C<./configure> script:[m
[31m-[m
[31m-[m
[31m-     ./configure --with-ld-opt="/path/to/foo.o" ...[m
[31m-[m
[31m-Finally, you can just do the following in any Lua code run by ngx_lua:[m
[31m-[m
[31m-[m
[31m-     local foo = require "foo"[m
[31m-     foo.go()[m
[31m-[m
[31m-And this piece of code no longer depends on the external C<foo.lua> file any more because it has already been compiled into the C<nginx> executable.[m
[31m-[m
[31m-If you want to use dot in the Lua module name when calling C<require>, as in[m
[31m-[m
[31m-[m
[31m-     local foo = require "resty.foo"[m
[31m-[m
[31m-then you need to rename the C<foo.lua> file to C<resty_foo.lua> before compiling it down to a C<.o> file with the C<luajit> command-line utility.[m
[31m-[m
[31m-It is important to use exactly the same version of LuaJIT when compiling C<.lua> files to C<.o> files as building nginx + ngx_lua. This is because the LuaJIT bytecode format may be incompatible between different LuaJIT versions. When the bytecode format is incompatible, you will see a Lua runtime error saying that the Lua module is not found.[m
[31m-[m
[31m-When you have multiple C<.lua> files to compile and link, then just specify their C<.o> files at the same time in the value of the C<--with-ld-opt> option. For instance,[m
[31m-[m
[31m-[m
[31m-     ./configure --with-ld-opt="/path/to/foo.o /path/to/bar.o" ...[m
[31m-[m
[31m-If you have just too many C<.o> files, then it might not be feasible to name them all in a single command. In this case, you can build a static library (or archive) for your C<.o> files, as in[m
[31m-[m
[31m-[m
[31m-     ar rcus libmyluafiles.a *.o[m
[31m-[m
[31m-then you can link the C<myluafiles> archive as a whole to your nginx executable:[m
[31m-[m
[31m-[m
[31m-     ./configure \[m
[31m-         --with-ld-opt="-L/path/to/lib -Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive"[m
[31m-[m
[31m-where C</path/to/lib> is the path of the directory containing the C<libmyluafiles.a> file. It should be noted that the linker option C<--whole-archive> is required here because otherwise our archive will be skipped because no symbols in our archive are mentioned in the main parts of the nginx executable.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Data Sharing within an Nginx Worker[m
[31m-[m
[31m-To globally share data among all the requests handled by the same nginx worker process, encapsulate the shared data into a Lua module, use the Lua C<require> builtin to import the module, and then manipulate the shared data in Lua. This works because required Lua modules are loaded only once and all coroutines will share the same copy of the module (both its code and data). Note however that Lua global variables (note, not module-level variables) WILL NOT persist between requests because of the one-coroutine-per-request isolation design.[m
[31m-[m
[31m-Here is a complete small example:[m
[31m-[m
[31m-[m
[31m-     -- mydata.lua[m
[31m-     local _M = {}[m
[31m-    [m
[31m-     local data = {[m
[31m-         dog = 3,[m
[31m-         cat = 4,[m
[31m-         pig = 5,[m
[31m-     }[m
[31m-    [m
[31m-     function _M.get_age(name)[m
[31m-         return data[name][m
[31m-     end[m
[31m-    [m
[31m-     return _M[m
[31m-[m
[31m-and then accessing it from C<nginx.conf>:[m
[31m-[m
[31m-[m
[31m-     location /lua {[m
[31m-         content_by_lua '[m
[31m-             local mydata = require "mydata"[m
[31m-             ngx.say(mydata.get_age("dog"))[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-The C<mydata> module in this example will only be loaded and run on the first request to the location C</lua>,[m
[31m-and all subsequent requests to the same nginx worker process will use the reloaded instance of the[m
[31m-module as well as the same copy of the data in it, until a C<HUP> signal is sent to the Nginx master process to force a reload.[m
[31m-This data sharing technique is essential for high performance Lua applications based on this module.[m
[31m-[m
[31m-Note that this data sharing is on a I<per-worker> basis and not on a I<per-server> basis. That is, when there are multiple nginx worker processes under an Nginx master, data sharing cannot cross the process boundary between these workers.[m
[31m-[m
[31m-It is usually recommended to share read-only data this way. You can also share changeable data among all the concurrent requests of each nginx worker process as[m
[31m-long as there is I<no> nonblocking I/O operations (including L<ngx.sleep>)[m
[31m-in the middle of your calculations. As long as you do not give the[m
[31m-control back to the nginx event loop and ngx_lua's light thread[m
[31m-scheduler (even implicitly), there can never be any race conditions in[m
[31m-between. For this reason, always be very careful when you want to share changeable data on the[m
[31m-worker level. Buggy optimizations can easily lead to hard-to-debug[m
[31m-race conditions under load.[m
[31m-[m
[31m-If server-wide data sharing is required, then use one or more of the following approaches:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-Use the L<ngx.shared.DICT> API provided by this module.[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Use only a single nginx worker and a single server (this is however not recommended when there is a multi core CPU or multiple CPUs in a single machine).[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-Use data storage mechanisms such as C<memcached>, C<redis>, C<MySQL> or C<PostgreSQL>. L<The OpenResty bundle|http://openresty.org> associated with this module comes with a set of companion Nginx modules and Lua libraries that provide interfaces with these data storage mechanisms.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Known Issues[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 TCP socket connect operation issues[m
[31m-[m
[31m-The L<tcpsock:connect> method may indicate C<success> despite connection failures such as with C<Connection Refused> errors. [m
[31m-[m
[31m-However, later attempts to manipulate the cosocket object will fail and return the actual error status message generated by the failed connect operation. [m
[31m-[m
[31m-This issue is due to limitations in the Nginx event model and only appears to affect Mac OS X.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Lua Coroutine Yielding/Resuming[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Because Lua's C<dofile> and C<require> builtins are currently implemented as C functions in both Lua 5.1 and LuaJIT 2.0/2.1, if the Lua file being loaded by C<dofile> or C<require> invokes L<ngx.location.capture*>, L<ngx.exec>, L<ngx.exit>, or other API functions requiring yielding in the I<top-level> scope of the Lua file, then the Lua error "attempt to yield across C-call boundary" will be raised. To avoid this, put these calls requiring yielding into your own Lua functions in the Lua file instead of the top-level scope of the file.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-As the standard Lua 5.1 interpreter's VM is not fully resumable, the methods L<ngx.location.capture>, L<ngx.location.capture_multi>, L<ngx.redirect>, L<ngx.exec>, and L<ngx.exit> cannot be used within the context of a Lua L<pcall()|http://www.lua.org/manual/5.1/manual.html#pdf-pcall> or L<xpcall()|http://www.lua.org/manual/5.1/manual.html#pdf-xpcall> or even the first line of the C<for ... in ...> statement when the standard Lua 5.1 interpreter is used and the C<attempt to yield across metamethod/C-call boundary> error will be produced. Please use LuaJIT 2.x, which supports a fully resumable VM, to avoid this.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Lua Variable Scope[m
[31m-[m
[31m-Care must be taken when importing modules and this form should be used:[m
[31m-[m
[31m-[m
[31m-     local xxx = require('xxx')[m
[31m-[m
[31m-instead of the old deprecated form:[m
[31m-[m
[31m-[m
[31m-     require('xxx')[m
[31m-[m
[31m-Here is the reason: by design, the global environment has exactly the same lifetime as the Nginx request handler associated with it. Each request handler has its own set of Lua global variables and that is the idea of request isolation. The Lua module is actually loaded by the first Nginx request handler and is cached by the C<require()> built-in in the C<package.loaded> table for later reference, and the C<module()> builtin used by some Lua modules has the side effect of setting a global variable to the loaded module table. But this global variable will be cleared at the end of the request handler,  and every subsequent request handler all has its own (clean) global environment. So one will get Lua exception for accessing the C<nil> value.[m
[31m-[m
[31m-Generally, use of Lua global variables is a really really bad idea in the context of ngx_lua because[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-misuse of Lua globals has very bad side effects for concurrent requests when these variables are actually supposed to be local only,[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-Lua global variables require Lua table look-up in the global environment (which is just a Lua table), which is kinda expensive, and[m
[31m-[m
[31m-=item 3.[m
[31m-[m
[31m-some Lua global variable references are just typos, which are hard to debug.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-It's I<highly> recommended to always declare them via "local" in the scope that is reasonable.[m
[31m-[m
[31m-To find out all the uses of Lua global variables in your Lua code, you can run the L<lua-releng tool|https://github.com/openresty/nginx-devel-utils/blob/master/lua-releng> across all your .lua source files:[m
[31m-[m
[31m-    $ lua-releng[m
[31m-    Checking use of Lua global variables in file lib/foo/bar.lua ...[m
[31m-            1       [1489]  SETGLOBAL       7 -1    ; contains[m
[31m-            55      [1506]  GETGLOBAL       7 -3    ; setvar[m
[31m-            3       [1545]  GETGLOBAL       3 -4    ; varexpand[m
[31m-[m
[31m-The output says that the line 1489 of file C<lib/foo/bar.lua> writes to a global variable named C<contains>, the line 1506 reads from the global variable C<setvar>, and line 1545 reads the global C<varexpand>.[m
[31m-[m
[31m-This tool will guarantee that local variables in the Lua module functions are all declared with the C<local> keyword, otherwise a runtime exception will be thrown. It prevents undesirable race conditions while accessing such variables. See L<Data Sharing within an Nginx Worker> for the reasons behind this.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Locations Configured by Subrequest Directives of Other Modules[m
[31m-[m
[31m-The L<ngx.location.capture> and L<ngx.location.capture_multi> directives cannot capture locations that include the L<add_before_body|http://nginx.org/en/docs/http/ngx_http_addition_module.html#add_before_body>, L<add_after_body|http://nginx.org/en/docs/http/ngx_http_addition_module.html#add_after_body>, L<auth_request|http://nginx.org/en/docs/http/ngx_http_auth_request_module.html#auth_request>, L<echo_location|http://github.com/openresty/echo-nginx-module#echo_location>, L<echo_location_async|http://github.com/openresty/echo-nginx-module#echo_location_async>, L<echo_subrequest|http://github.com/openresty/echo-nginx-module#echo_subrequest>, or L<echo_subrequest_async|http://github.com/openresty/echo-nginx-module#echo_subrequest_async> directives.[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         content_by_lua '[m
[31m-             res = ngx.location.capture("/bar")[m
[31m-         ';[m
[31m-     }[m
[31m-     location /bar {[m
[31m-         echo_location /blah;[m
[31m-     }[m
[31m-     location /blah {[m
[31m-         echo "Success!";[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-     $ curl -i http://example.com/foo[m
[31m-[m
[31m-will not work as expected.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Cosockets Not Available Everywhere[m
[31m-[m
[31m-Due the internal limitations in the nginx core, the cosocket API are disabled in the following contexts: L<set_by_lua*>, L<log_by_lua*>, L<header_filter_by_lua*>, and L<body_filter_by_lua>.[m
[31m-[m
[31m-The cosockets are currently also disabled in the L<init_by_lua*> and L<init_worker_by_lua*> directive contexts but we may add support for these contexts in the future because there is no limitation in the nginx core (or the limitation might be worked around).[m
[31m-[m
[31m-There exists a work-around, however, when the original context does I<not> need to wait for the cosocket results. That is, creating a 0-delay timer via the L<ngx.timer.at> API and do the cosocket results in the timer handler, which runs asynchronously as to the original context creating the timer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Special Escaping Sequences[m
[31m-[m
[31m-B<WARNING> We no longer suffer from this pitfall since the introduction of the[m
[31m-C<*_by_lua_block {}> configuration directives.[m
[31m-[m
[31m-PCRE sequences such as C<\d>, C<\s>, or C<\w>, require special attention because in string literals, the backslash character, C<\>, is stripped out by both the Lua language parser and by the Nginx config file parser before processing. So the following snippet will not work as expected:[m
[31m-[m
[31m-[m
[31m-     # nginx.conf[m
[31m-     ? location /test {[m
[31m-     ?     content_by_lua '[m
[31m-     ?         local regex = "\d+"  -- THIS IS WRONG!![m
[31m-     ?         local m = ngx.re.match("hello, 1234", regex)[m
[31m-     ?         if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-     ?     ';[m
[31m-     ? }[m
[31m-     # evaluates to "not matched!"[m
[31m-[m
[31m-To avoid this, I<double> escape the backslash:[m
[31m-[m
[31m-[m
[31m-     # nginx.conf[m
[31m-     location /test {[m
[31m-         content_by_lua '[m
[31m-             local regex = "\\\\d+"[m
[31m-             local m = ngx.re.match("hello, 1234", regex)[m
[31m-             if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-         ';[m
[31m-     }[m
[31m-     # evaluates to "1234"[m
[31m-[m
[31m-Here, C<\\\\d+> is stripped down to C<\\d+> by the Nginx config file parser and this is further stripped down to C<\d+> by the Lua language parser before running.[m
[31m-[m
[31m-Alternatively, the regex pattern can be presented as a long-bracketed Lua string literal by encasing it in "long brackets", C<[[...]]>, in which case backslashes have to only be escaped once for the Nginx config file parser. [m
[31m-[m
[31m-[m
[31m-     # nginx.conf[m
[31m-     location /test {[m
[31m-         content_by_lua '[m
[31m-             local regex = [[\\d+]][m
[31m-             local m = ngx.re.match("hello, 1234", regex)[m
[31m-             if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-         ';[m
[31m-     }[m
[31m-     # evaluates to "1234"[m
[31m-[m
[31m-Here, C<[[\\d+]]> is stripped down to C<[[\d+]]> by the Nginx config file parser and this is processed correctly.[m
[31m-[m
[31m-Note that a longer from of the long bracket, C<[=[...]=]>, may be required if the regex pattern contains C<[...]> sequences. [m
[31m-The C<[=[...]=]> form may be used as the default form if desired.[m
[31m-[m
[31m-[m
[31m-     # nginx.conf[m
[31m-     location /test {[m
[31m-         content_by_lua '[m
[31m-             local regex = [=[[0-9]+]=][m
[31m-             local m = ngx.re.match("hello, 1234", regex)[m
[31m-             if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-         ';[m
[31m-     }[m
[31m-     # evaluates to "1234"[m
[31m-[m
[31m-An alternative approach to escaping PCRE sequences is to ensure that Lua code is placed in external script files and executed using the various C<*_by_lua_file> directives. [m
[31m-With this approach, the backslashes are only stripped by the Lua language parser and therefore only need to be escaped once each.[m
[31m-[m
[31m-[m
[31m-     -- test.lua[m
[31m-     local regex = "\\d+"[m
[31m-     local m = ngx.re.match("hello, 1234", regex)[m
[31m-     if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-     -- evaluates to "1234"[m
[31m-[m
[31m-Within external script files, PCRE sequences presented as long-bracketed Lua string literals do not require modification. [m
[31m-[m
[31m-[m
[31m-     -- test.lua[m
[31m-     local regex = [[\d+]][m
[31m-     local m = ngx.re.match("hello, 1234", regex)[m
[31m-     if m then ngx.say(m[0]) else ngx.say("not matched!") end[m
[31m-     -- evaluates to "1234"[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Mixing with SSI Not Supported[m
[31m-[m
[31m-Mixing SSI with ngx_lua in the same Nginx request is not supported at all. Just use ngx_lua exclusively. Everything you can do with SSI can be done atop ngx_lua anyway and it can be more efficient when using ngx_lua.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 SPDY Mode Not Fully Supported[m
[31m-[m
[31m-Certain Lua APIs provided by ngx_lua do not work in Nginx's SPDY mode yet: L<ngx.location.capture>, L<ngx.location.capture_multi>, and L<ngx.req.socket>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 Missing data on short circuited requests[m
[31m-[m
[31m-Nginx may terminate a request early with (at least):[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-400 (Bad Request)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-405 (Not Allowed)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-408 (Request Timeout)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-414 (Request URI Too Large)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-494 (Request Headers Too Large)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-499 (Client Closed Request)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-500 (Internal Server Error)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-501 (Not Implemented)[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-This means that phases that normally run are skipped, such as the rewrite or[m
[31m-access phase. This also means that later phases that are run regardless, e.g.[m
[31m-L<log_by_lua>, will not have access to information that is normally set in those[m
[31m-phases.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 TODO[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: implement LuaSocket's unconnected UDP API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-port this module to the "datagram" subsystem of NGINX for implementing general UDP servers instead of HTTP[m
[31m-servers in Lua. For example,[m
[31m-[m
[31m-     datagram {[m
[31m-         server {[m
[31m-             listen 1953;[m
[31m-             handler_by_lua '[m
[31m-                 -- custom Lua code implementing the special UDP server...[m
[31m-             ';[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-shm: implement a "shared queue API" to complement the existing L<shared dict> API.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: add support in the context of L<init_by_lua*>.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: implement the C<bind()> method for stream-typed cosockets.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: pool-based backend concurrency level control: implement automatic C<connect> queueing when the backend concurrency exceeds its connection pool limit.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: review and merge aviramc's L<patch|https://github.com/openresty/lua-nginx-module/pull/290> for adding the C<bsdrecv> method.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add new API function C<ngx.resp.add_header> to emulate the standard C<add_header> config directive.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-review and apply Jader H. Silva's patch for C<ngx.re.split()>.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-review and apply vadim-pavlov's patch for L<ngx.location.capture>'s C<extra_headers> option[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-use C<ngx_hash_t> to optimize the built-in header look-up process for L<ngx.req.set_header>, L<ngx.header.HEADER>, and etc.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add configure options for different strategies of handling the cosocket connection exceeding in the pools.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add directives to run Lua codes when nginx stops.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add C<ignore_resp_headers>, C<ignore_resp_body>, and C<ignore_resp> options to L<ngx.location.capture> and L<ngx.location.capture_multi> methods, to allow micro performance tuning on the user side.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add automatic Lua code time slicing support by yielding and resuming the Lua VM actively via Lua's debug hooks.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-add C<stat> mode similar to L<mod_lua|https://httpd.apache.org/docs/trunk/mod/mod_lua.html>.[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-cosocket: add client SSL certificiate support.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Changes[m
[31m-[m
[31m-The changes of every release of this module can be obtained from the OpenResty bundle's change logs:[m
[31m-[m
[31m-E<lt>http://openresty.org/#ChangesE<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Test Suite[m
[31m-[m
[31m-The following dependencies are required to run the test suite:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Nginx version E<gt>= 1.4.2[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Perl modules:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Test::Nginx: E<lt>https://github.com/openresty/test-nginxE<gt>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Nginx modules:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_set_misc|https://github.com/openresty/set-misc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_auth_request|http://mdounin.ru/files/ngx_http_auth_request_module-0.2.tar.gz> (this is not needed if you're using Nginx 1.5.4+.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_echo|https://github.com/openresty/echo-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_memc|https://github.com/openresty/memc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_srcache|https://github.com/openresty/srcache-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-ngx_lua (i.e., this module)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_lua_upstream|https://github.com/openresty/lua-upstream-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_headers_more|https://github.com/openresty/headers-more-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_drizzle|https://github.com/openresty/drizzle-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_rds_json|https://github.com/openresty/rds-json-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_coolkit|https://github.com/FRiCKLE/ngx_coolkit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_redis2|https://github.com/openresty/redis2-nginx-module>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The order in which these modules are added during configuration is important because the position of any filter module in the[m
[31m-filtering chain determines the final output, for example. The correct adding order is shown above.[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-3rd-party Lua libraries:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-cjson|http://www.kyne.com.au/~mark/software/lua-cjson.php>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Applications:[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-mysql: create database 'ngx_test', grant all privileges to user 'ngx_test', password is 'ngx_test'[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-memcached: listening on the default port, 11211.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-redis: listening on the default port, 6379.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-See also the L<developer build script|https://github.com/openresty/lua-nginx-module/blob/master/util/build.sh> for more details on setting up the testing environment.[m
[31m-[m
[31m-To run the whole test suite in the default testing mode:[m
[31m-[m
[31m-    cd /path/to/lua-nginx-module[m
[31m-    export PATH=/path/to/your/nginx/sbin:$PATH[m
[31m-    prove -I/path/to/test-nginx/lib -r t[m
[31m-[m
[31m-To run specific test files:[m
[31m-[m
[31m-    cd /path/to/lua-nginx-module[m
[31m-    export PATH=/path/to/your/nginx/sbin:$PATH[m
[31m-    prove -I/path/to/test-nginx/lib t/002-content.t t/003-errors.t[m
[31m-[m
[31m-To run a specific test block in a particular test file, add the line C<--- ONLY> to the test block you want to run, and then use the C<prove> utility to run that C<.t> file.[m
[31m-[m
[31m-There are also various testing modes based on mockeagain, valgrind, and etc. Refer to the L<Test::Nginx documentation|http://search.cpan.org/perldoc?Test::Nginx> for more details for various advanced testing modes. See also the test reports for the Nginx test cluster running on Amazon EC2: E<lt>http://qa.openresty.org.E<gt>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Copyright and License[m
[31m-[m
[31m-This module is licensed under the BSD license.[m
[31m-[m
[31m-Copyright (C) 2009-2016, by Xiaozhe Wang (chaoslawful) E<lt>chaoslawful@gmail.comE<gt>.[m
[31m-[m
[31m-Copyright (C) 2009-2016, by Yichun "agentzh" Zhang (章亦春) E<lt>agentzh@gmail.comE<gt>, CloudFlare Inc.[m
[31m-[m
[31m-All rights reserved.[m
[31m-[m
[31m-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 See Also[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_stream_lua_module|https://github.com/openresty/stream-lua-nginx-module#readme> for an official port of this module for the NGINX "stream" subsystem (doing generic downstream TCP communications).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-memcached|https://github.com/openresty/lua-resty-memcached> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-redis|https://github.com/openresty/lua-resty-redis> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-mysql|https://github.com/openresty/lua-resty-mysql> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-upload|https://github.com/openresty/lua-resty-upload> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-dns|https://github.com/openresty/lua-resty-dns> library based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-websocket|https://github.com/openresty/lua-resty-websocket> library for both WebSocket server and client, based on ngx_lua cosocket.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-string|https://github.com/openresty/lua-resty-string> library based on L<LuaJIT FFI|http://luajit.org/ext_ffi.html>.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-lock|https://github.com/openresty/lua-resty-lock> library for a nonblocking simple lock API.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua-resty-cookie|https://github.com/cloudflare/lua-resty-cookie> library for HTTP cookie manipulation.[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Routing requests to different MySQL queries based on URI arguments|http://openresty.org/#RoutingMySQLQueriesBasedOnURIArgs>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Dynamic Routing Based on Redis and Lua|http://openresty.org/#DynamicRoutingBasedOnRedis>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Using LuaRocks with ngx_lua|http://openresty.org/#UsingLuaRocks>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Introduction to ngx_lua|https://github.com/openresty/lua-nginx-module/wiki/Introduction>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<echo-nginx-module|http://github.com/openresty/echo-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<drizzle-nginx-module|http://github.com/openresty/drizzle-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<postgres-nginx-module|https://github.com/FRiCKLE/ngx_postgres>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<memc-nginx-module|http://github.com/openresty/memc-nginx-module>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<The OpenResty bundle|http://openresty.org>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<Nginx Systemtap Toolkit|https://github.com/openresty/nginx-systemtap-toolkit>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head1 Directives[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_use_default_type>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_code_cache>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_regex_cache_max_entries>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_regex_match_limit>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_package_path>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_package_cpath>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_worker_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_worker_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<init_worker_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<set_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<content_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<content_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<content_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rewrite_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rewrite_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rewrite_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<access_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<access_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<access_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<header_filter_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<header_filter_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<header_filter_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<body_filter_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<body_filter_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<body_filter_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<log_by_lua>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<log_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<log_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<balancer_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<balancer_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_need_request_body>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ssl_certificate_by_lua_block>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<ssl_certificate_by_lua_file>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_shared_dict>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_connect_timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_send_timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_send_lowat>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_read_timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_buffer_size>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_pool_size>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_keepalive_timeout>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_socket_log_errors>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_ciphers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_crl>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_protocols>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_trusted_certificate>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_ssl_verify_depth>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_http10_buffering>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<rewrite_by_lua_no_postpone>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<access_by_lua_no_postpone>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_transform_underscores_in_response_headers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_check_client_abort>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_max_pending_timers>[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-L<lua_max_running_timers>[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-The basic building blocks of scripting Nginx with Lua are directives. Directives are used to specify when the user Lua code is run and[m
[31m-how the result will be used. Below is a diagram showing the order in which directives are executed.[m
[31m-[m
[31m-!L<Lua Nginx Modules Directives|https://cloud.githubusercontent.com/assets/2137369/15272097/77d1c09e-1a37-11e6-97ef-d9767035fc3e.png>[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_use_default_type[m
[31m-[m
[31m-B<syntax:> I<lua_use_default_type on | off>[m
[31m-[m
[31m-B<default:> I<lua_use_default_type on>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Specifies whether to use the MIME type specified by the L<default_type|http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type> directive for the default value of the C<Content-Type> response header. If you do not want a default C<Content-Type> response header for your Lua request handlers, then turn this directive off.[m
[31m-[m
[31m-This directive is turned on by default.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_code_cache[m
[31m-[m
[31m-B<syntax:> I<lua_code_cache on | off>[m
[31m-[m
[31m-B<default:> I<lua_code_cache on>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-Enables or disables the Lua code cache for Lua code in C<*_by_lua_file> directives (like L<set_by_lua_file> and[m
[31m-L<content_by_lua_file>) and Lua modules.[m
[31m-[m
[31m-When turning off, every request served by ngx_lua will run in a separate Lua VM instance, starting from the C<0.9.3> release. So the Lua files referenced in L<set_by_lua_file>,[m
[31m-L<content_by_lua_file>, L<access_by_lua_file>,[m
[31m-and etc will not be cached[m
[31m-and all Lua modules used will be loaded from scratch. With this in place, developers can adopt an edit-and-refresh approach.[m
[31m-[m
[31m-Please note however, that Lua code written inlined within nginx.conf[m
[31m-such as those specified by L<set_by_lua>, L<content_by_lua>,[m
[31m-L<access_by_lua>, and L<rewrite_by_lua> will not be updated when you edit the inlined Lua code in your C<nginx.conf> file because only the Nginx config file parser can correctly parse the C<nginx.conf>[m
[31m-file and the only way is to reload the config file[m
[31m-by sending a C<HUP> signal or just to restart Nginx.[m
[31m-[m
[31m-Even when the code cache is enabled, Lua files which are loaded by C<dofile> or C<loadfile>[m
[31m-in *_by_lua_file cannot be cached (unless you cache the results yourself). Usually you can either use the L<init_by_lua>[m
[31m-or L<init_by_lua_file> directives to load all such files or just make these Lua files true Lua modules[m
[31m-and load them via C<require>.[m
[31m-[m
[31m-The ngx_lua module does not support the C<stat> mode available with the[m
[31m-Apache C<mod_lua> module (yet).[m
[31m-[m
[31m-Disabling the Lua code cache is strongly[m
[31m-discouraged for production use and should only be used during [m
[31m-development as it has a significant negative impact on overall performance. For example, the performance a "hello world" Lua example can drop by an order of magnitude after disabling the Lua code cache.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_regex_cache_max_entries[m
[31m-[m
[31m-B<syntax:> I<lua_regex_cache_max_entries E<lt>numE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_regex_cache_max_entries 1024>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Specifies the maximum number of entries allowed in the worker process level compiled regex cache.[m
[31m-[m
[31m-The regular expressions used in L<ngx.re.match>, L<ngx.re.gmatch>, L<ngx.re.sub>, and L<ngx.re.gsub> will be cached within this cache if the regex option C<o> (i.e., compile-once flag) is specified.[m
[31m-[m
[31m-The default number of entries allowed is 1024 and when this limit is reached, new regular expressions will not be cached (as if the C<o> option was not specified) and there will be one, and only one, warning in the C<error.log> file:[m
[31m-[m
[31m-    2011/08/27 23:18:26 [warn] 31997#0: *1 lua exceeding regex cache max entries (1024), ...[m
[31m-[m
[31m-Do not activate the C<o> option for regular expressions (and/or C<replace> string arguments for L<ngx.re.sub> and L<ngx.re.gsub>) that are generated I<on the fly> and give rise to infinite variations to avoid hitting the specified limit.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_regex_match_limit[m
[31m-[m
[31m-B<syntax:> I<lua_regex_match_limit E<lt>numE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_regex_match_limit 0>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Specifies the "match limit" used by the PCRE library when executing the L<ngx.re API>. To quote the PCRE manpage, "the limit ... has the effect of limiting the amount of backtracking that can take place."[m
[31m-[m
[31m-When the limit is hit, the error string "pcre_exec() failed: -8" will be returned by the L<ngx.re API> functions on the Lua land.[m
[31m-[m
[31m-When setting the limit to 0, the default "match limit" when compiling the PCRE library is used. And this is the default value of this directive.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.8.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_package_path[m
[31m-[m
[31m-B<syntax:> I<lua_package_path E<lt>lua-style-path-strE<gt>>[m
[31m-[m
[31m-B<default:> I<The content of LUA_PATH environ variable or Lua's compiled-in defaults.>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Sets the Lua module search path used by scripts specified by L<set_by_lua>,[m
[31m-L<content_by_lua> and others. The path string is in standard Lua path form, and C<;;>[m
[31m-can be used to stand for the original search paths.[m
[31m-[m
[31m-As from the C<v0.5.0rc29> release, the special notation C<$prefix> or C<${prefix}> can be used in the search path string to indicate the path of the C<server prefix> usually determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_package_cpath[m
[31m-[m
[31m-B<syntax:> I<lua_package_cpath E<lt>lua-style-cpath-strE<gt>>[m
[31m-[m
[31m-B<default:> I<The content of LUA_CPATH environment variable or Lua's compiled-in defaults.>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-Sets the Lua C-module search path used by scripts specified by L<set_by_lua>,[m
[31m-L<content_by_lua> and others. The cpath string is in standard Lua cpath form, and C<;;>[m
[31m-can be used to stand for the original cpath.[m
[31m-[m
[31m-As from the C<v0.5.0rc29> release, the special notation C<$prefix> or C<${prefix}> can be used in the search path string to indicate the path of the C<server prefix> usually determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_by_lua[m
[31m-[m
[31m-B<syntax:> I<init_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<loading-config>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<init_by_lua_block> directive instead.[m
[31m-[m
[31m-Runs the Lua code specified by the argument C<< <lua-script-str> >> on the global Lua VM level when the Nginx master process (if any) is loading the Nginx config file.[m
[31m-[m
[31m-When Nginx receives the C<HUP> signal and starts reloading the config file, the Lua VM will also be re-created and C<init_by_lua> will run again on the new Lua VM. In case that the L<lua_code_cache> directive is turned off (default on), the C<init_by_lua> handler will run upon every request because in this special mode a standalone Lua VM is always created for each request.[m
[31m-[m
[31m-Usually you can register (true) Lua global variables or pre-load Lua modules at server start-up by means of this hook. Here is an example for pre-loading Lua modules:[m
[31m-[m
[31m-[m
[31m-     init_by_lua 'cjson = require "cjson"';[m
[31m-    [m
[31m-     server {[m
[31m-         location = /api {[m
[31m-             content_by_lua '[m
[31m-                 ngx.say(cjson.encode({dog = 5, cat = 6}))[m
[31m-             ';[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-You can also initialize the L<lua_shared_dict> shm storage at this phase. Here is an example for this:[m
[31m-[m
[31m-[m
[31m-     lua_shared_dict dogs 1m;[m
[31m-    [m
[31m-     init_by_lua '[m
[31m-         local dogs = ngx.shared.dogs;[m
[31m-         dogs:set("Tom", 56)[m
[31m-     ';[m
[31m-    [m
[31m-     server {[m
[31m-         location = /api {[m
[31m-             content_by_lua '[m
[31m-                 local dogs = ngx.shared.dogs;[m
[31m-                 ngx.say(dogs:get("Tom"))[m
[31m-             ';[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-But note that, the L<lua_shared_dict>'s shm storage will not be cleared through a config reload (via the C<HUP> signal, for example). So if you do I<not> want to re-initialize the shm storage in your C<init_by_lua> code in this case, then you just need to set a custom flag in the shm storage and always check the flag in your C<init_by_lua> code.[m
[31m-[m
[31m-Because the Lua code in this context runs before Nginx forks its worker processes (if any), data or code loaded here will enjoy the L<Copy-on-write (COW)|http://en.wikipedia.org/wiki/Copy-on-write> feature provided by many operating systems among all the worker processes, thus saving a lot of memory.[m
[31m-[m
[31m-Do I<not> initialize your own Lua global variables in this context because use of Lua global variables have performance penalties and can lead to global namespace pollution (see the L<Lua Variable Scope> section for more details). The recommended way is to use proper L<Lua module|http://www.lua.org/manual/5.1/manual.html#5.3> files (but do not use the standard Lua function L<module()|http://www.lua.org/manual/5.1/manual.html#pdf-module> to define Lua modules because it pollutes the global namespace as well) and call L<require()|http://www.lua.org/manual/5.1/manual.html#pdf-require> to load your own module files in C<init_by_lua> or other contexts (L<require()|http://www.lua.org/manual/5.1/manual.html#pdf-require> does cache the loaded Lua modules in the global C<package.loaded> table in the Lua registry so your modules will only loaded once for the whole Lua VM instance).[m
[31m-[m
[31m-Only a small set of the L<Nginx API for Lua> is supported in this context:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Logging APIs: L<ngx.log> and L<print>,[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Shared Dictionary API: L<ngx.shared.DICT>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-More Nginx APIs for Lua may be supported in this context upon future user requests.[m
[31m-[m
[31m-Basically you can safely use Lua libraries that do blocking I/O in this very context because blocking the master process during server start-up is completely okay. Even the Nginx core does blocking I/O (at least on resolving upstream's host names) at the configure-loading phase.[m
[31m-[m
[31m-You should be very careful about potential security vulnerabilities in your Lua code registered in this context because the Nginx master process is often run under the C<root> account.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<init_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<loading-config>[m
[31m-[m
[31m-Similar to the L<init_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     init_by_lua_block {[m
[31m-         print("I need no extra escaping here, for example: \r\nblah")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<init_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<loading-config>[m
[31m-[m
[31m-Equivalent to L<init_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code or L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_worker_by_lua[m
[31m-[m
[31m-B<syntax:> I<init_worker_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<starting-worker>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>; use the new L<init_worker_by_lua_block> directive instead.[m
[31m-[m
[31m-Runs the specified Lua code upon every Nginx worker process's startup when the master process is enabled. When the master process is disabled, this hook will just run after L<init_by_lua*>.[m
[31m-[m
[31m-This hook is often used to create per-worker reoccurring timers (via the L<ngx.timer.at> Lua API), either for backend health-check or other timed routine work. Below is an example,[m
[31m-[m
[31m-[m
[31m-     init_worker_by_lua '[m
[31m-         local delay = 3  -- in seconds[m
[31m-         local new_timer = ngx.timer.at[m
[31m-         local log = ngx.log[m
[31m-         local ERR = ngx.ERR[m
[31m-         local check[m
[31m-    [m
[31m-         check = function(premature)[m
[31m-             if not premature then[m
[31m-                 -- do the health check or other routine work[m
[31m-                 local ok, err = new_timer(delay, check)[m
[31m-                 if not ok then[m
[31m-                     log(ERR, "failed to create timer: ", err)[m
[31m-                     return[m
[31m-                 end[m
[31m-             end[m
[31m-         end[m
[31m-    [m
[31m-         local ok, err = new_timer(delay, check)[m
[31m-         if not ok then[m
[31m-             log(ERR, "failed to create timer: ", err)[m
[31m-             return[m
[31m-         end[m
[31m-     ';[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_worker_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<init_worker_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<starting-worker>[m
[31m-[m
[31m-Similar to the L<init_worker_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     init_worker_by_lua_block {[m
[31m-         print("I need no extra escaping here, for example: \r\nblah")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 init_worker_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<init_worker_by_lua_file E<lt>lua-file-pathE<gt>>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<starting-worker>[m
[31m-[m
[31m-Similar to L<init_worker_by_lua>, but accepts the file path to a Lua source file or Lua bytecode file.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.5> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_by_lua[m
[31m-[m
[31m-B<syntax:> I<set_by_lua $res E<lt>lua-script-strE<gt> [$arg1 $arg2 ...]>[m
[31m-[m
[31m-B<context:> I<server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>; use the new L<set_by_lua_block> directive instead.[m
[31m-[m
[31m-Executes code specified in C<< <lua-script-str> >> with optional input arguments C<$arg1 $arg2 ...>, and returns string output to C<$res>.[m
[31m-The code in C<< <lua-script-str> >> can make L<API calls> and can retrieve input arguments from the C<ngx.arg> table (index starts from C<1> and increases sequentially).[m
[31m-[m
[31m-This directive is designed to execute short, fast running code blocks as the Nginx event loop is blocked during code execution. Time consuming code sequences should therefore be avoided.[m
[31m-[m
[31m-This directive is implemented by injecting custom commands into the standard L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s command list. Because L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html> does not support nonblocking I/O in its commands, Lua APIs requiring yielding the current Lua "light thread" cannot work in this directive.[m
[31m-[m
[31m-At least the following API functions are currently disabled within the context of C<set_by_lua>:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Output API functions (e.g., L<ngx.say> and L<ngx.send_headers>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Control API functions (e.g., L<ngx.exit>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Subrequest API functions (e.g., L<ngx.location.capture> and L<ngx.location.capture_multi>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cosocket API functions (e.g., L<ngx.socket.tcp> and L<ngx.req.socket>).[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Sleeping API function L<ngx.sleep>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-In addition, note that this directive can only write out a value to a single Nginx variable at[m
[31m-a time. However, a workaround is possible using the L<ngx.var.VARIABLE> interface.[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $diff ''; # we have to predefine the $diff variable here[m
[31m-    [m
[31m-         set_by_lua $sum '[m
[31m-             local a = 32[m
[31m-             local b = 56[m
[31m-    [m
[31m-             ngx.var.diff = a - b;  -- write to $diff directly[m
[31m-             return a + b;          -- return the $sum value normally[m
[31m-         ';[m
[31m-    [m
[31m-         echo "sum = $sum, diff = $diff";[m
[31m-     }[m
[31m-[m
[31m-This directive can be freely mixed with all directives of the L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>, L<set-misc-nginx-module|http://github.com/openresty/set-misc-nginx-module>, and L<array-var-nginx-module|http://github.com/openresty/array-var-nginx-module> modules. All of these directives will run in the same order as they appear in the config file.[m
[31m-[m
[31m-[m
[31m-     set $foo 32;[m
[31m-     set_by_lua $bar 'return tonumber(ngx.var.foo) + 1';[m
[31m-     set $baz "bar: $bar";  # $baz == "bar: 33"[m
[31m-[m
[31m-As from the C<v0.5.0rc29> release, Nginx variable interpolation is disabled in the C<< <lua-script-str> >> argument of this directive and therefore, the dollar sign character (C<$>) can be used directly.[m
[31m-[m
[31m-This directive requires the L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<set_by_lua_block $res { lua-script }>[m
[31m-[m
[31m-B<context:> I<server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Similar to the L<set_by_lua> directive except that[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item 1.[m
[31m-[m
[31m-this directive inlines the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping), and[m
[31m-[m
[31m-=item 2.[m
[31m-[m
[31m-this directive does not support extra arguments after the Lua script as in L<set_by_lua>.[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-For example,[m
[31m-[m
[31m-[m
[31m-     set_by_lua_block $res { return 32 + math.cos(32) }[m
[31m-     # $res now has the value "32.834223360507" or alike.[m
[31m-[m
[31m-No special escaping is required in the Lua code block.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 set_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<set_by_lua_file $res E<lt>path-to-lua-script-fileE<gt> [$arg1 $arg2 ...]>[m
[31m-[m
[31m-B<context:> I<server, server if, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite>[m
[31m-[m
[31m-Equivalent to L<set_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed. [m
[31m-[m
[31m-Nginx variable interpolation is supported in the C<< <path-to-lua-script-file> >> argument string of this directive. But special care must be taken for injection attacks.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-When the Lua code cache is turned on (by default), the user code is loaded once at the first request and cached [m
[31m-and the Nginx config must be reloaded each time the Lua source file is modified.[m
[31m-The Lua code cache can be temporarily disabled during development by [m
[31m-switching L<lua_code_cache> C<off> in C<nginx.conf> to avoid reloading Nginx.[m
[31m-[m
[31m-This directive requires the L<ngx_devel_kit|https://github.com/simpl/ngx_devel_kit> module.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 content_by_lua[m
[31m-[m
[31m-B<syntax:> I<content_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<content_by_lua_block> directive instead.[m
[31m-[m
[31m-Acts as a "content handler" and executes Lua code string specified in C<< <lua-script-str> >> for every request. [m
[31m-The Lua code may make L<API calls> and is executed as a new spawned coroutine in an independent global environment (i.e. a sandbox).[m
[31m-[m
[31m-Do not use this directive and other content handler directives in the same location. For example, this directive and the L<proxy_pass|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass> directive should not be used in the same location.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 content_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<content_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Similar to the L<content_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     content_by_lua_block {[m
[31m-         ngx.say("I need no extra escaping here, for example: \r\nblah")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 content_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<content_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<location, location if>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Equivalent to L<content_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-Nginx variables can be used in the C<< <path-to-lua-script-file> >> string to provide flexibility. This however carries some risks and is not ordinarily recommended.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-When the Lua code cache is turned on (by default), the user code is loaded once at the first request and cached [m
[31m-and the Nginx config must be reloaded each time the Lua source file is modified.[m
[31m-The Lua code cache can be temporarily disabled during development by [m
[31m-switching L<lua_code_cache> C<off> in C<nginx.conf> to avoid reloading Nginx.[m
[31m-[m
[31m-Nginx variables are supported in the file path for dynamic dispatch, for example:[m
[31m-[m
[31m-[m
[31m-     # WARNING: contents in nginx var must be carefully filtered,[m
[31m-     # otherwise there'll be great security risk![m
[31m-     location ~ ^/app/([-_a-zA-Z0-9/]+) {[m
[31m-         set $path $1;[m
[31m-         content_by_lua_file /path/to/lua/app/root/$path.lua;[m
[31m-     }[m
[31m-[m
[31m-But be very careful about malicious user inputs and always carefully validate or filter out the user-supplied path components.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_by_lua[m
[31m-[m
[31m-B<syntax:> I<rewrite_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<rewrite_by_lua_block> directive instead.[m
[31m-[m
[31m-Acts as a rewrite phase handler and executes Lua code string specified in C<< <lua-script-str> >> for every request.[m
[31m-The Lua code may make L<API calls> and is executed as a new spawned coroutine in an independent global environment (i.e. a sandbox).[m
[31m-[m
[31m-Note that this handler always runs I<after> the standard L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>. So the following will work as expected:[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $a 12; # create and initialize $a[m
[31m-         set $b ""; # create and initialize $b[m
[31m-         rewrite_by_lua 'ngx.var.b = tonumber(ngx.var.a) + 1';[m
[31m-         echo "res = $b";[m
[31m-     }[m
[31m-[m
[31m-because C<set $a 12> and C<set $b ""> run I<before> L<rewrite_by_lua>.[m
[31m-[m
[31m-On the other hand, the following will not work as expected:[m
[31m-[m
[31m-[m
[31m-     ?  location /foo {[m
[31m-     ?      set $a 12; # create and initialize $a[m
[31m-     ?      set $b ''; # create and initialize $b[m
[31m-     ?      rewrite_by_lua 'ngx.var.b = tonumber(ngx.var.a) + 1';[m
[31m-     ?      if ($b = '13') {[m
[31m-     ?         rewrite ^ /bar redirect;[m
[31m-     ?         break;[m
[31m-     ?      }[m
[31m-     ?[m
[31m-     ?      echo "res = $b";[m
[31m-     ?  }[m
[31m-[m
[31m-because C<if> runs I<before> L<rewrite_by_lua> even if it is placed after L<rewrite_by_lua> in the config.[m
[31m-[m
[31m-The right way of doing this is as follows:[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         set $a 12; # create and initialize $a[m
[31m-         set $b ''; # create and initialize $b[m
[31m-         rewrite_by_lua '[m
[31m-             ngx.var.b = tonumber(ngx.var.a) + 1[m
[31m-             if tonumber(ngx.var.b) == 13 then[m
[31m-                 return ngx.redirect("/bar");[m
[31m-             end[m
[31m-         ';[m
[31m-    [m
[31m-         echo "res = $b";[m
[31m-     }[m
[31m-[m
[31m-Note that the L<ngx_eval|http://www.grid.net.ru/nginx/eval.en.html> module can be approximated by using L<rewrite_by_lua>. For example,[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         eval $res {[m
[31m-             proxy_pass http://foo.com/check-spam;[m
[31m-         }[m
[31m-    [m
[31m-         if ($res = 'spam') {[m
[31m-             rewrite ^ /terms-of-use.html redirect;[m
[31m-         }[m
[31m-    [m
[31m-         fastcgi_pass ...;[m
[31m-     }[m
[31m-[m
[31m-can be implemented in ngx_lua as:[m
[31m-[m
[31m-[m
[31m-     location = /check-spam {[m
[31m-         internal;[m
[31m-         proxy_pass http://foo.com/check-spam;[m
[31m-     }[m
[31m-    [m
[31m-     location / {[m
[31m-         rewrite_by_lua '[m
[31m-             local res = ngx.location.capture("/check-spam")[m
[31m-             if res.body == "spam" then[m
[31m-                 return ngx.redirect("/terms-of-use.html")[m
[31m-             end[m
[31m-         ';[m
[31m-    [m
[31m-         fastcgi_pass ...;[m
[31m-     }[m
[31m-[m
[31m-Just as any other rewrite phase handlers, L<rewrite_by_lua> also runs in subrequests.[m
[31m-[m
[31m-Note that when calling C<ngx.exit(ngx.OK)> within a L<rewrite_by_lua> handler, the nginx request processing control flow will still continue to the content handler. To terminate the current request from within a L<rewrite_by_lua> handler, calling L<ngx.exit> with status E<gt>= 200 (C<ngx.HTTP_OK>) and status E<lt> 300 (C<ngx.HTTP_SPECIAL_RESPONSE>) for successful quits and C<ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)> (or its friends) for failures.[m
[31m-[m
[31m-If the L<ngx_http_rewrite_module|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html>'s L<rewrite|http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite> directive is used to change the URI and initiate location re-lookups (internal redirections), then any L<rewrite_by_lua> or L<rewrite_by_lua_file> code sequences within the current location will not be executed. For example,[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         rewrite ^ /bar;[m
[31m-         rewrite_by_lua 'ngx.exit(503)';[m
[31m-     }[m
[31m-     location /bar {[m
[31m-         ...[m
[31m-     }[m
[31m-[m
[31m-Here the Lua code C<ngx.exit(503)> will never run. This will be the case if C<rewrite ^ /bar last> is used as this will similarly initiate an internal redirection. If the C<break> modifier is used instead, there will be no internal redirection and the C<rewrite_by_lua> code will be executed.[m
[31m-[m
[31m-The C<rewrite_by_lua> code will always run at the end of the C<rewrite> request-processing phase unless L<rewrite_by_lua_no_postpone> is turned on.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<rewrite_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-Similar to the L<rewrite_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     rewrite_by_lua_block {[m
[31m-         do_something("hello, world!\nhiya\n")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 rewrite_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<rewrite_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<rewrite tail>[m
[31m-[m
[31m-Equivalent to L<rewrite_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-Nginx variables can be used in the C<< <path-to-lua-script-file> >> string to provide flexibility. This however carries some risks and is not ordinarily recommended.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-When the Lua code cache is turned on (by default), the user code is loaded once at the first request and cached and the Nginx config must be reloaded each time the Lua source file is modified. The Lua code cache can be temporarily disabled during development by switching L<lua_code_cache> C<off> in C<nginx.conf> to avoid reloading Nginx.[m
[31m-[m
[31m-The C<rewrite_by_lua_file> code will always run at the end of the C<rewrite> request-processing phase unless L<rewrite_by_lua_no_postpone> is turned on.[m
[31m-[m
[31m-Nginx variables are supported in the file path for dynamic dispatch just as in L<content_by_lua_file>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 access_by_lua[m
[31m-[m
[31m-B<syntax:> I<access_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<access tail>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<access_by_lua_block> directive instead.[m
[31m-[m
[31m-Acts as an access phase handler and executes Lua code string specified in C<< <lua-script-str> >> for every request.[m
[31m-The Lua code may make L<API calls> and is executed as a new spawned coroutine in an independent global environment (i.e. a sandbox).[m
[31m-[m
[31m-Note that this handler always runs I<after> the standard L<ngx_http_access_module|http://nginx.org/en/docs/http/ngx_http_access_module.html>. So the following will work as expected:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         deny    192.168.1.1;[m
[31m-         allow   192.168.1.0/24;[m
[31m-         allow   10.1.1.0/16;[m
[31m-         deny    all;[m
[31m-    [m
[31m-         access_by_lua '[m
[31m-             local res = ngx.location.capture("/mysql", { ... })[m
[31m-             ...[m
[31m-         ';[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/...[m
[31m-     }[m
[31m-[m
[31m-That is, if a client IP address is in the blacklist, it will be denied before the MySQL query for more complex authentication is executed by L<access_by_lua>.[m
[31m-[m
[31m-Note that the L<ngx_auth_request|http://mdounin.ru/hg/ngx_http_auth_request_module/> module can be approximated by using L<access_by_lua>:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         auth_request /auth;[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/postgres_pass/...[m
[31m-     }[m
[31m-[m
[31m-can be implemented in ngx_lua as:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         access_by_lua '[m
[31m-             local res = ngx.location.capture("/auth")[m
[31m-    [m
[31m-             if res.status == ngx.HTTP_OK then[m
[31m-                 return[m
[31m-             end[m
[31m-    [m
[31m-             if res.status == ngx.HTTP_FORBIDDEN then[m
[31m-                 ngx.exit(res.status)[m
[31m-             end[m
[31m-    [m
[31m-             ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)[m
[31m-         ';[m
[31m-    [m
[31m-         # proxy_pass/fastcgi_pass/postgres_pass/...[m
[31m-     }[m
[31m-[m
[31m-As with other access phase handlers, L<access_by_lua> will I<not> run in subrequests.[m
[31m-[m
[31m-Note that when calling C<ngx.exit(ngx.OK)> within a L<access_by_lua> handler, the nginx request processing control flow will still continue to the content handler. To terminate the current request from within a L<access_by_lua> handler, calling L<ngx.exit> with status E<gt>= 200 (C<ngx.HTTP_OK>) and status E<lt> 300 (C<ngx.HTTP_SPECIAL_RESPONSE>) for successful quits and C<ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)> (or its friends) for failures.[m
[31m-[m
[31m-Starting from the C<v0.9.20> release, you can use the L<access_by_lua_no_postpone>[m
[31m-directive to control when to run this handler inside the "access" request-processing phase[m
[31m-of NGINX.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 access_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<access_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<access tail>[m
[31m-[m
[31m-Similar to the L<access_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     access_by_lua_block {[m
[31m-         do_something("hello, world!\nhiya\n")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 access_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<access_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<access tail>[m
[31m-[m
[31m-Equivalent to L<access_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-Nginx variables can be used in the C<< <path-to-lua-script-file> >> string to provide flexibility. This however carries some risks and is not ordinarily recommended.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-When the Lua code cache is turned on (by default), the user code is loaded once at the first request and cached [m
[31m-and the Nginx config must be reloaded each time the Lua source file is modified.[m
[31m-The Lua code cache can be temporarily disabled during development by switching L<lua_code_cache> C<off> in C<nginx.conf> to avoid repeatedly reloading Nginx.[m
[31m-[m
[31m-Nginx variables are supported in the file path for dynamic dispatch just as in L<content_by_lua_file>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 header_filter_by_lua[m
[31m-[m
[31m-B<syntax:> I<header_filter_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<header_filter_by_lua_block> directive instead.[m
[31m-[m
[31m-Uses Lua code specified in C<< <lua-script-str> >> to define an output header filter.[m
[31m-[m
[31m-Note that the following API functions are currently disabled within this context:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Output API functions (e.g., L<ngx.say> and L<ngx.send_headers>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Control API functions (e.g., L<ngx.redirect> and L<ngx.exec>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Subrequest API functions (e.g., L<ngx.location.capture> and L<ngx.location.capture_multi>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cosocket API functions (e.g., L<ngx.socket.tcp> and L<ngx.req.socket>).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Here is an example of overriding a response header (or adding one if absent) in our Lua header filter:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         proxy_pass http://mybackend;[m
[31m-         header_filter_by_lua 'ngx.header.Foo = "blah"';[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.2.1rc20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 header_filter_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<header_filter_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Similar to the L<header_filter_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     header_filter_by_lua_block {[m
[31m-         ngx.header["content-length"] = nil[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 header_filter_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<header_filter_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-header-filter>[m
[31m-[m
[31m-Equivalent to L<header_filter_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.2.1rc20> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 body_filter_by_lua[m
[31m-[m
[31m-B<syntax:> I<body_filter_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-body-filter>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<body_filter_by_lua_block> directive instead.[m
[31m-[m
[31m-Uses Lua code specified in C<< <lua-script-str> >> to define an output body filter.[m
[31m-[m
[31m-The input data chunk is passed via L<ngx.arg>[1] (as a Lua string value) and the "eof" flag indicating the end of the response body data stream is passed via L<ngx.arg>[2] (as a Lua boolean value).[m
[31m-[m
[31m-Behind the scene, the "eof" flag is just the C<last_buf> (for main requests) or C<last_in_chain> (for subrequests) flag of the Nginx chain link buffers. (Before the C<v0.7.14> release, the "eof" flag does not work at all in subrequests.)[m
[31m-[m
[31m-The output data stream can be aborted immediately by running the following Lua statement:[m
[31m-[m
[31m-[m
[31m-     return ngx.ERROR[m
[31m-[m
[31m-This will truncate the response body and usually result in incomplete and also invalid responses.[m
[31m-[m
[31m-The Lua code can pass its own modified version of the input data chunk to the downstream Nginx output body filters by overriding L<ngx.arg>[1] with a Lua string or a Lua table of strings. For example, to transform all the lowercase letters in the response body, we can just write:[m
[31m-[m
[31m-[m
[31m-     location / {[m
[31m-         proxy_pass http://mybackend;[m
[31m-         body_filter_by_lua 'ngx.arg[1] = string.upper(ngx.arg[1])';[m
[31m-     }[m
[31m-[m
[31m-When setting C<nil> or an empty Lua string value to C<ngx.arg[1]>, no data chunk will be passed to the downstream Nginx output filters at all.[m
[31m-[m
[31m-Likewise, new "eof" flag can also be specified by setting a boolean value to L<ngx.arg>[2]. For example,[m
[31m-[m
[31m-[m
[31m-     location /t {[m
[31m-         echo hello world;[m
[31m-         echo hiya globe;[m
[31m-    [m
[31m-         body_filter_by_lua '[m
[31m-             local chunk = ngx.arg[1][m
[31m-             if string.match(chunk, "hello") then[m
[31m-                 ngx.arg[2] = true  -- new eof[m
[31m-                 return[m
[31m-             end[m
[31m-    [m
[31m-             -- just throw away any remaining chunk data[m
[31m-             ngx.arg[1] = nil[m
[31m-         ';[m
[31m-     }[m
[31m-[m
[31m-Then C<GET /t> will just return the output[m
[31m-[m
[31m-    hello world[m
[31m-[m
[31m-That is, when the body filter sees a chunk containing the word "hello", then it will set the "eof" flag to true immediately, resulting in truncated but still valid responses.[m
[31m-[m
[31m-When the Lua code may change the length of the response body, then it is required to always clear out the C<Content-Length> response header (if any) in a header filter to enforce streaming output, as in[m
[31m-[m
[31m-[m
[31m-     location /foo {[m
[31m-         # fastcgi_pass/proxy_pass/...[m
[31m-    [m
[31m-         header_filter_by_lua 'ngx.header.content_length = nil';[m
[31m-         body_filter_by_lua 'ngx.arg[1] = string.len(ngx.arg[1]) .. "\\n"';[m
[31m-     }[m
[31m-[m
[31m-Note that the following API functions are currently disabled within this context due to the limitations in NGINX output filter's current implementation:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Output API functions (e.g., L<ngx.say> and L<ngx.send_headers>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Control API functions (e.g., L<ngx.exit> and L<ngx.exec>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Subrequest API functions (e.g., L<ngx.location.capture> and L<ngx.location.capture_multi>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cosocket API functions (e.g., L<ngx.socket.tcp> and L<ngx.req.socket>).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Nginx output filters may be called multiple times for a single request because response body may be delivered in chunks. Thus, the Lua code specified by in this directive may also run multiple times in the lifetime of a single HTTP request.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc32> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 body_filter_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<body_filter_by_lua_block { lua-script-str }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-body-filter>[m
[31m-[m
[31m-Similar to the L<body_filter_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     body_filter_by_lua_block {[m
[31m-         local data, eof = ngx.arg[1], ngx.arg[2][m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 body_filter_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<body_filter_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<output-body-filter>[m
[31m-[m
[31m-Equivalent to L<body_filter_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc32> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_by_lua[m
[31m-[m
[31m-B<syntax:> I<log_by_lua E<lt>lua-script-strE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<log>[m
[31m-[m
[31m-B<WARNING> Since the C<v0.9.17> release, use of this directive is I<discouraged>;[m
[31m-use the new L<log_by_lua_block> directive instead.[m
[31m-[m
[31m-Runs the Lua source code inlined as the C<< <lua-script-str> >> at the C<log> request processing phase. This does not replace the current access logs, but runs before.[m
[31m-[m
[31m-Note that the following API functions are currently disabled within this context:[m
[31m-[m
[31m-[m
[31m-=over[m
[31m-[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Output API functions (e.g., L<ngx.say> and L<ngx.send_headers>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Control API functions (e.g., L<ngx.exit>) [m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Subrequest API functions (e.g., L<ngx.location.capture> and L<ngx.location.capture_multi>)[m
[31m-[m
[31m-=item *[m
[31m-[m
[31m-Cosocket API functions (e.g., L<ngx.socket.tcp> and L<ngx.req.socket>).[m
[31m-[m
[31m-[m
[31m-=back[m
[31m-[m
[31m-Here is an example of gathering average data for L<$upstream_response_time|http://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_response_time>:[m
[31m-[m
[31m-[m
[31m-     lua_shared_dict log_dict 5M;[m
[31m-    [m
[31m-     server {[m
[31m-         location / {[m
[31m-             proxy_pass http://mybackend;[m
[31m-    [m
[31m-             log_by_lua '[m
[31m-                 local log_dict = ngx.shared.log_dict[m
[31m-                 local upstream_time = tonumber(ngx.var.upstream_response_time)[m
[31m-    [m
[31m-                 local sum = log_dict:get("upstream_time-sum") or 0[m
[31m-                 sum = sum + upstream_time[m
[31m-                 log_dict:set("upstream_time-sum", sum)[m
[31m-    [m
[31m-                 local newval, err = log_dict:incr("upstream_time-nb", 1)[m
[31m-                 if not newval and err == "not found" then[m
[31m-                     log_dict:add("upstream_time-nb", 0)[m
[31m-                     log_dict:incr("upstream_time-nb", 1)[m
[31m-                 end[m
[31m-             ';[m
[31m-         }[m
[31m-    [m
[31m-         location = /status {[m
[31m-             content_by_lua '[m
[31m-                 local log_dict = ngx.shared.log_dict[m
[31m-                 local sum = log_dict:get("upstream_time-sum")[m
[31m-                 local nb = log_dict:get("upstream_time-nb")[m
[31m-    [m
[31m-                 if nb and sum then[m
[31m-                     ngx.say("average upstream response time: ", sum / nb,[m
[31m-                             " (", nb, " reqs)")[m
[31m-                 else[m
[31m-                     ngx.say("no data yet")[m
[31m-                 end[m
[31m-             ';[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc31> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<log_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<log>[m
[31m-[m
[31m-Similar to the L<log_by_lua> directive except that this directive inlines[m
[31m-the Lua source directly[m
[31m-inside a pair of curly braces (C<{}>) instead of in an NGINX string literal (which requires[m
[31m-special character escaping).[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     log_by_lua_block {[m
[31m-         print("I need no extra escaping here, for example: \r\nblah")[m
[31m-     }[m
[31m-[m
[31m-This directive was first introduced in the C<v0.9.17> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 log_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<log_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<log>[m
[31m-[m
[31m-Equivalent to L<log_by_lua>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc31> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 balancer_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<balancer_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-This directive runs Lua code as an upstream balancer for any upstream entities defined[m
[31m-by the C<upstream {}> configuration block.[m
[31m-[m
[31m-For instance,[m
[31m-[m
[31m-[m
[31m-     upstream foo {[m
[31m-         server 127.0.0.1;[m
[31m-         balancer_by_lua_block {[m
[31m-             -- use Lua to do something interesting here[m
[31m-             -- as a dynamic balancer[m
[31m-         }[m
[31m-     }[m
[31m-    [m
[31m-     server {[m
[31m-         location / {[m
[31m-             proxy_pass http://foo;[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-The resulting Lua load balancer can work with any existing nginx upstream modules[m
[31m-like L<ngx_proxy|http://nginx.org/en/docs/http/ngx_http_proxy_module.html> and[m
[31m-L<ngx_fastcgi|http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html>.[m
[31m-[m
[31m-Also, the Lua load balancer can work with the standard upstream connection pool mechanism,[m
[31m-i.e., the standard L<keepalive|http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive> directive.[m
[31m-Just ensure that the L<keepalive|http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive> directive[m
[31m-is used I<after> this C<balancer_by_lua_block> directive in a single C<upstream {}> configuration block.[m
[31m-[m
[31m-The Lua load balancer can totally ignore the list of servers defined in the C<upstream {}> block[m
[31m-and select peer from a completely dynamic server list (even changing per request) via the[m
[31m-L<ngx.balancer|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/balancer.md> module[m
[31m-from the L<lua-resty-core|https://github.com/openresty/lua-resty-core> library.[m
[31m-[m
[31m-The Lua code handler registered by this directive might get called more than once in a single[m
[31m-downstream request when the nginx upstream mechanism retries the request on conditions[m
[31m-specified by directives like the L<proxy_next_upstream|http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream>[m
[31m-directive.[m
[31m-[m
[31m-This Lua code execution context does not support yielding, so Lua APIs that may yield[m
[31m-(like cosockets and "light threads") are disabled in this context. One can usually work[m
[31m-around this limitation by doing such operations in an earlier phase handler (like[m
[31m-L<access_by_lua*>) and passing along the result into this context[m
[31m-via the L<ngx.ctx> table.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.10.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 balancer_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<balancer_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<upstream>[m
[31m-[m
[31m-B<phase:> I<content>[m
[31m-[m
[31m-Equivalent to L<balancer_by_lua_block>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.10.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_need_request_body[m
[31m-[m
[31m-B<syntax:> I<lua_need_request_body E<lt>on|offE<gt>>[m
[31m-[m
[31m-B<default:> I<off>[m
[31m-[m
[31m-B<context:> I<http, server, location, location if>[m
[31m-[m
[31m-B<phase:> I<depends on usage>[m
[31m-[m
[31m-Determines whether to force the request body data to be read before running rewrite/access/access_by_lua* or not. The Nginx core does not read the client request body by default and if request body data is required, then this directive should be turned C<on> or the L<ngx.req.read_body> function should be called within the Lua code.[m
[31m-[m
[31m-To read the request body data within the L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> variable, [m
[31m-L<client_body_buffer_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size> must have the same value as L<client_max_body_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>. Because when the content length exceeds L<client_body_buffer_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size> but less than L<client_max_body_size|http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size>, Nginx will buffer the data into a temporary file on the disk, which will lead to empty value in the L<$request_body|http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body> variable.[m
[31m-[m
[31m-If the current location includes L<rewrite_by_lua> or L<rewrite_by_lua_file> directives,[m
[31m-then the request body will be read just before the L<rewrite_by_lua> or L<rewrite_by_lua_file> code is run (and also at the[m
[31m-C<rewrite> phase). Similarly, if only L<content_by_lua> is specified,[m
[31m-the request body will not be read until the content handler's Lua code is[m
[31m-about to run (i.e., the request body will be read during the content phase).[m
[31m-[m
[31m-It is recommended however, to use the L<ngx.req.read_body> and L<ngx.req.discard_body> functions for finer control over the request body reading process instead.[m
[31m-[m
[31m-This also applies to L<access_by_lua> and L<access_by_lua_file>.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_by_lua_block[m
[31m-[m
[31m-B<syntax:> I<ssl_certificate_by_lua_block { lua-script }>[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-B<phase:> I<right-before-SSL-handshake>[m
[31m-[m
[31m-This directive runs user Lua code when NGINX is about to start the SSL handshake for the downstream[m
[31m-SSL (https) connections.[m
[31m-[m
[31m-It is particularly useful for setting the SSL certificate chain and the corresponding private key on a per-request[m
[31m-basis. It is also useful to load such handshake configurations nonblockingly from the remote (for example,[m
[31m-with the L<cosocket> API). And one can also do per-request OCSP stapling handling in pure[m
[31m-Lua here as well.[m
[31m-[m
[31m-Another typical use case is to do SSL handshake traffic control nonblockingly in this context,[m
[31m-with the help of the L<lua-resty-limit-traffic#readme|https://github.com/openresty/lua-resty-limit-traffic>[m
[31m-library, for example.[m
[31m-[m
[31m-One can also do interesting things with the SSL handshake requests from the client side, like[m
[31m-rejecting old SSL clients using the SSLv3 protocol or even below selectively.[m
[31m-[m
[31m-The L<ngx.ssl|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md>[m
[31m-and L<ngx.ocsp|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ocsp.md> Lua modules[m
[31m-provided by the L<lua-resty-core|https://github.com/openresty/lua-resty-core/#readme>[m
[31m-library are particularly useful in this context. You can use the Lua API offered by these two Lua modules[m
[31m-to manipulate the SSL certificate chain and private key for the current SSL connection[m
[31m-being initiated.[m
[31m-[m
[31m-This Lua handler does not run at all, however, when NGINX/OpenSSL successfully resumes[m
[31m-the SSL session via SSL session IDs or TLS session tickets for the current SSL connection. In[m
[31m-other words, this Lua handler only runs when NGINX has to initiate a full SSL handshake.[m
[31m-[m
[31m-Below is a trivial example using the[m
[31m-L<ngx.ssl|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md> module[m
[31m-at the same time:[m
[31m-[m
[31m-[m
[31m-     server {[m
[31m-         listen 443 ssl;[m
[31m-         server_name   test.com;[m
[31m-    [m
[31m-         ssl_certificate_by_lua_block {[m
[31m-             print("About to initiate a new SSL handshake!")[m
[31m-         }[m
[31m-    [m
[31m-         location / {[m
[31m-             root html;[m
[31m-         }[m
[31m-     }[m
[31m-[m
[31m-See more complicated examples in the L<ngx.ssl|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md>[m
[31m-and L<ngx.ocsp|https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ocsp.md>[m
[31m-Lua modules' official documentation.[m
[31m-[m
[31m-Uncaught Lua exceptions in the user Lua code immediately abort the current SSL session, so does the[m
[31m-L<ngx.exit> call with an error code like C<ngx.ERROR>.[m
[31m-[m
[31m-This Lua code execution context I<does> support yielding, so Lua APIs that may yield[m
[31m-(like cosockets, sleeping, and "light threads")[m
[31m-are enabled in this context.[m
[31m-[m
[31m-Note, however, you still need to configure the L<ssl_certificate|http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate> and[m
[31m-L<ssl_certificate_key|http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate_key>[m
[31m-directives even though you will not use this static certificate and private key at all. This is[m
[31m-because the NGINX core requires their appearance otherwise you are seeing the following error[m
[31m-while starting NGINX:[m
[31m-[m
[31m-    nginx: [emerg] no ssl configured for the server[m
[31m-[m
[31m-This directive currently requires the following NGINX core patch to work correctly:[m
[31m-[m
[31m-E<lt>http://mailman.nginx.org/pipermail/nginx-devel/2016-January/007748.htmlE<gt>[m
[31m-[m
[31m-The bundled version of the NGINX core in OpenResty 1.9.7.2 (or above) already has this[m
[31m-patch applied.[m
[31m-[m
[31m-Furthermore, one needs at least OpenSSL 1.0.2e for this directive to work.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.10.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 ssl_certificate_by_lua_file[m
[31m-[m
[31m-B<syntax:> I<ssl_certificate_by_lua_file E<lt>path-to-lua-script-fileE<gt>>[m
[31m-[m
[31m-B<context:> I<server>[m
[31m-[m
[31m-B<phase:> I<right-before-SSL-handshake>[m
[31m-[m
[31m-Equivalent to L<ssl_certificate_by_lua_block>, except that the file specified by C<< <path-to-lua-script-file> >> contains the Lua code, or, as from the C<v0.5.0rc32> release, the L<LuaE<sol>LuaJIT bytecode> to be executed.[m
[31m-[m
[31m-When a relative path like C<foo/bar.lua> is given, they will be turned into the absolute path relative to the C<server prefix> path determined by the C<-p PATH> command-line option while starting the Nginx server.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.10.0> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_shared_dict[m
[31m-[m
[31m-B<syntax:> I<lua_shared_dict E<lt>nameE<gt> E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<no>[m
[31m-[m
[31m-B<context:> I<http>[m
[31m-[m
[31m-B<phase:> I<depends on usage>[m
[31m-[m
[31m-Declares a shared memory zone, C<< <name> >>, to serve as storage for the shm based Lua dictionary C<< ngx.shared.<name> >>.[m
[31m-[m
[31m-Shared memory zones are always shared by all the nginx worker processes in the current nginx server instance.[m
[31m-[m
[31m-The C<< <size> >> argument accepts size units such as C<k> and C<m>:[m
[31m-[m
[31m-[m
[31m-     http {[m
[31m-         lua_shared_dict dogs 10m;[m
[31m-         ...[m
[31m-     }[m
[31m-[m
[31m-The hard-coded minimum size is 8KB while the practical minimum size depends[m
[31m-on actual user data set (some people start with 12KB).[m
[31m-[m
[31m-See L<ngx.shared.DICT> for details.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.3.1rc22> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_connect_timeout[m
[31m-[m
[31m-B<syntax:> I<lua_socket_connect_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_connect_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This directive controls the default timeout value used in TCP/unix-domain socket object's L<connect> method and can be overridden by the L<settimeout> method.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_send_timeout[m
[31m-[m
[31m-B<syntax:> I<lua_socket_send_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_send_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Controls the default timeout value used in TCP/unix-domain socket object's L<send> method and can be overridden by the L<settimeout> method.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_send_lowat[m
[31m-[m
[31m-B<syntax:> I<lua_socket_send_lowat E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_send_lowat 0>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Controls the C<lowat> (low water) value for the cosocket send buffer.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_read_timeout[m
[31m-[m
[31m-B<syntax:> I<lua_socket_read_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_read_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-B<phase:> I<depends on usage>[m
[31m-[m
[31m-This directive controls the default timeout value used in TCP/unix-domain socket object's L<receive> method and iterator functions returned by the L<receiveuntil> method. This setting can be overridden by the L<settimeout> method.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_buffer_size[m
[31m-[m
[31m-B<syntax:> I<lua_socket_buffer_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_buffer_size 4k/8k>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Specifies the buffer size used by cosocket reading operations.[m
[31m-[m
[31m-This buffer does not have to be that big to hold everything at the same time because cosocket supports 100% non-buffered reading and parsing. So even C<1> byte buffer size should still work everywhere but the performance could be terrible.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_pool_size[m
[31m-[m
[31m-B<syntax:> I<lua_socket_pool_size E<lt>sizeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_pool_size 30>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-Specifies the size limit (in terms of connection count) for every cosocket connection pool associated with every remote server (i.e., identified by either the host-port pair or the unix domain socket file path).[m
[31m-[m
[31m-Default to 30 connections for every pool.[m
[31m-[m
[31m-When the connection pool exceeds the available size limit, the least recently used (idle) connection already in the pool will be closed to make room for the current connection.[m
[31m-[m
[31m-Note that the cosocket connection pool is per nginx worker process rather than per nginx server instance, so size limit specified here also applies to every single nginx worker process.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_keepalive_timeout[m
[31m-[m
[31m-B<syntax:> I<lua_socket_keepalive_timeout E<lt>timeE<gt>>[m
[31m-[m
[31m-B<default:> I<lua_socket_keepalive_timeout 60s>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This directive controls the default maximal idle time of the connections in the cosocket built-in connection pool. When this timeout reaches, idle connections will be closed and removed from the pool. This setting can be overridden by cosocket objects' L<setkeepalive> method.[m
[31m-[m
[31m-The C<< <time> >> argument can be an integer, with an optional time unit, like C<s> (second), C<ms> (millisecond), C<m> (minute). The default time unit is C<s>, i.e., "second". The default setting is C<60s>.[m
[31m-[m
[31m-This directive was first introduced in the C<v0.5.0rc1> release.[m
[31m-[m
[31m-[m
[31m-[m
[31m-[m
[31m-=head2 lua_socket_log_errors[m
[31m-[m
[31m-B<syntax:> I<lua_socket_log_errors on|off>[m
[31m-[m
[31m-B<default:> I<lua_socket_log_errors on>[m
[31m-[m
[31m-B<context:> I<http, server, location>[m
[31m-[m
[31m-This directive can be used to toggle error logging when a failure occurs for the TCP or UDP cosockets. If you are already doing proper error handling and logging in your Lua code, then it is recommended to turn this directive off to prevent data flushing in your nginx error log files (which is usually rather expensive).[m
[31m-